diff --git a/drivers/rf-transceiver/koror/README.rst b/drivers/rf-transceiver/koror/README.rst new file mode 100644 index 00000000000..8aa6229d4c8 --- /dev/null +++ b/drivers/rf-transceiver/koror/README.rst @@ -0,0 +1,369 @@ +ADRV904x (Koror) no-OS Driver +============================== + +Supported Devices +----------------- + +`ADRV9040 `_ + +Overview +-------- + +The ADRV9040 is a highly integrated, system on chip (SoC) radio frequency (RF) agile transceiver with integrated digital front end (DFE). The SoC contains eight transmitters, two observation receivers to monitor transmitter channels, eight receivers, integrated LO and clock synthesizers, and digital signal processing functions. The SoC meets the high radio performance and low power consumption demanded by cellular infrastructure applications including small cell base-station radios, macro 3G/4G/5G systems, and massive MIMO base stations. + +Applications +------------ + +* Macro base stations +* Massive MIMO +* Small cells + +Markets and Technologies +------------------------ + +* Aerospace and Defense +* Communications + +Driver Structure +----------------- + +| drivers/rf-transceiver/koror/ +| ├── adrv904x.c +| ├── adrv904x_conv.c +| ├── adrv904x.h +| ├── common +| │   ├── adi_common.h +| │   ├── adi_common_macros.h +| │   ├── adi_common_types.h +| │   ├── adi_common_user.h +| │   ├── adi_error +| │   │   ├── adi_common_error.c +| │   │   ├── adi_common_error.h +| │   │   └── adi_common_error_types.h +| │   ├── adi_hal +| │   │   ├── adi_common_hal.c +| │   │   └── adi_common_hal.h +| │   └── adi_logging +| │   ├── adi_common_log.c +| │   ├── adi_common_log.h +| │   └── adi_common_log_types.h +| ├── devices +| │   └── adrv904x +| │   ├── multiver +| │   ├── private +| │   └── public +| ├── platforms +| │   ├── adi_library.c +| │   ├── adi_library.h +| │   ├── adi_library_types.h +| │   ├── adi_platform_aux.c +| │   ├── adi_platform_aux.h +| │   ├── adi_platform.c +| │   ├── adi_platform.h +| │   ├── adi_platform_impl.h +| │   ├── adi_platform_impl_types.h +| │   ├── adi_platform_types.h +| │   └── common +| │   ├── adi_logging.c +| │   ├── adi_logging.h +| │   ├── tls.c +| │   └── tls.h +| └── README.rst + +ADRV904x Device Configuration +----------------------------- + +Driver Initialization +--------------------- + +In order to be able to use the device, you will have to provide the support for +the SPI communication protocol. + +The SPI settings must be provided as follows: + +.. code-block:: C + + static adi_adrv904x_SpiConfigSettings_t spiSettings = { + .msbFirst = 1, + .fourWireMode = 1, + .cmosPadDrvStrength = ADI_ADRV904X_CMOSPAD_DRV_STRONG, + }; + + static adi_adrv904x_SpiOptions_t spiOptions = { + .allowSpiStreaming = 0, + .allowAhbAutoIncrement = 1, + .allowAhbSpiFifoMode = 0, + }; + +The following functions will then be used by the driver for obtaining the SPI settings in the initialization phase: + +.. code-block:: C + + /***************************************************************************//** + * @brief Function for obtaining SPI settings. + * + * @return SPI settings + *******************************************************************************/ + adi_adrv904x_SpiConfigSettings_t *adrv904x_spi_settings_get(void) + { + return &spiSettings; + } + + /***************************************************************************//** + * @brief Function for obtaining SPI options. + * + * @return SPI settings + *******************************************************************************/ + adi_adrv904x_SpiOptions_t *adrv904x_spi_options_get(void) + { + return &spiOptions; + } + +Before calling the *adrv904x_init* function, the initialization parameter structure must be populated with the expected values. An example is given below: + +.. code-block:: C + + struct adrv904x_init_param adrv904x_init_par = { 0 }; + adrv904x_init_par.adrv904x_device = &adrv904x_device; + adrv904x_init_par.dev_clk = ad9528_device->clk_desc[1]; + +*adrv904x_device* is an *adi_adrv904x_Device* structure initialized with zeros, *ad9528_device->clk_desc[1]* is the device clock (here, channel 1 of the AD9528 chip). + +Make sure that *adrv904x_init* returns 0, which means that the driver was initialized correctly. + +The following sequence of instructions is then required for initializing the AXI ADC and AXI DAC cores, before calling *adrv904x_post_setup*: + +.. code-block:: C + + status = axi_dac_init(&phy->tx_dac, &tx_dac_init); + if (status) + goto error_6; + status = axi_adc_init_begin(&phy->rx_adc, &rx_adc_init); + if (status) + goto error_7; + + // Reset Rx ADC + axi_adc_write(phy->rx_adc, AXI_ADC_REG_RSTN, 0); + axi_adc_write(phy->rx_adc, AXI_ADC_REG_RSTN, + AXI_ADC_MMCM_RSTN | AXI_ADC_RSTN); + + status = adrv904x_post_setup(phy); + if (status) { + pr_err("error: adrv904x_post_setup() failed\n"); + goto error_8; + } + +Configuration +------------------- + +All configurations are handled by the functions in the *adrv904x.c* and *adrv904x_conv.c* files. +More information regarding the system operation and setup can be found in the `ADRV9040 System Development User Guide `_. + +ADRV904X Driver Initialization Example +-------------------------------------- + +.. code-block:: bash + + static adi_adrv904x_SpiConfigSettings_t spiSettings = { + .msbFirst = 1, + .fourWireMode = 1, + .cmosPadDrvStrength = ADI_ADRV904X_CMOSPAD_DRV_STRONG, + }; + + static adi_adrv904x_SpiOptions_t spiOptions = { + .allowSpiStreaming = 0, + .allowAhbAutoIncrement = 1, + .allowAhbSpiFifoMode = 0, + }; + + /***************************************************************************//** + * @brief Function for obtaining SPI settings. + * + * @return SPI settings + *******************************************************************************/ + adi_adrv904x_SpiConfigSettings_t *adrv904x_spi_settings_get(void) + { + return &spiSettings; + } + + /***************************************************************************//** + * @brief Function for obtaining SPI options. + * + * @return SPI settings + *******************************************************************************/ + adi_adrv904x_SpiOptions_t *adrv904x_spi_options_get(void) + { + return &spiOptions; + } + ... + + struct adrv904x_init_param adrv904x_init_par = { 0 }; + struct adi_adrv904x_Device adrv904x_device = { 0 }; + struct adrv904x_rf_phy *phy; + + struct axi_adc_init rx_adc_init = { + .name = "rx_adc", + .base = RX_CORE_BASEADDR, + .num_channels = 16 + }; + struct axi_dac_init tx_dac_init = { + .name = "tx_dac", + .base = TX_CORE_BASEADDR, + .channels = NULL, + .rate = 3, + .num_channels = 16 + }; + + ... + + adrv904x_init_par.adrv904x_device = &adrv904x_device; + adrv904x_init_par.dev_clk = ad9528_device->clk_desc[1]; + + status = adrv904x_init(&phy, &adrv904x_init_par); + if (status) { + pr_err("error: adrv904x_init() failed\n"); + goto error_5; + } + + status = axi_dac_init(&phy->tx_dac, &tx_dac_init); + if (status) + goto error_6; + status = axi_adc_init_begin(&phy->rx_adc, &rx_adc_init); + if (status) + goto error_7; + + // Reset Rx ADC + axi_adc_write(phy->rx_adc, AXI_ADC_REG_RSTN, 0); + axi_adc_write(phy->rx_adc, AXI_ADC_REG_RSTN, + AXI_ADC_MMCM_RSTN | AXI_ADC_RSTN); + + status = adrv904x_post_setup(phy); + if (status) { + pr_err("error: adrv904x_post_setup() failed\n"); + goto error_8; + } + + ... + + +ADRV904X no-OS IIO support +-------------------------- + +The ADRV904X suppord is based on the AXI DAC and AXI ADC IIO drivers. + +ADRV904X IIO Device Configuration +--------------------------------- + +Device Attributes +----------------- + +The ADRV904X IIO device does not have any device specific attributes. + +Device Channels +--------------- + +The ADRV904X IIO device has 8 output voltage channels and 8 input voltage channels. + +ADRV904X IIO Driver Initialization Example +------------------------------------------ + +.. code-block:: bash + + #define DAC_BUFFER_SAMPLES 8192 + #define ADC_BUFFER_SAMPLES 32768 + #define ADC_CHANNELS 8 + + uint32_t dac_buffer[DAC_BUFFER_SAMPLES] __attribute__ ((aligned)); + uint16_t adc_buffer[ADC_BUFFER_SAMPLES * ADC_CHANNELS] __attribute__ (( + aligned(1024))); + + uint16_t adc_buffer_dma[ADC_BUFFER_SAMPLES * ADC_CHANNELS] __attribute__ (( + aligned(1024))); + + /** + * IIO application descriptor + */ + struct iio_app_desc *app; + + /** + * IIO application initialization parameters + */ + struct iio_app_init_param app_init_param = { 0 }; + + /** + * iio axi adc configurations. + */ + struct iio_axi_adc_init_param iio_axi_adc_init_par; + + /** + * iio axi dac configurations. + */ + struct iio_axi_dac_init_param iio_axi_dac_init_par; + + /** + * iio instance descriptor. + */ + struct iio_axi_adc_desc *iio_axi_adc_desc; + + /** + * iio instance descriptor. + */ + struct iio_axi_dac_desc *iio_axi_dac_desc; + + /** + * iio device instance descriptor. + */ + struct iio_device *adc_dev_desc, *dac_dev_desc; + + iio_axi_adc_init_par = (struct iio_axi_adc_init_param) { + .rx_adc = phy->rx_adc, + .rx_dmac = rx_dmac, + #ifndef PLATFORM_MB + .dcache_invalidate_range = (void (*)(uint32_t, + uint32_t))Xil_DCacheInvalidateRange, + #endif + }; + + status = iio_axi_adc_init(&iio_axi_adc_desc, &iio_axi_adc_init_par); + if(status < 0) + goto error_10; + + struct iio_data_buffer read_buff = { + .buff = (void *)adc_buffer, + .size = sizeof(adc_buffer), + }; + iio_axi_adc_get_dev_descriptor(iio_axi_adc_desc, &adc_dev_desc); + + iio_axi_dac_init_par = (struct iio_axi_dac_init_param) { + .tx_dac = phy->tx_dac, + .tx_dmac = tx_dmac, + #ifndef PLATFORM_MB + .dcache_flush_range = (void (*)(uint32_t, uint32_t))Xil_DCacheFlushRange, + #endif + }; + + status = iio_axi_dac_init(&iio_axi_dac_desc, &iio_axi_dac_init_par); + if(status < 0) + goto error_11; + struct iio_data_buffer write_buff = { + .buff = (void *)dac_buffer, + .size = sizeof(dac_buffer), + }; + iio_axi_dac_get_dev_descriptor(iio_axi_dac_desc, &dac_dev_desc); + struct iio_app_device devices[] = { + IIO_APP_DEVICE("cf-adrv904x-lpc", iio_axi_adc_desc, adc_dev_desc, &read_buff, NULL, NULL), + IIO_APP_DEVICE("cf-adrv904x-dds-core-lpc", iio_axi_dac_desc, dac_dev_desc, NULL, &write_buff, NULL) + }; + + app_init_param.devices = devices; + app_init_param.nb_devices = NO_OS_ARRAY_SIZE(devices); + app_init_param.uart_init_params = iio_uart_ip; + + /* Wait to display previous messages */ + no_os_mdelay(100); + + status = iio_app_init(&app, app_init_param); + if (status) + goto error_12; + + return iio_app_run(app); \ No newline at end of file diff --git a/drivers/rf-transceiver/koror/adrv904x.c b/drivers/rf-transceiver/koror/adrv904x.c new file mode 100644 index 00000000000..5c5bdb0bf41 --- /dev/null +++ b/drivers/rf-transceiver/koror/adrv904x.c @@ -0,0 +1,1278 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * ADRV904x RF Transceiver + * + * Copyright 2020-2023 Analog Devices Inc. + * + * Licensed under the GPL-2. + */ + +#include "adrv904x_cpu_device_profile_types.h" +#include "adi_adrv904x_utilities_types.h" +#include "adi_common_error_types.h" +#include "adi_adrv904x_all_types.h" +#include "adi_adrv904x_dfe_cpu.h" +#include "adi_common_error.h" + +#include "xilinx_transceiver.h" +#include "no_os_print_log.h" +#include "no_os_error.h" +#include "no_os_delay.h" +#include "no_os_alloc.h" +#include "no_os_util.h" +#include "no_os_spi.h" +#include "adrv904x.h" +#include "initdata.h" +#include "jesd204.h" +#include +#include + +uint32_t appApiCount; +#define ADI_FILE ADI_COMMON_FILE_HAL + +/* +* \brief Macro to perform the following: +* 1) Check Return Code from Function Call +* 2) Write Error Data to Standard Output if Non Zero +* 3) Return NOK Application Return Code +*/ +#define ADI_APP_API_CALL_RETURN(returnCode, funcName, ...) \ +{ \ + ++appApiCount; \ + returnCode = funcName( __VA_ARGS__); \ + --appApiCount; \ + if (returnCode) \ + { \ + ADI_APP_ERROR_REPORT(ADI_COMMON_ERRSRC_API, returnCode, ADI_NO_VARIABLE, ADI_NO_ERROR_MESSAGE); \ + \ + adi_common_Device_t commonDev; \ + \ + ADI_LIBRARY_MEMSET(&commonDev, 0, sizeof(adi_common_Device_t)); \ + \ + commonDev.errPtr = (adi_common_ErrData_t*) adi_hal_TlsGet(HAL_TLS_ERR); \ + \ + if (appApiCount == 0U) \ + { \ + ADI_APP_ERROR_OUTPUT(commonDev.errPtr); \ + } \ + \ + return ADI_APP_API_NOK; \ + } \ +} + +/* +* \brief ADI Example Application Return Error Codes +*/ +typedef enum { + ADI_APP_API_OK = 0U, + ADI_APP_API_NOK +} adi_app_ReturnType_e; + +/* +* \brief Example App File Abstractions +*/ +typedef enum { + ADI_EXAMPLE_FILE_MAIN = 0x1000U, + ADI_EXAMPLE_FILE_CALS, + ADI_EXAMPLE_FILE_GPIO, + ADI_EXAMPLE_FILE_TX, + ADI_EXAMPLE_FILE_RX, + ADI_EXAMPLE_FILE_RADIOCTRL, + ADI_EXAMPLE_FILE_SYSMON, + ADI_EXAMPLE_FILE_DATA_INTERFACE, + ADI_EXAMPLE_FILE_PROGRAM, + ADI_EXAMPLE_FILE_BBIC, + + + ADI_EXAMPLE_FILE_CARRIER_RECONFIGURE, + ADI_EXAMPLE_FILE_DFE_APP, +} adi_example_File_e; + + +struct adrv904x_jesd204_link { + unsigned int source_id; + bool is_framer; +}; + +struct adrv904x_jesd204_priv { + struct adrv904x_rf_phy *phy; + struct adrv904x_jesd204_link link[5]; +}; + +static void adrv904x_shutdown(struct adrv904x_rf_phy *phy) +{ + /*********************************************** + * Shutdown Procedure * + * **********************************************/ + /* Function to turn radio on, Disables transmitters and receivers */ + + adi_adrv904x_Shutdown(phy->kororDevice); + adi_hal_HwClose(phy->kororDevice->common.devHalInfo); + + memset(&phy->adi_adrv904x_device.devStateInfo, 0, + sizeof(phy->adi_adrv904x_device.devStateInfo)); +} + +static void adrv904x_info(struct adrv904x_rf_phy *phy) +{ + adi_adrv904x_Version_t apiVersion; + uint8_t siRevision = 0xbb; + + adi_adrv904x_ApiVersionGet(phy->kororDevice, &apiVersion); + adi_adrv904x_DeviceRevGet(phy->kororDevice, &siRevision); + + pr_info("\nadrv904x-phy Rev %d, API version: %u.%u.%u.%u\n\n", + phy->kororDevice->devStateInfo.deviceSiRev, + apiVersion.majorVer, apiVersion.minorVer, + apiVersion.maintenanceVer, apiVersion.buildVer); +} + +static int adrv904x_jesd204_device_init(struct jesd204_dev *jdev, + enum jesd204_state_op_reason reason) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + struct adrv904x_jesd204_priv *priv = jesd204_dev_priv(jdev); + struct adrv904x_rf_phy *phy = priv->phy; + + pr_debug("%s:%d device init %s\n", __func__, __LINE__, + jesd204_state_op_reason_str(reason)); + + switch (reason) { + case JESD204_STATE_OP_REASON_INIT: + break; + default: + return JESD204_STATE_CHANGE_DONE; + } + + memset(&phy->adi_adrv904x_device.devStateInfo, 0, + sizeof(phy->adi_adrv904x_device.devStateInfo)); + + recoveryAction = adi_adrv904x_HwOpen(phy->kororDevice, &phy->spiSettings); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { + pr_err("ERROR adi_ad9528_HwOpen failed in %s at line %d.\n", __func__, + __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + adi_common_LogLevelSet(&phy->kororDevice->common, + ADI_HAL_LOG_ERR | ADI_HAL_LOG_WARN); + + recoveryAction = adi_adrv904x_HwReset(phy->kororDevice); + + recoveryAction = adi_adrv904x_PreMcsInit(phy->kororDevice, &deviceInitStruct, + &phy->trxBinaryInfoPtr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { + pr_err("ERROR adi_adrv904x_PreMcsInit failed in %s at line %d.\n", __func__, + __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + recoveryAction = adi_adrv904x_PreMcsInit_NonBroadcast(phy->kororDevice, + &deviceInitStruct); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { + pr_err("ERROR adi_adrv904x_PreMcsInit_NonBroadcast failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + return JESD204_STATE_CHANGE_DONE; +} + +int adrv904x_jesd204_link_pre_setup(struct jesd204_dev *jdev, + enum jesd204_state_op_reason reason) +{ + struct adrv904x_jesd204_priv *priv = jesd204_dev_priv(jdev); + struct adrv904x_rf_phy *phy = priv->phy; + uint32_t deviceClockScaled_kHz = 0; + uint64_t dev_clk; + int ret; + + deviceClockScaled_kHz = + phy->kororDevice->initExtract.clocks.deviceClockScaled_kHz; + + pr_debug("%s:%d reason %s\n", __func__, __LINE__, + jesd204_state_op_reason_str(reason)); + + switch (reason) { + case JESD204_STATE_OP_REASON_INIT: + break; + default: + return JESD204_STATE_CHANGE_DONE; + } + + ret = no_os_clk_round_rate(phy->dev_clk, + deviceClockScaled_kHz * 1000, &dev_clk); + if (ret) + return JESD204_STATE_CHANGE_ERROR; + + if (dev_clk > 0 && ((dev_clk / 1000) == + deviceClockScaled_kHz)) { + no_os_clk_set_rate(phy->dev_clk, dev_clk); + pr_debug("Device clock %u sucessfully set (%ld)\n", + deviceClockScaled_kHz * 1000, dev_clk); + } else { + pr_err("Requesting device clock %u failed got %ld", + deviceClockScaled_kHz * 1000, dev_clk); + return -EINVAL; + } + + return JESD204_STATE_CHANGE_DONE; +} + +static int adrv904x_jesd204_link_init(struct jesd204_dev *jdev, + enum jesd204_state_op_reason reason, + struct jesd204_link *lnk) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + struct adrv904x_jesd204_priv *priv = jesd204_dev_priv(jdev); + struct adrv904x_rf_phy *phy = priv->phy; + uint8_t source_id; + uint32_t rate; + + pr_debug("%s:%d link_num %u reason %s\n", __func__, __LINE__, + lnk->link_id, jesd204_state_op_reason_str(reason)); + + switch (reason) { + case JESD204_STATE_OP_REASON_INIT: + break; + default: + return JESD204_STATE_CHANGE_DONE; + } + + switch (lnk->link_id) { + case DEFRAMER0_LINK_TX: + case DEFRAMER1_LINK_TX: + adi_adrv904x_DeframerCfg_t deframerCfg = { 0 }; + + if (lnk->link_id == DEFRAMER0_LINK_TX) + source_id = ADI_ADRV904X_DEFRAMER_0; + else + source_id = ADI_ADRV904X_DEFRAMER_1; + + recoveryAction = adi_adrv904x_DeframerCfgGet(phy->kororDevice, source_id, + &deframerCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { + pr_err("ERROR adi_adrv904x_DeframerCfgGet failed in %s at line %d.\n", __func__, + __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + priv->link[lnk->link_id].source_id = source_id; + phy->tx_iqRate_kHz = + phy->kororDevice->initExtract.jesdSetting.deframerSetting[source_id - + 1].iqRate_kHz; + rate = phy->kororDevice->initExtract.jesdSetting.deframerSetting[source_id - + 1].iqRate_kHz; + lnk->num_lanes = no_os_hweight8( + phy->kororDevice->initExtract.jesdSetting.deframerSetting[source_id - + 1].deserialLaneEnabled); + lnk->num_converters = + phy->kororDevice->initExtract.jesdSetting.deframerSetting[source_id - 1].jesdM; + lnk->bits_per_sample = + phy->kororDevice->initExtract.jesdSetting.deframerSetting[source_id - 1].jesdNp; + + lnk->octets_per_frame = deframerCfg.jesd204F; + lnk->frames_per_multiframe = deframerCfg.jesd204K; + lnk->device_id = deframerCfg.deviceId; + lnk->bank_id = deframerCfg.bankId; + lnk->scrambling = deframerCfg.decrambling; + lnk->converter_resolution = deframerCfg.jesd204Np; + lnk->num_of_multiblocks_in_emb = deframerCfg.jesd204E; + lnk->ctrl_bits_per_sample = 0; + lnk->jesd_version = deframerCfg.enableJesd204C ? JESD204_VERSION_C : + JESD204_VERSION_B; + lnk->jesd_encoder = deframerCfg.enableJesd204C ? JESD204_ENCODER_64B66B : + JESD204_ENCODER_8B10B; + lnk->subclass = JESD204_SUBCLASS_1; // ToDo - from where + lnk->is_transmit = true; + lnk->jesd_encoder = JESD204_ENCODER_64B66B; + break; + case FRAMER0_LINK_RX: + case FRAMER1_LINK_RX: + case FRAMER2_LINK_RX: + adi_adrv904x_FramerCfg_t framerCfg = { 0 }; + + if (lnk->link_id == FRAMER0_LINK_RX) + source_id = ADI_ADRV904X_FRAMER_0; + else if (lnk->link_id == FRAMER1_LINK_RX) + source_id = ADI_ADRV904X_FRAMER_1; + else + source_id = ADI_ADRV904X_FRAMER_2; + + recoveryAction = adi_adrv904x_FramerCfgGet(phy->kororDevice, source_id, + &framerCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { + pr_err("ERROR adi_adrv904x_FramerCfgGet failed in %s at line %d.\n", __func__, + __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + priv->link[lnk->link_id].source_id = source_id; + priv->link[lnk->link_id].is_framer = true; + phy->rx_iqRate_kHz = + phy->kororDevice->initExtract.jesdSetting.framerSetting[source_id - + 1].iqRate_kHz; + rate = phy->kororDevice->initExtract.jesdSetting.framerSetting[source_id - + 1].iqRate_kHz; + lnk->num_lanes = no_os_hweight8( + phy->kororDevice->initExtract.jesdSetting.framerSetting[source_id - + 1].serialLaneEnabled); + lnk->num_converters = + phy->kororDevice->initExtract.jesdSetting.framerSetting[source_id - 1].jesdM; + lnk->bits_per_sample = + phy->kororDevice->initExtract.jesdSetting.framerSetting[source_id - 1].jesdNp; + + lnk->octets_per_frame = framerCfg.jesd204F; + lnk->frames_per_multiframe = framerCfg.jesd204K; + lnk->device_id = framerCfg.deviceId; + lnk->bank_id = framerCfg.bankId; + lnk->scrambling = framerCfg.scramble; + lnk->converter_resolution = framerCfg.jesd204Np; + lnk->num_of_multiblocks_in_emb = framerCfg.jesd204E; + lnk->ctrl_bits_per_sample = 0; + lnk->jesd_version = framerCfg.enableJesd204C ? JESD204_VERSION_C : + JESD204_VERSION_B; + lnk->jesd_encoder = framerCfg.enableJesd204C ? JESD204_ENCODER_64B66B : + JESD204_ENCODER_8B10B; + lnk->subclass = JESD204_SUBCLASS_1; + lnk->is_transmit = false; + lnk->jesd_encoder = JESD204_ENCODER_64B66B; + + break; + default: + return -EINVAL; + } + + lnk->sample_rate = rate * 1000; + + return JESD204_STATE_CHANGE_DONE; +} + +int adrv904x_jesd204_link_setup(struct jesd204_dev *jdev, + enum jesd204_state_op_reason reason) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + struct adrv904x_jesd204_priv *priv = jesd204_dev_priv(jdev); + struct adrv904x_rf_phy *phy = priv->phy; + + pr_debug("%s:%d reason %s\n", __func__, __LINE__, + jesd204_state_op_reason_str(reason)); + + + if (reason == JESD204_STATE_OP_REASON_UNINIT) { + phy->is_initialized = 0; + + adi_adrv904x_HwClose(phy->kororDevice); + + memset(&phy->adi_adrv904x_device.devStateInfo, 0, + sizeof(phy->adi_adrv904x_device.devStateInfo)); + + return JESD204_STATE_CHANGE_DONE; + } + + recoveryAction = adi_adrv904x_MultichipSyncSet(phy->kororDevice, ADI_ENABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { + pr_err("ERROR adi_adrv904x_MultichipSyncSet failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + return JESD204_STATE_CHANGE_DONE; +} + +static int adrv904x_jesd204_setup_stage1(struct jesd204_dev *jdev, + enum jesd204_state_op_reason reason) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_DEVICE; + struct adrv904x_jesd204_priv *priv = jesd204_dev_priv(jdev); + struct adrv904x_rf_phy *phy = priv->phy; + uint32_t mcsStatus; + int i; + + pr_debug("%s:%d reason %s\n", __func__, __LINE__, + jesd204_state_op_reason_str(reason)); + + if (reason != JESD204_STATE_OP_REASON_INIT) + return JESD204_STATE_CHANGE_DONE; + + /* This loop will send SysRef pulses up to 255 times unless MCS status achieved before. */ + for (i = 0; i < 255; i++) { + recoveryAction = adi_adrv904x_MultichipSyncStatusGet(phy->kororDevice, + &mcsStatus); + if (recoveryAction) { + ADI_API_ERROR_REPORT(&phy->kororDevice->common, recoveryAction, + "Issue during getting multi-chip sync status"); + return JESD204_STATE_CHANGE_ERROR; + } + + if ((mcsStatus & 0x01) == 0x01) + break; + + jesd204_sysref_async_force(phy->jdev); + } + + if (mcsStatus != 0x01) { + pr_err("%s:%d Unexpected MCS sync status (0x%X)", __func__, __LINE__, + mcsStatus); + + return JESD204_STATE_CHANGE_ERROR; + } + + return JESD204_STATE_CHANGE_DONE; +} + +static int adrv904x_jesd204_setup_stage2(struct jesd204_dev *jdev, + enum jesd204_state_op_reason reason) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_DEVICE; + struct adrv904x_jesd204_priv *priv = jesd204_dev_priv(jdev); + struct adrv904x_rf_phy *phy = priv->phy; + + pr_debug("%s:%d reason %s\n", __func__, __LINE__, + jesd204_state_op_reason_str(reason)); + + if (reason != JESD204_STATE_OP_REASON_INIT) + return JESD204_STATE_CHANGE_DONE; + + /* MCS end sequence*/ + recoveryAction = adi_adrv904x_MultichipSyncSet(phy->kororDevice, ADI_DISABLE); + if (recoveryAction) { + pr_err("ERROR adi_adrv904x_MultichipSyncSet failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + /* Post MCS */ + recoveryAction = adi_adrv904x_PostMcsInit(phy->kororDevice, + &utilityInit); + if (recoveryAction) { + pr_err("ERROR adi_adrv904x_PostMcsInit failed in %s at line %d.\n", __func__, + __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + return JESD204_STATE_CHANGE_DONE; +} + +static int adrv904x_jesd204_clks_enable(struct jesd204_dev *jdev, + enum jesd204_state_op_reason reason, + struct jesd204_link *lnk) +{ + struct adrv904x_jesd204_priv *priv = jesd204_dev_priv(jdev); + struct adrv904x_rf_phy *phy = priv->phy; + int ret; + + pr_debug("%s:%d link_num %u reason %s\n", __func__, __LINE__, + lnk->link_id, jesd204_state_op_reason_str(reason)); + + if (reason != JESD204_STATE_OP_REASON_INIT) + return JESD204_STATE_CHANGE_DONE; + + if (!lnk->num_converters) + return JESD204_STATE_CHANGE_DONE; + + if (priv->link[lnk->link_id].is_framer) { + if (phy->kororDevice->devStateInfo.linkSharingEnabled == 1) { + ret = adi_adrv904x_FramerSysrefCtrlSet(phy->kororDevice, + ADI_ADRV904X_FRAMER_1, ADI_DISABLE); + if (ret) { + pr_err("ERROR adi_adrv904x_FramerSysrefCtrlSet failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + ret = adi_adrv904x_FramerLinkStateSet(phy->kororDevice, + ADI_ADRV904X_FRAMER_1, ADI_DISABLE); + if (ret) { + pr_err("ERROR adi_adrv904x_FramerLinkStateSet failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + ret = adi_adrv904x_FramerSysrefCtrlSet(phy->kororDevice, + ADI_ADRV904X_FRAMER_1, ADI_ENABLE); + if (ret) { + pr_err("ERROR adi_adrv904x_FramerSysrefCtrlSet failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + ret = adi_adrv904x_FramerLinkStateSet(phy->kororDevice, + ADI_ADRV904X_FRAMER_1, ADI_ENABLE); + if (ret) { + pr_err("ERROR adi_adrv904x_FramerLinkStateSet failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + pr_debug("%s:%d Link %d Framer enabled\n", __func__, __LINE__, + ADI_ADRV904X_FRAMER_1); + + + ret = adi_adrv904x_FramerSysrefCtrlSet(phy->kororDevice, + ADI_ADRV904X_FRAMER_1, ADI_DISABLE); + if (ret) { + pr_err("ERROR adi_adrv904x_FramerSysrefCtrlSet failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + jesd204_sysref_async_force(phy->jdev); + + ret = adi_adrv904x_FramerLinkStateSet(phy->kororDevice, + ADI_ADRV904X_FRAMER_1, ADI_DISABLE); + if (ret) { + pr_err("ERROR adi_adrv904x_FramerLinkStateSet failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + } + + ret = adi_adrv904x_FramerSysrefCtrlSet(phy->kororDevice, + priv->link[lnk->link_id].source_id, ADI_ENABLE); + if (ret) { + pr_err("ERROR adi_adrv904x_FramerSysrefCtrlSet failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + ret = adi_adrv904x_FramerLinkStateSet(phy->kororDevice, + priv->link[lnk->link_id].source_id, ADI_DISABLE); + if (ret) { + pr_err("ERROR adi_adrv904x_FramerLinkStateSet failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + ret = adi_adrv904x_FramerLinkStateSet(phy->kororDevice, + priv->link[lnk->link_id].source_id, ADI_ENABLE); + if (ret) { + pr_err("ERROR adi_adrv904x_FramerLinkStateSet failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + pr_debug("%s:%d Link %d Framer enabled\n", __func__, __LINE__, + priv->link[lnk->link_id].source_id); + + /*************************************************/ + /**** Enable SYSREF to Koror JESD204B Framer ***/ + /*************************************************/ + ret = adi_adrv904x_FramerSysrefCtrlSet(phy->kororDevice, + priv->link[lnk->link_id].source_id, ADI_DISABLE); + if (ret) { + pr_err("ERROR adi_adrv904x_FramerSysrefCtrlSet failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + + } + + ret = adi_adrv904x_SerializerReset(phy->kororDevice); + if (ret) { + pr_err("adi_adrv904x_SerializerReset failedin %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + } else { + ret = adi_adrv904x_DeframerSysrefCtrlSet(phy->kororDevice, + (uint8_t) ADI_ADRV904X_ALL_DEFRAMER, ADI_DISABLE); + if (ret) { + pr_err("ERROR adi_adrv904x_DeframerSysrefCtrlSet failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + ret = adi_adrv904x_DeframerLinkStateSet(phy->kororDevice, + (uint8_t) ADI_ADRV904X_ALL_DEFRAMER, ADI_DISABLE); + if (ret) { + pr_err("ERROR adi_adrv904x_DeframerLinkStateSet failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + }; + + return JESD204_STATE_CHANGE_DONE; +} + +static int adrv904x_jesd204_link_enable(struct jesd204_dev *jdev, + enum jesd204_state_op_reason reason, + struct jesd204_link *lnk) +{ + struct adrv904x_jesd204_priv *priv = jesd204_dev_priv(jdev); + struct adrv904x_rf_phy *phy = priv->phy; + int ret; + + pr_debug("%s:%d link_num %u reason %s\n", __func__, __LINE__, + lnk->link_id, jesd204_state_op_reason_str(reason)); + + if (reason != JESD204_STATE_OP_REASON_INIT) + return JESD204_STATE_CHANGE_DONE; + + if (!lnk->num_converters) + return JESD204_STATE_CHANGE_DONE; + + if (!priv->link[lnk->link_id].is_framer) { /* DEFRAMER */ + adi_adrv904x_InitCals_t serdesCal = { + .calMask = ADI_ADRV904X_IC_SERDES, + .orxChannelMask = 0x00U, + .rxChannelMask = 0xFFU, + .txChannelMask = 0x00U, /* CAL_ALL_CHANNELS */ + .warmBoot = 0, + }; + + ret = adi_adrv904x_DeframerLinkStateSet(phy->kororDevice, + priv->link[lnk->link_id].source_id, ADI_ENABLE); + if (ret) { + pr_err("ERROR adi_adrv904x_DeframerLinkStateSet failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + adi_adrv904x_DeframerCfg_t deframerCfg = { 0 }; + uint8_t desLaneMask = 0; + + for (int j = 0U; j < ADI_ADRV904X_MAX_DEFRAMERS; ++j) { + ret = adi_adrv904x_DeframerCfgGet(phy->kororDevice, + (adi_adrv904x_DeframerSel_e)(1U << j), &deframerCfg); + + desLaneMask |= deframerCfg.deserializerLanesEnabled; + } + + /* Notify ARM to run SERDES Calbriation if necessary */ + ret = adi_adrv904x_InitCalsRun(phy->kororDevice, &serdesCal); + if (ret) { + pr_err("ERROR adi_adrv904x_InitCalsRun failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + /* Wait up to 60 seconds for ARM */ + ret = adi_adrv904x_InitCalsWait(phy->kororDevice, 60000); + if (ret) { + pr_err("ERROR adi_adrv904x_InitCalsWait failed in %s at line %d.\n", __func__, + __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + /***************************************************/ + /**** Enable SYSREF to Koror JESD204C Deframer ***/ + /***************************************************/ + ret = adi_adrv904x_DeframerLinkStateSet(phy->kororDevice, + priv->link[lnk->link_id].source_id, ADI_DISABLE); + if (ret) { + pr_err("ERROR adi_adrv904x_DeframerLinkStateSet failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + ret = adi_adrv904x_DeframerLinkStateSet(phy->kororDevice, + priv->link[lnk->link_id].source_id, ADI_ENABLE); + if (ret) { + pr_err("ERROR adi_adrv904x_DeframerLinkStateSet failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + ret = adi_adrv904x_DeframerSysrefCtrlSet(phy->kororDevice, + priv->link[lnk->link_id].source_id, ADI_ENABLE); + if (ret) { + pr_err("ERROR adi_adrv904x_DeframerSysrefCtrlSet failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + } + + return JESD204_STATE_CHANGE_DONE; +} + +static int adrv904x_jesd204_link_running(struct jesd204_dev *jdev, + enum jesd204_state_op_reason reason, + struct jesd204_link *lnk) +{ + struct adrv904x_jesd204_priv *priv = jesd204_dev_priv(jdev); + struct adrv904x_rf_phy *phy = priv->phy; + int ret; + + adi_adrv904x_FramerStatus_t framerStatus; + adi_adrv904x_DeframerStatus_v2_t deframerStatus; + uint8_t deframerLinkCondition = 0; + + pr_debug("%s:%d link_num %u reason %s\n", __func__, __LINE__, + lnk->link_id, jesd204_state_op_reason_str(reason)); + + if (reason != JESD204_STATE_OP_REASON_INIT) + return JESD204_STATE_CHANGE_DONE; + + if (!lnk->num_converters) + return JESD204_STATE_CHANGE_DONE; + + if (priv->link[lnk->link_id].is_framer) { + ret = adi_adrv904x_FramerStatusGet(phy->kororDevice, + priv->link[lnk->link_id].source_id, &framerStatus); + if (ret) { + pr_err("ERROR adi_adrv904x_FramerStatusGet failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + if (framerStatus.status & 0x02 != 0x02) + pr_warning("Link%u framerStatus 0x%X\n", + lnk->link_id, framerStatus.status); + } else { + ret = adi_adrv904x_DeframerStatusGet_v2(phy->kororDevice, + priv->link[lnk->link_id].source_id, &deframerStatus); + if (ret) { + pr_err("ERROR adi_adrv904x_DeframerStatusGet failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + ret = adi_adrv904x_DfrmLinkConditionGet( + phy->kororDevice, + priv->link[lnk->link_id].source_id, + &deframerLinkCondition); + + pr_info("Link%u deframerStatus linkState 0x%X\n", + lnk->link_id, deframerStatus.linkState); + + for (int i = 0; i < lnk->num_lanes; i++) + pr_warning("Link%u deframerStatus %d laneStatus 0x%X\n", + lnk->link_id, i, deframerStatus.laneStatus[i]); + } + + return JESD204_STATE_CHANGE_DONE; +} + +/* Helper function to convert between tracking cals to init cals + * + * Returns init cal. + */ +ADI_API adi_adrv904x_InitCalibrations_e example_cals_TrackingCalConvert( + const adi_adrv904x_TrackingCalibrationMask_e trackingCal) +{ + adi_adrv904x_InitCalibrations_e initCal = (adi_adrv904x_InitCalibrations_e) 0U; + + switch (trackingCal) { + case ADI_ADRV904X_TC_TX_LOL_MASK: + initCal = ADI_ADRV904X_IC_TXLOL; + break; + + case ADI_ADRV904X_TC_TX_QEC_MASK: + initCal = ADI_ADRV904X_IC_TXQEC; + break; + + case ADI_ADRV904X_TC_TX_SERDES_MASK: + initCal = ADI_ADRV904X_IC_SERDES; + break; + + case ADI_ADRV904X_TC_RX_ADC_MASK: + initCal = ADI_ADRV904X_IC_ADC_RX; + break; + + case ADI_ADRV904X_TC_TX_LB_ADC_MASK: + initCal = ADI_ADRV904X_IC_ADC_TXLB; + break; + + case ADI_ADRV904X_TC_ORX_ADC_MASK: + initCal = ADI_ADRV904X_IC_ADC_ORX; + break; + + case ADI_ADRV904X_TC_RX_QEC_MASK: + /* Fall Through */ + + default: + initCal = (adi_adrv904x_InitCalibrations_e) 0U; + break; + } + + return initCal; +} + +static int adrv904x_jesd204_post_running_stage(struct jesd204_dev *jdev, + enum jesd204_state_op_reason reason) +{ + adi_adrv904x_TrackingCalibrationMask_e trackingCal = + (adi_adrv904x_TrackingCalibrationMask_e) 0U; + adi_adrv904x_InitCalibrations_e currentInitCalMask = + (adi_adrv904x_InitCalibrations_e) 0U; + struct adrv904x_jesd204_priv *priv = jesd204_dev_priv(jdev); + adi_adrv904x_InitCalStatus_t initCalStatus; + const uint32_t ALL_CHANNELS_MASK = 0xFFU; + adi_adrv904x_TxAtten_t txAttenuation[1]; + struct adrv904x_rf_phy *phy = priv->phy; + const uint32_t NUM_TRACKING_CALS = 7U; + uint32_t i = 0U; + uint32_t j = 0U; + int ret; + + const uint32_t trackingCalMask = (uint32_t)(ADI_ADRV904X_TC_RX_ADC_MASK | + ADI_ADRV904X_TC_ORX_ADC_MASK | + ADI_ADRV904X_TC_TX_LB_ADC_MASK | + ADI_ADRV904X_TC_TX_SERDES_MASK); + + pr_debug("%s:%d reason %s\n", __func__, __LINE__, + jesd204_state_op_reason_str(reason)); + + if (reason != JESD204_STATE_OP_REASON_INIT) { + phy->is_initialized = 0; + return JESD204_STATE_CHANGE_DONE; + } + + ret = adi_adrv904x_RxTxEnableSet(phy->kororDevice, 0x00, 0x00, + ADI_ADRV904X_RX_MASK_ALL, ADI_ADRV904X_RX_MASK_ALL, + ADI_ADRV904X_TXALL, ADI_ADRV904X_TXALL); + if (ret) { + pr_err("ERROR adi_adrv904x_RxTxEnableSet failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + for (uint8_t chan = 0; chan < 8; chan++) { + txAttenuation[0].txChannelMask = ADI_ADRV904X_TX0 << chan; + txAttenuation[0].txAttenuation_mdB = 6000; + ret = adi_adrv904x_TxAttenSet(phy->kororDevice, txAttenuation, 1); + if (ret != ADI_ADRV904X_ERR_ACT_NONE) { + pr_err("ERROR adi_adrv904x_TxAttenSet failed in %s at line %d.\n", __func__, + __LINE__); + return -1; + } + } + + memset(&initCalStatus, 0, sizeof(adi_adrv904x_InitCalStatus_t)); + + ret = adi_adrv904x_InitCalsDetailedStatusGet(phy->kororDevice, &initCalStatus); + if (ret) { + pr_err("ERROR adi_adrv904x_InitCalsDetailedStatusGet failed in %s at line %d.\n", + __func__, __LINE__); + return JESD204_STATE_CHANGE_ERROR; + } + + for (i = 0U; i < NUM_TRACKING_CALS; ++i) { + trackingCal = (adi_adrv904x_TrackingCalibrationMask_e)(1U << i); + + if (((uint32_t)trackingCal & trackingCalMask) == 0U) { + /* Tracking Cal not configured to run */ + continue; + } + + /* Check if the Current Tracking Cal was initially run */ + currentInitCalMask = example_cals_TrackingCalConvert(trackingCal); + + for (j = 0U; j < ADI_ADRV904X_MAX_CHANNELS; ++j) { + if ((initCalStatus.calsSincePowerUp[j] & currentInitCalMask) == 0U) { + /* Tracking Cal was already run */ + continue; + } + } + + ret = adi_adrv904x_TrackingCalsEnableSet(phy->kororDevice, + trackingCal, + ALL_CHANNELS_MASK, + ADI_ADRV904X_TRACKING_CAL_ENABLE); + if (ret) { + pr_err("\n\n ERR tracking call set \n\n"); + return JESD204_STATE_CHANGE_ERROR; + } + } + + phy->is_initialized = 1; + adrv904x_info(phy); + + return JESD204_STATE_CHANGE_DONE; +} + +static const struct jesd204_dev_data jesd204_adrv904x_init = { + .state_ops = { + [JESD204_OP_DEVICE_INIT] = { + .per_device = adrv904x_jesd204_device_init, + .mode = JESD204_STATE_OP_MODE_PER_DEVICE, + }, + [JESD204_OP_LINK_INIT] = { + .per_link = adrv904x_jesd204_link_init, + }, + [JESD204_OP_LINK_PRE_SETUP] = { + .per_device = adrv904x_jesd204_link_pre_setup, + .mode = JESD204_STATE_OP_MODE_PER_DEVICE, + }, + [JESD204_OP_LINK_SETUP] = { + .per_device = adrv904x_jesd204_link_setup, + .mode = JESD204_STATE_OP_MODE_PER_DEVICE, + .post_state_sysref = true, + }, + [JESD204_OP_OPT_SETUP_STAGE1] = { + .per_device = adrv904x_jesd204_setup_stage1, + .mode = JESD204_STATE_OP_MODE_PER_DEVICE, + .post_state_sysref = true, + }, + [JESD204_OP_OPT_SETUP_STAGE2] = { + .per_device = adrv904x_jesd204_setup_stage2, + .mode = JESD204_STATE_OP_MODE_PER_DEVICE, + .post_state_sysref = true, + }, + [JESD204_OP_CLOCKS_ENABLE] = { + .per_link = adrv904x_jesd204_clks_enable, + }, + [JESD204_OP_LINK_ENABLE] = { + .per_link = adrv904x_jesd204_link_enable, + .post_state_sysref = true, + }, + [JESD204_OP_LINK_RUNNING] = { + .per_link = adrv904x_jesd204_link_running, + }, + [JESD204_OP_OPT_POST_RUNNING_STAGE] = { + .per_device = adrv904x_jesd204_post_running_stage, + .mode = JESD204_STATE_OP_MODE_PER_DEVICE, + }, + }, + + .max_num_links = 10, + .sizeof_priv = sizeof(struct adrv904x_jesd204_priv), +}; + +/* Helper function to populate trxBinaryInfoPtr structure used for PreMcs + * + * Returns 0 on success. + */ +static int populateTrxFileInfo(adi_adrv904x_TrxFileInfo_t * const + trxBinaryInfoPtr, + const char * const cpuBin, + const char * const configBin, + const char * const streamBin, + const char * const gainTable, + const char * const dfeBin, + const char * const radSeqBin) + +{ + if (trxBinaryInfoPtr == NULL || cpuBin == NULL || streamBin == NULL + || gainTable == NULL) { + pr_err("Invalid parameters for input\n"); + return -1; + } + + pr_info("Firmware file: %s\n", cpuBin); + pr_info("Gain Table file: %s\n", gainTable); + pr_info("Streams file: %s\n", streamBin); + pr_info("Device Profile file: %s\n", configBin); + pr_info("DFE file: %s\n", dfeBin); + pr_info("Radio Sequencer file: %s\n", radSeqBin); + strncpy((char *)trxBinaryInfoPtr->dfeCpu.filePath, dfeBin, + ADI_ADRV904X_MAX_FILE_LENGTH); + trxBinaryInfoPtr->dfeCpu.filePath[ADI_ADRV904X_MAX_FILE_LENGTH - 1] = '\0'; + strncpy((char *)trxBinaryInfoPtr->radioSequencer.filePath, radSeqBin, + ADI_ADRV904X_MAX_FILE_LENGTH); + trxBinaryInfoPtr->radioSequencer.filePath[ADI_ADRV904X_MAX_FILE_LENGTH - 1] = + '\0'; + + fflush(stdout); + + strncpy((char *)trxBinaryInfoPtr->stream.filePath, streamBin, + ADI_ADRV904X_MAX_FILE_LENGTH); + trxBinaryInfoPtr->stream.filePath[ADI_ADRV904X_MAX_FILE_LENGTH - 1] = '\0'; + strncpy((char *)trxBinaryInfoPtr->cpu.filePath, cpuBin, + ADI_ADRV904X_MAX_FILE_LENGTH); + trxBinaryInfoPtr->cpu.filePath[ADI_ADRV904X_MAX_FILE_LENGTH - 1] = '\0'; + strncpy((char *)trxBinaryInfoPtr->cpuProfile.filePath, configBin, + ADI_ADRV904X_MAX_FILE_LENGTH); + trxBinaryInfoPtr->cpuProfile.filePath[ADI_ADRV904X_MAX_FILE_LENGTH - 1] = '\0'; + + for (unsigned i = 0; i < ADI_ADRV904X_RX_GAIN_TABLE_ARR_MAX; i++) { + trxBinaryInfoPtr->rxGainTable[i].channelMask = 1 << i; + strncpy((char *)trxBinaryInfoPtr->rxGainTable[i].filePath, gainTable, + ADI_ADRV904X_MAX_FILE_LENGTH); + trxBinaryInfoPtr->rxGainTable[i].filePath[ADI_ADRV904X_MAX_FILE_LENGTH - 1] = + '\0'; + } + + return 0; +} + +/** +* Initialize the device. +* @param dev - The device structure. +* @param init_param - The structure that contains the device initial +* parameters. +* @return 0 in case of success, negative error code otherwise. +*/ +int32_t adrv904x_init(struct adrv904x_rf_phy **dev, + const struct adrv904x_init_param *init_param) +{ + const char dfeBin[ADI_ADRV904X_MAX_FILE_LENGTH] = "ADRV9040_DFE_CALS_FW.bin"; + const char configBin[ADI_ADRV904X_MAX_FILE_LENGTH] = "DeviceProfileTest.bin"; + const char streamBin[ADI_ADRV904X_MAX_FILE_LENGTH] = "stream_image.bin"; + const char gainTable[ADI_ADRV904X_MAX_FILE_LENGTH] = "RxGainTable.csv"; + const char cpuBin[ADI_ADRV904X_MAX_FILE_LENGTH] = "ADRV9040_FW.bin"; + const char radSeqBin[ADI_ADRV904X_MAX_FILE_LENGTH] = ""; + adi_adrv904x_SpiConfigSettings_t *spi_settings; + adi_adrv904x_SpiOptions_t *spi_options; + struct adrv904x_jesd204_priv *priv; + struct adrv904x_rf_phy *phy; + int ret; + + phy = (struct adrv904x_rf_phy *)no_os_calloc(1, sizeof(*phy)); + if (!phy) + goto error; + + phy->kororDevice = init_param->adrv904x_device; + phy->spi_device_id = 0; + phy->device_id = 0; + phy->dev_clk = init_param->dev_clk; + + spi_settings = adrv904x_spi_settings_get(); + spi_options = adrv904x_spi_options_get(); + phy->spiSettings.msbFirst = spi_settings->msbFirst; + phy->spiOptions.allowSpiStreaming = spi_options->allowSpiStreaming; + phy->spiOptions.allowAhbAutoIncrement = spi_options->allowAhbAutoIncrement; + phy->spiOptions.allowAhbSpiFifoMode = spi_options->allowAhbSpiFifoMode; + phy->spiSettings.fourWireMode = spi_settings->fourWireMode; + phy->spiSettings.cmosPadDrvStrength = spi_settings->cmosPadDrvStrength; + + /* Load structure for PreMcsInit */ + ret = populateTrxFileInfo(&phy->trxBinaryInfoPtr, &cpuBin[0], &configBin[0], + &streamBin[0], + &gainTable[0], &dfeBin[0], &radSeqBin[0]); + if (ret) { + pr_err("ERROR populateTrxFileInfo failed in %s at line %d.\n", __func__, + __LINE__); + return -1; + } + + ret = adrv904x_setup(phy); + if (ret < 0) { + pr_err("%s: adrv904x_setup failed (%d)\n", __func__, ret); + goto error_setup; + } + + ret = jesd204_dev_register(&phy->jdev, &jesd204_adrv904x_init); + if (ret) + goto error_setup; + + priv = jesd204_dev_priv(phy->jdev); + priv->phy = phy; + + phy->kororDevice->common.errPtr->errDataInfo.errDeviceInfo.id = 1; + + *dev = phy; + + return 0; +error_setup: + no_os_free(phy); +error: + return ret; +} + +static int32_t adrv9040_bb_recalc_rate(struct no_os_clk_desc *desc, + uint64_t *rate) +{ + struct adrv904x_rf_phy *adrv904x_dev; + adrv904x_dev = desc->dev_desc; + + if (!strcmp(desc->name, "-rx_sampl_clk")) + *rate = adrv904x_dev->rx_iqRate_kHz; + else if (!strcmp(desc->name, "-tx_sampl_clk")) + *rate = adrv904x_dev->tx_iqRate_kHz; + else if (!strcmp(desc->name, "-orx_sampl_clk")) + *rate = adrv904x_dev->orx_iqRate_kHz; + else + return -EINVAL; + + return 0; +} + +static int32_t adrv9040_bb_set_rate(struct no_os_clk_desc *desc, + uint64_t rate) +{ + // Do nothing + return 0; +} + +static int32_t adrv9040_bb_round_rate(struct no_os_clk_desc *desc, + uint64_t rate, + uint64_t *rounded_rate) +{ + pr_debug("%s: Rate %lu Hz", __func__, rate); + + *rounded_rate = rate; + + return 0; +} + +static const struct no_os_clk_platform_ops adrv9040_bb_clk_ops = { + .clk_round_rate = &adrv9040_bb_round_rate, + .clk_set_rate = &adrv9040_bb_set_rate, + .clk_recalc_rate = &adrv9040_bb_recalc_rate, +}; + +int adrv904x_setup(struct adrv904x_rf_phy *phy) +{ + adi_adrv904x_ExtractInitDataOutput_e checkExtractInitData = + ADI_ADRV904X_EXTRACT_INIT_DATA_NOT_POPULATED; + const char *names[NUM_ADRV904X_CLKS] = { + "-rx_sampl_clk", "-tx_sampl_clk", "-orx_sampl_clk" + }; + int recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + struct no_os_clk_desc *orx_sample_clk = NULL; + struct no_os_clk_desc *rx_sample_clk = NULL; + struct no_os_clk_desc *tx_sample_clk = NULL; + struct no_os_clk_init_param clk_init; + const char *dev_name = "ADRV9040"; + adi_adrv904x_Version_t apiVersion; + adi_common_ErrData_t* errPtr; + uint8_t siRevision = 0xbb; + int ret; + + phy->kororDevice = &phy->adi_adrv904x_device; + phy->kororDevice->common.devHalInfo = &phy->hal; + + ADI_APP_MESSAGE("\nadrv904x_setup()\n"); + + /* Configure Example Application for No Buffering to Standard Output */ + ADI_LIBRARY_SETVBUF(stdout, NULL, _IONBF, 0); + + ret = no_os_clk_enable(phy->dev_clk); + if (ret) + return ret; + + errPtr = (adi_common_ErrData_t *)no_os_calloc(1, sizeof(adi_common_ErrData_t)); + if (!errPtr) + return -ENOMEM; + + phy->kororDevice->common.errPtr = errPtr; + phy->kororDevice->common.deviceInfo.id = 1; + phy->kororDevice->common.deviceInfo.name = dev_name; + phy->kororDevice->common.deviceInfo.type = 0x00; + + ret = adi_adrv904x_HwOpen(phy->kororDevice, adrv904x_spi_settings_get()); + if (ret) + return ret; + + rx_sample_clk = no_os_calloc(1, sizeof(rx_sample_clk)); + if (!rx_sample_clk) + goto rx_out_clk_error; + + /* Initialize clk component */ + clk_init.name = names[ADRV904X_RX_SAMPL_CLK]; + clk_init.hw_ch_num = 1; + clk_init.platform_ops = &adrv9040_bb_clk_ops; + clk_init.dev_desc = phy; + + ret = no_os_clk_init(&rx_sample_clk, &clk_init); + if (ret) + goto rx_out_clk_init_error; + + phy->clks[ADRV904X_RX_SAMPL_CLK] = rx_sample_clk; + + tx_sample_clk = no_os_calloc(1, sizeof(tx_sample_clk)); + if (!tx_sample_clk) + goto rx_out_clk_init_error; + + /* Initialize clk component */ + clk_init.name = names[ADRV904X_TX_SAMPL_CLK]; + clk_init.hw_ch_num = 1; + clk_init.platform_ops = &adrv9040_bb_clk_ops; + clk_init.dev_desc = phy; + + ret = no_os_clk_init(&tx_sample_clk, &clk_init); + if (ret) + goto tx_out_clk_init_error; + + phy->clks[ADRV904X_TX_SAMPL_CLK] = tx_sample_clk; + + orx_sample_clk = no_os_calloc(1, sizeof(orx_sample_clk)); + if (!orx_sample_clk) + goto tx_out_clk_init_error; + + /* Initialize clk component */ + clk_init.name = names[ADRV904X_ORX_SAMPL_CLK]; + clk_init.hw_ch_num = 1; + clk_init.platform_ops = &adrv9040_bb_clk_ops; + clk_init.dev_desc = phy; + + ret = no_os_clk_init(&orx_sample_clk, &clk_init); + if (ret) + goto orx_out_clk_init_error; + + phy->clks[ADRV904X_ORX_SAMPL_CLK] = orx_sample_clk; + + ret = adi_adrv904x_SpiVerify(phy->kororDevice); + if (ret) + goto orx_out_clk_init_error; + + ret = adi_adrv904x_ApiVersionGet(phy->kororDevice, &apiVersion); + if (ret) + goto orx_out_clk_init_error; + + ret = adi_adrv904x_DeviceRevGet(phy->kororDevice, &siRevision); + if (ret) + goto orx_out_clk_init_error; + + pr_info("adrv904x-phy Rev %d, API version: %u.%u.%u.%u found\n", + phy->kororDevice->devStateInfo.deviceSiRev, + apiVersion.majorVer, apiVersion.minorVer, + apiVersion.maintenanceVer, apiVersion.buildVer); + + pr_info("adrv904x-device revision: %#x\n", siRevision); + + if (apiVersion.majorVer > 1U) { + ADI_APP_API_CALL_RETURN(recoveryAction, adi_adrv904x_InitDataExtract, + phy->kororDevice, + &phy->trxBinaryInfoPtr.cpuProfile, + &initStructApiVersion, + &initStructArmVersion, + &initStructStreamVersion, + &deviceInitStruct, + &utilityInit, + &checkExtractInitData); + + switch (checkExtractInitData) { + case ADI_ADRV904X_EXTRACT_INIT_DATA_LEGACY_PROFILE_BIN: + ADI_APP_MESSAGE("\n\tUsing the Default Init and PostMcsInit Structures\n"); + break; + + case ADI_ADRV904X_EXTRACT_INIT_DATA_POPULATED: + ADI_APP_MESSAGE("\n\tUsing the Profile Init and PostMcsInit Structures\n"); + break; + + case ADI_ADRV904X_EXTRACT_INIT_DATA_NOT_POPULATED: + /* Fall Through */ + + default: + ADI_APP_ERROR_REPORT(ADI_COMMON_ERRCODE_INVALID_PARAM, + recoveryAction, + &deviceInitStruct, + "PreMcsInit and/or PostMcsInit Data Structures Not Populated"); + return ADI_APP_API_NOK; + break; + } + } + + /* Extract Info from CPU Profile Binary */ + /* Required for Link init */ + recoveryAction = adi_adrv904x_DeviceInfoExtract(phy->kororDevice, + &phy->trxBinaryInfoPtr.cpuProfile); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { + ADI_API_ERROR_REPORT(&phy->kororDevice->common, recoveryAction, + "Issue during CPU Profile Binary Image Extract"); + return -1; + } + + return 0; + +orx_out_clk_init_error: + no_os_free(orx_sample_clk); +tx_out_clk_init_error: + no_os_free(tx_sample_clk); +rx_out_clk_init_error: + no_os_free(rx_sample_clk); +rx_out_clk_error: + return ret; +} + +int adrv904x_remove(struct adrv904x_rf_phy *phy) +{ + no_os_clk_disable(phy->dev_clk); + + adrv904x_shutdown(phy); + + return 0; +} diff --git a/drivers/rf-transceiver/koror/adrv904x.h b/drivers/rf-transceiver/koror/adrv904x.h new file mode 100644 index 00000000000..24e45f204e4 --- /dev/null +++ b/drivers/rf-transceiver/koror/adrv904x.h @@ -0,0 +1,85 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * ADRV904x + * + * Copyright 2020-2023 Analog Devices Inc. + * + * Licensed under the GPL-2. + */ + +#ifndef IIO_TRX_ADRV904X_H_ +#define IIO_TRX_ADRV904X_H_ + +#include "adi_adrv904x_types.h" +#include "adi_adrv904x_core.h" +#include "no_os_platform.h" +#include "no_os_mutex.h" +#include "no_os_clk.h" +#include +#include + +/* + * JESD204-FSM defines + */ + +#define DEFRAMER0_LINK_TX 0 +#define DEFRAMER1_LINK_TX 1 +#define FRAMER0_LINK_RX 2 +#define FRAMER1_LINK_RX 3 +#define FRAMER2_LINK_RX 4 + +enum adrv904x_clocks { + ADRV904X_RX_SAMPL_CLK, + ADRV904X_TX_SAMPL_CLK, + ADRV904X_ORX_SAMPL_CLK, + NUM_ADRV904X_CLKS, +}; + +struct adrv904x_rf_phy { + struct no_os_spi_desc *spi_desc; + adi_adrv904x_Device_t adi_adrv904x_device; + adi_adrv904x_Device_t *kororDevice; + adi_adrv904x_SpiConfigSettings_t spiSettings; + adi_adrv904x_SpiOptions_t spiOptions; + adi_adrv904x_Init_t deviceInitStruct; + adi_adrv904x_TrxFileInfo_t trxBinaryInfoPtr; + adi_adrv904x_PostMcsInit_t adrv904xPostMcsInitInst; + struct adrv904x_hal_cfg hal; + + struct jesd204_dev *jdev; + /* protect against device accesses */ + void *lock; + uint32_t tx_iqRate_kHz; + uint32_t rx_iqRate_kHz; + uint32_t orx_iqRate_kHz; + + struct no_os_clk_desc *dev_clk; + struct no_os_clk_desc *clks[NUM_ADRV904X_CLKS]; + + uint8_t device_id; + bool is_initialized; + int spi_device_id; + + struct axi_adc *rx_adc; + struct axi_dac *tx_dac; +}; + +struct adrv904x_init_param { + struct no_os_spi_init_param *spi_init; + struct no_os_clk_desc *dev_clk; + struct adi_adrv904x_Device *adrv904x_device; +}; + +// /* Initialize the device. */ +int32_t adrv904x_init(struct adrv904x_rf_phy **device, + const struct adrv904x_init_param *init_param); + +int adrv904x_setup(struct adrv904x_rf_phy *phy); +int adrv904x_remove(struct adrv904x_rf_phy *phy); + +adi_adrv904x_SpiConfigSettings_t *adrv904x_spi_settings_get(void); +adi_adrv904x_SpiOptions_t *adrv904x_spi_options_get(void); + +int adrv904x_post_setup(struct adrv904x_rf_phy *phy); + +#endif diff --git a/drivers/rf-transceiver/koror/adrv904x_conv.c b/drivers/rf-transceiver/koror/adrv904x_conv.c new file mode 100644 index 00000000000..6e3c04f9e8d --- /dev/null +++ b/drivers/rf-transceiver/koror/adrv904x_conv.c @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * ADRV904x RF Transceiver + * + * Copyright 2020-2023 Analog Devices Inc. + * + */ + +#include "no_os_print_log.h" +#include "axi_adc_core.h" +#include "no_os_error.h" +#include "no_os_util.h" +#include "adrv904x.h" + +#ifdef CONFIG_CF_AXI_ADC +int adrv904x_hdl_loopback(struct adrv904x_rf_phy *phy, bool enable) +{ + uint32_t reg, addr, chan, version, scratch_reg; + + axi_adc_read(phy->rx_adc, 0x4000, &version); + pr_info("AXI ADC ver: %d.\n", version); + + addr = 0x4418; + + for (chan = 0; chan < 16; chan++) { + axi_adc_read(phy->rx_adc, addr + (chan)*0x40, ®); + + if (enable && reg != 0x8) { + scratch_reg = reg; + reg = 0x8; + } else if (reg == 0x8) + reg = scratch_reg; + + axi_adc_write(phy->rx_adc, addr + (chan)*0x40, reg); + } + + return 0; +} + +int adrv904x_post_setup(struct adrv904x_rf_phy *phy) +{ + unsigned int num_chan = 16; + int i; + + axi_adc_write(phy->rx_adc, AXI_ADC_REG_CNTRL, 0); + + for (i = 0; i < num_chan; i++) { + axi_adc_write(phy->rx_adc, AXI_ADC_REG_CHAN_CNTRL_1(i), + AXI_ADC_DCFILT_OFFSET(0)); + axi_adc_write(phy->rx_adc, AXI_ADC_REG_CHAN_CNTRL_2(i), + (i & 1) ? 0x00004000 : 0x40000000); + axi_adc_write(phy->rx_adc, AXI_ADC_REG_CHAN_CNTRL(i), + AXI_ADC_FORMAT_SIGNEXT | AXI_ADC_FORMAT_ENABLE | + AXI_ADC_ENABLE | AXI_ADC_IQCOR_ENB); + } + + return 0; +} + +#else /* CONFIG_CF_AXI_ADC */ + +int adrv9025_hdl_loopback(struct adrv9025_rf_phy *phy, bool enable) +{ + return -ENODEV; +} + +#endif /* CONFIG_CF_AXI_ADC */ diff --git a/drivers/rf-transceiver/koror/common/adi_common.h b/drivers/rf-transceiver/koror/common/adi_common.h new file mode 100644 index 00000000000..433f95a5338 --- /dev/null +++ b/drivers/rf-transceiver/koror/common/adi_common.h @@ -0,0 +1,22 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_common.h +* \brief Contains ADI common interface. +* +* ADI common lib Version: 0.0.2.1 +*/ + +#ifndef _ADI_COMMON_H_ +#define _ADI_COMMON_H_ + +#include "adi_common_error.h" +#include "adi_common_hal.h" +#include "adi_common_log.h" +#include "adi_common_types.h" + +#endif /* _ADI_COMMON_H_ */ diff --git a/drivers/rf-transceiver/koror/common/adi_common_macros.h b/drivers/rf-transceiver/koror/common/adi_common_macros.h new file mode 100644 index 00000000000..f66a9db581e --- /dev/null +++ b/drivers/rf-transceiver/koror/common/adi_common_macros.h @@ -0,0 +1,55 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_common_macros.h +* \brief Contains ADI Transceiver general purpose macros. +* +* ADI common lib Version: 0.0.2.1 +*/ + +#ifndef _ADI_COMMON_MACROS_H_ +#define _ADI_COMMON_MACROS_H_ + +#define ADI_HARDRESET 1U +#define ADI_SOFTRESET 0U + +#define ADI_TRUE 1U +#define ADI_FALSE 0U + +#define ADI_ENABLE 1U +#define ADI_DISABLE 0U + +#define ADI_ON 1U +#define ADI_OFF 0U + +#define ADI_SUCCESS 1U +#define ADI_FAILURE 0U + +#define ADI_NO_VARIABLE 0 +#define ADI_NO_ERROR_MESSAGE "No Error Message" + +#define ADI_VERBOSE_OFF_MESSAGE "Verbose OFF: No String Messages Built in API Code" + +#define ADI_LOG_INDENT 4U + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +#ifndef ADI_API_EX + #ifdef __cplusplus + #define ADI_API_EX ADI_API + #else + #define ADI_API_EX ADI_API extern + #endif +#endif + +#endif /* _ADI_COMMON_MACROS_H_ */ diff --git a/drivers/rf-transceiver/koror/common/adi_common_types.h b/drivers/rf-transceiver/koror/common/adi_common_types.h new file mode 100644 index 00000000000..db2d259f82b --- /dev/null +++ b/drivers/rf-transceiver/koror/common/adi_common_types.h @@ -0,0 +1,118 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_common_types.h +* \brief Contains ADI common types. +* +* ADI common lib Version: 0.0.2.1 +*/ + +#ifndef _ADI_COMMON_TYPES_H_ +#define _ADI_COMMON_TYPES_H_ + +#include "adi_common_error_types.h" +#include "adi_platform_types.h" + +#define ADI_COMMON_DEVICE_BF_ENCODE(value, mask, shift) (((value) << (shift)) & (mask)) +#define ADI_COMMON_DEVICE_BF_DECODE(value, mask, shift) (((value) & (mask)) >> (shift)) +#define ADI_COMMON_DEVICE_BF_CLEAR(result, mask) (result = ((result) & ~(mask))) +#define ADI_COMMON_DEVICE_BF_SET(result, mask) (result = (result) | (mask)) +#define ADI_COMMON_DEVICE_BF_UPDATE(result, value, mask, shift) (result = ((result) & ~(mask)) | ( ((value) << (shift)) & (mask))) +#define ADI_COMMON_DEVICE_BF_EQUAL(value, mask) ((mask) == ((value) & (mask))) + +/* +* \brief Common File Abstractions +*/ +typedef enum +{ + ADI_COMMON_FILE_HAL = 0x0U, + ADI_COMMON_FILE_LOGGING +} adi_common_File_e; + +/* +* \brief ADI Common Device Information +*/ +typedef struct +{ + uint32_t type; /* Device Type */ + uint32_t id; /* Device Number */ + const char* name; /* Device Name */ +} adi_common_DeviceInfo_t; + +/** + * \brief Mask values to be used with adi_common_Device.state. + * + * Members are intended to populate a uint8_t bitfield so must not exceed 1 << 7. + */ +typedef enum +{ + ADI_COMMON_DEVICE_STATE_OPEN = 1U << 0U, /*!< Device has been opened successfully with HwOpen. */ + /** Device is in a time-critical state. May be used to suspend some logging etc. */ + ADI_COMMON_DEVICE_STATE_TC = 1U << 1U +} adi_common_DeviceState_e; + +/** + * \brief Values to be used with adi_common_hal_ApiEnter_vLogCtl + */ +typedef enum +{ + ADI_COMMON_DEVICE_LOGCTL_NORMAL = 1U << 0U, /*!< Log API entry/exit as normal */ + ADI_COMMON_DEVICE_LOGCTL_QUIET = 1U << 1U /*!< De-prioritize the logging of this entry/exit */ +}adi_common_LogCtl_e; + +/** +* \brief ADI common device structure +*/ +typedef struct adi_common_Device +{ + adi_common_DeviceInfo_t deviceInfo; /* Device Information */ + void* devHalInfo; /* Hardware Abstraction Layer Settings */ + adi_common_ErrData_t* errPtr; /* Error Memory Pointer */ + uint8_t wrOnly; /* !0 => device is in a SPI write-only state, 0 device is in normal read-write state */ + adi_hal_mutex_t mutex; /* Used to serialize device access from multi-threaded client applications */ + uint16_t lockCnt; /* Counts number of times lock acquired using adi_common_Lock() */ + const char* type; /*!< Human-readable string indicating the device type */ + uint16_t id; /*!< Identifies an instance of a particular device type */ + uint8_t state; /*!< Bitfield as per adi_common_DeviceState_e */ + uint16_t publicCnt; /*!< Public API Count in the Call Stack */ +} adi_common_Device_t; + +/** + * \brief Evaluates to non-zero if a device's IS_OPEN state is set. See adi_common_DeviceState_e. + * \param commonDev - adi_common_Device_t + */ +#define ADI_COMMON_DEVICE_STATE_IS_OPEN(commonDev) ADI_COMMON_DEVICE_BF_EQUAL((commonDev).state, ADI_COMMON_DEVICE_STATE_OPEN) + +/** + * \brief Sets a device's IS_OPEN state. See adi_common_DeviceState_e. + * \param commonDev - adi_common_Device_t + */ +#define ADI_COMMON_DEVICE_STATE_OPEN_SET(commonDev) ADI_COMMON_DEVICE_BF_SET((commonDev).state, ADI_COMMON_DEVICE_STATE_OPEN) + +/** + * \brief Clears a device's IS_OPEN state. See adi_common_DeviceState_e. + * \param commonDev - adi_common_Device_t + */ +#define ADI_COMMON_DEVICE_STATE_OPEN_CLR(commonDev) ADI_COMMON_DEVICE_BF_CLEAR((commonDev).state, ADI_COMMON_DEVICE_STATE_OPEN) + +/** + * \brief Evaluates to non-zero if a device's TC (time-critical) state is set. See adi_common_DeviceState_e. + * \param commonDev - adi_common_Device_t + */ +#define ADI_COMMON_DEVICE_STATE_IS_TC(commonDev) ADI_COMMON_DEVICE_BF_EQUAL((commonDev).state, ADI_COMMON_DEVICE_STATE_TC) +/** + * \brief Sets a device's TC (time-critical) state. See adi_common_DeviceState_e. + * \param commonDev - adi_common_Device_t + */ +#define ADI_COMMON_DEVICE_STATE_TC_SET(commonDev) ADI_COMMON_DEVICE_BF_SET((commonDev).state, ADI_COMMON_DEVICE_STATE_TC) +/** + * \brief Clears a device's TC (time-critical) state. See adi_common_DeviceState_e. + * \param commonDev - adi_common_Device_t + */ +#define ADI_COMMON_DEVICE_STATE_TC_CLR(commonDev) ADI_COMMON_DEVICE_BF_CLEAR((commonDev).state, ADI_COMMON_DEVICE_STATE_TC) + +#endif /* _ADI_COMMON_TYPES_H_ */ \ No newline at end of file diff --git a/drivers/rf-transceiver/koror/common/adi_common_user.h b/drivers/rf-transceiver/koror/common/adi_common_user.h new file mode 100644 index 00000000000..2bf38ea692c --- /dev/null +++ b/drivers/rf-transceiver/koror/common/adi_common_user.h @@ -0,0 +1,36 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_common_user.h +* \brief Contains COMMON API macro definitions for user to override +* +* ADI common lib Version: 0.0.2.1 +*/ +#ifndef _ADI_COMMON_USER_H_ +#define _ADI_COMMON_USER_H_ + +#ifndef ADI_COMMON_VERBOSE + #define ADI_COMMON_VERBOSE 1 +#endif /* Verbose Flag (i.e. String Enable Flag) */ + +#ifndef ADI_COMMON_VARIABLE_USAGE + #define ADI_COMMON_VARIABLE_USAGE 1 +#endif /* Variable Name String Conversion Flag */ + +#ifndef ADI_COMMON_ERROR_VARIABLE_TYPE + #define ADI_COMMON_ERROR_VARIABLE_TYPE (int64_t) (intptr_t) +#endif /* Error Reporting Variable Data Type */ + +#ifndef ADI_COMMON_LOG_ERR_INDENT1 + #define ADI_COMMON_LOG_ERR_INDENT1 "\t\t\t\t\t" +#endif /* Log Error Indentation 1 */ + +#ifndef ADI_COMMON_LOG_ERR_INDENT2 + #define ADI_COMMON_LOG_ERR_INDENT2 "\t\t\t\t\t\t" +#endif /* Log Error Indentation 2 */ + +#endif /* _ADI_COMMON_USER_H_ */ \ No newline at end of file diff --git a/drivers/rf-transceiver/koror/common/adi_error/adi_common_error.c b/drivers/rf-transceiver/koror/common/adi_error/adi_common_error.c new file mode 100644 index 00000000000..b34f7889045 --- /dev/null +++ b/drivers/rf-transceiver/koror/common/adi_error/adi_common_error.c @@ -0,0 +1,325 @@ +/** + * Copyright 2015 - 2021 Analog Devices Inc. + * Released under the API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adi_common_error.c + * \brief Contains common API error handling functions implementations + * + * These functions are public to the customer for getting more details on + * errors and debugging. + * + * ADI common lib Version: 0.0.2.1 + */ + +#include "adi_common_error.h" +#include "adi_platform_types.h" + +#define ADI_ERROR_FRAME_PRINTF(errPtr, frameIdx) ADI_LIBRARY_PRINTF("Error Frame: %" PRIu32 "\n" \ + ADI_COMMON_LOG_ERR_INDENT1 "Recovery Action: %" PRId64 "\n" \ + ADI_COMMON_LOG_ERR_INDENT1 "Event Information:\n" \ + ADI_COMMON_LOG_ERR_INDENT2 "Error Code: 0x%" PRIX64"\n" \ + ADI_COMMON_LOG_ERR_INDENT2 "Error Source: 0x%" PRIX32 "\n" \ + ADI_COMMON_LOG_ERR_INDENT2 "Error Message: %s\n" \ + ADI_COMMON_LOG_ERR_INDENT1 "File Information:\n" \ + ADI_COMMON_LOG_ERR_INDENT2 "Line: %" PRIu32"\n" \ + ADI_COMMON_LOG_ERR_INDENT2 "Function: %s\n" \ + ADI_COMMON_LOG_ERR_INDENT2 "File: %" PRIu32"\n" \ + ADI_COMMON_LOG_ERR_INDENT1 "Variable Information:\n" \ + ADI_COMMON_LOG_ERR_INDENT2 "Variable Name: %s\n" \ + ADI_COMMON_LOG_ERR_INDENT2 "Variable Data: 0x%" PRIX64 "\n\n", \ + frameIdx, \ + (int64_t)errPtr->stackTrace[frameIdx].action, \ + errPtr->stackTrace[frameIdx].errInfo.errCode, \ + errPtr->stackTrace[frameIdx].errInfo.errSrc, \ + errPtr->stackTrace[frameIdx].errInfo.errMsg, \ + errPtr->stackTrace[frameIdx].fileInfo.line, \ + errPtr->stackTrace[frameIdx].fileInfo.function, \ + errPtr->stackTrace[frameIdx].fileInfo.file, \ + errPtr->stackTrace[frameIdx].varInfo.varName, \ + errPtr->stackTrace[frameIdx].varInfo.varData); + +ADI_API adi_common_ErrAction_e adi_common_ErrReport(const adi_common_Device_t* const commonDev, + const uint32_t errSource, + const adi_common_ErrAction_e action, + const int64_t errCode, + const uint32_t lineNum, + const char* funcName, + const uint32_t fileName, + const char* varName, + const int64_t varData, + const char* errMsg) +{ + adi_common_ErrAction_e recoveryAction = ADI_COMMON_ERR_ACT_CHECK_PARAM; + + ADI_NULL_COMMON_PTR_RETURN(commonDev); + + ADI_NULL_PTR_RETURN(commonDev->errPtr); + + /* Check if Trace Buffer is Full */ + if (ADI_COMMON_STACK_TRACE_SIZE > commonDev->errPtr->errDataInfo.stackIdx) + { + /* Recovery Action */ + commonDev->errPtr->stackTrace[commonDev->errPtr->errDataInfo.stackIdx].action = action; + /* Error Event Info */ + commonDev->errPtr->stackTrace[commonDev->errPtr->errDataInfo.stackIdx].errInfo.errCode = errCode; + commonDev->errPtr->stackTrace[commonDev->errPtr->errDataInfo.stackIdx].errInfo.errMsg = errMsg; + commonDev->errPtr->stackTrace[commonDev->errPtr->errDataInfo.stackIdx].errInfo.errSrc = errSource; + /* File Info */ + commonDev->errPtr->stackTrace[commonDev->errPtr->errDataInfo.stackIdx].fileInfo.line = lineNum; + commonDev->errPtr->stackTrace[commonDev->errPtr->errDataInfo.stackIdx].fileInfo.function = funcName; + commonDev->errPtr->stackTrace[commonDev->errPtr->errDataInfo.stackIdx].fileInfo.file = fileName; + /* Variable Information */ + commonDev->errPtr->stackTrace[commonDev->errPtr->errDataInfo.stackIdx].varInfo.varName = varName; + commonDev->errPtr->stackTrace[commonDev->errPtr->errDataInfo.stackIdx].varInfo.varData = varData; + /* Check Error Priority for Highest Recorded Action in Call Stack */ + if (action < commonDev->errPtr->errDebugInfo.highestPriorityAction) + { + commonDev->errPtr->errDebugInfo.highestPriorityAction = action; + } + + if (commonDev->errPtr->errDataInfo.stackIdx == 0U) + { + /* Copy Device Info @ 1st Error Frame */ + commonDev->errPtr->errDataInfo.errDeviceInfo.type = commonDev->deviceInfo.type; + commonDev->errPtr->errDataInfo.errDeviceInfo.id = commonDev->deviceInfo.id; + commonDev->errPtr->errDataInfo.errDeviceInfo.name = commonDev->deviceInfo.name; + } + + /* Update StackTrace Index for Next Entry */ + ++commonDev->errPtr->errDataInfo.stackIdx; + recoveryAction = ADI_COMMON_ERR_ACT_NONE; + } + + return recoveryAction; +} + +ADI_API adi_common_ErrAction_e adi_common_ErrMsgReport( const adi_common_Device_t* const commonDev, + const char* errCausePtr, + const char* errActionMsgPtr) +{ + ADI_NULL_COMMON_PTR_RETURN(commonDev); + + ADI_NULL_PTR_RETURN(commonDev->errPtr); + + /* Report First Error Cause & Action Message */ + if ((NULL == commonDev->errPtr->errDebugInfo.errCause) && + (NULL == commonDev->errPtr->errDebugInfo.actionMsg)) + { + commonDev->errPtr->errDebugInfo.errCause = errCausePtr; + commonDev->errPtr->errDebugInfo.actionMsg = errActionMsgPtr; + } + + return ADI_COMMON_ERR_ACT_NONE; +} + +ADI_API void adi_common_ErrStandardOutputWrite(const adi_common_ErrData_t* const errData) +{ + uint32_t idx = 0U; + + if (errData != NULL) + { + if (errData->errDataInfo.stackIdx > 0) + { + for (idx = 0U; idx < errData->errDataInfo.stackIdx; ++idx) + { + ADI_ERROR_FRAME_PRINTF(errData, idx) + } + } + } +} + + +ADI_API adi_common_ErrData_t* adi_common_ErrCreate(void) +{ + adi_common_ErrData_t* errDataPtr = (adi_common_ErrData_t*)ADI_LIBRARY_CALLOC(1, sizeof(adi_common_ErrData_t)); + + if (NULL == errDataPtr) + { + return NULL; + } + + return errDataPtr; +} + +ADI_API adi_common_ErrAction_e adi_common_ErrAssign(adi_common_Device_t* const commonDev, + adi_common_ErrData_t* const errDataPtr) +{ + adi_common_ErrAction_e recoveryAction = ADI_COMMON_ERR_ACT_CHECK_PARAM; + + if ((NULL != commonDev) && + (NULL != errDataPtr)) + { + commonDev->errPtr = errDataPtr; + recoveryAction = ADI_COMMON_ERR_ACT_NONE; + } + + return recoveryAction; +} + +ADI_API adi_common_ErrAction_e adi_common_ErrDestroy(adi_common_ErrData_t* errDataPtr) +{ + adi_common_ErrAction_e recoveryAction = ADI_COMMON_ERR_ACT_CHECK_PARAM; + + /* Validate Argument(s) */ + ADI_NULL_PTR_RETURN(errDataPtr); + + /* Free Memory */ + ADI_LIBRARY_FREE(errDataPtr); + errDataPtr = NULL; + + if (NULL == errDataPtr) + { + recoveryAction = ADI_COMMON_ERR_ACT_NONE; + } + + return recoveryAction; +} + +ADI_API adi_common_ErrAction_e adi_common_ErrClear(adi_common_ErrData_t* const errDataPtr) +{ + uint32_t idx = 0U; + + /* Validate Argument(s) */ + ADI_NULL_PTR_RETURN(errDataPtr); + + for (idx = 0U; idx < ADI_COMMON_STACK_TRACE_SIZE; ++idx) + { + errDataPtr->stackTrace[idx].action = ADI_COMMON_ERR_ACT_NONE; + errDataPtr->stackTrace[idx].errInfo.errCode = 0; + errDataPtr->stackTrace[idx].errInfo.errMsg = NULL; + errDataPtr->stackTrace[idx].errInfo.errSrc = 0U; + errDataPtr->stackTrace[idx].fileInfo.line = 0U; + errDataPtr->stackTrace[idx].fileInfo.function = NULL; + errDataPtr->stackTrace[idx].fileInfo.file = 0U; + errDataPtr->stackTrace[idx].varInfo.varName = NULL; + errDataPtr->stackTrace[idx].varInfo.varData = 0; + } + /* Debug Info */ + errDataPtr->errDebugInfo.highestPriorityAction = ADI_COMMON_ERR_ACT_NONE; + errDataPtr->errDebugInfo.errCause = NULL; + errDataPtr->errDebugInfo.actionMsg = NULL; + + /* Error Data Info */ + errDataPtr->errDataInfo.errDeviceInfo.type = 0U; + errDataPtr->errDataInfo.errDeviceInfo.id = 0U; + errDataPtr->errDataInfo.errDeviceInfo.name = NULL; + errDataPtr->errDataInfo.stackIdx = 0U; + + return ADI_COMMON_ERR_ACT_NONE; +} + +ADI_API adi_common_ErrAction_e adi_common_ErrFrameGet( const adi_common_Device_t* const commonDev, + const adi_common_ErrFrameId_e frameId, + adi_common_ErrFrame_t* const errFrame) +{ + uint8_t idx = 0U; + + /* Validate Argument(s) */ + ADI_NULL_COMMON_PTR_RETURN(commonDev); + + ADI_NULL_PTR_RETURN(commonDev->errPtr); + + ADI_NULL_PTR_RETURN(errFrame); + + if (ADI_COMMON_ERRFRAME_MAX < frameId) + { + /* Frame Index Out of Range; ADI_COMMON_ERRFRAME_MAX / TOP is only non Index Allowed */ + return ADI_COMMON_ERR_ACT_CHECK_PARAM; + } + + if (ADI_COMMON_ERRFRAME_API == frameId) + { + if (ADI_COMMON_ERRFRAME_IDX_0 != commonDev->errPtr->errDataInfo.stackIdx) + { + /* Stack Index is configured for the next Error Entry; We want the last entry */ + idx = (commonDev->errPtr->errDataInfo.stackIdx - 1U); + } + } + else + { + idx = frameId; + } + + /* Shallow Copy */ + *errFrame = commonDev->errPtr->stackTrace[idx]; + + return ADI_COMMON_ERR_ACT_NONE; +} + +ADI_API adi_common_ErrAction_e adi_common_ErrorGet( const int64_t errCode, + const char** const errMsgPtr, + adi_common_ErrAction_e* const action) +{ + static const adi_common_api_errors_t adi_common_api_errors[] = + { + { ADI_COMMON_ERRCODE_NONE, ADI_STRING("No Error"), ADI_COMMON_ERR_ACT_NONE }, + { ADI_COMMON_ERRCODE_INVALID_PARAM, ADI_STRING("Invalid Parameter Value"), ADI_COMMON_ERR_ACT_CHECK_PARAM }, + { ADI_COMMON_ERRCODE_NULL_PTR, ADI_STRING("Null Pointer"), ADI_COMMON_ERR_ACT_CHECK_PARAM }, + { ADI_COMMON_ERRCODE_API, ADI_STRING("API Call Error"), ADI_COMMON_ERR_ACT_CHECK_PARAM }, + { ADI_COMMON_ERRCODE_ARRAY_SIZE, ADI_STRING("Invalid Array Size"), ADI_COMMON_ERR_ACT_CHECK_PARAM }, + { ADI_COMMON_ERRCODE_LOCK, ADI_STRING("Mutex (Un)Locking Problem"), ADI_COMMON_ERR_ACT_RESET_DEVICE }, + { ADI_COMMON_ERRCODE_FEATURE_NOT_IMPLEMENTED, ADI_STRING("Feature Not Implemented"), ADI_COMMON_ERR_ACT_CHECK_FEATURE }, + { ADI_COMMON_ERRCODE_TIMEOUT, ADI_STRING("Timeout"), ADI_COMMON_ERR_ACT_RESET_FEATURE }, + { ADI_COMMON_ERRCODE_BOOT_TIMEOUT, ADI_STRING("Boot Timeout"), ADI_COMMON_ERR_ACT_RESET_DEVICE } + }; + + uint32_t idx; + adi_common_ErrAction_e recoveryAction = ADI_COMMON_ERR_ACT_CHECK_PARAM; + + ADI_NULL_PTR_RETURN(errMsgPtr); + + ADI_NULL_PTR_RETURN(action); + + for (idx = 0; (idx < (sizeof(adi_common_api_errors) / sizeof(adi_common_api_errors_t))); ++idx) + { + if (errCode == adi_common_api_errors[idx].errCode) + { + *errMsgPtr = adi_common_api_errors[idx].errMsg; + *action = adi_common_api_errors[idx].action; + recoveryAction = ADI_COMMON_ERR_ACT_NONE; + break; + } + } + return recoveryAction; +} + + +ADI_API adi_common_ErrAction_e adi_common_ErrInfoGet( const adi_common_ErrSources_e errSrc, + const int64_t errCode, + const char** const errMsgPtr, + adi_common_ErrAction_e* const errAction) +{ + adi_common_ErrAction_e recoveryAction = ADI_COMMON_ERR_ACT_CHECK_PARAM; + + ADI_NULL_PTR_RETURN(errMsgPtr); + + ADI_NULL_PTR_RETURN(errAction); + + /* Default Values */ + *errMsgPtr = NULL; + *errAction = ADI_COMMON_ERR_ACT_CHECK_PARAM; + + switch (errSrc) + { + case ADI_COMMON_ERRSRC_API: + case ADI_COMMON_ERRSRC_HAL: + case ADI_COMMON_ERRSRC_DEVICEHAL: + case ADI_COMMON_ERRSRC_DEVICEBF: + /* All Using Same Generic Error Codes */ + recoveryAction = adi_common_ErrorGet(errCode, errMsgPtr, errAction); + break; + + case ADI_COMMON_ERRSRC_NONE: + /* Fall Through */ + + default: + /* Invalid Error Source; No Lookup can be performed */ + recoveryAction = ADI_COMMON_ERR_ACT_CHECK_FEATURE; + break; + } + + return recoveryAction; +} diff --git a/drivers/rf-transceiver/koror/common/adi_error/adi_common_error.h b/drivers/rf-transceiver/koror/common/adi_error/adi_common_error.h new file mode 100644 index 00000000000..ac80d43ce09 --- /dev/null +++ b/drivers/rf-transceiver/koror/common/adi_error/adi_common_error.h @@ -0,0 +1,482 @@ +/** + * Copyright 2015 - 2021 Analog Devices Inc. + * Released under the API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adi_common_error.h + * \brief Contains Common API error handling function prototypes and macros + * that will be used by the API and will call functions in adi_common_error.c + * + * These functions are public to the customer for getting more details on + * errors and debugging. + * +* ADI common lib Version: 0.0.2.1 + */ + +#ifndef _ADI_COMMON_ERROR_H_ +#define _ADI_COMMON_ERROR_H_ + +#include "adi_common_types.h" +#include "adi_common_macros.h" +#include "adi_common_user.h" +#include "adi_common_error_types.h" +#include "adi_common_log.h" + + +/* +* ******************************* +* ADI Common error macros +* ******************************* +*/ + +/* +* \brief Macro to check for Null Device & Error Pointer +* +* \param devicePtr Device Pointer +*/ +#define ADI_NULL_DEVICE_PTR_RETURN(devicePtr) \ +if (devicePtr == NULL) \ +{ \ + return ADI_COMMON_ERR_ACT_CHECK_PARAM; \ +} + +/* +* \brief Macro to check for Null Common Device & Error Pointer +* +* \param commonDev Common Device Pointer, which also contains the Error Pointer +*/ +#define ADI_NULL_COMMON_PTR_RETURN(commonDev) \ +if ((commonDev == NULL) || \ + (commonDev->errPtr == NULL)) \ +{ \ + return ADI_COMMON_ERR_ACT_CHECK_PARAM; \ +} + +/* +* \brief Macro to check for Null Pointer +* +* \param ptr Pointer to be checked +*/ +#define ADI_NULL_PTR_RETURN(ptr) \ +if (ptr == NULL) \ +{ \ + return ADI_COMMON_ERR_ACT_CHECK_PARAM; \ +} +/* +* \brief Macro to perform the following: +* 1) Null Pointer Check +* 2) Report Null Pointer to Error Memory +* 3) Return ADI_COMMON_ERR_ACT_CHECK_PARAM from API + +* \param commonDev Pointer to the common Device Structure (contains a pointer to Error Memory) +* \param ptr Pointer to be checked +* +*/ +#define ADI_NULL_PTR_REPORT_RETURN(commonDev, ptr) \ +{ \ + if (ptr == NULL) \ + { \ + ADI_ERROR_REPORT( commonDev, \ + ADI_COMMON_ERRSRC_API, \ + ADI_COMMON_ERRCODE_NULL_PTR, \ + ADI_COMMON_ERR_ACT_CHECK_PARAM, \ + ptr, \ + "Null Pointer"); \ + \ + return ADI_COMMON_ERR_ACT_CHECK_PARAM; \ + } \ +} + +/* +* \brief Macro to perform the following: +* 1) Null Pointer Check +* 2) Report Null Pointer to Error Memory +* 3) GOTO label specified + +* \param commonDev Pointer to the common Device Structure (contains a pointer to Error Memory) +* \param ptr Pointer to be checked +* \param label Label for GOTO +* +*/ +#define ADI_NULL_PTR_REPORT_GOTO(commonDev, ptr, label) \ +{ \ + if (ptr == NULL) \ + { \ + ADI_ERROR_REPORT( commonDev, \ + ADI_COMMON_ERRSRC_API, \ + ADI_COMMON_ERRCODE_NULL_PTR, \ + ADI_COMMON_ERR_ACT_CHECK_PARAM, \ + ptr, \ + "Null Pointer"); \ + \ + goto label; \ + } \ +} + +#if ADI_COMMON_VERBOSE > 0 + #if ADI_COMMON_VARIABLE_USAGE > 0 + /* + * Macro to print variable name as a string, used in Error reporting facility + */ + #ifndef GET_VARIABLE_NAME + #define GET_VARIABLE_NAME(Variable) (#Variable) + #endif /* GET_VARIABLE_NAME(Variable) (#Variable) */ + #else + #ifndef GET_VARIABLE_NAME + #define GET_VARIABLE_NAME(Variable) (ADI_NO_ERROR_MESSAGE) + #endif /* GET_VARIABLE_NAME(Variable) (ADI_NO_ERROR_MESSAGE)*/ + #endif /* ADI_COMMON_VARIABLE_USAGE */ + + /** + * \brief Macro to be used for strings in code (Can be removed via ADI_COMMON_VERBOSE) + * + * \param string Error String + * + */ + #define ADI_STRING(string) string + +#else /* ADI_COMMON_VERBOSE OFF */ + #define ADI_STRING(string) ADI_VERBOSE_OFF_MESSAGE; +#endif /* ADI_COMMON_VERBOSE */ + +/* +* \brief Macro to perform Error Reporting to Memory & Error Logging to File + +* \param commonDev Pointer to the common Device Structure (contains a pointer to Error Memory) +* \param errSource Source of Error +* \param errAction Recovery Action to be taken from the current API +* \param errCode Error Code to be Logged +* \param variable Variable Name & Data that failed the parameter check, if applicable +* NOTE1: Explicit Type Conversion to int64_t for storage in Error Structure +* NOTE2: Passing of Pointers/String Literals will store Memory Address +* NOTE3: Capturing Entire Data Structures Not Supported +* NOTE4: Set to ADI_NO_VARIABLE if there is no variable related to the error +* \param errMsg Error Message +*/ +#define ADI_ERROR_REPORT( commonDev, \ + errSource, \ + errCode, \ + recoveryAction, \ + variable, \ + errMsg) \ + \ + (void)adi_common_ErrReport ( commonDev, \ + (uint32_t) errSource, /* Explicit Type Conversion; errSource stored as uint32_t */ \ + (adi_common_ErrAction_e) recoveryAction, /* Explicit Type Conversion;recoveryAction stored as adi_common_ErrAction_e */ \ + (int64_t) errCode, /* Explicit Type Conversion; errCode stored as int64_t */ \ + __LINE__, \ + __func__, \ + (uint32_t) ADI_FILE, /* Explicit Type Conversion; ADI_FILE stored as uint32_t */ \ + ADI_STRING(GET_VARIABLE_NAME(variable)), \ + ADI_COMMON_ERROR_VARIABLE_TYPE variable, /* Explicit Type Conversion; variable stored as int64_t via ADI_COMMON_ERROR_VARIABLE_TYPE */ \ + ADI_STRING(errMsg)); \ + \ + (void)adi_common_ErrLog ( commonDev, \ + (uint32_t) errSource, /* Explicit Type Conversion; errSource stored as uint32_t */ \ + (adi_common_ErrAction_e) recoveryAction, /* Explicit Type Conversion;recoveryAction stored as adi_common_ErrAction_e */ \ + (int64_t) errCode, /* Explicit Type Conversion; errCode stored as int64_t */ \ + __LINE__, \ + __func__, \ + (uint32_t) ADI_FILE, /* Explicit Type Conversion; ADI_FILE stored as uint32_t */ \ + ADI_STRING(GET_VARIABLE_NAME(variable)), \ + ADI_COMMON_ERROR_VARIABLE_TYPE variable, /* Explicit Type Conversion; variable stored as int64_t via ADI_COMMON_ERROR_VARIABLE_TYPE */ \ + ADI_STRING(errMsg)) +/* +* \brief Macro to perform Invalid Parameter Error Reporting to Memory & Error Logging to File + +* \param commonDev Pointer to the common Device Structure (contains a pointer to Error Memory) +* \param errAction Recovery Action to be taken from the current API +* \param variable Variable Name & Data that failed the parameter check, if applicable +* NOTE1: Passing of Pointers will store Memory Address +* NOTE2: Capturing Entire Data Structures Not Supported +* \param errMsg Error Message +*/ +#define ADI_PARAM_ERROR_REPORT( commonDev, \ + recoveryAction, \ + variable, \ + errMsg) \ + \ + ADI_ERROR_REPORT( commonDev, \ + ADI_COMMON_ERRSRC_API, \ + ADI_COMMON_ERRCODE_INVALID_PARAM, \ + recoveryAction, \ + variable, \ + errMsg); + +/* +* \brief Macro to perform API Error Reporting to Memory & Error Logging to File + +* \param commonDev Pointer to the common Device Structure (contains a pointer to Error Memory) +* \param errAction Recovery Action to be taken from the current API +* \param errMsg Error Message +*/ +#define ADI_API_ERROR_REPORT( commonDev, \ + recoveryAction, \ + errMsg) \ + \ + ADI_ERROR_REPORT( commonDev, \ + ADI_COMMON_ERRSRC_API, \ + ADI_COMMON_ERRCODE_API, \ + recoveryAction, \ + ADI_NO_VARIABLE, \ + errMsg) + + +/* +* \brief Macro to perform the following: +* 1) Write Message to Standard Output +*/ +#define ADI_APP_MESSAGE(...) ADI_LIBRARY_PRINTF(__VA_ARGS__); + + +/* +* \brief Macro to perform the following: +* 1) Write Error Data to Standard Output +*/ +#define ADI_APP_ERROR_OUTPUT(errPtr) adi_common_ErrStandardOutputWrite(errPtr); + +/* +* \brief Macro to perform Application Level Error Reporting to Memory & Error Logging to File + +* \param commonDev Pointer to the common Device Structure (contains a pointer to Error Memory) +* \param errCode Error Code (Mapped to ADI_COMMON_ERRSRC_APP) +* \param errAction Recovery Action to be taken from the current API +* \param variable Variable Name & Data that failed the parameter check, if applicable +* NOTE1: Passing of Pointers will store Memory Address +* NOTE2: Capturing Entire Data Structures Not Supported +* \param errMsg Error Message +*/ +#define ADI_APP_ERROR_REPORT( errCode, \ + recoveryAction, \ + variable, \ + errMsg) \ + \ +{ \ + adi_common_Device_t commonDev; \ + ADI_LIBRARY_MEMSET(&commonDev, 0, sizeof(adi_common_Device_t)); \ + \ + commonDev.errPtr = (adi_common_ErrData_t*) adi_hal_TlsGet(HAL_TLS_ERR); \ + \ + ADI_ERROR_REPORT( &commonDev, \ + ADI_COMMON_ERRSRC_APP, \ + errCode, \ + recoveryAction, \ + variable, \ + errMsg); \ +} + +/* +* \brief Macro to perform API Error Reporting to Memory & Error Logging to File + +* \param commonDev Pointer to the common Device Structure (contains a pointer to Error Memory) +* \param errAction Recovery Action to be taken from the current API +* \param errMsg Error Message +*/ +#define ADI_EXT_ERROR_REPORT( commonDev, \ + errCause, \ + errActionMsg) \ + \ + (void) adi_common_ErrMsgReport( commonDev, \ + errCause, \ + errActionMsg) + +/* +* \brief Macro to perform the following: +* 1) Report Feature Not Implemented +* 2) Return Common RecoveryAction (i.e. ADI_COMMON_ERR_ACT_CHECK_FEATURE) +*/ +#define ADI_API_NOT_IMPLEMENTED_REPORT_RETURN( commonDev) \ + \ + ADI_ERROR_REPORT( commonDev, \ + ADI_COMMON_ERRSRC_API, \ + ADI_COMMON_ERRCODE_FEATURE_NOT_IMPLEMENTED, \ + ADI_COMMON_ERR_ACT_CHECK_FEATURE, \ + ADI_NO_VARIABLE, \ + "Feature not implemented"); \ + return ADI_COMMON_ERR_ACT_CHECK_FEATURE; + +/* +* \brief Macro to perform the following: +* 1) Report Feature Not Implemented +* 2) GOTO label specified +*/ +#define ADI_API_NOT_IMPLEMENTED_REPORT_GOTO( commonDev, label) \ + \ + ADI_ERROR_REPORT( commonDev, \ + ADI_COMMON_ERRSRC_API, \ + ADI_COMMON_ERRCODE_FEATURE_NOT_IMPLEMENTED, \ + ADI_COMMON_ERR_ACT_CHECK_FEATURE, \ + ADI_NO_VARIABLE, \ + "Feature not implemented"); \ + goto label; + +/* +* \brief Macro to Create an Error Structure +* +* \param errDataPtr Pointer to Error Structure +*/ +#define ADI_CREATE_ERROR_MEMORY() adi_common_ErrCreate() + + +/* +* \brief Macro to Assign Error Pointer to Device Structure +* +* \param commonDev Pointer to Common Device +* \param errDataPtr Pointer to Error Structure +*/ +#define ADI_ASSIGN_ERROR_MEMORY(commonDev, errDataPtr) adi_common_ErrAssign(commonDev, errDataPtr) + +/* +* \brief Macro to Destroy an Error Structure +* +* \param errDataPtr Pointer to Error Structure +*/ +#define ADI_DESTROY_ERROR_MEMORY(errDataPtr) adi_common_ErrDestroy(errDataPtr) + +/* +* \brief Macro to clear an Error Structure +* +* \param errDataPtr Pointer to Error Structure +*/ +#define ADI_CLEAR_ERROR_MEMORY(errDataPtr) adi_common_ErrClear(errDataPtr) + +/* +* \brief Macro to Get Error Frame from Stack Trace +* +* \param commonDev Pointer to Common Device +* \param frameId Frame ID +* \param errDataPtr Pointer to Error Frame +*/ +#define ADI_ERROR_FRAME_GET(commonDev, frameId, framePtr) adi_common_ErrFrameGet(commonDev, frameId, framePtr) + +/* +* ******************************* +* ADI Common error functions +* ******************************* +*/ + +/* + * \brief Service to Report an Error + * + * \param[in] commonDev pointer to adi_common_Device_t + * \param[in] actionRequired RecoveryAction to be taken + * \param[in] lineNum line number of where the error was detected + * \param[in] funcName function name of the function where the error was detected + * \param[in] fileName file name of the file where the error was detected + * \param[in] detErr Detected Error Code + * \param[in] errCodeMsg Error Message + * \param[in] varName Variable name to be captured + * \param[in] varData Variable Data will be captured (Limitations Apply) + * \param[in] errMsg User Readable Error Message + */ +ADI_API adi_common_ErrAction_e adi_common_ErrReport(const adi_common_Device_t* const commonDev, + const uint32_t errSource, + const adi_common_ErrAction_e action, + const int64_t errCode, + const uint32_t lineNum, + const char* funcName, + const uint32_t fileName, + const char* varName, + const int64_t varData, + const char* errMsg); + +/* + * \brief Service to Report Additional Error Messages + * + * \param[in] commonDev pointer to adi_common_Device_t + * \param[in] errCausePtr Error Cause Message + * \param[in] errActionMsgPtr Recovery Action Message + */ +ADI_API adi_common_ErrAction_e adi_common_ErrMsgReport( const adi_common_Device_t* const commonDev, + const char* errCausePtr, + const char* errActionMsgPtr); + +/* +* \brief Service to Write Error to Standard Output +* +* \param[in] errData pointer to adi_common_Device_t Error Data +* +*/ +ADI_API void adi_common_ErrStandardOutputWrite(const adi_common_ErrData_t* const errData); + +/* + * \brief Create Error Structure in Memory + * + * \retval adi_common_ErrData_t* Non NULL Pointer to Error Structure is created + */ +ADI_API adi_common_ErrData_t* adi_common_ErrCreate(void); + +/* + * \brief Assign Error Structure in Memory to Common Device Structure + * + * \param[in] commonDev pointer to adi_common_Device_t + * \param[in] errDataPtr pointer to adi_common_ErrData_t + * + * \retval adi_common_ErrAction_e - ADI_COMMON_ERR_ACT_NONE if successfully assigned + */ +ADI_API adi_common_ErrAction_e adi_common_ErrAssign(adi_common_Device_t* const commonDev, + adi_common_ErrData_t* const errDataPtr); + +/* + * \brief Service to Parse an Stack Trace Frame from the Error Structure + * + * \param[in] commonDev pointer to adi_common_Device_t + * \param[in] frameId Frame ID to Parse + * \param[out] errFrame pointer to adi_common_ErrFrame_t that will be populated + * + * \retval adi_common_ErrAction_e - ADI_COMMON_ERR_ACT_NONE if successfully parsed + */ +ADI_API adi_common_ErrAction_e adi_common_ErrFrameGet( const adi_common_Device_t* const commonDev, + const adi_common_ErrFrameId_e frameId, + adi_common_ErrFrame_t* const errFrame); + +/* + * \brief Service to Parse a Common Error from a Lookup Table + * + * \param[in] errCode Error Code to be Looked Up + * \param[out] errMsgPtr Related Error Message + * \param[out] action Related Recovery Action + * + * \retval adi_common_ErrAction_e - ADI_COMMON_ERR_ACT_NONE if successfully parsed + */ +ADI_API adi_common_ErrAction_e adi_common_ErrorGet( const int64_t errCode, + const char** const errMsgPtr, + adi_common_ErrAction_e* const action); + +/* + * \brief Service to Get Error Information for a given Common Error Source + * + * \param[in] commonDev pointer to adi_common_Device_t + * \param[in] errSrc Error Source to be Looked Up + * \param[in] errCode Error Code to be Looked Up + * \param[out] errMsgPtr Related Error Message + * \param[out] action Related Recovery Action + * + * \retval adi_common_ErrAction_e - ADI_COMMON_ERR_ACT_NONE if successfully parsed + */ +ADI_API adi_common_ErrAction_e adi_common_ErrInfoGet( const adi_common_ErrSources_e errSrc, + const int64_t errCode, + const char** const errMsgPtr, + adi_common_ErrAction_e* const errAction); + +/** + * \brief Destroy an Error Structure in Memory + * + * \param[in] errDataPtr Pointer to adi_common_ErrData_t + * + * \retval ADI_COMMON_ERR_ACT_NONE if Memory is successfully deallocated + */ +ADI_API adi_common_ErrAction_e adi_common_ErrDestroy(adi_common_ErrData_t* errDataPtr); + +/** + * \brief Clear Error Structure + * + * \param[in] errDataPtr Pointer to adi_common_ErrData_t + * + * \retval ADI_COMMON_ERR_ACT_NONE if Error Data is marked clear + */ +ADI_API adi_common_ErrAction_e adi_common_ErrClear(adi_common_ErrData_t* const errDataPtr); + +#endif /* _ADI_COMMON_ERROR_H_ */ diff --git a/drivers/rf-transceiver/koror/common/adi_error/adi_common_error_types.h b/drivers/rf-transceiver/koror/common/adi_error/adi_common_error_types.h new file mode 100644 index 00000000000..cc51b2ed83b --- /dev/null +++ b/drivers/rf-transceiver/koror/common/adi_error/adi_common_error_types.h @@ -0,0 +1,232 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_common_error_types.h +* \brief Contains common error data types for API Error messaging +* +* ADI common lib Version: 0.0.2.1 +*/ + +#ifndef _ADI_COMMON_ERROR_TYPES_H_ +#define _ADI_COMMON_ERROR_TYPES_H_ + +#include "adi_library.h" + +/* adi_common_ErrFrameId_e Defines Stack Trace Size because of how error frames can be accessed */ +#define ADI_COMMON_STACK_TRACE_SIZE ADI_COMMON_ERRFRAME_MAX + +/** +* \brief ADI Common Source Indexing +*/ +#define ADI_COMMON_ERRSRC_NONE_IDX 0U +#define ADI_COMMON_ERRSRC_API_IDX 1U +#define ADI_COMMON_ERRSRC_HAL_IDX 2U +#define ADI_COMMON_ERRSRC_DEVICEHAL_IDX 3U +#define ADI_COMMON_ERRSRC_DEVICEBF_IDX 4U +#define ADI_COMMON_ERRSRC_APP_IDX 5U + +#define ADI_COMMON_ERRSRC_RESERVED_IDX 99U + +/** +* \brief ADI Common Error Codes +*/ +#define ADI_COMMON_ERRCODE_NONE 0UL /* No Error */ +#define ADI_COMMON_ERRCODE_INVALID_PARAM 1UL /* Invalid Parameter */ +#define ADI_COMMON_ERRCODE_NULL_PTR 2UL /* Null Pointer */ +#define ADI_COMMON_ERRCODE_ARRAY_SIZE 4UL /* Array Size not correct */ +#define ADI_COMMON_ERRCODE_LOCK 5UL /* Lock Error */ +#define ADI_COMMON_ERRCODE_API 6UL /* API Call Error */ +#define ADI_COMMON_ERRCODE_FEATURE_NOT_IMPLEMENTED 7UL /* ADI Feature not implemented */ +#define ADI_COMMON_ERRCODE_TIMEOUT 8UL /* Timeout */ +#define ADI_COMMON_ERRCODE_BOOT_TIMEOUT 9UL /* Boot Timeout */ + +/** +* \brief ADI Common Sources +*/ +typedef enum adi_common_ErrSources +{ + ADI_COMMON_ERRSRC_NONE = ADI_COMMON_ERRSRC_NONE_IDX, /* No Error/Source */ + ADI_COMMON_ERRSRC_API = ADI_COMMON_ERRSRC_API_IDX, /* API Error */ + ADI_COMMON_ERRSRC_HAL = ADI_COMMON_ERRSRC_HAL_IDX, /* HAL Error */ + ADI_COMMON_ERRSRC_DEVICEHAL = ADI_COMMON_ERRSRC_DEVICEHAL_IDX, /* Device HAL Error */ + ADI_COMMON_ERRSRC_DEVICEBF = ADI_COMMON_ERRSRC_DEVICEBF_IDX, /* Device BF Error */ + ADI_COMMON_ERRSRC_APP = ADI_COMMON_ERRSRC_APP_IDX /* Application Error */ +} adi_common_ErrSources_e; + +/* +* \brief ADI Common Error Frame Indexing +*/ +typedef enum +{ + ADI_COMMON_ERRFRAME_IDX_0 = 0U, /* Error Frame Index 0 */ + ADI_COMMON_ERRFRAME_IDX_1 = 1U, /* Error Frame Index 1 */ + ADI_COMMON_ERRFRAME_IDX_2 = 2U, /* Error Frame Index 2 */ + ADI_COMMON_ERRFRAME_IDX_3 = 3U, /* Error Frame Index 3 */ + ADI_COMMON_ERRFRAME_IDX_4 = 4U, /* Error Frame Index 4 */ + ADI_COMMON_ERRFRAME_IDX_5 = 5U, /* Error Frame Index 5 */ + ADI_COMMON_ERRFRAME_IDX_6 = 6U, /* Error Frame Index 6 */ + ADI_COMMON_ERRFRAME_IDX_7 = 7U, /* Error Frame Index 7 */ + ADI_COMMON_ERRFRAME_IDX_8 = 8U, /* Error Frame Index 8 */ + ADI_COMMON_ERRFRAME_IDX_9 = 9U, /* Error Frame Index 9 */ + ADI_COMMON_ERRFRAME_EVENT = ADI_COMMON_ERRFRAME_IDX_0, /* Start of Array; Fixed */ + ADI_COMMON_ERRFRAME_END = ADI_COMMON_ERRFRAME_IDX_9, /* End of Array; Fixed */ + ADI_COMMON_ERRFRAME_MAX, /* Stack Trace Size */ + ADI_COMMON_ERRFRAME_API = ADI_COMMON_ERRFRAME_MAX /* Last Entry to Stack Trace; Variable */ +} adi_common_ErrFrameId_e; + +/* +* \brief ADI COMMON Recovery Actions +*/ +typedef enum +{ + ADI_COMMON_ERR_ACT_RESET_DEVICE = -500, /* Device NOK: HW/SW Reset Required */ + + /* All Reset Feature Unique Codes exist between -500 & -400 */ + ADI_COMMON_ERR_ACT_RESET_FEATURE = -400, /* API NOK: Feature Reset Required */ + + /* All Reset Interface Unique Codes exist between -400 & -300 */ + ADI_COMMON_ERR_ACT_RESET_INTERFACE = -300, /* API NOK: Interface Reset Required */ + + /* All Check Feature Unique Codes exist between -300 & -200 */ + ADI_COMMON_ERR_ACT_CHECK_FEATURE = -200, /* API OK; Feature is reporting an Error */ + + /* All Check Interface Unique Codes exist between -200 & -100 */ + ADI_COMMON_ERR_ACT_CHECK_INTERFACE = -100, /* API OK; Interface is reporting an Error */ + + /* All Development Unique Codes exist between -100 & -1 */ + ADI_COMMON_ERR_ACT_OPEN_DEVICE = -10, /* API OK; Device Not Open */ + ADI_COMMON_ERR_ACT_CHECK_PARAM = -1, /* API OK; Invalid Parameter passed to function */ + + /* No Error/Recovery Action */ + ADI_COMMON_ERR_ACT_NONE = 0 /* API OK; No Action Required */ +} adi_common_ErrAction_e; + +/* +* \brief ADI Common Error Action Union +*/ +typedef union +{ + adi_common_ErrAction_e commonAction; /* Common Error Action Type */ + int64_t rawValue; /* Raw Value */ +} adi_common_ErrAction_t; + +/* +* \brief ADI Error Event Information +*/ +typedef struct +{ + int64_t errCode; /* Error Code */ + const char* errMsg; /* Error Message */ + uint32_t errSrc; /* Error Source */ +} adi_common_ErrCodeInfo_t; + +/* +* \brief ADI Error File Information +*/ +typedef struct +{ + uint32_t line; /* Source File Line Number; Set via __LINE__ Std Macro */ + const char* function; /* Source File Function Name; Set via __func__ Std Macro */ + uint32_t file; /* Source File Name ID; Set via ADI_FILE */ +} adi_common_ErrFileInfo_t; + +/* +* \brief ADI Error Variable Information +*/ +typedef struct +{ + const char* varName; /* Variable Name */ + int64_t varData; /* Variable Data */ +} adi_common_ErrVarInfo_t; + +/* +* \brief ADI Common Error Frame Structure +*/ +typedef struct +{ + adi_common_ErrAction_e action; /* Recovery Action */ + adi_common_ErrCodeInfo_t errInfo; /* Error Event Information */ + adi_common_ErrFileInfo_t fileInfo; /* File Information */ + adi_common_ErrVarInfo_t varInfo; /* Variable Information */ +} adi_common_ErrFrame_t; + +/* +* \brief ADI Common Debug Information +*/ +typedef struct +{ + adi_common_ErrAction_e highestPriorityAction; /* Highest Priority Recovery Action Captured */ + const char* errCause; /* Error Cause Message */ + const char* actionMsg; /* Recovery Action Message */ +} adi_common_ErrDebugInfo_t; + +/* +* \brief ADI Common Error Device Information +*/ +typedef struct +{ + uint32_t type; /* Device Type */ + uint32_t id; /* Device Number */ + const char* name; /* Device Name */ +} adi_common_ErrDeviceInfo_t; + +/* +* \brief ADI Common Error Data Information +*/ +typedef struct +{ + adi_common_ErrDeviceInfo_t errDeviceInfo; /* Error Device Info */ + uint32_t stackIdx; /* Internal Array Indexing */ +} adi_common_ErrDataInfo_t; + +/* +* \brief ADI Common Error Data Structure +*/ +typedef struct +{ + adi_common_ErrDataInfo_t errDataInfo; /* Additional Error Data Information */ + adi_common_ErrFrame_t stackTrace[ADI_COMMON_STACK_TRACE_SIZE]; /* Stack Trace from API from when Error Detected */ + adi_common_ErrDebugInfo_t errDebugInfo; /* Additional Debug Information */ +} adi_common_ErrData_t; + +/* +* \brief ADI Common Error Table Row +*/ +typedef struct +{ + const int64_t errCode; + const char* const errMsg; + const adi_common_ErrAction_e action; +} adi_common_ErrTableRow_t; + +/* +* \brief ADI Common Device Specific Error Table Row +*/ +typedef struct +{ + const int64_t errCode; + const char* const errMsg; + const char* const errCause; + const adi_common_ErrAction_e actionCode; + const char* const actionMsg; +} adi_common_DeviceErrTableRow_t; + +/* +* \brief ADI Common Error Information +*/ +typedef struct +{ + int64_t errCode; + const char* errMsg; + const char* errCause; + adi_common_ErrAction_e actionCode; + const char* actionMsg; +} adi_common_ErrorInfo_t; + +typedef adi_common_ErrTableRow_t adi_common_api_errors_t; +#endif /* _ADI_COMMON_ERROR_TYPES_H_ */ + diff --git a/drivers/rf-transceiver/koror/common/adi_hal/adi_common_hal.c b/drivers/rf-transceiver/koror/common/adi_hal/adi_common_hal.c new file mode 100644 index 00000000000..282621b98b1 --- /dev/null +++ b/drivers/rf-transceiver/koror/common/adi_hal/adi_common_hal.c @@ -0,0 +1,579 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_common_hal.c +* \brief Contains ADI Transceiver Hardware Abstraction functions +* Analog Devices maintains and provides updates to this code layer. +* The end user should not modify this file or any code in this directory. +* +* ADI common lib Version: 0.0.2.1 +*/ + +#include "adi_common_hal.h" +#include "adi_common_error.h" +#include "adi_platform.h" + +#define ADI_FILE ADI_COMMON_FILE_HAL + +ADI_API adi_common_ErrAction_e adi_common_hal_ErrCodeConvert(const adi_hal_Err_e halCode) +{ + adi_common_ErrAction_e action = ADI_COMMON_ERR_ACT_RESET_DEVICE; + + switch (halCode) + { + case ADI_HAL_ERR_OK: + action = ADI_COMMON_ERR_ACT_NONE; + break; + + case ADI_HAL_ERR_I2C: + case ADI_HAL_ERR_I2C_WRITE: + case ADI_HAL_ERR_I2C_READ: + case ADI_HAL_ERR_SPI: + case ADI_HAL_ERR_SPI_WRITE: + case ADI_HAL_ERR_SPI_READ: + case ADI_HAL_ERR_GPIO: + /* Fall Through */ + action = ADI_COMMON_ERR_ACT_CHECK_INTERFACE; + break; + + case ADI_HAL_ERR_SPI_CS: + action = ADI_COMMON_ERR_ACT_RESET_INTERFACE; + break; + + case ADI_HAL_ERR_BBICCTRL: + case ADI_HAL_ERR_BBICCTRL_CORE: + case ADI_HAL_ERR_BBICCTRL_RAM: + case ADI_HAL_ERR_BBICCTRL_SPI: + action = ADI_COMMON_ERR_ACT_RESET_FEATURE; + break; + + case ADI_HAL_ERR_PARAM: + case ADI_HAL_ERR_NULL_PTR: + /* Fall Through */ + action = ADI_COMMON_ERR_ACT_CHECK_PARAM; + break; + + case ADI_HAL_ERR_TIMER: + case ADI_HAL_ERR_NOT_IMPLEMENTED: + case ADI_HAL_ERR_LOG: + case ADI_HAL_ERR_MEMORY: + case ADI_HAL_ERR_LIBRARY: + case ADI_HAL_ERR_EEPROM_DATA: + /* Fall Through */ + + default: + /* Operating System Error Code */ + action = ADI_COMMON_ERR_ACT_CHECK_FEATURE; + break; + } + + return action; +} + +ADI_API adi_common_ErrAction_e adi_common_hal_HwOpen(adi_common_Device_t* const commonDev) +{ + adi_common_ErrAction_e recoveryAction = ADI_COMMON_ERR_ACT_CHECK_PARAM; + adi_hal_Err_e halError = ADI_HAL_ERR_PARAM; + + ADI_NULL_PTR_RETURN(commonDev); + + halError = adi_hal_MutexInit(&commonDev->mutex); + if (ADI_HAL_ERR_OK != halError) + { + recoveryAction = adi_common_hal_ErrCodeConvert(halError); + ADI_ERROR_REPORT( commonDev, + ADI_COMMON_ERRSRC_HAL, + ADI_COMMON_ERRCODE_API, + recoveryAction, + halError, + "Device Mutex Cannot Be Initialized"); + return recoveryAction; + } + + halError = adi_hal_HwOpen(commonDev->devHalInfo); + if (ADI_HAL_ERR_OK == halError) + { + recoveryAction = ADI_COMMON_ERR_ACT_NONE; + } + else + { + recoveryAction = adi_common_hal_ErrCodeConvert(halError); + ADI_ERROR_REPORT( commonDev, + ADI_COMMON_ERRSRC_HAL, + ADI_COMMON_ERRCODE_API, + recoveryAction, + halError, + "HAL Hardware Open Failed"); + } + + return recoveryAction; +} + +ADI_API adi_common_ErrAction_e adi_common_hal_HwClose(adi_common_Device_t* const commonDev) +{ + adi_common_ErrAction_e recoveryAction = ADI_COMMON_ERR_ACT_CHECK_PARAM; + adi_hal_Err_e halError = ADI_HAL_ERR_PARAM; + + ADI_NULL_COMMON_PTR_RETURN(commonDev); + + halError = adi_hal_HwClose(commonDev->devHalInfo); + if (ADI_HAL_ERR_OK != halError) + { + recoveryAction = adi_common_hal_ErrCodeConvert(halError); + ADI_ERROR_REPORT( commonDev, + ADI_COMMON_ERRSRC_HAL, + ADI_COMMON_ERRCODE_API, + recoveryAction, + halError, + "HAL Hardware Close Failed"); + return recoveryAction; + } + + halError = adi_hal_MutexDestroy(&commonDev->mutex); + if (ADI_HAL_ERR_OK == halError) + { + recoveryAction = ADI_COMMON_ERR_ACT_NONE; + } + else + { + recoveryAction = adi_common_hal_ErrCodeConvert(halError); + ADI_PARAM_ERROR_REPORT(commonDev, recoveryAction, &commonDev->publicCnt, "Public Count"); + ADI_PARAM_ERROR_REPORT(commonDev, recoveryAction, &commonDev->lockCnt, "Lock Count"); + ADI_ERROR_REPORT( commonDev, + ADI_COMMON_ERRSRC_HAL, + ADI_COMMON_ERRCODE_API, + recoveryAction, + halError, + "Device Mutex Cannot Be Destroyed"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_common_ErrAction_e adi_common_hal_HwReset(const adi_common_Device_t* const commonDev, const uint8_t pinLevel) +{ + adi_common_ErrAction_e recoveryAction = ADI_COMMON_ERR_ACT_CHECK_PARAM; + adi_hal_Err_e halError = ADI_HAL_ERR_PARAM; + + ADI_NULL_COMMON_PTR_RETURN(commonDev); + + halError = adi_hal_HwReset(commonDev->devHalInfo, pinLevel); + + if (ADI_HAL_ERR_OK == halError) + { + recoveryAction = ADI_COMMON_ERR_ACT_NONE; + } + else + { + recoveryAction = adi_common_hal_ErrCodeConvert(halError); + ADI_ERROR_REPORT( commonDev, + ADI_COMMON_ERRSRC_HAL, + ADI_COMMON_ERRCODE_API, + recoveryAction, + pinLevel, + "HAL HwReset Level Set Issue"); + } + + return recoveryAction; +} + +ADI_API adi_common_ErrAction_e adi_common_hal_Wait_us(const adi_common_Device_t* const commonDev, const uint32_t time_us) +{ + adi_common_ErrAction_e recoveryAction = ADI_COMMON_ERR_ACT_CHECK_PARAM; + adi_hal_Err_e halError = ADI_HAL_ERR_PARAM; + + ADI_NULL_COMMON_PTR_RETURN(commonDev); + + halError = adi_hal_Wait_us(commonDev->devHalInfo, time_us); + + if (ADI_HAL_ERR_OK == halError) + { + recoveryAction = ADI_COMMON_ERR_ACT_NONE; + } + else + { + recoveryAction = adi_common_hal_ErrCodeConvert(halError); + ADI_ERROR_REPORT( commonDev, + ADI_COMMON_ERRSRC_HAL, + ADI_COMMON_ERRCODE_API, + recoveryAction, + halError, + "HAL Wait(us) Failed"); + } + + return recoveryAction; +} + +ADI_API adi_common_ErrAction_e adi_common_hal_Wait_ms(const adi_common_Device_t* const commonDev, const uint32_t time_ms) +{ + adi_common_ErrAction_e recoveryAction = ADI_COMMON_ERR_ACT_CHECK_PARAM; + adi_hal_Err_e halError = ADI_HAL_ERR_PARAM; + + ADI_NULL_COMMON_PTR_RETURN(commonDev); + + halError = adi_hal_Wait_us(commonDev->devHalInfo, (time_ms * 1000)); + + if (ADI_HAL_ERR_OK == halError) + { + recoveryAction = ADI_COMMON_ERR_ACT_NONE; + } + else + { + recoveryAction = adi_common_hal_ErrCodeConvert(halError); + ADI_ERROR_REPORT( commonDev, + ADI_COMMON_ERRSRC_HAL, + ADI_COMMON_ERRCODE_API, + recoveryAction, + halError, + "HAL Wait(ms) Failed"); + } + + return recoveryAction; +} + +ADI_API adi_common_ErrAction_e adi_common_hal_Lock(adi_common_Device_t* const commonDev) +{ + adi_common_ErrAction_e recoveryAction = ADI_COMMON_ERR_ACT_CHECK_PARAM; + adi_hal_Err_e halError = ADI_HAL_ERR_PARAM; + + /* Use NULL_DEVICE as NULL_COMMON_PTR also checks common->errPtr which is not set yet */ + ADI_NULL_DEVICE_PTR_RETURN(commonDev); + + halError = adi_hal_MutexLock(&commonDev->mutex); + if (ADI_HAL_ERR_OK == halError) + { + recoveryAction = ADI_COMMON_ERR_ACT_NONE; + } + else + { + recoveryAction = adi_common_hal_ErrCodeConvert(halError); + ADI_ERROR_REPORT( commonDev, + ADI_COMMON_ERRSRC_HAL, + ADI_COMMON_ERRCODE_LOCK, + recoveryAction, + halError, + "HAL Mutex Lock Failed"); + } + + ++commonDev->lockCnt; + if (commonDev->lockCnt == 0U) + { + recoveryAction = ADI_COMMON_ERR_ACT_RESET_DEVICE; + /* Range of lockCnt type exceeded. Do not check unlock return */ + (void) adi_hal_MutexUnlock(&commonDev->mutex); + ADI_ERROR_REPORT( commonDev, + ADI_COMMON_ERRSRC_HAL, + ADI_COMMON_ERRCODE_LOCK, + recoveryAction, + ADI_NO_VARIABLE, + "Lock Count Overflow"); + } + + return recoveryAction; +} + +ADI_API adi_common_ErrAction_e adi_common_hal_Unlock(adi_common_Device_t* const commonDev) +{ + adi_common_ErrAction_e recoveryAction = ADI_COMMON_ERR_ACT_CHECK_PARAM; + adi_hal_Err_e halError = ADI_HAL_ERR_PARAM; + + ADI_NULL_COMMON_PTR_RETURN(commonDev); + + if (commonDev->lockCnt == 0U) + { + recoveryAction = ADI_COMMON_ERR_ACT_RESET_DEVICE; + ADI_ERROR_REPORT( commonDev, + ADI_COMMON_ERRSRC_API, + ADI_COMMON_ERRCODE_LOCK, + recoveryAction, + commonDev->lockCnt, + "Lock Never Used"); + return recoveryAction; + } + --commonDev->lockCnt; + + halError = adi_hal_MutexUnlock(&commonDev->mutex); + if (ADI_HAL_ERR_OK == halError) + { + recoveryAction = ADI_COMMON_ERR_ACT_NONE; + } + else + { + ++commonDev->lockCnt; + recoveryAction = adi_common_hal_ErrCodeConvert(halError); + ADI_ERROR_REPORT( commonDev, + ADI_COMMON_ERRSRC_API, + ADI_COMMON_ERRCODE_LOCK, + recoveryAction, + halError, + "Unlock Failed"); + } + + return recoveryAction; +} + +ADI_API adi_common_ErrAction_e adi_common_hal_ApiEnter_vLogCtl(adi_common_Device_t* const commonDev, + const char* const fnName, + const uint32_t doLocking, + const adi_common_LogCtl_e logCtl) +{ + adi_common_ErrAction_e recoveryAction = ADI_COMMON_ERR_ACT_CHECK_PARAM; + + /* Device Not Locked & Error Pointer is Not Set in Common Device Structure */ + + ADI_NULL_DEVICE_PTR_RETURN(commonDev); + + ADI_NULL_PTR_REPORT_RETURN(commonDev, fnName); + + switch (doLocking) + { + case ADI_TRUE: + /* Initialized Device Mutex Required for Locking */ + if (ADI_FALSE == ADI_COMMON_DEVICE_STATE_IS_OPEN(*commonDev)) + { + recoveryAction = ADI_COMMON_ERR_ACT_OPEN_DEVICE; + + if ( NULL != adi_hal_TlsGet(HAL_TLS_ERR)) + { + /* Bypass Common Device Structure for Error Reporting if TLS has Error Pointer */ + adi_common_Device_t dummyDev; + + ADI_LIBRARY_MEMSET(&dummyDev, 0, sizeof(adi_common_Device_t)); + + dummyDev.errPtr = (adi_common_ErrData_t*) adi_hal_TlsGet(HAL_TLS_ERR); + + ADI_ERROR_REPORT( &dummyDev, + ADI_COMMON_ERRSRC_API, + ADI_COMMON_ERRCODE_INVALID_PARAM, + recoveryAction, + ADI_COMMON_DEVICE_STATE_IS_OPEN(*commonDev), + "Device Requires HwOpen"); + } + + return recoveryAction; + } + + /* Lock Device */ + recoveryAction = adi_common_hal_Lock(commonDev); + break; + + case ADI_FALSE: + /* Fall Through */ + + default: + /* No Locking Required */ + recoveryAction = ADI_COMMON_ERR_ACT_NONE; + break; + } + + if (ADI_COMMON_ERR_ACT_NONE != recoveryAction) + { + /* Device Locking Failed */ + if (NULL != adi_hal_TlsGet(HAL_TLS_ERR)) + { + /* Bypass Common Device Structure for Error Reporting if TLS has Error Pointer */ + adi_common_Device_t dummyDev; + + ADI_LIBRARY_MEMSET(&dummyDev, 0, sizeof(adi_common_Device_t)); + + dummyDev.errPtr = (adi_common_ErrData_t*) adi_hal_TlsGet(HAL_TLS_ERR); + + ADI_ERROR_REPORT( &dummyDev, + ADI_COMMON_ERRSRC_API, + ADI_COMMON_ERRCODE_LOCK, + recoveryAction, + commonDev->lockCnt, /* Snapshot of Locking History */ + "Device Locking Issue"); + } + + return recoveryAction; + } + + /* Device is now locked or else locking was not requested. */ + ++commonDev->publicCnt; + + /* Log API entry */ + if (commonDev->publicCnt > 1U && logCtl == ADI_COMMON_DEVICE_LOGCTL_QUIET) + { + /* Recursive public function entry detected; Change from Public to Private Logging Level */ + if (ADI_FALSE == ADI_COMMON_DEVICE_STATE_IS_TC(*commonDev)) + { + /* Time Critical Mode Off - All adi_common_LogWrite(), bar error logging, are gated by this check to avoid unnecessary adi_hal_LogWrite() calls */ + adi_common_LogWrite(commonDev, ADI_HAL_LOG_API_PRIV, "-> %s()", fnName); + } + } + else + { + /* Normal case - just log the entry at Public API level */ + if (ADI_FALSE == ADI_COMMON_DEVICE_STATE_IS_TC(*commonDev)) + { + /* Time Critical Mode Off - All adi_common_LogWrite(), bar error logging, are gated by this check to avoid unnecessary adi_hal_LogWrite() calls */ + adi_common_LogWrite(commonDev, ADI_HAL_LOG_API, "-> %s()", fnName); + } + } + + if (NULL != adi_hal_TlsGet(HAL_TLS_ERR)) + { + /* Assume using TLS for Error Reporting */ + commonDev->errPtr = (adi_common_ErrData_t*) adi_hal_TlsGet(HAL_TLS_ERR); + } + else + { + /* Do Nothing; Assuming Application is Managing Device Error Structure(s) Directly. + * If Multi Threaded, Application is required to provide its own Mutual Exclusion Mechanism for the Error Structure. + */ + } + + /* Assume Error Structure Pointer Assigned to Current Device at this Point (i.e. using TLS or Externally Managed) */ + + if (commonDev->publicCnt == 1U) + { + /* Clear Error Memory on First Entry into Public API Only + * - This is to allow further error reporting from subsequent Public API calls during an Error State + */ + (void) ADI_CLEAR_ERROR_MEMORY(commonDev->errPtr); + } + + /* Assume Error Memory has been cleared at this point */ + + return recoveryAction; +} + +ADI_API adi_common_ErrAction_e adi_common_hal_ApiExit_vLogCtl(adi_common_Device_t* const commonDev, + const char* const fnName, + const uint32_t doLocking, + const adi_common_LogCtl_e logCtl) + +{ + adi_common_ErrAction_e recoveryAction = ADI_COMMON_ERR_ACT_CHECK_PARAM; + + ADI_NULL_COMMON_PTR_RETURN(commonDev); + + ADI_NULL_PTR_REPORT_RETURN(commonDev, fnName); + + /* Log API exit */ + if (commonDev->publicCnt > 1U && logCtl == ADI_COMMON_DEVICE_LOGCTL_QUIET) + { + /* Recursive public function exit detected; Change from Public to Private Logging Level */ + if (ADI_FALSE == ADI_COMMON_DEVICE_STATE_IS_TC(*commonDev)) + { + /* Time Critical Mode Off - All adi_common_LogWrite(), bar error logging, are gated by this check to avoid unnecessary adi_hal_LogWrite() calls */ + adi_common_LogWrite(commonDev, ADI_HAL_LOG_API_PRIV, "<- %s()", fnName); + } + } + else + { + /* Normal case - just log the exit at Public API level */ + if (ADI_FALSE == ADI_COMMON_DEVICE_STATE_IS_TC(*commonDev)) + { + /* Time Critical Mode Off - All adi_common_LogWrite(), bar error logging, are gated by this check to avoid unnecessary adi_hal_LogWrite() calls */ + adi_common_LogWrite(commonDev, ADI_HAL_LOG_API, "<- %s()", fnName); + } + } + + if (commonDev->publicCnt == 0U) + { + ADI_ERROR_REPORT( commonDev, + ADI_COMMON_ERRSRC_API, + ADI_COMMON_ERRCODE_LOCK, + recoveryAction, + commonDev->publicCnt, + "Check API Device Locking Mechanism"); + return recoveryAction; + } + + --commonDev->publicCnt; + + switch (doLocking) + { + case ADI_TRUE: + /* Unlock Device */ + recoveryAction = adi_common_hal_Unlock(commonDev); + if (ADI_COMMON_ERR_ACT_NONE != recoveryAction) + { + /* Device Locked Up */ + recoveryAction = ADI_COMMON_ERR_ACT_RESET_DEVICE; + } + break; + + case ADI_FALSE: + /* Fall Through */ + + default: + /* No Unlocking Required */ + recoveryAction = ADI_COMMON_ERR_ACT_NONE; + break; + } + + if (ADI_COMMON_ERR_ACT_NONE != recoveryAction) + { + ADI_ERROR_REPORT( commonDev, + ADI_COMMON_ERRSRC_API, + ADI_COMMON_ERRCODE_LOCK, + recoveryAction, + ADI_NO_VARIABLE, + "Device Unlocking Issue"); + return recoveryAction; + } + + /* Assume Device Unlocked at this Point */ + + return recoveryAction; +} + + +ADI_API adi_common_ErrAction_e adi_common_hal_ApiEnter( adi_common_Device_t* const commonDev, + const char* const fnName, + const uint32_t doLocking) +{ + return adi_common_hal_ApiEnter_vLogCtl(commonDev, fnName, doLocking, ADI_COMMON_DEVICE_LOGCTL_NORMAL); +} + +ADI_API adi_common_ErrAction_e adi_common_hal_ApiExit( adi_common_Device_t* const commonDev, + const char* const fnName, + const uint32_t doLocking) +{ + return adi_common_hal_ApiExit_vLogCtl(commonDev, fnName, doLocking, ADI_COMMON_DEVICE_LOGCTL_NORMAL); +} + +ADI_API adi_common_ErrAction_e adi_common_hal_PlatformFunctionCheck(adi_common_Device_t* const commonDev) +{ + adi_common_ErrAction_e recoveryAction = ADI_COMMON_ERR_ACT_NONE; + + ADI_NULL_COMMON_PTR_RETURN(commonDev); + + if ((adi_hal_HwOpen == NULL) || + (adi_hal_HwClose == NULL) || + (adi_hal_HwReset == NULL) || + (adi_hal_SpiWrite == NULL) || + (adi_hal_SpiRead == NULL) || + (adi_hal_LogFileOpen == NULL) || + (adi_hal_LogLevelSet == NULL) || + (adi_hal_LogLevelGet == NULL) || + (adi_hal_LogWrite == NULL) || + (adi_hal_Wait_us == NULL) || + (adi_hal_Wait_ms == NULL) || + (adi_hal_MutexInit == NULL) || + (adi_hal_MutexLock == NULL) || + (adi_hal_MutexUnlock == NULL) || + (adi_hal_MutexDestroy == NULL) || + (adi_hal_TlsSet == NULL) || + (adi_hal_TlsGet == NULL)) + { + recoveryAction = adi_common_hal_ErrCodeConvert(ADI_HAL_ERR_NOT_IMPLEMENTED); + ADI_ERROR_REPORT( commonDev, + ADI_COMMON_ERRSRC_HAL, + ADI_HAL_ERR_NOT_IMPLEMENTED, + recoveryAction, + ADI_NO_VARIABLE, + "All HAL Function Pointers Not Configured"); + return recoveryAction; + } + + return recoveryAction; +} diff --git a/drivers/rf-transceiver/koror/common/adi_hal/adi_common_hal.h b/drivers/rf-transceiver/koror/common/adi_hal/adi_common_hal.h new file mode 100644 index 00000000000..27b47f57a18 --- /dev/null +++ b/drivers/rf-transceiver/koror/common/adi_hal/adi_common_hal.h @@ -0,0 +1,330 @@ +/** + * Copyright 2015 - 2021 Analog Devices Inc. + * Released under the API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adi_common_hal.h + * \brief Contains ADI Hardware Abstraction layer function prototypes and type definitions for adi_common_hal.c + * + * ADI common lib Version: 0.0.2.1 + */ + +#ifndef _ADI_COMMON_HAL_H_ +#define _ADI_COMMON_HAL_H_ + +#include "adi_common_types.h" +#include "adi_common_macros.h" +#include "adi_common_user.h" +#include "adi_common_error.h" +#include "adi_common_log.h" + +/** + * /brief Convenience macro for public API functions to call adi_common_hal_ApiEnter + */ +#define ADI_API_ENTER_RTN(commonDev) \ +{ \ + adi_common_ErrAction_e _recoveryAction = adi_common_hal_ApiEnter((commonDev), __func__, ADI_TRUE); \ + \ + if(ADI_COMMON_ERR_ACT_NONE != _recoveryAction) \ + { \ + ADI_API_ERROR_REPORT(&device->common, _recoveryAction, "API Enter Issue"); \ + return _recoveryAction; \ + } \ +} + +/** + * /brief Convenience macro for public API functions to call adi_common_hal_ApiEnter + * and return. Always causes a return from the calling function. + * + * If the supplied recovery action indicates an error then any failure in ApiExit is ignored. + * The recovery action from ApiExit is only used as the function's recovery action if the + * supplied recovery action indicates no error. + * + * \param commonDev Pointer to the common structure of type adi_common_Device_t + * + * \retval adi_common_ErrAction_e - ADI_COMMON_ERR_ACT_NONE if Successful + */ +#define ADI_API_EXIT(commonDev, recoveryAction) \ +{ \ + adi_common_ErrAction_e _recoveryAction = adi_common_hal_ApiExit((commonDev), __func__, ADI_TRUE); \ + \ + if (ADI_COMMON_ERR_ACT_NONE != _recoveryAction) \ + { \ + ADI_API_ERROR_REPORT(&device->common, _recoveryAction, "API Exit Issue"); \ + } \ + \ + if(ADI_COMMON_ERR_ACT_NONE != recoveryAction) \ + { \ + return recoveryAction; \ + } \ + return _recoveryAction; \ +} + + +/** +* \brief Service to Convert HAL Error Code to Recovery Action +* +* \param[in] halCode Hal Error Code to be converted +* +* \retval adi_common_ErrAction_e - ADI_COMMON_ERR_ACT_NONE if Successful +*/ +ADI_API adi_common_ErrAction_e adi_common_hal_ErrCodeConvert(const adi_hal_Err_e halCode); + +/** + * \brief Used to initialise the HAL hardware. + * + * This function must be called before any of the other adi_common_ functions are + * called for the same \param commonDevice. This function must be called only + * once for each value of \param commonDevice. + * + * Applications do not need to call this function directly as it is called by a + * device-specific HwOpen call. + * + * Each ADI device contains a adi_common_Device_t. The device_specific HwOpen + * function must be the first function to be called for any device. One of the + * tasks carried out by the device-specific HwOpen is to call this function + * to prepare the common-device layer part of the device. + * + * Unlike the other common device functions HwOpen and HwClose are not thread-safe. + * This is because it is during these functions that the thread-safety mechanisms + * relied on by the other functions are initialized and finalized. Therefore + * the mechanisms are not available for use within HwOpen/Close to enforce + * serialization. As device-specific HwOpen/Close functions use the common + * HwOpen/Close the same restriction applies to the device-specific HwOpen/Close + * functions. Applications therefore are responsible to ensure that there is no + * contention between threads for device access when HwOpen/Close is called. For + * instance an application could carry out all HwOpens in a single thread and + * ensure all worker threads have stopped (or at least stopped using the API) + * before calling HwClose on all devices from a single thread. + * + * \dep_begin + * \dep{device->common} + * \dep_end + * + * \param[in] commonDev Pointer to the common structure of type adi_common_Device_t + * + * \retval adi_common_ErrAction_e - ADI_COMMON_ERR_ACT_NONE if Successful + */ +ADI_API adi_common_ErrAction_e adi_common_hal_HwOpen(adi_common_Device_t* const commonDev); + +/** +* \brief Used to close the HAL hardware. +* +* Must be called when the \param commonDev is no longer required so that any resources in +* the common device layer can be released. Must only be called on a common device +* that has been previously opened. Once closed no other functions may be called +* on a common device and it cannot be re-opened. +* +* Each ADI device contains a adi_common_Device_t. The device_specific HwClose +* function must be the last function to be called for any device. One of the +* tasks carried out by the device-specific HwClose is to call this function +* to release the common-device layer part of the device. +* +* Applications do not need to call this function directly as it is called by a +* device-specific HwClose call. +* +* Applications must ensure that all threads have finished with the device before calling +* the device-specific HwClose. See HwOpen for further thread-safety considerations. +* +* +* \pre The device must have been previously opened using adi_common_hal_HwOpen. +* +* \dep_begin +* \dep{device->common} +* \dep_end +* +* \param[in] commonDev Pointer to the common structure of type adi_common_Device_t +* +* \retval adi_common_ErrAction_e - ADI_COMMON_ERR_ACT_NONE if Successful +*/ +ADI_API adi_common_ErrAction_e adi_common_hal_HwClose(adi_common_Device_t* const commonDev); + +/** +* \brief Service to control HwReset Signal via a Logic Level +* +* Caller is responsible for handling triggering (i.e. Level or Edge) +* +* \pre The device must have been previously opened using adi_common_hal_HwOpen. +* +* \dep_begin +* \dep{device->common} +* \dep_end +* +* \param[in] commonDev Pointer to the common structure of type adi_common_Device_t +* \param[in] pinLevel Pin level = 1 will hold the reset line high, 0 will hold the reset line low +* +* \retval adi_common_ErrAction_e - ADI_COMMON_ERR_ACT_NONE if Successful +*/ +ADI_API adi_common_ErrAction_e adi_common_hal_HwReset( const adi_common_Device_t* const commonDev, + const uint8_t pinLevel); + +/** +* \brief Used to sleep for a given number of microSeconds. +* +* \dep_begin +* \dep{device->common} +* \dep_end +* +* \param[in] commonDev Pointer to the common structure of type adi_common_Device_t +* \param[in] time_us The number of micro seconds to sleep +* +* \retval adi_common_ErrAction_e - ADI_COMMON_ERR_ACT_NONE if Successful +*/ +ADI_API adi_common_ErrAction_e adi_common_hal_Wait_us( const adi_common_Device_t* const commonDev, + const uint32_t time_us); + +/** +* \brief Used to sleep for a given number of milliSeconds. +* +* +* \dep_begin +* \dep{device->common} +* \dep_end +* +* \param commonDev Pointer to the common structure of type adi_common_Device_t +* \param time_ms The number of milli seconds to sleep. +* +* \retval adi_common_ErrAction_e - ADI_COMMON_ERR_ACT_NONE if Successful +*/ +ADI_API adi_common_ErrAction_e adi_common_hal_Wait_ms( const adi_common_Device_t* const commonDev, + const uint32_t time_ms); + +/** +* \brief Acquires the device so that it can only be used only in the context of the calling +* thread until such time as adi_common_hal_Unlock is called on the device. +* +* Blocks until the device is acquired. There is no timeout mechanism in the API although +* the underlying HAL may choose to timeout and return an error. +* +* Attempting to explicitly acquire a device that has already been acquired by the calling thread +* results in undefined behaviour. +* +* +* \dep_begin +* \dep{device->common} +* \dep_end +* +* \param commonDev Pointer to the common structure of type adi_common_Device_t +* +* \retval adi_common_ErrAction_e - ADI_COMMON_ERR_ACT_NONE if Successful +*/ +ADI_API adi_common_ErrAction_e adi_common_hal_Lock(adi_common_Device_t* const commonDev); + +/** +* \brief Releases a device previously acquired by the calling thread. +* +* Only the thread that acquired the device can release the device. Attempting to release a device +* that has not been acquired by the calling thread results in undefined behaviour. +* +* Similar to public API calls on ADI devices the return value is a +* Recovery Action and is also written to commonDev->error.newAction. +* +* \dep_begin +* \dep{device->common} +* \dep_end +* +* \param commonDev Pointer to the common structure of type adi_common_Device_t +* +* \retval adi_common_ErrAction_e - ADI_COMMON_ERR_ACT_NONE if Successful +*/ +ADI_API adi_common_ErrAction_e adi_common_hal_Unlock(adi_common_Device_t* const commonDev); + +/** + * /brief A convenience function that performs the tasks that must be preformed at the start + * of every public API function call. + * + * - Log the API call + * - Lock the device + * - Assign the TLS err struct to the device for the duration of the call + * - Reset the err struct + * - Check device has been opened + * + * Should only be called from a device's public API functions. + * + * \param commonDev Pointer to the common structure of type adi_common_Device_t + * \param fnName The name of the calling function + * \param doLocking If set to ADI_TRUE acquire the device lock otherwise do not. + * + * /post On successful completion the device is locked, the calling thread's error struct has been + * assigned as the device's error struct and the struct has been set to indicate no error. + * Otherwise the correct error structure has been assigned and has been set to indicate the error + * that occurred. + * The device is only locked on a successful return. + * + * \retval adi_common_ErrAction_e - ADI_COMMON_ERR_ACT_NONE if Successful + */ +ADI_API adi_common_ErrAction_e adi_common_hal_ApiEnter( adi_common_Device_t* const commonDev, + const char* const fnName, + const uint32_t doLocking); + + +/** + * /brief A convenience function that performs the tasks that must be performed before returning + * from every public API function call. + * + * - Log the API return + * - Unlock the device + * + * Should only be called from a device's public API functions. + * + * \param commonDev Pointer to the common structure of type adi_common_Device_t + * \param fnName The name of the calling function + * \param doLocking If set to ADI_TRUE release the device lock otherwise do not. + * + * /post On successful completion the device is unlocked. Otherwise the device's error structure has been + * set to indicate the error that occurred. + * + * \retval adi_common_ErrAction_e - ADI_COMMON_ERR_ACT_NONE if Successful + */ +ADI_API adi_common_ErrAction_e adi_common_hal_ApiExit( adi_common_Device_t* const commonDev, + const char* const fnName, + const uint32_t doLocking); + +/** + * /brief Allows greater control over the logging of entry to the API than adi_common_hal_ApiEnter. + * + * Refer to the documentation for the otherwise identical adi_common_hal_ApiEnter. + * + * \param commonDev Pointer to the common structure of type adi_common_Device_t + * \param fnName The name of the calling function + * \param doLocking If set to ADI_TRUE acquire the device lock otherwise do not. + * \param logCtl If set to QUIET the logging of the entry is de-prioritized. + * + * \retval adi_common_ErrAction_e - ADI_COMMON_ERR_ACT_NONE if Successful + */ +ADI_API adi_common_ErrAction_e adi_common_hal_ApiEnter_vLogCtl(adi_common_Device_t* const commonDev, + const char* const fnName, + const uint32_t doLocking, + const adi_common_LogCtl_e logCtl); + +/** + * /brief Allows greater control over the logging of exit from the API than adi_common_hal_ApiExit. + * + * Refer to the documentation for the otherwise identical adi_common_hal_ApiExit. + * + * \param commonDev Pointer to the common structure of type adi_common_Device_t + * \param fnName The name of the calling function + * \param doLocking If set to ADI_TRUE acquire the device lock otherwise do not. + * \param logCtl If set to QUIET the logging of the entry is de-prioritized. + * + * \retval adi_common_ErrAction_e - ADI_COMMON_ERR_ACT_NONE if Successful + */ +ADI_API adi_common_ErrAction_e adi_common_hal_ApiExit_vLogCtl(adi_common_Device_t* const commonDev, + const char* const fnName, + const uint32_t doLocking, + const adi_common_LogCtl_e logCtl); + +/** +* /brief A convenience function that performs HAL Function Pointer Checks +* +* Should only be called from a device's public API functions. +* +* \param commonDev Pointer to the common structure of type adi_common_Device_t +* +* \retval adi_common_ErrAction_e - ADI_COMMON_ERR_ACT_NONE if Successful +*/ +ADI_API adi_common_ErrAction_e adi_common_hal_PlatformFunctionCheck(adi_common_Device_t* const commonDev); + +#endif diff --git a/drivers/rf-transceiver/koror/common/adi_logging/adi_common_log.c b/drivers/rf-transceiver/koror/common/adi_logging/adi_common_log.c new file mode 100644 index 00000000000..04ad5df539e --- /dev/null +++ b/drivers/rf-transceiver/koror/common/adi_logging/adi_common_log.c @@ -0,0 +1,185 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADI API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_common_log.c +* \brief Contains ADI Transceiver Logging functions +* Analog Devices maintains and provides updates to this code layer. +* The end user should not modify this file or any code in this directory. +* +* ADI common lib Version: 0.0.2.1 +*/ + +/* Intermediate platform HAL layer maintained by Analog Devices */ +#include "adi_common_log.h" +#include "adi_common_hal.h" +#include "adi_platform.h" +#include "adi_common_error_types.h" +#include "adi_common_types.h" + +#define ADI_FILE ADI_COMMON_FILE_LOGGING + +ADI_API void adi_common_LogWrite( const adi_common_Device_t* const commonDev, + const adi_hal_LogLevel_e logLevel, + const char* comment, + ...) +{ + va_list argp; + uint8_t indent = 0U; + + if ((NULL != commonDev) && + (NULL != commonDev->devHalInfo)) + { + if (commonDev->publicCnt > 1U) + { + indent = ADI_LOG_INDENT; + } + + ADI_LIBRARY_VA_START(argp, comment); + /* ADI Logging Feature Reports Errors via own HAL Data Structure */ + (void) adi_hal_LogWrite(commonDev->devHalInfo, logLevel, indent, comment, argp); + ADI_LIBRARY_VA_END(argp); + } +} + +ADI_API void adi_common_LogLevelSet(const adi_common_Device_t* const commonDev, + const uint32_t logMask) +{ + if ((NULL != commonDev) && + (NULL != commonDev->devHalInfo)) + { + /* ADI Logging Feature Reports Errors via own HAL Data Structure */ + (void) adi_hal_LogLevelSet(commonDev->devHalInfo, logMask); + + if (logMask == 0U) + { + ADI_COMMON_DEVICE_STATE_TC_SET(*(adi_common_Device_t*)commonDev); + } + else + { + ADI_COMMON_DEVICE_STATE_TC_CLR(*(adi_common_Device_t*)commonDev); + } + } +} + +ADI_API void adi_common_LogLevelGet(const adi_common_Device_t* const commonDev, + uint32_t* const logMask) +{ + if ((NULL != commonDev) && + (NULL != commonDev->devHalInfo) && + (NULL != logMask)) + { + /* ADI Logging Feature Reports Errors via own HAL Data Structure */ + (void) adi_hal_LogLevelGet(commonDev->devHalInfo, logMask); + } +} + +ADI_API adi_common_ErrAction_e adi_common_LogStatusGet( const adi_common_Device_t* const commonDev, + adi_hal_LogStatusGet_t* const logStatus) +{ + adi_common_ErrAction_e recoveryAction = ADI_COMMON_ERR_ACT_CHECK_PARAM; + + ADI_NULL_COMMON_PTR_RETURN(commonDev); + + ADI_NULL_PTR_RETURN(commonDev->devHalInfo); + + ADI_NULL_PTR_RETURN(logStatus); + + (void) ADI_LIBRARY_MEMSET(logStatus, 0, sizeof(adi_hal_LogStatusGet_t)); + + if (ADI_HAL_ERR_OK == adi_hal_LogStatusGet(commonDev->devHalInfo, logStatus)) + { + recoveryAction = ADI_COMMON_ERR_ACT_NONE; + } + + return recoveryAction; +} + +ADI_API void adi_common_LogConsoleSet(const adi_common_Device_t* const commonDev, adi_hal_LogConsole_e logConsoleFlag) +{ + if ((NULL != commonDev) && + (NULL != commonDev->devHalInfo)) + { + /* ADI Logging Feature Reports Errors via own HAL Data Structure */ + (void) adi_hal_LogConsoleSet(commonDev->devHalInfo, logConsoleFlag); + } +} + +ADI_API void adi_common_LogFileOpen(const adi_common_Device_t* const commonDev, + const char* const fileName) +{ + if ((NULL != commonDev) && + (NULL != commonDev->devHalInfo) && + (NULL != fileName)) + { + /* ADI Logging Feature Reports Errors via own HAL Data Structure */ + (void) adi_hal_LogFileOpen(commonDev->devHalInfo, fileName); + } +} + +ADI_API void adi_common_LogFileClose(const adi_common_Device_t* const commonDev) +{ + if ((NULL != commonDev) && + (NULL != commonDev->devHalInfo)) + { + /* ADI Logging Feature Reports Errors via own HAL Data Structure */ + (void) adi_hal_LogFileClose(commonDev->devHalInfo); + } +} + +ADI_API adi_common_ErrAction_e adi_common_ErrLog( const adi_common_Device_t* const commonDev, + const uint32_t errSource, + const adi_common_ErrAction_e action, + const int64_t errCode, + const uint32_t lineNum, + const char* funcName, + const uint32_t fileName, + const char* varName, + const int64_t varData, + const char* errMsg) +{ + adi_common_ErrAction_e recoveryAction = ADI_COMMON_ERR_ACT_CHECK_PARAM; + + adi_common_ErrData_t localSave; + + ADI_NULL_COMMON_PTR_RETURN(commonDev); + + ADI_LIBRARY_MEMSET(&localSave, 0, sizeof(adi_common_ErrData_t)); + + /* All Log Writing Errors will be passed to the Log Data Structure */ + + /* Parse Data for Logging */ + localSave.stackTrace->action = action; + + /* Device Information */ + localSave.errDataInfo.errDeviceInfo.type = commonDev->deviceInfo.type; + localSave.errDataInfo.errDeviceInfo.id = commonDev->deviceInfo.id; + localSave.errDataInfo.errDeviceInfo.name = commonDev->deviceInfo.name; + + /* Error Event */ + localSave.stackTrace->errInfo.errCode = errCode; + localSave.stackTrace->errInfo.errMsg = errMsg; + localSave.stackTrace->errInfo.errSrc = errSource; + + /* File Info */ + localSave.stackTrace->fileInfo.line = lineNum; + localSave.stackTrace->fileInfo.function = funcName; + localSave.stackTrace->fileInfo.file = fileName; + + /* Variable Information */ + localSave.stackTrace->varInfo.varName = varName; + localSave.stackTrace->varInfo.varData = varData; + + /* Debug Information */ + localSave.errDebugInfo.highestPriorityAction = commonDev->errPtr->errDebugInfo.highestPriorityAction; + + ADI_ERROR_LOG(commonDev, localSave); + + recoveryAction = ADI_COMMON_ERR_ACT_NONE; + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/common/adi_logging/adi_common_log.h b/drivers/rf-transceiver/koror/common/adi_logging/adi_common_log.h new file mode 100644 index 00000000000..aaaeda017c7 --- /dev/null +++ b/drivers/rf-transceiver/koror/common/adi_logging/adi_common_log.h @@ -0,0 +1,201 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADI API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_common_log.h +* \brief Contains ADI Hardware Abstraction layer function prototypes and type definitions for adi_common_log.c +* +* ADI common lib Version: 0.0.2.1 +*/ + +#ifndef _ADI_COMMON_LOG_H_ +#define _ADI_COMMON_LOG_H_ + +#include "adi_common_types.h" +#include "adi_common_macros.h" +#include "adi_common_user.h" +#include "adi_common_log_types.h" +#include "adi_common_error_types.h" +#include "adi_common_types.h" + +/** +* \brief Macro to Log API function entry +* +* This macro will call adi_common_LogWrite function with the __func__ preprocessor. +* +* However, if the device is in time-critical mode the logging is ignored. +* +* \param[in] commonDev pointer to adi_common_Device_t +* \param[in] logLevel Logging Level +*/ + +#define ADI_FUNCTION_ENTRY_LOG(commonDev, logLevel) \ + if (!ADI_COMMON_DEVICE_STATE_IS_TC(*(commonDev))) \ + { \ + adi_common_LogWrite((commonDev), \ + (adi_hal_LogLevel_e) (logLevel), \ + "%s(...)", \ + __func__); \ + } + + +/** +* \brief Macro to Log Message with Variadic Arguments +* +* However, if the device is in time-critical mode the logging is ignored. +* +* \param[in] commonDev pointer to adi_common_Device_t +* \param[in] logLevel Log Level +* \param[in] message Message to be Logged +* \param[in] ... variable argument(s) passed to adi_common_Logwrite +*/ +#define ADI_VARIABLE_LOG(commonDev, logLevel, message, ...) \ + if (!ADI_COMMON_DEVICE_STATE_IS_TC(*(commonDev))) \ + { \ + adi_common_LogWrite((commonDev), \ + (adi_hal_LogLevel_e) (logLevel), \ + message, \ + ##__VA_ARGS__); \ + } + +/** +* \brief Macro to log error structure +* +* This macro will call adi_common_LogWrite function with the required string for logging the error. +* +* \param[in] commonDev pointer to adi_common_Device_t +* \param[in] err pointer to the error structure +*/ +#define ADI_ERROR_LOG(commonDev, err) adi_common_LogWrite(commonDev, \ + ADI_HAL_LOG_ERR, \ + "Device Information: Type: %" PRIX32 ", ID: %" PRIX32 ", Name: %s\n" \ + ADI_COMMON_LOG_ERR_INDENT1 "Recovery Action: 0x%" PRIX64 "\n" \ + ADI_COMMON_LOG_ERR_INDENT1 "Event Information:\n" \ + ADI_COMMON_LOG_ERR_INDENT2 "Error Code: 0x%" PRIX64"\n" \ + ADI_COMMON_LOG_ERR_INDENT2 "Error Source: 0x%" PRIX32 "\n" \ + ADI_COMMON_LOG_ERR_INDENT2 "Error Message: %s\n" \ + ADI_COMMON_LOG_ERR_INDENT1 "File Information:\n" \ + ADI_COMMON_LOG_ERR_INDENT2 "Line: %" PRIu32"\n" \ + ADI_COMMON_LOG_ERR_INDENT2 "Function: %s\n" \ + ADI_COMMON_LOG_ERR_INDENT2 "File: %" PRIu32"\n" \ + ADI_COMMON_LOG_ERR_INDENT1 "Variable Information:\n" \ + ADI_COMMON_LOG_ERR_INDENT2 "Variable Name: %s\n" \ + ADI_COMMON_LOG_ERR_INDENT2 "Variable Data: 0x%" PRIX64 "\n", \ + err.errDataInfo.errDeviceInfo.type, \ + err.errDataInfo.errDeviceInfo.id, \ + err.errDataInfo.errDeviceInfo.name, \ + err.stackTrace->action, \ + err.stackTrace->errInfo.errCode, \ + err.stackTrace->errInfo.errSrc, \ + err.stackTrace->errInfo.errMsg, \ + err.stackTrace->fileInfo.line, \ + err.stackTrace->fileInfo.function, \ + err.stackTrace->fileInfo.file, \ + err.stackTrace->varInfo.varName, \ + err.stackTrace->varInfo.varData); +/** +* \brief Function to Set the Logging Level +* +* Used to set the log level mask of what types of messages to log +* +* \param[in] commonDev Pointer to adi_common_Device_t +* \param[in] logMask Logging Mask +* +*/ +ADI_API void adi_common_LogLevelSet(const adi_common_Device_t* const commonDev, + const uint32_t logMask); + +/** +* \brief Function to Get the Logging Level +* +* Used to read the log level mask of what types of messages are able to be logged. +* +* \param[in] commonDev Pointer to adi_common_Device_t +* \param[out] logMask Logging Mask +* +*/ +ADI_API void adi_common_LogLevelGet(const adi_common_Device_t* const commonDev, + uint32_t* const logMask); + +/** +* \brief Function to Get Logging Status +* +* \param[in] commonDev Pointer to adi_common_Device_t +* \param[out] logStatus Pointer to Logging Status Information +* +*/ +ADI_API adi_common_ErrAction_e adi_common_LogStatusGet( const adi_common_Device_t* const commonDev, + adi_hal_LogStatusGet_t* const logStatus); + +/** +* \brief Function to Configure Logging to Console +* +* \param[in] commonDev Pointer to adi_common_Device_t +* \param[out] logConsoleFlag Flag Status to be Set +* +*/ +ADI_API void adi_common_LogConsoleSet(const adi_common_Device_t* const commonDev, adi_hal_LogConsole_e logConsoleFlag); + +/** +* \brief Function to write to log with a selected comment +* +* \param[in] commonDev Pointer to adi_common_Device_t +* \param[in] logLevel Logging Level +* \param[in] comment Message Pointer +* \param[in] ... variable(s) argument passed to adi_common_Logwrite +* +*/ +ADI_API void adi_common_LogWrite( const adi_common_Device_t* const commonDev, + const adi_hal_LogLevel_e logLevel, + const char* comment, + ...); + +/** +* \brief Function to open the log file associated to the log +* +* Used to open the log file that is stored in the platform +* +* \param[in] commonDev pointer to adi_common_Device_t +* \param[in] fileName file name to be open, if null default name in the devHalInfo structure will be used +* +*/ +ADI_API void adi_common_LogFileOpen( const adi_common_Device_t* const commonDev, + const char* const fileName); + +/** +* \brief Function to close the log file associated to the log in the platform +* +* \param[in] commonDev pointer to adi_common_Device_t +* +*/ +ADI_API void adi_common_LogFileClose(const adi_common_Device_t* const commonDev); + +/* + * \brief Service to Log an Error + * + * \param[in] commonDev pointer to adi_common_Device_t + * \param[in] actionRequired RecoveryAction to be taken + * \param[in] lineNum line number of where the error was detected + * \param[in] funcName function name of the function where the error was detected + * \param[in] fileName file name of the file where the error was detected + * \param[in] detErr Detected Error Code + * \param[in] errCodeMsg Error Message + * \param[in] varName Variable name to be captured + * \param[in] varData Variable Data will be captured (Limitations Apply) + * \param[in] errMsg User Readable Error Message + */ +ADI_API adi_common_ErrAction_e adi_common_ErrLog( const adi_common_Device_t* const commonDev, + const uint32_t errSource, + const adi_common_ErrAction_e action, + const int64_t errCode, + const uint32_t lineNum, + const char* funcName, + const uint32_t fileName, + const char* varName, + const int64_t varData, + const char* errMsg); + +#endif /* _ADI_COMMON_LOG_H_ */ diff --git a/drivers/rf-transceiver/koror/common/adi_logging/adi_common_log_types.h b/drivers/rf-transceiver/koror/common/adi_logging/adi_common_log_types.h new file mode 100644 index 00000000000..4b0764b7a34 --- /dev/null +++ b/drivers/rf-transceiver/koror/common/adi_logging/adi_common_log_types.h @@ -0,0 +1,17 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_common_log_types.h +* \brief Contains ADI common log types. +* +* ADI common lib Version: 0.0.2.1 +*/ + +#ifndef _ADI_COMMON_LOG_TYPES_H_ +#define _ADI_COMMON_LOG_TYPES_H_ + +#endif /* _ADI_COMMON_LOG_TYPES_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/multiver/adi_adrv904x_all_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/multiver/adi_adrv904x_all_types.h new file mode 100644 index 00000000000..3c67ab9fd64 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/multiver/adi_adrv904x_all_types.h @@ -0,0 +1,39 @@ +/** + * Copyright 2015 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/*! +* \file adi_adrv904x_all_types.h +* \brief A convenience header that includes all adrv904x _types header files. +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#ifndef ADI_ADRV904X_ALL_TYPES_H +#define ADI_ADRV904X_ALL_TYPES_H +#include "adi_adrv904x_agc_types.h" +#include "adi_adrv904x_cals_types.h" +#include "adi_adrv904x_cpu_error_codes_types.h" +#include "adi_adrv904x_cpu_fw_rev_info_types.h" +#include "adi_adrv904x_cpu_health_monitor_types.h" +#include "adi_adrv904x_cpu_log_types.h" +#include "adi_adrv904x_cpu_sw_bkpt_types.h" +#include "adi_adrv904x_cpu_sys_types.h" +#include "adi_adrv904x_cpu_types.h" +#include "adi_adrv904x_datainterface_types.h" +#include "adi_adrv904x_dev_temp_types.h" +#include "adi_adrv904x_error_types.h" +#include "adi_adrv904x_gpio_types.h" +#include "adi_adrv904x_hal_types.h" +#include "adi_adrv904x_lo_types.h" +#include "adi_adrv904x_radioctrl_types.h" +#include "adi_adrv904x_rx_types.h" +#include "adi_adrv904x_tx_types.h" +#include "adi_adrv904x_types.h" +#include "adi_adrv904x_utilities_types.h" +#include "adi_adrv904x_version_types.h" +#include "adi_adrv904x_cpu_cmd_run_serdes_eye_sweep.h" +#include "adi_adrv904x_cpu_cmd_dc_offset.h" +#endif diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/multiver/adi_adrv904x_api.h b/drivers/rf-transceiver/koror/devices/adrv904x/multiver/adi_adrv904x_api.h new file mode 100644 index 00000000000..d1d24af90e4 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/multiver/adi_adrv904x_api.h @@ -0,0 +1,48 @@ +/** + * Copyright 2015 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/*! +* \file adi_adrv904x_api.h +* \brief A convenience header that includes all adrv904x header files. +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#ifndef ADI_ADRV904X_API_H +#define ADI_ADRV904X_API_H + +/* Regardless of single or multi-version all applications need the API types. */ +#include "adi_adrv904x_all_types.h" + +#ifdef ADI_ADRV904X_MULTIVERSION +/* The application will load a specific API version at run-time using api_ver_init(); Include the function pointer + * declarations for the redirection table. */ +#include "adi_adrv904x_ver_redirect.h" +#else +/* The application will compile in or statically link to a single API version; Include the standard function decls */ +#include "adi_adrv904x_agc.h" +#include "adi_adrv904x_cals.h" +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_cpu.h" +#include "adi_adrv904x_cpu_cmd_dc_offset.h" +#include "adi_adrv904x_cpu_cmd_run_serdes_eye_sweep.h" +#include "adi_adrv904x_datainterface.h" +#include "adi_adrv904x_error.h" +#include "adi_adrv904x_error_type_action.h" +#include "adi_adrv904x_gpio.h" +#include "adi_adrv904x_hal.h" +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_radioctrl.h" +#include "adi_adrv904x_rx.h" +#include "adi_adrv904x_rx_nco.h" +#include "adi_adrv904x_tx.h" +#include "adi_adrv904x_tx_nco.h" +#include "adi_adrv904x_user.h" +#include "adi_adrv904x_utilities.h" +#include "adi_adrv904x_version.h" +#endif + +#endif diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_actrl_orx_west_regmap.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_actrl_orx_west_regmap.c new file mode 100644 index 00000000000..22457848458 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_actrl_orx_west_regmap.c @@ -0,0 +1,299 @@ +/** + * \file adrv904x_bf_actrl_orx_west_regmap.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_actrl_orx_west_regmap.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_ACTRL_ORX_WEST_REGMAP + +ADI_API adi_adrv904x_ErrAction_e adrv904x_ActrlOrxWestRegmap_TrmAtten_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfActrlOrxWestRegmapChanAddr_e baseAddr, + const adrv904x_Bf_ActrlOrxWestRegmap_TrmAtten_e bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ( + (bfValue != ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_0DB ) && + (bfValue != ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_1DB ) && + (bfValue != ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_2DB ) && + (bfValue != ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_3DB ) && + (bfValue != ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_4DB ) && + (bfValue != ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_5DB ) && + (bfValue != ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_6DB ) && + (bfValue != ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_7DB ) && + (bfValue != ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_8DB ) && + (bfValue != ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_9DB ) && + (bfValue != ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_10DB ) && + (bfValue != ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_11DB ) && + (bfValue != ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_12DB ) && + (bfValue != ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_13DB ) && + (bfValue != ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_14DB ) && + (bfValue != ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_15DB ) && + (bfValue != ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_16DB ) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_ActrlOrxWestRegmap_TrmAtten_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_ANALOG_ADC_8B_VENUS_ACTRL_WEST_REGMAP) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_ANALOG_ADC_8B_VENUS_ACTRL_WEST_REGMAP)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_ActrlOrxWestRegmap_TrmAtten_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3F0U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_ActrlOrxWestRegmap_TrmAtten_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfActrlOrxWestRegmapChanAddr_e baseAddr, + adrv904x_Bf_ActrlOrxWestRegmap_TrmAtten_e* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (adrv904x_Bf_ActrlOrxWestRegmap_TrmAtten_e) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_ANALOG_ADC_8B_VENUS_ACTRL_WEST_REGMAP) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_ANALOG_ADC_8B_VENUS_ACTRL_WEST_REGMAP)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_ActrlOrxWestRegmap_TrmAtten_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3F0U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (adrv904x_Bf_ActrlOrxWestRegmap_TrmAtten_e) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_ActrlOrxWestRegmap_TrmAttenCmCapEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfActrlOrxWestRegmapChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_ActrlOrxWestRegmap_TrmAttenCmCapEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_ANALOG_ADC_8B_VENUS_ACTRL_WEST_REGMAP) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_ANALOG_ADC_8B_VENUS_ACTRL_WEST_REGMAP)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_ActrlOrxWestRegmap_TrmAttenCmCapEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3F1U), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_ActrlOrxWestRegmap_TrmAttenPd_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfActrlOrxWestRegmapChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_ActrlOrxWestRegmap_TrmAttenPd_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_ANALOG_ADC_8B_VENUS_ACTRL_WEST_REGMAP) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_ANALOG_ADC_8B_VENUS_ACTRL_WEST_REGMAP)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_ActrlOrxWestRegmap_TrmAttenPd_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3F1U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_ActrlOrxWestRegmap_TrmAttenSpare2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfActrlOrxWestRegmapChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_ActrlOrxWestRegmap_TrmAttenSpare2_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_ANALOG_ADC_8B_VENUS_ACTRL_WEST_REGMAP) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_ANALOG_ADC_8B_VENUS_ACTRL_WEST_REGMAP)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_ActrlOrxWestRegmap_TrmAttenSpare2_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3F1U), + ((uint32_t) bfValue << 2), + 0xFCU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_actrl_orx_west_regmap.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_actrl_orx_west_regmap.h new file mode 100644 index 00000000000..a195fd2cf72 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_actrl_orx_west_regmap.h @@ -0,0 +1,56 @@ +/** + * \file adrv904x_bf_actrl_orx_west_regmap.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_H_ +#define _ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_actrl_orx_west_regmap_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_ActrlOrxWestRegmap_TrmAtten_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfActrlOrxWestRegmapChanAddr_e baseAddr, + const adrv904x_Bf_ActrlOrxWestRegmap_TrmAtten_e bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_ActrlOrxWestRegmap_TrmAtten_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfActrlOrxWestRegmapChanAddr_e baseAddr, + adrv904x_Bf_ActrlOrxWestRegmap_TrmAtten_e* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_ActrlOrxWestRegmap_TrmAttenCmCapEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfActrlOrxWestRegmapChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_ActrlOrxWestRegmap_TrmAttenPd_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfActrlOrxWestRegmapChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_ActrlOrxWestRegmap_TrmAttenSpare2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfActrlOrxWestRegmapChanAddr_e baseAddr, + const uint8_t bfValue); + +#endif // _ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_actrl_orx_west_regmap_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_actrl_orx_west_regmap_types.h new file mode 100644 index 00000000000..41abc06e6a7 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_actrl_orx_west_regmap_types.h @@ -0,0 +1,50 @@ +/** + * \file adrv904x_bf_actrl_orx_west_regmap_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TYPES_H_ +#define _ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TYPES_H_ + +typedef enum adrv904x_BfActrlOrxWestRegmapChanAddr +{ + ADRV904X_BF_SLICE_ORX_0__ORX_ANALOG_ADC_8B_VENUS_ACTRL_WEST_REGMAP = 0x6106A400, + ADRV904X_BF_SLICE_ORX_1__ORX_ANALOG_ADC_8B_VENUS_ACTRL_WEST_REGMAP = 0x6116A400 +} adrv904x_BfActrlOrxWestRegmapChanAddr_e; + +/** + * \brief Enumeration for trmAtten + */ + +typedef enum adrv904x_Bf_ActrlOrxWestRegmap_TrmAtten +{ + ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_0DB = 0, /*!< 0dB Attenuation */ + ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_1DB = 1, /*!< 1dB Attenuation */ + ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_2DB = 2, /*!< 2dB Attenuation */ + ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_3DB = 3, /*!< 3dB Attenuation */ + ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_4DB = 4, /*!< 4dB Attenuation */ + ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_5DB = 5, /*!< 5dB Attenuation */ + ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_6DB = 6, /*!< 6dB Attenuation */ + ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_7DB = 7, /*!< 7dB Attenuation */ + ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_8DB = 8, /*!< 8dB Attenuation */ + ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_9DB = 9, /*!< 9dB Attenuation */ + ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_10DB = 10, /*!< 10dB Attenuation */ + ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_11DB = 11, /*!< 11dB Attenuation */ + ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_12DB = 12, /*!< 12dB Attenuation */ + ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_13DB = 13, /*!< 13dB Attenuation */ + ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_14DB = 14, /*!< 14dB Attenuation */ + ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_15DB = 15, /*!< 15dB Attenuation */ + ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_16DB = 16 /*!< 16dB Attenuation */ +} adrv904x_Bf_ActrlOrxWestRegmap_TrmAtten_e; + +#endif // _ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cap_buf_mmr.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cap_buf_mmr.c new file mode 100644 index 00000000000..6f305fbf017 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cap_buf_mmr.c @@ -0,0 +1,591 @@ +/** + * \file adrv904x_bf_cap_buf_mmr.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_cap_buf_mmr.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_CAP_BUF_MMR + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CapBufMmr_CaptureDepth_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCapBufMmrChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_0_) && + (baseAddr != ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CapBufMmr_CaptureDepth_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x18U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x19U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CapBufMmr_CapEnSrc_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCapBufMmrChanAddr_e baseAddr, + const adrv904x_Bf_CapBufMmr_CapEnSrc_e bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ( + (bfValue != ADRV904X_BF_CAP_BUF_MMR_CAP_EN_SRC_CAP_EN_SW ) && + (bfValue != ADRV904X_BF_CAP_BUF_MMR_CAP_EN_SRC_CAP_EN_RADIO_SEQUENCER ) && + (bfValue != ADRV904X_BF_CAP_BUF_MMR_CAP_EN_SRC_CAP_EN_GPIO ) && + (bfValue != ADRV904X_BF_CAP_BUF_MMR_CAP_EN_SRC_CAP_EN_NONE ) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CapBufMmr_CapEnSrc_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_0_) && + (baseAddr != ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CapBufMmr_CapEnSrc_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x8U), + (uint32_t) bfValue, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CapBufMmr_CapEnSrc_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCapBufMmrChanAddr_e baseAddr, + adrv904x_Bf_CapBufMmr_CapEnSrc_e* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (adrv904x_Bf_CapBufMmr_CapEnSrc_e) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_0_) && + (baseAddr != ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CapBufMmr_CapEnSrc_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x8U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (adrv904x_Bf_CapBufMmr_CapEnSrc_e) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CapBufMmr_CapPauseSrc_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCapBufMmrChanAddr_e baseAddr, + const adrv904x_Bf_CapBufMmr_CapPauseSrc_e bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ( + (bfValue != ADRV904X_BF_CAP_BUF_MMR_CAP_PAUSE_SRC_CAP_PAUSE_SW ) && + (bfValue != ADRV904X_BF_CAP_BUF_MMR_CAP_PAUSE_SRC_CAP_PAUSE_RADIO_SEQUENCER ) && + (bfValue != ADRV904X_BF_CAP_BUF_MMR_CAP_PAUSE_SRC_CAP_PAUSE_GPIO ) && + (bfValue != ADRV904X_BF_CAP_BUF_MMR_CAP_PAUSE_SRC_CAP_PAUSE_SLICE ) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CapBufMmr_CapPauseSrc_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_0_) && + (baseAddr != ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CapBufMmr_CapPauseSrc_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x8U), + ((uint32_t) bfValue << 2), + 0xCU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CapBufMmr_CapPauseSrc_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCapBufMmrChanAddr_e baseAddr, + adrv904x_Bf_CapBufMmr_CapPauseSrc_e* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (adrv904x_Bf_CapBufMmr_CapPauseSrc_e) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_0_) && + (baseAddr != ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CapBufMmr_CapPauseSrc_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x8U), + &bfValueTmp, + 0xCU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (adrv904x_Bf_CapBufMmr_CapPauseSrc_e) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CapBufMmr_Ch0SrcSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCapBufMmrChanAddr_e baseAddr, + adrv904x_Bf_CapBufMmr_Ch0SrcSel_e* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (adrv904x_Bf_CapBufMmr_Ch0SrcSel_e) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_0_) && + (baseAddr != ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CapBufMmr_Ch0SrcSel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xCU), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (adrv904x_Bf_CapBufMmr_Ch0SrcSel_e) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CapBufMmr_Ch1SrcSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCapBufMmrChanAddr_e baseAddr, + adrv904x_Bf_CapBufMmr_Ch1SrcSel_e* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (adrv904x_Bf_CapBufMmr_Ch1SrcSel_e) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_0_) && + (baseAddr != ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CapBufMmr_Ch1SrcSel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xCU), + &bfValueTmp, + 0xCU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (adrv904x_Bf_CapBufMmr_Ch1SrcSel_e) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CapBufMmr_Ch2SrcSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCapBufMmrChanAddr_e baseAddr, + adrv904x_Bf_CapBufMmr_Ch2SrcSel_e* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (adrv904x_Bf_CapBufMmr_Ch2SrcSel_e) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_0_) && + (baseAddr != ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CapBufMmr_Ch2SrcSel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xCU), + &bfValueTmp, + 0x30U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (adrv904x_Bf_CapBufMmr_Ch2SrcSel_e) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CapBufMmr_ClockEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCapBufMmrChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CapBufMmr_ClockEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_0_) && + (baseAddr != ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CapBufMmr_ClockEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x84U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CapBufMmr_DebugModeEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCapBufMmrChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CapBufMmr_DebugModeEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_0_) && + (baseAddr != ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CapBufMmr_DebugModeEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x7CU), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CapBufMmr_NumChannels_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCapBufMmrChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_0_) && + (baseAddr != ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CapBufMmr_NumChannels_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x10U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cap_buf_mmr.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cap_buf_mmr.h new file mode 100644 index 00000000000..0eeab0dba31 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cap_buf_mmr.h @@ -0,0 +1,86 @@ +/** + * \file adrv904x_bf_cap_buf_mmr.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_CAP_BUF_MMR_H_ +#define _ADRV904X_BF_CAP_BUF_MMR_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_cap_buf_mmr_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CapBufMmr_CaptureDepth_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCapBufMmrChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CapBufMmr_CapEnSrc_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCapBufMmrChanAddr_e baseAddr, + const adrv904x_Bf_CapBufMmr_CapEnSrc_e bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CapBufMmr_CapEnSrc_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCapBufMmrChanAddr_e baseAddr, + adrv904x_Bf_CapBufMmr_CapEnSrc_e* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CapBufMmr_CapPauseSrc_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCapBufMmrChanAddr_e baseAddr, + const adrv904x_Bf_CapBufMmr_CapPauseSrc_e bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CapBufMmr_CapPauseSrc_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCapBufMmrChanAddr_e baseAddr, + adrv904x_Bf_CapBufMmr_CapPauseSrc_e* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CapBufMmr_Ch0SrcSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCapBufMmrChanAddr_e baseAddr, + adrv904x_Bf_CapBufMmr_Ch0SrcSel_e* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CapBufMmr_Ch1SrcSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCapBufMmrChanAddr_e baseAddr, + adrv904x_Bf_CapBufMmr_Ch1SrcSel_e* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CapBufMmr_Ch2SrcSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCapBufMmrChanAddr_e baseAddr, + adrv904x_Bf_CapBufMmr_Ch2SrcSel_e* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CapBufMmr_ClockEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCapBufMmrChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CapBufMmr_DebugModeEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCapBufMmrChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CapBufMmr_NumChannels_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCapBufMmrChanAddr_e baseAddr, + uint8_t* const bfValue); + +#endif // _ADRV904X_BF_CAP_BUF_MMR_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cap_buf_mmr_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cap_buf_mmr_types.h new file mode 100644 index 00000000000..40222dbea8c --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cap_buf_mmr_types.h @@ -0,0 +1,105 @@ +/** + * \file adrv904x_bf_cap_buf_mmr_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_CAP_BUF_MMR_TYPES_H_ +#define _ADRV904X_BF_CAP_BUF_MMR_TYPES_H_ + +typedef enum adrv904x_BfCapBufMmrChanAddr +{ + ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_0_ = (int32_t)0xB2000000, + ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_1_ = (int32_t)0xB2100000 +} adrv904x_BfCapBufMmrChanAddr_e; + +/** + * \brief Enumeration for capEnMode + */ + +typedef enum adrv904x_Bf_CapBufMmr_CapEnMode +{ + ADRV904X_BF_CAP_BUF_MMR_CAP_EN_MODE_MULTI_CAP_PER_ENABLE = 0, /*!< Multiple Captures in a Capture Enable Event Duration */ + ADRV904X_BF_CAP_BUF_MMR_CAP_EN_MODE_SINGLE_CAP_PER_ENABLE = 1 /*!< Single Capture in a Capture Enable Event Duration */ +} adrv904x_Bf_CapBufMmr_CapEnMode_e; + +/** + * \brief Enumeration for capEnSrc + */ + +typedef enum adrv904x_Bf_CapBufMmr_CapEnSrc +{ + ADRV904X_BF_CAP_BUF_MMR_CAP_EN_SRC_CAP_EN_SW = 0, /*!< Selects Enable from Software Source */ + ADRV904X_BF_CAP_BUF_MMR_CAP_EN_SRC_CAP_EN_RADIO_SEQUENCER = 1, /*!< Selects Enable from Radio Sequencer */ + ADRV904X_BF_CAP_BUF_MMR_CAP_EN_SRC_CAP_EN_GPIO = 2, /*!< Selects Enable from GPIO */ + ADRV904X_BF_CAP_BUF_MMR_CAP_EN_SRC_CAP_EN_NONE = 3 /*!< Reserved */ +} adrv904x_Bf_CapBufMmr_CapEnSrc_e; + +/** + * \brief Enumeration for capPauseSrc + */ + +typedef enum adrv904x_Bf_CapBufMmr_CapPauseSrc +{ + ADRV904X_BF_CAP_BUF_MMR_CAP_PAUSE_SRC_CAP_PAUSE_SW = 0, /*!< Selects Pause from Software Source */ + ADRV904X_BF_CAP_BUF_MMR_CAP_PAUSE_SRC_CAP_PAUSE_RADIO_SEQUENCER = 1, /*!< Selects Pause from Radio Sequencer */ + ADRV904X_BF_CAP_BUF_MMR_CAP_PAUSE_SRC_CAP_PAUSE_GPIO = 2, /*!< Selects Pause from GPIO */ + ADRV904X_BF_CAP_BUF_MMR_CAP_PAUSE_SRC_CAP_PAUSE_SLICE = 3 /*!< Selects Pause from TX Slice */ +} adrv904x_Bf_CapBufMmr_CapPauseSrc_e; + +/** + * \brief Enumeration for ch0SrcSel + */ + +typedef enum adrv904x_Bf_CapBufMmr_Ch0SrcSel +{ + ADRV904X_BF_CAP_BUF_MMR_CH0_SRC_SEL_TX = 0, /*!< Select TX as Channel 0 Data Source */ + ADRV904X_BF_CAP_BUF_MMR_CH0_SRC_SEL_ALT_TX = 1, /*!< Select ALT_TX as Channel 0 Data Source */ + ADRV904X_BF_CAP_BUF_MMR_CH0_SRC_SEL_ORX = 2, /*!< Select ORX as Channel 0 Data Source */ + ADRV904X_BF_CAP_BUF_MMR_CH0_SRC_SEL_RSVD = 3 /*!< Reserved */ +} adrv904x_Bf_CapBufMmr_Ch0SrcSel_e; + +/** + * \brief Enumeration for ch1SrcSel + */ + +typedef enum adrv904x_Bf_CapBufMmr_Ch1SrcSel +{ + ADRV904X_BF_CAP_BUF_MMR_CH1_SRC_SEL_TX = 0, /*!< Select TX as Channel 1 Data Source */ + ADRV904X_BF_CAP_BUF_MMR_CH1_SRC_SEL_ALT_TX = 1, /*!< Select ALT_TX as Channel 1 Data Source */ + ADRV904X_BF_CAP_BUF_MMR_CH1_SRC_SEL_ORX = 2, /*!< Select ORX as Channel 1 Data Source */ + ADRV904X_BF_CAP_BUF_MMR_CH1_SRC_SEL_RSVD = 3 /*!< Reserved */ +} adrv904x_Bf_CapBufMmr_Ch1SrcSel_e; + +/** + * \brief Enumeration for ch2SrcSel + */ + +typedef enum adrv904x_Bf_CapBufMmr_Ch2SrcSel +{ + ADRV904X_BF_CAP_BUF_MMR_CH2_SRC_SEL_TX = 0, /*!< Select TX as Channel 2 Data Source */ + ADRV904X_BF_CAP_BUF_MMR_CH2_SRC_SEL_ALT_TX = 1, /*!< Select ALT_TX as Channel 2 Data Source */ + ADRV904X_BF_CAP_BUF_MMR_CH2_SRC_SEL_ORX = 2, /*!< Select ORX as Channel 2 Data Source */ + ADRV904X_BF_CAP_BUF_MMR_CH2_SRC_SEL_RSVD = 3 /*!< Reserved */ +} adrv904x_Bf_CapBufMmr_Ch2SrcSel_e; + +/** + * \brief Enumeration for frameDelayRestartCtrl + */ + +typedef enum adrv904x_Bf_CapBufMmr_FrameDelayRestartCtrl +{ + ADRV904X_BF_CAP_BUF_MMR_FRAME_DELAY_RESTART_CTRL_ON_CAP_TRIGGER_RISING_EDGE = 0, /*!< Restarts on Capture Trigger Rising Edge */ + ADRV904X_BF_CAP_BUF_MMR_FRAME_DELAY_RESTART_CTRL_ON_CAP_EN_RISING_EDGE = 1 /*!< Restarts on Capture Enable Rising Edge */ +} adrv904x_Bf_CapBufMmr_FrameDelayRestartCtrl_e; + +#endif // _ADRV904X_BF_CAP_BUF_MMR_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cddc_funcs.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cddc_funcs.c new file mode 100644 index 00000000000..8aeb898f348 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cddc_funcs.c @@ -0,0 +1,7171 @@ +/** + * \file adrv904x_bf_cddc_funcs.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_cddc_funcs.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_CDDC_FUNCS + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcJesdClkDiv_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const adrv904x_Bf_CddcFuncs_CddcJesdClkDiv_e bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ( + (bfValue != ADRV904X_BF_CDDC_FUNCS_CDDC_JESD_CLK_DIV_DIV_BY_1 ) && + (bfValue != ADRV904X_BF_CDDC_FUNCS_CDDC_JESD_CLK_DIV_DIV_BY_2 ) && + (bfValue != ADRV904X_BF_CDDC_FUNCS_CDDC_JESD_CLK_DIV_DIV_BY_4 ) && + (bfValue != ADRV904X_BF_CDDC_FUNCS_CDDC_JESD_CLK_DIV_DIV_BY_8 ) && + (bfValue != ADRV904X_BF_CDDC_FUNCS_CDDC_JESD_CLK_DIV_DIV_BY_16 ) && + (bfValue != ADRV904X_BF_CDDC_FUNCS_CDDC_JESD_CLK_DIV_DIV_BY_32 ) && + (bfValue != ADRV904X_BF_CDDC_FUNCS_CDDC_JESD_CLK_DIV_DIV_BY_64 ) && + (bfValue != ADRV904X_BF_CDDC_FUNCS_CDDC_JESD_CLK_DIV_DIV_BY_128 ) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_CddcJesdClkDiv_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_CddcJesdClkDiv_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1F0U), + ((uint32_t) bfValue << 4), + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPeakToPowerMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_CddcPeakToPowerMode_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_CddcPeakToPowerMode_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_CddcPeakToPowerMode_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x184 + channelId * 12U), + ((uint32_t) bfValue << 6), + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPeakToPowerMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_CddcPeakToPowerMode_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_CddcPeakToPowerMode_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x184 + channelId * 12U), + &bfValueTmp, + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 6); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPower_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_CddcPower_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_CddcPower_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x188 + channelId * 12U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerInputSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_CddcPowerInputSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_CddcPowerInputSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_CddcPowerInputSelect_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x184 + channelId * 12U), + ((uint32_t) bfValue << 1), + 0x1EU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerInputSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_CddcPowerInputSelect_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_CddcPowerInputSelect_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x184 + channelId * 12U), + &bfValueTmp, + 0x1EU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 1); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerLargestPeak_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_CddcPowerLargestPeak_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_CddcPowerLargestPeak_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x18C + channelId * 12U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerMeasurementContinueDelayCounter_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 65535U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_CddcPowerMeasurementContinueDelayCounter_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_CddcPowerMeasurementContinueDelayCounter_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_CddcPowerMeasurementContinueDelayCounter_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x185 + channelId * 12), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x186 + channelId * 12), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerMeasurementContinueDelayCounter_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_CddcPowerMeasurementContinueDelayCounter_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_CddcPowerMeasurementContinueDelayCounter_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x185 + channelId * 12U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x186 + channelId * 12U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerMeasurementDuration_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_CddcPowerMeasurementDuration_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_CddcPowerMeasurementDuration_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_CddcPowerMeasurementDuration_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x187 + channelId * 12U), + ((uint32_t) bfValue << 1), + 0x3EU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerMeasurementDuration_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_CddcPowerMeasurementDuration_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_CddcPowerMeasurementDuration_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x187 + channelId * 12U), + &bfValueTmp, + 0x3EU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 1); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerMeasurementEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_CddcPowerMeasurementEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_CddcPowerMeasurementEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_CddcPowerMeasurementEnable_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x184 + channelId * 12U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerMeasurementEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_CddcPowerMeasurementEnable_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_CddcPowerMeasurementEnable_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x184 + channelId * 12U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerMeasurementPause_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_CddcPowerMeasurementPause_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_CddcPowerMeasurementPause_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_CddcPowerMeasurementPause_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x184 + channelId * 12U), + ((uint32_t) bfValue << 5), + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerMeasurementReadback_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_CddcPowerMeasurementReadback_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_CddcPowerMeasurementReadback_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_CddcPowerMeasurementReadback_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x189 + channelId * 12U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerMeasurementTddModeEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_CddcPowerMeasurementTddModeEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_CddcPowerMeasurementTddModeEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x180U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerMeasurementTddModeEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_CddcPowerMeasurementTddModeEnable_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x180U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterCarrierSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_FormatterCarrierSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterCarrierSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x162U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterCarrierSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterCarrierSelect_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x162U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterDynamicSlicerAgcSyncEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_FormatterDynamicSlicerAgcSyncEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterDynamicSlicerAgcSyncEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x168U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterDynamicSlicerAgcSyncEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterDynamicSlicerAgcSyncEnable_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x168U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_FormatterFpEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterFpEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x160U), + ((uint32_t) bfValue << 2), + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterFpEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x160U), + &bfValueTmp, + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpExponentBits_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_FormatterFpExponentBits_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterFpExponentBits_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x161U), + (uint32_t) bfValue, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpExponentBits_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterFpExponentBits_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x161U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpFloatDataFormat_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_FormatterFpFloatDataFormat_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterFpFloatDataFormat_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x161U), + ((uint32_t) bfValue << 2), + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpFloatDataFormat_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterFpFloatDataFormat_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x161U), + &bfValueTmp, + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpHideLeadingOnes_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_FormatterFpHideLeadingOnes_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterFpHideLeadingOnes_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x161U), + ((uint32_t) bfValue << 3), + 0x8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpHideLeadingOnes_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterFpHideLeadingOnes_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x161U), + &bfValueTmp, + 0x8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 3); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpNanEncEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_FormatterFpNanEncEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterFpNanEncEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x161U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpNanEncEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterFpNanEncEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x161U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpRoundMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_FormatterFpRoundMode_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterFpRoundMode_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x161U), + ((uint32_t) bfValue << 5), + 0xE0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpRoundMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterFpRoundMode_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x161U), + &bfValueTmp, + 0xE0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 5); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntDataFormat_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_FormatterIntDataFormat_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterIntDataFormat_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x16CU), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntDataFormat_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterIntDataFormat_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x16CU), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntDataResolution_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_FormatterIntDataResolution_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterIntDataResolution_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x16CU), + ((uint32_t) bfValue << 7), + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntDataResolution_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterIntDataResolution_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x16CU), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 7); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntEmbedSlicer_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_FormatterIntEmbedSlicer_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterIntEmbedSlicer_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x16CU), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntEmbedSlicer_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterIntEmbedSlicer_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x16CU), + &bfValueTmp, + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 1); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntEmbedSlicerNumber_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_FormatterIntEmbedSlicerNumber_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterIntEmbedSlicerNumber_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x16CU), + ((uint32_t) bfValue << 2), + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntEmbedSlicerNumber_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterIntEmbedSlicerNumber_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x16CU), + &bfValueTmp, + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntEmbedSlicerPos_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_FormatterIntEmbedSlicerPos_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterIntEmbedSlicerPos_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x16CU), + ((uint32_t) bfValue << 3), + 0x8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntEmbedSlicerPos_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterIntEmbedSlicerPos_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x16CU), + &bfValueTmp, + 0x8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 3); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntEvenParity_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_FormatterIntEvenParity_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterIntEvenParity_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x16CU), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntEvenParity_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterIntEvenParity_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x16CU), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntParitySupport_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_FormatterIntParitySupport_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterIntParitySupport_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x16CU), + ((uint32_t) bfValue << 5), + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntParitySupport_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterIntParitySupport_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x16CU), + &bfValueTmp, + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 5); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntSlicerLsbOnQ_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_FormatterIntSlicerLsbOnQ_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterIntSlicerLsbOnQ_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x16CU), + ((uint32_t) bfValue << 6), + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntSlicerLsbOnQ_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterIntSlicerLsbOnQ_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x16CU), + &bfValueTmp, + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 6); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterRxMonFormatI0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_FormatterRxMonFormatI0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterRxMonFormatI0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x170U), + ((uint32_t) bfValue << 2), + 0x3CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterRxMonFormatI0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterRxMonFormatI0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x170U), + &bfValueTmp, + 0x3CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterRxMonFormatI1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_FormatterRxMonFormatI1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterRxMonFormatI1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x170), + bfValue << 6, + 0xC0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x171), + bfValue >> 2, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterRxMonFormatI1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterRxMonFormatI1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x170U), + &bfValueTmp, + 0xC0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 6)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x171U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 2)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterRxMonFormatQ0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_FormatterRxMonFormatQ0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterRxMonFormatQ0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x171U), + ((uint32_t) bfValue << 2), + 0x3CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterRxMonFormatQ0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterRxMonFormatQ0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x171U), + &bfValueTmp, + 0x3CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterRxMonFormatQ1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_FormatterRxMonFormatQ1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterRxMonFormatQ1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x171), + bfValue << 6, + 0xC0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x172), + bfValue >> 2, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterRxMonFormatQ1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterRxMonFormatQ1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x171U), + &bfValueTmp, + 0xC0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 6)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x172U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 2)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterStatic3bitSlicerModeEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_FormatterStatic3bitSlicerModeEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterStatic3bitSlicerModeEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x170U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterStatic3bitSlicerModeEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterStatic3bitSlicerModeEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x170U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterStaticSlicerAgcSyncEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_FormatterStaticSlicerAgcSyncEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_FormatterStaticSlicerAgcSyncEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x170U), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiContinuousMeasDelay_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 16383U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_RssiContinuousMeasDelay_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiContinuousMeasDelay_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiContinuousMeasDelay_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xE + channelId * 44), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xF + channelId * 44), + bfValue >> 8, + 0x3F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiContinuousMeasDelay_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiContinuousMeasDelay_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiContinuousMeasDelay_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xE + channelId * 44U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xF + channelId * 44U), + &bfValueTmp, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiDefaultMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_RssiDefaultMode_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiDefaultMode_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiDefaultMode_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1 + channelId * 44U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiDefaultMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiDefaultMode_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiDefaultMode_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1 + channelId * 44U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_RssiEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiEnable_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x28 + channelId * 44U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiLatchLinearPowerReadback_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_RssiLatchLinearPowerReadback_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiLatchLinearPowerReadback_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiLatchLinearPowerReadback_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x17 + channelId * 44U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiLinearPowerReadback_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint64_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint64_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiLinearPowerReadback_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiLinearPowerReadback_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x18 + channelId * 44U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x19 + channelId * 44U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1A + channelId * 44U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1B + channelId * 44U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 24)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1C + channelId * 44U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 32)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiManualMeas_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_RssiManualMeas_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiManualMeas_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiManualMeas_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1 + channelId * 44U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiManualPause_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_RssiManualPause_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiManualPause_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiManualPause_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x2 + channelId * 44U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMeasDuration0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_RssiMeasDuration0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiMeasDuration0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiMeasDuration0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5 + channelId * 44U), + ((uint32_t) bfValue << 2), + 0x7CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMeasDuration0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiMeasDuration0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiMeasDuration0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5 + channelId * 44U), + &bfValueTmp, + 0x7CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMeasDuration1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_RssiMeasDuration1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiMeasDuration1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiMeasDuration1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x7 + channelId * 44U), + ((uint32_t) bfValue << 2), + 0x7CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMeasDuration1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiMeasDuration1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiMeasDuration1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x7 + channelId * 44U), + &bfValueTmp, + 0x7CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMeasDuration2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_RssiMeasDuration2_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiMeasDuration2_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiMeasDuration2_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x9 + channelId * 44U), + ((uint32_t) bfValue << 2), + 0x7CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMeasDuration2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiMeasDuration2_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiMeasDuration2_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x9 + channelId * 44U), + &bfValueTmp, + 0x7CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMeasDuration3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_RssiMeasDuration3_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiMeasDuration3_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiMeasDuration3_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xB + channelId * 44U), + ((uint32_t) bfValue << 2), + 0x7CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMeasDuration3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiMeasDuration3_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiMeasDuration3_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xB + channelId * 44U), + &bfValueTmp, + 0x7CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_RssiMode_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiMode_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiMode_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x0 + channelId * 44U), + ((uint32_t) bfValue << 4), + 0x30U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiMode_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiMode_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x0 + channelId * 44U), + &bfValueTmp, + 0x30U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMulFactor0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_RssiMulFactor0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiMulFactor0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiMulFactor0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x4 + channelId * 44), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5 + channelId * 44), + bfValue >> 8, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMulFactor0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiMulFactor0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiMulFactor0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x4 + channelId * 44U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5 + channelId * 44U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMulFactor1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_RssiMulFactor1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiMulFactor1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiMulFactor1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x6 + channelId * 44), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x7 + channelId * 44), + bfValue >> 8, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMulFactor1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiMulFactor1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiMulFactor1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x6 + channelId * 44U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x7 + channelId * 44U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMulFactor2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_RssiMulFactor2_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiMulFactor2_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiMulFactor2_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x8 + channelId * 44), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x9 + channelId * 44), + bfValue >> 8, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMulFactor2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiMulFactor2_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiMulFactor2_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x8 + channelId * 44U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x9 + channelId * 44U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMulFactor3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_RssiMulFactor3_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiMulFactor3_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiMulFactor3_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xA + channelId * 44), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xB + channelId * 44), + bfValue >> 8, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMulFactor3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiMulFactor3_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiMulFactor3_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xA + channelId * 44U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xB + channelId * 44U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiPinMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_RssiPinMode_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiPinMode_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiPinMode_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3 + channelId * 44U), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiPinMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiPinMode_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiPinMode_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3 + channelId * 44U), + &bfValueTmp, + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 1); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiResetOnGainChange_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_RssiResetOnGainChange_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiResetOnGainChange_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiResetOnGainChange_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x15 + channelId * 44U), + ((uint32_t) bfValue << 2), + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiResetOnGainChange_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiResetOnGainChange_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiResetOnGainChange_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x15 + channelId * 44U), + &bfValueTmp, + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiRsTriggerSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_RssiRsTriggerSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiRsTriggerSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiRsTriggerSelect_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3 + channelId * 44U), + ((uint32_t) bfValue << 5), + 0xE0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiRsTriggerSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiRsTriggerSelect_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiRsTriggerSelect_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3 + channelId * 44U), + &bfValueTmp, + 0xE0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 5); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiStartDelay_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 8191U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_RssiStartDelay_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiStartDelay_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiStartDelay_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xC + channelId * 44), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xD + channelId * 44), + bfValue >> 8, + 0x1F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiStartDelay_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiStartDelay_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiStartDelay_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xC + channelId * 44U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xD + channelId * 44U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiTriggerSourceSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_RssiTriggerSourceSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiTriggerSourceSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiTriggerSourceSelect_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3 + channelId * 44U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiTriggerSourceSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiTriggerSourceSelect_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiTriggerSourceSelect_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3 + channelId * 44U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiWaitDelay_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 16777215U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcFuncs_RssiWaitDelay_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiWaitDelay_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiWaitDelay_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x10 + channelId * 44), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x11 + channelId * 44), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x12 + channelId * 44), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiWaitDelay_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcFuncs_RssiWaitDelay_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcFuncs_RssiWaitDelay_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x10 + channelId * 44U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x11 + channelId * 44U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x12 + channelId * 44U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cddc_funcs.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cddc_funcs.h new file mode 100644 index 00000000000..a526a83f77a --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cddc_funcs.h @@ -0,0 +1,579 @@ +/** + * \file adrv904x_bf_cddc_funcs.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_CDDC_FUNCS_H_ +#define _ADRV904X_BF_CDDC_FUNCS_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_cddc_funcs_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcJesdClkDiv_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const adrv904x_Bf_CddcFuncs_CddcJesdClkDiv_e bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPeakToPowerMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPeakToPowerMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPower_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerInputSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerInputSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerLargestPeak_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerMeasurementContinueDelayCounter_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerMeasurementContinueDelayCounter_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerMeasurementDuration_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerMeasurementDuration_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerMeasurementEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerMeasurementEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerMeasurementPause_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerMeasurementReadback_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerMeasurementTddModeEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_CddcPowerMeasurementTddModeEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterCarrierSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterCarrierSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterDynamicSlicerAgcSyncEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterDynamicSlicerAgcSyncEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpExponentBits_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpExponentBits_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpFloatDataFormat_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpFloatDataFormat_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpHideLeadingOnes_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpHideLeadingOnes_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpNanEncEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpNanEncEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpRoundMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterFpRoundMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntDataFormat_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntDataFormat_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntDataResolution_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntDataResolution_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntEmbedSlicer_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntEmbedSlicer_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntEmbedSlicerNumber_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntEmbedSlicerNumber_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntEmbedSlicerPos_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntEmbedSlicerPos_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntEvenParity_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntEvenParity_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntParitySupport_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntParitySupport_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntSlicerLsbOnQ_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterIntSlicerLsbOnQ_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterRxMonFormatI0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterRxMonFormatI0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterRxMonFormatI1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterRxMonFormatI1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterRxMonFormatQ0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterRxMonFormatQ0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterRxMonFormatQ1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterRxMonFormatQ1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterStatic3bitSlicerModeEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterStatic3bitSlicerModeEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_FormatterStaticSlicerAgcSyncEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiContinuousMeasDelay_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiContinuousMeasDelay_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiDefaultMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiDefaultMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiLatchLinearPowerReadback_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiLinearPowerReadback_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint64_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiManualMeas_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiManualPause_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMeasDuration0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMeasDuration0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMeasDuration1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMeasDuration1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMeasDuration2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMeasDuration2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMeasDuration3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMeasDuration3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMulFactor0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMulFactor0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMulFactor1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMulFactor1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMulFactor2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMulFactor2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMulFactor3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiMulFactor3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiPinMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiPinMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiResetOnGainChange_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiResetOnGainChange_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiRsTriggerSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiRsTriggerSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiStartDelay_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiStartDelay_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiTriggerSourceSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiTriggerSourceSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiWaitDelay_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncs_RssiWaitDelay_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcFuncsChanAddr_e baseAddr, + uint8_t channelId, + uint32_t* const bfValue); + +#endif // _ADRV904X_BF_CDDC_FUNCS_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cddc_funcs_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cddc_funcs_types.h new file mode 100644 index 00000000000..da54d2653f4 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cddc_funcs_types.h @@ -0,0 +1,75 @@ +/** + * \file adrv904x_bf_cddc_funcs_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_CDDC_FUNCS_TYPES_H_ +#define _ADRV904X_BF_CDDC_FUNCS_TYPES_H_ + +typedef enum adrv904x_BfCddcFuncsChanAddr +{ + ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS = 0x600E0E00, + ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS = 0x601E0E00, + ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS = 0x602E0E00, + ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS = 0x603E0E00, + ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS = 0x604E0E00, + ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS = 0x605E0E00, + ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS = 0x606E0E00, + ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS = 0x607E0E00 +} adrv904x_BfCddcFuncsChanAddr_e; + +/** + * \brief Enumeration for cddcClkDiv + */ + +typedef enum adrv904x_Bf_CddcFuncs_CddcClkDiv +{ + ADRV904X_BF_CDDC_FUNCS_CDDC_CLK_DIV_DIV_BY_1 = 0, /*!< No description provided */ + ADRV904X_BF_CDDC_FUNCS_CDDC_CLK_DIV_DIV_BY_2 = 1, /*!< No description provided */ + ADRV904X_BF_CDDC_FUNCS_CDDC_CLK_DIV_DIV_BY_4 = 2, /*!< No description provided */ + ADRV904X_BF_CDDC_FUNCS_CDDC_CLK_DIV_DIV_BY_8 = 3 /*!< No description provided */ +} adrv904x_Bf_CddcFuncs_CddcClkDiv_e; + +/** + * \brief Enumeration for cddcJesdClkDiv + */ + +typedef enum adrv904x_Bf_CddcFuncs_CddcJesdClkDiv +{ + ADRV904X_BF_CDDC_FUNCS_CDDC_JESD_CLK_DIV_DIV_BY_1 = 0, /*!< No description provided */ + ADRV904X_BF_CDDC_FUNCS_CDDC_JESD_CLK_DIV_DIV_BY_2 = 1, /*!< No description provided */ + ADRV904X_BF_CDDC_FUNCS_CDDC_JESD_CLK_DIV_DIV_BY_4 = 2, /*!< No description provided */ + ADRV904X_BF_CDDC_FUNCS_CDDC_JESD_CLK_DIV_DIV_BY_8 = 3, /*!< No description provided */ + ADRV904X_BF_CDDC_FUNCS_CDDC_JESD_CLK_DIV_DIV_BY_16 = 4, /*!< No description provided */ + ADRV904X_BF_CDDC_FUNCS_CDDC_JESD_CLK_DIV_DIV_BY_32 = 5, /*!< No description provided */ + ADRV904X_BF_CDDC_FUNCS_CDDC_JESD_CLK_DIV_DIV_BY_64 = 6, /*!< No description provided */ + ADRV904X_BF_CDDC_FUNCS_CDDC_JESD_CLK_DIV_DIV_BY_128 = 7 /*!< No description provided */ +} adrv904x_Bf_CddcFuncs_CddcJesdClkDiv_e; + +/** + * \brief Enumeration for cddcPwrmeasClkDiv + */ + +typedef enum adrv904x_Bf_CddcFuncs_CddcPwrmeasClkDiv +{ + ADRV904X_BF_CDDC_FUNCS_CDDC_PWRMEAS_CLK_DIV_DIV_BY_1 = 0, /*!< No description provided */ + ADRV904X_BF_CDDC_FUNCS_CDDC_PWRMEAS_CLK_DIV_DIV_BY_2 = 1, /*!< No description provided */ + ADRV904X_BF_CDDC_FUNCS_CDDC_PWRMEAS_CLK_DIV_DIV_BY_4 = 2, /*!< No description provided */ + ADRV904X_BF_CDDC_FUNCS_CDDC_PWRMEAS_CLK_DIV_DIV_BY_8 = 3, /*!< No description provided */ + ADRV904X_BF_CDDC_FUNCS_CDDC_PWRMEAS_CLK_DIV_DIV_BY_16 = 4, /*!< No description provided */ + ADRV904X_BF_CDDC_FUNCS_CDDC_PWRMEAS_CLK_DIV_DIV_BY_32 = 5, /*!< No description provided */ + ADRV904X_BF_CDDC_FUNCS_CDDC_PWRMEAS_CLK_DIV_DIV_BY_64 = 6, /*!< No description provided */ + ADRV904X_BF_CDDC_FUNCS_CDDC_PWRMEAS_CLK_DIV_DIV_BY_128 = 7 /*!< No description provided */ +} adrv904x_Bf_CddcFuncs_CddcPwrmeasClkDiv_e; + +#endif // _ADRV904X_BF_CDDC_FUNCS_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cddc_hb_dpath.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cddc_hb_dpath.c new file mode 100644 index 00000000000..500db8f527c --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cddc_hb_dpath.c @@ -0,0 +1,3122 @@ +/** + * \file adrv904x_bf_cddc_hb_dpath.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_cddc_hb_dpath.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_CDDC_HB_DPATH + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_BandSource_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const adrv904x_Bf_CddcHbDpath_BandSource_e bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ( + (bfValue != ADRV904X_BF_CDDC_HB_DPATH_BAND_SOURCE_ENUM000 ) && + (bfValue != ADRV904X_BF_CDDC_HB_DPATH_BAND_SOURCE_ENUM001 ) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_BandSource_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_BandSource_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcHbDpath_BandSource_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x0 + channelId * 28U), + (uint32_t) bfValue, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_CarrierEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xE0U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierEnable_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xE0U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 8388607U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_CarrierGain0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierGain0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x140), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x141), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x142), + bfValue >> 16, + 0x7F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierGain0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x140U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x141U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x142U), + &bfValueTmp, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 8388607U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_CarrierGain1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierGain1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x144), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x145), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x146), + bfValue >> 16, + 0x7F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierGain1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x144U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x145U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x146U), + &bfValueTmp, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 8388607U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_CarrierGain2_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierGain2_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x148), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x149), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x14A), + bfValue >> 16, + 0x7F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierGain2_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x148U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x149U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x14AU), + &bfValueTmp, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 8388607U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_CarrierGain3_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierGain3_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x14C), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x14D), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x14E), + bfValue >> 16, + 0x7F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierGain3_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x14CU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x14DU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x14EU), + &bfValueTmp, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 8388607U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_CarrierGain4_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierGain4_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x150), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x151), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x152), + bfValue >> 16, + 0x7F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain4_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierGain4_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x150U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x151U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x152U), + &bfValueTmp, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 8388607U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_CarrierGain5_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierGain5_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x154), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x155), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x156), + bfValue >> 16, + 0x7F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain5_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierGain5_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x154U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x155U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x156U), + &bfValueTmp, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 8388607U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_CarrierGain6_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierGain6_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x158), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x159), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x15A), + bfValue >> 16, + 0x7F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain6_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierGain6_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x158U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x159U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x15AU), + &bfValueTmp, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 8388607U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_CarrierGain7_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierGain7_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x15C), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x15D), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x15E), + bfValue >> 16, + 0x7F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain7_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierGain7_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x15CU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x15DU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x15EU), + &bfValueTmp, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGainEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_CarrierGainEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierGainEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcHbDpath_CarrierGainEnable_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x2 + channelId * 28U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierSelect0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_CarrierSelect0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierSelect0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x138U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierSelect1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_CarrierSelect1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierSelect1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x138U), + ((uint32_t) bfValue << 4), + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierSelect2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_CarrierSelect2_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierSelect2_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x139U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierSelect3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_CarrierSelect3_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierSelect3_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x139U), + ((uint32_t) bfValue << 4), + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierSelect4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_CarrierSelect4_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierSelect4_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x13AU), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierSelect5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_CarrierSelect5_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierSelect5_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x13AU), + ((uint32_t) bfValue << 4), + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierSelect6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_CarrierSelect6_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierSelect6_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x13BU), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierSelect7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_CarrierSelect7_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_CarrierSelect7_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x13BU), + ((uint32_t) bfValue << 4), + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_DaisyChainEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_DaisyChainEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_DaisyChainEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x13EU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_DecRate_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const adrv904x_Bf_CddcHbDpath_DecRate_e bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ( + (bfValue != ADRV904X_BF_CDDC_HB_DPATH_DEC_RATE_ENUM000 ) && + (bfValue != ADRV904X_BF_CDDC_HB_DPATH_DEC_RATE_ENUM001 ) && + (bfValue != ADRV904X_BF_CDDC_HB_DPATH_DEC_RATE_ENUM002 ) && + (bfValue != ADRV904X_BF_CDDC_HB_DPATH_DEC_RATE_ENUM003 ) && + (bfValue != ADRV904X_BF_CDDC_HB_DPATH_DEC_RATE_ENUM004 ) && + (bfValue != ADRV904X_BF_CDDC_HB_DPATH_DEC_RATE_ENUM005 ) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_DecRate_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_DecRate_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcHbDpath_DecRate_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x0 + channelId * 28U), + ((uint32_t) bfValue << 2), + 0x3CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_DelayCmpEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_DelayCmpEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_DelayCmpEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x13CU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_DelayMemEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_DelayMemEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_DelayMemEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x13DU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_FreqKhz_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 16777215U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_FreqKhz_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_FreqKhz_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcHbDpath_FreqKhz_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x10 + channelId * 28), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x11 + channelId * 28), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x12 + channelId * 28), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_InterleaverMaxSlot_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 127U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_InterleaverMaxSlot_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_InterleaverMaxSlot_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xFCU), + (uint32_t) bfValue, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_InterleaverSlotValidLower_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 4294967295U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_InterleaverSlotValidLower_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_InterleaverSlotValidLower_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x120), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x121), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x122), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x123), + bfValue >> 24, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_InterleaverSlotValidUpper_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 4294967295U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_InterleaverSlotValidUpper_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_InterleaverSlotValidUpper_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x124), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x125), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x126), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x127), + bfValue >> 24, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_MixerEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_MixerEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_MixerEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcHbDpath_MixerEn_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1 + channelId * 28U), + ((uint32_t) bfValue << 2), + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_NcoEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_NcoEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_NcoEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcHbDpath_NcoEnable_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x13 + channelId * 28U), + ((uint32_t) bfValue << 2), + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_NcoFtwUpdate_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_NcoFtwUpdate_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_NcoFtwUpdate_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcHbDpath_NcoFtwUpdate_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x13 + channelId * 28U), + ((uint32_t) bfValue << 3), + 0x8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_OneMsClocks_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 16777215U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_OneMsClocks_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_OneMsClocks_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcHbDpath_OneMsClocks_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x14 + channelId * 28), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x15 + channelId * 28), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x16 + channelId * 28), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_UpsamplerRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const adrv904x_Bf_CddcHbDpath_UpsamplerRatio_e bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ( + (bfValue != ADRV904X_BF_CDDC_HB_DPATH_UPSAMPLER_RATIO_ENUM000 ) && + (bfValue != ADRV904X_BF_CDDC_HB_DPATH_UPSAMPLER_RATIO_ENUM001 ) && + (bfValue != ADRV904X_BF_CDDC_HB_DPATH_UPSAMPLER_RATIO_ENUM002 ) && + (bfValue != ADRV904X_BF_CDDC_HB_DPATH_UPSAMPLER_RATIO_ENUM003 ) && + (bfValue != ADRV904X_BF_CDDC_HB_DPATH_UPSAMPLER_RATIO_ENUM004 ) && + (bfValue != ADRV904X_BF_CDDC_HB_DPATH_UPSAMPLER_RATIO_ENUM005 ) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CddcHbDpath_UpsamplerRatio_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CddcHbDpath_UpsamplerRatio_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CddcHbDpath_UpsamplerRatio_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x0 + channelId * 28), + bfValue << 6, + 0xC0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1 + channelId * 28), + bfValue >> 2, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cddc_hb_dpath.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cddc_hb_dpath.h new file mode 100644 index 00000000000..c7024643419 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cddc_hb_dpath.h @@ -0,0 +1,245 @@ +/** + * \file adrv904x_bf_cddc_hb_dpath.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_CDDC_HB_DPATH_H_ +#define _ADRV904X_BF_CDDC_HB_DPATH_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_cddc_hb_dpath_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_BandSource_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const adrv904x_Bf_CddcHbDpath_BandSource_e bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain4_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain5_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain6_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGain7_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierGainEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierSelect0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierSelect1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierSelect2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierSelect3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierSelect4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierSelect5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierSelect6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_CarrierSelect7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_DaisyChainEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_DecRate_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const adrv904x_Bf_CddcHbDpath_DecRate_e bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_DelayCmpEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_DelayMemEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_FreqKhz_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_InterleaverMaxSlot_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_InterleaverSlotValidLower_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_InterleaverSlotValidUpper_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_MixerEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_NcoEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_NcoFtwUpdate_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_OneMsClocks_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpath_UpsamplerRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCddcHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const adrv904x_Bf_CddcHbDpath_UpsamplerRatio_e bfValue); + +#endif // _ADRV904X_BF_CDDC_HB_DPATH_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cddc_hb_dpath_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cddc_hb_dpath_types.h new file mode 100644 index 00000000000..be1ab19a477 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cddc_hb_dpath_types.h @@ -0,0 +1,213 @@ +/** + * \file adrv904x_bf_cddc_hb_dpath_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_CDDC_HB_DPATH_TYPES_H_ +#define _ADRV904X_BF_CDDC_HB_DPATH_TYPES_H_ + +typedef enum adrv904x_BfCddcHbDpathChanAddr +{ + ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH = 0x600E0C00, + ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH = 0x601E0C00, + ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH = 0x602E0C00, + ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH = 0x603E0C00, + ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH = 0x604E0C00, + ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH = 0x605E0C00, + ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH = 0x606E0C00, + ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH = 0x607E0C00 +} adrv904x_BfCddcHbDpathChanAddr_e; + +/** + * \brief Enumeration for bandSource + */ + +typedef enum adrv904x_Bf_CddcHbDpath_BandSource +{ + ADRV904X_BF_CDDC_HB_DPATH_BAND_SOURCE_ENUM000 = 0, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_BAND_SOURCE_ENUM001 = 1 /*!< No description provided */ +} adrv904x_Bf_CddcHbDpath_BandSource_e; + +/** + * \brief Enumeration for cddcClkToBand0Rate + */ + +typedef enum adrv904x_Bf_CddcHbDpath_CddcClkToBand0Rate +{ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM000 = 0, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM001 = 1, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM002 = 2, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM003 = 3, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM004 = 4, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM005 = 5, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM006 = 6, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM007 = 7, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM008 = 8, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM009 = 9, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM010 = 10, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM011 = 11, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM012 = 12, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM013 = 13, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM014 = 14, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM015 = 15, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM016 = 16, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM017 = 17, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM018 = 18, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM019 = 19, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM020 = 20, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM021 = 21, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM022 = 22, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM023 = 23, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM024 = 24, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM025 = 25, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM026 = 26, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM027 = 27, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM028 = 28, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM029 = 29, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM030 = 30, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM031 = 31, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM032 = 32, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM033 = 33, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM034 = 34, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM035 = 35, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM036 = 36, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM037 = 37, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM038 = 38, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM039 = 39, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM040 = 40, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM041 = 41, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM042 = 42, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM043 = 43, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM044 = 44, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM045 = 45, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM046 = 46, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM047 = 47, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM048 = 48, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM049 = 49, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM050 = 50, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM051 = 51, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM052 = 52, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM053 = 53, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM054 = 54, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM055 = 55, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM056 = 56, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM057 = 57, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM058 = 58, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM059 = 59, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM060 = 60, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM061 = 61, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM062 = 62, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND0_RATE_ENUM063 = 63 /*!< No description provided */ +} adrv904x_Bf_CddcHbDpath_CddcClkToBand0Rate_e; + +/** + * \brief Enumeration for cddcClkToBand1Rate + */ + +typedef enum adrv904x_Bf_CddcHbDpath_CddcClkToBand1Rate +{ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM000 = 0, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM001 = 1, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM002 = 2, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM003 = 3, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM004 = 4, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM005 = 5, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM006 = 6, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM007 = 7, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM008 = 8, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM009 = 9, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM010 = 10, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM011 = 11, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM012 = 12, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM013 = 13, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM014 = 14, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM015 = 15, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM016 = 16, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM017 = 17, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM018 = 18, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM019 = 19, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM020 = 20, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM021 = 21, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM022 = 22, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM023 = 23, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM024 = 24, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM025 = 25, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM026 = 26, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM027 = 27, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM028 = 28, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM029 = 29, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM030 = 30, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM031 = 31, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM032 = 32, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM033 = 33, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM034 = 34, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM035 = 35, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM036 = 36, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM037 = 37, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM038 = 38, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM039 = 39, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM040 = 40, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM041 = 41, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM042 = 42, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM043 = 43, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM044 = 44, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM045 = 45, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM046 = 46, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM047 = 47, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM048 = 48, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM049 = 49, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM050 = 50, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM051 = 51, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM052 = 52, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM053 = 53, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM054 = 54, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM055 = 55, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM056 = 56, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM057 = 57, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM058 = 58, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM059 = 59, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM060 = 60, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM061 = 61, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM062 = 62, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_CDDC_CLK_TO_BAND1_RATE_ENUM063 = 63 /*!< No description provided */ +} adrv904x_Bf_CddcHbDpath_CddcClkToBand1Rate_e; + +/** + * \brief Enumeration for decRate + */ + +typedef enum adrv904x_Bf_CddcHbDpath_DecRate +{ + ADRV904X_BF_CDDC_HB_DPATH_DEC_RATE_ENUM000 = 0, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_DEC_RATE_ENUM001 = 1, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_DEC_RATE_ENUM002 = 2, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_DEC_RATE_ENUM003 = 3, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_DEC_RATE_ENUM004 = 4, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_DEC_RATE_ENUM005 = 5 /*!< No description provided */ +} adrv904x_Bf_CddcHbDpath_DecRate_e; + +/** + * \brief Enumeration for upsamplerRatio + */ + +typedef enum adrv904x_Bf_CddcHbDpath_UpsamplerRatio +{ + ADRV904X_BF_CDDC_HB_DPATH_UPSAMPLER_RATIO_ENUM000 = 0, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_UPSAMPLER_RATIO_ENUM001 = 1, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_UPSAMPLER_RATIO_ENUM002 = 2, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_UPSAMPLER_RATIO_ENUM003 = 3, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_UPSAMPLER_RATIO_ENUM004 = 4, /*!< No description provided */ + ADRV904X_BF_CDDC_HB_DPATH_UPSAMPLER_RATIO_ENUM005 = 5 /*!< No description provided */ +} adrv904x_Bf_CddcHbDpath_UpsamplerRatio_e; + +#endif // _ADRV904X_BF_CDDC_HB_DPATH_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cduc_funcs.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cduc_funcs.c new file mode 100644 index 00000000000..831f6248f45 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cduc_funcs.c @@ -0,0 +1,89 @@ +/** + * \file adrv904x_bf_cduc_funcs.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_cduc_funcs.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_CDUC_FUNCS + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducFuncs_CducJesdClkDiv_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducFuncsChanAddr_e baseAddr, + const adrv904x_Bf_CducFuncs_CducJesdClkDiv_e bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ( + (bfValue != ADRV904X_BF_CDUC_FUNCS_CDUC_JESD_CLK_DIV_DIV_BY_1 ) && + (bfValue != ADRV904X_BF_CDUC_FUNCS_CDUC_JESD_CLK_DIV_DIV_BY_2 ) && + (bfValue != ADRV904X_BF_CDUC_FUNCS_CDUC_JESD_CLK_DIV_DIV_BY_4 ) && + (bfValue != ADRV904X_BF_CDUC_FUNCS_CDUC_JESD_CLK_DIV_DIV_BY_8 ) && + (bfValue != ADRV904X_BF_CDUC_FUNCS_CDUC_JESD_CLK_DIV_DIV_BY_16 ) && + (bfValue != ADRV904X_BF_CDUC_FUNCS_CDUC_JESD_CLK_DIV_DIV_BY_32 ) && + (bfValue != ADRV904X_BF_CDUC_FUNCS_CDUC_JESD_CLK_DIV_DIV_BY_64 ) && + (bfValue != ADRV904X_BF_CDUC_FUNCS_CDUC_JESD_CLK_DIV_DIV_BY_128 ) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducFuncs_CducJesdClkDiv_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducFuncs_CducJesdClkDiv_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1B0U), + ((uint32_t) bfValue << 4), + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cduc_funcs.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cduc_funcs.h new file mode 100644 index 00000000000..3553a031c1c --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cduc_funcs.h @@ -0,0 +1,36 @@ +/** + * \file adrv904x_bf_cduc_funcs.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_CDUC_FUNCS_H_ +#define _ADRV904X_BF_CDUC_FUNCS_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_cduc_funcs_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducFuncs_CducJesdClkDiv_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducFuncsChanAddr_e baseAddr, + const adrv904x_Bf_CducFuncs_CducJesdClkDiv_e bfValue); + +#endif // _ADRV904X_BF_CDUC_FUNCS_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cduc_funcs_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cduc_funcs_types.h new file mode 100644 index 00000000000..9004908f7c9 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cduc_funcs_types.h @@ -0,0 +1,75 @@ +/** + * \file adrv904x_bf_cduc_funcs_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_CDUC_FUNCS_TYPES_H_ +#define _ADRV904X_BF_CDUC_FUNCS_TYPES_H_ + +typedef enum adrv904x_BfCducFuncsChanAddr +{ + ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_FUNCS = 0x608B0E00, + ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_FUNCS = 0x609B0E00, + ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_FUNCS = 0x60AB0E00, + ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_FUNCS = 0x60BB0E00, + ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_FUNCS = 0x60CB0E00, + ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_FUNCS = 0x60DB0E00, + ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_FUNCS = 0x60EB0E00, + ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_FUNCS = 0x60FB0E00 +} adrv904x_BfCducFuncsChanAddr_e; + +/** + * \brief Enumeration for cducClkDiv + */ + +typedef enum adrv904x_Bf_CducFuncs_CducClkDiv +{ + ADRV904X_BF_CDUC_FUNCS_CDUC_CLK_DIV_DIV_BY_1 = 0, /*!< No description provided */ + ADRV904X_BF_CDUC_FUNCS_CDUC_CLK_DIV_DIV_BY_2 = 1, /*!< No description provided */ + ADRV904X_BF_CDUC_FUNCS_CDUC_CLK_DIV_DIV_BY_4 = 2, /*!< No description provided */ + ADRV904X_BF_CDUC_FUNCS_CDUC_CLK_DIV_DIV_BY_8 = 3 /*!< No description provided */ +} adrv904x_Bf_CducFuncs_CducClkDiv_e; + +/** + * \brief Enumeration for cducJesdClkDiv + */ + +typedef enum adrv904x_Bf_CducFuncs_CducJesdClkDiv +{ + ADRV904X_BF_CDUC_FUNCS_CDUC_JESD_CLK_DIV_DIV_BY_1 = 0, /*!< No description provided */ + ADRV904X_BF_CDUC_FUNCS_CDUC_JESD_CLK_DIV_DIV_BY_2 = 1, /*!< No description provided */ + ADRV904X_BF_CDUC_FUNCS_CDUC_JESD_CLK_DIV_DIV_BY_4 = 2, /*!< No description provided */ + ADRV904X_BF_CDUC_FUNCS_CDUC_JESD_CLK_DIV_DIV_BY_8 = 3, /*!< No description provided */ + ADRV904X_BF_CDUC_FUNCS_CDUC_JESD_CLK_DIV_DIV_BY_16 = 4, /*!< No description provided */ + ADRV904X_BF_CDUC_FUNCS_CDUC_JESD_CLK_DIV_DIV_BY_32 = 5, /*!< No description provided */ + ADRV904X_BF_CDUC_FUNCS_CDUC_JESD_CLK_DIV_DIV_BY_64 = 6, /*!< No description provided */ + ADRV904X_BF_CDUC_FUNCS_CDUC_JESD_CLK_DIV_DIV_BY_128 = 7 /*!< No description provided */ +} adrv904x_Bf_CducFuncs_CducJesdClkDiv_e; + +/** + * \brief Enumeration for cducPwrmeasClkDiv + */ + +typedef enum adrv904x_Bf_CducFuncs_CducPwrmeasClkDiv +{ + ADRV904X_BF_CDUC_FUNCS_CDUC_PWRMEAS_CLK_DIV_DIV_BY_1 = 0, /*!< No description provided */ + ADRV904X_BF_CDUC_FUNCS_CDUC_PWRMEAS_CLK_DIV_DIV_BY_2 = 1, /*!< No description provided */ + ADRV904X_BF_CDUC_FUNCS_CDUC_PWRMEAS_CLK_DIV_DIV_BY_4 = 2, /*!< No description provided */ + ADRV904X_BF_CDUC_FUNCS_CDUC_PWRMEAS_CLK_DIV_DIV_BY_8 = 3, /*!< No description provided */ + ADRV904X_BF_CDUC_FUNCS_CDUC_PWRMEAS_CLK_DIV_DIV_BY_16 = 4, /*!< No description provided */ + ADRV904X_BF_CDUC_FUNCS_CDUC_PWRMEAS_CLK_DIV_DIV_BY_32 = 5, /*!< No description provided */ + ADRV904X_BF_CDUC_FUNCS_CDUC_PWRMEAS_CLK_DIV_DIV_BY_64 = 6, /*!< No description provided */ + ADRV904X_BF_CDUC_FUNCS_CDUC_PWRMEAS_CLK_DIV_DIV_BY_128 = 7 /*!< No description provided */ +} adrv904x_Bf_CducFuncs_CducPwrmeasClkDiv_e; + +#endif // _ADRV904X_BF_CDUC_FUNCS_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cduc_hb_dpath.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cduc_hb_dpath.c new file mode 100644 index 00000000000..4bb5e7557c8 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cduc_hb_dpath.c @@ -0,0 +1,3686 @@ +/** + * \file adrv904x_bf_cduc_hb_dpath.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_cduc_hb_dpath.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_CDUC_HB_DPATH + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_BandDest_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const adrv904x_Bf_CducHbDpath_BandDest_e bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ( + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_BAND_DEST_ENUM000 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_BAND_DEST_ENUM001 ) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_BandDest_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_BandDest_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CducHbDpath_BandDest_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x0 + channelId * 32U), + (uint32_t) bfValue, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 8388607U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_CarrierGain0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierGain0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x160), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x161), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x162), + bfValue >> 16, + 0x7F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierGain0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x160U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x161U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x162U), + &bfValueTmp, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 8388607U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_CarrierGain1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierGain1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x164), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x165), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x166), + bfValue >> 16, + 0x7F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierGain1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x164U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x165U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x166U), + &bfValueTmp, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 8388607U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_CarrierGain2_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierGain2_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x168), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x169), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x16A), + bfValue >> 16, + 0x7F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierGain2_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x168U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x169U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x16AU), + &bfValueTmp, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 8388607U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_CarrierGain3_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierGain3_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x16C), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x16D), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x16E), + bfValue >> 16, + 0x7F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierGain3_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x16CU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x16DU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x16EU), + &bfValueTmp, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 8388607U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_CarrierGain4_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierGain4_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x170), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x171), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x172), + bfValue >> 16, + 0x7F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain4_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierGain4_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x170U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x171U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x172U), + &bfValueTmp, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 8388607U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_CarrierGain5_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierGain5_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x174), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x175), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x176), + bfValue >> 16, + 0x7F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain5_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierGain5_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x174U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x175U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x176U), + &bfValueTmp, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 8388607U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_CarrierGain6_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierGain6_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x178), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x179), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x17A), + bfValue >> 16, + 0x7F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain6_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierGain6_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x178U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x179U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x17AU), + &bfValueTmp, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 8388607U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_CarrierGain7_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierGain7_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x17C), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x17D), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x17E), + bfValue >> 16, + 0x7F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain7_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierGain7_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x17CU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x17DU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x17EU), + &bfValueTmp, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGainEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_CarrierGainEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierGainEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CducHbDpath_CarrierGainEnable_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x2 + channelId * 32U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierSelect0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_CarrierSelect0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierSelect0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x158U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierSelect1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_CarrierSelect1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierSelect1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x158U), + ((uint32_t) bfValue << 4), + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierSelect2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_CarrierSelect2_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierSelect2_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x159U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierSelect3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_CarrierSelect3_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierSelect3_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x159U), + ((uint32_t) bfValue << 4), + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierSelect4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_CarrierSelect4_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierSelect4_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x15AU), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierSelect5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_CarrierSelect5_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierSelect5_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x15AU), + ((uint32_t) bfValue << 4), + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierSelect6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_CarrierSelect6_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierSelect6_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x15BU), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierSelect7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_CarrierSelect7_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrierSelect7_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x15BU), + ((uint32_t) bfValue << 4), + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrBand0Attn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_CarrBand0Attn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrBand0Attn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x180U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrBand0Attn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrBand0Attn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x180U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrBand1Attn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_CarrBand1Attn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrBand1Attn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x182U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrBand1Attn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CarrBand1Attn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x182U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CducCarrierEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_CducCarrierEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CducCarrierEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x100U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CducCarrierEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CducCarrierEnable_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x100U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CducClkToCarrierRate_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const adrv904x_Bf_CducHbDpath_CducClkToCarrierRate_e bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ( + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM000 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM001 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM002 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM003 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM004 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM005 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM006 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM007 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM008 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM009 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM010 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM011 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM012 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM013 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM014 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM015 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM016 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM017 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM018 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM019 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM020 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM021 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM022 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM023 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM024 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM025 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM026 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM027 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM028 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM029 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM030 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM031 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM032 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM033 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM034 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM035 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM036 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM037 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM038 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM039 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM040 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM041 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM042 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM043 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM044 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM045 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM046 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM047 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM048 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM049 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM050 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM051 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM052 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM053 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM054 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM055 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM056 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM057 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM058 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM059 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM060 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM061 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM062 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM063 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM064 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM065 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM066 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM067 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM068 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM069 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM070 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM071 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM072 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM073 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM074 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM075 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM076 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM077 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM078 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM079 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM080 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM081 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM082 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM083 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM084 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM085 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM086 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM087 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM088 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM089 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM090 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM091 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM092 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM093 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM094 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM095 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM096 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM097 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM098 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM099 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM100 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM101 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM102 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM103 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM104 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM105 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM106 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM107 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM108 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM109 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM110 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM111 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM112 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM113 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM114 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM115 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM116 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM117 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM118 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM119 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM120 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM121 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM122 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM123 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM124 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM125 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM126 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM127 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM128 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM129 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM130 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM131 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM132 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM133 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM134 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM135 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM136 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM137 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM138 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM139 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM140 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM141 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM142 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM143 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM144 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM145 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM146 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM147 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM148 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM149 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM150 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM151 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM152 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM153 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM154 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM155 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM156 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM157 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM158 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM159 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM160 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM161 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM162 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM163 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM164 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM165 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM166 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM167 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM168 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM169 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM170 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM171 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM172 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM173 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM174 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM175 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM176 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM177 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM178 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM179 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM180 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM181 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM182 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM183 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM184 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM185 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM186 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM187 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM188 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM189 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM190 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM191 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM192 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM193 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM194 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM195 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM196 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM197 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM198 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM199 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM200 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM201 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM202 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM203 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM204 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM205 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM206 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM207 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM208 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM209 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM210 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM211 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM212 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM213 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM214 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM215 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM216 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM217 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM218 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM219 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM220 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM221 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM222 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM223 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM224 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM225 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM226 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM227 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM228 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM229 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM230 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM231 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM232 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM233 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM234 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM235 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM236 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM237 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM238 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM239 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM240 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM241 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM242 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM243 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM244 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM245 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM246 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM247 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM248 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM249 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM250 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM251 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM252 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM253 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM254 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM255 ) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_CducClkToCarrierRate_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_CducClkToCarrierRate_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CducHbDpath_CducClkToCarrierRate_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1C + channelId * 32U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_DaisyChainEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_DaisyChainEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_DaisyChainEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x15EU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_DeinterleaverMaxSlot_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 127U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_DeinterleaverMaxSlot_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_DeinterleaverMaxSlot_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x11CU), + (uint32_t) bfValue, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_DeinterleaverSlotValidLower_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 4294967295U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_DeinterleaverSlotValidLower_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_DeinterleaverSlotValidLower_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x144), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x145), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x146), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x147), + bfValue >> 24, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_DeinterleaverSlotValidUpper_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 4294967295U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_DeinterleaverSlotValidUpper_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_DeinterleaverSlotValidUpper_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x140), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x141), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x142), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x143), + bfValue >> 24, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_DelayCompEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_DelayCompEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_DelayCompEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x15CU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_DelayMemEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_DelayMemEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_DelayMemEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x15DU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_DownsamplerRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const adrv904x_Bf_CducHbDpath_DownsamplerRatio_e bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ( + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_DOWNSAMPLER_RATIO_ENUM000 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_DOWNSAMPLER_RATIO_ENUM001 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_DOWNSAMPLER_RATIO_ENUM002 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_DOWNSAMPLER_RATIO_ENUM003 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_DOWNSAMPLER_RATIO_ENUM004 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_DOWNSAMPLER_RATIO_ENUM005 ) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_DownsamplerRatio_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_DownsamplerRatio_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CducHbDpath_DownsamplerRatio_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x0 + channelId * 32), + bfValue << 6, + 0xC0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1 + channelId * 32), + bfValue >> 2, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_FreqKhz_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 16777215U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_FreqKhz_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_FreqKhz_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CducHbDpath_FreqKhz_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x10 + channelId * 32), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x11 + channelId * 32), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x12 + channelId * 32), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_IntRate_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const adrv904x_Bf_CducHbDpath_IntRate_e bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ( + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_INT_RATE_ENUM000 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_INT_RATE_ENUM001 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_INT_RATE_ENUM002 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_INT_RATE_ENUM003 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_INT_RATE_ENUM004 ) && + (bfValue != ADRV904X_BF_CDUC_HB_DPATH_INT_RATE_ENUM005 ) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_IntRate_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_IntRate_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CducHbDpath_IntRate_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x0 + channelId * 32U), + ((uint32_t) bfValue << 2), + 0x3CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_MixerEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_MixerEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_MixerEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CducHbDpath_MixerEn_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1 + channelId * 32U), + ((uint32_t) bfValue << 2), + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_NcoEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_NcoEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_NcoEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CducHbDpath_NcoEnable_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x13 + channelId * 32U), + ((uint32_t) bfValue << 2), + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_NcoFtwUpdate_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_NcoFtwUpdate_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_NcoFtwUpdate_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CducHbDpath_NcoFtwUpdate_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x13 + channelId * 32U), + ((uint32_t) bfValue << 3), + 0x8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_OneMsClocks_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 16777215U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_CducHbDpath_OneMsClocks_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_CducHbDpath_OneMsClocks_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_CducHbDpath_OneMsClocks_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x14 + channelId * 32), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x15 + channelId * 32), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x16 + channelId * 32), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cduc_hb_dpath.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cduc_hb_dpath.h new file mode 100644 index 00000000000..72517c0f337 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cduc_hb_dpath.h @@ -0,0 +1,271 @@ +/** + * \file adrv904x_bf_cduc_hb_dpath.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_CDUC_HB_DPATH_H_ +#define _ADRV904X_BF_CDUC_HB_DPATH_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_cduc_hb_dpath_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_BandDest_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const adrv904x_Bf_CducHbDpath_BandDest_e bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain4_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain5_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain6_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGain7_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierGainEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierSelect0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierSelect1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierSelect2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierSelect3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierSelect4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierSelect5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierSelect6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrierSelect7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrBand0Attn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrBand0Attn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrBand1Attn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CarrBand1Attn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CducCarrierEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CducCarrierEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_CducClkToCarrierRate_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const adrv904x_Bf_CducHbDpath_CducClkToCarrierRate_e bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_DaisyChainEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_DeinterleaverMaxSlot_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_DeinterleaverSlotValidLower_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_DeinterleaverSlotValidUpper_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_DelayCompEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_DelayMemEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_DownsamplerRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const adrv904x_Bf_CducHbDpath_DownsamplerRatio_e bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_FreqKhz_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_IntRate_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const adrv904x_Bf_CducHbDpath_IntRate_e bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_MixerEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_NcoEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_NcoFtwUpdate_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpath_OneMsClocks_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCducHbDpathChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue); + +#endif // _ADRV904X_BF_CDUC_HB_DPATH_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cduc_hb_dpath_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cduc_hb_dpath_types.h new file mode 100644 index 00000000000..c805214d3d1 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_cduc_hb_dpath_types.h @@ -0,0 +1,477 @@ +/** + * \file adrv904x_bf_cduc_hb_dpath_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_CDUC_HB_DPATH_TYPES_H_ +#define _ADRV904X_BF_CDUC_HB_DPATH_TYPES_H_ + +typedef enum adrv904x_BfCducHbDpathChanAddr +{ + ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH = 0x608B0C00, + ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH = 0x609B0C00, + ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH = 0x60AB0C00, + ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH = 0x60BB0C00, + ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH = 0x60CB0C00, + ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH = 0x60DB0C00, + ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH = 0x60EB0C00, + ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH = 0x60FB0C00 +} adrv904x_BfCducHbDpathChanAddr_e; + +/** + * \brief Enumeration for bandDest + */ + +typedef enum adrv904x_Bf_CducHbDpath_BandDest +{ + ADRV904X_BF_CDUC_HB_DPATH_BAND_DEST_ENUM000 = 0, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_BAND_DEST_ENUM001 = 1 /*!< No description provided */ +} adrv904x_Bf_CducHbDpath_BandDest_e; + +/** + * \brief Enumeration for cducClkToBand0Rate + */ + +typedef enum adrv904x_Bf_CducHbDpath_CducClkToBand0Rate +{ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM000 = 0, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM001 = 1, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM002 = 2, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM003 = 3, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM004 = 4, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM005 = 5, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM006 = 6, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM007 = 7, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM008 = 8, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM009 = 9, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM010 = 10, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM011 = 11, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM012 = 12, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM013 = 13, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM014 = 14, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM015 = 15, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM016 = 16, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM017 = 17, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM018 = 18, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM019 = 19, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM020 = 20, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM021 = 21, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM022 = 22, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM023 = 23, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM024 = 24, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM025 = 25, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM026 = 26, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM027 = 27, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM028 = 28, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM029 = 29, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM030 = 30, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM031 = 31, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM032 = 32, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM033 = 33, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM034 = 34, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM035 = 35, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM036 = 36, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM037 = 37, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM038 = 38, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM039 = 39, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM040 = 40, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM041 = 41, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM042 = 42, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM043 = 43, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM044 = 44, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM045 = 45, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM046 = 46, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM047 = 47, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM048 = 48, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM049 = 49, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM050 = 50, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM051 = 51, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM052 = 52, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM053 = 53, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM054 = 54, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM055 = 55, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM056 = 56, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM057 = 57, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM058 = 58, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM059 = 59, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM060 = 60, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM061 = 61, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM062 = 62, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND0_RATE_ENUM063 = 63 /*!< No description provided */ +} adrv904x_Bf_CducHbDpath_CducClkToBand0Rate_e; + +/** + * \brief Enumeration for cducClkToBand1Rate + */ + +typedef enum adrv904x_Bf_CducHbDpath_CducClkToBand1Rate +{ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM000 = 0, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM001 = 1, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM002 = 2, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM003 = 3, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM004 = 4, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM005 = 5, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM006 = 6, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM007 = 7, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM008 = 8, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM009 = 9, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM010 = 10, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM011 = 11, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM012 = 12, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM013 = 13, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM014 = 14, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM015 = 15, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM016 = 16, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM017 = 17, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM018 = 18, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM019 = 19, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM020 = 20, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM021 = 21, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM022 = 22, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM023 = 23, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM024 = 24, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM025 = 25, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM026 = 26, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM027 = 27, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM028 = 28, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM029 = 29, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM030 = 30, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM031 = 31, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM032 = 32, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM033 = 33, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM034 = 34, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM035 = 35, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM036 = 36, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM037 = 37, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM038 = 38, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM039 = 39, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM040 = 40, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM041 = 41, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM042 = 42, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM043 = 43, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM044 = 44, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM045 = 45, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM046 = 46, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM047 = 47, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM048 = 48, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM049 = 49, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM050 = 50, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM051 = 51, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM052 = 52, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM053 = 53, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM054 = 54, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM055 = 55, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM056 = 56, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM057 = 57, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM058 = 58, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM059 = 59, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM060 = 60, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM061 = 61, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM062 = 62, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_BAND1_RATE_ENUM063 = 63 /*!< No description provided */ +} adrv904x_Bf_CducHbDpath_CducClkToBand1Rate_e; + +/** + * \brief Enumeration for cducClkToCarrierRate + */ + +typedef enum adrv904x_Bf_CducHbDpath_CducClkToCarrierRate +{ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM000 = 0, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM001 = 1, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM002 = 2, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM003 = 3, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM004 = 4, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM005 = 5, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM006 = 6, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM007 = 7, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM008 = 8, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM009 = 9, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM010 = 10, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM011 = 11, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM012 = 12, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM013 = 13, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM014 = 14, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM015 = 15, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM016 = 16, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM017 = 17, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM018 = 18, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM019 = 19, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM020 = 20, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM021 = 21, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM022 = 22, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM023 = 23, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM024 = 24, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM025 = 25, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM026 = 26, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM027 = 27, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM028 = 28, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM029 = 29, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM030 = 30, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM031 = 31, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM032 = 32, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM033 = 33, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM034 = 34, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM035 = 35, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM036 = 36, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM037 = 37, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM038 = 38, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM039 = 39, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM040 = 40, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM041 = 41, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM042 = 42, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM043 = 43, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM044 = 44, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM045 = 45, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM046 = 46, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM047 = 47, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM048 = 48, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM049 = 49, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM050 = 50, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM051 = 51, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM052 = 52, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM053 = 53, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM054 = 54, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM055 = 55, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM056 = 56, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM057 = 57, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM058 = 58, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM059 = 59, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM060 = 60, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM061 = 61, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM062 = 62, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM063 = 63, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM064 = 64, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM065 = 65, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM066 = 66, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM067 = 67, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM068 = 68, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM069 = 69, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM070 = 70, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM071 = 71, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM072 = 72, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM073 = 73, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM074 = 74, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM075 = 75, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM076 = 76, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM077 = 77, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM078 = 78, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM079 = 79, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM080 = 80, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM081 = 81, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM082 = 82, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM083 = 83, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM084 = 84, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM085 = 85, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM086 = 86, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM087 = 87, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM088 = 88, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM089 = 89, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM090 = 90, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM091 = 91, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM092 = 92, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM093 = 93, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM094 = 94, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM095 = 95, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM096 = 96, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM097 = 97, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM098 = 98, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM099 = 99, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM100 = 100, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM101 = 101, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM102 = 102, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM103 = 103, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM104 = 104, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM105 = 105, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM106 = 106, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM107 = 107, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM108 = 108, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM109 = 109, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM110 = 110, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM111 = 111, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM112 = 112, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM113 = 113, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM114 = 114, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM115 = 115, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM116 = 116, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM117 = 117, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM118 = 118, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM119 = 119, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM120 = 120, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM121 = 121, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM122 = 122, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM123 = 123, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM124 = 124, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM125 = 125, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM126 = 126, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM127 = 127, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM128 = 128, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM129 = 129, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM130 = 130, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM131 = 131, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM132 = 132, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM133 = 133, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM134 = 134, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM135 = 135, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM136 = 136, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM137 = 137, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM138 = 138, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM139 = 139, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM140 = 140, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM141 = 141, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM142 = 142, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM143 = 143, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM144 = 144, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM145 = 145, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM146 = 146, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM147 = 147, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM148 = 148, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM149 = 149, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM150 = 150, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM151 = 151, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM152 = 152, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM153 = 153, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM154 = 154, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM155 = 155, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM156 = 156, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM157 = 157, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM158 = 158, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM159 = 159, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM160 = 160, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM161 = 161, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM162 = 162, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM163 = 163, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM164 = 164, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM165 = 165, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM166 = 166, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM167 = 167, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM168 = 168, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM169 = 169, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM170 = 170, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM171 = 171, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM172 = 172, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM173 = 173, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM174 = 174, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM175 = 175, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM176 = 176, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM177 = 177, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM178 = 178, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM179 = 179, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM180 = 180, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM181 = 181, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM182 = 182, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM183 = 183, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM184 = 184, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM185 = 185, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM186 = 186, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM187 = 187, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM188 = 188, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM189 = 189, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM190 = 190, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM191 = 191, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM192 = 192, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM193 = 193, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM194 = 194, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM195 = 195, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM196 = 196, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM197 = 197, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM198 = 198, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM199 = 199, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM200 = 200, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM201 = 201, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM202 = 202, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM203 = 203, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM204 = 204, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM205 = 205, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM206 = 206, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM207 = 207, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM208 = 208, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM209 = 209, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM210 = 210, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM211 = 211, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM212 = 212, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM213 = 213, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM214 = 214, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM215 = 215, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM216 = 216, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM217 = 217, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM218 = 218, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM219 = 219, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM220 = 220, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM221 = 221, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM222 = 222, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM223 = 223, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM224 = 224, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM225 = 225, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM226 = 226, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM227 = 227, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM228 = 228, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM229 = 229, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM230 = 230, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM231 = 231, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM232 = 232, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM233 = 233, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM234 = 234, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM235 = 235, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM236 = 236, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM237 = 237, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM238 = 238, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM239 = 239, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM240 = 240, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM241 = 241, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM242 = 242, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM243 = 243, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM244 = 244, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM245 = 245, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM246 = 246, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM247 = 247, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM248 = 248, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM249 = 249, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM250 = 250, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM251 = 251, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM252 = 252, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM253 = 253, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM254 = 254, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_CDUC_CLK_TO_CARRIER_RATE_ENUM255 = 255 /*!< No description provided */ +} adrv904x_Bf_CducHbDpath_CducClkToCarrierRate_e; + +/** + * \brief Enumeration for downsamplerRatio + */ + +typedef enum adrv904x_Bf_CducHbDpath_DownsamplerRatio +{ + ADRV904X_BF_CDUC_HB_DPATH_DOWNSAMPLER_RATIO_ENUM000 = 0, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_DOWNSAMPLER_RATIO_ENUM001 = 1, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_DOWNSAMPLER_RATIO_ENUM002 = 2, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_DOWNSAMPLER_RATIO_ENUM003 = 3, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_DOWNSAMPLER_RATIO_ENUM004 = 4, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_DOWNSAMPLER_RATIO_ENUM005 = 5 /*!< No description provided */ +} adrv904x_Bf_CducHbDpath_DownsamplerRatio_e; + +/** + * \brief Enumeration for intRate + */ + +typedef enum adrv904x_Bf_CducHbDpath_IntRate +{ + ADRV904X_BF_CDUC_HB_DPATH_INT_RATE_ENUM000 = 0, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_INT_RATE_ENUM001 = 1, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_INT_RATE_ENUM002 = 2, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_INT_RATE_ENUM003 = 3, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_INT_RATE_ENUM004 = 4, /*!< No description provided */ + ADRV904X_BF_CDUC_HB_DPATH_INT_RATE_ENUM005 = 5 /*!< No description provided */ +} adrv904x_Bf_CducHbDpath_IntRate_e; + +#endif // _ADRV904X_BF_CDUC_HB_DPATH_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_core.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_core.c new file mode 100644 index 00000000000..e4097f3b18b --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_core.c @@ -0,0 +1,24789 @@ +/** + * \file adrv904x_bf_core.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_core.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_CORE + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_A55CclkDivideRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_A55CclkDivideRatio_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_A55CclkDivideRatio_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x9D3U), + (uint32_t) bfValue, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_A55CclkDivideRatioDevClk_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_A55CclkDivideRatioDevClk_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_A55CclkDivideRatioDevClk_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x9D3U), + ((uint32_t) bfValue << 4), + 0x30U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_A55Spi0CmdStatusDwl_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint64_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint64_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_A55Spi0CmdStatusDwl_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xA2FU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xA30U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xA31U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xA32U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 24)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xA33U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 32)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xA34U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 40)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xA35U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 48)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xA36U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 56)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_A55Spi0Command_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_A55Spi0Command_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_A55Spi0Command_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xA27U), + (uint32_t) bfValue, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_A55Spi0CommandBusy_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_A55Spi0CommandBusy_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xA27U), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 7); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_A55SysclkEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_A55SysclkEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_A55SysclkEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x9D5U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_AhbSpiBridgeEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_AhbSpiBridgeEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_AhbSpiBridgeEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x21U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Arm0M3Run_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Arm0M3Run_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Arm0M3Run_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x22U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Arm0M3Run_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Arm0M3Run_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x22U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Arm0MemHrespMask_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Arm0MemHrespMask_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Arm0MemHrespMask_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x22U), + ((uint32_t) bfValue << 3), + 0x8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Arm0Spi0Command_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Arm0Spi0Command_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Arm0Spi0Command_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x63U), + (uint32_t) bfValue, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Arm0Spi0CommandBusy_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Arm0Spi0CommandBusy_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x63U), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 7); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Arm0Spi0ExtCmdByte1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Arm0Spi0ExtCmdByte1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Arm0Spi0ExtCmdByte1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x64U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Arm1Spi0CommandBusy_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Arm1Spi0CommandBusy_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xF4U), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 7); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_ArmClkDivideRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_ArmClkDivideRatio_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_ArmClkDivideRatio_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x17U), + (uint32_t) bfValue, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_ArmClkDivideRatioDevClk_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_ArmClkDivideRatioDevClk_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_ArmClkDivideRatioDevClk_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x17U), + ((uint32_t) bfValue << 3), + 0x18U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_ArmClkEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_ArmClkEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_ArmClkEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x17U), + ((uint32_t) bfValue << 2), + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x972), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x98A), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x973), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x98B), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel10_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel10_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel10_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x97C), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x994), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel11_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel11_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel11_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x97D), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x995), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel12_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel12_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel12_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x97E), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x996), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel13_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel13_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel13_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x97F), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x997), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel14_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel14_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel14_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x980), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x998), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel15_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel15_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel15_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x981), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x999), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel16_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel16_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel16_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x982), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x99A), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel17_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel17_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel17_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x983), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x99B), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel18_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel18_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel18_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x984), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x99C), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel19_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel19_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel19_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x985), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x99D), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel2_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel2_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x974), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x98C), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel20_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel20_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel20_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x986), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x99E), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel21_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel21_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel21_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x987), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x99F), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel22_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel22_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel22_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x988), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x9A0), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel23_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel23_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel23_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x989), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x9A1), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel3_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel3_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x975), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x98D), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel4_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel4_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x976), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x98E), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel5_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel5_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x977), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x98F), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel6_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel6_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x978), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x990), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel7_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel7_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x979), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x991), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel8_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel8_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel8_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x97A), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x992), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel9_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DataFromControlOutSel9_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DataFromControlOutSel9_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x97B), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x993), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DevclkBufferEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DevclkBufferEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DevclkBufferEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x42FU), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DevclkBuffTermEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DevclkBuffTermEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DevclkBuffTermEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x42FU), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DevclkDividerMcsResetb_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DevclkDividerMcsResetb_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DevclkDividerMcsResetb_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x42DU), + ((uint32_t) bfValue << 2), + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DevclkDivideRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DevclkDivideRatio_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DevclkDivideRatio_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x42EU), + (uint32_t) bfValue, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DigitalClockDividerSyncEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DigitalClockDividerSyncEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DigitalClockDividerSyncEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x19U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DigitalClockPowerUp_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_DigitalClockPowerUp_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_DigitalClockPowerUp_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x19U), + ((uint32_t) bfValue << 6), + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_EfuseProductId_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_EfuseProductId_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_EfuseProductIdReady_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_EfuseProductIdReady_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x13U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_EfuseReadData_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_EfuseReadData_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x193U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 24)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x194U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x195U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x196U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_EfuseReadDataValid_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_EfuseReadDataValid_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x191U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_EfuseReadState_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_EfuseReadState_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x191U), + &bfValueTmp, + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 5); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogFromMaster_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogFromMaster_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5C0U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5C1U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogFromMasterClear_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 65535U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioAnalogFromMasterClear_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogFromMasterClear_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5C4), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5C5), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogFromMasterSet_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 65535U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioAnalogFromMasterSet_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogFromMasterSet_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5C2), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5C3), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogFromMasterToggle_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 65535U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioAnalogFromMasterToggle_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogFromMasterToggle_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5E0), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5E1), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioAnalogSourceControl0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5C8U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5C8U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioAnalogSourceControl1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5C8U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5C8U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl10_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioAnalogSourceControl10_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl10_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5CDU), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl10_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl10_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5CDU), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl11_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioAnalogSourceControl11_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl11_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5CDU), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl11_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl11_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5CDU), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl12_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioAnalogSourceControl12_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl12_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5CEU), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl12_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl12_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5CEU), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl13_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioAnalogSourceControl13_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl13_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5CEU), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl13_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl13_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5CEU), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl14_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioAnalogSourceControl14_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl14_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5CFU), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl14_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl14_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5CFU), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl15_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioAnalogSourceControl15_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl15_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5CFU), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl15_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl15_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5CFU), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioAnalogSourceControl2_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl2_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5C9U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl2_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5C9U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioAnalogSourceControl3_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl3_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5C9U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl3_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5C9U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioAnalogSourceControl4_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl4_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5CAU), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl4_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl4_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5CAU), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioAnalogSourceControl5_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl5_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5CAU), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl5_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl5_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5CAU), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioAnalogSourceControl6_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl6_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5CBU), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl6_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl6_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5CBU), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioAnalogSourceControl7_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl7_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5CBU), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl7_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl7_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5CBU), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl8_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioAnalogSourceControl8_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl8_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5CCU), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl8_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl8_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5CCU), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl9_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioAnalogSourceControl9_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl9_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5CCU), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl9_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControl9_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5CCU), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControlOverride_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 65535U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioAnalogSourceControlOverride_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControlOverride_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5D5), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5D6), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControlOverride_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSourceControlOverride_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5D5U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5D6U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSpiRead_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioAnalogSpiRead_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5C6U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5C7U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioFromMaster_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioFromMaster_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x943U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x944U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x945U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioFromMasterClear_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 16777215U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioFromMasterClear_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioFromMasterClear_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x9A5), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x9A6), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x9A7), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioFromMasterSet_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 16777215U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioFromMasterSet_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioFromMasterSet_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x9A2), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x9A3), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x9A4), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioFromMasterToggle_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 16777215U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioFromMasterToggle_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioFromMasterToggle_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x9A8), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x9A9), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x9AA), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x94BU), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x94BU), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x94BU), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x94BU), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl10_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl10_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl10_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x950U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl10_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl10_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x950U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl11_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl11_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl11_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x950U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl11_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl11_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x950U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl12_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl12_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl12_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x951U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl12_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl12_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x951U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl13_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl13_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl13_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x951U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl13_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl13_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x951U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl14_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl14_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl14_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x952U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl14_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl14_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x952U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl15_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl15_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl15_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x952U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl15_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl15_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x952U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl16_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl16_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl16_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x953U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl16_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl16_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x953U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl17_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl17_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl17_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x953U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl17_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl17_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x953U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl18_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl18_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl18_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x954U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl18_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl18_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x954U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl19_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl19_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl19_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x954U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl19_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl19_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x954U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl2_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl2_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x94CU), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl2_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x94CU), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl20_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl20_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl20_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x955U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl20_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl20_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x955U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl21_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl21_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl21_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x955U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl21_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl21_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x955U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl22_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl22_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl22_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x956U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl22_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl22_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x956U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl23_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl23_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl23_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x956U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl23_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl23_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x956U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl3_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl3_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x94CU), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl3_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x94CU), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl4_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl4_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x94DU), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl4_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl4_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x94DU), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl5_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl5_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x94DU), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl5_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl5_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x94DU), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl6_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl6_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x94EU), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl6_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl6_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x94EU), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl7_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl7_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x94EU), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl7_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl7_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x94EU), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl8_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl8_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl8_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x94FU), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl8_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl8_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x94FU), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl9_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControl9_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl9_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x94FU), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl9_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControl9_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x94FU), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControlOverride_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 16777215U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceControlOverride_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControlOverride_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x93F), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x940), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x941), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControlOverride_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceControlOverride_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x93FU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x940U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x941U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x96FU), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x96FU), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl10_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl10_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl10_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x970U), + ((uint32_t) bfValue << 2), + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl11_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl11_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl11_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x970U), + ((uint32_t) bfValue << 3), + 0x8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl12_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl12_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl12_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x970U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl13_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl13_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl13_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x970U), + ((uint32_t) bfValue << 5), + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl14_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl14_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl14_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x970U), + ((uint32_t) bfValue << 6), + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl15_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl15_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl15_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x970U), + ((uint32_t) bfValue << 7), + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl16_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl16_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl16_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x971U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl17_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl17_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl17_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x971U), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl18_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl18_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl18_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x971U), + ((uint32_t) bfValue << 2), + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl19_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl19_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl19_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x971U), + ((uint32_t) bfValue << 3), + 0x8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl2_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl2_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x96FU), + ((uint32_t) bfValue << 2), + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl20_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl20_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl20_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x971U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl21_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl21_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl21_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x971U), + ((uint32_t) bfValue << 5), + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl22_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl22_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl22_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x971U), + ((uint32_t) bfValue << 6), + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl23_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl23_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl23_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x971U), + ((uint32_t) bfValue << 7), + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl3_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl3_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x96FU), + ((uint32_t) bfValue << 3), + 0x8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl4_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl4_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x96FU), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl5_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl5_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x96FU), + ((uint32_t) bfValue << 5), + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl6_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl6_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x96FU), + ((uint32_t) bfValue << 6), + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl7_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl7_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x96FU), + ((uint32_t) bfValue << 7), + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl8_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl8_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl8_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x970U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl9_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceOrxControl9_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceOrxControl9_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x970U), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x957U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x957U), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl10_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl10_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl10_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x95CU), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl11_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl11_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl11_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x95CU), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl12_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl12_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl12_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x95DU), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl13_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl13_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl13_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x95DU), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl14_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl14_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl14_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x95EU), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl15_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl15_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl15_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x95EU), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl16_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl16_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl16_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x95FU), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl17_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl17_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl17_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x95FU), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl18_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl18_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl18_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x960U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl19_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl19_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl19_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x960U), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl2_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl2_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x958U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl20_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl20_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl20_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x961U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl21_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl21_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl21_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x961U), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl22_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl22_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl22_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x962U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl23_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl23_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl23_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x962U), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl3_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl3_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x958U), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl4_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl4_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x959U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl5_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl5_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x959U), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl6_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl6_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x95AU), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl7_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl7_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x95AU), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl8_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl8_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl8_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x95BU), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl9_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceRxControl9_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceRxControl9_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x95BU), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x963U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x963U), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl10_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl10_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl10_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x968U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl11_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl11_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl11_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x968U), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl12_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl12_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl12_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x969U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl13_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl13_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl13_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x969U), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl14_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl14_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl14_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x96AU), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl15_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl15_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl15_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x96AU), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl16_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl16_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl16_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x96BU), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl17_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl17_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl17_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x96BU), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl18_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl18_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl18_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x96CU), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl19_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl19_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl19_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x96CU), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl2_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl2_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x964U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl20_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl20_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl20_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x96DU), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl21_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl21_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl21_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x96DU), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl22_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl22_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl22_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x96EU), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl23_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl23_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl23_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x96EU), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl3_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl3_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x964U), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl4_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl4_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x965U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl5_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl5_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x965U), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl6_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl6_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x966U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl7_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl7_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x966U), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl8_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl8_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl8_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x967U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl9_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpioSourceTxControl9_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSourceTxControl9_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x967U), + ((uint32_t) bfValue << 3), + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSpiRead_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpioSpiRead_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x947U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x948U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x949U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsLevelPulseBLowerWord_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint64_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 281474976710655U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpInterruptsLevelPulseBLowerWord_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpInterruptsLevelPulseBLowerWord_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x176), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x177), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x178), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x179), + bfValue >> 24, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x17A), + bfValue >> 32, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x17B), + bfValue >> 40, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsLevelPulseBLowerWord_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint64_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint64_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpInterruptsLevelPulseBLowerWord_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x176U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x177U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x178U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x179U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 24)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x17AU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 32)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x17BU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 40)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsLevelPulseBUpperWord_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint64_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 281474976710655U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpInterruptsLevelPulseBUpperWord_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpInterruptsLevelPulseBUpperWord_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x17C), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x17D), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x17E), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x17F), + bfValue >> 24, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x180), + bfValue >> 32, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x181), + bfValue >> 40, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsLevelPulseBUpperWord_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint64_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint64_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpInterruptsLevelPulseBUpperWord_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x17CU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x17DU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x17EU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x17FU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 24)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x180U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 32)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x181U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 40)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsMaskLowerWordPin0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint64_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 281474976710655U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpInterruptsMaskLowerWordPin0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpInterruptsMaskLowerWordPin0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x152), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x153), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x154), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x155), + bfValue >> 24, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x156), + bfValue >> 32, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x157), + bfValue >> 40, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsMaskLowerWordPin0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint64_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint64_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpInterruptsMaskLowerWordPin0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x152U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x153U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x154U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x155U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 24)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x156U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 32)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x157U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 40)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsMaskLowerWordPin1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint64_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 281474976710655U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpInterruptsMaskLowerWordPin1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpInterruptsMaskLowerWordPin1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x146), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x147), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x148), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x149), + bfValue >> 24, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x14A), + bfValue >> 32, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x14B), + bfValue >> 40, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsMaskLowerWordPin1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint64_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint64_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpInterruptsMaskLowerWordPin1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x146U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x147U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x148U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x149U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 24)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x14AU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 32)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x14BU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 40)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsMaskUpperWordPin0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint64_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 281474976710655U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpInterruptsMaskUpperWordPin0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpInterruptsMaskUpperWordPin0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x158), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x159), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x15A), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x15B), + bfValue >> 24, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x15C), + bfValue >> 32, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x15D), + bfValue >> 40, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsMaskUpperWordPin0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint64_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint64_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpInterruptsMaskUpperWordPin0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x158U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x159U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x15AU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x15BU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 24)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x15CU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 32)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x15DU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 40)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsMaskUpperWordPin1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint64_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 281474976710655U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpInterruptsMaskUpperWordPin1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpInterruptsMaskUpperWordPin1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x14C), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x14D), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x14E), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x14F), + bfValue >> 24, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x150), + bfValue >> 32, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x151), + bfValue >> 40, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsMaskUpperWordPin1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint64_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint64_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpInterruptsMaskUpperWordPin1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x14CU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x14DU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x14EU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x14FU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 24)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x150U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 32)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x151U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 40)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsStatusLowerWord_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint64_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 281474976710655U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpInterruptsStatusLowerWord_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpInterruptsStatusLowerWord_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x16A), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x16B), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x16C), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x16D), + bfValue >> 24, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x16E), + bfValue >> 32, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x16F), + bfValue >> 40, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsStatusLowerWord_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint64_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint64_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpInterruptsStatusLowerWord_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x16AU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x16BU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x16CU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x16DU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 24)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x16EU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 32)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x16FU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 40)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsStatusUpperWord_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint64_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 281474976710655U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_GpInterruptsStatusUpperWord_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpInterruptsStatusUpperWord_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x170), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x171), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x172), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x173), + bfValue >> 24, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x174), + bfValue >> 32, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x175), + bfValue >> 40, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsStatusUpperWord_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint64_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint64_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_GpInterruptsStatusUpperWord_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x170U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x171U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x172U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x173U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 24)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x174U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 32)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x175U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint64_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 40)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_MaskRevisionMajor_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_MaskRevisionMajor_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_MaskRevisionMinor_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_MaskRevisionMinor_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_MasterBiasClkDivRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_MasterBiasClkDivRatio_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_MasterBiasClkDivRatio_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x18U), + (uint32_t) bfValue, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_MbiasBgCtat_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_MbiasBgCtat_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_MbiasBgCtat_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Core_MbiasBgCtat_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x451 + channelId * 12U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_MbiasBgPtat_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_MbiasBgPtat_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_MbiasBgPtat_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Core_MbiasBgPtat_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x453 + channelId * 12U), + (uint32_t) bfValue, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_MbiasIgenPd_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_MbiasIgenPd_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_MbiasIgenPd_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Core_MbiasIgenPd_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x450 + channelId * 12U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_MbiasRtrimResetb_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_MbiasRtrimResetb_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_MbiasRtrimResetb_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Core_MbiasRtrimResetb_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x457 + channelId * 12U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_MbiasTrimCompPd_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_MbiasTrimCompPd_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_MbiasTrimCompPd_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Core_MbiasTrimCompPd_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x450 + channelId * 12U), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_McsStatus_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_McsStatus_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_McsStatus_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x65DU), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_McsStatus_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_McsStatus_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x65DU), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_MemoryRepairStart_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_MemoryRepairStart_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_MemoryRepairStart_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xAA9U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_OrxRsModeSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_OrxRsModeSel_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_OrxRsModeSel_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x62AU), + (uint32_t) bfValue, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_PadDs0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_PadDs0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_PadDs0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Core_PadDs0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x65E + channelId * 8U), + (uint32_t) bfValue, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_PadDs0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_PadDs0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Core_PadDs0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x65E + channelId * 8U), + &bfValueTmp, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_PadDs1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_PadDs1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_PadDs1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Core_PadDs1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x69E + channelId * 8U), + (uint32_t) bfValue, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_PadDs1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_PadDs1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Core_PadDs1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x69E + channelId * 8U), + &bfValueTmp, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_PadDs2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_PadDs2_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_PadDs2_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Core_PadDs2_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x6DE + channelId * 8U), + (uint32_t) bfValue, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_PadDs2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_PadDs2_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Core_PadDs2_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x6DE + channelId * 8U), + &bfValueTmp, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_PadDs3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_PadDs3_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_PadDs3_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Core_PadDs3_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x71E + channelId * 7U), + (uint32_t) bfValue, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_PadDs3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_PadDs3_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Core_PadDs3_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x71E + channelId * 7U), + &bfValueTmp, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_PadSt_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_PadSt_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_PadSt_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Core_PadSt_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x756 + channelId * 7U), + (uint32_t) bfValue, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_PadSt_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_PadSt_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Core_PadSt_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x756 + channelId * 7U), + &bfValueTmp, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrx0Map_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceOrx0Map_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x607U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrx0MapShadow_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceOrx0MapShadow_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceOrx0MapShadow_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x62BU), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrx0MapShadow_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceOrx0MapShadow_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x62BU), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrx1Map_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceOrx1Map_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x625U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrx1MapShadow_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceOrx1MapShadow_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceOrx1MapShadow_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x62CU), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrx1MapShadow_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceOrx1MapShadow_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x62CU), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrxonReadback_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceOrxonReadback_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x60CU), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrxArmModeSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceOrxArmModeSel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x622U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrxArmModeSelClr_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceOrxArmModeSelClr_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceOrxArmModeSelClr_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x624U), + (uint32_t) bfValue, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrxSpiEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceOrxSpiEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceOrxSpiEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x61DU), + (uint32_t) bfValue, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrxSpiEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceOrxSpiEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x61DU), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrxSpiModeSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceOrxSpiModeSel_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceOrxSpiModeSel_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x61EU), + (uint32_t) bfValue, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrxSpiModeSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceOrxSpiModeSel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x61EU), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxonReadback_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxonReadback_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x60AU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceRxAntEnPin0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxAntEnPin0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5FDU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxAntEnPin0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5FDU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceRxAntEnPin1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxAntEnPin1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5FEU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxAntEnPin1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5FEU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceRxAntEnPin2_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxAntEnPin2_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5FFU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxAntEnPin2_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5FFU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceRxAntEnPin3_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxAntEnPin3_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x600U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxAntEnPin3_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x600U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceRxAntEnPin4_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxAntEnPin4_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x601U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin4_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxAntEnPin4_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x601U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceRxAntEnPin5_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxAntEnPin5_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x602U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin5_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxAntEnPin5_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x602U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceRxAntEnPin6_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxAntEnPin6_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x603U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin6_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxAntEnPin6_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x603U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceRxAntEnPin7_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxAntEnPin7_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x604U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin7_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxAntEnPin7_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x604U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxArmModeSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxArmModeSel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x61AU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxArmModeSelClr_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceRxArmModeSelClr_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxArmModeSelClr_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x61CU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceRxEnPin0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxEnPin0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5F5U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxEnPin0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5F5U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceRxEnPin1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxEnPin1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5F6U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxEnPin1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5F6U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceRxEnPin2_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxEnPin2_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5F7U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxEnPin2_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5F7U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceRxEnPin3_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxEnPin3_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5F8U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxEnPin3_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5F8U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceRxEnPin4_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxEnPin4_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5F9U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin4_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxEnPin4_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5F9U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceRxEnPin5_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxEnPin5_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5FAU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin5_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxEnPin5_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5FAU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceRxEnPin6_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxEnPin6_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5FBU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin6_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxEnPin6_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5FBU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceRxEnPin7_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxEnPin7_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5FCU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin7_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxEnPin7_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5FCU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxSpiEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceRxSpiEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxSpiEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x615U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxSpiEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxSpiEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x615U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxSpiModeSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceRxSpiModeSel_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxSpiModeSel_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x616U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxSpiModeSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceRxSpiModeSel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x616U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxonReadback_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxonReadback_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x608U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceTxAntEnPin0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxAntEnPin0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5EDU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxAntEnPin0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5EDU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceTxAntEnPin1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxAntEnPin1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5EEU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxAntEnPin1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5EEU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceTxAntEnPin2_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxAntEnPin2_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5EFU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxAntEnPin2_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5EFU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceTxAntEnPin3_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxAntEnPin3_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5F0U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxAntEnPin3_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5F0U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceTxAntEnPin4_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxAntEnPin4_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5F1U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin4_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxAntEnPin4_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5F1U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceTxAntEnPin5_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxAntEnPin5_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5F2U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin5_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxAntEnPin5_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5F2U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceTxAntEnPin6_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxAntEnPin6_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5F3U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin6_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxAntEnPin6_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5F3U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceTxAntEnPin7_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxAntEnPin7_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5F4U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin7_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxAntEnPin7_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5F4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxArmModeSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxArmModeSel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x612U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxArmModeSelClr_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceTxArmModeSelClr_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxArmModeSelClr_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x614U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceTxEnPin0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxEnPin0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5E5U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxEnPin0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5E5U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceTxEnPin1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxEnPin1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5E6U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxEnPin1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5E6U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceTxEnPin2_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxEnPin2_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5E7U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxEnPin2_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5E7U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceTxEnPin3_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxEnPin3_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5E8U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxEnPin3_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5E8U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceTxEnPin4_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxEnPin4_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5E9U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin4_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxEnPin4_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5E9U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceTxEnPin5_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxEnPin5_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5EAU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin5_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxEnPin5_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5EAU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceTxEnPin6_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxEnPin6_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5EBU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin6_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxEnPin6_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5EBU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceTxEnPin7_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxEnPin7_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5ECU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin7_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxEnPin7_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5ECU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxSpiEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceTxSpiEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxSpiEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x60DU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxSpiEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxSpiEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x60DU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxSpiModeSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RadioControlInterfaceTxSpiModeSel_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxSpiModeSel_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x60EU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxSpiModeSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RadioControlInterfaceTxSpiModeSel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x60EU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RsSampleClkDivideRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RsSampleClkDivideRatio_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RsSampleClkDivideRatio_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1FU), + ((uint32_t) bfValue << 1), + 0x1EU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RsSampleClkEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RsSampleClkEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RsSampleClkEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1FU), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RxAntRsModeSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RxAntRsModeSel_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RxAntRsModeSel_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x629U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RxRsModeSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_RxRsModeSel_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_RxRsModeSel_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x628U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_ScratchPadWord_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_ScratchPadWord_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_ScratchPadWord_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xAU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_ScratchPadWord_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_ScratchPadWord_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xAU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_ScratchReg_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_ScratchReg_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_ScratchReg_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) && + (channelId != 0xC0) && + (channelId != 0xC1) && + (channelId != 0xC2) && + (channelId != 0xC3) && + (channelId != 0xC4) && + (channelId != 0xC5) && + (channelId != 0xC6) && + (channelId != 0xC7) && + (channelId != 0xC8) && + (channelId != 0xC9) && + (channelId != 0xCA) && + (channelId != 0xCB) && + (channelId != 0xCC) && + (channelId != 0xCD) && + (channelId != 0xCE) && + (channelId != 0xCF) && + (channelId != 0xD0) && + (channelId != 0xD1) && + (channelId != 0xD2) && + (channelId != 0xD3) && + (channelId != 0xD4) && + (channelId != 0xD5) && + (channelId != 0xD6) && + (channelId != 0xD7) && + (channelId != 0xD8) && + (channelId != 0xD9) && + (channelId != 0xDA) && + (channelId != 0xDB) && + (channelId != 0xDC) && + (channelId != 0xDD) && + (channelId != 0xDE) && + (channelId != 0xDF) && + (channelId != 0xE0) && + (channelId != 0xE1) && + (channelId != 0xE2) && + (channelId != 0xE3) && + (channelId != 0xE4) && + (channelId != 0xE5) && + (channelId != 0xE6) && + (channelId != 0xE7) && + (channelId != 0xE8) && + (channelId != 0xE9) && + (channelId != 0xEA) && + (channelId != 0xEB) && + (channelId != 0xEC) && + (channelId != 0xED) && + (channelId != 0xEE) && + (channelId != 0xEF) && + (channelId != 0xF0) && + (channelId != 0xF1) && + (channelId != 0xF2) && + (channelId != 0xF3) && + (channelId != 0xF4) && + (channelId != 0xF5) && + (channelId != 0xF6) && + (channelId != 0xF7) && + (channelId != 0xF8) && + (channelId != 0xF9) && + (channelId != 0xFA) && + (channelId != 0xFB) && + (channelId != 0xFC) && + (channelId != 0xFD) && + (channelId != 0xFE) && + (channelId != 0xFF) && + (channelId != 0x100) && + (channelId != 0x101) && + (channelId != 0x102) && + (channelId != 0x103) && + (channelId != 0x104) && + (channelId != 0x105) && + (channelId != 0x106) && + (channelId != 0x107) && + (channelId != 0x108) && + (channelId != 0x109) && + (channelId != 0x10A) && + (channelId != 0x10B) && + (channelId != 0x10C) && + (channelId != 0x10D) && + (channelId != 0x10E) && + (channelId != 0x10F) && + (channelId != 0x110) && + (channelId != 0x111) && + (channelId != 0x112) && + (channelId != 0x113) && + (channelId != 0x114) && + (channelId != 0x115) && + (channelId != 0x116) && + (channelId != 0x117) && + (channelId != 0x118) && + (channelId != 0x119) && + (channelId != 0x11A) && + (channelId != 0x11B) && + (channelId != 0x11C) && + (channelId != 0x11D) && + (channelId != 0x11E) && + (channelId != 0x11F) && + (channelId != 0x120) && + (channelId != 0x121) && + (channelId != 0x122) && + (channelId != 0x123) && + (channelId != 0x124) && + (channelId != 0x125) && + (channelId != 0x126) && + (channelId != 0x127) && + (channelId != 0x128) && + (channelId != 0x129) && + (channelId != 0x12A) && + (channelId != 0x12B) && + (channelId != 0x12C) && + (channelId != 0x12D) && + (channelId != 0x12E) && + (channelId != 0x12F) && + (channelId != 0x130) && + (channelId != 0x131) && + (channelId != 0x132) && + (channelId != 0x133) && + (channelId != 0x134) && + (channelId != 0x135) && + (channelId != 0x136) && + (channelId != 0x137) && + (channelId != 0x138) && + (channelId != 0x139) && + (channelId != 0x13A) && + (channelId != 0x13B) && + (channelId != 0x13C) && + (channelId != 0x13D) && + (channelId != 0x13E) && + (channelId != 0x13F) && + (channelId != 0x140) && + (channelId != 0x141) && + (channelId != 0x142) && + (channelId != 0x143) && + (channelId != 0x144) && + (channelId != 0x145) && + (channelId != 0x146) && + (channelId != 0x147) && + (channelId != 0x148) && + (channelId != 0x149) && + (channelId != 0x14A) && + (channelId != 0x14B) && + (channelId != 0x14C) && + (channelId != 0x14D) && + (channelId != 0x14E) && + (channelId != 0x14F) && + (channelId != 0x150) && + (channelId != 0x151) && + (channelId != 0x152) && + (channelId != 0x153) && + (channelId != 0x154) && + (channelId != 0x155) && + (channelId != 0x156) && + (channelId != 0x157) && + (channelId != 0x158) && + (channelId != 0x159) && + (channelId != 0x15A) && + (channelId != 0x15B) && + (channelId != 0x15C) && + (channelId != 0x15D) && + (channelId != 0x15E) && + (channelId != 0x15F) && + (channelId != 0x160) && + (channelId != 0x161) && + (channelId != 0x162) && + (channelId != 0x163) && + (channelId != 0x164) && + (channelId != 0x165) && + (channelId != 0x166) && + (channelId != 0x167) && + (channelId != 0x168) && + (channelId != 0x169) && + (channelId != 0x16A) && + (channelId != 0x16B) && + (channelId != 0x16C) && + (channelId != 0x16D) && + (channelId != 0x16E) && + (channelId != 0x16F) && + (channelId != 0x170) && + (channelId != 0x171) && + (channelId != 0x172) && + (channelId != 0x173) && + (channelId != 0x174) && + (channelId != 0x175) && + (channelId != 0x176) && + (channelId != 0x177) && + (channelId != 0x178) && + (channelId != 0x179) && + (channelId != 0x17A) && + (channelId != 0x17B) && + (channelId != 0x17C) && + (channelId != 0x17D) && + (channelId != 0x17E) && + (channelId != 0x17F) && + (channelId != 0x180) && + (channelId != 0x181) && + (channelId != 0x182) && + (channelId != 0x183) && + (channelId != 0x184) && + (channelId != 0x185) && + (channelId != 0x186) && + (channelId != 0x187) && + (channelId != 0x188) && + (channelId != 0x189) && + (channelId != 0x18A) && + (channelId != 0x18B) && + (channelId != 0x18C) && + (channelId != 0x18D) && + (channelId != 0x18E) && + (channelId != 0x18F) && + (channelId != 0x190) && + (channelId != 0x191) && + (channelId != 0x192) && + (channelId != 0x193) && + (channelId != 0x194) && + (channelId != 0x195) && + (channelId != 0x196) && + (channelId != 0x197) && + (channelId != 0x198) && + (channelId != 0x199) && + (channelId != 0x19A) && + (channelId != 0x19B) && + (channelId != 0x19C) && + (channelId != 0x19D) && + (channelId != 0x19E) && + (channelId != 0x19F) && + (channelId != 0x1A0) && + (channelId != 0x1A1) && + (channelId != 0x1A2) && + (channelId != 0x1A3) && + (channelId != 0x1A4) && + (channelId != 0x1A5) && + (channelId != 0x1A6) && + (channelId != 0x1A7) && + (channelId != 0x1A8) && + (channelId != 0x1A9) && + (channelId != 0x1AA) && + (channelId != 0x1AB) && + (channelId != 0x1AC) && + (channelId != 0x1AD) && + (channelId != 0x1AE) && + (channelId != 0x1AF) && + (channelId != 0x1B0) && + (channelId != 0x1B1) && + (channelId != 0x1B2) && + (channelId != 0x1B3) && + (channelId != 0x1B4) && + (channelId != 0x1B5) && + (channelId != 0x1B6) && + (channelId != 0x1B7) && + (channelId != 0x1B8) && + (channelId != 0x1B9) && + (channelId != 0x1BA) && + (channelId != 0x1BB) && + (channelId != 0x1BC) && + (channelId != 0x1BD) && + (channelId != 0x1BE) && + (channelId != 0x1BF) && + (channelId != 0x1C0) && + (channelId != 0x1C1) && + (channelId != 0x1C2) && + (channelId != 0x1C3) && + (channelId != 0x1C4) && + (channelId != 0x1C5) && + (channelId != 0x1C6) && + (channelId != 0x1C7) && + (channelId != 0x1C8) && + (channelId != 0x1C9) && + (channelId != 0x1CA) && + (channelId != 0x1CB) && + (channelId != 0x1CC) && + (channelId != 0x1CD) && + (channelId != 0x1CE) && + (channelId != 0x1CF) && + (channelId != 0x1D0) && + (channelId != 0x1D1) && + (channelId != 0x1D2) && + (channelId != 0x1D3) && + (channelId != 0x1D4) && + (channelId != 0x1D5) && + (channelId != 0x1D6) && + (channelId != 0x1D7) && + (channelId != 0x1D8) && + (channelId != 0x1D9) && + (channelId != 0x1DA) && + (channelId != 0x1DB) && + (channelId != 0x1DC) && + (channelId != 0x1DD) && + (channelId != 0x1DE) && + (channelId != 0x1DF) && + (channelId != 0x1E0) && + (channelId != 0x1E1) && + (channelId != 0x1E2) && + (channelId != 0x1E3) && + (channelId != 0x1E4) && + (channelId != 0x1E5) && + (channelId != 0x1E6) && + (channelId != 0x1E7) && + (channelId != 0x1E8) && + (channelId != 0x1E9) && + (channelId != 0x1EA) && + (channelId != 0x1EB) && + (channelId != 0x1EC) && + (channelId != 0x1ED) && + (channelId != 0x1EE) && + (channelId != 0x1EF) && + (channelId != 0x1F0) && + (channelId != 0x1F1) && + (channelId != 0x1F2) && + (channelId != 0x1F3) && + (channelId != 0x1F4) && + (channelId != 0x1F5) && + (channelId != 0x1F6) && + (channelId != 0x1F7) && + (channelId != 0x1F8) && + (channelId != 0x1F9) && + (channelId != 0x1FA) && + (channelId != 0x1FB) && + (channelId != 0x1FC) && + (channelId != 0x1FD) && + (channelId != 0x1FE) && + (channelId != 0x1FF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Core_ScratchReg_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x200 + channelId * 1U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_ScratchReg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_ScratchReg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) && + (channelId != 0xC0) && + (channelId != 0xC1) && + (channelId != 0xC2) && + (channelId != 0xC3) && + (channelId != 0xC4) && + (channelId != 0xC5) && + (channelId != 0xC6) && + (channelId != 0xC7) && + (channelId != 0xC8) && + (channelId != 0xC9) && + (channelId != 0xCA) && + (channelId != 0xCB) && + (channelId != 0xCC) && + (channelId != 0xCD) && + (channelId != 0xCE) && + (channelId != 0xCF) && + (channelId != 0xD0) && + (channelId != 0xD1) && + (channelId != 0xD2) && + (channelId != 0xD3) && + (channelId != 0xD4) && + (channelId != 0xD5) && + (channelId != 0xD6) && + (channelId != 0xD7) && + (channelId != 0xD8) && + (channelId != 0xD9) && + (channelId != 0xDA) && + (channelId != 0xDB) && + (channelId != 0xDC) && + (channelId != 0xDD) && + (channelId != 0xDE) && + (channelId != 0xDF) && + (channelId != 0xE0) && + (channelId != 0xE1) && + (channelId != 0xE2) && + (channelId != 0xE3) && + (channelId != 0xE4) && + (channelId != 0xE5) && + (channelId != 0xE6) && + (channelId != 0xE7) && + (channelId != 0xE8) && + (channelId != 0xE9) && + (channelId != 0xEA) && + (channelId != 0xEB) && + (channelId != 0xEC) && + (channelId != 0xED) && + (channelId != 0xEE) && + (channelId != 0xEF) && + (channelId != 0xF0) && + (channelId != 0xF1) && + (channelId != 0xF2) && + (channelId != 0xF3) && + (channelId != 0xF4) && + (channelId != 0xF5) && + (channelId != 0xF6) && + (channelId != 0xF7) && + (channelId != 0xF8) && + (channelId != 0xF9) && + (channelId != 0xFA) && + (channelId != 0xFB) && + (channelId != 0xFC) && + (channelId != 0xFD) && + (channelId != 0xFE) && + (channelId != 0xFF) && + (channelId != 0x100) && + (channelId != 0x101) && + (channelId != 0x102) && + (channelId != 0x103) && + (channelId != 0x104) && + (channelId != 0x105) && + (channelId != 0x106) && + (channelId != 0x107) && + (channelId != 0x108) && + (channelId != 0x109) && + (channelId != 0x10A) && + (channelId != 0x10B) && + (channelId != 0x10C) && + (channelId != 0x10D) && + (channelId != 0x10E) && + (channelId != 0x10F) && + (channelId != 0x110) && + (channelId != 0x111) && + (channelId != 0x112) && + (channelId != 0x113) && + (channelId != 0x114) && + (channelId != 0x115) && + (channelId != 0x116) && + (channelId != 0x117) && + (channelId != 0x118) && + (channelId != 0x119) && + (channelId != 0x11A) && + (channelId != 0x11B) && + (channelId != 0x11C) && + (channelId != 0x11D) && + (channelId != 0x11E) && + (channelId != 0x11F) && + (channelId != 0x120) && + (channelId != 0x121) && + (channelId != 0x122) && + (channelId != 0x123) && + (channelId != 0x124) && + (channelId != 0x125) && + (channelId != 0x126) && + (channelId != 0x127) && + (channelId != 0x128) && + (channelId != 0x129) && + (channelId != 0x12A) && + (channelId != 0x12B) && + (channelId != 0x12C) && + (channelId != 0x12D) && + (channelId != 0x12E) && + (channelId != 0x12F) && + (channelId != 0x130) && + (channelId != 0x131) && + (channelId != 0x132) && + (channelId != 0x133) && + (channelId != 0x134) && + (channelId != 0x135) && + (channelId != 0x136) && + (channelId != 0x137) && + (channelId != 0x138) && + (channelId != 0x139) && + (channelId != 0x13A) && + (channelId != 0x13B) && + (channelId != 0x13C) && + (channelId != 0x13D) && + (channelId != 0x13E) && + (channelId != 0x13F) && + (channelId != 0x140) && + (channelId != 0x141) && + (channelId != 0x142) && + (channelId != 0x143) && + (channelId != 0x144) && + (channelId != 0x145) && + (channelId != 0x146) && + (channelId != 0x147) && + (channelId != 0x148) && + (channelId != 0x149) && + (channelId != 0x14A) && + (channelId != 0x14B) && + (channelId != 0x14C) && + (channelId != 0x14D) && + (channelId != 0x14E) && + (channelId != 0x14F) && + (channelId != 0x150) && + (channelId != 0x151) && + (channelId != 0x152) && + (channelId != 0x153) && + (channelId != 0x154) && + (channelId != 0x155) && + (channelId != 0x156) && + (channelId != 0x157) && + (channelId != 0x158) && + (channelId != 0x159) && + (channelId != 0x15A) && + (channelId != 0x15B) && + (channelId != 0x15C) && + (channelId != 0x15D) && + (channelId != 0x15E) && + (channelId != 0x15F) && + (channelId != 0x160) && + (channelId != 0x161) && + (channelId != 0x162) && + (channelId != 0x163) && + (channelId != 0x164) && + (channelId != 0x165) && + (channelId != 0x166) && + (channelId != 0x167) && + (channelId != 0x168) && + (channelId != 0x169) && + (channelId != 0x16A) && + (channelId != 0x16B) && + (channelId != 0x16C) && + (channelId != 0x16D) && + (channelId != 0x16E) && + (channelId != 0x16F) && + (channelId != 0x170) && + (channelId != 0x171) && + (channelId != 0x172) && + (channelId != 0x173) && + (channelId != 0x174) && + (channelId != 0x175) && + (channelId != 0x176) && + (channelId != 0x177) && + (channelId != 0x178) && + (channelId != 0x179) && + (channelId != 0x17A) && + (channelId != 0x17B) && + (channelId != 0x17C) && + (channelId != 0x17D) && + (channelId != 0x17E) && + (channelId != 0x17F) && + (channelId != 0x180) && + (channelId != 0x181) && + (channelId != 0x182) && + (channelId != 0x183) && + (channelId != 0x184) && + (channelId != 0x185) && + (channelId != 0x186) && + (channelId != 0x187) && + (channelId != 0x188) && + (channelId != 0x189) && + (channelId != 0x18A) && + (channelId != 0x18B) && + (channelId != 0x18C) && + (channelId != 0x18D) && + (channelId != 0x18E) && + (channelId != 0x18F) && + (channelId != 0x190) && + (channelId != 0x191) && + (channelId != 0x192) && + (channelId != 0x193) && + (channelId != 0x194) && + (channelId != 0x195) && + (channelId != 0x196) && + (channelId != 0x197) && + (channelId != 0x198) && + (channelId != 0x199) && + (channelId != 0x19A) && + (channelId != 0x19B) && + (channelId != 0x19C) && + (channelId != 0x19D) && + (channelId != 0x19E) && + (channelId != 0x19F) && + (channelId != 0x1A0) && + (channelId != 0x1A1) && + (channelId != 0x1A2) && + (channelId != 0x1A3) && + (channelId != 0x1A4) && + (channelId != 0x1A5) && + (channelId != 0x1A6) && + (channelId != 0x1A7) && + (channelId != 0x1A8) && + (channelId != 0x1A9) && + (channelId != 0x1AA) && + (channelId != 0x1AB) && + (channelId != 0x1AC) && + (channelId != 0x1AD) && + (channelId != 0x1AE) && + (channelId != 0x1AF) && + (channelId != 0x1B0) && + (channelId != 0x1B1) && + (channelId != 0x1B2) && + (channelId != 0x1B3) && + (channelId != 0x1B4) && + (channelId != 0x1B5) && + (channelId != 0x1B6) && + (channelId != 0x1B7) && + (channelId != 0x1B8) && + (channelId != 0x1B9) && + (channelId != 0x1BA) && + (channelId != 0x1BB) && + (channelId != 0x1BC) && + (channelId != 0x1BD) && + (channelId != 0x1BE) && + (channelId != 0x1BF) && + (channelId != 0x1C0) && + (channelId != 0x1C1) && + (channelId != 0x1C2) && + (channelId != 0x1C3) && + (channelId != 0x1C4) && + (channelId != 0x1C5) && + (channelId != 0x1C6) && + (channelId != 0x1C7) && + (channelId != 0x1C8) && + (channelId != 0x1C9) && + (channelId != 0x1CA) && + (channelId != 0x1CB) && + (channelId != 0x1CC) && + (channelId != 0x1CD) && + (channelId != 0x1CE) && + (channelId != 0x1CF) && + (channelId != 0x1D0) && + (channelId != 0x1D1) && + (channelId != 0x1D2) && + (channelId != 0x1D3) && + (channelId != 0x1D4) && + (channelId != 0x1D5) && + (channelId != 0x1D6) && + (channelId != 0x1D7) && + (channelId != 0x1D8) && + (channelId != 0x1D9) && + (channelId != 0x1DA) && + (channelId != 0x1DB) && + (channelId != 0x1DC) && + (channelId != 0x1DD) && + (channelId != 0x1DE) && + (channelId != 0x1DF) && + (channelId != 0x1E0) && + (channelId != 0x1E1) && + (channelId != 0x1E2) && + (channelId != 0x1E3) && + (channelId != 0x1E4) && + (channelId != 0x1E5) && + (channelId != 0x1E6) && + (channelId != 0x1E7) && + (channelId != 0x1E8) && + (channelId != 0x1E9) && + (channelId != 0x1EA) && + (channelId != 0x1EB) && + (channelId != 0x1EC) && + (channelId != 0x1ED) && + (channelId != 0x1EE) && + (channelId != 0x1EF) && + (channelId != 0x1F0) && + (channelId != 0x1F1) && + (channelId != 0x1F2) && + (channelId != 0x1F3) && + (channelId != 0x1F4) && + (channelId != 0x1F5) && + (channelId != 0x1F6) && + (channelId != 0x1F7) && + (channelId != 0x1F8) && + (channelId != 0x1F9) && + (channelId != 0x1FA) && + (channelId != 0x1FB) && + (channelId != 0x1FC) && + (channelId != 0x1FD) && + (channelId != 0x1FE) && + (channelId != 0x1FF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Core_ScratchReg_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x200 + channelId * 1U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Spi1En_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Spi1En_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Spi1En_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x15U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Spi1En_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Spi1En_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x15U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_SpDbgGlobalResume_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_SpDbgGlobalResume_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_SpDbgGlobalResume_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x400U), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_StreamProcGpioPinMask_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 16777215U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_StreamProcGpioPinMask_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_StreamProcGpioPinMask_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x417), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x418), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x419), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_StreamProcGpioPinMask_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_StreamProcGpioPinMask_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x417U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x418U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x419U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_SyncInCmosSchmittTrigEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_SyncInCmosSchmittTrigEnable_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x183U), + &bfValueTmp, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_SyncInLvdsPnInvert_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_SyncInLvdsPnInvert_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x183U), + &bfValueTmp, + 0x38U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 3); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_SyncOut0CmosTxDriveStrength_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_SyncOut0CmosTxDriveStrength_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x186U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_SyncOut1CmosTxDriveStrength_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_SyncOut1CmosTxDriveStrength_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x186U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_SyncOutLvdsAndCmosEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_SyncOutLvdsAndCmosEnable_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x185U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_SyncOutLvdsPnInvert_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_SyncOutLvdsPnInvert_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x185U), + &bfValueTmp, + 0xCU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx0AttenS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx0AttenS0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx0AttenS0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1B3), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1B4), + bfValue >> 8, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx0AttenS0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx0AttenS0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1B3U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1B4U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx0AttenS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx0AttenS1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx0AttenS1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1B5), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1B6), + bfValue >> 8, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx0AttenS1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx0AttenS1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1B5U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1B6U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx0AttenUpdateS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx0AttenUpdateS0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx0AttenUpdateS0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1D3U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx0AttenUpdateS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx0AttenUpdateS1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx0AttenUpdateS1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1D4U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx1AttenS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx1AttenS0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx1AttenS0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1B7), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1B8), + bfValue >> 8, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx1AttenS0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx1AttenS0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1B7U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1B8U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx1AttenS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx1AttenS1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx1AttenS1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1B9), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1BA), + bfValue >> 8, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx1AttenS1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx1AttenS1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1B9U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1BAU), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx1AttenUpdateS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx1AttenUpdateS0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx1AttenUpdateS0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1D3U), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx1AttenUpdateS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx1AttenUpdateS1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx1AttenUpdateS1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1D4U), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx2AttenS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx2AttenS0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx2AttenS0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1BB), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1BC), + bfValue >> 8, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx2AttenS0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx2AttenS0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1BBU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1BCU), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx2AttenS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx2AttenS1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx2AttenS1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1BD), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1BE), + bfValue >> 8, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx2AttenS1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx2AttenS1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1BDU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1BEU), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx2AttenUpdateS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx2AttenUpdateS0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx2AttenUpdateS0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1D3U), + ((uint32_t) bfValue << 2), + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx2AttenUpdateS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx2AttenUpdateS1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx2AttenUpdateS1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1D4U), + ((uint32_t) bfValue << 2), + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx3AttenS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx3AttenS0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx3AttenS0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1BF), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1C0), + bfValue >> 8, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx3AttenS0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx3AttenS0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1BFU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1C0U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx3AttenS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx3AttenS1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx3AttenS1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1C1), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1C2), + bfValue >> 8, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx3AttenS1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx3AttenS1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1C1U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1C2U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx3AttenUpdateS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx3AttenUpdateS0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx3AttenUpdateS0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1D3U), + ((uint32_t) bfValue << 3), + 0x8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx3AttenUpdateS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx3AttenUpdateS1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx3AttenUpdateS1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1D4U), + ((uint32_t) bfValue << 3), + 0x8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx4AttenS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx4AttenS0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx4AttenS0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1C3), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1C4), + bfValue >> 8, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx4AttenS0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx4AttenS0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1C3U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1C4U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx4AttenS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx4AttenS1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx4AttenS1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1C5), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1C6), + bfValue >> 8, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx4AttenS1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx4AttenS1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1C5U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1C6U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx4AttenUpdateS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx4AttenUpdateS0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx4AttenUpdateS0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1D3U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx4AttenUpdateS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx4AttenUpdateS1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx4AttenUpdateS1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1D4U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx5AttenS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx5AttenS0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx5AttenS0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1C7), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1C8), + bfValue >> 8, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx5AttenS0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx5AttenS0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1C7U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1C8U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx5AttenS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx5AttenS1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx5AttenS1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1C9), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1CA), + bfValue >> 8, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx5AttenS1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx5AttenS1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1C9U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1CAU), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx5AttenUpdateS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx5AttenUpdateS0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx5AttenUpdateS0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1D3U), + ((uint32_t) bfValue << 5), + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx5AttenUpdateS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx5AttenUpdateS1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx5AttenUpdateS1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1D4U), + ((uint32_t) bfValue << 5), + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx6AttenS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx6AttenS0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx6AttenS0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1CB), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1CC), + bfValue >> 8, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx6AttenS0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx6AttenS0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1CBU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1CCU), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx6AttenS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx6AttenS1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx6AttenS1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1CD), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1CE), + bfValue >> 8, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx6AttenS1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx6AttenS1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1CDU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1CEU), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx6AttenUpdateS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx6AttenUpdateS0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx6AttenUpdateS0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1D3U), + ((uint32_t) bfValue << 6), + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx6AttenUpdateS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx6AttenUpdateS1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx6AttenUpdateS1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1D4U), + ((uint32_t) bfValue << 6), + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx7AttenS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx7AttenS0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx7AttenS0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1CF), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1D0), + bfValue >> 8, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx7AttenS0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx7AttenS0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1CFU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1D0U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx7AttenS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx7AttenS1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx7AttenS1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1D1), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1D2), + bfValue >> 8, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx7AttenS1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx7AttenS1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1D1U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1D2U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx7AttenUpdateS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx7AttenUpdateS0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx7AttenUpdateS0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1D3U), + ((uint32_t) bfValue << 7), + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx7AttenUpdateS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_Tx7AttenUpdateS1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_Tx7AttenUpdateS1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1D4U), + ((uint32_t) bfValue << 7), + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_TxAntRsModeSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_TxAntRsModeSel_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_TxAntRsModeSel_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x627U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_TxAttenUpdCoreSpi_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_TxAttenUpdCoreSpi_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_TxAttenUpdCoreSpi_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1E7U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_TxAttenUpdCoreSpiEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_TxAttenUpdCoreSpiEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_TxAttenUpdCoreSpiEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1E6U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_TxAttenUpdCoreSpiEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_TxAttenUpdCoreSpiEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1E6U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_TxRsModeSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_TxRsModeSel_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_TxRsModeSel_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x626U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_UseDeviceClkAsHsdigclk_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_UseDeviceClkAsHsdigclk_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_UseDeviceClkAsHsdigclk_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x19U), + ((uint32_t) bfValue << 7), + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_VendorId_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_VendorId_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xCU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xDU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_VswrFwdRev0Sel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_VswrFwdRev0Sel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x607U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_VswrFwdRev0SelShadow_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_VswrFwdRev0SelShadow_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_VswrFwdRev0SelShadow_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x62BU), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_VswrFwdRev1Sel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_VswrFwdRev1Sel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x625U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_VswrFwdRev1SelShadow_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Core_VswrFwdRev1SelShadow_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Core_VswrFwdRev1SelShadow_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x62CU), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_core.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_core.h new file mode 100644 index 00000000000..6655e6c5259 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_core.h @@ -0,0 +1,2173 @@ +/** + * \file adrv904x_bf_core.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_CORE_H_ +#define _ADRV904X_BF_CORE_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_core_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_A55CclkDivideRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_A55CclkDivideRatioDevClk_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_A55Spi0CmdStatusDwl_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint64_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_A55Spi0Command_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_A55Spi0CommandBusy_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_A55SysclkEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_AhbSpiBridgeEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Arm0M3Run_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Arm0M3Run_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Arm0MemHrespMask_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Arm0Spi0Command_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Arm0Spi0CommandBusy_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Arm0Spi0ExtCmdByte1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Arm1Spi0CommandBusy_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_ArmClkDivideRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_ArmClkDivideRatioDevClk_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_ArmClkEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel10_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel11_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel12_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel13_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel14_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel15_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel16_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel17_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel18_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel19_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel20_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel21_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel22_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel23_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel8_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DataFromControlOutSel9_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DevclkBufferEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DevclkBuffTermEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DevclkDividerMcsResetb_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DevclkDivideRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DigitalClockDividerSyncEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_DigitalClockPowerUp_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_EfuseProductId_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_EfuseProductIdReady_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_EfuseReadData_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_EfuseReadDataValid_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_EfuseReadState_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogFromMaster_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogFromMasterClear_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogFromMasterSet_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogFromMasterToggle_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl10_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl10_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl11_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl11_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl12_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl12_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl13_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl13_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl14_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl14_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl15_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl15_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl4_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl5_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl6_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl7_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl8_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl8_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl9_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControl9_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControlOverride_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSourceControlOverride_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioAnalogSpiRead_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioFromMaster_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioFromMasterClear_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioFromMasterSet_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioFromMasterToggle_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl10_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl10_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl11_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl11_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl12_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl12_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl13_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl13_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl14_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl14_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl15_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl15_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl16_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl16_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl17_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl17_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl18_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl18_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl19_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl19_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl20_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl20_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl21_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl21_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl22_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl22_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl23_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl23_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl4_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl5_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl6_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl7_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl8_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl8_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl9_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControl9_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControlOverride_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceControlOverride_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl10_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl11_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl12_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl13_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl14_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl15_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl16_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl17_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl18_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl19_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl20_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl21_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl22_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl23_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl8_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceOrxControl9_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl10_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl11_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl12_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl13_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl14_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl15_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl16_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl17_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl18_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl19_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl20_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl21_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl22_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl23_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl8_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceRxControl9_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl10_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl11_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl12_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl13_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl14_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl15_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl16_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl17_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl18_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl19_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl20_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl21_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl22_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl23_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl8_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSourceTxControl9_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpioSpiRead_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsLevelPulseBLowerWord_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint64_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsLevelPulseBLowerWord_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint64_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsLevelPulseBUpperWord_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint64_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsLevelPulseBUpperWord_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint64_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsMaskLowerWordPin0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint64_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsMaskLowerWordPin0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint64_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsMaskLowerWordPin1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint64_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsMaskLowerWordPin1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint64_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsMaskUpperWordPin0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint64_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsMaskUpperWordPin0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint64_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsMaskUpperWordPin1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint64_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsMaskUpperWordPin1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint64_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsStatusLowerWord_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint64_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsStatusLowerWord_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint64_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsStatusUpperWord_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint64_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_GpInterruptsStatusUpperWord_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint64_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_MaskRevisionMajor_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_MaskRevisionMinor_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_MasterBiasClkDivRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_MbiasBgCtat_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_MbiasBgPtat_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_MbiasIgenPd_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_MbiasRtrimResetb_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_MbiasTrimCompPd_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_McsStatus_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_McsStatus_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_MemoryRepairStart_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_OrxRsModeSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_PadDs0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_PadDs0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_PadDs1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_PadDs1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_PadDs2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_PadDs2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_PadDs3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_PadDs3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_PadSt_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_PadSt_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrx0Map_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrx0MapShadow_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrx0MapShadow_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrx1Map_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrx1MapShadow_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrx1MapShadow_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrxonReadback_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrxArmModeSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrxArmModeSelClr_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrxSpiEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrxSpiEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrxSpiModeSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceOrxSpiModeSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxonReadback_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin4_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin5_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin6_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxAntEnPin7_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxArmModeSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxArmModeSelClr_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin4_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin5_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin6_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxEnPin7_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxSpiEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxSpiEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxSpiModeSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceRxSpiModeSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxonReadback_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin4_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin5_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin6_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxAntEnPin7_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxArmModeSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxArmModeSelClr_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin4_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin5_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin6_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxEnPin7_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxSpiEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxSpiEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxSpiModeSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RadioControlInterfaceTxSpiModeSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RsSampleClkDivideRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RsSampleClkEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RxAntRsModeSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_RxRsModeSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_ScratchPadWord_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_ScratchPadWord_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_ScratchReg_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_ScratchReg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Spi1En_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Spi1En_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_SpDbgGlobalResume_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_StreamProcGpioPinMask_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_StreamProcGpioPinMask_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_SyncInCmosSchmittTrigEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_SyncInLvdsPnInvert_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_SyncOut0CmosTxDriveStrength_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_SyncOut1CmosTxDriveStrength_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_SyncOutLvdsAndCmosEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_SyncOutLvdsPnInvert_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx0AttenS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx0AttenS0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx0AttenS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx0AttenS1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx0AttenUpdateS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx0AttenUpdateS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx1AttenS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx1AttenS0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx1AttenS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx1AttenS1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx1AttenUpdateS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx1AttenUpdateS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx2AttenS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx2AttenS0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx2AttenS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx2AttenS1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx2AttenUpdateS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx2AttenUpdateS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx3AttenS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx3AttenS0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx3AttenS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx3AttenS1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx3AttenUpdateS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx3AttenUpdateS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx4AttenS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx4AttenS0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx4AttenS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx4AttenS1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx4AttenUpdateS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx4AttenUpdateS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx5AttenS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx5AttenS0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx5AttenS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx5AttenS1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx5AttenUpdateS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx5AttenUpdateS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx6AttenS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx6AttenS0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx6AttenS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx6AttenS1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx6AttenUpdateS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx6AttenUpdateS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx7AttenS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx7AttenS0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx7AttenS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx7AttenS1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx7AttenUpdateS0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_Tx7AttenUpdateS1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_TxAntRsModeSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_TxAttenUpdCoreSpi_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_TxAttenUpdCoreSpiEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_TxAttenUpdCoreSpiEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_TxRsModeSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_UseDeviceClkAsHsdigclk_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_VendorId_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_VswrFwdRev0Sel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_VswrFwdRev0SelShadow_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_VswrFwdRev1Sel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Core_VswrFwdRev1SelShadow_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +#endif // _ADRV904X_BF_CORE_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_core_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_core_types.h new file mode 100644 index 00000000000..5c0e2fef792 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_core_types.h @@ -0,0 +1,50 @@ +/** + * \file adrv904x_bf_core_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_CORE_TYPES_H_ +#define _ADRV904X_BF_CORE_TYPES_H_ + +typedef enum adrv904x_BfCoreChanAddr +{ + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS = 0x47000000 +} adrv904x_BfCoreChanAddr_e; + +/** + * \brief Enumeration for l1mem0SharedBankDiv + */ + +typedef enum adrv904x_Bf_Core_L1mem0SharedBankDiv +{ + ADRV904X_BF_CORE_L1MEM0_SHARED_BANK_DIV_ENUM000 = 0, /*!< IRAM_288K DRAM_288K */ + ADRV904X_BF_CORE_L1MEM0_SHARED_BANK_DIV_ENUM001 = 1, /*!< IRAM_224K DRAM_352K */ + ADRV904X_BF_CORE_L1MEM0_SHARED_BANK_DIV_ENUM002 = 2, /*!< IRAM_256K DRAM_320K */ + ADRV904X_BF_CORE_L1MEM0_SHARED_BANK_DIV_ENUM003 = 3, /*!< IRAM_320K DRAM_256K */ + ADRV904X_BF_CORE_L1MEM0_SHARED_BANK_DIV_ENUM004 = 4 /*!< IRAM_352K DRAM_224K */ +} adrv904x_Bf_Core_L1mem0SharedBankDiv_e; + +/** + * \brief Enumeration for l1mem1SharedBankDiv + */ + +typedef enum adrv904x_Bf_Core_L1mem1SharedBankDiv +{ + ADRV904X_BF_CORE_L1MEM1_SHARED_BANK_DIV_ENUM000 = 0, /*!< IRAM_288K DRAM_288K */ + ADRV904X_BF_CORE_L1MEM1_SHARED_BANK_DIV_ENUM001 = 1, /*!< IRAM_224K DRAM_352K */ + ADRV904X_BF_CORE_L1MEM1_SHARED_BANK_DIV_ENUM002 = 2, /*!< IRAM_256K DRAM_320K */ + ADRV904X_BF_CORE_L1MEM1_SHARED_BANK_DIV_ENUM003 = 3, /*!< IRAM_320K DRAM_256K */ + ADRV904X_BF_CORE_L1MEM1_SHARED_BANK_DIV_ENUM004 = 4 /*!< IRAM_352K DRAM_224K */ +} adrv904x_Bf_Core_L1mem1SharedBankDiv_e; + +#endif // _ADRV904X_BF_CORE_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_error_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_error_types.h new file mode 100644 index 00000000000..8e6478af159 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_error_types.h @@ -0,0 +1,160 @@ +/** + * \file adrv904x_bf_error_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_ERROR_TYPES_H_ +#define _ADRV904X_BF_ERROR_TYPES_H_ + +typedef enum +{ + ADI_ADRV904X_FILE_PRIVATE_BF_TOP = 200U, + ADI_ADRV904X_FILE_PRIVATE_BF_ARM_MEM = 201U, + ADI_ADRV904X_FILE_PRIVATE_BF_TIMER = 202U, + ADI_ADRV904X_FILE_PRIVATE_BF_DIGITAL_CORE = 203U, + ADI_ADRV904X_FILE_PRIVATE_BF_WATCHDOG_TIMER = 204U, + ADI_ADRV904X_FILE_PRIVATE_BF_SPI_PM_KEY = 205U, + ADI_ADRV904X_FILE_PRIVATE_BF_INTERRUPT_AGGREGATOR_M4 = 206U, + ADI_ADRV904X_FILE_PRIVATE_BF_MAILBOX = 207U, + ADI_ADRV904X_FILE_PRIVATE_BF_C2C_MAILBOX_SRC = 208U, + ADI_ADRV904X_FILE_PRIVATE_BF_C2C_MAILBOX_DST = 209U, + ADI_ADRV904X_FILE_PRIVATE_BF_UARTFIFO = 210U, + ADI_ADRV904X_FILE_PRIVATE_BF_UART = 211U, + ADI_ADRV904X_FILE_PRIVATE_BF_SPI_MASTER = 212U, + ADI_ADRV904X_FILE_PRIVATE_BF_ITM = 213U, + ADI_ADRV904X_FILE_PRIVATE_BF_TELEMETRY = 214U, + ADI_ADRV904X_FILE_PRIVATE_BF_SEMAPHORE = 215U, + ADI_ADRV904X_FILE_PRIVATE_BF_SNOOPER = 216U, + ADI_ADRV904X_FILE_PRIVATE_BF_INTERRUPT_TRANSMUTER_M4 = 217U, + ADI_ADRV904X_FILE_PRIVATE_BF_AHB_ARM_DAP_REGS = 218U, + ADI_ADRV904X_FILE_PRIVATE_BF_STREAMPROC = 219U, + ADI_ADRV904X_FILE_PRIVATE_BF_CORE = 220U, + ADI_ADRV904X_FILE_PRIVATE_BF_PLL_MEM_MAP = 221U, + ADI_ADRV904X_FILE_PRIVATE_BF_RC_TUNER_ANALOG = 222U, + ADI_ADRV904X_FILE_PRIVATE_BF_JESD_COMMON = 223U, + ADI_ADRV904X_FILE_PRIVATE_BF_JESD = 224U, + ADI_ADRV904X_FILE_PRIVATE_BF_JRX_LINK = 225U, + ADI_ADRV904X_FILE_PRIVATE_BF_JTX_LINK = 226U, + ADI_ADRV904X_FILE_PRIVATE_BF_SERDES_TXDIG_PHY_REGMAP_CORE1P2 = 227U, + ADI_ADRV904X_FILE_PRIVATE_BF_SERIALIZER = 228U, + ADI_ADRV904X_FILE_PRIVATE_BF_SERDES_TXDIG_DCC_REGMAP_CORE1P2 = 229U, + ADI_ADRV904X_FILE_PRIVATE_BF_SERDES_RXDIG_PHY_REGMAP_CORE1P2 = 230U, + ADI_ADRV904X_FILE_PRIVATE_BF_DESERIALIZER = 231U, + ADI_ADRV904X_FILE_PRIVATE_BF_SERDES_RXDIG_8PACK_REGMAP_CORE1P2 = 232U, + ADI_ADRV904X_FILE_PRIVATE_BF_MPU_REGS = 233U, + ADI_ADRV904X_FILE_PRIVATE_BF_MPU_NCO_SUBSYS_REGS = 234U, + ADI_ADRV904X_FILE_PRIVATE_BF_NCO_CTRL_REGS = 235U, + ADI_ADRV904X_FILE_PRIVATE_BF_KFA_CLF_REGS = 236U, + ADI_ADRV904X_FILE_PRIVATE_BF_KFA_TOP_REGS = 237U, + ADI_ADRV904X_FILE_PRIVATE_BF_SEQUENCER = 238U, + ADI_ADRV904X_FILE_PRIVATE_BF_RX_SLICE = 239U, + ADI_ADRV904X_FILE_PRIVATE_BF_RX_SLICE_AHB = 240U, + ADI_ADRV904X_FILE_PRIVATE_BF_STREAMPROC_CHANNEL = 241U, + ADI_ADRV904X_FILE_PRIVATE_BF_RX_FUNCS = 242U, + ADI_ADRV904X_FILE_PRIVATE_BF_RX_DIG = 243U, + ADI_ADRV904X_FILE_PRIVATE_BF_RX_RFDC = 244U, + ADI_ADRV904X_FILE_PRIVATE_BF_RX_DDC = 245U, + ADI_ADRV904X_FILE_PRIVATE_BF_RX_ANALOG_FE = 246U, + ADI_ADRV904X_FILE_PRIVATE_BF_TDR_ANA_REGMAP = 247U, + ADI_ADRV904X_FILE_PRIVATE_BF_TDR_8B_TOP = 248U, + ADI_ADRV904X_FILE_PRIVATE_BF_TDR_STGV_SHARED = 249U, + ADI_ADRV904X_FILE_PRIVATE_BF_TDR_STG1_SHARED = 250U, + ADI_ADRV904X_FILE_PRIVATE_BF_TDR_DPATH_TOP = 251U, + ADI_ADRV904X_FILE_PRIVATE_BF_TDR_DIG_MISC = 252U, + ADI_ADRV904X_FILE_PRIVATE_BF_TDR_VCO_CAL = 253U, + ADI_ADRV904X_FILE_PRIVATE_BF_TDR_32B_TOP = 254U, + ADI_ADRV904X_FILE_PRIVATE_BF_CHANNEL_FILTER = 255U, + ADI_ADRV904X_FILE_PRIVATE_BF_RX_CDDC = 256U, + ADI_ADRV904X_FILE_PRIVATE_BF_CDDC_HB_DPATH = 257U, + ADI_ADRV904X_FILE_PRIVATE_BF_CDDC_FUNCS = 258U, + ADI_ADRV904X_FILE_PRIVATE_BF_TX_SLICE = 259U, + ADI_ADRV904X_FILE_PRIVATE_BF_TX_SLICE_AHB = 260U, + ADI_ADRV904X_FILE_PRIVATE_BF_TX_DIG = 261U, + ADI_ADRV904X_FILE_PRIVATE_BF_TX_DATAPATH = 262U, + ADI_ADRV904X_FILE_PRIVATE_BF_TX_FUNCS = 263U, + ADI_ADRV904X_FILE_PRIVATE_BF_TX_BAND_DUC = 264U, + ADI_ADRV904X_FILE_PRIVATE_BF_TX_LOOPBACK = 265U, + ADI_ADRV904X_FILE_PRIVATE_BF_TX_LOL = 266U, + ADI_ADRV904X_FILE_PRIVATE_BF_TX_FSC = 267U, + ADI_ADRV904X_FILE_PRIVATE_BF_TX_ANALOG = 268U, + ADI_ADRV904X_FILE_PRIVATE_BF_TX_ANALOG_DAC = 269U, + ADI_ADRV904X_FILE_PRIVATE_BF_TX_ANALOG_LO_GEN = 270U, + ADI_ADRV904X_FILE_PRIVATE_BF_VENUS_TXLB_DCAL_REGMAP = 271U, + ADI_ADRV904X_FILE_PRIVATE_BF_VENUS_TXLB_REG32_TOP = 272U, + ADI_ADRV904X_FILE_PRIVATE_BF_VENUS_TXLB_SCAL_REGMAP_BROADCAST = 273U, + ADI_ADRV904X_FILE_PRIVATE_BF_VENUS_TXLB_SCAL_REGMAP = 274U, + ADI_ADRV904X_FILE_PRIVATE_BF_ACTRL_TXLB_SLICE_REGMAP_BROADCAST = 275U, + ADI_ADRV904X_FILE_PRIVATE_BF_VENUS_TXLB_REG8_TOP = 276U, + ADI_ADRV904X_FILE_PRIVATE_BF_ACTRL_TXLB_SLICE_REGMAP = 277U, + ADI_ADRV904X_FILE_PRIVATE_BF_ACTRL_TXLB_WEST_REGMAP = 278U, + ADI_ADRV904X_FILE_PRIVATE_BF_ACTRL_TXLB_EAST_REGMAP = 279U, + ADI_ADRV904X_FILE_PRIVATE_BF_TX_CDUC = 280U, + ADI_ADRV904X_FILE_PRIVATE_BF_CDUC_HB_DPATH = 281U, + ADI_ADRV904X_FILE_PRIVATE_BF_CDUC_FUNCS = 282U, + ADI_ADRV904X_FILE_PRIVATE_BF_TX_DFE_DIG_REGS = 283U, + ADI_ADRV904X_FILE_PRIVATE_BF_TX_DFE = 284U, + ADI_ADRV904X_FILE_PRIVATE_BF_TX_CFR_REG = 285U, + ADI_ADRV904X_FILE_PRIVATE_BF_TX_CFR = 286U, + ADI_ADRV904X_FILE_PRIVATE_BF_TX_CFR_PUL_MEM = 287U, + ADI_ADRV904X_FILE_PRIVATE_BF_TX_DPD_ACT_MMR = 288U, + ADI_ADRV904X_FILE_PRIVATE_BF_TX_DPD_ACT_LUT_REGS = 289U, + ADI_ADRV904X_FILE_PRIVATE_BF_CT_DPD_REGS = 290U, + ADI_ADRV904X_FILE_PRIVATE_BF_CT_DPD = 291U, + ADI_ADRV904X_FILE_PRIVATE_BF_FBOX_LUT = 292U, + ADI_ADRV904X_FILE_PRIVATE_BF_POWER_LUT_TOP = 293U, + ADI_ADRV904X_FILE_PRIVATE_BF_ORX_SLICE = 294U, + ADI_ADRV904X_FILE_PRIVATE_BF_ORX_SLICE_AHB = 295U, + ADI_ADRV904X_FILE_PRIVATE_BF_ORX_DIG = 296U, + ADI_ADRV904X_FILE_PRIVATE_BF_ORX_LOL = 297U, + ADI_ADRV904X_FILE_PRIVATE_BF_ACTRL_ORX_SLICE_REGMAP_BROADCAST = 298U, + ADI_ADRV904X_FILE_PRIVATE_BF_VENUS_ORX_REG8_TOP = 299U, + ADI_ADRV904X_FILE_PRIVATE_BF_ACTRL_ORX_SLICE_REGMAP = 300U, + ADI_ADRV904X_FILE_PRIVATE_BF_ACTRL_ORX_WEST_REGMAP = 301U, + ADI_ADRV904X_FILE_PRIVATE_BF_ACTRL_ORX_EAST_REGMAP = 302U, + ADI_ADRV904X_FILE_PRIVATE_BF_VENUS_ORX_DCAL_REGMAP = 303U, + ADI_ADRV904X_FILE_PRIVATE_BF_VENUS_ORX_REG32_TOP = 304U, + ADI_ADRV904X_FILE_PRIVATE_BF_VENUS_ORX_SCAL_REGMAP_BROADCAST = 305U, + ADI_ADRV904X_FILE_PRIVATE_BF_VENUS_ORX_SCAL_REGMAP = 306U, + ADI_ADRV904X_FILE_PRIVATE_BF_VENUS_ORX_FCAL_REGMAP_BROADCAST = 307U, + ADI_ADRV904X_FILE_PRIVATE_BF_VENUS_ORX_FCAL_REGMAP = 308U, + ADI_ADRV904X_FILE_PRIVATE_BF_VENUS_ORX_ICAL_REGMAP_BROADCAST = 309U, + ADI_ADRV904X_FILE_PRIVATE_BF_VENUS_ORX_ICAL_REGMAP = 310U, + ADI_ADRV904X_FILE_PRIVATE_BF_PROC_DFE_SYS = 311U, + ADI_ADRV904X_FILE_PRIVATE_BF_DDE = 312U, + ADI_ADRV904X_FILE_PRIVATE_BF_L2CTL = 313U, + ADI_ADRV904X_FILE_PRIVATE_BF_CSS600_TSGEN_READ = 314U, + ADI_ADRV904X_FILE_PRIVATE_BF_CSS600_TSGEN_CTRL = 315U, + ADI_ADRV904X_FILE_PRIVATE_BF_TRU = 316U, + ADI_ADRV904X_FILE_PRIVATE_BF_MEMORYMAP_AXI_MMR1 = 317U, + ADI_ADRV904X_FILE_PRIVATE_BF_CAP_BUF_MMR = 318U, + ADI_ADRV904X_FILE_PRIVATE_BF_A55_SYS_CFG = 319U, + ADI_ADRV904X_FILE_PRIVATE_BF_INTERRUPT_AGGREGATOR_A55 = 320U, + ADI_ADRV904X_FILE_PRIVATE_BF_INTERRUPT_TRANSMUTER_A55 = 321U, + ADI_ADRV904X_FILE_PRIVATE_BF_FEATURE_FILTER = 322U, + ADI_ADRV904X_FILE_PRIVATE_BF_CSS600_APBROM = 323U, + ADI_ADRV904X_FILE_PRIVATE_BF_CSS600_CTI = 324U, + ADI_ADRV904X_FILE_PRIVATE_BF_CSS600_ATBFUNNEL = 325U, + ADI_ADRV904X_FILE_PRIVATE_BF_CSS600_TMC_ETF = 326U, + ADI_ADRV904X_FILE_PRIVATE_BF_CSS600_TPIU = 327U, + ADI_ADRV904X_FILE_PRIVATE_BF_A55_ROMV8 = 328U, + ADI_ADRV904X_FILE_PRIVATE_BF_A55_DEBUG = 329U, + ADI_ADRV904X_FILE_PRIVATE_BF_A55_CTI = 330U, + ADI_ADRV904X_FILE_PRIVATE_BF_A55_PMU = 331U, + ADI_ADRV904X_FILE_PRIVATE_BF_A55_ETM = 332U, + ADI_ADRV904X_FILE_PRIVATE_BF_MEMORYMAP_PPI = 333U, + ADI_ADRV904X_FILE_PRIVATE_BF_GIC600_KOROR = 334U, + ADI_ADRV904X_FILE_PRIVATE_BF_XCORR = 335U, + ADI_ADRV904X_FILE_PRIVATE_BF_A55_MEM = 336U +} adrv904x_File_e; + +#endif // _ADRV904X_BF_ERROR_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jesd_common.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jesd_common.c new file mode 100644 index 00000000000..3bc707a8839 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jesd_common.c @@ -0,0 +1,22721 @@ +/** + * \file adrv904x_bf_jesd_common.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_jesd_common.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_JESD_COMMON + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_CddcBypassMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_CddcBypassMode_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_CddcBypassMode_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x612U), + (uint32_t) bfValue, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_CddcBypassMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_CddcBypassMode_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x612U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_CducBypassMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_CducBypassMode_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_CducBypassMode_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x138U), + ((uint32_t) bfValue << 2), + 0xCU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_CducBypassMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_CducBypassMode_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x138U), + &bfValueTmp, + 0xCU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxChannelSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JrxChannelSelLink0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxChannelSelLink0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxChannelSelLink0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1601 + channelId * 4U), + ((uint32_t) bfValue << 2), + 0x1CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxChannelSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxChannelSelLink0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxChannelSelLink0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1601 + channelId * 4U), + &bfValueTmp, + 0x1CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxChannelSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JrxChannelSelLink1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxChannelSelLink1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxChannelSelLink1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1B81 + channelId * 4U), + ((uint32_t) bfValue << 2), + 0x1CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxChannelSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxChannelSelLink1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxChannelSelLink1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1B81 + channelId * 4U), + &bfValueTmp, + 0x1CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxCoreConvDisableLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JrxCoreConvDisableLink0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxCoreConvDisableLink0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxCoreConvDisableLink0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1602 + channelId * 4U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxCoreConvDisableLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxCoreConvDisableLink0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxCoreConvDisableLink0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1602 + channelId * 4U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxCoreConvDisableLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JrxCoreConvDisableLink1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxCoreConvDisableLink1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxCoreConvDisableLink1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1B82 + channelId * 4U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxCoreConvDisableLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxCoreConvDisableLink1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxCoreConvDisableLink1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1B82 + channelId * 4U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxCrcErrCntThreshold_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JrxCrcErrCntThreshold_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxCrcErrCntThreshold_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x13AU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bBde_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bBde_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bBde_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3C8 + channelId * 4U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bBdCnt_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bBdCnt_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bBdCnt_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3C9 + channelId * 4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bCgs_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bCgs_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bCgs_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3C8 + channelId * 4U), + &bfValueTmp, + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 1); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bCks_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bCks_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bCks_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3C8 + channelId * 4U), + &bfValueTmp, + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bEcntEna_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JrxDl204bEcntEna_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bEcntEna_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bEcntEna_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x348 + channelId * 4U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bEcntEna_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bEcntEna_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bEcntEna_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x348 + channelId * 4U), + &bfValueTmp, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bEcntRst_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JrxDl204bEcntRst_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bEcntRst_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bEcntRst_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x348 + channelId * 4U), + ((uint32_t) bfValue << 4), + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bEcntTch_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JrxDl204bEcntTch_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bEcntTch_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bEcntTch_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x349 + channelId * 4U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bEcntTch_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bEcntTch_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bEcntTch_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x349 + channelId * 4U), + &bfValueTmp, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bEofEvent_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bEofEvent_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bEofEvent_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x44B + channelId * 4U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bEomfEvent_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bEomfEvent_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bEomfEvent_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x44B + channelId * 4U), + &bfValueTmp, + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 1); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bEth_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JrxDl204bEth_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bEth_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x144U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bFs_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bFs_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bFs_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3C8 + channelId * 4U), + &bfValueTmp, + 0x8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 3); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bFsLost_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bFsLost_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bFsLost_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x44B + channelId * 4U), + &bfValueTmp, + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bIld_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bIld_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bIld_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3C8 + channelId * 4U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bIls_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bIls_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bIls_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3C8 + channelId * 4U), + &bfValueTmp, + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 5); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bIrqClr_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JrxDl204bIrqClr_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bIrqClr_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x142), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x143), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bIrqClr_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bIrqClr_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x142U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x143U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bIrqVec_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bIrqVec_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bIrqVec_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x4C8 + channelId * 4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x4C9 + channelId * 4U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x148 + channelId * 4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x149 + channelId * 4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg10_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg10_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg10_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x24A + channelId * 4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg13_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg13_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg13_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x2C9 + channelId * 4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg2_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg2_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x14A + channelId * 4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg3_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg3_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x14B + channelId * 4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg4_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg4_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg4_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1C8 + channelId * 4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg5_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg5_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg5_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1C9 + channelId * 4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg6_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg6_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg6_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1CA + channelId * 4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg7_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg7_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg7_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1CB + channelId * 4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg8_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg8_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg8_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x248 + channelId * 4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg9_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg9_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bL0Rxcfg9_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x249 + channelId * 4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bNit_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bNit_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bNit_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3C8 + channelId * 4U), + &bfValueTmp, + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 6); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bNitCnt_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bNitCnt_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bNitCnt_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3CB + channelId * 4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bUek_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bUek_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bUek_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3C8 + channelId * 4U), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 7); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bUekCnt_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bUekCnt_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bUekCnt_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3CA + channelId * 4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bUserData_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204bUserData_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204bUserData_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x44B + channelId * 4U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204cClrErrCnt_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JrxDl204cClrErrCnt_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204cClrErrCnt_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x548U), + ((uint32_t) bfValue << 3), + 0x8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204cCrcErrCnt_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204cCrcErrCnt_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204cCrcErrCnt_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5D1 + channelId * 4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204cEmbErrCnt_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204cEmbErrCnt_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204cEmbErrCnt_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5D2 + channelId * 4U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204cMbErrCnt_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204cMbErrCnt_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204cMbErrCnt_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5D2 + channelId * 4U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204cShErrCnt_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204cShErrCnt_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204cShErrCnt_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x552 + channelId * 4U), + &bfValueTmp, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204cState_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxDl204cState_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxDl204cState_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x551 + channelId * 4U), + &bfValueTmp, + 0xE0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 5); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxLaneLoopback_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JrxLaneLoopback_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxLaneLoopback_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x33U), + ((uint32_t) bfValue << 3), + 0x8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxLinkEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JrxLinkEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxLinkEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x138U), + (uint32_t) bfValue, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxLinkEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxLinkEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x138U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxSampleLoopback_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JrxSampleLoopback_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxSampleLoopback_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x33U), + ((uint32_t) bfValue << 7), + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxSampleLoopback_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxSampleLoopback_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x33U), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 7); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestLaneClearErrors_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JrxTestLaneClearErrors_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxTestLaneClearErrors_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x30U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestLaneErrorCount_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxTestLaneErrorCount_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxTestLaneErrorCount_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x35 + channelId * 4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x36 + channelId * 4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x37 + channelId * 4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestLaneErrorFlag_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxTestLaneErrorFlag_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxTestLaneErrorFlag_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x34 + channelId * 4U), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 7); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestLaneInv_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxTestLaneInv_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxTestLaneInv_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x34 + channelId * 4U), + &bfValueTmp, + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 5); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestLaneInvalidDataFlag_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxTestLaneInvalidDataFlag_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JrxTestLaneInvalidDataFlag_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x34 + channelId * 4U), + &bfValueTmp, + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 6); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestLaneUpdateErrorCount_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JrxTestLaneUpdateErrorCount_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxTestLaneUpdateErrorCount_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x30U), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JrxTestMode_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxTestMode_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x32U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxTestMode_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x32U), + &bfValueTmp, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestSampleClearErrors_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxTestSampleClearErrors_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x30U), + &bfValueTmp, + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 5); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestSampleErrorCount_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxTestSampleErrorCount_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x31U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestSampleErrorFlag_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxTestSampleErrorFlag_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x30U), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 7); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestSampleUpdateErrorCount_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JrxTestSampleUpdateErrorCount_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxTestSampleUpdateErrorCount_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x30U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestSource_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JrxTestSource_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxTestSource_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x32U), + ((uint32_t) bfValue << 3), + 0x8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestSource_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JrxTestSource_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x32U), + &bfValueTmp, + 0x8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 3); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxChannelSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JtxChannelSelLink0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JtxChannelSelLink0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JtxChannelSelLink0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xA01 + channelId * 4U), + ((uint32_t) bfValue << 2), + 0x1CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxChannelSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JtxChannelSelLink0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JtxChannelSelLink0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xA01 + channelId * 4U), + &bfValueTmp, + 0x1CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxChannelSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JtxChannelSelLink1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JtxChannelSelLink1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JtxChannelSelLink1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xF81 + channelId * 4U), + ((uint32_t) bfValue << 2), + 0x1CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxChannelSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JtxChannelSelLink1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JtxChannelSelLink1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xF81 + channelId * 4U), + &bfValueTmp, + 0x1CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxCoreConvDisableLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JtxCoreConvDisableLink0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JtxCoreConvDisableLink0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JtxCoreConvDisableLink0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xA02 + channelId * 4U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxCoreConvDisableLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JtxCoreConvDisableLink0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JtxCoreConvDisableLink0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xA02 + channelId * 4U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxCoreConvDisableLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JtxCoreConvDisableLink1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JtxCoreConvDisableLink1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JtxCoreConvDisableLink1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xF82 + channelId * 4U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxCoreConvDisableLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JtxCoreConvDisableLink1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JtxCoreConvDisableLink1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xF82 + channelId * 4U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxCoreConvDisableLink2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JtxCoreConvDisableLink2_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JtxCoreConvDisableLink2_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JtxCoreConvDisableLink2_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1182 + channelId * 4U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxCoreConvDisableLink2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JtxCoreConvDisableLink2_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_JtxCoreConvDisableLink2_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1182 + channelId * 4U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxLinkEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JtxLinkEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JtxLinkEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x610U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxLinkEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JtxLinkEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x610U), + &bfValueTmp, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxSampleLoopback_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_JtxSampleLoopback_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JtxSampleLoopback_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x610U), + ((uint32_t) bfValue << 4), + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxSampleLoopback_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_JtxSampleLoopback_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x610U), + &bfValueTmp, + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_OrxSampleSelLink2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_OrxSampleSelLink2_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_OrxSampleSelLink2_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_OrxSampleSelLink2_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1180 + channelId * 4U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_OrxSampleSelLink2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_OrxSampleSelLink2_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_OrxSampleSelLink2_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1180 + channelId * 4U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx0ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Rx0ChSampleSelLink0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx0ChSampleSelLink0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx0ChSampleSelLink0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x700 + channelId * 4U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx0ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx0ChSampleSelLink0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx0ChSampleSelLink0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x700 + channelId * 4U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx0ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Rx0ChSampleSelLink1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx0ChSampleSelLink1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx0ChSampleSelLink1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xE00 + channelId * 4U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx0ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx0ChSampleSelLink1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx0ChSampleSelLink1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xE00 + channelId * 4U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx1ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Rx1ChSampleSelLink0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx1ChSampleSelLink0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx1ChSampleSelLink0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x700 + channelId * 4), + bfValue << 5, + 0xE0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x701 + channelId * 4), + bfValue >> 3, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx1ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx1ChSampleSelLink0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx1ChSampleSelLink0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x700 + channelId * 4U), + &bfValueTmp, + 0xE0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 5)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x701 + channelId * 4U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 3)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx1ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Rx1ChSampleSelLink1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx1ChSampleSelLink1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx1ChSampleSelLink1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xE00 + channelId * 4), + bfValue << 5, + 0xE0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xE01 + channelId * 4), + bfValue >> 3, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx1ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx1ChSampleSelLink1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx1ChSampleSelLink1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xE00 + channelId * 4U), + &bfValueTmp, + 0xE0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 5)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xE01 + channelId * 4U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 3)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx2ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Rx2ChSampleSelLink0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx2ChSampleSelLink0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx2ChSampleSelLink0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x701 + channelId * 4U), + ((uint32_t) bfValue << 2), + 0x7CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx2ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx2ChSampleSelLink0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx2ChSampleSelLink0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x701 + channelId * 4U), + &bfValueTmp, + 0x7CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx2ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Rx2ChSampleSelLink1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx2ChSampleSelLink1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx2ChSampleSelLink1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xE01 + channelId * 4U), + ((uint32_t) bfValue << 2), + 0x7CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx2ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx2ChSampleSelLink1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx2ChSampleSelLink1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xE01 + channelId * 4U), + &bfValueTmp, + 0x7CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx3ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Rx3ChSampleSelLink0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx3ChSampleSelLink0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx3ChSampleSelLink0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x701 + channelId * 4), + bfValue << 7, + 0x80); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x702 + channelId * 4), + bfValue >> 1, + 0xF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx3ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx3ChSampleSelLink0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx3ChSampleSelLink0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x701 + channelId * 4U), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 7)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x702 + channelId * 4U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 1)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx3ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Rx3ChSampleSelLink1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx3ChSampleSelLink1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx3ChSampleSelLink1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xE01 + channelId * 4), + bfValue << 7, + 0x80); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xE02 + channelId * 4), + bfValue >> 1, + 0xF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx3ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx3ChSampleSelLink1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx3ChSampleSelLink1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xE01 + channelId * 4U), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 7)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xE02 + channelId * 4U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 1)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx4ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Rx4ChSampleSelLink0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx4ChSampleSelLink0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx4ChSampleSelLink0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x702 + channelId * 4), + bfValue << 4, + 0xF0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x703 + channelId * 4), + bfValue >> 4, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx4ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx4ChSampleSelLink0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx4ChSampleSelLink0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x702 + channelId * 4U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 4)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x703 + channelId * 4U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 4)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx4ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Rx4ChSampleSelLink1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx4ChSampleSelLink1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx4ChSampleSelLink1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xE02 + channelId * 4), + bfValue << 4, + 0xF0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xE03 + channelId * 4), + bfValue >> 4, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx4ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx4ChSampleSelLink1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx4ChSampleSelLink1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xE02 + channelId * 4U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 4)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xE03 + channelId * 4U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 4)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx5ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Rx5ChSampleSelLink0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx5ChSampleSelLink0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx5ChSampleSelLink0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x703 + channelId * 4U), + ((uint32_t) bfValue << 1), + 0x3EU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx5ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx5ChSampleSelLink0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx5ChSampleSelLink0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x703 + channelId * 4U), + &bfValueTmp, + 0x3EU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 1); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx5ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Rx5ChSampleSelLink1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx5ChSampleSelLink1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx5ChSampleSelLink1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xE03 + channelId * 4U), + ((uint32_t) bfValue << 1), + 0x3EU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx5ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx5ChSampleSelLink1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx5ChSampleSelLink1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xE03 + channelId * 4U), + &bfValueTmp, + 0x3EU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 1); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx6ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Rx6ChSampleSelLink0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx6ChSampleSelLink0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx6ChSampleSelLink0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xA00 + channelId * 4U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx6ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx6ChSampleSelLink0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx6ChSampleSelLink0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xA00 + channelId * 4U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx6ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Rx6ChSampleSelLink1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx6ChSampleSelLink1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx6ChSampleSelLink1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xF80 + channelId * 4U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx6ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx6ChSampleSelLink1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx6ChSampleSelLink1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xF80 + channelId * 4U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx7ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Rx7ChSampleSelLink0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx7ChSampleSelLink0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx7ChSampleSelLink0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xA00 + channelId * 4), + bfValue << 5, + 0xE0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xA01 + channelId * 4), + bfValue >> 3, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx7ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx7ChSampleSelLink0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx7ChSampleSelLink0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xA00 + channelId * 4U), + &bfValueTmp, + 0xE0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 5)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xA01 + channelId * 4U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 3)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx7ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Rx7ChSampleSelLink1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx7ChSampleSelLink1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx7ChSampleSelLink1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xF80 + channelId * 4), + bfValue << 5, + 0xE0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xF81 + channelId * 4), + bfValue >> 3, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx7ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Rx7ChSampleSelLink1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Rx7ChSampleSelLink1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xF80 + channelId * 4U), + &bfValueTmp, + 0xE0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 5)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xF81 + channelId * 4U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 3)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_RxSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_RxSampleSelLink0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_RxSampleSelLink0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_RxSampleSelLink0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xD00 + channelId * 4U), + (uint32_t) bfValue, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_RxSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_RxSampleSelLink0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_RxSampleSelLink0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xD00 + channelId * 4U), + &bfValueTmp, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_RxSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_RxSampleSelLink1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_RxSampleSelLink1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_RxSampleSelLink1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1100 + channelId * 4U), + (uint32_t) bfValue, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_RxSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_RxSampleSelLink1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_RxSampleSelLink1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1100 + channelId * 4U), + &bfValueTmp, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx0ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Tx0ChSampleSelLink0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx0ChSampleSelLink0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx0ChSampleSelLink0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1300 + channelId * 4U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx0ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx0ChSampleSelLink0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx0ChSampleSelLink0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1300 + channelId * 4U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx0ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Tx0ChSampleSelLink1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx0ChSampleSelLink1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx0ChSampleSelLink1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1A00 + channelId * 4U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx0ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx0ChSampleSelLink1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx0ChSampleSelLink1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1A00 + channelId * 4U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx1ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Tx1ChSampleSelLink0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx1ChSampleSelLink0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx1ChSampleSelLink0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1300 + channelId * 4), + bfValue << 5, + 0xE0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1301 + channelId * 4), + bfValue >> 3, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx1ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx1ChSampleSelLink0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx1ChSampleSelLink0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1300 + channelId * 4U), + &bfValueTmp, + 0xE0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 5)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1301 + channelId * 4U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 3)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx1ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Tx1ChSampleSelLink1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx1ChSampleSelLink1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx1ChSampleSelLink1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1A00 + channelId * 4), + bfValue << 5, + 0xE0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1A01 + channelId * 4), + bfValue >> 3, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx1ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx1ChSampleSelLink1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx1ChSampleSelLink1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1A00 + channelId * 4U), + &bfValueTmp, + 0xE0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 5)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1A01 + channelId * 4U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 3)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx2ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Tx2ChSampleSelLink0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx2ChSampleSelLink0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx2ChSampleSelLink0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1301 + channelId * 4U), + ((uint32_t) bfValue << 2), + 0x7CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx2ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx2ChSampleSelLink0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx2ChSampleSelLink0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1301 + channelId * 4U), + &bfValueTmp, + 0x7CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx2ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Tx2ChSampleSelLink1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx2ChSampleSelLink1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx2ChSampleSelLink1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1A01 + channelId * 4U), + ((uint32_t) bfValue << 2), + 0x7CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx2ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx2ChSampleSelLink1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx2ChSampleSelLink1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1A01 + channelId * 4U), + &bfValueTmp, + 0x7CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx3ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Tx3ChSampleSelLink0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx3ChSampleSelLink0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx3ChSampleSelLink0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1301 + channelId * 4), + bfValue << 7, + 0x80); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1302 + channelId * 4), + bfValue >> 1, + 0xF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx3ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx3ChSampleSelLink0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx3ChSampleSelLink0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1301 + channelId * 4U), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 7)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1302 + channelId * 4U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 1)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx3ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Tx3ChSampleSelLink1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx3ChSampleSelLink1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx3ChSampleSelLink1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1A01 + channelId * 4), + bfValue << 7, + 0x80); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1A02 + channelId * 4), + bfValue >> 1, + 0xF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx3ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx3ChSampleSelLink1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx3ChSampleSelLink1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1A01 + channelId * 4U), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 7)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1A02 + channelId * 4U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 1)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx4ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Tx4ChSampleSelLink0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx4ChSampleSelLink0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx4ChSampleSelLink0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1302 + channelId * 4), + bfValue << 4, + 0xF0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1303 + channelId * 4), + bfValue >> 4, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx4ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx4ChSampleSelLink0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx4ChSampleSelLink0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1302 + channelId * 4U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 4)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1303 + channelId * 4U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 4)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx4ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Tx4ChSampleSelLink1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx4ChSampleSelLink1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx4ChSampleSelLink1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1A02 + channelId * 4), + bfValue << 4, + 0xF0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1A03 + channelId * 4), + bfValue >> 4, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx4ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx4ChSampleSelLink1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx4ChSampleSelLink1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1A02 + channelId * 4U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 4)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1A03 + channelId * 4U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 4)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx5ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Tx5ChSampleSelLink0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx5ChSampleSelLink0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx5ChSampleSelLink0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1303 + channelId * 4U), + ((uint32_t) bfValue << 1), + 0x3EU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx5ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx5ChSampleSelLink0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx5ChSampleSelLink0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1303 + channelId * 4U), + &bfValueTmp, + 0x3EU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 1); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx5ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Tx5ChSampleSelLink1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx5ChSampleSelLink1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx5ChSampleSelLink1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1A03 + channelId * 4U), + ((uint32_t) bfValue << 1), + 0x3EU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx5ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx5ChSampleSelLink1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx5ChSampleSelLink1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1A03 + channelId * 4U), + &bfValueTmp, + 0x3EU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 1); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx6ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Tx6ChSampleSelLink0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx6ChSampleSelLink0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx6ChSampleSelLink0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1600 + channelId * 4U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx6ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx6ChSampleSelLink0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx6ChSampleSelLink0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1600 + channelId * 4U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx6ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Tx6ChSampleSelLink1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx6ChSampleSelLink1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx6ChSampleSelLink1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1B80 + channelId * 4U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx6ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx6ChSampleSelLink1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx6ChSampleSelLink1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1B80 + channelId * 4U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx7ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Tx7ChSampleSelLink0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx7ChSampleSelLink0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx7ChSampleSelLink0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1600 + channelId * 4), + bfValue << 5, + 0xE0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1601 + channelId * 4), + bfValue >> 3, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx7ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx7ChSampleSelLink0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx7ChSampleSelLink0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1600 + channelId * 4U), + &bfValueTmp, + 0xE0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 5)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1601 + channelId * 4U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 3)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx7ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_Tx7ChSampleSelLink1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx7ChSampleSelLink1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx7ChSampleSelLink1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1B80 + channelId * 4), + bfValue << 5, + 0xE0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1B81 + channelId * 4), + bfValue >> 3, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx7ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_Tx7ChSampleSelLink1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_Tx7ChSampleSelLink1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1B80 + channelId * 4U), + &bfValueTmp, + 0xE0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 5)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1B81 + channelId * 4U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 3)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_TxSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_TxSampleSelLink0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_TxSampleSelLink0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_TxSampleSelLink0_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1900 + channelId * 4U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_TxSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_TxSampleSelLink0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_TxSampleSelLink0_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1900 + channelId * 4U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_TxSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JesdCommon_TxSampleSelLink1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_TxSampleSelLink1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_TxSampleSelLink1_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1D00 + channelId * 4U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_TxSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JesdCommon_TxSampleSelLink1_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JesdCommon_TxSampleSelLink1_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1D00 + channelId * 4U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jesd_common.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jesd_common.h new file mode 100644 index 00000000000..26d5018f057 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jesd_common.h @@ -0,0 +1,974 @@ +/** + * \file adrv904x_bf_jesd_common.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_JESD_COMMON_H_ +#define _ADRV904X_BF_JESD_COMMON_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_jesd_common_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_CddcBypassMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_CddcBypassMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_CducBypassMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_CducBypassMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxChannelSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxChannelSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxChannelSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxChannelSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxCoreConvDisableLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxCoreConvDisableLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxCoreConvDisableLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxCoreConvDisableLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxCrcErrCntThreshold_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bBde_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bBdCnt_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bCgs_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bCks_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bEcntEna_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bEcntEna_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bEcntRst_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bEcntTch_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bEcntTch_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bEofEvent_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bEomfEvent_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bEth_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bFs_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bFsLost_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bIld_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bIls_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bIrqClr_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bIrqClr_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bIrqVec_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg10_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg13_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg3_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg4_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg5_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg6_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg7_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg8_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bL0Rxcfg9_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bNit_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bNitCnt_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bUek_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bUekCnt_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204bUserData_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204cClrErrCnt_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204cCrcErrCnt_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204cEmbErrCnt_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204cMbErrCnt_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204cShErrCnt_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxDl204cState_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxLaneLoopback_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxLinkEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxLinkEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxSampleLoopback_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxSampleLoopback_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestLaneClearErrors_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestLaneErrorCount_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestLaneErrorFlag_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestLaneInv_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestLaneInvalidDataFlag_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestLaneUpdateErrorCount_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestSampleClearErrors_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestSampleErrorCount_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestSampleErrorFlag_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestSampleUpdateErrorCount_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestSource_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JrxTestSource_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxChannelSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxChannelSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxChannelSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxChannelSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxCoreConvDisableLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxCoreConvDisableLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxCoreConvDisableLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxCoreConvDisableLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxCoreConvDisableLink2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxCoreConvDisableLink2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxLinkEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxLinkEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxSampleLoopback_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_JtxSampleLoopback_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_OrxSampleSelLink2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_OrxSampleSelLink2_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx0ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx0ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx0ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx0ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx1ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx1ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx1ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx1ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx2ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx2ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx2ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx2ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx3ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx3ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx3ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx3ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx4ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx4ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx4ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx4ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx5ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx5ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx5ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx5ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx6ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx6ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx6ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx6ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx7ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx7ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx7ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Rx7ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_RxSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_RxSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_RxSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_RxSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx0ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx0ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx0ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx0ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx1ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx1ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx1ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx1ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx2ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx2ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx2ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx2ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx3ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx3ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx3ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx3ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx4ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx4ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx4ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx4ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx5ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx5ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx5ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx5ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx6ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx6ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx6ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx6ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx7ChSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx7ChSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx7ChSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_Tx7ChSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_TxSampleSelLink0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_TxSampleSelLink0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_TxSampleSelLink1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JesdCommon_TxSampleSelLink1_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJesdCommonChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); +#endif // _ADRV904X_BF_JESD_COMMON_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jesd_common_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jesd_common_types.h new file mode 100644 index 00000000000..874bce19cc2 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jesd_common_types.h @@ -0,0 +1,24 @@ +/** + * \file adrv904x_bf_jesd_common_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_JESD_COMMON_TYPES_H_ +#define _ADRV904X_BF_JESD_COMMON_TYPES_H_ + +typedef enum adrv904x_BfJesdCommonChanAddr +{ + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON = 0x48000000 +} adrv904x_BfJesdCommonChanAddr_e; + +#endif // _ADRV904X_BF_JESD_COMMON_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jrx_link.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jrx_link.c new file mode 100644 index 00000000000..4ec067bc887 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jrx_link.c @@ -0,0 +1,2048 @@ +/** + * \file adrv904x_bf_jrx_link.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_jrx_link.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_JRX_LINK + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreBufDepth_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreBufDepth_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x325U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreChksumCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreChksumCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JrxLink_JrxCoreChksumCfg_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x358 + channelId * 4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreClearSyncNeCount_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JrxLink_JrxCoreClearSyncNeCount_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreClearSyncNeCount_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x0U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreCsCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreCsCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x355U), + &bfValueTmp, + 0xC0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 6); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreDidCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreDidCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x330U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreDscrCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreDscrCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x331U), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 7); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreECfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreECfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x379U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreFCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreFCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x332U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreHdCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreHdCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x355U), + &bfValueTmp, + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 5); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreJesdvCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreJesdvCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x357U), + &bfValueTmp, + 0xE0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 5); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreKCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreKCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x333U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreLaneSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreLaneSel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JrxLink_JrxCoreLaneSel_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x304 + channelId * 4U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreLidCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreLidCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JrxLink_JrxCoreLidCfg_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x334 + channelId * 4U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreLCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreLCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x331U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreMCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreMCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x354U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreNpCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreNpCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x356U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreNCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreNCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x355U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCorePclkErrorClear_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JrxLink_JrxCorePclkErrorClear_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCorePclkErrorClear_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x0U), + ((uint32_t) bfValue << 5), + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCorePclkErrorClear_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCorePclkErrorClear_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x0U), + &bfValueTmp, + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 5); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCorePhaseAdjust_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 65535U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JrxLink_JrxCorePhaseAdjust_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCorePhaseAdjust_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x2), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCorePhaseAdjust_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCorePhaseAdjust_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x2U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCorePhaseDiff_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCorePhaseDiff_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x326U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x327U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSubclassvCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreSubclassvCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x356U), + &bfValueTmp, + 0xE0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 5); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSyncNeCount_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreSyncNeCount_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x324U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSyncNSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreSyncNSel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSysrefClrPhaseErr_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JrxLink_JrxCoreSysrefClrPhaseErr_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreSysrefClrPhaseErr_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x328U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSysrefClrPhaseErr_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreSysrefClrPhaseErr_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x328U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSysrefEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JrxLink_JrxCoreSysrefEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreSysrefEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x328U), + ((uint32_t) bfValue << 2), + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSysrefEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreSysrefEnable_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x328U), + &bfValueTmp, + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSysrefForRelink_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreSysrefForRelink_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x0U), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 7); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSysrefForStartup_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreSysrefForStartup_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x0U), + &bfValueTmp, + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 6); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSysrefIgnoreWhenLinked_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreSysrefIgnoreWhenLinked_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x328U), + &bfValueTmp, + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 1); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSysrefNShotCount_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreSysrefNShotCount_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x329U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSysrefNShotEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreSysrefNShotEnable_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x329U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSysrefRcvd_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreSysrefRcvd_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x32AU), + &bfValueTmp, + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreSCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x357U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreUsrDataRdy_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxCoreUsrDataRdy_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x32AU), + &bfValueTmp, + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 1); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxLinkType_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxLinkType_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x0U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxTplBufDepth_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JrxLink_JrxTplBufDepth_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JrxLink_JrxTplBufDepth_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x307 + channelId * 4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jrx_link.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jrx_link.h new file mode 100644 index 00000000000..098a65c5410 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jrx_link.h @@ -0,0 +1,230 @@ +/** + * \file adrv904x_bf_jrx_link.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_JRX_LINK_H_ +#define _ADRV904X_BF_JRX_LINK_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_jrx_link_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreBufDepth_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreChksumCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreClearSyncNeCount_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreCsCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreDidCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreDscrCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreECfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreFCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreHdCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreJesdvCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreKCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreLaneSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreLidCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreLCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreMCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreNpCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreNCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCorePclkErrorClear_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCorePclkErrorClear_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCorePhaseAdjust_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCorePhaseAdjust_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCorePhaseDiff_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSubclassvCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSyncNeCount_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSyncNSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSysrefClrPhaseErr_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSysrefClrPhaseErr_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSysrefEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSysrefEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSysrefForRelink_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSysrefForStartup_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSysrefIgnoreWhenLinked_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSysrefNShotCount_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSysrefNShotEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSysrefRcvd_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreSCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxCoreUsrDataRdy_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxLinkType_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxLink_JrxTplBufDepth_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJrxLinkChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +#endif // _ADRV904X_BF_JRX_LINK_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jrx_link_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jrx_link_types.h new file mode 100644 index 00000000000..ae00b27f131 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jrx_link_types.h @@ -0,0 +1,25 @@ +/** + * \file adrv904x_bf_jrx_link_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_JRX_LINK_TYPES_H_ +#define _ADRV904X_BF_JRX_LINK_TYPES_H_ + +typedef enum adrv904x_BfJrxLinkChanAddr +{ + ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_ = 0x48010000, + ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_ = 0x48020000 +} adrv904x_BfJrxLinkChanAddr_e; + +#endif // _ADRV904X_BF_JRX_LINK_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jtx_link.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jtx_link.c new file mode 100644 index 00000000000..8cc81d3761f --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jtx_link.c @@ -0,0 +1,2442 @@ +/** + * \file adrv904x_bf_jtx_link.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_jtx_link.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_JTX_LINK + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxBidCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxBidCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x441U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxDidCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxDidCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x440U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxDl204bClearSyncNeCount_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JtxLink_JtxDl204bClearSyncNeCount_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxDl204bClearSyncNeCount_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x473U), + ((uint32_t) bfValue << 7), + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxDl204bState_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxDl204bState_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x474U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxDl204bSyncN_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxDl204bSyncN_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x476U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxDl204bSyncNeCount_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxDl204bSyncNeCount_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x475U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxDl204bSyncNForceEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JtxLink_JtxDl204bSyncNForceEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxDl204bSyncNForceEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x473U), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxDl204bSyncNForceEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxDl204bSyncNForceEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x473U), + &bfValueTmp, + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 1); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxDl204bSyncNForceVal_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JtxLink_JtxDl204bSyncNForceVal_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxDl204bSyncNForceVal_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x473U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxDl204cSysrefRcvd_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxDl204cSysrefRcvd_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x4A4U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxECfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxECfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x4A0U), + &bfValueTmp, + 0xF8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 3); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxForceLanePd_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxForceLanePd_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JtxLink_JtxForceLanePd_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x304 + channelId * 4U), + &bfValueTmp, + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 6); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxFCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxFCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x444U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxKCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxKCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x445U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxLaneInv_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JtxLink_JtxLaneInv_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxLaneInv_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JtxLink_JtxLaneInv_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x304 + channelId * 4U), + ((uint32_t) bfValue << 5), + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxLaneInv_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxLaneInv_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JtxLink_JtxLaneInv_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x304 + channelId * 4U), + &bfValueTmp, + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 5); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxLaneSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxLaneSel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_JtxLink_JtxLaneSel_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x304 + channelId * 4U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxLidCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxLidCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x442U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxLinkType_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxLinkType_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x300U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxMCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxMCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x446U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxNpCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxNpCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x448U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxPclkErrorClear_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JtxLink_JtxPclkErrorClear_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxPclkErrorClear_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x4ACU), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxPclkErrorClear_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxPclkErrorClear_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x4ACU), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxPclkFastError_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxPclkFastError_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x4ACU), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxPclkSlowError_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxPclkSlowError_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x4ADU), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxScrCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxScrCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x443U), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 7); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxSyncNSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxSyncNSel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x302U), + &bfValueTmp, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxSysrefForRelink_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxSysrefForRelink_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x300U), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 7); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxSysrefForStartup_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxSysrefForStartup_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x300U), + &bfValueTmp, + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 6); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxSCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxSCfg_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x449U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTestGenMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JtxLink_JtxTestGenMode_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxTestGenMode_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x301U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTestGenMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxTestGenMode_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x301U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTestGenSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JtxLink_JtxTestGenSel_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxTestGenSel_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x301U), + ((uint32_t) bfValue << 4), + 0x30U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTestGenSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxTestGenSel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x301U), + &bfValueTmp, + 0x30U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplCfgInvalid_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxTplCfgInvalid_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x439U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplPhaseAdjust_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 65535U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JtxLink_JtxTplPhaseAdjust_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxTplPhaseAdjust_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x434), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x435), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplPhaseAdjust_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxTplPhaseAdjust_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x434U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x435U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplSysrefClrPhaseErr_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JtxLink_JtxTplSysrefClrPhaseErr_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxTplSysrefClrPhaseErr_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x431U), + ((uint32_t) bfValue << 6), + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplSysrefClrPhaseErr_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxTplSysrefClrPhaseErr_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x431U), + &bfValueTmp, + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 6); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplSysrefIgnoreWhenLinked_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxTplSysrefIgnoreWhenLinked_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x431U), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 7); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplSysrefMask_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_JtxLink_JtxTplSysrefMask_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxTplSysrefMask_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x431U), + ((uint32_t) bfValue << 5), + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplSysrefMask_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxTplSysrefMask_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x431U), + &bfValueTmp, + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 5); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplSysrefNShotCount_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxTplSysrefNShotCount_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x433U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplSysrefNShotEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxTplSysrefNShotEnable_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x433U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplSysrefPhaseErr_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxTplSysrefPhaseErr_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x439U), + &bfValueTmp, + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplSysrefRcvd_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_JtxLink_JtxTplSysrefRcvd_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x439U), + &bfValueTmp, + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 1); + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jtx_link.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jtx_link.h new file mode 100644 index 00000000000..5e0a9d9c3e5 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jtx_link.h @@ -0,0 +1,265 @@ +/** + * \file adrv904x_bf_jtx_link.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_JTX_LINK_H_ +#define _ADRV904X_BF_JTX_LINK_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_jtx_link_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxBidCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxDidCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxDl204bClearSyncNeCount_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxDl204bState_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxDl204bSyncN_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxDl204bSyncNeCount_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxDl204bSyncNForceEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxDl204bSyncNForceEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxDl204bSyncNForceVal_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxDl204cSysrefRcvd_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxECfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxForceLanePd_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxFCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxKCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxLaneInv_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxLaneInv_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxLaneSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxLidCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxLinkType_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxMCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxNpCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxPclkErrorClear_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxPclkErrorClear_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxPclkFastError_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxPclkSlowError_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxScrCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxSyncNSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxSysrefForRelink_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxSysrefForStartup_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxSCfg_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTestGenMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTestGenMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTestGenSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTestGenSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplCfgInvalid_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplPhaseAdjust_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplPhaseAdjust_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplSysrefClrPhaseErr_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplSysrefClrPhaseErr_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplSysrefIgnoreWhenLinked_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplSysrefMask_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplSysrefMask_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplSysrefNShotCount_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplSysrefNShotEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplSysrefPhaseErr_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JtxLink_JtxTplSysrefRcvd_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfJtxLinkChanAddr_e baseAddr, + uint8_t* const bfValue); + +#endif // _ADRV904X_BF_JTX_LINK_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jtx_link_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jtx_link_types.h new file mode 100644 index 00000000000..37e6639b192 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_jtx_link_types.h @@ -0,0 +1,26 @@ +/** + * \file adrv904x_bf_jtx_link_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_JTX_LINK_TYPES_H_ +#define _ADRV904X_BF_JTX_LINK_TYPES_H_ + +typedef enum adrv904x_BfJtxLinkChanAddr +{ + ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_ = 0x48030000, + ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_ = 0x48040000, + ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_ = 0x48050000 +} adrv904x_BfJtxLinkChanAddr_e; + +#endif // _ADRV904X_BF_JTX_LINK_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_orx_dig.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_orx_dig.c new file mode 100644 index 00000000000..cf12a700d00 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_orx_dig.c @@ -0,0 +1,2102 @@ +/** + * \file adrv904x_bf_orx_dig.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_orx_dig.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_ORX_DIG + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_CptBusy_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_CptBusy_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xD4U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_CptTrigger_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_CptTrigger_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_CptTrigger_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xD0U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_IntDataFormat_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_IntDataFormat_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_IntDataFormat_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x29U), + ((uint32_t) bfValue << 5), + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_IntDataFormat_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_IntDataFormat_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x29U), + &bfValueTmp, + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 5); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_IntDataResolution_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_IntDataResolution_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_IntDataResolution_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x29U), + ((uint32_t) bfValue << 6), + 0xC0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_IntDataResolution_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_IntDataResolution_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x29U), + &bfValueTmp, + 0xC0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 6); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_ObsCapMemClkDivideRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_ObsCapMemClkDivideRatio_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_ObsCapMemClkDivideRatio_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x8U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_ObsCapMemClkDivideRatio_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_ObsCapMemClkDivideRatio_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x8U), + &bfValueTmp, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_Orx6dbGainEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_Orx6dbGainEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_Orx6dbGainEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x28U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x70U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x70U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection10_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection10_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection10_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x75U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection11_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection11_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection11_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x75U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection12_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection12_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection12_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x76U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection13_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection13_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection13_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x76U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection14_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection14_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection14_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x77U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection15_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection15_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection15_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x77U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection16_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection16_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection16_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x78U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection17_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection17_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection17_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x78U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection18_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection18_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection18_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x79U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection19_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection19_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection19_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x79U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection2_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection2_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x71U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection20_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection20_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection20_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x7AU), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection21_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection21_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection21_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x7AU), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection22_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection22_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection22_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x7BU), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection23_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection23_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection23_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x7BU), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection3_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection3_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x71U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection4_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection4_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x72U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection5_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection5_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x72U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection6_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection6_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x73U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection7_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection7_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x73U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection8_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection8_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection8_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x74U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection9_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OrxGpioSourceSelection9_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OrxGpioSourceSelection9_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x74U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OverloadCountTh_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OverloadCountTh_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OverloadCountTh_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x2DU), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OverloadDurationCount_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OverloadDurationCount_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OverloadDurationCount_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x2CU), + ((uint32_t) bfValue << 3), + 0xF8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OverloadEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OverloadEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OverloadEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x2CU), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OverloadPowerMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OverloadPowerMode_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OverloadPowerMode_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x2CU), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OverloadThHigh_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 16383U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OverloadThHigh_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OverloadThHigh_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x32), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x33), + bfValue >> 8, + 0x3F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OverloadThPre_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 16383U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_OrxDig_OverloadThPre_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_ORX_0__ORX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__ORX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_OrxDig_OverloadThPre_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x2D), + bfValue << 7, + 0x80); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x2E), + bfValue >> 1, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x2F), + bfValue >> 9, + 0x1F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_orx_dig.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_orx_dig.h new file mode 100644 index 00000000000..b7f68134f25 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_orx_dig.h @@ -0,0 +1,226 @@ +/** + * \file adrv904x_bf_orx_dig.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_ORX_DIG_H_ +#define _ADRV904X_BF_ORX_DIG_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_orx_dig_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_CptBusy_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_CptTrigger_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_IntDataFormat_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_IntDataFormat_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_IntDataResolution_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_IntDataResolution_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_ObsCapMemClkDivideRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_ObsCapMemClkDivideRatio_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_Orx6dbGainEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection10_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection11_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection12_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection13_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection14_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection15_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection16_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection17_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection18_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection19_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection20_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection21_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection22_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection23_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection8_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OrxGpioSourceSelection9_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OverloadCountTh_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OverloadDurationCount_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OverloadEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OverloadPowerMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OverloadThHigh_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDig_OverloadThPre_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfOrxDigChanAddr_e baseAddr, + const uint16_t bfValue); + +#endif // _ADRV904X_BF_ORX_DIG_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_orx_dig_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_orx_dig_types.h new file mode 100644 index 00000000000..bb75fa0bdd5 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_orx_dig_types.h @@ -0,0 +1,25 @@ +/** + * \file adrv904x_bf_orx_dig_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_ORX_DIG_TYPES_H_ +#define _ADRV904X_BF_ORX_DIG_TYPES_H_ + +typedef enum adrv904x_BfOrxDigChanAddr +{ + ADRV904X_BF_SLICE_ORX_0__ORX_DIG = 0x61050000, + ADRV904X_BF_SLICE_ORX_1__ORX_DIG = 0x61150000 +} adrv904x_BfOrxDigChanAddr_e; + +#endif // _ADRV904X_BF_ORX_DIG_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_pll_mem_map.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_pll_mem_map.c new file mode 100644 index 00000000000..0648fa52037 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_pll_mem_map.c @@ -0,0 +1,222 @@ +/** + * \file adrv904x_bf_pll_mem_map.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_pll_mem_map.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_PLL_MEM_MAP + +ADI_API adi_adrv904x_ErrAction_e adrv904x_PllMemMap_McsSpiStatus_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfPllMemMapChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_EAST_RFPLL) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_WEST_RFPLL) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERDES_PLL) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_CLKPLL)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_PllMemMap_McsSpiStatus_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x25U), + &bfValueTmp, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_PllMemMap_SelRxLo_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfPllMemMapChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_EAST_RFPLL) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_WEST_RFPLL) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERDES_PLL) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_CLKPLL)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_PllMemMap_SelRxLo_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x6CU), + &bfValueTmp, + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 6); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_PllMemMap_SelTxLo_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfPllMemMapChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_EAST_RFPLL) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_WEST_RFPLL) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERDES_PLL) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_CLKPLL)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_PllMemMap_SelTxLo_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x6CU), + &bfValueTmp, + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 5); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_PllMemMap_SynLock_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfPllMemMapChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_EAST_RFPLL) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_WEST_RFPLL) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERDES_PLL) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_CLKPLL)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_PllMemMap_SynLock_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x26U), + &bfValueTmp, + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 5); + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_pll_mem_map.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_pll_mem_map.h new file mode 100644 index 00000000000..7c2a6f4b36d --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_pll_mem_map.h @@ -0,0 +1,51 @@ +/** + * \file adrv904x_bf_pll_mem_map.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_PLL_MEM_MAP_H_ +#define _ADRV904X_BF_PLL_MEM_MAP_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_pll_mem_map_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_PllMemMap_McsSpiStatus_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfPllMemMapChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_PllMemMap_SelRxLo_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfPllMemMapChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_PllMemMap_SelTxLo_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfPllMemMapChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_PllMemMap_SynLock_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfPllMemMapChanAddr_e baseAddr, + uint8_t* const bfValue); + +#endif // _ADRV904X_BF_PLL_MEM_MAP_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_pll_mem_map_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_pll_mem_map_types.h new file mode 100644 index 00000000000..021c22e74f9 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_pll_mem_map_types.h @@ -0,0 +1,135 @@ +/** + * \file adrv904x_bf_pll_mem_map_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_PLL_MEM_MAP_TYPES_H_ +#define _ADRV904X_BF_PLL_MEM_MAP_TYPES_H_ + +typedef enum adrv904x_BfPllMemMapChanAddr +{ + ADRV904X_BF_DIGITAL_CORE_EAST_RFPLL = 0x47300000, + ADRV904X_BF_DIGITAL_CORE_WEST_RFPLL = 0x47400000, + ADRV904X_BF_DIGITAL_CORE_JESD_SERDES_PLL = 0x48060000, + ADRV904X_BF_DIGITAL_CORE_JESD_CLKPLL = 0x48090000 +} adrv904x_BfPllMemMapChanAddr_e; + +/** + * \brief Enumeration for calper + */ + +typedef enum adrv904x_Bf_PllMemMap_Calper +{ + ADRV904X_BF_PLL_MEM_MAP_CALPER_CALPER1 = 0, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_CALPER_CALPER2 = 1, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_CALPER_CALPER4 = 2, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_CALPER_CALPER8 = 3, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_CALPER_CALPER16 = 4, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_CALPER_CALPER32 = 5, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_CALPER_CALPER64 = 6, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_CALPER_CALPER128 = 7 /*!< No description provided */ +} adrv904x_Bf_PllMemMap_Calper_e; + +/** + * \brief Enumeration for caltyp + */ + +typedef enum adrv904x_Bf_PllMemMap_Caltyp +{ + ADRV904X_BF_PLL_MEM_MAP_CALTYP_IDLE = 0, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_CALTYP_ICAL = 1, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_CALTYP_TCAL = 2, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_CALTYP_CTCAL = 3, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_CALTYP_CRCAL = 4, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_CALTYP_ICALC = 5, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_CALTYP_TCALC = 6, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_CALTYP_CTCALC = 7 /*!< No description provided */ +} adrv904x_Bf_PllMemMap_Caltyp_e; + +/** + * \brief Enumeration for icalwait + */ + +typedef enum adrv904x_Bf_PllMemMap_Icalwait +{ + ADRV904X_BF_PLL_MEM_MAP_ICALWAIT_ICALWAIT_1K = 0, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_ICALWAIT_ICALWAIT_2K = 1, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_ICALWAIT_ICALWAIT_4K = 2, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_ICALWAIT_ICALWAIT_8K = 3 /*!< No description provided */ +} adrv904x_Bf_PllMemMap_Icalwait_e; + +/** + * \brief Enumeration for qthr + */ + +typedef enum adrv904x_Bf_PllMemMap_Qthr +{ + ADRV904X_BF_PLL_MEM_MAP_QTHR_QTHR0 = 0, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_QTHR_QTHR1 = 1, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_QTHR_QTHR2 = 2, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_QTHR_QTHR3 = 3, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_QTHR_QTHR4 = 4, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_QTHR_QTHR5 = 5, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_QTHR_QTHR6 = 6, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_QTHR_QTHR7 = 7, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_QTHR_QTHR8 = 8, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_QTHR_QTHR9 = 9, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_QTHR_QTHR10 = 10, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_QTHR_QTHR11 = 11, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_QTHR_QTHR12 = 12, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_QTHR_QTHR13 = 13, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_QTHR_QTHR14 = 14, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_QTHR_QTHR15 = 15 /*!< No description provided */ +} adrv904x_Bf_PllMemMap_Qthr_e; + +/** + * \brief Enumeration for tsprsc + */ + +typedef enum adrv904x_Bf_PllMemMap_Tsprsc +{ + ADRV904X_BF_PLL_MEM_MAP_TSPRSC_TPRSC_1 = 0, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_TSPRSC_TPRSC_2 = 1, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_TSPRSC_TPRSC_4 = 2, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_TSPRSC_TPRSC_8 = 3, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_TSPRSC_TPRSC_16 = 4, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_TSPRSC_TPRSC_32 = 5, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_TSPRSC_TPRSC_64 = 6, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_TSPRSC_TPRSC_128 = 7, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_TSPRSC_TPRSC_256 = 8, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_TSPRSC_TPRSC_512 = 9, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_TSPRSC_TPRSC_1K = 10, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_TSPRSC_TPRSC_2K = 11, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_TSPRSC_TPRSC_4K = 12, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_TSPRSC_TPRSC_8K = 13, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_TSPRSC_TPRSC_16K = 14, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_TSPRSC_TPRSC_32K = 15 /*!< No description provided */ +} adrv904x_Bf_PllMemMap_Tsprsc_e; + +/** + * \brief Enumeration for vcoCalInitDel + */ + +typedef enum adrv904x_Bf_PllMemMap_VcoCalInitDel +{ + ADRV904X_BF_PLL_MEM_MAP_VCO_CAL_INIT_DEL_VCOCCAL_DEL_1K = 0, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_VCO_CAL_INIT_DEL_VCOCCAL_DEL_2K = 1, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_VCO_CAL_INIT_DEL_VCOCCAL_DEL_4K = 2, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_VCO_CAL_INIT_DEL_VCOCCAL_DEL_8K = 3, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_VCO_CAL_INIT_DEL_VCOCCAL_DEL_16K = 4, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_VCO_CAL_INIT_DEL_VCOCCAL_DEL_32K = 5, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_VCO_CAL_INIT_DEL_VCOCCAL_DEL_64K = 6, /*!< No description provided */ + ADRV904X_BF_PLL_MEM_MAP_VCO_CAL_INIT_DEL_VCOCCAL_DEL_128K = 7 /*!< No description provided */ +} adrv904x_Bf_PllMemMap_VcoCalInitDel_e; + +#endif // _ADRV904X_BF_PLL_MEM_MAP_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_ddc.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_ddc.c new file mode 100644 index 00000000000..b64af52a5da --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_ddc.c @@ -0,0 +1,4061 @@ +/** + * \file adrv904x_bf_rx_ddc.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_rx_ddc.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_RX_DDC + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_DecPowerEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_DecPowerEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_DecPowerEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x81U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_DecPowerEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_DecPowerEnable_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x81U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_DecPowerEnSpiOrAgcSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_DecPowerEnSpiOrAgcSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_DecPowerEnSpiOrAgcSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x81U), + ((uint32_t) bfValue << 2), + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_DecPowerEnSpiOrAgcSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_DecPowerEnSpiOrAgcSelect_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x81U), + &bfValueTmp, + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_DecPowerMeasurementDuration_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_DecPowerMeasurementDuration_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_DecPowerMeasurementDuration_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x82U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_DecPowerMeasurementDuration_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_DecPowerMeasurementDuration_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x82U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_DecPowerStartDelayCounter_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 65535U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_DecPowerStartDelayCounter_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_DecPowerStartDelayCounter_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x84), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x85), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_DecPowerTddModeEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_DecPowerTddModeEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_DecPowerTddModeEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x86U), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_DecPowerValue_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_DecPowerValue_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x80U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_DecPowerValueReadback_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_DecPowerValueReadback_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_DecPowerValueReadback_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x81U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_DigitalGainEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_DigitalGainEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_DigitalGainEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x20U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_ExternalSlicerPinControlStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_ExternalSlicerPinControlStep_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x33U), + &bfValueTmp, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_FpEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_FpEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x35U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_FpEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x35U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpExponentBits_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const adrv904x_Bf_RxDdc_FpExponentBits_e bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ( + (bfValue != ADRV904X_BF_RX_DDC_FP_EXPONENT_BITS_RX1_EXP_2 ) && + (bfValue != ADRV904X_BF_RX_DDC_FP_EXPONENT_BITS_RX1_EXP_3 ) && + (bfValue != ADRV904X_BF_RX_DDC_FP_EXPONENT_BITS_RX1_EXP_4 ) && + (bfValue != ADRV904X_BF_RX_DDC_FP_EXPONENT_BITS_RX1_EXP_5 ) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_FpExponentBits_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_FpExponentBits_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x39U), + (uint32_t) bfValue, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpExponentBits_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + adrv904x_Bf_RxDdc_FpExponentBits_e* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (adrv904x_Bf_RxDdc_FpExponentBits_e) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_FpExponentBits_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x39U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (adrv904x_Bf_RxDdc_FpExponentBits_e) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpFloatDataFormat_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_FpFloatDataFormat_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_FpFloatDataFormat_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x31U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpFloatDataFormat_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_FpFloatDataFormat_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x31U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpHideLeadingOnes_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_FpHideLeadingOnes_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_FpHideLeadingOnes_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x34U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpHideLeadingOnes_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_FpHideLeadingOnes_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x34U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpIntDataAtten_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_FpIntDataAtten_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_FpIntDataAtten_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x36U), + ((uint32_t) bfValue << 4), + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpIntDataAtten_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_FpIntDataAtten_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x36U), + &bfValueTmp, + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpNanEncEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_FpNanEncEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_FpNanEncEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3AU), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpNanEncEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_FpNanEncEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3AU), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpRoundMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const adrv904x_Bf_RxDdc_FpRoundMode_e bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ( + (bfValue != ADRV904X_BF_RX_DDC_FP_ROUND_MODE_ROUNDTIESTOEVEN ) && + (bfValue != ADRV904X_BF_RX_DDC_FP_ROUND_MODE_ROUNDTOWARDSPOSITIVE ) && + (bfValue != ADRV904X_BF_RX_DDC_FP_ROUND_MODE_ROUNDTOWARDSNEGATIVE ) && + (bfValue != ADRV904X_BF_RX_DDC_FP_ROUND_MODE_ROUNDTOWARDSZERO ) && + (bfValue != ADRV904X_BF_RX_DDC_FP_ROUND_MODE_ROUNDTIESTOAWAY ) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_FpRoundMode_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_FpRoundMode_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x33U), + ((uint32_t) bfValue << 4), + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpRoundMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + adrv904x_Bf_RxDdc_FpRoundMode_e* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (adrv904x_Bf_RxDdc_FpRoundMode_e) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_FpRoundMode_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x33U), + &bfValueTmp, + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (adrv904x_Bf_RxDdc_FpRoundMode_e) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_GainCompEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_GainCompEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_GainCompEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x21U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_GainCompEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_GainCompEnable_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x21U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_GainCompForExtGain_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_GainCompForExtGain_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_GainCompForExtGain_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x22U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_GainCompForExtGain_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_GainCompForExtGain_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x22U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_GainCompForTempGain_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_GainCompForTempGain_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_GainCompForTempGain_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x27U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_GainCompForTempGain_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_GainCompForTempGain_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x27U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntDataFormat_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_IntDataFormat_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_IntDataFormat_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x40U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntDataFormat_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_IntDataFormat_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x40U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntDataResolution_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_IntDataResolution_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_IntDataResolution_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x40U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntDataResolution_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_IntDataResolution_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x40U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntEmbedSlicer_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_IntEmbedSlicer_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_IntEmbedSlicer_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x39U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntEmbedSlicer_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_IntEmbedSlicer_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x39U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntEmbedSlicerNumber_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_IntEmbedSlicerNumber_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_IntEmbedSlicerNumber_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x32U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntEmbedSlicerNumber_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_IntEmbedSlicerNumber_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x32U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntEmbedSlicerPos_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_IntEmbedSlicerPos_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_IntEmbedSlicerPos_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x32U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntEmbedSlicerPos_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_IntEmbedSlicerPos_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x32U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntEvenParity_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_IntEvenParity_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_IntEvenParity_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x37U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntEvenParity_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_IntEvenParity_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x37U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntParitySupport_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_IntParitySupport_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_IntParitySupport_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x41U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntParitySupport_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_IntParitySupport_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x41U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntSlicerLsbOnQ_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_IntSlicerLsbOnQ_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_IntSlicerLsbOnQ_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x35U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntSlicerLsbOnQ_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_IntSlicerLsbOnQ_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x35U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_MaxSlicer_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_MaxSlicer_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_MaxSlicer_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x2AU), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_MaxSlicerOverride_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_MaxSlicerOverride_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_MaxSlicerOverride_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x27U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_RxMonFormatI_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_RxMonFormatI_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_RxMonFormatI_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_RxDdc_RxMonFormatI_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x44 + channelId * 4U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_RxMonFormatI_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_RxMonFormatI_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_RxDdc_RxMonFormatI_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x44 + channelId * 4U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_RxMonFormatQ_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_RxMonFormatQ_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_RxMonFormatQ_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_RxDdc_RxMonFormatQ_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x46 + channelId * 4U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_RxMonFormatQ_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_RxMonFormatQ_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_RxDdc_RxMonFormatQ_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x46 + channelId * 4U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_RxTempGainComp_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 127U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_RxTempGainComp_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_RxTempGainComp_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x24U), + (uint32_t) bfValue, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_RxTempGainComp_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_RxTempGainComp_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x24U), + &bfValueTmp, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_SlicerPinControlMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_SlicerPinControlMode_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_SlicerPinControlMode_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x42U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_SlicerPinControlMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_SlicerPinControlMode_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x42U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_SlicerPinControlStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_SlicerPinControlStep_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_SlicerPinControlStep_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x38U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_SlicerPinControlStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_SlicerPinControlStep_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x38U), + &bfValueTmp, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_Static3bitSlicerModeEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDdc_Static3bitSlicerModeEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DDC_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DDC_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDdc_Static3bitSlicerModeEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x31U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_ddc.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_ddc.h new file mode 100644 index 00000000000..96a979b731e --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_ddc.h @@ -0,0 +1,340 @@ +/** + * \file adrv904x_bf_rx_ddc.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_RX_DDC_H_ +#define _ADRV904X_BF_RX_DDC_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_rx_ddc_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_DecPowerEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_DecPowerEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_DecPowerEnSpiOrAgcSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_DecPowerEnSpiOrAgcSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_DecPowerMeasurementDuration_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_DecPowerMeasurementDuration_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_DecPowerStartDelayCounter_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_DecPowerTddModeEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_DecPowerValue_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_DecPowerValueReadback_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_DigitalGainEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_ExternalSlicerPinControlStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpExponentBits_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const adrv904x_Bf_RxDdc_FpExponentBits_e bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpExponentBits_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + adrv904x_Bf_RxDdc_FpExponentBits_e* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpFloatDataFormat_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpFloatDataFormat_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpHideLeadingOnes_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpHideLeadingOnes_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpIntDataAtten_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpIntDataAtten_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpNanEncEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpNanEncEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpRoundMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const adrv904x_Bf_RxDdc_FpRoundMode_e bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_FpRoundMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + adrv904x_Bf_RxDdc_FpRoundMode_e* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_GainCompEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_GainCompEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_GainCompForExtGain_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_GainCompForExtGain_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_GainCompForTempGain_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_GainCompForTempGain_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntDataFormat_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntDataFormat_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntDataResolution_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntDataResolution_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntEmbedSlicer_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntEmbedSlicer_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntEmbedSlicerNumber_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntEmbedSlicerNumber_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntEmbedSlicerPos_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntEmbedSlicerPos_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntEvenParity_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntEvenParity_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntParitySupport_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntParitySupport_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntSlicerLsbOnQ_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_IntSlicerLsbOnQ_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_MaxSlicer_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_MaxSlicerOverride_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_RxMonFormatI_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_RxMonFormatI_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_RxMonFormatQ_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_RxMonFormatQ_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_RxTempGainComp_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_RxTempGainComp_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_SlicerPinControlMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_SlicerPinControlMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_SlicerPinControlStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_SlicerPinControlStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdc_Static3bitSlicerModeEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDdcChanAddr_e baseAddr, + const uint8_t bfValue); + +#endif // _ADRV904X_BF_RX_DDC_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_ddc_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_ddc_types.h new file mode 100644 index 00000000000..73d39b666da --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_ddc_types.h @@ -0,0 +1,64 @@ +/** + * \file adrv904x_bf_rx_ddc_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_RX_DDC_TYPES_H_ +#define _ADRV904X_BF_RX_DDC_TYPES_H_ + +typedef enum adrv904x_BfRxDdcChanAddr +{ + ADRV904X_BF_SLICE_RX_0__RX_DDC_0_ = 0x60060000, + ADRV904X_BF_SLICE_RX_0__RX_DDC_1_ = 0x60070000, + ADRV904X_BF_SLICE_RX_1__RX_DDC_0_ = 0x60160000, + ADRV904X_BF_SLICE_RX_1__RX_DDC_1_ = 0x60170000, + ADRV904X_BF_SLICE_RX_2__RX_DDC_0_ = 0x60260000, + ADRV904X_BF_SLICE_RX_2__RX_DDC_1_ = 0x60270000, + ADRV904X_BF_SLICE_RX_3__RX_DDC_0_ = 0x60360000, + ADRV904X_BF_SLICE_RX_3__RX_DDC_1_ = 0x60370000, + ADRV904X_BF_SLICE_RX_4__RX_DDC_0_ = 0x60460000, + ADRV904X_BF_SLICE_RX_4__RX_DDC_1_ = 0x60470000, + ADRV904X_BF_SLICE_RX_5__RX_DDC_0_ = 0x60560000, + ADRV904X_BF_SLICE_RX_5__RX_DDC_1_ = 0x60570000, + ADRV904X_BF_SLICE_RX_6__RX_DDC_0_ = 0x60660000, + ADRV904X_BF_SLICE_RX_6__RX_DDC_1_ = 0x60670000, + ADRV904X_BF_SLICE_RX_7__RX_DDC_0_ = 0x60760000, + ADRV904X_BF_SLICE_RX_7__RX_DDC_1_ = 0x60770000 +} adrv904x_BfRxDdcChanAddr_e; + +/** + * \brief Enumeration for fpExponentBits + */ + +typedef enum adrv904x_Bf_RxDdc_FpExponentBits +{ + ADRV904X_BF_RX_DDC_FP_EXPONENT_BITS_RX1_EXP_2 = 0, /*!< No description provided */ + ADRV904X_BF_RX_DDC_FP_EXPONENT_BITS_RX1_EXP_3 = 1, /*!< No description provided */ + ADRV904X_BF_RX_DDC_FP_EXPONENT_BITS_RX1_EXP_4 = 2, /*!< No description provided */ + ADRV904X_BF_RX_DDC_FP_EXPONENT_BITS_RX1_EXP_5 = 3 /*!< No description provided */ +} adrv904x_Bf_RxDdc_FpExponentBits_e; + +/** + * \brief Enumeration for fpRoundMode + */ + +typedef enum adrv904x_Bf_RxDdc_FpRoundMode +{ + ADRV904X_BF_RX_DDC_FP_ROUND_MODE_ROUNDTIESTOEVEN = 0, /*!< No description provided */ + ADRV904X_BF_RX_DDC_FP_ROUND_MODE_ROUNDTOWARDSPOSITIVE = 1, /*!< No description provided */ + ADRV904X_BF_RX_DDC_FP_ROUND_MODE_ROUNDTOWARDSNEGATIVE = 2, /*!< No description provided */ + ADRV904X_BF_RX_DDC_FP_ROUND_MODE_ROUNDTOWARDSZERO = 3, /*!< No description provided */ + ADRV904X_BF_RX_DDC_FP_ROUND_MODE_ROUNDTIESTOAWAY = 4 /*!< No description provided */ +} adrv904x_Bf_RxDdc_FpRoundMode_e; + +#endif // _ADRV904X_BF_RX_DDC_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_dig.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_dig.c new file mode 100644 index 00000000000..aee8d804b54 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_dig.c @@ -0,0 +1,1614 @@ +/** + * \file adrv904x_bf_rx_dig.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_rx_dig.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_RX_DIG + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AdcTestClkSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDig_AdcTestClkSel_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_AdcTestClkSel_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x10DU), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AdcTestClkSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_AdcTestClkSel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x10DU), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AdcTestGenEnSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDig_AdcTestGenEnSel_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_AdcTestGenEnSel_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x110U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AdcTestGenEnSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_AdcTestGenEnSel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x110U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AdcTestGenEnSpi_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDig_AdcTestGenEnSpi_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_AdcTestGenEnSpi_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x111U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AdcTestGenEnSpi_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_AdcTestGenEnSpi_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x111U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AdcTestGenSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDig_AdcTestGenSel_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_AdcTestGenSel_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x10EU), + (uint32_t) bfValue, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AdcTestGenSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_AdcTestGenSel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x10EU), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AdcTestGenSineFreq_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDig_AdcTestGenSineFreq_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_AdcTestGenSineFreq_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x111U), + (uint32_t) bfValue, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AdcTestGenSineFreq_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_AdcTestGenSineFreq_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x111U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AgcDecGainGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDig_AgcDecGainGpioSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_AgcDecGainGpioSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x105U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AgcGainChangeGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDig_AgcGainChangeGpioSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_AgcGainChangeGpioSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x104U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AgcIncGainGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDig_AgcIncGainGpioSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_AgcIncGainGpioSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x106U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AgcManualGainLockGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDig_AgcManualGainLockGpioSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_AgcManualGainLockGpioSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x100U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AgcSlowloopFreezeEnableGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDig_AgcSlowloopFreezeEnableGpioSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_AgcSlowloopFreezeEnableGpioSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x101U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_Ddc1Hb1OutClkDivideRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDig_Ddc1Hb1OutClkDivideRatio_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_Ddc1Hb1OutClkDivideRatio_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x12U), + ((uint32_t) bfValue << 4), + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_DecpwrClkDivideRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDig_DecpwrClkDivideRatio_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_DecpwrClkDivideRatio_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xFU), + ((uint32_t) bfValue << 4), + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_DecpwrClkEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDig_DecpwrClkEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_DecpwrClkEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x15U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_Hb2OutClkDivideRatio_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_Hb2OutClkDivideRatio_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x14U), + &bfValueTmp, + 0x30U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_PeakDetectClkDivideRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDig_PeakDetectClkDivideRatio_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_PeakDetectClkDivideRatio_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1CU), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_PeakDetectClkEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDig_PeakDetectClkEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_PeakDetectClkEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x8U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_ReferenceClockCycles_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_ReferenceClockCycles_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1EU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_RoutClkDivideRatio_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_RoutClkDivideRatio_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x4U), + &bfValueTmp, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_RssiEnableGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDig_RssiEnableGpioSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_RssiEnableGpioSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x102U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_RxGpioSourceSelection_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDig_RxGpioSourceSelection_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_RxGpioSourceSelection_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_RxDig_RxGpioSourceSelection_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xA0 + channelId * 4U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_StreamprocDdc1Hb1OutClkEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDig_StreamprocDdc1Hb1OutClkEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_StreamprocDdc1Hb1OutClkEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x94U), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_TestGenEnGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxDig_TestGenEnGpioSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxDig_TestGenEnGpioSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x10FU), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_dig.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_dig.h new file mode 100644 index 00000000000..53da337d62c --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_dig.h @@ -0,0 +1,167 @@ +/** + * \file adrv904x_bf_rx_dig.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_RX_DIG_H_ +#define _ADRV904X_BF_RX_DIG_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_rx_dig_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AdcTestClkSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AdcTestClkSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AdcTestGenEnSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AdcTestGenEnSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AdcTestGenEnSpi_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AdcTestGenEnSpi_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AdcTestGenSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AdcTestGenSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AdcTestGenSineFreq_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AdcTestGenSineFreq_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AgcDecGainGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AgcGainChangeGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AgcIncGainGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AgcManualGainLockGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_AgcSlowloopFreezeEnableGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_Ddc1Hb1OutClkDivideRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_DecpwrClkDivideRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_DecpwrClkEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_Hb2OutClkDivideRatio_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_PeakDetectClkDivideRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_PeakDetectClkEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_ReferenceClockCycles_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_RoutClkDivideRatio_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_RssiEnableGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_RxGpioSourceSelection_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_StreamprocDdc1Hb1OutClkEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDig_TestGenEnGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +#endif // _ADRV904X_BF_RX_DIG_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_dig_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_dig_types.h new file mode 100644 index 00000000000..6c8b4dc52f9 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_dig_types.h @@ -0,0 +1,31 @@ +/** + * \file adrv904x_bf_rx_dig_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_RX_DIG_TYPES_H_ +#define _ADRV904X_BF_RX_DIG_TYPES_H_ + +typedef enum adrv904x_BfRxDigChanAddr +{ + ADRV904X_BF_SLICE_RX_0__RX_DIG = 0x60040000, + ADRV904X_BF_SLICE_RX_1__RX_DIG = 0x60140000, + ADRV904X_BF_SLICE_RX_2__RX_DIG = 0x60240000, + ADRV904X_BF_SLICE_RX_3__RX_DIG = 0x60340000, + ADRV904X_BF_SLICE_RX_4__RX_DIG = 0x60440000, + ADRV904X_BF_SLICE_RX_5__RX_DIG = 0x60540000, + ADRV904X_BF_SLICE_RX_6__RX_DIG = 0x60640000, + ADRV904X_BF_SLICE_RX_7__RX_DIG = 0x60740000 +} adrv904x_BfRxDigChanAddr_e; + +#endif // _ADRV904X_BF_RX_DIG_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_funcs.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_funcs.c new file mode 100644 index 00000000000..2e9d356d1d4 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_funcs.c @@ -0,0 +1,9544 @@ +/** + * \file adrv904x_bf_rx_funcs.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_rx_funcs.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_RX_FUNCS + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcovrgHigh_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcAdcovrgHigh_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x34U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcovrgLow_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcAdcovrgLow_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xDU), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcovrgLowInt0Counter_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcAdcovrgLowInt0Counter_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcAdcovrgLowInt0Counter_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x58U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcovrgLowInt0Counter_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcAdcovrgLowInt0Counter_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x58U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcovrgLowInt1Counter_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcAdcovrgLowInt1Counter_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcAdcovrgLowInt1Counter_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5EU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcovrgLowInt1Counter_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcAdcovrgLowInt1Counter_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5EU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcHighOvrgExceededCounter_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcAdcHighOvrgExceededCounter_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcAdcHighOvrgExceededCounter_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x71U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcHighOvrgExceededCounter_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcAdcHighOvrgExceededCounter_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x71U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcLowOvrgExceededCounter_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcAdcLowOvrgExceededCounter_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcAdcLowOvrgExceededCounter_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x49U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcLowOvrgExceededCounter_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcAdcLowOvrgExceededCounter_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x49U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcResetGainStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcAdcResetGainStep_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcAdcResetGainStep_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x38U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcResetGainStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcAdcResetGainStep_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x38U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAttackDelay_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcAttackDelay_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcAttackDelay_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x8U), + (uint32_t) bfValue, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAttackDelay_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcAttackDelay_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x8U), + &bfValueTmp, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcChangeGainIfAdcovrgHigh_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcChangeGainIfAdcovrgHigh_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcChangeGainIfAdcovrgHigh_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x67U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcChangeGainIfAdcovrgHigh_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcChangeGainIfAdcovrgHigh_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x67U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcChangeGainIfUlbthHigh_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcChangeGainIfUlbthHigh_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcChangeGainIfUlbthHigh_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x66U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcChangeGainIfUlbthHigh_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcChangeGainIfUlbthHigh_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x66U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDelayCounterBaseRate_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcDelayCounterBaseRate_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcDelayCounterBaseRate_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x4CU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcDualbandEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcDualbandEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x33U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcDualbandEnable_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x33U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandExtTableLowerIndex_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcDualbandExtTableLowerIndex_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcDualbandExtTableLowerIndex_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x72U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandExtTableLowerIndex_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcDualbandExtTableLowerIndex_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x72U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandExtTableUpperIndex_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcDualbandExtTableUpperIndex_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcDualbandExtTableUpperIndex_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x2BU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandExtTableUpperIndex_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcDualbandExtTableUpperIndex_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x2BU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandHighLnaThreshold_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcDualbandHighLnaThreshold_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcDualbandHighLnaThreshold_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x70U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandHighLnaThreshold_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcDualbandHighLnaThreshold_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x70U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandLnaStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcDualbandLnaStep_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcDualbandLnaStep_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x4FU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandLnaStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcDualbandLnaStep_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x4FU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandLowLnaThreshold_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcDualbandLowLnaThreshold_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcDualbandLowLnaThreshold_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x61U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandLowLnaThreshold_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcDualbandLowLnaThreshold_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x61U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandMaxIndex_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcDualbandMaxIndex_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcDualbandMaxIndex_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5BU), + ((uint32_t) bfValue << 4), + 0x30U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandMaxIndex_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcDualbandMaxIndex_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5BU), + &bfValueTmp, + 0x30U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandPwrMargin_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcDualbandPwrMargin_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcDualbandPwrMargin_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x53U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandPwrMargin_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcDualbandPwrMargin_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x53U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcEnableFastRecoveryLoop_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcEnableFastRecoveryLoop_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcEnableFastRecoveryLoop_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x6DU), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcEnableFastRecoveryLoop_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcEnableFastRecoveryLoop_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x6DU), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcEnableGainIndexUpdate_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcEnableGainIndexUpdate_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x74U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcEnableSyncPulseForGainCounter_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcEnableSyncPulseForGainCounter_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcEnableSyncPulseForGainCounter_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3FU), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcEnableSyncPulseForGainCounter_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcEnableSyncPulseForGainCounter_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3FU), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcGainIndex_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcGainIndex_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcGainIndex_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x7AU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcGainIndex_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcGainIndex_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x7AU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcGainUpdateCounter_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 4194303U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcGainUpdateCounter_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcGainUpdateCounter_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x18), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x19), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1A), + bfValue >> 16, + 0x3F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcGainUpdateCounter_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcGainUpdateCounter_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x18U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x19U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1AU), + &bfValueTmp, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLlbGainStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcLlbGainStep_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcLlbGainStep_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x79U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLlbGainStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcLlbGainStep_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x79U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLlbThresholdExceededCounter_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcLlbThresholdExceededCounter_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcLlbThresholdExceededCounter_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x29U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLlbThresholdExceededCounter_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcLlbThresholdExceededCounter_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x29U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLlBlocker_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcLlBlocker_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xBU), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLockLevel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 127U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcLockLevel_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcLockLevel_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1EU), + (uint32_t) bfValue, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLockLevel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcLockLevel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1EU), + &bfValueTmp, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLower0Threshold_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 127U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcLower0Threshold_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcLower0Threshold_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x78U), + (uint32_t) bfValue, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLower0Threshold_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcLower0Threshold_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x78U), + &bfValueTmp, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLower0ThresholdExceededGainStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcLower0ThresholdExceededGainStep_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcLower0ThresholdExceededGainStep_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x23U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLower0ThresholdExceededGainStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcLower0ThresholdExceededGainStep_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x23U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLower1Threshold_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcLower1Threshold_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcLower1Threshold_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x39U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLower1Threshold_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcLower1Threshold_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x39U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLower1ThresholdExceededGainStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcLower1ThresholdExceededGainStep_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcLower1ThresholdExceededGainStep_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x75U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLower1ThresholdExceededGainStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcLower1ThresholdExceededGainStep_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x75U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLowThsPreventGainInc_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcLowThsPreventGainInc_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcLowThsPreventGainInc_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x74U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLowThsPreventGainInc_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcLowThsPreventGainInc_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x74U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcManualGainIndex_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcManualGainIndex_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x51U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcManualGainPinControl_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcManualGainPinControl_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcManualGainPinControl_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x65U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcMaximumGainIndex_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcMaximumGainIndex_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcMaximumGainIndex_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3CU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcMaximumGainIndex_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcMaximumGainIndex_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3CU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcMinimumGainIndex_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcMinimumGainIndex_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcMinimumGainIndex_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x48U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcMinimumGainIndex_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcMinimumGainIndex_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x48U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcOvrgHighGainStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcOvrgHighGainStep_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcOvrgHighGainStep_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x21), + bfValue << 4, + 0xF0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x22), + bfValue >> 4, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcOvrgHighGainStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcOvrgHighGainStep_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x21U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 4)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x22U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 4)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcOvrgLowGainStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcOvrgLowGainStep_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcOvrgLowGainStep_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x25), + bfValue << 4, + 0xF0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x26), + bfValue >> 4, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcOvrgLowGainStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcOvrgLowGainStep_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x25U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 4)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x26U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 4)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcOvrgLowInt0GainStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcOvrgLowInt0GainStep_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcOvrgLowInt0GainStep_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x0U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcOvrgLowInt0GainStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcOvrgLowInt0GainStep_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x0U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcOvrgLowInt1GainStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcOvrgLowInt1GainStep_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcOvrgLowInt1GainStep_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x47U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcOvrgLowInt1GainStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcOvrgLowInt1GainStep_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x47U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcOvrgResetpdHighCount_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcOvrgResetpdHighCount_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcOvrgResetpdHighCount_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x2CU), + (uint32_t) bfValue, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcPeakThresholdGainControlMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcPeakThresholdGainControlMode_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcPeakThresholdGainControlMode_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x25U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcPeakThresholdGainControlMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcPeakThresholdGainControlMode_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x25U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcPeakWaitTime_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcPeakWaitTime_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcPeakWaitTime_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x20U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcPeakWaitTime_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcPeakWaitTime_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x20U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcResetCounters_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcResetCounters_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcResetCounters_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x59U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcResetOnRxon_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcResetOnRxon_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcResetOnRxon_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x42U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcResetOnRxon_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcResetOnRxon_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x42U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcSetup_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcSetup_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcSetup_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x27U), + ((uint32_t) bfValue << 4), + 0x30U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcSetup_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcSetup_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x27U), + &bfValueTmp, + 0x30U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcSlowloopFreezeEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcSlowloopFreezeEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcSlowloopFreezeEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x21U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcSlowloopFreezeEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcSlowloopFreezeEnable_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x21U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcSlowLoopSettlingDelay_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcSlowLoopSettlingDelay_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcSlowLoopSettlingDelay_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x68U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcSlowLoopSettlingDelay_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcSlowLoopSettlingDelay_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x68U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcSoftReset_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcSoftReset_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcSoftReset_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x15U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUlbGainStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcUlbGainStep_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcUlbGainStep_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x17U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUlbGainStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcUlbGainStep_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x17U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUlbThresholdExceededCounter_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcUlbThresholdExceededCounter_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcUlbThresholdExceededCounter_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x7FU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUlbThresholdExceededCounter_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcUlbThresholdExceededCounter_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x7FU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUlBlocker_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcUlBlocker_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x2U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUpper0ThresholdExceededGainStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcUpper0ThresholdExceededGainStep_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcUpper0ThresholdExceededGainStep_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x44), + bfValue << 4, + 0xF0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x45), + bfValue >> 4, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUpper0ThresholdExceededGainStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcUpper0ThresholdExceededGainStep_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x44U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 4)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x45U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 4)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUpper1Threshold_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcUpper1Threshold_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcUpper1Threshold_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x57U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUpper1Threshold_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcUpper1Threshold_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x57U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUpper1ThresholdExceededGainStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcUpper1ThresholdExceededGainStep_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcUpper1ThresholdExceededGainStep_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x73U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUpper1ThresholdExceededGainStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcUpper1ThresholdExceededGainStep_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x73U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUrangeInterval0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 65535U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcUrangeInterval0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcUrangeInterval0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x10), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x11), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUrangeInterval0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcUrangeInterval0_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x10U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x11U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUrangeInterval1Mult_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcUrangeInterval1Mult_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcUrangeInterval1Mult_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x4U), + (uint32_t) bfValue, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUrangeInterval1Mult_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcUrangeInterval1Mult_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x4U), + &bfValueTmp, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUrangeInterval2Mult_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcUrangeInterval2Mult_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcUrangeInterval2Mult_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x2AU), + (uint32_t) bfValue, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUrangeInterval2Mult_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcUrangeInterval2Mult_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x2AU), + &bfValueTmp, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUseCountersForMgc_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_AgcUseCountersForMgc_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_AgcUseCountersForMgc_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x6EU), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_ApdHighSrcSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_ApdHighSrcSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_ApdHighSrcSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x45U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_ApdHighSrcSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_ApdHighSrcSelect_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x45U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_ApdLowSrcSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_ApdLowSrcSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_ApdLowSrcSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x62U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_ApdLowSrcSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_ApdLowSrcSelect_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x62U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_BbdcTrackingEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_BbdcTrackingEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_BbdcTrackingEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xBFU), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_BbdcTrackingEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_BbdcTrackingEnable_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xBFU), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerDataSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_DecPowerDataSel_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_DecPowerDataSel_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x84U), + ((uint32_t) bfValue << 2), + 0xCU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerDataSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_DecPowerDataSel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x84U), + &bfValueTmp, + 0xCU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_DecPowerEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_DecPowerEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x84U), + ((uint32_t) bfValue << 7), + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_DecPowerEnable_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x84U), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 7); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerEnSpiOrAgcSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_DecPowerEnSpiOrAgcSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_DecPowerEnSpiOrAgcSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x84U), + ((uint32_t) bfValue << 5), + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerEnSpiOrAgcSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_DecPowerEnSpiOrAgcSelect_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x84U), + &bfValueTmp, + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 5); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerMeasurementDuration_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_DecPowerMeasurementDuration_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_DecPowerMeasurementDuration_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x85U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerMeasurementDuration_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_DecPowerMeasurementDuration_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x85U), + &bfValueTmp, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerReadback_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_DecPowerReadback_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_DecPowerReadback_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x87U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerStartDelayCounter_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 65535U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_DecPowerStartDelayCounter_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_DecPowerStartDelayCounter_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x88), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x89), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerTddModeEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_DecPowerTddModeEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_DecPowerTddModeEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x8AU), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerValue_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_DecPowerValue_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x86U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DualbandControlBandA_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_DualbandControlBandA_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x12U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DualbandControlBandB_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_DualbandControlBandB_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1BU), + &bfValueTmp, + 0x30U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_Hb2HighSrcSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_Hb2HighSrcSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_Hb2HighSrcSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xBU), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_Hb2HighSrcSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_Hb2HighSrcSelect_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xBU), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_Hb2LowSrcSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_Hb2LowSrcSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_Hb2LowSrcSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x64U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_Hb2LowSrcSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_Hb2LowSrcSelect_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x64U), + &bfValueTmp, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_Hb2OverloadUseHb2In_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_Hb2OverloadUseHb2In_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_Hb2OverloadUseHb2In_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x91U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_Hb2OverloadUseHb2In_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_Hb2OverloadUseHb2In_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x91U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_InvertApdLow_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_InvertApdLow_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_InvertApdLow_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x22U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_InvertApdLow_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_InvertApdLow_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x22U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_InvertHb2Low_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_InvertHb2Low_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_InvertHb2Low_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x4AU), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_InvertHb2Low_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_InvertHb2Low_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x4AU), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadEnAgc_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_OverloadEnAgc_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_OverloadEnAgc_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xABU), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadEnAgc_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_OverloadEnAgc_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xABU), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadPowerModeAgc_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_OverloadPowerModeAgc_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_OverloadPowerModeAgc_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x93U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadPowerModeAgc_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_OverloadPowerModeAgc_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x93U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadThAgcHigh_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 16383U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_OverloadThAgcHigh_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_OverloadThAgcHigh_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x96), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x97), + bfValue >> 8, + 0x3F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadThAgcHigh_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_OverloadThAgcHigh_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x96U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x97U), + &bfValueTmp, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadThAgcInt0Low_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 16383U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_OverloadThAgcInt0Low_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_OverloadThAgcInt0Low_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xAC), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xAD), + bfValue >> 8, + 0x3F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadThAgcInt0Low_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_OverloadThAgcInt0Low_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xACU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xADU), + &bfValueTmp, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadThAgcInt1Low_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 16383U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_OverloadThAgcInt1Low_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_OverloadThAgcInt1Low_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xA0), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xA1), + bfValue >> 8, + 0x3F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadThAgcInt1Low_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_OverloadThAgcInt1Low_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xA0U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xA1U), + &bfValueTmp, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadThAgcLow_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 16383U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_OverloadThAgcLow_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_OverloadThAgcLow_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xAE), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xAF), + bfValue >> 8, + 0x3F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadThAgcLow_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_OverloadThAgcLow_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xAEU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xAFU), + &bfValueTmp, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadThAgcPre_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 16383U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_OverloadThAgcPre_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_OverloadThAgcPre_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xA5), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xA6), + bfValue >> 8, + 0x3F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_PeakCountExpirationAgc_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 33554431U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_PeakCountExpirationAgc_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_PeakCountExpirationAgc_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xB4), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xB5), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xB6), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xB7), + bfValue >> 24, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_PeakCountSpacingAgcHigh_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_PeakCountSpacingAgcHigh_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_PeakCountSpacingAgcHigh_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xB0U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_PeakCountSpacingAgcLow_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_PeakCountSpacingAgcLow_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_PeakCountSpacingAgcLow_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xB1U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_PeakCountThresholdAgcHigh_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_PeakCountThresholdAgcHigh_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_PeakCountThresholdAgcHigh_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xB2U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_PeakCountThresholdAgcLow_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_PeakCountThresholdAgcLow_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_PeakCountThresholdAgcLow_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xB3U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_PeakSampleCountAgc_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_PeakSampleCountAgc_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_PeakSampleCountAgc_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x91U), + ((uint32_t) bfValue << 4), + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_PeakSampleCountAgc_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_PeakSampleCountAgc_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x91U), + &bfValueTmp, + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_PeakWindowSizeAgc_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_PeakWindowSizeAgc_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_PeakWindowSizeAgc_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x90U), + (uint32_t) bfValue, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_PeakWindowSizeAgc_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_PeakWindowSizeAgc_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x90U), + &bfValueTmp, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_ReadGainTable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_ReadGainTable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_ReadGainTable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x62U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_RxdpSlicerPosition_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_RxdpSlicerPosition_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x8CU), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_TiaValidOverride_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_RxFuncs_TiaValidOverride_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__RX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__RX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_RxFuncs_TiaValidOverride_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x6U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_funcs.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_funcs.h new file mode 100644 index 00000000000..3a0a08935b5 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_funcs.h @@ -0,0 +1,846 @@ +/** + * \file adrv904x_bf_rx_funcs.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_RX_FUNCS_H_ +#define _ADRV904X_BF_RX_FUNCS_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_rx_funcs_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcovrgHigh_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcovrgLow_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcovrgLowInt0Counter_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcovrgLowInt0Counter_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcovrgLowInt1Counter_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcovrgLowInt1Counter_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcHighOvrgExceededCounter_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcHighOvrgExceededCounter_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcLowOvrgExceededCounter_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcLowOvrgExceededCounter_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcResetGainStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAdcResetGainStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAttackDelay_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcAttackDelay_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcChangeGainIfAdcovrgHigh_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcChangeGainIfAdcovrgHigh_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcChangeGainIfUlbthHigh_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcChangeGainIfUlbthHigh_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDelayCounterBaseRate_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandExtTableLowerIndex_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandExtTableLowerIndex_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandExtTableUpperIndex_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandExtTableUpperIndex_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandHighLnaThreshold_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandHighLnaThreshold_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandLnaStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandLnaStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandLowLnaThreshold_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandLowLnaThreshold_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandMaxIndex_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandMaxIndex_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandPwrMargin_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcDualbandPwrMargin_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcEnableFastRecoveryLoop_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcEnableFastRecoveryLoop_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcEnableGainIndexUpdate_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcEnableSyncPulseForGainCounter_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcEnableSyncPulseForGainCounter_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcGainIndex_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcGainIndex_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcGainUpdateCounter_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcGainUpdateCounter_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLlbGainStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLlbGainStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLlbThresholdExceededCounter_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLlbThresholdExceededCounter_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLlBlocker_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLockLevel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLockLevel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLower0Threshold_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLower0Threshold_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLower0ThresholdExceededGainStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLower0ThresholdExceededGainStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLower1Threshold_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLower1Threshold_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLower1ThresholdExceededGainStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLower1ThresholdExceededGainStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLowThsPreventGainInc_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcLowThsPreventGainInc_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcManualGainIndex_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcManualGainPinControl_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcMaximumGainIndex_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcMaximumGainIndex_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcMinimumGainIndex_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcMinimumGainIndex_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcOvrgHighGainStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcOvrgHighGainStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcOvrgLowGainStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcOvrgLowGainStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcOvrgLowInt0GainStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcOvrgLowInt0GainStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcOvrgLowInt1GainStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcOvrgLowInt1GainStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcOvrgResetpdHighCount_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcPeakThresholdGainControlMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcPeakThresholdGainControlMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcPeakWaitTime_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcPeakWaitTime_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcResetCounters_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcResetOnRxon_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcResetOnRxon_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcSetup_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcSetup_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcSlowloopFreezeEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcSlowloopFreezeEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcSlowLoopSettlingDelay_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcSlowLoopSettlingDelay_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcSoftReset_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUlbGainStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUlbGainStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUlbThresholdExceededCounter_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUlbThresholdExceededCounter_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUlBlocker_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUpper0ThresholdExceededGainStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUpper0ThresholdExceededGainStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUpper1Threshold_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUpper1Threshold_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUpper1ThresholdExceededGainStep_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUpper1ThresholdExceededGainStep_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUrangeInterval0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUrangeInterval0_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUrangeInterval1Mult_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUrangeInterval1Mult_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUrangeInterval2Mult_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUrangeInterval2Mult_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_AgcUseCountersForMgc_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_ApdHighSrcSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_ApdHighSrcSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_ApdLowSrcSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_ApdLowSrcSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_BbdcTrackingEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_BbdcTrackingEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerDataSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerDataSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerEnSpiOrAgcSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerEnSpiOrAgcSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerMeasurementDuration_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerMeasurementDuration_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerReadback_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerStartDelayCounter_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerTddModeEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DecPowerValue_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DualbandControlBandA_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_DualbandControlBandB_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_Hb2HighSrcSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_Hb2HighSrcSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_Hb2LowSrcSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_Hb2LowSrcSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_Hb2OverloadUseHb2In_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_Hb2OverloadUseHb2In_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_InvertApdLow_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_InvertApdLow_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_InvertHb2Low_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_InvertHb2Low_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadEnAgc_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadEnAgc_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadPowerModeAgc_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadPowerModeAgc_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadThAgcHigh_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadThAgcHigh_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadThAgcInt0Low_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadThAgcInt0Low_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadThAgcInt1Low_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadThAgcInt1Low_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadThAgcLow_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadThAgcLow_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_OverloadThAgcPre_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_PeakCountExpirationAgc_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_PeakCountSpacingAgcHigh_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_PeakCountSpacingAgcLow_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_PeakCountThresholdAgcHigh_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_PeakCountThresholdAgcLow_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_PeakSampleCountAgc_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_PeakSampleCountAgc_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_PeakWindowSizeAgc_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_PeakWindowSizeAgc_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_ReadGainTable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_RxdpSlicerPosition_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncs_TiaValidOverride_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfRxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +#endif // _ADRV904X_BF_RX_FUNCS_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_funcs_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_funcs_types.h new file mode 100644 index 00000000000..69c408bc667 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_rx_funcs_types.h @@ -0,0 +1,31 @@ +/** + * \file adrv904x_bf_rx_funcs_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_RX_FUNCS_TYPES_H_ +#define _ADRV904X_BF_RX_FUNCS_TYPES_H_ + +typedef enum adrv904x_BfRxFuncsChanAddr +{ + ADRV904X_BF_SLICE_RX_0__RX_FUNCS = 0x60030000, + ADRV904X_BF_SLICE_RX_1__RX_FUNCS = 0x60130000, + ADRV904X_BF_SLICE_RX_2__RX_FUNCS = 0x60230000, + ADRV904X_BF_SLICE_RX_3__RX_FUNCS = 0x60330000, + ADRV904X_BF_SLICE_RX_4__RX_FUNCS = 0x60430000, + ADRV904X_BF_SLICE_RX_5__RX_FUNCS = 0x60530000, + ADRV904X_BF_SLICE_RX_6__RX_FUNCS = 0x60630000, + ADRV904X_BF_SLICE_RX_7__RX_FUNCS = 0x60730000 +} adrv904x_BfRxFuncsChanAddr_e; + +#endif // _ADRV904X_BF_RX_FUNCS_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_sequencer.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_sequencer.c new file mode 100644 index 00000000000..d8ed073ff20 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_sequencer.c @@ -0,0 +1,2292 @@ +/** + * \file adrv904x_bf_sequencer.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_sequencer.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_SEQUENCER + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_ApplyNow_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Sequencer_ApplyNow_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Sequencer_ApplyNow_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x0U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_ApplyOnMultiframeBoundary_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Sequencer_ApplyOnMultiframeBoundary_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Sequencer_ApplyOnMultiframeBoundary_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x0U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_DbgState_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Sequencer_DbgState_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Sequencer_DbgState_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xB2 + channelId * 4U), + &bfValueTmp, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_ErrorClear_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Sequencer_ErrorClear_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Sequencer_ErrorClear_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x7U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_ExtendedSymbolSpacing_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 4095U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Sequencer_ExtendedSymbolSpacing_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Sequencer_ExtendedSymbolSpacing_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x14), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x15), + bfValue >> 8, + 0xF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_ExtendedSymbolWidth_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 65535U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Sequencer_ExtendedSymbolWidth_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Sequencer_ExtendedSymbolWidth_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x10), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x11), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_ExternalJumpEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Sequencer_ExternalJumpEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Sequencer_ExternalJumpEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Sequencer_ExternalJumpEnable_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xB3 + channelId * 4U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_ExternalJumpPointer_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + uint8_t channelId, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 4095U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Sequencer_ExternalJumpPointer_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Sequencer_ExternalJumpPointer_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Sequencer_ExternalJumpPointer_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xB0 + channelId * 4), + bfValue << 4, + 0xF0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xB1 + channelId * 4), + bfValue >> 4, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_ExternalJumpPointer_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Sequencer_ExternalJumpPointer_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Sequencer_ExternalJumpPointer_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xB0 + channelId * 4U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 4)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xB1 + channelId * 4U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 4)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_GeneralPurposeReg_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 16777215U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Sequencer_GeneralPurposeReg_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Sequencer_GeneralPurposeReg_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) && + (channelId != 0xC0) && + (channelId != 0xC1) && + (channelId != 0xC2) && + (channelId != 0xC3) && + (channelId != 0xC4) && + (channelId != 0xC5) && + (channelId != 0xC6) && + (channelId != 0xC7) && + (channelId != 0xC8) && + (channelId != 0xC9) && + (channelId != 0xCA) && + (channelId != 0xCB) && + (channelId != 0xCC) && + (channelId != 0xCD) && + (channelId != 0xCE) && + (channelId != 0xCF) && + (channelId != 0xD0) && + (channelId != 0xD1) && + (channelId != 0xD2) && + (channelId != 0xD3) && + (channelId != 0xD4) && + (channelId != 0xD5) && + (channelId != 0xD6) && + (channelId != 0xD7) && + (channelId != 0xD8) && + (channelId != 0xD9) && + (channelId != 0xDA) && + (channelId != 0xDB) && + (channelId != 0xDC) && + (channelId != 0xDD) && + (channelId != 0xDE) && + (channelId != 0xDF) && + (channelId != 0xE0) && + (channelId != 0xE1) && + (channelId != 0xE2) && + (channelId != 0xE3) && + (channelId != 0xE4) && + (channelId != 0xE5) && + (channelId != 0xE6) && + (channelId != 0xE7) && + (channelId != 0xE8) && + (channelId != 0xE9) && + (channelId != 0xEA) && + (channelId != 0xEB) && + (channelId != 0xEC) && + (channelId != 0xED) && + (channelId != 0xEE) && + (channelId != 0xEF) && + (channelId != 0xF0) && + (channelId != 0xF1) && + (channelId != 0xF2) && + (channelId != 0xF3) && + (channelId != 0xF4) && + (channelId != 0xF5) && + (channelId != 0xF6) && + (channelId != 0xF7) && + (channelId != 0xF8) && + (channelId != 0xF9) && + (channelId != 0xFA) && + (channelId != 0xFB) && + (channelId != 0xFC) && + (channelId != 0xFD) && + (channelId != 0xFE) && + (channelId != 0xFF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Sequencer_GeneralPurposeReg_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x100 + channelId * 4), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x101 + channelId * 4), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x102 + channelId * 4), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_GlobalReset_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Sequencer_GlobalReset_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Sequencer_GlobalReset_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xFU), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_MultiframePhaseAdjust_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 33554431U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Sequencer_MultiframePhaseAdjust_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Sequencer_MultiframePhaseAdjust_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x4), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x6), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x7), + bfValue >> 24, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_PointerInit_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 268435455U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Sequencer_PointerInit_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Sequencer_PointerInit_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Sequencer_PointerInit_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x70 + channelId * 4), + bfValue << 4, + 0xF0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x71 + channelId * 4), + bfValue >> 4, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x72 + channelId * 4), + bfValue >> 12, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x73 + channelId * 4), + bfValue >> 20, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_ShortSymbolWidth_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 65535U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Sequencer_ShortSymbolWidth_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Sequencer_ShortSymbolWidth_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x12), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x13), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_SsbSyncGpioSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Sequencer_SsbSyncGpioSel_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Sequencer_SsbSyncGpioSel_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x2U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_SsbSyncPeriod_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 33554431U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Sequencer_SsbSyncPeriod_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Sequencer_SsbSyncPeriod_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xC), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xD), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xE), + bfValue >> 16, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xF), + bfValue >> 24, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_SsbSyncPhaseError_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Sequencer_SsbSyncPhaseError_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_SsbSyncPhaseErrorClear_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Sequencer_SsbSyncPhaseErrorClear_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Sequencer_SsbSyncPhaseErrorClear_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_SsbSyncTrackingMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Sequencer_SsbSyncTrackingMode_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Sequencer_SsbSyncTrackingMode_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1U), + (uint32_t) bfValue, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_SsbSyncTrackingMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Sequencer_SsbSyncTrackingMode_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_XbarCtrlSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Sequencer_XbarCtrlSel_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Sequencer_XbarCtrlSel_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) && + (channelId != 0xC0) && + (channelId != 0xC1) && + (channelId != 0xC2) && + (channelId != 0xC3) && + (channelId != 0xC4) && + (channelId != 0xC5) && + (channelId != 0xC6) && + (channelId != 0xC7) && + (channelId != 0xC8) && + (channelId != 0xC9) && + (channelId != 0xCA) && + (channelId != 0xCB) && + (channelId != 0xCC) && + (channelId != 0xCD) && + (channelId != 0xCE) && + (channelId != 0xCF) && + (channelId != 0xD0) && + (channelId != 0xD1) && + (channelId != 0xD2) && + (channelId != 0xD3) && + (channelId != 0xD4) && + (channelId != 0xD5) && + (channelId != 0xD6) && + (channelId != 0xD7) && + (channelId != 0xD8) && + (channelId != 0xD9) && + (channelId != 0xDA) && + (channelId != 0xDB) && + (channelId != 0xDC) && + (channelId != 0xDD) && + (channelId != 0xDE) && + (channelId != 0xDF) && + (channelId != 0xE0) && + (channelId != 0xE1) && + (channelId != 0xE2) && + (channelId != 0xE3) && + (channelId != 0xE4) && + (channelId != 0xE5) && + (channelId != 0xE6) && + (channelId != 0xE7) && + (channelId != 0xE8) && + (channelId != 0xE9) && + (channelId != 0xEA) && + (channelId != 0xEB) && + (channelId != 0xEC) && + (channelId != 0xED) && + (channelId != 0xEE) && + (channelId != 0xEF) && + (channelId != 0xF0) && + (channelId != 0xF1) && + (channelId != 0xF2) && + (channelId != 0xF3) && + (channelId != 0xF4) && + (channelId != 0xF5) && + (channelId != 0xF6) && + (channelId != 0xF7) && + (channelId != 0xF8) && + (channelId != 0xF9) && + (channelId != 0xFA) && + (channelId != 0xFB) && + (channelId != 0xFC) && + (channelId != 0xFD) && + (channelId != 0xFE) && + (channelId != 0xFF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Sequencer_XbarCtrlSel_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x500 + channelId * 4U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_XbarSequencerSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Sequencer_XbarSequencerSel_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Sequencer_XbarSequencerSel_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) && + (channelId != 0x4) && + (channelId != 0x5) && + (channelId != 0x6) && + (channelId != 0x7) && + (channelId != 0x8) && + (channelId != 0x9) && + (channelId != 0xA) && + (channelId != 0xB) && + (channelId != 0xC) && + (channelId != 0xD) && + (channelId != 0xE) && + (channelId != 0xF) && + (channelId != 0x10) && + (channelId != 0x11) && + (channelId != 0x12) && + (channelId != 0x13) && + (channelId != 0x14) && + (channelId != 0x15) && + (channelId != 0x16) && + (channelId != 0x17) && + (channelId != 0x18) && + (channelId != 0x19) && + (channelId != 0x1A) && + (channelId != 0x1B) && + (channelId != 0x1C) && + (channelId != 0x1D) && + (channelId != 0x1E) && + (channelId != 0x1F) && + (channelId != 0x20) && + (channelId != 0x21) && + (channelId != 0x22) && + (channelId != 0x23) && + (channelId != 0x24) && + (channelId != 0x25) && + (channelId != 0x26) && + (channelId != 0x27) && + (channelId != 0x28) && + (channelId != 0x29) && + (channelId != 0x2A) && + (channelId != 0x2B) && + (channelId != 0x2C) && + (channelId != 0x2D) && + (channelId != 0x2E) && + (channelId != 0x2F) && + (channelId != 0x30) && + (channelId != 0x31) && + (channelId != 0x32) && + (channelId != 0x33) && + (channelId != 0x34) && + (channelId != 0x35) && + (channelId != 0x36) && + (channelId != 0x37) && + (channelId != 0x38) && + (channelId != 0x39) && + (channelId != 0x3A) && + (channelId != 0x3B) && + (channelId != 0x3C) && + (channelId != 0x3D) && + (channelId != 0x3E) && + (channelId != 0x3F) && + (channelId != 0x40) && + (channelId != 0x41) && + (channelId != 0x42) && + (channelId != 0x43) && + (channelId != 0x44) && + (channelId != 0x45) && + (channelId != 0x46) && + (channelId != 0x47) && + (channelId != 0x48) && + (channelId != 0x49) && + (channelId != 0x4A) && + (channelId != 0x4B) && + (channelId != 0x4C) && + (channelId != 0x4D) && + (channelId != 0x4E) && + (channelId != 0x4F) && + (channelId != 0x50) && + (channelId != 0x51) && + (channelId != 0x52) && + (channelId != 0x53) && + (channelId != 0x54) && + (channelId != 0x55) && + (channelId != 0x56) && + (channelId != 0x57) && + (channelId != 0x58) && + (channelId != 0x59) && + (channelId != 0x5A) && + (channelId != 0x5B) && + (channelId != 0x5C) && + (channelId != 0x5D) && + (channelId != 0x5E) && + (channelId != 0x5F) && + (channelId != 0x60) && + (channelId != 0x61) && + (channelId != 0x62) && + (channelId != 0x63) && + (channelId != 0x64) && + (channelId != 0x65) && + (channelId != 0x66) && + (channelId != 0x67) && + (channelId != 0x68) && + (channelId != 0x69) && + (channelId != 0x6A) && + (channelId != 0x6B) && + (channelId != 0x6C) && + (channelId != 0x6D) && + (channelId != 0x6E) && + (channelId != 0x6F) && + (channelId != 0x70) && + (channelId != 0x71) && + (channelId != 0x72) && + (channelId != 0x73) && + (channelId != 0x74) && + (channelId != 0x75) && + (channelId != 0x76) && + (channelId != 0x77) && + (channelId != 0x78) && + (channelId != 0x79) && + (channelId != 0x7A) && + (channelId != 0x7B) && + (channelId != 0x7C) && + (channelId != 0x7D) && + (channelId != 0x7E) && + (channelId != 0x7F) && + (channelId != 0x80) && + (channelId != 0x81) && + (channelId != 0x82) && + (channelId != 0x83) && + (channelId != 0x84) && + (channelId != 0x85) && + (channelId != 0x86) && + (channelId != 0x87) && + (channelId != 0x88) && + (channelId != 0x89) && + (channelId != 0x8A) && + (channelId != 0x8B) && + (channelId != 0x8C) && + (channelId != 0x8D) && + (channelId != 0x8E) && + (channelId != 0x8F) && + (channelId != 0x90) && + (channelId != 0x91) && + (channelId != 0x92) && + (channelId != 0x93) && + (channelId != 0x94) && + (channelId != 0x95) && + (channelId != 0x96) && + (channelId != 0x97) && + (channelId != 0x98) && + (channelId != 0x99) && + (channelId != 0x9A) && + (channelId != 0x9B) && + (channelId != 0x9C) && + (channelId != 0x9D) && + (channelId != 0x9E) && + (channelId != 0x9F) && + (channelId != 0xA0) && + (channelId != 0xA1) && + (channelId != 0xA2) && + (channelId != 0xA3) && + (channelId != 0xA4) && + (channelId != 0xA5) && + (channelId != 0xA6) && + (channelId != 0xA7) && + (channelId != 0xA8) && + (channelId != 0xA9) && + (channelId != 0xAA) && + (channelId != 0xAB) && + (channelId != 0xAC) && + (channelId != 0xAD) && + (channelId != 0xAE) && + (channelId != 0xAF) && + (channelId != 0xB0) && + (channelId != 0xB1) && + (channelId != 0xB2) && + (channelId != 0xB3) && + (channelId != 0xB4) && + (channelId != 0xB5) && + (channelId != 0xB6) && + (channelId != 0xB7) && + (channelId != 0xB8) && + (channelId != 0xB9) && + (channelId != 0xBA) && + (channelId != 0xBB) && + (channelId != 0xBC) && + (channelId != 0xBD) && + (channelId != 0xBE) && + (channelId != 0xBF) && + (channelId != 0xC0) && + (channelId != 0xC1) && + (channelId != 0xC2) && + (channelId != 0xC3) && + (channelId != 0xC4) && + (channelId != 0xC5) && + (channelId != 0xC6) && + (channelId != 0xC7) && + (channelId != 0xC8) && + (channelId != 0xC9) && + (channelId != 0xCA) && + (channelId != 0xCB) && + (channelId != 0xCC) && + (channelId != 0xCD) && + (channelId != 0xCE) && + (channelId != 0xCF) && + (channelId != 0xD0) && + (channelId != 0xD1) && + (channelId != 0xD2) && + (channelId != 0xD3) && + (channelId != 0xD4) && + (channelId != 0xD5) && + (channelId != 0xD6) && + (channelId != 0xD7) && + (channelId != 0xD8) && + (channelId != 0xD9) && + (channelId != 0xDA) && + (channelId != 0xDB) && + (channelId != 0xDC) && + (channelId != 0xDD) && + (channelId != 0xDE) && + (channelId != 0xDF) && + (channelId != 0xE0) && + (channelId != 0xE1) && + (channelId != 0xE2) && + (channelId != 0xE3) && + (channelId != 0xE4) && + (channelId != 0xE5) && + (channelId != 0xE6) && + (channelId != 0xE7) && + (channelId != 0xE8) && + (channelId != 0xE9) && + (channelId != 0xEA) && + (channelId != 0xEB) && + (channelId != 0xEC) && + (channelId != 0xED) && + (channelId != 0xEE) && + (channelId != 0xEF) && + (channelId != 0xF0) && + (channelId != 0xF1) && + (channelId != 0xF2) && + (channelId != 0xF3) && + (channelId != 0xF4) && + (channelId != 0xF5) && + (channelId != 0xF6) && + (channelId != 0xF7) && + (channelId != 0xF8) && + (channelId != 0xF9) && + (channelId != 0xFA) && + (channelId != 0xFB) && + (channelId != 0xFC) && + (channelId != 0xFD) && + (channelId != 0xFE) && + (channelId != 0xFF) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_Sequencer_XbarSequencerSel_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x500 + channelId * 4U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_sequencer.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_sequencer.h new file mode 100644 index 00000000000..386e6c1e6e3 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_sequencer.h @@ -0,0 +1,149 @@ +/** + * \file adrv904x_bf_sequencer.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_SEQUENCER_H_ +#define _ADRV904X_BF_SEQUENCER_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_sequencer_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_ApplyNow_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_ApplyOnMultiframeBoundary_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_DbgState_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_ErrorClear_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_ExtendedSymbolSpacing_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_ExtendedSymbolWidth_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_ExternalJumpEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_ExternalJumpPointer_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + uint8_t channelId, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_ExternalJumpPointer_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_GeneralPurposeReg_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_GlobalReset_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_MultiframePhaseAdjust_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_PointerInit_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_ShortSymbolWidth_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_SsbSyncGpioSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_SsbSyncPeriod_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_SsbSyncPhaseError_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_SsbSyncPhaseErrorClear_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_SsbSyncTrackingMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_SsbSyncTrackingMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_XbarCtrlSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Sequencer_XbarSequencerSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSequencerChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +#endif // _ADRV904X_BF_SEQUENCER_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_sequencer_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_sequencer_types.h new file mode 100644 index 00000000000..73f58c3a3ac --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_sequencer_types.h @@ -0,0 +1,24 @@ +/** + * \file adrv904x_bf_sequencer_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_SEQUENCER_TYPES_H_ +#define _ADRV904X_BF_SEQUENCER_TYPES_H_ + +typedef enum adrv904x_BfSequencerChanAddr +{ + ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS = 0x4D200000 +} adrv904x_BfSequencerChanAddr_e; + +#endif // _ADRV904X_BF_SEQUENCER_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_serdes_rxdig_8pack_regmap_core1p2.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_serdes_rxdig_8pack_regmap_core1p2.c new file mode 100644 index 00000000000..a7e6b072f85 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_serdes_rxdig_8pack_regmap_core1p2.c @@ -0,0 +1,122 @@ +/** + * \file adrv904x_bf_serdes_rxdig_8pack_regmap_core1p2.c Automatically generated file with generator ver + * 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_serdes_rxdig_8pack_regmap_core1p2.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_SERDES_RXDIG_8PACK_REGMAP_CORE1P2 + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SerdesRxdig8packRegmapCore1p2_RxdesPdCh_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSerdesRxdig8packRegmapCore1p2ChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_SerdesRxdig8packRegmapCore1p2_RxdesPdCh_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_DESERIALIZER_DESER_PHY_TOP_8PACK)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_SerdesRxdig8packRegmapCore1p2_RxdesPdCh_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x0U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SerdesRxdig8packRegmapCore1p2_RxdesPdCh_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSerdesRxdig8packRegmapCore1p2ChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_DESERIALIZER_DESER_PHY_TOP_8PACK)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_SerdesRxdig8packRegmapCore1p2_RxdesPdCh_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x0U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_serdes_rxdig_8pack_regmap_core1p2.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_serdes_rxdig_8pack_regmap_core1p2.h new file mode 100644 index 00000000000..fb042a9dee0 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_serdes_rxdig_8pack_regmap_core1p2.h @@ -0,0 +1,42 @@ +/** + * \file adrv904x_bf_serdes_rxdig_8pack_regmap_core1p2.h Automatically generated file with generator ver + * 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_SERDES_RXDIG_8PACK_REGMAP_CORE1P2_H_ +#define _ADRV904X_BF_SERDES_RXDIG_8PACK_REGMAP_CORE1P2_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_serdes_rxdig_8pack_regmap_core1p2_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SerdesRxdig8packRegmapCore1p2_RxdesPdCh_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSerdesRxdig8packRegmapCore1p2ChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SerdesRxdig8packRegmapCore1p2_RxdesPdCh_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSerdesRxdig8packRegmapCore1p2ChanAddr_e baseAddr, + uint8_t* const bfValue); + +#endif // _ADRV904X_BF_SERDES_RXDIG_8PACK_REGMAP_CORE1P2_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_serdes_rxdig_8pack_regmap_core1p2_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_serdes_rxdig_8pack_regmap_core1p2_types.h new file mode 100644 index 00000000000..d96739be93d --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_serdes_rxdig_8pack_regmap_core1p2_types.h @@ -0,0 +1,25 @@ +/** + * \file adrv904x_bf_serdes_rxdig_8pack_regmap_core1p2_types.h Automatically generated file with generator + * ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_SERDES_RXDIG_8PACK_REGMAP_CORE1P2_TYPES_H_ +#define _ADRV904X_BF_SERDES_RXDIG_8PACK_REGMAP_CORE1P2_TYPES_H_ + +typedef enum adrv904x_BfSerdesRxdig8packRegmapCore1p2ChanAddr +{ + ADRV904X_BF_DIGITAL_CORE_JESD_DESERIALIZER_DESER_PHY_TOP_8PACK = 0x48088000 +} adrv904x_BfSerdesRxdig8packRegmapCore1p2ChanAddr_e; + +#endif // _ADRV904X_BF_SERDES_RXDIG_8PACK_REGMAP_CORE1P2_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_serdes_txdig_phy_regmap_core1p2.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_serdes_txdig_phy_regmap_core1p2.c new file mode 100644 index 00000000000..fd480e6e262 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_serdes_txdig_phy_regmap_core1p2.c @@ -0,0 +1,313 @@ +/** + * \file adrv904x_bf_serdes_txdig_phy_regmap_core1p2.c Automatically generated file with generator ver + * 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_serdes_txdig_phy_regmap_core1p2.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_SERDES_TXDIG_PHY_REGMAP_CORE1P2 + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SerdesTxdigPhyRegmapCore1p2_ClkoffsetSerRc_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSerdesTxdigPhyRegmapCore1p2ChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_SerdesTxdigPhyRegmapCore1p2_ClkoffsetSerRc_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_2_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_3_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_4_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_5_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_6_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_7_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_ALL)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_SerdesTxdigPhyRegmapCore1p2_ClkoffsetSerRc_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x7U), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SerdesTxdigPhyRegmapCore1p2_FifoStartAddr_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSerdesTxdigPhyRegmapCore1p2ChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_SerdesTxdigPhyRegmapCore1p2_FifoStartAddr_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_2_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_3_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_4_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_5_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_6_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_7_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_ALL)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_SerdesTxdigPhyRegmapCore1p2_FifoStartAddr_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x20U), + ((uint32_t) bfValue << 4), + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SerdesTxdigPhyRegmapCore1p2_PdSer_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSerdesTxdigPhyRegmapCore1p2ChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_SerdesTxdigPhyRegmapCore1p2_PdSer_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_2_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_3_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_4_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_5_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_6_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_7_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_ALL)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_SerdesTxdigPhyRegmapCore1p2_PdSer_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x0U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SerdesTxdigPhyRegmapCore1p2_PdSer_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSerdesTxdigPhyRegmapCore1p2ChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_2_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_3_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_4_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_5_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_6_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_7_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_ALL)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_SerdesTxdigPhyRegmapCore1p2_PdSer_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x0U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SerdesTxdigPhyRegmapCore1p2_SerEnRc_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSerdesTxdigPhyRegmapCore1p2ChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_0_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_1_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_2_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_3_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_4_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_5_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_6_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_7_) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_ALL)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_SerdesTxdigPhyRegmapCore1p2_SerEnRc_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_serdes_txdig_phy_regmap_core1p2.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_serdes_txdig_phy_regmap_core1p2.h new file mode 100644 index 00000000000..ac3380f1613 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_serdes_txdig_phy_regmap_core1p2.h @@ -0,0 +1,57 @@ +/** + * \file adrv904x_bf_serdes_txdig_phy_regmap_core1p2.h Automatically generated file with generator ver + * 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_SERDES_TXDIG_PHY_REGMAP_CORE1P2_H_ +#define _ADRV904X_BF_SERDES_TXDIG_PHY_REGMAP_CORE1P2_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_serdes_txdig_phy_regmap_core1p2_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SerdesTxdigPhyRegmapCore1p2_ClkoffsetSerRc_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSerdesTxdigPhyRegmapCore1p2ChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SerdesTxdigPhyRegmapCore1p2_FifoStartAddr_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSerdesTxdigPhyRegmapCore1p2ChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SerdesTxdigPhyRegmapCore1p2_PdSer_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSerdesTxdigPhyRegmapCore1p2ChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SerdesTxdigPhyRegmapCore1p2_PdSer_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSerdesTxdigPhyRegmapCore1p2ChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SerdesTxdigPhyRegmapCore1p2_SerEnRc_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfSerdesTxdigPhyRegmapCore1p2ChanAddr_e baseAddr, + uint8_t* const bfValue); + +#endif // _ADRV904X_BF_SERDES_TXDIG_PHY_REGMAP_CORE1P2_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_serdes_txdig_phy_regmap_core1p2_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_serdes_txdig_phy_regmap_core1p2_types.h new file mode 100644 index 00000000000..0ea8a05c70b --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_serdes_txdig_phy_regmap_core1p2_types.h @@ -0,0 +1,33 @@ +/** + * \file adrv904x_bf_serdes_txdig_phy_regmap_core1p2_types.h Automatically generated file with generator ver + * 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_SERDES_TXDIG_PHY_REGMAP_CORE1P2_TYPES_H_ +#define _ADRV904X_BF_SERDES_TXDIG_PHY_REGMAP_CORE1P2_TYPES_H_ + +typedef enum adrv904x_BfSerdesTxdigPhyRegmapCore1p2ChanAddr +{ + ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_0_ = 0x48070000, + ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_1_ = 0x48070800, + ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_2_ = 0x48071000, + ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_3_ = 0x48071800, + ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_4_ = 0x48072000, + ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_5_ = 0x48072800, + ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_6_ = 0x48073000, + ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_7_ = 0x48073800, + ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_ALL = 0x48074000 +} adrv904x_BfSerdesTxdigPhyRegmapCore1p2ChanAddr_e; + +#endif // _ADRV904X_BF_SERDES_TXDIG_PHY_REGMAP_CORE1P2_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_streamproc.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_streamproc.c new file mode 100644 index 00000000000..d4a78a8f7b9 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_streamproc.c @@ -0,0 +1,446 @@ +/** + * \file adrv904x_bf_streamproc.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_streamproc.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_STREAMPROC + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Streamproc_DbgRdbkMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfStreamprocChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Streamproc_DbgRdbkMode_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_MAIN_STREAM_PROC) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_KFA_STREAM_PROC_REGS) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_0__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_ORX_0__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__SLICE_AHB_STREAM_PROC)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Streamproc_DbgRdbkMode_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5U), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Streamproc_ErroredStreamNumber_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfStreamprocChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Streamproc_ErroredStreamNumber_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_MAIN_STREAM_PROC) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_KFA_STREAM_PROC_REGS) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_0__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_ORX_0__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__SLICE_AHB_STREAM_PROC)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Streamproc_ErroredStreamNumber_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x14U), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Streamproc_ErroredStreamNumber_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfStreamprocChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_MAIN_STREAM_PROC) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_KFA_STREAM_PROC_REGS) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_0__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_ORX_0__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__SLICE_AHB_STREAM_PROC)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Streamproc_ErroredStreamNumber_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x14U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Streamproc_RdbkErrorVal_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfStreamprocChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_MAIN_STREAM_PROC) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_KFA_STREAM_PROC_REGS) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_0__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_ORX_0__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__SLICE_AHB_STREAM_PROC)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Streamproc_RdbkErrorVal_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x24U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x25U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Streamproc_StreamError_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfStreamprocChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_Streamproc_StreamError_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_MAIN_STREAM_PROC) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_KFA_STREAM_PROC_REGS) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_0__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_ORX_0__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__SLICE_AHB_STREAM_PROC)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Streamproc_StreamError_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3U), + ((uint32_t) bfValue << 7), + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Streamproc_StreamError_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfStreamprocChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_DIGITAL_CORE_MAIN_STREAM_PROC) && + (baseAddr != ADRV904X_BF_DIGITAL_CORE_KFA_STREAM_PROC_REGS) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_0__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_ORX_0__SLICE_AHB_STREAM_PROC) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__SLICE_AHB_STREAM_PROC)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_Streamproc_StreamError_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3U), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 7); + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_streamproc.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_streamproc.h new file mode 100644 index 00000000000..cd966a68265 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_streamproc.h @@ -0,0 +1,61 @@ +/** + * \file adrv904x_bf_streamproc.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_STREAMPROC_H_ +#define _ADRV904X_BF_STREAMPROC_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_streamproc_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Streamproc_DbgRdbkMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfStreamprocChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Streamproc_ErroredStreamNumber_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfStreamprocChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Streamproc_ErroredStreamNumber_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfStreamprocChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Streamproc_RdbkErrorVal_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfStreamprocChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Streamproc_StreamError_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfStreamprocChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Streamproc_StreamError_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfStreamprocChanAddr_e baseAddr, + uint8_t* const bfValue); + +#endif // _ADRV904X_BF_STREAMPROC_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_streamproc_channel.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_streamproc_channel.c new file mode 100644 index 00000000000..0fba1b8e284 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_streamproc_channel.c @@ -0,0 +1,160 @@ +/** + * \file adrv904x_bf_streamproc_channel.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_streamproc_channel.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_STREAMPROC_CHANNEL + +ADI_API adi_adrv904x_ErrAction_e adrv904x_StreamprocChannel_MaskChAntFallStreamToCore_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfStreamprocChannelChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_StreamprocChannel_MaskChAntFallStreamToCore_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_TX_0__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_ORX_0__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__SLICE_AHB_STREAM_PROC_CHANNEL)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_StreamprocChannel_MaskChAntFallStreamToCore_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xEU), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_StreamprocChannel_MaskChAntRiseStreamToCore_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfStreamprocChannelChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_StreamprocChannel_MaskChAntRiseStreamToCore_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_TX_0__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_ORX_0__SLICE_AHB_STREAM_PROC_CHANNEL) && + (baseAddr != ADRV904X_BF_SLICE_ORX_1__SLICE_AHB_STREAM_PROC_CHANNEL)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_StreamprocChannel_MaskChAntRiseStreamToCore_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xDU), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_streamproc_channel.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_streamproc_channel.h new file mode 100644 index 00000000000..add72eac82f --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_streamproc_channel.h @@ -0,0 +1,41 @@ +/** + * \file adrv904x_bf_streamproc_channel.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_STREAMPROC_CHANNEL_H_ +#define _ADRV904X_BF_STREAMPROC_CHANNEL_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_streamproc_channel_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_StreamprocChannel_MaskChAntFallStreamToCore_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfStreamprocChannelChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_StreamprocChannel_MaskChAntRiseStreamToCore_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfStreamprocChannelChanAddr_e baseAddr, + const uint8_t bfValue); + +#endif // _ADRV904X_BF_STREAMPROC_CHANNEL_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_streamproc_channel_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_streamproc_channel_types.h new file mode 100644 index 00000000000..a1c391d5a46 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_streamproc_channel_types.h @@ -0,0 +1,41 @@ +/** + * \file adrv904x_bf_streamproc_channel_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_STREAMPROC_CHANNEL_TYPES_H_ +#define _ADRV904X_BF_STREAMPROC_CHANNEL_TYPES_H_ + +typedef enum adrv904x_BfStreamprocChannelChanAddr +{ + ADRV904X_BF_SLICE_RX_0__SLICE_AHB_STREAM_PROC_CHANNEL = 0x60023000, + ADRV904X_BF_SLICE_RX_1__SLICE_AHB_STREAM_PROC_CHANNEL = 0x60123000, + ADRV904X_BF_SLICE_RX_2__SLICE_AHB_STREAM_PROC_CHANNEL = 0x60223000, + ADRV904X_BF_SLICE_RX_3__SLICE_AHB_STREAM_PROC_CHANNEL = 0x60323000, + ADRV904X_BF_SLICE_RX_4__SLICE_AHB_STREAM_PROC_CHANNEL = 0x60423000, + ADRV904X_BF_SLICE_RX_5__SLICE_AHB_STREAM_PROC_CHANNEL = 0x60523000, + ADRV904X_BF_SLICE_RX_6__SLICE_AHB_STREAM_PROC_CHANNEL = 0x60623000, + ADRV904X_BF_SLICE_RX_7__SLICE_AHB_STREAM_PROC_CHANNEL = 0x60723000, + ADRV904X_BF_SLICE_TX_0__SLICE_AHB_STREAM_PROC_CHANNEL = 0x60823000, + ADRV904X_BF_SLICE_TX_1__SLICE_AHB_STREAM_PROC_CHANNEL = 0x60923000, + ADRV904X_BF_SLICE_TX_2__SLICE_AHB_STREAM_PROC_CHANNEL = 0x60A23000, + ADRV904X_BF_SLICE_TX_3__SLICE_AHB_STREAM_PROC_CHANNEL = 0x60B23000, + ADRV904X_BF_SLICE_TX_4__SLICE_AHB_STREAM_PROC_CHANNEL = 0x60C23000, + ADRV904X_BF_SLICE_TX_5__SLICE_AHB_STREAM_PROC_CHANNEL = 0x60D23000, + ADRV904X_BF_SLICE_TX_6__SLICE_AHB_STREAM_PROC_CHANNEL = 0x60E23000, + ADRV904X_BF_SLICE_TX_7__SLICE_AHB_STREAM_PROC_CHANNEL = 0x60F23000, + ADRV904X_BF_SLICE_ORX_0__SLICE_AHB_STREAM_PROC_CHANNEL = 0x61023000, + ADRV904X_BF_SLICE_ORX_1__SLICE_AHB_STREAM_PROC_CHANNEL = 0x61123000 +} adrv904x_BfStreamprocChannelChanAddr_e; + +#endif // _ADRV904X_BF_STREAMPROC_CHANNEL_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_streamproc_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_streamproc_types.h new file mode 100644 index 00000000000..9356e116c43 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_streamproc_types.h @@ -0,0 +1,43 @@ +/** + * \file adrv904x_bf_streamproc_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_STREAMPROC_TYPES_H_ +#define _ADRV904X_BF_STREAMPROC_TYPES_H_ + +typedef enum adrv904x_BfStreamprocChanAddr +{ + ADRV904X_BF_DIGITAL_CORE_MAIN_STREAM_PROC = 0x46B00000, + ADRV904X_BF_DIGITAL_CORE_KFA_STREAM_PROC_REGS = 0x4C080000, + ADRV904X_BF_SLICE_RX_0__SLICE_AHB_STREAM_PROC = 0x60022000, + ADRV904X_BF_SLICE_RX_1__SLICE_AHB_STREAM_PROC = 0x60122000, + ADRV904X_BF_SLICE_RX_2__SLICE_AHB_STREAM_PROC = 0x60222000, + ADRV904X_BF_SLICE_RX_3__SLICE_AHB_STREAM_PROC = 0x60322000, + ADRV904X_BF_SLICE_RX_4__SLICE_AHB_STREAM_PROC = 0x60422000, + ADRV904X_BF_SLICE_RX_5__SLICE_AHB_STREAM_PROC = 0x60522000, + ADRV904X_BF_SLICE_RX_6__SLICE_AHB_STREAM_PROC = 0x60622000, + ADRV904X_BF_SLICE_RX_7__SLICE_AHB_STREAM_PROC = 0x60722000, + ADRV904X_BF_SLICE_TX_0__SLICE_AHB_STREAM_PROC = 0x60822000, + ADRV904X_BF_SLICE_TX_1__SLICE_AHB_STREAM_PROC = 0x60922000, + ADRV904X_BF_SLICE_TX_2__SLICE_AHB_STREAM_PROC = 0x60A22000, + ADRV904X_BF_SLICE_TX_3__SLICE_AHB_STREAM_PROC = 0x60B22000, + ADRV904X_BF_SLICE_TX_4__SLICE_AHB_STREAM_PROC = 0x60C22000, + ADRV904X_BF_SLICE_TX_5__SLICE_AHB_STREAM_PROC = 0x60D22000, + ADRV904X_BF_SLICE_TX_6__SLICE_AHB_STREAM_PROC = 0x60E22000, + ADRV904X_BF_SLICE_TX_7__SLICE_AHB_STREAM_PROC = 0x60F22000, + ADRV904X_BF_SLICE_ORX_0__SLICE_AHB_STREAM_PROC = 0x61022000, + ADRV904X_BF_SLICE_ORX_1__SLICE_AHB_STREAM_PROC = 0x61122000 +} adrv904x_BfStreamprocChanAddr_e; + +#endif // _ADRV904X_BF_STREAMPROC_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tdr_dpath_top.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tdr_dpath_top.c new file mode 100644 index 00000000000..714c2230e23 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tdr_dpath_top.c @@ -0,0 +1,150 @@ +/** + * \file adrv904x_bf_tdr_dpath_top.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_tdr_dpath_top.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_TDR_DPATH_TOP + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TdrDpathTop_FlashThresh_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTdrDpathTopChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TdrDpathTop_FlashThresh_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TdrDpathTop_FlashThresh_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x330U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TdrDpathTop_FlashThresh_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTdrDpathTopChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_RX_0__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_0__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_1__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_2__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_3__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_4__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_5__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_6__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_) && + (baseAddr != ADRV904X_BF_SLICE_RX_7__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TdrDpathTop_FlashThresh_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x330U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tdr_dpath_top.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tdr_dpath_top.h new file mode 100644 index 00000000000..c23ddab3fa0 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tdr_dpath_top.h @@ -0,0 +1,40 @@ +/** + * \file adrv904x_bf_tdr_dpath_top.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_TDR_DPATH_TOP_H_ +#define _ADRV904X_BF_TDR_DPATH_TOP_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_tdr_dpath_top_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TdrDpathTop_FlashThresh_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTdrDpathTopChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TdrDpathTop_FlashThresh_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTdrDpathTopChanAddr_e baseAddr, + uint8_t* const bfValue); +#endif // _ADRV904X_BF_TDR_DPATH_TOP_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tdr_dpath_top_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tdr_dpath_top_types.h new file mode 100644 index 00000000000..a56fb88dbeb --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tdr_dpath_top_types.h @@ -0,0 +1,39 @@ +/** + * \file adrv904x_bf_tdr_dpath_top_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_TDR_DPATH_TOP_TYPES_H_ +#define _ADRV904X_BF_TDR_DPATH_TOP_TYPES_H_ + +typedef enum adrv904x_BfTdrDpathTopChanAddr +{ + ADRV904X_BF_SLICE_RX_0__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_ = 0x600D0000, + ADRV904X_BF_SLICE_RX_0__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_ = 0x600D0800, + ADRV904X_BF_SLICE_RX_1__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_ = 0x601D0000, + ADRV904X_BF_SLICE_RX_1__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_ = 0x601D0800, + ADRV904X_BF_SLICE_RX_2__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_ = 0x602D0000, + ADRV904X_BF_SLICE_RX_2__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_ = 0x602D0800, + ADRV904X_BF_SLICE_RX_3__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_ = 0x603D0000, + ADRV904X_BF_SLICE_RX_3__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_ = 0x603D0800, + ADRV904X_BF_SLICE_RX_4__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_ = 0x604D0000, + ADRV904X_BF_SLICE_RX_4__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_ = 0x604D0800, + ADRV904X_BF_SLICE_RX_5__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_ = 0x605D0000, + ADRV904X_BF_SLICE_RX_5__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_ = 0x605D0800, + ADRV904X_BF_SLICE_RX_6__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_ = 0x606D0000, + ADRV904X_BF_SLICE_RX_6__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_ = 0x606D0800, + ADRV904X_BF_SLICE_RX_7__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_ = 0x607D0000, + ADRV904X_BF_SLICE_RX_7__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_ = 0x607D0800 +} adrv904x_BfTdrDpathTopChanAddr_e; + +#endif // _ADRV904X_BF_TDR_DPATH_TOP_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_band_duc.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_band_duc.c new file mode 100644 index 00000000000..97e2dbf92ce --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_band_duc.c @@ -0,0 +1,199 @@ +/** + * \file adrv904x_bf_tx_band_duc.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_tx_band_duc.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_TX_BAND_DUC + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxBandDuc_DucInputSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxBandDucChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxBandDuc_DucInputSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_BAND_DUC0) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_BAND_DUC0) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_BAND_DUC0) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_BAND_DUC0) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_BAND_DUC0) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_BAND_DUC0) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_BAND_DUC0) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_BAND_DUC0)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxBandDuc_DucInputSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x2U), + ((uint32_t) bfValue << 4), + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxBandDuc_MaskDucInputI_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxBandDucChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxBandDuc_MaskDucInputI_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_BAND_DUC0) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_BAND_DUC0) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_BAND_DUC0) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_BAND_DUC0) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_BAND_DUC0) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_BAND_DUC0) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_BAND_DUC0) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_BAND_DUC0)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxBandDuc_MaskDucInputI_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x0U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxBandDuc_MaskDucInputQ_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxBandDucChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxBandDuc_MaskDucInputQ_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_BAND_DUC0) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_BAND_DUC0) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_BAND_DUC0) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_BAND_DUC0) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_BAND_DUC0) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_BAND_DUC0) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_BAND_DUC0) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_BAND_DUC0)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxBandDuc_MaskDucInputQ_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x0U), + ((uint32_t) bfValue << 5), + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_band_duc.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_band_duc.h new file mode 100644 index 00000000000..bb38fe66d8a --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_band_duc.h @@ -0,0 +1,46 @@ +/** + * \file adrv904x_bf_tx_band_duc.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_TX_BAND_DUC_H_ +#define _ADRV904X_BF_TX_BAND_DUC_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_tx_band_duc_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxBandDuc_DucInputSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxBandDucChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxBandDuc_MaskDucInputI_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxBandDucChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxBandDuc_MaskDucInputQ_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxBandDucChanAddr_e baseAddr, + const uint8_t bfValue); + +#endif // _ADRV904X_BF_TX_BAND_DUC_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_band_duc_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_band_duc_types.h new file mode 100644 index 00000000000..a1503dd53c5 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_band_duc_types.h @@ -0,0 +1,31 @@ +/** + * \file adrv904x_bf_tx_band_duc_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_TX_BAND_DUC_TYPES_H_ +#define _ADRV904X_BF_TX_BAND_DUC_TYPES_H_ + +typedef enum adrv904x_BfTxBandDucChanAddr +{ + ADRV904X_BF_SLICE_TX_0__TX_BAND_DUC0 = 0x60848000, + ADRV904X_BF_SLICE_TX_1__TX_BAND_DUC0 = 0x60948000, + ADRV904X_BF_SLICE_TX_2__TX_BAND_DUC0 = 0x60A48000, + ADRV904X_BF_SLICE_TX_3__TX_BAND_DUC0 = 0x60B48000, + ADRV904X_BF_SLICE_TX_4__TX_BAND_DUC0 = 0x60C48000, + ADRV904X_BF_SLICE_TX_5__TX_BAND_DUC0 = 0x60D48000, + ADRV904X_BF_SLICE_TX_6__TX_BAND_DUC0 = 0x60E48000, + ADRV904X_BF_SLICE_TX_7__TX_BAND_DUC0 = 0x60F48000 +} adrv904x_BfTxBandDucChanAddr_e; + +#endif // _ADRV904X_BF_TX_BAND_DUC_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_cfr_reg.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_cfr_reg.c new file mode 100644 index 00000000000..60a295ba58d --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_cfr_reg.c @@ -0,0 +1,3473 @@ +/** + * \file adrv904x_bf_tx_cfr_reg.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_tx_cfr_reg.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_TX_CFR_REG + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0CtrlByp_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxCfrReg_Cfr0CtrlByp_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr0CtrlByp_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_Cfr0CtrlByp_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x53 + channelId * 16U), + ((uint32_t) bfValue << 6), + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0CtrlByp_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr0CtrlByp_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_Cfr0CtrlByp_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x53 + channelId * 16U), + &bfValueTmp, + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 6); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0CtrlEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxCfrReg_Cfr0CtrlEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr0CtrlEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_Cfr0CtrlEn_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x53 + channelId * 16U), + ((uint32_t) bfValue << 7), + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0CtrlEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr0CtrlEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_Cfr0CtrlEn_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x53 + channelId * 16U), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 7); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0CtrlPkDur_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxCfrReg_Cfr0CtrlPkDur_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr0CtrlPkDur_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_Cfr0CtrlPkDur_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x52 + channelId * 16), + bfValue << 6, + 0xC0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x53 + channelId * 16), + bfValue >> 2, + 0x3F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0CtrlPkDur_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr0CtrlPkDur_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_Cfr0CtrlPkDur_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x52 + channelId * 16U), + &bfValueTmp, + 0xC0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 6)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x53 + channelId * 16U), + &bfValueTmp, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 2)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0PulHpl_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxCfrReg_Cfr0PulHpl_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr0PulHpl_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x48), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x49), + bfValue >> 8, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0PulHpl_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr0PulHpl_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x48U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x49U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0PulInterp_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr0PulInterp_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x4AU), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0ThrCor_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 524287U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxCfrReg_Cfr0ThrCor_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr0ThrCor_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_Cfr0ThrCor_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5C + channelId * 16), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5D + channelId * 16), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5E + channelId * 16), + bfValue >> 16, + 0x7); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0ThrSq_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 262143U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxCfrReg_Cfr0ThrSq_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr0ThrSq_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_Cfr0ThrSq_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x54 + channelId * 16), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x55 + channelId * 16), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x56 + channelId * 16), + bfValue >> 16, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0ThrSqrt_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 262143U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxCfrReg_Cfr0ThrSqrt_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr0ThrSqrt_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_Cfr0ThrSqrt_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x58 + channelId * 16), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x59 + channelId * 16), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5A + channelId * 16), + bfValue >> 16, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1CtrlByp_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxCfrReg_Cfr1CtrlByp_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr1CtrlByp_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_Cfr1CtrlByp_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x8F + channelId * 16U), + ((uint32_t) bfValue << 6), + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1CtrlByp_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr1CtrlByp_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_Cfr1CtrlByp_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x8F + channelId * 16U), + &bfValueTmp, + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 6); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1CtrlEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxCfrReg_Cfr1CtrlEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr1CtrlEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_Cfr1CtrlEn_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x8F + channelId * 16U), + ((uint32_t) bfValue << 7), + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1CtrlEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr1CtrlEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_Cfr1CtrlEn_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x8F + channelId * 16U), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 7); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1CtrlPkDur_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxCfrReg_Cfr1CtrlPkDur_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr1CtrlPkDur_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_Cfr1CtrlPkDur_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x8E + channelId * 16), + bfValue << 6, + 0xC0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x8F + channelId * 16), + bfValue >> 2, + 0x3F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1CtrlPkDur_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr1CtrlPkDur_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_Cfr1CtrlPkDur_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x8E + channelId * 16U), + &bfValueTmp, + 0xC0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 6)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x8F + channelId * 16U), + &bfValueTmp, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 2)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1PulHpl_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxCfrReg_Cfr1PulHpl_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr1PulHpl_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x84), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x85), + bfValue >> 8, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1PulHpl_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr1PulHpl_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x84U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x85U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1PulInterp_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr1PulInterp_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x86U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1Spare_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 65535U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxCfrReg_Cfr1Spare_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr1Spare_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xBC), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xBD), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1ThrCor_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 524287U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxCfrReg_Cfr1ThrCor_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr1ThrCor_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_Cfr1ThrCor_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x98 + channelId * 16), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x99 + channelId * 16), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x9A + channelId * 16), + bfValue >> 16, + 0x7); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1ThrCor_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr1ThrCor_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_Cfr1ThrCor_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x98 + channelId * 16U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x99 + channelId * 16U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x9A + channelId * 16U), + &bfValueTmp, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1ThrSq_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 262143U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxCfrReg_Cfr1ThrSq_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr1ThrSq_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_Cfr1ThrSq_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x90 + channelId * 16), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x91 + channelId * 16), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x92 + channelId * 16), + bfValue >> 16, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1ThrSqrt_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 262143U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxCfrReg_Cfr1ThrSqrt_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_Cfr1ThrSqrt_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_Cfr1ThrSqrt_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x94 + channelId * 16), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x95 + channelId * 16), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x96 + channelId * 16), + bfValue >> 16, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrCtrlActiveSet_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_CfrCtrlActiveSet_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3U), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 7); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrCtrlChSet_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxCfrReg_CfrCtrlChSet_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_CfrCtrlChSet_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3U), + ((uint32_t) bfValue << 6), + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrCtrlPulSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxCfrReg_CfrCtrlPulSel_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_CfrCtrlPulSel_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x2U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrCtrlPulSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_CfrCtrlPulSel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x2U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkClrStat_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxCfrReg_CfrDbgPkClrStat_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_CfrDbgPkClrStat_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_CfrDbgPkClrStat_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1B + channelId * 16U), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkFoundCurWin_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_CfrDbgPkFoundCurWin_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_CfrDbgPkFoundCurWin_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1C + channelId * 16U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1D + channelId * 16U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkFoundPrvWin_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_CfrDbgPkFoundPrvWin_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_CfrDbgPkFoundPrvWin_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1E + channelId * 16U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1F + channelId * 16U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkLostCpcCurWin_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_CfrDbgPkLostCpcCurWin_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_CfrDbgPkLostCpcCurWin_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x24 + channelId * 16U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x25 + channelId * 16U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkLostCpcPrvWin_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_CfrDbgPkLostCpcPrvWin_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_CfrDbgPkLostCpcPrvWin_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x26 + channelId * 16U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x27 + channelId * 16U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkLostPfCurWin_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_CfrDbgPkLostPfCurWin_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_CfrDbgPkLostPfCurWin_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x20 + channelId * 16U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkLostPfPrvWin_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_CfrDbgPkLostPfPrvWin_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_CfrDbgPkLostPfPrvWin_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x22 + channelId * 16U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkLostWfCurWin_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_CfrDbgPkLostWfCurWin_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_CfrDbgPkLostWfCurWin_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x21 + channelId * 16U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkLostWfPrvWin_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_CfrDbgPkLostWfPrvWin_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_CfrDbgPkLostWfPrvWin_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x23 + channelId * 16U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkReadStat_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxCfrReg_CfrDbgPkReadStat_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_CfrDbgPkReadStat_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_CfrDbgPkReadStat_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1B + channelId * 16U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkStatWindowEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxCfrReg_CfrDbgPkStatWindowEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_CfrDbgPkStatWindowEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_CfrDbgPkStatWindowEn_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1B + channelId * 16U), + ((uint32_t) bfValue << 2), + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkStatWindowEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_CfrDbgPkStatWindowEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_CfrDbgPkStatWindowEn_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1B + channelId * 16U), + &bfValueTmp, + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkStatWindowSz_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxCfrReg_CfrDbgPkStatWindowSz_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_CfrDbgPkStatWindowSz_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_CfrDbgPkStatWindowSz_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1B + channelId * 16U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkStatWindowSz_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_CfrDbgPkStatWindowSz_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxCfrReg_CfrDbgPkStatWindowSz_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1B + channelId * 16U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrRamShadowRamSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxCfrReg_CfrRamShadowRamSel_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxCfrReg_CfrRamShadowRamSel_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xAU), + (uint32_t) bfValue, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_cfr_reg.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_cfr_reg.h new file mode 100644 index 00000000000..f723631b16f --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_cfr_reg.h @@ -0,0 +1,289 @@ +/** + * \file adrv904x_bf_tx_cfr_reg.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_TX_CFR_REG_H_ +#define _ADRV904X_BF_TX_CFR_REG_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_tx_cfr_reg_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0CtrlByp_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0CtrlByp_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0CtrlEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0CtrlEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0CtrlPkDur_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0CtrlPkDur_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0PulHpl_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0PulHpl_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0PulInterp_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0ThrCor_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0ThrSq_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr0ThrSqrt_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1CtrlByp_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1CtrlByp_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1CtrlEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1CtrlEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1CtrlPkDur_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1CtrlPkDur_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1PulHpl_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1PulHpl_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1PulInterp_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1Spare_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1ThrCor_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1ThrCor_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1ThrSq_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_Cfr1ThrSqrt_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrCtrlActiveSet_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrCtrlChSet_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrCtrlPulSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrCtrlPulSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkClrStat_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkFoundCurWin_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkFoundPrvWin_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkLostCpcCurWin_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkLostCpcPrvWin_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkLostPfCurWin_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkLostPfPrvWin_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkLostWfCurWin_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkLostWfPrvWin_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkReadStat_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkStatWindowEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkStatWindowEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkStatWindowSz_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrDbgPkStatWindowSz_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCfrReg_CfrRamShadowRamSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxCfrRegChanAddr_e baseAddr, + const uint8_t bfValue); + +#endif // _ADRV904X_BF_TX_CFR_REG_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_cfr_reg_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_cfr_reg_types.h new file mode 100644 index 00000000000..502afd685ac --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_cfr_reg_types.h @@ -0,0 +1,31 @@ +/** + * \file adrv904x_bf_tx_cfr_reg_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_TX_CFR_REG_TYPES_H_ +#define _ADRV904X_BF_TX_CFR_REG_TYPES_H_ + +typedef enum adrv904x_BfTxCfrRegChanAddr +{ + ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG = 0x608D0000, + ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG = 0x609D0000, + ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG = 0x60AD0000, + ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG = 0x60BD0000, + ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG = 0x60CD0000, + ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG = 0x60DD0000, + ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG = 0x60ED0000, + ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG = 0x60FD0000 +} adrv904x_BfTxCfrRegChanAddr_e; + +#endif // _ADRV904X_BF_TX_CFR_REG_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_datapath.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_datapath.c new file mode 100644 index 00000000000..a97c066d951 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_datapath.c @@ -0,0 +1,481 @@ +/** + * \file adrv904x_bf_tx_datapath.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_tx_datapath.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_TX_DATAPATH + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDatapath_PostAttenHcClipCntStat_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDatapathChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DATAPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDatapath_PostAttenHcClipCntStat_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1B8U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1B9U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDatapath_PostAttenHcCntClear_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDatapathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDatapath_PostAttenHcCntClear_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DATAPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDatapath_PostAttenHcCntClear_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1B7U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDatapath_PostAttenHcCntUpd_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDatapathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDatapath_PostAttenHcCntUpd_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DATAPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDatapath_PostAttenHcCntUpd_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1B7U), + ((uint32_t) bfValue << 5), + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDatapath_PostAttenHcEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDatapathChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDatapath_PostAttenHcEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DATAPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDatapath_PostAttenHcEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1B4U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDatapath_PostAttenHcEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDatapathChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DATAPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDatapath_PostAttenHcEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1B4U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDatapath_PostAttenHcThreshold_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDatapathChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 262143U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDatapath_PostAttenHcThreshold_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DATAPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDatapath_PostAttenHcThreshold_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1B4), + bfValue << 4, + 0xF0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1B5), + bfValue >> 4, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1B6), + bfValue >> 12, + 0x3F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDatapath_PostAttenHcThreshold_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDatapathChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DATAPATH) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DATAPATH)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDatapath_PostAttenHcThreshold_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1B4U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 4)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1B5U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 4)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1B6U), + &bfValueTmp, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 12)); + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_datapath.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_datapath.h new file mode 100644 index 00000000000..a4df42c1d3c --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_datapath.h @@ -0,0 +1,66 @@ +/** + * \file adrv904x_bf_tx_datapath.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_TX_DATAPATH_H_ +#define _ADRV904X_BF_TX_DATAPATH_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_tx_datapath_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDatapath_PostAttenHcClipCntStat_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDatapathChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDatapath_PostAttenHcCntClear_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDatapathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDatapath_PostAttenHcCntUpd_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDatapathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDatapath_PostAttenHcEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDatapathChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDatapath_PostAttenHcEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDatapathChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDatapath_PostAttenHcThreshold_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDatapathChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDatapath_PostAttenHcThreshold_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDatapathChanAddr_e baseAddr, + uint32_t* const bfValue); + +#endif // _ADRV904X_BF_TX_DATAPATH_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_datapath_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_datapath_types.h new file mode 100644 index 00000000000..16892c7666f --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_datapath_types.h @@ -0,0 +1,31 @@ +/** + * \file adrv904x_bf_tx_datapath_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_TX_DATAPATH_TYPES_H_ +#define _ADRV904X_BF_TX_DATAPATH_TYPES_H_ + +typedef enum adrv904x_BfTxDatapathChanAddr +{ + ADRV904X_BF_SLICE_TX_0__TX_DATAPATH = 0x60838000, + ADRV904X_BF_SLICE_TX_1__TX_DATAPATH = 0x60938000, + ADRV904X_BF_SLICE_TX_2__TX_DATAPATH = 0x60A38000, + ADRV904X_BF_SLICE_TX_3__TX_DATAPATH = 0x60B38000, + ADRV904X_BF_SLICE_TX_4__TX_DATAPATH = 0x60C38000, + ADRV904X_BF_SLICE_TX_5__TX_DATAPATH = 0x60D38000, + ADRV904X_BF_SLICE_TX_6__TX_DATAPATH = 0x60E38000, + ADRV904X_BF_SLICE_TX_7__TX_DATAPATH = 0x60F38000 +} adrv904x_BfTxDatapathChanAddr_e; + +#endif // _ADRV904X_BF_TX_DATAPATH_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dfe_dig_regs.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dfe_dig_regs.c new file mode 100644 index 00000000000..a0efd203b46 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dfe_dig_regs.c @@ -0,0 +1,844 @@ +/** + * \file adrv904x_bf_tx_dfe_dig_regs.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_tx_dfe_dig_regs.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_TX_DFE_DIG_REGS + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_PostCfrDigitalGain_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDfeDigRegs_PostCfrDigitalGain_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_DFE_DIG_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDfeDigRegs_PostCfrDigitalGain_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1CU), + (uint32_t) bfValue, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_PostCfrDigitalGain_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_DFE_DIG_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDfeDigRegs_PostCfrDigitalGain_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1CU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_PreDpdHcClipCntStat_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_DFE_DIG_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDfeDigRegs_PreDpdHcClipCntStat_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x20U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x21U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_PreDpdHcCntClear_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDfeDigRegs_PreDpdHcCntClear_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_DFE_DIG_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDfeDigRegs_PreDpdHcCntClear_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x8U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_PreDpdHcCntUpd_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDfeDigRegs_PreDpdHcCntUpd_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_DFE_DIG_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDfeDigRegs_PreDpdHcCntUpd_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x8U), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_PreDpdHcEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDfeDigRegs_PreDpdHcEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_DFE_DIG_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDfeDigRegs_PreDpdHcEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x10U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_PreDpdHcEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_DFE_DIG_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDfeDigRegs_PreDpdHcEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x10U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_PreDpdHcThreshold_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + const uint32_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 262143U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDfeDigRegs_PreDpdHcThreshold_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_DFE_DIG_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDfeDigRegs_PreDpdHcThreshold_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x18), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x19), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1A), + bfValue >> 16, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_PreDpdHcThreshold_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + uint32_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint32_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_DFE_DIG_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDfeDigRegs_PreDpdHcThreshold_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x18U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x19U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1AU), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint32_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 16)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_TxVswrDataGenAhbAccessEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDfeDigRegs_TxVswrDataGenAhbAccessEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_DFE_DIG_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDfeDigRegs_TxVswrDataGenAhbAccessEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x111U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_TxVswrDataGenEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_DFE_DIG_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDfeDigRegs_TxVswrDataGenEnable_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x110U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_TxVswrDataGenMaxSamples_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDfeDigRegs_TxVswrDataGenMaxSamples_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_DFE_DIG_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDfeDigRegs_TxVswrDataGenMaxSamples_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x111), + bfValue << 4, + 0xF0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x112), + bfValue >> 4, + 0x3F); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_TxVswrDataGenMaxSamples_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_DFE_DIG_REGS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_DFE_DIG_REGS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDfeDigRegs_TxVswrDataGenMaxSamples_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x111U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 4)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x112U), + &bfValueTmp, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 4)); + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dfe_dig_regs.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dfe_dig_regs.h new file mode 100644 index 00000000000..a0f6ea27585 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dfe_dig_regs.h @@ -0,0 +1,96 @@ +/** + * \file adrv904x_bf_tx_dfe_dig_regs.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_TX_DFE_DIG_REGS_H_ +#define _ADRV904X_BF_TX_DFE_DIG_REGS_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_tx_dfe_dig_regs_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_PostCfrDigitalGain_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_PostCfrDigitalGain_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_PreDpdHcClipCntStat_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_PreDpdHcCntClear_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_PreDpdHcCntUpd_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_PreDpdHcEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_PreDpdHcEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_PreDpdHcThreshold_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + const uint32_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_PreDpdHcThreshold_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + uint32_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_TxVswrDataGenAhbAccessEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_TxVswrDataGenEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_TxVswrDataGenMaxSamples_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigRegs_TxVswrDataGenMaxSamples_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDfeDigRegsChanAddr_e baseAddr, + uint16_t* const bfValue); + +#endif // _ADRV904X_BF_TX_DFE_DIG_REGS_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dfe_dig_regs_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dfe_dig_regs_types.h new file mode 100644 index 00000000000..2ced2e6ca4f --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dfe_dig_regs_types.h @@ -0,0 +1,103 @@ +/** + * \file adrv904x_bf_tx_dfe_dig_regs_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_TX_DFE_DIG_REGS_TYPES_H_ +#define _ADRV904X_BF_TX_DFE_DIG_REGS_TYPES_H_ + +typedef enum adrv904x_BfTxDfeDigRegsChanAddr +{ + ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DFE_DIG_REGS = 0x608C0000, + ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_DFE_DIG_REGS = 0x609C0000, + ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_DFE_DIG_REGS = 0x60AC0000, + ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_DFE_DIG_REGS = 0x60BC0000, + ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_DFE_DIG_REGS = 0x60CC0000, + ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_DFE_DIG_REGS = 0x60DC0000, + ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_DFE_DIG_REGS = 0x60EC0000, + ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_DFE_DIG_REGS = 0x60FC0000 +} adrv904x_BfTxDfeDigRegsChanAddr_e; + +/** + * \brief Enumeration for rxCapAltSel + */ + +typedef enum adrv904x_Bf_TxDfeDigRegs_RxCapAltSel +{ + ADRV904X_BF_TX_DFE_DIG_REGS_RX_CAP_ALT_SEL_DC_OFFSET = 0, /*!< DC Offset Data */ + ADRV904X_BF_TX_DFE_DIG_REGS_RX_CAP_ALT_SEL_HB2_INPUT = 1, /*!< HB2 Input Data */ + ADRV904X_BF_TX_DFE_DIG_REGS_RX_CAP_ALT_SEL_QFIR_OUTPUT = 2, /*!< QFIR Output Data */ + ADRV904X_BF_TX_DFE_DIG_REGS_RX_CAP_ALT_SEL_QFIR_INPUT = 3 /*!< QFIR Input Data */ +} adrv904x_Bf_TxDfeDigRegs_RxCapAltSel_e; + +/** + * \brief Enumeration for rxCapSel + */ + +typedef enum adrv904x_Bf_TxDfeDigRegs_RxCapSel +{ + ADRV904X_BF_TX_DFE_DIG_REGS_RX_CAP_SEL_DC_OFFSET = 0, /*!< DC Offset Data */ + ADRV904X_BF_TX_DFE_DIG_REGS_RX_CAP_SEL_HB2_INPUT = 1, /*!< HB2 Input Data */ + ADRV904X_BF_TX_DFE_DIG_REGS_RX_CAP_SEL_QFIR_OUTPUT = 2, /*!< QFIR Output Data */ + ADRV904X_BF_TX_DFE_DIG_REGS_RX_CAP_SEL_QFIR_INPUT = 3 /*!< QFIR Input Data */ +} adrv904x_Bf_TxDfeDigRegs_RxCapSel_e; + +/** + * \brief Enumeration for txDpdCapAltSel + */ + +typedef enum adrv904x_Bf_TxDfeDigRegs_TxDpdCapAltSel +{ + ADRV904X_BF_TX_DFE_DIG_REGS_TX_DPD_CAP_ALT_SEL_PRE_CFR = 0, /*!< Select Pre CFR Data */ + ADRV904X_BF_TX_DFE_DIG_REGS_TX_DPD_CAP_ALT_SEL_PRE_DPD_HB1_OUT = 1, /*!< Select Pre DPD HB1 Out */ + ADRV904X_BF_TX_DFE_DIG_REGS_TX_DPD_CAP_ALT_SEL_PRE_DPD_HB2_OUT = 2, /*!< Select Pre DPD HB2 Output */ + ADRV904X_BF_TX_DFE_DIG_REGS_TX_DPD_CAP_ALT_SEL_POST_DPD_HB1_OUT = 3, /*!< Select Post DPD HB1 Output */ + ADRV904X_BF_TX_DFE_DIG_REGS_TX_DPD_CAP_ALT_SEL_CT_DPD_LG_DATA = 4, /*!< CT_DPD Capture Mode */ + ADRV904X_BF_TX_DFE_DIG_REGS_TX_DPD_CAP_ALT_SEL_NO_CAPTURE = 7 /*!< No Capture Mode, Zeros on Bus to Save Power */ +} adrv904x_Bf_TxDfeDigRegs_TxDpdCapAltSel_e; + +/** + * \brief Enumeration for txDpdCapSel + */ + +typedef enum adrv904x_Bf_TxDfeDigRegs_TxDpdCapSel +{ + ADRV904X_BF_TX_DFE_DIG_REGS_TX_DPD_CAP_SEL_PRE_CFR = 0, /*!< Select Pre CFR Data */ + ADRV904X_BF_TX_DFE_DIG_REGS_TX_DPD_CAP_SEL_PRE_DPD_HB1_OUT = 1, /*!< Select Pre DPD HB1 Output */ + ADRV904X_BF_TX_DFE_DIG_REGS_TX_DPD_CAP_SEL_PRE_DPD_HB2_OUT = 2, /*!< Select Pre DPD HB2 Output */ + ADRV904X_BF_TX_DFE_DIG_REGS_TX_DPD_CAP_SEL_POST_DPD_HB1_OUT = 3, /*!< Select Post DPD HB1 Output */ + ADRV904X_BF_TX_DFE_DIG_REGS_TX_DPD_CAP_SEL_CT_DPD_LG_DATA = 4, /*!< CT_DPD Capture Mode */ + ADRV904X_BF_TX_DFE_DIG_REGS_TX_DPD_CAP_SEL_NO_CAPTURE = 7 /*!< No Capture Mode, Zeros on Bus to Save Power */ +} adrv904x_Bf_TxDfeDigRegs_TxDpdCapSel_e; + +/** + * \brief Enumeration for txVswrDpdMuxSel + */ + +typedef enum adrv904x_Bf_TxDfeDigRegs_TxVswrDpdMuxSel +{ + ADRV904X_BF_TX_DFE_DIG_REGS_TX_VSWR_DPD_MUX_SEL_DPD_SEL = 0, /*!< No description provided */ + ADRV904X_BF_TX_DFE_DIG_REGS_TX_VSWR_DPD_MUX_SEL_VSWR_SEL = 1 /*!< No description provided */ +} adrv904x_Bf_TxDfeDigRegs_TxVswrDpdMuxSel_e; + +/** + * \brief Enumeration for txVswrFwdRev + */ + +typedef enum adrv904x_Bf_TxDfeDigRegs_TxVswrFwdRev +{ + ADRV904X_BF_TX_DFE_DIG_REGS_TX_VSWR_FWD_REV_VSWR_REV_MODE = 0, /*!< No description provided */ + ADRV904X_BF_TX_DFE_DIG_REGS_TX_VSWR_FWD_REV_VSWR_FWD_MODE = 1 /*!< No description provided */ +} adrv904x_Bf_TxDfeDigRegs_TxVswrFwdRev_e; + +#endif // _ADRV904X_BF_TX_DFE_DIG_REGS_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dig.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dig.c new file mode 100644 index 00000000000..caee9832a35 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dig.c @@ -0,0 +1,3099 @@ +/** + * \file adrv904x_bf_tx_dig.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_tx_dig.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_TX_DIG + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_DtxForceGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_DtxForceGpioSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_DtxForceGpioSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x38U), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_DtxStatus_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_DtxStatus_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x58U), + &bfValueTmp, + 0xC0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 6); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_DtxZeroCounter_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_DtxZeroCounter_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5AU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5BU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_PowerMeasClkDivideRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_PowerMeasClkDivideRatio_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_PowerMeasClkDivideRatio_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xCU), + ((uint32_t) bfValue << 4), + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_PowerMeasClkEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_PowerMeasClkEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_PowerMeasClkEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xCU), + ((uint32_t) bfValue << 7), + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_RadClkDivideRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 7U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_RadClkDivideRatio_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_RadClkDivideRatio_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xEU), + ((uint32_t) bfValue << 4), + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_RadClkDivideRatio_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_RadClkDivideRatio_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0xEU), + &bfValueTmp, + 0x70U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_RadClkEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_RadClkEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_RadClkEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0xEU), + ((uint32_t) bfValue << 7), + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_Spi2TxAttenGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_Spi2TxAttenGpioSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_Spi2TxAttenGpioSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x38), + bfValue << 5, + 0xE0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x39), + bfValue >> 3, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_Spi2TxAttenGpioSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_Spi2TxAttenGpioSelect_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x38U), + &bfValueTmp, + 0xE0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 5)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x39U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 3)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_StreamprocPfirClkEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_StreamprocPfirClkEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_StreamprocPfirClkEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1CU), + ((uint32_t) bfValue << 7), + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TpcDecrAttenGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TpcDecrAttenGpioSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TpcDecrAttenGpioSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x39U), + ((uint32_t) bfValue << 2), + 0x7CU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TpcIncrAttenGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TpcIncrAttenGpioSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TpcIncrAttenGpioSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x39), + bfValue << 7, + 0x80); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3A), + bfValue >> 1, + 0xF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxAttenClkDivideRatio_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxAttenClkDivideRatio_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x4U), + &bfValueTmp, + 0x7U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxAttenClkEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxAttenClkEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxAttenClkEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x7U), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxAttenUpdGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxAttenUpdGpioSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxAttenUpdGpioSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3A), + bfValue << 4, + 0xF0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3B), + bfValue >> 4, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxAttenUpdGpioSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxAttenUpdGpioSelect_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3AU), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 4)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3BU), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 4)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxCptBusy_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxCptBusy_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x60U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxCptTrigger_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxCptTrigger_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxCptTrigger_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5CU), + ((uint32_t) bfValue << 5), + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxDpdCptEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxDpdCptEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5CU), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxDuc0TssiPinEnableSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxDuc0TssiPinEnableSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxDuc0TssiPinEnableSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3CU), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxFscCptEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxFscCptEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5CU), + &bfValueTmp, + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 1); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection0_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection0_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x40U), + (uint32_t) bfValue, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection1_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection1_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x40), + bfValue << 6, + 0xC0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x41), + bfValue >> 2, + 0xF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection10_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection10_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection10_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x48U), + (uint32_t) bfValue, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection11_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection11_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection11_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x48), + bfValue << 6, + 0xC0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x49), + bfValue >> 2, + 0xF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection12_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection12_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection12_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x49), + bfValue << 4, + 0xF0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x4A), + bfValue >> 4, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection13_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection13_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection13_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x4AU), + ((uint32_t) bfValue << 2), + 0xFCU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection14_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection14_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection14_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x4BU), + (uint32_t) bfValue, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection15_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection15_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection15_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x4CU), + (uint32_t) bfValue, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection16_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection16_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection16_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x4C), + bfValue << 6, + 0xC0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x4D), + bfValue >> 2, + 0xF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection17_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection17_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection17_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x4D), + bfValue << 4, + 0xF0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x4E), + bfValue >> 4, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection18_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection18_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection18_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x4EU), + ((uint32_t) bfValue << 2), + 0xFCU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection19_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection19_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection19_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x4FU), + (uint32_t) bfValue, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection2_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection2_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x41), + bfValue << 4, + 0xF0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x42), + bfValue >> 4, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection20_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection20_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection20_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x50U), + (uint32_t) bfValue, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection21_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection21_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection21_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x50), + bfValue << 6, + 0xC0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x51), + bfValue >> 2, + 0xF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection22_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection22_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection22_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x51), + bfValue << 4, + 0xF0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x52), + bfValue >> 4, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection23_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection23_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection23_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x52U), + ((uint32_t) bfValue << 2), + 0xFCU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection3_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection3_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x42U), + ((uint32_t) bfValue << 2), + 0xFCU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection4_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection4_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x43U), + (uint32_t) bfValue, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection5_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection5_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x44U), + (uint32_t) bfValue, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection6_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection6_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x44), + bfValue << 6, + 0xC0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x45), + bfValue >> 2, + 0xF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection7_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection7_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x45), + bfValue << 4, + 0xF0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x46), + bfValue >> 4, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection8_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection8_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection8_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x46U), + ((uint32_t) bfValue << 2), + 0xFCU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection9_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxGpioSourceSelection9_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxGpioSourceSelection9_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x47U), + (uint32_t) bfValue, + 0x3FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxLpbCptEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxLpbCptEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5CU), + &bfValueTmp, + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxRadCptEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxRadCptEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxRadCptEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5CU), + ((uint32_t) bfValue << 3), + 0x8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxRadCptEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxRadCptEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x5CU), + &bfValueTmp, + 0x8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 3); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxRadCptMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDig_TxRadCptMode_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DIG) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DIG)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDig_TxRadCptMode_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x5DU), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dig.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dig.h new file mode 100644 index 00000000000..67fc70d2f2b --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dig.h @@ -0,0 +1,281 @@ +/** + * \file adrv904x_bf_tx_dig.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_TX_DIG_H_ +#define _ADRV904X_BF_TX_DIG_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_tx_dig_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_DtxForceGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_DtxStatus_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_DtxZeroCounter_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_PowerMeasClkDivideRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_PowerMeasClkEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_RadClkDivideRatio_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_RadClkDivideRatio_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_RadClkEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_Spi2TxAttenGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_Spi2TxAttenGpioSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_StreamprocPfirClkEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TpcDecrAttenGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TpcIncrAttenGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxAttenClkDivideRatio_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxAttenClkEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxAttenUpdGpioSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxAttenUpdGpioSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxCptBusy_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxCptTrigger_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxDpdCptEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxDuc0TssiPinEnableSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxFscCptEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection0_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection1_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection10_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection11_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection12_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection13_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection14_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection15_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection16_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection17_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection18_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection19_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection2_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection20_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection21_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection22_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection23_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection3_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection4_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection5_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection6_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection7_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection8_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxGpioSourceSelection9_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxLpbCptEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxRadCptEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxRadCptEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDig_TxRadCptMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDigChanAddr_e baseAddr, + const uint8_t bfValue); + +#endif // _ADRV904X_BF_TX_DIG_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dig_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dig_types.h new file mode 100644 index 00000000000..89eda417e79 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dig_types.h @@ -0,0 +1,31 @@ +/** + * \file adrv904x_bf_tx_dig_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_TX_DIG_TYPES_H_ +#define _ADRV904X_BF_TX_DIG_TYPES_H_ + +typedef enum adrv904x_BfTxDigChanAddr +{ + ADRV904X_BF_SLICE_TX_0__TX_DIG = 0x60830000, + ADRV904X_BF_SLICE_TX_1__TX_DIG = 0x60930000, + ADRV904X_BF_SLICE_TX_2__TX_DIG = 0x60A30000, + ADRV904X_BF_SLICE_TX_3__TX_DIG = 0x60B30000, + ADRV904X_BF_SLICE_TX_4__TX_DIG = 0x60C30000, + ADRV904X_BF_SLICE_TX_5__TX_DIG = 0x60D30000, + ADRV904X_BF_SLICE_TX_6__TX_DIG = 0x60E30000, + ADRV904X_BF_SLICE_TX_7__TX_DIG = 0x60F30000 +} adrv904x_BfTxDigChanAddr_e; + +#endif // _ADRV904X_BF_TX_DIG_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dpd_act_mmr.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dpd_act_mmr.c new file mode 100644 index 00000000000..356eeb846cb --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dpd_act_mmr.c @@ -0,0 +1,499 @@ +/** + * \file adrv904x_bf_tx_dpd_act_mmr.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_tx_dpd_act_mmr.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_TX_DPD_ACT_MMR + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDpdActMmr_DpdDdrOutShift_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDpdActMmrChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDpdActMmr_DpdDdrOutShift_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_DPD_ACT_MMR)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDpdActMmr_DpdDdrOutShift_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxDpdActMmr_DpdDdrOutShift_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x12 + channelId * 12U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDpdActMmr_DpdDdrOutShift_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDpdActMmrChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_DPD_ACT_MMR)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDpdActMmr_DpdDdrOutShift_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxDpdActMmr_DpdDdrOutShift_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x12 + channelId * 12U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDpdActMmr_DpdGmpOutShift_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDpdActMmrChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDpdActMmr_DpdGmpOutShift_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_DPD_ACT_MMR)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDpdActMmr_DpdGmpOutShift_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxDpdActMmr_DpdGmpOutShift_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x12 + channelId * 12U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDpdActMmr_DpdGmpOutShift_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDpdActMmrChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_DPD_ACT_MMR)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDpdActMmr_DpdGmpOutShift_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxDpdActMmr_DpdGmpOutShift_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x12 + channelId * 12U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDpdActMmr_MagGain_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDpdActMmrChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 255U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxDpdActMmr_MagGain_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_DPD_ACT_MMR)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDpdActMmr_MagGain_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxDpdActMmr_MagGain_BfSet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x10 + channelId * 12), + bfValue << 4, + 0xF0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x11 + channelId * 12), + bfValue >> 4, + 0xF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDpdActMmr_MagGain_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDpdActMmrChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_DPD_ACT_MMR) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_DPD_ACT_MMR)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxDpdActMmr_MagGain_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + +#if ADRV904X_CHANNELID_CHECK > 0 + if ( + (channelId != 0x0) && + (channelId != 0x1) && + (channelId != 0x2) && + (channelId != 0x3) + ) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + channelId, + "Invalid adrv904x_TxDpdActMmr_MagGain_BfGet Channel ID"); + return recoveryAction; + } +#endif /* ADRV904X_CHANNEL_ID_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x10 + channelId * 12U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 4)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x11 + channelId * 12U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 4)); + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dpd_act_mmr.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dpd_act_mmr.h new file mode 100644 index 00000000000..b0bd5e76523 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dpd_act_mmr.h @@ -0,0 +1,67 @@ +/** + * \file adrv904x_bf_tx_dpd_act_mmr.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_TX_DPD_ACT_MMR_H_ +#define _ADRV904X_BF_TX_DPD_ACT_MMR_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_tx_dpd_act_mmr_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDpdActMmr_DpdDdrOutShift_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDpdActMmrChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDpdActMmr_DpdDdrOutShift_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDpdActMmrChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDpdActMmr_DpdGmpOutShift_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDpdActMmrChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDpdActMmr_DpdGmpOutShift_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDpdActMmrChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDpdActMmr_MagGain_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDpdActMmrChanAddr_e baseAddr, + uint8_t channelId, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDpdActMmr_MagGain_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxDpdActMmrChanAddr_e baseAddr, + uint8_t channelId, + uint8_t* const bfValue); + +#endif // _ADRV904X_BF_TX_DPD_ACT_MMR_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dpd_act_mmr_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dpd_act_mmr_types.h new file mode 100644 index 00000000000..84bcd33f0c2 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_dpd_act_mmr_types.h @@ -0,0 +1,47 @@ +/** + * \file adrv904x_bf_tx_dpd_act_mmr_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_TX_DPD_ACT_MMR_TYPES_H_ +#define _ADRV904X_BF_TX_DPD_ACT_MMR_TYPES_H_ + +typedef enum adrv904x_BfTxDpdActMmrChanAddr +{ + ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DPD_ACT_MMR = 0x608E0000, + ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_DPD_ACT_MMR = 0x609E0000, + ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_DPD_ACT_MMR = 0x60AE0000, + ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_DPD_ACT_MMR = 0x60BE0000, + ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_DPD_ACT_MMR = 0x60CE0000, + ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_DPD_ACT_MMR = 0x60DE0000, + ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_DPD_ACT_MMR = 0x60EE0000, + ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_DPD_ACT_MMR = 0x60FE0000 +} adrv904x_BfTxDpdActMmrChanAddr_e; + +/** + * \brief Enumeration for dpdGmpDdrMode + */ + +typedef enum adrv904x_Bf_TxDpdActMmr_DpdGmpDdrMode +{ + ADRV904X_BF_TX_DPD_ACT_MMR_DPD_GMP_DDR_MODE_MODE0 = 0, /*!< GMP0 - 50 */ + ADRV904X_BF_TX_DPD_ACT_MMR_DPD_GMP_DDR_MODE_MODE1 = 1, /*!< GMP0 - 32 DDR7 - 6 DDR8 - 6 DDR9 - 6 */ + ADRV904X_BF_TX_DPD_ACT_MMR_DPD_GMP_DDR_MODE_MODE2 = 2, /*!< GMP0 - 38 DDR7 - 6 DDR9 - 6 */ + ADRV904X_BF_TX_DPD_ACT_MMR_DPD_GMP_DDR_MODE_MODE3 = 3, /*!< GMP0 - 38 DDR7 - 4 DDR8 - 4 DDR9 - 4 */ + ADRV904X_BF_TX_DPD_ACT_MMR_DPD_GMP_DDR_MODE_MODE4 = 4, /*!< GMP0 - 44 DDR7 - 6 */ + ADRV904X_BF_TX_DPD_ACT_MMR_DPD_GMP_DDR_MODE_MODE5 = 5, /*!< GMP0 - 44 DDR9 - 6 */ + ADRV904X_BF_TX_DPD_ACT_MMR_DPD_GMP_DDR_MODE_MODE6 = 6, /*!< GMP0 - 44 DDR7 - 3 DDR9 - 3 */ + ADRV904X_BF_TX_DPD_ACT_MMR_DPD_GMP_DDR_MODE_MODE7 = 7 /*!< GMP0 - 32 GMP1 - 9 DDR7 - 3 DDR8 - 3 DDR9 - 3 */ +} adrv904x_Bf_TxDpdActMmr_DpdGmpDdrMode_e; + +#endif // _ADRV904X_BF_TX_DPD_ACT_MMR_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_funcs.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_funcs.c new file mode 100644 index 00000000000..702fc5e1d6c --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_funcs.c @@ -0,0 +1,6068 @@ +/** + * \file adrv904x_bf_tx_funcs.c Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#include "../../private/bf/adrv904x_bf_tx_funcs.h" +#include "adi_common_error.h" +#include "adi_adrv904x_error.h" + +#include "adrv904x_bf_error_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BF_TX_FUNCS + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_AnaRampHoldSampleEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_AnaRampHoldSampleEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_AnaRampHoldSampleEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x2U), + ((uint32_t) bfValue << 2), + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_AnaRampHoldSampleEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_AnaRampHoldSampleEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x2U), + &bfValueTmp, + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_JesdDfrmMask_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_JesdDfrmMask_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_JesdDfrmMask_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x2U), + (uint32_t) bfValue, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_JesdDfrmMask_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_JesdDfrmMask_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x2U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAprEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionAprEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionAprEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x34U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAprEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionAprEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x34U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAverageDur_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionAverageDur_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionAverageDur_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x31U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAverageErrorPower_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionAverageErrorPower_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x4CU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x4DU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAveragePeakRatio_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionAveragePeakRatio_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x44U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x45U), + &bfValueTmp, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAveragePower_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionAveragePower_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x40U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x41U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAverageThreshold_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 65535U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionAverageThreshold_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionAverageThreshold_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x32), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x33), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAverageThreshold_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionAverageThreshold_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x32U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x33U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAvgpowerEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionAvgpowerEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionAvgpowerEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x30U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAvgpowerEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionAvgpowerEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x30U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAvgpowerError_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionAvgpowerError_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x48U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAvgpowerErrorClear_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionAvgpowerErrorClear_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionAvgpowerErrorClear_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x48U), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAvgpowerErrorClearRequired_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionAvgpowerErrorClearRequired_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionAvgpowerErrorClearRequired_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x30U), + ((uint32_t) bfValue << 5), + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAvgpowerErrorClearRequired_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionAvgpowerErrorClearRequired_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x30U), + &bfValueTmp, + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 5); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAvgpowerIrqEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionAvgpowerIrqEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionAvgpowerIrqEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x30U), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAvgpowerIrqEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionAvgpowerIrqEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x30U), + &bfValueTmp, + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 1); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAvgpowerRdnEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionAvgpowerRdnEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionAvgpowerRdnEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x30U), + ((uint32_t) bfValue << 2), + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAvgpowerRdnEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionAvgpowerRdnEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x30U), + &bfValueTmp, + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionGainRampUpEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionGainRampUpEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionGainRampUpEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x48U), + ((uint32_t) bfValue << 7), + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionInputSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionInputSel_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionInputSel_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x30U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionInputSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionInputSel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x30U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionOverloadCountTh_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionOverloadCountTh_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionOverloadCountTh_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3BU), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionOverloadThPre_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 511U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionOverloadThPre_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionOverloadThPre_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x38), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x39), + bfValue >> 8, + 0x1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionOverloadWindowSize_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionOverloadWindowSize_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionOverloadWindowSize_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3AU), + (uint32_t) bfValue, + 0x1FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakpowerEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionPeakpowerEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionPeakpowerEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x34U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakpowerEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionPeakpowerEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x34U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakpowerError_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionPeakpowerError_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x48U), + &bfValueTmp, + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakpowerErrorClear_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionPeakpowerErrorClear_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionPeakpowerErrorClear_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x48U), + ((uint32_t) bfValue << 3), + 0x8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakpowerErrorClearRequired_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionPeakpowerErrorClearRequired_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionPeakpowerErrorClearRequired_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x34U), + ((uint32_t) bfValue << 3), + 0x8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakpowerErrorClearRequired_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionPeakpowerErrorClearRequired_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x34U), + &bfValueTmp, + 0x8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 3); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakpowerIrqEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionPeakpowerIrqEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionPeakpowerIrqEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x34U), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakpowerIrqEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionPeakpowerIrqEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x34U), + &bfValueTmp, + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 1); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakpowerRdnEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionPeakpowerRdnEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionPeakpowerRdnEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x34U), + ((uint32_t) bfValue << 2), + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakpowerRdnEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionPeakpowerRdnEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x34U), + &bfValueTmp, + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakCount_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 63U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionPeakCount_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionPeakCount_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x34), + bfValue << 6, + 0xC0); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x35), + bfValue >> 2, + 0xF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakCount_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionPeakCount_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x34U), + &bfValueTmp, + 0xC0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) >> 6)); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x35U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 2)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakDur_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionPeakDur_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionPeakDur_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x35U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakDur_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionPeakDur_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x35U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakErrorPower_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionPeakErrorPower_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x4EU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x4FU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakPower_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionPeakPower_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x42U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x43U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakThreshold_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 65535U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionPeakThreshold_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionPeakThreshold_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x36), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x37), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakThreshold_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionPeakThreshold_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x36U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x37U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionRampMaxAttenuation_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 127U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionRampMaxAttenuation_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionRampMaxAttenuation_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3CU), + (uint32_t) bfValue, + 0x7FU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionRampStepDuration_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionRampStepDuration_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionRampStepDuration_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3DU), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionRampStepSize_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionRampStepSize_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionRampStepSize_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3DU), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionReadbackUpdate_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PaProtectionReadbackUpdate_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PaProtectionReadbackUpdate_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x45U), + ((uint32_t) bfValue << 7), + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PllJesdProtClr_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PllJesdProtClr_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PllJesdProtClr_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x2U), + ((uint32_t) bfValue << 6), + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PllJesdProtClrReqd_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PllJesdProtClrReqd_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PllJesdProtClrReqd_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x2U), + ((uint32_t) bfValue << 5), + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PllJesdProtClrReqd_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PllJesdProtClrReqd_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x2U), + &bfValueTmp, + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 5); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PllJesdProtEvent_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PllJesdProtEvent_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x2U), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 7); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PllUnlockMask_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_PllUnlockMask_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PllUnlockMask_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1U), + (uint32_t) bfValue, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PllUnlockMask_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_PllUnlockMask_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x1U), + &bfValueTmp, + 0xFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdArvEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_SrdArvEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdArvEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x64U), + ((uint32_t) bfValue << 7), + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdArvEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdArvEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x64U), + &bfValueTmp, + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 7); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdArvTxonQual_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_SrdArvTxonQual_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdArvTxonQual_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x65U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdArvTxonQual_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdArvTxonQual_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x65U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdArvWait_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_SrdArvWait_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdArvWait_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x65U), + ((uint32_t) bfValue << 4), + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdArvWait_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdArvWait_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x65U), + &bfValueTmp, + 0xF0U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdDinSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_SrdDinSel_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdDinSel_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x64U), + ((uint32_t) bfValue << 6), + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdDinSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdDinSel_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x64U), + &bfValueTmp, + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 6); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdDisAnalogDelay_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_SrdDisAnalogDelay_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdDisAnalogDelay_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_SrdEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x64U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x64U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdError_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdError_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x65U), + &bfValueTmp, + 0x4U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdErrorClear_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_SrdErrorClear_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdErrorClear_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x65U), + ((uint32_t) bfValue << 3), + 0x8U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdIrqEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_SrdIrqEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdIrqEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x64U), + ((uint32_t) bfValue << 4), + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdIrqEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdIrqEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x64U), + &bfValueTmp, + 0x10U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdRdnEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_SrdRdnEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdRdnEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x64U), + ((uint32_t) bfValue << 5), + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdRdnEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdRdnEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x64U), + &bfValueTmp, + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 5); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdSlewOffset_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 65535U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_SrdSlewOffset_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdSlewOffset_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x66), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x67), + bfValue >> 8, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdSlewOffset_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdSlewOffset_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x66U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x67U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdStat_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdStat_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x6CU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x6DU), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdStatEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_SrdStatEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdStatEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x64U), + ((uint32_t) bfValue << 1), + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdStatEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdStatEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x64U), + &bfValueTmp, + 0x2U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 1); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdStatMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_SrdStatMode_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdStatMode_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x64U), + ((uint32_t) bfValue << 2), + 0xCU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdStatMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_SrdStatMode_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x64U), + &bfValueTmp, + 0xCU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 2); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxAttenuation_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint16_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1023U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_TxAttenuation_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_TxAttenuation_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x8), + bfValue, + 0xFF); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x9), + bfValue >> 8, + 0x3); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxAttenuation_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint16_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_TxAttenuation_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x8U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp))); + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x9U), + &bfValueTmp, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint16_t) ((uint64_t)(*bfValue) | (((uint64_t)bfValueTmp) << 8)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxAttenConfig_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_TxAttenConfig_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_TxAttenConfig_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x0U), + ((uint32_t) bfValue << 4), + 0x30U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxAttenConfig_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_TxAttenConfig_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x0U), + &bfValueTmp, + 0x30U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 4); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxAttenMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 3U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_TxAttenMode_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_TxAttenMode_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x0U), + (uint32_t) bfValue, + 0x3U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxAttenPapDisAnalogDelay_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_TxAttenPapDisAnalogDelay_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_TxAttenPapDisAnalogDelay_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x1U), + ((uint32_t) bfValue << 5), + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxAttenUpdGpioEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_TxAttenUpdGpioEn_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_TxAttenUpdGpioEn_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x6U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxAttenUpdGpioEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_TxAttenUpdGpioEn_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x6U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxAttenUpdTrgSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_TxAttenUpdTrgSel_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_TxAttenUpdTrgSel_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3U), + ((uint32_t) bfValue << 5), + 0x20U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxPeakToPowerMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_TxPeakToPowerMode_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_TxPeakToPowerMode_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x70U), + ((uint32_t) bfValue << 6), + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxPeakToPowerMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_TxPeakToPowerMode_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x70U), + &bfValueTmp, + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 6); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxPower_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_TxPower_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x74U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxPowerInputSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 15U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_TxPowerInputSelect_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_TxPowerInputSelect_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x70U), + ((uint32_t) bfValue << 1), + 0x1EU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxPowerInputSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_TxPowerInputSelect_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x70U), + &bfValueTmp, + 0x1EU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 1); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxPowerLargestPeak_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_TxPowerLargestPeak_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x78U), + &bfValueTmp, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxPowerMeasurementDuration_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 31U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_TxPowerMeasurementDuration_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_TxPowerMeasurementDuration_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x73U), + ((uint32_t) bfValue << 1), + 0x3EU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxPowerMeasurementDuration_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_TxPowerMeasurementDuration_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x73U), + &bfValueTmp, + 0x3EU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 1); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxPowerMeasurementEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_TxPowerMeasurementEnable_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_TxPowerMeasurementEnable_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x70U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxPowerMeasurementEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_TxPowerMeasurementEnable_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x70U), + &bfValueTmp, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) bfValueTmp; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxPowerMeasurementReadback_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_TxPowerMeasurementReadback_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_TxPowerMeasurementReadback_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x75U), + (uint32_t) bfValue, + 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_UseAttenWordS1ViaGpioPin_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_UseAttenWordS1ViaGpioPin_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_UseAttenWordS1ViaGpioPin_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3U), + ((uint32_t) bfValue << 6), + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_UseAttenWordS1ViaGpioPin_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValueTmp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_NULL_CHECK > 0 + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, bfValue); +#endif /* ADRV904X_BITFIELD_NULL_CHECK */ + + *bfValue = (uint8_t) 0; + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_UseAttenWordS1ViaGpioPin_BfGet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Read(device, + spiCache, + (uint32_t) (baseAddr + 0x3U), + &bfValueTmp, + 0x40U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Read Issue"); + return recoveryAction; + } + + *bfValue = (uint8_t) (bfValueTmp >> 6); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_UseSliceAttenValue_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_BF); + +#if ADRV904X_BITFIELD_VALUE_CHECK > 0 + if ((bfValue < 0) || + (bfValue > 1U)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + bfValue, + "Invalid BitField Value in adrv904x_TxFuncs_UseSliceAttenValue_BfSet"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_VALUE_CHECK */ + +#if ADRV904X_BITFIELD_ADDR_CHECK > 0 + if ((baseAddr != ADRV904X_BF_SLICE_TX_0__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_1__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_2__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_3__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_4__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_5__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_6__TX_FUNCS) && + (baseAddr != ADRV904X_BF_SLICE_TX_7__TX_FUNCS)) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_DEVICEBF, + ADI_COMMON_ERRCODE_INVALID_PARAM, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + baseAddr, + "Invalid adrv904x_TxFuncs_UseSliceAttenValue_BfSet Address"); + return recoveryAction; + } +#endif /* ADRV904X_BITFIELD_ADDR_CHECK */ + + recoveryAction = adi_adrv904x_Register32Write(device, + spiCache, + ((uint32_t) baseAddr + 0x3U), + ((uint32_t) bfValue << 7), + 0x80U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue"); + return recoveryAction; + } + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_funcs.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_funcs.h new file mode 100644 index 00000000000..9845f6055ee --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_funcs.h @@ -0,0 +1,546 @@ +/** + * \file adrv904x_bf_tx_funcs.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_TX_FUNCS_H_ +#define _ADRV904X_BF_TX_FUNCS_H_ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_tx_funcs_types.h" + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_AnaRampHoldSampleEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_AnaRampHoldSampleEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_JesdDfrmMask_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_JesdDfrmMask_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAprEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAprEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAverageDur_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAverageErrorPower_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAveragePeakRatio_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAveragePower_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAverageThreshold_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAverageThreshold_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAvgpowerEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAvgpowerEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAvgpowerError_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAvgpowerErrorClear_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAvgpowerErrorClearRequired_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAvgpowerErrorClearRequired_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAvgpowerIrqEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAvgpowerIrqEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAvgpowerRdnEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionAvgpowerRdnEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionGainRampUpEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionInputSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionInputSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionOverloadCountTh_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionOverloadThPre_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionOverloadWindowSize_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakpowerEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakpowerEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakpowerError_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakpowerErrorClear_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakpowerErrorClearRequired_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakpowerErrorClearRequired_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakpowerIrqEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakpowerIrqEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakpowerRdnEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakpowerRdnEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakCount_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakCount_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakDur_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakDur_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakErrorPower_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakPower_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakThreshold_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionPeakThreshold_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionRampMaxAttenuation_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionRampStepDuration_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionRampStepSize_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PaProtectionReadbackUpdate_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PllJesdProtClr_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PllJesdProtClrReqd_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PllJesdProtClrReqd_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PllJesdProtEvent_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PllUnlockMask_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_PllUnlockMask_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdArvEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdArvEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdArvTxonQual_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdArvTxonQual_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdArvWait_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdArvWait_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdDinSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdDinSel_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdDisAnalogDelay_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdError_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdErrorClear_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdIrqEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdIrqEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdRdnEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdRdnEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdSlewOffset_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdSlewOffset_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdStat_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdStatEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdStatEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdStatMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_SrdStatMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxAttenuation_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint16_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxAttenuation_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint16_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxAttenConfig_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxAttenConfig_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxAttenMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxAttenPapDisAnalogDelay_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxAttenUpdGpioEn_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxAttenUpdGpioEn_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxAttenUpdTrgSel_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxPeakToPowerMode_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxPeakToPowerMode_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxPower_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxPowerInputSelect_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxPowerInputSelect_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxPowerLargestPeak_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxPowerMeasurementDuration_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxPowerMeasurementDuration_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxPowerMeasurementEnable_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxPowerMeasurementEnable_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_TxPowerMeasurementReadback_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_UseAttenWordS1ViaGpioPin_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_UseAttenWordS1ViaGpioPin_BfGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + uint8_t* const bfValue); + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncs_UseSliceAttenValue_BfSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfTxFuncsChanAddr_e baseAddr, + const uint8_t bfValue); + +#endif // _ADRV904X_BF_TX_FUNCS_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_funcs_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_funcs_types.h new file mode 100644 index 00000000000..82c79ed2078 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/bf/adrv904x_bf_tx_funcs_types.h @@ -0,0 +1,31 @@ +/** + * \file adrv904x_bf_tx_funcs_types.h Automatically generated file with generator ver 0.0.16.0. + * + * \brief Contains BitField functions to support ADRV904X transceiver device. + * + * ADRV904X BITFIELD VERSION: 0.0.0.11 + * + * Disclaimer Legal Disclaimer + * + * Copyright 2015 - 2021 Analog Devices Inc. + * + * Released under the ADRV904X API license, for more information see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef _ADRV904X_BF_TX_FUNCS_TYPES_H_ +#define _ADRV904X_BF_TX_FUNCS_TYPES_H_ + +typedef enum adrv904x_BfTxFuncsChanAddr +{ + ADRV904X_BF_SLICE_TX_0__TX_FUNCS = 0x60840000, + ADRV904X_BF_SLICE_TX_1__TX_FUNCS = 0x60940000, + ADRV904X_BF_SLICE_TX_2__TX_FUNCS = 0x60A40000, + ADRV904X_BF_SLICE_TX_3__TX_FUNCS = 0x60B40000, + ADRV904X_BF_SLICE_TX_4__TX_FUNCS = 0x60C40000, + ADRV904X_BF_SLICE_TX_5__TX_FUNCS = 0x60D40000, + ADRV904X_BF_SLICE_TX_6__TX_FUNCS = 0x60E40000, + ADRV904X_BF_SLICE_TX_7__TX_FUNCS = 0x60F40000 +} adrv904x_BfTxFuncsChanAddr_e; + +#endif // _ADRV904X_BF_TX_FUNCS_TYPES_H_ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_agc.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_agc.h new file mode 100644 index 00000000000..e5916e07367 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_agc.h @@ -0,0 +1,66 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adrv904x_agc.h + * \brief Contains ADRV904X AGC related private function prototypes for + * adrv904x_agc.c which helps adi_adrv904x_agc.c + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADRV904X_AGC_H_ +#define _ADRV904X_AGC_H_ + +#include "adi_adrv904x_error.h" +#include "adi_adrv904x_agc_types.h" + +/** +* \brief Range check a given AGC configuration +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] agcCfg Pointer to AGC configuration to be range checked +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_AgcCfgRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_AgcCfg_t * const agcCfg); + +/** +* \brief Range check a given AGC gain range configuration +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] agcGainRangeCfg Pointer to AGC gain range configuration to be range checked +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_AgcGainRangeCfgRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_AgcGainRange_t * const agcGainRangeCfg); + + +/** +* \brief Range check a given dual band AGC configuration +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] agcDualBandCfg Pointer to dual band AGC configuration to be range checked +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_AgcDualBandCfgRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_AgcDualBandCfg_t * const agcDualBandCfg); +#endif diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_binloader.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_binloader.h new file mode 100644 index 00000000000..46d1c3a7669 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_binloader.h @@ -0,0 +1,57 @@ +/** +* Copyright 2015 - 2022 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adrv904x_binloader.h + * \brief Contains ADRV904X binary loader related private function prototypes for + * adrv904x_binloader.c which helps adi_adrv904x_utilities.c + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADRV904X_BINLOADER_H_ +#define _ADRV904X_BINLOADER_H_ + +#include "adi_adrv904x_error.h" + +/** +* \brief This function loads ADRV904X api version, firmware and stream versions, +* ADRV904X Init and PostMcsInit data structures from the Binary Image that also has the profile. +* +* This function reads the CPU Binary Image file from a specified location(e.g.SD card) +* and, if it contains more information than the profile, populates the structs adi_adrv904x_Version_t for +* the api version, adi_adrv904x_CpuFwVersion_t for the firmware version, adi_adrv904x_Version_t for +* the stream version, adi_adrv904x_Init_t init structure and adi_adrv904x_PostMcsInit_t postMcsInit structures. +* +* If profile.bin contains these structures, this function must be called before +* adi_adrv904x_PreMcsInit, adi_adrv904x_PreMcsInit_NonBroadcast and adi_adrv904x_PostMcsInit +* as these functions require the structures to be already populated. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in,out] file Pointer to Binary file +* \param[out] apiVer Pointer to the ADRV904X api version data structure to be populated +* \param[out] fwVer Pointer to the ADRV904X firmware version data structure to be populated +* \param[out] streamVer Pointer to the ADRV904X stream version data structure to be populated +* \param[out] init Pointer to the ADRV904X Init data structure to be populated +* \param[out] postMcsInit Pointer to the ADRV904X PostMcsInit data structure to be populated +* \param[in] fileOffset Offset to be applied in the binary file to jump to structures of interest +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_LoadBinFile(adi_adrv904x_Device_t* const device, + FILE* const file, + adi_adrv904x_Version_t* const apiVer, + adi_adrv904x_CpuFwVersion_t* const fwVer, + adi_adrv904x_Version_t* const streamVer, + adi_adrv904x_Init_t* const initStruct, + adi_adrv904x_PostMcsInit_t* const postMcsInitStruct, + const uint32_t fileOffset); + +#endif diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_carrier_reconfigure.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_carrier_reconfigure.h new file mode 100644 index 00000000000..51f35df4cd4 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_carrier_reconfigure.h @@ -0,0 +1,481 @@ +/** + * Copyright 2015 - 2022 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adrv904x_carrier_reconfigure.h + * \brief Contains ADRV904x Carrier Reconfigure function declarations + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADRV904X_CARRIER_RECONFIGURE_H_ +#define _ADRV904X_CARRIER_RECONFIGURE_H_ + +#include "adrv904x_reg_addr_macros.h" +#include "adrv904x_carrier_reconfigure_types.h" + +#include "../../private/bf/adrv904x_bf_cddc_funcs.h" +#include "../../private/bf/adrv904x_bf_cddc_hb_dpath.h" + +#ifndef CLIENT_IGNORE + +/** +* \brief Entry point for cduc carrier delay configuration +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in, out] device Pointer to the ADRV904X device data structure +* \param[in] carrierConfigs carrier input config +* \param[in] carrierChannelFilter channel filter configuration +* \param[in] carrierConfigsOut holds the calculated values during reconfiguration +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducDelayConfigurationCalculate( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierRadioCfg_t* const carrierConfigs, + const adi_adrv904x_ChannelFilterOutputCfg_t* const carrierChannelFilter, + adi_adrv904x_CarrierReconfigProfileCfgOut_t* const carrierConfigsOut); +/** +* \brief Entry point for cddc carrier delay configuration +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] carrierConfigs carrier input config +* \param[in] carrierChannelFilter channel filter configuration +* \param[in, out] carrierConfigsOut holds the calculated values during reconfiguration +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcDelayConfigurationCalculate( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierRadioCfg_t* const carrierConfigs, + const adi_adrv904x_ChannelFilterOutputCfg_t* const carrierChannelFilter, + adi_adrv904x_CarrierReconfigProfileCfgOut_t* const carrierConfigsOut); + + +/** +* \brief Called before reconfiguring. Initializes the top level Solution struct to default values +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \pre None +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] inJesdCfg User input of jesd config. To be copied to soln struct +* \param[in] inProfileCfgs User input of carrier radio input configs (array size = inNumProfiles). To be copied to soln struct +* \param[in] inNumProfiles Number of carrier radio profiles contained in inProfileCfgs +* \param[in,out] soln holds the calculated values during reconfiguration. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_ReconfigSolutionInit( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierJesdCfg_t* const inJesdCfg, + const adi_adrv904x_CarrierRadioCfg_t inProfileCfgs[], + uint32_t inNumProfiles, + adi_adrv904x_CarrierReconfigSoln_t* const soln); + +/** +* \brief Performs JESD calculations +* +* For all enabled carriers, calculates: +* - rxCarrierConfigsOut.carriers.decimationInterpolationRatio +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \pre None +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] chanSelect is the channel parameter +* \param[in] carrierConfigs carrier settings for this channel +* \param[in,out] carrierConfigsOut holds the calculated values during reconfiguration +* \param[in] rxFlag 1 = Rx settings, 0 = Tx +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CarrierJesdParametersCalculate( adi_adrv904x_Device_t* const device, + const adrv904x_CarrierInitialCfg_t* const initialCfg, + const adi_adrv904x_CarrierRadioCfg_t* const carrierConfigs, + adi_adrv904x_CarrierReconfigProfileCfgOut_t* const carrierConfigsOut, + const uint8_t rxFlag); + +/** +* \brief Performs Rx Sample XBar JESD calculations +* +* For all enabled carriers, calculates: +* - rxCarrierConfigsOut.carriers.decimationInterpolationRatio +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \pre None +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] jesdCfg - Pointer that holds the updated JESD settings to accomdate the new carrier settings +* \param[in,out] soln - Solution structure that holds the calculated values during reconfiguration +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CalculateRxSampleXbarSlotConfig( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierJesdCfg_t* const inJesdCfg, + adi_adrv904x_CarrierReconfigOutput_t* const out); + +/** +* \brief Performs Rx Sample XBar JESD calculations +* +* For all enabled carriers, calculates: +* - rxCarrierConfigsOut.carriers.decimationInterpolationRatio +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \pre None +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] jesdCfg - Pointer that holds the updated JESD settings to accomdate the new carrier settings +* \param[in,out] soln - Solution structure that holds the calculated values during reconfiguration +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CalculateTxSampleXbarSlotConfig( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierJesdCfg_t* const inJesdCfg, + adi_adrv904x_CarrierReconfigOutput_t* const out); + +/** +* \brief Performs Rx Carrier Band Sorting for Dynamic Reconfiguration +* +* For all enabled carriers, calculates: +* - rxCarrierConfigsOut.bandSelect +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \pre None +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] rxCarrierConfigs carrier settings for this channel +* \param[in,out] rxCarrierConfigsOut holds the calculated values for a single profile during reconfiguration +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierBandSorting( adi_adrv904x_Device_t* const device, + const adrv904x_CarrierInitialCfg_t* const rxInitialCfg, + const adi_adrv904x_CarrierRadioCfg_t* const rxCarrierConfigs, + adi_adrv904x_CarrierReconfigProfileCfgOut_t* const rxCarrierConfigsOut); +/** +* \brief Performs Tx Carrier Band Sorting for Dynamic Reconfiguration +* +* For all enabled carriers, calculates: +* - carrierConfigsOut.bandSelect +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \pre None +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] txCarrierConfigs carrier settings for this channel +* \param[in,out] txCarrierConfigsOut holds the calculated values for a single profile during reconfiguration +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCarrierBandSorting( adi_adrv904x_Device_t* const device, + const adrv904x_CarrierInitialCfg_t* const txInitialCfg, + const adi_adrv904x_CarrierRadioCfg_t* const txCarrierConfigs, + adi_adrv904x_CarrierReconfigProfileCfgOut_t* const txCarrierConfigsOut); + + + +/** +* \brief Performs Rx Carrier NCO calculation for Dynamic Reconfiguration +* +* For all enabled carriers, calculates: +* - rxCarrierConfigsOut.mixerEnable +* - rxCarrierConfigsOut.ncoFreq_kHz +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \pre adrv904x_RxCarrierBandSorting +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] rxCarrierConfigs carrier settings for this channel +* \param[in,out] rxCarrierConfigsOut holds the calculated values for a single profile during reconfiguration +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierNcoReconfig( adi_adrv904x_Device_t* const device, + const adrv904x_CarrierInitialCfg_t* const rxInitialCfg, + const adi_adrv904x_CarrierRadioCfg_t* const rxCarrierConfigs, + adi_adrv904x_CarrierReconfigProfileCfgOut_t* const rxCarrierConfigsOut); + + +/** +* \brief Performs Tx Carrier NCO calculation for Dynamic Reconfiguration +* +* For all enabled carriers, calculates: +* - txCarrierConfigsOut.mixerEnable +* - txCarrierConfigsOut.ncoFreq_kHz +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \pre adrv904x_TxCarrierBandSorting +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] txCarrierConfigs carrier settings for this channel +* \param[in,out] txCarrierConfigsOut holds the calculated values for a single profile during reconfiguration +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCarrierNcoReconfig( adi_adrv904x_Device_t* const device, + const adrv904x_CarrierInitialCfg_t* const txInitialCfg, + const adi_adrv904x_CarrierRadioCfg_t* const txCarrierConfigs, + adi_adrv904x_CarrierReconfigProfileCfgOut_t* const txCarrierConfigsOut); + + + +/** +* \brief Performs Tx Carrier Band Atten calculation for Dynamic Reconfiguration +* +* For all enabled carriers, calculates: +* - txCarrierConfigsOut.bandAtten[01] +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \pre adrv904x_RxCarrierBandSorting +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] txCarrierConfigs carrier settings for this channel +* \param[in,out] txCarrierConfigsOut holds the calculated values for a single profile during reconfiguration +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCarrierBandAttenConfig( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierRadioCfg_t* const txCarrierConfigs, + adi_adrv904x_CarrierReconfigProfileCfgOut_t* const txCarrierConfigsOut); + +/** +* \brief Writes the reconfigured rx carrier settings for the specified channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \pre adrv904x_RxCarrierDelayCalculate +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] chanSelect is the channel parameter +* \param[in] rxHwDelayBufferConfig holds the reconfiguration settings to be written to the device +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierDelaySet( adi_adrv904x_Device_t* const device, + const uint8_t chanSelect, + const adi_adrv904x_CarrierHwDelayBufferConfig_t* const rxHwDelayBufferConfig); +/** +* \brief Writes the reconfigured rx carrier delay settings for the specified channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \pre adrv904x_RxCarrierNcoReconfig +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] chanSelect is the channel parameter +* \param[in] rxCarrierConfigs holds the reconfiguration settings for a single profile to be written to the device +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierConfigSet( adi_adrv904x_Device_t* const device, + const uint8_t chanSelect, + const adi_adrv904x_CarrierReconfigProfileCfgOut_t* const rxCarrierConfigs); + +/** +* \brief Writes the reconfigured tx carrier settings for the specified channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \pre adrv904x_TxCarrierNcoReconfig +* \pre adrv904x_TxCarrierBandAttenConfig +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] chanSelect is the channel parameter +* \param[in] txCarrierConfigs holds the reconfiguration settings for a single profile to be written to the device +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCarrierConfigSet( adi_adrv904x_Device_t* const device, + const uint8_t chanSelect, + const adi_adrv904x_CarrierReconfigProfileCfgOut_t* const txCarrierConfigs); + +/** +* \brief Writes the reconfigured tx carrier settings for the specified channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \pre adrv904x_TxCarrierDelayCalculate +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] chanSelect is the channel parameter +* \param[in] txHwDelayBufferConfig holds the reconfiguration settings to be written to the device +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCarrierDelaySet( adi_adrv904x_Device_t* const device, + const uint8_t chanSelect, + const adi_adrv904x_CarrierHwDelayBufferConfig_t* const txHwDelayBufferConfig); + +/** +* \brief Writes the reconfigured JESD link settings +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \pre adrv904x_CarrierJesdParametersCalculate +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] carrierJesdConfig holds the reconfiguration settings to be written to the device +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxJesdConfigSet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierReconfigOutput_t* const reconfigOut); + +/** +* \brief Writes the reconfigured channelized JESD settings +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \pre adrv904x_CarrierJesdParametersCalculate +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] rxChannelMask holds bitmask of rx channels to reconfigure +* \param[in] carrierJesdConfig holds the reconfiguration settings to be written to the device +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CarrierRxJesdConfigSet( adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const adi_adrv904x_CarrierReconfigProfileCfgOut_t* const carrierJesdConfig); + + +/** +* \brief Writes the reconfigured JESD link settings +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \pre adrv904x_CarrierJesdParametersCalculate +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] carrierJesdConfig holds the reconfiguration settings to be written to the device +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxJesdConfigSet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierReconfigOutput_t* const reconfigOut); + +/** +* \brief Writes the reconfigured JESD settings +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \pre adrv904x_CarrierJesdParametersCalculate +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] txChannelMask holds bitmask of rx channels to reconfigure +* \param[in] carrierJesdConfig holds the reconfiguration settings to be written to the device +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CarrierTxJesdConfigSet( adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const adi_adrv904x_CarrierReconfigProfileCfgOut_t* const carrierJesdConfig); + + +/** +* \brief Loads up the channel filter table for all carriers. Should be called one carrier at a time using the coeffIdx as a way to +* keep track of where the next coefficient should be placed. +* Throws an error if coeffIdx ever goes over the max number of filters allowed. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] carrierChannelFilterApplicationSel the application selection for the current carrier +* \param[in] carrierCfg carrier settings for the current carrier +* \param[out] coeffTable pointer to the start of the corresponding channel filter table +* \param[out] coeffTableSize pointer to the number of elements in the coeff table +* \param[out] numberOfFilterTaps pointer to unsigned integer that holds the number of filter taps for this application +* \param[out] assymetricFilterTaps pointer to an unsigned char that holds a 1 if asymmetric, 0 otherwise +* \param[in] rxFlag if 1, select rx cddc tables, tx cduc otherwise +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_ChannelFilterCoefsGet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierFilterApplicationType_e carrierChannelFilterApplicationSel, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps, + const uint8_t rxFlag); + +/** +* \brief Performs Slot Shuffling algorithm that targets carrier delayMismatch to below desired threshold +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] carrierConfigs holds the new carrier radio settings for a reconfig +* \param[out] carrierConfigsOut holds the reconfiguration settings for a single profile to be written to the device +* \param[in] carrierChannelFilter hold the Channel Filter configuration +* \param[in] rxFlag if 1, select rx cddc tables, tx cduc otherwise +* +* \param[in] carrierCfg carrier settings for the current carrier + +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CarrierDelaySlotShuffleSet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierRadioCfg_t* const carrierConfigs, + const adi_adrv904x_ChannelFilterOutputCfg_t* const carrierChannelFilter, + adi_adrv904x_CarrierReconfigProfileCfgOut_t* const carrierConfigsOut, + const uint8_t rxFlag); + +#endif //CLIENT_IGNORE +#endif diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_carrier_reconfigure_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_carrier_reconfigure_types.h new file mode 100644 index 00000000000..b694ff57b08 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_carrier_reconfigure_types.h @@ -0,0 +1,96 @@ +/** +* Copyright 2015 - 2022 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adrv904x_carrier_reconfigure_types.h +* +* \brief Contains ADRV904X data types for private carrier reconfigure features +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#ifndef _ADRV904X_CARRIER_RECONFIGURE_TYPES_H_ +#define _ADRV904X_CARRIER_RECONFIGURE_TYPES_H_ + +#include "adi_adrv904x_carrier_reconfigure_types.h" +#include "adi_adrv904x_types.h" + +#define ADRV904X_NO_OF_RSD_CARRIER_SLOTS (128U) +#define ADRV904X_MAX_CARRIER_DELAY_VALUE (1020) +#define ADRV904X_CARRIER_DELAY_ELEMENT_SIZE (255) +#define ADRV904X_NO_OF_HALF_BAND_DELAYS (5U) +#define ADRV904X_JESD_IQ_RATE_KHZ (30720U) +#define ADRV904X_MAX_CARRIER_VIRTUAL_CONVERTER_RATE (31250U) +#define ADRV904X_MIN_CARRIER_VIRTUAL_CONVERTER_RATE (ADRV904X_MAX_CARRIER_VIRTUAL_CONVERTER_RATE >> 1) +#define ADRV904X_HALF_MAX_DELAY_CC (4) +#define ADRV904X_MAX_DELAY_CC (ADRV904X_HALF_MAX_DELAY_CC << 1) +#define ADRV904X_SLOT_TABLE_UNUSED (128U) +#define ADI_LFSR_START_SEED (0x4321u) +#define ADI_SLOT_SHUFFLE_RAND_ITERATIONS (50u) +#define ADI_SLOT_SHUFFLE_USE_ONLY_RAND (0u) +#define ADI_ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS (0u) + + +typedef struct adrv904x_CarrierJesdParameters +{ + uint32_t frequency_kHz; + uint16_t divide; + uint16_t numSlots; + uint16_t maxSlot; + uint16_t ifaceMaxSlot; + uint16_t initSlot; + uint16_t slotTable[ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS]; + uint16_t ifaceSlotTable[ADI_ADRV904X_MAX_NO_OF_JESD_IFACE_SLOTS]; + uint64_t slotValid; +} adrv904x_CarrierJesdParameters_t; + +typedef struct adrv904x_SlotTableShuffleParams +{ + uint16_t jesdSlotTable[ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS]; //64 + uint16_t jesdMaxSlot; + uint16_t jesdSlotValid[ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS]; + uint16_t carrierSlots[8]; + uint16_t carriersEnabled; + int16_t carrierDelayMismatch[ADI_ADRV904X_MAX_CARRIERS]; + + uint16_t jesdClkPeriod; + uint16_t carrierClkPeriod[ADI_ADRV904X_MAX_CARRIERS]; + + uint16_t ifaceMaxSlots; +} adrv904x_SlotTableShuffleParams_t; + +typedef struct adrv904x_ShuffleDiag +{ + uint8_t enabled; + uint8_t converged; + uint32_t procTime_us; + uint32_t ziter; + uint32_t miter; + uint32_t citer; + uint32_t move_iter; +} adrv904x_ShuffleDiag_t; + +/** +* \brief Holds internal values used only for calculation +*/ +typedef struct adrv904x_CarrierResourceSharePrm +{ + uint32_t dlyPrev[ADI_ADRV904X_MAX_CARRIERS]; /*!< Resource share delay value */ + uint32_t clkPeriod[ADI_ADRV904X_MAX_CARRIERS]; /*!< Resrouce share delay period */ + uint8_t numCarriers; /*!< Number of Carriers */ +} adrv904x_CarrierResourceSharePrm_t; + +/** +* \brief Internal struct used to store settings from initialization +*/ +typedef struct adrv904x_CarrierInitialCfg +{ + adi_adrv904x_BandCfgExtract_t bandSettings[ADI_ADRV904X_NO_OF_BANDS]; /*!< Band settings */ + uint8_t maxSlot; /*!< Initial maxSlot value */ +} adrv904x_CarrierInitialCfg_t; + +#endif /* _ADRV904X_CARRIER_RECONFIGURE_TYPES_H_ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu.h new file mode 100644 index 00000000000..9ba230bda3d --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu.h @@ -0,0 +1,454 @@ + +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adrv904x_cpu.h + * \brief Contains ADRV904X CPU related private function prototypes for + * adrv904x_cpu.c which helps adi_adrv904x_cpu.c + * + * ADRV904X API Version: 2.10.0.4 + */ +#ifndef _ADRV904X_CPU_H_ +#define _ADRV904X_CPU_H_ + +#include "adrv904x_cpu_types.h" +#include "adrv904x_cpu_macros.h" +#include "adrv904x_cpu_health_monitor_types.h" +#include "adrv904x_cpu_cmd.h" +#include "../../private/bf/adrv904x_bf_core.h" + +#include "adi_adrv904x_cpu_types.h" +#include "adi_adrv904x_error_types.h" +#include "adi_adrv904x_error.h" + +#define ADI_ADRV904X_CPU_CMD_RESP_CHECK_RETURN(cmdStatusErrorCode, cmdStatus, cpuErrorCode, recoveryAction) \ + \ +if (cmdStatus == ADRV904X_CPU_CMD_STATUS_CMD_FAILED) \ +{ \ + cpuErrorCode = ADRV904X_CTOHL(cmdStatusErrorCode); \ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_CPU_RUNTIME, \ + cpuErrorCode, \ + cmdStatus, \ + recoveryAction); \ + return recoveryAction; \ +} \ +else \ +{ \ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_CPU, \ + ADI_ADRV904X_ERRCODE_CPU_CMD_RESPONSE, \ + cmdStatus, \ + recoveryAction); \ + return recoveryAction; \ +} \ + +#define ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(cmdStatusErrorCode, cmdStatus, cpuErrorCode, recoveryAction, label) \ + \ +if (cmdStatus == ADRV904X_CPU_CMD_STATUS_CMD_FAILED) \ +{ \ + cpuErrorCode = ADRV904X_CTOHL(cmdStatusErrorCode); \ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_CPU_RUNTIME, \ + cpuErrorCode, \ + cmdStatus, \ + recoveryAction); \ + goto label; \ +} \ +else \ +{ \ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_CPU, \ + ADI_ADRV904X_ERRCODE_CPU_CMD_RESPONSE, \ + cmdStatus, \ + recoveryAction); \ + goto label; \ +} \ + +typedef adi_adrv904x_ErrAction_e(*adrv904xCoreBfSet8FnPtr_t)( adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +typedef adi_adrv904x_ErrAction_e(*adrv904xCoreBfGet8FnPtr_t)( adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint8_t* const bfValue); + +typedef adi_adrv904x_ErrAction_e(*adrv904xCoreBfSet16FnPtr_t)( adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint16_t bfValue); + +typedef adi_adrv904x_ErrAction_e(*adrv904xCoreBfGet16FnPtr_t)( adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t* const bfValue); + +/** +* \brief Function used by ADRV904X API to test API/FW Ping +* +* This function sends a Ping command through the CPU Mailbox interface to see if the CPU is functioning +* +* \pre This function may be called any time after device initialization +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device data structure containing settings +* \param[in] cpuType Selection of the desired CPU processor to execute this command on. +* \param[in] writeData data write to CPU. +* \param[out] readData data read from CPU. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuPing(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType, + const uint32_t writeData, + uint32_t* const readData); + +/** +* \brief Reads back efuse data from CPU +* +* \pre This function is called after the device is initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device data structure containing settings +* \param[in] address efuse address. +* \param[out] value pointer to a memory location of retuning efuse data. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuEfuseGet(adi_adrv904x_Device_t* const device, + const uint32_t address, + uint32_t* const value); + +/** +* \brief Function used by ADRV904X API to test API/FW CPU Force Exception +* +* This function sends a Force Exception command through the CPU Mailbox Command interface to force a CPU exception +* +* \pre This function may be called any time after device initialization +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device data structure containing settings +* \param[in] cpuType Selection of the desired CPU processor to execute this command on. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuForceException(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType); + +/** +* \brief Read the M4 ECC scrubbing enable state +* +* \pre This function is called after the device is initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] eccEnable M4 ECC enable state (0 = disabled, !0 = enabled) +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_EccEnableGet(adi_adrv904x_Device_t* const device, + uint8_t* const eccEnable); + +/** +* \brief Read the M4 ECC scrubbing enable state +* +* \pre This function is called after the device is initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] eccEnable M4 ECC enable state to set (0 = disabled, !0 = enabled) +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_EccEnableSet(adi_adrv904x_Device_t* const device, + uint8_t const eccEnable); + +#ifndef CLIENT_IGNORE +/** +* \brief Private Helper function to initialize cpu's data structure +* +* This is a private function and is automatically called by the API. +* +* \param[in,out] device Structure pointer to the ADRV904X data structure containing settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuInitialize(adi_adrv904x_Device_t* const device); + +/** +* \brief Private Helper function to get a CPU's key addresses +* +* This is a private function and is automatically called by the API. +* +* \param[in] cpu Structure pointer to the ADRV904X's CPU data structure containing settings +* \param[in] cpuType type of cpu +* +* \retval adi_adrv904x_CpuAddr_t* for the requested CPU's or NULL if not found. +*/ +ADI_API adi_adrv904x_CpuAddr_t* adrv904x_CpuAddrGet(adi_adrv904x_Cpu_t* const cpu, + const adi_adrv904x_CpuType_e cpuType); + + +/** +* \brief Private Helper function to get a uint32_t from binary array +* +* This is a private function and is automatically called by the API. +* +* \param[in] buf Structure pointer to buffer array +* \param[in] size number of bytes to convert to uint32_t +* +* \retval uint32_t return uint32_t from buffer +*/ +ADI_API uint32_t adrv904x_CpuIntFromBytesGet(const uint8_t* const buf, const uint8_t size); + +/** +* \brief Low level helper function used by ADRV904X API to write CPU Command +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param device Structure pointer to the ADRV904X data structure containing settings +* \param cpuType Selection of the desired CPU processor to execute this command on. +* \param linkId Selection of the desired Link for the command. +* \param cmdId To Identify a Command. +* \param cmd Contain command buffer. +* \param payloadSize Number of bytes in the cmd payload +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuCmdWrite(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType, + const adrv904x_LinkId_e linkId, + const adrv904x_CpuCmdId_t cmdId, + adrv904x_CpuCmd_t* const cmd, + const uint32_t payloadSize); + +/** +* \brief Low level helper function used by ADRV904X API to read CPU Command Response +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param device Structure pointer to the ADRV904X data structure containing settings +* \param cpuType Selection of the desired CPU processor to execute this command on. +* \param linkId Selection of the desired Link for the command. +* \param *cmdId To Identify a Command. +* \param cmdRsp Contain command response buffer. +* \param payloadSize Size of expected payload, in bytes +* \param[out] status Status of command response. Optional. Set to NULL if not needed. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuCmdRespRead(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType, + const adrv904x_LinkId_e linkId, + adrv904x_CpuCmdId_t*const cmdId, + adrv904x_CpuCmdResp_t* const cmdRsp, + const uint32_t payloadSize, + adrv904x_CpuCmdStatus_e*const status); + +/** +* \brief Send a command to a given CPU and receive a command response +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param device Structure pointer to the ADRV904X data structure containing settings +* \param cpuType ID of the desired CPU to execute this command on +* \param linkId ID of the desired CPU's link for the command +* \param cmdId ID of the command to send +* \param pCmdPayload Pointer to the data payload to send with this command. Optional. Set to NULL if not needed. +* \param cmdPayloadSize Size of data payload, in bytes. Set to zero if pCmdPayload is set to NULL. +* \param[out] pRespPayload Pointer to buffer in which command response payload should be placed. Optional. Set to NULL if not needed. +* \param respPayloadSz Amount of data to copy into pRespPayload, in bytes. Set to zero if pRespPayload is set to NULL. +* \param[out] status Status of command response. Optional. Set to NULL if not needed. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuCmdSend(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType, + const adrv904x_LinkId_e linkId, + const adrv904x_CpuCmdId_t cmdId, + void* const pCmdPayload, + const size_t cmdPayloadSz, + void* const pRespPayload, + const size_t respPayloadSz, + adrv904x_CpuCmdStatus_e* const status); + +/** +* \brief Get the CPU assigned to a particular channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X data structure containing settings +* \param[in] channel channel number +* \param[in] objId object ID +* \param[out] cpuType CPU assigned to requested channel number +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuChannelMappingGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + const adrv904x_CpuObjectId_e objId, + adi_adrv904x_CpuType_e* const cpuType); + +/** +* \brief Start a capture RAM access (obtain exclusive lock) +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device structure pointer to the ADRV904X data structure containing settings +* \param[in] captureRamType type of capture RAM to lock +* \param[in] channelNumber channel number of capture RAM to lock (one channel, NOT a mask of multiple channels) +* \param[out] success 1 if successfully locked, 0 otherwise +* +* \retval ADI_COMMON_ACT_NO_ACTION if no unexpected failure was encountered (failure other than lock failure). +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuRamAccessStart(adi_adrv904x_Device_t* const device, + const adrv904x_CpuCmd_CaptureRamType_e captureRamType, + const adi_adrv904x_Channels_e channelNumber, + uint8_t* const success); + +/** +* \brief Stop a capture RAM access (release exclusive lock) +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device structure pointer to the ADRV904X data structure containing settings +* \param[in] captureRamType type of capture RAM to unlock +* \param[in] channelNumber channel number of capture RAM to unlock (one channel, NOT a mask of multiple channels) +* \param[out] success 1 if successfully unlocked, 0 otherwise +* +* \retval ADI_COMMON_ACT_NO_ACTION if no unexpected failure was encountered (failure other than unlock failure). +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuRamAccessStop( adi_adrv904x_Device_t* const device, + const adrv904x_CpuCmd_CaptureRamType_e captureRamType, + const adi_adrv904x_Channels_e channelNumber, + uint8_t* const success); + + + + +/** +* \brief Run Cyclic Redundancy Check on the specified block of memory in chunk. +* +* This function was based on the Crc32 function but can be used on chunk of memory block. +* The function can be call multiple times. +* The first call, set seedCrc to 0, finalCrc to 0. +* The return CRC is use as seedCrc for the next call. +* The last call, set finalCrc to 1. +* +* \details CRC32 algorithm, operating on 8-bit words +* +* Parameters: +* \param[in] buf - array of bytes on which CRC is run +* \param[in] bufLen - length of the input array in bytes +* \param[in] seedCrc - Seed for the next block of memory, use 0 for initial seedCrc. +* \param[in] finalCrc - 0: return the CRC use for seedSrc. 1: return the final CRC32. +* +* \retval 32-bit checksum +*/ +ADI_API uint32_t adrv904x_Crc32ForChunk(const uint8_t buf[], + const uint32_t bufLen, + const uint32_t seedCrc, + const uint8_t finalCrc); + +/** +* \brief Reads back private health monitoring status of the CPUs +* +* \pre This function is called after the device is initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] healthMonitorStatus Pointer to memory location where private health monitor CPU status readback data will be written +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_HealthMonitorPrivateCpuStatusGet( adi_adrv904x_Device_t* const device, + adrv904x_HealthMonitorPrivateCpuStatus_t* const healthMonitorStatus); + +/** +* \brief Configures the GPIO signal for both CPUs +* +* \pre This function is called after the device is initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] gpioSelect GPIO selection for the CPU signal +* \param[in] cpuGpioSignal CPU GPIO signal selection +* \param[in] isInput Needs to be set to 1:If selected signal is input to CPU 0:If selected signal is output from CPU +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuGpioSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpioSelect, + const adrv904x_CpuCmd_GpioSignal_e cpuGpioSignal, + const uint8_t isInput); + +/** +* \brief Read the GPIO pin for a given CPU GPIO signal +* +* \pre This function is called after the device is initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] gpioSelect Readback GPIO pin for the given CPU signal +* \param[in] cpuGpioSignal CPU GPIO signal selection +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuGpioGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_GpioPinSel_e * const gpioSelect, + const adrv904x_CpuCmd_GpioSignal_e cpuGpioSignal); + + +/** +* \brief Service to debug cpu after runtime error +* +* \pre This function is called after the cpu has errored +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* +*/ +ADI_API void adrv904x_CpuErrorDebugCheck(adi_adrv904x_Device_t* const device); + +#endif //CLIENT_IGNORE + + + +#endif /* _ADRV904X_CPU_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_archive_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_archive_types.h new file mode 100644 index 00000000000..11c65cde0ea --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_archive_types.h @@ -0,0 +1,49 @@ + /** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + + /** + * \file adrv904x_cpu_archive_types.h + * + * \brief Contains CPU archive type definitions + * + * \details Contains CPU archive type definitions + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_CPU_ARCHIVE_TYPES_H__ +#define __ADRV904X_CPU_ARCHIVE_TYPES_H__ + +#include +#include "adi_adrv904x_platform_pack.h" + +/* Magic number to indicate ADRV904X CPU archive file */ +#define ADRV904X_CPU_ARCHIVE_MAGIC_NUM (0xAD100001U) + +/* CPU archive format revision 1 identifier */ +#define ADRV904X_CPU_ARCHIVE_REV_1 (0x00000001U) + +/* Magic number to indicate ADRV904X CPU archive file */ +#define ADRV904X_DFE_CPU_ARCHIVE_MAGIC_NUM (0xAD100002U) + +/* CPU archive format revision 1 identifier */ +#define ADRV904X_DFE_CPU_ARCHIVE_REV_1 (0x00000001U) + +/** +* \brief Data structure to hold CPU archive header +*/ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuArchiveHeader +{ + uint32_t magicNum; + uint32_t formatRev; + uint32_t xsum; +} adrv904x_CpuArchiveHeader_t;) + +#endif /* __ADRV904X_CPU_ARCHIVE_TYPES_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd.h new file mode 100644 index 00000000000..a37bb4b4854 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd.h @@ -0,0 +1,322 @@ +/** + * \file adrv904x_cpu_cmd.h + * + * \brief Contains device-specific command definitions + * + * \details Contains device-specific command definitions + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_H__ +#define __ADRV904X_CPU_CMD_H__ + +#include "adrv904x_cpu_cmd_intf.h" +#include "adrv904x_cpu_cmd_ping.h" +#include "adrv904x_cpu_cmd_run_init.h" +#include "adrv904x_cpu_cmd_tracking_cals.h" +#include "adrv904x_cpu_cmd_cal_status.h" +#include "adrv904x_cpu_cmd_getset_lofreq.h" +#include "adrv904x_cpu_cmd_getset_nco.h" +#include "adrv904x_cpu_cmd_mcs.h" +#include "adrv904x_cpu_cmd_devtemp.h" +#include "adrv904x_cpu_cmd_ram.h" +#include "adrv904x_cpu_cmd_force_exception.h" +#include "adrv904x_cpu_cmd_getset_config.h" +#include "adrv904x_cpu_cmd_enter_debug_mode.h" +#include "adrv904x_cpu_cmd_bkpt.h" +#include "adrv904x_cpu_cmd_ctrl.h" +#include "adrv904x_cpu_cmd_log.h" +#include "adrv904x_cpu_cmd_debug.h" +#include "adrv904x_cpu_cmd_sys_status.h" +#include "adi_adrv904x_cpu_cmd_dc_offset.h" +#include "adrv904x_cpu_cmd_getset_txatten_phase.h" +#include "adrv904x_cpu_cmd_run_serdes_eye_sweep.h" +#include "adrv904x_cpu_cmd_tx_to_orx_mapping.h" +#include "adrv904x_cpu_cmd_jesd_ser_lane_getset_cfg.h" +#include "adrv904x_cpu_cmd_gpio.h" +#include "adrv904x_cpu_cmd_t.h" +#include "adrv904x_cpu_cmd_efuse.h" +#include "adi_adrv904x_carrier_reconfigure_common_types.h" +#include "adi_adrv904x_cpu_radio_cmd.h" + +/** + * \brief CPU command ID enumeration + */ +typedef enum adrv904x_CpuCmdId +{ + ADRV904X_CPU_CMD_ID_PING = 0x0u, /*!< PING: Ping the CPU */ + + /* Initial calibration commands */ + ADRV904X_CPU_CMD_ID_RUN_INIT = 0x1u, /*!< RUN_INIT: Run initial calibrations */ + ADRV904X_CPU_CMD_ID_RUN_INIT_GET_COMPLETION_STATUS = 0x2u, /*!< RUN_INIT_GET_COMPLETION_STATUS: Get the completion status of initial calibrations */ + ADRV904X_CPU_CMD_ID_RUN_INIT_GET_DETAILED_STATUS = 0x3u, /*!< RUN_INIT_GET_DETAILED_STATUS: Get detailed status information on initial calibrations */ + ADRV904X_CPU_CMD_ID_RUN_INIT_ABORT = 0x4u, /*!< RUN_INIT_ABORT: Abort any in progress initial calibrations */ + + /* Tracking calibration commands */ + ADRV904X_CPU_CMD_ID_SET_ENABLED_TRACKING_CALS = 0x5u, /*!< SET_ENABLED_TRACKING_CALS: Set the set of enabled tracking cals */ + ADRV904X_CPU_CMD_ID_GET_ENABLED_TRACKING_CALS = 0x6u, /*!< GET_ENABLED_TRACKING_CALS: Get the set of enabled tracking cals */ + ADRV904X_CPU_CMD_ID_GET_TRACKING_CAL_STATE = 0x7u, /*!< GET_TRACKING_CAL_STATE: Get detailed state information for all tracking cals */ + + /* Calibration status commands */ + ADRV904X_CPU_CMD_ID_GET_CAL_STATUS = 0x8u, /*!< GET_CAL_STATUS: Get calibration status information */ + + /* System status commands */ + ADRV904X_CPU_CMD_ID_GET_SYS_STATUS = 0x9u, /*!< GET_SYS_STATUS: Get system status information */ + + /* LO frequency commands */ + ADRV904X_CPU_CMD_ID_GET_LO_FREQUENCY = 0xAu, /*!< GET_LO_FREQUENCY: Get Lo Frequency value */ + ADRV904X_CPU_CMD_ID_SET_LO_FREQUENCY = 0xBu, /*!< SET_LO_FREQUENCY: Set Lo Frequency value */ + + /* LO loopfilter commands */ + ADRV904X_CPU_CMD_ID_GET_LOOPFILTER = 0xCu, /*!< GET_LOOPFILTER: Get LO Loopfilter value */ + ADRV904X_CPU_CMD_ID_SET_LOOPFILTER = 0xDu, /*!< SET_LOOPFILTER: Set LO Loopfilter value */ + + /* DC Offset commands */ + ADRV904X_CPU_CMD_ID_GET_DCOFFSET = 0xEu, /*!< GET_DCOFFSET: Get DC Offset parameters */ + ADRV904X_CPU_CMD_ID_SET_DCOFFSET = 0xFu, /*!< SET_DCOFFSET: Set DC Offset parameters */ + + /* Get Rx/TxLO commands */ + ADRV904X_CPU_CMD_ID_GET_RXTXLOFREQ = 0x10u, /*!< GET_RXTXLOFREQ: Get LO value for all of Rx/Tx channels */ + + /* NCO commands */ + ADRV904X_CPU_CMD_ID_SET_RX_NCO = 0x11u, /*!< SET_RX_NCO: Set/Configure the Rx NCO */ + ADRV904X_CPU_CMD_ID_GET_RX_NCO = 0x12u, /*!< GET_RX_NCO: Get configuration from the Rx NCO */ + ADRV904X_CPU_CMD_ID_SET_ORX_NCO = 0x13u, /*!< SET_ORX_NCO: Set/Configure the Rx NCO */ + ADRV904X_CPU_CMD_ID_GET_ORX_NCO = 0x14u, /*!< GET_ORX_NCO: Get configuration from the ORx NCO */ + ADRV904X_CPU_CMD_ID_SET_TX_TEST_NCO = 0x15u, /*!< SET_TX_TEST_NCO: Set/Configure one of two Tx Test NCOs */ + ADRV904X_CPU_CMD_ID_GET_TX_TEST_NCO = 0x16u, /*!< GET_TX_TEST_NCO: Get configuration for one of the two Tx Test NCOs */ + ADRV904X_CPU_CMD_ID_SET_TX_MIX_NCO = 0x17u, /*!< SET_TX_MIXER_NCO: Set/Configure the Tx Mixer NCO */ + ADRV904X_CPU_CMD_ID_GET_TX_MIX_NCO = 0x18u, /*!< GET_TX_MIXER_NCO: Get configuration from the Tx Mixer NCO */ + + /* MCS commands */ + ADRV904X_CPU_CMD_ID_START_MCS = 0x19u, /*!< START_MCS: Start Multichip Sync procedure */ + ADRV904X_CPU_CMD_ID_MCS_COMPLETE = 0x1Au, /*!< MCS_COMPLETE: Notification that MCS is complete */ + + /* Temperature commands */ + ADRV904X_CPU_CMD_ID_GET_DEVICE_TEMPERATURE = 0x1Bu, /*!< GET_DEVICE_TEMPERATURE: Get device temperature information */ + ADRV904X_CPU_CMD_ID_GET_ENABLED_TEMPSENSORS = 0x1Cu, /*!< GET_ENABLED_TEMPSENSORS Get enabled temp sensor */ + ADRV904X_CPU_CMD_ID_SET_ENABLED_TEMPSENSORS = 0x1Du, /*!< SET_ENABLED_TEMPSENSORS Set enabled temp sensor */ + + /* RAM capture commands */ + ADRV904X_CPU_CMD_ID_RAM_ACCESS_START = 0x1Eu, /*!< RAM_ACCESS_START: Lock a capture RAM for exclusive access */ + ADRV904X_CPU_CMD_ID_RAM_ACCESS_STOP = 0x1Fu, /*!< RAM_ACCESS_STOP: Unlock exclusive access to a capture RAM */ + + /* Config commands */ + ADRV904X_CPU_CMD_ID_UNLOCK_CONFIG = 0x20u, /*!< UNLOCK_CONFIG: Unlock the configuration for changing */ + ADRV904X_CPU_CMD_ID_SET_CONFIG = 0x21u, /*!< SET_CONFIG: Set system or calibration configuration */ + ADRV904X_CPU_CMD_ID_GET_CONFIG = 0x22u, /*!< GET_CONFIG: Get system or calibration configuration */ + + /* Ctrl command */ + ADRV904X_CPU_CMD_ID_SET_CTRL = 0x23u, /*!< SET_CTRL: Set system or calibration ctrl */ + + /* Debug commands */ + ADRV904X_CPU_CMD_ID_ENTER_DEBUG_MODE = 0x24u, /*!< ENTER_DEBUG_MODE: Enter debug mode */ + ADRV904X_CPU_CMD_ID_DEBUG = 0x25u, /*!< DEBUG: Generic debug command */ + + /* CPU log commands */ + ADRV904X_CPU_CMD_ID_SET_LOG_FILTERS = 0x26u, /*!< SET_LOG_FILTERS: Set CPU log filters */ + + /* SW Breakpoint commands */ + ADRV904X_CPU_CMD_ID_RESUME_BKPT = 0x27u, /*!< RESUME_BKPT: Resume task(s) suspended due breakpoint */ + ADRV904X_CPU_CMD_ID_SET_BKPT_GPIO = 0x28u, /*!< SET_BKPT_GPIO: Set breakpoint GPIOs */ + + /* Tx Atten Phase commands */ + ADRV904X_CPU_CMD_ID_GET_TX_ATTEN_PHASE = 0x29u, /*!< GET_TX_ATTEN_PHASE: Get Tx Atten Phase array */ + ADRV904X_CPU_CMD_ID_SET_TX_ATTEN_PHASE = 0x2Au, /*!< SET_TX_ATTEN_PHASE: Set Tx Atten Phase array */ + + /* Tx to Orx Mapping Preset commands */ + ADRV904X_CPU_CMD_ID_SET_TX_TO_ORX_PRESET_ATTEN = 0x2Bu, /*!< SET_TX_TO_ORX_PRESET_ATTEN: Set Tx to Orx Mapping Preset values for Orx Atten */ + ADRV904X_CPU_CMD_ID_SET_TX_TO_ORX_PRESET_NCO = 0x2Cu, /*!< SET_TX_TO_ORX_PRESET_NCO: Set Tx to Orx Mapping Preset values for Orx NCO */ + + /* Run SERDES Eye Sweep command */ + ADRV904X_CPU_CMD_ID_RUN_SERDES_EYE_SWEEP = 0x2Du, /*!< RUN_SERDES_EYE_SWEEP: Run SERDES eye sweep */ + + /* JESD Serializer Lane configuration commands */ + ADRV904X_CPU_CMD_ID_JESD_SER_LANE_GET_CFG = 0x2Eu, /*!< JESD_SER_LANE_GET_CFG: Get Serializer Lane configuration */ + ADRV904X_CPU_CMD_ID_JESD_SER_LANE_SET_CFG = 0x2Fu, /*!< JESD_SER_LANE_SET_CFG: Set Serializer Lane configuration */ + + /* Run SERDES Eye Sweep command */ + ADRV904X_CPU_CMD_ID_RUN_SERDES_VERT_EYE_SWEEP = 0x30u, /*!< RUN_SERDES_VERT_EYE_SWEEP: Run SERDES vertical eye sweep */ + + /* GPIO Pin configuration commands */ + ADRV904X_CPU_CMD_ID_SET_GPIO = 0x31u, /*!< SET_GPIO: Set GPIO pin configuration */ + ADRV904X_CPU_CMD_ID_GET_GPIO = 0x32u, /*!< GET_GPIO: Get GPIO pin configuration */ + + /* EFUSE command */ + ADRV904X_CPU_CMD_ID_EFUSE_GET = 0x33u, /*!< EFUSE_GET: Read EFUSE address */ + + /* Tracking calibration V2 commands */ + ADRV904X_CPU_CMD_ID_SET_ENABLED_TRACKING_CALS_V2 = 0x34u, /*!< SET_ENABLED_TRACKING_CALS_V2: Set the set of enabled tracking cals */ + + /* JESD Serializer reset and cal commands */ + ADRV904X_CPU_CMD_ID_JESD_SER_RESET = 0x35u, /*!< JESD_SER_RESET: request pulsed srst reset */ + + /* Set Cals in Fast attack mode */ + ADRV904X_CPU_CMD_ID_ENABLE_FAST_ATTACK = 0x36u, /*!< ENABLE_FAST_ATTACK: Set Cals in Fast attack mode */ + + /* RAM-ECC commands */ + ADRV904X_CPU_CMD_ID_UPDATE_ECC = 0x37u, /*!< Force an ECC update */ + + /* Reprogram PLL */ + ADRV904X_CPU_CMD_ID_REPROGRAM_PLL = 0x38u, /*!< REPROGRAM_PLL: Run PLL Program Sequence */ + + /* NCO commands pt. 2*/ + ADRV904X_CPU_CMD_ID_SET_ORX_NCO_V2 = 0x39u, /*!< SET_RX_NCO: Set/Configure the Rx NCO pt. 2*/ + + ADRV904X_CPU_CMD_ID_SET_ENABLE_ECC_SCRUB = 0x3Au, /*!< SET_ENABLE_ECC; set enable for ECC scrubbing */ + ADRV904X_CPU_CMD_ID_GET_ENABLE_ECC_SCRUB = 0x3Bu, /*!< GET_ENABLE_ECC; get enable state for ECC scrubbing */ + /* Get SERDES Metrics */ + ADRV904X_CPU_CMD_ID_GET_SERDES_FG_METRICS = 0x3Cu, /*!< GET_SERDES_FG_METRICS: Fetch SERDES-in init cal state for debug purposes */ + ADRV904X_CPU_CMD_ID_GET_SERDES_BG_METRICS = 0x3Du, /*!< GET_SERDES_BG_METRICS: Fetch SERDES-in tracking cal state for debug purposes */ + ADRV904X_CPU_CMD_ID_SET_CHAN_TO_PLLS = 0x3Eu, /*!< SET_CHAN_TO_PLLS: Set LO assignemnts during runtime > */ + + ADRV904X_CPU_CMD_ID_JESD_TX_LANE_POWER = 0x3Fu, /*!< Power up or down Serdes lanes */ + + + /* CDUC/CDDC NCO commands (Koror only) */ + ADRV904X_CPU_CMD_ID_SET_RX_CDDC_NCO = 0x40u, /*!< SET_RX_CDDC_NCO: Set/Configure the Rx CDDC NCO */ + ADRV904X_CPU_CMD_ID_GET_RX_CDDC_NCO = 0x41u, /*!< GET_RX_CDDC_NCO: Get configuration from the Rx CDDC NCO */ + + ADRV904X_CPU_CMD_ID_SET_TX_CDUC_NCO = 0x42u, /*!< SET_TX_CDUC_NCO: Set/Configure the Tx CDUC NCO */ + ADRV904X_CPU_CMD_ID_GET_TX_CDUC_NCO = 0x43u, /*!< GET_TX_CDUC_NCO: Get configuration from the Tx CDUC NCO */ + + ADRV904X_CPU_CMD_ID_LOAD_CHANNEL_FILTER_COEFFS = 0x44u, /*!< LOAD_CHANNEL_FILTER_COEFFS: Send a chunk of channel coefficients to load into the global struct */ + ADRV904X_CPU_CMD_ID_LOAD_CHANNEL_FILTER_CFG = 0x45u, /*!< LOAD_CHANNEL_FILTER_COEFFS: Send a chunk of channel coefficients to load into the global struct */ + + ADRV904X_CPU_CMD_ID_RX_CARRIER_RECONFIGURE = 0x46u, /*!< RX_CARRIER_RECONFIGURE: Perform channel filter calculations for carrier reconfigure */ + ADRV904X_CPU_CMD_ID_TX_CARRIER_RECONFIGURE = 0x47u, /*!< TX_CARRIER_RECONFIGURE: Perform channel filter calculations for carrier reconfigure */ + + ADRV904X_CPU_CMD_ID_RADIO_CMD = 0x48u, /*!< RADIO_CMD: from DFE processor */ + + /* MCS reconfig commands */ + ADRV904X_CPU_CMD_ID_START_MCS_CARRIER_RECONFIG = 0x49u, /*!< START_MCS: Start Multichip Sync procedure */ + ADRV904X_CPU_CMD_ID_MCS_CARRIER_RECONFIG_COMPLETE = 0x4Au,/*!< MCS_COMPLETE: Notification that MCS is complete */ + + ADRV904X_CPU_CMD_ID_NUM_CMDS = 0x4Bu /*!< Number of command IDs. Must be last. */ + +} adrv904x_CpuCmdId_e; + +/** + * \brief CPU command payload union. + * Used to determine the maximum command payload size. + * \note Not instantiated. Only for size calculations. + */ +typedef union adrgven6_CpuCmdPayloadMaxSize +{ + adrv904x_CpuCmd_Ping_t pingCmd; + adrv904x_CpuCmd_RunInit_t runInitCmd; + adrv904x_CpuCmd_GetCalStatus_t getCalStatusCmd; + adrv904x_CpuCmd_GetSysStatus_t getSysStatusCmd; + adrv904x_CpuCmd_SetLoFreq_t setLoFreqCmd; + adrv904x_CpuCmd_GetLoFreq_t getLoFreqCmd; + adrv904x_CpuCmd_ChanCtrlToPlls_t setchanCtrlToPllsCmd; + adrv904x_CpuCmd_SetLoopfilter_t setLooopfilterCmd; + adrv904x_CpuCmd_GetLoopfilter_t getLooopfilterCmd; + adi_adrv904x_CpuCmd_SetDcOffset_t setDcOffsetCmd; + adi_adrv904x_CpuCmd_GetDcOffset_t getDcOffsetCmd; + adrv904x_CpuCmd_GetDevTemp_t getDevTempCmd; + adi_adrv904x_RxNcoConfig_t setRxNcoCmd; + adrv904x_RxNcoConfigReadback_t getRxNcoCmd; + adi_adrv904x_ORxNcoConfig_t setOrxNcoCmd; + adrv904x_ORxNcoConfigReadback_t getOrxNcoCmd; + adi_adrv904x_TxNcoMixConfig_t setTxMixNcoCmd; + adrv904x_TxNcoMixConfigReadback_t getTxMixNcoCmd; + adi_adrv904x_TxTestNcoConfig_t setTxTestNcoCmd; + adrv904x_TxTestNcoConfigReadback_t getTxTestNcoCmd; + adrv904x_CpuCmd_RamAccessStart_t ramAccessStartCmd; + adrv904x_CpuCmd_RamAccessStop_t ramAccessStopCmd; + adrv904x_CpuCmd_EnterDebugMode_t enterDebugModeCmd; + adrv904x_CpuCmd_UnlockConfig_t unlockConfigCmd; + adrv904x_CpuCmd_SetConfigMaxSize_t setConfigMaxSize; + adrv904x_CpuCmd_SetCtrlMaxSize_t setCtrlMaxSize; + adrv904x_CpuCmd_DebugMaxSize_t debugMaxSize; + adrv904x_CpuCmd_SetEnabledTrackingCals_t setEnabledTrackingCalsCmd; + adrv904x_CpuCmd_SetTxAttenPhase_t getTxAttenPhase; + adrv904x_CpuCmd_GetTxAttenPhase_t setTxAttenPhase; + adrv904x_CpuCmd_RunEyeSweep_t runEyeSweepCmd; + adrv904x_CpuCmd_SetTxToOrxPresetAtten_t setTxToOrxPresetAttenCmd; + adrv904x_CpuCmd_SetTxToOrxPresetNco_t setTxToOrxPresetNcoCmd; + adrv904x_CpuCmd_GetJesdSerLaneCfg_t getJesdSerLaneCfgCmd; + adrv904x_CpuCmd_SetJesdSerLaneCfg_t setJesdSerLaneCfgCmd; + adrv904x_CpuCmd_SetGpio_t setGpioCmd; + adrv904x_CpuCmd_GetGpio_t getGpioCmd; + adrv904x_CpuCmd_EfuseGet_t efuseGetCmd; + adi_adrv904x_RxCddcNcoConfig_t setRxCddcNcoCmd; + adi_adrv904x_TxCducNcoConfig_t setTxCducNcoCmd; + adi_adrv904x_CpuRadioCmd_t cpuRadioCmd; +} adrgven6_CpuCmdPayloadMaxSize_t; + +/** + * \brief CPU command response payload union. + * Used to determine the maximum command response payload size. + * \note Not instantiated. Only for size calculations. + */ +typedef union adrgven6_CpuCmdRespPayloadMaxSize +{ + adrv904x_CpuCmd_PingResp_t pingCmdResp; + adrv904x_CpuCmd_RunInitResp_t runInitCmdResp; + adrv904x_CpuCmd_RunInitGetCompletionStatusResp_t runInitGetCompletionStatusCmdResp; + adrv904x_CpuCmd_RunInitGetDetailedStatusResp_t runInitGetDetailedStatusCmdResp; + adrv904x_CpuCmd_SetLoFreqResp_t setLoFreqCmdResp; + adrv904x_CpuCmd_GetLoFreqResp_t getLoFreqCmdResp; + adrv904x_CpuCmd_ChanCtrlToPllsResp_t setChanCtrlToPllsResp; + adrv904x_CpuCmd_GetRxTxLoFreqResp_t getRxTxLoCmdResp; + adrv904x_CpuCmd_SetLoopfilter_t setLoopfilterCmdResp; + adrv904x_CpuCmd_GetLoopfilter_t getLoopfilterCmdResp; + adrv904x_CpuCmd_GetDevTempResp_t getDevTempCmdResp; + adrv904x_CpuCmd_GetCalStatusMaxSize_t getCalStatusMaxSize; + adrv904x_CpuCmd_GetSysStatusMaxSize_t getSysStatusMaxSize; + adrv904x_CpuCmd_StartMcsResp_t startMcsCmdResp; + adrv904x_RxNcoConfigResp_t setRxNcoCmdResp; + adi_adrv904x_RxNcoConfigReadbackResp_t getRxNcoCmdResp; + adrv904x_ORxNcoConfigResp_t setOrxNcoCmdResp; + adi_adrv904x_ORxNcoConfigReadbackResp_t getOrxNcoCmdResp; + adrv904x_TxNcoMixConfigResp_t setTxMixNcoCmdResp; + adi_adrv904x_TxNcoMixConfigReadbackResp_t getTxMixNcoCmdResp; + adrv904x_TxTestNcoConfigResp_t setTxTestNcoCmdResp; + adi_adrv904x_TxTestNcoConfigReadbackResp_t getTxTestNcoCmdResp; + adrv904x_CpuCmd_RamAccessStartResp_t ramAccessStartCmdResp; + adrv904x_CpuCmd_RamAccessStopResp_t ramAccessStopCmdResp; + adrv904x_CpuCmd_EnterDebugModeResp_t enterDebugModeResp; + adrv904x_CpuCmd_UnlockConfigResp_t unlockConfigResp; + adrv904x_CpuCmd_GetConfigMaxSize_t getConfigMaxSize; + adrv904x_CpuCmd_SetCtrlRespMaxSize_t setCtrlRespMaxSize; + adrv904x_CpuCmd_DebugRespMaxSize_t debugRespMaxSize; + adrv904x_CpuCmd_SetEnabledTrackingCalsResp_t setEnabledTrackingCalsCmdResp; + adrv904x_CpuCmd_GetTxAttenPhaseResp_t getTxAttenPhaseResp; + adrv904x_CpuCmd_SetTxAttenPhaseResp_t setTxAttenPhaseResp; + adrv904x_CpuCmd_RunEyeSweepResp_t runEyeSweepResp; + adrv904x_CpuCmd_SetTxToOrxPresetAttenResp_t setTxToOrxPresetAttenResp; + adrv904x_CpuCmd_SetTxToOrxPresetNcoResp_t setTxToOrxPresetNcoResp; + adrv904x_CpuCmd_GetJesdSerLaneCfgResp_t getJesdSerLaneCfgResp; + adrv904x_CpuCmd_SetJesdSerLaneCfgResp_t setJesdSerLaneCfgResp; + uint8_t serdesPvtStatuBufSize[SERDES_PVT_BUFFER_SIZE]; + adrv904x_CpuCmd_SetGpioResp_t setGpioResp; + adrv904x_CpuCmd_GetGpioResp_t getGpioResp; + adrv904x_CpuCmd_EfuseGetResp_t efuseGetResp; + adi_adrv904x_RxCddcNcoConfigReadbackResp_t setRxCddcNcoResp; + adi_adrv904x_TxCducNcoConfigReadbackResp_t setTxCducNcoResp; + adi_adrv904x_CpuRadioCmdResp_t cpuRadioCmdResp; +} adrgven6_CpuCmdRespPayloadMaxSize_t; + +/** + * Size of the largest CPU command, including header, in bytes. + */ +#define ADRV904X_CPU_CMD_MAX_SIZE_BYTES (sizeof(adrv904x_CpuCmd_t) + sizeof(adrgven6_CpuCmdPayloadMaxSize_t)) + +/** + * Size of the largest CPU command response, including header, in bytes. + */ +#define ADRV904X_CPU_CMD_RESP_MAX_SIZE_BYTES (sizeof(adrv904x_CpuCmdResp_t) + sizeof(adrgven6_CpuCmdRespPayloadMaxSize_t)) + +#endif /* __ADRV904X_CPU_CMD_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_bkpt.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_bkpt.h new file mode 100644 index 00000000000..4a2adeb1548 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_bkpt.h @@ -0,0 +1,45 @@ +/** + * \file adrv904x_cpu_cmd_bkpt.h + * + * \brief Command definitions for SW breakpoints. + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_BKPT_H__ +#define __ADRV904X_CPU_CMD_BKPT_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adrv904x_cpu_error_codes_types.h" + + +/** + * \brief RESUME_BKTPT command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_ResumeBkpt +{ + uint32_t objectID; + uint8_t chanMask; + uint8_t bResumeAll; +} adrv904x_CpuCmd_ResumeBkpt_t;) + + +/** + * \brief RESUME_BKTPT command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_ResumeBkptResp +{ + adrv904x_CpuErrorCode_e cmdStatus; /*!< Command status */ +} adrv904x_CpuCmd_ResumeBkptResp_t;) + +#endif /* __ADRV904X_CPU_CMD_RESUME_BKPT_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_cal_status.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_cal_status.h new file mode 100644 index 00000000000..f390e4c7d05 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_cal_status.h @@ -0,0 +1,86 @@ +/** + * \file adrv904x_cpu_cmd_cal_status.h + * + * \brief Command definition for ADRV904X_CPU_CMD_ID_GET_CAL_STATUS + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_CAL_STATUS_H__ +#define __ADRV904X_CPU_CMD_CAL_STATUS_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adrv904x_cpu_error_codes_types.h" +#include "adrv904x_cpu_object_ids_types.h" +#include "adi_adrv904x_cals_types.h" + +/** + * \brief Calibration status type enumeration + */ +typedef enum adrv904x_CpuCmd_CalStatusType +{ + ADRV904X_CPU_CMD_CAL_STATUS_COMMON, /*!< Common calibration status */ + ADRV904X_CPU_CMD_CAL_STATUS_SPECIFIC, /*!< Calibration-specific status */ + ADRV904X_CPU_CMD_CAL_STATUS_PRIVATE /*!< Private calibration-specific status */ +} adrv904x_CpuCmd_CalStatusType_e; +typedef uint8_t adrv904x_CpuCmd_CalStatusType_t; + + +/** + * \brief GET_CAL_STATUS command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_GetCalStatus +{ + adrv904x_CpuCmd_CalStatusType_t type; /*!< Calibration status type to be retrieved */ + adrv904x_CpuObjectId_t calObjId; /*!< Object ID of calibration */ + uint32_t channelNum; /*!< Channel number (0 for channel 1, 1 for channel 2, etc.) */ +} adrv904x_CpuCmd_GetCalStatus_t;) + + +/** + * \brief GET_CAL_STATUS command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_GetCalStatusResp +{ + adrv904x_CpuErrorCode_e cmdStatus; /*!< Command status */ + + /* Cal status payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * void* calStatus[]; + */ +} adrv904x_CpuCmd_GetCalStatusResp_t;) + + +/** + * \brief Calibration status payload union. + * Used to determine the maximum cal status payload size. + * \note Not instantiated. Only for size calculations. + */ +typedef union adrgven6_CalStatusMaxSize +{ + adi_adrv904x_CalStatus_t calStatus; +} adrgven6_CalStatusMaxSize_t; + + +/** + * \brief Status payload size struct. + * Used to determine the maximum cal status payload size. + * \note Not instantiated. Only for size calculations. + */ +typedef struct adrv904x_CpuCmd_GetCalStatusMaxSize +{ + adrv904x_CpuCmd_GetCalStatusResp_t getCalStatusCmdResp; + adrgven6_CalStatusMaxSize_t calStatusMaxSize; +} adrv904x_CpuCmd_GetCalStatusMaxSize_t; + +#endif /* __ADRV904X_CPU_CMD_CAL_STATUS_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_ctrl.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_ctrl.h new file mode 100644 index 00000000000..fa75b82f057 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_ctrl.h @@ -0,0 +1,134 @@ +/** + * \file adrv904x_cpu_cmd_cal_ctrl.h + * + * \brief Command definition for ADRV904X_CPU_CMD_ID_SET_CTRL + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_CTRL_H__ +#define __ADRV904X_CPU_CMD_CTRL_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adrv904x_cpu_error_codes_types.h" +#include "adrv904x_cpu_object_ids_types.h" +#include "adi_adrv904x_cals_types.h" + +/** + * \brief Maximum ctrl payload size + */ +#define MAX_CTRL_DATA_SIZE (256u) + +/** + * \brief Maximum ctrl response size + */ +#define MAX_CTRL_RESP_SIZE (256u) + +#ifndef CLIENT_IGNORE +/** + * \brief SET_CTRL command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetCtrl +{ + adrv904x_CpuObjectId_t objId; /*!< Object ID of the cal or system component */ + uint16_t ctrlCmd; /*!< Command to be executed */ + uint32_t channelNum; /*!< Channel number (0 for channel 1, 1 for channel 2, etc.) */ + uint16_t length; /*!< Length of the control data in bytes */ + + /* Control data payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * uint8_t ctrlData[]; + */ +} adrv904x_CpuCmd_SetCtrl_t;) + + +/** + * \brief SET_CTRL command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetCtrlResp +{ + adrv904x_CpuErrorCode_e cmdStatus; /*!< Command status */ + uint16_t length; /*!< Length of the control command response in bytes */ + + /* Control data response payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * uint8_t ctrlResp[]; + */ +} adrv904x_CpuCmd_SetCtrlResp_t;) + +/** + * \brief Ctrl payload size struct. + * Used to determine the maximum ctrl payload size. + * \note Not instantiated. Only for size calculations. + */ +typedef struct adrv904x_CpuCmd_SetCtrlMaxSize +{ + adrv904x_CpuCmd_SetCtrl_t setCtrlCmd; + uint8_t ctrlData[MAX_CTRL_DATA_SIZE]; /*!< Ctrl data */ +} adrv904x_CpuCmd_SetCtrlMaxSize_t; + +/** + * \brief Ctrl payload size struct. + * Used to determine the maximum ctrl payload size. + * \note Not instantiated. Only for size calculations. + */ +typedef struct adrv904x_CpuCmd_SetCtrlRespMaxSize +{ + adrv904x_CpuCmd_SetCtrlResp_t setCtrlCmdResp; + uint8_t ctrlResp[MAX_CTRL_RESP_SIZE]; /*!< Ctrl response */ +} adrv904x_CpuCmd_SetCtrlRespMaxSize_t; + +/** + * \brief ADC cal control commands + * \note Not instantiated. + */ +typedef enum adrv904x_CpuCmd_AdcCtrlCmd +{ + ADC_CTRL_GET_SW_VERSION = 0u, + ADC_CTRL_INIT = 1u, + ADC_CTRL_SET_FSM_CMD = 2u, + ADC_CTRL_GET_FSM_STATE = 3u, + ADC_CTRL_GET_DATA_SIZES = 4u, + ADC_CTRL_GET_DATA_ADDRS = 5u, + ADC_CTRL_RUN_CMD = 6u, + ADC_CTRL_CMD_INVALID = 7u +} adrv904x_CpuCmd_AdcCtrlCmd_e; + +typedef enum adrv904x_CpuCmd_AdcCtrlFsmCmd +{ + ADC_FSM_CMD_IDLE_CAL = 0u, + ADC_FSM_CMD_INIT_CAL = 1u, + ADC_FSM_CMD_RUN_FG_CAL = 2u, + ADC_FSM_CMD_RUN_BG_CAL = 3u, + ADC_FSM_CMD_FREEZE_CAL = 4u, + ADC_FSM_CMD_ABORT_CAL = 5u, + ADC_FSM_CMD_WARM_BOOT_CAL = 6u +} adrv904x_CpuCmd_AdcCtrlFsmCmd_e; +#endif /* CLIENT_IGNORE */ + +/** + * \brief ADC cal get channel object data sizes and addresses + * + * \note + */ +typedef struct adrv904x_CpuCmd_GetAdcSizeAddrs +{ + uint32_t obj; + uint32_t init; + uint32_t config; + uint32_t calObj; + uint32_t calState; + uint32_t calData; +} adrv904x_CpuCmd_GetAdcSizeAddrs_t; + +#endif /* __ADRV904X_CPU_CMD_CTRL_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_debug.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_debug.h new file mode 100644 index 00000000000..69b0bdeb052 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_debug.h @@ -0,0 +1,91 @@ +/** + * \file adrv904x_cpu_cmd_debug.h + * + * \brief Command definition for ADRV904X_CPU_CMD_ID_DEBUG + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2020 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_DEBUG_H__ +#define __ADRV904X_CPU_CMD_DEBUG_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adrv904x_cpu_error_codes_types.h" +#include "adrv904x_cpu_object_ids_types.h" +#include "adrv904x_cpu_debug_types.h" + +/** + * \brief Maximum debug payload size + */ +#define MAX_DEBUG_DATA_SIZE (256u) + +/** + * \brief Maximum debug response size + */ +#define MAX_DEBUG_RESP_SIZE (256u) + +/** + * \brief DEBUG command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_Debug +{ + adrv904x_CpuObjectId_t objId; /*!< Object ID of the cal or system component */ + uint16_t debugCmd; /*!< Command to be executed */ + uint32_t channelNum; /*!< Channel number (0 for channel 1, 1 for channel 2, etc.) */ + uint16_t length; /*!< Length of the debug data payload in bytes */ + + /* Debug data payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * uint8_t dbgData[]; + */ +} adrv904x_CpuCmd_Debug_t;) + + +/** + * \brief DEBUG command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_DebugResp +{ + adrv904x_CpuErrorCode_e cmdStatus; /*!< Command status */ + uint16_t length; /*!< Length of the response data in bytes */ + + /* Debug data response payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * uint8_t respData[]; + */ +} adrv904x_CpuCmd_DebugResp_t;) + +/** + * \brief Debug payload size struct. + * Used to determine the maximum debug payload size. + * \note Not instantiated. Only for size calculations. + */ +typedef struct adrv904x_CpuCmd_DebugMaxSize +{ + adrv904x_CpuCmd_Debug_t setDebugCmd; + uint8_t debugData[MAX_DEBUG_DATA_SIZE]; /*!< Debug data */ +} adrv904x_CpuCmd_DebugMaxSize_t; + +/** + * \brief Debug payload size struct. + * Used to determine the maximum debug payload size. + * \note Not instantiated. Only for size calculations. + */ +typedef struct adrv904x_CpuCmd_DebugRespMaxSize +{ + adrv904x_CpuCmd_DebugResp_t setDebugCmdResp; + uint8_t debugResp[MAX_DEBUG_RESP_SIZE]; /*!< Debug response */ +} adrv904x_CpuCmd_DebugRespMaxSize_t; + + +#endif /* __ADRV904X_CPU_CMD_DEBUG_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_devtemp.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_devtemp.h new file mode 100644 index 00000000000..c601992e0a6 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_devtemp.h @@ -0,0 +1,83 @@ +/** + * \file adrv904x_cpu_cmd_devtemp.h + * + * \brief Command definition for ADRV904X_CPU_CMD_ID_GET_DEVICE_TEMPERATURE, + * ADRV904X_CPU_CMD_ID_GET_ENABLED_TEMPSENSORS, + * ADRV904X_CPU_CMD_ID_SET_ENABLED_TEMPSENSORS + * + * \details Command definition for ADRV904X_CPU_CMD_ID_GET_DEVICE_TEMPERATURE, + * ADRV904X_CPU_CMD_ID_GET_ENABLED_TEMPSENSORS, + * ADRV904X_CPU_CMD_ID_SET_ENABLED_TEMPSENSORS + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_DEVTEMP_H__ +#define __ADRV904X_CPU_CMD_DEVTEMP_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_dev_temp_types.h" +#include "adrv904x_cpu_error_codes_types.h" + +/** + * \brief ADRV904X_CPU_CMD_ID_GET_DEVICE_TEMPERATURE command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_GetDevTemp +{ + uint16_t avgMask; /*!< Bitmask of adi_adrv904x_DevTempSensorMask_e values indicating + which temperature sensor readings should be averaged. See + definition of adi_adrv904x_DevTempData_t. */ +} adrv904x_CpuCmd_GetDevTemp_t;) + +/** + * \brief ADRV904X_CPU_CMD_ID_GET_DEVICE_TEMPERATURE command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_GetDevTempResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ + adi_adrv904x_DevTempData_t tempData; /*!< Temperature data returned by CPU */ +} adrv904x_CpuCmd_GetDevTempResp_t;) + +/** + * \brief ADRV904X_CPU_CMD_ID_GET_ENABLED_TEMPSENSORS command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_GetDevTempSnsEnResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ + uint16_t tempEnData; /*!< Bitmask of adi_adrv904x_DevTempSensorMask_e values indicating + Temperature sensor enable bitfield returned by CPU */ +} adrv904x_CpuCmd_GetDevTempSnsEnResp_t;) + +/** + * \brief ADRV904X_CPU_CMD_ID_GET_DEVICE_TEMPERATURE command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetDevTempSnsEn +{ + uint16_t tempEnData; /*!< Bitmask of adi_adrv904x_DevTempSensorMask_e values indicating + which temperature sensors to enable/disable. */ +} adrv904x_CpuCmd_SetDevTempSnsEn_t;) + +/** + * \brief ADRV904X_CPU_CMD_ID_SET_ENABLED_TEMPSENSORS command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetDevTempSnsEnResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ + uint16_t tempEnData; /*!< Bitmask of adi_adrv904x_DevTempSensorMask_e values indicating + which temperature sensors are actually enabled/disabled. */ +} adrv904x_CpuCmd_SetDevTempSnsEnResp_t;) + +#endif /* __ADRV904X_CPU_CMD_DEVTEMP_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_efuse.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_efuse.h new file mode 100644 index 00000000000..4bc91d9bd41 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_efuse.h @@ -0,0 +1,44 @@ +/** + * \file adrv904x_cpu_cmd_efuse.h + * + * \brief Command definition for ADRV904X_CPU_CMD_ID_EFUSE_GET + * + * \details Command definition for ADRV904X_CPU_CMD_ID_EFUSE_GET + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2020 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_EFUSE_H__ +#define __ADRV904X_CPU_CMD_EFUSE_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adrv904x_cpu_error_codes_types.h" + +/** + * \brief EFUSE get command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_EfuseGet +{ + uint32_t addr; /*!< Address to read from */ +} adrv904x_CpuCmd_EfuseGet_t;) + +/** + * \brief EFUSE get command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_EfuseGetResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ + uint32_t value; /*!< data read from EFUSE address */ +} adrv904x_CpuCmd_EfuseGetResp_t;) + +#endif /* __ADRV904X_CPU_CMD_EFUSE_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_enter_debug_mode.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_enter_debug_mode.h new file mode 100644 index 00000000000..253900565eb --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_enter_debug_mode.h @@ -0,0 +1,44 @@ +/** + * \file adrv904x_cpu_cmd_enter_debug_mode.h + * + * \brief Command definition for ADRV904X_CPU_CMD_ID_ENTER_DEBUG_MODE + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_ENTER_DEBUG_MODE_H__ +#define __ADRV904X_CPU_CMD_ENTER_DEBUG_MODE_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adrv904x_cpu_error_codes_types.h" + + +/** + * \brief ENTER_DEBUG_MODE command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_EnterDebugMode +{ + uint32_t debugModeKey; +} adrv904x_CpuCmd_EnterDebugMode_t;) + + +/** + * \brief ENTER_DEBUG_MODE command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_EnterDebugModeResp +{ + adrv904x_CpuErrorCode_e cmdStatus; /*!< Command status */ +} adrv904x_CpuCmd_EnterDebugModeResp_t;) + + +#endif /* __ADRV904X_CPU_CMD_ENTER_DEBUG_MODE_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_fast_attack.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_fast_attack.h new file mode 100644 index 00000000000..916e6a2b45e --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_fast_attack.h @@ -0,0 +1,49 @@ +/** + * \file adrv904x_cpu_cmd_fast_attack.h + * + * \brief Command definition for ADRV904X_CPU_CMD_FAST_ATTACK + * + * \details Command definition for ADRV904X_CPU_CMD_FAST_ATTACK + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_FAST_ATTACK_H__ +#define __ADRV904X_CPU_CMD_FAST_ATTACK_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_cpu_error_codes_types.h" + +#define ADRV904X_RX_ADC_FAST_ATTACK_STATUS_IDX (11u) +#define ADRV904X_ORX_ADC_FAST_ATTACK_STATUS_IDX (6u) +#define ADRV904X_TXLB_ADC_FAST_ATTACK_STATUS_IDX (6u) + +/** + * \brief Fast Attack command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_EnFastAttack +{ + uint32_t calMask; /*!< Cals to be set in Fast Attack mode */ +} adrv904x_CpuCmd_EnFastAttack_t;) + +/** + * \brief ast Attack command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_EnFastAttackResp +{ + adi_adrv904x_CpuErrorCode_t status; /*!< CPU error status code */ + uint32_t failedCalMask; /*!< Cals failed to be set in Fast Attack mode */ +} adrv904x_CpuCmd_EnFastAttackResp_t;) + +#endif /* __ADRV904X_CPU_CMD_FAST_ATTACK__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_force_exception.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_force_exception.h new file mode 100644 index 00000000000..d3d19a8209f --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_force_exception.h @@ -0,0 +1,54 @@ +/** + * \file adrv904x_cpu_cmd_force_exception.h + * + * \brief Command definition for ADRV904X_CPU_CMD_ID_FORCE_EXCEPTION + * + * \details Command definition for ADRV904X_CPU_CMD_ID_FORCE_EXCEPTION + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information see the + * "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_FORCE_EXCEPTION_H__ +#define __ADRV904X_CPU_CMD_FORCE_EXCEPTION_H__ + +#include "adi_adrv904x_platform_pack.h" + +/** + * NOTE: Unlike other commands, the force exception command will be indicated by + * the hardware mailbox opcode value, which is used as the link id for other + * commands. + */ + + +/** \var Force exception opcode/link id */ +typedef uint8_t adrv904x_MailboxOpcodes_t; + +/** + * \brief Force exception opcode/link id enumeration + */ +typedef enum adrv904x_MailboxOpcodes +{ + ADRV904X_MAILBOX_FORCE_EXCEPTION = 0x3FU /*!< 0x3F - Force exception */ +} adrv904x_MailboxOpcodes_e; + + +/* Type and enumeration for CPU exception status */ +typedef uint32_t adrv904x_CpuExceptionFlag_t; + +typedef enum adrv904x_CpuExceptionFlag +{ + ADRV904X_CPU_NO_EXCEPTION = 0u, /*!< 0x00000000 - CPU running normally */ + ADRV904X_CPU_EXCEPTION_ENTERED = 0x11111111u, /*!< 0x11111111 - Exception handler entered, no snapshot data */ + ADRV904X_CPU_EXCEPTION_COMPLETED = 0x33333333u /*!< 0x33333333 - Exception handler complete, valid snapshot data */ +} adrv904x_CpuExceptionFlag_e; + +#endif /* __ADRV904X_CPU_CMD_FORCE_EXCEPTION_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_getset_config.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_getset_config.h new file mode 100644 index 00000000000..543f42d4616 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_getset_config.h @@ -0,0 +1,145 @@ +/** + * \file adrv904x_cpu_cmd_config.h + * + * \brief Command definition for ADRV904X_CPU_CMD_ID_SET_CONFIG + * and ADRV904X_CPU_CMD_ID_GET_CONFIG + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_CONFIG_H__ +#define __ADRV904X_CPU_CMD_CONFIG_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adrv904x_cpu_error_codes_types.h" +#include "adrv904x_cpu_object_ids_types.h" + +#ifndef ADI_ADRV904X_FW +#include "adi_adrv904x_user.h" +#endif + +/** + * \brief Maximum configuration payload size + */ +#define MAX_CONFIG_DATA_SIZE (256u) + + +/** + * \brief UNLOCK_CONFIG command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_UnlockConfig +{ + uint32_t configKey; +} adrv904x_CpuCmd_UnlockConfig_t;) + + +/** + * \brief UNLOCK_CONFIG command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_UnlockConfigResp +{ + adrv904x_CpuErrorCode_e cmdStatus; /*!< Command status */ +} adrv904x_CpuCmd_UnlockConfigResp_t;) + + +/** + * \brief SET_CONFIG command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetConfig +{ + adrv904x_CpuObjectId_t objId; /*!< Object ID of calibration or system component */ + uint16_t offset; /*!< Offset into the configuration structure */ + uint16_t length; /*!< Length of the configuration in bytes */ + + /* Config data payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * uint8_t configData[]; + */ +} adrv904x_CpuCmd_SetConfig_t;) + + +/** + * \brief SET_CONFIG command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetConfigResp +{ + adrv904x_CpuErrorCode_e cmdStatus; /*!< Command status */ +} adrv904x_CpuCmd_SetConfigResp_t;) + + +/** + * \brief GET_CONFIG command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_GetConfig +{ + adrv904x_CpuObjectId_t objId; /*!< Object ID of calibration or system component */ + uint16_t offset; /*!< Offset into the configuration structure */ + uint16_t length; /*!< Length of the configuration in bytes */ +} adrv904x_CpuCmd_GetConfig_t;) + + +/** + * \brief GET_CONFIG command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_GetConfigResp +{ + adrv904x_CpuErrorCode_e cmdStatus; /*!< Command status */ + + /* Config data payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * uint8_t configData[]; + */ +} adrv904x_CpuCmd_GetConfigResp_t;) + + +/** + * \brief Configuration payload size struct. + * Used to determine the maximum configuration payload size. + * \note Not instantiated. Only for size calculations. + */ +typedef struct adrv904x_CpuCmd_SetConfigMaxSize +{ + adrv904x_CpuCmd_SetConfig_t setConfigCmd; + uint8_t configData[MAX_CONFIG_DATA_SIZE]; /*!< Configuration data */ +} adrv904x_CpuCmd_SetConfigMaxSize_t; + +#ifndef ADI_ADRV904X_FW + +/** + * \brief DFE Configuration payload size struct. + * Used to determine the maximum configuration payload size for DFE. + * \note Not instantiated. Only for size calculations. + */ +typedef struct adrv904x_CpuCmd_SetDfeConfigMaxSize +{ + adrv904x_CpuCmd_SetConfig_t setConfigCmd; + uint8_t configData[MAX_DFE_CONFIG_DATA_SIZE]; /*!< DFE Configuration data */ +} adrv904x_CpuCmd_SetDfeConfigMaxSize_t; +#endif + +/** + * \brief Configuration payload size struct. + * Used to determine the maximum configuration payload size. + * \note Not instantiated. Only for size calculations. + */ +typedef struct adrv904x_CpuCmd_GetConfigMaxSize +{ + adrv904x_CpuCmd_GetConfigResp_t getConfigCmdResp; + uint8_t configData[MAX_CONFIG_DATA_SIZE]; /*!< Configuration data */ +} adrv904x_CpuCmd_GetConfigMaxSize_t; + +#endif /* __ADRV904X_CPU_CMD_CONFIG_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_getset_lofreq.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_getset_lofreq.h new file mode 100644 index 00000000000..135684790ed --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_getset_lofreq.h @@ -0,0 +1,172 @@ +/** + * \file adrv904x_cpu_cmd_getset_lofreq.h + * + * \brief Command definition for ADRV904X_CPU_CMD_ID_GET_LOFREQ, + * ADRV904X_CPU_CMD_ID_SET_LOFREQ, ADRV904X_CPU_CMD_ID_GET_LOOPFILTER, + * ADRV904X_CPU_CMD_ID_SET_LOOPFILTER and ADRV904X_CPU_CMD_ID_GET_RXTXLOFREQ + * + * \details Command definition for ADRV904X_CPU_CMD_ID_GET_LOFREQ, + * ADRV904X_CPU_CMD_ID_SET_LOFREQ, ADRV904X_CPU_CMD_ID_GET_LOOPFILTER, + * ADRV904X_CPU_CMD_ID_SET_LOOPFILTER and ADRV904X_CPU_CMD_ID_GET_RXTXLOFREQ + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_GETSET_LOFREQ_H__ +#define __ADRV904X_CPU_CMD_GETSET_LOFREQ_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_lo_types.h" +#include "adrv904x_cpu_error_codes_types.h" +#include "adrv904x_cpu_device_profile_types.h" + +typedef uint8_t adi_adrv904x_LoName_t; /* associates with adi_adrv904x_LoName_e */ +typedef uint32_t adi_adrv904x_LoOption_t; /* associates with adi_adrv904x_LoOption_e */ +typedef uint32_t adi_adrv904x_LoMcsOption_t; /* associates with adi_adrv904x_LoMcsOption_e */ + +/* + * \brief lofreq set command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetLoFreq +{ + adi_adrv904x_LoName_t loName; /*!< Select the target RF LO source */ + uint64_t loFrequency_Hz; /*!< Desired RF LO frequency in Hz */ + adi_adrv904x_LoOption_t loConfigSel; /*!< Select for LO config */ + adi_adrv904x_LoMcsOption_t loMcsType; /*!< Select the type of MCS for RF PLL. For Debug */ + uint8_t disableBleedCal; /*!< Disable bleed ramp cal (1) */ + uint8_t enablePfdOverride; /*!< Enable PFD override (1) */ + uint32_t pfdSetting; /*!< PFD override value when enablePfdOverride is set*/ +} adrv904x_CpuCmd_SetLoFreq_t;) + +/** + * \brief lofreq set command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetLoFreqResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ +} adrv904x_CpuCmd_SetLoFreqResp_t;) + +/** + * \brief lofreq get command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_GetLoFreq +{ + adi_adrv904x_LoName_t loName; /*!< Select the target RF LO source to read back */ +} adrv904x_CpuCmd_GetLoFreq_t;) + +/** + * \brief lofreq set command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_GetLoFreqResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ + uint64_t loFrequency_Hz; /*!< RF LO frequency in Hz */ +} adrv904x_CpuCmd_GetLoFreqResp_t;) + + +/** + * \brief loopfilter set command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetLoopfilter +{ + adi_adrv904x_LoName_t loName; /*!< Select the target RF LO source */ + uint32_t phaseMargin; /*!< Phase margin in degrees */ + uint32_t loopBandwidth; /*!< Loop bandwidth in hz*/ +} adrv904x_CpuCmd_SetLoopfilter_t;) + +/** + * \brief loopfilter set command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetLoopfilterResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ +} adrv904x_CpuCmd_SetLoopfilterResp_t;) + +/** + * \brief loopfilter get command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_GetLoopfilter +{ + adi_adrv904x_LoName_t loName; /*!< Select the target RF LO source to read back */ +} adrv904x_CpuCmd_GetLoopfilter_t;) + +/** + * \brief loopfilter set command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_GetLoopfilterResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ + uint32_t phaseMargin; /*!< Phase margin in degrees */ + uint32_t loopBandwidth; /*!< Loop bandwidth in hz*/ +} adrv904x_CpuCmd_GetLoopfilterResp_t;) + +/** + * \brief loopfilter RX/TX LO command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_GetRxTxLoFreqResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ + adi_adrv904x_LoName_t rxLoName[ADRV904X_RX_CHAN_LEN]; /*!< PLL number of Rx Channels */ + uint32_t rxFreq[ADRV904X_RX_CHAN_LEN]; /*!< Freq of Rx Channels */ + adi_adrv904x_LoName_t txLoName[ADRV904X_TX_CHAN_LEN]; /*!< PLL number of Tx Channels */ + uint32_t txFreq[ADRV904X_TX_CHAN_LEN]; /*!< Freq of Tx Channels */ +} adrv904x_CpuCmd_GetRxTxLoFreqResp_t;) + +/** + * \brief Data structure to hold the Channel Controls to the PLL's. + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_ChanCtrlToPlls +{ + uint8_t rf0MuxTx0_3; /* If set to 1 East Tx channels (Tx0-3) are connected to PLL0 (East PLL). If set to 0 Tx0-3 are connected to PLL1 (West PLL). */ + uint8_t rf0MuxTx4_7; /* If set to 1 West Tx channels (Tx4-7) are connected to PLL0 (East PLL). If set to 0 Tx4-7 are connected to PLL1 (West PLL). */ + uint8_t rf0MuxRx0_3; /* If set to 1 East Rx channels (Rx0-3) are connected to PLL0 (East PLL). If set to 0 Rx0-3 are connected to PLL1 (West PLL). */ + uint8_t rf0MuxRx4_7; /* If set to 1 West Rx channels (Rx4-7) are connected to PLL0 (East PLL). If set to 0 Rx4-7 are connected to PLL1 (West PLL). */ +} adrv904x_CpuCmd_ChanCtrlToPlls_t;) + +/** + * \brief Data structure to hold the Channel Controls to the PLL's. + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_ChanCtrlToPllsResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ +} adrv904x_CpuCmd_ChanCtrlToPllsResp_t;) + +/** + * \brief Reprogram PLL command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_ReprogramPll +{ + uint8_t pllSel; /*!< PLL to be Reprogrammed according to adi_adrv904x_Pll_e */ +} adrv904x_CpuCmd_ReprogramPll_t;) + +/** + * \brief Reprogram PLL command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_ReprogramPllResp +{ + adi_adrv904x_CpuErrorCode_t status; /*!< CPU error status code */ +} adrv904x_CpuCmd_ReprogramPllResp_t;) + +#endif /* __ADRV904X_CPU_CMD_GETSET_LOFREQ_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_getset_nco.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_getset_nco.h new file mode 100644 index 00000000000..6ad17f04c77 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_getset_nco.h @@ -0,0 +1,174 @@ +/** + * \file adrv904x_cpu_cmd_getset_nco.h + * + * \brief Command definition for: + * ADRV904X_CPU_CMD_ID_GET_RX_NCO, + * ADRV904X_CPU_CMD_ID_SET_RX_NCO, + * ADRV904X_CPU_CMD_ID_GET_ORX_NCO, + * ADRV904X_CPU_CMD_ID_SET_ORX_NCO, + * ADRV904X_CPU_CMD_ID_GET_TX_MIX_NCO, + * ADRV904X_CPU_CMD_ID_SET_TX_MIX_NCO, + * ADRV904X_CPU_CMD_ID_GET_TX_TEST_NCO, + * ADRV904X_CPU_CMD_ID_SET_TX_TEST_NCO + * + * \details Command definition for: + * ADRV904X_CPU_CMD_ID_GET_RX_NCO, + * ADRV904X_CPU_CMD_ID_SET_RX_NCO, + * ADRV904X_CPU_CMD_ID_GET_ORX_NCO, + * ADRV904X_CPU_CMD_ID_SET_ORX_NCO, + * ADRV904X_CPU_CMD_ID_GET_TX_MIX_NCO, + * ADRV904X_CPU_CMD_ID_SET_TX_MIX_NCO, + * ADRV904X_CPU_CMD_ID_GET_TX_TEST_NCO, + * ADRV904X_CPU_CMD_ID_SET_TX_TEST_NCO + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_GETSET_NCO_H__ +#define __ADRV904X_CPU_CMD_GETSET_NCO_H__ + +#include "adi_adrv904x_rx_nco.h" +#include "adi_adrv904x_tx_nco.h" +#include "adrv904x_cpu_error_codes_types.h" + +/* SET_RX_NCO command structure is defined in adi_adrv904x_rx_nco.h */ + +/** + * \brief SET_RX_NCO command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_RxNcoConfigResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ + uint8_t chanSelect; /*!< Channel mask of channels set */ +} adrv904x_RxNcoConfigResp_t;) + +/** + * \brief GET_RX_NCO command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_RxNcoConfigReadback +{ + uint8_t chanSelect; /*!< Rx channel (bit mapped) */ + adi_adrv904x_DdcNumber_t bandSelect; /*!< which band */ +} adrv904x_RxNcoConfigReadback_t;) + +/* GET_RX_NCO command response structure is defined in adi_adrv904x_rx_nco.h */ + +/* SET_ORX_NCO command structure is defined in adi_adrv904x_rx_nco.h */ + +/** + * \brief SET_ORX_NCO command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_ORxNcoConfigResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ + uint8_t chanSelect; /*!< Rx channel (bit mapped) */ +} adrv904x_ORxNcoConfigResp_t;) + +/** + * \brief GET_ORX_NCO command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_ORxNcoConfigReadback +{ + uint8_t chanSelect; /*!< Select ORx channel (bit mapped) */ + uint8_t ncoSelect; /*!< Select ORx NCO, 0 = DDC, 1 = datapath */ +} adrv904x_ORxNcoConfigReadback_t;) + +/* GET_ORX_NCO command response structure is defined in adi_adrv904x_rx_nco.h */ + +/* SET_TX_MIX_NCO command structure is defined in adi_adrv904x_tx_nco.h */ + +/** + * \brief SET_TX_MIX_NCO command response structure + */ +ADI_ADRV904X_PACK_START +typedef struct adrv904x_TxNcoMixConfigResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ + uint8_t chanSelect; /*!< Tx channel (bit mapped) */ + + uint8_t bandSelect; /*!< Select Tx band number */ +} adrv904x_TxNcoMixConfigResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief GET_TX_MIX_NCO command structure + */ +ADI_ADRV904X_PACK_START +typedef struct adrv904x_TxNcoMixConfigReadback +{ + uint8_t chanSelect; /*!< Select the Tx channel (bit mapped) to get (only one channel at a time) */ + + uint8_t bandSelect; /*!< Select Tx band number */ +} adrv904x_TxNcoMixConfigReadback_t; +ADI_ADRV904X_PACK_FINISH + +/* GET_TX_MIX_NCO command response structure is defined in adi_adrv904x_tx_nco.h */ + +/* SET_TX_TEST_NCO command structure is defined in adi_adrv904x_tx_nco.h */ + +/** + * \brief SET_TX_TEST_NCO command response structure + */ +ADI_ADRV904X_PACK_START +typedef struct adrv904x_TxTestNcoConfigResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ + uint8_t chanSelect; /*!< Tx channel (bit mapped) */ + + uint8_t bandSelect; /*!< Select Tx band number */ +} adrv904x_TxTestNcoConfigResp_t; +ADI_ADRV904X_PACK_FINISH + + +/** + * \brief GET_TX_TEST_NCO command structure + */ +ADI_ADRV904X_PACK_START +typedef struct adrv904x_TxTestNcoConfigReadback +{ + uint8_t chanSelect; /*!< Select Tx channel (bit mapped) */ + + uint8_t bandSelect; /*!< Select Tx band number */ + adi_adrv904x_TxTestNcoSelect_t ncoSelect; /*!< 0 or 1 */ +} adrv904x_TxTestNcoConfigReadback_t; +ADI_ADRV904X_PACK_FINISH + +/* GET_TX_TEST_NCO command response structure is defined in adi_adrv904x_tx_nco.h */ + + +/** + * \brief SET_TX_CDUC_NCO command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_TxNcoCducConfigResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ + uint8_t chanSelect; /*!< Tx channel (bit mapped) */ + uint8_t carrierSelect; /*!< Select Tx carrier (bit mapped) */ +} adrv904x_TxNcoCducConfigResp_t;) + +/** + * \brief SET_RX_CDDC_NCO command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_RxNcoCddcConfigResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ + uint8_t chanSelect; /*!< Rx channel (bit mapped) */ + uint8_t carrierSelect; /*!< Select Rx carrier (bit mapped) */ +} adrv904x_RxNcoCddcConfigResp_t;) + +#endif /* __ADRV904X_CPU_CMD_GETSET_NCO_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_getset_txatten_phase.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_getset_txatten_phase.h new file mode 100644 index 00000000000..6a29e7f67fa --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_getset_txatten_phase.h @@ -0,0 +1,67 @@ +/** + * \file adrv904x_cpu_cmd_getset_txatten_phase.h + * + * \brief Command definition for ADRV904X_CPU_CMD_ID_GET_TXATTEN_PHASE, + * + * \details Command definition for ADRV904X_CPU_CMD_ID_SET_TXATTEN_PHASE, + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_GETSET_TXATTEN_PHASE_H__ +#define __ADRV904X_CPU_CMD_GETSET_TXATTEN_PHASE_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adrv904x_cpu_error_codes_types.h" +#include "adrv904x_cpu_device_profile_types.h" +#include "adi_adrv904x_tx_nco.h" + +/** + * \brief tx atten phase set command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetTxAttenPhase +{ + uint8_t chanSelect; /*!< Tx channel (bit mapped) */ + int16_t txAttenPhase[ADI_ADRV904X_TX_ATTEN_PHASE_SIZE]; /*!< Tx atten phase values */ +} adrv904x_CpuCmd_SetTxAttenPhase_t;) + +/** + * \brief tx atten phase set command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetTxAttenPhaseResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ +} adrv904x_CpuCmd_SetTxAttenPhaseResp_t;) + +/** + * \brief tx atten phase get command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_GetTxAttenPhase +{ + uint8_t chanSelect; /*!< Tx channel (bit mapped) */ +} adrv904x_CpuCmd_GetTxAttenPhase_t;) + +/** + * \brief tx atten phase get command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_GetTxAttenPhaseResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ + int16_t txAttenPhase[ADI_ADRV904X_TX_ATTEN_PHASE_SIZE]; /*!< Tx atten phase values */ +} adrv904x_CpuCmd_GetTxAttenPhaseResp_t;) + + + +#endif /* __ADRV904X_CPU_CMD_GETSET_TXATTEN_PHASE_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_gpio.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_gpio.h new file mode 100644 index 00000000000..06d16991599 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_gpio.h @@ -0,0 +1,99 @@ +/** + * \file adrv904x_cpu_cmd_gpio.h + * + * \brief Command definitions for GPIO. + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_GPIO_H__ +#define __ADRV904X_CPU_CMD_GPIO_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_cpu_error_codes_types.h" + +/** + * \brief ARM controlled GPIO pin control enumeration + */ +typedef enum adrv904x_CpuCmd_GpioPinCtrl +{ + ADRV904X_CPU_CMD_GPIO_PIN_DISABLE, /*!< Disable pin for a given signal */ + ADRV904X_CPU_CMD_GPIO_PIN_ENABLE, /*!< Enable pin for a signal */ +} adrv904x_CpuCmd_GpioPinCtrl_e; + +typedef uint8_t adrv904x_CpuCmd_GpioPinCtrl_t; + +/** + * \brief ARM controlled GPIO signal enumeration + */ +typedef enum adrv904x_CpuCmd_GpioSignal +{ + ADRV904X_CPU_CMD_GPIO_SIGNAL_SWBKPT_BKPT_HIT, /*!< SW breakpoint was hit signal */ + ADRV904X_CPU_CMD_GPIO_SIGNAL_SWBKPT_RESUME_FROM_BKPT, /*!< Resume from SW breakpoint signal */ +} adrv904x_CpuCmd_GpioSignal_e; + +typedef uint8_t adrv904x_CpuCmd_GpioSignal_t; + +/** + * \brief ARM controlled GPIO pin polarity enumeration + */ +typedef enum adrv904x_CpuCmd_GpioPinPolarity +{ + ADRV904X_CPU_CMD_GPIO_PIN_POLARITY_NORMAL, /*!< Normal pin polarity */ + ADRV904X_CPU_CMD_GPIO_PIN_POLARITY_INVERTED, /*!< Inverted pin polarity */ +} adrv904x_CpuCmd_GpioPinPolarity_e; + +typedef uint8_t adrv904x_CpuCmd_GpioPinPolarity_t; + +/** + * \brief SET_GPIO command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetGpio +{ + adrv904x_CpuCmd_GpioSignal_t signal; + uint8_t pin; + adrv904x_CpuCmd_GpioPinPolarity_t polarity; + adrv904x_CpuCmd_GpioPinCtrl_t enable; +} adrv904x_CpuCmd_SetGpio_t;) + +/** + * \brief SET_GPIO command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetGpioResp +{ + adrv904x_CpuErrorCode_e cmdStatus; /*!< Command status */ +} adrv904x_CpuCmd_SetGpioResp_t;) + +/** + * \brief GET_GPIO command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_GetGpio +{ + adrv904x_CpuCmd_GpioSignal_t signal; +} adrv904x_CpuCmd_GetGpio_t;) + + +/** + * \brief GET_GPIO command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_GetGpioResp +{ + uint8_t pin; + adrv904x_CpuCmd_GpioPinPolarity_t polarity; + adrv904x_CpuErrorCode_e cmdStatus; /*!< Command status */ +} adrv904x_CpuCmd_GetGpioResp_t;) + + +#endif /* __ADRV904X_CPU_CMD_GPIO_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_intf.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_intf.h new file mode 100644 index 00000000000..a4c2591a0ae --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_intf.h @@ -0,0 +1,79 @@ +/** + * \file adrv904x_cpu_cmd_interface.h + * + * \brief Contains device command interface definition + * + * \details Contains device command interface definition + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_INTF_H__ +#define __ADRV904X_CPU_CMD_INTF_H__ + +#include +#include "adi_adrv904x_platform_pack.h" +#include "adrv904x_platform_byte_order.h" + +/** \var CPU command ID type */ +typedef uint16_t adrv904x_CpuCmdId_t; + +/** \var CPU command transaction ID type */ +typedef uint16_t adrv904x_CpuCmdTransactionId_t; + +/** \var CPU command status type */ +typedef uint16_t adrv904x_CpuCmdStatus_t; + +/** + * \brief CPU command status enumeration + */ +typedef enum adrv904x_CpuCmdStatus +{ + ADRV904X_CPU_CMD_STATUS_NO_ERROR, /*!< No error */ + ADRV904X_CPU_CMD_STATUS_GENERIC, /*!< Unspecified/unknown error */ + ADRV904X_CPU_CMD_STATUS_LINK_ERROR, /*!< Link (lower level) error */ + ADRV904X_CPU_CMD_STATUS_UNEXPECTED_TRANSACTION_ID, /*!< Unexpected/invalid transaction ID received */ + ADRV904X_CPU_CMD_STATUS_CMD_FAILED, /*!< Command-specific failure. See command-specific response for details. */ + ADRV904X_CPU_CMD_STATUS_CMD_ID_INVALID /*!< Invalid command ID */ +} adrv904x_CpuCmdStatus_e; + +/** +* \brief Common CPU command structure +*/ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd +{ + adrv904x_CpuCmdId_t cmdId; /*!< Command ID. Value is from adrv904x_CpuCmdId_e enumeration. */ + adrv904x_CpuCmdTransactionId_t tId; /*!< Transaction ID. Unique ID for a command/response pair. */ + + /* Command payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * void* payload[]; + */ +} adrv904x_CpuCmd_t;) + +/** +* \brief Common CPU command response structure +*/ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmdResp +{ + adrv904x_CpuCmdId_t cmdId; /*!< Command ID. Value is from adrv904x_CpuCmdId_e enumeration. */ + adrv904x_CpuCmdTransactionId_t tId; /*!< Transaction ID. Unique ID for a command/response pair. */ + adrv904x_CpuCmdStatus_t status; /*!< Command status. Value is from adrv904x_CpuCmdStatus_e enumeration. */ + + /* Command response payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * void* payload[]; + */ +} adrv904x_CpuCmdResp_t;) + +#endif /* __ADRV904X_CPU_CMD_INTF_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_jesd_ser_lane_getset_cfg.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_jesd_ser_lane_getset_cfg.h new file mode 100644 index 00000000000..686fd9fbce5 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_jesd_ser_lane_getset_cfg.h @@ -0,0 +1,72 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adrv904x_cpu_cmd_jesd_ser_lane_getset_cfg.h + * + * \brief Contains ADRV904X JESD Serializer lane data structures. + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADI_ADRV904X_CPU_CMD_JESD_SER_LANE_GETSET_CFG_H__ +#define __ADI_ADRV904X_CPU_CMD_JESD_SER_LANE_GETSET_CFG_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adrv904x_cpu_error_codes_types.h" + +/** + * \brief Serializer lane get configuration command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_GetJesdSerLaneCfg +{ + uint8_t lane; /*!< Serializer lane number */ +} adrv904x_CpuCmd_GetJesdSerLaneCfg_t;) + + +/** + * \brief Serializer lane get configuration response command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_GetJesdSerLaneCfgResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ + uint8_t lane; /*!< Serializer lane number */ + uint8_t outputDriveSwing; /*!< Serializer Lane output swing level */ + uint8_t preEmphasis; /*!< Serializer Lane pre-emphasis */ + uint8_t postEmphasis; /*!< Serializer Lane post-emphasis */ +} adrv904x_CpuCmd_GetJesdSerLaneCfgResp_t;) + + +/** + * \brief Serializer lane set configuration command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetJesdSerLaneCfg +{ + uint8_t lane; /*!< Serializer lane number */ + uint8_t outputDriveSwing; /*!< Serializer Lane output swing level */ + uint8_t preEmphasis; /*!< Serializer Lane pre-emphasis */ + uint8_t postEmphasis; /*!< Serializer Lane post-emphasis */ +} adrv904x_CpuCmd_SetJesdSerLaneCfg_t;) + + +/** + * \brief Serializer lane set configuration response command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetJesdSerLaneCfgResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ +} adrv904x_CpuCmd_SetJesdSerLaneCfgResp_t;) + + + +#endif /* __ADI_ADRV904X_CPU_CMD_JESD_SER_LANE_GETSET_CFG_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_log.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_log.h new file mode 100644 index 00000000000..044b19bc804 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_log.h @@ -0,0 +1,36 @@ +/** + * \file adrv904x_cpu_cmd_log.h + * + * \brief Command definition for ADRV904X_CPU_CMD_ID_SET_LOG_FILTERS + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_LOG_H__ +#define __ADRV904X_CPU_CMD_LOG_H__ + +#include "adi_adrv904x_cpu_log_types.h" +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_cpu_error_codes_types.h" + + +/** + * \brief SET_LOG_FILTERS command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetLogFilters +{ + adi_adrv904x_CpuLogEvent_t logEventFilter; + adi_adrv904x_CpuLogCpuId_t cpuIdFilter; + adi_adrv904x_CpuLogObjIdFilter_t objIdFilter; +} adrv904x_CpuCmd_SetLogFilters_t;) + +#endif /* __ADRV904X_CPU_CMD_LOG_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_mcs.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_mcs.h new file mode 100644 index 00000000000..93324b7d9f8 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_mcs.h @@ -0,0 +1,45 @@ +/** + * \file adrv904x_cpu_cmd_mcs.h + * + * \brief Command definition for ADRV904X_CPU_CMD_ID_START_MCS, + * ADRV904X_CPU_CMD_ID_MCS_COMPLETE + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_MCS_H__ +#define __ADRV904X_CPU_CMD_MCS_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adrv904x_cpu_error_codes_types.h" + +/* START_MCS command has no payload */ +/** + * \brief START_MCS command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_StartMcsResp +{ + adrv904x_CpuErrorCode_e status; /*!< Error status code. CPU_NO_ERROR if MCS successfully started. */ +} adrv904x_CpuCmd_StartMcsResp_t;) + +/* MCS_COMPLETE command has no payload */ +/* MCS_COMPLETE command response structure */ +/** + * \brief MCS_COMPLETEcommand response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_McsCompleteResp +{ + adrv904x_CpuErrorCode_e status; /*!< Error status code. CPU_NO_ERROR if MCS successfully started. */ +} adrv904x_CpuCmd_McsCompleteResp_t;) + +#endif /* __ADRV904X_CPU_CMD_MCS_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_ping.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_ping.h new file mode 100644 index 00000000000..f0d142e1984 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_ping.h @@ -0,0 +1,44 @@ +/** + * \file adrv904x_cpu_cmd_ping.h + * + * \brief Command definition for ADRV904X_CPU_CMD_ID_PING + * + * \details Command definition for ADRV904X_CPU_CMD_ID_PING + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_PING_H__ +#define __ADRV904X_CPU_CMD_PING_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adrv904x_cpu_error_codes_types.h" + +/** + * \brief PING command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_Ping +{ + uint32_t echoData; /*!< Data to be echoed back by CPU */ +} adrv904x_CpuCmd_Ping_t;) + +/** + * \brief PING command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_PingResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ + uint32_t echoData; /*!< Echoed data from CPU */ +} adrv904x_CpuCmd_PingResp_t;) + +#endif /* __ADRV904X_CPU_CMD_PING_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_radio.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_radio.h new file mode 100644 index 00000000000..add1b7e215f --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_radio.h @@ -0,0 +1,129 @@ +/** + * \file adrv904x_cpu_cmd_radio.h + * + * \brief Command definition for ADRV904X_CPU_CMD_ID_RADIO + * + * \details Command definition for ADRV904X_CPU_CMD_ID_RADIO + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2022 - 2022 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_RADIO_H__ +#define __ADRV904X_CPU_CMD_RADIO_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adrv904x_cpu_error_codes_types.h" + +/** + * \brief Enum of radio subcommands + */ +typedef enum adrv904x_CpuCmd_RadioSubcommand +{ + ADI_ADRV904X_RADIO_PING = 0, /*!< Radio ping command */ + ADI_ADRV904X_RADIO_TXLOL_SET_PARAMS, /*!< Radio TxLOL set correction parameters */ + ADI_ADRV904X_RADIO_TXLOL_GET_PARAMS, /*!< Radio TxLOL get correction parameters */ + ADI_ADRV904X_RADIO_TXLOL_SET_UPDATE_ENABLE, /*!< Radio TxLOL set enable */ + ADI_ADRV904X_RADIO_TXLOL_GET_UPDATE_ENABLE, /*!< Radio TxLOL set enable */ +} adrv904x_CpuCmd_RadioSubcommand_e; + +/** + * \brief Radio TxLOL parameters set command structure + */ +ADI_ADRV904X_PACK_START +typedef struct adrv904x_CpuCmd_RadioTxLolParamsSet +{ + uint8_t txChan; /*!< Tx channel (0 - 7) */ + uint8_t hpAtten; /*!< Tx attenuation (1 - 64, 0xFF) */ + int16_t offsetI; /*!< I correction parameter */ + int16_t offsetQ; /*!< Q correction parameter */ +} adrv904x_CpuCmd_RadioTxLolParamsSet_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Radio TxLOL parameters get command structure + */ +ADI_ADRV904X_PACK_START +typedef struct adrv904x_CpuCmd_RadioTxLolParamsGet +{ + uint8_t txChan; /*!< Tx channel (0 - 7) */ + uint8_t hpAtten; /*!< Tx attenuation (1 - 64) */ +} adrv904x_CpuCmd_RadioTxLolParamsGet_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Radio TxLOL parameters set command response structure + */ +ADI_ADRV904X_PACK_START +typedef struct adrv904x_CpuCmd_RadioTxLolParamsSetResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ +} adrv904x_CpuCmd_RadioTxLolParamsSetResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Radio TxLOL parameters get command response structure + */ +ADI_ADRV904X_PACK_START +typedef struct adrv904x_CpuCmd_RadioTxLolParamsGetResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ + uint8_t txChan; /*!< Tx channel (0 - 7) */ + uint8_t hpAtten; /*!< Tx attenuation (1 - 64) */ + int16_t offsetI; /*!< I correction parameter */ + int16_t offsetQ; /*!< Q correction parameter */ +} adrv904x_CpuCmd_RadioTxLolParamsGetResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Radio TxLOL update enable set command structure + */ +ADI_ADRV904X_PACK_START +typedef struct adrv904x_CpuCmd_RadioTxLolUpdateEnableSet +{ + uint8_t txChan; /*!< Tx channel (0 - 7) */ + uint8_t enable ; /*!< enable corrections updates */ +} adrv904x_CpuCmd_RadioTxLolUpdateEnableSet_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Radio TxLOL update enable set command response structure + */ +ADI_ADRV904X_PACK_START +typedef struct adrv904x_CpuCmd_RadioTxLolUpdateEnableSetResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ +} adrv904x_CpuCmd_RadioTxLolUpdateEnableSetResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Radio TxLOL update enable get command structure + */ +ADI_ADRV904X_PACK_START +typedef struct adrv904x_CpuCmd_RadioTxLolUpdateEnableGet +{ + uint8_t txChan; /*!< Tx channel (0 - 7) */ +} adrv904x_CpuCmd_RadioTxLolUpdateEnableGet_t; +ADI_ADRV904X_PACK_FINISH + + +/** + * \brief Radio TxLOL update enable get command response structure + */ +ADI_ADRV904X_PACK_START +typedef struct adrv904x_CpuCmd_RadioTxLolUpdateEnableGetResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ + uint8_t txChan; /*!< Tx channel (0 - 7) */ + uint8_t enable; /*!< enable updates flag */ +} adrv904x_CpuCmd_RadioTxLolUpdateEnableGetResp_t; +ADI_ADRV904X_PACK_FINISH + +#endif /* __ADRV904X_CPU_CMD_RADIO_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_ram.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_ram.h new file mode 100644 index 00000000000..4e5f500446d --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_ram.h @@ -0,0 +1,75 @@ +/** + * \file adrv904x_cpu_cmd_ram.h + * + * \brief Command definition for ADRV904X_CPU_CMD_ID_RAM_ACCESS_START, + * ADRV904X_CPU_CMD_ID_RAM_ACCESS_STOP + * + * \details Command definition for ADRV904X_CPU_CMD_ID_RAM_ACCESS_START, + * ADRV904X_CPU_CMD_ID_RAM_ACCESS_STOP + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_RAM_H__ +#define __ADRV904X_CPU_CMD_RAM_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adrv904x_cpu_error_codes_types.h" + +/** + * \brief Capture RAM type enumeration + */ +typedef enum adrv904x_CpuCmd_CaptureRamType +{ + ADRV904X_CPU_CMD_CAP_RAM_TYPE_DPD, /*!< DPD capture RAM */ + ADRV904X_CPU_CMD_CAP_RAM_TYPE_ORX /*!< ORx capture RAM */ +} adrv904x_CpuCmd_CaptureRamType_e; +typedef uint8_t adrv904x_CpuCmd_CaptureRamType_t; + +/** + * \brief RAM_ACCESS_START command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_RamAccessStart +{ + adrv904x_CpuCmd_CaptureRamType_t captureRamType; /*!< Type of the capture RAM to lock */ + uint32_t channelNumber; /*!< Channel number of the capture RAM to lock */ +} adrv904x_CpuCmd_RamAccessStart_t;) + +/** + * \brief RAM_ACCESS_START command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_RamAccessStartResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ +} adrv904x_CpuCmd_RamAccessStartResp_t;) + +/** + * \brief RAM_ACCESS_STOP command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_RamAccessStop +{ + adrv904x_CpuCmd_CaptureRamType_t captureRamType; /*!< Type of the capture RAM to unlock */ + uint32_t channelNumber; /*!< Channel number of the capture RAM to unlock */ +} adrv904x_CpuCmd_RamAccessStop_t;) + +/** + * \brief RAM_ACCESS_STOP command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_RamAccessStopResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ +} adrv904x_CpuCmd_RamAccessStopResp_t;) + +#endif /* __ADRV904X_CPU_CMD_RAM_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_run_init.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_run_init.h new file mode 100644 index 00000000000..69ebef73705 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_run_init.h @@ -0,0 +1,66 @@ +/** + * \file adrv904x_cpu_cmd_run_init.h + * + * \brief Command definition for ADRV904X_CPU_CMD_ID_RUN_INIT, + * ADRV904X_CPU_CMD_ID_RUN_INIT_GET_COMPLETION_STATUS, + * ADRV904X_CPU_CMD_ID_RUN_INIT_GET_DETAILED_STATUS, + * ADRV904X_CPU_CMD_ID_RUN_INIT_ABORT + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_RUN_INIT_H__ +#define __ADRV904X_CPU_CMD_RUN_INIT_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_cals_types.h" +#include "adrv904x_cpu_error_codes_types.h" +#include "adrv904x_cpu_object_ids_types.h" + +/** + * \brief RUN_INIT command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_RunInit +{ + adi_adrv904x_InitCals_t config; /*!< Initial calibrations configuration structure */ +} adrv904x_CpuCmd_RunInit_t;) + +/** + * \brief RUN_INIT command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_RunInitResp +{ + adrv904x_CpuErrorCode_e status; /*!< Error status code. CPU_NO_ERROR if initial calibration was successfully started. */ +} adrv904x_CpuCmd_RunInitResp_t;) + +/** + * \brief RUN_INIT_GET_COMPLETION_STATUS command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_RunInitGetCompletionStatusResp +{ + uint8_t inProgress; /*!< Init cal progress flag. Will be set to 1 if an initial calibration run is currently in progress. Set to 0 otherwise. */ + uint8_t success; /*!< Init cal success/failure status. Set to 1 if all cals completed successfully. Set to 0 otherwise. Only valid when + inProgress equals 0. Issue ADRV904X_CPU_CMD_ID_RUN_INIT_GET_DETAILED_STATUS for detailed error info. */ +} adrv904x_CpuCmd_RunInitGetCompletionStatusResp_t;) + +/** + * \brief RUN_INIT_GET_DETAILED_STATUS command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_RunInitGetDetailedStatusResp +{ + adi_adrv904x_InitCalStatus_t status; /*!< Structure containing init cal detailed status */ +} adrv904x_CpuCmd_RunInitGetDetailedStatusResp_t;) + +#endif /* __ADRV904X_CPU_CMD_RUN_INIT_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_run_serdes_eye_sweep.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_run_serdes_eye_sweep.h new file mode 100644 index 00000000000..48646246c14 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_run_serdes_eye_sweep.h @@ -0,0 +1,188 @@ +/** + * \file adrv904x_cpu_cmd_run_serdes_eye_sweep.h + * + * \brief Command definition for ADRV904X_CPU_CMD_ID_RUN_SERDES_EYE_SWEEP + * + * \details Command definition for ADRV904X_CPU_CMD_ID_RUN_SERDES_EYE_SWEEP + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_RUN_SERDES_EYE_SWEEP_H__ +#define __ADRV904X_CPU_CMD_RUN_SERDES_EYE_SWEEP_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_cpu_cmd_run_serdes_eye_sweep.h" +#include "adrv904x_cpu_error_codes_types.h" + +typedef uint8_t adrv904x_CpuCmd_DeserializerLane_t; +typedef uint8_t adrv904x_CpuCmd_PrbsPattern_t; + +/** + * \brief Serdes FSM State + */ +typedef enum adrv904x_Serdes_FsmState +{ + ADRV904X_SERDES_TEST_CMD_RUN = 14u, /*!< test cmd running. */ + ADRV904X_SERDES_TEST_CMD_DONE = 15u, /*!< test cmd complete. */ +} adrv904x_Serdes_FsmState_e; + +/** + * \brief Serdes FSM Command Enumerations + */ +typedef enum adrv904x_Serdes_FsmCmd +{ + ADRV904X_SERDES_TEST_CMD = 7u, /*!< Serdes test commands */ + /*!< Not used */ +} adrv904x_Serdes_FsmCmd_e; + +/** + * \brief Serdes Calibration Command Enumerations + */ +typedef enum adrv904x_Serdes_CalCmd +{ + ADRV904X_SERDES_TEST_HORIZ_EYE_SWEEP = 12u, /*!< Horizontal Eye Sweep */ + ADRV904X_SERDES_TEST_VERT_EYE_SWEEP = 13u, /*!< Vertical Eye Sweep */ + ADRV904X_SERDES_TEST_SET_PHY_REG = 24u, /*!< Set PHY Register */ + ADRV904X_SERDES_TEST_SET_VCM_SWC = 27u, /*!< Set the VCM SwC config */ +} adrv904x_Serdes_CalCmd_e; + +/** + * \brief Serdes Control Commands Enumerations + */ +typedef enum adrv904x_Serdes_CtrlCmd +{ + ADRV904X_SERDES_CTRL_CMD_INVALID = 0u, /*!< Invalid Control Command */ + ADRV904X_SERDES_CTRL_CMD_OK = 1u, + ADRV904X_SERDES_CTRL_RUN = 2u, /*!< Call phylib run */ + ADRV904X_SERDES_CTRL_SET_FSM_CMD = 3u, /*!< call phylib fsm */ + ADRV904X_SERDES_CTRL_GET_FSM_STATE = 4u, /*!< call phylib fsm */ +} adrv904x_Serdes_CtrlCmd_e; + +/** + * Size of the Serdes Horizontal Eye Sweep Control Command + */ +#define ADRV904X_SERDES_HORIZ_EYE_SWEEP_CMD_SIZE_BYTES 16U +/** + * Size of the Serdes Vertical Eye Sweep Control Command + */ +#define ADRV904X_SERDES_VERT_EYE_SWEEP_CMD_SIZE_BYTES 6U +/** + * Size of the Serdes FSM response command header + */ +#define ADRV904X_SERDES_CTRL_FSM_CMD_RSP_HDR_SIZE_BYTES 4U + +/** + * \brief RUN_SERDES_EYE_SWEEP command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_RunEyeSweep +{ + adrv904x_CpuCmd_DeserializerLane_t lane; /*!< Deserializer lane number */ + adrv904x_CpuCmd_PrbsPattern_t prbsPattern; /*!< PRBS pattern */ + uint8_t forceUsingOuter; /*!< Flag indicating 'outer' should be used for phase detection + 0 (default) - do not use outer for phase detection, + 1 - - use outer for phase detection */ + uint32_t prbsCheckDuration_ms; /*!< Duration of PRBS check in [ms] */ +} adrv904x_CpuCmd_RunEyeSweep_t;) + +/** + * \brief RUN_SERDES_EYE_SWEEP command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_RunEyeSweepResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ + int8_t spoLeft; /*!< SPO Left value */ + int8_t spoRight; /*!< SPO Right value */ +} adrv904x_CpuCmd_RunEyeSweepResp_t;) + +/** + * \brief RUN_SERDES_VERT_EYE_SWEEP command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_RunVertEyeSweep +{ + adrv904x_CpuCmd_DeserializerLane_t lane; /*!< Deserializer lane number */ + } adrv904x_CpuCmd_RunVertEyeSweep_t;) + +/** + * \brief RUN_SERDES_VERT_EYE_SWEEP command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_RunVertiEyeSweepResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ + int8_t eyeHeightsAtSpo[512]; /* Store the upper and lower eye height for 16 SPOs. Only elements 0-65 are populated. */ +} adrv904x_CpuCmd_RunVertEyeSweepResp_t;) + +/** + * \brief RUN_SERDES_VERT_EYE_SWEEP command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_RunPerCompEyeSweep +{ + uint8_t lane; + uint8_t slice; /* the slice number of the comparator of which the eye is measured */ + uint8_t flash; /* the flash number of the comparator of which the eye is measured*/ + uint8_t stopMeasEyeHeightThresh; /* + * When the measured eye height is + * below this value, we stop moving + * spo and measuring the eye height. + */ + } adrv904x_CpuCmd_RunPerCompEyeSweep_t;) + +/** + * \brief RUN_SERDES_VERT_EYE_SWEEP command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_JtxLanePower +{ + uint8_t jtxLaneMask; /*!< Bitfield indicating the lanes to affected by the cmd. If bitN is not set then lane N power status is not changed. */ + uint8_t jtxLanePower; /*!< If corresponding bit in laneMask is set then if bitN is set/unset lane N is to be powered up/down. Bit 0 is the least-significant bit.*/ +} adrv904x_CpuCmd_JtxLanePower_t;) + +/** + * \brief RUN_SERDES_VERT_EYE_SWEEP command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_PerCompEyeSweepResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ + int8_t perEyeHeightsAtSpo[512]; +} adrv904x_CpuCmd_PerCompEyeSweepResp_t;) + +/** + * \brief GET_SERDES_FG_METRICS, GET_SERDES_BG_METRICS command structure. + * + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SerdesCalStatusGet +{ + uint8_t lane; /*!< Serdes lane id */ +} adrv904x_CpuCmd_SerdesCalStatusGet_t;) +ADI_ADRV904X_PACKED( +typedef struct adrv904x_SerdesInitCalStatusCmdResp +{ + adi_adrv904x_SerdesInitCalStatus_t details; /*!< Serdes init cal status details */ + uint32_t cpuErrorCode; /*!< Cmd success/fail */ +} adrv904x_SerdesInitCalStatusCmdResp_t;) + +ADI_ADRV904X_PACKED( +typedef struct adrv904x_SerdesTrackingCalStatusCmdResp +{ + adi_adrv904x_SerdesTrackingCalStatus_t details; /*!< Serdes tracking cal status details */ + uint32_t cpuErrorCode; /*!< Cmd success/fail */ +} adrv904x_SerdesTrackingCalStatusCmdResp_t;) + + +#endif /* __ADRV904X_CPU_CMD_RUN_SERDES_EYE_SWEEP_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_ser_reset.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_ser_reset.h new file mode 100644 index 00000000000..a21960b0afa --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_ser_reset.h @@ -0,0 +1,45 @@ +/** + * \file adi_adrv904x_cpu_cmd_ser_reset.h + * + * \brief Command definition for ADI_ADRV904X_CPU_CMD_ID_SER_RESET + * + * \details Command definition for ADI_ADRV904X_CPU_CMD_ID_SER_RESET + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2021 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADI_ADRV904X_CPU_CMD_SER_RESET_H__ +#define __ADI_ADRV904X_CPU_CMD_SER_RESET_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adrv904x_cpu_error_codes_types.h" + +/** + * \brief SER_RESET command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SerReset +{ + uint32_t serResetParm; /*!< Serializer reset parameter */ +} adrv904x_CpuCmd_SerReset_t;) + +/** + * \brief SER_RESET command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SerResetResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ + uint32_t serResetResults; /*!< Ser Reset results CPU */ +} adrv904x_CpuCmd_SerResetResp_t;) + +#endif /* __ADI_ADRV904X_CPU_CMD_SER_RESET_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_sys_status.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_sys_status.h new file mode 100644 index 00000000000..b1108db1fd5 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_sys_status.h @@ -0,0 +1,81 @@ +/** + * \file adrv904x_cpu_cmd_sys_status.h + * + * \brief Command definition for ADRV904X_CPU_CMD_ID_GET_SYS_STATUS + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2020 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_SYS_STATUS_H__ +#define __ADRV904X_CPU_CMD_SYS_STATUS_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adrv904x_cpu_error_codes_types.h" +#include "adrv904x_cpu_object_ids_types.h" + +/** + * \brief System status type enumeration + */ +typedef enum adrv904x_CpuCmd_SysStatusType +{ + ADRV904X_CPU_CMD_SYS_STATUS_PUBLIC, /*!< Public System status */ + ADRV904X_CPU_CMD_SYS_STATUS_PRIVATE /*!< Private System status */ +} adrv904x_CpuCmd_SysStatusType_e; +typedef uint8_t adrv904x_CpuCmd_SysStatusType_t; + + +/** + * \brief GET_SYS_STATUS command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_GetSysStatus +{ + adrv904x_CpuCmd_SysStatusType_t type; /*!< System status type to be retrieved */ + adrv904x_CpuObjectId_t sysObjId; /*!< Object ID of system component */ + uint32_t channelNum; /*!< Channel number (0 for channel 1, 1 for channel 2, etc.) */ +} adrv904x_CpuCmd_GetSysStatus_t;) + + +/** + * \brief GET_SYS_STATUS command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_GetSysStatusResp +{ + adi_adrv904x_CpuErrorCode_t cmdStatus; /*!< Command status */ + /* System status payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * void* sysStatus[]; + */ +} adrv904x_CpuCmd_GetSysStatusResp_t;) + +/** + * \brief System status payload union. + * Used to determine the maximum system status payload size. + * \note Not instantiated. Only for size calculations. + */ +typedef union adrgven6_SysStatusMaxSize +{ + uint8_t sysStatusMax[256]; /*!< Sys response */ +} adrgven6_SysStatusMaxSize_t; + +/** + * \brief Status payload size struct. + * Used to determine the maximum cal status payload size. + * \note Not instantiated. Only for size calculations. + */ +typedef struct adrv904x_CpuCmd_GetSysStatusMaxSize +{ + adrv904x_CpuCmd_GetSysStatusResp_t getSysStatusCmdResp; + adrgven6_SysStatusMaxSize_t sysStatusMaxSize; +} adrv904x_CpuCmd_GetSysStatusMaxSize_t; + +#endif /* __ADRV904X_CPU_CMD_SYS_STATUS_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_t.h new file mode 100644 index 00000000000..d69c3161e1a --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_t.h @@ -0,0 +1,25 @@ +/** + * \file adrv904x_cpu_cmd_t.h + * + * \brief Contains device-specific command definitions + * + * \details Contains device-specific command definitions + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_T_H__ +#define __ADRV904X_CPU_CMD_T_H__ + +#define SERDES_PVT_BUFFER_SIZE (1000u) + +#endif /* __ADRV904X_CPU_CMD_T_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_tracking_cals.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_tracking_cals.h new file mode 100644 index 00000000000..fc1adcf7023 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_tracking_cals.h @@ -0,0 +1,87 @@ +/** + * \file adrv904x_cpu_cmd_tracking_cals.h + * + * \brief Command definition for: ADRV904X_CPU_CMD_ID_SET_ENABLED_TRACKING_CALS, + * ADRV904X_CPU_CMD_ID_GET_ENABLED_TRACKING_CALS, + * ADRV904X_CPU_CMD_ID_GET_TRACKING_CAL_STATE + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_TRACKING_CALS_H__ +#define __ADRV904X_CPU_CMD_TRACKING_CALS_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_cals_types.h" +#include "adrv904x_cpu_error_codes_types.h" +#include "adrv904x_cpu_object_ids_types.h" + +typedef uint8_t adrv904x_TrackingCalEnableDisable_t; + +/** + * \brief SET_ENABLED_TRACKING_CALS command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetEnabledTrackingCals +{ + adi_adrv904x_TrackingCalibrationMask_t calMask; + uint32_t channelMask; + adrv904x_TrackingCalEnableDisable_t enableDisable; +} adrv904x_CpuCmd_SetEnabledTrackingCals_t;) + +/** + * \brief SET_ENABLED_TRACKING_CALS_V2 command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetEnabledTrackingCals_v2 +{ + adi_adrv904x_TrackingCalibrationMask_t calMask; + uint32_t rxChannel; + uint32_t orxChannel; + uint32_t txChannel; + uint32_t laneSerdes; + adrv904x_TrackingCalEnableDisable_t enableDisable; +} adrv904x_CpuCmd_SetEnabledTrackingCals_v2_t;) + +/** + * \brief SET_ENABLED_TRACKING_CALS command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetEnabledTrackingCalsResp +{ + adrv904x_CpuErrorCode_e status; +} adrv904x_CpuCmd_SetEnabledTrackingCalsResp_t;) + +/** + * \brief GET_ENABLED_TRACKING_CALS command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_GetEnabledTrackingCalsResp +{ + adrv904x_CpuErrorCode_e status; + adi_adrv904x_TrackingCalEnableMasks_t enableMasks; +} adrv904x_CpuCmd_GetEnabledTrackingCalsResp_t;) + +/** + * \brief GET_TRACKING_CAL_STATE command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_GetTrackingCalStateResp +{ + adrv904x_CpuErrorCode_e status; + adi_adrv904x_TrackingCalState_t calState; +} adrv904x_CpuCmd_GetTrackingCalStateResp_t;) + +#ifdef __ICCARM__ +#pragma diag_default=Pm009 +#endif /* __ICCARM__ */ + +#endif /* __ADRV904X_CPU_CMD_TRACKING_CALS_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_tx_to_orx_mapping.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_tx_to_orx_mapping.h new file mode 100644 index 00000000000..5e81811f3b1 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_cmd_tx_to_orx_mapping.h @@ -0,0 +1,76 @@ +/** + * \file adrv904x_cpu_cmd_tx_to_orx_mapping.h + * + * \brief Command definition for ADRV904X_CPU_CMD_ID_SET_TX_TO_ORX_PRESET_ATTEN, + * ADRV904X_CPU_CMD_ID_SET_TX_TO_ORX_PRESET_NCO + * + * \details Command definition for ADRV904X_CPU_CMD_ID_SET_TX_TO_ORX_PRESET_ATTEN, + * ADRV904X_CPU_CMD_ID_SET_TX_TO_ORX_PRESET_NCO + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_CMD_TX_TO_ORX_MAPPING_H__ +#define __ADRV904X_CPU_CMD_TX_TO_ORX_MAPPING_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adrv904x_cpu_error_codes_types.h" + +/* Flag to indicate the extended mapping is used */ +#define TX_TO_ORX_EXTENDED_MAPPING_FLAG (0x0000100UL) + +/** + * \brief SET_TX_TO_ORX_PRESET_ATTEN command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetTxToOrxPresetAtten +{ + uint8_t chanSelect; /*!< Select the Tx channels (bit mapped) */ + uint8_t extendedMappingFlag; /*!< Extended Mapping Flag */ + uint8_t presetAtten_dB; /*!< Orx Atten Preset value (0-16) */ + uint8_t immediateUpdate; /*!< Enable/disable flag to update Orx Atten ctrl regs for Orx channels that can observe selected Tx channels */ +} adrv904x_CpuCmd_SetTxToOrxPresetAtten_t;) + +/** + * \brief SET_TX_TO_ORX_PRESET_ATTEN command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetTxToOrxPresetAttenResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ +} adrv904x_CpuCmd_SetTxToOrxPresetAttenResp_t;) + + + +/** + * \brief SET_TX_TO_ORX_PRESET_NCO command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetTxToOrxPresetNco +{ + uint8_t chanSelect; /*!< Select the Tx channels (bit mapped) */ + uint8_t extendedMappingFlag; /*!< Extended Mapping Flag */ + uint32_t ncoFreqAdc_Khz; /*!< Orx ADC NCO Frequency (kHz) Preset value */ + uint32_t ncoFreqDatapath_Khz; /*!< Orx Datapath NCO Frequency (kHz) Preset value */ + uint8_t immediateUpdate; /*!< Enable/disable flag to update Orx NCO ctrl regs for Orx channels that can observe selected Tx channels */ +} adrv904x_CpuCmd_SetTxToOrxPresetNco_t;) + +/** + * \brief SET_TX_TO_ORX_PRESET_NCO command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuCmd_SetTxToOrxPresetNcoResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ +} adrv904x_CpuCmd_SetTxToOrxPresetNcoResp_t;) + + +#endif /* __ADRV904X_CPU_CMD_TX_TO_ORX_MAPPING_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_debug_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_debug_types.h new file mode 100644 index 00000000000..65125a243b1 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_debug_types.h @@ -0,0 +1,24 @@ + /** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + + /** + * \file adrv904x_cpu_debug_types.h + * + * \brief Contains CPU debug definitions + * + * \details Contains CPU debug definitions + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_CPU_DEBUG_TYPES_H__ +#define __ADRV904X_CPU_DEBUG_TYPES_H__ + + +#endif /* __ADI_ADRV904X_CPU_DEBUG_TYPES_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_device_profile_jesd_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_device_profile_jesd_types.h new file mode 100644 index 00000000000..ea571633d41 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_device_profile_jesd_types.h @@ -0,0 +1,455 @@ +/** + * \file adrv904x_cpu_device_profile_jesd_types.h + * + * \brief Contains ADRV904X Device Profile JESD type definitions + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_DEVICE_PROFILE_JESD_TYPES_H__ +#define __ADRV904X_CPU_DEVICE_PROFILE_JESD_TYPES_H__ + +#include +#include "adi_adrv904x_platform_pack.h" + + +#define ADRV904X_JESD_MAX_DESERIALIZER_LANES (8u) +#define ADRV904X_JESD_MAX_SERIALIZER_LANES (8u) +#define ADRV904X_JESD_MAX_FRM_SAMPLE_XBAR_IDX (64u) +#define ADRV904X_JESD_MAX_DFRM_SAMPLE_XBAR_IDX (32u) +#define ADRV904X_JESD_MAX_LKSH_SAMPLE_XBAR_IDX (32u) +/* ADRV904X_JESD_NUM_TXRX_CHAN == ADRV904X_NUM_TXRX_CHAN */ +#define ADRV904X_JESD_NUM_TXRX_CHAN (8u) + +#define ADRV904X_JESD_MAX_CARRIER_SLOTS (64u) /*!< ADRV904X JESD Carrier slots */ +#define ADRV904X_JESD_MAX_FRM_CARRIER_XBAR_IDX (192u) /*!< ADRV904X JESD Max FRM XBAR Carrier */ +#define ADRV904X_JESD_MAX_DFRM_CARRIER_XBAR_IDX (192u) /*!< ADRV904X JESD Max DFRM XBAR Carrier */ + +typedef enum adrv904x_JesdVersion +{ + ADRV904X_JESD_204B = 0u, + ADRV904X_JESD_204C = 1u, + ADRV904X_JESD_LAST_VALID_MODE = ADRV904X_JESD_204C +} adrv904x_JesdVersion_e; + +typedef uint8_t adrv904x_JesdVersion_t; + +/*!< List of Framers */ +typedef enum adrv904x_JesdFramer +{ + ADRV904X_JESD_FRAMER_0 = 0u, /*!< Framer 0 selection */ + ADRV904X_JESD_FRAMER_1 = 1u, /*!< Framer 1 selection */ + ADRV904X_JESD_FRAMER_2 = 2u, /*!< Framer 2 selection */ + ADRV904X_JESD_FRAMER_NUM = 3u +} adrv904x_JesdFramer_e; + +/*!< List of Deframers */ +typedef enum adrv904x_JesdDeframer +{ + ADRV904X_JESD_DEFRAMER_0 = 0u, /*!< Deframer 0 selection */ + ADRV904X_JESD_DEFRAMER_1 = 1u, /*!< Deframer 1 selection */ + ADRV904X_JESD_DEFRAMER_NUM = 2u +} adrv904x_JesdDeframer_e; + +/*!< List of Deframers */ +typedef enum adrv904x_JesdLkShSwitcher +{ + ADRV904X_JESD_LKSH_SWITCHER_0 = 0u, /*!< Link Sharing Switcher 0 selection */ + ADRV904X_JESD_LKSH_SWITCHER_1 = 1u, /*!< Link Sharing Switcher 1 selection */ + ADRV904X_JESD_LKSH_SWITCHER_NUM = 2u +} adrv904x_JesdLkShSwitcher_e; + +/*!< List of DAC Sample Xbar options */ +typedef enum adrv904x_JesdDeframerSampleXbarSelect +{ + ADRV904X_JESD_DFRM_SPLXBAR_TX0_BAND_0_DATA_I = 0u, + ADRV904X_JESD_DFRM_SPLXBAR_TX0_BAND_0_DATA_Q = 1u, + ADRV904X_JESD_DFRM_SPLXBAR_TX1_BAND_0_DATA_I = 2u, + ADRV904X_JESD_DFRM_SPLXBAR_TX1_BAND_0_DATA_Q = 3u, + ADRV904X_JESD_DFRM_SPLXBAR_TX2_BAND_0_DATA_I = 4u, + ADRV904X_JESD_DFRM_SPLXBAR_TX2_BAND_0_DATA_Q = 5u, + ADRV904X_JESD_DFRM_SPLXBAR_TX3_BAND_0_DATA_I = 6u, + ADRV904X_JESD_DFRM_SPLXBAR_TX3_BAND_0_DATA_Q = 7u, + ADRV904X_JESD_DFRM_SPLXBAR_TX4_BAND_0_DATA_I = 8u, + ADRV904X_JESD_DFRM_SPLXBAR_TX4_BAND_0_DATA_Q = 9u, + ADRV904X_JESD_DFRM_SPLXBAR_TX5_BAND_0_DATA_I = 10u, + ADRV904X_JESD_DFRM_SPLXBAR_TX5_BAND_0_DATA_Q = 11u, + ADRV904X_JESD_DFRM_SPLXBAR_TX6_BAND_0_DATA_I = 12u, + ADRV904X_JESD_DFRM_SPLXBAR_TX6_BAND_0_DATA_Q = 13u, + ADRV904X_JESD_DFRM_SPLXBAR_TX7_BAND_0_DATA_I = 14u, + ADRV904X_JESD_DFRM_SPLXBAR_TX7_BAND_0_DATA_Q = 15u, + ADRV904X_JESD_DFRM_SPLXBAR_TX0_BAND_1_DATA_I = 16u, + ADRV904X_JESD_DFRM_SPLXBAR_TX0_BAND_1_DATA_Q = 17u, + ADRV904X_JESD_DFRM_SPLXBAR_TX1_BAND_1_DATA_I = 18u, + ADRV904X_JESD_DFRM_SPLXBAR_TX1_BAND_1_DATA_Q = 19u, + ADRV904X_JESD_DFRM_SPLXBAR_TX2_BAND_1_DATA_I = 20u, + ADRV904X_JESD_DFRM_SPLXBAR_TX2_BAND_1_DATA_Q = 21u, + ADRV904X_JESD_DFRM_SPLXBAR_TX3_BAND_1_DATA_I = 22u, + ADRV904X_JESD_DFRM_SPLXBAR_TX3_BAND_1_DATA_Q = 23u, + ADRV904X_JESD_DFRM_SPLXBAR_TX4_BAND_1_DATA_I = 24u, + ADRV904X_JESD_DFRM_SPLXBAR_TX4_BAND_1_DATA_Q = 25u, + ADRV904X_JESD_DFRM_SPLXBAR_TX5_BAND_1_DATA_I = 26u, + ADRV904X_JESD_DFRM_SPLXBAR_TX5_BAND_1_DATA_Q = 27u, + ADRV904X_JESD_DFRM_SPLXBAR_TX6_BAND_1_DATA_I = 28u, + ADRV904X_JESD_DFRM_SPLXBAR_TX6_BAND_1_DATA_Q = 29u, + ADRV904X_JESD_DFRM_SPLXBAR_TX7_BAND_1_DATA_I = 30u, + ADRV904X_JESD_DFRM_SPLXBAR_TX7_BAND_1_DATA_Q = 31u, + ADRV904X_JESD_DFRM_SPLXBAR_LAST_VALID = ADRV904X_JESD_DFRM_SPLXBAR_TX7_BAND_1_DATA_Q, + ADRV904X_JESD_DFRM_SPLXBAR_INVALID = 0x7Fu +} adrv904x_JesdDeframerSampleXbarSelect_e; + +/*!< List of ADC Sample Xbar options */ +typedef enum adrv904x_JesdFramerSampleXbarSelect +{ + ADRV904X_JESD_FRM_SPLXBAR_RX0_BAND_0_DATA_I = 0u, + ADRV904X_JESD_FRM_SPLXBAR_RX0_BAND_0_DATA_Q = 1u, + ADRV904X_JESD_FRM_SPLXBAR_RX0_BAND_1_DATA_I = 2u, + ADRV904X_JESD_FRM_SPLXBAR_RX0_BAND_1_DATA_Q = 3u, + ADRV904X_JESD_FRM_SPLXBAR_RX1_BAND_0_DATA_I = 4u, + ADRV904X_JESD_FRM_SPLXBAR_RX1_BAND_0_DATA_Q = 5u, + ADRV904X_JESD_FRM_SPLXBAR_RX1_BAND_1_DATA_I = 6u, + ADRV904X_JESD_FRM_SPLXBAR_RX1_BAND_1_DATA_Q = 7u, + ADRV904X_JESD_FRM_SPLXBAR_RX2_BAND_0_DATA_I = 8u, + ADRV904X_JESD_FRM_SPLXBAR_RX2_BAND_0_DATA_Q = 9u, + ADRV904X_JESD_FRM_SPLXBAR_RX2_BAND_1_DATA_I = 10u, + ADRV904X_JESD_FRM_SPLXBAR_RX2_BAND_1_DATA_Q = 11u, + ADRV904X_JESD_FRM_SPLXBAR_RX3_BAND_0_DATA_I = 12u, + ADRV904X_JESD_FRM_SPLXBAR_RX3_BAND_0_DATA_Q = 13u, + ADRV904X_JESD_FRM_SPLXBAR_RX3_BAND_1_DATA_I = 14u, + ADRV904X_JESD_FRM_SPLXBAR_RX3_BAND_1_DATA_Q = 15u, + + ADRV904X_JESD_FRM_SPLXBAR_RX4_BAND_0_DATA_I = 16u, + ADRV904X_JESD_FRM_SPLXBAR_RX4_BAND_0_DATA_Q = 17u, + ADRV904X_JESD_FRM_SPLXBAR_RX4_BAND_1_DATA_I = 18u, + ADRV904X_JESD_FRM_SPLXBAR_RX4_BAND_1_DATA_Q = 19u, + ADRV904X_JESD_FRM_SPLXBAR_RX5_BAND_0_DATA_I = 20u, + ADRV904X_JESD_FRM_SPLXBAR_RX5_BAND_0_DATA_Q = 21u, + ADRV904X_JESD_FRM_SPLXBAR_RX5_BAND_1_DATA_I = 22u, + ADRV904X_JESD_FRM_SPLXBAR_RX5_BAND_1_DATA_Q = 23u, + ADRV904X_JESD_FRM_SPLXBAR_RX6_BAND_0_DATA_I = 24u, + ADRV904X_JESD_FRM_SPLXBAR_RX6_BAND_0_DATA_Q = 25u, + ADRV904X_JESD_FRM_SPLXBAR_RX6_BAND_1_DATA_I = 26u, + ADRV904X_JESD_FRM_SPLXBAR_RX6_BAND_1_DATA_Q = 27u, + ADRV904X_JESD_FRM_SPLXBAR_RX7_BAND_0_DATA_I = 28u, + ADRV904X_JESD_FRM_SPLXBAR_RX7_BAND_0_DATA_Q = 29u, + ADRV904X_JESD_FRM_SPLXBAR_RX7_BAND_1_DATA_I = 30u, + ADRV904X_JESD_FRM_SPLXBAR_RX7_BAND_1_DATA_Q = 31u, + ADRV904X_JESD_FRM_SPLXBAR_LAST_VALID_NO_INT = ADRV904X_JESD_FRM_SPLXBAR_RX7_BAND_1_DATA_Q, /* With no interleaving enabled */ + + ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_0 = 32u, + ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_1 = 33u, + ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_2 = 34u, + ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_3 = 35u, + ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_4 = 36u, + ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_5 = 37u, + ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_6 = 38u, + ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_7 = 39u, + ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_0 = 40u, + ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_1 = 41u, + ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_2 = 42u, + ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_3 = 43u, + ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_4 = 44u, + ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_5 = 45u, + ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_6 = 46u, + ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_7 = 47u, + + ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_0 = 48u, + ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_1 = 49u, + ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_2 = 50u, + ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_3 = 51u, + ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_4 = 52u, + ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_5 = 53u, + ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_6 = 54u, + ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_7 = 55u, + ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_0 = 56u, + ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_1 = 57u, + ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_2 = 58u, + ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_3 = 59u, + ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_4 = 60u, + ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_5 = 61u, + ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_6 = 62u, + ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_7 = 63u, + ADRV904X_JESD_FRM_SPLXBAR_LAST_VALID = ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_7, + ADRV904X_JESD_FRM_SPLXBAR_INVALID = 0x7Fu +} adrv904x_JesdFramerSampleXbarSelect_e; + +/*!< List of Jesd Frame Sync options */ +typedef enum adrv904x_JesdFrmSyncbMode +{ + ADRV904X_JESD_FRM_SYNCB_PIN_MODE = 0u, + ADRV904X_JESD_FRM_SYNCB_SPI_MODE = 1u +} adrv904x_JesdFrmSyncbMode_e; + +/*!< List of Jesd Frame Pad options */ +typedef enum adrv904x_JesdFrmSyncPadReq +{ + ADRV904X_JESD_FRM_PWR_ON_SYNC_PAD1 = 0u, + ADRV904X_JESD_FRM_PWR_ON_SYNC_PAD2 = 1u, + ADRV904X_JESD_FRM_PWR_ON_SYNC_PAD3 = 2u, + ADRV904X_JESD_FRM_PWR_OFF_ALL_SYNC_PADS = 3u +} adrv904x_JesdFrmSyncPadReq_e; + +typedef enum adrv904x_JesdFrmSyncbInSelect +{ + ADRV904X_JESD_FRM_SYNCB_CMOS = 0u, + ADRV904X_JESD_FRM_SYNCB_LVDS_WITH_INTL_TERM = 1u, + ADRV904X_JESD_FRM_SYNCB_LVDS_NO_INTL_TERM = 2u, +} adrv904x_JesdFrmSyncbInSelect_e; + +typedef enum adrv904x_JesdDfrmSyncPadReq +{ + ADRV904X_JESD_DFRM_PWR_ON_SYNC_PAD1 = 0u, + ADRV904X_JESD_DFRM_PWR_ON_SYNC_PAD2 = 1u, + ADRV904X_JESD_DFRM_PWR_ON_ALL_SYNC_PADS = 2u, + ADRV904X_JESD_DFRM_PWR_OFF_ALL_SYNC_PADS = 3u +} adrv904x_JesdDfrmSyncPadReq_e; + +typedef enum adrv904x_JesdJtxOutputDriveSwing +{ + ADRV904X_JESD_DRIVE_SWING_VTT_100 = 0u, + ADRV904X_JESD_DRIVE_SWING_VTT_85 = 1u, + ADRV904X_JESD_DRIVE_SWING_VTT_75 = 2u, + ADRV904X_JESD_DRIVE_SWING_VTT_50 = 3u, + ADRV904X_JESD_DRIVE_SWING_LAST_VALID = ADRV904X_JESD_DRIVE_SWING_VTT_50 +} adrv904x_JesdJtxOutputDriveSwing_e; + +typedef enum adrv904x_JesdJtxPreEmphasis +{ + ADRV904X_JESD_PRE_TAP_LEVEL_0_DB = 0u, + ADRV904X_JESD_PRE_TAP_LEVEL_3_DB = 1u, + ADRV904X_JESD_PRE_TAP_LEVEL_6_DB = 2u, + ADRV904X_JESD_PRE_TAP_LEVEL_LAST_VALID = ADRV904X_JESD_PRE_TAP_LEVEL_6_DB +} adrv904x_JesdJtxPreEmphasis_e; + +typedef enum adrv904x_JesdJtxPostEmphasis +{ + ADRV904X_JESD_POST_TAP_LEVEL_0_DB = 0u, + ADRV904X_JESD_POST_TAP_LEVEL_3_DB = 1u, + ADRV904X_JESD_POST_TAP_LEVEL_6_DB = 2u, + ADRV904X_JESD_POST_TAP_LEVEL_9_DB = 3u, + ADRV904X_JESD_POST_TAP_LEVEL_12_DB = 4u, + ADRV904X_JESD_POST_TAP_LEVEL_LAST_VALID = ADRV904X_JESD_POST_TAP_LEVEL_12_DB +} adrv904x_JesdJtxPostEmphasis_e; + +typedef enum adrv904x_JesdConvClockMode +{ + ADRV904X_JESD_NO_RESAMPLE_FIR = 0u, + ADRV904X_JESD_2_3_RESAMPLE_FIR, + ADRV904X_JESD_3_4_RESAMPLE_FIR +} adrv904x_JesdConvClockMode_e; + +/* Bit macros for newSysref byte in Framer and Deframer structures */ +#define ADRV904X_JESD_BITM_SYSREF_FOR_RELINK (0x1U) +#define ADRV904X_JESD_BITP_SYSREF_FOR_RELINK (0x0U) + +#define ADRV904X_JESD_BITM_SYSREF_FOR_STARTUP (0x2U) +#define ADRV904X_JESD_BITP_SYSREF_FOR_STARTUP (0x1U) + +#define ADRV904X_JESD_BITM_SYSREF_N_SHOT_COUNT (0x3CU) +#define ADRV904X_JESD_BITP_SYSREF_N_SHOT_COUNT (0x2U) + +#define ADRV904X_JESD_BITM_SYSREF_N_SHOT_ENABLE (0x40U) +#define ADRV904X_JESD_BITP_SYSREF_N_SHOT_ENABLE (0x6U) + +#define ADRV904X_JESD_BITM_SYSREF_IGNORE_WHEN_LINKED (0x80U) +#define ADRV904X_JESD_BITP_SYSREF_IGNORE_WHEN_LINKED (0x7U) + +ADI_ADRV904X_PACK_START +/*!< adrv904x_JesdCarrierXBarSelect structure containing Jesd Carrier XBar Selection Parameters */ +typedef struct adrv904x_JesdCarrierXBarSelect +{ + uint8_t chanSelect; /*!< Rx/Tx slice selection */ + uint8_t slotSelect; /*!< carrier slot selection */ +} adrv904x_JesdCarrierXBarSelect_t; +ADI_ADRV904X_PACK_FINISH + + ADI_ADRV904X_PACK_START +/*!< adrv904x_DfeJesdFramerConfig structure containing Jesd Framer Configuration Parameters */ +typedef struct adrv904x_DfeJesdFramerConfig +{ + adrv904x_JesdCarrierXBarSelect_t carrierXBar[ADRV904X_JESD_MAX_FRM_CARRIER_XBAR_IDX]; /*!< cDDC sample crossbar */ + uint8_t jesd204cInterleave; /*!< 204c interleave (adrv904x_Jesd204cInterleaveMode_e) */ + + uint8_t reserved[3]; /*!< Reserved */ +} adrv904x_DfeJesdFramerConfig_t; +ADI_ADRV904X_PACK_FINISH + + ADI_ADRV904X_PACK_START +/*!< adrv904x_DfeJesdDeframerConfig structure containing Jesd DeFramer Configuration Parameters */ +typedef struct adrv904x_DfeJesdDeframerConfig +{ + adrv904x_JesdCarrierXBarSelect_t carrierXBar[ADRV904X_JESD_MAX_DFRM_CARRIER_XBAR_IDX]; /*!< cDUC sample crossbar */ + uint8_t jesd204cInterleave; /*!< 204c interleave */ + + uint8_t reserved[3]; /*!< Reserved */ +} adrv904x_DfeJesdDeframerConfig_t; + +ADI_ADRV904X_PACK_START +/*!< adrv904x_DfeJesdSettings structure containing Jesd Settings */ +typedef struct adrv904x_DfeJesdSettings +{ + adrv904x_DfeJesdFramerConfig_t framer[ADRV904X_JESD_FRAMER_NUM]; /*!< Framer configuration structure */ + adrv904x_DfeJesdDeframerConfig_t deframer[ADRV904X_JESD_DEFRAMER_NUM]; /*!< Deframer configuration structure */ + uint8_t txBand1Enable; /*!< Tx Band1 data present in CDUC bypass operation. 1 bit per channel. */ + uint8_t txCducSyncSelect; /*!< Selects the DFRM which generates the Tx Cduc sync source. 1 bit per channel. */ + uint8_t txClkEnable[ADRV904X_JESD_NUM_TXRX_CHAN]; /*!< enable cDUC crossbar clock generation */ + uint8_t txCducSampleClkDiv[ADRV904X_JESD_NUM_TXRX_CHAN]; /*!< clock divider for CDUC deinterleaved samples */ + uint8_t txCducInterfaceClkDiv[ADRV904X_JESD_NUM_TXRX_CHAN]; /*!< clock divider for cDUC internal interface data (serialized/interleaved) */ + uint8_t txSampleSlotBypass; /*!< bypass cDUC crossbar. 1 bit per deframer */ + uint8_t rxClkEnable[ADRV904X_JESD_NUM_TXRX_CHAN]; /*!< enable cDDC crossbar clock generation */ + uint8_t rxCddcSampleClkDiv[ADRV904X_JESD_NUM_TXRX_CHAN]; /*!< clock divider for cDDC deinterleaved samples */ + uint8_t rxCddcInterfaceClkDiv[ADRV904X_JESD_NUM_TXRX_CHAN]; /*!< clock divider for cDDC internal interface data (serialized/interleaved) */ + uint8_t rxSampleSlotBypass; /*!< bypass cDDC crossbar. 1 bit per framer[1:0] */ + + uint8_t reserved[4]; /*!< Reserved */ +} adrv904x_DfeJesdSettings_t; + +ADI_ADRV904X_PACK_START +typedef struct adrv904x_JesdFramerConfig +{ + uint8_t mode; /*!< 0 = 204B, 1 = 204C */ + uint8_t E; /*!< Blocks in Multi-block for 204C */ + uint8_t bankId; /*!< Bank ID extension to Device ID (0-15)*/ + uint8_t deviceId; /*!< Device ID link identification number (0-255) */ + uint8_t lane0Id; /*!< Starting Lane ID (0-31) */ + uint8_t M; /*!< Number of ADCs/converters (0,2,4,8, 16) */ + uint8_t Kminus1; /*!< Number of frames in a multiframe - 1 (0 - 255) */ + uint8_t F; /*!< Number of bytes (octets) per frame. (1,2,4,8) */ + uint8_t Np; /*!< Converter sample resolution in bits (12,16,24) */ + uint8_t S; /*!< Number of samples per converter per frame */ + uint8_t scramble; /*!< Scrambling enable */ + uint8_t serializerLanesEnabled; /*!< Serializer lane select bit field */ + uint8_t lmfcOffset[2]; /*!< LMFC offset value for deterministic latency setting */ + /*!< lmfcOffset[0] - Bits [7:0] of PhaseAdjust */ + /*!< lmfcOffset[1] - Bits [18:8] of PhaseAdjust */ + uint8_t newSysref; /*!< Flags for SYSREF control. */ + uint8_t syncbInSPIMode; /*!< SYNCb SPI/Pin Mode selection */ + uint8_t syncbInSelect; /*!< SYNCb input source */ + uint8_t syncbInLvdsMode; /*!< SYNCb LVDS mode enable: 0=CMOS mode, + * 1=LVDS mode, + * 2=LVDS mode with no internal termination */ + uint8_t syncbInLvdsPnInvert; /*!< SYNCb LVDS PN inverted */ + uint8_t laneXbar[ADRV904X_JESD_MAX_SERIALIZER_LANES]; /*!< Lane crossbar selection */ + uint8_t sampleXBar[ADRV904X_JESD_MAX_FRM_SAMPLE_XBAR_IDX]; /*!< Converter sample crossbar selection */ + uint8_t reserved[2]; /*!< Reserved */ + uint32_t iqRate_kHz; /*!< Framer I/Q rate */ + uint32_t laneRate_kHz; /*!< Framer Lane rate */ + uint8_t subclass; /*!< Framer subclass setting */ + uint8_t convClockMode; /*!< Conv clock mode: 0 - No resampling fir used */ + /*!< 1 - 2/3 resampling fir used */ + /*!< 2 - 3/4 resampling fir used */ + + uint8_t reserved1[5]; /*!< Reserved */ +} adrv904x_JesdFramerConfig_t; +ADI_ADRV904X_PACK_FINISH + + ADI_ADRV904X_PACK_START +typedef struct adrv904x_JesdDeframerConfig +{ + uint8_t mode; /*!< 0 = 204B, 1 = 204C */ + uint8_t E; /*!< Blocks in Multiblock for 204C */ + uint8_t bankId; /*!< Bank ID extension to Device ID */ + uint8_t deviceId; /*!< Device ID link identification number */ + uint8_t lane0Id; /*!< Starting Lane ID */ + uint8_t M; /*!< Number of ADCs */ + uint8_t Kminus1; /*!< Number of frames in a multiframe - 1 (0 - 255) */ + uint8_t F; /*!< Number of bytes (octets) per frame. (1,2,4,8) */ + uint8_t Np; /*!< Converter sample resolution in bits (12,16,24) */ + uint8_t S; /*!< Number of samples per converter per frame */ + uint8_t scramble; /*!< Scrambling enable */ + uint8_t deserializerLanesEnabled; /*!< Deserializer lane select bit field */ + uint8_t lmfcOffset[2]; /*!< LMFC offset value for deterministic latency setting. */ + /*!< lmfcOffset[0] - Bits [7:0] of PhaseAdjust */ + /*!< lmfcOffset[1] - Bits [18:8] of PhaseAdjust */ + uint8_t newSysref; /*!< Flags for SYSREF control. */ + uint8_t syncbOutSelect; /*!< Selects deframer SYNCBOUT pin. */ + uint8_t syncbOutLvdsMode; /*!< SYNCb LVDS mode enable */ + uint8_t syncbOutLvdsPnInvert; /*!< SYNCb LVDS PN Invert enable */ + uint8_t syncbOutCmosDriveLevel; /*!< SYNCb CMOS drive_strength */ + uint8_t laneXbar[ADRV904X_JESD_MAX_DESERIALIZER_LANES]; /*!< Lane crossbar selection */ + uint8_t sampleXBar[ADRV904X_JESD_MAX_DFRM_SAMPLE_XBAR_IDX]; /*!< Converter sample crossbar selection */ + uint8_t reserved[1]; /*!< Reserved */ + uint32_t iqRate_kHz; /*!< Deframer I/Q rate */ + uint32_t laneRate_kHz; /*!< Deframer Lane rate */ + uint8_t subclass; /*!< Deframer subclass setting */ + uint8_t convClockMode; /*!< Conv clock mode: 0 - No resampling fir used */ + /*!< 1 - 2/3 resampling fir used */ + /*!< 2 - 3/4 resampling fir used */ + + uint8_t reserved1[2]; /*!< Reserved */ +} adrv904x_JesdDeframerConfig_t; +ADI_ADRV904X_PACK_FINISH + + ADI_ADRV904X_PACK_START +typedef struct adrv904x_JesdSerializerLane +{ + uint8_t serAmplitude; /*!< Serializer lane amplitude */ + uint8_t serPreEmphasis; /*!< Serializer lane pre-emphasis */ + uint8_t serPostEmphasis; /*!< Serializer lane post-emphasis */ + uint8_t serInvertLanePolarity; /*!< Serializer lane PN inversion select: 0 = do not invert. 1 = invert */ + uint8_t bitRepeatLog2; /*!< Log2 of bit repeat ratio */ + uint8_t reserved[3]; /*!< Reserved bytes for alignment */ +} adrv904x_JesdSerializerLane_t; +ADI_ADRV904X_PACK_FINISH + + ADI_ADRV904X_PACK_START +typedef struct adrv904x_JesdDeserializerLane +{ + uint8_t highBoost; /*!< High Boost enabled flag */ + uint8_t desInvertLanePolarity; /*!< Deserializer Lane PN inversion select: 0 = do not invert. 1 = invert */ + uint8_t bitSplitLog2; /*!< Log2 of bit split ratio */ + uint8_t cpuId; /*!< Cpu Number to run on - 255 not used */ + uint32_t configOption[10]; /*!< For future use */ +} adrv904x_JesdDeserializerLane_t; +ADI_ADRV904X_PACK_FINISH + + ADI_ADRV904X_PACK_START +typedef struct adrv904x_JesdLinkSharingConfig +{ + uint8_t linkSharingEnabled; /*!< 0 = link sharing disabled, 1 = link sharing enabled */ + uint8_t M; /*!< Number of ADCs */ + uint8_t Kminus1; /*!< Number of frames in a multiframe - 1 (0 - 255) */ + uint8_t F; /*!< Number of bytes (octets) per frame. (1,2,4,8) */ + uint8_t Np; /*!< Converter sample resolution in bits (12,16,24) */ + uint8_t S; /*!< Number of samples per converter per frame */ + uint8_t sampleXBar[ADRV904X_JESD_MAX_LKSH_SAMPLE_XBAR_IDX]; /*!< Converter sample crossbar selection */ + uint8_t convClockMode; /*!< Conv clock mode: 0 - No resampling fir used */ + /*!< 1 - 2/3 resampling fir used */ + /*!< 2 - 3/4 resampling fir used */ + uint32_t iqRate_kHz; /*!< Deframer I/Q rate */ +} adrv904x_JesdLinkSharingConfig_t; +ADI_ADRV904X_PACK_FINISH + + ADI_ADRV904X_PACK_START +typedef struct adrv904x_JesdSettings +{ + adrv904x_JesdFramerConfig_t framer[ADRV904X_JESD_FRAMER_NUM]; /*!< Framer configuration structure */ + adrv904x_JesdDeframerConfig_t deframer[ADRV904X_JESD_DEFRAMER_NUM]; /*!< Deframer configuration structure */ + adrv904x_JesdSerializerLane_t serializerLane[ADRV904X_JESD_MAX_SERIALIZER_LANES]; /*!< Serializer configuration structure */ + adrv904x_JesdDeserializerLane_t deserializerLane[ADRV904X_JESD_MAX_DESERIALIZER_LANES]; /*!< Deserializer configuration structure */ + adrv904x_JesdLinkSharingConfig_t linkSharingCfg[ADRV904X_JESD_LKSH_SWITCHER_NUM]; /*!< Link Sharing Switcher structure */ + uint8_t jrxAuxSysrefMode; /*!< JRX SYSREF mode {0|1} */ + uint8_t jrxAuxSysrefClkDivideRatio; /*!< JRX aux sysref clk divide ratio */ + uint16_t jrxAuxSysrefK; /*!< JRX aux sysref K */ + uint8_t jrxAuxSysrefDevClkRatio; /*!< JRX aux sysref dev clk ratio */ + uint8_t jtxAuxSysrefMode; /*!< JTX SYSREF mode {0|1} */ + uint8_t jtxAuxSysrefClkDivideRatio; /*!< JTX aux sysref clk divide ratio */ + uint16_t jtxAuxSysrefK; /*!< JTX aux sysref K */ + uint8_t jtxAuxSysrefDevClkRatio; /*!< JTX aux sysref dev clk ratio */ + uint8_t rxdesQhfrate; /*!< DESER mode settings */ + uint8_t txserTxPathClkDiv; /*!< SER mode settings */ + uint16_t devClkKminus1; /*!< Number of multiframe in terms of dev_clk clock period minus 1 */ + uint8_t reserved[2]; /*!< Reserved bytes for alignment */ +} adrv904x_JesdSettings_t; +ADI_ADRV904X_PACK_FINISH + +#endif /* __ADRV904X_CPU_DEVICE_PROFILE_JESD_TYPES_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_device_profile_pfir_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_device_profile_pfir_types.h new file mode 100644 index 00000000000..7c55b52f8be --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_device_profile_pfir_types.h @@ -0,0 +1,54 @@ +/** + * \file adrv904x_cpu_device_profile_pfir_types.h + * + * \brief Contains ADRV904X Device Profile PFIR type definitions + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_DEVICE_PROFILE_PFIR_TYPES_H__ +#define __ADRV904X_CPU_DEVICE_PROFILE_PFIR_TYPES_H__ + +#include "adi_adrv904x_platform_pack.h" + +#define ADRV904X_NUM_PFIR_COEF (24u) + +typedef enum adrv904x_PfirGain +{ + ADRV904X_PFIR_GAIN_MINUS_12_DB = 0u, + ADRV904X_PFIR_GAIN_MINUS_6_DB = 1u, + ADRV904X_PFIR_GAIN_0_DB = 2u, + ADRV904X_PFIR_GAIN_PLUS_6_DB = 3u +} adrv904x_PfirGain_e; + +ADI_ADRV904X_PACK_START +typedef struct adrv904x_RxPfirData +{ + uint8_t enable; + uint8_t gain; + uint8_t sym; + int16_t pfirCoef[ADRV904X_NUM_PFIR_COEF]; +} adrv904x_RxPfirData_t; +ADI_ADRV904X_PACK_FINISH + + ADI_ADRV904X_PACK_START +typedef struct adrv904x_TxPfirData +{ + uint8_t enable; + uint8_t gain; + uint8_t sym; + uint8_t reserved; + int16_t pfirCoefI[ADRV904X_NUM_PFIR_COEF]; + int16_t pfirCoefQ[ADRV904X_NUM_PFIR_COEF]; +} adrv904x_TxPfirData_t; +ADI_ADRV904X_PACK_FINISH + +#endif /* __ADRV904X_CPU_DEVICE_PROFILE_PFIR_TYPES_H__*/ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_device_profile_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_device_profile_types.h new file mode 100644 index 00000000000..9d944f8459b --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_device_profile_types.h @@ -0,0 +1,847 @@ +/** + * \file adrv904x_cpu_device_profile_types.h + * + * \brief Contains ADRV904X Device Profile type definitions + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_DEVICE_PROFILE_TYPES_H__ +#define __ADRV904X_CPU_DEVICE_PROFILE_TYPES_H__ + +#include "adrv904x_cpu_device_profile_jesd_types.h" +#include "adrv904x_cpu_device_profile_pfir_types.h" +#include "adi_adrv904x_version_types.h" +#include "adi_adrv904x_platform_pack.h" + +#define ADRV904X_PROFILE_TX_CHAN_MASK (0x000000FFU) +#define ADRV904X_PROFILE_TX_CHAN_POS (0U) + +#define ADRV904X_PROFILE_RX_CHAN_MASK (0x0000FF00U) +#define ADRV904X_PROFILE_RX_CHAN_POS (8U) + +#define ADRV904X_PROFILE_ORX_CHAN_MASK (0x00030000U) +#define ADRV904X_PROFILE_ORX_CHAN_POS (16U) + +#define ADRV904X_PROFILE_CHAN_CONFIG_MASK (ADRV904X_PROFILE_TX_CHAN_MASK \ + | ADRV904X_PROFILE_RX_CHAN_MASK \ + | ADRV904X_PROFILE_ORX_CHAN_MASK) + +/* Channel types used throughout the system */ +typedef enum adrv904x_ChannelType +{ + ADRV904X_CH_TYPE_RX, + ADRV904X_CH_TYPE_TX, + ADRV904X_CH_TYPE_ORX, + ADRV904X_CH_TYPE_LOOPBACK, + ADRV904X_CH_TYPE_MAX +} adrv904x_ChannelType_e; + +/* Enumeration for DDC modes, Rx and Orx */ +typedef enum adrv904x_RxDdc +{ + ADRV904X_RXDDC_BYPASS = 0u, /*!< No Half Band Enabled */ + ADRV904X_RXDDC_FILTERONLY, /*!< Half Band Filters only */ + ADRV904X_RXDDC_INT2, /*!< Half Band Interpolation by 2 */ + ADRV904X_RXDDC_DEC2, /*!< Half Band Decimate by 2 */ + ADRV904X_RXDDC_BYPASS_REALIF, /*!< No Half Band Enabled (Real I/F MODE)*/ + ADRV904X_RXDDC_FILTERONLY_REALIF, /*!< Half Band Filters only (Real I/F MODE) */ + ADRV904X_RXDDC_INT2_REALIF, /*!< Half Band Interpolation by 2 (Real I/F MODE) */ + ADRV904X_RXDDC_DEC2_REALIF /*!< Half Band Decimate by 2 (Real I/F MODE) */ +} adrv904x_RxDdc_e; + +/* Enumeration for RX channel numbers - DO NOT CHANGE VALUE OR ORDER !!! */ +typedef enum adrv904x_RxChannelNum +{ + ADRV904X_RX_CH_1 = 0u, /*!< Rx channel # 1 index */ + ADRV904X_RX_CH_2, /*!< Rx channel # 2 index */ + ADRV904X_RX_CH_3, /*!< Rx channel # 3 index */ + ADRV904X_RX_CH_4, /*!< Rx channel # 4 index */ + ADRV904X_RX_CH_5, /*!< Rx channel # 5 index */ + ADRV904X_RX_CH_6, /*!< Rx channel # 6 index */ + ADRV904X_RX_CH_7, /*!< Rx channel # 7 index */ + ADRV904X_RX_CH_8, /*!< Rx channel # 8 index */ + ADRV904X_RX_CHAN_LEN /*!< Total number of Rx Channels supported */ +} adrv904x_RxChannelNum_e; + +/* Enumeration for TX channel numbers - DO NOT CHANGE VALUE OR ORDER !!! */ +typedef enum adrv904x_TxChannelNum +{ + ADRV904X_TX_CH_1 = 0u, /*!< Tx channel # 1 index */ + ADRV904X_TX_CH_2, /*!< Tx channel # 2 index */ + ADRV904X_TX_CH_3, /*!< Tx channel # 3 index */ + ADRV904X_TX_CH_4, /*!< Tx channel # 4 index */ + ADRV904X_TX_CH_5, /*!< Tx channel # 5 index */ + ADRV904X_TX_CH_6, /*!< Tx channel # 6 index */ + ADRV904X_TX_CH_7, /*!< Tx channel # 7 index */ + ADRV904X_TX_CH_8, /*!< Tx channel # 8 index */ + ADRV904X_TX_CHAN_LEN /*!< Total number of Tx Channels supported */ +} adrv904x_TxChannelNum_e; + +/* Enumeration for ORX channel numbers - DO NOT CHANGE VALUE OR ORDER !!! */ +typedef enum adrv904x_OrxChannelNum +{ + ADRV904X_ORX_CH_1 = 0u, /*!< Orx channel # 1 index */ + ADRV904X_ORX_CH_2, /*!< Orx channel # 2 index */ + ADRV904X_ORX_CHAN_LEN /*!< Total number of Orx Channels supported */ +} adrv904x_OrxChannelNum_e; + +/* Enumeration for RX channel indices - DO NOT CHANGE VALUE OR ORDER !!! */ +typedef enum adrv904x_RxChannelIdx +{ + ADRV904X_RX_CH_IDX_0 = 0u, /*!< Rx channel index # 0 */ + ADRV904X_RX_CH_IDX_1, /*!< Rx channel index # 1 */ + ADRV904X_RX_CH_IDX_2, /*!< Rx channel index # 2 */ + ADRV904X_RX_CH_IDX_3, /*!< Rx channel index # 3 */ + ADRV904X_RX_CH_IDX_4, /*!< Rx channel index # 4 */ + ADRV904X_RX_CH_IDX_5, /*!< Rx channel index # 5 */ + ADRV904X_RX_CH_IDX_6, /*!< Rx channel index # 6 */ + ADRV904X_RX_CH_IDX_7, /*!< Rx channel index # 7 */ + ADRV904X_RX_CHAN_IDX_LEN /*!< Total number of Rx Channels supported */ +} adrv904x_RxChannelIdx_e; + +/* Enumeration for TX channel indices - DO NOT CHANGE VALUE OR ORDER !!! */ +typedef enum adrv904x_TxChannelIdx +{ + ADRV904X_TX_CH_IDX_0 = 0u, /*!< Tx channel index # 0 */ + ADRV904X_TX_CH_IDX_1, /*!< Tx channel index # 1 */ + ADRV904X_TX_CH_IDX_2, /*!< Tx channel index # 2 */ + ADRV904X_TX_CH_IDX_3, /*!< Tx channel index # 3 */ + ADRV904X_TX_CH_IDX_4, /*!< Tx channel index # 4 */ + ADRV904X_TX_CH_IDX_5, /*!< Tx channel index # 5 */ + ADRV904X_TX_CH_IDX_6, /*!< Tx channel index # 6 */ + ADRV904X_TX_CH_IDX_7, /*!< Tx channel index # 7 */ + ADRV904X_TX_CHAN_IDX_LEN /*!< Total number of Tx Channels supported */ +} adrv904x_TxChannelIdx_e; + +/* Enumeration for ORX channel indices - DO NOT CHANGE VALUE OR ORDER !!! */ +typedef enum adrv904x_OrxChannelIdx +{ + ADRV904X_ORX_CH_IDX_0 = 0u, /*!< Orx channel index # 0 */ + ADRV904X_ORX_CH_IDX_1, /*!< Orx channel index # 1 */ + ADRV904X_ORX_CHAN_IDX_LEN /*!< Total number of Orx Channels supported */ +} adrv904x_OrxChannelIdx_e; + +/* Enumeration for serdes lane numbers - DO NOT CHANGE VALUE OR ORDER !!! */ +typedef enum adrv904x_SerDesLaneNum +{ + ADRV904X_SERDES_LANE_1 = 0u, /*!< SERDES LANE # 1 index */ + ADRV904X_SERDES_LANE_2, /*!< SERDES LANE # 2 index */ + ADRV904X_SERDES_LANE_3, /*!< SERDES LANE # 3 index */ + ADRV904X_SERDES_LANE_4, /*!< SERDES LANE # 4 index */ + ADRV904X_SERDES_LANE_5, /*!< SERDES LANE # 5 index */ + ADRV904X_SERDES_LANE_6, /*!< SERDES LANE # 6 index */ + ADRV904X_SERDES_LANE_7, /*!< SERDES LANE # 7 index */ + ADRV904X_SERDES_LANE_8, /*!< SERDES LANE # 8 index */ + ADRV904X_SERDES_LANE_LEN /*!< Total number of SerDes Lanes supported */ +} adrv904x_SerdesLaneNum_e; + +#define ADRV904X_RX_CHAN_LEN_CPU (ADRV904X_RX_CHAN_LEN / 2u) +#define ADRV904X_TX_CHAN_LEN_CPU (ADRV904X_TX_CHAN_LEN / 2u) +#define ADRV904X_ORX_CHAN_LEN_CPU (ADRV904X_ORX_CHAN_LEN / 2u) +#define ADRV904X_SERDES_LANE_LEN_CPU (ADRV904X_SERDES_LANE_LEN / 2u) + +/* Enumeration for EXT LO Select Device Profile def'n */ +typedef enum +{ + ADRV904X_LOGEN_SEL_TX = 0x01u, /*!< Set the PLL to Tx channels */ + ADRV904X_LOGEN_SEL_RX = 0x02u /*!< Set the PLL to Rx channels */ +} adrv904x_LogenRxTxSel_e; + + +typedef enum +{ + ADRV904X_LOGEN_INTERNAL_IN = 0x01u, /*!< Set Logen to internal mode */ + ADRV904X_LOGEN_EXTERNAL_IN = 0x02u, /*!< Set Logen to external IN mode */ + ADRV904X_LOGEN_EXTERNAL_OUT = 0x04u /*!< Set Logen to external OUT mode */ +} adrv904x_LogenInOutSel_e; + + + +typedef enum +{ + ADRV904X_RADIO_MODE_TDD, /*!< Radio Mode is set to TDD */ + ADRV904X_RADIO_MODE_FDD, /*!< Radio Mode is set to FDD */ + ADRV904X_RADIO_MODE_MAX /*!< Internal use */ +} adrv904x_ConfigDivDuplexMode_e; + + +typedef enum adrv904x_DfeMappingControl +{ + ADRV904X_DFE_MAPPING_CTRL_DEFAULT, /*!< In RCI mode, BBIC controls both Tx/Rx/Orx enable and TxToOrx mapping pins externally. In RS mode, radio sequencer controls Tx/ORx enable signals + DFE CPU controls Tx to Orx mapping pins(through RS with GPIO outputs from Koror) */ + ADRV904X_DFE_MAPPING_CTRL_DFE /*!< In RCI mode, BBIC controls Tx/Rx/Orx enable pins externally. DFE CPU controls Tx to Orx mapping pins(with GPIO outputs from Koror) + In RS mode, RS controls Tx/Rx/Orx enable pins. DFE CPU controls Tx to Orx mapping pins(with GPIO outputs from Koror) */ +} adrv904x_DfeMappingControl_e; + +/* Enumeration for DUC channel number */ +typedef enum adrv904x_DucNumber +{ + ADRV904X_DUC_BAND_0 = 0u, /*!< DUC channel 0 */ + ADRV904X_DUC_BAND_1, /*!< DUC channel 1 */ + ADRV904X_DUC_NUM_BAND +} adrv904x_DucNumber_e; + +/* Enumeration for DDC channel number */ +typedef enum adrv904x_DdcNumber +{ + ADRV904X_DDC_BAND_0 = 0u, /*!< DDC channel 0 */ + ADRV904X_DDC_BAND_1, /*!< DDC channel 1 */ + ADRV904X_DDC_NUM_BAND +} adrv904x_DdcNumber_e; + +/* profiles */ +#define ADRV904X_NUM_RX_PROFILES (4u) +#define ADRV904X_NUM_TX_PROFILES (4u) +#define ADRV904X_NUM_ORX_PROFILES (2u) +/* slices */ +#define ADRV904X_NUM_TXRX_CHAN (8u) +#define ADRV904X_NUM_ORX_CHAN (2u) + +/**************************************************************************** +* PLL structure. +****************************************************************************/ +ADI_ADRV904X_PACK_START +typedef struct adrv904x_PllConfig +{ + uint64_t freqHz; /*!< Internal PLL Freq Setting in Hz */ + uint64_t vcoFreqHz; /*!< Internal PLL VCO Setting in Hz */ + uint8_t loDiv; /*!< Internal LO Divider 1 to 64 */ + uint8_t divRange; /*!< Serdes only Div Range */ + uint8_t div2; /*!< Serdes only Div 2 */ + uint64_t extLoInFreqHz; /*!< External LO Frequency IN in Hz */ + uint8_t extLoOutDiv; /*!< External LO Out Divider */ + uint8_t selInternalExt; /*!< Internal or External LO */ + uint8_t power; /*!< PLL Power setting */ + uint8_t phaseMargin; /*!< PLL Phase Margin */ + uint32_t loopBandwidth; /*!< PLL Loop bandwidth */ + uint32_t refClock_kHz; /*!< PLL ref clock in kHz */ + uint8_t refClkDiv; /*!< PLL ref clock divider */ + uint8_t iBleedEnb; /*!< PLL bleed ramp enable */ + uint8_t reserved[2]; /*!< Reserve */ +} adrv904x_PllConfig_t; +ADI_ADRV904X_PACK_FINISH + +/**************************************************************************** +* PLL structure. +****************************************************************************/ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_ClkGenConfig +{ + uint8_t div1enb; /*!< div 2 enable setting */ + uint8_t div3enb; /*!< div 3 enable setting */ + uint8_t intDiv; /*!< int div bincode setting */ + uint8_t clkDiv; /*!< clkDiv thermo bincode setting */ + uint8_t reserved[4]; /*!< Reserve */ +} adrv904x_ClkGenConfig_t; +ADI_ADRV904X_PACK_FINISH + +/**************************************************************************** +* NCO Shifter structure. +****************************************************************************/ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_NcoShifter +{ + uint8_t ncoEnabled; /*!< NCO enabled */ + uint32_t totalDecimation; /*!< Total DDC decimation */ + int32_t ncoFreqin_kHz; /*!< NCO Frequency */ + int64_t ncoFtw; /*!< NCO tuning word */ + uint32_t tinClockFreq_kHz; /*!< NCO TIN freq in kHz */ + uint8_t hb3Enable; /*!< HB3 Enable */ + uint8_t hb2Enable; /*!< HB2 Enable */ + uint8_t hb1Enable; /*!< HB1 Enable */ + uint8_t hb3OutputClkDiv; /*!< HB3 output clock rate divider */ + uint8_t hb2OutputClkDiv; /*!< HB2 output clock rate divider*/ + uint8_t hb1OutputClkDiv; /*!< HB1 output clock rate divider */ + uint8_t hb3DpClkDiv; /*!< HB3 DP clock rate divider */ + uint8_t hb2DpClkDiv; /*!< HB2 DP clock rate divider */ + uint8_t hb1DpClkDiv; /*!< HB1 DP clock rate divider*/ + uint8_t tinClkDiv; /*!< HB1 Tin clock rate */ + uint8_t rxBandEnb; /*!< rx band enable */ + uint8_t resampleMode; /*!< Resampling filter mode */ + uint32_t rfCenterFreq_kHz; /*!< RF center frequency */ + uint32_t instBw_kHz; /*!< instantaneous signal bandwidth */ + uint32_t inputSigBw_kHz; /*!< input signal bandwidth */ + uint8_t rxGainDelay; /*!< Rx gain delay */ + uint8_t reserved[4]; /*!< Reserve */ +} adrv904x_NcoShifter_t; +ADI_ADRV904X_PACK_FINISH + +/* carriers */ +#define ADRV904X_NUM_TX_CARRIERS (8u) +#define ADRV904X_NUM_RX_CARRIERS (8u) +#define ADRV904X_NUM_CF_COEFFICIENTS (648u) +#define ADRV904X_NUM_CF_DELAY_FIFOS (8u) +/* defined in adrv904x_cpu_device_profile_jesd_types.h + * ADRV904X_JESD_MAX_CARRIER_SLOTS + */ +/* crest factor reduction */ +#define ADRV904X_NUM_CFR_ENGINES (3u) +#define ADRV904X_MAX_CFR_CORRECTION_PULSE_LEN (1024u) +/* charge trapping digital pre-distortion */ +#define ADRV904X_NUM_CT_DPD_DELAY_LINES (4u) + +/**************************************************************************** +* Carrier Channel structure. +****************************************************************************/ +ADI_ADRV904X_PACK_START +/*!< adrv904x_CarrierChannelConfig: structure of carrier channel configuration parameters */ +typedef struct adrv904x_CarrierChannelConfig +{ + uint32_t inputRate_kHz; /*!< input sample rate in kHz */ + uint32_t ibw_kHz; /*!< instantaneous signal bandwidth */ + uint16_t filterTaps; /*!< number of filter taps */ + uint32_t outputRate_kHz; /*!< output sample rate in kHz */ + + uint8_t bandSelect; /*!< DUC/DDC-0 or 1 */ + int32_t ncoFreq_kHz; /*!< mixer NCO frequency in kHz */ + uint64_t ncoFtw; /*!< alternate definition for NCO frequency; unused? */ + uint32_t ncoPhaseOffset; /*!< mixer NCO phase */ + uint8_t mixerEnable; /*!< mixer enable */ + uint8_t carrierRateRatio; /*!< ratio of carrier to CDUC clock rates */ + uint8_t interpolationRatio; /*!< number of HB stages (x2 per stage) */ + uint8_t decimationRatio; /*!< number of downsample stages (/2 per stage) */ + uint8_t startBank; /*!< filter start bank */ + uint8_t endBank; /*!< filter end bank */ + uint8_t filterBypass; /*!< bypass the filter */ + uint8_t asymmetricTaps; /*!< asymmetric tap values */ + uint8_t oddTaps; /*!< odd number of taps */ + uint8_t loopbackPoint; /*!< filter loopback to support higher bandwidths */ + uint32_t carrierGain; /*!< Gain value for normalization of carrier power in/out of aggregation */ + uint8_t carrierGainEnable; /*!< Enable field for carrier gain adjustments */ + + uint8_t reserved[2]; /*!< Reserve */ +} adrv904x_CarrierChannelConfig_t; +ADI_ADRV904X_PACK_FINISH + +/**************************************************************************** +* Carrier DDC (digital down-converter) structure. +****************************************************************************/ + ADI_ADRV904X_PACK_START +/*!< adrv904x_CarrierDdcConfig: structure of Ddc configuration parameters */ +typedef struct adrv904x_CarrierDdcConfig +{ + adrv904x_CarrierChannelConfig_t carriers[ADRV904X_NUM_RX_CARRIERS]; /*!< carrier definitions */ + int16_t coefficients[ADRV904X_NUM_CF_COEFFICIENTS]; /*!< filter coefficients for entire cDDC */ + uint8_t slotTable[ADRV904X_JESD_MAX_CARRIER_SLOTS]; /*!< JESD slot mapping */ + uint8_t maxSlot; /*!< number of slots used */ + uint32_t slotValid_lower; /*!< bitmap indicating slot validity; bits 0 to 31 */ + uint32_t slotValid_upper; /*!< bitmap indicating slot validity; bits 32 to 63 */ + uint8_t cddcBypass; /*!< bypass entire cDDC */ + uint8_t carriersEnabled; /*!< bitmap of enabled carriers */ + uint8_t cddcClkDiv; /*!< clock divide for cDDC processing */ + uint8_t interfaceClkDiv; /*!< clock divide for internal interface to Jtx */ + uint8_t bandRatio[ADRV904X_DDC_NUM_BAND]; /*!< rate relationship of cDDC to DDC-0/1 */ + uint8_t delayComp; /*!< bitmap enable for delay compensation */ + uint8_t delayMem; /*!< bitmap enable for delay memory */ + uint8_t delayChain; /*!< bitmap enable for delay memory daisy chain */ + uint8_t delayCarrierSelect[ADRV904X_NUM_CF_DELAY_FIFOS]; /*!< delay memory carrier selection */ + uint16_t delayValue[ADRV904X_NUM_CF_DELAY_FIFOS]; /*!< delay compensation value */ + uint8_t pwrMeasClkDiv; /*!< clock divide for cDDC power measurement block */ + + uint8_t reserved[1]; /*!< Reserve */ +} adrv904x_CarrierDdcConfig_t; +ADI_ADRV904X_PACK_FINISH + +/**************************************************************************** +* Carrier DUC (digital up-converter) structure. +****************************************************************************/ + ADI_ADRV904X_PACK_START +/*!< adrv904x_CarrierDucConfig: structure of Duc configuration parameters */ +typedef struct adrv904x_CarrierDucConfig +{ + adrv904x_CarrierChannelConfig_t carriers[ADRV904X_NUM_TX_CARRIERS]; /*!< carrier definitions */ + int16_t coefficients[ADRV904X_NUM_CF_COEFFICIENTS]; /*!< filter coefficients for entire cDUC */ + uint8_t slotTable[ADRV904X_JESD_MAX_CARRIER_SLOTS]; /*!< JESD slot mapping */ + uint8_t maxSlot; /*!< number of slots used */ + uint32_t slotValid_lower; /*!< bitmap indicating slot validity; bits 0 to 31 */ + uint32_t slotValid_upper; /*!< bitmap indicating slot validity; bits 32 to 63 */ + uint8_t cducBypass; /*!< bypass entire cDUC */ + uint8_t carriersEnabled; /*!< bitmap of enabled carriers */ + uint8_t cducClkDiv; /*!< clock divide for cDUC processing */ + uint8_t interfaceClkDiv; /*!< clock divide for internal interface to Jrx */ + uint8_t bandRatio[ADRV904X_DUC_NUM_BAND]; /*!< rate relationship of cDUC to DUC-0/1 */ + uint8_t delayComp; /*!< bitmap enable for delay compensation */ + uint8_t delayMem; /*!< bitmap enable for delay memory */ + uint8_t delayChain; /*!< bitmap enable for delay memory daisy chain */ + uint8_t delayCarrierSelect[ADRV904X_NUM_CF_DELAY_FIFOS]; /*!< delay memory carrier selection */ + uint16_t delayValue[ADRV904X_NUM_CF_DELAY_FIFOS]; /*!< delay compensation value */ + uint8_t bandAttenuation[ADRV904X_DUC_NUM_BAND]; /*!< band attenuation to ensure digital full scale is not exceeded */ + uint8_t pwrMeasClkDiv; /*!< clock divide for cDUC power measurement block */ + uint16_t txFlushCount; /*!< number of cycles required to zero output of cDUC */ + + uint8_t reserved[1]; /*!< Reserve */ +} adrv904x_CarrierDucConfig_t; +ADI_ADRV904X_PACK_FINISH + + +/**************************************************************************** +* Tx DFE (digital front-end) CFR (crest factor reduction) Pulse Data structure. +****************************************************************************/ +ADI_ADRV904X_PACK_START +/*!< adrv904x_TxDfeCfrCorrectionPulse: structure of Tx Dfe Cfr Correction pulse configuration parameters */ +typedef struct adrv904x_TxDfeCfrCorrectionPulse +{ + int16_t coeffRealHalfPulse[ADRV904X_MAX_CFR_CORRECTION_PULSE_LEN]; /*!< An array consisting of the first half of the Real part of the complex CFR correction pulse coefficients */ + int16_t coeffImagHalfPulse[ADRV904X_MAX_CFR_CORRECTION_PULSE_LEN]; /*!< An array consisting of the first half of the Imag part of the complex CFR correction pulse coefficients */ + uint16_t numCoeffs; /*!< No. of coefficients contained in coeffReal and coeffImaginary arrays */ + uint8_t pulseSelectMask; /*!< This field selects which pulses to write. adi_adrv904x_CfrPulseSel_e should be used to create this mask. + User can select multiple pulses */ + uint8_t ramSelectMask; /*!< Selects the RAM's to write the pulse data. adi_adrv904x_CfrPulseRamSel_e should be used to create this mask. + Please check adi_adrv904x_CfrPulseRamSel_e for detailed info */ +}adrv904x_TxDfeCfrCorrectionPulse_t; +ADI_ADRV904X_PACK_FINISH + +/**************************************************************************** +* Tx DFE (digital front-end) CFR (crest factor reduction) structure. +****************************************************************************/ + ADI_ADRV904X_PACK_START +/*!< adrv904x_TxDfeCfrConfig: structure of Tx Dfe Cfr configuration parameters */ +typedef struct adrv904x_TxDfeCfrConfig +{ + uint32_t inputRate_kHz; /*!< input sample rate in kHz */ + uint8_t cfr0Enable[ADRV904X_NUM_CFR_ENGINES]; /*!< enable engine (doesn't change delay) */ + uint8_t cfr0Bypass[ADRV904X_NUM_CFR_ENGINES]; /*!< bypass filter (including delay) */ + uint8_t cfr0Interpolation; /*!< log2 interpolation (shared by all engines) */ + uint16_t cfr0HalfPulseLength; /*!< number of samples stored in pulse RAM */ + uint16_t cfr0DelayValue[ADRV904X_NUM_CFR_ENGINES]; /*!< number of samples in delay FIFO */ + double cfr0EvmWeight[ADRV904X_NUM_TX_CARRIERS]; /*!< EVM weighting (no bitfield) */ + uint8_t cfr0NoCareSampleCount[ADRV904X_NUM_CFR_ENGINES]; /*!< maximum number of forgiven samples for cfr engine X */ + uint8_t cfr0PeakDuration[ADRV904X_NUM_CFR_ENGINES]; /*!< maximum number of samples that can be a part of a peak group */ + uint8_t cfr1Enable[ADRV904X_NUM_CFR_ENGINES]; /*!< enable engine (doesn't change delay) */ + uint8_t cfr1Bypass[ADRV904X_NUM_CFR_ENGINES]; /*!< bypass filter (including delay) */ + uint8_t cfr1Interpolation; /*!< log2 interpolation (shared by all engines) */ + uint16_t cfr1HalfPulseLength; /*!< number of samples stored in pulse RAM */ + uint16_t cfr1DelayValue[ADRV904X_NUM_CFR_ENGINES]; /*!< number of samples in delay FIFO */ + double cfr1EvmWeight[ADRV904X_NUM_TX_CARRIERS]; /*!< EVM weighting (no bitfield) */ + uint8_t cfr1NoCareSampleCount[ADRV904X_NUM_CFR_ENGINES]; /*!< maximum number of forgiven samples for cfr engine X */ + uint8_t cfr1PeakDuration[ADRV904X_NUM_CFR_ENGINES]; /*!< maximum number of samples that can be a part of a peak group */ + uint8_t inputRateOver500MHz; /*!< input rate > 500 MHz */ + uint8_t clk1Div; /*!< clock divide for Pulse RAMs and Processing */ + uint8_t clk2Div; /*!< clock divide for Input / Output / Delay RAM */ + uint8_t peakDetectClkDiv; /*!< clock divide for Peak Detector */ + adrv904x_TxDfeCfrCorrectionPulse_t cfr0PulseData; /*!< cfr0 pulse data */ + adrv904x_TxDfeCfrCorrectionPulse_t cfr1PulseData; /*!< cfr1 pulse data */ + + uint8_t reserved[2]; /*!< Reserve */ +} adrv904x_TxDfeCfrConfig_t; +ADI_ADRV904X_PACK_FINISH + +/**************************************************************************** +* Tx DFE (digital front-end) DPD (digital pre-distortion) structure. +****************************************************************************/ + ADI_ADRV904X_PACK_START +/*!< adrv904x_TxDfeDpdConfig: structure of Tx Dfe Dpd configuration parameters */ +typedef struct adrv904x_TxDfeDpdConfig +{ + uint32_t actRate_kHz; /*!< actuator sample rate in kHz */ + uint8_t actEnable; /*!< enable actuator */ + uint8_t preHb1Enable; /*!< enable HB1 interpolator */ + uint8_t preHb2Enable; /*!< enable HB2 interpolator */ + uint8_t postHb1Enable; /*!< enable HB1 decimator */ + uint8_t clk0Div; /*!< clock divide for input of pre HB1 */ + uint8_t clk1Div; /*!< clock divide for output of pre HB1 */ + uint8_t actClkDiv; /*!< clock divide for Actuator */ + uint8_t doutClkDiv; /*!< clock divide for output of post HB1 */ + uint8_t gmpTxCaptureSelect; /*!< GMP Tx data path capture point mux select */ + uint8_t ctEnable; /*!< Charge Trapping DPD enable */ + uint8_t ctFineDelay[ADRV904X_NUM_CT_DPD_DELAY_LINES]; /*!< Charge Trapping DPD delay line fine delay values */ + uint8_t ctCoarseDelay[ADRV904X_NUM_CT_DPD_DELAY_LINES]; /*!< Charge Trapping DPD delay line coarse delay values */ + uint8_t ctDpDelay; /*!< Charge Trapping DPD datapath delay */ + uint8_t ctDpFineDelay; /*!< Charge Trapping DPD datapath fine delay */ + uint8_t vswrTxCaptureSelect; /*!< VSWR Tx data path capture point mux select */ + uint8_t vswrRxCaptureSelect; /*!< VSWR Rx data path capture point mux select */ + uint8_t vswrDataGenClkDiv; /*!< clock divide for VSWR data generator */ + + uint8_t reserved[1]; /*!< Reserve */ +} adrv904x_TxDfeDpdConfig_t; +ADI_ADRV904X_PACK_FINISH + +/**************************************************************************** +* DFE (digital front-end) Tx configuration structure. +****************************************************************************/ + ADI_ADRV904X_PACK_START +/*!< adrv904x_DfeTxConfig: structure of Tx Dfe configuration parameters */ +typedef struct adrv904x_DfeTxConfig +{ + uint8_t txduc1Enable; /*!< include DUC1 output into datapath */ + adrv904x_CarrierDucConfig_t cduc; /*!< carrier digital up-convert */ + adrv904x_TxDfeCfrConfig_t cfr; /*!< crest factor reduction */ + adrv904x_TxDfeDpdConfig_t dpd; /*!< digital pre-distortion actuator */ + uint16_t bandDucLatency[ADRV904X_DUC_NUM_BAND]; /*!< Band DUC latency (in units of hsdigclk cycle count) per Band */ + uint8_t reserved[3]; /*!< Reserve */ + uint16_t cfrOutToPreDpdDelayNormFs4x; /*!< delay from cfr out to capture point (HB1 or HB2) adjusted to hsdig */ + uint16_t capPointToPostDpdOutDelayNormFs4x; /*!< delay from capture point (HB1 or HB2) to post dpd hb decimator adjusted to hsdig */ + uint16_t cfrOutToPostDpdOutDelayNormFs4x; /*!< delay from cfr out to post dpd hb decimator adjusted to hsdig */ + uint8_t cicSecondInterpRatio; /*!< second stage CIC interpolator ratio */ + uint8_t ctcPreDpdInputSelect; /*!< Ctc Pre DPD mux select. 1:Hb1 ouput , 0:Hb2 output */ +} adrv904x_DfeTxConfig_t; +ADI_ADRV904X_PACK_FINISH + +/**************************************************************************** +* DFE (digital front-end) Rx configuration structure. +****************************************************************************/ + ADI_ADRV904X_PACK_START +/*!< adrv904x_DfeRxConfig: structure of Rx Dfe configuration parameters */ +typedef struct adrv904x_DfeRxConfig +{ + adrv904x_CarrierDdcConfig_t cddc; /*!< carrier digital down-convert */ + uint16_t bandDdcLatency[ADRV904X_DDC_NUM_BAND]; /*!< Band DDC latency (in units of hsdigclk cycle count) per Band */ + uint8_t reserved[4]; /*!< Reserve */ +} adrv904x_DfeRxConfig_t; +ADI_ADRV904X_PACK_FINISH +/**************************************************************************** +* Radio Sequencuer structure. +****************************************************************************/ +/* _ADI_SVC_PROFILE_SPECIFIC_START */ + +typedef enum +{ + _ADI_SVC_PROFILE_RADIO_SEQ_NUMEROLOGY_0 = 0, + _ADI_SVC_PROFILE_RADIO_SEQ_NUMEROLOGY_1 = 1, + _ADI_SVC_PROFILE_RADIO_SEQ_NUMEROLOGY_2 = 2, + _ADI_SVC_PROFILE_RADIO_SEQ_NUMEROLOGY_2_ECP = 3, + _ADI_SVC_PROFILE_RADIO_SEQ_NUMEROLOGY_3 = 4, + _ADI_SVC_PROFILE_RADIO_SEQ_NUMEROLOGY_4 = 5, + _ADI_SVC_PROFILE_RADIO_SEQ_NUMEROLOGY_INVALID = 6 +} _adi_svc_ProfileRadioSeqNumerology_e; + +/* _ADI_SVC_PROFILE_SPECIFIC_END */ + + ADI_ADRV904X_PACK_START +/*!< adrv904x_DfeRadioSequencerConfig: structure of Dfe Radio Sequencer configuration parameters */ +typedef struct adrv904x_DfeRadioSequencerConfig +{ + uint8_t radioSeqEn; /*!< Radio sequencer top level enable */ + uint8_t sampleClkEn; /*!< Radio sequencer sampling clock enable */ + uint32_t sampleClkFreqInKhz; /*!< Radio sequencer sampling clock frequency in kHz. */ + uint8_t sampleClkDiv; /*!< Radio sequencer sampling clock. Power of 2 encoding */ + uint8_t ssbSyncMode; /*!< Radio sequencer SSB frame sync mode */ + uint32_t ssbSyncPeriod; /*!< Radio sequencer SSB sync duration */ + uint32_t numerology; /*!< Radio sequencer numerology */ + uint16_t symWidth; /*!< Radio sequencer nominal symbol duration */ + uint16_t extSymWidth; /*!< Radio sequencer extended symbol duration */ + uint16_t extSymSpacing; /*!< Radio sequencer spacing between consecutive extended symbols */ + uint8_t reserved[2]; /*!< Reserve */ +}adrv904x_DfeRadioSequencerConfig_t; +ADI_ADRV904X_PACK_FINISH + + +/**************************************************************************** +* FSC structure. +****************************************************************************/ +ADI_ADRV904X_PACK_START +/*!< adrv904x_FscConfig: structure of Fsc configuration parameters */ +typedef struct adrv904x_FscConfig +{ + uint8_t lbn; /*!< Tx loopback samples per FSC clock - numerator */ + uint8_t lbd; /*!< Tx loopback samples per FSC clock - denominator exponent */ + uint8_t lbw; /*!< Tx loopback samples per FSC clock - denominator weight */ + uint8_t txn; /*!< Tx samples per FSC clock - numerator */ + uint8_t txd; /*!< Tx samples per FSC clock - denominator exponent */ + uint8_t txw; /*!< Tx samples per FSC clock - denominator weight */ + uint8_t rxn; /*!< Rx samples per FSC clock - numerator */ + uint8_t rxd; /*!< Rx samples per FSC clock - denominator exponent */ + uint8_t rxw; /*!< Rx samples per FSC clock - denominator weight */ + uint8_t fastClkDiv; /*!< Fast clock divider */ + uint8_t slowClkDiv; /*!< Slow clock divider */ + uint32_t fastClk_kHz; /*!< Fast clock in kHz */ + uint32_t slowClk_kHz; /*!< Slow clock in kHz */ +} adrv904x_FscConfig_t; +ADI_ADRV904X_PACK_FINISH + +/**************************************************************************** +* Profile information that will define the Receiver channel. +****************************************************************************/ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_RxConfig +{ + uint32_t ibw_kHz; /*!< Rx instantaneous bandwidth in kHz. */ + uint32_t ibwCenterFreq_kHz; /*!< Rx instantaneous center freq in kHz. */ + uint32_t tia1dB_Bw_kHz; /*!< Rx TIA bandwith (1db) in kHz. */ + uint32_t tia3dB_Bw_kHz; /*!< Rx TIA bandwith (3db) in kHz. */ + uint32_t adcClockRate_kHz; /*!< ADC clock rate in kHz */ + uint32_t iQRate_kHz; /*!< I/Q data rate at RxQEC in kHz */ + uint32_t rxOutputRate_kHz; /*!< Output data rate in kHz */ + uint32_t pfirOutputRate_kHz; /*!< Output data at the Pfir in kHz */ + uint32_t routRate_kHz; /*!< ROUT in kHz */ + uint8_t totalDecimation; /*!< Total RX decimation */ + adrv904x_NcoShifter_t rxddc[ADRV904X_DDC_NUM_BAND]; /*!< NCO Shifter */ + uint8_t dpFilterSel; /*!< Selectes Dec Mode */ + uint8_t reserved1; /*!< Reserved */ + uint8_t hb2Enable; /*!< HB 2 enable setting */ + uint8_t rxRinClkDiv; /*!< Rx RIN clock divider setting */ + uint8_t rxAgcClkDiv; /*!< Rx AGC clock setting*/ + uint8_t rxDcOffsetDiv; /*!< Rx DC Offset setting */ + uint8_t rxFir1InClkDiv; /*!< Rx FIR1 clock divider setting */ + uint8_t rxFir2InClkDiv; /*!< Rx FIR2 clock divider setting */ + uint8_t rxHb2InClkDiv; /*!< Rx HB2 in clock divider setting */ + uint8_t rxHb2OutClkDiv; /*!< Rx HB2 out clock divider setting */ + uint32_t rxHb2OutClk_kHz; /*!< Rx HB2 out clock setting */ + uint8_t routClkDiv; /*!< Rx ROUT out clock divider setting */ + adrv904x_RxPfirData_t rxPfirBank; /*!< Rx PFIR Bank */ + adrv904x_ClkGenConfig_t clkGenConfig; /*!< Rx clock gen settings */ + uint8_t loLeafDiv; /*!< LO Leaf Divider /1 /2 /4 */ + uint8_t clkdiv1p5enable; /*!< Resampling clock enable 1p5 */ + uint8_t clkdiv1p3enable; /*!< Resampling clock enable 1p3 */ + + uint8_t reserved[10]; /*!< Reserved */ +} adrv904x_RxConfig_t; +ADI_ADRV904X_PACK_FINISH + + +/**************************************************************************** +* Profile information that will define the Transmitter channel. +****************************************************************************/ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_TxConfig +{ + uint32_t ibw_kHz; /*!< Tx instantaneous bandwidth in kHz. */ + uint32_t ibwCenterFreq_kHz; /*!< Tx instantaneous center freq in kHz. */ + uint32_t butterFilter_kHz; /*!< Tx butter filter BW for TxBBF in kHz */ + uint32_t txDacRate_kHz; /*!< Tx dac rate in kHz*/ + uint32_t txOutputRate_kHz; /*!< Tx output rate in kHz*/ + adrv904x_NcoShifter_t txduc[ADRV904X_DUC_NUM_BAND]; /*!< ncoShifterA NCO Shifter */ + uint8_t txFir1Enable; /*!< Transmitter FIR 1 setting. */ + uint8_t txFir2Enable; /*!< Transmitter FIR 2 setting. */ + uint8_t txFir3Enable; /*!< Transmitter FIR 3 setting. */ + uint8_t txInt3Enable; /*!< Transmitter interpolate by 3 setting. */ + uint8_t txPfirClkDiv; /*!< PFIR Clock Divider setting */ + uint32_t txPfirClk_kHz; /*!< PFIR Clock setting in kHz*/ + uint8_t txDacClkDiv; /*!< Tx DAC Clock Divider setting */ + uint8_t txToutClockDiv; /*!< Clock divider for output clock rate of Tx datapath (to DAC input) */ + uint8_t txFir2OutClkDiv; /*!< FIR2 output rate clock divider value */ + uint8_t txFir1InClkDiv; /*!< FIR1 input rate clock divider value */ + uint8_t txFir2InClkDiv; /*!< FIR1 input rate clock divider value */ + uint8_t txFir1OutClkDiv; /*!< FIR1 output rate clock divider value */ + uint8_t txAttenClkDiv; /*!< Tx Atten clock divider */ + uint8_t lpbkHb1OutClkDiv; /*!< Loopback HB1 divider setting */ + uint32_t lpbkHb1OutRate_kHz; /*!< Loopback HB1 Output rate in kHz*/ + uint8_t lpbkHb1enb; /*!< Loopback 1 enable */ + uint8_t lpbkReSampleEnb; /*!< Resample filter enable */ + int16_t lbbkResampFilter[10]; /*!< Resample filter Coef */ + int32_t lpbkCoarseNcoFtw; /*!< Loopback course NCO setting */ + uint32_t lpbkAdcClkRate_kHz; /*!< Loopback ADC clock setting in kHz*/ + adrv904x_ClkGenConfig_t txClkGenConfig; /*!< Tx clock gen settings */ + adrv904x_ClkGenConfig_t lpbkClkGenConfig; /*! Loopback clock gen settings */ + uint8_t overloadHb1ThresPre; /*! The pre-threshold value to be compared with magnitude. */ + uint8_t overloadHb1Thres; /*! The threshold value to be compared with I^2+Q^2 when in power mode, after pre_threshold met. */ + uint8_t overloadMode; /*! When this bit is set, the I^2+Q^2 power is compared with the threshold(power mode) */ + uint8_t overloadEn; /*! When this bit is set, the overload detector at output of lpbk hb1 is enabled. */ + uint8_t peakCountThresHb1; /*! The threshold value used to be compared with the peak counter. */ + uint8_t peakCountSpacing; /*! Defines the spacing between two peaks counted towards the peak count threshold. */ + uint8_t peakWinSize; /*! Defines the window of measurement size(number of cycles) */ + uint8_t peakCount; /*! With in the peak_window_size_hb1, this bitfield defines the minimum number of peaks need */ + uint8_t peakExperation; /*! Peak counter is cleared every peak count expiration period */ + adrv904x_FscConfig_t fscConfig; /*!< FSC config settings */ + uint8_t loLeafDiv; /*!< LO Leaf Divider /1 /2 /4 */ + uint8_t quadDiv; /*!< /2 or /4 HRM mixer divider */ + uint8_t dacPowerDownDiv_i; /*!< DAC PowerDown divider I */ + uint8_t dacPowerDownDiv_q; /*!< DAC PowerDown divider Q */ + uint8_t dacPowerUpDiv_i; /*!< DAC PowerUp divider I */ + uint8_t dacPowerUpDiv_q; /*!< DAC PowerUp divider Q */ + uint32_t maxTxSynBw_kHz; /*!< Maximum Tx synthesis bandwidth */ + uint32_t maxTxInstBw_kHz; /*!< Maximum Tx instantaneous bandwidth */ + uint32_t maxTxTestToneBw_kHz; /*!< Maximum BW over which a test tonne can be transmitted */ + uint8_t txAttenDelay; /*!< Tx atten delay */ + uint8_t lowNoiseModeEnb; /*!< Low noise mode operation state */ + + uint8_t reserved[2]; /*!< Reserved */ +} adrv904x_TxConfig_t; +ADI_ADRV904X_PACK_FINISH + +/**************************************************************************** +* Profile information that will define the Observation Receiver channel. +****************************************************************************/ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_OrxConfig +{ + uint32_t sbw_kHz; /*!< Orx instantaneous bandwidth in kHz. */ + uint32_t sbwCenterFreq_kHz; /*!< Orx instantaneous center freq in kHz. */ + uint32_t adcClockRate_kHz; /*!< ADC Clock rate in kHz */ + uint32_t iQRate_kHz; /*!< I/Q Sample rate in kHz */ + uint32_t orxOutputRate_kHz; /*!< Orx Output Rate in kHz. */ + uint32_t orxRinClockRate_kHz; /*!< Orx RIN Clock Rate in kHz */ + uint32_t orxHb2OutRate_kHz; /*!< Orx HB2 effective output rate (sample rate, not clock rate) */ + uint32_t orxHb1OutRate_kHz; /*!< Orx HB1 effective output rate */ + uint8_t totalDecimation; /*!< Total Orx decimation */ + uint8_t dec3Enable; /*!< Decimation 3 enable setting (NOT SURE IF THESE ARE NEEDED) */ + uint8_t stageMode; /*!< Stage Mode */ + uint8_t fir2Enable; /*!< Fir2 enable (NOT SURE IF THESE ARE NEEDED) */ + uint8_t fir1Enable; /*!< Fir 1 enable (NOT SURE IF THESE ARE NEEDED)*/ + uint8_t hb2Enable; /*!< HB2 enable setting. */ + uint8_t hb1Enable; /*!< HB1 enable setting. */ + uint8_t rinEnable; /*!< RIN enable setting. */ + uint8_t orxRinClkDiv; /*!< ORX Rin clock divider */ + uint8_t orxRoutClkDiv; /*!< ORX Rout clock divider */ + uint8_t orxFir1ClkDiv; /*!< ORX Fir in clock divider */ + uint8_t orxHb2OutClkDiv; /*!< ORX HB2 out clock divider */ + uint8_t orxHb2InClkDiv; /*!< ORX HB2 in clock divider */ + uint8_t stageModeClkDiv; /*!< ORX Stage Mode clock divider */ + uint8_t orxHb1OutClkDiv; /*!< ORX HB1 out clock divider */ + int32_t orxAdcOutNcoFreq_kHz; /*!< Default Orx ADC output NCO frequency in KHz */ + int32_t orxDpNcoFreq_khz; /*!< Default Orx Datapath NCO frequency in KHz */ + int32_t orxAdcOutNcoFreqArray_kHz[ADRV904X_NUM_TX_PROFILES]; /*!< Orx ADC output NCO frequency in KHz, per Tx Profile */ + int32_t orxDpNcoFreqArray_kHz[ADRV904X_NUM_TX_PROFILES]; /*!< Orx Datapath NCO frequency in KHz, per Tx Profile */ + uint8_t orxLolPathDelayHb2Out[ADRV904X_NUM_TX_PROFILES]; /*!< Tx-to-ORx path delay used by LOL cal (in samples at the Tx PFIR/LOL rate) */ + uint8_t orxLolPathDelayHb1Out[ADRV904X_NUM_TX_PROFILES]; /*!< Tx-to-ORx path delay used by LOL cal (in samples at the Tx PFIR/LOL rate) */ + adrv904x_ClkGenConfig_t clkGenConfig; /*!< Orx clock gen settings */ + uint8_t reserved[9]; /*!< Reserved */ +} adrv904x_OrxConfig_t; +ADI_ADRV904X_PACK_FINISH + + +/**************************************************************************** +* Profile information that will define the Radio Configuration +* Profile struct holds clock rates, divider ratios, sampling rates, etc. +****************************************************************************/ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_RadioProfile +{ + adrv904x_Version_t deviceProfileVersion; /*!< Device Profile version. Use for easy checking between Configurator and API */ + uint32_t hsDigFreq_kHz; /*!< System HS Dig clock setting calculated by the API in kHz. */ + uint32_t deviceClkFreq_kHz; /*!< System device clock setting, in multiples of 61.44 in kHz. */ + uint32_t deviceClkScaledFreq_kHz; /*!< System device clock scaled setting */ + uint32_t refClkFreq_kHz; /*!< Reference clock frequency in kHz */ + uint32_t armClkFreq_kHz; /*!< ARM clock frequency in kHz */ + uint8_t padDiv; /*!< Pad divider */ + uint8_t armClkDiv; /*!< ARM clock Divider */ + uint8_t armClkDivDevClk; /*!< ARM clock Divider when on DevClk */ + uint8_t hsDigDiv; /*!< HS Dig h/w divider */ + uint8_t ncoGoldenClkDiv; /*!< NCO Golden counter divider value */ + uint8_t clkGenSel; /*!< PLL select (Serdes or ClkPLL). Typically ClkPll will be selected but for debug it will be possible to use Serdes. */ + adrv904x_ClkGenConfig_t clkGenConfig; /*!< System clock gen settings */ + uint8_t loPhaseSync; /*!< 0 = Dont Sync; 1 = Run Init and sync; 2 = Run init and Continuous tracking */ + adrv904x_PllConfig_t clkPll; /*!< Clock PLL structure */ + adrv904x_PllConfig_t rf0Pll; /*!< RF0 PLL structure (EAST) */ + adrv904x_PllConfig_t rf1Pll; /*!< RF1 PLL structure (WEST) */ + uint8_t rf0MuxEastTx; /*!< RF0 (East) is connect to Tx when set. */ + uint8_t rf0MuxWestTx; /*!< RF0 (West) is connect to Tx when set. */ + uint8_t rf0MuxEastRx; /*!< RF0 (East) is connect to Rx when set. */ + uint8_t rf0MuxWestRx; /*!< RF0 (West) is connect to Rx when set. */ + uint32_t chanConfig; /*!< Channel config. B0=Tx0, B1=Tx1,--- B7=Tx7, B8=Rx0, B9=Rx1 -- B15=Rx7, B16=Orx0, B17=Orx1 */ + uint8_t chanAssign[ADRV904X_NUM_TXRX_CHAN]; /*!< This is used to reference a channel to a rx/tx profile def'n in rxConfig/txConfig */ + adrv904x_RxConfig_t rxConfig[ADRV904X_NUM_RX_PROFILES]; /*!< Receiver profile for 0-3 */ + adrv904x_TxConfig_t txConfig[ADRV904X_NUM_TX_PROFILES]; /*!< Transmitter profile for 0-3 */ + adrv904x_TxPfirData_t txPfirBank[ADRV904X_NUM_TXRX_CHAN]; /*!< Tx PFIR Bank */ + uint8_t rxTxCpuConfig[ADRV904X_NUM_TXRX_CHAN]; /*!< Defines which CPU each channel is assigned to */ + adrv904x_OrxConfig_t orxConfig[ADRV904X_NUM_ORX_PROFILES]; /*!< Observation Receiever profile for channels 0-1 */ + uint8_t orxCpuConfig[ADRV904X_NUM_ORX_PROFILES]; /*!< This defines which cpu an Orx channel is allocated to. */ + adrv904x_PllConfig_t serdesPll; /*!< Serdes PLL structure */ + adrv904x_JesdSettings_t jesdProfile; /*!< Jesd configuration */ + uint8_t pid; /*!< PID */ + uint8_t productId[20]; /*!< Product ID */ + uint8_t featureMask[16]; /*!< 128 bits of Feature Mask */ + uint8_t reserved[8]; /*!< Reserved (adjust so Device profile size is multiple of 4 bytes) */ + uint32_t profileChecksum; /*!< Checksum of the entire profile excluding ADC profiles, Using the CRC32 algorithm */ +} adrv904x_RadioProfile_t; +ADI_ADRV904X_PACK_FINISH + +ADI_ADRV904X_PACK_START +/*!< adrv904x_DfeProfile structure containing the DFE device profile */ +typedef struct adrv904x_DfeProfile +{ + adrv904x_DfeRxConfig_t rxConfig[ADRV904X_NUM_RX_PROFILES]; /*!< Receiver profile for 0-3 */ + adrv904x_DfeTxConfig_t txConfig[ADRV904X_NUM_TX_PROFILES]; /*!< Transmitter profile for 0-3 */ + adrv904x_DfeJesdSettings_t jesdProfile; /*!< Jesd configuration */ + adrv904x_DfeRadioSequencerConfig_t radioSeqProfile; /*!< Radio Sequencer configuration */ + uint8_t radioDivDuplexMode[ADRV904X_NUM_TXRX_CHAN]; /*!< This is used to reference a channel's operating mode (TDD or FDD) */ + uint32_t dfeMappingControl; /*!< This variable selects how Tx/Rx/Orx En signals and TxToOrx mapping is controlled. For detailed info please check the adrv904x_DfeMappingControl_e enum documentation */ + +} adrv904x_DfeProfile_t; +ADI_ADRV904X_PACK_FINISH + +/**************************************************************************** +* Profile information provided by BBIC at init via CONFIG command +****************************************************************************/ +ADI_ADRV904X_PACK_START +typedef struct adrv904x_DeviceProfile +{ + adrv904x_RadioProfile_t radioProfile; /*!< Radio configuration parameters */ + adrv904x_DfeProfile_t dfeProfile; /*!< DFE configuration parameters */ + uint32_t profileChecksum; /*!< Checksum of the entire profile using the CRC32 algorithm */ +} adrv904x_DeviceProfile_t; +ADI_ADRV904X_PACK_FINISH + +#define ADRV904X_DEVICE_PROFILE_SIZE_BYTES sizeof(adrv904x_DeviceProfile_t) /* about 2440 bytes */ +#define ADRV904X_RADIO_PROFILE_SIZE_BYTES sizeof(adrv904x_RadioProfile_t) +#define ADRV904X_DFE_PROFILE_SIZE_BYTES sizeof(adrv904x_DfeProfile_t) + +/* Constant for adrv904x_RuntimeProfile_t signature1 field */ +#define ADRV904X_RUNTIME_PROFILE_SIGNATURE1 (0x55AADD11UL) + +ADI_ADRV904X_PACK_START +typedef struct adrv904x_RuntimeProfile +{ + uint32_t signature1; /*!< Magic number to indicate that profile data is valid */ + uint32_t hsDigFreq_kHz; /*!< System HS Dig clock setting in kHz */ + uint32_t txPfirSampleRate_kHz[ADRV904X_NUM_TXRX_CHAN]; /*!< DUC sampling rate for Tx in kHz */ + uint32_t txNcoMixerSampleRate_kHz[ADRV904X_NUM_TXRX_CHAN]; /*!< DUC NCO sampling rate for Tx in kHz */ + uint32_t orxOutputRate_kHz[ADRV904X_NUM_ORX_CHAN]; /*!< Orx output sample rate */ + uint32_t orxHb1OutRate_kHz[ADRV904X_NUM_ORX_CHAN]; /*!< Orx HB1 effective output sample rate */ + uint32_t orxHb2OutRate_kHz[ADRV904X_NUM_ORX_CHAN]; /*!< Orx HB2 effective output sample rate */ + int32_t orxDpNcoFreqArray_kHz[ADRV904X_NUM_ORX_CHAN]; /*!< Orx NCO freqency in khz */ + uint32_t txLo0Freq_kHz; /*!< Tx Lo0 frequency in kHz */ + uint32_t txLo1Freq_kHz; /*!< Tx Lo1 frequency in kHz */ + uint32_t txChanConfig; /*!< Tx Channel enable/disable bitmask */ + uint32_t rxChanConfig; /*!< Rx Channel enable/disable bitmask */ + uint32_t orxChanConfig; /*!< ORx Channel enable/disable bitmask */ + + uint32_t dpdSampleRate_kHz[ADRV904X_NUM_TXRX_CHAN]; /*!< DPD sampling rate in kHz */ + uint8_t dpdActEnable[ADRV904X_NUM_TXRX_CHAN]; /*!< DPD activate enable */ + uint8_t dpdPreHb1Enable[ADRV904X_NUM_TXRX_CHAN]; /*!< DPD Pre-HB1 enable */ + uint8_t dpdPreHb2Enable[ADRV904X_NUM_TXRX_CHAN]; /*!< DPD Pre-HB2 enable */ + uint8_t dpdPostHb1Enable[ADRV904X_NUM_TXRX_CHAN]; /*!< DPD Post-HB1 enable */ + uint8_t orxHb2Enable[ADRV904X_NUM_ORX_CHAN]; /*!< ORx HB2 enable */ + uint8_t pad0; /*!< padding for U32 word alignment */ + uint8_t pad1; /*!< padding for U32 word alignment */ + uint8_t cfr0Enable[ADRV904X_NUM_TXRX_CHAN][ADRV904X_NUM_CFR_ENGINES]; /*!< CFR 0 enable */ + uint8_t cfr1Enable[ADRV904X_NUM_TXRX_CHAN][ADRV904X_NUM_CFR_ENGINES]; /*!< CFR 1 enable */ + uint32_t cfrRate[ADRV904X_NUM_TXRX_CHAN]; /*!< CFR rate */ + uint32_t actRateKhz[ADRV904X_NUM_TXRX_CHAN]; /*!< DPD actuator Rate in kHz */ + uint32_t armClkFreq_kHz; /*!< ARM clock frequency in kHz */ + uint32_t ssbSyncPeriod; /*!< Radio sequencer SSB sync duration */ + uint32_t radioSeqEn; /*!< Radio sequencer top level enable */ + uint32_t numerology; /*!< Radio sequencer numerology */ + uint8_t radioDivDuplexMode[ADRV904X_NUM_TXRX_CHAN]; /*!< This is used to reference a channel's operating mode (TDD or FDD) */ + uint8_t rxDdcHb1OutputClkDiv[ADRV904X_NUM_TXRX_CHAN][ADRV904X_DDC_NUM_BAND]; /*!< This is used to calculate sampling rate for main path RSSI blocks */ + uint32_t txCarrierTssiSampleRate_kHz[ADRV904X_NUM_TXRX_CHAN][ADRV904X_NUM_TX_CARRIERS]; /*!< Tx carrier TSSI sample rate in kHz */ + uint32_t rxCarrierRssiSampleRate_kHz[ADRV904X_NUM_TXRX_CHAN][ADRV904X_NUM_RX_CARRIERS]; /*!< Tx carrier TSSI sample rate in kHz */ + uint32_t dfeMappingControl; /*!< This variable selects how Tx/Rx/Orx En signals and TxToOrx mapping is controlled. For detailed info please check adrv904x_DfeMappingControl_e enum documentation */ + uint8_t clk0Div[ADRV904X_NUM_TXRX_CHAN]; /*!< Clock Divider Ratio for input data of dpd_top cfr clock divide */ + uint8_t clk1Div[ADRV904X_NUM_TXRX_CHAN]; /*!< Clock Divider Ratio for output of HB1 Interpolator */ + uint8_t actClkDiv[ADRV904X_NUM_TXRX_CHAN]; /*!< Clock Divider Ratio for DPD Actuator Clock */ + uint8_t doutClkDiv[ADRV904X_NUM_TXRX_CHAN]; /*!< Clock Divider Ratio for Output Data of DPD Actuator Block */ + uint16_t cfrOutToPreDpdDelayNormFs4x[ADRV904X_NUM_TXRX_CHAN]; /*!< delay from CFR output to pre DPD capture point (HB1 or HB2) delay adjusted to hsdig */ + uint16_t capPointToPostDpdOutDelayNormFs4x[ADRV904X_NUM_TXRX_CHAN]; /*!< delay from pre DPD capture point (HB1 or HB2) to post dpd hb decimator adjusted to hsdig */ + uint16_t cfrOutToPostDpdOutDelayNormFs4x[ADRV904X_NUM_TXRX_CHAN]; /*!< delay from cfr out to post dpd hb decimator adjusted to hsdig */ + uint8_t cicSecondInterpRatio[ADRV904X_NUM_TXRX_CHAN]; /*!< second stage CIC interpolator ratio */ + uint8_t ctcPreDpdInputSelect[ADRV904X_NUM_TXRX_CHAN]; /*!< Ctc Pre DPD mux select. 1:Hb1 ouput , 0:Hb2 output */ + /* NOTE: If parameters are added, they must align to U32 or U64 word boundaries. + * Be sure to add padding bytes as necessary. + * Example: add "uint16_t someU16Param;" would require 2 uint8_t or 1 uint16_t padding parameter. + */ +} adrv904x_RuntimeProfile_t; +ADI_ADRV904X_PACK_FINISH + + +/**************************************************************************** +* Mailbox buffer shared between DFE and radio CPUs +****************************************************************************/ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_MailboxDfeToRadio +{ + uint32_t buffer[4]; /*!< Mailbox Buffer for A55 to M4 CPU */ +} adrv904x_MailboxDfeToRadio_t; +ADI_ADRV904X_PACK_FINISH + +#endif /* ADRV904X_CPU_DEVICE_PROFILE_TYPES_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_dfe_init_memory.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_dfe_init_memory.h new file mode 100644 index 00000000000..459afc9254b --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_dfe_init_memory.h @@ -0,0 +1,43 @@ +/** + * Copyright 2020 - 2021 Analog Devices Inc. + * Released under the ADRV904X Software license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file + * \brief This file contains DFE memory definitions + * + * DFE SDK API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_CPU_DFE_PROFILE_INIT_MEMORY_H__ +#define __ADRV904X_CPU_DFE_PROFILE_INIT_MEMORY_H__ + +#include "adrv904x_cpu_device_profile_types.h" + +#include "adrv904x_dfe_svc_radio_ctrl_sequencer_t.h" +#define _ADI_ADRV904X_DFE_RS_INIT_SIZE_BYTES (8200U) /*!< Size of RS init memory placeholder */ + +/**************************************************************************** +* Data structure to be loaded at the end of DFE proc memory before boot time. +* DFE processor will move this block of data to its final destination during boot +* so that this memory region can be reclaimed after boot. +* +* DFE FW can access the members of this structure at the end of L4 memory region +* E.g. DFE profile temporary address can be calculated as follows: +* ADRV904X_DFE_CODE_MEM_REGION_END - sizeof(adrv904x_DfeMemInitTemp_t) + offsetof(adrv904x_DfeMemInitTemp_t, deviceProfile) +****************************************************************************/ +ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeMemInitTemp +{ + adrv904x_DeviceProfile_t deviceProfile; /*!< DFE profile */ + uint32_t dfeImageCrc; /*!< DFE Image CRC */ + adrv904x_DfeSvcRadioCtrlSequencerInitData_t radioSeqInitData; /*!< Radio sequencer init data */ + uint8_t swBootFlag; /*!< FW boot flag to be set by BBIC */ +} adrv904x_DfeMemInitTemp_t; +ADI_ADRV904X_PACK_FINISH + +#endif /* __ADRV904X_CPU_DFE_PROFILE_INIT_MEMORY_H__*/ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_error_codes_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_error_codes_types.h new file mode 100644 index 00000000000..642fead3eeb --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_error_codes_types.h @@ -0,0 +1,3266 @@ + /** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + + /** + * \file adrv904x_cpu_error_codes_types.h + * + * \brief Contains CPU Error code definitions + * + * \details Contains CPU Error code definitions + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_CPU_ERROR_CODES_TYPES_H__ +#define __ADRV904X_CPU_ERROR_CODES_TYPES_H__ + +#include "adrv904x_cpu_object_ids_types.h" +#include "adi_adrv904x_platform_pack.h" + +#define ADRV904X_CPU_SYSTEM_ERROR_CODE_START 0xFF00u /*!< 0xFF00 - Starting System Related Error codes */ + +#define ADRV904X_CPU_RC_TUNER_CAL_CODE_ERROR_START (ADRV904X_CPU_OBJID_IC_RC_TUNER << 8u) /*!< 0x0000 - Starting RC Tuner Error code */ +#define ADRV904X_CPU_DC_OFFSET_RX_CAL_CODE_ERROR_START (ADRV904X_CPU_OBJID_IC_RX_DC_OFFSET << 8u) /*!< 0x0100 - Starting DC Offset Rx Error code */ +#define ADRV904X_CPU_ADC_RX_CAL_CODE_ERROR_START (ADRV904X_CPU_OBJID_IC_ADC_RX << 8u) /*!< 0x0200 - Starting RX ADC Error code */ +#define ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START (ADRV904X_CPU_OBJID_IC_ADC_ORX << 8u) /*!< 0x0300 - Starting ORX ADC Error code */ +#define ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START (ADRV904X_CPU_OBJID_IC_ADC_TXLB << 8u) /*!< 0x0400 - Starting TxLB ADC Error code */ +#define ADRV904X_CPU_TXDAC_CAL_ERROR_START (ADRV904X_CPU_OBJID_IC_TXDAC << 8u) /*!< 0x0500 - Starting TxDAC Error code */ +#define ADRV904X_CPU_BBF_TX_CAL_CODE_ERROR_START (ADRV904X_CPU_OBJID_IC_TXBBF << 8u) /*!< 0x0600 - Starting BBF Tx Error code */ +#define ADRV904X_CPU_PATH_DLY_CAL_CODE_ERROR_START (ADRV904X_CPU_OBJID_IC_TXLB_PATH_DLY << 8u) /*!< 0x0700 - Starting Pathdelay Error code */ +#define ADRV904X_CPU_TX_ATTEN_CAL_CODE_ERROR_START (ADRV904X_CPU_OBJID_IC_TX_ATTEN_CAL << 8u) /*!< 0x0800 - Starting TxAtten Error code */ +#define ADRV904X_CPU_HRM_CAL_CODE_ERROR_START (ADRV904X_CPU_OBJID_IC_HRM << 8u) /*!< 0x0900 - Starting HRM Error code */ +#define ADRV904X_CPU_TXLOL_INIT_CAL_CODE_ERROR_START (ADRV904X_CPU_OBJID_IC_TXLOL << 8u) /*!< 0x0B00 - Starting TxLOL Error code */ +#define ADRV904X_CPU_SERDES_CODE_ERROR_START (ADRV904X_CPU_OBJID_IC_SERDES << 8u) /*!< 0x0C00 - Starting SERDES Error code */ +#define ADRV904X_CPU_TXLB_FILTER_CAL_CODE_ERROR_START (ADRV904X_CPU_OBJID_IC_TXLB_FILTER << 8u) /*!< 0x1000 - Starting TxLB Filter Error code */ +#define ADRV904X_CPU_TXRX_PHASE_CAL_CODE_ERROR_START (ADRV904X_CPU_OBJID_IC_TXRX_PHASE << 8u) /*!< 0x1100 - Starting Tx/Rx Phase Error code */ +#define ADRV904X_CPU_RXQEC_CAL_CODE_ERROR_START (ADRV904X_CPU_OBJID_TC_RXQEC << 8u) /*!< 0x3000 - Starting RX QEC Error code */ +#define ADRV904X_CPU_TXLOL_TRACK_CAL_CODE_ERROR_START (ADRV904X_CPU_OBJID_TC_TX_LOL << 8u) /*!< 0x3100 - Starting TX LOL Error code */ +#define ADRV904X_CPU_TXQEC_CAL_CODE_ERROR_START (ADRV904X_CPU_OBJID_TC_TXQEC << 8u) /*!< 0x3200 - Starting TX QEC Error code */ + +#define ADRV904X_CPU_CFG_DEVICE_PROFILE_ERROR_CODE_START (ADRV904X_CPU_OBJID_CFG_DEVICE_PROFILE << 8u) /*!< 0x8000 - Starting Device Profile Error code */ +#define ADRV904X_CPU_CFG_PARITY_ERROR_CODE_START (ADRV904X_CPU_OBJID_CFG_PARITY_ERROR_CHECK << 8u)/*!< 0x8500 - Starting Parity Error codes*/ +#define ADRV904X_CPU_NCO_DRV_ERROR_CODE_START (ADRV904X_CPU_OBJID_DRV_NCO << 8u) /*!< 0xB000 - Starting NCO driver Error code */ +#define ADRV904X_CPU_STREAM_DRV_ERROR_CODE_START (ADRV904X_CPU_OBJID_DRV_STREAM << 8u) /*!< 0xB100 - Starting Stream driver Error codes */ +#define ADRV904X_CPU_FSC_DRV_ERROR_CODE_START (ADRV904X_CPU_OBJID_DRV_FSC << 8u) /*!< 0xB200 - Starting FSC driver Error codes */ +#define ADRV904X_CPU_MASTER_BIAS_DRV_ERROR_CODE_START (ADRV904X_CPU_OBJID_DRV_MASTER_BIAS << 8u) /*!< 0xB300 - Starting Master Bias driver Error codes */ +#define ADRV904X_CPU_LDO_DRV_ERROR_CODE_START (ADRV904X_CPU_OBJID_DRV_LDO << 8u) /*!< 0xB400 - Starting LDO driver Error code */ +#define ADRV904X_CPU_DWT_DRV_ERROR_CODE_START (ADRV904X_CPU_OBJID_DRV_DWT << 8u) /*!< 0xB500 - Starting DWT driver Error code */ +#define ADRV904X_CPU_TEMP_ERROR_CODE_START (ADRV904X_CPU_OBJID_DRV_TEMP << 8u) /*!< 0xB600 - Starting Temperature driver Error code */ +#define ADRV904X_CPU_PLL_ERROR_CODE_START (ADRV904X_CPU_OBJID_DRV_PLL << 8u) /*!< 0xB700 - Starting PLL driver Error code */ +#define ADRV904X_CPU_JESD_ERROR_CODE_START (ADRV904X_CPU_OBJID_DRV_JESD << 8u) /*!< 0xB800 - Starting JESD driver Error code */ +#define ADRV904X_CPU_UART_ERROR_CODE_START (ADRV904X_CPU_OBJID_DRV_UART << 8u) /*!< 0xB900 - Starting UART driver Error code */ +#define ADRV904X_CPU_TXATTEN_ERROR_CODE_START (ADRV904X_CPU_OBJID_DRV_TXATTEN << 8u) /*!< 0xBA00 - Starting TXatten driver Error code */ +#define ADRV904X_CPU_TXLOL_DRV_ERROR_CODE_START (ADRV904X_CPU_OBJID_DRV_TXLOL << 8u) /*!< 0xBB00 - Starting TX LOL Accumulator driver Error codes */ +#define ADRV904X_CPU_GPIO_DRV_ERROR_CODE_START (ADRV904X_CPU_OBJID_DRV_GPIO << 8u) /*!< 0xBD00 - Starting GPIO driver Error codes */ + +#define ADRV904X_CPU_DDCC_DRV_ERROR_CODE_START (ADRV904X_CPU_OBJID_DRV_DDCC << 8u) /*!< 0xF100 - Starting DDCC driver Error codes */ + +#define ADRV904X_CPU_RADIO_SEQUENCER_DRV_ERROR_CODE_START (ADRV904X_CPU_OBJID_DRV_RADIO_SEQUENCER << 8u) /*!< 0xBE00 - Starting Radio Sequencer driver error codes */ +#define ADRV904X_CPU_CARRIER_RECONFIG_ERROR_CODE_START (ADRV904X_CPU_OBJID_CFG_CARRIER_RECONFIG << 8u) /*!< 0xBf00 - Starting Carrier Reconfigure error codes */ + +#ifndef CLIENT_IGNORE +typedef enum adrv904x_CpuErrorCode +{ + + ADRV904X_CPU_NO_ERROR = 0UL, /*!<@errcode: 0x0000 + @desc: No Error + @maincause: Operation Successful + @mainrecovenum: ADI_ADRV904X_ERR_ACT_NONE + @mainrecovtext: No Action Required + @cause: + @recovenum: + @recovtext: + */ + + /*!< ----- Object ID = ADRV904X_CPU_OBJID_IC_RC_TUNER Section Base Error Code = 0x0000 ------ @errcode: 0x0000 + @desc: RC Tuner Calibration + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_RC_TUNER_CAL_TIMEOUT_ERROR = (ADRV904X_CPU_RC_TUNER_CAL_CODE_ERROR_START + 1u), /*!<@errcode: 0x0001 + @desc: RC Tuner: Calibration Timeout + @maincause: Timeout Waiting for RCAL and/or CCAL to Finish + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Re-program Device and re-run RC Tuner Calibration + @cause: Tuner clock not Enabled (RCAL and CCAL) and/or master bias is not up (CCAL) + @recovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @recovtext: + */ + ADRV904X_CPU_RC_TUNER_CAL_SELFTEST_ERROR = (ADRV904X_CPU_RC_TUNER_CAL_CODE_ERROR_START + 2u), /*!<@errcode: 0x0002 + @desc: RC Tuner: Self-Test Error + @maincause: RCAL/CCAL Results violate +/-25% limits (from Nominal) + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Re-program Device and re-run RC Tuner Calibration + @cause: Master bias output is incorrect (RCAL and CCAL) and/or tuner clock Frequency is incorrect (CCAL). + @recovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @recovtext: + */ + + /*!< -------- Object ID = ADRV904X_CPU_OBJID_IC_RX_DC_OFFSET Section Base Error Code = 0x0100 ------ @errcode: 0x0100 + @desc: DC Offset Calibration + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_DC_OFFSET_CAL_RX_ABORT_ERROR = (ADRV904X_CPU_DC_OFFSET_RX_CAL_CODE_ERROR_START + 1u), /*!<@errcode: 0x0101 + @desc: DC Offset: Calibration was aborted while collecting data + @maincause: Rx going low or higher priority Calibration aborting the current capture + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run the Calibration + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_DC_OFFSET_CAL_RX_TIMEOUT_ERROR = (ADRV904X_CPU_DC_OFFSET_RX_CAL_CODE_ERROR_START + 2u), /*!<@errcode: 0x0102 + @desc: DC Offset: Calibration Timed out due to Error in Data Capture + @maincause: Hardware was unable to capture enough data within time limit + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run the Calibration + @cause: Hardware was unable to capture enough data within time limit + @recovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @recovtext: Resetting Hardware to make Data Capture finish within time + */ + ADRV904X_CPU_DC_OFFSET_CAL_RX_FSC_DATACAP_ERROR = (ADRV904X_CPU_DC_OFFSET_RX_CAL_CODE_ERROR_START + 3u), /*!<@errcode: 0x0103 + @desc: DC Offset: Internal Test to verify if Calibration was successful + @maincause: FSC was unable to capture data required to confirm Calibration completion + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Perform Soft Reset to complete Data Capture + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_DC_OFFSET_CAL_RX_UNDEF_API_FN_ERROR = (ADRV904X_CPU_DC_OFFSET_RX_CAL_CODE_ERROR_START + 4u), /*!<@errcode: 0x0104 + @desc: DC Offset: Undefined control Command + @maincause: Invalid control Command used for tracking Calibration + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Control Command is Valid + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_DC_OFFSET_CAL_RX_CONVERGENCE_ERROR = (ADRV904X_CPU_DC_OFFSET_RX_CAL_CODE_ERROR_START + 5u), /*!<@errcode: 0x0105 + @desc: DC Offset: Calibration was unable to converge + @maincause: The residual DC Offset was higher than threshold + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + + /*!< -------- Object ID = ADRV904X_CPU_OBJID_IC_ADC_RX Section Base Error Code = 0x0200 ------ @errcode: 0x0200 + @desc: ADC Rx Calibration + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_ADC_RX_STAGE1_OBJ_ERROR = (ADRV904X_CPU_ADC_RX_CAL_CODE_ERROR_START + 1u), /*!<@errcode: 0x0201 + @desc: ADC Rx: Stage 1 Error + @maincause: Calibration may have saturated + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_RX_STAGEV_OBJ_ERROR = (ADRV904X_CPU_ADC_RX_CAL_CODE_ERROR_START + 2u), /*!<@errcode: 0x0202 + @desc: ADC Rx: Stage V Error + @maincause: Calibration may have saturated + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_RX_DRF_OBJ_ERROR = (ADRV904X_CPU_ADC_RX_CAL_CODE_ERROR_START + 3u), /*!<@errcode: 0x0203 + @desc: ADC Rx: DRF Error + @maincause: Calibration may have saturated + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_RX_FSMCMD_ERROR = (ADRV904X_CPU_ADC_RX_CAL_CODE_ERROR_START + 4u), /*!<@errcode: 0x0204 + @desc: ADC Rx: Invalid FSM Command + @maincause: Invalid FSM Command passed to ADC Module + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_RX_TRACKING_NEEDS_INIT = (ADRV904X_CPU_ADC_RX_CAL_CODE_ERROR_START + 5u), /*!<@errcode: 0x0205 + @desc: ADC Rx: Run ADC Rx Initial Calibration before Tracking Calibration + @maincause: Initial ADC Rx Calibration has not completed successfully yet + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_RX_CAL_TIMEOUT_ERROR = (ADRV904X_CPU_ADC_RX_CAL_CODE_ERROR_START + 6u), /*!<@errcode: 0x0206 + @desc: ADC Rx: Calibration Timeout + @maincause: Calibration did not finish in expected time + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_RX_HW_STARTUP_ERROR = (ADRV904X_CPU_ADC_RX_CAL_CODE_ERROR_START + 7u), /*!<@errcode: 0x0207 + @desc: ADC Rx:HW start-up Error + @maincause: Unexpected HW behavior: start-up Error; report to ADI + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_RX_CONFIG_INVALID_PARAM = (ADRV904X_CPU_ADC_RX_CAL_CODE_ERROR_START + 8u), /*!<@errcode: 0x0208 + @desc: ADC Rx: Invalid Configuration Parameter + @maincause: Invalid Configuration Parameter Passed to ADC Rx Module + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_RX_UNKNOWN_ERROR = (ADRV904X_CPU_ADC_RX_CAL_CODE_ERROR_START + 9u), /*!<@errcode: 0x0209 + @desc: ADC Rx: Unknown Error + @maincause: Unspecified Error Detected in ADC Rx Module + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_RX_CTRL_FUNC_NOT_SUPPORTED = (ADRV904X_CPU_ADC_RX_CAL_CODE_ERROR_START + 11u), /*!<@errcode: 0x020A + @desc: ADC Rx: Invalid Control Command + @maincause: Invalid Control Command provided to ADC Rx Module + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Control Command is Supported + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_RX_ALREADY_RUNNING_CAL = (ADRV904X_CPU_ADC_RX_CAL_CODE_ERROR_START + 11u), /*!<@errcode: 0x020B + @desc: ADC Rx: Busy + @maincause: A Calibration is currently Running + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + @mainrecovtext: Wait for Current Calibration Running to Complete + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_RX_CMD_NEEDS_DEBUG_MODE = (ADRV904X_CPU_ADC_RX_CAL_CODE_ERROR_START + 12u), /*!<@errcode: 0x020C + @desc: ADC Rx: Control Command Requires Debug Mode + @maincause: Debug Mode is not Supported + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: Debug Mode is not Enabled + @recovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + @recovtext: Check Control Command & Mode of Operation + */ + ADRV904X_CPU_ADC_RX_HW_REG_VERIFY = (ADRV904X_CPU_ADC_RX_CAL_CODE_ERROR_START + 13u), /*!<@errcode: 0x020D + @desc: ADC Rx: Register Map Verification Failed + @maincause: ADC Rx Module not Configured as Expected + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_RX_TRACKING_CAL_TIMEOUT = (ADRV904X_CPU_ADC_RX_CAL_CODE_ERROR_START + 14u), /*!<@errcode: 0x020E + @desc: ADC Rx: Tracking Calibration Timeout + @maincause: Timeout due to Disabled Rx + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + @mainrecovtext: Enable Rx before Timeout + @cause: Internal Error Not Handled Correctly + @recovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @recovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + + /*!< -------- Object ID = ADRV904X_CPU_OBJID_IC_ADC_ORX Section Base Error Code = 0x0300 ------ @errcode: 0x0300 + @desc: ADC ORx Calibration + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_ADC_ORX_SCAL_OBJ_ERROR = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 1u), /*!<@errcode: 0x0301 + @desc: ADC ORx: Slice Calibration Object Error + @maincause: Calibration may have Saturated + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_SCAL_IRQ_STATUS_ERROR = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 2u), /*!<@errcode: 0x0302 + @desc: ADC ORx: Slice Calibration Interrupt Status Error + @maincause: Interrupt Pin Caused Error, but Status was OK + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_ADC_ORX_SCAL_IRQ_TIMEOUT_ERROR = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 3u), /*!<@errcode: 0x0303 + @desc: ADC ORx: Slice Calibration Interrupt Timeout + @maincause: Interrupt Timer has Expired + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_SCAL_FG_ERROR = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 4u), /*!<@errcode: 0x0304 + @desc: ADC ORx: Slice Initialization Calibration Interrupt Error + @maincause: Unexpected Interrupt Received + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_SCAL_BG_ERROR = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 5u), /*!<@errcode: 0x0305 + @desc: ADC ORx: Slice Tracking Calibration Interrupt Error + @maincause: Unexpected Interrupt Received + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_FCAL_OBJ_ERROR = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 6u), /*!<@errcode: 0x0306 + @desc: ADC ORx: Front-End Calibration Object Error + @maincause: Calibration may have Saturated + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_FCAL_IRQ_STATUS_ERROR = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 7u), /*!<@errcode: 0x0307 + @desc: ADC ORx: Front-End Calibration Interrupt Status Error + @maincause: Interrupt Pin caused Error, but status was OK + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_FCAL_IRQ_TIMEOUT_ERROR = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 8u), /*!<@errcode: 0x0308 + @desc: ADC ORx: Front-End Calibration Interrupt Timeout Error + @maincause: Interrupt Timer has Expired + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_FCAL_FG_ERROR = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 9u), /*!<@errcode: 0x0309 + @desc: ADC ORx: Front-End Initialization Calibration Interrupt Error + @maincause: Unexpected Interrupt Received + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_FCAL_BG_ERROR = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 10u), /*!<@errcode: 0x030A + @desc: ADC ORx: Front-End Tracking Calibration Interrupt Error + @maincause: Unexpected Interrupt Received + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_ICAL_OBJ_ERROR = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 11u), /*!<@errcode: 0x030B + @desc: ADC ORx: Interleaving Timing Calibration Object Error + @maincause: Calibration may have Saturated + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_ICAL_IRQ_STATUS_ERROR = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 12u), /*!<@errcode: 0x030C + @desc: ADC ORx: Interleaving Timing Calibration Interrupt Status Error + @maincause: Interrupt Pin caused Error, but Status was OK + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_ICAL_IRQ_TIMEOUT_ERROR = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 13u), /*!<@errcode: 0x030D + @desc: ADC ORx: Interleaving Timing Calibration Interrupt Timeout Error + @maincause: Interrupt Timer has Expired + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_ICAL_FG_ERROR = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 14u), /*!<@errcode: 0x030E + @desc: ADC ORx: Interleaving Timing Initialization Calibration Interrupt Error + @maincause: Unexpected Interrupt Received + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_ICAL_BG_ERROR = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 15u), /*!<@errcode: 0x030F + @desc: ADC ORx: Interleaving Timing Tracking Calibration Interrupt Error + @maincause: Unexpected Interrupt Received + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_CMD_ERROR = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 16u), /*!<@errcode: 0x0310 + @desc: ADC ORx: Invalid Control Command + @maincause: Invalid Control Command passed to ADC ORx Module + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_QUEUE_ERROR = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 17u), /*!<@errcode: 0x0311 + @desc: ADC ORx: Control Command Queue Error + @maincause: Unexpected Behaviour in ADC ORx Module + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_SLICE_INIT_ERROR = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 18u), /*!<@errcode: 0x0312 + @desc: ADC ORx: Hardware Slice Initialization Error + @maincause: Unexpected Behaviour in ADC ORx Module + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_TRACK_INIT_ERROR = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 19u), /*!<@errcode: 0x0313 + @desc: ADC ORx: Hardware Track & Hold Initialization Error + @maincause: Unexpected Behaviour in ADC ORx Module + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_HW_STARTUP_ERROR = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 20u), /*!<@errcode: 0x0314 + @desc: ADC ORx: Hardware Start-Up Error + @maincause: Unexpected Behaviour in ADC ORx Module + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_CAL_TIMEOUT_ERROR = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 21u), /*!<@errcode: 0x0315 + @desc: ADC ORx: Calibration Timeout Error + @maincause: Calibration did not Finish in Expected Time + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_CONFIG_INVALID_PARAM = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 22u), /*!<@errcode: 0x0316 + @desc: ADC ORx: Invalid Configuration Parameter + @maincause: Invalid Configuration Parameter Used in Command to ADC ORx Module + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Parameters and try again. Contact ADI if the problem persists + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_UNKNOWN_ERROR = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 23u), /*!<@errcode: 0x0317 + @desc: ADC ORx: Unknown Error + @maincause: Unspecified Error in ADC ORx Module + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_CTRL_FUNC_NOT_SUPPORTED = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 24u), /*!<@errcode: 0x0318 + @desc: ADC ORx: Control Command Not Supported + @maincause: Invalid Control Command + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Control Command is Supported + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_ALREADY_RUNNING_CAL = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 25u), /*!<@errcode: 0x0319 + @desc: ADC ORx: Busy + @maincause: A Calibration is Currently Running + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + @mainrecovtext: Wait for Current Calibration Running to Complete + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_CMD_NEEDS_DEBUG_MODE = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 26u), /*!<@errcode: 0x031A + @desc: ADC ORx: Control Command Requires Debug Mode + @maincause: Debug Mode Not Enabled + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + @mainrecovtext: Check Command & Mode of Operation + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_TRACKING_NEEDS_INIT = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 27u), /*!<@errcode: 0x031B + @desc: ADC ORx: Run ADC ORx Initial Calibration before Tracking Calibration + @maincause: Initial ADC ORx Calibration has not completed successfully yet + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_INIT_DAC_NOT_RUNNING = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 28u), /*!<@errcode: 0x031C + @desc: ADC ORx: DAC Stream Write Error + @maincause: Stream DAC has stopped Writing + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_HW_REG_VERIFY = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 29u), /*!<@errcode: 0x031D + @desc: ADC ORx: Register Map Verification Failed + @maincause: ADC ORx Module not Configured as Expected + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_ORX_TRACKING_CAL_TIMEOUT = (ADRV904X_CPU_ADC_ORX_CAL_CODE_ERROR_START + 30u), /*!<@errcode: 0x031E + @desc: ADC ORx: Tracking Calibration Timeout + @maincause: Timeout Due to Disabled ORx + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + @mainrecovtext: Enable ORx before Timeout + @cause: Internal Error Not Handled Correctly + @recovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @recovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + + /*!< -------- Object ID = ADRV904X_CPU_OBJID_IC_ADC_TXLB Section Base Error Code = 0x0400 ------ @errcode: 0x0400 + @desc: ADC TxLb Calibration + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_ADC_TXLB_SCAL_OBJ_ERROR = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 1u), /*!<@errcode: 0x0401 + @desc: ADC TxLb: Slice Calibration Object Error + @maincause: Calibration may have Saturated + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_TXLB_SCAL_IRQ_STATUS_ERROR = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 2u), /*!<@errcode: 0x0402 + @desc: ADC TxLb: Slice Calibration Interrupt Status Error + @maincause: Interrupt Pin caused Error, but Status was OK + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_TXLB_SCAL_IRQ_TIMEOUT_ERROR = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 3u), /*!<@errcode: 0x0403 + @desc: ADC TxLb: Slice Calibration Interrupt Timeout Error + @maincause: Interrupt Timer has Expired + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_TXLB_SCAL_FG_ERROR = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 4u), /*!<@errcode: 0x0404 + @desc: ADC TxLb: Slice Initialization Calibration Interrupt Error + @maincause: Unexpected Interrupt Received + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_TXLB_SCAL_BG_ERROR = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 5u), /*!<@errcode: 0x0405 + @desc: ADC TxLb: Slice Tracking Calibration Interrupt Error + @maincause: Unexpected Interrupt Received + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_TXLB_FCAL_OBJ_ERROR = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 6u), /*!<@errcode: 0x0406 + @desc: ADC TxLb: Front-End Calibration Object Error + @maincause: Calibration may have Saturated + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_TXLB_FCAL_IRQ_STATUS_ERROR = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 7u), /*!<@errcode: 0x0407 + @desc: ADC TxLb: Front-End Calibration Interrupt Status Error + @maincause: Interrupt Pin caused Error, but Status was OK + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_TXLB_FCAL_IRQ_TIMEOUT_ERROR = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 8u), /*!<@errcode: 0x0408 + @desc: ADC TxLb: Front-End Calibration Interrupt Timeout Error + @maincause: Interrupt Timer has Expired + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_TXLB_FCAL_FG_ERROR = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 9u), /*!<@errcode: 0x0409 + @desc: ADC TxLb: Front-End Initialization Calibration Interrupt Error + @maincause: Unexpected Interrupt Received + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_TXLB_FCAL_BG_ERROR = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 10u), /*!<@errcode: 0x040A + @desc: ADC TxLb: Front-End Tracking Calibration Interrupt Error + @maincause: Unexpected Interrupt Received + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_TXLB_CMD_ERROR = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 11u), /*!<@errcode: 0x040B + @desc: ADC TxLb: Invalid Control Command + @maincause: Invalid Control Command passed to ADC TxLb Module + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_TXLB_QUEUE_ERROR = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 12u), /*!<@errcode: 0x040C + @desc: ADC TxLb: Control Command Queue Error + @maincause: Unexpected Behaviour in ADC TxLb Module + @mainrecovenum:ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_TXLB_SLICE_INIT_ERROR = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 13u), /*!<@errcode: 0x040D + @desc: ADC TxLb: Hardware Slice Initialization Error + @maincause: Unexpected Behaviour in ADC TxLb Module + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_TXLB_HW_STARTUP_ERROR = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 14u), /*!<@errcode: 0x040E + @desc: ADC TxLb: Hardware Start-Up Error + @maincause: Unexpected Behaviour in ADC TxLb Module + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_TXLB_TRACK_INIT_ERROR = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 15u), /*!<@errcode: 0x040F + @desc: ADC TxLb: Hardware Track & Hold Initialization Error + @maincause: Unexpected Behaviour in ADC TxLb Module + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_TXLB_CAL_TIMEOUT_ERROR = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 16u), /*!<@errcode: 0x0410 + @desc: ADC TxLb: Calibration Timeout + @maincause: Calibration did not Finish in Expected Time + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_TXLB_CONFIG_INVALID_PARAM = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 17u), /*!<@errcode: 0x0411 + @desc: ADC TxLb: Invalid Parameter + @maincause: Invalid Configuration Parameter passed to ADC TxLb Module + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_TXLB_UNKNOWN_ERROR = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 18u), /*!<@errcode: 0x0412 + @desc: ADC TxLb: Unknown Error + @maincause: Unspecified Error in ADC TxLb Module + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_TXLB_CTRL_FUNC_NOT_SUPPORTED = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 19u), /*!<@errcode: 0x0413 + @desc: ADC TxLb: Control Command Not Supported + @maincause: Invalid Control Command passed to ADC TxLb Module + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Control Command is Supported + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_TXLB_ALREADY_RUNNING_CAL = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 20u), /*!<@errcode: 0x0414 + @desc: ADC Txlb: Busy + @maincause: A Calibration is Currently Running + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + @mainrecovtext: Wait Until Current Calibration Finishes + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_TXLB_CMD_NEEDS_DEBUG_MODE = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 21u), /*!<@errcode: 0x0415 + @desc: ADC Txlb: Control Command Requires Debug Mode + @maincause: Debug Mode is not Supported + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: Debug Mode is not Enabled + @recovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + @recovtext: Check Control Command & Mode of Operation + */ + ADRV904X_CPU_ADC_TXLB_TRACKING_NEEDS_INIT = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 22u), /*!<@errcode: 0x0416 + @desc: ADC Txlb: Run ADC ORx Initial Calibration before Tracking Calibration + @maincause: Initial ADC TxLb Calibration has not completed successfully yet + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_TXLB_INIT_DAC_NOT_RUNNING = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 23u), /*!<@errcode: 0x0417 + @desc: ADC Txlb: DAC Stream Write Error + @maincause: Stream DAC has stopped Writing + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_TXLB_HW_REG_VERIFY = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 24u), /*!<@errcode: 0x0418 + @desc: ADC Txlb: Register Map Verification Failed + @maincause: ADC TxLb Module not Configured as Expected + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_ADC_TXLB_TRACKING_CAL_TIMEOUT = (ADRV904X_CPU_ADC_TXLB_CAL_CODE_ERROR_START + 25u), /*!<@errcode: 0x0419 + @desc: ADC Txlb: Tracking Calibration Timeout + @maincause: Timeout due to Disabled Tx + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + @mainrecovtext: Enable ORx before Timeout + @cause: Internal Error Not Handled Correctly + @recovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @recovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + + /*!< -------- Object ID = ADRV904X_CPU_OBJID_IC_TXDAC Section Base Error Code = 0x0500 ------ @errcode: 0x0500 + @desc: Tx DAC Calibration + @maincause: + @mainrecovenum: + @separator: true + */ + /* TODO: TPGSWE-2335, API functionality to read power status and PLL lock bits in debug mode */ + ADRV904X_CPU_TXDAC_CAL_CHAN_I_NOT_POWERED_UP_ERROR = (ADRV904X_CPU_TXDAC_CAL_ERROR_START + 1u), /*!<@errcode: 0x0501 + @desc: Tx DAC: DAC Channel I not Powered Up + @maincause: Supplies not Ready or Clock is not on + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + @mainrecovtext: Verify Supply Ready Flags and PLL Ready Flags are Set, if the problem persists acquire a Memory Dump and contact ADI + @cause: TxDAC clock has incorrect Configuration + @recovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @recovtext: Verify dacPowerDownDiv_i/q, dacPowerUpDiv_i/q, and txDacClkDiv have Correct Configuration + */ + ADRV904X_CPU_TXDAC_CAL_CHAN_Q_NOT_POWERED_UP_ERROR = (ADRV904X_CPU_TXDAC_CAL_ERROR_START + 2u), /*!<@errcode: 0x0502 + @desc: Tx DAC: DAC Channel Q not Powered Up + @maincause: Supplies not Ready or Clock is not on + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + @mainrecovtext: Verify Supply Ready Flags and PLL Ready Flags are Set, if the problem persists acquire a Memory Dump and contact ADI + @cause: TxDAC clock has incorrect Configuration + @recovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @recovtext: Verify dacPowerDownDiv_i/q, dacPowerUpDiv_i/q, and txDacClkDiv have Correct Configuration + */ + ADRV904X_CPU_TXDAC_CAL_CHAN_I_NOT_FINISHED_ERROR = (ADRV904X_CPU_TXDAC_CAL_ERROR_START + 3u), /*!<@errcode: 0x0503 + @desc: Tx DAC: DAC Channel I Initial Calibration didn't finish + @maincause: DAC Clock not on + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + @mainrecovtext: Verify PLL Ready Flags are Set, if the problem persists acquire a Memory Dump and contact ADI + @cause: TxDAC clock has incorrect Configuration + @recovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @recovtext: Verify dacPowerDownDiv_i/q, dacPowerUpDiv_i/q, and txDacClkDiv have Correct Configuration + */ + ADRV904X_CPU_TXDAC_CAL_CHAN_Q_NOT_FINISHED_ERROR = (ADRV904X_CPU_TXDAC_CAL_ERROR_START + 4u), /*!<@errcode: 0x0504 + @desc: Tx DAC: DAC Channel Q Initial Calibration didn't finish + @maincause: DAC Clock not on + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + @mainrecovtext: Verify PLL Ready Flags are Set, if the problem persists acquire a Memory Dump and contact ADI + @cause: TxDAC Clock has Incorrect Configuration + @recovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @recovtext: Verify CLKDIV has Correct Configuration + */ + ADRV904X_CPU_TXDAC_CAL_CHAN_I_SATURATED_ERROR = (ADRV904X_CPU_TXDAC_CAL_ERROR_START + 5u), /*!<@errcode: 0x0505 + @desc: Tx DAC: DAC Channel I Saturated during Initial Calibration + @maincause: Not Enough Range during TxDAC Initial Calibration + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Possibly not Enough Range, acquire a Memory Dump and contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_TXDAC_CAL_CHAN_Q_SATURATED_ERROR = (ADRV904X_CPU_TXDAC_CAL_ERROR_START + 6u), /*!<@errcode: 0x0506 + @desc: Tx DAC: DAC Channel Q Saturated during Initial Calibration + @maincause: Not Enough Range during TxDAC Initial Calibration + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Possibly not Enough Range, acquire a Memory Dump and contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_TXDAC_CAL_CHAN_I_NOT_POWERED_DOWN_ERROR = (ADRV904X_CPU_TXDAC_CAL_ERROR_START + 7u), /*!<@errcode: 0x0507 + @desc: Tx DAC: DAC Channel I not Powered Down + @maincause: Supplies not Ready or Clock is not on + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Verify Supply Ready Flags and PLL Ready Flags are Set, if the problem persists acquire a Memory Dump and contact ADI + @cause: TxDAC clock has Incorrect Configuration + @recovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @recovtext: Verify dacPowerDownDiv_i/q, dacPowerUpDiv_i/q, and txDacClkDiv have Correct Configuration + */ + ADRV904X_CPU_TXDAC_CAL_CHAN_Q_NOT_POWERED_DOWN_ERROR = (ADRV904X_CPU_TXDAC_CAL_ERROR_START + 8u), /*!<@errcode: 0x0508 + @desc: Tx DAC: DAC Channel Q not Powered Down + @maincause: Supplies not Ready or Clock is not on + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: verify supply ready flags and PLL ready flags are set, if the problem persists acquire a Memory Dump and contact ADI @cause: TxDAC clock has incorrect Configuration + @recovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @recovtext: Verify dacPowerDownDiv_i/q, dacPowerUpDiv_i/q, and txDacClkDiv have Correct Configuration + */ + ADRV904X_CPU_TXDAC_CAL_CHAN_I_NOT_IN_STANDBY = (ADRV904X_CPU_TXDAC_CAL_ERROR_START + 9u) , /*!<@errcode: 0x0509 + @desc: Tx DAC: DAC Channel I not in Standby + @maincause: Supplies not Ready or Clock is not on + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Verify Supply Ready Flags and PLL Ready Flags are Set, if the problem persists acquire a Memory Dump and contact ADI + @cause: TxDAC clock has incorrect Configuration + @recovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @recovtext: Verify dacPowerDownDiv_i/q, dacPowerUpDiv_i/q, and txDacClkDiv have Correct Configuration + */ + ADRV904X_CPU_TXDAC_CAL_CHAN_Q_NOT_IN_STANDBY = (ADRV904X_CPU_TXDAC_CAL_ERROR_START + 10u), /*!<@errcode: 0x050A + @desc: Tx DAC: DAC Channel Q not in Standby + @maincause: Supplies not Ready or Clock is not on + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: verify supply ready flags and PLL ready flags are set, if the problem persists acquire a Memory Dump and contact ADI @cause: TxDAC clock has incorrect Configuration + @recovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @recovtext: Verify dacPowerDownDiv_i/q, dacPowerUpDiv_i/q, and txDacClkDiv have Correct Configuration + */ + ADRV904X_CPU_TXDAC_CAL_CHAN_INVALID_DIV = (ADRV904X_CPU_TXDAC_CAL_ERROR_START + 11u), /*!<@errcode: 0x050B + @desc: Tx DAC: Invalid Clock Divider + @maincause: Invalid Clock Divider Value + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Verify dacPowerDownDiv_i/q, dacPowerUpDiv_i/q, and txDacClkDiv have correct Configuration + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_TXDAC_CAL_DAC_CLOCK_FREQ_OUT_OF_RANGE_ERROR = (ADRV904X_CPU_TXDAC_CAL_ERROR_START + 12u), /*!<@errcode: 0x050C + @desc: Tx DAC: DAC Sample Clock out of Operating Frequency Range + @maincause: Sample clock should be between 1.5 - 3GHz + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Sample Clock Rate + @cause: + @recovenum: + @recovtext: + */ + + /*!< -------- Object ID = ADRV904X_CPU_OBJID_IC_TXBBF Section Base Error Code = 0x0600------ @errcode: 0x0600 + @desc: BBF Tx Calibration + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_BBF_CAL_TX_ABORT_ERROR = (ADRV904X_CPU_BBF_TX_CAL_CODE_ERROR_START + 1u), /*!<@errcode: 0x0601 + @desc: BBF Tx: Calibration Data Capture Aborted + @maincause: Tx Going Lower or Higher Priority + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run Calibration + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_BBF_CAL_TX_LPBK_DIS_ERROR = (ADRV904X_CPU_BBF_TX_CAL_CODE_ERROR_START + 2u), /*!<@errcode: 0x0602 + @desc: BBF Tx: Insufficient Power measured at Loopback path + @maincause: Insufficient power measured at Loopback path + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_BBF_CAL_TX_FLATNESS_ERROR = (ADRV904X_CPU_BBF_TX_CAL_CODE_ERROR_START + 3u), /*!<@errcode: 0x0603 + @desc: BBF Tx: Base Band Filter was not Tuned to Achieve Flatness + @maincause: Algorithm unable to converge on Tuning Capacitor Values + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Rerun the Initial Calibration again. Contact ADI if the problem persists + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_BBF_CAL_TX_CAL_RESULTS_INVALID = (ADRV904X_CPU_BBF_TX_CAL_CODE_ERROR_START + 4u), /*!<@errcode: 0x0604 + @desc: BBF Tx: Invalid Data Captured by FSC Hardware + @maincause: FSC Hardware unable to Capture Correct Data + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Rerun the Initial Calibration again. Contact ADI if the problem persists + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_BBF_CAL_TX_CTRL_CMD_NOT_SUPPORTED = (ADRV904X_CPU_BBF_TX_CAL_CODE_ERROR_START + 5u), /*!<@errcode: 0x0605 + @desc: BBF Tx: Control Command Not Supported + @maincause: Invalid Control Command passed to BBF Tx Module + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Control Command is Supported + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_BBF_CAL_TX_CAP_ESTIMATE_HIGH = (ADRV904X_CPU_BBF_TX_CAL_CODE_ERROR_START + 6u), /*!<@errcode: 0x0606 + @desc: BBF Tx: Capacitor Estimate Higher than Threshold + @maincause: Calibration unable to Converge on Tuning Capacitor Values + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run Calibration + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_BBF_CAL_TX_CAP_ESTIMATE_LOW = (ADRV904X_CPU_BBF_TX_CAL_CODE_ERROR_START + 7u), /*!<@errcode: 0x0607 + @desc: BBF Tx: Capacitor Estimate Lower than Threshold + @maincause: Calibration unable to Converge on Tuning Capacitor Values + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run Calibration + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_BBF_CAL_TX_DATACAP_ERROR = (ADRV904X_CPU_BBF_TX_CAL_CODE_ERROR_START + 8u), /*!<@errcode: 0x0608 + @desc: BBF Tx: Hardware unable to Schedule/Complete Data Capture + @maincause: FSC Hardware unable to Capture Correct Data + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run Calibration + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_BBF_CAL_TX_RANGE_ERROR = (ADRV904X_CPU_BBF_TX_CAL_CODE_ERROR_START + 9u), /*!<@errcode: 0x0609 + @desc: BBF Tx: Test Mode Range Error + @maincause: Tx Input Range is Out of Range + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Sample Clock Rate + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_BBF_CAL_CPU_SYNC_ERROR = (ADRV904X_CPU_BBF_TX_CAL_CODE_ERROR_START + 10u), /*!<@errcode: 0x060A + @desc: BBF Tx: CPU Synchronization Error + @maincause: Timeout Waiting for the Other CPU to Synchronize + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Whether Both Cores are Running + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_BBF_CAL_INVALID_FREQ_ADJUST_ERROR = (ADRV904X_CPU_BBF_TX_CAL_CODE_ERROR_START + 11u), /*!<@errcode: 0x060B + @desc: BBF Tx: Error adjusting invalid frequency + @maincause: Unable to adjust LO or Fbb by adjust value + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Re-run the Initial Calibration. Contact ADI if the problem persists + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_BBF_CAL_TX_CAP_NOT_FOUND = (ADRV904X_CPU_BBF_TX_CAL_CODE_ERROR_START + 12u), /*!<@errcode: 0x060C + @desc: BBF Tx: Unable to find capacitor for proper attenuation + @maincause: Calibration unable to Converge on Tuning Capacitor Values + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run Calibration + @cause: + @recovenum: + @recovtext: + */ + + /*!< -------- Object ID = ADRV904X_CPU_OBJID_IC_TXLB_PATH_DLY Section Base Error Code = 0x0700 ------ @errcode: 0x0700 + @desc: Path Delay Calibration + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_PATH_DLY_CAL_USE_CASE_ERROR = (ADRV904X_CPU_PATH_DLY_CAL_CODE_ERROR_START + 1u), /*!<@errcode: 0x0701 + @desc: Path Delay: Use case is not Currently Supported + @maincause: unsupported use case + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + @mainrecovtext: Check Use Case is Currently Supported + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_PATH_DLY_CAL_SELFCHECK_ERROR = (ADRV904X_CPU_PATH_DLY_CAL_CODE_ERROR_START + 2u), /*!<@errcode: 0x0702 + @desc: Path Delay: Self Check Failure + @maincause: Estimated Delay Exceeds Margin + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_PATH_DLY_CAL_LIMIT_OBS_ERROR = (ADRV904X_CPU_PATH_DLY_CAL_CODE_ERROR_START + 3u), /*!<@errcode: 0x0703 + @desc: Path Delay:Number of observations more than the limit set + @maincause: Adjust algorithm Configuration Parameters to handle Profile + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_PATH_DLY_CAL_XCORR_WAIT_TIMEOUT = (ADRV904X_CPU_PATH_DLY_CAL_CODE_ERROR_START + 4u), /*!<@errcode: 0x0704 + @desc: Path Delay: Cross-Correlation Timeout + @maincause: FSC was unable to Capture Data + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_PATH_DLY_CAL_XCORR_WAIT_ERROR = (ADRV904X_CPU_PATH_DLY_CAL_CODE_ERROR_START + 5u), /*!<@errcode: 0x0705 + @desc: Path Delay: Cross-Correlation Error + @maincause: FSC was unable to capture data + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run Calibration + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_PATH_DLY_CAL_XCORR_GET_RESULTS_ERROR = (ADRV904X_CPU_PATH_DLY_CAL_CODE_ERROR_START + 6u), /*!<@errcode: 0x0706 + @desc: Path Delay: Cross-Correlation Get Results Error + @maincause: Unable to Get FSC Capture Results + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: + @recovenum: + @recovtext: + */ + + /*!< -------- Object ID = ADRV904X_CPU_OBJID_IC_TX_ATTEN_CAL Section Base Error Code = 0x0800 ------ @errcode: 0x0800 + @desc: TxAtten Calibration + @maincause: + @mainrecovenum: + @separator: true + */ + + /*!< -------- Object ID = ADRV904X_CPU_OBJID_IC_HRM Section Base Error Code = 0x0900 ------ @errcode: 0x0900 + @desc: Tx HRM Calibration + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_TXHRM_CAL_NOT_RUN = (ADRV904X_CPU_HRM_CAL_CODE_ERROR_START + 1u), /*!<@errcode: 0x0901 + @desc: Tx HRM: Warm Boot Error + @maincause: Initial Calibration must run successfully at least once before Warm Boot + @mainrecovenum:ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run Tx HRM Initial Calibration + @cause: Unspecified HW Error occurred + @recovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @recovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_TXHRM_CAL_DATACAP_ERROR = (ADRV904X_CPU_HRM_CAL_CODE_ERROR_START + 2u), /*!<@errcode: 0x0902 + @desc: Tx HRM: Correlation Capture Error + @maincause: Timeout waiting for Data Capture to Complete + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run Tx HRM Initial Calibration + @cause: FSC is in a bad state + @recovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @recovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_TXHRM_CAL_CORR_WAIT_TIMEOUT = (ADRV904X_CPU_HRM_CAL_CODE_ERROR_START + 3u), /*!<@errcode: 0x0903 + @desc: Tx HRM: Auto-Correlation Timeout + @maincause: FSC was unable to Capture Data + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run Tx HRM Initial Calibration + @cause: FSC is in a bad state + @recovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @recovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_TXHRM_CAL_CORR_GET_RESULTS_ERROR = (ADRV904X_CPU_HRM_CAL_CODE_ERROR_START + 4u), /*!<@errcode: 0x0904 + @desc: Tx HRM: Auto-correlation Get Results + @maincause: Unable to Get FSC Capture Results + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run Tx HRM Initial Calibration + @cause: FSC is in a bad state + @recovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @recovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_TXHRM_CAL_INVALID_SEARCH_PARAM_ERROR = (ADRV904X_CPU_HRM_CAL_CODE_ERROR_START + 5u), /*!<@errcode: 0x0905 + @desc: Tx HRM: Invalid Delay Parameter + @maincause: Delay Parameter being searched does not exist + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run Tx HRM Initial Calibration. Contact ADI if the problem persists + @cause: Invalid Delay Control Parameter + @recovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @recovtext: Check Parameters and try again. Contact ADI if the problem persists + */ + ADRV904X_CPU_TXHRM_CAL_SEARCH_PARAM_OUT_OF_RANGE_ERROR = (ADRV904X_CPU_HRM_CAL_CODE_ERROR_START + 6u), /*!<@errcode: 0x0906 + @desc: Tx HRM: Delay Parameter Value is Out of Range + @maincause: Delay Parameter being searched is outside Min/Max limits specified + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run Tx HRM Initial Calibration + @cause: Invalid Delay Control Data + @recovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @recovtext: Check Parameters and try again. Contact ADI if the problem persists + */ + ADRV904X_CPU_TXHRM_CAL_SEARCH_ERROR = (ADRV904X_CPU_HRM_CAL_CODE_ERROR_START + 7u), /*!<@errcode: 0x0907 + @desc: Tx HRM: Delay Parameter search Error + @maincause: Did not find optimum value for delay Parameter. Target Performance not Achieved + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run Tx HRM Initial Calibration + @cause: Invalid Delay Control Data + @recovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @recovtext: Check Parameters and try again. Contact ADI if the problem persists + */ + ADRV904X_CPU_TXHRM_CAL_POWER_MEAS_ERROR = (ADRV904X_CPU_HRM_CAL_CODE_ERROR_START + 8u), /*!<@errcode: 0x0908 + @desc: Tx HRM: Fundamental Power Measurement Error + @maincause: Fundamental Power Measured is too Low + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run Tx HRM Initial Calibration + @cause: Invalid Threshold Parameters + @recovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @recovtext: Check Parameters and try again. Contact ADI if the problem persists + */ + ADRV904X_CPU_TXHRM_CAL_ZEROING_NO_FDAC_DETECTED = (ADRV904X_CPU_HRM_CAL_CODE_ERROR_START + 9u), /*!<@errcode: 0x0909 + @desc: Tx HRM: Zeroing Cal Error + @maincause: No optimum FDACP/FDACN detected + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run Tx HRM Initial Calibration + @cause: Invalid parameters + @recovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @recovtext: Check Parameters and try again. Contact ADI if the problem persists + */ + ADRV904X_CPU_TXHRM_CAL_BAD_CTRL_DATA_SZ = (ADRV904X_CPU_HRM_CAL_CODE_ERROR_START + 10u), /*!<@errcode: 0x090A + @desc: Tx HRM: Incorrect Number of bytes supplied to HRM Control Function + @maincause: API function supplied incorrect number of bytes to HRM Control Function + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check API call that supplied the parameters + @cause: Invalid parameters + @recovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @recovtext: Check Parameters and try again. Contact ADI if the problem persists + */ + ADRV904X_CPU_TXHRM_CAL_CHAN_ERR = (ADRV904X_CPU_HRM_CAL_CODE_ERROR_START + 11u), /*!<@errcode: 0x090B + @desc: Tx HRM: Must choose only 1 channel for HRM Control Function + @maincause: API function supplied chnnel mask with more than one channel to HRM Control Function + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check API call that supplied the parameters + @cause: Invalid parameters + @recovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @recovtext: Check Parameters and try again. Contact ADI if the problem persists + */ + /*!< -------- Object ID = ADRV904X_CPU_OBJID_IC_TXLOL Section Base Error Code = 0x0B00 ------ @errcode: 0x0B00 + @desc: Tx LOL Calibration + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_TXLOL_INIT_CAL_FSC_DATACAP_ERROR = ADRV904X_CPU_TXLOL_INIT_CAL_CODE_ERROR_START + 1u, /*!<@errcode: 0x0B01 + @desc: TxLol:Hardware unable to schedule/complete Data Capture + @maincause: FSC was unable to capture data + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Power measured at output is below threshold. Reset Device + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_TXLOL_CORE_INVALID_OBS_MODE_ERROR = ADRV904X_CPU_TXLOL_INIT_CAL_CODE_ERROR_START + 4u, /*! 16.22Ghz + @maincause: Incorrect Profile Configuration + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reconfigure Device to use at least 2 Lanes + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_SERDES_FG_CTLE_CLOSED_EYE = (ADRV904X_CPU_SERDES_CODE_ERROR_START + 18u), /*!<@errcode: 0x0C12 + @desc: SERDES: Initialization Calibration didn't find a Suitable CTLE Setting with an open eye + @maincause: Check serial Link integrity - No serial traffic present + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reset JESD Link or Device, re-run Calibration, if the problem persists contact ADI + @cause: + @recovenum: + @recovtext: + */ + ADRV904X_CPU_FG_OFF_CTLE_ODAC_EXTREME = (ADRV904X_CPU_SERDES_CODE_ERROR_START + 19u), /*!<@errcode: 0x0C13 + @desc: SERDES: CTLE Offset DACs reached its limits + @maincause: Exceeded operating temperature Range or unexpected Hardware behavior + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reset the Device in a supported temperature region, if the problem persists contact ADI + @cause: + @recovenum: + @recovtext: + */ + + ADRV904X_CPU_SERDES_CAL_SEM_CREATE_FAILED = (ADRV904X_CPU_SERDES_CODE_ERROR_START + 20u), /*!<@errcode: 0x0C14 + @desc: SERDES: Semaphore Create Failed + @maincause: SERDES Internal OS Error failing to create the SERDES semaphore + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reset the Device and re-initialize the SERDES + @cause: + @recovenum: + @recovtext: + */ + /*!< -------- Object ID = ADRV904X_CPU_OBJID_IC_TXLB_FILTER Section Base Error Code = 0x0E00 ------ @errcode: 0x0E00 + @desc: TxLb Filter Calibration + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_TXLB_FILTER_CAL_RANGE_ERROR = (ADRV904X_CPU_TXLB_FILTER_CAL_CODE_ERROR_START + 1u), /*!<@errcode: 0x0E01 + @desc: TxLb Filter: No Valid Capacitor Code Found + @maincause: Capacitor Code Range exceeded due to unexpected power measurement failures + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Reduce observed power measurement BW and re-run Calibration + */ + ADRV904X_CPU_TXLB_FILTER_CAL_DATACAP_ERROR = (ADRV904X_CPU_TXLB_FILTER_CAL_CODE_ERROR_START + 2u), /*!<@errcode: 0x0E02 + @desc: TxLb Filter: Unexpected Data Capture Error + @maincause: Timed out Waiting for Data Capture to complete + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run TxLb Filter Calibration + */ + ADRV904X_CPU_TXLB_FILTER_CAL_NOT_RUN = (ADRV904X_CPU_TXLB_FILTER_CAL_CODE_ERROR_START + 3u), /*!<@errcode: 0x0E03 + @desc: TxLb Filter: Calibration not completed for this Channel + @maincause: User did not run TxLb Filter Calibration + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Run TxLb Filter Calibration for the desired channels + */ + + /*!< -------- Object ID = ADRV904X_CPU_OBJID_IC_TXRX_PHASE Section Base Error Code = 0x1100 ------ @errcode: 0x1100 + @desc: Tx/Rx Phase Calibration + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_TXRX_PHASE_XCORR_ERROR_1 = (ADRV904X_CPU_TXRX_PHASE_CAL_CODE_ERROR_START + 1u), /*!<@errcode: 0x1101 + @desc: Tx/Rx Phase Calibration: Error performing phase measurement + @maincause: Unknown data capture error + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run Calibration + */ + ADRV904X_CPU_TXRX_PHASE_XCORR_ERROR_2 = (ADRV904X_CPU_TXRX_PHASE_CAL_CODE_ERROR_START + 2u), /*!<@errcode: 0x1102 + @desc: Tx/Rx Phase Calibration: Error performing phase measurement + @maincause: Unknown data capture error + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run Calibration + */ + ADRV904X_CPU_TXRX_PHASE_WRONG_LO_COMBINATION = (ADRV904X_CPU_TXRX_PHASE_CAL_CODE_ERROR_START + 3u), /*!<@errcode: 0x1103 + @desc: Tx/Rx Phase Calibration: All the channels of the same CPU must either use the internal UHB LO or the external LO + @maincause: Follow guidelines for selecting the LO source + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Use the same LO source (internal or external) for all the channels + */ + /*!< ----- Object ID = ADRV904X_CPU_OBJID_TC_RXQEC Section Base Error Code = 0x3000 ---- @errcode: 0x3000 + @desc: Rx QEC Tracking Calibration + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_RXQEC_CAL_SEARCH_ERROR = (ADRV904X_CPU_RXQEC_CAL_CODE_ERROR_START + 1u), /*!<@errcode: 0x3001 + @desc: Rx QEC: Error during Signal Search + @maincause: Persistent signal-search HW unexpected Error when completing search + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Issue a CTRL RESET Command and re-run the Calibration + */ + ADRV904X_CPU_RXQEC_CAL_DATACAP_ERROR = (ADRV904X_CPU_RXQEC_CAL_CODE_ERROR_START + 2u), /*!<@errcode: 0x3002 + @desc: Rx QEC: Error during Data Capture + @maincause: Persistent data-capture HW unexpected Error when completing capture + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Issue a CTRL RESET Command and re-run the Calibration + */ + ADRV904X_CPU_RXQEC_CAL_UPDATE_ERROR = (ADRV904X_CPU_RXQEC_CAL_CODE_ERROR_START + 3u), /*!<@errcode: 0x3003 + @desc: Rx QEC: Error during Core Update + @maincause: Persistent core computation unexpected Error when completing update + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Issue a CTRL RESET Command and re-run the Calibration + */ + ADRV904X_CPU_RXQEC_CAL_REFRESH_ERROR = (ADRV904X_CPU_RXQEC_CAL_CODE_ERROR_START + 4u), /*!<@errcode: 0x3004 + @desc: Rx QEC:Error during QEC filter refresh + @maincause: Persistent filter computation unexpected Error when completing QEC refresh + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Issue a CTRL RESET Command and re-run the Calibration + */ + + ADRV904X_CPU_RXQEC_CAL_SEARCH_BW_ERROR = (ADRV904X_CPU_RXQEC_CAL_CODE_ERROR_START + 5u), /*!<@errcode: 0x3005 + @desc: Rx QEC: Unsupported Use Case Error + @maincause: Number of Frequency bins per search band exceeds the maximum (32) supported by HW + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check the bandwidth Parameters in the use case or change the use case + */ + ADRV904X_CPU_RXQEC_CAL_GAIN_TABLE_ERROR = (ADRV904X_CPU_RXQEC_CAL_CODE_ERROR_START + 6u), /*!<@errcode: 0x3006 + @desc: Rx QEC: Unsupported Use Case Error + @maincause: Unable to support the Rx Gain table that was loaded on boot + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Change the Rx Gain table or update the firmware + */ + ADRV904X_CPU_RXQEC_CAL_DCN_SDELAY_ERROR = (ADRV904X_CPU_RXQEC_CAL_CODE_ERROR_START + 7u), /*!<@errcode: 0x3007 + @desc: Rx QEC: DC Notch Filter Start Delay too large + @maincause: Unsupported Configuration Parameters for DC notch filter + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check DC notch Configuration or update the firmware + */ + /*!< ----- Object ID = ADRV904X_CPU_OBJID_TC_TX_LOL Section Base Error Code = 0x3100 ---- @errcode: 0x3100 + @desc: Tx Lol Tracking Calibration + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_TXLOL_TRACK_CAL_NO_INIT = (ADRV904X_CPU_TXLOL_TRACK_CAL_CODE_ERROR_START + 1u), /*!<@errcode: 0x3101 + @desc: Tx Lol: Cannot run Tracking Calibration without previously running Initialization Calibration + @maincause: Initialization Calibration was not run during initialization + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Run Initialization Calibration before attempting to run tracking Calibration + */ + ADRV904X_CPU_TXLOL_TRACK_CAL_RESOURCE_ERROR = (ADRV904X_CPU_TXLOL_TRACK_CAL_CODE_ERROR_START + 2u), /*!<@errcode: 0x3102 + @desc: Tx Lol: Error sharing resources with Tx QEC Calibration + @maincause: Unexpected Resource Sharing Error + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run Initialization Calibration before attempting to run tracking Calibration + */ + ADRV904X_CPU_TXLOL_TRACK_CAL_FSC_DATACAP_ERROR = (ADRV904X_CPU_TXLOL_TRACK_CAL_CODE_ERROR_START + 3u), /*!<@errcode: 0x3103 + @desc: Tx Lol: Error capturing FSC data + @maincause: Unexpected Data Capture Error + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run Initialization Calibration before attempting to run tracking Calibration + */ + ADRV904X_CPU_TXLOL_TRACK_CAL_DATACAP_ABORT_ERROR = (ADRV904X_CPU_TXLOL_TRACK_CAL_CODE_ERROR_START + 4u), /*!<@errcode: 0x3104 + @desc: Tx Lol: Error capturing FSC data + @maincause: Data capture aborted due AGC over Range Error + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run Initialization Calibration before attempting to run tracking Calibration + */ + ADRV904X_CPU_TXLOL_TRACK_CAL_EXT_DATACAP_ERROR = (ADRV904X_CPU_TXLOL_TRACK_CAL_CODE_ERROR_START + 5u), /*!<@errcode: 0x3105 + @desc: Tx Lol: Error capturing data from External Tx LOL accumulator + @maincause: Unexpected Data Capture Error + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run Initialization Calibration before attempting to run tracking Calibration + */ + ADRV904X_CPU_TXLOL_TRACK_CAL_EXT_PATHDELAY_ERROR = (ADRV904X_CPU_TXLOL_TRACK_CAL_CODE_ERROR_START + 6u), /*!<@errcode: 0x3106 + @desc: Tx Lol: Invalid Tx-to-ORx Path Delay passed to External Tx LOL accumulator + @maincause: Unsupported use case, Invalid Configurator output, or Invalid user Configuration + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Ensure combined Configurator and user-adjusted Path Delay is between 0 and 250 + */ + ADRV904X_CPU_TXLOL_TRACK_CAL_EXT_NCO_ERROR = (ADRV904X_CPU_TXLOL_TRACK_CAL_CODE_ERROR_START + 7u), /*!<@errcode: 0x3107 + @desc: Tx Lol: ORx LOL NCO not configured properly to mix Tx LO to DC at accumulator Input + @maincause: LOL NCO not reconfigured properly when Tx LO or ORx NCO Frequency changed at run-time + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Disable LOL tracking Calibration, re-issue Tx LO and/or ORx NCO Frequency change Command, then re-enable LOL tracking Calibration + */ + ADRV904X_CPU_TXLOL_CAL_INVALID_LO_FREQUENCY_ERROR = (ADRV904X_CPU_TXLOL_TRACK_CAL_CODE_ERROR_START + 8u), /*!<@errcode: 0x3108 + @desc: Tx Lol: Lo Frequency violates Frequency planning conditions + @maincause: Lo Frequency coincides with Loopback/ORx Sampling frequencies + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Change Lo Frequency to avoid Overlap on Loopback/ORx bandwidth edge + */ + ADRV904X_CPU_TXLOL_CORE_CONVERGENCE_ERROR = (ADRV904X_CPU_TXLOL_TRACK_CAL_CODE_ERROR_START + 9u), /*!<@errcode: 0x3109 + @desc: Tx Lol: Model does not agree with incoming observation data, indicating the Calibration has diverged + @maincause: Unexpected Calibration divergence can occur when observation data is corrupted (e.g. External Loopback disconnected) + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run Initialization Calibration before attempting to run tracking Calibration + */ + ADRV904X_CPU_TXLOL_CHANNEL_GAIN_ERROR = (ADRV904X_CPU_TXLOL_TRACK_CAL_CODE_ERROR_START + 10u), /*!<@errcode: 0x310A + @desc: Tx Lol: Tx-to-ORx channel gain estimate falls outside expected range + @maincause: Typically a Tx-to-ORx mapping problem (not observing the expected Tx channel) + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Fix external observation path, issue LOL channel reset command, and re-enable LOL tracking cal + */ + ADRV904X_CPU_TXLOL_LEAKAGE_ERROR = (ADRV904X_CPU_TXLOL_TRACK_CAL_CODE_ERROR_START + 11u), /*!<@errcode: 0x310B + @desc: Tx Lol: estimate leakage is too large or NaN, or estimate leakage variance is too small or NaN + @maincause: Typically an observation problem + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Fix external observation path, issue LOL channel reset command, and re-enable LOL tracking cal + */ + + + /*!< ----- Object ID = ADRV904X_CPU_OBJID_TC_TXQEC Section Base Error Code = 0x3200 ---- @errcode: 0x3200 + @desc: TxQEC Tracking Calibration + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_TXQEC_CAL_DATACAP_ERROR = (ADRV904X_CPU_TXQEC_CAL_CODE_ERROR_START + 1u), /*!<@errcode: 0x3201 + @desc: Tx QEC: Correlation Capture Error + @maincause: Timed out waiting for Data Capture to complete + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run Calibration + @cause: FSC is stuck + @recovenum: + */ + ADRV904X_CPU_TXQEC_CAL_NO_INIT_ERROR = (ADRV904X_CPU_TXQEC_CAL_CODE_ERROR_START + 2u), /*!<@errcode: 0x3202 + @desc: Tx QEC: Initial Calibration not done + @maincause: At least one of the required Initial Calibrations was not run + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Ensure that all required Initial Calibrations are run without Error + @cause: At least one of the Initial Calibrations was in Error + @recovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @recovtext: Re-run the Initial Calibration in Error / Perform Warm Boot + */ + ADRV904X_CPU_TXQEC_CAL_SEARCH_ERROR = (ADRV904X_CPU_TXQEC_CAL_CODE_ERROR_START + 3u), /*!< @errcode: 0x3203 + @desc: Tx QEC: Error Initializing Frequency mask for signal search + @maincause: Some other Calibration is conflicting with Tx QEC signal search + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Re-run TxQEC Tracking Calibration + @cause: Unspecified HW Error occurred during search + @recovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @recovtext: Re-run TxQEC Tracking Calibration + */ + ADRV904X_CPU_TXQEC_CAL_SEARCH_BW_ERROR = (ADRV904X_CPU_TXQEC_CAL_CODE_ERROR_START + 4u), /*!< @errcode: 0x3204 + @desc: Tx QEC: Error Initializing Frequency mask for signal search + @maincause: Signal search mask overflow due to unsupported Configurator Parameters + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Current firmware doesn't support this Profile/use case, contact ADI for FW update + */ + ADRV904X_CPU_TXQEC_CAL_TOO_MANY_BANDS_ERROR = (ADRV904X_CPU_TXQEC_CAL_CODE_ERROR_START + 5u), /*!< @errcode: 0x3205 + @desc: Tx QEC: Error configuring Tx QEC to work over specified Tx bands + @maincause: Unsupported Configurator Parameters + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Current firmware doesn't support this Profile/use case, contact ADI for FW update + */ + ADRV904X_CPU_TXQEC_CAL_ACTUATOR_RANGE_ERROR = (ADRV904X_CPU_TXQEC_CAL_CODE_ERROR_START + 6u), /*!< @errcode: 0x3206 + @desc: Tx QEC: Error configuring Tx QEC actuator, not enough correction Range + @maincause: The current firmware can not correct quadrature Error of this Device as it is different than expected + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Contact ADI for a firmware update + @cause: Configurator output provides Invalid bandwidths, LO and Sampling Rate information + @recovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @recovtext: Check Configurator output + */ + ADRV904X_CPU_TXQEC_CAL_DLY_CHECK__ERROR = (ADRV904X_CPU_TXQEC_CAL_CODE_ERROR_START + 7u), /*!< @errcode: 0x3207 + @desc: Tx QEC: Self Check Error, new coefficients increases group delay + @maincause: Data capture returning unexpected results + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Re-run the algorithm + @cause: Configuration Parameter not set correctly + @recovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @recovtext: Check Configuration Parameters + */ + ADRV904X_CPU_TXQEC_CAL_INSUFFICIENT_TONE_POWER = (ADRV904X_CPU_TXQEC_CAL_CODE_ERROR_START + 8u), /*!< @errcode: 0x3208 + @desc: Low Tx tone power, possibly due to wrong tone Frequency or some other errors on Tx path + @maincause: TxQEC Initialization, insufficient tone power + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_INTERFACE + @mainrecovtext: TXQEC Initialization Re-Run, contact ADI for FW debug, if Error repeats + */ + ADRV904X_CPU_TXQEC_CAL_TOO_MANY_INTERFERERS_ERROR = (ADRV904X_CPU_TXQEC_CAL_CODE_ERROR_START + 9u), /*!< @errcode: 0x3209 + @desc: Detected too many potential interfering/aliasing signals in the LB path + @maincause: Number of significant interferences exceeds FW Setting. ADI anticipated this Error to not occur in field + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + @mainrecovtext: Contact ADI to disable reporting this Error, Calibration performance maybe reduced + @cause: This Error is Enabled from within FW + @recovenum: ADI_ADRV904X_ERR_ACT_CHECK_INTERFACE + @recovtext: ADI needs to change FW to increase Calibration performance, if customer is required to continue to operate under current carrier configurations + */ + ADRV904X_CPU_TXQEC_CAL_INVALID_LO_FREQUENCY_ERROR = (ADRV904X_CPU_TXQEC_CAL_CODE_ERROR_START + 10u), /*!<@errcode: 0x320A + @desc: Detected user programmed LO Frequency too close to one of interfering harmonic in the LB path + @maincause: User has changed the LO Frequency Setting at runtime. ADI anticipated this Error to occur less frequently + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Use formula provided by ADI to compute a valid LO Frequency, otherwise Calibration performance maybe severely reduced + */ + ADRV904X_CPU_TXQEC_CAL_LARGE_DC_NOTCH_SETTLE_TIME = (ADRV904X_CPU_TXQEC_CAL_CODE_ERROR_START + 11u), /*!<@errcode: 0x320B + @desc: Tx QEC:DC notch settling time too large + @maincause: Unsupported Configurator Parameters + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Current firmware doesn't support this Configuration, contact ADI for FW update + */ + ADRV904X_CPU_TXQEC_CAL_INNOV_CHECK_ERROR = (ADRV904X_CPU_TXQEC_CAL_CODE_ERROR_START + 12u), /*!<@errcode: 0x320C + @desc: Tx QEC:Calibration detected that the QEC model does not agree with the incoming observation data + @maincause: Calibration detected divergence due to a bad observation + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Perform QEC reset, or re-run Initialization Calibration, before re-enabling QEC tracking Calibration + */ + + ADRV904X_CPU_TXQEC_CAL_NAN_ERROR = (ADRV904X_CPU_TXQEC_CAL_CODE_ERROR_START + 13u), /*!<@errcode: 0x320D + @desc: Tx QEC:Calibration detected NaN in critical state data + @maincause: Unexpected NaN, possibly due to divide-by-zero + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Perform QEC reset, or re-run Initialization Calibration, before re-enabling QEC tracking Calibration + */ + /*!< ---- Object ID = ADRV904X_CPU_OBJID_CFG_DEVICE_PROFILE Section Base Error Code = 0x8000 ---- @errcode: 0x8000 + @desc: Device Profile Configuration + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_CFG_DEVICE_PROFILE_CRC_ERROR = (ADRV904X_CPU_CFG_DEVICE_PROFILE_ERROR_CODE_START + 1u),/*!<@errcode: 0x8001 + @desc: Device Profile: Failed CRC verification + @maincause: Programmed image is corrupted. Original image may be Invalid or may have been corrupted during SPI transfer. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reprogram the Device Profile Image + */ + /*!< ---- Object ID = ADRV904X_CPU_OBJID_CFG_PARITY_ERROR_CHECK Section Base Error Code = 0x8500 ---- @errcode: 0x8500 + @desc: Device Profile Configuration + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_CFG_PARITY_DOUBLE_BIT_ERROR = (ADRV904X_CPU_CFG_PARITY_ERROR_CODE_START + 1u), /*!<@errcode: 0x8501 + @desc: Parity: Fatal 2bit Error + @maincause: Memory data is corrupted. Uncorrectable error. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: + */ + + /*!< ----- Object ID = ADRV904X_CPU_OBJID_DRV_NCO Section Base Error Code = 0xB000 ---- @errcode: 0xB000 + @desc: NCO + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_NCO_DRV_INVALID_FREQ = (ADRV904X_CPU_NCO_DRV_ERROR_CODE_START + 1u), /*!<@errcode: 0xB001 + @desc: NCO: Invalid Frequency Parameters + @maincause: Frequency not supported for Sampling Rate + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and NCO Frequency settings + */ + ADRV904X_CPU_NCO_DRV_INVALID_PHASE = (ADRV904X_CPU_NCO_DRV_ERROR_CODE_START + 2u), /*!<@errcode: 0xB002 + @desc: NCO: Invalid Phase Parameters + @maincause: Invalid Phase Offset Setting + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: NCO Phase Setting must be between 0 - 359 + */ + ADRV904X_CPU_NCO_DRV_INVALID_GAIN = (ADRV904X_CPU_NCO_DRV_ERROR_CODE_START + 3u), /*!<@errcode: 0xB003 + @desc: NCO: Invalid Gain Parameters + @maincause: Invalid Gain Setting + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: NCO I/Q Gain Setting is Invalid + */ + ADRV904X_CPU_NCO_DRV_INVALID_SELECT = (ADRV904X_CPU_NCO_DRV_ERROR_CODE_START + 4u), /*!<@errcode: 0xB004 + @desc: NCO: Band or type selection + @maincause: Invalid band or NCO selected + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Valid Value must be used for DDC or Datapath NCO + */ + ADRV904X_CPU_NCO_DRV_INVALID_DUAL_TONE = (ADRV904X_CPU_NCO_DRV_ERROR_CODE_START + 5u), /*!<@errcode: 0xB005 + @desc: NCO: Dual tone frequencies are out-of-Range + @maincause: Frequencies not supported for Sampling Rate + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and NCO Frequency settings + */ + ADRV904X_CPU_NCO_DRV_INVALID_MIXER_NCOSET = (ADRV904X_CPU_NCO_DRV_ERROR_CODE_START + 6u), /*!<@errcode: 0xB006 + @desc: NCO: Tx Mixer NCO Frequency can not be changed while TxTestTone Enabled + @maincause: Disable Test tone with TxTestToneSet() before calling TxNcoShifterSet() + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + @mainrecovtext: Check API Call Sequence + */ + + /*!< ---- Object ID = ADRV904X_CPU_OBJID_DRV_STREAM Section Base Error Code = 0xB100 --- @errcode: 0xB100 + @desc: Stream + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_STRM_DRV_INVALID_PARAM = (ADRV904X_CPU_STREAM_DRV_ERROR_CODE_START + 1u), /*!<@errcode: 0xB101 + @desc: Stream: Invalid Input Parameters + @maincause: One or more Input Parameters are not valid + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_STRM_DRV_TIMEOUT = (ADRV904X_CPU_STREAM_DRV_ERROR_CODE_START + 2u), /*!<@errcode: 0xB102 + @desc: Stream:Timer expired waiting for stream completion + @maincause: The stream Timeout can occur due to stream processor waiting for other streams to complete + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: The stream execution is timed out. Rerun the feature to recover from this Error. + */ + + ADRV904X_CPU_STRM_DRV_GENERAL_ERROR = (ADRV904X_CPU_STREAM_DRV_ERROR_CODE_START + 3u), /*!<@errcode: 0xB103 + @desc: Stream: Triggered stream reported an Error + @maincause: The stream that is triggered either through firmware or API has generated an Error. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: The stream number being triggered should be checked. + */ + + ADRV904X_CPU_STRM_DRV_CRC_ERROR = (ADRV904X_CPU_STREAM_DRV_ERROR_CODE_START + 4u), /*!<@errcode: 0xB104 + @desc: Stream: Failed CRC verification + @maincause: Programmed image is corrupted. Original image may be Invalid or may have been corrupted during SPI transfer. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reprogram the stream image. + @cause: The failure could be due to bit errors in SPI interface. + @recovenum: + */ + ADRV904X_CPU_STRM_DRV_STM_REP_FIFO_ERROR = (ADRV904X_CPU_STREAM_DRV_ERROR_CODE_START + 5u), /*!<@errcode: 0xB105 + @desc: Stream: Stream Processor reported a FIFO Error + @maincause: The stream FIFO is full. This could happen due to back to back streams being triggered. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Rerunning the feature could solve the issue. + */ + ADRV904X_CPU_STRM_DRV_STM_REP_EXT_TIMER_ERROR = (ADRV904X_CPU_STREAM_DRV_ERROR_CODE_START + 6u), /*!<@errcode: 0xB106 + @desc: Stream: Stream Processor reported an External Timer Error + @maincause: External Timer started by stream Failed. This could fail if no External timers available. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Rerunning the feature could solve the issue. + */ + ADRV904X_CPU_STRM_DRV_STM_REP_INV_INSTR = (ADRV904X_CPU_STREAM_DRV_ERROR_CODE_START + 7u), /*!<@errcode: 0xB107 + @desc: Stream: Stream Processor reported an Invalid instruction + @maincause: This could happen if the stream is corrupted or stream is generated wrongly + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Recreate the stream and reprogram the Device. If the problem persists contact ADI to fix the stream. + */ + ADRV904X_CPU_STRM_DRV_STM_REP_INV_AHB_ADDR = (ADRV904X_CPU_STREAM_DRV_ERROR_CODE_START + 8u), /*!<@errcode: 0xB108 + @desc: Stream: Stream Processor reported an Invalid AHB address + @maincause: Wrong AHB address is accessed in the stream. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Recreate the stream and reprogram the Device. If the problem persists contact ADI to fix the stream. + */ + ADRV904X_CPU_STRM_DRV_STM_REP_INV_STREAM_NUM = (ADRV904X_CPU_STREAM_DRV_ERROR_CODE_START + 9u), /*!<@errcode: 0xB109 + @desc: Stream: Stream Processor reported an Invalid stream number + @maincause: Invalid stream number called from stream or firmware + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Recreate the stream and reprogram the Device. If the problem persists contact ADI to fix the stream. + */ + ADRV904X_CPU_STRM_DRV_STM_REP_STACK_OVERFLOW = (ADRV904X_CPU_STREAM_DRV_ERROR_CODE_START + 10u), /*!<@errcode: 0xB10A + @desc: Stream: Stream Processor reported a stack overflow + @maincause: Too many nested calls in the stream can cause this + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Recreate the stream and reprogram the Device. If the problem persists contact ADI to fix the stream. + */ + ADRV904X_CPU_STRM_DRV_STM_REP_TIMEOUT = (ADRV904X_CPU_STREAM_DRV_ERROR_CODE_START + 11u), /*!<@errcode: 0xB10B + @desc: Stream: Stream Processor reported a Timeout Error + @maincause: The stream did not complete within the set Timeout period + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Recreate the stream and reprogram the Device. If the problem persists contact ADI to fix the stream. + */ + ADRV904X_CPU_STRM_DRV_STM_REP_CHECK_INSTR_ERROR = (ADRV904X_CPU_STREAM_DRV_ERROR_CODE_START + 12u), /*!<@errcode: 0xB10C + @desc: Stream: Stream Processor reported a check instruction Error + @maincause: This could happen if a wrong instruction is used in the stream. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Recreate the stream and reprogram the Device. If the problem persists contact ADI to fix the stream. + */ + ADRV904X_CPU_STRM_DRV_STM_REP_INV_SPI_ADDR = (ADRV904X_CPU_STREAM_DRV_ERROR_CODE_START + 13u), /*!<@errcode: 0xB10D + @desc: Stream: Stream Processor reported an Invalid SPI address + @maincause: Invalid SPI address accessed in the stream. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Recreate the stream and reprogram the Device. If the problem persists contact ADI to fix the stream. + */ + ADRV904X_CPU_STRM_DRV_PREV_STM_TIMEOUT = (ADRV904X_CPU_STREAM_DRV_ERROR_CODE_START + 14u), /*!<@errcode: 0xB10E + @desc: Stream: Previous Stream didn't finish + @maincause: The previous stream started by the stream processor or firmware did not finish + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Rerun the feature if the problem persists, contact ADI to fix the stream Timeout. + */ + ADRV904X_CPU_STRM_DRV_FUNC_NOT_SUPPORTED = (ADRV904X_CPU_STREAM_DRV_ERROR_CODE_START + 15u), /*!<@errcode: 0xB10F + @desc: Stream: Function not supported + @maincause: The functionality is not yet supported. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Recreate the stream and reprogram the Device. If the problem persists contact ADI to fix the stream. + */ + + /*!< ---- Object ID = ADRV904X_CPU_OBJID_DRV_FSC Section Base Error Code = 0xB200 --- @errcode: 0xB200 + @desc: Fsc + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_FSC_USE_CASE_DEC_ERROR = (ADRV904X_CPU_FSC_DRV_ERROR_CODE_START + 1u), /*!<@errcode: 0xB201 + @desc: FSC: Cannot find FSC decimation rates to suit this use case + @maincause: Current Calibration Configuration does not support this use case + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Check for valid/supported use case. Firmware update may be required. + */ + ADRV904X_CPU_FSC_USE_CASE_CLK_ERROR = (ADRV904X_CPU_FSC_DRV_ERROR_CODE_START + 2u), /*!<@errcode: 0xB202 + @desc: FSC: Cannot find valid FSC clock Configuration to suit this use case + @maincause: This use case is not currently supported by the FSC and its Device driver + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Check for valid/supported use case. Firmware update may be required. + */ + ADRV904X_CPU_FSC_NESTED_CAPTURE_ERROR = (ADRV904X_CPU_FSC_DRV_ERROR_CODE_START + 3u), /*!<@errcode: 0xB203 + @desc: FSC: Attempted to start second FSC capture before the first had completed + @maincause: Firmware synchronization bug is causing a resource-sharing collision in the FSC + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @marinrecovtext: Attempt to restart the Calibration that reported this Error. + */ + ADRV904X_CPU_FSC_PHASE_COMP_CAL_ANALYSIS_ERROR = (ADRV904X_CPU_FSC_DRV_ERROR_CODE_START + 4u), /*!<@errcode: 0xB204 + @desc: FSC: Cannot find valid Phase compensation factor for LB NCOs + @maincause: Loopback Phase Calibration has Failed due to unexpected or noisy observation data + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Attempt to re-run Path Delay Calibration + */ + ADRV904X_CPU_FSC_PHASE_COMP_CAL_CAPTURE_ERROR = (ADRV904X_CPU_FSC_DRV_ERROR_CODE_START + 5u), /*!<@errcode: 0xB205 + @desc: FSC: Error capturing data for Phase Compensation Calibration + @maincause: Unexpected Data Capture failure + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Attempt to re-run Path Delay Calibration + */ + + /*!< ---- Object ID = ADRV904X_CPU_OBJID_DRV_MASTER_BIAS Section Base Error Code = 0xB300 ---- @errcode: 0xB300 + @desc: Master Bias + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_MASTER_BIAS_RB0_PTAT_CAL_FAILED = (ADRV904X_CPU_MASTER_BIAS_DRV_ERROR_CODE_START + 1u), /*!<@errcode: 0xB301 + @desc: Master Bias: RB0 Ptat Calibration Failed + @maincause: Unexpected failure in resistor trim logic, or no clock provided to trim logic + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_MASTER_BIAS_RB1_PTAT_CAL_FAILED = (ADRV904X_CPU_MASTER_BIAS_DRV_ERROR_CODE_START + 2u), /*!<@errcode: 0xB302 + @desc: Master Bias: RB1 Ptat Calibration Failed + @maincause: Unexpected failure in resistor trim logic, or no clock provided to trim logic + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_MASTER_BIAS_PTAT_R_TXBBF_INVALID = (ADRV904X_CPU_MASTER_BIAS_DRV_ERROR_CODE_START + 3u), /*!<@errcode: 0xB303 + @desc: Master Bias: Invalid Ptat resistor value for Tx BBF + @maincause: Ptat trim Calibration generated an out-of-Range result + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_MASTER_BIAS_PTAT_R_UPC_INVALID = (ADRV904X_CPU_MASTER_BIAS_DRV_ERROR_CODE_START + 4u), /*!<@errcode: 0xB304 + @desc: Master Bias: Invalid Ptat resistor value for UPC + @maincause: Ptat trim Calibration generated an out-of-Range result + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_MASTER_BIAS_PTAT_R_UPC_BIAS_INVALID = (ADRV904X_CPU_MASTER_BIAS_DRV_ERROR_CODE_START + 5u), /*!<@errcode: 0xB305 + @desc: Master Bias: Invalid Ptat resistor value for UPC BIAS + @maincause: Ptat trim Calibration generated an out-of-Range result + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_MASTER_BIAS_PTAT_R_VGA_INVALID = (ADRV904X_CPU_MASTER_BIAS_DRV_ERROR_CODE_START + 6u), /*!<@errcode: 0xB306 + @desc: Master Bias: Invalid Ptat resistor value for VGA + @maincause: Ptat trim Calibration generated an out-of-Range result + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + + /*!< ---- Object ID = ADRV904X_CPU_OBJID_DRV_LDO Section Base Error Code = 0xB400 --- @errcode: 0xB400 + @desc: VCO LDO + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_VCO_LDO_LOWOUTPUT = (ADRV904X_CPU_LDO_DRV_ERROR_CODE_START + 1u), /*!<@errcode: 0xB401 + @desc: VCO LDO: LDO output voltage is below low side of target Range + @maincause: VCO LDO bypass capacitor is shorted to GND + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Check Bypass Capacitor & Soldering for Damage and/or Short. Contact ADI if the problem persists. + @cause: Unexpected LDO Hardware behavior + @recovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @recovtext: Reset Device and try again. Contact ADI if the problem persists + */ + + ADRV904X_CPU_VCO_LDO_UVL = (ADRV904X_CPU_LDO_DRV_ERROR_CODE_START + 2u), /*!<@errcode: 0xB402 + @desc: VCO LDO: Input supply voltage is below low side of target Range + @maincause: Input supply voltage is below undervoltage-lockout threshold + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Check the Input supply voltage and try again. Contact ADI if the problem persists. + */ + + ADRV904X_CPU_VCO_LDO_NOREF = (ADRV904X_CPU_LDO_DRV_ERROR_CODE_START + 3u), /*!<@errcode: 0xB403 + @desc: VCO LDO: Reference Input voltage below low side of target Range + @maincause: Unexpected Hardware behavior, reference Input voltage below low side of target Range + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + + ADRV904X_CPU_VCO_LDO_THERMSDN = (ADRV904X_CPU_LDO_DRV_ERROR_CODE_START + 4u), /*!<@errcode: 0xB404 + @desc: VCO LDO: Temperature is above high side of target Range + @maincause: Temperature is above high side of target Range + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Check Heat Dissipation is at required level. Contact ADI if the problem persists. + @cause: Unexpected LDO Hardware behavior + @recovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @recovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + + ADRV904X_CPU_VCO_LDO_CURLIM = (ADRV904X_CPU_LDO_DRV_ERROR_CODE_START + 5u), /*!<@errcode: 0xB405 + @desc: VCO LDO: Load current is above high side of target Range dictated by VCO + @maincause: VCO LDO bypass capacitor is shorted to GND + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Check Bypass capacitor & soldering for damage/short. Contact ADI if the problem persists. + @cause: Unexpected LDO Hardware behavior + @recovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @recovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + + ADRV904X_CPU_VCO_LDO_OVERVOLT = (ADRV904X_CPU_LDO_DRV_ERROR_CODE_START + 6u), /*!<@errcode: 0xB406 + @desc: VCO LDO: LDO output voltage is above high side of target Range + @maincause: VCO LDO bypass capacitor is shorted to VDD + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Check board layout. Contact ADI if the problem persists. + @cause: Unexpected LDO Hardware behavior + @recovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @recovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + + ADRV904X_CPU_SHUNT_LDO_SLDO1P0_UV = (ADRV904X_CPU_LDO_DRV_ERROR_CODE_START + 7u), /*!<@errcode: 0xB407 + @desc: VCO LDO: 1.0V Shunt LDO: LDO output voltage is below low threshold + @maincause: PD bit = 1 or Rampup Bit = 0 or Master Bias/LCR is not up + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: Unexpected LDO Hardware behavior + @recovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @recovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + + ADRV904X_CPU_SHUNT_LDO_SLDO1P0_OV = (ADRV904X_CPU_LDO_DRV_ERROR_CODE_START + 8u), /*!<@errcode: 0xB408 + @desc: VCO LDO: 1.0V Shunt LDO: LDO output voltage is above high threshold + @maincause: PD bit = 1 or Unexpected Hardware behavior + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + + + ADRV904X_CPU_SHUNT_LDO_SLDO1P0_POWER_NOT_OK = (ADRV904X_CPU_LDO_DRV_ERROR_CODE_START + 9u), /*!<@errcode: 0xB409 + @desc: VCO LDO: 1.0V Shunt LDO: LDO output voltage is out of regulation + @maincause: Unexpected Hardware behavior, under and over voltage status bits are set + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + + + ADRV904X_CPU_SHUNT_LDO_SLDO0P8_POWER_NOT_OK = (ADRV904X_CPU_LDO_DRV_ERROR_CODE_START + 10u), /*!<@errcode: 0xB40A + @desc: VCO LDO: 0.8V Shunt LDO: LDO output voltage below the targeted threshold + @maincause: LDO output does not power up at all or it may need longer wait time to power up to the targeted threshold. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + + ADRV904X_CPU_VCO_LDO_BAD_STATE = (ADRV904X_CPU_LDO_DRV_ERROR_CODE_START + 11u), /*!<@errcode: 0xB40B + @desc: VCO LDO: Unspecified VCO LDO Error + @maincause: Power Not Good & No Other LDO Status Flag is Indicating an Error + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: Unexpected LDO Hardware behavior + @recovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @recovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + + /*!< ---- Object ID = ADRV904X_CPU_OBJID_DRV_DWT Section Base Error Code = 0xB500 --- @errcode: 0xB500 + @desc: DWT + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_DWT_DRV_NOT_INITIALIZED = (ADRV904X_CPU_DWT_DRV_ERROR_CODE_START + 1u), /*!<@errcode: 0xB501 + @desc: DWT: Data Watchpoint and Trace (DWT) driver not initialized + @maincause: HW doesn't support the DWT the driver is expecting + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reprogram the Device using a Valid Package and try again. Contact ADI if the problem persists. + */ + + /*!< ---- Object ID = ADRV904X_CPU_OBJID_DRV_TEMP Section Base Error Code = 0xB600 --- @errcode: 0xB600 + @desc: Temperature + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_DEVTEMP_INVALID_AVGMASK_ERROR = (ADRV904X_CPU_TEMP_ERROR_CODE_START + 1u), /*!<@errcode: 0xB601 + @desc: Temperature:HAL Invalid Average Mask + @maincause: Parameter out of Range + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Parameter should be > 0 and < 256, see adi_adrv904x_DevTempSensor_e in the API + */ + + ADRV904X_CPU_DEV_TEMP_SENSOR_TIMEOUT_TX0 = (ADRV904X_CPU_TEMP_ERROR_CODE_START + 2u), /*!<@errcode: 0xB602 + @desc: Temperature: HAL Temp sensor for TX0 conversion Timeout + @maincause: Hardware was unable to acquire temperature Sample within time limit + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reset the Device, if the problem persists acquire a Memory Dump and contact ADI + */ + ADRV904X_CPU_DEV_TEMP_SENSOR_TIMEOUT_TX1 = (ADRV904X_CPU_TEMP_ERROR_CODE_START + 3u), /*!<@errcode: 0xB603 + @desc: Temperature: HAL Temp sensor for TX1 conversion Timeout + @maincause: Hardware was unable to acquire temperature Sample within time limit + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reset the Device, if the problem persists acquire a Memory Dump and contact ADI + */ + ADRV904X_CPU_DEV_TEMP_SENSOR_TIMEOUT_TX2 = (ADRV904X_CPU_TEMP_ERROR_CODE_START + 4u), /*!<@errcode: 0xB604 + @desc: Temperature: HAL Temp sensor for TX2 conversion Timeout + @maincause: Hardware was unable to acquire temperature Sample within time limit + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reset the Device, if the problem persists acquire a Memory Dump and contact ADI + */ + ADRV904X_CPU_DEV_TEMP_SENSOR_TIMEOUT_TX3 = (ADRV904X_CPU_TEMP_ERROR_CODE_START + 5u), /*!<@errcode: 0xB605 + @desc: Temperature: HAL Temp sensor for TX3 conversion Timeout + @maincause: Hardware was unable to acquire temperature Sample within time limit + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reset the Device, if the problem persists acquire a Memory Dump and contact ADI + */ + ADRV904X_CPU_DEV_TEMP_SENSOR_TIMEOUT_TX4 = (ADRV904X_CPU_TEMP_ERROR_CODE_START + 6u), /*!<@errcode: 0xB606 + @desc: Temperature: HAL Temp sensor for TX4 conversion Timeout + @maincause: Hardware was unable to acquire temperature Sample within time limit + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reset the Device, if the problem persists acquire a Memory Dump and contact ADI + */ + ADRV904X_CPU_DEV_TEMP_SENSOR_TIMEOUT_TX5 = (ADRV904X_CPU_TEMP_ERROR_CODE_START + 7u), /*!<@errcode: 0xB607 + @desc: Temperature: HAL Temp sensor for TX5 conversion Timeout + @maincause: Hardware was unable to acquire temperature Sample within time limit + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reset the Device, if the problem persists acquire a Memory Dump and contact ADI + */ + ADRV904X_CPU_DEV_TEMP_SENSOR_TIMEOUT_TX6 = (ADRV904X_CPU_TEMP_ERROR_CODE_START + 8u), /*!<@errcode: 0xB608 + @desc: Temperature: HAL Temp sensor for TX6 conversion Timeout + @maincause: Hardware was unable to acquire temperature Sample within time limit + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reset the Device, if the problem persists acquire a Memory Dump and contact ADI + */ + ADRV904X_CPU_DEV_TEMP_SENSOR_TIMEOUT_TX7 = (ADRV904X_CPU_TEMP_ERROR_CODE_START + 9u), /*!<@errcode: 0xB609 + @desc: Temperature: HAL Temp sensor for TX7 conversion Timeout + @maincause: Hardware was unable to acquire temperature Sample within time limit + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reset the Device, if the problem persists acquire a Memory Dump and contact ADI + */ + ADRV904X_CPU_DEV_TEMP_SENSOR_TIMEOUT_CLKGEN = (ADRV904X_CPU_TEMP_ERROR_CODE_START + 10u), /*!<@errcode: 0xB60A + @desc: Temperature: HAL Temp sensor for CLK Gen PLL conversion Timeout + @maincause: Hardware was unable to acquire temperature Sample within time limit + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reset the Device, if the problem persists acquire a Memory Dump and contact ADI + */ + ADRV904X_CPU_DEV_TEMP_SENSOR_TIMEOUT_RF0 = (ADRV904X_CPU_TEMP_ERROR_CODE_START + 11u), /*!<@errcode: 0xB60B + @desc: Temperature: HAL Temp sensor for RF0 PLL conversion Timeout + @maincause: Hardware was unable to acquire temperature Sample within time limit + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reset the Device, if the problem persists acquire a Memory Dump and contact ADI + */ + ADRV904X_CPU_DEV_TEMP_SENSOR_TIMEOUT_RF1 = (ADRV904X_CPU_TEMP_ERROR_CODE_START + 12u), /*!<@errcode: 0xB60C + @desc: Temperature: HAL Temp sensor for RF1 PLL conversion Timeout + @maincause: Hardware was unable to acquire temperature Sample within time limit + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reset the Device, if the problem persists acquire a Memory Dump and contact ADI + */ + ADRV904X_CPU_DEV_TEMP_SENSOR_TIMEOUT_SERDES = (ADRV904X_CPU_TEMP_ERROR_CODE_START + 13u), /*!<@errcode: 0xB60D + @desc: Temperature: HAL Temp sensor for SERDES PLL conversion Timeout + @maincause: Hardware was unable to acquire temperature Sample within time limit + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reset the Device, if the problem persists acquire a Memory Dump and contact ADI + */ + ADRV904X_CPU_DEV_TEMP_SENSOR_INVALID_EN_ERROR = (ADRV904X_CPU_TEMP_ERROR_CODE_START + 14u), /*!<@errcode: 0xB60E + @desc: Temperature: HAL Invalid Temp sensor Enable bit + @maincause: Parameter out of Range + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Temp Sensor is not on the accessed core, see adi_adrv904x_DevTempSensor_e in the API + */ + + /*!< ---- Object ID = ADRV904X_CPU_OBJID_DRV_PLL Section Base Error Code = 0xB700 --- @errcode: 0xB700 + @desc: PLL + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_PLL_SYNTH_LOCK_FAILED_ERROR = (ADRV904X_CPU_PLL_ERROR_CODE_START + 1u), /*!<@errcode: 0xB701 + @desc: PLL: Synthesizer Lock Failed + @maincause: Hardware Lock Detection Timeout + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Check External Clock Sources and Power Supply + */ + ADRV904X_CPU_PLL_RANGE_ERROR = (ADRV904X_CPU_PLL_ERROR_CODE_START + 2u), /*!<@errcode: 0xB702 + @desc: PLL: User Input Frequency Out of Range + @maincause: Specified Frequency by the user was out of Range + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Ensure requested Input Frequency is in Range + */ + ADRV904X_CPU_PLL_INVALID_PLL_ERROR = (ADRV904X_CPU_PLL_ERROR_CODE_START + 3u), /*!<@errcode: 0xB703 + @desc: PLL: User specified Invalid PLL type + @maincause: Specified PLL name by the user was incorrect + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Ensure the correct PLL is specified + */ + ADRV904X_CPU_PLL_NOT_ENABLED_ERROR = (ADRV904X_CPU_PLL_ERROR_CODE_START + 4u), /*!<@errcode: 0xB704 + @desc: PLL: Selected PLL was Not Enabled + @maincause: Selected PLL not Enabled + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: This Error code is not used + */ + ADRV904X_CPU_PLL_VCO_CAL_FAILED_ERROR = (ADRV904X_CPU_PLL_ERROR_CODE_START + 5u), /*!<@errcode: 0xB705 + @desc: PLL: VCO Calibration Failed + @maincause: Unexpected Hardware behavior, Hardware VCO Calibration Timeout + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_PLL_INVALID_LOOPFILTER_PARAM_ERROR = (ADRV904X_CPU_PLL_ERROR_CODE_START + 6u), /*!<@errcode: 0xB706 + @desc: PLL: Invalid Loopfilter Parameters, Phase of BW out of Range. + @maincause: Specified Loopfilter Parameters out of Range + @mainrecovenum:ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check that the Input Parameters are in Range + */ + ADRV904X_CPU_PLL_CP_CAL_FAILED_ERROR = (ADRV904X_CPU_PLL_ERROR_CODE_START + 7u), /*!<@errcode: 0xB707 + @desc: PLL: CP Calibration Failed + @maincause: Unexpected Hardware behavior, Hardware CP Calibration Timeout + @mainrecovenum:ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_PLL_BLEED_CAL_FAILED_ERROR = (ADRV904X_CPU_PLL_ERROR_CODE_START + 8u), /*!<@errcode: 0xB708 + @desc: PLL: Bleed ramp Calibration Failed + @maincause: Unexpected Hardware behavior, Hardware Bleed Calibration Timeout + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_PLL_INVALID_RX_LEAF_ERROR = (ADRV904X_CPU_PLL_ERROR_CODE_START + 9u), /*!<@errcode: 0xB709 + @desc: PLL: Invalid Rx Leaf Hardware Setting, the selected Frequency could not be realized. + @maincause: Specified RX Frequency could not be realized + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check that the Input Parameters are in Range + */ + ADRV904X_CPU_PLL_INVALID_TX_LEAF_ERROR = (ADRV904X_CPU_PLL_ERROR_CODE_START + 10u), /*!<@errcode: 0xB70A + @desc: PLL: Invalid Tx Leaf Hardware Setting, the selected Frequency could not be realized. + @maincause: Specified TX Frequency could not be realized + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: This Error code is not used + */ + ADRV904X_PHASE_SYNC_INVALID_SETTING_ERROR = (ADRV904X_CPU_PLL_ERROR_CODE_START + 11u), /*!<@errcode: 0xB70B + @desc: PLL: Phase Sync Invalid mode Setting + @maincause: Specified Phase Sync mode Invalid + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_PHASE_SYNC_TIMEOUT_ERROR = (ADRV904X_CPU_PLL_ERROR_CODE_START + 12u), /*!<@errcode: 0xB70C + @desc: PLL: Phase Sync Timeout + @maincause: Phase Sync Calibration Timeout + @mainrecovenum:ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_PHASE_MISMATCH_ERROR = (ADRV904X_CPU_PLL_ERROR_CODE_START + 13u), /*!<@errcode: 0xB70D + @desc: PLL:Phase Sync Phase Mismatch + @maincause: Phase Sync Golden Counter Mismatch + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_EXT_LO_IN_RANGE_ERROR = (ADRV904X_CPU_PLL_ERROR_CODE_START + 14u), /*!<@errcode: 0xB70E + @desc: PLL: External LO Input Frequency out of Range + @maincause: Specified External LO Frequency out of Range + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Ensure Input Parameters are correct + */ + ADRV904X_CPU_PLL_SWEEPFAIL_ARM_TOO_FAST = (ADRV904X_CPU_PLL_ERROR_CODE_START + 15u), /*!<@errcode: 0xB70F + @desc: PLL: CLK Sweep Test Error + @maincause: CPU Clock is Too Fast + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_PLL_MUST_BE_IN_TEST_MODE = (ADRV904X_CPU_PLL_ERROR_CODE_START + 17u), /*!<@errcode: 0xB711 + @desc: PLL: Invalid Control Command + @maincause: PLL Module is not in Debug Mode + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Ensure Device is in correct state for Command + */ + ADRV904X_PHASE_GCNT_SDM_MCS_TIMEOUT = (ADRV904X_CPU_PLL_ERROR_CODE_START + 18u), /*!<@errcode: 0xB712 + @desc: PLL: GCNT SDM MCS Timeout + @maincause: GCNT SDM MCS Hardware Timeout + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_PHASE_GCNT_CLKGEN_MCS_TIMEOUT = (ADRV904X_CPU_PLL_ERROR_CODE_START + 19u), /*!<@errcode: 0xB713 + @desc: PLL: GCNT ClkGen MCS Timeout + @maincause: GCNT Clkgen MCS Hardware Timeout + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_PLL_FORCED_ALC_TIMEOUT = (ADRV904X_CPU_PLL_ERROR_CODE_START + 20u), /*!<@errcode: 0xB714 + @desc: PLL: Forced ALC Enable-Disable Timeout + @maincause: Forced ALC Enable-Disabled Hardware Timeout + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + + ADRV904X_CPU_PLL_SET_MODULUS_ERROR = (ADRV904X_CPU_PLL_ERROR_CODE_START + 21u), /*!<@errcode: 0xB715 + @desc: PLL: Unable to lookup and set the PLL modulus value + @maincause: Device clock must be divisable by 122.88 or 184.32 MHz + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check that device clock setting is supported + */ + ADRV904X_CPU_PLL_CLK_RATE_LIMIT_ERROR = (ADRV904X_CPU_PLL_ERROR_CODE_START + 22u), /*!<@errcode: 0xB716 + @desc: PLL: clock rate exceeded the design limit + @maincause: PLL clock rate must be < 250 MHz + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + /*!< ---- Object ID = ADRV904X_CPU_OBJID_DRV_JESD Section Base Error Code = 0xB800 --- !<@errcode: 0xB800 + @desc: JESD + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_JESD_DRV_FRM_LANE_OVERLAP_ERROR = (ADRV904X_CPU_JESD_ERROR_CODE_START + 1u), /*!<@errcode: 0xB801 + @desc: JESD: Serializer Lane Overlap + @maincause: Incorrect Serializer Lane assignment + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and restart the Device + */ + ADRV904X_JESD_DRV_DFRM_LANE_OVERLAP_ERROR = (ADRV904X_CPU_JESD_ERROR_CODE_START + 2u), /*!<@errcode: 0xB802 + @desc: JESD: Deserializer Lane Overlap + @maincause: Incorrect Deserializer Lane assignment + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and restart the Device + */ + ADRV904X_JESD_DRV_FRM_INVALID_SAMPRATE = (ADRV904X_CPU_JESD_ERROR_CODE_START + 3u), /*!<@errcode: 0xB803 + @desc: JESD: Framer Invalid Sample Rate + @maincause: Incorrect Framer Sample Rate in the Profile + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and restart the Device + */ + ADRV904X_JESD_DRV_LKSH_INVALID_SAMPRATE = (ADRV904X_CPU_JESD_ERROR_CODE_START + 4u), /*!<@errcode: 0xB804 + @desc: JESD: Link sharing Invalid Sample Rate + @maincause: Incorrect Link sharing Sample Rate in the Profile + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and restart the Device + */ + ADRV904X_JESD_DRV_DFRM_INVALID_SAMPRATE = (ADRV904X_CPU_JESD_ERROR_CODE_START + 5u), /*!<@errcode: 0xB805 + @desc: JESD: Deframer Invalid Sample Rate + @maincause: Incorrect Deframer Sample Rate in the Profile + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and restart the Device + */ + ADRV904X_JESD_DRV_FRM_SYNC_PAD_CFG_INVALID = (ADRV904X_CPU_JESD_ERROR_CODE_START + 6u), /*!<@errcode: 0xB806 + @desc: JESD: Invalid Framer Sync Pad Configuration + @maincause: Incorrect Framer Sync pad Configuration provided + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and restart the Device + */ + ADRV904X_JESD_DRV_DFRM_SYNC_PAD_CFG_INVALID = (ADRV904X_CPU_JESD_ERROR_CODE_START + 7u), /*!<@errcode: 0xB807 + @desc: JESD:Invalid Deframer Sync Pad Configuration + @maincause: Incorrect Deframer Sync pad Configuration provided + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and restart the Device + */ + ADRV904X_JESD_DRV_FRM0_NOT_ENABLED = (ADRV904X_CPU_JESD_ERROR_CODE_START + 8u), /*!<@errcode: 0xB808 + @desc: JESD: Framer 0 must be Enabled + @maincause: Framer 0 is not used in the Profile + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and restart the Device + */ + ADRV904X_JESD_DRV_FRM_INVALID_SPLXBAR_ENTRY = (ADRV904X_CPU_JESD_ERROR_CODE_START + 9u), /*!<@errcode: 0xB809 + @desc: JESD: Invalid Framer Sample Crossbar entry + @maincause: Invalid Framer Sample Crossbar entry in the Profile + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and restart the Device + */ + ADRV904X_JESD_DRV_FRM_INVALID_LINK_LAYER_MODE = (ADRV904X_CPU_JESD_ERROR_CODE_START + 10u), /*!<@errcode: 0xB80A + @desc: JESD:Invalid Framer Link layer mode of Operation + @maincause: Invalid Framer mode Parameter in the Profile + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and restart the Device + */ + ADRV904X_JESD_DRV_DFRM_INVALID_SPLXBAR_ENTRY = (ADRV904X_CPU_JESD_ERROR_CODE_START + 11u), /*!<@errcode: 0xB80B + @desc: JESD: Invalid Deframer Sample Crossbar entry + @maincause: Invalid Deframer Sample Crossbar entry in the Profile + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and restart the Device + */ + ADRV904X_JESD_DRV_DFRM_INVALID_LINK_LAYER_MODE = (ADRV904X_CPU_JESD_ERROR_CODE_START + 12u), /*!<@errcode: 0xB80C + @desc: JESD: Invalid Deframer Link layer mode of Operation + @maincause: Invalid Deframer mode Parameter in the Profile + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and restart the Device + */ + ADRV904X_JESD_DRV_FRM_S_NOT_POW2 = (ADRV904X_CPU_JESD_ERROR_CODE_START + 13u), /*!<@errcode: 0xB80D + @desc: JESD: Framer S Parameter is not a power of 2 + @maincause: Invalid Framer S Parameter in the Profile + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and restart the Device + */ + ADRV904X_JESD_DRV_DFRM_S_NOT_POW2 = (ADRV904X_CPU_JESD_ERROR_CODE_START + 14u), /*!<@errcode: 0xB80E + @desc: JESD: Deframer S Parameter is not a power of 2 + @maincause: Invalid Deframer S Parameter in the Profile + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and restart the Device + */ + ADRV904X_JESD_DRV_FRM_INVALID_CONFIG_DET = (ADRV904X_CPU_JESD_ERROR_CODE_START + 15u), /*!<@errcode: 0xB80F + @desc: JESD: Invalid Framer Configuration + @maincause: Invalid Framer Configuration detected by the JESD Hardware block + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and restart the Device + */ + ADRV904X_JESD_DRV_DRFM_INVALID_CONFIG_DET = (ADRV904X_CPU_JESD_ERROR_CODE_START + 16u), /*!<@errcode: 0xB810 + @desc: JESD: Invalid Deframer Configuration + @maincause: Invalid Deframer Configuration detected by the JESD Hardware block + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and restart the Device + */ + ADRV904X_JESD_DRV_LKSH_INVALID_SPLXBAR_ENTRY = (ADRV904X_CPU_JESD_ERROR_CODE_START + 17u), /*!<@errcode: 0xB811 + @desc: JESD: Invalid Sample Crossbar + @maincause: Invalid Link sharing Sample Crossbar entry in the Profile + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and restart the Device + */ + ADRV904X_JESD_DRV_UNSUPPORTED_FREQ_DIV_RATIO = (ADRV904X_CPU_JESD_ERROR_CODE_START + 18u), /*!<@errcode: 0xB812 + @desc: JESD: Unsupported Frequency Divide Ratio + @maincause: Invalid Frequency Parameter in the Profile + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and restart the Device + */ + ADRV904X_JESD_DRV_INVALID_FREQ_INPUT = (ADRV904X_CPU_JESD_ERROR_CODE_START + 19u), /*!<@errcode: 0xB813 + @desc: JESD: Invalid Frequency + @maincause: Invalid Frequency Parameter provided in the Profile + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and restart the Device + */ + ADRV904X_JESD_DRV_FRM_NUM_OF_CONV_INVALID = (ADRV904X_CPU_JESD_ERROR_CODE_START + 20u), /*!<@errcode: 0xB814 + @desc: JESD: Invalid number of converters + @maincause: Invalid number of converters specified in the Profile + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and restart the Device + */ + ADRV904X_JESD_DRV_SER_INVALID_LANE_SELECTED = (ADRV904X_CPU_JESD_ERROR_CODE_START + 21u), /*!<@errcode: 0xB815 + @desc: JESD: Invalid Serializer Lane selected + @maincause: Invalid Serializer Lane selected + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and restart the Device + */ + ADRV904X_JESD_DRV_SER_INVALID_LANE_PARAMETER = (ADRV904X_CPU_JESD_ERROR_CODE_START + 22u), /*!<@errcode: 0xB816 + @desc: JESD: Invalid Serializer Lane Parameter + @maincause: Invalid Serializer Lane Parameter + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and restart the Device + */ + ADRV904X_JESD_DRV_SER_CLK_OFFSET_CAL_FAILURE = (ADRV904X_CPU_JESD_ERROR_CODE_START + 23u), /*!<@errcode: 0xB817 + @desc: JESD: Serializer Clock offset calibration failed + @maincause: JESD: Serializer Clock offset calibration failed + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + + /*!< ---- Object ID = ADRV904X_CPU_OBJID_DRV_UART Section Base Error Code = 0xB900 --- @errcode: 0xB900 + @desc: UART + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_UART_DRV_INVALID_SCLK_FREQ = (ADRV904X_CPU_UART_ERROR_CODE_START + 1u), /*!<@errcode: 0xB901 + @desc: UART: Invalid SCLK Frequency + @maincause: SCLK is too low for configured UART bit Rate, check Device clock Settings + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Increase SCLK Frequency and try again. + */ + + + /*!< ---- Object ID = ADRV904X_CPU_OBJID_DRV_TXATTEN Section Base Error Code = 0xBA00 --- @errcode: 0xBA00 + @desc: Tx Attenuation Driver + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_TXATTEN_DRV_WRONG_SPI_MODE_ERROR = (ADRV904X_CPU_TXATTEN_ERROR_CODE_START + 1u), /*!<@errcode: 0xBA01 + @desc: TxAttenDrv: Must be in SPI mode to accesses this mode + @maincause: Invalid Tx attenuation mode selected + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Select SPI Mode before changing Tx Attenuation + */ + ADRV904X_TXATTEN_DRV_INVALID_HP_VALUE_ERROR = (ADRV904X_CPU_TXATTEN_ERROR_CODE_START + 2u), /*!<@errcode: 0xBA02 + @desc: TxAttenDrv: Invalid HP attenuation value, attenuation max exceeded + @maincause: Invalid HP attenuation value + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Select HP value within Range + */ + + /*!< ---- Object ID = ADRV904X_CPU_OBJID_DRV_TXLOL Section Base Error Code = 0xBB00 --- @errcode: 0xBB00 + @desc: TxLolDrv + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_TXLOL_DRV_NESTED_ACCUM_ERROR = (ADRV904X_CPU_TXLOL_DRV_ERROR_CODE_START + 1u), /*!<@errcode: 0xBB01 + @desc: TxLolDrv: Attempted second accumulation before the first completed + @maincause: Tx LOL Calibration state machine bug + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Stop and restart TxLOL tracking Calibration + */ + ADRV904X_TXLOL_DRV_HALT_ERROR = (ADRV904X_CPU_TXLOL_DRV_ERROR_CODE_START + 2u), /*!<@errcode: 0xBB02 + @desc: TxLolDrv: Attempted to read results before accumulator had halted + @maincause: Tx LOL Calibration firmware/Hardware handshake problem + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Stop and restart TxLOL tracking Calibration + */ + ADRV904X_TXLOL_DRV_CLK_CONFIG_NOT_SUPPORTED = (ADRV904X_CPU_TXLOL_DRV_ERROR_CODE_START + 4u), /*!<@errcode: 0xBB04 + @desc: TxLolDrv: Cannot configure TX LOL clock faster than ORX LOL clock + @maincause: External Tx LOL observations not supported with the current Profile + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Device Profile and restart the Device + */ + ADRV904X_TXLOL_DRV_ORX_CHAN_ERROR = (ADRV904X_CPU_TXLOL_DRV_ERROR_CODE_START + 5u), /*!<@errcode: 0xBB05 + @desc: TxLolDrv:Observation Channel is unsupported + @maincause: External Tx LOL observations do not support this ORx Channel + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check TX to ORx mapping + */ + /*!< ---- Object ID = ADRV904X_CPU_OBJID_DRV_GPIO Section Base Error Code = 0xBD00 --- @errcode: 0xBD00 + @desc: Gpio Driver + @maincause: + @mainrecovenum: + @separator: true + */ + + ADRV904X_GPIO_DRV_INVALID_SIGNAL_ID = (ADRV904X_CPU_GPIO_DRV_ERROR_CODE_START + 1u), /*!<@errcode: 0xBD01 + @desc: GpioDrv: Invalid signal ID provided + @maincause: Invalid signal ID provided + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_GPIO_DRV_INVALID_PIN_ID = (ADRV904X_CPU_GPIO_DRV_ERROR_CODE_START + 2u), /*!<@errcode: 0xBD02 + @desc: GpioDrv: Invalid GPIO pin number provided + @maincause: Invalid GPIO pin number provided + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + + /*!< ---- Object ID = ADRV904X_CPU_OBJID_DRV_RADIO_SEQUENCER Section Base Error Code = 0xBE00 --- @errcode: 0xBE00 + @desc: RadioSequencerDrv + @maincause: + @mainrecovenum: + @separator: true + */ + + ADRV904X_CPU_RADIO_SEQUENCER_DRV_CRC_ERROR = (ADRV904X_CPU_RADIO_SEQUENCER_DRV_ERROR_CODE_START + 1u), /*!< @errcode: 0xBE01 + @desc: RadioSequencerDrv: CRC verification failed + @maincause: Programmed image is corrupted. Original image may be invalid or may have been corrupted + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reset device and try again. If problem persists contact ADI. + */ + + /*!< ---- Object ID = ADRV904X_CPU_OBJID_CFG_CARRIER_RECONFIG Section Base Error Code = 0xBF00 --- @errcode: 0xBF00 + @desc: CarrierReconfigure + @maincause: + @mainrecovenum: + @separator: true + */ + + ADRV904X_CPU_CARRIER_RECONFIG_CHANNEL_FILTER_ERROR = (ADRV904X_CPU_CARRIER_RECONFIG_ERROR_CODE_START + 1u), /*!< @errcode: 0xBF01 + @desc: CarrierReconfigure: Channel filter calculation error + @maincause: Invalid carrier configuration supplied + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check supplied carrier configuration and channel filters + */ + + ADRV904X_CPU_DDCC_DRV_INIT_ERR = (ADRV904X_CPU_DDCC_DRV_ERROR_CODE_START + 1u), /*!<@errcode: 0xF101 + @desc: DDCC: HW in unexpected state + @maincause: DDCC HW error + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reprogram the Device using a Valid Package and try again. Contact ADI if the problem persists. + */ + + ADRV904X_CPU_DDCC_DRV_SM_ERR = (ADRV904X_CPU_DDCC_DRV_ERROR_CODE_START + 2u), /*!<@errcode: 0xF102 + @desc: DDCC: HW SM in unexpected state + @maincause: DDCC HW State Machine error + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reprogram the Device using a Valid Package and try again. Contact ADI if the problem persists. + */ + + ADRV904X_CPU_DDCC_DRV_CM_ERR = (ADRV904X_CPU_DDCC_DRV_ERROR_CODE_START + 3u), /*!<@errcode: 0xF103 + @desc: DDCC: CAL Filter CM in unexpected state + @maincause: DDCC HW CAL Filter CM error + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reprogram the Device using a Valid Package and try again. Contact ADI if the problem persists. + */ + + /*!< --- Object ID = ADRV904X_CPU_OBJID_SYSTEM_ERROR Section Base Error Code = 0xFF00 --- @errcode: 0xFF00 + @desc: System + @maincause: + @mainrecovenum: + @separator: true + */ + ADRV904X_CPU_SYSTEM_GP_TIMER_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 1u), /*!<@errcode: 0xFF01 + @desc: System: General-Purpose Timer Error + @maincause: Software Timer allocation failure. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_MAILBOX_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 2u), /*!<@errcode: 0xFF02 + @desc: System: Generic Mailbox Error + @maincause: Unspecified Mailbox Error + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_MAILBOX_BUSY = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 3u), /*!<@errcode: 0xFF03 + @desc: System: Mailbox Busy Error + @maincause: The requested Mailbox Hardware is in use and cannot receive commands + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Rerun feature. If the problem persists reset and try again. Contact ADI if the problem persists. + */ + ADRV904X_CPU_SYSTEM_MAILBOX_INVALID_HANDLE = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 4u), /*!<@errcode: 0xFF04 + @desc: System: Invalid Mailbox Handle + @maincause: Mailbox Operation requested on an Invalid Mailbox + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_MAILBOX_INVALID_LINK_NUMBER = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 5u), /*!<@errcode: 0xFF05 + @desc: System: Invalid Mailbox Link Number + @maincause: Mailbox Operation requested on an Invalid Mailbox Link + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_MAILBOX_LINK_BUSY = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 6u), /*!<@errcode: 0xFF06 + @desc: System: Mailbox Link busy + @maincause: The requested Mailbox Link is in use and cannot receive commands + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Rerun feature. If the problem persists reset and try again. Contact ADI if the problem persists. + */ + ADRV904X_CPU_SYSTEM_MAILBOX_CMD_TOO_LARGE = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 7u), /*!<@errcode: 0xFF07 + @desc: System: Mailbox Command too large for Link buffer + @maincause: Command payload is unexpectedly too large for Mailbox buffer + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_MAILBOX_CMD_BAD_TID = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 8u), /*!<@errcode: 0xFF08 + @desc: System: Mailbox Command Invalid transaction ID + @maincause: Mailbox received a Command with an Invalid transaction ID, most likely a duplicate Command. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Rerun feature. If the problem persists reset and try again. Contact ADI if the problem persists. + */ + ADRV904X_CPU_SYSTEM_INVALID_CPU_ID = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 9u), /*!<@errcode: 0xFF09 + @desc: System: Invalid CPU ID specified + @maincause: Given CPU ID Parameter is Invalid. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reprogram the CPU firmware image. If the problem persists contact ADI + */ + ADRV904X_CPU_SYSTEM_NULL_PTR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 10u), /*!<@errcode: 0xFF0A + @desc: System: Null Pointer Detected + @maincause: Programmed image is corrupted. Original image may be Invalid or may have been corrupted during SPI transfer. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reprogram the CPU firmware image. If the problem persists contact ADI + */ + ADRV904X_CPU_SYSTEM_TASK_CREATE_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 11u), /*!<@errcode: 0xFF0B + @desc: System: O/S Task Create Error + @maincause: Invalid Parameters passed to the Task Create API + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_CAPTURE_RAM_LOCK_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 12u), /*!<@errcode: 0xFF0C + @desc: System: RAM Lock Error + @maincause: RAM Lock Procedure not followed for Data Capture + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_CAPTURE_RAM_UNLOCK_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 13u), /*!<@errcode: 0xFF0D + @desc: System: RAM Unlock Error + @maincause: RAM Unlock Procedure not followed for Data Capture + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_CTRL_CMD_ARG_INVALID = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 14u), /*!<@errcode: 0xFF0E + @desc: System: Invalid Control Command Argument + @maincause: Invalid Control Command Argument + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Verify Command Argument is correct and try again. + */ + ADRV904X_CPU_SYSTEM_INIT_CAL_INIT_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 15u), /*!<@errcode: 0xFF0F + @desc: System: Initialization Calibration Startup Error + @maincause: Initialization Calibration Startup Error + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_INIT_CAL_ABORTED_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 20u), /*!<@errcode: 0xFF14 + @desc: System: Aborted Initialization Calibration + @maincause: Initialization Calibration was Aborted by Command + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Rerun the Initialization Calibrations + */ + ADRV904X_CPU_SYSTEM_INIT_CAL_WARM_BOOT_CHKSUM_ERROR= (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 21u), /*!<@errcode: 0xFF15 + @desc: System: Initialization Calibration Warm Boot Checksum Error + @maincause: Initialization Calibration Warm Boot Data Image is corrupted + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Rerun Initialization Calibration + */ + ADRV904X_CPU_SYSTEM_INIT_CAL_INV_CHAN_MASK_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 22u), /*!<@errcode: 0xFF16 + @desc: System: Initialization Calibration Invalid Channel mask Error + @maincause: Channel numbers that are not Enabled in the Profile are selected in the Channel mask + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Rerun the Initialization Calibration with correct Channel mask + */ + ADRV904X_CPU_SYSTEM_INIT_CAL_INV_CAL_MASK_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 23u), /*!<@errcode: 0xFF17 + @desc: System: Initialization Calibration Invalid Calibration mask Error + @maincause: The Initialization Calibration mask might have unsupported Calibrations + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Rerun the Initialization Calibration with correct Calibration mask + */ + ADRV904X_CPU_SYSTEM_INIT_CAL_ALREADY_IN_PROGRESS = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 24u), /*!<@errcode: 0xFF18 + @desc: System: Initialization Calibration Busy + @maincause: Initialization Calibration Command is sent again while one is in progress + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Make sure not to send the Initialization Calibration Command while one is in progress. + */ + ADRV904X_CPU_SYSTEM_EFUSE_PROFILE_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 25u), /*!<@errcode: 0xFF19 + @desc: System: Profile Checksum Failed or bad Profile wrt to EFUSE + @maincause: The Device Profile image is corrupted. Original image may be Invalid or may have been corrupted during SPI transfer. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reprogram the Device Profile image. If the problem persists contact ADI + */ + ADRV904X_CPU_SYSTEM_EFUSE_PRODUCT_ID_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 26u), /*!<@errcode: 0xFF1A + @desc: System: Profile product ID doesn't match Profile product ID + @maincause: The Device Profile is not valid for this Product + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Reprogram the Device with a Valid Profile Image. If the problem persists contact ADI + */ + ADRV904X_CPU_SYSTEM_EVENT_CREATE_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 28u), /*!<@errcode: 0xFF1C + @desc: System: Could not create the event + @maincause: Invalid Event Parameters are passed to the OS call + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_QUEUE_CREATE_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 29u), /*!<@errcode: 0xFF1D + @desc: System: Could not create the Queue + @maincause: Invalid Queue Parameters are passed to the OS call + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_TIMER_CREATE_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 30u), /*!<@errcode: 0xFF1E + @desc: System: Could not create the Timer + @maincause: Invalid Timer Parameters are passed to the OS call. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_QUEUE_POST_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 31u), /*!<@errcode: 0xFF1F + @desc: System: Failed to post the message + @maincause: Message Queue Full + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_QUEUE_RECV_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 32u), /*!<@errcode: 0xFF20 + @desc: System: Failed to receive the message + @maincause: Invalid Queue Parameters are passed to the OS call + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_TASK_DOES_NOT_EXIST = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 36u), /*!<@errcode: 0xFF24 + @desc: System: Commands sent to task that does not exist + @maincause: This can happen if a Command is sent to a Channel that is not Enabled in the Profile or disabled. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Rerun the feature with the correct Channel mask. + */ + ADRV904X_CPU_SYSTEM_CTRL_TASK_INVALID_MSG = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 37u), /*!<@errcode: 0xFF25 + @desc: System: Invalid Control Command + @maincause: Invalid Control Command Received + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Rerun the feature with the correct Command. + */ + ADRV904X_CPU_SYSTEM_INSUFFICIENT_MEMORY = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 38u), /*!<@errcode: 0xFF26 + @desc: System: Insufficient Memory available for the Requested Operation + @maincause: This can happen if an insufficient buffer size is sent for a Command. For example get Configuration or get Calibration status. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Rerun the Command with the correct buffer size allocated. + */ + ADRV904X_CPU_SYSTEM_CTRL_FUNC_NOT_SUPPORTED = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 39u), /*!<@errcode: 0xFF27 + @desc: System: Invalid Calibration Control Command + @maincause: Invalid Control Command Sent to Calibration + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Rerun the Calibration with the Correct Control Command + */ + ADRV904X_CPU_SYSTEM_SET_CONFIG_FUNC_NOT_SUPPORTED = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 40u), /*!<@errcode: 0xFF28 + @desc: System: Invalid Calibration Set Configuration + @maincause: Invalid Set Configuration sent to Calibration + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Ensure Input Parameters are correct + */ + ADRV904X_CPU_SYSTEM_GET_CONFIG_FUNC_NOT_SUPPORTED = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 41u), /*!<@errcode: 0xFF29 + @desc: System: Invalid Calibration Get Configuration + @maincause: Invalid Get Configuration sent to Calibration + @mainrecovenum:ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Ensure Input Parameters are correct + */ + ADRV904X_CPU_SYSTEM_STATUS_FUNC_NOT_SUPPORTED = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 42u), /*!<@errcode: 0xFF2A + @desc: System: Invalid Calibration Get Status Command + @maincause: Invalid Get Status Command sent to Calibration + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Control Command is Supported + */ + ADRV904X_CPU_SYSTEM_INVALID_CHANNEL_MASK = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 43u), /*!<@errcode: 0xFF2B + @desc: System: The given Channel is not Enabled in the Profile + @maincause: This can happen if a Channel is not Enabled in the Profile is getting Enabled or disabled. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Ensure Input Parameters are correct + */ + ADRV904X_CPU_SYSTEM_INVALID_CONFIG_OBJECT = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 44u), /*!<@errcode: 0xFF2C + @desc: System: Invalid Configuration Object + @maincause: Invalid Set Configuration Command for Configuration Object ID + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Ensure Input Parameters are correct + */ + ADRV904X_CPU_SYSTEM_INVALID_CONFIG_SIZE = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 45u), /*!<@errcode: 0xFF2D + @desc: System: Invalid Configuration Data Size + @maincause: Invalid Configuration Data Size for Module Configuration Buffer Size + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Ensure Input Parameters are correct + */ + ADRV904X_CPU_SYSTEM_INVALID_CONFIG_OFFSET = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 46u), /*!<@errcode: 0xFF2E + @desc: System: Invalid Configuration Offset + @maincause: Invalid Offset Sent with Configuration Command + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Ensure Input Parameters are correct + */ + ADRV904X_CPU_SYSTEM_INVALID_CONFIG_STATE = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 47u), /*!<@errcode: 0xFF2F + @desc: System: Invalid Configuration State + @maincause: Cannot Update Configuration while Initialization Calibrations are Running + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Rerun the Configuration Command after the Initialization Calibrations are complete. + */ + ADRV904X_CPU_SYSTEM_HAL_FUNC_NOT_IMPLEMENTED = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 81u), /*!<@errcode: 0xFF51 + @desc: System: CPU HAL Feature not Implemented + @maincause: CPU HAL Feature not Implemented + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_HAL_INVALID_CHANNEL = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 82u), /*!<@errcode: 0xFF52 + @desc: System: HAL Invalid Channel + @maincause: Invalid Channel Configuration in Profile or an Invalid Channel requested + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Verify Channel Configuration and reprogram the Device Profile Image + */ + ADRV904X_CPU_SYSTEM_HAL_INVALID_LO_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 83u), /*!<@errcode: 0xFF53 + @desc: System: HAL Invalid LO + @maincause: Invalid PLL chosen for LO. This could be due to corrupted program memory + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_AHB_COMMON_INVALID_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 84u), /*!<@errcode: 0xFF54 + @desc: System: AHB (Common) Error detected + @maincause: Invalid SPI address access either an Invalid address or span of registers + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Verify address and Range are correct for the SPI region being accessed + */ + ADRV904X_CPU_SYSTEM_AHB_CPU0_INVALID_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 85u), /*!<@errcode: 0xFF55 + @desc: System: AHB (CPU0) Error detected + @maincause: CPU0 accessing Invalid memory address or Range + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the problem persists acquire a Memory Dump and contact ADI + */ + ADRV904X_CPU_SYSTEM_AHB_CPU1_INVALID_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 86u), /*!<@errcode: 0xFF56 + @desc: System: AHB (CPU1) Error detected + @maincause: CPU1 accessing Invalid memory address or Range + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the problem persists acquire a Memory Dump and contact ADI + */ + ADRV904X_CPU_SYSTEM_INTERNAL_MCS_FAILED = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 87u), /*!<@errcode: 0xFF57 + @desc: System: Internal Multi-chip Sync (MCS) Failed to complete + @maincause: MCS Hardware did not complete synchronization in the allotted time + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_SECONDARY_CPU_BOOT_FAILED = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 88u), /*!<@errcode: 0xFF58 + @desc: System:Primary CPU detected secondary CPU(s) boot failure + @maincause: Secondary core not completing boot + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_UTIL_TIMER_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 89u), /*!<@errcode: 0xFF59 + @desc: System: Utilities Timer Internal Error + @maincause: RTOS Task Scheduler not running for Timer request + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_LOGEN_INVALID_LO_CONFIG = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 90u), /*!<@errcode: 0xFF5A + @desc: System: LOGEN Invalid LO Input/Output Configuration + @maincause: User selected an Invalid LOGEN Configuration, verify Device Profile/Configurator settings + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Ensure Input Parameters are correct + */ + ADRV904X_CPU_SYSTEM_FORCE_EXCEPTION_COMMAND = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 92u), /*!<@errcode: 0xFF5C + @desc: System: Intentional crash, from force exception Command + @maincause: API Command sent to force an exception in the CPU + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: This is a deliberate forced Error + */ + ADRV904X_CPU_SYSTEM_CONFIG_LOCKED = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 93u), /*!<@errcode: 0xFF5D + @desc: System: Configuration locked, for updating + @maincause: The Configuration is not unlocked before sending the Configuration Command + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Unlock the Configuration and resend the Configuration Command + */ + ADRV904X_CPU_SYSTEM_CONFIG_KEY_MISMATCH = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 94u), /*!<@errcode: 0xFF5E + @desc: System: The given key to unlock Configuration did not match with the key in current package + @maincause: The Configuration key did not match required key to unlock + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Use the correct key given by ADI and try to unlock the Configuration again + */ + ADRV904X_CPU_SYSTEM_CONFIG_LIMIT_REACHED = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 95u), /*!<@errcode: 0xFF5F + @desc: System: Number of Configuration update limit reached + @maincause: Reached the limit of the number Configuration commands allowed + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reset the Device to send new set of Configuration Parameters + */ + ADRV904X_CPU_SYSTEM_DBG_KEY_MISMATCH = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 96u), /*!<@errcode: 0xFF60 + @desc: System: The given key to enter debug mode did not match with the key to enter debug mode + @maincause: The debug key did not match required key to unlock. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Try to send the Command again with the right Debug key. Contact ADI to get the correct key if the problem persists. + */ + ADRV904X_CPU_SYSTEM_CTRL_CMD_LENGTH_INVALID = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 97u), /*!<@errcode: 0xFF61 + @desc: System: The Set Control Command length is less than expected or greater than max data size allowed + @maincause: The control Command buffer is greater than the supported size + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Change the size of the control Command payload or increase the control Command buffer size. + */ + ADRV904X_CPU_SYSTEM_WATCHDOG_EXPIRED = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 98u), /*!<@errcode: 0xFF62 + @desc: System: Watchdog Timer expired, system is unresponsive + @maincause: Not all firmware tasks completed in the expected time frame. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Collect memory dump to provide debug information and reset Device. + @cause: Not all firmware tasks completed in the expected time frame, possibly due to bad Parameters + @recovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @recovtext: Collect memory dump to provide debug information, verify that all Calibrations and commands have valid Parameters, and reset Device. + */ + ADRV904X_CPU_SYSTEM_SHARED_MEM_MUTEX_TIMEOUT = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 99u), /*!<@errcode: 0xFF63 + @desc: System: Shared memory Mutex Timeout + @maincause: This could happen if the shared Mutex cannot be obtained within the Timeout period + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_SWBKPT_INVALID_TABLE_INDEX = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 100u), /*!<@errcode: 0xFF64 + @desc: System: The given index to the SW Breakpoint Table is out of Range + @maincause: Unexpected SW Breakpoint Table Index + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_SHARED_MEM_MUTEX_TAKEN_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 101u), /*!<@errcode: 0xFF65 + @desc: System: Shared memory Mutex already taken + @maincause: This could happen if trying to take the Mutex which is already taken + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_SHARED_MEM_MUTEX_RELEASE_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 102u), /*!<@errcode: 0xFF66 + @desc: System: Shared memory Mutex released without owning it + @maincause: This could happen if trying to release the Mutex which is not owned + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_UNSUPPORTED_CHANS_PER_CPU_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 103u), /*!< @errcode: 0xFF67 + @desc: System: This system is being configured to support too many channels per CPU + @maincause: This is a Configurator Channel enable issue + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Check the Profile and the Configurator logic + */ + ADRV904X_CPU_SYSTEM_INVALID_STATUS_SIZE = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 104u), /*!<@errcode: 0xFF68 + @desc: System: The given status size is Invalid + @maincause: The user requested the status size larger than supported size. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Change the size of the status Command buffer size. + */ + ADRV904X_CPU_SYSTEM_STARTUP_TIMEOUT_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 105u), /*!<@errcode: 0xFF69 + @desc: System: Initialization and tracking start-up functions still running + @maincause: The Control task waits a predefined amount of time which is not long enough + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Increase the Timeout in the FW Control task. + */ + ADRV904X_CPU_SYSTEM_DBG_CMD_NOT_SUPPORTED = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 106u), /*!<@errcode: 0xFF6A + @desc: System: Invalid Debug Command + @maincause: Invalid Debug Command Provided + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Debug Command is Supported. Contact ADI to get the correct Command if the problem persists. + */ + ADRV904X_CPU_SYSTEM_DBG_CMD_PARAMS_INVALID = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 107u), /*!<@errcode: 0xFF6B + @desc: System: Invalid Debug Command Parameter + @maincause: Invalid Debug Command Parameter Provided + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Debug Command Parameter is Supported. Contact ADI to get the correct info if the problem persists. + */ + ADRV904X_CPU_SYSTEM_HAL_TX_ATTEN_RESTORE_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 108u), /*!<@errcode: 0xFF6C + @desc: System: HAL Tx attenuation Restore Failed + @maincause: Cannot restore Tx attenuation because the settings were not saved + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: Reset Feature and try again. If the problem persists acquire a Memory Dump and contact ADI + */ + ADRV904X_CPU_SYSTEM_DEBUG_FUNC_NOT_SUPPORTED = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 109u), /*!<@errcode: 0xFF6D + @desc: System: Invalid Calibration Debug Control Command + @maincause: Invalid Debug Control Command sent to Calibration Feature + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Check Control Command is Supported + */ + ADRV904X_CPU_SYSTEM_HEALTHMON_TOO_MANY_TASKS = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 110u), /*!<@errcode: 0xFF6E + @desc: System: The health monitor memory allocation is not large enough for the current number of tasks + @maincause: The number of RTOS tasks is greater than expected. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Allocate the required health monitor memory for the number of RTOS tasks + */ + ADRV904X_CPU_SYSTEM_SEM_CREATE_FAILED = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 111u), /*!<@errcode: 0xFF6F + @desc: System: Semaphore Create Failure + @maincause: System Failed to Create Semaphore + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_SEM_TAKE_FAILED = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 112u), /*!<@errcode: 0xFF70 + @desc: System: Semaphore Take Failure + @maincause: System Failed to Take Semaphore + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_SIMULATED_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 113u), /*!<@errcode: 0xFF71 + @desc: System: Simulated Error + @maincause: Simulated System Error Condition for Internal Testing + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_SI_REV_ID_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 114u), /*!<@errcode: 0xFF72 + @desc: System: Unexpected Silicon Revision Detected + @maincause: Using Incompatible Hardware with Current Version of Software + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_RADIO_LOOPBACK_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 115u), /*!<@errcode: 0xFF73 + @desc: System: Radio Loopback requested but being used + @maincause: A Calibration is already using a radio Loopback + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Verify Calibration logic to find multiple request + */ + ADRV904X_CPU_SYSTEM_TIMER_STOP_ERROR = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 116u), /*!<@errcode: 0xFF74 + @desc: System: System Timer stop Error + @maincause: System Timer didn't stop within Timeout + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_TRACKING_CAL_SUSPEND_TIMEOUT = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 117u), /*!<@errcode: 0xFF75 + @desc: System: Tracking Calibration did not suspend without Timeout + @maincause: The tracking Calibration Failed to suspend within the expected time. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_EFUSE_UNSUPPORTED_CPU = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 118u), /*!<@errcode: 0xFF76 + @desc: System: Only primary CPU supports EFUSE commands + @maincause: Sent EFUSE Command to secondary CPU. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: API Error. Contact ADI. + */ + ADRV904X_CPU_SYSTEM_PROFILE_UNAVAILABLE = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 119u), /*!<@errcode: 0xFF77 + @desc: System: The full Profile is only available during CPU0 boot-up + @maincause: Full Profile gets erased after CPU0 boot-up. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + @mainrecovtext: Don't use full Profile after boot-up. + */ + ADRV904X_CPU_SYSTEM_SEM_GIVE_FAILED = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 120u), /*!<@errcode: 0xFF78 + @desc: System: Semaphore give Operation failure + @maincause: This could happen because the system Failed in giving the semaphore. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_SYSTEM_EFUSE_READ_TIMEOUT = (ADRV904X_CPU_SYSTEM_ERROR_CODE_START + 121u), /*!<@errcode: 0xFF79 + @desc: System: Unable to read EFUSE + @maincause: The EFUSE read did not occur. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Reset Device and try again. If the problem persists contact ADI + */ + +#ifndef ADI_ADRV904X_FW + /* Pseudo Error code */ + ADRV904X_CPU_CAL_EXIT_OCCURRED_ERROR = (int32_t)0x80000000 /* Remove UL for API to avoid ISO C Error. set to large number to force enum to be uint32_t */ +#else + /* Pseudo Error code */ + ADRV904X_CPU_CAL_EXIT_OCCURRED_ERROR = 0x80000000UL /* Add UL for FW to force it to be unsigned int. set to large number to force enum to be uint32_t */ +#endif +} adrv904x_CpuErrorCode_e; + +#endif + +/* Type and enumeration for CPU boot status and Error codes */ +typedef uint8_t adrv904x_CpuBootStatus_t; +typedef enum adrv904x_CpuBootStatus +{ + ADRV904X_CPU_BOOT_STATUS_POWER_UP = 0u, /*!<@errcode: 0x0000 + @desc: Boot Status: CPU Powering Up + @maincause: CPU Still Booting Up + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + @mainrecovtext: Wait for CPU to Boot + */ + ADRV904X_CPU_STATUS_READY = 1u, /*!<@errcode: 0x0001 + @desc: Boot Status: CPU Ready + @maincause: CPU Booted Successfully + @mainrecovenum: ADI_ADRV904X_ERR_ACT_NONE + @mainrecovtext: No Action Required + */ + ADRV904X_CPU_BOOT_WAIT_FOR_CPUS = 2u, /*!<@errcode: 0x0002 + @desc: Boot Status: Primary CPU waiting for Secondary CPU(s) + @maincause: Secondary CPU(s) Failed to Boot + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + @cause: Secondary CPU(s) Still Booting + @recovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + @recovtext: Wait for CPU to Boot + */ + ADRV904X_CPU_BOOT_HANDSHAKE_ERR = 3u, /*!<@errcode: 0x0003 + @desc: Boot Error: CPU-to-CPU Handshake + @maincause: Primary CPU did not get ACK from secondary CPU. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_FW_CRC_ERR = 4u, /*!<@errcode: 0x0004 + @desc: Boot Error: CPU Firmware Image CRC Failed + @maincause: Programmed image is corrupted. Original image may be Invalid or may have been corrupted during SPI transfer + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_STREAM_IMG_CRC_ERR = 5u, /*!<@errcode: 0x0005 + @desc: Boot Error: Stream Image CRC Failed + @maincause: Programmed image is corrupted. Original image may be Invalid or may have been corrupted during SPI transfer. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_DEVPROF_CRC_ERR = 6u, /*!<@errcode: 0x0006 + @desc: Boot Error: Device Profile Image CRC Failed + @maincause: Programmed image is corrupted. Original image may be Invalid or may have been corrupted during SPI transfer. + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_BOOT_CLKGEN_ERR = 7u, /*!<@errcode: 0x0007 + @desc: Boot Error: CLKGEN Setup Error + @maincause: System Clock Initialization Failed + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_BOOT_CLKJESD_ERR = 8u, /*!<@errcode: 0x0008 + @desc: Boot Error: JESD Setup Error + @maincause: JESD Clock Initialization Failed + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_BOOT_PWRINIT_ERR = 9u, /*!<@errcode: 0x0009 + @desc: Boot Error: Power Initialization Setup Error + @maincause: Master Bias Module Initialization Failed + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_JTAG_BUILD_STATUS_READY = 10u, /*!<@errcode: 0x000A + @desc: Boot Status: JTAG Build Status Ready + @maincause: CPU Configured for JTAG Mode + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_BOOT_CLKLOGEN_ERR = 11u, /*!<@errcode: 0x000B + @desc: Boot Error: Clock LOGEN + @maincause: Clock LOGEN Module Initialization Failed + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_BOOT_RXQECHW_ERR = 12u, /*!<@errcode: 0x000C + @desc: Boot Error: Rx QEC + @maincause: Rx QEC Module Initialization Failed + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_ADC_RCAL_ERR = 13u, /*!<@errcode: 0x000D + @desc: Boot Error: ADC RCAL + @maincause: ADC RCalibration Module Initialization Failed + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_STREAM_RUNTIME_ERR = 14u, /*!<@errcode: 0x000E + @desc: Boot Error: Main Stream Processor + @maincause: Main Stream Processor Initialization Failed + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_INTERNAL_MCS_ERR = 15u, /*!<@errcode: 0x000F + @desc: Boot Error: Internal MCS + @maincause: MCS Hardware Module Initialization Failed + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_HAL_DATACAP_INIT_ERR = 16u, /*!<@errcode: 0x0010 + @desc: Boot Error: Data Capture + @maincause: Data Capture Initialization Failed + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_FW_CLI_INIT_ERR = 17u, /*!<@errcode: 0x0011 + @desc: Boot Error: Command Line Interface + @maincause: Command Line Interface (CLI) Initialization Failed + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_BOOT_TEMP_ERR = 18u, /*!<@errcode: 0x0012 + @desc: Boot Error: Temperature Sensor + @maincause: Temperature Sensor Initialization Failed + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_BOOT_TXNCO_INIT_ERR = 19u, /*!<@errcode: 0x0013 + @desc: Boot Error: TxTest/Mix NCO + @maincause: TX NCO Module Initialization Failed + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_BOOT_ORXNCO_INIT_ERR = 20u, /*!<@errcode: 0x0014 + @desc: Boot Error: ORx Mix NCO + @maincause: ORX NCO Module Initialization Failed + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_BOOT_RXNCO_INIT_ERR = 21u, /*!<@errcode: 0x0015 + @desc: Boot Error: Rx Mix NCO + @maincause: Rx NCO Module Initialization Failed + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_BOOT_TXATTEN_INIT_ERR = 22u, /*!<@errcode: 0x0016 + @desc: Boot Error: Tx Attenuator + @maincause: Tx Attenuator Module Initialization Failed + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + ADRV904X_CPU_PRS_MCS_ERR = 23u, /*!<@errcode: 0x0017 + @desc: Boot Error: LO PLLs + @maincause: LOGEN Initialization (Pre MCS) Failed + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + + ADRV904X_CPU_BOOT_UNEXPECTED_ERR = 24u, /*!<@errcode: 0x0018 + @desc: Boot Error: Unspecified Error + @maincause: Unspecific Initialization Error Detected + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + + ADRV904X_CPU_RADIO_RXTX_ERR = 25u, /*!<@errcode: 0x0019 + @desc: Boot Error: Radio Rx/Tx + @maincause: Radio Rx/Tx Module Initialization Failed + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + + ADRV904X_CPU_BOOT_PID_PROFILE_MISMATCH_ERR = 26u, /*!<@errcode: 0x001A + @desc: Boot Error: Product ID Mismatch + @maincause: Device Profile Incompatible with Product ID on Device + @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + @mainrecovtext: Use Compatible Device Profile. Contact ADI if the problem persists. + */ + ADRV904X_CPU_BOOT_TX_ORX_MAPPING_FREQ_ERR = 30u, /*!<@errcode: 0x001E + @desc: Boot Error: Tx-to-ORx Mapping + @maincause: Unable to Calculate and Save Frequencies + @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + @mainrecovtext: Check Device Profile, If the Problem Persists, Acquire a Memory Dump and Contact ADI + */ + +} adrv904x_CpuBootStatus_e; + +/* Type used to store CPU Error status information */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_CpuErrors +{ + adrv904x_CpuErrorCode_e lastCmd; + adrv904x_CpuErrorCode_e system; + adrv904x_CpuErrorCode_e trackCal; +} adrv904x_CpuErrors_t;) + +#endif /* __ADRV904X_CPU_ERROR_CODES_TYPES_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_error_tables.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_error_tables.h new file mode 100644 index 00000000000..754cdae3cc1 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_error_tables.h @@ -0,0 +1,2903 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file + * + * \brief + * + * \details + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADRV904X_CPU_ERROR_TABLES_H_ +#define _ADRV904X_CPU_ERROR_TABLES_H_ + +#include "adi_common_error.h" +#include "adi_adrv904x_error_types.h" + +const adrv904x_CpuBootErrCodes_t adrv904x_CpuBootErrTable[] = +{ +/* DO NOT EDIT THIS TABLE, CHANGES WILL BE OVERWRITTEN DURING FULL BUILD */ +/* START AUTOGENERATED CPU BOOT ERROR TABLE */ +/* Autogenerated CPU boot error table on Mon Dec 18 12:49:27 2023 from T:\components\api\\..\..\output\koror\Release\api\src\c_src\devices\adrv904x\private\include\adrv904x_cpu_error_codes_types.h */ /* RELEASE_INLINE_REMOVAL */ + { + 0x0000u, + ADI_STRING("Boot Status: CPU Powering Up"), + ADI_STRING("CPU Still Booting Up"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Wait for CPU to Boot") + }, + { + 0x0001u, + ADI_STRING("Boot Status: CPU Ready"), + ADI_STRING("CPU Booted Successfully"), + ADI_ADRV904X_ERR_ACT_NONE, + ADI_STRING("No Action Required") + }, + { + 0x0002u, + ADI_STRING("Boot Status: Primary CPU waiting for Secondary CPU(s)"), + ADI_STRING("Secondary CPU(s) Failed to Boot"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0003u, + ADI_STRING("Boot Error: CPU-to-CPU Handshake"), + ADI_STRING("Primary CPU did not get ACK from secondary CPU."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0004u, + ADI_STRING("Boot Error: CPU Firmware Image CRC Failed"), + ADI_STRING("Programmed image is corrupted. Original image may be Invalid or may have been corrupted during SPI transfer"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0005u, + ADI_STRING("Boot Error: Stream Image CRC Failed"), + ADI_STRING("Programmed image is corrupted. Original image may be Invalid or may have been corrupted during SPI transfer."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0006u, + ADI_STRING("Boot Error: Device Profile Image CRC Failed"), + ADI_STRING("Programmed image is corrupted. Original image may be Invalid or may have been corrupted during SPI transfer."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0007u, + ADI_STRING("Boot Error: CLKGEN Setup Error"), + ADI_STRING("System Clock Initialization Failed"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0008u, + ADI_STRING("Boot Error: JESD Setup Error"), + ADI_STRING("JESD Clock Initialization Failed"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0009u, + ADI_STRING("Boot Error: Power Initialization Setup Error"), + ADI_STRING("Master Bias Module Initialization Failed"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x000Au, + ADI_STRING("Boot Status: JTAG Build Status Ready"), + ADI_STRING("CPU Configured for JTAG Mode"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x000Bu, + ADI_STRING("Boot Error: Clock LOGEN"), + ADI_STRING("Clock LOGEN Module Initialization Failed"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x000Cu, + ADI_STRING("Boot Error: Rx QEC"), + ADI_STRING("Rx QEC Module Initialization Failed"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x000Du, + ADI_STRING("Boot Error: ADC RCAL"), + ADI_STRING("ADC RCalibration Module Initialization Failed"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x000Eu, + ADI_STRING("Boot Error: Main Stream Processor"), + ADI_STRING("Main Stream Processor Initialization Failed"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x000Fu, + ADI_STRING("Boot Error: Internal MCS"), + ADI_STRING("MCS Hardware Module Initialization Failed"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0010u, + ADI_STRING("Boot Error: Data Capture"), + ADI_STRING("Data Capture Initialization Failed"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0011u, + ADI_STRING("Boot Error: Command Line Interface"), + ADI_STRING("Command Line Interface (CLI) Initialization Failed"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0012u, + ADI_STRING("Boot Error: Temperature Sensor"), + ADI_STRING("Temperature Sensor Initialization Failed"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0013u, + ADI_STRING("Boot Error: TxTest/Mix NCO"), + ADI_STRING("TX NCO Module Initialization Failed"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0014u, + ADI_STRING("Boot Error: ORx Mix NCO"), + ADI_STRING("ORX NCO Module Initialization Failed"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0015u, + ADI_STRING("Boot Error: Rx Mix NCO"), + ADI_STRING("Rx NCO Module Initialization Failed"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0016u, + ADI_STRING("Boot Error: Tx Attenuator"), + ADI_STRING("Tx Attenuator Module Initialization Failed"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0017u, + ADI_STRING("Boot Error: LO PLLs"), + ADI_STRING("LOGEN Initialization (Pre MCS) Failed"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0018u, + ADI_STRING("Boot Error: Unspecified Error"), + ADI_STRING("Unspecific Initialization Error Detected"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0019u, + ADI_STRING("Boot Error: Radio Rx/Tx"), + ADI_STRING("Radio Rx/Tx Module Initialization Failed"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x001Au, + ADI_STRING("Boot Error: Product ID Mismatch"), + ADI_STRING("Device Profile Incompatible with Product ID on Device"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Use Compatible Device Profile. Contact ADI if the problem persists.") + }, + { + 0x001Eu, + ADI_STRING("Boot Error: Tx-to-ORx Mapping"), + ADI_STRING("Unable to Calculate and Save Frequencies"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Device Profile, If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, +/* END AUTOGENERATED CPU BOOT ERROR TABLE */ +}; + +const adrv904x_CpuRuntimeErrCodes_t adrv904x_CpuRunTimeErrTable[] = +{ +/* DO NOT EDIT THIS TABLE, CHANGES WILL BE OVERWRITTEN DURING FULL BUILD */ +/* START AUTOGENERATED CPU RUNTIME ERROR TABLE */ +/* Autogenerated CPU runtime error table on Mon Dec 18 12:49:14 2023 from T:\components\api\\..\..\output\koror\Release\api\src\c_src\devices\adrv904x\private\include\adrv904x_cpu_error_codes_types.h */ /* RELEASE_INLINE_REMOVAL */ + { + 0x0000u, + ADI_STRING("No Error"), + ADI_STRING("Operation Successful"), + ADI_ADRV904X_ERR_ACT_NONE, + ADI_STRING("No Action Required") + }, + /*!< -------- RC Tuner Calibration Section Base Error Code = 0x0000 ------ */ + { + 0x0001u, + ADI_STRING("RC Tuner: Calibration Timeout"), + ADI_STRING("Timeout Waiting for RCAL and/or CCAL to Finish"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Re-program Device and re-run RC Tuner Calibration") + }, + { + 0x0002u, + ADI_STRING("RC Tuner: Self-Test Error"), + ADI_STRING("RCAL/CCAL Results violate +/-25% limits (from Nominal)"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Re-program Device and re-run RC Tuner Calibration") + }, + /*!< -------- DC Offset Calibration Section Base Error Code = 0x0100 ------ */ + { + 0x0101u, + ADI_STRING("DC Offset: Calibration was aborted while collecting data"), + ADI_STRING("Rx going low or higher priority Calibration aborting the current capture"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run the Calibration") + }, + { + 0x0102u, + ADI_STRING("DC Offset: Calibration Timed out due to Error in Data Capture"), + ADI_STRING("Hardware was unable to capture enough data within time limit"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run the Calibration") + }, + { + 0x0103u, + ADI_STRING("DC Offset: Internal Test to verify if Calibration was successful"), + ADI_STRING("FSC was unable to capture data required to confirm Calibration completion"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Perform Soft Reset to complete Data Capture") + }, + { + 0x0104u, + ADI_STRING("DC Offset: Undefined control Command"), + ADI_STRING("Invalid control Command used for tracking Calibration"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Control Command is Valid") + }, + { + 0x0105u, + ADI_STRING("DC Offset: Calibration was unable to converge"), + ADI_STRING("The residual DC Offset was higher than threshold"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + /*!< -------- ADC Rx Calibration Section Base Error Code = 0x0200 ------ */ + { + 0x0201u, + ADI_STRING("ADC Rx: Stage 1 Error"), + ADI_STRING("Calibration may have saturated"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0202u, + ADI_STRING("ADC Rx: Stage V Error"), + ADI_STRING("Calibration may have saturated"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0203u, + ADI_STRING("ADC Rx: DRF Error"), + ADI_STRING("Calibration may have saturated"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0204u, + ADI_STRING("ADC Rx: Invalid FSM Command"), + ADI_STRING("Invalid FSM Command passed to ADC Module"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0205u, + ADI_STRING("ADC Rx: Run ADC Rx Initial Calibration before Tracking Calibration"), + ADI_STRING("Initial ADC Rx Calibration has not completed successfully yet"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0206u, + ADI_STRING("ADC Rx: Calibration Timeout"), + ADI_STRING("Calibration did not finish in expected time"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0207u, + ADI_STRING("ADC Rx:HW start-up Error"), + ADI_STRING("Unexpected HW behavior: start-up Error; report to ADI"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0208u, + ADI_STRING("ADC Rx: Invalid Configuration Parameter"), + ADI_STRING("Invalid Configuration Parameter Passed to ADC Rx Module"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0209u, + ADI_STRING("ADC Rx: Unknown Error"), + ADI_STRING("Unspecified Error Detected in ADC Rx Module"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x020Au, + ADI_STRING("ADC Rx: Invalid Control Command"), + ADI_STRING("Invalid Control Command provided to ADC Rx Module"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Control Command is Supported") + }, + { + 0x020Bu, + ADI_STRING("ADC Rx: Busy"), + ADI_STRING("A Calibration is currently Running"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Wait for Current Calibration Running to Complete") + }, + { + 0x020Cu, + ADI_STRING("ADC Rx: Control Command Requires Debug Mode"), + ADI_STRING("Debug Mode is not Supported"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x020Du, + ADI_STRING("ADC Rx: Register Map Verification Failed"), + ADI_STRING("ADC Rx Module not Configured as Expected"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x020Eu, + ADI_STRING("ADC Rx: Tracking Calibration Timeout"), + ADI_STRING("Timeout due to Disabled Rx"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Enable Rx before Timeout") + }, + /*!< -------- ADC ORx Calibration Section Base Error Code = 0x0300 ------ */ + { + 0x0301u, + ADI_STRING("ADC ORx: Slice Calibration Object Error"), + ADI_STRING("Calibration may have Saturated"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0302u, + ADI_STRING("ADC ORx: Slice Calibration Interrupt Status Error"), + ADI_STRING("Interrupt Pin Caused Error, but Status was OK"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0303u, + ADI_STRING("ADC ORx: Slice Calibration Interrupt Timeout"), + ADI_STRING("Interrupt Timer has Expired"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0304u, + ADI_STRING("ADC ORx: Slice Initialization Calibration Interrupt Error"), + ADI_STRING("Unexpected Interrupt Received"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0305u, + ADI_STRING("ADC ORx: Slice Tracking Calibration Interrupt Error"), + ADI_STRING("Unexpected Interrupt Received"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0306u, + ADI_STRING("ADC ORx: Front-End Calibration Object Error"), + ADI_STRING("Calibration may have Saturated"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0307u, + ADI_STRING("ADC ORx: Front-End Calibration Interrupt Status Error"), + ADI_STRING("Interrupt Pin caused Error, but status was OK"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0308u, + ADI_STRING("ADC ORx: Front-End Calibration Interrupt Timeout Error"), + ADI_STRING("Interrupt Timer has Expired"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0309u, + ADI_STRING("ADC ORx: Front-End Initialization Calibration Interrupt Error"), + ADI_STRING("Unexpected Interrupt Received"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x030Au, + ADI_STRING("ADC ORx: Front-End Tracking Calibration Interrupt Error"), + ADI_STRING("Unexpected Interrupt Received"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x030Bu, + ADI_STRING("ADC ORx: Interleaving Timing Calibration Object Error"), + ADI_STRING("Calibration may have Saturated"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x030Cu, + ADI_STRING("ADC ORx: Interleaving Timing Calibration Interrupt Status Error"), + ADI_STRING("Interrupt Pin caused Error, but Status was OK"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x030Du, + ADI_STRING("ADC ORx: Interleaving Timing Calibration Interrupt Timeout Error"), + ADI_STRING("Interrupt Timer has Expired"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x030Eu, + ADI_STRING("ADC ORx: Interleaving Timing Initialization Calibration Interrupt Error"), + ADI_STRING("Unexpected Interrupt Received"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x030Fu, + ADI_STRING("ADC ORx: Interleaving Timing Tracking Calibration Interrupt Error"), + ADI_STRING("Unexpected Interrupt Received"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0310u, + ADI_STRING("ADC ORx: Invalid Control Command"), + ADI_STRING("Invalid Control Command passed to ADC ORx Module"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0311u, + ADI_STRING("ADC ORx: Control Command Queue Error"), + ADI_STRING("Unexpected Behaviour in ADC ORx Module"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0312u, + ADI_STRING("ADC ORx: Hardware Slice Initialization Error"), + ADI_STRING("Unexpected Behaviour in ADC ORx Module"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0313u, + ADI_STRING("ADC ORx: Hardware Track & Hold Initialization Error"), + ADI_STRING("Unexpected Behaviour in ADC ORx Module"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0314u, + ADI_STRING("ADC ORx: Hardware Start-Up Error"), + ADI_STRING("Unexpected Behaviour in ADC ORx Module"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0315u, + ADI_STRING("ADC ORx: Calibration Timeout Error"), + ADI_STRING("Calibration did not Finish in Expected Time"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0316u, + ADI_STRING("ADC ORx: Invalid Configuration Parameter"), + ADI_STRING("Invalid Configuration Parameter Used in Command to ADC ORx Module"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Parameters and try again. Contact ADI if the problem persists") + }, + { + 0x0317u, + ADI_STRING("ADC ORx: Unknown Error"), + ADI_STRING("Unspecified Error in ADC ORx Module"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0318u, + ADI_STRING("ADC ORx: Control Command Not Supported"), + ADI_STRING("Invalid Control Command"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Control Command is Supported") + }, + { + 0x0319u, + ADI_STRING("ADC ORx: Busy"), + ADI_STRING("A Calibration is Currently Running"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Wait for Current Calibration Running to Complete") + }, + { + 0x031Au, + ADI_STRING("ADC ORx: Control Command Requires Debug Mode"), + ADI_STRING("Debug Mode Not Enabled"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Command & Mode of Operation") + }, + { + 0x031Bu, + ADI_STRING("ADC ORx: Run ADC ORx Initial Calibration before Tracking Calibration"), + ADI_STRING("Initial ADC ORx Calibration has not completed successfully yet"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x031Cu, + ADI_STRING("ADC ORx: DAC Stream Write Error"), + ADI_STRING("Stream DAC has stopped Writing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x031Du, + ADI_STRING("ADC ORx: Register Map Verification Failed"), + ADI_STRING("ADC ORx Module not Configured as Expected"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x031Eu, + ADI_STRING("ADC ORx: Tracking Calibration Timeout"), + ADI_STRING("Timeout Due to Disabled ORx"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Enable ORx before Timeout") + }, + /*!< -------- ADC TxLb Calibration Section Base Error Code = 0x0400 ------ */ + { + 0x0401u, + ADI_STRING("ADC TxLb: Slice Calibration Object Error"), + ADI_STRING("Calibration may have Saturated"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0402u, + ADI_STRING("ADC TxLb: Slice Calibration Interrupt Status Error"), + ADI_STRING("Interrupt Pin caused Error, but Status was OK"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0403u, + ADI_STRING("ADC TxLb: Slice Calibration Interrupt Timeout Error"), + ADI_STRING("Interrupt Timer has Expired"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0404u, + ADI_STRING("ADC TxLb: Slice Initialization Calibration Interrupt Error"), + ADI_STRING("Unexpected Interrupt Received"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0405u, + ADI_STRING("ADC TxLb: Slice Tracking Calibration Interrupt Error"), + ADI_STRING("Unexpected Interrupt Received"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0406u, + ADI_STRING("ADC TxLb: Front-End Calibration Object Error"), + ADI_STRING("Calibration may have Saturated"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0407u, + ADI_STRING("ADC TxLb: Front-End Calibration Interrupt Status Error"), + ADI_STRING("Interrupt Pin caused Error, but Status was OK"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0408u, + ADI_STRING("ADC TxLb: Front-End Calibration Interrupt Timeout Error"), + ADI_STRING("Interrupt Timer has Expired"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0409u, + ADI_STRING("ADC TxLb: Front-End Initialization Calibration Interrupt Error"), + ADI_STRING("Unexpected Interrupt Received"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x040Au, + ADI_STRING("ADC TxLb: Front-End Tracking Calibration Interrupt Error"), + ADI_STRING("Unexpected Interrupt Received"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x040Bu, + ADI_STRING("ADC TxLb: Invalid Control Command"), + ADI_STRING("Invalid Control Command passed to ADC TxLb Module"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x040Cu, + ADI_STRING("ADC TxLb: Control Command Queue Error"), + ADI_STRING("Unexpected Behaviour in ADC TxLb Module"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x040Du, + ADI_STRING("ADC TxLb: Hardware Slice Initialization Error"), + ADI_STRING("Unexpected Behaviour in ADC TxLb Module"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x040Eu, + ADI_STRING("ADC TxLb: Hardware Start-Up Error"), + ADI_STRING("Unexpected Behaviour in ADC TxLb Module"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x040Fu, + ADI_STRING("ADC TxLb: Hardware Track & Hold Initialization Error"), + ADI_STRING("Unexpected Behaviour in ADC TxLb Module"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0410u, + ADI_STRING("ADC TxLb: Calibration Timeout"), + ADI_STRING("Calibration did not Finish in Expected Time"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0411u, + ADI_STRING("ADC TxLb: Invalid Parameter"), + ADI_STRING("Invalid Configuration Parameter passed to ADC TxLb Module"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0412u, + ADI_STRING("ADC TxLb: Unknown Error"), + ADI_STRING("Unspecified Error in ADC TxLb Module"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0413u, + ADI_STRING("ADC TxLb: Control Command Not Supported"), + ADI_STRING("Invalid Control Command passed to ADC TxLb Module"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Control Command is Supported") + }, + { + 0x0414u, + ADI_STRING("ADC Txlb: Busy"), + ADI_STRING("A Calibration is Currently Running"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Wait Until Current Calibration Finishes") + }, + { + 0x0415u, + ADI_STRING("ADC Txlb: Control Command Requires Debug Mode"), + ADI_STRING("Debug Mode is not Supported"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0416u, + ADI_STRING("ADC Txlb: Run ADC ORx Initial Calibration before Tracking Calibration"), + ADI_STRING("Initial ADC TxLb Calibration has not completed successfully yet"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0417u, + ADI_STRING("ADC Txlb: DAC Stream Write Error"), + ADI_STRING("Stream DAC has stopped Writing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0418u, + ADI_STRING("ADC Txlb: Register Map Verification Failed"), + ADI_STRING("ADC TxLb Module not Configured as Expected"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0419u, + ADI_STRING("ADC Txlb: Tracking Calibration Timeout"), + ADI_STRING("Timeout due to Disabled Tx"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Enable ORx before Timeout") + }, + /*!< -------- Tx DAC Calibration Section Base Error Code = 0x0500 ------ */ + { + 0x0501u, + ADI_STRING("Tx DAC: DAC Channel I not Powered Up"), + ADI_STRING("Supplies not Ready or Clock is not on"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Verify Supply Ready Flags and PLL Ready Flags are Set, if the problem persists acquire a Memory Dump and contact ADI") + }, + { + 0x0502u, + ADI_STRING("Tx DAC: DAC Channel Q not Powered Up"), + ADI_STRING("Supplies not Ready or Clock is not on"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Verify Supply Ready Flags and PLL Ready Flags are Set, if the problem persists acquire a Memory Dump and contact ADI") + }, + { + 0x0503u, + ADI_STRING("Tx DAC: DAC Channel I Initial Calibration didn't finish"), + ADI_STRING("DAC Clock not on"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Verify PLL Ready Flags are Set, if the problem persists acquire a Memory Dump and contact ADI") + }, + { + 0x0504u, + ADI_STRING("Tx DAC: DAC Channel Q Initial Calibration didn't finish"), + ADI_STRING("DAC Clock not on"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Verify PLL Ready Flags are Set, if the problem persists acquire a Memory Dump and contact ADI") + }, + { + 0x0505u, + ADI_STRING("Tx DAC: DAC Channel I Saturated during Initial Calibration"), + ADI_STRING("Not Enough Range during TxDAC Initial Calibration"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Possibly not Enough Range, acquire a Memory Dump and contact ADI") + }, + { + 0x0506u, + ADI_STRING("Tx DAC: DAC Channel Q Saturated during Initial Calibration"), + ADI_STRING("Not Enough Range during TxDAC Initial Calibration"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Possibly not Enough Range, acquire a Memory Dump and contact ADI") + }, + { + 0x0507u, + ADI_STRING("Tx DAC: DAC Channel I not Powered Down"), + ADI_STRING("Supplies not Ready or Clock is not on"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Verify Supply Ready Flags and PLL Ready Flags are Set, if the problem persists acquire a Memory Dump and contact ADI") + }, + { + 0x0508u, + ADI_STRING("Tx DAC: DAC Channel Q not Powered Down"), + ADI_STRING("Supplies not Ready or Clock is not on"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("verify supply ready flags and PLL ready flags are set, if the problem persists acquire a Memory Dump and contact ADI @cause: TxDAC clock has incorrect Configuration") + }, + { + 0x0509u, + ADI_STRING("Tx DAC: DAC Channel I not in Standby"), + ADI_STRING("Supplies not Ready or Clock is not on"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Verify Supply Ready Flags and PLL Ready Flags are Set, if the problem persists acquire a Memory Dump and contact ADI") + }, + { + 0x050Au, + ADI_STRING("Tx DAC: DAC Channel Q not in Standby"), + ADI_STRING("Supplies not Ready or Clock is not on"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("verify supply ready flags and PLL ready flags are set, if the problem persists acquire a Memory Dump and contact ADI @cause: TxDAC clock has incorrect Configuration") + }, + { + 0x050Bu, + ADI_STRING("Tx DAC: Invalid Clock Divider"), + ADI_STRING("Invalid Clock Divider Value"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Verify dacPowerDownDiv_i/q, dacPowerUpDiv_i/q, and txDacClkDiv have correct Configuration") + }, + { + 0x050Cu, + ADI_STRING("Tx DAC: DAC Sample Clock out of Operating Frequency Range"), + ADI_STRING("Sample clock should be between 1.5 - 3GHz"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Sample Clock Rate") + }, + /*!< -------- BBF Tx Calibration Section Base Error Code = 0x0600 ------ */ + { + 0x0601u, + ADI_STRING("BBF Tx: Calibration Data Capture Aborted"), + ADI_STRING("Tx Going Lower or Higher Priority"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Calibration") + }, + { + 0x0602u, + ADI_STRING("BBF Tx: Insufficient Power measured at Loopback path"), + ADI_STRING("Insufficient power measured at Loopback path"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0603u, + ADI_STRING("BBF Tx: Base Band Filter was not Tuned to Achieve Flatness"), + ADI_STRING("Algorithm unable to converge on Tuning Capacitor Values"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Rerun the Initial Calibration again. Contact ADI if the problem persists") + }, + { + 0x0604u, + ADI_STRING("BBF Tx: Invalid Data Captured by FSC Hardware"), + ADI_STRING("FSC Hardware unable to Capture Correct Data"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Rerun the Initial Calibration again. Contact ADI if the problem persists") + }, + { + 0x0605u, + ADI_STRING("BBF Tx: Control Command Not Supported"), + ADI_STRING("Invalid Control Command passed to BBF Tx Module"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Control Command is Supported") + }, + { + 0x0606u, + ADI_STRING("BBF Tx: Capacitor Estimate Higher than Threshold"), + ADI_STRING("Calibration unable to Converge on Tuning Capacitor Values"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Calibration") + }, + { + 0x0607u, + ADI_STRING("BBF Tx: Capacitor Estimate Lower than Threshold"), + ADI_STRING("Calibration unable to Converge on Tuning Capacitor Values"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Calibration") + }, + { + 0x0608u, + ADI_STRING("BBF Tx: Hardware unable to Schedule/Complete Data Capture"), + ADI_STRING("FSC Hardware unable to Capture Correct Data"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Calibration") + }, + { + 0x0609u, + ADI_STRING("BBF Tx: Test Mode Range Error"), + ADI_STRING("Tx Input Range is Out of Range"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Sample Clock Rate") + }, + { + 0x060Au, + ADI_STRING("BBF Tx: CPU Synchronization Error"), + ADI_STRING("Timeout Waiting for the Other CPU to Synchronize"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Whether Both Cores are Running") + }, + { + 0x060Bu, + ADI_STRING("BBF Tx: Error adjusting invalid frequency"), + ADI_STRING("Unable to adjust LO or Fbb by adjust value"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Re-run the Initial Calibration. Contact ADI if the problem persists") + }, + { + 0x060Cu, + ADI_STRING("BBF Tx: Unable to find capacitor for proper attenuation"), + ADI_STRING("Calibration unable to Converge on Tuning Capacitor Values"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Calibration") + }, + /*!< -------- Path Delay Calibration Section Base Error Code = 0x0700 ------ */ + { + 0x0701u, + ADI_STRING("Path Delay: Use case is not Currently Supported"), + ADI_STRING("unsupported use case"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Use Case is Currently Supported") + }, + { + 0x0702u, + ADI_STRING("Path Delay: Self Check Failure"), + ADI_STRING("Estimated Delay Exceeds Margin"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0703u, + ADI_STRING("Path Delay:Number of observations more than the limit set"), + ADI_STRING("Adjust algorithm Configuration Parameters to handle Profile"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0704u, + ADI_STRING("Path Delay: Cross-Correlation Timeout"), + ADI_STRING("FSC was unable to Capture Data"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0x0705u, + ADI_STRING("Path Delay: Cross-Correlation Error"), + ADI_STRING("FSC was unable to capture data"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Calibration") + }, + { + 0x0706u, + ADI_STRING("Path Delay: Cross-Correlation Get Results Error"), + ADI_STRING("Unable to Get FSC Capture Results"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + /*!< -------- TxAtten Calibration Section Base Error Code = 0x0800 ------ */ + /*!< -------- Tx HRM Calibration Section Base Error Code = 0x0900 ------ */ + { + 0x0901u, + ADI_STRING("Tx HRM: Warm Boot Error"), + ADI_STRING("Initial Calibration must run successfully at least once before Warm Boot"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Tx HRM Initial Calibration") + }, + { + 0x0902u, + ADI_STRING("Tx HRM: Correlation Capture Error"), + ADI_STRING("Timeout waiting for Data Capture to Complete"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Tx HRM Initial Calibration") + }, + { + 0x0903u, + ADI_STRING("Tx HRM: Auto-Correlation Timeout"), + ADI_STRING("FSC was unable to Capture Data"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Tx HRM Initial Calibration") + }, + { + 0x0904u, + ADI_STRING("Tx HRM: Auto-correlation Get Results"), + ADI_STRING("Unable to Get FSC Capture Results"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Tx HRM Initial Calibration") + }, + { + 0x0905u, + ADI_STRING("Tx HRM: Invalid Delay Parameter"), + ADI_STRING("Delay Parameter being searched does not exist"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Tx HRM Initial Calibration. Contact ADI if the problem persists") + }, + { + 0x0906u, + ADI_STRING("Tx HRM: Delay Parameter Value is Out of Range"), + ADI_STRING("Delay Parameter being searched is outside Min/Max limits specified"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Tx HRM Initial Calibration") + }, + { + 0x0907u, + ADI_STRING("Tx HRM: Delay Parameter search Error"), + ADI_STRING("Did not find optimum value for delay Parameter. Target Performance not Achieved"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Tx HRM Initial Calibration") + }, + { + 0x0908u, + ADI_STRING("Tx HRM: Fundamental Power Measurement Error"), + ADI_STRING("Fundamental Power Measured is too Low"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Tx HRM Initial Calibration") + }, + { + 0x0909u, + ADI_STRING("Tx HRM: Zeroing Cal Error"), + ADI_STRING("No optimum FDACP/FDACN detected"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Tx HRM Initial Calibration") + }, + { + 0x090Au, + ADI_STRING("Tx HRM: Incorrect Number of bytes supplied to HRM Control Function"), + ADI_STRING("API function supplied incorrect number of bytes to HRM Control Function"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check API call that supplied the parameters") + }, + { + 0x090Bu, + ADI_STRING("Tx HRM: Must choose only 1 channel for HRM Control Function"), + ADI_STRING("API function supplied chnnel mask with more than one channel to HRM Control Function"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check API call that supplied the parameters") + }, + /*!< -------- Tx LOL Calibration Section Base Error Code = 0x0B00 ------ */ + { + 0x0B01u, + ADI_STRING("TxLol:Hardware unable to schedule/complete Data Capture"), + ADI_STRING("FSC was unable to capture data"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Power measured at output is below threshold. Reset Device") + }, + { + 0x0B05u, + ADI_STRING("Tx Lol: Correction Predicted exceeds Threshold"), + ADI_STRING("Predicted correction higher than Hardware threshold limits"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Tx LOL Initial Calibration") + }, + { + 0x0B06u, + ADI_STRING("TxLol: Internal Calibration Error"), + ADI_STRING("Invalid Observations Reported by Hardware"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Tx LOL Initial Calibration") + }, + { + 0x0B07u, + ADI_STRING("TxLol: Invalid Tx to ORx Mapping"), + ADI_STRING("Invalid ORx Mapped to Current Tx Channel"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Tx to ORx Mapping Configuration") + }, + /*!< -------- SERDES Calibration Section Base Error Code = 0x0C00 ------ */ + { + 0x0C01u, + ADI_STRING("SERDES: Lane is Powered down or not Configured"), + ADI_STRING("Requesting to calibrate a Lane that is Powered down or not Configured"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check provided Lane Number/Mask against SERDES Device Profile") + }, + { + 0x0C02u, + ADI_STRING("SERDES: Control Command not Supported"), + ADI_STRING("Invalid Control Command passed to SERDES Module"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Command is Supported") + }, + { + 0x0C03u, + ADI_STRING("SERDES: Invalid Parameter Error"), + ADI_STRING("Invalid Parameter in Control Command"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Parameters are supported for the Control Command") + }, + { + 0x0C04u, + ADI_STRING("SERDES: Temperature Error"), + ADI_STRING("Unsupported Operating Temperature Detected"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the Device & Wait for Normal Operating Temperature") + }, + { + 0x0C05u, + ADI_STRING("SERDES: BG LMS can not converge"), + ADI_STRING("Check user's Tx data - possible long stream of unscrambled 0"), + ADI_ADRV904X_ERR_ACT_NONE, + ADI_STRING("No Action Required if the JESD link is up") + }, + { + 0x0C06u, + ADI_STRING("SERDES: Semaphore Take Failed"), + ADI_STRING("SERDES Internal OS Error failing to take the SERDES semaphore"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the Device and re-initialize the SERDES, if the problem persists contact ADI") + }, + { + 0x0C07u, + ADI_STRING("SERDES: One of the comparator Offset DACs reached its limits"), + ADI_STRING("Exceeded operating temperature Range or unexpected Hardware behavior"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the Device in a supported temperature region, if the problem persists contact ADI") + }, + { + 0x0C08u, + ADI_STRING("SERDES: One of the GmSw Offset DACs reached its limits"), + ADI_STRING("Exceeded operating temperature Range or unexpected Hardware behavior"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the Device in a supported temperature region, if the problem persists contact ADI") + }, + { + 0x0C09u, + ADI_STRING("SERDES: Offset DAC has reached its minimum or maximum value"), + ADI_STRING("Exceeded operating temperature Range or unexpected Hardware behavior"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the Device in a supported temperature region, if the problem persists contact ADI") + }, + { + 0x0C0Au, + ADI_STRING("SERDES: The regulator or slew-Rate Calibration didn't complete"), + ADI_STRING("Unexpected Hardware behavior"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset Device, if the problem persists contact ADI") + }, + { + 0x0C0Bu, + ADI_STRING("SERDES: Accumulation Timeout during BG Calibration"), + ADI_STRING("No serial traffic present - Check serial Link integrity"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset JESD Link or Device, re-run Calibration, if the problem persists contact ADI") + }, + { + 0x0C0Cu, + ADI_STRING("SERDES: Applied Clock Delay is not Consistent with the Measured Delay"), + ADI_STRING("Unexpected Hardware Behavior"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset JESD Link or Device, re-run Calibration, if the problem persists contact ADI") + }, + { + 0x0C0Du, + ADI_STRING("SERDES: Initialization Calibration didn't Complete in the Prescribed Amount of Time"), + ADI_STRING("No serial traffic present - Check serial Link integrity"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset JESD Link or Device, re-run Calibration, if the problem persists contact ADI") + }, + { + 0x0C0Eu, + ADI_STRING("SERDES: Tracking Calibration didn't complete in the prescribed amount of time"), + ADI_STRING("No serial traffic present - Check serial Link integrity"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset JESD Link or Device, re-run Calibration, if the problem persists contact ADI") + }, + { + 0x0C0Fu, + ADI_STRING("SERDES: Attempting to run Tracking Calibrations before Initialization Calibrations"), + ADI_STRING("Serdes tracking Calibration was initiated before SERDES Initial Calibration"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Run SERDES Initial Calibration before starting SERDES tracking Calibration") + }, + { + 0x0C10u, + ADI_STRING("SERDES: Unknown SERDES Error"), + ADI_STRING("Unspecified SERDES Error"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset Device, if the problem persists contact ADI") + }, + { + 0x0C11u, + ADI_STRING("SERDES: Single Lane Profile Unsupported for > 16.22Ghz"), + ADI_STRING("Incorrect Profile Configuration"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reconfigure Device to use at least 2 Lanes") + }, + { + 0x0C12u, + ADI_STRING("SERDES: Initialization Calibration didn't find a Suitable CTLE Setting with an open eye"), + ADI_STRING("Check serial Link integrity - No serial traffic present"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset JESD Link or Device, re-run Calibration, if the problem persists contact ADI") + }, + { + 0x0C13u, + ADI_STRING("SERDES: CTLE Offset DACs reached its limits"), + ADI_STRING("Exceeded operating temperature Range or unexpected Hardware behavior"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the Device in a supported temperature region, if the problem persists contact ADI") + }, + { + 0x0C14u, + ADI_STRING("SERDES: Semaphore Create Failed"), + ADI_STRING("SERDES Internal OS Error failing to create the SERDES semaphore"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the Device and re-initialize the SERDES") + }, + /*!< -------- TxLb Filter Calibration Section Base Error Code = 0x0E00 ------ */ + { + 0x0E01u, + ADI_STRING("TxLb Filter: No Valid Capacitor Code Found"), + ADI_STRING("Capacitor Code Range exceeded due to unexpected power measurement failures"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reduce observed power measurement BW and re-run Calibration") + }, + { + 0x0E02u, + ADI_STRING("TxLb Filter: Unexpected Data Capture Error"), + ADI_STRING("Timed out Waiting for Data Capture to complete"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run TxLb Filter Calibration") + }, + { + 0x0E03u, + ADI_STRING("TxLb Filter: Calibration not completed for this Channel"), + ADI_STRING("User did not run TxLb Filter Calibration"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Run TxLb Filter Calibration for the desired channels") + }, + /*!< -------- Tx/Rx Phase Calibration Section Base Error Code = 0x1100 ------ */ + { + 0x1101u, + ADI_STRING("Tx/Rx Phase Calibration: Error performing phase measurement"), + ADI_STRING("Unknown data capture error"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Calibration") + }, + { + 0x1102u, + ADI_STRING("Tx/Rx Phase Calibration: Error performing phase measurement"), + ADI_STRING("Unknown data capture error"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Calibration") + }, + { + 0x1103u, + ADI_STRING("Tx/Rx Phase Calibration: All the channels of the same CPU must either use the internal UHB LO or the external LO"), + ADI_STRING("Follow guidelines for selecting the LO source"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Use the same LO source (internal or external) for all the channels") + }, + /*!< -------- Rx QEC Tracking Calibration Section Base Error Code = 0x3000 ------ */ + { + 0x3001u, + ADI_STRING("Rx QEC: Error during Signal Search"), + ADI_STRING("Persistent signal-search HW unexpected Error when completing search"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Issue a CTRL RESET Command and re-run the Calibration") + }, + { + 0x3002u, + ADI_STRING("Rx QEC: Error during Data Capture"), + ADI_STRING("Persistent data-capture HW unexpected Error when completing capture"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Issue a CTRL RESET Command and re-run the Calibration") + }, + { + 0x3003u, + ADI_STRING("Rx QEC: Error during Core Update"), + ADI_STRING("Persistent core computation unexpected Error when completing update"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Issue a CTRL RESET Command and re-run the Calibration") + }, + { + 0x3004u, + ADI_STRING("Rx QEC:Error during QEC filter refresh"), + ADI_STRING("Persistent filter computation unexpected Error when completing QEC refresh"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Issue a CTRL RESET Command and re-run the Calibration") + }, + { + 0x3005u, + ADI_STRING("Rx QEC: Unsupported Use Case Error"), + ADI_STRING("Number of Frequency bins per search band exceeds the maximum (32) supported by HW"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check the bandwidth Parameters in the use case or change the use case") + }, + { + 0x3006u, + ADI_STRING("Rx QEC: Unsupported Use Case Error"), + ADI_STRING("Unable to support the Rx Gain table that was loaded on boot"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Change the Rx Gain table or update the firmware") + }, + { + 0x3007u, + ADI_STRING("Rx QEC: DC Notch Filter Start Delay too large"), + ADI_STRING("Unsupported Configuration Parameters for DC notch filter"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check DC notch Configuration or update the firmware") + }, + /*!< -------- Tx Lol Tracking Calibration Section Base Error Code = 0x3100 ------ */ + { + 0x3101u, + ADI_STRING("Tx Lol: Cannot run Tracking Calibration without previously running Initialization Calibration"), + ADI_STRING("Initialization Calibration was not run during initialization"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Run Initialization Calibration before attempting to run tracking Calibration") + }, + { + 0x3102u, + ADI_STRING("Tx Lol: Error sharing resources with Tx QEC Calibration"), + ADI_STRING("Unexpected Resource Sharing Error"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Initialization Calibration before attempting to run tracking Calibration") + }, + { + 0x3103u, + ADI_STRING("Tx Lol: Error capturing FSC data"), + ADI_STRING("Unexpected Data Capture Error"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Initialization Calibration before attempting to run tracking Calibration") + }, + { + 0x3104u, + ADI_STRING("Tx Lol: Error capturing FSC data"), + ADI_STRING("Data capture aborted due AGC over Range Error"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Initialization Calibration before attempting to run tracking Calibration") + }, + { + 0x3105u, + ADI_STRING("Tx Lol: Error capturing data from External Tx LOL accumulator"), + ADI_STRING("Unexpected Data Capture Error"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Initialization Calibration before attempting to run tracking Calibration") + }, + { + 0x3106u, + ADI_STRING("Tx Lol: Invalid Tx-to-ORx Path Delay passed to External Tx LOL accumulator"), + ADI_STRING("Unsupported use case, Invalid Configurator output, or Invalid user Configuration"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Ensure combined Configurator and user-adjusted Path Delay is between 0 and 250") + }, + { + 0x3107u, + ADI_STRING("Tx Lol: ORx LOL NCO not configured properly to mix Tx LO to DC at accumulator Input"), + ADI_STRING("LOL NCO not reconfigured properly when Tx LO or ORx NCO Frequency changed at run-time"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Disable LOL tracking Calibration, re-issue Tx LO and/or ORx NCO Frequency change Command, then re-enable LOL tracking Calibration") + }, + { + 0x3108u, + ADI_STRING("Tx Lol: Lo Frequency violates Frequency planning conditions"), + ADI_STRING("Lo Frequency coincides with Loopback/ORx Sampling frequencies"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Change Lo Frequency to avoid Overlap on Loopback/ORx bandwidth edge") + }, + { + 0x3109u, + ADI_STRING("Tx Lol: Model does not agree with incoming observation data, indicating the Calibration has diverged"), + ADI_STRING("Unexpected Calibration divergence can occur when observation data is corrupted (e.g. External Loopback disconnected)"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Initialization Calibration before attempting to run tracking Calibration") + }, + { + 0x310Au, + ADI_STRING("Tx Lol: Tx-to-ORx channel gain estimate falls outside expected range"), + ADI_STRING("Typically a Tx-to-ORx mapping problem (not observing the expected Tx channel)"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Fix external observation path, issue LOL channel reset command, and re-enable LOL tracking cal") + }, + { + 0x310Bu, + ADI_STRING("Tx Lol: estimate leakage is too large or NaN, or estimate leakage variance is too small or NaN"), + ADI_STRING("Typically an observation problem"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Fix external observation path, issue LOL channel reset command, and re-enable LOL tracking cal") + }, + /*!< -------- TxQEC Tracking Calibration Section Base Error Code = 0x3200 ------ */ + { + 0x3201u, + ADI_STRING("Tx QEC: Correlation Capture Error"), + ADI_STRING("Timed out waiting for Data Capture to complete"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run Calibration") + }, + { + 0x3202u, + ADI_STRING("Tx QEC: Initial Calibration not done"), + ADI_STRING("At least one of the required Initial Calibrations was not run"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Ensure that all required Initial Calibrations are run without Error") + }, + { + 0x3203u, + ADI_STRING("Tx QEC: Error Initializing Frequency mask for signal search"), + ADI_STRING("Some other Calibration is conflicting with Tx QEC signal search"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Re-run TxQEC Tracking Calibration") + }, + { + 0x3204u, + ADI_STRING("Tx QEC: Error Initializing Frequency mask for signal search"), + ADI_STRING("Signal search mask overflow due to unsupported Configurator Parameters"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Current firmware doesn't support this Profile/use case, contact ADI for FW update") + }, + { + 0x3205u, + ADI_STRING("Tx QEC: Error configuring Tx QEC to work over specified Tx bands"), + ADI_STRING("Unsupported Configurator Parameters"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Current firmware doesn't support this Profile/use case, contact ADI for FW update") + }, + { + 0x3206u, + ADI_STRING("Tx QEC: Error configuring Tx QEC actuator, not enough correction Range"), + ADI_STRING("The current firmware can not correct quadrature Error of this Device as it is different than expected"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Contact ADI for a firmware update") + }, + { + 0x3207u, + ADI_STRING("Tx QEC: Self Check Error, new coefficients increases group delay"), + ADI_STRING("Data capture returning unexpected results"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Re-run the algorithm") + }, + { + 0x3208u, + ADI_STRING("Low Tx tone power, possibly due to wrong tone Frequency or some other errors on Tx path"), + ADI_STRING("TxQEC Initialization, insufficient tone power"), + ADI_ADRV904X_ERR_ACT_CHECK_INTERFACE, + ADI_STRING("TXQEC Initialization Re-Run, contact ADI for FW debug, if Error repeats") + }, + { + 0x3209u, + ADI_STRING("Detected too many potential interfering/aliasing signals in the LB path"), + ADI_STRING("Number of significant interferences exceeds FW Setting. ADI anticipated this Error to not occur in field"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Contact ADI to disable reporting this Error, Calibration performance maybe reduced") + }, + { + 0x320Au, + ADI_STRING("Detected user programmed LO Frequency too close to one of interfering harmonic in the LB path"), + ADI_STRING("User has changed the LO Frequency Setting at runtime. ADI anticipated this Error to occur less frequently"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Use formula provided by ADI to compute a valid LO Frequency, otherwise Calibration performance maybe severely reduced") + }, + { + 0x320Bu, + ADI_STRING("Tx QEC:DC notch settling time too large"), + ADI_STRING("Unsupported Configurator Parameters"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Current firmware doesn't support this Configuration, contact ADI for FW update") + }, + { + 0x320Cu, + ADI_STRING("Tx QEC:Calibration detected that the QEC model does not agree with the incoming observation data"), + ADI_STRING("Calibration detected divergence due to a bad observation"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Perform QEC reset, or re-run Initialization Calibration, before re-enabling QEC tracking Calibration") + }, + { + 0x320Du, + ADI_STRING("Tx QEC:Calibration detected NaN in critical state data"), + ADI_STRING("Unexpected NaN, possibly due to divide-by-zero"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Perform QEC reset, or re-run Initialization Calibration, before re-enabling QEC tracking Calibration") + }, + /*!< -------- Device Profile Configuration Section Base Error Code = 0x8000 ------ */ + { + 0x8001u, + ADI_STRING("Device Profile: Failed CRC verification"), + ADI_STRING("Programmed image is corrupted. Original image may be Invalid or may have been corrupted during SPI transfer."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reprogram the Device Profile Image") + }, + /*!< -------- Device Profile Configuration Section Base Error Code = 0x8500 ------ */ + { + 0x8501u, + ADI_STRING("Parity: Fatal 2bit Error"), + ADI_STRING("Memory data is corrupted. Uncorrectable error."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("ADI_ADRV904X_ERR_ACT_RESET_DEVICE") + }, + /*!< -------- NCO Section Base Error Code = 0xB000 ------ */ + { + 0xB001u, + ADI_STRING("NCO: Invalid Frequency Parameters"), + ADI_STRING("Frequency not supported for Sampling Rate"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and NCO Frequency settings") + }, + { + 0xB002u, + ADI_STRING("NCO: Invalid Phase Parameters"), + ADI_STRING("Invalid Phase Offset Setting"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("NCO Phase Setting must be between 0 - 359") + }, + { + 0xB003u, + ADI_STRING("NCO: Invalid Gain Parameters"), + ADI_STRING("Invalid Gain Setting"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("NCO I/Q Gain Setting is Invalid") + }, + { + 0xB004u, + ADI_STRING("NCO: Band or type selection"), + ADI_STRING("Invalid band or NCO selected"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Valid Value must be used for DDC or Datapath NCO") + }, + { + 0xB005u, + ADI_STRING("NCO: Dual tone frequencies are out-of-Range"), + ADI_STRING("Frequencies not supported for Sampling Rate"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and NCO Frequency settings") + }, + { + 0xB006u, + ADI_STRING("NCO: Tx Mixer NCO Frequency can not be changed while TxTestTone Enabled"), + ADI_STRING("Disable Test tone with TxTestToneSet() before calling TxNcoShifterSet()"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check API Call Sequence") + }, + /*!< -------- Stream Section Base Error Code = 0xB100 ------ */ + { + 0xB101u, + ADI_STRING("Stream: Invalid Input Parameters"), + ADI_STRING("One or more Input Parameters are not valid"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xB102u, + ADI_STRING("Stream:Timer expired waiting for stream completion"), + ADI_STRING("The stream Timeout can occur due to stream processor waiting for other streams to complete"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("The stream execution is timed out. Rerun the feature to recover from this Error.") + }, + { + 0xB103u, + ADI_STRING("Stream: Triggered stream reported an Error"), + ADI_STRING("The stream that is triggered either through firmware or API has generated an Error."), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("The stream number being triggered should be checked.") + }, + { + 0xB104u, + ADI_STRING("Stream: Failed CRC verification"), + ADI_STRING("Programmed image is corrupted. Original image may be Invalid or may have been corrupted during SPI transfer."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reprogram the stream image.") + }, + { + 0xB105u, + ADI_STRING("Stream: Stream Processor reported a FIFO Error"), + ADI_STRING("The stream FIFO is full. This could happen due to back to back streams being triggered."), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Rerunning the feature could solve the issue.") + }, + { + 0xB106u, + ADI_STRING("Stream: Stream Processor reported an External Timer Error"), + ADI_STRING("External Timer started by stream Failed. This could fail if no External timers available."), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Rerunning the feature could solve the issue.") + }, + { + 0xB107u, + ADI_STRING("Stream: Stream Processor reported an Invalid instruction"), + ADI_STRING("This could happen if the stream is corrupted or stream is generated wrongly"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Recreate the stream and reprogram the Device. If the problem persists contact ADI to fix the stream.") + }, + { + 0xB108u, + ADI_STRING("Stream: Stream Processor reported an Invalid AHB address"), + ADI_STRING("Wrong AHB address is accessed in the stream."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Recreate the stream and reprogram the Device. If the problem persists contact ADI to fix the stream.") + }, + { + 0xB109u, + ADI_STRING("Stream: Stream Processor reported an Invalid stream number"), + ADI_STRING("Invalid stream number called from stream or firmware"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Recreate the stream and reprogram the Device. If the problem persists contact ADI to fix the stream.") + }, + { + 0xB10Au, + ADI_STRING("Stream: Stream Processor reported a stack overflow"), + ADI_STRING("Too many nested calls in the stream can cause this"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Recreate the stream and reprogram the Device. If the problem persists contact ADI to fix the stream.") + }, + { + 0xB10Bu, + ADI_STRING("Stream: Stream Processor reported a Timeout Error"), + ADI_STRING("The stream did not complete within the set Timeout period"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Recreate the stream and reprogram the Device. If the problem persists contact ADI to fix the stream.") + }, + { + 0xB10Cu, + ADI_STRING("Stream: Stream Processor reported a check instruction Error"), + ADI_STRING("This could happen if a wrong instruction is used in the stream."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Recreate the stream and reprogram the Device. If the problem persists contact ADI to fix the stream.") + }, + { + 0xB10Du, + ADI_STRING("Stream: Stream Processor reported an Invalid SPI address"), + ADI_STRING("Invalid SPI address accessed in the stream."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Recreate the stream and reprogram the Device. If the problem persists contact ADI to fix the stream.") + }, + { + 0xB10Eu, + ADI_STRING("Stream: Previous Stream didn't finish"), + ADI_STRING("The previous stream started by the stream processor or firmware did not finish"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Rerun the feature if the problem persists, contact ADI to fix the stream Timeout.") + }, + { + 0xB10Fu, + ADI_STRING("Stream: Function not supported"), + ADI_STRING("The functionality is not yet supported."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Recreate the stream and reprogram the Device. If the problem persists contact ADI to fix the stream.") + }, + /*!< -------- Fsc Section Base Error Code = 0xB200 ------ */ + { + 0xB201u, + ADI_STRING("FSC: Cannot find FSC decimation rates to suit this use case"), + ADI_STRING("Current Calibration Configuration does not support this use case"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check for valid/supported use case. Firmware update may be required.") + }, + { + 0xB202u, + ADI_STRING("FSC: Cannot find valid FSC clock Configuration to suit this use case"), + ADI_STRING("This use case is not currently supported by the FSC and its Device driver"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check for valid/supported use case. Firmware update may be required.") + }, + { + 0xB203u, + ADI_STRING("FSC: Attempted to start second FSC capture before the first had completed"), + ADI_STRING("Firmware synchronization bug is causing a resource-sharing collision in the FSC"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("ADI_ADRV904X_ERR_ACT_RESET_FEATURE") + }, + { + 0xB204u, + ADI_STRING("FSC: Cannot find valid Phase compensation factor for LB NCOs"), + ADI_STRING("Loopback Phase Calibration has Failed due to unexpected or noisy observation data"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Attempt to re-run Path Delay Calibration") + }, + { + 0xB205u, + ADI_STRING("FSC: Error capturing data for Phase Compensation Calibration"), + ADI_STRING("Unexpected Data Capture failure"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Attempt to re-run Path Delay Calibration") + }, + /*!< -------- Master Bias Section Base Error Code = 0xB300 ------ */ + { + 0xB301u, + ADI_STRING("Master Bias: RB0 Ptat Calibration Failed"), + ADI_STRING("Unexpected failure in resistor trim logic, or no clock provided to trim logic"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xB302u, + ADI_STRING("Master Bias: RB1 Ptat Calibration Failed"), + ADI_STRING("Unexpected failure in resistor trim logic, or no clock provided to trim logic"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xB303u, + ADI_STRING("Master Bias: Invalid Ptat resistor value for Tx BBF"), + ADI_STRING("Ptat trim Calibration generated an out-of-Range result"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xB304u, + ADI_STRING("Master Bias: Invalid Ptat resistor value for UPC"), + ADI_STRING("Ptat trim Calibration generated an out-of-Range result"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xB305u, + ADI_STRING("Master Bias: Invalid Ptat resistor value for UPC BIAS"), + ADI_STRING("Ptat trim Calibration generated an out-of-Range result"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xB306u, + ADI_STRING("Master Bias: Invalid Ptat resistor value for VGA"), + ADI_STRING("Ptat trim Calibration generated an out-of-Range result"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + /*!< -------- VCO LDO Section Base Error Code = 0xB400 ------ */ + { + 0xB401u, + ADI_STRING("VCO LDO: LDO output voltage is below low side of target Range"), + ADI_STRING("VCO LDO bypass capacitor is shorted to GND"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Bypass Capacitor & Soldering for Damage and/or Short. Contact ADI if the problem persists.") + }, + { + 0xB402u, + ADI_STRING("VCO LDO: Input supply voltage is below low side of target Range"), + ADI_STRING("Input supply voltage is below undervoltage-lockout threshold"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check the Input supply voltage and try again. Contact ADI if the problem persists.") + }, + { + 0xB403u, + ADI_STRING("VCO LDO: Reference Input voltage below low side of target Range"), + ADI_STRING("Unexpected Hardware behavior, reference Input voltage below low side of target Range"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xB404u, + ADI_STRING("VCO LDO: Temperature is above high side of target Range"), + ADI_STRING("Temperature is above high side of target Range"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Heat Dissipation is at required level. Contact ADI if the problem persists.") + }, + { + 0xB405u, + ADI_STRING("VCO LDO: Load current is above high side of target Range dictated by VCO"), + ADI_STRING("VCO LDO bypass capacitor is shorted to GND"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Bypass capacitor & soldering for damage/short. Contact ADI if the problem persists.") + }, + { + 0xB406u, + ADI_STRING("VCO LDO: LDO output voltage is above high side of target Range"), + ADI_STRING("VCO LDO bypass capacitor is shorted to VDD"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check board layout. Contact ADI if the problem persists.") + }, + { + 0xB407u, + ADI_STRING("VCO LDO: 1.0V Shunt LDO: LDO output voltage is below low threshold"), + ADI_STRING("PD bit = 1 or Rampup Bit = 0 or Master Bias/LCR is not up"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xB408u, + ADI_STRING("VCO LDO: 1.0V Shunt LDO: LDO output voltage is above high threshold"), + ADI_STRING("PD bit = 1 or Unexpected Hardware behavior"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xB409u, + ADI_STRING("VCO LDO: 1.0V Shunt LDO: LDO output voltage is out of regulation"), + ADI_STRING("Unexpected Hardware behavior, under and over voltage status bits are set"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xB40Au, + ADI_STRING("VCO LDO: 0.8V Shunt LDO: LDO output voltage below the targeted threshold"), + ADI_STRING("LDO output does not power up at all or it may need longer wait time to power up to the targeted threshold."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xB40Bu, + ADI_STRING("VCO LDO: Unspecified VCO LDO Error"), + ADI_STRING("Power Not Good & No Other LDO Status Flag is Indicating an Error"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + /*!< -------- DWT Section Base Error Code = 0xB500 ------ */ + { + 0xB501u, + ADI_STRING("DWT: Data Watchpoint and Trace (DWT) driver not initialized"), + ADI_STRING("HW doesn't support the DWT the driver is expecting"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reprogram the Device using a Valid Package and try again. Contact ADI if the problem persists.") + }, + /*!< -------- Temperature Section Base Error Code = 0xB600 ------ */ + { + 0xB601u, + ADI_STRING("Temperature:HAL Invalid Average Mask"), + ADI_STRING("Parameter out of Range"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Parameter should be > 0 and < 256, see adi_adrv904x_DevTempSensor_e in the API") + }, + { + 0xB602u, + ADI_STRING("Temperature: HAL Temp sensor for TX0 conversion Timeout"), + ADI_STRING("Hardware was unable to acquire temperature Sample within time limit"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the Device, if the problem persists acquire a Memory Dump and contact ADI") + }, + { + 0xB603u, + ADI_STRING("Temperature: HAL Temp sensor for TX1 conversion Timeout"), + ADI_STRING("Hardware was unable to acquire temperature Sample within time limit"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the Device, if the problem persists acquire a Memory Dump and contact ADI") + }, + { + 0xB604u, + ADI_STRING("Temperature: HAL Temp sensor for TX2 conversion Timeout"), + ADI_STRING("Hardware was unable to acquire temperature Sample within time limit"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the Device, if the problem persists acquire a Memory Dump and contact ADI") + }, + { + 0xB605u, + ADI_STRING("Temperature: HAL Temp sensor for TX3 conversion Timeout"), + ADI_STRING("Hardware was unable to acquire temperature Sample within time limit"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the Device, if the problem persists acquire a Memory Dump and contact ADI") + }, + { + 0xB606u, + ADI_STRING("Temperature: HAL Temp sensor for TX4 conversion Timeout"), + ADI_STRING("Hardware was unable to acquire temperature Sample within time limit"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the Device, if the problem persists acquire a Memory Dump and contact ADI") + }, + { + 0xB607u, + ADI_STRING("Temperature: HAL Temp sensor for TX5 conversion Timeout"), + ADI_STRING("Hardware was unable to acquire temperature Sample within time limit"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the Device, if the problem persists acquire a Memory Dump and contact ADI") + }, + { + 0xB608u, + ADI_STRING("Temperature: HAL Temp sensor for TX6 conversion Timeout"), + ADI_STRING("Hardware was unable to acquire temperature Sample within time limit"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the Device, if the problem persists acquire a Memory Dump and contact ADI") + }, + { + 0xB609u, + ADI_STRING("Temperature: HAL Temp sensor for TX7 conversion Timeout"), + ADI_STRING("Hardware was unable to acquire temperature Sample within time limit"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the Device, if the problem persists acquire a Memory Dump and contact ADI") + }, + { + 0xB60Au, + ADI_STRING("Temperature: HAL Temp sensor for CLK Gen PLL conversion Timeout"), + ADI_STRING("Hardware was unable to acquire temperature Sample within time limit"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the Device, if the problem persists acquire a Memory Dump and contact ADI") + }, + { + 0xB60Bu, + ADI_STRING("Temperature: HAL Temp sensor for RF0 PLL conversion Timeout"), + ADI_STRING("Hardware was unable to acquire temperature Sample within time limit"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the Device, if the problem persists acquire a Memory Dump and contact ADI") + }, + { + 0xB60Cu, + ADI_STRING("Temperature: HAL Temp sensor for RF1 PLL conversion Timeout"), + ADI_STRING("Hardware was unable to acquire temperature Sample within time limit"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the Device, if the problem persists acquire a Memory Dump and contact ADI") + }, + { + 0xB60Du, + ADI_STRING("Temperature: HAL Temp sensor for SERDES PLL conversion Timeout"), + ADI_STRING("Hardware was unable to acquire temperature Sample within time limit"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the Device, if the problem persists acquire a Memory Dump and contact ADI") + }, + { + 0xB60Eu, + ADI_STRING("Temperature: HAL Invalid Temp sensor Enable bit"), + ADI_STRING("Parameter out of Range"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Temp Sensor is not on the accessed core, see adi_adrv904x_DevTempSensor_e in the API") + }, + /*!< -------- PLL Section Base Error Code = 0xB700 ------ */ + { + 0xB701u, + ADI_STRING("PLL: Synthesizer Lock Failed"), + ADI_STRING("Hardware Lock Detection Timeout"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check External Clock Sources and Power Supply") + }, + { + 0xB702u, + ADI_STRING("PLL: User Input Frequency Out of Range"), + ADI_STRING("Specified Frequency by the user was out of Range"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Ensure requested Input Frequency is in Range") + }, + { + 0xB703u, + ADI_STRING("PLL: User specified Invalid PLL type"), + ADI_STRING("Specified PLL name by the user was incorrect"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Ensure the correct PLL is specified") + }, + { + 0xB704u, + ADI_STRING("PLL: Selected PLL was Not Enabled"), + ADI_STRING("Selected PLL not Enabled"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("This Error code is not used") + }, + { + 0xB705u, + ADI_STRING("PLL: VCO Calibration Failed"), + ADI_STRING("Unexpected Hardware behavior, Hardware VCO Calibration Timeout"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xB706u, + ADI_STRING("PLL: Invalid Loopfilter Parameters, Phase of BW out of Range."), + ADI_STRING("Specified Loopfilter Parameters out of Range"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check that the Input Parameters are in Range") + }, + { + 0xB707u, + ADI_STRING("PLL: CP Calibration Failed"), + ADI_STRING("Unexpected Hardware behavior, Hardware CP Calibration Timeout"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xB708u, + ADI_STRING("PLL: Bleed ramp Calibration Failed"), + ADI_STRING("Unexpected Hardware behavior, Hardware Bleed Calibration Timeout"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xB709u, + ADI_STRING("PLL: Invalid Rx Leaf Hardware Setting, the selected Frequency could not be realized."), + ADI_STRING("Specified RX Frequency could not be realized"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check that the Input Parameters are in Range") + }, + { + 0xB70Au, + ADI_STRING("PLL: Invalid Tx Leaf Hardware Setting, the selected Frequency could not be realized."), + ADI_STRING("Specified TX Frequency could not be realized"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("This Error code is not used") + }, + { + 0xB70Bu, + ADI_STRING("PLL: Phase Sync Invalid mode Setting"), + ADI_STRING("Specified Phase Sync mode Invalid"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xB70Cu, + ADI_STRING("PLL: Phase Sync Timeout"), + ADI_STRING("Phase Sync Calibration Timeout"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xB70Du, + ADI_STRING("PLL:Phase Sync Phase Mismatch"), + ADI_STRING("Phase Sync Golden Counter Mismatch"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xB70Eu, + ADI_STRING("PLL: External LO Input Frequency out of Range"), + ADI_STRING("Specified External LO Frequency out of Range"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Ensure Input Parameters are correct") + }, + { + 0xB70Fu, + ADI_STRING("PLL: CLK Sweep Test Error"), + ADI_STRING("CPU Clock is Too Fast"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xB711u, + ADI_STRING("PLL: Invalid Control Command"), + ADI_STRING("PLL Module is not in Debug Mode"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Ensure Device is in correct state for Command") + }, + { + 0xB712u, + ADI_STRING("PLL: GCNT SDM MCS Timeout"), + ADI_STRING("GCNT SDM MCS Hardware Timeout"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xB713u, + ADI_STRING("PLL: GCNT ClkGen MCS Timeout"), + ADI_STRING("GCNT Clkgen MCS Hardware Timeout"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xB714u, + ADI_STRING("PLL: Forced ALC Enable-Disable Timeout"), + ADI_STRING("Forced ALC Enable-Disabled Hardware Timeout"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xB715u, + ADI_STRING("PLL: Unable to lookup and set the PLL modulus value"), + ADI_STRING("Device clock must be divisable by 122.88 or 184.32 MHz"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check that device clock setting is supported") + }, + { + 0xB716u, + ADI_STRING("PLL: clock rate exceeded the design limit"), + ADI_STRING("PLL clock rate must be < 250 MHz"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + /*!< -------- JESD Section Base Error Code = 0xB800 ------ */ + { + 0xB801u, + ADI_STRING("JESD: Serializer Lane Overlap"), + ADI_STRING("Incorrect Serializer Lane assignment"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and restart the Device") + }, + { + 0xB802u, + ADI_STRING("JESD: Deserializer Lane Overlap"), + ADI_STRING("Incorrect Deserializer Lane assignment"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and restart the Device") + }, + { + 0xB803u, + ADI_STRING("JESD: Framer Invalid Sample Rate"), + ADI_STRING("Incorrect Framer Sample Rate in the Profile"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and restart the Device") + }, + { + 0xB804u, + ADI_STRING("JESD: Link sharing Invalid Sample Rate"), + ADI_STRING("Incorrect Link sharing Sample Rate in the Profile"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and restart the Device") + }, + { + 0xB805u, + ADI_STRING("JESD: Deframer Invalid Sample Rate"), + ADI_STRING("Incorrect Deframer Sample Rate in the Profile"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and restart the Device") + }, + { + 0xB806u, + ADI_STRING("JESD: Invalid Framer Sync Pad Configuration"), + ADI_STRING("Incorrect Framer Sync pad Configuration provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and restart the Device") + }, + { + 0xB807u, + ADI_STRING("JESD:Invalid Deframer Sync Pad Configuration"), + ADI_STRING("Incorrect Deframer Sync pad Configuration provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and restart the Device") + }, + { + 0xB808u, + ADI_STRING("JESD: Framer 0 must be Enabled"), + ADI_STRING("Framer 0 is not used in the Profile"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and restart the Device") + }, + { + 0xB809u, + ADI_STRING("JESD: Invalid Framer Sample Crossbar entry"), + ADI_STRING("Invalid Framer Sample Crossbar entry in the Profile"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and restart the Device") + }, + { + 0xB80Au, + ADI_STRING("JESD:Invalid Framer Link layer mode of Operation"), + ADI_STRING("Invalid Framer mode Parameter in the Profile"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and restart the Device") + }, + { + 0xB80Bu, + ADI_STRING("JESD: Invalid Deframer Sample Crossbar entry"), + ADI_STRING("Invalid Deframer Sample Crossbar entry in the Profile"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and restart the Device") + }, + { + 0xB80Cu, + ADI_STRING("JESD: Invalid Deframer Link layer mode of Operation"), + ADI_STRING("Invalid Deframer mode Parameter in the Profile"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and restart the Device") + }, + { + 0xB80Du, + ADI_STRING("JESD: Framer S Parameter is not a power of 2"), + ADI_STRING("Invalid Framer S Parameter in the Profile"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and restart the Device") + }, + { + 0xB80Eu, + ADI_STRING("JESD: Deframer S Parameter is not a power of 2"), + ADI_STRING("Invalid Deframer S Parameter in the Profile"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and restart the Device") + }, + { + 0xB80Fu, + ADI_STRING("JESD: Invalid Framer Configuration"), + ADI_STRING("Invalid Framer Configuration detected by the JESD Hardware block"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and restart the Device") + }, + { + 0xB810u, + ADI_STRING("JESD: Invalid Deframer Configuration"), + ADI_STRING("Invalid Deframer Configuration detected by the JESD Hardware block"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and restart the Device") + }, + { + 0xB811u, + ADI_STRING("JESD: Invalid Sample Crossbar"), + ADI_STRING("Invalid Link sharing Sample Crossbar entry in the Profile"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and restart the Device") + }, + { + 0xB812u, + ADI_STRING("JESD: Unsupported Frequency Divide Ratio"), + ADI_STRING("Invalid Frequency Parameter in the Profile"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and restart the Device") + }, + { + 0xB813u, + ADI_STRING("JESD: Invalid Frequency"), + ADI_STRING("Invalid Frequency Parameter provided in the Profile"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and restart the Device") + }, + { + 0xB814u, + ADI_STRING("JESD: Invalid number of converters"), + ADI_STRING("Invalid number of converters specified in the Profile"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and restart the Device") + }, + { + 0xB815u, + ADI_STRING("JESD: Invalid Serializer Lane selected"), + ADI_STRING("Invalid Serializer Lane selected"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and restart the Device") + }, + { + 0xB816u, + ADI_STRING("JESD: Invalid Serializer Lane Parameter"), + ADI_STRING("Invalid Serializer Lane Parameter"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and restart the Device") + }, + { + 0xB817u, + ADI_STRING("JESD: Serializer Clock offset calibration failed"), + ADI_STRING("JESD: Serializer Clock offset calibration failed"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + /*!< -------- UART Section Base Error Code = 0xB900 ------ */ + { + 0xB901u, + ADI_STRING("UART: Invalid SCLK Frequency"), + ADI_STRING("SCLK is too low for configured UART bit Rate, check Device clock Settings"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Increase SCLK Frequency and try again.") + }, + /*!< -------- Tx Attenuation Driver Section Base Error Code = 0xBA00 ------ */ + { + 0xBA01u, + ADI_STRING("TxAttenDrv: Must be in SPI mode to accesses this mode"), + ADI_STRING("Invalid Tx attenuation mode selected"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Select SPI Mode before changing Tx Attenuation") + }, + { + 0xBA02u, + ADI_STRING("TxAttenDrv: Invalid HP attenuation value, attenuation max exceeded"), + ADI_STRING("Invalid HP attenuation value"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Select HP value within Range") + }, + /*!< -------- TxLolDrv Section Base Error Code = 0xBB00 ------ */ + { + 0xBB01u, + ADI_STRING("TxLolDrv: Attempted second accumulation before the first completed"), + ADI_STRING("Tx LOL Calibration state machine bug"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Stop and restart TxLOL tracking Calibration") + }, + { + 0xBB02u, + ADI_STRING("TxLolDrv: Attempted to read results before accumulator had halted"), + ADI_STRING("Tx LOL Calibration firmware/Hardware handshake problem"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Stop and restart TxLOL tracking Calibration") + }, + { + 0xBB04u, + ADI_STRING("TxLolDrv: Cannot configure TX LOL clock faster than ORX LOL clock"), + ADI_STRING("External Tx LOL observations not supported with the current Profile"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Device Profile and restart the Device") + }, + { + 0xBB05u, + ADI_STRING("TxLolDrv:Observation Channel is unsupported"), + ADI_STRING("External Tx LOL observations do not support this ORx Channel"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check TX to ORx mapping") + }, + /*!< -------- Gpio Driver Section Base Error Code = 0xBD00 ------ */ + { + 0xBD01u, + ADI_STRING("GpioDrv: Invalid signal ID provided"), + ADI_STRING("Invalid signal ID provided"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xBD02u, + ADI_STRING("GpioDrv: Invalid GPIO pin number provided"), + ADI_STRING("Invalid GPIO pin number provided"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + /*!< -------- RadioSequencerDrv Section Base Error Code = 0xBE00 ------ */ + { + 0xBE01u, + ADI_STRING("RadioSequencerDrv: CRC verification failed"), + ADI_STRING("Programmed image is corrupted. Original image may be invalid or may have been corrupted"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. If problem persists contact ADI.") + }, + /*!< -------- CarrierReconfigure Section Base Error Code = 0xBF00 ------ */ + { + 0xBF01u, + ADI_STRING("CarrierReconfigure: Channel filter calculation error"), + ADI_STRING("Invalid carrier configuration supplied"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check supplied carrier configuration and channel filters") + }, + { + 0xF101u, + ADI_STRING("DDCC: HW in unexpected state"), + ADI_STRING("DDCC HW error"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reprogram the Device using a Valid Package and try again. Contact ADI if the problem persists.") + }, + { + 0xF102u, + ADI_STRING("DDCC: HW SM in unexpected state"), + ADI_STRING("DDCC HW State Machine error"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reprogram the Device using a Valid Package and try again. Contact ADI if the problem persists.") + }, + { + 0xF103u, + ADI_STRING("DDCC: CAL Filter CM in unexpected state"), + ADI_STRING("DDCC HW CAL Filter CM error"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reprogram the Device using a Valid Package and try again. Contact ADI if the problem persists.") + }, + /*!< -------- System Section Base Error Code = 0xFF00 ------ */ + { + 0xFF01u, + ADI_STRING("System: General-Purpose Timer Error"), + ADI_STRING("Software Timer allocation failure."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF02u, + ADI_STRING("System: Generic Mailbox Error"), + ADI_STRING("Unspecified Mailbox Error"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF03u, + ADI_STRING("System: Mailbox Busy Error"), + ADI_STRING("The requested Mailbox Hardware is in use and cannot receive commands"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Rerun feature. If the problem persists reset and try again. Contact ADI if the problem persists.") + }, + { + 0xFF04u, + ADI_STRING("System: Invalid Mailbox Handle"), + ADI_STRING("Mailbox Operation requested on an Invalid Mailbox"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF05u, + ADI_STRING("System: Invalid Mailbox Link Number"), + ADI_STRING("Mailbox Operation requested on an Invalid Mailbox Link"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF06u, + ADI_STRING("System: Mailbox Link busy"), + ADI_STRING("The requested Mailbox Link is in use and cannot receive commands"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Rerun feature. If the problem persists reset and try again. Contact ADI if the problem persists.") + }, + { + 0xFF07u, + ADI_STRING("System: Mailbox Command too large for Link buffer"), + ADI_STRING("Command payload is unexpectedly too large for Mailbox buffer"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF08u, + ADI_STRING("System: Mailbox Command Invalid transaction ID"), + ADI_STRING("Mailbox received a Command with an Invalid transaction ID, most likely a duplicate Command."), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Rerun feature. If the problem persists reset and try again. Contact ADI if the problem persists.") + }, + { + 0xFF09u, + ADI_STRING("System: Invalid CPU ID specified"), + ADI_STRING("Given CPU ID Parameter is Invalid."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reprogram the CPU firmware image. If the problem persists contact ADI") + }, + { + 0xFF0Au, + ADI_STRING("System: Null Pointer Detected"), + ADI_STRING("Programmed image is corrupted. Original image may be Invalid or may have been corrupted during SPI transfer."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reprogram the CPU firmware image. If the problem persists contact ADI") + }, + { + 0xFF0Bu, + ADI_STRING("System: O/S Task Create Error"), + ADI_STRING("Invalid Parameters passed to the Task Create API"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF0Cu, + ADI_STRING("System: RAM Lock Error"), + ADI_STRING("RAM Lock Procedure not followed for Data Capture"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF0Du, + ADI_STRING("System: RAM Unlock Error"), + ADI_STRING("RAM Unlock Procedure not followed for Data Capture"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF0Eu, + ADI_STRING("System: Invalid Control Command Argument"), + ADI_STRING("Invalid Control Command Argument"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Verify Command Argument is correct and try again.") + }, + { + 0xFF0Fu, + ADI_STRING("System: Initialization Calibration Startup Error"), + ADI_STRING("Initialization Calibration Startup Error"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF14u, + ADI_STRING("System: Aborted Initialization Calibration"), + ADI_STRING("Initialization Calibration was Aborted by Command"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Rerun the Initialization Calibrations") + }, + { + 0xFF15u, + ADI_STRING("System: Initialization Calibration Warm Boot Checksum Error"), + ADI_STRING("Initialization Calibration Warm Boot Data Image is corrupted"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Rerun Initialization Calibration") + }, + { + 0xFF16u, + ADI_STRING("System: Initialization Calibration Invalid Channel mask Error"), + ADI_STRING("Channel numbers that are not Enabled in the Profile are selected in the Channel mask"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Rerun the Initialization Calibration with correct Channel mask") + }, + { + 0xFF17u, + ADI_STRING("System: Initialization Calibration Invalid Calibration mask Error"), + ADI_STRING("The Initialization Calibration mask might have unsupported Calibrations"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Rerun the Initialization Calibration with correct Calibration mask") + }, + { + 0xFF18u, + ADI_STRING("System: Initialization Calibration Busy"), + ADI_STRING("Initialization Calibration Command is sent again while one is in progress"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Make sure not to send the Initialization Calibration Command while one is in progress.") + }, + { + 0xFF19u, + ADI_STRING("System: Profile Checksum Failed or bad Profile wrt to EFUSE"), + ADI_STRING("The Device Profile image is corrupted. Original image may be Invalid or may have been corrupted during SPI transfer."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reprogram the Device Profile image. If the problem persists contact ADI") + }, + { + 0xFF1Au, + ADI_STRING("System: Profile product ID doesn't match Profile product ID"), + ADI_STRING("The Device Profile is not valid for this Product"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Reprogram the Device with a Valid Profile Image. If the problem persists contact ADI") + }, + { + 0xFF1Cu, + ADI_STRING("System: Could not create the event"), + ADI_STRING("Invalid Event Parameters are passed to the OS call"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF1Du, + ADI_STRING("System: Could not create the Queue"), + ADI_STRING("Invalid Queue Parameters are passed to the OS call"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF1Eu, + ADI_STRING("System: Could not create the Timer"), + ADI_STRING("Invalid Timer Parameters are passed to the OS call."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF1Fu, + ADI_STRING("System: Failed to post the message"), + ADI_STRING("Message Queue Full"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF20u, + ADI_STRING("System: Failed to receive the message"), + ADI_STRING("Invalid Queue Parameters are passed to the OS call"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF24u, + ADI_STRING("System: Commands sent to task that does not exist"), + ADI_STRING("This can happen if a Command is sent to a Channel that is not Enabled in the Profile or disabled."), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Rerun the feature with the correct Channel mask.") + }, + { + 0xFF25u, + ADI_STRING("System: Invalid Control Command"), + ADI_STRING("Invalid Control Command Received"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Rerun the feature with the correct Command.") + }, + { + 0xFF26u, + ADI_STRING("System: Insufficient Memory available for the Requested Operation"), + ADI_STRING("This can happen if an insufficient buffer size is sent for a Command. For example get Configuration or get Calibration status."), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Rerun the Command with the correct buffer size allocated.") + }, + { + 0xFF27u, + ADI_STRING("System: Invalid Calibration Control Command"), + ADI_STRING("Invalid Control Command Sent to Calibration"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Rerun the Calibration with the Correct Control Command") + }, + { + 0xFF28u, + ADI_STRING("System: Invalid Calibration Set Configuration"), + ADI_STRING("Invalid Set Configuration sent to Calibration"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Ensure Input Parameters are correct") + }, + { + 0xFF29u, + ADI_STRING("System: Invalid Calibration Get Configuration"), + ADI_STRING("Invalid Get Configuration sent to Calibration"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Ensure Input Parameters are correct") + }, + { + 0xFF2Au, + ADI_STRING("System: Invalid Calibration Get Status Command"), + ADI_STRING("Invalid Get Status Command sent to Calibration"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Control Command is Supported") + }, + { + 0xFF2Bu, + ADI_STRING("System: The given Channel is not Enabled in the Profile"), + ADI_STRING("This can happen if a Channel is not Enabled in the Profile is getting Enabled or disabled."), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Ensure Input Parameters are correct") + }, + { + 0xFF2Cu, + ADI_STRING("System: Invalid Configuration Object"), + ADI_STRING("Invalid Set Configuration Command for Configuration Object ID"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Ensure Input Parameters are correct") + }, + { + 0xFF2Du, + ADI_STRING("System: Invalid Configuration Data Size"), + ADI_STRING("Invalid Configuration Data Size for Module Configuration Buffer Size"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Ensure Input Parameters are correct") + }, + { + 0xFF2Eu, + ADI_STRING("System: Invalid Configuration Offset"), + ADI_STRING("Invalid Offset Sent with Configuration Command"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Ensure Input Parameters are correct") + }, + { + 0xFF2Fu, + ADI_STRING("System: Invalid Configuration State"), + ADI_STRING("Cannot Update Configuration while Initialization Calibrations are Running"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Rerun the Configuration Command after the Initialization Calibrations are complete.") + }, + { + 0xFF51u, + ADI_STRING("System: CPU HAL Feature not Implemented"), + ADI_STRING("CPU HAL Feature not Implemented"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF52u, + ADI_STRING("System: HAL Invalid Channel"), + ADI_STRING("Invalid Channel Configuration in Profile or an Invalid Channel requested"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Verify Channel Configuration and reprogram the Device Profile Image") + }, + { + 0xFF53u, + ADI_STRING("System: HAL Invalid LO"), + ADI_STRING("Invalid PLL chosen for LO. This could be due to corrupted program memory"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF54u, + ADI_STRING("System: AHB (Common) Error detected"), + ADI_STRING("Invalid SPI address access either an Invalid address or span of registers"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Verify address and Range are correct for the SPI region being accessed") + }, + { + 0xFF55u, + ADI_STRING("System: AHB (CPU0) Error detected"), + ADI_STRING("CPU0 accessing Invalid memory address or Range"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the problem persists acquire a Memory Dump and contact ADI") + }, + { + 0xFF56u, + ADI_STRING("System: AHB (CPU1) Error detected"), + ADI_STRING("CPU1 accessing Invalid memory address or Range"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the problem persists acquire a Memory Dump and contact ADI") + }, + { + 0xFF57u, + ADI_STRING("System: Internal Multi-chip Sync (MCS) Failed to complete"), + ADI_STRING("MCS Hardware did not complete synchronization in the allotted time"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF58u, + ADI_STRING("System:Primary CPU detected secondary CPU(s) boot failure"), + ADI_STRING("Secondary core not completing boot"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF59u, + ADI_STRING("System: Utilities Timer Internal Error"), + ADI_STRING("RTOS Task Scheduler not running for Timer request"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF5Au, + ADI_STRING("System: LOGEN Invalid LO Input/Output Configuration"), + ADI_STRING("User selected an Invalid LOGEN Configuration, verify Device Profile/Configurator settings"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Ensure Input Parameters are correct") + }, + { + 0xFF5Cu, + ADI_STRING("System: Intentional crash, from force exception Command"), + ADI_STRING("API Command sent to force an exception in the CPU"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("This is a deliberate forced Error") + }, + { + 0xFF5Du, + ADI_STRING("System: Configuration locked, for updating"), + ADI_STRING("The Configuration is not unlocked before sending the Configuration Command"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Unlock the Configuration and resend the Configuration Command") + }, + { + 0xFF5Eu, + ADI_STRING("System: The given key to unlock Configuration did not match with the key in current package"), + ADI_STRING("The Configuration key did not match required key to unlock"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Use the correct key given by ADI and try to unlock the Configuration again") + }, + { + 0xFF5Fu, + ADI_STRING("System: Number of Configuration update limit reached"), + ADI_STRING("Reached the limit of the number Configuration commands allowed"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the Device to send new set of Configuration Parameters") + }, + { + 0xFF60u, + ADI_STRING("System: The given key to enter debug mode did not match with the key to enter debug mode"), + ADI_STRING("The debug key did not match required key to unlock."), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Try to send the Command again with the right Debug key. Contact ADI to get the correct key if the problem persists.") + }, + { + 0xFF61u, + ADI_STRING("System: The Set Control Command length is less than expected or greater than max data size allowed"), + ADI_STRING("The control Command buffer is greater than the supported size"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Change the size of the control Command payload or increase the control Command buffer size.") + }, + { + 0xFF62u, + ADI_STRING("System: Watchdog Timer expired, system is unresponsive"), + ADI_STRING("Not all firmware tasks completed in the expected time frame."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Collect memory dump to provide debug information and reset Device.") + }, + { + 0xFF63u, + ADI_STRING("System: Shared memory Mutex Timeout"), + ADI_STRING("This could happen if the shared Mutex cannot be obtained within the Timeout period"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF64u, + ADI_STRING("System: The given index to the SW Breakpoint Table is out of Range"), + ADI_STRING("Unexpected SW Breakpoint Table Index"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF65u, + ADI_STRING("System: Shared memory Mutex already taken"), + ADI_STRING("This could happen if trying to take the Mutex which is already taken"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF66u, + ADI_STRING("System: Shared memory Mutex released without owning it"), + ADI_STRING("This could happen if trying to release the Mutex which is not owned"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF67u, + ADI_STRING("System: This system is being configured to support too many channels per CPU"), + ADI_STRING("This is a Configurator Channel enable issue"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check the Profile and the Configurator logic") + }, + { + 0xFF68u, + ADI_STRING("System: The given status size is Invalid"), + ADI_STRING("The user requested the status size larger than supported size."), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Change the size of the status Command buffer size.") + }, + { + 0xFF69u, + ADI_STRING("System: Initialization and tracking start-up functions still running"), + ADI_STRING("The Control task waits a predefined amount of time which is not long enough"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Increase the Timeout in the FW Control task.") + }, + { + 0xFF6Au, + ADI_STRING("System: Invalid Debug Command"), + ADI_STRING("Invalid Debug Command Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Debug Command is Supported. Contact ADI to get the correct Command if the problem persists.") + }, + { + 0xFF6Bu, + ADI_STRING("System: Invalid Debug Command Parameter"), + ADI_STRING("Invalid Debug Command Parameter Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Debug Command Parameter is Supported. Contact ADI to get the correct info if the problem persists.") + }, + { + 0xFF6Cu, + ADI_STRING("System: HAL Tx attenuation Restore Failed"), + ADI_STRING("Cannot restore Tx attenuation because the settings were not saved"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset Feature and try again. If the problem persists acquire a Memory Dump and contact ADI") + }, + { + 0xFF6Du, + ADI_STRING("System: Invalid Calibration Debug Control Command"), + ADI_STRING("Invalid Debug Control Command sent to Calibration Feature"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Control Command is Supported") + }, + { + 0xFF6Eu, + ADI_STRING("System: The health monitor memory allocation is not large enough for the current number of tasks"), + ADI_STRING("The number of RTOS tasks is greater than expected."), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Allocate the required health monitor memory for the number of RTOS tasks") + }, + { + 0xFF6Fu, + ADI_STRING("System: Semaphore Create Failure"), + ADI_STRING("System Failed to Create Semaphore"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF70u, + ADI_STRING("System: Semaphore Take Failure"), + ADI_STRING("System Failed to Take Semaphore"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF71u, + ADI_STRING("System: Simulated Error"), + ADI_STRING("Simulated System Error Condition for Internal Testing"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF72u, + ADI_STRING("System: Unexpected Silicon Revision Detected"), + ADI_STRING("Using Incompatible Hardware with Current Version of Software"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF73u, + ADI_STRING("System: Radio Loopback requested but being used"), + ADI_STRING("A Calibration is already using a radio Loopback"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Verify Calibration logic to find multiple request") + }, + { + 0xFF74u, + ADI_STRING("System: System Timer stop Error"), + ADI_STRING("System Timer didn't stop within Timeout"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF75u, + ADI_STRING("System: Tracking Calibration did not suspend without Timeout"), + ADI_STRING("The tracking Calibration Failed to suspend within the expected time."), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF76u, + ADI_STRING("System: Only primary CPU supports EFUSE commands"), + ADI_STRING("Sent EFUSE Command to secondary CPU."), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("API Error. Contact ADI.") + }, + { + 0xFF77u, + ADI_STRING("System: The full Profile is only available during CPU0 boot-up"), + ADI_STRING("Full Profile gets erased after CPU0 boot-up."), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Don't use full Profile after boot-up.") + }, + { + 0xFF78u, + ADI_STRING("System: Semaphore give Operation failure"), + ADI_STRING("This could happen because the system Failed in giving the semaphore."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("If the Problem Persists, Acquire a Memory Dump and Contact ADI") + }, + { + 0xFF79u, + ADI_STRING("System: Unable to read EFUSE"), + ADI_STRING("The EFUSE read did not occur."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset Device and try again. If the problem persists contact ADI") + }, +/* END AUTOGENERATED CPU RUNTIME ERROR TABLE */ +}; + +#endif /* _ADRV904X_CPU_ERROR_TABLES_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_error_tables_template.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_error_tables_template.h new file mode 100644 index 00000000000..e17f4edb371 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_error_tables_template.h @@ -0,0 +1,40 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file + * + * \brief + * + * \details + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADRV904X_CPU_ERROR_TABLES_H_ +#define _ADRV904X_CPU_ERROR_TABLES_H_ + +#include "adi_common_error.h" +#include "adi_adrv904x_error_types.h" + +const adrv904x_CpuBootErrCodes_t adrv904x_CpuBootErrTable[] = +{ +/* DO NOT EDIT THIS TABLE, CHANGES WILL BE OVERWRITTEN DURING FULL BUILD */ +/* START AUTOGENERATED CPU BOOT ERROR TABLE */ +#error Firmware build (genErrorInfo.bat) needs to be run to autogenerate CPU boot error table! +/* END AUTOGENERATED CPU BOOT ERROR TABLE */ +}; + +const adrv904x_CpuRuntimeErrCodes_t adrv904x_CpuRunTimeErrTable[] = +{ +/* DO NOT EDIT THIS TABLE, CHANGES WILL BE OVERWRITTEN DURING FULL BUILD */ +/* START AUTOGENERATED CPU RUNTIME ERROR TABLE */ +#error Firmware build (genErrorInfo.bat) needs to be run to autogenerate CPU boot error table! +/* END AUTOGENERATED CPU RUNTIME ERROR TABLE */ +}; + +#endif /* _ADRV904X_CPU_ERROR_TABLES_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_fw_rev_info_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_fw_rev_info_types.h new file mode 100644 index 00000000000..e67e842a93d --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_fw_rev_info_types.h @@ -0,0 +1,44 @@ +/** + * \file adrv904x_cpu_fw_rev_info_types.h + * + * \brief Contains device revision information. + * + * \details Contains device revision information. + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV903x API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_CPU_FW_REV_INFO_TYPES_H__ +#define __ADRV904X_CPU_FW_REV_INFO_TYPES_H__ + +#include "adi_adrv904x_platform_pack.h" + +/* + ******************************************************************************************************** + * Declarations used below to reference global data + ******************************************************************************************************** + */ +ADI_ADRV904X_PACK_START +typedef struct adrv904x_DeviceRevisionData +{ + uint32_t majorRev; + uint32_t minorRev; + uint32_t maintRev; + uint32_t buildNum; + uint32_t buildType; + uint8_t gitHash[41]; + uint8_t branchInfo[80]; + uint32_t reserved[12]; +} adrv904x_DeviceRevisionData_t; +ADI_ADRV904X_PACK_FINISH + +#endif /* __ADRV904X_CPU_FW_REV_INFO_TYPES_H__*/ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_health_monitor_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_health_monitor_types.h new file mode 100644 index 00000000000..8826403feba --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_health_monitor_types.h @@ -0,0 +1,42 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2020 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adrv904x_cpu_health_monitor_types.h + * + * \brief Contains ADRV904X Private CPU Health Monitor data types + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_CPU_HEALTH_MONITOR_TYPES_H__ +#define __ADRV904X_CPU_HEALTH_MONITOR_TYPES_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_cpu_error_codes_types.h" + +/** + * \brief Health Monitor Private structure for a single CPU. No defined private data to include yet. + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_HealthMonitorPrivateCpuStatusSingle +{ + uint8_t dummyField; /*!< Dummy field */ +} adrv904x_HealthMonitorPrivateCpuStatusSingle_t;) + +/** + * \brief Health Monitor Private structure for all CPUs + */ +ADI_ADRV904X_PACKED( +typedef struct adrv904x_HealthMonitorPrivateCpuStatus +{ + adrv904x_HealthMonitorPrivateCpuStatusSingle_t cpu0; /*!< Private CPU Health Monitor Status info for CPU0 */ + adrv904x_HealthMonitorPrivateCpuStatusSingle_t cpu1; /*!< Private CPU Health Monitor Status info for CPU1 */ +} adrv904x_HealthMonitorPrivateCpuStatus_t;) + +#endif /* __ADRV904X_CPU_HEALTH_MONITOR_TYPES_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_macros.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_macros.h new file mode 100644 index 00000000000..66dc583b6dc --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_macros.h @@ -0,0 +1,43 @@ +/** + * Copyright 2015 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adrv904x_cpu_macros.h + * \brief Contains ADRV904X API miscellaneous macro definitions for CPU + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADRV904X_CPU_MACROS_H_ +#define _ADRV904X_CPU_MACROS_H_ + +#include +#include "adrv904x_cpu_memory.h" + +#define ADRV904X_CPU_0MD_ERRCODE(armOpCode, armObjId, armErrorFlag) \ + ((armOpCode << ADRV904X_CPU_OPCODE_SHIFT) | \ + (armObjId << ADRV904X_CPU_OBJ_ID_SHIFT) | \ + armErrorFlag) + +#define ADRV904X_CPU_OPCODE_VALID(a) \ + (((a) != 0) && (((a) % 2) || ((a) > 30))) + +/* CPU memory map */ +#define ADRV904X_CPU_0_ADDR_PROG_START (ADRV904X_CPU0_PM_START) + +/* CPU memory map */ +#define ADRV904X_CPU_1_ADDR_PROG_START (ADRV904X_CPU1_PM_START) + +/* CPU FW version address */ +#define ADRV904X_ADDR_FW_VERSION (ADRV904X_PM_DEVICE_REV_DATA) + +#define ADRV904X_MAX_CPU_FW_PATH 128u +#define ADRV904X_CPU_FW_PATH_SEP ';' + +#define ADRV904X_CPU_STREAM_TRIGGER_OPCODE 0x1FU + + +#endif /* _ADRV904X__MACROS_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_memory.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_memory.h new file mode 100644 index 00000000000..c7f0a7b8cb3 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_memory.h @@ -0,0 +1,182 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adrv904x_cpu_memory.h + * + * \brief Contains CPU memory tables + * + * \details Contains CPU memory tables and a few configuration constants. + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_CPU_MEMORY_H__ +#define __ADRV904X_CPU_MEMORY_H__ + +/* CPU0/CPU1 program and data memory starting addresses */ +#define ADRV904X_CPU0_PM_START (0x01000000U) +#define ADRV904X_CPU0_DM_START (0x20000000U) + +#define ADRV904X_CPU1_PM_START (0x02000000U) +#define ADRV904X_CPU1_DM_START (0x21000000U) + +/* CPU program and data memory physical sizes */ +#define ADRV904X_CPU_PM_SIZE (0x50000U) +#define ADRV904X_CPU_DM_SIZE (0x40000U) + +/* CPU program and data memory limits (virtual sizes) */ +#define ADRV904X_CPU_PM_LIMIT (0x50000U) +#define ADRV904X_CPU_DM_LIMIT (0x40000U) + +/* Ensure limits are within the physical memory limits */ +#if ADRV904X_CPU_PM_LIMIT > ADRV904X_CPU_PM_SIZE +#error "ADRV904X_CPU_PM_LIMIT must be <= ADRV904X_CPU_PM_SIZE" +#endif +#if ADRV904X_CPU_DM_LIMIT > ADRV904X_CPU_DM_SIZE +#error "ADRV904X_CPU_DM_LIMIT must be <= ADRV904X_CPU_DM_SIZE" +#endif + +/* CPU0/CPU1 memory bank setting for the l1mem0_shared_bank_div_ctrl + * and l1mem1_shared_bank_div_ctrl registers. + * + * Possible values: + * IRAM_288K_DRAM_288K: 0x00U + * IRAM_224K_DRAM_352K: 0x01U + * IRAM_256K_DRAM_320K: 0x02U + * IRAM_320K_DRAM_256K: 0x03U + * IRAM_352K_DRAM_224K: 0x04U + */ +#define ADRV904X_CPU_MEM_BANK_CTRL_REG_VAL (0x03U) + +/** Regular for the format of CPU memory MACRO definition: + * 1. If the memory belongs both to CPU0 and CPU1, or ignore the CPU index, the MACRO should contain the 'PM' or 'DM' + * to point out which kind of memory it belongs to + * 2. If the memory belongs to a specific CPU, the MACRO should contains the 'CPU_0' or 'CPU_1' to indicate + * which CPU it belongs to, and contain the 'PM' or 'DM' to indicate which kind of memory it belongs to + */ + +/** + * The following memory definitions are in the ADRV904X CPU 0 program memory range (before application): + * ADRV904X_CPU0_PM_START to ADRV904X_CPU0_PM_START + (ADRV904X_CPU_PM_SIZE - ADRV904X_CPU_PM_LIMIT) - 1 + * -> (0x01000000 to 0x01004FFF) + * + * Any access of this M4 memory via shared memory must account for 64-bit alignment when dereferencing pointers + * and when accessing 64-bit data, such as in a struct. With a struct, 64-bit members must be 64-bit + * aligned, and therefore not packed. + * + * Any pointers that are shared must be on a 64-bit boundary since they will be read with a 64-bit register. + * After the pointer is read, it must be masked to only use the lower 32-bits. + * + * Example: + * + * \code + * // runtime values from BBIC/Radio Processor + * _adi_svc_ProfileRuntimeProfile_t *pRuntimeProfile = *((_adi_svc_ProfileRuntimeProfile_t**)_ADI_SVC_CMN_CPU_1_PM_RUNTIME_PROFILE_PTR); + * + * // the pointer is read as a 64-bit value, but the pointer is 32-bits + * pRuntimeProfile = (_adi_svc_ProfileRuntimeProfile_t *)((uint64_t)pRuntimeProfile & 0xFFFFFFFFUL); + * \endcode + */ + +#define ADRV904X_CPU_0_PM_EXCEPTION_FLAG (0x01000398U) /*!< CPU 0 ARM exception status */ + +#define ADRV904X_PM_DEBUG_CONFIG_BUF (0x010003A4U) /*!< JTAG Enable flag */ +#define ADRV904X_PM_DEVICE_REV_DATA (0x010003A8U) /*!< Firmware version */ + +#define ADRV904X_CPU_0_PM_CHECKSUM (0x01000468U) /*!< Run-time checksum (ADRV904X_PM_DEVICE_REV_DATA + size of RevData) */ + +#define ADRV904X_PM_SW_BKPT_TABLE_PTR (0x0100048CU) /*!< Breakpoint table pointer */ +#define ADRV904X_PM_SW_BKPT_GLOBAL_HALT_MASK_PTR (0x01000490U) /*!< Global Halt Mask pointer */ + +#define ADRV904X_CPU_0_PM_TRACKING_CAL_TASK_INFO (0x01000494U) /*!< Tracking cal info */ +#define ADRV904X_CPU_0_PM_TRACKING_CAL_TASK_DATA (0x01000498U) /*!< Tracking cal Data */ +#define ADRV904X_CPU_0_PM_INIT_CAL_TASK_INFO (0x0100049CU) /*!< Init cal info/status */ +#define ADRV904X_CPU_0_PM_ERROR_STATUS (0x010004A0U) /*!< Error status */ + +#define ADRV904X_CPU_0_PM_CONFIG_LOG (0x010004A4U) /*!< Configuration framework log */ +#define ADRV904X_CPU_0_PM_INIT_CAL_DATA (0x010004A8U) /*!< Location of the initial cal data */ +#define ADRV904X_CPU_0_PM_CMD_LOG (0x010004ACU) /*!< Command log record */ +#define ADRV904X_CPU_0_PM_TCB_TABLE (0x010004B0U) /*!< TCB buff table */ +#define ADRV904X_CPU_0_PM_CURR_TASK_HANDLE (0x010004B4U) /*!< Current task handle */ +#define ADRV904X_CPU_0_PM_SYS_CLOCK (0x010004B8U) /*!< System clock config */ +#define ADRV904X_PM_HEALTH_STATUS_PTR (0x010004BCU) /*!< Health monitors status pointer */ + +/* Range from 0x010004C0U to 0x010004E8U are defined below */ + + + +#define ADRV904X_CPU_0_PM_EFUSE_SETTINGS_PTR (0x010004ECU) /*!< eFUSE system settings - CPU 0 */ + +#define ADRV904X_CPU_0_PM_RADIO_SEQ_SEQUENCE_SIZE (0x010004F0U) +#define ADRV904X_CPU_0_PM_RADIO_SEQ_BUILD_TIME_CRC (0x010004F4U) + +#define ADRV904X_PM_CORE_SCRATCH_EXT_PTR (0x01000504U) /*!< Extended core scratch registers pointer */ + +/** + * The following memory definitions are in the ADRV904X CPU 1 program memory range (before application): + * ADRV904X_CPU1_PM_START to ADRV904X_CPU1_PM_START + (ADRV904X_CPU_PM_SIZE - ADRV904X_CPU_PM_LIMIT) - 1 + * -> (0x02000000 to 0x02004FFF) + * + * Any pointers that are shared must be on a 64-bit boundary since they will be read with a 64-bit register. + * After the pointer is read, it must be masked to only use the lower 32-bits. + * See example above. + */ + +#define ADRV904X_CPU_1_PM_EXCEPTION_FLAG (0x02000398U) /*!< CPU 1 ARM exception status */ + +/* 0x020003A4U is available */ + +#define ADRV904X_CPU_1_PM_TRACKING_CAL_TASK_INFO (0x020003A8U) /*!< Tracking cal info */ +#define ADRV904X_CPU_1_PM_TRACKING_CAL_TASK_DATA (0x020003ACU) /*!< Tracking cal Data */ +#define ADRV904X_CPU_1_PM_INIT_CAL_TASK_INFO (0x020003B0U) /*!< Init cal info/status */ +#define ADRV904X_CPU_1_PM_ERROR_STATUS (0x020003B4U) /*!< Error status */ + +#define ADRV904X_CPU_1_PM_CONFIG_LOG (0x020003B8U) /*!< Configuration framework log */ +#define ADRV904X_CPU_1_PM_INIT_CAL_DATA (0x020003BCU) /*!< Location of the initial cal data */ +#define ADRV904X_CPU_1_PM_TCB_TABLE (0x020003C0U) /*!< TCB buff table */ +#define ADRV904X_CPU_1_PM_CURR_TASK_HANDLE (0x020003C4U) /*!< Current task handle */ +#define ADRV904X_CPU_1_PM_SYS_CLOCK (0x020003C8U) /*!< System clock config */ +#define ADRV904X_CPU_1_PM_CHECKSUM (0x020003CCU) /*!< Run-time checksum of CPU 1 */ +#define ADRV904X_CPU_1_PM_CMD_LOG (0x020003D0U) /*!< Command log record */ +#define ADRV904X_CPU_1_PM_RUNTIME_PROFILE_PTR (0x020003D8U) /*!< Runtime profile pointer - shared ptr: must be 64-bit aligned */ +#define ADRV904X_PM_DEVICE_PROFILE_PTR (0x020003E0U) /*!< Device profile pointer - shared ptr: must be 64-bit aligned */ + +/** + * CPU 0 and CPU 1 data memory definitions. + */ + +/* mailbox buffers */ +#define ADRV904X_CPU_0_MAILBOX_NUM_LINKS (1) +#define ADRV904X_CPU_0_DM_MAILBOX_LINK_0_START_ADDR (0x20000000U) +#define ADRV904X_CPU_0_MAILBOX_LINK_0_SIZE (0x400U) + + +#define ADRV904X_CPU_0_DFE_MAILBOX_NUM_LINKS (1) +#define ADRV904X_CPU_0_DFE_MAILBOX_LINK_0_START_ADDR (0x20000400U) +#define ADRV904X_CPU_0_DFE_MAILBOX_LINK_0_SIZE (0x20U) + +/* Radio Sequencer Image Size and CRC */ +#define ADRV904X_DM_RSEQ_IMAGE_SIZE (0x20000420U) +#define ADRV904X_DM_RSEQ_IMAGE_CRC (0x20000424U) + +#define ADRV904X_CPU_1_MAILBOX_NUM_LINKS (1) +#define ADRV904X_CPU_1_DM_MAILBOX_LINK_0_START_ADDR (0x21000000U) +#define ADRV904X_CPU_1_MAILBOX_LINK_0_SIZE (0x400U) + + +#define ADRV904X_CPU_1_DFE_MAILBOX_NUM_LINKS (1) +#define ADRV904X_CPU_1_DFE_MAILBOX_LINK_0_START_ADDR (0x21000400U) +#define ADRV904X_CPU_1_DFE_MAILBOX_LINK_0_SIZE (0x20U) + +/* __CHECKSUM_ADDR__ OFFSET IN temp.icf */ +#define ADRV904X_CPU_0_PM_CHECKSUM_BUILDTIME (0x0104FFFCU) +#define ADRV904X_CPU_1_PM_CHECKSUM_BUILDTIME (0x0204FFFCU) +#endif /* __ADRV904X_CPU_MEMORY_H__ */ + + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_object_ids_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_object_ids_types.h new file mode 100644 index 00000000000..5229865055c --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_object_ids_types.h @@ -0,0 +1,142 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + + /** + * \file adrv904x_cpu_object_ids_types.h + * + * \brief Contains CPU Object ID definitions + * + * \details Contains CPU Object ID definitions + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_CPU_OBJECT_IDS_TYPES_H__ +#define __ADRV904X_CPU_OBJECT_IDS_TYPES_H__ + +#include + +typedef enum adrv904x_CpuObjectId +{ + /* Initial calibrations */ + ADRV904X_CPU_OBJID_IC_START = 0x00u, /*!< Start of Initial Calibration OBJID */ + ADRV904X_CPU_OBJID_IC_RC_TUNER = 0x00u, /*!< RC Tuner */ + ADRV904X_CPU_OBJID_IC_RX_DC_OFFSET = 0x01u, /*!< Rx DC offset */ + ADRV904X_CPU_OBJID_IC_ADC_RX = 0x02u, /*!< ADC Rx */ + ADRV904X_CPU_OBJID_IC_ADC_ORX = 0x03u, /*!< ADC ORx */ + ADRV904X_CPU_OBJID_IC_ADC_TXLB = 0x04u, /*!< ADC Tx Loopback */ + ADRV904X_CPU_OBJID_IC_TXDAC = 0x05u, /*!< TX DAC */ + ADRV904X_CPU_OBJID_IC_TXBBF = 0x06u, /*!< TXBBF */ + ADRV904X_CPU_OBJID_IC_TXLB_PATH_DLY = 0x07u, /*!< TxLB Path delay */ + ADRV904X_CPU_OBJID_IC_TX_ATTEN_CAL = 0x08u, /*!< TX Atten CAL (Gain/Phase) */ + ADRV904X_CPU_OBJID_IC_HRM = 0x09u, /*!< HRM */ + ADRV904X_CPU_OBJID_IC_TXQEC = 0x0Au, /*!< TxQEC init */ + ADRV904X_CPU_OBJID_IC_TXLOL = 0x0Bu, /*!< LOL Internal Init */ + ADRV904X_CPU_OBJID_IC_SERDES = 0x0Cu, /*!< SERDES Initial Cal */ + ADRV904X_CPU_OBJID_IC_RX_TIA = 0x0Du, /*!< RX TIA */ + ADRV904X_CPU_OBJID_IC_TXLB_FILTER = 0x0Eu, /*!< TxLB Filter cal */ + ADRV904X_CPU_OBJID_IC_TEST_0 = 0x0Fu, /*!< Test cal 0, Initial Cal Framework test */ + ADRV904X_CPU_OBJID_IC_TEST_1 = 0x10u, /*!< Test cal 1, Initial Cal Framework test */ + ADRV904X_CPU_OBJID_IC_TXRX_PHASE = 0x11u, /*!< Tx/Rx Phase Cal */ + ADRV904X_CPU_OBJID_IC_RXSPUR = 0x12u, /*!< RxSpur Initial Cal */ + ADRV904X_CPU_OBJID_IC_END = 0x12u, /*!< End of Initial Calibration OBJID */ + ADRV904X_CPU_OBJID_IC_NUM_CALS = (ADRV904X_CPU_OBJID_IC_END - ADRV904X_CPU_OBJID_IC_START + 1u), /*!< number of initial cals */ + + /* Tracking calibrations */ + ADRV904X_CPU_OBJID_TC_START = 0x30u, /*!< Start of Tracking Calibration OBJID */ + ADRV904X_CPU_OBJID_TC_RXQEC = 0x30u, /*!< Rx QEC */ + ADRV904X_CPU_OBJID_TC_TX_LOL = 0x31u, /*!< TX LOL */ + ADRV904X_CPU_OBJID_TC_TXQEC = 0x32u, /*!< Tx QEC */ + ADRV904X_CPU_OBJID_TC_SERDES = 0x33u, /*!< SERDES */ + ADRV904X_CPU_OBJID_TC_INTERNAL_START = 0x34u, /*!< Start of Internal Tracking Calibration OBJID */ + ADRV904X_CPU_OBJID_TC_RX_ADC = 0x34u, /*!< Rx ADC */ + ADRV904X_CPU_OBJID_TC_TXLB_ADC = 0x35u, /*!< TxLb ADC */ + ADRV904X_CPU_OBJID_TC_ORX_ADC = 0x36u, /*!< ORx ADC */ + ADRV904X_CPU_OBJID_TC_END = 0x36u, /*!< End of Tracking Calibration OBJID */ + ADRV904X_CPU_OBJID_TC_NUM_CALS = (ADRV904X_CPU_OBJID_TC_END - ADRV904X_CPU_OBJID_TC_START + 1u), /*!< number of tracking cals */ + + /* Configuration objects */ + ADRV904X_CPU_OBJID_CFG_DEVICE_PROFILE = 0x80u, /*!< Configuration profile */ + ADRV904X_CPU_OBJID_CFG_RADIO_EVENT = 0x81u, /*!< Radio events module */ + ADRV904X_CPU_OBJID_CFG_INITIAL_CALS = 0x82u, /*!< Initial Calibration framework configuration */ + ADRV904X_CPU_OBJID_CFG_CAL_SCHEDULER = 0x83u, /*!< Calibration scheduler */ + ADRV904X_CPU_OBJID_CFG_HM = 0x84u, /*!< HM Timer Control */ + ADRV904X_CPU_OBJID_CFG_PARITY_ERROR_CHECK = 0x85u, /*!< Configurable objects for memory refresh */ + ADRV904X_CPU_OBJID_CFG_SYSTEM_CONFIG = 0x86u, /*!< System configuration */ + ADRV904X_CPU_OBJID_CFG_TRACKING_CALS = 0x87u, /*!< Set tracking cal framework configuration */ + ADRV904X_CPU_OBJID_CFG_TELEM = 0x8Cu, /*!< Configure the telemetry logging */ + ADRV904X_CPU_OBJID_CFG_RESERVED3 = 0x8Du, /*!< reserved */ + ADRV904X_CPU_OBJID_CFG_RESERVED4 = 0x8Eu, /*!< reserved */ + ADRV904X_CPU_OBJID_CFG_RESERVED5 = 0x8Fu, /*!< reserved */ + + /* Driver objects ( 0xB0 - 0xBF ) */ + ADRV904X_CPU_OBJID_DRV_NCO = 0xB0u, /*!< NCO */ + ADRV904X_CPU_OBJID_DRV_STREAM = 0xB1u, /*!< Stream */ + ADRV904X_CPU_OBJID_DRV_FSC = 0xB2u, /*!< FSC */ + ADRV904X_CPU_OBJID_DRV_MASTER_BIAS = 0xB3u, /*!< Master Bias */ + ADRV904X_CPU_OBJID_DRV_LDO = 0xB4u, /*!< LDO */ + ADRV904X_CPU_OBJID_DRV_DWT = 0xB5u, /*!< DWT */ + ADRV904X_CPU_OBJID_DRV_TEMP = 0xB6u, /*!< TEMP */ + ADRV904X_CPU_OBJID_DRV_PLL = 0xB7u, /*!< PLL */ + ADRV904X_CPU_OBJID_DRV_JESD = 0xB8u, /*!< JESD */ + ADRV904X_CPU_OBJID_DRV_UART = 0xB9u, /*!< UART */ + ADRV904X_CPU_OBJID_DRV_TXATTEN = 0xBAu, /*!< TXATTEN */ + ADRV904X_CPU_OBJID_DRV_TXLOL = 0xBBu, /*!< TX LOL Accumulator */ + ADRV904X_CPU_OBJID_DRV_RX_CFG = 0xBCu, /*!< Rx Config */ + ADRV904X_CPU_OBJID_DRV_GPIO = 0xBDu, /*!< GPIO */ + ADRV904X_CPU_OBJID_DRV_RADIO_SEQUENCER = 0xBEu, /*!< Radio Sequencer */ + ADRV904X_CPU_OBJID_CFG_CARRIER_RECONFIG = 0xBFu, /*!< Carrier Reconfigure */ + ADRV904X_CPU_OBJID_HAL_RADIO = 0xC0u, /*!< HAL_RADIO */ + ADRV904X_CPU_OBJID_DRV_DUMMY = 0xF0u, /*!< Dummy driver object */ + ADRV904X_CPU_OBJID_DRV_DDCC = 0xF1u, /*!< Dummy driver object */ + + /* System objects */ + ADRV904X_CPU_OBJID_SYSTEM_START = 0xFFu, /*!< Start of System OBJID */ + ADRV904X_CPU_OBJID_SYSTEM_ERROR = 0xFFu, /*!< System error */ + ADRV904X_CPU_OBJID_SYSTEM_END = 0xFFu /*!< End of System OBJID */ + +} adrv904x_CpuObjectId_e; + +typedef uint32_t adrv904x_CpuObjectId_t; + +/* Object Groups */ +typedef enum adrv904x_CpuCalibrationsObjectGroup +{ + ADRV904X_CPU_OBJECT_CONFIG_INIT_CALS = 0u, /*!< Group 0 range 0x00 - 0x1f */ + ADRV904X_CPU_OBJECT_CONFIG_TRACKING_CALS, /*!< Group 1 range 0x20 - 0x3f */ + ADRV904X_CPU_OBJECT_CONFIG_CTRL, /*!< Group 4 range 0x80 - 0x9f */ + ADRV904X_CPU_NUM_OBJECT_GROUPS +} adrv904x_CpuCalibrationsObjectGroup_e; + + +/* Mask to get the Initial cal object ID */ +#define ADRV904X_CPU_INITCAL_OBJECT_ID_MASK (0x1Fu) + +/* Subtract the first tracking cal object ID to convert object ID to array index */ +#define ADRV904X_CPU_TRACKING_CAL_OBJ_TO_IDX(x) ((x) - ADRV904X_CPU_OBJID_TC_START) + +/* Add the first tracking cal object ID to convert array index to object ID */ +#define ADRV904X_CPU_TRACKING_CAL_IDX_TO_OBJ(x) ((x) + ADRV904X_CPU_OBJID_TC_START) + +/* Add the first system status object ID to convert array index to object ID */ +#define ADRV904X_CPU_SYS_STATUS_IDX_TO_OBJ(x) ((x) + ADRV904X_CPU_OBJID_SYSTEM_START) + +/* Convert an init cal object ID to a cal bitmask */ +#define ADRV904X_CPU_INITCAL_OBJID_TO_CAL_MASK(x) (1ull << (x)) + +/* Convert an tracking cal object ID to a cal ID */ +#define ADRV904X_CPU_TRACKING_OBJID_TO_CAL_ID(x) ((x) - ADRV904X_CPU_OBJID_TC_START) + +/* Convert an tracking cal object ID to cal bitmask */ +#define ADRV904X_CPU_TRACKING_OBJID_TO_CAL_MASK(x) (1ull << ((x) - ADRV904X_CPU_OBJID_TC_START)) + +/* Compare an cal object ID to ORX. Adding any new ORX object ID here */ +#define ADRV904X_CPU_OBJID_IS_ORX(x) (((x) == ADRV904X_CPU_OBJID_IC_ADC_ORX) || ((x) == ADRV904X_CPU_OBJID_TC_ORX_ADC)) + +#endif /* __ADRV904X_CPU_OBJECT_IDS_TYPES_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_scratch_registers.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_scratch_registers.h new file mode 100644 index 00000000000..04d888e6667 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_scratch_registers.h @@ -0,0 +1,841 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2023 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adrv904x_cpu_scratch_registers.h + * + * \brief Contains CPU scratch register definitions + * + * \details Contains CPU scratch register definitions + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_CPU_SCRATCH_REGISTERS_H__ +#define __ADRV904X_CPU_SCRATCH_REGISTERS_H__ + +/* Scratch register 0 contains CPU0 boot status */ +#define ADRV904X_CPU_CPU0_BOOT_STATUS_SCRATCH_REG_ID 0 + +/* Scratch register 1 contains CPU1 boot status */ +#define ADRV904X_CPU_CPU1_BOOT_STATUS_SCRATCH_REG_ID 1 + +/* Scratch register 6 contains Stream/API Tx to ORx Mapping byte */ +#define ADRV904X_CPU_TX_ORX_MAPPING_SET_SCRATCH_REG_ID 6 + +/* Scratch register 7 contains config needed by ORX High Stream for JESD Link Sharing */ +#define ADRV904X_CPU_ORX_LINK_SHARING_SCRATCH_REG_ID 7 + +/* Scratch register 8 contains config needed by RX0-3 High Streams for JESD Link Sharing */ +#define ADRV904X_CPU_TX_RX03_MAPPING_SET_SCRATCH_REG_ID 8 + +/* Scratch register 9 contains config needed by RX4-7 High Streams for JESD Link Sharing */ +#define ADRV904X_CPU_TX_RX47_MAPPING_SET_SCRATCH_REG_ID 9 + +/* Software Breakpoint scratchpad register assignments */ +#define ADRV904X_CPU_CPU0_SWBKPT_INDEX_SCRATCH_REG_ID 10 +#define ADRV904X_CPU_CPU0_SWBKPT_BKPT_NUM_SCRATCH_REG_ID 11 +#define ADRV904X_CPU_CPU0_SWBKPT_CHAN_NUM_SCRATCH_REG_ID 12 +#define ADRV904X_CPU_CPU1_SWBKPT_INDEX_SCRATCH_REG_ID 13 +#define ADRV904X_CPU_CPU1_SWBKPT_BKPT_NUM_SCRATCH_REG_ID 14 +#define ADRV904X_CPU_CPU1_SWBKPT_CHAN_NUM_SCRATCH_REG_ID 15 + +/* CPU Primary/Secondary boot sequencing registers */ +#define ADRV904X_CPU_CPU0_IS_PRIMARY 16 +#define ADRV904X_CPU_CPU1_IS_PRIMARY 17 +#define ADRV904X_CPU_SECONDARY_BOOT_RELEASE 18 + +/* Scratch registers 19-35 contain Stream/API Tx to ORx Mapping look up table */ +/* NOTE: In DFE (RS) mode this table is used to only store GPIO pin values for ORX0 */ +#define ADRV904X_CPU_TX_ORX_MAPPING_00 19 +#define ADRV904X_CPU_TX_ORX_MAPPING_01 20 +#define ADRV904X_CPU_TX_ORX_MAPPING_02 21 +#define ADRV904X_CPU_TX_ORX_MAPPING_03 22 +#define ADRV904X_CPU_TX_ORX_MAPPING_04 23 +#define ADRV904X_CPU_TX_ORX_MAPPING_05 24 +#define ADRV904X_CPU_TX_ORX_MAPPING_06 25 +#define ADRV904X_CPU_TX_ORX_MAPPING_07 26 +#define ADRV904X_CPU_TX_ORX_MAPPING_08 27 +#define ADRV904X_CPU_TX_ORX_MAPPING_09 28 +#define ADRV904X_CPU_TX_ORX_MAPPING_10 29 +#define ADRV904X_CPU_TX_ORX_MAPPING_11 30 +#define ADRV904X_CPU_TX_ORX_MAPPING_12 31 +#define ADRV904X_CPU_TX_ORX_MAPPING_13 32 +#define ADRV904X_CPU_TX_ORX_MAPPING_14 33 +#define ADRV904X_CPU_TX_ORX_MAPPING_15 34 + +/* Scratch registers to hold temporary Tx to ORx NCO and atten values */ +#define ADRV904X_CPU_TEMP0 35 /* Tx channel (0 - 7) */ +#define ADRV904X_CPU_TEMP1 36 /* LSB of ORx ADC NCO or LOL NCO frequency or ORx atten */ +#define ADRV904X_CPU_TEMP2 37 /* ISB of ORx ADC NCO or LOL NCO frequency or ORx atten */ +#define ADRV904X_CPU_TEMP3 38 /* MSB of ORx ADC NCO or LOL NCO frequency */ +#define ADRV904X_CPU_TEMP4 39 /* LSB of ORx DP NCO or LOL NCO frequency */ +#define ADRV904X_CPU_TEMP5 40 /* ISB of ORx DP NCO or LOL NCO frequency */ +#define ADRV904X_CPU_TEMP6 41 /* MSB of ORx DP NCO or LOL NCO frequency */ + +/* + * Table to hold ADC and DP NCO values for all supported mappings + */ +/* Scratch registers to hold ADC/DP NCO values for mapping=0x00 (Tx0-to-ORx) */ +#define ADRV904X_CPU_TX_0_ORX_NCO_ADC_FREQ_LSB 42 +#define ADRV904X_CPU_TX_0_ORX_NCO_ADC_FREQ_ISB 43 +#define ADRV904X_CPU_TX_0_ORX_NCO_ADC_FREQ_MSB 44 +#define ADRV904X_CPU_TX_0_ORX_NCO_DP_FREQ_LSB 45 +#define ADRV904X_CPU_TX_0_ORX_NCO_DP_FREQ_ISB 46 +#define ADRV904X_CPU_TX_0_ORX_NCO_DP_FREQ_MSB 47 +/* Scratch registers to hold ADC/DP NCO values for mapping=0x01 (Tx1-to-ORx) */ +#define ADRV904X_CPU_TX_1_ORX_NCO_ADC_FREQ_LSB 48 +#define ADRV904X_CPU_TX_1_ORX_NCO_ADC_FREQ_ISB 49 +#define ADRV904X_CPU_TX_1_ORX_NCO_ADC_FREQ_MSB 50 +#define ADRV904X_CPU_TX_1_ORX_NCO_DP_FREQ_LSB 51 +#define ADRV904X_CPU_TX_1_ORX_NCO_DP_FREQ_ISB 52 +#define ADRV904X_CPU_TX_1_ORX_NCO_DP_FREQ_MSB 53 +/* Scratch registers to hold ADC/DP NCO values for mapping=0x02 (Tx2-to-ORx) */ +#define ADRV904X_CPU_TX_2_ORX_NCO_ADC_FREQ_LSB 54 +#define ADRV904X_CPU_TX_2_ORX_NCO_ADC_FREQ_ISB 55 +#define ADRV904X_CPU_TX_2_ORX_NCO_ADC_FREQ_MSB 56 +#define ADRV904X_CPU_TX_2_ORX_NCO_DP_FREQ_LSB 57 +#define ADRV904X_CPU_TX_2_ORX_NCO_DP_FREQ_ISB 58 +#define ADRV904X_CPU_TX_2_ORX_NCO_DP_FREQ_MSB 59 +/* Scratch registers to hold ADC/DP NCO values for mapping=0x03 (Tx3-to-ORx) */ +#define ADRV904X_CPU_TX_3_ORX_NCO_ADC_FREQ_LSB 60 +#define ADRV904X_CPU_TX_3_ORX_NCO_ADC_FREQ_ISB 61 +#define ADRV904X_CPU_TX_3_ORX_NCO_ADC_FREQ_MSB 62 +#define ADRV904X_CPU_TX_3_ORX_NCO_DP_FREQ_LSB 63 +#define ADRV904X_CPU_TX_3_ORX_NCO_DP_FREQ_ISB 64 +#define ADRV904X_CPU_TX_3_ORX_NCO_DP_FREQ_MSB 65 +/* Scratch registers to hold ADC/DP NCO values for mapping=0x04 (Tx4-to-ORx) */ +#define ADRV904X_CPU_TX_4_ORX_NCO_ADC_FREQ_LSB 66 +#define ADRV904X_CPU_TX_4_ORX_NCO_ADC_FREQ_ISB 67 +#define ADRV904X_CPU_TX_4_ORX_NCO_ADC_FREQ_MSB 68 +#define ADRV904X_CPU_TX_4_ORX_NCO_DP_FREQ_LSB 69 +#define ADRV904X_CPU_TX_4_ORX_NCO_DP_FREQ_ISB 70 +#define ADRV904X_CPU_TX_4_ORX_NCO_DP_FREQ_MSB 71 +/* Scratch registers to hold ADC/DP NCO values for mapping=0x05 (Tx5-to-ORx) */ +#define ADRV904X_CPU_TX_5_ORX_NCO_ADC_FREQ_LSB 72 +#define ADRV904X_CPU_TX_5_ORX_NCO_ADC_FREQ_ISB 73 +#define ADRV904X_CPU_TX_5_ORX_NCO_ADC_FREQ_MSB 74 +#define ADRV904X_CPU_TX_5_ORX_NCO_DP_FREQ_LSB 75 +#define ADRV904X_CPU_TX_5_ORX_NCO_DP_FREQ_ISB 76 +#define ADRV904X_CPU_TX_5_ORX_NCO_DP_FREQ_MSB 77 +/* Scratch registers to hold ADC/DP NCO values for mapping=0x06 (Tx6-to-ORx) */ +#define ADRV904X_CPU_TX_6_ORX_NCO_ADC_FREQ_LSB 78 +#define ADRV904X_CPU_TX_6_ORX_NCO_ADC_FREQ_ISB 79 +#define ADRV904X_CPU_TX_6_ORX_NCO_ADC_FREQ_MSB 80 +#define ADRV904X_CPU_TX_6_ORX_NCO_DP_FREQ_LSB 81 +#define ADRV904X_CPU_TX_6_ORX_NCO_DP_FREQ_ISB 82 +#define ADRV904X_CPU_TX_6_ORX_NCO_DP_FREQ_MSB 83 +/* Scratch registers to hold ADC/DP NCO values for mapping=0x07 (Tx7-to-ORx) */ +#define ADRV904X_CPU_TX_7_ORX_NCO_ADC_FREQ_LSB 84 +#define ADRV904X_CPU_TX_7_ORX_NCO_ADC_FREQ_ISB 85 +#define ADRV904X_CPU_TX_7_ORX_NCO_ADC_FREQ_MSB 86 +#define ADRV904X_CPU_TX_7_ORX_NCO_DP_FREQ_LSB 87 +#define ADRV904X_CPU_TX_7_ORX_NCO_DP_FREQ_ISB 88 +#define ADRV904X_CPU_TX_7_ORX_NCO_DP_FREQ_MSB 89 +/* Scratch registers to hold ADC/DP NCO values for mapping=0x08 */ +#define ADRV904X_CPU_MAPVAL_8_NCO_ADC_FREQ_LSB 90 +#define ADRV904X_CPU_MAPVAL_8_NCO_ADC_FREQ_ISB 91 +#define ADRV904X_CPU_MAPVAL_8_NCO_ADC_FREQ_MSB 92 +#define ADRV904X_CPU_MAPVAL_8_NCO_DP_FREQ_LSB 93 +#define ADRV904X_CPU_MAPVAL_8_NCO_DP_FREQ_ISB 94 +#define ADRV904X_CPU_MAPVAL_8_NCO_DP_FREQ_MSB 95 +/* Scratch registers to hold ADC/DP NCO values for mapping=0x09 */ +#define ADRV904X_CPU_MAPVAL_9_NCO_ADC_FREQ_LSB 96 +#define ADRV904X_CPU_MAPVAL_9_NCO_ADC_FREQ_ISB 97 +#define ADRV904X_CPU_MAPVAL_9_NCO_ADC_FREQ_MSB 98 +#define ADRV904X_CPU_MAPVAL_9_NCO_DP_FREQ_LSB 99 +#define ADRV904X_CPU_MAPVAL_9_NCO_DP_FREQ_ISB 100 +#define ADRV904X_CPU_MAPVAL_9_NCO_DP_FREQ_MSB 101 +/* Scratch registers to hold ADC/DP NCO values for mapping=0x0A */ +#define ADRV904X_CPU_MAPVAL_A_NCO_ADC_FREQ_LSB 102 +#define ADRV904X_CPU_MAPVAL_A_NCO_ADC_FREQ_ISB 103 +#define ADRV904X_CPU_MAPVAL_A_NCO_ADC_FREQ_MSB 104 +#define ADRV904X_CPU_MAPVAL_A_NCO_DP_FREQ_LSB 105 +#define ADRV904X_CPU_MAPVAL_A_NCO_DP_FREQ_ISB 106 +#define ADRV904X_CPU_MAPVAL_A_NCO_DP_FREQ_MSB 107 +/* Scratch registers to hold ADC/DP NCO values for mapping=0x0B */ +#define ADRV904X_CPU_MAPVAL_B_NCO_ADC_FREQ_LSB 108 +#define ADRV904X_CPU_MAPVAL_B_NCO_ADC_FREQ_ISB 109 +#define ADRV904X_CPU_MAPVAL_B_NCO_ADC_FREQ_MSB 110 +#define ADRV904X_CPU_MAPVAL_B_NCO_DP_FREQ_LSB 111 +#define ADRV904X_CPU_MAPVAL_B_NCO_DP_FREQ_ISB 112 +#define ADRV904X_CPU_MAPVAL_B_NCO_DP_FREQ_MSB 113 +/* Scratch registers to hold ADC/DP NCO values for mapping=0x0C */ +#define ADRV904X_CPU_MAPVAL_C_NCO_ADC_FREQ_LSB 114 +#define ADRV904X_CPU_MAPVAL_C_NCO_ADC_FREQ_ISB 115 +#define ADRV904X_CPU_MAPVAL_C_NCO_ADC_FREQ_MSB 116 +#define ADRV904X_CPU_MAPVAL_C_NCO_DP_FREQ_LSB 117 +#define ADRV904X_CPU_MAPVAL_C_NCO_DP_FREQ_ISB 118 +#define ADRV904X_CPU_MAPVAL_C_NCO_DP_FREQ_MSB 119 +/* Scratch registers to hold ADC/DP NCO values for mapping=0x0D */ +#define ADRV904X_CPU_MAPVAL_D_NCO_ADC_FREQ_LSB 120 +#define ADRV904X_CPU_MAPVAL_D_NCO_ADC_FREQ_ISB 121 +#define ADRV904X_CPU_MAPVAL_D_NCO_ADC_FREQ_MSB 122 +#define ADRV904X_CPU_MAPVAL_D_NCO_DP_FREQ_LSB 123 +#define ADRV904X_CPU_MAPVAL_D_NCO_DP_FREQ_ISB 124 +#define ADRV904X_CPU_MAPVAL_D_NCO_DP_FREQ_MSB 125 +/* Scratch registers to hold ADC/DP NCO values for mapping=0x0E */ +#define ADRV904X_CPU_MAPVAL_E_NCO_ADC_FREQ_LSB 126 +#define ADRV904X_CPU_MAPVAL_E_NCO_ADC_FREQ_ISB 127 +#define ADRV904X_CPU_MAPVAL_E_NCO_ADC_FREQ_MSB 128 +#define ADRV904X_CPU_MAPVAL_E_NCO_DP_FREQ_LSB 129 +#define ADRV904X_CPU_MAPVAL_E_NCO_DP_FREQ_ISB 130 +#define ADRV904X_CPU_MAPVAL_E_NCO_DP_FREQ_MSB 131 +/* Scratch registers to hold ADC/DP NCO values for mapping=0x0F */ +#define ADRV904X_CPU_MAPVAL_F_NCO_ADC_FREQ_LSB 132 +#define ADRV904X_CPU_MAPVAL_F_NCO_ADC_FREQ_ISB 133 +#define ADRV904X_CPU_MAPVAL_F_NCO_ADC_FREQ_MSB 134 +#define ADRV904X_CPU_MAPVAL_F_NCO_DP_FREQ_LSB 135 +#define ADRV904X_CPU_MAPVAL_F_NCO_DP_FREQ_ISB 136 +#define ADRV904X_CPU_MAPVAL_F_NCO_DP_FREQ_MSB 137 + +/* + * Table to hold attenuation values for all supported mappings + */ +/* Scratch registers to hold attenuation value for mapping=0x00 (Tx0-to-ORx) */ +#define ADRV904X_CPU_TX_0_ORX_ATTEN 138 +#define ADRV904X_CPU_TX_0_ORX_ATTEN_CTRL 139 +/* Scratch registers to hold attenuation value for mapping=0x01 (Tx1-to-ORx) */ +#define ADRV904X_CPU_TX_1_ORX_ATTEN 140 +#define ADRV904X_CPU_TX_1_ORX_ATTEN_CTRL 141 +/* Scratch registers to hold attenuation value for mapping=0x02 (Tx2-to-ORx) */ +#define ADRV904X_CPU_TX_2_ORX_ATTEN 142 +#define ADRV904X_CPU_TX_2_ORX_ATTEN_CTRL 143 +/* Scratch registers to hold attenuation value for mapping=0x03 (Tx3-to-ORx) */ +#define ADRV904X_CPU_TX_3_ORX_ATTEN 144 +#define ADRV904X_CPU_TX_3_ORX_ATTEN_CTRL 145 +/* Scratch registers to hold attenuation value for mapping=0x04 (Tx4-to-ORx) */ +#define ADRV904X_CPU_TX_4_ORX_ATTEN 146 +#define ADRV904X_CPU_TX_4_ORX_ATTEN_CTRL 147 +/* Scratch registers to hold attenuation value for mapping=0x05 (Tx5-to-ORx) */ +#define ADRV904X_CPU_TX_5_ORX_ATTEN 148 +#define ADRV904X_CPU_TX_5_ORX_ATTEN_CTRL 149 +/* Scratch registers to hold attenuation value for mapping=0x06 (Tx6-to-ORx) */ +#define ADRV904X_CPU_TX_6_ORX_ATTEN 150 +#define ADRV904X_CPU_TX_6_ORX_ATTEN_CTRL 151 +/* Scratch registers to hold attenuation value for mapping=0x07 (Tx7-to-ORx) */ +#define ADRV904X_CPU_TX_7_ORX_ATTEN 152 +#define ADRV904X_CPU_TX_7_ORX_ATTEN_CTRL 153 +/* Scratch registers to hold attenuation value for mapping=0x08 */ +#define ADRV904X_CPU_MAPVAL_8_ATTEN 154 +#define ADRV904X_CPU_MAPVAL_8_ATTEN_CTRL 155 +/* Scratch registers to hold attenuation value for mapping=0x09 */ +#define ADRV904X_CPU_MAPVAL_9_ATTEN 156 +#define ADRV904X_CPU_MAPVAL_9_ATTEN_CTRL 157 +/* Scratch registers to hold attenuation value for mapping=0x0A */ +#define ADRV904X_CPU_MAPVAL_A_ATTEN 158 +#define ADRV904X_CPU_MAPVAL_A_ATTEN_CTRL 159 +/* Scratch registers to hold attenuation value for mapping=0x0B */ +#define ADRV904X_CPU_MAPVAL_B_ATTEN 160 +#define ADRV904X_CPU_MAPVAL_B_ATTEN_CTRL 161 +/* Scratch registers to hold attenuation value for mapping=0x0C */ +#define ADRV904X_CPU_MAPVAL_C_ATTEN 162 +#define ADRV904X_CPU_MAPVAL_C_ATTEN_CTRL 163 +/* Scratch registers to hold attenuation value for mapping=0x0D */ +#define ADRV904X_CPU_MAPVAL_D_ATTEN 164 +#define ADRV904X_CPU_MAPVAL_D_ATTEN_CTRL 165 +/* Scratch registers to hold attenuation value for mapping=0x0E */ +#define ADRV904X_CPU_MAPVAL_E_ATTEN 166 +#define ADRV904X_CPU_MAPVAL_E_ATTEN_CTRL 167 +/* Scratch registers to hold attenuation value for mapping=0x0F */ +#define ADRV904X_CPU_MAPVAL_F_ATTEN 168 +#define ADRV904X_CPU_MAPVAL_F_ATTEN_CTRL 169 + +/* + * Table to hold LOL NCO values for all supported mappings + */ +/* Scratch registers to hold LOL NCO values for mapping=0x00 (Tx0-to-ORx) */ +#define ADRV904X_CPU_TX_0_ORX_NCO_LOL_FREQ_LSB 170 +#define ADRV904X_CPU_TX_0_ORX_NCO_LOL_FREQ_ISB 171 +#define ADRV904X_CPU_TX_0_ORX_NCO_LOL_FREQ_MSB 172 +/* Scratch registers to hold LOL NCO values for mapping=0x01 (Tx1-to-ORx) */ +#define ADRV904X_CPU_TX_1_ORX_NCO_LOL_FREQ_LSB 173 +#define ADRV904X_CPU_TX_1_ORX_NCO_LOL_FREQ_ISB 174 +#define ADRV904X_CPU_TX_1_ORX_NCO_LOL_FREQ_MSB 175 +/* Scratch registers to hold LOL NCO values for mapping=0x02 (Tx2-to-ORx) */ +#define ADRV904X_CPU_TX_2_ORX_NCO_LOL_FREQ_LSB 176 +#define ADRV904X_CPU_TX_2_ORX_NCO_LOL_FREQ_ISB 177 +#define ADRV904X_CPU_TX_2_ORX_NCO_LOL_FREQ_MSB 178 +/* Scratch registers to hold LOL NCO values for mapping=0x03 (Tx3-to-ORx) */ +#define ADRV904X_CPU_TX_3_ORX_NCO_LOL_FREQ_LSB 179 +#define ADRV904X_CPU_TX_3_ORX_NCO_LOL_FREQ_ISB 180 +#define ADRV904X_CPU_TX_3_ORX_NCO_LOL_FREQ_MSB 181 +/* Scratch registers to hold LOL NCO values for mapping=0x04 (Tx4-to-ORx) */ +#define ADRV904X_CPU_TX_4_ORX_NCO_LOL_FREQ_LSB 182 +#define ADRV904X_CPU_TX_4_ORX_NCO_LOL_FREQ_ISB 183 +#define ADRV904X_CPU_TX_4_ORX_NCO_LOL_FREQ_MSB 184 +/* Scratch registers to hold LOL NCO values for mapping=0x05 (Tx5-to-ORx) */ +#define ADRV904X_CPU_TX_5_ORX_NCO_LOL_FREQ_LSB 185 +#define ADRV904X_CPU_TX_5_ORX_NCO_LOL_FREQ_ISB 186 +#define ADRV904X_CPU_TX_5_ORX_NCO_LOL_FREQ_MSB 187 +/* Scratch registers to hold LOL NCO values for mapping=0x06 (Tx6-to-ORx) */ +#define ADRV904X_CPU_TX_6_ORX_NCO_LOL_FREQ_LSB 188 +#define ADRV904X_CPU_TX_6_ORX_NCO_LOL_FREQ_ISB 189 +#define ADRV904X_CPU_TX_6_ORX_NCO_LOL_FREQ_MSB 190 +/* Scratch registers to hold LOL NCO values for mapping=0x07 (Tx7-to-ORx) */ +#define ADRV904X_CPU_TX_7_ORX_NCO_LOL_FREQ_LSB 191 +#define ADRV904X_CPU_TX_7_ORX_NCO_LOL_FREQ_ISB 192 +#define ADRV904X_CPU_TX_7_ORX_NCO_LOL_FREQ_MSB 193 + +/* Scratch register used to store ORX_TX_AUTO_SWITCH_MODE information */ +#define ADRV904X_CPU_ORX_TX_AUTO_SWITCH_MODE 194 + + +/* Scratch register to enable/disable the TxLB ADC DAC - channelMask (see TPGSWE-2397) */ +#define ADRV904X_CPU_TXLB_DAC_ENABLE 195 + +/* Software Breakpoint GPIO scratchpad register assignments */ +#define ADRV904X_CPU_SWBKPT_WAKEUP_GPIO_PIN_REG_ID 196 + +/* Scratch register to enable/disable the Tx Anttena Cal - channelMask */ +#define ADRV904X_GPIO_ANTCAL_TX_MASK 198 + +/* Scratch register to enable/disable the Rx Anttena Cal - channelMask */ +#define ADRV904X_GPIO_ANTCAL_RX_MASK 199 + +/* Scratch register containing slice stream processor stream number to trigger */ +#define ADRV904X_TRIGGER_SLICE_STREAM_NUM 204 + +/* Scratch register containing channel mask of which slice stream processors to trigger stream in */ +#define ADRV904X_TRIGGER_SLICE_STREAM_MASK 205 + +/* Scratch register that holds TRx channels for gpio 0 */ +#define ADRV904X_TRIGGER_SLICE_GPIO_0_TRX_CHANNELS 212 + +/* Scratch register that holds TRx channels for gpio 1 */ +#define ADRV904X_TRIGGER_SLICE_GPIO_1_TRX_CHANNELS 213 + +/* Scratch register that holds TRx channels for gpio 2 */ +#define ADRV904X_TRIGGER_SLICE_GPIO_2_TRX_CHANNELS 214 + +/* Scratch register that holds TRx channels for gpio 3 */ +#define ADRV904X_TRIGGER_SLICE_GPIO_3_TRX_CHANNELS 215 + +/* Scratch register that holds if channels affect are from Rx or Tx */ +#define ADRV904X_TRIGGER_SLICE_TR_OR_RX_CHANNELS 216 + +/* Scratch register that holds the last state of TX0. TX0 high = 0x04, TX0 low = 0x00 */ +#define ADRV904X_TX0_STATE 217 + +/* Scratch register that holds the Current Value of 'Symbol Ignore Count' for BUF0 */ +#define ADRV904X_SBET_CUR_SYMBOL_IGNORE_COUNT_BUF0 218 + +/* Scratch register that holds the Requested Value of 'Symbol Ignore Count' for BUF0 */ +#define ADRV904X_SBET_REQ_SYMBOL_IGNORE_COUNT_BUF0 219 + +/* Scratch register that holds the Current Value of 'Symbol Ignore Count' for BUF1 */ +#define ADRV904X_SBET_CUR_SYMBOL_IGNORE_COUNT_BUF1 220 + +/* Scratch register that holds the Requested Value of 'Symbol Ignore Count' for BUF1 */ +#define ADRV904X_SBET_REQ_SYMBOL_IGNORE_COUNT_BUF1 221 + +/* Note: The registers 225-233 are currently used as SBET debug counters. They can be re-purposed if needed. + * All the code in core SP starting with tag $ENABLE_SBET_DBG$ needs to be removed + */ +/* Scratch register that holds counter registering how many times SBET_CHECK_DPD_MODEL_IDX_MATCHES_TARGET was called */ +#define ADRV904X_DBG_SBET_CHECK_DPD_MODEL_IDX_MATCHES_TARGET_INVOKE_CNT 225 + +/* Scratch register that holds counter registering how many times SBET_CAP_CHECK_AND_UPDATE_IGNORE_COUNT was called */ +#define ADRV904X_DBG_SBET_CAP_CHECK_AND_UPDATE_IGNORE_COUNT_INVOKE_CNT 226 + +/* Scratch register that holds counter registering how many times SBET_CAPTURE_BUF0_SW_TRIGGER_TOGGLE was called */ +#define ADRV904X_DBG_SBET_CAPTURE_BUF0_SW_TRIGGER_TOGGLE_INVOKE_CNT 227 + +/* Scratch register that holds counter registering how many times SBET_CAPTURE_BUF1_SW_TRIGGER_TOGGLE was called */ +#define ADRV904X_DBG_SBET_CAPTURE_BUF1_SW_TRIGGER_TOGGLE_INVOKE_CNT 228 + +/* Scratch register that holds counter registering how many times SBET_CLEAR_CAP_REQUEST_FOR_BUF0 was called */ +#define ADRV904X_DBG_SBET_CLEAR_CAP_REQUEST_FOR_BUF0_INVOKE_CNT 230 + +/* Scratch register that holds counter registering how many times SBET_CLEAR_CAP_REQUEST_FOR_BUF1 was called */ +#define ADRV904X_DBG_SBET_CLEAR_CAP_REQUEST_FOR_BUF1_INVOKE_CNT 231 + +/* Scratch register that holds counter registering how many times CAPTURE_BUF0_SW_TRIGGER_TOGGLE was called */ +#define ADRV904X_DBG_CAPTURE_BUF0_SW_TRIGGER_TOGGLE_INVOKE_CNT 232 + +/* Scratch register that holds counter registering how many times CAPTURE_BUF1_SW_TRIGGER_TOGGLE was called */ +#define ADRV904X_DBG_CAPTURE_BUF1_SW_TRIGGER_TOGGLE_INVOKE_CNT 233 + + +/* Scratch register 256 contains DFE CPU0 boot status */ +#define ADRV904X_DFE_BOOT_STATUS_SCRATCH_REG_ID 256 + +/* Scratch register to contains DFE SDK global variable address */ +#define ADRV904X_DFE_SDK_DATA_ADDR_0_SCRATCH_REG_ID 257 /* address[7:0] */ +#define ADRV904X_DFE_SDK_DATA_ADDR_1_SCRATCH_REG_ID 258 /* address[15:8] */ +#define ADRV904X_DFE_SDK_DATA_ADDR_2_SCRATCH_REG_ID 259 /* address[23:16] */ +#define ADRV904X_DFE_SDK_DATA_ADDR_3_SCRATCH_REG_ID 260 /* address[31:24] */ + +/* Scratch register containing DFE DMA request error flag. This register is used by Koror core + * stream to indicate an error when a new DMA transaction is requested but the previous one + * is not completed + */ +#define ADRV904X_DFE_DMA_REQUEST_ERROR 261 + +/* Scratch register containing the VSWR direction FWD/REV */ +#define ADRV904X_DFE_VSWR_DIRECTION_SCRATCH_REG_ID 262 + +/* + * Scratch registers used to store the value of gpio_from_master_set/gpio_from_master_clear + * which are set by core stream when configuring the Tx-to-Orx0 mapping + */ +#define ADRV904X_ORX0_GPIO_FROM_MASTER_SET_0_7 263 /* for ORx0, gpio_from_master_set[7:0] */ +#define ADRV904X_ORX0_GPIO_FROM_MASTER_SET_15_8 264 /* for ORx0, gpio_from_master_set[15:8] */ +#define ADRV904X_ORX0_GPIO_FROM_MASTER_SET_23_16 265 /* for ORx0, gpio_from_master_set[23:16] */ +#define ADRV904X_ORX0_GPIO_FROM_MASTER_CLEAR_0_7 266 /* for ORx0, gpio_from_master_clear[7:0] */ +#define ADRV904X_ORX0_GPIO_FROM_MASTER_CLEAR_15_8 267 /* for ORx0, gpio_from_master_clear[15:8] */ +#define ADRV904X_ORX0_GPIO_FROM_MASTER_CLEAR_23_16 268 /* for ORx0, gpio_from_master_clear[23:16] */ + +/* + * Scratch registers used to store the value of gpio_from_master_set/gpio_from_master_clear + * which are set by core stream when configuring the Tx-to-Orx1 mapping + */ +#define ADRV904X_ORX1_GPIO_FROM_MASTER_SET_0_7 269 /* for ORx1, gpio_from_master_set[7:0] */ +#define ADRV904X_ORX1_GPIO_FROM_MASTER_SET_15_8 270 /* for ORx1, gpio_from_master_set[15:8] */ +#define ADRV904X_ORX1_GPIO_FROM_MASTER_SET_23_16 271 /* for ORx1, gpio_from_master_set[23:16] */ +#define ADRV904X_ORX1_GPIO_FROM_MASTER_CLEAR_0_7 272 /* for ORx1, gpio_from_master_clear[7:0] */ +#define ADRV904X_ORX1_GPIO_FROM_MASTER_CLEAR_15_8 273 /* for ORx1, gpio_from_master_clear[15:8] */ +#define ADRV904X_ORX1_GPIO_FROM_MASTER_CLEAR_23_16 274 /* for ORx1, gpio_from_master_clear[23:16] */ + +/* Scratch registers to contain the ORx to Tx mapping channel number to channel mask look-up table */ +#define ADRV904X_CHAN_NUM_TO_MASK_0 275 /* 0x1 */ +#define ADRV904X_CHAN_NUM_TO_MASK_1 276 /* 0x2 */ +#define ADRV904X_CHAN_NUM_TO_MASK_2 277 /* 0x4 */ +#define ADRV904X_CHAN_NUM_TO_MASK_3 278 /* 0x8 */ + +/* Scratch registers containing flags indicating first TX to ORX mapping transition for ORX0 and 1 */ +#define ADRV904X_FIRST_ORX0_MAP_TRANS_FLAG 279 +#define ADRV904X_FIRST_ORX1_MAP_TRANS_FLAG 280 + +/* @todo: Investigation needed why writing to scratch registers 281-288 is causing Tx QEC calibration to fail + * and the written value is modified by 0x0E mask */ + +/* Scratch registers to store info about External Alarm types */ +#define ADRV904X_EA_TYPE_TBL_ALARM_0 281 +#define ADRV904X_EA_TYPE_TBL_ALARM_1 282 +#define ADRV904X_EA_TYPE_TBL_ALARM_2 283 +#define ADRV904X_EA_TYPE_TBL_ALARM_3 284 +#define ADRV904X_EA_TYPE_TBL_ALARM_4 285 +#define ADRV904X_EA_TYPE_TBL_ALARM_5 286 +#define ADRV904X_EA_TYPE_TBL_ALARM_6 287 +#define ADRV904X_EA_TYPE_TBL_ALARM_7 288 +#define ADRV904X_EA_TYPE_TBL_ALARM_8 289 +#define ADRV904X_EA_TYPE_TBL_ALARM_9 290 + +/* Scratch registers to store info about which AUX_GRP1 outputs are impacted by a given External Alarm */ +#define ADRV904X_EA_CURR_AFCTD_AUX_GRP1_TBL_ALARM_0 291 +#define ADRV904X_EA_CURR_AFCTD_AUX_GRP1_TBL_ALARM_1 292 +#define ADRV904X_EA_CURR_AFCTD_AUX_GRP1_TBL_ALARM_2 293 +#define ADRV904X_EA_CURR_AFCTD_AUX_GRP1_TBL_ALARM_3 294 +#define ADRV904X_EA_CURR_AFCTD_AUX_GRP1_TBL_ALARM_4 295 +#define ADRV904X_EA_CURR_AFCTD_AUX_GRP1_TBL_ALARM_5 296 +#define ADRV904X_EA_CURR_AFCTD_AUX_GRP1_TBL_ALARM_6 297 +#define ADRV904X_EA_CURR_AFCTD_AUX_GRP1_TBL_ALARM_7 298 +#define ADRV904X_EA_CURR_AFCTD_AUX_GRP1_TBL_ALARM_8 299 +#define ADRV904X_EA_CURR_AFCTD_AUX_GRP1_TBL_ALARM_9 300 + +/* Scratch registers to store info about which AUX_GRP0 outputs are impacted by a given External Alarm */ +#define ADRV904X_EA_CURR_AFCTD_AUX_GRP0_TBL_ALARM_0 301 +#define ADRV904X_EA_CURR_AFCTD_AUX_GRP0_TBL_ALARM_1 302 +#define ADRV904X_EA_CURR_AFCTD_AUX_GRP0_TBL_ALARM_2 303 +#define ADRV904X_EA_CURR_AFCTD_AUX_GRP0_TBL_ALARM_3 304 +#define ADRV904X_EA_CURR_AFCTD_AUX_GRP0_TBL_ALARM_4 305 +#define ADRV904X_EA_CURR_AFCTD_AUX_GRP0_TBL_ALARM_5 306 +#define ADRV904X_EA_CURR_AFCTD_AUX_GRP0_TBL_ALARM_6 307 +#define ADRV904X_EA_CURR_AFCTD_AUX_GRP0_TBL_ALARM_7 308 +#define ADRV904X_EA_CURR_AFCTD_AUX_GRP0_TBL_ALARM_8 309 +#define ADRV904X_EA_CURR_AFCTD_AUX_GRP0_TBL_ALARM_9 310 + +/* Scratch registers to store info about which LNA_EN outputs are currently affected by an active alarm */ +#define ADRV904X_EA_CURR_AFCTD_LNA_EN_TBL_ALARM_0 311 +#define ADRV904X_EA_CURR_AFCTD_LNA_EN_TBL_ALARM_1 312 +#define ADRV904X_EA_CURR_AFCTD_LNA_EN_TBL_ALARM_2 313 +#define ADRV904X_EA_CURR_AFCTD_LNA_EN_TBL_ALARM_3 314 +#define ADRV904X_EA_CURR_AFCTD_LNA_EN_TBL_ALARM_4 315 +#define ADRV904X_EA_CURR_AFCTD_LNA_EN_TBL_ALARM_5 316 +#define ADRV904X_EA_CURR_AFCTD_LNA_EN_TBL_ALARM_6 317 +#define ADRV904X_EA_CURR_AFCTD_LNA_EN_TBL_ALARM_7 318 +#define ADRV904X_EA_CURR_AFCTD_LNA_EN_TBL_ALARM_8 319 +#define ADRV904X_EA_CURR_AFCTD_LNA_EN_TBL_ALARM_9 320 + +/* Scratch registers to store info about which PA_EN outputs are currently affected by an active alarm */ +#define ADRV904X_EA_CURR_AFCTD_PA_EN_TBL_ALARM_0 321 +#define ADRV904X_EA_CURR_AFCTD_PA_EN_TBL_ALARM_1 322 +#define ADRV904X_EA_CURR_AFCTD_PA_EN_TBL_ALARM_2 323 +#define ADRV904X_EA_CURR_AFCTD_PA_EN_TBL_ALARM_3 324 +#define ADRV904X_EA_CURR_AFCTD_PA_EN_TBL_ALARM_4 325 +#define ADRV904X_EA_CURR_AFCTD_PA_EN_TBL_ALARM_5 326 +#define ADRV904X_EA_CURR_AFCTD_PA_EN_TBL_ALARM_6 327 +#define ADRV904X_EA_CURR_AFCTD_PA_EN_TBL_ALARM_7 328 +#define ADRV904X_EA_CURR_AFCTD_PA_EN_TBL_ALARM_8 329 +#define ADRV904X_EA_CURR_AFCTD_PA_EN_TBL_ALARM_9 330 + +/* Rename to ADRV904X_EA_IMP_OC_FUSE_EN_TBL_ALARM_0 once OCP group added to alarms) */ +/* Scratch registers to store info about which OC_FUSE_EN outputs are currently affected by an active alarm */ +/* Currently not used for OC_FUSE_EN feature */ + +#define ADRV904X_SBET_DPD_TO_CFR_TRANSLATION_TBL_0 331 +#define ADRV904X_SBET_DPD_TO_CFR_TRANSLATION_TBL_1 332 +#define ADRV904X_SBET_DPD_TO_CFR_TRANSLATION_TBL_2 333 +#define ADRV904X_SBET_DPD_TO_CFR_TRANSLATION_TBL_3 334 +#define ADRV904X_SBET_INTERNAL_USE_0 335 +#define ADRV904X_SBET_INTERNAL_USE_1 336 +#define ADRV904X_SBET_INTERNAL_USE_2 337 +#define ADRV904X_SBET_INTERNAL_USE_3 338 + +/* + * Bit 0-1: Target DPD Model Index, Bit 2: SBET Capture Request Active, Bit 3: SBET Capture Delay Set Flag, + * Bit 4: SBET Capture Delay Type, Bit 5-7: TX Channel + */ +#define ADRV904X_SBET_CAP_REQ_FOR_BUF0 339 +#define ADRV904X_SBET_CAP_REQ_FOR_BUF1 340 + +/* DTX fanout to PA_EN table */ +#define ADRV904X_DTX_FANOUT_TO_PA_EN_TBL_TX0 341 +#define ADRV904X_DTX_FANOUT_TO_PA_EN_TBL_TX1 342 +#define ADRV904X_DTX_FANOUT_TO_PA_EN_TBL_TX2 343 +#define ADRV904X_DTX_FANOUT_TO_PA_EN_TBL_TX3 344 +#define ADRV904X_DTX_FANOUT_TO_PA_EN_TBL_TX4 345 +#define ADRV904X_DTX_FANOUT_TO_PA_EN_TBL_TX5 346 +#define ADRV904X_DTX_FANOUT_TO_PA_EN_TBL_TX6 347 +#define ADRV904X_DTX_FANOUT_TO_PA_EN_TBL_TX7 348 + +/* Bitmap of flags indicating a non-zero DTX to PA_EN DTX fanout for all TXes */ +#define ADRV904X_NONZERO_DTX_FANOUT_TO_PA_EN_FOR_TX_BM 349 /* 0 - zero fanout, 1 - non-zero fanout */ + +#define ADRV904X_SBET_CIRCULAR_BUFFER_ENTRY0_TX3_TX0 350 +#define ADRV904X_SBET_CIRCULAR_BUFFER_ENTRY0_TX7_TX4 351 +#define ADRV904X_SBET_CIRCULAR_BUFFER_ENTRY1_TX3_TX0 352 +#define ADRV904X_SBET_CIRCULAR_BUFFER_ENTRY1_TX7_TX4 353 +#define ADRV904X_SBET_CIRCULAR_BUFFER_ENTRY2_TX3_TX0 354 +#define ADRV904X_SBET_CIRCULAR_BUFFER_ENTRY2_TX7_TX4 355 +#define ADRV904X_SBET_CIRCULAR_BUFFER_ENTRY3_TX3_TX0 356 +#define ADRV904X_SBET_CIRCULAR_BUFFER_ENTRY3_TX7_TX4 357 +#define ADRV904X_SBET_CIRCULAR_BUFFER_ENTRY4_TX3_TX0 358 +#define ADRV904X_SBET_CIRCULAR_BUFFER_ENTRY4_TX7_TX4 359 +#define ADRV904X_SBET_CIRCULAR_BUFFER_ENTRY5_TX3_TX0 360 +#define ADRV904X_SBET_CIRCULAR_BUFFER_ENTRY5_TX7_TX4 361 +#define ADRV904X_SBET_CIRCULAR_BUFFER_ENTRY6_TX3_TX0 362 +#define ADRV904X_SBET_CIRCULAR_BUFFER_ENTRY6_TX7_TX4 363 +#define ADRV904X_SBET_CIRCULAR_BUFFER_ENTRY7_TX3_TX0 364 +#define ADRV904X_SBET_CIRCULAR_BUFFER_ENTRY7_TX7_TX4 365 +#define ADRV904X_SBET_CIRCULAR_BUFFER_INDEX 366 + +/* SBET CAP flags: 'Target DPD Model Index' (bit0..1), 'Capture Requested Flag' (bit 2), 'Delay Set Flag' (bit 3), 'Delay Type' (bit 4) for BUF0 */ +#define ADRV904X_SBET_TEMP_CAP_REQ_FOR_BUF0 367 + +/* SBET CAP flags: 'Target DPD Model Index' (bit0..1), 'Capture Requested Flag' (bit 2), 'Delay Set Flag' (bit 3), 'Delay Type' (bit 4) for BUF1 */ +#define ADRV904X_SBET_TEMP_CAP_REQ_FOR_BUF1 368 + +/* SBET DPD Model Index for for all TXes */ +#define ADRV904X_SBET_DPD_MODEL_IDX_LSB 369 /* TX3 TX2 TX1 TX0 */ +#define ADRV904X_SBET_DPD_MODEL_IDX_MSB 370 /* TX7 TX6 TX5 TX4 */ + +/* Scratch register to store info about which outputs have the 'LNA_EN Always ON' feature activated */ +#define ADRV904X_EA_LNA_EN_ALWAYS_ON 371 + +/* Scratch register to store info about which outputs have the 'LNA_EN Always OFF' feature activated */ +#define ADRV904X_EA_LNA_EN_ALWAYS_OFF 372 + +/* Scratch register to store info about which outputs have the 'PA_EN Always ON' feature activated */ +#define ADRV904X_EA_PA_EN_ALWAYS_ON 373 + +/* Scratch register to store info about which outputs have the 'PA_EN Always ON' feature activated */ +#define ADRV904X_EA_PA_EN_ALWAYS_OFF 374 + +/* Scratch register to store info about which PA_EN signals have the DTX output enabled */ +#define ADRV904X_EA_PA_EN_WITH_DTX_OUTPUT 375 /* 0 - PA mode (driven by RS), 1 - DTX mode */ + +/* Scratch register to temporarily store External Alarm ID or LNA_EN/PA_EN bitmaps */ +#define ADRV904X_EA_TMP_ALARM_ID_LNA_PA_BM 376 + +/* Scratch register used by API to store info about which PA_EN signals have the DTX output enabled */ +#define ADRV904X_EA_PA_EN_WITH_DTX_OUTPUT_SHADOW 377 /* 0 - PA mode (driven by RS), 1 - DTX mode */ + +/* Scratch register to support Buffer0 Rx captures which toggles the capture SW trigger - set any bit */ +#define ADRV904X_PENDING_BUF0_RX_CAPTURE_REQUEST 378 + +/* Scratch register to support Buffer1 Rx captures which toggles the capture SW trigger - set any bit */ +#define ADRV904X_PENDING_BUF1_RX_CAPTURE_REQUEST 379 + +/* Scratch register to store info about which AUX_GRP0 outputs are frozen by a debug command */ +#define ADRV904X_EA_AUX_GRP0_OUTPUT_FROZEN 380 + +/* Scratch register to store info about which PA_EN outputs are frozen by a debug command */ +#define ADRV904X_EA_PA_EN_OUTPUT_FROZEN 381 + +/* Scratch register to store info about which LNA_EN outputs are frozen by a debug command */ +#define ADRV904X_EA_LNA_EN_OUTPUT_FROZEN 382 + +/* Scratch register to store info about which AUX_GRP1 outputs are frozen by a debug command */ +#define ADRV904X_EA_AUX_GRP1_OUTPUT_FROZEN 383 + +/* Scratch register used to store Tx-to-Orx mapping pin state information for ORX0 All Off state */ +#define ADRV904X_CPU_TX_ORX_MAPPING_PIN_STATE_ORX0_ALL_OFF 384 + +/* + * Scratch registers used to store the value of gpio_analog_from_master_set/gpio_analog_from_master_clear + * bitfield which are set by core stream when configuring the Tx-to-Orx0 mapping + */ +#define ADRV904X_ORX0_GPIO_ANALOG_FROM_MASTER_SET_0_7 385 /* for ORx0, gpio_analog_from_master_set[7:0] */ +#define ADRV904X_ORX0_GPIO_ANALOG_FROM_MASTER_SET_15_8 386 /* for ORx0, gpio_analog_from_master_set[15:8] */ +#define ADRV904X_ORX0_GPIO_ANALOG_FROM_MASTER_CLEAR_0_7 387 /* for ORx0, gpio_analog_from_master_clear[7:0] */ +#define ADRV904X_ORX0_GPIO_ANALOG_FROM_MASTER_CLEAR_15_8 388 /* for ORx0, gpio_analog_from_master_clear[15:8] */ + +/* + * Scratch registers used to store the value of gpio_analog_from_master_set/gpio_analog_from_master_clear + * bitfield which are set by core stream when configuring the Tx-to-Orx1 mapping + */ +#define ADRV904X_ORX1_GPIO_ANALOG_FROM_MASTER_SET_0_7 389 /* for ORx1, gpio_analog_from_master_set[7:0] */ +#define ADRV904X_ORX1_GPIO_ANALOG_FROM_MASTER_SET_15_8 390 /* for ORx1, gpio_analog_from_master_set[15:8] */ +#define ADRV904X_ORX1_GPIO_ANALOG_FROM_MASTER_CLEAR_0_7 391 /* for ORx1, gpio_analog_from_master_clear[7:0] */ +#define ADRV904X_ORX1_GPIO_ANALOG_FROM_MASTER_CLEAR_15_8 392 /* for ORx1, gpio_analog_from_master_clear[15:8] */ + +/* Scratch registers to store carrierX gain for common channel during antenna cal */ +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH0_CARRIER_GAIN_BYTE_0 393 +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH0_CARRIER_GAIN_BYTE_1 394 +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH0_CARRIER_GAIN_BYTE_2 395 +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH1_CARRIER_GAIN_BYTE_0 396 +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH1_CARRIER_GAIN_BYTE_1 397 +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH1_CARRIER_GAIN_BYTE_2 398 +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH2_CARRIER_GAIN_BYTE_0 399 +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH2_CARRIER_GAIN_BYTE_1 400 +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH2_CARRIER_GAIN_BYTE_2 401 +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH3_CARRIER_GAIN_BYTE_0 402 +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH3_CARRIER_GAIN_BYTE_1 403 +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH3_CARRIER_GAIN_BYTE_2 404 +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH4_CARRIER_GAIN_BYTE_0 405 +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH4_CARRIER_GAIN_BYTE_1 406 +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH4_CARRIER_GAIN_BYTE_2 407 +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH5_CARRIER_GAIN_BYTE_0 408 +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH5_CARRIER_GAIN_BYTE_1 409 +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH5_CARRIER_GAIN_BYTE_2 410 +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH6_CARRIER_GAIN_BYTE_0 411 +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH6_CARRIER_GAIN_BYTE_1 412 +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH6_CARRIER_GAIN_BYTE_2 413 +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH7_CARRIER_GAIN_BYTE_0 414 +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH7_CARRIER_GAIN_BYTE_1 415 +#define ADRV904X_ANTENNA_CAL_STORE_COMMON_CH7_CARRIER_GAIN_BYTE_2 416 + +/* Scratch registers to store carrierX gain for all channels */ +#define ADRV904X_ANTENNA_CAL_STORE_CH0_CARRIER_GAIN_BYTE_0 417 +#define ADRV904X_ANTENNA_CAL_STORE_CH0_CARRIER_GAIN_BYTE_1 418 +#define ADRV904X_ANTENNA_CAL_STORE_CH0_CARRIER_GAIN_BYTE_2 419 +#define ADRV904X_ANTENNA_CAL_STORE_CH1_CARRIER_GAIN_BYTE_0 420 +#define ADRV904X_ANTENNA_CAL_STORE_CH1_CARRIER_GAIN_BYTE_1 421 +#define ADRV904X_ANTENNA_CAL_STORE_CH1_CARRIER_GAIN_BYTE_2 422 +#define ADRV904X_ANTENNA_CAL_STORE_CH2_CARRIER_GAIN_BYTE_0 423 +#define ADRV904X_ANTENNA_CAL_STORE_CH2_CARRIER_GAIN_BYTE_1 424 +#define ADRV904X_ANTENNA_CAL_STORE_CH2_CARRIER_GAIN_BYTE_2 425 +#define ADRV904X_ANTENNA_CAL_STORE_CH3_CARRIER_GAIN_BYTE_0 426 +#define ADRV904X_ANTENNA_CAL_STORE_CH3_CARRIER_GAIN_BYTE_1 427 +#define ADRV904X_ANTENNA_CAL_STORE_CH3_CARRIER_GAIN_BYTE_2 428 +#define ADRV904X_ANTENNA_CAL_STORE_CH4_CARRIER_GAIN_BYTE_0 429 +#define ADRV904X_ANTENNA_CAL_STORE_CH4_CARRIER_GAIN_BYTE_1 430 +#define ADRV904X_ANTENNA_CAL_STORE_CH4_CARRIER_GAIN_BYTE_2 431 +#define ADRV904X_ANTENNA_CAL_STORE_CH5_CARRIER_GAIN_BYTE_0 432 +#define ADRV904X_ANTENNA_CAL_STORE_CH5_CARRIER_GAIN_BYTE_1 433 +#define ADRV904X_ANTENNA_CAL_STORE_CH5_CARRIER_GAIN_BYTE_2 434 +#define ADRV904X_ANTENNA_CAL_STORE_CH6_CARRIER_GAIN_BYTE_0 435 +#define ADRV904X_ANTENNA_CAL_STORE_CH6_CARRIER_GAIN_BYTE_1 436 +#define ADRV904X_ANTENNA_CAL_STORE_CH6_CARRIER_GAIN_BYTE_2 437 +#define ADRV904X_ANTENNA_CAL_STORE_CH7_CARRIER_GAIN_BYTE_0 438 +#define ADRV904X_ANTENNA_CAL_STORE_CH7_CARRIER_GAIN_BYTE_1 439 +#define ADRV904X_ANTENNA_CAL_STORE_CH7_CARRIER_GAIN_BYTE_2 440 + +/* Scratch registers to store pattern addresses for RS0 to switch to during antenna cal */ +#define ADRV904X_ANTENNA_CAL_RS0_PATTERN0_ADDR_LSB 441 /* LSB of default pattern */ +#define ADRV904X_ANTENNA_CAL_RS0_PATTERN0_ADDR_MSB 442 /* MSB of default pattern */ +#define ADRV904X_ANTENNA_CAL_RS0_PATTERN1_ADDR_LSB 443 +#define ADRV904X_ANTENNA_CAL_RS0_PATTERN1_ADDR_MSB 444 + +/* Scratch register to store number of gpio rising edges to switch to next carrier gain */ +#define ADRV904X_ANTENNA_CAL_NUMBER_OF_GPIO_TO_SWITCH_CARRIER 445 + +/* Scratch register to store common Rx channel mask */ +#define ADRV904X_ANTENNA_CAL_COMMON_RX_CHANNEL_MASK 446 + +/* Scratch register to store common Tx channel mask */ +#define ADRV904X_ANTENNA_CAL_COMMON_TX_CHANNEL_MASK 447 + +/* Scratch register to store carrier gain table to be used during antenna cal */ +#define ADRV904X_ANTENNA_CAL_CARRIER_GAIN_TABLE_BYTE_0 448 +#define ADRV904X_ANTENNA_CAL_CARRIER_GAIN_TABLE_BYTE_1 449 +#define ADRV904X_ANTENNA_CAL_CARRIER_GAIN_TABLE_BYTE_2 450 +#define ADRV904X_ANTENNA_CAL_CARRIER_GAIN_TABLE_BYTE_3 451 +#define ADRV904X_ANTENNA_CAL_CARRIER_GAIN_TABLE_BYTE_4 452 +#define ADRV904X_ANTENNA_CAL_CARRIER_GAIN_TABLE_BYTE_5 453 +#define ADRV904X_ANTENNA_CAL_CARRIER_GAIN_TABLE_BYTE_6 454 +#define ADRV904X_ANTENNA_CAL_CARRIER_GAIN_TABLE_BYTE_7 455 + +/* Scratch register to store number of loops for the first pattern during antenna cal */ +#define ADRV904X_ANTENNA_CAL_FIRST_PATTERN_NUMBER_OF_LOOPS 456 + +/* Scratch register to store number of loops for the second pattern during antenna cal */ +#define ADRV904X_ANTENNA_CAL_SECOND_PATTERN_NUMBER_OF_LOOPS 457 + +/* Scratch register to store antenna cal GPIO rising edge counter */ +#define ADRV904X_ANTENNA_CAL_GPIO_RISING_EDGE_COUNTER 458 + +/* Scratch register to store antenna cal carrier gain table index */ +#define ADRV904X_ANTENNA_CAL_CARRIER_GAIN_TABLE_INDEX 459 + +/* In DFE (RS) mode this table is used to store GPIO pin values for ORX1 */ +#define ADRV904X_CPU_TX_ORX1_MAPPING_00 460 +#define ADRV904X_CPU_TX_ORX1_MAPPING_01 461 +#define ADRV904X_CPU_TX_ORX1_MAPPING_02 462 +#define ADRV904X_CPU_TX_ORX1_MAPPING_03 463 +#define ADRV904X_CPU_TX_ORX1_MAPPING_04 464 +#define ADRV904X_CPU_TX_ORX1_MAPPING_05 465 +#define ADRV904X_CPU_TX_ORX1_MAPPING_06 466 +#define ADRV904X_CPU_TX_ORX1_MAPPING_07 467 +#define ADRV904X_CPU_TX_ORX1_MAPPING_08 468 +#define ADRV904X_CPU_TX_ORX1_MAPPING_09 469 +#define ADRV904X_CPU_TX_ORX1_MAPPING_10 470 +#define ADRV904X_CPU_TX_ORX1_MAPPING_11 471 +#define ADRV904X_CPU_TX_ORX1_MAPPING_12 472 +#define ADRV904X_CPU_TX_ORX1_MAPPING_13 473 +#define ADRV904X_CPU_TX_ORX1_MAPPING_14 474 +#define ADRV904X_CPU_TX_ORX1_MAPPING_15 475 + +/* Scratch register used to store Tx-to-Orx mapping pin state information for All Off state */ +#define ADRV904X_CPU_TX_ORX_MAPPING_PIN_STATE_ORX1_ALL_OFF 476 + +/* Scratch register used for A55 to request an Actuator LUT Copy DMA request in TDD mode */ +#define ADRV904X_DFE_ACT_LUT_COPY_TX_REQUEST_TEMP 477 +#define ADRV904X_DFE_ACT_LUT_COPY_TX_REQUEST_LIVE 478 +#define ADRV904X_DFE_ACT_LUT_COPY_TX_DMA_IN_PROGRESS 479 +#define ADRV904X_DFE_ACT_LUT_COPY_TX_DMA_DONE_TEMP 480 + +/* + * Scratch registers used to store channel masks for DTX input pins. + * Koror only, pin used as PA_EN mux update stream trigger. + */ +#define ADRV904X_DTX_INPUT_CHANNEL_MASK_0 481 +#define ADRV904X_DTX_INPUT_CHANNEL_MASK_1 482 +#define ADRV904X_DTX_INPUT_CHANNEL_MASK_2 483 +#define ADRV904X_DTX_INPUT_CHANNEL_MASK_3 484 +#define ADRV904X_DTX_INPUT_CHANNEL_MASK_4 485 +#define ADRV904X_DTX_INPUT_CHANNEL_MASK_5 486 +#define ADRV904X_DTX_INPUT_CHANNEL_MASK_6 487 +#define ADRV904X_DTX_INPUT_CHANNEL_MASK_7 488 + +/* Scratch registers used by 'DTX Event Wait Time' method */ +#define ADRV904X_PA_EN_AFTER_DTX_DEACTIVATED_BM 489 +#define ADRV904X_PA_EN_AFTER_DTX_ACTIVATED_BM 490 +#define ADRV904X_UPDATE_PA_EN_AFTER_DTX_DEACTIVATED_TIMER 491 +#define ADRV904X_UPDATE_PA_EN_AFTER_DTX_ACTIVATED_TIMER 492 + +/* Scratch registers containing Tx channel selection for CLGC_POWER_METERS_RESTART_ORX0/1 streams (RCI mode only)*/ +#define ADRV904X_CLGC_POWER_METER_ORX0_TX_CHANNEL_SEL 493 +#define ADRV904X_CLGC_POWER_METER_ORX1_TX_CHANNEL_SEL 494 + +/* Scratch registers to store pattern addresses for RS1 to switch to during antenna cal */ +#define ADRV904X_ANTENNA_CAL_RS1_PATTERN0_ADDR_LSB 495 /* LSB of default pattern */ +#define ADRV904X_ANTENNA_CAL_RS1_PATTERN0_ADDR_MSB 496 /* MSB of default pattern */ +#define ADRV904X_ANTENNA_CAL_RS1_PATTERN1_ADDR_LSB 497 +#define ADRV904X_ANTENNA_CAL_RS1_PATTERN1_ADDR_MSB 498 + +/* Scratch registers to store pattern id to switch to during antenna cal */ +#define ADRV904X_ANTENNA_CAL_PATTERN_ID_TO_SWITCH_BYTE_0 499 + +/* Scratch register used to store bitmap of 'forced' by API FB_EN outputs (Tx-to-ORx mapping output gpios) so they're not updated by stream */ +#define ADRV904X_FORCED_FB_SW_STATE_BITMAP_ORX0 500 +#define ADRV904X_FORCED_FB_SW_STATE_BITMAP_ORX1 501 + +/* Scratch register to store External Alarm Input Pin Polarity bitmap */ +#define ADRV904X_EA_INPUT_PIN_POLARITY_BM_0 502 +#define ADRV904X_EA_INPUT_PIN_POLARITY_BM_1 503 + +/* Scratch register used to store antenna cal truth table selection. 0=Main path truth table, 1=Secondary path truth table */ +#define ADRV904X_ANTENNA_CAL_GPIO_TRUTH_TABLE_SEL 504 + +/* Scratch register containing slice stream processor stream number to trigger. Used by DFE */ +#define ADRV904X_TRIGGER_SLICE_STREAM_NUM_USED_BY_DFE 505 + +/* Scratch register containing channel mask of which slice stream processors to trigger stream in. Used by DFE */ +#define ADRV904X_TRIGGER_SLICE_STREAM_MASK_USED_BY_DFE 506 + +/* EXTENDED CORE SCRATCH REGISTERS STORED IN M4 HEAP MEMORY - There are 128 words (512 bytes) reserved. */ +/* This section of memory is word accessible and it's read-only for core stream. This is to avoid + * race conditions between M4 ECC scrubbing and core stream write access. BBIC can read/write these scratch registers. + * When BBIC will write these extended scratch registers, M4 ECC scrubbing needs to be disabled with mailbox command to Radio FW. */ +#define ADRV904X_ANTENNA_CAL_TX_CARRIER_0_GAIN 0 /* Extended core scratch registers Word 0 - Bit0-22:Tx Carrier0 gain. Bit23-31:Reserved */ +#define ADRV904X_ANTENNA_CAL_TX_CARRIER_1_GAIN 1 /* Extended core scratch registers Word 1 - Bit0-22:Tx Carrier1 gain. Bit23-31:Reserved */ +#define ADRV904X_ANTENNA_CAL_TX_CARRIER_2_GAIN 2 /* Extended core scratch registers Word 2 - Bit0-22:Tx Carrier2 gain. Bit23-31:Reserved */ +#define ADRV904X_ANTENNA_CAL_TX_CARRIER_3_GAIN 3 /* Extended core scratch registers Word 3 - Bit0-22:Tx Carrier3 gain. Bit23-31:Reserved */ +#define ADRV904X_ANTENNA_CAL_TX_CARRIER_4_GAIN 4 /* Extended core scratch registers Word 4 - Bit0-22:Tx Carrier4 gain. Bit23-31:Reserved */ +#define ADRV904X_ANTENNA_CAL_TX_CARRIER_5_GAIN 5 /* Extended core scratch registers Word 5 - Bit0-22:Tx Carrier5 gain. Bit23-31:Reserved */ +#define ADRV904X_ANTENNA_CAL_TX_CARRIER_6_GAIN 6 /* Extended core scratch registers Word 6 - Bit0-22:Tx Carrier6 gain. Bit23-31:Reserved */ +#define ADRV904X_ANTENNA_CAL_TX_CARRIER_7_GAIN 7 /* Extended core scratch registers Word 7 - Bit0-22:Tx Carrier7 gain. Bit23-31:Reserved */ +#define ADRV904X_ANTENNA_CAL_RX_CARRIER_0_GAIN 8 /* Extended core scratch registers Word 8 - Bit0-22:Rx Carrier0 gain. Bit23-31:Reserved */ +#define ADRV904X_ANTENNA_CAL_RX_CARRIER_1_GAIN 9 /* Extended core scratch registers Word 9 - Bit0-22:Rx Carrier1 gain. Bit23-31:Reserved */ +#define ADRV904X_ANTENNA_CAL_RX_CARRIER_2_GAIN 10 /* Extended core scratch registers Word 10- Bit0-22:Rx Carrier2 gain. Bit23-31:Reserved */ +#define ADRV904X_ANTENNA_CAL_RX_CARRIER_3_GAIN 11 /* Extended core scratch registers Word 11- Bit0-22:Rx Carrier3 gain. Bit23-31:Reserved */ +#define ADRV904X_ANTENNA_CAL_RX_CARRIER_4_GAIN 12 /* Extended core scratch registers Word 12- Bit0-22:Rx Carrier4 gain. Bit23-31:Reserved */ +#define ADRV904X_ANTENNA_CAL_RX_CARRIER_5_GAIN 13 /* Extended core scratch registers Word 13- Bit0-22:Rx Carrier5 gain. Bit23-31:Reserved */ +#define ADRV904X_ANTENNA_CAL_RX_CARRIER_6_GAIN 14 /* Extended core scratch registers Word 14- Bit0-22:Rx Carrier6 gain. Bit23-31:Reserved */ +#define ADRV904X_ANTENNA_CAL_RX_CARRIER_7_GAIN 15 /* Extended core scratch registers Word 15- Bit0-22:Rx Carrier7 gain. Bit23-31:Reserved */ + +#define ADRV904X_EA_IMP_LNA_EN_TBL_ALARM_0 16 /* Extended core scratch registers Word 16- Bit0-7:Impacted LNA_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_LNA_EN_TBL_ALARM_1 17 /* Extended core scratch registers Word 17- Bit0-7:Impacted LNA_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_LNA_EN_TBL_ALARM_2 18 /* Extended core scratch registers Word 18- Bit0-7:Impacted LNA_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_LNA_EN_TBL_ALARM_3 19 /* Extended core scratch registers Word 19- Bit0-7:Impacted LNA_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_LNA_EN_TBL_ALARM_4 20 /* Extended core scratch registers Word 20- Bit0-7:Impacted LNA_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_LNA_EN_TBL_ALARM_5 21 /* Extended core scratch registers Word 21- Bit0-7:Impacted LNA_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_LNA_EN_TBL_ALARM_6 22 /* Extended core scratch registers Word 22- Bit0-7:Impacted LNA_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_LNA_EN_TBL_ALARM_7 23 /* Extended core scratch registers Word 23- Bit0-7:Impacted LNA_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_LNA_EN_TBL_ALARM_8 24 /* Extended core scratch registers Word 24- Bit0-7:Impacted LNA_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_LNA_EN_TBL_ALARM_9 25 /* Extended core scratch registers Word 25- Bit0-7:Impacted LNA_EN by given alarm. Bit8-31:Rsrvd */ + +#define ADRV904X_EA_IMP_PA_EN_TBL_ALARM_0 26 /* Extended core scratch registers Word 26- Bit0-7:Impacted PA_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_PA_EN_TBL_ALARM_1 27 /* Extended core scratch registers Word 27- Bit0-7:Impacted PA_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_PA_EN_TBL_ALARM_2 28 /* Extended core scratch registers Word 28- Bit0-7:Impacted PA_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_PA_EN_TBL_ALARM_3 29 /* Extended core scratch registers Word 29- Bit0-7:Impacted PA_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_PA_EN_TBL_ALARM_4 30 /* Extended core scratch registers Word 30- Bit0-7:Impacted PA_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_PA_EN_TBL_ALARM_5 31 /* Extended core scratch registers Word 31- Bit0-7:Impacted PA_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_PA_EN_TBL_ALARM_6 32 /* Extended core scratch registers Word 32- Bit0-7:Impacted PA_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_PA_EN_TBL_ALARM_7 33 /* Extended core scratch registers Word 33- Bit0-7:Impacted PA_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_PA_EN_TBL_ALARM_8 34 /* Extended core scratch registers Word 34- Bit0-7:Impacted PA_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_PA_EN_TBL_ALARM_9 35 /* Extended core scratch registers Word 35- Bit0-7:Impacted PA_EN by given alarm. Bit8-31:Rsrvd */ + +#define ADRV904X_EA_IMP_AUX_GRP1_TBL_ALARM_0 36 /* Extended core scratch registers Word 36- Bit0-7:Impacted AUX_GRP1 by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_AUX_GRP1_TBL_ALARM_1 37 /* Extended core scratch registers Word 37- Bit0-7:Impacted AUX_GRP1 by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_AUX_GRP1_TBL_ALARM_2 38 /* Extended core scratch registers Word 38- Bit0-7:Impacted AUX_GRP1 by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_AUX_GRP1_TBL_ALARM_3 39 /* Extended core scratch registers Word 39- Bit0-7:Impacted AUX_GRP1 by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_AUX_GRP1_TBL_ALARM_4 40 /* Extended core scratch registers Word 40- Bit0-7:Impacted AUX_GRP1 by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_AUX_GRP1_TBL_ALARM_5 41 /* Extended core scratch registers Word 41- Bit0-7:Impacted AUX_GRP1 by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_AUX_GRP1_TBL_ALARM_6 42 /* Extended core scratch registers Word 42- Bit0-7:Impacted AUX_GRP1 by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_AUX_GRP1_TBL_ALARM_7 43 /* Extended core scratch registers Word 43- Bit0-7:Impacted AUX_GRP1 by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_AUX_GRP1_TBL_ALARM_8 44 /* Extended core scratch registers Word 44- Bit0-7:Impacted AUX_GRP1 by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_AUX_GRP1_TBL_ALARM_9 45 /* Extended core scratch registers Word 45- Bit0-7:Impacted AUX_GRP1 by given alarm. Bit8-31:Rsrvd */ + +#define ADRV904X_EA_IMP_AUX_GRP0_TBL_ALARM_0 46 /* Extended core scratch registers Word 46- Bit0-7:Impacted AUX_GRP0 by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_AUX_GRP0_TBL_ALARM_1 47 /* Extended core scratch registers Word 47- Bit0-7:Impacted AUX_GRP0 by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_AUX_GRP0_TBL_ALARM_2 48 /* Extended core scratch registers Word 48- Bit0-7:Impacted AUX_GRP0 by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_AUX_GRP0_TBL_ALARM_3 49 /* Extended core scratch registers Word 49- Bit0-7:Impacted AUX_GRP0 by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_AUX_GRP0_TBL_ALARM_4 50 /* Extended core scratch registers Word 50- Bit0-7:Impacted AUX_GRP0 by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_AUX_GRP0_TBL_ALARM_5 51 /* Extended core scratch registers Word 51- Bit0-7:Impacted AUX_GRP0 by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_AUX_GRP0_TBL_ALARM_6 52 /* Extended core scratch registers Word 52- Bit0-7:Impacted AUX_GRP0 by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_AUX_GRP0_TBL_ALARM_7 53 /* Extended core scratch registers Word 53- Bit0-7:Impacted AUX_GRP0 by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_AUX_GRP0_TBL_ALARM_8 54 /* Extended core scratch registers Word 54- Bit0-7:Impacted AUX_GRP0 by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_AUX_GRP0_TBL_ALARM_9 55 /* Extended core scratch registers Word 55- Bit0-7:Impacted AUX_GRP0 by given alarm. Bit8-31:Rsrvd */ + +#define ADRV904X_EA_IMP_OC_FUSE_EN_TBL_ALARM_0 56 /* Extended core scratch registers Word 56- Bit0-7:Impacted OC_FUSE_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_OC_FUSE_EN_TBL_ALARM_1 57 /* Extended core scratch registers Word 57- Bit0-7:Impacted OC_FUSE_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_OC_FUSE_EN_TBL_ALARM_2 58 /* Extended core scratch registers Word 58- Bit0-7:Impacted OC_FUSE_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_OC_FUSE_EN_TBL_ALARM_3 59 /* Extended core scratch registers Word 59- Bit0-7:Impacted OC_FUSE_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_OC_FUSE_EN_TBL_ALARM_4 60 /* Extended core scratch registers Word 60- Bit0-7:Impacted OC_FUSE_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_OC_FUSE_EN_TBL_ALARM_5 61 /* Extended core scratch registers Word 61- Bit0-7:Impacted OC_FUSE_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_OC_FUSE_EN_TBL_ALARM_6 62 /* Extended core scratch registers Word 62- Bit0-7:Impacted OC_FUSE_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_OC_FUSE_EN_TBL_ALARM_7 63 /* Extended core scratch registers Word 63- Bit0-7:Impacted OC_FUSE_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_OC_FUSE_EN_TBL_ALARM_8 64 /* Extended core scratch registers Word 64- Bit0-7:Impacted OC_FUSE_EN by given alarm. Bit8-31:Rsrvd */ +#define ADRV904X_EA_IMP_OC_FUSE_EN_TBL_ALARM_9 65 /* Extended core scratch registers Word 65- Bit0-7:Impacted OC_FUSE_EN by given alarm. Bit8-31:Rsrvd */ + +#endif /* __ADRV904X_CPU_SCRATCH_REGISTERS_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_sw_bkpt_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_sw_bkpt_types.h new file mode 100644 index 00000000000..b8e407e3b1b --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_sw_bkpt_types.h @@ -0,0 +1,45 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adrv904x_cpu_sw_bkpt_types.h + * + * \brief Contains the definitions for Software Breakpoints + * + * \details Contains the definitions for Software Breakpoints + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_CPU_SW_BKPT_TYPES_H__ +#define __ADRV904X_CPU_SW_BKPT_TYPES_H__ + +#include + +/** +* \brief Software breakpoint table indexes. +*/ + +typedef enum +{ + ADRV904X_SWBKPT_INDEX_INVALID, /*!< Invalid index */ + ADRV904X_SWBKPT_INDEX_IC_TXBBF, /*!< TXBBF Init Cal Index */ + ADRV904X_SWBKPT_INDEX_IC_TEST_0, /*!< TEST_0 Init Cal Index */ + ADRV904X_SWBKPT_INDEX_IC_TEST_1, /*!< TEST_1 Init Cal Index */ + ADRV904X_SWBKPT_INDEX_TC_RXQEC, /*!< RxQEC Tracking Cal Index */ + ADRV904X_SWBKPT_INDEX_IC_TXLB_FILTER, /*!< TX LB Filter Init Cal Index */ + ADRV904X_SWBKPT_INDEX_IC_PATHDELAY, /*!< Path Delay Cal Index */ + ADRV904X_SWBKPT_INDEX_IC_TXQEC, /*!< TxQec Init Cal Index */ + ADRV904X_SWBKPT_INDEX_TC_TXQEC, /*!< TxQec Track Cal Index */ + + ADRV904X_CPU_BKPT_TABLE_SIZE /*!< Table size */ +} ADRV904X_SWBKPT_TABLE_INDEX; + + +#endif /* __ADRV904X_CPU_SW_BKPT_TYPES_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_types.h new file mode 100644 index 00000000000..951771945dd --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_cpu_types.h @@ -0,0 +1,29 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adrv904x_cpu_types.h +* +* \brief Contains ADRV904X data types for on board cpus feature +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#ifndef _ADRV904X_CPU_TYPES_H_ +#define _ADRV904X_CPU_TYPES_H_ + +/** + * \brief Enumerated list of Link Id + */ +typedef enum adrv904x_LinkId +{ + ADRV904X_LINK_ID_UNKNOWN = -1, + ADRV904X_LINK_ID_0, + ADRV904X_LINK_ID_MAX +} adrv904x_LinkId_e; + +#endif /* _ADRV904X_CPU_TYPES_H_ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_datainterface.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_datainterface.h new file mode 100644 index 00000000000..0e85056cad3 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_datainterface.h @@ -0,0 +1,323 @@ +/** + * Copyright 2015 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adrv904x_datainterface.h + * \brief Contains ADRV904X data interface related private function prototypes for + * adrv904x_datainterface.c which helps adi_adrv904x_datainterface.c + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADRV904X_DATAINTERFACE_H_ +#define _ADRV904X_DATAINTERFACE_H_ + +#include "../../private/bf/adrv904x_bf_jtx_link.h" +#include "../../private/bf/adrv904x_bf_jrx_link.h" +#include "../../private/bf/adrv904x_bf_jesd_common.h" +#include "../../private/bf/adrv904x_bf_serdes_txdig_phy_regmap_core1p2.h" +#include "../../private/bf/adrv904x_bf_serdes_rxdig_8pack_regmap_core1p2.h" + +#include "adi_adrv904x_error.h" + + +#define ADI_ADRV904X_CAPTURE_LOC_DDC0_BASE_CONFIG 0x00005008U +#define ADI_ADRV904X_CAPTURE_LOC_DDC1_BASE_CONFIG 0x00004008U +#define ADI_ADRV904X_CAPTURE_LOC_DPD_BASE_CONFIG 0x00000001U +#define ADI_ADRV904X_CAPTURE_LOC_DPD_PRE_BASE_CONFIG 0x00000101U +#define ADI_ADRV904X_CAPTURE_LOC_DPD_POST_BASE_CONFIG 0x00000201U +#define ADI_ADRV904X_CAPTURE_LOC_ORX_TX0_BASE_CONFIG 0x00000011U +#define ADI_ADRV904X_CAPTURE_LOC_ORX_TX1_BASE_CONFIG 0x00010011U +#define ADI_ADRV904X_CAPTURE_LOC_ORX_TX2_BASE_CONFIG 0x00020011U +#define ADI_ADRV904X_CAPTURE_LOC_ORX_TX3_BASE_CONFIG 0x00030011U +#define ADI_ADRV904X_CAPTURE_LOC_ORX_TX4_BASE_CONFIG 0x00040011U +#define ADI_ADRV904X_CAPTURE_LOC_ORX_TX5_BASE_CONFIG 0x00050011U +#define ADI_ADRV904X_CAPTURE_LOC_ORX_TX6_BASE_CONFIG 0x00060011U +#define ADI_ADRV904X_CAPTURE_LOC_ORX_TX7_BASE_CONFIG 0x00070011U +#define ADI_ADRV904X_CAPTURE_LOC_FORMATTER_BASE_CONFIG 0x00000001U +#define ADI_ADRV904X_CAPTURE_LOC_SLICE_MASK 0xFFFF0000U +#define ADI_ADRV904X_CAPTURE_SIZE_MASK_16K 0x0F000000U +#define ADI_ADRV904X_CAPTURE_SIZE_MASK_12K 0x00000000U +#define ADI_ADRV904X_CAPTURE_SIZE_MASK_8K 0x01000000U +#define ADI_ADRV904X_CAPTURE_SIZE_MASK_4K 0x02000000U +#define ADI_ADRV904X_CAPTURE_SIZE_MASK_2K 0x03000000U +#define ADI_ADRV904X_CAPTURE_SIZE_MASK_1K 0x04000000U +#define ADI_ADRV904X_CAPTURE_SIZE_MASK_512 0x05000000U +#define ADI_ADRV904X_CAPTURE_SIZE_MASK_256 0x06000000U +#define ADI_ADRV904X_CAPTURE_SIZE_MASK_128 0x07000000U +#define ADI_ADRV904X_CAPTURE_SIZE_MASK_64 0x08000000U +#define ADI_ADRV904X_CAPTURE_SIZE_MASK_32 0x09000000U + +/** + * \brief Reads the contents of the Rx/ORx data capture RAM into + * + * \dep begin + * \dep{device->common.devHalInfo} + * \dep end + * + * \param[in,out] device Pointer to the device settings structure + * \param[in] channelSelect Bit mask used to select the channel to read back + * \param[in] wordOffset Offset (starting from 0) of where to begin reading the RAM memory + * \param[out] ramData Pointer to the array that stores the captured data + * \param[in] wordCount The number of words of data read back from the RAM + * +* \retval adi_common_ErrAction_e - ADI_COMMON_ACT_NO_ACTION if Successful + */ + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxOrxDataCaptureRead(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e channelSelect, + uint32_t ramData[], + const uint32_t wordCount, + const adi_adrv904x_RxOrxDataCaptureLocation_e loc); + +/** + * \brief Helper function to decode the capture location + * + * Determines the value that should be written to the capture + * configuration register based on the location passed in + * + * \dep begin + * \dep{device->common.devHalInfo} + * \dep end + * + * \param[in] device Pointer to the device settings structure + * \param[in] captureLocation The location at which the data capture will occur + * \param[in] size The length of data capture + * \param[out] config 32-bit value representing the capture config register state for the selected location +* \retval adi_common_ErrAction_e - ADI_COMMON_ACT_NO_ACTION if Successful + */ + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxOrxDataCaptureConfigSet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxOrxDataCaptureLocation_e captureLocation, + const uint32_t size, + uint32_t* const config); + +/** + * \brief Helper function to decode the channel number to select the base address for the memory region to read + * + * \dep begin + * \dep{device->common.devHalInfo} + * \dep end + * + * \param[in] device Pointer to the device settings structure + * \param[in] channelSelect Channel mask indicating which channel is being captured + * \param[out] address 32-bit register base address of the capture memory location + * +* \retval adi_common_ErrAction_e - ADI_COMMON_ACT_NO_ACTION if Successful + */ + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxOrxDataCaptureConfigAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e channelSelect, + uint32_t* const address); + + +/** + * \brief Helper function to poll the channel stream debug register to determine the state of the ram capture flag + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in, out] device Pointer to the device settings structure + * \param[out] bStreamDbgFlag read only value is set to 0 when the stream processor has initiated a data capture + * +* \retval adi_common_ErrAction_e - ADI_COMMON_ACT_NO_ACTION if Successful + */ + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxOrxDataCaptureStreamDebugPoll(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e channelSelect, + uint32_t* const bStreamDbgFlag); + + +/** +* \brief Look up the framer function bitfield address given a framer index +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] framerIdx Framer selection index +* \param[out] framerBitfieldAddr Framer bitfield address which will be updated by this function +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_FramerBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerIdx, + adrv904x_BfJtxLinkChanAddr_e* const framerBitfieldAddr); + +/** +* \brief Look up the framer function bitfield address given a deframer index +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] deframerIdx Deframer selection index +* \param[out] deframerBitfieldAddr Deframer bitfield address which will be updated by this function +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_DeframerBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerIdx, + adrv904x_BfJrxLinkChanAddr_e* const deframerBitfieldAddr); + +/** +* \brief Look up the lane serdes PHY bitfield address given a lane index +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] laneIdx lane selection index +* \param[out] laneSerdesPhyBitfieldAddr lane serdes phy bitfield address which will be updated by this function +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_FramerLaneSerdesPhyBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const uint8_t laneIdx, + adrv904x_BfSerdesTxdigPhyRegmapCore1p2ChanAddr_e* const laneSerdesPhyBitfieldAddr); + +/** +* \brief this private function is to get the lane crossbar for the selected framer. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] framerSel selected of framer defined in adi_adrv904x_FramerSel_e +* \param[inout] framerCfg Pointer to the JESD Framer configuration read back +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_FramerLaneEnableGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + adi_adrv904x_FramerCfg_t* const framerCfg); + +/** +* \brief this private function is to get the lane crossbar for the selected deframer. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] deframerSel selected of framer defined in adi_adrv904x_DeframerSel_e +* \param[inout] deframerCfg Pointer to the JESD Deframer configuration read back +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_DeframerLaneEnableGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + adi_adrv904x_DeframerCfg_t* const deframerCfg); + +/** +* \brief this private function is to set the lanes serdes phy power up or down associated to the selected framer. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] framerSelMask selected of framers defined in adi_adrv904x_FramerSel_e +* \param[in] powerAct indicate the action power up or down. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_FramerLaneSerdesPowerSet(adi_adrv904x_Device_t* const device, + const uint8_t framerSelMask, + const uint8_t powerAct); + +/** +* \brief this private function is to set the lanes serdes phy power up or down associated to the selected deframer. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] deframerSelMask selected of deframers defined in adi_adrv904x_DeframerSel_e +* \param[in] powerAct indicate the action power up or down. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_DeframerLaneSerdesPowerSet(adi_adrv904x_Device_t* const device, + const uint8_t deframerSelMask, + const uint8_t powerAct); + +/** +* \brief this function calculates the clock divider setting required to set the DPD RAM capture clock rate to match the Rx output sample rate. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Pointer to the ADRV904X data structure +* \param[in] channelSelect The Rx channel that is doing the data capture +* \param[out] value The divider value required to set the DPD RAM clock rate to match the Rx output sample rate. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadClkDividerValueCalculate(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e channelSelect, + const adi_adrv904x_RxOrxDataCaptureLocation_e loc, + uint8_t* const value); + + +/** +* \brief this function polls the capture busy bitfield in the appropriate capture status register indicated by the channelSelect parameter. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Pointer to the ADRV904X data structure +* \param[in] channelSelect The Rx channel that is doing the data capture +* \param[out] bCptBusy variable that stores the status of the capture busy bitfield +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_StatusRegisterPoll(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e channelSelect, + uint8_t* const bCptBusy); + +/** +* \brief This Function Reads the Jrx Repair screen Id information to check if the device has undergone the CM screen +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Pointer to the ADRV904X data structure +* \param[out] screenID if 1 the device has undergone the CM screen, 0 otherwise +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxRepairScreenTestChecker(adi_adrv904x_Device_t* const device, + uint8_t* const screenID); + +/** +* \brief Determine if a JESD Tx lane is powered down. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Pointer to the ADRV904X data structure +* \param[in] bitfieldAddr Indicates the JESD Tx lane +* \param[out] phyLanePd Is set to 1 if lane is powered down, 0 otherwise +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GetJtxLanePoweredDown(adi_adrv904x_Device_t* const device, + adrv904x_BfSerdesTxdigPhyRegmapCore1p2ChanAddr_e const laneSerdesPhyBitfieldAddr, + uint8_t* const phyLanePd); + + +#endif /* _ADRV904X_DATAINTERFACE_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_app_error_tables.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_app_error_tables.h new file mode 100644 index 00000000000..2796e182506 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_app_error_tables.h @@ -0,0 +1,1432 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file + * + * \brief + * + * \details + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADRV904X_DFE_APP_ERROR_TABLES_H_ +#define _ADRV904X_DFE_APP_ERROR_TABLES_H_ + +#include "adi_common_error.h" +#include "adi_adrv904x_error_types.h" + +const adrv904x_DfeAppRuntimeErrCodes_t adrv904x_DfeAppRunTimeErrTable[] = +{ +/* DO NOT EDIT THIS TABLE, CHANGES WILL BE OVERWRITTEN DURING FULL BUILD */ +/* START AUTOGENERATED CPU RUNTIME ERROR TABLE */ + + { + 0x0000u, + ADI_STRING("No error"), + ADI_STRING("Operation was successful"), + ADI_ADRV904X_ERR_ACT_NONE, + ADI_STRING("No action required") + }, + { + 0xE001u, + ADI_STRING("APP Error: DPD Decomposition Calculation"), + ADI_STRING("Invalid Parameters Provided from XCORR"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check XCORR Data is Valid") + }, + { + 0xE002u, + ADI_STRING("APP Error: DPD Model Descriptor"), + ADI_STRING("Invalid Parameters Provided in Model Descriptor (i.e. cannot find LUT ID's or Number of LUT's)"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Model Descriptor Parameters are Valid") + }, + { + 0xE003u, + ADI_STRING("APP Error: DPD DDR I and/or J"), + ADI_STRING("Invalid DDR I and/or J Parameter Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check DDR I and/or J Parameters are Valid") + }, + { + 0xE004u, + ADI_STRING("APP Error: DPD DDR Mode Polynomial"), + ADI_STRING("Invalid Polynomial Parameter Provided for DDR Mode"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Polynomial Parameters are Valid for DDR Mode") + }, + { + 0xE005u, + ADI_STRING("APP Error: Duplicate DPD LUT"), + ADI_STRING("Same LUT is assigned multiple times"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check LUT Usage") + }, + { + 0xE006u, + ADI_STRING("APP Error: DPD Queue Limit"), + ADI_STRING("Number of Compute Requests are exceeding the queue of pending request"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check how Requests for the Feature are Managed") + }, + { + 0xE007u, + ADI_STRING("APP Error: DPD Fractional Delay Estimation Count"), + ADI_STRING("Fractional Delay can't be Estimated with Bad Captures"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check that Captures will Provide Sufficient Data") + }, + { + 0xE008u, + ADI_STRING("APP Error: DPD LUT Saturation"), + ADI_STRING("Underlying Datatype of LUT parameter is int16"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Value is in the range of int16") + }, + { + 0xE009u, + ADI_STRING("APP Error: DPD Channel Mask"), + ADI_STRING("Invalid Channel Mask Provided"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Channel Mask is Valid, (i.e. One Channel at a Time)") + }, + { + 0xE00Au, + ADI_STRING("APP Error: Unsupported DPD Status Get"), + ADI_STRING("Status Get function not Supported for Provided Tracking Calibration Status Type"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Tracking Calibration Status Type has a Supported Status Get Feature") + }, + { + 0xE00Bu, + ADI_STRING("APP Error: DPD Status Buffer Size"), + ADI_STRING("Invalid Status Buffer Size for the Calibration Status Type Requested"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Status Size for the Calibration Status Type Requested") + }, + { + 0xE00Cu, + ADI_STRING("APP Error: Configuration Structure Size"), + ADI_STRING("Invalid Configuration Size Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Configuration Read Size is Valid") + }, + { + 0xE00Du, + ADI_STRING("APP Error: Configuration Structure Offset"), + ADI_STRING("Invalid Configuration Offset Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Configuration Offset is Valid") + }, + { + 0xE00Eu, + ADI_STRING("APP Error: DPD Control Command Buffer Size"), + ADI_STRING("Invalid Control Data Size Provided for Control Command Requested"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Control Data Size is Valid for Control Command") + }, + { + 0xE00Fu, + ADI_STRING("APP Error: DPD Control Command"), + ADI_STRING("Invalid Control Command Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Control Command is Valid") + }, + { + 0xE010u, + ADI_STRING("APP Error: DPD Control Command Parameter"), + ADI_STRING("Invalid Parameter Provided in Model Descriptor"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Parameters Provided in Model Descriptor") + }, + { + 0xE011u, + ADI_STRING("APP Error: Calibration Framework Command Not Executed"), + ADI_STRING("Command sent to a Channel that is not Enabled"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Command is Valid for Specified Channel") + }, + { + 0xE012u, + ADI_STRING("APP Error: Calibration Framework Status Get"), + ADI_STRING("Status Get Command sent to Calibration which does not support it"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Calibration has Status Get") + }, + { + 0xE013u, + ADI_STRING("APP Error: Calibration Type"), + ADI_STRING("Invalid Calibration Type Provided"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Calibration Type is Valid") + }, + { + 0xE014u, + ADI_STRING("APP Error: Calibration Framework Configuration Set"), + ADI_STRING("Configuration Set Command is sent to Calibration which does not support it"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Configuration Set Command for Calibration is Valid") + }, + { + 0xE015u, + ADI_STRING("APP Error: Calibration Framework Configuration Get"), + ADI_STRING("Configuration Get Command is sent to Calibration which does not support it"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Configuration Get Command for Calibration is Valid") + }, + { + 0xE016u, + ADI_STRING("APP Error: Calibration Framework HAL Channel"), + ADI_STRING("Invalid HAL Channel Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Verify Channel Configuration & Reprogram Device with Updated Profile Image") + }, + { + 0xE017u, + ADI_STRING("APP Error: Calibration Framework Configuration Offset"), + ADI_STRING("Invalid Calibration Framework Configuration Offset"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Calibration Framework Configuration Offset is Valid") + }, + { + 0xE018u, + ADI_STRING("APP Error: Calibration Framework Task Thread Pointer"), + ADI_STRING("Invalid Thread Pointer Provided for Task by OSAL"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE019u, + ADI_STRING("APP Error: Calibration Framework Task Event Pointer"), + ADI_STRING("Invalid Event Pointer Provided for Task by OSAL"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE01Au, + ADI_STRING("APP Error: Calibration Framework Task Timer Pointer"), + ADI_STRING("Invalid Timer Pointer Provided for Task by OSAL"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE01Bu, + ADI_STRING("APP Error: Calibration Framework Suspend Timeout"), + ADI_STRING("Tracking Calibration failed to Suspend within the expected time"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset Tracking Calibration and try again. Contact ADI if the Problem Persists") + }, + { + 0xE01Cu, + ADI_STRING("APP Error: Calibration Framework Event Timeout"), + ADI_STRING("Tracking Calibration failed to Suspend"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Timeout is Valid for Tracking Calibration") + }, + { + 0xE01Du, + ADI_STRING("APP Error: DPD Power Meter Rate Overflow"), + ADI_STRING("Invalid DPD Power Meter Rate"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Rate is Valid") + }, + { + 0xE01Eu, + ADI_STRING("APP Error: DPD Power Meter Configuration"), + ADI_STRING("Invalid DPD Power Meter Configuration Parameter(s)"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check DPD Power Meter Configuration Parameter(s) are Valid") + }, + { + 0xE01Fu, + ADI_STRING("APP Error: LUT Copy"), + ADI_STRING("Invalid LUT Update Parameter(s)"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check LUT Update Parameter(s) are Valid") + }, + { + 0xE020u, + ADI_STRING("APP Error: Capture Sequencer Mutex"), + ADI_STRING("Mutex Acquire/Release Failed for Capture Sequencer"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE021u, + ADI_STRING("APP Error: Capture Sequencer Period"), + ADI_STRING("Invalid Channel or Capture Period Type Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Channel and Capture Period Type are Valid") + }, + { + 0xE022u, + ADI_STRING("APP Error: Capture Sequence Done Event"), + ADI_STRING("Invalid Manual Capture Done Event"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE023u, + ADI_STRING("APP Error: Capture Sequence Incomplete"), + ADI_STRING("Incomplete Capture Detected"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Capture Parameters are Valid") + }, + { + 0xE024u, + ADI_STRING("APP Error: DPD Model Configuration"), + ADI_STRING("Invalid Model Configuration Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Model Configuration Parameters are Valid") + }, + { + 0xE025u, + ADI_STRING("APP Error: Event Receive Handle Initialization"), + ADI_STRING("OSAL Failed to Initialize Event Receive Handle"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE026u, + ADI_STRING("APP Error: Event Thread Create"), + ADI_STRING("OSAL Failed to Create Event Thread"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE027u, + ADI_STRING("APP Error: DPD Capture Request"), + ADI_STRING("Invalid DPD Capture Request"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check DPD Capture Request Parameters are Valid") + }, + { + 0xE028u, + ADI_STRING("APP Error: Event Handle Get"), + ADI_STRING("OSAL failed to Get Event Handle"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE029u, + ADI_STRING("APP Error: Unity Model"), + ADI_STRING("Small Tx Signal Detected"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Tx Signal Configuration and/or Apply Unity Model") + }, + { + 0xE02Au, + ADI_STRING("APP Error: DPD Adaptation Configuration"), + ADI_STRING("Invalid DPD Adaptation Configuration Parameters"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check DPD Adaptation Configuration Parameters are Valid") + }, + { + 0xE02Bu, + ADI_STRING("APP Error: DPD Actuator Passthrough Mode"), + ADI_STRING("Enabling/Disabling DPD actuator Passthrough mode Failed"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Passthrough Parameters are Valid") + }, + { + 0xE02Cu, + ADI_STRING("APP Error: Linear Term Configuration"), + ADI_STRING("Linear Term Setting plus DDR j Delay exceeds J Delay Buffer Size"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Liner Term Setting and/or J Delay Buffer Size are Valid") + }, + { + 0xE02Du, + ADI_STRING("APP Error: Aborted Capture"), + ADI_STRING("Capture was Aborted"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Trigger new DPD Capture") + }, + { + 0xE02Eu, + ADI_STRING("APP Error: DPD pathdelay lag range"), + ADI_STRING("Integer delay was drifted by more than 1 sample"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Enlarge xcorr lag range") + }, + { + 0xE02Fu, + ADI_STRING("APP Error: DPD Actuator Enable Mode"), + ADI_STRING("Enabling/Disabling DPD Actuator Failed"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Enable Parameters are Valid") + }, + { + 0xE030u, + ADI_STRING("APP Error: Power meter Sequencer Mutex req failed"), + ADI_STRING("Mutex Acquire/Release Failed for DPD power meter"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE031u, + ADI_STRING("APP Error: Power meter function is called with invalid parameter"), + ADI_STRING("Power meter function is called with invalid parameter"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE032u, + ADI_STRING("APP Error: DPD Model Vbank not populated"), + ADI_STRING("Selected Vbank to write LUTs isn't populated yet"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the feature, contact ADI if the Problem Persists") + }, + { + 0xE033u, + ADI_STRING("APP Error: DPD stability check error"), + ADI_STRING("Selected performance metric(s) exceed the programmed threshold(s)"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Robustness framework takes recovery action(s)") + }, + { + 0xE034u, + ADI_STRING("APP Error: DPD supported model error"), + ADI_STRING("Configured model can not be supported with selected actuator depth"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Application Command Message is Valid") + }, + { + 0xE035u, + ADI_STRING("APP Error: Capture abort failure"), + ADI_STRING("Capture abort failure"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE036u, + ADI_STRING("APP Error: ORx power is below the low power threshold"), + ADI_STRING("ORx signal power is too low and below the threshold"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("adjust ORx gain to increase singal power") + }, + { + 0xE037u, + ADI_STRING("APP Error: Tx power is below the low power threshold"), + ADI_STRING("Tx signal power is too low and below the threshold"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("adjust tx digital backoff to increase singal power or check LUT entries") + }, + { + 0xE038u, + ADI_STRING("APP Error: Post-DPD Tx power is below the low power threshold"), + ADI_STRING("Post-DPD Tx signal power is too low and below the threshold"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("adjust tx digital backoff to increase singal power or check LUT entries") + }, + { + 0xE039u, + ADI_STRING("APP Error: ORx power is above the high power threshold"), + ADI_STRING("ORx signal power is too high"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("adjust ORx gain to attenuate singal power") + }, + { + 0xE03Au, + ADI_STRING("APP Error: Tx power is above the high power threshold"), + ADI_STRING("Tx signal power is too high"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("adjust tx digital backoff to decrease singal power") + }, + { + 0xE03Bu, + ADI_STRING("APP Error: Post-DPD Tx power is above the high power threshold"), + ADI_STRING("Post-DPD Tx signal power is too high"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("adjust tx digital backoff to decrease singal power") + }, + { + 0xE03Cu, + ADI_STRING("APP Error: ORx peak power is below the peak power threshold"), + ADI_STRING("ORx signal peak power is too low"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("adjust ORx atten to increase singal power") + }, + { + 0xE03Du, + ADI_STRING("APP Error: Tx peak power is below the peak power threshold"), + ADI_STRING("Tx signal peak power is too low"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("adjust tx digital backtoff to increase singal power") + }, + { + 0xE03Eu, + ADI_STRING("APP Error: Post-DPD Tx peak power is below the peak power threshold"), + ADI_STRING("Post-DPD Tx signal peak power is too low"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("adjust tx digital backtoff to increase singal power") + }, + { + 0xE03Fu, + ADI_STRING("APP Error: ORx peak power is above the peak power threshold"), + ADI_STRING("ORx signal peak power is too high"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("adjust ORx atten to reduce singal power") + }, + { + 0xE040u, + ADI_STRING("APP Error: Tx peak power is above the peak power threshold"), + ADI_STRING("Tx signal peak power is too high"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("adjust tx digital backtoff to reduce singal power") + }, + { + 0xE041u, + ADI_STRING("APP Error: Post-DPD Tx peak power is above the peak power threshold"), + ADI_STRING("Post-DPD Tx signal peak power is too high"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("adjust tx digital backtoff to reduce singal power") + }, + { + 0xE042u, + ADI_STRING("APP Error: Exceed maximum number of feature indexes per feature segment"), + ADI_STRING("DPD model might not be right"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("check DPD model or reach ADI for support") + }, + { + 0xE043u, + ADI_STRING("APP Error: Exceed maximum number of feature segments"), + ADI_STRING("DPD model might not be right"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("check DPD model or reach ADI for support") + }, + { + 0xE044u, + ADI_STRING("APP Error: Difference between estiamted and seeded pathdelays exceeded the programmed range"), + ADI_STRING("This is for informational purposes only. There is insufficient information in the signal to estimate path delay"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Confirm the seed value and the programmed qualify range. No recovery action expected from the user if these values provided are accurate. The firmware will use the seeded value automatically, in case the path delay cannot be estimated") + }, + { + 0xE045u, + ADI_STRING("APP Error: SW_TO_R_TABLE recovery action used when no R table coefficients are configured"), + ADI_STRING("Model 2 (R table) coefficients not configured"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Ensure Model 2 (R table) has been configured, including after a DPD Reset, or disable use of SW_TO_R_TABLE recovery action") + }, + { + 0xE046u, + ADI_STRING("APP Error: VSWR Capture Retry after abort"), + ADI_STRING("Only happens in RCI mode. Mapping has changed when capture is in progress"), + ADI_ADRV904X_ERR_ACT_NONE, + ADI_STRING("No action required. Cal will retry capture once the mapping is correct") + }, + { + 0xE047u, + ADI_STRING("APP Error: VSWR unable to read back current Tx attenuation"), + ADI_STRING("Unexpected error returned when reading Tx attenuation from HW"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the problem persists") + }, + { + 0xE048u, + ADI_STRING("APP Error: Tx attenuation is changed while VSWR is capturing"), + ADI_STRING("User initiated change"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("It is mainly a warning that VSWR skips updating in the event") + }, + { + 0xE049u, + ADI_STRING("APP Error: Failure to find forward gain or reflection using cross-correlation"), + ADI_STRING("Invalid playback signal that doesn't correlate with accumulated capture"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Reset VSWR after checking playback signal") + }, + { + 0xE04Au, + ADI_STRING("APP Error: Forward path delay found by VSWR has changed by unexpected amount"), + ADI_STRING("Forward path delay determined by cross correlation of accumulated capture has changed too much"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check playback signal, number of accumulation iterations, and forward path attenuation") + }, + { + 0xE04Bu, + ADI_STRING("APP Error: VSWR return loss values triggered minor alarm"), + ADI_STRING("Return loss values have passed thresholds configured for VSWR minor alarm"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check external path conditions and/or VSWR alarm configuration") + }, + { + 0xE04Cu, + ADI_STRING("APP Error: VSWR return loss values triggered major alarm"), + ADI_STRING("Return loss values have passed thresholds configured for VSWR major alarm"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check external path conditions and/or VSWR alarm configuration.") + }, + { + 0xE100u, + ADI_STRING("APP Error: Command Opcode"), + ADI_STRING("Invalid Application Command Opcode Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Application Command Message is Valid") + }, + { + 0xE101u, + ADI_STRING("APP Error: Application Command"), + ADI_STRING("Invalid Application Command Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Application Command Message is Valid") + }, + { + 0xE102u, + ADI_STRING("APP Error: Capture Buffer Storage"), + ADI_STRING("Capture Buffer Count Limit Reached"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Clear or Reduce Number of Stored Data Captures") + }, + { + 0xE103u, + ADI_STRING("APP Error: FDD LUT Copy"), + ADI_STRING("Invalid LUT Copy Parameters"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check LUT Copy Parameters are Valid") + }, + { + 0xE104u, + ADI_STRING("APP Error: TDD LUT Copy"), + ADI_STRING("Invalid LUT Copy Parameters"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check LUT Copy Parameters are Valid") + }, + { + 0xE105u, + ADI_STRING("APP Error: vBank Buffers"), + ADI_STRING("Invalid vBank Buffers Pointer(s)"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check vBank Parameters are Valid") + }, + { + 0xE106u, + ADI_STRING("APP Error: DPD Power Meter Read"), + ADI_STRING("Invalid Tx Channel Parameter Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Tx Channel is Enabled") + }, + { + 0xE107u, + ADI_STRING("APP Error: Capture Buffer Pointer"), + ADI_STRING("Invalid Capture Buffer Pointer"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Capture Buffer Pointer is Valid") + }, + { + 0xE108u, + ADI_STRING("APP Error: DPD Adaptation Buffer"), + ADI_STRING("Failed to Acquire Adaptation Buffer"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Capture Buffers are not still in use") + }, + { + 0xE109u, + ADI_STRING("APP Error: VSWR command not supported"), + ADI_STRING("VSWR received unsupported command"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check VSWR command data") + }, + { + 0xE10Au, + ADI_STRING("APP Error: VSWR Capture Incomplete"), + ADI_STRING("VSWR Capture Reporting Incomplete"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check VSWR Calibration is Configured Correctly") + }, + { + 0xE10Bu, + ADI_STRING("APP Error: VSWR Capture Request"), + ADI_STRING("Invalid VSWR Capture Request Parameters"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check VSWR Capture Request Parameters are Valid") + }, + { + 0xE10Cu, + ADI_STRING("APP Error: Capture Buffer Busy"), + ADI_STRING("Capture Buffer is in use and cannot Respond to new Data Capture Request"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Wait until Current Capture has Complete") + }, + { + 0xE10Du, + ADI_STRING("APP Error: VSWR Capture Abort"), + ADI_STRING("VSWR Capture Aborted"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Retry VSWR Capture") + }, + { + 0xE10Eu, + ADI_STRING("APP Error: vBank Buffer(s) Acquire"), + ADI_STRING("VBank Buffer(s) not Available"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check that Buffer(s) are Available") + }, + { + 0xE10Fu, + ADI_STRING("FDD Lut Copy Start Failed"), + ADI_STRING("Unexpected LUT copy start failure"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset the feature to recover from this error. if problem persists contact ADI.") + }, + { + 0xE110u, + ADI_STRING("FDD Lut Copy Timed Out"), + ADI_STRING("Timed out waiting for LUT copy to complete"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset the feature to recover from this error. if problem persists contact ADI.") + }, + { + 0xE111u, + ADI_STRING("FDD LUT Copy error while waiting for completion. Not timeout related."), + ADI_STRING("Unknown error encountered while waiting for any LUT done or error event"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the feature to recover from this error. if problem persists contact ADI.") + }, + { + 0xE112u, + ADI_STRING("FDD LUT Copy error encountered during DMA transfer."), + ADI_STRING("Unknown error encountered in DMA transfer."), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset the feature to recover from this error. if problem persists contact ADI.") + }, + { + 0xE113u, + ADI_STRING("TDD Lut Copy Start Failed"), + ADI_STRING("Unexpected LUT copy start failure"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset the feature to recover from this error. if problem persists contact ADI.") + }, + { + 0xE114u, + ADI_STRING("TDD Lut Copy Timed Out"), + ADI_STRING("Timed out waiting for LUT copy to complete"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset the feature to recover from this error. if problem persists contact ADI.") + }, + { + 0xE115u, + ADI_STRING("TDD LUT Copy error while waiting for completion. Not timeout related."), + ADI_STRING("Unknown error encountered while waiting for any LUT done or error event"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset the feature to recover from this error. if problem persists contact ADI.") + }, + { + 0xE116u, + ADI_STRING("TDD LUT Copy error encountered during DMA transfer."), + ADI_STRING("Unknown error encountered in DMA transfer."), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset the feature to recover from this error. if problem persists contact ADI.") + }, + { + 0xE117u, + ADI_STRING("TDD LUT Copy was In Progress for a Tx channel during TX_ON."), + ADI_STRING("TDD LUT Copy started too late after TX_OFF falling edge to be finished before TX_ON rising edge."), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset the feature to recover from this error. if problem persists contact ADI.") + }, + { + 0xE118u, + ADI_STRING("APP Error: Tx Power measurement Request"), + ADI_STRING("Invalid Tx Power measurement Request Parameters"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Tx Power Measurement Request Parameters are valid") + }, + { + 0xE119u, + ADI_STRING("APP Error: Unexpected capture type received in capture done event"), + ADI_STRING("Unexpected capture type received in capture done event"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the problem persists") + }, + { + 0xE11Au, + ADI_STRING("APP Error: Tx power measurement is aborted"), + ADI_STRING("Power measurement didn't complete within RS pattern"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Adjust pattern timing or power measurement duration") + }, + { + 0xE11Bu, + ADI_STRING("APP Error: Application consumed Capture Done Event Payload too late"), + ADI_STRING("SDK Cap Service overwrote Capture Done Event Payload before it was received and consumed by App"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Adjust configuration and/or timing in application to prevent this SDK overwrite.") + }, + { + 0xE11Cu, + ADI_STRING("APP Error: LUT linear term of all tables must equal LUT linear term of Table 0"), + ADI_STRING("LUT linear term of table not equal to LUT linear term of Table 0"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Change LUT linear term of table") + }, + { + 0xE11Du, + ADI_STRING("APP Error: Sempahore wait request failed"), + ADI_STRING("The call to sempahore wait API failed"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE11Eu, + ADI_STRING("APP Error: Sempahore post request failed"), + ADI_STRING("The call to sempahore post API failed"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE11Fu, + ADI_STRING("APP Error: The post calibration cleanup failed"), + ADI_STRING("The call to perform post calibration cleanup failed"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE122u, + ADI_STRING("APP Error: CLGC Capture Request"), + ADI_STRING("Invalid CLGC Capture Request"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check CLGC capture configuration parameters") + }, + { + 0xE123u, + ADI_STRING("APP Error: CLGC Capture Result Get"), + ADI_STRING("Service error when reading back power meter result"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the problem persists") + }, + { + 0xE124u, + ADI_STRING("APP Error: Tx or ORx power is below threshold set"), + ADI_STRING("Power measurement cannot find healthy signal after max retries"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Tx or ORx signal level and capture thresholds") + }, + { + 0xE125u, + ADI_STRING("APP Error: Unsupported CLGC Status Get"), + ADI_STRING("Status Get function not Supported for Provided Tracking Calibration Status Type"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Tracking Calibration Status Type has a Supported Status Get Feature") + }, + { + 0xE126u, + ADI_STRING("APP Error: CLGC Status Buffer Size"), + ADI_STRING("Invalid Status Buffer Size for the Calibration Status Type Requested"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Status Size for the Calibration Status Type Requested") + }, + { + 0xE127u, + ADI_STRING("APP Error: CLGC Control Command"), + ADI_STRING("Invalid Control Command Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Control Command is Valid") + }, + { + 0xE128u, + ADI_STRING("APP Error: CLGC CTRL command Buffer Size"), + ADI_STRING("Invalid CTRL command Buffer Size for the Calibration CTRL Type Requested"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check CTRL command Size for the Calibration CTRL Type Requested") + }, + { + 0xE129u, + ADI_STRING("APP Error: CLGC detects PA protection assertion"), + ADI_STRING("PA protection error asserted or Tx attenuation ramp-up/down in progress"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check PA protection thresholds or Tx signal level") + }, + { + 0xE12Au, + ADI_STRING("APP Error: CLGC Tx Attenuation Above Maximum Limit"), + ADI_STRING("CLGC failed to ajust Tx attenuation because it is above maximum limit"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Tx atten limits or/and expected loop gain configured") + }, + { + 0xE12Bu, + ADI_STRING("APP Error: CLGC Tx Attenuation Below Minimum Limit"), + ADI_STRING("CLGC failed to ajust Tx attenuation because it is below minimum limit"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Tx atten limits or/and expected loop gain configured") + }, + { + 0xE12Cu, + ADI_STRING("APP Error: Unexpected capture event received in capture state machine"), + ADI_STRING("Unexpected capture type received in capture state machine"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the problem persists") + }, + { + 0xE12Du, + ADI_STRING("APP Error: CLGC unable to set Tx attenuation"), + ADI_STRING("Unexpected error returned when writing Tx attenuation to HW"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the problem persists") + }, + { + 0xE12Eu, + ADI_STRING("APP Error: CLGC unable to read back current Tx attenuation"), + ADI_STRING("Unexpected error returned when reading Tx attenuation from HW"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the problem persists") + }, + { + 0xE12Fu, + ADI_STRING("APP Error: CLGC unable to read back current ORx attenuation"), + ADI_STRING("Unexpected error returned when reading ORx attenuation from HW"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the problem persists") + }, + { + 0xE130u, + ADI_STRING("APP Error: CLGC Capture Abort"), + ADI_STRING("Service error when aborting a CLGC capture"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the problem persists") + }, + { + 0xE131u, + ADI_STRING("APP Error: CLGC Capture Discard"), + ADI_STRING("Service error when discarding a CLGC capture"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset DFE and try again. Contact ADI if the problem persists") + }, + { + 0xE132u, + ADI_STRING("APP Error: Capture Event Registration"), + ADI_STRING("OSAL failed to Register a Capture Event"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE133u, + ADI_STRING("APP Error: Capture Start Event"), + ADI_STRING("Capture start error occured"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE134u, + ADI_STRING("APP Error: Capture Aborted"), + ADI_STRING("capture aborted due to EXIT request"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE135u, + ADI_STRING("APP Error: Incomplete Capture"), + ADI_STRING("DPD capture incomplete in CLGC peak detection mode"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE136u, + ADI_STRING("APP Error: A Tx Channel Not Mapped to an ORx Channel"), + ADI_STRING("Tx-ORx map not set"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check and set Tx to ORx map") + }, + { + 0xE137u, + ADI_STRING("APP Error: Unexpected capture period end signal"), + ADI_STRING("Unexpected capture period end signal"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Contact ADI") + }, + { + 0xE138u, + ADI_STRING("APP Error: Rx Capture Request failed"), + ADI_STRING("Invalid Rx Capture Request Parameters"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Rx Capture Request Parameters are Valid") + }, + { + 0xE139u, + ADI_STRING("APP Error: bad data captured"), + ADI_STRING("Bad waveform or incompleted capture"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check waveform") + }, + { + 0xE13Au, + ADI_STRING("APP Error: Tx attenuation is changed while CLGC is tracking"), + ADI_STRING("User initiated change"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("It is mainly a warning that CLGC skips updating in the event") + }, + { + 0xE13Bu, + ADI_STRING("APP Error: VSWR Accumulating capture overflow"), + ADI_STRING("I or Q values in accumulated capture overflowed"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check VSWR playback signal and capture configuration") + }, + { + 0xE13Cu, + ADI_STRING("APP Error: DPD Capture Discard"), + ADI_STRING("Service error when discarding a DPD capture"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the problem persists") + }, + { + 0xE13Du, + ADI_STRING("APP Error: DPD Capture Retry after abort"), + ADI_STRING("Only happens in RCI mode. Mapping has changed when capture is in progress"), + ADI_ADRV904X_ERR_ACT_NONE, + ADI_STRING("No action required. Cal will retry capture once the mapping is correct") + }, + { + 0xE13Eu, + ADI_STRING("APP Error: CLGC Capture Retry after abort"), + ADI_STRING("Only happens in RCI mode. Mapping has changed when capture is in progress"), + ADI_ADRV904X_ERR_ACT_NONE, + ADI_STRING("No action required. Cal will retry capture once the mapping is correct") + }, + { + 0xE13Fu, + ADI_STRING("APP Error: fail to disable actuator passthru"), + ADI_STRING("invalid param or fail to get dpd act driver mutex"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check parameter") + }, + { + 0xE140u, + ADI_STRING("APP Error: App Configuration is Locked"), + ADI_STRING("Configuration has not been Unlocked"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Unlock Configuration before trying again") + }, + { + 0xE141u, + ADI_STRING("APP Error: Model switch mutex req failed"), + ADI_STRING("Mutex Acquire/Release Failed for DPD model switching"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE142u, + ADI_STRING("APP Error: DPD model switch function is called with invalid parameter"), + ADI_STRING("DPD model switch function is called with invalid parameter"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE143u, + ADI_STRING("APP Error: DPD model switch failed to switch model"), + ADI_STRING("DPD model has not been switching as requested"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE144u, + ADI_STRING("APP Error: DPD model switch power meter thread has failed"), + ADI_STRING("DPD models are not switching based on power meter measurements"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE145u, + ADI_STRING("APP Error: CLGC update is skipped because DPD actuator gain monitor has asserted"), + ADI_STRING("DPD actuator gain outside set limits"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("It is mainly a warning that CLGC skips updating in the event") + }, + { + 0xE146u, + ADI_STRING("APP Error: CLGC update is skipped because DPD actuator gain monitor status could not be determined"), + ADI_STRING("DPD gain monitor status check has failed"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE147u, + ADI_STRING("APP Error: There is already a pending capture period request"), + ADI_STRING("Cal thread is making a new capture period request before previous one has been processed"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE148u, + ADI_STRING("APP Error: DPD integer Path Delay estimation is out of lag range (-255, 0)"), + ADI_STRING("DPD Path Delay Estimation Failure"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE149u, + ADI_STRING("APP Error: DPD update aborted because DPD actuator gain monitor has asserted"), + ADI_STRING("DPD actuator gain outside set limits"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check DPD configuration") + }, + { + 0xE14Au, + ADI_STRING("APP Error: CLGC TSSI ORx meter failed to update"), + ADI_STRING("The call to perform TSSI ORx measurements failed"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE14Bu, + ADI_STRING("APP Error: CLGC TSSI1 meter failed to update"), + ADI_STRING("The call to perform TSSI1 measurements failed"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE14Cu, + ADI_STRING("APP Error: CLGC TSSI2 meter failed to update"), + ADI_STRING("The call to perform TSSI2 measurements failed"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Reset DFE and try again. Contact ADI if the Problem Persists") + }, + { + 0xE14Du, + ADI_STRING("APP Error: Unexpected event when performing captures"), + ADI_STRING("Unexpected event when performing captures"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Contact ADI with memdump") + }, + { + 0xE14Eu, + ADI_STRING("APP Error: Unexpected capture id when performing captures"), + ADI_STRING("Unexpected capture id when performing captures"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Contact ADI with memdump") + }, + { + 0xE14Fu, + ADI_STRING("APP Error: Cal thread couldn't acquire capture buffer for multiple times"), + ADI_STRING("Capture buffers are in use by some other calibration threads"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Contact ADI with memdump if problem persists") + }, + { + 0xE150u, + ADI_STRING("APP Error: Capture was incomplete"), + ADI_STRING("HW couldn't capture all samples or there were 0 samples in dataset"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check transmit data and TDD settings") + }, + { + 0xE151u, + ADI_STRING("APP Error: Capture was aborted"), + ADI_STRING("Capture is aborted due to mapping change or user abort request"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check mapping settings (RCI mode) or capture period length(RS mode)") + }, + { + 0xE152u, + ADI_STRING("APP Error: Unexpected capture count in capture flow"), + ADI_STRING("Unexpected capture count in capture flow"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Contact ADI with memdump") + }, + { + 0xE153u, + ADI_STRING("APP Error: Unexpected capture period end event in capture flow"), + ADI_STRING("Unexpected capture period end event in capture flow"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Contact ADI with memdump") + }, + { + 0xE154u, + ADI_STRING("APP Error: Capture period ended before all captures complete"), + ADI_STRING("Capture period might be too short or captures taking longer than expected"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check capture period, capture parameters and transmit waveform") + }, + { + 0xE155u, + ADI_STRING("APP Error: Application layer requested requested more than maximum number of captures"), + ADI_STRING("Application layer requested requested more than maximum number of captures"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Contact ADI with memdump") + }, + { + 0xE156u, + ADI_STRING("APP Error: Capture result reports an unexpected error"), + ADI_STRING("Capture result reports an unexpected error"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Contact ADI with memdump") + }, + { + 0xE157u, + ADI_STRING("APP Error: Invalid capture type selected by application thread"), + ADI_STRING("Invalid capture type is selected by application thread"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Contact ADI with memdump") + }, + { + 0xE158u, + ADI_STRING("APP Error: Capture trigger in SW mode has failed"), + ADI_STRING("Capture trigger in SW mode has failed"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Contact ADI with memdump") + }, + { + 0xE159u, + ADI_STRING("APP Error: Null pointer"), + ADI_STRING("Invalid Pointer"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Contact ADI with memdump") + }, + { + 0xE15Au, + ADI_STRING("APP Error: DPD not supported with LUT depth 64 in FDD mode"), + ADI_STRING("Invalid DPD configuration requested"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check DPD configuration") + }, + { + 0xE15Bu, + ADI_STRING("APP Error: DPD update mode 2 or 3 not supported with LUT depth 64"), + ADI_STRING("Invalid DPD configuration requested"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check DPD configuration") + }, + { + 0xE15Cu, + ADI_STRING("APP Error: Only unity gain (Model 4) can be used as low-power/gain-mon recovery model with LUT depth 64"), + ADI_STRING("Invalid DPD configuration requested"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check DPD configuration") + }, + { + 0xE15Du, + ADI_STRING("APP Error: TDD LUT switching is only supported at LUT depth 16"), + ADI_STRING("Invalid DPD configuration requested"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check DPD configuration") + }, + { + 0xE15Eu, + ADI_STRING("APP Error: DPD Update mode 2/3 not supported in FDD mode with LUT depth 32"), + ADI_STRING("Invalid DPD configuration requested"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check DPD configuration") + }, + { + 0xE15Fu, + ADI_STRING("APP Error: Only unity gain (Model 4) can be used as low-power/gain-mon recovery model with LUT depth 32 in FDD mode"), + ADI_STRING("Invalid DPD configuration requested"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check DPD configuration") + }, + { + 0xE160u, + ADI_STRING("APP Error: Model 2 cannot be used for low-power/gain-mon recovery with LUT depth 32"), + ADI_STRING("Invalid DPD configuration requested"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check DPD configuration") + }, + { + 0xE161u, + ADI_STRING("APP Error: Model 1 cannot be used for low-power/gain-mon recovery with DPD update mode 2"), + ADI_STRING("Invalid DPD configuration requested"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check DPD configuration") + }, + { + 0xE162u, + ADI_STRING("APP Error: TDD LUT switching is not supported in FDD mode"), + ADI_STRING("Invalid DPD configuration requested"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check DPD configuration") + }, + { + 0xE163u, + ADI_STRING("APP Error: Cap sequencer config out of range"), + ADI_STRING("Invalid configuration"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check capture sequencer config parameter") + }, + { + 0xE164u, + ADI_STRING("APP Error: Cap sequencer command not supported in this mode"), + ADI_STRING("Invalid configuration"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check mapping operation mode, RCI/RS/Dfe mapping control") + }, + { + 0xE165u, + ADI_STRING("APP Error: Not enough memory to respond to VSWR command"), + ADI_STRING("Invalid buffer size passed to VSWR command handler"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check VSWR command data") + }, + { + 0xE166u, + ADI_STRING("APP Error: VSWR Waveform get failed"), + ADI_STRING("Vswr generator might be enabled or waveform length is invalid"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check VSWR waveform length") + }, + { + 0xE167u, + ADI_STRING("APP Error: VSWR Waveform length is 0"), + ADI_STRING("Waveform is not loaded"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Load VSWR waveform before enabling cal") + }, + { + 0xE168u, + ADI_STRING("APP Error: Stop Criteria not met"), + ADI_STRING("Stop Criteria in Pass On Stop not met"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check if the stopping criteria is set properly") + }, + { + 0xE169u, + ADI_STRING("APP Error: Signal Stats Generation Error"), + ADI_STRING("Capture Configuration"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check if capture engine is configured correctly") + }, + { + 0xE16Au, + ADI_STRING("APP Error: Target values were not populated"), + ADI_STRING("Capture configuration"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check if capture engine is configured correctly") + }, + { + 0xE16Bu, + ADI_STRING("APP Error: Capture weights in ctc1 mode are not valid"), + ADI_STRING("Capture configuration"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check if capture weights in ctc1 mode are configured correctly") + }, + { + 0xE16Cu, + ADI_STRING("APP Error: CT FLUT buffer acquire failed"), + ADI_STRING("CT FLUT Buffer not Available"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check that if buffers are available") + }, + { + 0xE16Du, + ADI_STRING("APP Error: CTC FLUT Copy"), + ADI_STRING("LUT copy timedout or DMA error reported"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Contact ADI with memdump") + }, + { + 0xE16Eu, + ADI_STRING("APP Error: CTC Model config failed"), + ADI_STRING("Invalid configuration or out of range parameter"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check CTC model configuration") + }, + { + 0xE16Fu, + ADI_STRING("APP Error: CTC Act delay get failed"), + ADI_STRING("CTC driver mutex lock might have failed"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Contact ADI with memdump") + }, + { + 0xE170u, + ADI_STRING("APP Error: CTC Act Fbox scaler get failed"), + ADI_STRING("CTC driver mutex lock might have failed"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Contact ADI with memdump") + }, + { + 0xE171u, + ADI_STRING("APP Error: CTC Actuator enable failed"), + ADI_STRING("CTC driver mutex lock might have failed"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Contact ADI with memdump") + }, + { + 0xE172u, + ADI_STRING("APP Error: CTC Actuator reset failed"), + ADI_STRING("CTC driver mutex lock might have failed"), + ADI_ADRV904X_ERR_ACT_RESET_FEATURE, + ADI_STRING("Contact ADI with memdump") + }, + { + 0xE173u, + ADI_STRING("APP Error: CTC Act Fbox scaler set failed"), + ADI_STRING("Fbox scaler is smaller than model config requires"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Increase fbox scaler value") + }, + { + 0xE174u, + ADI_STRING("APP Error: Lut update DMA request cannot be implemented"), + ADI_STRING("Lack of TX falling edge"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Enable TX channel or shorten the TX on time") + }, + { + 0xE175u, + ADI_STRING("APP Error: calType to request feature compute"), + ADI_STRING("Invalid Calibration Type Provided to Function"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Feature Compute calType Parameter is Valid") + }, + { + 0xE176u, + ADI_STRING("APP Error: Unexpected Feature Compute Event"), + ADI_STRING("Unexpected Error"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Contact ADI with memdump if the Problem Persists") + }, + { + 0xE177u, + ADI_STRING("APP Error: Invalid Feature Compute Entries"), + ADI_STRING("Unexpected Error"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Contact ADI with memdump if the Problem Persists") + }, + { + 0xE178u, + ADI_STRING("APP Error: DPD Update mode 3 only supported with LUT depth 16, when model 2 is not being used for recovery"), + ADI_STRING("Invalid DPD configuration requested"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check DPD configuration") + }, + { + 0xE179u, + ADI_STRING("APP Error: DPD partial update failed because the partial times over maximum times"), + ADI_STRING("Too many DPD coefficients to handle"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check DPD configuration") + }, + { + 0xE180u, + ADI_STRING("APP Error: Out of range block id during decomposition"), + ADI_STRING("Unexpected Error"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Contact ADI with memdump if the Problem Persists") + }, + { + 0xE181u, + ADI_STRING("APP Error: DPD couldn't find an available iteration type(GMP or CTC2) to run"), + ADI_STRING("No GMP and/or CTC2 models configured"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Configure a GMP model before enabling DPD cal") + }, + { + 0xE182u, + ADI_STRING("APP Error: indirect learning is set for partial update"), + ADI_STRING("customer configured indirect learning"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Configure direct learning if using partial update") + }, +/* END AUTOGENERATED CPU RUNTIME ERROR TABLE */ +}; + +#endif /* _ADRV904X_DFE_APP_ERROR_TABLES_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_cfr.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_cfr.h new file mode 100644 index 00000000000..6133dcc6201 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_cfr.h @@ -0,0 +1,164 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adrv904x_dfe_cfr.h + * \brief Contains ADRV904X Tx related private function prototypes for + * adrv904x_dfe_cfr.c which helps adi_adrv904x_dfe_cfr.c + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADRV904X_DFE_CFR_H_ +#define _ADRV904X_DFE_CFR_H_ + + +#include "adi_adrv904x_tx_types.h" +#include "adi_adrv904x_error.h" + +#include "../../private/bf/adrv904x_bf_tx_datapath.h" + +#include "../../private/bf/adrv904x_bf_tx_cfr_reg.h" +/** +* \brief Look up the Tx cfr reg bitfield address given a Tx Channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] txChannel Channel selection to read back gain index for (Valid Tx0-Tx7 only) +* \param[out] cfrChannelBitfieldAddr Tx cfr channel bitfield address which will be updated by this function +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CfrRegsBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adrv904x_BfTxCfrRegChanAddr_e* const cfrChannelBitfieldAddr); + + +/** +* \brief Calculate and write CFR Threshold Square value to selected engine's selected CFG's +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] cfrPeakThresholdScaler Scaler for peak threshold +* \param[in] cfrPeakThreshold Peak threshold value +* \param[in] engineBaseAddr Engine bf base address +* \param[in] configSelectMask Configuration select, CFG0/CFG1/Both +* \param[in] engineId Engine Id, 0:Engine 0 // 1:Engine 1 // 2:Engine 2 +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CfrWritePeakThreshSq(adi_adrv904x_Device_t* const device, + const uint32_t cfrPeakThresholdScaler, + const uint32_t cfrPeakThreshold, + const adrv904x_BfTxCfrRegChanAddr_e engineBaseAddr, + const uint32_t configSelectMask, + const uint8_t engineId); + +/** +* \brief Calculate and write CFR Threshold Sqrt value to selected engine's selected CFG's +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] cfrPeakThresholdScaler Scaler for peak threshold +* \param[in] cfrPeakThreshold Peak threshold value +* \param[in] engineBaseAddr Engine bf base address +* \param[in] configSelectMask Configuration select, CFG0/CFG1/Both +* \param[in] engineId Engine Id, 0:Engine 0 // 1:Engine 1 // 2:Engine 2 +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CfrWritePeakThreshSqrt(adi_adrv904x_Device_t* const device, + const uint32_t cfrPeakThresholdScaler, + const uint32_t cfrPeakThreshold, + const adrv904x_BfTxCfrRegChanAddr_e engineBaseAddr, + const uint32_t configSelectMask, + const uint8_t engineId); + +/** +* \brief Calculate and write CFR Correction Threshold value to selected engine's selected CFG's +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] cfrCorrectionThresholdScaler Correction scaler for peak threshold +* \param[in] cfrPeakThreshold Peak threshold value +* \param[in] engineBaseAddr Engine bf base address +* \param[in] configSelectMask Configuration select, CFG0/CFG1/Both +* \param[in] engineId Engine Id, 0:Engine 0 // 1:Engine 1 // 2:Engine 2 +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CfrWriteCorrectionThresh(adi_adrv904x_Device_t* const device, + const uint32_t cfrCorrectionThresholdScaler, + const uint32_t cfrPeakThreshold, + const adrv904x_BfTxCfrRegChanAddr_e engineBaseAddr, + const uint32_t configSelectMask, + const uint8_t engineId); +/** +* \brief Write CFR Pulse private helper function +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] pulseSelect Pulse selection +* \param[in] txChanIdx Channel Id to write the pulse to +* \param[in] interpolationRate Interpolation rate configured for the selected pulse +* \param[in] cfrCorrectionPulse Pointer to data structure which contains the pulse data +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CfrCorrectionPulseWrite(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CfrPulseSel_e pulseSelect, + const uint32_t txChanIdx, + const uint8_t interpolationRate, + const adi_adrv904x_CfrCorrectionPulse_t* const cfrCorrectionPulse); + +/** +* \brief Range check CFR pulse data +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] cfrPulseData Pulse data to range check +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CfrPulseWriteRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CfrCorrectionPulse_t * const cfrPulseData); + +/** +* \brief Returns data path base address for selected channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] txChannel Tx channel selection +* \param[out] txDatapathChannelBitfieldAddr Data path base address of selected channel +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CfrDatapathBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adrv904x_BfTxDatapathChanAddr_e* const txDatapathChannelBitfieldAddr); + +#endif /* _ADRV904X_DFE_CFR_H_ */ \ No newline at end of file diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_cpu.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_cpu.h new file mode 100644 index 00000000000..d2085ffc814 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_cpu.h @@ -0,0 +1,555 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adrv904x_dfe_cpu.h + * \brief Contains ADRV904X DFE CPU related private function prototypes for + * adrv904x_dfe_cpu.c. + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADRV904X_DFE_CPU_H_ +#define _ADRV904X_DFE_CPU_H_ + +#include "adi_adrv904x_error.h" +#include "adi_adrv904x_dfe_cpu_types.h" +#include "adi_adrv904x_dfe_framework_tracking_cal_t.h" +#include "adi_adrv904x_dfe_vswr.h" +#include "adi_adrv904x_dfe_cpu_pintsw_status_types.h" +#include "adi_adrv904x_cpu_sys_types.h" +#include "../../private/bf/adrv904x_bf_core.h" +#include "../../private/include/adrv904x_cpu_scratch_registers.h" +#include "../../private/include/adrv904x_cpu_types.h" +#include "../../private/include/adrv904x_cpu_cmd_intf.h" +#include "../../private/include/adrv904x_dfe_memory.h" +#include "../../private/include/adrv904x_dfe_svc_cmd_force_exception.h" +#include "../../private/include/adrv904x_dfe_framework_cmd_sys_status_t.h" +#include "../../private/include/adrv904x_cpu_object_ids_types.h" +#include "../../private/include/adrv904x_dfe_svc_cmd_t.h" +#include "adi_adrv904x_dfe_svc_log_trace_events_t.h" + +/*!< Get the address of a specific member of the DFE init structure */ +#define ADRV904X_DFE_CPU_INIT_ADDR_GET( entry ) ( ADRV904X_DFE_CODE_MEM_REGION_END - \ + sizeof(adrv904x_DfeMemInitTemp_t) + \ + ADI_LIBRARY_OFFSETOF(adrv904x_DfeMemInitTemp_t, entry ) ) + + +#define ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_RETURN(cmdStatusErrorCode, cmdStatus, cpuErrorCode, recoveryAction) \ + \ +if (cmdStatus == ADRV904X_CPU_CMD_STATUS_CMD_FAILED) \ +{ \ + cpuErrorCode = ADRV904X_CTOHL(cmdStatusErrorCode); \ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_DFE_SVC_RUNTIME, \ + cpuErrorCode, \ + cmdStatus, \ + recoveryAction); \ + return recoveryAction; \ +} \ +else \ +{ \ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_DFE_CPU, \ + ADI_ADRV904X_ERRCODE_DFE_CPU_CMD_RESPONSE, \ + cmdStatus, \ + recoveryAction); \ + return recoveryAction; \ +} \ + +#define ADI_ADRV904X_DFE_CPU_APP_RESP_CHECK_RETURN(cmdStatusErrorCode, cmdStatus, cpuErrorCode, recoveryAction) \ + \ +if (cmdStatus == ADRV904X_CPU_CMD_STATUS_CMD_FAILED) \ +{ \ + cpuErrorCode = ADRV904X_CTOHL(cmdStatusErrorCode); \ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_DFE_APP_RUNTIME, \ + cpuErrorCode, \ + cmdStatus, \ + recoveryAction); \ + return recoveryAction; \ +} \ +else \ +{ \ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_DFE_CPU, \ + ADI_ADRV904X_ERRCODE_DFE_CPU_CMD_RESPONSE, \ + cmdStatus, \ + recoveryAction); \ + return recoveryAction; \ +} \ + +#define ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(cmdStatusErrorCode, cmdStatus, cpuErrorCode, recoveryAction, label)\ + \ +if (cmdStatus == ADRV904X_CPU_CMD_STATUS_CMD_FAILED) \ +{ \ + cpuErrorCode = ADRV904X_CTOHL(cmdStatusErrorCode); \ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_DFE_SVC_RUNTIME, \ + cpuErrorCode, \ + cmdStatus, \ + recoveryAction); \ + goto label; \ +} \ +else \ +{ \ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_DFE_CPU, \ + ADI_ADRV904X_ERRCODE_DFE_CPU_CMD_RESPONSE, \ + cmdStatus, \ + recoveryAction); \ + goto label; \ +} + +#define ADI_ADRV904X_DFE_APP_CMD_RESP_CHECK_GOTO(cmdStatusErrorCode, cmdStatus, cpuErrorCode, recoveryAction, label)\ + \ +if (cmdStatus == ADRV904X_CPU_CMD_STATUS_CMD_FAILED) \ +{ \ + cpuErrorCode = ADRV904X_CTOHL(cmdStatusErrorCode); \ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_DFE_APP_RUNTIME, \ + cpuErrorCode, \ + cmdStatus, \ + recoveryAction); \ + goto label; \ +} \ +else \ +{ \ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_DFE_CPU, \ + ADI_ADRV904X_ERRCODE_DFE_CPU_CMD_RESPONSE, \ + cmdStatus, \ + recoveryAction); \ + goto label; \ +} + + +#define ADI_ADRV904X_DFE_APP_CMD_RESP_CHECK_RETURN(cmdStatusErrorCode, cmdStatus, cpuErrorCode, recoveryAction) \ + \ +if (cmdStatus == ADRV904X_CPU_CMD_STATUS_CMD_FAILED) \ +{ \ + cpuErrorCode = ADRV904X_CTOHL(cmdStatusErrorCode); \ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_DFE_APP_RUNTIME, \ + cpuErrorCode, \ + cmdStatus, \ + recoveryAction); \ + return recoveryAction; \ +} \ +else \ +{ \ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_DFE_CPU, \ + ADI_ADRV904X_ERRCODE_DFE_CPU_CMD_RESPONSE, \ + cmdStatus, \ + recoveryAction); \ + return recoveryAction; \ +} \ + +#define ADI_ADRV904X_DFE_APP_CMD_RESP_CHECK_GOTO(cmdStatusErrorCode, cmdStatus, cpuErrorCode, recoveryAction, label)\ + \ +if (cmdStatus == ADRV904X_CPU_CMD_STATUS_CMD_FAILED) \ +{ \ + cpuErrorCode = ADRV904X_CTOHL(cmdStatusErrorCode); \ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_DFE_APP_RUNTIME, \ + cpuErrorCode, \ + cmdStatus, \ + recoveryAction); \ + goto label; \ +} \ +else \ +{ \ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_DFE_CPU, \ + ADI_ADRV904X_ERRCODE_DFE_CPU_CMD_RESPONSE, \ + cmdStatus, \ + recoveryAction); \ + goto label; \ +} +/** +* \brief Get DFE SDK LID Version Global Address +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[out] dfeSdkDataAddr Pointer to DFE SDK DATA Address +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_DfeSdkDataAddrGet(adi_adrv904x_Device_t* const device, + uint32_t* const dfeSdkDataAddr); + +/** +* \brief Set capture buffer access parameters for selected cal and channels +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] txChannelMask Tx channel mask to apply the command +* \param[in] objId Cal obj id +* \param[in] cpuCmd Cal specific ctrl command for selected object id +* \param[in] capBufAccessSet Pointer to the DPD Capture Buffers Access config structure which contains the configuration to be set in FW +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_DfeCaptureBuffersAccessSet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const uint32_t objId, + const uint16_t cpuCmd, + adi_adrv904x_DfeAppFrameworkTrackingCalCapBufAccessSet_t* const capBufAccessSet); + +/** +* \brief Get capture buffer access parameters for selected cal and channels +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] txChannelSel Tx channel selection to read the capture buffer data +* \param[in] objId Cal obj id +* \param[in] cpuCmd Cal specific ctrl command for selected object id +* \param[out] capBufAccessGet Pointer to the DPD Capture Buffers data structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_DfeCaptureBuffersAccessGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannelSel, + const uint32_t objId, + const uint16_t cpuCmd, + adi_adrv904x_DfeAppFrameworkTrackingCalCapBufAccessGet_t* const capBufAccessGet); + +/** +* \brief Calculates a standard 32 bit crc for a block of data +* \details The seedCrc in first block must be set to 0xFFFFFFFF and finalCrc must +* be set to 1 on the last block. +* Polynomial: 0x04C11DB7 +* Shift: Left +* Reverse Data: Yes +* Reverse CRC on final block: Yes +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] buf buffer containing the data on which the crc will be calculated. +* \param[in] bufLen the number of bytes in the buffer +* \param[in] seedCrc initial CRC value. +* \param[in] finalCrc flag indicating that the block is final +* +* \retval calculated CRC. This value must be fed back into seedCRC on subsequent calls. +*/ +unsigned int adrv904x_DfeCrc32Chunk( const uint8_t buf[], + const uint32_t bufLen, + const uint32_t seedCrc, + const uint8_t finalCrc ); + + +/** +* \brief Send a service command to the DFE and receive a command response +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param device Structure pointer to the ADRV904X data structure containing settings +* \param linkId ID of the desired CPU's link for the command +* \param cmdId ID of the service command to send +* \param pCmdPayload Pointer to the data payload to send with this command. Optional. Set to NULL if not needed. +* \param cmdPayloadSize Size of data payload, in bytes. Set to zero if pCmdPayload is set to NULL. +* \param[out] pRespPayload Pointer to buffer in which command response payload should be placed. Optional. Set to NULL if not needed. +* \param respPayloadSz Amount of data to copy into pRespPayload, in bytes. Set to zero if pRespPayload is set to NULL. +* \param[out] status Status of command response. Optional. Set to NULL if not needed. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_DfeSvcCmdSend(adi_adrv904x_Device_t* const device, + const adrv904x_LinkId_e linkId, + const uint8_t cmdId, + void* const pCmdPayload, + const size_t cmdPayloadSz, + void* const pRespPayload, + const size_t respPayloadSz, + adrv904x_DfeSvcCmdStatus_t* const status); + +/** +* \brief Send an application command to the DFE and receive a command response +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param device Structure pointer to the ADRV904X data structure containing settings +* \param linkId ID of the desired CPU's link for the command +* \param cmdId ID of the application command to send +* \param pCmdPayload Pointer to the data payload to send with this command. Optional. Set to NULL if not needed. +* \param cmdPayloadSize Size of data payload, in bytes. Set to zero if pCmdPayload is set to NULL. +* \param[out] pRespPayload Pointer to buffer in which command response payload should be placed. Optional. Set to NULL if not needed. +* \param respPayloadSz Amount of data to copy into pRespPayload, in bytes. Set to zero if pRespPayload is set to NULL. +* \param[out] status Status of command response. Optional. Set to NULL if not needed. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_DfeAppCmdSend(adi_adrv904x_Device_t* const device, + const adrv904x_LinkId_e linkId, + const uint8_t cmdId, + void* const pCmdPayload, + const size_t cmdPayloadSz, + void* const pRespPayload, + const size_t respPayloadSz, + adrv904x_DfeSvcCmdStatus_t* const status); + +/** +* \brief Function used by ADRV904X API to test API/FW Ping +* +* This function sends a Ping command through the CPU Mailbox interface to see if the CPU is functioning +* +* \pre This function may be called any time after device initialization +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device data structure containing settings +* \param[in] cpuType Selection of the desired CPU processor to execute this command on. +* \param[in] writeData data write to CPU. +* \param[out] readData data read from CPU. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_DfeCpuAppPing(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType, + const uint32_t writeData, + uint32_t* const readData); + +/** +* \brief Validate the Packaging Information +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param device Structure pointer to the ADRV904X data structure containing settings +* \param cpuDfeBinaryInfo adi_adrv904x_DfeCpuBinaryInfo_t to be checked +* +* \retv ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ + ADI_API adi_adrv904x_ErrAction_e adrv904x_PackagingInformationValidate(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeCpuBinaryInfo_t* const cpuDfeBinaryInfo); + /** + * \brief Get exception data from BBIC bridge + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param device Structure pointer to the ADRV904X data structure containing settings + * \param dfeExceptionData adrv904x_DfeSvcCmdDfeExceptionData_t structure to copy exception data into + * + * \retv ADI_ADRV904X_ERR_ACT_NONE if Successful + */ + ADI_API adi_adrv904x_ErrAction_e adrv904x_DfeExceptionDataGet(adi_adrv904x_Device_t* const device, + adrv904x_DfePlatformExceptionData_t* dfeExceptionData); + +/** +* \brief Calculates a standard 32 bit crc for a block of data +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] objId the calibration object ID to get the calibration status from +* \param[in] channel the channel to get the calibration status from +* \param[out] status the structure containing the status information from the specified +* channel and calibration object ID. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +adi_adrv904x_ErrAction_e adrv904x_DfeCalCommonStatusGet(adi_adrv904x_Device_t* const device, + const uint32_t objId, + const adi_adrv904x_Channels_e channel, + adi_adrv904x_CalStatus_t* const status); +/** +* \brief Top level Send/Receive System Status command for public status +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] objId the object ID to get the system status from +* \param[in] channel the channel to get the system status from +* \param[in,out] status the structure containing the status information from the specified +* channel and calibration object ID. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +adi_adrv904x_ErrAction_e adrv904x_DfeSysStatusGet(adi_adrv904x_Device_t* const device, + const adrv904x_CpuObjectId_e objId, + const adi_adrv904x_Channels_e channel, + adi_adrv904x_CpuSysStatus_t* const status); + +/** +* \brief Sends a DfeGetStatus command +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] type either public or private system status +* \param[in] sysObjId object ID in the system to get the status from +* \param[in] channel the channel to get the system status from +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +adi_adrv904x_ErrAction_e adrv904x_DfeSendSysStatusCmd(adi_adrv904x_Device_t* const device, + const adrv904x_DfeFrameworkCmdSysStatusType_e type, + const adrv904x_CpuObjectId_e sysObjId, + const adi_adrv904x_Channels_e channel); + +/** +* \brief Gets the response to a DfeGetSysStatus command +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] channel to get the response from +* \param[in] sysStatusSize size of the expected system status +* \param[in,out] RxBuf Received data buffer +* \param[out] SysStatus status of the system status request +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +adi_adrv904x_ErrAction_e adrv904x_DfeGetSysStatusCmdResp(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + const size_t sysStatusSize, + void* const RxBuf, + const void** const SysStatus); + +/** +* \brief Converts a tracking cal mask enumeration to an object ID +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] calId enumerated tracking cal mask +* +* \retval Object ID associated with the provided enumerated tracking cal +*/ +uint32_t adrv904x_DfeTrackingCalToObjId(const adi_adrv904x_DfeAppFrameworkTrackingCalibrationMask_e calId); + +/** +* \brief Verify that the channel provided is an available one in the system +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] channel enumerated value indicating a particular channel +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if the channel has been verified +*/ +adi_adrv904x_ErrAction_e adrv904x_DfeVerifyChannel(const adi_adrv904x_Channels_e channel); + +/** +* \brief Finds the bit position of the first 1 in a bitfield +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] mask bitfield potentially containing one or more 1s +* +* \retval bit location of the first 1 in mask +*/ +uint32_t adrv904x_DfeGetBitPosition(const uint32_t mask); + +/** +* \brief Converts the enumerated channel adi_adrv904x_Channels_e to a number +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] mask the enumerated channel mask to convert +* +* \retval channel number +*/ +uint32_t adrv904x_DfeChanMaskToNum(const adi_adrv904x_Channels_e mask); + +/** +* \brief Converts the enumerated channel adi_adrv904x_Channels_e to a channel ID +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] channel adi_adrv904x_Channels_e to be converted +* +* \retval channel ID +*/ +uint32_t adrv904x_DfeChannelToChannelId(const adi_adrv904x_Channels_e channel); + +/** +* \brief Sends command to disable or enable ECC of specified memory regions +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] eccEnableMemRegion bitfield of memory regions to enable or disable for ECC +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +adi_adrv904x_ErrAction_e adrv904x_DfeEccEnableSet(adi_adrv904x_Device_t* const device, + const uint32_t eccEnableMemRegion); + +/** +* \brief Sends command to get the ECC state of specified memory regions (enabled or disabled) +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in,out] eccEnableMemRegion pointer to the bitfield of memory regions state for ECC +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +adi_adrv904x_ErrAction_e adrv904x_DfeEccEnableGet(adi_adrv904x_Device_t* const device, + uint32_t* const eccEnableMemRegion); + +/** +* \brief Read the last errorcode used by the logTrace module from the SDK. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device data structure containing settings +* \param[out] lastErrorCode last errorcode used by the logTrace module +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +adi_adrv904x_ErrAction_e adrv904x_DfeLastErrorCodeGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeSvcLogTraceErrLog_t* const lastErrorCode); + + +/** +* \brief Service to debug dfe cpu after runtime error +* +* \pre This function is called after the dfe cpu has errored +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* +*/ +ADI_API void adrv904x_DfeCpuErrorDebugCheck(adi_adrv904x_Device_t* const device); + + +#endif diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_dpd.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_dpd.h new file mode 100644 index 00000000000..9fee2b7cf9a --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_dpd.h @@ -0,0 +1,126 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adrv904x_dfe_dpd.h + * \brief Contains ADRV904X Tx related private function prototypes for + * adrv904x_dfe_dpd.c which helps adi_adrv904x_dfe_dpd.c + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADRV904X_DFE_DPD_H_ +#define _ADRV904X_DFE_DPD_H_ + +#include "adi_adrv904x_error.h" + +/** +* \brief Performs range check on DPD Model configuration. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] dpdTxChannelMask - Tx channel selected +* \param[in] dpdModelType - selected DPD model type +* \param[in] modelDesc - pointer to DPD model parameter structure configured to be range checked +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +adi_adrv904x_ErrAction_e adrv904x_DpdModelConfigDpdSetRangeCheck(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdModelType_e dpdModelType, + const adi_adrv904x_DfeAppCalDpdModelDesc_t* const modelDesc); + +/** +* \brief Performs range check on DPD CTC Model configuration. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] dpdTxChannelMask - Tx channel selected +* \param[in] dpdModelType - selected DPD model type +* \param[in] modelDesc - pointer to CTC model parameter structure configured to be range checked +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +adi_adrv904x_ErrAction_e adrv904x_DpdModelConfigCtcSetRangeCheck(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdModelType_e dpdModelType, + const adi_adrv904x_DfeAppCalCtcModelDesc_t* const modelDesc); + +/** +* \brief Performs range check on DPD actuator gain monitor configuration. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] dpdTxChannelMask - Tx channel selected +* \param[in] dpdPowerMeterCfg - pointer to DPD power meter structure configured to be range checked +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +adi_adrv904x_ErrAction_e adrv904x_DpdActuatorGainMonitorConfigSetRangeCheck(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdPowerMeterCfg_t* const dpdPowerMeterCfg); + +/** +* \brief Performs range check on DPD capture configuration. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] dpdTxChannelMask - Tx channel selected +* \param[in] dpdCaptureCfg - pointer to DPD capture structure configured to be range checked +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +adi_adrv904x_ErrAction_e adrv904x_DpdCaptureConfigSetRangeCheck(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdCaptureCfg_t* const dpdCaptureCfg); + +/** +* \brief Performs range check on DPD capture configuration. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] dpdTxChannelMask - Tx channel selected +* \param[in] dpdTrackCfg - pointer to DPD tracking structure configured to be range checked +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +adi_adrv904x_ErrAction_e adrv904x_DpdTrackingConfigSetRangeCheck(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdTrackCfg_t* const dpdTrackCfg); + +/** +* \brief Performs range check on DPD TDD Lut Switch configuration. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] dpdTxChannelMask - Tx channel selected +* \param[in] tddLutSwitchConfig - pointer to DPD TDD Lut Switch structure configured to be range checked +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +adi_adrv904x_ErrAction_e adrv904x_DpdTddLutSwitchCfgSetRangeCheck(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppDpdActTddLutSwitch_t* const tddLutSwitchConfig); + +#endif /* _ADRV904X_DFE_DPD_H_ */ \ No newline at end of file diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_framework_cmd_sys_status_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_framework_cmd_sys_status_t.h new file mode 100644 index 00000000000..b3412a0dbce --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_framework_cmd_sys_status_t.h @@ -0,0 +1,103 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2020 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adrv904x_dfe_framework_cmd_sys_status_t.h + * + * \brief type definitions for ADI_ADRV904X_DFE_FRAMEWORK_CMD_ID_GET_SYS_STATUS + * + * DFE SDK Version: 2.10.0.4 + */ + +#ifndef __FRAMEWORK_CMD_SYS_STATUS_T_H__ +#define __FRAMEWORK_CMD_SYS_STATUS_T_H__ + +#include "adrv904x_dfe_framework_cmd_t.h" + +/*!< maximum length of the SYS_STATUS payload */ +#define ADRV904X_DFE_FRAMEWORK_CMD_SYS_STATUS_MAX_PAYLOAD_LEN (256) /*!< Maximum payload length of system status command */ + +/*!< Dummy driver object, used for testing */ +#define ADRV904X_DFE_APP_FRAMEWORK_CMD_OBJID_DRV_DUMMY (0xF0u) /*!< Dummy driver object for testing */ + +/** + * \brief System status type enumeration + */ +typedef enum adrv904x_DfeAppFrameworkCmdSysStatusType +{ + ADRV904X_DFE_FRAMEWORK_CMD_SYS_STATUS_PUBLIC, /*!< Public System status */ + ADRV904X_DFE_FRAMEWORK_CMD_SYS_STATUS_PRIVATE /*!< Private System status */ +} adrv904x_DfeFrameworkCmdSysStatusType_e; + +/** + * \brief adrv904x_DfeFrameworkCmdSysStatusType_e API size translation + */ +typedef uint8_t adrv904x_DfeAppFrameworkCmdSysStatusType_t; + +/** + * \brief GET_SYS_STATUS command structure + */ +typedef struct adrv904x_DfeAppFrameworkCmdGetSysStatus +{ + adrv904x_DfeAppFrameworkCmdSysStatusType_t statusType; /*!< System statustype to be retrieved */ + uint32_t sysObjId; /*!< Object ID of system component */ + uint32_t channelNum; /*!< Channel number (0 for channel 1, 1 for channel 2, etc.) */ +} adrv904x_DfeAppFrameworkCmdGetSysStatus_t; + + +/** + * \brief System status type enumeration + */ +typedef enum adrv904x_DfeAppFrameworkCmdGetSysStatus_ErrType +{ + ADRV904X_DFE_FRAMEWORK_CMD_SYS_STATUS_NO_ERROR, /*!< no error in response */ + ADRV904X_DFE_FRAMEWORK_CMD_SYS_STATUS_NOT_SUPP /*!< the (sub)system status requested is not supported */ +} adrv904x_DfeFrameworkCmdGetSysStatus_ErrType_e; + +/** + * \brief adrv904x_DfeFrameworkCmdGetSysStatus_ErrType_e API size translation + */ +typedef uint16_t adrv904x_DfeAppFrameworkCmdGetSysStatus_ErrType_t; + + +/** + * \brief GET_SYS_STATUS command response structure + */ +typedef struct adrv904x_DfeAppFrameworkCmdGetSysStatusResp +{ + adrv904x_DfeAppFrameworkCmdGetSysStatus_ErrType_t status; /*!< Command status */ + /* System status payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * void* sysStatus[]; + */ +} adrv904x_DfeAppFrameworkCmdGetSysStatusResp_t; + +/** + * \brief System status payload union. + * Used to determine the maximum system status payload size. + * \note Not instantiated. Only for size calculations. + */ +typedef union adrv904x_DfeAppFrameworkCmdSysStatusMaxSize +{ + uint8_t sysStatusMax[ADRV904X_DFE_FRAMEWORK_CMD_SYS_STATUS_MAX_PAYLOAD_LEN]; /*!< Sys response buffer */ +} adrv904x_DfeAppFrameworkCmdSysStatusMaxSize_t; + +/** + * \brief Status payload size struct. + * Used to determine the maximum cal status payload size. + * \note Not instantiated. Only for size calculations. + */ +typedef struct adrv904x_DfeAppFrameworkCmdGetSysStatusMaxSize +{ + adrv904x_DfeAppFrameworkCmdGetSysStatusResp_t getSysStatusCmdResp; /*!< Sys command response */ + adrv904x_DfeAppFrameworkCmdSysStatusMaxSize_t sysStatusMaxSize; /*!< Sys command response max size */ +} adrv904x_DfeAppFrameworkCmdGetSysStatusMaxSize_t; + +#endif /* __FRAMEWORK_CMD_SYS_STATUS_T_H__ */ + + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_framework_cmd_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_framework_cmd_t.h new file mode 100644 index 00000000000..f4b773dd6a6 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_framework_cmd_t.h @@ -0,0 +1,405 @@ +/** + * Copyright 2020 - 2021 Analog Devices Inc. + * Released under the ADRV904X Software license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file framework_cmd_t.h + * \brief Contains DFE Application type definitions for the ADI Command + * Handler Service. + * + * DFE APP Version: 2.10.0.4 + */ + +#ifndef _FRAMEWORK_CMD_T_H +#define _FRAMEWORK_CMD_T_H + +#include "stdint.h" +#include "stdbool.h" +#include "adi_adrv904x_dfe_svc_err_codes_t.h" +#include "adi_adrv904x_dfe_app_err_codes_t.h" +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_dfe_framework_tracking_cal_t.h" +#include "adi_adrv904x_dfe_app_capture_sequencer_t.h" + + +#define ADRV904X_DFE_APP_FRAMEWORK_CMD_CALFRMWRK_OBJ_TYPE_MASK 0x03 +#define ADRV904X_DFE_APP_FRAMEWORK_CMD_CALFRMWRK_OBJ_TYPE_CAL 0x01 +#define ADRV904X_DFE_APP_FRAMEWORK_CMD_CALFRMWRK_OBJ_TYPE_FRMWRK 0x02 + +#define ADRV904X_DFE_APP_FRAMEWORK_CMD_EVENTCODE (0x00u) + +#define ADRV904X_DFE_APP_FRAMEWORK_CMD_LOG_ENABLE (0) +#define ADI_ADRV904X_DFE_APP_LOG_DPD_ADAPTATION_LOOP_EVENT_DATA (0) +#define ADI_ADRV904X_DFE_APP_LOG_DPD_ADAPTATION_LOOP_CAPTURE_BUF_RELEASES (0) + +typedef enum adrv904x_DfeAppFrameworkCmdOpcode +{ + ADRV904X_DFE_APP_FRAMEWORK_CMD_PING = 0x0000u, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_SETCONFIG = 0x0001u, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_CTRL = 0x0002u, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_DEBUG = 0x0003u, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_ENABLEDISABLE = 0x0004u, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_GETCALSTATUS = 0x0007u, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_GETCONFIG = 0x0008u, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_GETCALSTATE = 0x0009u, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_GETENABLEDISABLE = 0x000Au, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_SETFRMWRKCONFIG = 0x000Du, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_GETFRMWRKCONFIG = 0x000Eu, + ADRV904X_DFE_APP_FRAMEWORK_CMD_SYSTEM_STATUS = 0x000Fu, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_SETTIMER = 0x0010u, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_GETTIMER = 0x0011u, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_SETEXITFLAG = 0x0012u, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_SETCAPSEQCFG = 0x0013u, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_GETCAPSEQCFG = 0x0014u +}adrv904x_DfeAppFrameworkCmdOpcode_e; + +/*! Calibration status type */ +typedef enum adrv904x_DfeAppFrameworkCmdCalStatusType +{ + ADRV904X_DFE_APP_FRAMEWORK_CMD_CAL_STATUS_COMMON, /*!< Common calibration status */ + ADRV904X_DFE_APP_FRAMEWORK_CMD_CAL_STATUS_SPECIFIC, /*!< Calibration-specific status */ + ADRV904X_DFE_APP_FRAMEWORK_CMD_CAL_STATUS_PRIVATE, /*!< Private calibration-specific status */ + ADRV904X_DFE_APP_FRAMEWORK_CMD_CAL_STATUS_NUM_STATUS +} adrv904x_DfeAppFrameworkCmdCalStatusType_e; + +ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppCmd +{ + uint16_t appCmdOpcode; /*!< Application command opcode */ + /* void* appCmdData[]; */ +} adrv904x_DfeAppFrameworkCmdAppCmd_t; +ADI_ADRV904X_PACK_FINISH + + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdGenericCmd +{ + uint32_t generic; /*!< Placeholder data field */ +} adrv904x_DfeAppFrameworkCmdGenericCmd_t; +ADI_ADRV904X_PACK_FINISH + +typedef struct adrv904x_DfeAppFrameworkCmdGenericResp +{ + adi_adrv904x_DfeSvcErrCode_e status; /*!< App error status code */ +} adrv904x_DfeAppFrameworkCmdGenericResp_t; +ADI_ADRV904X_PACK_FINISH + + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppPing +{ + uint32_t echoData; /*!< Data to be echoed back by CPU */ +} adrv904x_DfeAppFrameworkCmdAppPing_t; +ADI_ADRV904X_PACK_FINISH + + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppPingResp +{ + adi_adrv904x_DfeAppErrCode_e status; /*!< CPU error status code */ + uint32_t data; /*!< Echoed data from CPU */ +} adrv904x_DfeAppFrameworkCmdAppPingResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SET_CONFIG command structure + */ + + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppSetConfig +{ + uint32_t objId; /*!< Object ID of calibration or system component */ + uint16_t offset; /*!< Offset into the configuration structure */ + uint16_t length; /*!< Length of the configuration in bytes */ + + /* Config data payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * uint8_t configData[]; + */ +} adrv904x_DfeAppFrameworkCmdAppSetConfig_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SET_CONFIG command response structure + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppSetConfigResp +{ + adi_adrv904x_DfeAppErrCode_e cmdStatus; /*!< Command status */ +} adrv904x_DfeAppFrameworkCmdAppSetConfigResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief GET_CONFIG command structure + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppGetConfig +{ + uint32_t objId; /*!< Object ID of calibration or system component */ + uint16_t offset; /*!< Offset into the configuration structure */ + uint16_t length; /*!< Length of the configuration in bytes */ +} adrv904x_DfeAppFrameworkCmdAppGetConfig_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief GET_CONFIG command response structure + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppGetConfigResp +{ + adi_adrv904x_DfeAppErrCode_e cmdStatus; /*!< Command status */ + + /* Config data payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * uint8_t configData[]; + */ +} adrv904x_DfeAppFrameworkCmdAppGetConfigResp_t; +ADI_ADRV904X_PACK_FINISH + + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppSetEnabledCals +{ + uint32_t calMask; /*!< Cal mask to enable or disable */ + uint32_t channelMask; /*!< Channel mask to apply the command */ + bool bEnable; /*!< false:Disable selected cal/s true:Enable selected cal/s */ +} adrv904x_DfeAppFrameworkCmdAppSetEnabledCals_t; +ADI_ADRV904X_PACK_FINISH + + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppSetEnabledCalsResp +{ + adi_adrv904x_DfeSvcErrCode_e status; /*!< CPU error status code */ +} adrv904x_DfeAppFrameworkCmdAppSetEnabledCalsResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief GET_CAL_STATUS command structure + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppGetCalStatus +{ + adi_adrv904x_DfeAppFrameworkTrackingCalStatusType_e type; /*!< Calibration status type to be retrieved */ + uint32_t calObjId; /*!< Object ID of calibration */ + uint32_t channelNum; /*!< Channel number (0 for channel 1, 1 for channel 2, etc.) */ +} adrv904x_DfeAppFrameworkCmdAppGetCalStatus_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief GET_CAL_STATUS command response structure + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppGetCalStatusResp +{ + adi_adrv904x_DfeAppErrCode_e cmdStatus; /*!< Command status */ + + /* Cal status payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * void* calStatus[]; + */ +} adrv904x_DfeAppFrameworkCmdAppGetCalStatusResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SETEXITFLAG command structure + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppSetExitFlag +{ + uint32_t calObjId; /*!< Object ID of calibration */ + uint32_t channelNum; /*!< Channel number (0 for channel 1, 1 for channel 2, etc.) */ + uint8_t exitFlagVal; /*!< Value to set */ +} adrv904x_DfeAppFrameworkCmdAppSetExitFlag_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SETEXITFLAG command response structure + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppSetExitFlagResp +{ + adi_adrv904x_DfeAppErrCode_e cmdStatus; /*!< Command status */ + + /* Cal status payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * void* calStatus[]; + */ +} adrv904x_DfeAppFrameworkCmdAppSetExitFlagResp_t; +ADI_ADRV904X_PACK_FINISH + + +/** + * \brief SETCAPSEQCFG command structure + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppSetCapSeqCfg +{ + adi_adrv904x_DfeAppCaptureSequencerCfg_t capSeqCfgSet; /*!< Config to set */ +} adrv904x_DfeAppFrameworkCmdAppSetCapSeqCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SETCAPSEQCFG command response structure + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppSetCapSeqCfgResp +{ + adi_adrv904x_DfeAppErrCode_e cmdStatus; /*!< Command status */ + + /* Cal status payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * void* calStatus[]; + */ +} adrv904x_DfeAppFrameworkCmdAppSetCapSeqCfgResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief GETCAPSEQCFG command response structure + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppGetCapSeqCfgResp +{ + adi_adrv904x_DfeAppErrCode_e cmdStatus; /*!< Command status */ + + adi_adrv904x_DfeAppCaptureSequencerCfg_t capSeqCfgGet; /*!< Config to get */ + + /* Cal status payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * void* calStatus[]; + */ +} adrv904x_DfeAppFrameworkCmdAppGetCapSeqCfgResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief GET_TRACKING_CAL_STATE command response structure + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppGetTrackingCalStateResp +{ + adi_adrv904x_DfeAppErrCode_e status; + adi_adrv904x_DfeAppFrameworkTrackingCalState_t calState; +} adrv904x_DfeAppFrameworkCmdAppGetTrackingCalStateResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief GET_ENABLED_TRACKING_CALS command response structure + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppGetEnabledTrackingCalsResp +{ + adi_adrv904x_DfeAppErrCode_e status; + adi_adrv904x_DfeAppFrameworkTrackingCalEnableMasks_t enableMasks; +} adrv904x_DfeAppFrameworkCmdAppGetEnabledTrackingCalsResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SET_CTRL command structure + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppSetCtrl +{ + uint32_t objId; /*!< Object ID of the cal or system component */ + uint16_t ctrlCmd; /*!< Command to be executed */ + uint32_t channelNum; /*!< Channel number (0 for channel 1, 1 for channel 2, etc.) */ + uint16_t length; /*!< Length of the control data in bytes */ + + /* Control data payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * uint8_t ctrlData[]; + */ +} adrv904x_DfeAppFrameworkCmdAppSetCtrl_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SET_CTRL command response structure + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppSetCtrlResp +{ + adi_adrv904x_DfeAppErrCode_e cmdStatus; /*!< Error Code */ + uint16_t length; /*!< Length of the control command response in bytes */ + + /* Control data response payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * uint8_t ctrlResp[]; + */ +} adrv904x_DfeAppFrameworkCmdAppSetCtrlResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief DEBUG command structure + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppDebug +{ + uint32_t objId; /*!< Object ID of the cal or system component */ + uint16_t debugCmd; /*!< Command to be executed */ + uint32_t channelNum; /*!< Channel number (0 for channel 1, 1 for channel 2, etc.) */ + uint16_t length; /*!< Length of the debug data payload in bytes */ + + /* Debug data payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * uint8_t dbgData[]; + */ +} adrv904x_DfeAppFrameworkCmdAppDebug_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief DEBUG command response structure + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppDebugResp +{ + adi_adrv904x_DfeAppErrCode_e cmdStatus; /*!< Error Code */ + uint16_t length; /*!< Length of the response data in bytes */ + + /* Debug data response payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * uint8_t respData[]; + */ +} adrv904x_DfeAppFrameworkCmdAppDebugResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief TRACKINGCAL_SETTIMER command structure + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppSetTimer +{ + adi_adrv904x_DfeAppFrameworkTrackingCalType_t calType; /*!< cal type */ + uint32_t calTimerSetValue; /*!< value of calTimer in mS */ +} adrv904x_DfeAppFrameworkCmdAppSetTimer_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief TRACKINGCAL_SETTIMER command response structure + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppSetTimerResp +{ + adi_adrv904x_DfeAppErrCode_e cmdStatus; /*!< Error Code */ +} adrv904x_DfeAppFrameworkCmdAppSetTimerResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief TRACKINGCAL_GETTIMER command structure + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppGetTimer +{ + adi_adrv904x_DfeAppFrameworkTrackingCalType_t calType; /*!< cal timer type */ +} adrv904x_DfeAppFrameworkCmdAppGetTimer_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief TRACKINGCAL_SETTIMER command response structure + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeAppFrameworkCmdAppGetTimerResp +{ + adi_adrv904x_DfeAppErrCode_e cmdStatus; /*!< Error Code */ + uint32_t calTimerGetValue; /*!< value of calTimer specified in adrv904x_DfeAppFrameworkCmdAppGetTimer_t in mS */ +} adrv904x_DfeAppFrameworkCmdAppGetTimerResp_t; +ADI_ADRV904X_PACK_FINISH + +#endif /* _FRAMEWORK_CMD_T_H */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_memory.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_memory.h new file mode 100644 index 00000000000..9ffd2947304 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_memory.h @@ -0,0 +1,28 @@ +/** + * Copyright 2020 - 2021 Analog Devices Inc. + * Released under the ADRV904X Software license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adrv904x_dfe_memory.h + * \brief This file contains DFE memory definitions + * + * DFE SDK API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_DFE_MEMORY_H__ +#define __ADRV904X_DFE_MEMORY_H__ + +/* Starting address of DFE RAM */ +#define ADRV904X_DFE_CODE_MEM_REGION_START (0xC0000000U) + +/* Ending address of DFE RAM */ +#define ADRV904X_DFE_CODE_MEM_REGION_END (0xC0800000U) + +/* Ending address of DFE RAM */ +#define ADRV904X_DFE_CODE_MEM_REGION_SIZE (ADRV904X_DFE_CODE_MEM_REGION_END - ADRV904X_DFE_CODE_MEM_REGION_START) + +#endif /* __ADRV904X_DFE_MEMORY_H__*/ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_osal_util_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_osal_util_t.h new file mode 100644 index 00000000000..bc24eea51be --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_osal_util_t.h @@ -0,0 +1,91 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adrv904x_dfe_osal_util_t.h + * + * \brief Contains shared types used for OSAL data logging. + * \details Contains enums and typedefs which are shared between the BBIC and DFE and used for logging OSAL information. + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_DFE_OSAL_UTIL_T_H__ +#define __ADRV904X_DFE_OSAL_UTIL_T_H__ + +#include +#include "adi_adrv904x_platform_pack.h" + +/* + ******************************************************************************* + * GLOBAL VARIABLES + ******************************************************************************* + */ + +extern uint32_t g_dfeCrc; +extern uint32_t g_bbicCrc; + +#define ADRV904X_DFE_OSAL_UTIL_INVALID_NODE_IDX (0xFFFFFFFFU) + +/*!< The link element can store either FOUR 8 bit word type data, or TWO 32 bit word type data, or ONE 64 bit type data */ +typedef union adrv904x_DfeOsalUtilLinkElemType +{ + uint8_t bData[4]; + uint32_t wData[2]; + uint64_t xData; +}adrv904x_DfeOsalUtilLinkElemType_t; + +typedef enum adrv904x_DfeOsalUtilLogDataItem +{ + ADRV904X_DFE_OSAL_UTIL_LOG_THREAD = 0, + ADRV904X_DFE_OSAL_UTIL_LOG_MUTEX, + ADRV904X_DFE_OSAL_UTIL_LOG_EVENT_FLAG, + ADRV904X_DFE_OSAL_UTIL_LOG_TIMER, + ADRV904X_DFE_OSAL_UTIL_LOG_QUEUE, + ADRV904X_DFE_OSAL_UTIL_LOG_SEM, + ADRV904X_DFE_OSAL_UTIL_LOG_BLOCK_POOL, + ADRV904X_DFE_OSAL_UTIL_LOG_CRC, + ADRV904X_DFE_OSAL_UTIL_LOG_DFE_PROFILE, + ADRV904X_DFE_OSAL_UTIL_LOG_CPU_LOADINFO, + ADRV904X_DFE_OSAL_UTIL_LOG_MAX_ITEM, +}adrv904x_DfeOsalUtilLogDataItem_e; + +typedef uint16_t adrv904x_DfeOsalUtilLogDataItem_t; + +#define ADRV904X_DFE_OSAL_UTIL_LOG_METUX_NOT_NEEDED (0U) +#define ADRV904X_DFE_OSAL_UTIL_LOG_METUX_NEEDED (1U) + +ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeOsalUtilLink +{ + adrv904x_DfeOsalUtilLinkElemType_t element; + struct adrv904x_DfeOsalUtilLink *next; +}adrv904x_DfeOsalUtilLinkNode_t; +ADI_ADRV904X_PACK_FINISH + +typedef adrv904x_DfeOsalUtilLinkNode_t *adrv904x_DfeOsalUtilLogLink_t; + +ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeOsalUtilLogDataUnit +{ + adrv904x_DfeOsalUtilLogLink_t logLink; /*!< The pointer of osal log data */ + uint32_t mtxFlag; /*!< The Flag to indication whether mutex is used */ + uint32_t count; +}adrv904x_DfeOsalUtilLogDataUnit_t; +ADI_ADRV904X_PACK_FINISH + + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeOsalUtilLogData +{ + adrv904x_DfeOsalUtilLogDataUnit_t osalLogData[ADRV904X_DFE_OSAL_UTIL_LOG_MAX_ITEM]; +}adrv904x_DfeOsalUtilLogData_t; +ADI_ADRV904X_PACK_FINISH + +#endif + + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_platform_exception_handler_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_platform_exception_handler_t.h new file mode 100644 index 00000000000..2f4ff4f68fa --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_platform_exception_handler_t.h @@ -0,0 +1,111 @@ +/** + * Copyright 2021 Analog Devices Inc. + * Released under the ADRV904X Software license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file platform_exception_handler_t.h + * \brief This file contains the platform specific definitions for the DFE + * exception handler. + * + * DFE SDK API Version: 2.10.0.4 + */ +#include "adi_adrv904x_platform_pack.h" + +#ifndef __ADRV904X_DFE_PLATFORM_EXCEPTION_HANDLER_T_H__ +#define __ADRV904X_DFE_PLATFORM_EXCEPTION_HANDLER_T_H__ + +#define ADRV904X_DFE_PLATFORM_NUM_CORES (4u) + +typedef enum adrv904x_DfePlatformExceptionFlag +{ + ADRV904X_DFE_PLATFORM_NO_EXCEPTION = 0u, /*!< 0x00000000 - CPU running normally */ + ADRV904X_DFE_PLATFORM_EXCEPTION_ENTERED = 0x11111111u, /*!< 0x11111111 - Exception handler entered, no snapshot data */ + ADRV904X_DFE_PLATFORM_EXCEPTION_COMPLETED = 0x33333333u /*!< 0x33333333 - Exception handler complete, valid snapshot data */ +} adrv904x_DfePlatformExceptionFlag_e; + +/** + * \brief adrv904x_DfePlatformExceptionFlag_e size translation + */ +typedef uint32_t adrv904x_DfePlatformExceptionFlag_t; + +typedef enum adrv904x_DfePlatformExceptionEntry +{ + ADRV904X_DFE_PLATFORM_EXCEPTION_ENTRY_NONE = 0u, /*!< 0x00000000 - CPU running normally */ + ADRV904X_DFE_PLATFORM_EXCEPTION_ENTRY_SYNC = 0x1u, /*!< 0x00000001 - Exception handler entered from the "syncFirstLevelHandler" */ + ADRV904X_DFE_PLATFORM_EXCEPTION_ENTRY_NMI = 0x2u, /*!< 0x00000002 - Exception handler entered from the "NMI Handler" */ + ADRV904X_DFE_PLATFORM_EXCEPTION_ENTRY_ASSERT = 0x4u /*!< 0x00000004 - Exception handler entered from the assertion */ +}adrv904x_DfePlatformExceptionEntry_e; + +/** + * \brief adrv904x_DfePlatformExceptionEntry_t size translation + */ +typedef uint8_t adrv904x_DfePlatformExceptionEntry_t; + +/* System registers which are collected from the demo code + * https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/tree/bl31/aarch64/crash_reporting.S#n334 + * All the definitions can be found in the ARM Architecture Reference Manual for ARMv8 + */ + +/* The definition of A55 CPU exception register snapshot data */ +ADI_ADRV904X_PACK_START +typedef struct +{ + uint64_t sp_el1; /*!< Stack pointer of EL1 */ + uint64_t spsr_el1; /*!< Saved Program Status Register of EL1 */ + uint64_t elr_el1; /*!< Exception Link Register */ + uint64_t sctlr_el1; /*!< System Control Registers of EL1 */ + uint64_t actlr_el1; /*!< Auxiliary Control Register of EL1 */ + uint64_t cpacr_el1; /*!< Architectural Feature Access Control Register of EL1 */ + uint64_t csselr_el1; /*!< Cache Size Selection Register of EL1 */ + uint64_t esr_el1; /*!< Exception Syndrome Register of EL1ss */ + uint64_t ttbr0_el1; /*!< Translation Table Base Register 0 of EL1 */ + uint64_t ttbr1_el1; /*!< Translation Table Base Register 1 of EL1 */ + uint64_t mair_el1; /*!< Memory Attribute Indirection Register */ + uint64_t amair_el1; /*!< Auxiliary Memory Attribute Indirection Register */ + uint64_t tcr_el1; /*!< Translation Control Register */ + uint64_t tpidr_el1; /*!< EL1 Software Thread ID Register */ + uint64_t par_el1; /*!< Physical Address Register of EL1 */ + uint64_t mpidr_el1; /*!< Multiprocessor Affinity Register of EL1 */ + uint64_t afsr0_el1; /*!< Auxiliary Fault Status Register 0 of EL1 */ + uint64_t afsr1_el1; /*!< Auxiliary Fault Status Register 1 of EL1 */ + uint64_t contextidr_el1; /*!< Context ID Register of EL1 */ + uint64_t vbar_el1; /*!< Vector Base Address Register of EL1 */ + uint64_t cntkctl_el1; /*!< Counter-timer Kernel Control Register of EL1 */ + uint64_t isr_el1; /*!< Interrupt Status Register of EL1 */ + uint64_t far_el1; /*!< Fault Address Register of EL1 */ + + /* + * Some registers from GIC which are collected from the GICv3_gicc.h file and all the descriptions + * can be found in the Arm® Generic Interrupt Controller Architecture Specification + * GIC architecture version 3 and version 4 + */ + uint64_t icc_sre_el1; /* Interrupt Controller System Register Enable register of EL1 */ + uint64_t icc_igrpen0_el1; /* Interrupt Controller Interrupt Group 0 Enable register of EL1 */ + uint64_t icc_igrpen1_el1; /* Interrupt Controller Interrupt Group 1 Enable register of EL1 */ + uint64_t icc_ctlr_el1; /* Interrupt Controller Control Register of EL1 */ + uint64_t icc_iar0_el1; /* Interrupt Controller Interrupt Acknowledge Register 0 of EL1 */ + uint64_t icc_iar1_el1; /* Interrupt Controller Interrupt Acknowledge Register 1 of EL1 */ + uint64_t icc_pmr_el1; /* Interrupt Controller Interrupt Priority Mask Register of EL1 */ + uint64_t icc_bpr0_el1; /* Interrupt Controller Virtual Binary Point Register 0 of EL1 */ + uint64_t icc_bpr1_el1; /* Interrupt Controller Virtual Binary Point Register 1 of EL1 */ + uint64_t icc_rpr_el1; /* Interrupt Controller Virtual Running Priority Register of EL1 */ +} adrv904x_DfePlatformExceptionRegs_t; +ADI_ADRV904X_PACK_FINISH + +/* The definition of paltform specific CPU exception data */ + ADI_ADRV904X_PACK_START +typedef struct +{ + adrv904x_DfePlatformExceptionFlag_e ExceptionFlag[ADRV904X_DFE_PLATFORM_NUM_CORES]; + adrv904x_DfePlatformExceptionRegs_t ExceptionRegs[ADRV904X_DFE_PLATFORM_NUM_CORES]; + adrv904x_DfePlatformExceptionEntry_e ExceptionEntry[ADRV904X_DFE_PLATFORM_NUM_CORES]; + uint64_t ExceptionSyncTimeStampUs[ADRV904X_DFE_PLATFORM_NUM_CORES]; + uint64_t ExceptionNmiTimeStampUs[ADRV904X_DFE_PLATFORM_NUM_CORES]; +} adrv904x_DfePlatformExceptionData_t; +ADI_ADRV904X_PACK_FINISH + +#endif /* __ADRV904X_DFE_PLATFORM_EXCEPTION_HANDLER_T_H__*/ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_bbic_bridge_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_bbic_bridge_t.h new file mode 100644 index 00000000000..6f93c60bd45 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_bbic_bridge_t.h @@ -0,0 +1,90 @@ +/** + * Copyright 2020 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adrv904x_dfe_svc_bbic_bridge_t.h + * \brief Contains data types for DFE SDK data information + * + * DFE SDK API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_DFE_SVC_BBIC_BRIDGE_T_H__ +#define __ADRV904X_DFE_SVC_BBIC_BRIDGE_T_H__ + +#include +#include "adi_adrv904x_dfe_svc_bbic_bridge_version_t.h" +#include "adi_adrv904x_platform_pack.h" +#include "adrv904x_dfe_svc_cmd_t.h" +#include "adrv904x_dfe_svc_cmd_force_exception.h" +#include "adi_adrv904x_dfe_svc_err_codes_t.h" +#include "adrv904x_dfe_svc_log_trace_t.h" +#include "adrv904x_dfe_osal_util_t.h" +#include "adi_adrv904x_dfe_svc_dfe_capture_cmn_t.h" + +#define SVC_BBIC_BRIDGE_MAX_MAILBOX_LINK_SIZE (10744) +#define ADI_NUM_CAPTURE_BUFFERS_MAX 64 +/** + * \brief DFE mailbox data area + */ +typedef struct +{ + uint8_t buffer[SVC_BBIC_BRIDGE_MAX_MAILBOX_LINK_SIZE]; /*! mailbox data buffer (both directions) */ +} _adi_DfeMailboxBuffer_t; + + +/** + * \brief DFE capture data information + */ +typedef struct +{ + uint32_t txChannelNo; + void * pCaptureBufferAddr; + adi_adrv904x_DfeSvcDfeCaptureType_e capType; +}adrv904x_DfeSvcCaptureBufferData_t; + +/** + * \brief DFE SDK data information + */ + +ADI_ADRV904X_PACK_START +typedef struct +{ + adi_adrv904x_DfeSvcBbicBridgeVersion_t sdkVersion; /*!< SDK version number */ + adi_adrv904x_DfeSvcBbicBridgeVersion_t appVersion; /*!< application version number */ + adrv904x_DfeSvcBbicBridgeSdkRevision_t sdkRevision; /*!< SDK revision information */ + _adi_DfeMailboxBuffer_t dfeMailboxBuffer; /*!< DFE mailbox data buffer */ + adrv904x_DfeSvcCmdDfeExceptionData_t dfeExceptionSnapshotData; /*!< DFE exception handler snapshot data */ + adi_adrv904x_DfeSvcLogTraceErrLog_t errLogData; /*!< DFE err log data */ + adrv904x_DfeSvcCmdCtrlLog_t cmdLogData; /*!< DFE command log data */ + uint32_t appInitStatus; /*!< Application initialization status */ + uint32_t dfeBootError; /*!< DFE boot error code */ + uint32_t vswrAlarm; /*!< DFE VSWR: bitmask of TX channels with active VSWR alarm */ + adrv904x_DfeSvcLogTraceBuffer_t logDataBuffer; /*!< DFE uart log data */ + adrv904x_DfeOsalUtilLogData_t osalLogData; /*!< DFE osal log data */ + adrv904x_DfeSvcCaptureBufferData_t captureBuffer[ADI_NUM_CAPTURE_BUFFERS_MAX]; /*!< DFE capture buffer data*/ + adrv904x_DfeSvcCaptureBufferData_t accumBuffer[ADI_NUM_CAPTURE_BUFFERS_MAX]; /*!< DFE accumulation buffer data*/ +} adrv904x_DfeSvcBbicBridgeSdkData_t; +ADI_ADRV904X_PACK_FINISH + + +/** + * \brief DFE SDK Boot Flag enumerations + */ +typedef enum adrv904x_DfeSvcBbicBridgeSdkBootFlag +{ + ADRV904X_DFE_SVC_BBIC_BRIDGE_SDK_BOOT_FLAG_DEFAULT = 0x00u, /*!< SDK Default boot flag */ + ADRV904X_DFE_SVC_BBIC_BRIDGE_SDK_BOOT_FLAG_BBIC_RELOAD = 0x01u, /*!< SDK Reload from BBIC flag */ + ADRV904X_DFE_SVC_BBIC_BRIDGE_SDK_BOOT_FLAG_DEBUG_JTAG_ENABLE = 0x55u, /*!< SDK JTAG Debug enable boot flag */ +} adrv904x_DfeSvcBbicBridgeSdkBootFlag_e; + +/** \brief DFE SDK Boot Flag type */ +typedef uint8_t adrv904x_DfeSvcBbicBridgeSdkBootFlag_t; + + + +#endif /* __ADRV904X_DFE_SVC_BBIC_BRIDGE_T_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_cmd_dfe_pwr_mtr_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_cmd_dfe_pwr_mtr_t.h new file mode 100644 index 00000000000..bc10ccea889 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_cmd_dfe_pwr_mtr_t.h @@ -0,0 +1,393 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adrv904x_dfe_svc_cmd_dfe_pwr_mtr_t.h + * + * \brief Contains shared SDK/DFE power meter command typedefs + * + * \details Contains DFE error code definitions + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_DFE_SVC_CMD_DFE_PWR_MTR_T_H__ +#define __ADRV904X_DFE_SVC_CMD_DFE_PWR_MTR_T_H__ + +#include +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_dfe_svc_err_codes_t.h" +#include "adrv904x_dfe_svc_cmd_t.h" +#include "adi_adrv904x_dfe_svc_dfe_pwr_mtr_t.h" + +/** + * \brief SDK DFE power meter TSSI config set structure (ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_TSSI_CONFIG_SET) + */ +ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeMtrTssiConfigSet +{ + uint8_t chanMask; + uint8_t meter; /* of type adi_adrv904x_DfeSvcDfePwrMtrTssi_e */ + uint8_t source; /* of type adi_adrv904x_DfeSvcDfePwrMtrTssiSrc_e */ + adi_adrv904x_DfeSvcDfePwrMtrTssiCfg_t pwrMtrTssiCfg; +} adrv904x_DfeSvcCmdDfeMtrTssiConfigSet_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE power meter TSSI config get structure (ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_TSSI_CONFIG_GET) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeMtrTssiConfigGet +{ + uint8_t chanMask; + uint8_t meter; /* of type adi_adrv904x_DfeSvcDfePwrMtrTssi_e */ +} adrv904x_DfeSvcCmdDfeMtrTssiConfigGet_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE power meter TSSI config get response structure (ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_TSSI_CONFIG_GET) + */ + ADI_ADRV904X_PACK_START +typedef struct _adrv904x_DfeSvcCmdDfeMtrTssiConfigGetResp +{ + adi_adrv904x_DfeSvcErrCode_e status; + uint8_t chanMask; + uint8_t meter; /* of type adi_adrv904x_DfeSvcDfePwrMtrTssi_e */ + adi_adrv904x_DfeSvcDfePwrMtrTssiCfg_t pwrMtrTssiCfg; +} adrv904x_DfeSvcCmdDfeMtrTssiConfigGetResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE power meter TSSI enable command structure (ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_TSSI_ENABLE) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeMtrTssiEnable +{ + uint8_t chanMask; + uint8_t enable; + uint8_t meter; /* of type adi_adrv904x_DfeSvcDfePwrMtrTssi_e */ +} adrv904x_DfeSvcCmdDfeMtrTssiEnable_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE power meter CLGC TSSI enable command structure (ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_CLGC_TSSI_ENABLE) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeMtrClgcTssiEnable +{ + uint8_t chanMask; + uint8_t enable; + uint8_t useTxMeter1; /* use ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_TSSI_TX_1 */ + uint8_t useTxMeter2; /* use ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_TSSI_TX_2 */ +} adrv904x_DfeSvcCmdDfeMtrClgcTssiEnable_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE power meter TSSI manual start command structure (ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_TSSI_MANUAL_START) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeMtrTssiManualStart +{ + uint8_t chanMask; + uint8_t start; + uint8_t meter; /* of type adi_adrv904x_DfeSvcDfePwrMtrTssi_e */ +} adrv904x_DfeSvcCmdDfeMtrTssiManualStart_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE power meter TSSI readback command structure (ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_TSSI_READBACK) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeMtrTssiReadback +{ + uint8_t chanMask; + uint8_t meter; /* of type adi_adrv904x_DfeSvcDfePwrMtrTssi_e */ +} adrv904x_DfeSvcCmdDfeMtrTssiReadback_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE power meter TSSI readback response structure (ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_TSSI_READBACK) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeMtrTssiReadbackResp +{ + adi_adrv904x_DfeSvcErrCode_e status; + uint8_t chanMask; /* only one channel allowed */ + uint8_t meter; /* of type adi_adrv904x_DfeSvcDfePwrMtrTssi_e */ + uint8_t pwrMeasDb; /* power in dB (resolution is 0.25 dB) */ + uint64_t pwrMeasLinear; /* linear power */ + uint8_t thresExceeded; +} adrv904x_DfeSvcCmdDfeMtrTssiReadbackResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE power meter CLGC/TPC TSSI readback command structure (ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_CLGC_TSSI_READBACK) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeMtrClgcTssiReadback +{ + uint8_t txChanMask; /* Tx channel mask - only one channel allowed */ + bool useTxMeter1; /* of type bool */ + bool useTxMeter2; /* of type bool */ +} adrv904x_DfeSvcCmdDfeMtrClgcTssiReadback_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE power meter CLGC/TPC TSSI readback response structure (ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_CLGC_TSSI_READBACK) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeMtrClgcTssiReadbackResp +{ + adi_adrv904x_DfeSvcErrCode_e status; + uint8_t txChanMask; /* Tx channel mask - copied from request cmd */ + bool useTxMeter1; /* of type bool - copied from request cmd */ + bool useTxMeter2; /* of type bool - copied from request cmd */ + uint64_t pwrMeasTx1; /* linear power for TSSI Tx 1 */ + uint64_t pwrMeasTx2; /* linear power for TSSI Tx 2 */ + uint64_t pwrMeasOrx; /* linear power for TSSI ORx */ +} adrv904x_DfeSvcCmdDfeMtrClgcTssiReadbackResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE power meter DPD In/out config set command (ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_IN_CONFIG_SET, ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_OUT_CONFIG_SET) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeMtrDpdConfig +{ + adi_adrv904x_DfeSvcErrCode_e status; + uint8_t txChanMask; + adi_adrv904x_DfeSvcDfePwrMtrDpdCfg_t pwrMtrDpdConfig; +} adrv904x_DfeSvcCmdDfeMtrDpdConfig_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE power meter DPD In/out config get response (ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_IN_CONFIG_GET, ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_OUT_CONFIG_GET) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeMtrDpdConfigGetResp +{ + adi_adrv904x_DfeSvcErrCode_e status; + uint8_t txChanMask; + adi_adrv904x_DfeSvcDfePwrMtrDpdCfg_t pwrMtrDpdConfig; +} adrv904x_DfeSvcCmdDfeMtrDpdConfigGetResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE power meter DPD In/out config get command (ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_IN_CONFIG_GET, ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_OUT_CONFIG) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeMtrDpdConfigGet +{ + uint8_t txChanMask; +} adrv904x_DfeSvcCmdDfeMtrDpdConfigGet_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE power meter DPD In/out enable command (ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_IN_ENABLE, ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_OUT_ENABLE) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeMtrDpdEnable +{ + uint8_t txChanMask; + uint8_t enable; +} adrv904x_DfeSvcCmdDfeMtrDpdEnable_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE power meter DPD In/out pause command (ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_IN_PAUSE, ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_OUT_PAUSE) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeMtrDpdPause +{ + uint8_t txChanMask; + uint8_t pause; +} adrv904x_DfeSvcCmdDfeMtrDpdPause_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE power meter DPD In/out readback command structure (ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_IN_OUT_READBACK) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeMtrDpdReadback +{ + uint8_t txChannel; +} adrv904x_DfeSvcCmdDfeMtrDpdReadback_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE power meter DPD In/out readback response structure (ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_IN_OUT_READBACK) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeMtrDpdReadbackResp +{ + adi_adrv904x_DfeSvcErrCode_e status; + uint8_t txChannel; + adi_adrv904x_DfeSvcDfePwrMtrDpdResults_t pwrMtrResp; +} adrv904x_DfeSvcCmdDfeMtrDpdReadbackResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE Tx carrier power measurement config set command structure (ADRV904X_DFE_SVC_CMD_ID_TX_CARRIER_PWR_MEAS_CONFIG_SET) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcDfeAppCmd_TxCarrierPwrMeasConfig +{ + uint32_t channelMask; + uint32_t carrierMask; + adi_adrv904x_DfeSvcDfeTxCarrierPowerMeasCfg_t cfg; +} adrv904x_DfeSvcDfeAppCmd_TxCarrierPwrMeasConfig_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE Tx carrier power measurement config get command structure (ADRV904X_DFE_SVC_CMD_ID_TX_CARRIER_PWR_MEAS_CONFIG_GET) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcDfeAppCmd_TxCarrierPwrMeasConfigGet +{ + uint32_t channelMask; + uint32_t carrierMask; +} adrv904x_DfeSvcDfeAppCmd_TxCarrierPwrMeasConfigGet_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE Tx carrier power measurement config get response structure (ADRV904X_DFE_SVC_CMD_ID_TX_CARRIER_PWR_MEAS_CONFIG_GET) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcDfeAppCmd_TxCarrierPwrMeasConfigGetResp +{ + adi_adrv904x_DfeSvcErrCode_e status; + uint32_t channelMask; + uint32_t carrierMask; + adi_adrv904x_DfeSvcDfeTxCarrierPowerMeasCfg_t cfg; +} adrv904x_DfeSvcDfeAppCmd_TxCarrierPwrMeasConfigGetResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE Tx carrier power measurement enable command structure (ADRV904X_DFE_SVC_CMD_ID_TX_CARRIER_PWR_MEAS_ENABLE) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcDfeAppCmd_TxCarrierPwrMeasEnable +{ + uint32_t channelMask; + uint32_t carrierMask; + uint8_t enable; +} adrv904x_DfeSvcDfeAppCmd_TxCarrierPwrMeasEnable_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE Tx carrier power measurement manual start command structure (ADRV904X_DFE_SVC_CMD_ID_TX_CARRIER_PWR_MANUAL_START) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcDfeAppCmd_TxCarrierPwrMeasManualStart +{ + uint32_t channelMask; + uint32_t carrierMask; + uint8_t start; +} adrv904x_DfeSvcDfeAppCmd_TxCarrierPwrMeasManualStart_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE Tx carrier power measurement readback command structure (ADRV904X_DFE_SVC_CMD_ID_TX_CARRIER_PWR_MEAS_GET) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcDfeAppCmd_TxCarrierPwrMeasGet +{ + uint32_t channelMask; + uint32_t carrierMask; +} adrv904x_DfeSvcDfeAppCmd_TxCarrierPwrMeasGet_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE Tx carrier power measurement readback response structure (ADRV904X_DFE_SVC_CMD_ID_TX_CARRIER_PWR_MEAS_GET) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcDfeAppCmd_TxCarrierPwrMeasGetResp +{ + adi_adrv904x_DfeSvcErrCode_e status; + uint32_t channelMask; + uint32_t carrierMask; + adi_adrv904x_DfeSvcDfeTxCarrierPowerMeasResult_t result; +} adrv904x_DfeSvcDfeAppCmd_TxCarrierPwrMeasGetResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE power meter RSSI (DDC/CDDC) config set structure (ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_RSSI_CONFIG_SET) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeMtrRssiConfigSet +{ + uint8_t meterMask; /* multiple meters allowed (if of the same type) */ + uint8_t chanMask; /* multiple channels allowed */ + adi_adrv904x_DfeSvcDfePwrMtrRssiCfg_t pwrMtrRssiCfg; +} adrv904x_DfeSvcCmdDfeMtrRssiConfigSet_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE power meter RSSI (DDC/CDDC) config get structure (ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_RSSI_CONFIG_GET) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeMtrRssiConfigGet +{ + uint8_t meterMask; /* only one meter allowed */ + uint8_t chanMask; /* only one channel allowed */ +} adrv904x_DfeSvcCmdDfeMtrRssiConfigGet_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE power meter RSSI (DDC/CDDC) config get response structure (ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_RSSI_CONFIG_GET) + */ + ADI_ADRV904X_PACK_START +typedef struct _adrv904x_DfeSvcCmdDfeMtrRssiConfigGetResp +{ + adi_adrv904x_DfeSvcErrCode_e status; + uint8_t meterMask; /* only one meter allowed */ + uint8_t chanMask; /* only one channel allowed */ + adi_adrv904x_DfeSvcDfePwrMtrRssiCfg_t pwrMtrRssiCfg; +} adrv904x_DfeSvcCmdDfeMtrRssiConfigGetResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE power meter RSSI (DDC/CDDC) enable command structure (ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_RSSI_ENABLE) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeMtrRssiEnable +{ + uint8_t meterMask; /* multiple meters allowed */ + uint8_t chanMask; /* multiple channels allowed */ + uint8_t enable; +} adrv904x_DfeSvcCmdDfeMtrRssiEnable_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE power meter RSSI( DDC/CDDC) readback command structure (ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_RSSI_READBACK) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeMtrRssiReadback +{ + uint8_t meterMask; /* only one meter allowed */ + uint8_t chanMask; /* only one channel allowed */ +} adrv904x_DfeSvcCmdDfeMtrRssiReadback_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE power meter RSSI (DDC/CDDC) readback response structure (ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_RSSI_READBACK) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeMtrRssiReadbackResp +{ + adi_adrv904x_DfeSvcErrCode_e status; + uint8_t meterMask; /* only one meter allowed */ + uint8_t chanMask; /* only one channel allowed */ + uint8_t pwrMeasDb; /* db power */ + uint64_t pwrMeasLinear; /* linear power */ +} adrv904x_DfeSvcCmdDfeMtrRssiReadbackResp_t; +ADI_ADRV904X_PACK_FINISH + +#endif /* __ADRV904X_DFE_SVC_CMD_DFE_PWR_MTR_T_H__ */ + + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_cmd_dfe_radio_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_cmd_dfe_radio_t.h new file mode 100644 index 00000000000..bc0b0175b1a --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_cmd_dfe_radio_t.h @@ -0,0 +1,141 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2022 - 2022 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adrv904x_dfe_svc_cmd_dfe_radio_t.h + * + * \brief Contains shared SDK/DFE radio command typedefs + * + * \details Contains DFE error code definitions + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_DFE_SVC_CMD_DFE_RADIO_T_H__ +#define __ADRV904X_DFE_SVC_CMD_DFE_RADIO_T_H__ + +#include +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_dfe_svc_err_codes_t.h" +#include "adrv904x_dfe_svc_cmd_t.h" + +/** + * \brief SDK DFE Radio Tx LOL parameter set command (ADRV904X_DFE_SVC_CMD_ID_RADIO_TXLOL_PARAMS_SET) + */ +ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeTxLolParamsSetCmd +{ + uint8_t txChannel; /*!< TX channel number (0 - 7) */ + uint8_t txAtten; /*!< TX attenuation (0 - 63) */ + int16_t offsetI; /*!< TxLOL offset for I */ + int16_t offsetQ; /*!< TxLOL offset for Q */ +} adrv904x_DfeSvcCmdDfeTxLolParamsSetCmd_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE Radio CTC 2 Frac Delay command (ADRV904X_DFE_SVC_CMD_ID_RADIO_CTC2_FRAC_DELAY_SET) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvctxPfirFracDelaySet +{ + uint8_t txChannel; /*!< TX channel number (0 - 7) */ + uint8_t fracDelay; /*!< Fractional delay (0 - 63) */ +} adrv904x_DfeSvctxPfirFracDelaySet_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE Radio Tx LOL parameter set command response (ADRV904X_DFE_SVC_CMD_ID_RADIO_TXLOL_PARAMS_SET) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeTxLolParamsSetCmdResp +{ + adi_adrv904x_DfeSvcErrCode_e status; /*!< SDK error status code */ +} adrv904x_DfeSvcCmdDfeTxLolParamsSetCmdResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE Radio CTC 2 Frac Delay command (ADRV904X_DFE_SVC_CMD_ID_RADIO_CTC2_FRAC_DELAY_SET) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvctxPfirFracDelaySetResp +{ + adi_adrv904x_DfeSvcErrCode_e status; /*!< SDK error status code */ +} adrv904x_DfeSvctxPfirFracDelaySetResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE Radio Tx LOL parameter get command (ADRV904X_DFE_SVC_CMD_ID_RADIO_TXLOL_PARAMS_GET) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeTxLolParamsGetCmd +{ + uint8_t txChannel; /*!< TX channel number (0 - 7) */ + uint8_t txAtten; /*!< TX attenuation (0 - 63) */ +} adrv904x_DfeSvcCmdDfeTxLolParamsGetCmd_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE Radio Tx LOL parameter get command response (ADRV904X_DFE_SVC_CMD_ID_RADIO_TXLOL_PARAMS_GET) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeTxLolParamsGetCmdResp +{ + adi_adrv904x_DfeSvcErrCode_e status; /*!< SDK error status code */ + uint8_t txChannel; /*!< TX channel number (0 - 7) */ + uint8_t txAtten; /*!< TX attenuation (0 - 63) */ + int16_t offsetI; /*!< TxLOL offset for I */ + int16_t offsetQ; /*!< TxLOL offset for Q */ +} adrv904x_DfeSvcCmdDfeTxLolParamsGetCmdResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE Radio Tx LOL enable updates set command (ADRV904X_DFE_SVC_CMD_ID_RADIO_TXLOL_ENABLE_UPDATES_SET) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeTxLolEnableUpdatesSetCmd +{ + uint8_t txChannel; /*!< TX channel number (0 - 7) */ + uint8_t enable; /*!< enable LOL updates when Tx atten changes */ +} adrv904x_DfeSvcCmdDfeTxLolEnableUpdatesSetCmd_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE Radio Tx LOL enable updates set command response (ADRV904X_DFE_SVC_CMD_ID_RADIO_TXLOL_ENABLE_UPDATES_SET) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeTxLolEnableUpdatesSetCmdResp +{ + adi_adrv904x_DfeSvcErrCode_e status; /*!< SDK error status code */ + uint8_t txChannel; /*!< TX channel number (0 - 7) */ +} adrv904x_DfeSvcCmdDfeTxLolEnableUpdatesSetCmdResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE Radio Tx LOL enable updates get command (ADRV904X_DFE_SVC_CMD_ID_RADIO_TXLOL_ENABLE_UPDATES_GET) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeTxLolEnableUpdatesGetCmd +{ + uint8_t txChannel; /*!< TX channel number (0 - 7) */ +} adrv904x_DfeSvcCmdDfeTxLolEnableUpdatesGetCmd_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief SDK DFE Radio Tx LOL enable updates get command response (ADRV904X_DFE_SVC_CMD_ID_RADIO_TXLOL_ENABLE_UPDATES_GET) + */ + ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcCmdDfeTxLolEnableUpdatesGetCmdResp +{ + adi_adrv904x_DfeSvcErrCode_e status; /*!< SDK error status code */ + uint8_t txChannel; /*!< TX channel number (0 - 7) */ + uint8_t enable; /*!< enable flag */ +} adrv904x_DfeSvcCmdDfeTxLolEnableUpdatesGetCmdResp_t; +ADI_ADRV904X_PACK_FINISH + +#endif /* __ADRV904X_DFE_SVC_CMD_DFE_RADIO_T_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_cmd_force_exception.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_cmd_force_exception.h new file mode 100644 index 00000000000..93ae7fbedb1 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_cmd_force_exception.h @@ -0,0 +1,45 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2020 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adi_adrv904x_dfe_svc_cmd_force_exception.h + * + * \brief type definitions for ADI_ADRV904X_DFE_SVC_CMD_ID_FORCE_EXCEPTION + * + * DFE SDK Version: 2.10.0.4 + */ + +#ifndef __ADI_ADRV904X_DFE_SVC_CMD_FORCE_EXCEPTION_H__ +#define __ADI_ADRV904X_DFE_SVC_CMD_FORCE_EXCEPTION_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adrv904x_dfe_platform_exception_handler_t.h" + +/** + * NOTE: Unlike other commands, the force exception command will be indicated by + * the hardware mailbox opcode value, which is used as the link id for other + * commands. + */ + +/** \var Force exception opcode/link id */ +typedef uint8_t adrv904x_DfeSvcCmdDfeMailboxOpcodes_t; + + +/** + * \brief Force exception opcode/link id enumeration + */ +typedef enum adrv904x_DfeSvcCmdDfeMailboxOpcodes +{ + ADRV904X_DFE_SVC_CMD_DFE_MAILBOX_FORCE_EXCEPTION = 0x3FU /*!< 0x3F - Force exception */ +} adrv904x_DfeSvcCmdDfeMailboxOpcodes_e; + +typedef adrv904x_DfePlatformExceptionData_t adrv904x_DfeSvcCmdDfeExceptionData_t; + +#endif /* __ADI_ADRV904X_DFE_SVC_CMD_FORCE_EXCEPTION_H__ */ + + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_cmd_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_cmd_t.h new file mode 100644 index 00000000000..23f5013d418 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_cmd_t.h @@ -0,0 +1,549 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2023 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adrv904x_dfe_svc_cmd_t.h + * + * \brief Contains shared SDK/DFE command typedefs + * + * \details Contains DFE error code definitions + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_DFE_SVC_CMD_T_H__ +#define __ADRV904X_DFE_SVC_CMD_T_H__ + +#include "adi_adrv904x_dfe_svc_err_codes_t.h" +#include "adi_adrv904x_dfe_osal_t.h" + +/** + * \brief Maximum command log record size + */ +#define ADRV904X_DFE_SVC_CMD_LOG_SIZE (12U) + +/** + * \brief Maximum debug payload size + */ +#define MAX_DEBUG_DATA_SIZE (256u) + +/** + * \brief Maximum debug response size + */ +#define MAX_DEBUG_RESP_SIZE (256u) + +/** + * \brief SDK Command enumerations + */ +typedef enum adrv904x_DfeSvcCmdId +{ + ADRV904X_DFE_SVC_CMD_ID_PING = 0x00u, /*!< SDK Ping command */ + ADRV904X_DFE_SVC_CMD_ID_RADIO_PING = 0x01u, /*!< SDK Radio Ping command */ + ADRV904X_DFE_SVC_CMD_ID_RADIO_START = 0x02u, /*!< SDK Radio Start command */ + ADRV904X_DFE_SVC_CMD_ID_RADIO_STOP = 0x03u, /*!< SDK Radio Stop command */ + ADRV904X_DFE_SVC_CMD_ID_GET_SYS_STATUS = 0x09u, /*!< SDK Sys Status command */ + ADRV904X_DFE_SVC_CMD_ID_PREPARE_RELOAD = 0x10u, /*!< SDK Prepare for Reload command */ + ADRV904X_DFE_SVC_CMD_ID_UNLOCK_CONFIG = 0x20u, /*!< SDK Unlock Config command */ + ADRV904X_DFE_SVC_CMD_ID_SET_CONFIG = 0x21u, /*!< SDK Set Config command */ + ADRV904X_DFE_SVC_CMD_ID_GET_CONFIG = 0x22u, /*!< SDK Get Config command */ + ADRV904X_DFE_SVC_CMD_ID_SET_CTRL = 0x23u, /*!< SDK Set system or calibration ctrl command */ + ADRV904X_DFE_SVC_CMD_ID_RS_PATTERN_LUT_SET = 0x24u, /*!< SDK Set RS pattern lookup table */ + ADRV904X_DFE_SVC_CMD_ID_DEBUG = 0x25u, /*!< SDK Debug command */ + ADRV904X_DFE_SVC_CMD_ID_LOGTRACE_BUFFER = 0x26u, /*!< SDK Logtrace buffer command*/ + ADRV904X_DFE_SVC_CMD_ID_UPDATE_ECC = 0x27u, /*!< SDK ECC Update command */ + ADRV904X_DFE_SVC_CMD_ID_DEBUG_CMD = 0x28u, /*!< SDK Debug command */ + ADRV904X_DFE_SVC_CMD_ID_WATCHDOG_CONFIG = 0x29u, /*!< SDK Configure watchdog command */ + + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_TSSI_CONFIG_SET = 0x30u, /*!< SDK DFE power meter TSSI config set command */ + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_TSSI_CONFIG_GET = 0x31u, /*!< SDK DFE power meter TSSI config get command */ + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_TSSI_ENABLE = 0x32u, /*!< SDK DFE power meter TSSI enable command */ + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_CLGC_TSSI_ENABLE = 0x33u, /*!< SDK DFE power meter CLGC TSSI enable command */ + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_TSSI_MANUAL_START = 0x34u, /*!< SDK DFE power meter TSSI manual start command */ + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_TSSI_READBACK = 0x35u, /*!< SDK DFE power meter TSSI readback command */ + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_CLGC_TSSI_READBACK = 0x36u, /*!< SDK DFE power meter CLGC TSSI readback command */ + + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_IN_CONFIG_SET = 0x37u, /*!< SDK DFE power meter DPD In config set command */ + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_IN_CONFIG_GET = 0x38u, /*!< SDK DFE power meter DPD In config get command */ + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_IN_ENABLE = 0x39u, /*!< SDK DFE power meter DPD In meas enable command */ + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_OUT_CONFIG_SET = 0x3Au, /*!< SDK DFE power meter DPD Out config set command */ + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_OUT_CONFIG_GET = 0x3Bu, /*!< SDK DFE power meter DPD Out config get command */ + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_OUT_ENABLE = 0x3Cu, /*!< SDK DFE power meter DPD Out meas enable command */ + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_IN_OUT_READBACK = 0x3Du, /*!< SDK DFE power meter DPD In,Out readback command */ + + ADRV904X_DFE_SVC_CMD_ID_TX_CARRIER_PWR_MEAS_CONFIG_SET = 0x3Eu, /*!< SDK DFE power meter Tx carrier meas config set command */ + ADRV904X_DFE_SVC_CMD_ID_TX_CARRIER_PWR_MEAS_CONFIG_GET = 0x3Fu, /*!< SDK DFE power meter Tx carrier meas config get command */ + ADRV904X_DFE_SVC_CMD_ID_TX_CARRIER_PWR_MEAS_ENABLE = 0x40u, /*!< SDK DFE power meter Tx carrier meas enable command */ + ADRV904X_DFE_SVC_CMD_ID_TX_CARRIER_PWR_MEAS_MANUAL_START = 0x41u, /*!< SDK DFE power meter Tx carrier manual start command */ + ADRV904X_DFE_SVC_CMD_ID_TX_CARRIER_PWR_MEAS_GET = 0x42u, /*!< SDK DFE power meter Tx carrier meas readback command */ + + ADRV904X_DFE_SVC_CMD_ID_LOG_MASK_SET = 0x43u, /*!< SDK DFE log level mask set command */ + ADRV904X_DFE_SVC_CMD_ID_LOG_MASK_GET = 0x44u, /*!< SDK DFE log level mask get command */ + + ADRV904X_DFE_SVC_CMD_ID_CPU_LOAD_GET = 0x45u, /*!< SDK Get CPU loading command */ + ADRV904X_DFE_SVC_CMD_ID_CPU_LOAD_INTERVAL_SET = 0x46u, /*!< SDK Set CPU loading calculation interval command */ + ADRV904X_DFE_SVC_CMD_ID_CPU_LOAD_INTERVAL_GET = 0x47u, /*!< SDK Get CPU loading calculation interval command */ + + ADRV904X_DFE_SVC_CMD_ID_WBREG_ACCESS = 0x48u, /*!< SDK WB Regularization access command */ + ADRV904X_DFE_SVC_CMD_ID_TELEMETRY_MASK_SET = 0x49u, /*!< SDK DFE telemetry mask set command */ + ADRV904X_DFE_SVC_CMD_ID_TELEMETRY_MASK_GET = 0x4Au, /*!< SDK DFE telemetry mask get command */ + ADRV904X_DFE_SVC_CMD_ID_SEQUENCER_WAIT_FOR_SSB_SYNC = 0x4Bu, /*!< SDK wait for SSB SYNC command */ + + ADRV904X_DFE_SVC_CMD_ID_ECC_ENABLE_SET = 0x4Cu, /*!< SDK ECC Enable set command */ + ADRV904X_DFE_SVC_CMD_ID_ECC_ENABLE_GET = 0x4Du, /*!< SDK ECC Enable get command */ + + ADRV904X_DFE_SVC_CMD_ID_RADIO_TXLOL_PARAMS_SET = 0x4Eu, /*!< SDK Set Radio TxLOL correction parameters command */ + ADRV904X_DFE_SVC_CMD_ID_RADIO_TXLOL_PARAMS_GET = 0x4Fu, /*!< SDK Get Radio TxLOL correction parameters command */ + ADRV904X_DFE_SVC_CMD_ID_RADIO_TXLOL_ENABLE_UPDATES_SET = 0x50u, /*!< SDK Set Radio TxLOL enable updates command */ + ADRV904X_DFE_SVC_CMD_ID_RADIO_TXLOL_ENABLE_UPDATES_GET = 0x51u, /*!< SDK Get Radio TxLOL enable updates command */ + ADRV904X_DFE_SVC_CMD_ID_RADIO_TX_PFIR_FRAC_DELAY_SET = 0x52u, /*!< SDK DFE Radio CTC 2 Frac Delay command */ + + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_RSSI_CONFIG_SET = 0x53u, /*!< SDK DFE power meter RSSI (DDC) config set command */ + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_RSSI_CONFIG_GET = 0x54u, /*!< SDK DFE power meter RSSI (DDC) config get command */ + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_RSSI_ENABLE = 0x55u, /*!< SDK DFE power meter RSSI (DDC) enable command */ + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_RSSI_READBACK = 0x56u, /*!< SDK DFE power meter RSSI (DDC) readback command */ + + ADRV904X_DFE_SVC_CPU_CMD_ID_DFE_APPLICATION = 0xFFu, /*!< SDK max command ID */ + ADRV904X_DFE_SVC_CMD_ID_MAX_NUM = ADRV904X_DFE_SVC_CPU_CMD_ID_DFE_APPLICATION + 1u, /*!< number of command IDs */ +} adrv904x_DfeSvcCmdId_e; + +/** \brief CPU command ID type */ +typedef uint16_t adrv904x_DfeSvcCmdId_t; + +/** + * \brief SDK command status enumeration + */ +typedef enum adrv904x_DfeSvcCmdStatus +{ + ADRV904X_DFE_SVC_CMD_STATUS_NO_ERROR, /*!< No error */ + ADRV904X_DFE_SVC_CMD_STATUS_GENERIC, /*!< Unspecified/unknown error */ + ADRV904X_DFE_SVC_CMD_STATUS_LINK_ERROR, /*!< Link (lower level) error */ + ADRV904X_DFE_SVC_CMD_STATUS_UNEXPECTED_TRANSACTION_ID, /*!< Unexpected/invalid transaction ID received */ + ADRV904X_DFE_SVC_CMD_STATUS_CMD_FAILED, /*!< Command-specific failure. See command-specific response for details. */ + ADRV904X_DFE_SVC_CMD_STATUS_CMD_ID_INVALID /*!< Invalid command ID */ +} adrv904x_DfeSvcCmdStatus_e; +typedef uint16_t adrv904x_DfeSvcCmdStatus_t; + +/** + * \brief SDK command Generic structure + */ +typedef struct adrv904x_DfeSvcCmdGenericCmd +{ + uint32_t generic; /*!< Placeholder data field */ +} adrv904x_DfeSvcCmdGenericCmd_t; + +/** + * \brief SDK command Generic response structure + */ +typedef struct adrv904x_DfeSvcCmdGenericResp +{ + adi_adrv904x_DfeSvcErrCode_e status; /*!< SDK error status code */ +} adrv904x_DfeSvcCmdGenericResp_t; + +/** + * \brief SDK command Ping structure + */ +typedef struct adrv904x_DfeSvcCmdPing +{ + uint32_t echoData; /*!< Data to be echoed back by SDK */ +} adrv904x_DfeSvcCmdPing_t; + +/** + * \brief SDK command Ping Response structure + */ +typedef struct adrv904x_DfeSvcCmdPingResp +{ + adi_adrv904x_DfeSvcErrCode_e status; /*!< SDK error status code */ + uint32_t echoData; /*!< Echoed data from SDK */ +} adrv904x_DfeSvcCmdPingResp_t; + +/** \brief CPU command transaction ID type */ +typedef uint16_t adrv904x_DfeSvcCmdTransactionId_t; + +/** + * \brief Common CPU command structure + */ +typedef struct adrv904x_DfeSvcCmd +{ + adrv904x_DfeSvcCmdId_t cmdId; /*!< Command ID. Value is from adrv904x_DfeSvcCmnCpuCmdId_e enumeration. */ + adrv904x_DfeSvcCmdTransactionId_t tId; /*!< Transaction ID. Unique ID for a command/response pair. */ + + /* Command payload follows command header. + * This can't be declared here due to use of the -Wpedantic compiler option. + * void* payload[]; + */ +} adrv904x_DfeSvcCmd_t; + +/** + * \brief Common CPU command response structure + */ +typedef struct adrv904x_DfeSvcCmdResp +{ + adrv904x_DfeSvcCmdId_t cmdId; /*!< Command ID. Value is from adrv904x_DfeSvcCmnCpuCmdId_e enumeration. */ + adrv904x_DfeSvcCmdTransactionId_t tId; /*!< Transaction ID. Unique ID for a command/response pair. */ + adrv904x_DfeSvcCmdStatus_t status; /*!< Command status. Value is from adrv904x_DfeSvcCmnCpuCmdStatus_e enumeration. */ + + /* Command response payload follows command header. + * This can't be declared here due to use of the -Wpedantic compiler option + * void* payload[]; + */ +} adrv904x_DfeSvcCmdResp_t; + +/** + * \brief UNLOCK_CONFIG command structure + */ +typedef struct adrv904x_DfeSvcCmdUnlockConfig +{ + uint32_t configKey; +} adrv904x_DfeSvcCmdUnlockConfig_t; + +/** + * \brief UNLOCK_CONFIG command response structure + */ +typedef struct adrv904x_DfeSvcCmdUnlockConfigResp +{ + adi_adrv904x_DfeSvcErrCode_e cmdStatus; /*!< Command status */ +} adrv904x_DfeSvcCmdUnlockConfigResp_t; + +/** + * \brief SET_CONFIG command structure + */ +typedef struct adrv904x_DfeSvcCmdSetConfig +{ + adi_adrv904x_DfeSvcErrObjId_t objId; /*!< Object ID of calibration or system component */ + uint16_t offset; /*!< Offset into the configuration structure */ + uint16_t length; /*!< Length of the configuration in bytes */ + + /* Config data payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * uint8_t configData[]; + */ +} adrv904x_DfeSvcCmdSetConfig_t; + +/** + * \brief SET_CONFIG command response structure + */ +typedef struct adrv904x_DfeSvcCmdSetConfigResp +{ + adi_adrv904x_DfeSvcErrCode_e cmdStatus; /*!< Command status */ +} adrv904x_DfeSvcCmdSetConfigResp_t; + +/** + * \brief ECC_Update command response structure + */ +typedef struct adrv904x_DfeSvcEccUpdateResp +{ + adi_adrv904x_DfeSvcErrCode_e cmdStatus; /*!< Command status */ +} adrv904x_DfeSvcEccUpdateResp_t; + +/** + * \brief GET_CONFIG command structure + */ +typedef struct adrv904x_DfeSvcCmdGetConfig +{ + adi_adrv904x_DfeSvcErrObjId_t objId; /*!< Object ID of calibration or system component */ + uint16_t offset; /*!< Offset into the configuration structure */ + uint16_t length; /*!< Length of the configuration in bytes */ +} adrv904x_DfeSvcCmdGetConfig_t; + +/** + * \brief GET_CONFIG command response structure + */ +typedef struct adrv904x_DfeSvcCmdGetConfigResp +{ + adi_adrv904x_DfeSvcErrCode_e cmdStatus; /*!< Command status */ + + /* Config data payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * uint8_t configData[]; + */ +} adrv904x_DfeSvcCmdGetConfigResp_t; + +/** + * \brief Header in the response buff which stores the error status during the message processing + */ +typedef struct +{ + adi_adrv904x_DfeSvcErrCode_e status; /*!< Error Code */ +} adrv904x_DfeSvcCmdMsgProcessStatus_t; + +/** + * \brief Shadow definition of _adi_drv_MailboxData_t + */ +typedef struct +{ + uint32_t handle; + uint32_t opcode; + uint32_t data; +} adrv904x_DfeSvcCmdMailboxLogData_t; + + +/** + * \brief Set of data that encompasses a command + */ +typedef struct +{ + adrv904x_DfeSvcCmd_t cmdData; /*!< Command ID. Value is from adrv904x_DfeSvcCmnCpuCmdId_e enumeration. */ + adrv904x_DfeSvcCmdMailboxLogData_t mailBoxData; /*!< For sending, handle of mailbox to send to. For reception, handle of mailbox received from. */ + uint64_t timeStampUs; /*!< Timestamp for the command receieved in microseconds(based on OS ticks) */ +} adrv904x_DfeSvcCmdLogData_t; + +/** + * \brief Structure contains the opcode and result of executing the command + */ +typedef struct adrv904x_DfeSvcCmdCtrlResult +{ + uint32_t handle; /*!< Handle for the command */ + uint32_t opcode; /*!< Opcode of the command */ + adi_adrv904x_DfeSvcErrCode_e resCode; /*!< Result of executing the command */ + adrv904x_DfeSvcCmdResp_t cmdResp; /*!< Command response result */ + uint64_t timeStampUs; /*!< Timestamp for the command responded in microseconds(based on OS ticks) */ +}adrv904x_DfeSvcCmdCtrlResult_t; + +/** + * \brief Command and result log structure. + * + * \details The command and result log are circular buffers. + * The last #ADRV904X_DFE_SVC_CMD_LOG_SIZE commands and their results are stored. + * Since the arrival of command and reporting the results are asynchronous, + * the result at index 'N' does not correspond to command at index 'N'. + */ + +typedef struct adrv904x_DfeSvcCmdCtrl_Log +{ + uint8_t cmdIdx; /*!< Command log index */ + uint8_t resultIdx; /*!< Result log index */ + adrv904x_DfeSvcCmdLogData_t cmdLog[ADRV904X_DFE_SVC_CMD_LOG_SIZE]; /*!< Command log */ + adrv904x_DfeSvcCmdCtrlResult_t resultLog[ADRV904X_DFE_SVC_CMD_LOG_SIZE]; /*!< Result log */ +} adrv904x_DfeSvcCmdCtrlLog_t; + +/** + * \brief DEBUG_MODE command structure + */ +typedef struct adrv904x_DfeSvcCmdDebugMode +{ + uint32_t svcDebugModeKey; /*!< Command status */ +} adrv904x_DfeSvcCmdDebugMode_t; + + +/** + * \brief DEBUG_MODE command response structure + */ +typedef struct adrv904x_DfeSvcCmdDebugModeResp +{ + adi_adrv904x_DfeSvcErrCode_e cmdStatus; /*!< Error Code */ +} adrv904x_DfeSvcCmdDebugModeResp_t; + + +/** + * \brief DEBUG command structure + */ +typedef struct adrv904x_DfeSvcCmdDebugCmd +{ + adi_adrv904x_DfeSvcErrObjId_t objId; /*!< Object ID of calibration or system component */ + uint16_t debugCmd; /*!< Command to be executed */ + uint32_t channelNum; /*!< Channel number (0 for channel 1, 1 for channel 2, etc.) */ + uint16_t length; /*!< Length of the debug data payload in bytes */ + + /* Debug data payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * uint8_t dbgData[]; + */ +} adrv904x_DfeSvcCmdDebugCmd_t; + + +/** + * \brief DEBUG command response structure + */ +typedef struct adrv904x_DfeSvcCmdDebugCmdResp +{ + adi_adrv904x_DfeSvcErrCode_e cmdStatus; /*!< Command status */ + uint16_t length; /*!< Length of the response data in bytes */ + + /* Debug data response payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * uint8_t respData[]; + */ +} adrv904x_DfeSvcCmdDebugCmdResp_t; + +/** + * \brief LogTrace_Buffer command structure + */ +typedef struct adrv904x_DfeSvcCmdLogTraceBuffer +{ + uint8_t svcLogTraceBufferStatus; /*!< LogTrace Buffer status */ +} adrv904x_DfeSvcCmdLogTraceBuffer_t; + +/** + * \brief LogTrace_Buffer command response structure + */ +typedef struct adrv904x_DfeSvcCmdLogTraceBufferResp +{ + adi_adrv904x_DfeSvcErrCode_t cmdStatus; /*!< Command status */ +} adrv904x_DfeSvcCmdLogTraceBufferResp_t; + +/** + * \brief Watchdog_config command structure + */ +typedef struct adrv904x_DfeSvcCmdWatchdogConfig +{ + uint32_t timeout_ms; /*!< Watchdog timeout value */ + uint8_t wdt; /*!< Watchdog instance */ +} adrv904x_DfeSvcCmdWatchdogConfig_t; + +/** + * \brief Watchdog_config command response structure + */ +typedef struct adrv904x_DfeSvcCmdWatchdogConfigResp +{ + adi_adrv904x_DfeSvcErrCode_t cmdStatus; /*!< Command status */ +} adrv904x_DfeSvcCmdWatchdogConfigResp_t; + +/** + * \brief PREPARE_RELOAD command structure + */ +typedef struct adrv904x_DfeSvcCmdPrepareReload +{ + uint32_t reload; /*!< Unused */ +} adrv904x_DfeSvcCmdPrepareReload_t; + +/** + * \brief PREPARE_RELOAD command response structure + */ +typedef struct adrv904x_DfeSvcCmdPrepareReloadResp +{ + adi_adrv904x_DfeSvcErrCode_e cmdStatus; /*!< Command status */ +} adrv904x_DfeSvcCmdPrepareReloadResp_t; + +/** + * \brief SDK CPU and memory loading command structure + */ +typedef struct adrv904x_DfeSvcCmdCpuAndMemLoadGet +{ + uint32_t generic; /*!< Placeholder */ +} adrv904x_DfeSvcCmdCpuAndMemLoadGet_t; + +/** + * \brief SDK CPU loading command response structure + */ +typedef struct adrv904x_DfeSvcCmdCpuAndMemLoadGetResp +{ + adi_adrv904x_DfeSvcErrCode_e status; /*!< SDK error status code */ + adi_adrv904x_DfeCpuAndMemLoad_t load; /*!< CPU Loading information */ +} adrv904x_DfeSvcCmdCpuAndMemLoadGetResp_t; + +/** + * \brief SDK CPU loading interval set command structure + */ +typedef struct adrv904x_DfeSvcCmdCpuLoadIntervalSet +{ + uint32_t interval_ms; /*!< CPU Loading sampling interval */ +} adrv904x_DfeSvcCmdCpuLoadIntervalSet_t; + +/** + * \brief SDK CPU loading interval set command response structure + */ +typedef struct adrv904x_DfeSvcCmdCpuLoadIntervalSetResp +{ + adi_adrv904x_DfeSvcErrCode_e status; /*!< SDK error status code */ +} adrv904x_DfeSvcCmdCpuLoadIntervalSetResp_t; + +/** + * \brief SDK CPU loading interval get command structure + */ +typedef struct adrv904x_DfeSvcCmdCpuLoadIntervalGet +{ + uint32_t generic; /*!< Placeholder */ +} adrv904x_DfeSvcCmdCpuLoadIntervalGet_t; + +/** + * \brief SDK CPU loading interval get command response structure + */ +typedef struct adrv904x_DfeSvcCmdCpuLoadIntervalGetResp +{ + adi_adrv904x_DfeSvcErrCode_e status; /*!< SDK error status code */ + uint32_t interval_ms; /*!< CPU Loading information */ +} adrv904x_DfeSvcCmdCpuLoadIntervalGetResp_t; + +/** + * \brief SDK command Set Log Mask structure + */ +typedef struct adrv904x_DfeSvcCmdSetLogMaskCmd +{ + uint32_t logMask; /*!< Placeholder data field */ +} adrv904x_DfeSvcCmdSetLogMaskCmd_t; + +/** + * \brief LOG_MASK_GET command response structure + */ +typedef struct adrv904x_DfeSvcCmdGetLogMaskResp +{ + uint32_t logMask; /*!< SDK log mask */ + adi_adrv904x_DfeSvcErrCode_e status; /*!< Command status */ +} adrv904x_DfeSvcCmdGetLogMaskResp_t; + +/** + * \brief SDK command Set Telemetry Mask structure + */ +typedef struct adrv904x_DfeSvcCmdSetTelemetryMaskCmd +{ + uint64_t sdkTelemetryMask0; /* ! +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_dfe_svc_err_codes_t.h" + +/* Type and enumeration for DFE boot status and error codes */ +typedef uint8_t adrv904x_DfeSvcErrDfeBootStatus_t; +typedef enum adrv904x_DfeSvcErrDfeBootStatus +{ + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_POWER_UP = 0u, /*!< @errcode: 0x0000 + * @desc: Used to put API in wait for CPU state. + * @maincause: CPU powered up. + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_NONE + * @mainrecovtext: No action required. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_READY = 1u, /*!< @errcode: 0x0001 + * @desc: CPU booted with no failure. + * @maincause: CPU booted with no failure. + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_NONE + * @mainrecovtext: No action required. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_WAIT_FOR_CPUS = 2u, /*!< @errcode: 0x0002 + * @desc: Primary CPU waiting for secondary CPU(s) to boot. + * @maincause: Secondary CPU failed to complete. See secondary CPU boot status for more details. + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_BOOT_PREINIT = 4u, /*!< @errcode: 0x004 + * @desc: DFE CPU boot has entered pre-init stage + * @maincause: DFE CPU boot pre-init stage has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_PROFILE_INIT = 5u, /*!< @errcode: 0x005 + * @desc: DFE CPU boot has entered initialization of device profile stage + * @maincause: Device profile stage has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_OSAL_INIT = 6u, /*!< @errcode: 0x006 + * @desc: DFE CPU boot has entered OSAL initialization stage + * @maincause: OSAL initialization stage has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_MEM_SVC_PREINIT = 7u, /*!< @errcode: 0x007 + * @desc: DFE CPU boot has entered memory service pre-initialization stage + * @maincause: Memory service pre-initialization stage has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_THREAD_START = 8u, /*!< @errcode: 0x008 + * @desc: DFE CPU boot is attempting to start initial thread + * @maincause: Starting of initial thread has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_APP_CONFIG = 9u, /*!< @errcode: 0x009 + * @desc: DFE CPU boot has entered DFE Application application_config() function + * @maincause: application_config() has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists if using ADI-provided DFE image. Otherwise, debug customer application_config(). + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_APP_INIT = 10u, /*!< @errcode: 0x00A + * @desc: DFE CPU boot has entered DFE Application application_init() function + * @maincause: application_init() has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists if using ADI-provided DFE image. Otherwise, debug customer application_init(). + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_ERROR_INIT = 11u, /*!< @errcode: 0x00B + * @desc: DFE CPU boot has entered initialization of the error handling service + * @maincause: Initialization of error handling service has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_BUFFER_MGMT_INIT = 12u, /*!< @errcode: 0x00C + * @desc: DFE CPU boot has entered adaptation allocation stage + * @maincause: Adaptation allocation stage has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_MEM_SVC_INIT = 14u, /*!< @errcode: 0x00E + * @desc: DFE CPU boot has entered initialization of the memory allocation service + * @maincause: Memory allocation service has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_LOG_TRACE_INIT = 15u, /*!< @errcode: 0x00F + * @desc: DFE CPU boot has entered initialization of the log and tracing service + * @maincause: Log and trace initialization has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_EVENT_SVC_INIT = 16u, /*!< @errcode: 0x010 + * @desc: DFE CPU boot has entered event service initialization + * @maincause: Event service initialization has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_RADIO_CTRL_INIT = 17u, /*!< @errcode: 0x011 + * @desc: DFE CPU boot has entered radio control service initialization + * @maincause: Radio control service initialization has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_BRIDGE_INIT = 18u, /*!< @errcode: 0x012 + * @desc: DFE CPU has entered BBIC Bridge service initialization + * @maincause: BBIC Bridge service initialization has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_CMD_SVC_INIT = 19u, /*!< @errcode: 0x013 + * @desc: DFE CPU has entered command service initialization + * @maincause: Command service initialization has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_CAPTURE_INIT = 20u, /*!< @errcode: 0x014 + * @desc: DFE CPU has entered DFE capture service initialization + * @maincause: DFE capture service initialization has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_ADAPTATION_INIT = 21u, /*!< @errcode: 0x015 + * @desc: DFE CPU has entered DFE adaptation service initialization + * @maincause: DFE adaptation service initialization has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_EXCEPTION_INIT = 22u, /*!< @errcode: 0x016 + * @desc: DFE CPU has entered exception handler initialization + * @maincause: Exception handler initialization has failed, likely due to unhandled exception prior to initialization. + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_FW_CRC_ERR = 23u, /*!< @errcode: 0x017 + * @desc: CPU firmware image failed CRC verification. + * @maincause: Programmed image is corrupted. Original image may be invalid or may have been corrupted during SPI transfer. + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_UNEXPECTED_ERR = 24u, /*!< @errcode: 0x018 + * @desc: Unexpected exception/error. + * @maincause: An unhandled fatal error was encountered. + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_INIT_THREAD = 26u, /*!< @errcode: 0x01A + * @desc: DFE CPU initial thread creation + * @maincause: Initial thread creation has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_SYSCLK_INIT = 27u, /*!< @errcode: 0x01B + * @desc: DFE CPU system clock initialization + * @maincause: System clock initialization has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_INTERRUPT_INIT = 28u, /*!< @errcode: 0x01C + * @desc: DFE CPU interrupt initialization + * @maincause: Interrupt initialization has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_HALT_INIT = 29u, /*!< @errcode: 0x01D + * @desc: DFE CPU exception halt initialization + * @maincause: Exception halt initialization has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_OS_TICK_INIT = 30u, /*!< @errcode: 0x01E + * @desc: DFE CPU OS tick initialization + * @maincause: OS tick initialization has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_OS_LAUNCH = 31u, /*!< @errcode: 0x01F + * @desc: DFE CPU OS launch + * @maincause: OS launch has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_OS_STACK_CHK_INIT = 32u, /*!< @errcode: 0x020 + * @desc: DFE CPU OS stack error checking initialization + * @maincause: Stack error checking initialization has failed preventing boot from progressing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_EXCEPTION_PREINIT = 33u, /*!< @errcode: 0x021 + * @desc: DFE CPU has entered early exception handler initialization + * @maincause: Early exception handler initialization has failed, likely due to unhandled exception prior to initialization. + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_READY_FOR_RELOAD = 34u, /*!< @errcode: 0x022 + * @desc: CPU halted and prepared for a new image to be loaded by BBIC + * @maincause: N/A + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_NONE + * @mainrecovtext: No action required + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_ECC_INIT = 35u, /*!< @errcode: 0x023 + * @desc: DFE CPU has failed to initialize ECC + * @maincause: An ECC error has occurred in memory. + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_EXCEPTION_DONE = 36u, /*!< @errcode: 0x024 + * @desc: DFE CPU has finished with L4 memory flush + * @maincause: Force exception + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_NONE + * @mainrecovtext: No action required + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_WATCHDOG_INIT = 37u, /*!< @errcode: 0x025 + * @desc: DFE CPU has failed to initialize watchdog service + * @maincause: Watchdog service encountered an error while initializing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ + + ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_RADIO_CMD_SVC_INIT = 38u, /*!< @errcode: 0x026 + * @desc: DFE CPU has failed to initialize radio command service + * @maincause: radio command service encountered an error while initializing + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the problem persists. + */ +} adrv904x_DfeSvcErrDfeBootStatus_e; + +/* Type used to store DFE error status information */ +ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcErrDfeErrors +{ + adi_adrv904x_DfeSvcErrCode_e lastCmd; + adi_adrv904x_DfeSvcErrCode_e system; +} adrv904x_DfeSvcErrDfeErrors_t; +ADI_ADRV904X_PACK_FINISH + + +#endif /* __ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_T_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_error_tables.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_error_tables.h new file mode 100644 index 00000000000..2a8d0074dd9 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_error_tables.h @@ -0,0 +1,1862 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file + * + * \brief + * + * \details + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADRV904X_DFE_SVC_ERROR_TABLES_H_ +#define _ADRV904X_DFE_SVC_ERROR_TABLES_H_ + +#include "adi_common_error.h" +#include "adi_adrv904x_error_types.h" + +const adrv904x_DfeSvcRuntimeErrCodes_t adrv904x_DfeSvcRunTimeErrTable[] = +{ +/* DO NOT EDIT THIS TABLE, CHANGES WILL BE OVERWRITTEN DURING FULL BUILD */ +/* START AUTOGENERATED CPU RUNTIME ERROR TABLE */ + + { + 0x0000u, + ADI_STRING("No Error"), + ADI_STRING("Operation was Successful"), + ADI_ADRV904X_ERR_ACT_NONE, + ADI_STRING("No Action Required") + }, + { + 0x0001u, + ADI_STRING("Common Error: Parameter(s)"), + ADI_STRING("Invalid Parameter(s) Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Parameter(s) Provided") + }, + { + 0x0002u, + ADI_STRING("Common Error: Pointer(s)"), + ADI_STRING("Invalid Pointer(s) Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Pointer(s) Provided") + }, + { + 0x0003u, + ADI_STRING("Common Error: Feature Implementation"), + ADI_STRING("Requested Feature has not been Implemented"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check that Feature has been Implemented") + }, + { + 0x0004u, + ADI_STRING("Common Error: CRC Check"), + ADI_STRING("Computed CRC does not Match Provided CRC"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Validate Image being Checked & Reprogram Device") + }, + { + 0x0005u, + ADI_STRING("Common Error: Insufficient Memory"), + ADI_STRING("Unable to Allocate requested Memory (i.e. Heap)"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reprogram Device") + }, + { + 0x0006u, + ADI_STRING("Common Error: Stack Overflow"), + ADI_STRING("Allocated Stack Size has been Exhausted"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reprogram Device") + }, + { + 0x0007u, + ADI_STRING("Common Error: Fatal Exception"), + ADI_STRING("Fatal Exception has been Triggered by CPU"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reprogram Device") + }, + { + 0x0101u, + ADI_STRING("Command Error: Transaction ID"), + ADI_STRING("Invalid Transaction ID Received"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Transaction ID is Valid") + }, + { + 0x0102u, + ADI_STRING("Command Error: Link Busy"), + ADI_STRING("Link is Currently Processing a Command"), + ADI_ADRV904X_ERR_ACT_CHECK_INTERFACE, + ADI_STRING("Wait for Link to Complete current Command") + }, + { + 0x0103u, + ADI_STRING("Command Error: Link Number"), + ADI_STRING("Invalid Link Number Provided in Command"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Valid Link Number is Valid") + }, + { + 0x0104u, + ADI_STRING("Command Error: Mailbox Number"), + ADI_STRING("Invalid Mailbox Number Received"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Mailbox Number is Valid") + }, + { + 0x0105u, + ADI_STRING("Command Error: Command Payload Size"), + ADI_STRING("Payload Size Exceeds Link Buffer Size"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Valid Payload Size is Valid") + }, + { + 0x0106u, + ADI_STRING("Command Error: Command ID"), + ADI_STRING("Invalid Command ID Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Valid Command ID is Valid") + }, + { + 0x0107u, + ADI_STRING("Command Error: Event Type"), + ADI_STRING("Invalid Event Type Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Event Type is Valid") + }, + { + 0x0108u, + ADI_STRING("Command Error: Parameter(s)"), + ADI_STRING("Invalid Parameter(s) Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Parameter(s) is Valid") + }, + { + 0x0109u, + ADI_STRING("Command Error: link buffer is NULL"), + ADI_STRING("Invalid Parameter(s) Provided"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Parameter(s) is Valid") + }, + { + 0x010au, + ADI_STRING("Command Error: Mailbox command timed out"), + ADI_STRING("Potential timing issue with calibration threads"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Contact ADI with memdump") + }, + { + 0x0201u, + ADI_STRING("OSAL Service Error: Memory Pool"), + ADI_STRING("Memory Pool was Deleted while Thread Suspended"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Feature is reporting an Error") + }, + { + 0x0202u, + ADI_STRING("OSAL Service Error: Memory Pool Pointer"), + ADI_STRING("Invalid Memory Pool Pointer Provided by Thread"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reprogram Device") + }, + { + 0x0203u, + ADI_STRING("OSAL Service Error: Invalid Pointer"), + ADI_STRING("NULL Pointer Detected"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Use Valid Pointer") + }, + { + 0x0204u, + ADI_STRING("OSAL Service Error: Semaphore Wait"), + ADI_STRING("OSAL Semaphore Wait Timeout"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check that Semaphore is not being requested from ISR") + }, + { + 0x0205u, + ADI_STRING("OSAL Service Error: Memory Pool Size"), + ADI_STRING("Invalid Memory Pool Size"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check the Memory Pool Size is Valid") + }, + { + 0x0206u, + ADI_STRING("OSAL Service Error: Event Group Pointer"), + ADI_STRING("Event Group Pointer is either NULL or Points to a Group already Created"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Event Group Pointer Parameter is Valid") + }, + { + 0x0207u, + ADI_STRING("OSAL Service Error: No Event"), + ADI_STRING("Service was unable to get the Specified Events"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Events were Created") + }, + { + 0x0208u, + ADI_STRING("OSAL Service Error: Option"), + ADI_STRING("Invalid Get Option Specified"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Invalid Parameter Passed to Function") + }, + { + 0x0209u, + ADI_STRING("OSAL Service Error: Queue Pointer"), + ADI_STRING("Queue Pointer was either NULL or Pointing to a Queue that was already Created"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Queue Pointer is Valid") + }, + { + 0x020au, + ADI_STRING("OSAL Service Error: Queue Empty"), + ADI_STRING("Message Queue is Empty"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Queue Management") + }, + { + 0x020bu, + ADI_STRING("OSAL Service Error: Queue Full"), + ADI_STRING("Message Queue is Full"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Queue Management") + }, + { + 0x020cu, + ADI_STRING("OSAL Service Error: Semaphore Pointer"), + ADI_STRING("Semaphore Pointer was either NULL or Pointing to a Semaphore that was already Created"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Semaphore being used is Valid") + }, + { + 0x020du, + ADI_STRING("OSAL Service Error: No Semaphore"), + ADI_STRING("Semaphore Count is Zero"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Semaphore Management") + }, + { + 0x020eu, + ADI_STRING("OSAL Service Error: Thread Pointer"), + ADI_STRING("Thread Pointer was either NULL or Points to a Thread that was already Created"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Pointer is Valid") + }, + { + 0x020fu, + ADI_STRING("OSAL Service Error: Thread Priority"), + ADI_STRING("Invalid Thread Priority was Specified"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Use Valid Thread Priority") + }, + { + 0x0210u, + ADI_STRING("OSAL Service Error: Memory Allocation"), + ADI_STRING("Service was unable to Allocate a Block of Memory"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Memory Management") + }, + { + 0x0211u, + ADI_STRING("OSAL Service Error: Thread Delete State"), + ADI_STRING("Invalid Thread State for Deletion"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Thread are Correct State for Deletion") + }, + { + 0x0212u, + ADI_STRING("OSAL Service Error: Thread Resume State"), + ADI_STRING("Thread cannot be Resumed because it is not Suspended"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Thread Management") + }, + { + 0x0213u, + ADI_STRING("OSAL Service Error: Non-Thread Calibrationl"), + ADI_STRING("API function was Calibrationibrationled from a non-thread"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check how Function was Calibrationibrationled") + }, + { + 0x0214u, + ADI_STRING("OSAL Service Error: Thread Suspend State"), + ADI_STRING("Threads to be suspended must be in Terminated or Completed State"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Thread State") + }, + { + 0x0215u, + ADI_STRING("OSAL Service Error: Timer Pointer"), + ADI_STRING("Invalid Timer Pointer"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Pointer is Valid") + }, + { + 0x0216u, + ADI_STRING("OSAL Service Error: Timer Tick"), + ADI_STRING("Initial Timer Tick Value Cannot be Zero"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Timer Tick is Valid") + }, + { + 0x0217u, + ADI_STRING("OSAL Service Error: Activation"), + ADI_STRING("Invalid Activation was Specified"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Activation Parameter is Valid") + }, + { + 0x0218u, + ADI_STRING("OSAL Service Error: Preemption Threshold"), + ADI_STRING("Invalid Preemption Threshold was Specified"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Preemption Threshold is Valid") + }, + { + 0x0219u, + ADI_STRING("OSAL Service Error: Delayed Suspension"), + ADI_STRING("Previously-set Delayed Suspension was Lifted"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Delayed Suspension") + }, + { + 0x021au, + ADI_STRING("OSAL Service Error: Wait Abort"), + ADI_STRING("Wait was lifted by another thread, timer or ISR"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Event Behaviour") + }, + { + 0x021bu, + ADI_STRING("OSAL Service Error: Wait Abort Error"), + ADI_STRING("Specified Thread is not in the Wait state"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Feature is reporting an Error") + }, + { + 0x021cu, + ADI_STRING("OSAL Service Error: Mutex Pointer"), + ADI_STRING("Invalid Mutex pointer"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Mutex Pointer is Valid") + }, + { + 0x021du, + ADI_STRING("OSAL Service Error: Mutex UnAvailable"), + ADI_STRING("Unable to obtain the Specified Mutex"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Mutex Availability") + }, + { + 0x021eu, + ADI_STRING("OSAL Service Error: Mutex Ownership"), + ADI_STRING("Specified Mutex is not Owned by the Calibrationler"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Ownership of Mutex") + }, + { + 0x021fu, + ADI_STRING("OSAL Service Error: Priority Inheritance"), + ADI_STRING("Invalid Priority Inheritance Parameter Specified"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Priority Inheritance Parameter is Valid") + }, + { + 0x0220u, + ADI_STRING("OSAL Service Error: Operation Failed"), + ADI_STRING("Specified Operation was not Completed"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Operation Process") + }, + { + 0x0221u, + ADI_STRING("OSAL Service Error: Semaphore Limit"), + ADI_STRING("Semaphore upper limit has been exceeded"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Usage of Semaphores") + }, + { + 0x0222u, + ADI_STRING("OSAL Service Error: Invalid Semaphore Limit"), + ADI_STRING("Specified Semaphore Ceiling is Invalid"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Parameter is Valid") + }, + { + 0x0223u, + ADI_STRING("OSAL Service Error: Log Link Search Failed"), + ADI_STRING("No Valid Node found in the OSAL Log Link"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Parameter is Valid") + }, + { + 0x0224u, + ADI_STRING("OSAL Service Error: Invalid Log Link Node"), + ADI_STRING("OSAL Dynamic Link List Functions were Passed an Invalid Node Index as an Input Parameter"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Parameter is Valid") + }, + { + 0x0225u, + ADI_STRING("OSAL Service Error: Invalid Log Item"), + ADI_STRING("Invalid Input Log Item"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Parameter is Valid") + }, + { + 0x0226u, + ADI_STRING("OSAL Service Error: Invalid Log Pointer"), + ADI_STRING("Log Function was Passed an Invalid Pointer as a Parameter"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Parameter is Valid") + }, + { + 0x0227u, + ADI_STRING("the maximum number of init threads (64) is exceeded"), + ADI_STRING("too many threads are being used for initialization"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Parameter is Valid") + }, + { + 0x02f0u, + ADI_STRING("OSAL Service Error: Osal Platform Start"), + ADI_STRING("Osal Platform Start"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Parameter is Valid") + }, + { + 0x02feu, + ADI_STRING("OSAL Service Error: Osal Platform End"), + ADI_STRING("Osal Platform End"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Parameter is Valid") + }, + { + 0x02ffu, + ADI_STRING("OSAL Service Error: Disabled Feature"), + ADI_STRING("Requested Feature is not Enabled"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Parameter is Valid") + }, + { + 0x0301u, + ADI_STRING("Log Trace Error: Parameter Out of Range"), + ADI_STRING("Invalid Log Argument Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Log Trace Argument is Valid") + }, + { + 0x0302u, + ADI_STRING("Log Trace Error: Core ID"), + ADI_STRING("Invalid Core ID Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Valid Core ID is Valid") + }, + { + 0x0303u, + ADI_STRING("Log Trace Error: UART Transmit"), + ADI_STRING("UART Failed to Transmit"), + ADI_ADRV904X_ERR_ACT_CHECK_INTERFACE, + ADI_STRING("Check that UART is Correctly Configured") + }, + { + 0x0401u, + ADI_STRING("DFE Event Service Error: Capture Queue Full"), + ADI_STRING("Capture Queue is Full"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Wait until Queue has Capacity to process Requests") + }, + { + 0x0402u, + ADI_STRING("DFE Event Service Error: Memory Allocation"), + ADI_STRING("Capture Buffer could not be Allocated"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Wait until more Captures are processed before making a request this size") + }, + { + 0x0403u, + ADI_STRING("DFE Event Service Error: Capture Type"), + ADI_STRING("Invalid Capture Type Provided to Function"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Capture Type Parameter is Valid") + }, + { + 0x0404u, + ADI_STRING("DFE Event Service Error: Capture Type Request"), + ADI_STRING("Capture Type requested was not configured"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Request is Valid") + }, + { + 0x0405u, + ADI_STRING("DFE Event Service Error: Capture Buffer Busy"), + ADI_STRING("Capture in Progress"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Wait until Current Capture has finished") + }, + { + 0x0406u, + ADI_STRING("DFE Event Service Error: Event Type"), + ADI_STRING("Invalid Event Type Requested"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Event Type Parameter is Valid") + }, + { + 0x0407u, + ADI_STRING("DFE Event Service Error: Adaptation Busy"), + ADI_STRING("Adaptation Currently in Progress"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Wait or Abort Current Request before Calibrationling Again") + }, + { + 0x0408u, + ADI_STRING("DFE Event Service Error: Unexpected Capture Event"), + ADI_STRING("Unknown Cause to Error Event"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Request is Valid") + }, + { + 0x0409u, + ADI_STRING("DFE Event Service Error: Capture Channel"), + ADI_STRING("Invalid Capture Channel Requested"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Capture Channel Parameter is Valid") + }, + { + 0x040Au, + ADI_STRING("DFE Event Service Error: VSWR Direction"), + ADI_STRING("Invalid VSWR Direction Parameter"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check VSWR Direction is Valid") + }, + { + 0x040Bu, + ADI_STRING("DFE Event Service Error: Invalid capture requested"), + ADI_STRING("Check if the capture request is supported for Radio mode (RS or RCI)"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check if the capture request is supported for Radio mode (RS or RCI)") + }, + { + 0x040Cu, + ADI_STRING("DFE Capture Service Error: Power measurement abort has failed (RCI mode)"), + ADI_STRING("Unexpected error"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Contact ADI with memdump if the Problem Persists") + }, + { + 0x040Du, + ADI_STRING("DFE Event Service Error: Invalid capture period requested"), + ADI_STRING("Check if the capture period request is supported(for RS/RCI or DFE mapping mode)"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check if the capture period request is supported(for RS/RCI or DFE mapping mode)") + }, + { + 0x040Eu, + ADI_STRING("DFE Event Service Error: Invalid CTC decimation rate configuration"), + ADI_STRING("CTC decimation rate does meet the min/max rate requirement"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check if the CTC decimation rate meets the min/max rate requirement") + }, + { + 0x040Fu, + ADI_STRING("DFE Event Service Error: Invalid CTC envelop power configuration"), + ADI_STRING("Invalid CTC envelop power is configured"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check if the CTC envelop power is configured properly") + }, + { + 0x0410u, + ADI_STRING("DFE Event Service Error: Invalid CTC row configuration"), + ADI_STRING("Number of CTC rows exceed the maximum allowable rows in the HW"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check if the CTC rows are properly configured") + }, + { + 0x0411u, + ADI_STRING("DFE Event Service Error: Invalid CTC column configuration"), + ADI_STRING("Number of CTC columns exceed the maximum allowable columns in the HW"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check if the CTC columns are properly configured") + }, + { + 0x0412u, + ADI_STRING("DFE Event Service Error: Duplicate CTC envelop power configuration"), + ADI_STRING("Duplicate CTC envelop power is configured for the same time constant"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check if the duplicate CTC envelop power is configured for the same time constant") + }, + { + 0x0413u, + ADI_STRING("DFE Event Service Error: CTC path balance failed"), + ADI_STRING("Main datapath delay is less than CT datapath delay. Path balance can't be achieved."), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Need to reduce the decimator ratios or enable CFR with more CFR engines") + }, + { + 0x0414u, + ADI_STRING("DFE Event Service Error: CTC path fractional sample balance required"), + ADI_STRING("There is a fractional delay difference between main datapath and CT datapath"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Need to add one delay in both gmp_j_pgrm_delay and gmp_i_pgrm_delay of all GMP models") + }, + { + 0x0415u, + ADI_STRING("DFE Event Service Error: CTC path exhibits uncorrectable fractional delay"), + ADI_STRING("Could be caused by bad configurator settings"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check configurator settings") + }, + { + 0x0416u, + ADI_STRING("DFE Event Service Error: Alignment of CTC pre-DPD capture and CTC envelop capture failed"), + ADI_STRING("Alignment of CTC pre-DPD capture and CTC envelop capture can not be achieved"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Modification of CTC model configuration is required") + }, + { + 0x0417u, + ADI_STRING("DFE Event Service Error: Invalid decimator selected for a row"), + ADI_STRING("Invalid decimator selected for a row"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Modification of CTC model configuration is required") + }, + { + 0x0418u, + ADI_STRING("DFE Event Service Error: Invalid fbox scaler selected"), + ADI_STRING("Fbox scaler value cannot be smaller than minimum scaler value detected based on max num of columns"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Increase fbox scaler value") + }, + { + 0x0601u, + ADI_STRING("Radio Control Service Error: Radio Sequencer Pattern Table"), + ADI_STRING("Invalid Radio Sequencer Pattern Table Pointer"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check References to Pattern Tables") + }, + { + 0x0602u, + ADI_STRING("Radio Control Service Errors: Radio Sequencer LUT CRC"), + ADI_STRING("Computed LUT CRC does not Match the Provided CRC"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Image is Valid & Reprogram Device") + }, + { + 0x0603u, + ADI_STRING("Radio Control Service Errors: Radio Sequencer Initialization"), + ADI_STRING("CPU Profile doesn't Enable the Radio Sequencer"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Review CPU Profile & Reprogram Device") + }, + { + 0x0604u, + ADI_STRING("Radio Control Service Errors: Tx attenuation step size is invalid"), + ADI_STRING("Tx attenuation step size is invalid"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Review CPU Profile & Reprogram Device") + }, + { + 0x0605u, + ADI_STRING("Radio Control Service Errors: Orx attenuation value invalid"), + ADI_STRING("Orx attenuation value is invalid"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Use BBIC API to configure Orx attenuation") + }, + { + 0x0606u, + ADI_STRING("Radio Control Service Errors: Tx-Orx mapping invalid"), + ADI_STRING("Tx to Orx mapping is not valid because the Orx is not a valid channel number, or the Orx is not connected to any Tx."), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Tx and Orx channel numbers and mapping setting") + }, + { + 0x0701u, + ADI_STRING("Event Service Error: Event Type"), + ADI_STRING("Invalid Event Type Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Event Type Parameter is Valid") + }, + { + 0x0702u, + ADI_STRING("Event Service Error: Event Register Limit"), + ADI_STRING("Thread Register Limit for same Event Type Reached"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check That All Threads are Required for that Event") + }, + { + 0x0703u, + ADI_STRING("Event Service Error: Duplicate Thread Registration"), + ADI_STRING("Thread already Registered for Event Type"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Parameter is Valid") + }, + { + 0x0704u, + ADI_STRING("Event Service Error: Event Not Registered"), + ADI_STRING("Thread not Registered to Receive Event Type"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Thread can be registered for Event Type") + }, + { + 0x0705u, + ADI_STRING("Event Service Error: Queue Full"), + ADI_STRING("Event could not be Notified because Receiving Thread's Queue was full"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Capacity of Receiving Queue") + }, + { + 0x0706u, + ADI_STRING("Event Service Error: Event Timeout"), + ADI_STRING("Event Timed Out"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check that Event was Correctly Registered") + }, + { + 0x0901u, + ADI_STRING("Malloc Service Error: Service Initialization Failed"), + ADI_STRING("Mutex / Byte Pool Create Failure, or Non-Contiguous Memory"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reprogram Device") + }, + { + 0x0902u, + ADI_STRING("Malloc Service Error: Memory Pool Allocation Failed"), + ADI_STRING("Memory Pool too small or not enough Space Available"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Memory Requirements & Usage") + }, + { + 0x0903u, + ADI_STRING("Malloc Service Error: Non-Contiguous Memory Region"), + ADI_STRING("Memory Block is not Contiguous"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reprogram Device") + }, + { + 0x0904u, + ADI_STRING("Malloc Service Error: Memory Pool Create Failed"), + ADI_STRING("Could not Create Dynamic Memory Pools"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Memory Requirements & Usage") + }, + { + 0x0905u, + ADI_STRING("Malloc Service Error: Memory Alignment Failure"), + ADI_STRING("Memory Region not aligned on unsigned long boundary"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Memory Requirements & Usage") + }, + { + 0x0906u, + ADI_STRING("Malloc Service Error: L4 Boundary Limit"), + ADI_STRING("Requested Memory Region is outside of L4 Memory space"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Memory Requirements & Usage") + }, + { + 0x0907u, + ADI_STRING("Malloc Service Error: Invalid Memory Pool"), + ADI_STRING("Number of Memory Pool bytes Available exceeds Memory Pool size"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Memory Requirements & Usage") + }, + { + 0x0908u, + ADI_STRING("Malloc Service Error: Invalid Heap Memory Pool"), + ADI_STRING("Initial Heap Memory Pool is Invalid or Returns Invalid Bytes Available"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Memory Requirements & Usage") + }, + { + 0x0909u, + ADI_STRING("Malloc Service Error: Free Space Information Get Failed"), + ADI_STRING("Free Space Memory Pool is Invalid or Returns Invalid Bytes Available"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Memory Requirements & Usage") + }, + { + 0x090au, + ADI_STRING("Malloc Service Error: Dynamic Memory Information Get Failed"), + ADI_STRING("Initial Heap / Free Space Memory Pool Invalid or returns Invalid bytes Available"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Memory Requirements & Usage") + }, + { + 0x0A01u, + ADI_STRING("BBIC Bridge Service Error: Firmware Image Initialization Region Size Limit"), + ADI_STRING("Firmware Image exceeds Initialization Region Limit"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reduce Firmware Image Size and Reprogram Device. Contact ADI if the Problem Persists") + }, + { + 0x0B01u, + ADI_STRING("Memory Buffer Management Service Error: Initialization Failed"), + ADI_STRING("Memory Allocation Failed"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Memory Requirements & Usage") + }, + { + 0x0B02u, + ADI_STRING("Memory Buffer Management Service Error: Capture Buffer Acquirement Failed"), + ADI_STRING("Lack of Memory Buffer Available for Required Capture"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Memory Requirements & Usage") + }, + { + 0x0B03u, + ADI_STRING("Memory Buffer Management Service Error: Capture Mutex Release Failure"), + ADI_STRING("External DPD Capture Data Handle in Process"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Capture Status should be Released at this Point") + }, + { + 0x0B04u, + ADI_STRING("Memory Buffer Management Service Error: Invalid Buffer Release"), + ADI_STRING("Attempt made to release an Invalid Memory Buffer"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check which Memory Buffers are Available for Release") + }, + { + 0x0B05u, + ADI_STRING("Memory Buffer Management Service Error: No Buffer Instance"), + ADI_STRING("Attempt made to acquire more buffers than Available"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Number of Available Buffers") + }, + { + 0x0B06u, + ADI_STRING("Memory Buffer Management Service Error: Buffer Allocation Failed"), + ADI_STRING("Unable to Allocate Memory for Buffer Management"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Memory Requirements & Usage") + }, + { + 0x0B07u, + ADI_STRING("Memory Buffer Management Service Error: No Available Buffer"), + ADI_STRING("Buffer semaphore count is non-Zero, but no buffers marked Available"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reprogram Device") + }, + { + 0x0B08u, + ADI_STRING("Memory Buffer Management Service Error: UnAllocated Buffer"), + ADI_STRING("Buffer Type has Zero Allocated Instances"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Buffer Allocations for Buffer Type") + }, + { + 0x0B09u, + ADI_STRING("Memory Buffer Management Service Error: Number of Samples"), + ADI_STRING("Invalid Number of Samples Parameter"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Number of Samples Parameter is Valid") + }, + { + 0x0B0Au, + ADI_STRING("Memory Buffer Management Service Error: Number of DPD Features"), + ADI_STRING("Invalid Number of DPD Features Parameter"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Number of DPD Features Parameter is Valid") + }, + { + 0x0B0Bu, + ADI_STRING("Memory Buffer Management Service Error: Number of Filter Coefficients"), + ADI_STRING("Invalid Number of Filter Coefficients Parameter"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Number of Filter Coefficients Parameter is Valid") + }, + { + 0x0B0Cu, + ADI_STRING("Memory Buffer Management Service Error: Number of 2-Way Samples"), + ADI_STRING("Invalid Number of 2-Way Samples Parameter"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Number of 2-Way Samples Parameter is Valid") + }, + { + 0x0B0Du, + ADI_STRING("Memory Buffer Management Service Error: Number of 3-Way Samples"), + ADI_STRING("Invalid Number of 3-Way Samples Parameter"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Number of 3-Way Samples Parameter is Valid") + }, + { + 0x0B0Eu, + ADI_STRING("Memory Buffer Management Service Error: Number of Adaptation Buffers"), + ADI_STRING("Invalid Number of Adaptation Buffers Parameter"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Number of Adaptation Buffers Parameter is Valid") + }, + { + 0x0B0Fu, + ADI_STRING("Memory Buffer Management Service Error: Number of Capture Ways"), + ADI_STRING("Invalid Number of Capture Ways Parameter"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Number of Capture Ways Parameter is Valid") + }, + { + 0x0B10u, + ADI_STRING("Memory Buffer Management Service Error: Number of Capture Buffers"), + ADI_STRING("Invalid Number of Capture Buffers Parameter"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Number of Capture Buffers Parameter is Valid") + }, + { + 0x0B11u, + ADI_STRING("Memory Buffer Management Service Error: Number of Captures per Adaptation"), + ADI_STRING("Invalid Number of Captures per Adaptation Parameter"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Number of Captures per Adaptation Parameter is Valid") + }, + { + 0x0B12u, + ADI_STRING("Memory Buffer Management Service Error: Number of VSWR Samples"), + ADI_STRING("Invalid Number of VSWR Samples Parameter"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Number of VSWR Samples Parameter is Valid") + }, + { + 0x0B13u, + ADI_STRING("Memory Buffer Management Service Error: Number of VSWR Buffers"), + ADI_STRING("Invalid Number of VSWR Buffers Parameter"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Number of VSWR Buffers Parameter is Valid") + }, + { + 0x0B14u, + ADI_STRING("Memory Buffer Management Service Error: Number of LUT Buffers"), + ADI_STRING("Invalid Number of LUT Buffers Parameter"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Number of VSWR Buffers Parameter is Valid") + }, + { + 0x0B15u, + ADI_STRING("Memory Buffer Management Service Error: Number of DPD Processing Buffers"), + ADI_STRING("Invalid Number of DPD Processing Buffers Parameter"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Number of DPD Processing Buffers Parameter is Valid") + }, + { + 0x0B16u, + ADI_STRING("Memory Buffer Management Service Error: Number of CTC FLUT Buffers"), + ADI_STRING("Invalid Number of CTC FLUT Buffers Parameter"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Number of CTC FLUT Buffers Parameter is Valid") + }, + { + 0x0C01u, + ADI_STRING("Configuration Adjustment Service Error: Configuration Key MisMatch"), + ADI_STRING("Invalid Configuration Key Parameter"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Configuration Key Parameter is Valid") + }, + { + 0x0C02u, + ADI_STRING("Configuration Adjustment Service Error: Configuration Service is Locked"), + ADI_STRING("Configuration Service has not been Unlocked"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Unlock Configuration before trying again") + }, + { + 0x0C03u, + ADI_STRING("Configuration Adjustment Service Error: Get Configuration Command"), + ADI_STRING("Get Configuration Command is not Supported for the Provided Object ID"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Get Configuration Command is Supported for the Provided Object ID") + }, + { + 0x0C04u, + ADI_STRING("Configuration Adjustment Service Error: Set Configuration Command"), + ADI_STRING("Set Configuration Command is not Supported for the Provided ObjID"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Set Configuration Command is Supported for the Provided Object ID") + }, + { + 0x0C05u, + ADI_STRING("Configuration Adjustment Service Error: Configuration Object ID"), + ADI_STRING("Invalid Configuration Object ID was received with the last Configuration Command"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Configuration Object ID is Valid") + }, + { + 0x0C06u, + ADI_STRING("Configuration Adjustment Service Error: Configuration Limit"), + ADI_STRING("Configuration Buffer Limit Reached"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check if all Configurations are Required") + }, + { + 0x0C07u, + ADI_STRING("Configuration Adjustment Service Error: Configuration Data Size"), + ADI_STRING("Invalid Configuration Data Size Parameter"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Configuration Data Size Parameter is Valid") + }, + { + 0x0C08u, + ADI_STRING("Configuration Adjustment Service Error: Configuration Offset"), + ADI_STRING("Invalid Configuration Offset Parameter"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Configuration Offset Parameter is Valid") + }, + { + 0x0F01u, + ADI_STRING("ECC-Parity Error: Unrecoverable ECC Error"), + ADI_STRING("Memory Hardware Fault"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the Problem Persists") + }, + { + 0x0F02u, + ADI_STRING("ECC-Parity Error: ECC configuration"), + ADI_STRING("Incorrect Parameter Provided for ECC configuration"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Ensure Input Parameters are correct") + }, + { + 0x1001u, + ADI_STRING("Watchdog Error: Watchdog configuration"), + ADI_STRING("Incorrect Parameter Provided for Watchdog configuration"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Ensure Input Parameters are correct") + }, + { + 0x1002u, + ADI_STRING("Watchdog Error: Watchdog timer 0 expired"), + ADI_STRING("Possible system lockup detected"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the Problem Persists") + }, + { + 0x1003u, + ADI_STRING("Watchdog Error: Watchdog timer 1 expired"), + ADI_STRING("Possible system lockup detected"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the Problem Persists") + }, + { + 0x1004u, + ADI_STRING("Watchdog Error: Watchdog timer 2 expired"), + ADI_STRING("Possible system lockup detected"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the Problem Persists") + }, + { + 0x1005u, + ADI_STRING("Watchdog Error: Watchdog timer 3 expired"), + ADI_STRING("Possible system lockup detected"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the Problem Persists") + }, + { + 0x1101u, + ADI_STRING("Radio Command Error: Transaction ID"), + ADI_STRING("Invalid Transaction ID Received"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Transaction ID is Valid") + }, + { + 0x1102u, + ADI_STRING("Radio Command Error: Link Busy"), + ADI_STRING("Link is Currently Processing a Command"), + ADI_ADRV904X_ERR_ACT_CHECK_INTERFACE, + ADI_STRING("Wait for Link to Complete current Command") + }, + { + 0x1103u, + ADI_STRING("Radio Command Error: Link Number"), + ADI_STRING("Invalid Link Number Provided in Command"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Valid Link Number is Valid") + }, + { + 0x1104u, + ADI_STRING("Radio Command Error: Mailbox Number"), + ADI_STRING("Invalid Mailbox Number Received"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Mailbox Number is Valid") + }, + { + 0x1105u, + ADI_STRING("Radio Command Error: Message size"), + ADI_STRING("Invalid Command or Response Size Received"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Command and Response Sizes are Valid") + }, + { + 0x1106u, + ADI_STRING("Radio Command Error: Message response content is bad"), + ADI_STRING("Response message contains unexpected data"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Command and Response values") + }, + { + 0x1107u, + ADI_STRING("Radio Command Error: Message parameter is invalid"), + ADI_STRING("Message contains an invalid parameter"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check parameters in message") + }, + { + 0x2001u, + ADI_STRING("Debug Service Error: Debug Key MisMatch"), + ADI_STRING("Invalid Debug Key Parameter"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Debug Key Parameter is Valid") + }, + { + 0x2002u, + ADI_STRING("Debug Service Error: Command Length"), + ADI_STRING("Invalid Command Length Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Command Length is Valid") + }, + { + 0x2003u, + ADI_STRING("Debug Service Error: Debug Command"), + ADI_STRING("Invalid Debug Command Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Debug Command is Valid") + }, + { + 0x3001u, + ADI_STRING("GPIO Driver Error: Signal ID"), + ADI_STRING("Invalid Signal ID Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Signal ID Provided is Valid") + }, + { + 0x3002u, + ADI_STRING("GPIO Driver Error: Pin ID"), + ADI_STRING("Invalid GPIO Pin ID Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Pin ID Provided is Valid") + }, + { + 0x3003u, + ADI_STRING("GPIO Driver Error: Alarm Assignment"), + ADI_STRING("Requested Alarm has no GPIO Input Assigned"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Verify Alarm Configuration") + }, + { + 0x3101u, + ADI_STRING("GPT Driver Error: GPT Instance Allocated"), + ADI_STRING("Attempt to Allocate previously Allocated GPT instance"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check GPT Allocations") + }, + { + 0x3102u, + ADI_STRING("GPT Driver Error: GPT Instance Not Allocated"), + ADI_STRING("Invalid GPT Instance Allocation State"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check GPT Instance Allocation Status") + }, + { + 0x3103u, + ADI_STRING("GPT Driver Error: Processor Core"), + ADI_STRING("Invalid Processor Core Parameter"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Processor Core Parameter is Valid") + }, + { + 0x3104u, + ADI_STRING("GPT Driver Error: Interrupt Configuration"), + ADI_STRING("Invalid processor core / failed to register IRQ"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check GPT Interrupt Parameters are Valid") + }, + { + 0x3105u, + ADI_STRING("GPT Driver Error: Timeout Limit"), + ADI_STRING("Invalid Timeout Limit Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Timeout Limit Parameter is Valid") + }, + { + 0x3106u, + ADI_STRING("GPT Driver Error: System Clock Get"), + ADI_STRING("Invalid System Clock Get"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check System Clock is Valid") + }, + { + 0x3107u, + ADI_STRING("GPT Driver Error: Mutex"), + ADI_STRING("OSAL Mutex Error"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check OSAL Mutex Status") + }, + { + 0x3201u, + ADI_STRING("Interrupt Driver Error: Interrupt ID"), + ADI_STRING("Invalid Interrupt ID Parameter Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Interrupt ID Parameter is Valid") + }, + { + 0x3202u, + ADI_STRING("Interrupt Driver Error: CPU Core ID"), + ADI_STRING("Invalid CPU Core ID Parameter Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check CPU Core ID Parameter is Valid") + }, + { + 0x3203u, + ADI_STRING("Interrupt Driver Error: Interrupt Priority"), + ADI_STRING("Invalid Interrupt Priority Parameter Provided"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Interrupt Priority Parameter is Valid") + }, + { + 0x3204u, + ADI_STRING("Interrupt Driver Error: Invalid Interrupt Service Pointer"), + ADI_STRING("Invalid Interrupt Service Pointer Provided"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Interrupt Service Pointer is Valid") + }, + { + 0x3205u, + ADI_STRING("Interrupt Driver Error: Unexpected Interrupt"), + ADI_STRING("No handler installed for Interrupt"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check all Interrupts are correctly handled") + }, + { + 0x3206u, + ADI_STRING("Interrupt Driver Error: Unexpected Fast Interrupt"), + ADI_STRING("No handler installed for Fast Interrupt"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check all Fast Interrupts are correctly handled") + }, + { + 0x3207u, + ADI_STRING("Interrupt Driver Error: Unconfigured Interrupt"), + ADI_STRING("No handler installed for Interrupt"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Interrupt was configured correctly") + }, + { + 0x3208u, + ADI_STRING("Interrupt Driver Error: Active Interrupt"), + ADI_STRING("Interrupt not Disabled before subsequent Calibrationibrationl to Configure"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Disable Interrupt before reconfiguration") + }, + { + 0x32F0u, + ADI_STRING("Interrupt Driver Error: Platform Interrupt Start"), + ADI_STRING("Platform Interrupt Start"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Interrupt was configured correctly") + }, + { + 0x32FFu, + ADI_STRING("Interrupt Driver Error: Platform Interrupt End"), + ADI_STRING("Platform Interrupt End"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Interrupt was configured correctly") + }, + { + 0x3301u, + ADI_STRING("UART Driver Error: UART Driver ID"), + ADI_STRING("Invalid UART Driver ID Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check UART Driver ID Parameter is Valid") + }, + { + 0x3302u, + ADI_STRING("UART Driver Error: System Clock Get"), + ADI_STRING("System Clock Data not Available for Calibrationculation"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check System Clock is Configured Correctly") + }, + { + 0x3303u, + ADI_STRING("UART Driver Error: Semaphore Create"), + ADI_STRING("OSAL unable to create Semaphore"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check OSAL Semaphores") + }, + { + 0x3304u, + ADI_STRING("UART Driver Error: Mutex"), + ADI_STRING("OSAL unable to Process Mutex"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check OSAL Mutex") + }, + { + 0x3305u, + ADI_STRING("UART Driver Error: Interrupt Initialization"), + ADI_STRING("Interrupt Driver did not Register Interrupt Handler"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Interrupt Handler") + }, + { + 0x3306u, + ADI_STRING("UART Driver Error: Uninitialized"), + ADI_STRING("UART Driver Requested is not Initialized"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("UART Driver Requires Initialization before use") + }, + { + 0x3307u, + ADI_STRING("UART Driver Error: Tx FIFO Full"), + ADI_STRING("Request made to Transmit with Tx FIFO Full"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Wait until UART Driver has transmitted existing Data") + }, + { + 0x3308u, + ADI_STRING("UART Driver Error: Semaphore Wait"), + ADI_STRING("Unexpected Semaphore Error during UART Transmit"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check OSAL Semaphores") + }, + { + 0x3401u, + ADI_STRING("Mailbox Driver Error: Busy"), + ADI_STRING("Mailbox is not Available to process new commands"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Poll Mailbox until Ready") + }, + { + 0x3402u, + ADI_STRING("Mailbox Driver Error: Initialization"), + ADI_STRING("Unable to create OSAL Mutex"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check OSAL Mutex for Mailbox") + }, + { + 0x3403u, + ADI_STRING("Mailbox Driver Error: Clear/Pending Update"), + ADI_STRING("OSAL Mutex Failed during Status Update"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check OSAL Mutex for Mailbox") + }, + { + 0x3404u, + ADI_STRING("Mailbox Driver Error: Configuration Update"), + ADI_STRING("OSAL Mutex Failed during Configuration Update"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check OSAL Mutex for Mailbox") + }, + { + 0x3405u, + ADI_STRING("Mailbox Driver Error: Send Command"), + ADI_STRING("OSAL Mutex Failed during Send Command"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check OSAL Mutex for Mailbox & if Mailbox was Ready to Accept Commands") + }, + { + 0x3406u, + ADI_STRING("Mailbox Driver Error: Forced Exception"), + ADI_STRING("Forced Exception Command Received"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reprogram Device") + }, + { + 0x3601u, + ADI_STRING("SYSCLK Driver Error: Initialization"), + ADI_STRING("Driver not Initialized"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Configure System Clock") + }, + { + 0x3602u, + ADI_STRING("SYSCLK Driver Error: Invalid Frequency"), + ADI_STRING("System HS Digital Clock and/or Clock Dividers NOK"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Check Profile Clock Settings") + }, + { + 0x3701u, + ADI_STRING("STREAM Driver Error: Generic Parameter"), + ADI_STRING("One or more Input parameters are not Valid"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device, if Problem Persists contact ADI.") + }, + { + 0x3702u, + ADI_STRING("STREAM Driver Error: Timeout"), + ADI_STRING("Timeout can occur due to stream processor waiting for other streams to Complete"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the feature to recover from this error, if Problem Persists contact ADI.") + }, + { + 0x3703u, + ADI_STRING("STREAM Driver Error: Incomplete Task"), + ADI_STRING("Previous stream started did not finish"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the feature to recover from this error. if Problem Persists contact ADI.") + }, + { + 0x3704u, + ADI_STRING("STREAM Driver Error: Stream Error"), + ADI_STRING("Stream resulted in an error"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the feature to recover from this error. if Problem Persists contact ADI.") + }, + { + 0x3705u, + ADI_STRING("STREAM Driver Error: Previous Stream Error"), + ADI_STRING("Previous stream resulted in an error"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset the feature to recover from this error. if Problem Persists contact ADI.") + }, + { + 0x3801u, + ADI_STRING("Power Meter Driver Error: Parameter"), + ADI_STRING("Invalid Channel or Carrier Mask"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Channel and/or Carrier Mask is Valid") + }, + { + 0x3802u, + ADI_STRING("Power Meter Driver Error: Not Disabled"), + ADI_STRING("Power Meter is not Disabled"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Power Meter needs to be Disabled") + }, + { + 0x3803u, + ADI_STRING("Channel number inValid"), + ADI_STRING("Channel number is inValid for the meter type"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Firmware programmatic error. disable power meter, if Problem Persists contact ADI") + }, + { + 0x3804u, + ADI_STRING("Sample rate invalid"), + ADI_STRING("Selected carrier for TSSI or RSSI may not be initialized"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check if the carriers selected are enabled in the profile being used.") + }, + { + 0x3901u, + ADI_STRING("DMA Driver Error: DMA Channel Data"), + ADI_STRING("Invalid DMA Channel Data Provided"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check DMA Channel Data is Valid") + }, + { + 0x3902u, + ADI_STRING("DMA Driver Error: DMA Stream Busy"), + ADI_STRING("Supplied DMA Channel/stream ID is already open and in use"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Use of Streams") + }, + { + 0x3903u, + ADI_STRING("DMA Driver Error: Closed Stream"), + ADI_STRING("DMA Stream must be opened before it is used"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Use of Streams") + }, + { + 0x3904u, + ADI_STRING("DMA Driver Error: DMA Busy"), + ADI_STRING("Function not permitted since DMA transfer is in progress"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Function invoked in incorrect sequence. Check DMA Sequence") + }, + { + 0x3905u, + ADI_STRING("DMA Driver Error: Stream ID"), + ADI_STRING("Invalid Stream ID Parameter Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Stream ID Parameter is Valid") + }, + { + 0x3906u, + ADI_STRING("DMA Driver Error: Transfer Size"), + ADI_STRING("Invalid Transfer Size Parameter Provided (i.e. only 4 or 8 bytes allowed)"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Psize Calibrationibrationculation is Valid") + }, + { + 0x3907u, + ADI_STRING("DMA Driver Error: xCount"), + ADI_STRING("Invalid xCount Parameter Provided"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check xCount Parameter is Valid") + }, + { + 0x3908u, + ADI_STRING("DMA Driver Error: yCount"), + ADI_STRING("Invalid yCount Parameter Provided"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check yCount Parameter is Valid") + }, + { + 0x3909u, + ADI_STRING("DMA Driver Error: Start Address"), + ADI_STRING("Invalid Start Address Parameter Provided"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Start Address Parameter is Valid") + }, + { + 0x390Au, + ADI_STRING("DMA Driver Error: Address Alignment"), + ADI_STRING("MSize Calibrationculation doesnt work with Start Address"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Start Address Parameter is Correctly Aligned") + }, + { + 0x390Bu, + ADI_STRING("DMA Driver Error: Handle Validation"), + ADI_STRING("DMA Stream Handle was outside Valid Range"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check DMA Stream Handle") + }, + { + 0x390Cu, + ADI_STRING("DMA Driver Error: NULL Pointer"), + ADI_STRING("Invalid Pointer Provided"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Check Pointers Passed as Parameters are Valid") + }, + { + 0x390Du, + ADI_STRING("DMA Driver Error: Buffer(s)"), + ADI_STRING("Invalid Data buffer(s) Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Data buffer(s) Provided are Valid") + }, + { + 0x3A01u, + ADI_STRING("Capture Driver Error: VSWR Playback Generator Enabled"), + ADI_STRING("VSWR Playback Generator is running when trying to access RAM"), + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, + ADI_STRING("Playback Generator must be Disabled while accessing VSWR Playback RAM") + }, + { + 0x3A02u, + ADI_STRING("Capture Driver Error: VSWR Playback RAM Sample Count"), + ADI_STRING("Invalid Sample Count Parameter Provided"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Sample Count Parameter is Valid") + }, + { + 0x3A03u, + ADI_STRING("Capture Driver Error: Fractional delay needed to align capture sets"), + ADI_STRING("Check CFR delay and CT DPD input selection. Fractional delay isn't allowed for capture buffer."), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check CFR and CT_DPD configuration") + }, + { + 0x3BF0u, + ADI_STRING("Hw If Driver Error: Hw If Platform Start"), + ADI_STRING("Hw If Platform Start"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Parameter is Valid") + }, + { + 0x3BFFu, + ADI_STRING("Hw If Driver Error: Hw If Platform End"), + ADI_STRING("Hw If Platform End"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check Parameter is Valid") + }, + { + 0x3C01u, + ADI_STRING("DFE Driver Error: Invalid decimation ratio for selected decimator"), + ADI_STRING("Check if CTC model is configured and decimators in use has non-zero decimation ratios"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check if CTC model is configured and decimators in use has non-zero decimation ratios") + }, + { + 0x3C02u, + ADI_STRING("DFE Driver Error: Invalid first stage interpolation ratio"), + ADI_STRING("Check if CTC model is configured and decimators in use has non-zero first stage interpolator"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check if CTC model is configured and decimators in use has non-zero first stage interpolator") + }, + { + 0x3C03u, + ADI_STRING("DFE Driver Error: Invalid second stage interpolation ratio"), + ADI_STRING("Check if second stage interpolation ratio is non-zero"), + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_STRING("Check if second stage interpolation ratio is non-zero") + }, +/* END AUTOGENERATED CPU RUNTIME ERROR TABLE */ +}; + +const adrv904x_DfeCpuBootErrCodes_t adrv904x_DfeCpuBootErrTable[] = +{ +/* DO NOT EDIT THIS TABLE, CHANGES WILL BE OVERWRITTEN DURING FULL BUILD */ +/* START AUTOGENERATED CPU BOOT ERROR TABLE */ + + { + 0x0000u, + ADI_STRING("Used to put API in wait for CPU state."), + ADI_STRING("CPU powered up."), + ADI_ADRV904X_ERR_ACT_NONE, + ADI_STRING("No action required.") + }, + { + 0x0001u, + ADI_STRING("CPU booted with no failure."), + ADI_STRING("CPU booted with no failure."), + ADI_ADRV904X_ERR_ACT_NONE, + ADI_STRING("No action required.") + }, + { + 0x0002u, + ADI_STRING("Primary CPU waiting for secondary CPU(s) to boot."), + ADI_STRING("Secondary CPU failed to complete. See secondary CPU boot status for more details."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x004u, + ADI_STRING("DFE CPU boot has entered pre-init stage"), + ADI_STRING("DFE CPU boot pre-init stage has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x005u, + ADI_STRING("DFE CPU boot has entered initialization of device profile stage"), + ADI_STRING("Device profile stage has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x006u, + ADI_STRING("DFE CPU boot has entered OSAL initialization stage"), + ADI_STRING("OSAL initialization stage has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x007u, + ADI_STRING("DFE CPU boot has entered memory service pre-initialization stage"), + ADI_STRING("Memory service pre-initialization stage has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x008u, + ADI_STRING("DFE CPU boot is attempting to start initial thread"), + ADI_STRING("Starting of initial thread has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x009u, + ADI_STRING("DFE CPU boot has entered DFE Application application_config() function"), + ADI_STRING("application_config() has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists if using ADI-provided DFE image. Otherwise, debug customer application_config().") + }, + { + 0x00Au, + ADI_STRING("DFE CPU boot has entered DFE Application application_init() function"), + ADI_STRING("application_init() has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists if using ADI-provided DFE image. Otherwise, debug customer application_init().") + }, + { + 0x00Bu, + ADI_STRING("DFE CPU boot has entered initialization of the error handling service"), + ADI_STRING("Initialization of error handling service has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x00Cu, + ADI_STRING("DFE CPU boot has entered adaptation allocation stage"), + ADI_STRING("Adaptation allocation stage has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x00Eu, + ADI_STRING("DFE CPU boot has entered initialization of the memory allocation service"), + ADI_STRING("Memory allocation service has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x00Fu, + ADI_STRING("DFE CPU boot has entered initialization of the log and tracing service"), + ADI_STRING("Log and trace initialization has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x010u, + ADI_STRING("DFE CPU boot has entered event service initialization"), + ADI_STRING("Event service initialization has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x011u, + ADI_STRING("DFE CPU boot has entered radio control service initialization"), + ADI_STRING("Radio control service initialization has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x012u, + ADI_STRING("DFE CPU has entered BBIC Bridge service initialization"), + ADI_STRING("BBIC Bridge service initialization has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x013u, + ADI_STRING("DFE CPU has entered command service initialization"), + ADI_STRING("Command service initialization has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x014u, + ADI_STRING("DFE CPU has entered DFE capture service initialization"), + ADI_STRING("DFE capture service initialization has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x015u, + ADI_STRING("DFE CPU has entered DFE adaptation service initialization"), + ADI_STRING("DFE adaptation service initialization has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x016u, + ADI_STRING("DFE CPU has entered exception handler initialization"), + ADI_STRING("Exception handler initialization has failed, likely due to unhandled exception prior to initialization."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x017u, + ADI_STRING("CPU firmware image failed CRC verification."), + ADI_STRING("Programmed image is corrupted. Original image may be invalid or may have been corrupted during SPI transfer."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x018u, + ADI_STRING("Unexpected exception/error."), + ADI_STRING("An unhandled fatal error was encountered."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x019u, + ADI_STRING("CPU halted and waiting for debug image to be loaded by user"), + ADI_STRING("N/A"), + ADI_ADRV904X_ERR_ACT_NONE, + ADI_STRING("No action required") + }, + { + 0x01Au, + ADI_STRING("DFE CPU initial thread creation"), + ADI_STRING("Initial thread creation has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x01Bu, + ADI_STRING("DFE CPU system clock initialization"), + ADI_STRING("System clock initialization has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x01Cu, + ADI_STRING("DFE CPU interrupt initialization"), + ADI_STRING("Interrupt initialization has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x01Du, + ADI_STRING("DFE CPU exception halt initialization"), + ADI_STRING("Exception halt initialization has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x01Eu, + ADI_STRING("DFE CPU OS tick initialization"), + ADI_STRING("OS tick initialization has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x01Fu, + ADI_STRING("DFE CPU OS launch"), + ADI_STRING("OS launch has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x020u, + ADI_STRING("DFE CPU OS stack error checking initialization"), + ADI_STRING("Stack error checking initialization has failed preventing boot from progressing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x021u, + ADI_STRING("DFE CPU has entered early exception handler initialization"), + ADI_STRING("Early exception handler initialization has failed, likely due to unhandled exception prior to initialization."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x022u, + ADI_STRING("CPU halted and prepared for a new image to be loaded by BBIC"), + ADI_STRING("N/A"), + ADI_ADRV904X_ERR_ACT_NONE, + ADI_STRING("No action required") + }, + { + 0x023u, + ADI_STRING("DFE CPU has failed to initialize ECC"), + ADI_STRING("An ECC error has occurred in memory."), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x024u, + ADI_STRING("DFE CPU has finished with L4 memory flush"), + ADI_STRING("Force exception"), + ADI_ADRV904X_ERR_ACT_NONE, + ADI_STRING("No action required") + }, + { + 0x025u, + ADI_STRING("DFE CPU has failed to initialize watchdog service"), + ADI_STRING("Watchdog service encountered an error while initializing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, + { + 0x026u, + ADI_STRING("DFE CPU has failed to initialize radio command service"), + ADI_STRING("radio command service encountered an error while initializing"), + ADI_ADRV904X_ERR_ACT_RESET_DEVICE, + ADI_STRING("Reset device and try again. Contact ADI if the problem persists.") + }, +/* END AUTOGENERATED CPU BOOT ERROR TABLE */ +}; + +#endif /* _ADRV904X_DFE_SVC_ERROR_TABLES_H_ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_log_trace_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_log_trace_t.h new file mode 100644 index 00000000000..7780f7b9139 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_log_trace_t.h @@ -0,0 +1,49 @@ +/** + * Copyright 2020 - 2023 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adrv904x_dfe_svc_log_trace_t.h + * \brief Contains data types for DFE SDK data information + * + * DFE SDK API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_DFE_SVC_LOG_TRACE_T_H__ +#define __ADRV904X_DFE_SVC_LOG_TRACE_T_H__ + +#include "adi_adrv904x_dfe_svc_err_codes_t.h" +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_dfe_svc_log_trace_events_t.h" +#include + +#define ADI_ADRV904X_DFE_SVC_LOGTRACE_RELEASE (0) +#define ADI_ADRV904X_DFE_SVC_LOGTRACE_BUSY (1) + +#define ADI_ADRV904X_DFE_SVC_MAX_LOGTRACE_SIZE (16384U) + +#define ADI_ADRV904X_DFE_SVC_LOGTRACE_BUFFER_EMPTY(pBuff) (((pBuff)->wrIndex == (pBuff)->rdIndex) && ((pBuff)->wrapFlag == false)) +#define ADI_ADRV904X_DFE_SVC_LOGTRACE_BUFFER_FULL(pBuff) (((pBuff)->wrIndex == (pBuff)->rdIndex) && ((pBuff)->wrapFlag == true)) + +/** + * \brief LogTrace information structure for SDK + */ +ADI_ADRV904X_PACK_START +typedef struct +{ + uint64_t pData; /*!< Log Data Store Point*/ + uint32_t size; /*!< LogTrace Buffer Size*/ + uint32_t wrIndex; /*!< Log Data write index*/ + uint32_t rdIndex; /*!< Log Data read index*/ + bool wrapFlag; /*!< Log Data wrap flag*/ + bool overflowFlag; /*!< Memory Buffer overflow flag between api and sdk*/ + bool writeFlag; /*!< Memory Buffer write flag between api and sdk*/ + bool syncMark; /*!< Memory Buffer Synchronization flag between api and sdk*/ +} adrv904x_DfeSvcLogTraceBuffer_t; +ADI_ADRV904X_PACK_FINISH + +#endif /* __ADRV904X_DFE_SVC_LOG_TRACE_T_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_radio_ctrl_sequencer_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_radio_ctrl_sequencer_t.h new file mode 100644 index 00000000000..bd1dc412acd --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_svc_radio_ctrl_sequencer_t.h @@ -0,0 +1,201 @@ +/** + * Copyright 2020 - 2021 Analog Devices Inc. + * Released under the ADRV904X Software license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adrv904x_dfe_svc_radio_ctrl_sequencer_t.h + * \brief Contains data types for DFE SDK Radio Sequencer Service + * + * DFE SDK API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_T_H__ +#define __ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_T_H__ + +#include "adi_adrv904x_dfe_svc_radio_ctrl_sequencer_t.h" +#include "adi_adrv904x_platform_pack.h" + +/** + * \brief Maximum number of signals controllable by each sequencer + */ + #define ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MAX_SIGNALS (16) + +/* The following macros define the layout of patterns in the radio sequencer image. + * We reserve the first 32 pattern IDs for "shared" patterns, and then a block of + * 32 pattern IDs for each sequencer: + * + * ----------------------------- + * 0-31: Shared patterns + * ----------------------------- + * 32-63: Sequencer 0 patterns + * ----------------------------- + * 64-95: Sequencer 1 patterns + * ----------------------------- + * 96-127: Sequencer 2 patterns + * ----------------------------- + * etc. + * + * If a sequencer doesn't use all of its reserved IDs, the unused IDs are mapped + * to ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_NULL_PATTERN_GLOBAL_PTRN_ID (the null pattern). + * + * Then we define a simple formula for translating a "sequencer-relative" pattern ID + * to a "global" pattern ID: + * + * globalId = (sequencerId * NUM_PATTERNS_PER_SEQUENCER) + sequencerRelativePtrnId + NUM_SHARED_PATTERNS + * + * So the global ID for sequencer 2, pattern 1 is: + * 97 = (2 * 32) + 1 + 32 + * + * 97 is then used as the index in the pattern lookup table to get the + * memory address of sequencer 2 pattern 1. + */ + +/** + * \brief Maximum number of "shared" patterns, i.e. patterns that + * are run from multiple sequencers (NULL pattern) + */ +#define ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_NUM_SHARED_PATTERNS (32) + +/** + * \brief Number of entries reserved in the global pattern table for each sequencer + */ +#define ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_NUM_PATTERNS_PER_SEQUENCER (64) + +/* NOTE: The macro below must NOT be multi-line in order for conversion scripts to pick it up */ +/** + * \brief Translates a sequencer-relative pattern ID into a global pattern ID + */ +#define ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SEQ_PTRN_ID_TO_GLOBAL_ID(seqId, patternId) ((((seqId) * ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_NUM_PATTERNS_PER_SEQUENCER) + (patternId)) + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_NUM_SHARED_PATTERNS) + +/** + * \brief List of shared patterns (using global patterns IDs) + */ +#define ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_NULL_PATTERN_GLOBAL_PTRN_ID (0) +/* The startup pattern exists (and is NOT the first pattern) so that the + * starting address for the radio sequencers is a non-zero value. This is + * necessary so that we can distinguish between a radio sequencer that is still + * in reset, and one that has started executing code. + */ +#define ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_STARTUP_PATTERN_GLOBAL_PTRN_ID (1) + +/** + * \brief List of per-sequencer patterns (using sequencer-relative pattern IDs) + * for ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_FRAME_TIMING_X + */ +#define ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_DEFAULT_FRAMING_TIMING_SEQ_PTRN_ID (0) + +/** + * \brief List of per-sequencer patterns (using sequencer-relative pattern IDs) + * for ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_ORX_X_CAPTURE + */ +#define ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_DPD_VSWR_SEQ_PTRN_ID (0) +#define ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_CLGC_SEQ_PTRN_ID (1) + +/** + * \brief Maximum number of patterns + */ +#define ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_PTRN_MAX_NUM_PATTERNS (2048) + +/** + * \brief Maximum number of entries in the pattern lookup table + */ +#define ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_LOOKUP_TABLE_MAX_ENTRIES (2048U) + +/** + * \brief Enumeration for the radio seq GPRs numbers + * + */ +typedef enum +{ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_GPR_0 = 0, /*!< ID for Radio Sequencer GPR 0 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_GPR_1 = 1, /*!< ID for Radio Sequencer GPR 1 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_GPR_2 = 2, /*!< ID for Radio Sequencer GPR 2 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_GPR_3 = 3, /*!< ID for Radio Sequencer GPR 3 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_GPR_4 = 4, /*!< ID for Radio Sequencer GPR 4 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_GPR_5 = 5, /*!< ID for Radio Sequencer GPR 5 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_GPR_6 = 6, /*!< ID for Radio Sequencer GPR 6 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_GPR_7 = 7, /*!< ID for Radio Sequencer GPR 7 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_GPR_8 = 8, /*!< ID for Radio Sequencer GPR 8 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_GPR_9 = 9, /*!< ID for Radio Sequencer GPR 9 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_GPR_10 = 10, /*!< ID for Radio Sequencer GPR 10 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_GPR_11 = 11, /*!< ID for Radio Sequencer GPR 11 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_GPR_12 = 12, /*!< ID for Radio Sequencer GPR 12 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_GPR_13 = 13, /*!< ID for Radio Sequencer GPR 13 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_GPR_14 = 14, /*!< ID for Radio Sequencer GPR 14 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_GPR_15 = 15, /*!< ID for Radio Sequencer GPR 15 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_NUM_OF_GPRS = 16 /*!< Total number of GPRs */ +} adrv904x_DfeSvcRadioCtrlSequencerGpr_e; + +/** + * \brief Enumeration for the radio seq Tx functions + * + */ +typedef enum +{ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_TX_FUNC_VSWR_ON = 0, /*!< TX Func: TX DFE VSWR on */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_TX_FUNC_TX_ATTEN_UPDATE_TRIGGER = 1, /*!< TX Func: TX attenuation update */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_TX_FUNC_TSSI_1_MEAS_RESET = 2, /*!< TX Func: TSSI 1 measurement reset */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_TX_FUNC_TSSI_2_MEAS_RESET = 3, /*!< TX Func: TSSI 2 measurement reset */ +} adrv904x_DfeSvcRadioCtrlSequencerTxFuncId_e; + +/** + * \brief Enumeration for the radio seq GPRs numbers + * + */ +typedef enum +{ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_ORX_FUNC_TSSI_MEAS_ENABLE = 0, /*!< ORX Func: TSSI measurement enable */ +} adrv904x_DfeSvcRadioCtrlSequencerOrxFuncId_e; + +/** + * \brief Enumeration for the radio seq GPRs numbers + * + */ +typedef enum +{ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_TX_SIGNAL_ID_0 = 0, /*!< TX signal ID 0 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_TX_SIGNAL_ID_1 = 1, /*!< TX signal ID 1 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_TX_SIGNAL_ID_2 = 2, /*!< TX signal ID 2 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_TX_SIGNAL_ID_3 = 3, /*!< TX signal ID 3 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_TX_SIGNAL_ID_4 = 4, /*!< TX signal ID 4 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_TX_SIGNAL_ID_5 = 5, /*!< TX signal ID 5 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_TX_SIGNAL_ID_6 = 6, /*!< TX signal ID 6 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_TX_SIGNAL_ID_7 = 7, /*!< TX signal ID 7 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_TX_SIGNAL_ID_INVALID = 8, /*!< TX signal ID INVALID */ +} adrv904x_DfeSvcRadioCtrlSequencerTxSignalId_e; + +/** + * \brief Enumeration for the radio seq GPRs numbers + * + */ +typedef enum +{ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_ORX_SIGNAL_ID_0 = 0, /*!< ORX signal ID 0 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_ORX_SIGNAL_ID_1 = 1, /*!< ORX signal ID 1 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_ORX_SIGNAL_ID_2 = 2, /*!< ORX signal ID 2 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_ORX_SIGNAL_ID_3 = 3, /*!< ORX signal ID 3 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_ORX_SIGNAL_ID_4 = 4, /*!< ORX signal ID 4 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_ORX_SIGNAL_ID_5 = 5, /*!< ORX signal ID 5 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_ORX_SIGNAL_ID_6 = 6, /*!< ORX signal ID 6 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_ORX_SIGNAL_ID_7 = 7, /*!< ORX signal ID 7 */ + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_ORX_SIGNAL_ID_INVALID = 8, /*!< ORX signal ID INVALID */ +} adrv904x_DfeSvcRadioCtrlSequencerOrxSignalId_e; + +/** + * \brief Radio sequencer initialization data populated + * by the BBIC for the DFE via adrv904x_DfeMemInitTemp_t + */ +ADI_ADRV904X_PACK_START +typedef struct adrv904x_DfeSvcRadioCtrlSequencerInitData +{ + uint32_t sequenceLookupTable[ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_LOOKUP_TABLE_MAX_ENTRIES]; /*!< Pattern address lookup table */ + uint32_t numberPatterns; /*!< Number of entries in sequenceLookupTable[] */ + uint32_t sequenceLookupTableCrc; /*!< CRC of sequenceLookupTable[] */ +} adrv904x_DfeSvcRadioCtrlSequencerInitData_t; +ADI_ADRV904X_PACK_FINISH + +#endif /* __ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_T_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_vswr.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_vswr.h new file mode 100644 index 00000000000..8375af2ac03 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_dfe_vswr.h @@ -0,0 +1,40 @@ +/** +* Copyright 2023 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adrv904x_dfe_vswr.h +* \brief Contains ADRV904X VSWR function prototypes for +* adrv904x_dfe_vswr.c +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#ifndef _ADRV904X_DFE_VSWR_H_ +#define _ADRV904X_DFE_VSWR_H_ + +#include "adi_adrv904x_error.h" + + + +/** +* \brief Init Vswr number of samples to 0. +* +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] chanSel - Tx channel selection +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_VswrPlaybackDatNumOfSamplesInit(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e chanSel); + + +#endif /* _ADRV904X_DFE_VSWR_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_gpio.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_gpio.h new file mode 100644 index 00000000000..1ec18c67982 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_gpio.h @@ -0,0 +1,749 @@ +/** + * Copyright 2015 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adrv904x_gpio.h + * \brief Contains ADRV904X gpio related private function prototypes for + * adrv904x_gpio.c + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADRV904X_GPIO_H_ +#define _ADRV904X_GPIO_H_ + +#include "adrv904x_gpio_types.h" + +#include "adi_adrv904x_error.h" +#include "adi_adrv904x_gpio.h" + + +/** +* \brief Helper function to retrieve GPIO signal information struct from a lookup table +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] signal Selected Digital GPIO signal +* \param[out] info Returned struct containing Signal Information required for signal routing/checking +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioSignalInfoGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioSignal_e signal, + adrv904x_GpioSignalInfo_t* const info); + +/** +* \brief Top Level entry point to private GPIO helper utility to configure a Digital GPIO pin for a signal +* +* Configures all routing for GPIO pin to/from selected signal. Handles all routing types internally, checks +* for GPIO allocation errors, and allocates GPIO to the feature associated with the signal. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] gpio Selected digital GPIO pin +* \param[in] signal Selected GPIO signal +* \param[in] channelMask Channel mask to select the instance(S) of the signal. If not a channel signal, +* set to ADI_ADRV904X_CHOFF = 0U. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioSignalSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const adi_adrv904x_GpioSignal_e signal, + const uint32_t channelMask); + +/** +* \brief Top Level entry point to private GPIO helper utility to retrieve the current signal on a Digital GPIO +* +* Returns the signal/channelMask currently being routed to the GPIO pin. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] gpio Selected digital GPIO pin +* \param[out] signal Returned signal for +* \param[out] channelMask Returned Channel mask for the current signal, if signal is channel-instanced. +* If not a channel signal, this value will be set to 0U = ADI_ADRV904X_CHOFF. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioSignalGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + adi_adrv904x_GpioSignal_e* const signal, + uint32_t* const channelMask); + +/** +* \brief Top Level entry point to private GPIO helper utility to release a Digital GPIO from it's current signal +* +* Configures all routing for GPIO pin back to default settings to disconnect selected GPIO to previously +* connected signal. Deallocates GPIO back for use in Shared Resource Manager. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] gpio Selected digital GPIO pin to release +* \param[in] signal Selected GPIO signal to release +* \param[in] channelMask Channel mask to select the instance(S) of the signal to release. If not a channel signal, +* set to ADI_ADRV904X_CHOFF = 0U. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioSignalRelease(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const adi_adrv904x_GpioSignal_e signal, + const uint32_t channelMask); + +/** +* \brief Top Level entry point to private GPIO helper utility to configure an Analog GPIO pin for a signal +* +* Configures all routing for GPIO pin to/from selected signal. Handles are routing types internally, +* checks for GPIO allocation errors, and allocates GPIO to the feature associated with the signal. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] gpio Selected digital GPIO pin +* \param[in] signal Selected GPIO signal +* \param[in] channelMask Channel mask to select the instance(S) of the signal. If not a channel signal, +* set to ADI_ADRV904X_CHOFF = 0U. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioAnalogSignalSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioAnaPinSel_e gpio, + const adi_adrv904x_GpioSignal_e signal, + const uint32_t channelMask); + +/** +* \brief Top Level entry point to private GPIO helper utility to retrieve the current signal on an Analog GPIO +* +* Returns the signal/channelMask currently being routed to the Analog GPIO pin. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] gpio Selected analog GPIO pin +* \param[out] signal Returned signal for +* \param[out] channelMask Returned Channel mask for the current signal, if signal is channel-instanced. +* If not a channel signal, this value will be set to 0U = ADI_ADRV904X_CHOFF. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioAnalogSignalGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioAnaPinSel_e gpio, + adi_adrv904x_GpioSignal_e* const signal, + uint32_t* const channelMask); + + +/** +* \brief Top Level entry point to private GPIO helper utility to release an Analog GPIO from it's current signal +* +* Configures all routing for GPIO pin back to default settings to disconnect selected GPIO to previously +* connected signal. Deallocates GPIO back for use in Shared Resource Manager. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] gpio Selected analog GPIO pin to release +* \param[in] signal Selected GPIO signal to release +* \param[in] channelMask Channel mask to select the instance(S) of the signal to release. If not a channel signal, +* set to ADI_ADRV904X_CHOFF = 0U. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioAnalogSignalRelease(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioAnaPinSel_e gpio, + const adi_adrv904x_GpioSignal_e signal, + const uint32_t channelMask); + +/** + * \brief Private helper function to set the GP Int Type(Category) for all interrupt sources. + * + * This function uses a bitmask word to select the Type: Pulse/Edge triggered (default) vs. Level Triggered. + * This function is meant to be called during Initialization to set correct default settings for each source. + * These default settings are based on hardware design are meant to be static over all device configurations. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] gpIntType Pointer to data structure containing GP Interrupt word to set interrupt + * source types. Each bit in the word selects the type for the associated interrupt source: + * 0 = Pulse/Edge triggered (default), 1 = Level Triggered + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpIntTypeSet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpIntMask_t* const gpIntType); + +/** + * \brief Private helper function to retrieve the GP Int Type(Category) for all interrupt sources. + * + * This function uses a bitmask word to select the Type: Pulse/Edge triggered (default) vs. Level Triggered. + * This function is meant to be called during Initialization to set correct default settings for each source. + * These default settings are based on hardware design are meant to be static over all device configurations. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[out] gpIntType Pointer to data structure to contain retrieved GP Interrupt Type word. + * Each bit in the word selects the type for the associated interrupt source: + * 0 = Pulse/Edge triggered (default), 1 = Level Triggered + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpIntTypeGet( adi_adrv904x_Device_t* const device, + adi_adrv904x_GpIntMask_t* const gpIntType); + +#ifndef CLIENT_IGNORE +/**************************************************************************** + * Top Level GPIO Utility Functions + **************************************************************************** + */ + +/** +* \brief Top Level entry point to private GPIO helper utility to retrieve the GPIO of a selected signal & channel +* +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[out] gpio GPIO assignment of selected signal, INVALID if signal isn't mapped to any GPIO +* If not a channel signal, this value should be set to 0U = ADI_ADRV904X_CHOFF. +* \param[in] signal Signal to check GPIO mapping +* \param[in] channelSel Channel selection to check GPIO mapping +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioSignalFind(adi_adrv904x_Device_t* const device, + adi_adrv904x_GpioPinSel_e* const gpio, + const adi_adrv904x_GpioSignal_e signal, + const adi_adrv904x_Channels_e channelSel); + + + +/** +* \brief Top Level entry point to private GPIO helper utility to retrieve the Analog GPIO of a selected signal & channel +* +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[out] gpio GPIO assignment of selected signal, INVALID if signal isn't mapped to any GPIO +* If not a channel signal, this value should be set to 0U = ADI_ADRV904X_CHOFF. +* \param[in] signal Signal to check GPIO mapping +* \param[in] channelSel Channel selection to check GPIO mapping +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioAnalogSignalFind(adi_adrv904x_Device_t* const device, + adi_adrv904x_GpioAnaPinSel_e* const gpio, + const adi_adrv904x_GpioSignal_e signal, + const adi_adrv904x_Channels_e channelSel); + +/** +* \brief High level helper function to check validity of a digital GPIO signal/channel as a Monitor Output Signal. +* +* Returns result in parameter isValid +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] signal Selected GPIO signal to check +* \param[in] channel Selected channel number to check +* \param[out] isValid Pointer to result of validity check +* \param[out] channelMask Pointer to channelMask conversion of signal/channel dependent on Route type +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioMonitorOutSignalValidCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioSignal_e signal, + const uint8_t channel, + uint8_t* const isValidFlag, + uint32_t* const channelMask); + +/**************************************************************************** + * Low Level GPIO Utility Helper Functions + **************************************************************************** + */ + + + +/** +* \brief Helper function to get the associated Shared Resource Manager FeatureID for a given GPIO signal +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] signal Selected GPIO signal +* \param[out] featureID Returned featureID associated with the GPIO signal +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_FromSignalToFeatureGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioSignal_e signal, + adrv904x_FeatureID_e* const featureID); + +/** +* \brief Helper function to get the associated GPIO signal for a Shared Resource Manager FeatureID +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] featureID Selected Shared Resource Manager featureID +* \param[out] signal Returned GPIO signal associated with the featureID +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_FromFeatureToSignalGet(adi_adrv904x_Device_t* const device, + const adrv904x_FeatureID_e featureID, + adi_adrv904x_GpioSignal_e* const signal); + + +/** +* \brief Helper function to set bitfields for configuring Digital GPIO Pinmux Stage3 (Top-level digital mux) +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] gpio Selected digital GPIO pin +* \param[in] muxSelect Stage 3 mux selection (16:1 mux) +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioPinmuxStg3Set(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const uint8_t muxSelect); + +/** +* \brief Helper function to get bitfields for configuring Digital GPIO Pinmux Stage3 (Top-level digital mux) +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] gpio Selected digital GPIO pin +* \param[out] muxSelect Pointer to hold value of muxSelect Stage 3 mux selection (16:1 mux) +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioPinmuxStg3Get(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + uint8_t * const muxSelect); + +/** +* \brief Helper function to set bitfields for configuring Digital GPIO Pinmux Stage2_Rx +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] gpio Selected digital GPIO pin +* \param[in] muxSelect Stage 2 Rx mux selection (8:1 mux) +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioPinmuxStg2RxSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const uint8_t muxSelect); + + + +/** +* \brief Helper function to set bitfields for configuring Digital GPIO Pinmux Stage2_Tx +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] gpio Selected digital GPIO pin +* \param[in] muxSelect Stage 2 Tx mux selection (8:1 mux) +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioPinmuxStg2TxSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const uint8_t muxSelect); + + + +/** +* \brief Helper function to set bitfields for configuring Digital GPIO Pinmux Stage2_Orx +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] gpio Selected digital GPIO pin +* \param[in] muxSelect Stage 2 ORx mux selection (2:1 mux) +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioPinmuxStg2OrxSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const uint8_t muxSelect); + + + +/** +* \brief Helper function to set bitfields for configuring Digital GPIO Pinmux Stage2_Actrl (Analog Control Observation Signals) +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] gpio Selected digital GPIO pin +* \param[in] muxSelect Stage 2 Actrl mux selection (512:1 mux, only 247 inputs are being used currently) +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioPinmuxStg2ActrlSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const uint16_t muxSelect); + +/** +* \brief Helper function to set bitfields for configuring Digital GPIO Pinmux Stage1_Rx +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] gpio Selected digital GPIO pin +* \param[in] muxSelect Stage 1 Rx mux selection (N:1 mux, 1 output of a N:24 Xbar) +* \param[in] channelIdx The Rx channel index +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioPinmuxStg1RxSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const uint8_t muxSelect, + const uint8_t channelIdx); + +/** +* \brief Helper function to set bitfields for configuring Digital GPIO Pinmux Stage1_Tx +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] gpio Selected digital GPIO pin +* \param[in] muxSelect Stage 1 Tx mux selection (N:1 mux, 1 output of a N:24 Xbar) +* \param[in] channelIdx The Tx channel index +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioPinmuxStg1TxSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const uint8_t muxSelect, + const uint8_t channelIdx); + +/** +* \brief Helper function to set bitfields for configuring Digital GPIO Pinmux Stage1_Orx +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] gpio Selected digital GPIO pin +* \param[in] muxSelect Stage 1 Orx mux selection (N:1 mux, 1 output of a N:24 Xbar) +* \param[in] channelIdx The Orx channel index +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioPinmuxStg1OrxSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const uint8_t muxSelect, + const uint8_t channelIdx); + +/** +* \brief Helper function to set IE Override bit for a given GPIO. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] gpio Selected digital GPIO pin +* \param[in] override IF override = 0, gpio direction is set by the current OE/IE of the signal on Stg3 of pinmux. +* IF override = 1, gpio direction is forced to IE = 1. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioIeOverride(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const uint8_t override); + +/** +* \brief Helper function to set bitfields for configuring Digital GPIO Rx Destination signals +* +* NOTE: If configuring more than 1 channel for use with the same GPIO, this helper function must be +* called multiple times: 1 call per channel desired. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] destIdx Index of the selected Rx destination signal +* \param[in] channelIdx Rx channel index to enable GPIO input for signal +* \param[in] muxSelect mux selection to make for the destination signal (i.e. select GPIO1-23 or 0 to disable) +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioDestRxSet(adi_adrv904x_Device_t* const device, + const uint8_t destIdx, + const uint8_t channelIdx, + const uint8_t muxSelect); +/** +* \brief Helper function to set bitfields for configuring Digital GPIO Tx Destination signals +* +* NOTE: If configuring more than 1 channel for use with the same GPIO, this helper function must be +* called multiple times: 1 call per channel desired. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] destIdx Index of the selected Tx destination signal +* \param[in] channelIdx Tx channel index to enable GPIO input for signal +* \param[in] muxSelect mux selection to make for the destination signal (i.e. select GPIO1-23 or 0 to disable) +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioDestTxSet(adi_adrv904x_Device_t* const device, + const uint8_t destIdx, + const uint8_t channelIdx, + const uint8_t muxSelect); + + +/** +* \brief Helper function to set bitfield for configuring Digital GPIO Stream Trigger Destinations +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] gpio Selected digital GPIO pin +* \param[in] maskTrigger Stream Trigger Mask selection for the GPIO pin. 0 = Disable GPIO trigger. 1 = Enable GPIO trigger +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioDestStreamTrigSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const uint8_t maskTrigger); + +/** +* \brief Check if channelMask is valid for the given signal route. If valid, return ADI_TRUE.Else return ADI_FALSE +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] route The route type of the signal to check channelMask for +* \param[in] channelMask The channelMask to check +* \param[out] isValid the result of validity check +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioRouteValidChannelMaskCheck(adi_adrv904x_Device_t* const device, + const adrv904x_GpioRoute_e route, + const uint32_t channelMask, + uint8_t* const isValid); + + +/** +* \brief Helper function to connect or disconnect a signal to/from a GPIO +* +* Configures all routing for GPIO pin to/from selected signal. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] connect Connect/Disconnect selection for function. 0 = Disconnect.1 = Connect +* \param[in] gpio Selected digital GPIO pin +* \param[in] sigInfo Selected GPIO signal information struct +* \param[in] channelIdx Channel index to select the instance(S) of the signal to connect/disconnect. +* If not a channel signal, channelIdx is ignored +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioConnect(adi_adrv904x_Device_t* const device, + const uint8_t connect, + const adi_adrv904x_GpioPinSel_e gpio, + const adrv904x_GpioSignalInfo_t* const sigInfo, + uint32_t const channelIdx); + +/** +* \brief Helper function to set IE Override bit for a given analog GPIO. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] gpio Selected analog GPIO pin +* \param[in] override IF override = 0, analog gpio direction is set by the current OE/IE of the signal on Stg3 of pinmux. +* IF override = 1, analog gpio direction is forced to IE = 1. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioAnalogIeOverride( adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioAnaPinSel_e gpio, + const uint8_t override); + +/** +* \brief Helper function to set bitfields for configuring Analog GPIO Pinmux +* +* NOTE: Analog pinmux is much simpler than Digital GPIO Pinmux. Only one level and simple selection bitfields per GPIO. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] gpio Selected Analog GPIO pin +* \param[in] muxSelect Analog mux selection (16:1 mux) +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioAnalogPinmuxSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioAnaPinSel_e gpio, + const uint8_t muxSelect); + +/** +* \brief Helper function to get bitfields for configuring Analog GPIO Pinmux +* +* NOTE: Analog pinmux is much simpler than Digital GPIO Pinmux. Only one level and simple selection bitfields per GPIO. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] gpio Selected Analog GPIO pin +* \param[out] muxSelect pointer to hold value of Analog mux selection (16:1 mux) +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioAnalogPinmuxGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioAnaPinSel_e gpio, + uint8_t * const muxSelect); + +/** +* \brief Helper function to connect or disconnect a signal to/from an Analog GPIO +* +* Configures all routing for Analog GPIO pin to/from selected signal. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] connect Connect/Disconnect selection for function. 0 = Disconnect.1 = Connect +* \param[in] gpio Selected analog GPIO pin +* \param[in] sigInfo Selected GPIO signal information struct +* \param[in] channelIdx Channel index to select the instance(S) of the signal to connect/disconnect. +* If not a channel signal, channelIdx is ignored. Unused parameter +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioAnalogConnect(adi_adrv904x_Device_t* const device, + const uint8_t connect, + const adi_adrv904x_GpioAnaPinSel_e gpio, + const adrv904x_GpioSignalInfo_t* const sigInfo, + uint32_t const channelIdx); + + + +/**************************************************************************** + * GP Int (General Purpose Interrupt) related functions + *************************************************************************** + */ + +/** + * \brief Private utility function intended for use during PreMcsInit and initializes GP interrupt masks for all GP Int Pins. + * + * The intent of this function is that it gets called during init time to set the GP interrupt + * masks BEFORE main initialization sequence. Masks are applied as selected in init struct. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] pinMaskCfg Pointer to data structure containing GP Interrupt Pin Mask Config to be + * applied to GP Interrupt pins during PreMcsInit + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpIntPreMcsInit( adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpIntPinMaskCfg_t* const pinMaskCfg); + +/** + * \brief Private utility function intended for use during PostMcsInit and initializes GP interrupt masks for all GP Int Pins. + * + * The intent of this function is that it gets called during init time to set the GP interrupt + * masks AFTER main initialization sequence. Masks are applied as selected in postMcsInit struct. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] pinMaskCfg Pointer to data structure containing GP Interrupt Pin Mask Config to be + * applied to GP Interrupt pins during PostMcsInit + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpIntPostMcsInit( adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpIntPinMaskCfg_t* const pinMaskCfg); + +#endif //CLIENT_IGNORE +#endif // ! _ADRV904X_GPIO_H_ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_gpio_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_gpio_types.h new file mode 100644 index 00000000000..b2824d4ebb1 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_gpio_types.h @@ -0,0 +1,93 @@ +/** + * Copyright 2015 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adrv904x_gpio_types.h + * \brief Contains ADRV904X GPIO related private data prototypes for + * adrv904x_gpio.c + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADRV904X_GPIO_TYPES_H_ +#define _ADRV904X_GPIO_TYPES_H_ + +#include "../../public/include/adi_adrv904x_gpio_types.h" +#include "adrv904x_shared_resource_manager_types.h" + + + +#define ADRV904X_GP_INT_TYPE_DEFAULT_LOWER (uint64_t)(0x0000007FFFFFULL) +#define ADRV904X_GP_INT_TYPE_DEFAULT_UPPER (uint64_t)(0x3007FFFFFFFFULL) + +#define ADRV904X_GPIO_PINMUX_STAGE3_MAX 15U +#define ADRV904X_GPIO_PINMUX_STAGE2_RX_MAX 7U +#define ADRV904X_GPIO_PINMUX_STAGE2_TX_MAX 7U +#define ADRV904X_GPIO_PINMUX_STAGE2_ORX_MAX 2U +#define ADRV904X_GPIO_PINMUX_STAGE2_ACTRL_MAX 511U +#define ADRV904X_GPIO_PINMUX_STAGE1_RX_MAX 118U +#define ADRV904X_GPIO_PINMUX_STAGE1_TX_MAX 53U +#define ADRV904X_GPIO_PINMUX_STAGE1_ORX_MAX 15U +#define ADRV904X_GPIO_ANALOG_PINMUX_MAX 15U +#define ADRV904X_GPIO_NUM_DESTINATIONS_RX 7U +#define ADRV904X_GPIO_NUM_DESTINATIONS_TX 6U + +#define ADRV904X_DIGITAL_PIN_GROUP_NUM 8U +#define ADRV904X_DIGITAL_PIN_PER_GROUP_NUM 6U + +/** + * \brief Enum for ADRV904X GPIO Domain Type: Digital vs Analog + */ +typedef enum adrv904x_GpioDomain +{ + ADRV904X_GPIO_DOMAIN_NONE, + ADRV904X_GPIO_DOMAIN_DIGITAL, + ADRV904X_GPIO_DOMAIN_ANALOG +} adrv904x_GpioDomain_e; + + +/** + * \brief Enum for ADRV904X GPIO Route Type + */ +typedef enum adrv904x_GpioRoute +{ + ADRV904X_GPIO_ROUTE_OFF = 0U, /*!< Routing Off. This Route Type is only for feature UNUSED */ + ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE = 1U, /*!< Digital Pinmux Route using Pinmux Stg3 */ + ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL = 2U, /*!< Digital Pinmux Route using Pinmux Stg2,3 */ + ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX = 3U, /*!< Digital Pinmux Route using Pinmux Stg1,2,3 */ + ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX = 4U, /*!< Digital Pinmux Route using Pinmux Stg1,2,3 */ + ADRV904X_GPIO_ROUTE_DIG_PINMUX_ORX = 5U, /*!< Digital Pinmux Route using Pinmux Stg1,2,3 */ + ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG = 6U, /*!< Digital Destination Route to Dig Core for Triggering Streams with GPIOs*/ + ADRV904X_GPIO_ROUTE_DIG_DEST_PPI = 7U, /*!< Digital Destination Route to Dig Core for PPI16 Bus */ + ADRV904X_GPIO_ROUTE_DIG_DEST_RX = 9U, /*!< Digital Destination Route to Rx using Stg3 selected source 0 and Rx channel gpio_select */ + ADRV904X_GPIO_ROUTE_DIG_DEST_TX = 10U, /*!< Digital Destination Route to Tx using Stg3 selected source 0 and Tx channel gpio_select */ + ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE = 12U, /*!< Analog Pinmux Route using simple Analog Pinmux */ + ADRV904X_GPIO_ROUTE_ANA_DEST_CORE = 13U, /*!< NOT SUPPORTED: Analog Destination Route to Core using Ana IE Override */ + ADRV904X_GPIO_ROUTE_ANA_DEST_RX = 14U, /*!< NOT SUPPORTED: Analog Destination Route to RX using Ana IE Override */ + ADRV904X_GPIO_ROUTE_ANA_DEST_TX = 15U, /*!< NOT SUPPORTED: Analog Destination Route to TX using Ana IE Override */ + ADRV904X_GPIO_ROUTE_ANA_DEST_ORX = 16U, /*!< NOT SUPPORTED: Analog Destination Route to ORX using Ana IE Override */ + ADRV904X_GPIO_ROUTE_DIG_DEST_RADIO_SEQ = 17U, /*!< Digital Destination Route to Radio Sequencer */ + ADRV904X_GPIO_ROUTE_DIG_DEST_RX_CDDC_RSSI = 18U, /*!< Digital Destination Route to RX CDDC_RSSI */ + ADRV904X_GPIO_ROUTE_DIG_DEST_TX_DTX = 19U, /*!< Digital Destination Route to Tx using Stg3 selected source 0 and Tx channel gpio_select, specifically for Koror DTX pin functionality*/ +} adrv904x_GpioRoute_e; + + +/** + * \brief Struct for ADRV904X GPIO Signal Information. Used in LUT to obtain + signal-specific routing details + */ +typedef struct adrv904x_GpioSignalInfo +{ + adi_adrv904x_GpioSignal_e signal; /*!< The internal signal to be exposed via GPIO */ + adrv904x_GpioDomain_e domain; /*!< Analog or Digital */ + adrv904x_GpioRoute_e route; /*!< Indicates the set of pin-muxes involved in routing the signal to a GPIO */ + uint32_t pinMask; /*!< Indicates the GPIO pins to which routing is valid. LSB for GPIO0 etc. */ + uint8_t topSelect; + int16_t targetSelect; +} adrv904x_GpioSignalInfo_t; + + +#endif /* ! _ADRV904X_GPIO_TYPES_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_init.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_init.h new file mode 100644 index 00000000000..36c64f148ce --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_init.h @@ -0,0 +1,277 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adrv904x_init.h + * \brief Contains ADRV904X init related private function prototypes for + * adrv904x_init.c that helps adi_adrv904x_init.c + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADRV904X_INIT_H_ +#define _ADRV904X_INIT_H_ + +#include "adi_adrv904x_error.h" +#include "adi_library.h" + +//#define ADRV904X_INIT_DEBUG 1 +#ifdef ADRV904X_INIT_DEBUG +#define ADRV904X_BUGINFO(x) ADI_LIBRARY_PRINTF("MESSAGE: %s ******************************* \n", (x)); +#define ADRV904X_BUGINFO_NUM(x,n) ADI_LIBRARY_PRINTF("MESSAGE: %s: %d 0x%08x \n", (x),(n),(n)); +#else +#define ADRV904X_BUGINFO(x) +#define ADRV904X_BUGINFO_NUM(x,n) +#endif + +//#define ADRV904X_INIT_DMAINFO_DEBUG 1 +#ifdef ADRV904X_INIT_DMAINFO_DEBUG +#define ADRV904X_DMAINFO(text, addr, count) ADI_LIBRARY_PRINTF("MESSAGE: DMA: %30s: addr=0x%08x, count=%d \n", (text), (addr), (count)); +#else +#define ADRV904X_DMAINFO(text, addr, count) +#endif + +//#define ADRV904X_INIT_DMA_DEBUG 1 +#ifdef ADRV904X_INIT_DMA_DEBUG +#define ADRV904X_SPIDMAINFO(s,a,b,c) ADI_LIBRARY_PRINTF((s),(a),(b),(c)); +#else +#define ADRV904X_SPIDMAINFO(s,a,b,c) +#endif + +//#define ADRV904X_INIT_SPI_DEBUG 1 +#ifdef ADRV904X_INIT_SPI_DEBUG +#define ADRV904X_SPIINFO(s,a,b,c) ADI_LIBRARY_PRINTF((s),(a),(b),(c)); +#define ADRV904X_SPI_FIELD_INFO(s,a,b,c,d) ADI_LIBRARY_PRINTF((s),(a),(b),(c), (d)); +#else +#define ADRV904X_SPIINFO(s,a,b,c) +#define ADRV904X_SPI_FIELD_INFO(s,a,b,c,d) +#endif + +#define ADRV904X_SPIWRITEBYTE_RETURN(text, addr, data, recoveryAction) \ +{ \ + recoveryAction = adi_adrv904x_Register32Write(device, NULL, (addr), (data), 0xFFU); \ + if(ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) \ + { \ + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Byte Write Issue"); \ + return recoveryAction; \ + } \ + ADRV904X_SPIINFO("MESSAGE: WRITE: %30s: addr=0x%04x, data=0x%02x \n", (text), (addr), (data)); \ +} + +#define ADRV904X_SPIWRITEBYTE_GOTO(text, addr, data, recoveryAction, label) \ +{ \ + recoveryAction = adi_adrv904x_Register32Write(device, NULL, (addr), (data), 0xFFU); \ + if(ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) \ + { \ + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Byte Write Issue"); \ + goto cleanup; \ + } \ + ADRV904X_SPIINFO("MESSAGE: WRITE: %30s: addr=0x%04x, data=0x%02x \n", (text), (addr), (data)); \ +} + +/** +* \brief Sets up the thresholds on Rx channel which triggers overload bits +* if the input level exceeds threshold. +* +* \pre This function is private and is not called directly by the user. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] rxChannel Channel for which overload protection config is desired +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxOverloadProtectionSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel); + +/** +* \brief Private function used by the APIs that can benefit from SPI streaming. This function should be called +* at the beginning of the function. If device->devStatInfo->spiOptions.allowSpiStreaming is set the part +* is placed into streaming mode. Otherwise, this function does nothing. +* +* This function to range check the version number of the API +* +* \param[in,out] device Context variable - Pointer to the ADRV904X data structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_SpiStreamingEntry(adi_adrv904x_Device_t* const device); + +/** +* \brief Private function used by the APIs that call adrv904x_SpiStreamingEntry. It is the responsibility of each +* API function that calls adrv904x_SpiStreamingEntry to call this function also to disable streaming if +* necessary. +* +* This function to range check the version number of the API +* +* \param[in,out] device Context variable - Pointer to the ADRV904X data structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_SpiStreamingExit(adi_adrv904x_Device_t* const device); + +/** +* \brief Configures and allocates selected GPIO pins that will trigger a Stream that handle +* Tx to Orx Mapping changes at runtime. +* +* This function will handle GPIO setup (if appropriate) and store the selected feature mode +* in the device data structure for use at runtime. +* +* \pre This function is private and is not called directly by the user. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] mappingConfig Pointer to the mapping config stored in the init structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxToOrxMappingInit(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxToOrxMappingConfig_t* const mappingConfig); +#ifndef CLIENT_IGNORE + +/** +* \brief Configures the part to use DEVCLK as HSDIG to allow FW to boot and syncs slice clocks. +* * Program FW divide registers using configurator settings +* * Configure HSDIG as DEVCLK +* * Calculate and program DEVCLK divider values +* * Clear master bias igen powerdown +* * Enable DEVCLK & digital clock +* * Sync slice clocks +* +* \pre This function is private and is not called directly by the user. +* +* \dep_begin +* \dep{device->devStateInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in] device A pointer to the device settings structure +* \param[in] init A pointer to the init data structure for clock settings +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_ClocksSync(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Init_t* const init); + + + +/** +* \brief Initializes power monitoring related parameters during device bootup. +* +* \pre This function is private and is not called directly by the user. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] txChannelMask Tx channel/s to initialize power monitor configuration for +* \param[in] totalInputInterpoloationRate Total interpolation rate for input signal. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxPowerMonitorInitialize(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const uint8_t totalInputInterpoloationRate); + +/** +* \brief Helper function to set the specified Uart Signal to Gpio Output Pin. +* +* \pre This function can be called before the CPU start +* +* GPIO Pins : UART Signals +* ============================================================== +* ADI_ADRV904X_GPIO_09 : ADI_ADRV904X_GPIO_SIGNAL_UART_PADRXSIN +* ADI_ADRV904X_GPIO_10 : ADI_ADRV904X_GPIO_SIGNAL_UART_PADCTS +* ADI_ADRV904X_GPIO_11 : ADI_ADRV904X_GPIO_SIGNAL_UART_PADRTSOUT +* ADI_ADRV904X_GPIO_12 : ADI_ADRV904X_GPIO_SIGNAL_UART_PADTXSOUT +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X device data structure containing settings +* \param[in] pinSelect The GPIO Pin Select for UART signal +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_UartCfg(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e pinSelect); + +/** +* \brief Helper functon to set the specified Uart Signal to Gpio Output Pin. +* +* \pre This function can be called before the CPU start +* +* DFE UART0 GPIO pin/signal usage for is as follows: +* +* UART : GPIO Pin : GPIO Signal +* ========================================================================== +* TX : ADI_ADRV904X_GPIO_08 : ADI_ADRV904X_GPIO_SIGNAL_DFE_UART0_PADTXSOUT +* RX : ADI_ADRV904X_GPIO_17 : ADI_ADRV904X_GPIO_SIGNAL_DFE_UART0_PADRXSIN +* CTS : ADI_ADRV904X_GPIO_21 : ADI_ADRV904X_GPIO_SIGNAL_DFE_UART0_PADCTS +* RTS : ADI_ADRV904X_GPIO_22 : ADI_ADRV904X_GPIO_SIGNAL_DFE_UART0_PADRTSOUT +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X device data structure containing settings +* \param[in] index The DFE UART port index. Only DFE UART port index supported is 0. +* \param[in] settings The DFE UART port settings containing which GPIO pins to enable. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_DfeUartCfg(adi_adrv904x_Device_t* const device, + const uint8_t index, + const adi_adrv904x_DfeUartSettings_t* const settings); + +/** +* \brief Configures and allocates selected GPIO pins for DFE Ctrl Tx to Orx Mapping +* +* This function will handle GPIO setup (if appropriate) and store the selected feature mode +* in the device data structure for use at runtime. +* +* \pre This function is private and is not called directly by the user. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] mappingConfig Pointer to the mapping config stored in the init structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_DfeCtrlTxToOrxMappingInit(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeCtrlTxToOrxMappingConfig_t* const mappingConfig); + +/** +* \brief Range Check API version number +* +* This function to range check the version number of the API +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] version Pointer to structure where API version information +* \param[in] minVersion Pointer to structure where API version information +* \param[in] maxVersion Pointer to structure where API version information +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_ApiVersionRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Version_t* const version, + const adi_adrv904x_Version_t* const minVersion, + const adi_adrv904x_Version_t* const maxVersion); + +#endif //CLIENT_IGNORE + +#endif diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_platform_byte_order.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_platform_byte_order.h new file mode 100644 index 00000000000..727bed1e7d8 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_platform_byte_order.h @@ -0,0 +1,99 @@ + /** + * \file adrv904x_platform_byte_order.h + * + * \brief Contains platform byte order (endianness) conversion macros + * + * \details Contains platform byte order (endianness) conversion macros + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_PLATFORM_BYTE_ORDER_H__ +#define __ADRV904X_PLATFORM_BYTE_ORDER_H__ + +#ifndef ADI_ADRV904X_FW +#include "adi_adrv904x_user.h" +#ifdef ADI_ADRV904X_LITTLE_ENDIAN +#define ADRV904X_LITTLE_ENDIAN ADI_ADRV904X_LITTLE_ENDIAN +#endif +#endif + +#ifndef ADRV904X_LITTLE_ENDIAN +#ifdef __GNUC__ +#define ADRV904X_LITTLE_ENDIAN (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) +#elif defined __ICCARM__ +#define ADRV904X_LITTLE_ENDIAN (__LITTLE_ENDIAN__ == 1) +#else +#error( "Define the ADRV904X_LITTLE_ENDIAN macro for your platform.") +#endif +#endif + +/* + * Endianess conversion macros naming: + * + * C is the adrv904x's CPU byte-order i.e. little-endian + * + * H is the byte-order of the host on which the API is running which can be either big or little endian. Setting + * ADRVGEN_LITTLE_ENDIAN to match the endianess of the host will cuase the xTOy conversion macros swap bytes or not as + * appropriate for the host endianess. + * + * N is 'network byte-order' i.e. big-endian. + */ + +#define ADRV904X_BYTESWAP_S(x) \ + ((((x) & 0xFF00u) >> 8) | \ + (((x) & 0x00FFu) << 8)) + +#define ADRV904X_BYTESWAP_L(x) \ + ((((x) & 0xFF000000ul) >> 24) | \ + (((x) & 0x00FF0000ul) >> 8) | \ + (((x) & 0x0000FF00ul) << 8) | \ + (((x) & 0x000000FFul) << 24)) + +#define ADRV904X_BYTESWAP_LL( x ) \ + ((((x) & 0xFF00000000000000ull) >> 56u) | \ + (((x) & 0x00FF000000000000ull) >> 40u) | \ + (((x) & 0x0000FF0000000000ull) >> 24u) | \ + (((x) & 0x000000FF00000000ull) >> 8u) | \ + (((x) & 0x00000000FF000000ull) << 8u) | \ + (((x) & 0x0000000000FF0000ull) << 24u) | \ + (((x) & 0x000000000000FF00ull) << 40u) | \ + (((x) & 0x00000000000000FFull) << 56u)) + +#define ADRV904X_NTOCL( x ) ADRV904X_BYTESWAP_L((x)) +#define ADRV904X_CTONL( x ) ADRV904X_BYTESWAP_L((x)) + +#if ADRV904X_LITTLE_ENDIAN == 1 +/* Host is LE */ +#define ADRV904X_HTOCLL( x ) ( x ) +#define ADRV904X_CTOHLL( x ) ( x ) +#define ADRV904X_HTOCL( x ) ( x ) +#define ADRV904X_CTOHL( x ) ( x ) +#define ADRV904X_HTOCS( x ) ( x ) +#define ADRV904X_CTOHS( x ) ( x ) +#define ADRV904X_NTOHL( x ) ADRV904X_BYTESWAP_L((x)) +#define ADRV904X_HTONL( x ) ADRV904X_BYTESWAP_L((x)) +#elif ADRV904X_LITTLE_ENDIAN == 0 +/* Host is BE */ +#define ADRV904X_HTOCLL( x ) ADRV904X_BYTESWAP_LL((x)) +#define ADRV904X_CTOHLL( x ) ADRV904X_BYTESWAP_LL((x)) +#define ADRV904X_HTOCL( x ) ADRV904X_BYTESWAP_L((x)) +#define ADRV904X_CTOHL( x ) ADRV904X_BYTESWAP_L((x)) +#define ADRV904X_HTOCS( x ) ADRV904X_BYTESWAP_S((x)) +#define ADRV904X_CTOHS( x ) ADRV904X_BYTESWAP_S((x)) +#define ADRV904X_NTOHL( x ) ( x ) +#define ADRV904X_HTONL( x ) ( x ) +#else +#error "ADRV904X_LITTLE_ENDIAN value not recognized. Must be either 0 or 1." +#endif /* ADRV904X_LITTLE_ENDIAN */ + +#endif /* __ADRV904X_PLATFORM_BYTE_ORDER_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_platform_pack.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_platform_pack.h new file mode 100644 index 00000000000..afa03191984 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_platform_pack.h @@ -0,0 +1,50 @@ + /** + * \file adrv904x_platform_pack.h + * + * \brief Contains platform pack define + * + * \details Contains platform pack define + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2019 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADRV904X_PLATFORM_PACK_H__ +#define __ADRV904X_PLATFORM_PACK_H__ + +#ifndef ADI_ADRV904X_FW +#include "adi_adrv904x_user.h" +#ifdef ADI_ADRV904X_PACKED +#define ADRV904X_PACKED ADI_ADRV904X_PACKED +#endif +#endif + +#ifndef ADRV904X_PACKED +#ifdef __GNUC__ +#define ADRV904X_PACKED(d) _Pragma("pack(1)") d _Pragma("pack()") +#elif defined __ICCARM__ +/* + * Error[Pm154]: in the definition of a function-like macro, each instance of a + * parameter shall be enclosed in parenthesis (MISRA C 2004 rule 19.10) + * + * ADRV904X_PACKED() is a macro used for structure packing. The parameter + * for this macro must be a structure definition, which cannot be enclosed in + * parenthesis (syntatically invalid). + */ +#pragma diag_suppress=Pm154 +#define ADRV904X_PACKED(d) _Pragma("pack(1)") d _Pragma("pack()") +#pragma diag_default=Pm154 +#elif defined _MSC_VER +#define ADRV904X_PACKED(d) __pragma(pack(1)) d __pragma(pack()) +#else +#error( "Define the ADRV904X_PACKED() macro for your compiler.") +#endif +#endif + +#endif /* __ADRV904X_PLATFORM_PACK_H__ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_radioctrl.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_radioctrl.h new file mode 100644 index 00000000000..28d2a233f9f --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_radioctrl.h @@ -0,0 +1,1010 @@ +/** +* Copyright 2015 - 2023 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adrv904x_radioctrl.h + * \brief Contains ADRV904X radio control related private function prototypes for + * adrv904x_radioctrl.c which helps adi_adrv904x_radioctrl.c + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADRV904X_RADIOCTRL_H_ +#define _ADRV904X_RADIOCTRL_H_ + +#include "adrv904x_radioctrl_types.h" +#include "adrv904x_cpu_macros.h" +#include "adrv904x_cpu_cmd.h" + +#include "adi_adrv904x_radioctrl.h" +#include "adi_adrv904x_error.h" + +/** +* \brief This function directly triggers a stream on the Core Stream Processor. +* +* This function utilizes the ARM mailbox with a particular opcode to trigger the Core +* Stream Processor directly. Mailbox must not be busy in order to send the command, but +* ARM is not involved and will not send a response. +* +* \pre This function can be called after the stream binary has been loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] streamId unique stream identification no. of the stream to execute +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_StreamTrigger(adi_adrv904x_Device_t* const device, + const uint8_t streamId); + +/** +* \brief This function indirectly triggers a stream on the TX Stream Processor. +* +* This function calls a core stream to trigger a stream on TX Stream Processor. +* +* \pre This function can be called after the stream binary has been loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] txChanMask TX channel mask +* \param[in] txStreamId unique TX stream identification no. of the stream to execute +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxStreamTrigger(adi_adrv904x_Device_t* const device, + const uint8_t txChanMask, + const uint8_t txStreamId); + +/** +* \brief This function indirectly triggers a stream on the RX Stream Processor. +* +* This function calls a core stream to trigger a stream on RX Stream Processor. +* +* \pre This function can be called after the stream binary has been loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] rxChanMask RX channel mask +* \param[in] rxStreamId unique RX stream identification no. of the stream to execute +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxStreamTrigger(adi_adrv904x_Device_t* const device, + const uint8_t rxChanMask, + const uint8_t rxStreamId); +/** +* \brief Reads back the version of the ADC module for the cal type +* +* This function sends a control command to the ARM to read back the major.minor.maint.build +* version for specified ADC module (Rx, Tx, Orx where Tx and ORx have the same version parameters) +* +* \pre +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] calType - calibration type +* \param[in] channel - channel number +* \param[out] adcVersion - Pointer to four parts of ADC version +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_AdcVersionGet(adi_adrv904x_Device_t* const device, + const uint8_t calType, + const adi_adrv904x_Channels_e channel, + adi_adrv904x_Version_t* const adcVersion); + +/** +* \brief Reads back the data sizes and base addresses of the ADC module for the cal type +* +* This function sends a control command to the ARM to read back the sizes and the addresses +* for specified ADC module (Rx, Tx, Orx) and channel. +* +* \pre +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] calType - calibration type +* \param[in] channel - channel number +* \param[out] adcSizes - Pointer to adc sizes structure +* \param[out] adcAddrs - Pointer to adc addresses structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_AdcGetDataInfo(adi_adrv904x_Device_t* const device, + const uint8_t calType, + const adi_adrv904x_Channels_e channel, + adrv904x_CpuCmd_GetAdcSizeAddrs_t* const adcSizes, + adrv904x_CpuCmd_GetAdcSizeAddrs_t* const adcAddrs); + +/** +* \brief Run the Init command of the ADC module for the cal type +* +* This function sends a control command to the ARM to run the Init command +* for specified ADC module (Rx, Tx, Orx) and channel. +* +* \pre +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] calType - calibration type +* \param[in] channel - channel number +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_AdcRunInit(adi_adrv904x_Device_t* const device, + const uint8_t calType, + const adi_adrv904x_Channels_e channel); + +/** +* \brief Set the FSM command of the ADC module for the cal type +* +* This function sends a control command to the ARM to send an FSM command +* for specified the ADC module (Rx, Tx, Orx) and channel. +* +* \pre +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] calType - calibration type +* \param[in] channel - channel number +* \param[in] fsmCmd - command number +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_AdcSetFsmCmd(adi_adrv904x_Device_t* const device, + const uint8_t calType, + const adi_adrv904x_Channels_e channel, + const uint8_t fsmCmd); + +/** +* \brief Reads back the ADC FSM state of the ADC module for the cal type +* +* This function sends a control command to the ARM to read back the FSM state +* for specified the ADC module (Rx, Tx, Orx) and channel. +* +* \pre +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] calType - calibration type +* \param[in] channel - channel number +* \param[out] fsmState - Pointer to state variable +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_AdcGetFsmState(adi_adrv904x_Device_t* const device, + const uint8_t calType, + const adi_adrv904x_Channels_e channel, + uint8_t* const fsmState); + +/** +* \brief This command results in the FW calling the _Run() function +* +* Execute the _Run() function for the +* specified ADC module (Rx, Tx, Orx) and channel. +* +* \pre +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] calType - calibration type +* \param[in] channel - channel number +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_AdcRunCmd(adi_adrv904x_Device_t* const device, + const uint8_t calType, + const adi_adrv904x_Channels_e channel); + +/** +* \brief Set the Tracking cal rate in milli seconds +* +* This function sends a set config command to the ARM to set the timer used for the specified tracking cal. +* +* \pre +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] objId - object ID +* \param[in] rateMsec - rate in milli seconds +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_SetTrackingPeriod(adi_adrv904x_Device_t* const device, + uint8_t objId, + uint32_t rateMsec); + +/** +* \brief Get the Tracking cal rate in milli seconds +* +* This function sends a get config command to the ARM to get the timer used for the specified tracking cal. +* +* \pre +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] objId - object ID +* \param[out] rateMsec - rate in milli seconds +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GetTrackingPeriod(adi_adrv904x_Device_t* const device, + uint8_t objId, + uint32_t* const rateMsec); + +/** +* \brief Get Radio Sequencer Pattern Address +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] patternId Id of the desired radio sequencer pattern +* \param[out] patternAddr Pointer to pattern address +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioSequencerPatternAddrGet(adi_adrv904x_Device_t* const device, + const uint32_t patternId, + uint32_t* const patternAddr); + +/** +* \brief Perform the RS register operations needed to set the given pattern directly +* +* This function will use the pattern address lookup table and set the given pattern directly to the register +* +* \pre +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] sequencerId - radio sequencer id +* \param[in] patternId - radio pattern id +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioSequencerPatternSet(adi_adrv904x_Device_t* const device, uint32_t sequencerId, uint32_t patternId); + +/** +* \brief Perform the apply on the next multiframe boundary +* +* This function will perform the apply on the next multiframe boundary +* +* \pre +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioSequencerApply(adi_adrv904x_Device_t* const device); + +/** +* \brief Perform the apply immediately +* +* This function will perform the apply immediately +* +* \pre +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioSequencerApplyImmediately(adi_adrv904x_Device_t* const device); + + + +/** +* \brief Perform range check for adi_adrv904x_RadioSequencerPhaseSet +* +* This function check if the multiframe phase adjustment is valid. +* +* \pre +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] phaseAdjustment - multiframe phase adjustment +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioSequencerPhaseSetRangeCheck(adi_adrv904x_Device_t* const device, + const uint32_t phaseAdjustment); + +/** +* \brief Sends the DFE the radio sequencer pattern lookup table +* +* Sends the DFE the radio sequencer pattern lookup table +* +* \pre +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioSequencerDfePtrnLookupTableSet(adi_adrv904x_Device_t* const device); + +/** +* \brief Set the reset_hold for all the 16 radio sequencers +* +* This function sets the reset_hold bitfield for all the 16 radio sequencers. +* +* \pre +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] resetHold - reset_hold bitfield requested value +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioSequencerResetHoldSet(adi_adrv904x_Device_t* const device, + const uint32_t resetHold); + +/** +* \brief Starts the Radio Sequencer +* +* This function enables all 16 Radio Sequencers, each of which executes the default startup pattern +* +* \pre This function may be called after the RS binary has been initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioSequencerStart(adi_adrv904x_Device_t* const device); + +/** +* \brief Base function to set the DFE CTRL Tx to ORx mapping and/or VSWR Direction +* +* This function invokes the streams required to apply a Tx to ORx mapping configuration and/or direction +* +* \pre This function may be called after the Stream processor initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] orxChannel The ORx channel for which Tx channel mapping is updated +* \param[in] txChannel The Tx channel to map to the selected ORx channel +* \param[in] isVswrState If 1: VSWR State is set and vswrDirection input is used to set direction. If 0: DPD state is set and vswrDirection input is ignored and internally forced to FWD. +* \param[in] vswrDirection The VSWR direction to set, either FWD or REV. Only used if ifVswrState = 1. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_DfeCtrlTxToOrxMappingBaseSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e orxChannel, + const adi_adrv904x_TxChannels_e txChannel, + const uint8_t isVswrState, + const adi_adrv904x_DfeVswrDirection_e vswrDirection); + +#ifndef CLIENT_IGNORE +/** +* \brief Perform range check for adi_adrv904x_RxTxEnableSet. +* +* Checks that all the channels in the Rx and Tx masks exist. Any invalid channel +* results in failure. Also checks that CPU state is suitable for allowing enabling of +* Rx/Tx channels. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X device data structure containing settings +* \param[in] orxChannelMask Desired Orx signal chain (channel) to power up/down +* \param[in] orxChannelEnable Desired Orx signal chain (channel) to Enable(1)/Disable(0) - Unused parameter +* \param[in] rxChannelMask Desired Rx signal chain (channel) to power up/down +* \param[in] rxChannelEnable Desired Rx signal chain (channel) to Enable(1)/Disable(0) - Unused parameter +* \param[in] txChannelMask Desired Tx signal chains (channel) to power up/down +* \param[in] txChannelEnable Desired Tx signal chain (channel) to Enable(1)/Disable(0) - Unused parameter +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxTxEnableSetRangeCheck(adi_adrv904x_Device_t* const device, + const uint32_t orxChannelMask, + const uint32_t orxChannelEnable, + const uint32_t rxChannelMask, + const uint32_t rxChannelEnable, + const uint32_t txChannelMask, + const uint32_t txChannelEnable); + +/** +* \brief Enables or disables all Rx channels that are in SPI control mode (see +* adi_adrv904x_RadioCtrlCfgSet. Has no effect on channels that are not set to SPI control mode. +* +* \pre This function should only be called after the transceiver is initialized and the stream +* images are loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param [in] device Pointer to an ADRV904X device +* \param [in] rxChannelMask Desired Rx signal chains (channels) to power up/down +* \param [in] rxChannelEnable Desired Rx signal chains (channels) to Enable(1)/Disable(0) +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxEnableSet(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const uint32_t rxChannelEnable); + +/** +* \brief Enables or disables all Tx channels that are in SPI control mode (see +* adi_adrv904x_RadioCtrlCfgSet. Has no effect on channels that are not set to SPI control mode. +* +* \pre This function should only be called after the transceiver is initialized and the stream +* images are loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param [in] device Pointer to an ADRV904X device +* \param [in] txChannelMask Desired Tx signal chains (channels) to power up/down +* \param [in] txChannelEnable Desired Tx signal chains (channels) to Enable(1)/Disable(0) +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxEnableSet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const uint32_t txChannelEnable); + +/** +* \brief Sets the ORx channels to be enabled or disabled in the transceiver if the signal chain +* control is configured to be in SPI mode. +* +* For use cases where pin mode is not required, this function can be used to +* enable/disable the ORx signal paths. +* +* \pre This function should be called after initialization and loading the stream +* processor. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param [in] device Pointer to the ADRV904X data structure +* \param [in] rxChannelMask Desired ORx signal chains (channel) to power up/down. Note only the bits indicating +* ORx channels are effective. Other bits indicating Rx channels are ignored. See rxChannels argument to +* adrv904x_RxTxEnableSet. +* \param [in] rxChannelEnable Desired ORx signal chains (channels) to Enable(1)/Disable(0) +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxEnableSet(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const uint32_t rxChannelEnable); + + +/** +* \brief This function performs Range check on parameters passed to adi_adrv904x_RadioCtrlCfgSet() API +* +* This function is called automatically as part of adi_adrv904x_RadioCtrlCfgSet() if ADI_ADRV904X_RADIOCTRL_RANGE_CHECK +* is set to 1. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] radioCtrlCfg is comprised of radio control mode configurations for Rx,ORx and Tx channels +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioCtrlCfgSetRangeCheck(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RadioCtrlModeCfg_t* const radioCtrlCfg); + +/** +* \brief This function sets up the ORx signal chain Radio Ctrl configuration +* +* In Pin mode, the Rx signal chain is controlled via dedicated pins RX_ENABLE<3:0>. In +* Non-pin mode, the API command is used to configure Rx radio ctrl settings. +* +* \pre This function can be called after initialization and completion of stream loading. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] orxRadioCtrlModeCfg Pointer to ORx radio ctrl mode configuration settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxRadioCtrlCfgSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_ORxRadioCtrlModeCfg_t* const orxRadioCtrlModeCfg); + +/** +* \brief This function sets up the Rx signal chain Radio Ctrl configuration +* +* In Pin mode, the Rx signal chain is controlled via dedicated pins RX_ENABLE<3:0>. In +* Non-pin mode, the API command is used to configure Rx radio ctrl settings. +* +* \pre This function can be called after initialization and completion of stream loading. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] rxRadioCtrlModeCfg Pointer to ORx radio ctrl mode configuration settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxRadioCtrlCfgSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_RxRadioCtrlModeCfg_t* const rxRadioCtrlModeCfg); + +/** +* \brief This function sets up the Tx signal chain Radio Ctrl configuration +* +* In Pin mode, the Tx signal chain is controlled via dedicated pins TX_ENABLE<3:0>. In +* Non-pin mode, the API command is used to configure Tx radio ctrl settings. +* +* \pre This function can be called after initialization and completion of stream loading. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] txRadioCtrlModeCfg Pointer to ORx radio ctrl mode configuration settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxRadioCtrlCfgSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_TxRadioCtrlModeCfg_t* const txRadioCtrlModeCfg); + +/** +* \brief This function reads back the ORx signal chain Radio Ctrl configuration +* +* \pre This function can be called after initialization. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] rxChannel Desired RxChannel +* \param[out] orxRadioCtrlModeCfg Pointer to ORx radio ctrl mode configuration settings +* which will be updated with read back configuration +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxRadioCtrlCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_ORxRadioCtrlModeCfg_t* const orxRadioCtrlModeCfg); + +/** +* \brief This function reads back the Rx signal chain Radio Ctrl configuration +* +* \pre This function can be called after initialization. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] rxChannel Desired RxChannel +* \param[out] rxRadioCtrlModeCfg Pointer to Rx radio ctrl mode configuration settings +* which will be updated with read back configuration +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxRadioCtrlCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_RxRadioCtrlModeCfg_t* const rxRadioCtrlModeCfg); + +/** +* \brief This function reads back the Tx signal chain Radio Ctrl configuration +* +* \pre This function can be called after initialization. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] txChannel Desired TxChannel +* \param[out] txRadioCtrlModeCfg Pointer to Tx radio ctrl mode configuration settings +* which will be updated with read back configuration +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxRadioCtrlCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_TxRadioCtrlModeCfg_t* const txRadioCtrlModeCfg); + +/** +* \brief This function masks/unmasks the LO unlock GP interrupt for a requested LO +* +* When the LO frequency is being updated, the LO is unlocked which generates +* a GP interrupt. For use cases where LO frequency is required to be changed, +* the GP interrupt needs to be masked so that it does not flag a false interrupt. +* +* \pre +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param device Pointer to the ADRV904X data structure +* \param loName LO for which frequency needs to be set +* \param gpInterruptPin0Mask flag to mask(1) / unmask(0) the requested LO unlock interrupt on Pin0 +* \param gpInterruptPin1Mask flag to mask(1) / unmask(0) the requested LO unlock interrupt on Pin1 +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_LoUnlockGpInterruptMaskSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_LoName_e const loName, + uint8_t const loGpInterruptPin0Mask, + uint8_t const loGpInterruptPin1Mask); + +/** +* \brief This reads the LO unlock GP interrupt mask for a requested LO +* +* This function can be used to retrieve current GP Interrupt mask status for the requested LO. +* +* \pre +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param device Pointer to the ADRV904X data structure +* \param loName LO unlock GP Interrupt mask is requested +* \param loGpInterruptPin0Mask Current mask/unmask status of the requested LO unlock GP Interrupt on Pin0 +* \param loGpInterruptPin1Mask Current mask/unmask status of the requested LO unlock GP Interrupt on Pin1 +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_LoUnlockGpInterruptMaskGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_LoName_e const loName, + uint8_t* const loGpInterruptPin0Mask, + uint8_t* const loGpInterruptPin1Mask); + +/** +* \brief This function masks/unmasks the LO overrange GP interrupt for a requested LO +* +* When the LO frequency is being updated, the LO is unlocked which generates +* a GP interrupt. For use cases where LO frequency is required to be changed, +* the GP interrupt needs to be masked so that it does not flag a false interrupt. +* +* \pre +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param device Pointer to the ADRV904X data structure +* \param loName LO for which frequency needs to be set +* \param gpInterruptPin0Mask flag to mask(1) / unmask(0) the requested LO unlock interrupt on Pin0 +* \param gpInterruptPin1Mask flag to mask(1) / unmask(0) the requested LO unlock interrupt on Pin1 +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_LoOverrangeGpInterruptMaskSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_LoName_e loName, + const uint8_t loGpInterruptPin0Mask, + const uint8_t loGpInterruptPin1Mask); + +/** +* \brief This reads the GP Interrupt overrange mask status +* +* This function can be used to retrieve current GP Interrupt mask status +* for the requested LO. +* +* \pre +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param device Pointer to the ADRV904X data structure +* \param loName LO unlock GP Interrupt mask is requested +* \param loGpInterruptPin0Mask Current mask/unmask status of the requested LO unlock GP Interrupt on Pin0 +* \param loGpInterruptPin1Mask Current mask/unmask status of the requested LO unlock GP Interrupt on Pin1 +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_LoOverrangeGpInterruptMaskGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_LoName_e loName, + uint8_t* const loGpInterruptPin0Mask, + uint8_t* const loGpInterruptPin1Mask); + +/** +* \brief Performs range check on parameters for adrv904x_LoFrequencySetRangeCheck function +* +* \pre This function is automatically called as part of adi_adrv904x_LoFrequencySet if +* ADI_ADRV904X_RADIOCTRL_RANGE_CHECK is set to 1. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X device data structure containing settings +* \param[in] loConfig Pointer to the LO config settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_LoFrequencySetRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_LoConfig_t* const loConfig); + +/** +* \brief Performs range check on parameters for adrv904x_LoLoopFilterSetRangeCheck function +* +* \pre This function is automatically called as part of adi_adrv904x_LoLoopFilterSet if +* ADI_ADRV904X_RADIOCTRL_RANGE_CHECK is set to 1. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] loName The RF LO selected +* \param[in] loLoopFilterConfig Pointer to the LO config settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_LoLoopFilterSetRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_LoName_e loName, + const adi_adrv904x_LoLoopFilterCfg_t* const loLoopFilterConfig); + + + +/** +* \brief Performs range check on parameters for adi_adrv904x_StreamGpioConfigSet function. +* +** \pre This function is automatically called as part of adi_adrv904x_StreamGpioConfigSet if +* ADI_ADRV904X_RADIOCTRL_RANGE_CHECK is set to 1. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] streamGpioPinCfg Pointer to the structure holding GPIO pin to stream GP input mappings (Input) +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_StreamGpioConfigSetRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_StreamGpioPinCfg_t* const streamGpioPinCfg); + + +/** + * \brief Helper function to check the validity combinations of GPIO signal type and its value mask. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] gpioSigType GPIO Signal type. + * \param[in] signalMask mask value for the GPIO signal type. + * \param[in] setOp Boolean to indicate if this check for the set operation. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioCtrlDbgGpioOutputRangeCheck( adi_adrv904x_Device_t* const device, + const adi_adrv904x_OutGpioSigTypes_e gpioSigType, + const uint8_t signalMask, + const uint8_t setOp); + +/** + * \brief Helper function to find gpio index in the GPIO config based on input parameters. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] gpioSigType GPIO Signal type. + * \param[in] signalOffset value for the GPIO signal type. + * \param[in] gpioPinstate GPIO state. + * \param[in] gpioPin pointer to hold the value of the GPIO pin if found. + * \param[in] isDigital pointer to indicate the GPIO type: 0: Analog, 1: Digital. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioCtrlDbgGpioOutputFind( adi_adrv904x_Device_t* const device, + const adi_adrv904x_OutGpioSigTypes_e gpioSigType, + const uint8_t signalOffset, + uint8_t * gpioPin, + uint8_t * isDigital); +/** + * \brief Helper function to set gpio registers based on input parameters. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] gpioSigType GPIO Signal type. + * \param[in] signalMask mask value for the GPIO signal type. + * \param[in] gpioPinstate GPIO state. + * \param[in] isDigital indicate the GPIO type: 0: Analog, 1: Digital. + * \param[in] updateDbgFlag: 0: The debug flag don't need to be updated, + * 1: The debug flag needs to be cleared, + * 2: The debug flag needs to be set + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioCtrlDbgGpioOutputSet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_OutGpioSigTypes_e gpioSigType, + const uint8_t signalMask, + const adi_adrv904x_OutGpioPinStates_e gpioPinstate, + uint8_t isDigital, + uint8_t updateDbgFlag); + +/** + * \brief Helper function to set gpio registers based on input parameters. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] gpioSigType GPIO Signal type. + * \param[in] signalOffset value for the GPIO signal type. + * \param[out] gpioPinstate Pointer to hold the return value for GPIO state. + * \param[in] gpioPin GPIO pin. + * \param[in] isDigital indicate the GPIO type: 0: Analog, 1: Digital. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioCtrlDbgGpioOutputGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_OutGpioSigTypes_e gpioSigType, + const uint8_t signalOffset, + adi_adrv904x_OutGpioPinStates_e* const gpioPinstate, + uint8_t gpioPin, + uint8_t isDigital); + +/** + * \brief Helper function to return information if GPIO signal type can be affected by an active alarm. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] gpioSigType GPIO Signal type. + * \param[in, out] isAffected Pointer to hold the return value for isAffected. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioCtrlDbgGpioIsSignalTypeAffectedByAlarms(adi_adrv904x_Device_t* const device, + const adi_adrv904x_OutGpioSigTypes_e gpioSigType, + uint8_t* isAffected); + +/** + * \brief Helper function to return a bitmap of PA_EN outputs currently affected by active alarms. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in,out] paEnAffectedByAlarm Pointer to hold the return value for paEnAffectedByAlarm. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioCtrlDbgGpioGetPaEnAffectedByAlarms(adi_adrv904x_Device_t* const device, + uint8_t* paEnAffectedByAlarm); + +/** + * \brief Helper function to return a bitmap of LNA_EN outputs currently affected by active alarms. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in,out] lnaEnAffectedByAlarm Pointer to hold the return value for lnaEnAffectedByAlarm. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioCtrlDbgGpioGetLnaEnAffectedByAlarms(adi_adrv904x_Device_t* const device, + uint8_t* lnaEnAffectedByAlarm); + + +/** + * \brief Helper function to set GPIO debug flag used by external alarms. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] gpioSigType GPIO Signal type. + * \param[in] signalOffset value for the GPIO signal type. + * \param[in] flag Value of the flag to be set: 0: inactive, 1: active. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioCtrlDbgGpioDebugFlagSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_OutGpioSigTypes_e gpioSigType, + const uint8_t signalOffset, + uint8_t flag); + +/** + * \brief Helper function to set Antenna Calibration Configuration + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] adi_adrv904x_RadioCtrlAntCalCarrierCfg_t Antenna calibration configuration structure. + * \param[in] postCalPatternId post antenna cal patternID to use for the _V2 version of the Antenna cal config set + * \param[in] useV2 flag on whether to use the _V2 version of the Antenna cal config set + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalCarrierConfigSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RadioCtrlAntCalCarrierCfg_t* const antCalCarrierCfg, + uint32_t postCalPatternId, + uint8_t useV2); + +#endif //CLIENT_IGNORE + +#endif diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_radioctrl_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_radioctrl_types.h new file mode 100644 index 00000000000..7b8e90f66fc --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_radioctrl_types.h @@ -0,0 +1,222 @@ +/** + * Copyright 2015 - 2022 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adrv904x_radioctrl_types.h + * \brief Contains ADRV904X RADIOCTRL related private data prototypes for + * adrv904x_radioctrl.c + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADRV904X_RADIOCTRL_TYPES_H_ +#define _ADRV904X_RADIOCTRL_TYPES_H_ + +typedef enum adrv904x_StreamGpioFeatureSelection +{ + ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT0 = 0U, + ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT1 = 1U, + ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT2 = 2U, + ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT3 = 3U, + ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT4 = 4U, + ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT5 = 5U, + ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT6 = 6U, + ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT7 = 7U, + ADRV904X_STREAM_GPIO_TX_ANTENNA_CAL = 8U, + ADRV904X_STREAM_GPIO_RX_ANTENNA_CAL = 9U, + ADRV904X_STREAM_GPIO_TX_PAP_FOR_EXT_LO0_UNLOCK = 10U, + ADRV904X_STREAM_GPIO_TX_PAP_FOR_EXT_LO1_UNLOCK = 11U, + + ADRV904X_STREAM_GPIO_ALARM_INPUT_0 = 20U, + ADRV904X_STREAM_GPIO_ALARM_INPUT_1 = 21U, + ADRV904X_STREAM_GPIO_ALARM_INPUT_2 = 22U, + ADRV904X_STREAM_GPIO_ALARM_INPUT_3 = 23U, + ADRV904X_STREAM_GPIO_ALARM_INPUT_4 = 24U, + ADRV904X_STREAM_GPIO_ALARM_INPUT_5 = 25U, + ADRV904X_STREAM_GPIO_ALARM_INPUT_6 = 26U, + ADRV904X_STREAM_GPIO_ALARM_INPUT_7 = 27U, + ADRV904X_STREAM_GPIO_ALARM_INPUT_8 = 28U, + ADRV904X_STREAM_GPIO_ALARM_INPUT_9 = 29U, + ADRV904X_STREAM_GPIO_PA_EN_OUT_0 = 30U, + ADRV904X_STREAM_GPIO_PA_EN_OUT_1 = 31U, + ADRV904X_STREAM_GPIO_PA_EN_OUT_2 = 32U, + ADRV904X_STREAM_GPIO_PA_EN_OUT_3 = 33U, + ADRV904X_STREAM_GPIO_PA_EN_OUT_4 = 34U, + ADRV904X_STREAM_GPIO_PA_EN_OUT_5 = 35U, + ADRV904X_STREAM_GPIO_PA_EN_OUT_6 = 36U, + ADRV904X_STREAM_GPIO_PA_EN_OUT_7 = 37U, + ADRV904X_STREAM_GPIO_LNA_EN_OUT_0 = 38U, + ADRV904X_STREAM_GPIO_LNA_EN_OUT_1 = 39U, + ADRV904X_STREAM_GPIO_LNA_EN_OUT_2 = 40U, + ADRV904X_STREAM_GPIO_LNA_EN_OUT_3 = 41U, + ADRV904X_STREAM_GPIO_LNA_EN_OUT_4 = 42U, + ADRV904X_STREAM_GPIO_LNA_EN_OUT_5 = 43U, + ADRV904X_STREAM_GPIO_LNA_EN_OUT_6 = 44U, + ADRV904X_STREAM_GPIO_LNA_EN_OUT_7 = 45U, + ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_0 = 46U, + ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_1 = 47U, + ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_2 = 48U, + ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_3 = 49U, + ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_4 = 50U, + ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_5 = 51U, + ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_6 = 52U, + ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_7 = 53U, + ADRV904X_STREAM_GPIO_SBET_LATCH_DPD_MODEL_INDEX = 59U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX0_MAP_BIT0 = 60U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX0_MAP_BIT1 = 61U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX0_MAP_BIT2 = 62U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX0_MAP_BIT3 = 63U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX1_MAP_BIT0 = 64U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX1_MAP_BIT1 = 65U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX1_MAP_BIT2 = 66U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX1_MAP_BIT3 = 67U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT0 = 68U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT1 = 69U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT2 = 70U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT3 = 71U, + ADRV904X_STREAM_GPIO_DTX_INPUT_0 = 72U, + ADRV904X_STREAM_GPIO_DTX_INPUT_1 = 73U, + ADRV904X_STREAM_GPIO_DTX_INPUT_2 = 74U, + ADRV904X_STREAM_GPIO_DTX_INPUT_3 = 75U, + ADRV904X_STREAM_GPIO_DTX_INPUT_4 = 76U, + ADRV904X_STREAM_GPIO_DTX_INPUT_5 = 77U, + ADRV904X_STREAM_GPIO_DTX_INPUT_6 = 78U, + ADRV904X_STREAM_GPIO_DTX_INPUT_7 = 79U, + ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN0 = 80U, + ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN1 = 81U, + ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN2 = 82U, + ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN3 = 83U, + ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN4 = 84U, + ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN5 = 85U, + ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN6 = 86U, + ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN7 = 87U, + ADRV904X_STREAM_GPIO_TDD_SW = 88U, + ADRV904X_STREAM_GPIO_PREDRIVE_EN = 89U, + ADRV904X_STREAM_GPIO_RS_PATTERN_SWITCHING = 90U, + ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX0 = 91U, + ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX1 = 92U, + ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX2 = 93U, + ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX3 = 94U, + ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX4 = 95U, + ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX5 = 96U, + ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX6 = 97U, + ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX7 = 98U, + ADRV904X_STREAM_GPIO_RS_SSB_SYNC_PIN = 99U, + ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_0 = 100U, + ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_1 = 101U, + ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_2 = 102U, + ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_3 = 103U, + ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_4 = 104U, + ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_5 = 105U, + ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_6 = 106U, + ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_7 = 107U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX0_MAP_BIT4 = 108U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX0_MAP_BIT5 = 109U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX0_MAP_BIT6 = 110U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX0_MAP_BIT7 = 111U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX1_MAP_BIT4 = 112U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX1_MAP_BIT5 = 113U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX1_MAP_BIT6 = 114U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX1_MAP_BIT7 = 115U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT4 = 116U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT5 = 117U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT6 = 118U, + ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT7 = 119U, + ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_0 = 120U, + ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_1 = 121U, + ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_2 = 122U, + ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_3 = 123U, + ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_4 = 124U, + ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_5 = 125U, + ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_6 = 126U, + ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_7 = 127U, + + ADRV904X_STREAM_GPIO_VSWR_DIR_ORX0 = 252U, + ADRV904X_STREAM_GPIO_VSWR_DIR_ORX1 = 253U, + ADRV904X_STREAM_GPIO_VSWR_DIR_ORX_CMN = 254U, + ADRV904X_STREAM_GPIO_UNUSED = 255U +} adrv904x_StreamGpioFeatureSelection_e; + +typedef enum adrv904x_StreamAnaGpioFeatureSelection +{ + + ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_0 = 30U, + ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_1 = 31U, + ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_2 = 32U, + ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_3 = 33U, + ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_4 = 34U, + ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_5 = 35U, + ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_6 = 36U, + ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_7 = 37U, + ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_0 = 38U, + ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_1 = 39U, + ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_2 = 40U, + ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_3 = 41U, + ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_4 = 42U, + ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_5 = 43U, + ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_6 = 44U, + ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_7 = 45U, + ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_0 = 46U, + ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_1 = 47U, + ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_2 = 48U, + ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_3 = 49U, + ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_4 = 50U, + ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_5 = 51U, + ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_6 = 52U, + ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_7 = 53U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX0_MAP_BIT0 = 60U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX0_MAP_BIT1 = 61U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX0_MAP_BIT2 = 62U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX0_MAP_BIT3 = 63U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX1_MAP_BIT0 = 64U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX1_MAP_BIT1 = 65U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX1_MAP_BIT2 = 66U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX1_MAP_BIT3 = 67U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT0 = 68U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT1 = 69U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT2 = 70U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT3 = 71U, + ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN0 = 80U, + ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN1 = 81U, + ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN2 = 82U, + ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN3 = 83U, + ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN4 = 84U, + ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN5 = 85U, + ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN6 = 86U, + ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN7 = 87U, + ADRV904X_STREAM_ANALOG_GPIO_TDD_SW = 88U, + ADRV904X_STREAM_ANALOG_GPIO_PREDRIVE_EN = 89U, + ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_0 = 100U, + ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_1 = 101U, + ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_2 = 102U, + ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_3 = 103U, + ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_4 = 104U, + ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_5 = 105U, + ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_6 = 106U, + ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_7 = 107U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX0_MAP_BIT4 = 108U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX0_MAP_BIT5 = 109U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX0_MAP_BIT6 = 110U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX0_MAP_BIT7 = 111U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX1_MAP_BIT4 = 112U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX1_MAP_BIT5 = 113U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX1_MAP_BIT6 = 114U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX1_MAP_BIT7 = 115U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT4 = 116U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT5 = 117U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT6 = 118U, + ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT7 = 119U, + ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_0 = 120U, + ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_1 = 121U, + ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_2 = 122U, + ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_3 = 123U, + ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_4 = 124U, + ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_5 = 125U, + ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_6 = 126U, + ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_7 = 127U, + ADRV904X_STREAM_ANA_GPIO_UNUSED = 255U +} adrv904x_StreamAnaGpioFeatureSelection_e; +#endif /* _ADRV904X_RADIOCTRL_TYPES_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_reg_addr_macros.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_reg_addr_macros.h new file mode 100644 index 00000000000..ef515990cf0 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_reg_addr_macros.h @@ -0,0 +1,566 @@ +/** + * This file is automatically generated - DO NOT EDIT + * + * Copyright 2015 - 2022 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +#ifndef _ADRV904X_REG_ADDR_MACROS_H +#define _ADRV904X_REG_ADDR_MACROS_H + +#define ADRV904X_BF_ENCODE(value, mask, shift) (((value) << (shift)) & (mask)) +#define ADRV904X_BF_DECODE(value, mask, shift) (((value) & (mask)) >> (shift)) +#define ADRV904X_BF_CLEAR(result, mask) (result = ((result) & ~(mask))) +#define ADRV904X_BF_SET(result, mask) (result = (result) | (mask)) +#define ADRV904X_BF_UPDATE(result, value, mask, shift) (result = ((result) & ~(mask)) | ( ((value) << (shift)) & (mask))) +#define ADRV904X_BF_EQUAL(value, mask) ((mask) == ((value) & (mask))) + + +/* ETM Offset registers */ +#define ADRV904X_ETM_MAX 0x4U +#define ADRV904X_ETM_TRCCONFIGR_OFFSET 0x10U +#define ADRV904X_ETM_TRCTRACEIDR_OFFSET 0x40U +#define ADRV904X_ETM_TRCPRGCTLR_OFFSET 0x4U +#define ADRV904X_ETM_TRCIDR0_OFFSET 0x1E0U +#define ADRV904X_ETM_TRCIDR1_OFFSET 0x1E4U +#define ADRV904X_ETM_TRCIDR2_OFFSET 0x1E8U +#define ADRV904X_ETF_RSZ_OFFSET 0x4U +#define ADRV904X_ETF_RRD_OFFSET 0x10U + +/* Bit positions */ +#define ADRV904X_CPU_MASK_CTL1_M3_RUN 0x01 +#define ADRV904X_STREAM_RESET_BIT 0 +#define ADRV904X_RX_STREAM_RESET_BIT 16 +#define ADRV904X_STREAM_BASE_BYTE0_BIT 3 +#define ADRV904X_STREAM_BASE_BYTE1_BIT 11 +#define ADRV904X_LAST_STREAM_NUMBER_BIT 19 +#define ADRV904X_RX_STREAM_BASE_BYTE0_BIT 0 +#define ADRV904X_RX_STREAM_BASE_BYTE1_BIT 8 +#define ADRV904X_RX_LAST_STREAM_NUMBER_BIT 16 + +/* Core stream register offsets */ +#define ADRV904X_STREAM_BASE_BYTE0_REG_OFFSET 1 +#define ADRV904X_STREAM_BASE_BYTE1_REG_OFFSET 2 +#define ADRV904X_LAST_STREAM_NUMBER_REG_OFFSET 3 + +/* Registers that require using 32-bit SPI transactions */ +/* ORx RAM, Tx DPD RAM, and Tx/Rx Gain Tables */ +#define ADRV904X_AHB_ADDR_STRIDE 0x100000U +#define ADRV904X_ORX_RAM_ADDR_BASE 0x61000000U +#define ADRV904X_ORX_RAM_REG_LEN 0xC000U +#define ADRV904X_ORX_ANALOG_ADC_ADDR_BASE 0x61070000U +#define ADRV904X_ORX_ANALOG_ADC_REG_LEN 0xD800U +#define ADRV904X_RX_GAIN_TABLE_ADDR_BASE 0x600A0000U +#define ADRV904X_RX_GAIN_TABLE_REG_LEN 0x800U +#define ADRV904X_TX_DPD_RAM_ADDR_BASE 0x60800000U +#define ADRV904X_TX_DPD_RAM_REG_LEN 0x10000U +#define ADRV904X_TX_ATTEN_TABLE_ADDR_BASE 0x60810000U +#define ADRV904X_TX_ATTEN_TABLE_REG_LEN 0x2F00U +#define ADRV904X_UART_ADDR_BASE 0x46100000U +#define ADRV904X_UART_REG_LEN 0x100000U +#define ADRV904X_SPI_MASTER_ADDR_BASE 0x46200000U +#define ADRV904X_SPI_MASTER_REG_LEN 0x100000U +#define ADRV904X_INTR_TSMTR_ADDR_BASE 0x46800000U +#define ADRV904X_INTR_TSMTR_REG_LEN 0x10000U +#define ADRV904X_TELEMETRY_ADDR_BASE 0x46400000U +#define ADRV904X_TELEMETRY_REG_LEN 0x100000U + +/* 32 Hardware semaphore addresses */ +#define ADRV904X_SEMAPHORE_ADDR_BASE 0x46500000U +#define ADRV904X_SEMAPHORE_ADDR_STRIDE 0x00010000U + +#define ADRV904X_CORE_0_INTR_AGG_ADDR_BASE 0x41200000U +#define ADRV904X_CORE_0_INTR_AGG_REG_LEN 0x100000U +#define ADRV904X_CORE_1_INTR_AGG_ADDR_BASE 0x44200000U +#define ADRV904X_CORE_1_INTR_AGG_REG_LEN 0x100000U +#define ADRV904X_TX_DPD_ACT_LUT_ADDR_BASE 0x608E4000U +#define ADRV904X_TX_DPD_ACT_LUT_REG_LEN 0x4000U +#define ADRV904X_TX_ANA_LB_ADC_32_ADDR_BASE 0x60890000U +#define ADRV904X_TX_ANA_LB_ADC_32_REG_LEN 0x4000U +#define ADRV904X_TX_SEMAPHORE_ADDR_BASE 0x60824000U +#define ADRV904X_TX_SEMAPHORE_REG_LEN 0x8000U +#define ADRV904X_TX_CFR_PULSE_RAM_ADDR_BASE 0x608D2000U +#define ADRV904X_TX_CFR_PULSE_RAM_REG_LEN 0xC000U +#define ADRV904X_RX_SEMAPHORE_ADDR_BASE 0x60024000U +#define ADRV904X_RX_SEMAPHORE_REG_LEN 0x8000U +#define ADRV904X_ORX_SEMAPHORE_ADDR_BASE 0x61024000U +#define ADRV904X_ORX_SEMAPHORE_REG_LEN 0x8000U +#define ADRV904X_RS_GLOBAL_CFG_1_ADDR_BASE 0x4D200008U +#define ADRV904X_RS_GLOBAL_CFG_1_REG_LEN 0x0004U +#define ADRV904X_RS_CONFIG_0_ADDR_BASE 0x4D200020U +#define ADRV904X_RS_CONFIG_0_REG_LEN 0x003CU +#define ADRV904X_A55_INTR_AGG_ADDR_BASE 0xB2300000U +#define ADRV904X_A55_INTR_AGG_REG_LEN 0x100000U +#define ADRV904X_A55_INTR_TSMTR_ADDR_BASE 0xB2400000U +#define ADRV904X_A55_INTR_TSMTR_REG_LEN 0x100000U +#define ADRV904X_A55_UART0_ADDR_BASE 0xB1200000U +#define ADRV904X_A55_UART0_REG_LEN 0x100000U +#define ADRV904X_A55_UART1_ADDR_BASE 0xB1400000U +#define ADRV904X_A55_UART1_REG_LEN 0x100000U +#define ADRV904X_A55_TRU_ADDR_BASE 0xB1000000U +#define ADRV904X_A55_TRU_REG_LEN 0x100000U +#define ADRV904X_A55_GIC_ADDR_BASE 0xB8100000U +#define ADRV904X_A55_GIC_REG_LEN 0x100000U +#define ADRV904X_A55_MDMA_ADDR_BASE 0xB0000000U +#define ADRV904X_A55_MDMA_REG_LEN 0x400000U +#define ADRV904X_A55_L4CFG_ADDR_BASE 0xB0800000U +#define ADRV904X_A55_L4CFG_REG_LEN 0x400000U +#define ADRV904X_A55_CAPBUFDDE_ADDR_BASE 0xB0C00000U +#define ADRV904X_A55_CAPBUFDDE_REG_LEN 0x200000U +#define ADRV904X_A55_TSGEN_CTRL_ADDR_BASE 0xB0F00000U +#define ADRV904X_A55_TSGEN_CTRL_REG_LEN 0x100000U +#define ADRV904X_A55_MMR_FABRIC_ADDR_BASE 0xB1800000U +#define ADRV904X_A55_MMR_FABRIC_REG_LEN 0x100000U +#define ADRV904X_A55_SYSTEM_CTI_ADDR_BASE 0xB6001000U +#define ADRV904X_A55_SYSTEM_CTI_REG_LEN 0x1000U +#define ADRV904X_A55_ATB_FUNNEL_ADDR_BASE 0xB6002000U +#define ADRV904X_A55_ATB_FUNNEL_REG_LEN 0x1000U +#define ADRV904X_A55_TRACE_FIFO_ADDR_BASE 0xB6003000U +#define ADRV904X_A55_TRACE_FIFO_REG_LEN 0x1000U +#define ADRV904X_A55_TPIU_ADDR_BASE 0xB6004000U +#define ADRV904X_A55_TPIU_REG_LEN 0x1000U +#define ADRV904X_A55_PE_DBGVIEW_ADDR_BASE 0xB7010000U +#define ADRV904X_A55_PE_DBGVIEW_REG_LEN 0x400000U +#define ADRV904X_A55_PE_SYSVIEW_ADDR_BASE 0xB7810000U +#define ADRV904X_A55_PE_SYSVIEW_REG_LEN 0x400000U +#define ADRV904X_A55_FABRIC_ADDR_BASE 0xB8000000U +#define ADRV904X_A55_FABRIC_REG_LEN 0x100000U +#define ADRV904X_TX_VSWR_PLAYBACK_RAM_ADDR_BASE 0x608F9000U +#define ADRV904X_TX_VSWR_PLAYBACK_RAM_REG_LEN 0x1000U +#define ADRV904X_TX_CAPTURE_RAM_ADDR_BASE 0x60800000U +#define ADRV904X_TX_CAPTURE_RAM_REG_LEN 0x1000U + +/* Register addresses + * To add new register macros append the [API macro name] [YODA Header name] + * pair in c_src\devices\adrv904x\private\include\adrv904x_yoda_reg_list.txt file. +*/ +#define ADRV904X_ADDR_SPIFIFO_MODE (0x10U) +#define ADRV904X_CPU_0_ADDR_CTL_1 (0x22U) +#define ADRV904X_CPU_0_ADDR_BOOT_ADDR_BYTE0 (0x24U) +#define ADRV904X_CPU_0_ADDR_BOOT_ADDR_BYTE1 (0x25U) +#define ADRV904X_CPU_0_ADDR_BOOT_ADDR_BYTE2 (0x26U) +#define ADRV904X_CPU_0_ADDR_BOOT_ADDR_BYTE3 (0x27U) +#define ADRV904X_CPU_0_ADDR_STACK_PTR_BYTE0 (0x28U) +#define ADRV904X_CPU_0_ADDR_STACK_PTR_BYTE1 (0x29U) +#define ADRV904X_CPU_0_ADDR_STACK_PTR_BYTE2 (0x2AU) +#define ADRV904X_CPU_0_ADDR_STACK_PTR_BYTE3 (0x2BU) +#define ADRV904X_CPU_0_ADDR_MEM_BANK_CTRL (0x4DU) +#define ADRV904X_ADDR_SPIDMA0_CTL (0x4FU) +#define ADRV904X_ADDR_SPIDMA0_ADDR3 (0x50U) +#define ADRV904X_ADDR_SPIDMA0_ADDR2 (0x51U) +#define ADRV904X_ADDR_SPIDMA0_ADDR1 (0x52U) +#define ADRV904X_ADDR_SPIDMA0_ADDR0 (0x53U) +#define ADRV904X_ADDR_SPIDMA0_DATA3 (0x54U) +#define ADRV904X_ADDR_SPIDMA0_DATA2 (0x55U) +#define ADRV904X_ADDR_SPIDMA0_DATA1 (0x56U) +#define ADRV904X_ADDR_SPIDMA0_DATA0 (0x57U) +#define ADRV904X_CPU_0_ADDR_COMMAND (0x63U) +#define ADRV904X_CPU_0_ADDR_EXT_CMD_BYTE_1 (0x64U) +#define ADRV904X_CPU_0_ADDR_CMD_STATUS_0 (0x6BU) +#define ADRV904X_ADDR_MAIN_STREAM_CTL (0x95U) +#define ADRV904X_ADDR_KFA_STREAM_CTL (0x95U) +#define ADRV904X_CPU_1_ADDR_CTL_1 (0xC6U) +#define ADRV904X_CPU_1_ADDR_BOOT_ADDR_BYTE0 (0xC8U) +#define ADRV904X_CPU_1_ADDR_BOOT_ADDR_BYTE1 (0xC9U) +#define ADRV904X_CPU_1_ADDR_BOOT_ADDR_BYTE2 (0xCAU) +#define ADRV904X_CPU_1_ADDR_BOOT_ADDR_BYTE3 (0xCBU) +#define ADRV904X_CPU_1_ADDR_STACK_PTR_BYTE0 (0xCCU) +#define ADRV904X_CPU_1_ADDR_STACK_PTR_BYTE1 (0xCDU) +#define ADRV904X_CPU_1_ADDR_STACK_PTR_BYTE2 (0xCEU) +#define ADRV904X_CPU_1_ADDR_STACK_PTR_BYTE3 (0xCFU) +#define ADRV904X_CPU_1_ADDR_MEM_BANK_CTRL (0xF2U) +#define ADRV904X_CPU_1_ADDR_COMMAND (0xF4U) +#define ADRV904X_CPU_1_ADDR_EXT_CMD_BYTE_1 (0xF5U) +#define ADRV904X_CPU_1_ADDR_CMD_STATUS_0 (0xFCU) +#define ADRV904X_ADDR_SPI0_PAGE_31TO24 (0x126U) +#define ADRV904X_ADDR_SPI0_PAGE_23TO16 (0x127U) +#define ADRV904X_ADDR_SPI0_PAGE_15TO8 (0x128U) +#define ADRV904X_ADDR_SPI0_PAGE_7TO0 (0x129U) +#define ADRV904X_ADDR_SPI0_PAGING_CONTROL (0x12AU) +#define ADRV904X_ADDR_SPI0_MASK_7TO0 (0x132U) +#define ADRV904X_ADDR_GPINT_MASK_PIN1_BYTE1 (0x147U) +#define ADRV904X_ADDR_GPINT_MASK_PIN1_BYTE9 (0x14FU) +#define ADRV904X_ADDR_GPINT_MASK_PIN0_BYTE1 (0x153U) +#define ADRV904X_ADDR_GPINT_MASK_PIN0_BYTE9 (0x15BU) +#define ADRV904X_ADDR_GPINT_STATUS_BYTE1 (0x16BU) +#define ADRV904X_ADDR_EFUSE_READ_CTRL (0x18BU) +#define ADRV904X_ADDR_EFUSE_READ_ADDR (0x192U) +#define ADRV904X_ADDR_CORE_STREAM_SCRATCH204 (0x2CCU) +#define ADRV904X_ADDR_CORE_STREAM_SCRATCH212 (0x2D4U) +#define ADRV904X_ADDR_CORE_STREAM_SCRATCH213 (0x2D5U) +#define ADRV904X_ADDR_CORE_STREAM_SCRATCH214 (0x2D6U) +#define ADRV904X_ADDR_CORE_STREAM_SCRATCH215 (0x2D7U) +#define ADRV904X_ADDR_CORE_STREAM_SCRATCH216 (0x2D8U) +#define ADRV904X_ADDR_CORE_STREAM_SCRATCH481 (0x3E1U) +#define ADRV904X_ADDR_RFLO0_PLL_MISC_PD (0x47300001U) +#define ADRV904X_ADDR_RFLO1_PLL_MISC_PD (0x47400001U) +#define ADRV904X_ADDR_SERDES_PLL_MISC_PD (0x48060001U) +#define ADRV904X_ADDR_SERDES_PLL_OUTPUT_DIVIDER_CTL (0x480600AEU) +#define ADRV904X_ADDR_CLK_PLL_MISC_PD (0x48090001U) +#define ADRV904X_ADDR_DESER_PHY0_SPI_INTFCONFA (0x48080000U) +#define ADRV904X_ADDR_SERDES_RXDIG_PHY_PD_0 (0x48080002U) +#define ADRV904X_ADDR_DESER_PHY0_PD_REG_0 (0x48080002U) +#define ADRV904X_ADDR_DESER_PHY0_PD_REG_1 (0x48080003U) +#define ADRV904X_ADDR_DESER_PHY0_CORE1P2_TEST (0x4808000EU) +#define ADRV904X_ADDR_DESER_PHY0_CORE1P2_DECFE_CTL0 (0x480800C0U) +#define ADRV904X_ADDR_DESER_PHY0_CORE1P2_DECFE_CTL18 (0x480800D2U) +#define ADRV904X_ADDR_DESER_PHY0_CORE1P2_DECFE_CTL28 (0x480800DCU) +#define ADRV904X_ADDR_DESER_PHY0_CORE1P2_DECFE_CTL31 (0x480800E2U) +#define ADRV904X_ADDR_DESER_PHY0_CORE1P2_DECFE_CTL41 (0x480800ECU) +#define ADRV904X_ADDR_DESER_PHY0_CORE1P2_DECFE_CTL43 (0x480800EFU) +#define ADRV904X_ADDR_DESER_PHY0_CORE1P2_DECFE_CTL45 (0x480800F2U) +#define ADRV904X_ADDR_DESER_PHY0_CORE1P2_DECFE_CTL49 (0x480800F7U) +#define ADRV904X_ADDR_DESER_PHY0_CORE1P2_DECFE_CTL54 (0x480800FCU) +#define ADRV904X_ADDR_DESER_PHY1_SPI_INTFCONFA (0x48080800U) +#define ADRV904X_ADDR_DESER_PHY1_PD_REG_0 (0x48080802U) +#define ADRV904X_ADDR_DESER_PHY1_PD_REG_1 (0x48080803U) +#define ADRV904X_ADDR_DESER_PHY1_CORE1P2_TEST (0x4808080EU) +#define ADRV904X_ADDR_DESER_PHY1_CORE1P2_DECFE_CTL0 (0x480808C0U) +#define ADRV904X_ADDR_DESER_PHY1_CORE1P2_DECFE_CTL18 (0x480808D2U) +#define ADRV904X_ADDR_DESER_PHY1_CORE1P2_DECFE_CTL28 (0x480808DCU) +#define ADRV904X_ADDR_DESER_PHY1_CORE1P2_DECFE_CTL31 (0x480808E2U) +#define ADRV904X_ADDR_DESER_PHY1_CORE1P2_DECFE_CTL41 (0x480808ECU) +#define ADRV904X_ADDR_DESER_PHY1_CORE1P2_DECFE_CTL43 (0x480808EFU) +#define ADRV904X_ADDR_DESER_PHY1_CORE1P2_DECFE_CTL45 (0x480808F2U) +#define ADRV904X_ADDR_DESER_PHY1_CORE1P2_DECFE_CTL49 (0x480808F7U) +#define ADRV904X_ADDR_DESER_PHY1_CORE1P2_DECFE_CTL54 (0x480808FCU) +#define ADRV904X_ADDR_DESER_PHY2_SPI_INTFCONFA (0x48081000U) +#define ADRV904X_ADDR_DESER_PHY2_PD_REG_0 (0x48081002U) +#define ADRV904X_ADDR_DESER_PHY2_PD_REG_1 (0x48081003U) +#define ADRV904X_ADDR_DESER_PHY2_CORE1P2_TEST (0x4808100EU) +#define ADRV904X_ADDR_DESER_PHY2_CORE1P2_DECFE_CTL0 (0x480810C0U) +#define ADRV904X_ADDR_DESER_PHY2_CORE1P2_DECFE_CTL18 (0x480810D2U) +#define ADRV904X_ADDR_DESER_PHY2_CORE1P2_DECFE_CTL28 (0x480810DCU) +#define ADRV904X_ADDR_DESER_PHY2_CORE1P2_DECFE_CTL31 (0x480810E2U) +#define ADRV904X_ADDR_DESER_PHY2_CORE1P2_DECFE_CTL41 (0x480810ECU) +#define ADRV904X_ADDR_DESER_PHY2_CORE1P2_DECFE_CTL43 (0x480810EFU) +#define ADRV904X_ADDR_DESER_PHY2_CORE1P2_DECFE_CTL45 (0x480810F2U) +#define ADRV904X_ADDR_DESER_PHY2_CORE1P2_DECFE_CTL49 (0x480810F7U) +#define ADRV904X_ADDR_DESER_PHY2_CORE1P2_DECFE_CTL54 (0x480810FCU) +#define ADRV904X_ADDR_DESER_PHY3_SPI_INTFCONFA (0x48081800U) +#define ADRV904X_ADDR_DESER_PHY3_PD_REG_0 (0x48081802U) +#define ADRV904X_ADDR_DESER_PHY3_PD_REG_1 (0x48081803U) +#define ADRV904X_ADDR_DESER_PHY3_CORE1P2_TEST (0x4808180EU) +#define ADRV904X_ADDR_DESER_PHY3_CORE1P2_DECFE_CTL0 (0x480818C0U) +#define ADRV904X_ADDR_DESER_PHY3_CORE1P2_DECFE_CTL18 (0x480818D2U) +#define ADRV904X_ADDR_DESER_PHY3_CORE1P2_DECFE_CTL28 (0x480818DCU) +#define ADRV904X_ADDR_DESER_PHY3_CORE1P2_DECFE_CTL31 (0x480818E2U) +#define ADRV904X_ADDR_DESER_PHY3_CORE1P2_DECFE_CTL41 (0x480818ECU) +#define ADRV904X_ADDR_DESER_PHY3_CORE1P2_DECFE_CTL43 (0x480818EFU) +#define ADRV904X_ADDR_DESER_PHY3_CORE1P2_DECFE_CTL45 (0x480818F2U) +#define ADRV904X_ADDR_DESER_PHY3_CORE1P2_DECFE_CTL49 (0x480818F7U) +#define ADRV904X_ADDR_DESER_PHY3_CORE1P2_DECFE_CTL54 (0x480818FCU) +#define ADRV904X_ADDR_DESER_PHY4_SPI_INTFCONFA (0x48082000U) +#define ADRV904X_ADDR_DESER_PHY4_PD_REG_0 (0x48082002U) +#define ADRV904X_ADDR_DESER_PHY4_PD_REG_1 (0x48082003U) +#define ADRV904X_ADDR_DESER_PHY4_CORE1P2_TEST (0x4808200EU) +#define ADRV904X_ADDR_DESER_PHY4_CORE1P2_DECFE_CTL0 (0x480820C0U) +#define ADRV904X_ADDR_DESER_PHY4_CORE1P2_DECFE_CTL18 (0x480820D2U) +#define ADRV904X_ADDR_DESER_PHY4_CORE1P2_DECFE_CTL28 (0x480820DCU) +#define ADRV904X_ADDR_DESER_PHY4_CORE1P2_DECFE_CTL31 (0x480820E2U) +#define ADRV904X_ADDR_DESER_PHY4_CORE1P2_DECFE_CTL41 (0x480820ECU) +#define ADRV904X_ADDR_DESER_PHY4_CORE1P2_DECFE_CTL43 (0x480820EFU) +#define ADRV904X_ADDR_DESER_PHY4_CORE1P2_DECFE_CTL45 (0x480820F2U) +#define ADRV904X_ADDR_DESER_PHY4_CORE1P2_DECFE_CTL49 (0x480820F7U) +#define ADRV904X_ADDR_DESER_PHY4_CORE1P2_DECFE_CTL54 (0x480820FCU) +#define ADRV904X_ADDR_DESER_PHY5_SPI_INTFCONFA (0x48082800U) +#define ADRV904X_ADDR_DESER_PHY5_PD_REG_0 (0x48082802U) +#define ADRV904X_ADDR_DESER_PHY5_PD_REG_1 (0x48082803U) +#define ADRV904X_ADDR_DESER_PHY5_CORE1P2_TEST (0x4808280EU) +#define ADRV904X_ADDR_DESER_PHY5_CORE1P2_DECFE_CTL0 (0x480828C0U) +#define ADRV904X_ADDR_DESER_PHY5_CORE1P2_DECFE_CTL18 (0x480828D2U) +#define ADRV904X_ADDR_DESER_PHY5_CORE1P2_DECFE_CTL28 (0x480828DCU) +#define ADRV904X_ADDR_DESER_PHY5_CORE1P2_DECFE_CTL31 (0x480828E2U) +#define ADRV904X_ADDR_DESER_PHY5_CORE1P2_DECFE_CTL41 (0x480828ECU) +#define ADRV904X_ADDR_DESER_PHY5_CORE1P2_DECFE_CTL43 (0x480828EFU) +#define ADRV904X_ADDR_DESER_PHY5_CORE1P2_DECFE_CTL45 (0x480828F2U) +#define ADRV904X_ADDR_DESER_PHY5_CORE1P2_DECFE_CTL49 (0x480828F7U) +#define ADRV904X_ADDR_DESER_PHY5_CORE1P2_DECFE_CTL54 (0x480828FCU) +#define ADRV904X_ADDR_DESER_PHY6_SPI_INTFCONFA (0x48083000U) +#define ADRV904X_ADDR_DESER_PHY6_PD_REG_0 (0x48083002U) +#define ADRV904X_ADDR_DESER_PHY6_PD_REG_1 (0x48083003U) +#define ADRV904X_ADDR_DESER_PHY6_CORE1P2_TEST (0x4808300EU) +#define ADRV904X_ADDR_DESER_PHY6_CORE1P2_DECFE_CTL0 (0x480830C0U) +#define ADRV904X_ADDR_DESER_PHY6_CORE1P2_DECFE_CTL18 (0x480830D2U) +#define ADRV904X_ADDR_DESER_PHY6_CORE1P2_DECFE_CTL28 (0x480830DCU) +#define ADRV904X_ADDR_DESER_PHY6_CORE1P2_DECFE_CTL31 (0x480830E2U) +#define ADRV904X_ADDR_DESER_PHY6_CORE1P2_DECFE_CTL41 (0x480830ECU) +#define ADRV904X_ADDR_DESER_PHY6_CORE1P2_DECFE_CTL43 (0x480830EFU) +#define ADRV904X_ADDR_DESER_PHY6_CORE1P2_DECFE_CTL45 (0x480830F2U) +#define ADRV904X_ADDR_DESER_PHY6_CORE1P2_DECFE_CTL49 (0x480830F7U) +#define ADRV904X_ADDR_DESER_PHY6_CORE1P2_DECFE_CTL54 (0x480830FCU) +#define ADRV904X_ADDR_DESER_PHY7_SPI_INTFCONFA (0x48083800U) +#define ADRV904X_ADDR_DESER_PHY7_PD_REG_0 (0x48083802U) +#define ADRV904X_ADDR_DESER_PHY7_PD_REG_1 (0x48083803U) +#define ADRV904X_ADDR_DESER_PHY7_CORE1P2_TEST (0x4808380EU) +#define ADRV904X_ADDR_DESER_PHY7_CORE1P2_DECFE_CTL0 (0x480838C0U) +#define ADRV904X_ADDR_DESER_PHY7_CORE1P2_DECFE_CTL18 (0x480838D2U) +#define ADRV904X_ADDR_DESER_PHY7_CORE1P2_DECFE_CTL28 (0x480838DCU) +#define ADRV904X_ADDR_DESER_PHY7_CORE1P2_DECFE_CTL31 (0x480838E2U) +#define ADRV904X_ADDR_DESER_PHY7_CORE1P2_DECFE_CTL41 (0x480838ECU) +#define ADRV904X_ADDR_DESER_PHY7_CORE1P2_DECFE_CTL43 (0x480838EFU) +#define ADRV904X_ADDR_DESER_PHY7_CORE1P2_DECFE_CTL45 (0x480838F2U) +#define ADRV904X_ADDR_DESER_PHY7_CORE1P2_DECFE_CTL49 (0x480838F7U) +#define ADRV904X_ADDR_DESER_PHY7_CORE1P2_DECFE_CTL54 (0x480838FCU) +#define ADRV904X_ADDR_RX0_STREAM_CTL (0x60023000U) +#define ADRV904X_ADDR_RX0_STREAM_SCRATCH0 (0x60023014U) +#define ADRV904X_ADDR_RX0_STREAM_SCRATCH1 (0x60023018U) +#define ADRV904X_ADDR_RX0_STREAM_SCRATCH2 (0x6002301CU) +#define ADRV904X_ADDR_RX0_STREAM_SCRATCH3 (0x60023020U) +#define ADRV904X_ADDR_RX0_STREAM_SCRATCH4 (0x60023024U) +#define ADRV904X_ADDR_RX0_STREAM_SCRATCH5 (0x60023028U) +#define ADRV904X_ADDR_RX0_STREAM_SCRATCH6 (0x6002302CU) +#define ADRV904X_ADDR_RX0_STREAM_SCRATCH7 (0x60023030U) +#define ADRV904X_ADDR_RX1_STREAM_CTL (0x60123000U) +#define ADRV904X_ADDR_RX1_STREAM_SCRATCH0 (0x60123014U) +#define ADRV904X_ADDR_RX1_STREAM_SCRATCH1 (0x60123018U) +#define ADRV904X_ADDR_RX1_STREAM_SCRATCH2 (0x6012301CU) +#define ADRV904X_ADDR_RX1_STREAM_SCRATCH3 (0x60123020U) +#define ADRV904X_ADDR_RX1_STREAM_SCRATCH4 (0x60123024U) +#define ADRV904X_ADDR_RX1_STREAM_SCRATCH5 (0x60123028U) +#define ADRV904X_ADDR_RX1_STREAM_SCRATCH6 (0x6012302CU) +#define ADRV904X_ADDR_RX1_STREAM_SCRATCH7 (0x60123030U) +#define ADRV904X_ADDR_RX2_STREAM_CTL (0x60223000U) +#define ADRV904X_ADDR_RX2_STREAM_SCRATCH0 (0x60223014U) +#define ADRV904X_ADDR_RX2_STREAM_SCRATCH1 (0x60223018U) +#define ADRV904X_ADDR_RX2_STREAM_SCRATCH2 (0x6022301CU) +#define ADRV904X_ADDR_RX2_STREAM_SCRATCH3 (0x60223020U) +#define ADRV904X_ADDR_RX2_STREAM_SCRATCH4 (0x60223024U) +#define ADRV904X_ADDR_RX2_STREAM_SCRATCH5 (0x60223028U) +#define ADRV904X_ADDR_RX2_STREAM_SCRATCH6 (0x6022302CU) +#define ADRV904X_ADDR_RX2_STREAM_SCRATCH7 (0x60223030U) +#define ADRV904X_ADDR_RX3_STREAM_CTL (0x60323000U) +#define ADRV904X_ADDR_RX3_STREAM_SCRATCH0 (0x60323014U) +#define ADRV904X_ADDR_RX3_STREAM_SCRATCH1 (0x60323018U) +#define ADRV904X_ADDR_RX3_STREAM_SCRATCH2 (0x6032301CU) +#define ADRV904X_ADDR_RX3_STREAM_SCRATCH3 (0x60323020U) +#define ADRV904X_ADDR_RX3_STREAM_SCRATCH4 (0x60323024U) +#define ADRV904X_ADDR_RX3_STREAM_SCRATCH5 (0x60323028U) +#define ADRV904X_ADDR_RX3_STREAM_SCRATCH6 (0x6032302CU) +#define ADRV904X_ADDR_RX3_STREAM_SCRATCH7 (0x60323030U) +#define ADRV904X_ADDR_RX4_STREAM_CTL (0x60423000U) +#define ADRV904X_ADDR_RX4_STREAM_SCRATCH0 (0x60423014U) +#define ADRV904X_ADDR_RX4_STREAM_SCRATCH1 (0x60423018U) +#define ADRV904X_ADDR_RX4_STREAM_SCRATCH2 (0x6042301CU) +#define ADRV904X_ADDR_RX4_STREAM_SCRATCH3 (0x60423020U) +#define ADRV904X_ADDR_RX4_STREAM_SCRATCH4 (0x60423024U) +#define ADRV904X_ADDR_RX4_STREAM_SCRATCH5 (0x60423028U) +#define ADRV904X_ADDR_RX4_STREAM_SCRATCH6 (0x6042302CU) +#define ADRV904X_ADDR_RX4_STREAM_SCRATCH7 (0x60423030U) +#define ADRV904X_ADDR_RX5_STREAM_CTL (0x60523000U) +#define ADRV904X_ADDR_RX5_STREAM_SCRATCH0 (0x60523014U) +#define ADRV904X_ADDR_RX5_STREAM_SCRATCH1 (0x60523018U) +#define ADRV904X_ADDR_RX5_STREAM_SCRATCH2 (0x6052301CU) +#define ADRV904X_ADDR_RX5_STREAM_SCRATCH3 (0x60523020U) +#define ADRV904X_ADDR_RX5_STREAM_SCRATCH4 (0x60523024U) +#define ADRV904X_ADDR_RX5_STREAM_SCRATCH5 (0x60523028U) +#define ADRV904X_ADDR_RX5_STREAM_SCRATCH6 (0x6052302CU) +#define ADRV904X_ADDR_RX5_STREAM_SCRATCH7 (0x60523030U) +#define ADRV904X_ADDR_RX6_STREAM_CTL (0x60623000U) +#define ADRV904X_ADDR_RX6_STREAM_SCRATCH0 (0x60623014U) +#define ADRV904X_ADDR_RX6_STREAM_SCRATCH1 (0x60623018U) +#define ADRV904X_ADDR_RX6_STREAM_SCRATCH2 (0x6062301CU) +#define ADRV904X_ADDR_RX6_STREAM_SCRATCH3 (0x60623020U) +#define ADRV904X_ADDR_RX6_STREAM_SCRATCH4 (0x60623024U) +#define ADRV904X_ADDR_RX6_STREAM_SCRATCH5 (0x60623028U) +#define ADRV904X_ADDR_RX6_STREAM_SCRATCH6 (0x6062302CU) +#define ADRV904X_ADDR_RX6_STREAM_SCRATCH7 (0x60623030U) +#define ADRV904X_ADDR_RX7_STREAM_CTL (0x60723000U) +#define ADRV904X_ADDR_RX7_STREAM_SCRATCH0 (0x60723014U) +#define ADRV904X_ADDR_RX7_STREAM_SCRATCH1 (0x60723018U) +#define ADRV904X_ADDR_RX7_STREAM_SCRATCH2 (0x6072301CU) +#define ADRV904X_ADDR_RX7_STREAM_SCRATCH3 (0x60723020U) +#define ADRV904X_ADDR_RX7_STREAM_SCRATCH4 (0x60723024U) +#define ADRV904X_ADDR_RX7_STREAM_SCRATCH5 (0x60723028U) +#define ADRV904X_ADDR_RX7_STREAM_SCRATCH6 (0x6072302CU) +#define ADRV904X_ADDR_RX7_STREAM_SCRATCH7 (0x60723030U) +#define ADRV904X_ADDR_TX0_STREAM_CTL (0x60823000U) +#define ADRV904X_ADDR_TX0_STREAM_SCRATCH0 (0x60823014U) +#define ADRV904X_ADDR_TX0_STREAM_SCRATCH1 (0x60823018U) +#define ADRV904X_ADDR_TX0_STREAM_SCRATCH2 (0x6082301CU) +#define ADRV904X_ADDR_TX0_STREAM_SCRATCH5 (0x60823028U) +#define ADRV904X_ADDR_TX0_STREAM_SCRATCH6 (0x6082302CU) +#define ADRV904X_ADDR_TX1_STREAM_CTL (0x60923000U) +#define ADRV904X_ADDR_TX1_STREAM_SCRATCH0 (0x60923014U) +#define ADRV904X_ADDR_TX1_STREAM_SCRATCH1 (0x60923018U) +#define ADRV904X_ADDR_TX1_STREAM_SCRATCH2 (0x6092301CU) +#define ADRV904X_ADDR_TX1_STREAM_SCRATCH5 (0x60923028U) +#define ADRV904X_ADDR_TX1_STREAM_SCRATCH6 (0x6092302CU) +#define ADRV904X_ADDR_TX2_STREAM_CTL (0x60A23000U) +#define ADRV904X_ADDR_TX2_STREAM_SCRATCH0 (0x60A23014U) +#define ADRV904X_ADDR_TX2_STREAM_SCRATCH1 (0x60A23018U) +#define ADRV904X_ADDR_TX2_STREAM_SCRATCH2 (0x60A2301CU) +#define ADRV904X_ADDR_TX2_STREAM_SCRATCH5 (0x60A23028U) +#define ADRV904X_ADDR_TX2_STREAM_SCRATCH6 (0x60A2302CU) +#define ADRV904X_ADDR_TX3_STREAM_CTL (0x60B23000U) +#define ADRV904X_ADDR_TX3_STREAM_SCRATCH0 (0x60B23014U) +#define ADRV904X_ADDR_TX3_STREAM_SCRATCH1 (0x60B23018U) +#define ADRV904X_ADDR_TX3_STREAM_SCRATCH2 (0x60B2301CU) +#define ADRV904X_ADDR_TX3_STREAM_SCRATCH5 (0x60B23028U) +#define ADRV904X_ADDR_TX3_STREAM_SCRATCH6 (0x60B2302CU) +#define ADRV904X_ADDR_TX4_STREAM_CTL (0x60C23000U) +#define ADRV904X_ADDR_TX4_STREAM_SCRATCH0 (0x60C23014U) +#define ADRV904X_ADDR_TX4_STREAM_SCRATCH1 (0x60C23018U) +#define ADRV904X_ADDR_TX4_STREAM_SCRATCH2 (0x60C2301CU) +#define ADRV904X_ADDR_TX4_STREAM_SCRATCH5 (0x60C23028U) +#define ADRV904X_ADDR_TX4_STREAM_SCRATCH6 (0x60C2302CU) +#define ADRV904X_ADDR_TX5_STREAM_CTL (0x60D23000U) +#define ADRV904X_ADDR_TX5_STREAM_SCRATCH0 (0x60D23014U) +#define ADRV904X_ADDR_TX5_STREAM_SCRATCH1 (0x60D23018U) +#define ADRV904X_ADDR_TX5_STREAM_SCRATCH2 (0x60D2301CU) +#define ADRV904X_ADDR_TX5_STREAM_SCRATCH5 (0x60D23028U) +#define ADRV904X_ADDR_TX5_STREAM_SCRATCH6 (0x60D2302CU) +#define ADRV904X_ADDR_TX6_STREAM_CTL (0x60E23000U) +#define ADRV904X_ADDR_TX6_STREAM_SCRATCH0 (0x60E23014U) +#define ADRV904X_ADDR_TX6_STREAM_SCRATCH1 (0x60E23018U) +#define ADRV904X_ADDR_TX6_STREAM_SCRATCH2 (0x60E2301CU) +#define ADRV904X_ADDR_TX6_STREAM_SCRATCH5 (0x60E23028U) +#define ADRV904X_ADDR_TX6_STREAM_SCRATCH6 (0x60E2302CU) +#define ADRV904X_ADDR_TX7_STREAM_CTL (0x60F23000U) +#define ADRV904X_ADDR_TX7_STREAM_SCRATCH0 (0x60F23014U) +#define ADRV904X_ADDR_TX7_STREAM_SCRATCH1 (0x60F23018U) +#define ADRV904X_ADDR_TX7_STREAM_SCRATCH2 (0x60F2301CU) +#define ADRV904X_ADDR_TX7_STREAM_SCRATCH5 (0x60F23028U) +#define ADRV904X_ADDR_TX7_STREAM_SCRATCH6 (0x60F2302CU) +#define ADRV904X_ADDR_ORX0_STREAM_CTL (0x61023000U) +#define ADRV904X_ADDR_ORX0_STREAM_SCRATCH1 (0x61023018U) +#define ADRV904X_ADDR_ORX1_STREAM_CTL (0x61123000U) +#define ADRV904X_ADDR_ORX1_STREAM_SCRATCH1 (0x61123018U) +#define ADRV904X_ADDR_RX0_GAIN_COMP_CONFIG0_DDC0 (0x60060020U) +#define ADRV904X_ADDR_RX0_DEC_PWR_CONFIG1 (0x60060084U) +#define ADRV904X_ADDR_RX0_GAIN_COMP_CONFIG0_DDC1 (0x60070020U) +#define ADRV904X_ADDR_RX1_GAIN_COMP_CONFIG0_DDC0 (0x60160020U) +#define ADRV904X_ADDR_RX1_DEC_PWR_CONFIG1 (0x60160084U) +#define ADRV904X_ADDR_RX1_GAIN_COMP_CONFIG0_DDC1 (0x60170020U) +#define ADRV904X_ADDR_RX2_GAIN_COMP_CONFIG0_DDC0 (0x60260020U) +#define ADRV904X_ADDR_RX2_DEC_PWR_CONFIG1 (0x60260084U) +#define ADRV904X_ADDR_RX2_GAIN_COMP_CONFIG0_DDC1 (0x60270020U) +#define ADRV904X_ADDR_RX3_GAIN_COMP_CONFIG0_DDC0 (0x60360020U) +#define ADRV904X_ADDR_RX3_DEC_PWR_CONFIG1 (0x60360084U) +#define ADRV904X_ADDR_RX3_GAIN_COMP_CONFIG0_DDC1 (0x60370020U) +#define ADRV904X_ADDR_RX4_GAIN_COMP_CONFIG0_DDC0 (0x60460020U) +#define ADRV904X_ADDR_RX4_DEC_PWR_CONFIG1 (0x60460084U) +#define ADRV904X_ADDR_RX4_GAIN_COMP_CONFIG0_DDC1 (0x60470020U) +#define ADRV904X_ADDR_RX5_GAIN_COMP_CONFIG0_DDC0 (0x60560020U) +#define ADRV904X_ADDR_RX5_DEC_PWR_CONFIG1 (0x60560084U) +#define ADRV904X_ADDR_RX5_GAIN_COMP_CONFIG0_DDC1 (0x60570020U) +#define ADRV904X_ADDR_RX6_GAIN_COMP_CONFIG0_DDC0 (0x60660020U) +#define ADRV904X_ADDR_RX6_DEC_PWR_CONFIG1 (0x60660084U) +#define ADRV904X_ADDR_RX6_GAIN_COMP_CONFIG0_DDC1 (0x60670020U) +#define ADRV904X_ADDR_RX7_GAIN_COMP_CONFIG0_DDC0 (0x60760020U) +#define ADRV904X_ADDR_RX7_DEC_PWR_CONFIG1 (0x60760084U) +#define ADRV904X_ADDR_RX7_GAIN_COMP_CONFIG0_DDC1 (0x60770020U) +#define ADRV904X_ADDR_RX0_ADC_REGMAP0_CTRL_FD_PD (0x600C000CU) +#define ADRV904X_ADDR_RX0_ADC_REGMAP0_CTRL_FL_PD (0x600C0020U) +#define ADRV904X_ADDR_RX1_ADC_REGMAP0_CTRL_FD_PD (0x601C000CU) +#define ADRV904X_ADDR_RX1_ADC_REGMAP0_CTRL_FL_PD (0x601C0020U) +#define ADRV904X_ADDR_RX2_ADC_REGMAP0_CTRL_FD_PD (0x602C000CU) +#define ADRV904X_ADDR_RX2_ADC_REGMAP0_CTRL_FL_PD (0x602C0020U) +#define ADRV904X_ADDR_RX3_ADC_REGMAP0_CTRL_FD_PD (0x603C000CU) +#define ADRV904X_ADDR_RX3_ADC_REGMAP0_CTRL_FL_PD (0x603C0020U) +#define ADRV904X_ADDR_RX4_ADC_REGMAP0_CTRL_FD_PD (0x604C000CU) +#define ADRV904X_ADDR_RX4_ADC_REGMAP0_CTRL_FL_PD (0x604C0020U) +#define ADRV904X_ADDR_RX5_ADC_REGMAP0_CTRL_FD_PD (0x605C000CU) +#define ADRV904X_ADDR_RX5_ADC_REGMAP0_CTRL_FL_PD (0x605C0020U) +#define ADRV904X_ADDR_RX6_ADC_REGMAP0_CTRL_FD_PD (0x606C000CU) +#define ADRV904X_ADDR_RX6_ADC_REGMAP0_CTRL_FL_PD (0x606C0020U) +#define ADRV904X_ADDR_RX7_ADC_REGMAP0_CTRL_FD_PD (0x607C000CU) +#define ADRV904X_ADDR_RX7_ADC_REGMAP0_CTRL_FL_PD (0x607C0020U) +#define ADRV904X_ADDR_RX0_INTERLEAVER_SLOT_TABLE_0 (0x600E0D00U) +#define ADRV904X_ADDR_RX0_CDDC_DELAY_0 (0x600E0D28U) +#define ADRV904X_ADDR_TX0_CPT_CONFIG (0x6083005CU) +#define ADRV904X_ADDR_TX0_CPT_STATUS (0x60830060U) +#define ADRV904X_ADDR_TX0_CPT_TIMESTAMP0 (0x60830064U) +#define ADRV904X_ADDR_TX0_CPT_TIMESTAMP1 (0x60830068U) +#define ADRV904X_ADDR_TX1_CPT_CONFIG (0x6093005CU) +#define ADRV904X_ADDR_TX1_CPT_STATUS (0x60930060U) +#define ADRV904X_ADDR_TX1_CPT_TIMESTAMP0 (0x60930064U) +#define ADRV904X_ADDR_TX1_CPT_TIMESTAMP1 (0x60930068U) +#define ADRV904X_ADDR_TX2_CPT_CONFIG (0x60A3005CU) +#define ADRV904X_ADDR_TX2_CPT_STATUS (0x60A30060U) +#define ADRV904X_ADDR_TX2_CPT_TIMESTAMP0 (0x60A30064U) +#define ADRV904X_ADDR_TX2_CPT_TIMESTAMP1 (0x60A30068U) +#define ADRV904X_ADDR_TX3_CPT_CONFIG (0x60B3005CU) +#define ADRV904X_ADDR_TX3_CPT_STATUS (0x60B30060U) +#define ADRV904X_ADDR_TX3_CPT_TIMESTAMP0 (0x60B30064U) +#define ADRV904X_ADDR_TX3_CPT_TIMESTAMP1 (0x60B30068U) +#define ADRV904X_ADDR_TX4_CPT_CONFIG (0x60C3005CU) +#define ADRV904X_ADDR_TX4_CPT_STATUS (0x60C30060U) +#define ADRV904X_ADDR_TX4_CPT_TIMESTAMP0 (0x60C30064U) +#define ADRV904X_ADDR_TX4_CPT_TIMESTAMP1 (0x60C30068U) +#define ADRV904X_ADDR_TX5_CPT_CONFIG (0x60D3005CU) +#define ADRV904X_ADDR_TX5_CPT_STATUS (0x60D30060U) +#define ADRV904X_ADDR_TX5_CPT_TIMESTAMP0 (0x60D30064U) +#define ADRV904X_ADDR_TX5_CPT_TIMESTAMP1 (0x60D30068U) +#define ADRV904X_ADDR_TX6_CPT_CONFIG (0x60E3005CU) +#define ADRV904X_ADDR_TX6_CPT_STATUS (0x60E30060U) +#define ADRV904X_ADDR_TX6_CPT_TIMESTAMP0 (0x60E30064U) +#define ADRV904X_ADDR_TX6_CPT_TIMESTAMP1 (0x60E30068U) +#define ADRV904X_ADDR_TX7_CPT_CONFIG (0x60F3005CU) +#define ADRV904X_ADDR_TX7_CPT_STATUS (0x60F30060U) +#define ADRV904X_ADDR_TX7_CPT_TIMESTAMP0 (0x60F30064U) +#define ADRV904X_ADDR_TX7_CPT_TIMESTAMP1 (0x60F30068U) +#define ADRV904X_ADDR_TX0_DAC_PWD_DOWN_I (0x6088003EU) +#define ADRV904X_ADDR_TX1_DAC_PWD_DOWN_I (0x6098003EU) +#define ADRV904X_ADDR_TX2_DAC_PWD_DOWN_I (0x60A8003EU) +#define ADRV904X_ADDR_TX3_DAC_PWD_DOWN_I (0x60B8003EU) +#define ADRV904X_ADDR_TX4_DAC_PWD_DOWN_I (0x60C8003EU) +#define ADRV904X_ADDR_TX5_DAC_PWD_DOWN_I (0x60D8003EU) +#define ADRV904X_ADDR_TX6_DAC_PWD_DOWN_I (0x60E8003EU) +#define ADRV904X_ADDR_TX7_DAC_PWD_DOWN_I (0x60F8003EU) +#define ADRV904X_ADDR_TX0_LB_ADC_WEST_TRM_PDN_CTRL (0x60896446U) +#define ADRV904X_ADDR_TX1_LB_ADC_WEST_TRM_PDN_CTRL (0x60996446U) +#define ADRV904X_ADDR_TX2_LB_ADC_WEST_TRM_PDN_CTRL (0x60A96446U) +#define ADRV904X_ADDR_TX3_LB_ADC_WEST_TRM_PDN_CTRL (0x60B96446U) +#define ADRV904X_ADDR_TX4_LB_ADC_WEST_TRM_PDN_CTRL (0x60C96446U) +#define ADRV904X_ADDR_TX5_LB_ADC_WEST_TRM_PDN_CTRL (0x60D96446U) +#define ADRV904X_ADDR_TX6_LB_ADC_WEST_TRM_PDN_CTRL (0x60E96446U) +#define ADRV904X_ADDR_TX7_LB_ADC_WEST_TRM_PDN_CTRL (0x60F96446U) +#define ADRV904X_ADDR_TX0_LB_ADC_EAST_TRM_PDN_CTRL (0x608968FDU) +#define ADRV904X_ADDR_TX1_LB_ADC_EAST_TRM_PDN_CTRL (0x609968FDU) +#define ADRV904X_ADDR_TX2_LB_ADC_EAST_TRM_PDN_CTRL (0x60A968FDU) +#define ADRV904X_ADDR_TX3_LB_ADC_EAST_TRM_PDN_CTRL (0x60B968FDU) +#define ADRV904X_ADDR_TX4_LB_ADC_EAST_TRM_PDN_CTRL (0x60C968FDU) +#define ADRV904X_ADDR_TX5_LB_ADC_EAST_TRM_PDN_CTRL (0x60D968FDU) +#define ADRV904X_ADDR_TX6_LB_ADC_EAST_TRM_PDN_CTRL (0x60E968FDU) +#define ADRV904X_ADDR_TX7_LB_ADC_EAST_TRM_PDN_CTRL (0x60F968FDU) +#define ADRV904X_ADDR_TX0_DEINTERLEAVER_SLOT_TABLE_0 (0x608B0D20U) +#define ADRV904X_ADDR_TX0_CDDC_DELAY_0 (0x608B0D48U) +#define ADRV904X_ADDR_ORX0_CPT_CONFIG (0x610500D0U) +#define ADRV904X_ADDR_ORX0_CPT_STATUS0 (0x610500D4U) +#define ADRV904X_ADDR_ORX1_CPT_CONFIG (0x611500D0U) +#define ADRV904X_ADDR_ORX1_CPT_STATUS0 (0x611500D4U) + +#include + +typedef struct adrv904x_CpuMemDump +{ + uint32_t cpuMemAddr; + uint32_t cpuMemSize; + uint8_t cpuMemWidth; + uint8_t cpuMemEndianness; +} adrv904x_CpuMemDump_t; +typedef struct adrv904x_CpuRamMemDump +{ + uint32_t cpuMemAddr; + uint32_t cpuMemSize; + uint16_t ramId; + uint8_t cpuMemEndianness; +} adrv904x_CpuRamMemDump_t; + +extern const adrv904x_CpuRamMemDump_t adrv904x_CpuRamMemDumpTable[24]; +extern const adrv904x_CpuMemDump_t adrv904x_TelemetryMemDumpTable[1]; +extern const adrv904x_CpuMemDump_t adrv904x_CpuMemDumpTable[2855]; +extern const adrv904x_CpuRamMemDump_t adrv904x_DfeMemDumpTable[5]; + +typedef struct adrv904x_EtmDumpValues +{ + uint16_t format; + uint32_t baseAddr; + uint8_t dataSize; + uint8_t configSize; +} adrv904x_EtmDumpValues_t; + +extern const adrv904x_EtmDumpValues_t adrv904x_DfeEtmMemDumpTable[4]; +#endif diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_rx.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_rx.h new file mode 100644 index 00000000000..a76974a11dc --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_rx.h @@ -0,0 +1,1692 @@ +/** + * Copyright 2015 - 2023 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adrv904x_rx.h + * \brief Contains ADRV904X Rx related private function prototypes for + * adrv904x_rx.c which helps adi_adrv904x_rx.c + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADRV904X_RX_H_ +#define _ADRV904X_RX_H_ + +#include "../../private/bf/adrv904x_bf_rx_dig_types.h" +#include "../../private/bf/adrv904x_bf_rx_funcs_types.h" +#include "../../private/bf/adrv904x_bf_rx_ddc_types.h" +#include "../../private/bf/adrv904x_bf_orx_dig_types.h" +#include "../../private/bf/adrv904x_bf_tdr_dpath_top.h" +#include "../../private/bf/adrv904x_bf_actrl_orx_west_regmap.h" +#include "adrv904x_reg_addr_macros.h" +#include "adrv904x_rx_types.h" + + +#include "adi_adrv904x_error.h" +#include "adi_adrv904x_rx.h" + +#include "../../private/bf/adrv904x_bf_cddc_funcs.h" +#include "../../private/bf/adrv904x_bf_cddc_funcs_types.h" +#include "../../private/bf/adrv904x_bf_cddc_hb_dpath.h" + +/** + * \brief Set Rx Carrier Dec Power Meter TDD Mode by Rx Channel + * + * Have to split out tddModeEnable bitfield from rest of Dec Power config + * because this bitfield is per Rx Channel, and not per Carrier. + * When Dec Power Meter is in TDD mode, measurements are automatically paused + * when RxOn is low. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[in] rxChannelMask Mask to select Rx Channels to be affected with this function call + * \param[in] rxChannelTddMode Mask to set/clear TDD Mode for selected Rx Channels + * + * \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierDecPowerTddModeSet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const uint32_t rxChannelTddMode); + +/** + * \brief Readback Rx Carrier Dec Power Meter TDD Mode for a Rx Channel + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[in] rxChannelMask Mask to select a Rx Channel to be readback + * \param[out] rxChannelTddMode Pointer to location to store TDD Mode readback result + * + * \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierDecPowerTddModeGet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + uint32_t * const rxChannelTddMode); + +/** +* \brief Performs range check on Rx Dec power configuration. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] decPowerCfg Decimated power block configured to be range checked + +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDecPowerCfgRangeCheck(adi_adrv904x_Device_t* const device, + const adrv904x_RxCarrierDecPowerCfg_t* const decPowerCfg); + +/** + * \brief Configure Rx Carrier Dec Power Meter + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[in] rxCarrierDecPowerCfg array of structures of type adrv904x_RxCarrierDecPowerCfg_t which will configure one or more channels/carriers + * \param[in] numCfgs number of configurations passed in the array + * + * \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierDecPowerCfgSet(adi_adrv904x_Device_t * const device, + adrv904x_RxCarrierDecPowerCfg_t rxCarrierDecPowerCfg[], + const uint32_t numCfgs); + +/** + * \brief Readback Rx Carrier Dec Power Meter configuration + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[in] rxCarrierMask Rx Carrier selection to read RSSI configuration. + * carrierMask takes single value from adi_adrv904x_RxCarrier_e, rxChannelMask allows only single value from adi_adrv904x_RxChannels_e. + * \param[out] cfg Rx Carrier Dec Power Meter configuration of selected Rx Carrier + * + * \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierDecPowerCfgGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxCarrierMask_t * const rxCarrierMask, + adrv904x_RxCarrierDecPowerCfg_t * const cfg); + +/** + * \brief Pause/Resume Rx Carrier Dec Power Meters + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[in] rxCarrierMask Mask to select Rx Carrier RSSIs to be affected with this function call + * \param[in] rxCarrierPause Mask to pause/resume selected Rx Carrier RSSIs + * + * \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierDecPowerPause(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxCarrierMask_t * const rxCarrierMask, + const uint32_t rxCarrierPause); + +/** + * \brief Readback the decimated power measurement for selected Rx Carrier. + * Power readback value is an unsigned 8 bit value with 0.25dB resolution. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[in] rxCarrierMask Rx Carrier selection from which to read decimated power measurement. + * carrierMask takes single value from adi_adrv904x_RxCarrier_e, rxChannelMask allows only single value from adi_adrv904x_RxChannels_e. + * \param[out] avgPower Pointer to average power measurement readback value + * + * \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierDecPowerGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxCarrierMask_t * const rxCarrierMask, + uint8_t * const avgPower); + +/** + * \brief Readback the decimated power measurement for selected Rx Carrier and + * largest simultaneously the peak power seen in the same measurement window. + * Both power readback values are unsigned 8 bit values with 0.25dB resolution. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[in] rxCarrierMask Rx Carrier selection from which to read decimated power measurement + * carrierMask takes single value from adi_adrv904x_RxCarrier_e, rxChannelMask allows only single value from adi_adrv904x_RxChannels_e. + * \param[out] avgPower Pointer to average power measurement readback value + * \param[out] peakPower Pointer to peak power measurement readback value + * + * \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierDecPowerAndPeakGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxCarrierMask_t * const rxCarrierMask, + uint8_t * const avgPower, + uint8_t * const peakPower); + +/** +* \brief Sets RX Data Formatter configuration. +* +* The slicer/formatter work in conjunction with the gain compensation module. +* The digital gain compensation module compensates for the front end attenuation +* thereby increasing the bit resolution of the Rx data word. The slicer is then +* applied to attenuate the data such that it can fit into the JESD data path resolution. +* +* This function will set the data format for the receive data on JESD link. This function +* also configures the formatter / slicer if any of the integer slicer modes are required +* to be configured. In addition to the above, any selected internal slicer GPIOs are acquired +* and configured by this function. +* +* When using integer formatting, the number of slicer bits as well as their position +* in the data word are selectable. +* +* The user can select the data format mode from one of the following +* +* rxDataFormat[i]->formatSelect | Description +* ---------------------------------------------|-------------------------------------- +* ADI_ADRV904X_GAIN_COMPENSATION_DISABLED | Disables gain compensation and Rx data formatting +* | +* ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_NOGPIO | Setup Rx data format to an integer format such +* | that the gain compensation data(slicer) is embedded +* | in the I and Q data. It is possible to embed 2/3/4 +* | slicer bits providing a dynamic gain compensation range +* | of 50dB. Applicable for 16-bit / 12-bit resolution +* | +* ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER | Setup Rx data format to an integer format such +* | that the gain compensation data(slicer) is encoded +* | in the GPIO output from ADRV904X. It is possible to encode 2/3/4 +* | slicer bits providing a dynamic gain compensation range +* | of 50dB. Applicable for 16-bit / 12-bit resolution +* | +* ADI_ADRV904X_EMBED_OVERLOAD_MONITOR_DATA | Setup overload indicators to be embedded in the 16 bit +* | 2s complement data. The overload indicators can be embedded +* | at LSB and/or LSB+1 positions of I and Q samples. +* ADI_ADRV904X_GAIN_WITH_FLOATING_POINT | -- MODE NOT SUPPORTED -- +* ADI_ADRV904X_GAIN_WITH_EXTERNAL_SLICER | -- MODE NOT SUPPORTED -- +* +* The ADRV904X data formatting should be used in conjunction with the +* gain compensation feature. +* +* Please note that for ORx channels ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_NOGPIO is the only valid mode. +* +* Please note that while disabling gain compensation a valid data format represented by +* rxDataFormat[i].integerConfigSettings.intSampleResolution has to be set to a valid mode. Please refer to enum +* adi_adrv904x_RxIntSampleResolution_e for valid intSampleResolution modes +* +* It has to be ensured that the ADRV904X JESD Framer Np for the selected Rx channel is at least equal to +* integer sample resolution size. +* +* In a 2 bit embedded slicer mode (ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_NOGPIO), slicer position bit 0 +* is embedded in Q data from JESD and slicer position bit 1 is embedded in I data from JESD. +* +* In a 4 bit embedded slicer mode (ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_NOGPIO), slicer position bit 0 +* and bit1 are embedded in Q data from JESD and slicer position bit 2 and bit 3 are embedded in I data from JESD. +* +* The slicer position can also be read back via adi_adrv904x_RxSlicerPositionGet() API +* +* The slicer position in the internal slicer mode (ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER) can be observed on +* any GPIO[23:0]. +* +* Please note that only the least significant 3/4 bits of the slicer control word is output on the GPIOs. +* +* User needs to enable fast recovery and configure AGC block with adi_adrv904x_AgcCfgSet API before using +* HB2 int0/int1 threshold and counter exceeded embedded overload flags +* +* \pre Slicer/Formatter operation requires that the device be loaded with a gain table that compensates +* for the analog front end attenuation applied. +* \pre JESD datawidth should match the data width for the requested Rx Format. +* \pre JESD initialization should be complete. +* \pre User must ensure that selected GPIOs are not already configured for another +* feature when configuring slicer formats involving GPIOS. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] rxDataFormat Pointer to the Rx data format configuration structure +* \param[in] arraySize Size of rxDataFormat array representing no. of configs +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatSet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxDataFormatRt_t rxDataFormat[], + const uint32_t arraySize); + +#ifndef CLIENT_IGNORE +/** +* \brief Formats gain table structure input into a format expected by ARM DMA +* +* Format Gain Table Data as follows : +* No. of Bytes per Gain Table Entry = 8 +* Addr 8 x gainIndex : {13'b0 , rx_fe_gain[7:0], dig_gain[10:0]} +* Addr 8 x gainIndex + 4 : {14'b0, ext_control[1:0], phase_offset[15:0]} +* +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] gainTablePtr Input gain table +* \param[out] formattedGainTablePtr memory to store formatted gain table data +* \param[in] numGainIndicesInTable number of gain table entries +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxGainTableFormat(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxGainTableRow_t gainTablePtr[], + uint8_t formattedGainTablePtr[], + const uint16_t numGainIndicesInTable); + +/** +* \brief Calculates parameters required to read Rx Gain Table from ADRV904X SRAM +* +* This function calculates the number of gain indices to read and the SRAM base +* address for the read operation given the maximum read size and gain index offset +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] rxChannel is the channel for which gain table read is requested +* \param[in] maxReadGainIndices is the maximum no. of gain indices allowed to be read +* \param[in] gainIndexOffset is the off-set index from maximum gain index which is +* the starting gain index to read from +* \param[out] numGainIndicesToRead output from this function which provides the no. of gain table +* row entry reads to be performed +* \param[out] baseAddr is the starting SRAM address for read operation (output) +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxGainTableReadParamsCompute(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + const uint32_t maxReadGainIndices, + const uint8_t gainIndexOffset, + uint16_t* const numGainIndicesToRead, + uint32_t* const baseAddr); + +/** +* \brief Parses gain table in ARM DMA data format into a gain table row structure +* +* Format Gain Table Data as follows : +* No. of Bytes per Gain Table Entry = 8 +* cpuDmaDataGainIndex[8 x gainIndex] : {13'b0 , rx_fe_gain[7:0], dig_gain[10:0]} +* cpuDmaDataGainIndex[8 x gainIndex + 4] : {14'b0, ext_control[1:0], phase_offset[15:0]} +* +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[out] gainTablePtr pointer to gain table row entry structure where parsed data is stored +* \param[in] cpuDmaDataGainTablePtr memory containing data from ARM DMA +* \param[in] numGainIndicesInTable number of gain table entries +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxGainTableParse(adi_adrv904x_Device_t* const device, + adi_adrv904x_RxGainTableRow_t gainTablePtr[], + const uint8_t cpuDmaDataGainTablePtr[], + const uint16_t numGainIndicesInTable); + + +/** +* \brief Performs range check on rx gain index setting. +* +* \pre This function is called automatically as part of adi_adrv904x_RxGainSet() +* function if ADI_ADRV904X_RX_RANGE_CHECK > 0. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] rxGain is the channelized gain setting parameter +* \param[in] arraySize Size of rxGain array representing no. of configs. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxGainSetRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxGain_t rxGain[], + const uint32_t arraySize); + + +/** +* \brief Performs range check on AGC/MGC gain get API. +* +* \pre This function is called automatically as part of AGC/MGC gain get API. +* function if ADI_ADRV904X_RX_RANGE_CHECK > 0. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] rxChannel Channel selection to read back gain index for (Valid Rx0-Rx7 only) +* \param[out] rxGain Pointer to the specified channel gain index value +* which will be updated by this function +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxGainGetRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_RxGain_t * const rxGain); + +/** +* \brief Performs range check on Dec power configuration. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] decPowerCfg Decimated power block configured to be range checked + +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_DecPowerCfgRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxDecimatedPowerCfg_t* const decPowerCfg); + +/** +* \brief Performs range check on Orx Dec power configuration. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] decPowerCfg Decimated power block configured to be range checked + +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDecPowerCfgRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_ORxDecimatedPowerCfg_t* const decPowerCfg); + + +typedef adrv904x_BfRxDigChanAddr_e adrv904x_BfRxChanAddr_e; +#define ADRV904X_BF_RX_CH0 ADRV904X_BF_SLICE_RX_0__RX_DIG +#define ADRV904X_BF_RX_CH1 ADRV904X_BF_SLICE_RX_1__RX_DIG +#define ADRV904X_BF_RX_CH2 ADRV904X_BF_SLICE_RX_2__RX_DIG +#define ADRV904X_BF_RX_CH3 ADRV904X_BF_SLICE_RX_3__RX_DIG +#define ADRV904X_BF_RX_CH4 ADRV904X_BF_SLICE_RX_4__RX_DIG +#define ADRV904X_BF_RX_CH5 ADRV904X_BF_SLICE_RX_5__RX_DIG +#define ADRV904X_BF_RX_CH6 ADRV904X_BF_SLICE_RX_6__RX_DIG +#define ADRV904X_BF_RX_CH7 ADRV904X_BF_SLICE_RX_7__RX_DIG + +/** +* \brief Look up the Rx digital bitfield address given a Rx channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] rxChannel Channel selection to read back gain index for (Valid Rx0-Rx7 only) +* \param[out] rxChannelBitfieldAddr Rx digital channel bitfield address which will be updated by this function +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adrv904x_BfRxChanAddr_e* const rxChannelBitfieldAddr); + +/** +* \brief Look up the ORx digital bitfield address given a Rx channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] rxChannel Channel selection to read back gain index for (Valid Rx0-Rx7 only) +* \param[out] orxChannelBitfieldAddr ORx digital channel bitfield address which will be updated by this function +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adrv904x_BfOrxDigChanAddr_e* const orxChannelBitfieldAddr); + +/** +* \brief Look up the Rx analog bitfield address given a Rx Channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] rxChannel Channel selection to read back gain index for (Valid Rx0-Rx7 only) +* \param[out] rxAnalogChannelIBitfieldAddr Rx analog channel I bitfield address which will be updated by this function +* \param[out] rxAnalogChannelQBitfieldAddr Rx analog channel Q bitfield address which will be updated by this function +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxAnalogBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adrv904x_BfTdrDpathTopChanAddr_e* const rxAnalogChannelIBitfieldAddr, + adrv904x_BfTdrDpathTopChanAddr_e* const rxAnalogChannelQBitfieldAddr); + +/** +* \brief Look up the Rx function bitfield address given a Rx Channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] rxChannel Channel selection to read back gain index for (Valid Rx0-Rx7 only) +* \param[out] rxFuncsChannelBitfieldAddr Rx function channel bitfield address which will be updated by this function +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncsBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adrv904x_BfRxFuncsChanAddr_e* const rxFuncsChannelBitfieldAddr); + + +/** +* \brief Look up the Rx DDC bitfield address given a Rx Channel and Band +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] rxChannel Channel selection +* \param[in] ddcBand Band selection +* \param[out] rxDdcBitfieldAddr Rx DDC channel bitfield address which will be updated by this function +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdcBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + const adi_adrv904x_RxDdcs_e ddcBand, + adrv904x_BfRxDdcChanAddr_e* const rxDdcBitfieldAddr); + +/** +* \brief Helper function for adrv904x_RxDataFormatSet. Validates data in configuration table. +* +* The ADRV904X data formatting should be used in conjunction with the +* gain compensation feature. This function is automatically called as +* part of adrv904x_RxDataFormatSet() if ADI_ADRV904X_RX_RANGE_CHECK +* is set to 1 +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the device settings structure +* \param[in] rxDataFormat Pointer to the Rx data format configuration structure +* \param[in] arraySize Size of rxDataFormat array representing no. of configs +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatSetRangeCheck(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxDataFormatRt_t rxDataFormat[], + const uint32_t arraySize); + +/** +* \brief Helper function for adrv904x_CddcDataFormatSet. Validates data in configuration table. +* +* The ADRV904X data formatting should be used in conjunction with the +* gain compensation feature. This function is automatically called as +* part of adrv904x_CddcDataFormatSet() if ADI_ADRV904X_RX_RANGE_CHECK +* is set to 1 +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the device settings structure +* \param[in] cddcDataFormat Pointer to the Rx data format configuration structure +* \param[in] arraySize Size of rxDataFormat array representing no. of configs +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcDataFormatSetRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CddcDataFormatRt_t cddcDataFormat[], + const uint32_t arraySize); + +/** +* \brief Helper function for adrv904x_RxDataFormatSetFloatingPointRangeCheck to validate configuration of +* floating point formatter +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] floatingPointConfig Structure pointer to floating point formatter settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatSetFloatingPointRangeCheck(adi_adrv904x_Device_t * const device, + const adi_adrv904x_FloatingPointConfigSettings_t * const floatingPointConfig); + + +/** +* \brief Helper function for adrv904x_CddcDataFormatSetFloatingPointRangeCheck to validate configuration of +* floating point formatter +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] floatingPointConfig Structure pointer to floating point formatter settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcDataFormatSetFloatingPointRangeCheck(adi_adrv904x_Device_t * const device, + const adi_adrv904x_CddcFloatingPointConfigSettings_t * const floatingPointConfig); + +/** +* \brief Performs range check on Rx integer and slicer format settings +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannelMask Channels which need to be configured for one of the integer formats +* \param[in] formatSelect Target format mode +* \param[in] integerConfigSettings Structure pointer to integer formatter configuration settings +* \param[in] slicerConfigSettings Structure pointer to slicer configuration settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatSetIntegerRangeCheck(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const adi_adrv904x_RxDataFormatModes_e formatSelect, + const adi_adrv904x_IntegerConfigSettings_t * const integerConfigSettings, + const adi_adrv904x_SlicerConfigSettings_t * const slicerConfigSettings); + +/** +* \brief Helper function for adrv904x_RxDataFormatSetRangeCheck to validate configuration of +* embedded overload monitor formatter +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] embOvldConfigSettings Structure pointer to embedded overload monitor formatter settings +* \param[in] intSampleResolution Integer sample resolution of the JESD Rx data samples +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatSetEmbOvldMonitorRangeCheck(adi_adrv904x_Device_t * const device, + const adi_adrv904x_EmbOverloadMonitorConfigSettings_t * const embOvldConfigSettings, + const adi_adrv904x_RxIntSampleResolution_e intSampleResolution); + +/** +* \brief Helper function for adrv904x_CddcDataFormatSetRangeCheck to validate configuration of +* embedded overload monitor formatter +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] embOvldConfigSettings Structure pointer to embedded overload monitor formatter settings +* \param[in] intSampleResolution Integer sample resolution of the JESD Rx data samples +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcDataFormatSetEmbOvldMonitorRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CddcEmbOverloadMonitorConfigSettings_t* const cddcEmbOvldConfigSettings, + const adi_adrv904x_RxIntSampleResolution_e intSampleResolution); + +/** +* \brief Disables gain compensation for the requested Rx Channels +* +* Please note that even though gain compensation is disabled, +* the embedded slicer bits have to be explicitly set to 0 failing +* which the received data will contain slicer bits if it was previously +* enabled. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannelMask specifies the channels for which gain compensation is to be disabled +* \param[in] intDataFormat integer data format on disabling gain compensation (2s complement vs signed) +* \param[in] intDataResolution integer data resolution (12/16) on disabling gain compensation +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatGainCompDisable(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const uint8_t intDataFormat, + const uint8_t intDataResolution); + +/** +* \brief Sets gain compensation for external LNA gain enable +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannelMask channels which need to be configured +* \param[in] externalLnaGain enable(1) or disable(0) gain compensation to consider LNA gain +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxGainCompExtLnaSet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const uint8_t externalLnaGain); + +/** +* \brief Sets gain compensation for temperature enable +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannelMask channels which need to be configured +* \param[in] tempCompensationEnable enable(1) or disable(0) gain compensation to consider temperature +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxGainCompTempEnableSet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const uint8_t tempCompensationEnable); + +/** +* \brief Sets the Rx Data format to floating point format. +* +* Following settings are configured through this function +* -> Floating point data format ({Sign, Exp, Significand} or {Sign, Significand, Exp}) +* -> Floating point round mode +* -> No. of exponent bits +* -> Attenuation step size for the floating point config +* -> Leading one for floating point and NaN encoding +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannelMask Rx channels for which floating point format has to be configured +* \param[in] floatingPointConfig Structure pointer to floating point formatter settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatFloatingPointSet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const adi_adrv904x_FloatingPointConfigSettings_t * const floatingPointConfig); + +/** +* \brief Sets the CDDC Data format to floating point format. +* +* Following settings are configured through this function +* -> Floating point data format ({Sign, Exp, Significand} or {Sign, Significand, Exp}) +* -> Floating point round mode +* -> No. of exponent bits +* -> Attenuation step size for the floating point config +* -> Leading one for floating point and NaN encoding +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannelMask Rx channels for which floating point format has to be configured +* \param[in] floatingPointConfig Structure pointer to floating point formatter settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcDataFormatFloatingPointSet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const adi_adrv904x_CddcFloatingPointConfigSettings_t * const floatingPointConfig); + +/** +* \brief Sets the Rx Data format to integer and configures slicer settings. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannelMask channels which need to be configured with integer settings requested +* \param[in] formatSelect Integer formatter mode select +* \param[in] integerConfigSettings contains the integer formatter settings for Rx channels requested +* \param[in] slicerConfigSettings contains the integer formatter settings for Rx channels requested +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatIntegerSet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const adi_adrv904x_RxDataFormatModes_e formatSelect, + const adi_adrv904x_IntegerConfigSettings_t * const integerConfigSettings, + const adi_adrv904x_SlicerConfigSettings_t * const slicerConfigSettings); + +/** +* \brief Sets the CDDC Data format to integer and configures slicer settings. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannelMask channels which need to be configured with integer settings requested +* \param[in] formatSelect Integer formatter mode select +* \param[in] cddcIntegerConfigSettings contains the integer formatter settings for Rx channels requested +* \param[in] cddcSlicerConfigSettings contains the integer formatter settings for Rx channels requested +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcDataFormatIntegerSet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const adi_adrv904x_CddcDataFormatModes_e formatSelect, + const adi_adrv904x_CddcIntegerConfigSettings_t * const cddcIntegerConfigSettings, + const adi_adrv904x_CddcSlicerConfigSettings_t * const cddcSlicerConfigSettings); + +/** +* \brief Sets the CDDC Data format to integer and configures slicer settings. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannelMask channels which need to be configured with integer settings requested +* \param[in] cddcSlicerConfigSettings contains the integer formatter settings for Rx channels requested +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcDataFormatSlicerSet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const adi_adrv904x_CddcSlicerConfigSettings_t * const cddcSlicerConfigSettings); + +/** +* \brief Sets the Rx Data format to embedded overload indicator format and configures the embedded overload monitor settings. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannelMask Rx channels for which embedded overload indicator format has to be configured +* \param[in] embOvldConfigSettings Structure pointer to embedded overload monitor formatter settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatEmbOvldMonitorSet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const adi_adrv904x_EmbOverloadMonitorConfigSettings_t * const embOvldConfigSettings); + +/** +* \brief Sets the CDDC Data format to embedded overload indicator format and configures the embedded overload monitor settings. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannelMask Rx channels for which embedded overload indicator format has to be configured +* \param[in] embOvldConfigSettings Structure pointer to embedded overload monitor formatter settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcDataFormatEmbOvldMonitorSet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const adi_adrv904x_CddcEmbOverloadMonitorConfigSettings_t * const embOvldConfigSettings, + const adi_adrv904x_CddcSlicerConfigSettings_t * const cddcSlicerConfigSettings); + +/** +* \brief Sets the Rx Data format embedded overload bits +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] chanIdx Rx channels selection +* \param[in] lsbIData I data selection +* \param[in] lsbIPlusData I+1 data selection +* \param[in] lsbQData Q data selection +* \param[in] lsbQPlusData Q+1 data selection +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxEmbeddedOverloadBitsSet(adi_adrv904x_Device_t * const device, + uint8_t chanIdx, + uint8_t lsbIData, + uint8_t lsbIPlusData, + uint8_t lsbQData, + uint8_t lsbQPlusData); + +/** +* \brief Sets the CDDC Data format embedded overload bits +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] chanIdx Rx channels selection +* \param[in] lsbIData I data selection +* \param[in] lsbIPlusData I+1 data selection +* \param[in] lsbQData Q data selection +* \param[in] lsbQPlusData Q+1 data selection +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcEmbeddedOverloadBitsSet(adi_adrv904x_Device_t * const device, + uint8_t chanIdx, + uint8_t lsbIData, + uint8_t lsbIPlusData, + uint8_t lsbQData, + uint8_t lsbQPlusData); + +/** +* \brief Resolves the integer data resolution and format for integer formatter. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] integerConfigSettings Structure pointer to integer formatter settings +* \param[out] intDataResolution pointer updated with integer resolution. 12bit = 0, 16bit = 1. +* \param[out] intDataFormat pointer updated integer data format. 2's complement = 0, signed magnitude = 1. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxIntSampleResFormatResolve(adi_adrv904x_Device_t * const device, + const adi_adrv904x_IntegerConfigSettings_t * const integerConfigSettings, + uint8_t * const intDataResolution, + uint8_t * const intDataFormat); + +/** +* \brief Resolves the integer data resolution and format for integer formatter. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] cddcIntegerConfigSettings Structure pointer to integer formatter settings +* \param[out] intDataResolution pointer updated with integer resolution. 12bit = 0, 16bit = 1. +* \param[out] intDataFormat pointer updated integer data format. 2's complement = 0, signed magnitude = 1. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcIntSampleResFormatResolve(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CddcIntegerConfigSettings_t* const cddcIntegerConfigSettings, + uint8_t* const intDataResolution, + uint8_t* const intDataFormat); + +/** +* \brief Deallocates GPIOs for internal slicer ctrl observation functionality and disconnects them. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannel Receiver channel for which internal slicer ctrl GPIOs are to be disconnected +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxInternalSlicerGpioDisable(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel); + +/** +* \brief Allocates GPIOs for internal slicer ctrl observation functionality and routes the signals to +* selected GPIOs. Internal slicer ctrl GPIO outputs can be mapped to any GPIO[23:0]. +* +* It has to be noted that no two channels can share the same internal slicer ctrl GPIOs. Furthermore +* it is possible to observe Rx slicer positions only. There are no ORx slicers. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannel Receiver channel for which internal slicer ctrl GPIO observation is required +* \param[in] intSlicerFormatSel Internal slicer 3pin / 4 pin mode select +* \param[in] slicerConfigSettings Slicer Config settings that contain Gpio Selections for Internal Slicer Word outputs +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxInternalSlicerGpioEnable(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + const adi_adrv904x_RxDataFormatModes_e intSlicerFormatSel, + const adi_adrv904x_SlicerConfigSettings_t* const slicerConfigSettings); + +/** +* \brief Resolves the embedded slicer position and no. of embedded slicer bits for integer formatter. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] formatSelect Requested integer format +* \param[in] intEmbeddedBits Selected embedded bits mode +* \param[out] intEmbedSlicer Updated with embedded slicer enable(1) or disable(0) +* \param[out] intEmbedSlicerPos Updated with embedded slicer position. MSB = 0, LSB = 1 +* \param[out] intEmbedSlicerNumber Updated with number of embedded slicer bits. 2 bits = 0, 1 bit = 1 +* \param[out] staticSlicer3bitModeEn Updated with the enable value for a 3bit slicer. Enable = 1, Disable = 0 +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxIntEmbSlicerConfigResolve(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxDataFormatModes_e formatSelect, + const adi_adrv904x_RxSlicerEmbeddedBits_e intEmbeddedBits, + const adi_adrv904x_RxIntParity_e parity, + uint8_t * const intEmbedSlicer, + uint8_t * const intEmbedSlicerPos, + uint8_t * const intEmbedSlicerNumber, + uint8_t * const staticSlicer3bitModeEn); + +/** +* \brief Resolves the embedded slicer position and no. of embedded slicer bits for integer formatter. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] formatSelect Requested integer format +* \param[in] intEmbeddedBits Selected embedded bits mode +* \param[out] intEmbedSlicer Updated with embedded slicer enable(1) or disable(0) +* \param[out] intEmbedSlicerPos Updated with embedded slicer position. MSB = 0, LSB = 1 +* \param[out] intEmbedSlicerNumber Updated with number of embedded slicer bits. 2 bits = 0, 1 bit = 1 +* \param[out] staticSlicer3bitModeEn Updated with the enable value for a 3bit slicer. Enable = 1, Disable = 0 +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcIntEmbSlicerConfigResolve(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CddcDataFormatModes_e formatSelect, + const adi_adrv904x_RxSlicerEmbeddedBits_e intEmbeddedBits, + const adi_adrv904x_RxIntParity_e parity, + uint8_t* const intEmbedSlicer, + uint8_t* const intEmbedSlicerPos, + uint8_t* const intEmbedSlicerNumber, + uint8_t* const staticSlicer3bitModeEn); + +/** +* \brief Resolves the integer parity support for integer formatter. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] integerConfigSettings Structure containing integer formatter settings +* \param[out] intParitySupport Updated with integer parity support. Enabled = 1, Disabled = 0. +* \param[out] intEvenParity Updated with even/odd parity. Even = 0, Odd = 1. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxIntParitySupportResolve(adi_adrv904x_Device_t * const device, + const adi_adrv904x_IntegerConfigSettings_t * const integerConfigSettings, + uint8_t * const intParitySupport, + uint8_t * const intEvenParity); + +/** +* \brief Resolves the integer parity support for integer formatter. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] integerConfigSettings Structure containing integer formatter settings +* \param[out] intParitySupport Updated with integer parity support. Enabled = 1, Disabled = 0. +* \param[out] intEvenParity Updated with even/odd parity. Even = 0, Odd = 1. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcIntParitySupportResolve(adi_adrv904x_Device_t * const device, + const adi_adrv904x_CddcIntegerConfigSettings_t * const cddcIntegerConfigSettings, + uint8_t * const intParitySupport, + uint8_t * const intEvenParity); + +/** +* \brief Returns the Rx Data formatter mode currently configured +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannel Receiver channel for which Rx data format select read back is requested +* \param[out] rxDataFormat output representing currently configured Rx data format +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatSelectGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_RxDataFormatModes_e * const rxDataFormat); + +/** +* \brief Returns the Cddc Data formatter mode currently configured +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannel Receiver channel for which CDDC data format select read back is requested +* \param[out] rxDataFormat output representing currently configured Rx data format +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcDataFormatSelectGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_CddcDataFormatModes_e* const rxDataFormat); + +/** +* \brief Retrieves the Rx floating point formatter settings configured in the device +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannel RX channel for which to retrieve floating point formatter settings +* \param[out] floatingPointConfig Output structure to populate with floating point formatter settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatFloatingPointGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_FloatingPointConfigSettings_t * const floatingPointConfig); + +/** +* \brief Retrieves the Cddc floating point formatter settings configured in the device +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannel RX channel for which to retrieve floating point formatter settings +* \param[out] floatingPointConfig Output structure to populate with floating point formatter settings +* +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcDataFormatFloatingPointGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_CddcFloatingPointConfigSettings_t * const cddcFloatingPointConfig); + +/** +* \brief Returns the Rx Data formatter integer and slicer settings. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannel Channel for which to retrieve integer format and slicer settings +* \param[out] integerConfigSettings Populated with integer config settings +* \param[out] slicerConfigSettings Populated with slicer config settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatIntegerGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_IntegerConfigSettings_t * const integerConfigSettings, + adi_adrv904x_SlicerConfigSettings_t * const slicerConfigSettings); + +/** +* \brief Returns the Cddc Data formatter integer and slicer settings. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannel Channel for which to retrieve integer format and slicer settings +* \param[out] integerConfigSettings Populated with integer config settings +* \param[out] slicerConfigSettings Populated with slicer config settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcDataFormatIntegerGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_CddcIntegerConfigSettings_t * const cddcIntegerConfigSettings, + adi_adrv904x_CddcSlicerConfigSettings_t * const cddcSlicerConfigSettings); + +/** +* \brief Retrieves the Rx embedded overload indicator format settings configured in the device +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannel RX channel for which to retrieve embedded overload indicator format settings +* \param[out] embOvldConfigSettings Output structure to populate with settings of the embedded overload +* monitor formatter +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatEmbOvldMonitorGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_EmbOverloadMonitorConfigSettings_t * const embOvldConfigSettings); + +/** +* \brief Retrieves the Cddc embedded overload indicator format settings configured in the device +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannel RX channel for which to retrieve embedded overload indicator format settings +* \param[out] embOvldConfigSettings Output structure to populate with settings of the embedded overload +* monitor formatter +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcDataFormatEmbOvldMonitorGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_CddcEmbOverloadMonitorConfigSettings_t* const cddcEmbOvldConfigSettings); + +/** +* \brief Returns gain compensation for external LNA gain enable status +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannel RX channel to retrieve settings for +* \param[out] externalLnaGain Current status of the external LNA gain compensation enable. 0 = Disabled, 1 = Enabled +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxGainCompExtLnaGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + uint8_t * const externalLnaGain); + +/** +* \brief Returns gain compensation for temperature enable status +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannel RX channel to retrieve settings for +* \param[out] tempCompensationEnable Populated with wither temp compensation is enabled (1) or disabled (0). +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxGainCompTempEnableGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + uint8_t * const tempCompensationEnable); + +/** +* \brief Reads the GPIO source control register to determine if GPIOs are assigned to observe the +* internal slicer control word. +* +* +* ORx slicer positions cannot be observed via internal slicer observation GPIOs. There are not ORx slicers. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannel RX channel to retrieve settings for +* \param[out] intSlicerFormatSel Output parameter that will be populated with the current RX data + format selection, if enableStatus is 1. +* \param[out] enableStatus Output parameter that will be populated with whether the slicer control + is routed to observation GPIOs(1) or not(0). +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxInternalSlicerGpioEnableGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_RxDataFormatModes_e * const intSlicerFormatSel, + uint8_t * const enableStatus); + +/** +* \brief Encodes the embedded slicer position and no. of embedded slicer bits for integer formatter. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannel RX channel which to retrieve settings for +* \param[in] intEmbedSlicer embedded slicer enable/disable status read back from device +* \param[in] intEmbedSlicerPos embedded slicer position status read back from device +* \param[in] intEmbedSlicerNumber embedded slicer bits status read back from device +* \param[out] integerConfigSettingsEmbSlicer Output enumeration that is populated with + the value that corresponds to the combination of slicer configuration parameters +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxIntEmbSlicerConfigEncode(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + const uint8_t intEmbedSlicer, + const uint8_t intEmbedSlicerPos, + const uint8_t intEmbedSlicerNumber, + adi_adrv904x_RxSlicerEmbeddedBits_e * const integerConfigSettingsEmbSlicer); + +/** +* \brief Encodes the embedded slicer position and no. of embedded slicer bits for integer formatter for the CDDC. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannel RX channel which to retrieve settings for +* \param[in] intEmbedSlicer embedded slicer enable/disable status read back from device +* \param[in] intEmbedSlicerPos embedded slicer position status read back from device +* \param[in] intEmbedSlicerNumber embedded slicer bits status read back from device +* \param[out] integerConfigSettingsEmbSlicer Output enumeration that is populated with + the value that corresponds to the combination of slicer configuration parameters +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcIntEmbSlicerConfigEncode(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + const uint8_t intEmbedSlicer, + const uint8_t intEmbedSlicerPos, + const uint8_t intEmbedSlicerNumber, + adi_adrv904x_RxSlicerEmbeddedBits_e* const integerConfigSettingsEmbSlicer); + +/** +* \brief Encodes the integer data resolution and format for integer formatter. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] intDataResolution Integer resolution of Rx data formatter. + 12 bits = 0, 16 bits = 1. +* \param[in] intDataFormat Integer data format of Rx Data Formatter. + 2's complement = 0, signed-magnitude = 1. +* \param[out] intSampleResolution Output parameter populated with the value that + corresponds to the integer format represented by the input parameters. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxIntSampleResFormatEncode(adi_adrv904x_Device_t * const device, + const uint8_t intDataResolution, + const uint8_t intDataFormat, + adi_adrv904x_RxIntSampleResolution_e * const intSampleResolution); + +/** +* \brief Encodes the integer parity support for integer formatter. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannel Receiver channel for which RX data format is requested +* \param[in] intParitySupport Integer parity support from the device. Disabled = 0, enabled = 1. +* \param[in] intEvenParity Integer parity from the device. Even = 0, odd = 1. +* \param[out] integerParity Output parameter populated with the value that corresponds to the parity + settings represented by the input parameters +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxIntParitySupportEncode(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + const uint8_t intParitySupport, + const uint8_t intEvenParity, + adi_adrv904x_RxIntParity_e * const integerParity); + +/** +* \brief Encodes the integer parity support for integer formatter for the CDDC. +* +* \dep_begin +* \dep{ device->common.devHalInfo } +* \dep{ device->devStateInfo } +* \dep_end +* +* \param[in] device Structure pointer to the ADRV904X device data structure +* \param[in] rxChannel Receiver channel for which RX data format is requested +* \param[in] intParitySupport Integer parity support from the device.Disabled = 0, enabled = 1. +* \param[in] intEvenParity Integer parity from the device.Even = 0, odd = 1. +* \param[out] integerParity Output parameter populated with the value that corresponds to the parity +* settings represented by the input parameters +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcIntParitySupportEncode(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + const uint8_t intParitySupport, + const uint8_t intEvenParity, + adi_adrv904x_RxIntParity_e* const integerParity); + +/** +* \brief This function reads back the LO Source Mapping to the requested Rx channel. +* +* The LO source select for a given channel is configured during init time. This function +* can be used to read back the configuration during run time. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] rxChannel Enum to select Rx Channel. +* \param[out] rxLoSource Pointer to store Rx channel LO source mapping read back (Output) +* +* \retval adi_adrv904x_ErrAction_e - ADI_COMMON_ACT_NO_ACTION if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxLoSourceGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_LoSel_e* const rxLoSource); + +/** +* \brief Performs range check on the Rx channel min and max gain indices to be updated +* +* This function is called automatically as part of adi_adrv904x_RxMinMaxGainIndexSet() +* if the ADI_ADRV904X_RX_RANGE_CHECK is set to 1. This function can be called independently +* to perform range checks only on parameters for adi_adrv904x_RxMinMaxGainIndexSet() API +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] rxChannelMask channel masks for which min and max gain indices are to be updated +* \param[in] minGainIndex is the lower limit of the gain index for a given channel +* \param[in] maxGainIndex is the upper limit of the gain index for a given channel +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxMinMaxGainIndexSetRangeCheck(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const uint8_t minGainIndex, + const uint8_t maxGainIndex); + +/** +* \brief Performs range check on the gain table settings for Rx channels. +* +* This function called automatically as part of adi_adrv904x_RxGainTableWrite() API +* if ADI_ADRV904X_RX_RANGE_CHECK is set to 1. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] rxChannelMask is the set of channels for which current gain table settings are to be programmed. +* Valid Rx channels include Rx0-Rx7 +* \param[in] gainIndexOffset is the starting gain index from which gain table is programmed +* \param[in] gainTableRow Array of gain table row entries for programming +* \param[in] arraySize is the number of gain table rows to be programmed +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxGainTableWriteRangeCheck(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const uint8_t gainIndexOffset, + const adi_adrv904x_RxGainTableRow_t gainTableRow[], + const uint32_t arraySize); +/** +* \brief Performs range check on the gain table read request for Rx channels. +* +* This function called automatically as part of adi_adrv904x_RxGainTableRead() API +* if ADI_ADRV904X_RX_RANGE_CHECK is set to 1. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] rxChannel represents the channels for which gain table read back is requested. +* Valid Rx channels include Rx0-Rx7 +* \param[in] gainIndexOffset is the gain index from which gain table read back should start +* \param[out] gainTableRow Read back array for gain table row entries which will be updated with the read back values +* \param[in] arraySize is the size of gainTableRow array. It is also the upper limit for the no. of gain indices to read +* \param[out] numGainIndicesRead is the actual no. of gain indices read from SRAM (output). A NULL can be passed +* if the value of no. of gain indices actually read is not required. + +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxGainTableReadRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + const uint8_t gainIndexOffset, + const adi_adrv904x_RxGainTableRow_t gainTableRow[], + const uint32_t arraySize); + +/** +* \brief This function configures Hb2 peak detector block for selected Rx channel +* +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] rxChannel Enum to select Rx Channel. +* \param[in] enableHb2Overload 1:Enable Hb2 block, 0:Disable Hb2 block +* \param[in] hb2OverloadSignalSelection 2: Select input of DEC3 Block 1:Select input of Hb2 block, 0:Select output of Hb2 block +* \param[in] hb2OverloadPowerMode 1:Use I^2+Q^2 signal configuration, 0:Use max(|I|, |Q|) signal configuration +* +* \retval adi_adrv904x_ErrAction_e - ADI_COMMON_ACT_NO_ACTION if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxHb2OverloadCfgSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + const uint8_t enableHb2Overload, + const uint8_t hb2OverloadSignalSelection, + const uint8_t hb2OverloadPowerMode); + +/** +* \brief This function reads back the Hb2 block configuration of selected Hb2 block +* +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] rxChannel Enum to select Rx Channel. +* \param[out] enableHb2Overload Pointer to readback value. enableHb2Overload 1:Enable Hb2 block, 0:Disable Hb2 block +* \param[out] hb2OverloadSignalSelection Pointer to readback value 1:Select input of Hb2 block, 0:Select output of Hb2 block +* \param[out] hb2OverloadPowerMode Pointer to readback value 1:Use I^2+Q^2 signal configuration, 0:Use max(|I|, |Q|) signal configuration +* +* \retval adi_adrv904x_ErrAction_e - ADI_COMMON_ACT_NO_ACTION if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxHb2OverloadCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + uint8_t * const enableHb2Overload, + uint8_t * const hb2OverloadSignalSelection, + uint8_t * const hb2OverloadPowerMode); + +/** + * \brief Convert from ORx integer attenuation (dB) to TrmAtten and trmAttenBwCapEn bitfield values + * required by the device to give effect to the requested ORx attenuation. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep{device->devStateInfo} + * \dep_end + * + * \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure + * \param[in] attenDb ORx attenuation. Valid range 0-16 dB. + * \param[out] trmAtten. The value required for the trm_atten bitfield is written here. + * \param[out] trmAtten. The value required for the trm_atten_bw_cap_en bitfield is written here. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adrv904x_ORxAttenDbToRegValues(adi_adrv904x_Device_t* const device, + const uint8_t attenDb, + uint8_t* const trmAtten, + uint8_t* const trmAttenBwCapEn); + +/** + * \brief Convert from the value supplied by the TrmAtten bitfield read function + * to the closest corresponding attenuation (dB) which it indicates. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep{device->devStateInfo} + * \dep_end + * + * \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure + * \param[in] attenDb ORx attenuation. Valid range 0-16 dB. + * \param[out] trmAtten. The converted adrv904x_Bf_ActrlOrxWestRegmap_TrmAtten_e is written here. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adrv904x_ORxTrmAttenToDb(adi_adrv904x_Device_t* const device, + const uint8_t trmAtten, + uint8_t* const attenDb); + +/** +* \brief Returns 0-indexed channel id for a given adi_adrv904x_RxChannels_e. +* +* \param[in] rxChannel The value to convert. +* +* \retval uint8_t The channel id. Returns a value greater ADI_ADRV904X_CHAN_ID_MAX if the value supplied cannot be +* converted (i.e. is not valid value for the enum or refers to RX_ALL or RX_NONE). +*/ +ADI_API uint8_t adrv904x_RxChannelsToId(const adi_adrv904x_RxChannels_e rxChannel); + +/** +* \brief Look up the Rx digital bitfield address given a Rx channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] rxChannel Channel selection to read back gain index for(Valid Rx0 - Rx7 only) +* \param[out] cddcFuncsChannelBitfieldAddr Rx cddc funcs channel bitfield address which will be updated by this function +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncsBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adrv904x_BfCddcFuncsChanAddr_e* const cddcFuncsChannelBitfieldAddr); + +/** +* \brief Look up the Rx Hb Datapath bitfield address given a Rx channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] rxChannel Channel selection to read back gain index for(Valid Rx0 - Rx7 only) +* \param[out] cddcHbDpathChannelBitfieldAddr Rx cddc Hb Datapath channel bitfield address which will be updated by this function +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpathBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adrv904x_BfCddcHbDpathChanAddr_e* const cddcHbDpathChannelBitfieldAddr); + +/** +* \brief Performs range check on rx rssi config setting. +* +* \pre This function is called automatically as part of adi_adrv904x_RxCarrierRssiCfgSet() +* function if ADI_ADRV904X_RX_RANGE_CHECK > 0. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] rssiCfg is the channelized rssi config setting parameter +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierRssiCfgRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxCarrierRssiCfg_t* const rssiCfg); + + +/** +* \brief Performs range check on rx cddc carrier setting. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] chanSelect is the rx channel parameter +* \param[in] carrierSelect is the rx carrier parameter +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCddcCarrierCheck(adi_adrv904x_Device_t* const device, + const uint8_t chanSelect, + const uint8_t carrierSelect); +#endif //CLIENT_IGNORE +#endif diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_rx_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_rx_types.h new file mode 100644 index 00000000000..dd6235d4158 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_rx_types.h @@ -0,0 +1,35 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adrv904x_rx_types.h +* +* \brief Contains ADRV904X data types for on board cpus feature +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#ifndef _ADRV904X_RX_TYPES_H_ +#define _ADRV904X_RX_TYPES_H_ + +#include "adi_adrv904x_rx_types.h" + +/** +* \brief Data structure for Rx Carrier decimated power block configuration +*/ +typedef struct adrv904x_RxCarrierDecPowerCfg +{ + adi_adrv904x_RxCarrierMask_t rxCarrierMask; /*!< Rx Channel/Carrier Decimated Power Meter Mask selection */ + uint8_t measEnable; /*!< Enable Rx Carrier Dec Power measurements */ + uint8_t inputSelect; /*!< Measurement point selection for an Rx Carrier. 0: Channel Filter Input 1: Channel Filter Output 2: Band Data */ + uint8_t powerMeasurementDuration; /*!< Average power measurement duration = 8*2^powerMeasurementDuration. Valid range from 0 to 31 */ + uint16_t dpdInOutPwrMeasContDlyCntr; /*!< When in TDD mode (tddModeEnable = 1), wait before continuing with power measurement after RxOn */ + uint8_t peakToPowerMode; /*!< Enable peak-to-power mode. When enabled, the largest peak (I^2+Q^2) within a measurement duration is available for readback */ +} adrv904x_RxCarrierDecPowerCfg_t; + + +#endif /* _ADRV904X_RX_TYPES_H_ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_shared_resource_manager.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_shared_resource_manager.h new file mode 100644 index 00000000000..eab2609a31d --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_shared_resource_manager.h @@ -0,0 +1,291 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adrv904x_shared_resource_manager.h + * \brief Contains ADRV904X shared resource related private function prototypes for + * adrv904x_shared_resource_manager.c + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADRV904X_SHARED_RESOURCE_MANAGER_H_ +#define _ADRV904X_SHARED_RESOURCE_MANAGER_H_ + +#include "adrv904x_shared_resource_manager_types.h" +#include "adi_adrv904x_error.h" + + +/** +* \brief Resets the shared resource pool for a given adrv904x device +* +* Each shared resource is associated with a feature. On reset, all the +* shared resources are assigned to 'UNUSED' and are ready for use by a given feature. +* +* \pre This function is required to be called during initialization +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the adrv904x device data structure +* \retval ADI_ADRV904X_ERR_ACT_NONE if Error Data is marked clear +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_SharedResourceMgrReset(adi_adrv904x_Device_t* const device); + +/** +* \brief Returns if a requested shared resource is available for use +* +* Each shared resource is associated with a feature. Returns a success if the shared resource +* is unused and a failure if already in use. +* +* \pre This function is a private function used internally by the API and can be called +* anytime after initialization by the API to test shared resource availability +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the adrv904x device data structure +* \param[in] sharedResourceID is the shared resource whose availability is being inquired +* \param[out] sharedResourceAvailable result - ADI_TRUE or ADI_FALSE is returned depending +* on availability of shared resource +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Error Data is marked clear +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_SharedResourceAvailabilityCheck(adi_adrv904x_Device_t* const device, + const adrv904x_SharedResourceID_e sharedResourceID, + uint8_t* const sharedResourceAvailable); + +/** +* \brief Returns the shared resource ID for a shared resource +* +* \pre This function is a private function used internally by the API and can be called +* anytime after initialization by the API to test shared resource availability +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the adrv904x device data structure +* \param[in] sharedResourceType is the shared resource type(GPIO, MEMORY etc) for which ID is being requested +* \param[in] sharedResource is typically the enum value of the shared resource for which ID is being requested +* \param[out] sharedResourceID result shared resource ID is updated in this variable +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Error Data is marked clear +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_SharedResourceIdGet(adi_adrv904x_Device_t* const device, + const adrv904x_SharedResourceType_e sharedResourceType, + int32_t sharedResource, + adrv904x_SharedResourceID_e* const sharedResourceID); + +/** +* \brief Returns the feature currently consuming the shared resource. +* +* Each shared resource is associated with a feature in the resource pool. +* This function returns the feature currently associated with the shared resource +* +* \pre This function is a private function used internally by the API and can be called +* anytime after initialization by the API to inquirer shared +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the adrv904x device data structure +* \param[in] sharedResourceID is the shared resource whose availability is under query +* \param[out] featureID pointer to the feature associated with the requested shared resource ID +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Error Data is marked clear +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_SharedResourceFeatureGet(adi_adrv904x_Device_t* const device, + const adrv904x_SharedResourceID_e sharedResourceID, + adrv904x_FeatureID_e* const featureID); + +/** +* \brief Set the channelMask currently consuming the shared resource. +* +* Each shared resource is associated with a feature in the resource pool. +* This function returns the channelMask currently associated with the shared resource +* +* \pre This function is a private function used internally by the API and can be called +* anytime after initialization by the API to inquire shared +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the adrv904x device data structure +* \param[in] sharedResourceID is the shared resource whose availability is under query +* \param[in] channelMask the channelMask associated with the requested shared resource ID +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Error Data is marked clear +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_SharedResourceChannelMaskSet(adi_adrv904x_Device_t* const device, + const adrv904x_SharedResourceID_e sharedResourceID, + const uint32_t channelMask); + +/** +* \brief Returns the channelMask currently consuming the shared resource. +* +* Each shared resource is associated with a feature in the resource pool. +* This function returns the channelMask currently associated with the shared resource +* +* \pre This function is a private function used internally by the API and can be called +* anytime after initialization by the API to inquire shared +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the adrv904x device data structure +* \param[in] sharedResourceID is the shared resource whose availability is under query +* \param[out] channelMask pointer to the channelMask associated with the requested shared resource ID +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Error Data is marked clear +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_SharedResourceChannelMaskGet(adi_adrv904x_Device_t* const device, + const adrv904x_SharedResourceID_e sharedResourceID, + uint32_t * const channelMask); + + +/** +* \brief Returns the maximum semaphore count for a given feature. +* +* Each shared resource is associated with a feature in the resource pool. +* Some features share the shared resource with multiple consumers necessitating +* a semaphore associated with each feature. This function can be used to inquire +* the maximum semaphore count associated with the feature. +* +* \pre This function is a private function used internally by the API and can be called +* anytime after initialization by the API to inquire the maximum semaphore count associated +* with a feature +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the adrv904x device data structure +* \param[in] featureID The feature ID for which the maximum semaphore count is requested +* \param[out] maxSemaphoreCount Pointer to the max semaphore count variable which will be updated +* with the maximum semaphore count for a given feature. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Error Data is marked clear +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_SharedResourceFeatureMaxSemaphoreCntGet(adi_adrv904x_Device_t* const device, + const adrv904x_FeatureID_e featureID, + uint8_t* const maxSemaphoreCount); + +/** +* \brief Attempts to acquire the requested shared resource for a requested from the +* adrv904x device data structure shared resource pool +* +* \pre This function is a private function used internally by the API and can be called +* anytime after initialization by the API to acquire a shared resource +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the adrv904x device data structure +* \param[in] sharedResourceID is the shared resource whose availability is under query +* \param[in] featureID feature requesting the shared resource +* \param[out] resourceAcquistionStatus stores ADI_SUCCESS if resource acquisition was successful, +* ADI_FAILURE otherwise +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Error Data is marked clear +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_SharedResourceAcquire(adi_adrv904x_Device_t* const device, + const adrv904x_SharedResourceID_e sharedResourceID, + const adrv904x_FeatureID_e featureID, + uint8_t* const resourceAcquistionStatus); + +/** +* \brief Attempts to acquire multiple shared resources for a requested feature from the +* adrv904x device data structure shared resource pool +* +* This function returns a failure even if a single resource acquisition fails +* +* \pre This function is a private function used internally by the API and can be called +* anytime after initialization by the API to acquire multiple shared resources for +* the same feature +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the adrv904x device data structure +* \param[in] sharedResourceType is the enum of the shared resource type to be acquired +* \param[in] sharedResourceArr is the array of shared resources to be acquired +* \param[in] numSharedResources is the size of sharedResourceArr +* \param[in] featureID feature requesting the shared resource +* \param[out] resourceAcquistionStatus stores ADI_SUCCESS if resource acquisition was successful, +* ADI_FAILURE otherwise +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Error Data is marked clear +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_SharedResourcesAcquire(adi_adrv904x_Device_t* const device, + const adrv904x_SharedResourceType_e sharedResourceType, + int32_t sharedResourceArr[], + const uint32_t numSharedResources, + const adrv904x_FeatureID_e featureID, + uint8_t* const resourceAcquistionStatus); + +/** +* \brief Attempts to release the shared resource under consumption by the given feature +* +* \pre This function is a private function used internally by the API and can be called +* anytime after initialization by the API to test shared resource availability +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the adrv904x device data structure +* \param[in] sharedResourceID is the shared resource whose availability is under query +* \param[in] featureID feature requesting the shared resource +* \param[out] resourceReleaseStatus stores ADI_SUCCESS if resource release was successful, +* ADI_FAILURE otherwise +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Error Data is marked clear +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_SharedResourceRelease(adi_adrv904x_Device_t* const device, + const adrv904x_SharedResourceID_e sharedResourceID, + const adrv904x_FeatureID_e featureID, + uint8_t* const resourceReleaseStatus); + +/** +* \brief Attempts to release multiple shared resources for a requested feature from the +* adrv904x device data structure shared resource pool +* +* This function returns a failure even if a single resource release fails +* +* \pre This function is a private function used internally by the API and can be called +* anytime after initialization by the API to release multiple shared resources for +* the same feature +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the adrv904x device data structure +* \param[in] sharedResourceType is the enum of the shared resource type to be released +* \param[in] sharedResourceArr is the array of shared resources to be acquired +* \param[in] numSharedResources is the size of sharedResourceArr +* \param[in] featureID feature requesting the shared resource +* \param[out] resourceReleaseStatus stores ADI_SUCCESS if resource release was successful, +* ADI_FAILURE otherwise +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Error Data is marked clear +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_SharedResourcesRelease(adi_adrv904x_Device_t* const device, + const adrv904x_SharedResourceType_e sharedResourceType, + int32_t sharedResourceArr[], + uint32_t numSharedResources, + const adrv904x_FeatureID_e featureID, + uint8_t* const resourceReleaseStatus); + +#endif // ! _ADRV904X_SHARED_RESOURCE_MANAGER_H_ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_shared_resource_manager_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_shared_resource_manager_types.h new file mode 100644 index 00000000000..7b461bfdd22 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_shared_resource_manager_types.h @@ -0,0 +1,899 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adrv904x_shared_resource_manager_types.h + * \brief Contains ADRV904X shared resource related private data prototypes for + * adrv904x_shared_resource_manager.c + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADRV904X_SHARED_RESOURCE_MANAGER_TYPES_H_ +#define _ADRV904X_SHARED_RESOURCE_MANAGER_TYPES_H_ + +#include "adi_library.h" +#include "../../public/include/adi_adrv904x_gpio_types.h" + + +/***Please add shared resource maximum semaphore count above this line****/ + +typedef enum adrv904x_SharedResourceType +{ + ADRV904X_SHARED_RESOURCE_GPIO = 0U, /*!< Select GPIO as the Shared Resource type*/ + ADRV904X_SHARED_RESOURCE_GPIO_ANALOG = 1U, + /*!< Select GPIO Analog as the Shared Resource type*/ + /***Please add shared resource type above this line****/ + ADRV904X_NUM_SHARED_RESOURCE_TYPES +} adrv904x_SharedResourceType_e; + +typedef enum adrv904x_SharedResourceID +{ + /******START OF DIGITAL GPIO********/ + ADRV904X_GPIO_00 = 0U, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_00*/ + ADRV904X_GPIO_01, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_01*/ + ADRV904X_GPIO_02, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_02*/ + ADRV904X_GPIO_03, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_03*/ + ADRV904X_GPIO_04, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_04*/ + ADRV904X_GPIO_05, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_05*/ + ADRV904X_GPIO_06, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_06*/ + ADRV904X_GPIO_07, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_07*/ + ADRV904X_GPIO_08, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_08*/ + ADRV904X_GPIO_09, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_09*/ + ADRV904X_GPIO_10, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_10*/ + ADRV904X_GPIO_11, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_11*/ + ADRV904X_GPIO_12, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_12*/ + ADRV904X_GPIO_13, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_13*/ + ADRV904X_GPIO_14, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_14*/ + ADRV904X_GPIO_15, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_15*/ + ADRV904X_GPIO_16, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_16*/ + ADRV904X_GPIO_17, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_17*/ + ADRV904X_GPIO_18, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_18*/ + ADRV904X_GPIO_19, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_19*/ + ADRV904X_GPIO_20, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_20*/ + ADRV904X_GPIO_21, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_21*/ + ADRV904X_GPIO_22, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_22*/ + ADRV904X_GPIO_23, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_23*/ + /******START OF GPIO Analog********/ + ADRV904X_GPIO_ANA_00, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_ANA_00*/ + ADRV904X_GPIO_ANA_01, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_ANA_01*/ + ADRV904X_GPIO_ANA_02, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_ANA_02*/ + ADRV904X_GPIO_ANA_03, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_ANA_03*/ + ADRV904X_GPIO_ANA_04, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_ANA_04*/ + ADRV904X_GPIO_ANA_05, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_ANA_05*/ + ADRV904X_GPIO_ANA_06, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_ANA_06*/ + ADRV904X_GPIO_ANA_07, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_ANA_07*/ + ADRV904X_GPIO_ANA_08, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_ANA_08*/ + ADRV904X_GPIO_ANA_09, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_ANA_09*/ + ADRV904X_GPIO_ANA_10, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_ANA_10*/ + ADRV904X_GPIO_ANA_11, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_ANA_11*/ + ADRV904X_GPIO_ANA_12, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_ANA_12*/ + ADRV904X_GPIO_ANA_13, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_ANA_13*/ + ADRV904X_GPIO_ANA_14, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_ANA_14*/ + ADRV904X_GPIO_ANA_15, /*!< Unique Shared Resource ID for ADI_ADRV904X_GPIO_ANA_15*/ + /***Please add shared resources above this line***/ + ADRV904X_NUM_SHARED_RESOURCES, + ADRV904X_SHARED_RESOURCE_INVALID +} adrv904x_SharedResourceID_e; + +#define GPIO_SIGNAL_FEATURE 0x01000000 + +typedef enum adrv904x_FeatureID +{ + ADRV904X_FEATURE_UNUSED = 0U, + ADRV904X_FEATURE_GPIO_AUX_SPI_SDIO = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_SDIO, + ADRV904X_FEATURE_GPIO_AUX_SPI_SDO = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_SDO, + ADRV904X_FEATURE_GPIO_AUX_SPI_CLK = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_CLK, + ADRV904X_FEATURE_GPIO_AUX_SPI_CSB = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_CSB, + ADRV904X_FEATURE_GPIO_UART_PADRXSIN = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_UART_PADRXSIN, + ADRV904X_FEATURE_GPIO_UART_PADCTS = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_UART_PADCTS, + ADRV904X_FEATURE_GPIO_UART_PADRTSOUT = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_UART_PADRTSOUT, + ADRV904X_FEATURE_GPIO_UART_PADTXSOUT = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_UART_PADTXSOUT, + ADRV904X_FEATURE_GPIO_DFE_TRACE_CLK_OUT = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_CLK_OUT, + ADRV904X_FEATURE_GPIO_DFE_TRACE_DATA_OUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_0, + ADRV904X_FEATURE_GPIO_DFE_TRACE_DATA_OUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_1, + ADRV904X_FEATURE_GPIO_DFE_TRACE_DATA_OUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_2, + ADRV904X_FEATURE_GPIO_DFE_TRACE_DATA_OUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_3, + + ADRV904X_FEATURE_GPIO_DFE_TRACE_DATA_OUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_4, + ADRV904X_FEATURE_GPIO_DFE_TRACE_DATA_OUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_5, + ADRV904X_FEATURE_GPIO_DFE_TRACE_DATA_OUT_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_6, + ADRV904X_FEATURE_GPIO_DFE_TRACE_DATA_OUT_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_7, + + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_0, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_1, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_2, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_3, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_4, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_5, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_6, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_7, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_8, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_9, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_10, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_11 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_11, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_12 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_12, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_13 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_13, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_14 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_14, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_15 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_15, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_16 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_16, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_17 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_17, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_18 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_18, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_19 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_19, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_20 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_20, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_21 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_21, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_22 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_22, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_OUTPUT_23 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_23, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_0, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_1, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_2, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_3, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_4, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_5, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_6, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_7, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_8, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_9, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_10, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_11 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_11, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_12 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_12, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_13 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_13, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_14 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_14, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_15 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_15, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_16 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_16, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_17 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_17, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_18 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_18, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_19 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_19, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_20 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_20, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_21 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_21, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_22 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_22, + ADRV904X_FEATURE_GPIO_MANUAL_MODE_INPUT_23 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_23, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_0, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_1, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_2, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_3, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_4, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_5, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_6, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_7, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_8, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_9, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_10, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_11 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_11, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_12 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_12, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_13 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_13, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_14 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_14, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_15 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_15, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_16 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_16, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_17 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_17, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_18 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_18, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_19 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_19, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_20 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_20, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_21 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_21, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_22 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_22, + ADRV904X_FEATURE_GPIO_ARM_OUTPUT_23 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_23, + ADRV904X_FEATURE_GPIO_ARM_INPUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_0, + ADRV904X_FEATURE_GPIO_ARM_INPUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_1, + ADRV904X_FEATURE_GPIO_ARM_INPUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_2, + ADRV904X_FEATURE_GPIO_ARM_INPUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_3, + ADRV904X_FEATURE_GPIO_ARM_INPUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_4, + ADRV904X_FEATURE_GPIO_ARM_INPUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_5, + ADRV904X_FEATURE_GPIO_ARM_INPUT_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_6, + ADRV904X_FEATURE_GPIO_ARM_INPUT_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_7, + ADRV904X_FEATURE_GPIO_ARM_INPUT_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_8, + ADRV904X_FEATURE_GPIO_ARM_INPUT_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_9, + ADRV904X_FEATURE_GPIO_ARM_INPUT_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_10, + ADRV904X_FEATURE_GPIO_ARM_INPUT_11 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_11, + ADRV904X_FEATURE_GPIO_ARM_INPUT_12 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_12, + ADRV904X_FEATURE_GPIO_ARM_INPUT_13 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_13, + ADRV904X_FEATURE_GPIO_ARM_INPUT_14 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_14, + ADRV904X_FEATURE_GPIO_ARM_INPUT_15 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_15, + ADRV904X_FEATURE_GPIO_ARM_INPUT_16 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_16, + ADRV904X_FEATURE_GPIO_ARM_INPUT_17 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_17, + ADRV904X_FEATURE_GPIO_ARM_INPUT_18 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_18, + ADRV904X_FEATURE_GPIO_ARM_INPUT_19 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_19, + ADRV904X_FEATURE_GPIO_ARM_INPUT_20 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_20, + ADRV904X_FEATURE_GPIO_ARM_INPUT_21 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_21, + ADRV904X_FEATURE_GPIO_ARM_INPUT_22 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_22, + ADRV904X_FEATURE_GPIO_ARM_INPUT_23 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_23, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_FREQ_FINE_BAND_OUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_FINE_BAND_OUT_0, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_FREQ_FINE_BAND_OUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_FINE_BAND_OUT_1, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_FREQ_FINE_BAND_OUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_FINE_BAND_OUT_2, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_FREQ_FINE_BAND_OUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_FINE_BAND_OUT_3, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_FREQ_FINE_BAND_OUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_FINE_BAND_OUT_4, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_FREQ_FINE_BAND_OUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_FINE_BAND_OUT_5, + ADRV904X_FEATURE_GPIO_CLKPLL_CP_CALBITS_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_CALBITS_0, + ADRV904X_FEATURE_GPIO_CLKPLL_CP_CALBITS_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_CALBITS_1, + ADRV904X_FEATURE_GPIO_CLKPLL_CP_CALBITS_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_CALBITS_2, + ADRV904X_FEATURE_GPIO_CLKPLL_CP_CALBITS_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_CALBITS_3, + ADRV904X_FEATURE_GPIO_CLKPLL_CP_CALBITS_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_CALBITS_4, + ADRV904X_FEATURE_GPIO_CLKPLL_CP_CALBITS_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_CALBITS_5, + ADRV904X_FEATURE_GPIO_CLKPLL_PLL_LOCKED = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_PLL_LOCKED, + ADRV904X_FEATURE_GPIO_CLKPLL_CP_OVERRANGE_LOW_FLAG = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_OVERRANGE_LOW_FLAG, + ADRV904X_FEATURE_GPIO_CLKPLL_CP_OVERRANGE_HIGH_FLAG = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_OVERRANGE_HIGH_FLAG, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_COMP_OUT = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_COMP_OUT, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_CAL_IN_PROGRESS = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_CAL_IN_PROGRESS, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_0, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_1, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_2, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_3, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_4, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_5, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_6, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_7, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_8, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_ALC_WORD_OUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_0, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_ALC_WORD_OUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_1, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_ALC_WORD_OUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_2, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_ALC_WORD_OUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_3, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_ALC_WORD_OUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_4, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_ALC_WORD_OUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_5, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_ALC_WORD_OUT_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_6, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_ALC_WORD_OUT_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_7, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_ALC_WORD_OUT_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_8, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_ALC_WORD_OUT_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_9, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_ALC_WORD_OUT_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_10, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_TCIDAC_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_0, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_TCIDAC_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_1, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_TCIDAC_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_2, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_TCIDAC_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_3, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_TCIDAC_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_4, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_TCIDAC_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_5, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_TCIDAC_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_6, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_TCIDAC_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_7, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_TCIDAC_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_8, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_TCIDAC_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_9, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_TCIDAC_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_10, + ADRV904X_FEATURE_GPIO_CLKPLL_VCO_TCIDAC_11 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_11, + ADRV904X_FEATURE_GPIO_CLKPLL_SPARE_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_0, + ADRV904X_FEATURE_GPIO_CLKPLL_SPARE_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_1, + ADRV904X_FEATURE_GPIO_CLKPLL_SPARE_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_2, + ADRV904X_FEATURE_GPIO_CLKPLL_SPARE_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_3, + ADRV904X_FEATURE_GPIO_CLKPLL_SPARE_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_4, + ADRV904X_FEATURE_GPIO_CLKPLL_SPARE_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_5, + ADRV904X_FEATURE_GPIO_CLKPLL_SPARE_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_6, + ADRV904X_FEATURE_GPIO_CLKPLL_SPARE_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_7, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_FREQ_FINE_BAND_OUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_FINE_BAND_OUT_0, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_FREQ_FINE_BAND_OUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_FINE_BAND_OUT_1, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_FREQ_FINE_BAND_OUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_FINE_BAND_OUT_2, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_FREQ_FINE_BAND_OUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_FINE_BAND_OUT_3, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_FREQ_FINE_BAND_OUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_FINE_BAND_OUT_4, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_FREQ_FINE_BAND_OUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_FINE_BAND_OUT_5, + ADRV904X_FEATURE_GPIO_RFPLL0_CP_CALBITS_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_CALBITS_0, + ADRV904X_FEATURE_GPIO_RFPLL0_CP_CALBITS_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_CALBITS_1, + ADRV904X_FEATURE_GPIO_RFPLL0_CP_CALBITS_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_CALBITS_2, + ADRV904X_FEATURE_GPIO_RFPLL0_CP_CALBITS_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_CALBITS_3, + ADRV904X_FEATURE_GPIO_RFPLL0_CP_CALBITS_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_CALBITS_4, + ADRV904X_FEATURE_GPIO_RFPLL0_CP_CALBITS_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_CALBITS_5, + ADRV904X_FEATURE_GPIO_RFPLL0_PLL_LOCKED = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_PLL_LOCKED, + ADRV904X_FEATURE_GPIO_RFPLL0_CP_OVERRANGE_LOW_FLAG = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_OVERRANGE_LOW_FLAG, + ADRV904X_FEATURE_GPIO_RFPLL0_CP_OVERRANGE_HIGH_FLAG = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_OVERRANGE_HIGH_FLAG, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_COMP_OUT = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_COMP_OUT, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_CAL_IN_PROGRESS = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_CAL_IN_PROGRESS, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_0, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_1, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_2, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_3, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_4, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_5, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_6, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_7, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_8, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_ALC_WORD_OUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_0, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_ALC_WORD_OUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_1, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_ALC_WORD_OUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_2, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_ALC_WORD_OUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_3, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_ALC_WORD_OUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_4, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_ALC_WORD_OUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_5, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_ALC_WORD_OUT_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_6, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_ALC_WORD_OUT_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_7, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_ALC_WORD_OUT_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_8, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_ALC_WORD_OUT_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_9, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_ALC_WORD_OUT_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_10, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_TCIDAC_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_0, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_TCIDAC_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_1, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_TCIDAC_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_2, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_TCIDAC_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_3, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_TCIDAC_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_4, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_TCIDAC_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_5, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_TCIDAC_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_6, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_TCIDAC_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_7, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_TCIDAC_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_8, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_TCIDAC_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_9, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_TCIDAC_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_10, + ADRV904X_FEATURE_GPIO_RFPLL0_VCO_TCIDAC_11 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_11, + ADRV904X_FEATURE_GPIO_RFPLL0_SPARE_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_0, + ADRV904X_FEATURE_GPIO_RFPLL0_SPARE_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_1, + ADRV904X_FEATURE_GPIO_RFPLL0_SPARE_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_2, + ADRV904X_FEATURE_GPIO_RFPLL0_SPARE_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_3, + ADRV904X_FEATURE_GPIO_RFPLL0_SPARE_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_4, + ADRV904X_FEATURE_GPIO_RFPLL0_SPARE_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_5, + ADRV904X_FEATURE_GPIO_RFPLL0_SPARE_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_6, + ADRV904X_FEATURE_GPIO_RFPLL0_SPARE_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_7, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_FREQ_FINE_BAND_OUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_FINE_BAND_OUT_0, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_FREQ_FINE_BAND_OUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_FINE_BAND_OUT_1, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_FREQ_FINE_BAND_OUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_FINE_BAND_OUT_2, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_FREQ_FINE_BAND_OUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_FINE_BAND_OUT_3, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_FREQ_FINE_BAND_OUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_FINE_BAND_OUT_4, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_FREQ_FINE_BAND_OUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_FINE_BAND_OUT_5, + ADRV904X_FEATURE_GPIO_RFPLL1_CP_CALBITS_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_CALBITS_0, + ADRV904X_FEATURE_GPIO_RFPLL1_CP_CALBITS_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_CALBITS_1, + ADRV904X_FEATURE_GPIO_RFPLL1_CP_CALBITS_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_CALBITS_2, + ADRV904X_FEATURE_GPIO_RFPLL1_CP_CALBITS_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_CALBITS_3, + ADRV904X_FEATURE_GPIO_RFPLL1_CP_CALBITS_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_CALBITS_4, + ADRV904X_FEATURE_GPIO_RFPLL1_CP_CALBITS_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_CALBITS_5, + ADRV904X_FEATURE_GPIO_RFPLL1_PLL_LOCKED = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_PLL_LOCKED, + ADRV904X_FEATURE_GPIO_RFPLL1_CP_OVERRANGE_LOW_FLAG = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_OVERRANGE_LOW_FLAG, + ADRV904X_FEATURE_GPIO_RFPLL1_CP_OVERRANGE_HIGH_FLAG = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_OVERRANGE_HIGH_FLAG, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_COMP_OUT = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_COMP_OUT, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_CAL_IN_PROGRESS = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_CAL_IN_PROGRESS, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_0, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_1, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_2, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_3, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_4, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_5, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_6, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_7, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_8, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_ALC_WORD_OUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_0, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_ALC_WORD_OUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_1, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_ALC_WORD_OUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_2, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_ALC_WORD_OUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_3, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_ALC_WORD_OUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_4, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_ALC_WORD_OUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_5, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_ALC_WORD_OUT_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_6, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_ALC_WORD_OUT_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_7, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_ALC_WORD_OUT_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_8, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_ALC_WORD_OUT_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_9, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_ALC_WORD_OUT_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_10, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_TCIDAC_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_0, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_TCIDAC_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_1, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_TCIDAC_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_2, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_TCIDAC_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_3, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_TCIDAC_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_4, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_TCIDAC_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_5, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_TCIDAC_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_6, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_TCIDAC_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_7, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_TCIDAC_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_8, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_TCIDAC_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_9, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_TCIDAC_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_10, + ADRV904X_FEATURE_GPIO_RFPLL1_VCO_TCIDAC_11 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_11, + ADRV904X_FEATURE_GPIO_RFPLL1_SPARE_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_0, + ADRV904X_FEATURE_GPIO_RFPLL1_SPARE_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_1, + ADRV904X_FEATURE_GPIO_RFPLL1_SPARE_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_2, + ADRV904X_FEATURE_GPIO_RFPLL1_SPARE_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_3, + ADRV904X_FEATURE_GPIO_RFPLL1_SPARE_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_4, + ADRV904X_FEATURE_GPIO_RFPLL1_SPARE_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_5, + ADRV904X_FEATURE_GPIO_RFPLL1_SPARE_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_6, + ADRV904X_FEATURE_GPIO_RFPLL1_SPARE_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_7, + ADRV904X_FEATURE_GPIO_JTAG_DETECTOR_N_DES_CH_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_0, + ADRV904X_FEATURE_GPIO_JTAG_DETECTOR_N_DES_CH_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_1, + ADRV904X_FEATURE_GPIO_JTAG_DETECTOR_N_DES_CH_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_2, + ADRV904X_FEATURE_GPIO_JTAG_DETECTOR_N_DES_CH_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_3, + ADRV904X_FEATURE_GPIO_JTAG_DETECTOR_N_DES_CH_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_4, + ADRV904X_FEATURE_GPIO_JTAG_DETECTOR_N_DES_CH_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_5, + ADRV904X_FEATURE_GPIO_JTAG_DETECTOR_N_DES_CH_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_6, + ADRV904X_FEATURE_GPIO_JTAG_DETECTOR_N_DES_CH_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_7, + ADRV904X_FEATURE_GPIO_JTAG_DETECTOR_P_DES_CH_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_0, + ADRV904X_FEATURE_GPIO_JTAG_DETECTOR_P_DES_CH_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_1, + ADRV904X_FEATURE_GPIO_JTAG_DETECTOR_P_DES_CH_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_2, + ADRV904X_FEATURE_GPIO_JTAG_DETECTOR_P_DES_CH_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_3, + ADRV904X_FEATURE_GPIO_JTAG_DETECTOR_P_DES_CH_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_4, + ADRV904X_FEATURE_GPIO_JTAG_DETECTOR_P_DES_CH_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_5, + ADRV904X_FEATURE_GPIO_JTAG_DETECTOR_P_DES_CH_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_6, + ADRV904X_FEATURE_GPIO_JTAG_DETECTOR_P_DES_CH_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_7, + ADRV904X_FEATURE_GPIO_RX_SYNC_JTAG_DETECTOR_P_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX_SYNC_JTAG_DETECTOR_P_0, + ADRV904X_FEATURE_GPIO_RX_SYNC_JTAG_DETECTOR_P_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX_SYNC_JTAG_DETECTOR_P_1, + ADRV904X_FEATURE_GPIO_RX_SYNC_JTAG_DETECTOR_P_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX_SYNC_JTAG_DETECTOR_P_2, + ADRV904X_FEATURE_GPIO_RX_SYNC_JTAG_DETECTOR_N_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX_SYNC_JTAG_DETECTOR_N_0, + ADRV904X_FEATURE_GPIO_RX_SYNC_JTAG_DETECTOR_N_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX_SYNC_JTAG_DETECTOR_N_1, + ADRV904X_FEATURE_GPIO_RX_SYNC_JTAG_DETECTOR_N_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX_SYNC_JTAG_DETECTOR_N_2, + ADRV904X_FEATURE_GPIO_CONTROL_OUT_MUX_JRX_READ_DATA_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_0, + ADRV904X_FEATURE_GPIO_CONTROL_OUT_MUX_JRX_READ_DATA_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_1, + ADRV904X_FEATURE_GPIO_CONTROL_OUT_MUX_JRX_READ_DATA_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_2, + ADRV904X_FEATURE_GPIO_CONTROL_OUT_MUX_JRX_READ_DATA_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_3, + ADRV904X_FEATURE_GPIO_CONTROL_OUT_MUX_JRX_READ_DATA_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_4, + ADRV904X_FEATURE_GPIO_CONTROL_OUT_MUX_JRX_READ_DATA_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_5, + ADRV904X_FEATURE_GPIO_CONTROL_OUT_MUX_JRX_READ_DATA_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_6, + ADRV904X_FEATURE_GPIO_CONTROL_OUT_MUX_JRX_READ_DATA_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_7, + ADRV904X_FEATURE_GPIO_CONTROL_OUT_MUX_JTX_READ_DATA_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_0, + ADRV904X_FEATURE_GPIO_CONTROL_OUT_MUX_JTX_READ_DATA_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_1, + ADRV904X_FEATURE_GPIO_CONTROL_OUT_MUX_JTX_READ_DATA_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_2, + ADRV904X_FEATURE_GPIO_CONTROL_OUT_MUX_JTX_READ_DATA_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_3, + ADRV904X_FEATURE_GPIO_CONTROL_OUT_MUX_JTX_READ_DATA_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_4, + ADRV904X_FEATURE_GPIO_CONTROL_OUT_MUX_JTX_READ_DATA_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_5, + ADRV904X_FEATURE_GPIO_CONTROL_OUT_MUX_JTX_READ_DATA_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_6, + ADRV904X_FEATURE_GPIO_CONTROL_OUT_MUX_JTX_READ_DATA_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_7, + ADRV904X_FEATURE_GPIO_CONTROL_UPDATE_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CONTROL_UPDATE_0, + ADRV904X_FEATURE_GPIO_CONTROL_UPDATE_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CONTROL_UPDATE_1, + ADRV904X_FEATURE_GPIO_CONTROL_UPDATE_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CONTROL_UPDATE_2, + ADRV904X_FEATURE_GPIO_CONTROL_UPDATE_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CONTROL_UPDATE_3, + ADRV904X_FEATURE_GPIO_MCS_CLK_IND_CORE = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MCS_CLK_IND_CORE, + ADRV904X_FEATURE_GPIO_REF_CLK = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_REF_CLK, + ADRV904X_FEATURE_GPIO_SPI_REG_ARM0_ERROR = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_SPI_REG_ARM0_ERROR, + ADRV904X_FEATURE_GPIO_SPI_REG_ARM1_ERROR = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_SPI_REG_ARM1_ERROR, + ADRV904X_FEATURE_GPIO_DIG_POWERGOOD = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DIG_POWERGOOD, + ADRV904X_FEATURE_GPIO_MASTER_BIAS_CLK = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MASTER_BIAS_CLK, + ADRV904X_FEATURE_GPIO_MBIAS_IGEN_PD_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MBIAS_IGEN_PD_0, + ADRV904X_FEATURE_GPIO_MBIAS_IGEN_PD_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MBIAS_IGEN_PD_1, + ADRV904X_FEATURE_GPIO_MBIAS_COMP_OUT_ANA_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MBIAS_COMP_OUT_ANA_0, + ADRV904X_FEATURE_GPIO_MBIAS_COMP_OUT_ANA_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MBIAS_COMP_OUT_ANA_1, + ADRV904X_FEATURE_GPIO_SPI_REG_MBIAS_IGEN_PTATR_TRIM_DONE_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_SPI_REG_MBIAS_IGEN_PTATR_TRIM_DONE_0, + ADRV904X_FEATURE_GPIO_SPI_REG_MBIAS_IGEN_PTATR_TRIM_DONE_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_SPI_REG_MBIAS_IGEN_PTATR_TRIM_DONE_1, + ADRV904X_FEATURE_GPIO_JRX_IRQ_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_0, + ADRV904X_FEATURE_GPIO_JRX_IRQ_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_1, + ADRV904X_FEATURE_GPIO_JRX_IRQ_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_2, + ADRV904X_FEATURE_GPIO_JRX_IRQ_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_3, + ADRV904X_FEATURE_GPIO_JRX_IRQ_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_4, + ADRV904X_FEATURE_GPIO_JRX_IRQ_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_5, + ADRV904X_FEATURE_GPIO_JRX_IRQ_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_6, + ADRV904X_FEATURE_GPIO_JRX_IRQ_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_7, + ADRV904X_FEATURE_GPIO_JRX_IRQ_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_8, + ADRV904X_FEATURE_GPIO_JRX_IRQ_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_9, + ADRV904X_FEATURE_GPIO_JRX_IRQ_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_10, + ADRV904X_FEATURE_GPIO_JRX_IRQ_11 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_11, + ADRV904X_FEATURE_GPIO_JRX_IRQ_12 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_12, + ADRV904X_FEATURE_GPIO_JRX_IRQ_13 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_13, + ADRV904X_FEATURE_GPIO_JTX_IRQ_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_0, + ADRV904X_FEATURE_GPIO_JTX_IRQ_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_1, + ADRV904X_FEATURE_GPIO_JTX_IRQ_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_2, + ADRV904X_FEATURE_GPIO_JTX_IRQ_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_3, + ADRV904X_FEATURE_GPIO_JTX_IRQ_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_4, + ADRV904X_FEATURE_GPIO_JTX_IRQ_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_5, + ADRV904X_FEATURE_GPIO_JTX_IRQ_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_6, + ADRV904X_FEATURE_GPIO_JTX_IRQ_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_7, + ADRV904X_FEATURE_GPIO_JTX_IRQ_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_8, + ADRV904X_FEATURE_GPIO_NEW_PHASE_TOGGLE = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NEW_PHASE_TOGGLE, + ADRV904X_FEATURE_GPIO_JESD_MCS_CLK_IND = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_JESD_MCS_CLK_IND, + ADRV904X_FEATURE_GPIO_SERDES_PLL_PLL_LOCKED = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_SERDES_PLL_PLL_LOCKED, + ADRV904X_FEATURE_GPIO_SERDES_PLL_VCO_COMP_OUT = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_SERDES_PLL_VCO_COMP_OUT, + ADRV904X_FEATURE_GPIO_POWER_ON_RESET_N = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_POWER_ON_RESET_N, + ADRV904X_FEATURE_GPIO_MISR_SIGNATURE_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_0, + ADRV904X_FEATURE_GPIO_MISR_SIGNATURE_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_1, + ADRV904X_FEATURE_GPIO_MISR_SIGNATURE_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_2, + ADRV904X_FEATURE_GPIO_MISR_SIGNATURE_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_3, + ADRV904X_FEATURE_GPIO_MISR_SIGNATURE_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_4, + ADRV904X_FEATURE_GPIO_MISR_SIGNATURE_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_5, + ADRV904X_FEATURE_GPIO_MISR_SIGNATURE_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_6, + ADRV904X_FEATURE_GPIO_MISR_SIGNATURE_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_7, + ADRV904X_FEATURE_GPIO_MISR_SIGNATURE_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_8, + ADRV904X_FEATURE_GPIO_MISR_SIGNATURE_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_9, + ADRV904X_FEATURE_GPIO_MISR_SIGNATURE_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_10, + ADRV904X_FEATURE_GPIO_MISR_SIGNATURE_11 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_11, + ADRV904X_FEATURE_GPIO_MISR_SIGNATURE_12 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_12, + ADRV904X_FEATURE_GPIO_MISR_SIGNATURE_13 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_13, + ADRV904X_FEATURE_GPIO_MISR_SIGNATURE_14 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_14, + ADRV904X_FEATURE_GPIO_MISR_SIGNATURE_15 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_15, + ADRV904X_FEATURE_GPIO_RX_SPI_SOURCE_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_0, + ADRV904X_FEATURE_GPIO_RX_SPI_SOURCE_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_1, + ADRV904X_FEATURE_GPIO_RX_SPI_SOURCE_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_2, + ADRV904X_FEATURE_GPIO_RX_SPI_SOURCE_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_3, + ADRV904X_FEATURE_GPIO_RX_SPI_SOURCE_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_4, + ADRV904X_FEATURE_GPIO_RX_SPI_SOURCE_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_5, + ADRV904X_FEATURE_GPIO_RX_SPI_SOURCE_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_6, + ADRV904X_FEATURE_GPIO_RX_SPI_SOURCE_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_7, + ADRV904X_FEATURE_GPIO_SLICER_POSITION_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_SLICER_POSITION_0, + ADRV904X_FEATURE_GPIO_SLICER_POSITION_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_SLICER_POSITION_1, + ADRV904X_FEATURE_GPIO_SLICER_POSITION_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_SLICER_POSITION_2, + ADRV904X_FEATURE_GPIO_SLICER_POSITION_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_SLICER_POSITION_3, + ADRV904X_FEATURE_GPIO_MCS_CLK_IND_RX = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MCS_CLK_IND_RX, + ADRV904X_FEATURE_GPIO_RFDC_UPDATE = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFDC_UPDATE, + ADRV904X_FEATURE_GPIO_SLICER_OVERFLOW = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_SLICER_OVERFLOW, + ADRV904X_FEATURE_GPIO_AGC_ADCOVRG_SEC_HIGH = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AGC_ADCOVRG_SEC_HIGH, + ADRV904X_FEATURE_GPIO_AGC_OVRG_SEC_HIGH_COUNTER_EXCEEDED = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AGC_OVRG_SEC_HIGH_COUNTER_EXCEEDED, + ADRV904X_FEATURE_GPIO_TIA_VALID = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_TIA_VALID, + ADRV904X_FEATURE_GPIO_RXFE_VALID = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RXFE_VALID, + ADRV904X_FEATURE_GPIO_RSSI_DECPWR_READY = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RSSI_DECPWR_READY, + ADRV904X_FEATURE_GPIO_PEAK_COUNT_EXCEEDED_QEC_ANA = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_PEAK_COUNT_EXCEEDED_QEC_ANA, + ADRV904X_FEATURE_GPIO_PEAK_COUNT_EXCEEDED_QEC_DIG = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_PEAK_COUNT_EXCEEDED_QEC_DIG, + ADRV904X_FEATURE_GPIO_RSSI_SYMBOL_READY = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RSSI_SYMBOL_READY, + ADRV904X_FEATURE_GPIO_RXON = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RXON, + ADRV904X_FEATURE_GPIO_ADC_OVERLOAD_RESET_ADC = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ADC_OVERLOAD_RESET_ADC, + ADRV904X_FEATURE_GPIO_RFDC_STATE_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFDC_STATE_0, + ADRV904X_FEATURE_GPIO_RFDC_STATE_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFDC_STATE_1, + ADRV904X_FEATURE_GPIO_RFDC_STATE_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFDC_STATE_2, + ADRV904X_FEATURE_GPIO_RFDC_STATE_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFDC_STATE_3, + ADRV904X_FEATURE_GPIO_RFDC_UPDATE_COUNTER_EXPIRED = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFDC_UPDATE_COUNTER_EXPIRED, + ADRV904X_FEATURE_GPIO_RFDC_MEASURE = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFDC_MEASURE, + ADRV904X_FEATURE_GPIO_RFDC_CAL_DONE = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFDC_CAL_DONE, + ADRV904X_FEATURE_GPIO_RFDC_MEASURE_COUNTER_EXPIRED = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RFDC_MEASURE_COUNTER_EXPIRED, + ADRV904X_FEATURE_GPIO_AGC_OVRG_LOW_INT1_COUNTER_EXCEEDED = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AGC_OVRG_LOW_INT1_COUNTER_EXCEEDED, + ADRV904X_FEATURE_GPIO_AGC_OVRG_LOW_INT0_COUNTER_EXCEEDED = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AGC_OVRG_LOW_INT0_COUNTER_EXCEEDED, + ADRV904X_FEATURE_GPIO_DIG_GAIN_SAT = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DIG_GAIN_SAT, + ADRV904X_FEATURE_GPIO_AGC_ADCOVRG_INT1_LOW = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AGC_ADCOVRG_INT1_LOW, + ADRV904X_FEATURE_GPIO_AGC_ADCOVRG_INT0_LOW = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AGC_ADCOVRG_INT0_LOW, + ADRV904X_FEATURE_GPIO_AGC_SL_STATE_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AGC_SL_STATE_0, + ADRV904X_FEATURE_GPIO_AGC_SL_STATE_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AGC_SL_STATE_1, + ADRV904X_FEATURE_GPIO_AGC_GAINUPDATE_COUNTER_EXPIRED = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AGC_GAINUPDATE_COUNTER_EXPIRED, + ADRV904X_FEATURE_GPIO_AGC_SL_LOW_TH_EXCEEDED = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AGC_SL_LOW_TH_EXCEEDED, + ADRV904X_FEATURE_GPIO_AGC_SL_HIGH_TH_EXCEEDED = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AGC_SL_HIGH_TH_EXCEEDED, + ADRV904X_FEATURE_GPIO_AGC_OVRG_LLB_COUNTER_EXCEEDED = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AGC_OVRG_LLB_COUNTER_EXCEEDED, + ADRV904X_FEATURE_GPIO_AGC_ADCOVRG_LOW = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AGC_ADCOVRG_LOW, + ADRV904X_FEATURE_GPIO_AGC_ADCOVRG_HIGH = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AGC_ADCOVRG_HIGH, + ADRV904X_FEATURE_GPIO_GT_GAIN_CHANGE = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GT_GAIN_CHANGE, + ADRV904X_FEATURE_GPIO_AGC_OVRG_ULB_COUNTER_EXCEEDED = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AGC_OVRG_ULB_COUNTER_EXCEEDED, + ADRV904X_FEATURE_GPIO_AGC_OVRG_LOW_COUNTER_EXCEEDED = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AGC_OVRG_LOW_COUNTER_EXCEEDED, + ADRV904X_FEATURE_GPIO_AGC_OVRG_HIGH_COUNTER_EXCEEDED = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AGC_OVRG_HIGH_COUNTER_EXCEEDED, + ADRV904X_FEATURE_GPIO_BAND_PEAK_COUNT_EXCEEDED_LOW_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_BAND_PEAK_COUNT_EXCEEDED_LOW_0, + ADRV904X_FEATURE_GPIO_BAND_PEAK_COUNT_EXCEEDED_LOW_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_BAND_PEAK_COUNT_EXCEEDED_LOW_1, + ADRV904X_FEATURE_GPIO_BAND_PEAK_COUNT_EXCEEDED_HIGH_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_BAND_PEAK_COUNT_EXCEEDED_HIGH_0, + ADRV904X_FEATURE_GPIO_BAND_PEAK_COUNT_EXCEEDED_HIGH_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_BAND_PEAK_COUNT_EXCEEDED_HIGH_1, + ADRV904X_FEATURE_GPIO_BAND_DECPWR_READY_TOGGLE_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_BAND_DECPWR_READY_TOGGLE_0, + ADRV904X_FEATURE_GPIO_BAND_DECPWR_READY_TOGGLE_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_BAND_DECPWR_READY_TOGGLE_1, + ADRV904X_FEATURE_GPIO_BAND_DECPWR_READY_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_BAND_DECPWR_READY_0, + ADRV904X_FEATURE_GPIO_BAND_DECPWR_READY_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_BAND_DECPWR_READY_1, + ADRV904X_FEATURE_GPIO_MCS_CLK_IND_TX = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MCS_CLK_IND_TX, + ADRV904X_FEATURE_GPIO_PA_PROT_SRERROR = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_PA_PROT_SRERROR, + ADRV904X_FEATURE_GPIO_PA_PROT_PPERROR_OR_APERROR = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_PA_PROT_PPERROR_OR_APERROR, + ADRV904X_FEATURE_GPIO_ATTEN_RAMP_UP_PROT = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ATTEN_RAMP_UP_PROT, + ADRV904X_FEATURE_GPIO_ATTEN_RAMP_DOWN_PROT = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ATTEN_RAMP_DOWN_PROT, + ADRV904X_FEATURE_GPIO_ATTEN_TDD_RAMP_DOWN = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ATTEN_TDD_RAMP_DOWN, + ADRV904X_FEATURE_GPIO_ATTEN_TDD_RAMP_UP = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ATTEN_TDD_RAMP_UP, + ADRV904X_FEATURE_GPIO_ATTEN_LATCH_EN = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ATTEN_LATCH_EN, + ADRV904X_FEATURE_GPIO_DTX_POWER_UP_TRIGGER = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DTX_POWER_UP_TRIGGER, + ADRV904X_FEATURE_GPIO_DTX_POWER_DOWN_TRIGGER = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DTX_POWER_DOWN_TRIGGER, + ADRV904X_FEATURE_GPIO_TX_GAIN_CHANGE = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_TX_GAIN_CHANGE, + ADRV904X_FEATURE_GPIO_TX_POWER_READY = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_TX_POWER_READY, + ADRV904X_FEATURE_GPIO_PA_PROT_SRD_IRQ = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_PA_PROT_SRD_IRQ, + ADRV904X_FEATURE_GPIO_TX_TSSI_DUC0_READY = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_TX_TSSI_DUC0_READY, + ADRV904X_FEATURE_GPIO_ADC_SAMPLE_OVR = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ADC_SAMPLE_OVR, + ADRV904X_FEATURE_GPIO_MCS_CLK_IND_ORX = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_MCS_CLK_IND_ORX, + ADRV904X_FEATURE_GPIO_ORX_ON = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ORX_ON, + ADRV904X_FEATURE_GPIO_DECPWR_READY = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DECPWR_READY, + ADRV904X_FEATURE_GPIO_ANY_ADC_SAMPLE_OVR = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANY_ADC_SAMPLE_OVR, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_0, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_1, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_2, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_3, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_4, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_5, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_6, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_7, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_8, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_9, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_10, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_11 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_11, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_12 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_12, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_13 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_13, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_14 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_14, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_15 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_15, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_16 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_16, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_17 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_17, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_18 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_18, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_19 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_19, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_20 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_20, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_21 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_21, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_22 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_22, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_PIN_23 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_23, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_0, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_1, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_2, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_3, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_4, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_5, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_6, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_7, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_8, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_9, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_10, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_11 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_11, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_12 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_12, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_13 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_13, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_14 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_14, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_15 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_15, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_16 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_16, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_17 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_17, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_18 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_18, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_19 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_19, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_20 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_20, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_21 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_21, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_22 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_22, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_DIGITAL_OUT_23 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_23, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_ANALOG_OUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_0, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_ANALOG_OUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_1, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_ANALOG_OUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_2, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_ANALOG_OUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_3, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_ANALOG_OUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_4, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_ANALOG_OUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_5, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_ANALOG_OUT_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_6, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_ANALOG_OUT_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_7, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_ANALOG_OUT_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_8, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_ANALOG_OUT_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_9, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_ANALOG_OUT_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_10, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_ANALOG_OUT_11 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_11, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_ANALOG_OUT_12 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_12, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_ANALOG_OUT_13 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_13, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_ANALOG_OUT_14 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_14, + ADRV904X_FEATURE_GPIO_GPIO_STREAM_PROC_ANALOG_OUT_15 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_15, + ADRV904X_FEATURE_GPIO_PPI16_PEB = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_PPI16_PEB, + ADRV904X_FEATURE_GPIO_PPI16_CLK = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_PPI16_CLK, + ADRV904X_FEATURE_GPIO_PPI16_PDI_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_0, + ADRV904X_FEATURE_GPIO_PPI16_PDI_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_1, + ADRV904X_FEATURE_GPIO_PPI16_PDI_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_2, + ADRV904X_FEATURE_GPIO_PPI16_PDI_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_3, + ADRV904X_FEATURE_GPIO_PPI16_PDI_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_4, + ADRV904X_FEATURE_GPIO_PPI16_PDI_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_5, + ADRV904X_FEATURE_GPIO_PPI16_PDI_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_6, + ADRV904X_FEATURE_GPIO_PPI16_PDI_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_7, + ADRV904X_FEATURE_GPIO_PPI16_PDI_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_8, + ADRV904X_FEATURE_GPIO_PPI16_PDI_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_9, + ADRV904X_FEATURE_GPIO_PPI16_PDI_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_10, + ADRV904X_FEATURE_GPIO_PPI16_PDI_11 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_11, + ADRV904X_FEATURE_GPIO_PPI16_PDI_12 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_12, + ADRV904X_FEATURE_GPIO_PPI16_PDI_13 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_13, + ADRV904X_FEATURE_GPIO_PPI16_PDI_14 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_14, + ADRV904X_FEATURE_GPIO_PPI16_PDI_15 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_15, + ADRV904X_FEATURE_GPIO_ADC_TEST_GEN_ENABLE = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ADC_TEST_GEN_ENABLE, + ADRV904X_FEATURE_GPIO_AGC_GAIN_CHANGE = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AGC_GAIN_CHANGE, + ADRV904X_FEATURE_GPIO_AGC_DEC_GAIN = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AGC_DEC_GAIN, + ADRV904X_FEATURE_GPIO_AGC_INC_GAIN = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AGC_INC_GAIN, + ADRV904X_FEATURE_GPIO_AGC_SLOWLOOP_FREEZE_ENABLE = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AGC_SLOWLOOP_FREEZE_ENABLE, + ADRV904X_FEATURE_GPIO_AGC_MANUAL_GAIN_LOCK = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_AGC_MANUAL_GAIN_LOCK, + ADRV904X_FEATURE_GPIO_SELECT_S1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_SELECT_S1, + ADRV904X_FEATURE_GPIO_DTX_FORCE_PIN = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DTX_FORCE_PIN, + ADRV904X_FEATURE_GPIO_TX_ATTEN_UPD_GPIO = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_TX_ATTEN_UPD_GPIO, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_OUTPUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_0, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_OUTPUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_1, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_OUTPUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_2, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_OUTPUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_3, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_OUTPUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_4, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_OUTPUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_5, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_OUTPUT_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_6, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_OUTPUT_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_7, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_OUTPUT_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_8, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_OUTPUT_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_9, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_OUTPUT_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_10, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_OUTPUT_11 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_11, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_OUTPUT_12 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_12, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_OUTPUT_13 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_13, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_OUTPUT_14 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_14, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_OUTPUT_15 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_15, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_INPUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_0, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_INPUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_1, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_INPUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_2, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_INPUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_3, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_INPUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_4, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_INPUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_5, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_INPUT_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_6, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_INPUT_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_7, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_INPUT_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_8, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_INPUT_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_9, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_INPUT_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_10, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_INPUT_11 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_11, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_INPUT_12 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_12, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_INPUT_13 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_13, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_INPUT_14 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_14, + ADRV904X_FEATURE_GPIO_ANALOG_MANUAL_MODE_INPUT_15 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_15, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_OUTPUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_0, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_OUTPUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_1, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_OUTPUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_2, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_OUTPUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_3, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_OUTPUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_4, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_OUTPUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_5, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_OUTPUT_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_6, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_OUTPUT_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_7, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_OUTPUT_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_8, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_OUTPUT_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_9, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_OUTPUT_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_10, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_OUTPUT_11 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_11, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_OUTPUT_12 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_12, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_OUTPUT_13 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_13, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_OUTPUT_14 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_14, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_OUTPUT_15 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_15, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_INPUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_0, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_INPUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_1, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_INPUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_2, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_INPUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_3, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_INPUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_4, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_INPUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_5, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_INPUT_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_6, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_INPUT_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_7, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_INPUT_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_8, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_INPUT_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_9, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_INPUT_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_10, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_INPUT_11 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_11, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_INPUT_12 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_12, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_INPUT_13 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_13, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_INPUT_14 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_14, + ADRV904X_FEATURE_GPIO_ANALOG_ARM_INPUT_15 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_15, + ADRV904X_FEATURE_GPIO_RX0_EXT_CONTROL_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX0_EXT_CONTROL_0, + ADRV904X_FEATURE_GPIO_RX0_EXT_CONTROL_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX0_EXT_CONTROL_1, + ADRV904X_FEATURE_GPIO_RX1_EXT_CONTROL_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX1_EXT_CONTROL_0, + ADRV904X_FEATURE_GPIO_RX1_EXT_CONTROL_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX1_EXT_CONTROL_1, + ADRV904X_FEATURE_GPIO_RX2_EXT_CONTROL_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX2_EXT_CONTROL_0, + ADRV904X_FEATURE_GPIO_RX2_EXT_CONTROL_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX2_EXT_CONTROL_1, + ADRV904X_FEATURE_GPIO_RX3_EXT_CONTROL_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX3_EXT_CONTROL_0, + ADRV904X_FEATURE_GPIO_RX3_EXT_CONTROL_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX3_EXT_CONTROL_1, + ADRV904X_FEATURE_GPIO_RX4_EXT_CONTROL_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX4_EXT_CONTROL_0, + ADRV904X_FEATURE_GPIO_RX4_EXT_CONTROL_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX4_EXT_CONTROL_1, + ADRV904X_FEATURE_GPIO_RX5_EXT_CONTROL_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX5_EXT_CONTROL_0, + ADRV904X_FEATURE_GPIO_RX5_EXT_CONTROL_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX5_EXT_CONTROL_1, + ADRV904X_FEATURE_GPIO_RX6_EXT_CONTROL_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX6_EXT_CONTROL_0, + ADRV904X_FEATURE_GPIO_RX6_EXT_CONTROL_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX6_EXT_CONTROL_1, + ADRV904X_FEATURE_GPIO_RX7_EXT_CONTROL_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX7_EXT_CONTROL_0, + ADRV904X_FEATURE_GPIO_RX7_EXT_CONTROL_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX7_EXT_CONTROL_1, + ADRV904X_FEATURE_GPIO_RX0_DUALBAND_CONTROL_BAND0_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND0_0, + ADRV904X_FEATURE_GPIO_RX0_DUALBAND_CONTROL_BAND0_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND0_1, + ADRV904X_FEATURE_GPIO_RX0_DUALBAND_CONTROL_BAND1_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND1_0, + ADRV904X_FEATURE_GPIO_RX0_DUALBAND_CONTROL_BAND1_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND1_1, + ADRV904X_FEATURE_GPIO_RX1_DUALBAND_CONTROL_BAND0_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX1_DUALBAND_CONTROL_BAND0_0, + ADRV904X_FEATURE_GPIO_RX1_DUALBAND_CONTROL_BAND0_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX1_DUALBAND_CONTROL_BAND0_1, + ADRV904X_FEATURE_GPIO_RX1_DUALBAND_CONTROL_BAND1_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX1_DUALBAND_CONTROL_BAND1_0, + ADRV904X_FEATURE_GPIO_RX1_DUALBAND_CONTROL_BAND1_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX1_DUALBAND_CONTROL_BAND1_1, + ADRV904X_FEATURE_GPIO_RX4_DUALBAND_CONTROL_BAND0_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX4_DUALBAND_CONTROL_BAND0_0, + ADRV904X_FEATURE_GPIO_RX4_DUALBAND_CONTROL_BAND0_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX4_DUALBAND_CONTROL_BAND0_1, + ADRV904X_FEATURE_GPIO_RX4_DUALBAND_CONTROL_BAND1_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX4_DUALBAND_CONTROL_BAND1_0, + ADRV904X_FEATURE_GPIO_RX4_DUALBAND_CONTROL_BAND1_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX4_DUALBAND_CONTROL_BAND1_1, + ADRV904X_FEATURE_GPIO_RX5_DUALBAND_CONTROL_BAND0_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX5_DUALBAND_CONTROL_BAND0_0, + ADRV904X_FEATURE_GPIO_RX5_DUALBAND_CONTROL_BAND0_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX5_DUALBAND_CONTROL_BAND0_1, + ADRV904X_FEATURE_GPIO_RX5_DUALBAND_CONTROL_BAND1_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX5_DUALBAND_CONTROL_BAND1_0, + ADRV904X_FEATURE_GPIO_RX5_DUALBAND_CONTROL_BAND1_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX5_DUALBAND_CONTROL_BAND1_1, + ADRV904X_FEATURE_GPIO_RX2_DUALBAND_CONTROL_BAND0_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX2_DUALBAND_CONTROL_BAND0_0, + ADRV904X_FEATURE_GPIO_RX2_DUALBAND_CONTROL_BAND0_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX2_DUALBAND_CONTROL_BAND0_1, + ADRV904X_FEATURE_GPIO_RX2_DUALBAND_CONTROL_BAND1_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX2_DUALBAND_CONTROL_BAND1_0, + ADRV904X_FEATURE_GPIO_RX2_DUALBAND_CONTROL_BAND1_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX2_DUALBAND_CONTROL_BAND1_1, + ADRV904X_FEATURE_GPIO_RX3_DUALBAND_CONTROL_BAND0_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX3_DUALBAND_CONTROL_BAND0_0, + ADRV904X_FEATURE_GPIO_RX3_DUALBAND_CONTROL_BAND0_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX3_DUALBAND_CONTROL_BAND0_1, + ADRV904X_FEATURE_GPIO_RX3_DUALBAND_CONTROL_BAND1_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX3_DUALBAND_CONTROL_BAND1_0, + ADRV904X_FEATURE_GPIO_RX3_DUALBAND_CONTROL_BAND1_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX3_DUALBAND_CONTROL_BAND1_1, + ADRV904X_FEATURE_GPIO_RX6_DUALBAND_CONTROL_BAND0_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX6_DUALBAND_CONTROL_BAND0_0, + ADRV904X_FEATURE_GPIO_RX6_DUALBAND_CONTROL_BAND0_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX6_DUALBAND_CONTROL_BAND0_1, + ADRV904X_FEATURE_GPIO_RX6_DUALBAND_CONTROL_BAND1_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX6_DUALBAND_CONTROL_BAND1_0, + ADRV904X_FEATURE_GPIO_RX6_DUALBAND_CONTROL_BAND1_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX6_DUALBAND_CONTROL_BAND1_1, + ADRV904X_FEATURE_GPIO_RX7_DUALBAND_CONTROL_BAND0_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX7_DUALBAND_CONTROL_BAND0_0, + ADRV904X_FEATURE_GPIO_RX7_DUALBAND_CONTROL_BAND0_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX7_DUALBAND_CONTROL_BAND0_1, + ADRV904X_FEATURE_GPIO_RX7_DUALBAND_CONTROL_BAND1_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX7_DUALBAND_CONTROL_BAND1_0, + ADRV904X_FEATURE_GPIO_RX7_DUALBAND_CONTROL_BAND1_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RX7_DUALBAND_CONTROL_BAND1_1, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_SSB_SYNC = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_SSB_SYNC, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_0, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_1, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_2, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_3, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_4, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_5, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_6, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_7, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_8, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_9, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_10, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_11 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_11, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_12 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_12, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_13 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_13, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_14 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_14, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_15 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_15, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_16 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_16, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_17 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_17, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_18 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_18, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_19 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_19, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_20 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_20, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_21 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_21, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_22 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_22, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_DIGITAL_OUT_23 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_23, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_ANALOG_OUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_0, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_ANALOG_OUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_1, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_ANALOG_OUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_2, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_ANALOG_OUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_3, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_ANALOG_OUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_4, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_ANALOG_OUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_5, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_ANALOG_OUT_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_6, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_ANALOG_OUT_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_7, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_ANALOG_OUT_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_8, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_ANALOG_OUT_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_9, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_ANALOG_OUT_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_10, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_ANALOG_OUT_11 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_11, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_ANALOG_OUT_12 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_12, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_ANALOG_OUT_13 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_13, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_ANALOG_OUT_14 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_14, + ADRV904X_FEATURE_GPIO_RADIO_SEQ_ANALOG_OUT_15 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_15, + ADRV904X_FEATURE_GPIO_CDDC_RSSI_ENABLE = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_ENABLE, + ADRV904X_FEATURE_GPIO_CDDC_RSSI_READY_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_0, + ADRV904X_FEATURE_GPIO_CDDC_RSSI_READY_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_1, + ADRV904X_FEATURE_GPIO_CDDC_RSSI_READY_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_2, + ADRV904X_FEATURE_GPIO_CDDC_RSSI_READY_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_3, + ADRV904X_FEATURE_GPIO_CDDC_RSSI_READY_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_4, + ADRV904X_FEATURE_GPIO_CDDC_RSSI_READY_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_5, + ADRV904X_FEATURE_GPIO_CDDC_RSSI_READY_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_6, + ADRV904X_FEATURE_GPIO_CDDC_RSSI_READY_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_7, + ADRV904X_FEATURE_GPIO_TX_TSSI_DUC1_READY = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_TX_TSSI_DUC1_READY, + ADRV904X_FEATURE_GPIO_CDUC_TSSI_READY_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_0, + ADRV904X_FEATURE_GPIO_CDUC_TSSI_READY_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_1, + ADRV904X_FEATURE_GPIO_CDUC_TSSI_READY_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_2, + ADRV904X_FEATURE_GPIO_CDUC_TSSI_READY_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_3, + ADRV904X_FEATURE_GPIO_CDUC_TSSI_READY_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_4, + ADRV904X_FEATURE_GPIO_CDUC_TSSI_READY_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_5, + ADRV904X_FEATURE_GPIO_CDUC_TSSI_READY_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_6, + ADRV904X_FEATURE_GPIO_CDUC_TSSI_READY_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_7, + ADRV904X_FEATURE_GPIO_TX_DPD_IN_POWER_READY = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_TX_DPD_IN_POWER_READY, + ADRV904X_FEATURE_GPIO_TX_DPD_OUT_POWER_READY = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_TX_DPD_OUT_POWER_READY, + ADRV904X_FEATURE_GPIO_TX_DFE_TSSI_READY_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_TX_DFE_TSSI_READY_1, + ADRV904X_FEATURE_GPIO_TX_DFE_TSSI_READY_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_TX_DFE_TSSI_READY_2, + ADRV904X_FEATURE_GPIO_DFE_UART0_PADRXSIN = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_UART0_PADRXSIN, + ADRV904X_FEATURE_GPIO_DFE_UART0_PADCTS = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_UART0_PADCTS, + ADRV904X_FEATURE_GPIO_DFE_UART0_PADRTSOUT = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_UART0_PADRTSOUT, + ADRV904X_FEATURE_GPIO_DFE_UART0_PADTXSOUT = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_UART0_PADTXSOUT, + ADRV904X_FEATURE_GPIO_DFE_ARM_TRST = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_ARM_TRST, + ADRV904X_FEATURE_GPIO_DFE_ARM_TDO_SWO_MUX = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_ARM_TDO_SWO_MUX, + ADRV904X_FEATURE_GPIO_DFE_ARM_TDI = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_ARM_TDI, + ADRV904X_FEATURE_GPIO_DFE_ARM_TMS = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_ARM_TMS, + ADRV904X_FEATURE_GPIO_DFE_ARM_TCK = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_ARM_TCK, + ADRV904X_FEATURE_GPIO_NOOP_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_0, + ADRV904X_FEATURE_GPIO_NOOP_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_1, + ADRV904X_FEATURE_GPIO_NOOP_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_2, + ADRV904X_FEATURE_GPIO_NOOP_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_3, + ADRV904X_FEATURE_GPIO_NOOP_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_4, + ADRV904X_FEATURE_GPIO_NOOP_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_5, + ADRV904X_FEATURE_GPIO_NOOP_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_6, + ADRV904X_FEATURE_GPIO_NOOP_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_7, + ADRV904X_FEATURE_GPIO_NOOP_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_8, + ADRV904X_FEATURE_GPIO_NOOP_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_9, + ADRV904X_FEATURE_GPIO_NOOP_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_10, + ADRV904X_FEATURE_GPIO_NOOP_11 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_11, + ADRV904X_FEATURE_GPIO_NOOP_12 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_12, + ADRV904X_FEATURE_GPIO_NOOP_13 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_13, + ADRV904X_FEATURE_GPIO_NOOP_14 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_14, + ADRV904X_FEATURE_GPIO_NOOP_15 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_15, + ADRV904X_FEATURE_GPIO_NOOP_16 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_16, + ADRV904X_FEATURE_GPIO_NOOP_17 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_17, + ADRV904X_FEATURE_GPIO_NOOP_18 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_18, + ADRV904X_FEATURE_GPIO_NOOP_19 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_19, + ADRV904X_FEATURE_GPIO_NOOP_20 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_20, + ADRV904X_FEATURE_GPIO_NOOP_21 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_21, + ADRV904X_FEATURE_GPIO_NOOP_22 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_22, + ADRV904X_FEATURE_GPIO_NOOP_23 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_NOOP_23, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_0, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_1, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_2, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_3, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_4, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_5, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_6, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_7, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_8, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_9, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_10, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_11 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_11, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_12 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_12, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_13 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_13, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_14 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_14, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_15 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_15, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_16 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_16, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_17 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_17, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_18 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_18, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_19 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_19, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_20 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_20, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_21 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_21, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_22 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_22, + ADRV904X_FEATURE_GPIO_DFE_CTRL_OUTPUT_23 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_23, + ADRV904X_FEATURE_GPIO_ANALOG_DFE_CTRL_OUTPUT_0 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_0, + ADRV904X_FEATURE_GPIO_ANALOG_DFE_CTRL_OUTPUT_1 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_1, + ADRV904X_FEATURE_GPIO_ANALOG_DFE_CTRL_OUTPUT_2 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_2, + ADRV904X_FEATURE_GPIO_ANALOG_DFE_CTRL_OUTPUT_3 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_3, + ADRV904X_FEATURE_GPIO_ANALOG_DFE_CTRL_OUTPUT_4 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_4, + ADRV904X_FEATURE_GPIO_ANALOG_DFE_CTRL_OUTPUT_5 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_5, + ADRV904X_FEATURE_GPIO_ANALOG_DFE_CTRL_OUTPUT_6 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_6, + ADRV904X_FEATURE_GPIO_ANALOG_DFE_CTRL_OUTPUT_7 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_7, + ADRV904X_FEATURE_GPIO_ANALOG_DFE_CTRL_OUTPUT_8 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_8, + ADRV904X_FEATURE_GPIO_ANALOG_DFE_CTRL_OUTPUT_9 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_9, + ADRV904X_FEATURE_GPIO_ANALOG_DFE_CTRL_OUTPUT_10 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_10, + ADRV904X_FEATURE_GPIO_ANALOG_DFE_CTRL_OUTPUT_11 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_11, + ADRV904X_FEATURE_GPIO_ANALOG_DFE_CTRL_OUTPUT_12 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_12, + ADRV904X_FEATURE_GPIO_ANALOG_DFE_CTRL_OUTPUT_13 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_13, + ADRV904X_FEATURE_GPIO_ANALOG_DFE_CTRL_OUTPUT_14 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_14, + ADRV904X_FEATURE_GPIO_ANALOG_DFE_CTRL_OUTPUT_15 = GPIO_SIGNAL_FEATURE | ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_15, + /***Please add Feature IDs which use shared resources above this line***/ + ADRV904X_NUM_FEATURES, + ADRV904X_FEATURE_INVALID +} adrv904x_FeatureID_e; + +typedef struct adrv904x_SharedResourceLut +{ + adrv904x_SharedResourceType_e sharedResourceType; /*!< Specifies the type of shared resource for a Look Up Table entry*/ + int32_t sharedResource; /*!< Specifies the shared resource value associated with the type for a Look Up Table entry*/ + adrv904x_SharedResourceID_e sharedResourceId; /*!< Specifies the unique shared resource ID associated with the shared resource for a Look Up Table entry*/ +} adrv904x_SharedResourceLut_t; + +#endif /* ! _adrv904x_SHARED_RESOURCE_MANAGER_TYPES_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_stream_id_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_stream_id_types.h new file mode 100644 index 00000000000..89860159fc8 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_stream_id_types.h @@ -0,0 +1,103 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2023 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file + * + * \brief Contains ADRV904X stream id definitions + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_STREAM_ID_H__ +#define __ADRV904X_STREAM_ID_H__ + +#define ADRV904X_STREAM_ID__CORE__RADIO_SEQ_RISE_EVENT_00 (128U) +#define ADRV904X_STREAM_ID__CORE__RADIO_SEQ_RISE_EVENT_01 (129U) +#define ADRV904X_STREAM_ID__CORE__SBET_CLEAR_CAP_REQUEST_FOR_BUF0 (136U) /* Use what was RADIO_SEQ_RISE_EVENT_08.This stream need to be always defined because it's used by SDK */ +#define ADRV904X_STREAM_ID__CORE__UNUSED0 (138U) /* When SBET Enabled: Use what was RADIO_SEQ_RISE_EVENT_10. Currently unused */ +#define ADRV904X_STREAM_ID__CORE__SBET_CLEAR_CAP_REQUEST_FOR_BUF1 (168U) /* Use what was RADIO_SEQ_FALL_EVENT_08.This stream need to be always defined because it's used by SDK */ +#define ADRV904X_STREAM_ID__CORE__UNUSED2 (170U) /* When SBET Enabled: Use what was RADIO_SEQ_FALL_EVENT_10. Currently unused */ +#define ADRV904X_STREAM_ID__CORE__ANT_CAL_SET_OUTPUT_GPIO_SECONDARY_PATH_NORMAL_OPERATION (172U) /* Use what was RADIO_SEQ_FALL_EVENT_12 */ +#define ADRV904X_STREAM_ID__CORE__ANT_CAL_SET_OUTPUT_GPIO_SECONDARY_PATH_UL_CAL (173U) /* Use what was RADIO_SEQ_FALL_EVENT_13 */ +#define ADRV904X_STREAM_ID__CORE__ANT_CAL_SET_OUTPUT_GPIO_SECONDARY_PATH_DL_CAL (174U) /* Use what was RADIO_SEQ_FALL_EVENT_14 */ +/* The RS Fall Events 15 to 31 (Streams 175 to 191) will not be used as initially planned and they're re-purposed as custom streams */ +#define ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_IMMEDIATE_SET_ATTEN_ORX0 (105U) +#define ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_IMMEDIATE_SET_ATTEN_ORX1 (106U) +#define ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_IMMEDIATE_SET_NCO_ORX0 (107U) +#define ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_IMMEDIATE_SET_NCO_ORX1 (108U) +#define ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_CFG_GPIO_PIN_STATE_FOR_ORX0 (109U) +#define ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_CFG_GPIO_PIN_STATE_FOR_ORX1 (110U) +#define ADRV904X_STREAM_ID__CORE__EA_CLEAR_HDLR_STRM (111U) +#define ADRV904X_STREAM_ID__CORE__POWERUP (124U) +#define ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_API_TRIGGER (125U) +#define ADRV904X_STREAM_ID__CORE__DFE_ACT_LUT_COPY_TX_REQUEST_SET (144U) +#define ADRV904X_STREAM_ID__CORE__DFE_ACT_LUT_COPY_TX_IN_PROGRESS_CLEAR (145U) +#define ADRV904X_STREAM_ID__CORE__EA_UPDATE_ALARM_OUTPUTS_STRM (153U) +#define ADRV904X_STREAM_ID__CORE__TRIGGER_TX_STREAM_USED_BY_DFE (156U) +#define ADRV904X_STREAM_ID__CORE__TRIGGER_RX_STREAM_USED_BY_DFE (157U) +#define ADRV904X_STREAM_ID__CORE__SBET_UPDATE_POWER_INDEX_FROM_CIRCULAR_BUF (159U) /* When SBET Enabled */ +#define ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_CFG_GPIO_ALL_OFF_PIN_STATE_FOR_ORX0 (180U) +#define ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_CFG_GPIO_ALL_OFF_PIN_STATE_FOR_ORX1 (181U) +#define ADRV904X_STREAM_ID__CORE__SBET_UPDATE_DPD_INDEX (188U) /* When SBET Enabled */ +#define ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_ORX_ATT_TABLE_UPDATE (202U) +#define ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_ORX_NCO_FREQ_TABLE_UPDATE (203U) +#define ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_ONLY_LOL_NCO_FREQ_TABLE_UPDATE (204U) +#define ADRV904X_STREAM_ID__CORE__EA_OC_FUSE_EN_SET_STRM (221U) +#define ADRV904X_STREAM_ID__CORE__CLGC_POWER_METERS_RESTART_ORX0 (226U) +#define ADRV904X_STREAM_ID__CORE__CLGC_POWER_METERS_RESTART_ORX1 (227U) +#define ADRV904X_STREAM_ID__CORE__UPDATE_SLICE_SCRATCHPAD_REG (229U) +#define ADRV904X_STREAM_ID__CORE__TRIGGER_TX_STREAM (236U) +#define ADRV904X_STREAM_ID__CORE__TRIGGER_RX_STREAM (237U) +#define ADRV904X_STREAM_ID__CORE__ANT_CAL_SET_OUTPUT_GPIO_MAIN_PATH_NORMAL_OPERATION (243U) +#define ADRV904X_STREAM_ID__CORE__ANT_CAL_SET_OUTPUT_GPIO_MAIN_PATH_UL_CAL (244U) +#define ADRV904X_STREAM_ID__CORE__ANT_CAL_SET_OUTPUT_GPIO_MAIN_PATH_DL_CAL (245U) +#define ADRV904X_STREAM_ID__TX__DPD_MODEL_SWITCH_PREPARE_0 (8U) /* When SBET Disabled: Use what was TX__RADIO_SEQ_RISE_4 */ +#define ADRV904X_STREAM_ID__TX__DPD_MODEL_SWITCH_PREPARE_1 (9U) /* When SBET Disabled: Use what was TX__RADIO_SEQ_RISE_5 */ +#define ADRV904X_STREAM_ID__TX__DPD_MODEL_SWITCH_PREPARE_2 (10U) /* When SBET Disabled: Use what was TX__RADIO_SEQ_RISE_6 */ +#define ADRV904X_STREAM_ID__TX__DPD_MODEL_SWITCH_PREPARE_3 (11U) /* When SBET Disabled: Use what was TX__RADIO_SEQ_RISE_7 */ +#define ADRV904X_STREAM_ID__TX__DPD_MODEL_SWITCH_PREPARE_4 (12U) /* When SBET Disabled: Use what was TX__RADIO_SEQ_FALL_0 */ +#define ADRV904X_STREAM_ID__TX__TX_SET_INIT_CAL_RUNNING_BIT (17U) /* Use what was TX__RADIO_SEQ_FALL_5 */ +#define ADRV904X_STREAM_ID__TX__TX_CLR_INIT_CAL_RUNNING_BIT (18U) /* Use what was TX__RADIO_SEQ_FALL_6 */ +#define ADRV904X_STREAM_ID__TX__DTX_MANUAL_ACTIVATE (36U) +#define ADRV904X_STREAM_ID__TX__DTX_MANUAL_DEACTIVATE (37U) +#define ADRV904X_STREAM_ID__TX__TX_LOOPBACK1_ENABLE_REQUEST (41U) +#define ADRV904X_STREAM_ID__TX__TX_LOOPBACK1_DISABLE_REQUEST (42U) +#define ADRV904X_STREAM_ID__TX__TX_LOOPBACK2_ENABLE_REQUEST (43U) +#define ADRV904X_STREAM_ID__TX__TX_LOOPBACK2_DISABLE_REQUEST (44U) +#define ADRV904X_STREAM_ID__TX__DPD_MODEL_SWITCH_TX_FALL_SET (52U) +#define ADRV904X_STREAM_ID__TX__TXLB_ADC_RAMP_ENABLE (53U) +#define ADRV904X_STREAM_ID__TX__TXLB_ADC_RAMP_DISABLE (54U) +#define ADRV904X_STREAM_ID__TX__DPD_MODEL_SWITCH_TX_FALL_CLEAR (57U) +#define ADRV904X_STREAM_ID__TX__WRITE_DTX_MODE_CONFIG (63U) +#define ADRV904X_STREAM_ID__TX__SET_CAPTURE_TRIGGER_BIT (64U) +#define ADRV904X_STREAM_ID__TX__CLEAR_CAPTURE_TRIGGER_BIT (65U) +#define ADRV904X_STREAM_ID__TX__SET_IMMEDIATE_CAPTURE_ENABLE_BIT (66U) +#define ADRV904X_STREAM_ID__TX__SET_CAPTURE_PENDING_BIT (67U) +#define ADRV904X_STREAM_ID__TX__CLEAR_CAPTURE_PENDING_BIT (68U) +#define ADRV904X_STREAM_ID__TX__PA_PROT_RECOVERY (85U) +#define ADRV904X_STREAM_ID__TX__WRITE_DTX_MODE_CONFIG_CLRSTATUS (87U) +#define ADRV904X_STREAM_ID__TX__CFR_CFG_SET_CHANGE_REQ (88U) +#define ADRV904X_STREAM_ID__RX__RX_CUSTOM_RISE (21U) +#define ADRV904X_STREAM_ID__RX__RX_CUSTOM_FALL (22U) +#define ADRV904X_STREAM_ID__RX__RX_SET_DDC0_RSSI_REQ_FLAG (36U) +#define ADRV904X_STREAM_ID__RX__RX_SET_DDC1_RSSI_REQ_FLAG (37U) +#define ADRV904X_STREAM_ID__ORX__ORX_ADC_RAMP_ENABLE (33U) +#define ADRV904X_STREAM_ID__ORX__ORX_ADC_RAMP_DISABLE (34U) +#define ADRV904X_STREAM_ID__ORX__ORX_ADC_STBY (37U) +#define ADRV904X_STREAM_ID__ORX__ORX_ADC_STBY_EN (38U) +#define ADRV904X_STREAM_ID__ORX__ORX_ADC_STBY_DIS (39U) +#define ADRV904X_STREAM_ID__ORX__ORX_ADC_NOT_STBY (40U) + +/* !!! This dummy stream must be the last stream!!! */ +#define ADRV904X_STREAM_ID__ORX__ORX_DUMMY (41U) + +#define ADRV904X_STREAM_ID__ORX__ORX_CUSTOM_RISE (21U) +#define ADRV904X_STREAM_ID__ORX__ORX_CUSTOM_FALL (22U) +#endif /* __ADRV904X_STREAMID_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_stream_proc_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_stream_proc_types.h new file mode 100644 index 00000000000..0b2fad82111 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_stream_proc_types.h @@ -0,0 +1,116 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2023 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adrv904x_stream_proc_types.h + * + * \brief Contains ADRV904X stream process macros and enums. + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_STREAM_PROC_TYPES_H__ +#define __ADRV904X_STREAM_PROC_TYPES_H__ + + + +#include "adrv904x_stream_id_types.h" + + +#define ADRV904X_STREAM_NUM_RX_SLICE (8) +#define ADRV904X_STREAM_NUM_TX_SLICE (8) +#define ADRV904X_STREAM_NUM_ORX_SLICE (2) +#define ADRV904X_STREAM_NUM_MAIN_SLICE (1) + +typedef enum +{ + ADRV904X_STREAM_ORX_ADC_DAC_ENABLE_RAMP = ADRV904X_STREAM_ID__ORX__ORX_ADC_RAMP_ENABLE, /*!< Custom stream: Enable ORx DAC ramp */ + ADRV904X_STREAM_ORX_ADC_DAC_DISABLE_RAMP = ADRV904X_STREAM_ID__ORX__ORX_ADC_RAMP_DISABLE, /*!< Custom stream: Disable ORx DAC ramp */ + ADRV904X_STREAM_ORX_CUSTOM_RISE = ADRV904X_STREAM_ID__ORX__ORX_CUSTOM_RISE, /*!< Not defined yet */ + ADRV904X_STREAM_ORX_CUSTOM_FALL = ADRV904X_STREAM_ID__ORX__ORX_CUSTOM_FALL, /*!< Not defined yet */ + ADRV904X_STREAM_ORX_ADC_STBY_EN = ADRV904X_STREAM_ID__ORX__ORX_ADC_STBY_EN, /*!< Custom stream: Put ORx ADC into Standby */ + ADRV904X_STREAM_ORX_ADC_STBY_DIS = ADRV904X_STREAM_ID__ORX__ORX_ADC_STBY_DIS, /*!< Custom stream: Take ORx ADC out of Standby */ +} adrv904x_StreamOrxCustomStreams_e; + +typedef enum +{ + ADRV904X_STREAM_RX_CUSTOM_RISE = ADRV904X_STREAM_ID__RX__RX_CUSTOM_RISE, /*!< Not defined yet */ + ADRV904X_STREAM_RX_CUSTOM_FALL = ADRV904X_STREAM_ID__RX__RX_CUSTOM_FALL, /*!< Not defined yet */ + + ADRV904X_STREAM_RX_SET_DDC0_RSSI_REQ_FLAG = ADRV904X_STREAM_ID__RX__RX_SET_DDC0_RSSI_REQ_FLAG, /*!< Custom stream: Set DDC0 RSSI Enable requested flag */ + ADRV904X_STREAM_RX_SET_DDC1_RSSI_REQ_FLAG = ADRV904X_STREAM_ID__RX__RX_SET_DDC1_RSSI_REQ_FLAG, /*!< Custom stream: Set DDC1 RSSI Enable requested flag */ +} adrv904x_StreamRxCustomStreams_e; + +typedef enum +{ + ADRV904X_STREAM_TX_VGA_OUT_ENABLE_TO_LB = ADRV904X_STREAM_ID__TX__TX_LOOPBACK1_ENABLE_REQUEST, /*!< Custom stream: Enable Tx VGA output to loopback path */ + ADRV904X_STREAM_TX_VGA_OUT_DISABLE_TO_LB = ADRV904X_STREAM_ID__TX__TX_LOOPBACK1_DISABLE_REQUEST, /*!< Custom stream: Disable Tx VGA output to loopback path */ + ADRV904X_STREAM_TX_VGA_IN_ENABLE_TO_LB = ADRV904X_STREAM_ID__TX__TX_LOOPBACK2_ENABLE_REQUEST, /*!< Custom stream: Enable Tx VGA input to loopback path */ + ADRV904X_STREAM_TX_VGA_IN_DISABLE_TO_LB = ADRV904X_STREAM_ID__TX__TX_LOOPBACK2_DISABLE_REQUEST, /*!< Custom stream: Disable Tx VGA input to loopback path */ + ADRV904X_STREAM_TX_ADC_DAC_ENABLE_RAMP = ADRV904X_STREAM_ID__TX__TXLB_ADC_RAMP_ENABLE, /*!< Custom stream: Enable TxLB ADC DAC ramp */ + ADRV904X_STREAM_TX_ADC_DAC_DISABLE_RAMP = ADRV904X_STREAM_ID__TX__TXLB_ADC_RAMP_DISABLE, /*!< Custom stream: Disable TxLB ADC DAC ramp */ + ADRV904X_STREAM_TX_WRITE_DTX_MODE_CONFIG = ADRV904X_STREAM_ID__TX__WRITE_DTX_MODE_CONFIG, /*!< Custom stream: Write DTX Mode Config */ + ADRV904X_STREAM_TX_WRITE_DTX_MODE_CONFIG_CLRSTATUS = ADRV904X_STREAM_ID__TX__WRITE_DTX_MODE_CONFIG_CLRSTATUS, /*!< Custom stream: Write DTX Mode Config And Set Clear-Status bits */ + ADRV904X_STREAM_TX_PA_PROT_RECOVERY = ADRV904X_STREAM_ID__TX__PA_PROT_RECOVERY, /*!< Custom stream: PA Protection Recovery */ + ADRV904X_STREAM_TX_SET_INIT_CAL_RUNNING_BIT = ADRV904X_STREAM_ID__TX__TX_SET_INIT_CAL_RUNNING_BIT, /*!< Custom stream: Set Init Cal Running Bit */ + ADRV904X_STREAM_TX_CLR_INIT_CAL_RUNNING_BIT = ADRV904X_STREAM_ID__TX__TX_CLR_INIT_CAL_RUNNING_BIT, /*!< Custom stream: Clear Init Cal Running Bit */ + + ADRV904X_STREAM_TX_SET_IMMEDIATE_CAPTURE_ENABLE_BIT = ADRV904X_STREAM_ID__TX__SET_IMMEDIATE_CAPTURE_ENABLE_BIT, /*!< Custom stream: Set immediate capture enable bit */ + ADRV904X_STREAM_TX_SET_CAPTURE_PENDING_BIT = ADRV904X_STREAM_ID__TX__SET_CAPTURE_PENDING_BIT, /*!< Custom stream: Set capture pending bit */ + ADRV904X_STREAM_TX_CLEAR_CAPTURE_PENDING_BIT = ADRV904X_STREAM_ID__TX__CLEAR_CAPTURE_PENDING_BIT, /*!< Custom stream: Clear capture pending bit */ + ADRV904X_STREAM_TX_WRITE_DTX_MANUAL_ACTIVATE = ADRV904X_STREAM_ID__TX__DTX_MANUAL_ACTIVATE, /*!< Custom stream: Manual DTX activate */ + ADRV904X_STREAM_TX_WRITE_DTX_MANUAL_DEACTIVATE = ADRV904X_STREAM_ID__TX__DTX_MANUAL_DEACTIVATE, /*!< Custom stream: Manual DTX activate */ + ADRV904X_STREAM_TX_SET_CFR_CFG_SET_CHANGE_REQ = ADRV904X_STREAM_ID__TX__CFR_CFG_SET_CHANGE_REQ, /*!< Custom stream: Set CFR config set change request bit */ + ADRV904X_STREAM_TX_DPD_MODEL_SWITCH_PREPARE_0 = ADRV904X_STREAM_ID__TX__DPD_MODEL_SWITCH_PREPARE_0, /*!< Custom stream: Prepare to switch to DPD Model 0 */ + ADRV904X_STREAM_TX_DPD_MODEL_SWITCH_PREPARE_1 = ADRV904X_STREAM_ID__TX__DPD_MODEL_SWITCH_PREPARE_1, /*!< Custom stream: Prepare to switch to DPD Model 1 */ + ADRV904X_STREAM_TX_DPD_MODEL_SWITCH_PREPARE_2 = ADRV904X_STREAM_ID__TX__DPD_MODEL_SWITCH_PREPARE_2, /*!< Custom stream: Prepare to switch to DPD Model 2 */ + ADRV904X_STREAM_TX_DPD_MODEL_SWITCH_PREPARE_3 = ADRV904X_STREAM_ID__TX__DPD_MODEL_SWITCH_PREPARE_3, /*!< Custom stream: Prepare to switch to DPD Model 3 */ + ADRV904X_STREAM_TX_DPD_MODEL_SWITCH_PREPARE_4 = ADRV904X_STREAM_ID__TX__DPD_MODEL_SWITCH_PREPARE_4, /*!< Custom stream: Prepare to switch to DPD Model 4 */ + ADRV904X_STREAM_TX_DPD_MODEL_SWITCH_TX_FALL_SET = ADRV904X_STREAM_ID__TX__DPD_MODEL_SWITCH_TX_FALL_SET, /*!< Custom stream: Switch DPD model in Tx Fall stream */ + ADRV904X_STREAM_TX_DPD_MODEL_SWITCH_TX_FALL_CLEAR = ADRV904X_STREAM_ID__TX__DPD_MODEL_SWITCH_TX_FALL_CLEAR, /*!< Custom stream: Don't switch DPD model in Tx Fall stream */ +} adrv904x_StreamTxCustomStreams_e; + +typedef enum +{ + ADRV904X_STREAM_MAIN_POWER_UP = ADRV904X_STREAM_ID__CORE__POWERUP, /*!< Power up stream in main stream */ + ADRV904X_STREAM_MAIN_TX_TO_ORX_MAP = ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_API_TRIGGER, /*!< Stream triggered by adi_adrv904x_TxToOrxMappingSet */ + ADRV904X_STREAM_MAIN_SET_ORX0_ATT = ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_IMMEDIATE_SET_ATTEN_ORX0, /*!< Custom stream: Set ORx attenuation for ORx0 */ + ADRV904X_STREAM_MAIN_SET_ORX1_ATT = ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_IMMEDIATE_SET_ATTEN_ORX1, /*!< Custom stream: Set ORx attenuation for ORx1 */ + ADRV904X_STREAM_MAIN_SET_ORX0_NCO_FREQ = ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_IMMEDIATE_SET_NCO_ORX0, /*!< Custom stream: Set ORx ADC/DP NCO frequency for ORx0 */ + ADRV904X_STREAM_MAIN_SET_ORX1_NCO_FREQ = ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_IMMEDIATE_SET_NCO_ORX1, /*!< Custom stream: Set ORx ADC/DP NCO frequency for ORx1 */ + ADRV904X_STREAM_MAIN_ORX_ATT_TABLE_UPDATE = ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_ORX_ATT_TABLE_UPDATE, /*!< Custom stream: Update ORx attenuation table */ + ADRV904X_STREAM_MAIN_ORX_NCO_FREQ_TABLE_UPDATE = ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_ORX_NCO_FREQ_TABLE_UPDATE, /*!< Custom stream: Update ORx ADC/DP and LOL NCO frequency tables */ + ADRV904X_STREAM_MAIN_ONLY_LOL_NCO_FREQ_TABLE_UPDATE = ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_ONLY_LOL_NCO_FREQ_TABLE_UPDATE, /*!< Custom stream: Update only LOL NCO frequency tables */ + ADRV904X_STREAM_MAIN_TRIGGER_TX_STREAM = ADRV904X_STREAM_ID__CORE__TRIGGER_TX_STREAM, /*!< Core stream used to trigger TX streams (see ADRV904X_TRIGGER_SLICE_STREAM_[NUM|MASK]) */ + ADRV904X_STREAM_MAIN_TRIGGER_RX_STREAM = ADRV904X_STREAM_ID__CORE__TRIGGER_RX_STREAM, /*!< Core stream used to trigger RX streams (see ADRV904X_TRIGGER_SLICE_STREAM_[NUM|MASK]) */ + + + ADRV904X_STREAM_MAIN_TRIGGER_TX_STREAM_USED_BY_DFE = ADRV904X_STREAM_ID__CORE__TRIGGER_TX_STREAM_USED_BY_DFE, /*!< Core stream used to trigger TX streams by DFE (see ADRV904X_TRIGGER_SLICE_STREAM_[NUM|MASK]) */ + ADRV904X_STREAM_MAIN_TRIGGER_RX_STREAM_USED_BY_DFE = ADRV904X_STREAM_ID__CORE__TRIGGER_RX_STREAM_USED_BY_DFE, /*!< Core stream used to trigger RX streams by DFE (see ADRV904X_TRIGGER_SLICE_STREAM_[NUM|MASK]) */ + ADRV904X_STREAM_MAIN_CFG_TX_ORX0_MAPPING_IN_RS_MODE = ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_CFG_GPIO_PIN_STATE_FOR_ORX0, /*!< Custom stream: Configure Tx to ORx0 mapping in RS mode */ + ADRV904X_STREAM_MAIN_CFG_TX_ORX1_MAPPING_IN_RS_MODE = ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_CFG_GPIO_PIN_STATE_FOR_ORX1, /*!< Custom stream: Configure Tx to ORx1 mapping in RS mode */ + ADRV904X_STREAM_MAIN_ACT_TX_ORX0_MAPPING_IN_RS_MODE = ADRV904X_STREAM_ID__CORE__RADIO_SEQ_RISE_EVENT_00, /*!< Custom stream: Activate Tx to ORx0 mapping in RS mode */ + ADRV904X_STREAM_MAIN_ACT_TX_ORX1_MAPPING_IN_RS_MODE = ADRV904X_STREAM_ID__CORE__RADIO_SEQ_RISE_EVENT_01, /*!< Custom stream: Activate Tx to ORx1 mapping in RS mode */ + ADRV904X_STREAM_MAIN_ORX0_ALL_OFF_PIN_STATE_IN_RS_MODE = ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_CFG_GPIO_ALL_OFF_PIN_STATE_FOR_ORX0, /*!< Custom stream: Configure and Activate All Off pin state for ORX0 in RS mode */ + ADRV904X_STREAM_MAIN_ORX1_ALL_OFF_PIN_STATE_IN_RS_MODE = ADRV904X_STREAM_ID__CORE__TX_TO_ORX_MAPPING_CFG_GPIO_ALL_OFF_PIN_STATE_FOR_ORX1, /*!< Custom stream: Configure and Activate All Off pin state for ORX0 in RS mode */ + ADRV904X_STREAM_EXT_ALARM_STATE_CLEAR = ADRV904X_STREAM_ID__CORE__EA_CLEAR_HDLR_STRM, /*!< Custom stream: Ext alarm state clear */ + ADRV904X_STREAM_EXT_ALARM_UPDATE_ALARM_OUTPUTS = ADRV904X_STREAM_ID__CORE__EA_UPDATE_ALARM_OUTPUTS_STRM, /*!< Custom stream: Update alarm controlled outputs */ + ADRV904X_STREAM_OC_FUSE_EN_OUT = ADRV904X_STREAM_ID__CORE__EA_OC_FUSE_EN_SET_STRM, /*!< Custom stream: OC Fuse En State */ + ADRV904X_STREAM_DFE_ACT_DMA_TX_REQUEST_SET = ADRV904X_STREAM_ID__CORE__DFE_ACT_LUT_COPY_TX_REQUEST_SET, /*!< Custom stream: Set flag for DFE Act LUT TX Copy Request */ + ADRV904X_STREAM_DFE_ACT_DMA_TX_IN_PROGRESS_CLEAR = ADRV904X_STREAM_ID__CORE__DFE_ACT_LUT_COPY_TX_IN_PROGRESS_CLEAR, /*!< Custom stream: Clear flag DFE Act LUT TX Copy In Progress */ + ADRV904X_STREAM_FB_SW_00 = ADRV904X_STREAM_ID__CORE__RADIO_SEQ_RISE_EVENT_00, /*!< Custom stream: Clear FB SW */ + ADRV904X_STREAM_FB_SW_01 = ADRV904X_STREAM_ID__CORE__RADIO_SEQ_RISE_EVENT_01, /*!< Custom stream: Clear FB SW */ + ADRV904X_STREAM_DFE_CLGC_POWER_METERS_RESTART_ORX0 = ADRV904X_STREAM_ID__CORE__CLGC_POWER_METERS_RESTART_ORX0, /*!< Custom stream: Reset CLGC power meters in RCI mode */ + ADRV904X_STREAM_DFE_CLGC_POWER_METERS_RESTART_ORX1 = ADRV904X_STREAM_ID__CORE__CLGC_POWER_METERS_RESTART_ORX1, /*!< Custom stream: Reset CLGC power meters in RCI mode */ + ADRV904X_STREAM_ANT_CAL_UPDATE_SLICE_SCRATCHPAD_REG = ADRV904X_STREAM_ID__CORE__UPDATE_SLICE_SCRATCHPAD_REG, /*!< Custom stream: Update Rx/Tx slice scratchpad registers */ + ADRV904X_STREAM_DFE_SBET_CLEAR_CAP_REQUEST_FOR_BUF0 = ADRV904X_STREAM_ID__CORE__SBET_CLEAR_CAP_REQUEST_FOR_BUF0, /*!< Custom stream: Clear SBET Capture Request for Buffer0 */ + ADRV904X_STREAM_DFE_SBET_CLEAR_CAP_REQUEST_FOR_BUF1 = ADRV904X_STREAM_ID__CORE__SBET_CLEAR_CAP_REQUEST_FOR_BUF1, /*!< Custom stream: Clear SBET Capture Request for Buffer1 */ +} adrv904x_StreamMainCustomStreams_e; + +#endif /* __ADRV904X_STREAM_PROC_TYPES_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_struct_endian.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_struct_endian.h new file mode 100644 index 00000000000..73804aa867c --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_struct_endian.h @@ -0,0 +1,20 @@ +#ifndef _PALAU_STRUCT_ENDIAN_H_ +#define _PALAU_STRUCT_ENDIAN_H_ + +#include "adrv904x_platform_byte_order.h" +#include "adrv904x_cpu_cmd_run_serdes_eye_sweep.h" + +#if ADRV904X_LITTLE_ENDIAN == 1 +#define CTOH_STRUCT(struct_name, struct_type) +#else +#define CTOH_STRUCT(struct_name, struct_type) struct_type##_swap(&(struct_name)) +#endif + +#define HTOC_STRUCT CTOH_STRUCT + +void adrv904x_SerdesInitCalStatusCmdResp_swap(struct adrv904x_SerdesInitCalStatusCmdResp* _struct); +void adrv904x_SerdesTrackingCalStatusCmdResp_swap(struct adrv904x_SerdesTrackingCalStatusCmdResp* _struct); +void adrv904x_SerdesTrackingCalStatus_swap(struct adi_adrv904x_SerdesTrackingCalStatus* _struct); +void adrv904x_SerdesInitCalStatus_swap(struct adi_adrv904x_SerdesInitCalStatus* _struct); +void adrv904x_CpuCmd_SerdesCalStatusGet_swap(struct adrv904x_CpuCmd_SerdesCalStatusGet* _struct); +#endif \ No newline at end of file diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_tx.h b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_tx.h new file mode 100644 index 00000000000..0763c27b330 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/include/adrv904x_tx.h @@ -0,0 +1,277 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adrv904x_tx.h + * \brief Contains ADRV904X Tx related private function prototypes for + * adrv904x_tx.c which helps adi_adrv904x_tx.c + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADRV904X_TX_H_ +#define _ADRV904X_TX_H_ + +#include "../../private/bf/adrv904x_bf_tx_dig_types.h" +#include "../../private/bf/adrv904x_bf_tx_funcs_types.h" + +#include "../../private/bf/adrv904x_bf_tx_band_duc_types.h" +#include "../../private/bf/adrv904x_bf_tx_dfe_dig_regs_types.h" + +#include "adi_adrv904x_tx_types.h" +#include "adi_adrv904x_error.h" + + +#include "../../private/bf/adrv904x_bf_cduc_hb_dpath.h" +#include "../../private/bf/adrv904x_bf_tx_dpd_act_mmr.h" + +/** +* \brief Returns the address for a given tx channel's attenuation table. +* +* \param[in] txChannel The channel for which tx atten table address is requested. +* +* \retval uint32_t The address of the attenuation table or 0 if txChannel is ADI_ADRV904X_TXOFF or +* ADI_ADRV904X_TXNONE. +*/ +ADI_API uint32_t adrv904x_txAttenAddrLookup(const adi_adrv904x_TxChannels_e txChannel); + +/** +* \brief Returns 0-indexed channel id for a given adi_adrv904x_TxChannels_e. +* +* \param[in] txChannel The value to convert. +* +* \retval uint8_t The channel id. Returns a value greater ADI_ADRV904X_CHAN_ID_MAX if the value supplied cannot be +* converted (i.e. is not valid value for the enum or refers to TX_ALL or TX_NONE). +*/ +ADI_API uint8_t adrv904x_TxChannelsToId(const adi_adrv904x_TxChannels_e txChannel); + +/* TODO: remove when adrv904x_Dig_TxEnableBySpi_BfSet and adrv904x_BfTxChanAddr_e are available */ +typedef adrv904x_BfTxDigChanAddr_e adrv904x_BfTxChanAddr_e; +#define ADRV904X_BF_TX_CH0 ADRV904X_BF_SLICE_TX_0__TX_DIG +#define ADRV904X_BF_TX_CH1 ADRV904X_BF_SLICE_TX_1__TX_DIG +#define ADRV904X_BF_TX_CH2 ADRV904X_BF_SLICE_TX_2__TX_DIG +#define ADRV904X_BF_TX_CH3 ADRV904X_BF_SLICE_TX_3__TX_DIG +#define ADRV904X_BF_TX_CH4 ADRV904X_BF_SLICE_TX_4__TX_DIG +#define ADRV904X_BF_TX_CH5 ADRV904X_BF_SLICE_TX_5__TX_DIG +#define ADRV904X_BF_TX_CH6 ADRV904X_BF_SLICE_TX_6__TX_DIG +#define ADRV904X_BF_TX_CH7 ADRV904X_BF_SLICE_TX_7__TX_DIG + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adrv904x_BfTxChanAddr_e* const txChannelBitfieldAddr); + +/** +* \brief Look up the Tx function bitfield address given a Tx Channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] txChannel Channel selection to read back gain index for (Valid Tx0-Tx7 only) +* \param[out] txFuncsChannelBitfieldAddr Tx function channel bitfield address which will be updated by this function +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncsBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adrv904x_BfTxFuncsChanAddr_e* const txFuncsChannelBitfieldAddr); +/** +* \brief Look up the Tx function bitfield address given a Tx Channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] txChannel Channel selection to read back gain index for (Valid Tx0-Tx7 only) +* \param[out] txdIGChannelBitfieldAddr Tx function channel bitfield address which will be updated by this function +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDigBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adrv904x_BfTxDigChanAddr_e* const txDigChannelBitfieldAddr); + +/** +* \brief Range check a given TxPowerMonitor configuration +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] txPowerMonitorCfg Pointer to power monitor configuration to be range checked +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxPowerMonitorCfgRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_PowerMonitorCfg_t * const txPowerMonitorCfg); + +/** +* \brief Range check a given Srd configuration +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] txSlewRateDetectorCfg Pointer to srd configuration to be range checked +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxSlewRateDetectorCfgRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_SlewRateDetectorCfg_t * const txSlewRateDetectorCfg); + +/** +* \brief This function reads back the LO Source Mapping to the requested Tx channel. +* +* The LO source select for a given channel is configured during init time. This function +* can be used to read back the configuration during run time. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] txChannel Enum to select Tx Channel. +* \param[out] txLoSource Pointer to store Tx channel LO source mapping read back (Output) +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxLoSourceGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_LoSel_e* const txLoSource); + + +/** +* \brief Performs range check on Dec power configuration. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] decPowerCfg Decimated power block configured to be range checked + +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDecPowerCfgRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxDecimatedPowerCfg_t* const decPowerCfg); + +/** +* \brief Performs mask validation +* +* \param[in] maskVal - mask value to check +* \param[in] allowOnlyOne - when 1: only one bit should be set; when false: multiples allowed +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_ValidateMask(uint32_t maskVal, uint8_t allowOnlyOne); + +/** +* \brief Look up the Tx DUC band 0 bitfield address given a Tx Channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] txChannel Channel selection to read back gain index for (Valid Tx0-Tx7 only) +* \param[out] txBandDucChannelBitfieldAddr Tx DUC band 0 bitfield address which will be updated by this function +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxBandDuc0BitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adrv904x_BfTxBandDucChanAddr_e* const txBandDucChannelBitfieldAddr); + +/** +* \brief Look up the Tx DUC band 1 bitfield address given a Tx Channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] txChannel Channel selection to read back gain index for (Valid Tx0-Tx7 only) +* \param[out] txBandDucChannelBitfieldAddr Tx DUC band 1 bitfield address which will be updated by this function +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxBandDuc1BitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adrv904x_BfTxBandDucChanAddr_e* const txBandDucChannelBitfieldAddr); + +/** +* \brief Performs range check on tx cduc carrier setting. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] chanSelect is the tx channel parameter +* \param[in] carrierSelect is the tx carrier parameter +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCducCarrierCheck(adi_adrv904x_Device_t* const device, + const uint8_t chanSelect, + const uint8_t carrierSelect); + +/** +* \brief Look up the Tx Hb Datapath bitfield address given a Tx channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] txChannel Channel selection to read back gain index for(Valid Tx0 - Tx7 only) +* \param[out] cducHbDpathChannelBitfieldAddr Tx cduc Hb Datapath channel bitfield address which will be updated by this function +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpathBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adrv904x_BfCducHbDpathChanAddr_e* const cducHbDpathChannelBitfieldAddr); + +/** +* \brief Look up the Tx Dpd Act Mmr bitfield address given a Tx channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] txChannel Channel selection to read back gain index for(Valid Tx0 - Tx7 only) +* \param[out] dpdActMmrChannelBitfieldAddr Tx dpd act mmr channel bitfield address which will be updated by this function +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_DpdActMmrBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChan, + adrv904x_BfTxDpdActMmrChanAddr_e* const dpdActMmrChannelBitfieldAddr); + +/** +* \brief Returns Tx Dfe Dig base address for selected channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X data structure +* \param[in] txChannel Tx channel selection +* \param[out] txDfeDigChannelBitfieldAddr Tx Dfe Dig base address of selected channel +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adrv904x_BfTxDfeDigRegsChanAddr_e* const txDfeDigChannelBitfieldAddr); +#endif /* _ADRV904X_TX_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_agc.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_agc.c new file mode 100644 index 00000000000..16866860f08 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_agc.c @@ -0,0 +1,690 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adrv904x_agc.c + * \brief Contains ADRV904X AGC related private function implementations + * + * ADRV904X API Version: 2.10.0.4 + */ + +#include "../../private/include/adrv904x_agc.h" +#include "../../private/include/adrv904x_rx.h" + + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_AGC + +ADI_API adi_adrv904x_ErrAction_e adrv904x_AgcGainRangeCfgRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_AgcGainRange_t * const agcGainRangeCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + uint8_t chanIdx = 0U; + uint8_t rxMinIndex = 0U; + uint8_t rxMaxIndex = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check agcGainRangeCfg address pointer is not null */ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, agcGainRangeCfg); + + if (((agcGainRangeCfg->rxChannelMask & (~(uint32_t)ADI_ADRV904X_RX_MASK_ALL)) != 0U) || (agcGainRangeCfg->rxChannelMask == (uint32_t)ADI_ADRV904X_RXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcGainRangeCfg->rxChannelMask, + "Invalid Rx channel is selected. Valid values are any combinations of Rx0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + if (agcGainRangeCfg->minGainIndex > agcGainRangeCfg->maxGainIndex) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcGainRangeCfg->minGainIndex, + "minGainIndex cannot be larger than maxGainIndex"); + return recoveryAction; + } + + /* AGC config range check */ + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_RX_ONLY; ++chanIdx) + { + if (ADRV904X_BF_EQUAL(agcGainRangeCfg->rxChannelMask, (uint32_t)(1U << chanIdx))) + { + if (chanIdx == 0U) + { + rxMinIndex = device->devStateInfo.gainIndexes.rx0MinGainIndex; + rxMaxIndex = device->devStateInfo.gainIndexes.rx0MaxGainIndex; + } + else if (chanIdx == 1U) + { + rxMinIndex = device->devStateInfo.gainIndexes.rx1MinGainIndex; + rxMaxIndex = device->devStateInfo.gainIndexes.rx1MaxGainIndex; + } + else if (chanIdx == 2U) + { + rxMinIndex = device->devStateInfo.gainIndexes.rx2MinGainIndex; + rxMaxIndex = device->devStateInfo.gainIndexes.rx2MaxGainIndex; + } + else if (chanIdx == 3U) + { + rxMinIndex = device->devStateInfo.gainIndexes.rx3MinGainIndex; + rxMaxIndex = device->devStateInfo.gainIndexes.rx3MaxGainIndex; + } + else if (chanIdx == 4U) + { + rxMinIndex = device->devStateInfo.gainIndexes.rx4MinGainIndex; + rxMaxIndex = device->devStateInfo.gainIndexes.rx4MaxGainIndex; + } + else if (chanIdx == 5U) + { + rxMinIndex = device->devStateInfo.gainIndexes.rx5MinGainIndex; + rxMaxIndex = device->devStateInfo.gainIndexes.rx5MaxGainIndex; + } + else if (chanIdx == 6U) + { + rxMinIndex = device->devStateInfo.gainIndexes.rx6MinGainIndex; + rxMaxIndex = device->devStateInfo.gainIndexes.rx6MaxGainIndex; + } + else + { + rxMinIndex = device->devStateInfo.gainIndexes.rx7MinGainIndex; + rxMaxIndex = device->devStateInfo.gainIndexes.rx7MaxGainIndex; + } + + if (agcGainRangeCfg->maxGainIndex > rxMaxIndex) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcGainRangeCfg->maxGainIndex, + "agcGainRangeCfg->maxGainIndex cannot be larger than Rx max index of device"); + return recoveryAction; + } + + if (agcGainRangeCfg->minGainIndex < rxMinIndex) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcGainRangeCfg->minGainIndex, + "agcGainRangeCfg->minGainIndex cannot be smaller than Rx min index of device"); + return recoveryAction; + } + } + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_AgcCfgRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_AgcCfg_t * const agcCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Valid ranges for the AGC configuration values */ + static const uint8_t MAX_GAIN_STEP_SIZE = 31U; + static const uint8_t MAX_ADCOVLD_LOW_THRESHOLD = 8U; + static const uint16_t MAX_THRESHOLD_VAL = 16383U; + static const uint8_t HB2_FIRST_STAGE_DURATION_MAX = 63U; + static const uint8_t HB2_FIRST_STAGE_THRESHOLD_MAX = 7U; + static const uint8_t FAST_RECOVERY_MAX_INTERVAL = 63U; + static const uint8_t POWER_TRIGGER_MAX_THRESHOLD = 127U; + static const uint8_t POWER_TRIGGER_UNDERRANGE_LOW_POWER_MAX_THRESHOLD = 31U; + static const uint8_t POWER_TRIGGER_OVERRANGE_HIGH_POWER_MAX_THRESHOLD = 15U; + static const uint8_t DEC_POWER_INPUT_SELECT_MAX = 3U; + static const uint8_t DEC_POWER_MEAS_DURATION_MAX = 31U; + static const uint32_t GAIN_UPDATE_COUNTER_MAX = 4194303U; + static const uint8_t IMMEDIATE_GAIN_CHANGE_MAX_VAL = 3U; + static const uint8_t MAX_ATTACK_DELAY = 63U; + static const uint8_t MAX_ADC_RESET_GAIN_STEP = 31U; + static const uint8_t MAX_PEAK_WAIT_TIME = 3U; + adi_adrv904x_AgcGainRange_t agcGainRange; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check agcCfg address pointer is not null */ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, agcCfg); + + ADI_LIBRARY_MEMSET(&agcGainRange, 0, sizeof(adi_adrv904x_AgcGainRange_t)); + + /*Check that if requested Rx Channel valid*/ + if(((agcCfg->rxChannelMask & (~(uint32_t)ADI_ADRV904X_RX_MASK_ALL)) != 0U) || (agcCfg->rxChannelMask == (uint32_t)ADI_ADRV904X_RXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->rxChannelMask, + "Invalid Rx channel is selected. Valid values are any combinations of Rx0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + /* Peak detector config range check */ + if (agcCfg->agcPeak.adcOvldGainStepAttack > MAX_GAIN_STEP_SIZE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPeak.adcOvldGainStepAttack, + "agcCfg->agcPeak.adcOvldGainStepAttack is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPeak.adcOvldLowThresh > MAX_ADCOVLD_LOW_THRESHOLD) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPeak.adcOvldLowThresh, + "agcCfg->agcPeak.adcOvldLowThresh is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPeak.adcOvldGainStepRecovery > MAX_GAIN_STEP_SIZE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPeak.adcOvldGainStepRecovery, + "agcCfg->agcPeak.adcOvldGainStepRecovery is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPeak.hb2OverloadDurationCnt > HB2_FIRST_STAGE_DURATION_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPeak.hb2OverloadDurationCnt, + "agcCfg->agcPeak.hb2OverloadDurationCnt is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPeak.hb2OverloadThreshCnt > HB2_FIRST_STAGE_THRESHOLD_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPeak.hb2OverloadThreshCnt, + "agcCfg->agcPeak.hb2OverloadThreshCnt is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPeak.hb2HighThresh > MAX_THRESHOLD_VAL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPeak.hb2HighThresh, + "agcCfg->agcPeak.hb2HighThresh is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPeak.hb2GainStepAttack > MAX_GAIN_STEP_SIZE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPeak.hb2GainStepAttack, + "agcCfg->agcPeak.hb2GainStepAttack is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPeak.hb2UnderRangeHighThresh > MAX_THRESHOLD_VAL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPeak.hb2UnderRangeHighThresh, + "agcCfg->agcPeak.hb2UnderRangeHighThresh is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPeak.hb2GainStepHighRecovery > MAX_GAIN_STEP_SIZE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPeak.hb2GainStepHighRecovery, + "agcCfg->agcPeak.hb2GainStepHighRecovery is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPeak.hb2UnderRangeMidThresh > MAX_THRESHOLD_VAL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPeak.hb2UnderRangeMidThresh, + "agcCfg->agcPeak.hb2UnderRangeMidThresh is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPeak.hb2GainStepMidRecovery > MAX_GAIN_STEP_SIZE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPeak.hb2GainStepMidRecovery, + "agcCfg->agcPeak.hb2GainStepMidRecovery is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPeak.hb2UnderRangeLowThresh > MAX_THRESHOLD_VAL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPeak.hb2UnderRangeLowThresh, + "agcCfg->agcPeak.hb2UnderRangeLowThesh is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPeak.hb2GainStepLowRecovery > MAX_GAIN_STEP_SIZE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPeak.hb2GainStepLowRecovery, + "agcCfg->agcPeak.hb2GainStepLowRecovery is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPeak.hb2UnderRangeMidInterval > FAST_RECOVERY_MAX_INTERVAL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPeak.hb2UnderRangeMidInterval, + "agcCfg->agcPeak.hb2UnderRangeMidInterval is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPeak.hb2UnderRangeHighInterval > FAST_RECOVERY_MAX_INTERVAL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPeak.hb2UnderRangeHighInterval, + "agcCfg->agcPeak.hb2UnderRangeHighInterval is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPeak.enableHb2Overload > 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPeak.enableHb2Overload, + "agcCfg->agcPeak.enableHb2Overload is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPeak.hb2OverloadPowerMode > 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPeak.hb2OverloadPowerMode, + "agcCfg->agcPeak.hb2OverloadPowerMode is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPeak.hb2OverloadSignalSelection > 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPeak.hb2OverloadSignalSelection, + "agcCfg->agcPeak.hb2OverloadSignalSelection is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPeak.adcOvldUpperThreshPeakExceededCnt < 2U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPeak.adcOvldUpperThreshPeakExceededCnt, + "ADC Overload Upper Threshold Peak Exceeded Count Between 2 and 255"); + return recoveryAction; + } + + if (agcCfg->agcPeak.adcOvldLowerThreshPeakExceededCnt < 2U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPeak.adcOvldLowerThreshPeakExceededCnt, + "ADC Overload Lower Threshold Peak Exceeded Count Between 2 and 255"); + return recoveryAction; + } + + /* Power measurement detector config range check */ + if (agcCfg->agcPower.underRangeHighPowerThresh > POWER_TRIGGER_MAX_THRESHOLD) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPower.underRangeHighPowerThresh, + "agcCfg->agcPower.underRangeHighPowerThresh is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPower.underRangeHighPowerGainStepRecovery > MAX_GAIN_STEP_SIZE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPower.underRangeHighPowerGainStepRecovery, + "agcCfg->agcPower.underRangeHighPowerGainStepRecovery is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPower.underRangeLowPowerThresh > POWER_TRIGGER_UNDERRANGE_LOW_POWER_MAX_THRESHOLD) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPower.underRangeLowPowerThresh, + "agcCfg->agcPower.underRangeLowPowerThresh is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPower.underRangeLowPowerGainStepRecovery > MAX_GAIN_STEP_SIZE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPower.underRangeLowPowerGainStepRecovery, + "agcCfg->agcPower.underRangeLowPowerGainStepRecovery is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPower.overRangeLowPowerThresh > POWER_TRIGGER_MAX_THRESHOLD) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPower.overRangeLowPowerThresh, + "agcCfg->agcPower.overRangeLowPowerThresh is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPower.overRangeLowPowerGainStepAttack > MAX_GAIN_STEP_SIZE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPower.overRangeLowPowerGainStepAttack, + "agcCfg->agcPower.overRangeLowPowerGainStepAttack is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPower.overRangeHighPowerThresh > POWER_TRIGGER_OVERRANGE_HIGH_POWER_MAX_THRESHOLD) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPower.overRangeHighPowerThresh, + "agcCfg->agcPower.overRangeHighPowerThresh is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPower.overRangeHighPowerGainStepAttack > MAX_GAIN_STEP_SIZE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPower.overRangeHighPowerGainStepAttack, + "agcCfg->agcPower.overRangeHighPowerGainStepAttack is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPower.powerEnableMeasurement > 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPower.powerEnableMeasurement, + "agcCfg->agcPower.powerEnableMeasurement is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPower.powerInputSelect > DEC_POWER_INPUT_SELECT_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPower.powerInputSelect, + "agcCfg->agcPower.powerInputSelect is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPower.powerMeasurementDuration > DEC_POWER_MEAS_DURATION_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPower.powerMeasurementDuration, + "agcCfg->agcPower.powerMeasurementDuration is out of range"); + return recoveryAction; + } + + agcGainRange.rxChannelMask = agcCfg->rxChannelMask; + agcGainRange.maxGainIndex = agcCfg->agcRxMaxGainIndex; + agcGainRange.minGainIndex = agcCfg->agcRxMinGainIndex; + + recoveryAction = adrv904x_AgcGainRangeCfgRangeCheck(device, &agcGainRange); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, &agcGainRange, "Invalid Rx AGC Gain range"); + return recoveryAction; + } + + if (agcCfg->agcGainUpdateCounter > GAIN_UPDATE_COUNTER_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcGainUpdateCounter, + "agcCfg->agcGainUpdateCounter is out of range"); + return recoveryAction; + } + + if (agcCfg->agcChangeGainIfThreshHigh > IMMEDIATE_GAIN_CHANGE_MAX_VAL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcChangeGainIfThreshHigh, + "agcCfg->agcChangeGainIfThreshHigh is out of range"); + return recoveryAction; + } + + if (agcCfg->agcEnableFastRecoveryLoop > 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcEnableFastRecoveryLoop, + "agcCfg->agcEnableFastRecoveryLoop is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPeakThreshGainControlMode > 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPeakThreshGainControlMode, + "agcCfg->agcPeakThreshGainControlMode is out of range"); + return recoveryAction; + } + + if (agcCfg->agcLowThreshPreventGainInc > 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcLowThreshPreventGainInc, + "agcCfg->agcLowThreshPreventGainInc is out of range"); + return recoveryAction; + } + + if (agcCfg->agcResetOnRxon > 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcResetOnRxon, + "agcCfg->agcResetOnRxon is out of range"); + return recoveryAction; + } + + if (agcCfg->agcRxAttackDelay > MAX_ATTACK_DELAY) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcRxAttackDelay, + "agcCfg->agcRxAttackDelay is out of range"); + return recoveryAction; + } + + if (agcCfg->agcAdcResetGainStep > MAX_ADC_RESET_GAIN_STEP) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcAdcResetGainStep, + "agcCfg->agcAdcResetGainStep is out of range"); + return recoveryAction; + } + + if (agcCfg->agcPeakWaitTime > MAX_PEAK_WAIT_TIME) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcCfg->agcPeakWaitTime, + "agcCfg->agcPeakWaitTime is out of range"); + return recoveryAction; + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_AgcDualBandCfgRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_AgcDualBandCfg_t * const agcDualBandCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Valid ranges for the AGC configuration values */ + static const uint8_t MAX_POWER_MARGIN = 31U; + static const uint8_t POWER_MEASUREMENT_DURATION = 31U; + static const uint8_t DUALBAND_MAX_GAIN_INDEX = 3U; + adi_adrv904x_AgcGainRange_t agcGainRange; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check agcCfg address pointer is not null */ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, agcDualBandCfg); + + ADI_LIBRARY_MEMSET(&agcGainRange, 0, sizeof(adi_adrv904x_AgcGainRange_t)); + + /*Check that if requested Rx Channel valid*/ + if (((agcDualBandCfg->rxChannelMask & (~(uint32_t)ADI_ADRV904X_RX_MASK_ALL)) != 0U) || (agcDualBandCfg->rxChannelMask == (uint32_t)ADI_ADRV904X_RXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcDualBandCfg->rxChannelMask, + "Invalid Rx channel is selected. Valid values are any combinations of Rx0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + if (agcDualBandCfg->agcDualBandEnable > ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcDualBandCfg->agcDualBandEnable, + "agcDualBandCfg->agcDualBandEnable is out of range"); + return recoveryAction; + } + + agcGainRange.rxChannelMask = agcDualBandCfg->rxChannelMask; + agcGainRange.maxGainIndex = agcDualBandCfg->agcRxDualbandExtTableUpperIndex; + agcGainRange.minGainIndex = agcDualBandCfg->agcRxDualbandExtTableLowerIndex; + + recoveryAction = adrv904x_AgcGainRangeCfgRangeCheck(device, &agcGainRange); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, &agcGainRange, "Invalid Rx Dual Band AGC Gain range"); + return recoveryAction; + } + + if (agcDualBandCfg->agcDualbandPwrMargin > MAX_POWER_MARGIN) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcDualBandCfg->agcDualbandPwrMargin, + "agcDualBandCfg->agcDualbandPwrMargin is out of range"); + return recoveryAction; + } + + if (agcDualBandCfg->decPowerDdcMeasurementDuration > POWER_MEASUREMENT_DURATION) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcDualBandCfg->decPowerDdcMeasurementDuration, + "agcDualBandCfg->decPowerDdcMeasurementDuration is out of range"); + return recoveryAction; + } + + if (agcDualBandCfg->agcDualBandMaxGainIndex > DUALBAND_MAX_GAIN_INDEX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcDualBandCfg->agcDualBandMaxGainIndex, + "agcDualBandCfg->agcDualBandMaxGainIndex is out of range"); + return recoveryAction; + } + + if (agcDualBandCfg->enableGainCompensationForExtLna > ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + agcDualBandCfg->enableGainCompensationForExtLna, + "agcDualBandCfg->enableGainCompensationForExtLna is out of range"); + return recoveryAction; + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; + +} \ No newline at end of file diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_binloader.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_binloader.c new file mode 100644 index 00000000000..333bc8d1d61 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_binloader.c @@ -0,0 +1,443 @@ +/** +* Copyright 2015 - 2022 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adrv904x_binloader.c + * \brief Contains ADRV904X binary loader related private function implementations. + * + * ADRV904X API Version: 2.10.0.4 + */ +#include "adi_library_types.h" +#include "../../private/include/adrv904x_binloader.h" +#include "../../public/include/adi_adrv904x_types.h" +#include "../../public/include/adi_adrv904x_user.h" +#include "../../private/include/adrv904x_platform_byte_order.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_BINLOADER + +#define SAFE_READ(r, d, f, s, n, file) \ +r = adrv904x_SafeBinFileRead(&f, s, n, file, sizeof(f)); \ +if (r != ADI_ADRV904X_ERR_ACT_NONE) \ +{ \ + ADI_PARAM_ERROR_REPORT(&d->common, r, f, "Unable to extract variable from bin file.");\ + return recoveryAction; \ +} + +#define ADI_MIN(x, y) (((x) < (y)) ? (x) : (y)) + +static void adrv904x_EndiannessCheckAndConvert(void* const buffer, const size_t elementSize, const size_t elementCount); +static adi_adrv904x_ErrAction_e adrv904x_SafeBinFileRead(void* const buffer, const size_t elementSize, const size_t elementCount, FILE* const file, const size_t sizeOfBuffer); +static adi_adrv904x_ErrAction_e adrv904x_LoadVersionFromBin(adi_adrv904x_Device_t* const device, adi_adrv904x_Version_t *const target, FILE* const file); +static adi_adrv904x_ErrAction_e adrv904x_LoadFwVersionFromBin(adi_adrv904x_Device_t* const device, adi_adrv904x_CpuFwVersion_t* const target, FILE* const file); +static adi_adrv904x_ErrAction_e adrv904x_LoadInitStructFromBin(adi_adrv904x_Device_t* const device, adi_adrv904x_Init_t* const target, FILE* const file); +static adi_adrv904x_ErrAction_e adrv904x_LoadPostMcsInitStructFromBin(adi_adrv904x_Device_t* const device, adi_adrv904x_PostMcsInit_t* const target, FILE* const file); + +static void adrv904x_EndiannessCheckAndConvert(void* const buffer, const size_t elementSize, const size_t elementCount) +{ + /* new function entry reporting */ + uint8_t i = 0U; + uint16_t* tmp16; + uint32_t* tmp32; + uint64_t* tmp64; + + if (elementSize == 2U) + { + //biteswap small + tmp16 = (uint16_t* const)buffer; + for (i = 0; i < elementCount; i++) { + tmp16[i] = ADRV904X_HTOCS(tmp16[i]); + } + } + else if (elementSize == 4U) + { + //biteswap large + tmp32 = (uint32_t* const)buffer; + for (i = 0; i < elementCount; i++) { + tmp32[i] = ADRV904X_HTOCL(tmp32[i]); + } + } + else if (elementSize == 8U) + { + //biteswap large large + tmp64 = (uint64_t* const)buffer; + for (i = 0; i < elementCount; i++) { + tmp64[i] = ADRV904X_HTOCLL(tmp64[i]); + } + } +} + +static adi_adrv904x_ErrAction_e adrv904x_SafeBinFileRead(void* const buffer, const size_t elementSize, const size_t elementCount, FILE* const file, const size_t sizeOfBuffer) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + ADI_ADRV904X_NULL_PTR_RETURN(buffer); + ADI_ADRV904X_NULL_PTR_RETURN(file); + + if (sizeOfBuffer > (elementCount * elementSize)) + { + ADI_LIBRARY_MEMSET(buffer, 0, sizeOfBuffer); + } + + if(ADI_LIBRARY_FREAD(buffer, 1, ADI_MIN(elementSize * elementCount, sizeOfBuffer), file) != ADI_MIN(elementSize * elementCount, sizeOfBuffer)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + } + + if (ADRV904X_LITTLE_ENDIAN == 0) + { + adrv904x_EndiannessCheckAndConvert(buffer, elementSize, elementCount); + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e adrv904x_LoadVersionFromBin(adi_adrv904x_Device_t* const device, adi_adrv904x_Version_t *const target, FILE* const file) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + /* hash designed to check if data inside the binary is for this type of structure */ + const uint8_t STRUCT_HASH[16] = { 0xD1, 0xE9, 0xDC, 0x16, 0x3B, 0x18, 0x9F, 0xFD, 0x95, 0xB9, 0xE6, 0x24, 0x39, 0x13, 0xF7, 0xCC }; + char buf[16]; + ADI_LIBRARY_MEMSET(&buf, 0, sizeof(buf)); + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_RETURN(target); + ADI_ADRV904X_NULL_PTR_RETURN(file); + + if (ADI_LIBRARY_FREAD(buf, 1, 16, file) != 16) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, file, "Unable to read bin file."); + return recoveryAction; + } + + if (ADI_LIBRARY_MEMCMP(buf, STRUCT_HASH, 16) != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, file, "Incorrect structure format written in bin file."); + return recoveryAction; + } + + SAFE_READ(recoveryAction, device, target->majorVer, 4U, 1U, file); // UInt32 at 16 + SAFE_READ(recoveryAction, device, target->minorVer, 4U, 1U, file); // UInt32 at 20 + SAFE_READ(recoveryAction, device, target->maintenanceVer, 4U, 1U, file); // UInt32 at 24 + SAFE_READ(recoveryAction, device, target->buildVer, 4U, 1U, file); // UInt32 at 28 + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e adrv904x_LoadFwVersionFromBin(adi_adrv904x_Device_t* const device, adi_adrv904x_CpuFwVersion_t* const target, FILE* const file) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + /* hash designed to check if data inside the binary is for this type of structure */ + const uint8_t STRUCT_HASH[16] = { 0x8D, 0xDA, 0x34, 0xE4, 0x46, 0x71, 0x5D, 0xC8, 0xA4, 0x08, 0x00, 0xC0, 0x2D, 0x59, 0x32, 0x2B }; + char buf[16]; + ADI_LIBRARY_MEMSET(&buf, 0, sizeof(buf)); + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_RETURN(target); + ADI_ADRV904X_NULL_PTR_RETURN(file); + + if (ADI_LIBRARY_FREAD(buf, 1, 16, file) != 16) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, file, "Unable to read bin file."); + return recoveryAction; + } + + if (ADI_LIBRARY_MEMCMP(buf, STRUCT_HASH, 16) != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, file, "Incorrect structure format written in bin file."); + return recoveryAction; + } + + SAFE_READ(recoveryAction, device, target->commVer.majorVer, 4U, 1U, file); // UInt32 at 16 + SAFE_READ(recoveryAction, device, target->commVer.minorVer, 4U, 1U, file); // UInt32 at 20 + SAFE_READ(recoveryAction, device, target->commVer.maintenanceVer, 4U, 1U, file); // UInt32 at 24 + SAFE_READ(recoveryAction, device, target->commVer.buildVer, 4U, 1U, file); // UInt32 at 28 + SAFE_READ(recoveryAction, device, target->cpuFwBuildType, 4U, 1U, file); // Int32 at 32 + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e adrv904x_LoadInitStructFromBin(adi_adrv904x_Device_t* const device, adi_adrv904x_Init_t* const target, FILE* const file) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + /* hash designed to check if data inside the binary is for this type of structure */ + + const uint8_t STRUCT_HASH[16] = { 0x32, 0xC1, 0xBA, 0xA5, 0x9D, 0xDE, 0x21, 0x12, 0xD7, 0xF6, 0x10, 0xAF, 0xFB, 0x74, 0x2A, 0x41 }; + char buf[16]; + uint8_t i = 0U; + uint8_t j = 0U; + ADI_LIBRARY_MEMSET(&buf, 0, sizeof(buf)); + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_RETURN(target); + ADI_ADRV904X_NULL_PTR_RETURN(file); + + if (ADI_LIBRARY_FREAD(buf, 1, 16, file) != 16) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, file, "Unable to read bin file."); + return recoveryAction; + } + + if (ADI_LIBRARY_MEMCMP(buf, STRUCT_HASH, 16) != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, file, "Incorrect structure format written in bin file."); + return recoveryAction; + } + + SAFE_READ(recoveryAction, device, target->spiOptionsInit.allowSpiStreaming, 1U, 1U, file); // Byte at 16 + SAFE_READ(recoveryAction, device, target->spiOptionsInit.allowAhbAutoIncrement, 1U, 1U, file); // Byte at 17 + SAFE_READ(recoveryAction, device, target->spiOptionsInit.allowAhbSpiFifoMode, 1U, 1U, file); // Byte at 18 + SAFE_READ(recoveryAction, device, target->clocks.DevClkOnChipTermResEn, 1U, 1U, file); // Byte at 19 + SAFE_READ(recoveryAction, device, target->cpuMemDump.filePath, 1U, 256U, file); // Byte[256] at 20-275 + + for (i = 0U; i < 10U; i++) + { + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.formatSelect, 4U, 1U, file); // Int32 at 276 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.floatingPointConfig.fpDataFormat, 4U, 1U, file); // Int32 at 280 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.floatingPointConfig.fpRoundMode, 4U, 1U, file); // Int32 at 284 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.floatingPointConfig.fpNumExpBits, 4U, 1U, file); // Int32 at 288 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.floatingPointConfig.fpAttenSteps, 4U, 1U, file); // Int32 at 292 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.floatingPointConfig.fpHideLeadingOne, 4U, 1U, file); // Int32 at 296 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.floatingPointConfig.fpEncodeNan, 4U, 1U, file); // Int32 at 300 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.integerConfigSettings.intEmbeddedBits, 4U, 1U, file); // Int32 at 304 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.integerConfigSettings.intSampleResolution, 4U, 1U, file); // Int32 at 308 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.integerConfigSettings.intParity, 4U, 1U, file); // Int32 at 312 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.integerConfigSettings.intEmbeddedPos, 4U, 1U, file); // Int32 at 316 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.slicerConfigSettings.extSlicerStepSize, 4U, 1U, file); // Int32 at 320 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.slicerConfigSettings.intSlicerStepSize, 4U, 1U, file); // Int32 at 324 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.slicerConfigSettings.extSlicerGpioSelect, 4U, 1U, file); // Int32 at 328 + + for (j = 0U; j < 4U; j++) + { + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.slicerConfigSettings.intSlicerGpioSelect[j], 4U, 1U, file); // Int32 at 332 + } + + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.embOvldMonitorSettings.embeddedMonitorSrcLsbI, 4U, 1U, file); // Int32 at 348 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.embOvldMonitorSettings.embeddedMonitorSrcLsbQ, 4U, 1U, file); // Int32 at 352 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.embOvldMonitorSettings.embeddedMonitorSrcLsbPlusOneI, 4U, 1U, file); // Int32 at 356 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.embOvldMonitorSettings.embeddedMonitorSrcLsbPlusOneQ, 4U, 1U, file); // Int32 at 360 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.embOvldMonitorSettings.embeddedMonitorHb2LowSrcSel, 4U, 1U, file); // Int32 at 364 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.embOvldMonitorSettings.embeddedMonitorHb2HighSrcSel, 4U, 1U, file); // Int32 at 368 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.embOvldMonitorSettings.embeddedMonitorApdLowSrcSel, 4U, 1U, file); // Int32 at 372 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.embOvldMonitorSettings.embeddedMonitorApdHighSrcSel, 4U, 1U, file); // Int32 at 376 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.embOvldMonitorSettings.invertHb2Flag, 1U, 1U, file); // Byte at 380 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.embOvldMonitorSettings.invertApdFlag, 1U, 1U, file); // Byte at 381 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.externalLnaGain, 1U, 1U, file); // Byte at 382 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxDataFormat.tempCompensationEnable, 1U, 1U, file); // Byte at 383 + SAFE_READ(recoveryAction, device, target->rx.rxChannelCfg[i].rxGainIndexInit, 1U, 1U, file); // Byte at 384 + } + + for (i = 0U; i < 8U; i++) + { + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].txAttenCfg.updateCfg.srcCfg.updateSrc, 4U, 1U, file); // Int32 at 1366 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].txAttenCfg.updateCfg.srcCfg.s0OrS1Gpio, 4U, 1U, file); // Int32 at 1370 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].txAttenCfg.updateCfg.trgCfg.updateTrg, 4U, 1U, file); // Int32 at 1374 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].txAttenCfg.updateCfg.trgCfg.triggerGpio, 4U, 1U, file); // Int32 at 1378 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].txAttenCfg.txAttenStepSize, 4U, 1U, file); // Int32 at 1382 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].txAttenInit_mdB, 2U, 1U, file); // UInt16 at 1386 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].txpowerMonitorCfg.inputSel, 4U, 1U, file); // Int32 at 1388 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].txpowerMonitorCfg.peakThreshold, 2U, 1U, file); // UInt16 at 1392 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].txpowerMonitorCfg.measDuration, 1U, 1U, file); // Byte at 1394 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].txpowerMonitorCfg.peakCount, 1U, 1U, file); // Byte at 1395 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].txpowerMonitorCfg.peakErrorClearRequired, 1U, 1U, file); // Byte at 1396 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].txpowerMonitorCfg.peakPowerEnable, 1U, 1U, file); // Byte at 1397 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].txpowerMonitorCfg.peakPowerIrqEnable, 1U, 1U, file); // Byte at 1398 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].txpowerMonitorCfg.avgThreshold, 2U, 1U, file); // UInt16 at 1399 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].txpowerMonitorCfg.avgErrorClearRequired, 1U, 1U, file); // Byte at 1401 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].txpowerMonitorCfg.avgPowerEnable, 1U, 1U, file); // Byte at 1402 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].txpowerMonitorCfg.avgPowerIrqEnable, 1U, 1U, file); // Byte at 1403 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].txpowerMonitorCfg.avgPeakRatioEnable, 1U, 1U, file); // Byte at 1404 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].srlCfg.inputSel, 4U, 1U, file); // Int32 at 1405 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].srlCfg.srdOffset, 2U, 1U, file); // UInt16 at 1409 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].srlCfg.srdEnable, 1U, 1U, file); // Byte at 1411 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].srlCfg.srdIrqEnable, 1U, 1U, file); // Byte at 1412 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].srlCfg.autoRecoveryWaitTime, 1U, 1U, file); // Byte at 1413 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].srlCfg.autoRecoveryEnable, 1U, 1U, file); // Byte at 1414 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].srlCfg.autoRecoveryDisableTimerWhenTxOff, 1U, 1U, file); // Byte at 1415 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].srlCfg.srdStatisticsEnable, 1U, 1U, file); // Byte at 1416 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].srlCfg.srdStatisticsMode, 1U, 1U, file); // Byte at 1417 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].protectionRampCfg.rampDownMask, 4U, 1U, file); // UInt32 at 1418 + SAFE_READ(recoveryAction, device, target->tx.txChannelCfg[i].protectionRampCfg.altEventClearReqd, 1U, 1U, file); // Byte at 1422 + } + + for (i = 0U; i < 4U; i++) + { + SAFE_READ(recoveryAction, device, target->uart[i].enable, 1U, 1U, file); // Byte at 1822 + SAFE_READ(recoveryAction, device, target->uart[i].pinSelect, 4U, 1U, file); // Int32 at 1823 + } + + SAFE_READ(recoveryAction, device, target->gpIntPreInit.gpInt0Mask.lowerMask, 8U, 1U, file); // UInt64 at 1842 + SAFE_READ(recoveryAction, device, target->gpIntPreInit.gpInt0Mask.upperMask, 8U, 1U, file); // UInt64 at 1850 + SAFE_READ(recoveryAction, device, target->gpIntPreInit.gpInt1Mask.lowerMask, 8U, 1U, file); // UInt64 at 1858 + SAFE_READ(recoveryAction, device, target->gpIntPreInit.gpInt1Mask.upperMask, 8U, 1U, file); // UInt64 at 1866 + + SAFE_READ(recoveryAction, device, target->radioCtrlPreInit.radioSequencerSsbSyncGpioCtrl, 4U, 1U, file); + for (i = 0U; i < ADI_ADRV904X_GPIO_COUNT; i++) + { + SAFE_READ(recoveryAction, device, target->radioCtrlPreInit.radioSequencerGpioDigOut[i], 4U, 1U, file); + } + + for (i = 0U; i < ADI_ADRV904X_GPIO_ANALOG_COUNT; i++) + { + SAFE_READ(recoveryAction, device, target->radioCtrlPreInit.radioSequencerGpioAnaOut[i], 4U, 1U, file); + } + + SAFE_READ(recoveryAction, device, target->dfeUart0.enableGpioTx, 1U, 1U, file); + SAFE_READ(recoveryAction, device, target->dfeUart0.enableGpioRx, 1U, 1U, file); + SAFE_READ(recoveryAction, device, target->dfeUart0.enableGpioCts, 1U, 1U, file); + SAFE_READ(recoveryAction, device, target->dfeUart0.enableGpioRts, 1U, 1U, file); + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e adrv904x_LoadPostMcsInitStructFromBin(adi_adrv904x_Device_t* const device, adi_adrv904x_PostMcsInit_t* const target, FILE* const file) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + /* hash designed to check if data inside the binary is for this type of structure */ + const uint8_t STRUCT_HASH[16] = { 0xAC, 0xB7, 0x4F, 0x9A, 0xF2, 0x5E, 0xD2, 0x96, 0xDD, 0xA8, 0xA8, 0x75, 0xAC, 0xDB, 0xA4, 0xF2 }; + char buf[16]; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_RETURN(target); + ADI_ADRV904X_NULL_PTR_RETURN(file); + + if (ADI_LIBRARY_FREAD(buf, 1, 16, file) != 16) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, file, "Unable to read bin file."); + return recoveryAction; + } + + if (ADI_LIBRARY_MEMCMP(buf, STRUCT_HASH, 16) != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, file, "Incorrect structure format written in bin file."); + return recoveryAction; + } + + SAFE_READ(recoveryAction, device, target->radioCtrlCfg.txRadioCtrlModeCfg.txEnableMode, 4U, 1U, file); // Int32 at 16 + SAFE_READ(recoveryAction, device, target->radioCtrlCfg.txRadioCtrlModeCfg.txChannelMask, 4U, 1U, file); // UInt32 at 20 + SAFE_READ(recoveryAction, device, target->radioCtrlCfg.rxRadioCtrlModeCfg.rxEnableMode, 4U, 1U, file); // Int32 at 24 + SAFE_READ(recoveryAction, device, target->radioCtrlCfg.rxRadioCtrlModeCfg.rxChannelMask, 4U, 1U, file); // UInt32 at 28 + SAFE_READ(recoveryAction, device, target->radioCtrlCfg.orxRadioCtrlModeCfg.orxEnableMode, 4U, 1U, file); // Int32 at 32 + SAFE_READ(recoveryAction, device, target->radioCtrlCfg.orxRadioCtrlModeCfg.orxChannelMask, 4U, 1U, file); // UInt32 at 36 + SAFE_READ(recoveryAction, device, target->radioCtrlGpioCfg.txEnMapping, 1U, 8U, file); // Byte[8] at 40-47 + SAFE_READ(recoveryAction, device, target->radioCtrlGpioCfg.txAltMapping, 1U, 8U, file); // Byte[8] at 48-55 + SAFE_READ(recoveryAction, device, target->radioCtrlGpioCfg.rxEnMapping, 1U, 8U, file); // Byte[8] at 56-63 + SAFE_READ(recoveryAction, device, target->radioCtrlGpioCfg.rxAltMapping, 1U, 8U, file); // Byte[8] at 64-71 + SAFE_READ(recoveryAction, device, target->radioCtrlTxRxEnPinSel, 1U, 1U, file); // Byte at 72 + SAFE_READ(recoveryAction, device, target->radioCtrlTxRxEnCfgSel, 1U, 1U, file); // Byte at 73 + SAFE_READ(recoveryAction, device, target->gpIntPostInit.gpInt0Mask.lowerMask, 8U, 1U, file); // UInt64 at 74 + SAFE_READ(recoveryAction, device, target->gpIntPostInit.gpInt0Mask.upperMask, 8U, 1U, file); // UInt64 at 82 + SAFE_READ(recoveryAction, device, target->gpIntPostInit.gpInt1Mask.lowerMask, 8U, 1U, file); // UInt64 at 90 + SAFE_READ(recoveryAction, device, target->gpIntPostInit.gpInt1Mask.upperMask, 8U, 1U, file); // UInt64 at 98 + SAFE_READ(recoveryAction, device, target->initCals.calMask, 8U, 1U, file); // UInt64 at 106 + SAFE_READ(recoveryAction, device, target->initCals.rxChannelMask, 4U, 1U, file); // UInt32 at 114 + SAFE_READ(recoveryAction, device, target->initCals.txChannelMask, 4U, 1U, file); // UInt32 at 118 + SAFE_READ(recoveryAction, device, target->initCals.orxChannelMask, 4U, 1U, file); // UInt32 at 122 + SAFE_READ(recoveryAction, device, target->initCals.warmBoot, 1U, 1U, file); // Byte at 126 + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_LoadBinFile(adi_adrv904x_Device_t* const device, + FILE* const file, + adi_adrv904x_Version_t* const apiVer, + adi_adrv904x_CpuFwVersion_t* const fwVer, + adi_adrv904x_Version_t* const streamVer, + adi_adrv904x_Init_t* const initStruct, + adi_adrv904x_PostMcsInit_t* const postMcsInitStruct, + const uint32_t fileOffset) +{ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + uint32_t totalFileSize = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, file); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, apiVer); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, fwVer); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, streamVer); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, initStruct); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, postMcsInitStruct); + + + /* Determine file size */ + if (ADI_LIBRARY_FSEEK(file, 0U, SEEK_END) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, file, "Seek to EOF Failed"); + return recoveryAction; + } + + /* ADI_LIBRARY_FTELL returns long type */ + totalFileSize = (uint32_t) ADI_LIBRARY_FTELL(file); + + /* Check that FW binary file is not empty */ + if (0U == totalFileSize) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, totalFileSize, "Zero Length CPU Profile Binary Detected"); + return recoveryAction; + } + + if (ADI_LIBRARY_FSEEK(file, 0U, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, file, "Could not rewind to start"); + return recoveryAction; + } + + if (ADI_LIBRARY_FSEEK(file, fileOffset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, file, "Could not rewind to file Offset"); + return recoveryAction; + } + + recoveryAction = adrv904x_LoadVersionFromBin(device, apiVer, file); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to read bin file to extract api version"); + return recoveryAction; + } + + recoveryAction = adrv904x_LoadFwVersionFromBin(device, fwVer, file); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to read bin file to extract firmware version"); + return recoveryAction; + } + + recoveryAction = adrv904x_LoadVersionFromBin(device, streamVer, file); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to read bin file to extract stream version"); + return recoveryAction; + } + + recoveryAction = adrv904x_LoadInitStructFromBin(device, initStruct, file); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to read bin file to extract adi_adrv904x_Init_t struct"); + return recoveryAction; + } + + recoveryAction = adrv904x_LoadPostMcsInitStructFromBin(device, postMcsInitStruct, file); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to read bin file to extract adi_adrv904x_PostMcsInit_t struct"); + return recoveryAction; + } + + return recoveryAction; +} diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_carrier_reconfigure.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_carrier_reconfigure.c new file mode 100644 index 00000000000..783265ce3fa --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_carrier_reconfigure.c @@ -0,0 +1,7490 @@ +/** +* Copyright 2015 - 2022 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adrv904x_carrier_reconfigure.c + * \brief Contains ADRV904X Rx related private function implementations + * + * ADRV904X API Version: 2.10.0.4 + */ + +#include "../../private/bf/adrv904x_bf_cddc_funcs.h" +#include "../../private/bf/adrv904x_bf_cddc_hb_dpath.h" +#include "../../private/bf/adrv904x_bf_cduc_funcs.h" +#include "../../private/bf/adrv904x_bf_cduc_hb_dpath.h" +#include "../../private/bf/adrv904x_bf_jesd_common.h" +#include "../../private/include/adrv904x_carrier_reconfigure.h" +#include "../../private/include/adrv904x_rx.h" +#include "../../private/include/adrv904x_tx.h" + +#define ADRV904X_SLOTS_PER_REGISTER (8U) +#define ADRV904X_LAST_VALID_SLOT_SELECT_IN_CARRIER_MODE (31U) +#define ADRV904X_JESD_INT_INTERLEAVING_RATIO (4U) +#define ADRV904X_JESD_INTERFACE_MAX_FREQ_KHZ (500000U) +#define ADRV904X_JESD_XBAR_NUM_COLUMNS (16U) +#define ADRV904X_RAND_TABLE_NUM_ARRAY_SIZES (7) + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_CARRIER_RECONFIGURE + +static const int16_t adrv904x_cddc_coefs_5g_fs_122880_ibw_60000[] = { + -30, -6, 12, 14, 0, -2, 11, 13, -2, -7, 9, 14, -3, -11, 6, 17, + -2, -15, 3, 19, 1, -19, -1, 22, 5, -22, -6, 24, 10, -24, -12, 26, + 16, -25, -20, 26, 24, -25, -28, 24, 33, -22, -37, 20, 42, -17, -46, 14, + 51, -10, -55, 5, 59, 0, -63, -6, 66, 13, -69, -21, 71, 29, -73, -38, + 74, 48, -73, -58, 72, 69, -70, -80, 66, 91, -61, -103, 55, 115, -47, -126, + 38, 138, -26, -149, 13, 159, 1, -169, -18, 178, 37, -186, -57, 193, 80, -198, + -105, 201, 132, -203, -161, 202, 193, -198, -228, 191, 265, -181, -305, 166, 349, -147, + -398, 122, 451, -90, -510, 50, 578, 2, -656, -69, 751, 157, -869, -279, 1028, 455, + -1257, -734, 1636, 1252, -2423, -2579, 5253, 14397 +}; + +static const int16_t adrv904x_cddc_coefs_5g_fs_122880_ibw_70000[] = { + 33, 1, -18, -7, 4, -11, -14, 6, 2, -17, -3, 12, -9, -16, 11, 8, + -20, -4, 20, -7, -22, 15, 16, -24, -9, 29, -4, -31, 16, 25, -29, -16, + 38, 1, -42, 16, 38, -34, -27, 47, 9, -55, 13, 53, -37, -42, 57, 21, + -70, 7, 72, -38, -61, 66, 37, -86, -4, 94, -35, -85, 73, 60, -103, -21, + 119, -27, -116, 78, 91, -121, -46, 149, -13, -154, 78, 131, -139, -82, 183, 11, + -201, 73, 185, -156, -133, 223, 49, -261, 58, 257, -171, -206, 273, 108, -343, 27, + 363, -184, -320, 340, 209, -466, -32, 535, -195, -521, 448, 402, -694, -164, 892, -202, + -995, 704, 941, -1365, -630, 2291, -206, -4014, 3201, 16180 +}; + +static const int16_t adrv904x_cddc_coefs_5g_fs_122880_ibw_80000[] = { + -30, -21, 16, -7, -3, 7, 0, -11, 13, -2, -11, 11, 3, -15, 12, 5, + -18, 10, 10, -21, 9, 15, -23, 5, 20, -24, 1, 26, -24, -5, 31, -23, + -12, 36, -20, -20, 41, -16, -30, 44, -9, -39, 45, 0, -49, 45, 11, -58, + 41, 24, -66, 35, 39, -73, 26, 54, -78, 13, 70, -79, -3, 86, -77, -22, + 102, -70, -44, 115, -59, -69, 126, -42, -95, 132, -20, -122, 134, 7, -150, 130, + 41, -176, 118, 79, -199, 99, 122, -218, 70, 169, -231, 31, 220, -237, -18, 272, + -233, -79, 326, -216, -154, 380, -185, -244, 432, -134, -352, 481, -59, -485, 526, 52, + -652, 565, 216, -877, 598, 476, -1217, 624, 955, -1859, 642, 2193, -3891, 650, 17731 +}; + +static const int16_t adrv904x_cddc_coefs_5g_fs_122880_ibw_90000[] = { + -24, 23, 24, 0, 14, 3, -6, 13, -7, -2, 12, -13, 6, 6, -15, 14, + -3, -12, 19, -14, -2, 18, -22, 11, 9, -25, 24, -5, -18, 31, -22, -3, + 28, -35, 18, 13, -37, 36, -10, -26, 46, -34, -2, 40, -52, 28, 18, -54, + 54, -16, -36, 66, -51, -1, 56, -75, 42, 22, -75, 79, -26, -48, 93, -75, + 3, 76, -106, 63, 27, -104, 112, -42, -63, 130, -109, 10, 102, -150, 95, 31, + -143, 161, -66, -82, 182, -160, 23, 139, -215, 143, 35, -201, 236, -106, -109, 263, + -242, 47, 197, -321, 226, 39, -299, 369, -181, -155, 414, -401, 98, 310, -542, 408, + 41, -521, 689, -374, -270, 830, -875, 266, 693, -1373, 1179, 42, -1775, 2940, -2219, -1999, + 18993 +}; + +static const int16_t adrv904x_cddc_coefs_5g_fs_122880_ibw_100000[] = { + -39, -8, 10, -12, 12, -10, 5, 1, -7, 10, -10, 5, 2, -10, 16, -16, + 11, -2, -8, 16, -19, 15, -5, -8, 19, -25, 21, -10, -5, 20, -29, 28, + -16, -2, 21, -34, 35, -25, 4, 19, -37, 43, -34, 12, 16, -40, 52, -45, + 23, 10, -41, 59, -58, 35, 1, -40, 66, -71, 51, -11, -35, 72, -85, 69, + -27, -27, 75, -99, 89, -47, -15, 75, -112, 111, -71, 3, 70, -123, 135, -100, + 27, 61, -132, 160, -134, 58, 44, -136, 186, -173, 97, 19, -136, 212, -217, 146, + -17, -128, 237, -269, 207, -66, -110, 260, -330, 286, -136, -77, 282, -404, 391, -236, + -22, 300, -500, 541, -388, 72, 315, -643, 784, -655, 254, 326, -913, 1293, -1272, 730, + 333, -1788, 3392, -4844, 5856, 26550 +}; + +static const int16_t adrv904x_cddc_coefs_5g_fs_15360_ibw_5000[] = { + 15, -21, -24, -20, -6, 10, 16, 6, -11, -21, -12, 8, 24, 20, -4, -27, + -28, -3, 28, 37, 13, -26, -45, -25, 20, 52, 40, -11, -57, -55, -3, 57, + 71, 21, -53, -86, -44, 43, 99, 70, -26, -107, -98, 1, 109, 127, 31, -102, + -154, -70, 85, 177, 116, -57, -193, -166, 15, 200, 219, 40, -193, -272, -109, 169, + 321, 194, -124, -362, -292, 54, 391, 406, 47, -402, -536, -189, 386, 686, 388, -330, + -867, -680, 209, 1110, 1159, 51, -1521, -2175, -761, 2724, 6906, 9739 +}; + +static const int16_t adrv904x_cddc_coefs_5g_fs_15360_ibw_10000[] = { + 42, -21, -38, 35, -15, -58, 60, 0, -92, 81, 29, -140, 96, 78, -201, 99, + 151, -273, 79, 258, -352, 26, 407, -433, -78, 614, -511, -264, 912, -579, -604, 1398, + -633, -1336, 2468, -667, -4119, 9341, 21166 +}; + +static const int16_t adrv904x_cddc_coefs_5g_fs_245760_ibw_200000[] = { + -73, -20, 22, -22, 19, -9, -4, 16, -24, 22, -11, -6, 23, -33, 30, -15, + -8, 29, -41, 37, -17, -13, 40, -54, 47, -20, -17, 51, -67, 57, -22, -25, + 67, -85, 70, -26, -33, 83, -104, 84, -28, -45, 106, -129, 102, -32, -58, 131, + -157, 122, -34, -76, 164, -193, 146, -37, -98, 204, -237, 176, -38, -127, 257, -294, + 215, -41, -167, 328, -371, 267, -42, -225, 431, -485, 345, -44, -316, 596, -670, 474, + -45, -483, 910, -1040, 748, -46, -898, 1778, -2210, 1785, -46, -4048, 19824 +}; + +static const int16_t adrv904x_cddc_coefs_5g_fs_30720_ibw_25000[] = { + -48, 5, 9, -28, 44, -48, 35, -4, -36, 72, -87, 70, -21, -50, 117, -153, + 137, -64, -49, 167, -243, 241, -145, -26, 221, -370, 406, -293, 45, 273, -552, 678, + -570, 214, 316, -863, 1227, -1212, 693, 344, -1777, 3370, -4821, 5836, 26568 +}; + +static const int16_t adrv904x_cddc_coefs_5g_fs_30720_ibw_5000[] = { + 22, -1, -2, -5, -8, -10, -12, -11, -9, -6, -2, 2, 5, 7, 7, 4, + 0, -4, -8, -11, -11, -8, -4, 2, 7, 11, 13, 12, 7, 1, -6, -12, + -15, -16, -12, -5, 3, 11, 17, 19, 17, 11, 1, -9, -17, -22, -22, -17, + -7, 5, 16, 24, 27, 24, 14, 1, -13, -25, -31, -31, -23, -9, 7, 23, + 34, 37, 32, 19, 1, -19, -35, -43, -42, -30, -11, 11, 32, 47, 50, 43, + 24, -1, -26, -47, -58, -55, -39, -13, 17, 44, 63, 67, 56, 31, -3, -37, + -64, -77, -73, -51, -16, 24, 61, 84, 89, 72, 38, -6, -51, -86, -103, -95, + -65, -18, 36, 83, 113, 117, 94, 48, -12, -72, -118, -138, -126, -84, -20, 52, + 115, 154, 158, 125, 61, -21, -103, -164, -189, -171, -111, -22, 78, 165, 217, 221, + 172, 79, -38, -153, -240, -274, -245, -156, -23, 125, 254, 331, 335, 258, 113, -72, + -255, -394, -450, -402, -252, -24, 236, 468, 615, 629, 489, 206, -175, -579, -914, -1087, + -1019, -666, -24, 858, 1892, 2953, 3908, 4629, 5016 +}; + +static const int16_t adrv904x_cddc_coefs_5g_fs_30720_ibw_10000[] = { + -25, 1, 10, 17, 16, 7, -3, -6, 1, 10, 13, 6, -6, -13, -7, 7, + 16, 11, -4, -16, -14, 2, 17, 18, 2, -17, -22, -6, 17, 26, 11, -14, + -29, -17, 11, 31, 24, -6, -33, -30, 0, 33, 37, 7, -32, -44, -16, 29, + 49, 25, -24, -54, -36, 17, 57, 47, -7, -58, -58, -4, 57, 69, 18, -53, + -79, -33, 46, 88, 50, -36, -94, -68, 22, 98, 87, -5, -98, -105, -15, 94, + 123, 39, -85, -138, -66, 72, 151, 95, -53, -161, -127, 28, 166, 159, 4, -165, + -191, -41, 157, 222, 85, -141, -251, -135, 116, 277, 191, -80, -298, -254, 32, 312, + 323, 31, -317, -399, -112, 310, 483, 216, -288, -579, -352, 245, 691, 535, -168, -833, + -804, 34, 1038, 1253, 229, -1414, -2234, -934, 2588, 6925, 9898 +}; + +static const int16_t adrv904x_cddc_coefs_5g_fs_30720_ibw_15000[] = { + 34, 2, -26, -20, 12, 9, -26, -24, 19, 23, -27, -36, 23, 41, -25, -54, + 20, 62, -18, -75, 11, 87, -3, -100, -8, 112, 22, -125, -39, 137, 59, -148, + -83, 157, 111, -164, -143, 169, 180, -170, -222, 167, 268, -158, -321, 143, 380, -120, + -447, 88, 523, -42, -611, -19, 716, 105, -846, -224, 1015, 400, -1256, -682, 1646, 1204, + -2443, -2536, 5281, 14360 +}; + +static const int16_t adrv904x_cddc_coefs_5g_fs_30720_ibw_20000[] = { + -34, 17, 32, -11, 8, 32, -21, -4, 40, -26, -18, 52, -25, -36, 64, -17, + -58, 75, -3, -85, 82, 21, -114, 83, 54, -145, 73, 98, -174, 50, 152, -199, + 12, 215, -213, -47, 286, -213, -128, 362, -191, -236, 440, -139, -378, 517, -47, -562, + 588, 108, -811, 651, 368, -1181, 701, 856, -1855, 736, 2112, -3919, 754, 17674 +}; + +static const int16_t adrv904x_cddc_coefs_5g_fs_491520_ibw_400000[] = { + -73, -20, 22, -22, 19, -9, -4, 16, -24, 22, -11, -6, 23, -33, 30, -15, + -8, 29, -41, 37, -17, -13, 40, -54, 47, -20, -17, 51, -67, 57, -22, -25, + 67, -85, 70, -26, -33, 83, -104, 84, -28, -45, 106, -129, 102, -32, -58, 131, + -157, 122, -34, -76, 164, -193, 146, -37, -98, 204, -237, 176, -38, -127, 257, -294, + 215, -41, -167, 328, -371, 267, -42, -225, 431, -485, 345, -44, -316, 596, -670, 474, + -45, -483, 910, -1040, 748, -46, -898, 1778, -2210, 1785, -46, -4048, 19824 +}; + +static const int16_t adrv904x_cddc_coefs_5g_fs_61440_ibw_30000[] = { + -30, 7, 28, 18, -8, -3, 23, 15, -18, -13, 23, 21, -23, -25, 25, 31, + -24, -37, 24, 45, -22, -53, 20, 61, -17, -70, 12, 79, -5, -89, -3, 98, + 12, -108, -24, 117, 38, -125, -54, 133, 72, -140, -92, 145, 116, -149, -142, 151, + 171, -150, -203, 147, 238, -140, -277, 129, 320, -113, -368, 91, 421, -62, -480, 24, + 549, 25, -628, -90, 724, 177, -844, -297, 1004, 472, -1235, -751, 1615, 1269, -2404, -2596, + 5234, 14414 +}; + +static const int16_t adrv904x_cddc_coefs_5g_fs_61440_ibw_40000[] = { + -16, 34, 25, -10, 7, 13, -18, 4, 17, -22, 1, 24, -24, -4, 31, -25, + -11, 40, -25, -21, 48, -23, -32, 56, -17, -46, 63, -8, -62, 68, 4, -79, + 70, 21, -97, 69, 42, -116, 63, 67, -133, 52, 97, -149, 34, 131, -161, 8, + 169, -169, -26, 210, -170, -70, 254, -163, -125, 298, -145, -193, 343, -113, -275, 388, + -63, -375, 430, 11, -498, 468, 118, -656, 503, 278, -872, 532, 534, -1204, 554, 1007, + -1838, 570, 2238, -3861, 578, 17769 +}; + +static const int16_t adrv904x_cddc_coefs_5g_fs_61440_ibw_50000[] = { + 44, 3, -9, 17, -23, 22, -14, 0, 15, -27, 30, -21, 1, 22, -41, 47, + -37, 12, 21, -50, 64, -56, 25, 20, -63, 87, -83, 47, 11, -71, 112, -116, + 77, -4, -78, 140, -158, 119, -32, -77, 170, -209, 176, -74, -67, 199, -272, 253, + -137, -42, 228, -350, 358, -233, 6, 253, -453, 511, -385, 96, 275, -603, 759, -653, + 275, 292, -879, 1274, -1274, 751, 302, -1760, 3379, -4851, 5879, 26520 +}; + +static const int16_t adrv904x_cddc_coefs_5g_fs_7680_ibw_5000[] = { + 55, 1, -72, 94, 6, -154, 158, 63, -309, 247, 178, -548, 337, 417, -936, 424, + 901, -1649, 490, 2177, -3763, 527, 17778 +}; + +static const int16_t adrv904x_cddc_coefs_high_bw_5g_fs_122880_ibw_60000[] = { + -41, -51, -8, 12, 13, -17, -6, 12, 11, -16, -10, 13, 14, -15, -15, 14, + 19, -14, -21, 12, 24, -11, -27, 9, 30, -6, -33, 3, 36, 0, -39, -5, + 41, 9, -43, -14, 45, 20, -46, -26, 46, 33, -46, -40, 45, 47, -43, -55, + 40, 63, -37, -71, 32, 78, -26, -86, 18, 93, -10, -100, 0, 107, 11, -112, + -23, 117, 36, -121, -51, 123, 66, -124, -83, 124, 101, -121, -120, 117, 140, -110, + -160, 102, 181, -90, -203, 76, 225, -58, -247, 37, 270, -13, -292, -16, 314, 49, + -336, -88, 357, 133, -377, -185, 396, 245, -415, -316, 432, 401, -447, -504, 462, 634, + -474, -804, 485, 1039, -494, -1396, 501, 2019, -506, -3436, 509, 10417, 15874 +}; + +static const int16_t adrv904x_cddc_coefs_lte_fs_15360_ibw_5000[] = { + 6, 1, -5, -13, -18, -15, -5, 6, 10, 4, -7, -13, -8, 5, 15, 13, + -2, -16, -18, -3, 16, 23, 10, -14, -28, -18, 9, 31, 28, -1, -32, -37, + -9, 30, 46, 22, -24, -53, -37, 14, 57, 53, 0, -57, -69, -19, 52, 83, + 42, -41, -94, -67, 23, 100, 93, 2, -99, -119, -35, 89, 143, 72, -69, -160, + -115, 38, 169, 159, 5, -167, -203, -59, 151, 244, 124, -119, -276, -198, 67, 297, + 280, 7, -300, -366, -105, 281, 454, 231, -231, -540, -391, 141, 620, 595, 8, -691, + -869, -253, 750, 1280, 694, -795, -2060, -1731, 822, 4869, 8587, 10091 +}; + +static const int16_t adrv904x_cddc_coefs_lte_fs_15360_ibw_10000[] = { + -26, -24, 27, 8, -39, 31, 36, -70, 17, 88, -95, -29, 160, -97, -120, 238, + -49, -260, 298, 75, -445, 302, 307, -659, 196, 687, -874, -114, 1302, -1060, -877, 2531, + -1186, -3752, 9569, 20614 +}; + +static const int16_t adrv904x_cddc_coefs_lte_fs_30720_ibw_5000[] = { + 1, 1, 1, 1, 0, -1, -2, -3, -5, -6, -7, -8, -7, -6, -4, -2, + 0, 2, 3, 4, 3, 2, 0, -2, -3, -4, -4, -3, -2, 1, 3, 4, + 5, 5, 3, 1, -2, -4, -6, -6, -5, -3, 0, 3, 6, 7, 7, 5, + 2, -2, -6, -8, -9, -8, -5, 0, 4, 8, 10, 10, 8, 4, -2, -7, + -11, -13, -11, -7, -1, 5, 11, 14, 15, 12, 6, -2, -9, -15, -17, -16, + -11, -3, 6, 14, 19, 20, 16, 9, -1, -11, -19, -23, -22, -15, -5, 7, + 17, 25, 27, 22, 13, 0, -14, -24, -30, -29, -21, -8, 7, 22, 32, 35, + 30, 18, 1, -16, -31, -39, -38, -29, -12, 8, 27, 41, 45, 40, 25, 3, + -20, -39, -50, -50, -38, -17, 9, 34, 52, 58, 52, 33, 6, -24, -49, -64, + -65, -50, -24, 9, 42, 65, 75, 67, 44, 9, -29, -62, -81, -83, -66, -32, + 10, 52, 83, 96, 87, 58, 14, -35, -78, -104, -108, -86, -44, 11, 65, 106, + 124, 115, 78, 21, -43, -100, -136, -141, -115, -60, 11, 83, 139, 165, 153, 106, + 31, -54, -131, -181, -191, -157, -85, 11, 110, 188, 227, 214, 150, 48, -72, -182, + -256, -275, -230, -127, 12, 158, 277, 340, 326, 235, 80, -107, -284, -409, -449, -385, + -222, 12, 269, 491, 622, 619, 464, 172, -210, -607, -929, -1084, -1000, -634, 12, 891, + 1913, 2958, 3896, 4602, 4981 +}; + +static const int16_t adrv904x_cddc_coefs_lte_fs_30720_ibw_10000[] = { + -9, -10, -7, 2, 13, 18, 14, 3, -6, -7, 3, 14, 16, 6, -9, -16, + -9, 9, 22, 17, -3, -22, -23, -3, 23, 31, 12, -20, -37, -23, 14, 42, + 35, -4, -43, -48, -9, 41, 60, 26, -34, -69, -45, 22, 76, 66, -4, -77, + -87, -20, 71, 106, 49, -57, -121, -82, 35, 130, 117, -3, -130, -151, -38, 119, + 183, 87, -96, -208, -143, 57, 223, 203, -2, -224, -265, -69, 208, 323, 157, -169, + -375, -262, 102, 414, 384, -1, -434, -524, -142, 426, 685, 345, -377, -877, -644, 259, + 1131, 1131, -1, -1552, -2158, -710, 2764, 6900, 9693 +}; + +static const int16_t adrv904x_cddc_coefs_lte_fs_30720_ibw_15000[] = { + 7, 2, -18, -31, -11, 18, 10, -24, -21, 25, 32, -23, -47, 17, 63, -5, + -79, -13, 94, 38, -104, -71, 108, 110, -104, -155, 88, 205, -57, -255, 10, 304, + 56, -346, -144, 378, 255, -392, -392, 382, 557, -339, -758, 248, 1005, -85, -1329, -200, + 1802, 741, -2680, -2110, 5592, 13985 +}; + +static const int16_t adrv904x_cddc_coefs_lte_fs_30720_ibw_20000[] = { + -24, -29, 15, 13, -31, 8, 36, -41, -15, 67, -35, -59, 94, -1, -119, 99, + 70, -181, 61, 175, -219, -38, 302, -200, -207, 416, -87, -441, 471, 157, -718, 402, + 574, -1003, 107, 1250, -1250, -670, 2554, -1419, -3588, 9667, 20366 +}; + +static const int16_t adrv904x_cddc_coefs_lte_fs_7680_ibw_5000[] = { + 14, -25, -55, 38, 20, -94, 61, 83, -178, 58, 202, -290, 5, 405, -418, -141, + 729, -549, -464, 1268, -661, -1208, 2410, -737, -4034, 9360, 21081 +}; + +static const int16_t adrv904x_cddc_coefs_lte_iot_fs_15360_ibw_10000[] = { + 10, 0, -29, -17, 9, -10, -10, 17, -8, -14, 23, -7, -22, 30, -4, -32, + 36, 2, -45, 42, 11, -60, 48, 23, -78, 51, 40, -99, 52, 62, -121, 50, + 89, -146, 43, 124, -172, 30, 167, -199, 8, 218, -227, -23, 281, -254, -67, 358, + -280, -130, 452, -305, -217, 574, -327, -343, 738, -346, -536, 981, -362, -865, 1404, -373, + -1567, 2406, -380, -4305, 9214, 21463 +}; + +static const int16_t adrv904x_cddc_coefs_lte_iot_fs_30720_ibw_20000[] = { + 19, 30, -1, -15, 13, 5, -20, 12, 14, -27, 6, 28, -32, -6, 44, -32, + -26, 61, -23, -52, 73, -2, -84, 76, 32, -117, 65, 80, -146, 34, 139, -161, + -19, 203, -156, -98, 265, -120, -201, 315, -45, -324, 338, 78, -463, 319, 259, -607, + 235, 513, -746, 53, 871, -869, -302, 1424, -965, -1065, 2564, -1027, -3896, 9505, 20797 +}; + +static const int16_t adrv904x_cddc_coefs_high_bw_5g_fs_122880_ibw_100000[] = { + 52, 17, -16, 16, -13, 8, -1, -6, 11, -13, 9, -1, -8, 16, -19, 16, + -7, -5, 16, -21, 20, -10, -4, 18, -27, 27, -17, 1, 17, -30, 33, -24, + 6, 16, -34, 41, -34, 14, 12, -36, 49, -44, 24, 7, -37, 56, -57, 36, + -2, -36, 63, -69, 51, -14, -31, 68, -83, 69, -29, -23, 71, -96, 88, -49, + -11, 70, -109, 110, -72, 6, 66, -119, 134, -101, 30, 56, -128, 158, -134, 60, + 40, -132, 184, -173, 99, 15, -131, 209, -217, 148, -20, -123, 233, -268, 209, -70, + -105, 257, -328, 287, -139, -73, 278, -402, 392, -239, -18, 296, -498, 541, -391, 76, + 311, -641, 784, -657, 258, 322, -910, 1292, -1274, 734, 329, -1784, 3390, -4846, 5859, 26545 +}; + +static const int16_t adrv904x_cduc_coefs_5g_fs_122880_ibw_60000[] = { + -4, -113, 139, -62, -37, 33, 27, -22, -25, 16, 26, -12, -27, 8, 28, -5, + -29, 1, 31, 2, -32, -6, 33, 10, -33, -14, 33, 19, -33, -23, 32, 28, + -31, -32, 30, 37, -27, -42, 24, 47, -21, -51, 16, 55, -11, -59, 6, 63, + 1, -66, -7, 69, 15, -71, -23, 72, 32, -72, -41, 71, 50, -69, -60, 66, + 70, -62, -80, 57, 90, -50, -100, 42, 109, -33, -118, 22, 126, -10, -133, -4, + 140, 19, -145, -35, 149, 53, -152, -71, 152, 91, -150, -113, 147, 135, -141, -157, + 133, 181, -121, -205, 107, 229, -89, -254, 68, 279, -43, -304, 13, 328, 21, -352, + -61, 375, 107, -397, -160, 419, 222, -439, -295, 457, 381, -474, -487, 490, 619, -504, + -791, 516, 1029, -525, -1388, 533, 2012, -539, -3432, 542, 10416, 15841 +}; + +static const int16_t adrv904x_cduc_coefs_5g_fs_122880_ibw_70000[] = { + 13, -116, 118, -64, -20, 46, -3, -36, 14, 28, -24, -19, 31, 8, -35, 6, + 34, -19, -28, 32, 17, -40, -1, 43, -17, -39, 34, 28, -47, -10, 54, -12, + -52, 35, 41, -54, -22, 66, -4, -68, 33, 58, -59, -37, 78, 7, -85, 27, + 79, -62, -58, 89, 24, -104, 17, 103, -61, -84, 99, 48, -124, 0, 131, -55, + -117, 106, 80, -145, -25, 164, -41, -157, 109, 122, -166, -61, 201, -18, -206, 105, + 177, -185, -112, 244, 19, -270, 91, 252, -203, -187, 297, 79, -355, 62, 360, -218, + -303, 366, 180, -481, 3, 535, -230, -506, 477, 375, -712, -129, 896, -238, -983, 735, + 915, -1386, -596, 2297, -243, -4004, 3234, 16156 +}; + +static const int16_t adrv904x_cduc_coefs_5g_fs_122880_ibw_80000[] = { + -52, 1, 47, -94, 104, -65, 8, 24, -11, -21, 34, -10, -23, 29, -1, -29, + 28, 6, -34, 24, 14, -38, 20, 22, -41, 14, 31, -43, 6, 40, -43, -3, + 48, -41, -14, 56, -36, -26, 62, -29, -39, 66, -19, -53, 68, -6, -66, 66, + 10, -79, 61, 27, -89, 53, 47, -98, 40, 67, -103, 23, 88, -103, 1, 108, + -99, -23, 126, -90, -52, 142, -74, -82, 153, -52, -114, 159, -24, -147, 159, 11, + -179, 151, 52, -208, 134, 99, -233, 107, 151, -252, 68, 207, -263, 18, 265, -263, + -45, 325, -251, -123, 386, -222, -216, 444, -174, -329, 499, -99, -467, 550, 12, -640, + 595, 178, -872, 632, 441, -1219, 661, 923, -1868, 681, 2166, -3906, 691, 17709 +}; + +static const int16_t adrv904x_cduc_coefs_5g_fs_122880_ibw_90000[] = { + -60, 38, -22, -11, 49, -75, 77, -55, 21, 5, -10, -6, 28, -40, 32, -7, + -19, 27, -13, -14, 35, -34, 11, 20, -38, 28, 3, -34, 43, -23, -14, 43, + -43, 12, 30, -52, 40, 2, -44, 58, -31, -19, 58, -58, 17, 39, -70, 53, + 2, -59, 77, -42, -25, 77, -78, 24, 50, -93, 72, 1, -77, 102, -56, -32, + 102, -104, 32, 66, -123, 96, 1, -102, 136, -76, -41, 136, -139, 44, 87, -164, + 129, 0, -136, 183, -103, -55, 184, -189, 61, 119, -225, 178, 0, -189, 256, -145, + -78, 260, -270, 87, 172, -328, 261, -1, -282, 386, -221, -119, 406, -427, 140, 280, + -544, 441, -1, -499, 701, -413, -231, 817, -897, 308, 659, -1371, 1210, -1, -1748, 2947, + -2256, -1958, 18975 +}; + +static const int16_t adrv904x_cduc_coefs_5g_fs_122880_ibw_100000[] = { + 0, -63, 51, -59, 59, -50, 32, -10, -11, 26, -30, 24, -9, -9, 23, -29, + 25, -12, -6, 23, -32, 30, -17, -3, 23, -35, 35, -23, 2, 21, -38, 42, + -31, 8, 18, -40, 48, -40, 17, 14, -41, 55, -50, 26, 7, -40, 60, -60, + 38, -1, -37, 65, -71, 51, -12, -33, 68, -81, 66, -26, -25, 70, -92, 82, + -42, -15, 69, -101, 99, -61, -1, 65, -110, 117, -83, 17, 58, -116, 135, -107, + 39, 47, -120, 154, -135, 66, 31, -121, 173, -166, 98, 9, -118, 192, -200, 137, + -21, -110, 209, -239, 185, -59, -95, 226, -284, 243, -111, -71, 241, -337, 317, -180, + -34, 255, -402, 416, -278, 23, 266, -490, 558, -426, 119, 276, -625, 793, -688, 300, + 282, -886, 1293, -1298, 774, 286, -1754, 3382, -4862, 5895, 26502 +}; + +static const int16_t adrv904x_cduc_coefs_5g_fs_15360_ibw_5000[] = { + 40, -205, 88, 82, 18, -39, -60, -32, 24, 62, 48, -12, -66, -65, -3, 68, + 84, 22, -67, -103, -46, 60, 121, 75, -46, -136, -108, 24, 148, 146, 7, -152, + -185, -49, 147, 226, 101, -131, -265, -165, 99, 299, 241, -50, -326, -329, -22, 342, + 429, 123, -340, -544, -260, 314, 678, 451, -252, -844, -732, 126, 1071, 1198, 134, -1468, + -2200, -842, 2659, 6914, 9814 +}; + +static const int16_t adrv904x_cduc_coefs_5g_fs_15360_ibw_10000[] = { + -102, 129, -92, -4, 83, -57, -40, 103, -41, -80, 123, -14, -128, 135, 30, -181, + 131, 95, -234, 103, 181, -279, 44, 286, -305, -55, 407, -299, -203, 536, -243, -412, + 665, -110, -702, 785, 145, -1125, 885, 646, -1861, 957, 1934, -3989, 994, 17544 +}; + +static const int16_t adrv904x_cduc_coefs_5g_fs_245760_ibw_200000[] = { + -63, 45, -46, 36, -15, -13, 41, -61, 67, -57, 33, -4, -21, 33, -26, 4, + 27, -56, 71, -64, 38, 1, -39, 63, -62, 34, 10, -57, 89, -92, 63, -10, + -49, 93, -104, 76, -16, -56, 113, -134, 108, -40, -47, 122, -157, 135, -61, -43, + 139, -191, 177, -95, -28, 150, -225, 223, -136, -9, 163, -270, 284, -194, 22, 173, + -322, 363, -271, 67, 184, -392, 475, -387, 141, 191, -494, 648, -575, 267, 197, -670, + 971, -950, 541, 201, -1093, 1847, -2126, 1580, 204, -4249, 19901 +}; + +static const int16_t adrv904x_cduc_coefs_5g_fs_30720_ibw_25000[] = { + -27, 90, -70, 87, -65, 31, 16, -57, 78, -70, 33, 23, -76, 107, -98, 48, + 27, -102, 146, -136, 71, 31, -134, 196, -188, 103, 34, -175, 264, -258, 147, 37, + -230, 356, -355, 211, 39, -309, 493, -505, 311, 41, -437, 724, -766, 496, 42, -693, + 1221, -1375, 972, 43, -1558, 3308, -4938, 6093, 26258 +}; + +static const int16_t adrv904x_cduc_coefs_5g_fs_30720_ibw_5000[] = { + 140, -189, -73, -8, 25, 38, 38, 29, 16, 2, -12, -23, -29, -28, -21, -10, + 4, 18, 28, 32, 28, 18, 3, -14, -28, -36, -36, -27, -11, 8, 27, 40, + 44, 37, 22, 0, -23, -42, -51, -49, -34, -11, 17, 42, 57, 60, 48, 24, + -7, -38, -62, -71, -64, -41, -7, 31, 63, 81, 81, 61, 25, -18, -60, -88, + -97, -83, -48, 1, 51, 92, 113, 107, 75, 23, -37, -91, -126, -132, -106, -54, + 14, 83, 135, 157, 142, 92, 17, -66, -138, -180, -181, -138, -59, 39, 133, 200, + 223, 193, 114, 3, -116, -215, -268, -260, -187, -63, 85, 223, 317, 341, 284, 152, + -29, -219, -372, -448, -421, -286, -66, 195, 440, 605, 640, 518, 247, -132, -544, -896, + -1090, -1042, -703, -68, 819, 1866, 2947, 3923, 4661, 5058 +}; + +static const int16_t adrv904x_cduc_coefs_5g_fs_30720_ibw_10000[] = { + -141, 164, 33, -33, -42, -13, 25, 42, 27, -9, -34, -28, 6, 38, 38, 4, + -35, -43, -10, 35, 51, 21, -31, -57, -31, 27, 63, 43, -19, -67, -55, 10, + 70, 68, 1, -71, -81, -16, 69, 94, 32, -64, -107, -51, 56, 118, 72, -44, + -127, -95, 28, 133, 120, -7, -136, -145, -19, 134, 171, 49, -127, -196, -85, 114, + 220, 125, -94, -241, -171, 66, 259, 222, -28, -272, -278, -21, 279, 340, 83, -278, + -408, -162, 265, 484, 262, -239, -571, -393, 192, 675, 571, -114, -809, -833, -22, 1007, + 1274, 284, -1376, -2247, -987, 2544, 6930, 9948 +}; + +static const int16_t adrv904x_cduc_coefs_5g_fs_30720_ibw_15000[] = { + 80, -170, 65, 39, -46, -46, 27, 47, -21, -54, 13, 60, -6, -67, -3, 73, + 13, -79, -25, 83, 38, -86, -53, 88, 70, -87, -88, 84, 107, -77, -128, 68, + 148, -54, -169, 37, 190, -15, -210, -12, 228, 44, -244, -81, 257, 123, -266, -172, + 270, 227, -269, -288, 259, 357, -241, -435, 212, 522, -170, -622, 109, 738, -23, -880, + -98, 1061, 277, -1313, -563, 1715, 1090, -2522, -2429, 5371, 14261 +}; + +static const int16_t adrv904x_cduc_coefs_5g_fs_30720_ibw_20000[] = { + -82, 71, -23, -59, 109, -84, 12, 33, -1, -67, 89, -28, -53, 62, 18, -98, + 79, 29, -107, 59, 72, -135, 46, 105, -143, 10, 152, -150, -32, 193, -138, -91, + 236, -113, -160, 269, -64, -242, 291, 8, -332, 291, 109, -427, 265, 243, -523, 200, + 418, -615, 81, 647, -698, -122, 964, -769, -477, 1465, -822, -1222, 2548, -856, -4018, 9432, + 20978 +}; + +static const int16_t adrv904x_cduc_coefs_5g_fs_491520_ibw_400000[] = { + -60, 42, -43, 32, -10, -18, 45, -65, 70, -58, 34, -5, -20, 32, -26, 3, + 28, -56, 70, -63, 36, 3, -41, 64, -62, 34, 11, -57, 88, -90, 61, -8, + -51, 94, -105, 76, -16, -56, 113, -133, 106, -38, -49, 124, -158, 135, -60, -44, + 139, -191, 175, -93, -30, 151, -226, 222, -135, -11, 164, -270, 283, -192, 20, 175, + -323, 363, -270, 65, 185, -393, 475, -386, 138, 193, -495, 648, -574, 265, 199, -671, + 971, -949, 539, 204, -1095, 1848, -2125, 1578, 206, -4251, 19902 +}; + +static const int16_t adrv904x_cduc_coefs_5g_fs_61440_ibw_30000[] = { + -85, 161, -61, -31, 45, 36, -24, -32, 22, 38, -14, -40, 10, 44, -5, -48, + -1, 51, 7, -54, -14, 57, 22, -58, -31, 59, 40, -59, -50, 57, 60, -54, + -71, 50, 82, -44, -93, 36, 104, -26, -115, 14, 125, -1, -133, -15, 141, 33, + -147, -53, 151, 75, -153, -99, 153, 124, -149, -151, 142, 180, -131, -209, 116, 240, + -96, -271, 71, 303, -41, -335, 4, 366, 41, -397, -94, 427, 156, -456, -231, 483, + 321, -508, -430, 531, 567, -552, -746, 570, 991, -585, -1357, 596, 1990, -605, -3419, 610, + 10411, 15772 +}; + +static const int16_t adrv904x_cduc_coefs_5g_fs_61440_ibw_40000[] = { + 46, -119, 88, -61, -12, 42, -28, -17, 38, -16, -25, 37, -7, -33, 36, 2, + -40, 34, 13, -48, 30, 24, -53, 23, 36, -58, 13, 49, -59, 1, 62, -58, + -14, 74, -53, -31, 85, -44, -51, 93, -30, -72, 97, -12, -93, 97, 11, -113, + 91, 38, -131, 78, 69, -146, 59, 102, -155, 32, 137, -158, -2, 171, -153, -44, + 204, -138, -93, 232, -111, -148, 255, -72, -209, 268, -20, -272, 270, 49, -339, 257, + 134, -405, 225, 239, -470, 169, 367, -531, 82, 526, -587, -52, 730, -635, -259, 1016, + -674, -608, 1481, -703, -1338, 2525, -721, -4108, 9373, 21118 +}; + +static const int16_t adrv904x_cduc_coefs_5g_fs_61440_ibw_50000[] = { + 58, -30, 24, -6, -20, 48, -71, 80, -73, 50, -17, -15, 36, -39, 22, 9, + -43, 66, -69, 48, -8, -36, 69, -79, 58, -13, -41, 85, -101, 81, -29, -38, + 96, -123, 106, -47, -34, 109, -150, 137, -72, -26, 122, -180, 175, -104, -12, 134, + -215, 222, -146, 8, 145, -257, 282, -202, 39, 155, -309, 361, -280, 85, 164, -378, + 472, -395, 158, 171, -479, 644, -584, 285, 177, -654, 966, -958, 558, 181, -1077, 1842, + -2133, 1597, 183, -4232, 19895 +}; + +static const int16_t adrv904x_cduc_coefs_5g_fs_7680_ibw_5000[] = { + -89, 61, 43, -171, 177, -23, -137, 103, 116, -258, 101, 219, -312, -5, 398, -349, + -186, 597, -294, -494, 813, -94, -975, 1012, 395, -1802, 1165, 1714, -4036, 1249, 17398 +}; + +static const int16_t adrv904x_cduc_coefs_high_bw_5g_fs_122880_ibw_60000[] = { + -103, 179, -19, -27, 30, 41, -6, -31, 5, 34, 2, -33, -7, 34, 11, -34, + -16, 33, 21, -33, -26, 32, 31, -30, -36, 28, 41, -25, -46, 21, 50, -17, + -55, 12, 59, -6, -63, 0, 66, 8, -69, -15, 71, 24, -72, -33, 72, 42, + -71, -52, 69, 62, -66, -73, 62, 83, -56, -93, 49, 103, -40, -113, 30, 122, + -18, -130, 5, 138, 9, -144, -25, 149, 43, -152, -62, 154, 82, -154, -103, 151, + 126, -147, -149, 139, 173, -129, -198, 115, 224, -98, -249, 78, 275, -53, -301, 24, + 326, 10, -351, -50, 376, 96, -399, -149, 422, 212, -443, -285, 463, 372, -481, -478, + 498, 611, -512, -784, 525, 1023, -535, -1383, 544, 2009, -550, -3431, 553, 10415, 15830 +}; + +static const int16_t adrv904x_cduc_coefs_lte_fs_15360_ibw_5000[] = { + 40, -17, -26, -27, -13, 8, 18, 9, -14, -29, -21, 6, 31, 29, -1, -34, + -40, -10, 33, 50, 22, -29, -59, -38, 21, 67, 56, -7, -71, -75, -11, 70, + 95, 35, -63, -113, -64, 49, 127, 96, -26, -136, -132, -6, 137, 168, 48, -127, + -202, -99, 105, 232, 158, -68, -254, -225, 14, 264, 297, 59, -259, -372, -154, 232, + 448, 275, -176, -522, -427, 83, 591, 621, 67, -652, -884, -309, 702, 1282, 745, -740, + -2050, -1774, 763, 4847, 8621, 10152 +}; + +static const int16_t adrv904x_cduc_coefs_lte_fs_15360_ibw_10000[] = { + 50, -52, -36, 59, -38, -72, 99, -5, -138, 123, 66, -221, 108, 187, -303, 27, + 360, -349, -150, 573, -313, -455, 804, -124, -944, 1020, 358, -1786, 1189, 1682, -4038, 1282, + 17378 +}; + +static const int16_t adrv904x_cduc_coefs_lte_fs_30720_ibw_5000[] = { + 26, 35, -11, 11, -7, -2, -10, -8, -9, -5, -1, 5, 9, 11, 11, 8, + 3, -3, -9, -13, -14, -12, -7, 0, 8, 14, 17, 17, 12, 4, -5, -14, + -20, -21, -18, -10, 1, 12, 21, 25, 24, 17, 5, -8, -21, -28, -30, -24, + -13, 3, 18, 30, 36, 33, 22, 5, -13, -30, -40, -41, -33, -16, 6, 27, + 42, 49, 44, 28, 5, -20, -42, -55, -55, -42, -19, 10, 38, 59, 66, 58, + 36, 4, -30, -59, -74, -73, -55, -22, 17, 54, 80, 88, 75, 44, 1, -44, + -81, -100, -96, -70, -25, 28, 76, 109, 117, 98, 55, -4, -64, -112, -136, -128, + -90, -28, 44, 108, 150, 158, 129, 68, -13, -95, -158, -188, -174, -118, -30, 69, + 158, 214, 222, 177, 88, -29, -145, -235, -273, -249, -163, -32, 116, 247, 328, 337, + 264, 122, -62, -247, -389, -450, -407, -260, -33, 227, 462, 613, 632, 496, 216, -165, + -571, -910, -1088, -1025, -674, -34, 849, 1886, 2952, 3912, 4636, 5025 +}; + +static const int16_t adrv904x_cduc_coefs_lte_fs_30720_ibw_10000[] = { + 27, -34, -30, -18, 1, 17, 17, -1, -22, -25, -6, 22, 32, 14, -20, -40, + -25, 14, 46, 38, -6, -49, -52, -7, 50, 67, 24, -45, -81, -45, 35, 92, + 70, -19, -99, -96, -5, 100, 123, 36, -93, -149, -74, 76, 170, 118, -48, -186, + -166, 7, 191, 217, 47, -183, -268, -115, 159, 316, 198, -115, -356, -295, 45, 384, + 407, 55, -393, -535, -196, 377, 684, 394, -321, -863, -685, 199, 1105, 1162, 60, -1514, + -2178, -770, 2717, 6906, 9748 +}; + +static const int16_t adrv904x_cduc_coefs_lte_fs_30720_ibw_15000[] = { + 58, -6, -42, -11, 46, 17, -62, -40, 64, 58, -73, -92, 66, 121, -60, -164, + 35, 201, -5, -245, -47, 280, 109, -314, -197, 332, 300, -339, -431, 318, 584, -269, + -776, 171, 1008, -7, -1320, -279, 1777, 815, -2643, -2180, 5541, 14045 +}; + +static const int16_t adrv904x_cduc_coefs_lte_fs_30720_ibw_20000[] = { + 50, -52, -36, 59, -38, -72, 99, -5, -138, 123, 66, -221, 108, 187, -303, 27, + 360, -349, -150, 573, -313, -455, 804, -124, -944, 1020, 358, -1786, 1189, 1682, -4038, 1282, + 17378 +}; + +static const int16_t adrv904x_cduc_coefs_lte_fs_7680_ibw_5000[] = { + 50, -52, -36, 59, -38, -72, 99, -5, -138, 123, 66, -221, 108, 187, -303, 27, + 360, -349, -150, 573, -313, -455, 804, -124, -944, 1020, 358, -1786, 1189, 1682, -4038, 1282, + 17378 +}; + +static const int16_t adrv904x_cduc_coefs_lte_iot_fs_15360_ibw_10000[] = { + -38, 23, 15, -3, 14, 13, -9, 9, 14, -13, 4, 17, -15, -1, 20, -15, + -6, 24, -14, -12, 27, -11, -19, 30, -7, -26, 31, -1, -33, 31, 7, -40, + 29, 17, -47, 24, 28, -52, 17, 40, -55, 7, 52, -55, -6, 64, -52, -21, + 75, -46, -38, 84, -35, -57, 90, -21, -77, 92, -1, -97, 90, 22, -115, 82, + 49, -131, 67, 79, -144, 46, 111, -150, 18, 144, -150, -17, 176, -142, -59, 206, + -125, -107, 231, -96, -160, 250, -56, -219, 260, -2, -280, 259, 66, -343, 243, 151, + -406, 209, 254, -467, 151, 380, -524, 62, 536, -576, -71, 737, -621, -278, 1019, -658, + -626, 1480, -685, -1353, 2520, -701, -4121, 9364, 21138 +}; + +static const int16_t adrv904x_cduc_coefs_lte_iot_fs_30720_ibw_20000[] = { + 34, -35, -19, 10, -18, -16, 22, -11, -22, 29, -5, -31, 32, 5, -41, 32, + 17, -52, 29, 33, -62, 20, 51, -69, 6, 72, -72, -15, 94, -68, -42, 114, + -57, -74, 130, -36, -111, 140, -4, -151, 141, 39, -191, 130, 93, -227, 103, 157, + -257, 59, 231, -275, -7, 311, -275, -97, 396, -253, -214, 481, -200, -364, 564, -104, + -556, 640, 55, -814, 706, 321, -1191, 758, 814, -1873, 795, 2075, -3943, 814, 17643 +}; + +static const int16_t adrv904x_cduc_coefs_high_bw_5g_fs_122880_ibw_100000[] = { + -86, 35, -29, 13, 9, -33, 52, -62, 59, -44, 23, -2, -12, 16, -7, -10, + 29, -43, 46, -36, 16, 9, -28, 37, -30, 10, 16, -40, 52, -47, 26, 4, + -34, 52, -51, 32, 1, -36, 60, -64, 46, -11, -30, 62, -73, 58, -21, -25, + 65, -84, 74, -37, -15, 64, -93, 89, -53, -4, 62, -102, 106, -73, 12, 57, + -109, 124, -96, 31, 48, -114, 142, -121, 55, 34, -116, 161, -150, 84, 15, -115, + 179, -182, 120, -10, -110, 197, -218, 162, -44, -98, 214, -259, 214, -88, -79, 229, + -307, 279, -147, -49, 243, -365, 363, -228, -3, 256, -439, 480, -347, 70, 266, -545, + 658, -539, 198, 274, -725, 985, -918, 474, 279, -1152, 1867, -2098, 1515, 282, -4311, 19925 +}; + +static adi_adrv904x_ErrAction_e cddc_assign_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierFilterApplicationType_e carrierChannelFilterApplicationSel, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps); + +static adi_adrv904x_ErrAction_e cduc_assign_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierFilterApplicationType_e carrierChannelFilterApplicationSel, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps); + +static uint32_t adrv904x_SampleRateJesdIqRatioCalculate(const uint32_t sampleRate_kHz) +{ + uint32_t samplingRatio = 1U; /* This is default for most cases */ + uint32_t interpolationRatio = 0U; + + if (sampleRate_kHz != 0U) + { + samplingRatio = sampleRate_kHz < ADRV904X_JESD_IQ_RATE_KHZ ? + ADRV904X_JESD_IQ_RATE_KHZ / sampleRate_kHz : 1U; + + /* Convert to log */ + while (samplingRatio > 1U) + { + interpolationRatio++; + samplingRatio >>= 1U; + } + } + + return interpolationRatio; +} + +static uint32_t adrv904x_CarrierBandSampleRateRatioCalculate(const uint32_t bandSampleRate_kHz, const uint32_t carrierSampleRate_kHz) +{ + uint32_t samplingRatio = 0U; /* This is default for most cases */ + uint32_t decimationRatio = 0U; + + if (carrierSampleRate_kHz == 0U) + { + return decimationRatio; + } + + samplingRatio = bandSampleRate_kHz; + samplingRatio /= carrierSampleRate_kHz; + samplingRatio >>= 1U; + + while (samplingRatio > 0U) + { + decimationRatio++; + samplingRatio >>= 1U; + } + + return decimationRatio; +} + +static uint32_t adrv904x_CarrierRateCalculate(const uint32_t hsDigRate_kHz, const uint32_t carrierSampleRate_kHz) +{ + uint32_t clkRatio = 0U; + uint32_t carrierRateRatio = 0U; + + if (carrierSampleRate_kHz == 0U) + { + return carrierRateRatio; + } + + clkRatio = hsDigRate_kHz / carrierSampleRate_kHz; + carrierRateRatio = 0U; + + while (clkRatio > 1U) + { + carrierRateRatio++; + clkRatio >>= 1U; + } + + return carrierRateRatio; +} + +static void swap(uint16_t* const a, uint16_t* const b) +{ + uint16_t tmp = *a; + + *a = *b; + *b = tmp; +} + + +static adi_adrv904x_ErrAction_e adrv904x_CarrierJesdSlotTableCalculate( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierRadioCfg_t* const carrierConfigs, + adi_adrv904x_CarrierReconfigProfileCfgOut_t* const carrierConfigsOut) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint16_t indexMap[ADI_ADRV904X_MAX_CARRIERS]; + uint16_t ratios[ADI_ADRV904X_MAX_CARRIERS]; + uint16_t count[ADI_ADRV904X_MAX_CARRIERS]; + uint32_t carrierIdx = 0U; + uint32_t altCarrierIdx = 0U; + uint32_t i = 0U; + uint8_t valid = 0U; + uint8_t assigned = 0U; + uint64_t mask = 1U; + uint32_t minIdx = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierConfigs); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierConfigsOut); + + ADI_LIBRARY_MEMSET(indexMap, 0, sizeof(indexMap)); + ADI_LIBRARY_MEMSET(ratios, 0, sizeof(ratios)); + ADI_LIBRARY_MEMSET(count, 0, sizeof(count)); + + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_CARRIERS; carrierIdx++) + { + indexMap[carrierIdx] = carrierIdx; /* Index map */ + + if (carrierConfigs->carriers[carrierIdx].sampleRate_kHz != 0U) + { + ratios[carrierIdx] = carrierConfigsOut->internalJesdCfg.frequencyKhz / carrierConfigs->carriers[carrierIdx].sampleRate_kHz; + count[carrierIdx] = 0U; + } + else + { + ratios[carrierIdx] = ADRV904X_SLOT_TABLE_UNUSED; + count[carrierIdx] = ADRV904X_SLOT_TABLE_UNUSED; + } + } + + for (carrierIdx = 0U; carrierIdx < (ADI_ADRV904X_MAX_CARRIERS - 1U); carrierIdx++) + { + minIdx = carrierIdx; + for (altCarrierIdx = carrierIdx + 1U; altCarrierIdx < ADI_ADRV904X_MAX_CARRIERS; altCarrierIdx++) + { + if (ratios[altCarrierIdx] < ratios[minIdx]) + { + minIdx = altCarrierIdx; + } + } + + /* Swap */ + swap(&ratios[minIdx], &ratios[carrierIdx]); + swap(&count[minIdx], &count[carrierIdx]); + swap(&indexMap[minIdx], &indexMap[carrierIdx]); + } + + /* Build Slot Table. Start from clean slate */ + carrierConfigsOut->internalJesdCfg.slotValid = 0U; + + for (i = 0U; i < carrierConfigsOut->internalJesdCfg.numSlots; i++) + { + valid = ADI_FALSE; + assigned = ADI_FALSE; + + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_CARRIERS; carrierIdx++) + { + if (count[carrierIdx] == 0U) + { + if (assigned == ADI_FALSE) + { + carrierConfigsOut->internalJesdCfg.slotTable[i] = indexMap[carrierIdx]; + count[carrierIdx] = (count[carrierIdx] + 1U) % ratios[carrierIdx]; /* increment the count for the carrier */ + valid = (carrierConfigs->carriers[indexMap[carrierIdx]].enable > 0U); + assigned = ADI_TRUE; + } + } + else + { + count[carrierIdx] = (count[carrierIdx] + 1U) % ratios[carrierIdx]; /* increment the count for the carrier */ + } + } + + if (valid == ADI_TRUE) + { + carrierConfigsOut->internalJesdCfg.slotValid |= mask; /* set valid bit associated with this slot. */ + } + + mask <<= 1U; + } + + /*interface slot table */ + ADI_LIBRARY_MEMSET(indexMap, 0, sizeof(indexMap)); + ADI_LIBRARY_MEMSET(ratios, 0, sizeof(ratios)); + ADI_LIBRARY_MEMSET(count, 0, sizeof(count)); + + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_CARRIERS; carrierIdx++) + { + indexMap[carrierIdx] = carrierIdx; /* Index map */ + if (carrierConfigs->carriers[indexMap[carrierIdx]].sampleRate_kHz != 0U) + { + ratios[carrierIdx] = carrierConfigsOut->internalJesdCfg.frequencyKhz / carrierConfigs->carriers[indexMap[carrierIdx]].sampleRate_kHz; + count[carrierIdx] = 0U; + } + else + { + ratios[carrierIdx] = ADRV904X_SLOT_TABLE_UNUSED; + count[carrierIdx] = ADRV904X_SLOT_TABLE_UNUSED; + } + } + + for (carrierIdx = 0U; carrierIdx < (ADI_ADRV904X_MAX_CARRIERS - 1U); carrierIdx++) + { + minIdx = carrierIdx; + for (altCarrierIdx = carrierIdx + 1U; altCarrierIdx < ADI_ADRV904X_MAX_CARRIERS; altCarrierIdx++) + { + if (ratios[altCarrierIdx] < ratios[minIdx]) + { + minIdx = altCarrierIdx; + } + } + + /* Swap */ + swap(&ratios[minIdx], &ratios[carrierIdx]); + swap(&count[minIdx], &count[carrierIdx]); + swap(&indexMap[minIdx], &indexMap[carrierIdx]); + } + + /* Calculate f_jesd/f_jesd_sample_rate ratio for each carrier after reordering based on sample rate */ + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_CARRIERS; carrierIdx++) + { + if (carrierConfigs->carriers[indexMap[carrierIdx]].sampleRate_kHz != 0U) + { + ratios[carrierIdx] = carrierConfigsOut->internalJesdCfg.frequencyKhz / carrierConfigs->carriers[indexMap[carrierIdx]].sampleRate_kHz; + count[carrierIdx] = 0U; + } + } + + for (i = 0U; i < carrierConfigsOut->internalJesdCfg.ifaceMaxSlot; i++) + { + /* Reinitialize before start of new slot table calculation */ + assigned = ADI_FALSE; + + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_CARRIERS; carrierIdx++) + { + if (count[carrierIdx] == 0U) + { + if (assigned == ADI_FALSE) + { + carrierConfigsOut->internalJesdCfg.ifaceSlotTable[i] = indexMap[carrierIdx]; + count[carrierIdx] = (count[carrierIdx] + 1U) % ratios[carrierIdx]; /* increment the count for the carrier */ + assigned = ADI_TRUE; + } + } + else + { + count[carrierIdx] = (count[carrierIdx] + 1U) % ratios[carrierIdx]; /* increment the count for the carrier */ + } + + carrierConfigsOut->internalJesdCfg.dummyIfaceSlotsRemoved[carrierIdx] = 0u; + } + + mask <<= 1U; /* Shift mask bit. */ + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CalculateRxSampleXbarSlotConfig( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierJesdCfg_t* const inJesdCfg, + adi_adrv904x_CarrierReconfigOutput_t* const out) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint16_t carrierIdx = 0U; + uint16_t sampleIdx = 0U; + uint32_t mask = 0U; + uint16_t iqFlag = 0U; + uint32_t m = 0U; + uint32_t linkIdx = 0U; + uint16_t slotIdx = 0U; + uint32_t i = 0U; + uint16_t tmp = 0U; + uint16_t subFrame = 0U; + uint16_t subFrameDepth = 0U; + uint16_t lane = 0U; + uint16_t laneDepth = 0U; + uint16_t jesdL = 0U; + uint16_t profIdx = 0U; + uint16_t mReal = 0U; + + adi_adrv904x_JesdComponentCarrierXbarOutput_t tempSlot[ADI_ADRV904X_MAX_CARRIER_SLOTS]; + uint32_t slotMapped[ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS]; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, inJesdCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, out); + + ADI_LIBRARY_MEMSET(&tempSlot, 0, sizeof(tempSlot)); + ADI_LIBRARY_MEMSET(&slotMapped, 0, sizeof(slotMapped)); + + for (linkIdx = 0U; linkIdx < ADI_ADRV904X_MAX_CARRIER_LINKS; linkIdx++) + { + mReal = device->initExtract.jesdSetting.framerSetting[linkIdx].jesdM * ADRV904X_JESD_INT_INTERLEAVING_RATIO; + for (m = 0U; m < ADI_ADRV904X_MAX_CARRIER_SLOTS; m++) + { + out->jesdCfg.linkCfg[linkIdx].jesdCfg[m].carrierSelect = inJesdCfg->linkCfg[linkIdx].carrierXbarCfg[m].carrierSelect; + out->jesdCfg.linkCfg[linkIdx].jesdCfg[m].channelSelect = inJesdCfg->linkCfg[linkIdx].carrierXbarCfg[m].channelSelect; + out->jesdCfg.linkCfg[linkIdx].jesdCfg[m].slotSelect = ADI_ADRV904X_CARRIER_UNUSED_CC_XBAR; + + /* break loop iteration if converter index is unused. */ + if (out->jesdCfg.linkCfg[linkIdx].jesdCfg[m].carrierSelect == ADI_ADRV904X_CARRIER_UNUSED_CC_XBAR) + { + break; + } + + carrierIdx = out->jesdCfg.linkCfg[linkIdx].jesdCfg[m].carrierSelect >> 1U; + iqFlag = out->jesdCfg.linkCfg[linkIdx].jesdCfg[m].carrierSelect % 2U; + profIdx = device->initExtract.chanAssign[out->jesdCfg.linkCfg[linkIdx].jesdCfg[m].channelSelect]; + sampleIdx = 0U; + + if (profIdx == 255U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + linkIdx, + "Framer sample XBAR mapped to an unconfigured CDDC."); + return recoveryAction; + } + + + /* Should we check for unused channels for error checking ? */ + if (carrierIdx < ADI_ADRV904X_MAX_CARRIERS) + { + mask = 1U << ((inJesdCfg->linkCfg[linkIdx].carrierXbarCfg[m].channelSelect << 1U) + iqFlag); + + for (slotIdx = 0U; slotIdx < out->profileCfgs[profIdx].internalJesdCfg.ifaceMaxSlot; slotIdx++) + { + if (out->profileCfgs[profIdx].internalJesdCfg.ifaceSlotTable[slotIdx] == carrierIdx) + { + if ((sampleIdx == inJesdCfg->linkCfg[linkIdx].carrierXbarCfg[m].sampleSelect) && + ((mask & slotMapped[slotIdx]) == 0U)) + { + out->jesdCfg.linkCfg[linkIdx].jesdCfg[m].slotSelect = (adi_adrv904x_JesdComponentCarrierXbar_e)((slotIdx << 1U) + iqFlag); + slotMapped[slotIdx] |= mask; + break; + } + else + { + sampleIdx++; + } + } + } + + if (out->jesdCfg.linkCfg[linkIdx].jesdCfg[m].slotSelect == ADI_ADRV904X_CARRIER_UNUSED_CC_XBAR) + { + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Framer %d sample XBAR[%d] not mapped to a CDDC iface slot.", linkIdx, m); + + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + out->jesdCfg.linkCfg[linkIdx].jesdCfg[m].slotSelect, + "Incomplete input carrier crossbar. Must assign all valid slots."); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + } + + if ((device->initExtract.framerInterleaveMode[linkIdx] == ADI_TRUE) && + (device->initExtract.jesdSetting.framerSetting[linkIdx].jesdM > 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_LIBRARY_MEMCPY(tempSlot, out->jesdCfg.linkCfg[linkIdx].jesdCfg, mReal * sizeof(adi_adrv904x_JesdComponentCarrierXbarOutput_t)); + + jesdL = 0U; + for (i = 0U; i < ADI_ADRV904X_MAX_SERIALIZER_LANES; i++) + { + if (((device->initExtract.jesdSetting.framerSetting[linkIdx].serialLaneEnabled >> i) & 0x1U) > 0U) + { + jesdL++; + } + } + + if (jesdL == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, jesdL, "Invalid Configuration Parameter"); + return recoveryAction; + } + + subFrameDepth = device->initExtract.jesdSetting.framerSetting[linkIdx].jesdM / jesdL; + laneDepth = subFrameDepth * ADRV904X_JESD_INT_INTERLEAVING_RATIO; + + if ((subFrameDepth == 0U) || (laneDepth == 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, subFrameDepth, "Invalid subFrameDepth or laneDepth Parameters"); + return recoveryAction; + } + + for (i = 0U; i < mReal; i++) + { + /* calculate actual virtual converter index output in this slot */ + tmp = (i % subFrameDepth); /* calculate location in subframe row */ + subFrame = ((i % laneDepth) / subFrameDepth); /* perform intermediate scaling required for current lane and subframe calculations. */ + lane = (i / laneDepth); /* calculate current lane of the subframe output */ + tmp += (lane * subFrameDepth); + tmp *= ADRV904X_JESD_INT_INTERLEAVING_RATIO; + tmp += subFrame; + + /* Assign the sample XBAR values for the actual output sample to this index */ + out->jesdCfg.linkCfg[linkIdx].jesdCfg[tmp].channelSelect = tempSlot[i].channelSelect; + out->jesdCfg.linkCfg[linkIdx].jesdCfg[tmp].carrierSelect = tempSlot[i].carrierSelect; + out->jesdCfg.linkCfg[linkIdx].jesdCfg[tmp].slotSelect = tempSlot[i].slotSelect; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + } + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CalculateTxSampleXbarSlotConfig( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierJesdCfg_t* const inJesdCfg, + adi_adrv904x_CarrierReconfigOutput_t* const out) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint16_t carrierIdx = 0U; + uint16_t sampleIdx = 0U; + uint32_t mask = 0U; + uint16_t iq = 0U; + uint16_t slotIdx = 0U; + uint32_t m = 0U; + uint32_t linkIdx = 0U; + uint32_t i = 0U; + uint32_t j = 0U; + uint16_t tmp = 0U; + uint16_t subFrame = 0U; + uint16_t subFrameDepth = 0U; + uint16_t lane = 0U; + uint16_t jesdL = 0U; + uint16_t numRows = 0U; + uint16_t numColumns = 0U; + uint16_t convIdx = 0U; + uint16_t index = 0U; + uint16_t profIdx = 0U; + uint8_t jesdM = 0U; + uint16_t mReal = 0U; + + uint32_t slotMapped[ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS]; + adi_adrv904x_JesdComponentCarrierXbarOutput_t tempSlot[ADI_ADRV904X_MAX_CARRIER_SLOTS]; + uint16_t ipOrdering[ADI_ADRV904X_MAX_CARRIER_SLOTS]; + uint16_t xbarOrdering[ADI_ADRV904X_MAX_CARRIER_SLOTS]; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, inJesdCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, out); + + ADI_LIBRARY_MEMSET(&slotMapped, 0, sizeof(slotMapped)); + ADI_LIBRARY_MEMSET(&tempSlot, 0, sizeof(tempSlot)); + ADI_LIBRARY_MEMSET(&ipOrdering, 0, sizeof(ipOrdering)); + ADI_LIBRARY_MEMSET(&xbarOrdering, 0xFF, sizeof(xbarOrdering)); + + for (linkIdx = 0U; linkIdx < ADI_ADRV904X_MAX_CARRIER_LINKS; linkIdx++) + { + jesdM = device->initExtract.jesdSetting.deframerSetting[linkIdx].jesdM; + mReal = jesdM * ADRV904X_JESD_INT_INTERLEAVING_RATIO; + convIdx = 0U; + + for (m = 0U; m < ADI_ADRV904X_MAX_CARRIER_SLOTS; m++) + { + out->jesdCfg.linkCfg[linkIdx].jesdCfg[m].carrierSelect = inJesdCfg->linkCfg[linkIdx].carrierXbarCfg[m].carrierSelect; + out->jesdCfg.linkCfg[linkIdx].jesdCfg[m].channelSelect = inJesdCfg->linkCfg[linkIdx].carrierXbarCfg[m].channelSelect; + out->jesdCfg.linkCfg[linkIdx].jesdCfg[m].slotSelect = ADI_ADRV904X_CARRIER_UNUSED_CC_XBAR; + + /* break loop iteration if converter index is unused. */ + if (out->jesdCfg.linkCfg[linkIdx].jesdCfg[m].carrierSelect == ADI_ADRV904X_CARRIER_UNUSED_CC_XBAR) + { + break; + } + + carrierIdx = out->jesdCfg.linkCfg[linkIdx].jesdCfg[m].carrierSelect >> 1U; + iq = out->jesdCfg.linkCfg[linkIdx].jesdCfg[m].carrierSelect % 2U; + profIdx = device->initExtract.chanAssign[out->jesdCfg.linkCfg[linkIdx].jesdCfg[m].channelSelect]; + sampleIdx = 0U; + + if (profIdx == 255U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + linkIdx, + "Deframer sample XBAR mapped to an unconfigured CDUC."); + return recoveryAction; + } + + /* Should we check for unused channels for error checking ? */ + if (carrierIdx < ADI_ADRV904X_MAX_CARRIERS) + { + mask = 1U << ((inJesdCfg->linkCfg[linkIdx].carrierXbarCfg[m].channelSelect << 1) + iq); + + for (slotIdx = 0; slotIdx < out->profileCfgs[profIdx].internalJesdCfg.ifaceMaxSlot; slotIdx++) + { + if (out->profileCfgs[profIdx].internalJesdCfg.ifaceSlotTable[slotIdx] == carrierIdx) + { + if ((sampleIdx == inJesdCfg->linkCfg[linkIdx].carrierXbarCfg[m].sampleSelect) && + ((mask & slotMapped[slotIdx]) == 0U)) + { + out->jesdCfg.linkCfg[linkIdx].jesdCfg[m].slotSelect = (adi_adrv904x_JesdComponentCarrierXbar_e)((slotIdx << 1U) + iq); + slotMapped[slotIdx] |= mask; + break; + } + else + { + sampleIdx++; + } + } + } + + if (out->jesdCfg.linkCfg[linkIdx].jesdCfg[m].slotSelect == ADI_ADRV904X_CARRIER_UNUSED_CC_XBAR) + { + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Deframer %d sample XBAR[%d] not mapped to a CDUC iface slot.", linkIdx, m); + + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Incomplete input carrier crossbar. Must assign all valid slots."); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + } + + if ((device->initExtract.deframerInterleaveMode[linkIdx] == ADI_TRUE) && + (device->initExtract.jesdSetting.deframerSetting[linkIdx].jesdM > 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + if ((mReal * sizeof(adi_adrv904x_JesdComponentCarrierXbarOutput_t)) > sizeof(tempSlot)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, mReal, "Invalid Configuration Parameter"); + return recoveryAction; + } + + ADI_LIBRARY_MEMCPY(tempSlot, out->jesdCfg.linkCfg[linkIdx].jesdCfg, mReal * sizeof(adi_adrv904x_JesdComponentCarrierXbarOutput_t)); + + jesdL = 0U; + for (i = 0U; i < ADI_ADRV904X_MAX_DESERIALIZER_LANES; i++) + { + if (((device->initExtract.jesdSetting.deframerSetting[linkIdx].deserialLaneEnabled >> i) & 0x1U) > 0U) + { + jesdL++; + } + } + + if (jesdL == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, jesdL, "Invalid Configuration Parameter"); + return recoveryAction; + } + + subFrameDepth = jesdM / jesdL; + + if (subFrameDepth == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, subFrameDepth, "Invalid Configuration Parameter"); + return recoveryAction; + } + + for (i = 0U; i < mReal; i++) + { + /* calculate actual virtual converter index output in this slot */ + tmp = (i % subFrameDepth); /* calculate location in subframe row */ + subFrame = (i / subFrameDepth); /* perform intermediate scaling required for current lane and subframe calculations. */ + lane = (subFrame % jesdL); /* calculate current lane of the subframe output */ + subFrame /= jesdL; /* final calculation to determine which subframe is active */ + tmp += ((lane * mReal) / jesdL); + tmp += (subFrame * subFrameDepth); + ipOrdering[i] = tmp; + } + + numColumns = ADRV904X_JESD_XBAR_NUM_COLUMNS; + numRows = mReal / numColumns; + numRows += ((mReal % numColumns) > 0U) ? 1U : 0U; + + for (subFrame = 0U; subFrame < ADRV904X_JESD_INT_INTERLEAVING_RATIO; subFrame++) + { + index = 0U; + + for (j = 0U; j < numRows; j++) + { + for (i = 0U; i < ADRV904X_JESD_INT_INTERLEAVING_RATIO; i++) + { + tmp = (j * numColumns) + (subFrame * 4U) + i; + + if (index < jesdM) + { + xbarOrdering[tmp] = ipOrdering[convIdx]; + out->jesdCfg.linkCfg[linkIdx].jesdCfg[tmp].channelSelect = tempSlot[ipOrdering[convIdx]].channelSelect; + out->jesdCfg.linkCfg[linkIdx].jesdCfg[tmp].carrierSelect = tempSlot[ipOrdering[convIdx]].carrierSelect; + out->jesdCfg.linkCfg[linkIdx].jesdCfg[tmp].slotSelect = tempSlot[ipOrdering[convIdx]].slotSelect; + convIdx++; + } + else + { + out->jesdCfg.linkCfg[linkIdx].jesdCfg[tmp].channelSelect = 0U; + out->jesdCfg.linkCfg[linkIdx].jesdCfg[tmp].carrierSelect = ADI_ADRV904X_CARRIER_UNUSED_CC_XBAR; + out->jesdCfg.linkCfg[linkIdx].jesdCfg[tmp].slotSelect = ADI_ADRV904X_CARRIER_UNUSED_CC_XBAR; + } + index++; + } + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + } + + return recoveryAction; +} + +/* Helper function to convert val_cc --> calc_ns (properly rounded to nearest 1ns) using jesd ratio log2 and jesd freq using only integer math */ +static uint32_t convert_cc_to_ns(uint32_t val_cc, uint32_t clkToJesdRatioLog2, uint32_t jesdFrequency_kHz) +{ + uint32_t ret = 0u; + + /* Cast to uint64_t to prevent overflow of 32bit reg after multiplication */ + uint64_t calc = (uint64_t)val_cc; + + /* Scale by 2 for rounding purposes */ + calc = calc << 1u; + + /* Scale to ns per hsdigclk cc */ + calc *= (1000000u >> clkToJesdRatioLog2); + calc /= jesdFrequency_kHz; + + /* Complete rounding operation */ + calc += 1u; + calc >>= 1u; + + /* cast back 32bit to return */ + ret = (uint32_t)calc; + + return (ret); +} + +/** +* \brief Final delay calculation. Accumulates all internal delay calculations and combines into the device delay configurations written to part +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \pre adrv904x_CducDelayCalculate +* \pre adrv904x_CddcDelayCalculate +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in,out] carrierConfigs holds the user selected values for reconfiguration +* \param[in,out] carrierConfigsOut holds the calculated values during reconfiguration +* \param[in,out] prms delay configuration written to part +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ + +static adi_adrv904x_ErrAction_e adrv904x_CalculateCommonDelayParameters(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierRadioCfg_t* const carrierConfigsIn, + const adi_adrv904x_CarrierReconfigProfileCfgOut_t* const carrierConfigsOut, + adi_adrv904x_CarrierDelayParameters_t* const prms) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + int diff_max = INT16_MIN; + int diff_min = INT16_MAX; + + uint8_t compensation_used = 0u; + uint16_t tmp = 0u; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierConfigsIn); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierConfigsOut); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, prms); + + /* Clear hw delay config settings */ + ADI_LIBRARY_MEMSET(&prms->bufferCfg, 0, sizeof(adi_adrv904x_CarrierHwDelayBufferConfig_t)); + + /* Calculate number of carrier samples to add to get close to target, total delays after adding buffers, and remaining delay errors */ + for (int i = 0; i < prms->noOfCarriers; i++) + { + if (carrierConfigsOut->carrierCfgs.carrierEnable[i] > 0) + { + compensation_used = 1u; + if (compensation_used == 1u) + { + tmp = prms->uncompOffset_cc[i]; + tmp <<= 1u; + tmp /= prms->carrSamplePeriod_cc[i]; + tmp += 1u; + tmp >>= 1u; + prms->compIntSamples[i] = tmp; + } + else + { + prms->compIntSamples[i] = 0u; + } + + /* Calculate compensation in cc's */ + prms->comp_cc[i] = prms->compIntSamples[i] * prms->carrSamplePeriod_cc[i]; + + /* Calculate final total delay in cc's: Combined group delay + Actual DelayBufferCompensation Offsets added */ + prms->finalDelayTotal_cc[i] = prms->groupDelayComb_cc[i] + prms->comp_cc[i]; + + /* Calculate final delay in the CDUC/CDDC only, removing group delay attributed to BandDUC/BandDDC + * This will be Carrier Grp Delay + Actual DelayBuffer Offsets + */ + prms->finalDelayCarr_cc[i] = prms->finalDelayTotal_cc[i] - prms->groupDelayBand_cc[i]; + + /* Calculate delayDiffPerCarrier_cc (the leftover error between this carrier's target vs. actual total delay) */ + prms->delayDiffPerCarrier_cc[i] = (int16_t)prms->targetDelay_cc[i] - (int16_t)prms->finalDelayTotal_cc[i]; + + /* Update diff max/min */ + diff_max = (prms->delayDiffPerCarrier_cc[i] > diff_max) ? prms->delayDiffPerCarrier_cc[i] : diff_max; + diff_min = (prms->delayDiffPerCarrier_cc[i] < diff_min) ? prms->delayDiffPerCarrier_cc[i] : diff_min; + + /* Convert final delays from cc --> ns and store */ + prms->finalDelayTotal_ns[i] = convert_cc_to_ns(prms->finalDelayTotal_cc[i], prms->clkToJesdRatioLog2, prms->jesdFrequency_kHz); + prms->finalDelayCarr_ns[i] = convert_cc_to_ns(prms->finalDelayCarr_cc[i], prms->clkToJesdRatioLog2, prms->jesdFrequency_kHz); + } + } + + /* Calculate total delay mismatch between any 2 carriers = diff_max - diff_min */ + prms->delayMismatch_cc = (diff_max - diff_min); + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + + +static uint32_t filterDelay(uint16_t tap_count, + uint32_t clkPeriod) +{ + /* calculate numerator */ + uint32_t delay = 0; + delay = tap_count - 1u; + delay *= clkPeriod; + /* scale numerator by 2 for rounding purposes */ + delay <<= 1u; + /* Divide */ + delay /= 2u; + /* complete the rounding operation */ + delay += 1u; + delay >>= 1u; + + return delay; +} + +/* channel filter pipeline delay */ + +static uint32_t cfiltPipeDelay( uint8_t bypass, + uint32_t jesdClkPeriod, + uint16_t end_bank, + uint32_t carr_clk_period) +{ + const uint16_t NO_OF_CHAN_FILTER_8_TAP_DATA_PIPES = 17u; + const uint16_t NO_OF_CHAN_FILTER_16_TAP_DATA_PIPES = 30u; + const uint16_t CHAN_FILTER_PIPELINE_DELAY_DIVISOR = 6u; + + uint32_t accum_max_count; + uint32_t accum_delay; + uint32_t delay; + + if (bypass > 0u) + { + return jesdClkPeriod; + } + + if (end_bank <= NO_OF_CHAN_FILTER_8_TAP_DATA_PIPES) + { + accum_max_count = 8u; + } + else if (end_bank <= (NO_OF_CHAN_FILTER_8_TAP_DATA_PIPES + NO_OF_CHAN_FILTER_16_TAP_DATA_PIPES)) + { + accum_max_count = 16u; + } + else + { + accum_max_count = 32u; + } + + accum_delay = (accum_max_count < carr_clk_period) ? accum_max_count : carr_clk_period; + + delay = accum_delay + (((end_bank - 1u) / CHAN_FILTER_PIPELINE_DELAY_DIVISOR) * jesdClkPeriod) + 4u + (jesdClkPeriod << 1u); + + return delay; +} + +/* hb filter delay */ + +static uint32_t hbFilterDelay( uint8_t num_hb, + uint32_t carr_clk_period) +{ + const uint32_t CARRIER_GROUP_DELAY_HALF_BAND_DELAYS[] = { 35, 9, 7, 5, 5 }; + + uint32_t dly = 0; + for (uint8_t i = 0; i < num_hb; i++) + { + dly += CARRIER_GROUP_DELAY_HALF_BAND_DELAYS[i] * (carr_clk_period >> (i + 1)); + } + return dly; +} + +/* interleaver delay */ + +static uint32_t interleaverDelay( uint8_t carr_slot, + uint32_t jesdClkPeriod) +{ + return (jesdClkPeriod * carr_slot); +} + +/** +* \brief Calculates resource sharing block delay +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] carrierMask carrier mask +* \param[in] resourcePipe holds the calculated resource share configuration +* \param[in] jesdClkPeriod_cc jesd clk period in hsdigclk clock cycles +* \param[in] carrierNum the carrier to calculated for +* +* \retval delay Resource Share delay for the requested carrier +*/ + +static uint32_t resourceShareDelay( adi_adrv904x_Device_t* const device, + const adrv904x_CarrierResourceSharePrm_t * const prms, + uint32_t all_carr_enable, + uint32_t jesdClkPeriod, + uint8_t carr_to_check) +{ + long int max_carr_period = 0; + int carr_arrival_slot[ADI_ADRV904X_MAX_CARRIERS]; + int carr_slot_allocation[ADRV904X_NO_OF_RSD_CARRIER_SLOTS]; + int carr_slot_in[ADRV904X_NO_OF_RSD_CARRIER_SLOTS][ADI_ADRV904X_MAX_CARRIERS]; + int carr_slot_out[ADRV904X_NO_OF_RSD_CARRIER_SLOTS]; + int carr_first_in_slot[ADI_ADRV904X_MAX_CARRIERS]; + int carr_first_out_slot[ADI_ADRV904X_MAX_CARRIERS]; + long int carr_delay[ADI_ADRV904X_MAX_CARRIERS]; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, prms); + + const uint8_t num_carr = prms->numCarriers; + + ADI_LIBRARY_MEMSET(&carr_arrival_slot, 0, sizeof(carr_arrival_slot)); + ADI_LIBRARY_MEMSET(&carr_slot_allocation, 0, sizeof(carr_slot_allocation)); + ADI_LIBRARY_MEMSET(&carr_slot_in, 0, sizeof(carr_slot_in)); + ADI_LIBRARY_MEMSET(&carr_slot_out, 0, sizeof(carr_slot_out)); + ADI_LIBRARY_MEMSET(&carr_first_in_slot, 0, sizeof(carr_first_in_slot)); + ADI_LIBRARY_MEMSET(&carr_first_out_slot, 0, sizeof(carr_first_out_slot)); + ADI_LIBRARY_MEMSET(&carr_first_out_slot, 0, sizeof(carr_first_out_slot)); + ADI_LIBRARY_MEMSET(&carr_delay, 0, sizeof(carr_delay)); + + for (int i = 0; i < num_carr; i++) + { + if ((all_carr_enable & (1 << i)) > 0) + { + max_carr_period = (max_carr_period > (long int) prms->clkPeriod[i]) ? max_carr_period : (long int)prms->clkPeriod[i] ; + } + } + int max_slots = max_carr_period / jesdClkPeriod; + + for (int i = 0; i < max_slots; i++) + { + carr_slot_allocation[i] = num_carr; + } + + for (int i = 0; i < max_slots; i++) + { + for (int j = 0; j < num_carr; j++) + { + carr_slot_in[i][j] = 0; + } + } + int slot_step_size = max_slots + 1; + int first_enabled_carr = 1; + int first_carr_num = 0; + uint32_t min_carr_delay = UINT32_MAX; + for (int i = 0; i < num_carr; i++) + { + if ((all_carr_enable & (1 << i)) > 0) + { + if (first_enabled_carr == 1) + { + min_carr_delay = prms->dlyPrev[i]; + first_enabled_carr = 0; + } + else + { + min_carr_delay = (min_carr_delay < prms->dlyPrev[i]) ? min_carr_delay : prms->dlyPrev[i]; + } + } + } + first_enabled_carr = 1; + for (int i = 0; i < num_carr; i++) + { + if ((min_carr_delay == prms->dlyPrev[i]) && (first_enabled_carr == 1)) + { + first_carr_num = i; + first_enabled_carr = 0; + } + } + + for (int i = 0; i < num_carr; i++) + { + if ((all_carr_enable & (1 << i)) > 0) + { + carr_arrival_slot[i] = ((int)(prms->dlyPrev[i] - prms->dlyPrev[first_carr_num]) / jesdClkPeriod) % max_slots; + slot_step_size = prms->clkPeriod[i] / jesdClkPeriod; + } + else + { + carr_arrival_slot[i] = max_slots; + slot_step_size = max_slots + 1; + } + /* allocating slots based on priority (lowest carrier highest priority) */ + int j = carr_arrival_slot[i]; + while (j >= 0) { + j = j - slot_step_size; + } + + j = j + slot_step_size; + + while (j < max_slots) + { + if (carr_slot_allocation[j] == num_carr) + { + carr_slot_allocation[j] = i; + j = j + slot_step_size; + } + else + { + j = j + 1; + } + } + + /* arrival order */ + j = carr_arrival_slot[i]; + while (j >= 0) + { + j = j - slot_step_size; + } + + j = j + slot_step_size; + carr_first_in_slot[i] = j; + + while (j < max_slots) + { + carr_slot_in[j][i] = 1; + j = j + slot_step_size; + } + } + /* Rotating once due to delay difference between data and valids + * int carr_slot_out[ADRV904X_NO_OF_RSD_CARRIER_SLOTS]; + */ + carr_slot_out[0] = carr_slot_allocation[max_slots - 1]; + for (int i = 1; i < max_slots; i++) + { + carr_slot_out[i] = carr_slot_allocation[i - 1]; + } + + for (int i = 0; i < num_carr; i++) + { + carr_first_out_slot[i] = max_slots; + for (int j = 0; j < max_slots; j++) + { + if ((carr_slot_out[j] == i) && (carr_first_out_slot[i] > j)) + { + carr_first_out_slot[i] = j; + } + } + } + + for (int i = 0; i < num_carr; i++) + { + carr_delay[i] = (carr_first_out_slot[i] - carr_first_in_slot[i]) * jesdClkPeriod; + if (carr_delay[i] < 0) + { + carr_delay[i] = carr_delay[i] + max_slots*jesdClkPeriod; + } + while (carr_delay[i] > (long int) prms->clkPeriod[i]) + { + carr_delay[i] = carr_delay[i] - prms->clkPeriod[i]; + } + } + return (uint32_t)carr_delay[carr_to_check]; +} + +/* cddc hb slot_gen delay */ + +static uint32_t cddcHbSlotGenDelay( uint8_t carr_to_check, + uint32_t cddc_clk_period, + uint32_t band_clk_period, + uint32_t pwrmeas_clk_period) +{ + uint32_t counter_delay; + uint32_t data_pipe_delay; + uint32_t slot_delay; + + counter_delay = ((carr_to_check % 4u) * cddc_clk_period); + data_pipe_delay = pwrmeas_clk_period + 1; + + if (counter_delay < data_pipe_delay) + { + slot_delay = counter_delay + band_clk_period - data_pipe_delay; + } + else + { + slot_delay = counter_delay - data_pipe_delay; + } + + return slot_delay; +} + + +static adi_adrv904x_ErrAction_e transferJesdConfigToOutputCfg( adi_adrv904x_Device_t* const device, + adi_adrv904x_CarrierReconfigProfileCfgOut_t * const pProfileCfgOut, + const adrv904x_CarrierJesdParameters_t * const prms) +{ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, pProfileCfgOut); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, prms); + + pProfileCfgOut->internalJesdCfg.frequencyKhz = prms->frequency_kHz; + pProfileCfgOut->internalJesdCfg.divide = prms->divide; + pProfileCfgOut->internalJesdCfg.initSlot = prms->initSlot; + pProfileCfgOut->internalJesdCfg.maxSlot = prms->maxSlot; + pProfileCfgOut->internalJesdCfg.slotValid = prms->slotValid; + pProfileCfgOut->internalJesdCfg.ifaceMaxSlot = prms->ifaceMaxSlot; + + for (int i = 0; i < (int)ADI_ADRV904X_MAX_TXCHANNELS; i++) + { + pProfileCfgOut->internalJesdCfg.dummyIfaceSlotsRemoved[i] = 0; + } + + /* Taking the slot table as it is from configurator instead of making the invalid slots as 0 */ + for (int i = 0; i < (int)ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS; i++) + { + if (i < (int)pProfileCfgOut->internalJesdCfg.maxSlot) + { + pProfileCfgOut->internalJesdCfg.slotTable[i] = prms->slotTable[i]; + } + else + { + pProfileCfgOut->internalJesdCfg.slotTable[i] = (uint16_t)ADRV904X_SLOT_TABLE_UNUSED; + } + } + + for (int i = 0; i < (int)ADI_ADRV904X_MAX_NO_OF_JESD_IFACE_SLOTS; i++) + { + pProfileCfgOut->internalJesdCfg.ifaceSlotTable[i] = prms->ifaceSlotTable[i]; + } + return (ADI_ADRV904X_ERR_ACT_NONE); +} + +/* Transfer shuffle prms structure --> profile config output structure */ +static adi_adrv904x_ErrAction_e transferJesdConfigShuffleToJesd(adi_adrv904x_Device_t* const device, + adi_adrv904x_CarrierReconfigProfileCfgOut_t * const pProfileCfgOut, + const adrv904x_SlotTableShuffleParams_t * const prms) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint16_t iface_slot_valid[ADI_ADRV904X_MAX_NO_OF_JESD_IFACE_SLOTS]; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, pProfileCfgOut); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, prms); + + ADI_LIBRARY_MEMSET(iface_slot_valid, 0, sizeof(iface_slot_valid)); + + /* Copy over carrier slot table and carrier valid array[64] to single 64bit word */ + pProfileCfgOut->internalJesdCfg.slotValid = 0u; + for (int i = 0; i < (int)ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS; i++) + { + if (prms->jesdSlotValid[i] > 0u) + { + pProfileCfgOut->internalJesdCfg.slotValid += (1ull << i); + } + + pProfileCfgOut->internalJesdCfg.slotTable[i] = prms->jesdSlotTable[i]; + } + + /* Convert carrier slot table --> iface slot table */ + + /* initialize cduc iface slot table to all ADRV904X_SLOT_TABLE_UNUSED and invalid */ + for (int i = 0u; i < (int)ADI_ADRV904X_MAX_NO_OF_JESD_IFACE_SLOTS; i++) + { + + pProfileCfgOut->internalJesdCfg.ifaceSlotTable[i] = ADRV904X_SLOT_TABLE_UNUSED; + iface_slot_valid[i] = 0u; + } + + /* Iterate through all carrier slots, and apply to iface table element [i % iface_size]. Check for overwrites */ + for (int i = 0u; i < (int)ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS; i++) + { + int iface_idx = i % pProfileCfgOut->internalJesdCfg.ifaceMaxSlot; + + /* Check if carrier table slot a value other than UNUSED */ + if (prms->jesdSlotTable[i] != ADRV904X_SLOT_TABLE_UNUSED) + { + /* Carrier table has a valid entry at slot i. Check if associated iface table slot conflicts */ + if ((pProfileCfgOut->internalJesdCfg.ifaceSlotTable[iface_idx] != prms->jesdSlotTable[i]) && + (iface_slot_valid[iface_idx] == 1u) && + prms->jesdSlotValid[i] == 1u) + { + /* ERROR! iface table already allocated for a different carrier at [i % ifaceMaxSlots]! */ + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, + "ERROR: CDUC IFACE SLOT TABLE element %d cannot be allocated for more than one carrier slot. Check carriers %d and %d", + iface_idx, + pProfileCfgOut->internalJesdCfg.ifaceSlotTable[iface_idx], + prms->jesdSlotTable[i]); + + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + iface_idx, + "CDUC IFACE SLOT TABLE element error at iface_idx. Cannot be allocated for more than one carrier slot."); + return recoveryAction; + } + + pProfileCfgOut->internalJesdCfg.ifaceSlotTable[iface_idx] = prms->jesdSlotTable[i]; + iface_slot_valid[iface_idx] = prms->jesdSlotValid[i]; + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return (recoveryAction); +} + +/* Transfer Slot Table data into Shuffle Prms structure */ + +static adi_adrv904x_ErrAction_e transferSlotTableConfig(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierReconfigProfileCfgOut_t * const pProfileCfgOut, + adrv904x_SlotTableShuffleParams_t *const prms) +{ + uint64_t slot_valid_mask = 1u; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, pProfileCfgOut); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, prms); + + //* Create carriers enabled mask based on the sample rate to accomodate dummy carriers */ + prms->carriersEnabled = 0u; + for (int i = 0; i < (int)ADI_ADRV904X_MAX_CARRIERS; i++) + { + prms->carrierClkPeriod[i] = (1u << pProfileCfgOut->carrierCfgs.carrierRateRatio[i]); + prms->carrierSlots[i] = 0; + if (pProfileCfgOut->carrierCfgs.carrierEnable[i] > 0) + { + for (uint8_t s = 0u; s < ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS; s++) + { + if (pProfileCfgOut->internalJesdCfg.slotTable[s] == i) + { + prms->carrierSlots[i] = s; + break; + } + } + } + } + + prms->carriersEnabled = pProfileCfgOut->carriersEnabled; + + prms->jesdClkPeriod = 1u << pProfileCfgOut->internalJesdCfg.divide; + prms->jesdMaxSlot = pProfileCfgOut->internalJesdCfg.maxSlot; + for (int i = 0; i < (int)ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS; i++) + { + prms->jesdSlotTable[i] = pProfileCfgOut->internalJesdCfg.slotTable[i]; + } + for (int i = 0; i < (int)ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS; i++) + { + prms->jesdSlotValid[i] = (pProfileCfgOut->internalJesdCfg.slotValid & slot_valid_mask) != 0; + slot_valid_mask <<= 1u; + } + + prms->ifaceMaxSlots = pProfileCfgOut->internalJesdCfg.ifaceMaxSlot; + + return (ADI_ADRV904X_ERR_ACT_NONE); +} + + +static adi_adrv904x_ErrAction_e transferDelayMismatch( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierReconfigProfileCfgOut_t * const pProfileCfgOut, + adrv904x_SlotTableShuffleParams_t * const prms) +{ + int i = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, pProfileCfgOut); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, prms); + + for (i = 0; i < (int)ADI_ADRV904X_MAX_CARRIERS; i++) + { + prms->carrierDelayMismatch[i] = pProfileCfgOut->delayCfg.delayDiffPerCarrier_cc[i]; + } + + return (ADI_ADRV904X_ERR_ACT_NONE); +} + + +static adi_adrv904x_ErrAction_e removeDummyCarriers( adi_adrv904x_Device_t* const device, + adi_adrv904x_CarrierReconfigProfileCfgOut_t * const pProfileCfgOut) +{ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, pProfileCfgOut); + + /* For shuffling algorithm purposes, remove dummy carrier slots (both iface and carrier slots) + * They must be re-inserted to iface table after shuffling is finished to meet xbar sample expectations and avoid xbar setup failure + */ + + /* iface table removal */ + for (int s = 0; s < (int)ADI_ADRV904X_MAX_NO_OF_JESD_IFACE_SLOTS; s++) + { + int cc = pProfileCfgOut->internalJesdCfg.ifaceSlotTable[s]; + if ((cc >= 0) && + (cc < (int)ADI_ADRV904X_MAX_CARRIERS) && + ((pProfileCfgOut->carriersEnabled & (1 << cc)) == 0)) + { + /* If this cc is in range 0-7, appears in the slot table but not in the enabled mask, then its a dummy carrier + * Remove it from table for now, increment counter of number slots removed for cc + */ + pProfileCfgOut->internalJesdCfg.ifaceSlotTable[s] = ADRV904X_SLOT_TABLE_UNUSED; + pProfileCfgOut->internalJesdCfg.dummyIfaceSlotsRemoved[cc]++; + } + } + + /* carrier table removal */ + for (int s = 0; s < (int)ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS; s++) + { + int cc = pProfileCfgOut->internalJesdCfg.slotTable[s]; + if ((cc != ADRV904X_SLOT_TABLE_UNUSED) && + ((pProfileCfgOut->carriersEnabled & (1 << cc)) == 0)) + { + /* If this cc is not in the enabled mask AND it appears in the slot table, then its a dummy carrier + * Remove it from table for now + */ + pProfileCfgOut->internalJesdCfg.slotTable[s] = ADRV904X_SLOT_TABLE_UNUSED; + } + } + + return (ADI_ADRV904X_ERR_ACT_NONE); +} + + +static adi_adrv904x_ErrAction_e reinsertDummyCarriers( adi_adrv904x_Device_t* const device, + adi_adrv904x_CarrierReconfigProfileCfgOut_t * const pProfileCfgOut) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, pProfileCfgOut); + + /* For shuffling algorithm purposes, dummy carrier slots have to be marked as UNUSED temporarily + * This function is to reinsert the required dummy carriers to first empty slots found + */ + for (int cc = 0; cc < (int)ADI_ADRV904X_MAX_CARRIERS; cc++) + { + /* Check if We have dummy carrier (i.e. carrier sample rate > 0 and carrier is not enabled) */ + if ((pProfileCfgOut->internalJesdCfg.jesdSampleRate_kHz[cc] > 0u) && + ((pProfileCfgOut->carriersEnabled & (1 << cc)) == 0)) + { + /* iface table: insert carrier into first UNUSED slots found until all removed slots have been reinserted */ + int s = 0; + while ( + (pProfileCfgOut->internalJesdCfg.dummyIfaceSlotsRemoved[cc] > 0) && + (s < (int)ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS)) + { + if (pProfileCfgOut->internalJesdCfg.ifaceSlotTable[s] == ADRV904X_SLOT_TABLE_UNUSED) + { + pProfileCfgOut->internalJesdCfg.ifaceSlotTable[s] = cc; + pProfileCfgOut->internalJesdCfg.dummyIfaceSlotsRemoved[cc]--; + } + + s++; + } + + /* Check if we ran out of empty iface slots before all dummies could be reinserted */ + if (pProfileCfgOut->internalJesdCfg.dummyIfaceSlotsRemoved[cc] != 0) + { + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, + "ERROR: Ran out of space to reinsert dummy carriers. Error occurred at carrier = %d", + cc); + + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + cc, + "ERROR: Ran out of space to reinsert dummy carriers"); + return recoveryAction; + } + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return (recoveryAction); +} + + +static int calcDelayMismatch( const adrv904x_SlotTableShuffleParams_t * const slot_table_params, + int16_t * const max_mismatch, + int16_t * const min_mismatch) +{ + *max_mismatch = slot_table_params->carrierDelayMismatch[0]; + *min_mismatch = slot_table_params->carrierDelayMismatch[0]; + for (int i = 1; i < (int)ADI_ADRV904X_MAX_CARRIERS; i++) + { + if (*max_mismatch < slot_table_params->carrierDelayMismatch[i]) + { + *max_mismatch = slot_table_params->carrierDelayMismatch[i]; + } + if (*min_mismatch > slot_table_params->carrierDelayMismatch[i]) + { + *min_mismatch = slot_table_params->carrierDelayMismatch[i]; + } + } + + return (*max_mismatch - *min_mismatch); +} + + +static adi_adrv904x_ErrAction_e calcFirstCarrierSlot( adi_adrv904x_Device_t* const device, + adrv904x_SlotTableShuffleParams_t * const slot_table_params) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, slot_table_params); + + for (int i = 0; i < 8; i++) + { + slot_table_params->carrierSlots[i] = 0; + if (slot_table_params->carriersEnabled & (1 << i)) + { + for (int j = 0; j < slot_table_params->jesdMaxSlot; j++) + { + if (slot_table_params->jesdSlotValid[j] == 1) + { + if (slot_table_params->jesdSlotTable[j] == i) + { + slot_table_params->carrierSlots[i] = j; + break; + } + } + } + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return (recoveryAction); +} + + +static adi_adrv904x_ErrAction_e swapSimilarCarriers(adi_adrv904x_Device_t* const device, + adrv904x_SlotTableShuffleParams_t * const slot_table_params) +{ + int jesd_to_carr_ratio; + int exchange_done[ADI_ADRV904X_MAX_CARRIERS]; + int prev_min_diff[ADI_ADRV904X_MAX_CARRIERS]; /* Has the carrier delay */ + int prev_min_diff_carr[ADI_ADRV904X_MAX_CARRIERS]; /* Has the carrier number */ + int atleast_one_carr_found[ADI_ADRV904X_MAX_CARRIERS]; + int delay_diff_bw_cc[ADI_ADRV904X_MAX_CARRIERS][ADI_ADRV904X_MAX_CARRIERS]; + + uint16_t carr_deinterleaver_slot_mod[ADI_ADRV904X_MAX_CARRIERS]; /* tmp table for swapped carrier first-slots */ + uint16_t tmp_table[ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS]; + uint16_t tmp_valid[ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS]; + + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, slot_table_params); + + for (int i = 0; i < (int)ADI_ADRV904X_MAX_CARRIERS; i++) + { + exchange_done[i] = 0; + prev_min_diff_carr[i] = 0; + carr_deinterleaver_slot_mod[i] = 0; + for (int c = 0; c < (int)ADI_ADRV904X_MAX_CARRIERS; c++) { + delay_diff_bw_cc[i][c] = 0; + } + } + + for (int i = 0; i < (int)ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS; i++) + { + tmp_table[i] = slot_table_params->jesdSlotTable[i]; + tmp_valid[i] = 0u; + } + + /* Re-ordering(swapping similar carr) slot table according to delay values */ + for (int i = 0; i < (int)ADI_ADRV904X_MAX_CARRIERS; i++) { + if (exchange_done[i] == 0) { + carr_deinterleaver_slot_mod[i] = slot_table_params->carrierSlots[i]; + } + prev_min_diff[i] = 256; + atleast_one_carr_found[i] = 0; + if ((slot_table_params->carriersEnabled & (1 << i)) && + (exchange_done[i] == 0) && + (abs(slot_table_params->carrierDelayMismatch[i]) > (ADRV904X_HALF_MAX_DELAY_CC / 2))) + { + for (int j = 0; j < (int)ADI_ADRV904X_MAX_CARRIERS; j++) { + if ((slot_table_params->carriersEnabled & (1 << j)) && + (j != i) && + (exchange_done[j] == 0)) + { + delay_diff_bw_cc[i][j] = slot_table_params->carrierDelayMismatch[i] + slot_table_params->carrierDelayMismatch[j]; + if ((abs(delay_diff_bw_cc[i][j]) < prev_min_diff[i]) && + (slot_table_params->carrierClkPeriod[i] == slot_table_params->carrierClkPeriod[j])) + { + if (((slot_table_params->carrierDelayMismatch[i] > 0) && (slot_table_params->carrierSlots[j] > slot_table_params->carrierSlots[i])) || + ((slot_table_params->carrierDelayMismatch[i] < 0) && (slot_table_params->carrierSlots[j] < slot_table_params->carrierSlots[i])) ) + { + atleast_one_carr_found[i] = 1; + prev_min_diff[i] = abs(delay_diff_bw_cc[i][j]); + prev_min_diff_carr[i] = j; + } + } + } + } + if (atleast_one_carr_found[i] == 1) { + carr_deinterleaver_slot_mod[i] = slot_table_params->carrierSlots[prev_min_diff_carr[i]]; + carr_deinterleaver_slot_mod[prev_min_diff_carr[i]] = slot_table_params->carrierSlots[i]; + exchange_done[i] = 1; + exchange_done[prev_min_diff_carr[i]] = 1; + } + } + } + + for (int i = 0; i < (int)ADI_ADRV904X_MAX_CARRIERS; i++) { + if (slot_table_params->carriersEnabled & (1 << i)) + { + jesd_to_carr_ratio = slot_table_params->carrierClkPeriod[i] / slot_table_params->jesdClkPeriod; + for (int j = carr_deinterleaver_slot_mod[i]; j < slot_table_params->jesdMaxSlot; j = j + jesd_to_carr_ratio) { + tmp_table[j] = i; + tmp_valid[j] = 1; + } + } + } + + /* Copy results to original structure */ + ADI_LIBRARY_MEMCPY(&slot_table_params->jesdSlotTable, &tmp_table, sizeof(tmp_table)); + ADI_LIBRARY_MEMCPY(&slot_table_params->jesdSlotValid, &tmp_valid, sizeof(tmp_valid)); + ADI_LIBRARY_MEMCPY(&slot_table_params->carrierSlots, &carr_deinterleaver_slot_mod, sizeof(carr_deinterleaver_slot_mod)); + + return (ADI_ADRV904X_ERR_ACT_NONE); +} + + +static adi_adrv904x_ErrAction_e moveCarrierPositions( adi_adrv904x_Device_t* const device, + adrv904x_SlotTableShuffleParams_t * const slot_table_params) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + uint16_t tmp_carrier_slots[ADI_ADRV904X_MAX_CARRIERS] = { 0u }; + uint16_t tmp_jesd_slot_table[ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS]; + uint16_t tmp_jesd_slot_valid_calc[ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS]; + int16_t max_mismatch = 0u; + int16_t min_mismatch = 0u; + int16_t avg_mismatch = 0u; + int16_t delay_mismatch_rel[ADI_ADRV904X_MAX_CARRIERS] = { 0u }; + uint16_t jesd_to_carrier_ratio = 0u; + uint16_t invalid_slot = 0u; + uint16_t invalid_slot_found = 0u; + uint16_t all_follow_slots_invalid = 0u; + uint16_t iface_table_valid[ADI_ADRV904X_MAX_NO_OF_JESD_IFACE_SLOTS]; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, slot_table_params); + + /* Initialize tmp slot table and tmp valid arrays (size 64) with shuffle params values*/ + for (int i = 0; i < (int)ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS; i++) + { + tmp_jesd_slot_table[i] = slot_table_params->jesdSlotTable[i]; + tmp_jesd_slot_valid_calc[i] = slot_table_params->jesdSlotValid[i]; + } + + /* Calculate average mismatch */ + calcDelayMismatch(slot_table_params, &max_mismatch, &min_mismatch); + avg_mismatch = (max_mismatch + min_mismatch) / 2; + + /* For enabled carriers, Calc delay_mismatch_rel */ + for (int i = 0; i < (int)ADI_ADRV904X_MAX_CARRIERS; i++) + { + if (slot_table_params->carriersEnabled & (1 << i)) + { + delay_mismatch_rel[i] = slot_table_params->carrierDelayMismatch[i] - avg_mismatch; + tmp_carrier_slots[i] = slot_table_params->carrierSlots[i]; + } + } + + /* Iterate through carriers (i), searching for slots which are available to move carrier i into */ + for (int i = 0; i < (int)ADI_ADRV904X_MAX_CARRIERS; i++) + { + /* Reset invalid_slot_found to 0 */ + invalid_slot_found = 0u; + + /* Copy original first slot to tmp first slot array */ + tmp_carrier_slots[i] = slot_table_params->carrierSlots[i]; + + /* Clear tmp valid bits for all 16 iface slots */ + for (int s = 0; s < (int)ADI_ADRV904X_MAX_NO_OF_JESD_IFACE_SLOTS; s++) + { + iface_table_valid[s] = 0; + } + + /* Finding slots occupied by carriers in interface slot table eventhough it is not a valid slot in cduc slot table */ + for (int j = 0; j < (int)ADI_ADRV904X_MAX_CARRIERS; j++) + { + if (slot_table_params->carriersEnabled & (1 << j)) + { + if (iface_table_valid[tmp_carrier_slots[j] % slot_table_params->ifaceMaxSlots]) + { + /* ERROR! iface table already allocated for a different carrier at [i % ifaceMaxSlots]! */ + ADI_VARIABLE_LOG(&device->common, + ADI_HAL_LOG_MSG, + "Error: Multiple carriers in same slot, %d, in interface slot table", + i); + + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + i, + "Error: Multiple carriers in same slot in interface slot table"); + return recoveryAction; + } + else + { + iface_table_valid[tmp_carrier_slots[j] % slot_table_params->ifaceMaxSlots] = 1; + } + } + } + + /* For enabled carriers with delay_mismatch_rel[i] < -1/2 * threshold.... */ + if ((slot_table_params->carriersEnabled & (1 << i) && + (delay_mismatch_rel[i] < (int16_t)-ADRV904X_HALF_MAX_DELAY_CC))) + { + jesd_to_carrier_ratio = slot_table_params->carrierClkPeriod[i] / slot_table_params->jesdClkPeriod; + for (int s = 0; s < slot_table_params->jesdMaxSlot; s++) + { + if ((tmp_jesd_slot_valid_calc[s] == 0) && + (s < tmp_carrier_slots[i]) && + (s < jesd_to_carrier_ratio)) + { + /* To not allow carrier to move to slot where other carriers present in interface slot table(eventhough they are invalid in cduc slot table) */ + if (iface_table_valid[s % slot_table_params->ifaceMaxSlots] == 0) + { + invalid_slot = s; + invalid_slot_found = 1; + break; + } + } + } /* end: s forloop */ + + /* if invalid_slot_found == 1, we found a candidate first slot to move to. But we must ALSO verify all slots that follow it, at jesd_to_carrier_ratio intervals, are also "invalid" */ + if (invalid_slot_found == 1) + { + for (int s = slot_table_params->carrierSlots[i]; s < slot_table_params->jesdMaxSlot; s = s + jesd_to_carrier_ratio) + { + tmp_jesd_slot_valid_calc[s] = 0; + } + all_follow_slots_invalid = 1; + for (int s = invalid_slot; s < slot_table_params->jesdMaxSlot; s = s + jesd_to_carrier_ratio) + { + all_follow_slots_invalid = all_follow_slots_invalid && (tmp_jesd_slot_valid_calc[s] == 0); + } + + /* If all_follow_slots_invalid == 1 here, then first slot and all subsequent slots at the carrier ratio are available to be swapped to + * Else candidate slot for moving doesn't met all constraints the move + */ + if (all_follow_slots_invalid == 1) + { + for (int s = 0; s < (slot_table_params->jesdMaxSlot / jesd_to_carrier_ratio); s = s + 1) + { + /* Swapping the slots which are occupied carrier previously & the slots which are going to be occupied by carrier */ + tmp_jesd_slot_table[tmp_carrier_slots[i] + (s * jesd_to_carrier_ratio)] = tmp_jesd_slot_table[invalid_slot + (s * jesd_to_carrier_ratio)]; + } + for (int s = invalid_slot; s < slot_table_params->jesdMaxSlot; s = s + jesd_to_carrier_ratio) + { + tmp_jesd_slot_valid_calc[s] = 1; + tmp_jesd_slot_table[s] = i; + } + tmp_carrier_slots[i] = invalid_slot; + } + else + { + for (int s = tmp_carrier_slots[i]; s < slot_table_params->jesdMaxSlot; s = s + jesd_to_carrier_ratio) + { + tmp_jesd_slot_valid_calc[s] = 1; + tmp_jesd_slot_table[s] = i; + } + } + } + } /* end of if < (-1/2 * threshold) */ + + + /* For enabled carriers with delay_mismatch_rel[i] > +1/2 * threshold.... */ + if ((slot_table_params->carriersEnabled & (1 << i) && + (delay_mismatch_rel[i] > (int16_t)ADRV904X_HALF_MAX_DELAY_CC))) + { + jesd_to_carrier_ratio = slot_table_params->carrierClkPeriod[i] / slot_table_params->jesdClkPeriod; + for (int s = 0; s < slot_table_params->jesdMaxSlot; s++) + { + if ((tmp_jesd_slot_valid_calc[s] == 0) && + (s > tmp_carrier_slots[i]) && + (s < jesd_to_carrier_ratio)) + { + /* To not allow carrier to move to slot where other carriers present in interface slot table(eventhough they are invalid in cduc slot table) */ + if (iface_table_valid[s % slot_table_params->ifaceMaxSlots] == 0) + { + invalid_slot = s; + invalid_slot_found = 1; + break; + } + } + } /* end: s forloop */ + + /* if invalid_slot_found == 1, we found a candidate first slot to move to. But we must ALSO verify all slots that follow it, at jesd_to_carrier_ratio intervals, are also "invalid" */ + if (invalid_slot_found == 1) + { + for (int s = slot_table_params->carrierSlots[i]; s < slot_table_params->jesdMaxSlot; s = s + jesd_to_carrier_ratio) + { + tmp_jesd_slot_valid_calc[s] = 0; + } + all_follow_slots_invalid = 1; + for (int s = invalid_slot; s < slot_table_params->jesdMaxSlot; s = s + jesd_to_carrier_ratio) + { + all_follow_slots_invalid = all_follow_slots_invalid && (tmp_jesd_slot_valid_calc[s] == 0); + } + + /* This line is unique in (> 1/2) case. Not present in (< -1/2 ) case above. */ + all_follow_slots_invalid = all_follow_slots_invalid && (invalid_slot < jesd_to_carrier_ratio); + + /* If all_follow_slots_invalid == 1 here, then first slot and all subsequent slots at the carrier ratio are available to be swapped to + * Else candidate slot for moving doesn't met all constraints the move + */ + if (all_follow_slots_invalid == 1) + { + for (int s = 0; s < (slot_table_params->jesdMaxSlot / jesd_to_carrier_ratio); s = s + 1) + { + /* Swapping the slots which are occupied carrier previously & the slots which are going to be occupied by carrier */ + tmp_jesd_slot_table[tmp_carrier_slots[i] + (s * jesd_to_carrier_ratio)] = tmp_jesd_slot_table[invalid_slot + (s * jesd_to_carrier_ratio)]; + } + for (int s = invalid_slot; s < slot_table_params->jesdMaxSlot; s = s + jesd_to_carrier_ratio) + { + tmp_jesd_slot_valid_calc[s] = 1; + tmp_jesd_slot_table[s] = i; + } + tmp_carrier_slots[i] = invalid_slot; + } + else + { + for (int s = tmp_carrier_slots[i]; s < slot_table_params->jesdMaxSlot; s = s + jesd_to_carrier_ratio) + { + tmp_jesd_slot_valid_calc[s] = 1; + tmp_jesd_slot_table[s] = i; + } + } + } + } /* end of if > (+1/2 * threshold) */ + + } /* end of i forloop */ + + for (unsigned int i = 0; i < (int)ADI_ADRV904X_MAX_CARRIERS; i++) + { + if (slot_table_params->carriersEnabled & (1 << i)) + { + jesd_to_carrier_ratio = slot_table_params->carrierClkPeriod[i] / slot_table_params->jesdClkPeriod; + for (unsigned int j = tmp_carrier_slots[i]; j < slot_table_params->jesdMaxSlot; j = j + jesd_to_carrier_ratio) + { + tmp_jesd_slot_table[j] = i; + tmp_jesd_slot_valid_calc[j] = 1u; + } + } + } + + /* Update Slot Shuffle params with the calculated tmp vars */ + for (int i = 0; i < (int)ADI_ADRV904X_MAX_CARRIERS; i++) + { + slot_table_params->carrierSlots[i] = tmp_carrier_slots[i]; + } + for (int s = 0; s < (int)ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS; s++) + { + slot_table_params->jesdSlotTable[s] = tmp_jesd_slot_table[s]; + slot_table_params->jesdSlotValid[s] = tmp_jesd_slot_valid_calc[s]; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return (recoveryAction); +} + + +static adi_adrv904x_ErrAction_e reorderSlotTable( adi_adrv904x_Device_t* const device, + adrv904x_SlotTableShuffleParams_t * const slot_table_params) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + uint16_t max_carrier_slot = 0u; + uint16_t num_of_active_slots = 0u; + uint16_t max_carrier_slot_ratio = 0u; + uint16_t slot_valid_arr[ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS]; + uint16_t slotTable[ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS]; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, slot_table_params); + + /* Init */ + for (int i = 0; i < (int)ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS; i++) + { + slotTable[i] = ADI_ADRV904X_CARRIER_UNUSED_CC_XBAR; + slot_valid_arr[i] = 0; + } + for (int i = 0; i < 8; i++) + { + for (int j = 0; j < (int)ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS; j++) + { + if (slot_table_params->jesdSlotTable[j] == i) + { + num_of_active_slots++; + break; + } + } + } + + max_carrier_slot = 1u; + while (max_carrier_slot < num_of_active_slots) + { + max_carrier_slot <<= 1; + } + + max_carrier_slot_ratio = slot_table_params->jesdMaxSlot / max_carrier_slot; + + for (int i = 0; i < max_carrier_slot_ratio; i++) + { + for (int j = 0; j < max_carrier_slot; j++) + { + slotTable[i * max_carrier_slot + j] = slot_table_params->jesdSlotTable[(i + 1) * max_carrier_slot - 1 - j]; + slot_valid_arr[i * max_carrier_slot + j] = slot_table_params->jesdSlotValid[(i + 1) * max_carrier_slot - 1 - j]; + } + } + + for (int i = 0; i < 64; i++) + { + slot_table_params->jesdSlotTable[i] = slotTable[i]; + slot_table_params->jesdSlotValid[i] = slot_valid_arr[i]; + } + + calcFirstCarrierSlot(device, slot_table_params); + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return (recoveryAction); +} + + +static adi_adrv904x_ErrAction_e updateMinDelayCducSolution( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierReconfigProfileCfgOut_t * const pCandidate, + adi_adrv904x_CarrierReconfigProfileCfgOut_t * const pMin) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, pCandidate); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, pMin); + + if(pCandidate->delayCfg.delayMismatch_cc < pMin->delayCfg.delayMismatch_cc) + { +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, + "Updated CDUC Minimum Solution Found. delayMismatch_cc improved %d cc --> %d cc!", + pMin->delayCfg.delayMismatch_cc, + pCandidate->delayCfg.delayMismatch_cc); +#endif + ADI_LIBRARY_MEMCPY(pMin, pCandidate, sizeof(adi_adrv904x_CarrierReconfigProfileCfgOut_t)); + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return (recoveryAction); +} + +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + +static void printfCmodelStats( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierReconfigProfileCfgOut_t * const profile, + const adi_adrv904x_ChannelFilterOutputCfg_t* const filter) +{ + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, + "carrier\t: cfilt\t: carrier : cfilt \t: cfilt \t: hb tap\t: hb pipe\t: deinterleaver\t: delay match \t: resource \t: Band align\t: Band group \t: CDUC group \t: Comb group \t: Total \t: CDUC ", 0); + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, + "number \t: tap \t: period : tap del\t: pipe del\t: delay \t: delay \t: delay \t: extra delay \t: share delay\t: delay \t: delay \t: delay \t: delay \t: delay \t: delay ", 0); + + for (int i = 0; i < (int)ADI_ADRV904X_MAX_CARRIERS; ++i) + { + if (profile->carriersEnabled & (1u << i)) + { + ADI_VARIABLE_LOG(&device->common, + ADI_HAL_LOG_MSG, + "%5d\t: %5d\t: %5d\t : %5d\t: %5d\t: %5d\t: %5d\t: %5d\t: %5d\t: %5d\t: %5d\t\t: %5d\t\t: %5d\t\t: %5d\t\t: %5d\t\t: %5d", + i, + filter->numberOfFilterTaps[i], /* cfilt tap */ + (1u << profile->carrierCfgs.carrierRateRatio[i]), /* carrier period */ + /* Items in this set are part of group delay component structure that was pushed into CDUC structure simply to print here */ + profile->delayCfg.carrierComponents[i].cfilt.tap, /* cfilt tap del */ + profile->delayCfg.carrierComponents[i].cfilt.pipe, /* cfilt pip del */ + profile->delayCfg.carrierComponents[i].halfBand.tap, /* hb tap delay */ + profile->delayCfg.carrierComponents[i].halfBand.pipe, /* hb pipe delay */ + profile->delayCfg.carrierComponents[i].deinterleaver, /* deinterleaver slot delay */ + profile->delayCfg.carrierComponents[i].matchEnabled, /* delay match extra delay */ + profile->delayCfg.carrierComponents[i].gainResrc, /* resource share delay */ + profile->delayCfg.carrierComponents[i].bandAlignDelay, /* band align delay */ + /* Items below need to be addressed after piecewise delay calculations are finished. They put into stand-alone fields just to print */ + profile->delayCfg.groupDelayBand_cc[i], /* raw BandDUC group delay */ + profile->delayCfg.groupDelayCarr_cc[i], /* raw CDUC group delay */ + profile->delayCfg.groupDelayComb_cc[i], /* combined group delay (BandDUC + CDUC) in HW w/o delay buffers */ + profile->delayCfg.finalDelayTotal_cc[i], /* Final delay in HW: BandDUC + CDUC + Delay Buffers in CDUC */ + profile->delayCfg.finalDelayCarr_cc[i] /* Final delay in HW w/o band: CDUC + Delay Buffers in CDUC */ + ); + } + } + + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Delay values to be inserted", 0); + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Carrier number\t: Difference \t: Delay match \t: Delay match \t: Delay ", 0); + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, " \t: \t: value \t: enabled \t: mismatch ", 0); + + for (int i = 0; i < (int)ADI_ADRV904X_MAX_CARRIERS; ++i) + { + if(profile->carrierCfgs.carrierEnable[i] > 0) + { + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Carrier %d\t: %10d\t: %10d\t: %d\t\t\t: %d", + (int) i, /* Carrier Number */ + (int)profile->delayCfg.uncompOffset_cc[i], /* Difference between target and actual group delay before accounting for Delay Buffer Compensation */ + (int)profile->delayCfg.compIntSamples[i], /* Delay match value (e.g. Buffer Delay count) */ + (int)(profile->delayCfg.carrierComponents[i].matchEnabled != 0 ? 1 : 0), /* Delay match enabled */ + (int)profile->delayCfg.delayDiffPerCarrier_cc[i]); /* Delay mismatch */ + } + } +} + + +static void printfCducState(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierReconfigProfileCfgOut_t * const profile) +{ + uint8_t bPrintSlotTablesCompact = 1U; + uint8_t bPrintSlotTablesFull = 0U; + uint8_t bPrintDelays = 1U; + uint8_t bPrintSlotMatrix = 2U; + + int N_iface = profile->internalJesdCfg.ifaceMaxSlot; + int N_carrier = profile->internalJesdCfg.maxSlot; + int N_mod = N_carrier / N_iface; + + const int MAXLEN = 512; + char msg[MAXLEN]; + int len = 0; + + /* Compact Slot Tables */ + if (bPrintSlotTablesCompact == 1U) + { + + /* Note the valid mask */ + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, " Valid Mask: \t0x%llx", profile->internalJesdCfg.slotValid); + + /* One line with entire Carrier Slot Table */ + ADI_LIBRARY_MEMSET(&msg[0], 0, sizeof(msg)); + len = 0; + len += ADI_LIBRARY_SNPRINTF(msg+len, MAXLEN-len, " Carr Slots[%d]: \t[ ", N_carrier); + for (int i = 0; i < N_carrier; i++) + { + int slot_val = profile->internalJesdCfg.slotTable[i]; + if (slot_val == ADRV904X_SLOT_TABLE_UNUSED) + { + len += ADI_LIBRARY_SNPRINTF(msg + len, MAXLEN - len, "-"); + } + else + { + len += ADI_LIBRARY_SNPRINTF(msg+len, MAXLEN-len, "%d", slot_val); + } + + if (i < N_carrier - 1) + { + len += ADI_LIBRARY_SNPRINTF(msg + len, MAXLEN - len, ", "); + } + } + len += ADI_LIBRARY_SNPRINTF(msg + len, MAXLEN - len, " ]"); + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "%s", msg); + + /* One line with entire Iface Slot Table */ + ADI_LIBRARY_MEMSET(&msg[0], 0, sizeof(msg)); + len = 0; + len += ADI_LIBRARY_SNPRINTF(msg+len, MAXLEN-len, " Iface Slots[%d]: \t[ ", N_iface); + for (int i = 0; i < N_iface; i++) + { + int slot_val = profile->internalJesdCfg.ifaceSlotTable[i]; + if (slot_val == ADRV904X_SLOT_TABLE_UNUSED) + { + len += ADI_LIBRARY_SNPRINTF(msg + len, MAXLEN - len, "-"); + } + else + { + len += ADI_LIBRARY_SNPRINTF(msg + len, MAXLEN - len, "%d", slot_val); + } + + if (i < N_iface - 1) + { + len += ADI_LIBRARY_SNPRINTF(msg + len, MAXLEN - len, ", "); + } + } + len += ADI_LIBRARY_SNPRINTF(msg + len, MAXLEN - len, " ]"); + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "%s", msg); + } + + /* Full Slot Tables */ + if (bPrintSlotTablesFull == 1U) + { + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, " Iface Slot Table:", 0); + for (int i = 0; i < N_iface; i++) + { + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, " s[%d]\t = %d", i, profile->internalJesdCfg.ifaceSlotTable[i]); + } + + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Carrier Slot Table:", 0); + for (int i = 0; i < N_carrier; i++) + { + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, " s[%d]\t = %d", i, profile->internalJesdCfg.slotTable[i]); + } + } /* end bPrintSlotTablesCompact */ + + /* Matrix Slot Table */ + if (bPrintSlotMatrix == 1U) + { + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, " |-----------------------------------------------------------------------------------------------------------", 0); + /* Cslot rows (count = N_mod) */ + for (int i = 0; i < N_mod; i++) + { + ADI_LIBRARY_MEMSET(&msg[0], 0, sizeof(msg)); + len = 0; + + int carrStartIdx = i * N_iface; + int carrEndIdx = carrStartIdx + N_iface; + + len += ADI_LIBRARY_SNPRINTF(msg + len, MAXLEN - len, " | Carr Slot[%d-%d] \t | ", carrStartIdx, carrEndIdx - 1); + for (int j = carrStartIdx; j < carrEndIdx; j++) + { + int slot_val = profile->internalJesdCfg.slotTable[j]; + if (slot_val == ADRV904X_SLOT_TABLE_UNUSED) + { + len += ADI_LIBRARY_SNPRINTF(msg + len, MAXLEN - len, "-- | "); + } + else + { + len += ADI_LIBRARY_SNPRINTF(msg + len, MAXLEN - len, "%2d | ", slot_val); + } + } + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "%s", msg); + } + + /* Islot row */ + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, " |-----------------------------------------------------------------------------------------------------------", 0); + ADI_LIBRARY_MEMSET(&msg[0], 0, sizeof(msg)); + len = 0; + len += ADI_LIBRARY_SNPRINTF(msg + len, MAXLEN - len, " | Iface Slot[%d-%d] \t | ", 0, N_iface-1); + for (int i = 0; i < N_iface; i++) + { + int slot_val = profile->internalJesdCfg.ifaceSlotTable[i]; + if (slot_val == ADRV904X_SLOT_TABLE_UNUSED) + { + len += ADI_LIBRARY_SNPRINTF(msg + len, MAXLEN - len, "-- | "); + } + else + { + len += ADI_LIBRARY_SNPRINTF(msg + len, MAXLEN - len, "%2d | ", slot_val); + } + } + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "%s", msg); + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, " |-----------------------------------------------------------------------------------------------------------", 0); + + } /* end bPrintSlotMatrix */ + + if (bPrintDelays == 1U) + { + /* One line with Delay Diff Per Carrier */ + ADI_LIBRARY_MEMSET(&msg[0], 0, sizeof(msg)); + len = 0; + len += ADI_LIBRARY_SNPRINTF(msg + len, MAXLEN - len, "Delay Diff per Carrier : ["); + for (int i = 0; i < (int)ADI_ADRV904X_MAX_CARRIERS; i++) + { + len += ADI_LIBRARY_SNPRINTF(msg + len, MAXLEN - len, "%d", profile->delayCfg.delayDiffPerCarrier_cc[i]); + if (i < (int)ADI_ADRV904X_MAX_CARRIERS - 1) + { + len += ADI_LIBRARY_SNPRINTF(msg + len, MAXLEN - len, ", "); + } + } + len += ADI_LIBRARY_SNPRINTF(msg + len, MAXLEN - len, "] cc"); + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "%s", msg); + + /* Total Carrier Delay Mismatch */ + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, " Carrier Delay Mismatch = %d cc", profile->delayCfg.delayMismatch_cc); + } + +} +#endif + + +static void adiLfsrSeedSet(adi_adrv904x_Device_t* const device, uint16_t seed) +{ + device->devStateInfo.carrierLfsrValue = seed; + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "ADI LFSR seeded with seed = 0x%x", seed); +} + + +static uint16_t adiLfsrShift(adi_adrv904x_Device_t* const device) +{ + /* Get current lfsr value from device handle */ + uint16_t lfsr = device->devStateInfo.carrierLfsrValue; + + uint16_t prbs = ((lfsr >> 0) ^ (lfsr >> 3) ^ (lfsr >> 5) ^ (lfsr >> 7)) & 1u; + uint16_t new_lfsr = (lfsr >> 1) | (prbs << 15); + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "ADI LFSR change: 0x%x --> 0x%x ", lfsr, new_lfsr); + + /* Store result back in device handle */ + device->devStateInfo.carrierLfsrValue = new_lfsr; + + return (new_lfsr); +} + + +static int adiRandInt(adi_adrv904x_Device_t* const device) +{ + uint16_t tmp = adiLfsrShift(device); + int ret = (int)tmp; + return (ret); +} + +/* function: randomSlotGet() -- port of cmodel function "printRandoms" + * inputs: + * - lower: lowest allowed slot based on carrier ratio + * - upper: highest allowed slot based on carrier ratio + * outputs: + * - none + * return: + * - random slot selected + */ + +static int randomSlotGet(adi_adrv904x_Device_t* const device, int lower, int upper) +{ + int num = (adiRandInt(device) % (upper - lower + 1)) + lower; + return num; +} + + +/* function: randomTableGenCmodel() -- port of cmodel function "random_table_gen" + * inputs: + * - carr_enable[ADI_ADRV904X_MAX_TXCHANNELS] + * - carr_clk_period[ADI_ADRV904X_MAX_TXCHANNELS] + * - jesdClkPeriod + * - jesdMaxSlot + * - ifaceMaxSlots + * outputs: + * - carr_deinterleaver_slot[ADI_ADRV904X_MAX_TXCHANNELS] + * - jesdSlotTable[ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS] + * - jesd_slot_valid_calc[ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS] + * - error_struct + * return: + * - int (nonzero return indicates an error occurred) + */ + +static adi_adrv904x_ErrAction_e randomTableGenCmodel( adi_adrv904x_Device_t* const device, + const int carr_enable[ADI_ADRV904X_MAX_TXCHANNELS], const int carr_clk_period[ADI_ADRV904X_MAX_TXCHANNELS], const int jesdClkPeriod, const int jesdMaxSlot, const int ifaceMaxSlots, + int carr_deinterleaver_slot[ADI_ADRV904X_MAX_TXCHANNELS], int jesdSlotTable[ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS], int jesd_slot_valid_calc[ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS]) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + int log2_jesd_max_slot = 0; + int array_size = 0; + int log2_carr_rate = 0; + int index = 0; + int array_size_per_rate[ADRV904X_RAND_TABLE_NUM_ARRAY_SIZES] = { 1, 2, 4, 8, 16, 32, 64 }; + + int jesd_to_carr_ratio[ADI_ADRV904X_MAX_TXCHANNELS]; + int carr_rand[ADI_ADRV904X_MAX_TXCHANNELS]; + int slot_found[ADI_ADRV904X_MAX_TXCHANNELS]; + int iface_table_valid[ADI_ADRV904X_MAX_NO_OF_JESD_IFACE_SLOTS]; + int slot_array[ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS]; + int slot_array_copy[ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS]; + int array_size_per_rate_copy[ADRV904X_RAND_TABLE_NUM_ARRAY_SIZES]; + + /* Initialize Outputs and lcl vars */ + for (int c = 0; c < (int)ADI_ADRV904X_MAX_TXCHANNELS; c++) + { + jesd_to_carr_ratio[c] = carr_clk_period[c] / jesdClkPeriod; + carr_rand[c] = 0; + slot_found[c] = 0; + carr_deinterleaver_slot[c] = 0; + } + for (int c = 0; c < (int)ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS; c++) + { + jesdSlotTable[c] = ADRV904X_SLOT_TABLE_UNUSED; + jesd_slot_valid_calc[c] = 0; + slot_array[c] = c; + slot_array_copy[c] = 0; + } + + /* Initialize lcl vars */ + for (int v = 0; v < (int)ADI_ADRV904X_MAX_NO_OF_JESD_IFACE_SLOTS; v++) + { + iface_table_valid[v] = 0; + } + + for (int j = 0; j < ADRV904X_RAND_TABLE_NUM_ARRAY_SIZES; j++) + { + array_size_per_rate_copy[j] = 0u; + } + + log2_jesd_max_slot = log2(jesdMaxSlot); + + /* Get random starting slots for each carrier */ + for (int c = 0; c < (int)ADI_ADRV904X_MAX_TXCHANNELS; c++) + { + slot_found[c] = 0; + if (carr_enable[c]) + { + for (int s = 0; s < jesdMaxSlot; s++) + { + slot_array_copy[s] = slot_array[s]; + } + for (int j = 0; j < ADRV904X_RAND_TABLE_NUM_ARRAY_SIZES; j++) + { + array_size_per_rate_copy[j] = array_size_per_rate[j]; + } + log2_carr_rate = log2(jesd_to_carr_ratio[c]); +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "log2_carr_rate %d = %d", c, log2_carr_rate); +#endif + for (int i = 0; i < jesd_to_carr_ratio[c]; i++) + { + if (i == 0) + { + array_size = array_size_per_rate[log2_carr_rate]; + index = randomSlotGet(device, 0, array_size - 1); + carr_rand[c] = slot_array[index]; + } + else + { + array_size = array_size_per_rate_copy[log2_carr_rate]; + index = randomSlotGet(device, 0, array_size - 1); + carr_rand[c] = slot_array_copy[index]; + } +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "slot picked for carr %d = %d", c, carr_rand[c]); +#endif + if (iface_table_valid[carr_rand[c] % ifaceMaxSlots] == 0) + { + slot_found[c] = 1; + } + for (int s = carr_rand[c]; s < jesdMaxSlot; s = s + jesd_to_carr_ratio[c]) + { + slot_found[c] = slot_found[c] && (jesd_slot_valid_calc[s] == 0); + } + if (slot_found[c] == 1) + { + iface_table_valid[carr_rand[c] % ifaceMaxSlots] = 1; + for (int s = 0; s < jesdMaxSlot; s = s + 1) + { + if (((slot_array[s] - carr_rand[c]) % jesd_to_carr_ratio[c]) == 0) + { + for (int k = s; k < jesdMaxSlot; k++) + { + slot_array[k] = slot_array[k + 1]; + } + } + } + for (int s = log2_carr_rate; s <= log2_jesd_max_slot; s++) + { + } + break; + } + else + { + for (int s = index; s < jesdMaxSlot; s = s + 1) + { + if (((slot_array_copy[s] - carr_rand[c]) % jesd_to_carr_ratio[c]) == 0) + { + for (int k = s; k < jesdMaxSlot; k++) + { + slot_array_copy[k] = slot_array_copy[k + 1]; + } + } + } + for (int s = log2_carr_rate; s <= log2_jesd_max_slot; s++) + { + array_size_per_rate_copy[s] = array_size_per_rate_copy[s] - (1 << (s - log2_carr_rate)); + } + } + } + if (slot_found[c] == 0) + { +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "ERROR: Unable to find slot for carrier %d in random table gen", c); +#endif + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + return (recoveryAction); + } + else + { + for (int s = carr_rand[c]; s < jesdMaxSlot; s = s + jesd_to_carr_ratio[c]) + { + jesdSlotTable[s] = c; + jesd_slot_valid_calc[s] = 1; + } + carr_deinterleaver_slot[c] = carr_rand[c]; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + } + } + + return recoveryAction; +} + +/* function: randomTableGenWrapper() -- not a port of a particular function, but calls randomTableGenCmodel() with the necessary glue logic around it + * Notes: + * - Convert configurator input data into required args for randomTableGenCmodel(), which should match actual cmodel + * - Call randomTableGenCmodel() + * - NOTE: cmodel function expects "Carrier_enabled" array for 8 carriers. This fails to find dummy carriers and handle them appropriately + * Replace simple :carrier enabled" with concept of "carrier used", which can be determined by checking carrier sample_rate + * - Convert outputs args from randomTableGenCmodel() into output data required for configurator + * inputs: + * - cduc + * in/out: + * - jesd_prm + * - error_struct + * return: + * - void + */ + +static adi_adrv904x_ErrAction_e randomTableGenWrapper( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierRadioCfg_t* const cduc, + adrv904x_CarrierJesdParameters_t* const jesd_prm) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + unsigned int hsdig_rate_in_kHz = 0; + + /* ------------------------------------------------------------------------------------------------- */ + /* Glue logic to convert input args into into args required by randomTableGenCmodel */ + int jesdClkPeriod = 1 << jesd_prm->divide; + int jesdMaxSlot = jesd_prm->maxSlot; + int ifaceMaxSlots = jesd_prm->ifaceMaxSlot; + int carr_enable[ADI_ADRV904X_MAX_TXCHANNELS]; + int carr_clk_period[ADI_ADRV904X_MAX_TXCHANNELS]; + int dummy_iface_slot_count[ADI_ADRV904X_MAX_TXCHANNELS]; + + + /* Extract required info from cduc */ + hsdig_rate_in_kHz = (1 << jesd_prm->divide) * jesd_prm->frequency_kHz; + for (int c = 0; c < (int)ADI_ADRV904X_MAX_TXCHANNELS; c++) + { + /* Extract "carr_enable" info from cduc. This will EXCLUDE dummy carriers from rand table generation */ + carr_enable[c] = cduc->carriers[c].enable; + + if (carr_enable[c] == 0) + { + carr_clk_period[c] = 0; + } + else + { + carr_clk_period[c] = hsdig_rate_in_kHz / cduc->carriers[c].sampleRate_kHz; + } + + /* Count the number of slots taken by any Dummy carrier. They will need to be added back in manually after random table generation + * keep count/carrier + */ + dummy_iface_slot_count[c] = 0; + if ((cduc->carriers[c].enable == 0) && + (cduc->carriers[c].sampleRate_kHz > 0u)) + { + for (int s = 0; s < (int)ADI_ADRV904X_MAX_NO_OF_JESD_IFACE_SLOTS; s++) + { + if (jesd_prm->ifaceSlotTable[s] == c) + { + dummy_iface_slot_count[c]++; + } + } + } + } + + /* Uninitialized "output" vars to be returned */ + int carr_deinterleaver_slot[ADI_ADRV904X_MAX_TXCHANNELS]; + int jesdSlotTable[ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS]; + int jesd_slot_valid_calc[ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS]; + + /* ------------------------------------------------------------------------------------------------- */ + + /* Call main port of cmodel function + * NOTE again: carr_used passed in. NOT simple carr_enable + */ + recoveryAction = randomTableGenCmodel( + device, + carr_enable, carr_clk_period, jesdClkPeriod, jesdMaxSlot, ifaceMaxSlots, /* inputs */ + carr_deinterleaver_slot, jesdSlotTable, jesd_slot_valid_calc); /* outputs */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + return recoveryAction; + } + + /* ------------------------------------------------------------------------------------------------- */ + /* Glue logic to convert cmodel output results into jesd_prm structure required by configurator */ + + /* Overwrite or calculate fields in jesd_prm with the results where they were affected. + * NOTE: THIS IS KEY. jesd_prm is always used to reset a slot tables throughout shuffling + * output "carr_deinterleaver_slot" unused for now + */ + (void)carr_deinterleaver_slot; + + jesd_prm->slotValid = 0u; /* Re-Initialize 64bit slotValid word to 0 until filled later */ + for (int s = 0; s < (int)ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS; s++) + { + jesd_prm->slotValid |= ((1ull & jesd_slot_valid_calc[s]) << s); /* bitwise-OR this carrier-slot's valid bit into 64bit word */ + jesd_prm->slotTable[s] = jesdSlotTable[s]; /* direct-copy of carrier-slot table */ + } + + for (int i = 0; i < jesd_prm->ifaceMaxSlot; i++) + { + jesd_prm->ifaceSlotTable[i] = ADRV904X_SLOT_TABLE_UNUSED; /* Re-Initialize all Iface slots as UNUSED until filled later */ + + unsigned short tmp = ADRV904X_SLOT_TABLE_UNUSED; + for (int c = i; c < jesd_prm->numSlots; c = c + jesd_prm->ifaceMaxSlot) + { + unsigned short cval = jesd_prm->slotTable[c]; + if (cval != ADRV904X_SLOT_TABLE_UNUSED) + { + if (tmp == ADRV904X_SLOT_TABLE_UNUSED) /* carrier-slot has a carrier ID to map to iface-slot */ + { + tmp = cval; /* tmp iface-slot result is still UNUSED --> overwrite with cval */ + } + else if (tmp != cval) /* tmp iface-slot result is not UNUSED --> verify it matches cval */ + { +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, + "ERROR: JESD_PRM IFACE SLOT TABLE element %d cannot be allocated for more than one carrier slot. Check carriers %d and %d in random table generation", + i, + tmp, + cval); +#endif + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + return (recoveryAction); + } + } + } + + jesd_prm->ifaceSlotTable[i] = tmp; /* Set Iface slot to final tmp value */ + + } /* end of iface-slot forloop */ + + /* Place dummy carriers into the Iface slot table, in the first empty slots found */ + for (int c = 0; c < (int)ADI_ADRV904X_MAX_TXCHANNELS; c++) + { + /* Check if We have dummy carrier (i.e. carrier sample rate > 0 and carrier is not enabled) */ + if ((cduc->carriers[c].enable == 0) && + (cduc->carriers[c].sampleRate_kHz > 0u)) + { + /* iface table: insert carrier into first UNUSED slots found until all removed slots have been reinserted */ + int s = 0; + while ( + (dummy_iface_slot_count[c] > 0) && + (s < jesd_prm->ifaceMaxSlot)) + { + if (jesd_prm->ifaceSlotTable[s] == ADRV904X_SLOT_TABLE_UNUSED) + { + jesd_prm->ifaceSlotTable[s] = c; + dummy_iface_slot_count[c]--; + } + + s++; + } + + /* Check if we ran out of empty iface slots before all dummies could be reinserted */ + if (dummy_iface_slot_count[c] != 0) + { +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "ERROR: Ran out of space to reinsert dummy carriers", 0); +#endif + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + return (recoveryAction); + } + } + } + + /* ------------------------------------------------------------------------------------------------- */ + + return recoveryAction; +} + + +/** +* \brief Performs cduc carrier delay calculations +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] selectedChannel a channel used to read the carrier registers. Any channel that's enabled in this config will work. +* \param[in] carrierConfigsOut holds the calculated values during reconfiguration +* \param[in, out] prms delay configuration written to part +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ + +static adi_adrv904x_ErrAction_e adrv904x_CalculateCducDelayMatch( adi_adrv904x_Device_t* const device, + const uint32_t selectedChannel, + const adi_adrv904x_CarrierRadioCfg_t* const carrierConfigsIn, + const adi_adrv904x_CarrierReconfigProfileCfgOut_t* const carrierConfigsOut, + const adi_adrv904x_ChannelFilterOutputCfg_t* const carrierChannelFilter, + adi_adrv904x_CarrierDelayParameters_t* const prms) +{ + const int num_carr = (int)ADI_ADRV904X_MAX_CARRIERS; + const int NUM_DELAY_ESTIMATE_LOOPS = 3; + const uint64_t hsdigclk_limit = 1000000u; /* 1 GHz max rate for hsdig clk */ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierConfigsIn); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierConfigsOut); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierChannelFilter); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, prms); + + /* helper variables */ + uint8_t i = 0; + adrv904x_CarrierResourceSharePrm_t resrc_prm; + ADI_LIBRARY_MEMSET(&resrc_prm, 0, sizeof(resrc_prm)); + resrc_prm.numCarriers = num_carr; + + /* input variable declarations */ + /* 4 for jesd_clk=245.76, 2 for jesd_clk=491.52 and so on */ + uint32_t jesdClkPeriod = (1u << carrierConfigsOut->internalJesdCfg.divide); + + + uint8_t carr_num_hb[num_carr]; + ADI_LIBRARY_MEMSET(&carr_num_hb, 0, sizeof(carr_num_hb)); + + uint8_t carr_deinterleaver_slot[num_carr]; + ADI_LIBRARY_MEMSET(&carr_deinterleaver_slot, 0, sizeof(carr_deinterleaver_slot)); + + uint32_t band_clk_period[ADI_ADRV904X_NO_OF_BANDS]; + band_clk_period[0] = (1 << device->initExtract.tx.txChannelCfg[selectedChannel].bandRatio[0]); + band_clk_period[1] = (1 << device->initExtract.tx.txChannelCfg[selectedChannel].bandRatio[1]); + + uint16_t band_latencies_cc[ADI_ADRV904X_NO_OF_BANDS]; + band_latencies_cc[0] = device->initExtract.txBandLatency[selectedChannel].duc_cc[0]; + band_latencies_cc[1] = device->initExtract.txBandLatency[selectedChannel].duc_cc[1]; + int32_t band_en_offset[ADI_ADRV904X_NO_OF_BANDS]; + ADI_LIBRARY_MEMSET(&band_en_offset, 0, sizeof(band_en_offset)); + + /* derived variable declarations */ + uint32_t hb_resource_share_delay_pipe = 2u; + uint32_t hb_transpose_pipe = 1u; + uint32_t hb_additional_pipe_delay = hb_resource_share_delay_pipe + hb_transpose_pipe; + + uint32_t nco_resource_share_delay_pipe = 2u; + uint32_t dds_cmul_delay = 8u; + uint32_t gain_mul_delay = jesdClkPeriod; + uint32_t pre_band_align_pipe_delay = 1u; + uint16_t additional_pipe_delay = dds_cmul_delay + gain_mul_delay + pre_band_align_pipe_delay; + uint32_t band_align_pipe_delay = 1u; + + uint32_t tx_sample_clk_period = 2u; /* FT clk in digital core & PDS */ + uint32_t band_en_cntr_val_jesd_sync = 1u; /* Counter value of band_en gen logic when first sync generated */ + uint32_t pipe_on_sync_jesd = 3u * jesdClkPeriod; /* 3 pipes inside JESD */ + uint32_t ft_pipe_on_sync = 3u * tx_sample_clk_period; /* 3 FT pipes in DC(2) & PDS(1) */ + uint32_t ft_del_on_sync = (jesdClkPeriod > ft_pipe_on_sync) ? 0u : (ft_pipe_on_sync / jesdClkPeriod) * jesdClkPeriod; + + uint32_t deint_pipe = 3 * jesdClkPeriod; + + uint32_t summer_pipe[num_carr]; + ADI_LIBRARY_MEMSET(&summer_pipe, 0, sizeof(summer_pipe)); + + uint32_t pre_bypass_pipe[ADI_ADRV904X_NO_OF_BANDS]; + ADI_LIBRARY_MEMSET(&pre_bypass_pipe, 0, sizeof(pre_bypass_pipe)); + uint8_t change_in_delay_enables = 0u; + uint32_t pre_stage_carr_en = 0u; + uint32_t mask = 0u; + uint32_t max_carr_delay = 0u; + uint16_t tap_number = 0u; + + /* Initialize delay prms structure*/ + ADI_LIBRARY_MEMSET(prms, 0, sizeof(adi_adrv904x_CarrierDelayParameters_t)); + prms->noOfCarriers = num_carr; + prms->jesdFrequency_kHz = carrierConfigsOut->internalJesdCfg.frequencyKhz; + uint16_t cduc_clk_div = 0u; /* fixed div-by-1 */ + prms->clkToJesdRatioLog2 = (carrierConfigsOut->internalJesdCfg.divide - cduc_clk_div); + + /* Populate local input variable declarations with solved values */ + for (i = 0u; i < num_carr; i++) + { + resrc_prm.clkPeriod[i] = 1u; + resrc_prm.dlyPrev[i] = 0u; + + summer_pipe[i] = band_clk_period[carrierConfigsOut->carrierCfgs.bandSelect[i]]; + carr_num_hb[i] = (uint8_t)carrierConfigsOut->carrierCfgs.interpolationRatio[i]; + carr_deinterleaver_slot[i] = 0u; + if (carrierConfigsOut->carrierCfgs.carrierEnable[i] > 0u) + { + for (uint8_t s = 0u; s < ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS; s++) + { + if (carrierConfigsOut->internalJesdCfg.slotTable[s] == i) + { + carr_deinterleaver_slot[i] = s; + break; + } + } + } + } + + /* Pre bypass pipe on power meas clk which is 2 cduc cyles. But the flops after that in TX & flop before it in CDUC, Both are on Band clk. + * If the flop structure is like "flop on lower freq clk -> flop on high freq clk -> flop on low freq clk", then we can ignore flop on high freq clk + */ + for (i = 0u; i < ADI_ADRV904X_NO_OF_BANDS; i++) + { + pre_bypass_pipe[i] = (band_clk_period[i] > 2) ? 0 : 2; + } + + /* ------------------------------------------------------------- + * calculating delays + * ------------------------------------------------------------- */ + + /* starting delay */ + for (i = 0u; i < num_carr; i++) + { + if (carrierConfigsOut->carrierCfgs.carrierEnable[i] > 0u) + { + prms->carrSamplePeriod_cc[i] = (1u << carrierConfigsOut->carrierCfgs.carrierRateRatio[i]); + prms->carrierComponents[i].cfilt.pipe = cfiltPipeDelay((uint8_t)carrierChannelFilter->bypassFilter[i], jesdClkPeriod, carrierChannelFilter->dataPipeStop[i], prms->carrSamplePeriod_cc[i]); + prms->carrierComponents[i].deinterleaver = interleaverDelay(carr_deinterleaver_slot[i], jesdClkPeriod); + } + } + + /* First pass of the loop is to determine which carriers will use delay matching. + * Second pass of the loop is to calculate each carrier delay with the delay matching component included. + * Third pass of the loop is to turn off delay matching for carriers that resolved to matching = on but num buffers = 0 in 2nd loop + */ + for (int k = 0; k < NUM_DELAY_ESTIMATE_LOOPS; k++) + { + /* initialize parameters altered by the loop operation */ + for (i = 0u; i < num_carr; i++) + { + resrc_prm.clkPeriod[i] = prms->carrSamplePeriod_cc[i]; + prms->carrierComponents[i].halfBand.pipe = 0u; + } + /* Half band pipe delay calculations */ + for (uint8_t hb = 0u; hb < ADRV904X_NO_OF_HALF_BAND_DELAYS; hb++) + { + pre_stage_carr_en = 0u; + for (i = 0; i < num_carr; i++) + { + resrc_prm.dlyPrev[i] = + prms->carrierComponents[i].deinterleaver + + prms->carrierComponents[i].cfilt.pipe + + prms->carrierComponents[i].matchEnabled + + prms->carrierComponents[i].halfBand.pipe; + if (carr_num_hb[i] > hb) + { + resrc_prm.clkPeriod[i] >>= 1u; + } + pre_stage_carr_en |= (carr_num_hb[i] > hb) ? (carrierConfigsOut->carriersEnabled & (1u << i)) : 0u; + } + for (i = 0; i < num_carr; i++) + { + if (carr_num_hb[i] > hb) + { + mask = (hb == 0) ? 0xFFu : (i < (ADI_ADRV904X_MAX_CARRIERS >> 1u)) ? 0x0Fu : 0xF0u; + prms->carrierComponents[i].halfBand.pipe += resourceShareDelay(device, &resrc_prm, (pre_stage_carr_en & mask), 1u, i) + hb_additional_pipe_delay; + } + } + } + + /* Accounting for resource share block used before NCO + * Note: This final sum is done because the hb loop above recalcs delays at start of loop, but if last half band is used then it's extra delay will be missing + * Need to run the sum one more time just in case last hb was used and contributed + */ + for (i = 0u; i < num_carr; i++) { + if (carrierConfigsOut->carrierCfgs.carrierEnable[i] > 0u) + { + resrc_prm.dlyPrev[i]= + prms->carrierComponents[i].deinterleaver + + prms->carrierComponents[i].cfilt.pipe + + prms->carrierComponents[i].matchEnabled + + prms->carrierComponents[i].halfBand.pipe; + } + } + for (i = 0u; i < num_carr; i++) + { + mask = (i < (ADI_ADRV904X_MAX_CARRIERS >> 1u)) ? 0x0Fu : 0xF0u; + prms->carrierComponents[i].gainResrc = resourceShareDelay(device, &resrc_prm, (carrierConfigsOut->carriersEnabled & mask), 1u, i) + nco_resource_share_delay_pipe; + } + + /* Band offset delays */ + for (int b = 0; b < (int)ADI_ADRV904X_NO_OF_BANDS; b++) + { + for (int j = 0; j < 10; j++) + { + band_en_offset[b] = (band_clk_period[b] - 1) - (j * jesdClkPeriod); + if (band_en_offset[b] < 0) + { + band_en_offset[b] = (band_clk_period[b] - 1) - ((j - 1) * jesdClkPeriod); + break; + } + } + } + + /* hb filters, channel filter, interleaver delays */ + max_carr_delay = 0u; + for (i = 0u; i < num_carr; i++) { + if (carrierConfigsOut->carrierCfgs.carrierEnable[i] > 0u) + { + if (carrierChannelFilter->bypassFilter[i] == 0u) + { + /* use zero padded channel filter tap count here */ + tap_number = carrierChannelFilter->oddFilterTaps[i] ? carrierChannelFilter->numberOfFilterTaps[i] - 1u : carrierChannelFilter->numberOfFilterTaps[i]; + prms->carrierComponents[i].cfilt.tap = filterDelay(tap_number, prms->carrSamplePeriod_cc[i]); + } + prms->carrierComponents[i].halfBand.tap = hbFilterDelay(carr_num_hb[i], prms->carrSamplePeriod_cc[i]); + + prms->groupDelayCarr_cc[i] = + prms->carrierComponents[i].cfilt.tap + + prms->carrierComponents[i].cfilt.pipe + + prms->carrierComponents[i].halfBand.tap + + prms->carrierComponents[i].halfBand.pipe + + prms->carrierComponents[i].deinterleaver + + prms->carrierComponents[i].matchEnabled + + prms->carrierComponents[i].gainResrc + + deint_pipe + + additional_pipe_delay; + + int tmp_band_select = carrierConfigsOut->carrierCfgs.bandSelect[i]; + if (((prms->groupDelayCarr_cc[i] + band_en_cntr_val_jesd_sync + pipe_on_sync_jesd + ft_del_on_sync) % band_clk_period[tmp_band_select]) == 0) + { + prms->carrierComponents[i].bandAlignDelay = 0; + } + else + { + prms->carrierComponents[i].bandAlignDelay = + band_clk_period[tmp_band_select] - + ((prms->groupDelayCarr_cc[i] + band_en_cntr_val_jesd_sync + pipe_on_sync_jesd + ft_del_on_sync) % band_clk_period[tmp_band_select]); + } + /* Final sum of carrier group delay (CDUC alone) */ + prms->groupDelayCarr_cc[i] = + prms->groupDelayCarr_cc[i] + + prms->carrierComponents[i].bandAlignDelay + + band_align_pipe_delay + + summer_pipe[i] + + pre_bypass_pipe[tmp_band_select]; + + /* Sum of (BandDUC + CDUC) to get combined group delay, which determines starting points when matching/minimizing skew between carriers */ + prms->groupDelayBand_cc[i] = band_latencies_cc[tmp_band_select]; + prms->groupDelayComb_cc[i] = + prms->groupDelayBand_cc[i] + + prms->groupDelayCarr_cc[i]; + + + /* Track max( prms->groupDelayComb_cc[i] ) */ + max_carr_delay = (max_carr_delay > prms->groupDelayComb_cc[i]) ? max_carr_delay : prms->groupDelayComb_cc[i]; + } + else + { + /* Zero out group delay results for disabled carriers */ + prms->groupDelayBand_cc[i] = 0u; + prms->groupDelayCarr_cc[i] = 0u; + prms->groupDelayComb_cc[i] = 0u; + } + } + + /* Calculate hsdigclk from sample rate */ + uint64_t hsdigclk_calc_kHz = 0; + uint64_t max_hsdigclk_kHz = 0; + for (int cc = 0; cc < prms->noOfCarriers; cc++) + { + + for (int n = 0; hsdigclk_calc_kHz < hsdigclk_limit; ++n) + { + hsdigclk_calc_kHz = carrierConfigsOut->internalJesdCfg.jesdSampleRate_kHz[cc] * (1 << n); + max_hsdigclk_kHz = hsdigclk_calc_kHz < hsdigclk_limit ? hsdigclk_calc_kHz : max_hsdigclk_kHz; + } + } + + /* Set target delays + * - if user-provided custom delay value == 0, use target[i] = max_carr_delay of all enabled carriers found above + * - if user-provided custom delay value != 0, use target[i] = custom[i] as long as custom[i] >= groupDelayComb_cc[i] + */ + for (i = 0u; i < num_carr; i++) + { + if (carrierConfigsOut->carrierCfgs.carrierEnable[i] > 0u) + { + uint64_t tmp_lat = carrierConfigsIn->carriers[i].absLatencyOverride_ns; + tmp_lat *= max_hsdigclk_kHz; + tmp_lat <<= 1u; + tmp_lat /= 1000000; + tmp_lat += 1u; + tmp_lat >>= 1u; + + uint16_t custom_target_cc = (uint16_t)(tmp_lat); + + if (custom_target_cc == 0) + { + prms->targetDelay_cc[i] = max_carr_delay; + } + else if (custom_target_cc < prms->groupDelayComb_cc[i]) + { + /* Check Latency Override is Possible */ +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + ADI_VARIABLE_LOG(&device->common, + ADI_HAL_LOG_MSG, + "Latency Override %d ns --> %d cc for Carrier %d has to be larger than Calculated Group Delay Value %d cc", + carrierConfigsIn->carriers[i].absLatencyOverride_ns, + custom_target_cc, + i, + prms->groupDelayComb_cc[i]); +#endif + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Latency Override provided for a carrier must be larger than default latency calculation"); + return recoveryAction; + } + else + { + prms->targetDelay_cc[i] = custom_target_cc; + } + + /* Calculate uncompensated offset b/w this carrier's actual group delay vs. target delay */ + prms->uncompOffset_cc[i] = prms->targetDelay_cc[i] - prms->groupDelayComb_cc[i]; + } + } + + /* Assume that there are not changes in 'matchEnabled' delays numbers until we find otherwise */ + change_in_delay_enables = 0u; + + /* If there have been no changes for ANY carrier delay matchEnabled value, no need to recalculate delays */ + if (change_in_delay_enables == 0u) + { + break; + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return (recoveryAction); +} + +/** +* \brief Performs cddc carrier delay calculations +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Pointer to the ADRV904X device data structure +* \param[in] selectedChannel The channel used to configure, any channel enabled in this profile will work +* \param[in] carrierConfigsOut holds the calculated values during reconfiguration +* \param[in] carrierChannelFilter holds output settings from FW channel filter calculation +* \param[in, out] prms delay configuration written to part +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ + +static adi_adrv904x_ErrAction_e adrv904x_CalculateCddcDelayMatch( adi_adrv904x_Device_t* const device, + const uint32_t selectedChannel, + const adi_adrv904x_CarrierRadioCfg_t* const carrierConfigsIn, + const adi_adrv904x_CarrierReconfigProfileCfgOut_t* const carrierConfigsOut, + const adi_adrv904x_ChannelFilterOutputCfg_t* const carrierChannelFilter, + adi_adrv904x_CarrierDelayParameters_t* const prms) +{ + const int num_carr = (int)ADI_ADRV904X_MAX_CARRIERS; + const uint64_t hsdigclk_limit = 1000000u; /* 1 GHz max rate for hsdig clk */ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierConfigsIn); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierConfigsOut); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierChannelFilter); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, prms); + + /* helper variables */ + uint8_t i = 0; + adrv904x_CarrierResourceSharePrm_t resrc_prm; + ADI_LIBRARY_MEMSET(&resrc_prm, 0, sizeof(resrc_prm)); + resrc_prm.numCarriers = num_carr; + + /* input variable declarations */ + /* 4 for jesd_clk=245.76, 2 for jesd_clk=491.52 and so on */ + uint32_t jesdClkPeriod = (1u << carrierConfigsOut->internalJesdCfg.divide); + + uint8_t carr_num_hb[num_carr]; + ADI_LIBRARY_MEMSET(&carr_num_hb, 0, sizeof(carr_num_hb)); + + uint32_t carr_interleaver_slot[num_carr]; + ADI_LIBRARY_MEMSET(&carr_interleaver_slot, 0, sizeof(carr_interleaver_slot)); + + uint32_t band_clk_period[ADI_ADRV904X_NO_OF_BANDS]; + band_clk_period[0] = (1 << device->initExtract.rx.rxChannelCfg[selectedChannel].bandRatio[0]); + band_clk_period[1] = (1 << device->initExtract.rx.rxChannelCfg[selectedChannel].bandRatio[1]); + + uint16_t band_latencies_cc[ADI_ADRV904X_NO_OF_BANDS]; + band_latencies_cc[0] = device->initExtract.rxBandLatency[selectedChannel].ddc_cc[0]; + band_latencies_cc[1] = device->initExtract.rxBandLatency[selectedChannel].ddc_cc[1]; + /* derived variable declarations */ + uint32_t dds_cmul_delay = 8u; + uint16_t tap_number = 0u; + uint32_t hb_resource_share_delay_pipe = 2u; + uint32_t hb_transpose_pipe = 1u; + uint32_t hb_additional_pipe_delay = hb_resource_share_delay_pipe + hb_transpose_pipe; + + uint32_t pre_stage_carr_en = 0u; + uint32_t mask = 0u; + + /* Initialize delay prms structure */ + ADI_LIBRARY_MEMSET(prms, 0, sizeof(adi_adrv904x_CarrierDelayParameters_t)); + prms->noOfCarriers = num_carr; + prms->jesdFrequency_kHz = carrierConfigsOut->internalJesdCfg.frequencyKhz; + uint16_t cduc_clk_div = 0u; /* fixed div-by-1 */ + prms->clkToJesdRatioLog2 = (carrierConfigsOut->internalJesdCfg.divide - cduc_clk_div); + + /* Populate local input variable declarations with solved values */ + for (i = 0u; i < num_carr; i++) + { + resrc_prm.clkPeriod[i] = 1u; + resrc_prm.dlyPrev[i] = 0u; + + carr_num_hb[i] = (uint8_t)carrierConfigsOut->carrierCfgs.interpolationRatio[i]; + carr_interleaver_slot[i] = 0u; + + if (carrierConfigsOut->carrierCfgs.carrierEnable[i] > 0u) + { + for (uint8_t s = 0u; s < ADI_ADRV904X_MAX_NO_OF_JESD_IFACE_SLOTS; s++) + { + if (carrierConfigsOut->internalJesdCfg.slotTable[s] == i) + { + carr_interleaver_slot[i] = s; + break; + } + } + } + } + + /* ------------------------------------------------------------- + * calculating delays + * ------------------------------------------------------------- */ + + /* starting delay */ + for (i = 0u; i < num_carr; i++) + { + if (carrierConfigsOut->carrierCfgs.carrierEnable[i] > 0u) + { + prms->carrSamplePeriod_cc[i] = (1u << carrierConfigsOut->carrierCfgs.carrierRateRatio[i]); + } + /* Assuming cddc_clk_period is 1 sample + * powermeas_period is 2 samples (clock rate is 491.52Mhz) + */ + int tmp_band_select = carrierConfigsOut->carrierCfgs.bandSelect[i]; + prms->carrierComponents[i].halfBand.pipe = cddcHbSlotGenDelay(i, 1u, band_clk_period[tmp_band_select], 2u) + dds_cmul_delay; + } + + /* Half band pipe delay calculations */ + for (uint8_t hb = ADRV904X_NO_OF_HALF_BAND_DELAYS; hb > 0; hb--) + { + pre_stage_carr_en = 0u; + for (i = 0u; i < num_carr; i++) + { + int tmp_band_select = carrierConfigsOut->carrierCfgs.bandSelect[i]; + resrc_prm.dlyPrev[i] = prms->carrierComponents[i].halfBand.pipe; + resrc_prm.clkPeriod[i] = (carr_num_hb[i] > hb) ? (resrc_prm.clkPeriod[i] << 1u) : (band_clk_period[tmp_band_select] << 1u); + pre_stage_carr_en |= (carr_num_hb[i] >= hb) ? (carrierConfigsOut->carriersEnabled & (1u << i)) : 0u; + } + for (i = 0u; i < num_carr; i++) + { + if (carr_num_hb[i] >= hb) + { + mask = (hb < ADRV904X_NO_OF_HALF_BAND_DELAYS) ? 0xFFu : (i < (ADI_ADRV904X_MAX_CARRIERS >> 1u)) ? 0x0Fu : 0xF0u; + prms->carrierComponents[i].halfBand.pipe += resourceShareDelay(device, &resrc_prm, (pre_stage_carr_en & mask), 1u, i) + hb_additional_pipe_delay; + } + } + } + + /* Accounting for resource share block used for gain multiplier */ + for (i = 0u; i < num_carr; i++) + { + if (carrierConfigsOut->carrierCfgs.carrierEnable[i] > 0u) + { + prms->carrierComponents[i].cfilt.pipe = cfiltPipeDelay((uint8_t)carrierChannelFilter->bypassFilter[i], jesdClkPeriod, carrierChannelFilter->dataPipeStop[i], prms->carrSamplePeriod_cc[i]); + resrc_prm.dlyPrev[i] = + prms->carrierComponents[i].cfilt.pipe + + prms->carrierComponents[i].halfBand.pipe + + 1u; + resrc_prm.clkPeriod[i] = prms->carrSamplePeriod_cc[i]; + } + } + for (i = 0u; i < num_carr; i++) + { + if (carrierConfigsOut->carrierCfgs.carrierEnable[i] > 0u) + { + prms->carrierComponents[i].gainResrc = resourceShareDelay(device, &resrc_prm, (int)carrierConfigsOut->carriersEnabled, jesdClkPeriod, i); + } + } + + /* hb filters, channel filter, interleaver delays */ + uint32_t max_carr_delay = 0u; + for (i = 0u; i < num_carr; i++) + { + if (carrierConfigsOut->carrierCfgs.carrierEnable[i] > 0u) + { + if (carrierChannelFilter->bypassFilter[i] == 0u) + { + /* use zero padded channel filter tap count here */ + tap_number = carrierChannelFilter->oddFilterTaps[i] ? carrierChannelFilter->numberOfFilterTaps[i] - 1u : carrierChannelFilter->numberOfFilterTaps[i]; + prms->carrierComponents[i].cfilt.tap = filterDelay(tap_number, prms->carrSamplePeriod_cc[i]); + } + prms->carrierComponents[i].halfBand.tap = hbFilterDelay(carr_num_hb[i], prms->carrSamplePeriod_cc[i]); + prms->carrierComponents[i].deinterleaver = interleaverDelay(carr_interleaver_slot[i], jesdClkPeriod); + + /* sum of carrier group delay (CDDC alone) */ + prms->groupDelayCarr_cc[i] = + prms->carrierComponents[i].cfilt.tap + + prms->carrierComponents[i].cfilt.pipe + + prms->carrierComponents[i].halfBand.tap + + prms->carrierComponents[i].halfBand.pipe + + 1u; + + /* Sum of (BandDDC + CDDC) to get combined group delay, which determines starting points when matching/minimizing skew between carriers */ + int tmp_band_select = carrierConfigsOut->carrierCfgs.bandSelect[i]; + prms->groupDelayBand_cc[i] = band_latencies_cc[tmp_band_select]; + prms->groupDelayComb_cc[i] = prms->groupDelayBand_cc[i] + prms->groupDelayCarr_cc[i]; + + /* Track max( prms->groupDelayComb_cc[i] ) */ + max_carr_delay = (max_carr_delay > prms->groupDelayComb_cc[i]) ? max_carr_delay : prms->groupDelayComb_cc[i]; + } + else + { + /* Zero out group delay results for disabled carriers */ + prms->groupDelayBand_cc[i] = 0u; + prms->groupDelayCarr_cc[i] = 0u; + prms->groupDelayComb_cc[i] = 0u; + } + } + + + /* Calculate hsdigclk from sample rate */ + uint64_t hsdigclk_calc_kHz = 0; + uint64_t max_hsdigclk_kHz = 0; + for (int cc = 0; cc < prms->noOfCarriers; cc++) + { + + for (int n = 0; hsdigclk_calc_kHz < hsdigclk_limit; ++n) + { + hsdigclk_calc_kHz = carrierConfigsOut->internalJesdCfg.jesdSampleRate_kHz[cc] * (1 << n); + max_hsdigclk_kHz = hsdigclk_calc_kHz < hsdigclk_limit ? hsdigclk_calc_kHz : max_hsdigclk_kHz; + } + } + + /* Set target delays, and offset_ideal_cc[i] + * - if user-provided custom delay value == 0, use target[i] = max_carr_delay of all enabled carriers found above + * - if user-provided custom delay value != 0, use target[i] = custom[i] as long as custom[i] >= groupDelayComb_cc[i] + */ + for (i = 0u; i < num_carr; i++) + { + if (carrierConfigsOut->carrierCfgs.carrierEnable[i] > 0u) + { + uint64_t tmp_lat = carrierConfigsIn->carriers[i].absLatencyOverride_ns; + tmp_lat *= max_hsdigclk_kHz; + tmp_lat <<= 1u; + tmp_lat /= 1000000; + tmp_lat += 1u; + tmp_lat >>= 1u; + + uint16_t custom_target_cc = (uint16_t)(tmp_lat); + + if (custom_target_cc == 0) + { + prms->targetDelay_cc[i] = max_carr_delay; + } + else if (custom_target_cc < prms->groupDelayComb_cc[i]) + { + /* Check Latency Override is Possible */ +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + ADI_VARIABLE_LOG(&device->common, + ADI_HAL_LOG_MSG, + "Latency Override %d ns --> %d cc for Carrier %d has to be larger than Calculated Group Delay Value %d cc", + carrierConfigsIn->carriers[i].absLatencyOverride_ns, + custom_target_cc, + i, + prms->groupDelayComb_cc[i]); +#endif + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Latency Override provided for a carrier must be larger than default latency calculation"); + return recoveryAction; + } + else + { + prms->targetDelay_cc[i] = custom_target_cc; + } + + /* Calculate uncompensated offset b/w this carrier's actual group delay vs. target delay */ + prms->uncompOffset_cc[i] = prms->targetDelay_cc[i] - prms->groupDelayComb_cc[i]; + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducDelayConfigurationCalculate( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierRadioCfg_t* const carrierConfigs, + const adi_adrv904x_ChannelFilterOutputCfg_t* const carrierChannelFilter, + adi_adrv904x_CarrierReconfigProfileCfgOut_t* const carrierConfigsOut) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t i = 0U; + uint32_t selectedChannel = 0U; + uint32_t txIdx = 0U; + + adi_adrv904x_CarrierDelayParameters_t tmpDly; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierConfigs); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierConfigsOut); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierChannelFilter); + + ADI_LIBRARY_MEMSET(&tmpDly, 0, sizeof(tmpDly)); + + /* Clear any delay prms values already stored in carrierConfigsOut */ + ADI_LIBRARY_MEMSET(&carrierConfigsOut->delayCfg, 0, sizeof(adi_adrv904x_CarrierDelayParameters_t)); + + /* Pick a valid 'selectedChannel' so that it can used to index into extracted values taken from FW device profile binary */ + for (i = 0; i < ADI_ADRV904X_MAX_TXCHANNELS; i++) + { + if ((carrierConfigs->channelMask & (1 << i)) > 0) + { + selectedChannel = i; + break; + } + } + + /* invoke design provided group delay solving algorithm: */ + /* This function will initialize tmpDly structure: */ + recoveryAction = adrv904x_CalculateCducDelayMatch(device, selectedChannel, carrierConfigs, carrierConfigsOut, carrierChannelFilter, &tmpDly); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + /* invoke the common group delay solving algorithm */ + recoveryAction = adrv904x_CalculateCommonDelayParameters(device, carrierConfigs, carrierConfigsOut, &tmpDly); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + /* transfer the solved parameters to the output data structure: tmpDly --> cduc output */ + ADI_LIBRARY_MEMCPY(&carrierConfigsOut->delayCfg, &tmpDly, sizeof(adi_adrv904x_CarrierDelayParameters_t)); + + /* Store these latest Solved delays in device handle */ + for (txIdx = 0U; txIdx < ADI_ADRV904X_MAX_TXCHANNELS; txIdx++) + { + if ((carrierConfigs->channelMask & (1U << txIdx)) > 0U) + { + /* TPGSWE-7944: Store calculated latency into device profile */ + uint32_t clkCddcCducInkHz = tmpDly.jesdFrequency_kHz * pow(2, tmpDly.clkToJesdRatioLog2); + device->devStateInfo.txCarrierLatencySolved.channel[txIdx].clkCddcCducInkHz = clkCddcCducInkHz; + + for (uint8_t carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_CARRIERS; carrierIdx++) + { + device->devStateInfo.txCarrierLatencySolved.channel[txIdx].groupDelay[carrierIdx] = tmpDly.groupDelayComb_cc[carrierIdx]; + } + } + else + { + ADI_LIBRARY_MEMSET(&device->devStateInfo.txCarrierLatencySolved.channel[txIdx], 0, sizeof(adi_adrv904x_CarrierReconfigLatencyCfg_t)); + } + } + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcDelayConfigurationCalculate( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierRadioCfg_t* const carrierConfigs, + const adi_adrv904x_ChannelFilterOutputCfg_t* const carrierChannelFilter, + adi_adrv904x_CarrierReconfigProfileCfgOut_t* const carrierConfigsOut) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t i = 0U; + uint32_t selectedChannel = 0U; + uint32_t rxIdx = 0U; + + adi_adrv904x_CarrierDelayParameters_t tmpDly; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierConfigs); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierConfigsOut); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierChannelFilter); + + ADI_LIBRARY_MEMSET(&tmpDly, 0, sizeof(tmpDly)); + + /* Clear any delay prms values already stored in carrierConfigsOut */ + ADI_LIBRARY_MEMSET(&carrierConfigsOut->delayCfg, 0, sizeof(adi_adrv904x_CarrierDelayParameters_t)); + + /* Pick a valid 'selectedChannel' so that it can used to index into extracted values taken from FW device profile binary */ + for (i = 0; i < ADI_ADRV904X_MAX_TXCHANNELS; i++) + { + if ((carrierConfigs->channelMask & (1 << i)) > 0) + { + selectedChannel = i; + break; + } + } + + /* invoke design provided group delay solving algorithm: */ + /* This function will initialize tmpDly structure: */ + recoveryAction = adrv904x_CalculateCddcDelayMatch(device, selectedChannel, carrierConfigs, carrierConfigsOut, carrierChannelFilter, &tmpDly); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + /* invoke the common group delay solving algorithm */ + recoveryAction = adrv904x_CalculateCommonDelayParameters(device, carrierConfigs, carrierConfigsOut, &tmpDly); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + /* transfer the solved parameters to the output data structure: tmpDly --> cduc output */ + ADI_LIBRARY_MEMCPY(&carrierConfigsOut->delayCfg, &tmpDly, sizeof(adi_adrv904x_CarrierDelayParameters_t)); + + /* Store these latest Solved delays in device handle */ + for (rxIdx = 0U; rxIdx < ADI_ADRV904X_MAX_RX_ONLY; rxIdx++) + { + if ((carrierConfigs->channelMask & (1U << rxIdx)) > 0U) + { + /* TPGSWE-7944: Store calculated latency into device profile */ + uint32_t clkCddcCducInkHz = tmpDly.jesdFrequency_kHz * pow(2, tmpDly.clkToJesdRatioLog2); + device->devStateInfo.rxCarrierLatencySolved.channel[rxIdx].clkCddcCducInkHz = clkCddcCducInkHz; + + for (uint8_t carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_CARRIERS; carrierIdx++) + { + device->devStateInfo.rxCarrierLatencySolved.channel[rxIdx].groupDelay[carrierIdx] = tmpDly.groupDelayComb_cc[carrierIdx]; + } + } + else + { + ADI_LIBRARY_MEMSET(&device->devStateInfo.rxCarrierLatencySolved.channel[rxIdx], 0, sizeof(adi_adrv904x_CarrierReconfigLatencyCfg_t)); + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_ReconfigSolutionInit( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierJesdCfg_t* const inJesdCfg, + const adi_adrv904x_CarrierRadioCfg_t inProfileCfgs[], + uint32_t inNumProfiles, + adi_adrv904x_CarrierReconfigSoln_t* const soln) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t i = 0U; + uint32_t j = 0U; + uint32_t p = 0U; + + + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, inJesdCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, inProfileCfgs); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, soln); + + if (inNumProfiles > ADI_ADRV904X_MAX_NUM_PROFILES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, inNumProfiles, "Up to four profiles allowed."); + return recoveryAction; + } + + /* Clear entire soln structure */ + ADI_LIBRARY_MEMSET(soln, 0, sizeof(adi_adrv904x_CarrierReconfigSoln_t)); + + /* Copy input data into solution structure */ + ADI_LIBRARY_MEMCPY(&soln->inputs.jesdCfg, inJesdCfg, sizeof(adi_adrv904x_CarrierJesdCfg_t)); + soln->inputs.numProfiles = inNumProfiles; + for (int i = 0U; i < (int)soln->inputs.numProfiles; i++) + { + /* Copy the single profile if caller indicated it was populated */ + ADI_LIBRARY_MEMCPY(&soln->inputs.profileCfgs[i], &inProfileCfgs[i], sizeof(adi_adrv904x_CarrierRadioCfg_t)); + } + + /* Initialize output data for JESD and carrier profiles */ + for (i = 0U; i < ADI_ADRV904X_MAX_CARRIER_LINKS; i++) + { + for (j = 0U; j < ADI_ADRV904X_MAX_CARRIER_SLOTS; j++) + { + soln->outputs.jesdCfg.linkCfg[i].jesdCfg[j].channelSelect = 0U; + soln->outputs.jesdCfg.linkCfg[i].jesdCfg[j].carrierSelect = ADI_ADRV904X_CARRIER_UNUSED_CC_XBAR; + soln->outputs.jesdCfg.linkCfg[i].jesdCfg[j].slotSelect = ADI_ADRV904X_CARRIER_UNUSED_CC_XBAR; + } + } + + for (p = 0U; p < ADI_ADRV904X_MAX_NUM_PROFILES; p++) + { + for (i = 0U; i < ADI_ADRV904X_MAX_NO_OF_JESD_IFACE_SLOTS; i++) + { + soln->outputs.profileCfgs[p].internalJesdCfg.ifaceSlotTable[i] = (uint16_t)ADI_ADRV904X_CARRIER_UNUSED_CC_XBAR; + } + + for (i = 0U; i < ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS; i++) + { + soln->outputs.profileCfgs[p].internalJesdCfg.slotTable[i] = (uint16_t)ADI_ADRV904X_CARRIER_UNUSED_CC_XBAR; + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CarrierJesdParametersCalculate( adi_adrv904x_Device_t* const device, + const adrv904x_CarrierInitialCfg_t* const initialCfg, + const adi_adrv904x_CarrierRadioCfg_t* const carrierConfigs, + adi_adrv904x_CarrierReconfigProfileCfgOut_t* const carrierConfigsOut, + const uint8_t rxFlag) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t carrierIdx = 0U; + uint32_t sumCarriersKhz = 0U; + uint32_t minCarriersKhz = UINT32_MAX; + uint32_t minIfaceKhz = ADRV904X_JESD_IQ_RATE_KHZ; + uint32_t ratio = 0U; + uint16_t numSlotComp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierConfigs); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierConfigsOut); + + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_CARRIERS; carrierIdx++) + { + if (carrierConfigs->carriers[carrierIdx].sampleRate_kHz > 0U) + { + if (rxFlag == ADI_TRUE) + { + carrierConfigsOut->carrierCfgs.interpolationRatio[carrierIdx] = adrv904x_SampleRateJesdIqRatioCalculate(carrierConfigs->carriers[carrierIdx].sampleRate_kHz); + carrierConfigsOut->carrierCfgs.decimationRatio[carrierIdx] = adrv904x_CarrierBandSampleRateRatioCalculate(initialCfg->bandSettings[carrierConfigsOut->carrierCfgs.bandSelect[carrierIdx]].sampleRate_kHz, carrierConfigs->carriers[carrierIdx].sampleRate_kHz); + carrierConfigsOut->internalJesdCfg.jesdSampleRate_kHz[carrierIdx] = carrierConfigs->carriers[carrierIdx].sampleRate_kHz << carrierConfigsOut->carrierCfgs.interpolationRatio[carrierIdx]; + } + else if (rxFlag == ADI_FALSE) + { + carrierConfigsOut->carrierCfgs.decimationRatio[carrierIdx] = adrv904x_SampleRateJesdIqRatioCalculate(carrierConfigs->carriers[carrierIdx].sampleRate_kHz); + carrierConfigsOut->carrierCfgs.interpolationRatio[carrierIdx] = adrv904x_CarrierBandSampleRateRatioCalculate(initialCfg->bandSettings[carrierConfigsOut->carrierCfgs.bandSelect[carrierIdx]].sampleRate_kHz, carrierConfigs->carriers[carrierIdx].sampleRate_kHz); + carrierConfigsOut->internalJesdCfg.jesdSampleRate_kHz[carrierIdx] = carrierConfigs->carriers[carrierIdx].sampleRate_kHz << carrierConfigsOut->carrierCfgs.decimationRatio[carrierIdx]; + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxFlag, "Invalid rxFlag"); + return recoveryAction; + } + + carrierConfigsOut->carrierCfgs.carrierRateRatio[carrierIdx] = adrv904x_CarrierRateCalculate(device->initExtract.clocks.hsDigClk_kHz, carrierConfigs->carriers[carrierIdx].sampleRate_kHz); + + sumCarriersKhz += carrierConfigsOut->internalJesdCfg.jesdSampleRate_kHz[carrierIdx]; + minCarriersKhz = carrierConfigs->carriers[carrierIdx].sampleRate_kHz < minCarriersKhz ? carrierConfigs->carriers[carrierIdx].sampleRate_kHz : minCarriersKhz; + } + else + { + carrierConfigsOut->carrierCfgs.interpolationRatio[carrierIdx] = 0U; + carrierConfigsOut->carrierCfgs.decimationRatio[carrierIdx] = 0U; + carrierConfigsOut->carrierCfgs.carrierRateRatio[carrierIdx] = 0U; + carrierConfigsOut->internalJesdCfg.jesdSampleRate_kHz[carrierIdx] = 0U; + } + } + + /* error checking */ + if (sumCarriersKhz > device->initExtract.clocks.hsDigClk_kHz) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, sumCarriersKhz, "Aggregate carrier output sample rate exceeds the maximum value"); + return recoveryAction; + } + + if (sumCarriersKhz == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, sumCarriersKhz, "Invalid Configuration Parameter"); + return recoveryAction; + } + + ratio = device->initExtract.clocks.hsDigClk_kHz / sumCarriersKhz; + carrierConfigsOut->internalJesdCfg.divide = 0U; + + while (ratio > 1U) + { + carrierConfigsOut->internalJesdCfg.divide++; + ratio >>= 1U; + } + carrierConfigsOut->internalJesdCfg.frequencyKhz = device->initExtract.clocks.hsDigClk_kHz >> carrierConfigsOut->internalJesdCfg.divide; + + if (carrierConfigsOut->internalJesdCfg.frequencyKhz > ADRV904X_JESD_INTERFACE_MAX_FREQ_KHZ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + carrierConfigsOut->internalJesdCfg.frequencyKhz, + "Component Carrier JESD interface rate exceeds the maximum value of 500000 kHz"); + return recoveryAction; + } + + carrierConfigsOut->internalJesdCfg.numSlots = carrierConfigsOut->internalJesdCfg.frequencyKhz / minIfaceKhz; + carrierConfigsOut->internalJesdCfg.initSlot = 0u; + carrierConfigsOut->internalJesdCfg.maxSlot = carrierConfigsOut->internalJesdCfg.initSlot + carrierConfigsOut->internalJesdCfg.numSlots; + + + /* Configurator changed to use input arg 8/16 instead of hardcoded 8 (for Tx Slot shuffling to manipulate the JESD clk rate to improve slot resolution (4ns --> 2ns) + * API was using initialCfg value. Need to change minNumSLots before calling into this function + */ + if (rxFlag == 1u) + { + numSlotComp = initialCfg->maxSlot; + } + else + { + /* only need to look at minNumSlots passed into this function in the case of forcing from 8 --> 16 for increasing JESD rate from 245M --> 491M + * numSlotComp = carrierConfigsOut->internalJesdCfg.minNumSlots; + */ + + /* Until we need that functionality, continue to use maxSlot from the initital cfg */ + numSlotComp = initialCfg->maxSlot; + } + + /* Logs for seeing interface slots used (8 vs 16) by initCfg vs. calculated value required here */ +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "adrv904x_CarrierJesdParametersCalculate() :: Initital Cfg JESD Iface Max Slots (8 or 16) = %d", initialCfg->maxSlot); + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "adrv904x_CarrierJesdParametersCalculate() :: Set numSlotComp = %d", numSlotComp); +#endif + if (carrierConfigsOut->internalJesdCfg.numSlots < numSlotComp) + { + carrierConfigsOut->internalJesdCfg.numSlots = numSlotComp; + carrierConfigsOut->internalJesdCfg.frequencyKhz = carrierConfigsOut->internalJesdCfg.numSlots * minIfaceKhz; + + /* update jesd clk divider*/ + if (carrierConfigsOut->internalJesdCfg.frequencyKhz == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierConfigsOut->internalJesdCfg.frequencyKhz, "Invalid Configuration Parameter"); + return recoveryAction; + } + + ratio = device->initExtract.clocks.hsDigClk_kHz / carrierConfigsOut->internalJesdCfg.frequencyKhz; + carrierConfigsOut->internalJesdCfg.divide = 0U; + + while (ratio > 1U) + { + carrierConfigsOut->internalJesdCfg.divide++; + ratio >>= 1U; + } + } + else if (carrierConfigsOut->internalJesdCfg.numSlots > initialCfg->maxSlot) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + carrierConfigsOut->internalJesdCfg.numSlots, + "Cannot exceed the max slots used during initialization. Try initializing with a more robust profile created specifically for reconfiguring."); + return recoveryAction; + } + + /* Checking for maximum JESD iface slot value is in calculate_carrier_jesd_iface_slot_table */ + carrierConfigsOut->internalJesdCfg.ifaceMaxSlot = carrierConfigsOut->internalJesdCfg.numSlots; + + if (minCarriersKhz == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, minCarriersKhz, "Invalid Configuration Parameter"); + return recoveryAction; + } + + if (minIfaceKhz > minCarriersKhz) + { + carrierConfigsOut->internalJesdCfg.numSlots = (minIfaceKhz / minCarriersKhz); + carrierConfigsOut->internalJesdCfg.numSlots *= carrierConfigsOut->internalJesdCfg.ifaceMaxSlot; + } + + if (carrierConfigsOut->internalJesdCfg.ifaceMaxSlot > ADI_ADRV904X_MAX_NO_OF_JESD_IFACE_SLOTS) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierConfigsOut->internalJesdCfg.ifaceMaxSlot, "Number of Component Carrier Slots exceeds maximum"); + return recoveryAction; + } + + recoveryAction = adrv904x_CarrierJesdSlotTableCalculate(device, carrierConfigs, carrierConfigsOut); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + /* Calculate maxSlot and initSlot */ + carrierConfigsOut->internalJesdCfg.maxSlot = carrierConfigsOut->internalJesdCfg.numSlots; + carrierConfigsOut->internalJesdCfg.initSlot = 0; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierBandSorting( adi_adrv904x_Device_t* const device, + const adrv904x_CarrierInitialCfg_t* const rxInitialCfg, + const adi_adrv904x_CarrierRadioCfg_t* const rxCarrierConfigs, + adi_adrv904x_CarrierReconfigProfileCfgOut_t* const rxCarrierConfigsOut) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxCarrierConfigs); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxCarrierConfigsOut); + + uint32_t band0LowerEdgeKhz = rxInitialCfg->bandSettings[0U].rfCenterFreq_kHz - rxInitialCfg->bandSettings[0U].instBw_kHz / 2U; + uint32_t band0UpperEdgeKhz = rxInitialCfg->bandSettings[0U].rfCenterFreq_kHz + rxInitialCfg->bandSettings[0U].instBw_kHz / 2U; + uint32_t band1LowerEdgeKhz = rxInitialCfg->bandSettings[1U].rfCenterFreq_kHz - rxInitialCfg->bandSettings[1U].instBw_kHz / 2U; + uint32_t band1UpperEdgeKhz = rxInitialCfg->bandSettings[1U].rfCenterFreq_kHz + rxInitialCfg->bandSettings[1U].instBw_kHz / 2U; + uint32_t carrierLowerEdgeKhz = 0U; + uint32_t carrierUpperEdgeKhz = 0U; + uint32_t idx = 0U; + + for (idx = 0; idx < ADI_ADRV904X_MAX_RX_CARRIERS; idx++) + { + if (rxCarrierConfigs->carriers[idx].enable) + { + rxCarrierConfigsOut->carriersEnabled |= (1 << idx); + rxCarrierConfigsOut->carrierCfgs.carrierEnable[idx] = 1u; + + carrierLowerEdgeKhz = rxCarrierConfigs->carriers[idx].centerFrequency_kHz - rxCarrierConfigs->carriers[idx].ibw_kHz / 2; + carrierUpperEdgeKhz = rxCarrierConfigs->carriers[idx].centerFrequency_kHz + rxCarrierConfigs->carriers[idx].ibw_kHz / 2; + + if ((carrierLowerEdgeKhz >= band0LowerEdgeKhz) && (carrierUpperEdgeKhz <= band0UpperEdgeKhz)) + { + rxCarrierConfigsOut->carrierCfgs.bandSelect[idx] = 0U; + } + else if ((carrierLowerEdgeKhz >= band1LowerEdgeKhz) && (carrierUpperEdgeKhz <= band1UpperEdgeKhz)) + { + rxCarrierConfigsOut->carrierCfgs.bandSelect[idx] = 1U; + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxCarrierConfigs->carriers[idx].ibw_kHz, "Carrier is outside band"); + return recoveryAction; + } + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierNcoReconfig( adi_adrv904x_Device_t* const device, + const adrv904x_CarrierInitialCfg_t* const rxInitialCfg, + const adi_adrv904x_CarrierRadioCfg_t* const rxCarrierConfigs, + adi_adrv904x_CarrierReconfigProfileCfgOut_t* const rxCarrierConfigsOut) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t idx = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxCarrierConfigs); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxCarrierConfigsOut); + + for (idx = 0; idx < ADI_ADRV904X_MAX_RX_CARRIERS; idx++) + { + if (rxCarrierConfigs->carriers[idx].enable) + { + rxCarrierConfigsOut->carrierCfgs.outputRate_kHz[idx] = rxInitialCfg->bandSettings[rxCarrierConfigsOut->carrierCfgs.bandSelect[idx]].sampleRate_kHz; + rxCarrierConfigsOut->carrierCfgs.ncoFreq_kHz[idx] = rxCarrierConfigs->carriers[idx].centerFrequency_kHz + - rxInitialCfg->bandSettings[rxCarrierConfigsOut->carrierCfgs.bandSelect[idx]].rfCenterFreq_kHz + + rxInitialCfg->bandSettings[rxCarrierConfigsOut->carrierCfgs.bandSelect[idx]].bandOffset_kHz; + + rxCarrierConfigsOut->carrierCfgs.mixerEnable[idx] = (rxCarrierConfigsOut->carrierCfgs.ncoFreq_kHz[idx] != 0) ? 1U : 0U; + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierDelaySet( adi_adrv904x_Device_t* const device, + const uint8_t chanSelect, + const adi_adrv904x_CarrierHwDelayBufferConfig_t* const rxHwDelayBufferConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t rxSel = 0U; + adrv904x_BfCddcHbDpathChanAddr_e cddcHbDpathChanBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH; + uint32_t delayRegisterIdx = 0U; + uint32_t delayIdx = 0U; + uint32_t delayRegOffset = ADRV904X_ADDR_RX0_CDDC_DELAY_0 - ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH; + uint32_t delayRegAddr = 0U; + uint32_t delayRegisterValue = 0U; + uint32_t fifoSelectIdx = 0U; + const uint32_t DELAY_VAL_MASK = 0x1FFU; + const uint32_t DELAY_VAL_SHIFT = 16U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxHwDelayBufferConfig); + + /* Convert the rxSel to the base address value required by the bitfield functions */ + rxSel = 1U << chanSelect; + recoveryAction = adrv904x_CddcHbDpathBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(rxSel), &cddcHbDpathChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcHbDpath_DelayCmpEn_BfSet(device, NULL, cddcHbDpathChanBaseAddr, rxHwDelayBufferConfig->cmpEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcHbDpath_DelayMemEn_BfSet(device, NULL, cddcHbDpathChanBaseAddr, rxHwDelayBufferConfig->memEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcHbDpath_DaisyChainEn_BfSet(device, NULL, cddcHbDpathChanBaseAddr, rxHwDelayBufferConfig->daisyEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcHbDpath_CarrierSelect0_BfSet(device, NULL, cddcHbDpathChanBaseAddr, rxHwDelayBufferConfig->carrierSelect[fifoSelectIdx++]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcHbDpath_CarrierSelect1_BfSet(device, NULL, cddcHbDpathChanBaseAddr, rxHwDelayBufferConfig->carrierSelect[fifoSelectIdx++]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcHbDpath_CarrierSelect2_BfSet(device, NULL, cddcHbDpathChanBaseAddr, rxHwDelayBufferConfig->carrierSelect[fifoSelectIdx++]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcHbDpath_CarrierSelect3_BfSet(device, NULL, cddcHbDpathChanBaseAddr, rxHwDelayBufferConfig->carrierSelect[fifoSelectIdx++]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcHbDpath_CarrierSelect4_BfSet(device, NULL, cddcHbDpathChanBaseAddr, rxHwDelayBufferConfig->carrierSelect[fifoSelectIdx++]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcHbDpath_CarrierSelect5_BfSet(device, NULL, cddcHbDpathChanBaseAddr, rxHwDelayBufferConfig->carrierSelect[fifoSelectIdx++]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcHbDpath_CarrierSelect6_BfSet(device, NULL, cddcHbDpathChanBaseAddr, rxHwDelayBufferConfig->carrierSelect[fifoSelectIdx++]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcHbDpath_CarrierSelect7_BfSet(device, NULL, cddcHbDpathChanBaseAddr, rxHwDelayBufferConfig->carrierSelect[fifoSelectIdx++]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + /* HBDpath base + SlotValue0 offset */ + delayRegAddr = (uint32_t)cddcHbDpathChanBaseAddr + delayRegOffset; + for (delayRegisterIdx = 0U; delayRegisterIdx < (ADI_ADRV904X_NO_OF_CARRIER_DELAY_FIFOS >> 1); delayRegisterIdx++) + { + delayRegisterValue = ((uint32_t)rxHwDelayBufferConfig->delayValue[delayIdx++] & DELAY_VAL_MASK); + delayRegisterValue |= ((uint32_t)(rxHwDelayBufferConfig->delayValue[delayIdx++] & DELAY_VAL_MASK) << DELAY_VAL_SHIFT); + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, delayRegAddr, delayRegisterValue, 0xFFFFFFFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + delayRegAddr += 4U; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierConfigSet( adi_adrv904x_Device_t* const device, + const uint8_t chanSelect, + const adi_adrv904x_CarrierReconfigProfileCfgOut_t* const rxCarrierConfigs) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + adrv904x_BfCddcHbDpathChanAddr_e cddcHbDpathChanBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH; + uint32_t carrierIdx = 0U; + uint32_t rxSel = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxCarrierConfigs); + + if (chanSelect > (ADI_ADRV904X_MAX_RX_ONLY - 1U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanSelect, "Invalid RX Channel"); + return recoveryAction; + } + + /* Convert the rxSel to the base address value required by the bitfield functions */ + rxSel = 1U << chanSelect; + recoveryAction = adrv904x_CddcHbDpathBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(rxSel), &cddcHbDpathChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcHbDpath_CarrierEnable_BfSet(device, NULL, cddcHbDpathChanBaseAddr, rxCarrierConfigs->carriersEnabled); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + for (carrierIdx = 0; carrierIdx < ADI_ADRV904X_MAX_RX_CARRIERS; carrierIdx++) + { + recoveryAction = adrv904x_CddcHbDpath_OneMsClocks_BfSet(device, NULL, cddcHbDpathChanBaseAddr, carrierIdx, rxCarrierConfigs->carrierCfgs.outputRate_kHz[carrierIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcHbDpath_BandSource_BfSet(device, NULL, cddcHbDpathChanBaseAddr, carrierIdx, (adrv904x_Bf_CddcHbDpath_BandSource_e)rxCarrierConfigs->carrierCfgs.bandSelect[carrierIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcHbDpath_FreqKhz_BfSet(device, NULL, cddcHbDpathChanBaseAddr, carrierIdx, rxCarrierConfigs->carrierCfgs.ncoFreq_kHz[carrierIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcHbDpath_NcoFtwUpdate_BfSet(device, NULL, cddcHbDpathChanBaseAddr, carrierIdx, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcHbDpath_NcoEnable_BfSet(device, NULL, cddcHbDpathChanBaseAddr, carrierIdx, rxCarrierConfigs->carrierCfgs.mixerEnable[carrierIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcHbDpath_MixerEn_BfSet(device, NULL, cddcHbDpathChanBaseAddr, carrierIdx, rxCarrierConfigs->carrierCfgs.mixerEnable[carrierIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCarrierBandSorting( adi_adrv904x_Device_t* const device, + const adrv904x_CarrierInitialCfg_t* const txInitialCfg, + const adi_adrv904x_CarrierRadioCfg_t* const txCarrierConfigs, + adi_adrv904x_CarrierReconfigProfileCfgOut_t* const txCarrierConfigsOut) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, txCarrierConfigs); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, txCarrierConfigsOut); + + uint32_t band0LowerEdgeKhz = txInitialCfg->bandSettings[0U].rfCenterFreq_kHz - txInitialCfg->bandSettings[0U].instBw_kHz / 2U; + uint32_t band0UpperEdgeKhz = txInitialCfg->bandSettings[0U].rfCenterFreq_kHz + txInitialCfg->bandSettings[0U].instBw_kHz / 2U; + uint32_t band1LowerEdgeKhz = txInitialCfg->bandSettings[1U].rfCenterFreq_kHz - txInitialCfg->bandSettings[1U].instBw_kHz / 2U; + uint32_t band1UpperEdgeKhz = txInitialCfg->bandSettings[1U].rfCenterFreq_kHz + txInitialCfg->bandSettings[1U].instBw_kHz / 2U; + uint32_t carrierLowerEdgeKhz = 0U; + uint32_t carrierUpperEdgeKhz = 0U; + uint32_t idx = 0U; + + for (idx = 0; idx < ADI_ADRV904X_MAX_CARRIERS; idx++) + { + if (txCarrierConfigs->carriers[idx].enable) + { + txCarrierConfigsOut->carriersEnabled |= (1 << idx); + txCarrierConfigsOut->carrierCfgs.carrierEnable[idx] = 1u; + + carrierLowerEdgeKhz = txCarrierConfigs->carriers[idx].centerFrequency_kHz - txCarrierConfigs->carriers[idx].ibw_kHz / 2; + carrierUpperEdgeKhz = txCarrierConfigs->carriers[idx].centerFrequency_kHz + txCarrierConfigs->carriers[idx].ibw_kHz / 2; + + if ((carrierLowerEdgeKhz >= band0LowerEdgeKhz) && (carrierUpperEdgeKhz <= band0UpperEdgeKhz)) + { + txCarrierConfigsOut->carrierCfgs.bandSelect[idx] = 0U; + } + else if ((carrierLowerEdgeKhz >= band1LowerEdgeKhz) && (carrierUpperEdgeKhz <= band1UpperEdgeKhz)) + { + txCarrierConfigsOut->carrierCfgs.bandSelect[idx] = 1U; + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txCarrierConfigs->carriers[idx].ibw_kHz, "Carrier is outside band"); + return recoveryAction; + } + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCarrierNcoReconfig( adi_adrv904x_Device_t* const device, + const adrv904x_CarrierInitialCfg_t* const txInitialCfg, + const adi_adrv904x_CarrierRadioCfg_t* const txCarrierConfigs, + adi_adrv904x_CarrierReconfigProfileCfgOut_t* const txCarrierConfigsOut) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t idx = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, txCarrierConfigs); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, txCarrierConfigsOut); + + for (idx = 0; idx < ADI_ADRV904X_MAX_CARRIERS; idx++) + { + if (txCarrierConfigs->carriers[idx].enable) + { + txCarrierConfigsOut->carrierCfgs.outputRate_kHz[idx] = txInitialCfg->bandSettings[txCarrierConfigsOut->carrierCfgs.bandSelect[idx]].sampleRate_kHz; + txCarrierConfigsOut->carrierCfgs.ncoFreq_kHz[idx] = txCarrierConfigs->carriers[idx].centerFrequency_kHz - txInitialCfg->bandSettings[txCarrierConfigsOut->carrierCfgs.bandSelect[idx]].rfCenterFreq_kHz; + txCarrierConfigsOut->carrierCfgs.mixerEnable[idx] = (txCarrierConfigsOut->carrierCfgs.ncoFreq_kHz[idx] != 0) ? 1U : 0U; + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCarrierBandAttenConfig( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierRadioCfg_t* const txCarrierConfigs, + adi_adrv904x_CarrierReconfigProfileCfgOut_t* const txCarrierConfigsOut) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t idx = 0U; + + uint8_t carrierCnt = 0U; + uint16_t attenVals[] = + { + 181U, /* 256.0 / sqrt(2) */ + 147U, /* 256.0 / sqrt(3) */ + 128U, /* 256.0 / sqrt(4) */ + 114U, /* 256.0 / sqrt(5) */ + 104U, /* 256.0 / sqrt(6) */ + 96U, /* 256.0 / sqrt(7) */ + 90U, /* 256.0 / sqrt(8) */ + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, txCarrierConfigs); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, txCarrierConfigsOut); + + for (idx = 0; idx < ADI_ADRV904X_MAX_CARRIERS; idx++) + { + if (txCarrierConfigs->carriers[idx].enable) + { + carrierCnt++; + } + } + + /* Use pre-calculated atten values in the array offset by two for correct indexing */ + txCarrierConfigsOut->band0Atten = (carrierCnt > 1U) ? attenVals[carrierCnt - 2U] : UINT16_MAX; + + /* Band attenuation value must match to ensure full scale is not exceeded after the summation of DUC0 and DUC 1 */ + txCarrierConfigsOut->band1Atten = txCarrierConfigsOut->band0Atten; + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCarrierDelaySet( adi_adrv904x_Device_t* const device, + const uint8_t chanSelect, + const adi_adrv904x_CarrierHwDelayBufferConfig_t* const txHwDelayBufferConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t txSel = 0U; + adrv904x_BfCducHbDpathChanAddr_e cducHbDpathChanBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH; + uint32_t delayRegisterIdx = 0U; + uint32_t delayIdx = 0U; + uint32_t delayRegOffset = ADRV904X_ADDR_TX0_CDDC_DELAY_0 - ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH; + uint32_t delayRegAddr = 0U; + uint32_t delayRegisterValue = 0U; + uint32_t fifoSelectIdx = 0U; + const uint32_t DELAY_VAL_MASK = 0x1FFU; + const uint32_t DELAY_VAL_SHIFT = 16U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, txHwDelayBufferConfig); + + /* Convert the txSel to the base address value required by the bitfield functions */ + txSel = 1U << chanSelect; + recoveryAction = adrv904x_CducHbDpathBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(txSel), &cducHbDpathChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + + recoveryAction = adrv904x_CducHbDpath_DelayCompEn_BfSet(device, NULL, cducHbDpathChanBaseAddr, txHwDelayBufferConfig->cmpEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CducHbDpath_DelayMemEn_BfSet(device, NULL, cducHbDpathChanBaseAddr, txHwDelayBufferConfig->memEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CducHbDpath_DaisyChainEn_BfSet(device, NULL, cducHbDpathChanBaseAddr, txHwDelayBufferConfig->daisyEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CducHbDpath_CarrierSelect0_BfSet(device, NULL, cducHbDpathChanBaseAddr, txHwDelayBufferConfig->carrierSelect[fifoSelectIdx++]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CducHbDpath_CarrierSelect1_BfSet(device, NULL, cducHbDpathChanBaseAddr, txHwDelayBufferConfig->carrierSelect[fifoSelectIdx++]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CducHbDpath_CarrierSelect2_BfSet(device, NULL, cducHbDpathChanBaseAddr, txHwDelayBufferConfig->carrierSelect[fifoSelectIdx++]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CducHbDpath_CarrierSelect3_BfSet(device, NULL, cducHbDpathChanBaseAddr, txHwDelayBufferConfig->carrierSelect[fifoSelectIdx++]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CducHbDpath_CarrierSelect4_BfSet(device, NULL, cducHbDpathChanBaseAddr, txHwDelayBufferConfig->carrierSelect[fifoSelectIdx++]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CducHbDpath_CarrierSelect5_BfSet(device, NULL, cducHbDpathChanBaseAddr, txHwDelayBufferConfig->carrierSelect[fifoSelectIdx++]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CducHbDpath_CarrierSelect6_BfSet(device, NULL, cducHbDpathChanBaseAddr, txHwDelayBufferConfig->carrierSelect[fifoSelectIdx++]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CducHbDpath_CarrierSelect7_BfSet(device, NULL, cducHbDpathChanBaseAddr, txHwDelayBufferConfig->carrierSelect[fifoSelectIdx++]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + /* HBDpath base + SlotValue0 offset */ + delayRegAddr = (uint32_t)cducHbDpathChanBaseAddr + delayRegOffset; + for (delayRegisterIdx = 0U; delayRegisterIdx < (ADI_ADRV904X_NO_OF_CARRIER_DELAY_FIFOS >> 1); delayRegisterIdx++) + { + delayRegisterValue = ((uint32_t)txHwDelayBufferConfig->delayValue[delayIdx++] & DELAY_VAL_MASK); + delayRegisterValue |= ((uint32_t)(txHwDelayBufferConfig->delayValue[delayIdx++] & DELAY_VAL_MASK) << DELAY_VAL_SHIFT); + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, delayRegAddr, delayRegisterValue, 0xFFFFFFFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + delayRegAddr += 4U; + } + + return recoveryAction; +} +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCarrierConfigSet( adi_adrv904x_Device_t* const device, + const uint8_t chanSelect, + const adi_adrv904x_CarrierReconfigProfileCfgOut_t* const txCarrierConfigs) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + adrv904x_BfCducHbDpathChanAddr_e cducHbDpathChanBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH; + uint32_t carrierIdx = 0U; + uint32_t txSel = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, txCarrierConfigs); + + if (chanSelect > ADI_ADRV904X_TX_CHAN_ID_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanSelect, "Invalid TX Channel"); + return recoveryAction; + } + + /* Convert the txSel to the base address value required by the bitfield functions */ + txSel = 1U << chanSelect; + recoveryAction = adrv904x_CducHbDpathBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(txSel), &cducHbDpathChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + for (carrierIdx = 0; carrierIdx < ADI_ADRV904X_MAX_RX_CARRIERS; carrierIdx++) + { + recoveryAction = adrv904x_CducHbDpath_OneMsClocks_BfSet(device, + NULL, + cducHbDpathChanBaseAddr, + carrierIdx, + txCarrierConfigs->carrierCfgs.outputRate_kHz[carrierIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CducHbDpath_BandDest_BfSet( device, + NULL, + cducHbDpathChanBaseAddr, + carrierIdx, + (adrv904x_Bf_CducHbDpath_BandDest_e)txCarrierConfigs->carrierCfgs.bandSelect[carrierIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CducHbDpath_FreqKhz_BfSet(device, + NULL, + cducHbDpathChanBaseAddr, + carrierIdx, + (uint32_t)txCarrierConfigs->carrierCfgs.ncoFreq_kHz[carrierIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CducHbDpath_NcoFtwUpdate_BfSet( device, + NULL, + cducHbDpathChanBaseAddr, + carrierIdx, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CducHbDpath_NcoEnable_BfSet( device, + NULL, + cducHbDpathChanBaseAddr, + carrierIdx, + txCarrierConfigs->carrierCfgs.mixerEnable[carrierIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CducHbDpath_MixerEn_BfSet(device, + NULL, + cducHbDpathChanBaseAddr, + carrierIdx, + txCarrierConfigs->carrierCfgs.mixerEnable[carrierIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + } + + recoveryAction = adrv904x_CducHbDpath_CarrBand0Attn_BfSet( device, + NULL, + cducHbDpathChanBaseAddr, + txCarrierConfigs->band0Atten); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CducHbDpath_CarrBand1Attn_BfSet( device, + NULL, + cducHbDpathChanBaseAddr, + txCarrierConfigs->band1Atten); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CducHbDpath_CducCarrierEnable_BfSet( device, + NULL, + cducHbDpathChanBaseAddr, + txCarrierConfigs->carriersEnabled); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + return recoveryAction; +} +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxJesdConfigSet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierReconfigOutput_t* const reconfigOut) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t linkIdx = 0U; + uint8_t xbarControlIdx = 0U; + uint32_t xbarControlMax = ADI_ADRV904X_MAX_CARRIER_SLOTS; + uint32_t jtxConvDisable = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, reconfigOut); + + for (linkIdx = 0U; linkIdx < ADI_ADRV904X_MAX_CARRIER_LINKS; linkIdx++) + { + + xbarControlMax = (linkIdx == 0U) ? ADI_ADRV904X_MAX_CARRIER_SLOTS : ADI_ADRV904X_MAX_CARRIER_SLOTS >> 1U; + for (xbarControlIdx = 0U; xbarControlIdx < xbarControlMax; xbarControlIdx++) + { + if (reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect > ADRV904X_LAST_VALID_SLOT_SELECT_IN_CARRIER_MODE) + { + jtxConvDisable = 1U; /* 1 is an invalid entry */ + } + else + { + jtxConvDisable = 0U; /* 0 is a valid entry */ + } + + if (linkIdx == 0U) + { + recoveryAction = adrv904x_JesdCommon_JtxCoreConvDisableLink0_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + jtxConvDisable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_JtxChannelSelLink0_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].channelSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Rx0ChSampleSelLink0_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Rx1ChSampleSelLink0_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Rx2ChSampleSelLink0_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Rx3ChSampleSelLink0_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Rx4ChSampleSelLink0_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Rx5ChSampleSelLink0_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Rx6ChSampleSelLink0_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Rx7ChSampleSelLink0_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + } + else + { + recoveryAction = adrv904x_JesdCommon_JtxCoreConvDisableLink1_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + jtxConvDisable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_JtxChannelSelLink1_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].channelSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Rx0ChSampleSelLink1_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Rx1ChSampleSelLink1_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Rx2ChSampleSelLink1_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Rx3ChSampleSelLink1_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Rx4ChSampleSelLink1_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Rx5ChSampleSelLink1_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Rx6ChSampleSelLink1_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Rx7ChSampleSelLink1_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + } + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CarrierRxJesdConfigSet( adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const adi_adrv904x_CarrierReconfigProfileCfgOut_t* const rxCarrierConfigs) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfCddcHbDpathChanAddr_e cddcHbDpathChanBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH; + uint32_t carrierIdx = 0U; + uint32_t rxIdx = 0U; + uint32_t rxSel = 0U; + uint32_t slotRegisterIdx = 0U; + uint32_t slotIdx = 0U; + uint32_t slotAddr = 0U; + uint32_t slotRegOffset = ADRV904X_ADDR_RX0_INTERLEAVER_SLOT_TABLE_0 - ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH; + uint32_t slotRegisterValue = 0U; + uint64_t tmpVal = 0U; + adrv904x_BfCddcFuncsChanAddr_e cddcFuncAddr = (adrv904x_BfCddcFuncsChanAddr_e) 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxCarrierConfigs); + + /* rxChannelMask should larger than 0 and less than 0x100 */ + if ((rxChannelMask == 0U) || + ((rxChannelMask & (~(uint32_t)ADI_ADRV904X_RX_MASK_ALL)) != 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannelMask, "Invalid Rx channel mask"); + return recoveryAction; + } + + for (rxIdx = 0U; rxIdx < ADI_ADRV904X_MAX_RX_ONLY; rxIdx++) + { + rxSel = 1U << rxIdx; + if ((rxChannelMask & rxSel) > 0U) + { + cddcFuncAddr = (adrv904x_BfCddcFuncsChanAddr_e) (ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS + + (ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS - ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS) * rxIdx); + + recoveryAction = adrv904x_CddcFuncs_CddcJesdClkDiv_BfSet( device, + NULL, + cddcFuncAddr, + (adrv904x_Bf_CddcFuncs_CddcJesdClkDiv_e)rxCarrierConfigs->internalJesdCfg.divide); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcHbDpathBitfieldAddressGet(device, + (adi_adrv904x_RxChannels_e)(rxSel), + &cddcHbDpathChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcHbDpath_InterleaverMaxSlot_BfSet( device, + NULL, + cddcHbDpathChanBaseAddr, + rxCarrierConfigs->internalJesdCfg.ifaceMaxSlot); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + tmpVal = rxCarrierConfigs->internalJesdCfg.slotValid; + tmpVal &= 0xFFFFFFFFull; + recoveryAction = adrv904x_CddcHbDpath_InterleaverSlotValidLower_BfSet( device, + NULL, + cddcHbDpathChanBaseAddr, + (uint32_t)tmpVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + tmpVal = rxCarrierConfigs->internalJesdCfg.slotValid >> 32; + tmpVal &= 0xFFFFFFFFull; + recoveryAction = adrv904x_CddcHbDpath_InterleaverSlotValidUpper_BfSet( device, + NULL, + cddcHbDpathChanBaseAddr, + (uint32_t)tmpVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + /* HBDpath base + SlotValue0 offset */ + slotAddr = (uint32_t)cddcHbDpathChanBaseAddr + slotRegOffset; + for (slotRegisterIdx = 0U; slotRegisterIdx < (ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS / ADRV904X_SLOTS_PER_REGISTER); slotRegisterIdx++) + { + slotRegisterValue = 0U; + if (slotRegisterIdx < 2) + { + for (slotIdx = 0U; slotIdx < ADRV904X_SLOTS_PER_REGISTER; slotIdx++) + { + slotRegisterValue |= (rxCarrierConfigs->internalJesdCfg.ifaceSlotTable[(slotRegisterIdx * ADRV904X_SLOTS_PER_REGISTER + slotIdx)] & 0xFU) << (4U * slotIdx); + } + } + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, slotAddr, slotRegisterValue, 0xFFFFFFFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + slotAddr += 4U; + } + + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_CARRIERS; carrierIdx++) + { + recoveryAction = adrv904x_CddcHbDpath_UpsamplerRatio_BfSet( device, + NULL, + cddcHbDpathChanBaseAddr, + carrierIdx, + (adrv904x_Bf_CddcHbDpath_UpsamplerRatio_e)rxCarrierConfigs->carrierCfgs.interpolationRatio[carrierIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcHbDpath_DecRate_BfSet(device, + NULL, + cddcHbDpathChanBaseAddr, + carrierIdx, + (adrv904x_Bf_CddcHbDpath_DecRate_e)rxCarrierConfigs->carrierCfgs.decimationRatio[carrierIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + } + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxJesdConfigSet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierReconfigOutput_t* const reconfigOut) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t linkIdx = 0U; + uint8_t xbarControlIdx = 0U; + uint32_t xbarControlMax = ADI_ADRV904X_MAX_CARRIER_SLOTS; + uint32_t jrxConvDisable = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, reconfigOut); + + for (linkIdx = 0U; linkIdx < ADI_ADRV904X_MAX_CARRIER_LINKS; linkIdx++) + { + xbarControlMax = (linkIdx == 0U) ? ADI_ADRV904X_MAX_CARRIER_SLOTS : ADI_ADRV904X_MAX_CARRIER_SLOTS >> 1U; + + for (xbarControlIdx = 0U; xbarControlIdx < xbarControlMax; xbarControlIdx++) + { + if (reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect > ADRV904X_LAST_VALID_SLOT_SELECT_IN_CARRIER_MODE) + { + jrxConvDisable = 1U; /* 1 is an invalid entry */ + } + else + { + jrxConvDisable = 0U; /* 0 is a valid entry */ + } + + if (linkIdx == 0U) + { + recoveryAction = adrv904x_JesdCommon_JrxCoreConvDisableLink0_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + jrxConvDisable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_JrxChannelSelLink0_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].channelSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Tx0ChSampleSelLink0_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Tx1ChSampleSelLink0_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Tx2ChSampleSelLink0_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Tx3ChSampleSelLink0_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Tx4ChSampleSelLink0_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Tx5ChSampleSelLink0_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Tx6ChSampleSelLink0_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Tx7ChSampleSelLink0_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + } + else + { + recoveryAction = adrv904x_JesdCommon_JrxCoreConvDisableLink1_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + jrxConvDisable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_JrxChannelSelLink1_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].channelSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Tx0ChSampleSelLink1_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Tx1ChSampleSelLink1_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Tx2ChSampleSelLink1_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Tx3ChSampleSelLink1_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Tx4ChSampleSelLink1_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Tx5ChSampleSelLink1_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Tx6ChSampleSelLink1_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_JesdCommon_Tx7ChSampleSelLink1_BfSet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + xbarControlIdx, + reconfigOut->jesdCfg.linkCfg[linkIdx].jesdCfg[xbarControlIdx].slotSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + } + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CarrierTxJesdConfigSet( adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const adi_adrv904x_CarrierReconfigProfileCfgOut_t* const txCarrierConfigs) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfCducHbDpathChanAddr_e cducHbDpathChanBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH; + uint32_t carrierIdx = 0U; + uint32_t txIdx = 0U; + uint32_t txSel = 0U; + uint32_t slotRegisterIdx = 0U; + uint32_t slotIdx = 0U; + uint32_t slotAddr = 0U; + uint32_t slotRegOffset = ADRV904X_ADDR_TX0_DEINTERLEAVER_SLOT_TABLE_0 - ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH; + uint32_t slotRegisterValue = 0U; + uint64_t tmpVal = 0U; + adrv904x_BfCducFuncsChanAddr_e cducFuncAddr = (adrv904x_BfCducFuncsChanAddr_e) 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, txCarrierConfigs); + + /* txChannelMask should larger than 0 and less than 0x100 */ + if ((txChannelMask == 0U) || + ((txChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelMask, "Invalid Tx channel mask"); + return recoveryAction; + } + + for (txIdx = 0U; txIdx < ADI_ADRV904X_MAX_TXCHANNELS; txIdx++) + { + txSel = 1U << txIdx; + if ((txChannelMask & txSel) > 0U) + { + cducFuncAddr = (adrv904x_BfCducFuncsChanAddr_e) (ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_FUNCS + + (ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_FUNCS - ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_FUNCS) * txIdx); + + recoveryAction = adrv904x_CducFuncs_CducJesdClkDiv_BfSet( device, + NULL, + cducFuncAddr, + (adrv904x_Bf_CducFuncs_CducJesdClkDiv_e)txCarrierConfigs->internalJesdCfg.divide); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CducHbDpathBitfieldAddressGet(device, + (adi_adrv904x_TxChannels_e)(txSel), + &cducHbDpathChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CducHbDpath_DeinterleaverMaxSlot_BfSet( device, + NULL, + cducHbDpathChanBaseAddr, + txCarrierConfigs->internalJesdCfg.maxSlot); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + tmpVal = txCarrierConfigs->internalJesdCfg.slotValid; + tmpVal &= 0xFFFFFFFFull; + recoveryAction = adrv904x_CducHbDpath_DeinterleaverSlotValidLower_BfSet(device, + NULL, + cducHbDpathChanBaseAddr, + (uint32_t)tmpVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + tmpVal = txCarrierConfigs->internalJesdCfg.slotValid >> 32; + tmpVal &= 0xFFFFFFFFull; + recoveryAction = adrv904x_CducHbDpath_DeinterleaverSlotValidUpper_BfSet(device, + NULL, + cducHbDpathChanBaseAddr, + (uint32_t)tmpVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + /* HBDpath base + SlotValue0 offset */ + slotAddr = (uint32_t)cducHbDpathChanBaseAddr + slotRegOffset; + for (slotRegisterIdx = 0U; slotRegisterIdx < (ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS / ADRV904X_SLOTS_PER_REGISTER); slotRegisterIdx++) + { + slotRegisterValue = 0U; + + for (slotIdx = 0U; slotIdx < ADRV904X_SLOTS_PER_REGISTER; slotIdx++) + { + slotRegisterValue |= (txCarrierConfigs->internalJesdCfg.slotTable[(slotRegisterIdx * ADRV904X_SLOTS_PER_REGISTER + slotIdx)] & 0xFU) << (4U * slotIdx); + } + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, slotAddr, slotRegisterValue, 0xFFFFFFFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + slotAddr += 4U; + } + + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_CARRIERS; carrierIdx++) + { + recoveryAction = adrv904x_CducHbDpath_DownsamplerRatio_BfSet( device, + NULL, + cducHbDpathChanBaseAddr, + carrierIdx, + (adrv904x_Bf_CducHbDpath_DownsamplerRatio_e)txCarrierConfigs->carrierCfgs.decimationRatio[carrierIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CducHbDpath_IntRate_BfSet(device, + NULL, + cducHbDpathChanBaseAddr, + carrierIdx, + (adrv904x_Bf_CducHbDpath_IntRate_e)txCarrierConfigs->carrierCfgs.interpolationRatio[carrierIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_CducHbDpath_CducClkToCarrierRate_BfSet( device, + NULL, + cducHbDpathChanBaseAddr, + carrierIdx, + (adrv904x_Bf_CducHbDpath_CducClkToCarrierRate_e)txCarrierConfigs->carrierCfgs.carrierRateRatio[carrierIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + } + } + } + + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_ChannelFilterCoefsGet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierFilterApplicationType_e carrierChannelFilterApplicationSel, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps, + const uint8_t rxFlag) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + + if (rxFlag == ADI_TRUE) + { + recoveryAction = cddc_assign_coefs(device, carrierChannelFilterApplicationSel, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + } + else if (rxFlag == ADI_FALSE) + { + recoveryAction = cduc_assign_coefs(device, carrierChannelFilterApplicationSel, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxFlag, "Invalid rxFlag"); + return recoveryAction; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cddc_assign_app_5g_fs_122880_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 60000U: + *numberOfFilterTaps = 272U; + *assymetricFilterTaps = 0; + *coeffTable = &adrv904x_cddc_coefs_5g_fs_122880_ibw_60000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_5g_fs_122880_ibw_60000) / sizeof(int16_t); + break; + + case 70000U: + *numberOfFilterTaps = 244U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_5g_fs_122880_ibw_70000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_5g_fs_122880_ibw_70000) / sizeof(int16_t); + break; + + case 80000U: + *numberOfFilterTaps = 254U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_5g_fs_122880_ibw_80000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_5g_fs_122880_ibw_80000) / sizeof(int16_t); + break; + + case 90000U: + *numberOfFilterTaps = 258U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_5g_fs_122880_ibw_90000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_5g_fs_122880_ibw_90000) / sizeof(int16_t); + break; + + case 100000U: + *numberOfFilterTaps = 267U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_5g_fs_122880_ibw_100000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_5g_fs_122880_ibw_100000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cddc_assign_app_5g_fs_15360_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 5000U: + *numberOfFilterTaps = 184U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_5g_fs_15360_ibw_5000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_5g_fs_15360_ibw_5000) / sizeof(int16_t); + break; + + case 10000U: + *numberOfFilterTaps = 77U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_5g_fs_15360_ibw_10000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_5g_fs_15360_ibw_10000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cddc_assign_app_5g_fs_245760_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 200000U: + *numberOfFilterTaps = 186U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_5g_fs_245760_ibw_200000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_5g_fs_245760_ibw_200000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cddc_assign_app_5g_fs_30720_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 25000U: + *numberOfFilterTaps = 89U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_5g_fs_30720_ibw_25000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_5g_fs_30720_ibw_25000) / sizeof(int16_t); + break; + + case 5000U: + *numberOfFilterTaps = 370U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_5g_fs_30720_ibw_5000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_5g_fs_30720_ibw_5000) / sizeof(int16_t); + break; + + case 10000U: + *numberOfFilterTaps = 278U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_5g_fs_30720_ibw_10000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_5g_fs_30720_ibw_10000) / sizeof(int16_t); + break; + + case 15000U: + *numberOfFilterTaps = 136U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_5g_fs_30720_ibw_15000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_5g_fs_30720_ibw_15000) / sizeof(int16_t); + break; + + case 20000U: + *numberOfFilterTaps = 124U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_5g_fs_30720_ibw_20000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_5g_fs_30720_ibw_20000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cddc_assign_app_5g_fs_491520_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 400000U: + *numberOfFilterTaps = 186U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_5g_fs_491520_ibw_400000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_5g_fs_491520_ibw_400000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cddc_assign_app_5g_fs_61440_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 30000U: + *numberOfFilterTaps = 164U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_5g_fs_61440_ibw_30000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_5g_fs_61440_ibw_30000) / sizeof(int16_t); + break; + + case 40000U: + *numberOfFilterTaps = 172U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_5g_fs_61440_ibw_40000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_5g_fs_61440_ibw_40000) / sizeof(int16_t); + break; + + case 50000U: + *numberOfFilterTaps = 151U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_5g_fs_61440_ibw_50000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_5g_fs_61440_ibw_50000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cddc_assign_app_5g_fs_7680_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 5000U: + *numberOfFilterTaps = 46U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_5g_fs_7680_ibw_5000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_5g_fs_7680_ibw_5000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cddc_assign_app_5g_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->sampleRate_kHz) + { + case 122880U: + recoveryAction = cddc_assign_app_5g_fs_122880_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case 15360U: + recoveryAction = cddc_assign_app_5g_fs_15360_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case 245760U: + recoveryAction = cddc_assign_app_5g_fs_245760_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case 30720U: + recoveryAction = cddc_assign_app_5g_fs_30720_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case 491520U: + recoveryAction = cddc_assign_app_5g_fs_491520_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case 61440U: + recoveryAction = cddc_assign_app_5g_fs_61440_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case 7680U: + recoveryAction = cddc_assign_app_5g_fs_7680_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->sampleRate_kHz, "Unsupported Sample Rate"); + return recoveryAction; + break; + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cddc_assign_app_high_bw_5g_fs_122880_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 60000U: + *numberOfFilterTaps = 249U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_high_bw_5g_fs_122880_ibw_60000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_high_bw_5g_fs_122880_ibw_60000) / sizeof(int16_t); + break; + + case 100000U: + *numberOfFilterTaps = 255U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_high_bw_5g_fs_122880_ibw_100000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_high_bw_5g_fs_122880_ibw_100000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cddc_assign_app_high_bw_5g_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + switch (carrierCfg->sampleRate_kHz) + { + case 122880U: + recoveryAction = cddc_assign_app_high_bw_5g_fs_122880_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->sampleRate_kHz, "Unsupported Sample Rate"); + return recoveryAction; + break; + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cddc_assign_app_lte_fs_15360_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 5000U: + *numberOfFilterTaps = 215; + *assymetricFilterTaps = 0; + *coeffTable = &adrv904x_cddc_coefs_lte_fs_15360_ibw_5000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_lte_fs_15360_ibw_5000) / sizeof(int16_t); + break; + + case 10000U: + *numberOfFilterTaps = 71; + *assymetricFilterTaps = 0; + *coeffTable = &adrv904x_cddc_coefs_lte_fs_15360_ibw_10000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_lte_fs_15360_ibw_10000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cddc_assign_app_lte_fs_30720_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 5000U: + *numberOfFilterTaps = 490U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_lte_fs_30720_ibw_5000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_lte_fs_30720_ibw_5000) / sizeof(int16_t); + break; + + case 10000U: + *numberOfFilterTaps = 210U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_lte_fs_30720_ibw_10000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_lte_fs_30720_ibw_10000) / sizeof(int16_t); + break; + + case 15000U: + *numberOfFilterTaps = 108U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_lte_fs_30720_ibw_15000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_lte_fs_30720_ibw_15000) / sizeof(int16_t); + break; + + case 20000U: + *numberOfFilterTaps = 85U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_lte_fs_30720_ibw_20000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_lte_fs_30720_ibw_20000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cddc_assign_app_lte_fs_7680_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 5000U: + *numberOfFilterTaps = 53U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_lte_fs_7680_ibw_5000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_lte_fs_7680_ibw_5000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cddc_assign_app_lte_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->sampleRate_kHz) + { + case 15360U: + recoveryAction = cddc_assign_app_lte_fs_15360_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case 30720U: + recoveryAction = cddc_assign_app_lte_fs_30720_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case 7680U: + recoveryAction = cddc_assign_app_lte_fs_7680_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->sampleRate_kHz, "Unsupported Sample Rate"); + return recoveryAction; + break; + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cddc_assign_app_lte_iot_fs_15360_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 10000U: + *numberOfFilterTaps = 139U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_lte_iot_fs_15360_ibw_10000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_lte_iot_fs_15360_ibw_10000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cddc_assign_app_lte_iot_fs_30720_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 20000U: + *numberOfFilterTaps = 125U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cddc_coefs_lte_iot_fs_30720_ibw_20000[0]; + *coeffTableSize = sizeof(adrv904x_cddc_coefs_lte_iot_fs_30720_ibw_20000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cddc_assign_app_lte_iot_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->sampleRate_kHz) + { + case 15360U: + recoveryAction = cddc_assign_app_lte_iot_fs_15360_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case 30720U: + recoveryAction = cddc_assign_app_lte_iot_fs_30720_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cduc_assign_app_5g_fs_122880_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 60000U: + *numberOfFilterTaps = 279U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_5g_fs_122880_ibw_60000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_5g_fs_122880_ibw_60000) / sizeof(int16_t); + break; + + case 70000U: + *numberOfFilterTaps = 240U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_5g_fs_122880_ibw_70000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_5g_fs_122880_ibw_70000) / sizeof(int16_t); + break; + + case 80000U: + *numberOfFilterTaps = 252U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_5g_fs_122880_ibw_80000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_5g_fs_122880_ibw_80000) / sizeof(int16_t); + break; + + case 90000U: + *numberOfFilterTaps = 262U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_5g_fs_122880_ibw_90000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_5g_fs_122880_ibw_90000) / sizeof(int16_t); + break; + + case 100000U: + *numberOfFilterTaps = 277U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_5g_fs_122880_ibw_100000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_5g_fs_122880_ibw_100000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cduc_assign_app_5g_fs_15360_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 5000U: + *numberOfFilterTaps = 138U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_5g_fs_15360_ibw_5000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_5g_fs_15360_ibw_5000) / sizeof(int16_t); + break; + + case 10000U: + *numberOfFilterTaps = 92U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_5g_fs_15360_ibw_10000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_5g_fs_15360_ibw_10000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cduc_assign_app_5g_fs_245760_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 200000U: + *numberOfFilterTaps = 182U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_5g_fs_245760_ibw_200000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_5g_fs_245760_ibw_200000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cduc_assign_app_5g_fs_30720_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 25000U: + *numberOfFilterTaps = 113U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_5g_fs_30720_ibw_25000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_5g_fs_30720_ibw_25000) / sizeof(int16_t); + break; + + case 5000U: + *numberOfFilterTaps = 276U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_5g_fs_30720_ibw_5000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_5g_fs_30720_ibw_5000) / sizeof(int16_t); + break; + + case 10000U: + *numberOfFilterTaps = 208U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_5g_fs_30720_ibw_10000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_5g_fs_30720_ibw_10000) / sizeof(int16_t); + break; + + case 15000U: + *numberOfFilterTaps = 150U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_5g_fs_30720_ibw_15000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_5g_fs_30720_ibw_15000) / sizeof(int16_t); + break; + + case 20000U: + *numberOfFilterTaps = 129U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_5g_fs_30720_ibw_20000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_5g_fs_30720_ibw_20000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cduc_assign_app_5g_fs_491520_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 400000U: + *numberOfFilterTaps = 182U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_5g_fs_491520_ibw_400000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_5g_fs_491520_ibw_400000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cduc_assign_app_5g_fs_61440_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 30000U: + *numberOfFilterTaps = 195U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_5g_fs_61440_ibw_30000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_5g_fs_61440_ibw_30000) / sizeof(int16_t); + break; + + case 40000U: + *numberOfFilterTaps = 211U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_5g_fs_61440_ibw_40000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_5g_fs_61440_ibw_40000) / sizeof(int16_t); + break; + + case 50000U: + *numberOfFilterTaps = 170U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_5g_fs_61440_ibw_50000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_5g_fs_61440_ibw_50000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cduc_assign_app_5g_fs_7680_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 5000U: + *numberOfFilterTaps = 62U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_5g_fs_7680_ibw_5000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_5g_fs_7680_ibw_5000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cduc_assign_app_5g_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->sampleRate_kHz) + { + case 122880U: + recoveryAction = cduc_assign_app_5g_fs_122880_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case 15360U: + recoveryAction = cduc_assign_app_5g_fs_15360_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case 245760U: + recoveryAction = cduc_assign_app_5g_fs_245760_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case 30720U: + recoveryAction = cduc_assign_app_5g_fs_30720_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case 491520U: + recoveryAction = cduc_assign_app_5g_fs_491520_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case 61440U: + recoveryAction = cduc_assign_app_5g_fs_61440_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case 7680U: + recoveryAction = cduc_assign_app_5g_fs_7680_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->sampleRate_kHz, "Unsupported Sample Rate"); + return recoveryAction; + break; + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cduc_assign_app_high_bw_5g_fs_122880_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 60000U: + *numberOfFilterTaps = 253U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_high_bw_5g_fs_122880_ibw_60000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_high_bw_5g_fs_122880_ibw_60000) / sizeof(int16_t); + break; + + case 100000U: + *numberOfFilterTaps = 256U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_high_bw_5g_fs_122880_ibw_100000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_high_bw_5g_fs_122880_ibw_100000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cduc_assign_app_high_bw_5g_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->sampleRate_kHz) + { + case 122880U: + recoveryAction = cduc_assign_app_high_bw_5g_fs_122880_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->sampleRate_kHz, "Unsupported Sample Rate"); + return recoveryAction; + break; + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cduc_assign_app_lte_fs_15360_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 5000U: + *numberOfFilterTaps = 171U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_lte_fs_15360_ibw_5000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_lte_fs_15360_ibw_5000) / sizeof(int16_t); + break; + + case 10000U: + *numberOfFilterTaps = 66U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_lte_fs_15360_ibw_10000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_lte_fs_15360_ibw_10000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cduc_assign_app_lte_fs_30720_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 5000U: + *numberOfFilterTaps = 344U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_lte_fs_30720_ibw_5000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_lte_fs_30720_ibw_5000) / sizeof(int16_t); + break; + + case 10000U: + *numberOfFilterTaps = 170U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_lte_fs_30720_ibw_10000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_lte_fs_30720_ibw_10000) / sizeof(int16_t); + break; + + case 15000U: + *numberOfFilterTaps = 88U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_lte_fs_30720_ibw_15000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_lte_fs_30720_ibw_15000) / sizeof(int16_t); + break; + + case 20000U: + *numberOfFilterTaps = 66U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_lte_fs_30720_ibw_20000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_lte_fs_30720_ibw_20000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cduc_assign_app_lte_fs_7680_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 5000U: + *numberOfFilterTaps = 66U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_lte_fs_7680_ibw_5000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_lte_fs_7680_ibw_5000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cduc_assign_app_lte_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->sampleRate_kHz) + { + case 15360U: + recoveryAction = cduc_assign_app_lte_fs_15360_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case 30720U: + recoveryAction = cduc_assign_app_lte_fs_30720_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case 7680U: + recoveryAction = cduc_assign_app_lte_fs_7680_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->sampleRate_kHz, "Unsupported Sample Rate"); + return recoveryAction; + break; + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cduc_assign_app_lte_iot_fs_15360_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 10000U: + *numberOfFilterTaps = 241U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_lte_iot_fs_15360_ibw_10000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_lte_iot_fs_15360_ibw_10000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cduc_assign_app_lte_iot_fs_30720_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->ibw_kHz) + { + case 20000U: + *numberOfFilterTaps = 158U; + *assymetricFilterTaps = 0U; + *coeffTable = &adrv904x_cduc_coefs_lte_iot_fs_30720_ibw_20000[0]; + *coeffTableSize = sizeof(adrv904x_cduc_coefs_lte_iot_fs_30720_ibw_20000) / sizeof(int16_t); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->ibw_kHz, "Unsupported IBW Frequency"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cduc_assign_app_lte_iot_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierCfg->sampleRate_kHz) + { + case 15360U: + recoveryAction = cduc_assign_app_lte_iot_fs_15360_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case 30720U: + recoveryAction = cduc_assign_app_lte_iot_fs_30720_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierCfg->sampleRate_kHz, "Unsupported Sample Rate"); + return recoveryAction; + break; + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cddc_assign_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierFilterApplicationType_e carrierChannelFilterApplicationSel, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierChannelFilterApplicationSel) + { + case ADI_ADRV904X_CARRIER_FILTER_5G: + recoveryAction = cddc_assign_app_5g_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case ADI_ADRV904X_CARRIER_FILTER_HIGH_BW_5G: + recoveryAction = cddc_assign_app_high_bw_5g_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case ADI_ADRV904X_CARRIER_FILTER_LTE: + recoveryAction = cddc_assign_app_lte_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case ADI_ADRV904X_CARRIER_FILTER_LTE_IOT: + recoveryAction = cddc_assign_app_lte_iot_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierChannelFilterApplicationSel, "Unsupported Carrier Channel Filter Application Select"); + return recoveryAction; + break; + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e cduc_assign_coefs( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierFilterApplicationType_e carrierChannelFilterApplicationSel, + const adi_adrv904x_CarrierCfg_t* const carrierCfg, + const int16_t** const coeffTable, + int16_t* const coeffTableSize, + uint32_t* const numberOfFilterTaps, + uint8_t* const assymetricFilterTaps) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierCfg); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTable); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffTableSize); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numberOfFilterTaps); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, assymetricFilterTaps); + + switch (carrierChannelFilterApplicationSel) + { + case ADI_ADRV904X_CARRIER_FILTER_5G: + recoveryAction = cduc_assign_app_5g_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case ADI_ADRV904X_CARRIER_FILTER_HIGH_BW_5G: + recoveryAction = cduc_assign_app_high_bw_5g_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case ADI_ADRV904X_CARRIER_FILTER_LTE: + recoveryAction = cduc_assign_app_lte_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + case ADI_ADRV904X_CARRIER_FILTER_LTE_IOT: + recoveryAction = cduc_assign_app_lte_iot_coefs(device, carrierCfg, coeffTable, coeffTableSize, numberOfFilterTaps, assymetricFilterTaps); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierChannelFilterApplicationSel, "Unsupported Carrier Channel Filter Application Select"); + return recoveryAction; + break; + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CarrierDelaySlotShuffleSet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_CarrierRadioCfg_t* const carrierConfigs, + const adi_adrv904x_ChannelFilterOutputCfg_t* const carrierChannelFilter, + adi_adrv904x_CarrierReconfigProfileCfgOut_t* const carrierConfigsOut, + const uint8_t rxFlag) +{ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + int ziter = 0; + int miter = 0; + int citer = 0; + int move_iter = 0; + int i = 0; + uint8_t bStopSearchOnConvergence = 1u; + + adi_adrv904x_CarrierReconfigProfileCfgOut_t cducStateMinDelay; + adrv904x_CarrierJesdParameters_t default_jesd_prm; + adrv904x_CarrierJesdParameters_t jesd_prm; + adrv904x_SlotTableShuffleParams_t slot_prm; + adrv904x_SlotTableShuffleParams_t slot_prm_copy; + adrv904x_ShuffleDiag_t diag; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierConfigs); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierChannelFilter); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, carrierConfigsOut); + + /* Ignore rxFlag for now. Only Tx is going to be shuffled */ + (void)rxFlag; + + /* Initialize cducStateMinDelay solution with MAXIMUM delay value */ + ADI_LIBRARY_MEMSET(&cducStateMinDelay, 0, sizeof(adi_adrv904x_CarrierReconfigProfileCfgOut_t)); + cducStateMinDelay.delayCfg.delayMismatch_cc = __INT16_MAX__; + + ADI_LIBRARY_MEMSET(&default_jesd_prm, 0, sizeof(adrv904x_CarrierJesdParameters_t)); + ADI_LIBRARY_MEMSET(&jesd_prm, 0, sizeof(adrv904x_CarrierJesdParameters_t)); + ADI_LIBRARY_MEMSET(&slot_prm, 0, sizeof(adrv904x_SlotTableShuffleParams_t)); + ADI_LIBRARY_MEMSET(&slot_prm_copy, 0, sizeof(adrv904x_SlotTableShuffleParams_t)); + ADI_LIBRARY_MEMSET(&diag, 0, sizeof(adrv904x_ShuffleDiag_t)); + + default_jesd_prm.frequency_kHz = carrierConfigsOut->internalJesdCfg.frequencyKhz; + default_jesd_prm.divide = carrierConfigsOut->internalJesdCfg.divide; + default_jesd_prm.numSlots = carrierConfigsOut->internalJesdCfg.numSlots; + default_jesd_prm.maxSlot = carrierConfigsOut->internalJesdCfg.maxSlot; + default_jesd_prm.ifaceMaxSlot = carrierConfigsOut->internalJesdCfg.ifaceMaxSlot; + default_jesd_prm.initSlot = carrierConfigsOut->internalJesdCfg.initSlot; + default_jesd_prm.slotValid = carrierConfigsOut->internalJesdCfg.slotValid; + for (i = 0; i < (int)ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS; i++) + { + default_jesd_prm.slotTable[i] = carrierConfigsOut->internalJesdCfg.slotTable[i]; + } + for (i = 0; i < (int)ADI_ADRV904X_MAX_NO_OF_JESD_IFACE_SLOTS; i++) + { + default_jesd_prm.ifaceSlotTable[i] = carrierConfigsOut->internalJesdCfg.ifaceSlotTable[i]; + } + + /* Start Timer for Shuffling Here: */ + uint32_t start = 0U; + uint32_t end = 0U; + start = (uint32_t)ADI_LIBRARY_CLOCK(); +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Diagnositic timer start = %d clocks", start); +#endif + /* Mark shuffling as enabled but not yet converged */ + diag.enabled = 1u; + diag.converged = 0u; +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + int default_iface_table_size = (int)carrierConfigsOut->internalJesdCfg.ifaceMaxSlot; + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Default iface slot table size = %d", default_iface_table_size); + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Default carrier slot table size = %d", carrierConfigsOut->internalJesdCfg.numSlots); +#endif + /* Seed internal implementation of prbs with a known starting value */ + adiLfsrSeedSet(device, ADI_LFSR_START_SEED); + + /* ziter: Brute force randomized (or psuedo-random) starting slot table + * - 0: Default jesd_prm table + * - else: Randomly generated jesd_prm table + */ + for (ziter = 0; ziter < (int)ADI_SLOT_SHUFFLE_RAND_ITERATIONS; ziter++) + { + if ((bStopSearchOnConvergence == 1u) && (diag.converged == 1u)) + { + break; + } +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Start ziter = %d", ziter); +#endif + /* Always start new table gen with fresh copy of default_jesd_prm --> jesd_prm */ + ADI_LIBRARY_MEMCPY(&jesd_prm, &default_jesd_prm, sizeof(jesd_prm)); + + if ((ziter > 0) || (ADI_SLOT_SHUFFLE_USE_ONLY_RAND == 1)) + { + /* Generate a random table */ + recoveryAction = randomTableGenWrapper(device, carrierConfigs, &jesd_prm); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + return recoveryAction; + } + } + + /* miter: + * legacy: + * - 0: Default number of JESD IFACE slots needed. min_num_slots = 8 + * - 1: Attempt to increase number of JESD IFACE slots used. min_num_slots = 16 + * current: + * - There is no ability to change iface slot table size at runtime. Must use initial slot table size + */ + for (miter = 0; miter < 1; miter++) + { + if (bStopSearchOnConvergence && (diag.converged == 1u)) + { + break; + } + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Start miter = %d", miter); + + for (citer = 0; citer < 3; citer++) + { + if (bStopSearchOnConvergence && (diag.converged == 1u)) + { + break; + } +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Start citer = %d", citer); +#endif + /* Revert CDUC struct with fresh transfer of jesd_prm --> cduc */ + /* transfer jesd configuration to CDUC output data struct */ + transferJesdConfigToOutputCfg(device, carrierConfigsOut, &jesd_prm); + + switch (citer) + { + /* Start with original/basic slot tables first */ + case (0): + /* Do Nothing */ + break; + + /* Try Swap carriers */ + case (1): +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Swapping carriers:", 0); +#endif + /* Copy data from CDUC --> Shuffle prms */ + recoveryAction = removeDummyCarriers(device, carrierConfigsOut); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { return recoveryAction; } + + recoveryAction = transferSlotTableConfig(device, carrierConfigsOut, &slot_prm); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { return recoveryAction; } + + recoveryAction = transferDelayMismatch(device, carrierConfigsOut, &slot_prm); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { return recoveryAction; } + + /* Swap in Shuffle prms */ + recoveryAction = swapSimilarCarriers(device, &slot_prm); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { return recoveryAction; } + + /* Copy data from Shuffle prms --> CDUC */ + recoveryAction = transferJesdConfigShuffleToJesd(device, carrierConfigsOut, &slot_prm); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { return recoveryAction; } + + recoveryAction = reinsertDummyCarriers(device, carrierConfigsOut); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { return recoveryAction; } + + break; + + /* Try reordered/flipped slot tables */ + case (2): + default: +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Reordering/Flipping carriers:", 0); +#endif + /* Copy data from CDUC --> Shuffle prms */ + recoveryAction = removeDummyCarriers(device, carrierConfigsOut); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { return recoveryAction; } + + recoveryAction = transferSlotTableConfig(device, carrierConfigsOut, &slot_prm); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { return recoveryAction; } + + recoveryAction = transferDelayMismatch(device, carrierConfigsOut, &slot_prm); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { return recoveryAction; } + + /* Reorder table in shuffle parameters */ + recoveryAction = reorderSlotTable(device, &slot_prm); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { return recoveryAction; } + + /* Copy data from Shuffle prms --> CDUC */ + recoveryAction = transferJesdConfigShuffleToJesd(device, carrierConfigsOut, &slot_prm); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { return recoveryAction; } + + recoveryAction = reinsertDummyCarriers(device, carrierConfigsOut); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { return recoveryAction; } + + break; + } + + /* Try 20 carrier "moves" per {miter, citer} permutation */ + for (move_iter = 0; move_iter < 20; move_iter++) + { + /* Update shuffle diagnostic values */ + diag.ziter = ziter; + diag.miter = miter; + diag.citer = citer; + diag.move_iter = move_iter; + + /* Recalc delay and update min state */ + recoveryAction = adrv904x_CducDelayConfigurationCalculate(device, carrierConfigs, carrierChannelFilter, carrierConfigsOut); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { return recoveryAction; } + + recoveryAction = updateMinDelayCducSolution(device, carrierConfigsOut, &cducStateMinDelay); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { return recoveryAction; } + +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + /* Debug print cduc state info */ + ADI_VARIABLE_LOG(&device->common, + ADI_HAL_LOG_MSG, + "Shuffle #{z, m, c, move} = {%d, %d, %d, %d}: ", + ziter, + miter, + citer, + move_iter); + printfCducState(device, carrierConfigsOut); + printfCmodelStats(device, carrierConfigsOut, carrierChannelFilter); +#endif + + if (carrierConfigsOut->delayCfg.delayMismatch_cc > ADRV904X_HALF_MAX_DELAY_CC * 2) + { + /* Copy data from CDUC --> Shuffle prms */ + recoveryAction = removeDummyCarriers(device, carrierConfigsOut); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { return recoveryAction; } + + recoveryAction = transferSlotTableConfig(device, carrierConfigsOut, &slot_prm); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { return recoveryAction; } + + recoveryAction = transferDelayMismatch(device, carrierConfigsOut, &slot_prm); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { return recoveryAction; } + + /* Move carrier position in shuffle prms */ + ADI_LIBRARY_MEMCPY(&slot_prm_copy, &slot_prm, sizeof(slot_prm_copy)); + recoveryAction = moveCarrierPositions(device, &slot_prm); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { return recoveryAction; } + + /* Check that a carrier moved. If not --> break out of move_carrier loop */ + int bMoveDeadEnd = !ADI_LIBRARY_MEMCMP(&slot_prm_copy, &slot_prm, sizeof(slot_prm_copy)); + if (bMoveDeadEnd) + { +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "DEADEND: moveCarrierPositions() sequence hit a dead end.", 0); +#endif + break; + } + + /* Copy data from Shuffle prms --> CDUC */ + recoveryAction = transferJesdConfigShuffleToJesd(device, carrierConfigsOut, &slot_prm); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { return recoveryAction; } + recoveryAction = reinsertDummyCarriers(device, carrierConfigsOut); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { return recoveryAction; } + } + else + { +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + ADI_VARIABLE_LOG(&device->common, + ADI_HAL_LOG_MSG, + "Delay minimized to mismatch = %dns; ziter = %d, miter = %d, citer = %d, Move Iteration = %d", + carrierConfigsOut->delayCfg.delayMismatch_cc, + ziter, + miter, + citer, + move_iter); +#endif + diag.converged = 1u; + break; + + } + } /* end: iter loop around moveCarrierPositions */ + + } /* end: citer loop */ + + } /* end: miter forloop */ + + } /* end: ziter forloop */ + +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + printfCmodelStats(device, carrierConfigsOut, carrierChannelFilter); +#endif + + /* Update final cduc structure to use cduc state of Min Delay Solution */ + ADI_LIBRARY_MEMCPY(carrierConfigsOut, &cducStateMinDelay, sizeof(adi_adrv904x_CarrierReconfigProfileCfgOut_t)); + +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + /* Debug Final print cduc state info */ + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Final Slot Table Result:", 0); + printfCducState(device, carrierConfigsOut); + printfCmodelStats(device, carrierConfigsOut, carrierChannelFilter); + + /* One last calculation of delay for debug */ + recoveryAction = adrv904x_CducDelayConfigurationCalculate(device, carrierConfigs, carrierChannelFilter, carrierConfigsOut); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) { return recoveryAction; } + +#endif + + /* Stop Timer for Shuffling Here: */ + end = ADI_LIBRARY_CLOCK(); +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Diagnositic timer end = %d clocks", end); +#endif + /* Convert timer to us and store */ + diag.procTime_us = (uint32_t)((end - start) * 1e6 / ADI_LIBRARY_CLOCKS_PER_SEC); +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "---------------------------------------------------------------", 0); + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Delay Matching Done:", 0); + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, " Slot Shuffle Algorithm delayMismatch_cc = %d cc", carrierConfigsOut->delayCfg.delayMismatch_cc); + + if (diag.converged == 1u) + { + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, " CONVERGED", 0); + } + else + { + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, " DIVERGED", 0); + } + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Shuffling Elapsed time = %d us", diag.procTime_us); + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "---------------------------------------------------------------", 0); +#endif + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_cpu.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_cpu.c new file mode 100644 index 00000000000..819b50e05e2 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_cpu.c @@ -0,0 +1,2025 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adrv904x_cpu.c +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#include "../../private/include/adrv904x_cpu.h" +#include "../../private/include/adrv904x_gpio.h" +#include "../../private/include/adrv904x_cpu_error_codes_types.h" +#include "../../private/include/adrv904x_reg_addr_macros.h" +#include "../../private/include/adrv904x_init.h" +#include "../../private/include/adrv904x_cpu_memory.h" +#include "../../private/include/adrv904x_cpu_device_profile_types.h" +#include "../../private/include/adrv904x_cpu_scratch_registers.h" +#include "adi_adrv904x_cpu_cmd_ecc_scrub.h" + +#include "adi_adrv904x_dfe_cpu.h" +#include "../../private/include/adrv904x_dfe_cpu.h" +#include "../../private/include/adrv904x_dfe_svc_bbic_bridge_t.h" +#include "../../private/include/adrv904x_dfe_framework_cmd_t.h" + +#include "adi_adrv904x_cpu_types.h" +#include "adi_adrv904x_cpu.h" +#include "adi_adrv904x_utilities.h" + + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_CPU + +/*****************************************************************************/ +/***** Helper functions' prototypes ******************************************/ +/*****************************************************************************/ +static adi_adrv904x_ErrAction_e adrv904x_CpuAddrInitialize( adi_adrv904x_CpuAddr_t* const cpuAddr, + const adi_adrv904x_CpuType_e type); + + +/*****************************************************************************/ +/***** Local data types ******************************************************/ +/*****************************************************************************/ + +static adi_adrv904x_ErrAction_e adrv904x_CpuAddrInitialize( adi_adrv904x_CpuAddr_t* const cpuAddr, + const adi_adrv904x_CpuType_e type) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + switch (type) + { + case ADI_ADRV904X_CPU_TYPE_0: + cpuAddr->enabled = ADI_TRUE; + cpuAddr->ctlAddr = ADRV904X_CPU_0_ADDR_CTL_1; + cpuAddr->bootAddr = ADRV904X_CPU_0_ADDR_BOOT_ADDR_BYTE0; + cpuAddr->stackPtrAddr = ADRV904X_CPU_0_ADDR_STACK_PTR_BYTE0; + cpuAddr->memBankCtrlAddr = ADRV904X_CPU_0_ADDR_MEM_BANK_CTRL; + cpuAddr->cmdAddr = ADRV904X_CPU_0_ADDR_COMMAND; + cpuAddr->extCmdAddr = ADRV904X_CPU_0_ADDR_EXT_CMD_BYTE_1; + cpuAddr->cmdStatusAddr = ADRV904X_CPU_0_ADDR_CMD_STATUS_0; + cpuAddr->progStartAddr = ADRV904X_CPU_0_ADDR_PROG_START; + cpuAddr->mailboxGetAddr = ADRV904X_CPU_0_DM_MAILBOX_LINK_0_START_ADDR; + cpuAddr->versionAddr = ADRV904X_ADDR_FW_VERSION; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + + case ADI_ADRV904X_CPU_TYPE_1: + cpuAddr->ctlAddr = ADRV904X_CPU_1_ADDR_CTL_1; + cpuAddr->bootAddr = ADRV904X_CPU_1_ADDR_BOOT_ADDR_BYTE0; + cpuAddr->stackPtrAddr = ADRV904X_CPU_1_ADDR_STACK_PTR_BYTE0; + cpuAddr->memBankCtrlAddr = ADRV904X_CPU_1_ADDR_MEM_BANK_CTRL; + cpuAddr->cmdAddr = ADRV904X_CPU_1_ADDR_COMMAND; + cpuAddr->extCmdAddr = ADRV904X_CPU_1_ADDR_EXT_CMD_BYTE_1; + cpuAddr->cmdStatusAddr = ADRV904X_CPU_1_ADDR_CMD_STATUS_0; + cpuAddr->progStartAddr = ADRV904X_CPU_1_ADDR_PROG_START; + cpuAddr->mailboxGetAddr = ADRV904X_CPU_1_DM_MAILBOX_LINK_0_START_ADDR; + cpuAddr->versionAddr = ADRV904X_ADDR_FW_VERSION; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + + case ADI_ADRV904X_CPU_TYPE_DFE: + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + + case ADI_ADRV904X_CPU_TYPE_UNKNOWN: /* Fall Through */ + case ADI_ADRV904X_CPU_TYPE_MAX_RADIO: /* Fall Through */ + case ADI_ADRV904X_CPU_TYPE_MAX: /* Fall Through */ + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + break; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e adrv904x_CpuMailBoxRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType, + const adrv904x_LinkId_e linkId, + const uint32_t byteCount) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + if ((cpuType >= ADI_ADRV904X_CPU_TYPE_MAX) || + (cpuType <= ADI_ADRV904X_CPU_TYPE_UNKNOWN)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, recoveryAction, cpuType, "Invalid CPU Type Passed"); + return recoveryAction; + } + + if ((linkId >= ADRV904X_LINK_ID_MAX) || + (linkId <= ADRV904X_LINK_ID_UNKNOWN)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common,recoveryAction, linkId,"Invalid LinkId Passed"); + return recoveryAction; + } + + if (cpuType == ADI_ADRV904X_CPU_TYPE_0) + { + /* check for valid byteCount */ + if (byteCount > ADRV904X_CPU_0_MAILBOX_LINK_0_SIZE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, byteCount, "Invalid Byte Count"); + return recoveryAction; + } + } + + if (cpuType == ADI_ADRV904X_CPU_TYPE_1) + { + /* check for valid byteCount */ + if (byteCount > ADRV904X_CPU_1_MAILBOX_LINK_0_SIZE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, byteCount, "Invalid Byte Count"); + return recoveryAction; + } + } + + if (cpuType == ADI_ADRV904X_CPU_TYPE_DFE) + { + /* check for valid byteCount */ + if (byteCount > sizeof(_adi_DfeMailboxBuffer_t)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, byteCount, "Invalid Byte Count"); + return recoveryAction; + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuForceException(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_CpuAddr_t *cpuAddr = NULL; + uint32_t i = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + if (cpuType == ADI_ADRV904X_CPU_TYPE_0 || + cpuType == ADI_ADRV904X_CPU_TYPE_1) + { + cpuAddr = &(device->devStateInfo.cpu.cpuAddr[cpuType]); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cpuAddr); + + /* Command payload */ + for (i = 1U; i <= 4U; ++i) + { + recoveryAction = adi_adrv904x_Register32Write(device, + NULL, + cpuAddr->cmdAddr + i, + (uint32_t)0xFFU, + (uint32_t)0xFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CPU Mailbox Command Write Issue"); + return recoveryAction; + } + } + + /* Opcode */ + recoveryAction = adi_adrv904x_Register32Write(device, + NULL, + cpuAddr->cmdAddr, + (uint32_t)ADRV904X_MAILBOX_FORCE_EXCEPTION, + (uint32_t)0xFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CPU Mailbox Command Write Issue"); + return recoveryAction; + } + } + + else if (cpuType == ADI_ADRV904X_CPU_TYPE_DFE) + { + recoveryAction = adrv904x_Core_A55Spi0Command_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_DFE_SVC_CMD_DFE_MAILBOX_FORCE_EXCEPTION); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register write (for DFE CPU Command) Issue"); + return recoveryAction; + } + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuType, "Invalid CPU Type Passed"); + return recoveryAction; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e adrv904x_CpuMailboxBufferWrite(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType, + const adrv904x_LinkId_e linkId, + const uint8_t data[], + const uint32_t byteCount) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_SpiCache_t spiCache = { {0U}, 0U, 0U, 0U }; + uint32_t cpuAddr = ADRV904X_CPU_0_DM_MAILBOX_LINK_0_START_ADDR; + uint32_t i = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, data); + + if (0U == byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, byteCount, "Invalid Byte Count"); + return recoveryAction; + } + + recoveryAction = adrv904x_CpuMailBoxRangeCheck( device, cpuType, linkId, byteCount); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CPU Mailbox Range Check Issue"); + return recoveryAction; + } + + /* get the particular processor's address map */ + if (cpuType == ADI_ADRV904X_CPU_TYPE_1) + { + cpuAddr = ADRV904X_CPU_1_DM_MAILBOX_LINK_0_START_ADDR; + + } + else if (cpuType == ADI_ADRV904X_CPU_TYPE_DFE) + { + uint32_t sdkdata_address; + + /* get the data address from the scratchpad register */ + recoveryAction = adrv904x_DfeSdkDataAddrGet(device, &sdkdata_address); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DFE Mailbox Address Issue"); + return recoveryAction; + } + + cpuAddr = sdkdata_address + ADI_LIBRARY_OFFSETOF(adrv904x_DfeSvcBbicBridgeSdkData_t, dfeMailboxBuffer) + ADI_LIBRARY_OFFSETOF(_adi_DfeMailboxBuffer_t, buffer); + } + + for (i = 0U; i < byteCount; ++i) + { + recoveryAction = adi_adrv904x_Register32Write( device, + &spiCache, + cpuAddr + i, + (uint32_t)data[i], + (uint32_t)0xFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CPU Mailbox Buffer Write Issue"); + return recoveryAction; + } + } + + recoveryAction = adi_adrv904x_SpiFlush( device, spiCache.data, &spiCache.count); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flush Issue After CPU Mailbox Buffer Write"); + return recoveryAction; + } + + return recoveryAction; +} + + +static adi_adrv904x_ErrAction_e adrv904x_CpuMailboxBufferRead(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType, + const adrv904x_LinkId_e linkId, + uint8_t data[], + const uint32_t byteCount) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t cpuAddr = ADRV904X_CPU_0_DM_MAILBOX_LINK_0_START_ADDR; + + + uint8_t readData[SVC_BBIC_BRIDGE_MAX_MAILBOX_LINK_SIZE] = { 0U }; + + uint32_t i = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, data); + + if (0U == byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, byteCount, "Invalid Byte Count"); + return recoveryAction; + } + + recoveryAction = adrv904x_CpuMailBoxRangeCheck(device, cpuType, linkId, byteCount); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CPU Mailbox Range Check Issue"); + return recoveryAction; + } + + /* get the particular processor's address map */ + if (cpuType == ADI_ADRV904X_CPU_TYPE_1) + { + cpuAddr = ADRV904X_CPU_1_DM_MAILBOX_LINK_0_START_ADDR; + } + else if (cpuType == ADI_ADRV904X_CPU_TYPE_DFE) + { + uint32_t sdkdata_address; + + /* get the data address from the scratchpad register */ + recoveryAction = adrv904x_DfeSdkDataAddrGet(device, &sdkdata_address); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DFE Mailbox Address Issue"); + return recoveryAction; + } + + cpuAddr = sdkdata_address + ADI_LIBRARY_OFFSETOF(adrv904x_DfeSvcBbicBridgeSdkData_t, dfeMailboxBuffer) + ADI_LIBRARY_OFFSETOF(_adi_DfeMailboxBuffer_t, buffer); + } + + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, cpuAddr, readData, NULL, byteCount); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CPU Mailbox Buffer Read Issue"); + return recoveryAction; + } + + for (i = 0U; i < byteCount; ++i) + { + data[i] = readData[i]; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e adrv904x_CpuMailboxBusyGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType, + uint8_t* const mailboxBusy) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, mailboxBusy); + + /* Read cpu_command_busy bit in cpu_command(0x00c3) register*/ + if (cpuType == ADI_ADRV904X_CPU_TYPE_0) + { + recoveryAction = adrv904x_Core_Arm0Spi0CommandBusy_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + mailboxBusy); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register Read (for CPU 0 Command Busy Bit) Issue"); + return recoveryAction; + } + } + else if (cpuType == ADI_ADRV904X_CPU_TYPE_1) + { + recoveryAction = adrv904x_Core_Arm1Spi0CommandBusy_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + mailboxBusy); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register Read (for CPU 1 Command Busy Bit) Issue"); + return recoveryAction; + } + } + else if (cpuType == ADI_ADRV904X_CPU_TYPE_DFE) + { + recoveryAction = adrv904x_Core_A55Spi0CommandBusy_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + mailboxBusy); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register Read (for DFE CPU Command Busy Bit) Issue"); + return recoveryAction; + } + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuType, "Invalid CPU Type Provided"); + return recoveryAction; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e adrv904x_CpuCmdStatusLinkIdGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType, + const adrv904x_LinkId_e linkId, + uint8_t* const cmdStatByte) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t cmdByteIndex = 0U; + uint8_t cmdByte = 0U; + uint8_t cmdByteVerify = 0U; + uint32_t readData = 0U; + adi_adrv904x_CpuAddr_t *cpuAddr = NULL; + static const uint8_t CPU_STATUS_MASK = 0x0FU; + static const uint8_t CPU_STATUS_SHIFT_HI = 4U; + static const uint8_t CPU_PENDING = 0x01U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cmdStatByte); + + recoveryAction = adrv904x_CpuMailBoxRangeCheck( device, cpuType, linkId, 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CPU Mailbox Range Check Issue"); + return recoveryAction; + } + + if ((cpuType == ADI_ADRV904X_CPU_TYPE_0) || + (cpuType == ADI_ADRV904X_CPU_TYPE_1)) + { + /* get the particular processor's address map */ + cpuAddr = &(device->devStateInfo.cpu.cpuAddr[cpuType]); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cpuAddr); + + /* calculating command status register offset based on linkId status packing */ + cmdByteIndex = (uint8_t)linkId >> 2U; + + /* reading the command status register for given linkId */ + /* Two reads back to back for verify correct SPI operation */ + recoveryAction = adi_adrv904x_Register32Read(device, NULL, cpuAddr->cmdStatusAddr + cmdByteIndex, &readData, 0xFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Command Status Read Issue (1)"); + return recoveryAction; + } + cmdByte = readData & 0xFFU; + recoveryAction = adi_adrv904x_Register32Read(device, NULL, cpuAddr->cmdStatusAddr + cmdByteIndex, &readData, 0xFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Command Status Read Issue (2)"); + return recoveryAction; + } + cmdByteVerify = readData & 0xFFU; + } + else if(cpuType == ADI_ADRV904X_CPU_TYPE_DFE) + { + uint64_t cmdStatus = 0; + /* reading the command status register for given linkId */ + /* Two reads back to back for verify correct SPI operation */ + recoveryAction = adrv904x_Core_A55Spi0CmdStatusDwl_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &cmdStatus); + cmdByte = cmdStatus & 0xFFU; + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Command Status Read Issue (1)"); + return recoveryAction; + } + + recoveryAction = adrv904x_Core_A55Spi0CmdStatusDwl_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &cmdStatus); + cmdByteVerify = cmdStatus & 0xFFU; + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Command Status Read Issue (2)"); + return recoveryAction; + } + } + + /* identifying nibble location in command register for given linkId */ + /* Manually set the pending bit if verification fails */ + if ((((uint8_t)linkId >> 1) & (uint8_t)0x01) == (uint8_t)0x01) + { + *cmdStatByte = ((cmdByte == cmdByteVerify) ? ((cmdByte >> CPU_STATUS_SHIFT_HI) & CPU_STATUS_MASK) : ((cmdByte >> CPU_STATUS_SHIFT_HI) & CPU_STATUS_MASK) | CPU_PENDING); + } + else + { + *cmdStatByte = ((cmdByte == cmdByteVerify) ? (cmdByte & CPU_STATUS_MASK) : (cmdByte & CPU_STATUS_MASK) | CPU_PENDING); + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e adrv904x_CpuCmdStatusWait(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType, + const adrv904x_LinkId_e linkId, + uint8_t* const cmdStatusByte, + const uint32_t timeout_us, + uint32_t waitInterval_us) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t eventCheck = 0U; + uint32_t numEventChecks = 0U; + static const uint8_t CPU_PENDING = 0x01U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cmdStatusByte); + + recoveryAction = adrv904x_CpuMailBoxRangeCheck(device, cpuType, linkId, 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CPU Mailbox Range Check Issue"); + return recoveryAction; + } + + waitInterval_us = (waitInterval_us > timeout_us) ? timeout_us : waitInterval_us; + numEventChecks = (waitInterval_us == 0U) ? 1U : (timeout_us / waitInterval_us); + + /* timeout event check loop */ + for (eventCheck = 0U; eventCheck <= numEventChecks; ++eventCheck) + { + /* read status of linkId */ + recoveryAction = adrv904x_CpuCmdStatusLinkIdGet( device, cpuType, linkId, cmdStatusByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "LinkId Status Check Issue"); + return recoveryAction; + } + + /* if pending bit is set for linkId of interest and the number of events have not expired, perform wait */ + if (((*cmdStatusByte & CPU_PENDING) > 0U) && + (eventCheck < numEventChecks)) + { + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_Wait_us(&device->common, waitInterval_us) ; + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "HAL Wait Request Issue"); + return recoveryAction; + } + } + else + { + break; + } + } + + /* if CPU Command did not complete within the timeout period */ + if ((*cmdStatusByte & CPU_PENDING) > 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_FEATURE; + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_CPU, + ADI_ADRV904X_ERRCODE_CPU_CMD_TIMEOUT, + recoveryAction, + *cmdStatusByte, + "Timed out waiting for command response"); + return recoveryAction; + } + + return recoveryAction; +} + +/*****************************************************************************/ +/***** Public functions' definition ******************************************/ +/*****************************************************************************/ +ADI_API adi_adrv904x_CpuAddr_t* adrv904x_CpuAddrGet(adi_adrv904x_Cpu_t* const cpu, + const adi_adrv904x_CpuType_e cpuType) +{ + if (cpu == NULL) + { + return NULL; + } + return &cpu->cpuAddr[cpuType]; +} + +/* Interprets the memory at buf as a little-endian 2 or 4 byte integer and returns it as + * a uint32_t */ +ADI_API uint32_t adrv904x_CpuIntFromBytesGet(const uint8_t* const buf, const uint8_t size) +{ + uint32_t result = 0U; + uint8_t i = 0U; + + if (buf == NULL) + { + return 0U; + } + + if (size <= 4U) + { + for (i = 0U; i < size; ++i) + { + result |= (uint32_t)(*(buf + i)) << (i * 8U); + } + } + + return result; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuInitialize(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_Cpu_t* cpu = NULL; + adi_adrv904x_CpuType_e cpuType = ADI_ADRV904X_CPU_TYPE_UNKNOWN; + uint8_t idx = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + cpu = &device->devStateInfo.cpu; + + //This is retrieved from the FW image directly + cpu->devProfileAddr = 0; + + for (idx = 0U; idx < ADI_ADRV904X_MAX_NUM_CPUS; ++idx) + { + /* Skip ADI_ADRV904X_CPU_TYPE_MAX_RADIO value */ + if (idx == (uint8_t)ADI_ADRV904X_CPU_TYPE_MAX_RADIO) + { + continue; + } + cpuType = (adi_adrv904x_CpuType_e)idx; + + recoveryAction = adrv904x_CpuAddrInitialize(&cpu->cpuAddr[idx], cpuType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid CPU Type Provided"); + return recoveryAction; + break; + } + + if (idx < (uint8_t)ADI_ADRV904X_CPU_TYPE_MAX_RADIO) + { + /* Set the memory bank configuration for the CPU0 and CPU1. Must be done here + * before any attempt to program the CPU image is made. + */ + ADRV904X_SPIWRITEBYTE_RETURN("CPU_ADDR_MEM_BANK_CTRL", cpu->cpuAddr[idx].memBankCtrlAddr, ADRV904X_CPU_MEM_BANK_CTRL_REG_VAL, recoveryAction); + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuCmdWrite(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType, + const adrv904x_LinkId_e linkId, + const adrv904x_CpuCmdId_t cmdId, + adrv904x_CpuCmd_t* const cmd, + const uint32_t payloadSize) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t cpuCommandBusy = 0U; + uint32_t exceptionValue = 0U; + uint32_t timeout_us = ADI_ADRV904X_SENDCPUCMD_TIMEOUT_US; + uint32_t waitInterval_us = ADI_ADRV904X_SENDCPUCMD_INTERVAL_US; + uint32_t eventCheck = 0U; + uint32_t numEventChecks = 0U; + adi_adrv904x_CpuAddr_t *cpuAddr = NULL; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cmd); + + if ((cpuType == ADI_ADRV904X_CPU_TYPE_0) || + (cpuType == ADI_ADRV904X_CPU_TYPE_1)) + { + /* check for valid cmd id */ + if (cmdId >= ADRV904X_CPU_CMD_ID_NUM_CMDS) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cmdId, + "Invalid Command ID Provided"); + return recoveryAction; + } + } + else if(cpuType == ADI_ADRV904X_CPU_TYPE_DFE) + { + /* check for valid cmd id */ + if (cmdId > ADRV904X_DFE_SVC_CPU_CMD_ID_DFE_APPLICATION) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cmdId, + "Invalid Command ID Provided"); + return recoveryAction; + } + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cpuType, + "Invalid CPU Type Provided"); + return recoveryAction; + } + + /* setting a 2 second timeout for mailbox busy bit to be clear (can't send an cpu mailbox command until mailbox is ready) */ +#if ADI_ADRV904X_SENDCPUCMD_INTERVAL_US > ADI_ADRV904X_SENDCPUCMD_TIMEOUT_US + waitInterval_us = timeout_us; +#elif ADI_ADRV904X_SENDCPUCMD_INTERVAL_US == 0 + waitInterval_us = timeout_us; +#endif + numEventChecks = timeout_us / waitInterval_us; + + /* timeout event loop to permit non-blocking of thread */ + for (eventCheck = 0U; eventCheck <= numEventChecks; ++eventCheck) + { + recoveryAction = adrv904x_CpuMailboxBusyGet( device, cpuType, &cpuCommandBusy); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cpu Mailbox busy state cannot be read"); + return recoveryAction; + } + + if (cpuCommandBusy == ADI_TRUE) + { + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_Wait_us(&device->common, waitInterval_us); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "HAL Wait Request Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_CpuCheckException(device, &exceptionValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CPU exception state cannot be read."); + return recoveryAction; + } + + if (exceptionValue != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_DEVICE; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, exceptionValue, "CPU exception detected waiting for mailbox ready."); + return recoveryAction; + } + + + exceptionValue = 0U; + recoveryAction = adi_adrv904x_DfeCpuCheckException(device, &exceptionValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DFE CPU exception state cannot be read."); + return recoveryAction; + } + + if (exceptionValue != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_DEVICE; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, exceptionValue, "DFE CPU exception detected waiting for mailbox ready."); + return recoveryAction; + } + + } + else + { + break; + } + } + + /* if busy bit remains set after timeout event loop function is exited, otherwise command is sent */ + if (cpuCommandBusy == ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_FEATURE; + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_CPU, + ADI_ADRV904X_ERRCODE_CPU_CMD_TIMEOUT, + recoveryAction, + cpuCommandBusy, + "CPU Mailbox Busy; Timeout Occurred"); + return recoveryAction; + } + + cpuAddr = &(device->devStateInfo.cpu.cpuAddr[cpuType]); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cpuAddr); + + ++cpuAddr->curTransactionId[linkId]; + cmd->cmdId = ADRV904X_HTOCS(cmdId); + cmd->tId = ADRV904X_HTOCS(cpuAddr->curTransactionId[linkId]); + + recoveryAction = adrv904x_CpuMailboxBufferWrite(device, + cpuType, + linkId, + (const uint8_t *)cmd, + payloadSize+sizeof(adrv904x_CpuCmd_t)); + if(recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CPU Mailbox Buffer Write Issue"); + return recoveryAction; + } + + if ((cpuType == ADI_ADRV904X_CPU_TYPE_0) || + (cpuType == ADI_ADRV904X_CPU_TYPE_1)) + { + ADRV904X_SPIWRITEBYTE_RETURN("CPU_COMMAND", cpuAddr->cmdAddr, linkId, recoveryAction); + } + else if (cpuType == ADI_ADRV904X_CPU_TYPE_DFE) + { + recoveryAction = adrv904x_Core_A55Spi0Command_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (uint8_t)linkId); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register write (for DFE CPU Command) Issue"); + return recoveryAction; + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuCmdRespRead(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType, + const adrv904x_LinkId_e linkId, + adrv904x_CpuCmdId_t*const cmdId, + adrv904x_CpuCmdResp_t* const cmdRsp, + const uint32_t payloadSize, + adrv904x_CpuCmdStatus_e* const status) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmdTransactionId_t rxdTransactionId = 0U; + const adi_adrv904x_CpuAddr_t* cpuAddr = NULL; + uint8_t cmdStatusByte = 0U; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cmdRsp); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cmdId); + + /* Caller is allowed to pass in NULL for status, + * so we must check every time before dereferencing. + */ + if (status != NULL) + { + *status = ADRV904X_CPU_CMD_STATUS_GENERIC; + } + + /* Wait for a command response from the CPU */ + recoveryAction = adrv904x_CpuCmdStatusWait( device, + cpuType, + linkId, + &cmdStatusByte, + ADI_ADRV904X_READCPURESP_TIMEOUT_US, + ADI_ADRV904X_READCPURESP_INTERVAL_US); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + if (status != NULL) + { + *status = ADRV904X_CPU_CMD_STATUS_LINK_ERROR; + } + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_CPU, + ADI_ADRV904X_ERRCODE_CPU_CMD_TIMEOUT, + ADI_NO_VARIABLE, + recoveryAction); + return recoveryAction; + } + + cpuAddr = &(device->devStateInfo.cpu.cpuAddr[cpuType]); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cpuAddr); + + /* Read the response from the CPU */ + recoveryAction = adrv904x_CpuMailboxBufferRead( device, + cpuType, + linkId, + (uint8_t *)cmdRsp, + payloadSize + sizeof(adrv904x_CpuCmdResp_t)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + if (status != NULL) + { + *status = ADRV904X_CPU_CMD_STATUS_LINK_ERROR; + } + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_CPU, + ADI_ADRV904X_ERRCODE_CPU_MAILBOX_READ, + ADI_NO_VARIABLE, + recoveryAction); + return recoveryAction; + } + + /* Extract the cmd ID and transaction ID from the response */ + *cmdId = ADRV904X_CTOHS(cmdRsp->cmdId); + rxdTransactionId = ADRV904X_CTOHS(cmdRsp->tId); + + /* Verify the transaction ID */ + if (rxdTransactionId != cpuAddr->curTransactionId[linkId]) + { + if (status != NULL) + { + *status = ADRV904X_CPU_CMD_STATUS_UNEXPECTED_TRANSACTION_ID; + } + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_FEATURE; + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_CPU, + ADI_ADRV904X_ERRCODE_CPU_CMD_ID, + recoveryAction, + rxdTransactionId, + "Command Failed: Unexpected Transaction Id"); + return recoveryAction; + } + else + { + /* Transaction ID is correct. Check the command status for failure. */ + cmdStatus = (adrv904x_CpuCmdStatus_e)ADRV904X_CTOHS(cmdRsp->status); + + if (status != NULL) + { + *status = cmdStatus; + } + + if (cmdStatus != ADRV904X_CPU_CMD_STATUS_NO_ERROR) + { + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_CPU, + ADI_ADRV904X_ERRCODE_CPU_CMD_RESPONSE, + cmdStatus, + recoveryAction); + return recoveryAction; + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuCmdSend(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType, + const adrv904x_LinkId_e linkId, + const adrv904x_CpuCmdId_t cmdId, + void* const pCmdPayload, + const size_t cmdPayloadSz, + void* const pRespPayload, + const size_t respPayloadSz, + adrv904x_CpuCmdStatus_e* const status) +{ + /* Union to determine maximum buffer size needed for both CPU command and response */ + typedef union + { + uint8_t maxCmdBuf[ADRV904X_CPU_CMD_MAX_SIZE_BYTES]; + uint8_t maxCmdRspBuf[ADRV904X_CPU_CMD_RESP_MAX_SIZE_BYTES]; + } adrv904x_MaxCpuCmdBufSz_t; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_t *txCmd = NULL; + adrv904x_CpuCmdResp_t *rxRsp = NULL; + adrv904x_CpuCmdId_t rspCmdId; + adrv904x_CpuCmdStatus_e cmdStatus; + uint8_t cmdBuf[sizeof(adrv904x_MaxCpuCmdBufSz_t)]; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Initialize the caller's status parameter, if applicable. */ + if (status != NULL) + { + *status = ADRV904X_CPU_CMD_STATUS_GENERIC; + } + + /* If the command payload size is nonzero, verify the pointer is not null */ + if (cmdPayloadSz != 0) + { + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, pCmdPayload); + } + else if (pCmdPayload != NULL) + { + /* If the command payload size is zero, pointer must be null */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, pCmdPayload, "pCmdPayload must be NULL if cmdPayloadSz is 0"); + return recoveryAction; + } + + /* If the command response payload size is nonzero, verify the pointer is not null */ + if (respPayloadSz != 0) + { + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, pRespPayload); + } + else if (pRespPayload != NULL) + { + /* If the command response payload size is zero, pointer must be null */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, pRespPayload, "pRespPayload must be NULL if respPayloadSz is 0"); + return recoveryAction; + } + + /* Verify cpuType */ + if ((cpuType >= ADI_ADRV904X_CPU_TYPE_MAX_RADIO) || + (cpuType <= ADI_ADRV904X_CPU_TYPE_UNKNOWN)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuType, "Invalid CPU type"); + return recoveryAction; + } + + /* Verify cmdId */ + if (cmdId >= ADRV904X_CPU_CMD_ID_NUM_CMDS) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cmdId, "Invalid command ID"); + return recoveryAction; + } + + /* Verify linkId */ + if ((linkId >= ADRV904X_LINK_ID_MAX) || (linkId <= ADRV904X_LINK_ID_UNKNOWN)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, linkId, "Invalid link ID"); + return recoveryAction; + } + + /* Verify command payload size is acceptable */ + if (cmdPayloadSz > (sizeof(cmdBuf) - sizeof(adrv904x_CpuCmd_t))) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cmdPayloadSz, "cmdPayloadSz is too large for command buffer."); + return recoveryAction; + } + + /* Verify response payload size is acceptable */ + if (respPayloadSz > (sizeof(cmdBuf) - sizeof(adrv904x_CpuCmdResp_t))) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, respPayloadSz, "respPayloadSz is too large for command buffer."); + return recoveryAction; + } + + /* Overlay the command header and response header on the buffer */ + txCmd = (adrv904x_CpuCmd_t*)cmdBuf; + rxRsp = (adrv904x_CpuCmdResp_t*)cmdBuf; + + /* Copy the caller's payload to the correct location. Size is verified above. */ + if (cmdPayloadSz != 0) + { + ADI_LIBRARY_MEMCPY((void*)((uint8_t*)txCmd + sizeof(adrv904x_CpuCmd_t)), pCmdPayload, cmdPayloadSz) ; + } + + /* Send the command */ + recoveryAction = adrv904x_CpuCmdWrite(device, cpuType, linkId, cmdId, txCmd, cmdPayloadSz); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to send command to CPU"); + goto debug; + } + + /* Wait for the response, then receive the payload into rxRsp. rxRsp is verified to be able to hold respPayloadSz payload above. */ + recoveryAction = adrv904x_CpuCmdRespRead(device, cpuType, linkId, &rspCmdId, rxRsp, (uint32_t)respPayloadSz, &cmdStatus); + + /* Copy cmd status out for caller, if applicable */ + if (status != NULL) + { + *status = cmdStatus; + } + + /* Process any cmd errors */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + if (cmdStatus == ADRV904X_CPU_CMD_STATUS_CMD_FAILED) + { + /* For command-specific failures, copy the payload to the caller's buffer before aborting. */ + if (respPayloadSz != 0) + { + ADI_LIBRARY_MEMCPY(pRespPayload, (void*)((uint8_t*)rxRsp + sizeof(adrv904x_CpuCmdResp_t)), respPayloadSz); + } + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CPU Command Response Error"); + } + else + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "No CPU Command Response Received"); + } + + goto debug; + } + + /* Copy the payload to the caller's buffer */ + if (respPayloadSz != 0) + { + ADI_LIBRARY_MEMCPY(pRespPayload, (void*)((uint8_t*)rxRsp + sizeof(adrv904x_CpuCmdResp_t)), respPayloadSz); + } + + return recoveryAction; + +debug: + /* Disable Error Clearing for Private API Call Case e.g. CpuPing */ + ++device->common.publicCnt; + + adrv904x_CpuErrorDebugCheck(device); + + + adrv904x_DfeCpuErrorDebugCheck(device); + + --device->common.publicCnt; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuChannelMappingGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + const adrv904x_CpuObjectId_e objId, + adi_adrv904x_CpuType_e* const cpuType) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t cpuNum = 2u; /* Set to bad CPU */ + uint32_t idx = 0u; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_NULL_PTR_RETURN(cpuType); + + /* Detect any ORx channel commands */ + if (ADRV904X_CPU_OBJID_IS_ORX(objId)) + { + for (idx = 0U; idx < ADI_ADRV904X_MAX_ORX; idx++) + { + if ((uint32_t)channel == ((uint32_t)1U << idx)) + { + cpuNum = device->initExtract.orxCpuConfig[idx]; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + } + } + } + /* The SERDES cals spread the cals for different lanes evenly across the available CPU cores. + * For these cals, the channel passed in is the SERDES lane of interest + */ + else if ((objId == ADRV904X_CPU_OBJID_IC_SERDES) || + (objId == ADRV904X_CPU_OBJID_TC_SERDES)) + { + for (idx = 0U; idx < ADI_ADRV904X_MAX_SERDES_LANES; idx++) + { + if ((uint32_t)channel == ((uint32_t)1U << idx)) + { + cpuNum = device->initExtract.jesd204DesLaneCpuConfig[idx]; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + } + } + } + /* The RC TUNER CAL is only supported on CPU0 */ + else if (objId == ADRV904X_CPU_OBJID_IC_RC_TUNER) + { + cpuNum = 0; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + else /* Assume Rx or Tx applies */ + { + for (idx = 0U; idx < ADI_ADRV904X_MAX_CHANNELS; idx++) + { + if ((uint32_t)channel == ((uint32_t)1U << idx)) + { + cpuNum = device->initExtract.rxTxCpuConfig[idx]; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + } + } + } + + if (recoveryAction == ADI_ADRV904X_ERR_ACT_NONE) + { + if (cpuNum == 0u) + { + *cpuType = ADI_ADRV904X_CPU_TYPE_0; + } + else if (cpuNum == 1u) + { + *cpuType = ADI_ADRV904X_CPU_TYPE_1; + } + else + { + *cpuType = ADI_ADRV904X_CPU_TYPE_UNKNOWN; + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuRamAccessStart(adi_adrv904x_Device_t* const device, + const adrv904x_CpuCmd_CaptureRamType_e captureRamType, + const adi_adrv904x_Channels_e channelNumber, + uint8_t* const success) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_RamAccessStart_t cmd; + adrv904x_CpuCmd_RamAccessStartResp_t cmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_CAPTURE_RAM_LOCK_ERROR; + adi_adrv904x_CpuType_e cpuType = ADI_ADRV904X_CPU_TYPE_UNKNOWN; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, success); + + ADI_LIBRARY_MEMSET(&cmd, 0, sizeof(adrv904x_CpuCmd_RamAccessStart_t)); + ADI_LIBRARY_MEMSET(&cmdRsp, 0, sizeof(adrv904x_CpuCmd_RamAccessStartResp_t)); + + /* Initialize success flag to false */ + *success = 0U; + + /* Get the CPU assigned to this channel */ + recoveryAction = adrv904x_CpuChannelMappingGet(device, channelNumber, ADRV904X_CPU_OBJID_SYSTEM_END, &cpuType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to get CPU channel mapping"); + return recoveryAction; + } + + /* Setup cmd-specific payload */ + cmd.captureRamType = (adrv904x_CpuCmd_CaptureRamType_t)captureRamType; + cmd.channelNumber = ADRV904X_HTOCL((uint32_t)channelNumber); + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + cpuType, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_RAM_ACCESS_START, + (void*)&cmd, + sizeof(cmd), + (void*)&cmdRsp, + sizeof(cmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_RETURN(cmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction); + } + + /* Extract cmd-specific response */ + cpuErrorCode = (adrv904x_CpuErrorCode_e)ADRV904X_CTOHL((uint32_t)cmdRsp.status); + + /* If NO_ERROR was returned, the start command was successful */ + if (cpuErrorCode == ADRV904X_CPU_NO_ERROR) + { + *success = 1U; + } + else if (cpuErrorCode != ADRV904X_CPU_SYSTEM_CAPTURE_RAM_LOCK_ERROR) + { + /* Any error other than LOCK_ERROR is unexpected */ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_CPU, + ADI_ADRV904X_ERRCODE_CPU_RAM_LOCK, + cpuErrorCode, + recoveryAction); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuRamAccessStop( adi_adrv904x_Device_t* const device, + const adrv904x_CpuCmd_CaptureRamType_e captureRamType, + const adi_adrv904x_Channels_e channelNumber, + uint8_t* const success) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_RamAccessStop_t cmd; + adrv904x_CpuCmd_RamAccessStopResp_t cmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_CAPTURE_RAM_LOCK_ERROR; + adi_adrv904x_CpuType_e cpuType = ADI_ADRV904X_CPU_TYPE_UNKNOWN; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, success); + ADI_LIBRARY_MEMSET(&cmd, 0, sizeof(adrv904x_CpuCmd_RamAccessStop_t)); + ADI_LIBRARY_MEMSET(&cmdRsp, 0, sizeof(adrv904x_CpuCmd_RamAccessStopResp_t)); + + /* Initialize success flag to false */ + *success = 0U; + + /* Get the CPU assigned to this channel */ + recoveryAction = adrv904x_CpuChannelMappingGet(device, channelNumber, ADRV904X_CPU_OBJID_SYSTEM_END, &cpuType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to get CPU channel mapping"); + return recoveryAction; + } + + /* Setup cmd-specific payload */ + cmd.captureRamType = (adrv904x_CpuCmd_CaptureRamType_t)captureRamType; + cmd.channelNumber = ADRV904X_HTOCL((uint32_t)channelNumber); + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + cpuType, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_RAM_ACCESS_STOP, + (void*)&cmd, + sizeof(cmd), + (void*)&cmdRsp, + sizeof(cmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_RETURN(cmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction); + } + + /* Extract cmd-specific response */ + cpuErrorCode = (adrv904x_CpuErrorCode_e)ADRV904X_CTOHL((uint32_t)cmdRsp.status); + + /* If NO_ERROR was returned, the stop command was successful */ + if (cpuErrorCode == ADRV904X_CPU_NO_ERROR) + { + *success = 1U; + } + else if (cpuErrorCode != ADRV904X_CPU_SYSTEM_CAPTURE_RAM_UNLOCK_ERROR) + { + /* Any error other than UNLOCK_ERROR is unexpected */ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_CPU, + ADI_ADRV904X_ERRCODE_CPU_RAM_LOCK, + cpuErrorCode, + recoveryAction); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuPing(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType, + const uint32_t writeData, + uint32_t* const readData) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_Ping_t pingCmd; + adrv904x_CpuCmd_PingResp_t pingCmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, readData); + + ADI_LIBRARY_MEMSET(&pingCmd, 0, sizeof(adrv904x_CpuCmd_Ping_t)); + ADI_LIBRARY_MEMSET(&pingCmdRsp, 0, sizeof(adrv904x_CpuCmd_PingResp_t)); + + /* Setup ping-specific payload */ + pingCmd.echoData = ADRV904X_HTOCL(writeData); + + if ((cpuType == ADI_ADRV904X_CPU_TYPE_0) || + (cpuType == ADI_ADRV904X_CPU_TYPE_1)) + { + recoveryAction = adrv904x_CpuCmdSend(device, + cpuType, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_PING, + (void*)&pingCmd, + sizeof(pingCmd), + (void*)&pingCmdRsp, + sizeof(pingCmdRsp), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_RETURN(pingCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction); + } + } + /* Send command and receive response */ + else if (cpuType == ADI_ADRV904X_CPU_TYPE_DFE) + { + adrv904x_DfeSvcCmdStatus_t svcCmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_PING, + (void*)&pingCmd, + sizeof(pingCmd), + (void*)&pingCmdRsp, + sizeof(pingCmdRsp), + &svcCmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_RETURN(pingCmdRsp.status, svcCmdStatus, cpuErrorCode, recoveryAction); + } + + /* Send command for the DFE processor to ping the radio */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_RADIO_PING, + (void*)&pingCmd, + sizeof(pingCmd), + (void*)&pingCmdRsp, + sizeof(pingCmdRsp), + &svcCmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_RETURN(pingCmdRsp.status, svcCmdStatus, cpuErrorCode, recoveryAction); + } + } + + /* Extract ping-specific response */ + cpuErrorCode = (adrv904x_CpuErrorCode_e)ADRV904X_CTOHL((uint32_t)pingCmdRsp.status); + *readData = ADRV904X_CTOHL(pingCmdRsp.echoData); + + /* Handle ping-specific errors */ + if ((cpuErrorCode != ADRV904X_CPU_NO_ERROR) || (*readData != writeData)) + { + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_CPU, + ADI_ADRV904X_ERRCODE_CPU_PING, + ADI_NO_VARIABLE, + recoveryAction); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuEfuseGet(adi_adrv904x_Device_t* const device, + const uint32_t address, + uint32_t* const value) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_EfuseGet_t efuseCmd; + adrv904x_CpuCmd_EfuseGetResp_t efuseCmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, value); + + ADI_LIBRARY_MEMSET(&efuseCmd, 0, sizeof(adrv904x_CpuCmd_EfuseGet_t)); + ADI_LIBRARY_MEMSET(&efuseCmdRsp, 0, sizeof(adrv904x_CpuCmd_EfuseGetResp_t)); + + if (address >= 0x20U) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid EFUSE address (must be 0 - 0x1F)"); + return recoveryAction; + } + + /* Setup efuse-specific payload */ + efuseCmd.addr = ADRV904X_HTOCL(address); + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend(device, + ADI_ADRV904X_CPU_TYPE_0, /* assume CPU0 is the primary CPU */ + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_EFUSE_GET, + (void*)&efuseCmd, + sizeof(efuseCmd), + (void*)&efuseCmdRsp, + sizeof(efuseCmdRsp), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_RETURN(efuseCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction); + } + + /* Extract efuse-specific response */ + *value = ADRV904X_CTOHL(efuseCmdRsp.value); + + return recoveryAction; +} + +static const uint32_t LUT_CRC32[16] = { + 0x00000000u, + 0x04c11db7u, + 0x09823b6eu, + 0x0d4326d9u, + 0x130476dcu, + 0x17c56b6bu, + 0x1a864db2u, + 0x1e475005u, + 0x2608edb8u, + 0x22c9f00fu, + 0x2f8ad6d6u, + 0x2b4bcb61u, + 0x350c9b64u, + 0x31cd86d3u, + 0x3c8ea00au, + 0x384fbdbdu +}; + +ADI_API uint32_t adrv904x_Crc32ForChunk(const uint8_t buf[], + const uint32_t bufLen, + const uint32_t seedCrc, + const uint8_t finalCrc) +{ + uint32_t i; + uint32_t a, b, c, d; + + if (buf == NULL) + { + return 0; + } + + a = seedCrc; + + for (i = 0u; i < bufLen; i++) + { + b = (a >> 28u) & 0xfu; + c = LUT_CRC32[b]; + d = buf[i]; + a = (a << 4u) | (d >> 4u); + a = a ^ c; + b = (a >> 28u) & 0xfu; + c = LUT_CRC32[b]; + a = (a << 4u) | (d & 0xfu); + a = a ^ c; + } + + if (finalCrc > 0) + { + for (i = 0u; i < 4u; i++) + { + b = (a >> 28u) & 0xfu; + c = LUT_CRC32[b]; + a = (a << 4u); + a = a ^ c; + b = (a >> 28u) & 0xfu; + c = LUT_CRC32[b]; + a = (a << 4u); + a = a ^ c; + } + } + + return a; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_HealthMonitorPrivateCpuStatusGet( adi_adrv904x_Device_t* const device, + adrv904x_HealthMonitorPrivateCpuStatus_t* const healthMonitorStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, healthMonitorStatus); + + ADI_LIBRARY_MEMSET(healthMonitorStatus, 0, sizeof(adrv904x_HealthMonitorPrivateCpuStatus_t)); + + /* TODO: When Private CPU Health Monitoring becomes useful, populate return data appropriately */ + /* For now, simply return all zero data */ + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuGpioSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpioSelect, + const adrv904x_CpuCmd_GpioSignal_e cpuGpioSignal, + const uint8_t isInput) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_SetGpio_t setGpioCmd; + adrv904x_CpuCmd_SetGpioResp_t setGpioResp; + adrv904x_CpuCmd_GetGpio_t getGpioCmd; + adrv904x_CpuCmd_GetGpioResp_t getGpioResp; + uint32_t cpuTypeIdx = 0U; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adi_adrv904x_GpioSignal_e signal = ADI_ADRV904X_GPIO_SIGNAL_UNUSED; + + adi_adrv904x_GpioSignal_e outputSignals[ADI_ADRV904X_GPIO_COUNT] = { + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_0, + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_1, + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_2, + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_3, + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_4, + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_5, + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_6, + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_7, + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_8, + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_9, + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_10, + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_11, + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_12, + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_13, + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_14, + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_15, + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_16, + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_17, + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_18, + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_19, + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_20, + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_21, + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_22, + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_23 + }; + + adi_adrv904x_GpioSignal_e inputSignals[ADI_ADRV904X_GPIO_COUNT] = { + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_0, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_1, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_2, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_3, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_4, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_5, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_6, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_7, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_8, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_9, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_10, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_11, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_12, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_13, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_14, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_15, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_16, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_17, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_18, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_19, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_20, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_21, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_22, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_23 + }; + + /* Prepare the command payload */ + getGpioCmd.signal = (uint8_t)cpuGpioSignal; + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend(device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_GET_GPIO, + (void*)&getGpioCmd, + sizeof(getGpioCmd), + (void*)&getGpioResp, + sizeof(getGpioResp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_RETURN(getGpioResp.cmdStatus, cmdStatus, cpuErrorCode, recoveryAction); + } + + /* Release the pin assigned to same CPU signal */ + if (getGpioResp.pin != (uint8_t)ADI_ADRV904X_GPIO_INVALID) + { + if (isInput == ADI_TRUE) + { + signal = inputSignals[getGpioResp.pin]; + } + else + { + signal = outputSignals[getGpioResp.pin]; + } + + recoveryAction = adrv904x_GpioSignalRelease(device, (adi_adrv904x_GpioPinSel_e)getGpioResp.pin, signal, ADI_ADRV904X_CHOFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + getGpioResp.pin, + "GpioSignalRelease issue"); + return recoveryAction; + } + + /* Send GPIO set command to CPU to disable the pin */ + /* Fill out set gpio cmd params with user-provided params */ + setGpioCmd.signal = (uint8_t)cpuGpioSignal; + setGpioCmd.pin = (uint8_t)getGpioResp.pin; + setGpioCmd.polarity = (uint8_t)ADRV904X_CPU_CMD_GPIO_PIN_POLARITY_NORMAL; + setGpioCmd.enable = (uint8_t)ADRV904X_CPU_CMD_GPIO_PIN_DISABLE; + + /* For each CPU, send the SET_GPIO command, wait for a response, and process any errors. */ + for (cpuTypeIdx = 0U; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend(device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_GPIO, + (void*)&setGpioCmd, + sizeof(setGpioCmd), + (void*)&setGpioResp, + sizeof(setGpioResp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_RETURN(setGpioResp.cmdStatus, cmdStatus, cpuErrorCode, recoveryAction); + } + } + } + + /* Set if valid GPIO */ + if (gpioSelect != ADI_ADRV904X_GPIO_INVALID) + { + if (isInput == ADI_TRUE) + { + signal = inputSignals[gpioSelect]; + } + else + { + signal = outputSignals[gpioSelect]; + } + + /* Set the signal to the GPIO */ + recoveryAction = adrv904x_GpioSignalSet(device, gpioSelect, signal, ADI_ADRV904X_CHOFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while routing CPU signal to GPIO."); + return recoveryAction; + } + + /* Send GPIO set command to CPU to enable the pin */ + /* Fill out set gpio cmd params with user-provided params */ + setGpioCmd.signal = (uint8_t)cpuGpioSignal; + setGpioCmd.pin = (uint8_t)gpioSelect; + setGpioCmd.polarity = (uint8_t)ADRV904X_CPU_CMD_GPIO_PIN_POLARITY_NORMAL; + setGpioCmd.enable = (uint8_t)ADRV904X_CPU_CMD_GPIO_PIN_ENABLE; + + /* For each CPU, send the SET_GPIO command, wait for a response, and process any errors. */ + for (cpuTypeIdx = 0U; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend(device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_GPIO, + (void*)&setGpioCmd, + sizeof(setGpioCmd), + (void*)&setGpioResp, + sizeof(setGpioResp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_RETURN(setGpioResp.cmdStatus, cmdStatus, cpuErrorCode, recoveryAction); + } + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CpuGpioGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_GpioPinSel_e * const gpioSelect, + const adrv904x_CpuCmd_GpioSignal_e cpuGpioSignal) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_GetGpio_t getGpioCmd; + adrv904x_CpuCmd_GetGpioResp_t getGpioResp; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + + /* Prepare the command payload */ + getGpioCmd.signal = (uint8_t)cpuGpioSignal; + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend(device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_GET_GPIO, + (void*)&getGpioCmd, + sizeof(getGpioCmd), + (void*)&getGpioResp, + sizeof(getGpioResp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_RETURN(getGpioResp.cmdStatus, cmdStatus, cpuErrorCode, recoveryAction); + } + + *gpioSelect = (adi_adrv904x_GpioPinSel_e)getGpioResp.pin; + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_EccEnableGet(adi_adrv904x_Device_t* const device, + uint8_t* const eccEnable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cmdErrorCode = ADRV904X_CPU_NO_ERROR; + + adi_adrv904x_CpuGetEccScrubEnableCmdResp_t eccEnableGetRsp; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(eccEnable); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_LIBRARY_MEMSET(&eccEnableGetRsp, 0, sizeof(adi_adrv904x_CpuGetEccScrubEnableCmdResp_t)); + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend(device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_GET_ENABLE_ECC_SCRUB, + 0U, + 0U, + (void*)&eccEnableGetRsp, + sizeof(eccEnableGetRsp), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + /* If the command failed for a command-specific reason, extract the command status code and log the error. */ + cmdErrorCode = (adrv904x_CpuErrorCode_e)ADRV904X_CTOHL(eccEnableGetRsp.status); + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + cmdErrorCode, + "ECC Enable Get command failed, CPU0"); + + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO((adrv904x_CpuErrorCode_e)(eccEnableGetRsp.status), cmdStatus, cmdErrorCode, recoveryAction, cleanup); + } + else + { + *eccEnable = eccEnableGetRsp.eccScrubEnable; + + /* reset for the next get */ + ADI_LIBRARY_MEMSET(&eccEnableGetRsp, 0, sizeof(adi_adrv904x_CpuGetEccScrubEnableCmdResp_t)); + recoveryAction = adrv904x_CpuCmdSend(device, + ADI_ADRV904X_CPU_TYPE_1, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_GET_ENABLE_ECC_SCRUB, + 0U, + 0U, + (void*)&eccEnableGetRsp, + sizeof(eccEnableGetRsp), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + /* If the command failed for a command-specific reason, extract the command status code and log the error. */ + cmdErrorCode = (adrv904x_CpuErrorCode_e)ADRV904X_CTOHL(eccEnableGetRsp.status); + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + cmdErrorCode, + "ECC Enable Get command failed, CPU1"); + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO((adrv904x_CpuErrorCode_e)(eccEnableGetRsp.status), cmdStatus, cmdErrorCode, recoveryAction, cleanup); + } + else + { + if (eccEnableGetRsp.eccScrubEnable > 0) + { + *eccEnable |= 1u; + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_EccEnableSet(adi_adrv904x_Device_t* const device, + uint8_t const eccEnable) +{ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cmdErrorCode = ADRV904X_CPU_NO_ERROR; + adi_adrv904x_CpuSetEccScrubEnableCmd_t eccEnableSet; + adi_adrv904x_CpuSetEccScrubEnableCmdResp_t eccEnableSetRsp; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_LIBRARY_MEMSET(&eccEnableSetRsp, 0, sizeof(adi_adrv904x_CpuSetEccScrubEnableCmdResp_t)); + + eccEnableSet.eccScrubEnable = (uint8_t)(eccEnable); + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend(device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_ENABLE_ECC_SCRUB, + (void*)&eccEnableSet, + sizeof(eccEnableSet), + (void*)&eccEnableSetRsp, + sizeof(eccEnableSetRsp), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + /* If the command failed for a command-specific reason, extract the command status code and log the error. */ + cmdErrorCode = (adrv904x_CpuErrorCode_e)ADRV904X_CTOHL(eccEnableSetRsp.status); + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + cmdErrorCode, + "ECC Enable Set command failed, CPU0"); + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO((adrv904x_CpuErrorCode_e)(eccEnableSetRsp.status), cmdStatus, cmdErrorCode, recoveryAction, cleanup); + + } + else + { + /* reset for the next set */ + ADI_LIBRARY_MEMSET(&eccEnableSetRsp, 0, sizeof(adi_adrv904x_CpuSetEccScrubEnableCmdResp_t)); + recoveryAction = adrv904x_CpuCmdSend(device, + ADI_ADRV904X_CPU_TYPE_1, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_ENABLE_ECC_SCRUB, + (void*)&eccEnableSet, + sizeof(eccEnableSet), + (void*)&eccEnableSetRsp, + sizeof(eccEnableSetRsp), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + /* If the command failed for a command-specific reason, extract the command status code and log the error. */ + cmdErrorCode = (adrv904x_CpuErrorCode_e)ADRV904X_CTOHL(eccEnableSetRsp.status); + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + cmdErrorCode, + "ECC Enable Set command failed, CPU1"); + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO((adrv904x_CpuErrorCode_e)(eccEnableSetRsp.status), cmdStatus, cmdErrorCode, recoveryAction, cleanup); + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API void adrv904x_CpuErrorDebugCheck(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t cpuException = 0U; + uint32_t errAddress = 0U; + adrv904x_CpuErrors_t cpu0Status = { ADRV904X_CPU_NO_ERROR, ADRV904X_CPU_NO_ERROR, ADRV904X_CPU_NO_ERROR }; + adrv904x_CpuErrors_t cpu1Status = { ADRV904X_CPU_NO_ERROR, ADRV904X_CPU_NO_ERROR, ADRV904X_CPU_NO_ERROR }; + + if (device == NULL) + { + return; + } + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + if ((device->devStateInfo.devState & ADI_ADRV904X_STATE_ALLCPUSLOADED) == ADI_ADRV904X_STATE_ALLCPUSLOADED) + { + recoveryAction = adi_adrv904x_CpuCheckException(device, &cpuException); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Radio CPU Exception Check Issue"); + /* Continue Debug */ + } + + if (cpuException != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_DEVICE; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuException, "Radio CPU Exception Detected"); + /* Continue Debug */ + } + } + + /* Get CPU 0 Runtime Status */ + if (ADI_ADRV904X_ERR_ACT_NONE == adi_adrv904x_Register32Read( device, + NULL, + ADRV904X_CPU_0_PM_ERROR_STATUS, + &errAddress, + 0xFFFFFFFFU)) + { + (void) adi_adrv904x_Registers32Read(device, + NULL, + errAddress, + (uint32_t*) &cpu0Status, + NULL, + (uint32_t) (sizeof(adrv904x_CpuErrors_t) / (sizeof(uint32_t)))); + } + + /* Get CPU 1 Runtime Status */ + if (ADI_ADRV904X_ERR_ACT_NONE == adi_adrv904x_Register32Read( device, + NULL, + ADRV904X_CPU_1_PM_ERROR_STATUS, + &errAddress, + 0xFFFFFFFFU)) + { + (void) adi_adrv904x_Registers32Read(device, + NULL, + errAddress, + (uint32_t*) &cpu1Status, + NULL, + (uint32_t) (sizeof(adrv904x_CpuErrors_t) / (sizeof(uint32_t)))); + } + + if (cpu0Status.system != ADRV904X_CPU_NO_ERROR) + { + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_CPU_RUNTIME, + cpu0Status.system, + cpu0Status.system, + recoveryAction); + } + + + if (cpu1Status.system != ADRV904X_CPU_NO_ERROR) + { + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_CPU_RUNTIME, + cpu1Status.system, + cpu1Status.system, + recoveryAction); + } + + (void) recoveryAction; +} diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_datainterface.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_datainterface.c new file mode 100644 index 00000000000..b31dcdf9d2f --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_datainterface.c @@ -0,0 +1,1413 @@ +/** + * Copyright 2015 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adrv904x_data_interface.c + * + * ADRV904X API Version: 2.10.0.4 + */ + +#include "../../private/include/adrv904x_datainterface.h" + + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_DATAINTERFACE + +#include "adi_adrv904x_user.h" +#include "adi_adrv904x_hal.h" +#include "../../private/bf/adrv904x_bf_core.h" +#include "../../private/include/adrv904x_init.h" + +#include "../../private/include/adrv904x_reg_addr_macros.h" +#include "adi_adrv904x_types.h" +#include "adi_common_macros.h" +#include "adi_common_types.h" +#include "adi_adrv904x_error.h" +#include "../../private/include/adrv904x_init.h" +#include "../../private/bf/adrv904x_bf_tx_dig_types.h" +#include "../../private/bf/adrv904x_bf_tx_dig.h" +#include "../../private/bf/adrv904x_bf_orx_dig.h" + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxOrxDataCaptureConfigAddressGet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e channelSelect, + uint32_t* const address) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_RETURN(address) + + /* select the ram base address based on the channel select value */ + switch (channelSelect) + { + case ADI_ADRV904X_RXOFF: + /* invalid capture location request */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelSelect, "Invalid channel selected for capture or readback"); + break; + case ADI_ADRV904X_RX0: + *address = ADRV904X_ADDR_TX0_CPT_CONFIG; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + case ADI_ADRV904X_RX1: + *address = ADRV904X_ADDR_TX1_CPT_CONFIG; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + case ADI_ADRV904X_RX2: + *address = ADRV904X_ADDR_TX2_CPT_CONFIG; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + case ADI_ADRV904X_RX3: + *address = ADRV904X_ADDR_TX3_CPT_CONFIG; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + case ADI_ADRV904X_RX4: + *address = ADRV904X_ADDR_TX4_CPT_CONFIG; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + case ADI_ADRV904X_RX5: + *address = ADRV904X_ADDR_TX5_CPT_CONFIG; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + case ADI_ADRV904X_RX6: + *address = ADRV904X_ADDR_TX6_CPT_CONFIG; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + case ADI_ADRV904X_RX7: + *address = ADRV904X_ADDR_TX7_CPT_CONFIG; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + case ADI_ADRV904X_ORX0: + *address = ADRV904X_ADDR_ORX0_CPT_CONFIG; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + case ADI_ADRV904X_ORX1: + *address = ADRV904X_ADDR_ORX1_CPT_CONFIG; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + default: + /* invalid capture location request */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelSelect, "Invalid channel selected for capture or readback"); + break; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxOrxDataCaptureRead(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e channelSelect, + uint32_t ramData[], + const uint32_t wordCount, + const adi_adrv904x_RxOrxDataCaptureLocation_e loc) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t baseAddress = 0U; + uint32_t cptCfgAddr = 0U; + const uint32_t BASE_ADDRESS_MASK = 0xFFF00000U; + uint32_t wordOffset = 0x8000U; + uint32_t ramDataIndex = 0U; + uint32_t bankSize = wordCount >> 1; + static const uint8_t BYTE_ORIENTED_DATA = 1u; + + (void)loc; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_RETURN(ramData); + + /* select the ram base address based on the channel select value */ + recoveryAction = adrv904x_RxOrxDataCaptureConfigAddressGet(device, channelSelect, &cptCfgAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading from the capture memory"); + return recoveryAction; + } + baseAddress = cptCfgAddr & BASE_ADDRESS_MASK; /* Capture memory is located at the base address of the slice */ + + /* read memory */ + if (channelSelect == ADI_ADRV904X_ORX0 || + channelSelect == ADI_ADRV904X_ORX1) /* reading from ORx capture ram 3 banks 4k each */ + { + wordOffset = 0x4000; + /* read from bank 0 */ + recoveryAction = adrv904x_Registers32bOnlyRead_vEndian(device, + NULL, + baseAddress, + (uint8_t*)(&ramData[0U]), + wordCount * 4U, + BYTE_ORIENTED_DATA); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading from the capture memory"); + return recoveryAction; + } + + if (wordCount > ADI_ADRV904X_CAPTURE_SIZE_4K) /* read from bank 1 */ + { + recoveryAction = adrv904x_Registers32bOnlyRead_vEndian(device, + NULL, + baseAddress + wordOffset, + (uint8_t*)(&ramData[ADI_ADRV904X_CAPTURE_SIZE_4K]), + ADI_ADRV904X_CAPTURE_SIZE_4K * 4U, + BYTE_ORIENTED_DATA); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading from the capture memory"); + return recoveryAction; + } + } + if (wordCount > ADI_ADRV904X_CAPTURE_SIZE_8K) /* read from bank 2 */ + { + recoveryAction = adrv904x_Registers32bOnlyRead_vEndian(device, + NULL, + baseAddress + wordOffset * 2U, + (uint8_t*)(&ramData[ADI_ADRV904X_CAPTURE_SIZE_8K]), + ADI_ADRV904X_CAPTURE_SIZE_4K * 4U, + BYTE_ORIENTED_DATA); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading from the capture memory"); + return recoveryAction; + } + } + } + else /* reading from dpd capture memory 2 banks 8k each */ + { + /* read bank 0 memory */ + recoveryAction = adrv904x_Registers32bOnlyRead_vEndian(device, NULL, baseAddress, (uint8_t*)(&ramData[ramDataIndex]), bankSize * 4U, BYTE_ORIENTED_DATA); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading from the capture memory"); + return recoveryAction; + } + + /* read bank 1 memory */ + ramDataIndex += bankSize; + recoveryAction = adrv904x_Registers32bOnlyRead_vEndian(device, NULL, baseAddress + wordOffset, (uint8_t*)(&ramData[ramDataIndex]), bankSize * 4U, BYTE_ORIENTED_DATA); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading from the capture memory"); + return recoveryAction; + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxOrxDataCaptureConfigSet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxOrxDataCaptureLocation_e captureLocation, + const uint32_t size, + uint32_t* const config) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t sizeMask = 0U; + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_RETURN(config); + switch (size) + { + case ADI_ADRV904X_CAPTURE_SIZE_16K: + sizeMask = ADI_ADRV904X_CAPTURE_SIZE_MASK_16K; + break; + case ADI_ADRV904X_CAPTURE_SIZE_12K: + sizeMask = ADI_ADRV904X_CAPTURE_SIZE_MASK_12K; + break; + case ADI_ADRV904X_CAPTURE_SIZE_8K: + sizeMask = ADI_ADRV904X_CAPTURE_SIZE_MASK_8K; + break; + case ADI_ADRV904X_CAPTURE_SIZE_4K: + sizeMask = ADI_ADRV904X_CAPTURE_SIZE_MASK_4K; + break; + case ADI_ADRV904X_CAPTURE_SIZE_2K: + sizeMask = ADI_ADRV904X_CAPTURE_SIZE_MASK_2K; + break; + case ADI_ADRV904X_CAPTURE_SIZE_1K: + sizeMask = ADI_ADRV904X_CAPTURE_SIZE_MASK_1K; + break; + case ADI_ADRV904X_CAPTURE_SIZE_512: + sizeMask = ADI_ADRV904X_CAPTURE_SIZE_MASK_512; + break; + case ADI_ADRV904X_CAPTURE_SIZE_256: + sizeMask = ADI_ADRV904X_CAPTURE_SIZE_MASK_256; + break; + case ADI_ADRV904X_CAPTURE_SIZE_128: + sizeMask = ADI_ADRV904X_CAPTURE_SIZE_MASK_128; + break; + case ADI_ADRV904X_CAPTURE_SIZE_64: + sizeMask = ADI_ADRV904X_CAPTURE_SIZE_MASK_64; + break; + case ADI_ADRV904X_CAPTURE_SIZE_32: + sizeMask = ADI_ADRV904X_CAPTURE_SIZE_MASK_32; + break; + default: + sizeMask = ADI_ADRV904X_CAPTURE_SIZE_MASK_12K; + break; + } + /* set the base configuration and capture size to max samples; + * no size mask is applied for ORx config because the default is the max 12k */ + switch (captureLocation) + { + case ADI_ADRV904X_CAPTURE_LOC_DDC0: + *config = ADI_ADRV904X_CAPTURE_LOC_DDC0_BASE_CONFIG | sizeMask; /* Rx channel DDC0 */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + case ADI_ADRV904X_CAPTURE_LOC_DDC1: + *config = ADI_ADRV904X_CAPTURE_LOC_DDC1_BASE_CONFIG | sizeMask; /* Rx channel DDC1 */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + case ADI_ADRV904X_CAPTURE_LOC_DATAPATH: + *config = ADI_ADRV904X_CAPTURE_LOC_FORMATTER_BASE_CONFIG; /* ORx data path */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + case ADI_ADRV904X_CAPTURE_LOC_DPD: + *config = ADI_ADRV904X_CAPTURE_LOC_DPD_BASE_CONFIG | sizeMask; /* DPD */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + case ADI_ADRV904X_CAPTURE_LOC_DPD_PRE : + *config = ADI_ADRV904X_CAPTURE_LOC_DPD_PRE_BASE_CONFIG | sizeMask; /* DPD pre actuator */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + case ADI_ADRV904X_CAPTURE_LOC_DPD_POST : + *config = ADI_ADRV904X_CAPTURE_LOC_DPD_POST_BASE_CONFIG | sizeMask; /* DPD post actuator */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + case ADI_ADRV904X_CAPTURE_LOC_FSC : + /* TODO: Not yet supported */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + break; + case ADI_ADRV904X_CAPTURE_LOC_ORX_TX0 : + *config = ADI_ADRV904X_CAPTURE_LOC_ORX_TX0_BASE_CONFIG | sizeMask; /* ORx capture synchronized with Tx 0 */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + case ADI_ADRV904X_CAPTURE_LOC_ORX_TX1 : + *config = ADI_ADRV904X_CAPTURE_LOC_ORX_TX1_BASE_CONFIG | sizeMask; /* ORx capture synchronized with Tx 1 */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + case ADI_ADRV904X_CAPTURE_LOC_ORX_TX2 : + *config = ADI_ADRV904X_CAPTURE_LOC_ORX_TX2_BASE_CONFIG | sizeMask; /* ORx capture synchronized with Tx 2 */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + case ADI_ADRV904X_CAPTURE_LOC_ORX_TX3 : + *config = ADI_ADRV904X_CAPTURE_LOC_ORX_TX3_BASE_CONFIG | sizeMask; /* ORx capture synchronized with Tx 3 */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + case ADI_ADRV904X_CAPTURE_LOC_ORX_TX4 : + *config = ADI_ADRV904X_CAPTURE_LOC_ORX_TX4_BASE_CONFIG | sizeMask; /* ORx capture synchronized with Tx 4 */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + case ADI_ADRV904X_CAPTURE_LOC_ORX_TX5 : + *config = ADI_ADRV904X_CAPTURE_LOC_ORX_TX5_BASE_CONFIG | sizeMask; /* ORx capture synchronized with Tx 5 */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + case ADI_ADRV904X_CAPTURE_LOC_ORX_TX6 : + *config = ADI_ADRV904X_CAPTURE_LOC_ORX_TX6_BASE_CONFIG | sizeMask; /* ORx capture synchronized with Tx 6 */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + case ADI_ADRV904X_CAPTURE_LOC_ORX_TX7 : + *config = ADI_ADRV904X_CAPTURE_LOC_ORX_TX7_BASE_CONFIG | sizeMask; /* ORx capture synchronized with Tx 7 */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + default: + /* invalid capture location requested */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + break; + } + + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error configuring the capture location. An invalid capture location was written"); + return recoveryAction; + } + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxOrxDataCaptureStreamDebugPoll(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e channelSelect, + uint32_t* const bStreamDbgFlag) + +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const uint32_t READBACK_MASK = 0xFFFFFFFFU; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_RETURN(bStreamDbgFlag); + + switch (channelSelect) + { + case ADI_ADRV904X_ORX0: + recoveryAction = adi_adrv904x_Register32Read(device, NULL, ADRV904X_ADDR_ORX0_STREAM_SCRATCH1, bStreamDbgFlag, READBACK_MASK); + break; + case ADI_ADRV904X_ORX1: + recoveryAction = adi_adrv904x_Register32Read(device, NULL, ADRV904X_ADDR_ORX1_STREAM_SCRATCH1, bStreamDbgFlag, READBACK_MASK); + break; + case ADI_ADRV904X_RX0: + recoveryAction = adi_adrv904x_Register32Read(device, NULL, ADRV904X_ADDR_RX0_STREAM_SCRATCH1, bStreamDbgFlag, READBACK_MASK); + break; + case ADI_ADRV904X_RX1: + recoveryAction = adi_adrv904x_Register32Read(device, NULL, ADRV904X_ADDR_RX1_STREAM_SCRATCH1, bStreamDbgFlag, READBACK_MASK); + break; + case ADI_ADRV904X_RX2: + recoveryAction = adi_adrv904x_Register32Read(device, NULL, ADRV904X_ADDR_RX2_STREAM_SCRATCH1, bStreamDbgFlag, READBACK_MASK); + break; + case ADI_ADRV904X_RX3: + recoveryAction = adi_adrv904x_Register32Read(device, NULL, ADRV904X_ADDR_RX3_STREAM_SCRATCH1, bStreamDbgFlag, READBACK_MASK); + break; + case ADI_ADRV904X_RX4: + recoveryAction = adi_adrv904x_Register32Read(device, NULL, ADRV904X_ADDR_RX4_STREAM_SCRATCH1, bStreamDbgFlag, READBACK_MASK); + break; + case ADI_ADRV904X_RX5: + recoveryAction = adi_adrv904x_Register32Read(device, NULL, ADRV904X_ADDR_RX5_STREAM_SCRATCH1, bStreamDbgFlag, READBACK_MASK); + break; + case ADI_ADRV904X_RX6: + recoveryAction = adi_adrv904x_Register32Read(device, NULL, ADRV904X_ADDR_RX6_STREAM_SCRATCH1, bStreamDbgFlag, READBACK_MASK); + break; + case ADI_ADRV904X_RX7: + recoveryAction = adi_adrv904x_Register32Read(device, NULL, ADRV904X_ADDR_RX7_STREAM_SCRATCH1, bStreamDbgFlag, READBACK_MASK); + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_FramerBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerIdx, + adrv904x_BfJtxLinkChanAddr_e* const framerBitfieldAddr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, framerBitfieldAddr); + + switch (framerIdx) + { + case ADI_ADRV904X_FRAMER_0: + *framerBitfieldAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_; + break; + + case ADI_ADRV904X_FRAMER_1: + *framerBitfieldAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_; + break; + + case ADI_ADRV904X_FRAMER_2: + *framerBitfieldAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_; + break; + + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + framerIdx, + "Invalid Framer selection parameter "); + return recoveryAction; + } + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_DeframerBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerIdx, + adrv904x_BfJrxLinkChanAddr_e* const deframerBitfieldAddr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, deframerBitfieldAddr); + + switch (deframerIdx) + { + case ADI_ADRV904X_DEFRAMER_0: + *deframerBitfieldAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + break; + + case ADI_ADRV904X_DEFRAMER_1: + *deframerBitfieldAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_; + break; + + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + deframerIdx, + "Invalid Deframer selection parameter "); + return recoveryAction; + } + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_FramerLaneSerdesPhyBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const uint8_t laneIdx, + adrv904x_BfSerdesTxdigPhyRegmapCore1p2ChanAddr_e* const laneSerdesPhyBitfieldAddr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, laneSerdesPhyBitfieldAddr); + + switch (laneIdx) + { + case 0: + *laneSerdesPhyBitfieldAddr = ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_0_; + break; + + case 1: + *laneSerdesPhyBitfieldAddr = ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_1_; + break; + + case 2: + *laneSerdesPhyBitfieldAddr = ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_2_; + break; + + case 3: + *laneSerdesPhyBitfieldAddr = ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_3_; + break; + + case 4: + *laneSerdesPhyBitfieldAddr = ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_4_; + break; + + case 5: + *laneSerdesPhyBitfieldAddr = ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_5_; + break; + + case 6: + *laneSerdesPhyBitfieldAddr = ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_6_; + break; + + case 7: + *laneSerdesPhyBitfieldAddr = ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_7_; + break; + + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + laneIdx, + "Invalid Lane selection parameter "); + return recoveryAction; + } + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_FramerLaneSerdesPowerSet(adi_adrv904x_Device_t* const device, + const uint8_t framerSelMask, + const uint8_t powerAct) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJtxLinkChanAddr_e framerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_; + adrv904x_BfSerdesTxdigPhyRegmapCore1p2ChanAddr_e laneSerdesPhyBitfieldAddr = ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_0_; + uint8_t laneIdx = 0U; + uint8_t lanePd = 0U; + uint8_t laneBit = 0U; + uint8_t serdesNeedPowerDownBySelectedFramers = 0U; + uint8_t serdesUsedByUnselectedFramers = 0U; + uint8_t serdesPowerDownSet = 0U; + uint8_t framerIdx = 0U; + uint8_t framerSel = 0U; + const uint8_t PHY_POWER_DOWN = 0x01; + const uint8_t PHY_POWER_UP = 0x00; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Prepare for framers enabling case */ + if (powerAct) + { + for (framerIdx = 0; framerIdx < ADI_ADRV904X_MAX_FRAMERS; framerIdx++) + { + framerSel = 1U << framerIdx; + + /* Skip unselected framer */ + if ((framerSel & framerSelMask) == 0) + { + continue; + } + + /* Get the base address of the selected framer */ + recoveryAction = adrv904x_FramerBitfieldAddressGet(device, + (adi_adrv904x_FramerSel_e) framerSel, + &framerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected framer"); + return recoveryAction; + } + + /* Get the lane crossbar selection */ + for (laneIdx = 0U; laneIdx < ADI_ADRV904X_MAX_SERDES_LANES; ++laneIdx) + { + recoveryAction = adrv904x_JtxLink_JtxForceLanePd_BfGet(device, + NULL, + framerBaseAddr, + laneIdx, + &lanePd); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lane crossbar selection for the selected lane"); + return recoveryAction; + } + + + if (lanePd == 0U) /* LanePd is not set, so power it up */ + { + recoveryAction = (adi_adrv904x_ErrAction_e) adrv904x_FramerLaneSerdesPhyBitfieldAddressGet(device, + laneIdx, + &laneSerdesPhyBitfieldAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lane serdes PHY address."); + return recoveryAction; + } + + recoveryAction = adrv904x_SerdesTxdigPhyRegmapCore1p2_PdSer_BfSet(device, + NULL, + laneSerdesPhyBitfieldAddr, + PHY_POWER_UP); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to power up lane serdes PHY."); + return recoveryAction; + } + } + } + } + + /* The power up was done above */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; + } + + /* Prepare for framers disabling case */ + for (framerIdx = 0; framerIdx < ADI_ADRV904X_MAX_FRAMERS; framerIdx++) + { + framerSel = 1U << framerIdx; + + /* Get the base address of the selected framer */ + recoveryAction = adrv904x_FramerBitfieldAddressGet(device, + (adi_adrv904x_FramerSel_e) framerSel, + &framerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected framer"); + return recoveryAction; + } + + /* Get the lane crossbar selection */ + for (laneIdx = 0U; laneIdx < ADI_ADRV904X_MAX_SERDES_LANES; ++laneIdx) + { + laneBit = 1U << laneIdx; + recoveryAction = adrv904x_JtxLink_JtxForceLanePd_BfGet(device, + NULL, + framerBaseAddr, + laneIdx, + &lanePd); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lane crossbar selection for the selected lane"); + return recoveryAction; + } + + + if (lanePd) /* LanePd is set, so it can be powered it down if it is not shared */ + { + if (framerSel & framerSelMask) + { + serdesNeedPowerDownBySelectedFramers |= laneBit; /* aggregate all lane serdes that need power down by selected framers */ + } + else + { + serdesUsedByUnselectedFramers |= laneBit; /* aggregate all lane serdes being used by unselected framers */ + } + } + } + } + + /* Exclude serdes that being used by unselected frames */ + serdesPowerDownSet = serdesNeedPowerDownBySelectedFramers & ~serdesUsedByUnselectedFramers; + + + /* Power down the serdes PHY based on serdesPowerDownSet */ + for (laneIdx = 0U; laneIdx < ADI_ADRV904X_MAX_SERDES_LANES; ++laneIdx) + { + laneBit = 1 << laneIdx; + if (laneBit & serdesPowerDownSet) + { + recoveryAction = (adi_adrv904x_ErrAction_e) adrv904x_FramerLaneSerdesPhyBitfieldAddressGet(device, + laneIdx, + &laneSerdesPhyBitfieldAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lane serdes PHY address."); + return recoveryAction; + } + + recoveryAction = adrv904x_SerdesTxdigPhyRegmapCore1p2_PdSer_BfSet(device, + NULL, + laneSerdesPhyBitfieldAddr, + PHY_POWER_DOWN); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to change power down serdes PHY."); + return recoveryAction; + } + } + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_DeframerLaneSerdesPowerSet(adi_adrv904x_Device_t* const device, + const uint8_t deframerSelMask, + const uint8_t powerAct) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + uint8_t deframerSel = 0U; + uint8_t deframerIdx = 0U; + uint8_t serdesNeedPowerDownBySelectedDeframers = 0U; + uint8_t serdesUsedByUnselectedDeframers = 0U; + uint8_t serdesPowerDownSet = 0U; + uint8_t laneIdx = 0U; + uint8_t laneBit = 0U; + uint8_t dataByte = 0U; + uint8_t pLane = 0U; + uint8_t j = 0U; + uint8_t deserPhyPowerBit = 0U; + uint8_t numberofLaneL = 0U; + uint8_t deserPhyPowerSetMask = 0x0FU; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Prepare for framers enabling case */ + if (powerAct) + { + for (deframerIdx = 0U; deframerIdx < ADI_ADRV904X_MAX_DEFRAMERS; deframerIdx++) + { + deframerSel = 1U << deframerIdx; + /* Skip unselected deframer */ + if ((deframerSel & deframerSelMask) == 0U) + { + continue; + } + + /* Get the base address of the selected deframer */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, + (adi_adrv904x_DeframerSel_e) deframerSel, + &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected deframer"); + return recoveryAction; + } + + recoveryAction = adrv904x_JrxLink_JrxCoreLCfg_BfGet(device, + NULL, + deframerBaseAddr, + &numberofLaneL); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of lane"); + return recoveryAction; + } + + /* Read the current deserializer power status for all lanes*/ + recoveryAction = adrv904x_SerdesRxdig8packRegmapCore1p2_RxdesPdCh_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_DESERIALIZER_DESER_PHY_TOP_8PACK, + &deserPhyPowerSetMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading deserializer Phy power status"); + return recoveryAction; + } + + /* Get the lane crossbar selection */ + for (laneIdx = 0U; laneIdx < ADI_ADRV904X_MAX_SERDES_LANES; ++laneIdx) + { + for (j = 0U; j < numberofLaneL; j++) + { + recoveryAction = adrv904x_JrxLink_JrxCoreLaneSel_BfGet(device, + NULL, + deframerBaseAddr, + j, + &dataByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading Jrx Core Lane Sel field"); + return recoveryAction; + } + + if (dataByte == laneIdx) + { + deserPhyPowerBit |= 1U << laneIdx; + break; + } + } + } + } + + /* Exclude serdes that being used by unselected frames */ + deserPhyPowerSetMask &= ~deserPhyPowerBit; /* Clear the corresponding bit to power up */ + recoveryAction = adrv904x_SerdesRxdig8packRegmapCore1p2_RxdesPdCh_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_DESERIALIZER_DESER_PHY_TOP_8PACK, + deserPhyPowerSetMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to change lane deserdes PHY power."); + return recoveryAction; + } + + /* The power up was done above */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; + } + + /* Prepare for deframers disabling case */ + for (deframerIdx = 0U; deframerIdx < ADI_ADRV904X_MAX_DEFRAMERS; deframerIdx++) + { + deframerSel = 1U << deframerIdx; + + /* Get the base address of the selected deframer */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, + (adi_adrv904x_DeframerSel_e) deframerSel, + &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected deframer"); + return recoveryAction; + } + + /* Get the number of logical lanes */ + recoveryAction = adrv904x_JrxLink_JrxCoreLCfg_BfGet(device, + NULL, + deframerBaseAddr, + &numberofLaneL); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of lane"); + return recoveryAction; + } + + /* Get the lane crossbar selection */ + for (laneIdx = 0U; laneIdx < ADI_ADRV904X_MAX_SERDES_LANES; ++laneIdx) + { + laneBit = 1U << laneIdx; + pLane = 0U; + for (j = 0U; j < numberofLaneL; j++) + { + recoveryAction = adrv904x_JrxLink_JrxCoreLaneSel_BfGet(device, + NULL, + deframerBaseAddr, + j, + &dataByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading Jrx Core Lane Sel field"); + return recoveryAction; + } + + if (dataByte == laneIdx) + { + pLane = 1U; + break; + } + } + + if (pLane == 1U) + { + if (deframerSel & deframerSelMask) + { + serdesNeedPowerDownBySelectedDeframers |= laneBit; /* aggregate all lane serdes that need power down by selected deframers */ + } + else + { + serdesUsedByUnselectedDeframers |= laneBit; /* aggregate all lane serdes being used by unselected deframers */ + } + } + } + } + + /* Read the current deserializer power status for all lanes*/ + recoveryAction = adrv904x_SerdesRxdig8packRegmapCore1p2_RxdesPdCh_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_DESERIALIZER_DESER_PHY_TOP_8PACK, + &deserPhyPowerSetMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading deserializer Phy power status"); + return recoveryAction; + } + + /* Exclude serdes that being used by unselected frames */ + serdesPowerDownSet = serdesNeedPowerDownBySelectedDeframers & ~serdesUsedByUnselectedDeframers; + + /* Prepare for serdes power bit mask.*/ + deserPhyPowerSetMask &= ~serdesPowerDownSet; /* Clear the corresponding bit to power up */ + + recoveryAction = adrv904x_SerdesRxdig8packRegmapCore1p2_RxdesPdCh_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_DESERIALIZER_DESER_PHY_TOP_8PACK, + deserPhyPowerSetMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to power down lane deserdes PHY."); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_FramerLaneEnableGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + adi_adrv904x_FramerCfg_t* const framerCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJtxLinkChanAddr_e framerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_; + uint8_t dataByte = 0U; + uint8_t laneId = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, framerCfg); + + /* Get the base address of the selected framer */ + recoveryAction = adrv904x_FramerBitfieldAddressGet(device, framerSel, &framerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected framer"); + return recoveryAction; + } + + /* Get the lane crossbar selection */ + framerCfg->serializerLanesEnabled = 0; + for (laneId = 0U; laneId < ADI_ADRV904X_MAX_SERDES_LANES; ++laneId) + { + recoveryAction = adrv904x_JtxLink_JtxLaneSel_BfGet(device, + NULL, + framerBaseAddr, + laneId, + &dataByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lane crossbar selection for the selected framer"); + return recoveryAction; + } + + framerCfg->serializerLanePdCrossbar.laneFramerOutSel[laneId] = 0x08U; /* assigned to out of range value */ + if (dataByte < 0x1FU) + { + framerCfg->serializerLanesEnabled |= (0x1U << laneId); + /* Get the physical lane in use based on link and crossbar configuration */ + framerCfg->serializerLanePdCrossbar.laneFramerOutSel[laneId] = dataByte; + } + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_DeframerLaneEnableGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + adi_adrv904x_DeframerCfg_t* const deframerCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + uint8_t dataByte = 0U; + uint8_t laneId = 0U; + uint8_t cfgLvalue = 0U; + uint8_t cfgM = 0U; + uint8_t cfgK = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, deframerCfg); + + /* Initialization */ + deframerCfg->deserializerLanesEnabled = 0U; + for (laneId = 0U; laneId < ADI_ADRV904X_MAX_SERDES_LANES; ++laneId) + { + deframerCfg->deserializerLaneCrossbar.deframerInputLaneSel[laneId] = 0x08U; /* assigned to out of range value */ + } + + /* Get the base address of the selected framer */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, deframerSel, &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected deframer"); + return recoveryAction; + } + + /* Get deframer L value */ + recoveryAction = adrv904x_JrxLink_JrxCoreLCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgLvalue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG L cfg for the selected deframer"); + return recoveryAction; + } + + /* Check if deframer link has lane configured or not */ + if (cfgLvalue == 0U) + { + /* get M - Number of converters per device */ + recoveryAction = adrv904x_JrxLink_JrxCoreMCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgM); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of converters per device"); + return recoveryAction; + } + + /* get K - Number of frames in extended multiblock */ + recoveryAction = adrv904x_JrxLink_JrxCoreKCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of frames in extended multiblock"); + return recoveryAction; + } + + if ((cfgM == 0U) && (cfgK == 0U)) + { + /* Link has no lane configured */ + return recoveryAction; + } + /* Link has 1 lane */ + } + + /* Get the lane crossbar selection */ + for (laneId = 0U; laneId < ADI_ADRV904X_MAX_SERDES_LANES; ++laneId) + { + recoveryAction = adrv904x_JrxLink_JrxCoreLaneSel_BfGet(device, + NULL, + deframerBaseAddr, + laneId, + &dataByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lane crossbar selection"); + return recoveryAction; + } + + if (laneId <= cfgLvalue) + { + if (dataByte < 0x1FU) + { + deframerCfg->deserializerLanesEnabled |= (0x1U << laneId); + /* Get the physical lane in use based on link and crossbar configuration */ + deframerCfg->deserializerLaneCrossbar.deframerInputLaneSel[laneId] = dataByte; + } + } + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadClkDividerValueCalculate(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e channelSelect, + const adi_adrv904x_RxOrxDataCaptureLocation_e loc, + uint8_t* value) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t ratio = 0U; /* ratio can be as high as 128; must be a power of 2 */ + uint8_t divN = 0U; /* divN is log2(ratio) */ + uint8_t rxOutputRateIndex = 11U; /* initialize the index to be out of range */ + uint8_t idx = 1U; + uint32_t tgtSampleRate = 0U; + const uint8_t MAXBIT = 8U; /* number of bits to use when calculating log base 2 */ + const uint8_t MAXRATEINDEX = 9U; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + if (loc == ADI_ADRV904X_CAPTURE_LOC_DDC0 || + loc == ADI_ADRV904X_CAPTURE_LOC_DDC1 || + loc == ADI_ADRV904X_CAPTURE_LOC_DATAPATH) + { + switch (channelSelect) + { + case ADI_ADRV904X_RXOFF: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelSelect, "Invalid channel selected for capture or readback"); + break; + case ADI_ADRV904X_RX0: + rxOutputRateIndex = 0U; + break; + case ADI_ADRV904X_RX1: + rxOutputRateIndex = 1U; + break; + case ADI_ADRV904X_RX2: + rxOutputRateIndex = 2U; + break; + case ADI_ADRV904X_RX3: + rxOutputRateIndex = 3U; + break; + case ADI_ADRV904X_RX4: + rxOutputRateIndex = 4U; + break; + case ADI_ADRV904X_RX5: + rxOutputRateIndex = 5U; + break; + case ADI_ADRV904X_RX6: + rxOutputRateIndex = 6U; + break; + case ADI_ADRV904X_RX7: + rxOutputRateIndex = 7U; + break; + case ADI_ADRV904X_ORX0: + rxOutputRateIndex = 8U; + break; + case ADI_ADRV904X_ORX1: + rxOutputRateIndex = 9U; + break; + default : + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelSelect, "Invalid channel selected for capture or readback"); + break; + } + } + if (rxOutputRateIndex <= MAXRATEINDEX) + { + /* Make sure divide by zero doesn't happen */ + if (rxOutputRateIndex == 9U) /* ORx 1 */ + { + if (device->initExtract.orx.orxChannelCfg[1].orxOutputRate_kHz > 0U) + { + tgtSampleRate = device->initExtract.orx.orxChannelCfg[1].orxOutputRate_kHz; + ratio = device->initExtract.clocks.hsDigClk_kHz / tgtSampleRate; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + } + else if (rxOutputRateIndex == 8U) /* ORx 0 */ + { + if (device->initExtract.orx.orxChannelCfg[0].orxOutputRate_kHz > 0U) + { + tgtSampleRate = device->initExtract.orx.orxChannelCfg[0].orxOutputRate_kHz; + ratio = device->initExtract.clocks.hsDigClk_kHz / tgtSampleRate; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + } + else + { + if (loc == ADI_ADRV904X_CAPTURE_LOC_DDC0) + { + tgtSampleRate = device->initExtract.rx.rxChannelCfg[rxOutputRateIndex].rxDdc0OutputRate_kHz; + ratio = device->initExtract.clocks.hsDigClk_kHz / tgtSampleRate; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + else if (loc == ADI_ADRV904X_CAPTURE_LOC_DDC1) + { + tgtSampleRate = device->initExtract.rx.rxChannelCfg[rxOutputRateIndex].rxDdc1OutputRate_kHz; + ratio = device->initExtract.clocks.hsDigClk_kHz / tgtSampleRate; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelSelect, "Invalid location selected for the selected channel"); + } + } + } + else + { + ratio = 1U; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + /* The divider ratio is a 3 bit value and only divides by powers of 2. Check the ratio here and + * return an error if the current configuration requires other than a power of 2 division. + */ + if (ratio != 1 && /* divide by 2 to the power of 0 */ + ratio != 2 && /* divide by 2 to the power of 1 */ + ratio != 4 && /* divide by 2 to the power of 2 */ + ratio != 8 && /* divide by 2 to the power of 3 */ + ratio != 16 && /* divide by 2 to the power of 4 */ + ratio != 32 && /* divide by 2 to the power of 5 */ + ratio != 64 && /* divide by 2 to the power of 6 */ + ratio != 128) /* divide by 2 to the power of 7 */ + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "The current clock configuration does not permit the correct sampling of data using internal capture memory"); + } + if (ADI_ADRV904X_ERR_ACT_NONE == recoveryAction) + { + /* compute log 2 */ + for (idx = 0U; idx <= MAXBIT; idx++) + { + if (ratio >>= 1) + { + divN++; + } + } + *value = divN; + } + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_StatusRegisterPoll(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e channelSelect, + uint8_t* const bCptBusy) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t statusRegister = 0U; + const uint32_t bitfieldMask = 0xFFFF0000U; /* The bitfield function uses the slice base address to access the capture status registers */ + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + switch (channelSelect) + { + case ADI_ADRV904X_RX0: + statusRegister = ADRV904X_ADDR_TX0_CPT_STATUS & bitfieldMask; /* the bitfield get function needs the slice base address */ + break; + case ADI_ADRV904X_RX1: + statusRegister = ADRV904X_ADDR_TX1_CPT_STATUS & bitfieldMask; + break; + case ADI_ADRV904X_RX2: + statusRegister = ADRV904X_ADDR_TX2_CPT_STATUS & bitfieldMask; + break; + case ADI_ADRV904X_RX3: + statusRegister = ADRV904X_ADDR_TX3_CPT_STATUS & bitfieldMask; + break; + case ADI_ADRV904X_RX4: + statusRegister = ADRV904X_ADDR_TX4_CPT_STATUS & bitfieldMask; + break; + case ADI_ADRV904X_RX5: + statusRegister = ADRV904X_ADDR_TX5_CPT_STATUS & bitfieldMask; + break; + case ADI_ADRV904X_RX6: + statusRegister = ADRV904X_ADDR_TX6_CPT_STATUS & bitfieldMask; + break; + case ADI_ADRV904X_RX7: + statusRegister = ADRV904X_ADDR_TX7_CPT_STATUS & bitfieldMask; + break; + case ADI_ADRV904X_ORX0: + statusRegister = ADRV904X_ADDR_ORX0_CPT_STATUS0 & bitfieldMask; + break; + case ADI_ADRV904X_ORX1: + statusRegister = ADRV904X_ADDR_ORX1_CPT_STATUS0 & bitfieldMask; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, statusRegister, "Invalid capture status register chosen for readback"); + break; + } + if (channelSelect == ADI_ADRV904X_ORX0 || + channelSelect == ADI_ADRV904X_ORX1) + { + recoveryAction = adrv904x_OrxDig_CptBusy_BfGet(device, + NULL, + (adrv904x_BfOrxDigChanAddr_e) statusRegister, + bCptBusy); + } + else + { + recoveryAction = adrv904x_TxDig_TxCptBusy_BfGet(device, + NULL, + (adrv904x_BfTxDigChanAddr_e) statusRegister, + bCptBusy); + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading from the capture status register capture busy bitfield"); + } + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_JrxRepairScreenTestChecker(adi_adrv904x_Device_t* const device, + uint8_t* const screenID) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + const uint8_t numRetries = 5U; + uint8_t regValue = 0U; + uint32_t efuseData = 0U; + uint32_t i = 0U; + + static const uint8_t EFUSE_READ_ADDRESS = 0x09U; + static const uint8_t EFUSE_READ_CONTROL = 0x19U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Read ready bit. It needs to be 1 */ + recoveryAction = adi_adrv904x_ProductIdGet(device, ®Value); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Efuse Product Id"); + return recoveryAction; + } + + /* Write Efuse Read Address */ + recoveryAction = adi_adrv904x_RegistersByteWrite(device, NULL, ADRV904X_ADDR_EFUSE_READ_ADDR, &EFUSE_READ_ADDRESS, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write Efuse Read control register"); + return recoveryAction; + } + + /* Start read command */ + recoveryAction = adi_adrv904x_RegistersByteWrite(device, NULL, ADRV904X_ADDR_EFUSE_READ_CTRL, &EFUSE_READ_CONTROL, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write Efuse Read control register"); + return recoveryAction; + } + + /* Wait for Data Valid and Read State */ + for (i = 0U; i < numRetries; i++) + { + recoveryAction = adrv904x_Core_EfuseReadDataValid_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ®Value); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read Efuse Data Valid status"); + return recoveryAction; + } + + if (regValue == 1U) + { + recoveryAction = adrv904x_Core_EfuseReadState_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ®Value); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read Efuse Read State status"); + return recoveryAction; + } + + if (regValue == 1U) + { + break; + } + } + } + + if (regValue == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to read Efuse Data"); + return recoveryAction; + } + + /* Read Efuse Data */ + recoveryAction = adrv904x_Core_EfuseReadData_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &efuseData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read Efuse Data"); + return recoveryAction; + } + + /* get CM screen bit */ + *screenID = (uint8_t)((efuseData >> 16U) & 0x01U); + + return recoveryAction; +} +ADI_API adi_adrv904x_ErrAction_e adrv904x_GetJtxLanePoweredDown(adi_adrv904x_Device_t* const device, + adrv904x_BfSerdesTxdigPhyRegmapCore1p2ChanAddr_e const laneSerdesPhyBitfieldAddr, + uint8_t* const phyLanePd) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + uint8_t pdSer = 0U; + uint8_t serEnRc = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, phyLanePd); + + recoveryAction = adrv904x_SerdesTxdigPhyRegmapCore1p2_PdSer_BfGet(device, + NULL, + laneSerdesPhyBitfieldAddr, + &pdSer); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to read phy lane pd"); + return recoveryAction; + } + + if (pdSer == 1U) + { + /* Lane is in h/w power-down; No need to fetch SerEnRc */ + *phyLanePd = 1U; + return recoveryAction; + } + + recoveryAction = adrv904x_SerdesTxdigPhyRegmapCore1p2_SerEnRc_BfGet(device, + NULL, + laneSerdesPhyBitfieldAddr, + &serEnRc); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to read phy lane s/w power up"); + return recoveryAction; + } + + /* serEnRc bitfield indicates lane powered up. Return value must indicate power *down* */ + *phyLanePd = (uint8_t) !serEnRc; + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_dfe_cfr.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_dfe_cfr.c new file mode 100644 index 00000000000..bb6d65a05a1 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_dfe_cfr.c @@ -0,0 +1,597 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adrv904x_dfe_cfr.c +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#include "../../private/include/adrv904x_dfe_cfr.h" +#include "adi_adrv904x_dfe_cfr_types.h" + + +#include "adi_adrv904x_hal.h" +#include "../../private/include/adrv904x_reg_addr_macros.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_DFE_CFR + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CfrRegsBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adrv904x_BfTxCfrRegChanAddr_e* const cfrChannelBitfieldAddr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cfrChannelBitfieldAddr); + + if (((device->devStateInfo.initializedChannels >> ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET) & (uint32_t)txChannel) == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + device->devStateInfo.initializedChannels, + "Selected Tx channel is not initialized for this device."); + return recoveryAction; + } + + switch (txChannel) + { + case ADI_ADRV904X_TX0: + *cfrChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG; + break; + + case ADI_ADRV904X_TX1: + *cfrChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG; + break; + + case ADI_ADRV904X_TX2: + *cfrChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG; + break; + case ADI_ADRV904X_TX3: + *cfrChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG; + break; + + case ADI_ADRV904X_TX4: + *cfrChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG; + break; + + case ADI_ADRV904X_TX5: + *cfrChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG; + break; + + case ADI_ADRV904X_TX6: + *cfrChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG; + break; + + case ADI_ADRV904X_TX7: + *cfrChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG; + break; + + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txChannel, + "Invalid txChannel parameter "); + return recoveryAction; + } + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CfrWritePeakThreshSq(adi_adrv904x_Device_t* const device, + const uint32_t cfrPeakThresholdScaler, + const uint32_t cfrPeakThreshold, + const adrv904x_BfTxCfrRegChanAddr_e engineBaseAddr, + const uint32_t configSelectMask, + const uint8_t engineId) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + static const uint32_t CFR_PEAK_THR_MAX = 64U * (1U << 16U); + static const uint32_t CFR_PEAK_THRSCALER_MAX = 1U << 16U; + + uint64_t tempScalerVal = ((uint64_t)cfrPeakThresholdScaler * (uint64_t)cfrPeakThresholdScaler) >> (uint64_t)16U; + uint64_t tempThreshVal = ((uint64_t)cfrPeakThreshold * (uint64_t)cfrPeakThreshold) >> (uint64_t)16U; + uint64_t detThresholdSq = (tempScalerVal * tempThreshVal) >> (uint64_t)16U; + + if((cfrPeakThreshold >= CFR_PEAK_THR_MAX) || + (cfrPeakThresholdScaler >= CFR_PEAK_THRSCALER_MAX)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrPeakThreshold, + "CFR threshold is out of range"); + return recoveryAction; + } + + if (ADRV904X_BF_EQUAL(configSelectMask, (uint32_t)ADI_ADRV904X_CFR_CFG0)) + { + recoveryAction = adrv904x_TxCfrReg_Cfr0ThrSq_BfSet(device, + NULL, + engineBaseAddr, + engineId, + (uint32_t)detThresholdSq); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing threshold sq - Cfg0"); + return recoveryAction; + } + } + + if (ADRV904X_BF_EQUAL(configSelectMask, (uint32_t)ADI_ADRV904X_CFR_CFG1)) + { + recoveryAction = adrv904x_TxCfrReg_Cfr1ThrSq_BfSet(device, + NULL, + engineBaseAddr, + engineId, + (uint32_t)detThresholdSq); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing threshold sq - Cfg1"); + return recoveryAction; + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CfrWritePeakThreshSqrt(adi_adrv904x_Device_t* const device, + const uint32_t cfrPeakThresholdScaler, + const uint32_t cfrPeakThreshold, + const adrv904x_BfTxCfrRegChanAddr_e engineBaseAddr, + const uint32_t configSelectMask, + const uint8_t engineId) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + static const uint32_t CFR_PEAK_THR_MAX = 64U * (1U << 16U); + static const uint32_t CFR_PEAK_THRSCALER_MAX = 1U << 16U; + + static const uint64_t TWO_TO_16_OVER_SQRT_TWO = 46341U; + uint64_t detThresholdSq = (uint64_t)cfrPeakThreshold * (uint64_t)cfrPeakThresholdScaler * TWO_TO_16_OVER_SQRT_TWO; + detThresholdSq >>= (uint64_t)31U; + + if ((cfrPeakThreshold >= CFR_PEAK_THR_MAX) || + (cfrPeakThresholdScaler >= CFR_PEAK_THRSCALER_MAX)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrPeakThreshold, + "CFR threshold is out of range"); + return recoveryAction; + } + + if (ADRV904X_BF_EQUAL(configSelectMask, (uint32_t)ADI_ADRV904X_CFR_CFG0)) + { + recoveryAction = adrv904x_TxCfrReg_Cfr0ThrSqrt_BfSet(device, + NULL, + engineBaseAddr, + engineId, + (uint32_t)detThresholdSq); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing threshold sqrt - Cfg0"); + return recoveryAction; + } + } + + if (ADRV904X_BF_EQUAL(configSelectMask, (uint32_t)ADI_ADRV904X_CFR_CFG1)) + { + recoveryAction = adrv904x_TxCfrReg_Cfr1ThrSqrt_BfSet(device, + NULL, + engineBaseAddr, + engineId, + (uint32_t)detThresholdSq); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing threshold sqrt - Cfg1"); + return recoveryAction; + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CfrWriteCorrectionThresh(adi_adrv904x_Device_t* const device, + const uint32_t cfrCorrectionThresholdScaler, + const uint32_t cfrPeakThreshold, + const adrv904x_BfTxCfrRegChanAddr_e engineBaseAddr, + const uint32_t configSelectMask, + const uint8_t engineId) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + static const uint32_t CFR_PEAK_THR_MAX = 64U * (1U << 16U); + static const uint32_t CFR_CORR_THRSCALER_MAX = 1U << 16U; + + uint64_t corThresholdSq = (uint64_t)cfrPeakThreshold * (uint64_t)cfrCorrectionThresholdScaler; + corThresholdSq >>= (uint64_t)15U; + + if ((cfrPeakThreshold >= CFR_PEAK_THR_MAX) || + (cfrCorrectionThresholdScaler >= CFR_CORR_THRSCALER_MAX)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrPeakThreshold, + "CFR threshold is out of range"); + return recoveryAction; + } + + if (ADRV904X_BF_EQUAL(configSelectMask, (uint32_t)ADI_ADRV904X_CFR_CFG0)) + { + recoveryAction = adrv904x_TxCfrReg_Cfr0ThrCor_BfSet(device, + NULL, + engineBaseAddr, + engineId, + (uint32_t)corThresholdSq); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing correction threshold - Cfg0"); + return recoveryAction; + } + } + + if (ADRV904X_BF_EQUAL(configSelectMask, (uint32_t)ADI_ADRV904X_CFR_CFG1)) + { + recoveryAction = adrv904x_TxCfrReg_Cfr1ThrCor_BfSet(device, + NULL, + engineBaseAddr, + engineId, + (uint32_t)corThresholdSq); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing correction threshold - Cfg1"); + return recoveryAction; + } + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e writeCfrPulseRam(adi_adrv904x_Device_t* const device, + const uint8_t interpolationRateMult, + const int16_t* const coeffRealHalfPulse, + const int16_t* const coeffImagHalfPulse, + const uint16_t numCoeffs, + const uint32_t baseAddr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + uint32_t rowMinSampleIdx = 0U; + uint32_t rowMaxSampleIdx = 0U; + uint32_t rowIdx = 0U; + + uint32_t rowToWrite[ADI_ADRV904X_CFR_PULSE_RAM_ROW_SAMPLE_SIZE] = { 0U }; + uint32_t sampleCounter = 0U; + uint32_t rowCounter = 0U; + uint32_t addressToWrite[ADI_ADRV904X_CFR_PULSE_RAM_ROW_SAMPLE_SIZE] = { 0U }; + uint32_t maskToWrite[ADI_ADRV904X_CFR_PULSE_RAM_ROW_SAMPLE_SIZE] = { 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffRealHalfPulse); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffImagHalfPulse); + + for (rowIdx = 0; rowIdx < ADI_ADRV904X_CFR_PULSE_RAM_NUM_OF_ROWS; rowIdx++) + { + rowMaxSampleIdx = rowMinSampleIdx + interpolationRateMult * 3U; + + if (numCoeffs > rowMaxSampleIdx) + { + rowCounter = 0U; + for (sampleCounter = rowMinSampleIdx; + sampleCounter < (rowMinSampleIdx + (ADI_ADRV904X_CFR_PULSE_RAM_ROW_SAMPLE_SIZE * interpolationRateMult)); + sampleCounter += interpolationRateMult) + { + rowToWrite[rowCounter++] = ((((uint32_t)coeffRealHalfPulse[sampleCounter] << 0U) & 0x0000FFFFU) | + (((uint32_t)coeffImagHalfPulse[sampleCounter] << 16U) & 0xFFFF0000U)); + } + + addressToWrite[0] = baseAddr + rowIdx * ADI_ADRV904X_CFR_PULSE_RAM_ROW_SIZE; + addressToWrite[1] = addressToWrite[0] + sizeof(uint32_t); + addressToWrite[2] = addressToWrite[1] + sizeof(uint32_t); + addressToWrite[3] = addressToWrite[2] + sizeof(uint32_t); + + + recoveryAction = adi_adrv904x_Registers32Write(device, + NULL, + (const uint32_t*)&addressToWrite[0], + (const uint32_t*)&rowToWrite[0U], + (const uint32_t*)&maskToWrite[0U], + ADI_ADRV904X_CFR_PULSE_RAM_ROW_SAMPLE_SIZE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register Write Issue"); + return recoveryAction; + } + } + + rowMinSampleIdx = (rowMaxSampleIdx + interpolationRateMult) % 1023U; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CfrCorrectionPulseWrite(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CfrPulseSel_e pulseSelect, + const uint32_t txChanIdx, + const uint8_t interpolationRate, + const adi_adrv904x_CfrCorrectionPulse_t* const cfrCorrectionPulse) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxCfrRegChanAddr_e txCfrBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG; + const uint32_t pulseBaseAddresses[ADI_ADRV904X_MAX_TXCHANNELS] = + { + ADI_ADVRV904X_TX0_PULSE_RAM_BASEADDR, + ADI_ADVRV904X_TX1_PULSE_RAM_BASEADDR, + ADI_ADVRV904X_TX2_PULSE_RAM_BASEADDR, + ADI_ADVRV904X_TX3_PULSE_RAM_BASEADDR, + ADI_ADVRV904X_TX4_PULSE_RAM_BASEADDR, + ADI_ADVRV904X_TX5_PULSE_RAM_BASEADDR, + ADI_ADVRV904X_TX6_PULSE_RAM_BASEADDR, + ADI_ADVRV904X_TX7_PULSE_RAM_BASEADDR + }; + + uint8_t interpolationRateMult = 0U; + uint32_t pulseLengthCheck = 0U; + uint32_t ramIdx = 0U; + uint32_t addressOffset = 0U; + uint32_t pulseOffset = 0U; + uint32_t chanSel = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cfrCorrectionPulse); + + /* Interpolation rate in HW 0=1x // 1=2x // 2=4x*/ + interpolationRateMult = 1U << interpolationRate; + if ((cfrCorrectionPulse->numCoeffs % interpolationRateMult) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrCorrectionPulse->numCoeffs, + "Number of coefficients should be multiple of interpolation rate"); + return recoveryAction; + } + + pulseLengthCheck = cfrCorrectionPulse->numCoeffs / interpolationRateMult; + if ((pulseLengthCheck % 4U) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrCorrectionPulse->numCoeffs, + "Number of coefficients/interpolation rate should be multiple of 4"); + return recoveryAction; + } + + chanSel = 1U << txChanIdx; + recoveryAction = adrv904x_CfrRegsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txCfrBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChanIdx, "Invalid Tx Channel used to determine CFR base address"); + return recoveryAction; + } + + for (ramIdx = 0U; ramIdx < ADI_ADRV904X_CFR_NUM_OF_PULSE_RAMS; ++ramIdx) + { + if (ADRV904X_BF_EQUAL(cfrCorrectionPulse->ramSelectMask, (1U << ramIdx))) + { + if (ramIdx > 0U) + { + /* Set this RAM bank as shadow RAM */ + recoveryAction = adrv904x_TxCfrReg_CfrRamShadowRamSel_BfSet(device, + NULL, + txCfrBaseAddr, + (ramIdx - 1U)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing Shadow RAM bf"); + return recoveryAction; + } + } + + /* Each RAM has 2 pulse data and we're adding pulse offset */ + if (pulseSelect == ADI_ADRV904X_CFR_PULSE0) + { + pulseOffset = 0U; + } + else + { + pulseOffset = ADI_ADRV904X_CFR_PULSE_RAM_SIZE; + } + + addressOffset = ramIdx * ADI_ADRV904X_CFR_PULSE_RAM_SIZE * 2U + pulseOffset; + recoveryAction = writeCfrPulseRam(device, + interpolationRateMult, + cfrCorrectionPulse->coeffRealHalfPulse, + cfrCorrectionPulse->coeffImagHalfPulse, + cfrCorrectionPulse->numCoeffs, + pulseBaseAddresses[txChanIdx] + addressOffset); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CFR pulse write failed"); + return recoveryAction; + } + } + } + + /* Write Half pulse length. Programmed pulse length = numOfCoefficents / interpolationRate - 1 */ + if (pulseSelect == ADI_ADRV904X_CFR_PULSE0) + { + recoveryAction = adrv904x_TxCfrReg_Cfr0PulHpl_BfSet(device, + NULL, + txCfrBaseAddr, + (pulseLengthCheck - 1U)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing pulse 0 half pulse length"); + return recoveryAction; + } + + } + else + { + recoveryAction = adrv904x_TxCfrReg_Cfr1PulHpl_BfSet(device, + NULL, + txCfrBaseAddr, + (pulseLengthCheck - 1U)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing pulse 1 half pulse length"); + return recoveryAction; + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CfrPulseWriteRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CfrCorrectionPulse_t* const cfrPulseData) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cfrPulseData); + + if (cfrPulseData->numCoeffs > ADI_ADRV904X_MAX_CFR_CORRECTION_PULSE_LEN) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrPulseData->numCoeffs, + "Number of pulses cannot be greater than ADI_ADRV904X_MAX_CFR_CORRECTION_PULSE_LEN"); + return recoveryAction; + } + + if (((cfrPulseData->pulseSelectMask & (~(uint32_t)ADI_ADRV904X_CFR_PULSEALL)) != 0U) || + (cfrPulseData->pulseSelectMask == 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrPulseData->pulseSelectMask, + "Invalid pulse is selected. Valid values are any combinations of Pulse0/1"); + return recoveryAction; + } + + if (((cfrPulseData->ramSelectMask & (~(uint32_t)(ADI_ADRV904X_CFR_PULSE_RAM_ALL | ADI_ADRV904X_CFR_PULSE_RAM_SINGLESHOT))) != 0U) || + (cfrPulseData->ramSelectMask == 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrPulseData->ramSelectMask, + "Invalid ram is selected. User can either select any combinations of RAM0/1/2/3/4 or SINGLESHOT"); + return recoveryAction; + } + + if(ADRV904X_BF_EQUAL(cfrPulseData->ramSelectMask, ADI_ADRV904X_CFR_PULSE_RAM_SINGLESHOT) && + ((cfrPulseData->ramSelectMask & (~(uint32_t)ADI_ADRV904X_CFR_PULSE_RAM_SINGLESHOT)) != 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrPulseData->ramSelectMask, + "Invalid ram is selected. User cannot select SINGLESHOT and individual RAM blocks at the same time"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CfrDatapathBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adrv904x_BfTxDatapathChanAddr_e* const txDatapathChannelBitfieldAddr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, txDatapathChannelBitfieldAddr); + + if (((device->devStateInfo.initializedChannels >> ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET) & (uint32_t)txChannel) == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + device->devStateInfo.initializedChannels, + "Selected Tx channel is not initialized for this device."); + return recoveryAction; + } + + switch (txChannel) + { + case ADI_ADRV904X_TX0: + *txDatapathChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_0__TX_DATAPATH; + break; + + case ADI_ADRV904X_TX1: + *txDatapathChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_1__TX_DATAPATH; + break; + + case ADI_ADRV904X_TX2: + *txDatapathChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_2__TX_DATAPATH; + break; + case ADI_ADRV904X_TX3: + *txDatapathChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_3__TX_DATAPATH; + break; + + case ADI_ADRV904X_TX4: + *txDatapathChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_4__TX_DATAPATH; + break; + + case ADI_ADRV904X_TX5: + *txDatapathChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_5__TX_DATAPATH; + break; + + case ADI_ADRV904X_TX6: + *txDatapathChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_6__TX_DATAPATH; + break; + + case ADI_ADRV904X_TX7: + *txDatapathChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_7__TX_DATAPATH; + break; + + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txChannel, + "Invalid txChannel parameter "); + return recoveryAction; + } + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_dfe_cpu.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_dfe_cpu.c new file mode 100644 index 00000000000..499e0fee3d6 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_dfe_cpu.c @@ -0,0 +1,2899 @@ +/** +* Copyright 2015 - 2023 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adrv904x_dfe_cpu.c + * \brief Contains ADRV904X DFE CPU related private function implementations + * + * ADRV904X API Version: 2.10.0.4 + */ +#include "adi_library_types.h" +#include "adi_adrv904x_cpu_sys_types.h" +#include "adi_adrv904x_dfe_cpu.h" +#include "adi_adrv904x_dfe_vswr.h" +#include "adi_adrv904x_tx.h" +#include "adi_adrv904x_dfe_cpu_pintsw_status_types.h" +#include "../../private/include/adrv904x_cpu.h" +#include "../../private/include/adrv904x_cpu_dfe_init_memory.h" +#include "../../private/include/adrv904x_dfe_cpu.h" +#include "../../private/include/adrv904x_dfe_memory.h" +#include "../../private/include/adrv904x_dfe_svc_bbic_bridge_t.h" +#include "../../private/include/adrv904x_cpu_archive_types.h" +#include "../../private/include/adrv904x_cpu_cmd.h" +#include "../../private/include/adrv904x_dfe_framework_cmd_t.h" +#include "adi_adrv904x_hal.h" +#include "../../private/include/adrv904x_dfe_framework_cmd_sys_status_t.h" +#include "../../private/include/adrv904x_cpu_object_ids_types.h" +#include "../../private/include/adrv904x_reg_addr_macros.h" +#include "../../private/include/adrv904x_tx.h" +#include "../../private/include/adrv904x_dfe_svc_log_trace_t.h" + +#include "../../private/bf/adrv904x_bf_tx_dfe_dig_regs.h" + +/*======================= D E F I N E S =======================*/ +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_DFE_CPU +#define ADRV904X_DFE_LOG_BUF_SIZE (1024u) +#define ADRV904X_DFE_MAX_ECC_SECTIONS (1023u) + +/*==================== L O C A L T Y P E S ==================*/ + +/*===================== L O C A L D A T A ===================*/ +static const unsigned int _adrv904x_crc32_table[] = +{ + 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, + 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, + 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, + 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, + 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, + 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, + 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, + 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd, + 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, + 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, + 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, + 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, + 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, + 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, + 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, + 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, + 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, + 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, + 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, + 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, + 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, + 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, + 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, + 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, + 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, + 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, + 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, + 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, + 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, + 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, + 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, + 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a, + 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, + 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, + 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, + 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, + 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, + 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b, + 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, + 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, + 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, + 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, + 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, + 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, + 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, + 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, + 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, + 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, + 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, + 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, + 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, + 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, + 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, + 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, + 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, + 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, + 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, + 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, + 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, + 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, + 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, + 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, + 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, + 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 +}; +static const uint32_t _adrv904x_reflect8[256]= +{ + 0x00,0x80,0x40,0xc0,0x20,0xa0,0x60,0xe0, + 0x10,0x90,0x50,0xd0,0x30,0xb0,0x70,0xf0, + 0x08,0x88,0x48,0xc8,0x28,0xa8,0x68,0xe8, + 0x18,0x98,0x58,0xd8,0x38,0xb8,0x78,0xf8, + 0x04,0x84,0x44,0xc4,0x24,0xa4,0x64,0xe4, + 0x14,0x94,0x54,0xd4,0x34,0xb4,0x74,0xf4, + 0x0c,0x8c,0x4c,0xcc,0x2c,0xac,0x6c,0xec, + 0x1c,0x9c,0x5c,0xdc,0x3c,0xbc,0x7c,0xfc, + 0x02,0x82,0x42,0xc2,0x22,0xa2,0x62,0xe2, + 0x12,0x92,0x52,0xd2,0x32,0xb2,0x72,0xf2, + 0x0a,0x8a,0x4a,0xca,0x2a,0xaa,0x6a,0xea, + 0x1a,0x9a,0x5a,0xda,0x3a,0xba,0x7a,0xfa, + 0x06,0x86,0x46,0xc6,0x26,0xa6,0x66,0xe6, + 0x16,0x96,0x56,0xd6,0x36,0xb6,0x76,0xf6, + 0x0e,0x8e,0x4e,0xce,0x2e,0xae,0x6e,0xee, + 0x1e,0x9e,0x5e,0xde,0x3e,0xbe,0x7e,0xfe, + 0x01,0x81,0x41,0xc1,0x21,0xa1,0x61,0xe1, + 0x11,0x91,0x51,0xd1,0x31,0xb1,0x71,0xf1, + 0x09,0x89,0x49,0xc9,0x29,0xa9,0x69,0xe9, + 0x19,0x99,0x59,0xd9,0x39,0xb9,0x79,0xf9, + 0x05,0x85,0x45,0xc5,0x25,0xa5,0x65,0xe5, + 0x15,0x95,0x55,0xd5,0x35,0xb5,0x75,0xf5, + 0x0d,0x8d,0x4d,0xcd,0x2d,0xad,0x6d,0xed, + 0x1d,0x9d,0x5d,0xdd,0x3d,0xbd,0x7d,0xfd, + 0x03,0x83,0x43,0xc3,0x23,0xa3,0x63,0xe3, + 0x13,0x93,0x53,0xd3,0x33,0xb3,0x73,0xf3, + 0x0b,0x8b,0x4b,0xcb,0x2b,0xab,0x6b,0xeb, + 0x1b,0x9b,0x5b,0xdb,0x3b,0xbb,0x7b,0xfb, + 0x07,0x87,0x47,0xc7,0x27,0xa7,0x67,0xe7, + 0x17,0x97,0x57,0xd7,0x37,0xb7,0x77,0xf7, + 0x0f,0x8f,0x4f,0xcf,0x2f,0xaf,0x6f,0xef, + 0x1f,0x9f,0x5f,0xdf,0x3f,0xbf,0x7f,0xff +}; + +/*==== L O C A L F U N C T I O N P R O T O T Y P E S ======*/ +static uint32_t adrv904x_reflect32(const uint32_t x); + +/** + * \brief Puts the CRC of the DFE image in highest memory location + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[in] imageCrc the crc of the dfe image + */ +static adi_adrv904x_ErrAction_e adrv904x_DfeCrcSend(adi_adrv904x_Device_t * const device, + const uint32_t imageCRC) + +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t dfeProfileTempAddr = ADRV904X_DFE_CPU_INIT_ADDR_GET(dfeImageCrc); + + recoveryAction = adi_adrv904x_Registers32Write(device, + NULL, + &dfeProfileTempAddr, + &imageCRC, + NULL, + 1 ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register Write Issue"); + } + return recoveryAction; +} + +/** + * \brief Reverse the bits of a 32 bit number. + * \details + * Formulaic Reverse 32 bits + * In: + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * |31:30:29:28:27:26:25:24:23:22:21:20:19:18:17:16:15:14:13:12:11:10: 9: 8: 7: 6: 5: 4: 3: 2: 1: 0| + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * Out: + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | 0: 1: 2: 3: 4: 5: 6: 7: 8: 9:10:11:12:13:14:15:16:17:18:19:20:21:22:23:24:25:26:27:28:29:30:31| + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * \param [in] x - value to bit-reverse + * \retval bit reversed value + */ +static uint32_t adrv904x_reflect32(const uint32_t x) +{ + uint32_t bits = 0; + uint32_t mask = x; + + for( uint32_t i = 0; i < sizeof(x)*8; i++ ) + { + bits <<= 1; + if( mask & 1 ) + bits |= 1; + mask >>= 1; + } + + return bits; +} + +unsigned int adrv904x_DfeCrc32Chunk (const uint8_t buf[], + const uint32_t bufLen, + const uint32_t seedCrc, + const uint8_t finalCrc) +{ + uint32_t i = 0; + unsigned int crc = seedCrc; + while (i < bufLen) + { + crc = (crc << 8) ^ _adrv904x_crc32_table[((crc >> 24) ^ _adrv904x_reflect8[buf[i]]) & 0xFF]; + i++; + } + if ( finalCrc == 1 ) + { + crc = adrv904x_reflect32( ~crc ); + } + return crc; +} + +#if (ADI_ADRV904X_DFE_LOG_CPU_CMDS == 1u) +static void adrv904x_DfeCpuCmdPayloadValToHex(const char val, + char* const buffer) +{ + uint32_t v[2] = { ((uint32_t)val & 0xF0U) >> 8U, ((uint32_t)val & 0x0FU) >> 0U }; + for( uint32_t i = 0U ; i < 2U; ++i ) + { + if( v[i] < 10U ) + { + buffer[i] = (char)'0' + v[i]; + } + else + { + buffer[i] = (char)'A' + (v[i] - 10U); + } + } + buffer[2] = '\0'; +} + +static void adrv904x_DfeCpuCmdPayloadLog(adi_adrv904x_Device_t* const device, + void* const payload, + const size_t payloadSize) +{ + char logBuf[ADRV904X_DFE_LOG_BUF_SIZE]; + char* positionIn = (char*)payload; + for(uint32_t idx = 0U; idx < payloadSize; idx += ADI_ADRV904X_DFE_LOG_CPU_CMDS_NUM_BYTES_PER_LINE) + { + uint32_t i = payloadSize - idx; + logBuf[0] = '\0'; + char* positionOut = &logBuf[0]; + uint32_t len = ADRV904X_DFE_LOG_BUF_SIZE; + ADI_LIBRARY_STRNCAT( positionOut, + "[DFEMBOX] \0", + len); + uint32_t s = ADI_LIBRARY_STRNLEN( positionOut, + len); + len -= s; + positionOut += s; + if( ADI_ADRV904X_DFE_LOG_CPU_CMDS_NUM_BYTES_PER_LINE < i) + { + i = ADI_ADRV904X_DFE_LOG_CPU_CMDS_NUM_BYTES_PER_LINE; + } + ADI_LIBRARY_STRNCAT( positionOut, + " ", + len); + s = ADI_LIBRARY_STRNLEN( positionOut, + len); + len -= s; + positionOut += s; + for(uint32_t k = 0U ; k < i; ++k) + { + positionOut[0] = ' '; + adrv904x_DfeCpuCmdPayloadValToHex( *positionIn, + &positionOut[1]); + s = 3U; + len -= s; + positionOut += s; + ++positionIn; + } + *positionOut = '\0'; + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_MSG, + "%s", + &logBuf[0]); + } +} + +static void adrv904x_DfeCpuCommandLog(adi_adrv904x_Device_t* const device, + char* const pCmdTarget, + const adrv904x_LinkId_e linkId, + const uint8_t cmdId, + void* const pCmdPayload, + const size_t cmdPayloadSz) +{ + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_MSG, + "[DFEMBOX] Sending DFE %s command on link %d: %d, %d bytes: 0x", + pCmdTarget, + linkId, + cmdId, + cmdPayloadSz); + adrv904x_DfeCpuCmdPayloadLog( device, + pCmdPayload, + cmdPayloadSz); +} + +static void adrv904x_DfeCpuResponseLog(adi_adrv904x_Device_t* const device, + char* const pCmdTarget, + const uint8_t cmdId, + const adrv904x_CpuCmdStatus_e cmdStatus, + const adrv904x_CpuCmdId_t rspCmdId, + void* const pRespPayload, + const size_t respPayloadSz) +{ + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_MSG, + "[DFEMBOX] DFE %s command %d, status %d, received response %d, %d bytes: 0x", + pCmdTarget, + cmdId, + cmdStatus, + rspCmdId, + respPayloadSz); + adrv904x_DfeCpuCmdPayloadLog( device, + pRespPayload, + respPayloadSz); +} +#endif /* (ADI_ADRV904X_DFE_LOG_CPU_CMDS == 1u) */ + +ADI_API adi_adrv904x_ErrAction_e adrv904x_DfeSdkDataAddrGet(adi_adrv904x_Device_t* const device, + uint32_t* const dfeSdkDataAddr) +{ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t addr0 = 0U; + uint8_t addr1 = 0U; + uint8_t addr2 = 0U; + uint8_t addr3 = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check dfeSdkDataAddr address pointer is not null */ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, dfeSdkDataAddr); + + /* Read the dfe sdk version address from CPU */ + /* Read the dfe sdk version addr0 from CPU */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (uint16_t) ADRV904X_DFE_SDK_DATA_ADDR_0_SCRATCH_REG_ID, + &addr0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE SDK LIB version addr0"); + return recoveryAction; + } + /* Read the dfe sdk version addr1 from CPU */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (uint16_t) ADRV904X_DFE_SDK_DATA_ADDR_1_SCRATCH_REG_ID, + &addr1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE SDK LIB version addr1"); + return recoveryAction; + } + /* Read the dfe sdk version addr2 from CPU */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (uint16_t) ADRV904X_DFE_SDK_DATA_ADDR_2_SCRATCH_REG_ID, + &addr2); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE SDK LIB version addr2"); + return recoveryAction; + } + /* Read the dfe sdk version addr3 from CPU */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (uint16_t) ADRV904X_DFE_SDK_DATA_ADDR_3_SCRATCH_REG_ID, + &addr3); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE SDK LIB version addr3"); + return recoveryAction; + } + + /* Get the SDK Lib address */ + *dfeSdkDataAddr = (uint32_t)(((uint32_t)addr0) | ((uint32_t)addr1 << 8) | ((uint32_t)addr2 << 16) | ((uint32_t)addr3 << 24)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_DfeCaptureBuffersAccessSet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const uint32_t objId, + const uint16_t cpuCmd, + adi_adrv904x_DfeAppFrameworkTrackingCalCapBufAccessSet_t* const capBufAccessSet) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, capBufAccessSet); + + if (((txChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (txChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + if (capBufAccessSet->releaseCapBuf > 0x1u) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + capBufAccessSet->releaseCapBuf, + "Invalid capBufAccessSet->releaseCapBuf is selected. 1 is for enable and 0 is for disable."); + return recoveryAction; + } + + if (capBufAccessSet->stopAfterCapDone > 0x1u) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + capBufAccessSet->stopAfterCapDone, + "Invalid capBufAccessSet->stopAfterCapDone is selected. 1 is for enable and 0 is for disable."); + return recoveryAction; + } + + for (uint8_t i = 0u; i < ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKING_CAL_MAX_NUM_ERROR_CODES_TO_PAUSE_CAL; ++i) + { + capBufAccessSet->errCodes[i] = ADRV904X_HTOCL(capBufAccessSet->errCodes[i]); + } + + for (uint8_t i = 0; i < ADI_ADRV904X_MAX_TXCHANNELS; i++) + { + uint32_t txChan = (1 << i); + if (txChannelMask & txChan) + { + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + objId, + cpuCmd, + (adi_adrv904x_Channels_e)txChan, + (const uint8_t*)capBufAccessSet, + sizeof(*capBufAccessSet), + &lengthResp, + NULL, + 0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChan, "Failed to send request"); + return recoveryAction; + } + } + } + return recoveryAction; +} +ADI_API adi_adrv904x_ErrAction_e adrv904x_DfeCaptureBuffersAccessGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannelSel, + const uint32_t objId, + const uint16_t cpuCmd, + adi_adrv904x_DfeAppFrameworkTrackingCalCapBufAccessGet_t* const capBufAccessGet) +{ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + uint32_t i = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, capBufAccessGet); + + /*Check that if requested Tx Channel valid*/ + /* Channel must contain a single channel number (0-7) */ + recoveryAction = adrv904x_DfeVerifyChannel((adi_adrv904x_Channels_e)txChannelSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelSel, "channel parameter is invalid."); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + objId, + cpuCmd, + (adi_adrv904x_Channels_e)txChannelSel, + NULL, + 0, + &lengthResp, + (uint8_t*)capBufAccessGet, + sizeof(*capBufAccessGet)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to send request"); + return recoveryAction; + } + + for (i = 0; i < capBufAccessGet->num; i++) + { + capBufAccessGet->pMem[i] = ADRV904X_CTOHLL(capBufAccessGet->pMem[i]); + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_DfeSvcCmdSend(adi_adrv904x_Device_t* const device, + const adrv904x_LinkId_e linkId, + const uint8_t cmdId, + void* const pCmdPayload, + const size_t cmdPayloadSz, + void* const pRespPayload, + const size_t respPayloadSz, + adrv904x_DfeSvcCmdStatus_t* const status) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_t *txCmd = NULL; + adrv904x_CpuCmdResp_t *rxRsp = NULL; + adrv904x_CpuCmdId_t rspCmdId; + adrv904x_CpuCmdStatus_e cmdStatus; + uint8_t cmdBuf[SVC_BBIC_BRIDGE_MAX_MAILBOX_LINK_SIZE]; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + /* Initialize the caller's status parameter, if applicable. */ + if (status != NULL) + { + *status = ADRV904X_CPU_CMD_STATUS_GENERIC; + } + + /* If the command payload size is nonzero, verify the pointer is not null */ + if (cmdPayloadSz != 0) + { + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, pCmdPayload); + } + else if (pCmdPayload != NULL) + { + /* If the command payload size is zero, pointer must be null */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, pCmdPayload, "pCmdPayload must be NULL if cmdPayloadSz is 0"); + return recoveryAction; + } + + /* If the command response payload size is nonzero, verify the pointer is not null */ + if (respPayloadSz != 0) + { + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, pRespPayload); + } + else if (pRespPayload != NULL) + { + /* If the command response payload size is zero, pointer must be null */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, pRespPayload, "pRespPayload must be NULL if respPayloadSz is 0"); + return recoveryAction; + } + + /* Verify linkId */ + if ((linkId >= ADRV904X_LINK_ID_MAX) || + (linkId <= ADRV904X_LINK_ID_UNKNOWN)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, linkId, "Invalid link ID"); + return recoveryAction; + } + + /* Verify command payload size is acceptable */ + if (cmdPayloadSz > (sizeof(cmdBuf) - sizeof(adrv904x_CpuCmd_t))) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cmdPayloadSz, "cmdPayloadSz is too large for command buffer."); + return recoveryAction; + } + + /* Verify response payload size is acceptable */ + if (respPayloadSz > (sizeof(cmdBuf) - sizeof(adrv904x_CpuCmdResp_t))) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, respPayloadSz, "respPayloadSz is too large for command buffer."); + return recoveryAction; + } + + /* Overlay the command header and response header on the buffer */ + txCmd = (adrv904x_CpuCmd_t*)cmdBuf; + rxRsp = (adrv904x_CpuCmdResp_t*)cmdBuf; + + /* Copy the caller's payload to the correct location. Size is verified above. */ + if (cmdPayloadSz != 0) + { + ADI_LIBRARY_MEMCPY((void*)((uint8_t*)txCmd + sizeof(adrv904x_CpuCmd_t)), pCmdPayload, cmdPayloadSz); + } + + /* If enabled, log the requested DFE CPU command to the API log, including payload */ +#if (ADI_ADRV904X_DFE_LOG_CPU_CMDS == 1u) + adrv904x_DfeCpuCommandLog( device, + "service", + linkId, + cmdId, + pCmdPayload, + cmdPayloadSz); +#endif /* (ADI_ADRV904X_DFE_LOG_CPU_CMDS == 1u) */ + + /* Send the command */ + recoveryAction = adrv904x_CpuCmdWrite(device, ADI_ADRV904X_CPU_TYPE_DFE, linkId, (adrv904x_CpuCmdId_t)cmdId, txCmd, cmdPayloadSz); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to send command to CPU"); + goto debug; + } + + /* Wait for the response, then receive the payload into rxRsp. rxRsp is verified to be able to hold respPayloadSz payload above. */ + recoveryAction = adrv904x_CpuCmdRespRead(device, ADI_ADRV904X_CPU_TYPE_DFE, linkId, &rspCmdId, rxRsp, (uint32_t)respPayloadSz, &cmdStatus); + + /* If enabled, log the response from the DFE CPU command to the API log, including payload */ +#if (ADI_ADRV904X_DFE_LOG_CPU_CMDS == 1u) + adrv904x_DfeCpuResponseLog( device, + "service", + cmdId, + cmdStatus, + rspCmdId, + ((uint8_t*)rxRsp + sizeof(adrv904x_CpuCmdResp_t)), + respPayloadSz); +#endif /* (ADI_ADRV904X_DFE_LOG_CPU_CMDS == 1u) */ + + /* Copy cmd status out for caller, if applicable */ + if (status != NULL) + { + *status = cmdStatus; + } + + /* Process any cmd errors */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + if (cmdStatus == ADRV904X_CPU_CMD_STATUS_CMD_FAILED) + { + /* For command-specific failures, copy the payload to the caller's buffer before aborting. */ + if (respPayloadSz != 0) + { + ADI_LIBRARY_MEMCPY(pRespPayload, (void*)((uint8_t*)rxRsp + sizeof(adrv904x_CpuCmdResp_t)), respPayloadSz); + } + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CPU Command Response Error"); + } + else + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "No CPU Command Response Received"); + } + + goto debug; + } + + /* Copy the payload to the caller's buffer */ + if (respPayloadSz != 0) + { + ADI_LIBRARY_MEMCPY(pRespPayload, (void*)((uint8_t*)rxRsp + sizeof(adrv904x_CpuCmdResp_t)), respPayloadSz); + } + + return recoveryAction; + +debug: + + /* Disable Error Clearing for Private API Call Case e.g. CpuPing */ + ++device->common.publicCnt; + + adrv904x_CpuErrorDebugCheck(device); + + adrv904x_DfeCpuErrorDebugCheck(device); + + --device->common.publicCnt; + + return recoveryAction; + +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_DfeAppCmdSend(adi_adrv904x_Device_t* const device, + const adrv904x_LinkId_e linkId, + const uint8_t cmdId, + void* const pCmdPayload, + const size_t cmdPayloadSz, + void* const pRespPayload, + const size_t respPayloadSz, + adrv904x_DfeSvcCmdStatus_t* const status) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_t *txCmd = NULL; + adrv904x_CpuCmdResp_t *rxRsp = NULL; + adrv904x_CpuCmdId_t rspCmdId; + adrv904x_DfeSvcCmdStatus_t cmdStatus; + uint8_t cmdBuf[SVC_BBIC_BRIDGE_MAX_MAILBOX_LINK_SIZE]; + + adrv904x_DfeAppFrameworkCmdAppCmd_t *appCmd = NULL; // Application cmd header + adrv904x_DfeAppFrameworkCmdGenericResp_t *appRsp = NULL; // Application rsp header + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + /* Initialize the caller's status parameter, if applicable. */ + if (status != NULL) + { + *status = ADRV904X_CPU_CMD_STATUS_GENERIC; + } + + /* If the command payload size is nonzero, verify the pointer is not null */ + if (cmdPayloadSz != 0) + { + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, pCmdPayload); + } + else if (pCmdPayload != NULL) + { + /* If the command payload size is zero, pointer must be null */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, pCmdPayload, "pCmdPayload must be NULL if cmdPayloadSz is 0"); + return recoveryAction; + } + + /* If the command response payload size is nonzero, verify the pointer is not null */ + if (respPayloadSz != 0) + { + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, pRespPayload); + } + else if (pRespPayload != NULL) + { + /* If the command response payload size is zero, pointer must be null */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, pRespPayload, "pRespPayload must be NULL if respPayloadSz is 0"); + return recoveryAction; + } + + /* Verify linkId */ + if ((linkId >= ADRV904X_LINK_ID_MAX) || + (linkId <= ADRV904X_LINK_ID_UNKNOWN)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, linkId, "Invalid link ID"); + return recoveryAction; + } + + /* Verify command payload size is acceptable */ + if (cmdPayloadSz > (sizeof(cmdBuf) - sizeof(adrv904x_CpuCmd_t) - sizeof(adrv904x_DfeAppFrameworkCmdAppCmd_t))) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cmdPayloadSz, "cmdPayloadSz is too large for command buffer."); + return recoveryAction; + } + + /* Verify response payload size is acceptable */ + if (respPayloadSz > (sizeof(cmdBuf) - sizeof(adrv904x_CpuCmdResp_t))) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, respPayloadSz, "respPayloadSz is too large for command buffer."); + return recoveryAction; + } + + /* Overlay the command header and response header on the buffer */ + txCmd = (adrv904x_CpuCmd_t*)cmdBuf; + rxRsp = (adrv904x_CpuCmdResp_t*)cmdBuf; + + /* Overlay the application header and application response header on the buffer */ + appCmd = (adrv904x_DfeAppFrameworkCmdAppCmd_t*)(cmdBuf + sizeof(adrv904x_CpuCmd_t)); + appRsp = (adrv904x_DfeAppFrameworkCmdGenericResp_t*)(cmdBuf + sizeof(adrv904x_CpuCmdResp_t)); + + /* Set the application command ID */ + appCmd->appCmdOpcode = ADRV904X_HTOCS((uint16_t)cmdId); + + /* Copy the caller's payload to the correct location. Size is verified above. */ + if (cmdPayloadSz != 0) + { + ADI_LIBRARY_MEMCPY((void*)((uint8_t*)txCmd + sizeof(adrv904x_CpuCmd_t) + sizeof(adrv904x_DfeAppFrameworkCmdAppCmd_t)), pCmdPayload, cmdPayloadSz) ; + } + + /* If enabled, log the requested DFE CPU command to the API log, including payload */ +#if (ADI_ADRV904X_DFE_LOG_CPU_CMDS == 1u) + adrv904x_DfeCpuCommandLog( device, + "app", + linkId, + cmdId, + pCmdPayload, + cmdPayloadSz); +#endif /* (ADI_ADRV904X_DFE_LOG_CPU_CMDS == 1u) */ + + /* Send the command */ + recoveryAction = adrv904x_CpuCmdWrite(device, ADI_ADRV904X_CPU_TYPE_DFE, linkId, + (adrv904x_CpuCmdId_t)ADRV904X_DFE_SVC_CPU_CMD_ID_DFE_APPLICATION, txCmd, (cmdPayloadSz + sizeof(adrv904x_DfeAppFrameworkCmdAppCmd_t))); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to send command to CPU"); + goto debug; + } + + /* Wait for the response, then receive the payload into rxRsp. rxRsp is verified to be able to hold respPayloadSz payload above. */ + recoveryAction = adrv904x_CpuCmdRespRead(device, + ADI_ADRV904X_CPU_TYPE_DFE, + linkId, + &rspCmdId, + rxRsp, + (uint32_t)respPayloadSz, + (adrv904x_CpuCmdStatus_e*) &cmdStatus); + + /* If enabled, log the response from the DFE CPU command to the API log, including payload */ +#if (ADI_ADRV904X_DFE_LOG_CPU_CMDS == 1u) + adrv904x_DfeCpuResponseLog( device, + "app", + cmdId, + cmdStatus, + rspCmdId, + ((uint8_t*)rxRsp + sizeof(adrv904x_CpuCmdResp_t)), + respPayloadSz); +#endif /* (ADI_ADRV904X_DFE_LOG_CPU_CMDS == 1u) */ + + /* Copy cmd status out for caller, if applicable */ + if (status != NULL) + { + *status = cmdStatus; + } + + /* Process any cmd errors */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + if (cmdStatus == ADRV904X_CPU_CMD_STATUS_CMD_FAILED) + { + /* For command-specific failures, copy the payload to the caller's buffer before aborting. */ + if (respPayloadSz != 0) + { + ADI_LIBRARY_MEMCPY(pRespPayload, (void*)((uint8_t*)rxRsp + sizeof(adrv904x_CpuCmdResp_t)), respPayloadSz); + } + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CPU Command Response Error"); + } + else + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "No CPU Command Response Received"); + } + + goto debug; + } + + /* Check the application command response status */ + if (appRsp->status != ADI_ADRV904X_DFE_SVC_ERR_CODE_NO_ERROR) + { + /* For command-specific failures, copy the payload to the caller's buffer before aborting. */ + if (respPayloadSz != 0) + { + ADI_LIBRARY_MEMCPY(pRespPayload, (void*)((uint8_t*)rxRsp + sizeof(adrv904x_CpuCmdResp_t)), respPayloadSz); + } + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DFE Application Command Response Error"); + } + + + /* Copy the payload to the caller's buffer */ + if (respPayloadSz != 0) + { + ADI_LIBRARY_MEMCPY(pRespPayload, (void*)((uint8_t*)rxRsp + sizeof(adrv904x_CpuCmdResp_t)), respPayloadSz); + } + + return recoveryAction; + +debug: + + /* Disable Error Clearing for Private API Call Case */ + ++device->common.publicCnt; + + adrv904x_CpuErrorDebugCheck(device); + + adrv904x_DfeCpuErrorDebugCheck(device); + + --device->common.publicCnt; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_DfeCpuAppPing(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType, + const uint32_t writeData, + uint32_t* const readData) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_DfeSvcCmdPing_t pingCmd; + adrv904x_DfeSvcCmdPingResp_t pingCmdRsp; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, readData); + + ADI_LIBRARY_MEMSET(&pingCmd, 0, sizeof(adrv904x_DfeSvcCmdPing_t)); + ADI_LIBRARY_MEMSET(&pingCmdRsp, 0, sizeof(adrv904x_DfeSvcCmdPingResp_t)); + + /* Setup ping-specific payload */ + pingCmd.echoData = ADRV904X_HTOCL(writeData); + + if ((cpuType == ADI_ADRV904X_CPU_TYPE_0) || + (cpuType == ADI_ADRV904X_CPU_TYPE_1)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuType, "Command not supported by this CPU type"); + return recoveryAction; + } +/* Send command and receive response */ + else if(cpuType == ADI_ADRV904X_CPU_TYPE_DFE) + { + recoveryAction = adrv904x_DfeAppCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_APP_FRAMEWORK_CMD_PING, + (void*)&pingCmd, + sizeof(pingCmd), + (void*)&pingCmdRsp, + sizeof(pingCmdRsp), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_APP_CMD_RESP_CHECK_RETURN(pingCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction); + } + } + + /* Extract ping-specific response */ + cpuErrorCode = ADRV904X_CTOHL(pingCmdRsp.status); + *readData = ADRV904X_CTOHL(pingCmdRsp.echoData); + + /* Handle ping-specific errors */ + if ((cpuErrorCode != ADI_ADRV904X_DFE_SVC_ERR_CODE_NO_ERROR) || (*readData != writeData)) + { + ADI_ADRV904X_ERROR_INFO_GET_REPORT(ADI_ADRV904X_ERRSRC_CPU, + ADI_ADRV904X_ERRCODE_CPU_PING, + ADI_NO_VARIABLE, + recoveryAction); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_PackagingInformationValidate(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeCpuBinaryInfo_t* const cpuDfeBinaryInfo) + { + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + FILE* cpuImageFilePtr = NULL; + adrv904x_CpuArchiveHeader_t header; + uint32_t byteCount = 0U; + + /* Initialize data for crc */ +#ifdef __GNUC__ + cpuImageFilePtr = ADI_LIBRARY_FOPEN((const char *)cpuDfeBinaryInfo->filePath, "rb"); +#else + if (ADI_LIBRARY_FOPEN_S(&cpuImageFilePtr, (const char *)cpuDfeBinaryInfo->filePath, "rb") != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuDfeBinaryInfo->filePath, "Invalid Binary File or Path Detected"); + goto cleanup; + } +#endif + if (NULL == cpuImageFilePtr) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue with opening the DFE Archive"); + goto cleanup; + } + + /* Move the file pointer to beginning of the file after the file crc */ + if (ADI_LIBRARY_FSEEK(cpuImageFilePtr, sizeof(uint32_t), SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuDfeBinaryInfo->filePath, "Unable to Rewind File Pointer for DFE CRC calculation"); + goto cleanup; + } + + byteCount = ADI_LIBRARY_FREAD(&header, 1, sizeof(adrv904x_CpuArchiveHeader_t), cpuImageFilePtr); + if ( byteCount != sizeof(adrv904x_CpuArchiveHeader_t) ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuDfeBinaryInfo->filePath, "Error reading Header from CPU image file"); + goto cleanup; + } + + /* Extract archive header contents (stored in CPU byte order) */ + header.magicNum = ADRV904X_CTOHL(header.magicNum); + header.formatRev = ADRV904X_CTOHL(header.formatRev); + header.xsum = ADRV904X_CTOHL(header.xsum); + + if ( header.magicNum != ADRV904X_DFE_CPU_ARCHIVE_MAGIC_NUM ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuDfeBinaryInfo->filePath, "CPU image file - invalid file type"); + goto cleanup; + } + + if ( header.formatRev != ADRV904X_DFE_CPU_ARCHIVE_REV_1 ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuDfeBinaryInfo->filePath, "CPU image file - incorrect file version"); + goto cleanup; + } + + /* Send the CRC to DFE */ + recoveryAction = adrv904x_DfeCrcSend( device, header.xsum) ; + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue with sending the DFE CRC"); + goto cleanup; + } + +cleanup : + if (cpuImageFilePtr != NULL) + { + /* Close CPU Image File */ + if (0 != ADI_LIBRARY_FCLOSE(cpuImageFilePtr)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot Close DFE CPU Image File"); + } + } + return recoveryAction; + } + +//TODO: Replace as part of ticket TPGSWE-6021 +static uint64_t adrv904x_CpuIntFromBytesGet64(const uint8_t* const buf){ + //Only works for little endian + uint64_t result = 0; + result = (uint64_t) adrv904x_CpuIntFromBytesGet(&buf[0],4); + result |= (uint64_t)adrv904x_CpuIntFromBytesGet(&buf[4],4) << 32; + return result; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_DfeExceptionDataGet(adi_adrv904x_Device_t* const device, + adrv904x_DfePlatformExceptionData_t* dfeExceptionData) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t address = 0U; + uint32_t baseAddress = 0U; + uint8_t exceptionData[8] = {0}; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dfeExceptionData, cleanup); + + if ((device->devStateInfo.devState & ADI_ADRV904X_STATE_DFECPULOADED) != ADI_ADRV904X_STATE_DFECPULOADED) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DFE CPU bin must be loaded before getting exception data"); + goto cleanup; + } + + /* Get dfe exception data from CPU */ + recoveryAction = adrv904x_DfeSdkDataAddrGet(device, &baseAddress); + baseAddress += ADI_LIBRARY_OFFSETOF(adrv904x_DfeSvcBbicBridgeSdkData_t,dfeExceptionSnapshotData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE SDK exception data"); + goto cleanup; + } + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionFlag[0]); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 4); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE exception flag, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionFlag[0] = (adrv904x_DfePlatformExceptionFlag_e)adrv904x_CpuIntFromBytesGet(exceptionData,4); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].sp_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Stack Pointer, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].sp_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].spsr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Save Program Status Register, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].spsr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].elr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Exception Link Register, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].elr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].sctlr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, System Control Register, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].sctlr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].actlr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Auxiliary Control Register, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].actlr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].cpacr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Architectural Feature Access Control register,Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].cpacr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].csselr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Cache Size Selection register, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].csselr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].esr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Exception Syndrome register, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].esr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].ttbr0_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Translation Table Base Register 0, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].ttbr0_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].ttbr1_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Translation Base Register 1, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].ttbr1_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].mair_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Memory Attribute Indirection register, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].mair_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].amair_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Aux Memory Attribute Indirection register,Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].amair_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].tcr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Translation Control register, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].tcr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].tpidr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, SoftwareThread ID register, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].tpidr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].par_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Physical Address register, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].par_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].mpidr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Multiprocessor Affinity register, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].mpidr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].afsr0_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Auxiliary Fault Status register, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].afsr0_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].afsr1_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Auxiliary Fault Status register 1, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].afsr1_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].contextidr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Context ID register, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].contextidr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].vbar_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Vector Base Address register, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].vbar_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].cntkctl_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Counter-timer Kernel Control register, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].cntkctl_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].isr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Interrupt Status register, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].isr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].far_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Fault Address register, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].far_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].icc_sre_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Register Enable register, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].icc_sre_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].icc_igrpen0_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Interrupt Group 0 Enable register, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].icc_igrpen0_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].icc_igrpen1_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Interrupt Group 1 Enable register, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].icc_igrpen1_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].icc_ctlr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Control Register, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].icc_ctlr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].icc_iar0_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Interrupt Ack register 0, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].icc_iar0_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].icc_iar1_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Interrupt Ack register 1, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].icc_iar1_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].icc_pmr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Interrupt Priority Mask register, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].icc_pmr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].icc_bpr0_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Virtual Binary Point register 0, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].icc_bpr0_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].icc_bpr1_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Virtual Binary Point register 1, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].icc_bpr1_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[0].icc_rpr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Virtual Running Priority register, Core:0"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[0].icc_rpr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionFlag[1]); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 4); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE exception flag, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionFlag[1] = (adrv904x_DfePlatformExceptionFlag_e)adrv904x_CpuIntFromBytesGet(exceptionData,4); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].sp_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Stack Pointer, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].sp_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].spsr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Save Program Status Register, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].spsr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].elr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Exception Link Register, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].elr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].sctlr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, System Control Register, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].sctlr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].actlr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Auxiliary Control Register, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].actlr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].cpacr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Architectural Feature Access Control register,Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].cpacr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].csselr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Cache Size Selection register, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].csselr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].esr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Exception Syndrome register, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].esr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].ttbr0_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Translation Table Base Register 0, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].ttbr0_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].ttbr1_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Translation Base Register 1, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].ttbr1_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].mair_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Memory Attribute Indirection register, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].mair_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].amair_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Aux Memory Attribute Indirection register,Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].amair_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].tcr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Translation Control register, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].tcr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].tpidr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, SoftwareThread ID register, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].tpidr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].par_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Physical Address register, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].par_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].mpidr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Multiprocessor Affinity register, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].mpidr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].afsr0_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Auxiliary Fault Status register, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].afsr0_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].afsr1_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Auxiliary Fault Status register 1, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].afsr1_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].contextidr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Context ID register, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].contextidr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].vbar_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Vector Base Address register, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].vbar_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].cntkctl_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Counter-timer Kernel Control register, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].cntkctl_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].isr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Interrupt Status register, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].isr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].far_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Fault Address register, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].far_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].icc_sre_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Register Enable register, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].icc_sre_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].icc_igrpen0_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Interrupt Group 0 Enable register, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].icc_igrpen0_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].icc_igrpen1_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Interrupt Group 1 Enable register, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].icc_igrpen1_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].icc_ctlr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Control Register, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].icc_ctlr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].icc_iar0_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Interrupt Ack register 0, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].icc_iar0_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].icc_iar1_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Interrupt Ack register 1, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].icc_iar1_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].icc_pmr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Interrupt Priority Mask register, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].icc_pmr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].icc_bpr0_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Virtual Binary Point register 0, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].icc_bpr0_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].icc_bpr1_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Virtual Binary Point register 1, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].icc_bpr1_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[1].icc_rpr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Virtual Running Priority register, Core:1"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[1].icc_rpr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionFlag[2]); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 4); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE exception flag, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionFlag[2] = (adrv904x_DfePlatformExceptionFlag_e)adrv904x_CpuIntFromBytesGet(exceptionData,4); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].sp_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Stack Pointer, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].sp_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].spsr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Save Program Status Register, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].spsr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].elr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Exception Link Register, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].elr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].sctlr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, System Control Register, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].sctlr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].actlr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Auxiliary Control Register, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].actlr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].cpacr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Architectural Feature Access Control register,Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].cpacr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].csselr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Cache Size Selection register, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].csselr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].esr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Exception Syndrome register, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].esr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].ttbr0_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Translation Table Base Register 0, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].ttbr0_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].ttbr1_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Translation Base Register 1, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].ttbr1_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].mair_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Memory Attribute Indirection register, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].mair_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].amair_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Aux Memory Attribute Indirection register,Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].amair_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].tcr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Translation Control register, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].tcr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].tpidr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, SoftwareThread ID register, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].tpidr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].par_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Physical Address register, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].par_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].mpidr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Multiprocessor Affinity register, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].mpidr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].afsr0_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Auxiliary Fault Status register, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].afsr0_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].afsr1_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Auxiliary Fault Status register 1, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].afsr1_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].contextidr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Context ID register, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].contextidr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].vbar_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Vector Base Address register, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].vbar_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].cntkctl_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Counter-timer Kernel Control register, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].cntkctl_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].isr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Interrupt Status register, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].isr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].far_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Fault Address register, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].far_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].icc_sre_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Register Enable register, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].icc_sre_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].icc_igrpen0_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Interrupt Group 0 Enable register, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].icc_igrpen0_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].icc_igrpen1_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Interrupt Group 1 Enable register, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].icc_igrpen1_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].icc_ctlr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Control Register, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].icc_ctlr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].icc_iar0_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Interrupt Ack register 0, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].icc_iar0_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].icc_iar1_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Interrupt Ack register 1, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].icc_iar1_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].icc_pmr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Interrupt Priority Mask register, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].icc_pmr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].icc_bpr0_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Virtual Binary Point register 0, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].icc_bpr0_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].icc_bpr1_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Virtual Binary Point register 1, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].icc_bpr1_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[2].icc_rpr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Virtual Running Priority register, Core:2"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[2].icc_rpr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionFlag[3]); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 4); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE exception flag, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionFlag[3] = (adrv904x_DfePlatformExceptionFlag_e)adrv904x_CpuIntFromBytesGet(exceptionData,4); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].sp_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Stack Pointer, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].sp_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].spsr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Save Program Status Register, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].spsr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].elr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Exception Link Register, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].elr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].sctlr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, System Control Register, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].sctlr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].actlr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Auxiliary Control Register, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].actlr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].cpacr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Architectural Feature Access Control register,Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].cpacr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].csselr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Cache Size Selection register, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].csselr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].esr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Exception Syndrome register, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].esr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].ttbr0_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Translation Table Base Register 0, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].ttbr0_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].ttbr1_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Translation Base Register 1, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].ttbr1_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].mair_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Memory Attribute Indirection register, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].mair_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].amair_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Aux Memory Attribute Indirection register,Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].amair_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].tcr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Translation Control register, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].tcr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].tpidr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, SoftwareThread ID register, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].tpidr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].par_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Physical Address register, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].par_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].mpidr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Multiprocessor Affinity register, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].mpidr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].afsr0_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Auxiliary Fault Status register, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].afsr0_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].afsr1_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Auxiliary Fault Status register 1, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].afsr1_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].contextidr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Context ID register, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].contextidr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].vbar_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Vector Base Address register, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].vbar_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].cntkctl_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Counter-timer Kernel Control register, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].cntkctl_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].isr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Interrupt Status register, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].isr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].far_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, Fault Address register, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].far_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].icc_sre_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Register Enable register, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].icc_sre_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].icc_igrpen0_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Interrupt Group 0 Enable register, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].icc_igrpen0_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].icc_igrpen1_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Interrupt Group 1 Enable register, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].icc_igrpen1_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].icc_ctlr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Control Register, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].icc_ctlr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].icc_iar0_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Interrupt Ack register 0, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].icc_iar0_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].icc_iar1_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Interrupt Ack register 1, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].icc_iar1_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].icc_pmr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Interrupt Priority Mask register, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].icc_pmr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].icc_bpr0_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Virtual Binary Point register 0, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].icc_bpr0_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].icc_bpr1_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Virtual Binary Point register 1, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].icc_bpr1_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + + address = baseAddress + ADI_LIBRARY_OFFSETOF(adrv904x_DfePlatformExceptionData_t,ExceptionRegs[3].icc_rpr_el1); + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, address, exceptionData, NULL, 8); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE Exception Data, ICC Virtual Running Priority register, Core:3"); + goto cleanup; + } + dfeExceptionData->ExceptionRegs[3].icc_rpr_el1 = adrv904x_CpuIntFromBytesGet64(exceptionData); + +cleanup: + return recoveryAction; +} + +adi_adrv904x_ErrAction_e adrv904x_DfeVerifyChannel(const adi_adrv904x_Channels_e channel) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Channel must not be set to OFF */ + if (channel != ADI_ADRV904X_CHOFF) + { + /* Channel must contain a single channel number (0-7) */ + if (channel == ADI_ADRV904X_CH0 || + channel == ADI_ADRV904X_CH1 || + channel == ADI_ADRV904X_CH2 || + channel == ADI_ADRV904X_CH3 || + channel == ADI_ADRV904X_CH4 || + channel == ADI_ADRV904X_CH5 || + channel == ADI_ADRV904X_CH6 || + channel == ADI_ADRV904X_CH7) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + } + + return recoveryAction; +} + +adi_adrv904x_ErrAction_e adrv904x_DfeCalCommonStatusGet(adi_adrv904x_Device_t* const device, + const uint32_t objId, + const adi_adrv904x_Channels_e channel, + adi_adrv904x_CalStatus_t* const status) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + char txBuf[ADRV904X_CPU_CMD_MAX_SIZE_BYTES]; + char rxBuf[ADRV904X_CPU_CMD_RESP_MAX_SIZE_BYTES]; + adrv904x_DfeAppFrameworkCmdAppGetCalStatus_t* calStatusCmd = NULL; + adrv904x_DfeAppFrameworkCmdAppGetCalStatusResp_t* sendCalStatusCmdRsp = NULL; + adi_adrv904x_DfeAppErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_APP_ERR_CODE_NO_ERROR; + adi_adrv904x_CalStatus_t* calStatus = NULL; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_LIBRARY_MEMSET(&txBuf[0U], 0, sizeof(txBuf)); + ADI_LIBRARY_MEMSET(&rxBuf[0U], 0, sizeof(rxBuf)); + + /* validate the input parameters */ + recoveryAction = adrv904x_DfeVerifyChannel(channel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + channel, + "channel parameter is invalid."); + return recoveryAction; + } + + /* Build the CPU command */ + calStatusCmd = (adrv904x_DfeAppFrameworkCmdAppGetCalStatus_t*)((uint8_t*)txBuf); + calStatusCmd->type = ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_STATUS_COMMON; + calStatusCmd->calObjId = ADRV904X_HTOCL(objId); + calStatusCmd->channelNum = ADRV904X_HTOCL(adrv904x_DfeChanMaskToNum(channel)); + + sendCalStatusCmdRsp = (adrv904x_DfeAppFrameworkCmdAppGetCalStatusResp_t*)((uint8_t*)rxBuf); + + /* Then send it */ + recoveryAction = adrv904x_DfeAppCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_GETCALSTATUS, + (void*)txBuf, + sizeof(adrv904x_DfeAppFrameworkCmdAppGetCalStatus_t), + (void*)sendCalStatusCmdRsp, + sizeof(adrv904x_DfeAppFrameworkCmdAppGetCalStatusResp_t) + sizeof(adi_adrv904x_CalStatus_t), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_APP_CMD_RESP_CHECK_RETURN(sendCalStatusCmdRsp->cmdStatus, cmdStatus, cpuErrorCode, recoveryAction); + } + + calStatus = (adi_adrv904x_CalStatus_t*)(rxBuf + sizeof(adrv904x_DfeAppFrameworkCmdAppGetCalStatusResp_t)); + + if (calStatus != NULL) + { + /* Translate the response from the CPU */ + status->errorCode = ADRV904X_CTOHL(calStatus->errorCode); + status->percentComplete = ADRV904X_CTOHL(calStatus->percentComplete); + status->performanceMetric = ADRV904X_CTOHL(calStatus->performanceMetric); + status->iterCount = ADRV904X_CTOHL(calStatus->iterCount); + status->updateCount = ADRV904X_CTOHL(calStatus->updateCount); + } + + return recoveryAction; +} + +uint32_t adrv904x_DfeTrackingCalToObjId(const adi_adrv904x_DfeAppFrameworkTrackingCalibrationMask_e calId) +{ + uint32_t objId = 0U; + + objId = adrv904x_DfeGetBitPosition((uint32_t)calId); + objId += ADI_ADRV904X_DFE_SVC_ERR_OBJID_CAL_START; + + return objId; +} + +uint32_t adrv904x_DfeGetBitPosition(const uint32_t mask) +{ + uint32_t bitPos = 0U; + + if (mask != 0U) + { + for (bitPos = 0U; ((1U << bitPos) & mask) == 0U; bitPos++) + { + } + } + + return bitPos; +} + +uint32_t adrv904x_DfeChanMaskToNum(const adi_adrv904x_Channels_e mask) +{ + return adrv904x_DfeGetBitPosition((uint32_t)mask); +} + +uint32_t adrv904x_DfeChannelToChannelId(const adi_adrv904x_Channels_e channel) +{ + uint32_t div = 0U; + + for (div = 0U; div < 8U; div++) + { + if ((uint32_t)channel == (1U << div)) + { + break; + } + } + + return div; +} + +adi_adrv904x_ErrAction_e adrv904x_DfeSendSysStatusCmd(adi_adrv904x_Device_t* const device, + const adrv904x_DfeFrameworkCmdSysStatusType_e type, + const adrv904x_CpuObjectId_e sysObjId, + const adi_adrv904x_Channels_e channel) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + char txBuf[ADRV904X_CPU_CMD_MAX_SIZE_BYTES]; + adrv904x_DfeAppFrameworkCmdGetSysStatus_t* SysStatusCmd = NULL; + adrv904x_DfeAppFrameworkCmdAppCmd_t* appInfo = NULL; + adrv904x_CpuCmd_t* Cmd = NULL; + adi_adrv904x_CpuType_e cpuType = ADI_ADRV904X_CPU_TYPE_DFE; + (void)type; /* (void) used here because the type (public/private) is hardcoded to public for the public function (adrv904x_DfeSysStatusGet) */ + /* and private for the private function (adi_adrv904x_DfeSysPvtStatusGet). This is consistent with Palau. */ + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_LIBRARY_MEMSET(&txBuf, 0, sizeof(txBuf)); + + /* validate the input parameters */ + recoveryAction = adrv904x_DfeVerifyChannel(channel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + channel, + "channel parameter is invalid."); + return recoveryAction; + } + + if (((sysObjId < (uint32_t) ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_VSWR) || + (sysObjId > (uint32_t) ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD)) && + (sysObjId != (uint32_t) ADRV904X_DFE_APP_FRAMEWORK_CMD_OBJID_DRV_DUMMY)) /* DUMMY sysObjId used for testing */ + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, sysObjId, "objId parameter is invalid."); + return recoveryAction; + } + + /* Build the CPU command */ + Cmd = (adrv904x_CpuCmd_t*)txBuf; + appInfo = (adrv904x_DfeAppFrameworkCmdAppCmd_t*)((uint8_t*)Cmd + sizeof(adrv904x_CpuCmd_t)); + appInfo->appCmdOpcode = ADRV904X_DFE_APP_FRAMEWORK_CMD_SYSTEM_STATUS; + SysStatusCmd = (adrv904x_DfeAppFrameworkCmdGetSysStatus_t*)((uint8_t*)Cmd + sizeof(adrv904x_CpuCmd_t) + sizeof(adrv904x_DfeAppFrameworkCmdAppCmd_t)) ; + SysStatusCmd->statusType = (adrv904x_CpuCmd_SysStatusType_t)type; + SysStatusCmd->sysObjId = ADRV904X_HTOCL(sysObjId); + SysStatusCmd->channelNum = ADRV904X_HTOCL(adrv904x_DfeChannelToChannelId(channel)); + + /* Then send it */ + recoveryAction = adrv904x_CpuCmdWrite(device, + cpuType, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CPU_CMD_ID_DFE_APPLICATION, + Cmd, + sizeof(adrv904x_DfeAppFrameworkCmdGetSysStatus_t) + sizeof(adrv904x_CpuCmd_t) + sizeof(adrv904x_DfeAppFrameworkCmdAppCmd_t)); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error sending GET_SYS_STATUS command."); + return recoveryAction; + } + + return recoveryAction; +} + +adi_adrv904x_ErrAction_e adrv904x_DfeGetSysStatusCmdResp(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + const size_t sysStatusSize, + void* const RxBuf, + const void** const SysStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmdId_t cmdId = 0U; + adrv904x_CpuCmdResp_t* Cmd = (adrv904x_CpuCmdResp_t*)RxBuf; + adrv904x_DfeAppFrameworkCmdGetSysStatusResp_t* CmdResp = (adrv904x_DfeAppFrameworkCmdGetSysStatusResp_t*)((uint8_t*)Cmd + sizeof(adrv904x_CpuCmdResp_t)); + adi_adrv904x_CpuType_e cpuType = ADI_ADRV904X_CPU_TYPE_DFE; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cmdErrorCode = ADRV904X_CPU_NO_ERROR; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, RxBuf); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, SysStatus); + + /* validate the input parameters */ + recoveryAction = adrv904x_DfeVerifyChannel(channel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + channel, + "channel parameter is invalid."); + return recoveryAction; + } + + if (sysStatusSize == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + sysStatusSize, + "Length is zero."); + return recoveryAction; + } + + /* Read the response from the CPU */ + recoveryAction = adrv904x_CpuCmdRespRead(device, + cpuType, + ADRV904X_LINK_ID_0, + &cmdId, + Cmd, + sizeof(adrv904x_CpuCmdResp_t) + sizeof(adrv904x_DfeAppFrameworkCmdGetSysStatusResp_t) + sysStatusSize, + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + if (cmdStatus == ADRV904X_CPU_CMD_STATUS_CMD_FAILED) + { + /* If the command failed for a command-specific reason, extract the command status code and log the error. */ + cmdErrorCode = (adrv904x_CpuErrorCode_e)ADRV904X_CTOHS(CmdResp->status); + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + cmdErrorCode, + "GET_SYS_STATUS command failed."); + return recoveryAction; + } + else + { + /* Otherwise log a generic command failed error */ + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error getting response for GET_SYS_STATUS command."); + return recoveryAction; + } + } + + /* Find the sys status in the response payload, and set the caller's pointer to it. */ + *SysStatus = (void*)((uint8_t*)CmdResp + sizeof(adrv904x_DfeAppFrameworkCmdGetSysStatusResp_t)); + + return recoveryAction; +} + +adi_adrv904x_ErrAction_e adrv904x_DfeSysStatusGet(adi_adrv904x_Device_t* const device, + const adrv904x_CpuObjectId_e objId, + const adi_adrv904x_Channels_e channel, + adi_adrv904x_CpuSysStatus_t* const status) +{ + adi_adrv904x_CpuSysStatus_t* SysStatus = NULL; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + char rxBuf[ADRV904X_CPU_CMD_RESP_MAX_SIZE_BYTES]; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, status); + + /* validate the input parameters */ + recoveryAction = adrv904x_DfeVerifyChannel(channel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + channel, + "channel parameter is invalid."); + return recoveryAction; + } + + /* Send the sys status get command to the CPU */ + recoveryAction = adrv904x_DfeSendSysStatusCmd(device, + ADRV904X_DFE_FRAMEWORK_CMD_SYS_STATUS_PUBLIC, + objId, + channel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "SendSysStatusCmd failed"); + return recoveryAction; + } + + ADI_LIBRARY_MEMSET(&rxBuf, 0, sizeof(rxBuf)); + + /* Get the response from the CPU */ + recoveryAction = adrv904x_DfeGetSysStatusCmdResp(device, + channel, + sizeof(adi_adrv904x_CpuSysStatus_t), + (void*)&rxBuf[0], + (const void** const)&SysStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "GetSysStatusCmdResp failed"); + return recoveryAction; + } + + if (SysStatus != NULL) + { + /* Translate the response from the CPU */ + status->errorCode = ADRV904X_CTOHL(SysStatus->errorCode); + status->placeHolder = ADRV904X_CTOHL(SysStatus->placeHolder); + } + + return recoveryAction; +} + +adi_adrv904x_ErrAction_e adrv904x_DfeEccEnableSet(adi_adrv904x_Device_t* const device, + const uint32_t eccEnableMemRegion) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cmdErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_NO_ERROR; + + adrv904x_DfeSvcCmdEccEnableSet_t eccEnableSet; + adrv904x_DfeSvcCmdEccEnableSetResp_t eccEnableSetRsp; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_LIBRARY_MEMSET(&eccEnableSet, 0, sizeof(adrv904x_DfeSvcCmdEccEnableSet_t)); + ADI_LIBRARY_MEMSET(&eccEnableSetRsp, 0, sizeof(adrv904x_DfeSvcCmdEccEnableSetResp_t)); + + eccEnableSet.eccEnableMemRegion = ADRV904X_HTOCL(eccEnableMemRegion); + + /* validate input parameters */ + if ((eccEnableSet.eccEnableMemRegion == 0u) || + (eccEnableSet.eccEnableMemRegion > ADRV904X_DFE_MAX_ECC_SECTIONS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + eccEnableMemRegion, + "Invalid eccEnableMemRegion provided."); + return recoveryAction; + } + else + { + /* Send command and receive response */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_ECC_ENABLE_SET, + (void *)&eccEnableSet, + sizeof(adrv904x_DfeSvcCmdEccEnableSet_t), + (void *)&eccEnableSetRsp, + sizeof(adrv904x_DfeSvcCmdEccEnableSetResp_t), + &cmdStatus); + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + /* If the command failed for a command-specific reason, extract the command status code and log the error. */ + cmdErrorCode = (adi_adrv904x_DfeSvcErrCode_e)ADRV904X_CTOHL(eccEnableSetRsp.status); + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + cmdErrorCode, + "ECC Enable Set command failed."); + } + + return recoveryAction; +} + +adi_adrv904x_ErrAction_e adrv904x_DfeEccEnableGet(adi_adrv904x_Device_t* const device, + uint32_t* const eccEnableMemRegion) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cmdErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_NO_ERROR; + + adrv904x_DfeSvcCmdEccEnableGetResp_t eccEnableGetRsp; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_LIBRARY_MEMSET(&eccEnableGetRsp, 0, sizeof(adrv904x_DfeSvcCmdEccEnableGetResp_t)); + + /* Send command and receive response */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_ECC_ENABLE_GET, + 0U, + 0U, + (void *)&eccEnableGetRsp, + sizeof(adrv904x_DfeSvcCmdEccEnableGetResp_t), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + /* If the command failed for a command-specific reason, extract the command status code and log the error. */ + cmdErrorCode = (adi_adrv904x_DfeSvcErrCode_e)ADRV904X_CTOHL(eccEnableGetRsp.status); + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + cmdErrorCode, + "ECC Enable Get command failed."); + return recoveryAction; + } + + *eccEnableMemRegion = ADRV904X_CTOHL(eccEnableGetRsp.eccEnabledMemRegion); + + return recoveryAction; +} + +adi_adrv904x_ErrAction_e adrv904x_DfeLastErrorCodeGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeSvcLogTraceErrLog_t* const lastErrorCode) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + const uint32_t MAXNUM_ERROBJ = sizeof(adi_adrv904x_DfeSvcLogTraceErrLog_t) / sizeof(adi_adrv904x_DfeSvcLogTraceErrLogData_t); + const uint32_t MSW_64BIT_CONVERSION = 32U; + uint32_t loop = 0U; + uint32_t address = 0u; + uint32_t errLogCode = 0U; + uint32_t errLogLevel = 0U; + uint32_t tempLogTimeStamp = 0U; + uint64_t errLogTimeStamp = 0U; + + adi_adrv904x_DfeSvcLogTraceErrLogData_t* pLastErrorData = (adi_adrv904x_DfeSvcLogTraceErrLogData_t*)lastErrorCode; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, lastErrorCode); + + /* Get DFE errorCode addresses from CPU */ + recoveryAction = adrv904x_DfeSdkDataAddrGet(device, &address); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE last errorCode address"); + return recoveryAction; + } + address += ADI_LIBRARY_OFFSETOF(adrv904x_DfeSvcBbicBridgeSdkData_t, errLogData); + + for (loop = 0U; loop < MAXNUM_ERROBJ; loop++) + { + /* Read and Store the DFE errorCodes */ + recoveryAction = adi_adrv904x_Register32Read(device, NULL, address, (uint32_t*)&errLogCode, 0xFFFFFFFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE last error Code"); + return recoveryAction; + } + + address += sizeof(uint32_t); + recoveryAction = adi_adrv904x_Register32Read(device, NULL, address, (uint32_t*)&errLogLevel, 0xFFFFFFFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE last error Level"); + return recoveryAction; + } + + address += sizeof(uint32_t); + recoveryAction = adi_adrv904x_Register32Read(device, NULL, address, (uint32_t*)&tempLogTimeStamp, 0xFFFFFFFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE last error TimeStamp"); + return recoveryAction; + } + errLogTimeStamp = tempLogTimeStamp; + + address += sizeof(uint32_t); + recoveryAction = adi_adrv904x_Register32Read(device, NULL, address, (uint32_t*)&tempLogTimeStamp, 0xFFFFFFFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE last error TimeStamp"); + return recoveryAction; + } + errLogTimeStamp |= ((uint64_t)(tempLogTimeStamp) << MSW_64BIT_CONVERSION); + + address += sizeof(uint32_t); + pLastErrorData->errLogCode = ADRV904X_CTOHL(errLogCode); + pLastErrorData->errLogLevel = ADRV904X_CTOHL(errLogLevel); + pLastErrorData->errLogTimeStamp = ADRV904X_CTOHLL(errLogTimeStamp); + pLastErrorData++; + } + + return recoveryAction; +} + +ADI_API void adrv904x_DfeCpuErrorDebugCheck(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_ErrSource_e errSrc = ADI_ADRV904X_ERRSRC_NONE; + adi_adrv904x_ErrorInfo_t error = { 0, NULL, NULL, ADI_ADRV904X_ERR_ACT_NONE, NULL }; + uint32_t dfeException = 0U; + const uint32_t DFE_SVC_LOGTRACE_NUM_OBJECTS = sizeof(adi_adrv904x_DfeSvcLogTraceErrLog_t) / sizeof(adi_adrv904x_DfeSvcLogTraceErrLogData_t); + adi_adrv904x_DfeSvcLogTraceErrLog_t lastError; + adi_adrv904x_DfeSvcLogTraceErrLogData_t* lastErrorLogData = (adi_adrv904x_DfeSvcLogTraceErrLogData_t*)&lastError; + uint32_t i = 0U; + adi_adrv904x_DfeSvcLogTraceErrLogData_t highestSeverity; + + if (device == NULL) + { + return; + } + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + if ((device->devStateInfo.devState & ADI_ADRV904X_STATE_DFECPULOADED) == ADI_ADRV904X_STATE_DFECPULOADED) + { + /* DFE Loaded; Not Booted */ + recoveryAction = adi_adrv904x_DfeCpuCheckException(device, &dfeException); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DFE CPU Exception Check Issue"); + /* Continue Debug */ + } + + if (dfeException != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_DEVICE; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, dfeException, "DFE CPU Exception Detected"); + /* Continue Debug */ + } + } + + (void) ADI_LIBRARY_MEMSET(&lastError, 0, sizeof(adi_adrv904x_DfeSvcLogTraceErrLog_t)); + + (void) ADI_LIBRARY_MEMSET(&highestSeverity, 0, sizeof(adi_adrv904x_DfeSvcLogTraceErrLogData_t)); + + recoveryAction = adrv904x_DfeLastErrorCodeGet(device, &lastError); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return; + } + + /* Report Highest Severity Action */ + + for (i = 0U; i < DFE_SVC_LOGTRACE_NUM_OBJECTS; ++i) + { + if (lastErrorLogData->errLogCode != 0U) + { + if ((lastErrorLogData->errLogLevel > highestSeverity.errLogLevel) && + (lastErrorLogData->errLogTimeStamp > highestSeverity.errLogTimeStamp)) + { + highestSeverity.errLogCode = lastErrorLogData->errLogCode; + highestSeverity.errLogLevel = lastErrorLogData->errLogLevel; + highestSeverity.errLogTimeStamp = lastErrorLogData->errLogTimeStamp; + } + } + + ++lastErrorLogData; + } + + if (highestSeverity.errLogCode != 0U) + { + /* APP & SVC Error Codes are routed through this API & Structure */ + if (highestSeverity.errLogCode > 0xE000U) + { + errSrc = ADI_ADRV904X_ERRSRC_DFE_APP_RUNTIME; + } + else + { + errSrc = ADI_ADRV904X_ERRSRC_DFE_SVC_RUNTIME; + } + + /* ErrCause is captured once; Not Reporting Error Cause at this point */ + + ADI_ADRV904X_ERROR_INFO_GET(ADI_ADRV904X_ERRSRC_DFE_APP_RUNTIME, + highestSeverity.errLogCode, + highestSeverity.errLogLevel, + recoveryAction, + error); + + ADI_ERROR_REPORT( &device->common, + errSrc, + highestSeverity.errLogCode, + error.actionCode, + highestSeverity.errLogLevel, + error.errMsg); + } + + (void) recoveryAction; +} \ No newline at end of file diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_dfe_dpd.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_dfe_dpd.c new file mode 100644 index 00000000000..b31e3872369 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_dfe_dpd.c @@ -0,0 +1,642 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adrv904x_dfe_dpd.c +* +* \brief Contains ADRV904X DFE DPD related private function implementations +* +* ADRV904X API Version: 2.10.0.4 +*/ +#include "adi_adrv904x_dfe_cal_dpd_types.h" +#include "../../private/include/adrv904x_dfe_dpd.h" +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_DFE_DPD + + +adi_adrv904x_ErrAction_e adrv904x_DpdModelConfigDpdSetRangeCheck(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdModelType_e dpdModelType, + const adi_adrv904x_DfeAppCalDpdModelDesc_t* const modelDesc) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, modelDesc); + + if (((dpdTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (dpdTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + if (dpdModelType > ADI_ADRV904X_DFE_APP_CAL_DPD_MODEL_TYPE_DPD_3) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdModelType, + "Invalid DPD Model is selected. Valid values must be less than 3(ADI_ADRV904X_DFE_APP_CAL_DPD_MODEL_TYPE_DPD_3)"); + return recoveryAction; + } + + if ((modelDesc->features == 0u) || (modelDesc->features > ADI_ADRV904X_DFE_APP_CAL_DPD_MAX_NUM_FEATURES)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + modelDesc->features, + "modelDesc->features should be 1 ~ 510."); + return recoveryAction; + } + + if (modelDesc->dpdPartial.partial > ADI_ADRV904X_DFE_APP_CAL_DPD_TYPE_CTC_1) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + modelDesc->dpdPartial.partial, + "Invalid modelDesc->dpdPartial.partial is selected, modelDesc->dpdPartial should be DPD, CTC1 or CTC2 "); + return recoveryAction; + } + + if (modelDesc->mode > ADI_ADRV904X_DFE_APP_CAL_DPD_ACT_GMP_DDR_MODE7) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + modelDesc->mode, + "Invalid modelDesc->mode is selected, modelDesc->mode should be 0~7 "); + return recoveryAction; + } + + if (modelDesc->actDepth > ADI_ADRV904X_DFE_APP_CAL_DPD_ACT_DEPTH_16) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + modelDesc->actDepth, + "Invalid modelDesc->actDepth is selected, modelDesc->mode should be 0/1/2 "); + return recoveryAction; + } + + for (uint16_t i = 0; i < modelDesc->features; i++) + { + if (modelDesc->feature[i].poly != ADI_ADRV904X_DFE_APP_CAL_DPD_ACT_POLY_GMP0 && + modelDesc->feature[i].poly != ADI_ADRV904X_DFE_APP_CAL_DPD_ACT_POLY_GMP1 && + modelDesc->feature[i].poly != ADI_ADRV904X_DFE_APP_CAL_DPD_ACT_POLY_DDR7 && + modelDesc->feature[i].poly != ADI_ADRV904X_DFE_APP_CAL_DPD_ACT_POLY_DDR8 && + modelDesc->feature[i].poly != ADI_ADRV904X_DFE_APP_CAL_DPD_ACT_POLY_DDR9) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + modelDesc->feature[i].poly, + "Invalid feature[i].poly is selected, feature[i].poly should be 0/1/7/8/9 "); + return recoveryAction; + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +adi_adrv904x_ErrAction_e adrv904x_DpdModelConfigCtcSetRangeCheck(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdModelType_e dpdModelType, + const adi_adrv904x_DfeAppCalCtcModelDesc_t* const modelDesc) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, modelDesc); + + if (((dpdTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (dpdTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + if ((dpdModelType > ADI_ADRV904X_DFE_APP_CAL_DPD_MODEL_TYPE_CTC_4) || (dpdModelType < ADI_ADRV904X_DFE_APP_CAL_DPD_MODEL_TYPE_CTC_0)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdModelType, + "Invalid CTC Model is selected. Valid values must be 3/4/5/6/7"); + return recoveryAction; + } + + if (modelDesc->features == 0u) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + modelDesc->features, + "modelDesc->features should be 1 ~ 255."); + return recoveryAction; + } + + if (modelDesc->ctcPartial.partial > ADI_ADRV904X_DFE_APP_CAL_DPD_TYPE_CTC_1) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + modelDesc->ctcPartial.partial, + "Invalid modelDesc->ctcPartial.partial is selected, modelDesc->dpdPartial should be DPD, CTC1 or CTC2 "); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +adi_adrv904x_ErrAction_e adrv904x_DpdActuatorGainMonitorConfigSetRangeCheck(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdPowerMeterCfg_t* const dpdPowerMeterCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const uint32_t ADI_ADRV904X_DPDINOUT_PWR_MEASDURATION_MAX = 24u; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, dpdPowerMeterCfg); + + if (((dpdTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (dpdTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + if (dpdPowerMeterCfg->dpdInOutPwrMeasDuration > ADI_ADRV904X_DPDINOUT_PWR_MEASDURATION_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdPowerMeterCfg->dpdInOutPwrMeasDuration, + "dpdInOutPwrMeasDuration should be 0 ~ 24."); + return recoveryAction; + } + + if (dpdPowerMeterCfg->dpdInOutPwrMeasEn > 0x1u) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdPowerMeterCfg->dpdInOutPwrMeasEn, + "Invalid dpdInOutPwrMeasEn, 0 is for disable and 1 is for enable "); + return recoveryAction; + } + + if ((dpdPowerMeterCfg->modelTableForMinGainLim != 1U) && + (dpdPowerMeterCfg->modelTableForMinGainLim != 2U) && + (dpdPowerMeterCfg->modelTableForMinGainLim != 4U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdPowerMeterCfg->modelTableForMinGainLim, + "Invalid model for min gain limit violation. Valid values are 1, 2 or 4 (Unity)"); + return recoveryAction; + } + + if ((dpdPowerMeterCfg->modelTableForMaxGainLim != 1U) && + (dpdPowerMeterCfg->modelTableForMaxGainLim != 2U) && + (dpdPowerMeterCfg->modelTableForMaxGainLim != 4U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdPowerMeterCfg->modelTableForMaxGainLim, + "Invalid model for max gain limit violation. Valid values are 1, 2 or 4 (Unity)"); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +adi_adrv904x_ErrAction_e adrv904x_DpdCaptureConfigSetRangeCheck(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdCaptureCfg_t* const dpdCaptureCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const uint32_t ADI_ADRV904X_DPD_MAX_CAP_SAMPLE = 4096u; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, dpdCaptureCfg); + + if (((dpdTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (dpdTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + if (dpdCaptureCfg->capPeakDetCfg.windowLength < ADI_ADRV904X_DPD_MAX_CAP_SAMPLE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdCaptureCfg->capPeakDetCfg.windowLength, + "Invalid window length is selected. window length has to be greater than maximum capture sample"); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +adi_adrv904x_ErrAction_e adrv904x_DpdTrackingConfigSetRangeCheck(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdTrackCfg_t* const dpdTrackCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, dpdTrackCfg); + + static const uint32_t MAX_NUMBER_OF_MULTIFRAMES = 600U; + static const uint32_t MIN_NUMBER_OF_MULTIFRAMES = 1U; + + if (((dpdTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (dpdTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + if (dpdTrackCfg->adapt.featureFilterEn > 0x1u) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->adapt.featureFilterEn, + "Invalid featureFilterEn is selected. 1 is for enable and 0 is for disable."); + return recoveryAction; + } + + if (dpdTrackCfg->runClgc > 0x1u) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->runClgc, + "Invalid runClgc is selected. 1 is for enable and 0 is for disable."); + return recoveryAction; + } + + if (dpdTrackCfg->useLegacyGainPhaseComp > 0x1u) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->useLegacyGainPhaseComp, + "Invalid useLegacyGainPhaseComp is selected. 1 is for enable and 0 is for disable."); + return recoveryAction; + } + + if (dpdTrackCfg->updateMode > ADI_ADRV904X_DFE_APP_CAL_DPD_UPDATE_MODE_CMT_3_MODEL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->updateMode, + "Invalid dpdTrackCfg updateMode is selected. updateMode should be 0/1/2/3"); + return recoveryAction; + } + + if (dpdTrackCfg->forceDirect > 0x1u) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->forceDirect, + "Invalid forceDirect is selected. 1 is for enable and 0 is for disable."); + return recoveryAction; + } + + if (dpdTrackCfg->mu > 100u) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->mu, + "Invalid dpdTrackCfg->mu is selected. It should not be larger than 100 "); + return recoveryAction; + } + + if ((dpdTrackCfg->lowPowerActionModel != 1U) && + (dpdTrackCfg->lowPowerActionModel != 2U) && + (dpdTrackCfg->lowPowerActionModel != 4U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->lowPowerActionModel, + "Invalid model for lowPowerActionModel. Valid values are 1, 2 or 4 (Unity)"); + return recoveryAction; + } + + if ((dpdTrackCfg->numberOfMultiFrames < MIN_NUMBER_OF_MULTIFRAMES) || (dpdTrackCfg->numberOfMultiFrames > MAX_NUMBER_OF_MULTIFRAMES)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + dpdTrackCfg->numberOfMultiFrames, + "Invalid dpdTrackCfg->numberOfMultiFrames is selected. Range is [1-600] "); + return recoveryAction; + } + + if ((dpdTrackCfg->adapt.numDpdSamples < 0x1000U) || + (dpdTrackCfg->adapt.numDpdSamples > 0x8000U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->adapt.numDpdSamples, + "Invalid numDpdSamples is selected. Valid value is within 4096 (0x1000) and 32,768 (0x8000)."); + return recoveryAction; + } + + if (dpdTrackCfg->mThresholdDB > 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->mThresholdDB, + "Invalid mThresholdDB is selected. Valid value is negative number."); + return recoveryAction; + } + + if (dpdTrackCfg->cThresholdDB > 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->cThresholdDB, + "Invalid cThresholdDB is selected. Valid value is negative number."); + return recoveryAction; + } + + for(uint8_t i=0; iindirectRegValue[i] > 63U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->indirectRegValue[i], + "Invalid indirectRegVal is selected. Valid value is within 0 and 63."); + return recoveryAction; + } + } + + if (dpdTrackCfg->directRegValue > 63U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->directRegValue, + "Invalid directRegVal is selected. Valid value is within 0 and 63."); + return recoveryAction; + } + + if (dpdTrackCfg->ctc1StatsSampleNum > 1112u) + { + /* maximum number of samples (in ctc1 stats Collection) is equal to (140-1) * 8 + * where 140 is the burst count in each capture, 1 is due to the HW bug, + * and 8 is the maximum number of the captures. + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->ctc1StatsSampleNum, + "Invalid ctc1StatsSampleNum is selected. Maximum value is 1112."); + return recoveryAction; + } + + if (dpdTrackCfg->ctc1ManualEnabled > 0x1u) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->ctc1ManualEnabled, + "Invalid ctc1ManualEnabled is selected. 1 is for enable and 0 is for disable."); + return recoveryAction; + } + + + if (dpdTrackCfg->ctc1DeltaPercentage > 20u) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->ctc1DeltaPercentage, + "Invalid ctc1DeltaPercentage is selected. Maximum value is 20."); + return recoveryAction; + } + + for(uint8_t i=0; i<3; i++) + { + if (dpdTrackCfg->ctc1PeakRankRatio[i] > 100U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->ctc1PeakRankRatio[i], + "Invalid ctc1PeakRankRatio is selected. Valid value is within 0 and 100."); + return recoveryAction; + } + } + + for(uint8_t i=0; i<3; i++) + { + if (dpdTrackCfg->ctc1CaptureWeighting[i] > 8U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->ctc1CaptureWeighting[i], + "Invalid ctc1CaptureWeighting is selected. Valid value is within 0 and 8."); + return recoveryAction; + } + } + + if ((dpdTrackCfg->wbRegEnable != 0u) && + (dpdTrackCfg->wbRegEnable != 1u)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->wbRegEnable, + "Invalid wbRegEnable is selected. Valid value is 0/1 "); + return recoveryAction; + } + + if ((dpdTrackCfg->wbRegMode != 0U) && + (dpdTrackCfg->wbRegMode != 0x1U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->wbRegMode, + "Invalid wbRegMode is selected. Valid value is 0/1."); + return recoveryAction; + } + + if ((dpdTrackCfg->wbRegAlpha < 0.0f) || + (dpdTrackCfg->wbRegAlpha > 1.0f)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->wbRegAlpha, + "Invalid wbRegAlpha is selected. Valid value is within 0.0 and 1.0 "); + return recoveryAction; + } + + if ((dpdTrackCfg->wbRegBeta < 0.0f) || + (dpdTrackCfg->wbRegBeta > 1.0f)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->wbRegBeta, + "Invalid wbRegBeta is selected. Valid value is within 0.0 and 1.0 "); + return recoveryAction; + } + + if ((dpdTrackCfg->bwDetCfg.bwDetEn != 0u) && + (dpdTrackCfg->bwDetCfg.bwDetEn != 1u)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->bwDetCfg.bwDetEn, + "Invalid bwDetEn is selected. Valid value is 0/1 "); + return recoveryAction; + } + + if (dpdTrackCfg->bwDetCfg.corrLagMax > 4095u) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->bwDetCfg.corrLagMax, + "Invalid corrLagMax is selected. Valid value is within 0:4095 "); + return recoveryAction; + } + + if ((dpdTrackCfg->bwDetCfg.loBwBeta2Thres < 0.0f) || + (dpdTrackCfg->bwDetCfg.loBwBeta2Thres > 1.0f)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->bwDetCfg.loBwBeta2Thres, + "Invalid loBwBeta2Thres is selected. Valid value is within 0.0 and 1.0 "); + return recoveryAction; + } + + if ((dpdTrackCfg->bwDetCfg.hiBwBeta2Thres < 0.0f) || + (dpdTrackCfg->bwDetCfg.hiBwBeta2Thres > 1.0f)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->bwDetCfg.hiBwBeta2Thres, + "Invalid hiBwBeta2Thres is selected. Valid value is within 0.0 and 1.0 "); + return recoveryAction; + } + + if ((dpdTrackCfg->bwDetCfg.alphaTrack < 0.0f) || + (dpdTrackCfg->bwDetCfg.alphaTrack > 1.0f)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTrackCfg->bwDetCfg.alphaTrack, + "Invalid alphaTrack is selected. Valid value is within 0.0 and 1.0 "); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +adi_adrv904x_ErrAction_e adrv904x_DpdTddLutSwitchCfgSetRangeCheck(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppDpdActTddLutSwitch_t* const tddLutSwitchConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, tddLutSwitchConfig); + + if (((dpdTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (dpdTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + if (tddLutSwitchConfig->txOnMdl0SwitchEn > 0x1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + tddLutSwitchConfig->txOnMdl0SwitchEn, + "Invalid tddLutSwitchConfig->txOnMdl0SwitchEn is selected. 1 is for enable and 0 is for disable."); + return recoveryAction; + } + + if (tddLutSwitchConfig->txOnMdl1SwitchEn > 0x1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + tddLutSwitchConfig->txOnMdl1SwitchEn, + "Invalid tddLutSwitchConfig->txOnMdl1SwitchEn is selected. 1 is for enable and 0 is for disable."); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_dfe_vswr.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_dfe_vswr.c new file mode 100644 index 00000000000..12c8dd883a0 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_dfe_vswr.c @@ -0,0 +1,55 @@ +/** +* Copyright 2023 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adrv904x_dfe_vswr.c +* \brief Contains VSWR feature related function implementations +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#include "adi_adrv904x_hal.h" +#include "../../private/include/adrv904x_tx.h" +#include "../../private/include/adrv904x_reg_addr_macros.h" + + +#include "../../private/bf/adrv904x_bf_tx_dfe_dig_regs.h" + + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_DFE_VSWR + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_VswrPlaybackDatNumOfSamplesInit(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e chanSel) +{ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + adrv904x_BfTxDfeDigRegsChanAddr_e txDfeDigBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DFE_DIG_REGS; + + recoveryAction = adrv904x_TxDfeDigBitfieldAddressGet(device, chanSel, &txDfeDigBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading dfe dig base address"); + return recoveryAction; + } + + /* Program the number of samples to 0 */ + recoveryAction = adrv904x_TxDfeDigRegs_TxVswrDataGenMaxSamples_BfSet(device, + NULL, + txDfeDigBaseAddr, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing number of samples"); + return recoveryAction; + } + + return recoveryAction; +} diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_gpio.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_gpio.c new file mode 100644 index 00000000000..d5094d94547 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_gpio.c @@ -0,0 +1,3996 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adrv904x_gpio.c + * \brief Contains ADRV904X gpio helper-utility related private function implementations + * + * ADRV904X API Version: 2.10.0.4 + */ + +#include "../../private/include/adrv904x_gpio.h" +#include "../../private/include/adrv904x_shared_resource_manager.h" +#include "../../private/include/adrv904x_rx.h" +#include "../../private/include/adrv904x_tx.h" +#include "../../private/bf/adrv904x_bf_core.h" +#include "../../private/bf/adrv904x_bf_rx_dig.h" +#include "../../private/bf/adrv904x_bf_orx_dig.h" +#include "../../private/bf/adrv904x_bf_tx_dig.h" + + #include "../../private/bf/adrv904x_bf_sequencer.h" + +#include "adi_adrv904x_gpio.h" + + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_GPIO + +/**************************************************************************** + * High Level GPIO Utility Functions + **************************************************************************** + */ + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioSignalGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + adi_adrv904x_GpioSignal_e* const signal, + uint32_t* const channelMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_SharedResourceID_e sharedResourceID = ADRV904X_SHARED_RESOURCE_INVALID; + adrv904x_FeatureID_e featureID = ADRV904X_FEATURE_UNUSED; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, signal); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, channelMask); + + /* Range check gpio */ + if ((gpio < ADI_ADRV904X_GPIO_00) || + (gpio >= ADI_ADRV904X_GPIO_INVALID)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. Out of range."); + return recoveryAction; + } + + /* Get the current feature for this gpio from the SRM */ + sharedResourceID = (adrv904x_SharedResourceID_e)gpio; + recoveryAction = adrv904x_SharedResourceFeatureGet(device, sharedResourceID, &featureID); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while retrieving feature for selected GPIO"); + return recoveryAction; + } + + /* Convert SRM feature to the associated gpio signal */ + recoveryAction = adrv904x_FromFeatureToSignalGet(device, featureID, signal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while retrieving signal for selected GPIO"); + return recoveryAction; + } + + /* Get channelMask from SRM */ + recoveryAction = adrv904x_SharedResourceChannelMaskGet(device, sharedResourceID, channelMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while getting channelMask"); + return recoveryAction; + } + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioSignalFind(adi_adrv904x_Device_t* const device, + adi_adrv904x_GpioPinSel_e* const gpio, + const adi_adrv904x_GpioSignal_e signal, + const adi_adrv904x_Channels_e channelSel) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_GpioSignal_e readbackSignal = ADI_ADRV904X_GPIO_SIGNAL_INVALID; + uint32_t readbackChannelMask = (uint32_t)ADI_ADRV904X_CHOFF; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, gpio); + + uint8_t gpioIterator = 0U; + + /* If this function returns INVALID gpio, it means selected signal isn't mapped to any GPIO */ + *gpio = ADI_ADRV904X_GPIO_INVALID; + + /* Range check signal. */ + if ((signal <= ADI_ADRV904X_GPIO_SIGNAL_UNUSED) || + (signal >= ADI_ADRV904X_GPIO_SIGNAL_NUM_SIGNALS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + signal, + "Invalid signal selected. Out of range."); + return recoveryAction; + } + + if ((channelSel != ADI_ADRV904X_CHOFF) && + (channelSel != ADI_ADRV904X_CH0) && + (channelSel != ADI_ADRV904X_CH1) && + (channelSel != ADI_ADRV904X_CH2) && + (channelSel != ADI_ADRV904X_CH3) && + (channelSel != ADI_ADRV904X_CH4) && + (channelSel != ADI_ADRV904X_CH5) && + (channelSel != ADI_ADRV904X_CH6) && + (channelSel != ADI_ADRV904X_CH7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + channelSel, + "Invalid channel selected"); + return recoveryAction; + } + + /* Check all GPIOs until we find the matching signal */ + for (gpioIterator = 0U; gpioIterator < (uint8_t)ADI_ADRV904X_GPIO_INVALID; gpioIterator++) + { + recoveryAction = adrv904x_GpioSignalGet(device, + (adi_adrv904x_GpioPinSel_e)gpioIterator, + &readbackSignal, + &readbackChannelMask); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read signal for selected GPIO"); + return recoveryAction; + } + + if ((readbackSignal == signal) && + (((readbackChannelMask & (uint32_t)channelSel) != 0U) || (readbackChannelMask == (uint32_t)channelSel))) + { + *gpio = (adi_adrv904x_GpioPinSel_e)gpioIterator; + break; + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioSignalRelease(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const adi_adrv904x_GpioSignal_e signal, + const uint32_t channelMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_GpioSignal_e initSignal = ADI_ADRV904X_GPIO_SIGNAL_UNUSED; + uint32_t initChannelMask = 0U; + adrv904x_FeatureID_e featureID = ADRV904X_FEATURE_UNUSED; + adrv904x_SharedResourceID_e sharedResourceID = ADRV904X_SHARED_RESOURCE_INVALID; + uint8_t resourceStatus = ADI_FAILURE; + uint8_t channelIdx = 0U; + adrv904x_GpioSignalInfo_t info = { ADI_ADRV904X_GPIO_SIGNAL_UNUSED, ADRV904X_GPIO_DOMAIN_NONE, ADRV904X_GPIO_ROUTE_OFF, 0U, 0U, 0 }; + uint8_t isValid = ADI_FALSE; + + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Range check gpio */ + if ((gpio < ADI_ADRV904X_GPIO_00) || + (gpio >= ADI_ADRV904X_GPIO_INVALID)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. Out of range."); + return recoveryAction; + } + + /* Range check signal. */ + if ((signal <= ADI_ADRV904X_GPIO_SIGNAL_UNUSED) || + (signal >= ADI_ADRV904X_GPIO_SIGNAL_NUM_SIGNALS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + signal, + "Invalid signal selected. Out of range."); + return recoveryAction; + } + + /* Get signal info struct */ + recoveryAction = adrv904x_GpioSignalInfoGet(device, signal, &info); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while obtaining signal info"); + return recoveryAction; + } + + /* Check that this signal is a digital gpio signal domain */ + if ((info.domain != ADRV904X_GPIO_DOMAIN_DIGITAL) && + (info.domain != ADRV904X_GPIO_DOMAIN_NONE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + info.domain, + "Selected GPIO signal is not valid for digital GPIO pins"); + return recoveryAction; + } + + /* Check channelMask validity for this signal's route type */ + recoveryAction = adrv904x_GpioRouteValidChannelMaskCheck( device, info.route, channelMask, &isValid ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while checking validity of channel Mask for GPIO signal"); + return recoveryAction; + } + if ( isValid == ADI_FALSE ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + channelMask, + "Selected channelMask is not valid for selected GPIO signal"); + return recoveryAction; + } + + /* Get the feature for the signal */ + recoveryAction = adrv904x_FromSignalToFeatureGet(device, signal, &featureID); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while feature for selected signal"); + return recoveryAction; + } + + /* Read the current signal for this gpio. Getter function will range check gpio */ + recoveryAction = adrv904x_GpioSignalGet(device, gpio, &initSignal, &initChannelMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while retrieving current signal for the selected gpio"); + return recoveryAction; + } + + /* If gpio is unused, then do nothing */ + if (initSignal == ADI_ADRV904X_GPIO_SIGNAL_UNUSED) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + /* If gpio is being used, then continue */ + else + { + /* signal is not channel instanced. Disconnect in hardware */ + if ( channelMask == 0U ) + { + /* Disconnect signal from GPIO in hardware */ + recoveryAction = adrv904x_GpioConnect( device, ADI_DISABLE, gpio, &info, 0U ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while disconnecting GPIO from signal"); + return recoveryAction; + } + + /* Release the shared resource for the feature */ + sharedResourceID = (adrv904x_SharedResourceID_e)gpio; + recoveryAction = adrv904x_SharedResourceRelease(device, sharedResourceID, featureID, &resourceStatus); + if ((recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) || + (resourceStatus != ADI_SUCCESS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while attempting to release shared resource"); + return recoveryAction; + } + } + + /* signal is channel-instanced, Disconnect selected channels in hardware */ + else + { + for ( channelIdx = 0U; channelIdx < 8U; channelIdx++ ) + { + if ( ((channelMask >> channelIdx) & 1U) == 1U ) + { + /* Disconnect signal/chIdx from GPIO in hardware */ + recoveryAction = adrv904x_GpioConnect( device, ADI_DISABLE, gpio, &info, channelIdx ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while disconnecting GPIO from signal"); + return recoveryAction; + } + + /* Release the shared resource for the feature */ + sharedResourceID = (adrv904x_SharedResourceID_e)gpio; + recoveryAction = adrv904x_SharedResourceRelease(device, sharedResourceID, featureID, &resourceStatus); + if ((recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) || + (resourceStatus != ADI_SUCCESS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while attempting to release shared resource"); + return recoveryAction; + } + + /* Update channelMask by clearing bit for this channelIdx. Save channelMask */ + initChannelMask &= ~(1U << channelIdx); + recoveryAction = adrv904x_SharedResourceChannelMaskSet(device, sharedResourceID, initChannelMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while set channelMask"); + return recoveryAction; + } + } /* end of ifblock for channel included in channelMask */ + + } /* end channel idx for loop */ + } /* end else block for channel-indexed signals */ + } /* end else block for a used GPIO */ + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioSignalSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const adi_adrv904x_GpioSignal_e signal, + const uint32_t channelMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t isValid = ADI_FALSE; + uint32_t pinRequest = 1U; + adi_adrv904x_GpioPinSel_e prevGpio = ADI_ADRV904X_GPIO_INVALID; + adrv904x_SharedResourceID_e sharedResourceID = ADRV904X_SHARED_RESOURCE_INVALID; + adrv904x_FeatureID_e featureID = ADRV904X_FEATURE_UNUSED; + adi_adrv904x_GpioSignal_e initSig = ADI_ADRV904X_GPIO_SIGNAL_UNUSED; + uint32_t initChannelMask = 0U; + uint8_t channelIdx = 0U; + uint32_t chanSel = 0U; + adrv904x_GpioSignalInfo_t info = { ADI_ADRV904X_GPIO_SIGNAL_UNUSED, ADRV904X_GPIO_DOMAIN_NONE, ADRV904X_GPIO_ROUTE_OFF, 0U, 0U, 0 }; + uint8_t resourceStatus = ADI_FAILURE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Range check gpio */ + if ((gpio < ADI_ADRV904X_GPIO_00) || + (gpio >= ADI_ADRV904X_GPIO_INVALID)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. Out of range."); + return recoveryAction; + } + + /* Range check signal. */ + if ((signal <= ADI_ADRV904X_GPIO_SIGNAL_UNUSED) || + (signal >= ADI_ADRV904X_GPIO_SIGNAL_NUM_SIGNALS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + signal, + "Invalid signal selected. Out of range."); + return recoveryAction; + } + + /* Get signal info struct */ + /* Run checks against selected gpio channelMask */ + recoveryAction = adrv904x_GpioSignalInfoGet(device, signal, &info); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while obtaining signal info"); + return recoveryAction; + } + + /* Check that this signal is a digital gpio signal domain */ + if (info.domain != ADRV904X_GPIO_DOMAIN_DIGITAL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + info.domain, + "Selected GPIO signal is not valid for digital GPIO pins"); + return recoveryAction; + } + + /* Check that the user selected a gpio pin allowed by the select signal's pinMask */ + pinRequest = (1U << (uint32_t)(gpio)); + if ( (pinRequest & info.pinMask) != pinRequest) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Selected GPIO cannot be used to route the requested signal."); + return recoveryAction; + } + + /* Check channelMask validity for this signal's route type */ + recoveryAction = adrv904x_GpioRouteValidChannelMaskCheck( device, info.route, channelMask, &isValid ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while checking validity of channel Mask for GPIO signal"); + return recoveryAction; + } + if ( isValid == ADI_FALSE ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + channelMask, + "Selected channelMask is not valid for selected GPIO signal"); + return recoveryAction; + } + + /* Get SRM featureID that maps to the requested signal */ + recoveryAction = adrv904x_FromSignalToFeatureGet( device, signal, &featureID); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while feature for selected signal"); + return recoveryAction; + } + + /* If signal is not channel-instanced, release any other GPIO currently routing sig that are about to be set */ + if ( channelMask == 0U ) + { + recoveryAction = adrv904x_GpioSignalFind( device, &prevGpio, signal, ADI_ADRV904X_CHOFF ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while finding GPIO routing selected signal"); + return recoveryAction; + } + + /* If prevGpio shows a pin other than the target is routing the signal, release it */ + if ( (prevGpio != ADI_ADRV904X_GPIO_INVALID) && (prevGpio != gpio) ) + { + recoveryAction = adrv904x_GpioSignalRelease( device, prevGpio, signal, channelMask ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while finding GPIO routing selected signal"); + return recoveryAction; + } + } + + /* if prevGpio was not the target, connect the signal to target */ + if (prevGpio != gpio) + { + + /* Call GpioSignalGet() for target GPIO. If UNUSED, setup. Else failure. */ + recoveryAction = adrv904x_GpioSignalGet( device, gpio, &initSig, &initChannelMask ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error retrieving current status of target GPIO"); + return recoveryAction; + } + if ( initSig != ADI_ADRV904X_GPIO_SIGNAL_UNUSED ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. GPIO already in use by another signal"); + return recoveryAction; + } + + /* Acquire Shared Resource */ + sharedResourceID = (adrv904x_SharedResourceID_e)gpio; + resourceStatus = ADI_FAILURE; + recoveryAction = adrv904x_SharedResourceAcquire(device, sharedResourceID, featureID, &resourceStatus); + if ((recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) || + (resourceStatus != ADI_SUCCESS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while acquiring shared resource"); + return recoveryAction; + } + + /* Save channelMask */ + recoveryAction = adrv904x_SharedResourceChannelMaskSet(device, sharedResourceID, 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while set channelMask"); + return recoveryAction; + } + + /* Connect signal to GPIO in hardware */ + recoveryAction = adrv904x_GpioConnect( device, ADI_ENABLE, gpio, &info, 0U ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while connecting GPIO to signal"); + return recoveryAction; + } + } + } + + /* If channel-instanced signal, release any other GPIO currently routing EACH sig/chan that are about to be set */ + else + { + for (channelIdx = 0U; channelIdx < 8U; channelIdx++) + { + chanSel = 1U << channelIdx; + if ( ((channelMask >> channelIdx) & 1U) == 1U ) + { + /* This channel is in the channelMask. Search for GPIO to release */ + recoveryAction = adrv904x_GpioSignalFind(device, &prevGpio, signal, (adi_adrv904x_Channels_e)(chanSel)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while finding GPIO routing selected signal"); + return recoveryAction; + } + + /* If prevGpio shows a pin other than the target is routing the signal/chIdx, release it */ + if ( (prevGpio != ADI_ADRV904X_GPIO_INVALID) && (prevGpio != gpio) ) + { + recoveryAction = adrv904x_GpioSignalRelease( device, prevGpio, signal, (adi_adrv904x_Channels_e)(1U << channelIdx) ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while finding GPIO routing selected signal"); + return recoveryAction; + } + } + + /* if prevGpio was not the target, connect the signal/chIdx to target */ + if (prevGpio != gpio) + { + /* Call GpioSignalGet() for target GPIO. If UNUSED or already the target signal, setup. Else failure. */ + recoveryAction = adrv904x_GpioSignalGet( device, gpio, &initSig, &initChannelMask ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error retrieving current status of target GPIO"); + return recoveryAction; + } + if ( (initSig != ADI_ADRV904X_GPIO_SIGNAL_UNUSED) && + (initSig != signal ) ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. GPIO already in use by another signal"); + return recoveryAction; + } + + /* Acquire Shared Resource */ + sharedResourceID = (adrv904x_SharedResourceID_e)gpio; + resourceStatus = ADI_FAILURE; + recoveryAction = adrv904x_SharedResourceAcquire(device, sharedResourceID, featureID, &resourceStatus); + if ((recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) || + (resourceStatus != ADI_SUCCESS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while acquiring shared resource"); + return recoveryAction; + } + + /* Update chanelMask by setting bit for this channelIdx. Save channelMask */ + initChannelMask |= (1U << channelIdx); + recoveryAction = adrv904x_SharedResourceChannelMaskSet(device, sharedResourceID, initChannelMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while set channelMask"); + return recoveryAction; + } + + /* Connect signal to GPIO in hardware */ + recoveryAction = adrv904x_GpioConnect( device, ADI_ENABLE, gpio, &info, channelIdx ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while finding connecting GPIO to signal"); + return recoveryAction; + } + } + + } /* end if block for channelMask including channelIdx */ + } /* end for loop over channelIdx */ + } /* end channel-instanced signal "else" block */ + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioAnalogSignalGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioAnaPinSel_e gpio, + adi_adrv904x_GpioSignal_e* const signal, + uint32_t* const channelMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_SharedResourceID_e sharedResourceID = ADRV904X_SHARED_RESOURCE_INVALID; + uint32_t sharedResourceIdVal = 0U; + adrv904x_FeatureID_e featureID = ADRV904X_FEATURE_UNUSED; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, signal); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, channelMask); + + /* Range check gpio */ + if ((gpio < ADI_ADRV904X_GPIO_ANA_00) || + (gpio >= ADI_ADRV904X_GPIO_ANA_INVALID)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. Out of range."); + return recoveryAction; + } + + /* Get the current feature for this gpio from the SRM */ + sharedResourceIdVal = (uint32_t)gpio + (uint32_t)ADRV904X_GPIO_ANA_00; + sharedResourceID = (adrv904x_SharedResourceID_e)(sharedResourceIdVal); + recoveryAction = adrv904x_SharedResourceFeatureGet(device, sharedResourceID, &featureID); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while retrieving feature for selected GPIO"); + return recoveryAction; + } + + /* Convert SRM feature to the associated gpio signal */ + recoveryAction = adrv904x_FromFeatureToSignalGet(device, featureID, signal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while retrieving signal for selected GPIO"); + return recoveryAction; + } + + /* Get channelMask from SRM */ + recoveryAction = adrv904x_SharedResourceChannelMaskGet(device, sharedResourceID, channelMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while get channelMask"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioAnalogSignalFind(adi_adrv904x_Device_t* const device, + adi_adrv904x_GpioAnaPinSel_e* const gpio, + const adi_adrv904x_GpioSignal_e signal, + const adi_adrv904x_Channels_e channelSel) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_GpioSignal_e readbackSignal = ADI_ADRV904X_GPIO_SIGNAL_INVALID; + uint32_t readbackChannelMask = (uint32_t)ADI_ADRV904X_CHOFF; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, gpio); + + uint8_t gpioIterator = 0U; + + /* If this function returns INVALID gpio, it means selected signal isn't mapped to any GPIO */ + *gpio = ADI_ADRV904X_GPIO_ANA_INVALID; + + /* Range check signal. */ + if ((signal <= ADI_ADRV904X_GPIO_SIGNAL_UNUSED) || + (signal >= ADI_ADRV904X_GPIO_SIGNAL_NUM_SIGNALS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + signal, + "Invalid signal selected. Out of range."); + return recoveryAction; + } + + if ((channelSel != ADI_ADRV904X_CHOFF) && + (channelSel != ADI_ADRV904X_CH0) && + (channelSel != ADI_ADRV904X_CH1) && + (channelSel != ADI_ADRV904X_CH2) && + (channelSel != ADI_ADRV904X_CH3) && + (channelSel != ADI_ADRV904X_CH4) && + (channelSel != ADI_ADRV904X_CH5) && + (channelSel != ADI_ADRV904X_CH6) && + (channelSel != ADI_ADRV904X_CH7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + channelSel, + "Invalid channel selected"); + return recoveryAction; + } + + /* Check all GPIOs until we find the matching signal */ + for (gpioIterator = 0U; gpioIterator < (uint8_t)ADI_ADRV904X_GPIO_ANA_INVALID; gpioIterator++) + { + recoveryAction = adrv904x_GpioAnalogSignalGet( device, + (adi_adrv904x_GpioAnaPinSel_e)gpioIterator, + &readbackSignal, + &readbackChannelMask); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read signal for selected GPIO"); + return recoveryAction; + } + + if ((readbackSignal == signal) && + (((readbackChannelMask & (uint32_t)channelSel) != 0U) || (readbackChannelMask == (uint32_t)channelSel))) + { + *gpio = (adi_adrv904x_GpioAnaPinSel_e)gpioIterator; + break; + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioAnalogSignalRelease(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioAnaPinSel_e gpio, + const adi_adrv904x_GpioSignal_e signal, + const uint32_t channelMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_GpioSignal_e initSignal = ADI_ADRV904X_GPIO_SIGNAL_UNUSED; + uint32_t initChannelMask = 0U; + adrv904x_FeatureID_e featureID = ADRV904X_FEATURE_UNUSED; + adrv904x_SharedResourceID_e sharedResourceID = ADRV904X_SHARED_RESOURCE_INVALID; + uint32_t sharedResourceIdVal = 0U; + uint8_t resourceStatus = ADI_FAILURE; + uint8_t channelIdx = 0U; + adrv904x_GpioSignalInfo_t info = { ADI_ADRV904X_GPIO_SIGNAL_UNUSED, ADRV904X_GPIO_DOMAIN_NONE, ADRV904X_GPIO_ROUTE_OFF, 0U, 0U, 0 }; + uint8_t isValid = ADI_FALSE; + + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Range check gpio */ + if ((gpio < ADI_ADRV904X_GPIO_ANA_00) || + (gpio >= ADI_ADRV904X_GPIO_ANA_INVALID)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. Out of range."); + return recoveryAction; + } + + /* Range check signal. */ + if ((signal <= ADI_ADRV904X_GPIO_SIGNAL_UNUSED) || + (signal >= ADI_ADRV904X_GPIO_SIGNAL_NUM_SIGNALS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + signal, + "Invalid signal selected. Out of range."); + return recoveryAction; + } + + /* Get signal info struct */ + recoveryAction = adrv904x_GpioSignalInfoGet(device, signal, &info); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while obtaining signal info"); + return recoveryAction; + } + + /* Check that this signal is an analog gpio signal domain */ + if ((info.domain != ADRV904X_GPIO_DOMAIN_ANALOG) && + (info.domain != ADRV904X_GPIO_DOMAIN_NONE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + info.domain, + "Selected GPIO signal is not valid for analog GPIO pins"); + return recoveryAction; + } + + /* Check channelMask validity for this signal's route type */ + recoveryAction = adrv904x_GpioRouteValidChannelMaskCheck( device, info.route, channelMask, &isValid ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while checking validity of channel Mask for GPIO signal"); + return recoveryAction; + } + if ( isValid == ADI_FALSE ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + channelMask, + "Selected channelMask is not valid for selected GPIO signal"); + return recoveryAction; + } + + /* Get the feature for the signal */ + recoveryAction = adrv904x_FromSignalToFeatureGet(device, signal, &featureID); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while feature for selected signal"); + return recoveryAction; + } + + /* Read the current signal for this gpio. Getter function will range check gpio */ + recoveryAction = adrv904x_GpioAnalogSignalGet(device, gpio, &initSignal, &initChannelMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while retreiving current signal for the selected gpio"); + return recoveryAction; + } + + /* If gpio is unused, then do nothing */ + if (initSignal == ADI_ADRV904X_GPIO_SIGNAL_UNUSED) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + /* If gpio is being used, then continue */ + else + { + /* signal is not channel instanced. Disconnect in hardware */ + if ( channelMask == 0U ) + { + /* Disconnect signal from GPIO in hardware */ + recoveryAction = adrv904x_GpioAnalogConnect( device, ADI_DISABLE, gpio, &info, 0U ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while disconnecting GPIO from signal"); + return recoveryAction; + } + + /* Release the shared resource for the feature */ + sharedResourceIdVal = (uint32_t)gpio + (uint32_t)ADRV904X_GPIO_ANA_00; + sharedResourceID = (adrv904x_SharedResourceID_e)(sharedResourceIdVal); + recoveryAction = adrv904x_SharedResourceRelease(device, sharedResourceID, featureID, &resourceStatus); + if ((recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) || + (resourceStatus != ADI_SUCCESS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while attempting to release shared resource"); + return recoveryAction; + } + + } + + /* signal is channel-instanced, Disconnect selected channels in hardware */ + else + { + for ( channelIdx = 0U; channelIdx < 8U; channelIdx++ ) + { + if ( ((channelMask >> channelIdx) & 1U) == 1U ) + { + /* Disconnect signal/chIdx from GPIO in hardware */ + recoveryAction = adrv904x_GpioAnalogConnect( device, ADI_DISABLE, gpio, &info, channelIdx ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while disconnecting GPIO from signal"); + return recoveryAction; + } + + /* Release the shared resource for the feature */ + sharedResourceIdVal = (uint32_t)gpio + (uint32_t)ADRV904X_GPIO_ANA_00; + sharedResourceID = (adrv904x_SharedResourceID_e)(sharedResourceIdVal); + recoveryAction = adrv904x_SharedResourceRelease(device, sharedResourceID, featureID, &resourceStatus); + if ((recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) || + (resourceStatus != ADI_SUCCESS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while attempting to release shared resource"); + return recoveryAction; + } + + /* Update channelMask by clearing bit for this channelIdx. Save channelMask */ + initChannelMask &= ~(1U << channelIdx); + recoveryAction = adrv904x_SharedResourceChannelMaskSet(device, sharedResourceID, initChannelMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while set channelMask"); + return recoveryAction; + } + } /* end of ifblock for channel included in channelMask */ + + } /* end channel idx for loop */ + } /* end else block for channel-indexed signals */ + } /* end else block for a used GPIO */ + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioAnalogSignalSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioAnaPinSel_e gpio, + const adi_adrv904x_GpioSignal_e signal, + const uint32_t channelMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t isValid = ADI_FALSE; + uint32_t pinRequest = 1U; + adi_adrv904x_GpioAnaPinSel_e prevGpio = ADI_ADRV904X_GPIO_ANA_INVALID; + adrv904x_SharedResourceID_e sharedResourceID = ADRV904X_SHARED_RESOURCE_INVALID; + uint32_t sharedResourceIdVal = 0U; + adrv904x_FeatureID_e featureID = ADRV904X_FEATURE_UNUSED; + adi_adrv904x_GpioSignal_e initSig = ADI_ADRV904X_GPIO_SIGNAL_UNUSED; + uint32_t initChannelMask = 0U; + uint8_t channelIdx = 0U; + uint32_t chanSel = 0U; + adrv904x_GpioSignalInfo_t info = { ADI_ADRV904X_GPIO_SIGNAL_UNUSED, ADRV904X_GPIO_DOMAIN_NONE, ADRV904X_GPIO_ROUTE_OFF, 0U, 0U, 0 }; + uint8_t resourceStatus = ADI_FAILURE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Range check gpio */ + if ((gpio < ADI_ADRV904X_GPIO_ANA_00) || + (gpio >= ADI_ADRV904X_GPIO_ANA_INVALID)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. Out of range."); + return recoveryAction; + } + + /* Range check signal. */ + if ((signal <= ADI_ADRV904X_GPIO_SIGNAL_UNUSED) || + (signal >= ADI_ADRV904X_GPIO_SIGNAL_NUM_SIGNALS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + signal, + "Invalid signal selected. Out of range."); + return recoveryAction; + } + + /* Get signal info struct */ + recoveryAction = adrv904x_GpioSignalInfoGet(device, signal, &info); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while obtaining signal info"); + return recoveryAction; + } + + /* Check that this signal is in analog gpio signal domain */ + if (info.domain != ADRV904X_GPIO_DOMAIN_ANALOG) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + info.domain, + "Selected GPIO signal is not valid for analog GPIO pins"); + return recoveryAction; + } + + /* Check that the user selected a gpio/signal combination with a valid route */ + pinRequest = (1U << (uint32_t)(gpio)); + if ((pinRequest & info.pinMask) != pinRequest) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Selected GPIO cannot be used to route the requested signal."); + return recoveryAction; + } + + /* Check channelMask validity for this signal's route type */ + recoveryAction = adrv904x_GpioRouteValidChannelMaskCheck( device, info.route, channelMask, &isValid ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while checking validity of channel Mask for GPIO signal"); + return recoveryAction; + } + if ( isValid == ADI_FALSE ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + channelMask, + "Selected channelMask is not valid for selected GPIO signal"); + return recoveryAction; + } + + /* Get SRM featureID that maps to the requested signal */ + recoveryAction = adrv904x_FromSignalToFeatureGet( device, signal, &featureID); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while feature for selected signal"); + return recoveryAction; + } + + /* If signal is not channel-instanced, release any other GPIO currently routing sig that are about to be set */ + if ( channelMask == 0U ) + { + recoveryAction = adrv904x_GpioAnalogSignalFind(device, &prevGpio, signal, ADI_ADRV904X_CHOFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while finding GPIO routing selected signal"); + return recoveryAction; + } + + /* If prevGpio shows a pin other than the target is routing the signal, release it */ + if ( (prevGpio != ADI_ADRV904X_GPIO_ANA_INVALID) && (prevGpio != gpio) ) + { + recoveryAction = adrv904x_GpioAnalogSignalRelease( device, prevGpio, signal, channelMask ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while finding GPIO routing selected signal"); + return recoveryAction; + } + } + + /* if prevGpio was not the target, connect the signal to target */ + if (prevGpio != gpio) + { + + /* Call GpioAnalogSignalGet() for target GPIO. If UNUSED, setup. Else failure. */ + recoveryAction = adrv904x_GpioAnalogSignalGet( device, gpio, &initSig, &initChannelMask ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error retrieving current status of target GPIO"); + return recoveryAction; + } + if ( initSig != ADI_ADRV904X_GPIO_SIGNAL_UNUSED ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. GPIO already in use by another signal"); + return recoveryAction; + } + + /* Acquire Shared Resource */ + sharedResourceIdVal = (uint32_t)gpio + (uint32_t)ADRV904X_GPIO_ANA_00; + sharedResourceID = (adrv904x_SharedResourceID_e)(sharedResourceIdVal); + resourceStatus = ADI_FAILURE; + recoveryAction = adrv904x_SharedResourceAcquire(device, sharedResourceID, featureID, &resourceStatus); + if ((recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) || + (resourceStatus != ADI_SUCCESS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while acquiring shared resource"); + return recoveryAction; + } + + /* Save channelMask */ + recoveryAction = adrv904x_SharedResourceChannelMaskSet(device, sharedResourceID, 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while set channelMask"); + return recoveryAction; + } + + /* Connect signal to GPIO in hardware */ + recoveryAction = adrv904x_GpioAnalogConnect( device, ADI_ENABLE, gpio, &info, 0U ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while connecting GPIO to signal"); + return recoveryAction; + } + } + } + + /* If channel-instanced signal, release any other GPIO currently routing EACH sig/chan that are about to be set */ + else + { + for (channelIdx = 0U; channelIdx < 8U; channelIdx++) + { + if ( ((channelMask >> channelIdx) & 1U) == 1U ) + { + chanSel = 1U << channelIdx; + /* This channel is in the channelMask. Search for GPIO to release */ + recoveryAction = adrv904x_GpioAnalogSignalFind(device, &prevGpio, signal, (adi_adrv904x_Channels_e)(chanSel)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while finding GPIO routing selected signal"); + return recoveryAction; + } + + /* If prevGpio shows a pin other than the target is routing the signal/chIdx, release it */ + if ( (prevGpio != ADI_ADRV904X_GPIO_ANA_INVALID) && (prevGpio != gpio) ) + { + recoveryAction = adrv904x_GpioAnalogSignalRelease( device, prevGpio, signal, (adi_adrv904x_Channels_e)(1U << channelIdx) ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while finding GPIO routing selected signal"); + return recoveryAction; + } + } + + /* if prevGpio was not the target, connect the signal/chIdx to target */ + if (prevGpio != gpio) + { + /* Call GpioSignalGet() for target GPIO. If UNUSED or already the target signal, setup. Else failure. */ + recoveryAction = adrv904x_GpioAnalogSignalGet( device, gpio, &initSig, &initChannelMask ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error retrieving current status of target GPIO"); + return recoveryAction; + } + if ( (initSig != ADI_ADRV904X_GPIO_SIGNAL_UNUSED) && + (initSig != signal ) ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. GPIO already in use by another signal"); + return recoveryAction; + } + + /* Acquire Shared Resource */ + sharedResourceIdVal = (uint32_t)gpio + (uint32_t)ADRV904X_GPIO_ANA_00; + sharedResourceID = (adrv904x_SharedResourceID_e)(sharedResourceIdVal); + resourceStatus = ADI_FAILURE; + recoveryAction = adrv904x_SharedResourceAcquire(device, sharedResourceID, featureID, &resourceStatus); + if ((recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) || + (resourceStatus != ADI_SUCCESS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while acquiring shared resource"); + return recoveryAction; + } + + /* Update chanelMask by setting bit for this channelIdx. Save channelMask */ + initChannelMask |= (1U << channelIdx); + recoveryAction = adrv904x_SharedResourceChannelMaskSet(device, sharedResourceID, initChannelMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while set channelMask"); + return recoveryAction; + } + + /* Connect signal to GPIO in hardware */ + recoveryAction = adrv904x_GpioAnalogConnect( device, ADI_ENABLE, gpio, &info, channelIdx ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while finding connecting GPIO to signal"); + return recoveryAction; + } + } + + } /* end if block for channelMask including channelIdx */ + } /* end for loop over channelIdx */ + } /* end channel-instanced signal "else" block */ + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioMonitorOutSignalValidCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioSignal_e signal, + const uint8_t channel, + uint8_t* const isValidFlag, + uint32_t* const channelMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_GpioSignalInfo_t info = { ADI_ADRV904X_GPIO_SIGNAL_UNUSED, ADRV904X_GPIO_DOMAIN_NONE, ADRV904X_GPIO_ROUTE_OFF, 0U, 0U, 0 }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, isValidFlag); + + /* Range check signal */ + if ((signal <= ADI_ADRV904X_GPIO_SIGNAL_UNUSED) || + (signal >= ADI_ADRV904X_GPIO_SIGNAL_NUM_SIGNALS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, signal, "Invalid signal selected. Out of range."); + return recoveryAction; + } + + /* Get signal info struct */ + recoveryAction = adrv904x_GpioSignalInfoGet(device, signal, &info); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while obtaining signal info"); + return recoveryAction; + } + + /* Check if signal/channel is a monitor output using the route */ + switch (info.route) + { + case ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL: + /* this route type is valid. channel is not used so ignore it */ + *isValidFlag = ADI_TRUE; + if (channelMask != NULL) + { + *channelMask = 0U; + } + break; + case ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX: /* FALLTHROUGH */ + case ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX: + /* these route types are valid, but channel must be in range 0-7 */ + *isValidFlag = (channel < ADI_ADRV904X_MAX_TXCHANNELS) ? ADI_TRUE : ADI_FALSE; + if(channelMask != NULL) + { + *channelMask = (1U << channel); + } + break; + case ADRV904X_GPIO_ROUTE_DIG_PINMUX_ORX: + /* these route types are valid, but channel must be in range 0-1 */ + *isValidFlag = (channel < ADI_ADRV904X_MAX_ORX_ONLY) ? ADI_TRUE : ADI_FALSE; + if (channelMask != NULL) + { + *channelMask = (1U << channel); + } + break; + default: + *isValidFlag = ADI_FALSE; + if (channelMask != NULL) + { + *channelMask = 0U; + } + break; + } + + return recoveryAction; +} + + +/**************************************************************************** + * Low Level GPIO Utility Helper Functions + **************************************************************************** + */ +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioSignalInfoGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioSignal_e signal, + adrv904x_GpioSignalInfo_t* const info) +{ + /* GPIO Signal Info LUT. Maps GPIO signal to feature, domain type, route type, pinMask, topSelect, and targetSelect */ + static const adrv904x_GpioSignalInfo_t gpioSignalLut[] = { + { ADI_ADRV904X_GPIO_SIGNAL_UNUSED, ADRV904X_GPIO_DOMAIN_NONE, ADRV904X_GPIO_ROUTE_OFF, 0x00FFFFFFU, 0U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_SDIO, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00002001U, 1U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_SDO, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00004002U, 1U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_CLK, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00008004U, 1U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_CSB, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00010008U, 1U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_UART_PADRXSIN, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000200U, 1U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_UART_PADCTS, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000400U, 1U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_UART_PADRTSOUT, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000800U, 1U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_UART_PADTXSOUT, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00001000U, 1U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_CLK_OUT, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00008000U, 2U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00010000U, 2U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00020000U, 2U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00040000U, 2U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00080000U, 2U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00100000U, 2U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00200000U, 2U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00400000U, 2U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00800000U, 2U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000001U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000002U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000004U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000008U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000010U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000020U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000040U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000080U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_8, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000100U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_9, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000200U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_10, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000400U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_11, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000800U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_12, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00001000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_13, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00002000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_14, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00004000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_15, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00008000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_16, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00010000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_17, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00020000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_18, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00040000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_19, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00080000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_20, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00100000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_21, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00200000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_22, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00400000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_23, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00800000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000001U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000002U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000004U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000008U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000010U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000020U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000040U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000080U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_8, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000100U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_9, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000200U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_10, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000400U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_11, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000800U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_12, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00001000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_13, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00002000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_14, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00004000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_15, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00008000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_16, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00010000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_17, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00020000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_18, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00040000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_19, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00080000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_20, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00100000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_21, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00200000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_22, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00400000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_23, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00800000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000001U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000002U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000004U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000008U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000010U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000020U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000040U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000080U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_8, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000100U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_9, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000200U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_10, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000400U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_11, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000800U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_12, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00001000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_13, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00002000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_14, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00004000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_15, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00008000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_16, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00010000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_17, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00020000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_18, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00040000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_19, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00080000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_20, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00100000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_21, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00200000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_22, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00400000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_23, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00800000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000001U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000002U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000004U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000008U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000010U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000020U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000040U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000080U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_8, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000100U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_9, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000200U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_10, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000400U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_11, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000800U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_12, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00001000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_13, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00002000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_14, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00004000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_15, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00008000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_16, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00010000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_17, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00020000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_18, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00040000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_19, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00080000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_20, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00100000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_21, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00200000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_22, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00400000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_23, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00800000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_FINE_BAND_OUT_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 0 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_FINE_BAND_OUT_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 1 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_FINE_BAND_OUT_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 2 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_FINE_BAND_OUT_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 3 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_FINE_BAND_OUT_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 4 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_FINE_BAND_OUT_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 5 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_CALBITS_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 6 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_CALBITS_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 7 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_CALBITS_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 8 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_CALBITS_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 9 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_CALBITS_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 10 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_CALBITS_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 11 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_PLL_LOCKED, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 12 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_OVERRANGE_LOW_FLAG, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 13 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_OVERRANGE_HIGH_FLAG, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 14 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_COMP_OUT, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 15 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_CAL_IN_PROGRESS, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 16 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 17 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 18 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 19 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 20 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 21 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 22 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 23 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 24 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_8, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 25 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 26 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 27 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 28 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 29 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 30 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 31 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 32 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 33 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_8, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 34 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_9, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 35 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_10, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 36 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 37 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 38 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 39 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 40 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 41 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 42 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 43 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 44 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_8, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 45 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_9, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 46 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_10, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 47 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_11, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 48 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 49 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 50 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 51 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 52 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 53 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 54 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 55 }, + { ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 56 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_FINE_BAND_OUT_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 57 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_FINE_BAND_OUT_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 58 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_FINE_BAND_OUT_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 59 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_FINE_BAND_OUT_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 60 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_FINE_BAND_OUT_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 61 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_FINE_BAND_OUT_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 62 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_CALBITS_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 63 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_CALBITS_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 64 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_CALBITS_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 65 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_CALBITS_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 66 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_CALBITS_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 67 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_CALBITS_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 68 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_PLL_LOCKED, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 69 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_OVERRANGE_LOW_FLAG, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 70 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_OVERRANGE_HIGH_FLAG, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 71 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_COMP_OUT, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 72 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_CAL_IN_PROGRESS, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 73 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 74 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 75 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 76 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 77 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 78 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 79 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 80 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 81 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_8, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 82 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 83 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 84 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 85 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 86 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 87 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 88 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 89 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 90 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_8, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 91 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_9, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 92 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_10, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 93 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 94 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 95 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 96 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 97 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 98 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 99 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 100 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 101 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_8, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 102 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_9, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 103 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_10, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 104 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_11, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 105 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 106 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 107 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 108 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 109 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 110 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 111 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 112 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 113 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_FINE_BAND_OUT_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 114 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_FINE_BAND_OUT_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 115 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_FINE_BAND_OUT_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 116 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_FINE_BAND_OUT_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 117 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_FINE_BAND_OUT_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 118 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_FINE_BAND_OUT_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 119 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_CALBITS_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 120 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_CALBITS_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 121 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_CALBITS_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 122 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_CALBITS_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 123 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_CALBITS_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 124 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_CALBITS_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 125 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_PLL_LOCKED, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 126 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_OVERRANGE_LOW_FLAG, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 127 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_OVERRANGE_HIGH_FLAG, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 128 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_COMP_OUT, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 129 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_CAL_IN_PROGRESS, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 130 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 131 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 132 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 133 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 134 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 135 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 136 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 137 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 138 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_8, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 139 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 140 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 141 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 142 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 143 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 144 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 145 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 146 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 147 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_8, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 148 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_9, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 149 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_10, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 150 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 151 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 152 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 153 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 154 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 155 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 156 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 157 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 158 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_8, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 159 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_9, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 160 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_10, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 161 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_11, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 162 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 163 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 164 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 165 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 166 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 167 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 168 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 169 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 170 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 171 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 172 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 173 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 174 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 175 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 176 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 177 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 178 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 179 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 180 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 181 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 182 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 183 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 184 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 185 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 186 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX_SYNC_JTAG_DETECTOR_P_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 187 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX_SYNC_JTAG_DETECTOR_P_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 188 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX_SYNC_JTAG_DETECTOR_P_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 189 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX_SYNC_JTAG_DETECTOR_N_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 190 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX_SYNC_JTAG_DETECTOR_N_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 191 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX_SYNC_JTAG_DETECTOR_N_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 192 }, + { ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 193 }, + { ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 194 }, + { ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 195 }, + { ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 196 }, + { ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 197 }, + { ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 198 }, + { ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 199 }, + { ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 200 }, + { ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 201 }, + { ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 202 }, + { ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 203 }, + { ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 204 }, + { ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 205 }, + { ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 206 }, + { ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 207 }, + { ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 208 }, + { ADI_ADRV904X_GPIO_SIGNAL_CONTROL_UPDATE_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 209 }, + { ADI_ADRV904X_GPIO_SIGNAL_CONTROL_UPDATE_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 210 }, + { ADI_ADRV904X_GPIO_SIGNAL_CONTROL_UPDATE_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 211 }, + { ADI_ADRV904X_GPIO_SIGNAL_CONTROL_UPDATE_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 212 }, + { ADI_ADRV904X_GPIO_SIGNAL_MCS_CLK_IND_CORE, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 213 }, + { ADI_ADRV904X_GPIO_SIGNAL_REF_CLK, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 214 }, + { ADI_ADRV904X_GPIO_SIGNAL_SPI_REG_ARM0_ERROR, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 215 }, + { ADI_ADRV904X_GPIO_SIGNAL_SPI_REG_ARM1_ERROR, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 216 }, + { ADI_ADRV904X_GPIO_SIGNAL_DIG_POWERGOOD, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 217 }, + { ADI_ADRV904X_GPIO_SIGNAL_MASTER_BIAS_CLK, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 218 }, + { ADI_ADRV904X_GPIO_SIGNAL_MBIAS_IGEN_PD_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 219 }, + { ADI_ADRV904X_GPIO_SIGNAL_MBIAS_IGEN_PD_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 220 }, + { ADI_ADRV904X_GPIO_SIGNAL_MBIAS_COMP_OUT_ANA_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 221 }, + { ADI_ADRV904X_GPIO_SIGNAL_MBIAS_COMP_OUT_ANA_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 222 }, + { ADI_ADRV904X_GPIO_SIGNAL_SPI_REG_MBIAS_IGEN_PTATR_TRIM_DONE_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 223 }, + { ADI_ADRV904X_GPIO_SIGNAL_SPI_REG_MBIAS_IGEN_PTATR_TRIM_DONE_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 224 }, + { ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 225 }, + { ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 226 }, + { ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 227 }, + { ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 228 }, + { ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 229 }, + { ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 230 }, + { ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 231 }, + { ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 232 }, + { ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_8, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 233 }, + { ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_9, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 234 }, + { ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_10, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 235 }, + { ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_11, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 236 }, + { ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_12, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 237 }, + { ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_13, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 260 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 238 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 239 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 240 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 241 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 242 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 243 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 244 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 245 }, + { ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_8, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 246 }, + { ADI_ADRV904X_GPIO_SIGNAL_NEW_PHASE_TOGGLE, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 247 }, + { ADI_ADRV904X_GPIO_SIGNAL_JESD_MCS_CLK_IND, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 248 }, + { ADI_ADRV904X_GPIO_SIGNAL_SERDES_PLL_PLL_LOCKED, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 249 }, + { ADI_ADRV904X_GPIO_SIGNAL_SERDES_PLL_VCO_COMP_OUT, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 250 }, + { ADI_ADRV904X_GPIO_SIGNAL_POWER_ON_RESET_N, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL, 0x00FFFFFFU, 6U, 251 }, + { ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 1 }, + { ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 2 }, + { ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 3 }, + { ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 4 }, + { ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 5 }, + { ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 6 }, + { ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 7 }, + { ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 8 }, + { ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_8, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 9 }, + { ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_9, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 10 }, + { ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_10, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 11 }, + { ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_11, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 12 }, + { ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_12, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 13 }, + { ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_13, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 14 }, + { ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_14, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 15 }, + { ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_15, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 16 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 17 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 18 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 19 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 20 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 21 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 22 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 23 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 24 }, + { ADI_ADRV904X_GPIO_SIGNAL_SLICER_POSITION_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 41 }, + { ADI_ADRV904X_GPIO_SIGNAL_SLICER_POSITION_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 42 }, + { ADI_ADRV904X_GPIO_SIGNAL_SLICER_POSITION_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 43 }, + { ADI_ADRV904X_GPIO_SIGNAL_SLICER_POSITION_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 44 }, + { ADI_ADRV904X_GPIO_SIGNAL_MCS_CLK_IND_RX, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 45 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFDC_UPDATE, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 46 }, + { ADI_ADRV904X_GPIO_SIGNAL_SLICER_OVERFLOW, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 47 }, + { ADI_ADRV904X_GPIO_SIGNAL_AGC_ADCOVRG_SEC_HIGH, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 48 }, + { ADI_ADRV904X_GPIO_SIGNAL_AGC_OVRG_SEC_HIGH_COUNTER_EXCEEDED, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 49 }, + { ADI_ADRV904X_GPIO_SIGNAL_TIA_VALID, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 50 }, + { ADI_ADRV904X_GPIO_SIGNAL_RXFE_VALID, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 51 }, + { ADI_ADRV904X_GPIO_SIGNAL_RSSI_DECPWR_READY, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 53 }, + { ADI_ADRV904X_GPIO_SIGNAL_PEAK_COUNT_EXCEEDED_QEC_ANA, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 54 }, + { ADI_ADRV904X_GPIO_SIGNAL_PEAK_COUNT_EXCEEDED_QEC_DIG, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 55 }, + { ADI_ADRV904X_GPIO_SIGNAL_RSSI_SYMBOL_READY, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 56 }, + { ADI_ADRV904X_GPIO_SIGNAL_RXON, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 57 }, + { ADI_ADRV904X_GPIO_SIGNAL_ADC_OVERLOAD_RESET_ADC, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 58 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFDC_STATE_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 59 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFDC_STATE_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 60 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFDC_STATE_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 61 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFDC_STATE_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 62 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFDC_UPDATE_COUNTER_EXPIRED, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 63 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFDC_MEASURE, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 64 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFDC_CAL_DONE, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 65 }, + { ADI_ADRV904X_GPIO_SIGNAL_RFDC_MEASURE_COUNTER_EXPIRED, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 66 }, + { ADI_ADRV904X_GPIO_SIGNAL_AGC_OVRG_LOW_INT1_COUNTER_EXCEEDED, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 68 }, + { ADI_ADRV904X_GPIO_SIGNAL_AGC_OVRG_LOW_INT0_COUNTER_EXCEEDED, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 69 }, + { ADI_ADRV904X_GPIO_SIGNAL_DIG_GAIN_SAT, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 70 }, + { ADI_ADRV904X_GPIO_SIGNAL_AGC_ADCOVRG_INT1_LOW, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 71 }, + { ADI_ADRV904X_GPIO_SIGNAL_AGC_ADCOVRG_INT0_LOW, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 72 }, + { ADI_ADRV904X_GPIO_SIGNAL_AGC_SL_STATE_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 73 }, + { ADI_ADRV904X_GPIO_SIGNAL_AGC_SL_STATE_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 74 }, + { ADI_ADRV904X_GPIO_SIGNAL_AGC_GAINUPDATE_COUNTER_EXPIRED, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 75 }, + { ADI_ADRV904X_GPIO_SIGNAL_AGC_SL_LOW_TH_EXCEEDED, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 76 }, + { ADI_ADRV904X_GPIO_SIGNAL_AGC_SL_HIGH_TH_EXCEEDED, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 77 }, + { ADI_ADRV904X_GPIO_SIGNAL_AGC_OVRG_LLB_COUNTER_EXCEEDED, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 78 }, + { ADI_ADRV904X_GPIO_SIGNAL_AGC_ADCOVRG_LOW, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 81 }, + { ADI_ADRV904X_GPIO_SIGNAL_AGC_ADCOVRG_HIGH, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 82 }, + { ADI_ADRV904X_GPIO_SIGNAL_GT_GAIN_CHANGE, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 83 }, + { ADI_ADRV904X_GPIO_SIGNAL_AGC_OVRG_ULB_COUNTER_EXCEEDED, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 84 }, + { ADI_ADRV904X_GPIO_SIGNAL_AGC_OVRG_LOW_COUNTER_EXCEEDED, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 85 }, + { ADI_ADRV904X_GPIO_SIGNAL_AGC_OVRG_HIGH_COUNTER_EXCEEDED, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 86 }, + { ADI_ADRV904X_GPIO_SIGNAL_BAND_PEAK_COUNT_EXCEEDED_LOW_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 87 }, + { ADI_ADRV904X_GPIO_SIGNAL_BAND_PEAK_COUNT_EXCEEDED_LOW_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 88 }, + { ADI_ADRV904X_GPIO_SIGNAL_BAND_PEAK_COUNT_EXCEEDED_HIGH_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 89 }, + { ADI_ADRV904X_GPIO_SIGNAL_BAND_PEAK_COUNT_EXCEEDED_HIGH_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 90 }, + { ADI_ADRV904X_GPIO_SIGNAL_BAND_DECPWR_READY_TOGGLE_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 91 }, + { ADI_ADRV904X_GPIO_SIGNAL_BAND_DECPWR_READY_TOGGLE_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 92 }, + { ADI_ADRV904X_GPIO_SIGNAL_BAND_DECPWR_READY_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 93 }, + { ADI_ADRV904X_GPIO_SIGNAL_BAND_DECPWR_READY_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 94 }, + { ADI_ADRV904X_GPIO_SIGNAL_MCS_CLK_IND_TX, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 1 }, + { ADI_ADRV904X_GPIO_SIGNAL_PA_PROT_SRERROR, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 2 }, + { ADI_ADRV904X_GPIO_SIGNAL_PA_PROT_PPERROR_OR_APERROR, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 3 }, + { ADI_ADRV904X_GPIO_SIGNAL_ATTEN_RAMP_UP_PROT, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 4 }, + { ADI_ADRV904X_GPIO_SIGNAL_ATTEN_RAMP_DOWN_PROT, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 5 }, + { ADI_ADRV904X_GPIO_SIGNAL_ATTEN_TDD_RAMP_DOWN, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 6 }, + { ADI_ADRV904X_GPIO_SIGNAL_ATTEN_TDD_RAMP_UP, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 7 }, + { ADI_ADRV904X_GPIO_SIGNAL_ATTEN_LATCH_EN, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 8 }, + { ADI_ADRV904X_GPIO_SIGNAL_DTX_POWER_UP_TRIGGER, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 9 }, + { ADI_ADRV904X_GPIO_SIGNAL_DTX_POWER_DOWN_TRIGGER, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 10 }, + { ADI_ADRV904X_GPIO_SIGNAL_TX_GAIN_CHANGE, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 11 }, + { ADI_ADRV904X_GPIO_SIGNAL_TX_POWER_READY, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 12 }, + { ADI_ADRV904X_GPIO_SIGNAL_PA_PROT_SRD_IRQ, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 13 }, + { ADI_ADRV904X_GPIO_SIGNAL_TX_TSSI_DUC0_READY, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 14 }, + { ADI_ADRV904X_GPIO_SIGNAL_ADC_SAMPLE_OVR, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 15 }, + { ADI_ADRV904X_GPIO_SIGNAL_MCS_CLK_IND_ORX, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ORX, 0x00FFFFFFU, 9U, 1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ORX_ON, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ORX, 0x00FFFFFFU, 9U, 2 }, + { ADI_ADRV904X_GPIO_SIGNAL_DECPWR_READY, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ORX, 0x00FFFFFFU, 9U, 3 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANY_ADC_SAMPLE_OVR, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_ORX, 0x00FFFFFFU, 9U, 4 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00000001U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00000002U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00000004U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00000008U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00000010U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00000020U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00000040U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00000080U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_8, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00000100U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_9, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00000200U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_10, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00000400U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_11, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00000800U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_12, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00001000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_13, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00002000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_14, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00004000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_15, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00008000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_16, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00010000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_17, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00020000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_18, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00040000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_19, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00080000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_20, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00100000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_21, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00200000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_22, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00400000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_23, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG, 0x00800000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000001U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000002U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000004U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000008U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000010U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000020U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000040U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000080U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_8, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000100U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_9, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000200U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_10, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000400U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_11, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000800U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_12, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00001000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_13, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00002000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_14, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00004000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_15, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00008000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_16, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00010000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_17, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00020000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_18, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00040000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_19, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00080000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_20, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00100000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_21, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00200000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_22, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00400000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_23, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00800000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000001U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000002U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_2, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000004U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_3, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000008U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_4, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000010U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_5, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000020U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_6, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000040U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_7, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000080U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_8, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000100U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_9, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000200U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_10, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000400U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_11, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000800U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_12, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00001000U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_13, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00002000U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_14, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00004000U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_15, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00008000U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_PPI16_PEB, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_PPI, 0x00000008U, 0U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_PPI16_CLK, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_PPI, 0x00000010U, 0U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_PPI, 0x00000020U, 0U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_PPI, 0x00000040U, 0U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_PPI, 0x00000080U, 0U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_PPI, 0x00000100U, 0U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_PPI, 0x00000200U, 0U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_PPI, 0x00000400U, 0U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_PPI, 0x00000800U, 0U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_PPI, 0x00001000U, 0U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_8, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_PPI, 0x00002000U, 0U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_9, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_PPI, 0x00004000U, 0U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_10, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_PPI, 0x00008000U, 0U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_11, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_PPI, 0x00010000U, 0U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_12, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_PPI, 0x00020000U, 0U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_13, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_PPI, 0x00040000U, 0U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_14, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_PPI, 0x00080000U, 0U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_15, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_PPI, 0x00100000U, 0U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ADC_TEST_GEN_ENABLE, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_RX, 0x00FFFFFEU, 0U, 0 }, + { ADI_ADRV904X_GPIO_SIGNAL_AGC_GAIN_CHANGE, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_RX, 0x00FFFFFEU, 0U, 1 }, + { ADI_ADRV904X_GPIO_SIGNAL_AGC_DEC_GAIN, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_RX, 0x00FFFFFEU, 0U, 2 }, + { ADI_ADRV904X_GPIO_SIGNAL_AGC_INC_GAIN, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_RX, 0x00FFFFFEU, 0U, 3 }, + { ADI_ADRV904X_GPIO_SIGNAL_AGC_SLOWLOOP_FREEZE_ENABLE, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_RX, 0x00FFFFFEU, 0U, 4 }, + { ADI_ADRV904X_GPIO_SIGNAL_AGC_MANUAL_GAIN_LOCK, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_RX, 0x00FFFFFEU, 0U, 5 }, + { ADI_ADRV904X_GPIO_SIGNAL_SELECT_S1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_TX, 0x00FFFFFEU, 0U, 0 }, + { ADI_ADRV904X_GPIO_SIGNAL_DTX_FORCE_PIN, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_TX_DTX, 0x00FFFFFEU, 0U, 3 }, + { ADI_ADRV904X_GPIO_SIGNAL_TX_ATTEN_UPD_GPIO, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_TX, 0x00FFFFFEU, 0U, 4 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000001U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000002U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_2, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000004U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_3, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000008U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_4, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000010U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_5, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000020U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_6, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000040U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_7, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000080U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_8, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000100U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_9, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000200U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_10, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000400U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_11, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000800U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_12, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00001000U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_13, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00002000U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_14, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00004000U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_15, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00008000U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000001U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000002U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_2, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000004U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_3, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000008U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_4, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000010U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_5, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000020U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_6, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000040U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_7, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000080U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_8, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000100U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_9, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000200U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_10, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000400U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_11, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000800U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_12, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00001000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_13, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00002000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_14, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00004000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_15, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00008000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000001U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000002U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_2, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000004U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_3, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000008U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_4, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000010U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_5, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000020U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_6, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000040U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_7, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000080U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_8, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000100U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_9, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000200U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_10, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000400U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_11, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000800U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_12, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00001000U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_13, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00002000U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_14, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00004000U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_15, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00008000U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000001U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000002U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_2, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000004U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_3, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000008U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_4, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000010U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_5, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000020U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_6, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000040U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_7, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000080U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_8, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000100U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_9, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000200U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_10, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000400U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_11, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000800U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_12, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00001000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_13, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00002000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_14, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00004000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_15, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00008000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX0_EXT_CONTROL_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000001U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX0_EXT_CONTROL_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000002U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX1_EXT_CONTROL_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000004U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX1_EXT_CONTROL_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000008U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX2_EXT_CONTROL_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000010U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX2_EXT_CONTROL_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000020U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX3_EXT_CONTROL_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000040U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX3_EXT_CONTROL_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000080U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX4_EXT_CONTROL_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000100U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX4_EXT_CONTROL_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000200U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX5_EXT_CONTROL_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000400U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX5_EXT_CONTROL_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000800U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX6_EXT_CONTROL_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00001000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX6_EXT_CONTROL_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00002000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX7_EXT_CONTROL_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00004000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX7_EXT_CONTROL_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00008000U, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND0_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000001U, 6U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND0_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000002U, 6U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND1_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000004U, 6U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND1_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000008U, 6U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX1_DUALBAND_CONTROL_BAND0_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000010U, 6U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX1_DUALBAND_CONTROL_BAND0_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000020U, 6U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX1_DUALBAND_CONTROL_BAND1_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000040U, 6U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX1_DUALBAND_CONTROL_BAND1_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000080U, 6U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX4_DUALBAND_CONTROL_BAND0_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000100U, 6U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX4_DUALBAND_CONTROL_BAND0_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000200U, 6U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX4_DUALBAND_CONTROL_BAND1_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000400U, 6U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX4_DUALBAND_CONTROL_BAND1_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000800U, 6U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX5_DUALBAND_CONTROL_BAND0_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00001000U, 6U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX5_DUALBAND_CONTROL_BAND0_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00002000U, 6U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX5_DUALBAND_CONTROL_BAND1_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00004000U, 6U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX5_DUALBAND_CONTROL_BAND1_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00008000U, 6U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX2_DUALBAND_CONTROL_BAND0_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000001U, 7U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX2_DUALBAND_CONTROL_BAND0_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000002U, 7U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX2_DUALBAND_CONTROL_BAND1_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000004U, 7U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX2_DUALBAND_CONTROL_BAND1_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000008U, 7U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX3_DUALBAND_CONTROL_BAND0_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000010U, 7U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX3_DUALBAND_CONTROL_BAND0_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000020U, 7U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX3_DUALBAND_CONTROL_BAND1_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000040U, 7U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX3_DUALBAND_CONTROL_BAND1_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000080U, 7U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX6_DUALBAND_CONTROL_BAND0_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000100U, 7U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX6_DUALBAND_CONTROL_BAND0_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000200U, 7U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX6_DUALBAND_CONTROL_BAND1_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000400U, 7U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX6_DUALBAND_CONTROL_BAND1_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000800U, 7U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX7_DUALBAND_CONTROL_BAND0_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00001000U, 7U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX7_DUALBAND_CONTROL_BAND0_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00002000U, 7U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX7_DUALBAND_CONTROL_BAND1_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00004000U, 7U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX7_DUALBAND_CONTROL_BAND1_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00008000U, 7U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_SSB_SYNC, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_RADIO_SEQ, 0x00FFFFFFU, 5U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000001U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000002U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000004U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000008U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000010U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000020U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000040U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000080U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_8, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000100U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_9, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000200U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_10, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000400U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_11, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000800U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_12, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00001000U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_13, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00002000U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_14, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00004000U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_15, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00008000U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_16, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00010000U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_17, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00020000U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_18, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00040000U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_19, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00080000U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_20, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00100000U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_21, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00200000U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_22, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00400000U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_23, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00800000U, 13U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000001U, 8U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000002U, 8U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_2, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000004U, 8U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_3, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000008U, 8U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_4, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000010U, 8U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_5, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000020U, 8U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_6, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000040U, 8U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_7, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000080U, 8U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_8, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000100U, 8U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_9, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000200U, 8U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_10, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000400U, 8U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_11, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000800U, 8U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_12, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00001000U, 8U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_13, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00002000U, 8U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_14, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00004000U, 8U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_15, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00008000U, 8U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_ENABLE, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_DEST_RX_CDDC_RSSI, 0x00FFFFFEU, 0U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 95 }, + { ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 96 }, + { ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 97 }, + { ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 98 }, + { ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 99 }, + { ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 100 }, + { ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 101 }, + { ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX, 0x00FFFFFFU, 7U, 102 }, + { ADI_ADRV904X_GPIO_SIGNAL_TX_TSSI_DUC1_READY, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 16 }, + { ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 17 }, + { ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 18 }, + { ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 19 }, + { ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 20 }, + { ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 21 }, + { ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 22 }, + { ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 23 }, + { ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 24 }, + { ADI_ADRV904X_GPIO_SIGNAL_TX_DPD_IN_POWER_READY, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 25 }, + { ADI_ADRV904X_GPIO_SIGNAL_TX_DPD_OUT_POWER_READY, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 26 }, + { ADI_ADRV904X_GPIO_SIGNAL_TX_DFE_TSSI_READY_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 43 }, + { ADI_ADRV904X_GPIO_SIGNAL_TX_DFE_TSSI_READY_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX, 0x00FFFFFFU, 8U, 44 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_UART0_PADRXSIN, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00020000U, 12U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_UART0_PADCTS, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00200000U, 12U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_UART0_PADRTSOUT, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00400000U, 12U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_UART0_PADTXSOUT, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000100U, 12U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_ARM_TRST, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000400U, 11U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_ARM_TDO_SWO_MUX, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000800U, 11U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_ARM_TDI, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00001000U, 11U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_ARM_TMS, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00002000U, 11U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_ARM_TCK, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00004000U, 11U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000001U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000002U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000004U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000008U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000010U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000020U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000040U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000080U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_8, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000100U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_9, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000200U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_10, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000400U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_11, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000800U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_12, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00001000U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_13, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00002000U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_14, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00004000U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_15, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00008000U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_16, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00010000U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_17, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00020000U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_18, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00040000U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_19, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00080000U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_20, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00100000U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_21, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00200000U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_22, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00400000U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_NOOP_23, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00800000U, 15U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_0, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000001U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_1, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000002U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_2, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000004U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_3, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000008U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_4, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000010U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_5, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000020U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_6, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000040U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_7, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000080U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_8, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000100U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_9, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000200U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_10, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000400U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_11, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00000800U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_12, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00001000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_13, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00002000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_14, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00004000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_15, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00008000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_16, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00010000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_17, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00020000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_18, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00040000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_19, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00080000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_20, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00100000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_21, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00200000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_22, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00400000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_23, ADRV904X_GPIO_DOMAIN_DIGITAL, ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE, 0x00800000U, 4U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_0, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000001U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_1, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000002U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_2, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000004U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_3, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000008U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_4, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000010U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_5, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000020U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_6, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000040U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_7, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000080U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_8, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000100U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_9, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000200U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_10, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000400U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_11, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00000800U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_12, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00001000U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_13, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00002000U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_14, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00004000U, 3U, -1 }, + { ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_15, ADRV904X_GPIO_DOMAIN_ANALOG, ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE, 0x00008000U, 3U, -1 }, + }; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t numEntries = sizeof(gpioSignalLut) / sizeof(adrv904x_GpioSignalInfo_t); + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, info); + + /* Range Check that gpio signal is valid */ + if ((signal < ADI_ADRV904X_GPIO_SIGNAL_UNUSED) || + (signal >= ADI_ADRV904X_GPIO_SIGNAL_NUM_SIGNALS) || + (signal < 0) || + (signal >= numEntries)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + signal, + "Invalid gpio signal encountered in adrv904x_SignalInfoGet function. Out of range."); + return recoveryAction; + } + /* Check that LUT entry for index 'signal' has a signal field that matches exactly */ + else if ( gpioSignalLut[signal].signal != signal ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + signal, + "Invalid gpio signal encountered in adrv904x_SignalInfoGet function. Lookup failure."); + return recoveryAction; + } + /* Success. Get Signal Info */ + else + { + *info = gpioSignalLut[signal]; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_FromSignalToFeatureGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioSignal_e signal, + adrv904x_FeatureID_e* const featureID) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_FeatureID_e tmpFeature = ADRV904X_NUM_FEATURES; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, featureID); + + /* Check that signal is valid */ + if (( signal < ADI_ADRV904X_GPIO_SIGNAL_UNUSED) || + ( signal >= ADI_ADRV904X_GPIO_SIGNAL_NUM_SIGNALS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + signal, + "Invalid signal encountered in adrv904x_FromSignalToFeatureGet function"); + return recoveryAction; + } + + /* Range Check featureID when cast directly from signal. */ + /* Note: Though all signals have a 1-to-1 map to features, the converse is not true */ + tmpFeature = (adrv904x_FeatureID_e)((uint32_t) signal | GPIO_SIGNAL_FEATURE); + if (( tmpFeature < ADRV904X_FEATURE_UNUSED) || + ( tmpFeature >= ADRV904X_NUM_FEATURES)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + tmpFeature, + "Invalid featureID encountered in adrv904x_FromSignalToFeatureGet function"); + return recoveryAction; + } + /* Success. Set featureID */ + else + { + *featureID = tmpFeature; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_FromFeatureToSignalGet(adi_adrv904x_Device_t* const device, + const adrv904x_FeatureID_e featureID, + adi_adrv904x_GpioSignal_e* const signal) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_GpioSignal_e tmpSig = ADI_ADRV904X_GPIO_SIGNAL_NUM_SIGNALS; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, signal); + + /* Check that featureID is valid */ + if (( featureID < ADRV904X_FEATURE_UNUSED) || + ( featureID >= ADRV904X_NUM_FEATURES)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + featureID, + "Invalid featureID encountered in adrv904x_FromFeatureToSignalGet function"); + return recoveryAction; + } + + /* Range Check signal when cast directly from featureID. */ + /* Note: Though all signals have a 1-to-1 map to features, the converse is not true */ + tmpSig = (adi_adrv904x_GpioSignal_e)((uint32_t)featureID & ~GPIO_SIGNAL_FEATURE); + if (( tmpSig < ADI_ADRV904X_GPIO_SIGNAL_UNUSED) || + ( tmpSig >= ADI_ADRV904X_GPIO_SIGNAL_NUM_SIGNALS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + tmpSig, + "Invalid signal encountered in adrv904x_FromFeatureToSignalGet function"); + return recoveryAction; + } + /* Success. Set signal */ + else + { + *signal = tmpSig; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioPinmuxStg3Set(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const uint8_t muxSelect) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t gpioIdx = 0U; + adi_adrv904x_ErrAction_e(*bfSetter[(uint32_t)(ADI_ADRV904X_GPIO_INVALID)])(adi_adrv904x_Device_t*, adi_adrv904x_SpiCache_t*, adrv904x_BfCoreChanAddr_e, uint8_t) = { + adrv904x_Core_GpioSourceControl0_BfSet, + adrv904x_Core_GpioSourceControl1_BfSet, + adrv904x_Core_GpioSourceControl2_BfSet, + adrv904x_Core_GpioSourceControl3_BfSet, + adrv904x_Core_GpioSourceControl4_BfSet, + adrv904x_Core_GpioSourceControl5_BfSet, + adrv904x_Core_GpioSourceControl6_BfSet, + adrv904x_Core_GpioSourceControl7_BfSet, + adrv904x_Core_GpioSourceControl8_BfSet, + adrv904x_Core_GpioSourceControl9_BfSet, + adrv904x_Core_GpioSourceControl10_BfSet, + adrv904x_Core_GpioSourceControl11_BfSet, + adrv904x_Core_GpioSourceControl12_BfSet, + adrv904x_Core_GpioSourceControl13_BfSet, + adrv904x_Core_GpioSourceControl14_BfSet, + adrv904x_Core_GpioSourceControl15_BfSet, + adrv904x_Core_GpioSourceControl16_BfSet, + adrv904x_Core_GpioSourceControl17_BfSet, + adrv904x_Core_GpioSourceControl18_BfSet, + adrv904x_Core_GpioSourceControl19_BfSet, + adrv904x_Core_GpioSourceControl20_BfSet, + adrv904x_Core_GpioSourceControl21_BfSet, + adrv904x_Core_GpioSourceControl22_BfSet, + adrv904x_Core_GpioSourceControl23_BfSet + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check gpio is valid */ + if ( gpio >= ADI_ADRV904X_GPIO_INVALID ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. Out of range."); + return recoveryAction; + } + + /* Check muxSelect */ + if (muxSelect > ADRV904X_GPIO_PINMUX_STAGE3_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + muxSelect, + "Invalid mux input selected. Out of range."); + return recoveryAction; + } + + /* Set mux bitfield */ + gpioIdx = (uint32_t)(gpio); + recoveryAction = bfSetter[gpioIdx](device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + muxSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Pinmux Stg3 selection failure"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioPinmuxStg3Get(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + uint8_t * const muxSelect) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t gpioIdx = 0U; + adi_adrv904x_ErrAction_e(*bfGetter[(uint32_t)(ADI_ADRV904X_GPIO_INVALID)])(adi_adrv904x_Device_t*, adi_adrv904x_SpiCache_t*, adrv904x_BfCoreChanAddr_e, uint8_t *) = { + adrv904x_Core_GpioSourceControl0_BfGet, + adrv904x_Core_GpioSourceControl1_BfGet, + adrv904x_Core_GpioSourceControl2_BfGet, + adrv904x_Core_GpioSourceControl3_BfGet, + adrv904x_Core_GpioSourceControl4_BfGet, + adrv904x_Core_GpioSourceControl5_BfGet, + adrv904x_Core_GpioSourceControl6_BfGet, + adrv904x_Core_GpioSourceControl7_BfGet, + adrv904x_Core_GpioSourceControl8_BfGet, + adrv904x_Core_GpioSourceControl9_BfGet, + adrv904x_Core_GpioSourceControl10_BfGet, + adrv904x_Core_GpioSourceControl11_BfGet, + adrv904x_Core_GpioSourceControl12_BfGet, + adrv904x_Core_GpioSourceControl13_BfGet, + adrv904x_Core_GpioSourceControl14_BfGet, + adrv904x_Core_GpioSourceControl15_BfGet, + adrv904x_Core_GpioSourceControl16_BfGet, + adrv904x_Core_GpioSourceControl17_BfGet, + adrv904x_Core_GpioSourceControl18_BfGet, + adrv904x_Core_GpioSourceControl19_BfGet, + adrv904x_Core_GpioSourceControl20_BfGet, + adrv904x_Core_GpioSourceControl21_BfGet, + adrv904x_Core_GpioSourceControl22_BfGet, + adrv904x_Core_GpioSourceControl23_BfGet + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, muxSelect); + + /* Check gpio is valid */ + if (gpio >= ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. Out of range."); + return recoveryAction; + } + + /* Set mux bitfield */ + gpioIdx = (uint32_t)(gpio); + recoveryAction = bfGetter[gpioIdx](device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + muxSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Reading Pinmux Stg3 failure"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioPinmuxStg2RxSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const uint8_t muxSelect) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t gpioIdx = 0U; + adi_adrv904x_ErrAction_e(*bfSetter[(uint32_t)(ADI_ADRV904X_GPIO_INVALID)])(adi_adrv904x_Device_t*, adi_adrv904x_SpiCache_t*, adrv904x_BfCoreChanAddr_e, uint8_t) = { + adrv904x_Core_GpioSourceRxControl0_BfSet, + adrv904x_Core_GpioSourceRxControl1_BfSet, + adrv904x_Core_GpioSourceRxControl2_BfSet, + adrv904x_Core_GpioSourceRxControl3_BfSet, + adrv904x_Core_GpioSourceRxControl4_BfSet, + adrv904x_Core_GpioSourceRxControl5_BfSet, + adrv904x_Core_GpioSourceRxControl6_BfSet, + adrv904x_Core_GpioSourceRxControl7_BfSet, + adrv904x_Core_GpioSourceRxControl8_BfSet, + adrv904x_Core_GpioSourceRxControl9_BfSet, + adrv904x_Core_GpioSourceRxControl10_BfSet, + adrv904x_Core_GpioSourceRxControl11_BfSet, + adrv904x_Core_GpioSourceRxControl12_BfSet, + adrv904x_Core_GpioSourceRxControl13_BfSet, + adrv904x_Core_GpioSourceRxControl14_BfSet, + adrv904x_Core_GpioSourceRxControl15_BfSet, + adrv904x_Core_GpioSourceRxControl16_BfSet, + adrv904x_Core_GpioSourceRxControl17_BfSet, + adrv904x_Core_GpioSourceRxControl18_BfSet, + adrv904x_Core_GpioSourceRxControl19_BfSet, + adrv904x_Core_GpioSourceRxControl20_BfSet, + adrv904x_Core_GpioSourceRxControl21_BfSet, + adrv904x_Core_GpioSourceRxControl22_BfSet, + adrv904x_Core_GpioSourceRxControl23_BfSet + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check gpio is valid */ + if (gpio >= ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. Out of range."); + return recoveryAction; + } + + /* Check muxSelect */ + if (muxSelect > ADRV904X_GPIO_PINMUX_STAGE2_RX_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + muxSelect, + "Invalid mux input selected. Out of range."); + return recoveryAction; + } + + /* Set mux bitfield */ + gpioIdx = (uint32_t)(gpio); + recoveryAction = bfSetter[gpioIdx](device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + muxSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Pinmux Stg2 Rx selection failure"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioPinmuxStg2TxSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const uint8_t muxSelect) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t gpioIdx = 0U; + adi_adrv904x_ErrAction_e(*bfSetter[(uint32_t)(ADI_ADRV904X_GPIO_INVALID)])(adi_adrv904x_Device_t*, adi_adrv904x_SpiCache_t*, adrv904x_BfCoreChanAddr_e, uint8_t) = { + adrv904x_Core_GpioSourceTxControl0_BfSet, + adrv904x_Core_GpioSourceTxControl1_BfSet, + adrv904x_Core_GpioSourceTxControl2_BfSet, + adrv904x_Core_GpioSourceTxControl3_BfSet, + adrv904x_Core_GpioSourceTxControl4_BfSet, + adrv904x_Core_GpioSourceTxControl5_BfSet, + adrv904x_Core_GpioSourceTxControl6_BfSet, + adrv904x_Core_GpioSourceTxControl7_BfSet, + adrv904x_Core_GpioSourceTxControl8_BfSet, + adrv904x_Core_GpioSourceTxControl9_BfSet, + adrv904x_Core_GpioSourceTxControl10_BfSet, + adrv904x_Core_GpioSourceTxControl11_BfSet, + adrv904x_Core_GpioSourceTxControl12_BfSet, + adrv904x_Core_GpioSourceTxControl13_BfSet, + adrv904x_Core_GpioSourceTxControl14_BfSet, + adrv904x_Core_GpioSourceTxControl15_BfSet, + adrv904x_Core_GpioSourceTxControl16_BfSet, + adrv904x_Core_GpioSourceTxControl17_BfSet, + adrv904x_Core_GpioSourceTxControl18_BfSet, + adrv904x_Core_GpioSourceTxControl19_BfSet, + adrv904x_Core_GpioSourceTxControl20_BfSet, + adrv904x_Core_GpioSourceTxControl21_BfSet, + adrv904x_Core_GpioSourceTxControl22_BfSet, + adrv904x_Core_GpioSourceTxControl23_BfSet + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check gpio is valid */ + if (gpio >= ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. Out of range."); + return recoveryAction; + } + + /* Check muxSelect */ + if (muxSelect > ADRV904X_GPIO_PINMUX_STAGE2_TX_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + muxSelect, + "Invalid mux input selected. Out of range."); + return recoveryAction; + } + + /* Set mux bitfield */ + gpioIdx = (uint32_t)(gpio); + recoveryAction = bfSetter[gpioIdx](device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + muxSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Pinmux Stg2 Tx selection failure"); + return recoveryAction; + } + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioPinmuxStg2OrxSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const uint8_t muxSelect) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t gpioIdx = 0U; + adi_adrv904x_ErrAction_e(*bfSetter[(uint32_t)(ADI_ADRV904X_GPIO_INVALID)])(adi_adrv904x_Device_t*, adi_adrv904x_SpiCache_t*, adrv904x_BfCoreChanAddr_e, uint8_t) = { + adrv904x_Core_GpioSourceOrxControl0_BfSet, + adrv904x_Core_GpioSourceOrxControl1_BfSet, + adrv904x_Core_GpioSourceOrxControl2_BfSet, + adrv904x_Core_GpioSourceOrxControl3_BfSet, + adrv904x_Core_GpioSourceOrxControl4_BfSet, + adrv904x_Core_GpioSourceOrxControl5_BfSet, + adrv904x_Core_GpioSourceOrxControl6_BfSet, + adrv904x_Core_GpioSourceOrxControl7_BfSet, + adrv904x_Core_GpioSourceOrxControl8_BfSet, + adrv904x_Core_GpioSourceOrxControl9_BfSet, + adrv904x_Core_GpioSourceOrxControl10_BfSet, + adrv904x_Core_GpioSourceOrxControl11_BfSet, + adrv904x_Core_GpioSourceOrxControl12_BfSet, + adrv904x_Core_GpioSourceOrxControl13_BfSet, + adrv904x_Core_GpioSourceOrxControl14_BfSet, + adrv904x_Core_GpioSourceOrxControl15_BfSet, + adrv904x_Core_GpioSourceOrxControl16_BfSet, + adrv904x_Core_GpioSourceOrxControl17_BfSet, + adrv904x_Core_GpioSourceOrxControl18_BfSet, + adrv904x_Core_GpioSourceOrxControl19_BfSet, + adrv904x_Core_GpioSourceOrxControl20_BfSet, + adrv904x_Core_GpioSourceOrxControl21_BfSet, + adrv904x_Core_GpioSourceOrxControl22_BfSet, + adrv904x_Core_GpioSourceOrxControl23_BfSet + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check gpio is valid */ + if (gpio >= ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. Out of range."); + return recoveryAction; + } + + /* Check muxSelect */ + if (muxSelect > ADRV904X_GPIO_PINMUX_STAGE2_ORX_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + muxSelect, + "Invalid mux input selected. Out of range."); + return recoveryAction; + } + + /* Set mux bitfield */ + gpioIdx = (uint32_t)(gpio); + recoveryAction = bfSetter[gpioIdx](device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + muxSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Pinmux Stg2 ORx selection failure"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioPinmuxStg2ActrlSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const uint16_t muxSelect) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t gpioIdx = 0U; + adi_adrv904x_ErrAction_e(*bfSetter[(uint32_t)(ADI_ADRV904X_GPIO_INVALID)])(adi_adrv904x_Device_t*, adi_adrv904x_SpiCache_t*, adrv904x_BfCoreChanAddr_e, uint16_t) = { + adrv904x_Core_DataFromControlOutSel0_BfSet, + adrv904x_Core_DataFromControlOutSel1_BfSet, + adrv904x_Core_DataFromControlOutSel2_BfSet, + adrv904x_Core_DataFromControlOutSel3_BfSet, + adrv904x_Core_DataFromControlOutSel4_BfSet, + adrv904x_Core_DataFromControlOutSel5_BfSet, + adrv904x_Core_DataFromControlOutSel6_BfSet, + adrv904x_Core_DataFromControlOutSel7_BfSet, + adrv904x_Core_DataFromControlOutSel8_BfSet, + adrv904x_Core_DataFromControlOutSel9_BfSet, + adrv904x_Core_DataFromControlOutSel10_BfSet, + adrv904x_Core_DataFromControlOutSel11_BfSet, + adrv904x_Core_DataFromControlOutSel12_BfSet, + adrv904x_Core_DataFromControlOutSel13_BfSet, + adrv904x_Core_DataFromControlOutSel14_BfSet, + adrv904x_Core_DataFromControlOutSel15_BfSet, + adrv904x_Core_DataFromControlOutSel16_BfSet, + adrv904x_Core_DataFromControlOutSel17_BfSet, + adrv904x_Core_DataFromControlOutSel18_BfSet, + adrv904x_Core_DataFromControlOutSel19_BfSet, + adrv904x_Core_DataFromControlOutSel20_BfSet, + adrv904x_Core_DataFromControlOutSel21_BfSet, + adrv904x_Core_DataFromControlOutSel22_BfSet, + adrv904x_Core_DataFromControlOutSel23_BfSet + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check gpio is valid */ + if (gpio >= ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. Out of range."); + return recoveryAction; + } + + /* Check muxSelect */ + if (muxSelect > ADRV904X_GPIO_PINMUX_STAGE2_ACTRL_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + muxSelect, + "Invalid mux input selected. Out of range."); + return recoveryAction; + } + + /* Set mux bitfield */ + gpioIdx = (uint32_t)(gpio); + recoveryAction = bfSetter[gpioIdx](device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + muxSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Pinmux Stg2 Actrl selection failure"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioPinmuxStg1RxSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const uint8_t muxSelect, + const uint8_t channelIdx) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxDigChanAddr_e baseAddr = ADRV904X_BF_SLICE_RX_0__RX_DIG; + uint8_t gpioIdx = 0U; + uint32_t chanSel = 0U; + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check gpio is valid */ + if (gpio >= ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. Out of range."); + return recoveryAction; + } + + /* Check muxSelect */ + if (muxSelect > ADRV904X_GPIO_PINMUX_STAGE1_RX_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + muxSelect, + "Invalid mux input selected. Out of range."); + return recoveryAction; + } + + /* Get baseAddress for this channel */ + chanSel = 1U << channelIdx; + recoveryAction = adrv904x_RxBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(chanSel), &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxBitfieldAddressGet issue"); + return recoveryAction; + } + + /* Set mux bitfield */ + gpioIdx = (uint8_t)(gpio); + recoveryAction = adrv904x_RxDig_RxGpioSourceSelection_BfSet(device, NULL, baseAddr, gpioIdx, muxSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Pinmux Stg1 Rx selection failure"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioPinmuxStg1TxSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const uint8_t muxSelect, + const uint8_t channelIdx) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxDigChanAddr_e baseAddr = ADRV904X_BF_SLICE_TX_0__TX_DIG; + uint32_t gpioIdx = 0U; + uint32_t chanSel = 0u; + adi_adrv904x_ErrAction_e(*bfSetter[(uint32_t)(ADI_ADRV904X_GPIO_INVALID)])(adi_adrv904x_Device_t*, adi_adrv904x_SpiCache_t*, adrv904x_BfTxDigChanAddr_e, uint8_t) = { + adrv904x_TxDig_TxGpioSourceSelection0_BfSet, + adrv904x_TxDig_TxGpioSourceSelection1_BfSet, + adrv904x_TxDig_TxGpioSourceSelection2_BfSet, + adrv904x_TxDig_TxGpioSourceSelection3_BfSet, + adrv904x_TxDig_TxGpioSourceSelection4_BfSet, + adrv904x_TxDig_TxGpioSourceSelection5_BfSet, + adrv904x_TxDig_TxGpioSourceSelection6_BfSet, + adrv904x_TxDig_TxGpioSourceSelection7_BfSet, + adrv904x_TxDig_TxGpioSourceSelection8_BfSet, + adrv904x_TxDig_TxGpioSourceSelection9_BfSet, + adrv904x_TxDig_TxGpioSourceSelection10_BfSet, + adrv904x_TxDig_TxGpioSourceSelection11_BfSet, + adrv904x_TxDig_TxGpioSourceSelection12_BfSet, + adrv904x_TxDig_TxGpioSourceSelection13_BfSet, + adrv904x_TxDig_TxGpioSourceSelection14_BfSet, + adrv904x_TxDig_TxGpioSourceSelection15_BfSet, + adrv904x_TxDig_TxGpioSourceSelection16_BfSet, + adrv904x_TxDig_TxGpioSourceSelection17_BfSet, + adrv904x_TxDig_TxGpioSourceSelection18_BfSet, + adrv904x_TxDig_TxGpioSourceSelection19_BfSet, + adrv904x_TxDig_TxGpioSourceSelection20_BfSet, + adrv904x_TxDig_TxGpioSourceSelection21_BfSet, + adrv904x_TxDig_TxGpioSourceSelection22_BfSet, + adrv904x_TxDig_TxGpioSourceSelection23_BfSet + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check gpio is valid */ + if (gpio >= ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. Out of range."); + return recoveryAction; + } + + /* Check muxSelect */ + if (muxSelect > ADRV904X_GPIO_PINMUX_STAGE1_TX_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + muxSelect, + "Invalid mux input selected. Out of range."); + return recoveryAction; + } + + /* Get baseAddress for this channel */ + chanSel = 1U << channelIdx; + recoveryAction = adrv904x_TxBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "TxBitfieldAddressGet issue"); + return recoveryAction; + } + + /* Set mux bitfield */ + gpioIdx = (uint32_t)(gpio); + recoveryAction = bfSetter[gpioIdx]( device, + NULL, + baseAddr, + muxSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Pinmux Stg1 Tx selection failure"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioPinmuxStg1OrxSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const uint8_t muxSelect, + const uint8_t channelIdx) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfOrxDigChanAddr_e baseAddr = ADRV904X_BF_SLICE_ORX_0__ORX_DIG; + uint32_t gpioIdx = 0U; + uint32_t chanSel = 0U; + adi_adrv904x_ErrAction_e(*bfSetter[(uint32_t)(ADI_ADRV904X_GPIO_INVALID)])(adi_adrv904x_Device_t*, adi_adrv904x_SpiCache_t*, adrv904x_BfOrxDigChanAddr_e, uint8_t) = { + adrv904x_OrxDig_OrxGpioSourceSelection0_BfSet, + adrv904x_OrxDig_OrxGpioSourceSelection1_BfSet, + adrv904x_OrxDig_OrxGpioSourceSelection2_BfSet, + adrv904x_OrxDig_OrxGpioSourceSelection3_BfSet, + adrv904x_OrxDig_OrxGpioSourceSelection4_BfSet, + adrv904x_OrxDig_OrxGpioSourceSelection5_BfSet, + adrv904x_OrxDig_OrxGpioSourceSelection6_BfSet, + adrv904x_OrxDig_OrxGpioSourceSelection7_BfSet, + adrv904x_OrxDig_OrxGpioSourceSelection8_BfSet, + adrv904x_OrxDig_OrxGpioSourceSelection9_BfSet, + adrv904x_OrxDig_OrxGpioSourceSelection10_BfSet, + adrv904x_OrxDig_OrxGpioSourceSelection11_BfSet, + adrv904x_OrxDig_OrxGpioSourceSelection12_BfSet, + adrv904x_OrxDig_OrxGpioSourceSelection13_BfSet, + adrv904x_OrxDig_OrxGpioSourceSelection14_BfSet, + adrv904x_OrxDig_OrxGpioSourceSelection15_BfSet, + adrv904x_OrxDig_OrxGpioSourceSelection16_BfSet, + adrv904x_OrxDig_OrxGpioSourceSelection17_BfSet, + adrv904x_OrxDig_OrxGpioSourceSelection18_BfSet, + adrv904x_OrxDig_OrxGpioSourceSelection19_BfSet, + adrv904x_OrxDig_OrxGpioSourceSelection20_BfSet, + adrv904x_OrxDig_OrxGpioSourceSelection21_BfSet, + adrv904x_OrxDig_OrxGpioSourceSelection22_BfSet, + adrv904x_OrxDig_OrxGpioSourceSelection23_BfSet + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check gpio is valid */ + if (gpio >= ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. Out of range."); + return recoveryAction; + } + + /* Check muxSelect */ + if (muxSelect > ADRV904X_GPIO_PINMUX_STAGE1_ORX_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + muxSelect, + "Invalid mux input selected. Out of range."); + return recoveryAction; + } + + /* Get baseAddress for this channel */ + chanSel = 0x100U << channelIdx; + recoveryAction = adrv904x_OrxBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(chanSel), &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "OrBitfieldAddressGet issue"); + return recoveryAction; + } + + /* Set mux bitfield */ + gpioIdx = (uint32_t)(gpio); + recoveryAction = bfSetter[gpioIdx]( device, + NULL, + baseAddr, + muxSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Pinmux Stg1 ORx selection failure"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioIeOverride(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const uint8_t override) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfCoreChanAddr_e baseAddr = (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR; + uint32_t lclMask = 0U; + uint32_t gpioIdx = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check gpio is valid */ + if (gpio >= ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. Out of range."); + return recoveryAction; + } + + /* Check IE override bit is valid */ + if ((override != ADI_ENABLE) && + (override != ADI_DISABLE) ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + override, + "Invalid Input Enable override bit for a GPIO. Must be 0 or 1."); + return recoveryAction; + } + + /* Get current bitfield value */ + recoveryAction = adrv904x_Core_GpioSourceControlOverride_BfGet( device, + NULL, + baseAddr, + &lclMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read gpio source control override bf"); + return recoveryAction; + } + + /* Update mask bit for this gpio */ + gpioIdx = (uint32_t)(gpio); + lclMask |= (override << gpioIdx ); + + /* Update bitfield value */ + recoveryAction = adrv904x_Core_GpioSourceControlOverride_BfSet( device, + NULL, + baseAddr, + lclMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write gpio source control override bf"); + return recoveryAction; + } + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioDestRxSet(adi_adrv904x_Device_t* const device, + const uint8_t destIdx, + const uint8_t channelIdx, + const uint8_t muxSelect) +{ + const uint8_t NUM_CHANS = 8U; + const uint8_t NUM_MUX_SELECTIONS = 24U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxDigChanAddr_e baseAddr = ADRV904X_BF_SLICE_RX_0__RX_DIG; + uint32_t chanSel = 0U; + adi_adrv904x_ErrAction_e(*bfSetter[ADRV904X_GPIO_NUM_DESTINATIONS_RX])(adi_adrv904x_Device_t*, adi_adrv904x_SpiCache_t*, adrv904x_BfRxDigChanAddr_e, uint8_t) = { + adrv904x_RxDig_TestGenEnGpioSelect_BfSet, + adrv904x_RxDig_AgcGainChangeGpioSelect_BfSet, + adrv904x_RxDig_AgcDecGainGpioSelect_BfSet, + adrv904x_RxDig_AgcIncGainGpioSelect_BfSet, + adrv904x_RxDig_AgcSlowloopFreezeEnableGpioSelect_BfSet, + adrv904x_RxDig_AgcManualGainLockGpioSelect_BfSet, + adrv904x_RxDig_RssiEnableGpioSelect_BfSet + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check inputs */ + if (destIdx >= ADRV904X_GPIO_NUM_DESTINATIONS_RX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + destIdx, + "Invalid destination index specified for setting Rx channel destination"); + return recoveryAction; + } + + if (channelIdx >= NUM_CHANS) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + channelIdx, + "Invalid channel index specified for setting Rx channel destination"); + return recoveryAction; + } + + if (muxSelect >= NUM_MUX_SELECTIONS) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + muxSelect, + "Invalid mux selection specified for setting Rx channel destination"); + return recoveryAction; + } + + /* Get baseAddress for this channel */ + chanSel = 1U << channelIdx; + recoveryAction = adrv904x_RxBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(chanSel), &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxBitfieldAddressGet issue"); + return recoveryAction; + } + + /* Set bitfield */ + recoveryAction = bfSetter[destIdx]( device, + NULL, + baseAddr, + muxSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error setting Rx Destination mux"); + return recoveryAction; + } + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioDestTxSet(adi_adrv904x_Device_t* const device, + const uint8_t destIdx, + const uint8_t channelIdx, + const uint8_t muxSelect) +{ + const uint8_t NUM_CHANS = 8U; + const uint8_t NUM_MUX_SELECTIONS = 24U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxDigChanAddr_e baseAddr = ADRV904X_BF_SLICE_TX_0__TX_DIG; + uint32_t chanSel = 0U; + adi_adrv904x_ErrAction_e(*bfSetter[ADRV904X_GPIO_NUM_DESTINATIONS_TX])(adi_adrv904x_Device_t*, adi_adrv904x_SpiCache_t*, adrv904x_BfTxDigChanAddr_e, uint8_t) = { + adrv904x_TxDig_Spi2TxAttenGpioSelect_BfSet, + adrv904x_TxDig_TpcIncrAttenGpioSelect_BfSet, + adrv904x_TxDig_TpcDecrAttenGpioSelect_BfSet, + adrv904x_TxDig_DtxForceGpioSelect_BfSet, + adrv904x_TxDig_TxAttenUpdGpioSelect_BfSet, + adrv904x_TxDig_TxDuc0TssiPinEnableSelect_BfSet + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check inputs */ + if (destIdx >= ADRV904X_GPIO_NUM_DESTINATIONS_TX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + destIdx, + "Invalid destination index specified for setting Tx channel destination"); + return recoveryAction; + } + + if (channelIdx >= NUM_CHANS) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + channelIdx, + "Invalid channel index specified for setting Tx channel destination"); + return recoveryAction; + } + + if (muxSelect >= NUM_MUX_SELECTIONS) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + muxSelect, + "Invalid mux selection specified for setting Tx channel destination"); + return recoveryAction; + } + + /* Get baseAddress for this channel */ + chanSel = 1U << channelIdx; + recoveryAction = adrv904x_TxBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "TxBitfieldAddressGet issue"); + return recoveryAction; + } + + /* Set bitfield */ + recoveryAction = bfSetter[destIdx]( device, + NULL, + baseAddr, + muxSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error setting Tx Destination mux"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioDestStreamTrigSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const uint8_t maskTrigger) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t gpioIdx = 0U; + uint32_t tmpMask = 0U; + uint32_t streamPinmask = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check gpio is valid */ + if ( gpio >= ADI_ADRV904X_GPIO_INVALID ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. Out of range."); + return recoveryAction; + } + + /* Check maskTrigger */ + if ((maskTrigger != ADI_ENABLE) && + (maskTrigger != ADI_DISABLE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + maskTrigger, + "Invalid GPIO Stream maskTrigger Option. Must be 0 or 1."); + return recoveryAction; + } + + /* Get current stream gpio pin mask value */ + recoveryAction = adrv904x_Core_StreamProcGpioPinMask_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &streamPinmask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GPIO Stream Trigger mask set failure"); + return recoveryAction; + } + + /* Update mask bit for selected gpio */ + gpioIdx = (uint32_t)(gpio); + tmpMask = (1U << gpioIdx); + /* if maskTrigger, bit needs to be set and stream WILL NOT be triggered*/ + if (maskTrigger == ADI_ENABLE) + { + streamPinmask |= tmpMask; + } + /* else, bit needs to be cleared and stream WILL be triggered */ + else + { + streamPinmask &= ~tmpMask; + } + + /* Set bitfield */ + recoveryAction = adrv904x_Core_StreamProcGpioPinMask_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + streamPinmask); + if(recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GPIO Stream Trigger mask set failure"); + return recoveryAction; + } + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioRouteValidChannelMaskCheck(adi_adrv904x_Device_t* const device, + const adrv904x_GpioRoute_e route, + const uint32_t channelMask, + uint8_t* const isValid) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, isValid); + + switch(route) + { + /* NO channel can be selected for these route types */ + case ADRV904X_GPIO_ROUTE_OFF: + case ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE: + case ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL: + case ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG: + case ADRV904X_GPIO_ROUTE_DIG_DEST_PPI: + case ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE: + case ADRV904X_GPIO_ROUTE_DIG_DEST_RADIO_SEQ: + *isValid = (channelMask == 0U) ? ADI_TRUE : ADI_FALSE; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + + /* Exactly 1 channel of 8 must be selected for these route types */ + case ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX: + case ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX: + *isValid = ((channelMask == 0x01) || + (channelMask == 0x02) || + (channelMask == 0x04) || + (channelMask == 0x08) || + (channelMask == 0x10) || + (channelMask == 0x20) || + (channelMask == 0x40) || + (channelMask == 0x80) ) + ? ADI_TRUE + : ADI_FALSE; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + + /* Only 1 channel of 2 can be selected for these route types */ + case ADRV904X_GPIO_ROUTE_DIG_PINMUX_ORX: + *isValid = ((channelMask == 0x01) || + (channelMask == 0x02) ) + ? ADI_TRUE + : ADI_FALSE; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + + /* At least 1 and at most 8 channels can be selected for these route types */ + case ADRV904X_GPIO_ROUTE_DIG_DEST_RX: + case ADRV904X_GPIO_ROUTE_DIG_DEST_TX: + case ADRV904X_GPIO_ROUTE_DIG_DEST_RX_CDDC_RSSI: + case ADRV904X_GPIO_ROUTE_DIG_DEST_TX_DTX: + *isValid = ((channelMask >= 0x01) && + (channelMask <= 0xff) ) + ? ADI_TRUE + : ADI_FALSE; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + + /* These route types, or any other, are not currently supported. */ + case ADRV904X_GPIO_ROUTE_ANA_DEST_CORE: + case ADRV904X_GPIO_ROUTE_ANA_DEST_RX: + case ADRV904X_GPIO_ROUTE_ANA_DEST_TX: + case ADRV904X_GPIO_ROUTE_ANA_DEST_ORX: + default: + *isValid = ADI_FALSE; + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + route, + "Unsupported route for checking channelMask"); + return recoveryAction; + break; + } + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioConnect(adi_adrv904x_Device_t* const device, + const uint8_t connect, + const adi_adrv904x_GpioPinSel_e gpio, + const adrv904x_GpioSignalInfo_t* const sigInfo, + uint32_t const channelIdx) +{ + static const uint8_t DEFAULT_STG3_SELECT = 0U; + static const uint8_t DEFAULT_STG2_SELECT = 0U; + static const uint8_t DEFAULT_STG1_SELECT = 0U; + static const uint8_t DEFAULT_DESTRX_SELECT = 0U; + static const uint8_t DEFAULT_DESTTX_SELECT = 0U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check if connect is valid */ + if ((connect != ADI_ENABLE) && + (connect != ADI_DISABLE) ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + connect, + "Invalid GPIO Connect/Disconnet Option. Must be 0 or 1."); + return recoveryAction; + } + + /* Check gpio is valid */ + if (gpio >= ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. Out of range."); + return recoveryAction; + } + + /* Setup the Route for this GPIO/signal (and channel, if this signal is a channel-instantiate signal) */ + switch(sigInfo->route) + { + case ADRV904X_GPIO_ROUTE_DIG_PINMUX_CORE: + recoveryAction = adrv904x_GpioPinmuxStg3Set( device, + gpio, + (connect ? sigInfo->topSelect : DEFAULT_STG3_SELECT) ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioPinmuxStg3Set issue"); + return recoveryAction; + } + break; + + case ADRV904X_GPIO_ROUTE_DIG_PINMUX_ACTRL: + recoveryAction = adrv904x_GpioPinmuxStg3Set( device, + gpio, + (connect ? sigInfo->topSelect : DEFAULT_STG3_SELECT) ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioPinmuxStg3Set issue"); + return recoveryAction; + } + recoveryAction = adrv904x_GpioPinmuxStg2ActrlSet( device, + gpio, + (connect ? sigInfo->targetSelect : DEFAULT_STG2_SELECT) ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioPinmuxStg2ActrlSet issue"); + return recoveryAction; + } + break; + + case ADRV904X_GPIO_ROUTE_DIG_PINMUX_RX: + recoveryAction = adrv904x_GpioPinmuxStg3Set( device, + gpio, + (connect ? sigInfo->topSelect : DEFAULT_STG3_SELECT) ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioPinmuxStg3Set issue"); + return recoveryAction; + } + recoveryAction = adrv904x_GpioPinmuxStg2RxSet( device, + gpio, + (connect ? channelIdx : DEFAULT_STG2_SELECT) ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioPinmuxStg2RxSet issue"); + return recoveryAction; + } + recoveryAction = adrv904x_GpioPinmuxStg1RxSet( device, + gpio, + (connect ? sigInfo->targetSelect : DEFAULT_STG1_SELECT), + channelIdx ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioPinmuxStg1RxSet issue"); + return recoveryAction; + } + + break; + + case ADRV904X_GPIO_ROUTE_DIG_PINMUX_TX: + recoveryAction = adrv904x_GpioPinmuxStg3Set( device, + gpio, + (connect ? sigInfo->topSelect : DEFAULT_STG3_SELECT) ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioPinmuxStg3Set issue"); + return recoveryAction; + } + recoveryAction = adrv904x_GpioPinmuxStg2TxSet( device, + gpio, + (connect ? channelIdx : DEFAULT_STG2_SELECT) ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioPinmuxStg2TxSet issue"); + return recoveryAction; + } + recoveryAction = adrv904x_GpioPinmuxStg1TxSet( device, + gpio, + (connect ? sigInfo->targetSelect : DEFAULT_STG1_SELECT), + channelIdx ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioPinmuxStg1TxSet issue"); + return recoveryAction; + } + break; + + case ADRV904X_GPIO_ROUTE_DIG_PINMUX_ORX: + recoveryAction = adrv904x_GpioPinmuxStg3Set( device, + gpio, + (connect ? sigInfo->topSelect : DEFAULT_STG3_SELECT) ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioPinmuxStg3Set issue"); + return recoveryAction; + } + recoveryAction = adrv904x_GpioPinmuxStg2OrxSet( device, + gpio, + (connect ? channelIdx : DEFAULT_STG2_SELECT) ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioPinmuxStg2OrxSet issue"); + return recoveryAction; + } + recoveryAction = adrv904x_GpioPinmuxStg1OrxSet( device, + gpio, + (connect ? sigInfo->targetSelect : DEFAULT_STG1_SELECT), + channelIdx ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioPinmuxStg1OrxSet issue"); + return recoveryAction; + } + break; + + case ADRV904X_GPIO_ROUTE_DIG_DEST_RX: + recoveryAction = adrv904x_GpioPinmuxStg3Set( device, gpio, DEFAULT_STG3_SELECT ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioPinmuxStg3Set issue"); + return recoveryAction; + } + recoveryAction = adrv904x_GpioDestRxSet( device, + sigInfo->targetSelect, + channelIdx, + connect ? (uint8_t)gpio : DEFAULT_DESTRX_SELECT); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioDestRxSet issue"); + return recoveryAction; + } + + break; + case ADRV904X_GPIO_ROUTE_DIG_DEST_TX: + recoveryAction = adrv904x_GpioPinmuxStg3Set( device, gpio, DEFAULT_STG3_SELECT ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioPinmuxStg3Set issue"); + return recoveryAction; + } + recoveryAction = adrv904x_GpioDestTxSet( device, + sigInfo->targetSelect, + channelIdx, + connect ? (uint8_t)gpio : DEFAULT_DESTTX_SELECT); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioDestTxSet issue"); + return recoveryAction; + } + break; + + case ADRV904X_GPIO_ROUTE_DIG_DEST_STREAM_TRIG: + recoveryAction = adrv904x_GpioPinmuxStg3Set( device, + gpio, + (connect ? sigInfo->topSelect : DEFAULT_STG3_SELECT) ); + + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioPinmuxStg3Set issue"); + return recoveryAction; + } + recoveryAction = adrv904x_GpioDestStreamTrigSet( device, + gpio, + !connect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "adrv904x_GpioDestStreamTrigSet issue"); + return recoveryAction; + } + break; + + case ADRV904X_GPIO_ROUTE_DIG_DEST_RADIO_SEQ: + recoveryAction = adrv904x_GpioPinmuxStg3Set( device, + gpio, + (connect ? sigInfo->topSelect : DEFAULT_STG3_SELECT) ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioPinmuxStg3Set issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_Sequencer_SsbSyncGpioSel_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS, + (uint8_t)gpio); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting SSB SYNC gpio sel."); + return recoveryAction; + } + break; + + case ADRV904X_GPIO_ROUTE_DIG_DEST_RX_CDDC_RSSI: + recoveryAction = adrv904x_GpioPinmuxStg3Set( device, + gpio, + (connect ? sigInfo->topSelect : DEFAULT_STG3_SELECT)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioPinmuxStg3Set issue"); + return recoveryAction; + } + + { + adrv904x_BfRxDigChanAddr_e baseAddr = ADRV904X_BF_SLICE_RX_0__RX_DIG; + /* Get baseAddress for this channel */ + recoveryAction = adrv904x_RxBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(1U << channelIdx), &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxBitfieldAddressGet issue"); + return recoveryAction; + } + recoveryAction = adrv904x_RxDig_RssiEnableGpioSelect_BfSet(device, + NULL, + baseAddr, + (uint8_t)gpio); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting Rssi Enable gpio sel."); + return recoveryAction; + } + } + break; + + case ADRV904X_GPIO_ROUTE_DIG_DEST_TX_DTX: + recoveryAction = adrv904x_GpioPinmuxStg3Set( device, gpio, DEFAULT_STG3_SELECT ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioPinmuxStg3Set issue"); + return recoveryAction; + } + recoveryAction = adrv904x_GpioDestTxSet( device, + sigInfo->targetSelect, + channelIdx, + connect ? (uint8_t)gpio : DEFAULT_DESTTX_SELECT); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioDestTxSet issue"); + return recoveryAction; + } + recoveryAction = adrv904x_GpioDestStreamTrigSet( device, + gpio, + !connect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "adrv904x_GpioDestStreamTrigSet issue"); + return recoveryAction; + } + break; + + /* TODO: PPI Dest Core signals need some extra special handling. Add later when we start using them */ + case ADRV904X_GPIO_ROUTE_DIG_DEST_PPI: /* Fallthrough */ + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + sigInfo->route, + "Unsupported route type for selected GPIO signal"); + return recoveryAction; + break; + } + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioAnalogIeOverride(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioAnaPinSel_e gpio, + const uint8_t override) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfCoreChanAddr_e baseAddr = (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR; + uint16_t lclMask = 0U; + uint32_t gpioIdx = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check analog gpio is valid */ + if (gpio >= ADI_ADRV904X_GPIO_ANA_INVALID || + gpio < ADI_ADRV904X_GPIO_ANA_00) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid analog GPIO selected. Out of range."); + return recoveryAction; + } + + /* Check IE override bit is valid */ + if ((override != ADI_ENABLE) && + (override != ADI_DISABLE) ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + override, + "Invalid Input Enable override bit for an analog GPIO. Must be 0 or 1."); + return recoveryAction; + } + + /* Get current bitfield value */ + recoveryAction = adrv904x_Core_GpioAnalogSourceControlOverride_BfGet( device, + NULL, + baseAddr, + &lclMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read analog gpio source control override bf"); + return recoveryAction; + } + + /* Update mask bit for this gpio */ + gpioIdx = (uint32_t)(gpio); + lclMask |= (override << gpioIdx ); + + /* Update bitfield value */ + recoveryAction = adrv904x_Core_GpioAnalogSourceControlOverride_BfSet( device, + NULL, + baseAddr, + lclMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write analog gpio source control override bf"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioAnalogPinmuxSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioAnaPinSel_e gpio, + const uint8_t muxSelect) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t gpioIdx = 0U; + adi_adrv904x_ErrAction_e(*bfSetter[(uint32_t)(ADI_ADRV904X_GPIO_ANA_INVALID)])(adi_adrv904x_Device_t*, adi_adrv904x_SpiCache_t*, adrv904x_BfCoreChanAddr_e, uint8_t) = { + adrv904x_Core_GpioAnalogSourceControl0_BfSet, + adrv904x_Core_GpioAnalogSourceControl1_BfSet, + adrv904x_Core_GpioAnalogSourceControl2_BfSet, + adrv904x_Core_GpioAnalogSourceControl3_BfSet, + adrv904x_Core_GpioAnalogSourceControl4_BfSet, + adrv904x_Core_GpioAnalogSourceControl5_BfSet, + adrv904x_Core_GpioAnalogSourceControl6_BfSet, + adrv904x_Core_GpioAnalogSourceControl7_BfSet, + adrv904x_Core_GpioAnalogSourceControl8_BfSet, + adrv904x_Core_GpioAnalogSourceControl9_BfSet, + adrv904x_Core_GpioAnalogSourceControl10_BfSet, + adrv904x_Core_GpioAnalogSourceControl11_BfSet, + adrv904x_Core_GpioAnalogSourceControl12_BfSet, + adrv904x_Core_GpioAnalogSourceControl13_BfSet, + adrv904x_Core_GpioAnalogSourceControl14_BfSet, + adrv904x_Core_GpioAnalogSourceControl15_BfSet + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check gpio is valid */ + if ( gpio >= ADI_ADRV904X_GPIO_ANA_INVALID ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. Out of range."); + return recoveryAction; + } + + /* Check muxSelect */ + if (muxSelect > ADRV904X_GPIO_ANALOG_PINMUX_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + muxSelect, + "Invalid mux input selected. Out of range."); + return recoveryAction; + } + + /* Set mux bitfield */ + gpioIdx = (uint32_t)(gpio); + recoveryAction = bfSetter[gpioIdx](device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + muxSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Analog Pinmux selection failure"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioAnalogPinmuxGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioAnaPinSel_e gpio, + uint8_t * const muxSelect) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t gpioIdx = 0U; + adi_adrv904x_ErrAction_e(*bfGetter[(uint32_t)(ADI_ADRV904X_GPIO_ANA_INVALID)])(adi_adrv904x_Device_t*, adi_adrv904x_SpiCache_t*, adrv904x_BfCoreChanAddr_e, uint8_t *) = { + adrv904x_Core_GpioAnalogSourceControl0_BfGet, + adrv904x_Core_GpioAnalogSourceControl1_BfGet, + adrv904x_Core_GpioAnalogSourceControl2_BfGet, + adrv904x_Core_GpioAnalogSourceControl3_BfGet, + adrv904x_Core_GpioAnalogSourceControl4_BfGet, + adrv904x_Core_GpioAnalogSourceControl5_BfGet, + adrv904x_Core_GpioAnalogSourceControl6_BfGet, + adrv904x_Core_GpioAnalogSourceControl7_BfGet, + adrv904x_Core_GpioAnalogSourceControl8_BfGet, + adrv904x_Core_GpioAnalogSourceControl9_BfGet, + adrv904x_Core_GpioAnalogSourceControl10_BfGet, + adrv904x_Core_GpioAnalogSourceControl11_BfGet, + adrv904x_Core_GpioAnalogSourceControl12_BfGet, + adrv904x_Core_GpioAnalogSourceControl13_BfGet, + adrv904x_Core_GpioAnalogSourceControl14_BfGet, + adrv904x_Core_GpioAnalogSourceControl15_BfGet + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, muxSelect); + + /* Check gpio is valid */ + if (gpio >= ADI_ADRV904X_GPIO_ANA_INVALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. Out of range."); + return recoveryAction; + } + + /* Set mux bitfield */ + gpioIdx = (uint32_t)(gpio); + recoveryAction = bfGetter[gpioIdx](device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + muxSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Reading Analog Pinmux selection failure"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpioAnalogConnect(adi_adrv904x_Device_t* const device, + const uint8_t connect, + const adi_adrv904x_GpioAnaPinSel_e gpio, + const adrv904x_GpioSignalInfo_t* const sigInfo, + uint32_t const channelIdx) +{ + (void)channelIdx; + static const uint8_t DEFAULT_STG3_SELECT = 0U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check if connect is valid */ + if ((connect != ADI_ENABLE) && + (connect != ADI_DISABLE) ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + connect, + "Invalid GPIO Connect/Disconnet Option. Must be 0 or 1."); + return recoveryAction; + } + + /* Check gpio is valid */ + if (gpio >= ADI_ADRV904X_GPIO_ANA_INVALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gpio, + "Invalid GPIO selected. Out of range."); + return recoveryAction; + } + + /* Setup the Route for this GPIO/signal (and channel, if this signal is a channel-instantiate signal) */ + switch(sigInfo->route) + { + case ADRV904X_GPIO_ROUTE_ANA_PINMUX_CORE: + recoveryAction = adrv904x_GpioAnalogPinmuxSet( device, + gpio, + (connect ? sigInfo->topSelect : DEFAULT_STG3_SELECT) ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioAnalogPinmuxSet issue"); + return recoveryAction; + } + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + sigInfo->route, + "Unsupported route type for selected GPIO signal"); + return recoveryAction; + break; + } + + return recoveryAction; +} + +/**************************************************************************** + * GP Int (General Purpose Interrupt) related functions + *************************************************************************** + */ + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpIntTypeSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpIntMask_t* const gpIntType) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Validate inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, gpIntType); + + recoveryAction = adrv904x_Core_GpInterruptsLevelPulseBLowerWord_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + gpIntType->lowerMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing GP Interrupt Type Lower Word."); + return recoveryAction; + } + + recoveryAction = adrv904x_Core_GpInterruptsLevelPulseBUpperWord_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + gpIntType->upperMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing GP Interrupt Type Upper Word."); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpIntTypeGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_GpIntMask_t* const gpIntType) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Validate inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, gpIntType); + + recoveryAction = adrv904x_Core_GpInterruptsLevelPulseBLowerWord_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &gpIntType->lowerMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading GP Interrupt Type Lower Word."); + return recoveryAction; + } + + recoveryAction = adrv904x_Core_GpInterruptsLevelPulseBUpperWord_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &gpIntType->upperMask ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading GP Interrupt Type Upper Word."); + return recoveryAction; + } + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpIntPreMcsInit( adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpIntPinMaskCfg_t* const pinMaskCfg) +{ + const adi_adrv904x_GpIntPinSelect_e pins = ADI_ADRV904X_GPINTALL; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + static const adi_adrv904x_GpIntMask_t initGpIntTypeMask = { ADRV904X_GP_INT_TYPE_DEFAULT_LOWER, ADRV904X_GP_INT_TYPE_DEFAULT_UPPER }; + + /* Validate inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, pinMaskCfg); + + /* Setup proper GP Interrupt Type defaults (Level vs Edge Triggered) */ + recoveryAction = adrv904x_GpIntTypeSet(device, &initGpIntTypeMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing default GP Interrupt Types."); + return recoveryAction; + } + + /* Set GP Int Pin Masks to selected states */ + recoveryAction = adi_adrv904x_GpIntPinMaskCfgSet(device, pins, pinMaskCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing GP Interrupt Mask Array."); + return recoveryAction; + } + + /* Clear all status bits */ + recoveryAction = adi_adrv904x_GpIntStatusClear(device, NULL); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error clearing GP Interrupt Status bits."); + return recoveryAction; + } + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GpIntPostMcsInit( adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpIntPinMaskCfg_t* const pinMaskCfg) +{ + const adi_adrv904x_GpIntPinSelect_e pins = ADI_ADRV904X_GPINTALL; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Validate inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, pinMaskCfg); + + /* Set GP Int Pin Masks to selected states */ + recoveryAction = adi_adrv904x_GpIntPinMaskCfgSet(device, pins, pinMaskCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing GP Interrupt Mask Array."); + return recoveryAction; + } + + /* Clear all status bits */ + recoveryAction = adi_adrv904x_GpIntStatusClear(device, NULL); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error clearing GP Interrupt Status bits."); + return recoveryAction; + } + + return recoveryAction; +} diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_init.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_init.c new file mode 100644 index 00000000000..1a4047f1aa7 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_init.c @@ -0,0 +1,1791 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adrv904x_init.c +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#include "../../private/include/adrv904x_init.h" +#include "../../private/bf/adrv904x_bf_core.h" +#include "../../private/bf/adrv904x_bf_rx_funcs.h" +#include "../../private/bf/adrv904x_bf_orx_dig.h" +#include "../../private/bf/adrv904x_bf_tx_funcs.h" +#include "../../private/bf/adrv904x_bf_tx_dig.h" +#include "../../private/include/adrv904x_rx.h" +#include "../../private/include/adrv904x_tx.h" +#include "../../private/include/adrv904x_gpio.h" +#include "../../private/include/adrv904x_cpu_cmd_tx_to_orx_mapping.h" + +#include "adi_adrv904x_radioctrl_types.h" + + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_INIT + +static uint32_t adrv904x_ClockDivWithFixedDiv(const uint32_t clock, const uint32_t clockMax, const uint32_t fixedDivLog2); +static uint32_t adrv904x_ErrReportConvert(const adi_adrv904x_Version_t version); + +/*********************/ +/* Private functions */ +/*********************/ + +/** +* \brief Calculates the divide value necessary to get the +* clock parameter under the clockMax using +* out = clock / 2 ^ (div + fixedDivLog2) +* +* \param clock Input clock frequency +* \param clockMax Maximum clock frequency +* \param fixedDivLog2 Constant added to the divider +* +* \retval uint32_t divider value calculated or the max value allowed +*/ +static uint32_t adrv904x_ClockDivWithFixedDiv( const uint32_t clock, + const uint32_t clockMax, + const uint32_t fixedDivLog2) +{ + uint32_t div = 0U; + static const uint32_t ADRV904X_POWER2_MAX = 8U; + + for (div = 0U; div < ADRV904X_POWER2_MAX; div++) + { + if (clock <= (clockMax << (div + fixedDivLog2))) + { + return div; + } + } + + return div; +} + +adi_adrv904x_ErrAction_e adrv904x_ClocksSync( adi_adrv904x_Device_t* const device, + const adi_adrv904x_Init_t* const init) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t idx = 0U; + uint32_t digDeviceClockDiv = 0U; + uint32_t mBiasClockDiv = 0U; + uint32_t digRefClock_kHz = 0U; + + static const uint32_t MASTER_BIAS_CLOCK_TARGET_kHz = 1000U; /* Prefer <1MHz */ + static const uint32_t MASTER_BIAS_CLOCK_MAX_kHz = 2000U; /* But 2MHz max */ + + static const uint32_t DIGDEVICECLOCKDIVMAX = 3U; + static const uint32_t MBIASCLOCKDIVMAX = 3U; + + static const uint32_t MBIASCLOCKDIVFIXED = 6U; /* Fixed divide-by-64 before master bias divider */ + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, init); + + // TODO: This sequence differs slightly than described in the Palau_MCS document + // however, this is the sequence used by DV team + + /* Set Digital device clock divider */ + digDeviceClockDiv = 0U; + + while( digDeviceClockDiv < DIGDEVICECLOCKDIVMAX && + (1 << digDeviceClockDiv) < device->initExtract.clocks.padDivideRatio ) + { + digDeviceClockDiv++; + } + + recoveryAction = adrv904x_Core_DevclkDivideRatio_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + digDeviceClockDiv); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue while attempting to set devclk divide ratio"); + return recoveryAction; + } + + if (init->clocks.DevClkOnChipTermResEn > 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + init->clocks.DevClkOnChipTermResEn, + "DevClkOnChipTermResEn can only be 0 or 1"); + return recoveryAction; + } + + recoveryAction = adrv904x_Core_DevclkBuffTermEn_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + init->clocks.DevClkOnChipTermResEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue while attempting to set devclk buffer Termination enable"); + return recoveryAction; + } + + recoveryAction = adrv904x_Core_DevclkBufferEnable_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADI_ENABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue while attempting to set devclk buffer enable"); + return recoveryAction; + } + + digRefClock_kHz = device->initExtract.clocks.deviceClockScaled_kHz; + + /* Set Master Bias clock divider */ + mBiasClockDiv = adrv904x_ClockDivWithFixedDiv(digRefClock_kHz, MASTER_BIAS_CLOCK_TARGET_kHz, MBIASCLOCKDIVFIXED); + if (mBiasClockDiv > MBIASCLOCKDIVMAX) + { + /* We've exceeded target clock frequency, so clamp to max divide value and verify + that we have not exceeded max clock frequency */ + mBiasClockDiv = MBIASCLOCKDIVMAX; + if( digRefClock_kHz > (MASTER_BIAS_CLOCK_MAX_kHz << (mBiasClockDiv + MBIASCLOCKDIVFIXED)) ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + mBiasClockDiv, + "Device Clock too fast!"); + return recoveryAction; + } + } + + recoveryAction = adrv904x_Core_MasterBiasClkDivRatio_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + mBiasClockDiv); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue while attempting to set dmaster bias clock div ratio"); + return recoveryAction; + } + + for (idx = 0; idx < 2U; ++idx) + { + recoveryAction = adrv904x_Core_MbiasIgenPd_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + idx, + ADI_DISABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue while attempting to clear mbias igen powerdown"); + return recoveryAction; + } + + recoveryAction = adrv904x_Core_MbiasTrimCompPd_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + idx, + ADI_DISABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue while attempting to clear mbias trim comp powerdown"); + return recoveryAction; + } + + recoveryAction = adrv904x_Core_MbiasRtrimResetb_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + idx, + ADI_ENABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue while attempting to clear mbias trim comp powerdown"); + return recoveryAction; + } + } + + recoveryAction = adrv904x_Core_DevclkDividerMcsResetb_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + ADI_ENABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue while attempting to set DevclkDivider MCS ResetB"); + return recoveryAction; + } + + /* THIS MUST BE done BEFORE starting up the main digital clocks DigitalClockPowerUp */ + recoveryAction = adrv904x_Core_UseDeviceClkAsHsdigclk_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADI_ENABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue while attempting to set use device clk as hsdig"); + return recoveryAction; + } + + recoveryAction = adrv904x_Core_DigitalClockPowerUp_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADI_ENABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue while attempting to set digital clock powerup"); + return recoveryAction; + } + + recoveryAction = adrv904x_Core_ArmClkEnable_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADI_ENABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue while attempting to set arm clock enable"); + return recoveryAction; + } + + recoveryAction = adrv904x_Core_ArmClkDivideRatio_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + device->initExtract.clocks.armClkDivideRatio); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue while attempting to set arm clk divide ratio"); + return recoveryAction; + } + + /* Calculate and set the ARM clock divider when on DEVCLK */ + recoveryAction = adrv904x_Core_ArmClkDivideRatioDevClk_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + device->initExtract.clocks.armClkDevClkDivRatio); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue while attempting to set arm clk device clk divide ratio"); + return recoveryAction; + } + + recoveryAction = adrv904x_Core_AhbSpiBridgeEnable_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADI_ENABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue while attempting to set ahb spi bridge enable bit"); + return recoveryAction; + } + + /* Clear clk divider sync bit, then set it */ + recoveryAction = adrv904x_Core_DigitalClockDividerSyncEn_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADI_ENABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue while attempting to clear digital clock divider sync enable bit"); + return recoveryAction; + } + recoveryAction = adrv904x_Core_DigitalClockDividerSyncEn_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADI_DISABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue while attempting to set digital clock divider sync enable bit"); + return recoveryAction; + } + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxOverloadProtectionSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxFuncsChanAddr_e rxFuncsChannelBitfieldAddr = (adrv904x_BfRxFuncsChanAddr_e) 0U; + adrv904x_BfOrxDigChanAddr_e orxDigChannelBitfieldAddr = (adrv904x_BfOrxDigChanAddr_e) 0U; + + /* Hardcoded values for ONLY Rx Overload Protection */ + static const uint8_t AGC_USE_COUNTERS_FOR_MGC = 0x1U; + static const uint8_t AGC_MANUAL_GAIN_PIN_CONTROL = 0x0U; + static const uint8_t AGC_ULB_THRESHOLD_EXCEEDED_COUNTER = 0X3U; + static const uint8_t AGC_ADC_HIGH_OVRG_EXCEEDED_COUNTER = 0x3U; + static const uint32_t AGC_GAIN_UPDATE_COUNTER = 0x3D090U; + static const uint8_t AGC_SLOW_LOOP_SETTLING_DELAY = 0x10U; + static const uint8_t AGC_RESET_ON_RXON = 0x0U; + static const uint8_t AGC_ENABLE_SYNC_PULSE_FOR_GAIN_COUNTER = 0x0U; + static const uint8_t HB2_OVERLOAD_USE_HB2_IN = 0x0U; + + /* Hardcoded values to set for BOTH Rx and ORx Overload Protection */ + static const uint8_t PEAK_SAMPLE_COUNT_AGC = 0x1U; + static const uint8_t PEAK_WINDOW_SIZE_AGC = 0x2U; + static const uint8_t OVERLOAD_EN_AGC = 0x1U; + static const uint8_t OVERLOAD_POWER_MODE_AGC = 0x1U; + static const uint16_t OVERLOAD_TH_AGC_PRE = 0x32D6U; + static const uint16_t OVERLOAD_TH_AGC_HIGH = 0x2862U; + + /* Check for valid device handle */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /*Check that the requested rxChannel is valid*/ + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7) && + (rxChannel != ADI_ADRV904X_ORX0) && + (rxChannel != ADI_ADRV904X_ORX1)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Invalid Rx Channel Requested for Rx Overload Protection"); + return recoveryAction; + } + + /* If rxChannel is a Rx Channel, use Rx_Funcs base addr and bitfields */ + if (((uint32_t)ADI_ADRV904X_RX_MASK_ALL & (uint32_t)rxChannel) > 0U) + { + /* Get base address for the Rx Channel */ + recoveryAction = (adi_adrv904x_ErrAction_e) adrv904x_RxFuncsBitfieldAddressGet( device, + rxChannel, + &rxFuncsChannelBitfieldAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to get Rx Funcs Base address for given Rx channel"); + return recoveryAction; + } + + /* Set bitfields */ + recoveryAction = adrv904x_RxFuncs_AgcUseCountersForMgc_BfSet(device, + NULL, + rxFuncsChannelBitfieldAddr, + AGC_USE_COUNTERS_FOR_MGC); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to set AgcUseCountersForMgc for given Rx channel"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxFuncs_AgcManualGainPinControl_BfSet(device, + NULL, + rxFuncsChannelBitfieldAddr, + AGC_MANUAL_GAIN_PIN_CONTROL); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to set AgcManualGainPinControl for given Rx channel"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxFuncs_AgcUlbThresholdExceededCounter_BfSet(device, + NULL, + rxFuncsChannelBitfieldAddr, + AGC_ULB_THRESHOLD_EXCEEDED_COUNTER); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to set AgcUlbThresholdExceededCounter for given Rx channel"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxFuncs_AgcAdcHighOvrgExceededCounter_BfSet(device, + NULL, + rxFuncsChannelBitfieldAddr, + AGC_ADC_HIGH_OVRG_EXCEEDED_COUNTER); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to set AgcAdcHighOvrgExceededCounter for given Rx channel"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxFuncs_AgcGainUpdateCounter_BfSet(device, + NULL, + rxFuncsChannelBitfieldAddr, + AGC_GAIN_UPDATE_COUNTER); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to set AgcGainUpdateCounter for given Rx channel"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxFuncs_AgcSlowLoopSettlingDelay_BfSet(device, + NULL, + rxFuncsChannelBitfieldAddr, + AGC_SLOW_LOOP_SETTLING_DELAY); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to set AgcSlowLoopSettlingDelay for given Rx channel"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxFuncs_PeakSampleCountAgc_BfSet(device, + NULL, + rxFuncsChannelBitfieldAddr, + PEAK_SAMPLE_COUNT_AGC); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to set PeakSampleCountAgc for given Rx channel"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxFuncs_PeakWindowSizeAgc_BfSet(device, + NULL, + rxFuncsChannelBitfieldAddr, + PEAK_WINDOW_SIZE_AGC); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to set PeakWindowSizeAgc for given Rx channel"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxFuncs_OverloadEnAgc_BfSet(device, + NULL, + rxFuncsChannelBitfieldAddr, + OVERLOAD_EN_AGC); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to set OverloadEnAgc for given Rx channel"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxFuncs_OverloadPowerModeAgc_BfSet(device, + NULL, + rxFuncsChannelBitfieldAddr, + OVERLOAD_POWER_MODE_AGC); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to set OverloadPowerModeAgc for given Rx channel"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxFuncs_Hb2OverloadUseHb2In_BfSet(device, + NULL, + rxFuncsChannelBitfieldAddr, + HB2_OVERLOAD_USE_HB2_IN); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to set Hb2OverloadUseHb2In for given Rx channel"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxFuncs_OverloadThAgcPre_BfSet(device, + NULL, + rxFuncsChannelBitfieldAddr, + OVERLOAD_TH_AGC_PRE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to set OverloadThAgcPre for given Rx channel"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxFuncs_OverloadThAgcHigh_BfSet(device, + NULL, + rxFuncsChannelBitfieldAddr, + OVERLOAD_TH_AGC_HIGH); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to set OverloadThAgcHigh for given Rx channel"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxFuncs_AgcResetOnRxon_BfSet(device, + NULL, + rxFuncsChannelBitfieldAddr, + AGC_RESET_ON_RXON); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to set AgcResetOnRxon for given Rx channel"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxFuncs_AgcEnableSyncPulseForGainCounter_BfSet(device, + NULL, + rxFuncsChannelBitfieldAddr, + AGC_ENABLE_SYNC_PULSE_FOR_GAIN_COUNTER); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to set AgcEnableSyncPulseForGainCounter for given Rx channel"); + return recoveryAction; + } + + /* Set and clear this bit to latch new threshold values */ + recoveryAction = adrv904x_RxFuncs_TiaValidOverride_BfSet(device, + NULL, + rxFuncsChannelBitfieldAddr, + ADI_ENABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to set TiaValidOverride for given Rx channel"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxFuncs_TiaValidOverride_BfSet(device, + NULL, + rxFuncsChannelBitfieldAddr, + ADI_DISABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to set TiaValidOverride for given Rx channel"); + return recoveryAction; + } + } + + /* If rxChannel is a ORx Channel, use ORx_Dig base addr and bitfields */ + /* Note: AGC bitfields from Rx Channels do not exist here, just overload protection bitfields.*/ + if (((uint32_t)ADI_ADRV904X_ORX_MASK_ALL & (uint32_t)rxChannel) > 0U) + { + /* Get base address for the ORx Channel */ + recoveryAction = adrv904x_OrxBitfieldAddressGet( device, + rxChannel, + &orxDigChannelBitfieldAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to get ORx Dig Base address for given ORx channel"); + return recoveryAction; + } + + /* Set bitfields */ + recoveryAction = adrv904x_OrxDig_OverloadCountTh_BfSet(device, + NULL, + orxDigChannelBitfieldAddr, + PEAK_SAMPLE_COUNT_AGC); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to set OverloadCountTh for given ORx channel"); + return recoveryAction; + } + + recoveryAction = adrv904x_OrxDig_OverloadDurationCount_BfSet(device, + NULL, + orxDigChannelBitfieldAddr, + PEAK_WINDOW_SIZE_AGC); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to set verloadDurationCount for given ORx channel"); + return recoveryAction; + } + + recoveryAction = adrv904x_OrxDig_OverloadEn_BfSet(device, + NULL, + orxDigChannelBitfieldAddr, + OVERLOAD_EN_AGC); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to set OverloadEn for given ORx channel"); + return recoveryAction; + } + + recoveryAction = adrv904x_OrxDig_OverloadPowerMode_BfSet(device, + NULL, + orxDigChannelBitfieldAddr, + OVERLOAD_POWER_MODE_AGC); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to set OverloadPowerMode for given ORx channel"); + return recoveryAction; + } + + recoveryAction = adrv904x_OrxDig_OverloadThPre_BfSet(device, + NULL, + orxDigChannelBitfieldAddr, + OVERLOAD_TH_AGC_PRE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to set OverloadThPre for given ORx channel"); + return recoveryAction; + } + recoveryAction = adrv904x_OrxDig_OverloadThHigh_BfSet(device, + NULL, + orxDigChannelBitfieldAddr, + OVERLOAD_TH_AGC_HIGH); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + rxChannel, + "Error while attempting to set OverloadThHigh for given ORx channel"); + return recoveryAction; + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxPowerMonitorInitialize(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const uint8_t totalInputInterpoloationRate) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + static const uint8_t PROTECTION_RAMP_STEP_SIZE_IN_NS = 20U; /* Calculate the step size field for 20ns*/ + static const uint8_t PROTECTION_RAMP_STEP_SIZE_MAX = 15U; + static const uint8_t PROTECTION_RAMP_STEP_SIZE_MIN = 10U; + static const uint8_t PROTECTION_RAMP_MAX_ATTENUATION = 0x64U; + static const uint8_t PROTECTION_RAMP_STEP_SIZE = 0x02U; + static const uint8_t PROTECTION_DISABLE_ANALOG_DELAY_FOR_SRD_RAMP = 0x01U; + static const uint8_t PROTECTION_DISABLE_ANALOG_DELAY_FOR_OTHER_RAMPS = 0x01U; + static const uint8_t PROTECTION_RAMP_UP_ENABLE = 0x01U; + static const uint8_t MAX_INTERPOLATION_RATE = 8U; + uint32_t chanIdx = 0; + uint8_t attenClkDivRatio = 0U; + uint32_t stepSize = 0U; + adrv904x_BfTxFuncsChanAddr_e txBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_FUNCS; + adrv904x_BfTxChanAddr_e txDigBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DIG; + uint32_t txChanSel = 0U; + + if ((totalInputInterpoloationRate == 0) || + (totalInputInterpoloationRate > MAX_INTERPOLATION_RATE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + totalInputInterpoloationRate, + "Total interpolation rate cannot be 0 or higher than 8"); + return recoveryAction; + } + + /* Write the same init config to all Tx channels */ + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + txChanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(txChannelMask, txChanSel)) + { + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(txChanSel), &txBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid Tx Channel used to determine SPI address"); + return recoveryAction; + } + + recoveryAction = adrv904x_TxBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(txChanSel), &txDigBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid Tx Channel used while reading tx dig address"); + return recoveryAction; + } + + recoveryAction = adrv904x_TxDig_TxAttenClkDivideRatio_BfGet(device, + NULL, + txDigBaseAddr, + &attenClkDivRatio); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx PA Protect Peak Overload Window Size"); + return recoveryAction; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionOverloadWindowSize_BfSet(device, + NULL, + txBaseAddr, + totalInputInterpoloationRate * 2U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx PA Protect Peak Overload Window Size"); + return recoveryAction; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionOverloadCountTh_BfSet(device, + NULL, + txBaseAddr, + totalInputInterpoloationRate); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx PA Protect Peak Overload Count"); + return recoveryAction; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionRampMaxAttenuation_BfSet(device, + NULL, + txBaseAddr, + PROTECTION_RAMP_MAX_ATTENUATION); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx Power Protect Ramp Max Attenuation"); + return recoveryAction; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionRampStepSize_BfSet(device, + NULL, + txBaseAddr, + PROTECTION_RAMP_STEP_SIZE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx Power Protect Ramp Step Size"); + return recoveryAction; + } + + /* Calculate step size as number of tx atten block clock cycles */ + stepSize = ((uint32_t)PROTECTION_RAMP_STEP_SIZE_IN_NS * device->initExtract.clocks.hsDigClk_kHz) / ((uint32_t)1U << (uint32_t)attenClkDivRatio); + stepSize = stepSize / 1000000U; + + /* Saturate step size before writing it to register */ + if (stepSize < PROTECTION_RAMP_STEP_SIZE_MIN) + { + stepSize = PROTECTION_RAMP_STEP_SIZE_MIN; + } + else if (stepSize > PROTECTION_RAMP_STEP_SIZE_MAX) + { + stepSize = PROTECTION_RAMP_STEP_SIZE_MAX; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionRampStepDuration_BfSet(device, + NULL, + txBaseAddr, + stepSize); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx Power Protect Ramp Step Duration"); + return recoveryAction; + } + + recoveryAction = adrv904x_TxFuncs_TxAttenPapDisAnalogDelay_BfSet(device, + NULL, + txBaseAddr, + PROTECTION_DISABLE_ANALOG_DELAY_FOR_OTHER_RAMPS); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx Power Protect Ramp Analog Delay"); + return recoveryAction; + } + + recoveryAction = adrv904x_TxFuncs_SrdDisAnalogDelay_BfSet(device, + NULL, + txBaseAddr, + PROTECTION_DISABLE_ANALOG_DELAY_FOR_SRD_RAMP); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx SRD Ramp Analog Delay"); + return recoveryAction; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionGainRampUpEn_BfSet(device, + NULL, + txBaseAddr, + PROTECTION_RAMP_UP_ENABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx PA Ramp Up Enable"); + return recoveryAction; + } + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxToOrxMappingInit(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxToOrxMappingConfig_t* const mappingConfig) +{ + static const adi_adrv904x_GpioSignal_e streamSig[ADI_ADRV904X_MAX_STREAMGPIO] = { + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_0, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_1, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_2, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_3, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_4, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_5, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_6, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_7, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_8, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_9, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_10, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_11, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_12, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_13, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_14, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_15, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_16, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_17, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_18, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_19, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_20, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_21, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_22, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_23 + }; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t numBits = 0U; + uint8_t idx = 0U; + uint8_t allInvalid = ADI_TRUE; + uint8_t allValid = ADI_TRUE; + adi_adrv904x_GpioPinSel_e pin = ADI_ADRV904X_GPIO_INVALID; + uint8_t pinIdx = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, mappingConfig); + + /*Range check tx Observability does NOT allow a Tx Channel to be observable on two ORx channels*/ + if (( ((mappingConfig->txObservability >> 0u) & 0x3u) == 0x3u) || + ( ((mappingConfig->txObservability >> 2u) & 0x3u) == 0x3u) || + ( ((mappingConfig->txObservability >> 4u) & 0x3u) == 0x3u) || + ( ((mappingConfig->txObservability >> 6u) & 0x3u) == 0x3u) || + ( ((mappingConfig->txObservability >> 8u) & 0x3u) == 0x3u) || + ( ((mappingConfig->txObservability >> 10u) & 0x3u) == 0x3u) || + ( ((mappingConfig->txObservability >> 12u) & 0x3u) == 0x3u) || + ( ((mappingConfig->txObservability >> 14u) & 0x3u) == 0x3u)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + mappingConfig->txObservability, + "Invalid Tx observability on ORx channels. A Tx channel cannot be observable by two ORx channels."); + return recoveryAction; + } + + /*Range check mapping mode*/ + switch (mappingConfig->mode) + { + case ADI_ADRV904X_TX_ORX_MAPPING_MODE_2BIT: + numBits = 2U; + break; + case ADI_ADRV904X_TX_ORX_MAPPING_MODE_3BIT: + numBits = 3U; + break; + case ADI_ADRV904X_TX_ORX_MAPPING_MODE_4BIT: + numBits = 4U; + break; + case ADI_ADRV904X_TX_ORX_MAPPING_MODE_6BIT: + numBits = 6U; + break; + case ADI_ADRV904X_TX_ORX_MAPPING_MODE_8BIT: + numBits = 8U; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + mappingConfig->mode, + "Invalid Tx To ORx Mapping mode selected. Must select 2/3/4/6/8 bit mode"); + return recoveryAction; + break; + } + + /*Range check Auto Switching Enable/Disable: Orx Atten*/ + if ((mappingConfig->autoSwitchOrxAttenEnable != ADI_ENABLE) && + (mappingConfig->autoSwitchOrxAttenEnable != ADI_DISABLE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + mappingConfig->autoSwitchOrxAttenEnable, + "Invalid Tx To ORx Mapping Auto Switching Enable setting for ORx Atten. Must select 0 or 1."); + return recoveryAction; + } + + /*Range check Auto Switching Enable/Disable: Orx Atten*/ + if ((mappingConfig->autoSwitchOrxNcoEnable != ADI_ENABLE) && + (mappingConfig->autoSwitchOrxNcoEnable != ADI_DISABLE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + mappingConfig->autoSwitchOrxNcoEnable, + "Invalid Tx To ORx Mapping Auto Switching Enable setting for ORx NCO. Must select 0 or 1."); + return recoveryAction; + } + + + /* Range check GPIO for VSWR */ + if ((mappingConfig->vswrDirOrx0Gpio < ADI_ADRV904X_GPIO_00) || + (mappingConfig->vswrDirOrx0Gpio > ADI_ADRV904X_GPIO_INVALID) || + (mappingConfig->vswrDirOrx1Gpio < ADI_ADRV904X_GPIO_00) || + (mappingConfig->vswrDirOrx1Gpio > ADI_ADRV904X_GPIO_INVALID) || + (mappingConfig->vswrDirCommonGpio < ADI_ADRV904X_GPIO_00) || + (mappingConfig->vswrDirCommonGpio > ADI_ADRV904X_GPIO_INVALID)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + mappingConfig, + "Invalid VSWR to ORx Mapping. GPIO pin must be a positive number between 0 and 24."); + return recoveryAction; + } + + if (mappingConfig->vswrDirCommonGpio != ADI_ADRV904X_GPIO_INVALID) + { + if(mappingConfig->vswrDirOrx0Gpio != ADI_ADRV904X_GPIO_INVALID || + mappingConfig->vswrDirOrx1Gpio != ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + mappingConfig, + "When VSWR direction common pin is 0~23, both of VSWR direction ORx0/1 pin MUST be set to Invalid (24)."); + return recoveryAction; + } + } + + if ((mappingConfig->vswrDirOrx0GpioPolarity > 1) || + (mappingConfig->vswrDirOrx1GpioPolarity > 1) || + (mappingConfig->vswrDirCommonGpioPolarity > 1)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + mappingConfig, + "Invalid VSWR To ORx Mapping. Polarity must be 0 or 1."); + return recoveryAction; + } + + /* Range check GPIO LUT entries */ + for (idx = 0U; idx < ADI_ADRV904X_TX_TO_ORX_MAPPING_PIN_TABLE_SIZE; idx++) + { + + if ((mappingConfig->pinTableOrx0[idx] != ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX0) && + (mappingConfig->pinTableOrx0[idx] != ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX1) && + (mappingConfig->pinTableOrx0[idx] != ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX2) && + (mappingConfig->pinTableOrx0[idx] != ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX3) && + (mappingConfig->pinTableOrx0[idx] != ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX4) && + (mappingConfig->pinTableOrx0[idx] != ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX5) && + (mappingConfig->pinTableOrx0[idx] != ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX6) && + (mappingConfig->pinTableOrx0[idx] != ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX7) && + (mappingConfig->pinTableOrx0[idx] != ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX0) && + (mappingConfig->pinTableOrx0[idx] != ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX1) && + (mappingConfig->pinTableOrx0[idx] != ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX2) && + (mappingConfig->pinTableOrx0[idx] != ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX3) && + (mappingConfig->pinTableOrx0[idx] != ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX4) && + (mappingConfig->pinTableOrx0[idx] != ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX5) && + (mappingConfig->pinTableOrx0[idx] != ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX6) && + (mappingConfig->pinTableOrx0[idx] != ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + mappingConfig->pinTableOrx0[idx], + "Invalid Tx To ORx Mapping GPIO Table entry for ORx0. Must be valid Mapping selection Tx0-7, or VSWR Tx0-7."); + return recoveryAction; + } + + if ((mappingConfig->pinTableOrx1[idx] != ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX0) && + (mappingConfig->pinTableOrx1[idx] != ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX1) && + (mappingConfig->pinTableOrx1[idx] != ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX2) && + (mappingConfig->pinTableOrx1[idx] != ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX3) && + (mappingConfig->pinTableOrx1[idx] != ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX4) && + (mappingConfig->pinTableOrx1[idx] != ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX5) && + (mappingConfig->pinTableOrx1[idx] != ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX6) && + (mappingConfig->pinTableOrx1[idx] != ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX7) && + (mappingConfig->pinTableOrx1[idx] != ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX0) && + (mappingConfig->pinTableOrx1[idx] != ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX1) && + (mappingConfig->pinTableOrx1[idx] != ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX2) && + (mappingConfig->pinTableOrx1[idx] != ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX3) && + (mappingConfig->pinTableOrx1[idx] != ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX4) && + (mappingConfig->pinTableOrx1[idx] != ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX5) && + (mappingConfig->pinTableOrx1[idx] != ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX6) && + (mappingConfig->pinTableOrx1[idx] != ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + mappingConfig->pinTableOrx1[idx], + "Invalid Tx To ORx Mapping GPIO Table entry for ORx1. Must be valid Mapping selection Tx0-7, or VSWR Tx0-7."); + return recoveryAction; + } + + } + + /*Range check GPIO select*/ + for (idx = 0U; idx < numBits; idx++) + { + if ((mappingConfig->gpioSelect[idx] < ADI_ADRV904X_GPIO_00) || + (mappingConfig->gpioSelect[idx] >= ADI_ADRV904X_GPIO_INVALID)) + { + allValid = ADI_FALSE; + } + else + { + allInvalid = ADI_FALSE; + } + } + + if ((allValid == ADI_FALSE) && + (allInvalid == ADI_FALSE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + mappingConfig->mode, + "Invalid GPIO selections for Tx To ORx Mapping mode. Must select a pin for all Mode bits or 0 Mode bits."); + return recoveryAction; + } + + /* If all selected GPIOs were valid, connect pins*/ + else if (allValid == ADI_TRUE) + { + for (idx = 0U; idx < numBits; idx++) + { + pin = mappingConfig->gpioSelect[idx]; + pinIdx = (uint8_t)pin; + recoveryAction = adrv904x_GpioSignalSet(device, pin, streamSig[pinIdx], 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "GPIO setup error while initializing Tx to ORx Mapping Configuration."); + return recoveryAction; + } + } + + + /* Connect GPIO pins for VSWR to ORx mapping control */ + if (mappingConfig->vswrDirCommonGpio != ADI_ADRV904X_GPIO_INVALID) + { + pin = mappingConfig->vswrDirCommonGpio; + pinIdx = (uint8_t)pin; + recoveryAction = adrv904x_GpioSignalSet(device, pin, streamSig[pinIdx], 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "GPIO setup error while initializing VSWR to ORx Mapping Configuration."); + return recoveryAction; + } + } + + if (mappingConfig->vswrDirOrx0Gpio != ADI_ADRV904X_GPIO_INVALID) + { + pin = mappingConfig->vswrDirOrx0Gpio; + pinIdx = (uint8_t)pin; + recoveryAction = adrv904x_GpioSignalSet(device, pin, streamSig[pinIdx], 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "GPIO setup error while initializing VSWR to ORx Mapping Configuration."); + return recoveryAction; + } + } + + if (mappingConfig->vswrDirOrx1Gpio != ADI_ADRV904X_GPIO_INVALID) + { + pin = mappingConfig->vswrDirOrx1Gpio; + pinIdx = (uint8_t)pin; + recoveryAction = adrv904x_GpioSignalSet(device, pin, streamSig[pinIdx], 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "GPIO setup error while initializing VSWR to ORx Mapping Configuration."); + return recoveryAction; + } + } + } + + /* If all invalid, no GPIO setup functions to call */ + else if(allInvalid) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + + /*Store tx to orx mapping config in device handle for later readback*/ + /*Note that simply writing to the device handle does not affect the pre-loaded Stream Image.*/ + /*The device handle is originally updated in adi_adrv904x_StreamImageWrite */ + ADI_LIBRARY_MEMCPY(&device->devStateInfo.txToOrxMappingConfig, mappingConfig, sizeof(adi_adrv904x_TxToOrxMappingConfig_t)); + + /* Translate Extended Flag */ + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_DfeCtrlTxToOrxMappingInit(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeCtrlTxToOrxMappingConfig_t* const mappingConfig) +{ + + const uint32_t MAX_GPIO_VAL = (1 << ADI_ADRV904X_DFE_CTRL_TX_TO_ORX_MAPPING_GPIO_MAX) - 1; + + const adi_adrv904x_GpioSignal_e digSig[ADI_ADRV904X_DFE_CTRL_MAX_GPIO_DIG] = { + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_0, + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_1, + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_2, + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_3, + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_4, + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_5, + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_6, + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_7, + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_8, + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_9, + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_10, + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_11, + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_12, + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_13, + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_14, + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_15, + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_16, + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_17, + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_18, + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_19, + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_20, + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_21, + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_22, + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_23 + }; + + const adi_adrv904x_GpioSignal_e anaSig[ADI_ADRV904X_DFE_CTRL_MAX_GPIO_ANA] = { + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_0, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_1, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_2, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_3, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_4, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_5, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_6, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_7, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_8, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_9, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_10, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_11, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_12, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_13, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_14, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_15 + }; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t idx = 0U; + uint8_t orx = 0U; + adi_adrv904x_GpioPinSel_e digPin = ADI_ADRV904X_GPIO_INVALID; + adi_adrv904x_GpioAnaPinSel_e anaPin = ADI_ADRV904X_GPIO_ANA_INVALID; + adi_adrv904x_GpioGenericPinSel_e genPin = ADI_ADRV904X_GPIO_GENERIC_INVALID; + uint8_t pinIdx = 0U; + uint8_t ch = 0U; + uint8_t foundErr = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, mappingConfig); + + /* Range check tx Observability. Verify that assignments are valid. */ + for (ch = 0U; ch < ADI_ADRV904X_MAX_TXCHANNELS; ch++) + { + uint8_t chMask = (uint8_t)(1 << ch); + uint8_t txValue = (uint8_t)(mappingConfig->txObservability >> (uint8_t)(ch * 2u)) & 0x3u; + + if ((device->initExtract.tx.txInitChannelMask & chMask) == 0u) + { + if (txValue != 0u) /* Unused Tx channel has ORx observability - not allowed */ + { + foundErr = 1U; + break; + } + } + + if (txValue == 0x3u) /* Tx assigned to ORx0 and ORx1 - not allowed */ + { + foundErr = 1U; + break; + } + if ((ch < (ADI_ADRV904X_MAX_TXCHANNELS / 2u)) && (txValue == 2u)) /* Tx0-3 assigned to ORx1 - not allowed */ + { + foundErr = 1U; + break; + } + if ((ch >= (ADI_ADRV904X_MAX_TXCHANNELS / 2u)) && (txValue == 1u)) /* Tx4-7 assigned to ORx0 - not allowed */ + { + foundErr = 1U; + break; + } + } + + if (foundErr == 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + mappingConfig->txObservability, + "Invalid Tx observability on ORx channels"); + return recoveryAction; + } + + /* Range check mapping mode */ + if (mappingConfig->mode != ADI_ADRV904X_TX_ORX_MAPPING_MODE_DFE_CTRL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + mappingConfig->mode, + "Invalid Tx To ORx Mapping mode selected. Expected DFE CTRL mode."); + return recoveryAction; + } + + /* Range check Auto Switching Enable/Disable: Orx Atten */ + if ((mappingConfig->autoSwitchOrxAttenEnable != ADI_ENABLE) && + (mappingConfig->autoSwitchOrxAttenEnable != ADI_DISABLE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + mappingConfig->autoSwitchOrxAttenEnable, + "Invalid Tx To ORx Mapping Auto Switching Enable setting for ORx Atten. Must select 0 or 1."); + return recoveryAction; + } + + /* Range check Auto Switching Enable/Disable: Orx Atten */ + if ((mappingConfig->autoSwitchOrxNcoEnable != ADI_ENABLE) && + (mappingConfig->autoSwitchOrxNcoEnable != ADI_DISABLE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + mappingConfig->autoSwitchOrxNcoEnable, + "Invalid Tx To ORx Mapping Auto Switching Enable setting for ORx NCO. Must select 0 or 1."); + return recoveryAction; + } + + /* Range check GPIO LUT entries */ + for (idx = 0U; idx < ADI_ADRV904X_TX_TO_ORX_MAPPING_PIN_TABLE_SIZE; idx++) + { + if (mappingConfig->pinTableOrx0[idx] > MAX_GPIO_VAL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + mappingConfig->pinTableOrx0[idx], + "Invalid Tx To ORx Mapping GPIO Table entry for ORx0. Must be value 0-15."); + return recoveryAction; + } + if (mappingConfig->pinTableOrx1[idx] > MAX_GPIO_VAL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + mappingConfig->pinTableOrx0[idx], + "Invalid Tx To ORx Mapping GPIO Table entry for ORx1. Must be value 0-15."); + return recoveryAction; + } + } + + /* Connect DFE ctrl mapping pins */ + for (orx = 0U; orx < ADI_ADRV904X_MAX_ORX; orx++) + { + for (idx = 0U; idx < ADI_ADRV904X_DFE_CTRL_TX_TO_ORX_MAPPING_GPIO_MAX; idx++) + { + genPin = (orx == 0) ? mappingConfig->gpioSelectOrx0[idx] : mappingConfig->gpioSelectOrx1[idx]; + + /* If Dig Pin connect */ + /* Else If Ana Pin connect */ + if ((genPin >= ADI_ADRV904X_GPIO_GENERIC_DIG_START) && + (genPin <= ADI_ADRV904X_GPIO_GENERIC_DIG_END)) + { + digPin = (adi_adrv904x_GpioPinSel_e)(genPin & 0xFF); + pinIdx = (uint8_t)digPin; + recoveryAction = adrv904x_GpioSignalSet(device, digPin, digSig[pinIdx], 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Digital GPIO setup error while initializing DFE Ctrl Tx to ORx Mapping Configuration."); + return recoveryAction; + } + } + else if ((genPin >= ADI_ADRV904X_GPIO_GENERIC_ANA_START) && + (genPin <= ADI_ADRV904X_GPIO_GENERIC_ANA_END)) + { + anaPin = (adi_adrv904x_GpioAnaPinSel_e)(genPin & 0xFF); + pinIdx = (uint8_t)anaPin; + recoveryAction = adrv904x_GpioAnalogSignalSet(device, anaPin, anaSig[pinIdx], 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Analog GPIO setup error while initializing DFE Ctrl Tx to ORx Mapping Configuration."); + return recoveryAction; + } + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + } /* end bit idx for loop */ + } /* end orx for loop */ + + /* Store DFE CTRL tx to orx mapping config in device handle for later readback */ + /* Note that simply writing to the device handle does not affect the pre-loaded Stream Image. */ + /* The device handle is originally updated in adi_adrv904x_StreamImageWrite */ + ADI_LIBRARY_MEMCPY(&device->devStateInfo.dfeCtrlTxToOrxMappingConfig, mappingConfig, sizeof(adi_adrv904x_DfeCtrlTxToOrxMappingConfig_t)); + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_UartCfg(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e pinSelect) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_GpioSignal_e signal = ADI_ADRV904X_GPIO_SIGNAL_UNUSED; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Range check gpio */ + if ((pinSelect < ADI_ADRV904X_GPIO_00) || + (pinSelect >= ADI_ADRV904X_GPIO_INVALID)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pinSelect, + "Invalid GPIO selected. Out of range."); + return recoveryAction; + } + + switch (pinSelect) + { + case ADI_ADRV904X_GPIO_12: + signal = ADI_ADRV904X_GPIO_SIGNAL_UART_PADTXSOUT; + break; + default: + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pinSelect, + "Invalid GPIO selected."); + return recoveryAction; + break; + } + + /* Set the signal for this gpio */ + recoveryAction = adrv904x_GpioSignalSet(device, pinSelect, signal, 0x00U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "GpioSignalSet issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_DfeUartCfg(adi_adrv904x_Device_t* const device, + const uint8_t index, + const adi_adrv904x_DfeUartSettings_t* const settings) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_GpioPinSel_e pinTx = ADI_ADRV904X_GPIO_INVALID; + adi_adrv904x_GpioPinSel_e pinRx = ADI_ADRV904X_GPIO_INVALID; + adi_adrv904x_GpioPinSel_e pinCts = ADI_ADRV904X_GPIO_INVALID; + adi_adrv904x_GpioPinSel_e pinRts = ADI_ADRV904X_GPIO_INVALID; + adi_adrv904x_GpioSignal_e sigTx = ADI_ADRV904X_GPIO_SIGNAL_INVALID; + adi_adrv904x_GpioSignal_e sigRx = ADI_ADRV904X_GPIO_SIGNAL_INVALID; + adi_adrv904x_GpioSignal_e sigCts = ADI_ADRV904X_GPIO_SIGNAL_INVALID; + adi_adrv904x_GpioSignal_e sigRts = ADI_ADRV904X_GPIO_SIGNAL_INVALID; + uint8_t allowTx = ADI_DISABLE; + uint8_t allowRx = ADI_DISABLE; + uint8_t allowCts = ADI_DISABLE; + uint8_t allowRts = ADI_DISABLE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, settings); + + /* Range check dfe uart index value and select appropriate parameters. Only supporting DFE Uart0. */ + switch (index) + { + case (0U): + pinTx = ADI_ADRV904X_GPIO_08; + pinRx = ADI_ADRV904X_GPIO_17; + pinCts = ADI_ADRV904X_GPIO_21; + pinRts = ADI_ADRV904X_GPIO_22; + sigTx = ADI_ADRV904X_GPIO_SIGNAL_DFE_UART0_PADTXSOUT; + sigRx = ADI_ADRV904X_GPIO_SIGNAL_DFE_UART0_PADRXSIN; + sigCts = ADI_ADRV904X_GPIO_SIGNAL_DFE_UART0_PADCTS; + sigRts = ADI_ADRV904X_GPIO_SIGNAL_DFE_UART0_PADRTSOUT; + allowTx = ADI_ENABLE; + allowRx = ADI_ENABLE; + allowCts = ADI_DISABLE; + allowRts = ADI_DISABLE; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + index, + "Invalid DFE UART Index selected."); + return recoveryAction; + break; + } + + /* Check for case that all UART pins are DISABLED. Set no error and exit */ + if ((settings->enableGpioTx == ADI_DISABLE) && + (settings->enableGpioRx == ADI_DISABLE) && + (settings->enableGpioCts == ADI_DISABLE) && + (settings->enableGpioRts == ADI_DISABLE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; + } + + /* Configure the UART pins */ + if (settings->enableGpioTx == ADI_ENABLE) + { + if (allowTx != ADI_ENABLE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + settings->enableGpioTx, + "TX pin not supported for this DFE UART port. Must select enableGpioTx = 0 (disable)."); + return recoveryAction; + } + + recoveryAction = adrv904x_GpioSignalSet(device, pinTx, sigTx, 0x00U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "GpioSignalSet issue."); + return recoveryAction; + } + } + + if (settings->enableGpioRx == ADI_ENABLE) + { + if (allowRx != ADI_ENABLE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + settings->enableGpioRx, + "RX pin not supported for this DFE UART port. Must select enableGpioRx = 0 (disable)."); + return recoveryAction; + } + + recoveryAction = adrv904x_GpioSignalSet(device, pinRx, sigRx, 0x00U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "GpioSignalSet issue."); + return recoveryAction; + } + } + + if (settings->enableGpioCts == ADI_ENABLE) + { + if (allowCts != ADI_ENABLE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + settings->enableGpioCts, + "CTS pin not supported for this DFE UART port. Must select enableGpioCts = 0 (disable)."); + return recoveryAction; + } + + recoveryAction = adrv904x_GpioSignalSet(device, pinCts, sigCts, 0x00U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "GpioSignalSet issue."); + return recoveryAction; + } + } + + if (settings->enableGpioRts == ADI_ENABLE) + { + if (allowRts != ADI_ENABLE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + settings->enableGpioRts, + "RTS pin not supported for this DFE UART port. Must select enableGpioRts = 0 (disable)."); + return recoveryAction; + } + + recoveryAction = adrv904x_GpioSignalSet(device, pinRts, sigRts, 0x00U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "GpioSignalSet issue."); + return recoveryAction; + } + } + + return recoveryAction; +} + +static uint32_t adrv904x_ErrReportConvert(const adi_adrv904x_Version_t version) +{ + uint32_t convertedVersion = 0U; + + /* \note Data Type Limitation due to static analysis issue with Variable Reporting; 32-bit Limit */ + + convertedVersion = ( uint32_t) ((uint8_t) version.buildVer) | /* Build Version (LSB) */ + ((uint32_t) ((uint8_t) version.maintenanceVer) << 8U) | /* Maintenance Version */ + ((uint32_t) ((uint8_t) version.minorVer) << 16U) | /* Minor Version */ + ((uint32_t) ((uint8_t) version.majorVer) << 24U); /* Major Version (MSB) */ + + return convertedVersion; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_ApiVersionRangeCheck( adi_adrv904x_Device_t* const device, + const adi_adrv904x_Version_t* const version, + const adi_adrv904x_Version_t* const minVersion, + const adi_adrv904x_Version_t* const maxVersion) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + uint32_t actualVersion = 0U; + uint32_t minimumVersion = 0U; + uint32_t maximumVersion = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, version); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, minVersion); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, maxVersion); + + if ((version->majorVer < minVersion->majorVer) || (version->majorVer > maxVersion->majorVer)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, version->majorVer, "Unexpected Major Version"); + } + + if ((version->minorVer < minVersion->minorVer) || (version->minorVer > maxVersion->minorVer)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, version->minorVer, "Unexpected Minor Version"); + } + + if ((version->maintenanceVer < minVersion->maintenanceVer) || (version->maintenanceVer > maxVersion->maintenanceVer)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, version->maintenanceVer, "Unexpected Maintenance Version"); + } + + if ((version->buildVer < minVersion->buildVer) || (version->buildVer > maxVersion->buildVer)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, version->buildVer, "Unexpected Build Version"); + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + actualVersion = adrv904x_ErrReportConvert(*version); + minimumVersion = adrv904x_ErrReportConvert(*minVersion); + maximumVersion = adrv904x_ErrReportConvert(*maxVersion); + + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, actualVersion, "Actual Version (Note: For Illustrative Purposes Only. Packing For Error Reporting Restricts Each Version to 8-Bits)"); + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, minimumVersion, "Minimum Version Expected (Note: For Illustrative Purposes Only. Packing For Error Reporting Restricts Each Version to 8-Bits)"); + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, maximumVersion, "Maximum Version Expected (Note: For Illustrative Purposes Only. Packing For Error Reporting Restricts Each Version to 8-Bits)"); + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SpiStreamingEntry( adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t spiConfigB = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Mask with ADI_TRUE here to check bit 0 */ + /* Each function that turns on SPI streaming should also be turning it off, however, + * if it happens that SPI streaming is On we do not need to do anything. + * This if-statement only evaluates to TRUE when spiStreaming is NOT currently ON + * and when allowSpiStreaming is TRUE. + */ + if (((device->devStateInfo.spiStreamingOn & ADI_TRUE) != ADI_TRUE) && + ((device->devStateInfo.spiOptions.allowSpiStreaming & ADI_TRUE) == ADI_TRUE)) + { + /* Writing CONFFIG_B to zero puts the part in streaming mode. */ + recoveryAction = adi_adrv904x_Register32Write(device, NULL, ADRV904X_ADDR_SPI_INTERFACE_CONFIG_B, spiConfigB, 0xFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue writing to CONFIG_B register"); + return recoveryAction; + } + + device->devStateInfo.spiStreamingOn = ADI_TRUE; + + /* Force an address word on the next SPI call by giving an invalid address here. + * adrv904x_DirectSpiDataPack checks this value as part of the logic to determine if an address word must + * be inserted. + * */ + device->devStateInfo.previousSpiStreamingAddress = 0xFFFFFFFFU; + } + else + { + /* No Action Required */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SpiStreamingExit(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t spiConfigB = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Mask with ADI_TRUE here to check bit 0 */ + /* Only perform the write when it's needed, ie Spi streaming is ON. + * */ + if ((device->devStateInfo.spiStreamingOn & ADI_TRUE) == ADI_TRUE) + { + spiConfigB |= ADRV904X_CONFIG_B_SINGLE_INSTRUCTION; + recoveryAction = adi_adrv904x_Register32Write(device, NULL, ADRV904X_ADDR_SPI_INTERFACE_CONFIG_B, spiConfigB, 0xFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue writing to CONFIG_B register"); + return recoveryAction; + } + + device->devStateInfo.spiStreamingOn = ADI_FALSE; + } + else + { + /* No Action Required */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + + return recoveryAction; +} diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_radioctrl.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_radioctrl.c new file mode 100644 index 00000000000..01dec9602ef --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_radioctrl.c @@ -0,0 +1,4210 @@ +/** +* Copyright 2015 - 2023 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adrv904x_radioctrl.c + * \brief Contains ADRV904X radio control related private function implementations. + * + * ADRV904X API Version: 2.10.0.4 + */ +#include "../../private/include/adrv904x_radioctrl.h" +#include "../../private/include/adrv904x_rx.h" +#include "../../private/include/adrv904x_tx.h" +#include "../../private/bf/adrv904x_bf_core.h" +#include "../../private/include/adrv904x_init.h" +#include "../../private/include/adrv904x_cpu.h" +#include "../../private/include/adrv904x_cpu_cmd_ctrl.h" +#include "../../private/bf/adrv904x_bf_rx_dig.h" +#include "../../private/bf/adrv904x_bf_tx_dig.h" +#include "../../private/include/adrv904x_stream_proc_types.h" +#include "../../private/include/adrv904x_cpu_scratch_registers.h" + +#include "../../private/include/adrv904x_dfe_svc_radio_ctrl_sequencer_t.h" +#include "../../private/include/adrv904x_dfe_cpu.h" +#include "../../private/include/adrv904x_cpu_dfe_init_memory.h" +#include "../../private/include/adrv904x_dfe_memory.h" +#include "../../private/include/adrv904x_gpio.h" +#include "../../private/bf/adrv904x_bf_core.h" + +#include "adi_adrv904x_rx_types.h" +#include "adi_adrv904x_tx_types.h" +#include "adi_adrv904x_cals.h" +#include "adi_adrv904x_cpu.h" +#include "adi_adrv904x_types.h" + +#include "../../private/bf/adrv904x_bf_sequencer.h" + + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_RADIOCTRL + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxEnableSet(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const uint32_t rxChannelEnable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t orxChanMask = rxChannelMask >> ADI_ADRV904X_MAX_RX_ONLY; + uint8_t orxChanEnable = rxChannelEnable >> ADI_ADRV904X_MAX_RX_ONLY; + uint8_t bfValue = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + recoveryAction = adrv904x_Core_RadioControlInterfaceOrxSpiEn_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &bfValue); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to enable Radio Control Orx channels."); + return recoveryAction; + } + + /* Update the bfValue */ + ADRV904X_BF_UPDATE(bfValue, orxChanEnable, orxChanMask, 0U); + + recoveryAction = adrv904x_Core_RadioControlInterfaceOrxSpiEn_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to enable Radio Control ORX channels."); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxEnableSet(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const uint32_t rxChannelEnable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t bfValue = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + recoveryAction = adrv904x_Core_RadioControlInterfaceRxSpiEn_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &bfValue); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to enable Radio Control RX channels."); + return recoveryAction; + } + + /* Update the bfValue */ + ADRV904X_BF_UPDATE(bfValue, (uint8_t)rxChannelEnable, (uint8_t)rxChannelMask, 0U); + + recoveryAction = adrv904x_Core_RadioControlInterfaceRxSpiEn_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + bfValue); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to enable Radio Control RX channels."); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxEnableSet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const uint32_t txChannelEnable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t bfValue = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + recoveryAction = adrv904x_Core_RadioControlInterfaceTxSpiEn_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &bfValue); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to enable Radio Control TX channels."); + return recoveryAction; + } + + /* Update the bfValue */ + ADRV904X_BF_UPDATE(bfValue, (uint8_t)txChannelEnable, (uint8_t)txChannelMask, 0U); + + recoveryAction = adrv904x_Core_RadioControlInterfaceTxSpiEn_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + bfValue); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to enable Radio Control TX channels."); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxTxEnableSetRangeCheck(adi_adrv904x_Device_t* const device, + const uint32_t orxChannelMask, + const uint32_t orxChannelEnable, + const uint32_t rxChannelMask, + const uint32_t rxChannelEnable, + const uint32_t txChannelMask, + const uint32_t txChannelEnable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + /*TODO: update this static const once Tx channels have been numbered from Tx/Rx 0 - Tx/Rx7 */ + static const uint32_t ALL_TX_MASK = (ADI_ADRV904X_TX0 | ADI_ADRV904X_TX1 | ADI_ADRV904X_TX2 | ADI_ADRV904X_TX3 | + ADI_ADRV904X_TX4 | ADI_ADRV904X_TX5 | ADI_ADRV904X_TX6 | ADI_ADRV904X_TX7); + static const uint32_t ALL_RX_MASK = (ADI_ADRV904X_RX0 | ADI_ADRV904X_RX1 | ADI_ADRV904X_RX2 | ADI_ADRV904X_RX3 | + ADI_ADRV904X_RX4 | ADI_ADRV904X_RX5 | ADI_ADRV904X_RX6 | ADI_ADRV904X_RX7); + static const uint32_t ALL_ORX_MASK = (ADI_ADRV904X_ORX0 | ADI_ADRV904X_ORX1); + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + (void)orxChannelEnable; + (void)rxChannelEnable; + (void)txChannelEnable; + + /* Check that ARM and Stream processors have been loaded before enabling */ + if (device->devStateInfo.devState < ADI_ADRV904X_STATE_ALLCPUSLOADED) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Channel Enable/Disable is valid only after loading of CPU(s) & Stream processors"); + return recoveryAction; + } + + /* Check that ORx channel mask is valid */ + if ((orxChannelMask & (~(uint32_t)ALL_ORX_MASK)) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + NULL, + "Invalid ORx Channel mask encountered while attempting to enable ORx signal chain in SPI mode."); + return recoveryAction; + } + + /* Check that Rx channel mask is valid */ + if (rxChannelMask > ALL_RX_MASK) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + NULL, + "Invalid Rx Channel mask encountered while attempting to enable Rx signal chain in SPI mode."); + return recoveryAction; + } + + /* Check that Tx channel mask is valid */ + if (txChannelMask > ALL_TX_MASK) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txChannelMask, + "Invalid Tx Channel mask encountered while attempting to enable Tx signal chain in SPI mode."); + return recoveryAction; + } + + /* Check that requested ORx channels are initialized */ + if ((orxChannelMask & device->devStateInfo.initializedChannels) != orxChannelMask) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChannelMask, + "Requested ORx channels to enable are not initialized"); + return recoveryAction; + } + + /* Check that requested Rx/ORx channels are initialized */ + if ((rxChannelMask & device->devStateInfo.initializedChannels) != rxChannelMask) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChannelMask, + "Requested Rx channels to enable are not initialized"); + return recoveryAction; + } + + /* Check that requested Tx channels are initialized */ + if ((txChannelMask & (device->devStateInfo.initializedChannels >> ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET)) != txChannelMask) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txChannelMask, + "Requested Tx channels to be enable are not initialized"); + return recoveryAction; + } + + return ADI_ADRV904X_ERR_ACT_NONE; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioCtrlCfgSetRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RadioCtrlModeCfg_t* const radioCtrlCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, radioCtrlCfg); + + static const uint32_t ALL_RX_MASK = (ADI_ADRV904X_RX0 | ADI_ADRV904X_RX1 | ADI_ADRV904X_RX2 | ADI_ADRV904X_RX3 | + ADI_ADRV904X_RX4 | ADI_ADRV904X_RX5 | ADI_ADRV904X_RX6 | ADI_ADRV904X_RX7); + static const uint32_t ALL_ORX_MASK = (ADI_ADRV904X_ORX0 | ADI_ADRV904X_ORX1); + + if (radioCtrlCfg->rxRadioCtrlModeCfg.rxEnableMode != ADI_ADRV904X_RX_EN_INVALID_MODE) + { + /*check if Rx profile is valid*/ + if ((device->devStateInfo.profilesValid & ADI_ADRV904X_RX_PROFILE_VALID) != ADI_ADRV904X_RX_PROFILE_VALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + device->devStateInfo.profilesValid, + "No valid Rx profile is loaded."); + return recoveryAction; + } + + /*Check that if requested Rx Channel is valid*/ + if (((radioCtrlCfg->rxRadioCtrlModeCfg.rxChannelMask & (~(uint32_t)ALL_RX_MASK)) != 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + radioCtrlCfg->rxRadioCtrlModeCfg.rxChannelMask, + "Invalid Rx channel is selected. Valid values are any combinations of Rx0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + if ((radioCtrlCfg->rxRadioCtrlModeCfg.rxEnableMode != ADI_ADRV904X_RX_EN_SPI_MODE) && + (radioCtrlCfg->rxRadioCtrlModeCfg.rxEnableMode != ADI_ADRV904X_RX_EN_PIN_MODE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + radioCtrlCfg->rxRadioCtrlModeCfg.rxEnableMode, + "Invalid Rx signal chain enable mode selected. Valid values include SPI, Pin mode"); + return recoveryAction; + } + } + + if (radioCtrlCfg->txRadioCtrlModeCfg.txEnableMode != ADI_ADRV904X_TX_EN_INVALID_MODE) + { + /*check if Tx profile is valid*/ + if ((device->devStateInfo.profilesValid & ADI_ADRV904X_TX_PROFILE_VALID) != ADI_ADRV904X_TX_PROFILE_VALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + device->devStateInfo.profilesValid, + "No valid Tx profile is loaded."); + return recoveryAction; + } + + /*Check that if requested Tx Channel is valid*/ + if (((radioCtrlCfg->txRadioCtrlModeCfg.txChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + radioCtrlCfg->txRadioCtrlModeCfg.txChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + return recoveryAction; + + } + + if ((radioCtrlCfg->txRadioCtrlModeCfg.txEnableMode != ADI_ADRV904X_TX_EN_SPI_MODE) && + (radioCtrlCfg->txRadioCtrlModeCfg.txEnableMode != ADI_ADRV904X_TX_EN_PIN_MODE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + radioCtrlCfg->txRadioCtrlModeCfg.txEnableMode, + "Invalid Tx signal chain enable mode selected. Valid values include SPI, Pin mode"); + return recoveryAction; + } + } + + if (radioCtrlCfg->orxRadioCtrlModeCfg.orxEnableMode != ADI_ADRV904X_ORX_EN_INVALID_MODE) + { + if ((device->devStateInfo.profilesValid & ADI_ADRV904X_ORX_PROFILE_VALID) != ADI_ADRV904X_ORX_PROFILE_VALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + device->devStateInfo.profilesValid, + "No valid ORx profile is loaded."); + return recoveryAction; + } + + /*Check that if requested ORx Channel is valid*/ + if ((radioCtrlCfg->orxRadioCtrlModeCfg.orxChannelMask & (~(uint32_t)ALL_ORX_MASK))) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + radioCtrlCfg->orxRadioCtrlModeCfg.orxChannelMask, + "Invalid ORx channel is selected. Valid values are any combinations of ORx0/1"); + return recoveryAction; + } + + if ((radioCtrlCfg->orxRadioCtrlModeCfg.orxEnableMode != ADI_ADRV904X_ORX_EN_SPI_MODE) && + (radioCtrlCfg->orxRadioCtrlModeCfg.orxEnableMode != ADI_ADRV904X_ORX_EN_PIN_MODE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + radioCtrlCfg->orxRadioCtrlModeCfg.orxEnableMode, + "Invalid ORx signal chain enable mode selected. Valid values include SPI, Pin mode"); + return recoveryAction; + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxRadioCtrlCfgSet(adi_adrv904x_Device_t * const device, + adi_adrv904x_RxRadioCtrlModeCfg_t* const rxRadioCtrlModeCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t armModeRxChanMask = 0x0U; /* Bit N indicates RxN is in ARM mode. ARM mode overrides SPI/Pin-mode. */ + uint8_t spiModeRxChanMask = 0x0U; /* If RxN is not in ARM mode then bit N here indicates RxN is SPI-mode (1) or Pin-mode (0) */ + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxRadioCtrlModeCfg); + + /* Fetch the current Spi-enabled/Pin-enabled and ARM override status for Rx channels */ + recoveryAction = adrv904x_Core_RadioControlInterfaceRxSpiModeSel_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &spiModeRxChanMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API Get RX Radio Control Cfg Failed."); + return recoveryAction; + } + + /* For both pin or SPI mode we disable ARM MODE for the Rx channels */ + armModeRxChanMask = ((uint8_t) rxRadioCtrlModeCfg->rxChannelMask); + recoveryAction = adrv904x_Core_RadioControlInterfaceRxArmModeSelClr_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + armModeRxChanMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API RX Radio Control Cfg Failed."); + return recoveryAction; + } + + if (rxRadioCtrlModeCfg->rxEnableMode == ADI_ADRV904X_RX_EN_SPI_MODE) + { + /* Enable Spi mode for the channels - turn on the relevant bits in SpiModeSel register */ + spiModeRxChanMask |= rxRadioCtrlModeCfg->rxChannelMask; + + } + else if (rxRadioCtrlModeCfg->rxEnableMode == ADI_ADRV904X_RX_EN_PIN_MODE) + { + /* Enable pin-mode for the channels - turn off the relevant bits in SpiModeSel register */ + spiModeRxChanMask &= ~((uint8_t) rxRadioCtrlModeCfg->rxChannelMask); + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxRadioCtrlModeCfg->rxEnableMode, + "Invalid Rx Enable Mode encountered while attempting to configure Rx radio ctrl configuration settings"); + return recoveryAction; + } + + /* Write the updated SpiMode register */ + recoveryAction = adrv904x_Core_RadioControlInterfaceRxSpiModeSel_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + (uint8_t) spiModeRxChanMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API RX Radio Control Cfg Failed."); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxRadioCtrlCfgSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_TxRadioCtrlModeCfg_t* const txRadioCtrlModeCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t txSpiModeSel = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, txRadioCtrlModeCfg); + + /* Disable ARM MODE for Tx ctrl configuration */ + recoveryAction = adrv904x_Core_RadioControlInterfaceTxArmModeSelClr_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + (uint8_t) txRadioCtrlModeCfg->txChannelMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API TX Radio Control Cfg Failed."); + return recoveryAction; + } + + /* Read Spi mode */ + recoveryAction = adrv904x_Core_RadioControlInterfaceTxSpiModeSel_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &txSpiModeSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API TX Radio Control Cfg Failed."); + return recoveryAction; + } + + /*For Spi mode set Spi Mode bitfield to 1 and for pin mode set the Spi mode bitfield to 0*/ + if (txRadioCtrlModeCfg->txEnableMode == ADI_ADRV904X_TX_EN_SPI_MODE) + { + /* Enable Spi mode */ + txSpiModeSel |= (uint8_t) txRadioCtrlModeCfg->txChannelMask; + + } + else if (txRadioCtrlModeCfg->txEnableMode == ADI_ADRV904X_TX_EN_PIN_MODE) + { + /* Disable Spi mode */ + txSpiModeSel &= ~((uint8_t) txRadioCtrlModeCfg->txChannelMask); + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txRadioCtrlModeCfg->txEnableMode, + "Invalid Tx Enable Mode encountered while attempting to configure Tx radio ctrl configuration settings"); + return recoveryAction; + } + + recoveryAction = adrv904x_Core_RadioControlInterfaceTxSpiModeSel_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + txSpiModeSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API TX Radio Control Cfg Failed."); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxRadioCtrlCfgSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_ORxRadioCtrlModeCfg_t* const orxRadioCtrlModeCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t orxSpiModeSel = 0U; + uint8_t orxChanMask = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, orxRadioCtrlModeCfg); + + orxChanMask = (uint8_t) (orxRadioCtrlModeCfg->orxChannelMask >> ADI_ADRV904X_MAX_RX_ONLY); + + /* Disable ARM override ctrl for ORx ctrl configuration */ + recoveryAction = adrv904x_Core_RadioControlInterfaceOrxArmModeSelClr_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + orxChanMask); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API ORX Radio Control Cfg Failed."); + return recoveryAction; + } + + /* Read Spi mode sel */ + recoveryAction = adrv904x_Core_RadioControlInterfaceOrxSpiModeSel_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &orxSpiModeSel); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API ORX Radio Control Cfg Failed."); + return recoveryAction; + } + + /*For Spi mode set Spi Mode bitfield to 1 and for pin mode set the Spi mode bitfield to 0*/ + if (orxRadioCtrlModeCfg->orxEnableMode == ADI_ADRV904X_ORX_EN_SPI_MODE) + { + + /* Enable Spi mode */ + orxSpiModeSel |= orxChanMask; + } + else if (orxRadioCtrlModeCfg->orxEnableMode == ADI_ADRV904X_ORX_EN_PIN_MODE) + { + /* Disable Spi mode */ + orxSpiModeSel &= ~orxChanMask; + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + orxRadioCtrlModeCfg->orxEnableMode, + "Invalid ORx Enable Mode encountered while attempting to configure Rx radio ctrl configuration settings"); + return recoveryAction; + } + + recoveryAction = adrv904x_Core_RadioControlInterfaceOrxSpiModeSel_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + orxSpiModeSel); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API ORX Radio Control Cfg Failed."); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxRadioCtrlCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_ORxRadioCtrlModeCfg_t* const orxRadioCtrlModeCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t orxArmMode = 0U; + uint8_t orxChannel = 0U; + uint8_t orxSpiMode = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, orxRadioCtrlModeCfg); + + orxChannel = (uint8_t)(rxChannel >> ADI_ADRV904X_MAX_RX_ONLY); + /* Verify only one ORX channel is set */ + if (orxChannel & (orxChannel - 1U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Invalid ORX Channel selection."); + return recoveryAction; + } + + orxRadioCtrlModeCfg->orxChannelMask = 0; + orxRadioCtrlModeCfg->orxEnableMode = ADI_ADRV904X_ORX_EN_INVALID_MODE; + + /* Read ORX ARM Override ctrl bitfield*/ + recoveryAction = adrv904x_Core_RadioControlInterfaceOrxArmModeSel_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &orxArmMode); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API Get ORX Radio Control Cfg Failed."); + return recoveryAction; + } + + /* The Spi mode bitfield is only valid if ARM override ctrl is set to 0 */ + if ((orxArmMode & orxChannel) == 0) + { + /* Read Pin ctrl mode */ + recoveryAction = adrv904x_Core_RadioControlInterfaceOrxSpiModeSel_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &orxSpiMode); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API Get ORX Radio Control Cfg Failed."); + return recoveryAction; + } + + /* 'Spi Mode' bit field: 1 (Spi Mode), 0 (Pin Mode) */ + if ((orxChannel & orxSpiMode) == orxChannel) + { + orxRadioCtrlModeCfg->orxEnableMode = ADI_ADRV904X_ORX_EN_SPI_MODE; + } + else + { + orxRadioCtrlModeCfg->orxEnableMode = ADI_ADRV904X_ORX_EN_PIN_MODE; + } + } + + /*Update the ORx channel mask*/ + orxRadioCtrlModeCfg->orxChannelMask = rxChannel; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxRadioCtrlCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_RxRadioCtrlModeCfg_t * const rxRadioCtrlModeCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t rxArmMode = 0U; + uint8_t rxSpiMode = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxRadioCtrlModeCfg); + + rxRadioCtrlModeCfg->rxChannelMask = 0; + rxRadioCtrlModeCfg->rxEnableMode = ADI_ADRV904X_RX_EN_INVALID_MODE; + + /* Verify only one ORX channel is set */ + if ((rxChannel & ~ADI_ADRV904X_RX_MASK_ALL) || (rxChannel & (rxChannel - 1U))) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Invalid RX Channel selection."); + return recoveryAction; + } + + /* Read RX ARM Override ctrl bitfield*/ + recoveryAction = adrv904x_Core_RadioControlInterfaceRxArmModeSel_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &rxArmMode); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API Get RX Radio Control Cfg Failed."); + return recoveryAction; + } + + /* The Spi mode bitfield is only valid if ARM override ctrl is set to 0 */ + if ((rxArmMode & rxChannel) == 0) + { + /* Read Pin ctrl mode */ + recoveryAction = adrv904x_Core_RadioControlInterfaceRxSpiModeSel_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &rxSpiMode); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API Get RX Radio Control Cfg Failed."); + return recoveryAction; + } + + /* 'Spi Mode' bit field: 1 (Spi Mode), 0 (Pin Mode) */ + if ((rxChannel & rxSpiMode) == rxChannel) + { + rxRadioCtrlModeCfg->rxEnableMode = ADI_ADRV904X_RX_EN_SPI_MODE; + } + else + { + rxRadioCtrlModeCfg->rxEnableMode = ADI_ADRV904X_RX_EN_PIN_MODE; + } + } + + /*Update the ORx channel mask*/ + rxRadioCtrlModeCfg->rxChannelMask = rxChannel; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxRadioCtrlCfgGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_TxRadioCtrlModeCfg_t * const txRadioCtrlModeCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t txArmMode = 0U; + uint8_t txSpiMode = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, txRadioCtrlModeCfg); + + txRadioCtrlModeCfg->txChannelMask = 0; + txRadioCtrlModeCfg->txEnableMode = ADI_ADRV904X_TX_EN_INVALID_MODE; + + /* Verify only one TX channel is set */ + if (txChannel & (txChannel - 1U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannel, "Invalid TX Channel selection."); + return recoveryAction; + } + + /*Read TX ARM Mode ctrl bitfield*/ + recoveryAction = adrv904x_Core_RadioControlInterfaceTxArmModeSel_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &txArmMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API Get TX Radio Control Cfg Failed."); + return recoveryAction; + } + + /* The Spi mode bitfield is only valid if ARM mode ctrl is not set to 1 */ + if ((txArmMode & txChannel) == 0) + { + /* Read TX Pin ctrl mode */ + recoveryAction = adrv904x_Core_RadioControlInterfaceTxSpiModeSel_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &txSpiMode); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API Get TX Radio Control Cfg Failed."); + return recoveryAction; + } + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API Get TX Radio Control Cfg Failed."); + return recoveryAction; + } + + /* 'Spi Mode' bit field: 1 (Spi Mode), 0 (Pin Mode) */ + if ((txChannel & txSpiMode) == txChannel) + { + txRadioCtrlModeCfg->txEnableMode = ADI_ADRV904X_TX_EN_SPI_MODE; + } + else + { + txRadioCtrlModeCfg->txEnableMode = ADI_ADRV904X_TX_EN_PIN_MODE; + } + } + + /*Update the Tx Channel mask*/ + txRadioCtrlModeCfg->txChannelMask = txChannel; + + return recoveryAction; +} + + +adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalCarrierConfigSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RadioCtrlAntCalCarrierCfg_t* const antCalCarrierCfg, + uint32_t postCalPatternId, + uint8_t useV2) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const uint16_t SCRATCHPAD_REGISTER_OFFSET_BETWEEN_RS = 54U; + uint16_t scratchpadOffsetToStoreRsPatternAddress = 0U; + uint32_t globalPatternId = 0U; + uint8_t sequencerId = 0U; + uint32_t patternAddr = 0U; + int32_t carrierGain = 0; + uint32_t carrierGainReg = 0U; + uint32_t i = 0U; + const int32_t DIG_GAIN_MIN = -90000; + const int32_t DIG_GAIN_MAX = 36000; + const uint32_t DIG_GAIN_MULT = 65536U; + uint32_t extendedCoreScratchRegBaseAddress = 0U; + uint32_t tempAddress = 0U; + uint8_t origEccState = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, antCalCarrierCfg, cleanup); + + /* Check that Radio Sequencer Enable */ + if (device->initExtract.rs.radioSeqEn == ADI_FALSE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_DEVICE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Radio Sequencer not enabled"); + goto cleanup; + } + + /* Write pattern ID to scratch reg */ + if (antCalCarrierCfg->patternId > ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_NUM_PATTERNS_PER_SEQUENCER) + { + /* Invalid pattern ID value */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, antCalCarrierCfg->patternId, "Invalid pattern ID value. Valid value are from 0 to 31"); + goto cleanup; + } + + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (uint16_t)ADRV904X_ANTENNA_CAL_PATTERN_ID_TO_SWITCH_BYTE_0, + antCalCarrierCfg->patternId); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing pattern ID"); + goto cleanup; + } + + /* For Radio Sequencer 0 and 1 */ + for (sequencerId = 0; sequencerId < 2; sequencerId++) + { + scratchpadOffsetToStoreRsPatternAddress = (uint16_t)(ADRV904X_ANTENNA_CAL_RS0_PATTERN0_ADDR_LSB + (sequencerId * SCRATCHPAD_REGISTER_OFFSET_BETWEEN_RS)); + + if (useV2 == ADI_FALSE) + { + recoveryAction = adrv904x_Sequencer_ExternalJumpPointer_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS, + sequencerId, + (uint16_t* const)&patternAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to get Radio Sequencer pattern address"); + goto cleanup; + } + + /* Shift to the location expected in the scratchpad */ + patternAddr = patternAddr << 4; + } + else + { + globalPatternId = ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SEQ_PTRN_ID_TO_GLOBAL_ID(sequencerId, postCalPatternId); + recoveryAction = adrv904x_RadioSequencerPatternAddrGet(device, globalPatternId, &patternAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to get Radio Sequencer default pattern address"); + goto cleanup; + } + } + + + + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + scratchpadOffsetToStoreRsPatternAddress, + (uint8_t)(patternAddr & 0xFF)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, patternAddr, "Error writing LSB of pattern address"); + goto cleanup; + } + + scratchpadOffsetToStoreRsPatternAddress++; + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + scratchpadOffsetToStoreRsPatternAddress, + (uint8_t)((patternAddr >> 8) & 0xFF)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, patternAddr, "Error writing MSB of pattern address"); + goto cleanup; + } + + globalPatternId = ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SEQ_PTRN_ID_TO_GLOBAL_ID(sequencerId, antCalCarrierCfg->patternId); + + recoveryAction = adrv904x_RadioSequencerPatternAddrGet(device, globalPatternId, &patternAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to get Radio Sequencer default pattern address"); + goto cleanup; + } + + if ((patternAddr & 0x0F) != 0) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "The pattern addresses should be aligned to 16-byte boundary"); + goto cleanup; + } + + scratchpadOffsetToStoreRsPatternAddress++; + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + scratchpadOffsetToStoreRsPatternAddress, + (uint8_t)(patternAddr & 0xFF)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, patternAddr, "Error writing LSB of pattern address"); + goto cleanup; + } + + scratchpadOffsetToStoreRsPatternAddress++; + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + scratchpadOffsetToStoreRsPatternAddress, + (uint8_t)((patternAddr >> 8) & 0xFF)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, patternAddr, "Error writing MSB of pattern address"); + goto cleanup; + } + } + + /* Write GPIO number of toggles to scratch reg */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (uint16_t)ADRV904X_ANTENNA_CAL_NUMBER_OF_GPIO_TO_SWITCH_CARRIER, + (uint8_t)(antCalCarrierCfg->numOfGpioToSwitchCarrier)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while write numOfGpioToSwitchCarrier"); + goto cleanup; + } + + /* Write carrier table to scratch reg */ + for (i = 0U; i < ADI_ADRV904X_CARRIER_TABLE_COUNT; i++) + { + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (uint16_t)(ADRV904X_ANTENNA_CAL_CARRIER_GAIN_TABLE_BYTE_0 + i), + antCalCarrierCfg->carrierTable[i]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, i, "Error while write carrierTable"); + goto cleanup; + } + } + + /* Check first pattern number of loops value */ + if (antCalCarrierCfg->firstPatternNumberOfLoops == 0) + { + /* Invalid first pattern number of loops value */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, antCalCarrierCfg->firstPatternNumberOfLoops, + "Invalid first pattern number of loops value. Valid value are from 1 to 255"); + goto cleanup; + } + + /* Write first pattern number of loops to scratch reg */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (uint16_t)ADRV904X_ANTENNA_CAL_FIRST_PATTERN_NUMBER_OF_LOOPS, + antCalCarrierCfg->firstPatternNumberOfLoops - 1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while write firstPatternNumberOfLoops"); + goto cleanup; + } + + /* Check second pattern number of loops value */ + if (antCalCarrierCfg->secondPatternNumberOfLoops == 0) + { + /* Invalid second pattern number of loops value */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, antCalCarrierCfg->secondPatternNumberOfLoops, + "Invalid second pattern number of loops value. Valid value are from 1 to 255"); + goto cleanup; + } + + /* Write second pattern number of loops to scratch reg */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (uint16_t)ADRV904X_ANTENNA_CAL_SECOND_PATTERN_NUMBER_OF_LOOPS, + antCalCarrierCfg->secondPatternNumberOfLoops - 1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while write secondPatternNumberOfLoops"); + goto cleanup; + } + + /* Read the base address for extended core scratch registers located in M4 heap*/ + recoveryAction = adi_adrv904x_Register32Read(device, NULL, ADRV904X_PM_CORE_SCRATCH_EXT_PTR, &extendedCoreScratchRegBaseAddress, 0xFFFFFFFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading extended core stream scratch base addr"); + goto cleanup; + } + + /* Read the current ECC scrubbing state in M4 before disabling ECC */ + recoveryAction = adi_adrv904x_EccEnableGet(device, &origEccState); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading ECC state of M4"); + return recoveryAction; + } + + /* Disable ECC before we write to M4 memory */ + recoveryAction = adi_adrv904x_EccEnableSet(device, 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while disabling ECC scrubbing on M4"); + return recoveryAction; + } + + for (i = 0U; i < ADI_ADRV904X_MAX_RX_CARRIERS; i++) + { + carrierGain = antCalCarrierCfg->rxCarrierGainForAntCal[i]; + + if((carrierGain < DIG_GAIN_MIN) || (carrierGain > DIG_GAIN_MAX)) + { + /* Invalid carrier gain value */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierGain, "Invalid gain mdB value. Valid value are from -90000mdB to 36000mdB"); + goto cleanup; + } + + /* Convert from mdB to 7.16. (reg value = 10**(value in mdB/1000/20)) * 2^16) */ + //carrierGainReg = (uint32_t)((double)pow(10, (double)carrierGain / 1000U / 20U) * DIG_GAIN_MULT); + carrierGainReg = (uint32_t)int_20db_to_mag(DIG_GAIN_MULT, carrierGain); + carrierGainReg &= 0x003FFFFF; /* Mask 23 bits of gain */ + tempAddress = extendedCoreScratchRegBaseAddress + 4U * (ADRV904X_ANTENNA_CAL_RX_CARRIER_0_GAIN + i); + recoveryAction = adi_adrv904x_Register32Write(device, NULL, tempAddress, carrierGainReg, 0xFFFFFFFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while write Rx carrier gain byte."); + goto cleanup; + } + } + + for (i = 0U; i < ADI_ADRV904X_MAX_TX_CARRIERS; i++) + { + carrierGain = antCalCarrierCfg->txCarrierGainForAntCal[i]; + + if ((carrierGain < DIG_GAIN_MIN) || (carrierGain > DIG_GAIN_MAX)) + { + /* Invalid carrier gain value */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierGain, "Invalid gain mdB value. Valid value are from -90000mdB to 36000mdB"); + goto cleanup; + } + + /* Convert from mdB to 7.16. (reg value = 10**(value in mdB/1000/20)) * 2^16) */ + //carrierGainReg = (uint32_t)((double)pow(10, (double)carrierGain / 1000U / 20U) * DIG_GAIN_MULT); + carrierGainReg = (uint32_t)int_20db_to_mag(DIG_GAIN_MULT, carrierGain); + carrierGainReg &= 0x003FFFFF; /* Mask 23 bits of gain */ + + tempAddress = extendedCoreScratchRegBaseAddress + 4U * (ADRV904X_ANTENNA_CAL_TX_CARRIER_0_GAIN + i); + recoveryAction = adi_adrv904x_Register32Write(device, NULL, tempAddress, carrierGainReg, 0xFFFFFFFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while write Tx carrier gain byte."); + goto cleanup; + } + } + + /* Restore ECC scrubbing before we exit */ + recoveryAction = adi_adrv904x_EccEnableSet(device, origEccState); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while disabling ECC scrubbing on M4"); + return recoveryAction; + } +cleanup: + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_LoUnlockGpInterruptMaskGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_LoName_e loName, + uint8_t* const loGpInterruptPin0Mask, + uint8_t* const loGpInterruptPin1Mask) +{ + static const uint8_t LO0_GP_INTERRUPT_SHIFT = 32U; + uint64_t LO0_GP_INTERRUPT_UINT64_MASK = (uint64_t)1U << LO0_GP_INTERRUPT_SHIFT; /* east */ + static const uint8_t LO1_GP_INTERRUPT_SHIFT = 31U; + uint64_t LO1_GP_INTERRUPT_UINT64_MASK = (uint64_t)1U << LO1_GP_INTERRUPT_SHIFT; /* west */ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint64_t gpInterruptPin0Mask = 0U; + uint64_t gpInterruptPin1Mask = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, loGpInterruptPin0Mask); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, loGpInterruptPin1Mask); + + /* Read GP Interrupt Pin0 and Pin1 mask */ + recoveryAction = adrv904x_Core_GpInterruptsMaskUpperWordPin0_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &gpInterruptPin0Mask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get GPIO Interrupt Pin 0 failed."); + return recoveryAction; + } + + recoveryAction = adrv904x_Core_GpInterruptsMaskUpperWordPin1_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &gpInterruptPin1Mask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get GPIO Interrupt Pin 1 failed."); + return recoveryAction; + } + + switch (loName) + { + case(ADI_ADRV904X_LO0): + { + *loGpInterruptPin0Mask = (uint8_t)ADRV904X_BF_DECODE(gpInterruptPin0Mask, LO0_GP_INTERRUPT_UINT64_MASK, LO0_GP_INTERRUPT_SHIFT); + *loGpInterruptPin1Mask = (uint8_t)ADRV904X_BF_DECODE(gpInterruptPin1Mask, LO0_GP_INTERRUPT_UINT64_MASK, LO0_GP_INTERRUPT_SHIFT); + + break; + } + case(ADI_ADRV904X_LO1): + { + *loGpInterruptPin0Mask = (uint8_t)ADRV904X_BF_DECODE(gpInterruptPin0Mask, LO1_GP_INTERRUPT_UINT64_MASK, LO1_GP_INTERRUPT_SHIFT); + *loGpInterruptPin1Mask = (uint8_t)ADRV904X_BF_DECODE(gpInterruptPin1Mask, LO1_GP_INTERRUPT_UINT64_MASK, LO1_GP_INTERRUPT_SHIFT); + break; + } + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, loName, "Invalid LO selection while attempting to retrieve LO GP Interrupt mask."); + return recoveryAction; + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_LoUnlockGpInterruptMaskSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_LoName_e loName, + const uint8_t loGpInterruptPin0Mask, + const uint8_t loGpInterruptPin1Mask) +{ + static const uint8_t LO0_GP_INTERRUPT_SHIFT = 32U; + uint64_t LO0_GP_INTERRUPT_UINT64_MASK = (uint64_t)1U << LO0_GP_INTERRUPT_SHIFT; /* east */ + static const uint8_t LO1_GP_INTERRUPT_SHIFT = 31U; + uint64_t LO1_GP_INTERRUPT_UINT64_MASK = (uint64_t)1U << LO1_GP_INTERRUPT_SHIFT; /* west */ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint64_t gpInterruptPin0Mask = 0U; + uint64_t gpInterruptPin1Mask = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Read GP Interrupt Pin0 and Pin1 mask */ + recoveryAction = adrv904x_Core_GpInterruptsMaskUpperWordPin0_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &gpInterruptPin0Mask); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get GPIO Interrupt Pin 0 failed."); + return recoveryAction; + } + + recoveryAction = adrv904x_Core_GpInterruptsMaskUpperWordPin1_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &gpInterruptPin1Mask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get GPIO Interrupt Pin 1 failed."); + return recoveryAction; + } + + switch (loName) + { + case(ADI_ADRV904X_LO0): + { + /* Update GP Interrupt Mask */ + ADRV904X_BF_UPDATE(gpInterruptPin0Mask, (uint64_t)loGpInterruptPin0Mask, LO0_GP_INTERRUPT_UINT64_MASK, LO0_GP_INTERRUPT_SHIFT); + ADRV904X_BF_UPDATE(gpInterruptPin1Mask, (uint64_t)loGpInterruptPin1Mask, LO0_GP_INTERRUPT_UINT64_MASK, LO0_GP_INTERRUPT_SHIFT); + break; + } + case(ADI_ADRV904X_LO1): + { + /* Update GP Interrupt Mask */ + ADRV904X_BF_UPDATE(gpInterruptPin0Mask, (uint64_t)loGpInterruptPin0Mask, LO1_GP_INTERRUPT_UINT64_MASK, LO1_GP_INTERRUPT_SHIFT); + ADRV904X_BF_UPDATE(gpInterruptPin1Mask, (uint64_t)loGpInterruptPin1Mask, LO1_GP_INTERRUPT_UINT64_MASK, LO1_GP_INTERRUPT_SHIFT); + break; + } + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, loName, "Invalid LO selection while attempting to set LO GP Interrupt mask"); + return recoveryAction; + } + } + + /* Write GP Interrupt Pin0 and Pin1 mask */ + recoveryAction = adrv904x_Core_GpInterruptsMaskUpperWordPin0_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + gpInterruptPin0Mask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Set GPIO Interrupt Pin 0 failed."); + return recoveryAction; + } + + recoveryAction = adrv904x_Core_GpInterruptsMaskUpperWordPin1_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + gpInterruptPin1Mask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Set GPIO Interrupt Pin 1 failed."); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_LoOverrangeGpInterruptMaskGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_LoName_e loName, + uint8_t* const loGpInterruptPin0Mask, + uint8_t* const loGpInterruptPin1Mask) +{ + static const uint8_t LO0_GP_INTERRUPT_SHIFT = 29U; + uint64_t LO0_GP_INTERRUPT_UINT64_MASK = (uint64_t)1U << LO0_GP_INTERRUPT_SHIFT; /* east */ + static const uint8_t LO1_GP_INTERRUPT_SHIFT = 28U; + uint64_t LO1_GP_INTERRUPT_UINT64_MASK = (uint64_t)1U << LO1_GP_INTERRUPT_SHIFT; /* west */ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint64_t gpInterruptPin0Mask = 0U; + uint64_t gpInterruptPin1Mask = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, loGpInterruptPin0Mask); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, loGpInterruptPin1Mask); + + /* Read GP Interrupt Pin0 and Pin1 mask */ + recoveryAction = adrv904x_Core_GpInterruptsMaskUpperWordPin0_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &gpInterruptPin0Mask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get GPIO Interrupt Pin 0 failed."); + return recoveryAction; + } + + recoveryAction = adrv904x_Core_GpInterruptsMaskUpperWordPin1_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &gpInterruptPin1Mask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get GPIO Interrupt Pin 1 failed."); + return recoveryAction; + } + + switch (loName) + { + case(ADI_ADRV904X_LO0): + { + *loGpInterruptPin0Mask = (uint8_t)ADRV904X_BF_DECODE(gpInterruptPin0Mask, LO0_GP_INTERRUPT_UINT64_MASK, LO0_GP_INTERRUPT_SHIFT); + *loGpInterruptPin1Mask = (uint8_t)ADRV904X_BF_DECODE(gpInterruptPin1Mask, LO0_GP_INTERRUPT_UINT64_MASK, LO0_GP_INTERRUPT_SHIFT); + + break; + } + case(ADI_ADRV904X_LO1): + { + *loGpInterruptPin0Mask = (uint8_t)ADRV904X_BF_DECODE(gpInterruptPin0Mask, LO1_GP_INTERRUPT_UINT64_MASK, LO1_GP_INTERRUPT_SHIFT); + *loGpInterruptPin1Mask = (uint8_t)ADRV904X_BF_DECODE(gpInterruptPin1Mask, LO1_GP_INTERRUPT_UINT64_MASK, LO1_GP_INTERRUPT_SHIFT); + break; + } + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, loName, "Invalid LO selection while attempting to retrieve LO GP Interrupt mask."); + return recoveryAction; + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_LoOverrangeGpInterruptMaskSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_LoName_e loName, + const uint8_t loGpInterruptPin0Mask, + const uint8_t loGpInterruptPin1Mask) +{ + static const uint8_t LO0_GP_INTERRUPT_SHIFT = 29U; + uint64_t LO0_GP_INTERRUPT_UINT64_MASK = (uint64_t)1U << LO0_GP_INTERRUPT_SHIFT; /* east */ + static const uint8_t LO1_GP_INTERRUPT_SHIFT = 28U; + uint64_t LO1_GP_INTERRUPT_UINT64_MASK = (uint64_t)1U << LO1_GP_INTERRUPT_SHIFT; /* west */ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint64_t gpInterruptPin0Mask = 0U; + uint64_t gpInterruptPin1Mask = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Read GP Interrupt Pin0 and Pin1 mask */ + recoveryAction = adrv904x_Core_GpInterruptsMaskUpperWordPin0_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &gpInterruptPin0Mask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get GPIO Interrupt Pin 0 failed."); + return recoveryAction; + } + + recoveryAction = adrv904x_Core_GpInterruptsMaskUpperWordPin1_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &gpInterruptPin1Mask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get GPIO Interrupt Pin 1 failed."); + return recoveryAction; + } + + switch (loName) + { + case(ADI_ADRV904X_LO0): + { + /* Update GP Interrupt Mask */ + ADRV904X_BF_UPDATE(gpInterruptPin0Mask, (uint64_t)loGpInterruptPin0Mask, LO0_GP_INTERRUPT_UINT64_MASK, LO0_GP_INTERRUPT_SHIFT); + ADRV904X_BF_UPDATE(gpInterruptPin1Mask, (uint64_t)loGpInterruptPin1Mask, LO0_GP_INTERRUPT_UINT64_MASK, LO0_GP_INTERRUPT_SHIFT); + break; + } + case(ADI_ADRV904X_LO1): + { + /* Update GP Interrupt Mask */ + ADRV904X_BF_UPDATE(gpInterruptPin0Mask, (uint64_t)loGpInterruptPin0Mask, LO1_GP_INTERRUPT_UINT64_MASK, LO1_GP_INTERRUPT_SHIFT); + ADRV904X_BF_UPDATE(gpInterruptPin1Mask, (uint64_t)loGpInterruptPin1Mask, LO1_GP_INTERRUPT_UINT64_MASK, LO1_GP_INTERRUPT_SHIFT); + break; + } + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, loName, "Invalid LO selection while attempting to set LO GP Interrupt mask"); + return recoveryAction; + } + } + + /* Write GP Interrupt Pin0 and Pin1 mask */ + recoveryAction = adrv904x_Core_GpInterruptsMaskUpperWordPin0_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + gpInterruptPin0Mask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Set GPIO Interrupt Pin 0 failed."); + return recoveryAction; + } + + recoveryAction = adrv904x_Core_GpInterruptsMaskUpperWordPin1_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + gpInterruptPin1Mask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Set GPIO Interrupt Pin 1 failed."); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_LoFrequencySetRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_LoConfig_t* const loConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t areCalsRunning = 0U; + adi_adrv904x_LoSel_e loSelect = ADI_ADRV904X_LOSEL_LO1; + adi_adrv904x_LoSel_e loSelectGet = ADI_ADRV904X_LOSEL_LO1; + uint64_t maxRfBandwidth_kHz = 0U; + uint8_t i = 0U; + adi_adrv904x_TxChannels_e txChannel = ADI_ADRV904X_TXOFF; + adi_adrv904x_RxChannels_e rxChannel = ADI_ADRV904X_RXOFF; + int64_t freqValid = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, loConfig); + + /*Check that LO Name selected is valid */ + if ((loConfig->loName != ADI_ADRV904X_LO0) && + (loConfig->loName != ADI_ADRV904X_LO1) + ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, loConfig->loName, "Invalid LO selected for setting LO frequency"); + return recoveryAction; + } + + /*Check that PLL mode is valid*/ + if ((loConfig->loConfigSel != ADI_ADRV904X_NCO_NO_OPTION_SELECTED) && + (loConfig->loConfigSel != ADI_ADRV904X_NCO_AUTO_UPDATE_DISABLE)) + { + + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, loConfig->loName, "Invalid LO Config selected for setting LO frequency"); + return recoveryAction; + } + + /* Determine the PLL Frequency LO Selection */ + if (loConfig->loName == ADI_ADRV904X_LO0) + { + loSelect = ADI_ADRV904X_LOSEL_LO0; + } + else if (loConfig->loName == ADI_ADRV904X_LO1) + { + loSelect = ADI_ADRV904X_LOSEL_LO1; + } + /* Find the greatest TX Input Rates value of the same LO */ + maxRfBandwidth_kHz = 0U; + if ((device->devStateInfo.profilesValid & ADI_ADRV904X_TX_PROFILE_VALID) == ADI_ADRV904X_TX_PROFILE_VALID) + { + for (i = 0U; i < ADI_ADRV904X_MAX_TXCHANNELS; i++) + { + /* convert the index to matching the channel */ + txChannel = (adi_adrv904x_TxChannels_e)((uint8_t)(1U << i)); + if (((device->devStateInfo.initializedChannels >> ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET) & (uint32_t)txChannel) == (uint32_t)txChannel) + { + recoveryAction = adrv904x_TxLoSourceGet(device, txChannel, &loSelectGet); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "TxLoSourceGet Issue"); + return recoveryAction; + } + if (loSelectGet == loSelect) + { + /* Now check if matching LO then compare to get max value */ + if (device->initExtract.tx.txChannelCfg[i].rfBandwidth_kHz > maxRfBandwidth_kHz) + { + maxRfBandwidth_kHz = device->initExtract.tx.txChannelCfg[i].rfBandwidth_kHz; + } + } + } + } + } + + /* Find the greatest RX Output Rates value of the same LO */ + if ((device->devStateInfo.profilesValid & ADI_ADRV904X_RX_PROFILE_VALID) == ADI_ADRV904X_RX_PROFILE_VALID) + { + for (i = 0U; i < ADI_ADRV904X_MAX_RX_ONLY; i++) + { + /* convert the index to matching the channel */ + rxChannel = (adi_adrv904x_RxChannels_e)((uint8_t)(1U << i)); + if ((device->devStateInfo.initializedChannels & (uint32_t)rxChannel) == (uint32_t)rxChannel) + { + recoveryAction = adrv904x_RxLoSourceGet(device, rxChannel, &loSelectGet); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxLoSourceGet Issue"); + return recoveryAction; + } + if (loSelectGet == loSelect) + { + /* Now check if matching LO then compare to get max value */ + if (device->initExtract.rx.rxChannelCfg[i].rfBandwidth_kHz > maxRfBandwidth_kHz) + { + maxRfBandwidth_kHz = device->initExtract.rx.rxChannelCfg[i].rfBandwidth_kHz; + } + } + } + } + } + + /* The rule is that the PLL LO frequency must always more than half of the greatest bandwidth. */ + freqValid = (int64_t)loConfig->loFrequency_Hz - (int64_t)((maxRfBandwidth_kHz * 1000) >> 1U); + if ((freqValid <= 0U) && (maxRfBandwidth_kHz > 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_RADIOCTRL, + ADI_ADRV904X_ERRCODE_RADIOCTRL_LO_CFG, + recoveryAction, + loConfig->loFrequency_Hz, + "(loFreq - Bandwidth/2) should be greater than DC."); + return recoveryAction; + } + + /*Check that init cals are not running*/ + recoveryAction = (adi_adrv904x_ErrAction_e)adi_adrv904x_InitCalsCheckCompleteGet(device, &areCalsRunning, ADI_FALSE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "InitCalsCheckCompleteGet Issue"); + return recoveryAction; + } + + if (areCalsRunning == 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, areCalsRunning, "Can not set LO frequency while InitCals are running"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_LoLoopFilterSetRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_LoName_e loName, + const adi_adrv904x_LoLoopFilterCfg_t* const loLoopFilterConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + static const uint16_t MIN_LOOPBANDWIDTH_KHZ = 60; + static const uint16_t MAX_LOOPBANDWIDTH_KHZ = 1000; + static const uint8_t MIN_PHASEMARGIN_DEGREE = 45; + static const uint8_t MAX_PHASEMARGIN_DEGREE = 75; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, loLoopFilterConfig); + + if ((loName != ADI_ADRV904X_LO0) && (loName != ADI_ADRV904X_LO1)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, loName, "Invalid LO selected for setting LO Loop filter"); + return recoveryAction; + } + + if ((loLoopFilterConfig->loopBandwidth_kHz < MIN_LOOPBANDWIDTH_KHZ) || (loLoopFilterConfig->loopBandwidth_kHz > MAX_LOOPBANDWIDTH_KHZ)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, loName, "Invalid loop bandwidth for setting LO Loop filter"); + return recoveryAction; + } + + if ((loLoopFilterConfig->phaseMargin_degrees < MIN_PHASEMARGIN_DEGREE) || (loLoopFilterConfig->phaseMargin_degrees > MAX_PHASEMARGIN_DEGREE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, loName, "Invalid phase margin for setting LO Loop filter"); + return recoveryAction; + } + + return ADI_ADRV904X_ERR_ACT_NONE; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_StreamTrigger(adi_adrv904x_Device_t* const device, + const uint8_t streamId) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t cpuCommandBusy = 0U; + uint32_t timeout_us = ADI_ADRV904X_SENDCPUCMD_TIMEOUT_US; + uint32_t waitInterval_us = ADI_ADRV904X_SENDCPUCMD_INTERVAL_US; + uint32_t eventCheck = 0U; + uint32_t numEventChecks = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* setting a 2 second timeout for mailbox busy bit to be clear (can't send an cpu mailbox command until mailbox is ready) */ +#if ADI_ADRV904X_SENDCPUCMD_INTERVAL_US > ADI_ADRV904X_SENDCPUCMD_TIMEOUT_US + waitInterval_us = timeout_us; +#elif ADI_ADRV904X_SENDCPUCMD_INTERVAL_US == 0 + waitInterval_us = timeout_us; +#endif + numEventChecks = timeout_us / waitInterval_us; + + /* timeout event loop to permit non-blocking of thread */ + for (eventCheck = 0U; eventCheck <= numEventChecks; ++eventCheck) + { + recoveryAction = adrv904x_Core_Arm0Spi0CommandBusy_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &cpuCommandBusy); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register Read (for CPU 0 Command Busy Bit) Issue"); + return recoveryAction; + } + + if (cpuCommandBusy == ADI_TRUE) + { + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_Wait_us(&device->common, waitInterval_us); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "HAL Wait Request Issue"); + return recoveryAction; + } + } + else + { + break; + } + } + + /* if busy bit remains set after timeout event loop function is exited, otherwise command is sent */ + if (cpuCommandBusy == ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_FEATURE; + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_CPU, + ADI_ADRV904X_ERRCODE_CPU_CMD_TIMEOUT, + recoveryAction, + cpuCommandBusy, + "CPU Mailbox Busy; Timeout Occurred"); + return recoveryAction; + } + else + { + /*Write streamId to payload in arm mailbox*/ + recoveryAction = adrv904x_Core_Arm0Spi0ExtCmdByte1_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + streamId); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting Core Stream Processor stream ID number to trigger."); + return recoveryAction; + } + + /*Write opcode to trigger Core Stream Processor rather than send command to ARM*/ + recoveryAction = adrv904x_Core_Arm0Spi0Command_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + ADRV904X_CPU_STREAM_TRIGGER_OPCODE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while triggering Core Stream Processor directly from API."); + return recoveryAction; + } + + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxStreamTrigger(adi_adrv904x_Device_t* const device, + const uint8_t txChanMask, + const uint8_t txStreamId) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const uint32_t NUM_OF_EVENT_CHECKS = 1000U; + const uint32_t UNUSED_STREAM_ID = 0xFFU; /* The value of unused TX stream ID need to match the value used by core stream */ + uint32_t eventCheck = 0U; + uint8_t rdStreamId = 0; + uint8_t byteWriteBuf[2] = { 0U, 0U }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* timeout event loop to permit non-blocking of thread */ + for (eventCheck = 0U; eventCheck <= NUM_OF_EVENT_CHECKS; ++eventCheck) + { + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_TRIGGER_SLICE_STREAM_NUM, + &rdStreamId); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading stream ID from scratchpad register."); + return recoveryAction; + } + + if (rdStreamId != UNUSED_STREAM_ID) + { + recoveryAction = (adi_adrv904x_ErrAction_e)adi_common_hal_Wait_us(&device->common, 1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "HAL Wait Request Issue"); + return recoveryAction; + } + } + else + { + break; + } + } + + /* if stream ID indicates that previous request was still not processed, exit with error */ + if (rdStreamId != UNUSED_STREAM_ID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_FEATURE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Core SP Busy"); + return recoveryAction; + } + else + { + /* Set requested TX stream ID to be run */ + byteWriteBuf[0] = (uint8_t)txStreamId; + + /* Update Tx channel bitmask */ + byteWriteBuf[1] = txChanMask; + + recoveryAction = adi_adrv904x_RegistersByteWrite(device, NULL, ADRV904X_ADDR_CORE_STREAM_SCRATCH204, byteWriteBuf, 2U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot write to Core scratch pad registers"); + return recoveryAction; + } + + recoveryAction = adrv904x_StreamTrigger(device, ADRV904X_STREAM_MAIN_TRIGGER_TX_STREAM); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while triggering Core Stream to trigger TX stream"); + return recoveryAction; + } + } + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxStreamTrigger(adi_adrv904x_Device_t* const device, + const uint8_t rxChanMask, + const uint8_t rxStreamId) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const uint32_t NUM_OF_EVENT_CHECKS = 1000U; + const uint32_t UNUSED_STREAM_ID = 0xFFU; /* The value of unused RX stream ID need to match the value used by core stream */ + uint32_t eventCheck = 0U; + uint8_t rdStreamId = 0; + uint8_t byteWriteBuf[2] = { 0U, 0U }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* timeout event loop to permit non-blocking of thread */ + for (eventCheck = 0U; eventCheck <= NUM_OF_EVENT_CHECKS; ++eventCheck) + { + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_TRIGGER_SLICE_STREAM_NUM, + &rdStreamId); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading stream ID from scratchpad register."); + return recoveryAction; + } + + if (rdStreamId != UNUSED_STREAM_ID) + { + recoveryAction = (adi_adrv904x_ErrAction_e)adi_common_hal_Wait_us(&device->common, 1); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "HAL Wait Request Issue"); + return recoveryAction; + } + } + else + { + break; + } + } + + /* if stream ID indicates that previous request was still not processed exit with error */ + if (rdStreamId != UNUSED_STREAM_ID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_FEATURE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Core SP Busy"); + return recoveryAction; + } + else + { + /* Set requested RX stream ID to be run */ + byteWriteBuf[0] = (uint8_t)rxStreamId; + + /* Update Tx channel bitmask */ + byteWriteBuf[1] = rxChanMask; + + recoveryAction = adi_adrv904x_RegistersByteWrite(device, NULL, ADRV904X_ADDR_CORE_STREAM_SCRATCH204, byteWriteBuf, 2U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot write to Core scratch pad registers"); + return recoveryAction; + } + + recoveryAction = adrv904x_StreamTrigger(device, ADRV904X_STREAM_MAIN_TRIGGER_RX_STREAM); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while triggering Core Stream to trigger RX stream"); + return recoveryAction; + } + } + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_StreamGpioConfigSetRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_StreamGpioPinCfg_t* const streamGpioPinCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + int idx = 0; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, streamGpioPinCfg); + + + /* Check all Stream GPIO if valid */ + for (idx = 0U; idx < ADI_ADRV904X_MAX_STREAMGPIO; idx++) + { + /* Check if pin is valid and match index */ + if ((streamGpioPinCfg->streamGpInput[idx] != ADI_ADRV904X_GPIO_INVALID) && + (streamGpioPinCfg->streamGpInput[idx] != (adi_adrv904x_GpioPinSel_e)idx)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, idx, "Invalid stream trigger GPIO pin selected. Index must match GPIO value. To disable, please select GPIO_INVALID"); + return recoveryAction; + } + } + + + /* Check digital output GPIOs */ + for (idx = 0U; idx < ADI_ADRV904X_DFE_CTRL_MAX_GPIO_DIG; idx++) + { + /* Check if pin is valid and match index */ + if ((streamGpioPinCfg->streamGpDigOutput[idx] != ADI_ADRV904X_GPIO_INVALID) && + (streamGpioPinCfg->streamGpDigOutput[idx] != (adi_adrv904x_GpioPinSel_e)idx)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, idx, "Invalid stream trigger GPIO pin selected. Index must match GPIO value. To disable, please select GPIO_INVALID"); + return recoveryAction; + } + } + + for (idx = 0U; idx < ADI_ADRV904X_DFE_CTRL_MAX_GPIO_ANA; idx++) + { + /* Check if pin is valid and match index */ + if ((streamGpioPinCfg->streamGpAnaOutput[idx] != ADI_ADRV904X_GPIO_ANA_INVALID) && + (streamGpioPinCfg->streamGpAnaOutput[idx] != (adi_adrv904x_GpioAnaPinSel_e)idx)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, idx, "Invalid stream trigger GPIO pin selected. Index must match GPIO value. To disable, please select ADI_ADRV904X_GPIO_ANA_INVALID"); + return recoveryAction; + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return (recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_AdcVersionGet(adi_adrv904x_Device_t* const device, + const uint8_t calType, + const adi_adrv904x_Channels_e channel, + adi_adrv904x_Version_t* const adcVersion) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, adcVersion); + + uint32_t lengthResp = 4U; + uint8_t ctrlData[4] = { 0U }; + uint8_t ctrlResp[16] = { 0U }; + + if ((calType != ADRV904X_CPU_OBJID_IC_ADC_RX) && + (calType != ADRV904X_CPU_OBJID_IC_ADC_TXLB) && + (calType != ADRV904X_CPU_OBJID_IC_ADC_ORX)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, calType, "Invalid cal type. - must be an ADC cal"); + return recoveryAction; + } + + if ((channel != ADI_ADRV904X_CH0) && + (channel != ADI_ADRV904X_CH1) && + (channel != ADI_ADRV904X_CH2) && + (channel != ADI_ADRV904X_CH3) && + (channel != ADI_ADRV904X_CH4) && + (channel != ADI_ADRV904X_CH5) && + (channel != ADI_ADRV904X_CH6) && + (channel != ADI_ADRV904X_CH7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "channel parameter is invalid."); + return recoveryAction; + } + + /* Get the ADC module revision number: */ + recoveryAction = adi_adrv904x_CpuControlCmdExec(device, + (uint32_t)calType, + (uint16_t)ADC_CTRL_GET_SW_VERSION, + channel, + ctrlData, + sizeof(ctrlData), + &lengthResp, + ctrlResp, + sizeof(ctrlResp)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "Get ADC SW version failed"); + return recoveryAction; + } + + adcVersion->majorVer = adrv904x_CpuIntFromBytesGet(&ctrlResp[ 0], 4U); + adcVersion->minorVer = adrv904x_CpuIntFromBytesGet(&ctrlResp[ 4], 4U); + adcVersion->maintenanceVer = adrv904x_CpuIntFromBytesGet(&ctrlResp[ 8], 4U); + adcVersion->buildVer = adrv904x_CpuIntFromBytesGet(&ctrlResp[12], 4U); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_AdcGetDataInfo(adi_adrv904x_Device_t* const device, + const uint8_t calType, + const adi_adrv904x_Channels_e channel, + adrv904x_CpuCmd_GetAdcSizeAddrs_t* const adcSizes, + adrv904x_CpuCmd_GetAdcSizeAddrs_t* const adcAddrs) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, adcSizes); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, adcAddrs); + + uint32_t lengthResp = 4U; + uint8_t ctrlData[4] = { 0U }; + uint8_t ctrlResp[24] = { 0U }; + + if ((calType != ADRV904X_CPU_OBJID_IC_ADC_RX) && + (calType != ADRV904X_CPU_OBJID_IC_ADC_TXLB) && + (calType != ADRV904X_CPU_OBJID_IC_ADC_ORX)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, calType, "Invalid cal type. - must be an ADC cal"); + return recoveryAction; + } + + if (calType == ADRV904X_CPU_OBJID_IC_ADC_ORX) + { + if ((channel != ADI_ADRV904X_CH0) && + (channel != ADI_ADRV904X_CH1)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "bad ORx channel"); + return recoveryAction; + } + } + else + { + if ((channel != ADI_ADRV904X_CH0) && + (channel != ADI_ADRV904X_CH1) && + (channel != ADI_ADRV904X_CH2) && + (channel != ADI_ADRV904X_CH3) && + (channel != ADI_ADRV904X_CH4) && + (channel != ADI_ADRV904X_CH5) && + (channel != ADI_ADRV904X_CH6) && + (channel != ADI_ADRV904X_CH7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "bad Rx/Tx channel"); + return recoveryAction; + } + } + + /* Get the ADC module data sizes: */ + recoveryAction = adi_adrv904x_CpuControlCmdExec(device, + (uint32_t)calType, + (uint16_t)ADC_CTRL_GET_DATA_SIZES, + channel, + ctrlData, + sizeof(ctrlData), + &lengthResp, + ctrlResp, + sizeof(ctrlResp)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "Get ADC data sizes"); + return recoveryAction; + } + + /* Store the adcSizes */ + adcSizes->obj = adrv904x_CpuIntFromBytesGet(&ctrlResp[ 0], 4U); + adcSizes->init = adrv904x_CpuIntFromBytesGet(&ctrlResp[ 4], 4U); + adcSizes->config = adrv904x_CpuIntFromBytesGet(&ctrlResp[ 8], 4U); + adcSizes->calObj = adrv904x_CpuIntFromBytesGet(&ctrlResp[12], 4U); + adcSizes->calState = adrv904x_CpuIntFromBytesGet(&ctrlResp[16], 4U); + adcSizes->calData = adrv904x_CpuIntFromBytesGet(&ctrlResp[20], 4U); + + /* Get the ADC module data addresses: */ + recoveryAction = adi_adrv904x_CpuControlCmdExec(device, + (uint32_t)calType, + (uint16_t)ADC_CTRL_GET_DATA_ADDRS, + channel, + ctrlData, + sizeof(ctrlData), + &lengthResp, + ctrlResp, + sizeof(ctrlResp)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "Get ADC data addresses"); + return recoveryAction; + } + + /* Store the ADC Addresses */ + adcAddrs->obj = adrv904x_CpuIntFromBytesGet(&ctrlResp[ 0], 4U); + adcAddrs->init = adrv904x_CpuIntFromBytesGet(&ctrlResp[ 4], 4U); + adcAddrs->config = adrv904x_CpuIntFromBytesGet(&ctrlResp[ 8], 4U); + adcAddrs->calObj = adrv904x_CpuIntFromBytesGet(&ctrlResp[12], 4U); + adcAddrs->calState = adrv904x_CpuIntFromBytesGet(&ctrlResp[16], 4U); + adcAddrs->calData = adrv904x_CpuIntFromBytesGet(&ctrlResp[20], 4U); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_AdcRunInit(adi_adrv904x_Device_t* const device, + const uint8_t calType, + const adi_adrv904x_Channels_e channel) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + uint32_t lengthResp = 4U; + uint8_t ctrlData[4] = { 0U }; + uint8_t ctrlResp[16] = { 0U }; + + if ((calType != ADRV904X_CPU_OBJID_IC_ADC_RX) && + (calType != ADRV904X_CPU_OBJID_IC_ADC_TXLB) && + (calType != ADRV904X_CPU_OBJID_IC_ADC_ORX)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, calType, "Invalid cal type. - must be an ADC cal"); + return recoveryAction; + } + + if (calType == ADRV904X_CPU_OBJID_IC_ADC_ORX) + { + if ((channel != ADI_ADRV904X_CH0) && + (channel != ADI_ADRV904X_CH1)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "bad ORx channel"); + return recoveryAction; + } + } + else + { + if ((channel != ADI_ADRV904X_CH0) && + (channel != ADI_ADRV904X_CH1) && + (channel != ADI_ADRV904X_CH2) && + (channel != ADI_ADRV904X_CH3) && + (channel != ADI_ADRV904X_CH4) && + (channel != ADI_ADRV904X_CH5) && + (channel != ADI_ADRV904X_CH6) && + (channel != ADI_ADRV904X_CH7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "bad Rx/Tx channel"); + return recoveryAction; + } + } + + recoveryAction = adi_adrv904x_CpuControlCmdExec(device, + (uint32_t)calType, + (uint16_t)ADC_CTRL_INIT, + channel, + ctrlData, + sizeof(ctrlData), + &lengthResp, + ctrlResp, + sizeof(ctrlResp)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "AdcRunInit failed"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_AdcSetFsmCmd(adi_adrv904x_Device_t* const device, + const uint8_t calType, + const adi_adrv904x_Channels_e channel, + const uint8_t fsmCmd) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + uint32_t lengthResp = 4U; + uint8_t ctrlData[4] = { 0U }; + uint8_t ctrlResp[16] = { 0U }; + + if ((calType != ADRV904X_CPU_OBJID_IC_ADC_RX) && + (calType != ADRV904X_CPU_OBJID_IC_ADC_TXLB) && + (calType != ADRV904X_CPU_OBJID_IC_ADC_ORX)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, calType, "Invalid cal type. - must be an ADC cal"); + return recoveryAction; + } + + if (calType == ADRV904X_CPU_OBJID_IC_ADC_ORX) + { + if ((channel != ADI_ADRV904X_CH0) && + (channel != ADI_ADRV904X_CH1)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "AdcSetFsmCmd failed: bad ORx channel"); + return recoveryAction; + } + } + else + { + if ((channel != ADI_ADRV904X_CH0) && + (channel != ADI_ADRV904X_CH1) && + (channel != ADI_ADRV904X_CH2) && + (channel != ADI_ADRV904X_CH3) && + (channel != ADI_ADRV904X_CH4) && + (channel != ADI_ADRV904X_CH5) && + (channel != ADI_ADRV904X_CH6) && + (channel != ADI_ADRV904X_CH7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "AdcSetFsmCmd failed: bad Rx/Tx channel"); + return recoveryAction; + } + } + + ctrlData[0] = fsmCmd; + + recoveryAction = adi_adrv904x_CpuControlCmdExec(device, + (uint32_t)calType, + (uint16_t)ADC_CTRL_SET_FSM_CMD, + channel, + ctrlData, + sizeof(ctrlData), + &lengthResp, + ctrlResp, + sizeof(ctrlResp)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "AdcSetFsmCmd failed"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_AdcGetFsmState(adi_adrv904x_Device_t* const device, + const uint8_t calType, + const adi_adrv904x_Channels_e channel, + uint8_t* const fsmState) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, fsmState); + + uint32_t lengthResp = 4U; + uint8_t ctrlData[4] = { 0U }; + uint8_t ctrlResp[24] = { 0U }; + + if ((calType != ADRV904X_CPU_OBJID_IC_ADC_RX) && + (calType != ADRV904X_CPU_OBJID_IC_ADC_TXLB) && + (calType != ADRV904X_CPU_OBJID_IC_ADC_ORX)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, calType, "Invalid cal type. - must be an ADC cal"); + return recoveryAction; + } + + if (calType == ADRV904X_CPU_OBJID_IC_ADC_ORX) + { + if ((channel != ADI_ADRV904X_CH0) && + (channel != ADI_ADRV904X_CH1)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "bad ORx channel"); + return recoveryAction; + } + } + else + { + if ((channel != ADI_ADRV904X_CH0) && + (channel != ADI_ADRV904X_CH1) && + (channel != ADI_ADRV904X_CH2) && + (channel != ADI_ADRV904X_CH3) && + (channel != ADI_ADRV904X_CH4) && + (channel != ADI_ADRV904X_CH5) && + (channel != ADI_ADRV904X_CH6) && + (channel != ADI_ADRV904X_CH7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "bad Rx/Tx channel"); + return recoveryAction; + } + } + + /* Get the ADC module data sizes: */ + recoveryAction = adi_adrv904x_CpuControlCmdExec(device, + (uint32_t)calType, + (uint16_t)ADC_CTRL_GET_FSM_STATE, + channel, + ctrlData, + sizeof(ctrlData), + &lengthResp, + ctrlResp, + sizeof(ctrlResp)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "Get FSM state"); + return recoveryAction; + } + + *fsmState = ctrlResp[0]; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_AdcRunCmd(adi_adrv904x_Device_t* const device, + const uint8_t calType, + const adi_adrv904x_Channels_e channel) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + uint32_t lengthResp = 4U; + uint8_t ctrlData[4] = { 0U }; + uint8_t ctrlResp[16] = { 0U }; + + if ((calType != ADRV904X_CPU_OBJID_IC_ADC_RX) && + (calType != ADRV904X_CPU_OBJID_IC_ADC_TXLB) && + (calType != ADRV904X_CPU_OBJID_IC_ADC_ORX)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, calType, "Invalid cal type. - must be an ADC cal"); + return recoveryAction; + } + + if (calType == ADRV904X_CPU_OBJID_IC_ADC_ORX) + { + if ((channel != ADI_ADRV904X_CH0) && + (channel != ADI_ADRV904X_CH1)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "AdcRunCmd failed: bad ORx channel"); + return recoveryAction; + } + } + else + { + if ((channel != ADI_ADRV904X_CH0) && + (channel != ADI_ADRV904X_CH1) && + (channel != ADI_ADRV904X_CH2) && + (channel != ADI_ADRV904X_CH3) && + (channel != ADI_ADRV904X_CH4) && + (channel != ADI_ADRV904X_CH5) && + (channel != ADI_ADRV904X_CH6) && + (channel != ADI_ADRV904X_CH7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "AdcRunCmd failed: bad Rx/Tx channel"); + return recoveryAction; + } + } + + ctrlData[0] = 0; + + recoveryAction = adi_adrv904x_CpuControlCmdExec(device, + (uint32_t)calType, + (uint16_t)ADC_CTRL_RUN_CMD, + channel, + ctrlData, + sizeof(ctrlData), + &lengthResp, + ctrlResp, + sizeof(ctrlResp)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "AdcRunCmd failed"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SetTrackingPeriod(adi_adrv904x_Device_t* const device, + uint8_t objId, + uint32_t rateMsec) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + uint16_t offset; + uint32_t configDataLength = 4; + uint8_t configDataSet[4] = { 0 }; + + if ((objId < ADRV904X_CPU_OBJID_TC_START) || + (objId > ADRV904X_CPU_OBJID_TC_END)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, objId, "Invalid objId"); + return recoveryAction; + } + + offset = (objId - ADRV904X_CPU_OBJID_TC_START) * sizeof(uint32_t); + + configDataSet[0] = (uint8_t)((rateMsec >> 0) & 0xFFu); + configDataSet[1] = (uint8_t)((rateMsec >> 8) & 0xFFu); + configDataSet[2] = (uint8_t)((rateMsec >> 16) & 0xFFu); + configDataSet[3] = (uint8_t)((rateMsec >> 24) & 0xFFu); + + /* Get the ADC module data sizes: */ + recoveryAction = adi_adrv904x_CpuConfigSet(device, + (uint32_t)ADRV904X_CPU_OBJID_CFG_TRACKING_CALS, + offset, + configDataSet, + configDataLength); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, objId, "Set tracking period"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_GetTrackingPeriod(adi_adrv904x_Device_t* const device, + uint8_t objId, + uint32_t* const rateMsec) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + uint16_t offset; + uint32_t configDataLength = 4; + uint8_t configDataGet[4] = { 0 }; + + if ((objId < ADRV904X_CPU_OBJID_TC_START) || + (objId > ADRV904X_CPU_OBJID_TC_END)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, objId, "Invalid objId"); + return recoveryAction; + } + + offset = (objId - ADRV904X_CPU_OBJID_TC_START) * sizeof(uint32_t); + + /* Get the ADC module data sizes: */ + recoveryAction = adi_adrv904x_CpuConfigGet(device, + (uint32_t)ADRV904X_CPU_OBJID_CFG_TRACKING_CALS, + offset, + configDataGet, + configDataLength); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, objId, "Set tracking period"); + return recoveryAction; + } + + *rateMsec = adrv904x_CpuIntFromBytesGet(&configDataGet[0], 4U); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioSequencerPatternSet(adi_adrv904x_Device_t* const device, uint32_t sequencerId, uint32_t patternId) +{ + uint32_t patternAddr = 0u; + uint8_t enableFlag = 1u; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfSequencerChanAddr_e sequencerBaseAddr = ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS; + + /* Check that Radio Sequencer Enable */ + if (device->initExtract.rs.radioSeqEn == ADI_FALSE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + goto cleanup; + } + + recoveryAction = adrv904x_RadioSequencerPatternAddrGet(device, patternId, &patternAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to get Radio patternAddr addresses. \n"); + goto cleanup; + } + + if ((patternAddr & 0x0F) != 0) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "patternAddr addresses should be aligned to 16-byte boundary.\n"); + goto cleanup; + } + + recoveryAction = adrv904x_Sequencer_ExternalJumpPointer_BfSet(device, NULL, sequencerBaseAddr, (uint8_t)sequencerId, (uint16_t)(patternAddr>>4)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set Radio Sequencer patterns. \n"); + goto cleanup; + } + + recoveryAction = adrv904x_Sequencer_ExternalJumpEnable_BfSet(device, NULL, sequencerBaseAddr, (uint8_t)sequencerId, enableFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set Radio Sequencer ExternalJumpEnable. \n"); + goto cleanup; + } + +cleanup: + return recoveryAction; + +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioSequencerApply(adi_adrv904x_Device_t* const device) +{ + adrv904x_BfSequencerChanAddr_e sequencerBaseAddr = ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check that Radio Sequencer Enable */ + if (device->initExtract.rs.radioSeqEn == ADI_FALSE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + goto cleanup; + } + /* this bit needs to see a 0->1 transition to latch the register changes*/ + /* Clear the apply_on_multi_boundary */ + recoveryAction = adrv904x_Sequencer_ApplyOnMultiframeBoundary_BfSet(device, + NULL, + sequencerBaseAddr, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while clearing Radio Sequencer apply_on_multi_boundary. \n"); + goto cleanup; + } + + /* Set the apply_on_multi_boundary */ + recoveryAction = adrv904x_Sequencer_ApplyOnMultiframeBoundary_BfSet(device, + NULL, + sequencerBaseAddr, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting Radio Sequencer apply_on_multi_boundary. \n"); + goto cleanup; + } +cleanup: + return recoveryAction; + +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioSequencerApplyImmediately(adi_adrv904x_Device_t* const device) +{ + adrv904x_BfSequencerChanAddr_e sequencerBaseAddr = ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check that Radio Sequencer Enable */ + if (device->initExtract.rs.radioSeqEn == ADI_FALSE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + goto cleanup; + } + + /* this bit needs to see a 0->1 transition to latch the register changes*/ + /* Clear the apply_now */ + recoveryAction = adrv904x_Sequencer_ApplyNow_BfSet(device, + NULL, + sequencerBaseAddr, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while clearing Radio Sequencer apply_now. \n"); + goto cleanup; + } + + /* Set the apply_now */ + recoveryAction = adrv904x_Sequencer_ApplyNow_BfSet(device, + NULL, + sequencerBaseAddr, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting Radio Sequencer apply_now. \n"); + goto cleanup; + } +cleanup: + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioSequencerPhaseSetRangeCheck(adi_adrv904x_Device_t* const device, uint32_t phaseAdjustment) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check phaseAdjustment is valid */ + if ((phaseAdjustment & (~(uint32_t)(0x1FFFFFFU))) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + NULL, + "Invalid phaseAdjustment value encountered while attempting to write multiframe phaseAdjustment."); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; + +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioSequencerPatternAddrGet(adi_adrv904x_Device_t* const device, + const uint32_t patternId, + uint32_t* const patternAddr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check patternAddr address pointer is not null */ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, patternAddr); + + if (device->devStateInfo.rsImageHeader.numberPatterns == 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "The lookup table has not been populated. \n"); + return recoveryAction; + } + + if ((patternId >= device->devStateInfo.rsImageHeader.numberPatterns) || (patternId >= ADI_ADRV904X_RADIO_SEQ_LOOKUP_TAB_MAX_SIZE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid input patternId. \n"); + return recoveryAction; + } + + *patternAddr = device->devStateInfo.lookupTable[patternId]; + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioSequencerDfePtrnLookupTableSet(adi_adrv904x_Device_t* const device) +{ + uint32_t i = 0U; + uint32_t address = 0U; + uint32_t temp = 0U; + uint32_t rsInitStructAddr = ADRV904X_DFE_CPU_INIT_ADDR_GET(radioSeqInitData); + uint32_t sequenceLookupTableAddr = rsInitStructAddr + ADI_LIBRARY_OFFSETOF(adrv904x_DfeSvcRadioCtrlSequencerInitData_t, sequenceLookupTable); + uint32_t numPatternsAddr = rsInitStructAddr + ADI_LIBRARY_OFFSETOF(adrv904x_DfeSvcRadioCtrlSequencerInitData_t, numberPatterns); + uint32_t sequenceLookupTableCrcAddr = rsInitStructAddr + ADI_LIBRARY_OFFSETOF(adrv904x_DfeSvcRadioCtrlSequencerInitData_t, sequenceLookupTableCrc); + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check that the radio sequencer is enabled */ + if (device->initExtract.rs.radioSeqEn == ADI_FALSE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; + } + + /* Add number of RS patterns to DFE init region */ + temp = device->devStateInfo.rsImageHeader.numberPatterns; + recoveryAction = adi_adrv904x_Registers32Write(device, NULL, &numPatternsAddr, &(temp), NULL, sizeof(temp) / 4U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write radio sequencer numberPatterns to DFE init region"); + return recoveryAction; + } + + /* Add pattern lookup table CRC to DFE init region */ + temp = device->devStateInfo.rsImageHeader.lookupCrc; + recoveryAction = adi_adrv904x_Registers32Write(device, NULL, &sequenceLookupTableCrcAddr, &(temp), NULL, sizeof(temp) / 4U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write radio sequencer sequenceLookupTableCrc to DFE init region"); + return recoveryAction; + } + + /* Add pattern lookup table to the DFE init region */ + for (i = 0U; i < device->devStateInfo.rsImageHeader.numberPatterns; i++) + { + address = sequenceLookupTableAddr + (i * sizeof(device->devStateInfo.lookupTable[0U])); + temp = device->devStateInfo.lookupTable[i]; + recoveryAction = adi_adrv904x_Registers32Write(device, NULL, &address, &temp, NULL, sizeof(temp) / 4U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write radio sequencer sequenceLookupTableAddr to DFE init region"); + return recoveryAction; + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioSequencerResetHoldSet(adi_adrv904x_Device_t* const device, + const uint32_t resetHold) +{ + const uint32_t RADIO_SEQUENCER_CONFIG_0_REG_OFFSET = 0x20U; + const uint32_t RADIO_SEQUENCER_NUM_SEQUENCERS = 16U; + const uint32_t RESET_HOLD_BITP = 28U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfSequencerChanAddr_e sequencerBaseAddr = ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS; + uint8_t channelId = 0x0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + for (channelId = 0U; channelId < RADIO_SEQUENCER_NUM_SEQUENCERS; channelId++) + { + uint32_t regVal = 0U; + recoveryAction = adi_adrv904x_Register32Read(device, + NULL, + ((uint32_t)sequencerBaseAddr + RADIO_SEQUENCER_CONFIG_0_REG_OFFSET + channelId * 4U), + ®Val, + 0xFFFFFFFFU); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading RS reset_hold bitfield"); + goto cleanup; + } + + regVal = (resetHold == 0U) ? regVal & (~(1U << RESET_HOLD_BITP)) : regVal | (1U << RESET_HOLD_BITP); + + recoveryAction = adi_adrv904x_Register32Write(device, + NULL, + ((uint32_t)sequencerBaseAddr + RADIO_SEQUENCER_CONFIG_0_REG_OFFSET + channelId * 4U), + regVal, + 0xFFFFFFFFU); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting RS reset_hold bitfield"); + goto cleanup; + } + } +cleanup: + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioSequencerStart(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_ErrAction_e tmpRecoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const uint32_t RADIO_SEQUENCER_NUM_SEQUENCERS = 16U; + const uint32_t RADIO_SEQUENCER_CONFIG_0_REG_OFFSET = 0x20U; + const uint32_t DBG_PROGRAM_COUNTER_BITP = 0U; + const uint32_t DBG_PROGRAM_COUNTER_BITM = 0x0000FFFFU; + const uint32_t RS_START_WAIT_INTERVAL_US = 1000U; + const uint32_t RS_START_WAIT_CNT = 1000U; + + uint32_t pointerInit = 0x0U; + uint8_t resetHold = 0x0U; + adrv904x_BfSequencerChanAddr_e sequencerBaseAddr = ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS; + uint8_t channelId = 0x0U; + uint32_t patternId = ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_STARTUP_PATTERN_GLOBAL_PTRN_ID; + uint32_t curPc = 0U; + uint8_t startComplete = 0U; + uint32_t waitCounter = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check that Radio Sequencer Enable */ + if (device->initExtract.rs.radioSeqEn == ADI_FALSE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + goto cleanup; + } + + /* Check that Radio Sequencer has been loaded before getting RS error info */ + if ((device->devStateInfo.devState & ADI_ADRV904X_STATE_RSLOADED) != ADI_ADRV904X_STATE_RSLOADED) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Radio Sequencer should have been loaded before starting"); + goto cleanup; + } + + /* Check if RS was already initialized and started */ + if (device->devStateInfo.rsStarted == ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + goto cleanup; + } + else + { + if (device->initExtract.rs.ssbSyncMode == 0) + { + /* Clear the reset_hold for all the 16 radio sequencers */ + resetHold = 0x0U; + recoveryAction = adrv904x_RadioSequencerResetHoldSet(device, resetHold); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to clear reset hold"); + goto cleanup; + } + + /* Get the default pattern address */ + recoveryAction = adrv904x_RadioSequencerPatternAddrGet(device, patternId, &pointerInit); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to get address of RS pattern"); + goto cleanup; + } + + /* Set the pointerInit and clear ExternalJumpEnable for all the 16 radio sequencers */ + for (channelId = 0; channelId < RADIO_SEQUENCER_NUM_SEQUENCERS; channelId++) + { + recoveryAction = adrv904x_Sequencer_PointerInit_BfSet(device, + NULL, + sequencerBaseAddr, + channelId, + (pointerInit >> 4U)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting RS pointer_init bitfield"); + goto cleanup; + } + + recoveryAction = adrv904x_Sequencer_ExternalJumpEnable_BfSet(device, NULL, sequencerBaseAddr, (uint8_t)channelId, 0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set Radio Sequencer ExternalJumpEnable. \n"); + goto cleanup; + } + } + } + else + { + /* 1.1 Clear the apply_on_multi_boundary */ + recoveryAction = adrv904x_Sequencer_ApplyOnMultiframeBoundary_BfSet(device, + NULL, + sequencerBaseAddr, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while clearing Radio Sequencer apply_on_multi_boundary. \n"); + goto cleanup; + } + + /* 1.2 Clear the apply_now */ + recoveryAction = adrv904x_Sequencer_ApplyNow_BfSet(device, + NULL, + sequencerBaseAddr, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while clearing Radio Sequencer apply_now. \n"); + goto cleanup; + } + + /* 2.1 Set the error_clear */ + recoveryAction = adrv904x_Sequencer_ErrorClear_BfSet(device, + NULL, + sequencerBaseAddr, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting Radio Sequencer error_clear. \n"); + goto cleanup; + } + + /* 2.2 Set the ssb_sync_phase_error_clear */ + recoveryAction = adrv904x_Sequencer_SsbSyncPhaseErrorClear_BfSet(device, + NULL, + sequencerBaseAddr, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting Radio Sequencer ssb_sync_phase_error_clear. \n"); + goto cleanup; + } + + /* 3.1 Set the reset_hold for all the 16 radio sequencers */ + resetHold = 0x1U; + recoveryAction = adrv904x_RadioSequencerResetHoldSet(device, resetHold); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set reset hold"); + goto cleanup; + } + + /* 3.2 Get the default pattern address */ + recoveryAction = adrv904x_RadioSequencerPatternAddrGet(device, patternId, &pointerInit); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to get address of RS pattern"); + goto cleanup; + } + + /* 3.3 Set the pointerInit and clear ExternalJumpEnable for all the 16 radio sequencers */ + for (channelId = 0; channelId < RADIO_SEQUENCER_NUM_SEQUENCERS; channelId++) + { + recoveryAction = adrv904x_Sequencer_PointerInit_BfSet(device, + NULL, + sequencerBaseAddr, + channelId, + (pointerInit >> 4U)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting RS pointer_init bitfield"); + goto cleanup; + } + + recoveryAction = adrv904x_Sequencer_ExternalJumpEnable_BfSet(device, NULL, sequencerBaseAddr, (uint8_t)channelId, 0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set Radio Sequencer ExternalJumpEnable. \n"); + goto cleanup; + } + } + + /* 4. Clear global_reset */ + recoveryAction = adrv904x_Sequencer_GlobalReset_BfSet(device, + NULL, + sequencerBaseAddr, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while clearing RS Global Reset. \n"); + goto cleanup; + } + + // 5.1 Enable SP events trigger by SSB_SYNC GPIO + recoveryAction = adrv904x_GpioDestStreamTrigSet(device, device->initExtract.radioCtrlPreInit.radioSequencerSsbSyncGpioCtrl, ADI_DISABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while enabling stream trigger"); + goto cleanup; + } + + // 5.2 Wait for new SSB_SYNC to re-align multiframe boundary + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_SEQUENCER_WAIT_FOR_SSB_SYNC, + NULL, + 0, + NULL, + 0, + NULL); + + // 5.3 Always disable SP events trigger by SSB_SYNC GPIO, even if WAIT_FOR_SSB_SYNC cmd returned an error + tmpRecoveryAction = adrv904x_GpioDestStreamTrigSet(device, device->initExtract.radioCtrlPreInit.radioSequencerSsbSyncGpioCtrl, ADI_ENABLE); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while waiting for SSB SYNC. \n"); + goto cleanup; + } + + recoveryAction = tmpRecoveryAction; + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while disabling stream trigger"); + goto cleanup; + } + + /* 6.1 Clear the error_clear bitfield */ + recoveryAction = adrv904x_Sequencer_ErrorClear_BfSet(device, + NULL, + sequencerBaseAddr, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while clearing Radio Sequencer error_clear. \n"); + goto cleanup; + } + + /* 6.2 Clear the ssb_sync_phase_error_clear bitfield */ + recoveryAction = adrv904x_Sequencer_SsbSyncPhaseErrorClear_BfSet(device, + NULL, + sequencerBaseAddr, + 0U); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while clearing Radio Sequencer ssb_sync_phase_error_clear. \n"); + goto cleanup; + } + + /* 7. Clear the reset_hold for all the 16 radio sequencers */ + resetHold = 0x0U; + recoveryAction = adrv904x_RadioSequencerResetHoldSet(device, resetHold); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to clear reset hold"); + goto cleanup; + } + } + + /* Apply changes on multi-frame boundary */ + recoveryAction = adrv904x_RadioSequencerApply(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting RS Apply.\n"); + goto cleanup; + } + + startComplete = 0U; + for (waitCounter = 0U; waitCounter < RS_START_WAIT_CNT; waitCounter++) + { + /* Assume that all have started until proven otherwise below */ + startComplete = 1U; + + /* Set the RS status to started */ + device->devStateInfo.rsStarted = ADI_TRUE; + + /* Verify the the current PC == pointerInit */ + for (channelId = 0; channelId < RADIO_SEQUENCER_NUM_SEQUENCERS; channelId++) + { + recoveryAction = adi_adrv904x_Register32Read(device, + NULL, + ((uint32_t) sequencerBaseAddr + RADIO_SEQUENCER_CONFIG_0_REG_OFFSET + channelId * 4), + &curPc, + 0xFFFFFFFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading RS dbg_program_counter bitfield"); + goto cleanup; + } + + curPc = (curPc & DBG_PROGRAM_COUNTER_BITM) >> DBG_PROGRAM_COUNTER_BITP; + if (curPc != (pointerInit & DBG_PROGRAM_COUNTER_BITM)) + { + /* One of the radio sequencers hasn't started executing the startup pattern yet. + * Continue checking for completion. + */ + startComplete = 0U; + } + } + + if (startComplete == 0U) + { + /* Wait a bit before running the check again */ + recoveryAction = (adi_adrv904x_ErrAction_e)adi_common_hal_Wait_us(&device->common, RS_START_WAIT_INTERVAL_US); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while waiting for Radio Sequencer to start"); + goto cleanup; + } + } + else + { + /* All radio sequencers have started, exit the wait loop */ + break; + } + } + + /* Radio sequencer didn't start in the specified amount of time. */ + if (startComplete == 0U) + { + /* Set the RS status to not started */ + device->devStateInfo.rsStarted = ADI_FALSE; + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_DEVICE; + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_BOOT_TIMEOUT, + recoveryAction, + ADI_NO_VARIABLE, + "Radio Sequencer Start Timeout"); + goto cleanup; + } + } + cleanup: + if ((device->initExtract.rs.ssbSyncMode != 0) && (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE)) + { + /* Set global_reset */ + adrv904x_Sequencer_GlobalReset_BfSet(device, + NULL, + sequencerBaseAddr, + 1U); + } + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_DfeCtrlTxToOrxMappingBaseSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e orxChannel, + const adi_adrv904x_TxChannels_e txChannel, + const uint8_t isVswrState, + const adi_adrv904x_DfeVswrDirection_e vswrDirection) +{ + + const uint8_t VSWR_FLAG = 0x8U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_TxToOrxMappingMode_e lclMode = device->devStateInfo.dfeCtrlTxToOrxMappingConfig.mode; + uint8_t streamTxOff = 0; + uint8_t streamTxCfg = 0; + uint8_t streamTxAct = 0; + uint8_t txIdx = 0; + adi_adrv904x_DfeVswrDirection_e lclDir = ADI_ADRV904X_DFE_VSWR_FWD; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check that Mapping Mode DFE CTRL. Otherwise throw an error */ + if (lclMode != ADI_ADRV904X_TX_ORX_MAPPING_MODE_DFE_CTRL) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + lclMode, + "Device Tx to Orx Mapping Mode is a RCI mode. This function can only be used for DFE Control mode."); + goto cleanup; + } + + /* Range check orxChannel enum */ + if (orxChannel == ADI_ADRV904X_ORX0) + { + streamTxOff = ADRV904X_STREAM_MAIN_ORX0_ALL_OFF_PIN_STATE_IN_RS_MODE; + streamTxCfg = ADRV904X_STREAM_MAIN_CFG_TX_ORX0_MAPPING_IN_RS_MODE; + streamTxAct = ADRV904X_STREAM_MAIN_ACT_TX_ORX0_MAPPING_IN_RS_MODE; + } + else if (orxChannel == ADI_ADRV904X_ORX1) + { + streamTxOff = ADRV904X_STREAM_MAIN_ORX1_ALL_OFF_PIN_STATE_IN_RS_MODE; + streamTxCfg = ADRV904X_STREAM_MAIN_CFG_TX_ORX1_MAPPING_IN_RS_MODE; + streamTxAct = ADRV904X_STREAM_MAIN_ACT_TX_ORX1_MAPPING_IN_RS_MODE; + } + else + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + orxChannel, + "ORx Channel selected is invalid. Must select ORx0-1.") ; + goto cleanup; + } + + /* Range check txChannel enum */ + switch (txChannel) + { + case (ADI_ADRV904X_TX0): + txIdx = 0; + break; + case (ADI_ADRV904X_TX1): + txIdx = 1; + break; + case (ADI_ADRV904X_TX2): + txIdx = 2; + break; + case (ADI_ADRV904X_TX3): + txIdx = 3; + break; + case (ADI_ADRV904X_TX4): + txIdx = 4; + break; + case (ADI_ADRV904X_TX5): + txIdx = 5; + break; + case (ADI_ADRV904X_TX6): + txIdx = 6; + break; + case (ADI_ADRV904X_TX7): + txIdx = 7; + break; + case (ADI_ADRV904X_TXOFF): + break; + + default: + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + txChannel, + "Tx Channel selected is invalid. Must select Tx0-7 or TXOFF") ; + goto cleanup; + } + + /* If VSWR state, then check vswr direction provided set MSB (bit3) of txIdx mapping in shadow reg */ + if (isVswrState != 0U) + { + /* Range Check vswrDirection */ + if ((vswrDirection != ADI_ADRV904X_DFE_VSWR_REV) && + (vswrDirection != ADI_ADRV904X_DFE_VSWR_FWD)) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + vswrDirection, + "VSWR direction selected is invalid. Must select FWD or REV") ; + goto cleanup; + } + + txIdx |= VSWR_FLAG; + lclDir = vswrDirection; + } + + /* If txChannel = TXOFF, trigger the approp stream to apply a preset TX OFF state to GPIO outputs */ + if (txChannel == ADI_ADRV904X_TXOFF) + { + recoveryAction = adrv904x_StreamTrigger(device, streamTxOff); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while triggering Core Stream to apply ALL OFF state to DFE Ctrl Mapping output GPIOs."); + goto cleanup; + } + } + /* Otherwise, select Tx channel mapping and trigger streams to store and apply new GPIO output states */ + else + { + if (orxChannel == ADI_ADRV904X_ORX0) + { + /* Set Orx0 mapping to DPD/VSWR txIdx */ + recoveryAction = adrv904x_Core_RadioControlInterfaceOrx0MapShadow_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + txIdx); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while setting new mapping for Orx0."); + goto cleanup; + } + + /* Set ORx0 VSWR dir */ + recoveryAction = adrv904x_Core_VswrFwdRev0SelShadow_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + lclDir); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while setting new mapping vswr direction for Orx0."); + goto cleanup; + } + } + else + { + /* Set Orx1 mapping to DPD/VSWR txIdx */ + recoveryAction = adrv904x_Core_RadioControlInterfaceOrx1MapShadow_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + txIdx); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while setting new mapping for Orx1."); + goto cleanup; + } + + /* Set ORx1 VSWR dir */ + recoveryAction = adrv904x_Core_VswrFwdRev1SelShadow_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + lclDir); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while setting new mapping vswr direction for Orx1."); + goto cleanup; + } + } + + recoveryAction = adrv904x_StreamTrigger(device, streamTxCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while triggering Core Stream to store DFE Ctrl Mapping output GPIO states to apply next."); + goto cleanup; + } + + recoveryAction = adrv904x_StreamTrigger(device, streamTxAct); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while triggering Core Stream to apply DFE Ctrl Mapping output GPIO states."); + goto cleanup; + } + } + +cleanup: + return recoveryAction; +} + + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioCtrlDbgGpioOutputRangeCheck( adi_adrv904x_Device_t* const device, + const adi_adrv904x_OutGpioSigTypes_e gpioSigType, + const uint8_t signalMask, + const uint8_t setOp) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const uint8_t MAX_TDD_DRV = 1U; + + /* Validate inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + switch (gpioSigType) + { + + case ADI_ADRV904X_OUT_GPIO_SIG_TYPE_LNA_EN: + case ADI_ADRV904X_OUT_GPIO_SIG_TYPE_PA_EN: + case ADI_ADRV904X_OUT_GPIO_SIG_TYPE_FB_SW_EN: + case ADI_ADRV904X_OUT_GPIO_SIG_TYPE_FB_SW_EXT_EN: + case ADI_ADRV904X_OUT_GPIO_SIG_TYPE_AUX_GRP0_OUT: + case ADI_ADRV904X_OUT_GPIO_SIG_TYPE_AUX_GRP1_OUT: + if (setOp == ADI_TRUE) + { + if (signalMask == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + } + } + else + { + /* if multiple bits are slected or no bit then it is error */ + if (((signalMask & (signalMask - 1)) != 0) || (signalMask == 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + } + } + break; + + case ADI_ADRV904X_OUT_GPIO_SIG_TYPE_TDD_SW_EN: + case ADI_ADRV904X_OUT_GPIO_SIG_TYPE_DRV_PA_EN: + if (signalMask != MAX_TDD_DRV) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + } + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + } + + /* Flag an error for any invalid parameter */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid combination of GPIO signal type and its mask value."); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioCtrlDbgGpioOutputFind( adi_adrv904x_Device_t* const device, + const adi_adrv904x_OutGpioSigTypes_e gpioSigType, + const uint8_t signalOffset, + uint8_t * gpioPin, + uint8_t * isDigital) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + int32_t gpioCfgIdx; + uint8_t fbSwIdx = 0U; + adi_adrv904x_StreamGpioPinCfg_t streamGpioPinCfg; + + + /* Validate inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, gpioPin); + ADI_LIBRARY_MEMSET(&streamGpioPinCfg, 0, sizeof(streamGpioPinCfg)); + + /* Assume it is GPIO analog.*/ + *isDigital = ADI_FALSE; + + switch (gpioSigType) + { + case ADI_ADRV904X_OUT_GPIO_SIG_TYPE_LNA_EN: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + if (device->devStateInfo.alarmGpioConfig.lnaEnOutDigGpio[signalOffset] != ADI_ADRV904X_GPIO_INVALID) + { + *gpioPin = device->devStateInfo.alarmGpioConfig.lnaEnOutDigGpio[signalOffset]; + *isDigital = ADI_TRUE; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + else if (device->devStateInfo.alarmGpioConfig.lnaEnOutAnaGpio[signalOffset] != ADI_ADRV904X_GPIO_ANA_INVALID) + { + *gpioPin = device->devStateInfo.alarmGpioConfig.lnaEnOutAnaGpio[signalOffset]; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + break; + + case ADI_ADRV904X_OUT_GPIO_SIG_TYPE_PA_EN: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + if (device->devStateInfo.alarmGpioConfig.paEnOutDigGpio[signalOffset] != ADI_ADRV904X_GPIO_INVALID) + { + *gpioPin = device->devStateInfo.alarmGpioConfig.paEnOutDigGpio[signalOffset]; + *isDigital = ADI_TRUE; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + else if (device->devStateInfo.alarmGpioConfig.paEnOutAnaGpio[signalOffset] != ADI_ADRV904X_GPIO_ANA_INVALID) + { + *gpioPin = device->devStateInfo.alarmGpioConfig.paEnOutAnaGpio[signalOffset]; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + break; + + case ADI_ADRV904X_OUT_GPIO_SIG_TYPE_AUX_GRP0_OUT: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + if (device->devStateInfo.alarmGpioConfig.auxGrp0OutDigGpio[signalOffset] != ADI_ADRV904X_GPIO_INVALID) + { + *gpioPin = device->devStateInfo.alarmGpioConfig.auxGrp0OutDigGpio[signalOffset]; + *isDigital = ADI_TRUE; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + else if (device->devStateInfo.alarmGpioConfig.auxGrp0OutAnaGpio[signalOffset] != ADI_ADRV904X_GPIO_ANA_INVALID) + { + *gpioPin = device->devStateInfo.alarmGpioConfig.auxGrp0OutAnaGpio[signalOffset]; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + break; + + case ADI_ADRV904X_OUT_GPIO_SIG_TYPE_AUX_GRP1_OUT: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + if (device->devStateInfo.alarmGpioConfig.auxGrp1OutDigGpio[signalOffset] != ADI_ADRV904X_GPIO_INVALID) + { + *gpioPin = device->devStateInfo.alarmGpioConfig.auxGrp1OutDigGpio[signalOffset]; + *isDigital = ADI_TRUE; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + else if (device->devStateInfo.alarmGpioConfig.auxGrp1OutAnaGpio[signalOffset] != ADI_ADRV904X_GPIO_ANA_INVALID) + { + *gpioPin = device->devStateInfo.alarmGpioConfig.auxGrp1OutAnaGpio[signalOffset]; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + break; + + case ADI_ADRV904X_OUT_GPIO_SIG_TYPE_FB_SW_EN: + case ADI_ADRV904X_OUT_GPIO_SIG_TYPE_FB_SW_EXT_EN: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + if (signalOffset > 3U) + { + + if (gpioSigType == ADI_ADRV904X_OUT_GPIO_SIG_TYPE_FB_SW_EXT_EN) + { + fbSwIdx = signalOffset; /* adjust index to access rows 4..7 */ + } + else + { + /* upper nibble */ + fbSwIdx = signalOffset - 4U; /* adjust index to access rows 0..3 */ + } + gpioCfgIdx = device->devStateInfo.dfeCtrlTxToOrxMappingConfig.gpioSelectOrx1[fbSwIdx]; + } + else + { + if (gpioSigType == ADI_ADRV904X_OUT_GPIO_SIG_TYPE_FB_SW_EXT_EN) + { + fbSwIdx = signalOffset + 4U; /* adjust index to access rows 4..7 */ + } + else + { + fbSwIdx = signalOffset; /* adjust index to access rows 0..3 */ + } + gpioCfgIdx = device->devStateInfo.dfeCtrlTxToOrxMappingConfig.gpioSelectOrx0[fbSwIdx]; + } + + + if ((gpioCfgIdx >= ADI_ADRV904X_GPIO_GENERIC_ANA_START) && (gpioCfgIdx <= ADI_ADRV904X_GPIO_GENERIC_ANA_END)) + { + gpioCfgIdx -= ADI_ADRV904X_GPIO_GENERIC_ANA_START; + *gpioPin = gpioCfgIdx; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + + if ((gpioCfgIdx >= ADI_ADRV904X_GPIO_GENERIC_DIG_START) && (gpioCfgIdx <= ADI_ADRV904X_GPIO_GENERIC_DIG_END)) + { + *isDigital = ADI_TRUE; + gpioCfgIdx -= ADI_ADRV904X_GPIO_GENERIC_DIG_START; + *gpioPin = gpioCfgIdx; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + break; + + case ADI_ADRV904X_OUT_GPIO_SIG_TYPE_TDD_SW_EN: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + if (device->devStateInfo.digGpioTddSw != ADI_ADRV904X_GPIO_INVALID) + { + *gpioPin = device->devStateInfo.digGpioTddSw; + *isDigital = ADI_TRUE; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + else if (device->devStateInfo.anaGpioTddSw != ADI_ADRV904X_GPIO_ANA_INVALID) + { + *gpioPin = device->devStateInfo.anaGpioTddSw; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + break; + + case ADI_ADRV904X_OUT_GPIO_SIG_TYPE_DRV_PA_EN: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + if (device->devStateInfo.digGpioPredrive != ADI_ADRV904X_GPIO_INVALID) + { + *gpioPin = device->devStateInfo.digGpioPredrive; + *isDigital = ADI_TRUE; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + else if (device->devStateInfo.anaGpioPredrive != ADI_ADRV904X_GPIO_ANA_INVALID) + { + *gpioPin = device->devStateInfo.anaGpioPredrive; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid GPIO signal type."); + return recoveryAction; + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while finding GPIO index."); + return recoveryAction; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e adrv904x_DbgGpioOutputPinMode( adi_adrv904x_Device_t* const device, + const adi_adrv904x_OutGpioSigTypes_e gpioSigType, + const adi_adrv904x_OutGpioPinStates_e gpioPinstate, + uint8_t * gpioMode, + uint8_t isDigital) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + const uint8_t GPIO_DIGITAL_RS_OUTPUT_MODE = 0x0D; + const uint8_t GPIO_DIGITAL_MANUAL_OUTPUT_MODE = 0x04; + const uint8_t GPIO_DIGITAL_MANUAL_INPUT_MODE = 0x05; + + const uint8_t GPIO_ANALOG_RS_OUTPUT_MODE = 0x08; + const uint8_t GPIO_ANALOG_MANUAL_OUTPUT_MODE = 0x03; + const uint8_t GPIO_ANALOG_MANUAL_INPUT_MODE = 0x04; + + switch (gpioPinstate) + { + case ADI_ADRV904X_OUT_GPIO_PIN_STATE_OFF: + case ADI_ADRV904X_OUT_GPIO_PIN_STATE_ON: + *gpioMode = (isDigital == ADI_TRUE) ? GPIO_DIGITAL_MANUAL_OUTPUT_MODE : GPIO_ANALOG_MANUAL_OUTPUT_MODE; + break; + + case ADI_ADRV904X_OUT_GPIO_PIN_STATE_HIGH_Z: + *gpioMode = (isDigital == ADI_TRUE) ? GPIO_DIGITAL_MANUAL_INPUT_MODE : GPIO_ANALOG_MANUAL_INPUT_MODE; + break; + + case ADI_ADRV904X_OUT_GPIO_PIN_STATE_NORMAL_OP: + if ((gpioSigType == ADI_ADRV904X_OUT_GPIO_SIG_TYPE_FB_SW_EN) || (gpioSigType == ADI_ADRV904X_OUT_GPIO_SIG_TYPE_FB_SW_EXT_EN)) + { + *gpioMode = (isDigital == ADI_TRUE) ? GPIO_DIGITAL_MANUAL_OUTPUT_MODE : GPIO_ANALOG_MANUAL_OUTPUT_MODE; + } + else + { + *gpioMode = (isDigital == ADI_TRUE) ? GPIO_DIGITAL_RS_OUTPUT_MODE : GPIO_ANALOG_RS_OUTPUT_MODE; + } + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid GPIO pin state."); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioCtrlDbgGpioOutputSet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_OutGpioSigTypes_e gpioSigType, + const uint8_t signalMask, + const adi_adrv904x_OutGpioPinStates_e gpioPinstate, + uint8_t isDigital, + uint8_t updateDbgFlag) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const uint8_t MAX_SIGNAL = 8U; + + uint8_t gpioMode = 0U; + uint32_t regValue = 0U; + uint8_t regByte = 0U; + uint8_t signalOffset = 0U; + uint8_t gpioPin = 0U; + uint8_t bitSet = 0U; + uint8_t outputUpdated = 0U; + uint16_t channelId = 0U; + + /* Validate inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Loop through and process every signal selected in the signal mask */ + for (signalOffset = 0; signalOffset < MAX_SIGNAL; signalOffset++) + { + if ((signalMask & (1 << signalOffset)) == 0) + { + /* Signal not selected in signal mask */ + continue; + } + + if (updateDbgFlag == 0) + { + /* The debug flag don't need to be updated */ + } + else if (updateDbgFlag == 1) + { + /* The debug flag needs to be cleared */ + recoveryAction = adrv904x_RadioCtrlDbgGpioDebugFlagSet(device, gpioSigType, signalOffset, 0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Failed to clear debug flag."); + return recoveryAction; + } + } + else if (updateDbgFlag == 2) + { + /* The debug flag needs to be set */ + recoveryAction = adrv904x_RadioCtrlDbgGpioDebugFlagSet(device, gpioSigType, signalOffset, 1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Failed to set debug flag."); + return recoveryAction; + } + } + + if (outputUpdated == 0) + { + /* Based on the input parameters, find the GPIO Index in the GPIO Pins Configuration */ + recoveryAction = adrv904x_RadioCtrlDbgGpioOutputFind(device, gpioSigType, signalOffset, &gpioPin, &isDigital); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Failed to find GPIO based on the input parameters."); + return recoveryAction; + } + + recoveryAction = adrv904x_DbgGpioOutputPinMode(device, + gpioSigType, + gpioPinstate, + &gpioMode, + isDigital); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting the GPIO pin mode."); + return recoveryAction; + } + + /* Set the gpioMode to the correct GPIO Source Control register nibble based on gpioPin */ + if (isDigital == ADI_TRUE) + { + recoveryAction = adrv904x_GpioPinmuxStg3Set(device, (adi_adrv904x_GpioPinSel_e)gpioPin, gpioMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting the GPIO Source Control bitfield."); + return recoveryAction; + } + } + else + { + recoveryAction = adrv904x_GpioAnalogPinmuxSet(device, (adi_adrv904x_GpioAnaPinSel_e)gpioPin, gpioMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting the GPIO Analog Source Control bitfield."); + return recoveryAction; + } + } + + if ((gpioSigType == ADI_ADRV904X_OUT_GPIO_SIG_TYPE_FB_SW_EN) || (gpioSigType == ADI_ADRV904X_OUT_GPIO_SIG_TYPE_FB_SW_EXT_EN)) + { + /* The bit position 0,1,2,3 is uses to configure pins assigned to TX-to-ORx0 mapping + * The bit position 4,5,6,7 is uses to configure pins assigned to TX-to-ORx1 mapping + */ + if (signalOffset < 4) + { + channelId = ADRV904X_FORCED_FB_SW_STATE_BITMAP_ORX0; + } + else + { + channelId = ADRV904X_FORCED_FB_SW_STATE_BITMAP_ORX1; + } + + /* Read the scratch register */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + channelId, + ®Byte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while read scratch reg FW SW Bitmap."); + return recoveryAction; + } + + if (gpioPinstate == ADI_ADRV904X_OUT_GPIO_PIN_STATE_NORMAL_OP) + { + if (channelId == ADRV904X_FORCED_FB_SW_STATE_BITMAP_ORX0) + { + if (gpioSigType == ADI_ADRV904X_OUT_GPIO_SIG_TYPE_FB_SW_EN) + { + bitSet = regByte & (1 << (signalOffset + 0)); + + /* Clear the bit if it is set */ + regByte &= ~(1 << (signalOffset + 0)); + } + else + { + bitSet = regByte & (1 << (signalOffset + 4)); + + /* Clear the bit if it is set */ + regByte &= ~(1 << (signalOffset + 4)); + } + } + else + { + if (gpioSigType == ADI_ADRV904X_OUT_GPIO_SIG_TYPE_FB_SW_EN) + { + bitSet = regByte & (1 << (signalOffset - 4)); + + /* Clear the bit if it is set */ + regByte &= ~(1 << (signalOffset - 4)); + } + else + { + bitSet = regByte & (1 << (signalOffset + 0)); + + /* Clear the bit if it is set */ + regByte &= ~(1 << (signalOffset + 0)); + } + } + + if (bitSet != 0U) + { + /* Write to the scratch reg */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + channelId, + regByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while clearing FB SW State bitfield."); + } + + /* Trigger stream for both events */ + recoveryAction = adrv904x_StreamTrigger(device, ADRV904X_STREAM_FB_SW_00); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while triggering Core Stream to apply FB SW clear."); + return recoveryAction; + } + + recoveryAction = adrv904x_StreamTrigger(device, ADRV904X_STREAM_FB_SW_01); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while triggering Core Stream to apply FB SW clear."); + return recoveryAction; + } + } + } + else + { + if (channelId == ADRV904X_FORCED_FB_SW_STATE_BITMAP_ORX0) + { + if (gpioSigType == ADI_ADRV904X_OUT_GPIO_SIG_TYPE_FB_SW_EN) + { + regByte |= (1 << (signalOffset + 0)); + } + else + { + regByte |= (1 << (signalOffset + 4)); + } + } + else + { + if (gpioSigType == ADI_ADRV904X_OUT_GPIO_SIG_TYPE_FB_SW_EN) + { + regByte |= (1 << (signalOffset - 4)); + } + else + { + regByte |= (1 << (signalOffset + 0)); + } + } + + /* Write to the scratch reg */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + channelId, + regByte); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while write scratch reg FW SW Bitmap."); + return recoveryAction; + } + } + } + + /* + * - Set the corresponding GPIO pin + * - Write the value to the GPIO From Master + */ + if (gpioPinstate == ADI_ADRV904X_OUT_GPIO_PIN_STATE_ON) + { + /* Update the corresponding GPIO Pin */ + regValue = (1U << gpioPin); + + /* Write back the modified value */ + if (isDigital == ADI_TRUE) + { + recoveryAction = adrv904x_Core_GpioFromMasterSet_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + regValue); + } + else + { + recoveryAction = adrv904x_Core_GpioAnalogFromMasterSet_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + (uint16_t)regValue); + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while Setting the GPIO From Master Set bitfield."); + return recoveryAction; + } + } + else if (gpioPinstate == ADI_ADRV904X_OUT_GPIO_PIN_STATE_OFF) + { + /* Update the corresponding GPIO Pin */ + regValue = (1U << gpioPin); + + /* Write back the modified value */ + if (isDigital == ADI_TRUE) + { + recoveryAction = adrv904x_Core_GpioFromMasterClear_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + regValue); + } + else + { + recoveryAction = adrv904x_Core_GpioAnalogFromMasterClear_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + (uint16_t)regValue); + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting the GPIO From Master Clear bitfield."); + return recoveryAction; + } + } + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioCtrlDbgGpioOutputGet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_OutGpioSigTypes_e gpioSigType, + const uint8_t signalOffset, + adi_adrv904x_OutGpioPinStates_e * const gpioPinstate, + uint8_t gpioPin, + uint8_t isDigital) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t gpioMode = 0U; + uint8_t regByte = 0U; + uint32_t fromMaster = 0U; + uint16_t channelId = 0U; + uint32_t mask = 0U; + + const uint8_t GPIO_DIGITAL_MANUAL_OUTPUT_MODE = 0x04; + const uint8_t GPIO_DIGITAL_MANUAL_INPUT_MODE = 0x05; + + const uint8_t GPIO_ANALOG_MANUAL_OUTPUT_MODE = 0x03; + const uint8_t GPIO_ANALOG_MANUAL_INPUT_MODE = 0x04; + + /* Validate inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, gpioPinstate); + + /* Set the gpioMode to the correct GPIO Source Control register nibble based on gpioPin */ + if (isDigital == ADI_TRUE) + { + recoveryAction = adrv904x_GpioPinmuxStg3Get(device, (adi_adrv904x_GpioPinSel_e) gpioPin, &gpioMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting the GPIO Source Control bitfield."); + return recoveryAction; + } + } + else + { + recoveryAction = adrv904x_GpioAnalogPinmuxGet(device, (adi_adrv904x_GpioAnaPinSel_e) gpioPin, &gpioMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting the GPIO Analog Source Control bitfield."); + return recoveryAction; + } + } + + if (((isDigital == ADI_TRUE) && (gpioMode == GPIO_DIGITAL_MANUAL_OUTPUT_MODE)) || + ((isDigital != ADI_TRUE) && (gpioMode == GPIO_ANALOG_MANUAL_OUTPUT_MODE))) + { + if (isDigital == ADI_TRUE) + { + recoveryAction = adrv904x_Core_GpioFromMaster_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &fromMaster); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while reading back GPIO Manual Mode Input Word values."); + return recoveryAction; + } + } + else + { + recoveryAction = adrv904x_Core_GpioAnalogFromMaster_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + (uint16_t*)&fromMaster); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while reading back GPIO Analog Manual Mode Input Word values."); + return recoveryAction; + } + } + } + + /* FB SW needs to be handled differently */ + if ((gpioSigType == ADI_ADRV904X_OUT_GPIO_SIG_TYPE_FB_SW_EN) || (gpioSigType == ADI_ADRV904X_OUT_GPIO_SIG_TYPE_FB_SW_EXT_EN)) + { + /* For manual output case, need to read scratch register */ + if (((isDigital == ADI_TRUE) && (gpioMode == GPIO_DIGITAL_MANUAL_OUTPUT_MODE)) || + ((isDigital != ADI_TRUE) && (gpioMode == GPIO_ANALOG_MANUAL_OUTPUT_MODE))) + { + /* Read the scratch register */ + if (signalOffset < 4) + { + channelId = ADRV904X_FORCED_FB_SW_STATE_BITMAP_ORX0; + } + else + { + channelId = ADRV904X_FORCED_FB_SW_STATE_BITMAP_ORX1; + } + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + channelId, + ®Byte); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while read scratch reg FW SW Bitmap."); + return recoveryAction; + } + + if ((signalOffset < 4) && (gpioSigType == ADI_ADRV904X_OUT_GPIO_SIG_TYPE_FB_SW_EXT_EN)) + { + mask = (1 << (signalOffset + 4)); + } + else if ((signalOffset >= 4) && (gpioSigType == ADI_ADRV904X_OUT_GPIO_SIG_TYPE_FB_SW_EN)) + { + mask = (1 << (signalOffset - 4)); + } + else + { + mask = (1 << signalOffset); + } + + if ((regByte & mask) == 0U) + { + *gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_NORMAL_OP; + } + else + { + if ((fromMaster & (1 << gpioPin)) == 0U) + { + *gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_OFF; + } + else + { + *gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_ON; + } + + } + } + else if (((isDigital == ADI_TRUE) && (gpioMode == GPIO_DIGITAL_MANUAL_INPUT_MODE)) || + ((isDigital != ADI_TRUE) && (gpioMode == GPIO_ANALOG_MANUAL_INPUT_MODE))) + { + *gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_HIGH_Z; + } + else + { + *gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_NORMAL_OP; + } + } + else /* For all other signal types */ + { + if (((isDigital == ADI_TRUE) && (gpioMode == GPIO_DIGITAL_MANUAL_OUTPUT_MODE)) || + ((isDigital != ADI_TRUE) && (gpioMode == GPIO_ANALOG_MANUAL_OUTPUT_MODE))) + { + /* Check if bit is set */ + if ((fromMaster & (1 << gpioPin)) != 0U) + { + *gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_ON; + } + else + { + *gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_OFF; + } + + } + else if (((isDigital == ADI_TRUE) && (gpioMode == GPIO_DIGITAL_MANUAL_INPUT_MODE)) || + ((isDigital != ADI_TRUE) && (gpioMode == GPIO_ANALOG_MANUAL_INPUT_MODE))) + { + *gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_HIGH_Z; + } + else + { + *gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_NORMAL_OP; + } + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting the GPIO Pin state."); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioCtrlDbgGpioIsSignalTypeAffectedByAlarms(adi_adrv904x_Device_t* const device, + const adi_adrv904x_OutGpioSigTypes_e gpioSigType, + uint8_t* isAffected) +{ + /* Validate inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, isAffected); + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + /* Set pin state to the value selected in the device profile */ + switch (gpioSigType) + { + case (ADI_ADRV904X_OUT_GPIO_SIG_TYPE_LNA_EN): /* Fallthrough */ + case (ADI_ADRV904X_OUT_GPIO_SIG_TYPE_PA_EN): /* Fallthrough */ + case (ADI_ADRV904X_OUT_GPIO_SIG_TYPE_AUX_GRP0_OUT): /* Fallthrough */ + case (ADI_ADRV904X_OUT_GPIO_SIG_TYPE_AUX_GRP1_OUT): /* Fallthrough */ + *isAffected = 1; + break; + default: + *isAffected = 0; + break; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioCtrlDbgGpioGetPaEnAffectedByAlarms(adi_adrv904x_Device_t* const device, + uint8_t* paEnAffectedByAlarm) +{ + uint32_t i = 0U; + uint8_t regByte = 0U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + /* Validate inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, paEnAffectedByAlarm); + + *paEnAffectedByAlarm = 0; + + for (i = 0; i < ADI_ADRV904X_ALARM_MAX; i++) + { + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (ADRV904X_EA_CURR_AFCTD_PA_EN_TBL_ALARM_0 + i), + ®Byte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while getting item from ADRV904X_EA_CURR_AFCTD_PA_EN_TBL_ALARM table."); + break; + } + + *paEnAffectedByAlarm |= regByte; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioCtrlDbgGpioGetLnaEnAffectedByAlarms(adi_adrv904x_Device_t* const device, + uint8_t* lnaEnAffectedByAlarm) +{ + uint32_t i = 0U; + uint8_t regByte = 0U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + /* Validate inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, lnaEnAffectedByAlarm); + + *lnaEnAffectedByAlarm = 0; + + for (i = 0; i < ADI_ADRV904X_ALARM_MAX; i++) + { + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (ADRV904X_EA_CURR_AFCTD_LNA_EN_TBL_ALARM_0 + i), + ®Byte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while getting item from ADRV904X_EA_CURR_AFCTD_LNA_EN_TBL_ALARM table."); + break; + } + + *lnaEnAffectedByAlarm |= regByte; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RadioCtrlDbgGpioDebugFlagSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_OutGpioSigTypes_e gpioSigType, + const uint8_t signalOffset, + uint8_t flag) +{ + /* Validate inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + //adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + uint8_t regByte = 0U; + uint16_t channelId = ADRV904X_EA_LNA_EN_ALWAYS_OFF; // fix this + + + switch (gpioSigType) + { + case (ADI_ADRV904X_OUT_GPIO_SIG_TYPE_LNA_EN): + channelId = ADRV904X_EA_LNA_EN_OUTPUT_FROZEN; + break; + case (ADI_ADRV904X_OUT_GPIO_SIG_TYPE_PA_EN): + channelId = ADRV904X_EA_PA_EN_OUTPUT_FROZEN; + break; + + case (ADI_ADRV904X_OUT_GPIO_SIG_TYPE_AUX_GRP0_OUT): + channelId = ADRV904X_EA_AUX_GRP0_OUTPUT_FROZEN; + break; + case (ADI_ADRV904X_OUT_GPIO_SIG_TYPE_AUX_GRP1_OUT): + channelId = ADRV904X_EA_AUX_GRP1_OUTPUT_FROZEN; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + gpioSigType, + "Unexpected GPIO signal type."); + return recoveryAction; + } + + /* Get the current value of debug flags */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + channelId, + ®Byte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while getting debug flags."); + return recoveryAction; + } + + if (flag != 0) + { + regByte |= (1 << signalOffset); + } + else + { + + regByte &= ~(1 << signalOffset); + } + + /* Update debug flags */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + channelId, + regByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while getting debug flags."); + return recoveryAction; + } + + return recoveryAction; +} diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_reg_addr_macros.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_reg_addr_macros.c new file mode 100644 index 00000000000..3bf67f57f2c --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_reg_addr_macros.c @@ -0,0 +1,2915 @@ +/** + * This file is automatically generated - DO NOT EDIT + * + * Copyright 2015 - 2022 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ +#include "../../private/include/adrv904x_reg_addr_macros.h" + +const adrv904x_CpuRamMemDump_t adrv904x_CpuRamMemDumpTable[24] = +{ + {0x01000000, 0x50000, 0x1, 0 }, + {0x02000000, 0x50000, 0x2, 0 }, + {0x20000000, 0x40000, 0x3, 0 }, + {0x21000000, 0x40000, 0x4, 0 }, + {0x46A00000, 0x4000, 0x5, 0 }, + {0x4C0A0000, 0x2000, 0x6, 0 }, + {0x60020000, 0x800, 0x7, 0 }, + {0x60120000, 0x800, 0x8, 0 }, + {0x60220000, 0x800, 0x9, 0 }, + {0x60320000, 0x800, 0xA, 0 }, + {0x60420000, 0x800, 0xB, 0 }, + {0x60520000, 0x800, 0xC, 0 }, + {0x60620000, 0x800, 0xD, 0 }, + {0x60720000, 0x800, 0xE, 0 }, + {0x60820000, 0x1000, 0xF, 0 }, + {0x60920000, 0x1000, 0x10, 0 }, + {0x60A20000, 0x1000, 0x11, 0 }, + {0x60B20000, 0x1000, 0x12, 0 }, + {0x60C20000, 0x1000, 0x13, 0 }, + {0x60D20000, 0x1000, 0x14, 0 }, + {0x60E20000, 0x1000, 0x15, 0 }, + {0x60F20000, 0x1000, 0x16, 0 }, + {0x61020000, 0x2000, 0x17, 0 }, + {0x61120000, 0x2000, 0x18, 0 }, +}; +const adrv904x_CpuMemDump_t adrv904x_TelemetryMemDumpTable[1] = +{ + {0x46410000, 0x8000, 32, 0 }, +}; +const adrv904x_CpuMemDump_t adrv904x_CpuMemDumpTable[2855] = +{ + {0x4C008000, 0x4000, 32, 0 }, + {0x4C018000, 0x4000, 32, 0 }, + {0x4C028000, 0x4000, 32, 0 }, + {0x4C038000, 0x4000, 32, 0 }, + {0x4C048000, 0x4000, 32, 0 }, + {0x4C058000, 0x4000, 32, 0 }, + {0x4C068000, 0x4000, 32, 0 }, + {0x4C078000, 0x4000, 32, 0 }, + {0x60090000, 0x2000, 32, 0 }, + {0x600a0000, 0x800, 32, 0 }, + {0x60190000, 0x2000, 32, 0 }, + {0x601a0000, 0x800, 32, 0 }, + {0x60290000, 0x2000, 32, 0 }, + {0x602a0000, 0x800, 32, 0 }, + {0x60390000, 0x2000, 32, 0 }, + {0x603a0000, 0x800, 32, 0 }, + {0x60490000, 0x2000, 32, 0 }, + {0x604a0000, 0x800, 32, 0 }, + {0x60590000, 0x2000, 32, 0 }, + {0x605a0000, 0x800, 32, 0 }, + {0x60690000, 0x2000, 32, 0 }, + {0x606a0000, 0x800, 32, 0 }, + {0x60790000, 0x2000, 32, 0 }, + {0x607a0000, 0x800, 32, 0 }, + {0x60810000, 0x2000, 32, 0 }, + {0x60812000, 0xF00, 32, 0 }, + {0x60910000, 0x2000, 32, 0 }, + {0x60912000, 0xF00, 32, 0 }, + {0x60A10000, 0x2000, 32, 0 }, + {0x60A12000, 0xF00, 32, 0 }, + {0x60B10000, 0x2000, 32, 0 }, + {0x60B12000, 0xF00, 32, 0 }, + {0x60C10000, 0x2000, 32, 0 }, + {0x60C12000, 0xF00, 32, 0 }, + {0x60D10000, 0x2000, 32, 0 }, + {0x60D12000, 0xF00, 32, 0 }, + {0x60E10000, 0x2000, 32, 0 }, + {0x60E12000, 0xF00, 32, 0 }, + {0x60F10000, 0x2000, 32, 0 }, + {0x60F12000, 0xF00, 32, 0 }, + {0x40000000, 24, 32, 0 }, + {0x40010000, 24, 32, 0 }, + {0x40020000, 24, 32, 0 }, + {0x40030000, 24, 32, 0 }, + {0x40040000, 24, 32, 0 }, + {0x40050000, 24, 32, 0 }, + {0x40060000, 24, 32, 0 }, + {0x40070000, 24, 32, 0 }, + {0x40080000, 24, 32, 0 }, + {0x40090000, 24, 32, 0 }, + {0x400A0000, 24, 32, 0 }, + {0x400B0000, 24, 32, 0 }, + {0x400C0000, 24, 32, 0 }, + {0x400D0000, 24, 32, 0 }, + {0x400E0000, 24, 32, 0 }, + {0x400F0000, 24, 32, 0 }, + {0x41000000, 12, 32, 0 }, + {0x41100000, 4, 32, 0 }, + {0x41200000, 288, 32, 0 }, + {0x41500000, 28, 32, 0 }, + {0x41600000, 28, 32, 0 }, + {0x41700000, 28, 32, 0 }, + {0x41800000, 28, 32, 0 }, + {0x43000000, 24, 32, 0 }, + {0x43010000, 24, 32, 0 }, + {0x43020000, 24, 32, 0 }, + {0x43030000, 24, 32, 0 }, + {0x43040000, 24, 32, 0 }, + {0x43050000, 24, 32, 0 }, + {0x43060000, 24, 32, 0 }, + {0x43070000, 24, 32, 0 }, + {0x43080000, 24, 32, 0 }, + {0x43090000, 24, 32, 0 }, + {0x430A0000, 24, 32, 0 }, + {0x430B0000, 24, 32, 0 }, + {0x430C0000, 24, 32, 0 }, + {0x430D0000, 24, 32, 0 }, + {0x430E0000, 24, 32, 0 }, + {0x430F0000, 24, 32, 0 }, + {0x44000000, 12, 32, 0 }, + {0x44100000, 4, 32, 0 }, + {0x44200000, 288, 32, 0 }, + {0x44500000, 28, 32, 0 }, + {0x44600000, 28, 32, 0 }, + {0x44700000, 28, 32, 0 }, + {0x44800000, 28, 32, 0 }, + {0x46000000, 16, 32, 0 }, + {0x46100000, 60, 32, 0 }, + {0x46200000, 60, 32, 0 }, + {0x46300000, 128, 32, 0 }, + {0x46300E00, 4, 32, 0 }, + {0x46300E80, 40, 32, 0 }, + {0x46400000, 108, 32, 0 }, + {0x46500000, 4, 32, 0 }, + {0x46510000, 4, 32, 0 }, + {0x46520000, 4, 32, 0 }, + {0x46530000, 4, 32, 0 }, + {0x46540000, 4, 32, 0 }, + {0x46550000, 4, 32, 0 }, + {0x46560000, 4, 32, 0 }, + {0x46570000, 4, 32, 0 }, + {0x46580000, 4, 32, 0 }, + {0x46590000, 4, 32, 0 }, + {0x465A0000, 4, 32, 0 }, + {0x465B0000, 4, 32, 0 }, + {0x465C0000, 4, 32, 0 }, + {0x465D0000, 4, 32, 0 }, + {0x465E0000, 4, 32, 0 }, + {0x465F0000, 4, 32, 0 }, + {0x46600000, 4, 32, 0 }, + {0x46610000, 4, 32, 0 }, + {0x46620000, 4, 32, 0 }, + {0x46630000, 4, 32, 0 }, + {0x46640000, 4, 32, 0 }, + {0x46650000, 4, 32, 0 }, + {0x46660000, 4, 32, 0 }, + {0x46670000, 4, 32, 0 }, + {0x46680000, 4, 32, 0 }, + {0x46690000, 4, 32, 0 }, + {0x466A0000, 4, 32, 0 }, + {0x466B0000, 4, 32, 0 }, + {0x466C0000, 4, 32, 0 }, + {0x466D0000, 4, 32, 0 }, + {0x466E0000, 4, 32, 0 }, + {0x466F0000, 4, 32, 0 }, + {0x46700000, 96, 32, 0 }, + {0x46800000, 612, 32, 0 }, + {0x46810000, 12, 32, 0 }, + {0x46810100, 4, 32, 0 }, + {0x46B00000, 396, 32, 0 }, + {0x47000000, 18, 8, 0 }, + {0x47000013, 1, 8, 0 }, + {0x47000015, 1, 8, 0 }, + {0x47000017, 10, 8, 0 }, + {0x47000021, 1, 8, 0 }, + {0x47000022, 10, 8, 0 }, + {0x4700003A, 20, 8, 0 }, + {0x4700004F, 9, 8, 0 }, + {0x47000059, 9, 8, 0 }, + {0x47000063, 24, 8, 0 }, + {0x4700007C, 24, 8, 0 }, + {0x47000095, 41, 8, 0 }, + {0x470000C6, 10, 8, 0 }, + {0x470000DF, 20, 8, 0 }, + {0x470000F4, 24, 8, 0 }, + {0x4700010D, 24, 8, 0 }, + {0x47000126, 13, 8, 0 }, + {0x47000134, 13, 8, 0 }, + {0x47000142, 3, 8, 0 }, + {0x47000146, 60, 8, 0 }, + {0x47000183, 4, 8, 0 }, + {0x47000188, 18, 8, 0 }, + {0x4700019A, 13, 8, 0 }, + {0x470001A8, 8, 8, 0 }, + {0x470001B1, 1, 8, 0 }, + {0x470001B3, 53, 8, 0 }, + {0x47000200, 512, 8, 0 }, + {0x47000400, 12, 8, 0 }, + {0x4700040C, 6, 8, 0 }, + {0x47000413, 1, 8, 0 }, + {0x47000415, 2, 8, 0 }, + {0x47000417, 5, 8, 0 }, + {0x4700041C, 16, 8, 0 }, + {0x4700042D, 20, 8, 0 }, + {0x47000450, 23, 8, 0 }, + {0x470004F0, 101, 8, 0 }, + {0x470005C0, 37, 8, 0 }, + {0x470005E5, 72, 8, 0 }, + {0x47000632, 36, 8, 0 }, + {0x47000656, 1, 8, 0 }, + {0x47000657, 5, 8, 0 }, + {0x4700065C, 1, 8, 0 }, + {0x4700065D, 1, 8, 0 }, + {0x4700065E, 410, 8, 0 }, + {0x47000806, 9, 8, 0 }, + {0x47000873, 11, 8, 0 }, + {0x4700087F, 12, 8, 0 }, + {0x4700088B, 1, 8, 0 }, + {0x4700088D, 1, 8, 0 }, + {0x4700088F, 3, 8, 0 }, + {0x47000892, 168, 8, 0 }, + {0x4700093B, 3, 8, 0 }, + {0x4700093F, 120, 8, 0 }, + {0x470009B7, 3, 8, 0 }, + {0x470009BA, 15, 8, 0 }, + {0x470009CA, 1, 8, 0 }, + {0x470009CE, 1, 8, 0 }, + {0x470009D3, 7, 8, 0 }, + {0x47000A27, 24, 8, 0 }, + {0x47000A40, 24, 8, 0 }, + {0x47000A59, 19, 8, 0 }, + {0x47000A6C, 61, 8, 0 }, + {0x47000AA9, 1, 8, 0 }, + {0x47000AAA, 2, 8, 0 }, + {0x47000AAC, 2, 8, 0 }, + {0x47300000, 4, 8, 0 }, + {0x47300004, 36, 8, 0 }, + {0x47300028, 45, 8, 0 }, + {0x47300055, 16, 8, 0 }, + {0x47300065, 3, 8, 0 }, + {0x47300068, 7, 8, 0 }, + {0x4730006F, 5, 8, 0 }, + {0x47300074, 1, 8, 0 }, + {0x47300075, 9, 8, 0 }, + {0x4730007E, 9, 8, 0 }, + {0x47300087, 38, 8, 0 }, + {0x473000AD, 2, 8, 0 }, + {0x473000AF, 3, 8, 0 }, + {0x473000B2, 2, 8, 0 }, + {0x473000B4, 21, 8, 0 }, + {0x47400000, 4, 8, 0 }, + {0x47400004, 36, 8, 0 }, + {0x47400028, 45, 8, 0 }, + {0x47400055, 16, 8, 0 }, + {0x47400065, 3, 8, 0 }, + {0x47400068, 7, 8, 0 }, + {0x4740006F, 5, 8, 0 }, + {0x47400074, 1, 8, 0 }, + {0x47400075, 9, 8, 0 }, + {0x4740007E, 9, 8, 0 }, + {0x47400087, 38, 8, 0 }, + {0x474000AD, 2, 8, 0 }, + {0x474000AF, 3, 8, 0 }, + {0x474000B2, 2, 8, 0 }, + {0x474000B4, 21, 8, 0 }, + {0x47500000, 13, 8, 0 }, + {0x48000000, 44, 32, 0 }, + {0x48000030, 36, 32, 0 }, + {0x480000B4, 36, 32, 0 }, + {0x48000138, 48, 32, 0 }, + {0x480001C8, 32, 32, 0 }, + {0x48000248, 32, 32, 0 }, + {0x480002C8, 32, 32, 0 }, + {0x48000348, 32, 32, 0 }, + {0x480003C8, 32, 32, 0 }, + {0x48000448, 32, 32, 0 }, + {0x480004C8, 32, 32, 0 }, + {0x48000548, 40, 32, 0 }, + {0x480005D0, 32, 32, 0 }, + {0x480005F0, 36, 32, 0 }, + {0x48000620, 144, 32, 0 }, + {0x480006B0, 12, 32, 0 }, + {0x480006C0, 4, 32, 0 }, + {0x480006D0, 8, 32, 0 }, + {0x480006E0, 32, 32, 0 }, + {0x48000700, 2820, 32, 0 }, + {0x48001300, 1664, 32, 0 }, + {0x48001A00, 900, 32, 0 }, + {0x48003000, 4, 32, 0 }, + {0x48010000, 516, 32, 0 }, + {0x48010304, 40, 32, 0 }, + {0x48010330, 76, 32, 0 }, + {0x48020000, 516, 32, 0 }, + {0x48020304, 40, 32, 0 }, + {0x48020330, 76, 32, 0 }, + {0x48030000, 512, 32, 0 }, + {0x48030300, 48, 32, 0 }, + {0x48030430, 12, 32, 0 }, + {0x48030440, 44, 32, 0 }, + {0x48030470, 40, 32, 0 }, + {0x480304A0, 8, 32, 0 }, + {0x480304AC, 4, 32, 0 }, + {0x48040000, 512, 32, 0 }, + {0x48040300, 48, 32, 0 }, + {0x48040430, 12, 32, 0 }, + {0x48040440, 44, 32, 0 }, + {0x48040470, 40, 32, 0 }, + {0x480404A0, 8, 32, 0 }, + {0x480404AC, 4, 32, 0 }, + {0x48050000, 512, 32, 0 }, + {0x48050300, 48, 32, 0 }, + {0x48050430, 12, 32, 0 }, + {0x48050440, 44, 32, 0 }, + {0x48050470, 40, 32, 0 }, + {0x480504A0, 8, 32, 0 }, + {0x480504AC, 4, 32, 0 }, + {0x48060000, 4, 8, 0 }, + {0x48060004, 36, 8, 0 }, + {0x48060028, 45, 8, 0 }, + {0x48060055, 16, 8, 0 }, + {0x48060065, 3, 8, 0 }, + {0x48060068, 7, 8, 0 }, + {0x4806006F, 5, 8, 0 }, + {0x48060074, 1, 8, 0 }, + {0x48060075, 9, 8, 0 }, + {0x4806007E, 9, 8, 0 }, + {0x48060087, 38, 8, 0 }, + {0x480600AD, 2, 8, 0 }, + {0x480600AF, 3, 8, 0 }, + {0x480600B2, 2, 8, 0 }, + {0x480600B4, 21, 8, 0 }, + {0x48070000, 64, 8, 0 }, + {0x48070800, 64, 8, 0 }, + {0x48071000, 64, 8, 0 }, + {0x48071800, 64, 8, 0 }, + {0x48072000, 64, 8, 0 }, + {0x48072800, 64, 8, 0 }, + {0x48073000, 64, 8, 0 }, + {0x48073800, 64, 8, 0 }, + {0x48074000, 64, 8, 0 }, + {0x48078000, 8, 8, 0 }, + {0x480780FF, 1, 8, 0 }, + {0x48080000, 90, 8, 0 }, + {0x48080070, 144, 8, 0 }, + {0x48080800, 90, 8, 0 }, + {0x48080870, 144, 8, 0 }, + {0x48081000, 90, 8, 0 }, + {0x48081070, 144, 8, 0 }, + {0x48081800, 90, 8, 0 }, + {0x48081870, 144, 8, 0 }, + {0x48082000, 90, 8, 0 }, + {0x48082070, 144, 8, 0 }, + {0x48082800, 90, 8, 0 }, + {0x48082870, 144, 8, 0 }, + {0x48083000, 90, 8, 0 }, + {0x48083070, 144, 8, 0 }, + {0x48083800, 90, 8, 0 }, + {0x48083870, 144, 8, 0 }, + {0x48084000, 90, 8, 0 }, + {0x48084070, 144, 8, 0 }, + {0x48088000, 36, 8, 0 }, + {0x480880FF, 1, 8, 0 }, + {0x48090000, 4, 8, 0 }, + {0x48090004, 36, 8, 0 }, + {0x48090028, 45, 8, 0 }, + {0x48090055, 16, 8, 0 }, + {0x48090065, 3, 8, 0 }, + {0x48090068, 7, 8, 0 }, + {0x4809006F, 5, 8, 0 }, + {0x48090074, 1, 8, 0 }, + {0x48090075, 9, 8, 0 }, + {0x4809007E, 9, 8, 0 }, + {0x48090087, 38, 8, 0 }, + {0x480900AD, 2, 8, 0 }, + {0x480900AF, 3, 8, 0 }, + {0x480900B2, 2, 8, 0 }, + {0x480900B4, 21, 8, 0 }, + {0x4C000000, 100, 32, 0 }, + {0x4C004000, 28, 32, 0 }, + {0x4C005000, 40, 32, 0 }, + {0x4C010000, 100, 32, 0 }, + {0x4C014000, 28, 32, 0 }, + {0x4C015000, 40, 32, 0 }, + {0x4C020000, 100, 32, 0 }, + {0x4C024000, 28, 32, 0 }, + {0x4C025000, 40, 32, 0 }, + {0x4C030000, 100, 32, 0 }, + {0x4C034000, 28, 32, 0 }, + {0x4C035000, 40, 32, 0 }, + {0x4C040000, 100, 32, 0 }, + {0x4C044000, 28, 32, 0 }, + {0x4C045000, 40, 32, 0 }, + {0x4C050000, 100, 32, 0 }, + {0x4C054000, 28, 32, 0 }, + {0x4C055000, 40, 32, 0 }, + {0x4C060000, 100, 32, 0 }, + {0x4C064000, 28, 32, 0 }, + {0x4C065000, 40, 32, 0 }, + {0x4C070000, 100, 32, 0 }, + {0x4C074000, 28, 32, 0 }, + {0x4C075000, 40, 32, 0 }, + {0x4C080000, 396, 32, 0 }, + {0x4C090000, 648, 32, 0 }, + {0x4D000000, 28, 32, 0 }, + {0x4D100000, 28, 32, 0 }, + {0x4D200000, 2336, 32, 0 }, + {0x60022000, 396, 32, 0 }, + {0x60023000, 56, 32, 0 }, + {0x60024000, 4, 32, 0 }, + {0x60025000, 4, 32, 0 }, + {0x60026000, 4, 32, 0 }, + {0x60027000, 4, 32, 0 }, + {0x60028000, 4, 32, 0 }, + {0x60029000, 4, 32, 0 }, + {0x6002A000, 4, 32, 0 }, + {0x6002B000, 4, 32, 0 }, + {0x60030000, 132, 32, 0 }, + {0x60030084, 8, 32, 0 }, + {0x6003008C, 4, 32, 0 }, + {0x60030090, 40, 32, 0 }, + {0x600300B8, 20, 32, 0 }, + {0x600300D8, 8, 32, 0 }, + {0x600300E0, 12, 32, 0 }, + {0x600300F8, 8, 32, 0 }, + {0x60040000, 48, 32, 0 }, + {0x60040030, 12, 32, 0 }, + {0x60040040, 56, 32, 0 }, + {0x6004008C, 12, 32, 0 }, + {0x6004009C, 100, 32, 0 }, + {0x60040100, 12, 32, 0 }, + {0x6004010C, 12, 32, 0 }, + {0x60040120, 188, 32, 0 }, + {0x600401F0, 8, 32, 0 }, + {0x600401F8, 4, 32, 0 }, + {0x60050000, 40, 32, 0 }, + {0x6005002C, 8, 32, 0 }, + {0x60050034, 24, 32, 0 }, + {0x60060000, 24, 32, 0 }, + {0x60060020, 16, 32, 0 }, + {0x60060030, 32, 32, 0 }, + {0x60060050, 8, 32, 0 }, + {0x60060058, 40, 32, 0 }, + {0x60060080, 8, 32, 0 }, + {0x60060090, 16, 32, 0 }, + {0x600600A0, 12, 32, 0 }, + {0x60070000, 24, 32, 0 }, + {0x60070020, 16, 32, 0 }, + {0x60070030, 32, 32, 0 }, + {0x60070050, 8, 32, 0 }, + {0x60070058, 40, 32, 0 }, + {0x60070080, 8, 32, 0 }, + {0x60070090, 16, 32, 0 }, + {0x600700A0, 12, 32, 0 }, + {0x600B0000, 7, 8, 0 }, + {0x600B000E, 14, 8, 0 }, + {0x600B0026, 27, 8, 0 }, + {0x600B0070, 11, 8, 0 }, + {0x600B007B, 1, 8, 0 }, + {0x600C0000, 64, 8, 0 }, + {0x600C0050, 16, 8, 0 }, + {0x600C0080, 64, 8, 0 }, + {0x600C00C0, 16, 8, 0 }, + {0x600D0000, 848, 32, 0 }, + {0x600D0700, 56, 32, 0 }, + {0x600D0800, 848, 32, 0 }, + {0x600D0D00, 696, 32, 0 }, + {0x600E0000, 32, 32, 0 }, + {0x600E0100, 2628, 32, 0 }, + {0x600E0C00, 388, 32, 0 }, + {0x600E0E00, 352, 32, 0 }, + {0x600E0F60, 20, 32, 0 }, + {0x600E0F80, 100, 32, 0 }, + {0x600E0FF0, 4, 32, 0 }, + {0x600E0FF4, 8, 32, 0 }, + {0x60122000, 396, 32, 0 }, + {0x60123000, 56, 32, 0 }, + {0x60124000, 4, 32, 0 }, + {0x60125000, 4, 32, 0 }, + {0x60126000, 4, 32, 0 }, + {0x60127000, 4, 32, 0 }, + {0x60128000, 4, 32, 0 }, + {0x60129000, 4, 32, 0 }, + {0x6012A000, 4, 32, 0 }, + {0x6012B000, 4, 32, 0 }, + {0x60130000, 132, 32, 0 }, + {0x60130084, 8, 32, 0 }, + {0x6013008C, 4, 32, 0 }, + {0x60130090, 40, 32, 0 }, + {0x601300B8, 20, 32, 0 }, + {0x601300D8, 8, 32, 0 }, + {0x601300E0, 12, 32, 0 }, + {0x601300F8, 8, 32, 0 }, + {0x60140000, 48, 32, 0 }, + {0x60140030, 12, 32, 0 }, + {0x60140040, 56, 32, 0 }, + {0x6014008C, 12, 32, 0 }, + {0x6014009C, 100, 32, 0 }, + {0x60140100, 12, 32, 0 }, + {0x6014010C, 12, 32, 0 }, + {0x60140120, 188, 32, 0 }, + {0x601401F0, 8, 32, 0 }, + {0x601401F8, 4, 32, 0 }, + {0x60150000, 40, 32, 0 }, + {0x6015002C, 8, 32, 0 }, + {0x60150034, 24, 32, 0 }, + {0x60160000, 24, 32, 0 }, + {0x60160020, 16, 32, 0 }, + {0x60160030, 32, 32, 0 }, + {0x60160050, 8, 32, 0 }, + {0x60160058, 40, 32, 0 }, + {0x60160080, 8, 32, 0 }, + {0x60160090, 16, 32, 0 }, + {0x601600A0, 12, 32, 0 }, + {0x60170000, 24, 32, 0 }, + {0x60170020, 16, 32, 0 }, + {0x60170030, 32, 32, 0 }, + {0x60170050, 8, 32, 0 }, + {0x60170058, 40, 32, 0 }, + {0x60170080, 8, 32, 0 }, + {0x60170090, 16, 32, 0 }, + {0x601700A0, 12, 32, 0 }, + {0x601B0000, 7, 8, 0 }, + {0x601B000E, 14, 8, 0 }, + {0x601B0026, 27, 8, 0 }, + {0x601B0070, 11, 8, 0 }, + {0x601B007B, 1, 8, 0 }, + {0x601C0000, 64, 8, 0 }, + {0x601C0050, 16, 8, 0 }, + {0x601C0080, 64, 8, 0 }, + {0x601C00C0, 16, 8, 0 }, + {0x601D0000, 848, 32, 0 }, + {0x601D0700, 56, 32, 0 }, + {0x601D0800, 848, 32, 0 }, + {0x601D0D00, 696, 32, 0 }, + {0x601E0000, 32, 32, 0 }, + {0x601E0100, 2628, 32, 0 }, + {0x601E0C00, 388, 32, 0 }, + {0x601E0E00, 352, 32, 0 }, + {0x601E0F60, 20, 32, 0 }, + {0x601E0F80, 100, 32, 0 }, + {0x601E0FF0, 4, 32, 0 }, + {0x601E0FF4, 8, 32, 0 }, + {0x60222000, 396, 32, 0 }, + {0x60223000, 56, 32, 0 }, + {0x60224000, 4, 32, 0 }, + {0x60225000, 4, 32, 0 }, + {0x60226000, 4, 32, 0 }, + {0x60227000, 4, 32, 0 }, + {0x60228000, 4, 32, 0 }, + {0x60229000, 4, 32, 0 }, + {0x6022A000, 4, 32, 0 }, + {0x6022B000, 4, 32, 0 }, + {0x60230000, 132, 32, 0 }, + {0x60230084, 8, 32, 0 }, + {0x6023008C, 4, 32, 0 }, + {0x60230090, 40, 32, 0 }, + {0x602300B8, 20, 32, 0 }, + {0x602300D8, 8, 32, 0 }, + {0x602300E0, 12, 32, 0 }, + {0x602300F8, 8, 32, 0 }, + {0x60240000, 48, 32, 0 }, + {0x60240030, 12, 32, 0 }, + {0x60240040, 56, 32, 0 }, + {0x6024008C, 12, 32, 0 }, + {0x6024009C, 100, 32, 0 }, + {0x60240100, 12, 32, 0 }, + {0x6024010C, 12, 32, 0 }, + {0x60240120, 188, 32, 0 }, + {0x602401F0, 8, 32, 0 }, + {0x602401F8, 4, 32, 0 }, + {0x60250000, 40, 32, 0 }, + {0x6025002C, 8, 32, 0 }, + {0x60250034, 24, 32, 0 }, + {0x60260000, 24, 32, 0 }, + {0x60260020, 16, 32, 0 }, + {0x60260030, 32, 32, 0 }, + {0x60260050, 8, 32, 0 }, + {0x60260058, 40, 32, 0 }, + {0x60260080, 8, 32, 0 }, + {0x60260090, 16, 32, 0 }, + {0x602600A0, 12, 32, 0 }, + {0x60270000, 24, 32, 0 }, + {0x60270020, 16, 32, 0 }, + {0x60270030, 32, 32, 0 }, + {0x60270050, 8, 32, 0 }, + {0x60270058, 40, 32, 0 }, + {0x60270080, 8, 32, 0 }, + {0x60270090, 16, 32, 0 }, + {0x602700A0, 12, 32, 0 }, + {0x602B0000, 7, 8, 0 }, + {0x602B000E, 14, 8, 0 }, + {0x602B0026, 27, 8, 0 }, + {0x602B0070, 11, 8, 0 }, + {0x602B007B, 1, 8, 0 }, + {0x602C0000, 64, 8, 0 }, + {0x602C0050, 16, 8, 0 }, + {0x602C0080, 64, 8, 0 }, + {0x602C00C0, 16, 8, 0 }, + {0x602D0000, 848, 32, 0 }, + {0x602D0700, 56, 32, 0 }, + {0x602D0800, 848, 32, 0 }, + {0x602D0D00, 696, 32, 0 }, + {0x602E0000, 32, 32, 0 }, + {0x602E0100, 2628, 32, 0 }, + {0x602E0C00, 388, 32, 0 }, + {0x602E0E00, 352, 32, 0 }, + {0x602E0F60, 20, 32, 0 }, + {0x602E0F80, 100, 32, 0 }, + {0x602E0FF0, 4, 32, 0 }, + {0x602E0FF4, 8, 32, 0 }, + {0x60322000, 396, 32, 0 }, + {0x60323000, 56, 32, 0 }, + {0x60324000, 4, 32, 0 }, + {0x60325000, 4, 32, 0 }, + {0x60326000, 4, 32, 0 }, + {0x60327000, 4, 32, 0 }, + {0x60328000, 4, 32, 0 }, + {0x60329000, 4, 32, 0 }, + {0x6032A000, 4, 32, 0 }, + {0x6032B000, 4, 32, 0 }, + {0x60330000, 132, 32, 0 }, + {0x60330084, 8, 32, 0 }, + {0x6033008C, 4, 32, 0 }, + {0x60330090, 40, 32, 0 }, + {0x603300B8, 20, 32, 0 }, + {0x603300D8, 8, 32, 0 }, + {0x603300E0, 12, 32, 0 }, + {0x603300F8, 8, 32, 0 }, + {0x60340000, 48, 32, 0 }, + {0x60340030, 12, 32, 0 }, + {0x60340040, 56, 32, 0 }, + {0x6034008C, 12, 32, 0 }, + {0x6034009C, 100, 32, 0 }, + {0x60340100, 12, 32, 0 }, + {0x6034010C, 12, 32, 0 }, + {0x60340120, 188, 32, 0 }, + {0x603401F0, 8, 32, 0 }, + {0x603401F8, 4, 32, 0 }, + {0x60350000, 40, 32, 0 }, + {0x6035002C, 8, 32, 0 }, + {0x60350034, 24, 32, 0 }, + {0x60360000, 24, 32, 0 }, + {0x60360020, 16, 32, 0 }, + {0x60360030, 32, 32, 0 }, + {0x60360050, 8, 32, 0 }, + {0x60360058, 40, 32, 0 }, + {0x60360080, 8, 32, 0 }, + {0x60360090, 16, 32, 0 }, + {0x603600A0, 12, 32, 0 }, + {0x60370000, 24, 32, 0 }, + {0x60370020, 16, 32, 0 }, + {0x60370030, 32, 32, 0 }, + {0x60370050, 8, 32, 0 }, + {0x60370058, 40, 32, 0 }, + {0x60370080, 8, 32, 0 }, + {0x60370090, 16, 32, 0 }, + {0x603700A0, 12, 32, 0 }, + {0x603B0000, 7, 8, 0 }, + {0x603B000E, 14, 8, 0 }, + {0x603B0026, 27, 8, 0 }, + {0x603B0070, 11, 8, 0 }, + {0x603B007B, 1, 8, 0 }, + {0x603C0000, 64, 8, 0 }, + {0x603C0050, 16, 8, 0 }, + {0x603C0080, 64, 8, 0 }, + {0x603C00C0, 16, 8, 0 }, + {0x603D0000, 848, 32, 0 }, + {0x603D0700, 56, 32, 0 }, + {0x603D0800, 848, 32, 0 }, + {0x603D0D00, 696, 32, 0 }, + {0x603E0000, 32, 32, 0 }, + {0x603E0100, 2628, 32, 0 }, + {0x603E0C00, 388, 32, 0 }, + {0x603E0E00, 352, 32, 0 }, + {0x603E0F60, 20, 32, 0 }, + {0x603E0F80, 100, 32, 0 }, + {0x603E0FF0, 4, 32, 0 }, + {0x603E0FF4, 8, 32, 0 }, + {0x60422000, 396, 32, 0 }, + {0x60423000, 56, 32, 0 }, + {0x60424000, 4, 32, 0 }, + {0x60425000, 4, 32, 0 }, + {0x60426000, 4, 32, 0 }, + {0x60427000, 4, 32, 0 }, + {0x60428000, 4, 32, 0 }, + {0x60429000, 4, 32, 0 }, + {0x6042A000, 4, 32, 0 }, + {0x6042B000, 4, 32, 0 }, + {0x60430000, 132, 32, 0 }, + {0x60430084, 8, 32, 0 }, + {0x6043008C, 4, 32, 0 }, + {0x60430090, 40, 32, 0 }, + {0x604300B8, 20, 32, 0 }, + {0x604300D8, 8, 32, 0 }, + {0x604300E0, 12, 32, 0 }, + {0x604300F8, 8, 32, 0 }, + {0x60440000, 48, 32, 0 }, + {0x60440030, 12, 32, 0 }, + {0x60440040, 56, 32, 0 }, + {0x6044008C, 12, 32, 0 }, + {0x6044009C, 100, 32, 0 }, + {0x60440100, 12, 32, 0 }, + {0x6044010C, 12, 32, 0 }, + {0x60440120, 188, 32, 0 }, + {0x604401F0, 8, 32, 0 }, + {0x604401F8, 4, 32, 0 }, + {0x60450000, 40, 32, 0 }, + {0x6045002C, 8, 32, 0 }, + {0x60450034, 24, 32, 0 }, + {0x60460000, 24, 32, 0 }, + {0x60460020, 16, 32, 0 }, + {0x60460030, 32, 32, 0 }, + {0x60460050, 8, 32, 0 }, + {0x60460058, 40, 32, 0 }, + {0x60460080, 8, 32, 0 }, + {0x60460090, 16, 32, 0 }, + {0x604600A0, 12, 32, 0 }, + {0x60470000, 24, 32, 0 }, + {0x60470020, 16, 32, 0 }, + {0x60470030, 32, 32, 0 }, + {0x60470050, 8, 32, 0 }, + {0x60470058, 40, 32, 0 }, + {0x60470080, 8, 32, 0 }, + {0x60470090, 16, 32, 0 }, + {0x604700A0, 12, 32, 0 }, + {0x604B0000, 7, 8, 0 }, + {0x604B000E, 14, 8, 0 }, + {0x604B0026, 27, 8, 0 }, + {0x604B0070, 11, 8, 0 }, + {0x604B007B, 1, 8, 0 }, + {0x604C0000, 64, 8, 0 }, + {0x604C0050, 16, 8, 0 }, + {0x604C0080, 64, 8, 0 }, + {0x604C00C0, 16, 8, 0 }, + {0x604D0000, 848, 32, 0 }, + {0x604D0700, 56, 32, 0 }, + {0x604D0800, 848, 32, 0 }, + {0x604D0D00, 696, 32, 0 }, + {0x604E0000, 32, 32, 0 }, + {0x604E0100, 2628, 32, 0 }, + {0x604E0C00, 388, 32, 0 }, + {0x604E0E00, 352, 32, 0 }, + {0x604E0F60, 20, 32, 0 }, + {0x604E0F80, 100, 32, 0 }, + {0x604E0FF0, 4, 32, 0 }, + {0x604E0FF4, 8, 32, 0 }, + {0x60522000, 396, 32, 0 }, + {0x60523000, 56, 32, 0 }, + {0x60524000, 4, 32, 0 }, + {0x60525000, 4, 32, 0 }, + {0x60526000, 4, 32, 0 }, + {0x60527000, 4, 32, 0 }, + {0x60528000, 4, 32, 0 }, + {0x60529000, 4, 32, 0 }, + {0x6052A000, 4, 32, 0 }, + {0x6052B000, 4, 32, 0 }, + {0x60530000, 132, 32, 0 }, + {0x60530084, 8, 32, 0 }, + {0x6053008C, 4, 32, 0 }, + {0x60530090, 40, 32, 0 }, + {0x605300B8, 20, 32, 0 }, + {0x605300D8, 8, 32, 0 }, + {0x605300E0, 12, 32, 0 }, + {0x605300F8, 8, 32, 0 }, + {0x60540000, 48, 32, 0 }, + {0x60540030, 12, 32, 0 }, + {0x60540040, 56, 32, 0 }, + {0x6054008C, 12, 32, 0 }, + {0x6054009C, 100, 32, 0 }, + {0x60540100, 12, 32, 0 }, + {0x6054010C, 12, 32, 0 }, + {0x60540120, 188, 32, 0 }, + {0x605401F0, 8, 32, 0 }, + {0x605401F8, 4, 32, 0 }, + {0x60550000, 40, 32, 0 }, + {0x6055002C, 8, 32, 0 }, + {0x60550034, 24, 32, 0 }, + {0x60560000, 24, 32, 0 }, + {0x60560020, 16, 32, 0 }, + {0x60560030, 32, 32, 0 }, + {0x60560050, 8, 32, 0 }, + {0x60560058, 40, 32, 0 }, + {0x60560080, 8, 32, 0 }, + {0x60560090, 16, 32, 0 }, + {0x605600A0, 12, 32, 0 }, + {0x60570000, 24, 32, 0 }, + {0x60570020, 16, 32, 0 }, + {0x60570030, 32, 32, 0 }, + {0x60570050, 8, 32, 0 }, + {0x60570058, 40, 32, 0 }, + {0x60570080, 8, 32, 0 }, + {0x60570090, 16, 32, 0 }, + {0x605700A0, 12, 32, 0 }, + {0x605B0000, 7, 8, 0 }, + {0x605B000E, 14, 8, 0 }, + {0x605B0026, 27, 8, 0 }, + {0x605B0070, 11, 8, 0 }, + {0x605B007B, 1, 8, 0 }, + {0x605C0000, 64, 8, 0 }, + {0x605C0050, 16, 8, 0 }, + {0x605C0080, 64, 8, 0 }, + {0x605C00C0, 16, 8, 0 }, + {0x605D0000, 848, 32, 0 }, + {0x605D0700, 56, 32, 0 }, + {0x605D0800, 848, 32, 0 }, + {0x605D0D00, 696, 32, 0 }, + {0x605E0000, 32, 32, 0 }, + {0x605E0100, 2628, 32, 0 }, + {0x605E0C00, 388, 32, 0 }, + {0x605E0E00, 352, 32, 0 }, + {0x605E0F60, 20, 32, 0 }, + {0x605E0F80, 100, 32, 0 }, + {0x605E0FF0, 4, 32, 0 }, + {0x605E0FF4, 8, 32, 0 }, + {0x60622000, 396, 32, 0 }, + {0x60623000, 56, 32, 0 }, + {0x60624000, 4, 32, 0 }, + {0x60625000, 4, 32, 0 }, + {0x60626000, 4, 32, 0 }, + {0x60627000, 4, 32, 0 }, + {0x60628000, 4, 32, 0 }, + {0x60629000, 4, 32, 0 }, + {0x6062A000, 4, 32, 0 }, + {0x6062B000, 4, 32, 0 }, + {0x60630000, 132, 32, 0 }, + {0x60630084, 8, 32, 0 }, + {0x6063008C, 4, 32, 0 }, + {0x60630090, 40, 32, 0 }, + {0x606300B8, 20, 32, 0 }, + {0x606300D8, 8, 32, 0 }, + {0x606300E0, 12, 32, 0 }, + {0x606300F8, 8, 32, 0 }, + {0x60640000, 48, 32, 0 }, + {0x60640030, 12, 32, 0 }, + {0x60640040, 56, 32, 0 }, + {0x6064008C, 12, 32, 0 }, + {0x6064009C, 100, 32, 0 }, + {0x60640100, 12, 32, 0 }, + {0x6064010C, 12, 32, 0 }, + {0x60640120, 188, 32, 0 }, + {0x606401F0, 8, 32, 0 }, + {0x606401F8, 4, 32, 0 }, + {0x60650000, 40, 32, 0 }, + {0x6065002C, 8, 32, 0 }, + {0x60650034, 24, 32, 0 }, + {0x60660000, 24, 32, 0 }, + {0x60660020, 16, 32, 0 }, + {0x60660030, 32, 32, 0 }, + {0x60660050, 8, 32, 0 }, + {0x60660058, 40, 32, 0 }, + {0x60660080, 8, 32, 0 }, + {0x60660090, 16, 32, 0 }, + {0x606600A0, 12, 32, 0 }, + {0x60670000, 24, 32, 0 }, + {0x60670020, 16, 32, 0 }, + {0x60670030, 32, 32, 0 }, + {0x60670050, 8, 32, 0 }, + {0x60670058, 40, 32, 0 }, + {0x60670080, 8, 32, 0 }, + {0x60670090, 16, 32, 0 }, + {0x606700A0, 12, 32, 0 }, + {0x606B0000, 7, 8, 0 }, + {0x606B000E, 14, 8, 0 }, + {0x606B0026, 27, 8, 0 }, + {0x606B0070, 11, 8, 0 }, + {0x606B007B, 1, 8, 0 }, + {0x606C0000, 64, 8, 0 }, + {0x606C0050, 16, 8, 0 }, + {0x606C0080, 64, 8, 0 }, + {0x606C00C0, 16, 8, 0 }, + {0x606D0000, 848, 32, 0 }, + {0x606D0700, 56, 32, 0 }, + {0x606D0800, 848, 32, 0 }, + {0x606D0D00, 696, 32, 0 }, + {0x606E0000, 32, 32, 0 }, + {0x606E0100, 2628, 32, 0 }, + {0x606E0C00, 388, 32, 0 }, + {0x606E0E00, 352, 32, 0 }, + {0x606E0F60, 20, 32, 0 }, + {0x606E0F80, 100, 32, 0 }, + {0x606E0FF0, 4, 32, 0 }, + {0x606E0FF4, 8, 32, 0 }, + {0x60722000, 396, 32, 0 }, + {0x60723000, 56, 32, 0 }, + {0x60724000, 4, 32, 0 }, + {0x60725000, 4, 32, 0 }, + {0x60726000, 4, 32, 0 }, + {0x60727000, 4, 32, 0 }, + {0x60728000, 4, 32, 0 }, + {0x60729000, 4, 32, 0 }, + {0x6072A000, 4, 32, 0 }, + {0x6072B000, 4, 32, 0 }, + {0x60730000, 132, 32, 0 }, + {0x60730084, 8, 32, 0 }, + {0x6073008C, 4, 32, 0 }, + {0x60730090, 40, 32, 0 }, + {0x607300B8, 20, 32, 0 }, + {0x607300D8, 8, 32, 0 }, + {0x607300E0, 12, 32, 0 }, + {0x607300F8, 8, 32, 0 }, + {0x60740000, 48, 32, 0 }, + {0x60740030, 12, 32, 0 }, + {0x60740040, 56, 32, 0 }, + {0x6074008C, 12, 32, 0 }, + {0x6074009C, 100, 32, 0 }, + {0x60740100, 12, 32, 0 }, + {0x6074010C, 12, 32, 0 }, + {0x60740120, 188, 32, 0 }, + {0x607401F0, 8, 32, 0 }, + {0x607401F8, 4, 32, 0 }, + {0x60750000, 40, 32, 0 }, + {0x6075002C, 8, 32, 0 }, + {0x60750034, 24, 32, 0 }, + {0x60760000, 24, 32, 0 }, + {0x60760020, 16, 32, 0 }, + {0x60760030, 32, 32, 0 }, + {0x60760050, 8, 32, 0 }, + {0x60760058, 40, 32, 0 }, + {0x60760080, 8, 32, 0 }, + {0x60760090, 16, 32, 0 }, + {0x607600A0, 12, 32, 0 }, + {0x60770000, 24, 32, 0 }, + {0x60770020, 16, 32, 0 }, + {0x60770030, 32, 32, 0 }, + {0x60770050, 8, 32, 0 }, + {0x60770058, 40, 32, 0 }, + {0x60770080, 8, 32, 0 }, + {0x60770090, 16, 32, 0 }, + {0x607700A0, 12, 32, 0 }, + {0x607B0000, 7, 8, 0 }, + {0x607B000E, 14, 8, 0 }, + {0x607B0026, 27, 8, 0 }, + {0x607B0070, 11, 8, 0 }, + {0x607B007B, 1, 8, 0 }, + {0x607C0000, 64, 8, 0 }, + {0x607C0050, 16, 8, 0 }, + {0x607C0080, 64, 8, 0 }, + {0x607C00C0, 16, 8, 0 }, + {0x607D0000, 848, 32, 0 }, + {0x607D0700, 56, 32, 0 }, + {0x607D0800, 848, 32, 0 }, + {0x607D0D00, 696, 32, 0 }, + {0x607E0000, 32, 32, 0 }, + {0x607E0100, 2628, 32, 0 }, + {0x607E0C00, 388, 32, 0 }, + {0x607E0E00, 352, 32, 0 }, + {0x607E0F60, 20, 32, 0 }, + {0x607E0F80, 100, 32, 0 }, + {0x607E0FF0, 4, 32, 0 }, + {0x607E0FF4, 8, 32, 0 }, + {0x60822000, 396, 32, 0 }, + {0x60823000, 56, 32, 0 }, + {0x60824000, 4, 32, 0 }, + {0x60825000, 4, 32, 0 }, + {0x60826000, 4, 32, 0 }, + {0x60827000, 4, 32, 0 }, + {0x60828000, 4, 32, 0 }, + {0x60829000, 4, 32, 0 }, + {0x6082A000, 4, 32, 0 }, + {0x6082B000, 4, 32, 0 }, + {0x60830004, 20, 32, 0 }, + {0x60830018, 8, 32, 0 }, + {0x60830024, 4, 32, 0 }, + {0x60830038, 8, 32, 0 }, + {0x60830040, 24, 32, 0 }, + {0x60830058, 4, 32, 0 }, + {0x6083005C, 16, 32, 0 }, + {0x6083006C, 12, 32, 0 }, + {0x60830078, 4, 32, 0 }, + {0x60830080, 4, 32, 0 }, + {0x60830084, 8, 32, 0 }, + {0x60838000, 16, 32, 0 }, + {0x60838010, 4, 32, 0 }, + {0x60838014, 196, 32, 0 }, + {0x608380D8, 172, 32, 0 }, + {0x60838190, 4, 32, 0 }, + {0x608381A8, 4, 32, 0 }, + {0x608381B0, 4, 32, 0 }, + {0x608381B4, 8, 32, 0 }, + {0x60840000, 44, 32, 0 }, + {0x60840030, 32, 32, 0 }, + {0x60840050, 4, 32, 0 }, + {0x60840060, 4, 32, 0 }, + {0x60840064, 12, 32, 0 }, + {0x60840070, 12, 32, 0 }, + {0x6084007C, 16, 32, 0 }, + {0x60848000, 4, 32, 0 }, + {0x60848004, 40, 32, 0 }, + {0x6084802C, 20, 32, 0 }, + {0x60848040, 20, 32, 0 }, + {0x60848054, 20, 32, 0 }, + {0x60848068, 4, 32, 0 }, + {0x6084806C, 44, 32, 0 }, + {0x60850000, 4, 32, 0 }, + {0x60850004, 40, 32, 0 }, + {0x6085002C, 20, 32, 0 }, + {0x60850040, 20, 32, 0 }, + {0x60850054, 20, 32, 0 }, + {0x60850068, 4, 32, 0 }, + {0x6085006C, 44, 32, 0 }, + {0x60858000, 24, 32, 0 }, + {0x60858018, 4, 32, 0 }, + {0x6085802C, 4, 32, 0 }, + {0x60858030, 4, 32, 0 }, + {0x60858034, 4, 32, 0 }, + {0x60858038, 12, 32, 0 }, + {0x60860000, 20, 32, 0 }, + {0x60860028, 16, 32, 0 }, + {0x60870000, 256, 32, 0 }, + {0x60870120, 224, 32, 0 }, + {0x60878000, 16, 8, 0 }, + {0x60878010, 27, 8, 0 }, + {0x60878030, 6, 8, 0 }, + {0x60878040, 21, 8, 0 }, + {0x60880000, 6, 8, 0 }, + {0x60880006, 48, 8, 0 }, + {0x60880036, 10, 8, 0 }, + {0x60880040, 13, 8, 0 }, + {0x6088004D, 11, 8, 0 }, + {0x60880058, 1, 8, 0 }, + {0x60888000, 5, 8, 0 }, + {0x60888010, 4, 8, 0 }, + {0x60888020, 10, 8, 0 }, + {0x60888030, 10, 8, 0 }, + {0x60888040, 2, 8, 0 }, + {0x60888050, 3, 8, 0 }, + {0x60890000, 16, 32, 0 }, + {0x6089002C, 20, 32, 0 }, + {0x6089005C, 196, 32, 0 }, + {0x60891FFC, 4, 32, 0 }, + {0x60892000, 100, 32, 0 }, + {0x60892084, 32, 32, 0 }, + {0x60892134, 144, 32, 0 }, + {0x608921E4, 44, 32, 0 }, + {0x6089222C, 4, 32, 0 }, + {0x6089224C, 4, 32, 0 }, + {0x60892400, 524, 32, 0 }, + {0x608927FC, 4, 32, 0 }, + {0x60892800, 100, 32, 0 }, + {0x60892884, 32, 32, 0 }, + {0x60892934, 144, 32, 0 }, + {0x608929E4, 44, 32, 0 }, + {0x60892A2C, 4, 32, 0 }, + {0x60892A4C, 4, 32, 0 }, + {0x60892C00, 524, 32, 0 }, + {0x60892FFC, 4, 32, 0 }, + {0x60894000, 44, 8, 0 }, + {0x608943FF, 1, 8, 0 }, + {0x60894400, 44, 8, 0 }, + {0x608947FF, 1, 8, 0 }, + {0x60896400, 91, 8, 0 }, + {0x608967F2, 14, 8, 0 }, + {0x60896800, 263, 8, 0 }, + {0x60896BFF, 1, 8, 0 }, + {0x608B0000, 32, 32, 0 }, + {0x608B0100, 2628, 32, 0 }, + {0x608B0C00, 396, 32, 0 }, + {0x608B0E00, 320, 32, 0 }, + {0x608B0F40, 100, 32, 0 }, + {0x608B0FB0, 4, 32, 0 }, + {0x608B0FB4, 8, 32, 0 }, + {0x608B0FBC, 4, 32, 0 }, + {0x608C0000, 60, 32, 0 }, + {0x608C0080, 12, 32, 0 }, + {0x608C0100, 12, 32, 0 }, + {0x608C0110, 16, 32, 0 }, + {0x608C0120, 40, 32, 0 }, + {0x608C0148, 40, 32, 0 }, + {0x608C0170, 12, 32, 0 }, + {0x608D0000, 192, 32, 0 }, + {0x608E0000, 116, 32, 0 }, + {0x608E4000, 12800, 32, 0 }, + {0x608E8000, 40, 32, 0 }, + {0x608E80A0, 260, 32, 0 }, + {0x608E8200, 156, 32, 0 }, + {0x608E8300, 92, 32, 0 }, + {0x608EB000, 4, 32, 0 }, + {0x608EE000, 1022, 16, 0 }, + {0x60922000, 396, 32, 0 }, + {0x60923000, 56, 32, 0 }, + {0x60924000, 4, 32, 0 }, + {0x60925000, 4, 32, 0 }, + {0x60926000, 4, 32, 0 }, + {0x60927000, 4, 32, 0 }, + {0x60928000, 4, 32, 0 }, + {0x60929000, 4, 32, 0 }, + {0x6092A000, 4, 32, 0 }, + {0x6092B000, 4, 32, 0 }, + {0x60930004, 20, 32, 0 }, + {0x60930018, 8, 32, 0 }, + {0x60930024, 4, 32, 0 }, + {0x60930038, 8, 32, 0 }, + {0x60930040, 24, 32, 0 }, + {0x60930058, 4, 32, 0 }, + {0x6093005C, 16, 32, 0 }, + {0x6093006C, 12, 32, 0 }, + {0x60930078, 4, 32, 0 }, + {0x60930080, 4, 32, 0 }, + {0x60930084, 8, 32, 0 }, + {0x60938000, 16, 32, 0 }, + {0x60938010, 4, 32, 0 }, + {0x60938014, 196, 32, 0 }, + {0x609380D8, 172, 32, 0 }, + {0x60938190, 4, 32, 0 }, + {0x609381A8, 4, 32, 0 }, + {0x609381B0, 4, 32, 0 }, + {0x609381B4, 8, 32, 0 }, + {0x60940000, 44, 32, 0 }, + {0x60940030, 32, 32, 0 }, + {0x60940050, 4, 32, 0 }, + {0x60940060, 4, 32, 0 }, + {0x60940064, 12, 32, 0 }, + {0x60940070, 12, 32, 0 }, + {0x6094007C, 16, 32, 0 }, + {0x60948000, 4, 32, 0 }, + {0x60948004, 40, 32, 0 }, + {0x6094802C, 20, 32, 0 }, + {0x60948040, 20, 32, 0 }, + {0x60948054, 20, 32, 0 }, + {0x60948068, 4, 32, 0 }, + {0x6094806C, 44, 32, 0 }, + {0x60950000, 4, 32, 0 }, + {0x60950004, 40, 32, 0 }, + {0x6095002C, 20, 32, 0 }, + {0x60950040, 20, 32, 0 }, + {0x60950054, 20, 32, 0 }, + {0x60950068, 4, 32, 0 }, + {0x6095006C, 44, 32, 0 }, + {0x60958000, 24, 32, 0 }, + {0x60958018, 4, 32, 0 }, + {0x6095802C, 4, 32, 0 }, + {0x60958030, 4, 32, 0 }, + {0x60958034, 4, 32, 0 }, + {0x60958038, 12, 32, 0 }, + {0x60960000, 20, 32, 0 }, + {0x60960028, 16, 32, 0 }, + {0x60970000, 256, 32, 0 }, + {0x60970120, 224, 32, 0 }, + {0x60978000, 16, 8, 0 }, + {0x60978010, 27, 8, 0 }, + {0x60978030, 6, 8, 0 }, + {0x60978040, 21, 8, 0 }, + {0x60980000, 6, 8, 0 }, + {0x60980006, 48, 8, 0 }, + {0x60980036, 10, 8, 0 }, + {0x60980040, 13, 8, 0 }, + {0x6098004D, 11, 8, 0 }, + {0x60980058, 1, 8, 0 }, + {0x60988000, 5, 8, 0 }, + {0x60988010, 4, 8, 0 }, + {0x60988020, 10, 8, 0 }, + {0x60988030, 10, 8, 0 }, + {0x60988040, 2, 8, 0 }, + {0x60988050, 3, 8, 0 }, + {0x60990000, 16, 32, 0 }, + {0x6099002C, 20, 32, 0 }, + {0x6099005C, 196, 32, 0 }, + {0x60991FFC, 4, 32, 0 }, + {0x60992000, 100, 32, 0 }, + {0x60992084, 32, 32, 0 }, + {0x60992134, 144, 32, 0 }, + {0x609921E4, 44, 32, 0 }, + {0x6099222C, 4, 32, 0 }, + {0x6099224C, 4, 32, 0 }, + {0x60992400, 524, 32, 0 }, + {0x609927FC, 4, 32, 0 }, + {0x60992800, 100, 32, 0 }, + {0x60992884, 32, 32, 0 }, + {0x60992934, 144, 32, 0 }, + {0x609929E4, 44, 32, 0 }, + {0x60992A2C, 4, 32, 0 }, + {0x60992A4C, 4, 32, 0 }, + {0x60992C00, 524, 32, 0 }, + {0x60992FFC, 4, 32, 0 }, + {0x60994000, 44, 8, 0 }, + {0x609943FF, 1, 8, 0 }, + {0x60994400, 44, 8, 0 }, + {0x609947FF, 1, 8, 0 }, + {0x60996400, 91, 8, 0 }, + {0x609967F2, 14, 8, 0 }, + {0x60996800, 263, 8, 0 }, + {0x60996BFF, 1, 8, 0 }, + {0x609B0000, 32, 32, 0 }, + {0x609B0100, 2628, 32, 0 }, + {0x609B0C00, 396, 32, 0 }, + {0x609B0E00, 320, 32, 0 }, + {0x609B0F40, 100, 32, 0 }, + {0x609B0FB0, 4, 32, 0 }, + {0x609B0FB4, 8, 32, 0 }, + {0x609B0FBC, 4, 32, 0 }, + {0x609C0000, 60, 32, 0 }, + {0x609C0080, 12, 32, 0 }, + {0x609C0100, 12, 32, 0 }, + {0x609C0110, 16, 32, 0 }, + {0x609C0120, 40, 32, 0 }, + {0x609C0148, 40, 32, 0 }, + {0x609C0170, 12, 32, 0 }, + {0x609D0000, 192, 32, 0 }, + {0x609E0000, 116, 32, 0 }, + {0x609E4000, 12800, 32, 0 }, + {0x609E8000, 40, 32, 0 }, + {0x609E80A0, 260, 32, 0 }, + {0x609E8200, 156, 32, 0 }, + {0x609E8300, 92, 32, 0 }, + {0x609EB000, 4, 32, 0 }, + {0x609EE000, 1022, 16, 0 }, + {0x60A22000, 396, 32, 0 }, + {0x60A23000, 56, 32, 0 }, + {0x60A24000, 4, 32, 0 }, + {0x60A25000, 4, 32, 0 }, + {0x60A26000, 4, 32, 0 }, + {0x60A27000, 4, 32, 0 }, + {0x60A28000, 4, 32, 0 }, + {0x60A29000, 4, 32, 0 }, + {0x60A2A000, 4, 32, 0 }, + {0x60A2B000, 4, 32, 0 }, + {0x60A30004, 20, 32, 0 }, + {0x60A30018, 8, 32, 0 }, + {0x60A30024, 4, 32, 0 }, + {0x60A30038, 8, 32, 0 }, + {0x60A30040, 24, 32, 0 }, + {0x60A30058, 4, 32, 0 }, + {0x60A3005C, 16, 32, 0 }, + {0x60A3006C, 12, 32, 0 }, + {0x60A30078, 4, 32, 0 }, + {0x60A30080, 4, 32, 0 }, + {0x60A30084, 8, 32, 0 }, + {0x60A38000, 16, 32, 0 }, + {0x60A38010, 4, 32, 0 }, + {0x60A38014, 196, 32, 0 }, + {0x60A380D8, 172, 32, 0 }, + {0x60A38190, 4, 32, 0 }, + {0x60A381A8, 4, 32, 0 }, + {0x60A381B0, 4, 32, 0 }, + {0x60A381B4, 8, 32, 0 }, + {0x60A40000, 44, 32, 0 }, + {0x60A40030, 32, 32, 0 }, + {0x60A40050, 4, 32, 0 }, + {0x60A40060, 4, 32, 0 }, + {0x60A40064, 12, 32, 0 }, + {0x60A40070, 12, 32, 0 }, + {0x60A4007C, 16, 32, 0 }, + {0x60A48000, 4, 32, 0 }, + {0x60A48004, 40, 32, 0 }, + {0x60A4802C, 20, 32, 0 }, + {0x60A48040, 20, 32, 0 }, + {0x60A48054, 20, 32, 0 }, + {0x60A48068, 4, 32, 0 }, + {0x60A4806C, 44, 32, 0 }, + {0x60A50000, 4, 32, 0 }, + {0x60A50004, 40, 32, 0 }, + {0x60A5002C, 20, 32, 0 }, + {0x60A50040, 20, 32, 0 }, + {0x60A50054, 20, 32, 0 }, + {0x60A50068, 4, 32, 0 }, + {0x60A5006C, 44, 32, 0 }, + {0x60A58000, 24, 32, 0 }, + {0x60A58018, 4, 32, 0 }, + {0x60A5802C, 4, 32, 0 }, + {0x60A58030, 4, 32, 0 }, + {0x60A58034, 4, 32, 0 }, + {0x60A58038, 12, 32, 0 }, + {0x60A60000, 20, 32, 0 }, + {0x60A60028, 16, 32, 0 }, + {0x60A70000, 256, 32, 0 }, + {0x60A70120, 224, 32, 0 }, + {0x60A78000, 16, 8, 0 }, + {0x60A78010, 27, 8, 0 }, + {0x60A78030, 6, 8, 0 }, + {0x60A78040, 21, 8, 0 }, + {0x60A80000, 6, 8, 0 }, + {0x60A80006, 48, 8, 0 }, + {0x60A80036, 10, 8, 0 }, + {0x60A80040, 13, 8, 0 }, + {0x60A8004D, 11, 8, 0 }, + {0x60A80058, 1, 8, 0 }, + {0x60A88000, 5, 8, 0 }, + {0x60A88010, 4, 8, 0 }, + {0x60A88020, 10, 8, 0 }, + {0x60A88030, 10, 8, 0 }, + {0x60A88040, 2, 8, 0 }, + {0x60A88050, 3, 8, 0 }, + {0x60A90000, 16, 32, 0 }, + {0x60A9002C, 20, 32, 0 }, + {0x60A9005C, 196, 32, 0 }, + {0x60A91FFC, 4, 32, 0 }, + {0x60A92000, 100, 32, 0 }, + {0x60A92084, 32, 32, 0 }, + {0x60A92134, 144, 32, 0 }, + {0x60A921E4, 44, 32, 0 }, + {0x60A9222C, 4, 32, 0 }, + {0x60A9224C, 4, 32, 0 }, + {0x60A92400, 524, 32, 0 }, + {0x60A927FC, 4, 32, 0 }, + {0x60A92800, 100, 32, 0 }, + {0x60A92884, 32, 32, 0 }, + {0x60A92934, 144, 32, 0 }, + {0x60A929E4, 44, 32, 0 }, + {0x60A92A2C, 4, 32, 0 }, + {0x60A92A4C, 4, 32, 0 }, + {0x60A92C00, 524, 32, 0 }, + {0x60A92FFC, 4, 32, 0 }, + {0x60A94000, 44, 8, 0 }, + {0x60A943FF, 1, 8, 0 }, + {0x60A94400, 44, 8, 0 }, + {0x60A947FF, 1, 8, 0 }, + {0x60A96400, 91, 8, 0 }, + {0x60A967F2, 14, 8, 0 }, + {0x60A96800, 263, 8, 0 }, + {0x60A96BFF, 1, 8, 0 }, + {0x60AB0000, 32, 32, 0 }, + {0x60AB0100, 2628, 32, 0 }, + {0x60AB0C00, 396, 32, 0 }, + {0x60AB0E00, 320, 32, 0 }, + {0x60AB0F40, 100, 32, 0 }, + {0x60AB0FB0, 4, 32, 0 }, + {0x60AB0FB4, 8, 32, 0 }, + {0x60AB0FBC, 4, 32, 0 }, + {0x60AC0000, 60, 32, 0 }, + {0x60AC0080, 12, 32, 0 }, + {0x60AC0100, 12, 32, 0 }, + {0x60AC0110, 16, 32, 0 }, + {0x60AC0120, 40, 32, 0 }, + {0x60AC0148, 40, 32, 0 }, + {0x60AC0170, 12, 32, 0 }, + {0x60AD0000, 192, 32, 0 }, + {0x60AE0000, 116, 32, 0 }, + {0x60AE4000, 12800, 32, 0 }, + {0x60AE8000, 40, 32, 0 }, + {0x60AE80A0, 260, 32, 0 }, + {0x60AE8200, 156, 32, 0 }, + {0x60AE8300, 92, 32, 0 }, + {0x60AEB000, 4, 32, 0 }, + {0x60AEE000, 1022, 16, 0 }, + {0x60B22000, 396, 32, 0 }, + {0x60B23000, 56, 32, 0 }, + {0x60B24000, 4, 32, 0 }, + {0x60B25000, 4, 32, 0 }, + {0x60B26000, 4, 32, 0 }, + {0x60B27000, 4, 32, 0 }, + {0x60B28000, 4, 32, 0 }, + {0x60B29000, 4, 32, 0 }, + {0x60B2A000, 4, 32, 0 }, + {0x60B2B000, 4, 32, 0 }, + {0x60B30004, 20, 32, 0 }, + {0x60B30018, 8, 32, 0 }, + {0x60B30024, 4, 32, 0 }, + {0x60B30038, 8, 32, 0 }, + {0x60B30040, 24, 32, 0 }, + {0x60B30058, 4, 32, 0 }, + {0x60B3005C, 16, 32, 0 }, + {0x60B3006C, 12, 32, 0 }, + {0x60B30078, 4, 32, 0 }, + {0x60B30080, 4, 32, 0 }, + {0x60B30084, 8, 32, 0 }, + {0x60B38000, 16, 32, 0 }, + {0x60B38010, 4, 32, 0 }, + {0x60B38014, 196, 32, 0 }, + {0x60B380D8, 172, 32, 0 }, + {0x60B38190, 4, 32, 0 }, + {0x60B381A8, 4, 32, 0 }, + {0x60B381B0, 4, 32, 0 }, + {0x60B381B4, 8, 32, 0 }, + {0x60B40000, 44, 32, 0 }, + {0x60B40030, 32, 32, 0 }, + {0x60B40050, 4, 32, 0 }, + {0x60B40060, 4, 32, 0 }, + {0x60B40064, 12, 32, 0 }, + {0x60B40070, 12, 32, 0 }, + {0x60B4007C, 16, 32, 0 }, + {0x60B48000, 4, 32, 0 }, + {0x60B48004, 40, 32, 0 }, + {0x60B4802C, 20, 32, 0 }, + {0x60B48040, 20, 32, 0 }, + {0x60B48054, 20, 32, 0 }, + {0x60B48068, 4, 32, 0 }, + {0x60B4806C, 44, 32, 0 }, + {0x60B50000, 4, 32, 0 }, + {0x60B50004, 40, 32, 0 }, + {0x60B5002C, 20, 32, 0 }, + {0x60B50040, 20, 32, 0 }, + {0x60B50054, 20, 32, 0 }, + {0x60B50068, 4, 32, 0 }, + {0x60B5006C, 44, 32, 0 }, + {0x60B58000, 24, 32, 0 }, + {0x60B58018, 4, 32, 0 }, + {0x60B5802C, 4, 32, 0 }, + {0x60B58030, 4, 32, 0 }, + {0x60B58034, 4, 32, 0 }, + {0x60B58038, 12, 32, 0 }, + {0x60B60000, 20, 32, 0 }, + {0x60B60028, 16, 32, 0 }, + {0x60B70000, 256, 32, 0 }, + {0x60B70120, 224, 32, 0 }, + {0x60B78000, 16, 8, 0 }, + {0x60B78010, 27, 8, 0 }, + {0x60B78030, 6, 8, 0 }, + {0x60B78040, 21, 8, 0 }, + {0x60B80000, 6, 8, 0 }, + {0x60B80006, 48, 8, 0 }, + {0x60B80036, 10, 8, 0 }, + {0x60B80040, 13, 8, 0 }, + {0x60B8004D, 11, 8, 0 }, + {0x60B80058, 1, 8, 0 }, + {0x60B88000, 5, 8, 0 }, + {0x60B88010, 4, 8, 0 }, + {0x60B88020, 10, 8, 0 }, + {0x60B88030, 10, 8, 0 }, + {0x60B88040, 2, 8, 0 }, + {0x60B88050, 3, 8, 0 }, + {0x60B90000, 16, 32, 0 }, + {0x60B9002C, 20, 32, 0 }, + {0x60B9005C, 196, 32, 0 }, + {0x60B91FFC, 4, 32, 0 }, + {0x60B92000, 100, 32, 0 }, + {0x60B92084, 32, 32, 0 }, + {0x60B92134, 144, 32, 0 }, + {0x60B921E4, 44, 32, 0 }, + {0x60B9222C, 4, 32, 0 }, + {0x60B9224C, 4, 32, 0 }, + {0x60B92400, 524, 32, 0 }, + {0x60B927FC, 4, 32, 0 }, + {0x60B92800, 100, 32, 0 }, + {0x60B92884, 32, 32, 0 }, + {0x60B92934, 144, 32, 0 }, + {0x60B929E4, 44, 32, 0 }, + {0x60B92A2C, 4, 32, 0 }, + {0x60B92A4C, 4, 32, 0 }, + {0x60B92C00, 524, 32, 0 }, + {0x60B92FFC, 4, 32, 0 }, + {0x60B94000, 44, 8, 0 }, + {0x60B943FF, 1, 8, 0 }, + {0x60B94400, 44, 8, 0 }, + {0x60B947FF, 1, 8, 0 }, + {0x60B96400, 91, 8, 0 }, + {0x60B967F2, 14, 8, 0 }, + {0x60B96800, 263, 8, 0 }, + {0x60B96BFF, 1, 8, 0 }, + {0x60BB0000, 32, 32, 0 }, + {0x60BB0100, 2628, 32, 0 }, + {0x60BB0C00, 396, 32, 0 }, + {0x60BB0E00, 320, 32, 0 }, + {0x60BB0F40, 100, 32, 0 }, + {0x60BB0FB0, 4, 32, 0 }, + {0x60BB0FB4, 8, 32, 0 }, + {0x60BB0FBC, 4, 32, 0 }, + {0x60BC0000, 60, 32, 0 }, + {0x60BC0080, 12, 32, 0 }, + {0x60BC0100, 12, 32, 0 }, + {0x60BC0110, 16, 32, 0 }, + {0x60BC0120, 40, 32, 0 }, + {0x60BC0148, 40, 32, 0 }, + {0x60BC0170, 12, 32, 0 }, + {0x60BD0000, 192, 32, 0 }, + {0x60BE0000, 116, 32, 0 }, + {0x60BE4000, 12800, 32, 0 }, + {0x60BE8000, 40, 32, 0 }, + {0x60BE80A0, 260, 32, 0 }, + {0x60BE8200, 156, 32, 0 }, + {0x60BE8300, 92, 32, 0 }, + {0x60BEB000, 4, 32, 0 }, + {0x60BEE000, 1022, 16, 0 }, + {0x60C22000, 396, 32, 0 }, + {0x60C23000, 56, 32, 0 }, + {0x60C24000, 4, 32, 0 }, + {0x60C25000, 4, 32, 0 }, + {0x60C26000, 4, 32, 0 }, + {0x60C27000, 4, 32, 0 }, + {0x60C28000, 4, 32, 0 }, + {0x60C29000, 4, 32, 0 }, + {0x60C2A000, 4, 32, 0 }, + {0x60C2B000, 4, 32, 0 }, + {0x60C30004, 20, 32, 0 }, + {0x60C30018, 8, 32, 0 }, + {0x60C30024, 4, 32, 0 }, + {0x60C30038, 8, 32, 0 }, + {0x60C30040, 24, 32, 0 }, + {0x60C30058, 4, 32, 0 }, + {0x60C3005C, 16, 32, 0 }, + {0x60C3006C, 12, 32, 0 }, + {0x60C30078, 4, 32, 0 }, + {0x60C30080, 4, 32, 0 }, + {0x60C30084, 8, 32, 0 }, + {0x60C38000, 16, 32, 0 }, + {0x60C38010, 4, 32, 0 }, + {0x60C38014, 196, 32, 0 }, + {0x60C380D8, 172, 32, 0 }, + {0x60C38190, 4, 32, 0 }, + {0x60C381A8, 4, 32, 0 }, + {0x60C381B0, 4, 32, 0 }, + {0x60C381B4, 8, 32, 0 }, + {0x60C40000, 44, 32, 0 }, + {0x60C40030, 32, 32, 0 }, + {0x60C40050, 4, 32, 0 }, + {0x60C40060, 4, 32, 0 }, + {0x60C40064, 12, 32, 0 }, + {0x60C40070, 12, 32, 0 }, + {0x60C4007C, 16, 32, 0 }, + {0x60C48000, 4, 32, 0 }, + {0x60C48004, 40, 32, 0 }, + {0x60C4802C, 20, 32, 0 }, + {0x60C48040, 20, 32, 0 }, + {0x60C48054, 20, 32, 0 }, + {0x60C48068, 4, 32, 0 }, + {0x60C4806C, 44, 32, 0 }, + {0x60C50000, 4, 32, 0 }, + {0x60C50004, 40, 32, 0 }, + {0x60C5002C, 20, 32, 0 }, + {0x60C50040, 20, 32, 0 }, + {0x60C50054, 20, 32, 0 }, + {0x60C50068, 4, 32, 0 }, + {0x60C5006C, 44, 32, 0 }, + {0x60C58000, 24, 32, 0 }, + {0x60C58018, 4, 32, 0 }, + {0x60C5802C, 4, 32, 0 }, + {0x60C58030, 4, 32, 0 }, + {0x60C58034, 4, 32, 0 }, + {0x60C58038, 12, 32, 0 }, + {0x60C60000, 20, 32, 0 }, + {0x60C60028, 16, 32, 0 }, + {0x60C70000, 256, 32, 0 }, + {0x60C70120, 224, 32, 0 }, + {0x60C78000, 16, 8, 0 }, + {0x60C78010, 27, 8, 0 }, + {0x60C78030, 6, 8, 0 }, + {0x60C78040, 21, 8, 0 }, + {0x60C80000, 6, 8, 0 }, + {0x60C80006, 48, 8, 0 }, + {0x60C80036, 10, 8, 0 }, + {0x60C80040, 13, 8, 0 }, + {0x60C8004D, 11, 8, 0 }, + {0x60C80058, 1, 8, 0 }, + {0x60C88000, 5, 8, 0 }, + {0x60C88010, 4, 8, 0 }, + {0x60C88020, 10, 8, 0 }, + {0x60C88030, 10, 8, 0 }, + {0x60C88040, 2, 8, 0 }, + {0x60C88050, 3, 8, 0 }, + {0x60C90000, 16, 32, 0 }, + {0x60C9002C, 20, 32, 0 }, + {0x60C9005C, 196, 32, 0 }, + {0x60C91FFC, 4, 32, 0 }, + {0x60C92000, 100, 32, 0 }, + {0x60C92084, 32, 32, 0 }, + {0x60C92134, 144, 32, 0 }, + {0x60C921E4, 44, 32, 0 }, + {0x60C9222C, 4, 32, 0 }, + {0x60C9224C, 4, 32, 0 }, + {0x60C92400, 524, 32, 0 }, + {0x60C927FC, 4, 32, 0 }, + {0x60C92800, 100, 32, 0 }, + {0x60C92884, 32, 32, 0 }, + {0x60C92934, 144, 32, 0 }, + {0x60C929E4, 44, 32, 0 }, + {0x60C92A2C, 4, 32, 0 }, + {0x60C92A4C, 4, 32, 0 }, + {0x60C92C00, 524, 32, 0 }, + {0x60C92FFC, 4, 32, 0 }, + {0x60C94000, 44, 8, 0 }, + {0x60C943FF, 1, 8, 0 }, + {0x60C94400, 44, 8, 0 }, + {0x60C947FF, 1, 8, 0 }, + {0x60C96400, 91, 8, 0 }, + {0x60C967F2, 14, 8, 0 }, + {0x60C96800, 263, 8, 0 }, + {0x60C96BFF, 1, 8, 0 }, + {0x60CB0000, 32, 32, 0 }, + {0x60CB0100, 2628, 32, 0 }, + {0x60CB0C00, 396, 32, 0 }, + {0x60CB0E00, 320, 32, 0 }, + {0x60CB0F40, 100, 32, 0 }, + {0x60CB0FB0, 4, 32, 0 }, + {0x60CB0FB4, 8, 32, 0 }, + {0x60CB0FBC, 4, 32, 0 }, + {0x60CC0000, 60, 32, 0 }, + {0x60CC0080, 12, 32, 0 }, + {0x60CC0100, 12, 32, 0 }, + {0x60CC0110, 16, 32, 0 }, + {0x60CC0120, 40, 32, 0 }, + {0x60CC0148, 40, 32, 0 }, + {0x60CC0170, 12, 32, 0 }, + {0x60CD0000, 192, 32, 0 }, + {0x60CE0000, 116, 32, 0 }, + {0x60CE4000, 12800, 32, 0 }, + {0x60CE8000, 40, 32, 0 }, + {0x60CE80A0, 260, 32, 0 }, + {0x60CE8200, 156, 32, 0 }, + {0x60CE8300, 92, 32, 0 }, + {0x60CEB000, 4, 32, 0 }, + {0x60CEE000, 1022, 16, 0 }, + {0x60D22000, 396, 32, 0 }, + {0x60D23000, 56, 32, 0 }, + {0x60D24000, 4, 32, 0 }, + {0x60D25000, 4, 32, 0 }, + {0x60D26000, 4, 32, 0 }, + {0x60D27000, 4, 32, 0 }, + {0x60D28000, 4, 32, 0 }, + {0x60D29000, 4, 32, 0 }, + {0x60D2A000, 4, 32, 0 }, + {0x60D2B000, 4, 32, 0 }, + {0x60D30004, 20, 32, 0 }, + {0x60D30018, 8, 32, 0 }, + {0x60D30024, 4, 32, 0 }, + {0x60D30038, 8, 32, 0 }, + {0x60D30040, 24, 32, 0 }, + {0x60D30058, 4, 32, 0 }, + {0x60D3005C, 16, 32, 0 }, + {0x60D3006C, 12, 32, 0 }, + {0x60D30078, 4, 32, 0 }, + {0x60D30080, 4, 32, 0 }, + {0x60D30084, 8, 32, 0 }, + {0x60D38000, 16, 32, 0 }, + {0x60D38010, 4, 32, 0 }, + {0x60D38014, 196, 32, 0 }, + {0x60D380D8, 172, 32, 0 }, + {0x60D38190, 4, 32, 0 }, + {0x60D381A8, 4, 32, 0 }, + {0x60D381B0, 4, 32, 0 }, + {0x60D381B4, 8, 32, 0 }, + {0x60D40000, 44, 32, 0 }, + {0x60D40030, 32, 32, 0 }, + {0x60D40050, 4, 32, 0 }, + {0x60D40060, 4, 32, 0 }, + {0x60D40064, 12, 32, 0 }, + {0x60D40070, 12, 32, 0 }, + {0x60D4007C, 16, 32, 0 }, + {0x60D48000, 4, 32, 0 }, + {0x60D48004, 40, 32, 0 }, + {0x60D4802C, 20, 32, 0 }, + {0x60D48040, 20, 32, 0 }, + {0x60D48054, 20, 32, 0 }, + {0x60D48068, 4, 32, 0 }, + {0x60D4806C, 44, 32, 0 }, + {0x60D50000, 4, 32, 0 }, + {0x60D50004, 40, 32, 0 }, + {0x60D5002C, 20, 32, 0 }, + {0x60D50040, 20, 32, 0 }, + {0x60D50054, 20, 32, 0 }, + {0x60D50068, 4, 32, 0 }, + {0x60D5006C, 44, 32, 0 }, + {0x60D58000, 24, 32, 0 }, + {0x60D58018, 4, 32, 0 }, + {0x60D5802C, 4, 32, 0 }, + {0x60D58030, 4, 32, 0 }, + {0x60D58034, 4, 32, 0 }, + {0x60D58038, 12, 32, 0 }, + {0x60D60000, 20, 32, 0 }, + {0x60D60028, 16, 32, 0 }, + {0x60D70000, 256, 32, 0 }, + {0x60D70120, 224, 32, 0 }, + {0x60D78000, 16, 8, 0 }, + {0x60D78010, 27, 8, 0 }, + {0x60D78030, 6, 8, 0 }, + {0x60D78040, 21, 8, 0 }, + {0x60D80000, 6, 8, 0 }, + {0x60D80006, 48, 8, 0 }, + {0x60D80036, 10, 8, 0 }, + {0x60D80040, 13, 8, 0 }, + {0x60D8004D, 11, 8, 0 }, + {0x60D80058, 1, 8, 0 }, + {0x60D88000, 5, 8, 0 }, + {0x60D88010, 4, 8, 0 }, + {0x60D88020, 10, 8, 0 }, + {0x60D88030, 10, 8, 0 }, + {0x60D88040, 2, 8, 0 }, + {0x60D88050, 3, 8, 0 }, + {0x60D90000, 16, 32, 0 }, + {0x60D9002C, 20, 32, 0 }, + {0x60D9005C, 196, 32, 0 }, + {0x60D91FFC, 4, 32, 0 }, + {0x60D92000, 100, 32, 0 }, + {0x60D92084, 32, 32, 0 }, + {0x60D92134, 144, 32, 0 }, + {0x60D921E4, 44, 32, 0 }, + {0x60D9222C, 4, 32, 0 }, + {0x60D9224C, 4, 32, 0 }, + {0x60D92400, 524, 32, 0 }, + {0x60D927FC, 4, 32, 0 }, + {0x60D92800, 100, 32, 0 }, + {0x60D92884, 32, 32, 0 }, + {0x60D92934, 144, 32, 0 }, + {0x60D929E4, 44, 32, 0 }, + {0x60D92A2C, 4, 32, 0 }, + {0x60D92A4C, 4, 32, 0 }, + {0x60D92C00, 524, 32, 0 }, + {0x60D92FFC, 4, 32, 0 }, + {0x60D94000, 44, 8, 0 }, + {0x60D943FF, 1, 8, 0 }, + {0x60D94400, 44, 8, 0 }, + {0x60D947FF, 1, 8, 0 }, + {0x60D96400, 91, 8, 0 }, + {0x60D967F2, 14, 8, 0 }, + {0x60D96800, 263, 8, 0 }, + {0x60D96BFF, 1, 8, 0 }, + {0x60DB0000, 32, 32, 0 }, + {0x60DB0100, 2628, 32, 0 }, + {0x60DB0C00, 396, 32, 0 }, + {0x60DB0E00, 320, 32, 0 }, + {0x60DB0F40, 100, 32, 0 }, + {0x60DB0FB0, 4, 32, 0 }, + {0x60DB0FB4, 8, 32, 0 }, + {0x60DB0FBC, 4, 32, 0 }, + {0x60DC0000, 60, 32, 0 }, + {0x60DC0080, 12, 32, 0 }, + {0x60DC0100, 12, 32, 0 }, + {0x60DC0110, 16, 32, 0 }, + {0x60DC0120, 40, 32, 0 }, + {0x60DC0148, 40, 32, 0 }, + {0x60DC0170, 12, 32, 0 }, + {0x60DD0000, 192, 32, 0 }, + {0x60DE0000, 116, 32, 0 }, + {0x60DE4000, 12800, 32, 0 }, + {0x60DE8000, 40, 32, 0 }, + {0x60DE80A0, 260, 32, 0 }, + {0x60DE8200, 156, 32, 0 }, + {0x60DE8300, 92, 32, 0 }, + {0x60DEB000, 4, 32, 0 }, + {0x60DEE000, 1022, 16, 0 }, + {0x60E22000, 396, 32, 0 }, + {0x60E23000, 56, 32, 0 }, + {0x60E24000, 4, 32, 0 }, + {0x60E25000, 4, 32, 0 }, + {0x60E26000, 4, 32, 0 }, + {0x60E27000, 4, 32, 0 }, + {0x60E28000, 4, 32, 0 }, + {0x60E29000, 4, 32, 0 }, + {0x60E2A000, 4, 32, 0 }, + {0x60E2B000, 4, 32, 0 }, + {0x60E30004, 20, 32, 0 }, + {0x60E30018, 8, 32, 0 }, + {0x60E30024, 4, 32, 0 }, + {0x60E30038, 8, 32, 0 }, + {0x60E30040, 24, 32, 0 }, + {0x60E30058, 4, 32, 0 }, + {0x60E3005C, 16, 32, 0 }, + {0x60E3006C, 12, 32, 0 }, + {0x60E30078, 4, 32, 0 }, + {0x60E30080, 4, 32, 0 }, + {0x60E30084, 8, 32, 0 }, + {0x60E38000, 16, 32, 0 }, + {0x60E38010, 4, 32, 0 }, + {0x60E38014, 196, 32, 0 }, + {0x60E380D8, 172, 32, 0 }, + {0x60E38190, 4, 32, 0 }, + {0x60E381A8, 4, 32, 0 }, + {0x60E381B0, 4, 32, 0 }, + {0x60E381B4, 8, 32, 0 }, + {0x60E40000, 44, 32, 0 }, + {0x60E40030, 32, 32, 0 }, + {0x60E40050, 4, 32, 0 }, + {0x60E40060, 4, 32, 0 }, + {0x60E40064, 12, 32, 0 }, + {0x60E40070, 12, 32, 0 }, + {0x60E4007C, 16, 32, 0 }, + {0x60E48000, 4, 32, 0 }, + {0x60E48004, 40, 32, 0 }, + {0x60E4802C, 20, 32, 0 }, + {0x60E48040, 20, 32, 0 }, + {0x60E48054, 20, 32, 0 }, + {0x60E48068, 4, 32, 0 }, + {0x60E4806C, 44, 32, 0 }, + {0x60E50000, 4, 32, 0 }, + {0x60E50004, 40, 32, 0 }, + {0x60E5002C, 20, 32, 0 }, + {0x60E50040, 20, 32, 0 }, + {0x60E50054, 20, 32, 0 }, + {0x60E50068, 4, 32, 0 }, + {0x60E5006C, 44, 32, 0 }, + {0x60E58000, 24, 32, 0 }, + {0x60E58018, 4, 32, 0 }, + {0x60E5802C, 4, 32, 0 }, + {0x60E58030, 4, 32, 0 }, + {0x60E58034, 4, 32, 0 }, + {0x60E58038, 12, 32, 0 }, + {0x60E60000, 20, 32, 0 }, + {0x60E60028, 16, 32, 0 }, + {0x60E70000, 256, 32, 0 }, + {0x60E70120, 224, 32, 0 }, + {0x60E78000, 16, 8, 0 }, + {0x60E78010, 27, 8, 0 }, + {0x60E78030, 6, 8, 0 }, + {0x60E78040, 21, 8, 0 }, + {0x60E80000, 6, 8, 0 }, + {0x60E80006, 48, 8, 0 }, + {0x60E80036, 10, 8, 0 }, + {0x60E80040, 13, 8, 0 }, + {0x60E8004D, 11, 8, 0 }, + {0x60E80058, 1, 8, 0 }, + {0x60E88000, 5, 8, 0 }, + {0x60E88010, 4, 8, 0 }, + {0x60E88020, 10, 8, 0 }, + {0x60E88030, 10, 8, 0 }, + {0x60E88040, 2, 8, 0 }, + {0x60E88050, 3, 8, 0 }, + {0x60E90000, 16, 32, 0 }, + {0x60E9002C, 20, 32, 0 }, + {0x60E9005C, 196, 32, 0 }, + {0x60E91FFC, 4, 32, 0 }, + {0x60E92000, 100, 32, 0 }, + {0x60E92084, 32, 32, 0 }, + {0x60E92134, 144, 32, 0 }, + {0x60E921E4, 44, 32, 0 }, + {0x60E9222C, 4, 32, 0 }, + {0x60E9224C, 4, 32, 0 }, + {0x60E92400, 524, 32, 0 }, + {0x60E927FC, 4, 32, 0 }, + {0x60E92800, 100, 32, 0 }, + {0x60E92884, 32, 32, 0 }, + {0x60E92934, 144, 32, 0 }, + {0x60E929E4, 44, 32, 0 }, + {0x60E92A2C, 4, 32, 0 }, + {0x60E92A4C, 4, 32, 0 }, + {0x60E92C00, 524, 32, 0 }, + {0x60E92FFC, 4, 32, 0 }, + {0x60E94000, 44, 8, 0 }, + {0x60E943FF, 1, 8, 0 }, + {0x60E94400, 44, 8, 0 }, + {0x60E947FF, 1, 8, 0 }, + {0x60E96400, 91, 8, 0 }, + {0x60E967F2, 14, 8, 0 }, + {0x60E96800, 263, 8, 0 }, + {0x60E96BFF, 1, 8, 0 }, + {0x60EB0000, 32, 32, 0 }, + {0x60EB0100, 2628, 32, 0 }, + {0x60EB0C00, 396, 32, 0 }, + {0x60EB0E00, 320, 32, 0 }, + {0x60EB0F40, 100, 32, 0 }, + {0x60EB0FB0, 4, 32, 0 }, + {0x60EB0FB4, 8, 32, 0 }, + {0x60EB0FBC, 4, 32, 0 }, + {0x60EC0000, 60, 32, 0 }, + {0x60EC0080, 12, 32, 0 }, + {0x60EC0100, 12, 32, 0 }, + {0x60EC0110, 16, 32, 0 }, + {0x60EC0120, 40, 32, 0 }, + {0x60EC0148, 40, 32, 0 }, + {0x60EC0170, 12, 32, 0 }, + {0x60ED0000, 192, 32, 0 }, + {0x60EE0000, 116, 32, 0 }, + {0x60EE4000, 12800, 32, 0 }, + {0x60EE8000, 40, 32, 0 }, + {0x60EE80A0, 260, 32, 0 }, + {0x60EE8200, 156, 32, 0 }, + {0x60EE8300, 92, 32, 0 }, + {0x60EEB000, 4, 32, 0 }, + {0x60EEE000, 1022, 16, 0 }, + {0x60F22000, 396, 32, 0 }, + {0x60F23000, 56, 32, 0 }, + {0x60F24000, 4, 32, 0 }, + {0x60F25000, 4, 32, 0 }, + {0x60F26000, 4, 32, 0 }, + {0x60F27000, 4, 32, 0 }, + {0x60F28000, 4, 32, 0 }, + {0x60F29000, 4, 32, 0 }, + {0x60F2A000, 4, 32, 0 }, + {0x60F2B000, 4, 32, 0 }, + {0x60F30004, 20, 32, 0 }, + {0x60F30018, 8, 32, 0 }, + {0x60F30024, 4, 32, 0 }, + {0x60F30038, 8, 32, 0 }, + {0x60F30040, 24, 32, 0 }, + {0x60F30058, 4, 32, 0 }, + {0x60F3005C, 16, 32, 0 }, + {0x60F3006C, 12, 32, 0 }, + {0x60F30078, 4, 32, 0 }, + {0x60F30080, 4, 32, 0 }, + {0x60F30084, 8, 32, 0 }, + {0x60F38000, 16, 32, 0 }, + {0x60F38010, 4, 32, 0 }, + {0x60F38014, 196, 32, 0 }, + {0x60F380D8, 172, 32, 0 }, + {0x60F38190, 4, 32, 0 }, + {0x60F381A8, 4, 32, 0 }, + {0x60F381B0, 4, 32, 0 }, + {0x60F381B4, 8, 32, 0 }, + {0x60F40000, 44, 32, 0 }, + {0x60F40030, 32, 32, 0 }, + {0x60F40050, 4, 32, 0 }, + {0x60F40060, 4, 32, 0 }, + {0x60F40064, 12, 32, 0 }, + {0x60F40070, 12, 32, 0 }, + {0x60F4007C, 16, 32, 0 }, + {0x60F48000, 4, 32, 0 }, + {0x60F48004, 40, 32, 0 }, + {0x60F4802C, 20, 32, 0 }, + {0x60F48040, 20, 32, 0 }, + {0x60F48054, 20, 32, 0 }, + {0x60F48068, 4, 32, 0 }, + {0x60F4806C, 44, 32, 0 }, + {0x60F50000, 4, 32, 0 }, + {0x60F50004, 40, 32, 0 }, + {0x60F5002C, 20, 32, 0 }, + {0x60F50040, 20, 32, 0 }, + {0x60F50054, 20, 32, 0 }, + {0x60F50068, 4, 32, 0 }, + {0x60F5006C, 44, 32, 0 }, + {0x60F58000, 24, 32, 0 }, + {0x60F58018, 4, 32, 0 }, + {0x60F5802C, 4, 32, 0 }, + {0x60F58030, 4, 32, 0 }, + {0x60F58034, 4, 32, 0 }, + {0x60F58038, 12, 32, 0 }, + {0x60F60000, 20, 32, 0 }, + {0x60F60028, 16, 32, 0 }, + {0x60F70000, 256, 32, 0 }, + {0x60F70120, 224, 32, 0 }, + {0x60F78000, 16, 8, 0 }, + {0x60F78010, 27, 8, 0 }, + {0x60F78030, 6, 8, 0 }, + {0x60F78040, 21, 8, 0 }, + {0x60F80000, 6, 8, 0 }, + {0x60F80006, 48, 8, 0 }, + {0x60F80036, 10, 8, 0 }, + {0x60F80040, 13, 8, 0 }, + {0x60F8004D, 11, 8, 0 }, + {0x60F80058, 1, 8, 0 }, + {0x60F88000, 5, 8, 0 }, + {0x60F88010, 4, 8, 0 }, + {0x60F88020, 10, 8, 0 }, + {0x60F88030, 10, 8, 0 }, + {0x60F88040, 2, 8, 0 }, + {0x60F88050, 3, 8, 0 }, + {0x60F90000, 16, 32, 0 }, + {0x60F9002C, 20, 32, 0 }, + {0x60F9005C, 196, 32, 0 }, + {0x60F91FFC, 4, 32, 0 }, + {0x60F92000, 100, 32, 0 }, + {0x60F92084, 32, 32, 0 }, + {0x60F92134, 144, 32, 0 }, + {0x60F921E4, 44, 32, 0 }, + {0x60F9222C, 4, 32, 0 }, + {0x60F9224C, 4, 32, 0 }, + {0x60F92400, 524, 32, 0 }, + {0x60F927FC, 4, 32, 0 }, + {0x60F92800, 100, 32, 0 }, + {0x60F92884, 32, 32, 0 }, + {0x60F92934, 144, 32, 0 }, + {0x60F929E4, 44, 32, 0 }, + {0x60F92A2C, 4, 32, 0 }, + {0x60F92A4C, 4, 32, 0 }, + {0x60F92C00, 524, 32, 0 }, + {0x60F92FFC, 4, 32, 0 }, + {0x60F94000, 44, 8, 0 }, + {0x60F943FF, 1, 8, 0 }, + {0x60F94400, 44, 8, 0 }, + {0x60F947FF, 1, 8, 0 }, + {0x60F96400, 91, 8, 0 }, + {0x60F967F2, 14, 8, 0 }, + {0x60F96800, 263, 8, 0 }, + {0x60F96BFF, 1, 8, 0 }, + {0x60FB0000, 32, 32, 0 }, + {0x60FB0100, 2628, 32, 0 }, + {0x60FB0C00, 396, 32, 0 }, + {0x60FB0E00, 320, 32, 0 }, + {0x60FB0F40, 100, 32, 0 }, + {0x60FB0FB0, 4, 32, 0 }, + {0x60FB0FB4, 8, 32, 0 }, + {0x60FB0FBC, 4, 32, 0 }, + {0x60FC0000, 60, 32, 0 }, + {0x60FC0080, 12, 32, 0 }, + {0x60FC0100, 12, 32, 0 }, + {0x60FC0110, 16, 32, 0 }, + {0x60FC0120, 40, 32, 0 }, + {0x60FC0148, 40, 32, 0 }, + {0x60FC0170, 12, 32, 0 }, + {0x60FD0000, 192, 32, 0 }, + {0x60FE0000, 116, 32, 0 }, + {0x60FE4000, 12800, 32, 0 }, + {0x60FE8000, 40, 32, 0 }, + {0x60FE80A0, 260, 32, 0 }, + {0x60FE8200, 156, 32, 0 }, + {0x60FE8300, 92, 32, 0 }, + {0x60FEB000, 4, 32, 0 }, + {0x60FEE000, 1022, 16, 0 }, + {0x61022000, 396, 32, 0 }, + {0x61023000, 56, 32, 0 }, + {0x61024000, 4, 32, 0 }, + {0x61025000, 4, 32, 0 }, + {0x61026000, 4, 32, 0 }, + {0x61027000, 4, 32, 0 }, + {0x61028000, 4, 32, 0 }, + {0x61029000, 4, 32, 0 }, + {0x6102A000, 4, 32, 0 }, + {0x6102B000, 4, 32, 0 }, + {0x61050000, 56, 32, 0 }, + {0x61050040, 12, 32, 0 }, + {0x61050058, 8, 32, 0 }, + {0x6105006C, 4, 32, 0 }, + {0x61050070, 16, 32, 0 }, + {0x610500A0, 12, 32, 0 }, + {0x610500D0, 12, 32, 0 }, + {0x610500E0, 4, 32, 0 }, + {0x610500E4, 4, 32, 0 }, + {0x610500E8, 20, 32, 0 }, + {0x610500FC, 44, 32, 0 }, + {0x61050128, 4, 32, 0 }, + {0x61058000, 72, 32, 0 }, + {0x610580A8, 32, 32, 0 }, + {0x61058128, 32, 32, 0 }, + {0x610581A8, 32, 32, 0 }, + {0x61058228, 32, 32, 0 }, + {0x610582A8, 32, 32, 0 }, + {0x61068000, 44, 8, 0 }, + {0x610683FF, 1, 8, 0 }, + {0x61068400, 44, 8, 0 }, + {0x610687FF, 1, 8, 0 }, + {0x61068800, 44, 8, 0 }, + {0x61068BFF, 1, 8, 0 }, + {0x61068C00, 44, 8, 0 }, + {0x61068FFF, 1, 8, 0 }, + {0x61069000, 44, 8, 0 }, + {0x610693FF, 1, 8, 0 }, + {0x6106A400, 91, 8, 0 }, + {0x6106A7F0, 16, 8, 0 }, + {0x6106A800, 263, 8, 0 }, + {0x6106ABFF, 1, 8, 0 }, + {0x61070000, 16, 32, 0 }, + {0x6107002C, 20, 32, 0 }, + {0x6107005C, 196, 32, 0 }, + {0x610707FC, 24, 32, 0 }, + {0x61071FFC, 4, 32, 0 }, + {0x61072000, 100, 32, 0 }, + {0x61072084, 32, 32, 0 }, + {0x61072134, 144, 32, 0 }, + {0x610721E4, 44, 32, 0 }, + {0x6107222C, 4, 32, 0 }, + {0x6107224C, 4, 32, 0 }, + {0x61072400, 524, 32, 0 }, + {0x610727FC, 4, 32, 0 }, + {0x61072800, 100, 32, 0 }, + {0x61072884, 32, 32, 0 }, + {0x61072934, 144, 32, 0 }, + {0x610729E4, 44, 32, 0 }, + {0x61072A2C, 4, 32, 0 }, + {0x61072A4C, 4, 32, 0 }, + {0x61072C00, 524, 32, 0 }, + {0x61072FFC, 4, 32, 0 }, + {0x61073000, 100, 32, 0 }, + {0x61073084, 32, 32, 0 }, + {0x61073134, 144, 32, 0 }, + {0x610731E4, 44, 32, 0 }, + {0x6107322C, 4, 32, 0 }, + {0x6107324C, 4, 32, 0 }, + {0x61073400, 524, 32, 0 }, + {0x610737FC, 4, 32, 0 }, + {0x61073800, 100, 32, 0 }, + {0x61073884, 32, 32, 0 }, + {0x61073934, 144, 32, 0 }, + {0x610739E4, 44, 32, 0 }, + {0x61073A2C, 4, 32, 0 }, + {0x61073A4C, 4, 32, 0 }, + {0x61073C00, 524, 32, 0 }, + {0x61073FFC, 4, 32, 0 }, + {0x61074000, 100, 32, 0 }, + {0x61074084, 32, 32, 0 }, + {0x61074134, 144, 32, 0 }, + {0x610741E4, 44, 32, 0 }, + {0x6107422C, 4, 32, 0 }, + {0x6107424C, 4, 32, 0 }, + {0x61074400, 524, 32, 0 }, + {0x610747FC, 4, 32, 0 }, + {0x61076800, 28, 32, 0 }, + {0x61076838, 4, 32, 0 }, + {0x61076858, 4, 32, 0 }, + {0x61076888, 4, 32, 0 }, + {0x610768B8, 4, 32, 0 }, + {0x61076918, 48, 32, 0 }, + {0x61076984, 340, 32, 0 }, + {0x61076B00, 192, 32, 0 }, + {0x61076FFC, 4, 32, 0 }, + {0x61077000, 28, 32, 0 }, + {0x61077038, 4, 32, 0 }, + {0x61077058, 4, 32, 0 }, + {0x61077088, 4, 32, 0 }, + {0x610770B8, 4, 32, 0 }, + {0x61077118, 48, 32, 0 }, + {0x61077184, 340, 32, 0 }, + {0x61077300, 192, 32, 0 }, + {0x610777FC, 4, 32, 0 }, + {0x61077800, 28, 32, 0 }, + {0x61077838, 4, 32, 0 }, + {0x61077858, 4, 32, 0 }, + {0x61077888, 4, 32, 0 }, + {0x610778B8, 4, 32, 0 }, + {0x61077918, 48, 32, 0 }, + {0x61077984, 340, 32, 0 }, + {0x61077B00, 192, 32, 0 }, + {0x61077FFC, 4, 32, 0 }, + {0x61078000, 28, 32, 0 }, + {0x61078038, 4, 32, 0 }, + {0x61078058, 4, 32, 0 }, + {0x61078088, 4, 32, 0 }, + {0x610780B8, 4, 32, 0 }, + {0x61078118, 48, 32, 0 }, + {0x61078184, 340, 32, 0 }, + {0x61078300, 192, 32, 0 }, + {0x610787FC, 4, 32, 0 }, + {0x61078800, 28, 32, 0 }, + {0x61078838, 4, 32, 0 }, + {0x61078858, 4, 32, 0 }, + {0x61078888, 4, 32, 0 }, + {0x610788B8, 4, 32, 0 }, + {0x61078918, 48, 32, 0 }, + {0x61078984, 340, 32, 0 }, + {0x61078B00, 192, 32, 0 }, + {0x61078FFC, 4, 32, 0 }, + {0x6107B000, 48, 32, 0 }, + {0x6107B7FC, 4, 32, 0 }, + {0x6107B800, 48, 32, 0 }, + {0x6107BFFC, 4, 32, 0 }, + {0x6107C000, 48, 32, 0 }, + {0x6107C7FC, 4, 32, 0 }, + {0x6107C800, 48, 32, 0 }, + {0x6107CFFC, 4, 32, 0 }, + {0x6107D000, 48, 32, 0 }, + {0x6107D7FC, 4, 32, 0 }, + {0x61122000, 396, 32, 0 }, + {0x61123000, 56, 32, 0 }, + {0x61124000, 4, 32, 0 }, + {0x61125000, 4, 32, 0 }, + {0x61126000, 4, 32, 0 }, + {0x61127000, 4, 32, 0 }, + {0x61128000, 4, 32, 0 }, + {0x61129000, 4, 32, 0 }, + {0x6112A000, 4, 32, 0 }, + {0x6112B000, 4, 32, 0 }, + {0x61150000, 56, 32, 0 }, + {0x61150040, 12, 32, 0 }, + {0x61150058, 8, 32, 0 }, + {0x6115006C, 4, 32, 0 }, + {0x61150070, 16, 32, 0 }, + {0x611500A0, 12, 32, 0 }, + {0x611500D0, 12, 32, 0 }, + {0x611500E0, 4, 32, 0 }, + {0x611500E4, 4, 32, 0 }, + {0x611500E8, 20, 32, 0 }, + {0x611500FC, 44, 32, 0 }, + {0x61150128, 4, 32, 0 }, + {0x61158000, 72, 32, 0 }, + {0x611580A8, 32, 32, 0 }, + {0x61158128, 32, 32, 0 }, + {0x611581A8, 32, 32, 0 }, + {0x61158228, 32, 32, 0 }, + {0x611582A8, 32, 32, 0 }, + {0x61168000, 44, 8, 0 }, + {0x611683FF, 1, 8, 0 }, + {0x61168400, 44, 8, 0 }, + {0x611687FF, 1, 8, 0 }, + {0x61168800, 44, 8, 0 }, + {0x61168BFF, 1, 8, 0 }, + {0x61168C00, 44, 8, 0 }, + {0x61168FFF, 1, 8, 0 }, + {0x61169000, 44, 8, 0 }, + {0x611693FF, 1, 8, 0 }, + {0x6116A400, 91, 8, 0 }, + {0x6116A7F0, 16, 8, 0 }, + {0x6116A800, 263, 8, 0 }, + {0x6116ABFF, 1, 8, 0 }, + {0x61170000, 16, 32, 0 }, + {0x6117002C, 20, 32, 0 }, + {0x6117005C, 196, 32, 0 }, + {0x611707FC, 24, 32, 0 }, + {0x61171FFC, 4, 32, 0 }, + {0x61172000, 100, 32, 0 }, + {0x61172084, 32, 32, 0 }, + {0x61172134, 144, 32, 0 }, + {0x611721E4, 44, 32, 0 }, + {0x6117222C, 4, 32, 0 }, + {0x6117224C, 4, 32, 0 }, + {0x61172400, 524, 32, 0 }, + {0x611727FC, 4, 32, 0 }, + {0x61172800, 100, 32, 0 }, + {0x61172884, 32, 32, 0 }, + {0x61172934, 144, 32, 0 }, + {0x611729E4, 44, 32, 0 }, + {0x61172A2C, 4, 32, 0 }, + {0x61172A4C, 4, 32, 0 }, + {0x61172C00, 524, 32, 0 }, + {0x61172FFC, 4, 32, 0 }, + {0x61173000, 100, 32, 0 }, + {0x61173084, 32, 32, 0 }, + {0x61173134, 144, 32, 0 }, + {0x611731E4, 44, 32, 0 }, + {0x6117322C, 4, 32, 0 }, + {0x6117324C, 4, 32, 0 }, + {0x61173400, 524, 32, 0 }, + {0x611737FC, 4, 32, 0 }, + {0x61173800, 100, 32, 0 }, + {0x61173884, 32, 32, 0 }, + {0x61173934, 144, 32, 0 }, + {0x611739E4, 44, 32, 0 }, + {0x61173A2C, 4, 32, 0 }, + {0x61173A4C, 4, 32, 0 }, + {0x61173C00, 524, 32, 0 }, + {0x61173FFC, 4, 32, 0 }, + {0x61174000, 100, 32, 0 }, + {0x61174084, 32, 32, 0 }, + {0x61174134, 144, 32, 0 }, + {0x611741E4, 44, 32, 0 }, + {0x6117422C, 4, 32, 0 }, + {0x6117424C, 4, 32, 0 }, + {0x61174400, 524, 32, 0 }, + {0x611747FC, 4, 32, 0 }, + {0x61176800, 28, 32, 0 }, + {0x61176838, 4, 32, 0 }, + {0x61176858, 4, 32, 0 }, + {0x61176888, 4, 32, 0 }, + {0x611768B8, 4, 32, 0 }, + {0x61176918, 48, 32, 0 }, + {0x61176984, 340, 32, 0 }, + {0x61176B00, 192, 32, 0 }, + {0x61176FFC, 4, 32, 0 }, + {0x61177000, 28, 32, 0 }, + {0x61177038, 4, 32, 0 }, + {0x61177058, 4, 32, 0 }, + {0x61177088, 4, 32, 0 }, + {0x611770B8, 4, 32, 0 }, + {0x61177118, 48, 32, 0 }, + {0x61177184, 340, 32, 0 }, + {0x61177300, 192, 32, 0 }, + {0x611777FC, 4, 32, 0 }, + {0x61177800, 28, 32, 0 }, + {0x61177838, 4, 32, 0 }, + {0x61177858, 4, 32, 0 }, + {0x61177888, 4, 32, 0 }, + {0x611778B8, 4, 32, 0 }, + {0x61177918, 48, 32, 0 }, + {0x61177984, 340, 32, 0 }, + {0x61177B00, 192, 32, 0 }, + {0x61177FFC, 4, 32, 0 }, + {0x61178000, 28, 32, 0 }, + {0x61178038, 4, 32, 0 }, + {0x61178058, 4, 32, 0 }, + {0x61178088, 4, 32, 0 }, + {0x611780B8, 4, 32, 0 }, + {0x61178118, 48, 32, 0 }, + {0x61178184, 340, 32, 0 }, + {0x61178300, 192, 32, 0 }, + {0x611787FC, 4, 32, 0 }, + {0x61178800, 28, 32, 0 }, + {0x61178838, 4, 32, 0 }, + {0x61178858, 4, 32, 0 }, + {0x61178888, 4, 32, 0 }, + {0x611788B8, 4, 32, 0 }, + {0x61178918, 48, 32, 0 }, + {0x61178984, 340, 32, 0 }, + {0x61178B00, 192, 32, 0 }, + {0x61178FFC, 4, 32, 0 }, + {0x6117B000, 48, 32, 0 }, + {0x6117B7FC, 4, 32, 0 }, + {0x6117B800, 48, 32, 0 }, + {0x6117BFFC, 4, 32, 0 }, + {0x6117C000, 48, 32, 0 }, + {0x6117C7FC, 4, 32, 0 }, + {0x6117C800, 48, 32, 0 }, + {0x6117CFFC, 4, 32, 0 }, + {0x6117D000, 48, 32, 0 }, + {0x6117D7FC, 4, 32, 0 }, + {0xA0000000, 12, 32, 0 }, + {0xA0100000, 12, 32, 0 }, + {0xA0200000, 12, 32, 0 }, + {0xA0300000, 12, 32, 0 }, + {0xA0400000, 24, 32, 0 }, + {0xA0500000, 24, 32, 0 }, + {0xA0600000, 24, 32, 0 }, + {0xA0700000, 24, 32, 0 }, + {0xA0800000, 24, 32, 0 }, + {0xA0900000, 24, 32, 0 }, + {0xA0A00000, 24, 32, 0 }, + {0xA0B00000, 24, 32, 0 }, + {0xA4000000, 28, 32, 0 }, + {0xA4100000, 28, 32, 0 }, + {0xA4200000, 28, 32, 0 }, + {0xA4300000, 28, 32, 0 }, + {0xA8000000, 28, 32, 0 }, + {0xA8100000, 28, 32, 0 }, + {0xA8200000, 28, 32, 0 }, + {0xA8300000, 28, 32, 0 }, + {0xB0000000, 80, 32, 0 }, + {0xB0000080, 80, 32, 0 }, + {0xB0100000, 80, 32, 0 }, + {0xB0100080, 80, 32, 0 }, + {0xB0200000, 80, 32, 0 }, + {0xB0200080, 80, 32, 0 }, + {0xB0300000, 80, 32, 0 }, + {0xB0300080, 80, 32, 0 }, + {0xB0800000, 100, 32, 0 }, + {0xB0800080, 68, 32, 0 }, + {0xB08000EC, 68, 32, 0 }, + {0xB0900000, 100, 32, 0 }, + {0xB0900080, 68, 32, 0 }, + {0xB09000EC, 68, 32, 0 }, + {0xB0A00000, 100, 32, 0 }, + {0xB0A00080, 68, 32, 0 }, + {0xB0A000EC, 68, 32, 0 }, + {0xB0B00000, 100, 32, 0 }, + {0xB0B00080, 68, 32, 0 }, + {0xB0B000EC, 68, 32, 0 }, + {0xB0C00000, 80, 32, 0 }, + {0xB0D00000, 80, 32, 0 }, + {0xB0E00000, 8, 32, 0 }, + {0xB0E00FD0, 48, 32, 0 }, + {0xB0E80000, 8, 32, 0 }, + {0xB0E80FD0, 48, 32, 0 }, + {0xB0F00000, 36, 32, 0 }, + {0xB0F00EF8, 12, 32, 0 }, + {0xB0F00FD0, 48, 32, 0 }, + {0xB0F80000, 36, 32, 0 }, + {0xB0F80EF8, 12, 32, 0 }, + {0xB0F80FD0, 48, 32, 0 }, + {0xB1000000, 68, 32, 0 }, + {0xB10007E0, 24, 32, 0 }, + {0xB1100000, 16, 32, 0 }, + {0xB1200000, 60, 32, 0 }, + {0xB1300000, 16, 32, 0 }, + {0xB1400000, 60, 32, 0 }, + {0xB1801FD0, 60, 32, 0 }, + {0xB1802044, 4, 32, 0 }, + {0xB1803008, 4, 32, 0 }, + {0xB1803044, 4, 32, 0 }, + {0xB1804008, 4, 32, 0 }, + {0xB1804044, 4, 32, 0 }, + {0xB1805008, 4, 32, 0 }, + {0xB1805044, 4, 32, 0 }, + {0xB1806008, 4, 32, 0 }, + {0xB1806044, 4, 32, 0 }, + {0xB1807008, 4, 32, 0 }, + {0xB1807044, 4, 32, 0 }, + {0xB1808008, 4, 32, 0 }, + {0xB1808044, 4, 32, 0 }, + {0xB1809008, 4, 32, 0 }, + {0xB1809044, 4, 32, 0 }, + {0xB180A008, 4, 32, 0 }, + {0xB180A044, 4, 32, 0 }, + {0xB180B008, 4, 32, 0 }, + {0xB180B044, 4, 32, 0 }, + {0xB1842108, 4, 32, 0 }, + {0xB2000000, 136, 32, 0 }, + {0xB2000100, 72, 32, 0 }, + {0xB2100000, 136, 32, 0 }, + {0xB2100100, 72, 32, 0 }, + {0xB2200000, 40, 32, 0 }, + {0xB2210000, 4, 32, 0 }, + {0xB2210020, 72, 32, 0 }, + {0xB2218000, 28, 32, 0 }, + {0xB2220000, 4, 32, 0 }, + {0xB2220020, 4, 32, 0 }, + {0xB2220040, 4, 32, 0 }, + {0xB2220060, 4, 32, 0 }, + {0xB2220080, 4, 32, 0 }, + {0xB22200A0, 4, 32, 0 }, + {0xB2220100, 28, 32, 0 }, + {0xB2220140, 28, 32, 0 }, + {0xB2220180, 4, 32, 0 }, + {0xB2220200, 8, 32, 0 }, + {0xB2221000, 128, 32, 0 }, + {0xB2300000, 64, 32, 0 }, + {0xB2400000, 356, 32, 0 }, + {0xB2500000, 144, 32, 0 }, + {0xB6000000, 2048, 32, 0 }, + {0xB6000FB8, 72, 32, 0 }, + {0xB6001000, 328, 32, 0 }, + {0xB6001EE4, 32, 32, 0 }, + {0xB6001FA0, 96, 32, 0 }, + {0xB6002000, 8, 32, 0 }, + {0xB6002EEC, 24, 32, 0 }, + {0xB6002FA0, 96, 32, 0 }, + {0xB6003004, 52, 32, 0 }, + {0xB6003300, 12, 32, 0 }, + {0xB6003ED0, 52, 32, 0 }, + {0xB6003FA0, 96, 32, 0 }, + {0xB6004000, 8, 32, 0 }, + {0xB6004100, 12, 32, 0 }, + {0xB6004200, 12, 32, 0 }, + {0xB6004300, 12, 32, 0 }, + {0xB6004400, 8, 32, 0 }, + {0xB6004EE8, 28, 32, 0 }, + {0xB6004FA0, 96, 32, 0 }, + {0xB7000000, 328, 32, 0 }, + {0xB7000A00, 36, 32, 0 }, + {0xB7000A80, 36, 32, 0 }, + {0xB7000C00, 4, 32, 0 }, + {0xB7000FB8, 72, 32, 0 }, + {0xB7010020, 24, 32, 0 }, + {0xB7010080, 48, 32, 0 }, + {0xB7010300, 24, 32, 0 }, + {0xB7010400, 92, 32, 0 }, + {0xB7010800, 60, 32, 0 }, + {0xB7010FA0, 8, 32, 0 }, + {0xB7020000, 64, 32, 0 }, + {0xB70200A0, 32, 32, 0 }, + {0xB7020130, 20, 32, 0 }, + {0xB7020F00, 4, 32, 0 }, + {0xB7020FA0, 96, 32, 0 }, + {0xB7030000, 44, 32, 0 }, + {0xB70300F8, 8, 32, 0 }, + {0xB7030400, 24, 32, 0 }, + {0xB703047C, 4, 32, 0 }, + {0xB7030620, 24, 32, 0 }, + {0xB7030C00, 4, 32, 0 }, + {0xB7030C20, 4, 32, 0 }, + {0xB7030C40, 4, 32, 0 }, + {0xB7030C60, 4, 32, 0 }, + {0xB7030C80, 4, 32, 0 }, + {0xB7030CA0, 4, 32, 0 }, + {0xB7030CC0, 4, 32, 0 }, + {0xB7030E00, 8, 32, 0 }, + {0xB7030E20, 16, 32, 0 }, + {0xB7040004, 64, 32, 0 }, + {0xB7040080, 12, 32, 0 }, + {0xB7040100, 36, 32, 0 }, + {0xB7040140, 40, 32, 0 }, + {0xB70401C0, 4, 32, 0 }, + {0xB70401E0, 96, 32, 0 }, + {0xB7040280, 4, 32, 0 }, + {0xB70402A0, 4, 32, 0 }, + {0xB7040300, 24, 32, 0 }, + {0xB7040400, 64, 32, 0 }, + {0xB7040480, 64, 32, 0 }, + {0xB7040600, 8, 32, 0 }, + {0xB7040640, 8, 32, 0 }, + {0xB7040680, 4, 32, 0 }, + {0xB7040EE4, 32, 32, 0 }, + {0xB7040FA0, 8, 32, 0 }, + {0xB7110020, 24, 32, 0 }, + {0xB7110080, 48, 32, 0 }, + {0xB7110300, 24, 32, 0 }, + {0xB7110400, 92, 32, 0 }, + {0xB7110800, 60, 32, 0 }, + {0xB7110FA0, 8, 32, 0 }, + {0xB7120000, 64, 32, 0 }, + {0xB71200A0, 32, 32, 0 }, + {0xB7120130, 20, 32, 0 }, + {0xB7120F00, 4, 32, 0 }, + {0xB7120FA0, 96, 32, 0 }, + {0xB7130000, 44, 32, 0 }, + {0xB71300F8, 8, 32, 0 }, + {0xB7130400, 24, 32, 0 }, + {0xB713047C, 4, 32, 0 }, + {0xB7130620, 24, 32, 0 }, + {0xB7130C00, 4, 32, 0 }, + {0xB7130C20, 4, 32, 0 }, + {0xB7130C40, 4, 32, 0 }, + {0xB7130C60, 4, 32, 0 }, + {0xB7130C80, 4, 32, 0 }, + {0xB7130CA0, 4, 32, 0 }, + {0xB7130CC0, 4, 32, 0 }, + {0xB7130E00, 8, 32, 0 }, + {0xB7130E20, 16, 32, 0 }, + {0xB7140004, 64, 32, 0 }, + {0xB7140080, 12, 32, 0 }, + {0xB7140100, 36, 32, 0 }, + {0xB7140140, 40, 32, 0 }, + {0xB71401C0, 4, 32, 0 }, + {0xB71401E0, 96, 32, 0 }, + {0xB7140280, 4, 32, 0 }, + {0xB71402A0, 4, 32, 0 }, + {0xB7140300, 24, 32, 0 }, + {0xB7140400, 64, 32, 0 }, + {0xB7140480, 64, 32, 0 }, + {0xB7140600, 8, 32, 0 }, + {0xB7140640, 8, 32, 0 }, + {0xB7140680, 4, 32, 0 }, + {0xB7140EE4, 32, 32, 0 }, + {0xB7140FA0, 8, 32, 0 }, + {0xB7210020, 24, 32, 0 }, + {0xB7210080, 48, 32, 0 }, + {0xB7210300, 24, 32, 0 }, + {0xB7210400, 92, 32, 0 }, + {0xB7210800, 60, 32, 0 }, + {0xB7210FA0, 8, 32, 0 }, + {0xB7220000, 64, 32, 0 }, + {0xB72200A0, 32, 32, 0 }, + {0xB7220130, 20, 32, 0 }, + {0xB7220F00, 4, 32, 0 }, + {0xB7220FA0, 96, 32, 0 }, + {0xB7230000, 44, 32, 0 }, + {0xB72300F8, 8, 32, 0 }, + {0xB7230400, 24, 32, 0 }, + {0xB723047C, 4, 32, 0 }, + {0xB7230620, 24, 32, 0 }, + {0xB7230C00, 4, 32, 0 }, + {0xB7230C20, 4, 32, 0 }, + {0xB7230C40, 4, 32, 0 }, + {0xB7230C60, 4, 32, 0 }, + {0xB7230C80, 4, 32, 0 }, + {0xB7230CA0, 4, 32, 0 }, + {0xB7230CC0, 4, 32, 0 }, + {0xB7230E00, 8, 32, 0 }, + {0xB7230E20, 16, 32, 0 }, + {0xB7240004, 64, 32, 0 }, + {0xB7240080, 12, 32, 0 }, + {0xB7240100, 36, 32, 0 }, + {0xB7240140, 40, 32, 0 }, + {0xB72401C0, 4, 32, 0 }, + {0xB72401E0, 96, 32, 0 }, + {0xB7240280, 4, 32, 0 }, + {0xB72402A0, 4, 32, 0 }, + {0xB7240300, 24, 32, 0 }, + {0xB7240400, 64, 32, 0 }, + {0xB7240480, 64, 32, 0 }, + {0xB7240600, 8, 32, 0 }, + {0xB7240640, 8, 32, 0 }, + {0xB7240680, 4, 32, 0 }, + {0xB7240EE4, 32, 32, 0 }, + {0xB7240FA0, 8, 32, 0 }, + {0xB7310020, 24, 32, 0 }, + {0xB7310080, 48, 32, 0 }, + {0xB7310300, 24, 32, 0 }, + {0xB7310400, 92, 32, 0 }, + {0xB7310800, 60, 32, 0 }, + {0xB7310FA0, 8, 32, 0 }, + {0xB7320000, 64, 32, 0 }, + {0xB73200A0, 32, 32, 0 }, + {0xB7320130, 20, 32, 0 }, + {0xB7320F00, 4, 32, 0 }, + {0xB7320FA0, 96, 32, 0 }, + {0xB7330000, 44, 32, 0 }, + {0xB73300F8, 8, 32, 0 }, + {0xB7330400, 24, 32, 0 }, + {0xB733047C, 4, 32, 0 }, + {0xB7330620, 24, 32, 0 }, + {0xB7330C00, 4, 32, 0 }, + {0xB7330C20, 4, 32, 0 }, + {0xB7330C40, 4, 32, 0 }, + {0xB7330C60, 4, 32, 0 }, + {0xB7330C80, 4, 32, 0 }, + {0xB7330CA0, 4, 32, 0 }, + {0xB7330CC0, 4, 32, 0 }, + {0xB7330E00, 8, 32, 0 }, + {0xB7330E20, 16, 32, 0 }, + {0xB7340004, 64, 32, 0 }, + {0xB7340080, 12, 32, 0 }, + {0xB7340100, 36, 32, 0 }, + {0xB7340140, 40, 32, 0 }, + {0xB73401C0, 4, 32, 0 }, + {0xB73401E0, 96, 32, 0 }, + {0xB7340280, 4, 32, 0 }, + {0xB73402A0, 4, 32, 0 }, + {0xB7340300, 24, 32, 0 }, + {0xB7340400, 64, 32, 0 }, + {0xB7340480, 64, 32, 0 }, + {0xB7340600, 8, 32, 0 }, + {0xB7340640, 8, 32, 0 }, + {0xB7340680, 4, 32, 0 }, + {0xB7340EE4, 32, 32, 0 }, + {0xB7340FA0, 8, 32, 0 }, + {0xB7800000, 328, 32, 0 }, + {0xB7800A00, 36, 32, 0 }, + {0xB7800A80, 36, 32, 0 }, + {0xB7800C00, 4, 32, 0 }, + {0xB7800FB8, 72, 32, 0 }, + {0xB7810020, 24, 32, 0 }, + {0xB7810080, 48, 32, 0 }, + {0xB7810300, 24, 32, 0 }, + {0xB7810400, 92, 32, 0 }, + {0xB7810800, 60, 32, 0 }, + {0xB7810FA0, 8, 32, 0 }, + {0xB7820000, 64, 32, 0 }, + {0xB78200A0, 32, 32, 0 }, + {0xB7820130, 20, 32, 0 }, + {0xB7820F00, 4, 32, 0 }, + {0xB7820FA0, 96, 32, 0 }, + {0xB7830000, 44, 32, 0 }, + {0xB78300F8, 8, 32, 0 }, + {0xB7830400, 24, 32, 0 }, + {0xB783047C, 4, 32, 0 }, + {0xB7830620, 24, 32, 0 }, + {0xB7830C00, 4, 32, 0 }, + {0xB7830C20, 4, 32, 0 }, + {0xB7830C40, 4, 32, 0 }, + {0xB7830C60, 4, 32, 0 }, + {0xB7830C80, 4, 32, 0 }, + {0xB7830CA0, 4, 32, 0 }, + {0xB7830CC0, 4, 32, 0 }, + {0xB7830E00, 8, 32, 0 }, + {0xB7830E20, 16, 32, 0 }, + {0xB7840004, 64, 32, 0 }, + {0xB7840080, 12, 32, 0 }, + {0xB7840100, 36, 32, 0 }, + {0xB7840140, 40, 32, 0 }, + {0xB78401C0, 4, 32, 0 }, + {0xB78401E0, 96, 32, 0 }, + {0xB7840280, 4, 32, 0 }, + {0xB78402A0, 4, 32, 0 }, + {0xB7840300, 24, 32, 0 }, + {0xB7840400, 64, 32, 0 }, + {0xB7840480, 64, 32, 0 }, + {0xB7840600, 8, 32, 0 }, + {0xB7840640, 8, 32, 0 }, + {0xB7840680, 4, 32, 0 }, + {0xB7840EE4, 32, 32, 0 }, + {0xB7840FA0, 8, 32, 0 }, + {0xB7910020, 24, 32, 0 }, + {0xB7910080, 48, 32, 0 }, + {0xB7910300, 24, 32, 0 }, + {0xB7910400, 92, 32, 0 }, + {0xB7910800, 60, 32, 0 }, + {0xB7910FA0, 8, 32, 0 }, + {0xB7920000, 64, 32, 0 }, + {0xB79200A0, 32, 32, 0 }, + {0xB7920130, 20, 32, 0 }, + {0xB7920F00, 4, 32, 0 }, + {0xB7920FA0, 96, 32, 0 }, + {0xB7930000, 44, 32, 0 }, + {0xB79300F8, 8, 32, 0 }, + {0xB7930400, 24, 32, 0 }, + {0xB793047C, 4, 32, 0 }, + {0xB7930620, 24, 32, 0 }, + {0xB7930C00, 4, 32, 0 }, + {0xB7930C20, 4, 32, 0 }, + {0xB7930C40, 4, 32, 0 }, + {0xB7930C60, 4, 32, 0 }, + {0xB7930C80, 4, 32, 0 }, + {0xB7930CA0, 4, 32, 0 }, + {0xB7930CC0, 4, 32, 0 }, + {0xB7930E00, 8, 32, 0 }, + {0xB7930E20, 16, 32, 0 }, + {0xB7940004, 64, 32, 0 }, + {0xB7940080, 12, 32, 0 }, + {0xB7940100, 36, 32, 0 }, + {0xB7940140, 40, 32, 0 }, + {0xB79401C0, 4, 32, 0 }, + {0xB79401E0, 96, 32, 0 }, + {0xB7940280, 4, 32, 0 }, + {0xB79402A0, 4, 32, 0 }, + {0xB7940300, 24, 32, 0 }, + {0xB7940400, 64, 32, 0 }, + {0xB7940480, 64, 32, 0 }, + {0xB7940600, 8, 32, 0 }, + {0xB7940640, 8, 32, 0 }, + {0xB7940680, 4, 32, 0 }, + {0xB7940EE4, 32, 32, 0 }, + {0xB7940FA0, 8, 32, 0 }, + {0xB7A10020, 24, 32, 0 }, + {0xB7A10080, 48, 32, 0 }, + {0xB7A10300, 24, 32, 0 }, + {0xB7A10400, 92, 32, 0 }, + {0xB7A10800, 60, 32, 0 }, + {0xB7A10FA0, 8, 32, 0 }, + {0xB7A20000, 64, 32, 0 }, + {0xB7A200A0, 32, 32, 0 }, + {0xB7A20130, 20, 32, 0 }, + {0xB7A20F00, 4, 32, 0 }, + {0xB7A20FA0, 96, 32, 0 }, + {0xB7A30000, 44, 32, 0 }, + {0xB7A300F8, 8, 32, 0 }, + {0xB7A30400, 24, 32, 0 }, + {0xB7A3047C, 4, 32, 0 }, + {0xB7A30620, 24, 32, 0 }, + {0xB7A30C00, 4, 32, 0 }, + {0xB7A30C20, 4, 32, 0 }, + {0xB7A30C40, 4, 32, 0 }, + {0xB7A30C60, 4, 32, 0 }, + {0xB7A30C80, 4, 32, 0 }, + {0xB7A30CA0, 4, 32, 0 }, + {0xB7A30CC0, 4, 32, 0 }, + {0xB7A30E00, 8, 32, 0 }, + {0xB7A30E20, 16, 32, 0 }, + {0xB7A40004, 64, 32, 0 }, + {0xB7A40080, 12, 32, 0 }, + {0xB7A40100, 36, 32, 0 }, + {0xB7A40140, 40, 32, 0 }, + {0xB7A401C0, 4, 32, 0 }, + {0xB7A401E0, 96, 32, 0 }, + {0xB7A40280, 4, 32, 0 }, + {0xB7A402A0, 4, 32, 0 }, + {0xB7A40300, 24, 32, 0 }, + {0xB7A40400, 64, 32, 0 }, + {0xB7A40480, 64, 32, 0 }, + {0xB7A40600, 8, 32, 0 }, + {0xB7A40640, 8, 32, 0 }, + {0xB7A40680, 4, 32, 0 }, + {0xB7A40EE4, 32, 32, 0 }, + {0xB7A40FA0, 8, 32, 0 }, + {0xB7B10020, 24, 32, 0 }, + {0xB7B10080, 48, 32, 0 }, + {0xB7B10300, 24, 32, 0 }, + {0xB7B10400, 92, 32, 0 }, + {0xB7B10800, 60, 32, 0 }, + {0xB7B10FA0, 8, 32, 0 }, + {0xB7B20000, 64, 32, 0 }, + {0xB7B200A0, 32, 32, 0 }, + {0xB7B20130, 20, 32, 0 }, + {0xB7B20F00, 4, 32, 0 }, + {0xB7B20FA0, 96, 32, 0 }, + {0xB7B30000, 44, 32, 0 }, + {0xB7B300F8, 8, 32, 0 }, + {0xB7B30400, 24, 32, 0 }, + {0xB7B3047C, 4, 32, 0 }, + {0xB7B30620, 24, 32, 0 }, + {0xB7B30C00, 4, 32, 0 }, + {0xB7B30C20, 4, 32, 0 }, + {0xB7B30C40, 4, 32, 0 }, + {0xB7B30C60, 4, 32, 0 }, + {0xB7B30C80, 4, 32, 0 }, + {0xB7B30CA0, 4, 32, 0 }, + {0xB7B30CC0, 4, 32, 0 }, + {0xB7B30E00, 8, 32, 0 }, + {0xB7B30E20, 16, 32, 0 }, + {0xB7B40004, 64, 32, 0 }, + {0xB7B40080, 12, 32, 0 }, + {0xB7B40100, 36, 32, 0 }, + {0xB7B40140, 40, 32, 0 }, + {0xB7B401C0, 4, 32, 0 }, + {0xB7B401E0, 96, 32, 0 }, + {0xB7B40280, 4, 32, 0 }, + {0xB7B402A0, 4, 32, 0 }, + {0xB7B40300, 24, 32, 0 }, + {0xB7B40400, 64, 32, 0 }, + {0xB7B40480, 64, 32, 0 }, + {0xB7B40600, 8, 32, 0 }, + {0xB7B40640, 8, 32, 0 }, + {0xB7B40680, 4, 32, 0 }, + {0xB7B40EE4, 32, 32, 0 }, + {0xB7B40FA0, 8, 32, 0 }, + {0xB8000000, 4, 32, 0 }, + {0xB8001FD0, 60, 32, 0 }, + {0xB8003008, 4, 32, 0 }, + {0xB8004008, 4, 32, 0 }, + {0xB8005008, 4, 32, 0 }, + {0xB8006008, 4, 32, 0 }, + {0xB8007008, 4, 32, 0 }, + {0xB8008008, 4, 32, 0 }, + {0xB8009008, 4, 32, 0 }, + {0xB800A008, 4, 32, 0 }, + {0xB800B008, 4, 32, 0 }, + {0xB800C008, 4, 32, 0 }, + {0xB800D008, 4, 32, 0 }, + {0xB800E008, 4, 32, 0 }, + {0xB800F008, 4, 32, 0 }, + {0xB800F108, 4, 32, 0 }, + {0xB8010008, 4, 32, 0 }, + {0xB8011008, 4, 32, 0 }, + {0xB8011108, 4, 32, 0 }, + {0xB8012008, 4, 32, 0 }, + {0xB8012044, 4, 32, 0 }, + {0xB8013008, 4, 32, 0 }, + {0xB8014008, 4, 32, 0 }, + {0xB8042024, 4, 32, 0 }, + {0xB8042100, 12, 32, 0 }, + {0xB8043024, 4, 32, 0 }, + {0xB8043100, 12, 32, 0 }, + {0xB8044024, 4, 32, 0 }, + {0xB8044100, 12, 32, 0 }, + {0xB8045024, 4, 32, 0 }, + {0xB8045100, 12, 32, 0 }, + {0xB8046024, 4, 32, 0 }, + {0xB8046100, 12, 32, 0 }, + {0xB8047024, 4, 32, 0 }, + {0xB8047100, 12, 32, 0 }, + {0xB8048024, 4, 32, 0 }, + {0xB8048100, 12, 32, 0 }, + {0xB8049024, 4, 32, 0 }, + {0xB8049100, 12, 32, 0 }, + {0xB804A024, 4, 32, 0 }, + {0xB804A100, 12, 32, 0 }, + {0xB804B024, 4, 32, 0 }, + {0xB804B100, 12, 32, 0 }, + {0xB804C024, 4, 32, 0 }, + {0xB804C100, 12, 32, 0 }, + {0xB804D024, 4, 32, 0 }, + {0xB804D100, 12, 32, 0 }, + {0xB804E024, 4, 32, 0 }, + {0xB804E100, 12, 32, 0 }, + {0xB804F028, 4, 32, 0 }, + {0xB804F100, 12, 32, 0 }, + {0xB8050024, 4, 32, 0 }, + {0xB8050100, 12, 32, 0 }, + {0xB8100000, 12, 32, 0 }, + {0xB8100020, 8, 32, 0 }, + {0xB8100040, 28, 32, 0 }, + {0xB8100084, 68, 32, 0 }, + {0xB8100104, 68, 32, 0 }, + {0xB8100184, 68, 32, 0 }, + {0xB8100204, 68, 32, 0 }, + {0xB8100284, 68, 32, 0 }, + {0xB8100304, 68, 32, 0 }, + {0xB8100384, 68, 32, 0 }, + {0xB8100420, 544, 32, 0 }, + {0xB8100C08, 136, 32, 0 }, + {0xB8100D04, 68, 32, 0 }, + {0xB8100E08, 136, 32, 0 }, + {0xB8106100, 4348, 32, 0 }, + {0xB810E008, 136, 32, 0 }, + {0xB810E104, 68, 32, 0 }, + {0xB810F000, 4, 32, 0 }, + {0xB810FFD0, 48, 32, 0 }, + {0xB8110040, 28, 32, 0 }, + {0xB8120000, 44, 64, 0 }, + {0xB8120040, 44, 64, 0 }, + {0xB8120080, 44, 64, 0 }, + {0xB81200C0, 44, 64, 0 }, + {0xB8120100, 44, 64, 0 }, + {0xB8120140, 44, 64, 0 }, + {0xB8120180, 44, 64, 0 }, + {0xB81201C0, 44, 64, 0 }, + {0xB8120200, 44, 64, 0 }, + {0xB812E000, 4, 64, 0 }, + {0xB812E800, 12, 64, 0 }, + {0xB812FFBC, 68, 64, 0 }, + {0xB8130000, 20, 32, 0 }, + {0xB8130400, 20, 32, 0 }, + {0xB8130600, 20, 32, 0 }, + {0xB8130A00, 20, 32, 0 }, + {0xB8130C00, 4, 32, 0 }, + {0xB8130C20, 4, 32, 0 }, + {0xB8130C40, 4, 32, 0 }, + {0xB8130C60, 4, 32, 0 }, + {0xB8130C80, 4, 32, 0 }, + {0xB8130CC0, 4, 32, 0 }, + {0xB8130D88, 4, 32, 0 }, + {0xB8130E00, 8, 32, 0 }, + {0xB8130E50, 4, 32, 0 }, + {0xB8130FB8, 72, 32, 0 }, + {0xB8140000, 44, 32, 0 }, + {0xB814FFD0, 48, 32, 0 }, + {0xB8150080, 4, 32, 0 }, + {0xB8150100, 4, 32, 0 }, + {0xB8150180, 4, 32, 0 }, + {0xB8150200, 4, 32, 0 }, + {0xB8150280, 4, 32, 0 }, + {0xB8150300, 4, 32, 0 }, + {0xB8150380, 4, 32, 0 }, + {0xB8150400, 32, 32, 0 }, + {0xB8150C00, 8, 32, 0 }, + {0xB8150D00, 4, 32, 0 }, + {0xB8150E00, 4, 32, 0 }, + {0xB815C000, 20, 32, 0 }, + {0xB815F000, 8, 32, 0 }, + {0xB8160000, 44, 32, 0 }, + {0xB816FFD0, 48, 32, 0 }, + {0xB8170080, 4, 32, 0 }, + {0xB8170100, 4, 32, 0 }, + {0xB8170180, 4, 32, 0 }, + {0xB8170200, 4, 32, 0 }, + {0xB8170280, 4, 32, 0 }, + {0xB8170300, 4, 32, 0 }, + {0xB8170380, 4, 32, 0 }, + {0xB8170400, 32, 32, 0 }, + {0xB8170C00, 8, 32, 0 }, + {0xB8170D00, 4, 32, 0 }, + {0xB8170E00, 4, 32, 0 }, + {0xB817C000, 20, 32, 0 }, + {0xB817F000, 8, 32, 0 }, + {0xB8180000, 44, 32, 0 }, + {0xB818FFD0, 48, 32, 0 }, + {0xB8190080, 4, 32, 0 }, + {0xB8190100, 4, 32, 0 }, + {0xB8190180, 4, 32, 0 }, + {0xB8190200, 4, 32, 0 }, + {0xB8190280, 4, 32, 0 }, + {0xB8190300, 4, 32, 0 }, + {0xB8190380, 4, 32, 0 }, + {0xB8190400, 32, 32, 0 }, + {0xB8190C00, 8, 32, 0 }, + {0xB8190D00, 4, 32, 0 }, + {0xB8190E00, 4, 32, 0 }, + {0xB819C000, 20, 32, 0 }, + {0xB819F000, 8, 32, 0 }, + {0xB81A0000, 44, 32, 0 }, + {0xB81AFFD0, 48, 32, 0 }, + {0xB81B0080, 4, 32, 0 }, + {0xB81B0100, 4, 32, 0 }, + {0xB81B0180, 4, 32, 0 }, + {0xB81B0200, 4, 32, 0 }, + {0xB81B0280, 4, 32, 0 }, + {0xB81B0300, 4, 32, 0 }, + {0xB81B0380, 4, 32, 0 }, + {0xB81B0400, 32, 32, 0 }, + {0xB81B0C00, 8, 32, 0 }, + {0xB81B0D00, 4, 32, 0 }, + {0xB81B0E00, 4, 32, 0 }, + {0xB81BC000, 20, 32, 0 }, + {0xB81BF000, 8, 32, 0 }, + {0xB81C0000, 12, 32, 0 }, + {0xB81C0020, 8, 32, 0 }, + {0xB81C0040, 28, 32, 0 }, + {0xB81C0084, 68, 32, 0 }, + {0xB81C0104, 68, 32, 0 }, + {0xB81C0184, 68, 32, 0 }, + {0xB81C0204, 68, 32, 0 }, + {0xB81C0284, 68, 32, 0 }, + {0xB81C0304, 68, 32, 0 }, + {0xB81C0384, 68, 32, 0 }, + {0xB81C0420, 544, 32, 0 }, + {0xB81C0C08, 136, 32, 0 }, + {0xB81C0D04, 68, 32, 0 }, + {0xB81C0E08, 136, 32, 0 }, + {0xB81C6100, 4348, 32, 0 }, + {0xB81CE008, 136, 32, 0 }, + {0xB81CE104, 68, 32, 0 }, + {0xB81CF000, 4, 32, 0 }, + {0xB81CFFD0, 48, 32, 0 }, + {0xBC081030, 28, 32, 0 }, +}; + +const adrv904x_CpuRamMemDump_t adrv904x_DfeMemDumpTable[5] = +{ + {0x4D300000, 0x80000, 0x100, 0 }, + {0xC0000000, 0x200000, 0x101, 0 }, + {0xC0200000, 0x200000, 0x102, 0 }, + {0xC0400000, 0x200000, 0x103, 0 }, + {0xC0600000, 0x200000, 0x104, 0 }, +}; + +const adrv904x_EtmDumpValues_t adrv904x_DfeEtmMemDumpTable[4] = +{ + {0x1, 0xB7040000, 0x4, 0xC }, + {0x1, 0xB7140000, 0x4, 0xC }, + {0x1, 0xB7240000, 0x4, 0xC }, + {0x1, 0xB7340000, 0x4, 0xC }, +}; diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_rx.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_rx.c new file mode 100644 index 00000000000..4b2d180dee1 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_rx.c @@ -0,0 +1,8563 @@ +/** +* Copyright 2015 - 2023 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adrv904x_rx.c + * \brief Contains ADRV904X Rx related private function implementations + * + * ADRV904X API Version: 2.10.0.4 + */ + +#include "../../private/include/adrv904x_rx.h" +#include "../../private/bf/adrv904x_bf_core.h" +#include "../../private/bf/adrv904x_bf_rx_funcs.h" +#include "../../private/bf/adrv904x_bf_rx_ddc.h" +#include "../../private/bf/adrv904x_bf_orx_dig.h" +#include "../../private/bf/adrv904x_bf_rx_dig.h" +#include "../../private/bf/adrv904x_bf_pll_mem_map.h" +#include "../../private/include/adrv904x_init.h" +#include "../../private/include/adrv904x_gpio.h" +#include "../../private/include/adrv904x_cpu.h" + +#include "../../private/bf/adrv904x_bf_cddc_funcs.h" +#include "../../private/bf/adrv904x_bf_cddc_hb_dpath.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_RX + +static const adi_adrv904x_GpioSignal_e adrv904x_RxInternalSlicerOutputSignals[ADI_ADRV904X_MAX_RX_INT_SLICER_BITS] = { + ADI_ADRV904X_GPIO_SIGNAL_SLICER_POSITION_0, + ADI_ADRV904X_GPIO_SIGNAL_SLICER_POSITION_1, + ADI_ADRV904X_GPIO_SIGNAL_SLICER_POSITION_2, + ADI_ADRV904X_GPIO_SIGNAL_SLICER_POSITION_3 +}; + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxGainTableFormat(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxGainTableRow_t gainTablePtr[], + uint8_t formattedGainTablePtr[], + const uint16_t numGainIndicesInTable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + const uint32_t NUM_BYTES_PER_GAIN_TABLE_ENTRY = 8U; + const uint16_t DIG_GAIN_LSB_MASK = 0x00FFU; + const uint16_t DIG_GAIN_MSB_MASK = 0x0300U; + const uint8_t DIG_GAIN_MSB_SHIFT = 8U; + const uint16_t DIG_GAIN_SIGN_MASK = 0x0400U; + const uint8_t DIG_GAIN_SIGN_SHIFT = 8U; + const uint8_t RXFE_GAIN_LSB_MASK = 0x1FU; + const uint8_t RXFE_GAIN_LSB_SHIFT = 3U; + const uint8_t RXFE_GAIN_MSB_MASK = 0xE0U; + const uint8_t RXFE_GAIN_MSB_SHIFT = 5U; + const uint16_t PHASE_OFFSET_LSB_MASK = 0x00FFU; + const uint16_t PHASE_OFFSET_MSB_MASK = 0xFF00U; + const uint8_t PHASE_OFFSET_MSB_SHIFT = 8U; + const uint8_t EXT_CTRL_MASK = 0x03U; + + uint32_t gainIndex = 0U; + uint32_t formattedGainIndex = 0U; + uint16_t sign = 0U; + uint16_t magnitude = 0U; + + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, gainTablePtr); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, formattedGainTablePtr); + + /*Format gain table*/ + for (gainIndex = 0U; gainIndex < numGainIndicesInTable; ++gainIndex) + { + /*Format Gain Table Data as follows : + No. of Bytes per Gain Table Entry = 8 + @Addr 8 x gainIndex : {13'b0 , rx_fe_gain[7:0], dig_gain[10:0]} + @Addr 8 x gainIndex + 4 : {14'b0, ext_control[1:0], phase_offset[15:0]} + */ + formattedGainIndex = (gainIndex * NUM_BYTES_PER_GAIN_TABLE_ENTRY); + + if (gainTablePtr[gainIndex].digGain < 0) + { + sign = DIG_GAIN_SIGN_MASK; /* set bit 11 */ + magnitude = (((~(uint16_t)gainTablePtr[gainIndex].digGain) + 1U) & 0x3FFU); + } + else + { + sign = 0U; + magnitude = gainTablePtr[gainIndex].digGain & 0x3FFU; + } + + /* The Gain Table is in a '32b-only' region so must be written via Registers32bOnlyWrite() which treats data as uint32 + * and applies endianess conversion accordingly. So we layout the memory buffer differently depending on host endianess. */ +#if ADRV904X_LITTLE_ENDIAN + formattedGainTablePtr[formattedGainIndex] = (uint8_t)(magnitude & DIG_GAIN_LSB_MASK); + formattedGainTablePtr[formattedGainIndex + 1U] = (uint8_t)((sign & DIG_GAIN_SIGN_MASK) >> DIG_GAIN_SIGN_SHIFT) | + (uint8_t)((magnitude & DIG_GAIN_MSB_MASK) >> DIG_GAIN_MSB_SHIFT) | + (uint8_t)((gainTablePtr[gainIndex].rxFeGain & RXFE_GAIN_LSB_MASK) << RXFE_GAIN_LSB_SHIFT); + formattedGainTablePtr[formattedGainIndex + 2U] = (uint8_t)((gainTablePtr[gainIndex].rxFeGain & RXFE_GAIN_MSB_MASK) >> RXFE_GAIN_MSB_SHIFT); + formattedGainTablePtr[formattedGainIndex + 3U] = 0U; + formattedGainTablePtr[formattedGainIndex + 4U] = (uint8_t)(gainTablePtr[gainIndex].phaseOffset & PHASE_OFFSET_LSB_MASK); + formattedGainTablePtr[formattedGainIndex + 5U] = (uint8_t)((gainTablePtr[gainIndex].phaseOffset & PHASE_OFFSET_MSB_MASK) >> PHASE_OFFSET_MSB_SHIFT); + formattedGainTablePtr[formattedGainIndex + 6U] = (uint8_t)(gainTablePtr[gainIndex].extControl & EXT_CTRL_MASK); + formattedGainTablePtr[formattedGainIndex + 7U] = 0U; +#else + formattedGainTablePtr[formattedGainIndex + 3U] = (uint8_t)(magnitude & DIG_GAIN_LSB_MASK); + formattedGainTablePtr[formattedGainIndex + 2U] = (uint8_t)((sign & DIG_GAIN_SIGN_MASK) >> DIG_GAIN_SIGN_SHIFT) | + (uint8_t)((magnitude & DIG_GAIN_MSB_MASK) >> DIG_GAIN_MSB_SHIFT) | + (uint8_t)((gainTablePtr[gainIndex].rxFeGain & RXFE_GAIN_LSB_MASK) << RXFE_GAIN_LSB_SHIFT); + formattedGainTablePtr[formattedGainIndex + 1U] = (uint8_t)((gainTablePtr[gainIndex].rxFeGain & RXFE_GAIN_MSB_MASK) >> RXFE_GAIN_MSB_SHIFT); + formattedGainTablePtr[formattedGainIndex] = 0U; + formattedGainTablePtr[formattedGainIndex + 7U] = (uint8_t)(gainTablePtr[gainIndex].phaseOffset & PHASE_OFFSET_LSB_MASK); + formattedGainTablePtr[formattedGainIndex + 6U] = (uint8_t)((gainTablePtr[gainIndex].phaseOffset & PHASE_OFFSET_MSB_MASK) >> PHASE_OFFSET_MSB_SHIFT); + formattedGainTablePtr[formattedGainIndex + 5U] = (uint8_t)(gainTablePtr[gainIndex].extControl & EXT_CTRL_MASK); + formattedGainTablePtr[formattedGainIndex + 4U] = 0U; +#endif + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxGainTableReadParamsCompute(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + const uint32_t maxReadGainIndices, + const uint8_t gainIndexOffset, + uint16_t* const numGainIndicesToRead, + uint32_t* const baseAddr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + const uint32_t NUM_BYTES_PER_RX_GAIN_INDEX = 8U; + + uint16_t maxGainIndices = 0U; + uint32_t baseIndex = 0U; + int32_t rxChannelIndex = 0U; + uint8_t minGainIndex = 0U; + + const uint32_t rxGainTableBaseAddr[] = + { + ADI_ADRV904X_RX0_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX1_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX2_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX3_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX4_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX5_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX6_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX7_GAIN_TABLE_BASEADDR + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numGainIndicesToRead); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, baseAddr); + + switch (rxChannel) + { + case ADI_ADRV904X_RX0: + rxChannelIndex = 0U; + minGainIndex = device->devStateInfo.gainIndexes.rx0MinGainIndex; + break; + + case ADI_ADRV904X_RX1: + rxChannelIndex = 1U; + minGainIndex = device->devStateInfo.gainIndexes.rx1MinGainIndex; + break; + + case ADI_ADRV904X_RX2: + rxChannelIndex = 2U; + minGainIndex = device->devStateInfo.gainIndexes.rx2MinGainIndex; + break; + + case ADI_ADRV904X_RX3: + rxChannelIndex = 3U; + minGainIndex = device->devStateInfo.gainIndexes.rx3MinGainIndex; + break; + + case ADI_ADRV904X_RX4: + rxChannelIndex = 4U; + minGainIndex = device->devStateInfo.gainIndexes.rx4MinGainIndex; + break; + + case ADI_ADRV904X_RX5: + rxChannelIndex = 5U; + minGainIndex = device->devStateInfo.gainIndexes.rx5MinGainIndex; + break; + + case ADI_ADRV904X_RX6: + rxChannelIndex = 6U; + minGainIndex = device->devStateInfo.gainIndexes.rx6MinGainIndex; + break; + + case ADI_ADRV904X_RX7: + rxChannelIndex = 7U; + minGainIndex = device->devStateInfo.gainIndexes.rx7MinGainIndex; + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChannel, + "Invalid Rx Channel Requested for gain table read. Valid Rx channels include Rx0-Rx7."); + return recoveryAction; + break; + } + + maxGainIndices = (gainIndexOffset - minGainIndex) + 1U; + + if (maxReadGainIndices >= maxGainIndices) + { + *numGainIndicesToRead = maxGainIndices; + } + else + { + *numGainIndicesToRead = maxReadGainIndices; + } + + baseIndex = (gainIndexOffset - (*numGainIndicesToRead - 1U)); + *baseAddr = (uint32_t)rxGainTableBaseAddr[rxChannelIndex] + (baseIndex * NUM_BYTES_PER_RX_GAIN_INDEX); + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxGainTableParse(adi_adrv904x_Device_t* const device, + adi_adrv904x_RxGainTableRow_t gainTablePtr[], + const uint8_t cpuDmaDataGainTablePtr[], + const uint16_t numGainIndicesInTable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + const uint32_t NUM_BYTES_PER_GAIN_TABLE_ENTRY = 8U; + const uint16_t DIG_GAIN_MSB_MASK = 0x0003U; + const uint8_t DIG_GAIN_MSB_SHIFT = 8U; + const uint8_t RXFE_GAIN_LSB_MASK = 0xF8U; + const uint8_t RXFE_GAIN_LSB_SHIFT = 3U; + const uint8_t RXFE_GAIN_MSB_MASK = 0x07U; + const uint8_t RXFE_GAIN_MSB_SHIFT = 5U; + const uint8_t PHASE_OFFSET_MSB_SHIFT = 8U; + const uint8_t EXT_CTRL_MASK = 0x03U; + /*11th bit for digital gain is the sign bit*/ + const uint8_t DIG_GAIN_SIGN_MASK = 0x04U; + const int16_t DIG_GAIN_SIGN_EXT = (int16_t)0xFC00; + + uint32_t gainIndex = 0U; + uint32_t cpuDmaDataGainIndex = 0U; + int16_t digGain = 0; + uint16_t magnitude = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, gainTablePtr); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cpuDmaDataGainTablePtr); + + /*Parse Gain Table Data in ARM DMA format and store it in gain table row struct*/ + for (gainIndex = 0U; gainIndex < numGainIndicesInTable; ++gainIndex) + { + /*Parse Gain Table Data : + No. of Bytes per Gain Table Entry = 8 + @cpuDmaDataGainIndex[8 x gainIndex] : {13'b0 , rx_fe_gain[7:0], dig_gain[10:0]} + @cpuDmaDataGainIndex[8 x gainIndex + 4]: {14'b0, ext_control[1:0], phase_offset[15:0]} + */ + cpuDmaDataGainIndex = (gainIndex * NUM_BYTES_PER_GAIN_TABLE_ENTRY); + + magnitude = ((uint16_t)cpuDmaDataGainTablePtr[cpuDmaDataGainIndex] | + (((uint16_t)cpuDmaDataGainTablePtr[cpuDmaDataGainIndex + 1] & DIG_GAIN_MSB_MASK) << DIG_GAIN_MSB_SHIFT)); + if ((cpuDmaDataGainTablePtr[cpuDmaDataGainIndex + 1] & DIG_GAIN_SIGN_MASK) == DIG_GAIN_SIGN_MASK) + { + /*Since digGain is a 11bit no. for ARM, 11th bit is the signed bit. However since it is of signed half word type for API use, hence has to be sign extended*/ + digGain = (int16_t)(~(uint16_t)(magnitude - 1U)); + digGain |= DIG_GAIN_SIGN_EXT; + } + else + { + digGain = (int16_t)magnitude; + } + + gainTablePtr[gainIndex].digGain = digGain; + gainTablePtr[gainIndex].rxFeGain = (((uint8_t)cpuDmaDataGainTablePtr[cpuDmaDataGainIndex + 1] & RXFE_GAIN_LSB_MASK) >> RXFE_GAIN_LSB_SHIFT) | + (((uint8_t)cpuDmaDataGainTablePtr[cpuDmaDataGainIndex + 2] & RXFE_GAIN_MSB_MASK) << RXFE_GAIN_MSB_SHIFT); + gainTablePtr[gainIndex].phaseOffset = (uint16_t)cpuDmaDataGainTablePtr[cpuDmaDataGainIndex + 4] | + ((uint16_t)cpuDmaDataGainTablePtr[cpuDmaDataGainIndex + 5] << PHASE_OFFSET_MSB_SHIFT); + gainTablePtr[gainIndex].extControl = (uint8_t)cpuDmaDataGainTablePtr[cpuDmaDataGainIndex + 6] & EXT_CTRL_MASK; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxGainSetRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxGain_t rxGain[], + const uint32_t arraySize) +{ + static const uint32_t ALL_RX_MASK = (uint32_t)(ADI_ADRV904X_RX0 | ADI_ADRV904X_RX1 | ADI_ADRV904X_RX2 | ADI_ADRV904X_RX3 | ADI_ADRV904X_RX4 | ADI_ADRV904X_RX5 | ADI_ADRV904X_RX6 | ADI_ADRV904X_RX7); + + uint32_t configIndex = 0U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /*Check for null rxGain pointer*/ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxGain); + + /*Check that no. of Rx gain settings is valid*/ + if (arraySize == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + arraySize, + "Parameter arraySize set to 0. Minimum no. of configs should be at least 1"); + return recoveryAction; + } + + /*Range check manual gain index setting for the requested channel*/ + for (configIndex = 0U; configIndex < arraySize; ++configIndex) + { + + /*Check that rxChannelMask is not out of range*/ + if ((rxGain[configIndex].rxChannelMask == 0U) || (rxGain[configIndex].rxChannelMask > ALL_RX_MASK)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxGain[configIndex].rxChannelMask, + "Invalid Rx Channel Mask encountered for manual rx gain index setting"); + return recoveryAction; + } + + /*Check that Rx profile is valid*/ + if ((rxGain[configIndex].rxChannelMask & ALL_RX_MASK) > 0U) + { + if ((device->devStateInfo.profilesValid & ADI_ADRV904X_RX_PROFILE_VALID) == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxGain[configIndex].rxChannelMask, + "Rx gain index set requested for an Rx Channel but Rx profile is invalid in the device structure"); + return recoveryAction; + } + } + + /*Check that rxChannelMask is not out of range*/ + if (rxGain[configIndex].rxChannelMask > (ALL_RX_MASK)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxGain[configIndex].rxChannelMask, + "Invalid Rx Channel Mask encountered for manual rx gain index setting"); + return recoveryAction; + } + + /*Check that gain indices are within range for the channel selected*/ + if ((rxGain[configIndex].rxChannelMask & (uint32_t)ADI_ADRV904X_RX0) == (uint32_t)ADI_ADRV904X_RX0) + { + if ((rxGain[configIndex].gainIndex > device->devStateInfo.gainIndexes.rx0MaxGainIndex) || + (rxGain[configIndex].gainIndex < device->devStateInfo.gainIndexes.rx0MinGainIndex)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxGain[configIndex].gainIndex, + "Rx0 manual gain index setting is out of range"); + return recoveryAction; + } + } + + if ((rxGain[configIndex].rxChannelMask & (uint32_t)ADI_ADRV904X_RX1) == (uint32_t)ADI_ADRV904X_RX1) + { + if ((rxGain[configIndex].gainIndex > device->devStateInfo.gainIndexes.rx1MaxGainIndex) || + (rxGain[configIndex].gainIndex < device->devStateInfo.gainIndexes.rx1MinGainIndex)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxGain[configIndex].gainIndex, + "Rx1 manual gain index setting is out of range"); + return recoveryAction; + } + } + + if ((rxGain[configIndex].rxChannelMask & (uint32_t)ADI_ADRV904X_RX2) == (uint32_t)ADI_ADRV904X_RX2) + { + if ((rxGain[configIndex].gainIndex > device->devStateInfo.gainIndexes.rx2MaxGainIndex) || + (rxGain[configIndex].gainIndex < device->devStateInfo.gainIndexes.rx2MinGainIndex)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxGain[configIndex].gainIndex, + "Rx2 manual gain index setting is out of range"); + return recoveryAction; + } + } + + if ((rxGain[configIndex].rxChannelMask & (uint32_t)ADI_ADRV904X_RX3) == (uint32_t)ADI_ADRV904X_RX3) + { + if ((rxGain[configIndex].gainIndex > device->devStateInfo.gainIndexes.rx3MaxGainIndex) || + (rxGain[configIndex].gainIndex < device->devStateInfo.gainIndexes.rx3MinGainIndex)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxGain[configIndex].gainIndex, + "Rx3 manual gain index setting is out of range"); + return recoveryAction; + } + } + + + /*Check that gain indices are within range for the channel selected*/ + if ((rxGain[configIndex].rxChannelMask & (uint32_t)ADI_ADRV904X_RX4) == (uint32_t)ADI_ADRV904X_RX4) + { + if ((rxGain[configIndex].gainIndex > device->devStateInfo.gainIndexes.rx4MaxGainIndex) || + (rxGain[configIndex].gainIndex < device->devStateInfo.gainIndexes.rx4MinGainIndex)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxGain[configIndex].gainIndex, + "Rx4 manual gain index setting is out of range"); + return recoveryAction; + } + } + + if ((rxGain[configIndex].rxChannelMask & (uint32_t)ADI_ADRV904X_RX5) == (uint32_t)ADI_ADRV904X_RX5) + { + if ((rxGain[configIndex].gainIndex > device->devStateInfo.gainIndexes.rx5MaxGainIndex) || + (rxGain[configIndex].gainIndex < device->devStateInfo.gainIndexes.rx5MinGainIndex)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxGain[configIndex].gainIndex, + "Rx5 manual gain index setting is out of range"); + return recoveryAction; + } + } + + if ((rxGain[configIndex].rxChannelMask & (uint32_t)ADI_ADRV904X_RX6) == (uint32_t)ADI_ADRV904X_RX6) + { + if ((rxGain[configIndex].gainIndex > device->devStateInfo.gainIndexes.rx6MaxGainIndex) || + (rxGain[configIndex].gainIndex < device->devStateInfo.gainIndexes.rx6MinGainIndex)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxGain[configIndex].gainIndex, + "Rx6 manual gain index setting is out of range"); + return recoveryAction; + } + } + + if ((rxGain[configIndex].rxChannelMask & (uint32_t)ADI_ADRV904X_RX7) == (uint32_t)ADI_ADRV904X_RX7) + { + if ((rxGain[configIndex].gainIndex > device->devStateInfo.gainIndexes.rx7MaxGainIndex) || + (rxGain[configIndex].gainIndex < device->devStateInfo.gainIndexes.rx7MinGainIndex)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxGain[configIndex].gainIndex, + "Rx7 manual gain index setting is out of range"); + return recoveryAction; + } + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxGainGetRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_RxGain_t* const rxGain) +{ + static const uint32_t ALL_RX_MASK = (uint32_t)(ADI_ADRV904X_RX0 | ADI_ADRV904X_RX1 | ADI_ADRV904X_RX2 | ADI_ADRV904X_RX3 | ADI_ADRV904X_RX4 | ADI_ADRV904X_RX5 | ADI_ADRV904X_RX6 | ADI_ADRV904X_RX7); + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /*Check for null rxGain pointer*/ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxGain); + + /*Check that the requested rxChannel is valid*/ + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "Invalid Rx Channel Requested for rx gain read"); + return recoveryAction; + } + + /*Check that rx profile is valid in current config*/ + if (((uint32_t)rxChannel & ALL_RX_MASK) > 0U) + { + if ((device->devStateInfo.profilesValid & ADI_ADRV904X_RX_PROFILE_VALID) == 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "Gain index read requested for an Rx channel but Rx profile is invalid in device structure"); + return recoveryAction; + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adrv904x_BfRxChanAddr_e* const rxChannelBitfieldAddr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check rx bitfield channel address pointer is not null */ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxChannelBitfieldAddr); + + if ((device->devStateInfo.initializedChannels & (uint32_t)rxChannel) == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + NULL, + "Channel not in device initializedChannels for adrv904x_RxBitfieldAddressGet() function"); + return recoveryAction; + } + + switch (rxChannel) + { + case ADI_ADRV904X_RX0: + *rxChannelBitfieldAddr = ADRV904X_BF_RX_CH0; + break; + + case ADI_ADRV904X_RX1: + *rxChannelBitfieldAddr = ADRV904X_BF_RX_CH1; + break; + + case ADI_ADRV904X_RX2: + *rxChannelBitfieldAddr = ADRV904X_BF_RX_CH2; + break; + + case ADI_ADRV904X_RX3: + *rxChannelBitfieldAddr = ADRV904X_BF_RX_CH3; + break; + + case ADI_ADRV904X_RX4: + *rxChannelBitfieldAddr = ADRV904X_BF_RX_CH4; + break; + + case ADI_ADRV904X_RX5: + *rxChannelBitfieldAddr = ADRV904X_BF_RX_CH5; + break; + + case ADI_ADRV904X_RX6: + *rxChannelBitfieldAddr = ADRV904X_BF_RX_CH6; + break; + + case ADI_ADRV904X_RX7: + *rxChannelBitfieldAddr = ADRV904X_BF_RX_CH7; + break; + + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "Invalid rxChannel parameter for adrv904x_RxBitfieldAddressGet() function"); + return recoveryAction; + } + } + + return ADI_ADRV904X_ERR_ACT_NONE; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adrv904x_BfOrxDigChanAddr_e* const orxChannelBitfieldAddr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check rx bitfield channel address pointer is not null */ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, orxChannelBitfieldAddr); + + if ((device->devStateInfo.initializedChannels & (uint32_t)rxChannel) == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + NULL, + "Channel not in device initializedChannels for adrv904x_OrxBitfieldAddressGet() function"); + return recoveryAction; + } + + switch (rxChannel) + { + case ADI_ADRV904X_ORX0: + *orxChannelBitfieldAddr = ADRV904X_BF_SLICE_ORX_0__ORX_DIG; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + + case ADI_ADRV904X_ORX1: + *orxChannelBitfieldAddr = ADRV904X_BF_SLICE_ORX_1__ORX_DIG; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "Invalid rxChannel parameter for adrv904x_RxBitfieldAddressGet() function"); + return recoveryAction; + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxAnalogBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adrv904x_BfTdrDpathTopChanAddr_e* const rxAnalogChannelIBitfieldAddr, + adrv904x_BfTdrDpathTopChanAddr_e* const rxAnalogChannelQBitfieldAddr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check rx bitfield I channel address pointer is not null */ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxAnalogChannelIBitfieldAddr); + + /* Check rx bitfield Q channel address pointer is not null */ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxAnalogChannelQBitfieldAddr); + + if ((device->devStateInfo.initializedChannels & (uint32_t)rxChannel) == 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + NULL, + "Channel not in device initializedChannels"); + return recoveryAction; + } + + switch (rxChannel) + { + case ADI_ADRV904X_RX0: + *rxAnalogChannelIBitfieldAddr = ADRV904X_BF_SLICE_RX_0__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_; + *rxAnalogChannelQBitfieldAddr = ADRV904X_BF_SLICE_RX_0__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_; + break; + + case ADI_ADRV904X_RX1: + *rxAnalogChannelIBitfieldAddr = ADRV904X_BF_SLICE_RX_1__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_; + *rxAnalogChannelQBitfieldAddr = ADRV904X_BF_SLICE_RX_1__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_; + break; + + case ADI_ADRV904X_RX2: + *rxAnalogChannelIBitfieldAddr = ADRV904X_BF_SLICE_RX_2__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_; + *rxAnalogChannelQBitfieldAddr = ADRV904X_BF_SLICE_RX_2__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_; + break; + case ADI_ADRV904X_RX3: + *rxAnalogChannelIBitfieldAddr = ADRV904X_BF_SLICE_RX_3__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_; + *rxAnalogChannelQBitfieldAddr = ADRV904X_BF_SLICE_RX_3__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_; + break; + + case ADI_ADRV904X_RX4: + *rxAnalogChannelIBitfieldAddr = ADRV904X_BF_SLICE_RX_4__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_; + *rxAnalogChannelQBitfieldAddr = ADRV904X_BF_SLICE_RX_4__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_; + break; + + case ADI_ADRV904X_RX5: + *rxAnalogChannelIBitfieldAddr = ADRV904X_BF_SLICE_RX_5__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_; + *rxAnalogChannelQBitfieldAddr = ADRV904X_BF_SLICE_RX_5__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_; + break; + + case ADI_ADRV904X_RX6: + *rxAnalogChannelIBitfieldAddr = ADRV904X_BF_SLICE_RX_6__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_; + *rxAnalogChannelQBitfieldAddr = ADRV904X_BF_SLICE_RX_6__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_; + break; + + case ADI_ADRV904X_RX7: + *rxAnalogChannelIBitfieldAddr = ADRV904X_BF_SLICE_RX_7__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_; + *rxAnalogChannelQBitfieldAddr = ADRV904X_BF_SLICE_RX_7__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_; + break; + + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChannel, + "Invalid rxChannel parameter "); + return recoveryAction; + } + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxFuncsBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adrv904x_BfRxFuncsChanAddr_e* const rxFuncsChannelBitfieldAddr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check rx bitfield channel address pointer is not null */ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxFuncsChannelBitfieldAddr); + + if ((device->devStateInfo.initializedChannels & (uint32_t)rxChannel) == 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + NULL, + "Channel not in device initializedChannels"); + return recoveryAction; + } + + switch (rxChannel) + { + case ADI_ADRV904X_RX0: + *rxFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_0__RX_FUNCS; + break; + + case ADI_ADRV904X_RX1: + *rxFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_1__RX_FUNCS; + break; + + case ADI_ADRV904X_RX2: + *rxFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_2__RX_FUNCS; + break; + case ADI_ADRV904X_RX3: + *rxFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_3__RX_FUNCS; + break; + + case ADI_ADRV904X_RX4: + *rxFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_4__RX_FUNCS; + break; + + case ADI_ADRV904X_RX5: + *rxFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_5__RX_FUNCS; + break; + + case ADI_ADRV904X_RX6: + *rxFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_6__RX_FUNCS; + break; + + case ADI_ADRV904X_RX7: + *rxFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_7__RX_FUNCS; + break; + + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChannel, + "Invalid rxChannel parameter "); + return recoveryAction; + } + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDdcBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + const adi_adrv904x_RxDdcs_e ddcBand, + adrv904x_BfRxDdcChanAddr_e* const rxDdcBitfieldAddr) +{ + static const adrv904x_BfRxDdcChanAddr_e mapArr[ADI_ADRV904X_MAX_RX_ONLY][ADI_ADRV904X_MAX_RX_DDC_BANDS] = + { + { ADRV904X_BF_SLICE_RX_0__RX_DDC_0_, ADRV904X_BF_SLICE_RX_0__RX_DDC_1_ }, + { ADRV904X_BF_SLICE_RX_1__RX_DDC_0_, ADRV904X_BF_SLICE_RX_1__RX_DDC_1_ }, + { ADRV904X_BF_SLICE_RX_2__RX_DDC_0_, ADRV904X_BF_SLICE_RX_2__RX_DDC_1_ }, + { ADRV904X_BF_SLICE_RX_3__RX_DDC_0_, ADRV904X_BF_SLICE_RX_3__RX_DDC_1_ }, + { ADRV904X_BF_SLICE_RX_4__RX_DDC_0_, ADRV904X_BF_SLICE_RX_4__RX_DDC_1_ }, + { ADRV904X_BF_SLICE_RX_5__RX_DDC_0_, ADRV904X_BF_SLICE_RX_5__RX_DDC_1_ }, + { ADRV904X_BF_SLICE_RX_6__RX_DDC_0_, ADRV904X_BF_SLICE_RX_6__RX_DDC_1_ }, + { ADRV904X_BF_SLICE_RX_7__RX_DDC_0_, ADRV904X_BF_SLICE_RX_7__RX_DDC_1_ } + }; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t rxIdx = 0U; + uint32_t bandIdx = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check rx bitfield channel address pointer is not null */ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxDdcBitfieldAddr); + + if ((device->devStateInfo.initializedChannels & (uint32_t)rxChannel) == 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + NULL, + "Channel not in device initialized Channels"); + return recoveryAction; + } + + /* Get rx channel idx from enum */ + switch (rxChannel) + { + case ADI_ADRV904X_RX0: + rxIdx = 0U; + break; + case ADI_ADRV904X_RX1: + rxIdx = 1U; + break; + case ADI_ADRV904X_RX2: + rxIdx = 2U; + break; + case ADI_ADRV904X_RX3: + rxIdx = 3U; + break; + case ADI_ADRV904X_RX4: + rxIdx = 4U; + break; + case ADI_ADRV904X_RX5: + rxIdx = 5U; + break; + case ADI_ADRV904X_RX6: + rxIdx = 6U; + break; + case ADI_ADRV904X_RX7: + rxIdx = 7U; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "Invalid rxChannel parameter"); + return recoveryAction; + } + + /* Get ddc band idx from enum */ + switch (ddcBand) + { + case ADI_ADRV904X_RX_DDC_BAND0: + bandIdx = 0U; + break; + case ADI_ADRV904X_RX_DDC_BAND1: + bandIdx = 1U; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + ddcBand, + "Invalid RX DDC band parameter. Must be Band0 or Band1."); + return recoveryAction; + } + + /* Get base address for this rx channel and ddc band combo */ + *rxDdcBitfieldAddr = mapArr[rxIdx][bandIdx]; + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatSet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxDataFormatRt_t rxDataFormat[], + const uint32_t arraySize) +{ + static const uint8_t GAIN_COMP_EXT_LNA_DISABLE = 0U; + static const uint8_t GAIN_COMP_TEMP_DISABLE = 0U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t intDataResolution = 0U; + uint8_t intDataFormat = 0U; + uint32_t tmpMask = 0U; + uint32_t configIdx = 0U; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxDataFormat); + + /* Range Check inputs */ +#if ADI_ADRV904X_RX_RANGE_CHECK > 0 + recoveryAction = adrv904x_RxDataFormatSetRangeCheck(device, rxDataFormat, arraySize); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxDataFormat range check failure."); + return recoveryAction; + } +#endif + + /* Iterate over arraySize elements of rxDataFormat */ + for ( configIdx = 0U; configIdx < arraySize; configIdx++ ) + { + + switch (rxDataFormat[configIdx].rxDataFormat.formatSelect) + { + + /*If Floating Point mode selected, Configure floating point*/ + case ADI_ADRV904X_GAIN_WITH_FLOATING_POINT: + recoveryAction = adrv904x_RxDataFormatFloatingPointSet( device, + rxDataFormat[configIdx].rxChannelMask, + &rxDataFormat[configIdx].rxDataFormat.floatingPointConfig); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error setting RxDataFormat floatingPointConfig"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxGainCompExtLnaSet(device, + rxDataFormat[configIdx].rxChannelMask, + rxDataFormat[configIdx].rxDataFormat.externalLnaGain); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error setting RxGainCompExtLna"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxGainCompTempEnableSet(device, + rxDataFormat[configIdx].rxChannelMask, + rxDataFormat[configIdx].rxDataFormat.tempCompensationEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error setting RxGainCompTempEnable"); + return recoveryAction; + } + break; + + /* Integer and slicer config settings */ + case ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_NOGPIO: + case ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_2PIN_MODE: + case ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_3PIN_MODE: + case ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_4PIN_MODE: + recoveryAction = adrv904x_RxDataFormatIntegerSet(device, + rxDataFormat[configIdx].rxChannelMask, + rxDataFormat[configIdx].rxDataFormat.formatSelect, + &rxDataFormat[configIdx].rxDataFormat.integerConfigSettings, + &rxDataFormat[configIdx].rxDataFormat.slicerConfigSettings); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error setting RxDataFormat integerConfigSettings and slicerConfigSettings"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxGainCompExtLnaSet(device, + rxDataFormat[configIdx].rxChannelMask, + rxDataFormat[configIdx].rxDataFormat.externalLnaGain); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error setting RxGainCompExtLna"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxGainCompTempEnableSet(device, + rxDataFormat[configIdx].rxChannelMask, + rxDataFormat[configIdx].rxDataFormat.tempCompensationEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error setting RxGainCompTempEnable"); + return recoveryAction; + } + break; + + /* Embedded overload indicator settings */ + case ADI_ADRV904X_EMBED_OVERLOAD_MONITOR_DATA: + recoveryAction = adrv904x_RxDataFormatEmbOvldMonitorSet(device, + rxDataFormat[configIdx].rxChannelMask, + &rxDataFormat[configIdx].rxDataFormat.embOvldMonitorSettings); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error setting RxDataFormat embOvldMonitorSettings"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxGainCompExtLnaSet(device, + rxDataFormat[configIdx].rxChannelMask, + rxDataFormat[configIdx].rxDataFormat.externalLnaGain); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error setting RxGainCompExtLna"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxGainCompTempEnableSet(device, + rxDataFormat[configIdx].rxChannelMask, + rxDataFormat[configIdx].rxDataFormat.tempCompensationEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error setting RxGainCompTempEnable"); + return recoveryAction; + } + break; + + /* If gain compensation disable is requested set integer formatter regs to default */ + case ADI_ADRV904X_GAIN_COMPENSATION_DISABLED: + /* Resolve Sample Resolution and format */ + recoveryAction = adrv904x_RxIntSampleResFormatResolve(device, + &rxDataFormat[configIdx].rxDataFormat.integerConfigSettings, + &intDataResolution, + &intDataFormat); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error resolving RxIntSampleResFormat"); + return recoveryAction; + } + + /* Disable gain compensation and reset the formatter settings to default */ + recoveryAction = adrv904x_RxDataFormatGainCompDisable(device, + rxDataFormat[configIdx].rxChannelMask, + intDataFormat, + intDataResolution); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error disabling RxDataFormatGainComp"); + return recoveryAction; + } + + /* Disable Gain Comp by tmp and ext lna, but only applicable for Rx Channels */ + tmpMask = rxDataFormat[configIdx].rxChannelMask & ADI_ADRV904X_RX_MASK_ALL; + recoveryAction = adrv904x_RxGainCompTempEnableSet(device, + tmpMask, + GAIN_COMP_TEMP_DISABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error setting RxGainCompTempEnable"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxGainCompExtLnaSet(device, + tmpMask, + GAIN_COMP_EXT_LNA_DISABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error setting RxGainCompExtLna"); + return recoveryAction; + } + break; + + /* If External Slicer mode is selected, throw an error */ + /* Other modes, throw an error */ + case ADI_ADRV904X_GAIN_WITH_EXTERNAL_SLICER: + default: + ADI_ADRV904X_API_NOT_IMPLEMENTED_REPORT_RETURN(&device->common); + break; + } + + /* Always enable ORx0/1 6dB Gain enable in ORx Data formatter to account for 6dB loss in ORx ADC NCO */ + /* only write if ORx0/1 channel mask set */ + if((rxDataFormat[configIdx].rxChannelMask & ADI_ADRV904X_ORX0) == ADI_ADRV904X_ORX0) + { + recoveryAction = adrv904x_OrxDig_Orx6dbGainEnable_BfSet(device, NULL, ADRV904X_BF_SLICE_ORX_0__ORX_DIG, 1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + } + + /* Always enable ORx0/1 6dB Gain enable in ORx Data formatter to account for 6dB loss in ORx ADC NCO */ + /* only write if ORx0/1 channel mask set */ + if ((rxDataFormat[configIdx].rxChannelMask & ADI_ADRV904X_ORX1) == ADI_ADRV904X_ORX1) + { + recoveryAction = adrv904x_OrxDig_Orx6dbGainEnable_BfSet(device, NULL, ADRV904X_BF_SLICE_ORX_1__ORX_DIG, 1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + } + + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatSetRangeCheck(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxDataFormatRt_t rxDataFormat[], + const uint32_t arraySize) +{ + static const uint32_t ALL_RX_MASK = (uint32_t)(ADI_ADRV904X_RX0 | ADI_ADRV904X_RX1 | ADI_ADRV904X_RX2 | ADI_ADRV904X_RX3 | + ADI_ADRV904X_RX4 | ADI_ADRV904X_RX5 | ADI_ADRV904X_RX6 | ADI_ADRV904X_RX7); + static const uint32_t ALL_ORX_MASK = (uint32_t)(ADI_ADRV904X_ORX0 | ADI_ADRV904X_ORX1); + static const uint32_t MINIMUM_NUM_FORMATTERS = 1U; + static const uint32_t MAXIMUM_NUM_FORMATTERS = 10U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t configIdx = 0U; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxDataFormat); + + /* Verify that arraySize is > 1 and <= the maximum number of unique formatters. */ + /* If not, throw an error indicating whether the minimum or maximum was exceeded. */ + if (arraySize < MINIMUM_NUM_FORMATTERS) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, recoveryAction, arraySize, "Invalid number of Rx formatters. Less than minimum allowed"); + return recoveryAction; + } + if (arraySize > MAXIMUM_NUM_FORMATTERS) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, recoveryAction, arraySize, "Invalid number of Rx formatters. Exceeded than maximum allowed"); + return recoveryAction; + } + + /* Iterate over arraySize elements of rxDataFormat */ + for ( configIdx = 0U; configIdx < arraySize; configIdx++ ) + { + /* Verify that the rxChannelMask field is not empty. */ + if (rxDataFormat[configIdx].rxChannelMask == ADI_ADRV904X_RXOFF) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + device->devStateInfo.profilesValid, + "Empty Rx channel mask selected for Rx data format configuration"); + return recoveryAction; + } + + /* If any RX channels are selected, verify that the RX profile is marked valid in the device profilesValid field. */ + if (((rxDataFormat[configIdx].rxChannelMask & ALL_RX_MASK) > 0U) && + ((device->devStateInfo.profilesValid & ADI_ADRV904X_RX_PROFILE_VALID) != ADI_ADRV904X_RX_PROFILE_VALID)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + device->devStateInfo.profilesValid, + "Rx channel selected for Rx data format configuration but Rx profile is invalid"); + return recoveryAction; + } + + /* If any ORX channels are selected: */ + if ( (rxDataFormat[configIdx].rxChannelMask & ALL_ORX_MASK) > 0U ) + { + /* Verify that the ORX profile is marked valid in the device profilesValid field. */ + if ( (device->devStateInfo.profilesValid & ADI_ADRV904X_ORX_PROFILE_VALID) != ADI_ADRV904X_ORX_PROFILE_VALID ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + device->devStateInfo.profilesValid, + "ORx channel selected for Rx data format configuration but ORx profile is invalid"); + + return recoveryAction; + } + + /* Verify that the ORX profile has formatSelect = ADI_ADRV904X_GAIN_COMPENSATION_DISABLED. */ + if (rxDataFormat[configIdx].rxDataFormat.formatSelect != ADI_ADRV904X_GAIN_COMPENSATION_DISABLED) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxDataFormat[configIdx].rxDataFormat.formatSelect, + "Invalid format selected for ORx data format configuration. ORx only supports ADI_ADRV904X_GAIN_COMPENSATION_DISABLED"); + return recoveryAction; + } + } + + /* Verify that format selected is valid */ + if ((rxDataFormat[configIdx].rxDataFormat.formatSelect != ADI_ADRV904X_GAIN_COMPENSATION_DISABLED) && + (rxDataFormat[configIdx].rxDataFormat.formatSelect != ADI_ADRV904X_GAIN_WITH_FLOATING_POINT) && + (rxDataFormat[configIdx].rxDataFormat.formatSelect != ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_NOGPIO) && + (rxDataFormat[configIdx].rxDataFormat.formatSelect != ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_2PIN_MODE) && + (rxDataFormat[configIdx].rxDataFormat.formatSelect != ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_3PIN_MODE) && + (rxDataFormat[configIdx].rxDataFormat.formatSelect != ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_4PIN_MODE) && + (rxDataFormat[configIdx].rxDataFormat.formatSelect != ADI_ADRV904X_GAIN_WITH_EXTERNAL_SLICER) && + (rxDataFormat[configIdx].rxDataFormat.formatSelect != ADI_ADRV904X_EMBED_OVERLOAD_MONITOR_DATA)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxDataFormat[configIdx].rxDataFormat.formatSelect, + "Invalid Rx Data Format selected"); + return recoveryAction; + } + + /* If selected format is ADI_ADRV904X_GAIN_COMPENSATION_DISABLED, verify that the selected integer mode is valid */ + if (rxDataFormat[configIdx].rxDataFormat.formatSelect == ADI_ADRV904X_GAIN_COMPENSATION_DISABLED) + { + if ((rxDataFormat[configIdx].rxDataFormat.integerConfigSettings.intSampleResolution != ADI_ADRV904X_INTEGER_12BIT_2SCOMP) && + (rxDataFormat[configIdx].rxDataFormat.integerConfigSettings.intSampleResolution != ADI_ADRV904X_INTEGER_12BIT_SIGNED) && + (rxDataFormat[configIdx].rxDataFormat.integerConfigSettings.intSampleResolution != ADI_ADRV904X_INTEGER_16BIT_2SCOMP) && + (rxDataFormat[configIdx].rxDataFormat.integerConfigSettings.intSampleResolution != ADI_ADRV904X_INTEGER_16BIT_SIGNED)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxDataFormat[configIdx].rxDataFormat.integerConfigSettings.intSampleResolution, + "Incorrect Integer format and resolution selected while attempting to disable gain compensation"); + return recoveryAction; + } + } + + /* If selected format is ADI_ADRV904X_GAIN_WITH_FLOATING_POINT, range check floating point configuration */ + else if (rxDataFormat[configIdx].rxDataFormat.formatSelect == ADI_ADRV904X_GAIN_WITH_FLOATING_POINT) + { + recoveryAction = adrv904x_RxDataFormatSetFloatingPointRangeCheck( device, + &rxDataFormat[configIdx].rxDataFormat.floatingPointConfig); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error in floating point mode range check"); + return recoveryAction; + + } + } + + /* If selected format is one of the internal slicer modes, range check integer mode configuration */ + else if ((rxDataFormat[configIdx].rxDataFormat.formatSelect == ADI_ADRV904X_GAIN_WITH_EXTERNAL_SLICER) || + (rxDataFormat[configIdx].rxDataFormat.formatSelect == ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_2PIN_MODE) || + (rxDataFormat[configIdx].rxDataFormat.formatSelect == ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_3PIN_MODE) || + (rxDataFormat[configIdx].rxDataFormat.formatSelect == ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_4PIN_MODE) || + (rxDataFormat[configIdx].rxDataFormat.formatSelect == ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_NOGPIO)) + { + recoveryAction = adrv904x_RxDataFormatSetIntegerRangeCheck( device, + rxDataFormat[configIdx].rxChannelMask, + rxDataFormat[configIdx].rxDataFormat.formatSelect, + &rxDataFormat[configIdx].rxDataFormat.integerConfigSettings, + &rxDataFormat[configIdx].rxDataFormat.slicerConfigSettings); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error in integer mode range check"); + return recoveryAction; + + } + } + + /* If selected format is the embedded overload monitor, range check overload monitor format settings */ + else if (rxDataFormat[configIdx].rxDataFormat.formatSelect == ADI_ADRV904X_EMBED_OVERLOAD_MONITOR_DATA) + { + recoveryAction = adrv904x_RxDataFormatSetEmbOvldMonitorRangeCheck( device, + &rxDataFormat[configIdx].rxDataFormat.embOvldMonitorSettings, + rxDataFormat[configIdx].rxDataFormat.integerConfigSettings.intSampleResolution); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error in embedded overload monitor range check"); + return recoveryAction; + + } + } + } /* end of configIdx for loop */ + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcDataFormatSetRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CddcDataFormatRt_t cddcDataFormat[], + const uint32_t arraySize) +{ + static const uint32_t ALL_RX_MASK = (uint32_t)(ADI_ADRV904X_RX0 | ADI_ADRV904X_RX1 | ADI_ADRV904X_RX2 | ADI_ADRV904X_RX3 | + ADI_ADRV904X_RX4 | ADI_ADRV904X_RX5 | ADI_ADRV904X_RX6 | ADI_ADRV904X_RX7); + static const uint32_t MINIMUM_NUM_FORMATTERS = 1U; + static const uint32_t MAXIMUM_NUM_FORMATTERS = 10U; + static const uint8_t MAXIMUM_EMB_OVERLOAD_VALUE = 15U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t configIdx = 0U; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cddcDataFormat); + + /* Verify that arraySize is > 1 and <= the maximum number of unique formatters. */ + /* If not, throw an error indicating whether the minimum or maximum was exceeded. */ + if (arraySize < MINIMUM_NUM_FORMATTERS) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, arraySize, "Invalid number of Rx formatters. Less than minimum allowed"); + return recoveryAction; + } + if (arraySize > MAXIMUM_NUM_FORMATTERS) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, arraySize, "Invalid number of Rx formatters. Exceeded than maximum allowed"); + return recoveryAction; + } + + /* Iterate over arraySize elements of rxDataFormat */ + for (configIdx = 0U; configIdx < arraySize; configIdx++) + { + /* Verify that the rxChannelMask field is not empty. */ + if (cddcDataFormat[configIdx].rxChannelMask == ADI_ADRV904X_RXOFF) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + device->devStateInfo.profilesValid, + "Empty Rx channel mask selected for CDDC data format configuration"); + return recoveryAction; + } + + /* If any RX channels are selected, verify that the RX profile is marked valid in the device profilesValid field. */ + if (((cddcDataFormat[configIdx].rxChannelMask & ALL_RX_MASK) > 0U) && + ((device->devStateInfo.profilesValid & ADI_ADRV904X_RX_PROFILE_VALID) != ADI_ADRV904X_RX_PROFILE_VALID)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + device->devStateInfo.profilesValid, + "Rx channel selected for CDDC data format configuration but Rx profile is invalid"); + return recoveryAction; + } + if (cddcDataFormat[configIdx].rxChannelMask > ALL_RX_MASK) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + device->devStateInfo.profilesValid, + "Invalid Rx channel selected for CDDC data format configuration"); + return recoveryAction; + } + + /* Verify that format selected is valid */ + if ((cddcDataFormat[configIdx].cddcDataFormat.cddcFormatSelect != ADI_ADRV904X_CDDC_DISABLED) && + (cddcDataFormat[configIdx].cddcDataFormat.cddcFormatSelect != ADI_ADRV904X_CDDC_FLOATING_POINT) && + (cddcDataFormat[configIdx].cddcDataFormat.cddcFormatSelect != ADI_ADRV904X_CDDC_INTEGER) && + (cddcDataFormat[configIdx].cddcDataFormat.cddcFormatSelect != ADI_ADRV904X_CDDC_SLICER) && + (cddcDataFormat[configIdx].cddcDataFormat.cddcFormatSelect != ADI_ADRV904X_CDDC_EMBED_OVERLOAD_MONITOR_DATA)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cddcDataFormat[configIdx].cddcDataFormat.cddcFormatSelect, + "Invalid CDDC Data Format selected"); + return recoveryAction; + } + + /* If selected format is ADI_ADRV904X_GAIN_COMPENSATION_DISABLED, verify that the selected integer mode is valid */ + if (cddcDataFormat[configIdx].cddcDataFormat.cddcFormatSelect == ADI_ADRV904X_CDDC_DISABLED) + { + if ((cddcDataFormat[configIdx].cddcDataFormat.cddcIntegerConfigSettings.intSampleResolution != ADI_ADRV904X_INTEGER_12BIT_2SCOMP) && + (cddcDataFormat[configIdx].cddcDataFormat.cddcIntegerConfigSettings.intSampleResolution != ADI_ADRV904X_INTEGER_12BIT_SIGNED) && + (cddcDataFormat[configIdx].cddcDataFormat.cddcIntegerConfigSettings.intSampleResolution != ADI_ADRV904X_INTEGER_16BIT_2SCOMP) && + (cddcDataFormat[configIdx].cddcDataFormat.cddcIntegerConfigSettings.intSampleResolution != ADI_ADRV904X_INTEGER_16BIT_SIGNED)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cddcDataFormat[configIdx].cddcDataFormat.cddcIntegerConfigSettings.intSampleResolution, + "Incorrect Integer format and resolution selected"); + return recoveryAction; + } + } + + /* If selected format is ADI_ADRV904X_CDDC_FLOATING_POINT, range check floating point configuration */ + else if (cddcDataFormat[configIdx].cddcDataFormat.cddcFormatSelect == ADI_ADRV904X_CDDC_FLOATING_POINT) + { + recoveryAction = adrv904x_CddcDataFormatSetFloatingPointRangeCheck(device, + &cddcDataFormat[configIdx].cddcDataFormat.cddcFloatingPointConfig); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error in CDDC floating point mode range check"); + return recoveryAction; + } + } + + /* If selected format is the embedded overload monitor, range check overload monitor format settings */ + else if (cddcDataFormat[configIdx].cddcDataFormat.cddcFormatSelect == ADI_ADRV904X_CDDC_EMBED_OVERLOAD_MONITOR_DATA) + { + if ((cddcDataFormat[configIdx].cddcDataFormat.cddcEmbOvldMonitorSettings.embeddedMonitorSrcLsbI > MAXIMUM_EMB_OVERLOAD_VALUE) || + (cddcDataFormat[configIdx].cddcDataFormat.cddcEmbOvldMonitorSettings.embeddedMonitorSrcLsbQ > MAXIMUM_EMB_OVERLOAD_VALUE) || + (cddcDataFormat[configIdx].cddcDataFormat.cddcEmbOvldMonitorSettings.embeddedMonitorSrcLsbPlusOneI > MAXIMUM_EMB_OVERLOAD_VALUE) || + (cddcDataFormat[configIdx].cddcDataFormat.cddcEmbOvldMonitorSettings.embeddedMonitorSrcLsbPlusOneQ > MAXIMUM_EMB_OVERLOAD_VALUE)) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error in CDDC overload monitor range check"); + return recoveryAction; + } + } + } /* end of configIdx for loop */ + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatSetFloatingPointRangeCheck(adi_adrv904x_Device_t * const device, + const adi_adrv904x_FloatingPointConfigSettings_t * const floatingPointConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, floatingPointConfig); + + /* Check floating point format selected is valid */ + if ((floatingPointConfig->fpDataFormat != ADI_ADRV904X_FP_FORMAT_SIGN_SIGNIFICAND_EXP) && + (floatingPointConfig->fpDataFormat != ADI_ADRV904X_FP_FORMAT_SIGN_EXP_SIGNIFICAND)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + floatingPointConfig->fpDataFormat, + "Invalid floating point data format selected"); + return recoveryAction; + } + + /* Check floating point round mode is valid */ + if ((floatingPointConfig->fpRoundMode != ADI_ADRV904X_ROUND_TO_EVEN) && + (floatingPointConfig->fpRoundMode != ADI_ADRV904X_ROUNDTOWARDS_POSITIVE) && + (floatingPointConfig->fpRoundMode != ADI_ADRV904X_ROUNDTOWARDS_NEGATIVE) && + (floatingPointConfig->fpRoundMode != ADI_ADRV904X_ROUNDTOWARDS_ZERO) && + (floatingPointConfig->fpRoundMode != ADI_ADRV904X_ROUND_FROM_EVEN)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + floatingPointConfig->fpRoundMode, + "Invalid floating point round mode selected"); + return recoveryAction; + } + + /* Check floating point no. of exponent bits is valid */ + if ((floatingPointConfig->fpNumExpBits != ADI_ADRV904X_2_EXPONENTBITS) && + (floatingPointConfig->fpNumExpBits != ADI_ADRV904X_3_EXPONENTBITS) && + (floatingPointConfig->fpNumExpBits != ADI_ADRV904X_4_EXPONENTBITS) && + (floatingPointConfig->fpNumExpBits != ADI_ADRV904X_5_EXPONENTBITS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + floatingPointConfig->fpNumExpBits, + "Invalid number of floating point exponent bits selected"); + return recoveryAction; + } + + /* Check floating point attenuation steps are valid */ + if ((floatingPointConfig->fpAttenSteps != ADI_ADRV904X_FPATTEN_24DB) && + (floatingPointConfig->fpAttenSteps != ADI_ADRV904X_FPATTEN_18DB) && + (floatingPointConfig->fpAttenSteps != ADI_ADRV904X_FPATTEN_12DB) && + (floatingPointConfig->fpAttenSteps != ADI_ADRV904X_FPATTEN_6DB) && + (floatingPointConfig->fpAttenSteps != ADI_ADRV904X_FPATTEN_0DB) && + (floatingPointConfig->fpAttenSteps != ADI_ADRV904X_FPATTEN_MINUS6DB) && + (floatingPointConfig->fpAttenSteps != ADI_ADRV904X_FPATTEN_MINUS12DB) && + (floatingPointConfig->fpAttenSteps != ADI_ADRV904X_FPATTEN_MINUS18DB)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + floatingPointConfig->fpAttenSteps, + "Invalid floating point attenuation step selected"); + return recoveryAction; + } + + /* Check floating point encoded NaN selection is valid */ + if ((floatingPointConfig->fpEncodeNan != ADI_ADRV904X_FP_FORMAT_NAN_ENCODE_DISABLE) && + (floatingPointConfig->fpEncodeNan != ADI_ADRV904X_FP_FORMAT_NAN_ENCODE_ENABLE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + floatingPointConfig->fpEncodeNan, + "Invalid floating point encode NaN selection"); + return recoveryAction; + } + + /*Check floating point encoded NaN selection is valid*/ + if ((floatingPointConfig->fpHideLeadingOne != ADI_ADRV904X_FP_FORMAT_HIDE_LEADING_ONE_DISABLE) && + (floatingPointConfig->fpHideLeadingOne != ADI_ADRV904X_FP_FORMAT_HIDE_LEADING_ONE_ENABLE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + floatingPointConfig->fpHideLeadingOne, + "Invalid floating point hide leading one selection"); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcDataFormatSetFloatingPointRangeCheck(adi_adrv904x_Device_t * const device, + const adi_adrv904x_CddcFloatingPointConfigSettings_t * const cddcFloatingPointConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cddcFloatingPointConfig); + + /* Check floating point format selected is valid */ + if ((cddcFloatingPointConfig->cddcFpDataFormat != ADI_ADRV904X_FP_FORMAT_SIGN_SIGNIFICAND_EXP) && + (cddcFloatingPointConfig->cddcFpDataFormat != ADI_ADRV904X_FP_FORMAT_SIGN_EXP_SIGNIFICAND)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + cddcFloatingPointConfig->cddcFpDataFormat, + "Invalid floating point data format selected"); + return recoveryAction; + } + + /* Check floating point round mode is valid */ + if ((cddcFloatingPointConfig->cddcFpRoundMode != ADI_ADRV904X_ROUND_TO_EVEN) && + (cddcFloatingPointConfig->cddcFpRoundMode != ADI_ADRV904X_ROUNDTOWARDS_POSITIVE) && + (cddcFloatingPointConfig->cddcFpRoundMode != ADI_ADRV904X_ROUNDTOWARDS_NEGATIVE) && + (cddcFloatingPointConfig->cddcFpRoundMode != ADI_ADRV904X_ROUNDTOWARDS_ZERO) && + (cddcFloatingPointConfig->cddcFpRoundMode != ADI_ADRV904X_ROUND_FROM_EVEN)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + cddcFloatingPointConfig->cddcFpRoundMode, + "Invalid floating point round mode selected"); + return recoveryAction; + } + + /* Check floating point no. of exponent bits is valid */ + if ((cddcFloatingPointConfig->cddcFpNumExpBits != ADI_ADRV904X_2_EXPONENTBITS) && + (cddcFloatingPointConfig->cddcFpNumExpBits != ADI_ADRV904X_3_EXPONENTBITS) && + (cddcFloatingPointConfig->cddcFpNumExpBits != ADI_ADRV904X_4_EXPONENTBITS) && + (cddcFloatingPointConfig->cddcFpNumExpBits != ADI_ADRV904X_5_EXPONENTBITS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + cddcFloatingPointConfig->cddcFpNumExpBits, + "Invalid number of floating point exponent bits selected"); + return recoveryAction; + } + + /* Check floating point encoded NaN selection is valid */ + if ((cddcFloatingPointConfig->cddcFpEncodeNan != ADI_ADRV904X_FP_FORMAT_NAN_ENCODE_DISABLE) && + (cddcFloatingPointConfig->cddcFpEncodeNan != ADI_ADRV904X_FP_FORMAT_NAN_ENCODE_ENABLE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + cddcFloatingPointConfig->cddcFpEncodeNan, + "Invalid floating point encode NaN selection"); + return recoveryAction; + } + + /*Check floating point encoded NaN selection is valid*/ + if ((cddcFloatingPointConfig->cddcFpHideLeadingOne != ADI_ADRV904X_FP_FORMAT_HIDE_LEADING_ONE_DISABLE) && + (cddcFloatingPointConfig->cddcFpHideLeadingOne != ADI_ADRV904X_FP_FORMAT_HIDE_LEADING_ONE_ENABLE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + cddcFloatingPointConfig->cddcFpHideLeadingOne, + "Invalid floating point hide leading one selection"); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatSetIntegerRangeCheck(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const adi_adrv904x_RxDataFormatModes_e formatSelect, + const adi_adrv904x_IntegerConfigSettings_t * const integerConfigSettings, + const adi_adrv904x_SlicerConfigSettings_t * const slicerConfigSettings) +{ + /* + static const uint32_t ALL_RX_MASK = (uint32_t)(ADI_ADRV904X_RX0 | ADI_ADRV904X_RX1 | ADI_ADRV904X_RX2 | ADI_ADRV904X_RX3 | + ADI_ADRV904X_RX4 | ADI_ADRV904X_RX5 | ADI_ADRV904X_RX6 | ADI_ADRV904X_RX7); + */ + static const uint32_t ALL_ORX_MASK = (uint32_t)(ADI_ADRV904X_ORX0 | ADI_ADRV904X_ORX1); + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t slicerBit = 0U; + uint8_t numRxChannels = 0U; + uint8_t i = 0U; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, integerConfigSettings); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, slicerConfigSettings); + + /* If the selected format is one of the internal slicer modes: + a. Verify integer mode configuration against the constraints in Table 5.2.4 2, otherwise throw an error. + Note: Only ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_NOGPIO mode is valid if any ORx channels are selected. + b. If the selected format is ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_2-3 or 4PIN_MODE, + verify that the specified GPIO mode for each RX channel is not configured for use by another feature. Otherwise throw an error. + */ + /* If the selected format is one of the internal slicer modes: */ + if( (formatSelect == ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_2PIN_MODE) || + (formatSelect == ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_3PIN_MODE) || + (formatSelect == ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_4PIN_MODE) || + (formatSelect == ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_NOGPIO)) + { + /* Verify integer mode configuration against constraints */ + /* Note: Only ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_NOGPIO mode is valid if any ORx channels are selected. */ + /* Check that selected integer formatter internal slicer embedded bits mode is valid */ + if ((integerConfigSettings->intEmbeddedBits != ADI_ADRV904X_NO_EMBEDDED_SLICER_BITS) && + (integerConfigSettings->intEmbeddedBits != ADI_ADRV904X_EMBED_1_SLICERBIT_AT_MSB) && + (integerConfigSettings->intEmbeddedBits != ADI_ADRV904X_EMBED_1_SLICERBIT_AT_LSB) && + (integerConfigSettings->intEmbeddedBits != ADI_ADRV904X_EMBED_2_SLICERBITS_AT_MSB_3_BIT_SLICER) && + (integerConfigSettings->intEmbeddedBits != ADI_ADRV904X_EMBED_2_SLICERBITS_AT_LSB_3_BIT_SLICER) && + (integerConfigSettings->intEmbeddedBits != ADI_ADRV904X_EMBED_2_SLICERBITS_AT_MSB_4_BIT_SLICER) && + (integerConfigSettings->intEmbeddedBits != ADI_ADRV904X_EMBED_2_SLICERBITS_AT_LSB_4_BIT_SLICER)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + integerConfigSettings->intEmbeddedBits, + "Invalid integer formatter internal slicer embedded bits selected"); + return recoveryAction; + } + + /* Check that integer format resolution is valid */ + if ((integerConfigSettings->intSampleResolution != ADI_ADRV904X_INTEGER_12BIT_2SCOMP) && + (integerConfigSettings->intSampleResolution != ADI_ADRV904X_INTEGER_12BIT_SIGNED) && + (integerConfigSettings->intSampleResolution != ADI_ADRV904X_INTEGER_16BIT_2SCOMP) && + (integerConfigSettings->intSampleResolution != ADI_ADRV904X_INTEGER_16BIT_SIGNED)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + integerConfigSettings->intSampleResolution, + "Invalid integer formatter sample resolution selected"); + return recoveryAction; + } + + /* Embedding 1 bit slicer at MSB only supports 12 bit/16 bit signed integer sample resolution */ + if ((integerConfigSettings->intEmbeddedBits == ADI_ADRV904X_EMBED_1_SLICERBIT_AT_MSB) && + (integerConfigSettings->intSampleResolution != ADI_ADRV904X_INTEGER_12BIT_SIGNED) && + (integerConfigSettings->intSampleResolution != ADI_ADRV904X_INTEGER_16BIT_SIGNED)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + integerConfigSettings->intSampleResolution, + "Invalid integer formatter sample resolution. Valid sample resolution is 12-bit signed for embedding 1 slicer bit at MSB"); + return recoveryAction; + } + + /* Embedding 2 bit slicer at MSB for a 3-bit slicer mode only supports Signed representation in 16 bit resolution*/ + if ((integerConfigSettings->intEmbeddedBits == ADI_ADRV904X_EMBED_2_SLICERBITS_AT_MSB_3_BIT_SLICER) && + (integerConfigSettings->intSampleResolution != ADI_ADRV904X_INTEGER_16BIT_SIGNED)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + integerConfigSettings->intSampleResolution, + "Invalid integer formatter sample resolution. Valid sample resolution is 16 signed for embedding 2 slicer bits at MSB for a 3-bit slicer mode"); + return recoveryAction; + } + + /* Embedding 2 bit slicer at MSB for a 4-bit slicer mode only supports Signed representation in 16 bit resolution */ + if ((integerConfigSettings->intEmbeddedBits == ADI_ADRV904X_EMBED_2_SLICERBITS_AT_MSB_4_BIT_SLICER) && + (integerConfigSettings->intSampleResolution != ADI_ADRV904X_INTEGER_16BIT_SIGNED)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + integerConfigSettings->intSampleResolution, + "Invalid integer formatter sample resolution. Valid sample resolution is 16 signed for embedding 2 slicer bits at MSB for a 4-bit slicer mode"); + return recoveryAction; + } + + /* Embedding 2 bit slicer at LSB for a 3-bit slicer mode only supports 16 bit resolution, either signed or twos comp representation */ + if ((integerConfigSettings->intEmbeddedBits == ADI_ADRV904X_EMBED_2_SLICERBITS_AT_LSB_3_BIT_SLICER) && + (integerConfigSettings->intSampleResolution != ADI_ADRV904X_INTEGER_16BIT_SIGNED) && + (integerConfigSettings->intSampleResolution != ADI_ADRV904X_INTEGER_16BIT_2SCOMP)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + integerConfigSettings->intSampleResolution, + "Invalid integer formatter sample resolution. Valid sample resolution is 16 signed or twos comp for embedding 2 slicer bits at LSB for a 3-bit slicer mode"); + return recoveryAction; + } + + /* Embedding 2 bit slicer at LSB for a 4-bit slicer mode only supports 16 bit resolution, either signed or twos comp representation */ + if ((integerConfigSettings->intEmbeddedBits == ADI_ADRV904X_EMBED_2_SLICERBITS_AT_LSB_4_BIT_SLICER) && + (integerConfigSettings->intSampleResolution != ADI_ADRV904X_INTEGER_16BIT_SIGNED) && + (integerConfigSettings->intSampleResolution != ADI_ADRV904X_INTEGER_16BIT_2SCOMP)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + integerConfigSettings->intSampleResolution, + "Invalid integer formatter sample resolution. Valid sample resolution is 16 signed or twos comp for embedding 2 slicer bits at LSB for a 4-bit slicer mode"); + return recoveryAction; + } + + /* Check that integer format parity is valid */ + if ((integerConfigSettings->intParity != ADI_ADRV904X_3BIT_SLICER_EVEN_PARITY) && + (integerConfigSettings->intParity != ADI_ADRV904X_3BIT_SLICER_ODD_PARITY) && + (integerConfigSettings->intParity != ADI_ADRV904X_NO_PARITY)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + integerConfigSettings->intParity, + "Invalid integer formatter parity option selected"); + return recoveryAction; + } + + /* Check that the use case is valid for embedding parity bit */ + if ((integerConfigSettings->intParity == ADI_ADRV904X_3BIT_SLICER_EVEN_PARITY) || + (integerConfigSettings->intParity == ADI_ADRV904X_3BIT_SLICER_ODD_PARITY)) + { + /* Parity is valid only in 3 bit internal embedded slicer mode */ + if (formatSelect != ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_NOGPIO) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + formatSelect, + "Invalid integer formatter mode selected for parity support. Parity is supported only in 3 bit internal slicer modes"); + return recoveryAction; + } + + /* Parity is valid only in 3 bit slicer mode */ + if ((integerConfigSettings->intEmbeddedBits != ADI_ADRV904X_EMBED_2_SLICERBITS_AT_MSB_3_BIT_SLICER) && + (integerConfigSettings->intEmbeddedBits != ADI_ADRV904X_EMBED_2_SLICERBITS_AT_LSB_3_BIT_SLICER)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + formatSelect, + "Invalid integer formatter mode selected for parity support. Parity is supported only in 3 bit internal slicer modes"); + return recoveryAction; + } + + /* Parity is valid only in 3 bit embedded slicer mode. 12 bit resolution does not support 3 bit parity */ + if ((integerConfigSettings->intSampleResolution == ADI_ADRV904X_INTEGER_12BIT_2SCOMP) || + (integerConfigSettings->intSampleResolution == ADI_ADRV904X_INTEGER_12BIT_SIGNED)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + integerConfigSettings->intSampleResolution, + "Invalid integer formatter sampling resolution mode for parity config. Parity is supported only for 16 resolution"); + return recoveryAction; + } + } + + /* Check that integer slicer embedded position is valid */ + if (integerConfigSettings->intEmbeddedPos != ADI_ADRV904X_LOWER_NIBBLE_ON_Q && + integerConfigSettings->intEmbeddedPos != ADI_ADRV904X_LOWER_NIBBLE_ON_I) + { + + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + slicerConfigSettings->intSlicerStepSize, + "Invalid internal slicer embedded position selected"); + return recoveryAction; + } + + /* Check that integer format step size is valid */ + if ((slicerConfigSettings->intSlicerStepSize != ADI_ADRV904X_INTSLICER_STEPSIZE_1DB) && + (slicerConfigSettings->intSlicerStepSize != ADI_ADRV904X_INTSLICER_STEPSIZE_2DB) && + (slicerConfigSettings->intSlicerStepSize != ADI_ADRV904X_INTSLICER_STEPSIZE_3DB) && + (slicerConfigSettings->intSlicerStepSize != ADI_ADRV904X_INTSLICER_STEPSIZE_4DB) && + (slicerConfigSettings->intSlicerStepSize != ADI_ADRV904X_INTSLICER_STEPSIZE_6DB) && + (slicerConfigSettings->intSlicerStepSize != ADI_ADRV904X_INTSLICER_STEPSIZE_8DB)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + slicerConfigSettings->intSlicerStepSize, + "Invalid internal slicer step size selected for integer format internal slicer mode"); + return recoveryAction; + } + + /*Check the source ctrl on Rx Slicer Posn observation GPIOs for 4 Pin mode */ + if (formatSelect == ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_4PIN_MODE) + { + if ((rxChannelMask & ALL_ORX_MASK) > 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannelMask, + "ORx channel is only supported for ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_NOGPIO mode"); + return recoveryAction; + } + + /* Confirm Rx channel mask is only trying to set GPIOs for a single Rx channel */ + numRxChannels = 0U; + for (i = 0U; i < 8U; i++) + { + numRxChannels += ((rxChannelMask >> i) & 0x01); + } + + if (numRxChannels != 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + numRxChannels, + "Only 1 Rx data formatter channel can be configured at a time when formatSelect = ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_4PIN_MODE"); + return recoveryAction; + } + + /* If any Rx channels in channel mask */ + for (slicerBit = 0U; slicerBit < 4U; slicerBit++) + { + if (slicerConfigSettings->intSlicerGpioSelect[slicerBit] >= ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + slicerConfigSettings->intSlicerGpioSelect[slicerBit], + "GPIO must be valid for Internal Slicer output bits[3:0] when formatSelect = ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_4PIN_MODE"); + return recoveryAction; + } + } + } + + /*Check the source ctrl on Rx Slicer Posn observation GPIOs for 3 Pin mode*/ + if (formatSelect == ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_3PIN_MODE) + { + /* Confirm Rx channel mask is only trying to set GPIOs for a single Rx channel */ + numRxChannels = 0U; + for (i = 0U; i < 8U; i++) + { + numRxChannels += ((rxChannelMask >> i) & 0x01); + } + + if (numRxChannels != 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + numRxChannels, + "Only 1 Rx data formatter channel can be configured at a time when formatSelect = ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_3PIN_MODE"); + return recoveryAction; + } + + for (slicerBit = 0U; slicerBit < 3U; slicerBit++) + { + if (slicerConfigSettings->intSlicerGpioSelect[slicerBit] >= ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + slicerConfigSettings->intSlicerGpioSelect[slicerBit], + "GPIO must be valid for Internal Slicer output bits[2:0] when formatSelect = ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_3PIN_MODE"); + return recoveryAction; + } + } + + } + + /*Check the source ctrl on Rx Slicer Posn observation GPIOs for 2 Pin mode*/ + if (formatSelect == ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_2PIN_MODE) + { + /* Confirm Rx channel mask is only trying to set GPIOs for a single Rx channel */ + numRxChannels = 0U; + for (i = 0U; i < 8U; i++) + { + numRxChannels += ((rxChannelMask >> i) & 0x01); + } + + if (numRxChannels != 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + numRxChannels, + "Only 1 Rx data formatter channel can be configured at a time when formatSelect = ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_2PIN_MODE"); + return recoveryAction; + } + + for (slicerBit = 0U; slicerBit < 2U; slicerBit++) + { + if (slicerConfigSettings->intSlicerGpioSelect[slicerBit] >= ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + slicerConfigSettings->intSlicerGpioSelect[slicerBit], + "GPIO must be valid for Internal Slicer output bits[1:0] when formatSelect = ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_2PIN_MODE"); + return recoveryAction; + } + } + + } + + } + + /* If the selected format is ADI_ADRV904X_GAIN_WITH_EXTERNAL_SLICER: */ + /* Throw an error indicating that the mode is not supported */ + else if (formatSelect == ADI_ADRV904X_GAIN_WITH_EXTERNAL_SLICER) + { + ADI_ADRV904X_API_NOT_IMPLEMENTED_REPORT_RETURN(&device->common); + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatSetEmbOvldMonitorRangeCheck(adi_adrv904x_Device_t * const device, + const adi_adrv904x_EmbOverloadMonitorConfigSettings_t * const embOvldConfigSettings, + const adi_adrv904x_RxIntSampleResolution_e intSampleResolution) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, embOvldConfigSettings); + + /* The embedded overload monitor is only supported in 16bit / twos-complement format */ + if (intSampleResolution != ADI_ADRV904X_INTEGER_16BIT_2SCOMP) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + intSampleResolution, + "Embedded overload monitoring Rx data format is only supported with integer 16Bit - 2s Complement format"); + return recoveryAction; + } + + /* Verify that embeddedMonitorSrcLsbI field is a valid enum */ + if ((embOvldConfigSettings->embeddedMonitorSrcLsbI != ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED) && + (embOvldConfigSettings->embeddedMonitorSrcLsbI != ADI_ADRV904X_RX_EMB_MON_SRC_APD_HIGH_THRESH) && + (embOvldConfigSettings->embeddedMonitorSrcLsbI != ADI_ADRV904X_RX_EMB_MON_SRC_APD_LOW_THRESH) && + (embOvldConfigSettings->embeddedMonitorSrcLsbI != ADI_ADRV904X_RX_EMB_MON_SRC_HB2_HIGH_THRESH) && + (embOvldConfigSettings->embeddedMonitorSrcLsbI != ADI_ADRV904X_RX_EMB_MON_SRC_HB2_LOW_THRESH)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + embOvldConfigSettings->embeddedMonitorSrcLsbI, + "Invalid embedded monitor source selected to be embedded at LSB posn - I sample"); + return recoveryAction; + } + + /* Verify that embeddedMonitorSrcLsbPlusOneI field is a valid enum */ + if ((embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneI != ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED) && + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneI != ADI_ADRV904X_RX_EMB_MON_SRC_APD_HIGH_THRESH) && + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneI != ADI_ADRV904X_RX_EMB_MON_SRC_APD_LOW_THRESH) && + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneI != ADI_ADRV904X_RX_EMB_MON_SRC_HB2_HIGH_THRESH) && + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneI != ADI_ADRV904X_RX_EMB_MON_SRC_HB2_LOW_THRESH)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneI, + "Invalid embedded monitor source selected to be embedded at LSB + 1 posn - I sample"); + return recoveryAction; + } + + /* Verify that embeddedMonitorSrcLsbQ field is a valid enum */ + if ((embOvldConfigSettings->embeddedMonitorSrcLsbQ != ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED) && + (embOvldConfigSettings->embeddedMonitorSrcLsbQ != ADI_ADRV904X_RX_EMB_MON_SRC_APD_HIGH_THRESH) && + (embOvldConfigSettings->embeddedMonitorSrcLsbQ != ADI_ADRV904X_RX_EMB_MON_SRC_APD_LOW_THRESH) && + (embOvldConfigSettings->embeddedMonitorSrcLsbQ != ADI_ADRV904X_RX_EMB_MON_SRC_HB2_HIGH_THRESH) && + (embOvldConfigSettings->embeddedMonitorSrcLsbQ != ADI_ADRV904X_RX_EMB_MON_SRC_HB2_LOW_THRESH)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + embOvldConfigSettings->embeddedMonitorSrcLsbQ, + "Invalid embedded monitor source selected to be embedded at LSB posn - Q sample"); + return recoveryAction; + } + + /* Verify that embeddedMonitorSrcLsbPlusOneQ field is a valid enum */ + if ((embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneQ != ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED) && + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneQ != ADI_ADRV904X_RX_EMB_MON_SRC_APD_HIGH_THRESH) && + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneQ != ADI_ADRV904X_RX_EMB_MON_SRC_APD_LOW_THRESH) && + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneQ != ADI_ADRV904X_RX_EMB_MON_SRC_HB2_HIGH_THRESH) && + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneQ != ADI_ADRV904X_RX_EMB_MON_SRC_HB2_LOW_THRESH)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneQ, + "Invalid embedded monitor source selected to be embedded at LSB + 1 posn - Q sample"); + return recoveryAction; + } + + /* If any embedded monitor bit is set to ADI_ADRV904X_RX_EMB_MON_SRC_APD_HIGH_THRESH, verify embeddedMonitorApdHighSrcSel field */ + if ((embOvldConfigSettings->embeddedMonitorSrcLsbI == ADI_ADRV904X_RX_EMB_MON_SRC_APD_HIGH_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbQ == ADI_ADRV904X_RX_EMB_MON_SRC_APD_HIGH_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneI == ADI_ADRV904X_RX_EMB_MON_SRC_APD_HIGH_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneQ == ADI_ADRV904X_RX_EMB_MON_SRC_APD_HIGH_THRESH)) + { + if ((embOvldConfigSettings->embeddedMonitorApdHighSrcSel != ADI_ADRV904X_APD_HIGH_SRC_UPPER_LEVEL_BLOCKER_EXCEEDED) && + (embOvldConfigSettings->embeddedMonitorApdHighSrcSel != ADI_ADRV904X_APD_HIGH_SRC_UPPER_LEVEL_BLOCKER_CNTR_EXCEEDED)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + embOvldConfigSettings->embeddedMonitorApdHighSrcSel, + "Analog Peak Detector high thresh selected for embedded monitoring but APD high source is invalid"); + return recoveryAction; + } + } + + /* If any embedded monitor bit is set to ADI_ADRV904X_RX_EMB_MON_SRC_APD_LOW_THRESH, verify embeddedMonitorApdLowSrcSel field */ + if ((embOvldConfigSettings->embeddedMonitorSrcLsbI == ADI_ADRV904X_RX_EMB_MON_SRC_APD_LOW_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbQ == ADI_ADRV904X_RX_EMB_MON_SRC_APD_LOW_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneI == ADI_ADRV904X_RX_EMB_MON_SRC_APD_LOW_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneQ == ADI_ADRV904X_RX_EMB_MON_SRC_APD_LOW_THRESH)) + { + if ((embOvldConfigSettings->embeddedMonitorApdLowSrcSel != ADI_ADRV904X_APD_LOW_SRC_LOWER_LEVEL_BLOCKER_EXCEEDED) && + (embOvldConfigSettings->embeddedMonitorApdLowSrcSel != ADI_ADRV904X_APD_LOW_SRC_LOWER_LEVEL_BLOCKER_CNTR_EXCEEDED)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + embOvldConfigSettings->embeddedMonitorApdLowSrcSel, + "Analog Peak Detector low thresh selected for embedded monitoring but APD low source is invalid"); + return recoveryAction; + } + } + + /* If any embedded monitor bit is set to ADI_ADRV904X_RX_EMB_MON_SRC_HB2_HIGH_THRESH, verify embeddedMonitorHb2HighSrcSel field */ + if ((embOvldConfigSettings->embeddedMonitorSrcLsbI == ADI_ADRV904X_RX_EMB_MON_SRC_HB2_HIGH_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbQ == ADI_ADRV904X_RX_EMB_MON_SRC_HB2_HIGH_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneI == ADI_ADRV904X_RX_EMB_MON_SRC_HB2_HIGH_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneQ == ADI_ADRV904X_RX_EMB_MON_SRC_HB2_HIGH_THRESH)) + { + if ((embOvldConfigSettings->embeddedMonitorHb2HighSrcSel != ADI_ADRV904X_HB2_HIGH_SRC_OVRG_HIGH) && + (embOvldConfigSettings->embeddedMonitorHb2HighSrcSel != ADI_ADRV904X_HB2_HIGH_SRC_OVRG_HIGH_CNTR_EXCEEDED)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + embOvldConfigSettings->embeddedMonitorHb2HighSrcSel, + "Digital HB2 Peak Detector high thresh selected for embedded monitoring but HB2 high source is invalid"); + return recoveryAction; + } + } + + /* If any embedded monitor bit is set to ADI_ADRV904X_RX_EMB_MON_SRC_HB2_LOW_THRESH, verify embeddedMonitorHb2LowSrcSel field */ + if ((embOvldConfigSettings->embeddedMonitorSrcLsbI == ADI_ADRV904X_RX_EMB_MON_SRC_HB2_LOW_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbQ == ADI_ADRV904X_RX_EMB_MON_SRC_HB2_LOW_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneI == ADI_ADRV904X_RX_EMB_MON_SRC_HB2_LOW_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneQ == ADI_ADRV904X_RX_EMB_MON_SRC_HB2_LOW_THRESH)) + { + if ((embOvldConfigSettings->embeddedMonitorHb2LowSrcSel != ADI_ADRV904X_HB2_LOW_SRC_OVRG_LOW) && + (embOvldConfigSettings->embeddedMonitorHb2LowSrcSel != ADI_ADRV904X_HB2_LOW_SRC_OVRG_LOW_INT0) && + (embOvldConfigSettings->embeddedMonitorHb2LowSrcSel != ADI_ADRV904X_HB2_LOW_SRC_OVRG_LOW_INT1) && + (embOvldConfigSettings->embeddedMonitorHb2LowSrcSel != ADI_ADRV904X_HB2_LOW_SRC_OVRG_LOW_THRESH_CNTR_EXCEEDED) && + (embOvldConfigSettings->embeddedMonitorHb2LowSrcSel != ADI_ADRV904X_HB2_LOW_SRC_OVRG_LOW_INT0_THRESH_CNTR_EXCEEDED) && + (embOvldConfigSettings->embeddedMonitorHb2LowSrcSel != ADI_ADRV904X_HB2_LOW_SRC_OVRG_LOW_INT1_THRESH_CNTR_EXCEEDED)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + embOvldConfigSettings->embeddedMonitorHb2LowSrcSel, + "Digital HB2 Peak Detector low thresh selected for embedded monitoring but HB2 low source is invalid"); + return recoveryAction; + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatGainCompDisable(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const uint8_t intDataFormat, + const uint8_t intDataResolution) +{ + static const adi_adrv904x_RxChannels_e RX_CHANNEL_ARR[] = { ADI_ADRV904X_RX0, ADI_ADRV904X_RX1, ADI_ADRV904X_RX2, ADI_ADRV904X_RX3, + ADI_ADRV904X_RX4, ADI_ADRV904X_RX5, ADI_ADRV904X_RX6, ADI_ADRV904X_RX7 }; + static const uint32_t RX_CHANNEL_ARR_SIZE = sizeof(RX_CHANNEL_ARR) / sizeof(RX_CHANNEL_ARR[0U]); + static const adi_adrv904x_RxDdcs_e RX_DDC_BAND_ARR[] = { ADI_ADRV904X_RX_DDC_BAND0, ADI_ADRV904X_RX_DDC_BAND1 }; + static const uint32_t RX_DDC_BAND_ARR_SIZE = sizeof(RX_DDC_BAND_ARR) / sizeof(RX_DDC_BAND_ARR[0U]); + static const adi_adrv904x_RxChannels_e ORX_CHANNEL_ARR[] = { ADI_ADRV904X_ORX0, ADI_ADRV904X_ORX1 }; + static const uint32_t ORX_CHANNEL_ARR_SIZE = sizeof(ORX_CHANNEL_ARR) / sizeof(ORX_CHANNEL_ARR[0U]); + static const uint8_t DEFAULT_INT_EMBED_SLICER = 0U; + static const uint8_t DEFAULT_INT_EMBED_SLICER_POS = 0U; + static const uint8_t DEFAULT_INT_EMBED_SLICER_NUM = 0U; + static const uint8_t DEFAULT_INT_PARITY_SUPPORT = 0U; + static const uint8_t DEFAULT_INT_EVEN_PARITY = 0U; + static const uint8_t DISABLE_GAIN_COMPENSATION = 0U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t gainCompEnStatus = 0U; + + adrv904x_BfRxDdcChanAddr_e baseAddrArr[ADI_ADRV904X_MAX_RX_DDC_BANDS] = { ADRV904X_BF_SLICE_RX_0__RX_DDC_0_, + ADRV904X_BF_SLICE_RX_0__RX_DDC_1_ }; + adrv904x_BfOrxDigChanAddr_e orxDigBaseAddr = (adrv904x_BfOrxDigChanAddr_e) 0U; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Iterate through channel mask and if set disable gain compensation on the corresponding channel */ + for (uint32_t chanIdx = 0U; chanIdx < RX_CHANNEL_ARR_SIZE; chanIdx++) + { + if ((rxChannelMask & (uint32_t)RX_CHANNEL_ARR[chanIdx]) == (uint32_t)RX_CHANNEL_ARR[chanIdx]) + { + /*If an Rx channel mask is set, resolve the corresponding Rx DDC Bitfield Addresses (2 DDCs per channel)*/ + for (uint32_t bandIdx = 0U; bandIdx < RX_DDC_BAND_ARR_SIZE; bandIdx++) + { + recoveryAction = adrv904x_RxDdcBitfieldAddressGet( device, + RX_CHANNEL_ARR[chanIdx], + RX_DDC_BAND_ARR[bandIdx], + &baseAddrArr[bandIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve Rx DDC base address"); + return recoveryAction; + } + } /* end bandIdx for loop */ + + /*Please note that even though gain compensation is disabled, + the embedded slicer bits have to be explicitly set to 0 failing + which the received data will contain slicer bits if it was previously + enabled */ + for (uint32_t bandIdx = 0U; bandIdx < RX_DDC_BAND_ARR_SIZE; bandIdx++) + { + recoveryAction = adrv904x_RxDdc_IntDataFormat_BfSet(device, + NULL, + baseAddrArr[bandIdx], + intDataFormat); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "IntDataFormat Write issue"); + return recoveryAction; + } + + + recoveryAction = adrv904x_RxDdc_IntDataResolution_BfSet(device, + NULL, + baseAddrArr[bandIdx], + intDataResolution); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntDataResolution Write issue"); + return recoveryAction; + } + + for (uint8_t embMonBitIdx = 0U; embMonBitIdx < 2U; embMonBitIdx++) + { + + /* Disable I Sample LSB Posn Embedded overload indicator config */ + recoveryAction = adrv904x_RxDdc_RxMonFormatI_BfSet(device, + NULL, + baseAddrArr[bandIdx], + embMonBitIdx, + (uint8_t)ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxMonFormatI_0 Write issue"); + return recoveryAction; + } + + /* Disable Q Sample LSB + 1 Posn Embedded overload indicator config */ + recoveryAction = adrv904x_RxDdc_RxMonFormatQ_BfSet(device, + NULL, + baseAddrArr[bandIdx], + embMonBitIdx, + (uint8_t)ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxMonFormatQ_1 Write issue"); + return recoveryAction; + } + } /* end embMonBitIdx for loop */ + + /* Disable any Floating Point Modes */ + recoveryAction = adrv904x_RxDdc_FpEn_BfSet( device, + NULL, + baseAddrArr[bandIdx], + ADI_DISABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "FpEn Write issue"); + return recoveryAction; + } + + } /* end bandIdx for loop */ + + /* Check if gain comp is enabled. Read Band0 instance only, assuming all bands are set equivalently */ + recoveryAction = adrv904x_RxDdc_GainCompEnable_BfGet(device, + NULL, + baseAddrArr[0], + &gainCompEnStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GainCompEnable Readback issue"); + return recoveryAction; + } + gainCompEnStatus = gainCompEnStatus ? 1U : 0U; + + + if (gainCompEnStatus) + { + for (uint32_t bandIdx = 0U; bandIdx < RX_DDC_BAND_ARR_SIZE; bandIdx++) + { + /*Disable Ext Slicer Pin Ctrl*/ + recoveryAction = adrv904x_RxDdc_SlicerPinControlMode_BfSet(device, + NULL, + baseAddrArr[bandIdx], + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SlicerPinControlMode Write issue"); + return recoveryAction; + } + + /* Set Embedded Slicer format configs to default */ + recoveryAction = adrv904x_RxDdc_IntEmbedSlicer_BfSet(device, + NULL, + baseAddrArr[bandIdx], + DEFAULT_INT_EMBED_SLICER); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntEmbedSlicer Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_IntEmbedSlicerPos_BfSet(device, + NULL, + baseAddrArr[bandIdx], + DEFAULT_INT_EMBED_SLICER_POS); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntEmbedSlicerPos Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_IntEmbedSlicerNumber_BfSet(device, + NULL, + baseAddrArr[bandIdx], + DEFAULT_INT_EMBED_SLICER_NUM); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntEmbedSlicerNumber Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_IntParitySupport_BfSet(device, + NULL, + baseAddrArr[bandIdx], + DEFAULT_INT_PARITY_SUPPORT); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntParitySupport Write issue"); + return recoveryAction; + } + recoveryAction = adrv904x_RxDdc_IntEvenParity_BfSet(device, + NULL, + baseAddrArr[bandIdx], + DEFAULT_INT_EVEN_PARITY); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntEvenParity Write issue"); + return recoveryAction; + } + + /*Disable Gain Compensation*/ + recoveryAction = adrv904x_RxDdc_GainCompEnable_BfSet(device, + NULL, + baseAddrArr[bandIdx], + DISABLE_GAIN_COMPENSATION); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GainCompEnable Write issue"); + return recoveryAction; + } + } /* end bandIdx for loop */ + } /* end if gainCompEnStatus */ + + /* Disable any currently routed GPIOs for this Rx Channel's Internal Slicer */ + recoveryAction = adrv904x_RxInternalSlicerGpioDisable(device, RX_CHANNEL_ARR[chanIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error disabling Rx Internal Slicer GPIOs."); + return recoveryAction; + } + + } /* end if Rx chanMask set */ + } /* end Rx chanIdx for loop */ + + /* ORx has no gain compensation, slicer, or embedded monitor data options. */ + /* Only basic int format/resolution options exist. */ + for (uint32_t chanIdx = 0U; chanIdx < ORX_CHANNEL_ARR_SIZE; chanIdx++) + { + if ((rxChannelMask & (uint32_t)ORX_CHANNEL_ARR[chanIdx]) == (uint32_t)ORX_CHANNEL_ARR[chanIdx]) + { + /* Get ORxDig base address for this channel */ + recoveryAction = adrv904x_OrxBitfieldAddressGet( device, + ORX_CHANNEL_ARR[chanIdx], + &orxDigBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve ORx Dig base address"); + return recoveryAction; + } + + /* Set Int Data Format */ + recoveryAction = adrv904x_OrxDig_IntDataFormat_BfSet(device, + NULL, + orxDigBaseAddr, + intDataFormat); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "IntDataFormat Write issue"); + return recoveryAction; + } + + /* Set Int Data Resolution */ + recoveryAction = adrv904x_OrxDig_IntDataResolution_BfSet(device, + NULL, + orxDigBaseAddr, + intDataResolution); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "intDataResolution Write issue"); + return recoveryAction; + } + + } /* end if ORx chanMask set */ + } /* end ORx chanIdx for loop */ + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxGainCompExtLnaSet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const uint8_t externalLnaGain) +{ + static const adi_adrv904x_RxChannels_e RX_CHANNEL_ARR[] = { ADI_ADRV904X_RX0, ADI_ADRV904X_RX1, ADI_ADRV904X_RX2, ADI_ADRV904X_RX3, + ADI_ADRV904X_RX4, ADI_ADRV904X_RX5, ADI_ADRV904X_RX6, ADI_ADRV904X_RX7 }; + static const uint32_t RX_CHANNEL_ARR_SIZE = sizeof(RX_CHANNEL_ARR) / sizeof(RX_CHANNEL_ARR[0]); + static const adi_adrv904x_RxDdcs_e RX_DDC_BAND_ARR[] = { ADI_ADRV904X_RX_DDC_BAND0, ADI_ADRV904X_RX_DDC_BAND1 }; + static const uint32_t RX_DDC_BAND_ARR_SIZE = sizeof(RX_DDC_BAND_ARR) / sizeof(RX_DDC_BAND_ARR[0U]); + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxDdcChanAddr_e baseAddr = ADRV904X_BF_SLICE_RX_0__RX_DDC_0_; + uint8_t tmpEnable = externalLnaGain ? ADI_ENABLE : ADI_DISABLE; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Verify that rxChannelMask selects only valid Rx Channels. No ORx */ + if ( (rxChannelMask & (uint32_t)(ADI_ADRV904X_RX_MASK_ALL)) != rxChannelMask ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannelMask, + "Invalid rxChannelMask parameter"); + return recoveryAction; + } + + /* Iterate through channel mask and if set write the ext gain bitfield for both DDCs int he given Rx Channel*/ + for (uint8_t chanIdx = 0U; chanIdx < RX_CHANNEL_ARR_SIZE; chanIdx++) + { + if ((rxChannelMask & (uint32_t)RX_CHANNEL_ARR[chanIdx]) == (uint32_t)RX_CHANNEL_ARR[chanIdx]) + { + + for (uint32_t bandIdx = 0U; bandIdx < RX_DDC_BAND_ARR_SIZE; bandIdx++) + { + /* Get Rx DDC Bitfield Address */ + recoveryAction = adrv904x_RxDdcBitfieldAddressGet( device, + RX_CHANNEL_ARR[chanIdx], + RX_DDC_BAND_ARR[bandIdx], + &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve Rx DDC base address"); + return recoveryAction; + } + + /* Set bitfield */ + recoveryAction = adrv904x_RxDdc_GainCompForExtGain_BfSet(device, + NULL, + baseAddr, + tmpEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GainCompForExtGain Write issue"); + return recoveryAction; + } + + } /* end bandIdx for loop */ + + } /* end rxChannelMask set */ + + } /* end chIdx for loop */ + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxGainCompTempEnableSet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const uint8_t tempCompensationEnable) +{ + static const adi_adrv904x_RxChannels_e RX_CHANNEL_ARR[] = { ADI_ADRV904X_RX0, ADI_ADRV904X_RX1, ADI_ADRV904X_RX2, ADI_ADRV904X_RX3, + ADI_ADRV904X_RX4, ADI_ADRV904X_RX5, ADI_ADRV904X_RX6, ADI_ADRV904X_RX7 }; + static const uint32_t RX_CHANNEL_ARR_SIZE = sizeof(RX_CHANNEL_ARR) / sizeof(RX_CHANNEL_ARR[0]); + static const adi_adrv904x_RxDdcs_e RX_DDC_BAND_ARR[] = { ADI_ADRV904X_RX_DDC_BAND0, ADI_ADRV904X_RX_DDC_BAND1 }; + static const uint32_t RX_DDC_BAND_ARR_SIZE = sizeof(RX_DDC_BAND_ARR) / sizeof(RX_DDC_BAND_ARR[0U]); + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxDdcChanAddr_e baseAddr = ADRV904X_BF_SLICE_RX_0__RX_DDC_0_; + uint8_t tmpEnable = tempCompensationEnable ? ADI_ENABLE : ADI_DISABLE; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Verify that rxChannelMask selects only valid Rx Channels. No ORx */ + if ((rxChannelMask & (uint32_t)(ADI_ADRV904X_RX_MASK_ALL)) != rxChannelMask ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannelMask, + "Invalid rxChannelMask parameter"); + return recoveryAction; + } + + /* Iterate through channel mask and if set write the ext gain bitfield for both DDCs int he given Rx Channel*/ + for (uint8_t chanIdx = 0U; chanIdx < RX_CHANNEL_ARR_SIZE; chanIdx++) + { + if ( (rxChannelMask & (uint32_t)RX_CHANNEL_ARR[chanIdx]) == (uint32_t)RX_CHANNEL_ARR[chanIdx]) + { + + for (uint32_t bandIdx = 0U; bandIdx < RX_DDC_BAND_ARR_SIZE; bandIdx++) + { + /* Get Rx DDC Bitfield Address */ + recoveryAction = adrv904x_RxDdcBitfieldAddressGet( device, + RX_CHANNEL_ARR[chanIdx], + RX_DDC_BAND_ARR[bandIdx], + &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve Rx DDC base address"); + return recoveryAction; + } + + /* Set bitfield */ + recoveryAction = adrv904x_RxDdc_GainCompForTempGain_BfSet(device, + NULL, + baseAddr, + tmpEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GainCompForTempGain Write issue"); + return recoveryAction; + } + + } /* end bandIdx for loop */ + + } /* end rxChannelMask set */ + + } /* end chIdx for loop */ + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatFloatingPointSet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const adi_adrv904x_FloatingPointConfigSettings_t * const floatingPointConfig) +{ + static const adi_adrv904x_RxChannels_e RX_CHANNEL_ARR[] = { ADI_ADRV904X_RX0, ADI_ADRV904X_RX1, ADI_ADRV904X_RX2, ADI_ADRV904X_RX3, + ADI_ADRV904X_RX4, ADI_ADRV904X_RX5, ADI_ADRV904X_RX6, ADI_ADRV904X_RX7 }; + static const uint32_t RX_CHANNEL_ARR_SIZE = sizeof(RX_CHANNEL_ARR) / sizeof(RX_CHANNEL_ARR[0]); + static const adi_adrv904x_RxDdcs_e RX_DDC_BAND_ARR[] = { ADI_ADRV904X_RX_DDC_BAND0, ADI_ADRV904X_RX_DDC_BAND1 }; + static const uint32_t RX_DDC_BAND_ARR_SIZE = sizeof(RX_DDC_BAND_ARR) / sizeof(RX_DDC_BAND_ARR[0U]); + static const uint8_t DEFAULT_INT_DATA_FORMAT = 0U; + static const uint8_t DEFAULT_INT_DATA_RESOLUTION = 1U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxDdcChanAddr_e baseAddr = ADRV904X_BF_SLICE_RX_0__RX_DDC_0_; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, floatingPointConfig); + + /* Verify that rxChannelMask selects only valid Rx Channels. No ORx */ + if ( ((rxChannelMask & (uint32_t)(ADI_ADRV904X_RX_MASK_ALL)) != rxChannelMask) || + (rxChannelMask == ADI_ADRV904X_RXOFF) ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannelMask, + "Invalid rxChannelMask parameter"); + return recoveryAction; + } + + /* Disable Gain Compensation */ + recoveryAction = adrv904x_RxDataFormatGainCompDisable( device, + rxChannelMask, + DEFAULT_INT_DATA_FORMAT, + DEFAULT_INT_DATA_RESOLUTION); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while attempting to Disable Gain Compensation"); + return recoveryAction; + } + + + /* Iterate through channel mask and if set configure the corresponding Rx floating point formatter */ + for (uint8_t chanIdx = 0U; chanIdx < RX_CHANNEL_ARR_SIZE; chanIdx++) + { + if ((rxChannelMask & (uint32_t)RX_CHANNEL_ARR[chanIdx]) == (uint32_t)RX_CHANNEL_ARR[chanIdx]) + { + + for (uint32_t bandIdx = 0U; bandIdx < RX_DDC_BAND_ARR_SIZE; bandIdx++) + { + /* Get Rx DDC Bitfield Address */ + recoveryAction = adrv904x_RxDdcBitfieldAddressGet(device, + RX_CHANNEL_ARR[chanIdx], + RX_DDC_BAND_ARR[bandIdx], + &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve Rx DDC base address"); + return recoveryAction; + } + + /* Set Floating Point Configs */ + recoveryAction = adrv904x_RxDdc_FpRoundMode_BfSet(device, + NULL, + baseAddr, + (adrv904x_Bf_RxDdc_FpRoundMode_e)floatingPointConfig->fpRoundMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpRoundMode Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_FpFloatDataFormat_BfSet(device, + NULL, + baseAddr, + floatingPointConfig->fpDataFormat); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpFloatDataFormat Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_FpNanEncEn_BfSet(device, + NULL, + baseAddr, + floatingPointConfig->fpEncodeNan); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpNanEncEn Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_FpExponentBits_BfSet(device, + NULL, + baseAddr, + (adrv904x_Bf_RxDdc_FpExponentBits_e)floatingPointConfig->fpNumExpBits); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpExponentBits Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_FpHideLeadingOnes_BfSet(device, + NULL, + baseAddr, + floatingPointConfig->fpHideLeadingOne); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpHideLeadingOnes Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_FpIntDataAtten_BfSet(device, + NULL, + baseAddr, + floatingPointConfig->fpAttenSteps); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpIntDataAtten Write issue"); + return recoveryAction; + } + + + /* Enable Floating Point Format on the requested channel */ + recoveryAction = adrv904x_RxDdc_FpEn_BfSet(device, + NULL, + baseAddr, + ADI_ENABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpEn Write issue"); + return recoveryAction; + } + + /* Enable Gain Compensation */ + recoveryAction = adrv904x_RxDdc_GainCompEnable_BfSet(device, + NULL, + baseAddr, + ADI_ENABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "GainCompEnable Write issue"); + return recoveryAction; + } + } /* end of bandIdx for loop */ + } /* end of rxChannel mask if block */ + } /* end of RxChannel for loop */ + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcDataFormatFloatingPointSet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const adi_adrv904x_CddcFloatingPointConfigSettings_t * const floatingPointConfig) +{ + + static const adi_adrv904x_RxChannels_e RX_CHANNEL_ARR[] = { ADI_ADRV904X_RX0, ADI_ADRV904X_RX1, ADI_ADRV904X_RX2, ADI_ADRV904X_RX3, + ADI_ADRV904X_RX4, ADI_ADRV904X_RX5, ADI_ADRV904X_RX6, ADI_ADRV904X_RX7 }; + static const uint32_t RX_CHANNEL_ARR_SIZE = sizeof(RX_CHANNEL_ARR) / sizeof(RX_CHANNEL_ARR[0]); + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfCddcFuncsChanAddr_e baseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, floatingPointConfig); + + /* Verify that rxChannelMask selects only valid Rx Channels. No ORx */ + if ( ((rxChannelMask & (uint32_t)(ADI_ADRV904X_RX_MASK_ALL)) != rxChannelMask) || + (rxChannelMask == ADI_ADRV904X_RXOFF) ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannelMask, + "Invalid rxChannelMask parameter"); + return recoveryAction; + } + + /* Iterate through channel mask and if set configure the corresponding Rx floating point formatter */ + for (uint8_t chanIdx = 0U; chanIdx < RX_CHANNEL_ARR_SIZE; chanIdx++) + { + if ((rxChannelMask & (uint32_t)RX_CHANNEL_ARR[chanIdx]) == (uint32_t)RX_CHANNEL_ARR[chanIdx]) + { + + /* Get CDDC Bitfield Address */ + recoveryAction = adrv904x_CddcFuncsBitfieldAddressGet(device, + RX_CHANNEL_ARR[chanIdx], + &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve Rx DDC base address"); + return recoveryAction; + } + + /* Set Floating Point Configs */ + recoveryAction = adrv904x_CddcFuncs_FormatterFpRoundMode_BfSet(device, + NULL, + baseAddr, + (adrv904x_Bf_RxDdc_FpRoundMode_e)floatingPointConfig->cddcFpRoundMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpRoundMode Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterFpFloatDataFormat_BfSet(device, + NULL, + baseAddr, + floatingPointConfig->cddcFpDataFormat); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpFloatDataFormat Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterFpNanEncEn_BfSet(device, + NULL, + baseAddr, + floatingPointConfig->cddcFpEncodeNan); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpNanEncEn Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterFpExponentBits_BfSet(device, + NULL, + baseAddr, + (adrv904x_Bf_RxDdc_FpExponentBits_e)floatingPointConfig->cddcFpNumExpBits); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpExponentBits Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterFpHideLeadingOnes_BfSet(device, + NULL, + baseAddr, + floatingPointConfig->cddcFpHideLeadingOne); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpHideLeadingOnes Write issue"); + return recoveryAction; + } + + /* Enable Floating Point Format on the requested channel */ + recoveryAction = adrv904x_CddcFuncs_FormatterFpEn_BfSet(device, + NULL, + baseAddr, + floatingPointConfig->cddcFpEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpEn Write issue"); + return recoveryAction; + } + + } /* end of rxChannel mask if block */ + } /* end of RxChannel for loop */ + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatIntegerSet(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const adi_adrv904x_RxDataFormatModes_e formatSelect, + const adi_adrv904x_IntegerConfigSettings_t* const integerConfigSettings, + const adi_adrv904x_SlicerConfigSettings_t* const slicerConfigSettings) +{ + static const adi_adrv904x_RxChannels_e RX_CHANNEL_ARR[] = { ADI_ADRV904X_RX0, ADI_ADRV904X_RX1, ADI_ADRV904X_RX2, ADI_ADRV904X_RX3, + ADI_ADRV904X_RX4, ADI_ADRV904X_RX5, ADI_ADRV904X_RX6, ADI_ADRV904X_RX7 }; + static const uint32_t RX_CHANNEL_ARR_SIZE = sizeof(RX_CHANNEL_ARR) / sizeof(RX_CHANNEL_ARR[0]); + static const adi_adrv904x_RxDdcs_e RX_DDC_BAND_ARR[] = { ADI_ADRV904X_RX_DDC_BAND0, ADI_ADRV904X_RX_DDC_BAND1 }; + static const uint32_t RX_DDC_BAND_ARR_SIZE = sizeof(RX_DDC_BAND_ARR) / sizeof(RX_DDC_BAND_ARR[0U]); + + static const uint8_t DEFAULT_INT_DATA_FORMAT = 0U; + static const uint8_t DEFAULT_INT_DATA_RESOLUTION = 1U; + static const uint8_t SLICER_PIN_CTRL_MODE_INTERNAL = 0U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxDdcChanAddr_e baseAddr = ADRV904X_BF_SLICE_RX_0__RX_DDC_0_; + uint8_t intEmbedSlicer = 0U; + uint8_t intEmbedSlicerPos = 0U; + uint8_t intEmbedSlicerNumber = 0U; + uint8_t slicer3bitModeEn = 0U; + uint8_t intDataResolution = 0U; + uint8_t intDataFormat = 0U; + uint8_t intParitySupport = 0U; + uint8_t intEvenParity = 0U; + uint8_t maxSlicerValue = 0U; + uint8_t maxSlicerOverride = 0U; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, integerConfigSettings); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, slicerConfigSettings); + + /* Verify that rxChannelMask selects only valid Rx Channels. No ORx */ + if ( ((rxChannelMask & (uint32_t)(ADI_ADRV904X_RX_MASK_ALL)) != rxChannelMask) || + (rxChannelMask == ADI_ADRV904X_RXOFF) ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannelMask, + "Invalid rxChannelMask parameter"); + return recoveryAction; + } + + /* Disable Gain Compensation */ + recoveryAction = adrv904x_RxDataFormatGainCompDisable(device, + rxChannelMask, + DEFAULT_INT_DATA_FORMAT, + DEFAULT_INT_DATA_RESOLUTION); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while attempting to Disable Gain Compensation"); + return recoveryAction; + } + + /* Resolve the slicer configuration */ + recoveryAction = adrv904x_RxIntEmbSlicerConfigResolve(device, + formatSelect, + integerConfigSettings->intEmbeddedBits, + integerConfigSettings->intParity, + &intEmbedSlicer, + &intEmbedSlicerPos, + &intEmbedSlicerNumber, + &slicer3bitModeEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to resolve integer embedded slicer config"); + return recoveryAction; + } + + /* Resolve sample resolution */ + recoveryAction = adrv904x_RxIntSampleResFormatResolve(device, + integerConfigSettings, + &intDataResolution, + &intDataFormat); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to resolve integer sample resolution"); + return recoveryAction; + } + + /* Resolve parity selection */ + recoveryAction = adrv904x_RxIntParitySupportResolve(device, + integerConfigSettings, + &intParitySupport, + &intEvenParity); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to resolve integer parity support"); + return recoveryAction; + } + + /* Iterate through channel mask and clear any previously set Internal Slicer Word GPIOs for corresponding Rx channels */ + for (uint8_t chanIdx = 0U; chanIdx < RX_CHANNEL_ARR_SIZE; chanIdx++) + { + if ((rxChannelMask & (uint32_t)RX_CHANNEL_ARR[chanIdx]) == (uint32_t)RX_CHANNEL_ARR[chanIdx]) + { + if ((formatSelect == ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_4PIN_MODE) || + (formatSelect == ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_3PIN_MODE) || + (formatSelect == ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_2PIN_MODE)) + { + /* Disable any GPIOs currently being used to route Internal Slicer word bits for this RxChannel*/ + recoveryAction = adrv904x_RxInternalSlicerGpioDisable(device, RX_CHANNEL_ARR[chanIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error disconnecting Rx Internal Slicer Word bits from previous GPIO pins."); + return recoveryAction; + } + } + } + } + + /* Iterate through channel mask and if set configure integer formatter settings on all DDCs of the corresponding Rx channel */ + for (uint8_t chanIdx = 0U; chanIdx < RX_CHANNEL_ARR_SIZE; chanIdx++) + { + if ((rxChannelMask & (uint32_t)RX_CHANNEL_ARR[chanIdx]) == (uint32_t)RX_CHANNEL_ARR[chanIdx]) + { + + /* If external slicer selected, throw an error indicated mode is not supported */ + if (formatSelect == ADI_ADRV904X_GAIN_WITH_EXTERNAL_SLICER) + { + ADI_ADRV904X_API_NOT_IMPLEMENTED_REPORT_RETURN(&device->common); + } + + /* If format is ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_4PIN_MODE/3PIN_MODE, configure GPIOs */ + else if ((formatSelect == ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_4PIN_MODE) || + (formatSelect == ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_3PIN_MODE) || + (formatSelect == ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_2PIN_MODE)) + { + recoveryAction = adrv904x_RxInternalSlicerGpioEnable(device, + RX_CHANNEL_ARR[chanIdx], + formatSelect, + slicerConfigSettings); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to enable GPIOs for internal slicer observation"); + return recoveryAction; + } + } + + for (uint32_t bandIdx = 0U; bandIdx < RX_DDC_BAND_ARR_SIZE; bandIdx++) + { + /* Get Rx DDC Bitfield Address */ + recoveryAction = adrv904x_RxDdcBitfieldAddressGet(device, + RX_CHANNEL_ARR[chanIdx], + RX_DDC_BAND_ARR[bandIdx], + &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve Rx DDC base address"); + return recoveryAction; + } + + /* Enable Rx Gain Compensation and configure format for the requested Rx Channel */ + recoveryAction = adrv904x_RxDdc_GainCompEnable_BfSet(device, + NULL, + baseAddr, + ADI_ENABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "GainCompEnable Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_IntDataFormat_BfSet(device, + NULL, + baseAddr, + intDataFormat); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "IntDataFormat Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_IntDataResolution_BfSet(device, + NULL, + baseAddr, + intDataResolution); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "IntDataResolution Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_IntEmbedSlicer_BfSet(device, + NULL, + baseAddr, + intEmbedSlicer); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "IntEmbedSlicer Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_IntEmbedSlicerPos_BfSet(device, + NULL, + baseAddr, + intEmbedSlicerPos); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "IntEmbedSlicerPos Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_IntEmbedSlicerNumber_BfSet(device, + NULL, + baseAddr, + intEmbedSlicerNumber); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "IntEmbedSlicerNumber Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_IntParitySupport_BfSet(device, + NULL, + baseAddr, + intParitySupport); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "IntParitySupport Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_IntEvenParity_BfSet(device, + NULL, + baseAddr, + intEvenParity); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "IntEvenParity Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_SlicerPinControlMode_BfSet(device, + NULL, + baseAddr, + SLICER_PIN_CTRL_MODE_INTERNAL); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "SlicerPinControlMode Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_IntSlicerLsbOnQ_BfSet(device, + NULL, + baseAddr, + (uint8_t)integerConfigSettings->intEmbeddedPos); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "IntSlicerLsbOnQ Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_Static3bitSlicerModeEn_BfSet(device, + NULL, + baseAddr, + slicer3bitModeEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Static3bitSlicerModeEn Write issue"); + return recoveryAction; + } + + /* Configure pin control step size */ + recoveryAction = adrv904x_RxDdc_SlicerPinControlStep_BfSet(device, + NULL, + baseAddr, + (uint8_t)slicerConfigSettings->intSlicerStepSize); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Static3bitSlicerModeEn Write issue"); + return recoveryAction; + } + + /* If format is ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_NOGPIO */ + /* and intEmbeddedBits is ADI_ADRV904X_EMBED_2_SLICERBITS_AT_[MSB/LSB]_3_BIT_SLICER, */ + /* then set 3bit slicer mode bit for the rxChannel in the device handle. */ + /* Otherwise clear bit in device handle */ + if (formatSelect == ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_NOGPIO) + { + if ((integerConfigSettings->intEmbeddedBits == ADI_ADRV904X_EMBED_2_SLICERBITS_AT_MSB_3_BIT_SLICER) || + (integerConfigSettings->intEmbeddedBits == ADI_ADRV904X_EMBED_2_SLICERBITS_AT_LSB_3_BIT_SLICER)) + { + device->devStateInfo.rxChannel3bitSlicerMode |= (uint8_t)RX_CHANNEL_ARR[chanIdx]; + } + else + { + device->devStateInfo.rxChannel3bitSlicerMode &= ~(uint8_t)RX_CHANNEL_ARR[chanIdx]; + } + } + else + { + device->devStateInfo.rxChannel3bitSlicerMode &= ~(uint8_t)RX_CHANNEL_ARR[chanIdx]; + } + + maxSlicerOverride = ADI_FALSE; + if (formatSelect == ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_2PIN_MODE) + { + maxSlicerValue = 3U; + maxSlicerOverride = ADI_TRUE; + } + else if (formatSelect == ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_3PIN_MODE) + { + maxSlicerValue = 7U; + maxSlicerOverride = ADI_TRUE; + } + else if (formatSelect == ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_4PIN_MODE) + { + maxSlicerValue = 15U; + maxSlicerOverride = ADI_TRUE; + } + + /* Configure max slicer override value */ + recoveryAction = adrv904x_RxDdc_MaxSlicerOverride_BfSet(device, + NULL, + baseAddr, + maxSlicerOverride); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "MaxSlicerOverride Write issue"); + return recoveryAction; + } + + /* Configure max slicer override value */ + recoveryAction = adrv904x_RxDdc_MaxSlicer_BfSet(device, + NULL, + baseAddr, + maxSlicerValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "MaxSlicer Write issue"); + return recoveryAction; + } + + } /* end bandIdx for loop */ + + } /* end rxChannelMask set */ + + } /* end chIdx for loop */ + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcDataFormatIntegerSet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const adi_adrv904x_CddcDataFormatModes_e formatSelect, + const adi_adrv904x_CddcIntegerConfigSettings_t * const cddcIntegerConfigSettings, + const adi_adrv904x_CddcSlicerConfigSettings_t * const cddcSlicerConfigSettings) +{ + static const adi_adrv904x_RxChannels_e RX_CHANNEL_ARR[] = { ADI_ADRV904X_RX0, ADI_ADRV904X_RX1, ADI_ADRV904X_RX2, ADI_ADRV904X_RX3, + ADI_ADRV904X_RX4, ADI_ADRV904X_RX5, ADI_ADRV904X_RX6, ADI_ADRV904X_RX7 }; + static const uint32_t RX_CHANNEL_ARR_SIZE = sizeof(RX_CHANNEL_ARR) / sizeof(RX_CHANNEL_ARR[0]); + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfCddcFuncsChanAddr_e baseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS; + uint8_t intEmbedSlicer = 0U; + uint8_t intEmbedSlicerPos = 0U; + uint8_t intEmbedSlicerNumber = 0U; + uint8_t slicer3bitModeEn = 0U; + uint8_t intDataResolution = 0U; + uint8_t intDataFormat = 0U; + uint8_t intParitySupport = 0U; + uint8_t intEvenParity = 0U; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cddcIntegerConfigSettings); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cddcSlicerConfigSettings); + + /* Verify that rxChannelMask selects only valid Rx Channels. No ORx */ + if ( ((rxChannelMask & (uint32_t)(ADI_ADRV904X_RX_MASK_ALL)) != rxChannelMask) || + (rxChannelMask == ADI_ADRV904X_RXOFF) ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannelMask, + "Invalid rxChannelMask parameter"); + return recoveryAction; + } + + /* Resolve the slicer configuration */ + recoveryAction = adrv904x_CddcIntEmbSlicerConfigResolve(device, + formatSelect, + cddcIntegerConfigSettings->intEmbeddedBits, + cddcIntegerConfigSettings->intParity, + &intEmbedSlicer, + &intEmbedSlicerPos, + &intEmbedSlicerNumber, + &slicer3bitModeEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to resolve integer embedded slicer config"); + return recoveryAction; + } + + /* Resolve sample resolution */ + recoveryAction = adrv904x_CddcIntSampleResFormatResolve(device, + cddcIntegerConfigSettings, + &intDataResolution, + &intDataFormat); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to resolve integer sample resolution"); + return recoveryAction; + } + + /* Resolve parity selection */ + recoveryAction = adrv904x_CddcIntParitySupportResolve(device, + cddcIntegerConfigSettings, + &intParitySupport, + &intEvenParity); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to resolve integer parity support"); + return recoveryAction; + } + + /* Iterate through channel mask and if set configure integer formatter settings on all CDDCs of the corresponding Rx channel */ + for (uint8_t chanIdx = 0U; chanIdx < RX_CHANNEL_ARR_SIZE; chanIdx++) + { + if ((rxChannelMask & (uint32_t)RX_CHANNEL_ARR[chanIdx]) == (uint32_t)RX_CHANNEL_ARR[chanIdx]) + { + /* Get Get CDDC Bitfield Address */ + recoveryAction = adrv904x_CddcFuncsBitfieldAddressGet(device, + RX_CHANNEL_ARR[chanIdx], + &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve CDDC base address"); + return recoveryAction; + } + + if (cddcSlicerConfigSettings->cddcSlicerCarrierSelect > 7u) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "cddcSlicerCarrierSelect out of range (should be 0-7)"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + NULL, + ((uint32_t) baseAddr + 0x163U), + (uint32_t) cddcSlicerConfigSettings->cddcSlicerCarrierSelect, + 0xFFU); + + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue with cddcSlicerCarrierSelect Select"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterIntDataFormat_BfSet(device, + NULL, + baseAddr, + intDataFormat); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "IntDataFormat Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterIntDataResolution_BfSet(device, + NULL, + baseAddr, + intDataResolution); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "IntDataResolution Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterIntEmbedSlicer_BfSet(device, + NULL, + baseAddr, + intEmbedSlicer); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "IntEmbedSlicer Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterIntEmbedSlicerPos_BfSet(device, + NULL, + baseAddr, + intEmbedSlicerPos); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "IntEmbedSlicerPos Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterIntEmbedSlicerNumber_BfSet(device, + NULL, + baseAddr, + intEmbedSlicerNumber); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "IntEmbedSlicerNumber Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterIntParitySupport_BfSet(device, + NULL, + baseAddr, + intParitySupport); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "IntParitySupport Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterIntEvenParity_BfSet(device, + NULL, + baseAddr, + intEvenParity); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "IntEvenParity Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterIntSlicerLsbOnQ_BfSet(device, + NULL, + baseAddr, + cddcIntegerConfigSettings->intEmbeddedPos); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "IntSlicerLsbOnQ Write issue"); + return recoveryAction; + } + } /* end rxChannelMask set */ + } /* end chIdx for loop */ + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcDataFormatSlicerSet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const adi_adrv904x_CddcSlicerConfigSettings_t * const cddcSlicerConfigSettings) +{ + static const adi_adrv904x_RxChannels_e RX_CHANNEL_ARR[] = { ADI_ADRV904X_RX0, ADI_ADRV904X_RX1, ADI_ADRV904X_RX2, ADI_ADRV904X_RX3, + ADI_ADRV904X_RX4, ADI_ADRV904X_RX5, ADI_ADRV904X_RX6, ADI_ADRV904X_RX7 }; + static const uint32_t RX_CHANNEL_ARR_SIZE = sizeof(RX_CHANNEL_ARR) / sizeof(RX_CHANNEL_ARR[0]); + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfCddcFuncsChanAddr_e baseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cddcSlicerConfigSettings); + + /* Verify that rxChannelMask selects only valid Rx Channels. No ORx */ + if ( ((rxChannelMask & (uint32_t)(ADI_ADRV904X_RX_MASK_ALL)) != rxChannelMask) || + (rxChannelMask == ADI_ADRV904X_RXOFF) ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannelMask, + "Invalid rxChannelMask parameter"); + return recoveryAction; + } + + /* Iterate through channel mask and if set configure integer formatter settings on all CDDCs of the corresponding Rx channel */ + for (uint8_t chanIdx = 0U; chanIdx < RX_CHANNEL_ARR_SIZE; chanIdx++) + { + if ((rxChannelMask & (uint32_t)RX_CHANNEL_ARR[chanIdx]) == (uint32_t)RX_CHANNEL_ARR[chanIdx]) + { + /* Get Get CDDC Bitfield Address */ + recoveryAction = adrv904x_CddcFuncsBitfieldAddressGet(device, + RX_CHANNEL_ARR[chanIdx], + &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve CDDC base address"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterDynamicSlicerAgcSyncEnable_BfSet(device, + NULL, + baseAddr, + cddcSlicerConfigSettings->cddcEnSlicerAgcSync); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "cddcEnSlicerAgcSync Write issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterStatic3bitSlicerModeEn_BfSet(device, + NULL, + baseAddr, + cddcSlicerConfigSettings->cddcEn3BitSlicerMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "cddcEn3BitSlicerMode Readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterCarrierSelect_BfSet(device, + NULL, + baseAddr, + cddcSlicerConfigSettings->cddcFormatterCarrierSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "cddcFormatterCarrierSelect Readback issue"); + return recoveryAction; + } + + if (cddcSlicerConfigSettings->cddcSlicerCarrierSelect > 7u) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "cddcSlicerCarrierSelect out of range (should be 0-7)"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + NULL, + ((uint32_t) baseAddr + 0x163U), + (uint32_t) cddcSlicerConfigSettings->cddcSlicerCarrierSelect, + 0xFFU); + + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register32Write Issue with cddcSlicerCarrierSelect Select"); + return recoveryAction; + } + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatEmbOvldMonitorSet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const adi_adrv904x_EmbOverloadMonitorConfigSettings_t * const embOvldConfigSettings) +{ + static const adi_adrv904x_RxChannels_e RX_CHANNEL_ARR[] = { ADI_ADRV904X_RX0, ADI_ADRV904X_RX1, ADI_ADRV904X_RX2, ADI_ADRV904X_RX3, + ADI_ADRV904X_RX4, ADI_ADRV904X_RX5, ADI_ADRV904X_RX6, ADI_ADRV904X_RX7 }; + static const uint32_t RX_CHANNEL_ARR_SIZE = sizeof(RX_CHANNEL_ARR) / sizeof(RX_CHANNEL_ARR[0]); + + static const uint8_t DEFAULT_INT_DATA_FORMAT = 0U; /* Int data format - 2s complement */ + static const uint8_t DEFAULT_INT_DATA_RESOLUTION = 1U; /* Int sample resolution - 16 bit */ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxFuncsChanAddr_e funcsAddr = ADRV904X_BF_SLICE_RX_0__RX_FUNCS; + + uint8_t enable = 0U; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, embOvldConfigSettings); + + /* Verify that rxChannelMask selects only valid Rx Channels. No ORx */ + if ( ((rxChannelMask & (uint32_t)(ADI_ADRV904X_RX_MASK_ALL)) != rxChannelMask) || + (rxChannelMask == ADI_ADRV904X_RXOFF) ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannelMask, + "Invalid rxChannelMask parameter"); + return recoveryAction; + } + + /*Disable gain compensation and set integer format register to default*/ + recoveryAction = adrv904x_RxDataFormatGainCompDisable( device, + rxChannelMask, + DEFAULT_INT_DATA_FORMAT, + DEFAULT_INT_DATA_RESOLUTION); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to disable gain compensation"); + return recoveryAction; + } + + /* Iterate through channel mask and if set emb overload bitfields for both DDCs in the given Rx Channel*/ + for (uint8_t chanIdx = 0U; chanIdx < RX_CHANNEL_ARR_SIZE; chanIdx++) + { + if ( (rxChannelMask & (uint32_t)RX_CHANNEL_ARR[chanIdx]) == (uint32_t)RX_CHANNEL_ARR[chanIdx]) + { + /* Get Rx Funcs Bitfield Address */ + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet( device, + RX_CHANNEL_ARR[chanIdx], + &funcsAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve Rx Funcs base address"); + return recoveryAction; + } + /* Change recoveryAction value to ADI_ADRV904X_ERR_ACT_CHECK_PARAM so if the embOvldConfigSettings parameters + * aren't valid for any of the following if-conditions there will be a detectable error */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + if ((embOvldConfigSettings->embeddedMonitorSrcLsbI == ADI_ADRV904X_RX_EMB_MON_SRC_APD_HIGH_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbQ == ADI_ADRV904X_RX_EMB_MON_SRC_APD_HIGH_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneI == ADI_ADRV904X_RX_EMB_MON_SRC_APD_HIGH_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneQ == ADI_ADRV904X_RX_EMB_MON_SRC_APD_HIGH_THRESH)) + { + /* Set the APD High Threshold exceeded indicator source */ + recoveryAction = adrv904x_RxFuncs_ApdHighSrcSelect_BfSet(device, + NULL, + funcsAddr, + (uint8_t)embOvldConfigSettings->embeddedMonitorApdHighSrcSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "ApdHighSrcSelect Write issue"); + return recoveryAction; + } + } + + if ((embOvldConfigSettings->embeddedMonitorSrcLsbI == ADI_ADRV904X_RX_EMB_MON_SRC_APD_LOW_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbQ == ADI_ADRV904X_RX_EMB_MON_SRC_APD_LOW_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneI == ADI_ADRV904X_RX_EMB_MON_SRC_APD_LOW_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneQ == ADI_ADRV904X_RX_EMB_MON_SRC_APD_LOW_THRESH)) + { + /* Set the APD Low Threshold exceeded indicator source */ + recoveryAction = adrv904x_RxFuncs_ApdLowSrcSelect_BfSet(device, + NULL, + funcsAddr, + (uint8_t)embOvldConfigSettings->embeddedMonitorApdLowSrcSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "ApdLowSrcSelect Write issue"); + return recoveryAction; + } + } + + if ((embOvldConfigSettings->embeddedMonitorSrcLsbI == ADI_ADRV904X_RX_EMB_MON_SRC_HB2_HIGH_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbQ == ADI_ADRV904X_RX_EMB_MON_SRC_HB2_HIGH_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneI == ADI_ADRV904X_RX_EMB_MON_SRC_HB2_HIGH_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneQ == ADI_ADRV904X_RX_EMB_MON_SRC_HB2_HIGH_THRESH)) + { + /* Set the HB2 High Threshold exceeded indicator source */ + recoveryAction = adrv904x_RxFuncs_Hb2HighSrcSelect_BfSet(device, + NULL, + funcsAddr, + (uint8_t)embOvldConfigSettings->embeddedMonitorHb2HighSrcSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Hb2HighSrcSelect Write issue"); + return recoveryAction; + } + } + + if ((embOvldConfigSettings->embeddedMonitorSrcLsbI == ADI_ADRV904X_RX_EMB_MON_SRC_HB2_LOW_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbQ == ADI_ADRV904X_RX_EMB_MON_SRC_HB2_LOW_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneI == ADI_ADRV904X_RX_EMB_MON_SRC_HB2_LOW_THRESH) || + (embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneQ == ADI_ADRV904X_RX_EMB_MON_SRC_HB2_LOW_THRESH)) + { + /* Set the HB2 Low Threshold exceeded indicator source */ + recoveryAction = adrv904x_RxFuncs_Hb2LowSrcSelect_BfSet(device, + NULL, + funcsAddr, + (uint8_t)embOvldConfigSettings->embeddedMonitorHb2LowSrcSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Hb2LowSrcSelect Write issue"); + return recoveryAction; + } + } + /* If recoveryAction wasn't altered in the previous if-conditions, there must be an error in the configuration */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, embOvldConfigSettings, "Wrong Monitor Source on LSB I and LSB Q or LSB +1 I and LSB + 1 Q"); + return recoveryAction; + } + + /* Set invert Hb2 flag config */ + enable = (embOvldConfigSettings->invertHb2Flag == 0U) ? 0U : 1U; + recoveryAction = adrv904x_RxFuncs_InvertHb2Low_BfSet(device, + NULL, + funcsAddr, + enable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while writing invert Hb2 Flag configuration"); + return recoveryAction; + } + + /* Set invert Apd2 flag config */ + enable = (embOvldConfigSettings->invertApdFlag == 0U) ? 0U : 1U; + recoveryAction = adrv904x_RxFuncs_InvertApdLow_BfSet(device, + NULL, + funcsAddr, + enable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while writing invert Apd Flag configuration"); + return recoveryAction; + } + + recoveryAction = (adi_adrv904x_ErrAction_e)adrv904x_RxEmbeddedOverloadBitsSet( device, + chanIdx, + (uint8_t)embOvldConfigSettings->embeddedMonitorSrcLsbI, + (uint8_t)embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneI, + (uint8_t)embOvldConfigSettings->embeddedMonitorSrcLsbQ, + (uint8_t)embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneQ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing embedded overload bits"); + return recoveryAction; + } + + } /* end rxChannelMask set */ + + } /* end chIdx for loop */ + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcDataFormatEmbOvldMonitorSet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const adi_adrv904x_CddcEmbOverloadMonitorConfigSettings_t * const cddcEmbOvldConfigSettings, + const adi_adrv904x_CddcSlicerConfigSettings_t * const cddcSlicerConfigSettings) +{ + static const adi_adrv904x_RxChannels_e RX_CHANNEL_ARR[] = { ADI_ADRV904X_RX0, ADI_ADRV904X_RX1, ADI_ADRV904X_RX2, ADI_ADRV904X_RX3, + ADI_ADRV904X_RX4, ADI_ADRV904X_RX5, ADI_ADRV904X_RX6, ADI_ADRV904X_RX7 }; + static const uint32_t RX_CHANNEL_ARR_SIZE = sizeof(RX_CHANNEL_ARR) / sizeof(RX_CHANNEL_ARR[0]); + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfCddcFuncsChanAddr_e funcsAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cddcEmbOvldConfigSettings); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cddcSlicerConfigSettings); + + /* Verify that rxChannelMask selects only valid Rx Channels. No ORx */ + if ( ((rxChannelMask & (uint32_t)(ADI_ADRV904X_RX_MASK_ALL)) != rxChannelMask) || + (rxChannelMask == ADI_ADRV904X_RXOFF) ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannelMask, + "Invalid rxChannelMask parameter"); + return recoveryAction; + } + + /* Iterate through channel mask and if set emb overload bitfields for both DDCs in the given Rx Channel*/ + for (uint8_t chanIdx = 0U; chanIdx < RX_CHANNEL_ARR_SIZE; chanIdx++) + { + if ( (rxChannelMask & (uint32_t)RX_CHANNEL_ARR[chanIdx]) == (uint32_t)RX_CHANNEL_ARR[chanIdx]) + { + /* Get Rx Funcs Bitfield Address */ + recoveryAction = adrv904x_CddcFuncsBitfieldAddressGet(device, + RX_CHANNEL_ARR[chanIdx], + &funcsAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve CDDC Funcs base address"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterStaticSlicerAgcSyncEnable_BfSet(device, + NULL, + funcsAddr, + cddcSlicerConfigSettings->cddcEnSlicerAgcSync); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while enabling AGC Sync for CDD slicer mode"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterStatic3bitSlicerModeEn_BfSet(device, + NULL, + funcsAddr, + cddcSlicerConfigSettings->cddcEn3BitSlicerMode); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while enabling 3bit CDDC slicer mode"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcEmbeddedOverloadBitsSet(device, + chanIdx, + (uint8_t)cddcEmbOvldConfigSettings->embeddedMonitorSrcLsbI, + (uint8_t)cddcEmbOvldConfigSettings->embeddedMonitorSrcLsbPlusOneI, + (uint8_t)cddcEmbOvldConfigSettings->embeddedMonitorSrcLsbQ, + (uint8_t)cddcEmbOvldConfigSettings->embeddedMonitorSrcLsbPlusOneQ); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing embedded overload bits"); + return recoveryAction; + } + + } /* end rxChannelMask set */ + + } /* end chIdx for loop */ + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxEmbeddedOverloadBitsSet(adi_adrv904x_Device_t * const device, + uint8_t chanIdx, + uint8_t lsbIData, + uint8_t lsbIPlusData, + uint8_t lsbQData, + uint8_t lsbQPlusData) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + + static const adi_adrv904x_RxChannels_e RX_CHANNEL_ARR[] = { ADI_ADRV904X_RX0, ADI_ADRV904X_RX1, ADI_ADRV904X_RX2, ADI_ADRV904X_RX3, + ADI_ADRV904X_RX4, ADI_ADRV904X_RX5, ADI_ADRV904X_RX6, ADI_ADRV904X_RX7}; + static const adi_adrv904x_RxDdcs_e RX_DDC_BAND_ARR[] = { ADI_ADRV904X_RX_DDC_BAND0, ADI_ADRV904X_RX_DDC_BAND1 }; + static const uint32_t RX_DDC_BAND_ARR_SIZE = sizeof(RX_DDC_BAND_ARR) / sizeof(RX_DDC_BAND_ARR[0U]); + static const uint8_t LSB_POS_I_CHANNEL_ID = 0U; + static const uint8_t LSB_PLUS_ONE_POS_I_CHANNEL_ID = 1U; + static const uint8_t LSB_POS_Q_CHANNEL_ID = 0U; + static const uint8_t LSB_PLUS_ONE_POS_Q_CHANNEL_ID = 1U; + adrv904x_BfRxChanAddr_e rxDigBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_DIG; + adrv904x_BfRxDdcChanAddr_e ddcAddr = ADRV904X_BF_SLICE_RX_0__RX_DDC_0_; + uint8_t routClkDividerVal = 0U; + + /* Set all instances of rx_ddc bitfields */ + for (uint32_t bandIdx = 0U; bandIdx < RX_DDC_BAND_ARR_SIZE; bandIdx++) + { + /* Get Rx DDC Bitfield Address */ + recoveryAction = adrv904x_RxDdcBitfieldAddressGet( device, + RX_CHANNEL_ARR[chanIdx], + RX_DDC_BAND_ARR[bandIdx], + &ddcAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve Rx DDC base address"); + return recoveryAction; + } + + /* I Sample LSB Posn Embedded overload indicator config */ + recoveryAction = adrv904x_RxDdc_RxMonFormatI_BfSet(device, + NULL, + ddcAddr, + LSB_POS_I_CHANNEL_ID, + lsbIData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxMonFormatI_0 Write issue"); + return recoveryAction; + } + + /* I Sample LSB + 1 Posn Embedded overload indicator config */ + recoveryAction = adrv904x_RxDdc_RxMonFormatI_BfSet(device, + NULL, + ddcAddr, + LSB_PLUS_ONE_POS_I_CHANNEL_ID, + lsbIPlusData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxMonFormatI_1 Write issue"); + return recoveryAction; + } + + /* Q Sample LSB Posn Embedded overload indicator config */ + recoveryAction = adrv904x_RxDdc_RxMonFormatQ_BfSet(device, + NULL, + ddcAddr, + LSB_POS_Q_CHANNEL_ID, + lsbQData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxMonFormatQ_0 Write issue"); + return recoveryAction; + } + + /* Q Sample LSB + 1 Posn Embedded overload indicator config */ + recoveryAction = adrv904x_RxDdc_RxMonFormatQ_BfSet(device, + NULL, + ddcAddr, + LSB_PLUS_ONE_POS_Q_CHANNEL_ID, + lsbQPlusData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxMonFormatQ_1 Write issue"); + return recoveryAction; + } + + } /* end bandIdx for loop */ + + /* Enable the JESD clock for embedded overload bits if there at least one bit is being used */ + if ((lsbIData != (uint8_t)ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED) || + (lsbQData != (uint8_t)ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED) || + (lsbIPlusData != (uint8_t)ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED) || + (lsbQPlusData != (uint8_t)ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED)) + { + recoveryAction = adrv904x_RxBitfieldAddressGet(device, RX_CHANNEL_ARR[chanIdx], &rxDigBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid Rx Channel used to determine rx dig address"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDig_RoutClkDivideRatio_BfGet(device, NULL, rxDigBaseAddr, &routClkDividerVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read rout clock divider value"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDig_Ddc1Hb1OutClkDivideRatio_BfSet(device, NULL, rxDigBaseAddr, routClkDividerVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write ddc1 hb1 out clock div ratio"); + return recoveryAction; + } + + /* This is to provide smon block a clock source */ + recoveryAction = adrv904x_RxDig_StreamprocDdc1Hb1OutClkEnable_BfSet(device, NULL, rxDigBaseAddr, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to set ddc1 hb1 out clock enable"); + return recoveryAction; + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcEmbeddedOverloadBitsSet(adi_adrv904x_Device_t * const device, + uint8_t chanIdx, + uint8_t lsbIData, + uint8_t lsbIPlusData, + uint8_t lsbQData, + uint8_t lsbQPlusData) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + + static const adi_adrv904x_RxChannels_e RX_CHANNEL_ARR[] = { ADI_ADRV904X_RX0, ADI_ADRV904X_RX1, ADI_ADRV904X_RX2, ADI_ADRV904X_RX3, + ADI_ADRV904X_RX4, ADI_ADRV904X_RX5, ADI_ADRV904X_RX6, ADI_ADRV904X_RX7}; + static const adi_adrv904x_RxDdcs_e RX_DDC_BAND_ARR[] = { ADI_ADRV904X_RX_DDC_BAND0, ADI_ADRV904X_RX_DDC_BAND1 }; + static const uint32_t RX_DDC_BAND_ARR_SIZE = sizeof(RX_DDC_BAND_ARR) / sizeof(RX_DDC_BAND_ARR[0U]); + adrv904x_BfCddcFuncsChanAddr_e cddcAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS; + + /* Set all instances of rx_ddc bitfields */ + for (uint32_t bandIdx = 0U; bandIdx < RX_DDC_BAND_ARR_SIZE; bandIdx++) + { + /* Get Rx DDC Bitfield Address */ + recoveryAction = adrv904x_CddcFuncsBitfieldAddressGet(device, + RX_CHANNEL_ARR[chanIdx], + &cddcAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve Rx DDC base address"); + return recoveryAction; + } + + /* I Sample LSB Posn Embedded overload indicator config */ + recoveryAction = adrv904x_CddcFuncs_FormatterRxMonFormatI0_BfSet(device, + NULL, + cddcAddr, + lsbIData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CDDC MonFormatI_0 Write issue"); + return recoveryAction; + } + + /* I Sample LSB + 1 Posn Embedded overload indicator config */ + recoveryAction = adrv904x_CddcFuncs_FormatterRxMonFormatI1_BfSet(device, + NULL, + cddcAddr, + lsbIPlusData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CDDC MonFormatI_1 Write issue"); + return recoveryAction; + } + + /* Q Sample LSB Posn Embedded overload indicator config */ + recoveryAction = adrv904x_CddcFuncs_FormatterRxMonFormatQ0_BfSet(device, + NULL, + cddcAddr, + lsbQData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CDDC MonFormatQ_0 Write issue"); + return recoveryAction; + } + + /* Q Sample LSB + 1 Posn Embedded overload indicator config */ + recoveryAction = adrv904x_CddcFuncs_FormatterRxMonFormatQ1_BfSet(device, + NULL, + cddcAddr, + lsbQPlusData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CDDC MonFormatQ_1 Write issue"); + return recoveryAction; + } + + } /* end bandIdx for loop */ + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxIntSampleResFormatResolve(adi_adrv904x_Device_t * const device, + const adi_adrv904x_IntegerConfigSettings_t * const integerConfigSettings, + uint8_t * const intDataResolution, + uint8_t * const intDataFormat) +{ + static const uint8_t INT_DATA_FORMAT_2S_COMPLEMENT = 0U; + static const uint8_t INT_DATA_FORMAT_SIGNED_MAGNITUDE = 1U; + static const uint8_t INT_DATA_RESOLUTION_12BITS = 0U; + static const uint8_t INT_DATA_RESOLUTION_16BITS = 1U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, integerConfigSettings); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, intDataResolution); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, intDataFormat); + + /* Resolve Sample Resolution */ + switch (integerConfigSettings->intSampleResolution) + { + case ADI_ADRV904X_INTEGER_12BIT_2SCOMP: + { + *intDataResolution = INT_DATA_RESOLUTION_12BITS; + *intDataFormat = INT_DATA_FORMAT_2S_COMPLEMENT; + break; + } + + case ADI_ADRV904X_INTEGER_12BIT_SIGNED: + { + *intDataResolution = INT_DATA_RESOLUTION_12BITS; + *intDataFormat = INT_DATA_FORMAT_SIGNED_MAGNITUDE; + break; + } + + case ADI_ADRV904X_INTEGER_16BIT_2SCOMP: + { + *intDataResolution = INT_DATA_RESOLUTION_16BITS; + *intDataFormat = INT_DATA_FORMAT_2S_COMPLEMENT; + break; + } + + case ADI_ADRV904X_INTEGER_16BIT_SIGNED: + { + *intDataResolution = INT_DATA_RESOLUTION_16BITS; + *intDataFormat = INT_DATA_FORMAT_SIGNED_MAGNITUDE; + break; + } + + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + integerConfigSettings->intSampleResolution, + "Invalid integer formatter data resolution selected"); + return recoveryAction; + + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcIntSampleResFormatResolve(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CddcIntegerConfigSettings_t* const cddcIntegerConfigSettings, + uint8_t* const intDataResolution, + uint8_t* const intDataFormat) +{ + static const uint8_t INT_DATA_FORMAT_2S_COMPLEMENT = 0U; + static const uint8_t INT_DATA_FORMAT_SIGNED_MAGNITUDE = 1U; + static const uint8_t INT_DATA_RESOLUTION_12BITS = 0U; + static const uint8_t INT_DATA_RESOLUTION_16BITS = 1U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cddcIntegerConfigSettings); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, intDataResolution); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, intDataFormat); + + /* Resolve Sample Resolution */ + switch (cddcIntegerConfigSettings->intSampleResolution) + { + case ADI_ADRV904X_INTEGER_12BIT_2SCOMP: + { + *intDataResolution = INT_DATA_RESOLUTION_12BITS; + *intDataFormat = INT_DATA_FORMAT_2S_COMPLEMENT; + break; + } + + case ADI_ADRV904X_INTEGER_12BIT_SIGNED: + { + *intDataResolution = INT_DATA_RESOLUTION_12BITS; + *intDataFormat = INT_DATA_FORMAT_SIGNED_MAGNITUDE; + break; + } + + case ADI_ADRV904X_INTEGER_16BIT_2SCOMP: + { + *intDataResolution = INT_DATA_RESOLUTION_16BITS; + *intDataFormat = INT_DATA_FORMAT_2S_COMPLEMENT; + break; + } + + case ADI_ADRV904X_INTEGER_16BIT_SIGNED: + { + *intDataResolution = INT_DATA_RESOLUTION_16BITS; + *intDataFormat = INT_DATA_FORMAT_SIGNED_MAGNITUDE; + break; + } + + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cddcIntegerConfigSettings->intSampleResolution, + "Invalid integer formatter data resolution selected"); + return recoveryAction; + + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxInternalSlicerGpioDisable(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t slicerBit = 0U; + adi_adrv904x_GpioPinSel_e tmpPin = ADI_ADRV904X_GPIO_INVALID; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Get channel index from enum */ + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "Invalid Rx channel selected for GPIOs to be disabled. Must be in range RX0-RX7."); + return recoveryAction; + } + + /* Release any of the slicer bits from previous GPIOs */ + for (slicerBit = 0U; slicerBit < ADI_ADRV904X_MAX_RX_INT_SLICER_BITS; slicerBit++) + { + recoveryAction = adrv904x_GpioSignalFind( device, + &tmpPin, + adrv904x_RxInternalSlicerOutputSignals[slicerBit], + (adi_adrv904x_Channels_e)rxChannel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error searching for previous GPIO that was routing Rx Internal Slicer Word bit."); + return recoveryAction; + } + + if (tmpPin != ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = adrv904x_GpioSignalRelease( device, + tmpPin, + adrv904x_RxInternalSlicerOutputSignals[slicerBit], + (uint32_t)rxChannel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error releasing previous GPIO that was routing Rx Internal Slicer Word bit."); + return recoveryAction; + } + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxInternalSlicerGpioEnable(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + const adi_adrv904x_RxDataFormatModes_e intSlicerFormatSel, + const adi_adrv904x_SlicerConfigSettings_t* const slicerConfigSettings) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t NUM_BITS = 0U; + uint8_t slicerBit = 0U; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Get channel index from enum */ + switch (rxChannel) + { + case (ADI_ADRV904X_RX0): /* Fall through */ + case (ADI_ADRV904X_RX1): /* Fall through */ + case (ADI_ADRV904X_RX2): /* Fall through */ + case (ADI_ADRV904X_RX3): /* Fall through */ + case (ADI_ADRV904X_RX4): /* Fall through */ + case (ADI_ADRV904X_RX5): /* Fall through */ + case (ADI_ADRV904X_RX6): /* Fall through */ + case (ADI_ADRV904X_RX7): + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "Invalid Rx channel selected for GPIOs to be enabled. Must be in range RX0-RX7."); + return recoveryAction; + } + + /* Set number of Slicer bits required by chosen IntSlicerFormatSel */ + switch (intSlicerFormatSel) + { + case (ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_4PIN_MODE): + NUM_BITS = 4U; + break; + case (ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_3PIN_MODE): + NUM_BITS = 3U; + break; + case (ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_2PIN_MODE): + NUM_BITS = 2U; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + intSlicerFormatSel, + "Invalid Rx Internal Slicer Format selected for GPIO setup. Must be 4PIN Mode or 3PIN mode to enable GPIOs."); + return recoveryAction; + } + + /* Route selected GPIOs for RX Internal Slicer Word bits, for this Rx Channel */ + for (slicerBit = 0U; slicerBit < NUM_BITS; slicerBit++) + { + recoveryAction = adrv904x_GpioSignalSet( device, + slicerConfigSettings->intSlicerGpioSelect[slicerBit], + adrv904x_RxInternalSlicerOutputSignals[slicerBit], + (uint32_t)rxChannel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error routing Rx Internal Slicer Word bit to GPIO pin."); + return recoveryAction; + } + } + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxIntEmbSlicerConfigResolve(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxDataFormatModes_e formatSelect, + const adi_adrv904x_RxSlicerEmbeddedBits_e intEmbeddedBits, + const adi_adrv904x_RxIntParity_e parity, + uint8_t * const intEmbedSlicer, + uint8_t * const intEmbedSlicerPos, + uint8_t * const intEmbedSlicerNumber, + uint8_t * const staticSlicer3bitModeEn) +{ + static const uint8_t INT_EMBED_SLICER_DISABLE = 0U; + static const uint8_t INT_EMBED_SLICER_ENABLE = 1U; + static const uint8_t INT_EMBED_SLICER_POS_MSB = 0U; + static const uint8_t INT_EMBED_SLICER_POS_LSB = 1U; + static const uint8_t INT_EMBED_SLICER_2_BITS = 0U; + static const uint8_t INT_EMBED_SLICER_1_BIT = 1U; + static const uint8_t INT_SLICER_3_BIT_MODE_DISABLE = 0U; + static const uint8_t INT_SLICER_3_BIT_MODE_ENABLE = 1U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, intEmbedSlicer); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, intEmbedSlicerPos); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, intEmbedSlicerNumber); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, staticSlicer3bitModeEn); + + if ( formatSelect == ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_NOGPIO ) + { + /* Resolve slicer and slicer position configs */ + switch (intEmbeddedBits) + { + case ADI_ADRV904X_NO_EMBEDDED_SLICER_BITS: + *intEmbedSlicer = INT_EMBED_SLICER_DISABLE; + *intEmbedSlicerPos = INT_EMBED_SLICER_POS_MSB; + *intEmbedSlicerNumber = INT_EMBED_SLICER_2_BITS; + *staticSlicer3bitModeEn = INT_SLICER_3_BIT_MODE_DISABLE; + break; + case ADI_ADRV904X_EMBED_1_SLICERBIT_AT_MSB: + *intEmbedSlicer = INT_EMBED_SLICER_ENABLE; + *intEmbedSlicerPos = INT_EMBED_SLICER_POS_MSB; + *intEmbedSlicerNumber = INT_EMBED_SLICER_1_BIT; + *staticSlicer3bitModeEn = INT_SLICER_3_BIT_MODE_DISABLE; + break; + case ADI_ADRV904X_EMBED_1_SLICERBIT_AT_LSB: + *intEmbedSlicer = INT_EMBED_SLICER_ENABLE; + *intEmbedSlicerPos = INT_EMBED_SLICER_POS_LSB; + *intEmbedSlicerNumber = INT_EMBED_SLICER_1_BIT; + *staticSlicer3bitModeEn = INT_SLICER_3_BIT_MODE_DISABLE; + break; + case ADI_ADRV904X_EMBED_2_SLICERBITS_AT_MSB_3_BIT_SLICER: + *intEmbedSlicer = INT_EMBED_SLICER_ENABLE; + *intEmbedSlicerPos = INT_EMBED_SLICER_POS_MSB; + *intEmbedSlicerNumber = INT_EMBED_SLICER_2_BITS; + *staticSlicer3bitModeEn = (parity == ADI_ADRV904X_NO_PARITY) ? + INT_SLICER_3_BIT_MODE_ENABLE : + INT_SLICER_3_BIT_MODE_DISABLE; + break; + case ADI_ADRV904X_EMBED_2_SLICERBITS_AT_LSB_3_BIT_SLICER: + *intEmbedSlicer = INT_EMBED_SLICER_ENABLE; + *intEmbedSlicerPos = INT_EMBED_SLICER_POS_LSB; + *intEmbedSlicerNumber = INT_EMBED_SLICER_2_BITS; + *staticSlicer3bitModeEn = (parity == ADI_ADRV904X_NO_PARITY) ? + INT_SLICER_3_BIT_MODE_ENABLE : + INT_SLICER_3_BIT_MODE_DISABLE; + break; + case ADI_ADRV904X_EMBED_2_SLICERBITS_AT_MSB_4_BIT_SLICER: + *intEmbedSlicer = INT_EMBED_SLICER_ENABLE; + *intEmbedSlicerPos = INT_EMBED_SLICER_POS_MSB; + *intEmbedSlicerNumber = INT_EMBED_SLICER_2_BITS; + *staticSlicer3bitModeEn = INT_SLICER_3_BIT_MODE_DISABLE; + break; + case ADI_ADRV904X_EMBED_2_SLICERBITS_AT_LSB_4_BIT_SLICER: + *intEmbedSlicer = INT_EMBED_SLICER_ENABLE; + *intEmbedSlicerPos = INT_EMBED_SLICER_POS_LSB; + *intEmbedSlicerNumber = INT_EMBED_SLICER_2_BITS; + *staticSlicer3bitModeEn = INT_SLICER_3_BIT_MODE_DISABLE; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + intEmbeddedBits, + "Invalid integer formatter embedded slicer mode config selected"); + return recoveryAction; + break; + } + } + else + { + /* For other data format modes set int embedded slicer config to default */ + *intEmbedSlicer = INT_EMBED_SLICER_DISABLE; + *intEmbedSlicerPos = INT_EMBED_SLICER_POS_MSB; + *intEmbedSlicerNumber = INT_EMBED_SLICER_2_BITS; + *staticSlicer3bitModeEn = INT_SLICER_3_BIT_MODE_DISABLE; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcIntEmbSlicerConfigResolve(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CddcDataFormatModes_e formatSelect, + const adi_adrv904x_RxSlicerEmbeddedBits_e intEmbeddedBits, + const adi_adrv904x_RxIntParity_e parity, + uint8_t* const intEmbedSlicer, + uint8_t* const intEmbedSlicerPos, + uint8_t* const intEmbedSlicerNumber, + uint8_t* const staticSlicer3bitModeEn) +{ + static const uint8_t INT_EMBED_SLICER_DISABLE = 0U; + static const uint8_t INT_EMBED_SLICER_ENABLE = 1U; + static const uint8_t INT_EMBED_SLICER_POS_MSB = 0U; + static const uint8_t INT_EMBED_SLICER_POS_LSB = 1U; + static const uint8_t INT_EMBED_SLICER_2_BITS = 0U; + static const uint8_t INT_EMBED_SLICER_1_BIT = 1U; + static const uint8_t INT_SLICER_3_BIT_MODE_DISABLE = 0U; + static const uint8_t INT_SLICER_3_BIT_MODE_ENABLE = 1U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, intEmbedSlicer); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, intEmbedSlicerPos); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, intEmbedSlicerNumber); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, staticSlicer3bitModeEn); + + if (formatSelect == ADI_ADRV904X_CDDC_INTEGER) + { + /* Resolve slicer and slicer position configs */ + switch (intEmbeddedBits) + { + case ADI_ADRV904X_NO_EMBEDDED_SLICER_BITS: + *intEmbedSlicer = INT_EMBED_SLICER_DISABLE; + *intEmbedSlicerPos = INT_EMBED_SLICER_POS_MSB; + *intEmbedSlicerNumber = INT_EMBED_SLICER_2_BITS; + *staticSlicer3bitModeEn = INT_SLICER_3_BIT_MODE_DISABLE; + break; + case ADI_ADRV904X_EMBED_1_SLICERBIT_AT_MSB: + *intEmbedSlicer = INT_EMBED_SLICER_ENABLE; + *intEmbedSlicerPos = INT_EMBED_SLICER_POS_MSB; + *intEmbedSlicerNumber = INT_EMBED_SLICER_1_BIT; + *staticSlicer3bitModeEn = INT_SLICER_3_BIT_MODE_DISABLE; + break; + case ADI_ADRV904X_EMBED_1_SLICERBIT_AT_LSB: + *intEmbedSlicer = INT_EMBED_SLICER_ENABLE; + *intEmbedSlicerPos = INT_EMBED_SLICER_POS_LSB; + *intEmbedSlicerNumber = INT_EMBED_SLICER_1_BIT; + *staticSlicer3bitModeEn = INT_SLICER_3_BIT_MODE_DISABLE; + break; + case ADI_ADRV904X_EMBED_2_SLICERBITS_AT_MSB_3_BIT_SLICER: + *intEmbedSlicer = INT_EMBED_SLICER_ENABLE; + *intEmbedSlicerPos = INT_EMBED_SLICER_POS_MSB; + *intEmbedSlicerNumber = INT_EMBED_SLICER_2_BITS; + *staticSlicer3bitModeEn = (parity == ADI_ADRV904X_NO_PARITY) ? + INT_SLICER_3_BIT_MODE_ENABLE : + INT_SLICER_3_BIT_MODE_DISABLE; + break; + case ADI_ADRV904X_EMBED_2_SLICERBITS_AT_LSB_3_BIT_SLICER: + *intEmbedSlicer = INT_EMBED_SLICER_ENABLE; + *intEmbedSlicerPos = INT_EMBED_SLICER_POS_LSB; + *intEmbedSlicerNumber = INT_EMBED_SLICER_2_BITS; + *staticSlicer3bitModeEn = (parity == ADI_ADRV904X_NO_PARITY) ? + INT_SLICER_3_BIT_MODE_ENABLE : + INT_SLICER_3_BIT_MODE_DISABLE; + break; + case ADI_ADRV904X_EMBED_2_SLICERBITS_AT_MSB_4_BIT_SLICER: + *intEmbedSlicer = INT_EMBED_SLICER_ENABLE; + *intEmbedSlicerPos = INT_EMBED_SLICER_POS_MSB; + *intEmbedSlicerNumber = INT_EMBED_SLICER_2_BITS; + *staticSlicer3bitModeEn = INT_SLICER_3_BIT_MODE_DISABLE; + break; + case ADI_ADRV904X_EMBED_2_SLICERBITS_AT_LSB_4_BIT_SLICER: + *intEmbedSlicer = INT_EMBED_SLICER_ENABLE; + *intEmbedSlicerPos = INT_EMBED_SLICER_POS_LSB; + *intEmbedSlicerNumber = INT_EMBED_SLICER_2_BITS; + *staticSlicer3bitModeEn = INT_SLICER_3_BIT_MODE_DISABLE; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + intEmbeddedBits, + "Invalid integer formatter embedded slicer mode config selected"); + return recoveryAction; + break; + } + } + else + { + /* For other data format modes set int embedded slicer config to default */ + *intEmbedSlicer = INT_EMBED_SLICER_DISABLE; + *intEmbedSlicerPos = INT_EMBED_SLICER_POS_MSB; + *intEmbedSlicerNumber = INT_EMBED_SLICER_2_BITS; + *staticSlicer3bitModeEn = INT_SLICER_3_BIT_MODE_DISABLE; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxIntParitySupportResolve(adi_adrv904x_Device_t * const device, + const adi_adrv904x_IntegerConfigSettings_t * const integerConfigSettings, + uint8_t * const intParitySupport, + uint8_t * const intEvenParity) +{ + static const uint8_t INT_PARITY_SUPPORT_DISABLE = 0U; + static const uint8_t INT_PARITY_SUPPORT_ENABLE = 1U; + static const uint8_t INT_PARITY_EVEN = 0U; + static const uint8_t INT_PARITY_ODD = 1U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, integerConfigSettings); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, intParitySupport); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, intEvenParity); + + switch (integerConfigSettings->intParity) + { + case ADI_ADRV904X_3BIT_SLICER_ODD_PARITY: + *intParitySupport = INT_PARITY_SUPPORT_ENABLE; + *intEvenParity = INT_PARITY_ODD; + break; + case ADI_ADRV904X_3BIT_SLICER_EVEN_PARITY: + *intParitySupport = INT_PARITY_SUPPORT_ENABLE; + *intEvenParity = INT_PARITY_EVEN; + break; + case ADI_ADRV904X_NO_PARITY: + *intParitySupport = INT_PARITY_SUPPORT_DISABLE; + *intEvenParity = INT_PARITY_EVEN; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + integerConfigSettings->intParity, + "Invalid integer formatter parity selection"); + return recoveryAction; + break; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcIntParitySupportResolve(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CddcIntegerConfigSettings_t* const cddcIntegerConfigSettings, + uint8_t* const intParitySupport, + uint8_t* const intEvenParity) +{ + static const uint8_t INT_PARITY_SUPPORT_DISABLE = 0U; + static const uint8_t INT_PARITY_SUPPORT_ENABLE = 1U; + static const uint8_t INT_PARITY_EVEN = 0U; + static const uint8_t INT_PARITY_ODD = 1U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cddcIntegerConfigSettings); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, intParitySupport); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, intEvenParity); + + switch (cddcIntegerConfigSettings->intParity) + { + case ADI_ADRV904X_3BIT_SLICER_ODD_PARITY: + *intParitySupport = INT_PARITY_SUPPORT_ENABLE; + *intEvenParity = INT_PARITY_ODD; + break; + case ADI_ADRV904X_3BIT_SLICER_EVEN_PARITY: + *intParitySupport = INT_PARITY_SUPPORT_ENABLE; + *intEvenParity = INT_PARITY_EVEN; + break; + case ADI_ADRV904X_NO_PARITY: + *intParitySupport = INT_PARITY_SUPPORT_DISABLE; + *intEvenParity = INT_PARITY_EVEN; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cddcIntegerConfigSettings->intParity, + "Invalid integer formatter parity selection"); + return recoveryAction; + break; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatSelectGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_RxDataFormatModes_e * const rxDataFormat) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxDdcChanAddr_e baseAddr = ADRV904X_BF_SLICE_RX_0__RX_DDC_0_; + uint8_t gainCompEnStatus = 0U; + uint8_t floatingPointEn = 0U; + uint8_t rxExtSlicerModeEn = 0U; + uint8_t intEmbedSlicer = 0U; + + adi_adrv904x_EmbOverloadMonitorConfigSettings_t embOvldMonitorSettings = { ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + ADI_ADRV904X_HB2_LOW_SRC_OVRG_LOW, + ADI_ADRV904X_HB2_HIGH_SRC_OVRG_HIGH, + ADI_ADRV904X_APD_LOW_SRC_LOWER_LEVEL_BLOCKER_EXCEEDED, + ADI_ADRV904X_APD_HIGH_SRC_UPPER_LEVEL_BLOCKER_EXCEEDED, + 0U, + 0U }; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxDataFormat); + + /* Check if the requested rxChannel is valid Rx channel. */ + if ((rxChannel == ADI_ADRV904X_RX0) || + (rxChannel == ADI_ADRV904X_RX1) || + (rxChannel == ADI_ADRV904X_RX2) || + (rxChannel == ADI_ADRV904X_RX3) || + (rxChannel == ADI_ADRV904X_RX4) || + (rxChannel == ADI_ADRV904X_RX5) || + (rxChannel == ADI_ADRV904X_RX6) || + (rxChannel == ADI_ADRV904X_RX7)) + { + + /* Get Rx DDC Bitfield Address. Band0 only and assume all other bands are equivalent */ + recoveryAction = adrv904x_RxDdcBitfieldAddressGet( device, + rxChannel, + ADI_ADRV904X_RX_DDC_BAND0, + &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve Rx DDC base address"); + return recoveryAction; + } + + + /* Check if gain comp is enabled. Read Band0 instance only, assuming all bands are set equivalently */ + recoveryAction = adrv904x_RxDdc_GainCompEnable_BfGet(device, + NULL, + baseAddr, + &gainCompEnStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GainCompEnable Readback issue"); + return recoveryAction; + } + gainCompEnStatus = gainCompEnStatus ? ADI_ENABLE : ADI_DISABLE; + + /* If gain compensation is not enabled, determine if there embedded overload monitor data is being used */ + if (gainCompEnStatus == ADI_DISABLE) + { + + recoveryAction = adrv904x_RxDataFormatEmbOvldMonitorGet(device, rxChannel, &embOvldMonitorSettings); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve embOvldMonitorSettings"); + return recoveryAction; + } + + if ((embOvldMonitorSettings.embeddedMonitorSrcLsbI == ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED) && + (embOvldMonitorSettings.embeddedMonitorSrcLsbQ == ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED) && + (embOvldMonitorSettings.embeddedMonitorSrcLsbPlusOneI == ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED) && + (embOvldMonitorSettings.embeddedMonitorSrcLsbPlusOneQ == ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED)) + { + *rxDataFormat = ADI_ADRV904X_GAIN_COMPENSATION_DISABLED; + } + else + { + *rxDataFormat = ADI_ADRV904X_EMBED_OVERLOAD_MONITOR_DATA; + } + + } + + /* If gain compensation is enabled, check if other modes are being used */ + else + { + /* Check if floating point mode is enabled */ + recoveryAction = adrv904x_RxDdc_FpEn_BfGet(device, + NULL, + baseAddr, + &floatingPointEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Floating Point Enable Readback issue"); + return recoveryAction; + } + + if (floatingPointEn) + { + *rxDataFormat = ADI_ADRV904X_GAIN_WITH_FLOATING_POINT; + } + else + { + /* Check if Rx Slicer Pin Control Mode = External */ + recoveryAction = adrv904x_RxDdc_SlicerPinControlMode_BfGet(device, + NULL, + baseAddr, + &rxExtSlicerModeEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SlicerPinControlMode Readback issue"); + return recoveryAction; + } + + if (rxExtSlicerModeEn) + { + *rxDataFormat = ADI_ADRV904X_GAIN_WITH_EXTERNAL_SLICER; + } + else + { + recoveryAction = adrv904x_RxDdc_IntEmbedSlicer_BfGet(device, + NULL, + baseAddr, + &intEmbedSlicer); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxIntEmbedSlicer Readback issue"); + return recoveryAction; + } + + if (intEmbedSlicer) + { + *rxDataFormat = ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_NOGPIO; + } + else + { + recoveryAction = adrv904x_RxInternalSlicerGpioEnableGet( device, + rxChannel, + rxDataFormat, + NULL); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve rxDataFormat"); + return recoveryAction; + } + } + } + + } + } + + } /* End valid Rx Channel if block */ + + /* Check if the requested rxChannel is valid ORx channel */ + else if ((rxChannel == ADI_ADRV904X_ORX0) || + (rxChannel == ADI_ADRV904X_ORX1) ) + { + /* Only possible format for ORx channels is ADI_ADRV904X_GAIN_COMPENSATION_DISABLED */ + *rxDataFormat = ADI_ADRV904X_GAIN_COMPENSATION_DISABLED; + } /* End valid ORx Channel if block */ + + /* Otherwise, throw an error for invalid Rx channel */ + else { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "Invalid Rx Channel Requested for RxDataFormatSelectGet"); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcDataFormatSelectGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_CddcDataFormatModes_e * const cddcDataFormat) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + adi_adrv904x_CddcEmbOverloadMonitorConfigSettings_t cddcEmbOvldMonitorSettings = {ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED}; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cddcDataFormat); + + /* Check if the requested rxChannel is valid Rx channel. */ + if ((rxChannel == ADI_ADRV904X_RX0) || + (rxChannel == ADI_ADRV904X_RX1) || + (rxChannel == ADI_ADRV904X_RX2) || + (rxChannel == ADI_ADRV904X_RX3) || + (rxChannel == ADI_ADRV904X_RX4) || + (rxChannel == ADI_ADRV904X_RX5) || + (rxChannel == ADI_ADRV904X_RX6) || + (rxChannel == ADI_ADRV904X_RX7)) + { + recoveryAction = adrv904x_CddcDataFormatEmbOvldMonitorGet(device, rxChannel, &cddcEmbOvldMonitorSettings); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve cddcEmbOvldMonitorSettings"); + return recoveryAction; + } + + if ((cddcEmbOvldMonitorSettings.embeddedMonitorSrcLsbI != 0u) && + (cddcEmbOvldMonitorSettings.embeddedMonitorSrcLsbQ != 0u) && + (cddcEmbOvldMonitorSettings.embeddedMonitorSrcLsbPlusOneI != 0u) && + (cddcEmbOvldMonitorSettings.embeddedMonitorSrcLsbPlusOneQ != 0u)) + { + *cddcDataFormat = ADI_ADRV904X_CDDC_EMBED_OVERLOAD_MONITOR_DATA; + } + + } /* End valid Rx Channel if block */ + + /* Otherwise, throw an error for invalid Rx channel */ + else { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChannel, + "Invalid Rx Channel Requested for CddcDataFormatSelectGet"); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatFloatingPointGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_FloatingPointConfigSettings_t * const floatingPointConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxDdcChanAddr_e baseAddr = ADRV904X_BF_SLICE_RX_0__RX_DDC_0_; + + adrv904x_Bf_RxDdc_FpRoundMode_e fpRoundModeBf = ADRV904X_BF_RX_DDC_FP_ROUND_MODE_ROUNDTIESTOEVEN; + uint8_t fpDataFormatBf = 0U; + uint8_t fpEncodeNanBf = 0U; + adrv904x_Bf_RxDdc_FpExponentBits_e fpNumExpBitsBf = ADRV904X_BF_RX_DDC_FP_EXPONENT_BITS_RX1_EXP_2; + uint8_t fpHideLeadingOneBf = 0U; + uint8_t fpAttenStepsBf = 0U; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, floatingPointConfig); + + /* Check that the requested rxChannel is valid*/ + switch( rxChannel ) + { + case ADI_ADRV904X_RX0: + case ADI_ADRV904X_RX1: + case ADI_ADRV904X_RX2: + case ADI_ADRV904X_RX3: + case ADI_ADRV904X_RX4: + case ADI_ADRV904X_RX5: + case ADI_ADRV904X_RX6: + case ADI_ADRV904X_RX7: + { + /* Get Rx DDC Bitfield Address */ + recoveryAction = adrv904x_RxDdcBitfieldAddressGet( device, + rxChannel, + ADI_ADRV904X_RX_DDC_BAND0, + &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve Rx DDC base address"); + return recoveryAction; + } + + /* Get bitfield values */ + recoveryAction = adrv904x_RxDdc_FpRoundMode_BfGet(device, + NULL, + baseAddr, + &fpRoundModeBf); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpRoundMode readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_FpFloatDataFormat_BfGet(device, + NULL, + baseAddr, + &fpDataFormatBf); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpFloatDataFormat readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_FpNanEncEn_BfGet(device, + NULL, + baseAddr, + &fpEncodeNanBf); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpNanEncEn readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_FpExponentBits_BfGet(device, + NULL, + baseAddr, + &fpNumExpBitsBf); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpExponentBits readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_FpHideLeadingOnes_BfGet(device, + NULL, + baseAddr, + &fpHideLeadingOneBf); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpHideLeadingOnes readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_FpIntDataAtten_BfGet(device, + NULL, + baseAddr, + &fpAttenStepsBf); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpIntDataAtten readback issue"); + return recoveryAction; + } + + break; + } + + case ADI_ADRV904X_ORX0: + case ADI_ADRV904X_ORX1: + /* Do nothing */ + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "Invalid Rx Channel Requested for RxDataFormatFloatingPointGet read"); + return recoveryAction; + } + + /* Update the structure with read back data */ + floatingPointConfig->fpRoundMode = (adi_adrv904x_FpRoundModes_e)fpRoundModeBf; + floatingPointConfig->fpDataFormat = (adi_adrv904x_FpFloatDataFormat_e)fpDataFormatBf; + floatingPointConfig->fpEncodeNan = (adi_adrv904x_FpNanEncode_e)fpEncodeNanBf; + floatingPointConfig->fpNumExpBits = (adi_adrv904x_FpExponentModes_e)fpNumExpBitsBf; + floatingPointConfig->fpHideLeadingOne = (adi_adrv904x_FpHideLeadingOne_e)fpHideLeadingOneBf; + floatingPointConfig->fpAttenSteps = (adi_adrv904x_FpAttenSteps_e)fpAttenStepsBf; + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcDataFormatFloatingPointGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_CddcFloatingPointConfigSettings_t * const cddcFloatingPointConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfCddcFuncsChanAddr_e baseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS; + + uint8_t fpRoundModeBf = ADRV904X_BF_RX_DDC_FP_ROUND_MODE_ROUNDTIESTOEVEN; + uint8_t fpDataFormatBf = 0U; + uint8_t fpEncodeNanBf = 0U; + uint8_t fpNumExpBitsBf = ADRV904X_BF_RX_DDC_FP_EXPONENT_BITS_RX1_EXP_2; + uint8_t fpHideLeadingOneBf = 0U; + uint8_t fpEn = 0u; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cddcFloatingPointConfig); + + /* Check that the requested rxChannel is valid*/ + switch( rxChannel ) + { + case ADI_ADRV904X_RX0: + case ADI_ADRV904X_RX1: + case ADI_ADRV904X_RX2: + case ADI_ADRV904X_RX3: + case ADI_ADRV904X_RX4: + case ADI_ADRV904X_RX5: + case ADI_ADRV904X_RX6: + case ADI_ADRV904X_RX7: + { + /* Get CDDC Bitfield Address */ + recoveryAction = adrv904x_CddcFuncsBitfieldAddressGet(device, + rxChannel, + &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve CDDC base address"); + return recoveryAction; + } + + /* Get bitfield values */ + recoveryAction = adrv904x_CddcFuncs_FormatterFpRoundMode_BfGet(device, + NULL, + baseAddr, + &fpRoundModeBf); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpRoundMode readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterFpFloatDataFormat_BfGet(device, + NULL, + baseAddr, + &fpDataFormatBf); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpFloatDataFormat readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterFpNanEncEn_BfGet(device, + NULL, + baseAddr, + &fpEncodeNanBf); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpNanEncEn readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterFpExponentBits_BfGet(device, + NULL, + baseAddr, + &fpNumExpBitsBf); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpExponentBits readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterFpHideLeadingOnes_BfGet(device, + NULL, + baseAddr, + &fpHideLeadingOneBf); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "FpHideLeadingOnes readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterFpEn_BfGet(device, + NULL, + baseAddr, + &fpEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "fpEn readback issue"); + return recoveryAction; + } + + + break; + } + + case ADI_ADRV904X_ORX0: + case ADI_ADRV904X_ORX1: + /* Do nothing */ + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "Invalid Rx Channel Requested for RxDataFormatFloatingPointGet read"); + return recoveryAction; + } + + /* Update the structure with read back data */ + cddcFloatingPointConfig->cddcFpRoundMode = (adi_adrv904x_FpRoundModes_e)fpRoundModeBf; + cddcFloatingPointConfig->cddcFpDataFormat = (adi_adrv904x_FpFloatDataFormat_e)fpDataFormatBf; + cddcFloatingPointConfig->cddcFpEncodeNan = (adi_adrv904x_FpNanEncode_e)fpEncodeNanBf; + cddcFloatingPointConfig->cddcFpNumExpBits = (adi_adrv904x_FpExponentModes_e)fpNumExpBitsBf; + cddcFloatingPointConfig->cddcFpHideLeadingOne = (adi_adrv904x_FpHideLeadingOne_e)fpHideLeadingOneBf; + cddcFloatingPointConfig->cddcFpEn = fpEn; + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatIntegerGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_IntegerConfigSettings_t * const integerConfigSettings, + adi_adrv904x_SlicerConfigSettings_t * const slicerConfigSettings) +{ + static const uint8_t INT_DATA_FORMAT_2S_COMPLEMENT = 0U; + static const uint8_t INT_DATA_RESOLUTION_16BITS = 1U; + static const uint8_t INT_EMBED_SLICER_DISABLE = 0U; + static const uint8_t INT_EMBED_SLICER_POS_MSB = 0U; + static const uint8_t INT_EMBED_SLICER_2_BITS = 0U; + static const uint8_t INT_PARTIY_SUPPORT_DISABLE = 0U; + static const uint8_t INT_PARITY_EVEN = 0U; + static const uint8_t SLICER_PIN_CTRL_MODE_INTERNAL = 0U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxDdcChanAddr_e baseAddr = ADRV904X_BF_SLICE_RX_0__RX_DDC_0_; + adrv904x_BfOrxDigChanAddr_e orxDigBaseAddr = (adrv904x_BfOrxDigChanAddr_e) 0U; + uint8_t slicerBit = 0U; + + /* Preset local variables to default settings */ + uint8_t intEvenParity = INT_PARITY_EVEN; + uint8_t intParitySupport = INT_PARTIY_SUPPORT_DISABLE; + uint8_t intEmbedSlicerNumber = INT_EMBED_SLICER_2_BITS; + uint8_t intEmbedSlicerPos = INT_EMBED_SLICER_POS_MSB; + uint8_t intEmbedSlicer = INT_EMBED_SLICER_DISABLE; + uint8_t intDataResolution = INT_DATA_RESOLUTION_16BITS; + uint8_t intDataFormat = INT_DATA_FORMAT_2S_COMPLEMENT; + uint8_t slicerPinCtrlMode = SLICER_PIN_CTRL_MODE_INTERNAL; + uint8_t extSlicerStepSize = 0U; + uint8_t intSlicerStepSize = 0U; + uint8_t intSlicerLsbOnQ = 0U; + + adi_adrv904x_GpioPinSel_e intSlicerPins[ADI_ADRV904X_MAX_RX_INT_SLICER_BITS] = { + ADI_ADRV904X_GPIO_INVALID, + ADI_ADRV904X_GPIO_INVALID, + ADI_ADRV904X_GPIO_INVALID, + ADI_ADRV904X_GPIO_INVALID + }; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, integerConfigSettings); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, slicerConfigSettings); + + /* Check if the requested rxChannel is a RX Channel. */ + if ((rxChannel == ADI_ADRV904X_RX0) || + (rxChannel == ADI_ADRV904X_RX1) || + (rxChannel == ADI_ADRV904X_RX2) || + (rxChannel == ADI_ADRV904X_RX3) || + (rxChannel == ADI_ADRV904X_RX4) || + (rxChannel == ADI_ADRV904X_RX5) || + (rxChannel == ADI_ADRV904X_RX6) || + (rxChannel == ADI_ADRV904X_RX7) ) + { + + /* Get Rx DDC Bitfield Address. Band0 only and assume all other bands are equivalent */ + recoveryAction = adrv904x_RxDdcBitfieldAddressGet( device, + rxChannel, + ADI_ADRV904X_RX_DDC_BAND0, + &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve Rx DDC base address"); + return recoveryAction; + } + + /* Get bitfield values */ + recoveryAction = adrv904x_RxDdc_IntDataFormat_BfGet(device, + NULL, + baseAddr, + &intDataFormat); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntDataFormat Readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_IntDataResolution_BfGet(device, + NULL, + baseAddr, + &intDataResolution); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntDataResolution Readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_IntEmbedSlicer_BfGet(device, + NULL, + baseAddr, + &intEmbedSlicer); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntEmbedSlicer Readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_IntEmbedSlicerPos_BfGet(device, + NULL, + baseAddr, + &intEmbedSlicerPos); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntEmbedSlicerPos Readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_IntEmbedSlicerNumber_BfGet(device, + NULL, + baseAddr, + &intEmbedSlicerNumber); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntEmbedSlicerNumber Readback issue"); + return recoveryAction; + } + + + recoveryAction = adrv904x_RxDdc_IntParitySupport_BfGet(device, + NULL, + baseAddr, + &intParitySupport); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntParitySupport Readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_IntEvenParity_BfGet(device, + NULL, + baseAddr, + &intEvenParity); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntEvenParity Readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_SlicerPinControlMode_BfGet(device, + NULL, + baseAddr, + &slicerPinCtrlMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SlicerPinControlMode Readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_ExternalSlicerPinControlStep_BfGet(device, + NULL, + baseAddr, + &extSlicerStepSize); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "ExternalSlicerPinControlStep Readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_SlicerPinControlStep_BfGet(device, + NULL, + baseAddr, + &intSlicerStepSize); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SlicerPinControlStep Readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxDdc_IntSlicerLsbOnQ_BfGet(device, + NULL, + baseAddr, + &intSlicerLsbOnQ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntSlicerLsbOnQ Readback issue"); + return recoveryAction; + } + + + /* Find GPIOs being used for Rx Internal Slicer bits */ + for(slicerBit = 0U ; slicerBit < ADI_ADRV904X_MAX_RX_INT_SLICER_BITS ; slicerBit++) + { + recoveryAction = adrv904x_GpioSignalFind( device, + &intSlicerPins[slicerBit], + adrv904x_RxInternalSlicerOutputSignals[slicerBit], + (adi_adrv904x_Channels_e)rxChannel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error finding previous GPIO that was routing Rx Internal Slicer Word bit."); + return recoveryAction; + } + } + + /* Get chanIdx from the valid rxChannel enum */ + switch (rxChannel) + { + case ADI_ADRV904X_RX0: /* Fall through */ + case ADI_ADRV904X_RX1: /* Fall through */ + case ADI_ADRV904X_RX2: /* Fall through */ + case ADI_ADRV904X_RX3: /* Fall through */ + case ADI_ADRV904X_RX4: /* Fall through */ + case ADI_ADRV904X_RX5: /* Fall through */ + case ADI_ADRV904X_RX6: /* Fall through */ + case ADI_ADRV904X_RX7: /* Fall through */ + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "Invalid Rx Channel Requested for RxDataFormatIntegerGet"); + return recoveryAction; + } + + /* Populate struct fields with values */ + + /* Store internal slicer step size into intSlicerStepSize field of slicer config settings struct */ + slicerConfigSettings->intSlicerStepSize = (adi_adrv904x_IntSlicerStepSizes_e)intSlicerStepSize; + + /* Store external slicer step size in slicerConfigSettings struct */ + slicerConfigSettings->extSlicerStepSize = (adi_adrv904x_ExtSlicerStepSizes_e)extSlicerStepSize; + + /* Store internal slicer word GPIOs*/ + for (slicerBit = 0U; slicerBit < ADI_ADRV904X_MAX_RX_INT_SLICER_BITS; slicerBit++) + { + slicerConfigSettings->intSlicerGpioSelect[slicerBit] = intSlicerPins[slicerBit]; + } + + /* Store external slicer control GPIOs. Not supported so the results are static */ + slicerConfigSettings->extSlicerGpioSelect = ADI_ADRV904X_EXTSLICER_RX_GPIO_DISABLE; + + + /* Encode embedded slicer config and store in integer config settings struct */ + recoveryAction = adrv904x_RxIntEmbSlicerConfigEncode( device, + rxChannel, + intEmbedSlicer, + intEmbedSlicerPos, + intEmbedSlicerNumber, + &integerConfigSettings->intEmbeddedBits); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to encode integer embedded slicer settings"); + return recoveryAction; + } + + /* Encode parity config and store in integer config settings struct */ + recoveryAction = adrv904x_RxIntParitySupportEncode( device, + rxChannel, + intParitySupport, + intEvenParity, + &integerConfigSettings->intParity); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to encode integer parity settings"); + return recoveryAction; + } + + /* Store embedded slicer position into the intEmbeddedPos field of integer config settings struct */ + integerConfigSettings->intEmbeddedPos = (adi_adrv904x_RxSlicerEmbeddedPos_e)intSlicerLsbOnQ; + + + } /* end of Rx Channel if block */ + + /* Check if the requested rxChannel is an ORx Channel. */ + else if((rxChannel == ADI_ADRV904X_ORX0) || + (rxChannel == ADI_ADRV904X_ORX1)) + { + + /* Get ORxDig base address for this channel */ + recoveryAction = adrv904x_OrxBitfieldAddressGet( device, + rxChannel, + &orxDigBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve ORx Dig base address"); + return recoveryAction; + } + + /* Get bitfield values */ + recoveryAction = adrv904x_OrxDig_IntDataFormat_BfGet(device, + NULL, + orxDigBaseAddr, + &intDataFormat); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntDataFormat Readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_OrxDig_IntDataResolution_BfGet(device, + NULL, + orxDigBaseAddr, + &intDataResolution); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntDataResolution Readback issue"); + return recoveryAction; + } + + /* set default values in unused fields for ORx channels */ + slicerConfigSettings->extSlicerStepSize = ADI_ADRV904X_EXTSLICER_STEPSIZE_1DB; + slicerConfigSettings->intSlicerStepSize = ADI_ADRV904X_INTSLICER_STEPSIZE_1DB; + integerConfigSettings->intEmbeddedBits = ADI_ADRV904X_NO_EMBEDDED_SLICER_BITS; + integerConfigSettings->intParity = ADI_ADRV904X_3BIT_SLICER_EVEN_PARITY; + integerConfigSettings->intEmbeddedPos = ADI_ADRV904X_LOWER_NIBBLE_ON_I; + + } /* End of ORx channel if block */ + + /* If rxChannel is not valid, throw an error */ + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "Invalid Rx Channel Requested for RxDataFormatIntegerGet"); + return recoveryAction; + } + + + + /* Encode the integer sample resolution and format and store in the integer config settings struct */ + /* Note: For both Rx and ORx (if ORx is eventually added here) */ + recoveryAction = adrv904x_RxIntSampleResFormatEncode( device, + intDataResolution, + intDataFormat, + &integerConfigSettings->intSampleResolution); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to encode integer sample resolution format"); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcDataFormatIntegerGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_CddcIntegerConfigSettings_t * const cddcIntegerConfigSettings, + adi_adrv904x_CddcSlicerConfigSettings_t * const cddcSlicerConfigSettings) +{ + static const uint8_t INT_DATA_FORMAT_2S_COMPLEMENT = 0U; + static const uint8_t INT_DATA_RESOLUTION_16BITS = 1U; + static const uint8_t INT_EMBED_SLICER_DISABLE = 0U; + static const uint8_t INT_EMBED_SLICER_POS_MSB = 0U; + static const uint8_t INT_EMBED_SLICER_2_BITS = 0U; + static const uint8_t INT_PARTIY_SUPPORT_DISABLE = 0U; + static const uint8_t INT_PARITY_EVEN = 0U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfCddcFuncsChanAddr_e baseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS; + + /* Preset local variables to default settings */ + uint8_t intEvenParity = INT_PARITY_EVEN; + uint8_t intParitySupport = INT_PARTIY_SUPPORT_DISABLE; + uint8_t intEmbedSlicerNumber = INT_EMBED_SLICER_2_BITS; + uint8_t intEmbedSlicerPos = INT_EMBED_SLICER_POS_MSB; + uint8_t intEmbedSlicer = INT_EMBED_SLICER_DISABLE; + uint8_t intDataResolution = INT_DATA_RESOLUTION_16BITS; + uint8_t intDataFormat = INT_DATA_FORMAT_2S_COMPLEMENT; + uint8_t intSlicerLsbOnQ = 0U; + uint8_t enSlicerAgcSync = 0U; + uint8_t en3BitSlicerMode = 0U; + uint8_t formatterCarrierSelect = 0U; + uint32_t slicerCarrierSelect = 0U; + + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cddcIntegerConfigSettings); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cddcSlicerConfigSettings); + + /* Check if the requested rxChannel is a RX Channel. */ + if ((rxChannel == ADI_ADRV904X_RX0) || + (rxChannel == ADI_ADRV904X_RX1) || + (rxChannel == ADI_ADRV904X_RX2) || + (rxChannel == ADI_ADRV904X_RX3) || + (rxChannel == ADI_ADRV904X_RX4) || + (rxChannel == ADI_ADRV904X_RX5) || + (rxChannel == ADI_ADRV904X_RX6) || + (rxChannel == ADI_ADRV904X_RX7) ) + { + + /* Get CDDC Bitfield Address */ + recoveryAction = adrv904x_CddcFuncsBitfieldAddressGet(device, + rxChannel, + &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve CDDC base address"); + return recoveryAction; + } + + /* Get bitfield values */ + recoveryAction = adrv904x_CddcFuncs_FormatterIntDataFormat_BfGet(device, + NULL, + baseAddr, + &intDataFormat); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntDataFormat Readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterIntDataResolution_BfGet(device, + NULL, + baseAddr, + &intDataResolution); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntDataResolution Readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterIntEmbedSlicer_BfGet(device, + NULL, + baseAddr, + &intEmbedSlicer); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntEmbedSlicer Readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterIntEmbedSlicerPos_BfGet(device, + NULL, + baseAddr, + &intEmbedSlicerPos); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntEmbedSlicerPos Readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterIntEmbedSlicerNumber_BfGet(device, + NULL, + baseAddr, + &intEmbedSlicerNumber); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntEmbedSlicerNumber Readback issue"); + return recoveryAction; + } + + + recoveryAction = adrv904x_CddcFuncs_FormatterIntParitySupport_BfGet(device, + NULL, + baseAddr, + &intParitySupport); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntParitySupport Readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterIntEvenParity_BfGet(device, + NULL, + baseAddr, + &intEvenParity); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntEvenParity Readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterIntSlicerLsbOnQ_BfGet(device, + NULL, + baseAddr, + &intSlicerLsbOnQ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "IntSlicerLsbOnQ Readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterDynamicSlicerAgcSyncEnable_BfGet(device, + NULL, + baseAddr, + &enSlicerAgcSync); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "cddcEnSlicerAgcSync Readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterStatic3bitSlicerModeEn_BfGet(device, + NULL, + baseAddr, + &en3BitSlicerMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "cddcEn3BitSlicerMode Readback issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_FormatterCarrierSelect_BfGet(device, + NULL, + baseAddr, + &formatterCarrierSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "cddcFormatterCarrierSelect Readback issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_Register32Read(device, + NULL, + ((uint32_t) baseAddr + 0x163U), + &slicerCarrierSelect, + 0xFFU); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "cddcSlicerCarrierSelect Readback issue"); + return recoveryAction; + } + + /* Populate struct fields with values */ + /* Encode embedded slicer config and store in integer config settings struct */ + recoveryAction = adrv904x_CddcIntEmbSlicerConfigEncode(device, + rxChannel, + intEmbedSlicer, + intEmbedSlicerPos, + intEmbedSlicerNumber, + &cddcIntegerConfigSettings->intEmbeddedBits); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to encode integer embedded slicer settings"); + return recoveryAction; + } + + /* Encode parity config and store in integer config settings struct */ + recoveryAction = adrv904x_CddcIntParitySupportEncode(device, + rxChannel, + intParitySupport, + intEvenParity, + &cddcIntegerConfigSettings->intParity); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to encode integer parity settings"); + return recoveryAction; + } + + /* Store embedded slicer position into the intEmbeddedPos field of integer config settings struct */ + cddcIntegerConfigSettings->intEmbeddedPos = (adi_adrv904x_RxSlicerEmbeddedPos_e)intSlicerLsbOnQ; + /* Store slicer config settings into struct */ + cddcSlicerConfigSettings->cddcSlicerCarrierSelect = (uint8_t)(slicerCarrierSelect); + cddcSlicerConfigSettings->cddcFormatterCarrierSelect = formatterCarrierSelect; + cddcSlicerConfigSettings->cddcEn3BitSlicerMode = en3BitSlicerMode; + cddcSlicerConfigSettings->cddcEnSlicerAgcSync = enSlicerAgcSync; + + } /* end of Rx Channel if block */ + + /* If rxChannel is not valid, throw an error */ + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "Invalid Rx Channel Requested for RxDataFormatIntegerGet"); + return recoveryAction; + } + + /* Encode the integer sample resolution and format and store in the integer config settings struct */ + recoveryAction = adrv904x_RxIntSampleResFormatEncode(device, + intDataResolution, + intDataFormat, + &cddcIntegerConfigSettings->intSampleResolution); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to encode integer sample resolution format"); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDataFormatEmbOvldMonitorGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_EmbOverloadMonitorConfigSettings_t* const embOvldConfigSettings) +{ + static const uint8_t LSB_POS_I_CHANNEL_ID = 0U; + static const uint8_t LSB_PLUS_ONE_POS_I_CHANNEL_ID = 1U; + static const uint8_t LSB_POS_Q_CHANNEL_ID = 0U; + static const uint8_t LSB_PLUS_ONE_POS_Q_CHANNEL_ID = 1U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxFuncsChanAddr_e funcsAddr = ADRV904X_BF_SLICE_RX_0__RX_FUNCS; + adrv904x_BfRxDdcChanAddr_e ddcAddr = ADRV904X_BF_SLICE_RX_0__RX_DDC_0_; + uint8_t apdHighSrcRegVal = 0U; + uint8_t apdLowSrcRegVal = 0U; + uint8_t hb2HighSrcRegVal = 0U; + uint8_t hb2LowSrcRegVal = 0U; + uint8_t invertHb2Flag = 0U; + uint8_t invertApdFlag = 0U; + uint8_t lsbIMonSrcRegVal = 0U; + uint8_t lsbQMonSrcRegVal = 0U; + uint8_t lsbPlusOneIMonSrcRegVal = 0U; + uint8_t lsbPlusOneQMonSrcRegVal = 0U; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, embOvldConfigSettings); + + /* Check that the requested rxChannel is valid*/ + switch( rxChannel ) + { + case ADI_ADRV904X_RX0: + case ADI_ADRV904X_RX1: + case ADI_ADRV904X_RX2: + case ADI_ADRV904X_RX3: + case ADI_ADRV904X_RX4: + case ADI_ADRV904X_RX5: + case ADI_ADRV904X_RX6: + case ADI_ADRV904X_RX7: + { + /* Get Rx Funcs Bitfield Address */ + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet( device, + rxChannel, + &funcsAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve Rx Funcs base address"); + return recoveryAction; + } + + /* Get Rx DDC Bitfield Address */ + recoveryAction = adrv904x_RxDdcBitfieldAddressGet( device, + rxChannel, + ADI_ADRV904X_RX_DDC_BAND0, + &ddcAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve Rx DDC base address"); + return recoveryAction; + } + + /* Get bitfield values */ + + /* Get the APD High Threshold exceeded indicator source */ + recoveryAction = adrv904x_RxFuncs_ApdHighSrcSelect_BfGet(device, + NULL, + funcsAddr, + &apdHighSrcRegVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "ApdHighSrcSelect readback issue"); + return recoveryAction; + } + + /* Get the APD Low Threshold exceeded indicator source */ + recoveryAction = adrv904x_RxFuncs_ApdLowSrcSelect_BfGet(device, + NULL, + funcsAddr, + &apdLowSrcRegVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "ApdLowSrcSelect readback issue"); + return recoveryAction; + } + + /* Get the HB2 High Threshold exceeded indicator source */ + recoveryAction = adrv904x_RxFuncs_Hb2HighSrcSelect_BfGet(device, + NULL, + funcsAddr, + &hb2HighSrcRegVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Hb2HighSrcSelect readback issue"); + return recoveryAction; + } + + /* Get the HB2 Low Threshold exceeded indicator source */ + recoveryAction = adrv904x_RxFuncs_Hb2LowSrcSelect_BfGet(device, + NULL, + funcsAddr, + &hb2LowSrcRegVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Hb2LowSrcSelect readback issue"); + return recoveryAction; + } + + /* Get invert Hb2 flag config */ + recoveryAction = adrv904x_RxFuncs_InvertHb2Low_BfGet(device, + NULL, + funcsAddr, + &invertHb2Flag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while reading invert Hb2 Flag configuration"); + return recoveryAction; + } + + /* Get invert Apd flag config */ + recoveryAction = adrv904x_RxFuncs_InvertApdLow_BfGet(device, + NULL, + funcsAddr, + &invertApdFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while reading invert Apd Flag configuration"); + return recoveryAction; + } + + /* Get I Sample LSB Posn Embedded overload indicator config */ + recoveryAction = adrv904x_RxDdc_RxMonFormatI_BfGet(device, + NULL, + ddcAddr, + LSB_POS_I_CHANNEL_ID, + &lsbIMonSrcRegVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxMonFormatI_0 readback issue"); + return recoveryAction; + } + + /* Get I Sample LSB + 1 Posn Embedded overload indicator config */ + recoveryAction = adrv904x_RxDdc_RxMonFormatI_BfGet(device, + NULL, + ddcAddr, + LSB_PLUS_ONE_POS_I_CHANNEL_ID, + &lsbPlusOneIMonSrcRegVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxMonFormatI_1 readback issue"); + return recoveryAction; + } + + + /* Get Q Sample LSB Posn Embedded overload indicator config */ + recoveryAction = adrv904x_RxDdc_RxMonFormatQ_BfGet(device, + NULL, + ddcAddr, + LSB_POS_Q_CHANNEL_ID, + &lsbQMonSrcRegVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxMonFormatQ_0 readback issue"); + return recoveryAction; + } + + /* Get Q Sample LSB + 1 Posn Embedded overload indicator config */ + recoveryAction = adrv904x_RxDdc_RxMonFormatQ_BfGet(device, + NULL, + ddcAddr, + LSB_PLUS_ONE_POS_Q_CHANNEL_ID, + &lsbPlusOneQMonSrcRegVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxMonFormatQ_1 readback issue"); + return recoveryAction; + } + + break; + } + + case ADI_ADRV904X_ORX0: + case ADI_ADRV904X_ORX1: + /* Do nothing */ + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "Invalid Rx Channel Requested for RxDataFormatEmbOvldMonitorGet read"); + return recoveryAction; + } + + /* Update the pointer to embOvldConfigSettings with data retrieved from the device */ + embOvldConfigSettings->embeddedMonitorApdHighSrcSel = (adi_adrv904x_RxApdHighEmbeddedMonitorSrc_e)apdHighSrcRegVal; + embOvldConfigSettings->embeddedMonitorApdLowSrcSel = (adi_adrv904x_RxApdLowEmbeddedMonitorSrc_e)apdLowSrcRegVal; + embOvldConfigSettings->embeddedMonitorHb2HighSrcSel = (adi_adrv904x_RxHb2HighEmbeddedMonitorSrc_e)hb2HighSrcRegVal; + embOvldConfigSettings->embeddedMonitorHb2LowSrcSel = (adi_adrv904x_RxHb2LowEmbeddedMonitorSrc_e)hb2LowSrcRegVal; + embOvldConfigSettings->invertHb2Flag = invertHb2Flag; + embOvldConfigSettings->invertApdFlag = invertApdFlag; + embOvldConfigSettings->embeddedMonitorSrcLsbI = (adi_adrv904x_RxEmbeddedMonitorSrc_e)lsbIMonSrcRegVal; + embOvldConfigSettings->embeddedMonitorSrcLsbQ = (adi_adrv904x_RxEmbeddedMonitorSrc_e)lsbQMonSrcRegVal; + embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneI = (adi_adrv904x_RxEmbeddedMonitorSrc_e)lsbPlusOneIMonSrcRegVal; + embOvldConfigSettings->embeddedMonitorSrcLsbPlusOneQ = (adi_adrv904x_RxEmbeddedMonitorSrc_e)lsbPlusOneQMonSrcRegVal; + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcDataFormatEmbOvldMonitorGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_CddcEmbOverloadMonitorConfigSettings_t* const cddcEmbOvldConfigSettings) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfCddcFuncsChanAddr_e baseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS; + uint8_t lsbIMonSrcRegVal = 0U; + uint8_t lsbQMonSrcRegVal = 0U; + uint8_t lsbPlusOneIMonSrcRegVal = 0U; + uint8_t lsbPlusOneQMonSrcRegVal = 0U; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cddcEmbOvldConfigSettings); + + /* Check that the requested rxChannel is valid*/ + switch( rxChannel ) + { + case ADI_ADRV904X_RX0: + case ADI_ADRV904X_RX1: + case ADI_ADRV904X_RX2: + case ADI_ADRV904X_RX3: + case ADI_ADRV904X_RX4: + case ADI_ADRV904X_RX5: + case ADI_ADRV904X_RX6: + case ADI_ADRV904X_RX7: + { + + /* Get CDDC Bitfield Address */ + recoveryAction = adrv904x_CddcFuncsBitfieldAddressGet(device, + rxChannel, + &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve CDDC base address"); + return recoveryAction; + } + + /* I Sample LSB Posn Embedded overload indicator config */ + recoveryAction = adrv904x_CddcFuncs_FormatterRxMonFormatI0_BfGet(device, + NULL, + baseAddr, + &lsbIMonSrcRegVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CDDC MonFormatI_0 Read issue"); + return recoveryAction; + } + + /* I Sample LSB + 1 Posn Embedded overload indicator config */ + recoveryAction = adrv904x_CddcFuncs_FormatterRxMonFormatI1_BfGet(device, + NULL, + baseAddr, + &lsbPlusOneIMonSrcRegVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CDDC MonFormatI_1 Read issue"); + return recoveryAction; + } + + /* Q Sample LSB Posn Embedded overload indicator config */ + recoveryAction = adrv904x_CddcFuncs_FormatterRxMonFormatQ0_BfGet(device, + NULL, + baseAddr, + &lsbQMonSrcRegVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CDDC MonFormatQ_0 Read issue"); + return recoveryAction; + } + + /* Q Sample LSB + 1 Posn Embedded overload indicator config */ + recoveryAction = adrv904x_CddcFuncs_FormatterRxMonFormatQ1_BfGet(device, + NULL, + baseAddr, + &lsbPlusOneQMonSrcRegVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CDDC MonFormatQ_1 Read issue"); + return recoveryAction; + } + + break; + } + + case ADI_ADRV904X_ORX0: + case ADI_ADRV904X_ORX1: + /* Do nothing */ + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "Invalid Rx Channel Requested for RxDataFormatEmbOvldMonitorGet read"); + return recoveryAction; + } + + /* Update the pointer to embOvldConfigSettings with data retrieved from the device */ + cddcEmbOvldConfigSettings->embeddedMonitorSrcLsbI = lsbIMonSrcRegVal; + cddcEmbOvldConfigSettings->embeddedMonitorSrcLsbQ = lsbQMonSrcRegVal; + cddcEmbOvldConfigSettings->embeddedMonitorSrcLsbPlusOneI = lsbPlusOneIMonSrcRegVal; + cddcEmbOvldConfigSettings->embeddedMonitorSrcLsbPlusOneQ = lsbPlusOneQMonSrcRegVal; + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxGainCompExtLnaGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + uint8_t * const externalLnaGain) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxDdcChanAddr_e baseAddr = ADRV904X_BF_SLICE_RX_0__RX_DDC_0_; + uint8_t tmpRead = 0U; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, externalLnaGain); + + switch (rxChannel) + { + /* Check if the requested rxChannel is a valid Rx Channel */ + case ADI_ADRV904X_RX0: + case ADI_ADRV904X_RX1: + case ADI_ADRV904X_RX2: + case ADI_ADRV904X_RX3: + case ADI_ADRV904X_RX4: + case ADI_ADRV904X_RX5: + case ADI_ADRV904X_RX6: + case ADI_ADRV904X_RX7: + { + /* Get Rx DDC Bitfield Address. Band0 only and assume all other bands are equivalent */ + recoveryAction = adrv904x_RxDdcBitfieldAddressGet( device, + rxChannel, + ADI_ADRV904X_RX_DDC_BAND0, + &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve Rx DDC base address"); + return recoveryAction; + } + + /* Get bitfield */ + recoveryAction = adrv904x_RxDdc_GainCompForExtGain_BfGet(device, + NULL, + baseAddr, + &tmpRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GainCompForExtGain Read issue"); + return recoveryAction; + } + + /* Set return value based on bitfield readback value */ + *externalLnaGain = tmpRead ? ADI_ENABLE : ADI_DISABLE; + + break; + } + + /* Check if the requested rxChannel is a valid ORx Channel */ + case ADI_ADRV904X_ORX0: + case ADI_ADRV904X_ORX1: + /* Set return value to ADI_DISABLE */ + *externalLnaGain = ADI_DISABLE; + break; + + /* Otherwise throw an error */ + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "Invalid Rx Channel Requested for RxGainCompExtLnaGet"); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxGainCompTempEnableGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + uint8_t * const tempCompensationEnable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxDdcChanAddr_e baseAddr = ADRV904X_BF_SLICE_RX_0__RX_DDC_0_; + uint8_t tmpRead = 0U; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, tempCompensationEnable); + + switch (rxChannel) + { + /* Check if the requested rxChannel is a valid Rx Channel */ + case ADI_ADRV904X_RX0: + case ADI_ADRV904X_RX1: + case ADI_ADRV904X_RX2: + case ADI_ADRV904X_RX3: + case ADI_ADRV904X_RX4: + case ADI_ADRV904X_RX5: + case ADI_ADRV904X_RX6: + case ADI_ADRV904X_RX7: + { + /* Get Rx DDC Bitfield Address. Band0 only and assume all other bands are equivalent */ + recoveryAction = adrv904x_RxDdcBitfieldAddressGet( device, + rxChannel, + ADI_ADRV904X_RX_DDC_BAND0, + &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve Rx DDC base address"); + return recoveryAction; + } + + /* Get bitfield */ + recoveryAction = adrv904x_RxDdc_GainCompForTempGain_BfGet(device, + NULL, + baseAddr, + &tmpRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GainCompForTempGain Read issue"); + return recoveryAction; + } + + /* Set return value based on bitfield readback value */ + *tempCompensationEnable = tmpRead ? ADI_ENABLE : ADI_DISABLE; + + break; + } + + /* Check if the requested rxChannel is a valid ORx Channel */ + case ADI_ADRV904X_ORX0: + case ADI_ADRV904X_ORX1: + /* Set return value to ADI_DISABLE */ + *tempCompensationEnable = ADI_DISABLE; + break; + + /* Otherwise throw an error */ + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "Invalid Rx Channel Requested for RxGainCompTempEnableGet"); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxInternalSlicerGpioEnableGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_RxDataFormatModes_e * const intSlicerFormatSel, + uint8_t * const enableStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t slicerBit = 0U; + adi_adrv904x_GpioPinSel_e foundPins[ADI_ADRV904X_MAX_RX_INT_SLICER_BITS] = { + ADI_ADRV904X_GPIO_INVALID, + ADI_ADRV904X_GPIO_INVALID, + ADI_ADRV904X_GPIO_INVALID, + ADI_ADRV904X_GPIO_INVALID + }; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, intSlicerFormatSel); + + /* Check that the requested rxChannel is valid. ORx not allowed */ + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "Invalid Rx Channel Requested for RxInternalSlicerGpioEnableGet read"); + return recoveryAction; + } + + + /* Search for each slicerBit signal for this channel on any GPIO */ + for (slicerBit = 0U; slicerBit < ADI_ADRV904X_MAX_RX_INT_SLICER_BITS; slicerBit++) + { + recoveryAction = adrv904x_GpioSignalFind( device, + &foundPins[slicerBit], + adrv904x_RxInternalSlicerOutputSignals[slicerBit], + (adi_adrv904x_Channels_e)rxChannel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error finding previous GPIO that was routing Rx Internal Slicer Word bit."); + return recoveryAction; + } + } + + /* If bits[3:0] found, currently in 4pin mode */ + if ((foundPins[3U] != ADI_ADRV904X_GPIO_INVALID) && + (foundPins[2U] != ADI_ADRV904X_GPIO_INVALID) && + (foundPins[1U] != ADI_ADRV904X_GPIO_INVALID) && + (foundPins[0U] != ADI_ADRV904X_GPIO_INVALID)) + { + *intSlicerFormatSel = ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_4PIN_MODE; + if (enableStatus != NULL) + { + *enableStatus = ADI_ENABLE; + } + } + + /* Else If bits[2:0] found, currently in 3pin mode */ + else if ((foundPins[2U] != ADI_ADRV904X_GPIO_INVALID) && + (foundPins[1U] != ADI_ADRV904X_GPIO_INVALID) && + (foundPins[0U] != ADI_ADRV904X_GPIO_INVALID)) + { + *intSlicerFormatSel = ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_3PIN_MODE; + if (enableStatus != NULL) + { + *enableStatus = ADI_ENABLE; + } + } + + /* Else If bits[1:0] found, currently in 2pin mode */ + else if((foundPins[1U] != ADI_ADRV904X_GPIO_INVALID) && + (foundPins[0U] != ADI_ADRV904X_GPIO_INVALID)) + { + *intSlicerFormatSel = ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_2PIN_MODE; + if (enableStatus != NULL) + { + *enableStatus = ADI_ENABLE; + } + } + + /* Else, currently GAIN COMP DISABLED mode*/ + else + { + *intSlicerFormatSel = ADI_ADRV904X_GAIN_COMPENSATION_DISABLED; + if (enableStatus != NULL) + { + *enableStatus = ADI_DISABLE; + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxIntEmbSlicerConfigEncode(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + const uint8_t intEmbedSlicer, + const uint8_t intEmbedSlicerPos, + const uint8_t intEmbedSlicerNumber, + adi_adrv904x_RxSlicerEmbeddedBits_e * const integerConfigSettingsEmbSlicer) +{ + static const uint8_t INT_EMBED_SLICER_DISABLE = 0U; + static const uint8_t INT_EMBED_SLICER_POS_MSB = 0U; + static const uint8_t INT_EMBED_SLICER_POS_LSB = 1U; + static const uint8_t INT_EMBED_SLICER_2_BITS = 0U; + static const uint8_t INT_EMBED_SLICER_1_BIT = 1U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, integerConfigSettingsEmbSlicer); + + /* Check that the requested rxChannel is valid. ORx not allowed */ + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "Invalid Rx Channel Requested for RxIntEmbSlicerConfigEncode"); + return recoveryAction; + } + + + if (intEmbedSlicer == INT_EMBED_SLICER_DISABLE) + { + *integerConfigSettingsEmbSlicer = ADI_ADRV904X_NO_EMBEDDED_SLICER_BITS; + } + else + { + if ((intEmbedSlicerPos == INT_EMBED_SLICER_POS_LSB) && + (intEmbedSlicerNumber == INT_EMBED_SLICER_1_BIT)) + { + *integerConfigSettingsEmbSlicer = ADI_ADRV904X_EMBED_1_SLICERBIT_AT_LSB; + } + else if ((intEmbedSlicerPos == INT_EMBED_SLICER_POS_MSB) && + (intEmbedSlicerNumber == INT_EMBED_SLICER_1_BIT)) + { + *integerConfigSettingsEmbSlicer = ADI_ADRV904X_EMBED_1_SLICERBIT_AT_MSB; + } + else if ((intEmbedSlicerPos == INT_EMBED_SLICER_POS_LSB) && + (intEmbedSlicerNumber == INT_EMBED_SLICER_2_BITS)) + { + if ((device->devStateInfo.rxChannel3bitSlicerMode & (uint8_t)rxChannel) == (uint8_t)rxChannel) + { + *integerConfigSettingsEmbSlicer = ADI_ADRV904X_EMBED_2_SLICERBITS_AT_LSB_3_BIT_SLICER; + } + else + { + *integerConfigSettingsEmbSlicer = ADI_ADRV904X_EMBED_2_SLICERBITS_AT_LSB_4_BIT_SLICER; + } + } + else if ((intEmbedSlicerPos == INT_EMBED_SLICER_POS_MSB) && + (intEmbedSlicerNumber == INT_EMBED_SLICER_2_BITS)) + { + if ((device->devStateInfo.rxChannel3bitSlicerMode & (uint8_t)rxChannel) == (uint8_t)rxChannel) + { + *integerConfigSettingsEmbSlicer = ADI_ADRV904X_EMBED_2_SLICERBITS_AT_MSB_3_BIT_SLICER; + } + else + { + *integerConfigSettingsEmbSlicer = ADI_ADRV904X_EMBED_2_SLICERBITS_AT_MSB_4_BIT_SLICER; + } + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + intEmbedSlicer, + "Invalid combination of embed slicer,pos,number combination encountered while attempting to encode integer embed slicer settings"); + return recoveryAction; + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcIntEmbSlicerConfigEncode(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + const uint8_t intEmbedSlicer, + const uint8_t intEmbedSlicerPos, + const uint8_t intEmbedSlicerNumber, + adi_adrv904x_RxSlicerEmbeddedBits_e* const integerConfigSettingsEmbSlicer) +{ + static const uint8_t INT_EMBED_SLICER_DISABLE = 0U; + static const uint8_t INT_EMBED_SLICER_POS_MSB = 0U; + static const uint8_t INT_EMBED_SLICER_POS_LSB = 1U; + static const uint8_t INT_EMBED_SLICER_2_BITS = 0U; + static const uint8_t INT_EMBED_SLICER_1_BIT = 1U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, integerConfigSettingsEmbSlicer); + + /* Check that the requested rxChannel is valid. ORx not allowed */ + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChannel, + "Invalid Rx Channel Requested for RxIntEmbSlicerConfigEncode"); + return recoveryAction; + } + + + if (intEmbedSlicer == INT_EMBED_SLICER_DISABLE) + { + *integerConfigSettingsEmbSlicer = ADI_ADRV904X_NO_EMBEDDED_SLICER_BITS; + } + else + { + if ((intEmbedSlicerPos == INT_EMBED_SLICER_POS_LSB) && + (intEmbedSlicerNumber == INT_EMBED_SLICER_1_BIT)) + { + *integerConfigSettingsEmbSlicer = ADI_ADRV904X_EMBED_1_SLICERBIT_AT_LSB; + } + else if ((intEmbedSlicerPos == INT_EMBED_SLICER_POS_MSB) && + (intEmbedSlicerNumber == INT_EMBED_SLICER_1_BIT)) + { + *integerConfigSettingsEmbSlicer = ADI_ADRV904X_EMBED_1_SLICERBIT_AT_MSB; + } + else if ((intEmbedSlicerPos == INT_EMBED_SLICER_POS_LSB) && + (intEmbedSlicerNumber == INT_EMBED_SLICER_2_BITS)) + { + *integerConfigSettingsEmbSlicer = ADI_ADRV904X_EMBED_2_SLICERBITS_AT_LSB_3_BIT_SLICER; + + } + else if ((intEmbedSlicerPos == INT_EMBED_SLICER_POS_MSB) && + (intEmbedSlicerNumber == INT_EMBED_SLICER_2_BITS)) + { + *integerConfigSettingsEmbSlicer = ADI_ADRV904X_EMBED_2_SLICERBITS_AT_MSB_3_BIT_SLICER; + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + intEmbedSlicer, + "Invalid combination of embed slicer,pos,number combination encountered while attempting to encode integer embed slicer settings"); + return recoveryAction; + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxIntSampleResFormatEncode(adi_adrv904x_Device_t * const device, + const uint8_t intDataResolution, + const uint8_t intDataFormat, + adi_adrv904x_RxIntSampleResolution_e * const intSampleResolution) +{ + static const uint8_t INT_DATA_FORMAT_2S_COMPLEMENT = 0U; + static const uint8_t INT_DATA_FORMAT_SIGNED_MAGNITUDE = 1U; + static const uint8_t INT_DATA_RESOLUTION_12BITS = 0U; + static const uint8_t INT_DATA_RESOLUTION_16BITS = 1U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, intSampleResolution); + + /* Map int resolution and format to intSampleResolution enum value */ + if ((intDataResolution == INT_DATA_RESOLUTION_12BITS) && + (intDataFormat == INT_DATA_FORMAT_2S_COMPLEMENT)) + { + *intSampleResolution = ADI_ADRV904X_INTEGER_12BIT_2SCOMP; + } + else if ((intDataResolution == INT_DATA_RESOLUTION_12BITS) && + (intDataFormat == INT_DATA_FORMAT_SIGNED_MAGNITUDE)) + { + *intSampleResolution = ADI_ADRV904X_INTEGER_12BIT_SIGNED; + } + else if ((intDataResolution == INT_DATA_RESOLUTION_16BITS) && + (intDataFormat == INT_DATA_FORMAT_2S_COMPLEMENT)) + { + *intSampleResolution = ADI_ADRV904X_INTEGER_16BIT_2SCOMP; + } + else if ((intDataResolution == INT_DATA_RESOLUTION_16BITS) && + (intDataFormat == INT_DATA_FORMAT_SIGNED_MAGNITUDE)) + { + *intSampleResolution = ADI_ADRV904X_INTEGER_16BIT_SIGNED; + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + intSampleResolution, + "Unexpected resolution and format values encountered while attempting to encode integer sample resolution settings"); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxIntParitySupportEncode(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + const uint8_t intParitySupport, + const uint8_t intEvenParity, + adi_adrv904x_RxIntParity_e * const integerParity) +{ + static const uint8_t INT_PARTIY_SUPPORT_DISABLE = 0U; + static const uint8_t INT_PARTIY_SUPPORT_ENABLE = 1U; + static const uint8_t INT_PARITY_EVEN = 0U; + static const uint8_t INT_PARITY_ODD = 1U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, integerParity); + + /* Check that the requested rxChannel is valid. ORx not allowed */ + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "Invalid Rx Channel Requested for RxIntParitySupportEncode"); + return recoveryAction; + } + + /* Check inputs intParitySupport and intEventParity for valid values */ + if ((intParitySupport != INT_PARTIY_SUPPORT_DISABLE) && + (intParitySupport != INT_PARTIY_SUPPORT_ENABLE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + intParitySupport, + "Invalid intParitySupport value encountered while attempting to encode integer parity settings"); + return recoveryAction; + } + + if ((intEvenParity != INT_PARITY_EVEN) && + (intEvenParity != INT_PARITY_ODD)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + intEvenParity, + "Invalid intEvenParity value encountered while attempting to encode integer parity settings"); + return recoveryAction; + } + + /* Map int parity support and even/odd to integerParity enum value */ + if ((intParitySupport == INT_PARTIY_SUPPORT_ENABLE) && + (intEvenParity == INT_PARITY_ODD) && + ((device->devStateInfo.rxChannel3bitSlicerMode & (uint8_t)rxChannel) == (uint8_t)rxChannel)) + { + *integerParity = ADI_ADRV904X_3BIT_SLICER_ODD_PARITY; + } + else if ((intParitySupport == INT_PARTIY_SUPPORT_ENABLE) && + (intEvenParity == INT_PARITY_EVEN) && + ((device->devStateInfo.rxChannel3bitSlicerMode & (uint8_t)rxChannel) == (uint8_t)rxChannel)) + { + *integerParity = ADI_ADRV904X_3BIT_SLICER_EVEN_PARITY; + } + else + { + *integerParity = ADI_ADRV904X_NO_PARITY; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcIntParitySupportEncode(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + const uint8_t intParitySupport, + const uint8_t intEvenParity, + adi_adrv904x_RxIntParity_e* const integerParity) +{ + static const uint8_t INT_PARTIY_SUPPORT_DISABLE = 0U; + static const uint8_t INT_PARTIY_SUPPORT_ENABLE = 1U; + static const uint8_t INT_PARITY_EVEN = 0U; + static const uint8_t INT_PARITY_ODD = 1U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, integerParity); + + /* Check that the requested rxChannel is valid. ORx not allowed */ + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChannel, + "Invalid Rx Channel Requested for RxIntParitySupportEncode"); + return recoveryAction; + } + + /* Check inputs intParitySupport and intEventParity for valid values */ + if ((intParitySupport != INT_PARTIY_SUPPORT_DISABLE) && + (intParitySupport != INT_PARTIY_SUPPORT_ENABLE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + intParitySupport, + "Invalid intParitySupport value encountered while attempting to encode integer parity settings"); + return recoveryAction; + } + + if ((intEvenParity != INT_PARITY_EVEN) && + (intEvenParity != INT_PARITY_ODD)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + intEvenParity, + "Invalid intEvenParity value encountered while attempting to encode integer parity settings"); + return recoveryAction; + } + + /* Map int parity support and even/odd to integerParity enum value */ + if ((intParitySupport == INT_PARTIY_SUPPORT_ENABLE) && + (intEvenParity == INT_PARITY_ODD)) + + { + *integerParity = ADI_ADRV904X_3BIT_SLICER_ODD_PARITY; + } + else if ((intParitySupport == INT_PARTIY_SUPPORT_ENABLE) && + (intEvenParity == INT_PARITY_EVEN)) + { + *integerParity = ADI_ADRV904X_3BIT_SLICER_EVEN_PARITY; + } + else + { + *integerParity = ADI_ADRV904X_NO_PARITY; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxLoSourceGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_LoSel_e* const rxLoSource) +{ + static const uint8_t RX_LO_CURRENT_MASK = 0x01U; + uint8_t rxtxLoMuxReg = 0U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxLoSource); + + if ((rxChannel == ADI_ADRV904X_RX0) || + (rxChannel == ADI_ADRV904X_RX1) || + (rxChannel == ADI_ADRV904X_RX2) || + (rxChannel == ADI_ADRV904X_RX3)) + { + /*Read the Rx Lo Mux reg from the east side of the chip */ + recoveryAction = adrv904x_PllMemMap_SelRxLo_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_EAST_RFPLL, + &rxtxLoMuxReg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to retrieve Rx Lo Selection."); + return recoveryAction; + } + + /*For East Side, 1 = LO0, 0 = LO1*/ + if ((rxtxLoMuxReg & RX_LO_CURRENT_MASK) == RX_LO_CURRENT_MASK) + { + *rxLoSource = ADI_ADRV904X_LOSEL_LO0; + } + else + { + *rxLoSource = ADI_ADRV904X_LOSEL_LO1; + } + } + else if ((rxChannel == ADI_ADRV904X_RX4) || + (rxChannel == ADI_ADRV904X_RX5) || + (rxChannel == ADI_ADRV904X_RX6) || + (rxChannel == ADI_ADRV904X_RX7)) + { + /*Read the Rx Lo Mux reg from the west side of the chip */ + recoveryAction = adrv904x_PllMemMap_SelRxLo_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_WEST_RFPLL, + &rxtxLoMuxReg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "PllMemMap_SelRxLo_Bfget issue"); + return recoveryAction; + } + + /*For West Side, 1 = LO1, 0 = LO0*/ + if ((rxtxLoMuxReg & RX_LO_CURRENT_MASK) == RX_LO_CURRENT_MASK) + { + *rxLoSource = ADI_ADRV904X_LOSEL_LO1; + } + else + { + *rxLoSource = ADI_ADRV904X_LOSEL_LO0; + } + + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, recoveryAction, rxChannel, "Invalid Rx Channel parameter. Valid Rx channel must be Rx0-Rx7"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxMinMaxGainIndexSetRangeCheck(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const uint8_t minGainIndex, + const uint8_t maxGainIndex) +{ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /*Check that rxChannelMask is valid*/ + if (rxChannelMask == ADI_ADRV904X_RXOFF) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannelMask, + "Invalid Rx Channel mask parameter. Valid Rx channel masks include Rx0-Rx7"); + return recoveryAction; + } + + if (rxChannelMask > ADI_ADRV904X_RX_MASK_ALL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannelMask, + "Invalid Rx Channel mask parameter. Valid Rx channel masks include Rx0-Rx7"); + return recoveryAction; + } + + /*Check that requested min gain index does not exceed max gain index*/ + if (minGainIndex >= maxGainIndex) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + minGainIndex, + "minGainIndex should be less than maxGainIndex"); + return recoveryAction; + } + + /*Check that requested min gain index is not less than the absolute min gain index possible for this device*/ +#if ADI_ADRV904X_MIN_GAIN_TABLE_INDEX > 0 + if(minGainIndex < ADI_ADRV904X_MIN_GAIN_TABLE_INDEX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + minGainIndex, + "minGainIndex should be greater than or equal to ADI_ADRV904X_MIN_GAIN_TABLE_INDEX"); + return recoveryAction; + } +#endif + /*Check that requested max gain index is not greater than the absolute max gain index possible for this device*/ +#if ADI_ADRV904X_MAX_GAIN_TABLE_INDEX < 255 + if(maxGainIndex > ADI_ADRV904X_MAX_GAIN_TABLE_INDEX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + maxGainIndex, + "maxGainIndex should be less than or equal to ADI_ADRV904X_MAX_GAIN_TABLE_INDEX"); + return recoveryAction; + } +#endif + return ADI_ADRV904X_ERR_ACT_NONE; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxGainTableWriteRangeCheck(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const uint8_t gainIndexOffset, + const adi_adrv904x_RxGainTableRow_t gainTableRow[], + const uint32_t arraySize) +{ + + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + const uint8_t MAX_EXT_CTRL_WORD = 3U; + const int16_t MIN_DIG_GAIN = -360; /*Dig gain is in the range -18dB to 50db*/ + const int16_t MAX_DIG_GAIN = 1000; /*Dig gain is in the range -18dB to 50db*/ + + uint32_t gainIndex = 0U; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, gainTableRow); + + + /*Check the no. of gain indices parameter is not 0*/ + if (arraySize == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + arraySize, + "arraySize parameter is 0. Valid values from 1 - 256"); + return recoveryAction; + } + + /*Check that the gain index offset is within range*/ +#if ADI_ADRV904X_MIN_RX_GAIN_TABLE_INDEX > 0 + if (gainIndexOffset < ADI_ADRV904X_MIN_RX_GAIN_TABLE_INDEX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + gainIndexOffset, + "Invalid gainIndexOffset. Parameter gainIndexOffset should be greater than ADI_ADRV904X_MIN_RX_GAIN_TABLE_INDEX"); + return recoveryAction; + } +#endif +#if ADI_ADRV904X_START_RX_GAIN_INDEX < 255 + if (gainIndexOffset > ADI_ADRV904X_START_RX_GAIN_INDEX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + gainIndexOffset, + "Invalid gainIndexOffset. Parameter gainIndexOffset should be smaller than ADI_ADRV904X_START_RX_GAIN_INDEX"); + return recoveryAction; + } +#endif + + /*Check the no. of gain indices parameter is valid*/ + if (arraySize > (uint32_t)((gainIndexOffset - ADI_ADRV904X_MIN_RX_GAIN_TABLE_INDEX) + 1U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + arraySize, + "gainTableRow arraySize exceeds the limit. Valid range ADI_ADRV904X_MIN_RX_GAIN_TABLE_INDEX to gainIndexOffset"); + return recoveryAction; + } + + /*Check that rxChannelMask is valid*/ + + if ((rxChannelMask == ADI_ADRV904X_RXOFF) || (rxChannelMask > ADI_ADRV904X_RX_MASK_ALL)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannelMask, + "Invalid Rx Channel mask parameter. Valid Rx channel masks include Rx0-Rx7"); + return recoveryAction; + } + + /*Check that if Rx gain table is required to be loaded, Rx Profile is valid*/ + if ((rxChannelMask & ADI_ADRV904X_RX_MASK_ALL) > 0) + { + if ((device->devStateInfo.profilesValid & ADI_ADRV904X_RX_PROFILE_VALID) == 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannelMask, + "Rx gain table selected for programming but Rx profile is invalid in device structure"); + return recoveryAction; + } + } + + /*Range check individual gain table row entries*/ + for (gainIndex = 0; gainIndex < arraySize; gainIndex++) + { + /*Check that EXT_CTRL is in the range {0,1,2,3}*/ + if (gainTableRow[gainIndex].extControl > MAX_EXT_CTRL_WORD) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gainTableRow[gainIndex].extControl, + "Rx Gain Table extControl parameter exceeds the limit. Allowed values are 0,1,2,3"); + return recoveryAction; + } + + /*Check that digital gain is in the range -18dB to 50dB*/ + if ((gainTableRow[gainIndex].digGain < MIN_DIG_GAIN) || + (gainTableRow[gainIndex].digGain > MAX_DIG_GAIN)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + gainTableRow[gainIndex].digGain, + "Rx Gain Table digGain parameter exceeds the limit. Allowed values between -18dB to 50dB(-360 to +1000)"); + return recoveryAction; + } + } + + return ADI_ADRV904X_ERR_ACT_NONE; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxGainTableReadRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + const uint8_t gainIndexOffset, + const adi_adrv904x_RxGainTableRow_t gainTableRow[], + const uint32_t arraySize) +{ + + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, gainTableRow); + + + /*Check the no. of gain indices parameter is not 0*/ + if (arraySize == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + arraySize, + "arraySize parameter is 0. Valid values from 1 - 256"); + return recoveryAction; + } + + /*Check that the gain index offset is within range*/ +#if ADI_ADRV904X_MIN_RX_GAIN_TABLE_INDEX > 0 + if (gainIndexOffset < ADI_ADRV904X_MIN_RX_GAIN_TABLE_INDEX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + gainIndexOffset, + "Invalid gainIndexOffset. Parameter gainIndexOffset should be greater than ADI_ADRV904X_MIN_RX_GAIN_TABLE_INDEX"); + return recoveryAction; + } +#endif +#if ADI_ADRV904X_START_RX_GAIN_INDEX < 255 + if (gainIndexOffset > ADI_ADRV904X_START_RX_GAIN_INDEX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + gainIndexOffset, + "Invalid gainIndexOffset. Parameter gainIndexOffset should be smaller than ADI_ADRV904X_START_RX_GAIN_INDEX"); + return recoveryAction; + } +#endif + + /*Check the no. of gain indices parameter is valid*/ + if (arraySize > (uint32_t)((gainIndexOffset - ADI_ADRV904X_MIN_RX_GAIN_TABLE_INDEX) + 1U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + arraySize, + "gainTableRow arraySize exceeds the limit. Valid range ADI_ADRV904X_MIN_RX_GAIN_TABLE_INDEX to gainIndexOffset"); + return recoveryAction; + } + + /*Check that the requested rxChannel is valid*/ + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7) ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "Invalid Rx Channel Requested.Valid Rx channels include Rx0-Rx7"); + return recoveryAction; + } + + return ADI_ADRV904X_ERR_ACT_NONE; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_DecPowerCfgRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxDecimatedPowerCfg_t* const decPowerCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, decPowerCfg); + + static const uint8_t MAX_POWER_INPUT_SELECT = 3U; + static const uint8_t MAX_MEASUREMENT_DURATION = 31U; + uint32_t ALL_DEC_POWER_SELECT = (uint32_t)ADI_ADRV904X_DEC_POWER_MAIN_PATH_MEAS_BLOCK | + (uint32_t)ADI_ADRV904X_DEC_POWER_BAND_A_MEAS_BLOCK | + (uint32_t)ADI_ADRV904X_DEC_POWER_BAND_B_MEAS_BLOCK; + + if (((decPowerCfg->rxChannelMask & (~(uint32_t)ADI_ADRV904X_RX_MASK_ALL)) != 0U) || (decPowerCfg->rxChannelMask == (uint32_t)ADI_ADRV904X_RXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + decPowerCfg->rxChannelMask, + "Invalid Rx channel is selected. Valid values are any combinations of Rx0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + if ((decPowerCfg->decPowerControl != ADI_ADRV904X_DEC_POWER_MEAS_OFF) && + (decPowerCfg->decPowerControl != ADI_ADRV904X_DEC_POWER_MEAS_ON) && + (decPowerCfg->decPowerControl != ADI_ADRV904X_DEC_POWER_AGC_MEAS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + decPowerCfg->decPowerControl, + "Invalid decPowerControl selection."); + return recoveryAction; + } + + if (decPowerCfg->powerInputSelect > MAX_POWER_INPUT_SELECT) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + decPowerCfg->powerInputSelect, + "Invalid powerInputSelect selection."); + return recoveryAction; + } + + if (((decPowerCfg->measBlockSelectMask & (~(uint8_t)ALL_DEC_POWER_SELECT)) != 0U) || + (decPowerCfg->measBlockSelectMask == 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + decPowerCfg->measBlockSelectMask, + "Invalid measBlockSelectMask is selected."); + return recoveryAction; + } + + if (decPowerCfg->powerMeasurementDuration > MAX_MEASUREMENT_DURATION) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + decPowerCfg->powerMeasurementDuration, + "Invalid powerMeasurementDuration selection."); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_OrxDecPowerCfgRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_ORxDecimatedPowerCfg_t* const decPowerCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, decPowerCfg); + + static const uint8_t ENABLE_MAX = 1U; + static const uint8_t MAX_POWER_INPUT_SELECT = 2U; + static const uint8_t MAX_MEASUREMENT_DURATION = 21U; + + if (((decPowerCfg->orxChannelMask & (~(uint32_t)ADI_ADRV904X_ORX_MASK_ALL)) != 0U) || (decPowerCfg->orxChannelMask == (uint32_t)ADI_ADRV904X_RXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + decPowerCfg->orxChannelMask, + "Invalid ORx channel is selected. Valid values are any combinations of ORx0/1"); + return recoveryAction; + } + + if (decPowerCfg->measurementEnable > ENABLE_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + decPowerCfg->measurementEnable, + "Invalid measurementEnable selection."); + return recoveryAction; + } + + if (decPowerCfg->powerInputSelect > MAX_POWER_INPUT_SELECT) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + decPowerCfg->powerInputSelect, + "Invalid powerInputSelect selection."); + return recoveryAction; + } + + if (decPowerCfg->powerMeasurementDuration > MAX_MEASUREMENT_DURATION) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + decPowerCfg->powerMeasurementDuration, + "Invalid powerMeasurementDuration selection."); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxHb2OverloadCfgSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + uint8_t enableHb2Overload, + uint8_t hb2OverloadSignalSelection, + uint8_t hb2OverloadPowerMode) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + static const uint8_t MAX_HB2_CFG_INPUT = 1U; + adrv904x_BfRxFuncsChanAddr_e rxFuncsBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_FUNCS; + static const uint64_t HB2_OVERLOAD_USE_RIN = 0x90; + static const uint32_t HB2_OVERLOAD_USE_RIN_MASK = 1U << 24; + static const uint32_t HB2_OVERLOAD_USE_RIN_DISABLE = 0U; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7)) + { + /* Invalid Rx channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Invalid Rx channel selection"); + return recoveryAction; + } + + if (enableHb2Overload > MAX_HB2_CFG_INPUT) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + enableHb2Overload, + "Invalid enableHb2Overload selection."); + return recoveryAction; + } + + if (hb2OverloadSignalSelection >= (uint8_t) ADI_ADRV904X_MAX_SIG_MON_SRC_INVALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + hb2OverloadSignalSelection, + "Invalid hb2OverloadSignalSelection selection."); + return recoveryAction; + } + + if (hb2OverloadPowerMode > MAX_HB2_CFG_INPUT) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + hb2OverloadPowerMode, + "Invalid hb2OverloadPowerMode selection."); + return recoveryAction; + } + + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet(device, rxChannel, &rxFuncsBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Invalid Rx Channel used to determine rx func address"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxFuncs_OverloadEnAgc_BfSet(device, NULL, rxFuncsBaseAddr, enableHb2Overload); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write hb2 enable bit"); + return recoveryAction; + } + + { + recoveryAction = adrv904x_RxFuncs_Hb2OverloadUseHb2In_BfSet(device, NULL, rxFuncsBaseAddr, hb2OverloadSignalSelection); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write hb2 input selection bit"); + return recoveryAction; + } + /* Set hb2_overload_use_rin to 0 */ + recoveryAction = adi_adrv904x_Register32Write(device, + NULL, + rxFuncsBaseAddr+HB2_OVERLOAD_USE_RIN, + HB2_OVERLOAD_USE_RIN_DISABLE, + HB2_OVERLOAD_USE_RIN_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write HB2 input selection bit"); + return recoveryAction; + } + } + + recoveryAction = adrv904x_RxFuncs_OverloadPowerModeAgc_BfSet(device, NULL, rxFuncsBaseAddr, hb2OverloadPowerMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write hb2 power mode bit"); + return recoveryAction; + } + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxHb2OverloadCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + uint8_t * const enableHb2Overload, + uint8_t * const hb2OverloadSignalSelection, + uint8_t * const hb2OverloadPowerMode) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxFuncsChanAddr_e rxFuncsBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_FUNCS; + static const uint64_t overload_config_addr = 0x90; + static const uint32_t HB2_OVERLOAD_USE_RIN_MASK = 1U << 24; + uint32_t hb2_overload_use_rin = 0U; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, enableHb2Overload); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, hb2OverloadSignalSelection); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, hb2OverloadPowerMode); + + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7)) + { + /* Invalid Rx channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Invalid Rx channel selection"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet(device, rxChannel, &rxFuncsBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Invalid Rx Channel used to determine rx func address"); + return recoveryAction; + } + + recoveryAction = adrv904x_RxFuncs_OverloadEnAgc_BfGet(device, NULL, rxFuncsBaseAddr, enableHb2Overload); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read hb2 enable bit"); + return recoveryAction; + } + + if ((device->devStateInfo.deviceSiRev & 0xF0U) >= 0xB0U) + { + /* Write the new bf set for Palao B0 (hb2_overload_use_rin) */ + recoveryAction = adi_adrv904x_Register32Read(device, + NULL, + rxFuncsBaseAddr + overload_config_addr, + &hb2_overload_use_rin, + HB2_OVERLOAD_USE_RIN_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read hb2_overload_use_rin bit"); + return recoveryAction; + } + if (hb2_overload_use_rin == HB2_OVERLOAD_USE_RIN_MASK) + { + *hb2OverloadSignalSelection = 2U; + } + else + { + recoveryAction = adrv904x_RxFuncs_Hb2OverloadUseHb2In_BfGet(device, NULL, rxFuncsBaseAddr, hb2OverloadSignalSelection); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read hb2 input selection bit"); + return recoveryAction; + } + } + } + else + { + recoveryAction = adrv904x_RxFuncs_Hb2OverloadUseHb2In_BfGet(device, NULL, rxFuncsBaseAddr, hb2OverloadSignalSelection); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read hb2 input selection bit"); + return recoveryAction; + } + } + + recoveryAction = adrv904x_RxFuncs_OverloadPowerModeAgc_BfGet(device, NULL, rxFuncsBaseAddr, hb2OverloadPowerMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read hb2 power mode bit"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_ORxAttenDbToRegValues(adi_adrv904x_Device_t* const device, + const uint8_t attenDb, + uint8_t* const trmAtten, + uint8_t* const trmAttenBwCapEn) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, trmAtten); + + /* Requested ORx atten to bitfield value mappings */ + /* TODO - yoda provides a mapping from attenDb to corresponding trmAtten bitfield value by way of the adrv904x_Bf_ActrlOrxWestRegmap_TrmAtten_e enumeration. + * Unfortunately that mapping is currently incorrect. See TPGRADSWL-10152 and the 'Palau ORX Atten Users Guide'. */ + + /* NOTE: The FW has these LUTs too. So, any LUT changes must be made in both places. */ + const uint8_t orxAttenDbToTrmAtten[ADI_ADRV904X_MAX_ORX_ATTEN_DB + 1] = {0x00, 0x01, 0x02, 0x03, + 0x04, 0x05, 0x08, 0x09, + 0x0A, 0x0B, 0x0C, 0x0D, + 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15}; + const uint8_t orxAttenDbToTrmAttenBwCapEn[ADI_ADRV904X_MAX_ORX_ATTEN_DB + 1] = {0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, + 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F}; + + if (attenDb > ADI_ADRV904X_MAX_ORX_ATTEN_DB) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + attenDb, + "attenDb outside maximum range"); + return recoveryAction; + } + + *trmAtten = orxAttenDbToTrmAtten[attenDb]; + *trmAttenBwCapEn = orxAttenDbToTrmAttenBwCapEn[attenDb]; + + return ADI_ADRV904X_ERR_ACT_NONE; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_ORxTrmAttenToDb(adi_adrv904x_Device_t* const device, + const uint8_t trmAtten, + uint8_t* const attenDb) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, attenDb); + + /* TODO - yoda provides a mapping from attenDb to corresponding trmAtten bitfield value by way of the + * adrv904x_Bf_ActrlOrxWestRegmap_TrmAtten_e enumeration. Unfortunately that mapping is currently incorrect. See + * TPGRADSWL-10152 and the 'Palau ORX Atten Users Guide'. + */ + + /* + * TrmAtten -> orxAttenDb + * ----------+------------ + * hex |dec | dB + * ----------|------------ + * 0x00 0 | 0 + * 0x01 1 | 1 + * 0x02 2 | 2 + * 0x03 3 | 3 + * 0x04 4 | 4 + * 0x05 5 | 5 + * 0x06 6 | 5 # + * 0x07 7 | 6 # + * 0x08 8 | 6 + * 0x09 9 | 7 + * 0x0A 10 | 8 + * 0x0B 11 | 9 + * 0x0C 12 | 10 + * 0x0D 13 | 11 + * 0x0E 14 | 11 # + * 0x0F 15 | 12 # + * 0x10 16 | 12 + * 0x11 17 | 13 + * 0x12 18 | 14 + * 0x13 19 | 15 + * 0x14 20 | 16 + * 0x15 21 | 17 + * '#' indicates a value interpolated from the TrmAtten <- orxAttenDb mapping to avoid confusing holes in the + * TrmAtten -> orxAttenDb mapping. + */ + + /* Resolve bitfield value to result in dB. Return an error if there is no definition of a conversion to dB from the value */ + if (trmAtten <= 5U) + { + *attenDb = trmAtten; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + else if ((8U <= trmAtten) && + (trmAtten <= 13U)) + { + *attenDb = trmAtten - 2U; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + else if ((16U <= trmAtten) && + (trmAtten <= 21U)) + { + *attenDb = trmAtten - 4U; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + attenDb, + "Invalid value for trmAtten. Cannot resolve to atten in dB."); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API uint8_t adrv904x_RxChannelsToId(const adi_adrv904x_RxChannels_e rxChannel) +{ + switch (rxChannel) + { + case ADI_ADRV904X_RX0: + return 0; + break; + + case ADI_ADRV904X_RX1: + return 1; + break; + + case ADI_ADRV904X_RX2: + return 2; + break; + + case ADI_ADRV904X_RX3: + return 3; + break; + + case ADI_ADRV904X_RX4: + return 4; + break; + + case ADI_ADRV904X_RX5: + return 5; + break; + + case ADI_ADRV904X_RX6: + return 6; + break; + + case ADI_ADRV904X_RX7: + return 7; + break; + + default: + return ADI_ADRV904X_MAX_RX_ONLY; + break; + } +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcFuncsBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChan, + adrv904x_BfCddcFuncsChanAddr_e* const cddcFuncsChannelBitfieldAddr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check cddc bitfield channel address pointer is not null */ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cddcFuncsChannelBitfieldAddr); + + if ((device->devStateInfo.initializedChannels & (uint32_t)rxChan) == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + NULL, + "Channel not in device initializedChannels for adrv904x_CddcFuncsBitfieldAddressGet() function"); + return recoveryAction; + } + + switch (rxChan) + { + case ADI_ADRV904X_RX0: + *cddcFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS; + break; + + case ADI_ADRV904X_RX1: + *cddcFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_FUNCS; + break; + + case ADI_ADRV904X_RX2: + *cddcFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_FUNCS; + break; + + case ADI_ADRV904X_RX3: + *cddcFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_FUNCS; + break; + + case ADI_ADRV904X_RX4: + *cddcFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_FUNCS; + break; + + case ADI_ADRV904X_RX5: + *cddcFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_FUNCS; + break; + + case ADI_ADRV904X_RX6: + *cddcFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_FUNCS; + break; + + case ADI_ADRV904X_RX7: + *cddcFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_FUNCS; + break; + + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChan, + "Invalid rxChan parameter "); + return recoveryAction; + } + break; + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CddcHbDpathBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChan, + adrv904x_BfCddcHbDpathChanAddr_e* const cddcHbDpathChannelBitfieldAddr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check cddc bitfield channel address pointer is not null */ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cddcHbDpathChannelBitfieldAddr); + + if ((device->devStateInfo.initializedChannels & (uint32_t)rxChan) == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + NULL, + "Channel not in device initializedChannels for adrv904x_CddcHbDpathBitfieldAddressGet() function"); + return recoveryAction; + } + + switch (rxChan) + { + case ADI_ADRV904X_RX0: + *cddcHbDpathChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH; + break; + + case ADI_ADRV904X_RX1: + *cddcHbDpathChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH; + break; + + case ADI_ADRV904X_RX2: + *cddcHbDpathChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_2__RX_CDDC_RX_CDDC_HB_DPATH; + break; + + case ADI_ADRV904X_RX3: + *cddcHbDpathChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_3__RX_CDDC_RX_CDDC_HB_DPATH; + break; + + case ADI_ADRV904X_RX4: + *cddcHbDpathChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_4__RX_CDDC_RX_CDDC_HB_DPATH; + break; + + case ADI_ADRV904X_RX5: + *cddcHbDpathChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_5__RX_CDDC_RX_CDDC_HB_DPATH; + break; + + case ADI_ADRV904X_RX6: + *cddcHbDpathChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_6__RX_CDDC_RX_CDDC_HB_DPATH; + break; + + case ADI_ADRV904X_RX7: + *cddcHbDpathChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_7__RX_CDDC_RX_CDDC_HB_DPATH; + break; + + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChan, + "Invalid rxChan parameter "); + return recoveryAction; + } + break; + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierRssiCfgRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxCarrierRssiCfg_t* const rssiCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rssiCfg); + + static const uint8_t ENABLE_MAX = 1U; + static const uint16_t MAX_START_DELAY = 0x1FFFU; + static const uint32_t MAX_WAIT_DELAY = 0xFFFFFFU; + static const uint16_t MAX_PAUSE_DELAY = 0x3FFFU; + static const uint8_t MAX_DURATION = 0x1FU; + static const uint16_t MAX_MULFACTOR = 0x03FFU; + static const uint8_t MAX_TRIGSELECT = 0x07U; + static const uint32_t MAX_CAPTURE_TIME_USEC = 500000U; /* 0.5 sec */ + + if (((rssiCfg->rxCarrierMask.carrierMask & (~(uint32_t)ADI_ADRV904X_RX_CARRIER_ALL)) != 0U) || + (rssiCfg->rxCarrierMask.carrierMask == (uint32_t)ADI_ADRV904X_RX_CARRIER_NONE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rssiCfg->rxCarrierMask.carrierMask, + "Invalid Rx carrier mask is selected. Valid values are any combinations of RxCarrier0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + if (((rssiCfg->rxCarrierMask.rxChannelMask & (~(uint32_t)ADI_ADRV904X_RX_MASK_ALL)) != 0U) || + (rssiCfg->rxCarrierMask.rxChannelMask == (uint32_t)ADI_ADRV904X_RXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rssiCfg->rxCarrierMask.rxChannelMask, + "Invalid Rx channel mask is selected. Valid values are any combinations of Rx0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + if ((rssiCfg->measMode != ADI_ADRV904X_RX_CARRIER_RSSI_MEAS_MODE_IMMEDIATE_FDD) && + (rssiCfg->measMode != ADI_ADRV904X_RX_CARRIER_RSSI_MEAS_MODE_TDD_SINGLE) && + (rssiCfg->measMode != ADI_ADRV904X_RX_CARRIER_RSSI_MEAS_MODE_TDD_CONTINUOUS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rssiCfg->measMode, + "Invalid Rssi measMode selection."); + return recoveryAction; + } + + + if ((rssiCfg->startDelay > MAX_START_DELAY) || + (rssiCfg->startDelay == 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rssiCfg->startDelay, + "Invalid startDelay selection."); + return recoveryAction; + } + + if ((rssiCfg->waitDelay > MAX_WAIT_DELAY) || + (rssiCfg->waitDelay == 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rssiCfg->waitDelay, + "Invalid waitDelay selection."); + return recoveryAction; + } + + if ((rssiCfg->pauseDelay > MAX_PAUSE_DELAY) || + (rssiCfg->pauseDelay == 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rssiCfg->pauseDelay, + "Invalid pauseDelay selection."); + return recoveryAction; + } + + if ((rssiCfg->opMode != ADI_ADRV904X_RX_CARRIER_RSSI_OP_MODE_SUMPOWER2) && + (rssiCfg->opMode != ADI_ADRV904X_RX_CARRIER_RSSI_OP_MODE_POWER2)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rssiCfg->opMode, + "Invalid Rssi opMode selection."); + return recoveryAction ; + } + + if (rssiCfg->duration0 > MAX_DURATION) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rssiCfg->duration0, + "Invalid duration0 selection."); + return recoveryAction; + } + + if (rssiCfg->duration1 > MAX_DURATION) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rssiCfg->duration1, + "Invalid duration1 selection."); + return recoveryAction; + } + + if (rssiCfg->duration2 > MAX_DURATION) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rssiCfg->duration2, + "Invalid duration2 selection."); + return recoveryAction; + } + + if (rssiCfg->duration3 > MAX_DURATION) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rssiCfg->duration3, + "Invalid duration3 selection."); + return recoveryAction; + } + + if (rssiCfg->mulFactor0 > MAX_MULFACTOR) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rssiCfg->mulFactor0, + "Invalid mulFactor0 selection."); + return recoveryAction; + } + + if (rssiCfg->mulFactor1 > MAX_MULFACTOR) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rssiCfg->mulFactor1, + "Invalid mulFactor1 selection."); + return recoveryAction; + } + + if (rssiCfg->mulFactor2 > MAX_MULFACTOR) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rssiCfg->mulFactor2, + "Invalid mulFactor2 selection."); + return recoveryAction; + } + + if (rssiCfg->mulFactor3 > MAX_MULFACTOR) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rssiCfg->mulFactor3, + "Invalid mulFactor3 selection."); + return recoveryAction; + } + + if (rssiCfg->resetAtGainChange > ENABLE_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rssiCfg->resetAtGainChange, + "Invalid resetAtGainChange selection."); + return recoveryAction; + } + + if (rssiCfg->fddPinMode > ENABLE_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rssiCfg->fddPinMode, + "Invalid fddPinMode selection."); + return recoveryAction; + } + + if (rssiCfg->radioSeqTrigEnable > ENABLE_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rssiCfg->radioSeqTrigEnable, + "Invalid radioSeqTrigEnable selection."); + return recoveryAction; + } + + if (rssiCfg->radioSeqTrigSelect > MAX_TRIGSELECT) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rssiCfg->radioSeqTrigSelect, + "Invalid radioSeqTrigSelect selection."); + return recoveryAction; + } + + if (rssiCfg->captureTimeUsec > MAX_CAPTURE_TIME_USEC) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rssiCfg->captureTimeUsec, + "Invalid captureTimeUsec selection."); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierDecPowerTddModeSet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const uint32_t rxChannelTddMode) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + uint8_t tddMode = 0U; + + adrv904x_BfCddcFuncsChanAddr_e cddcFuncsChanBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + if (((rxChannelMask & (~(uint32_t)ADI_ADRV904X_RX_MASK_ALL)) != 0U) || + (rxChannelMask == (uint32_t)ADI_ADRV904X_RXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChannelMask, + "Invalid Rx mask is selected. Valid values are any combinations of Rx0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_RX_ONLY; chanIdx++) + { + chanSel = 1U << chanIdx; + if ((rxChannelMask & chanSel) > 0U) + { + /* Convert the chanSel to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_CddcFuncsBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(chanSel), &cddcFuncsChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanSel, "Invalid Rx Channel used to determine SPI address"); + return recoveryAction; + } + + tddMode = 0U; + if ((rxChannelTddMode & chanSel) > 0U) + { + tddMode = 1U; + } + recoveryAction = adrv904x_CddcFuncs_CddcPowerMeasurementTddModeEnable_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + tddMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting Dec power tdd mode enable"); + return recoveryAction; + } + + } + } + + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierDecPowerTddModeGet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + uint32_t * const rxChannelTddMode) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t tddMode = 0U; + + adrv904x_BfCddcFuncsChanAddr_e cddcFuncsChanBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxChannelTddMode); + + if ((rxChannelMask != (uint32_t)ADI_ADRV904X_RX0) && + (rxChannelMask != (uint32_t)ADI_ADRV904X_RX1) && + (rxChannelMask != (uint32_t)ADI_ADRV904X_RX2) && + (rxChannelMask != (uint32_t)ADI_ADRV904X_RX3) && + (rxChannelMask != (uint32_t)ADI_ADRV904X_RX4) && + (rxChannelMask != (uint32_t)ADI_ADRV904X_RX5) && + (rxChannelMask != (uint32_t)ADI_ADRV904X_RX6) && + (rxChannelMask != (uint32_t)ADI_ADRV904X_RX7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChannelMask, + "Invalid Rx mask is selected. Valid value is one of Rx0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + /* Convert the RxChannelMask to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_CddcFuncsBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(rxChannelMask), &cddcFuncsChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannelMask, "Error while getting Cddc SPI address"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_CddcPowerMeasurementTddModeEnable_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + &tddMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting Dec power tdd mode enable"); + return recoveryAction; + } + + *rxChannelTddMode = (uint32_t)tddMode; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxDecPowerCfgRangeCheck(adi_adrv904x_Device_t* const device, + const adrv904x_RxCarrierDecPowerCfg_t* const decPowerCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, decPowerCfg); + + static const uint8_t ENABLE_MAX = 1U; + static const uint8_t MAX_POWER_INPUT_SELECT = 2U; + static const uint8_t MAX_MEASUREMENT_DURATION = 31U; + + if (((decPowerCfg->rxCarrierMask.carrierMask & (~(uint32_t)ADI_ADRV904X_RX_CARRIER_ALL)) != 0U) || + (decPowerCfg->rxCarrierMask.carrierMask == (uint32_t)ADI_ADRV904X_RX_CARRIER_NONE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + decPowerCfg->rxCarrierMask.carrierMask, + "Invalid Rx carrier is selected. Valid values are any combinations of RxCarrier0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + + if (((decPowerCfg->rxCarrierMask.rxChannelMask & (~(uint32_t)ADI_ADRV904X_RX_MASK_ALL)) != 0U) || + (decPowerCfg->rxCarrierMask.rxChannelMask == (uint32_t)ADI_ADRV904X_RXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + decPowerCfg->rxCarrierMask.rxChannelMask, + "Invalid Rx channel mask is selected. Valid values are any combinations of Rx0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + if (decPowerCfg->measEnable > ENABLE_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + decPowerCfg->measEnable, + "Invalid measEnable selection."); + return recoveryAction; + } + + if (decPowerCfg->inputSelect > MAX_POWER_INPUT_SELECT) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + decPowerCfg->inputSelect, + "Invalid inputSelect selection."); + return recoveryAction; + } + + if (decPowerCfg->powerMeasurementDuration > MAX_MEASUREMENT_DURATION) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + decPowerCfg->powerMeasurementDuration, + "Invalid powerMeasurementDuration selection."); + return recoveryAction; + } + + if (decPowerCfg->peakToPowerMode > ENABLE_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + decPowerCfg->peakToPowerMode, + "Invalid peakToPowerMode selection."); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierDecPowerCfgSet(adi_adrv904x_Device_t * const device, + adrv904x_RxCarrierDecPowerCfg_t rxCarrierDecPowerCfg[], + const uint32_t numCfgs) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t cfgIdx = 0U; + uint32_t carrierIdx = 0U; + uint32_t rxIdx = 0U; + uint32_t rxSel = 0U; + + adrv904x_BfCddcFuncsChanAddr_e cddcFuncsChanBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxCarrierDecPowerCfg); + + if (numCfgs == 0U) + { + /* no valid configs */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numCfgs, "Invalid Number of Dec Power Configurations"); + return recoveryAction; + } + + /* Loop through the number of configurations and perform range checks */ + for (cfgIdx = 0U; cfgIdx < numCfgs; ++cfgIdx) + { + recoveryAction = adrv904x_RxDecPowerCfgRangeCheck(device, &rxCarrierDecPowerCfg[cfgIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Rx Carrier Dec power range check Error Reported"); + return recoveryAction; + } + } + + /* Write out the configurations */ + for (cfgIdx = 0U; cfgIdx < numCfgs; ++cfgIdx) + { + for (rxIdx = 0U; rxIdx < ADI_ADRV904X_MAX_RX_ONLY; rxIdx++) + { + rxSel = 1U << rxIdx; + if ((rxCarrierDecPowerCfg[cfgIdx].rxCarrierMask.rxChannelMask & rxSel) > 0U) + { + /* Convert the rxSel to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_CddcFuncsBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(rxSel), &cddcFuncsChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxSel, "Invalid Rx Carrier used to determine SPI address"); + return recoveryAction; + } + + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_RX_CARRIERS; carrierIdx++) + { + recoveryAction = adrv904x_CddcFuncs_CddcPowerInputSelect_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rxCarrierDecPowerCfg[cfgIdx].inputSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting power measurement input selection"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_CddcPowerMeasurementDuration_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rxCarrierDecPowerCfg[cfgIdx].powerMeasurementDuration); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting power measurement duration"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_CddcPowerMeasurementContinueDelayCounter_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rxCarrierDecPowerCfg[cfgIdx].dpdInOutPwrMeasContDlyCntr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting power measurement continue delay counter"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_CddcPeakToPowerMode_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rxCarrierDecPowerCfg[cfgIdx].peakToPowerMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting peak to power mode"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_CddcPowerMeasurementEnable_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rxCarrierDecPowerCfg[cfgIdx].measEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting power measurement enable bit"); + return recoveryAction; + } + } + } + } + } + + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierDecPowerCfgGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxCarrierMask_t * const rxCarrierMask, + adrv904x_RxCarrierDecPowerCfg_t * const cfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t carrierIdx = 0U; + + adrv904x_BfCddcFuncsChanAddr_e cddcFuncsChanBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxCarrierMask); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cfg); + + switch (rxCarrierMask->carrierMask) + { + case ADI_ADRV904X_RX_CARRIER_0: + carrierIdx = 0U; + break; + case ADI_ADRV904X_RX_CARRIER_1: + carrierIdx = 1U; + break; + case ADI_ADRV904X_RX_CARRIER_2: + carrierIdx = 2U; + break; + case ADI_ADRV904X_RX_CARRIER_3: + carrierIdx = 3U; + break; + case ADI_ADRV904X_RX_CARRIER_4: + carrierIdx = 4U; + break; + case ADI_ADRV904X_RX_CARRIER_5: + carrierIdx = 5U; + break; + case ADI_ADRV904X_RX_CARRIER_6: + carrierIdx = 6U; + break; + case ADI_ADRV904X_RX_CARRIER_7: + carrierIdx = 7U; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxCarrierMask->carrierMask, + "Invalid Rx carrier selection"); + return recoveryAction; + break; + } + + if ((rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX0) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX1) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX2) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX3) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX4) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX5) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX6) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX7)) + { + /* Invalid Rx channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxCarrierMask->rxChannelMask, "Invalid Rx channel selection"); + return recoveryAction; + } + + + /* Read out the configurations */ + /* Convert the rxSel to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_CddcFuncsBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(rxCarrierMask->rxChannelMask), &cddcFuncsChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxCarrierMask->rxChannelMask, "Invalid Rx Carrier used to determine SPI address"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_CddcPowerInputSelect_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &cfg->inputSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting power measurement input selection"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_CddcPowerMeasurementDuration_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &cfg->powerMeasurementDuration); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting power measurement duration"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_CddcPowerMeasurementContinueDelayCounter_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &cfg->dpdInOutPwrMeasContDlyCntr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting power measurement continue delay counter"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_CddcPeakToPowerMode_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &cfg->peakToPowerMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting peak to power mode"); + return recoveryAction; + } + + recoveryAction = adrv904x_CddcFuncs_CddcPowerMeasurementEnable_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &cfg->measEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting power measurement enable bit"); + return recoveryAction; + } + + cfg->rxCarrierMask.carrierMask = rxCarrierMask->carrierMask; + cfg->rxCarrierMask.rxChannelMask = rxCarrierMask->rxChannelMask; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierDecPowerPause(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxCarrierMask_t * const rxCarrierMask, + const uint32_t rxCarrierPause) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t carrierIdx = 0U; + uint32_t carrierSel = 0U; + uint32_t rxIdx = 0U; + uint32_t rxSel = 0U; + uint8_t powerPause = 0U; + + adrv904x_BfCddcFuncsChanAddr_e cddcFuncsChanBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxCarrierMask); + + if (((rxCarrierMask->carrierMask & (~(uint32_t)ADI_ADRV904X_RX_CARRIER_ALL)) != 0U) || + (rxCarrierMask->carrierMask == (uint32_t)ADI_ADRV904X_RX_CARRIER_NONE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxCarrierMask->carrierMask, + "Invalid Rx carrier mask is selected. Valid values are any combinations of RxCarrier0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + if (((rxCarrierMask->rxChannelMask & (~(uint32_t)ADI_ADRV904X_RX_MASK_ALL)) != 0U) || + (rxCarrierMask->rxChannelMask == (uint32_t)ADI_ADRV904X_RXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxCarrierMask->rxChannelMask, + "Invalid Rx channel mask is selected. Valid values are any combinations of Rx0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + if (((rxCarrierPause & (~(uint32_t)ADI_ADRV904X_RX_CARRIER_ALL)) != 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxCarrierPause, + "Invalid Rx carrier pause mask is selected. Valid values are any combinations of RxCarrier0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + + /* Write out the power measurement pause */ + for (rxIdx = 0U; rxIdx < ADI_ADRV904X_MAX_RX_ONLY; rxIdx++) + { + rxSel = 1U << rxIdx; + if ((rxCarrierMask->rxChannelMask & rxSel) > 0U) + { + /* Convert the rxSel to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_CddcFuncsBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(rxSel), &cddcFuncsChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxSel, "Invalid Rx Carrier used to determine SPI address"); + return recoveryAction; + } + + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_RX_CARRIERS; carrierIdx++) + { + carrierSel = 1U << carrierIdx; + if ((rxCarrierMask->carrierMask & carrierSel) > 0U) + { + powerPause = 0U; + if ((rxCarrierPause & carrierSel) > 0U) + { + powerPause = 1U; + } + + recoveryAction = adrv904x_CddcFuncs_CddcPowerMeasurementPause_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + powerPause); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting rssi manual pause"); + return recoveryAction; + } + + } + } + } + } + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierDecPowerGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxCarrierMask_t * const rxCarrierMask, + uint8_t * const avgPower) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t carrierIdx = 0U; + uint8_t bfValue = 0U; + + adrv904x_BfCddcFuncsChanAddr_e cddcFuncsChanBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxCarrierMask); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, avgPower); + + switch (rxCarrierMask->carrierMask) + { + case ADI_ADRV904X_RX_CARRIER_0: + carrierIdx = 0U; + break; + case ADI_ADRV904X_RX_CARRIER_1: + carrierIdx = 1U; + break; + case ADI_ADRV904X_RX_CARRIER_2: + carrierIdx = 2U; + break; + case ADI_ADRV904X_RX_CARRIER_3: + carrierIdx = 3U; + break; + case ADI_ADRV904X_RX_CARRIER_4: + carrierIdx = 4U; + break; + case ADI_ADRV904X_RX_CARRIER_5: + carrierIdx = 5U; + break; + case ADI_ADRV904X_RX_CARRIER_6: + carrierIdx = 6U; + break; + case ADI_ADRV904X_RX_CARRIER_7: + carrierIdx = 7U; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxCarrierMask->carrierMask, + "Invalid Rx carrier selection"); + return recoveryAction; + break; + } + + if ((rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX0) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX1) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX2) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX3) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX4) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX5) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX6) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX7)) + { + /* Invalid Rx channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxCarrierMask->rxChannelMask, "Invalid Rx channel selection"); + return recoveryAction; + } + + /* Read out the configurations */ + /* Convert the rxSel to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_CddcFuncsBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(rxCarrierMask->rxChannelMask), &cddcFuncsChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxCarrierMask->rxChannelMask, "Invalid Rx Channel used to determine SPI address"); + return recoveryAction; + } + + /* cddc_power_measurement_readback*/ + recoveryAction = adrv904x_CddcFuncs_CddcPowerMeasurementReadback_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting power measurement readback"); + return recoveryAction; + } + + /* cddc_power */ + recoveryAction = adrv904x_CddcFuncs_CddcPower_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting power readback"); + return recoveryAction; + } + + *avgPower = bfValue; + + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCarrierDecPowerAndPeakGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxCarrierMask_t * const rxCarrierMask, + uint8_t * const avgPower, + uint8_t * const peakPower) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t carrierIdx = 0U; + uint8_t bfValue = 0U; + + adrv904x_BfCddcFuncsChanAddr_e cddcFuncsChanBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxCarrierMask); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, avgPower); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, peakPower); + + switch (rxCarrierMask->carrierMask) + { + case ADI_ADRV904X_RX_CARRIER_0: + carrierIdx = 0U; + break; + case ADI_ADRV904X_RX_CARRIER_1: + carrierIdx = 1U; + break; + case ADI_ADRV904X_RX_CARRIER_2: + carrierIdx = 2U; + break; + case ADI_ADRV904X_RX_CARRIER_3: + carrierIdx = 3U; + break; + case ADI_ADRV904X_RX_CARRIER_4: + carrierIdx = 4U; + break; + case ADI_ADRV904X_RX_CARRIER_5: + carrierIdx = 5U; + break; + case ADI_ADRV904X_RX_CARRIER_6: + carrierIdx = 6U; + break; + case ADI_ADRV904X_RX_CARRIER_7: + carrierIdx = 7U; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxCarrierMask->carrierMask, + "Invalid Rx carrier selection"); + return recoveryAction; + break; + } + + if ((rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX0) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX1) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX2) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX3) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX4) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX5) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX6) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX7)) + { + /* Invalid Rx channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxCarrierMask->rxChannelMask, "Invalid Rx channel selection"); + return recoveryAction; + } + + /* Read out the configurations */ + /* Convert the rxSel to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_CddcFuncsBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(rxCarrierMask->rxChannelMask), &cddcFuncsChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxCarrierMask->rxChannelMask, "Invalid Rx Channel used to determine SPI address"); + return recoveryAction; + } + + /* cddc_power_measurement_readback*/ + recoveryAction = adrv904x_CddcFuncs_CddcPowerMeasurementReadback_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting power measurement readback"); + return recoveryAction; + } + + /* cddc_power */ + recoveryAction = adrv904x_CddcFuncs_CddcPower_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting power readback"); + return recoveryAction; + } + + *avgPower = bfValue; + + /* cddc_power_largest_peak */ + recoveryAction = adrv904x_CddcFuncs_CddcPowerLargestPeak_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting power largest readback"); + return recoveryAction; + } + + *peakPower = bfValue; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_RxCddcCarrierCheck(adi_adrv904x_Device_t* const device, + const uint8_t chanSelect, + const uint8_t carrierSelect) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t idx = 0U; + uint8_t bfValue = 0U; + uint32_t cducBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH; + uint32_t stride = ADRV904X_BF_SLICE_RX_1__RX_CDDC_RX_CDDC_HB_DPATH - ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Scan through each channel to validate the carrier mask */ + for (idx = 0u; idx < ADRV904X_NUM_TXRX_CHAN; idx++) + { + if (chanSelect & (1u << idx)) + { + cducBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH + (idx * stride); + bfValue = 0U; + recoveryAction = adrv904x_CddcHbDpath_CarrierEnable_BfGet(device, + NULL, + (adrv904x_BfCddcHbDpathChanAddr_e)cducBaseAddr, + &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting enabled carriers"); + return recoveryAction; + } + + if ((carrierSelect & (uint32_t)bfValue) == 0x0u) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "requested carrier mask contains invalid carriers"); + return recoveryAction; + } + } + } + + return recoveryAction; +} + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_shared_resource_manager.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_shared_resource_manager.c new file mode 100644 index 00000000000..7ba3aa7f567 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_shared_resource_manager.c @@ -0,0 +1,673 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adrv904x_shared_resource_manager.c + * \brief Contains ADRV904X shared resource related private function implementations + * + * ADRV904X API Version: 2.10.0.4 + */ + +#include "../../private/include/adrv904x_shared_resource_manager.h" + +#include "adi_adrv904x_gpio_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_SHARED_RESOURCE_MANAGER + +/******************************************** User Functions ********************************************************************/ + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SharedResourceMgrReset(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + uint32_t sharedResourceIndex = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + for (sharedResourceIndex = 0U; sharedResourceIndex < ADRV904X_NUM_SHARED_RESOURCES; sharedResourceIndex++) + { + device->devStateInfo.sharedResourcePool[sharedResourceIndex].featureID = (uint32_t)ADRV904X_FEATURE_UNUSED; + device->devStateInfo.sharedResourcePool[sharedResourceIndex].channelMask = 0U; + device->devStateInfo.sharedResourcePool[sharedResourceIndex].semaphoreCount = 0U; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SharedResourcesAcquire(adi_adrv904x_Device_t* const device, + const adrv904x_SharedResourceType_e sharedResourceType, + int32_t sharedResourceArr[], + const uint32_t numSharedResources, + const adrv904x_FeatureID_e featureID, + uint8_t* const resourceAcquistionStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + uint32_t sharedResourceIndex = 0U; + adrv904x_SharedResourceID_e sharedResourceID = ADRV904X_SHARED_RESOURCE_INVALID; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check resourceAcquistionStatus pointer is not null */ + ADI_ADRV904X_NULL_PTR_RETURN(resourceAcquistionStatus); + + /*Range check that featureID is valid*/ + if (featureID >= ADRV904X_NUM_FEATURES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, featureID, "featureID is not valid"); + return recoveryAction; + } + + /*Range Check that shared resource type is valid*/ + if (sharedResourceType >= ADRV904X_NUM_SHARED_RESOURCE_TYPES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + sharedResourceType, + "Invalid sharedResourceType encountered in adrv904x_SharedResourcesAcquire function"); + return recoveryAction; + } + + /*Loop through each shared resource. + 1) Get Shared Resource unique ID + 2) Acquire Shared Resource + 3) If the resource is in use by another feature than the one which requested return a failed status*/ + for (sharedResourceIndex = 0U; sharedResourceIndex < numSharedResources; sharedResourceIndex++) + { + recoveryAction = adrv904x_SharedResourceIdGet(device, + sharedResourceType, + sharedResourceArr[sharedResourceIndex], + &sharedResourceID); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + sharedResourceID, + "Error while attempting to resolve shared resource ID for the requested share resource"); + return recoveryAction; + } + + recoveryAction = adrv904x_SharedResourceAcquire(device, + sharedResourceID, + featureID, + resourceAcquistionStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + resourceAcquistionStatus, + "Error while attempting to acquire requested share resource"); + return recoveryAction; + } + + if (*resourceAcquistionStatus == ADI_FAILURE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + resourceAcquistionStatus, + "Error acquiring requested shared resource. Please check if the resource is already in use by another feature."); + return recoveryAction; + break; + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SharedResourcesRelease(adi_adrv904x_Device_t* const device, + const adrv904x_SharedResourceType_e sharedResourceType, + int32_t sharedResourceArr[], + const uint32_t numSharedResources, + const adrv904x_FeatureID_e featureID, + uint8_t* const resourceReleaseStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + uint32_t sharedResourceIndex = 0U; + adrv904x_SharedResourceID_e sharedResourceID = ADRV904X_SHARED_RESOURCE_INVALID; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check resourceReleaseStatus pointer is not null */ + ADI_ADRV904X_NULL_PTR_RETURN(resourceReleaseStatus); + + /*Range check that featureID is valid*/ + if (featureID >= ADRV904X_NUM_FEATURES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + featureID, + "featureID is not valid"); + return recoveryAction; + } + + /*Range Check that shared resource type is valid*/ + if (sharedResourceType >= ADRV904X_NUM_SHARED_RESOURCE_TYPES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + sharedResourceType, + "Invalid sharedResourceType encountered in adrv904x_SharedResourcesAcquire function"); + return recoveryAction; + } + + /*Loop through each shared resource. + 1) Get Shared Resource unique ID + 2) Release Shared Resource + 3) If the resource is in use by another feature than the one which requested return a failed status*/ + for (sharedResourceIndex = 0U; sharedResourceIndex < numSharedResources; sharedResourceIndex++) + { + recoveryAction = adrv904x_SharedResourceIdGet(device, + sharedResourceType, + sharedResourceArr[sharedResourceIndex], + &sharedResourceID); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + sharedResourceID, + "Error while attempting to resolve shared resource ID for the requested share resource"); + return recoveryAction; + } + + recoveryAction = adrv904x_SharedResourceRelease(device, + sharedResourceID, + featureID, + resourceReleaseStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + resourceReleaseStatus, + "Error while attempting to release requested share resource"); + return recoveryAction; + } + + if (*resourceReleaseStatus == ADI_FAILURE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + resourceReleaseStatus, + "Error releasing requested shared resource. Please check if the resource is already in use by another feature."); + return recoveryAction; + break; + } + } + + return recoveryAction; +} + +/******************************************** Helper/Debug Functions ********************************************************************/ + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SharedResourceAvailabilityCheck(adi_adrv904x_Device_t* const device, + const adrv904x_SharedResourceID_e sharedResourceID, + uint8_t* const sharedResourceAvailable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check sharedResourceAvailable pointer is not null */ + ADI_ADRV904X_NULL_PTR_RETURN(sharedResourceAvailable); + + /*Range Check that shared resource ID is valid*/ + if (sharedResourceID >= ADRV904X_NUM_SHARED_RESOURCES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + sharedResourceID, + "sharedResourceID is not valid"); + return recoveryAction; + } + + /*Return success if shared resource pool index of shared resource ID has a feature other than UNUSED associated with it*/ + if (device->devStateInfo.sharedResourcePool[sharedResourceID].featureID == (uint32_t)ADRV904X_FEATURE_UNUSED) + { + *sharedResourceAvailable = (uint8_t)ADI_TRUE; + } + else + { + *sharedResourceAvailable = (uint8_t)ADI_FALSE; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SharedResourceIdGet(adi_adrv904x_Device_t* const device, + const adrv904x_SharedResourceType_e sharedResourceType, + int32_t sharedResource, + adrv904x_SharedResourceID_e* const sharedResourceID) +{ + static const adrv904x_SharedResourceLut_t sharedResourceLut[] = { + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_00, ADRV904X_GPIO_00 }, + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_01, ADRV904X_GPIO_01 }, + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_02, ADRV904X_GPIO_02 }, + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_03, ADRV904X_GPIO_03 }, + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_04, ADRV904X_GPIO_04 }, + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_05, ADRV904X_GPIO_05 }, + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_06, ADRV904X_GPIO_06 }, + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_07, ADRV904X_GPIO_07 }, + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_08, ADRV904X_GPIO_08 }, + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_09, ADRV904X_GPIO_09 }, + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_10, ADRV904X_GPIO_10 }, + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_11, ADRV904X_GPIO_11 }, + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_12, ADRV904X_GPIO_12 }, + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_13, ADRV904X_GPIO_13 }, + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_14, ADRV904X_GPIO_14 }, + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_15, ADRV904X_GPIO_15 }, + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_16, ADRV904X_GPIO_16 }, + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_17, ADRV904X_GPIO_17 }, + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_18, ADRV904X_GPIO_18 }, + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_19, ADRV904X_GPIO_19 }, + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_20, ADRV904X_GPIO_20 }, + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_21, ADRV904X_GPIO_21 }, + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_22, ADRV904X_GPIO_22 }, + { ADRV904X_SHARED_RESOURCE_GPIO, ADI_ADRV904X_GPIO_23, ADRV904X_GPIO_23 }, + { ADRV904X_SHARED_RESOURCE_GPIO_ANALOG, ADI_ADRV904X_GPIO_ANA_00, ADRV904X_GPIO_ANA_00 }, + { ADRV904X_SHARED_RESOURCE_GPIO_ANALOG, ADI_ADRV904X_GPIO_ANA_01, ADRV904X_GPIO_ANA_01 }, + { ADRV904X_SHARED_RESOURCE_GPIO_ANALOG, ADI_ADRV904X_GPIO_ANA_02, ADRV904X_GPIO_ANA_02 }, + { ADRV904X_SHARED_RESOURCE_GPIO_ANALOG, ADI_ADRV904X_GPIO_ANA_03, ADRV904X_GPIO_ANA_03 }, + { ADRV904X_SHARED_RESOURCE_GPIO_ANALOG, ADI_ADRV904X_GPIO_ANA_04, ADRV904X_GPIO_ANA_04 }, + { ADRV904X_SHARED_RESOURCE_GPIO_ANALOG, ADI_ADRV904X_GPIO_ANA_05, ADRV904X_GPIO_ANA_05 }, + { ADRV904X_SHARED_RESOURCE_GPIO_ANALOG, ADI_ADRV904X_GPIO_ANA_06, ADRV904X_GPIO_ANA_06 }, + { ADRV904X_SHARED_RESOURCE_GPIO_ANALOG, ADI_ADRV904X_GPIO_ANA_07, ADRV904X_GPIO_ANA_07 }, + { ADRV904X_SHARED_RESOURCE_GPIO_ANALOG, ADI_ADRV904X_GPIO_ANA_08, ADRV904X_GPIO_ANA_08 }, + { ADRV904X_SHARED_RESOURCE_GPIO_ANALOG, ADI_ADRV904X_GPIO_ANA_09, ADRV904X_GPIO_ANA_09 }, + { ADRV904X_SHARED_RESOURCE_GPIO_ANALOG, ADI_ADRV904X_GPIO_ANA_10, ADRV904X_GPIO_ANA_10 }, + { ADRV904X_SHARED_RESOURCE_GPIO_ANALOG, ADI_ADRV904X_GPIO_ANA_11, ADRV904X_GPIO_ANA_11 }, + { ADRV904X_SHARED_RESOURCE_GPIO_ANALOG, ADI_ADRV904X_GPIO_ANA_12, ADRV904X_GPIO_ANA_12 }, + { ADRV904X_SHARED_RESOURCE_GPIO_ANALOG, ADI_ADRV904X_GPIO_ANA_13, ADRV904X_GPIO_ANA_13 }, + { ADRV904X_SHARED_RESOURCE_GPIO_ANALOG, ADI_ADRV904X_GPIO_ANA_14, ADRV904X_GPIO_ANA_14 }, + { ADRV904X_SHARED_RESOURCE_GPIO_ANALOG, ADI_ADRV904X_GPIO_ANA_15, ADRV904X_GPIO_ANA_15 } + }; + /*****************Please add lut val for shared resources above this line*******************/ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + uint32_t sharedResourceIndex = 0U; + uint8_t validSharedResourceTypeFlag = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_RETURN(sharedResourceID); + + /*Range Check that shared resource type is valid*/ + if (sharedResourceType >= ADRV904X_NUM_SHARED_RESOURCE_TYPES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + sharedResourceType, + "Invalid sharedResourceType encountered in adrv904x_SharedResourcesAcquire function"); + return recoveryAction; + } + + for (sharedResourceIndex = 0U; sharedResourceIndex < ADRV904X_NUM_SHARED_RESOURCES; sharedResourceIndex++) + { + if (sharedResourceLut[sharedResourceIndex].sharedResourceType == sharedResourceType) + { + if (sharedResourceLut[sharedResourceIndex].sharedResource == sharedResource) + { + *sharedResourceID = sharedResourceLut[sharedResourceIndex].sharedResourceId; + validSharedResourceTypeFlag = 1U; + break; + } + } + } + + /* Check not a valid shared resource ID found */ + if (validSharedResourceTypeFlag == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + validSharedResourceTypeFlag, + "Requested Shared Resource is not valid"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SharedResourceFeatureGet(adi_adrv904x_Device_t* const device, + const adrv904x_SharedResourceID_e sharedResourceID, + adrv904x_FeatureID_e* const featureID) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /*Range check that featureID is not null*/ + ADI_ADRV904X_NULL_PTR_RETURN(featureID); + + /*Range Check that shared resource ID is valid*/ + if (sharedResourceID >= ADRV904X_NUM_SHARED_RESOURCES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + sharedResourceID, + "sharedResourceID is not valid"); + return recoveryAction; + } + + /*Return the feature associated with shared resource pool*/ + *featureID = (adrv904x_FeatureID_e)device->devStateInfo.sharedResourcePool[sharedResourceID].featureID; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SharedResourceChannelMaskSet(adi_adrv904x_Device_t* const device, + const adrv904x_SharedResourceID_e sharedResourceID, + const uint32_t channelMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /*Range Check that shared resource ID is valid*/ + if (sharedResourceID >= ADRV904X_NUM_SHARED_RESOURCES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + sharedResourceID, + "sharedResourceID is not valid"); + return recoveryAction; + } + + /*Set the channelMask associated with shared resource pool*/ + device->devStateInfo.sharedResourcePool[sharedResourceID].channelMask = channelMask; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SharedResourceChannelMaskGet(adi_adrv904x_Device_t* const device, + const adrv904x_SharedResourceID_e sharedResourceID, + uint32_t * const channelMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /*Range check that channelMask is not null*/ + ADI_ADRV904X_NULL_PTR_RETURN(channelMask); + + /*Range Check that shared resource ID is valid*/ + if (sharedResourceID >= ADRV904X_NUM_SHARED_RESOURCES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + sharedResourceID, + "sharedResourceID is not valid"); + return recoveryAction; + } + + /*Return the channelMask associated with shared resource pool*/ + *channelMask = device->devStateInfo.sharedResourcePool[sharedResourceID].channelMask; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SharedResourceFeatureMaxSemaphoreCntGet(adi_adrv904x_Device_t* const device, + const adrv904x_FeatureID_e featureID, + uint8_t* maxSemaphoreCount) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /*Range check that the maximum semaphore count pointer is not null*/ + ADI_ADRV904X_NULL_PTR_RETURN(maxSemaphoreCount); + + /*Range Check that feature ID is valid*/ + if (featureID >= ADRV904X_NUM_FEATURES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + featureID, + "The feature ID requested for retrieving maximum semaphore count is not valid"); + return recoveryAction; + } + + switch (featureID) + { + case ADRV904X_FEATURE_GPIO_ADC_TEST_GEN_ENABLE: /* Fallthrough */ + case ADRV904X_FEATURE_GPIO_AGC_GAIN_CHANGE: /* Fallthrough */ + case ADRV904X_FEATURE_GPIO_AGC_DEC_GAIN: /* Fallthrough */ + case ADRV904X_FEATURE_GPIO_AGC_INC_GAIN: /* Fallthrough */ + case ADRV904X_FEATURE_GPIO_AGC_SLOWLOOP_FREEZE_ENABLE: /* Fallthrough */ + case ADRV904X_FEATURE_GPIO_AGC_MANUAL_GAIN_LOCK: /* Fallthrough */ + case ADRV904X_FEATURE_GPIO_SELECT_S1: /* Fallthrough */ + case ADRV904X_FEATURE_GPIO_TX_ATTEN_UPD_GPIO: /* Fallthrough */ + case ADRV904X_FEATURE_GPIO_DTX_FORCE_PIN: /* Fallthrough */ + case ADRV904X_FEATURE_GPIO_CDDC_RSSI_ENABLE: /* Fallthrough */ + *maxSemaphoreCount = 8U; + break; + default: + *maxSemaphoreCount = 1U; + break; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SharedResourceAcquire(adi_adrv904x_Device_t* const device, + const adrv904x_SharedResourceID_e sharedResourceID, + const adrv904x_FeatureID_e featureID, + uint8_t* resourceAcquistionStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + uint8_t sharedResourceAvailable = (uint8_t)ADI_FALSE; + adrv904x_FeatureID_e currentFeatureID = ADRV904X_FEATURE_UNUSED; + uint8_t maxSemaphoreCount = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check resourceAcquistionStatus pointer is not null */ + ADI_ADRV904X_NULL_PTR_RETURN(resourceAcquistionStatus); + + /*Range check that featureID is valid*/ + if (featureID >= ADRV904X_NUM_FEATURES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, featureID, "featureID is not valid"); + return recoveryAction; + } + + /*Range check that sharedResourceID is valid*/ + if (sharedResourceID >= ADRV904X_NUM_SHARED_RESOURCES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + sharedResourceID, + "sharedResourceID is not valid"); + return recoveryAction; + } + + /*Initialize resourceAcquistionStatus to false and set to true only if shared resource available*/ + *resourceAcquistionStatus = ADI_FAILURE; + + /*sharedResourceID check is done in Shared Resource Available function*/ + /*Acquire resource if it is not already acquired by another feature or already acquired by the requesting feature*/ + recoveryAction = adrv904x_SharedResourceAvailabilityCheck(device, + sharedResourceID, + &sharedResourceAvailable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + sharedResourceAvailable, + "Error while checking for shared resource availability"); + return recoveryAction; + } + + if (sharedResourceAvailable == ADI_TRUE) + { + device->devStateInfo.sharedResourcePool[sharedResourceID].featureID = (uint32_t)featureID; + device->devStateInfo.sharedResourcePool[sharedResourceID].semaphoreCount++; + *resourceAcquistionStatus = ADI_SUCCESS; + } + else + { + recoveryAction = adrv904x_SharedResourceFeatureGet(device, + sharedResourceID, + ¤tFeatureID); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + currentFeatureID, + "Error while acquiring shared resource feature"); + return recoveryAction; + } + + if (currentFeatureID == featureID) + { + recoveryAction = adrv904x_SharedResourceFeatureMaxSemaphoreCntGet(device, + featureID, + &maxSemaphoreCount); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + return recoveryAction; + } + + if (device->devStateInfo.sharedResourcePool[sharedResourceID].semaphoreCount < maxSemaphoreCount) + { + device->devStateInfo.sharedResourcePool[sharedResourceID].semaphoreCount++; + *resourceAcquistionStatus = ADI_SUCCESS; + } + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_SharedResourceRelease(adi_adrv904x_Device_t* const device, + const adrv904x_SharedResourceID_e sharedResourceID, + const adrv904x_FeatureID_e featureID, + uint8_t* const resourceReleaseStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + uint8_t sharedResourceAvailable = ADI_FALSE; + adrv904x_FeatureID_e currentFeatureID = ADRV904X_FEATURE_UNUSED; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check resourceReleaseStatus pointer is not null */ + ADI_ADRV904X_NULL_PTR_RETURN(resourceReleaseStatus); + + /*Range check that featureID is valid*/ + if (featureID >= ADRV904X_NUM_FEATURES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, featureID, "featureID is not valid"); + return recoveryAction; + } + + /*Range check that sharedResourceID is valid*/ + if (sharedResourceID >= ADRV904X_NUM_SHARED_RESOURCES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + sharedResourceID, + "sharedResourceID is not valid"); + return recoveryAction; + } + + /*Initialize resourceReleaseStatus to false and set to true only if shared resource is released successfully*/ + *resourceReleaseStatus = ADI_FAILURE; + + /*sharedResourceID check is done in Shared Resource Available function*/ + /*Release the shared resource only if the requested feature ID matches the current feature ID or is not in use currently*/ + recoveryAction = adrv904x_SharedResourceAvailabilityCheck(device, + sharedResourceID, + &sharedResourceAvailable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + sharedResourceAvailable, + "Error while checking for shared resource availability"); + return recoveryAction; + } + + if (sharedResourceAvailable == ADI_TRUE) + { + *resourceReleaseStatus = ADI_SUCCESS; + } + else + { + recoveryAction = adrv904x_SharedResourceFeatureGet(device, + sharedResourceID, + ¤tFeatureID); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + currentFeatureID, + "Error while acquiring shared resource feature"); + return recoveryAction; + } + + if (currentFeatureID == featureID) + { + if (device->devStateInfo.sharedResourcePool[sharedResourceID].semaphoreCount > 0) + { + device->devStateInfo.sharedResourcePool[sharedResourceID].semaphoreCount--; + } + + if (device->devStateInfo.sharedResourcePool[sharedResourceID].semaphoreCount == 0) + { + device->devStateInfo.sharedResourcePool[sharedResourceID].featureID = (uint32_t)ADRV904X_FEATURE_UNUSED; + } + + *resourceReleaseStatus = ADI_SUCCESS; + } + } + + return recoveryAction; +} diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_struct_endian.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_struct_endian.c new file mode 100644 index 00000000000..ded3d141cd2 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_struct_endian.c @@ -0,0 +1,114 @@ +#include "../../private/include/adrv904x_struct_endian.h" + +#include + +static float byteSwapFloat(float val) +{ + float retVal; + char *valAsCharArr = (char*) &val; + char *retValAsCharArr = (char*) &retVal; + + retValAsCharArr[0] = valAsCharArr[3]; + retValAsCharArr[1] = valAsCharArr[2]; + retValAsCharArr[2] = valAsCharArr[1]; + retValAsCharArr[3] = valAsCharArr[0]; + + return retVal; +} + +void adrv904x_CpuCmd_SerdesCalStatusGet_swap(struct adrv904x_CpuCmd_SerdesCalStatusGet* _struct) +{ + (void) _struct; + + /* _struct->lane << Field length is 1 byte no endianness swap required */ +} + + +void adrv904x_SerdesInitCalStatusCmdResp_swap(struct adrv904x_SerdesInitCalStatusCmdResp* _struct) +{ + (void) _struct; + + adrv904x_SerdesInitCalStatus_swap(&_struct->details); + + _struct->cpuErrorCode = ADRV904X_BYTESWAP_L(_struct->cpuErrorCode); +} + +void adrv904x_SerdesTrackingCalStatusCmdResp_swap(struct adrv904x_SerdesTrackingCalStatusCmdResp* _struct) +{ + (void) _struct; + + adrv904x_SerdesTrackingCalStatus_swap(&_struct->details); + + _struct->cpuErrorCode = ADRV904X_BYTESWAP_L(_struct->cpuErrorCode); +} + +void adrv904x_SerdesTrackingCalStatus_swap(struct adi_adrv904x_SerdesTrackingCalStatus* _struct) +{ + (void) _struct; + + _struct->temperature = ADRV904X_BYTESWAP_S(_struct->temperature); + + /* _struct->pd << Field length is 1 byte no endianness swap required */ + + /* _struct->dllPeakPd << Field length is 1 byte no endianness swap required */ + + /* _struct->dllPeakPdDelta << Field length is 1 byte no endianness swap required */ + + /* _struct->innerUp << Field length is 1 byte no endianness swap required */ + + /* _struct->innerDown << Field length is 1 byte no endianness swap required */ + + /* _struct->outerUp << Field length is 1 byte no endianness swap required */ + + /* _struct->outerDown << Field length is 1 byte no endianness swap required */ + + /* _struct->b << Field length is 1 byte no endianness swap required */ + + for(int i = 0; i < 2; i++) + { + _struct->ps[i] = byteSwapFloat(_struct->ps[i]); + } + + for(int i = 0; i < 16; i++) + { + _struct->yVector[i] = byteSwapFloat(_struct->yVector[i]); + } +} + +void adrv904x_SerdesInitCalStatus_swap(struct adi_adrv904x_SerdesInitCalStatus* _struct) +{ + (void) _struct; + + _struct->temperature = ADRV904X_BYTESWAP_S(_struct->temperature); + + /* _struct->lpfIndex << Field length is 1 byte no endianness swap required */ + + /* _struct->ctleIndex << Field length is 1 byte no endianness swap required */ + + /* _struct->numEyes << Field length is 1 byte no endianness swap required */ + + _struct->bsum = ADRV904X_BYTESWAP_S(_struct->bsum); + + _struct->bsum_dc = ADRV904X_BYTESWAP_S(_struct->bsum_dc); + + /* _struct->spoLeft << Field length is 1 byte no endianness swap required */ + + /* _struct->spoRight << Field length is 1 byte no endianness swap required */ + + _struct->eom = ADRV904X_BYTESWAP_S(_struct->eom); + + _struct->eomMax = ADRV904X_BYTESWAP_S(_struct->eomMax); + + /* _struct->pd << Field length is 1 byte no endianness swap required */ + + /* _struct->innerUp << Field length is 1 byte no endianness swap required */ + + /* _struct->innerDown << Field length is 1 byte no endianness swap required */ + + /* _struct->outerUp << Field length is 1 byte no endianness swap required */ + + /* _struct->outerDown << Field length is 1 byte no endianness swap required */ + + /* _struct->b << Field length is 1 byte no endianness swap required */ +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_tx.c b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_tx.c new file mode 100644 index 00000000000..f0ea467c1c5 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/private/src/adrv904x_tx.c @@ -0,0 +1,1187 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adrv904x_tx.c +* +* ADRV904X API Version: 2.10.0.4 +*/ +#include "../../private/include/adrv904x_tx.h" +#include "../../private/bf/adrv904x_bf_pll_mem_map.h" +#include "../../private/include/adrv904x_cpu.h" + +#include "adi_adrv904x_tx_types.h" +#include "adi_adrv904x_tx.h" + + +#include "../../private/bf/adrv904x_bf_cduc_hb_dpath.h" +#include "../../private/bf/adrv904x_bf_tx_dpd_act_mmr.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PRIVATE_TX + +ADI_API uint32_t adrv904x_txAttenAddrLookup(const adi_adrv904x_TxChannels_e txChannel) +{ + uint32_t retval = 0U; + + switch (txChannel) + { + case ADI_ADRV904X_TX0: + retval = ADRV904X_ADDR_TX0_ATTEN_TABLE; + break; + + case ADI_ADRV904X_TX1: + retval = ADRV904X_ADDR_TX1_ATTEN_TABLE; + break; + + case ADI_ADRV904X_TX2: + retval = ADRV904X_ADDR_TX2_ATTEN_TABLE; + break; + + case ADI_ADRV904X_TX3: + retval = ADRV904X_ADDR_TX3_ATTEN_TABLE; + break; + + case ADI_ADRV904X_TX4: + retval = ADRV904X_ADDR_TX4_ATTEN_TABLE; + break; + + case ADI_ADRV904X_TX5: + retval = ADRV904X_ADDR_TX5_ATTEN_TABLE; + break; + + case ADI_ADRV904X_TX6: + retval = ADRV904X_ADDR_TX6_ATTEN_TABLE; + break; + + case ADI_ADRV904X_TX7: + retval = ADRV904X_ADDR_TX7_ATTEN_TABLE; + break; + + default: + retval = 0U; + break; + } + + return retval; +} + +ADI_API uint8_t adrv904x_TxChannelsToId(const adi_adrv904x_TxChannels_e txChannel) +{ + switch (txChannel) + { + case ADI_ADRV904X_TX0: + return 0; + break; + + case ADI_ADRV904X_TX1: + return 1; + break; + + case ADI_ADRV904X_TX2: + return 2; + break; + + case ADI_ADRV904X_TX3: + return 3; + break; + + case ADI_ADRV904X_TX4: + return 4; + break; + + case ADI_ADRV904X_TX5: + return 5; + break; + + case ADI_ADRV904X_TX6: + return 6; + break; + + case ADI_ADRV904X_TX7: + return 7; + break; + + default: + return ADI_ADRV904X_TX_CHAN_ID_MAX + 1; + break; + } +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adrv904x_BfTxChanAddr_e* const txChannelBitfieldAddr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check tx bitfield channel address pointer is not null */ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, txChannelBitfieldAddr); + + if (((device->devStateInfo.initializedChannels >> ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET) & (uint32_t)txChannel) == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + device->devStateInfo.initializedChannels, + "Selected Tx channel is not initialized for this device."); + return recoveryAction; + } + + switch (txChannel) + { + case ADI_ADRV904X_TX0: + *txChannelBitfieldAddr = ADRV904X_BF_TX_CH0; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + + case ADI_ADRV904X_TX1: + *txChannelBitfieldAddr = ADRV904X_BF_TX_CH1; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + + case ADI_ADRV904X_TX2: + *txChannelBitfieldAddr = ADRV904X_BF_TX_CH2; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + + case ADI_ADRV904X_TX3: + *txChannelBitfieldAddr = ADRV904X_BF_TX_CH3; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + + case ADI_ADRV904X_TX4: + *txChannelBitfieldAddr = ADRV904X_BF_TX_CH4; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + + case ADI_ADRV904X_TX5: + *txChannelBitfieldAddr = ADRV904X_BF_TX_CH5; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + + case ADI_ADRV904X_TX6: + *txChannelBitfieldAddr = ADRV904X_BF_TX_CH6; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + + case ADI_ADRV904X_TX7: + *txChannelBitfieldAddr = ADRV904X_BF_TX_CH7; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + txChannel, + "Invalid txChannel parameter for adrv904x_TxBitfieldAddressGet() function"); + return recoveryAction; + break; + + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxFuncsBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adrv904x_BfTxFuncsChanAddr_e* const txFuncsChannelBitfieldAddr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check rx bitfield channel address pointer is not null */ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, txFuncsChannelBitfieldAddr); + + if (((device->devStateInfo.initializedChannels >> ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET) & (uint32_t)txChannel) == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + device->devStateInfo.initializedChannels, + "Selected Tx channel is not initialized for this device."); + return recoveryAction; + } + + switch (txChannel) + { + case ADI_ADRV904X_TX0: + *txFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_0__TX_FUNCS; + break; + + case ADI_ADRV904X_TX1: + *txFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_1__TX_FUNCS; + break; + + case ADI_ADRV904X_TX2: + *txFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_2__TX_FUNCS; + break; + case ADI_ADRV904X_TX3: + *txFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_3__TX_FUNCS; + break; + + case ADI_ADRV904X_TX4: + *txFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_4__TX_FUNCS; + break; + + case ADI_ADRV904X_TX5: + *txFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_5__TX_FUNCS; + break; + + case ADI_ADRV904X_TX6: + *txFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_6__TX_FUNCS; + break; + + case ADI_ADRV904X_TX7: + *txFuncsChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_7__TX_FUNCS; + break; + + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txChannel, + "Invalid txChannel parameter "); + return recoveryAction; + } + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDigBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adrv904x_BfTxDigChanAddr_e* const txDigChannelBitfieldAddr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check rx bitfield channel address pointer is not null */ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, txDigChannelBitfieldAddr); + + if (((device->devStateInfo.initializedChannels >> ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET) & (uint32_t)txChannel) == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + device->devStateInfo.initializedChannels, + "Selected Tx channel is not initialized for this device."); + return recoveryAction; + } + + switch (txChannel) + { + case ADI_ADRV904X_TX0: + *txDigChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_0__TX_DIG; + break; + + case ADI_ADRV904X_TX1: + *txDigChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_1__TX_DIG; + break; + + case ADI_ADRV904X_TX2: + *txDigChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_2__TX_DIG; + break; + case ADI_ADRV904X_TX3: + *txDigChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_3__TX_DIG; + break; + + case ADI_ADRV904X_TX4: + *txDigChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_4__TX_DIG; + break; + + case ADI_ADRV904X_TX5: + *txDigChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_5__TX_DIG; + break; + + case ADI_ADRV904X_TX6: + *txDigChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_6__TX_DIG; + break; + + case ADI_ADRV904X_TX7: + *txDigChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_7__TX_DIG; + break; + + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txChannel, + "Invalid txChannel parameter "); + return recoveryAction; + } + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxPowerMonitorCfgRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_PowerMonitorCfg_t * const txPowerMonitorCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check txPowerMonitorCfg address pointer is not null */ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, txPowerMonitorCfg); + + + /* Valid ranges for the pa protection configuration values */ + static const uint8_t MEAS_DURATION_MAX = 0x0FU; + static const uint8_t PEAK_COUNT_MAX = 0x3FU; + static const uint8_t SINGLE_BIT_MAX = 0x01U; + + if (txPowerMonitorCfg->measDuration > MEAS_DURATION_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + txPowerMonitorCfg->measDuration, + "Average/Peak duration exceeds maximum limit. Valid range 0-15"); + return recoveryAction; + } + + if (txPowerMonitorCfg->peakCount > PEAK_COUNT_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + txPowerMonitorCfg->peakCount, + "Peak count exceeds maximum limit. Valid range 0-63"); + return recoveryAction; + } + + + if (txPowerMonitorCfg->avgPowerEnable > SINGLE_BIT_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + txPowerMonitorCfg->avgPowerEnable, + "Avg power enable value is invalid. Valid values 0-1"); + return recoveryAction; + } + + if (txPowerMonitorCfg->peakPowerEnable > SINGLE_BIT_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + txPowerMonitorCfg->peakPowerEnable, + "Peak power enable value is invalid. Valid values 0-1"); + return recoveryAction; + } + + if (txPowerMonitorCfg->avgPeakRatioEnable > SINGLE_BIT_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + txPowerMonitorCfg->avgPeakRatioEnable, + "Avg Peak power ratio enable value is invalid. Valid values 0-1"); + return recoveryAction; + } + + if (txPowerMonitorCfg->peakErrorClearRequired > SINGLE_BIT_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + txPowerMonitorCfg->peakErrorClearRequired, + "Peak error cleared required selection is invalid. Valid values 0-1"); + return recoveryAction; + } + + if (txPowerMonitorCfg->peakPowerIrqEnable > SINGLE_BIT_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + txPowerMonitorCfg->peakPowerIrqEnable, + "Peak power irq enable value is invalid. Valid values 0-1"); + return recoveryAction; + } + + if (txPowerMonitorCfg->avgErrorClearRequired > SINGLE_BIT_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + txPowerMonitorCfg->avgErrorClearRequired, + "Avg error cleared required selection is invalid. Valid values 0-1"); + return recoveryAction; + } + + if (txPowerMonitorCfg->avgPowerIrqEnable > SINGLE_BIT_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + txPowerMonitorCfg->avgPowerIrqEnable, + "Avg power irq enabled value is invalid. Valid values 0-1"); + return recoveryAction; + } + + if (txPowerMonitorCfg->inputSel > ADI_ADRV904X_TXQEC_ACTUATOR_OUTPUT) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + txPowerMonitorCfg->inputSel, + "Power monitor input selection is invalid. Valid selections are COMPLEX_MULT_OUTPUT and TXQEC_ACTUATOR_OUTPUT"); + return recoveryAction; + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxSlewRateDetectorCfgRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_SlewRateDetectorCfg_t * const txSlewRateDetectorCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check txSlewRateDetectorCfg address pointer is not null */ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, txSlewRateDetectorCfg); + + /* Valid ranges for the srd configuration values */ + static const uint8_t SINGLE_BIT_MAX = 0x01U; + static const uint8_t ARV_MAX_WAIT_TIME = 15U; + + ADI_FUNCTION_ENTRY_LOG(&device->common, + ADI_HAL_LOG_API_PRIV); + + if (txSlewRateDetectorCfg->inputSel > ADI_ADRV904X_TXQEC_ACTUATOR_OUTPUT) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txSlewRateDetectorCfg->inputSel, + "Input selection should be either HB1 Output or TXQEC Actuator Output"); + return recoveryAction; + } + + if (txSlewRateDetectorCfg->srdEnable > SINGLE_BIT_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txSlewRateDetectorCfg->srdEnable, + "srdEnable value is invalid. Valid values 0-1"); + return recoveryAction; + } + + if (txSlewRateDetectorCfg->srdIrqEnable > SINGLE_BIT_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txSlewRateDetectorCfg->srdIrqEnable, + "srdIrqEnable value is invalid. Valid values 0-1"); + return recoveryAction; + } + + if (txSlewRateDetectorCfg->autoRecoveryWaitTime > ARV_MAX_WAIT_TIME) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txSlewRateDetectorCfg->autoRecoveryWaitTime, + "autoRecoveryWaitTime value is invalid. Valid range [0-15]"); + return recoveryAction; + } + + if (txSlewRateDetectorCfg->autoRecoveryEnable > SINGLE_BIT_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txSlewRateDetectorCfg->autoRecoveryEnable, + "autoRecoveryEnable value is invalid. Valid values 0-1"); + return recoveryAction; + } + + if (txSlewRateDetectorCfg->autoRecoveryDisableTimerWhenTxOff > SINGLE_BIT_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txSlewRateDetectorCfg->autoRecoveryDisableTimerWhenTxOff, + "autoRecoveryDisableTimerWhenTxOff value is invalid. Valid values 0-1"); + return recoveryAction; + } + + if (txSlewRateDetectorCfg->srdStatisticsEnable > SINGLE_BIT_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txSlewRateDetectorCfg->srdStatisticsEnable, + "srdStatisticsEnable value is invalid. Valid values 0-1"); + return recoveryAction; + } + + if (txSlewRateDetectorCfg->srdStatisticsMode > SINGLE_BIT_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txSlewRateDetectorCfg->srdStatisticsMode, + "srdStatisticsMode value is invalid. Valid values 0-1"); + return recoveryAction; + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxLoSourceGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_LoSel_e* const txLoSource) +{ + static const uint8_t TX_LO_CURRENT_MASK = 0x01U; + uint8_t rxtxLoMuxReg = 0U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check txPowerMonitorCfg address pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, txLoSource); + + if ((txChannel == ADI_ADRV904X_TX0) || + (txChannel == ADI_ADRV904X_TX1) || + (txChannel == ADI_ADRV904X_TX2) || + (txChannel == ADI_ADRV904X_TX3)) + { + /*Read the Tx Lo Mux reg from the east side of the chip */ + recoveryAction = adrv904x_PllMemMap_SelTxLo_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_EAST_RFPLL, + &rxtxLoMuxReg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE ) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to retrieve Rx Lo Selection."); + return recoveryAction; + } + + /*For East Side, 1 = LO0, 0 = LO1*/ + if ((rxtxLoMuxReg & TX_LO_CURRENT_MASK) == TX_LO_CURRENT_MASK) + { + *txLoSource = ADI_ADRV904X_LOSEL_LO0; + } + else + { + *txLoSource = ADI_ADRV904X_LOSEL_LO1; + } + } + else if ((txChannel == ADI_ADRV904X_TX4) || + (txChannel == ADI_ADRV904X_TX5) || + (txChannel == ADI_ADRV904X_TX6) || + (txChannel == ADI_ADRV904X_TX7)) + { + /*Read the Tx Lo Mux reg from the west side of the chip */ + recoveryAction = adrv904x_PllMemMap_SelTxLo_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_WEST_RFPLL, + &rxtxLoMuxReg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "PllMemMap_SelTxLo_Bfget issue"); + return recoveryAction; + } + + /*For West Side, 1 = LO1, 0 = LO0*/ + if ((rxtxLoMuxReg & TX_LO_CURRENT_MASK) == TX_LO_CURRENT_MASK) + { + *txLoSource = ADI_ADRV904X_LOSEL_LO1; + } + else + { + *txLoSource = ADI_ADRV904X_LOSEL_LO0; + } + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannel, "Invalid Tx Channel parameter. Valid Tx channel must be Tx0-Tx7"); + return recoveryAction; + } + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDecPowerCfgRangeCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxDecimatedPowerCfg_t* const decPowerCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, decPowerCfg); + + static const uint8_t ENABLE_MAX = 1U; + static const uint8_t MAX_POWER_INPUT_SELECT = 3U; + static const uint8_t MAX_MEASUREMENT_DURATION_AX = 24U; + static const uint8_t MAX_MEASUREMENT_DURATION_B0 = 25U; + + uint8_t deviceRev = 0U; + + if (((decPowerCfg->txChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (decPowerCfg->txChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + decPowerCfg->txChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + if (decPowerCfg->measurementEnable > ENABLE_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + decPowerCfg->measurementEnable, + "Invalid measurementEnable selection."); + return recoveryAction; + } + + if (decPowerCfg->powerInputSelect > MAX_POWER_INPUT_SELECT) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + decPowerCfg->powerInputSelect, + "Invalid powerInputSelect selection."); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_DeviceRevGet(device, &deviceRev); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Unable to extract device Revision"); + return recoveryAction; + } + if (deviceRev >= 0xB0) + { + if (decPowerCfg->powerMeasurementDuration > MAX_MEASUREMENT_DURATION_B0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + decPowerCfg->powerMeasurementDuration, + "Invalid powerMeasurementDuration selection."); + return recoveryAction; + } + } + else if ((deviceRev & 0xA0) == 0xA0) + { + if (decPowerCfg->powerMeasurementDuration > MAX_MEASUREMENT_DURATION_AX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + decPowerCfg->powerMeasurementDuration, + "Invalid powerMeasurementDuration selection."); + return recoveryAction; + } + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + deviceRev, + "Invalid device revision."); + return recoveryAction; + } + + + if (decPowerCfg->peakToPowerMode > ENABLE_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + decPowerCfg->peakToPowerMode, + "Invalid peakToPowerMode selection."); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_ValidateMask(uint32_t maskVal, uint8_t allowOnlyOne) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + if (allowOnlyOne) + { + if ((maskVal == 0) || /* mask is 0 */ + ((maskVal & (maskVal - 1)) != 0)) /* more than 1 bit is set */ + { + /* multiple bits selected */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + } + } + else /* Any combination of bits allowed except for 0 */ + { + if (maskVal == 0u) + { + /* no bits selected */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxBandDuc0BitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adrv904x_BfTxBandDucChanAddr_e* const txBandDucChannelBitfieldAddr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check tx bitfield channel address pointer is not null */ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, txBandDucChannelBitfieldAddr); + + if (((device->devStateInfo.initializedChannels >> ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET) & (uint32_t)txChannel) == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + device->devStateInfo.initializedChannels, + "Selected Tx channel is not initialized for this device."); + return recoveryAction; + } + + switch (txChannel) + { + case ADI_ADRV904X_TX0: + *txBandDucChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_0__TX_BAND_DUC0; + break; + + case ADI_ADRV904X_TX1: + *txBandDucChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_1__TX_BAND_DUC0; + break; + + case ADI_ADRV904X_TX2: + *txBandDucChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_2__TX_BAND_DUC0; + break; + case ADI_ADRV904X_TX3: + *txBandDucChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_3__TX_BAND_DUC0; + break; + + case ADI_ADRV904X_TX4: + *txBandDucChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_4__TX_BAND_DUC0; + break; + + case ADI_ADRV904X_TX5: + *txBandDucChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_5__TX_BAND_DUC0; + break; + + case ADI_ADRV904X_TX6: + *txBandDucChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_6__TX_BAND_DUC0; + break; + + case ADI_ADRV904X_TX7: + *txBandDucChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_7__TX_BAND_DUC0; + break; + + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txChannel, + "Invalid txChannel parameter "); + return recoveryAction; + } + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxBandDuc1BitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adrv904x_BfTxBandDucChanAddr_e* const txBandDucChannelBitfieldAddr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check tx bitfield channel address pointer is not null */ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, txBandDucChannelBitfieldAddr); + + if (((device->devStateInfo.initializedChannels >> ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET) & (uint32_t)txChannel) == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + device->devStateInfo.initializedChannels, + "Selected Tx channel is not initialized for this device."); + return recoveryAction; + } + + switch (txChannel) + { + case ADI_ADRV904X_TX0: + *txBandDucChannelBitfieldAddr = (adrv904x_BfTxBandDucChanAddr_e)0x60850000; + break; + + case ADI_ADRV904X_TX1: + *txBandDucChannelBitfieldAddr = (adrv904x_BfTxBandDucChanAddr_e)0x60950000; + break; + + case ADI_ADRV904X_TX2: + *txBandDucChannelBitfieldAddr = (adrv904x_BfTxBandDucChanAddr_e)0x60A50000; + break; + case ADI_ADRV904X_TX3: + *txBandDucChannelBitfieldAddr = (adrv904x_BfTxBandDucChanAddr_e)0x60B50000; + break; + + case ADI_ADRV904X_TX4: + *txBandDucChannelBitfieldAddr = (adrv904x_BfTxBandDucChanAddr_e)0x60C50000; + break; + + case ADI_ADRV904X_TX5: + *txBandDucChannelBitfieldAddr = (adrv904x_BfTxBandDucChanAddr_e)0x60D50000; + break; + + case ADI_ADRV904X_TX6: + *txBandDucChannelBitfieldAddr = (adrv904x_BfTxBandDucChanAddr_e)0x60E50000; + break; + + case ADI_ADRV904X_TX7: + *txBandDucChannelBitfieldAddr = (adrv904x_BfTxBandDucChanAddr_e)0x60F50000; + break; + + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txChannel, + "Invalid txChannel parameter "); + return recoveryAction; + } + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxCducCarrierCheck(adi_adrv904x_Device_t* const device, + const uint8_t chanSelect, + const uint8_t carrierSelect) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t idx = 0U; + uint8_t bfValue = 0U; + uint32_t cducBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH; + uint32_t stride = ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH - ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Scan through each channel to validate the carrier mask */ + for (idx = 0u; idx < ADRV904X_NUM_TXRX_CHAN; idx++) + { + if (chanSelect & (1u << idx)) + { + cducBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH + (idx * stride); + bfValue = 0U; + recoveryAction = adrv904x_CducHbDpath_CducCarrierEnable_BfGet(device, + NULL, + (adrv904x_BfCducHbDpathChanAddr_e)cducBaseAddr, + &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting enabled carriers"); + return recoveryAction; + } + + if ((carrierSelect & (uint32_t)bfValue) == 0x0u) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "requested carrier mask contains unsupported carriers"); + return recoveryAction; + } + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_TxDfeDigBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adrv904x_BfTxDfeDigRegsChanAddr_e* const txDfeDigChannelBitfieldAddr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check rx bitfield channel address pointer is not null */ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, txDfeDigChannelBitfieldAddr); + + if (((device->devStateInfo.initializedChannels >> ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET) & (uint32_t)txChannel) == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + device->devStateInfo.initializedChannels, + "Selected Tx channel is not initialized for this device."); + return recoveryAction; + } + + switch (txChannel) + { + case ADI_ADRV904X_TX0: + *txDfeDigChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DFE_DIG_REGS; + break; + + case ADI_ADRV904X_TX1: + *txDfeDigChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_DFE_DIG_REGS; + break; + + case ADI_ADRV904X_TX2: + *txDfeDigChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_DFE_DIG_REGS; + break; + + case ADI_ADRV904X_TX3: + *txDfeDigChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_DFE_DIG_REGS; + break; + + case ADI_ADRV904X_TX4: + *txDfeDigChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_DFE_DIG_REGS; + break; + + case ADI_ADRV904X_TX5: + *txDfeDigChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_DFE_DIG_REGS; + break; + + case ADI_ADRV904X_TX6: + *txDfeDigChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_DFE_DIG_REGS; + break; + + case ADI_ADRV904X_TX7: + *txDfeDigChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_DFE_DIG_REGS; + break; + + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txChannel, + "Invalid txChannel parameter "); + return recoveryAction; + } + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_CducHbDpathBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChan, + adrv904x_BfCducHbDpathChanAddr_e* const cducHbDpathChannelBitfieldAddr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check cduc bitfield channel address pointer is not null */ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cducHbDpathChannelBitfieldAddr); + + if (((device->devStateInfo.initializedChannels >> ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET) & (uint32_t)txChan) == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + NULL, + "Channel not in device initializedChannels for adrv904x_CducHbDpathBitfieldAddressGet() function"); + return recoveryAction; + } + + switch (txChan) + { + case ADI_ADRV904X_TX0: + *cducHbDpathChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH; + break; + + case ADI_ADRV904X_TX1: + *cducHbDpathChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_1__TX_CDUC_TX_CDUC_HB_DPATH; + break; + + case ADI_ADRV904X_TX2: + *cducHbDpathChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_2__TX_CDUC_TX_CDUC_HB_DPATH; + break; + + case ADI_ADRV904X_TX3: + *cducHbDpathChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_3__TX_CDUC_TX_CDUC_HB_DPATH; + break; + + case ADI_ADRV904X_TX4: + *cducHbDpathChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_4__TX_CDUC_TX_CDUC_HB_DPATH; + break; + + case ADI_ADRV904X_TX5: + *cducHbDpathChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_5__TX_CDUC_TX_CDUC_HB_DPATH; + break; + + case ADI_ADRV904X_TX6: + *cducHbDpathChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_6__TX_CDUC_TX_CDUC_HB_DPATH; + break; + + case ADI_ADRV904X_TX7: + *cducHbDpathChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_7__TX_CDUC_TX_CDUC_HB_DPATH; + break; + + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txChan, + "Invalid txChan parameter "); + return recoveryAction; + } + break; + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_DpdActMmrBitfieldAddressGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChan, + adrv904x_BfTxDpdActMmrChanAddr_e* const dpdActMmrChannelBitfieldAddr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Check cduc bitfield channel address pointer is not null */ + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, dpdActMmrChannelBitfieldAddr); + + if (((device->devStateInfo.initializedChannels >> ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET) & (uint32_t)txChan) == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + NULL, + "Channel not in device initializedChannels for adrv904x_DpdActMmrBitfieldAddressGet() function"); + return recoveryAction; + } + + switch (txChan) + { + case ADI_ADRV904X_TX0: + *dpdActMmrChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DPD_ACT_MMR; + break; + + case ADI_ADRV904X_TX1: + *dpdActMmrChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_DPD_ACT_MMR; + break; + + case ADI_ADRV904X_TX2: + *dpdActMmrChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_DPD_ACT_MMR; + break; + + case ADI_ADRV904X_TX3: + *dpdActMmrChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_DPD_ACT_MMR; + break; + + case ADI_ADRV904X_TX4: + *dpdActMmrChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_DPD_ACT_MMR; + break; + + case ADI_ADRV904X_TX5: + *dpdActMmrChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_DPD_ACT_MMR; + break; + + case ADI_ADRV904X_TX6: + *dpdActMmrChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_DPD_ACT_MMR; + break; + + case ADI_ADRV904X_TX7: + *dpdActMmrChannelBitfieldAddr = ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_DPD_ACT_MMR; + break; + + default: + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txChan, + "Invalid txChan parameter "); + return recoveryAction; + } + break; + + } + + /* No error, set recovery outside switch statement to save code */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_agc.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_agc.h new file mode 100644 index 00000000000..8a2a3c68e06 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_agc.h @@ -0,0 +1,578 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adi_adrv904x_agc.h + * \brief Contains ADRV904X receive related function prototypes for + * adi_adrv904x_agc.c + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADI_ADRV904X_AGC_H_ +#define _ADI_ADRV904X_AGC_H_ + +#include "adi_adrv904x_agc_types.h" +#include "adi_adrv904x_error.h" + + +/** +* \brief Function to configure AGC block. +* +* Rx AGC block allows the receive path to control the gain automatically based on feedback from a number +* of signal detectors. There are 2 types of triggers that can be used for automatic Rx gain control. +* Peak detectors (ADC overload detector and HB2 peak detector) and power detector (decimated power +* measurement block). These triggers can be configured to be used to adjust Rx gain automatically. +* +* ADC overload detector has a configurable low threshold. +* +* HB2 peak detector has a high threshold and 3 low thresholds. The highest low threshold is used in all conditions. +* The other two low thresholds can only be used when fast recovery is enabled (agcConfig.agcEnableFastRecoveryLoop). +* +* All peak detector thresholds have an exceeded peak counter (to trigger a gain change) and gain step +* sizes (configuring how much the gain will be increased/decreased). Additionally, HB2 peak detectors have +* a common duration (agcConfig.agcPeak.hb2OverloadDurationCount) and a threshold +* count (agcConfig.agcPeak.hb2OverloadThreshCount). At least an hb2OverloadThreshCount number of individual samples +* within a batch of hb2OverloadDurationCount samples must exceed an HB2 threshold to increment that threshold's peak +* counter. This is to avoid counting a single peak multiple times due to high sample rates before decimations in the +* digital datapath. +* +* Decimated power measurements can be used by AGC to control the gain in Rx datapath. Decimated power measurement block +* in main signal path is being used for this purpose. These measurements are also available for user readback. +* Power measurements have 4 configurable thresholds and gain steps associated with these thresholds. +* Please see agcConfig.agcPower structure for details. +* +* Note: The function does not check for duplicated channel assignments across cfg structures. +* Invalid channel mask values will return an error. + +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] agcConfig array of structures of type adi_adrv904x_ AgcCfg_t which will configure one or more channels +* \param[in] numOfAgcCfgs number of configurations passed in the array +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcCfgSet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_AgcCfg_t agcConfig[], + const uint32_t numOfAgcCfgs); + +/** +* \brief This function reads AGC configuration of selected Rx channel + +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] rxChannel Rx channel selection to read AGC config from +* \param[out] agcConfigReadBack Pointer to structure which will be used to read configuration +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcCfgGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_AgcCfg_t * const agcConfigReadBack); + +/** +* \brief Halt the AGC loop which freezes the AGC gain index at it's current value. +* +* Can freeze or unfreeze multiple channels in a single call. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] rxChannelMask Bit0 (lsb) relates to Rx0, bit1 to Rx1 etc. If the bit for an +* Rx channel is not set then that channel is not affected by the call. +* \param[in] freezeEnable Bit0 (lsb) relates to Rx0, bit1 to Rx1 etc. If the channel's bit in +* rxChannelMask is set then if the channel's bit in freezeEnable is set the AGC loop for +* the channel is frozen, if the bit is clear then the AGC loop is set to run. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcFreezeSet(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const uint32_t freezeEnable); + +/** +* \brief Get the AGC freeze status for all Rx channels. +* +* This status only applied to Rx channels whose AGC loop is halted by AgcFreezeSet function not +* those which have been halted by GPIO. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[out] freezeEnable Bit0 (lsb) relates to Rx0, bit1 to Rx1 etc. If the channel's AGC +* loop is halted by AgcFreezeSet then it's bit is set in freezeEnable. Otherwise it is +* cleared. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcFreezeGet(adi_adrv904x_Device_t* const device, + uint32_t* const freezeEnable); + +/** +* \brief Allow AGC loop to run or be halted by a GPIO signal. +* +* A rising edge on the selected digital GPIO will cause the AGC loop to halt thereby fixing the +* AGC index until such time as there is a falling edge, upon which the AGC loop will continue it's +* normal operation. +* +* It is not possible to control an Rx AGC loop using GPIO_0. It is possible to control the AGC +* loop of serveral channels from a single GPIO. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] rxChannels Rx channels +* \param[in] gpioPin The digital GPIO to be used to control AGC loop. +* \param[in] enable Set to ADI_TRUE to setup AGC control by gpioPin for the channels specifed +* in rxChannels. Set to ADI_FALSE to disable AGC control by GPIO. gpioPin value as no effect +* in this case. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcFreezeOnGpioSet(adi_adrv904x_Device_t* const device, + const uint32_t rxChannels, + const adi_adrv904x_GpioPinSel_e gpioPin, + const uint8_t enable); + +/** +* \brief Get the GPIO signal, if any, configured to halt an Rx channel's AGC loop. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] rxChannel The Rx channel whose configuration to get. +* \param[out] gpioPin Is set to the digital GPIO being used to control AGC loop or to ADI_ADRV904X_GPIO_00 +* if AGC loop is not being controlled by any GPIO. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcFreezeOnGpioGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_GpioPinSel_e* const gpioPin); + +/** +* \brief Function to configure min/max gain indices allowed for AGC operation +* +* Min/Max gain indices can also be set with adi_adrv904x_AgcCfgSet() function. +* This function allows user to update min/max gain indices without configuring other AGC related parameters. +* Note: The function does not check for duplicated channel assignments across cfg structures. + Invalid channel mask values will return an error. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] agcGainRange array of structures of type adi_adrv904x_ AgcGainRange _t which will configure one or more channels +* \param[in] numOfAgcRangeCfgs number of configurations passed in the array +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcGainIndexRangeSet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_AgcGainRange_t agcGainRange[], + const uint32_t numOfAgcRangeCfgs); + +/** +* \brief Function to read AGC Gain range for selected channel +* +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] rxChannel Rx channel selection to read AGC gain range configuration +* \param[out] agcGainConfigReadback Pointer to gain range structure to be used to read back configuration +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcGainIndexRangeGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_AgcGainRange_t * const agcGainConfigReadback); + + +/** +* \brief Function to reset all AGC state machines and peak detector counters for selected channel/s +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] rxChannelMask Mask to select Rx channel/s of which AGC block will be reset +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcReset(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask); + + +/** +* \brief Programs the gain table settings for dual band external LNA output of selected Rx channels. +* +* +* Dual band LNA gain table has 4 rows to be programmed. User can program all 4 entries or +* a subset of it with this API function. +* +* For single GPIO (per band) mode, user can configure only first 2 rows of the gain table. +* This mode can be enabled with setting adi_adrv904x_AgcDualBandCfg_t->agcDualBandMaxGainIndex = 1 +* For 2 GPIO(per band), user should configure the gain table entries up to (including) +* adi_adrv904x_AgcDualBandCfg_t->agcDualBandMaxGainIndex. +* The gain table configs can be broadcast / multicast based on the channel mask +* parameter, rxChannelMask +* +*| rxChannelMask | Rx Channels Programmed | +*|:------------------------------------:|:-------------------------------------:| +*| bit[0] = 1 | Enables Rx0 gain table programming---| +*| bit[1] = 1 | Enables Rx1 gain table programming---| +*| bit[2] = 1 | Enables Rx2 gain table programming---| +*| bit[3] = 1 | Enables Rx3 gain table programming---| +*| bit[4] = 1 | Enables Rx4 gain table programming---| +*| bit[5] = 1 | Enables Rx5 gain table programming---| +*| bit[6] = 1 | Enables Rx6 gain table programming---| +*| bit[7] = 1 | Enables Rx7 gain table programming---| +* +* Eg: To program the same gain table to channels Rx0 and Rx4, the rxChannelMask +* should be set to 0x00000011 +* +* Eg: To program a single gain table to all channels, the rxChannelMask +* should be set to 0x000000FF +* +* Partial gain table loads can be done through this API. User can select gainIndexOffset and arraySize +* accordingly to write a partial table. This API writes 'arraySize' number of rows +* up to row 'gainIndexOffset'. For example, when gainIndexOffset=3 and arraySize=2, API loads gainTableRow[0] +* to row 2 and gainTableRow[1] to row 3. +* +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in,out] device Context variable - Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] rxChannelMask is the set of channels for which current gain table settings are to be programmed. +* Valid Rx channels include Rx0-Rx7 +* \param[in] gainIndexOffset is the starting gain index from which gain table is programmed (backwards direction). Maximum value is 3. +* \param[in] gainTableRow Array of gain table row entries for programming +* \param[in] arraySize is the number of gain table rows to be programmed. Maximum value is 4 +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxDualBandLnaGainTableWrite(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const uint8_t gainIndexOffset, + const adi_adrv904x_RxDualBandLnaGainTableRow_t gainTableRow[], + const uint32_t arraySize); + +/** +* \brief Reads the dual band external LNA gain table entries for Rx channels requested. +* +* This function can be called by the user to read back the currently programmed gain table +* for a given channel. This function reads the current gain table settings from ADRV904X gain table Static RAMs +* for the requested channel and stores it in the provided memory reference of type adi_adrv904x_RxDualBandLnaGainTableRow_t +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in,out] device Context variable - Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] rxChannelMask represents the channels for which gain table read back is requested. +* Valid Rx channels include Rx0-Rx7. Multiple channel selections are not allowed. +* \param[in] gainIndexOffset is the gain index from which gain table read back should start(backwards direction) +* \param[in,out] gainTableRow Read back array for gain table row entries which will be updated with the read back values +* \param[in] arraySize is the size of gainTableRow array. It is also the upper limit for the no. of gain indices to read +* \param[out] numGainIndicesRead is the actual no. of gain indices read from SRAM (output). A NULL can be passed +* if the value of no. of gain indices actually read is not required. +* +* \pre This function can be called by the user anytime after initialization. This API reads 'arraySize' number of rows +* up to row 'gainIndexOffset' row. For example when gainIndexOffset=3 and arraySize=2, API reads row 2 to gainTableRow[0] +* and row 3 to gainTableRow[1]. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxDualBandLnaGainTableRead(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const uint8_t gainIndexOffset, + adi_adrv904x_RxDualBandLnaGainTableRow_t gainTableRow[], + const uint32_t arraySize, + uint8_t* const numGainIndicesRead); + + +/** +* \brief Function to configure AGC Dual Band block. +* +* Rx Dual band AGC block allows the receive path to control external LNAs for Band A and Band B. +* 16 Analog GPIO pins can be used for this purpose. Each band can use 1 GPIO pin when 8 receivers +* are being used. Each band can use 2 GPIO pins when 4 receivers are being used. These GPIOs can be +* configured with adi_adrv904x_AgcDualBandGpioCfgSet function. +* A special gain table needs to be written for dual band AGC functionality by using adi_adrv904x_RxDualBandLnaGainTableWrite. +* This table has 4 rows, each having 2 bit external LNA control words to control 2 GPIOs at maximum. +* +* For dual band AGC, AGC block should also be configured and running with main path decimated power level detector +* enabled. +* +* +* Note: The function does not check for duplicated channel assignments across cfg structures. +* Invalid channel mask values will return an error. + +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] agcDualBandConfig array of structures of type adi_adrv904x_AgcDualBandCfg_t which will configure one or more channels +* \param[in] numOfAgcDualBandCfgs number of configurations passed in the array +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcDualBandCfgSet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_AgcDualBandCfg_t agcDualBandConfig[], + const uint32_t numOfAgcDualBandCfgs); + +/** +* \brief This function reads AGC dual band configuration of selected Rx channel +* Rx channel requested should be selected with adi_adrv904x_AgcDualBandCfg_t->rxChannelMask. +* Multiple channel selection isn't allowed + +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in,out] agcDualBandConfigReadBack Pointer to structure which will be used to read configuration +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcDualBandCfgGet(adi_adrv904x_Device_t * const device, + adi_adrv904x_AgcDualBandCfg_t * const agcDualBandConfigReadBack); + + +/** +* \brief Function to configure AGC Dual Band GPIO mapping. +* +* 16 analog GPIOs can be mapped to various external lna outputs as follows, +* +*| GPIO Analog Output | Allowed Signals | +*|:-------------------:|:-------------------------------------------------------------------------------------------:| +*| ANALOG_GPIO_0 | ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND0_0 or ADI_ADRV904X_GPIO_SIGNAL_RX2_DUALBAND_CONTROL_BAND0_0 | +*| ANALOG_GPIO_1 | ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND0_1 or ADI_ADRV904X_GPIO_SIGNAL_RX2_DUALBAND_CONTROL_BAND0_1 | +*| ANALOG_GPIO_2 | ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND1_0 or ADI_ADRV904X_GPIO_SIGNAL_RX2_DUALBAND_CONTROL_BAND1_0 | +*| ANALOG_GPIO_3 | ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND1_1 or ADI_ADRV904X_GPIO_SIGNAL_RX2_DUALBAND_CONTROL_BAND1_1 | +*| ANALOG_GPIO_4 | ADI_ADRV904X_GPIO_SIGNAL_RX1_DUALBAND_CONTROL_BAND0_0 or ADI_ADRV904X_GPIO_SIGNAL_RX3_DUALBAND_CONTROL_BAND0_0 | +*| ANALOG_GPIO_5 | ADI_ADRV904X_GPIO_SIGNAL_RX1_DUALBAND_CONTROL_BAND0_1 or ADI_ADRV904X_GPIO_SIGNAL_RX3_DUALBAND_CONTROL_BAND0_1 | +*| ANALOG_GPIO_6 | ADI_ADRV904X_GPIO_SIGNAL_RX1_DUALBAND_CONTROL_BAND1_0 or ADI_ADRV904X_GPIO_SIGNAL_RX3_DUALBAND_CONTROL_BAND1_0 | +*| ANALOG_GPIO_7 | ADI_ADRV904X_GPIO_SIGNAL_RX1_DUALBAND_CONTROL_BAND1_1 or ADI_ADRV904X_GPIO_SIGNAL_RX3_DUALBAND_CONTROL_BAND1_1 | +*| ANALOG_GPIO_8 | ADI_ADRV904X_GPIO_SIGNAL_RX4_DUALBAND_CONTROL_BAND0_0 or ADI_ADRV904X_GPIO_SIGNAL_RX6_DUALBAND_CONTROL_BAND0_0 | +*| ANALOG_GPIO_9 | ADI_ADRV904X_GPIO_SIGNAL_RX4_DUALBAND_CONTROL_BAND0_1 or ADI_ADRV904X_GPIO_SIGNAL_RX6_DUALBAND_CONTROL_BAND0_1 | +*| ANALOG_GPIO_10 | ADI_ADRV904X_GPIO_SIGNAL_RX4_DUALBAND_CONTROL_BAND1_0 or ADI_ADRV904X_GPIO_SIGNAL_RX6_DUALBAND_CONTROL_BAND1_0 | +*| ANALOG_GPIO_11 | ADI_ADRV904X_GPIO_SIGNAL_RX4_DUALBAND_CONTROL_BAND1_1 or ADI_ADRV904X_GPIO_SIGNAL_RX6_DUALBAND_CONTROL_BAND1_1 | +*| ANALOG_GPIO_12 | ADI_ADRV904X_GPIO_SIGNAL_RX5_DUALBAND_CONTROL_BAND0_0 or ADI_ADRV904X_GPIO_SIGNAL_RX7_DUALBAND_CONTROL_BAND0_0 | +*| ANALOG_GPIO_13 | ADI_ADRV904X_GPIO_SIGNAL_RX5_DUALBAND_CONTROL_BAND0_1 or ADI_ADRV904X_GPIO_SIGNAL_RX7_DUALBAND_CONTROL_BAND0_1 | +*| ANALOG_GPIO_14 | ADI_ADRV904X_GPIO_SIGNAL_RX5_DUALBAND_CONTROL_BAND1_0 or ADI_ADRV904X_GPIO_SIGNAL_RX7_DUALBAND_CONTROL_BAND1_0 | +*| ANALOG_GPIO_15 | ADI_ADRV904X_GPIO_SIGNAL_RX5_DUALBAND_CONTROL_BAND1_1 or ADI_ADRV904X_GPIO_SIGNAL_RX7_DUALBAND_CONTROL_BAND1_1 | +* +* where +* ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND0_0: Rx0 Band0 Ext LNA output word LSB +* ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND0_1: Rx0 Band0 Ext LNA output word MSB +* User can select the GPIOs desired to be configured through adi_adrv904x_AgcDualBandGpioCfg_t->gpioSelectionMask. +* API will skip configuring unselected GPIOs and analogGpioMapping[*] value for those GPIOs is a 'Don't care'. +* To release a selected GPIO, user can select ADI_ADRV904X_GPIO_SIGNAL_UNUSED. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] agcDualBandGpioConfig Dual band GPIO configuration structure +* +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcDualBandGpioCfgSet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_AgcDualBandGpioCfg_t * agcDualBandGpioConfig); + +/** +* \brief Function to read back AGC Dual Band GPIO mapping configuration. +* User can select the GPIOs desired to be readback through adi_adrv904x_AgcDualBandGpioCfg_t->gpioSelectionMask. +* This API will set the unselected GPIOs to ADI_ADRV904X_GPIO_SIGNAL_INVALID. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in,out] agcDualBandGpioConfigReadBack Dual band GPIO configuration structure +* +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcDualBandGpioCfgGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_AgcDualBandGpioCfg_t* const agcDualBandGpioConfigReadBack); + +/** +* \brief Function to configure AGC GPIO resync functionality. This feature allows user to configure +* a GPIO to reset the gain update counter. In AGC holdover mode, adi_adrv904x_AgcCfg_t ->agcResetOnRxon = 0, +* AGC counters only reset when gain update counter expires. Gain update counter doesn't realign with TDD timing, +* and resync feature allows pulses from selected GPIO to resync gain update counter with TDD timing. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] rxChannelMask Rx channel mask to select the Rx channels to configure. Multiple channels can be selected +* \param[in] gpioSelection GPIO selection for resync feature to be configured for selected channels. ADI_ADRV904X_GPIO_INVALID +* can be selected to release a currently configured GPIO from selected channels. +* ADI_ADRV904X_GPIO_00 cannot be used for this feature. +* \param[in] enable 0:Disable resync feature, 1:Enable resync feature for selected channel/s +* +* +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcGpioReSyncSet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + const adi_adrv904x_GpioPinSel_e gpioSelection, + const uint8_t enable); + +/** +* \brief Function to read AGC resync functionality. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] rxChannelMask Rx channel mask to select the Rx channels to configure. Multiple channels cannot be selected. +* \param[out] gpioSelection GPIO selection readback for selected channel. ADI_ADRV904X_GPIO_INVALID is returned if selected +* channel doesn't use resync functionality. +* \param[out] enable Readback value of resync enable status. 0:Resync feature is disabled, 1:Resync feature is enabled +* +* +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcGpioReSyncGet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + adi_adrv904x_GpioPinSel_e * const gpioSelection, + uint8_t * const enable); + + +/** +* \brief Function to read active external LNA gain control word for Band A and Band B. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[in] rxChannel Rx channel selection to read band A/B active external lna control word +* \param[out] bandAExternalLnaGainWord Pointer to readback band A external lna control word +* \param[out] bandBExternalLnaGainWord Pointer to readback band B external lna control word +* +* +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcDualBandActiveExternalLnaGainWordGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + uint8_t * const bandAExternalLnaGainWord, + uint8_t * const bandBExternalLnaGainWord); + +/** +* \brief Function to read if the agc upper level was exceeded for all channels. The functions returns a byte +* that each bit represents a channel, from LSB being channel 0 and MSB being channel 7. Bit HIGH means the upper +* level was exceeded, and LOW it hasn't. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[out] agcULBlockerBitMask Pointer to agc_ul_blocker which bit 0 contains bitfield for channel 0, bit 1 for ch 1, and so on. +* Bit HIGH means the upper level was exceeded, and LOW it hasn't. +* +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcUpperLevelBlockerGet(adi_adrv904x_Device_t * const device, + uint8_t * const agcULBlockerBitMask); + +/** +* \brief Function to read if the agc lower level was exceeded for all channels. The functions returns a byte +* that each bit represents a channel, from LSB being channel 0 and MSB being channel 7. Bit HIGH means the lower +* level was exceeded, and LOW it hasn't. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[out] agcLLBlockerBitMask Pointer to agc_ll_blocker which bit 0 contains bitfield for channel 0, bit 1 for ch 1, and so on. +* Bit HIGH means the lower level was exceeded, and LOW it hasn't. +* +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcLowerLevelBlockerGet(adi_adrv904x_Device_t * const device, + uint8_t * const agcLLBlockerBitMask); + +/** +* \brief Function to read if the high threshold peak detector at the ADC or HB2 output was exceeded for all channels. +* The functions returns a byte that each bit represents a channel, from LSB being channel 0 and MSB being channel 7. +* Bit HIGH means the upper level was exceeded, and LOW it hasn't. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[out] thresholdPeakDetectorBitMask Pointer to byte which bit 0 contains bitfield for channel 0, bit 1 for ch 1, and so on. +* Bit HIGH means the high threshold peak detector at ADC or HB2 was exceeded, and LOW it hasn't. +* +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcHighThresholdPeakDetectorGet(adi_adrv904x_Device_t * const device, + uint8_t * const thresholdPeakDetectorBitMask); + +/** +* \brief Function to read if the low threshold peak detector at the ADC or HB2 output was exceeded for all channels. +* The functions returns a byte that each bit represents a channel, from LSB being channel 0 and MSB being channel 7. +* Bit HIGH means the lower level was exceeded, and LOW it hasn't. +* +*When high, this bit indicates that the high threshold peak detector at the Rx1 ADC or HB2 output was exceeded. +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. +* \param[out] thresholdPeakDetectorBitMask Pointer to byte which bit 0 contains bitfield for channel 0, bit 1 for ch 1, and so on. +* Bit HIGH means the low threshold peak detector at ADC or HB2 was exceeded, and LOW it hasn't. +* +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcLowThresholdPeakDetectorGet(adi_adrv904x_Device_t * const device, + uint8_t * const thresholdPeakDetectorBitMask); + + +#endif /* _ADI_ADRV904X_AGC_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_agc_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_agc_types.h new file mode 100644 index 00000000000..51067ed2ca9 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_agc_types.h @@ -0,0 +1,193 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adi_adrv904x_agc_types.h + * \brief Contains ADRV904X API AGC data types + * +* ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADI_ADRV904X_AGC_TYPES_H_ +#define _ADI_ADRV904X_AGC_TYPES_H_ + +#include "adi_library_types.h" +#include "adi_adrv904x_gpio_types.h" + +/** +* \brief Data structure to hold AGC peak settings +*/ +typedef struct adi_adrv904x_AgcPeak +{ + uint8_t adcOvldUpperThreshPeakExceededCnt; /*!< Number of peak events needed in excess of ADC Peak Detector's high threshold to trigger an over ranging condition. Valid range is 2 to 255 */ + uint8_t adcOvldGainStepAttack; /*!< AGC ADC overload gain index step size for attack. Valid range is 0 to 31 */ + + uint8_t adcOvldLowThresh; /*!< AGC ADC overload low threshold. Valid range is 0 to 8, where 8 means full scale of ADC. Threshold in dBFS = 20log(adcOvldLowThresh/8) */ + uint8_t adcOvldLowerThreshPeakExceededCnt; /*!< Number of peak events needed in excess of adcOvldLowThresh to prevent an under ranging condition. Valid range is 2 to 255 */ + uint8_t adcOvldGainStepRecovery; /*!< AGC ADC overload gain index step size for recovery. Valid range is 0 to 31 */ + + uint8_t hb2OverloadDurationCnt; /*!< If hb2OverloadThreshCnt number of samples exceed HB2 high/low thresholds within hb2OverloadDurationCnt sample group, + threshold exceeded signal is asserted and threshold exceeded counter is incremented. If this counter exceeds HB2 high/low + threshold exceeded counts then AGC makes the final gain adjustment. Valid range is 0 to 63.*/ + uint8_t hb2OverloadThreshCnt; /*!< If hb2OverloadThreshCnt number of samples exceed HB2 high/low thresholds within hb2OverloadDurationCnt sample group, + threshold exceeded signal is asserted and threshold exceeded counter is incremented. If this counter exceeds HB2 high/low + threshold exceeded counts then AGC makes the final gain adjustment. Valid range is 0 to 7. */ + + uint16_t hb2HighThresh; /*!< AGC HB2 output high threshold. Valid range from 0 to 16383. */ + uint8_t hb2UpperThreshPeakExceededCnt; /*!< Number of peak events needed in excess of hb2HighThresh to trigger an over ranging condition. Valid range from 1 to 255 */ + uint8_t hb2GainStepAttack; /*!< AGC HB2 output attack gain step. Valid range from 0 to 31 */ + + uint16_t hb2UnderRangeHighThresh; /*!< AGC HB2 output low threshold for 3rd interval (hb2UnderRangeHighInterval) for multiple time constant AGC mode. Valid range from 0 to 16383. */ + uint8_t hb2UnderRangeHighThreshExceededCnt; /*!< Number of peak events needed in excess of hb2UnderRangeHighThresh to prevent an under ranging condition. Valid range from 1 to 255 */ + uint8_t hb2GainStepHighRecovery; /*!< AGC HB2 gain index step size. Valid range from 0 to 31 */ + + /* Only used when fast recovery is enabled */ + uint16_t hb2UnderRangeMidThresh; /*!< AGC HB2 output low threshold for 2nd interval (hb2UnderRangeMidInterval) for multiple time constant AGC mode. Valid range from 0 to 16383 */ + uint8_t hb2UnderRangeMidThreshExceededCnt; /*!< Number of peak events needed in excess of hb2UnderRangeMidThresh to prevent an under ranging condition. Valid range from 0 to 255 */ + uint8_t hb2GainStepMidRecovery; /*!< AGC HB2 gain index step size, when the HB2 Low Overrange interval 3 triggers (under ranges). Valid range from 0 to 31 */ + + uint16_t hb2UnderRangeLowThresh; /*!< AGC HB2 output low threshold for hb2UnderRangeLowInterval. Valid range from 0 to 16383 */ + uint8_t hb2UnderRangeLowThreshExceededCnt; /*!< Number of peak events needed in excess of hb2UnderRangeLowThesh to prevent an under ranging condition. Valid range from 0 to 255 */ + uint8_t hb2GainStepLowRecovery; /*!< AGC HB2 gain index step size, when the HB2 Low Overrange interval 2 triggers (under ranges). Valid range from 0 to 31 */ + + uint16_t hb2UnderRangeLowInterval; /*!< Update interval for AGC fast recovery loop mode in AGC clock cycles. Valid range is 0 to 65535. + This update interval is used as gain update counter period when fast recovery is enabled */ + uint8_t hb2UnderRangeMidInterval; /*!< 2nd update interval for multiple time constant AGC mode. + Calculated as (hb2UnderRangeMidInterval+1)*hb2UnderRangeLowInterval_ns. Valid range is 0 to 63 */ + uint8_t hb2UnderRangeHighInterval; /*!< 3rd update interval for multiple time constant AGC mode. + Calculated as (hb2UnderRangeHighInterval+1)*2nd update interval. Valid range is 0 to 63 */ + /* Only used when fast recovery is enabled */ + + uint8_t enableHb2Overload; /*!< Enable or disables the HB2 overload peak detector. */ + uint8_t hb2OverloadPowerMode; /*!< Selects HB2 sample type 1:I^2+Q^2 // 0:max(|I|, |Q|) + 1:For this mode, HB2 thresholds can be calculated as : Threshold = 2^14 * 10^(-x dBFS / 10) where x is the desired threshold in dBFS + 0:For this mode, HB2 thresholds can be calculated as : Threshold = 2^14 * 10^(-x dBFS / 20) where x is the desired threshold in dBFS*/ + uint8_t hb2OverloadSignalSelection; /*!< HB2 peak detector signal source selection. 1:Select input of HB2 . 0:Select output of HB2*/ +} adi_adrv904x_AgcPeak_t; + +/** +* \brief Data structure to hold AGC power settings +* The evaluation software GUI for the product can be used to generate a structure with suggested settings. +*/ +typedef struct adi_adrv904x_AgcPower +{ + uint8_t underRangeHighPowerThresh; /*!< AGC power measurement detect lower 0 threshold. Valid Range from 0 to 127. Threshold_in_dBFS = (-1 * underRangeHighPowerThresh) */ + uint8_t underRangeHighPowerGainStepRecovery; /*!< AGC power measurement detect lower 0 recovery gain step. Valid range from 0 to 31 */ + + uint8_t underRangeLowPowerThresh; /*!< AGC power measurement detect lower 1 threshold. Valid offset from 0 to 31. This configures an offset from underRangeHighPowerThresh. + Offset_in_dBFS = (-1 * underRangeLowPowerThresh)*/ + uint8_t underRangeLowPowerGainStepRecovery; /*!< AGC power measurement detect lower 1 recovery gain step. Valid range from 0 to 31 */ + + uint8_t overRangeLowPowerThresh; /*!< AGC upper 0 threshold for power measurement. Valid Range from 0 to 127. Threshold_in_dBFS = (-1 * overRangeLowPowerThresh)*/ + uint8_t overRangeLowPowerGainStepAttack; /*!< AGC power measurement detect lower 0 attack gain step. Valid range from 0 to 31 */ + + uint8_t overRangeHighPowerThresh; /*!< AGC upper 1 threshold for power measurement. Valid offset from 0 to 15. This configures an offset from overRangeLowPowerThresh. + Offset_in_dBFS = (-1 * overRangeHighPowerThresh) */ + uint8_t overRangeHighPowerGainStepAttack; /*!< AGC power measurement detect lower 1 attack gain step. Valid range from 0 to 31 */ + + uint8_t powerEnableMeasurement; /*!< Enable the Rx power measurement block. (0/1) */ + uint8_t powerInputSelect; /*!< Use output of Rx for power measurement. 0: DC Offset output, 1: RFIR output, 2: QFIR output, 3:HB2 output. Valid Range from 0 to 3 */ + uint8_t powerMeasurementDuration; /*!< Average power measurement duration = 8*2^powerMeasurementDuration. Valid range from 0 to 31 */ + +} adi_adrv904x_AgcPower_t; + +/** +* \brief Data structure to hold all AGC configuration settings for initialization +* The evaluation software GUI for the product can be used to generate a structure with suggested settings. +*/ +typedef struct adi_adrv904x_AgcCfg +{ + uint32_t rxChannelMask; /*!< Channel mask of Rx channels to apply these settings to, or that settings were read from */ + uint8_t agcRxMaxGainIndex; /*!< AGC Rx max gain index. Valid range is from 0 to 255 */ + uint8_t agcRxMinGainIndex; /*!< AGC Rx min gain index. Valid range is from 0 to 255 */ + uint32_t agcGainUpdateCounter; /*!< AGC gain update time in AGC clock cycles. Valid range is from 0 to 4194303*/ + uint8_t agcChangeGainIfThreshHigh; /*!< Enable immediate gain change if high threshold counter is exceeded. + Bit 0 enables ADC high threshold, Bit 1 enables HB2 high threshold */ + uint8_t agcSlowLoopSettlingDelay; /*!< On any gain change, the AGC waits for twice this time (specified in AGC clock cycles) to allow + gain transients to flow through the Rx path before starting any measurements. Valid range is from 0 to 255 */ + uint8_t agcEnableFastRecoveryLoop; /*!< 1:Enable fast recovery. 0:Disable fast recovery */ + uint8_t agcPeakThreshGainControlMode; /*!< 1:Enable gain change based only on the signal peak threshold over-ranges. + Power based AGC changes are disabled in this mode. 0:Disable*/ + uint8_t agcLowThreshPreventGainInc; /*!< 1:Prevent gain index from incrementing (by power measurements) if peak thresholds are being exceeded 0:Don't prevent*/ + uint8_t agcResetOnRxon; /*!< 1: Reset the AGC slow loop state machine to max gain when the Rx Enable is taken low 0:Don't reset */ + uint8_t agcRxAttackDelay; /*!< On entering Rx, the Rx AGC is kept inactive for a period = agcRxAttackDelay*1us. Valid range is from 0 to 63 */ + uint8_t agcAdcResetGainStep; /*!< Indicates how much gain steps to reduce when a reset happens in the ADC. + Typically larger (1-2dB) than the agc_ovrg_gain_step. Valid range is from 0 to 31 */ + uint8_t agcPeakWaitTime; /*!< AGC peak wait time in AGC clock cycles. Valid range is from 0 to 3. Configure the duration that + the gain control algorithms wait before enabling regular operation of the peak detectors after a peak is detected*/ + adi_adrv904x_AgcPower_t agcPower; + adi_adrv904x_AgcPeak_t agcPeak; +} adi_adrv904x_AgcCfg_t; + +/** +* \brief Data structure to set/get the AGC min/max gain index for one or more Rx channels. +*/ +typedef struct adi_adrv904x_AgcGainRange +{ + uint32_t rxChannelMask; /*!< Channel mask of Rx channels to apply these settings to, or that settings were read from */ + uint8_t maxGainIndex; /*!< Max gain index the AGC can use */ + uint8_t minGainIndex; /*!< Min gain index the AGC can use */ +} adi_adrv904x_AgcGainRange_t; + + +/** +* \brief Data structure to hold AGC Dualband configuration. +*/ +typedef struct adi_adrv904x_AgcDualBandCfg +{ + uint32_t rxChannelMask; /*!< Channel mask of Rx channels to apply these settings to, or that settings were read from */ + uint8_t agcDualBandEnable; /*!< Enable AGC operation for dualband receiver */ + uint8_t agcRxDualbandExtTableUpperIndex; /*! Upper Band Power + Lower Band Power + margin, the signal contains other components + than the two bands, and AGC should behave like a single band system. Margin is in 0.5dBFS steps, i.e. margin[dBFS] = 0.5 * agcDualbandPwrMargin + Range for agcDualbandPwrMargin: [0-31] */ + uint8_t agcDualbandLnaStep; /*! Lower Band Power + margin, and Lower Band Power > Upper Band Power + margin checks). + The margin compares the powers of the bands to change the LNA of one band so that powers of the bands match. + Value is in 0.5dBFS resolution, i.e. margin[dBFS] = 0.5 * agcDualbandLnaStep */ + uint8_t agcDualbandHighLnaThreshold; /*!enableGainCompensationForExtLna is set to 1 */ + uint8_t externalControlWord; /*!< 2 bit external LNA control word. Range:[0-3] */ + +} adi_adrv904x_RxDualBandLnaGainTableRow_t; + +/** + * \brief Data structure to hold ADRV904X Rx dual band external LNA analog gpio output mapping settings + */ +typedef struct adi_adrv904x_AgcDualBandGpioCfg +{ + uint16_t gpioSelectionMask; /* User can select one or multiple analog GPIOs(out of 16 analog GPIO pins) to configure */ + adi_adrv904x_GpioSignal_e analogGpioMapping[ADI_ADRV904X_GPIO_ANALOG_COUNT]; /* Gpio signal assignments for GPIOs selected with gpioSelectionMask. gpioSelectionMask Bit0 + * selects analogGpioMapping[0], Bit1 selects analogGpioMapping[1] and so on. For unselected + * GPIOs the value of analogGpioMapping[*] is don't care. */ + +} adi_adrv904x_AgcDualBandGpioCfg_t; +#endif /* _ADI_ADRV904X_AGC_TYPES_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cals.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cals.h new file mode 100644 index 00000000000..77a8a3f2ae2 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cals.h @@ -0,0 +1,572 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_cals.h +* \brief Contains ADRV904X processor function prototypes for +* adi_adrv904x_cals.c +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#ifndef _ADI_ADRV904X_CALS_H_ +#define _ADI_ADRV904X_CALS_H_ + +#include "adi_adrv904x_cals_types.h" +#include "adi_adrv904x_error.h" +#include "adi_adrv904x_cpu_cmd_dc_offset.h" + + +/**************************************************************************** + * Initialization functions + **************************************************************************** + */ + +/** + * \brief Runs the ADRV904X initialization calibrations + * + * \pre This function is called after the device has been initialized, and the RF PLL has been + * verified to be locked + * + * + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + + * \param[in,out] device Context variable -Context variable -A pointer to the device settings structure + * \param[in] initCals A pointer to the InitCals structure which calibrations to run + * +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_InitCalsRun(adi_adrv904x_Device_t* const device, + const adi_adrv904x_InitCals_t* const initCals); + +/** + * \brief Gets the device initialization calibration status + * + * This function provides updates to represent the status of the initialization calibrations + * calsSincePowerUp, calsLastRun are bit wise representations of calibration status. + * Each bit represents a calibration. adi_adrv904x_InitCalibrations_e defines the unique initialization + * calibration bit masks + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Context variable -A pointer to the device settings structure + * \param[out] initStatus Pointer passed to obtain init calibrations values. + * + * \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_InitCalsDetailedStatusGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_InitCalStatus_t* const initStatus); + +/** +* \brief Performs a Lookup of the Init Cal Status +* +* \pre This function may be called any time after the device has been initialized, and +* initialization calibrations have taken place +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Context variable - A pointer to the device settings structure +* \param[out] initCalErrData Pointer passed to obtain init calibrations error data. +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_InitCalsDetailedStatusGet_v2( adi_adrv904x_Device_t* const device, + adi_adrv904x_InitCalErrData_t* const initCalErrData); + +/** + * \brief Blocking waits for the ADRV904X initialization calibrations to complete + * + * \pre This function is called after adi_adrv904x_InitCalsRun to wait for init cals to finish + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Context variable -A pointer to the device settings structure + * \param[in] timeoutMs A timeout value in milliseconds to wait for the calibrations to complete + * + * \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_InitCalsWait( adi_adrv904x_Device_t* const device, + const uint32_t timeoutMs); + +/** + * \brief Blocking waits for the initialization calibrations to complete and provides detailed status + * + * \pre This function is called after adi_adrv904x_InitCalsRun to wait for init cals to finish + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Context variable -A pointer to the device settings structure + * \param[in] timeoutMs A timeout value in milliseconds to wait for the calibrations to complete + * \param[out] initCalErrData Pointer passed to obtain init calibrations error data + * Note: Optional Parameter (i.e. NULL Pointer passed will still perform the InitCalsWait) + * + * \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_InitCalsWait_v2( adi_adrv904x_Device_t* const device, + const uint32_t timeoutMs, + adi_adrv904x_InitCalErrData_t* const initCalErrData); + +/** + * \brief Immediate initialization calibration completion check + * + * This function is similar to adi_adrv904x_InitCalsWait except it does + * not block the thread waiting for the enabled init calibrations to complete. + * This function returns the initialization calibration status immediately + * allowing the application layer to do other work while the calibrations are + * running. + * + * \pre This function is called after the initialization calibrations have been + * started + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Context variable -A pointer to the device settings structure + * \param[out] areCalsRunning A pointer to a uint8_t return variable: Returns 1 if + * init cals are running, 0 = init cals are not running (either complete + * or have not started) + * \param[in] calErrorCheck check for InitCals error if true + * + * \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_InitCalsCheckCompleteGet(adi_adrv904x_Device_t* const device, + uint8_t* const areCalsRunning, + const uint8_t calErrorCheck); + +/** +* \brief Immediate initialization calibration completion check +* +* This function is similar to adi_adrv904x_InitCalsWait except it does +* not block the thread waiting for the enabled init calibrations to complete. +* This function returns the initialization calibration status immediately +* allowing the application layer to do other work while the calibrations are +* running. +* +* \pre This function is called after the initialization calibrations have been +* started +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Context variable -A pointer to the device settings structure +* \param[out] areCalsRunning A pointer to a uint8_t return variable: Returns 1 if +* init cals are running, 0 = init cals are not running (either complete +* or have not started) + * \param[out] initCalErrData Pointer passed to obtain init calibrations error data when cals have completed + * Note: Optional Parameter (i.e. NULL Pointer passed will perform the InitCalsCheckCompleteGet) +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_InitCalsCheckCompleteGet_v2( adi_adrv904x_Device_t* const device, + uint8_t* const areCalsRunning, + adi_adrv904x_InitCalErrData_t* const initCalErrData); + + +/** + * \brief Aborts an on-going CPU initialization calibration sequence + * + * The CPU init calibrations can take several seconds. This function is called when + * the BBIC needs to intercede and stop the current initialization calibration sequence. + * + * \pre This function is called any time during the initialization calibration process + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Context variable -A pointer to the device settings structure + * + * \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_InitCalsAbort(adi_adrv904x_Device_t* const device); + + +/** + * \brief Enables or Disables Tracking Calibrations + * + * If the cal mask bit corresponding to an unconfigured Tx/Rx/ORx channel is set, that bit is ignored by this + * function (and the CPU firmware). + * + * \pre This command must be called after a full device initialization + * has taken place, all PLLs are configured and locked, Multi-Chip Sync (MCS) has taken place, and the JESD204B + * links are configured and operational. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Context variable -A pointer to the device settings structure + * \param[in] calMask Mask of tracking calibrations to enable or disable. The calibration bit positions + * correspond to adi_adrv904x_TrackingCalibrationMask_e. + * \param[in] channelMask Mask of channels on which tracking calibrations should be enabled or disabled + * \param[in] enableDisableFlag Indicates if calibrations in enableMask should be enabled or disabled + * + * \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TrackingCalsEnableSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TrackingCalibrationMask_t calMask, + const uint32_t channelMask, + const adi_adrv904x_TrackingCalEnableDisable_e enableDisableFlag); + +/** +* \brief Enables or Disables Tracking Calibrations +* +* If the cal mask bit corresponding to an unconfigured Tx/Rx/ORx channel is set, that bit is ignored by this +* function (and the CPU firmware). +* +* \pre This command must be called after a full device initialization +* has taken place, all PLLs are configured and locked, Multi-Chip Sync (MCS) has taken place, and the JESD204B +* links are configured and operational. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Context variable -A pointer to the device settings structure +* \param[in] calMask Mask of tracking calibrations to enable or disable. The calibration bit positions +* correspond to adi_adrv904x_TrackingCalibrationMask_e. +* \param[in] channelMask Mask of channels in structure adi_adrv904x_ChannelTrackingCals_t on which tracking calibrations should be enabled or disabled +* \param[in] enableDisableFlag Indicates if calibrations in enableMask should be enabled or disabled +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TrackingCalsEnableSet_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TrackingCalibrationMask_e calMask, + const adi_adrv904x_ChannelTrackingCals_t* const channelMask, + const adi_adrv904x_TrackingCalEnableDisable_e enableDisableFlag); + +/** +* \brief Gets the set of tracking calibrations that are enabled +* +* In the returned set of per-channel bitmasks, each bit represents the enable/disable +* state of one of the calibrations. The calibration bit positions correspond to +* adi_adrv904x_TrackingCalibrationMask_e. The state can be interpreted as 1 = enabled +* and 0 = disabled. +* +* System calibration (e.g. ADI_ADRV904X_TC_TX_SERDES) state will be returned on channel 0 only +* (even if this channel is not configured). +* +* \pre This command must be called after a full device initialization has taken place. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Context variable -A pointer to the device settings structure +* \param[in,out] enableMasks Pointer to location in which enable/disable state should be placed +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TrackingCalsEnableGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_TrackingCalEnableMasks_t* const enableMasks); + +/** +* \brief Allows reading the current state of all tracking calibrations +* +* The returned state information is indexed per channel and per calibration ID (see +* adi_adrv904x_TrackingCalibrationId_e). System calibration (e.g. ADI_ADRV904X_TC_TX_SERDES) +* state will be returned on channel 0 only, even if this channel is not configured. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Context variable -A pointer to the device settings structure +* \param[in,out] calState Pointer to tracking calibration state structure to store the read values +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TrackingCalAllStateGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_TrackingCalState_t* const calState); + + +/** + * \brief Returns the status of the tracking calibration + * + * The function can be called to read back the status of the + * calibration including metrics like error codes, percentage of data + * collected for current cal, the performance of the cal and the number of + * times the cal has run and updated the hardware. + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Context variable -A pointer to the device settings structure + * \param[in] calId Indicate a type of cal tracking to get as defined in adi_adrv904x_TrackingCalibrationMask_e + * \param[in] channel Channel selection to read back cal status. Must be a single channel. + * \param[out] calStatus Status of the calibration, as a structure of type adi_adrv904x_CalStatus_t is returned to this pointer address + * + * \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TrackingCalStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TrackingCalibrationMask_e calId, + const adi_adrv904x_Channels_e channel, + adi_adrv904x_CalStatus_t* const calStatus); + + +/** + * \brief Returns the status of the init calibration + * + * The function can be called to read back the status of the + * calibration including metrics like error codes, percentage of data + * collected for current cal, the performance of the cal and the number of + * times the cal has run and updated the hardware. + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Context variable -A pointer to the device settings structure + * \param[in] calId Indicate a type of cal tracking to get as defined in adi_adrv904x_TrackingCalibrations_e + * \param[in] channel Channel selection to read back cal status. Must be a single channel. + * \param[out] calStatus Status of the calibration, as a structure of type adi_adrv904x_CalStatus_t is returned to this pointer address + * + * \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_InitCalStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_InitCalibrations_e calId, + const adi_adrv904x_Channels_e channel, + adi_adrv904x_CalStatus_t* const calStatus); + +/** + * \brief Gets current Hrm filter coeficients for the provided channels in channelMask. + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Context variable -A pointer to the device settings structure + * \param[in] channelMask Channel mask for which channels HRM data are to be retrieved. At least one bit in must be set. + * \param[out] txHrmDataArray points to an array of adi_adrv904x_TxHrmData_t with the number of elements of the array being the number of set bits + * in channelMask. The first element in the array is the first bit set, starting from LSB. The size is expected to be + * the number of bits High in channelMask, with min size of array being 1, and max being 8. For example, for channelMask + * equal to 0b01101000, the first element in the array will contain HRM data for Tx3, and the third (and last) will be + * relative to Tx6. + * \param[in] arrayLength explicit mention of the number of elements in txHrmDataArray. Must match the number of bits set in channelMask. + * + * \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxHrmDataGet(adi_adrv904x_Device_t* const device, + const uint8_t channelMask, + adi_adrv904x_TxHrmData_t txHrmDataArray[], + uint32_t arrayLength); + +/** + * \brief Gets current Hrm filter coeficients for the provided channels in channelMask. + * The user should call this function following an LO reprogram that demands a change in HRM coefficients. + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Context variable -A pointer to the device settings structure + * \param[in] channelMask Channel mask for which channels HRM data are to be retrieved. At least one bit in must be set. + * \param[in] txHrmDataArray points to an array of adi_adrv904x_TxHrmData_t with the number of elements of the array being the number of set bits + * in channelMask. The first element in the array is the first bit set, starting from LSB. The size is expected to be + * the number of bits High in channelMask, with min size of array being 1, and max being 8. For example, for channelMask + * equal to 0b01101000, the first element in the array will contain HRM data for Tx3, and the third (and last) will be + * relative to Tx6. + * \param[in] arrayLength explicit mention of the number of elements in txHrmDataArray. Must match the number of bits set in channelMask. + * + * \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxHrmDataSet(adi_adrv904x_Device_t* const device, + const uint8_t channelMask, + const adi_adrv904x_TxHrmData_t txHrmDataArray[], + uint32_t arrayLength); + + + +/** + * \brief Returns detailed status information specific to the private calibration + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Context variable -A pointer to the device settings structure + * \param[in] channel Channel selection to read back cal status. Must be a single channel + * \param[in] objId Object ID of calibration or system component + * \param[in, out] calStatusGet Status of the calibration. Size of calStatusGet must be equal or greater than length param. + * \param[in] length Length of the configuration in bytes + * + * \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CalPvtStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + const uint32_t objId, + uint8_t calStatusGet[], + uint32_t length); + +/** + * \brief Returns status specific information calibration + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Context variable -A pointer to the device settings structure + * \param[in] channel Channel selection to read back cal status. Must be a single channel + * \param[in] objId Object ID of calibration or system component + * \param[in, out] calStatusGet Status of the calibration. Size of calStatusGet must be equal or greater than length param. + * \param[in] length Length of the configuration in bytes + * + * \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CalSpecificStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + const uint32_t objId, + uint8_t calStatusGet[], + uint32_t length); + +/** +* \brief Enables or disables Digital DC Offset Tracking for one or more channels. +* +* For both parameters use adi_adrv904x_Channels_e to construct the mask parameters. +* +* For example: +* +* rxChannelMask | rxChannelEnableDisable | Effect +* --------------+------------------------+------------------------------------------------------- +* 0x01 | 0x01 | Enables Rx0. No effect on other channels. +* 0x03 | 0x02 | Disables Rx0, Enables Rx1. No effect on other channels. +* 0xF0 | 0x00 | Disables Rx4-7. No effect on other channels. +* 0x0F | 0xFF | Enables Rx0-3. No effect on other channels. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Context variable -A pointer to the device settings structure +* \param[in] rxChannelMask Mask to select Rx channels to be affected by this function call. A channel whose bit is not +* set in this parameter will not be affected by the call. +* \param[in] rxChannelEnableDisable Each bit indicates whether to enable or disable digital DC offset tracking for the +* corresponding channel. +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DigDcOffsetEnableSet(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const uint32_t rxChannelEnableDisable); + +/** +* \brief Query if Digital DC Offset Tracking is enabled or disabled for a single Rx channel. +* +* It is an error to call this function for an Rx channel that is not initialized or for an ORx channel. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Context variable -A pointer to the device settings structure +* \param[in] rxChannel The Rx channel to query. Values indicating an ORx channel are not a valid. +* \param[out] isEnabled Zero is written here if the feature is disabled. Otherwise a non-zero value is written. +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DigDcOffsetEnableGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + uint8_t* const isEnabled); + +/** + * \brief Reset Tx LOL + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Context variable -A pointer to the device settings structure + * \param[in] txLolReset pointer with special Tx LOL channel mask and reset type + * + * \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxLolReset(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxLolReset_t* const txLolReset); + +/** +* \brief Reset Tx QEC +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Context variable -A pointer to the device settings structure +* \param[in] txQecReset pointer with special Tx QEC channel mask and reset type +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxQecReset(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxQecReset_t* const txQecReset); + +/** + * \brief Set Dig Dc offset configuration for selected channel/s. User can select 1dB corner for + * DC offset filter through dcOffsetCfg structure. FW calculates the required mshift and multiplier + * values based on this corner frequency and configures the transceiver device. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in,out] device Context variable adi_adrv904x_Device_t pointer to the device data structure + * \param [in] dcOffSetCfg Dc offset configuration to set + * + * \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DigDcOffsetCfgSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuCmd_SetDcOffset_t* const dcOffSetCfg); + +/** + * \brief This function reads Dig Dc offset configuration for selected channel. adi_adrv904x_CpuCmd_GetDcOffset_t + * structure contains the values configured in transceiver device based upon corner frequency selected by + * adi_adrv904x_DigDcOffsetCfgSet() function call. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in,out] device Context variable adi_adrv904x_Device_t pointer to the device data structure + * \param [in,out] dcOffSetCfg Pointer to Dc offset configuration for readback + * + * \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DigDcOffsetCfgGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_CpuCmd_GetDcOffsetResp_t* const dcOffSetCfg); +#endif /* _ADI_ADRV904X_CALS_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cals_structs.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cals_structs.h new file mode 100644 index 00000000000..29fc83f8947 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cals_structs.h @@ -0,0 +1,49 @@ +/** + * Copyright 2015 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adi_adrv904x_cals_structs.h + * + * \brief Contains ADRV904X Calibration data types + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_CAL_STRUCTS_H__ +#define __ADRV904X_CAL_STRUCTS_H__ + +#include "stdint.h" +#include "adi_adrv904x_platform_pack.h" + +/** + * \brief Data structure to hold common init and tracking calibration status information + */ +ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_CalStatus +{ + uint32_t errorCode; /*!< Current error condition reported by the calibration */ + uint32_t percentComplete; /*!< Percentage of completion of the last iteration + * %20 = Data captures have been started in HW + * %30 = Data captures are complete, DPD is calculating signal metrics and stability related data + * %40 = DPD is performing path delay calculation if needed + * %50 = DPD is performing sample and gain alignment + * %60 = DPD is running feature filter and Xcorr stage + * %80 = DPD is running Cholesky decomposition + * %90 = DPD is calculating robustness metrics + * %100 = DPD has finished iteration without any error + */ + uint32_t performanceMetric; /*!< Calibration-specific metric for how well the calibration is performing: + * ADI_ADRV904X_IC_TXBBF: N/A + * ADI_ADRV904X_IC_RXTIA: N/A + */ + uint32_t iterCount; /*!< Running counter that increments each time the calibration runs to completion */ + uint32_t updateCount; /*!< Running counter that increments each time the calibration updates the correction/actuator hardware */ +} adi_adrv904x_CalStatus_t; +ADI_ADRV904X_PACK_FINISH + +#endif /* __ADRV904X_CAL_STRUCTS_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cals_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cals_types.h new file mode 100644 index 00000000000..e03ace8b250 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cals_types.h @@ -0,0 +1,284 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adi_adrv904x_cals_types.h + * + * \brief Contains ADRV904X Calibration data types + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_CAL_TYPES_H__ +#define __ADRV904X_CAL_TYPES_H__ + +#include "adi_adrv904x_cpu_error_codes_types.h" +#include "adi_adrv904x_cals_structs.h" + +#ifndef ADI_ADRV904X_FW +#include "adi_adrv904x_platform_pack.h" +#else +#include "adi_adrv904x_platform_pack.h" +#include "adrv904x_cpu_object_ids_types.h" +#include "adrv904x_cpu_error_codes_types.h" +#endif + +/* Number of channels that can be calibrated */ +#define ADI_ADRV904X_CPU_NUM 2U +#define ADI_ADRV904X_NUM_INIT_CAL_CHANNELS 8U +#define ADI_ADRV904X_NUM_TRACKING_CAL_CHANNELS 8U +#define ADI_ADRV904X_CHAR_ARRAY_MAX 256U + +/* Size of struct that contains TxHRM data for one channel */ +#define TX_HRM_CAL_DATA_PER_CHANNEL_SIZE 48U + +/** + * \brief Initial calibration mask + */ +typedef enum adi_adrv904x_InitCalibrations +{ + ADI_ADRV904X_IC_RX_DC_OFFSET = 2, /*!< RX DC Offet calibration */ + ADI_ADRV904X_IC_ADC_RX = 4, /*!< ADC Orx calibration */ + ADI_ADRV904X_IC_ADC_ORX = 8, /*!< ADC Orx calibration */ + ADI_ADRV904X_IC_ADC_TXLB = 16, /*!< ADC Tx loopback calibration */ + ADI_ADRV904X_IC_TXDAC = 32, /*!< Tx DAC calibration */ + ADI_ADRV904X_IC_TXBBF = 64, /*!< Tx BB filter calibration */ + ADI_ADRV904X_IC_TXLB_FILTER = 16384, /*!< Tx Loopback filter calibration */ + ADI_ADRV904X_IC_TXLB_PATH_DLY = 128, /*!< Tx LB path delay calibration */ + ADI_ADRV904X_IC_TX_ATTEN_CAL = 256, /*!< Tx atten phase/gain calibration (NOTE: not implemented) */ + ADI_ADRV904X_IC_HRM = 512, /*!< HRM initial calibration */ + ADI_ADRV904X_IC_TXQEC = 1024, /*!< TxQEC initial calibration */ + ADI_ADRV904X_IC_TXLOL = 2048, /*!< TxLOL initial calibration */ + ADI_ADRV904X_IC_SERDES = 4096, /*!< SerDes initial calibration */ + ADI_ADRV904X_IC_TXRX_PHASE = 131072, /*!< TxRxPhase initial calibration */ + +} adi_adrv904x_InitCalibrations_e; + +/** + * \brief JrxRepair Start up Mode + */ +typedef enum adi_adrv904x_JrxRepairInitMode +{ + ADI_ADRV904X_JRXREPAIR_INIT_NORMAL = 0x0U, /*!< JRx Repair must be performed if init cal fails, at runtime or if history is present */ + ADI_ADRV904X_JRXREPAIR_INIT_NONSCREENED = 0x2U, /*!< JRx repair is applied automatically for all the transceivers that have not been screened */ + ADI_ADRV904X_JRXREPAIR_INIT_ALL = 0x3U, /*!< JRx repair is applied automatically to all the transceivers */ +} adi_adrv904x_JrxRepairInitMode_e; + +typedef uint64_t adi_adrv904x_InitCalibrations_t; + +#define ADI_ADRV904X_IC_ALL_CALS ((adi_adrv904x_InitCalibrations_t)( ADI_ADRV904X_IC_RX_DC_OFFSET \ + | ADI_ADRV904X_IC_ADC_RX \ + | ADI_ADRV904X_IC_ADC_ORX \ + | ADI_ADRV904X_IC_ADC_TXLB \ + | ADI_ADRV904X_IC_TXDAC \ + | ADI_ADRV904X_IC_TXBBF \ + | ADI_ADRV904X_IC_TXLB_FILTER \ + | ADI_ADRV904X_IC_TXLB_PATH_DLY \ + | ADI_ADRV904X_IC_HRM \ + | ADI_ADRV904X_IC_TXQEC \ + | ADI_ADRV904X_IC_TXLOL \ + | ADI_ADRV904X_IC_SERDES \ + | ADI_ADRV904X_IC_TXRX_PHASE)) + +/** +* \brief Data structure to hold initial calibration information +*/ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_InitCals +{ + adi_adrv904x_InitCalibrations_t calMask; /*!< Mask of adi_adrv904x_InitCalibrations_e to run on init */ + uint32_t rxChannelMask; /*!< Mask to hold Rx channels to run on init */ + uint32_t txChannelMask; /*!< Mask to hold Tx channels to run on init */ + uint32_t orxChannelMask; /*!< Mask to hold ORx channels to run on init */ + uint8_t warmBoot; /*!< (not supported) */ +} adi_adrv904x_InitCals_t;) + +/** +* \brief Data structure to hold initial calibration information +*/ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_ChannelTrackingCals +{ + uint32_t rxChannel; /*!< RX Tracking calibration channel */ + uint32_t orxChannel; /*!< ORX Tracking calibration channel */ + uint32_t txChannel; /*!< TX Tracking calibration channel */ + uint32_t laneSerdes; /*!< TX lane SERDES Tracking calibration channel */ +} adi_adrv904x_ChannelTrackingCals_t;) + +/** + * \brief Data structure to hold the InitCalStatus information for readback + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_InitCalStatus +{ + adi_adrv904x_CpuErrorCode_t initErrCodes[ADI_ADRV904X_NUM_INIT_CAL_CHANNELS]; /*!< Set of initial calibration error codes for Channels 1/2/3/4/5/6/7/8. */ + adi_adrv904x_InitCalibrations_t initErrCals[ADI_ADRV904X_NUM_INIT_CAL_CHANNELS]; /*!< Set of IDs of the specific initial calibration(s) reporting an error (adi_adrv904x_InitCalibrations_e) for Channels 1/2/3/4/5/6/7/8 */ + uint32_t calsDurationMsec; /*!< Duration in msec of the last initial calibration run */ + adi_adrv904x_InitCalibrations_t calsSincePowerUp[ADI_ADRV904X_NUM_INIT_CAL_CHANNELS]; /*!< Bitmask (adi_adrv904x_InitCalibrations_e) indicating calibrations run since power up for Channels 1/2/3/4/5/6/7/8 */ + adi_adrv904x_InitCalibrations_t calsLastRun[ADI_ADRV904X_NUM_INIT_CAL_CHANNELS]; /*!< Bitmask (adi_adrv904x_InitCalibrations_e) indicating calibrations run in during the previous runInitCals() call for Channels 1/2/3/4/5/6/7/8 */ +} adi_adrv904x_InitCalStatus_t;) + +/** +* \brief Data structure to hold initial calibration error information +*/ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_InitCalChannelErrData +{ + adi_adrv904x_InitCalibrations_t initErrCals; /*!< Error ID Mask for adi_adrv904x_InitCalibrations_e */ + adi_adrv904x_CpuErrorCode_t errCode; /*!< CPU Error Code */ + uint8_t errMsg[ADI_ADRV904X_CHAR_ARRAY_MAX]; /*!< Error Message */ + uint8_t errCause[ADI_ADRV904X_CHAR_ARRAY_MAX]; /*!< Error Cause */ + int64_t action; /*!< Recovery Action */ + uint8_t actionMsg[ADI_ADRV904X_CHAR_ARRAY_MAX]; /*!< Recovery Action Message */ + adi_adrv904x_InitCalibrations_t calsSincePowerUp; /*!< Cals Run Since Power Up Bitmask */ + adi_adrv904x_InitCalibrations_t calsLastRun; /*!< Cals Since Last Run Bitmask */ +} adi_adrv904x_InitCalChannelErrData_t;) + +/** +* \brief Data structure to hold initial calibration error information +*/ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_InitCalErrData +{ + adi_adrv904x_InitCalChannelErrData_t channel[ADI_ADRV904X_NUM_INIT_CAL_CHANNELS]; /*!< Init Cal Data for All Channels */ + uint32_t calsDurationMsec[ADI_ADRV904X_CPU_NUM]; /*!< Duration in msec of the last initial calibration run (Milliseconds) */ +} adi_adrv904x_InitCalErrData_t;) + +/** + * \brief Tracking calibration ID + */ +typedef enum adi_adrv904x_TrackingCalibrationId +{ + ADI_ADRV904X_TC_RX_QEC = 0, /*!< RxQEC Tracking calibration */ + ADI_ADRV904X_TC_TX_LOL = 1, /*!< TxLOL Tracking calibration */ + ADI_ADRV904X_TC_TX_QEC = 2, /*!< TxQEC Tracking calibration */ + ADI_ADRV904X_TC_TX_SERDES = 3, /*!< SERDES Tracking calibration */ + ADI_ADRV904X_TC_RX_ADC = 4, /*!< Rx ADC Tracking calibration */ + ADI_ADRV904X_TC_TX_LB_ADC = 5, /*!< TxLB ADC Tracking calibration */ + ADI_ADRV904X_TC_ORX_ADC = 6, /*!< ORx ADC Tracking calibration */ + ADI_ADRV904X_TC_NUM_CALS = 6 + 1ul, /*!< Number of tracking calibrations */ +} adi_adrv904x_TrackingCalibrationId_e; + +typedef uint32_t adi_adrv904x_TrackingCalibrationId_t; + +/** + * \brief Tracking calibration mask + */ +typedef enum adi_adrv904x_TrackingCalibrationMask +{ + ADI_ADRV904X_TC_RX_QEC_MASK = 1, /*!< RxQEC Tracking calibration */ + ADI_ADRV904X_TC_TX_LOL_MASK = 2, /*!< TxLOL Tracking calibration */ + ADI_ADRV904X_TC_TX_QEC_MASK = 4, /*!< TxQEC Tracking calibration */ + ADI_ADRV904X_TC_TX_SERDES_MASK = 8, /*!< SERDES Tracking calibration */ + ADI_ADRV904X_TC_RX_ADC_MASK = 16, /*!< Rx ADC Tracking calibration */ + ADI_ADRV904X_TC_TX_LB_ADC_MASK = 32, /*!< TxLB ADC Tracking calibration */ + ADI_ADRV904X_TC_ORX_ADC_MASK = 64, /*!< ORx ADC Tracking calibration */ +} adi_adrv904x_TrackingCalibrationMask_e; + +typedef uint32_t adi_adrv904x_TrackingCalibrationMask_t; + +#define ADI_ADRV904X_TC_ALL_CALS ((adi_adrv904x_TrackingCalibrationMask_t)( ADI_ADRV904X_TC_RX_QEC_MASK \ + | ADI_ADRV904X_TC_TX_LOL_MASK \ + | ADI_ADRV904X_TC_TX_QEC_MASK \ + | ADI_ADRV904X_TC_TX_SERDES_MASK \ + | ADI_ADRV904X_TC_RX_ADC_MASK \ + | ADI_ADRV904X_TC_TX_LB_ADC_MASK \ + | ADI_ADRV904X_TC_ORX_ADC_MASK)) + +/** + * \brief Data structure to hold tracking calibration enable masks + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_TrackingCalEnableMasks +{ + adi_adrv904x_TrackingCalibrationMask_t enableMask[ADI_ADRV904X_NUM_TRACKING_CAL_CHANNELS]; +} adi_adrv904x_TrackingCalEnableMasks_t;) + +/** +* \brief Tracking calibration enable/disable flags +*/ +typedef enum adi_adrv904x_TrackingCalEnableDisable +{ + ADI_ADRV904X_TRACKING_CAL_DISABLE = 0, /*!< Disable tracking cals */ + ADI_ADRV904X_TRACKING_CAL_ENABLE = 1 /*!< Enable tracking cals */ +} adi_adrv904x_TrackingCalEnableDisable_e; + +/** +* \brief Tracking calibration states +*/ +typedef enum adi_adrv904x_TrackingCalStateFlag +{ + ADI_ADRV904X_TC_STATE_SUSPENDED = 0x01, /*!< Calibration is temporarily suspended */ + ADI_ADRV904X_TC_STATE_RESUMED = 0x02, /*!< Calibration is resumed for running */ + ADI_ADRV904X_TC_STATE_INACTIVE = 0x04, /*!< Calibration is not executing */ + ADI_ADRV904X_TC_STATE_RUNNING = 0x08, /*!< Calibration is executing */ + ADI_ADRV904X_TC_STATE_ENABLED = 0x10, /*!< Calibration is enabled*/ + ADI_ADRV904X_TC_STATE_DISABLED = 0x20, /*!< Calibration is disabled*/ + ADI_ADRV904X_TC_STATE_ERROR = 0x40, /*!< Calibration has errored. BBIC should re-run the cal. */ +} adi_adrv904x_TrackingCalStateFlag_e; +typedef uint8_t adi_adrv904x_TrackingCalStateFlag_t; + +/** + * \brief Data structure to hold tracking calibration state information + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_TrackingCalState +{ + adi_adrv904x_TrackingCalibrationMask_t calError[ADI_ADRV904X_NUM_TRACKING_CAL_CHANNELS]; + adi_adrv904x_TrackingCalStateFlag_t calState[ADI_ADRV904X_NUM_TRACKING_CAL_CHANNELS][7]; +} adi_adrv904x_TrackingCalState_t;) + +/** + * \brief Data structure to HRM data for one Tx channel + */ +typedef struct adi_adrv904x_TxHrmData +{ + uint8_t hrmCalData[TX_HRM_CAL_DATA_PER_CHANNEL_SIZE]; +} adi_adrv904x_TxHrmData_t; + +/** + * \brief Tx LOL Reset Type + */ +typedef enum adi_adrv904x_TxLolResetType +{ + ADI_ADRV904X_TX_LOL_SOFT_RESET = 0U, /*!< Channel Reset, not including the Atten Table*/ + ADI_ADRV904X_TX_LOL_HARD_RESET = 1U /*!< Reset LO Leakage, Tx-to-Lb Channel & LOL Actuator Data */ +} adi_adrv904x_TxLolResetType_e; + +/** + * \brief Data structure to reset Tx channel LOL + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_TxLolReset +{ + uint32_t channelMask; /*!< selected Tx channels to be reset */ + adi_adrv904x_TxLolResetType_e resetType; /*!< reset type */ +} adi_adrv904x_TxLolReset_t;) + +/** + * \brief Tx QEC Reset Type + */ +typedef enum adi_adrv904x_TxQecResetType +{ + ADI_ADRV904X_TX_QEC_TRACKING_HARD_RESET = 0U, /*!< Combination of QEC & Channel Reset */ + ADI_ADRV904X_TX_QEC_TRACKING_QEC_RESET, /*!< Reset Model of Quadrature Error Correction; Note QEC Performance will Degrade */ + ADI_ADRV904X_TX_QEC_TRACKING_CHANNEL_RESET, /*!< Tx-to-Lb Channel Reset; Note QEC Performance is maintained */ +} adi_adrv904x_TxQecResetType_e; + +/** + * \brief Data structure to reset Tx channel QEC + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_TxQecReset +{ + uint32_t channelMask; /*!< selected Tx channels to be reset */ + adi_adrv904x_TxQecResetType_e resetType; /*!< reset type */ +} adi_adrv904x_TxQecReset_t;) + +#endif /* __ADRV904X_CAL_TYPES_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_carrier_reconfigure_common_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_carrier_reconfigure_common_types.h new file mode 100644 index 00000000000..54c0a8996b1 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_carrier_reconfigure_common_types.h @@ -0,0 +1,280 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2023 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adi_adrv904x_carrier_reconfigure_common_types.h + * + * \brief Contains ADRV904X Carrier Reconfigure Common data structures. + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADI_ADRV904X_CARRIER_RECONFIGURE_TYPES_COMMON_H__ +#define __ADI_ADRV904X_CARRIER_RECONFIGURE_TYPES_COMMON_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_version_types.h" +#include "adi_adrv904x_cpu_error_codes_types.h" + +/** + * \brief Total number of allowable links that can accommodate carrier data + */ +#define ADI_ADRV904X_MAX_CARRIER_LINKS (2U) + +/** + * \brief Total number of CC XBAR indices available for each link + */ +#define ADI_ADRV904X_MAX_CARRIER_SLOTS (192U) + +/** + * \brief Total number of allowable filter coefficients for all carriers + */ +#define ADI_ADRV904X_NUM_CF_COEFFICIENTS (648U) + +/** + * \brief Max number of coefficients loaded per firmware transaction + */ +#define ADI_ADRV904X_CHAN_FILTER_COEFF_LOAD_LEN (256U) + +/** + * \brief Total number of allowable carriers per channel + */ +#define ADI_ADRV904X_MAX_CARRIERS (8U) + +/** + * \brief Enum of Channel Filter applications + */ +typedef enum adi_adrv904x_CarrierFilterApplicationType +{ + ADI_ADRV904X_CARRIER_FILTER_5G, + ADI_ADRV904X_CARRIER_FILTER_LTE, + ADI_ADRV904X_CARRIER_FILTER_HIGH_BW_5G, + ADI_ADRV904X_CARRIER_FILTER_LTE_IOT +} adi_adrv904x_CarrierFilterApplicationType_e; + +/** + * \brief Enum to hold values when configuring adi_adrv904x_CarrierXbarCfg_t struct + */ +typedef enum adi_adrv904x_JesdComponentCarrierXbar +{ + ADI_ADRV904X_CARRIER_0_DATA_I = 0, + ADI_ADRV904X_CARRIER_0_DATA_Q = 1, + ADI_ADRV904X_CARRIER_1_DATA_I = 2, + ADI_ADRV904X_CARRIER_1_DATA_Q = 3, + ADI_ADRV904X_CARRIER_2_DATA_I = 4, + ADI_ADRV904X_CARRIER_2_DATA_Q = 5, + ADI_ADRV904X_CARRIER_3_DATA_I = 6, + ADI_ADRV904X_CARRIER_3_DATA_Q = 7, + ADI_ADRV904X_CARRIER_4_DATA_I = 8, + ADI_ADRV904X_CARRIER_4_DATA_Q = 9, + ADI_ADRV904X_CARRIER_5_DATA_I = 10, + ADI_ADRV904X_CARRIER_5_DATA_Q = 11, + ADI_ADRV904X_CARRIER_6_DATA_I = 12, + ADI_ADRV904X_CARRIER_6_DATA_Q = 13, + ADI_ADRV904X_CARRIER_7_DATA_I = 14, + ADI_ADRV904X_CARRIER_7_DATA_Q = 15, + ADI_ADRV904X_CARRIER_8_DATA_I = 16, + ADI_ADRV904X_CARRIER_8_DATA_Q = 17, + ADI_ADRV904X_CARRIER_9_DATA_I = 18, + ADI_ADRV904X_CARRIER_9_DATA_Q = 19, + ADI_ADRV904X_CARRIER_10_DATA_I = 20, + ADI_ADRV904X_CARRIER_10_DATA_Q = 21, + ADI_ADRV904X_CARRIER_11_DATA_I = 22, + ADI_ADRV904X_CARRIER_11_DATA_Q = 23, + ADI_ADRV904X_CARRIER_12_DATA_I = 24, + ADI_ADRV904X_CARRIER_12_DATA_Q = 25, + ADI_ADRV904X_CARRIER_13_DATA_I = 26, + ADI_ADRV904X_CARRIER_13_DATA_Q = 27, + ADI_ADRV904X_CARRIER_14_DATA_I = 28, + ADI_ADRV904X_CARRIER_14_DATA_Q = 29, + ADI_ADRV904X_CARRIER_15_DATA_I = 30, + ADI_ADRV904X_CARRIER_15_DATA_Q = 31, + ADI_ADRV904X_CARRIER_UNUSED_CC_XBAR = 128 +} adi_adrv904x_JesdComponentCarrierXbar_e; + +/** + * \brief Data structure to hold Carrier Channel Filter Applications + * 2-D array where first index maps to the profile and the second index is the carrier + * Each enabled carrier in each valid profile should have a valid application select + */ +ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_CarrierChannelFilterApplicationSel +{ + adi_adrv904x_CarrierFilterApplicationType_e channelFilterApplicationSel[ADI_ADRV904X_MAX_CARRIERS]; /*!< Application select for each carrier in each profile */ +} adi_adrv904x_CarrierChannelFilterApplicationSel_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold Carrier reconfigure settings + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_CarrierCfg +{ + uint8_t enable; /*!< Set to 1 to enable; 0 to disable, this carrier */ + uint32_t sampleRate_kHz; /*!< Sample frequency in KHz for this carrier */ + uint32_t ibw_kHz; /*!< IBW frequency in KHz for this carrier */ + uint32_t centerFrequency_kHz; /*!< Center frequency in KHz for this carrier */ + uint16_t absLatencyOverride_ns; /*!< Option to specify a custom target for carrier's absolute latency. Set to 0 to ignore and use default latency */ +} adi_adrv904x_CarrierCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold settings needed for runtime carrier operation + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_CarrierRuntime +{ + uint8_t carrierEnable[ADI_ADRV904X_MAX_CARRIERS]; /*!< Carrier enable flag */ + uint8_t bandSelect[ADI_ADRV904X_MAX_CARRIERS]; /*!< Band select */ + uint8_t mixerEnable[ADI_ADRV904X_MAX_CARRIERS]; /*!< Mixer enable flag */ + uint32_t decimationRatio[ADI_ADRV904X_MAX_CARRIERS]; /*!< JESD interface decimation ratio */ + uint32_t interpolationRatio[ADI_ADRV904X_MAX_CARRIERS]; /*!< JESD interface interpolation ratio */ + uint32_t ncoFreq_kHz[ADI_ADRV904X_MAX_CARRIERS]; /*!< NCO frequency */ + uint32_t carrierRateRatio[ADI_ADRV904X_MAX_CARRIERS]; /*!< JESD carrier rate ratio */ + uint32_t outputRate_kHz[ADI_ADRV904X_MAX_CARRIERS]; /*!< Carrier output rate in relation to band */ +} adi_adrv904x_CarrierRuntime_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold carrier xbar entry settings + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_CarrierXbarCfg +{ + uint8_t channelSelect; /*!< Channel select: 0 -> Channel 0, 1 -> Channel 1, etc */ + adi_adrv904x_JesdComponentCarrierXbar_e carrierSelect; /*!< Carrier select */ + uint16_t sampleSelect; /*!< Sample index. Number of samples per frame = Link rate / carrier sample rate */ +} adi_adrv904x_CarrierXbarCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold carrier link settings + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_LinkCfg +{ + adi_adrv904x_CarrierXbarCfg_t carrierXbarCfg[ADI_ADRV904X_MAX_CARRIER_SLOTS]; +} adi_adrv904x_LinkCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold carrier JESD settings + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_CarrierJesdCfg +{ + adi_adrv904x_LinkCfg_t linkCfg[ADI_ADRV904X_MAX_CARRIER_LINKS]; /*!< Holds JESD settings if required based on reconfig settings */ +} adi_adrv904x_CarrierJesdCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold Carrier data for dynamic reconfiguration + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_CarrierRadioCfg +{ + uint32_t channelMask; /*!< Channel Mask selection */ + adi_adrv904x_CarrierCfg_t carriers[ADI_ADRV904X_MAX_CARRIERS]; /*!< Array of settings for all possible carriers */ +} adi_adrv904x_CarrierRadioCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure for hold Carrier data for dynamic reconfiguration + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_CarrierRadioCfgCmd +{ + adi_adrv904x_CarrierRadioCfg_t carrierRadioCfg; /*!< carrierRadioCfg passed into the BBIC API */ + uint8_t apply; /*!< Set to 1 to apply config to HW; 0 to skip and leave HW unchanged */ +} adi_adrv904x_CarrierRadioCfgCmd_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold Carrier data for dynamic reconfiguration + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_ChannelFilterCarrierCfg +{ + uint16_t numberOfFilterTaps[ADI_ADRV904X_MAX_CARRIERS]; /*!< Number of filter taps per carrier */ + uint8_t asymmetricFilterTaps[ADI_ADRV904X_MAX_CARRIERS]; /*!< Asymmetric flag for each carrier */ +} adi_adrv904x_ChannelFilterCarrierCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold Carrier data for dynamic reconfiguration + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_ChannelFilterOutputCfg +{ + uint16_t numberOfFilterTaps[ADI_ADRV904X_MAX_CARRIERS]; /*!< Number of filter taps per carrier */ + uint16_t oddFilterTaps[ADI_ADRV904X_MAX_CARRIERS]; /*!< Odd Filter Taps flag (0 or 1) per carrier */ + uint16_t dataPipeStop[ADI_ADRV904X_MAX_CARRIERS]; /*!< Channel Filter Data pipe Stop (End Bank) per carrier */ + uint16_t bypassFilter[ADI_ADRV904X_MAX_CARRIERS]; /*!< Channel Filter Bypass value per carrier */ +} adi_adrv904x_ChannelFilterOutputCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold Carrier data for dynamic reconfiguration + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_ChannelFilterCfg +{ + int16_t coeffs[ADI_ADRV904X_NUM_CF_COEFFICIENTS]; /*!< Coefficient table for carriers. Zero-pad as necessary */ + adi_adrv904x_ChannelFilterCarrierCfg_t carrierFilterCfg; /*!< Holds channel filter config for each carrier */ +} adi_adrv904x_ChannelFilterCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Channel Filter load + */ +ADI_ADRV904X_PACKED( + typedef struct adi_adrv904x_ChannelFilterLoad +{ + uint16_t coeffIdx; /*!< Starting index where to place the coefficients */ + uint16_t coeffNum; /*!< Number of coefficients in payload */ + + /* Debug data payload follows command header. + * This can't be declared here due to the API's use of the -Wpedantic compiler option. + * int16_t coeffs[]; + */ +} adi_adrv904x_ChannelFilterLoad_t; ) + +/** + * \brief Channel Filter load + * Used to determine the maximum debug payload size. + * \note Not instantiated. Only for size calculations. + */ +typedef struct adi_adrv904x_ChannelFilterLoadMaxSize +{ + adi_adrv904x_ChannelFilterLoad_t channelFilterLoad; + int16_t coeffs[ADI_ADRV904X_CHAN_FILTER_COEFF_LOAD_LEN]; /*!< Debug data */ +} adi_adrv904x_ChannelFilterLoadMaxSize_t; + +/** + * \brief Carrier channel filter load response used to check for FW errors + */ +ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_ChannelFilterLoadResp +{ + adi_adrv904x_CpuErrorCode_t status; /*!< CPU error status code */ +} adi_adrv904x_ChannelFilterLoadResp_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Carrier channel filter load response used to check for FW errors + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_ChannelFilterResp +{ + adi_adrv904x_CpuErrorCode_t status; /*!< CPU error status code */ + adi_adrv904x_ChannelFilterOutputCfg_t carrierFilterOutCfg; /*!< Output of carrier filter calculation */ +} adi_adrv904x_ChannelFilterResp_t; +ADI_ADRV904X_PACK_FINISH + +#endif /* __ADI_ADRV904X_CARRIER_RECONFIGURE_TYPES_COMMON_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_carrier_reconfigure_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_carrier_reconfigure_types.h new file mode 100644 index 00000000000..7f8c5f5bc8a --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_carrier_reconfigure_types.h @@ -0,0 +1,187 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2023 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adi_adrv904x_carrier_reconfigure_types.h + * + * \brief Contains ADRV904X Carrier Reconfigure data structures. + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADI_ADRV904X_CARRIER_RECONFIGURE_TYPES_H__ +#define __ADI_ADRV904X_CARRIER_RECONFIGURE_TYPES_H__ + +#include "adi_adrv904x_tx_types.h" +#include "adi_adrv904x_carrier_reconfigure_common_types.h" + +/** + * \brief Max number of carrier configurations allowed + */ +#define ADI_ADRV904X_MAX_NUM_PROFILES (4U) +#define ADI_ADRV904X_MAX_NO_OF_JESD_IFACE_SLOTS (16U) +#define ADI_ADRV904X_MIN_NO_OF_JESD_IFACE_SLOTS (8U) +#define ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS (64U) +#define ADI_ADRV904X_NO_OF_CARRIER_DELAY_FIFOS (8U) +#define ADI_ADRV904X_NO_OF_CHAN_FILTER_DATA_PIPE_TIERS (3U) +#define ADI_ADRV904X_NO_OF_BANDS (2U) + +/** + * \brief Crossbar mux to route sample through component carrier chain. Only first M values are valid and used + */ +typedef struct adi_adrv904x_JesdComponentCarrierXbarOutput +{ + uint8_t channelSelect; /*!< Rx/Tx slice selection */ + adi_adrv904x_JesdComponentCarrierXbar_e carrierSelect; /*!< Carrier select*/ + adi_adrv904x_JesdComponentCarrierXbar_e slotSelect; /*!< Carrier slot selection */ +} adi_adrv904x_JesdComponentCarrierXbarOutput_t; + + +/** + * \brief Struct to hold calculated output carrier jesd link settings + */ +typedef struct adi_adrv904x_LinkCfgOut +{ + adi_adrv904x_JesdComponentCarrierXbarOutput_t jesdCfg[ADI_ADRV904X_MAX_CARRIER_SLOTS]; +} adi_adrv904x_LinkCfgOut_t; + +/** + * \brief Struct to hold calculated output carrier jesd settings + */ +typedef struct adi_adrv904x_CarrierReconfigJesdOut +{ + adi_adrv904x_LinkCfgOut_t linkCfg[ADI_ADRV904X_MAX_CARRIER_LINKS]; +} adi_adrv904x_CarrierReconfigJesdOut_t; + + +/** + * \brief Holds jesd values used only for calculation + */ +typedef struct adi_adrv904x_CarrierJesdInternalCfg +{ + uint32_t frequencyKhz; /*!< JESD interface frequency */ + uint16_t divide; /*!< JESD interface divide value */ + uint16_t numSlots; /*!< JESD carrier slot table number of carrier slots. Support up to 64 */ + uint16_t initSlot; /*!< JESD interface initial slot to use in carrier slot table. With Koror HW, initslot is always 0 */ + uint16_t maxSlot; /*!< JESD interface max slot to use in carrier slot table: maxSlot = initSlot + numSlots. With Koror HW, initslot is always 0, so maxSlot = numSlots */ + uint16_t ifaceMaxSlot; /*!< JESD interface max slot. Supprts only 8 or 16. */ + uint16_t slotTable[ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS]; /*!< JESD carrier slot table. Size 64 */ + uint16_t ifaceSlotTable[ADI_ADRV904X_MAX_NO_OF_JESD_IFACE_SLOTS]; /*!< JESD interface slot table. Size 16 */ + uint64_t slotValid; /*!< JESD slot valid. 64bit value. Each bit associated with a carrier slot 0-63 */ + uint32_t jesdSampleRate_kHz[ADI_ADRV904X_MAX_CARRIERS]; /*!< JESD interface sample rate */ + uint32_t dummyIfaceSlotsRemoved[ADI_ADRV904X_MAX_CARRIERS]; /*!< Counter used during shuffling to temporarily remove dummy slots during the process */ +} adi_adrv904x_CarrierJesdInternalCfg_t; + +typedef struct adi_adrv904x_CarrierFilterDelay +{ + uint32_t tap; /*!< Filter Tap Delay */ + uint32_t pipe; /*!< Filter Pipe Delay */ +} adi_adrv904x_CarrierFilterDelay_t; + +typedef struct adi_adrv904x_CarrierGroupDelayComp +{ + adi_adrv904x_CarrierFilterDelay_t cfilt; /*!< Channel Filter Delay values */ + adi_adrv904x_CarrierFilterDelay_t halfBand; /*!< Half-band Filter Delay values */ + uint32_t deinterleaver; /*!< Inherent delay in Slot Table Deinterleaver position */ + uint32_t gainResrc; /*!< Shared Resource Delay */ + uint32_t matchEnabled; /*!< Delay due to enabling on-chip Delay matching HW (Delay Buffer FIFOs) */ + uint32_t bandAlignDelay; /*!< Delay due to band clk alignment */ +} adi_adrv904x_CarrierGroupDelayComp_t; + +typedef struct adi_adrv904x_CarrierHwDelayBufferConfig +{ + uint16_t carrierSelect[ADI_ADRV904X_NO_OF_CARRIER_DELAY_FIFOS]; /*!< HW Carrier select for each Delay FIFO in HW */ + uint16_t delayValue[ADI_ADRV904X_NO_OF_CARRIER_DELAY_FIFOS]; /*!< HW Delay buffers counts per carrier (offset_carr_samples) translated to Delay FIFO values in HW*/ + uint16_t cmpEn; /*!< HW cmpEn HW setting */ + uint16_t memEn; /*!< HW memEn HW setting */ + uint16_t daisyEn; /*!< HW daisyEn HW setting */ +} adi_adrv904x_CarrierHwDelayBufferConfig_t; + +/* These are the parameters that are used to calculate delays within the CDUC or CDDC, add to Band delay, and to determine the Delay Buffer Values to apply */ +typedef struct adi_adrv904x_CarrierDelayParameters +{ + uint16_t noOfCarriers; + uint32_t jesdFrequency_kHz; + uint16_t clkToJesdRatioLog2; + uint16_t carrSamplePeriod_cc[ADI_ADRV904X_MAX_CARRIERS]; /*!< Carrier sample period in units of hsdig cc's */ + adi_adrv904x_CarrierGroupDelayComp_t carrierComponents[ADI_ADRV904X_MAX_CARRIERS]; /*!< Used to track CDUC/CDDC internal component delays. Not all fields applicable to both */ + uint16_t groupDelayBand_cc[ADI_ADRV904X_MAX_CARRIERS]; /*!< Inherent group delay per carrier in its assigned Band DUC/DDC alone */ + uint16_t groupDelayCarr_cc[ADI_ADRV904X_MAX_CARRIERS]; /*!< Inherent group delay per carrier in the CDUC or CDDC alone */ + uint16_t groupDelayComb_cc[ADI_ADRV904X_MAX_CARRIERS]; /*!< Combined group delay per carrier: groupDelayBand_cc + groupDelayCarr_cc*/ + uint16_t targetDelay_cc[ADI_ADRV904X_MAX_CARRIERS]; /*!< Target delay per carrier */ + uint16_t uncompOffset_cc[ADI_ADRV904X_MAX_CARRIERS]; /*!< Initial/uncompensated offset (e.g. w/0 integer sample delay buffers) to add to combined group delay to match target: offset_ideal_cc[i] = targetDelay_cc[i] - groupDelayComb_cc[i] */ + uint16_t compIntSamples[ADI_ADRV904X_MAX_CARRIERS]; /*!< Integer number of Carrier Sample Periods to use in Delay Compensation per carrier */ + uint16_t comp_cc[ADI_ADRV904X_MAX_CARRIERS]; /*!< Delay compensation provided by compIntSamples buffers in units of hsdig cc's: compIntSamples[i] * carrSamplePeriod_cc[i] */ + uint16_t finalDelayTotal_cc[ADI_ADRV904X_MAX_CARRIERS]; /*!< Final Overall Delays that sum Band DUC/DDC + CDUC/CDDC grp delay + delay elements. groupDelayComb_cc + offset_actual_cc */ + uint16_t finalDelayCarr_cc[ADI_ADRV904X_MAX_CARRIERS]; /*!< Final delay through the CDUC/CDDC alone, including delay elements: finalDelayTotal_cc - groupDelayBand_cc */ + uint32_t finalDelayTotal_ns[ADI_ADRV904X_MAX_CARRIERS]; /*!< Final Overall Delays that sum Band DUC/DDC + CDUC/CDDC grp delay + delay elements. finalDelayTotal_cc[i] * T_hsdigclk_ns */ + uint32_t finalDelayCarr_ns[ADI_ADRV904X_MAX_CARRIERS]; /*!< Final delay through the CDUC/CDDC alone, including delay elements: finalDelayCarr_cc[i] * T_hsdigclk_ns */ + int16_t delayDiffPerCarrier_cc[ADI_ADRV904X_MAX_CARRIERS]; /*!< Delta between target delay and final delay per carrier: targetDelay_cc - finalDelayTotal_cc (Check order/sign) */ + int16_t delayMismatch_cc; /*!< Largest error between any 2 carriers: max(delayDiffPerCarrier_cc[]) - min(delayDiffPerCarrier_cc[]) */ + adi_adrv904x_CarrierHwDelayBufferConfig_t bufferCfg; /*!< HW configuration to apply to Delay Buffers */ +} adi_adrv904x_CarrierDelayParameters_t; + +/** +* \brief Struct used to hold profile specific output data for both Tx & Rx +*/ +typedef struct adi_adrv904x_CarrierReconfigProfileCfgOut +{ + adi_adrv904x_CarrierJesdInternalCfg_t internalJesdCfg; /*!< Internal JESD settings for carrier reconfig */ + adi_adrv904x_CarrierRuntime_t carrierCfgs; /*!< Array of settings for all possible carriers */ + adi_adrv904x_CarrierDelayParameters_t delayCfg; /*!< Holds internal delay settings written to part */ + uint16_t band0Atten; /*!< Band0 attenuation value. Only used for Tx */ + uint16_t band1Atten; /*!< Band1 attenuation value. Only used for Tx */ + uint32_t carriersEnabled; /*!< Bitmask for all enabled carriers */ +} adi_adrv904x_CarrierReconfigProfileCfgOut_t; + +/** + * \brief Holds stored Input values from a ReconfigSolve() so that they can be used on next ReconfigApply() + */ +typedef struct adi_adrv904x_CarrierReconfigInput +{ + adi_adrv904x_CarrierJesdCfg_t jesdCfg; /*!< Copy of input to Solve() function */ + uint32_t numProfiles; /*!< Copy of input to Solve() function. Number of profiles that are used. Only first N=numCarrierProfiles are populated */ + adi_adrv904x_CarrierRadioCfg_t profileCfgs[ADI_ADRV904X_MAX_NUM_PROFILES]; /*!< Copy of input to Solve() function, but enough memory for all 4 profiles */ +} adi_adrv904x_CarrierReconfigInput_t; + + +/** + * \brief Holds calculated latency values for a single Tx or Rx Channel + */ +typedef struct adi_adrv904x_CarrierReconfigLatencyCfg +{ + uint32_t groupDelay[ADI_ADRV904X_MAX_CARRIERS]; /*!< Group delay */ + uint32_t clkCddcCducInkHz; /*!< CDDC/CDUC clock in kHz */ +} adi_adrv904x_CarrierReconfigLatencyCfg_t; + +/** + * \brief Holds calculated latency values per Channel + */ +typedef struct adi_adrv904x_CarrierReconfigLatencyCfgTop +{ + adi_adrv904x_CarrierReconfigLatencyCfg_t channel[ADI_ADRV904X_MAX_TXCHANNELS]; /*!< Internal use only: Latency Cfg Array for all Channels */ +} adi_adrv904x_CarrierReconfigLatencyCfgTop_t; + +/** + * \brief Holds stored Output values from a ReconfigSolve() so that they can be used on next ReconfigApply() + */ +typedef struct adi_adrv904x_CarrierReconfigOutput +{ + adi_adrv904x_CarrierReconfigProfileCfgOut_t profileCfgs[ADI_ADRV904X_MAX_NUM_PROFILES]; + adi_adrv904x_CarrierReconfigJesdOut_t jesdCfg; +} adi_adrv904x_CarrierReconfigOutput_t; + +/** + * \brief Holds stored Solution (both Input and Output values) from a ReconfigSolve() so that they can be used on next ReconfigApply() + */ +typedef struct adi_adrv904x_CarrierReconfigSoln +{ + adi_adrv904x_CarrierReconfigInput_t inputs; + adi_adrv904x_CarrierReconfigOutput_t outputs; +} adi_adrv904x_CarrierReconfigSoln_t; + +#endif /* __ADI_ADRV904X_CARRIER_RECONFIGURE_TYPES_H__ */ \ No newline at end of file diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_core.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_core.h new file mode 100644 index 00000000000..e60d30b6f72 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_core.h @@ -0,0 +1,585 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_core.h +* \brief Contains top level ADRV904X related function prototypes for +* adi_adrv904x_core.c +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#ifndef _ADI_ADRV904X_CORE_H_ +#define _ADI_ADRV904X_CORE_H_ + +#include "adi_adrv904x_error.h" + +/** + * \brief Acquires the device so that it can only be used only in the context of the calling + * thread until such time as adi_adrv904x_Unlock is called. + * + * Generally there is no need to explicitly lock or unlock a device before or after calling any + * API function with that device (each API function locks the device internally itself before + * carrying out it's actions and unlocks the device before returning). Any exceptions to this rule + * will be clearly documented. + * + * Uses adi_common_hal_Lock internally. See that function for important relevant information. + * + * \param[in,out] device Context variable -Pointer to ADRV904X device data structure containing settings + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + **/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Lock(adi_adrv904x_Device_t* const device); + +/** + * \brief Releases a device previously acquired by the calling thread. + * + * Only the thread that acquired the device can release the device. Attempting to release a device + * that has not been acquired by the calling thread results in undefined behavior. + * + * Uses adi_common_hal_Unlock internally. See that function for important relevant information. + * + * \param[in,out] device Context variable -Pointer to ADRV904X device data structure containing settings + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + **/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Unlock(adi_adrv904x_Device_t* const device); + +/** +* \brief Prepares the ADRV904X device for use. +* +* This function must be called on the device before any other function is called. The +* function must not be called more than once on the same device. +* +* Uses adi_common_hal_HwOpen internally. See that function for important relevant information. +* +* This API shall call the ADI HAL function adi_hal_HwOpen for +* ADRV904X Hardware initialization. This HAL function initializes all the external +* hardware blocks required in the operation of the ADRV904X device. +* This API will also set the HAL timeout limit for the HAL driver as per API +* requirements. +* +* \pre device->common.devHalInfo must be initialized with user values before this function +* is called. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to ADRV904X device data structure. adi_adrv904x_Device_t member +* devHalInfo shall be initialized with all the required information to initialize +* external Hardware required for ADRV904X operation for example +* power, pull ups, SPI master etc +* \param[in] spiSettings Pointer to adi_adrv9010_SpiSettings_t structure that contains SPI +* configuration parameters. These settings get copied into the device structure. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_HwOpen(adi_adrv904x_Device_t* const device, + const adi_adrv904x_SpiConfigSettings_t* const spiSettings); + +/** +* \brief Performs a hardware shutdown for ADRV904X Device. +* +* This API shall call the ADI HAL function adi_hal_HwClose for +* ADRV904X Hardware shutdown. This HAL function shuts down all the external +* hardware blocks required in the operation of the ADRV904X device. +* +* Uses adi_common_hal_HwClose internally. See that function for important relevant information. +* +* \pre This function may be called any time after device->common.devHalInfo has been +* initialized with user values +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to ADRV904X device data structure. adi_adrv904x_Device_t member +* devHalInfo shall be initialized with all the required information to initialize +* supporting Hardware for ADRV904X operation for example +* power, pull ups, SPI master etc +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_HwClose(adi_adrv904x_Device_t* const device); + +/** +* \brief Service to perform a HwReset for a device +* +* Calls the HAL to send the HwReset Signal and +* then reload the SPI Configuration for a given device +* +* \pre This function may be called any time after device->common.devHalInfo has been +* initialized with user values +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to ADRV904X device data structure containing settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_HwReset(adi_adrv904x_Device_t* const device); + +/** +* \brief Initializes the ADRV904X device based on the desired device settings. +* +* This function initializes the ADRV904X device, digital clocks, +* JESD204b settings, FIR Filters, digital filtering. It does not load the CPU +* or perform any of the CPU init calibrations. It leaves the +* ADRV904X in a state ready for multichip sync (which can bring up the JESD204 links), the +* CPU to be loaded, and the init calibrations run. +* +* \pre This function is the very first API to be called by the user to configure the device +* after all dependent data structures have been initialized +* +* \dep_begin +* \dep{device (all members)} +* \dep{init (all members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to ADRV904X device data structure +* \param[in] init Pointer to ADRV904X initialization settings structures +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Initialize(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Init_t* const init); + +/** +* \brief API To safely Shutdown ADRV904X +* +* The User should call this function to safely shutdown ADRV904X Device. +* The function performs a hardware reset to reset the ADRV904X Device into a safe +* state for shutdown or re-initialization. +* +* \pre This function may be called at any time but not before device->common.devHalInfo +* has been configured with user device settings +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to ADRV904X device data structure containing settings +* +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Shutdown(adi_adrv904x_Device_t* const device); + +/** +* \brief Sets up the transceiver to listen for incoming SYSREF pulses to synchronize the internal clock tree. +* +* When working with multiple transceivers or even only one transceiver that +* requires deterministic latency between the Tx and observation and or main +* Rx JESD204B data path, Multichip sync is necessary. This function should +* be run after all transceivers have finished the adi_adrv904x_initialize(), +* and after adi_adrv904x_CpuStart(). +* +* This function will reset the MCS state +* machine in the ADRV904X device. Calling the function again, will reset +* the state machine and expect the MCS sequence to start over. Since clocks +* will be adjusted, the transceiver should not be transmitting or receiving +* when this function is called. +* +* Typical sequence: +* 1) Initialize all ADRV904X devices in system using adi_adrv904x_initialize() +* 2) Run adi_adrv904x_MultichipSyncSet(). Make sure enableSync is 1. +* 3) Send at least 4 SYSREF pulses, and verify mcsStatus is set for each +* MCS step +* 4) Use adi_adrv904x_MultichipSyncStatusGet() to verify MCS. +* 4) Run adi_adrv904x_MultichipSyncSet(). Make sure enableSync is 0 +* to indicate end of MCS sequence. +* 5) Continue with init sequence ... init cals, etc +* +* +* \pre This function is called after the device has been initialized and PLL lock status has +* been verified. CPU must be running before calling this function. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -is a pointer to the device settings structure +* +* \param[in] enableSync is a 0/1 variable used to indicate MultiChipSync start/stop. +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_MultichipSyncSet(adi_adrv904x_Device_t* const device, + const uint8_t enableSync); +/** +* \brief Sets up the transceiver to perform MCS carrier reconfig. +* +* +* This function will reconfig the MCS state +* +* +* \pre This function is called when performing MCS reconfig +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -is a pointer to the device settings structure +* \param[in] mcsMode see adi_adrv904x_McsSyncMode_e +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_MultichipSyncSet_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_McsSyncMode_e mcsMode); + +/** +* \brief Reads back the multi-chip sync status +* +* After running adi_adrv904x_MultichipSyncSet(), this function can be used +* to verify that all the SYSREF pulses were received by the transceiver. +* +* Typical sequence: +* 1) Initialize all ADRV904X devices in system using adi_adrv904x_initialize() +* 2) Run adi_adrv904x_MultichipSyncSet() +* 3) Send at least 4 SYSREF pulses, and verify mcsStatus is set for each +* MCS step +* 4) Run adi_adrv904x_MultichipSyncStatusGet() verify mcsStatus +* 5) Continue with init sequence ... init cals, etc +* +* \pre This function is called after the device has been initialized and PLL lock status has +* been verified. CPU must be running before using the MCS functions. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -A pointer to the device settings structure +* \param[out] mcsStatus bit0 = 0 - no sync, bit0 = 1 - sync occurred; +* bit1 = 0 - reconfig no sync, bit1 = 1 - reconfig sync occurred; +* +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_MultichipSyncStatusGet(adi_adrv904x_Device_t* const device, + uint32_t* const mcsStatus); +/** +* \brief Verifies the init structure profiles are valid combinations +* +* This function checks that the Rx/Tx/ORx profiles. +* +* \pre This function is a helper function and does not need to be called +* directly by the user. +* +* \dep_begin +* \dep{device->devStateInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Structure pointer to ADRV904X device data structure +* \param[in] init Pointer to ADRV904X initialization settings structures +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ProfilesVerify(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Init_t* const init); + +/** +* \brief Sets the ADRV904X device SPI settings (3wire/4wire, msbFirst, etc). +* +* This function will use the settings in the passed spi structure parameter +* to set msbFirst/lsbFirst and 3wire/4wire mode for the ADRV904X SPI controller. +* The ADRV904X device always uses SPI MODE 0 (CPHA=0, CPOL=0) and a 16-bit +* instruction word. +* +* \pre This function is a helper function and does not need to be called +* directly by the user. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init->spiSettings->MSBFirst} +* \dep{init->spiSettings->fourWireMode} +* \dep_end +* +* \param[in,out] device Context variable -Structure pointer to ADRV904X device data structure +* \param[in] spiCtrlSettings Pointer to ADRV904X SPI controller settings - not platform hardware SPI settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE, if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SpiCfgSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_SpiConfigSettings_t* const spiCtrlSettings); + +/** +* \brief Gets the ADRV904X device SPI settings (3wire/4wire, msbFirst, etc). +* +* This function will use the settings in the passed spi structure parameter +* to get msbFirst/lsbFirst 3wire/4wire mode for the ADRV904X SPI controller. The ADRV904X device +* always uses SPI MODE 0 (CPHA=0, CPOL=0) and a 16-bit instruction word. +* +* \pre This function is a helper function and does not need to be called +* directly by the user. +* \pre Can only call this function if config has been set or SpiVerify +* returns with no errors +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init->spiSettings->MSBFirst} +* \dep{init->spiSettings->fourWireMode} +* \dep_end +* +* \param[in,out] device Context variable -Structure pointer to ADRV904X device data structure +* \param[out] spi Pointer to ADRV904X SPI controller settings - not platform hardware SPI settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE, if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SpiCfgGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiConfigSettings_t* const spi); + +/** +* \brief Enables/Disables ADRV904X Aux SPI interface. +* +* If enabling Aux SPI, selected GPIO pins for interface are acquired and configured for the user. +* If disabling Aux SPI, pin selections in the AuxSpiCfg input struct are ignored and any device +* GPIO pins currently selected for the interface are released and set back to default UNUSED. +* There are a limited set of GPIO pins available for use as Aux SPI Port pin. They are as follows: +* +* Aux CSB: GPIO[3], GPIO[16] +* Aux CLK: GPIO[2], GPIO[15] +* Aux SDIO: GPIO[0], GPIO[13] +* Aux SDO: GPIO[1], GPIO[14], or ADI_ADRV904X_GPIO_INVALID (if user only wants 3-wire mode Aux SPI) +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Structure pointer to ADRV904X device data structure +* \param[in] config Aux SPI Interface configuration to apply to device +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE, if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AuxSpiCfgSet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_AuxSpiConfig_t* const config); + +/** +* \brief Retrieves currently programmed Aux SPI interface configuration. +* +* This configuration includes whether the Aux SPI Interface is currently enabled or disabled. +* If AuxSPI is currently disabled, all pins in returned config struct will be set to +* ADI_ADRV904X_GPIO_INVALID. If AuxSPI is currently enabled, Aux CSB/CLK/SDIO/SDO pins in returned +* config struct will be set to the appropriate GPIO pins. If no GPIO pin is configured for a signal, +* the returned value will be ADI_ADRV904X_GPIO_INVALID. +* +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Structure pointer to ADRV904X device data structure +* \param[out] config Returned Aux SPI Interface configuration +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE, if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AuxSpiCfgGet( adi_adrv904x_Device_t* const device, + adi_adrv904x_AuxSpiConfig_t* const config); + +/** +* \brief Sets the ADRV904X device SPI runtime options, eg spi streaming, AHB modes. +* +* This function will return the current SPI runtime options that API functions use when deciding +* how a particular SPI transaction should be completed. For example, if a particular API is preparing +* to write a group of consecutive registers it will attempt to put the part in SPI streaming. However, by clearing +* the allowSpiStreaming bit this will prevent all APIs from using SPI streaming. +* +* SPI Streaming: This mode will automatically increment the SPI address in between SPI data words. This allows for +* faster SPI transactions since only a single address set is needed at the start of each transaction. +* Useful only when large, contiguous registers are accessed. +* +* AHB Auto Increment: Similar to SPI streaming, this mode automatically increments the register address accessed through +* the AHB indirect access (read-only). This allows for faster AHB transactions since only the start +* address is required to be written. The SPI address must be set each time the AHB data register is +* read, even if SPI Streaming is enabled. +* +* AHB FIFO Mode: Only available with SPI Streaming and AHB Auto Increment is enabled. This allows for zero wasted bytes during +* an AHB indirect access (read-only) by eliminating the need to set the SPI register address each time the +* AHB data word is read. +* +* \dep_begin +* \dep{spiOptions->allowAhbAutoIncrement} +* \dep{spiOptions->allowAhbSpiFifoMode} +* \dep{spiOptions->allowSpiStreaming} +* \dep_end +* +* \param[in,out] device Context variable -Structure pointer to ADRV904X device data structure +* \param[in] spiOptions Pointer to ADRV904X SPI runtime options settings that will return the current device settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE, if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SpiRuntimeOptionsSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_SpiOptions_t* const spiOptions); + +/** +* \brief Gets the ADRV904X device SPI runtime options, eg spi streaming, AHB modes. +* +* This function will return the current SPI runtime options that API functions use when deciding +* how a particular SPI transaction should be completed. For example, if a particular API is preparing +* to write a group of consecutive registers it will attempt to put the part in SPI streaming. However, by clearing +* the allowSpiStreaming bit this will prevent all APIs from using SPI streaming. +* +* \dep_begin +* \dep{spiOptions->allowAhbAutoIncrement} +* \dep{spiOptions->allowAhbSpiFifoMode} +* \dep{spiOptions->allowSpiStreaming} +* \dep_end +* +* \param[in,out] device Context variable -Structure pointer to ADRV904X device data structure +* \param[out] spiOptions Pointer to ADRV904X SPI runtime options settings that will return the current device settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE, if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SpiRuntimeOptionsGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiOptions_t* const spiOptions); + +/** +* \brief Verifies current SPI Configuration & Platform Driver +* +* This function validates the Platform SPI Driver can work with the SPI Modes configured via +* adi_adrv904x_SpiCfgSet & adi_adrv904x_SpiRuntimeOptionsSet. +* +* Single Register Access +* 1. Reads read only register to check SPI read operation. +* 2. Writes scratchpad register with 10110110, reads back the data +* 3. Writes scratchpad register with 01001001, reads back the data +* +* Multi Register Access (PreMcsInit/Initialize() Is Required to be complete for this step to be executed) +* 1. Write multi register scratchpad, reads back the data +* +* Depending on configuration provided to adi_adrv904x_SpiRuntimeOptionsSet, +* can be Streaming or Single Instruction Buffered Used to perform the write. +* +* See adi_adrv904x_user.h for Compile Time Debug Option ADI_ADRV904X_SPI_VERIFY +* This will enable SpiVerify() in PreMcsInit_NonBroadcast() +* +* \pre This function is a helper function and does not need to be called +* directly by the user. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Structure pointer to ADRV904X device data structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SpiVerify(adi_adrv904x_Device_t* const device); + +/** +* \brief Get API version number +* +* This function reads back the version number of the API +* +* \param[in,out] device Context variable -Pointer to the ADRV904X data structure +* \param[out] apiVersion Pointer to structure where API version information is returned +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ApiVersionGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_Version_t* const apiVersion); + +/** +* \brief Reads back the silicon revision for the ADRV904X Device +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Structure pointer to the ADRV904X data structure containing settings +* \param[in,out] siRevision Return value of the ADRV904X silicon revision +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeviceRevGet(adi_adrv904x_Device_t* const device, + uint8_t* const siRevision); + +/** +* \brief Reads back the Product ID for the ADRV904X Device +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Structure pointer to the ADRV904X data structure containing settings +* \param[in,out] productId Return value of the ADRV904X product Id +* +*| productId | Description | +*|:----------------:|:---------------| +*| TBD | TBD | + +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ProductIdGet(adi_adrv904x_Device_t* const device, + uint8_t* const productId); + +/** +* \brief Reads back the DeviceCapability for the ADRV904X Device +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Structure pointer to the ADRV904X data structure containing settings +* \param[out] devCapability Structure pointer to return device hardware capability +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeviceCapabilityGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_CapabilityModel_t* const devCapability); + +/** +* \brief Configures SPI DOUT pin drive strength. driveStrength is a 3 bit value where 0x00 lowest drive strength and +* 0x03 is highest strength +* +* \deprecated +* +* This function will be called with adi_adrv904x_SpiConfigSettings_t->cmosPadDrvStrength during HW opening. +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Structure pointer to the ADRV904X data structure containing settings +* \param[in] driveStrength Drive strength value to be set. IMPORTANT: adi_adrv904x_CmosPadDrvStr_e +* must be used to set these values due to backward compatiblity requirements. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SpiDoutPadDriveStrengthSet(adi_adrv904x_Device_t* const device, + const uint8_t driveStrength); +/** + * \brief Sets the Hysteresis for the SPI Feature + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] enable Enable Flag + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SpiHysteresisSet( adi_adrv904x_Device_t* const device, + const uint32_t enable); + +/** + * \brief Sets the Hysteresis for the All Digital Pin Features + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] enable Enable Flag + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DigitalHysteresisSet( adi_adrv904x_Device_t* const device, + const uint32_t enable); + +#endif diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu.h new file mode 100644 index 00000000000..c3d7e744a60 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu.h @@ -0,0 +1,647 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_cpu.h +* \brief Contains ADRV904X processor function prototypes for +* adi_adrv904x_cpu.c +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#ifndef _ADI_ADRV904X_CPU_H_ +#define _ADI_ADRV904X_CPU_H_ + +#include "adi_adrv904x_cpu_types.h" +#include "adi_adrv904x_error.h" +#include "adi_adrv904x_cpu_log_types.h" +#include "adi_adrv904x_cpu_sys_types.h" +#include "adi_adrv904x_cpu_sw_bkpt_types.h" +#include "adi_adrv904x_cpu_health_monitor_types.h" +#include "adi_common_error_types.h" + +/** +* \brief Loads binary array into CPU program memory +* +* This function sets the CPU DMA control register bits for an CPU memory write, auto-incrementing +* the address. Valid memory addresses are: Program Memory (0x01000000 - 0x0104FFFF) +* +* The top level application reads the binary file, parsing it into any array, starting at the first data byte +* on the first line of the file. The array is passed to this function and writes it to CPU program memory. Any non-data +* bytes should be excluded from the binary array when parsing. +* +* \pre This function is called after the device has been initialized, PLL lock status has been verified, and +* the stream binary has been loaded +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device data structure containing settings +* \param[in] cpuType type of cpu +* \param[in] byteOffset Offset (starting from 0) of where to place the binary +* array in CPU memory (if loaded in multiple function +* calls) +* \param[in] binary Byte array containing all valid FW file data bytes +* \param[in] byteCount The number of bytes in the binary array +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuImageWrite(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType, + const uint32_t byteOffset, + const uint8_t binary[], + const uint32_t byteCount); + +/** +* \brief Writes the ADRV904X CPU device profile binary +* +* The top level application reads the binary file, parsing it into any array, starting at the first data byte +* on the first line of the file. The array is passed to this function and writes it to CPU device profile memory. Any non-data +* bytes should be excluded from the binary array when parsing. +* +* \pre This function is called before adi_adrv904x_CpuStart(), and +* this function must be called after loading the firmware. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device data structure containing settings +* \param[in] byteOffset Offset (starting from 0) of where to place the binary +* array in CPU memory (if loaded in multiple function +* calls) +* \param[in] binary Byte array containing all valid FW file data bytes +* \param[in] byteCount The number of bytes in the binary array +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuProfileWrite(adi_adrv904x_Device_t * const device, + const uint32_t byteOffset, + const uint8_t binary[], + const uint32_t byteCount); + +/** +* \brief Start the CPU(s) +* +* Sets run bit to 1. Then wait and check for FW Status. +* +* +* \pre This function is called after the device has been initialized and before multichip-sync +* (MCS) has been completed +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuStart(adi_adrv904x_Device_t* const device); + +/** +* \brief A polling wait for the CPU status to be ready. +* +* Polls firmware status (fwStatus) until it becomes ADRV904X_CPU_FW_STATUS_READY, +* ADRV904X_CPU_FW_STATUS_CPU_DEBUG_READY, any of the error states or a timeout occurs. +* +* If a previous call to this function returned with fwStatus as ADRV904X_CPU_FW_STATUS_CPU_DEBUG_READY +* then even if fwStatus becomes STATUS_CPU_DEBUG_READY during the timeout period wait until the timeout +* duration to see if it becomes STATUS_READY. At that point return based on the fwStatus. +* +* Returns and error if fwStatus becomes any of the firmware error states. Calls adi_adrv904x_HwReset if +* fwStatus becomes LDO config error. +* +* \pre This function is called after the device has been initialized and before multichip-sync +* (MCS) has been completed. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] timeout_us Timeout to stop waiting for CPU to boot up. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuStartStatusCheck(adi_adrv904x_Device_t* const device, + const uint32_t timeout_us); + +/** +* \brief Sets the specified Set Config in the adrv904x_CpuCmd_SetConfig_t structure. +* +* \pre This function can be called after the CPU has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] objId Object ID of calibration or system component +* \param[in] offset Offset into the configuration structure +* \param[in] configDataSet Configuration data for Set. Size of configDataSet must be equal or greater than length param. +* \param[in] length Length of the configuration in bytes +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuConfigSet( adi_adrv904x_Device_t* const device, + const uint32_t objId, + const uint16_t offset, + const uint8_t configDataSet[], + const uint32_t length); + +/** +* \brief Gets the specified Get Config in the adrv904x_CpuCmd_GetConfig_t structure. +* +* \pre This function can be called after the CPU has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] objId Object ID of calibration or system component +* \param[in] offset Offset into the configuration structure +* \param[in, out] configDataGet Configuration data for Get. Size of configDataGet must be equal or greater than length param. +* \param[in] length Length of the configuration in bytes +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuConfigGet( adi_adrv904x_Device_t* const device, + const uint32_t objId, + const uint16_t offset, + uint8_t configDataGet[], + const uint32_t length); + +/** +* \brief Enable CPU debug mode with enableKey. +* +* \pre This function can be called after the CPU has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] enableKey key to enable CPU Debug +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuDebugModeEnable(adi_adrv904x_Device_t* const device, + const uint32_t enableKey); + +/** +* \brief Set Cpu Config Unlock with configKey. +* +* \pre This function can be called after the CPU has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] configKey key to unlock Cpu Config +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuConfigUnlock(adi_adrv904x_Device_t* const device, + const uint32_t configKey); + + /** +* \brief Sets the specified Set Ctrl in the adrv904x_CpuCmd_SetCtrl_t structure. +* +* \pre This function can be called after the CPU has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] objId Object ID of calibration or system component +* \param[in] cpuCmd Command to be executed +* \param[in] channel channel enum +* \param[in] cpuCtrlData Pointer to data to send TO the CPU +* \param[in] lengthSet Length of cpuCtrlData, in bytes, if 0, cpuCtrlData can be NULL +* \param[out] lengthResp Length of data received FROM the CPU into ctrlResp buffer, in bytes +* \param[out] ctrlResp Pointer to buffer in which data FROM the CPU should be received. +* \param[in] lengthGet Size of ctrlResp buffer, in bytes. MUST be greater than or equal to lengthResp. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuControlCmdExec(adi_adrv904x_Device_t* const device, + const uint32_t objId, + const uint16_t cpuCmd, + const adi_adrv904x_Channels_e channel, + const uint8_t cpuCtrlData[], + const uint32_t lengthSet, + uint32_t* const lengthResp, + uint8_t ctrlResp[], + const uint32_t lengthGet); + +/** +* \brief Configure CPU log filter settings +* +* \pre This function can be called after the CPU has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] eventFilter Specifies the highest severity event to log. For example, if ADI_ADRV904X_CPU_LOG_EVENT_WARNING +* is selected, WARNING and ERROR events will be logged, but INFO and INFO_2 will not. Set to INVALID +* if this option should be ignored. +* \param[in] cpuIdFilter Bitmask that specifies the CPU(s) on which logging should be enabled. A single CPU can be specified, +* or NONE (logging disabled), or ALL. Set to INVALID if this option should be ignored. +* \param[in] objIdFilter Specifies the CPU object ID that should be logged. Setting objIdFilter.objIdFilterEnable to DISABLE allows +* logging from all object IDs (and objIdFilter.objId is ignored). Setting objIdFilter.objIdFilterEnable +* to ENABLE and setting objIdFilter.objId to a valid CPU object ID (see adrv904x_CpuObjectId_e) enables +* logging for only the specified object ID. Set to objIdFilterEnable to INVALID if this option should be +* ignored. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuLogFilterSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuLogEvent_e eventFilter, + const adi_adrv904x_CpuLogCpuId_e cpuIdFilter, + const adi_adrv904x_CpuLogObjIdFilter_t* const objIdFilter); + +/** +* \brief Sets the specified Cpu Debug command in the adrv904x_CpuCmd_Debug_t structure. +* +* \pre This function can be called after the CPU has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] objId Object ID of calibration or system component +* \param[in] cpuCmd Command to be executed +* \param[in] channel channel enum +* \param[in] cpuDebugData Debug data for Debug command. +* \param[in] lengthSet Length of the Debug data in bytes +* \param[out] lengthResp Length of the Control set command response in bytes +* \param[in, out] debugResp Debug response buffer. +* \param[in] lengthGet Length of response buffer in bytes.MUST be greater than or equal to lengthResp. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuDebugCmdExec( adi_adrv904x_Device_t* const device, + const uint32_t objId, + const uint16_t cpuCmd, + const adi_adrv904x_Channels_e channel, + const uint8_t cpuDebugData[], + const uint32_t lengthSet, + uint32_t* const lengthResp, + uint8_t debugResp[], + const uint32_t lengthGet); + +/** +* \brief Get the CPU index assigned to all JESD deserializer lanes in an array format. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Context variable -A pointer to the device settings structure +* \param[in, out] cpuTypes array which will contain what CPU is assigned to the associated channel number +* based on index position i.e. cpuTypes[0] is ADI_ADRV904X_CH1, cpuTypes[1] is ADI_ADRV904X_CH2, etc. +* \param[in] numSerdesLanes number of deserializer lanes desired to be inspected. Should be ADI_ADRV904X_MAX_SERDES_LANES to +* inspect all lanes. If smaller, will only inspect up to the index provided, e.g. 4 will look only up to ADI_ADRV904X_CH4 +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuChannelMappingGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_CpuType_e cpuTypes[], + const uint8_t numSerdesLanes); + +/** +* \brief Returns detailed status information specific to the private cpu system component +* +* \pre This function may be called any time after the device has been initialized, and +* initialization calibrations have taken place +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Context variable -A pointer to the device settings structure +* \param[in] channel Channel selection to read back cal status. Must be a single channel +* \param[in] objId Object ID of cpu system component +* \param[in, out] cpuSysStatusGet Status of the cpu system component. Size of cpuSysStatusGet must be equal or greater than length param. +* \param[in] length Length of the configuration in bytes +* +* \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuSysPvtStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + const uint32_t objId, + uint8_t cpuSysStatusGet[], + const uint32_t length); + + + +/** +* \brief Returns the status of the cpu system component +* +* The function can be called to read back the status of the cpu system component. +* +* \pre This function may be called any time after the device has been initialized, and +* initialization calibrations have taken place +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Context variable -A pointer to the device settings structure +* \param[in] channel Channel selection to read back cal status. Must be a single channel. +* \param[in] objId Object ID of cpu system component +* \param[out] cpuSysStatus Status of the cpu system, as a structure of type adi_adrv904x_CpuSysStatus_t is returned to this pointer address +* +* \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuSysStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + const uint32_t objId, + adi_adrv904x_CpuSysStatus_t* const cpuSysStatus); + + +/** +* \brief Reads back the FW version of the CPU binary loaded into the CPU memory +* +* This function reads the CPU memory to read back the major.minor.maint.build version +* for the CPU binary loaded into CPU memory. +* +* \pre This function may be called after the CPU binary have been initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] cpuFwVersion Pointer to four parts of CPU FW Version +* +* \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuFwVersionGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_CpuFwVersion_t* const cpuFwVersion); + +/** +* \brief Reads back health monitoring status of the CPUs +* +* \pre This function is called after the device is initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] healthMonitorStatus Pointer to memory location where health monitor CPU status readback data will be written +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_HealthMonitorCpuStatusGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_HealthMonitorCpuStatus_t* const healthMonitorStatus); + +/** +* \brief Check if CPU-exception flag is set. +* +* \pre This function may be called any time after device initialization +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] isException - Is set to non-zero if either CPU's exception flag is set. The value set is not +* defined but can be analyzed by ADI and should be included in bug reports. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if the exception flag was read successfully. +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuCheckException(adi_adrv904x_Device_t* const device, + uint32_t* const isException); + +/** +* \brief Configures FW breakpoint for debugging purposes +* +* User can add/remove breakpoints in various FW features to debug potential issues. +* FW needs to be in debug mode to use breakpoints. When FW hits a breakpoint, +* it will stop the operation of certain subsystems. User is allowed to select which +* subsystems to halt through global halt mask, which can be configured with +* adi_adrv904x_GlobalHaltMaskSet() function. If global halt mask is configured to be 0, +* then FW will only pause the task which hits breakpoint. Others subsystems and tasks +* should continue to operate in this case. User can configure a GPIO output to monitor +* if FW hits a breakpoint during operation. This GPIO can be configured with +* adi_adrv904x_BreakpointGpioCfgSet(). This function can also be used to configure +* a GPIO to resume all tasks sleeping in FW. adi_adrv904x_BreakpointHitRead() function +* can be used to monitor which breakpoint is hit. User can either poll this function +* periodically until FW hits a breakpoint or they can monitor the GPIO output and call +* this function when GPIO is asserted. User can allow the system to resume operation +* with adi_adrv904x_BreakpointResume() function call or asserting selected GPIO if +* global halt mask is 0. If global halt mask is non-zero +* adi_adrv904x_BreakpointResumeFromHalt() function needs to be used to resume halted subsystems. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization. Device must be in +* debug mode. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X Device data structure +* \param[in] breakPointCfg Point to breakpoint configuration to set +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_BreakpointSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_SwBreakPointEntry_t * breakPointCfg); + +/** +* \brief This function reads the status of selected breakpoint +* +* User is expected to set the objId of the desired breakpoint. Channel mask and +* breakpoint mask configuration of selected breakpoint will be returned to user. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization. Device must be in +* debug mode. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X Device data structure +* \param[in,out] breakPointCfgRead Pointer to breakpoint structure to readback selected breakpoint +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_BreakpointGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SwBreakPointEntry_t * const breakPointCfgRead); + +/** +* \brief Reads back which breakpoint is hit in FW +* +* This function will read the breakpoint hit for both CPUs. It will +* return 0xFFFFFFFF value for all members of breakpoint structure if +* no breakpoint hit for that CPU. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization. Device must be in +* debug mode. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X Device data structure +* \param[in,out] cpu0BreakpointHit Pointer to breakpoint hit by CPU0 +* \param[in,out] cpu1BreakpointHit Pointer to breakpoint hit by CPU1 +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_BreakpointHitRead(adi_adrv904x_Device_t* const device, + adi_adrv904x_SwBreakPointEntry_t * const cpu0BreakpointHit, + adi_adrv904x_SwBreakPointEntry_t * const cpu1BreakpointHit); + +/** +* \brief Configures a GPIO output to monitor breakpoint hit signal and +* GPIO input to resume all the tasks which are sleeping +* +* FW will use the selected GPIO to output breakpoint hit signal. This signal +* can be monitored by user and adi_adrv904x_BreakpointHitRead() function +* can be used to detect the breakpoint id once GPIO is asserted. To disable GPIO +* output feature, user can select ADI_ADRV904X_GPIO_INVALID +* +* User can configure a GPIO input to resume all sleeping tasks. ADI_ADRV904X_GPIO_INVALID +* can be selected if this feature is not needed. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization. Device must be in +* debug mode. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X Device data structure +* \param[in] gpioOutputForBreakpointHit Gpio selection to output breakpoint hit signal +* \param[in] gpioInputToResumeSleepingTasks Gpio selection to resume all sleeping tasks + +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_BreakpointGpioCfgSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpioOutputForBreakpointHit, + const adi_adrv904x_GpioPinSel_e gpioInputToResumeSleepingTasks); + +/** +* \brief This function reads back the GPIO configuration for breakpoint hit +* output signal and breakpoint resume input signals. It returns invalid GPIO +* for the signals which are not assigned to any GPIOs. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization. Device must be in +* debug mode. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X Device data structure +* \param[out] gpioOutputForBreakpointHit Gpio selection readback for breakpoint hit signal +* \param[out] gpioInputToResumeSleepingTasks Gpio selection readback for resume all signal + +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_BreakpointGpioCfgGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_GpioPinSel_e * const gpioOutputForBreakpointHit, + adi_adrv904x_GpioPinSel_e * const gpioInputToResumeSleepingTasks); + +/** +* \brief Allows selected tasks to resume their operation. This function should +* be used when global halt mask is configured to 0. +* ADI cannot guarantee that the system will resume safely as there can be +* instability due to subsystems are assumed to be working at real time. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization. Device must be in +* debug mode. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X Device data structure +* \param[in] breakpointToResume Selects the breakpoint and channel to resume from sleep. Breakpoint mask is ignored since this +* command will resume the breakpoint id regardless of which specific breakpoint is hit for that breakpoint id. +* \param[in] resumeAll 1:Ignore breakpointToResume selection and resume all tasks that are sleeping + 0:Use breakpointToResume to select which breakpoint to resume + + +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_BreakpointResume(adi_adrv904x_Device_t* const device, + const adi_adrv904x_SwBreakPointEntry_t * breakpointToResume, + uint8_t resumeAll); + +/** +* \brief Allows halted subsystems to continue operation +* +* ADI cannot guarantee that the system will resume safely as there can be +* instability due to subsystems are assumed to be working at real time. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization. Device must be in +* debug mode. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X Device data structure + +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_BreakpointResumeFromHalt(adi_adrv904x_Device_t* const device); + +/** +* \brief Configures a global halt mask for FW breakpoints. +* User can select which subsystems to be halted when a breakpoint is hit. +* This global halt mask is shared by all breakpoints (for both CPUs) +* When global halt mask is configured to 0, the task which hits breakpoint will sleep, +* and all other tasks and subsystems will resume operation. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization. Device must be in +* debug mode. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X Device data structure +* \param[in] globalHaltMask Global halt mask to be set + +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_BreakpointGlobalHaltMaskSet(adi_adrv904x_Device_t* const device, + const uint32_t globalHaltMask); + +/** +* \brief This function reads back global halt mask for breakpoints +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization. Device must be in +* debug mode. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X Device data structure +* \param[out] globalHaltMask Pointer to global halt mask for readback + +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_BreakpointGlobalHaltMaskGet(adi_adrv904x_Device_t* const device, + uint32_t * const globalHaltMask); + +#endif /* _ADI_ADRV904X_CPU_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_cmd_dc_offset.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_cmd_dc_offset.h new file mode 100644 index 00000000000..4ef8f89835c --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_cmd_dc_offset.h @@ -0,0 +1,71 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adi_adrv904x_cpu_cmd_dc_offset.h + * + * \brief Contains ADRV904X Rx DC Offset data structures. + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADI_ADRV904X_CPU_CMD_DC_OFFSET_H__ +#define __ADI_ADRV904X_CPU_CMD_DC_OFFSET_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_cpu_error_codes_types.h" + +/** + * \brief DC Offset get command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_CpuCmd_GetDcOffset +{ + uint8_t chanSelect; /*!< Rx channel number */ +} adi_adrv904x_CpuCmd_GetDcOffset_t;) + + +/** + * \brief lofreq set command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_CpuCmd_GetDcOffsetResp +{ + adi_adrv904x_CpuErrorCode_t status; /*!< CPU error status code */ + uint8_t chanSelect; /*!< Rx channel number */ + uint32_t mShift; /*!< mShift setting */ + uint8_t multEnb; /*!< Multiplier Enabled */ + uint32_t mult; /*!< Multiplier value */ +} adi_adrv904x_CpuCmd_GetDcOffsetResp_t;) + + +/** + * \brief DC Offset Rx set command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_CpuCmd_SetDcOffset +{ + uint8_t chanSelect; /*!< Rx channel number */ + uint32_t dcFilterBw_kHz; /*!< DC offset 1db filter corner */ + uint8_t multEnb; /*!< Multiplier Enabled */ +} adi_adrv904x_CpuCmd_SetDcOffset_t;) + + +/** + * \brief lofreq set command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_CpuCmd_SetDcOffsetResp +{ + adi_adrv904x_CpuErrorCode_t status; /*!< CPU error status code */ +} adi_adrv904x_CpuCmd_SetDcOffsetResp_t;) + + + +#endif /* __ADI_ADRV904X_CPU_CMD_DC_OFFSET_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_cmd_ecc_scrub.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_cmd_ecc_scrub.h new file mode 100644 index 00000000000..2e03279f09e --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_cmd_ecc_scrub.h @@ -0,0 +1,52 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2022 - 2022 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adi_adrv904x_cpu_cmd_ecc_scrub.h + * + * \brief Contains ADRV904X CPU ECC Scrub enable command data structures. + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADI_ADRV904X_CPU_ECC_SCRUB_CMD_H__ +#define __ADI_ADRV904X_CPU_ECC_SCRUB_CMD_H__ + +#include +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_cpu_error_codes_types.h" + +/** + * \brief CPU ECC Set command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_CpuSetEccScrubEnableCmd +{ + uint8_t eccScrubEnable; /*!< ECC scrubbing enable setting */ +} adi_adrv904x_CpuSetEccScrubEnableCmd_t;) + +/** + * \brief CPU ECC Set command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_CpuSetEccScrubEnableCmdResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ +} adi_adrv904x_CpuSetEccScrubEnableCmdResp_t;) + +/** + * \brief CPU ECC Get command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_CpuGetEccScrubEnableCmdResp +{ + adrv904x_CpuErrorCode_e status; /*!< CPU error status code */ + uint8_t eccScrubEnable; /*!< ECC scrubbing enable state */ +} adi_adrv904x_CpuGetEccScrubEnableCmdResp_t;) + +#endif /* __ADI_ADRV904X_CPU_ECC_SCRUB_CMD_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_cmd_run_serdes_eye_sweep.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_cmd_run_serdes_eye_sweep.h new file mode 100644 index 00000000000..71db0d62332 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_cmd_run_serdes_eye_sweep.h @@ -0,0 +1,137 @@ +/** + * \file adi_adrv904x_cpu_cmd_run_serdes_eye_sweep.h + * + * \brief Command definition for ADI_ADRV904X_CPU_CMD_ID_RUN_SERDES_EYE_SWEEP + * + * \details Command definition for ADI_ADRV904X_CPU_CMD_ID_RUN_SERDES_EYE_SWEEP + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADI_ADRV904X_CPU_CMD_RUN_SERDES_EYE_SWEEP_H__ +#define __ADI_ADRV904X_CPU_CMD_RUN_SERDES_EYE_SWEEP_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_cpu_error_codes_types.h" + +/** + * \brief Deserializer lane enumeration + */ +typedef enum adi_adrv904x_CpuCmd_DeserializerLane +{ + ADI_ADRV904X_CPU_CMD_DESER_LINE0 = 0u, /*!< Deserializer lane 0 */ + ADI_ADRV904X_CPU_CMD_DESER_LINE1 = 1u, /*!< Deserializer lane 1 */ + ADI_ADRV904X_CPU_CMD_DESER_LINE2 = 2u, /*!< Deserializer lane 2 */ + ADI_ADRV904X_CPU_CMD_DESER_LINE3 = 3u, /*!< Deserializer lane 3 */ + ADI_ADRV904X_CPU_CMD_DESER_LINE4 = 4u, /*!< Deserializer lane 4 */ + ADI_ADRV904X_CPU_CMD_DESER_LINE5 = 5u, /*!< Deserializer lane 5 */ + ADI_ADRV904X_CPU_CMD_DESER_LINE6 = 6u, /*!< Deserializer lane 6 */ + ADI_ADRV904X_CPU_CMD_DESER_LINE7 = 7u, /*!< Deserializer lane 7 */ +} adi_adrv904x_CpuCmd_DeserializerLane_e; + +/** + * \brief PRBS Pattern type enumeration + */ +typedef enum adi_adrv904x_CpuCmd_PrbsPattern +{ + ADI_ADRV904X_CPU_CMD_PRBS_PATTERN7 = 0u, /*!< PRBS pattern type 7 */ + ADI_ADRV904X_CPU_CMD_PRBS_PATTERN9 = 1u, /*!< PRBS pattern type 9 */ + ADI_ADRV904X_CPU_CMD_PRBS_PATTERN15 = 2u, /*!< PRBS pattern type 15 */ + ADI_ADRV904X_CPU_CMD_PRBS_PATTERN31 = 3u, /*!< PRBS pattern type 31 */ +} adi_adrv904x_CpuCmd_PrbsPattern_e; + +/** + * \brief RUN_SERDES_EYE_SWEEP command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_CpuCmd_RunEyeSweep +{ + adi_adrv904x_CpuCmd_DeserializerLane_e lane; /*!< Deserializer lane number */ + adi_adrv904x_CpuCmd_PrbsPattern_e prbsPattern; /*!< PRBS pattern */ + uint8_t forceUsingOuter; /*!< Flag indicating 'outer' should be used for phase detection + 0 (default) - do not use outer for phase detection, + 1 - - use outer for phase detection */ + uint32_t prbsCheckDuration_ms; /*!< Duration of PRBS check in [ms] */ +} adi_adrv904x_CpuCmd_RunEyeSweep_t;) + +/** + * \brief RUN_SERDES_EYE_SWEEP command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_CpuCmd_RunEyeSweepResp +{ + int8_t spoLeft; /*!< SPO Left value */ + int8_t spoRight; /*!< SPO Right value */ +} adi_adrv904x_CpuCmd_RunEyeSweepResp_t;) + +/** + * \brief RUN_SERDES_VERT_EYE_SWEEP command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_CpuCmd_RunVertEyeSweep +{ + adi_adrv904x_CpuCmd_DeserializerLane_e lane; /*!< Deserializer lane number */ +} adi_adrv904x_CpuCmd_RunVertEyeSweep_t;) + +/** + * \brief RUN_SERDES_VERT_EYE_SWEEP command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_CpuCmd_RunVertEyeSweepResp +{ + int8_t eyeHeightsAtSpo[512]; /*!< store the upper and lower eye height at 16 SPOs*/ +} adi_adrv904x_CpuCmd_RunVertEyeSweepResp_t;) + +/** + * \brief API stable equivalent of SerdesPhyLib_fgPubCalStatus_t + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_SerdesInitCalStatus +{ + int16_t temperature; + uint8_t lpfIndex; + uint8_t ctleIndex; + uint8_t numEyes; + uint16_t bsum; + uint16_t bsum_dc; + uint8_t spoLeft; + uint8_t spoRight; + uint16_t eom; + uint16_t eomMax; + int8_t pd; + int8_t innerUp; + int8_t innerDown; + int8_t outerUp; + int8_t outerDown; + int8_t b[8U]; +} adi_adrv904x_SerdesInitCalStatus_t;) + +/** + * \brief API stable equivalent of SerdesPhyLib_bgPubCalStatus_t + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_SerdesTrackingCalStatus +{ + int16_t temperature; + int8_t pd[2U]; + int8_t dllPeakPd[2U]; + int8_t dllPeakPdDelta[2U]; + int8_t innerUp; + int8_t innerDown; + int8_t outerUp; + int8_t outerDown; + int8_t b[8U]; + float ps[2U]; + float yVector[16U]; +} adi_adrv904x_SerdesTrackingCalStatus_t;) + +#endif /* __ADI_ADRV904X_CPU_CMD_RUN_SERDES_EYE_SWEEP_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_error_codes_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_error_codes_types.h new file mode 100644 index 00000000000..057ce9c472c --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_error_codes_types.h @@ -0,0 +1,27 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ +/** + * \file adi_adrv904x_cpu_error_codes_types.h + * + * \brief Contains CPU error code definitions + * + * \details Contains CPU error code definitions + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADI_ADRV904X_CPU_ERROR_CODES_TYPES_H__ +#define __ADI_ADRV904X_CPU_ERROR_CODES_TYPES_H__ + +#include + +/* Typedef and enumeration for CPU system-wide error codes */ +typedef uint32_t adi_adrv904x_CpuErrorCode_t; + +#endif /* __ADI_ADRV904X_CPU_ERROR_CODES_TYPES_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_fw_rev_info_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_fw_rev_info_types.h new file mode 100644 index 00000000000..b286e3ea97a --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_fw_rev_info_types.h @@ -0,0 +1,32 @@ + /** + * \file adi_adrv904x_cpu_fw_rev_info_types.h + * + * \brief Contains device revision information. + * + * \details Contains device revision information. + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV903x API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADI_ADRV904X_CPU_FW_REV_INFO_TYPES_H__ +#define __ADI_ADRV904X_CPU_FW_REV_INFO_TYPES_H__ + +/** +* \brief Enumerated list of FW image build options. +*/ +typedef enum adi_adrv904x_CpuFwBuildType +{ + ADI_ADRV904X_CPU_FW_BUILD_RELEASE = 0, /*!< FW release mode */ + ADI_ADRV904X_CPU_FW_BUILD_DEBUG = 1, /*!< FW debug mode */ + ADI_ADRV904X_CPU_FW_TRBLSHOOT = 8 /*!< FW troubleshoot mode */ +} adi_adrv904x_CpuFwBuildType_e; + +#endif /* __ADI_ADRV904X_CPU_FW_REV_INFO_TYPES_H__*/ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_health_monitor_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_health_monitor_types.h new file mode 100644 index 00000000000..d594f4d09bd --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_health_monitor_types.h @@ -0,0 +1,76 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2020 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adi_adrv904x_cpu_health_monitor_types.h + * + * \brief Contains ADRV904X CPU Health Monitor data types + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADI_ADRV904X_CPU_HEALTH_MONITOR_TYPES_H__ +#define __ADI_ADRV904X_CPU_HEALTH_MONITOR_TYPES_H__ + +#include +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_cpu_error_codes_types.h" + +#ifdef __ICCARM__ +/* + * Error[Pm009]: Identifiers (internal and external) shall not rely on + * significance of more than 31 characters (MISRA C 2004 rule 5.1) + * + * To satisfy API naming conventions it is necessary to have this long common + * macro prefix. + */ +#pragma diag_suppress=Pm009 +#endif /* __ICCARM__ */ + +/** + * \brief CPU Usage enumeration and type + */ +typedef enum adi_adrv904x_CpuUsage +{ + ADI_ADRV904X_CPU_USAGE_NORMAL, /*!< CPU usage is normal */ + ADI_ADRV904X_CPU_USAGE_STARVING, /*!< Some of the cals may be starving */ + ADI_ADRV904X_CPU_USAGE_CRITICAL /*!< Cals are not getting chance to run */ +} adi_adrv904x_CpuUsage_e; +typedef uint8_t adi_adrv904x_CpuUsage_t; + +/** + * \brief Health Monitor structure for a single CPU + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_HealthMonitorCpuStatusSingle +{ + uint64_t initCalStatusMask; /*!< Status bits for all init calibrations, where bits correspond to calibrations as defined in adi_adrv904x_InitCalibrations_e. A bit will be 0 if the corresponding calibration indicated no error. A bit set to 1 indicates the corresponding calibration generated an error. The bit is cleared when the corresponding calibration is re-run. */ + uint32_t numInitCalErrors; /*!< Total number of Init Cal errors generated since powerup */ + uint64_t trackingCalStatusMask; /*!< Status bits for all tracking calibrations, where bits correspond to calibrations as defined in adi_adrv904x_TrackingCalibrationMask_e. A bit will be 0 if the corresponding calibration indicated no error. A bit set to 1 indicates the corresponding calibration generated an error. The bit is cleared when the corresponding calibration is re-run. */ + uint32_t numTrackingCalErrors; /*!< Total number of Tracking Cal errors generated since powerup */ + uint32_t numSystemErrors; /*!< Total number of System Errors that have occured since bootup. */ + uint32_t numSystemWarnings; /*!< Total number of System Warnings that have occured since bootup */ + adi_adrv904x_CpuUsage_t cpuUsage; /*!< CPU Usage level */ +} adi_adrv904x_HealthMonitorCpuStatusSingle_t;) + +/** + * \brief Health Monitor structure for all CPUs + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_HealthMonitorCpuStatus +{ + adi_adrv904x_HealthMonitorCpuStatusSingle_t cpu0; /*!< CPU Health Monitor Status info for CPU0 */ + adi_adrv904x_HealthMonitorCpuStatusSingle_t cpu1; /*!< CPU Health Monitor Status info for CPU1 */ +} adi_adrv904x_HealthMonitorCpuStatus_t;) + +#ifdef __ICCARM__ +/* Restore checking for MISRA 5.1*/ +#pragma diag_default=Pm009 +#endif + +#endif /* __ADI_ADRV904X_CPU_HEALTH_MONITOR_TYPES_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_log_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_log_types.h new file mode 100644 index 00000000000..c0a0f1724bb --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_log_types.h @@ -0,0 +1,76 @@ + /** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + + /** + * \file adi_adrv904x_cpu_log_types.h + * + * \brief Contains CPU log types + * + * \details Contains CPU log types + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADI_ADRV904X_CPU_LOG_TYPES_H__ +#define __ADI_ADRV904X_CPU_LOG_TYPES_H__ + +#include + +/** + * \brief CPU log events + */ +typedef enum adi_adrv904x_CpuLogEvent +{ + /* LOG_EVENT = 0 is reserved */ + ADI_ADRV904X_CPU_LOG_EVENT_ERROR = 1, /*!< Error messages */ + ADI_ADRV904X_CPU_LOG_EVENT_WARNING = 2, /*!< Warning messages */ + ADI_ADRV904X_CPU_LOG_EVENT_INFO = 3, /*!< Informational messages, least verbose */ + ADI_ADRV904X_CPU_LOG_EVENT_INFO_2 = 4, /*!< Informational messages, most verbose */ + ADI_ADRV904X_CPU_LOG_EVENT_INVALID = 5 /*!< Invalid setting (ignore) */ +} adi_adrv904x_CpuLogEvent_e; +typedef uint8_t adi_adrv904x_CpuLogEvent_t; + +/** + * \brief CPU log CPU ID + */ +typedef enum adi_adrv904x_CpuLogCpuId +{ + ADI_ADRV904X_CPU_LOG_CPU_ID_NONE = 0x0, /*!< No CPUs */ + ADI_ADRV904X_CPU_LOG_CPU_ID_0 = 0x1, /*!< CPU 0 (Primary CPU) */ + ADI_ADRV904X_CPU_LOG_CPU_ID_1 = 0x2, /*!< CPU 1 */ + ADI_ADRV904X_CPU_LOG_CPU_ID_ALL = 0x3, /*!< All CPUs */ + ADI_ADRV904X_CPU_LOG_CPU_ID_INVALID = 0xFF /*!< Invalid setting (ignore) */ +} adi_adrv904x_CpuLogCpuId_e; +typedef uint8_t adi_adrv904x_CpuLogCpuId_t; + +/** + * \brief CPU log object ID + */ +typedef uint32_t adi_adrv904x_CpuLogObjId_t; + +/** + * \brief CPU log object ID filter enable + */ +typedef enum adi_adrv904x_CpuLogObjIdEnable +{ + ADI_ADRV904X_CPU_LOG_OBJ_ID_DISABLE = 0x0, /*!< Disable */ + ADI_ADRV904X_CPU_LOG_OBJ_ID_ENABLE = 0x1, /*!< Enable */ + ADI_ADRV904X_CPU_LOG_OBJ_ID_INVALID = 0xFF /*!< Invalid setting (ignore) */ +} adi_adrv904x_CpuLogObjIdEnable_e; +typedef uint8_t adi_adrv904x_CpuLogObjIdEnable_t; + +/** + * \brief CPU log object ID filter settings + */ +typedef struct adi_adrv904x_CpuLogObjIdFilter +{ + adi_adrv904x_CpuLogObjId_t objId; /*!< Object ID */ + adi_adrv904x_CpuLogObjIdEnable_t objIdFilterEnable; /*!< Filter enable/disable */ +} adi_adrv904x_CpuLogObjIdFilter_t; + +#endif /* __ADI_ADRV904X_CPU_LOG_TYPES_H__*/ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_radio_cmd.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_radio_cmd.h new file mode 100644 index 00000000000..69e92c3f237 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_radio_cmd.h @@ -0,0 +1,47 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2022 - 2022 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adi_adrv904x_cpu_radio_cmd.h + * + * \brief Contains ADRV904X CPU Radio command data structures. + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADI_ADRV904X_CPU_RADIO_CMD_H__ +#define __ADI_ADRV904X_CPU_RADIO_CMD_H__ + +#include +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_cpu_error_codes_types.h" + +#define CPU_RADIO_CMD_BUFFER_SIZE (16u) +#define CPU_RADIO_CMD_RESP_BUFFER_SIZE (22u) + +/** + * \brief CPU Radio command response structure (Koror only) + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_CpuRadioCmd +{ + uint8_t opcode; /*!< opcode for the radio msg: 0, 1, .. */ + uint8_t buffer[CPU_RADIO_CMD_BUFFER_SIZE]; /*!< container for radio command message */ +} adi_adrv904x_CpuRadioCmd_t;) + +/** + * \brief CPU Radio command response structure (Koror only) + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_CpuRadioCmdResp +{ + adi_adrv904x_CpuErrorCode_t status; /*!< CPU error status code */ + uint8_t buffer[CPU_RADIO_CMD_RESP_BUFFER_SIZE]; /*!< container for radio command response message */ +} adi_adrv904x_CpuRadioCmdResp_t;) + +#endif /* __ADI_ADRV904X_CPU_RADIO_CMD_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_sw_bkpt_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_sw_bkpt_types.h new file mode 100644 index 00000000000..2a2e138e161 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_sw_bkpt_types.h @@ -0,0 +1,36 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adi_adrv904x_cpu_sw_bkpt_types.h + * + * \brief Contains the definitions for Software Breakpoints + * + * \details Contains the definitions for Software Breakpoints + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADI_ADRV904X_CPU_SW_BKPT_TYPES_H__ +#define __ADI_ADRV904X_CPU_SW_BKPT_TYPES_H__ + +#include + + +/** +* \brief Software breakpoint entry for each object +*/ +typedef struct adi_adrv904x_SwBreakPointEntry +{ + uint32_t objId; /*! Object ID of the module to which the break point belongs */ + uint32_t chanMask; /*! Bit mask of channels for which the break point to be enabled */ + uint32_t bkptMask; /*! Bit mask of the breakpoints to be enabled */ +} adi_adrv904x_SwBreakPointEntry_t; + +#endif /* __ADI_ADRV904X_CPU_SW_BKPT_TYPES_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_sys_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_sys_types.h new file mode 100644 index 00000000000..12ae2efa8c4 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_sys_types.h @@ -0,0 +1,49 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2020 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adi_adrv904x_cpu_sys_types.h + * + * \brief Contains ADRV904X Calibration data types + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_CPU_SYS_TYPES_H__ +#define __ADRV904X_CPU_SYS_TYPES_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_cpu_error_codes_types.h" + + +/** + * \brief Cpu System Status Mask + */ +typedef enum adi_adrv904x_CpuSysStatusMask +{ + ADI_ADRV904X_CPU_SS_ID_1_MASK = 0x01u /*!< Cpu System Status ID Mask 1 */ + +} adi_adrv904x_CpuSysStatusMask_e; + +/** + * \brief Data structure to hold common cpu system status information + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_CpuSysStatus +{ + adi_adrv904x_CpuErrorCode_t errorCode; /*!< Current error condition reported by the calibration */ + uint32_t placeHolder; /*!< example of status */ +} adi_adrv904x_CpuSysStatus_t;) + + + +#ifdef __ICCARM__ +#pragma diag_default=Pm009 +#endif /* __ICCARM__ */ + +#endif /* __ADRV904X_CPU_SYS_TYPES_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_types.h new file mode 100644 index 00000000000..319949c8ba7 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_cpu_types.h @@ -0,0 +1,107 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_cpu_types.h +* +* \brief Contains ADRV904X data types for on board cpus feature +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#ifndef _ADI_ADRV904X_CPU_TYPES_H_ +#define _ADI_ADRV904X_CPU_TYPES_H_ + +#include "adi_adrv904x_utilities_types.h" +#include "adi_adrv904x_version_types.h" +#include "adi_adrv904x_cpu_fw_rev_info_types.h" +#include "adi_library_types.h" + + +#define ADI_ADRV904X_CPU_0_BINARY_IMAGE_FILE_SIZE_BYTES (ADRV904X_CPU_PM_SIZE) +#define ADI_ADRV904X_CPU_1_BINARY_IMAGE_FILE_SIZE_BYTES (ADRV904X_CPU_PM_SIZE) + +#define ADI_ADRV904X_CPU_0_BINARY_IMAGE_FILE_SIZE_MASK (ADRV904X_CPU_PM_SIZE - 1u) + +#define ADI_ADRV904X_CPU_0_PROFILE_BINARY_IMAGE_FILE_SIZE_BYTES ADRV904X_DEVICE_PROFILE_SIZE_BYTES +#define ADI_ADRV904X_LINK_ID_MAX 1U + +/** + * \brief Enumerated list of CPU Type + */ +typedef enum adi_adrv904x_CpuType +{ + ADI_ADRV904X_CPU_TYPE_UNKNOWN = -1, /*!< Unknown CPU */ + ADI_ADRV904X_CPU_TYPE_0, /*!< CPU 0 */ + ADI_ADRV904X_CPU_TYPE_1, /*!< CPU 1 */ + ADI_ADRV904X_CPU_TYPE_MAX_RADIO, /*!< Number of radio CPUs */ + ADI_ADRV904X_CPU_TYPE_DFE, /*!< all DFE CPUs */ + ADI_ADRV904X_CPU_TYPE_MAX, /*!< total CPUs, radio and non-radio */ +} adi_adrv904x_CpuType_e; + +#ifndef CLIENT_IGNORE +/** + * \brief Structure to hold memory map of a cpu + */ +typedef struct adi_adrv904x_CpuAddr +{ + uint8_t enabled; /*!< Cpu enabled status */ + + /* subsystem registers */ + uint16_t ctlAddr; /*!< control register */ + uint32_t bootAddr; /*!< boot address */ + uint32_t stackPtrAddr; /*!< stack pointer */ + uint32_t memBankCtrlAddr; /*!< memory bank control register */ + + /* Mailbox registers */ + uint16_t cmdAddr; /*!< command. b7 = command_busy. b5:0 command */ + uint16_t extCmdAddr; /*!< command payload. 4 bytes */ + uint16_t cmdStatusAddr; /*!< command status. 16 bytes */ + + /* Program section */ + uint32_t progStartAddr; /*!< start address of program memory section */ + uint32_t progEndAddr; /*!< end address of program memory section */ + uint32_t versionAddr; /*!< 48-bytes set aside for FW Rev Info address */ + uint32_t structChecksumAddr; /*!< checksum structure address */ + uint32_t debugPointersAddr; /*!< Debug Pointers */ + uint32_t buildChecksumAddr; /*!< FW build time checksum address */ + + /* Data section */ + uint32_t dataStartAddr; /*!< start address of data memory section */ + uint32_t dataEndAddr; /*!< end address of data memory section */ + uint32_t cfrPulseAddr; /*!< */ + uint32_t mailboxSetAddr; /*!< Mailbox SET command buffer */ + uint32_t mailboxGetAddr; /*!< Mailbox GET command buffer */ + uint32_t mailboxRunInitAddr; /*!< Mailbox RUN_INIT command buffer */ + uint32_t mailboxFhmAddr; /*!< Mailbox Frequency Hopping Mode */ + uint16_t curTransactionId[ADI_ADRV904X_LINK_ID_MAX]; +} adi_adrv904x_CpuAddr_t; + +/** + * \brief CPU data structure + */ +typedef struct adi_adrv904x_Cpu +{ + adi_adrv904x_Version_t fwVersion; /*!< FW version */ + adi_adrv904x_Version_t devProfileVersion; /*!< Device profile version */ + uint32_t devProfileAddr; /*!< Device Profile structure address */ + uint32_t devDebugConfigAddr; /*!< Device Debug Config structure address */ + uint8_t devDebugIarEnable; /*!< Device Debug IAR Enable flag */ + adi_adrv904x_CpuAddr_t cpuAddr[ADI_ADRV904X_MAX_NUM_CPUS]; /*!< CPU address structures */ + adi_adrv904x_CpuMemDumpBinaryInfo_t cpuMemDumpBinaryInfo; /*!< CPU Memory Dump Binary Info structures */ +} adi_adrv904x_Cpu_t; +#endif + +/** + * \brief Data structure to FW version information + */ +typedef struct adi_adrv904x_CpuFwVersion +{ + adi_adrv904x_Version_t commVer; /*!< Common version for API and FW */ + adi_adrv904x_CpuFwBuildType_e cpuFwBuildType; /*!< BuildType for FW */ +} adi_adrv904x_CpuFwVersion_t; + +#endif /* _ADI_ADRV904X_CPU_TYPES_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_datainterface.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_datainterface.h new file mode 100644 index 00000000000..42d6d48fd46 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_datainterface.h @@ -0,0 +1,2143 @@ + /** + * Copyright 2015 - 2023 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adi_adrv904x_datainterface.h + * \brief Contains ADRV904X API public function prototypes related to the data interface + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADI_ADRV904X_DATAINTERFACE_H_ +#define _ADI_ADRV904X_DATAINTERFACE_H_ + +#include "adi_adrv904x_datainterface_types.h" +#include "adi_adrv904x_error.h" +#include "adi_adrv904x_cpu_cmd_run_serdes_eye_sweep.h" + + +/** + * \brief Initiates data capture using the Rx/ORx data capture RAM + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Pointer to the device settings structure + * \param[in] channelSelect Channel mask indicating which channel is being captured + * \param[in] captureLocation The location at which the data capture will occur + * \param[in,out] captureData An array that stores the captured data + * \param[in] captureLength The size of the data to capture; i.e. the size of captureData + * \param[in] trigger Immediate Capture (0); Triggered capture (1) + * \param[in] timeout_us Timeout value in microseconds. Maximum time to capture data. + * + * \retval adi_adrv904x_ErrAction_e - ADI_COMMON_ACT_NO_ACTION if Successful + */ + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxOrxDataCaptureStart( adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e channelSelect, + const adi_adrv904x_RxOrxDataCaptureLocation_e captureLocation, + uint32_t captureData[], + const uint32_t captureLength, + const uint8_t trigger, + const uint32_t timeout_us); + +/**************************************************************************** + * Initialization functions + **************************************************************************** + */ +/** + * \brief Sets the ADC sample crossbar for the specified ADRV904X framer + * + * For ADRV904X: + * - It only supports framer-0 and framer-1. For framer-2 must use adi_adrv904x_OrxAdcSampleXbarSet + * - framer-0 has 64 entries while framer-1 only has 32 entries. + * + * \pre This function is called after JESD204B/C initialization + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Pointer to the device settings structure + * \param[in] framerSel selected of framer defined in adi_adrv904x_FramerSel_e + * \param[in] adcXbar Pointer to the JESD structure adi_adrv904x_AdcSampleXbarCfg_t + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AdcSampleXbarSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + const adi_adrv904x_AdcSampleXbarCfg_t* const adcXbar); +/** + * \brief Gets the ADC sample crossbar converter configuration map for + * the chosen JESD204B/C framer converter + * For ADRV904X: + * - It only supports framer-0 and framer-1. For framer-2 must use adi_adrv904x_OrxAdcSampleXbarGet + * - framer-0 has 64 entries while framer-1 only has 32 entries. + * + * \pre This function is called after JESD204B/C initialization + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Pointer to the device settings structure + * \param[in] framerSel selected of framer defined in adi_adrv904x_FramerSel_e + * \param[out] adcXbar Pointer to the JESD structure adi_adrv904x_AdcSampleXbarCfg_t + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AdcSampleXbarGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + adi_adrv904x_AdcSampleXbarCfg_t* const adcXbar); + +/** + * \brief Sets the DAC sample crossbar for the specified ADRV904X deframer + * + * \pre This function is called after JESD204B/C initialization + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Pointer to the device settings structure + * \param[in] deframerSel selected of deframer defined in adi_adrv904x_DeframerSel_e + * \param[in] dacXbar Pointer to the JESD structure adi_adrv904x_DacSampleXbarCfg_t + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DacSampleXbarSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + const adi_adrv904x_DacSampleXbarCfg_t* const dacXbar); +/** + * \brief Gets the DAC sample crossbar for the specified ADRV904X deframer + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Pointer to the device settings structure + * \param[in] deframerSel selected of framer defined in adi_adrv904x_DeframerSel_e + * \param[out] dacXbar Pointer to the JESD structure adi_adrv904x_DacSampleXbarCfg_t + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DacSampleXbarGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + adi_adrv904x_DacSampleXbarCfg_t* const dacXbar); + +/** +* \brief Gets the JESD204B/C Framer's configuration +* +* This function reads the JESD204B/C framer settings. +* +* \pre This function may be called any time after device initialization +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the device settings structure +* \param[in] framerSel selected of framer defined in adi_adrv904x_FramerSel_e +* \param[out] framerCfg Pointer to the JESD Framer configuration read back +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + adi_adrv904x_FramerCfg_t* const framerCfg); + + +/** +* \brief Gets the JESD204B/C Framer's configuration +* +* This function reads the JESD204B/C framer settings. +* +* \pre This function may be called any time after device initialization +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the device settings structure +* \param[in] framerSel selected of framer defined in adi_adrv904x_FramerSel_e +* \param[in] chanSel selected Rx channel defined in adi_adrv904x_RxChannels_e +* \param[out] framerCfg Pointer to the JESD Framer configuration read back +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerCfgGet_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + const adi_adrv904x_RxChannels_e chanSel, + adi_adrv904x_FramerCfg_t* const framerCfg); + +/** +* \brief Gets the JESD204B/C Deframer's configuration +* +* This function reads the JESD204B/C deframer settings. +* +* \pre This function may be called any time after device initialization +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the device settings structure +* \param[in] deframerSel selected of framer defined in adi_adrv904x_DeframerSel_e +* \param[out] deframerCfg Pointer to the JESD Deframer configuration read back +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerCfgGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DeframerSel_e deframerSel, + adi_adrv904x_DeframerCfg_t* const deframerCfg); + +/** +* \brief Gets the JESD204B/C Deframer's configuration +* +* This function reads the JESD204B/C deframer settings. +* +* \pre This function may be called any time after device initialization +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the device settings structure +* \param[in] deframerSel selected of framer defined in adi_adrv904x_DeframerSel_e +* \param[in] chanSel selected Tx channel defined in adi_adrv904x_TxChannels_e +* \param[out] deframerCfg Pointer to the JESD Deframer configuration read back +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerCfgGet_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + const adi_adrv904x_TxChannels_e chanSel, + adi_adrv904x_DeframerCfg_t* const deframerCfg); +/** + * \brief Gets the link states for all the framers. + * + * \pre This function is called after JESD204B/C initialization + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Pointer to the device settings structure + * \param[out] framerLinkState Pointer to the framer link states + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerLinkStateGet(adi_adrv904x_Device_t* const device, + uint8_t* const framerLinkState); + +/** + * \brief Sets the framer link states. + * + * \pre This function is called after JESD204B/C initialization + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Pointer to the device settings structure + * \param [in] framerSelMask indicate which framers are selected. + * \param[in] enable indicate to enable(1) or disable(0) the selected framers in framerSelMask + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerLinkStateSet(adi_adrv904x_Device_t* device, + const uint8_t framerSelMask, + uint8_t const enable); + +/** + * \brief Reset Deframer PRBS Count error. + * + * \pre This function is called after JESD204B/C initialization + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Pointer to the device settings structure + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmPrbsCountReset(adi_adrv904x_Device_t* const device); + +/** + * \brief Gets the link states for all the deframers. + * + * \pre This function is called after JESD204B/C initialization + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Pointer to the device settings structure + * \param[out] deframerLinkState Pointer to the deframer link states + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerLinkStateGet(adi_adrv904x_Device_t* device, + uint8_t* const deframerLinkState); + +/** + * \brief Sets the deframer link states. + * + * \pre This function is called after JESD204B/C initialization + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Pointer to the device settings structure + * \param [in] deframerSelMask indicate which deframers are selected. + * \param[in] enable indicate to enable(1) or disable(0) the selected framers in framerSelMask + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerLinkStateSet(adi_adrv904x_Device_t* device, + const uint8_t deframerSelMask, + uint8_t const enable); + +/** + * \brief Configures and enables or disables the transceiver's lane/sample PRBS + * checker. + * This is a debug function to be used for debug of the Tx JESD204B/C lanes. + * The Tx link(s) need to be configured and on to use this function. If the + * checkerLocation is ADI_ADRV904X_PRBSCHECK_LANEDATA, the PRBS is checked at the + * output of the deserializer. If the checkLocation is ADI_ADRV904X_PRBSCHECK_SAMPLEDATA + * the PRBS data is expected to be framed JESD204B/C data and the PRBS is checked + * after the JESD204B/C data is deframed. For the sample data, there is only + * a PRBS checker on deframer output 0. The lane PRBS has a checker on each + * deserializer lane. + * + * \pre This function is called after JESD204B/C initialization + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Pointer to the device settings structure + * \param [in] dfrmPrbsCfg Pointer to adi_adrv904x_DfrmPrbsCfg_t data structure. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmPrbsCheckerStateSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfrmPrbsCfg_t * const dfrmPrbsCfg); + +/** + * \brief Read back transceiver's lane/sample PRBS checker configuration + * + * \pre This function is called after JESD204B/C initialization + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in,out] device Context variable -Pointer to the device settings structure + * \param [in,out] dfrmPrbsCfg Pointer to adi_adrv904x_DfrmPrbsCfg_t data structure. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmPrbsCheckerStateGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfrmPrbsCfg_t * const dfrmPrbsCfg); + +/** + * \brief Enables or disables the external SYSREF JESD204B/C signal to the transceiver's framers + * + * For the framer to retime its LMFC (local multi frame clock), a SYSREF rising edge is required. + * The external SYSREF signal at the pin can be gated off internally so the framer does not see + * a potential invalid SYSREF pulse before it is configured correctly. + * + * By default the SYSREF signal ungated, however, the Multichip Sync state machine + * still does not allow the external SYSREF to reach the framer until the other stages of multichip + * sync have completed. As long as the external SYSREF is correctly configured before performing MCS, + * this function may not be needed by the BBIC, since the MCS state machine gates the SYSREF to the + * framer. + * + * \pre This function is called after the device has been initialized and the JESD204B/C framer is enabled + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in] device Context variable -Pointer to the device settings structure + * \param [in] framerSelMask indicate which framers are selected. + * \param [in] enable indicate to enable(1) or disable(0) Sysref for the selected framers in framerSelMask + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerSysrefCtrlSet(adi_adrv904x_Device_t* const device, + const uint8_t framerSelMask, + uint8_t const enable); + +/** + * \brief Reads the bit indicating external SYSREF JESD204b signal of the transceiver's framers. Only status for + * \ one channel at a time can be read. + * + * \pre This function is called after the device has been initialized and the JESD204B/C framer is enabled + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in] device Context variable -Pointer to the device settings structure + * \param [in] framerSel indicate which framers are selected. + * \param [out] enable Pointer to contain value to indicate enable(1) or disable(0) the selected framer in framerSelMask + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerSysrefCtrlGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + uint8_t * const enable); + +/** + * \brief Enables or disables the external SYSREF JESD204B/C signal to the transceiver's deframers + * + * \pre This function is called after the device has been initialized and the JESD204B/C deframer is enabled + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in] device Context variable -Pointer to the device settings structure + * \param [in] deframerSelMask indicate which deframers are selected. + * \param [in] enable indicate to enable(1) or disable(0) Sysref for the selected deframers in deframerSelMask + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerSysrefCtrlSet(adi_adrv904x_Device_t* const device, + const uint8_t deframerSelMask, + uint8_t const enable); + +/** + * \brief Reads the bit indicating external SYSREF JESD204B/C signal of the transceiver's deframers. Only status for one channel + * \ at a time can be read. + * + * + * \pre This function is called after the device has been initialized and the JESD204B/C deframer is enabled + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in] device Context variable -Pointer to the device settings structure + * \param [in] deframerSel indicate which deframers are selected. + * \param [out] enable Pointer to contain value to indicate enable(1) or disable(0) the selected deframer in deframerSelMask + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerSysrefCtrlGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + uint8_t * const enable); + +/** +* \brief Selects the PRBS type and enables or disables RX Framer PRBS generation + * + * This is a debug function to be used for debug of the Rx JESD204B/C lanes. + * Rx data transmission on the JESD204B/C link(s) is not possible + * when the framer test data is activated. To disable PRBS call this function + * again with the framer data source set to ADI_ADRV904X_FTD_ADC_DATA. + * + * \pre This function may be called any time after device initialization + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in] device Context variable -Pointer to the device settings structure + * \param [in,out] frmTestDataCfg Pointer to adi_adrv904x_FrmTestDataCfg_t for PRBS configuration setting. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerTestDataSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_FrmTestDataCfg_t * const frmTestDataCfg); + +/** + * \brief Gets the PRBS Framer Test Mode and Inject Points + * + * This is a debug function to be used for debug of the Rx JESD204B/C lanes. + * Rx data transmission on the JESD204B/C link(s) is not possible + * when the framer test data is activated. + * + * \pre This function may be called any time after device initialization + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in] device Context variable -Pointer to the device settings structure + * \param [in] framerSel contains the framer of interest + * \param [in,out] frmTestDataCfg Pointer to adi_adrv904x_FrmTestDataCfg_t for PRBS configuration setting. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerTestDataGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + adi_adrv904x_FrmTestDataCfg_t * const frmTestDataCfg); + +/** + * \brief Get the deserializer lane and deframer sample PRBS error counters + * + * In the case that the PRBS checker is set to check at the deframer output + * sample, there is only a checker on the Deframer Sample 0 output. In this + * case the lane function parameter is ignored and the sample 0 PRBS counter + * is returned. + * + * errorStatus: Index 0 contains error status if in sample mode, otherwise status are maintained per index. + * Sample Mode: 0b: Error Count, 1b: Error Flag, 2b: Clears Error. + * Data Mode: 0b: Lane inverted, 1b: invalid data flag, b2: sample/lane error flag. + * \pre If reading PRBS samples framed in the JESD204 data, the JESD204 deframer must be configured. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in] device Context variable -Pointer to the device settings structure + * \param [in,out] counters Pointer to PRBS Error counter structure to be returned + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmPrbsErrCountGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfrmPrbsErrCounters_t * const counters); + +/** + * \brief Reset the serializer + * + * \pre This function can be called after JESD204B/C initialization + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in, out] device Context variable -Pointer to the device settings structure + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SerializerReset(adi_adrv904x_Device_t* const device); + + +/** + * \brief Reset the serializer v2 + * + * \pre This function can be called after JESD204B/C initialization and after adi_adrv904x_SerializerReset + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in, out] device Context variable -Pointer to the device settings structure + * \param[in] pSerResetParms - Pointer to the Serializer Reset Parameter structure adrv904x_CpuCmd_SerReset_t + * \param[out] pSerResetResp - Pointer to the Serializer Reset Result Parameter structure adrv904x_CpuCmd_SerResetResp_t + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SerializerReset_v2(adi_adrv904x_Device_t* const device, + adi_adrv904x_CpuCmd_SerReset_t* const pSerResetParms, + adi_adrv904x_CpuCmd_SerResetResp_t* const pSerResetResp); + +/** + * \brief Sets phase adjustment value(i.e. Lmfc offset) for selected framer. + * + * \pre This function can be called after JESD204B/C initialization + * + * Maximum value for lmfcOffset variable is (JESD K param* JESD S param) - 1 + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in, out] device Context variable -Pointer to the device settings structure + * \param[in] framerSelect Framer selection to configure lmfc offset + * \param[in] lmfcOffset Phase adjustment value for selected framer + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerLmfcOffsetSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSelect, + const uint16_t lmfcOffset); + +/** + * \brief Reads phase adjustment value(i.e. Lmfc offset) of selected framer + * + * \pre This function can be called after JESD204B/C initialization + * + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in, out] device Context variable -Pointer to the device settings structure + * \param[in] framerSelect Deframer selection to readback lmfc offset + * \param[out] lmfcOffset Pointer to readback value for phase adjustment + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerLmfcOffsetGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSelect, + uint16_t * const lmfcOffset); + +/** + * \brief Sets phase adjustment value(i.e. Lmfc offset) for selected value + * + * \pre This function can be called after JESD204B/C initialization + * + * Maximum value for lmfcOffset variable is (JESD K param* JESD S param) - 1 + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in, out] device Context variable -Pointer to the device settings structure + * \param[in] deframerSelect Deframer selection to configure lmfc offset + * \param[in] lmfcOffset Phase adjustment value for selected deframer + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmLmfcOffsetSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSelect, + const uint16_t lmfcOffset); + +/** + * \brief Reads phase adjustment value(i.e. Lmfc offset) of selected deframer + * + * \pre This function can be called after JESD204B/C initialization + * + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in, out] device Context variable -Pointer to the device settings structure + * \param[in] deframerSelect Deframer selection to readback lmfc offset + * \param[out] lmfcOffset Pointer to readback value for phase adjustment + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmLmfcOffsetGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSelect, + uint16_t * const lmfcOffset); + +/** + * \brief Reads phase diff value for selected deframer + * + * \pre This function can be called after JESD204B/C initialization + * + * This function calculates the phase diff value after the adjustment which is + * configured with adi_adrv904x_DfrmLmfcOffsetSet(). This phase difference can + * be used to determine how to set phase adjustment + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in, out] device Context variable -Pointer to the device settings structure + * \param[in] deframerSelect Deframer selection to readback lmfc offset + * \param[out] phaseDiff Pointer to readback value for phase diff + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmPhaseDiffGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSelect, + uint16_t * const phaseDiff); +/** +* \brief Get framer status for the selected framer. Support for both JESD 204B/C. +* +* \pre This function can be called after JESD204B/C initialization +* 204B and 204C: framerStatus->status bit pattern meaning: +* b0: Input cfg not supported +* b1: SYSREF phase established by framer +* b2: SYSREF phase error - a new SYSREF had different +* timing than the first that set the LMFC timing. +* b3: pclk slow error +* b4: pclk fast error +* b5: reserved +* b6: reserved +* b7: Link type: 0: 204B, 1: 204C +* +* 204B: framerStatus->qbfStateStatus numeric value: +* 0x0 CGS +* 0x1 ILA_M0R +* 0x2 ILA_M0 +* 0x3 ILA_M1R +* 0x4 ILA_M1C1 +* 0x5 ILA_M1C2 +* 0x6 ILA_M1C3 +* 0x7 ILA_M1 +* 0x8 ILA_M2R +* 0x9 ILA_M2 +* 0xA ILA_M3R +* 0xB ILA_M3 +* 0xC ILA_BP +* 0xD UDATA +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X data structure +* \param[in] framerSel Framer selection +* \param[out] framerStatus Pointer to structure contains status for both 204B/C framer. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerStatusGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_FramerSel_e framerSel, + adi_adrv904x_FramerStatus_t * const framerStatus); + +/** +* \brief Get deframer status for the selected deframer. Support for both JESD 204B/C. +* This function is deprecated and replaced by adi_adrv904x_DeframerStatusGet_v2() +* +* \pre This function can be called after JESD204B/C initialization +* +* Status for JESD204B: in structure adi_adrv904x_DeframerStatus_t +* deframerStatus | Bit Name | Description +* ----------------|-----------------|-------------------------------------------------- +* [7] | Reserved | This bit is deprecated. For checksum status use adi_adrv904x_DfrmIlasMismatchGet(). +* [6] | EOF Event | This bit captures the internal status of the framer End of Frame event. Value =1 if framing error during ILAS +* [5] | EOMF Event | This bit captures the internal status of the framer End of Multi-Frame event. Value =1 if framing error during ILAS +* [4] | FS Lost | This bit captures the internal status of the framer Frame Symbol event. Value =1 if framing error during ILAS or user data (invalid replacement characters) +* [3] | Reserved | Reserved +* [2] | User Data Valid | =1 when in user data (deframer link is up and sending valid DAC data) +* [1] | SYSREF Received | Deframer has received the external SYSREF signal +* [0] | Syncb level | Current level of Syncb signal internal to deframer (=1 means link is up) +* +* Status for JESD204C: in structure adi_adrv904x_DeframerStatus_t +* deframerStatus | Bit Name | Description +* ----------------|--------------------------|-------------------------------------------------- +* [2:0] | Current lock state | These 3 bits indicate state of JESD204C Lock +* +* An explanation of what each the value of the 3 bits relates to is below: +* value | Description +* ----------------|----------------------------------------------------------------------------- +* 0 | Reset +* 1 | Unlocked +* 2 | Block(Blocks aligned) +* 3 | M_Block(Lanes aligned) +* 4 | E_M_Block(Multiblock aligned) +* 5 | FEC_BUF +* 6 | FEC_READY (Good State!) +* 7 | Forced +* +* reserved: in structure adi_adrv904x_DeframerStatus_t +* Bit position | Bit Name | Description +* ----------------|--------------------------|-------------------------------------------------- +* [0] | JESD204 type | 0: 204B, 1: 204C +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X data structure +* \param[in] deframerSel Deframer selection +* \param[out] deframerStatus Pointer to structure contains status for both 204B/C deframer. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerStatusGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_DeframerSel_e deframerSel, + adi_adrv904x_DeframerStatus_t * const deframerStatus); + +/** +* \brief Get deframer status for all lanes in the selected deframer. Support for both JESD 204B/C. +* +* \pre This function can be called after JESD204B/C initialization +* +* Structure adi_adrv904x_DeframerStatus_v2_t +* +* phyLaneMask: The lane bit masks of lanes used by this selected deframer. +* +* linkState | Bit Name | Description +* ----------------|--------------------------|-------------------------------------------------- +* [0] | Link type | 1: link type 204C. 0: link type 204B +* [1] | Link state | 1: link is up. 0: link is down +* +* laneStatus: an array to contain status of all lanes. +* +* Status for JESD204B: laneStatus +* laneStatus[X] | Bit Name | Description +* ----------------|-----------------|-------------------------------------------------- +* [7] | Reserved | This bit is deprecated. For checksum status use adi_adrv904x_DfrmIlasMismatchGet(). +* [6] | EOF Event | This bit captures the internal status of the framer End of Frame event. Value =1 if framing error during ILAS +* [5] | EOMF Event | This bit captures the internal status of the framer End of Multi-Frame event. Value =1 if framing error during ILAS +* [4] | FS Lost | This bit captures the internal status of the framer Frame Symbol event. Value =1 if framing error during ILAS or user data (invalid replacement characters) +* [3] | LaneValid | This lane is used by the selected deframer. +* [2] | User Data Valid | =1 when in user data (deframer link is up and sending valid DAC data) +* [1] | SYSREF Received | Deframer has received the external SYSREF signal +* [0] | Syncb level | Current level of Syncb signal internal to deframer (=1 means link is up) +* +* Status for JESD204C: laneStatus +* laneStatus[X] | Bit Name | Description +* ----------------|--------------------------|-------------------------------------------------- +* [2:0] | Current lock state | These 3 bits indicate state of JESD204C Lock +* [3] | LaneValid | This lane is used by the selected deframer. +* +* An explanation of what each the value of the 3 bits Current lock state [2:0] is below: +* value | Description +* ----------------|----------------------------------------------------------------------------- +* 0 | Reset +* 1 | Unlocked +* 2 | Block(Blocks aligned) +* 3 | M_Block(Lanes aligned) +* 4 | E_M_Block(Multiblock aligned) +* 5 | FEC_BUF +* 6 | FEC_READY (Good State!) +* 7 | Forced +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X data structure +* \param[in] deframerSel Deframer selection +* \param[out] deframerStatus Pointer to structure contains status for all lanes for the selected deframer. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerStatusGet_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + adi_adrv904x_DeframerStatus_v2_t * const deframerStatus); + +/** +* \brief Get deframer status for the selected deframer. Support for only JESD204B. +* +* \pre This function can be called after JESD204B initialization +* +* Lane Status of structure adi_adrv904x_DfrmErrCounterStatus_t +* Bit | Description +*---------|------------------------------------------------------------- +* [7] | UEK Error, 0 = No Error, 1 = Error +* [6] | NIT Error, 0 = No Error, 1 = Error +* [5] | ILS Status, 0 = Not Completed, 1 = Completed Successfully +* [4] | ILD Status, 0 = Not Completed, 1 = Completed Successfully +* [3] | FS Status, 0 = Not Completed, 1 = Completed Successfully +* [2] | CCS Status, 0 = Not Completed, 1 = Completed Successfully +* [1] | CGS Status, 0 = Not Completed, 1 = Completed Successfully +* [0] | BD Error, 0 = No Error, 1 = Error +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X data structure +* \param[in] deframerSel Deframer selection +* \param[in] laneNumber selects the lane to read (values from 0 - 7) +* \param[out] errCounterStatus Pointer to structure for returning the lane status and error count values. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmErrCounterStatusGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_DeframerSel_e deframerSel, + const uint8_t laneNumber, + adi_adrv904x_DfrmErrCounterStatus_t * const errCounterStatus); + +/** +* \brief Clear the error counters selected deframer. Support for only JESD204B. +* +* \pre This function can be called after JESD204B initialization +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X data structure +* \param[in] deframerSel Deframer selection +* \param[in] laneNumber selects the lane to read (values from 0 - 7) +* \param[in] errCounterMask bitmasks to indicate which error type counters to be cleared. +* b0: BD clear, b1: INT clear, b2: UEK clear. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmErrCounterReset(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + const uint8_t laneNumber, + uint32_t const errCounterMask); + +/** +* \brief Sets a threshold for CRC errors, which when exceeded, triggers the corresponding Deframer IRQ on any lane. +* Lanes error counts are considered independently not the cumulative error count across all lanes. +* A threshold value of 0, which is the default, will trigger the IRQ for any CRC error. +* +* \pre This function can be called after JESD204B/C initialization +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in, out] device Context variable - Pointer to the ADRV904X data structure +* \param[in] threshold numbers of CRC errors to trigger the corresponding Deframer IRQ (default value: 0) +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmErrCounterThresholdSet(adi_adrv904x_Device_t* const device, + const uint8_t threshold); + +/** +* \brief Get deframer status for the selected deframer. Support for only JESD204C. +* +* \pre This function can be called after JESD204C initialization +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X data structure +* \param[in] deframerSel Deframer selection +* \param[in] laneNumber selects the lane to read (values from 0 - 7) +* \param[out] errCounterStatus Pointer to structure for returning the lane status and error count values. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Dfrm204cErrCounterStatusGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_DeframerSel_e deframerSel, + const uint8_t laneNumber, + adi_adrv904x_Dfrm204cErrCounterStatus_t * const errCounterStatus); + +/** +* \brief Clear the error counters selected deframer. Support for only JESD204C. +* +* \pre This function can be called after JESD204C initialization +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X data structure +* \param[in] deframerSel Deframer selection +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Dfrm204cErrCounterReset(adi_adrv904x_Device_t * const device, + const adi_adrv904x_DeframerSel_e deframerSel); + +/** +* \brief to get a deframer link condition up or down. Support for both JESD204 B/C +* +* \pre This function can be called after JESD204B/C initialization +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X data structure +* \param[in] deframerSel Deframer selection +* \param[out] dfrmLinkCondition pointer to a 8 bit value: 0: down, 1: up +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmLinkConditionGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_DeframerSel_e deframerSel, + uint8_t * const dfrmLinkCondition); + +/** +* \brief This function will return the elastic FIFO depth for the selected deframer. +* +* \pre This function can be called after JESD204B/C initialization +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X data structure +* \param[in] deframerSel Deframer selection +* \param[in] laneNumber selects the lane to read (values from 0 - 7) +* \param[out] fifoDepth Pointer that will hold the elastic FIFO depth. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmFifoDepthGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + const uint8_t laneNumber, + uint8_t * const fifoDepth); + +/** +* \brief This function will return the core buffer depth for the selected deframer. +* +* \pre This function can be called after JESD204B/C initialization +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X data structure +* \param[in] deframerSel Deframer selection +* \param[out] coreBufDepth Pointer that will hold the core buffer depth. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmCoreBufDepthGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + uint8_t * const coreBufDepth); + +/** + * \brief This API is deprecated and replaced by adi_adrv904x_DfrmIlasMismatchGet_v2(). + * Compares received Lane0 ILAS configuration to ADRV904X deframer + * configuration and returns 32-bit mask indicating values that + * mismatched. Actual lane0 ILAS configuration and deframer + * configuration values can be obtained by passing a pointer to a + * structure of type adi_adrv904x_DfrmCompareData_t. + * + * \pre The Rx JESD204B link(s) needs to be configured and running to use + * this function + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * mismatch Mask| Description + * -------------|------------------------------------------ + * [14] | Lane0 Checksum, 0 = match, 1 = mismatch + * [13] | HD, 0 = match, 1 = mismatch + * [12] | CF, 0 = match, 1 = mismatch + * [11] | S, 0 = match, 1 = mismatch + * [10] | NP, 0 = match, 1 = mismatch + * [9] | CS, 0 = match, 1 = mismatch + * [8] | N, 0 = match, 1 = mismatch + * [7] | M, 0 = match, 1 = mismatch + * [6] | K, 0 = match, 1 = mismatch + * [5] | F, 0 = match, 1 = mismatch + * [4] | SCR, 0 = match, 1 = mismatch + * [3] | L, 0 = match, 1 = mismatch + * [2] | LID0, 0 = match, 1 = mismatch + * [1] | BID, 0 = match, 1 = mismatch + * [0] | DID, 0 = match, 1 = mismatch + * + * \param[in] device Context variable - Pointer to the ADRV904X data structure + * \param[in] deframerSel Deframer selection + * \param[out] dfrmData Pointer to a adi_adrv904x_DfrmCompareData_t structure that + * returns the deframer ILAS and configuration settings as well as the + * mismatch flag and zero data flag. If the zero flag is set to zero, + * then no valid ILAS data found indicating link is not enabled. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmIlasMismatchGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + adi_adrv904x_DfrmCompareData_t* const dfrmData); + +/** + * \brief Compares received all Lane ILAS configurations to ADRV904X deframer + * configuration and returns 32-bit mask indicating values that + * mismatched for each lane. Actual all lane ILAS configurations and deframer + * configuration values can be obtained by passing a pointer to a + * structure of type adi_adrv904x_DfrmCompareData_v2_t. + * + * \pre The Rx JESD204B link(s) needs to be configured and running to use + * this function + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * mismatch Mask| Description (adi_adrv904x_IlasMismatch_e) + * -------------|------------------------------------------ + * [14] | Lane Checksum, 0 = match, 1 = mismatch + * [13] | HD, 0 = match, 1 = mismatch + * [12] | CF, 0 = match, 1 = mismatch + * [11] | S, 0 = match, 1 = mismatch + * [10] | NP, 0 = match, 1 = mismatch + * [9] | CS, 0 = match, 1 = mismatch + * [8] | N, 0 = match, 1 = mismatch + * [7] | M, 0 = match, 1 = mismatch + * [6] | K, 0 = match, 1 = mismatch + * [5] | F, 0 = match, 1 = mismatch + * [4] | SCR, 0 = match, 1 = mismatch + * [3] | L, 0 = match, 1 = mismatch + * [2] | LID0, 0 = match, 1 = mismatch + * [1] | BID, 0 = match, 1 = mismatch + * [0] | DID, 0 = match, 1 = mismatch + * + * \param[in] device Context variable - Pointer to the ADRV904X data structure + * \param[in] deframerSel Deframer selection + * \param[out] dfrmData Pointer to a adi_adrv904x_DfrmCompareData_v2_t structure that + * returns the deframer ILAS and all lane configurations settings as well as the + * mismatch flag and zero data flag. If the zero flag is set to zero, + * then no valid ILAS data found indicating link is not enabled. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmIlasMismatchGet_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + adi_adrv904x_DfrmCompareData_v2_t* const dfrmData); +/** +* \brief This function will enable JESD framer loopback for the selected framer. +* The ADX Crossbar setting is changed to loopback setting. +* +* \pre This function can be called after JESD204B/C initialization +* - At least one Rx, one TX, and one deframer must be enabled. +* - IQ Sample clock for deframer and framer must match to avoid over/under-sampling. +* - Samples are sent to TX and received at RX. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X data structure +* \param[in] framerSel framer selection to enable loopback. Only one framer is allowed. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerLoopbackSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel); + +/** +* \brief This function will disable JESD framer loopback. adi_adrv904x_FramerLoopbackSet changes the adcCrossbar values, +* so user wants to disable the FramerLoopback and restore the previous adcCrossbar value, they must save it and call +* it as in argument of this function. +* +* \pre This function can be called after adi_adrv904x_FramerLoopbackSet +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X data structure +* \param[in] framerSel framer selection to disable loopback. Only one framer is allowed. +* \param[in] adcXbar pointer to intended adcXbar configuration for after FramerLoopback is disabled. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerLoopbackDisable(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + const adi_adrv904x_AdcSampleXbarCfg_t* const adcXbar); + + +/** +* \brief This function will enable JESD deframer loopback. +* +* \pre This function can be called after JESD204B/C initialization +* - Framer-0 and deframer-0 must be enabled. +* - At least one Rx, one TX must be enabled. +* - IQ Sample clock for deframer and framer must match to avoid over/under-sampling. +* - Samples are sent to RX and received at TX. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X data structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerLoopbackSet(adi_adrv904x_Device_t* const device); + +/** +* \brief This function will disable JESD deframer loopback. +* +* \pre This function can be called after adi_adrv904x_FramerLoopbackSet +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X data structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerLoopbackDisable(adi_adrv904x_Device_t* const device); + + +/** +* \brief This function will disable JESD deframer loopback. adi_adrv904x_DeframerLoopbackSet changes the adcCrossbar values, +* so user wants to disable the DeframerLoopback and restore the previous adcCrossbar value, they must save it and call +* it as in argument of this function. +* +* \pre This function can be called after adi_adrv904x_DeframerLoopbackSet +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X data structure +* \param[in] framerSel framer selection to disable loopback. Only one framer is allowed. +* \param[in] adcXbar pointer to intended adcXbar configuration for after FramerLoopback is disabled. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerLoopbackDisable_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + const adi_adrv904x_AdcSampleXbarCfg_t* const adcXbar); + +/** +* \brief This function will enable JESD deframer lane loopback. +* +* \pre This function can be called after JESD204B/C initialization +* - At least one Rx, one TX, one framer, and one deframer must be enabled. +* - IQ Sample clock for deframer and framer must match to avoid over/under-sampling. +* - Samples are sent to RX and received at TX. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X data structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerLaneLoopbackSet(adi_adrv904x_Device_t* const device); + +/** +* \brief This function will disable JESD deframer lane loopback. +* +* \pre This function can be called after adi_adrv904x_DeframerLaneLoopbackSet. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X data structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerLaneLoopbackDisable(adi_adrv904x_Device_t* const device); + +/** + * \brief Set the framer JESD204B syncb signal mode to SPI or PIN mode + * + * \pre This function is called after the device has been initialized + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in] device Context variable - Pointer to the ADRV904X data structure + * \param[in] framerSelMask Select framer to set syncb mode + * \param[in] syncbMode Value to set syncb mode, '0' PIN mode, '1' SPI mode + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerSyncbModeSet(adi_adrv904x_Device_t* const device, + const uint8_t framerSelMask, + const uint8_t syncbMode); + +/** + * \brief Get the framer JESD204B syncb signal mode + * + * \pre This function is called after the device has been initialized + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in] device Context variable - Pointer to the ADRV904X data structure + * \param[in] framerSelMask Select framer to read syncb status, only one framer could be selected + * \param[out] syncbMode Value to readback syncb mode, '0' PIN mode, '1' SPI mode + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerSyncbModeGet(adi_adrv904x_Device_t* const device, + const uint8_t framerSelMask, + uint8_t* const syncbMode); + +/** + * \brief Set the framer JESD204B syncb signal status + * + * \pre This function is called after the device has been initialized and run in the syncb SPI mode only + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in] device Context variable - Pointer to the ADRV904X data structure + * \param[in] framerSelMask Select framer to set syncb status + * \param[in] syncbStatus Value to set syncb status, '1' the syncb is valid, '0' the syncb is invalid + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerSyncbStatusSet(adi_adrv904x_Device_t* const device, + const uint8_t framerSelMask, + const uint8_t syncbStatus); + +/** + * \brief Get the framer JESD204B syncb signal status + * + * \pre This function is called after the device has been initialized + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in] device Context variable - Pointer to the ADRV904X data structure + * \param[in] framerSelMask Select framer to read syncb status, only one framer could be selected + * \param[out] syncbStatus Value to set syncb status, '1' the syncb is valid, '0' the syncb is invalid + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerSyncbStatusGet(adi_adrv904x_Device_t* const device, + const uint8_t framerSelMask, + uint8_t* const syncbStatus); + +/** + * \brief Get the framer JESD204B syncb signal error counter + * + * \pre This function is called after the device has been initialized + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in] device Context variable - Pointer to the ADRV904X data structure + * \param[in] framerSelMask Select framer to read syncb error counter, only one framer could be selected + * \param[out] syncbErrCnt value to readback syncb error counter + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerSyncbErrCntGet(adi_adrv904x_Device_t* const device, + const uint8_t framerSelMask, + uint8_t* const syncbErrCnt); + +/** + * \brief Reset the framer JESD204B syncb signal error counter + * + * \pre This function is called after the device has been initialized + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in] device Context variable - Pointer to the ADRV904X data structure + * \param[in] framerSelMask Select framer to reset syncb error counter + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerSyncbErrCntReset(adi_adrv904x_Device_t* const device, + const uint8_t framerSelMask); + +/** + * \brief Get the deframer JESD204B syncb signal error counter + * + * \pre This function is called after the device has been initialized + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in] device Context variable - Pointer to the ADRV904X data structure + * \param[in] deframerSelMask Select deframer to read syncb error counter, only one deframer could be selected + * \param[out] syncbErrCnt value to readback syncb error counter + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerSyncbErrCntGet(adi_adrv904x_Device_t* const device, + const uint8_t deframerSelMask, + uint8_t* const syncbErrCnt); + +/** + * \brief Reset the deframer JESD204B syncb signal error counter + * + * \pre This function is called after the device has been initialized + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in] device Context variable - Pointer to the ADRV904X data structure + * \param[in] deframerSelMask Select deframer to reset syncb error counter + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerSyncbErrCntReset(adi_adrv904x_Device_t* const device, + const uint8_t deframerSelMask); + +/** + * \brief Clears, Enables or disables the Framer errors: + * - PCLK related errors, i.e., whether it is faster/slower than the sample/convertor clock + * - SYSREF Phase Error + * + * \pre This function is called after the device has been initialized + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in] device Context variable - Pointer to the ADRV904X data structure + * \param[in] framerSel - selected framer defined in adi_adrv904x_FramerSel_e + * \param[in] action - selected error action defined in adi_adrv904x_SerdesErrAction_e + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerErrorCtrl(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + const adi_adrv904x_SerdesErrAction_e action); + + + +/** + * \brief Clears, Enables or disables the Deframer errors: + * - PCLK related errors, i.e., whether it is faster/slower than the sample/convertor clock + * - SYSREF Phase Error + * + * \pre This function is called after the device has been initialized + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in] device Context variable - Pointer to the ADRV904X data structure + * \param[in] deframerSel - selected deframer defined in adi_adrv904x_DeframerSel_e + * \param[in] action - selected error action defined in adi_adrv904x_SerdesErrAction_e + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerErrorCtrl(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + const adi_adrv904x_SerdesErrAction_e action); + +/** + * \brief Reads the JESD 204B IRQ interrupt clear register. There is one common register for all deframers. + * + * This function reads the contents of the deframer 204B IRQ clear register. Use this function whenever a general purpose (GP) + * deframer IRQ asserts to find the maskable deframer IRQ sources. Note: Deframer IRQ sources Elastic Buffer Error Flag, + * Sysref Buffer Error, and the four Lane FIFO Async Error IRQ sources are always enabled and can not be masked in the + * interrupt clear register. + * + * \pre This function may be called any time after JESD204B link initialization + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[out] irqMask Pointer to the bit mask value containing the contents of the deframer IRQ Clear Register + * + * Bit | Description + * -------------|----------------------------------------------------------------------------- + * [15] | UnUsed + * [14] | UnUsed + * [13] | UnUsed + * [12] | UnUsed + * [11] | UnUsed + * [10] | UnUsed + * [9] | UnUsed + * [8] | CMM - Configuration mismatch for lane0 0 = No Interrupt, 1 = Interrupt Asserted + * [7] | BD - Bad Disparity error counter 0 = No Interrupt, 1 = Interrupt Asserted + * [6] | Not-In-Table error counter 0 = No Interrupt, 1 = Interrupt Asserted + * [5] | Unexpected K error counter 0 = No Interrupt, 1 = Interrupt Asserted + * [4] | ILD - Inter-lane De-skew 0 = No Interrupt, 1 = Interrupt Asserted + * [3] | ILS - Initial lane sync 0 = No Interrupt, 1 = Interrupt Asserted + * [2] | GCS - Good Check Sum 0 = No Interrupt, 1 = Interrupt Asserted + * [1] | FS - Frame Sync 0 = No Interrupt, 1 = Interrupt Asserted + * [0] | CSG - Code Group Sync 0 = No Interrupt, 1 = Interrupt Asserted + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmIrqMaskGet( adi_adrv904x_Device_t* const device, + uint16_t* const irqMask); + +/** + * \brief Writes the JESD 204B IRQ interrupt clear register. There is one common register for all deframers. + * + * This function writes the specified IRQ mask value to the deframer 204B IRQ clear register. Use this function whenever a general purpose (GP) + * deframer IRQ asserts to clear the pending maskable deframer IRQ or to enable/disable deframer interrupt sources. Note: Deframer IRQ sources + * Elastic Buffer Error Flag, Sysref Buffer Error, and the four Lane FIFO Async Error IRQ sources are always enabled and can not be masked in the + * interrupt clear register. This function does not read-modify-write the interrupt clear register. To manually clear the interrupt, write + * a one (set) to disable or mask the bit of the interrupt followed by writing a zero (clear) to enable the bit of the interrupt. + * However, if the interrupt condition still exists after setting the mask bit, the corresponding IRQ vector bit will re-assert. + * + * \pre This function may be called any time after Jesd204B link initialization + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] irqMask Pointer to the bit mask value to be written to the deframer IRQ Clear Register (this is not a read-modify-write) + * + * Bit | Description + * -------------|----------------------------------------------------------------------------- + * [15] | UnUsed + * [14] | UnUsed + * [13] | UnUsed + * [12] | UnUsed + * [11] | UnUsed + * [10] | UnUsed + * [9] | UnUsed + * [8] | CMM - Configuration mismatch for lane0 0 = No Interrupt, 1 = Interrupt Asserted + * [7] | BD - Bad Disparity error counter 0 = No Interrupt, 1 = Interrupt Asserted + * [6] | Not-In-Table error counter 0 = No Interrupt, 1 = Interrupt Asserted + * [5] | Unexpected K error counter 0 = No Interrupt, 1 = Interrupt Asserted + * [4] | ILD - Inter-lane De-skew 0 = No Interrupt, 1 = Interrupt Asserted + * [3] | ILS - Initial lane sync 0 = No Interrupt, 1 = Interrupt Asserted + * [2] | GCS - Good Check Sum 0 = No Interrupt, 1 = Interrupt Asserted + * [1] | FS - Frame Sync 0 = No Interrupt, 1 = Interrupt Asserted + * [0] | CSG - Code Group Sync 0 = No Interrupt, 1 = Interrupt Asserted + * + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmIrqMaskSet( adi_adrv904x_Device_t* const device, + const uint16_t irqMask); + +/** + * \brief Reset the JESD 204B IRQ interrupt clear register. There is one common register for all deframers. + * + * This function clears all deframer 204B IRQ sources. Use this function whenever a general purpose (GP) + * deframer IRQ asserts to clear the pending deframer IRQ. + * + * \pre This function may be called any time after JESD204b link initialization + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmIrqSourceReset( adi_adrv904x_Device_t* const device); + +/** + * \brief Read the JESD 204B IRQ interrupt source registers for the specified deframer. + * + * This function fetches the contents of the deframer 204B IRQ Vector register and other IRQ sources. Use this function whenever + * a general purpose (GP) deframer IRQ asserts to determine the source of the deframer IRQ. Common IRQ sources are Bad Disparity (BD), + * Not-In-Table (NIT), and Unexpected K-char (UEK) counters greater than the specified error threshold count value. + * + * \pre This function may be called any time after JESD204B link initialization + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] deframerSelect Selects the deframer to interrogate. + * \param[out] irqSourceVector Pointer to a bit mask containing the status of the IRQ Vector source register at read time. + * + * Bit | Description + * -------------|----------------------------------------------------------------------------- + * [15] | UnUsed + * [14] | UnUsed + * [13] | UnUsed + * [12] | UnUsed + * [11] | UnUsed + * [10] | UnUsed + * [9] | UnUsed + * [8] | CMM - Configuration mismatch for lane0 0 = No Interrupt, 1 = Interrupt Asserted + * [7] | BD - Bad Disparity error counter 0 = No Interrupt, 1 = Interrupt Asserted + * [6] | Not-In-Table error counter 0 = No Interrupt, 1 = Interrupt Asserted + * [5] | Unexpected K error counter 0 = No Interrupt, 1 = Interrupt Asserted + * [4] | ILD - Inter-lane De-skew 0 = No Interrupt, 1 = Interrupt Asserted + * [3] | ILS - Initial lane sync 0 = No Interrupt, 1 = Interrupt Asserted + * [2] | GCS - Good Check Sum 0 = No Interrupt, 1 = Interrupt Asserted + * [1] | FS - Frame Sync 0 = No Interrupt, 1 = Interrupt Asserted + * [0] | CSG - Code Group Sync 0 = No Interrupt, 1 = Interrupt Asserted + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmIrqSourceGet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSelect, + adi_adrv904x_DeframerIrqVector_t* const irqSourceVector); + +/** +* \brief Used to configure and reset the deframer JESD 204B Error counters Bad Disparity Error (BD), +* Not-In-Table (NIT), Unexpected K-char (UEK). +* +* This function allows individual counter enable/disable, reset, and configuration control +* for all lanes. IRQ Mask updates will affect all deframers identically. +* This function will set the error counter interrupt bits at deframer interrupt request +* mask according to interruptEnable input +* +* \pre This function may be called any time after Jesd link initialization +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] interruptEnable argument to enable/disable GPINT in case error counters overflow 255 +* \param[in] laneNumber Lane number for which to set config. +* \param[in] errCounterControl 8-bit mask for enabling/disabling and resetting individual counters. +* +* bit | Lane +* -----|------------------ +* 0 | Bad Disparity Error 0 = disable, 1 = enable +* 1 | Not-In-Table (NIT) 0 = disable, 1 = enable +* 2 | Unexpected K-char (UEK) 0 = disable, 1 = enable +* 3 | Reserved +* 4 | Bad Disparity Error 0 = Do not reset counter, 1 = Reset counter to zero +* 5 | Not-In-Table (NIT) 0 = Do not reset counter, 1 = Reset counter to zero +* 6 | Unexpected K-char (UEK) 0 = Do not reset counter, 1 = Reset counter to zero +* 7 | Reserved +* +* \param[in] errCounterHoldCfg 8-bit mask for configuring the deframer error counters to stop counting +* on overflow from 0xFF or to reset and continue counting. +* +* bit | Lane +* -----|------------------ +* 0 | Bad Disparity Error 0 = Reset and continue counting, 1 = Stop counting at 0xFF overflow +* 1 | Not-In-Table (NIT) 0 = Reset and continue counting, 1 = Stop counting at 0xFF overflow +* 2 | Unexpected K-char (UEK) 0 = Reset and continue counting, 1 = Stop counting at 0xFF overflow +* 3 | Reserved +* 4 | Reserved +* 5 | Reserved +* 6 | Reserved +* 7 | Reserved +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmErrCntrCntrlSet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfrmErrCounterIrqSel_e interruptEnable, + const uint8_t laneNumber, + const uint8_t errCounterControl, + const uint8_t errCounterHoldCfg); + +/** +* \brief Used to read the configuration for the deframer JESD 204B error counters Bad Disparity Error (BD), +* Not-In-Table (NIT), Unexpected K-char (UEK). Counter controls are common to all deframers. +* +* \pre This function may be called any time after Jesd link initialization +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] laneNumber Lane number for which to read config. +* \param[out] errCounterControl Pointer to 8-bit variable containing individual counters enable bits. +* +* bit | Lane +* -----|------------------ +* 0 | Bad Disparity Error 0 = disable, 1 = enable +* 1 | Not-In-Table (NIT) 0 = disable, 1 = enable +* 2 | Unexpected K-char (UEK) 0 = disable, 1 = enable +* 3 | Reserved +* 4 | Reserved +* 5 | Reserved +* 6 | Reserved +* 7 | Reserved +* +* \param[out] errCounterHoldCfg Pointer to 8-bit variable containing configuration for deframer error counters to stop counting +* on overflow from 0xFF or to reset and continue counting. +* +* bit | Lane +* -----|------------------ +* 0 | Bad Disparity Error 0 = Reset and continue counting, 1 = Stop counting at 0xFF overflow +* 1 | Not-In-Table (NIT) 0 = Reset and continue counting, 1 = Stop counting at 0xFF overflow +* 2 | Unexpected K-char (UEK) 0 = Reset and continue counting, 1 = Stop counting at 0xFF overflow +* 3 | Reserved +* 4 | Reserved +* 5 | Reserved +* 6 | Reserved +* 7 | Reserved +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmErrCntrCntrlGet( adi_adrv904x_Device_t* const device, + const uint8_t laneNumber, + uint8_t* const errCounterControl, + uint8_t* const errCounterHoldCfg); + +/** +* \brief This function will run SERDES horizontal eye sweep. +* +* \pre This function can be called after JESD204B/C initialization +* - At least one Rx, one TX, one framer, and one deframer must be enabled. +* - IQ Sample clock for deframer and framer must match to avoid over/under-sampling. +* - PRBS pattern matching the one selected in this API must be enabled on the sender side before running the test +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X data structure +* \param[in] runEyeSweep Eye Sweep configuration +* \param[out] runEyeSweepResp Eye Sweep Response structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RunEyeSweep(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuCmd_RunEyeSweep_t* const runEyeSweep, + adi_adrv904x_CpuCmd_RunEyeSweepResp_t* const runEyeSweepResp); + +/** +* \brief This function will run SERDES horizontal eye sweep. For larger eyes and longer dwell times +* the capture time can sometimes exceed the command server timeout especially when tracking +* calibrations are in progress. To address this issue, a new Serdes Control Command is used. +* +* \pre This function can be called after JESD204B/C initialization +* - At least one Rx, one TX, one framer, and one deframer must be enabled. +* - IQ Sample clock for deframer and framer must match to avoid over/under-sampling. +* - PRBS pattern matching the one selected in this API must be enabled on the sender side before running the test +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X data structure +* \param[in] runEyeSweep Eye Sweep configuration +* \param[out] runEyeSweepResp Eye Sweep Response structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RunEyeSweep_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuCmd_RunEyeSweep_t* const runEyeSweep, + adi_adrv904x_CpuCmd_RunEyeSweepResp_t* const runEyeSweepResp); + +/** +* \brief This function will run SERDES vertical eye sweep. +* +* \pre This function can be called after JESD204B/C initialization +* - At least one Rx, one TX, one framer, and one deframer must be enabled. +* - IQ Sample clock for deframer and framer must match to avoid over/under-sampling. +* - PRBS pattern matching the one selected in this API must be enabled on the sender side before running the test +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X data structure +* \param[in] runVerticalEyeSweep Vertical Eye Sweep configuration +* \param[out] runVerticalEyeSweepResp Vertical Eye Sweep Response structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RunVerticalEyeSweep(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuCmd_RunVertEyeSweep_t* const runVerticalEyeSweep, + adi_adrv904x_CpuCmd_RunVertEyeSweepResp_t* const runVerticalEyeSweepResp); + +/** +* \brief This function will run SERDES vertical eye sweep. For larger eyes and longer dwell times +* the capture time can sometimes exceed the command server timeout especially when tracking +* calibrations are in progress. To address this issue, a new Serdes Control Command is used. +* +* \pre This function can be called after JESD204B/C initialization +* - At least one Rx, one TX, one framer, and one deframer must be enabled. +* - IQ Sample clock for deframer and framer must match to avoid over/under-sampling. +* - PRBS pattern matching the one selected in this API must be enabled on the sender side before running the test +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X data structure +* \param[in] runVerticalEyeSweep Vertical Eye Sweep configuration +* \param[out] runVerticalEyeSweepResp Vertical Eye Sweep Response structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RunVerticalEyeSweep_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuCmd_RunVertEyeSweep_t* const runVerticalEyeSweep, + adi_adrv904x_CpuCmd_RunVertEyeSweepResp_t* const runVerticalEyeSweepResp); + +/** + * \brief Injects an error into the Framer test data by inverting the data + * + * This is a debug function to be used for debug of the Rx JESD204B/C lanes. + * Rx data transmission on the JESD204B/C link(s) is not possible + * when the framer test data is activated. + * + * \pre This function is called after the framer test data is enabled. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] framerSelect Select the desired framer ADI_ADRV904X_FRAMER_0, ADI_ADRV904X_FRAMER_1, ADI_ADRV904X_FRAMER_2 + * \param[in] laneMask is an eight bit mask allowing selection of lanes 0-7 (at package balls) for the selected framer + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerTestDataInjectError(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSelect, + const uint8_t laneMask); + +/** + * \brief Sets the serializer lane configuration parameters for + * the chosen lane + * \pre This function is called after the device has been initialized + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device - Context variable, pointer to the device settings structure + * \param[in] laneNumber - Selects the serializer lane (values from 0 - 7) + * \param[in] serLaneCfg - Pointer to the Serializer Lane settings structure adi_adrv904x_SerLaneCfg_t + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SerLaneCfgSet(adi_adrv904x_Device_t* const device, + const uint8_t laneNumber, + const adi_adrv904x_SerLaneCfg_t* const serLaneCfg); +/** + * \brief Gets the serializer lane configuration parameters for + * the chosen lane + * + * \pre This function is called after the device has been initialized + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device - Context variable, pointer to the device settings structure + * \param[in] laneNumber - Selects the serializer lane (values from 0 - 7) + * \param[out] serLaneCfg - Pointer to the Serializer Lane settings structure adi_adrv904x_SerLaneCfg_t + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SerLaneCfgGet(adi_adrv904x_Device_t* const device, + const uint8_t laneNumber, + adi_adrv904x_SerLaneCfg_t* const serLaneCfg); + +/** + * \brief Retrieve initial calibration status for SERDIN lane. + * + * If a filename is supplied the data is also written as a single line containing a comma separated list of + * human-readable values. If the file does not exist it is created. If it does exist it is appended to. The file is + * flushed and closed before the function returns. + * + * In the case where the fuction creates the file it will first write four lines in this order: + * - a line indicating the file contains serdes calibration information + * - a line indicating the API version number + * - a header line indicating the meaning of the fields written by InitCalStatusGet() + * - a header line indicating the meaning of the fields written by TrackingCalStatusGet() + * before then writing the initial cal data line itself. The line's first field will have the value 'ic'. + * + * Other than in the header line the exact format of the line written is not defined but can be analyzed by a + * stand-alone ADI-supplied application which will recommend serdes configuration changes based on the contents. + * + * It is intended that both InitCalStatusGet() and TrackingCalStatusGet() are passed the same value for filePath. + * + * As the initial calibration only occurs once, subsequent calls to this function will return the same data as the + * initial call. + * + * \param[in,out] device Context variable - Context variable - Structure pointer to the ADRV904X device data structure + * \param[in] filePath May be NULL. If set is the filename to which to write the data + * \param[in] laneNumber Selects the SERDIN lane + * \param[in] msg May be NULL. If set this text will be included in the data written to file + * \param[out] calStatus The serdes init cal status is written out here + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SerdesInitCalStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GenericStrBuf_t* const filePath, + const uint8_t laneNumber, + const adi_adrv904x_GenericStrBuf_t* const msg, + adi_adrv904x_SerdesInitCalStatus_t* const calStatus); + +/** + * \brief Retrieve tracking calibration status for SERDIN lane. + * + * Unless noted below the behaviour of this function is the same as that of SerdesInitCalStatusGet except this function + * deals with serdes tracking cal status data. + * + * In the case where the fuction creates the file it will write initial lines to the file in an identical manner as + * SerdesInitCalStatusGet()before then writing the tracking cal data line itself. The line's first field will have the + * value 'tc'. + * + * Unlike SerdesInitCalStatusGet tracking calibration status changes regularly so subsequent calls to this function + * will return different data. + * + * \param[in,out] device Context variable - Context variable - Structure pointer to the ADRV904X device data structure + * \param[in] filePath May be NULL. If set is the filename to which to write the data + * \param[in] laneNumber Selects the SERDIN lane + * \param[in] msg May be NULL. If set this text will be included in the data written to file + * \param[out] calStatus The serdes tracking cal status is written out here + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SerdesTrackingCalStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GenericStrBuf_t* const filePath, + const uint8_t laneNumber, + const adi_adrv904x_GenericStrBuf_t* const msg, + adi_adrv904x_SerdesTrackingCalStatus_t* calStatus); + + +/** + * \brief Set the CDDC Mode for the selected framer. Only framer 0 and 1 are supported. + * + * \pre This function is called after the device has been initialized + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device - Context variable, pointer to the device settings structure + * \param[in] framerSel - selected of framer defined in adi_adrv904x_FramerSel_e + * \param[in] cddcMode - cddc mode value as defined in adi_adrv904x_CddcMode_e + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CddcModeSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + const adi_adrv904x_CddcMode_e cddcMode); + +/** + * \brief Get the CDDC Mode value for the selected framer. + * + * \pre This function is called after the device has been initialized + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device - Context variable, pointer to the device settings structure + * \param[in] framerSel - selected of framer defined in adi_adrv904x_FramerSel_e + * \param[out] cddcMode - pointer to hold cddc mode value. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CddcModeGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + adi_adrv904x_CddcMode_e * const cddcMode); + +/** + * \brief Set the CDUC Mode for the selected deframer. + * + * \pre This function is called after the device has been initialized + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device - Context variable, pointer to the device settings structure + * \param[in] deframerSel - selected of deframer defined in adi_adrv904x_DeframerSel_e + * \param[in] cducMode - cduc mode value as defined in adi_adrv904x_CducMode_e + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CducModeSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + const adi_adrv904x_CducMode_e cducMode); + +/** + * \brief Get the CDUC Mode value for the selected deframer. + * + * \pre This function is called after the device has been initialized + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device - Context variable, pointer to the device settings structure + * \param[in] deframerSel - selected of deframer defined in adi_adrv904x_DeframerSel_e + * \param[out] cducMode - pointer to hold cduc mode value. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CducModeGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + adi_adrv904x_CducMode_e * const cducMode); + +/** + * \brief Set the CDDC Sample Crossbar for the selected framer and RX channel. Only framer 0 and 1 are supported. + * + * \pre This function is called after the device has been initialized + * For the entries in the structure adi_adrv904x_CddcSampleXbarCfg_t, the valid value is from 0..31. + * Valid value will enable the entry and value 0x80 (128) will mark the entry unused and disable the entry. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device - Context variable, pointer to the device settings structure + * \param[in] framerSel - selected of framer defined in adi_adrv904x_FramerSel_e + * \param[in] rxChanSel - selected RX channel defined in adi_adrv904x_RxChannels_e + * \param[in] cddcSampleXbarCfg - pointer to a structure contains CDDC Sample XBar values + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CddcSampleXBarSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + const adi_adrv904x_RxChannels_e rxChanSel, + const adi_adrv904x_CddcSampleXbarCfg_t * const cddcSampleXbarCfg); + +/** + * \brief Get the CDDC Sample Crossbar for the selected framer and RX channel. Only framer 0 and 1 are supported. + * For the entries in the structure adi_adrv904x_CddcSampleXbarCfg_t, the valid value is from 0..31. + * Value 0x80 (128) indicates the entry unused and disabled. + * + * \pre This function is called after the device has been initialized + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device - Context variable, pointer to the device settings structure + * \param[in] framerSel - selected of framer defined in adi_adrv904x_FramerSel_e + * \param[in] rxChanSel - selected RX channel defined in adi_adrv904x_RxChannels_e + * \param[out] cddcSampleXbarCfg - pointer to a structure to contain the return of CDDC Sample XBar values + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CddcSampleXBarGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + const adi_adrv904x_RxChannels_e rxChanSel, + adi_adrv904x_CddcSampleXbarCfg_t * const cddcSampleXbarCfg); + +/** + * \brief Set the CDUC Sample Crossbar for the selected deframer and TX channel. + * + * \pre This function is called after the device has been initialized + * For the entries in the structure adi_adrv904x_CducSampleXbarCfg_t, the valid value is from 0..31. + * Valid value will enable the entry and value 0x80 (128) will mark the entry unused and disable the entry. + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device - Context variable, pointer to the device settings structure + * \param[in] deframerSel - selected of deframer defined in adi_adrv904x_DeframerSel_e + * \param[in] txChanSel - selected TX channel defined in adi_adrv904x_TxChannels_e + * \param[in] cducSampleXbarCfg - pointer to a structure contains CDUC Sample XBar values. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CducSampleXBarSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + const adi_adrv904x_TxChannels_e txChanSel, + const adi_adrv904x_CducSampleXbarCfg_t * const cducSampleXbarCfg); + +/** + * \brief Get the CDUC Sample Crossbar for the selected deframer and TX channel. + * For the entries in the structure adi_adrv904x_CducSampleXbarCfg_t, the valid value is from 0..31. + * Value 0x80 (128) indicates the entry unused and disabled. + * + * \pre This function is called after the device has been initialized + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device - Context variable, pointer to the device settings structure + * \param[in] deframerSel - selected of deframer defined in adi_adrv904x_DeframerSel_e + * \param[in] txChanSel - selected RX channel defined in adi_adrv904x_TxChannels_e + * \param[out] cducSampleXbarCfg - pointer to a structure to contain the return of CDUC Sample XBar values + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CducSampleXBarGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + const adi_adrv904x_TxChannels_e txChanSel, + adi_adrv904x_CducSampleXbarCfg_t * const cducSampleXbarCfg); + +/** + * \brief Set the CDDC RX Channel Crossbar for the selected framer. Only framer 0 and 1 are supported. + * For the entries in the structure adi_adrv904x_CddcChannelXbarCfg_t, the valid value is from 0..7. + * Valid value will enable the entry and value 0x80 (128) will mark the entry unused and disable the entry. + * + * \pre This function is called after the device has been initialized + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device - Context variable, pointer to the device settings structure + * \param[in] framerSel - selected of framer defined in adi_adrv904x_FramerSel_e + * \param[in] cddcChannelXbarCfg - pointer to a structure contains RX Channel XBar values + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CddcRxChanXBarSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + const adi_adrv904x_CddcChannelXbarCfg_t * const cddcChannelXbarCfg); + +/** + * \brief Get the CDDC RX Channel Crossbar values for the selected framer. Only framer 0 and 1 are supported. + * For the entries in the structure adi_adrv904x_CddcChannelXbarCfg_t, the valid value is from 0..7. + * Value 0x80 (128) indicates the entry unused and disabled. + * + * \pre This function is called after the device has been initialized + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device - Context variable, pointer to the device settings structure + * \param[in] framerSel - selected of framer defined in adi_adrv904x_FramerSel_e + * \param[out] cddcChannelXbarCfg - pointer to a structure to contain the return of CDDC RX Channel XBar values + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CddcRxChanXBarGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + adi_adrv904x_CddcChannelXbarCfg_t * const cddcChannelXbarCfg); + +/** + * \brief Set the CDUC TX Channel Crossbar for the selected deframer. + * + * \pre This function is called after the device has been initialized + * For the entries in the structure adi_adrv904x_CducChannelXbarCfg_t, the valid value is from 0..7. + * Valid value will enable the entry and value 0x80 (128) will mark the entry unused and disable the entry. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device - Context variable, pointer to the device settings structure + * \param[in] deframerSel - selected of deframer defined in adi_adrv904x_DeframerSel_e + * \param[in] cducChannelXbarCfg - pointer to a structure contains CDUC TX Channel XBar values + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CducTxChanXBarSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + const adi_adrv904x_CducChannelXbarCfg_t * const cducChannelXbarCfg); + +/** + * \brief Get the CDUC TX Channel Crossbar values for the selected deframer. + * + * \pre This function is called after the device has been initialized + * For the entries in the structure adi_adrv904x_CducChannelXbarCfg_t, the valid value is from 0..7. + * Value 0x80 (128) indicates the entry unused and disabled. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device - Context variable, pointer to the device settings structure + * \param[in] deframerSel - selected of deframer defined in adi_adrv904x_DeframerSel_e + * \param[out] cducChannelXbarCfg - pointer to a structure to contain the return of CDUC TX Channel XBar values + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CducTxChanXBarGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + adi_adrv904x_CducChannelXbarCfg_t * const cducChannelXbarCfg); + +/** + * \brief Sets the ORX ADC sample crossbar for the specified framer-2 + * It does not support framer-0 and framer-1. For framer-1 and Framer-2 must use adi_adrv904x_AdcSampleXbarSet + * + * \pre This function is called after JESD204B/C initialization + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Pointer to the device settings structure + * \param[in] framerSel selected of framer defined in adi_adrv904x_FramerSel_e + * \param[in] orxAdcXbar Pointer to the JESD structure adi_adrv904x_OrxAdcSampleXbarCfg_t + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_OrxAdcSampleXbarSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + const adi_adrv904x_OrxAdcSampleXbarCfg_t* const orxAdcXbar); + +/** + * \brief Gets the ORX ADC sample crossbar converter configuration map for framer-2 + * It does not support framer-0 and framer-1. For framer-1 and Framer-2 must use adi_adrv904x_AdcSampleXbarGet + * + * \pre This function is called after JESD204B/C initialization + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Pointer to the device settings structure + * \param[in] framerSel selected of framer defined in adi_adrv904x_FramerSel_e + * \param[out] orxAdcXbar Pointer to the JESD structure adi_adrv904x_OrxAdcSampleXbarCfg_t + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_OrxAdcSampleXbarGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + adi_adrv904x_OrxAdcSampleXbarCfg_t* const orxAdcXbar); +#endif /* _ADI_ADRV904X_DATAINTERFACE_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_datainterface_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_datainterface_types.h new file mode 100644 index 00000000000..0d6d2268f19 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_datainterface_types.h @@ -0,0 +1,796 @@ + /** + * Copyright 2015 - 2023 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adi_adrv904x_datainterface_types.h + * \brief Contains ADRV904X API data types related to the data interface + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADI_ADRV904X_DATAINTERFACE_TYPES_H_ +#define _ADI_ADRV904X_DATAINTERFACE_TYPES_H_ + +#include "adi_common_error.h" + +/** + * \brief Data structure defining the locations where the Rx Capture RAM can be used. + */ +typedef enum adi_adrv904x_RxOrxDataCaptureLocation +{ + ADI_ADRV904X_CAPTURE_LOC_DDC0 = 0, /*!< DDC0 output */ + ADI_ADRV904X_CAPTURE_LOC_DDC1 = 1, /*!< DDC1 output */ + ADI_ADRV904X_CAPTURE_LOC_DPD = 2, /*!< pre and post DPD */ + ADI_ADRV904X_CAPTURE_LOC_DPD_PRE = 3, /*!< DPD input */ + ADI_ADRV904X_CAPTURE_LOC_DPD_POST = 4, /*!< DPD output */ + ADI_ADRV904X_CAPTURE_LOC_FSC = 10, /*!< FSC */ + ADI_ADRV904X_CAPTURE_LOC_DATAPATH = 11, /*!< ORx Formatter input */ + ADI_ADRV904X_CAPTURE_LOC_ORX_TX0 = 13, /*!< Synchronized DPD/ORX */ + ADI_ADRV904X_CAPTURE_LOC_ORX_TX1 = 14, /*!< Synchronized DPD/ORX */ + ADI_ADRV904X_CAPTURE_LOC_ORX_TX2 = 15, /*!< Synchronized DPD/ORX */ + ADI_ADRV904X_CAPTURE_LOC_ORX_TX3 = 16, /*!< Synchronized DPD/ORX */ + ADI_ADRV904X_CAPTURE_LOC_ORX_TX4 = 17, /*!< Synchronized DPD/ORX */ + ADI_ADRV904X_CAPTURE_LOC_ORX_TX5 = 18, /*!< Synchronized DPD/ORX */ + ADI_ADRV904X_CAPTURE_LOC_ORX_TX6 = 19, /*!< Synchronized DPD/ORX */ + ADI_ADRV904X_CAPTURE_LOC_ORX_TX7 = 20, /*!< Synchronized DPD/ORX */ +} adi_adrv904x_RxOrxDataCaptureLocation_e; + +#define ADI_ADRV904X_MAX_DESERIALIZER_LANES 8U +#define ADI_ADRV904X_MAX_SERIALIZER_LANES 8U +#define ADI_ADRV904X_FRAMER_CONVERTERS 24U +#define ADI_ADRV904X_NUM_DEFRAMERS_SAMPLE_XBAR 8U +#define ADI_ADRV904X_NUM_FRAMERS_SAMPLE_XBAR 64U +#define ADI_ADRV904X_NUM_LKSH_SAMPLE_XBAR 32U +#define ADI_ADRV904X_MAX_CONVERTER 64U +#define ADI_ADRV904X_MAX_CDDC_CONVERTER 32U +#define ADI_ADRV904X_MAX_FRAMERS 3U +#define ADI_ADRV904X_MAX_FRAMERS_LS 2U +#define ADI_ADRV904X_MAX_DEFRAMERS 2U + + +#define ADI_ADRV904X_NUM_DAC_SAMPLE_XBAR 32U + +/** +* \brief Enum to select desired framer +*/ +typedef enum adi_adrv904x_FramerSel +{ + ADI_ADRV904X_FRAMER_0 = 0x01U, /*!< Framer 0 selected */ + ADI_ADRV904X_FRAMER_1 = 0x02U, /*!< Framer 1 selected */ + ADI_ADRV904X_FRAMER_2 = 0x04U, /*!< Framer 2 selected */ + ADI_ADRV904X_ALL_FRAMERS = (ADI_ADRV904X_FRAMER_0 | ADI_ADRV904X_FRAMER_1 | ADI_ADRV904X_FRAMER_2) /*!< All Framers selected */ + +} adi_adrv904x_FramerSel_e; + +/** +* \brief Enum to select desired deframer +*/ +typedef enum adi_adrv904x_DeframerSel +{ + ADI_ADRV904X_DEFRAMER_0 = 0x01U, /*!< Deframer 0 selection */ + ADI_ADRV904X_DEFRAMER_1 = 0x02U, /*!< Deframer 1 selection */ + ADI_ADRV904X_ALL_DEFRAMER = (ADI_ADRV904X_DEFRAMER_0 | ADI_ADRV904X_DEFRAMER_1) /*!< Used for cases where Tx1 uses one deframer, Tx2 uses the second deframer */ +} adi_adrv904x_DeframerSel_e; + +/** +* \brief Enumerated list of ADC Sample Xbar options +*/ +typedef enum adi_adrv904x_AdcSampleXbarSel +{ + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX0_BAND_0_DATA_I = 0u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX0_BAND_0_DATA_Q = 1u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX0_BAND_1_DATA_I = 2u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX0_BAND_1_DATA_Q = 3u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX1_BAND_0_DATA_I = 4u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX1_BAND_0_DATA_Q = 5u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX1_BAND_1_DATA_I = 6u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX1_BAND_1_DATA_Q = 7u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX2_BAND_0_DATA_I = 8u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX2_BAND_0_DATA_Q = 9u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX2_BAND_1_DATA_I = 10u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX2_BAND_1_DATA_Q = 11u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX3_BAND_0_DATA_I = 12u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX3_BAND_0_DATA_Q = 13u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX3_BAND_1_DATA_I = 14u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX3_BAND_1_DATA_Q = 15u, + + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX4_BAND_0_DATA_I = 16u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX4_BAND_0_DATA_Q = 17u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX4_BAND_1_DATA_I = 18u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX4_BAND_1_DATA_Q = 19u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX5_BAND_0_DATA_I = 20u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX5_BAND_0_DATA_Q = 21u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX5_BAND_1_DATA_I = 22u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX5_BAND_1_DATA_Q = 23u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX6_BAND_0_DATA_I = 24u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX6_BAND_0_DATA_Q = 25u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX6_BAND_1_DATA_I = 26u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX6_BAND_1_DATA_Q = 27u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX7_BAND_0_DATA_I = 28u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX7_BAND_0_DATA_Q = 29u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX7_BAND_1_DATA_I = 30u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX7_BAND_1_DATA_Q = 31u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_LAST_VALID_NO_INT = ADI_ADRV904X_JESD_FRM_SPLXBAR_RX7_BAND_1_DATA_Q, + /* With no interleaving enabled */ + + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_0 = 32u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_1 = 33u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_2 = 34u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_3 = 35u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_4 = 36u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_5 = 37u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_6 = 38u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_7 = 39u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_0 = 40u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_1 = 41u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_2 = 42u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_3 = 43u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_4 = 44u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_5 = 45u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_6 = 46u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_7 = 47u, + + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_0 = 48u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_1 = 49u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_2 = 50u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_3 = 51u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_4 = 52u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_5 = 53u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_6 = 54u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_7 = 55u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_0 = 56u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_1 = 57u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_2 = 58u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_3 = 59u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_4 = 60u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_5 = 61u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_6 = 62u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_7 = 63u, + ADI_ADRV904X_JESD_FRM_SPLXBAR_LAST_VALID = ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_7, + ADI_ADRV904X_JESD_FRM_SPLXBAR_INVALID = 0x7Fu +} adi_adrv904x_AdcSampleXbarSel_e; + +/** +* \brief Data structure to hold the DAC sample crossbar information +*/ +typedef enum adi_adrv904x_DacSampleXbarSel +{ + ADI_ADRV904X_DEFRAMER_OUT0 = 0u, + ADI_ADRV904X_DEFRAMER_OUT1 = 1u, + ADI_ADRV904X_DEFRAMER_OUT2 = 2u, + ADI_ADRV904X_DEFRAMER_OUT3 = 3u, + ADI_ADRV904X_DEFRAMER_OUT4 = 4u, + ADI_ADRV904X_DEFRAMER_OUT5 = 5u, + ADI_ADRV904X_DEFRAMER_OUT6 = 6u, + ADI_ADRV904X_DEFRAMER_OUT7 = 7u, + ADI_ADRV904X_DEFRAMER_OUT8 = 8u, + ADI_ADRV904X_DEFRAMER_OUT9 = 9u, + ADI_ADRV904X_DEFRAMER_OUT10 = 10u, + ADI_ADRV904X_DEFRAMER_OUT11 = 11u, + ADI_ADRV904X_DEFRAMER_OUT12 = 12u, + ADI_ADRV904X_DEFRAMER_OUT13 = 13u, + ADI_ADRV904X_DEFRAMER_OUT14 = 14u, + ADI_ADRV904X_DEFRAMER_OUT15 = 15u, + ADI_ADRV904X_DEFRAMER_OUT16 = 16u, + ADI_ADRV904X_DEFRAMER_OUT17 = 17u, + ADI_ADRV904X_DEFRAMER_OUT18 = 18u, + ADI_ADRV904X_DEFRAMER_OUT19 = 19u, + ADI_ADRV904X_DEFRAMER_OUT20 = 20u, + ADI_ADRV904X_DEFRAMER_OUT21 = 21u, + ADI_ADRV904X_DEFRAMER_OUT22 = 22u, + ADI_ADRV904X_DEFRAMER_OUT23 = 23u, + ADI_ADRV904X_DEFRAMER_OUT24 = 24u, + ADI_ADRV904X_DEFRAMER_OUT25 = 25u, + ADI_ADRV904X_DEFRAMER_OUT26 = 26u, + ADI_ADRV904X_DEFRAMER_OUT27 = 27u, + ADI_ADRV904X_DEFRAMER_OUT28 = 28u, + ADI_ADRV904X_DEFRAMER_OUT29 = 29u, + ADI_ADRV904X_DEFRAMER_OUT30 = 30u, + ADI_ADRV904X_DEFRAMER_OUT31 = 31u, + + ADI_ADRV904X_DEFRAMER_LAST_VALID = 31u, + + ADI_ADRV904X_DEFRAMER_OUT_INVALID = 0x7Fu +} adi_adrv904x_DacSampleXbarSel_e; + +/** +* \brief Enum to select desired Serializer Lane Output Driver Swing +*/ +typedef enum adi_adrv904x_SerLaneCfgOutputDriveSwing +{ + ADRV904X_DRIVE_SWING_VTT_100 = 0u, /*!< Output swing level: 1.00 * VTT */ + ADRV904X_DRIVE_SWING_VTT_85 = 1u, /*!< Output swing level: 0.85 * VTT */ + ADRV904X_DRIVE_SWING_VTT_75 = 2u, /*!< Output swing level: 0.75 * VTT */ + ADRV904X_DRIVE_SWING_VTT_50 = 3u /*!< Output swing level: 0.50 * VTT */ +} adi_adrv904x_SerLaneCfgOutputDriveSwing_e; + +/** +* \brief Enum to select desired Serializer Lane Pre-Emphasis +*/ +typedef enum adi_adrv904x_SerLaneCfgPreEmphasis +{ + ADRV904X_PRE_EMPHASIS_LEVEL_0_DB = 0u, /*!< Pre-emphasis level: 0dB */ + ADRV904X_PRE_EMPHASIS_LEVEL_3_DB = 1u, /*!< Pre-emphasis level: 3dB */ + ADRV904X_PRE_EMPHASIS_LEVEL_6_DB = 2u /*!< Pre-emphasis level: 6dB */ +} adi_adrv904x_SerLaneCfgPreEmphasis_e; + +/** +* \brief Enum to select desired Serializer Lane Post-Emphasis +*/ +typedef enum adi_adrv904x_SerLaneCfgPostEmphasis +{ + ADRV904X_POST_EMPHASIS_LEVEL_0_DB = 0u, /*!< Post-emphasis level: 0dB */ + ADRV904X_POST_EMPHASIS_LEVEL_3_DB = 1u, /*!< Post-emphasis level: 3dB */ + ADRV904X_POST_EMPHASIS_LEVEL_6_DB = 2u, /*!< Post-emphasis level: 6dB */ + ADRV904X_POST_EMPHASIS_LEVEL_9_DB = 3u, /*!< Post-emphasis level: 9dB */ + ADRV904X_POST_EMPHASIS_LEVEL_12_DB = 4u /*!< Post-emphasis level: 12dB */ +} adi_adrv904x_SerLaneCfgPostEmphasis_e; + +/** +* \brief Data structure to hold the Serializer Lane settings +*/ +typedef struct adi_adrv904x_SerLaneCfg +{ + adi_adrv904x_SerLaneCfgOutputDriveSwing_e outputDriveSwing; /*!< Serializer Lane output swing level */ + adi_adrv904x_SerLaneCfgPreEmphasis_e preEmphasis; /*!< Serializer Lane pre-emphasis */ + adi_adrv904x_SerLaneCfgPostEmphasis_e postEmphasis; /*!< Serializer Lane post-emphasis */ +} adi_adrv904x_SerLaneCfg_t; + +/** +* \brief Data structure to hold the Serializer Reset Settings +*/ +typedef struct adi_adrv904x_CpuCmd_SerReset +{ + uint8_t presetClockOffsets; /*!< Preset the clock offsets and fifo start based on 204c/204b mode */ + uint32_t serResetParm; /*!< Serializer reset parameter */ +} adi_adrv904x_CpuCmd_SerReset_t; + +/** +* \brief Data structure to hold the Serializer Reset Results +*/ +typedef struct adi_adrv904x_CpuCmd_SerResetResp +{ + uint32_t serResetResults; /*!< Ser Reset results CPU */ +} adi_adrv904x_CpuCmd_SerResetResp_t; + +/** +* \brief Data structure to hold the DAC sample crossbar settings +*/ +typedef struct adi_adrv904x_DacSampleXbarCfg +{ + adi_adrv904x_DacSampleXbarSel_e txDacChan[ADI_ADRV904X_NUM_DAC_SAMPLE_XBAR]; /*!< Sample Crossbar select for Tx I/Q channel data*/ +} adi_adrv904x_DacSampleXbarCfg_t; + +/** +* \brief Data structure to hold the ADC sample crossbar information +*/ +typedef struct adi_adrv904x_AdcSampleXbarCfg +{ + adi_adrv904x_AdcSampleXbarSel_e AdcSampleXbar[ADI_ADRV904X_NUM_FRAMERS_SAMPLE_XBAR]; +} adi_adrv904x_AdcSampleXbarCfg_t; + +#define ADI_ADRV904X_NUM_ORX_ADC_SAMPLE_XBAR 32u +/** + * \brief Enumerated list of ORX ADC Sample Xbar options + */ +typedef enum adi_adrv904x_OrxAdcSampleXbarSel +{ + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_I_0 = 0u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_I_1 = 1u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_I_2 = 2u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_I_3 = 3u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_I_4 = 4u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_I_5 = 5u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_I_6 = 6u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_I_7 = 7u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_Q_0 = 8u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_Q_1 = 9u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_Q_2 = 10u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_Q_3 = 11u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_Q_4 = 12u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_Q_5 = 13u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_Q_6 = 14u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_Q_7 = 15u, + + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_I_0 = 16u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_I_1 = 17u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_I_2 = 18u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_I_3 = 19u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_I_4 = 20u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_I_5 = 21u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_I_6 = 22u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_I_7 = 23u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_Q_0 = 24u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_Q_1 = 25u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_Q_2 = 26u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_Q_3 = 27u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_Q_4 = 28u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_Q_5 = 29u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_Q_6 = 30u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_Q_7 = 31u, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_LAST_VALID = ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_Q_7, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_INVALID = 0x7Fu +} adi_adrv904x_OrxAdcSampleXbarSel_e; + +/** + * \brief Data structure to hold the ADC sample crossbar information + */ +typedef struct adi_adrv904x_OrxAdcSampleXbarCfg +{ + adi_adrv904x_OrxAdcSampleXbarSel_e OrxAdcSampleXbar[ADI_ADRV904X_NUM_ORX_ADC_SAMPLE_XBAR]; +} adi_adrv904x_OrxAdcSampleXbarCfg_t; + +#define ADI_ADRV904X_MAX_FRM_CARRIER_XBAR_IDX 192U /*!< Index for maximum FRM carrier Xbar */ +#define ADI_ADRV904X_MAX_DFRM_CARRIER_XBAR_IDX 192U /*!< Index for maximum DFRM carrier Xbar */ +/** + * \brief structure for framer CDDC Sample crossbar + */ +typedef struct adi_adrv904x_CddcSampleXbarCfg +{ + uint8_t cddcSampleXbar[ADI_ADRV904X_MAX_FRM_CARRIER_XBAR_IDX]; /*!< CDDC Sample XBar */ +} adi_adrv904x_CddcSampleXbarCfg_t; + +/** + * \brief structure for framer CDUC Sample crossbar + */ +typedef struct adi_adrv904x_CducSampleXbarCfg +{ + uint8_t cducSampleXbar[ADI_ADRV904X_MAX_DFRM_CARRIER_XBAR_IDX]; /*!< CDUC Sample XBar */ +} adi_adrv904x_CducSampleXbarCfg_t; + +/** +* \brief Data structure to hold the Framer output lane crossbar information +* +* Note that not all framers have 8 outputs. A physical lane can only be used +* on one framer at a time. +*/ +typedef struct adi_adrv904x_SerLaneXbar +{ + uint8_t laneFramerOutSel[ADI_ADRV904X_MAX_SERIALIZER_LANES]; /*!< Framer output to route to Physical Lane (valid 0-7) */ +} adi_adrv904x_SerLaneXbar_t; + +/** +* \brief Data structure to hold the Deframer input lane crossbar information +* +* Note that not all deframers have 8 inputs. +*/ +typedef struct adi_adrv904x_DeserLaneXbar +{ + uint8_t deframerInputLaneSel[ADI_ADRV904X_MAX_DESERIALIZER_LANES]; /*!< Physical lane select for deframer input (valid 0-7) */ +} adi_adrv904x_DeserLaneXbar_t; + +/** +* \brief Data structure to hold ADRV904X JESD204B/C Framer configuration settings +*/ +typedef struct adi_adrv904x_FramerCfg +{ + uint8_t enableJesd204C; /*!< 1= Enable JESD204C framer, 0 = use JESD204B framer */ + uint8_t bankId; /*!< JESD204B Configuration Bank ID extension to Device ID. Range is 0..15 */ + uint8_t deviceId; /*!< JESD204B Configuration Device ID link identification number. Range is 0..255 */ + uint8_t lane0Id; /*!< JESD204B Configuration starting Lane ID. If more than one lane is used, each lane will increment from the Lane0 ID. Range is 0..31 */ + uint8_t jesd204M; /*!< Number of ADCs (0, 2, or 4) where 2 ADCs are required per receive chain (I and Q). */ + uint16_t jesd204K; /*!< Number of frames in a multiframe. Default = 32, F*K must be modulo 4. Where, F=2*M/numberOfLanes (Max 32 for JESD204B, Max 256 for JESD204C). */ + uint8_t jesd204F; /*!< Number of bytes(octets) per frame (Valid 1, 2, 4, 8). */ + uint8_t jesd204Np; /*!< converter sample resolution (12, 16, 24). */ + uint8_t jesd204E; /*!< JESD204C E parameter. This is E -1 value. */ + uint8_t scramble; /*!< Scrambling off if framerScramble = 0, if framerScramble > 0 scrambling is enabled */ + uint8_t serializerLanesEnabled; /*!< Serializer lane select bit field. Where, [0] = Lane0 enabled, [1] = Lane1 enabled, etc */ + uint16_t lmfcOffset; /*!< LMFC offset value for deterministic latency setting. */ + uint8_t syncbInSelect; /*!< Selects SYNCb input source. Where, 0 = use SYNCBIN0 for this framer, 1 = use SYNCBIN1 for this framer, 2 = use SYNCBIN2 */ + uint8_t overSample; /*!< Selects framer bit repeat or oversampling mode for lane rate matching. Where, 0 = bitRepeat mode (changes effective lanerate), 1 = overSample (maintains same lane rate between ObsRx framer and Rx framer and oversamples the ADC samples) */ + uint8_t syncbInLvdsMode; /*!< 1 - enable LVDS input pad with 100ohm internal termination, 0 - enable CMOS input pad */ + uint8_t syncbInLvdsPnInvert; /*!< 0 - syncb LVDS PN not inverted, 1 - syncb LVDS PN inverted */ + adi_adrv904x_SerLaneXbar_t serializerLanePdCrossbar; /*!< Lane crossbar to map framer lane outputs to physical lanes */ + adi_adrv904x_AdcSampleXbarCfg_t adcCrossbar; /*!< ADC converter to framer input mapping */ + adi_adrv904x_OrxAdcSampleXbarCfg_t orxAdcCrossbar; /*!< For ADRV904X: this contains ORX sample xbar for framer-2 */ + uint8_t newSysrefOnRelink; /*!< Flag for determining if SYSREF on relink should be set. Where, if > 0 = set, '0' = not set */ + uint8_t sysrefForStartup; /*!< 1 = Framer: Require a SYSREF before CGS will be output from serializer, 0: Allow CGS to output before SYSREF occurs (recommended on framer to allow deframer CDR to lock and EQ to train)*/ + uint8_t sysrefNShotEnable; /*!< 1 = Enable SYSREF NShot (ability to ignore first rising edge of SYSREF to ignore possible runt pulses.) */ + uint8_t sysrefNShotCount; /*!< Count value of which SYSREF edge to use to reset LMFC phase, valid range is 0 to 15 */ + uint8_t sysrefIgnoreWhenLinked; /*!< When JESD204 link is up and valid, 1= ignore any sysref pulses */ + uint32_t iqRate_kHz; /*!< Framer I/Q rate */ + uint32_t laneRate_kHz; /*!< Framer Lane rate */ + adi_adrv904x_CddcSampleXbarCfg_t cddcCrossbar; /*!< For ADRV904X: this contains CDDC sample xbar */ +} adi_adrv904x_FramerCfg_t; + +/** +* \brief Data structure to hold the settings for the deframer configuration +*/ +typedef struct adi_adrv904x_DeframerCfg +{ + uint8_t enableJesd204C; /*!< 1= Enable JESD204C framer, 0 = use JESD204B framer */ + uint8_t bankId; /*!< Extension to Device ID. Range is 0..15 , bankId is not supported for Jrx, returns always 0*/ + uint8_t deviceId; /*!< Link identification number. Range is 0..255 */ + uint8_t laneId[ADI_ADRV904X_MAX_DESERIALIZER_LANES]; + uint8_t jesd204M; /*!< Number of DACs (0, 2, or 4) - 2 DACs per transmit chain (I and Q) */ + uint16_t jesd204K; /*!< Number of frames in a multiframe. Default = 32, F*K = modulo 4. Where, F=2*M/numberOfLanes (Max 32 for JESD204B, Max 256 for JESD204C) */ + uint8_t jesd204F; /*!< Number of bytes(octets) per frame . */ + uint8_t jesd204Np; /*!< converter sample resolution (12, 16) */ + uint8_t jesd204E; /*!< JESD204C E parameter. This is E -1 value. */ + uint8_t decrambling; /*!< decrambling off if decramble = 0, if decramble > 0 decrambling is enabled */ + uint8_t deserializerLanesEnabled; /*!< Deserializer lane select bit field. Where, [0] = Lane0 enabled, [1] = Lane1 enabled, etc */ + uint16_t lmfcOffset; /*!< LMFC offset value to adjust deterministic latency. */ + uint8_t syncbOutSelect; /*!< Selects deframer SYNCBOUT pin (0 = SYNCBOUT0, 1 = SYNCBOUT1, 2 = output SYNCB to SYNCBOUT0 and SYNCBOUT1, 3 = No Pin Selected) */ + uint8_t syncbOutLvdsMode; /*!< Ignored if syncbOutSelect = 3. Otherwise 1 - enable LVDS output pad, 0 - enable CMOS output pad */ + uint8_t syncbOutLvdsPnInvert ; /*!< Ignored if syncbOutSelect = 3. Otherwise 0 - syncb LVDS PN not inverted, 1 - syncb LVDS PN inverted */ + uint8_t syncbOut0CmosDriveStrength; /*!< CMOS output drive strength. Max = 15 */ + uint8_t syncbOut1CmosDriveStrength; /*!< CMOS output drive strength. Max = 15 */ + adi_adrv904x_DeserLaneXbar_t deserializerLaneCrossbar; /*!< Lane crossbar to map physical lanes to deframer inputs */ + adi_adrv904x_DacSampleXbarCfg_t dacCrossbar; /*!< Deframer output to DAC mapping */ + uint8_t newSysrefOnRelink; /*!< Flag for determining if SYSREF on relink should be set. Where, if > 0 = set, '0' = not set */ + uint8_t sysrefForStartup; /*!< Suggested to enable for deframer so deframer will not assert SYNCB to init the link until SYSREF has occurred, which resets LMFC phase */ + uint8_t sysrefNShotEnable; /*!< 1 = Enable SYSREF NShot (ability to ignore first rising edge of SYSREF to ignore possible runt pulses.) */ + uint8_t sysrefNShotCount; /*!< Count value of which SYSREF edge to use to reset LMFC phase, valid range is 0 to 15 */ + uint8_t sysrefIgnoreWhenLinked; /*!< When JESD204 link is up and valid, 1= ignore any sysref pulses */ + uint32_t iqRate_kHz; /*!< Framer I/Q rate */ + uint32_t laneRate_kHz; /*!< Framer Lane rate */ + adi_adrv904x_CducSampleXbarCfg_t cducCrossbar; /*!< CDUC Xbar output */ +} adi_adrv904x_DeframerCfg_t; + +/** +* \brief Enum for JESD204B/C PRBS generated types +*/ +typedef enum adi_adrv904x_DeframerPrbsOrder +{ + ADI_ADRV904X_PRBS_DISABLE = 0, /*!< Deframer PRBS pattern disable */ + ADI_ADRV904X_PRBS7, /*!< Deframer PRBS7 pattern select */ + ADI_ADRV904X_PRBS9, /*!< Deframer PRBS9 pattern select */ + ADI_ADRV904X_PRBS15, /*!< Deframer PRBS15 pattern select */ + ADI_ADRV904X_PRBS31, /*!< Deframer PRBS31 pattern select */ + ADI_ADRV904X_USERDATA /*!< Deframer user supplied pattern select */ +} adi_adrv904x_DeframerPrbsOrder_e; + +/** +* \brief Enum for JESD204B deserializer / deframer PRBS selection +*/ +typedef enum adi_adrv904x_DeframerPrbsCheckLoc +{ + ADI_ADRV904X_PRBSCHECK_LANEDATA = 0U, /*!< Check PRBS at deserializer lane output (does not require JESD204b link) */ + ADI_ADRV904X_PRBSCHECK_SAMPLEDATA /*!< Check PRBS at output of deframer (JESD204b deframed sample) */ +} adi_adrv904x_DeframerPrbsCheckLoc_e; + +/** +* \brief Data structure to hold ADRV904X JESD204b Deframer PRBS test configuration +*/ +typedef struct adi_adrv904x_DfrmPrbsCfg +{ + adi_adrv904x_DeframerPrbsOrder_e polyOrder; /*!< Deframer PRBS Order */ + adi_adrv904x_DeframerPrbsCheckLoc_e checkerLocation; /*!< Deframer PRBS Checker Location */ +} adi_adrv904x_DfrmPrbsCfg_t; + +/** +* \brief Enum of possible Framer Test Data sources +*/ +typedef enum adi_adrv904x_FramerDataSource +{ + ADI_ADRV904X_FTD_ADC_DATA = 0, /*!< Framer test data ADC data source */ + ADI_ADRV904X_FTD_CHECKERBOARD, /*!< Framer test data checkerboard data source */ + ADI_ADRV904X_FTD_TOGGLE0_1, /*!< Framer test data toggle 0 to 1 data source */ + ADI_ADRV904X_FTD_PRBS31, /*!< Framer test data PRBS31 data source */ + ADI_ADRV904X_FTD_PRBS23, /*!< Framer test data PRBS23 data source */ + ADI_ADRV904X_FTD_PRBS15, /*!< Framer test data PRBS15 data source */ + ADI_ADRV904X_FTD_PRBS9, /*!< Framer test data PRBS9 data source */ + ADI_ADRV904X_FTD_PRBS7, /*!< Framer test data PRBS7 data source */ + ADI_ADRV904X_FTD_RAMP, /*!< Framer test data ramp data source */ + ADI_ADRV904X_FTD_PATTERN_REPEAT = 14, /*!< Framer test data 16-bit programmed pattern repeat source */ + ADI_ADRV904X_FTD_PATTERN_ONCE = 15 /*!< Framer test data 16-bit programmed pattern executed once source */ +} adi_adrv904x_FramerDataSource_e; + +/** +* \brief Enum of Framer test data injection points +*/ +typedef enum adi_adrv904x_FramerDataInjectPoint +{ + ADI_ADRV904X_FTD_FRAMERINPUT = 0, /*!< Framer test data injection point at framer input */ + ADI_ADRV904X_FTD_SERIALIZER, /*!< Framer test data injection point at serializer input */ + ADI_ADRV904X_FTD_POST_LANEMAP /*!< Framer test data injection point after lane mapping */ +} adi_adrv904x_FramerDataInjectPoint_e; + +/** +* \brief Enum of Framer test data configuration +*/ +typedef struct adi_adrv904x_FrmTestDataCfg +{ + uint8_t framerSelMask; /*!< Framer selected mask */ + adi_adrv904x_FramerDataSource_e testDataSource; /*!< Framer test data source */ + adi_adrv904x_FramerDataInjectPoint_e injectPoint; /*!< Framer test data injection point */ +} adi_adrv904x_FrmTestDataCfg_t; + +/** +* \brief Data structure to hold ADRV904X JESD204B/C Deframer PRBS Error Counter values on readback +*/ +typedef struct adi_adrv904x_DfrmPrbsErrCounters +{ + adi_adrv904x_DeframerPrbsCheckLoc_e sampleSource; /*!< Sample or Lane mode. Mode error count and status use zeroth index for sample mode */ + uint8_t sampleErrors; /*!< 0b: sample error count, 1b: invalid error flag, 2b: error flag */ + uint8_t errorStatus[ADI_ADRV904X_MAX_SERIALIZER_LANES]; /*!< Array contains error status */ + uint32_t laneErrors[ADI_ADRV904X_MAX_SERIALIZER_LANES]; /*!< Lane 0 contains error counters if in sample mode, otherwise errors are maintained per lane */ +} adi_adrv904x_DfrmPrbsErrCounters_t; + +/** +* \brief Enum to select data capture length for Rx/Orx +*/ +typedef enum adi_adrv904x_RxOrxDataCaptureLength +{ + ADI_ADRV904X_CAPTURE_SIZE_12K = 0x3000, + ADI_ADRV904X_CAPTURE_SIZE_16K = 0x4000, + ADI_ADRV904X_CAPTURE_SIZE_32K = 0x8000, + ADI_ADRV904X_CAPTURE_SIZE_8K = 0x2000, + ADI_ADRV904X_CAPTURE_SIZE_4K = 0x1000, + ADI_ADRV904X_CAPTURE_SIZE_2K = 0x800, + ADI_ADRV904X_CAPTURE_SIZE_1K = 0x400, + ADI_ADRV904X_CAPTURE_SIZE_512 = 0x200, + ADI_ADRV904X_CAPTURE_SIZE_256 = 0x100, + ADI_ADRV904X_CAPTURE_SIZE_128 = 0x80, + ADI_ADRV904X_CAPTURE_SIZE_64 = 0x40, + ADI_ADRV904X_CAPTURE_SIZE_32 = 0x20 + +} adi_adrv904x_RxOrxDataCaptureLength_e; + +/** + * \brief Enum define ADRV904X JESD204B Deframer error counter reset option + */ +typedef enum adi_adrv904x_DfrmErrCounterReset +{ + ADI_ADRV904X_DFRM_BD_CLEAR = 0x01, /*!< BD Clear */ + ADI_ADRV904X_DFRM_INT_CLEAR = 0x2, /*!< Int Clear */ + ADI_ADRV904X_DFRM_UEK_CLEAR = 0x4 /*!< UEK Clear */ +} adi_adrv904x_DfrmErrCounterReset_e; + +/** +* \brief Enum to select GPINT enable/disable for deframer error counters +*/ +typedef enum adi_adrv904x_DfrmErrCounterIrqSel +{ + ADI_ADRV904X_DFRM_ERR_COUNT_DISABLE_IRQ = 0, /*!< Do not create GPINT when error counter overflows 255 */ + ADI_ADRV904X_DFRM_ERR_COUNT_ENABLE_IRQ /*!< Create GPINT when error counter overflows 255 */ +} adi_adrv904x_DfrmErrCounterIrqSel_e; + +/** +* \brief Enum to select Serdes Error to be Cleared, Enabled or Disable +*/ +typedef enum adi_adrv904x_SerdesErrAction +{ + ADI_ADRV904X_SERDES_PCLK_ERR_DISABLE = 0x01U, /*!< Disable PCLK related errors */ + ADI_ADRV904X_SERDES_SYSREF_ERR_DISABLE = 0x02U, /*!< Disable SYSREF Phase error */ + ADI_ADRV904X_SERDES_ALL_ERR_DISABLE = 0x03U, /*!< Disable both PCLK and SYSREF errors */ + ADI_ADRV904X_SERDES_PCLK_ERR_ENABLE = 0x04U, /*!< Enable PCLK related errors */ + ADI_ADRV904X_SERDES_SYSREF_ERR_ENABLE = 0x08U, /*!< Enable SYSREF Phase error */ + ADI_ADRV904X_SERDES_ALL_ERR_ENABLE = 0x0CU, /*!< Enable both PCLK and SYSREF errors */ + ADI_ADRV904X_SERDES_PCLK_ERR_CLEAR = 0x05U, /*!< Clear PCLK related errors */ + ADI_ADRV904X_SERDES_SYSREF_ERR_CLEAR = 0x0AU, /*!< Clear SYSREF Phase error */ + ADI_ADRV904X_SERDES_ALL_ERR_CLEAR = 0x0FU, /*!< Clear both PCLK and SYSREF errors */ +} adi_adrv904x_SerdesErrAction_e; + +/** +* \brief Data structure to hold ADRV904X JESD204B/C Framer status +*/ +typedef struct adi_adrv904x_FramerStatus +{ + uint8_t status; /*!< Framer status */ + uint8_t framerSyncNeCount; /*!< 204B: Count of SYNCB falling edges */ + uint8_t qbfStateStatus; /*!< 204B: QBF status */ + uint8_t syncNSel; /*!< 204B: Syncb crossbar select */ +} adi_adrv904x_FramerStatus_t; + +/** +* \brief Data structure to hold ADRV904X JESD204B/C Deframer status information +*/ +typedef struct adi_adrv904x_DeframerStatus +{ + uint8_t status; /*!< Deframer status for both 204B/C */ + uint8_t reserved; /*!< Contain additional status information */ +} adi_adrv904x_DeframerStatus_t; + +/** +* \brief Data structure to hold ADRV904X JESD204B/C Deframer status information which include physical lanes. +*/ +typedef struct adi_adrv904x_DeframerStatus_v2 +{ + uint8_t phyLaneMask; /*!< Physical lane bit mask */ + uint8_t laneStatus[8]; /*!< Deframer status for both 204B/C for physical lanes */ + uint8_t linkState; /*!< b0:204B/c, b1:link up/down */ +} adi_adrv904x_DeframerStatus_v2_t; + +/** +* \brief Data structure to hold ADRV904X JESD204b Deframer Source register bits. +*/ +typedef struct adi_adrv904x_DeframerIrqVector +{ + uint16_t lane[ADI_ADRV904X_MAX_DESERIALIZER_LANES]; /*!< IRQ vector data per physical lane */ + uint16_t deframer0; /*!< Bitwise-OR of vectors for all lanes in use by Deframer0 */ + uint16_t deframer1; /*!< Bitwise-OR of vectors for all lanes in use by Deframer1 */ +} adi_adrv904x_DeframerIrqVector_t; + +/* + * \brief Data structure to hold ADRV904X JESD204B Deframer error counter status + */ +typedef struct adi_adrv904x_DfrmErrCounterStatus +{ + uint8_t laneStatus; /*!< deframer status bits */ + uint8_t bdCntValue; /*!< Bad-Disparity error counter current value */ + uint8_t uekCntValue; /*!< UnExpected-K error counter current value */ + uint8_t nitCntValue; /*!< Not-In-Table error counter current value */ +} adi_adrv904x_DfrmErrCounterStatus_t; + +/* + * \brief Data structure to hold ADRV904X JESD204C Deframer error counter status + */ +typedef struct adi_adrv904x_Dfrm204cErrCounterStatus +{ + uint8_t shCntValue; /*!< Count of block alignment errors */ + uint8_t embCntValue; /*!< Count of extended multiblock alignment errors */ + uint8_t mbCntValue; /*!< Count of multiblock alignment errors */ + uint8_t crcCntValue; /*!< Count of CRC parity errors */ +} adi_adrv904x_Dfrm204cErrCounterStatus_t; + +/** +* \brief Data structure to hold ADRV904X JESD204b DeFramer ILAS configuration settings +*/ +typedef struct adi_adrv904x_DfrmLane0Cfg +{ + uint8_t dfrmDID; /*!< JESD204B Configuration Device ID for ILAS check */ + uint8_t dfrmBID; /*!< JESD204B Configuration Bank ID for ILAS check */ + uint8_t dfrmLID0; /*!< JESD204B Configuration starting Lane ID for ILAS check */ + uint8_t dfrmL; /*!< JESD204B Configuration L = lanes per data converter for ILAS check */ + uint8_t dfrmSCR; /*!< JESD204B Configuration scramble setting for ILAS check */ + uint8_t dfrmF; /*!< JESD204B Configuration F = octets per frame for ILAS check */ + uint8_t dfrmK; /*!< JESD204B Configuration K = frames per multiframe for ILAS check */ + uint8_t dfrmM; /*!< JESD204B Configuration M = number of data converters for ILAS check */ + uint8_t dfrmN; /*!< JESD204B Configuration N = data converter sample resolution for ILAS check */ + uint8_t dfrmCS; /*!< JESD204B Configuration CS = number of control bits transferred per sample per frame for ILAS check */ + uint8_t dfrmNP; /*!< JESD204B Configuration NP = JESD204B word size based on the highest resolution of the data converter for ILAS check */ + uint8_t dfrmS; /*!< JESD204B Configuration S = number of samples/data converter/frame for ILAS check */ + uint8_t dfrmCF; /*!< JESD204B Configuration CF = '0' = control bits appended to each sample, '1' = appended to end of frame for ILAS check */ + uint8_t dfrmHD; /*!< JESD204B Configuration HD = high density bit - samples are contained within lane (0) or divided over more than one lane (1) for ILAS check */ + uint8_t dfrmFCHK0; /*!< JESD204B Configuration checksum for ILAS check lane0 */ +} adi_adrv904x_DfrmLane0Cfg_t; + +/** +* \brief Data structure to hold ADRV904X JESD204b DeFramer ILAS configuration settings for each deframer +*/ +typedef struct adi_adrv904x_DfrmCompareData +{ + uint32_t zeroCheckFlag; /*!< Link Valid Data Flag - if returned all zero then link is not active */ + uint32_t ilasMismatchDfrm; /*!< ILAS mismatch Flag - all set bits indicated mismatch and bit position indicates incorrect value */ + adi_adrv904x_DfrmLane0Cfg_t dfrmIlasData; /*!< Captured ILAS data */ + adi_adrv904x_DfrmLane0Cfg_t dfrmCfgData; /*!< Configured ILAS data */ +} adi_adrv904x_DfrmCompareData_t; + +/** +* \brief Data structure to hold ADRV904X JESD204b DeFramer ILAS configuration settings +*/ +typedef struct adi_adrv904x_DfrmLaneCfg_v2 +{ + uint8_t jesdV; /*!< JESD204B Configuration JESD version */ + uint8_t subclassV ; /*!< JESD204B Configuration Subclass version */ + uint8_t dfrmDID; /*!< JESD204B Configuration Device ID for ILAS check */ + uint8_t dfrmBID; /*!< JESD204B Configuration Bank ID for ILAS check */ + uint8_t dfrmLID; /*!< JESD204B Configuration Lane ID for ILAS check */ + uint8_t dfrmL; /*!< JESD204B Configuration L = lanes per data converter for ILAS check */ + uint8_t dfrmSCR; /*!< JESD204B Configuration scramble setting for ILAS check */ + uint8_t dfrmF; /*!< JESD204B Configuration F = octets per frame for ILAS check */ + uint8_t dfrmK; /*!< JESD204B Configuration K = frames per multiframe for ILAS check */ + uint8_t dfrmM; /*!< JESD204B Configuration M = number of data converters for ILAS check */ + uint8_t dfrmN; /*!< JESD204B Configuration N = data converter sample resolution for ILAS check */ + uint8_t dfrmCS; /*!< JESD204B Configuration CS = number of control bits transferred per sample per frame for ILAS check */ + uint8_t dfrmNP; /*!< JESD204B Configuration NP = JESD204B word size based on the highest resolution of the data converter for ILAS check */ + uint8_t dfrmS; /*!< JESD204B Configuration S = number of samples/data converter/frame for ILAS check */ + uint8_t dfrmCF; /*!< JESD204B Configuration CF = '0' = control bits appended to each sample, '1' = appended to end of frame for ILAS check */ + uint8_t dfrmHD; /*!< JESD204B Configuration HD = high density bit - samples are contained within lane (0) or divided over more than one lane (1) for ILAS check */ + uint8_t dfrmFCHK; /*!< JESD204B Configuration checksum for ILAS check */ +} adi_adrv904x_DfrmLaneCfg_v2_t; + +/** +* \brief Enum of ILAS deframer lane mismatch bits +*/ +typedef enum adi_adrv904x_IlasMismatch +{ + ADI_ADRV904X_ILAS_DID = 0x00000001, + ADI_ADRV904X_ILAS_BID = 0x00000002, + ADI_ADRV904X_ILAS_LID = 0x00000004, + ADI_ADRV904X_ILAS_L = 0x00000008, + ADI_ADRV904X_ILAS_SCR = 0x00000010, + ADI_ADRV904X_ILAS_F = 0x00000020, + ADI_ADRV904X_ILAS_K = 0x00000040, + ADI_ADRV904X_ILAS_M = 0x00000080, + ADI_ADRV904X_ILAS_N = 0x00000100, + ADI_ADRV904X_ILAS_CS = 0x00000200, + ADI_ADRV904X_ILAS_NP = 0x00000400, + ADI_ADRV904X_ILAS_S = 0x00000800, + ADI_ADRV904X_ILAS_CF = 0x00001000, + ADI_ADRV904X_ILAS_HD = 0x00002000, + ADI_ADRV904X_ILAS_CKSM = 0x00004000, + ADI_ADRV904X_ILAS_JESDV = 0x00008000, + ADI_ADRV904X_ILAS_SUBCLASSV = 0x00010000 +} adi_adrv904x_IlasMismatch_e; + +/** +* \brief Data structure to hold ADRV904X JESD204b DeFramer ILAS configuration settings for each deframer with all lanes +*/ +typedef struct adi_adrv904x_DfrmCompareData_v2 +{ + uint8_t phyLaneEnMask; /*!< Physical enabled lane bit mask for the selected deframer */ + uint8_t laneMismatchMask; /*!< lane mismatch bit mask for the selected deframer */ + uint32_t zeroCheckFlag[ADI_ADRV904X_MAX_DESERIALIZER_LANES]; /*!< Link Valid Data Flag - see adi_adrv904x_IlasMismatch_e for bit mask. */ + uint32_t ilasMismatchDfrm[ADI_ADRV904X_MAX_DESERIALIZER_LANES]; /*!< ILAS mismatch Flag - all set bits indicated mismatch and bit position indicates incorrect value */ + uint8_t cfgDataChksum[ADI_ADRV904X_MAX_DESERIALIZER_LANES]; /*!< Configuration data checksum used to compare with each lane checksum */ + adi_adrv904x_DfrmLaneCfg_v2_t dfrmIlasData[ADI_ADRV904X_MAX_DESERIALIZER_LANES]; /*!< Captured ILAS data for all lanes */ + adi_adrv904x_DfrmLaneCfg_v2_t dfrmCfgData; /*!< Configured ILAS data for selected deframer */ +} adi_adrv904x_DfrmCompareData_v2_t; + +/* +* \brief enum to set ADC sample crossbar loopback +*/ +typedef enum adi_adrv904x_AdcSampleLoopbackXbar +{ + ADI_ADRV904X_JESD_FRM_LB_XBAR_TX0_DATA_I = 0U, + ADI_ADRV904X_JESD_FRM_LB_XBAR_TX0_DATA_Q = 1U, + ADI_ADRV904X_JESD_FRM_LB_XBAR_TX1_DATA_I = 4U, + ADI_ADRV904X_JESD_FRM_LB_XBAR_TX1_DATA_Q = 5U, + ADI_ADRV904X_JESD_FRM_LB_XBAR_TX2_DATA_I = 8U, + ADI_ADRV904X_JESD_FRM_LB_XBAR_TX2_DATA_Q = 9U, + ADI_ADRV904X_JESD_FRM_LB_XBAR_TX3_DATA_I = 12U, + ADI_ADRV904X_JESD_FRM_LB_XBAR_TX3_DATA_Q = 13U, + ADI_ADRV904X_JESD_FRM_LB_XBAR_TX4_DATA_I = 16U, + ADI_ADRV904X_JESD_FRM_LB_XBAR_TX4_DATA_Q = 17U, + ADI_ADRV904X_JESD_FRM_LB_XBAR_TX5_DATA_I = 20U, + ADI_ADRV904X_JESD_FRM_LB_XBAR_TX5_DATA_Q = 21U, + ADI_ADRV904X_JESD_FRM_LB_XBAR_TX6_DATA_I = 24U, + ADI_ADRV904X_JESD_FRM_LB_XBAR_TX6_DATA_Q = 25U, + ADI_ADRV904X_JESD_FRM_LB_XBAR_TX7_DATA_I = 28U, + ADI_ADRV904X_JESD_FRM_LB_XBAR_TX7_DATA_Q = 29U, +} adi_adrv904x_AdcSampleLoopbackXbar_e; + +/** +* \brief Data structure to hold ADRV904X Deserializer lanes Common Mode Configuration +*/ +typedef struct adi_adrv904x_DeserLanesVcmCfg +{ + uint8_t vcmDriverMask; /*!< Lane Mask to configure the AMUX bus to be driven by the VCM node in the selected lane */ + uint8_t vcmReceiverMask; /*!< Lane Mask to specify which lanes use the AMUx bus to set the JRx input common mode */ +} adi_adrv904x_DeserLanesVcmCfg_t; + +#define ADI_ADRV904X_MAX_SAMPLE_XBAR_INDEX_VALUE 32U /*!< Maximum samples Xbar index value */ +#define ADI_ADRV904X_XBAR_ENTRY_DISABLED 0x80U /*!< Disabled Xbar entry */ +#define ADI_ADRV904X_XBAR_CONTROL_INDEX_DISABLED 1U /*!< 1 is low */ +#define ADI_ADRV904X_XBAR_CONTROL_INDEX_ENABLED 0U /*!< 0 is active high */ +#define ADI_ADRV904X_MAX_CHANNEL_XBAR_VALUE 7U /*!< Xbar value for max channel */ + +/** + * \brief enum for framer CDDC Mode + */ +typedef enum adi_adrv904x_CddcMode +{ + ADI_ADRV904X_CDDC_MODE = 0U, /*!< CDDC mode */ + ADI_ADRV904X_CDDC_BYPASS_MODE = 1U /*!< CDDC bypass mode */ +} adi_adrv904x_CddcMode_e; + +/** + * \brief enum for deframer CDUC Mode + */ +typedef enum adi_adrv904x_CducMode +{ + ADI_ADRV904X_CDUC_MODE = 0U, /*!< CDUC mode */ + ADI_ADRV904X_CDUC_BYPASS_MODE = 1U /*!< CDUC bypass mode */ +} adi_adrv904x_CducMode_e; + +/** + * \brief structure for framer CDDC RX Channel crossbar + */ +typedef struct adi_adrv904x_CddcChannelXbarCfg +{ + uint8_t cddcChannelXbar[ADI_ADRV904X_MAX_FRM_CARRIER_XBAR_IDX]; /*!< CDDC RX Channel XBar */ +} adi_adrv904x_CddcChannelXbarCfg_t; + +/** + * \brief structure for deframer CDUC TX Channel crossbar + */ +typedef struct adi_adrv904x_CducChannelXbarCfg +{ + uint8_t cducChannelXbar[ADI_ADRV904X_MAX_DFRM_CARRIER_XBAR_IDX]; /*!< CDUC TX Channel XBar */ +} adi_adrv904x_CducChannelXbarCfg_t; +#endif /* _ADI_ADRV904X_DATAINTERFACE_TYPES_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dev_temp_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dev_temp_types.h new file mode 100644 index 00000000000..263fc9832d0 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dev_temp_types.h @@ -0,0 +1,87 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adi_adrv904x_dev_temp_types.h + * + * \brief Contains ADRV904X device temperature data structures. + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_DEV_TEMP_TYPES_H__ +#define __ADRV904X_DEV_TEMP_TYPES_H__ + +#include +#include "adi_adrv904x_platform_pack.h" + +/** + * \brief Enum of device temperature sensor IDs + */ +typedef enum adi_adrv904x_DevTempSensor +{ + ADI_ADRV904X_DEVTEMP_TX0 = 0u, /*!< Tx channel 0 temperature sensor */ + ADI_ADRV904X_DEVTEMP_TX1, /*!< Tx channel 1 temperature sensor */ + ADI_ADRV904X_DEVTEMP_TX2, /*!< Tx channel 2 temperature sensor */ + ADI_ADRV904X_DEVTEMP_TX3, /*!< Tx channel 3 temperature sensor */ + ADI_ADRV904X_DEVTEMP_TX4, /*!< Tx channel 4 temperature sensor */ + ADI_ADRV904X_DEVTEMP_TX5, /*!< Tx channel 5 temperature sensor */ + ADI_ADRV904X_DEVTEMP_TX6, /*!< Tx channel 6 temperature sensor */ + ADI_ADRV904X_DEVTEMP_TX7, /*!< Tx channel 7 temperature sensor */ + ADI_ADRV904X_DEVTEMP_CLKPLL, /*!< Clk PLL temperature sensor */ + ADI_ADRV904X_DEVTEMP_RF0PLL, /*!< RF0 PLL temperature sensor */ + ADI_ADRV904X_DEVTEMP_RF1PLL, /*!< RF1 PLL temperature sensor */ + ADI_ADRV904X_DEVTEMP_SERDESPLL, /*!< SERDES PLL temperature sensor */ + ADI_ADRV904X_DEVTEMP_MAX_SENSORS /*!< Max number of temperature sensors */ +} adi_adrv904x_DevTempSensor_e; + +/** + * \brief Enum of device temperature sensor ID masks + */ +typedef enum adi_adrv904x_DevTempSensorMask +{ + ADI_ADRV904X_DEVTEMP_MASK_TX0 = (1u << ADI_ADRV904X_DEVTEMP_TX0), + ADI_ADRV904X_DEVTEMP_MASK_TX1 = (1u << ADI_ADRV904X_DEVTEMP_TX1), + ADI_ADRV904X_DEVTEMP_MASK_TX2 = (1u << ADI_ADRV904X_DEVTEMP_TX2), + ADI_ADRV904X_DEVTEMP_MASK_TX3 = (1u << ADI_ADRV904X_DEVTEMP_TX3), + ADI_ADRV904X_DEVTEMP_MASK_TX4 = (1u << ADI_ADRV904X_DEVTEMP_TX4), + ADI_ADRV904X_DEVTEMP_MASK_TX5 = (1u << ADI_ADRV904X_DEVTEMP_TX5), + ADI_ADRV904X_DEVTEMP_MASK_TX6 = (1u << ADI_ADRV904X_DEVTEMP_TX6), + ADI_ADRV904X_DEVTEMP_MASK_TX7 = (1u << ADI_ADRV904X_DEVTEMP_TX7), + ADI_ADRV904X_DEVTEMP_MASK_CLKPLL = (1u << ADI_ADRV904X_DEVTEMP_CLKPLL), + ADI_ADRV904X_DEVTEMP_MASK_RF0PLL = (1u << ADI_ADRV904X_DEVTEMP_RF0PLL), + ADI_ADRV904X_DEVTEMP_MASK_RF1PLL = (1u << ADI_ADRV904X_DEVTEMP_RF1PLL), + ADI_ADRV904X_DEVTEMP_MASK_SERDESPLL = (1u << ADI_ADRV904X_DEVTEMP_SERDESPLL), +} adi_adrv904x_DevTempSensorMask_e; + +#define ADI_ADRV904X_DEVTEMP_INVALID ~(ADI_ADRV904X_DEVTEMP_MASK_TX0 | \ + ADI_ADRV904X_DEVTEMP_MASK_TX1 | \ + ADI_ADRV904X_DEVTEMP_MASK_TX2 | \ + ADI_ADRV904X_DEVTEMP_MASK_TX3 | \ + ADI_ADRV904X_DEVTEMP_MASK_TX4 | \ + ADI_ADRV904X_DEVTEMP_MASK_TX5 | \ + ADI_ADRV904X_DEVTEMP_MASK_TX6 | \ + ADI_ADRV904X_DEVTEMP_MASK_TX7 | \ + ADI_ADRV904X_DEVTEMP_MASK_CLKPLL | \ + ADI_ADRV904X_DEVTEMP_MASK_RF0PLL | \ + ADI_ADRV904X_DEVTEMP_MASK_RF1PLL | \ + ADI_ADRV904X_DEVTEMP_MASK_SERDESPLL) + +/** +* \brief Data structure to hold device temperature data +*/ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_DevTempData +{ + int16_t tempDegreesCelsius[ADI_ADRV904X_DEVTEMP_MAX_SENSORS]; /*!< Temperature readings from all temperature sensors */ + int16_t tempDegreesCelsiusAvg; /*!< Average temperature reading of temperature sensors specified in avgMask */ + uint16_t avgMask; /*!< Bitmask of adi_adrv904x_DevTempSensorMask_e values indicating which temperature sensors are averaged in tempDegreesCelciusAvg */ +} adi_adrv904x_DevTempData_t;) + +#endif /* __ADRV904X_DEV_TEMP_TYPES_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_app_capture_sequencer_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_app_capture_sequencer_t.h new file mode 100644 index 00000000000..933cd883629 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_app_capture_sequencer_t.h @@ -0,0 +1,36 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adi_adrv904x_dfe_app_capture_sequencer_t.h + * + * \brief Contains ADRV904X Capture sequencer types + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef ADRV904X_DFE_APP_CAPTURE_SEQUENCER_T_H__ +#define ADRV904X_DFE_APP_CAPTURE_SEQUENCER_T_H__ + +#include "adi_adrv904x_platform_pack.h" + + +ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppCaptureSequencerCfg +{ + uint8_t skipCapturePeriodIfNoRequest; /*!< 1: Skip scheduling capture period if there is no pending request from application thread + * 0: Schedule capture period even if there is no pending request from application thread */ + uint8_t singleCapturePeriod; /*!< 1: Allow only one single capture period to be active at a time (either Orx0 or Orx1) + * 0: Allow Orx0 and Orx1 simultaneous capture periods */ + uint8_t dummyCapPerNumOfMultiframes; /*!< When running dummy capture periods to let radio cals to get mapping, use this number of multiframes in RS default (non-override)mode. Min value:1 */ + uint8_t dummyCapPerLengthMs; /*!< When running dummy capture periods to let radio cals to get mapping, use this length[ms] in RCI and RS mapping override modes. Min value:2 */ + uint16_t dummyCapPerMinimumPeriodMs; /*!< This is the minimum scheduling period for dummy capture periods (per channel). Min value:100, Max value:5000 */ +} adi_adrv904x_DfeAppCaptureSequencerCfg_t; +ADI_ADRV904X_PACK_FINISH + +#endif /* ADRV904X_DFE_APP_CAPTURE_SEQUENCER_T_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_app_err_codes_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_app_err_codes_t.h new file mode 100644 index 00000000000..42635d2b5e3 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_app_err_codes_t.h @@ -0,0 +1,1651 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adi_adrv904x_dfe_app_err_codes_t.h + * + * \brief Contains DFE App error code definitions + * + * \details Contains DFE App error code definitions + * + * ADRV904X API Version: 2.10.0.4 + */ +#ifndef __ADI_ADRV904X_DFE_APP_ERROR_CODES_T_H__ +#define __ADI_ADRV904X_DFE_APP_ERROR_CODES_T_H__ + +#include "adi_adrv904x_dfe_svc_err_object_ids_t.h" + + + +#define ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_APP_ERROR << 8u) /*!< 0xE000 - Starting DFE Application error code */ +/** + * \brief DFE firmware error codes + */ + +typedef enum adi_adrv904x_DfeAppErrCode +{ + ADI_ADRV904X_DFE_APP_ERR_CODE_NO_ERROR = 0UL, /*!< @errcode: 0x0000 + * @desc: No error + * @maincause: Operation was successful + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_NONE + * @mainrecovtext: No action required + * @severity:INFO + */ +/* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_APP_ERROR Section Base Error Code = 0xE000 ------ @errcode: 0xE000 + * @desc: APP Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_CHOL_SOLVER_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 1u), /*!< @errcode: 0xE001 + * @desc: APP Error: DPD Decomposition Calculation + * @maincause: Invalid Parameters Provided from XCORR + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check XCORR Data is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_MODEL_DESCRIPTOR_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 2u), /*!< @errcode: 0xE002 + * @desc: APP Error: DPD Model Descriptor + * @maincause: Invalid Parameters Provided in Model Descriptor (i.e. cannot find LUT ID's or Number of LUT's) + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Model Descriptor Parameters are Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_MODEL_DDR_DELAY_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 3u), /*!< @errcode: 0xE003 + * @desc: APP Error: DPD DDR I and/or J + * @maincause: Invalid DDR I and/or J Parameter Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check DDR I and/or J Parameters are Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_MODEL_POLY_TYPE_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 4u), /*!< @errcode: 0xE004 + * @desc: APP Error: DPD DDR Mode Polynomial + * @maincause: Invalid Polynomial Parameter Provided for DDR Mode + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Polynomial Parameters are Valid for DDR Mode + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_MODEL_DUPLICATE_LUT_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 5u), /*!< @errcode: 0xE005 + * @desc: APP Error: Duplicate DPD LUT + * @maincause: Same LUT is assigned multiple times + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check LUT Usage + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_FEATURE_COMPUTE_HOG = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 6u), /*!< @errcode: 0xE006 + * @desc: APP Error: DPD Queue Limit + * @maincause: Number of Compute Requests are exceeding the queue of pending request + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check how Requests for the Feature are Managed + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_MAX_FRAC_EST_CNT_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 7u), /*!< @errcode: 0xE007 + * @desc: APP Error: DPD Fractional Delay Estimation Count + * @maincause: Fractional Delay can't be Estimated with Bad Captures + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check that Captures will Provide Sufficient Data + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_ACT_LUT_ENTRY_SAT_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 8u), /*!< @errcode: 0xE008 + * @desc: APP Error: DPD LUT Saturation + * @maincause: Underlying Datatype of LUT parameter is int16 + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Value is in the range of int16 + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_THREAD_GET_INVALID_CHANNELS = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 9u), /*!< @errcode: 0xE009 + * @desc: APP Error: DPD Channel Mask + * @maincause: Invalid Channel Mask Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Channel Mask is Valid, (i.e. One Channel at a Time) + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_STATUS_GET_FUNC_NOT_SUPPORTED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 10u), /*!< @errcode: 0xE00A + * @desc: APP Error: Unsupported DPD Status Get + * @maincause: Status Get function not Supported for Provided Tracking Calibration Status Type + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Tracking Calibration Status Type has a Supported Status Get Feature + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_STATUS_GET_INSUFFICIENT_MEMORY = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 11u), /*!< @errcode: 0xE00B + * @desc: APP Error: DPD Status Buffer Size + * @maincause: Invalid Status Buffer Size for the Calibration Status Type Requested + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Status Size for the Calibration Status Type Requested + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_INVALID_CONFIG_SIZE = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 12u), /*!< @errcode: 0xE00C + * @desc: APP Error: Configuration Structure Size + * @maincause: Invalid Configuration Size Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Configuration Read Size is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_INVALID_CONFIG_OFFSET = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 13u), /*!< @errcode: 0xE00D + * @desc: APP Error: Configuration Structure Offset + * @maincause: Invalid Configuration Offset Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Configuration Offset is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_CTRL_GET_INSUFFICIENT_MEMORY = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 14u), /*!< @errcode: 0xE00E + * @desc: APP Error: DPD Control Command Buffer Size + * @maincause: Invalid Control Data Size Provided for Control Command Requested + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Control Data Size is Valid for Control Command + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_FUNC_NOT_SUPPORTED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 15u), /*!< @errcode: 0xE00F + * @desc: APP Error: DPD Control Command + * @maincause: Invalid Control Command Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Control Command is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_CTRL_INVALID_PARAM = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 16u), /*!< @errcode: 0xE010 + * @desc: APP Error: DPD Control Command Parameter + * @maincause: Invalid Parameter Provided in Model Descriptor + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Parameters Provided in Model Descriptor + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAL_FRAMEWORK_TASK_DOES_NOT_EXIST = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 17u), /*!< @errcode: 0xE011 + * @desc: APP Error: Calibration Framework Command Not Executed + * @maincause: Command sent to a Channel that is not Enabled + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Command is Valid for Specified Channel + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAL_FRAMEWORK_STATUS_FUNC_NOT_SUPPORTED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 18u), /*!< @errcode: 0xE012 + * @desc: APP Error: Calibration Framework Status Get + * @maincause: Status Get Command sent to Calibration which does not support it + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Calibration has Status Get + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAL_FRAMEWORK_INVALID_CONFIG_STATE = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 19u), /*!< @errcode: 0xE013 + * @desc: APP Error: Calibration Type + * @maincause: Invalid Calibration Type Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Calibration Type is Valid + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAL_FRAMEWORK_SET_CONFIG_FUNC_NOT_SUPPORTED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 20u), /*!< @errcode: 0xE014 + * @desc: APP Error: Calibration Framework Configuration Set + * @maincause: Configuration Set Command is sent to Calibration which does not support it + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Configuration Set Command for Calibration is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAL_FRAMEWORK_GET_CONFIG_FUNC_NOT_SUPPORTED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 21u), /*!< @errcode: 0xE015 + * @desc: APP Error: Calibration Framework Configuration Get + * @maincause: Configuration Get Command is sent to Calibration which does not support it + * @mainrecovenum:ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Configuration Get Command for Calibration is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAL_FRAMEWORK_HAL_INVALID_CHANNEL = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 22u), /*!< @errcode: 0xE016 + * @desc: APP Error: Calibration Framework HAL Channel + * @maincause: Invalid HAL Channel Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Verify Channel Configuration & Reprogram Device with Updated Profile Image + * @severity: CRITICAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAL_FRAMEWORK_INVALID_CONFIG_OFFSET = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 23u), /*!< @errcode: 0xE017 + * @desc: APP Error: Calibration Framework Configuration Offset + * @maincause: Invalid Calibration Framework Configuration Offset + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Calibration Framework Configuration Offset is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAL_FRAMEWORK_TASK_CREATE_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 24u), /*!< @errcode: 0xE018 + * @desc: APP Error: Calibration Framework Task Thread Pointer + * @maincause: Invalid Thread Pointer Provided for Task by OSAL + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAL_FRAMEWORK_EVENT_CREATE_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 25u), /*!< @errcode: 0xE019 + * @desc: APP Error: Calibration Framework Task Event Pointer + * @maincause: Invalid Event Pointer Provided for Task by OSAL + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAL_FRAMEWORK_TIMER_CREATE_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 26u), /*!< @errcode: 0xE01A + * @desc: APP Error: Calibration Framework Task Timer Pointer + * @maincause: Invalid Timer Pointer Provided for Task by OSAL + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAL_FRAMEWORK_TRACKING_CAL_SUSPEND_TIMEOUT = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 27u), /*!< @errcode: 0xE01B + * @desc: APP Error: Calibration Framework Suspend Timeout + * @maincause: Tracking Calibration failed to Suspend within the expected time + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset Tracking Calibration and try again. Contact ADI if the Problem Persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_EVENT_TIMEOUT_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 28u), /*!< @errcode: 0xE01C + * @desc: APP Error: Calibration Framework Event Timeout + * @maincause: Tracking Calibration failed to Suspend + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Timeout is Valid for Tracking Calibration + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_PWR_METER_DPD_RATE_OVERFLOW = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 29u), /*!< @errcode: 0xE01D + * @desc: APP Error: DPD Power Meter Rate Overflow + * @maincause: Invalid DPD Power Meter Rate + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Rate is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_PWR_METER_CONFIG_FAIL = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 30u), /*!< @errcode: 0xE01E + * @desc: APP Error: DPD Power Meter Configuration + * @maincause: Invalid DPD Power Meter Configuration Parameter(s) + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check DPD Power Meter Configuration Parameter(s) are Valid + * @severity: + */ + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_LUT_COPY_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 31u), /*!< @errcode: 0xE01F + * @desc: APP Error: LUT Copy + * @maincause: Invalid LUT Update Parameter(s) + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check LUT Update Parameter(s) are Valid + * @severity: CRITICAL, FATAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAPTURE_SEQ_MUTEX_REQ_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 32u), /*!< @errcode: 0xE020 + * @desc: APP Error: Capture Sequencer Mutex + * @maincause: Mutex Acquire/Release Failed for Capture Sequencer + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAPTURE_SEQ_PERIOD_REQ_INVALID = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 33u), /*!< @errcode: 0xE021 + * @desc: APP Error: Capture Sequencer Period + * @maincause: Invalid Channel or Capture Period Type Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Channel and Capture Period Type are Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAPTURE_SEQ_CAPTURE_DONE_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 34u), /*!< @errcode: 0xE022 + * @desc: APP Error: Capture Sequence Done Event + * @maincause: Invalid Manual Capture Done Event + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_INCOMPLETE_CAPTURE = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 35u), /*!< @errcode: 0xE023 + * @desc: APP Error: Capture Sequence Incomplete + * @maincause: Incomplete Capture Detected + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Capture Parameters are Valid + * @severity: CRITICAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_MODEL_CONFIG_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 36u), /*!< @errcode: 0xE024 + * @desc: APP Error: DPD Model Configuration + * @maincause: Invalid Model Configuration Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Model Configuration Parameters are Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_EVENT_RX_HANDLE_INIT_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 37u), /*!< @errcode: 0xE025 + * @desc: APP Error: Event Receive Handle Initialization + * @maincause: OSAL Failed to Initialize Event Receive Handle + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_EVENT_THREAD_CREATION_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 38u), /*!< @errcode: 0xE026 + * @desc: APP Error: Event Thread Create + * @maincause: OSAL Failed to Create Event Thread + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_CAPTURE_REQUEST_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 39u), /*!< @errcode: 0xE027 + * @desc: APP Error: DPD Capture Request + * @maincause: Invalid DPD Capture Request + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check DPD Capture Request Parameters are Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_EVENT_HANDLE_GET_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 40u), /*!< @errcode: 0xE028 + * @desc: APP Error: Event Handle Get + * @maincause: OSAL failed to Get Event Handle + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: CRITICAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_UNITY_MODEL_APPLIED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 41u), /*!< @errcode: 0xE029 + * @desc: APP Error: Unity Model + * @maincause: Small Tx Signal Detected + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Tx Signal Configuration and/or Apply Unity Model + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_ADAPTATION_CONFIG_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 42u), /*!< @errcode: 0xE02A + * @desc: APP Error: DPD Adaptation Configuration + * @maincause: Invalid DPD Adaptation Configuration Parameters + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check DPD Adaptation Configuration Parameters are Valid + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_ACTUATOR_PASSTHROU_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 43u), /*!< @errcode: 0xE02B + * @desc: APP Error: DPD Actuator Passthrough Mode + * @maincause: Enabling/Disabling DPD actuator Passthrough mode Failed + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Passthrough Parameters are Valid + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_MODEL_LINEAR_TERM_CONFIG_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 44u), /*!< @errcode: 0xE02C + * @desc: APP Error: Linear Term Configuration + * @maincause: Linear Term Setting plus DDR j Delay exceeds J Delay Buffer Size + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Liner Term Setting and/or J Delay Buffer Size are Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_ABORTED_CAPTURE = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 45u), /*!< @errcode: 0xE02D + * @desc: APP Error: Aborted Capture + * @maincause: Capture was Aborted + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Trigger new DPD Capture + * @severity: CRITICAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_PATHDELAY_LAG_RANGE_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 46u), /*!< @errcode: 0xE02E + * @desc: APP Error: DPD pathdelay lag range + * @maincause: Integer delay was drifted by more than 1 sample + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Enlarge xcorr lag range + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_ACTUATOR_ENABLE_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 47u), /*!< @errcode: 0xE02F + * @desc: APP Error: DPD Actuator Enable Mode + * @maincause: Enabling/Disabling DPD Actuator Failed + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Enable Parameters are Valid + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_POWER_METER_MUTEX_REQ_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 48u), /*!< @errcode: 0xE030 + * @desc: APP Error: Power meter Sequencer Mutex req failed + * @maincause: Mutex Acquire/Release Failed for DPD power meter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_POWER_METER_INVALID_PARAM = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 49u), /*!< @errcode: 0xE031 + * @desc: APP Error: Power meter function is called with invalid parameter + * @maincause: Power meter function is called with invalid parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_VBANK_NOT_POPULATED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 50u), /*!< @errcode: 0xE032 + * @desc: APP Error: DPD Model Vbank not populated + * @maincause: Selected Vbank to write LUTs isn't populated yet + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset the feature, contact ADI if the Problem Persists + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_STABILITY_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 51u), /*!< @errcode: 0xE033 + * @desc: APP Error: DPD stability check error + * @maincause: Selected performance metric(s) exceed the programmed threshold(s) + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Robustness framework takes recovery action(s) + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_MODEL_NOT_SUPPORTED_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 52u), /*!< @errcode: 0xE034 + * @desc: APP Error: DPD supported model error + * @maincause: Configured model can not be supported with selected actuator depth + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Application Command Message is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_CAPTURE_ABORT_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 53u), /*!< @errcode: 0xE035 + * @desc: APP Error: Capture abort failure + * @maincause: Capture abort failure + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_ORX_TOO_LOW_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 54u), /*!< @errcode: 0xE036 + * @desc: APP Error: ORx power is below the low power threshold + * @maincause: ORx signal power is too low and below the threshold + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: adjust ORx gain to increase singal power + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_TX_TOO_LOW_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 55u), /*!< @errcode: 0xE037 + * @desc: APP Error: Tx power is below the low power threshold + * @maincause: Tx signal power is too low and below the threshold + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: adjust tx digital backoff to increase singal power or check LUT entries + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_POST_DPD_TX_TOO_LOW_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 56u), /*!< @errcode: 0xE038 + * @desc: APP Error: Post-DPD Tx power is below the low power threshold + * @maincause: Post-DPD Tx signal power is too low and below the threshold + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: adjust tx digital backoff to increase singal power or check LUT entries + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_ORX_TOO_HIGH_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 57u), /*!< @errcode: 0xE039 + * @desc: APP Error: ORx power is above the high power threshold + * @maincause: ORx signal power is too high + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: adjust ORx gain to attenuate singal power + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_TX_TOO_HIGH_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 58u), /*!< @errcode: 0xE03A + * @desc: APP Error: Tx power is above the high power threshold + * @maincause: Tx signal power is too high + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: adjust tx digital backoff to decrease singal power + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_POST_DPD_TX_TOO_HIGH_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 59u), /*!< @errcode: 0xE03B + * @desc: APP Error: Post-DPD Tx power is above the high power threshold + * @maincause: Post-DPD Tx signal power is too high + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: adjust tx digital backoff to decrease singal power + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_ORX_PEAK_TOO_LOW_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 60u), /*!< @errcode: 0xE03C + * @desc: APP Error: ORx peak power is below the peak power threshold + * @maincause: ORx signal peak power is too low + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: adjust ORx atten to increase singal power + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_TX_PEAK_TOO_LOW_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 61u), /*!< @errcode: 0xE03D + * @desc: APP Error: Tx peak power is below the peak power threshold + * @maincause: Tx signal peak power is too low + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: adjust tx digital backtoff to increase singal power + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_POST_DPD_TX_PEAK_TOO_LOW_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 62u), /*!< @errcode: 0xE03E + * @desc: APP Error: Post-DPD Tx peak power is below the peak power threshold + * @maincause: Post-DPD Tx signal peak power is too low + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: adjust tx digital backtoff to increase singal power + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_ORX_SATURATING_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 63u), /*!< @errcode: 0xE03F + * @desc: APP Error: ORx peak power is above the peak power threshold + * @maincause: ORx signal peak power is too high + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: adjust ORx atten to reduce singal power + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_TX_SATURATING_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 64u), /*!< @errcode: 0xE040 + * @desc: APP Error: Tx peak power is above the peak power threshold + * @maincause: Tx signal peak power is too high + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: adjust tx digital backtoff to reduce singal power + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_POST_DPD_TX_SATURATING_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 65u), /*!< @errcode: 0xE041 + * @desc: APP Error: Post-DPD Tx peak power is above the peak power threshold + * @maincause: Post-DPD Tx signal peak power is too high + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: adjust tx digital backtoff to reduce singal power + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_EXCEED_MAX_FEATURE_INDEXES_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 66u), /*!< @errcode: 0xE042 + * @desc: APP Error: Exceed maximum number of feature indexes per feature segment + * @maincause: DPD model might not be right + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: check DPD model or reach ADI for support + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_EXCEED_MAX_FEATURE_SEGMENTS_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 67u), /*!< @errcode: 0xE043 + * @desc: APP Error: Exceed maximum number of feature segments + * @maincause: DPD model might not be right + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: check DPD model or reach ADI for support + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_EXCEED_PATHDELAY_RANGE_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 68u), /*!< @errcode: 0xE044 + * @desc: APP Error: Difference between estiamted and seeded pathdelays exceeded the programmed range + * @maincause: This is for informational purposes only. There is insufficient information in the signal to estimate path delay + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Confirm the seed value and the programmed qualify range. No recovery action expected from the user if these values provided are accurate. The firmware will use the seeded value automatically, in case the path delay cannot be estimated + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_R_TABLE_NO_COEFFICIENTS = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 69u), /*!< @errcode: 0xE045 + * @desc: APP Error: SW_TO_R_TABLE recovery action used when no R table coefficients are configured + * @maincause: Model 2 (R table) coefficients not configured + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Ensure Model 2 (R table) has been configured, including after a DPD Reset, or disable use of SW_TO_R_TABLE recovery action + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_VSWR_CAPTURE_RETRY_AFTER_ABORT = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 70u), /*!< @errcode: 0xE046 + * @desc: APP Error: VSWR Capture Retry after abort + * @maincause: Only happens in RCI mode. Mapping has changed when capture is in progress + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_NONE + * @mainrecovtext: No action required. Cal will retry capture once the mapping is correct + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_VSWR_TX_ATTEN_GET_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 71u), /*!< @errcode: 0xE047 + * @desc: APP Error: VSWR unable to read back current Tx attenuation + * @maincause: Unexpected error returned when reading Tx attenuation from HW + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the problem persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_VSWR_TX_ATTEN_CHANGED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 72u), /*!< @errcode: 0xE048 + * @desc: APP Error: Tx attenuation is changed while VSWR is capturing + * @maincause: User initiated change + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: It is mainly a warning that VSWR skips updating in the event + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_VSWR_XCORR_FAIL = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 73u), /*!< @errcode: 0xE049 + * @desc: APP Error: Failure to find forward gain or reflection using cross-correlation + * @maincause: Invalid playback signal that doesn't correlate with accumulated capture + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Reset VSWR after checking playback signal + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_VSWR_FWD_PATH_UNSTABLE = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 74u), /*!< @errcode: 0xE04A + * @desc: APP Error: Forward path delay found by VSWR has changed by unexpected amount + * @maincause: Forward path delay determined by cross correlation of accumulated capture has changed too much + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check playback signal, number of accumulation iterations, and forward path attenuation + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_VSWR_MINOR_ALARM = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 75u), /*!< @errcode: 0xE04B + * @desc: APP Error: VSWR return loss values triggered minor alarm + * @maincause: Return loss values have passed thresholds configured for VSWR minor alarm + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check external path conditions and/or VSWR alarm configuration + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_VSWR_MAJOR_ALARM = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 76u), /*!< @errcode: 0xE04C + * @desc: APP Error: VSWR return loss values triggered major alarm + * @maincause: Return loss values have passed thresholds configured for VSWR major alarm + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check external path conditions and/or VSWR alarm configuration. + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CMD_INVALID_OPCODE = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 256u), /*!< @errcode: 0xE100 + * @desc: APP Error: Command Opcode + * @maincause: Invalid Application Command Opcode Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Application Command Message is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CMD_INVALID = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 257u), /*!< @errcode: 0xE101 + * @desc: APP Error: Application Command + * @maincause: Invalid Application Command Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Application Command Message is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAPTURE_BUFFER_LIMIT_EXCEEDED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 258u), /*!< @errcode: 0xE102 + * @desc: APP Error: Capture Buffer Storage + * @maincause: Capture Buffer Count Limit Reached + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Clear or Reduce Number of Stored Data Captures + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_FDD_LUT_COPY_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 259u), /*!< @errcode: 0xE103 + * @desc: APP Error: FDD LUT Copy + * @maincause: Invalid LUT Copy Parameters + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check LUT Copy Parameters are Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_TDD_LUT_COPY_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 260u), /*!< @errcode: 0xE104 + * @desc: APP Error: TDD LUT Copy + * @maincause: Invalid LUT Copy Parameters + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check LUT Copy Parameters are Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_VBANK_BUF_NOT_ALLOCATED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 261u), /*!< @errcode: 0xE105 + * @desc: APP Error: vBank Buffers + * @maincause: Invalid vBank Buffers Pointer(s) + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check vBank Parameters are Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_PWR_METER_READBACK_FAIL = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 262u), /*!< @errcode: 0xE106 + * @desc: APP Error: DPD Power Meter Read + * @maincause: Invalid Tx Channel Parameter Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Tx Channel is Enabled + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_NULL_PTR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 263u), /*!< @errcode: 0xE107 + * @desc: APP Error: Capture Buffer Pointer + * @maincause: Invalid Capture Buffer Pointer + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Capture Buffer Pointer is Valid + * @severity: CRITICAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_ADAPTATION_BUFFER_ACQ_FAIL = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 264u), /*!< @errcode: 0xE108 + * @desc: APP Error: DPD Adaptation Buffer + * @maincause: Failed to Acquire Adaptation Buffer + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Capture Buffers are not still in use + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_VSWR_CMD_NOT_SUPPORTED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 265u), /*!< @errcode: 0xE109 + * @desc: APP Error: VSWR command not supported + * @maincause: VSWR received unsupported command + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check VSWR command data + * @severity: CRITICAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_VSWR_INCOMPLETE_CAPTURE = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 266u), /*!< @errcode: 0xE10A + * @desc: APP Error: VSWR Capture Incomplete + * @maincause: VSWR Capture Reporting Incomplete + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check VSWR Calibration is Configured Correctly + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_VSWR_CAPTURE_REQUEST_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 267u), /*!< @errcode: 0xE10B + * @desc: APP Error: VSWR Capture Request + * @maincause: Invalid VSWR Capture Request Parameters + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check VSWR Capture Request Parameters are Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_EXT_CAPTURE_BUSY = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 268u), /*!< @errcode: 0xE10C + * @desc: APP Error: Capture Buffer Busy + * @maincause: Capture Buffer is in use and cannot Respond to new Data Capture Request + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Wait until Current Capture has Complete + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_VSWR_ABORTED_CAPTURE = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 269u), /*!< @errcode: 0xE10D + * @desc: APP Error: VSWR Capture Abort + * @maincause: VSWR Capture Aborted + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Retry VSWR Capture + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_VBANK_BUFFER_ACQ_FAIL = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 270u), /*!< @errcode: 0xE10E + * @desc: APP Error: vBank Buffer(s) Acquire + * @maincause: VBank Buffer(s) not Available + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check that Buffer(s) are Available + * @severity: CRITICAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_FDD_LUT_COPY_START_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 271u), /*!< @errcode: 0xE10F + * @desc: FDD Lut Copy Start Failed + * @maincause: Unexpected LUT copy start failure + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset the feature to recover from this error. if problem persists contact ADI. + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_FDD_LUT_COPY_TIMEOUT = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 272u), /*!< @errcode: 0xE110 + * @desc: FDD Lut Copy Timed Out + * @maincause: Timed out waiting for LUT copy to complete + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset the feature to recover from this error. if problem persists contact ADI. + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_FDD_LUT_COPY_EVENTGET_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 273u), /*!< @errcode: 0xE111 + * @desc: FDD LUT Copy error while waiting for completion. Not timeout related. + * @maincause: Unknown error encountered while waiting for any LUT done or error event + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset the feature to recover from this error. if problem persists contact ADI. + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_FDD_LUT_COPY_SDK_DMA_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 274u), /*!< @errcode: 0xE112 + * @desc: FDD LUT Copy error encountered during DMA transfer. + * @maincause: Unknown error encountered in DMA transfer. + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset the feature to recover from this error. if problem persists contact ADI. + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_TDD_LUT_COPY_START_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 275u), /*!< @errcode: 0xE113 + * @desc: TDD Lut Copy Start Failed + * @maincause: Unexpected LUT copy start failure + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset the feature to recover from this error. if problem persists contact ADI. + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_TDD_LUT_COPY_TIMEOUT = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 276u), /*!< @errcode: 0xE114 + * @desc: TDD Lut Copy Timed Out + * @maincause: Timed out waiting for LUT copy to complete + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset the feature to recover from this error. if problem persists contact ADI. + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_TDD_LUT_COPY_EVENTGET_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 277u), /*!< @errcode: 0xE115 + * @desc: TDD LUT Copy error while waiting for completion. Not timeout related. + * @maincause: Unknown error encountered while waiting for any LUT done or error event + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset the feature to recover from this error. if problem persists contact ADI. + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_TDD_LUT_COPY_SDK_DMA_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 278u), /*!< @errcode: 0xE116 + * @desc: TDD LUT Copy error encountered during DMA transfer. + * @maincause: Unknown error encountered in DMA transfer. + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset the feature to recover from this error. if problem persists contact ADI. + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_TDD_LUT_COPY_SDK_DMA_INPROG_TXON_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 279u), /*!< @errcode: 0xE117 + * @desc: TDD LUT Copy was In Progress for a Tx channel during TX_ON. + * @maincause: TDD LUT Copy started too late after TX_OFF falling edge to be finished before TX_ON rising edge. + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset the feature to recover from this error. if problem persists contact ADI. + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_TX_POWER_MEAS_REQUEST_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 280u), /*!< @errcode: 0xE118 + * @desc: APP Error: Tx Power measurement Request + * @maincause: Invalid Tx Power measurement Request Parameters + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Tx Power Measurement Request Parameters are valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_TX_POWER_MEAS_UNEXPECTED_CAP_TYPE = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 281u), /*!< @errcode: 0xE119 + * @desc: APP Error: Unexpected capture type received in capture done event + * @maincause: Unexpected capture type received in capture done event + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the problem persists + * @severity: CRITICAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_POWER_MEAS_ABORTED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 282u), /*!< @errcode: 0xE11A + * @desc: APP Error: Tx power measurement is aborted + * @maincause: Power measurement didn't complete within RS pattern + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Adjust pattern timing or power measurement duration + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAPTURE_RESULT_OVERWRITE = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 283u), /*!< @errcode: 0xE11B + * @desc: APP Error: Application consumed Capture Done Event Payload too late + * @maincause: SDK Cap Service overwrote Capture Done Event Payload before it was received and consumed by App + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Adjust configuration and/or timing in application to prevent this SDK overwrite. + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_MODEL_LINEAR_TERM_NOT_MATCHED_M_TABLE = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 284u), /*!< @errcode: 0xE11C + * @desc: APP Error: LUT linear term of all tables must equal LUT linear term of Table 0 + * @maincause: LUT linear term of table not equal to LUT linear term of Table 0 + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Change LUT linear term of table + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_SEM_WAIT_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 285u), /*!< @errcode: 0xE11D + * @desc: APP Error: Sempahore wait request failed + * @maincause: The call to sempahore wait API failed + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_SEM_POST_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 286u), /*!< @errcode: 0xE11E + * @desc: APP Error: Sempahore post request failed + * @maincause: The call to sempahore post API failed + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_POST_CAL_CLEANUP_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 287u), /*!< @errcode: 0xE11F + * @desc: APP Error: The post calibration cleanup failed + * @maincause: The call to perform post calibration cleanup failed + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: CRITICAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_CAPTURE_REQUEST_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 290u), /*!< @errcode: 0xE122 + * @desc: APP Error: CLGC Capture Request + * @maincause: Invalid CLGC Capture Request + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check CLGC capture configuration parameters + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_CAPTURE_RESULT_GET_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 291u), /*!< @errcode: 0xE123 + * @desc: APP Error: CLGC Capture Result Get + * @maincause: Service error when reading back power meter result + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the problem persists + * @severity: + */ + + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_CAPTURE_SIGNAL_LOW_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 292u), /*!< @errcode: 0xE124 + * @desc: APP Error: Tx or ORx power is below threshold set + * @maincause: Power measurement cannot find healthy signal after max retries + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Tx or ORx signal level and capture thresholds + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_STATUS_GET_FUNC_NOT_SUPPORTED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 293u), /*!< @errcode: 0xE125 + * @desc: APP Error: Unsupported CLGC Status Get + * @maincause: Status Get function not Supported for Provided Tracking Calibration Status Type + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Tracking Calibration Status Type has a Supported Status Get Feature + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_STATUS_GET_INSUFFICIENT_MEMORY = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 294u), /*!< @errcode: 0xE126 + * @desc: APP Error: CLGC Status Buffer Size + * @maincause: Invalid Status Buffer Size for the Calibration Status Type Requested + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Status Size for the Calibration Status Type Requested + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_CTRL_FUNC_NOT_SUPPORTED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 295u), /*!< @errcode: 0xE127 + * @desc: APP Error: CLGC Control Command + * @maincause: Invalid Control Command Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Control Command is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_CTRL_GET_INSUFFICIENT_MEMORY = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 296u), /*!< @errcode: 0xE128 + * @desc: APP Error: CLGC CTRL command Buffer Size + * @maincause: Invalid CTRL command Buffer Size for the Calibration CTRL Type Requested + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check CTRL command Size for the Calibration CTRL Type Requested + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_PA_PROTECTION_ASSERTED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 297u), /*!< @errcode: 0xE129 + * @desc: APP Error: CLGC detects PA protection assertion + * @maincause: PA protection error asserted or Tx attenuation ramp-up/down in progress + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check PA protection thresholds or Tx signal level + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_TX_ATTEN_ABOVE_MAX_LIMIT = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 298u), /*!< @errcode: 0xE12A + * @desc: APP Error: CLGC Tx Attenuation Above Maximum Limit + * @maincause: CLGC failed to ajust Tx attenuation because it is above maximum limit + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Tx atten limits or/and expected loop gain configured + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_TX_ATTEN_BELOW_MIN_LIMIT = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 299u), /*!< @errcode: 0xE12B + * @desc: APP Error: CLGC Tx Attenuation Below Minimum Limit + * @maincause: CLGC failed to ajust Tx attenuation because it is below minimum limit + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Tx atten limits or/and expected loop gain configured + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_CAPTURE_EVENT_UNEXPECTED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 300u), /*!< @errcode: 0xE12C + * @desc: APP Error: Unexpected capture event received in capture state machine + * @maincause: Unexpected capture type received in capture state machine + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the problem persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_TX_ATTEN_SET_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 301u), /*!< @errcode: 0xE12D + * @desc: APP Error: CLGC unable to set Tx attenuation + * @maincause: Unexpected error returned when writing Tx attenuation to HW + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the problem persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_TX_ATTEN_GET_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 302u), /*!< @errcode: 0xE12E + * @desc: APP Error: CLGC unable to read back current Tx attenuation + * @maincause: Unexpected error returned when reading Tx attenuation from HW + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the problem persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_ORX_ATTEN_GET_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 303u), /*!< @errcode: 0xE12F + * @desc: APP Error: CLGC unable to read back current ORx attenuation + * @maincause: Unexpected error returned when reading ORx attenuation from HW + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the problem persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_CAPTURE_ABORT_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 304u), /*!< @errcode: 0xE130 + * @desc: APP Error: CLGC Capture Abort + * @maincause: Service error when aborting a CLGC capture + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the problem persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_CAPTURE_DISCARD_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 305u), /*!< @errcode: 0xE131 + * @desc: APP Error: CLGC Capture Discard + * @maincause: Service error when discarding a CLGC capture + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the problem persists + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_EVENT_REGISTER_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 306u), /*!< @errcode: 0xE132 + * @desc: APP Error: Capture Event Registration + * @maincause: OSAL failed to Register a Capture Event + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_CAPTURE_START_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 307u), /*!< @errcode: 0xE133 + * @desc: APP Error: Capture Start Event + * @maincause: Capture start error occured + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_ABORTED_CAPTURE = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 308u), /*!< @errcode: 0xE134 + * @desc: APP Error: Capture Aborted + * @maincause: capture aborted due to EXIT request + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_INCOMPLETE_CAPTURE = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 309u), /*!< @errcode: 0xE135 + * @desc: APP Error: Incomplete Capture + * @maincause: DPD capture incomplete in CLGC peak detection mode + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_TX_ORX_MAP_INVALID = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 310u), /*!< @errcode: 0xE136 + * @desc: APP Error: A Tx Channel Not Mapped to an ORx Channel + * @maincause: Tx-ORx map not set + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check and set Tx to ORx map + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_UNEXPECTED_CAPTURE_PERIOD_END_SIGNAL = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 311u), /*!< @errcode: 0xE137 + * @desc: APP Error: Unexpected capture period end signal + * @maincause: Unexpected capture period end signal + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Contact ADI + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_RX_CAPTURE_REQUEST_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 312u), /*!< @errcode: 0xE138 + * @desc: APP Error: Rx Capture Request failed + * @maincause: Invalid Rx Capture Request Parameters + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Rx Capture Request Parameters are Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_BAD_CAPTURE_DATA = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 313u), /*!< @errcode: 0xE139 + * @desc: APP Error: bad data captured + * @maincause: Bad waveform or incompleted capture + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check waveform + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_TX_ATTEN_CHANGED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 314u), /*!< @errcode: 0xE13A + * @desc: APP Error: Tx attenuation is changed while CLGC is tracking + * @maincause: User initiated change + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: It is mainly a warning that CLGC skips updating in the event + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_VSWR_ACCUM_CAPTURE_OVERFLOW = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 315u), /*!< @errcode: 0xE13B + * @desc: APP Error: VSWR Accumulating capture overflow + * @maincause: I or Q values in accumulated capture overflowed + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check VSWR playback signal and capture configuration + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_CAPTURE_DISCARD_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 316u), /*!< @errcode: 0xE13C + * @desc: APP Error: DPD Capture Discard + * @maincause: Service error when discarding a DPD capture + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the problem persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_CAPTURE_RETRY_AFTER_ABORT = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 317u), /*!< @errcode: 0xE13D + * @desc: APP Error: DPD Capture Retry after abort + * @maincause: Only happens in RCI mode. Mapping has changed when capture is in progress + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_NONE + * @mainrecovtext: No action required. Cal will retry capture once the mapping is correct + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_CAPTURE_RETRY_AFTER_ABORT = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 318u), /*!< @errcode: 0xE13E + * @desc: APP Error: CLGC Capture Retry after abort + * @maincause: Only happens in RCI mode. Mapping has changed when capture is in progress + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_NONE + * @mainrecovtext: No action required. Cal will retry capture once the mapping is correct + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DISABLE_ACTUATOR_PASSTHRU_FAILURE = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 319u), /*!< @errcode: 0xE13F + * @desc: APP Error: fail to disable actuator passthru + * @maincause: invalid param or fail to get dpd act driver mutex + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check parameter + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CFG_SYSTEM_CONFIG_LOCKED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 320u), /*!< @errcode: 0xE140 + * @desc: APP Error: App Configuration is Locked + * @maincause: Configuration has not been Unlocked + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Unlock Configuration before trying again + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_MODEL_SWITCH_MUTEX_REQ_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 321u), /*!< @errcode: 0xE141 + * @desc: APP Error: Model switch mutex req failed + * @maincause: Mutex Acquire/Release Failed for DPD model switching + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: CRITICAL + */ + + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_MODEL_SWITCH_INVALID_PARAM = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 322u), /*!< @errcode: 0xE142 + * @desc: APP Error: DPD model switch function is called with invalid parameter + * @maincause: DPD model switch function is called with invalid parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_MODEL_SWITCH_FAILURE = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 323u), /*!< @errcode: 0xE143 + * @desc: APP Error: DPD model switch failed to switch model + * @maincause: DPD model has not been switching as requested + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: CRITICAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_MODEL_SWITCH_POWER_METER_FAILURE = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 324u), /*!< @errcode: 0xE144 + * @desc: APP Error: DPD model switch power meter thread has failed + * @maincause: DPD models are not switching based on power meter measurements + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_GAIN_MONITOR_ASSERTED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 325u), /*!< @errcode: 0xE145 + * @desc: APP Error: CLGC update is skipped because DPD actuator gain monitor has asserted + * @maincause: DPD actuator gain outside set limits + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: It is mainly a warning that CLGC skips updating in the event + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_GAIN_MONITOR_FAILURE = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 326u), /*!< @errcode: 0xE146 + * @desc: APP Error: CLGC update is skipped because DPD actuator gain monitor status could not be determined + * @maincause: DPD gain monitor status check has failed + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: + */ + + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAPTURE_SEQ_CAPTURE_REQ_PENDING = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 327u), /*!< @errcode: 0xE147 + * @desc: APP Error: There is already a pending capture period request + * @maincause: Cal thread is making a new capture period request before previous one has been processed + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_PATH_DELAY_OVERRANGE = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 328u), /*!< @errcode: 0xE148 + * @desc: APP Error: DPD integer Path Delay estimation is out of lag range (-255, 0) + * @maincause: DPD Path Delay Estimation Failure + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_GAIN_MONITOR_ASSERTED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 329u), /*!< @errcode: 0xE149 + * @desc: APP Error: DPD update aborted because DPD actuator gain monitor has asserted + * @maincause: DPD actuator gain outside set limits + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check DPD configuration + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_TSSIORX_MEASURE_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 330u), /*!< @errcode: 0xE14A + * @desc: APP Error: CLGC TSSI ORx meter failed to update + * @maincause: The call to perform TSSI ORx measurements failed + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_TSSI1_MEASURE_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 331u), /*!< @errcode: 0xE14B + * @desc: APP Error: CLGC TSSI1 meter failed to update + * @maincause: The call to perform TSSI1 measurements failed + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_TSSI2_MEASURE_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 332u), /*!< @errcode: 0xE14C + * @desc: APP Error: CLGC TSSI2 meter failed to update + * @maincause: The call to perform TSSI2 measurements failed + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Reset DFE and try again. Contact ADI if the Problem Persists + * @severity: + */ + + + ADI_ADRV904X_DFE_APP_ERR_CODE_UNEXPECTED_CAPTURE_EVENT = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 333u), /*!< @errcode: 0xE14D + * @desc: APP Error: Unexpected event when performing captures + * @maincause: Unexpected event when performing captures + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Contact ADI with memdump + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_UNEXPECTED_CAPTURE_ID = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 334u), /*!< @errcode: 0xE14E + * @desc: APP Error: Unexpected capture id when performing captures + * @maincause: Unexpected capture id when performing captures + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Contact ADI with memdump + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAPTURE_BUF_NO_INSTANCE_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 335u), /*!< @errcode: 0xE14F + * @desc: APP Error: Cal thread couldn't acquire capture buffer for multiple times + * @maincause: Capture buffers are in use by some other calibration threads + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Contact ADI with memdump if problem persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAPTURE_INCOMPLETE_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 336u), /*!< @errcode: 0xE150 + * @desc: APP Error: Capture was incomplete + * @maincause: HW couldn't capture all samples or there were 0 samples in dataset + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check transmit data and TDD settings + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAPTURE_ABORT_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 337u), /*!< @errcode: 0xE151 + * @desc: APP Error: Capture was aborted + * @maincause: Capture is aborted due to mapping change or user abort request + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check mapping settings (RCI mode) or capture period length(RS mode) + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_UNEXPECTED_CAPTURE_COUNT = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 338u), /*!< @errcode: 0xE152 + * @desc: APP Error: Unexpected capture count in capture flow + * @maincause: Unexpected capture count in capture flow + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Contact ADI with memdump + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_UNEXPECTED_CAPTURE_PERIOD_END_EVENT = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 339u), /*!< @errcode: 0xE153 + * @desc: APP Error: Unexpected capture period end event in capture flow + * @maincause: Unexpected capture period end event in capture flow + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Contact ADI with memdump + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAPTURE_PERIOD_ENDED_BEFORE_CAPTURES = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 340u), /*!< @errcode: 0xE154 + * @desc: APP Error: Capture period ended before all captures complete + * @maincause: Capture period might be too short or captures taking longer than expected + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check capture period, capture parameters and transmit waveform + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_MAX_NUMBER_OF_CAPTURES_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 341u), /*!< @errcode: 0xE155 + * @desc: APP Error: Application layer requested requested more than maximum number of captures + * @maincause: Application layer requested requested more than maximum number of captures + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Contact ADI with memdump + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAPTURE_STORE_UNKNOWN_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 342u), /*!< @errcode: 0xE156 + * @desc: APP Error: Capture result reports an unexpected error + * @maincause: Capture result reports an unexpected error + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Contact ADI with memdump + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_INVALID_CAPTURE_TYPE = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 343u), /*!< @errcode: 0xE157 + * @desc: APP Error: Invalid capture type selected by application thread + * @maincause: Invalid capture type is selected by application thread + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Contact ADI with memdump + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAPTURE_SW_TRIGGER_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 344u), /*!< @errcode: 0xE158 + * @desc: APP Error: Capture trigger in SW mode has failed + * @maincause: Capture trigger in SW mode has failed + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Contact ADI with memdump + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_NULL_PTR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 345u), /*!< @errcode: 0xE159 + * @desc: APP Error: Null pointer + * @maincause: Invalid Pointer + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Contact ADI with memdump + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_NOT_SUPPORTED_LUT64_FDD = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 346u), /*!< @errcode: 0xE15A + * @desc: APP Error: DPD not supported with LUT depth 64 in FDD mode + * @maincause: Invalid DPD configuration requested + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check DPD configuration + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_NOT_SUPPORTED_LUT64_MODE2 = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 347u), /*!< @errcode: 0xE15B + * @desc: APP Error: DPD update mode 2 or 3 not supported with LUT depth 64 + * @maincause: Invalid DPD configuration requested + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check DPD configuration + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_NOT_SUPPORTED_LUT64_R = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 348u), /*!< @errcode: 0xE15C + * @desc: APP Error: Only unity gain (Model 4) can be used as low-power/gain-mon recovery model with LUT depth 64 + * @maincause: Invalid DPD configuration requested + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check DPD configuration + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_NOT_SUPPORTED_TDD_LUTSW = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 349u), /*!< @errcode: 0xE15D + * @desc: APP Error: TDD LUT switching is only supported at LUT depth 16 + * @maincause: Invalid DPD configuration requested + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check DPD configuration + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_NOT_SUPPORTED_LUT32_FDD_MODE2 = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 350u), /*!< @errcode: 0xE15E + * @desc: APP Error: DPD Update mode 2/3 not supported in FDD mode with LUT depth 32 + * @maincause: Invalid DPD configuration requested + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check DPD configuration + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_NOT_SUPPORTED_LUT32_FDD_R = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 351u), /*!< @errcode: 0xE15F + * @desc: APP Error: Only unity gain (Model 4) can be used as low-power/gain-mon recovery model with LUT depth 32 in FDD mode + * @maincause: Invalid DPD configuration requested + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check DPD configuration + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_NOT_SUPPORTED_LUT32_MODEL2 = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 352u), /*!< @errcode: 0xE160 + * @desc: APP Error: Model 2 cannot be used for low-power/gain-mon recovery with LUT depth 32 + * @maincause: Invalid DPD configuration requested + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check DPD configuration + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_NOT_SUPPORTED_MODE2_MODEL1 = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 353u), /*!< @errcode: 0xE161 + * @desc: APP Error: Model 1 cannot be used for low-power/gain-mon recovery with DPD update mode 2 + * @maincause: Invalid DPD configuration requested + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check DPD configuration + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_NOT_SUPPORTED_FDD_LUTSW = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 354u), /*!< @errcode: 0xE162 + * @desc: APP Error: TDD LUT switching is not supported in FDD mode + * @maincause: Invalid DPD configuration requested + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check DPD configuration + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAP_SEQ_CFG_INVALID_PARAM = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 355u), /*!< @errcode: 0xE163 + * @desc: APP Error: Cap sequencer config out of range + * @maincause: Invalid configuration + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check capture sequencer config parameter + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CAP_SEQ_CFG_INVALID_MODE = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 356u), /*!< @errcode: 0xE164 + * @desc: APP Error: Cap sequencer command not supported in this mode + * @maincause: Invalid configuration + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check mapping operation mode, RCI/RS/Dfe mapping control + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_VSWR_CMD_INSUFFICIENT_MEMORY = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 357u), /*!< @errcode: 0xE165 + * @desc: APP Error: Not enough memory to respond to VSWR command + * @maincause: Invalid buffer size passed to VSWR command handler + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check VSWR command data + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_VSWR_TX_WAVEFORM_READ_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 358u), /*!< @errcode: 0xE166 + * @desc: APP Error: VSWR Waveform get failed + * @maincause: Vswr generator might be enabled or waveform length is invalid + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check VSWR waveform length + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_VSWR_TX_WAVEFORM_NOT_LOADED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 359u), /*!< @errcode: 0xE167 + * @desc: APP Error: VSWR Waveform length is 0 + * @maincause: Waveform is not loaded + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Load VSWR waveform before enabling cal + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_STOP_CRITERIA_NOT_MET_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 360u), /*!< @errcode: 0xE168 + * @desc: APP Error: Stop Criteria not met + * @maincause: Stop Criteria in Pass On Stop not met + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check if the stopping criteria is set properly + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_SIG_STATS_GEN_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 361u), /*!< @errcode: 0xE169 + * @desc: APP Error: Signal Stats Generation Error + * @maincause: Capture Configuration + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check if capture engine is configured correctly + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_TARGET_VALS_NOT_AVAIL_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 362u), /*!< @errcode: 0xE16A + * @desc: APP Error: Target values were not populated + * @maincause: Capture configuration + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check if capture engine is configured correctly + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CTC1_CAPTURE_WEIGHT_NOT_VALID_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 363u), /*!< @errcode: 0xE16B + * @desc: APP Error: Capture weights in ctc1 mode are not valid + * @maincause: Capture configuration + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check if capture weights in ctc1 mode are configured correctly + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_CT_FLUT_BUFFER_ACQ_FAIL = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 364u), /*!< @errcode: 0xE16C + * @desc: APP Error: CT FLUT buffer acquire failed + * @maincause: CT FLUT Buffer not Available + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check that if buffers are available + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CT_DPD_FLUT_COPY_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 365u), /*!< @errcode: 0xE16D + * @desc: APP Error: CTC FLUT Copy + * @maincause: LUT copy timedout or DMA error reported + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Contact ADI with memdump + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CT_DPD_MODEL_CONFIG_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 366u), /*!< @errcode: 0xE16E + * @desc: APP Error: CTC Model config failed + * @maincause: Invalid configuration or out of range parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check CTC model configuration + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CT_DPD_ACT_DELAY_GET_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 367u), /*!< @errcode: 0xE16F + * @desc: APP Error: CTC Act delay get failed + * @maincause: CTC driver mutex lock might have failed + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Contact ADI with memdump + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CT_DPD_ACT_FBOX_SCALE_GET_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 368u), /*!< @errcode: 0xE170 + * @desc: APP Error: CTC Act Fbox scaler get failed + * @maincause: CTC driver mutex lock might have failed + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Contact ADI with memdump + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CT_DPD_ACTUATOR_ENABLE_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 369u), /*!< @errcode: 0xE171 + * @desc: APP Error: CTC Actuator enable failed + * @maincause: CTC driver mutex lock might have failed + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Contact ADI with memdump + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CT_DPD_ACTUATOR_RESET_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 370u), /*!< @errcode: 0xE172 + * @desc: APP Error: CTC Actuator reset failed + * @maincause: CTC driver mutex lock might have failed + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_FEATURE + * @mainrecovtext: Contact ADI with memdump + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_CT_DPD_ACT_FBOX_SCALE_SET_FAILED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 371u), /*!< @errcode: 0xE173 + * @desc: APP Error: CTC Act Fbox scaler set failed + * @maincause: Fbox scaler is smaller than model config requires + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Increase fbox scaler value + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_TDD_LUT_COPY_SDK_DMA_NOT_TRIGGERED = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 372u), /*!< @errcode: 0xE174 + * @desc: APP Error: Lut update DMA request cannot be implemented + * @maincause: Lack of TX falling edge + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Enable TX channel or shorten the TX on time + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DFE_FEATCOMPUTE_BAD_CALTYPE = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 373u), /*!< @errcode: 0xE175 + * @desc: APP Error: calType to request feature compute + * @maincause: Invalid Calibration Type Provided to Function + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Feature Compute calType Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DFE_FEATCOMPUTE_UNEXPECTED_EVENT = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 374u), /*!< @errcode: 0xE176 + * @desc: APP Error: Unexpected Feature Compute Event + * @maincause: Unexpected Error + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Contact ADI with memdump if the Problem Persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DFE_FEATCOMPUTE_INVALID_ENTRY = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 375u), /*!< @errcode: 0xE177 + * @desc: APP Error: Invalid Feature Compute Entries + * @maincause: Unexpected Error + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Contact ADI with memdump if the Problem Persists + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_NOT_SUPPORTED_UPDATE_MODE3 = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 376u), /*!< @errcode: 0xE178 + * @desc: APP Error: DPD Update mode 3 only supported with LUT depth 16, when model 2 is not being used for recovery + * @maincause: Invalid DPD configuration requested + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check DPD configuration + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_MAX_PARTITIONS_REACHED_ERROR = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 377u), /*!< @errcode: 0xE179 + * @desc: APP Error: DPD partial update failed because the partial times over maximum times + * @maincause: Too many DPD coefficients to handle + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check DPD configuration + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DFE_OUT_OF_RANGE_BLOCK_ID_DECOMP = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 378u), /*!< @errcode: 0xE180 + * @desc: APP Error: Out of range block id during decomposition + * @maincause: Unexpected Error + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Contact ADI with memdump if the Problem Persists + * @severity:CRITICAL + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_NO_AVAILABLE_ITERATION_TYPE = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 379U), /*!< @errcode: 0xE181 + * @desc: APP Error: DPD couldn't find an available iteration type(GMP or CTC2) to run + * @maincause: No GMP and/or CTC2 models configured + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Configure a GMP model before enabling DPD cal + * @severity: + */ + + ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_INDIRECT_LEARNING_SET_FOR_PARTIAL = (ADI_ADRV904X_DFE_APP_ERR_COMMON_ERROR_CODE_START + 380U), /*!< @errcode: 0xE182 + * @desc: APP Error: indirect learning is set for partial update + * @maincause: customer configured indirect learning + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Configure direct learning if using partial update + * @severity: + */ + +#ifndef ADI_ADRV904X_DFE_SVC_CMN_FW + /* Pseudo error code */ + ADI_ADRV904X_DFE_APP_ERR_CODE_CPU_CAL_EXIT_OCCURRED_ERROR = (int32_t) 0x80000000 /* Remove UL for API to avoid ISO C error. set to large number to force enum to be uint32_t */ +#else + /* Pseudo error code */ + ADI_ADRV904X_DFE_APP_ERR_CODE_CPU_CAL_EXIT_OCCURRED_ERROR = 0x80000000UL /* Add UL for FW to force it to be unsigned int. set to large number to force enum to be uint32_t */ +#endif +} adi_adrv904x_DfeAppErrCode_e; + +#endif /* __ADI_ADRV904X_DFE_APP_ERROR_CODES_T_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cal_clgc_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cal_clgc_types.h new file mode 100644 index 00000000000..2ab90cde89f --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cal_clgc_types.h @@ -0,0 +1,117 @@ +/** + * Copyright 2015 - 2022 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adi_adrv904x_dfe_cal_clgc_types.h + * + * \brief Contains DFE Application type definitions for CLGC, visible to BBIC API + * and customers. + * + * ADRV904X API Version: 2.10.0.4 + */ + + +#ifndef ADRV904X_DFE_CAL_CLGC_TYPES_H_ +#define ADRV904X_DFE_CAL_CLGC_TYPES_H_ + +#include +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_dfe_svc_dfe_capture_cmn_t.h" +#include "adi_adrv904x_cals_structs.h" + +/** + * \brief CLGC CTRL commands + */ +#define ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_COMMAND_FLAG (0x80u) +#define ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_COMMAND_MASK (0x0Fu) +#define ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_SET_FLAG (0x10u) + +/** + * \brief CLGC capture modes + */ +typedef enum adi_adrv904x_DfeAppCalClgcCaptureMode +{ + ADI_ADRV904X_DFE_APP_CAL_CLGC_CAPTURE_MODE_TSSI, /*!< measurements based on TSSI power meters */ + ADI_ADRV904X_DFE_APP_CAL_CLGC_CAPTURE_MODE_PEAK_DET, /*!< measurements based on DPD peak detection captures */ +} adi_adrv904x_DfeAppCalClgcCaptureMode_e; + +/** + * \brief Enumerated list of options of CLGC ctrl cmd + */ +typedef enum adi_adrv904x_DfeAppCalClgcCtrlCmd +{ + ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_TRACK_CONFIG = 0, /*!< config track config structure */ + ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_CAPTURE_CONFIG = 1, /*!< config capture config structure */ + ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_TRACK_RUN = 2, /*!< run CLGC track once */ + ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_TRACK_RESET = 3, /*!< reset CLGC track */ + ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_CAPTURE_BUF_ACCESS = 4, /*!< Capture buffer access command for debugging purposes */ +} adi_adrv904x_DfeAppCalClgcCtrlCmd_e; + +/** + * \brief Data structure to hold CLGC capture configuration parameters + */ +ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppCalClgcCaptureCfg +{ + adi_adrv904x_DfeAppCalClgcCaptureMode_e capMode; /*!< CLGC capture mode: TSSI or peak detection */ + uint32_t numCapBatches; /*!< number of TSSI measurement batches in TSSI mode */ + uint32_t capDurationUs; /*!< TSSI measurement time (usec) of one batch in TSSI mode */ + uint32_t capPeriodUs; /*!< timeout (usec) for TSSI timer of one batch, or window length in peak det mode */ + float minTxPowThres; /*!< minimum Tx power threshold needed to run CLGC tracking for each of batches */ + float minOrxPowThres; /*!< minimum ORx power threshold needed to run CLGC tracking for each of batches */ +} adi_adrv904x_DfeAppCalClgcCaptureCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold CLGC tracking configuration parameters + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppCalClgcTrackCfg +{ + uint8_t enClgc; /*!< enable (1) or disable closed loop gain control */ + uint8_t enPaProtect; /*!< enable (1) or disable PA protection assert check in CLGC */ + float expLoopPowGain; /*!< expected Tx-ORx loop power gain for CLGC to track on */ + float maxLoopGainAdjustdB; /*!< maximum loop gain adjustment in dB for Tx atten */ + float minTxAttenLimitdB; /*!< minimum Tx attenuation limit in dB */ + float maxTxAttenLimitdB; /*!< maximum Tx attenuation limit in dB */ +} adi_adrv904x_DfeAppCalClgcTrackCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold parameters of CLGC status + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppCalClgcStatus +{ + adi_adrv904x_CalStatus_t hdr; /*!< cal status header */ + float txPwr; /*!< Tx power measured */ + float orxPwr; /*!< ORx power measured */ + float loopPowGain; /*!< current loop gain */ + float txAttenAdjdB; /*!< current Tx atten adjustment */ + uint32_t numCapBatchesRun; /*!< number of measurement batches actually run */ + uint32_t actCapDurationUs; /*!< actual measurement duration time in us */ + uint32_t capStartRetryCount; /*!< capture retries due to start error */ + uint32_t capAbortRetryCount; /*!< capture retries due to abort (e.g. mapping changes) */ + uint32_t capInvalidRetryCount; /*!< capture retries due to invalid/incomplete capture */ + uint32_t lowSigRetryCount; /*!< capture retries due to low signal power */ + uint32_t txAttenChangeCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_TX_ATTEN_CHANGED */ + uint32_t orxGainChangeCount; /*!< count for ORx gain changes made by user */ + uint32_t txAttenLimitCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_TX_ATTEN_BELOW_MIN_LIMIT and ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_TX_ATTEN_ABOVE_MAX_LIMIT */ + uint32_t paProtectAssertCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_PA_PROTECTION_ASSERTED */ + uint32_t lowSigErrorCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_CAPTURE_SIGNAL_LOW_ERROR */ + uint32_t capAbortErrorCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_ABORTED_CAPTURE */ + uint32_t capInvalidErrorCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_INCOMPLETE_CAPTURE and ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_CAPTURE_RESULT_GET_ERROR */ + uint32_t capStartErrorCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_CAPTURE_BUF_NO_INSTANCE_ERROR */ + uint32_t appExitRequestCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_CPU_CAL_EXIT_OCCURRED_ERROR */ + uint32_t gainMonAssertedCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_CLGC_GAIN_MONITOR_ASSERTED */ + uint32_t periodEndedErrorCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_CAPTURE_PERIOD_ENDED_BEFORE_CAPTURES*/ +} adi_adrv904x_DfeAppCalClgcStatus_t; +ADI_ADRV904X_PACK_FINISH + + +#endif /* ADRV904X_DFE_CAL_CLGC_TYPES_H_ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cal_dpd_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cal_dpd_types.h new file mode 100644 index 00000000000..98427e80263 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cal_dpd_types.h @@ -0,0 +1,642 @@ +/** + * Copyright 2015 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adi_adrv904x_dfe_cal_dpd_types.h + * + * \brief Contains ADRV904X data types for on board dfe dpd feature + * + * ADRV904X API Version: 2.10.0.4 + */ + + +#ifndef ADRV904X_DFE_CAL_DPD_TYPES_H__ +#define ADRV904X_DFE_CAL_DPD_TYPES_H__ + +#include +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_dfe_svc_dfe_actuator_cmn_t.h" +#include "adi_adrv904x_dfe_svc_dfe_capture_cmn_t.h" +#include "adi_adrv904x_dfe_svc_dfe_adaptation_cmn_t.h" +#include "adi_adrv904x_cals_structs.h" + + +/** + * \brief Maxinum number of feature filter coefficients + */ +#define ADI_ADRV904X_DFE_APP_CAL_DPD_MAX_NUM_COEFFICIENTS (64U) + +/** + * \brief Maxinum number of features supported in a DPD model + */ +#define ADI_ADRV904X_DFE_APP_CAL_DPD_MAX_NUM_FEATURES (510u) + +/** + * \brief Number of DPD GMP power models + */ +#define ADI_ADRV904X_DFE_APP_CAL_DPD_GMP_POWER_MODELS (4u) + +/** + * \brief Number of CTC2 power models + */ +#define ADI_ADRV904X_DFE_APP_CAL_DPD_CTC2_MODELS (1u) + +/** + * \brief Maximum number of DPD capture samples + */ +#define ADI_ADRV904X_DFE_APP_CAL_DPD_CAPTURE_SAMPLES_NUM (0x4000U) + +/** + * \brief Maximum number of DPD tdd lut switch capture batches + */ +#define ADI_ADRV904X_DFE_APP_CAL_DPD_TDD_LUT_SWITCH_CAP_NUM (4u) + +/** + * \brief Size of mask-able error array (uint32_t) + */ +#define ADI_ADRV904X_DFE_APP_CAL_DPD_NUM_ERROR_MASK (12u) + +/** + * \brief Maximum number of customer provided peak rank ratios + */ +#define ADI_ADRV904X_DFE_APP_CAL_CTC1_MAX_PEAK_RANK_RATIO_NUM (3u) + + +/** + * \brief Maximum number of captures + */ +#define EDPD_MAX_NUM_CAP_BATCHES (8u) + +/** + * \brief Maximum number of partial group for models + */ +#define ADI_ADRV904X_DFE_APP_CAL_DPD_MAX_NUM_PARTIAL_GRP (2u) + +/** + * \brief DPD update modes + */ +typedef enum adi_adrv904x_DfeAppCalDpdUpdateMode +{ + ADI_ADRV904X_DFE_APP_CAL_DPD_UPDATE_MODE_SU, /*!< Simple Update */ + ADI_ADRV904X_DFE_APP_CAL_DPD_UPDATE_MODE_SUMO, /*!< Simple Update Max Only */ + ADI_ADRV904X_DFE_APP_CAL_DPD_UPDATE_MODE_CMT, /*!< Current Max Table Update - Model Switching between M and C Table on power */ + ADI_ADRV904X_DFE_APP_CAL_DPD_UPDATE_MODE_CMT_3_MODEL, /*!< Model Switching between M, C and R Table on power, with handling of uncertainty region. + * In this mode, the 3 dynamic models must have the same feature configuration. + */ +} adi_adrv904x_DfeAppCalDpdUpdateMode_e; + +/** + * \brief DPD update modes API size translation + */ +typedef uint8_t adi_adrv904x_DfeAppCalDpdUpdateMode_t; + +/** + * \brief DPD types + */ +typedef enum adi_adrv904x_DfeAppCalDpdType +{ + ADI_ADRV904X_DFE_APP_CAL_DPD_TYPE_DPD = 0u, /*!< Regular DPD */ + ADI_ADRV904X_DFE_APP_CAL_DPD_TYPE_CTC_1, /*!< CTC-Mode 1 (Enhanced DPD) */ +} adi_adrv904x_DfeAppCalDpdType_e; + +/** + * \brief DPD types API size translation + */ +typedef uint8_t adi_adrv904x_DfeAppCalDpdType_t; + +/** + * \brief DPD GMP and DDR modes + */ +typedef enum adi_adrv904x_DfeAppCalDpdActGmpDdrMode +{ + ADI_ADRV904X_DFE_APP_CAL_DPD_ACT_GMP_DDR_MODE0, /*!< GMP0-50 */ + ADI_ADRV904X_DFE_APP_CAL_DPD_ACT_GMP_DDR_MODE1, /*!< GMP0-32 DDR7-6 DDR8-6 DDR9-6 */ + ADI_ADRV904X_DFE_APP_CAL_DPD_ACT_GMP_DDR_MODE2, /*!< GMP0-38 DDR7-6 DDR9-6 */ + ADI_ADRV904X_DFE_APP_CAL_DPD_ACT_GMP_DDR_MODE3, /*!< GMP0-38 DDR7-4 DDR8-4 DDR9-4 */ + ADI_ADRV904X_DFE_APP_CAL_DPD_ACT_GMP_DDR_MODE4, /*!< GMP0-44 DDR7-6 */ + ADI_ADRV904X_DFE_APP_CAL_DPD_ACT_GMP_DDR_MODE5, /*!< GMP0-44 DDR9-6 */ + ADI_ADRV904X_DFE_APP_CAL_DPD_ACT_GMP_DDR_MODE6, /*!< GMP0-44 DDR7-3 DDR9-3 */ + ADI_ADRV904X_DFE_APP_CAL_DPD_ACT_GMP_DDR_MODE7, /*!< GMP0-32 GMP1-9 DDR7-3 DDR8-3 DDR9-3 */ +} adi_adrv904x_DfeAppCalDpdActGmpDdrMode_e; + +/** + * \brief DPD GMP and DDR modes API size translation + */ +typedef uint8_t adi_adrv904x_DfeAppCalDpdActGmpDdrMode_t; + +/** + * \brief DPD model polynomial types + */ +typedef enum adi_adrv904x_DfeAppCalDpdActPolyType +{ + ADI_ADRV904X_DFE_APP_CAL_DPD_ACT_POLY_GMP0 = 0u, /*!< GMP polynomial */ + ADI_ADRV904X_DFE_APP_CAL_DPD_ACT_POLY_GMP1 = 1u, /*!< GMP polynomial for startup model */ + ADI_ADRV904X_DFE_APP_CAL_DPD_ACT_POLY_DDR7 = 7u, /*!< DDR7 polynomial */ + ADI_ADRV904X_DFE_APP_CAL_DPD_ACT_POLY_DDR8 = 8u, /*!< DDR8 polynomial */ + ADI_ADRV904X_DFE_APP_CAL_DPD_ACT_POLY_DDR9 = 9u, /*!< DDR9 polynomial */ +} adi_adrv904x_DfeAppCalDpdActPolyType_e; + +/** + * \brief DPD model polynomial types API size translation + */ +typedef uint16_t adi_adrv904x_DfeAppCalDpdActPolyType_t; + +/** + * \brief DPD LUT depth + */ +typedef enum adi_adrv904x_DfeAppCalDpdActDepth +{ + ADI_ADRV904X_DFE_APP_CAL_DPD_ACT_DEPTH_64 = 0u, /*!< Current depth of LUT 0: 64 deep */ + ADI_ADRV904X_DFE_APP_CAL_DPD_ACT_DEPTH_32 = 1u, /*!< Current depth of LUT 1: 32 deep */ + ADI_ADRV904X_DFE_APP_CAL_DPD_ACT_DEPTH_16 = 2u, /*!< Current depth of LUT 2: 16 deep */ +} adi_adrv904x_DfeAppCalDpdActDepth_e; + +/** + * \brief DPD LUT depth API size translation + */ +typedef uint8_t adi_adrv904x_DfeAppCalDpdActDepth_t; + +/** + * \brief DPD models + */ +typedef enum adi_adrv904x_DfeAppCalDpdModelType +{ + ADI_ADRV904X_DFE_APP_CAL_DPD_MODEL_TYPE_DPD_0 = 0, /*!< DPD model 0 */ + ADI_ADRV904X_DFE_APP_CAL_DPD_MODEL_TYPE_DPD_1 = 1, /*!< DPD model 1 */ + ADI_ADRV904X_DFE_APP_CAL_DPD_MODEL_TYPE_DPD_2 = 2, /*!< DPD model 2 */ + ADI_ADRV904X_DFE_APP_CAL_DPD_MODEL_TYPE_DPD_3 = 3, /*!< DPD model 3 */ + + ADI_ADRV904X_DFE_APP_CAL_DPD_MODEL_TYPE_CTC_0 = 4, /*!< CTC model 3 - Not supported currently*/ + ADI_ADRV904X_DFE_APP_CAL_DPD_MODEL_TYPE_CTC_1 = 5, /*!< CTC model 4 - Not supported currently*/ + ADI_ADRV904X_DFE_APP_CAL_DPD_MODEL_TYPE_CTC_2 = 6, /*!< CTC model 5 - Not supported currently*/ + ADI_ADRV904X_DFE_APP_CAL_DPD_MODEL_TYPE_CTC_3 = 7, /*!< CTC model 6 - Not supported currently*/ + ADI_ADRV904X_DFE_APP_CAL_DPD_MODEL_TYPE_CTC_4 = 8, /*!< CTC model 7 - Not supported currently*/ +} adi_adrv904x_DfeAppCalDpdModelType_e; + +/** + * \brief DPD models API size translation + */ +typedef uint8_t adi_adrv904x_DfeAppCalDpdModelType_t; + +/** + * \brief DPD Performance Metrics + */ +typedef enum adi_adrv904x_DfeAppCalDpdStability +{ + ADI_ADRV904X_DFE_APP_CAL_DPD_MEAN_TU_POWER = 0u, /*!< pre-DPD Tx power avergaed in one update duration */ + ADI_ADRV904X_DFE_APP_CAL_DPD_PEAK_TU_POWER, /*!< pre-DPD Tx power peaked in one update duration */ + ADI_ADRV904X_DFE_APP_CAL_DPD_MEAN_TX_POWER, /*!< post-DPD Tx power avergaed in one update duration */ + ADI_ADRV904X_DFE_APP_CAL_DPD_PEAK_TX_POWER, /*!< post-DPD Tx power peaked in one update duration */ + ADI_ADRV904X_DFE_APP_CAL_DPD_MEAN_ORX_POWER, /*!< ORx power avergaed in one update duration */ + ADI_ADRV904X_DFE_APP_CAL_DPD_PEAK_ORX_POWER, /*!< ORx power peaked in one update duration */ + ADI_ADRV904X_DFE_APP_CAL_DPD_SIGNAL_CHECK_LEN, /*!< Number of signal performance metric entries */ + ADI_ADRV904X_DFE_APP_CAL_DPD_DIRECT_EVM = ADI_ADRV904X_DFE_APP_CAL_DPD_SIGNAL_CHECK_LEN, /*!< direct EVM in one update duration */ + ADI_ADRV904X_DFE_APP_CAL_DPD_INDIRECT_EVM, /*!< indirect EVM in one update duration */ + ADI_ADRV904X_DFE_APP_CAL_DPD_INDIRECT_ERROR, /*!< indirect error in one capture duration */ + ADI_ADRV904X_DFE_APP_CAL_DPD_STABILITY_LEN, /*!< Number of performance metric entries */ +} adi_adrv904x_DfeAppCalDpdStability_e; + +#define ADI_ADRV904X_DFE_APP_CAL_DPD_SIGNAL_CHECK_BITS ((1u << ADI_ADRV904X_DFE_APP_CAL_DPD_SIGNAL_CHECK_LEN) - 1u) +#define ADI_ADRV904X_DFE_APP_CAL_DPD_EVM_CHECK_BITS (((1u << ADI_ADRV904X_DFE_APP_CAL_DPD_STABILITY_LEN) - 1u) - ADI_ADRV904X_DFE_APP_CAL_DPD_SIGNAL_CHECK_BITS) + + +/** + * \brief DPD Stability words + */ +typedef enum adi_adrv904x_DfeAppCalDpdStabilityWord +{ + ADI_ADRV904X_DFE_APP_CAL_DPD_ERR_WORD0 = 0u, /*!< Error status word 0 */ + ADI_ADRV904X_DFE_APP_CAL_DPD_PER_ERR_WORD0, /*!< Persistent error status word 0 */ + ADI_ADRV904X_DFE_APP_CAL_DPD_ERR_WORD1, /*!< Error status word 1 */ + ADI_ADRV904X_DFE_APP_CAL_DPD_PER_ERR_WORD1, /*!< Persistent error status word 1 */ + ADI_ADRV904X_DFE_APP_CAL_DPD_ERR_WORD_LEN, /*!< Number of error status words */ +} adi_adrv904x_DfeAppCalDpdStabilityWord_e; + +/** + * \brief DPD Recovery actions + */ +typedef enum adi_adrv904x_DfeAppCalDpdRecoveryAction +{ + ADI_ADRV904X_DFE_APP_CAL_DPD_SKIP_UPDATE = 0u, /*!< Skip DPD update */ + ADI_ADRV904X_DFE_APP_CAL_DPD_RESET_ALL_LUTS, /*!< DPD reset all LUTs */ + ADI_ADRV904X_DFE_APP_CAL_DPD_RESET_DYNAMIC_STATS, /*!< DPD reset dynamic stats */ + ADI_ADRV904X_DFE_APP_CAL_DPD_UNUSED0, /*!< Unused */ + ADI_ADRV904X_DFE_APP_CAL_DPD_SW_TO_R_TABLE, /*!< switch to R table (R is computed like M but with deltaP = 0) */ + ADI_ADRV904X_DFE_APP_CAL_DPD_RESET_FIRST_DPD, /*!< reset first DPD flag for fast DPD convergence */ + ADI_ADRV904X_DFE_APP_CAL_DPD_SW_TO_MIN_DIRECT_EVM, /*!< switch to minimum direct EVM table (need different min direct EVM tables for high and low power models) */ + ADI_ADRV904X_DFE_APP_CAL_DPD_LOG_FATAL_ERROR, /*!< Log fatal error for persistent error */ + ADI_ADRV904X_DFE_APP_CAL_DPD_RECOVERY_ACTION_LEN, /*!< Number of recovery actions */ +} adi_adrv904x_DfeAppCalDpdRecoveryAction_e; + +/** + * \brief BW detector state + */ +typedef enum +{ + ADI_ADRV904X_DFE_APP_CAL_DPD_BW_DET_LOW = 0u, /*!< state when BW metrics is greater than low BW threshold */ + ADI_ADRV904X_DFE_APP_CAL_DPD_BW_DET_INTER, /*!< state when BW metrics is less than low BW threshold but greater than high BW threshold */ + ADI_ADRV904X_DFE_APP_CAL_DPD_BW_DET_HIGH, /*!< state when BW metrics is less than high BW threshold (reliable path delay is aquired) */ +} adi_adrv904x_DfeAppCalDpdBwDetState_e; + +/** + * \brief DPD Stability bit configuration + */ +typedef struct adi_adrv904x_DfeAppCalDpdStabilityBitCfg +{ + uint16_t LTGT; /*!< LT (less than) or GT (greater than) */ + int16_t threshold0; /*!< Threshold 0 */ + int16_t threshold1; /*!< Threshold 1 */ + uint16_t persistentCnt; /*!< Persistent error count limit */ +} adi_adrv904x_DfeAppCalDpdStabilityBitCfg_t; + +/** + * \brief DPD Stability action configuration + */ +typedef struct adi_adrv904x_DfeAppCalDpdStabilityActCfg +{ + uint16_t mask; /*!< Error status word mask */ + uint16_t actionWord; /*!< DPD recovery action word */ +} adi_adrv904x_DfeAppCalDpdStabilityActCfg_t; + +/** + * \brief DPD Stability counters + */ +typedef struct adi_adrv904x_DfeAppCalDpdStabilityCntr +{ + uint32_t perErrCntr0[ADI_ADRV904X_DFE_APP_CAL_DPD_STABILITY_LEN]; /*!< Persistent error counter 0 */ + uint32_t perErrCntr1[ADI_ADRV904X_DFE_APP_CAL_DPD_STABILITY_LEN]; /*!< Persistent error counter 1 */ +} adi_adrv904x_DfeAppCalDpdStabilityCntr_t; + +/** + * \brief DPD Stability configuration + */ +typedef struct adi_adrv904x_DfeAppCalDpdStabilityCfg +{ + adi_adrv904x_DfeAppCalDpdStabilityBitCfg_t bit[ADI_ADRV904X_DFE_APP_CAL_DPD_STABILITY_LEN]; /*!< see adi_adrv904x_DfeAppCalDpdStabilityBitCfg_t */ + adi_adrv904x_DfeAppCalDpdStabilityActCfg_t error[ADI_ADRV904X_DFE_APP_CAL_DPD_ERR_WORD_LEN]; /*!< see adi_adrv904x_DfeAppCalDpdStabilityActCfg_t */ +} adi_adrv904x_DfeAppCalDpdStabilityCfg_t; + +/** + * \brief Structure to represent double complex number + * + */ +ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppCalDpdDblCpx +{ + double real; /*!< Real part of complex number */ + double imag; /*!< Imaginary part of complex number */ +} adi_adrv904x_DfeAppCalDpdDblCpx_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief DPD hardware adaptation engine configuration structure + * + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppCalDpdAdpCfg +{ + uint16_t numDpdSamples; /*!< Number of DPD samples */ + uint8_t featureFilterEn; /*!< Enable or disable feature filtering */ +} adi_adrv904x_DfeAppCalDpdAdpCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold parameters of DPD partial structure + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppCalDpdPartial +{ + adi_adrv904x_DfeAppCalDpdType_t partial; /*!< DPD or CTC1 */ + uint8_t updateOrder; /*!< Deprecated, not being used */ + uint8_t modelIndex; /*!< One of the GMP power models */ +} adi_adrv904x_DfeAppCalDpdPartial_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold parameters of a row of DPD model features + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppCalDpdAdpFeatureRow +{ + int8_t i; /*!< i - amplitude term */ + int8_t j; /*!< j - signal term */ + uint8_t k; /*!< k - power term */ + adi_adrv904x_DfeAppCalDpdActPolyType_t poly; /*!< polynomial selection */ + adi_adrv904x_DfeAppCalDpdDblCpx_t a; /*!< Complex coefficient of a row of features */ +} adi_adrv904x_DfeAppCalDpdAdpFeatureRow_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold parameters of CTC rcdkmj table and coefficients + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppCalCtcAdpFeatureRow +{ + uint8_t r; /*!< CIC decimation ratio */ + int16_t c; /*!< c_est Laguerre filter coefficient of a time constant */ + int16_t d; /*!< d_est Laguerre filter coefficient of a time constant */ + uint8_t k; /*!< power row of |x| of a time constant */ + uint8_t m; /*!< IIR column */ + uint8_t j; /*!< polynomial term of the IIR column output */ + adi_adrv904x_DfeAppCalDpdDblCpx_t a; /*!< Complex coefficient of a row of features */ +} adi_adrv904x_DfeAppCalCtcAdpFeatureRow_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold configuration parameters of the peak detect capture + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppCalDpdCapturePeakDetCfg +{ + uint32_t windowLength; /*!< Peak search window length */ +} adi_adrv904x_DfeAppCalDpdCapturePeakDetCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold parameters of DPD model descriptor. It's used to + * describe the DPD model and retrieve the high/low power coefficients. + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppCalDpdModelDesc +{ + uint16_t features; /*!< number of features defined in a model */ + adi_adrv904x_DfeAppCalDpdPartial_t dpdPartial; /*!< DPD partial */ + adi_adrv904x_DfeSvcDfeActuatorGmpDdrMode_t mode; /*!< GMP+DDR mode */ + adi_adrv904x_DfeAppCalDpdActDepth_t actDepth; /*!< depth of LUT 0: 64 deep 1: 32 deep 2: 16 deep */ + uint8_t linearTerm; /*!< Linear term (off-diagonal << 4 | linear term (sample offset) value) */ + uint8_t lutIDelay; /*!< LUT i delay (GMP1 LUT I << 4 | GMP0 starting LUT I) */ + uint8_t lutJDelay; /*!< LUT j delay (GMP1 LUT J << 4 | GMP0 starting LUT J) */ + adi_adrv904x_DfeAppCalDpdAdpFeatureRow_t feature[ADI_ADRV904X_DFE_APP_CAL_DPD_MAX_NUM_FEATURES]; /*!< GMP+DDR mixed model description */ +} adi_adrv904x_DfeAppCalDpdModelDesc_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold parameters of CTC model descriptor. It's used to + * describe the CTC model and retrieve the feature coefficients. + * NOTE: This model isn't supported currently + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppCalCtcModelDesc +{ + uint8_t features; /*!< number of features defined in a model */ + adi_adrv904x_DfeAppCalDpdPartial_t ctcPartial; /*!< CTC partial */ + float kLutAddrScale; /*!< kLut address scale */ + float fLutAddrScale; /*!< fLut address scale */ + adi_adrv904x_DfeAppCalCtcAdpFeatureRow_t feature[255]; /*!< CTC model description */ +} adi_adrv904x_DfeAppCalCtcModelDesc_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold DPD power meter configuration parameters + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppCalDpdPowerMeterCfg +{ + uint8_t dpdInOutGainMonitorEn; /*!< Gain Monitor is enabled */ + int32_t dpdInOutQualLim; /*!< Qualifying Threshold Limit(the resolution is 1/100 dB) */ + int32_t dpdInOutMinGainLim; /*!< Minimum Gain Threshold Limit(the resolution is 1/100 dB) */ + int32_t dpdInOutMaxGainLim; /*!< Maximum Gain Threshold Limit(the resolution is 1/100 dB) */ + uint8_t modelTableForMinGainLim; /*!< user specified model (1, 2 or 4=unity) for a gain under-range threshold violation */ + uint8_t modelTableForMaxGainLim; /*!< user specified model (1, 2 or 4=unity) for a gain over-range threshold violation */ + uint8_t dpdInOutPwrMeasDuration; /*!< Power measurement duration */ + uint16_t dpdInOutPwrMeasContDlyCntr; /*!< Wait before continuing with power measurement after txon */ + uint8_t dpdInOutPwrMeasEn; /*!< Enable Tx power measurement */ + uint8_t dpdInOutPwrMeasPause; /*!< Pause Tx power measurement */ + uint8_t dpdInOutPwrMeasTDDModeEn; /*!< run power measurement in TDD mode */ +} adi_adrv904x_DfeAppCalDpdPowerMeterCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold DPD capture configuration parameters + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppCalDpdCaptureCfg +{ + adi_adrv904x_DfeAppCalDpdCapturePeakDetCfg_t capPeakDetCfg; /*!< Capture: peak detector configuration */ +} adi_adrv904x_DfeAppCalDpdCaptureCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to configure BW detector + * + */ + ADI_ADRV904X_PACK_START +typedef struct +{ + uint8_t bwDetEn; /*!< enable (1) or disable (0) BW detector */ + uint16_t corrLagMax; /*!< maximum lag evaluated by autocorrelations in BW detecor */ + float loBwBeta2Thres; /*!< threshold (<1) for narrowband signals not suitable for path delay estimate */ + float hiBwBeta2Thres; /*!< threshold (<1) for wideband signals suitable for path delay estimate */ + float alphaTrack; /*!< leaky filter alpha for tracking path delay estimate over long time */ +} adi_adrv904x_DfeAppCalDpdBwDetCfg_t; +ADI_ADRV904X_PACK_FINISH + + +/** + * \brief DPD tracking calibration configuration structure + * + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppCalDpdTrackCfg +{ + adi_adrv904x_DfeAppCalDpdAdpCfg_t adapt; /*!< Adapt: adaptation engine configuration */ + uint8_t runClgc; /*!< Run (if 1) CLGC or not (if 0) before DPD */ + int16_t filterCoef[ADI_ADRV904X_DFE_APP_CAL_DPD_MAX_NUM_COEFFICIENTS]; /*!< Adapt: feature filter coefficient buffer (symmetric upto 32 complex pairs) */ + adi_adrv904x_DfeAppCalDpdUpdateMode_t updateMode; /*!< Dynamics: 0: SU, 1: SUMO, 2: CMT 2 model update mode, 3: CMT 3 model update mode*/ + int32_t mThresholdDB; /*!< Dynamics: SUMO/CMT M table threshold in dBFs * 100 (default -2100) */ + uint8_t forceDirect; /*!< Learning mode: force to use direct learning */ + uint8_t indirectRegValue[ADI_ADRV904X_DFE_APP_CAL_DPD_GMP_POWER_MODELS]; /*!< Learning mode: Tikhonov regularization value added to diagonal of correlation matrix for indriect learning (M/C0/C1) */ + uint8_t directRegValue; /*!< Learning mode: Tikhonov regularization value added to diagonal of correlation matrix for direct learning */ + uint8_t mu; /*!< Learning mode: direct learning step size from 0 to 100, will be divided by 100 */ + uint8_t lowPowerActionModel; /*!< Robustness: on violation of tx/orx low power threshold, which model to select: 1, 2, or 4 (unity) */ + uint8_t lutResolution; /*!< Robustness: Three (outshift, lutscale) options 0: (9, 8192), 1: (10, 4096), 2: (11, 2048) */ + uint32_t numberOfMultiFrames; /*!< This parameter configures the number of multiframes that Radio Sequencer capture pattern will run for. Length of each multiframe can be adjusted with 'ssb_period_in_ms' parameter in device profile.In RCI mode this parameter is a 'Don't Care' and needs to be set to 1. + * Default value used by FW is 1(default tracking cal configuration in DFE FW). Range [1-600] */ + uint32_t ctc1StatsSampleNum; /*!< ctc1: Number of samples for ctc1 statistics */ + uint8_t ctc1ManualEnabled; /*!< ctc1: To enable manual selection of peak rank ratios*/ + uint8_t ctc1DeltaPercentage; /*!< ctc1: Delta percentage which specifies the range of peak power measurements acceptable for a capture (Manual Mode) */ + uint8_t ctc1PeakRankRatio[ADI_ADRV904X_DFE_APP_CAL_CTC1_MAX_PEAK_RANK_RATIO_NUM]; /*!< ctc1: Peak rank ratios (Manual mode) */ + uint8_t ctc1CaptureWeighting[ADI_ADRV904X_DFE_APP_CAL_CTC1_MAX_PEAK_RANK_RATIO_NUM]; /*!< ctc1: Capture weights for peak rank ratios (Manual mode) */ + uint8_t wbRegEnable; /*!< Enable wideband regularization for maintaining in-band gain flatness */ + uint8_t wbRegMode; /*!< 0: same wideband data for all channels, 1: Two set of wideband data (one set per chip side) */ + float wbRegAlpha; /*!< alpha, the scaling factor for features computed using captured samples, shall be within [0, 1] */ + float wbRegBeta; /*!< beta, the scaling factor for features computed using wideband training samples, shall be within [0, 1] */ + uint16_t estSizeOfCoefBias; /*!< To estimate the bias of the delta coefficient of a DPD feature in direct learning mode */ + uint8_t useLegacyGainPhaseComp; /*!< Fall back to legacy gain and phase compensation if it's 1 */ + adi_adrv904x_DfeAppCalDpdBwDetCfg_t bwDetCfg; /*!< BW detctor configuration */ + int32_t cThresholdDB; /*!< Dynamics: SUMO/CMT C table threshold, the unit is dBFs * 100. Only used for ADI_ADRV904X_DFE_APP_CAL_DPD_UPDATE_MODE_CMT_3_MODEL. */ + uint16_t thresholdOverlapDB; /*!< Dynamics: CMT: When power is within this value of a threshold, the adjacent model will be updated with same coefficients + * (if it has not been adapted before), the unit is dBFs * 100. Only used for ADI_ADRV904X_DFE_APP_CAL_DPD_UPDATE_MODE_CMT_3_MODEL. + */ +} adi_adrv904x_DfeAppCalDpdTrackCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Enumerated list of options to reset Tx DPD module + */ +typedef enum adi_adrv904x_DfeAppDpdResetMode +{ + ADI_ADRV904X_DFE_APP_DPD_RESET_FULL = 1 /*!< Resets the DPD hardware and the firmware */ +} adi_adrv904x_DfeAppDpdResetMode_e; + +/** + * \brief Data structure to hold parameters of DPD path delay status + * + * This structure is only a part of complete DPD path delay data. + */ +ADI_ADRV904X_PACK_START +typedef struct +{ + int32_t intActDelay; /*!< Integer Actuator Delay between post-DPD and pre-DPD at actuator rate */ + int32_t intExtDelay; /*!< Integer External Delay between ORx and post-DPD at capture rate */ + int32_t fracExtDelay; /*!< Fractional External Delay between ORx and post-DPD */ +} adi_adrv904x_DfeAppCalDpdPathDlyStatus_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold seeds of DPD path delay + * + */ + ADI_ADRV904X_PACK_START +typedef struct +{ + adi_adrv904x_DfeAppCalDpdPathDlyStatus_t seed; /*!< pathdelay seed */ + int32_t optSearchEnable; /*!< enable optimum searching in seeded mode */ + int32_t qualifyRange; /*!< Integer range between seeded pathdelay and estimated pathdelay to qualify the estimated pathdelay */ +} adi_adrv904x_DfeAppCalDpdPathDlySeed_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to configure BW detector + * + */ + ADI_ADRV904X_PACK_START +typedef struct +{ + float beta2Curr; /*!< BW metrics beta2 of current iteration */ + float beta2Prev; /*!< BW metrics beta2 of previous iteration */ + float beta2Min; /*!< minimum BW metrics beta2 since reset */ + float beta2Max; /*!< maximum BW metrics beta2 since reset */ + double extDelayTrack; /*!< total external path delay tracked in fractional unit */ + uint8_t bwDetStateCurr; /*!< one of those in adi_adrv904x_DfeAppCalDpdBwDetState_e */ + uint8_t bwDetStateBest; /*!< one of those in adi_adrv904x_DfeAppCalDpdBwDetState_e with widest BW detected */ +} adi_adrv904x_DfeAppCalDpdBwDetStatus_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold parameters of DPD status + * + * This structure is only a part of complete DPD status. + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppCalDpdStatus +{ + adi_adrv904x_CalStatus_t hdr; /*!< cal status header */ + adi_adrv904x_DfeAppCalDpdPathDlyStatus_t dpdPathDlyStatus; /*!< pathdelay status */ + adi_adrv904x_DfeSvcDfeActuatorSaturation_t dfeActSatStatus; /*!< actuator satuaration status */ + uint32_t powerM[ADI_ADRV904X_DFE_APP_CAL_DPD_MAX_NUM_PARTIAL_GRP]; /*!< SUMO/CMT M table power */ + uint32_t txPower; /*!< SUMO/CMT Capture Tx power */ + uint32_t activeModel; /*!< the active model table */ + uint32_t updatedModel; /*!< the latest updated GMP model */ + uint32_t powerR; /*!< Stability R table power */ + float stability[ADI_ADRV904X_DFE_APP_CAL_DPD_STABILITY_LEN]; /*!< stats for stability improvement/enhancement */ + uint16_t errStatWord[ADI_ADRV904X_DFE_APP_CAL_DPD_ERR_WORD_LEN]; /*!< Error status word for DPD recovery action(s) */ + uint16_t actionWord[ADI_ADRV904X_DFE_APP_CAL_DPD_ERR_WORD_LEN]; /*!< Stability recovery action word */ + uint32_t capStartRetryCount; /*!< capture retries due to start error */ + uint32_t capAbortRetryCount; /*!< capture retries due to abort (e.g. mapping changes) */ + uint32_t capInvalidRetryCount; /*!< capture retries due to invalid/incomplete capture */ + uint32_t maxFracEstErrorCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_MAX_FRAC_EST_CNT_ERROR */ + uint32_t cholSolverErrorCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_CHOL_SOLVER_ERROR */ + uint32_t appExitRequestCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_CPU_CAL_EXIT_OCCURRED_ERROR */ + uint32_t lutEntrySatErrorCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_ACT_LUT_ENTRY_SAT_ERROR */ + uint32_t stabilityErrorCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_STABILITY_ERROR */ + uint32_t lowPowerErrorCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_TX_TOO_LOW_ERROR, ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_ORX_TOO_LOW_ERROR and ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_POST_DPD_TX_TOO_LOW_ERROR */ + uint32_t highPowerErrorCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_TX_TOO_HIGH_ERROR, ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_ORX_TOO_HIGH_ERROR and ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_POST_DPD_TX_TOO_HIGH_ERROR */ + uint32_t saturationErrorCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_TX_SATURATING_ERROR, ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_ORX_SATURATING_ERROR and ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_POST_DPD_TX_SATURATING_ERROR */ + uint32_t lowPeakErrorCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_TX_PEAK_TOO_LOW_ERROR, ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_ORX_PEAK_TOO_LOW_ERROR and ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_POST_DPD_TX_PEAK_TOO_LOW_ERROR */ + uint32_t capAbortErrorCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_ABORTED_CAPTURE */ + uint32_t pathDelayErrorCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_PATHDELAY_LAG_RANGE_ERROR */ + uint32_t capInvalidErrorCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_BAD_CAPTURE_DATA and ADI_ADRV904X_DFE_APP_ERR_CODE_DPD_INCOMPLETE_CAPTURE */ + uint64_t lutSaturationMask[ADI_ADRV904X_DFE_APP_CAL_DPD_GMP_POWER_MODELS]; /*!< bit mask for saturated luts. index[0]: DPD_MODEL_TYPE_DPD_0, index[1]: DPD_MODEL_TYPE_DPD_1, index[2]: DPD_MODEL_TYPE_DPD_2, index[3]: DPD_MODEL_TYPE_DPD_3 */ + uint32_t noLutUpdateCount; /*!< count for when no LUT update happens (because TX is too low, or below powerM in update mode 1) */ + uint32_t noFlutUpdateCount; /*!< count for when CTC2 model isn't updated due to an error during adaptation */ + uint32_t capStartErrorCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_CAPTURE_BUF_NO_INSTANCE_ERROR */ + uint32_t periodEndedErrorCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_CAPTURE_PERIOD_ENDED_BEFORE_CAPTURES */ + uint32_t lutUpdDmaNotTrigCount; /*!< count for ADI_ADRV904X_DFE_APP_ERR_CODE_TDD_LUT_COPY_SDK_DMA_NOT_TRIGGERED */ + uint64_t ctc1UpThresVals[EDPD_MAX_NUM_CAP_BATCHES]; /*!< Upper-Thresholds for the Peak Value in Stops on pass captures (ctc1 mode) */ + uint64_t ctc1LowThresVals[EDPD_MAX_NUM_CAP_BATCHES]; /*!< Lower-Thresholds for the Peak Value in Stops on pass captures (ctc1 mode) */ + uint64_t ctc1MaxPeakVal; /*!< Maximum Peak Value after capturing signal statistics */ + uint64_t ctc1MinPeakVal; /*!< Minimum Peak Value after capturing signal statistics */ + adi_adrv904x_DfeAppCalDpdBwDetStatus_t bwDetStatus; /*!< BW detector state and stats */ + uint8_t learningModeCurr; /*!< 0: indirect learning update, 1: direct learning update */ + uint32_t powerC[ADI_ADRV904X_DFE_APP_CAL_DPD_MAX_NUM_PARTIAL_GRP]; /*!< SUMO/CMT C table power. Only used for ADI_ADRV904X_DFE_APP_CAL_DPD_UPDATE_MODE_CMT_3_MODEL. */ + uint8_t copiedModelMask; /*!< Mask of models that were copied if Tx power was near M or C threshold. Only used for ADI_ADRV904X_DFE_APP_CAL_DPD_UPDATE_MODE_CMT_3_MODEL. */ +} adi_adrv904x_DfeAppCalDpdStatus_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold DPD capture data for each channel. + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppDpdCaptureDataRow +{ + int16_t dpdCaptureDataI[ADI_ADRV904X_DFE_APP_CAL_DPD_CAPTURE_SAMPLES_NUM]; /*!< Array consisting of I samples of DPD capture data */ + int16_t dpdCaptureDataQ[ADI_ADRV904X_DFE_APP_CAL_DPD_CAPTURE_SAMPLES_NUM]; /*!< Array consisting of Q samples of DPD capture data */ + uint16_t dpdCaptureSampleArrSize; /*!< Number of valid I/Q samples */ +} adi_adrv904x_DfeAppDpdCaptureDataRow_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold DPD capture data for channel Tx, TxAlt and ORx. + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppDpdCaptureData +{ + adi_adrv904x_DfeAppDpdCaptureDataRow_t txCaptureData; /*!< Tx capture data for DPD adaptation. */ + adi_adrv904x_DfeAppDpdCaptureDataRow_t txAltCaptureData; /*!< Tx alternate capture data for DPD adaptation. The data captured can be either pre-DPD/post-DPD actuator or pre CFR data */ + adi_adrv904x_DfeAppDpdCaptureDataRow_t orxCaptureData; /*!< ORx capture data for DPD adaptation */ +} adi_adrv904x_DfeAppDpdCaptureData_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold WB Regularization information + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppwbRegularization +{ + uint64_t wbRegStartAddress; /*!< start address for wb regularization buffer */ + uint32_t wbRegBufferSize; /*!< size of wb regularization buffer */ +} adi_adrv904x_DfeAppwbRegularization_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold configuration parameters, which will be shared by api side and fw side. + * this structure support actuator tdd lut switch + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppDpdActTddLutSwitch +{ + uint8_t txOnMdl1SwitchEn; /*!< enable automatic switching of dpd mode after txon */ + uint8_t txOnMdl0SwitchEn; /*!< enable automatic switching of dpd mode after txon */ + uint32_t txOnMdlSwitchDlyCnt; /*!< time duration for switching of dpd mode after tx on */ + uint32_t capDelay[ADI_ADRV904X_DFE_APP_CAL_DPD_TDD_LUT_SWITCH_CAP_NUM]; /*!< capture delay for model0 */ +}adi_adrv904x_DfeAppDpdActTddLutSwitch_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold WB Regularization data array + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppwbRegData +{ + uint16_t wbRegData[16384]; /*!< wb regularization buffer/array */ +} adi_adrv904x_DfeAppwbRegData_t; +ADI_ADRV904X_PACK_FINISH + + +#endif /* ADRV904X_DFE_CAL_DPD_TYPES_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cal_vswr_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cal_vswr_types.h new file mode 100644 index 00000000000..43b01255cbf --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cal_vswr_types.h @@ -0,0 +1,122 @@ +/** + * Copyright 2015 - 2023 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adi_adrv904x_dfe_cal_vswr_types.h + * + * \brief Contains ADRV904X data types for on board dfe vswr feature + * + * ADRV904X API Version: 2.10.0.4 + */ + + +#ifndef ADRV904X_DFE_CAL_VSWR_TYPES_H__ +#define ADRV904X_DFE_CAL_VSWR_TYPES_H__ + +#include +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_cals_structs.h" + +/** + * \brief VSWR Ctrl command mask + */ +#define ADI_ADRV904X_DFE_APP_CAL_VSWR_CTRL_COMMAND_MASK 0x0Fu + +/** + * \brief Flag to distinguish between set and get Ctrl commands + */ +#define ADI_ADRV904X_DFE_APP_CAL_VSWR_CTRL_SET_FLAG 0x10u + +/** + * \brief Number of reflections to report status on + */ +#define ADI_ADRV904X_DFE_APP_CAL_VSWR_NUM_REFLECTIONS 3u + + +/** + * \brief Enumerated list of options of VSWR Ctrl command + */ +typedef enum adi_adrv904x_DfeAppCalVswrCtrlCmd +{ + ADI_ADRV904X_DFE_APP_CAL_VSWR_CTRL_CONFIG, /*!< Set/get VSWR config */ + ADI_ADRV904X_DFE_APP_CAL_VSWR_CTRL_RESET, /*!< Reset VSWR */ +} adi_adrv904x_DfeAppCalVswrCtrlCmd_e; + +/** + * \brief Data structure to configure an alarm + */ +ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppCalVswrAlarmCfg +{ + int32_t thresholdmdB; /*!< Return loss values above this are considered */ + uint8_t iterWindow; /*!< This is the number of iterations from which the return loss will be considered (0 disables alarm, max is 64) */ + uint8_t iterThresholdCount; /*!< If the return loss is above the threshold for this many times in the window, it is an alarm condition */ +} adi_adrv904x_DfeAppCalVswrAlarmCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold VSWR configuration parameters + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppCalVswrCfg +{ + uint32_t accumNumIter; /*!< Number of accumulations in each capture */ + int32_t returnLossThreshmdB; /*!< Upper threshold of reported reflections in milli dB */ + int32_t reversePathOffsetmdB; /*!< Offset applied to reverse path gain before calculating return loss */ + adi_adrv904x_DfeAppCalVswrAlarmCfg_t minorAlarm; /*!< Minor alarm configuration - increments status counter */ + adi_adrv904x_DfeAppCalVswrAlarmCfg_t majorAlarm; /*!< Major alarm configuration - increments status counter and raises GP Int. Cleared by resetting VSWR. */ +} adi_adrv904x_DfeAppCalVswrCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold return loss info for a reflection. Only valid when delay values are non 0. + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppCalVswrReflection +{ + int32_t returnLossmdB; /*!< Return loss in milli dB (positive value means observed gain is higher in forward dir) */ + uint16_t sampleDelay; /*!< Reflection delay in ORx samples from VSWR playback signal injection point to ORx */ + uint8_t fractionalDelay; /*!< Fractional (1/64) sample path delay to be added to above */ +} adi_adrv904x_DfeAppCalVswrReflection_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold VSWR status values + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppCalVswrStatus +{ + adi_adrv904x_CalStatus_t hdr; /*!< Common cal status header */ + + adi_adrv904x_DfeAppCalVswrReflection_t reflection[ADI_ADRV904X_DFE_APP_CAL_VSWR_NUM_REFLECTIONS]; /*!< Reflection coefficients */ + uint16_t fwdSampleDelay; /*!< Forward path delay in ORx samples from VSWR playback signal injection point to ORx */ + uint8_t fwdFractionalDelay; /*!< Fractional (1/64) sample path delay to be added to above */ + int32_t fwdGainmdB; /*!< Forward path gain in milli dB */ + uint64_t fwdCaptureTimeStamp_us; /*!< Timestamp of forward capture */ + uint64_t revCaptureTimeStamp_us; /*!< Timestamp of reverse capture */ + int32_t fwdCapturePowermdB; /*!< Average power in forward accumulated capture (milli-dbFS) */ + int32_t revCapturePowermdB; /*!< Average power in reverse accumulated capture (milli-dbFS) */ + int32_t txPlaybackPowermdB; /*!< Average power in Tx playback waveform (milli-dbFS) */ + uint16_t captureAccumLength; /*!< Length in ORx samples of each accumulation */ + + uint32_t calExitRequestCount; /*!< Count for ADI_ADRV904X_DFE_APP_ERR_CODE_CPU_CAL_EXIT_OCCURRED_ERROR */ + uint32_t capStartRetryCount; /*!< Capture retries due to start error */ + uint32_t capAbortRetryCount; /*!< Capture retries due to abort (e.g. mapping changes) */ + uint32_t capInvalidRetryCount; /*!< Capture retries due to invalid/incomplete capture */ + uint32_t capAbortErrorCount; /*!< Count for ADI_ADRV904X_DFE_APP_ERR_CODE_VSWR_ABORTED_CAPTURE */ + uint32_t capInvalidErrorCount; /*!< Count for ADI_ADRV904X_DFE_APP_ERR_CODE_VSWR_INCOMPLETE_CAPTURE */ + uint32_t capStartErrorCount; /*!< Count for ADI_ADRV904X_DFE_APP_ERR_CODE_CAPTURE_BUF_NO_INSTANCE_ERROR */ + uint32_t periodEndedErrorCount; /*!< Count for ADI_ADRV904X_DFE_APP_ERR_CODE_CAPTURE_PERIOD_ENDED_BEFORE_CAPTURES */ + uint32_t txAttenChangeCount; /*!< Count for ADI_ADRV904X_DFE_APP_ERR_CODE_VSWR_TX_ATTEN_CHANGED */ + uint32_t fwdPathUnstableCount; /*!< Count for ADI_ADRV904X_DFE_APP_ERR_CODE_VSWR_FWD_PATH_UNSTABLE */ + uint32_t minorAlarmCount; /*!< Count of minor alarms */ + uint32_t majorAlarmCount; /*!< Count of major alarms */ +} adi_adrv904x_DfeAppCalVswrStatus_t; +ADI_ADRV904X_PACK_FINISH + +#endif /* ADRV904X_DFE_CAL_VSWR_TYPES_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cfr.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cfr.h new file mode 100644 index 00000000000..def8a6c2f6a --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cfr.h @@ -0,0 +1,483 @@ +/** +* Copyright 2015 - 2022 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_dfe_cfr.h +* \brief Contains ADRV904X CFR function prototypes for +* adi_adrv904x_dfe_cfr.c +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#ifndef _ADI_ADRV904X_DFE_CFR_H_ +#define _ADI_ADRV904X_DFE_CFR_H_ + +#include "adi_adrv904x_dfe_cfr_types.h" +#include "adi_adrv904x_error.h" +#include "adi_common_error_types.h" + + + +/** +* \brief Configures Cfr thresholds. +* +* \pre This function is called after the device has been initialized. User can configure threshold +* for selected configuration set/s. It's users responsibility not to change the thresholds of active +* configuration set during runtime. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] cfrThrConfig - Pointer to threshold configuration data structure to be applied selected Tx channels +* Same configuration will be applied to all 3 engines +* \param[in] cfrTxChannelMask - One or multiple Tx channel selection to apply threshold configuration +* \param[in] configSelectMask - Config set 0/1 selection. adi_adrv904x_CfrConfig_e can be used to create this mask +* User can select multiple configurations +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrThresholdSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CfrThrConfig_t* const cfrThrConfig, + const uint32_t cfrTxChannelMask, + const uint32_t configSelectMask); + +/** +* \brief Read Cfr thresholds from device structure +* +* \pre This function is called after the device has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[out] cfrThrConfig - Pointer to Threshold configuration data structure to read from selected Tx channel +* \param[in] cfrTxChannelSel - Tx channel selection to read CFR thresholds. Only one Tx channel should be selected +* \param[in] configSelect - Config set 0/1 selection. adi_adrv904x_CfrConfig_e can be used to select configuration. +* Only one configuration should be selected. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrThresholdGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_CfrThrConfig_t* const cfrThrConfig, + const uint32_t cfrTxChannelSel, + const uint32_t configSelect); + + +/** +* \brief Configures Cfr engine enable/bypass settings +* +* \pre This function is called after the device has been initialized. User can configure engine enable/bypass +* for selected configuration set/s. It's users responsibility not to change the active +* configuration set during runtime. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] cfrEngineEnable - Pointer to cfr engine enable configuration for each engine. 1:Enable//0:Disable +* \param[in] cfrEngineBypass - Pointer to cfr bypass configuration for each engine. 1:Bypass//0:Don't bypass +* \param[in] arraySize - Number of elements in cfrEngineEnable and cfrEngineBypass arrays. Typically needs to +* be set to 3 to configure all engines +* \param[in] cfrTxChannelMask - One or multiple Tx channel selection to apply enable/bypass configuration +* \param[in] configSelectMask - Config set 0/1 selection. adi_adrv904x_CfrConfig_e can be used to create this mask +* User can select multiple configurations +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrEnableSet(adi_adrv904x_Device_t* const device, + const uint32_t cfrEngineEnable[], + const uint32_t cfrEngineBypass[], + const uint32_t arraySize, + const uint32_t cfrTxChannelMask, + const uint32_t configSelectMask); + +/** +* \brief Reads Cfr engine enable/bypass settings +* +* \pre This function is called after the device has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in, out] cfrEngineEnable - Pointer to readback cfr engine enable configuration for each engine. 1:Enable//0:Disable +* \param[in, out] cfrEngineBypass - Pointer to readback cfr bypass configuration for each engine. 1:Bypass//0:Don't bypass +* \param[in] arraySize - Number of elements in cfrEngineEnable and cfrEngineBypass arrays. Typically needs to +* be set to 3 to configure all engines +* \param[in] cfrTxChannelSel - Tx channel selection to read CFR thresholds. Only one Tx channel should be selected +* \param[in] configSelect - Config set 0/1 selection. adi_adrv904x_CfrConfig_e can be used to select configuration. +* Only one configuration should be selected. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrEnableGet(adi_adrv904x_Device_t* const device, + uint32_t cfrEngineEnable[], + uint32_t cfrEngineBypass[], + const uint32_t arraySize, + const uint32_t cfrTxChannelSel, + const uint32_t configSelect); + +/** +* \brief Configures Cfr configuration for selected channel/s and config/s +* +* \pre This function is called after the device has been initialized. User can configure CFR settings +* for selected configuration set/s. It's users responsibility not to change the active +* configuration set during runtime. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] cfrCtrlConfig - Pointer to cfr configuration struct to be applied +* \param[in] cfrTxChannelMask - One or multiple Tx channel selection to apply the configuration +* \param[in] configSelectMask - Config set 0/1 selection. adi_adrv904x_CfrConfig_e can be used to create this mask +* User can select multiple configurations +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrConfigSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CfrConfig_t* const cfrCtrlConfig, + const uint32_t cfrTxChannelMask, + const uint32_t configSelectMask); + +/** +* \brief Reads Cfr configuration from device +* +* \pre This function is called after the device has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[out] cfrCtrlConfig - Pointer to readback CFR configuration from selected channel and config set +* \param[in] cfrTxChannelSel - Tx channel selection to read CFR thresholds. Only one Tx channel should be selected +* \param[in] configSelect - Config set 0/1 selection. adi_adrv904x_CfrConfig_e can be used to select configuration. +* Only one configuration should be selected. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrConfigGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_CfrConfig_t* const cfrCtrlConfig, + const uint32_t cfrTxChannelSel, + const uint32_t configSelect); + +/** +* \brief Selects the active Cfr configuration set +* +* \pre This function is called after the device has been initialized. CFR HW has 2 sets of configurations, +* which can be writting with adi_adrv904x_CfrConfigSet, adi_adrv904x_CfrEnableSet and adi_adrv904x_CfrThresholdSet +* APIs. User can switch between these 2 config sets by using this function. If immediate update option is selected, +* API switches to selected config set immediately. Otherwise this function triggers a stream which will switch to +* desired configuration on next carrier reconfiguration. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] cfrTxChannelMask - One or multiple Tx channel selection to apply enable/bypass configuration +* \param[in] configSelect - Config set 0/1 selection. +* \param[in] immediateUpdate - 0:Change configuration on first carrier reconfig command, 1:Immediately, 2:Next Tx fall/raise edge +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrActiveCfgSet(adi_adrv904x_Device_t* const device, + const uint32_t cfrTxChannelMask, + const adi_adrv904x_CfrConfigSel_e configSelect, + const uint8_t immediateUpdate); + +/** +* \brief Reads the active Cfr configuration set +* +* \pre This function is called after the device has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] txChannelSel - Tx channel selection to read active configuration +* \param[out] configSelectRead - Pointer to readback active configuration set +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrActiveCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannelSel, + adi_adrv904x_CfrConfigSel_e* const configSelectRead); + +/** +* \brief Selects the active Cfr configuration set +* +* \pre This function is called after the device has been initialized. CFR HW can store 2 pulses, +* User can switch between these 2 pulses by using this function. If immediate update option is selected, +* API switches to selected pulse immediately. Otherwise this function triggers a stream which will switch to +* desired configuration on next carrier reconfiguration. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] cfrTxChannelMask - One or multiple Tx channel selection to apply enable/bypass configuration +* \param[in] pulseSelect - Pulse slection to be used by CFR engine +* \param[in] immediateUpdate - 1:Immediate Update, 0:Change pulse on first carrier reconfig command +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrActivePulseSet(adi_adrv904x_Device_t* const device, + const uint32_t cfrTxChannelMask, + const adi_adrv904x_CfrPulseSel_e pulseSelect, + const uint8_t immediateUpdate); + +/** +* \brief Reads the active Cfr pulse +* +* \pre This function is called after the device has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] txChannelSel - Tx channel selection to read active pulse +* \param[out] pulseSelectRead - Pointer to readback pulse +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrActivePulseGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannelSel, + adi_adrv904x_CfrPulseSel_e* const pulseSelectRead); + +/** +* \brief Configures Cfr statistics configuration for selected channel/s +* +* \pre This function is called after the device has been initialized. User can configure CFR statistics +* for multiple channels at the same time. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] cfrStatisticsConfig - Pointer to cfr statistics struct to be applied +* \param[in] cfrTxChannelMask - One or multiple Tx channel selection to apply statistics config +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrStatisticsCfgSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CfrStatisticsCfg_t* const cfrStatisticsConfig, + const uint32_t cfrTxChannelMask); + + +/** +* \brief Read Cfr statistics configuration of selected channel +* +* \pre This function is called after the device has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[out] cfrStatisticsConfig - Pointer to cfr statistics cfg readback struct +* \param[in] cfrTxChannelSel - Tx channel selection to read CFR statistics configuration +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrStatisticsCfgGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_CfrStatisticsCfg_t* const cfrStatisticsConfig, + const uint32_t cfrTxChannelSel); + +/** +* \brief Read Cfr statistics of selected channel +* +* \pre This function is called after the device has been initialized. When windowed statistics enabled, +* (i.e. adi_adrv904x_CfrStatisticsCfg_t->windowEn), user can select reaading either previous or current window +* to read latest statistics. In this mode, HW updates the previous window statistics when current window expires +* and clears the current window. When windowed statistics disabled, user should always read the current window +* statistics as HW doesn't update the previous window. If clearing statistics upon reading is set, the current window statistics +* (peak counters): +* - will be cleared immediately if CFR engines are enabled and not bypassed; +* - will not be cleared if CFR engines are disabled and not bypassed; +* +* Note: +* Bypassing CFR engines will disable CFR engines' clock. In this case, clearing statistics is not working ! +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[out] cfrStatistics - Pointer to cfr statistics readback +* \param[in] cfrTxChannelSel - Tx channel selection to read CFR statistics +* \param[in] prevWindow - 1:Read statistics of previous window // 0: Read statistics of current window +* \param[in] clearStats - 1:Clear statistics upon reading(will clear both cur and prev windows) // 0: Don't clear +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrStatisticsGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_CfrStatistics_t* const cfrStatistics, + const adi_adrv904x_TxChannels_e cfrTxChannelSel, + const uint8_t prevWindow, + const uint8_t clearStats); + + +/** +* \brief Writes CFR final correction pulse +* +* \pre This function is called after the device has been initialized. User can select one or multiple +* Tx channels to write the pulse data. The real part of the correction pulse should be even symmetric +* and the imaginary part of the correction pulse should be odd symmetric. User should always write the +* half of the final pulse data skipping the center tap of the pulse which will always be (32767 + 0j). +* User can select one or multiple pulse selections to write the pulse data. +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] cfrTxChannelMask - One or multiple Tx channel selection to write correction pulse +* \param[in] cfrCorrectionPulses - Array of correction pulses to be written +* \param[in] numCorrectionPulses - Number of correction pulses in cfrCorrectionPulses array +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrCorrectionPulseWrite(adi_adrv904x_Device_t* const device, + const uint32_t cfrTxChannelMask, + const adi_adrv904x_CfrCorrectionPulse_t cfrCorrectionPulses[], + const uint32_t numCorrectionPulses); + +/** +* \brief Reads CFR final correction pulse from selected Tx channel. This +* function reads pulse data from RAM0 since all RAM banks are expected to +* store the same pulse data +* +* \pre This function is called after the device has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] cfrTxChannelSel - Tx channel selection to read pulse data +* \param[in, out] cfrCorrectionPulse - Pointer to readback CFR correction pulse +* \param[in] pulseSelect - Pulse selection to read +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrCorrectionPulseRead(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e cfrTxChannelSel, + adi_adrv904x_CfrCorrectionPulse_t* const cfrCorrectionPulse, + const adi_adrv904x_CfrPulseSel_e pulseSelect); + +/** +* \brief Setting CFR Peak Duration for selected TX channels and CFR Engine. +* +* \pre This is an input to the cfr peak detector. It indicates the maximum number of samples that can be part of a peak group, +* before it is closed. +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] cfrTxChannelMask - One or multiple Tx channel selection to write CFR Peak Duration +* \param[in] configSelectMask - selected CFR CFG mask as defined in adi_adrv904x_CfrEngineSel_e. Multiple CFG selections are allowed. +* \param[in] samplesCount - Number of samples range from 0 to 255. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrControlPeakDurationSet(adi_adrv904x_Device_t* const device, + const uint32_t cfrTxChannelMask, + const uint32_t configSelectMask, + const uint8_t samplesCount); + +/** +* \brief Getting CFR Peak Duration for selected TX channel and CFR Engine. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] txChannelSel - One Tx channel selection to read CFR Peak Duration +* \param[in] configSelect - selected CFR CFG mask as defined in adi_adrv904x_CfrEngineSel_e +* \param[in,out] samplesCount - Number of samples range from 0 to 255. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrControlPeakDurationGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannelSel, + const adi_adrv904x_CfrConfigSel_e configSelect, + uint8_t* const samplesCount); + +/** +* \brief Set the CFR Delay values for the selected TX channel to a stream scratchpad register. + * The values will be written to both active and inactive CFR blocks when Tx is disabled. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] cfrTxChannelMask - Tx channel mask (multiples allowed) +* \param[in] delay0 - delay for engine 0 (0 - 1023) +* \param[in] delay1 - delay for engine 1 (0 - 1023) +* \param[in] delay2 - delay for engine 2 (0 - 1023) +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrControlDelaySet(adi_adrv904x_Device_t* const device, + const uint32_t cfrTxChannelMask, + const uint16_t delay0, + const uint16_t delay1, + const uint16_t delay2); + +/** +* \brief Get the CFR Delay values for the selected TX channel, always from the first CFR block. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] txChannelSel - One Tx channel selection +* \param[in,out] delay0 - delay for engine 0 (0 - 1023) +* \param[in,out] delay1 - delay for engine 1 (0 - 1023) +* \param[in,out] delay2 - delay for engine 2 (0 - 1023) +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrControlDelayGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannelSel, + uint16_t* const delay0, + uint16_t* const delay1, + uint16_t* const delay2); +#endif /* _ADI_ADRV904X_DFE_CFR_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cfr_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cfr_types.h new file mode 100644 index 00000000000..27c90ee3d11 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cfr_types.h @@ -0,0 +1,160 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_dfe_cfr_types.h +* +* \brief Contains ADRV904X data types for on board dfe cfr feature +* +* ADRV904X API Version: 2.10.0.4 +*/ + + +#ifndef _ADI_ADRV904X_DFE_CFR_TYPES_H_ +#define _ADI_ADRV904X_DFE_CFR_TYPES_H_ + + + +#include "adi_adrv904x_user.h" +#include "adi_library_types.h" +#include "adi_adrv904x_platform_pack.h" + +#define ADI_ADRV904X_NUM_OF_CFR_ENGINES 3 /*!< Number of CFR engines */ +#define ADI_ADRV904X_MAX_CFR_CORRECTION_PULSE_LEN 1024 /*!< Max CFR Pulse length */ + +#define ADI_ADVRV904X_TX0_PULSE_RAM_BASEADDR 0x608D2000U /*!< Base Address of Pulse RAM for TX0 */ +#define ADI_ADVRV904X_TX1_PULSE_RAM_BASEADDR 0x609D2000U /*!< Base Address of Pulse RAM for TX1 */ +#define ADI_ADVRV904X_TX2_PULSE_RAM_BASEADDR 0x60AD2000U /*!< Base Address of Pulse RAM for TX2 */ +#define ADI_ADVRV904X_TX3_PULSE_RAM_BASEADDR 0x60BD2000U /*!< Base Address of Pulse RAM for TX3 */ +#define ADI_ADVRV904X_TX4_PULSE_RAM_BASEADDR 0x60CD2000U /*!< Base Address of Pulse RAM for TX4 */ +#define ADI_ADVRV904X_TX5_PULSE_RAM_BASEADDR 0x60DD2000U /*!< Base Address of Pulse RAM for TX5 */ +#define ADI_ADVRV904X_TX6_PULSE_RAM_BASEADDR 0x60ED2000U /*!< Base Address of Pulse RAM for TX6 */ +#define ADI_ADVRV904X_TX7_PULSE_RAM_BASEADDR 0x60FD2000U /*!< Base Address of Pulse RAM for TX7 */ + + +#define ADI_ADRV904X_CFR_PULSE_RAM_SIZE 4096U /*!< CFR Pulse RAM size */ +#define ADI_ADRV904X_CFR_PULSE_RAM_ROW_SAMPLE_SIZE 4U /*!< CFR Pulse RAM row sample size */ +#define ADI_ADRV904X_CFR_PULSE_RAM_ROW_SIZE (ADI_ADRV904X_CFR_PULSE_RAM_ROW_SAMPLE_SIZE * 4U) /*!< CFR Pulse RAM row size (bytes) */ +#define ADI_ADRV904X_CFR_PULSE_RAM_NUM_OF_ROWS ADI_ADRV904X_CFR_PULSE_RAM_SIZE / ADI_ADRV904X_CFR_PULSE_RAM_ROW_SIZE /*!< Number of CFR Pulse RAM rows */ +#define ADI_ADRV904X_CFR_NUM_OF_PULSE_RAMS 6U /*!< Number of CFR Pulse RAMs */ + + +/** + * \brief Cfr Pulse Ram selection. If pulse RAMs are not being used, user + * might select single shot mode to broadcast the pulse data to save time. + */ +typedef enum adi_adrv904x_CfrPulseRamSel +{ + ADI_ADRV904X_CFR_PULSE_RAM_SINGLESHOT = 0x0001, /*!< Write the pulse data to all RAMs at the same time by broadcasting */ + ADI_ADRV904X_CFR_PULSE_RAM_0 = 0x0002, /*!< Write the pulse data to RAM0 through shadow RAM */ + ADI_ADRV904X_CFR_PULSE_RAM_1 = 0x0004, /*!< Write the pulse data to RAM1 through shadow RAM */ + ADI_ADRV904X_CFR_PULSE_RAM_2 = 0x0008, /*!< Write the pulse data to RAM2 through shadow RAM */ + ADI_ADRV904X_CFR_PULSE_RAM_3 = 0x0010, /*!< Write the pulse data to RAM3 through shadow RAM */ + ADI_ADRV904X_CFR_PULSE_RAM_4 = 0x0020, /*!< Write the pulse data to RAM4 through shadow RAM */ + ADI_ADRV904X_CFR_PULSE_RAM_ALL = 0x003E /*!< This selects all RAM blocks to be written through shadow RAM one at a time */ +} adi_adrv904x_CfrPulseRamSel_e; + + + +/** + * \brief Cfr Config set selection. Each engine has 2 separate configuration set which + * can be configured and switched to on the fly + */ +typedef enum adi_adrv904x_CfrConfigSel +{ + ADI_ADRV904X_CFR_CFG0 = 0x0001, /*!< Select config0 set for CFR engine */ + ADI_ADRV904X_CFR_CFG1 = 0x0002, /*!< Select config1 set for CFR engine */ + ADI_ADRV904X_CFR_CFGALL = 0x0003, /*!< Select both configs for CFR engine */ +}adi_adrv904x_CfrConfigSel_e; + +/** + * \brief Cfr Pulse selection. Each engine can store 2 different pulses and user can select + * the pulse to be used through adi_adrv904x_CfrActivePulseSet function + */ +typedef enum adi_adrv904x_CfrPulseSel +{ + ADI_ADRV904X_CFR_PULSE0 = 0x0001, /*!< Select pulse 0 to be used by CFR engine */ + ADI_ADRV904X_CFR_PULSE1 = 0x0002, /*!< Select pulse 1 to be used by CFR engine */ + ADI_ADRV904X_CFR_PULSEALL = 0x0003 /*!< Select both pulses */ +}adi_adrv904x_CfrPulseSel_e; + +/** + * \brief Cfr Threshold config structure + */ +typedef struct adi_adrv904x_CfrThrConfig +{ + uint32_t cfrPeakThreshold; /*!< Cfr base threshold value to be scaled with peak and correction thresholds. Value to be passed to API can be calculated as + cfrPeakThreshold = 10^(Target PAR_dB * RMS_Input_dBFS / 20) * 2^16 . Range[0 - 64*2^16] */ + uint32_t cfrEngine0PeakThresholdScaler; /*!< Cfr Engine 1 Peak threshold scaler to be applied to cfrPeakThreshold. Range[0 - 2^16] where 2^16 corresponds to a scaler + value of 1 and 0 corresponds to a scaler value of 0 */ + uint32_t cfrEngine1PeakThresholdScaler; /*!< Cfr Engine 2 Peak threshold scaler to be applied to cfrPeakThreshold. Range[0 - 2^16] where 2^16 corresponds to a scaler + value of 1 and 0 corresponds to a scaler value of 0 */ + uint32_t cfrEngine2PeakThresholdScaler; /*!< Cfr Engine 3 Peak threshold scaler to be applied to cfrPeakThreshold. Range[0 - 2^16] where 2^16 corresponds to a scaler + value of 1 and 0 corresponds to a scaler value of 0 */ + uint32_t cfrCorrectionThresholdScaler; /*!< Cfr correction threshold scaler to be applied to cfrPeakThreshold. Correction threshold should always be equal or lower + than peak detection thresholds. i.e. cfrCorrectionThresholdScaler should be lower than other peak detection scalers. + Range[0 - 2^16] where 2^16 corresponds to a scaler value of 1 and 0 corresponds to a scaler value of 0 */ +} adi_adrv904x_CfrThrConfig_t; + +/** + * \brief Cfr Configuration structure + */ +typedef struct adi_adrv904x_CfrConfig +{ + adi_adrv904x_CfrThrConfig_t cfrThreshold; /*!< CFR engine detection and correction thresholds. For details please check adi_adrv904x_CfrThrConfig_t */ + uint32_t cfrEngineEnable[ADI_ADRV904X_NUM_OF_CFR_ENGINES]; /*!< Engine enable selection array for 3 engines. 1:Enable, 0:Disable */ + uint32_t cfrEngineBypass[ADI_ADRV904X_NUM_OF_CFR_ENGINES]; /*!< Engine bypass selection array for 3 engines. 1:Enable, 0:Disable */ +} adi_adrv904x_CfrConfig_t; + +/** + * \brief Cfr Statistics. For details please check adi_adrv904x_CfrStatisticsGet function + */ +typedef struct adi_adrv904x_CfrStatistics +{ + uint16_t cfrEngine1PeaksDetected; /*!< Number of peaks detected at engine 1 */ + uint8_t cfrEngine1PeaksSkippedWFifo; /*!< Number of peaks skipped at engine 1 weight FIFO */ + uint8_t cfrEngine1PeaksSkippedPFifo; /*!< Number of peaks skipped at engine 1 peaks FIFO */ + uint16_t cfrEngine1PeaksSkippedCPC; /*!< Number of peaks skipped at engine 1 CPC module */ + uint16_t cfrEngine2PeaksDetected; /*!< Number of peaks detected at engine 2 */ + uint8_t cfrEngine2PeaksSkippedWFifo; /*!< Number of peaks skipped at engine 2 weight FIFO */ + uint8_t cfrEngine2PeaksSkippedPFifo; /*!< Number of peaks skipped at engine 2 peaks FIFO */ + uint16_t cfrEngine2PeaksSkippedCPC; /*!< Number of peaks skipped at engine 2 CPC module */ + uint16_t cfrEngine3PeaksDetected; /*!< Number of peaks detected at engine 3 */ + uint8_t cfrEngine3PeaksSkippedWFifo; /*!< Number of peaks skipped at engine 3 weight FIFO */ + uint8_t cfrEngine3PeaksSkippedPFifo; /*!< Number of peaks skipped at engine 3 peaks FIFO */ + uint16_t cfrEngine3PeaksSkippedCPC; /*!< Number of peaks skipped at engine 3 CPC module */ +} adi_adrv904x_CfrStatistics_t; + +/** + * \brief Cfr statistics configuration structure + */ +typedef struct adi_adrv904x_CfrStatisticsCfg +{ + uint8_t windowEn; /*!< Windowed statitstics enable/disable selection. 1: Enable // 0: Disable. Wnen windowed statistics is disabled + user should always read the statistics of current window. Please see adi_adrv904x_CfrStatisticsGet for details */ + uint8_t windowSize; /*!< When windowed statistics enabled (i.e. windowEn = 1) this parameter determines the size of the window + of which CFR HW use to collect statistics. Each time this window expires, CFR HW will automatically transfer + all the statisitcs to previous window and clear the current window counters. Window size is calculated in terms + of peak detection clock cycles. Window size = 2^(windowSize + 7) peak detect clock cycles. Range[0-15] */ +}adi_adrv904x_CfrStatisticsCfg_t; + +/** + * \brief Cfr pulse data + */ +ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_CfrCorrectionPulse +{ + int16_t coeffRealHalfPulse[ADI_ADRV904X_MAX_CFR_CORRECTION_PULSE_LEN]; /*!< An array consisting of the first half of the Real part of the complex CFR correction pulse coefficients */ + int16_t coeffImagHalfPulse[ADI_ADRV904X_MAX_CFR_CORRECTION_PULSE_LEN]; /*!< An array consisting of the first half of the Imag part of the complex CFR correction pulse coefficients */ + uint16_t numCoeffs; /*!< No. of coefficients contained in coeffReal and coeffImaginary arrays */ + uint8_t pulseSelectMask; /*!< This field selects which pulses to write. adi_adrv904x_CfrPulseSel_e should be used to create this mask. + User can select multiple pulses */ + uint8_t ramSelectMask; /*!< Selects the RAM's to write the pulse data. adi_adrv904x_CfrPulseRamSel_e should be used to create this mask. + Please check adi_adrv904x_CfrPulseRamSel_e for detailed info */ +}adi_adrv904x_CfrCorrectionPulse_t; +ADI_ADRV904X_PACK_FINISH + +#endif /* _ADI_ADRV904X_DFE_CFR_TYPES_H_ */ \ No newline at end of file diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_clgc.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_clgc.h new file mode 100644 index 00000000000..060ec1ad92c --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_clgc.h @@ -0,0 +1,210 @@ +/** +* Copyright 2015 - 2022 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_dfe_clgc.h +* +* \brief Contains ADRV904X CLGC function prototypes for +* adi_adrv904x_dfe_clgc.c +* +* ADRV904X API Version: 2.10.0.4 +*/ + + +#ifndef _ADI_ADRV904X_DFE_CLGC_H_ +#define _ADI_ADRV904X_DFE_CLGC_H_ + +#include "adi_adrv904x_dfe_cal_clgc_types.h" +#include "adi_adrv904x_dfe_framework_tracking_cal_t.h" +#include "adi_adrv904x_error.h" +#include "adi_common_error_types.h" +#include "adi_adrv904x_tx_types.h" + +/** +* \brief Configures the CLGC Capture Config for the requested Tx channel(s) +* +* This function configures a capture for the CLGC in the ADRV904x device. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization but before enabling the DPD tracking calibration. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] clgcTxChannelMask - One or multiple Tx channel for which CLGC configuration is required +* \param[in] clgcCaptureCfg - Pointer to the CLGC capture config structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ClgcCaptureConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t clgcTxChannelMask, + const adi_adrv904x_DfeAppCalClgcCaptureCfg_t* const clgcCaptureCfg); + +/** +* \brief Retrieves the CLGC Capture Config for the requested Tx channel from the device +* +* This function retrieves the CLGC capture config in the ADRV904x device. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] clgcTxChannelSel - Tx channel selection to read CLGC capture configuration. Only one Tx channel should be selected +* \param[out] clgcCaptureCfg - Pointer to the CLGC capture config structure which will be updated with the updated CLGC capture configuration. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ClgcCaptureConfigGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e clgcTxChannelSel, + adi_adrv904x_DfeAppCalClgcCaptureCfg_t* const clgcCaptureCfg); + +/** +* \brief Configures the CLGC Tracking Config for the requested Tx channel(s) +* +* This function configures a tracking for the CLGC in the ADRV904x device. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization but before enabling the DPD tracking calibration. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] clgcTxChannelMask - One or multiple Tx channel for which CLGC configuration is required +* \param[in] clgcTrackCfg - Pointer to the CLGC tracking config structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ClgcTrackingConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t clgcTxChannelMask, + const adi_adrv904x_DfeAppCalClgcTrackCfg_t* const clgcTrackCfg); + +/** +* \brief Retrieves the CLGC Tracking Config for the requested Tx channel from the device +* +* This function retrieves the CLGC tracking config in the ADRV904x device. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] clgcTxChannelSel - Tx channel selection to read CLGC capture configuration. Only one Tx channel should be selected +* \param[out] clgcTrackCfg - Pointer to the CLGC capture config structure which will be updated with the updated CLGC tracking configuration. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ClgcTrackingConfigGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e clgcTxChannelSel, + adi_adrv904x_DfeAppCalClgcTrackCfg_t* const clgcTrackCfg); + + +/** +* \brief Start the CLGC Tracking Run for the requested Tx channel(s) +* +* This function start a CLGC tracking run in the ADRV904x device. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization but before enabling the DPD tracking calibration. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] clgcTxChannelMask - One or multiple Tx channel for which CLGC configuration is required +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ClgcTrackingRun(adi_adrv904x_Device_t* const device, + const uint32_t clgcTxChannelMask); + +/** +* \brief Reset the CLGC Tracking for the requested Tx channel(s) +* +* This function reset the CLGC tracking in the ADRV904x device. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization but before enabling the DPD tracking calibration. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] clgcTxChannelMask - One or multiple Tx channel for which CLGC configuration is required +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ClgcTrackingReset(adi_adrv904x_Device_t* const device, + const uint32_t clgcTxChannelMask); + +/** +* \brief Retrieves the CLGC Statuc for the requested Tx channel from the device +* +* This function retrieves the CLGC status in the ADRV904x device. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] clgcTxChannelSel - Tx channel selection to read CLGC status. Only one Tx channel should be selected +* \param[out] clgcStatus - Pointer to the CLGC status structure which will be updated with the updated CLGC status. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeClgcStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e clgcTxChannelSel, + adi_adrv904x_DfeAppCalClgcStatus_t* const clgcStatus); + +/** +* \brief Sets the CLGC Capture Buffers Access Configuration +* +* This function sets the CLGC Capture Buffers Access configuration in the FW. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] clgcTxChannelMask - One or multiple Tx channel selection to apply Capture Buffers Access configuration +* \param[in] clgcCapBufAccess - Pointer to the CLGC Capture Buffers Access config structure which contains the configuration to be set in FW +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeClgcCaptureBuffersAccessSet(adi_adrv904x_Device_t* const device, + const uint32_t clgcTxChannelMask, + adi_adrv904x_DfeAppFrameworkTrackingCalCapBufAccessSet_t* const clgcCapBufAccess); + +/** +* \brief Read the CLGC Capture Buffers Access configuration +* +* This function reads the CLGC Capture Buffers Access state and capture buffer addresses +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called after BBIC requests reading capture data by calling the function adi_adrv904x_DfeClgcCaptureBuffersAccessSet(). +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] clgcTxChannelSel - Tx channel selection to read CLGC Capture Buffers Access configuration. Only one Tx channel should be selected +* \param[out] clgcCapBufAccess - Pointer to the CLGC Capture BUffers Access structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeClgcCaptureBuffersAccessGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e clgcTxChannelSel, + adi_adrv904x_DfeAppFrameworkTrackingCalCapBufAccessGet_t* const clgcCapBufAccess); +#endif /* _ADI_ADRV904X_DFE_CLGC_H_ */ \ No newline at end of file diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cpu.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cpu.h new file mode 100644 index 00000000000..c22e26d03b5 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cpu.h @@ -0,0 +1,940 @@ +/** +* Copyright 2015 - 2023 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_dfe_cpu.h +* \brief Contains ADRV904X processor function prototypes for +* adi_adrv904x_dfe_cpu.c +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#ifndef _ADI_ADRV904X_DFE_CPU_H_ +#define _ADI_ADRV904X_DFE_CPU_H_ + +#include "adi_adrv904x_dfe_cpu_types.h" +#include "adi_adrv904x_dfe_cpu_pintsw_status_types.h" +#include "adi_adrv904x_error.h" +#include "adi_common_error_types.h" +#include "adi_adrv904x_dfe_framework_tracking_cal_t.h" +#include "adi_adrv904x_cpu_sys_types.h" +#include "adi_adrv904x_dfe_svc_dfe_actuator_cmn_t.h" +#include "adi_adrv904x_dfe_svc_log_trace_events_t.h" +#include "adi_adrv904x_dfe_app_capture_sequencer_t.h" + +/** +* \brief Get DFE CPU load +* +* +* +* \pre This function is called after the device has been initialized and radio multichip-sync +* (MCS) has been completed +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in,out] pDfeCpuLoad -Pointer to DFE CPU load data. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeLoadGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeCpuLoad_t* const pDfeCpuLoad); + +/** +* \brief Get DFE CPU and memory load +* +* +* +* \pre This function is called after the device has been initialized and radio multichip-sync +* (MCS) has been completed +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in,out] pDfeCpuLoad -Pointer to DFE CPU and memory load data. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuAndMemLoadGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeCpuAndMemLoad_t* const pDfeCpuLoad); + +/** +* \brief Start the DFE CPU(s) +* +* Sets run bit to 1. Then wait and check for FW Status. +* +* +* \pre This function is called after the device has been initialized and radio multichip-sync +* (MCS) has been completed +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuStart(adi_adrv904x_Device_t* const device); + +/** +* \brief A polling wait for the CPU status to be ready. +* +* Polls firmware status (fwStatus) until it becomes ADRV904X_DFE_CPU_FW_STATUS_READY or a timeout occurs. +* +* +* \pre This function is called after the device has been initialized and after multichip-sync +* (MCS) has been completed and adi_adrv904x_DfeCpuStart is called. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] timeout_us Timeout to stop waiting for CPU to boot up. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuStartStatusCheck(adi_adrv904x_Device_t* const device, + const uint32_t timeout_us); +/** +* \brief This function loads DFE CPU Binary Image +* +* This function reads the DFE CPU Binary Image file from a specified location (e.g. SD card) +* and programs the CPU through CpuImageWrite() API +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* Please note that a large chunk size defined by ADI_ADRV904X_CPU_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES +* in adi_adrv904x_user.h could potentially cause the stack to crash. Please optimize the chunk size +* in accordance with the stack space available +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] cpuDfeBinaryInfo adi_adrv904x_DfeCpuBinaryInfo_t to be loaded +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuImageLoad(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeCpuBinaryInfo_t* const cpuDfeBinaryInfo); +/** +* \brief This function sets up the Adrv904x part to be able to load a DFE image +* +* This function sets up the A55 clock, L4 memory Settings and various other device parameters in order to be able to load a DFE Cpu Image +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] reload a flag indicating whether to reload the image (while an image is already loaded) ADI_TRUE - Reload, ADI_FALSE - Load for the first time +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePrepareLoad(adi_adrv904x_Device_t* const device, + const uint8_t reload); + +/** +* \brief This function reset the required clocks, loads DFE CPU Binary Image and start the DFE processor again. +* +* This function will need to be called by BBIC for reloading the D55 processor in case DFE application report an irrecoverable * error. +* TODO: This function is broken at the moment since DFE processor retrieves the profile data from temporary location at the end of +* L4 memory during boot up. This will updated and DFE processor will read the required profile data from radio processor memory. +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] cpuDfeBinaryInfo adi_adrv904x_DfeCpuBinaryInfo_t to be loaded +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuReload(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeCpuBinaryInfo_t* const cpuDfeBinaryInfo); + +/** +* \brief Check if the DFE CPU's exception flag is set. +* +* \pre This function may be called any time after device initialization +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] isException - Is set to non-zero if the DFE's CPU-exception flag is set. The value set is not +* defined but can be analyzed by ADI and should be included in bug reports. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if the exception flag was read successfully. +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuCheckException(adi_adrv904x_Device_t* const device, + uint32_t* const isException); + +/** +* \brief Transmits a DFE message to the DFE application processor and returns the response. +* +* \pre This function can be called after the CPU has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] command the command to send to the DFE +* \param[in] payload command data to be sent to the application processor. +* \param[in] payload_length Length of the payload data in bytes +* \param[in] response data from the output of the command, sent from the application processor. +* \param[in] response_length maximum length of the response data in bytes +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeAppCommand(adi_adrv904x_Device_t* const device, + const uint8_t command, + const uint8_t payload[], + const uint32_t payload_length, + const uint8_t response[], + const uint32_t response_length); + +/** + * \brief This function sets the capture sequencer configuration + * + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Context variable -A pointer to the device settings structure + * \param[in] capSeqCfg Capture sequencer configuration + * + * \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCaptureSequencerConfigSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeAppCaptureSequencerCfg_t* const capSeqCfg); + +/** + * \brief This function reads the capture sequencer configuration + * + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Context variable -A pointer to the device settings structure + * \param[out] capSeqCfg Capture sequencer configuration + * + * \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCaptureSequencerConfigGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeAppCaptureSequencerCfg_t* const capSeqCfg); +/** +* \brief Enables or disables available DFE tracking cals +* +* This function is used to enabled or disable available DFE +* tracking cals. +* +* \pre This function is called after running the firmware. +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device data structure containing settings +* \param[in] calMask bitfield of enumerated tracking cals +* \param[in] channelMask bitfield of enumerated channels +* \param[in] enableDisableFlag enable (1) flag for enumerated channels for the calMask tracking cals +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeTrackingCalsEnableSet(adi_adrv904x_Device_t* const device, + const uint32_t calMask, + const uint32_t channelMask, + const adi_adrv904x_DfeAppTrackingCalEnableDisable_t enableDisableFlag); + +/** +* \brief Reads the enabled state of the available DFE tracking cals +* +* This function is used to read the current enabled state of the +* available DFE tracking cals. +* +* \pre This function is called after running the firmware. +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device data structure containing settings +* \param[out] enableMasks bitfield of enumerated tracking cals +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeTrackingCalsEnableGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeAppFrameworkTrackingCalEnableMasks_t* const enableMasks); + +/** +* \brief Sets a timer value for the specified cal timer for the specified DFE tracking cals +* +* This function is used to set a timer value for the specified cal timer. +* +* \pre This function is called after running the firmware. +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device data structure containing settings +* \param[in] calType calibration timer to adjust (see adi_app_FrameworkTrackingCalType_e for types available) +* \param[in] calTimerValue calibration timer value in milliseconds for calTimerType +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeTrackingCalTimerSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeAppFrameworkTrackingCalType_t calType, + const uint32_t calTimerValue); + +/** +* \brief Gets a timer value for the specified cal timer for the specified DFE tracking cals +* +* This function is used to get a timer value for the specified cal timer. +* +* \pre This function is called after running the firmware. +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device data structure containing settings +* \param[in] calType calibration timer to adjust (see adi_app_FrameworkTrackingCalType_e for types available) +* \param[out] calTimerValue calibration timer value in milliseconds for calTimerType +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeTrackingCalTimerGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeAppFrameworkTrackingCalType_t calType, + uint32_t* const calTimerValue); + +/** +* \brief Writes configuration parameters to the provided SDK DFE configuration structure. +* +* This function is used to modify configuration parameters in the SDK +* +* \pre This function is called after running the firmware. +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device data structure containing settings +* \param[in] configID enumeration of the configuration to access +* \param[in] offset off set into the specified configuration +* \param[in] buffer the data to write at offset in the configuration data +* \param[in] size the size of the data to write +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeSvcConfigSet(adi_adrv904x_Device_t* const device, + const uint8_t configID, + const uint32_t offset, + const uint8_t buffer[], + const uint32_t size); + + + +/** +* \brief Reads configuration parameters from the provided SDK DFE configuration structure. +* +* This function used to read configuration parameters from the SDK +* +* \pre This function is called after running the firmware. +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device data structure containing settings +* \param[in] configID enumeration of the configuration to access +* \param[in] offset off set into the specified configuration +* \param[out] buffer the data read from offset in the configuration data +* \param[in] size the size of the data to write +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeSvcConfigGet(adi_adrv904x_Device_t* const device, + const uint8_t configID, + const uint32_t offset, + const uint8_t buffer[], + const uint32_t size); + +/** +* \brief Reads configuration parameters from the provided DFE App configuration structure. +* +* This function used to read configuration parameters from the App +* +* \pre This function is called after running the firmware. +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device data structure containing settings +* \param[in] configID index of the configuration to access +* \param[in] offset off set into the specified configuration +* \param[out] buffer the data read from offset in the configuration data +* \param[in] size the size of the data to write +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeAppConfigGet(adi_adrv904x_Device_t* const device, + const uint8_t configID, + const uint32_t offset, + const uint8_t buffer[], + const uint32_t size); + +/** +* \brief Writes configuration parameters to the provided DFE App configuration structure. +* +* This function is used to modify configuration parameters in the App +* +* \pre This function is called after running the firmware. +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device data structure containing settings +* \param[in] configID enumeration of the configuration to access +* \param[in] offset off set into the specified configuration +* \param[in] buffer the data to write at offset in the configuration data +* \param[in] size the size of the data to write +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeAppConfigSet(adi_adrv904x_Device_t* const device, + const uint8_t configID, + const uint32_t offset, + const uint8_t buffer[], + const uint32_t size); + +/** +* \brief Unlocks configuration structures in the SDK DFE +* +* This function is used to unlock the ability to modify configuration parameters in the SDK +* +* \pre This function is called after running the firmware. +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device data structure containing settings +* \param[in] cfgKey the 32 bit key used to unlock configuration access +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeConfigUnlock(adi_adrv904x_Device_t* const device, + const uint32_t cfgKey); + +/** +* \brief Sets the specified Set Ctrl in the adi_adrv904x_DfeAppControlCmdExec structure. +* +* \pre This function can be called after the CPU has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] objId Object ID of calibration or system component +* \param[in] cpuCmd Command to be executed +* \param[in] channel channel enum +* \param[in] cpuCtrlData Pointer to data to send TO the CPU +* \param[in] lengthSet Length of cpuCtrlData, in bytes +* \param[out] lengthResp Length of data received FROM the CPU into ctrlResp buffer, in bytes +* \param[out] ctrlResp Pointer to buffer in which data FROM the CPU should be received. +* \param[in] lengthGet Size of ctrlResp buffer, in bytes. MUST be greater than or equal to lengthResp. +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeAppControlCmdExec(adi_adrv904x_Device_t* const device, + const uint32_t objId, + const uint16_t cpuCmd, + const adi_adrv904x_Channels_e channel, + const uint8_t cpuCtrlData[], + const uint32_t lengthSet, + uint32_t* const lengthResp, + uint8_t ctrlResp[], + const uint32_t lengthGet); + +/** +* \brief Read the system status from the SDK. +* +* This function used to read the system status from the SDK +* +* \pre This function is called after running the firmware. +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device data structure containing settings +* \param[in] channel bitfield of enumerated channels +* \param[in] objID enumerated objID for the status request +* \param[out] status the status data of the specified objID channel +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeSysStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + const uint32_t objID, + adi_adrv904x_CpuSysStatus_t* const status); + +/** +* \brief Allows reading the current state of all tracking calibrations +* +* The returned state information is indexed per channel and per calibration ID (see +* adi_adrv904x_DfeAppFrameworkTrackingCalType_e). +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Context variable -A pointer to the device settings structure +* \param[out] calState Pointer to tracking calibration state structure to store the read values +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeTrackingCalAllStateGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeAppFrameworkTrackingCalState_t* const calState); + + +/** + * \brief Returns the status of the tracking calibration + * + * The function can be called to read back the status of the + * calibration including metrics like error codes, percentage of data + * collected for current cal, the performance of the cal and the number of + * times the cal has run and updated the hardware. + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Context variable -A pointer to the device settings structure + * \param[in] calId Indicate a type of cal tracking to get as defined in adi_adrv904x_TrackingCalibrationMask_e + * \param[in] channel Channel selection to read back cal status. Must be a single channel. + * \param[out] calStatus Status of the calibration, as a structure of type adi_adrv904x_CalStatus_t is returned to this pointer address + * + * \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeTrackingCalStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeAppFrameworkTrackingCalibrationMask_e calId, + const adi_adrv904x_Channels_e channel, + adi_adrv904x_CalStatus_t* const calStatus); + + +/** + * \brief Returns detailed status information specific to the private calibration + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Context variable -A pointer to the device settings structure + * \param[in] channel Channel selection to read back cal status. Must be a single channel + * \param[in] objId Object ID of calibration or system component + * \param[in, out] calStatusGet Status of the calibration. Size of calStatusGet must be equal or greater than length param. + * \param[in] length Length of the configuration in bytes + * + * \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCalPvtStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + const uint32_t objId, + uint8_t calStatusGet[], + const uint32_t length); + + +/** + * \brief Returns status specific information calibration + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Context variable -A pointer to the device settings structure + * \param[in] channel Channel selection to read back cal status. Must be a single channel + * \param[in] objId Object ID of calibration or system component + * \param[in, out] calStatusGet Status of the calibration. Size of calStatusGet must be equal or greater than length param. + * \param[in] length Length of the configuration in bytes + * + * \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCalSpecificStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + const uint32_t objId, + uint8_t calStatusGet[], + const uint32_t length); + +/** +* \brief Returns status extended information calibration +* +* \pre This function may be called any time after the device has been initialized, and +* initialization calibrations have taken place +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable -Context variable -A pointer to the device settings structure +* \param[in] channel Channel selection to read back cal status. Must be a single channel +* \param[in] objId Object ID of calibration or system component +* \param[in, out] calStatusGet Status of the calibration. Size of calStatusGet must be equal or greater than length param. +* \param[in] length Length of the status in bytes +* +* \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCalExtendedStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + const uint32_t objId, + uint8_t calStatusGet[], + const uint32_t length); + +/** +* \brief Reads back the DFE app init status loaded into the DFE processor +* +* This function reads the DFE app after DFE initial. +* +* \pre This function may be called after the CPU binary have been initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] dfeAppInitStatus uint32_t pointer to DFE app init status +* +* \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeAppInitStatusGet(adi_adrv904x_Device_t* const device, + uint32_t* const dfeAppInitStatus); +/** +* \brief Reads back the DFE boot error code. +* +* This function reads the DFE boor error code during DFE boot. +* +* \pre This function may be called after the CPU binary have been initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] dfeBootError uint32_t pointer to DFE boot error code +* +* \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeBootErrorGet( adi_adrv904x_Device_t* const device, + uint32_t* const dfeBootError); + +/** + * \brief Returns system status information + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Context variable -A pointer to the device settings structure + * \param[in] channel Channel selection to read back cal status. Must be a single channel + * \param[in] objID Object ID of calibration or system component + * \param[in, out] cpuSysStatusGet Status of the system. Size of cpuSysStatusGet must be equal or greater than length param. + * \param[in] length Length of the configuration in bytes + * + * \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeSysPvtStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + const uint32_t objID, + uint8_t cpuSysStatusGet[], + const uint32_t length); + +/** +* \brief This function set the DFE FW Debug Mode +* There are 4 debug modes and the GPIO Pins associated with each: +* ADI_ADRV904X_DFE_FW_DEBUG_MODE_SWD: GPIO Pins 13, 14 +* ADI_ADRV904X_DFE_FW_DEBUG_MODE_JTAG: GPIO Pins 10, 11, 12, 13, 14 +* ADI_ADRV904X_DFE_FW_DEBUG_MODE_JTAG4: GPIO Pins 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 +* ADI_ADRV904X_DFE_FW_DEBUG_MODE_JTAG8: GPIO Pins 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 +* Note that when one of mode is enable, it will reconfigure any needed GPIO pins that are being used. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization. Device must be in +* debug mode. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X Device data structure +* \param[in] dfeFwDebugMode DFE FW Debug mode specified in adi_adrv904x_DfeFwDebugMode_e + +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeFwDebugModeSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeFwDebugMode_e dfeFwDebugMode); + +/** +* \brief This function enables the DFE FW Debug Mode +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X Device data structure +* \param[in] debugModeKey DFE FW Debug mode key + +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeDebugMode(adi_adrv904x_Device_t* const device, + const uint32_t debugModeKey); + +/** +* \brief Sets the specified Cmd for the Debug feature +* +* \pre This function can be called after the CPU has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] objId Object ID of calibration or system component +* \param[in] cpuCmd Command to be executed +* \param[in] cpuDebugData Pointer to data to send TO the CPU +* \param[in] lengthSet Length of cpuDebugData, in bytes +* \param[out] lengthResp Length of data received FROM the CPU into ctrlResp buffer, in bytes +* \param[out] debugResp Pointer to buffer in which data FROM the CPU should be received. +* \param[in] lengthGet Size of ctrlResp buffer, in bytes. MUST be greater than or equal to lengthResp. +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeDebugModeCmd(adi_adrv904x_Device_t* const device, + const uint32_t objId, + const uint16_t cpuCmd, + const uint8_t cpuDebugData[], + const uint32_t lengthSet, + uint32_t* const lengthResp, + uint8_t debugResp[], + const uint32_t lengthGet); + +/** +* \brief Sets the Watchdog config timeout value feature +* +* \pre This function can be called after the CPU has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] wdt Watchdog instance +* \param[in] timeout_ms Watchdog timeout value. Setting timeout_ms to 0 disables the specified WDT. +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeWatchdogConfigSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeSvcWatchdogInstance_t wdt, + const uint32_t timeout_ms); + +/** +* \brief This function forces an ECC scrubbing Update +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X Device data structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeUpdateEcc(adi_adrv904x_Device_t* const device); + +/** + * \brief Sets the log level mask for DFE CPU + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device - Device context variable. A pointer to the device settings structure. + * \param[in] logMaskSet - log mask to set. + * logMaskSet permits following bit mapped DFE cpu log levels enabled(1)/disabled(0). + * ADI_SVC_LOG_TRACE_LEVEL_DEBUG = 0x1UL, Debug Message logging, no action required + * ADI_SVC_LOG_TRACE_LEVEL_INFO = 0x2UL, Informative, no action required. Error code parameter will be ignore. Info messages will not be logged to the telemetry. + * ADI_SVC_LOG_TRACE_LEVEL_WARNING = 0x4UL, Some attention required. Warning messages will not be logged to the telemetry. + * ADI_SVC_LOG_TRACE_LEVEL_CRITICAL = 0x8UL, Can be continued after handling. + * ADI_SVC_LOG_TRACE_LEVEL_FATAL = 0x10UL Cannot continue, needs reboot. + * + * \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuLogMaskSet( adi_adrv904x_Device_t* const device, + const uint32_t logMaskSet); + +/** + * \brief Get the log level mask for DFE CPU + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device - Device context variable. A pointer to the device settings structure. + * \param[in, out] logMaskGet - log mask to get. + * logMaskGet will have following bit mapped DFE cpu log levels enabled(1)/disabled(0). + * ADI_SVC_LOG_TRACE_LEVEL_DEBUG = 0x1UL, Debug Message logging, no action required + * ADI_SVC_LOG_TRACE_LEVEL_INFO = 0x2UL, Informative, no action required. Error code parameter will be ignore. Info messages will not be logged to the telemetry. + * ADI_SVC_LOG_TRACE_LEVEL_WARNING = 0x4UL, Some attention required. Warning messages will not be logged to the telemetry. + * ADI_SVC_LOG_TRACE_LEVEL_CRITICAL = 0x8UL, Can be continued after handling. + * ADI_SVC_LOG_TRACE_LEVEL_FATAL = 0x10UL Cannot continue, needs reboot. + * + * \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuLogMaskGet( adi_adrv904x_Device_t* const device, + uint32_t* const logMaskGet); + +/** + * \brief Sets the telemetry mask for DFE CPU + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place. adi_adrv904x_DfeSvcLogTraceEvent_e enum + * lists all the events available on both SDK and APP layer. These event ids can be used + * to compose the telemetry masks. Setting the bit representing a particular event will + * enable telemetry for that event. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device - Device context variable. A pointer to the device settings structure. + * \param[in] sdkTelemetryMask0 - Telemetry mask for first 64 SDK events + * \param[in] sdkTelemetryMask1 - Telemetry mask for second 64 SDK events + * \param[in] appTelemetryMask0 - Telemetry mask for first 64 APP events + * \param[in] appTelemetryMask1 - Telemetry mask for second 64 APP events + * + * \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuTelemetryMaskSet( adi_adrv904x_Device_t* const device, + const uint64_t sdkTelemetryMask0, + const uint64_t sdkTelemetryMask1, + const uint64_t appTelemetryMask0, + const uint64_t appTelemetryMask1); + +/** + * \brief Reads the telemetry mask for DFE CPU + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place. adi_adrv904x_DfeSvcLogTraceEvent_e enum + * lists all the events available on both SDK and APP layer. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device - Device context variable. A pointer to the device settings structure. + * \param[out] sdkTelemetryMask0 - Telemetry mask for first 64 SDK events + * \param[out] sdkTelemetryMask1 - Telemetry mask for second 64 SDK events + * \param[out] appTelemetryMask0 - Telemetry mask for first 64 APP events + * \param[out] appTelemetryMask1 - Telemetry mask for second 64 APP events + * + * \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuTelemetryMaskGet( adi_adrv904x_Device_t* const device, + uint64_t * const sdkTelemetryMask0, + uint64_t * const sdkTelemetryMask1, + uint64_t * const appTelemetryMask0, + uint64_t * const appTelemetryMask1); + +/** + * \brief Returns current status of DFE CPU Interrupt Sources PintSw0 and PintSw1 + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device - Device context variable. A pointer to the device settings structure. + * \param[out] statusPintSw0 - Bitmask of all currently PintSw0 interrupts. Interpret at bitwise OR of interrupts included in adi_adrv904x_DfeCpuPintSw0Status_e + * \param[out] statusPintSw1 - Bitmask of all currently PintSw1 interrupts. Interpret at bitwise OR of interrupts included in adi_adrv904x_DfeCpuPintSw1Status_e + * + * \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuPintSwStatusGet(adi_adrv904x_Device_t* const device, + uint8_t* const statusPintSw0, + uint8_t* const statusPintSw1); + +/** + * \brief Clears DFE CPU Interrupt Sources of PintSw0 and PintSw1 + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device - Device context variable. A pointer to the device settings structure. + * \param[in] clearPintSw0 - Bitmask of all PintSw0 interrupts to clear. Interpret at bitwise OR of interrupts included in adi_adrv904x_DfeCpuPintSw0Status_e + * \param[in] clearPintSw1 - Bitmask of all PintSw1 interrupts to clear. Interpret at bitwise OR of interrupts included in adi_adrv904x_DfeCpuPintSw1Status_e + * + * \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuPintSwStatusClear(adi_adrv904x_Device_t* const device, + const uint8_t clearPintSw0, + const uint8_t clearPintSw1); + +/** + * \brief Returns detailed information from the last instance that a selected interrupt from DFE CPU PintSw0 was triggered. + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device - Device context variable. A pointer to the device settings structure. + * \param[in] interruptSelect - Selected interrupt of type adi_adrv904x_DfeCpuPintSw0Status_e about which to get more information. + * \param[out] pInfo - 32bit value that indicates more information about last instance that interruptSelect was triggered + * + * \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuPintSw0DetailedInfoGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeCpuPintSw0Status_e interruptSelect, + uint32_t* const pInfo); + +/** + * \brief Returns detailed information from the last instance that a selected interrupt from DFE CPU PintSw1 was triggered. + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device - Device context variable. A pointer to the device settings structure. + * \param[in] interruptSelect - Selected interrupt of type adi_adrv904x_DfeCpuPintSw1Status_e about which to get more information. + * \param[out] pInfo - 32bit value that indicates more information about last instance that interruptSelect was triggered + * + * \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuPintSw1DetailedInfoGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeCpuPintSw1Status_e interruptSelect, + uint32_t* const pInfo); + + +/** + * \brief Returns detailed information from the last instance of all errorCodes and their associated severity/logLevels with timestamps. + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device - Device context variable. A pointer to the device settings structure. + * \param[out] lastErrorData - structure containing the DFE errorCodes for the severity/logLevels with timestamps + * + * \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeSvcLogTraceErrLogGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeSvcLogTraceErrLog_t* const lastErrorData); + + #endif /* _ADI_ADRV904X_DFE_CPU_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cpu_pintsw_status_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cpu_pintsw_status_types.h new file mode 100644 index 00000000000..c25557e0cf1 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cpu_pintsw_status_types.h @@ -0,0 +1,46 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2023 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adi_adrv904x_dfe_cpu_pintsw_status_types.h + * + * \brief Contains ADRV904X DFE CPU Pin Interrupt types for PINTSW0 and PINTSW1. + * + * ADRV904X API Version: 2.10.0.4 + */ + + +#ifndef __ADI_ADRV904X_DFE_CPU_PINTSW_STATUS_TYPES_H__ +#define __ADI_ADRV904X_DFE_CPU_PINTSW_STATUS_TYPES_H__ + +#define ADI_ADRV904X_DFE_CPU_PINTSW_GPINT_MAX (2U) +#define ADI_ADRV904X_DFE_CPU_PINTSW_SOURCES_PER_GPINT (8U) + +/** + * \brief Enumerated list of PINT SW0 aggregated interrupts. + */ +typedef enum +{ + ADI_ADRV904X_DFE_CPU_PINTSW0_STATUS_INT_NONE = 0x00U, + ADI_ADRV904X_DFE_CPU_PINTSW0_STATUS_INT_0_FATAL_ERROR = 0x01U, + ADI_ADRV904X_DFE_CPU_PINTSW0_STATUS_INT_0_CRITICAL_ERROR = 0x02U, +} adi_adrv904x_DfeCpuPintSw0Status_e; + +/** + * \brief Enumerated list of PINT SW1 aggregated interrupts. + */ +typedef enum +{ + ADI_ADRV904X_DFE_CPU_PINTSW1_STATUS_INT_NONE = 0x00U, + ADI_ADRV904X_DFE_CPU_PINTSW1_STATUS_INT_0_TDD_LUT_UPDATE_IN_PROGRESS_TXON = 0x01U, + ADI_ADRV904X_DFE_CPU_PINTSW1_STATUS_INT_1_VSWR_ALARM = 0x02U, +} adi_adrv904x_DfeCpuPintSw1Status_e; + + +#endif /* __ADI_ADRV904X_DFE_CPU_PINTSW_STATUS_TYPES_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cpu_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cpu_types.h new file mode 100644 index 00000000000..0f61ece1576 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_cpu_types.h @@ -0,0 +1,45 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_dfe_cpu_types.h +* +* \brief Contains ADRV904X data types for on board dfe cpus feature +* +* ADRV904X API Version: 2.10.0.4 +*/ + + +#ifndef _ADI_ADRV904X_DFE_CPU_TYPES_H_ +#define _ADI_ADRV904X_DFE_CPU_TYPES_H_ + + + +#include "adi_adrv904x_user.h" +#include "adi_library_types.h" +#include "adi_adrv904x_dfe_osal_t.h" +#include "adi_adrv904x_dfe_svc_watchdog_t.h" + +/** +* \brief DFE CPU Binary Info Data Structure +*/ +typedef struct adi_adrv904x_DfeCpuBinaryInfo +{ + uint8_t filePath[ADI_ADRV904X_DFE_MAX_FILE_LENGTH]; /*!< File Path for DFE CPU Core Binary Image */ +} adi_adrv904x_DfeCpuBinaryInfo_t; + +/** + * \brief Enumerated list of DFE Firmware Debug Mode + */ +typedef enum adi_adrv904x_DfeFwDebugMode +{ + ADI_ADRV904X_DFE_FW_DEBUG_MODE_SWD, /*!< SWD Mode */ + ADI_ADRV904X_DFE_FW_DEBUG_MODE_JTAG, /*!< Jtag Mode */ + ADI_ADRV904X_DFE_FW_DEBUG_MODE_JTAG4, /*!< Jtag and 4-bit trace */ + ADI_ADRV904X_DFE_FW_DEBUG_MODE_JTAG8, /*!< Jtag and 8-bit trace */ +} adi_adrv904x_DfeFwDebugMode_e; + +#endif /* _ADI_ADRV904X_DFE_CPU_TYPES_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_dpd.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_dpd.h new file mode 100644 index 00000000000..ab360494231 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_dpd.h @@ -0,0 +1,657 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_dfe_dpd.h +* +* \brief Contains ADRV904X DPD function prototypes for +* adi_adrv904x_dfe_dpd.c +* +* ADRV904X API Version: 2.10.0.4 +*/ + + +#ifndef _ADI_ADRV904X_DFE_DPD_H_ +#define _ADI_ADRV904X_DFE_DPD_H_ + +#include "adi_adrv904x_dfe_cal_dpd_types.h" +#include "adi_adrv904x_dfe_framework_tracking_cal_t.h" +#include "adi_adrv904x_error.h" +#include "adi_common_error_types.h" +#include "adi_adrv904x_tx_types.h" + +/** +* \brief Configures the base DPD model for the requested Tx channel(s) +* +* This function configures a basis model for the DPD adaptation engine in the ADRV904x device. +* The basis model configuration includes the feature set consisting of i(memory term),j(cross term), +* k(power term) and the complex coefficient values. A maximum of ADI_ADRV904X_DPD_MAX_NUM_FEATURES +* features can be configured for the DPD adaptation engine. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization but before enabling the DPD tracking calibration. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] dpdTxChannelMask - One or multiple Tx channel for which DPD model configuration is required +* \param[in] dpdModelType - Model type +* \param[in] modelDesc - Pointer to the model config structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdModelConfigDpdSet(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdModelType_e dpdModelType, + const adi_adrv904x_DfeAppCalDpdModelDesc_t* const modelDesc); + +/** +* \brief Retrieves the DPD model feature set for the requested Tx channel from the device +* +* This function retrieves the DPD model config updated with the feature co-efficient values +* computed from the last DPD adaptation cycle. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] dpdTxChannelSel - Tx channel selection to read DPD model configuration. Only one Tx channel should be selected +* \param[in] dpdModelType - Model type +* \param[out] modelDesc - Pointer to the model config structure which will be updated with the updated DPD model configuration. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdModelConfigDpdGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e dpdTxChannelSel, + const adi_adrv904x_DfeAppCalDpdModelType_e dpdModelType, + adi_adrv904x_DfeAppCalDpdModelDesc_t* const modelDesc); + +/** +* \brief Configures the base CTC model for the requested Tx channel(s) +* +* WARNING : This API is not supported currently +* This function configures a basis model for the CTC adaptation engine in the ADRV904x device. +* The basis model configuration includes the feature set consisting of r, c, d, k, m, j and the +* complex coefficient values. A maximum of ADI_ADRV904X_DPD_MAX_NUM_FEATURES features can be +* configured for the CTC adaptation engine. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization but before enabling the DPD tracking calibration. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] dpdTxChannelMask - One or multiple Tx channel for which CTC model configuration is required +* \param[in] dpdModelType - Model type +* \param[in] modelDesc - Pointer to the model config structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdModelConfigCtcSet(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdModelType_e dpdModelType, + const adi_adrv904x_DfeAppCalCtcModelDesc_t* const modelDesc); + +/** +* \brief DPD reset for a requested Tx channel. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] txChannelMask - Tx channel mask for selected TX channels for DPD Reset. +* \param[in] dpdResetMode - DPD Reset mode defined in enum adi_adrv904x_DfeAppDpdResetMode_e +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdReset(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const adi_adrv904x_DfeAppDpdResetMode_e dpdResetMode); + +/** +* \brief Retrieves the CTC model feature set for the requested Tx channel from the device +* +* WARNING : This API is not supported currently +* This function retrieves the CTC model config updated with the feature co-efficient values +* computed from the last CTC adaptation cycle. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] dpdTxChannelSel - Tx channel selection to read CTC model configuration. Only one Tx channel should be selected +* \param[in] dpdModelType - Model type +* \param[out] modelDesc - Pointer to the model config structure which will be updated with the updated CTC model configuration. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdModelConfigCtcGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e dpdTxChannelSel, + const adi_adrv904x_DfeAppCalDpdModelType_e dpdModelType, + adi_adrv904x_DfeAppCalCtcModelDesc_t* const modelDesc); + +/** +* \brief Sets the DPD gain monitor configuration +* +* WARNING : This API is not supported currently +* This function sets the DPD gain monitor/power meter configuration. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function should be called after DPD Reset and before DPD tracking is enabled. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] dpdTxChannelMask - One or multiple Tx channel selection to apply configuration +* \param[in] dpdPowerMeterCfg - Pointer to the DPD gain monitor/power meter configuration structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdActuatorGainMonitorConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdPowerMeterCfg_t* const dpdPowerMeterCfg); + +/** +* \brief Read the DPD gain monitor configuration +* +* WARNING : This API is not supported currently +* This function reads the DPD gain monitor configuration/power meter configuration. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] dpdTxChannelSel - Tx channel selection to read DPD gain monitor/power meter configuration. Only one Tx channel should be selected +* \param[out] dpdPowerMeterCfg - Pointer to the DPD gain monitor/power meter configuration structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdActuatorGainMonitorConfigGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e dpdTxChannelSel, + adi_adrv904x_DfeAppCalDpdPowerMeterCfg_t* const dpdPowerMeterCfg); + +/** +* \brief Sets the DPD capture configuration +* +* This function sets the DPD capture configuration. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function should be called after DPD Reset and before DPD tracking is enabled. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] dpdTxChannelMask - One or multiple Tx channel selection to capture configuration +* \param[in] dpdCaptureCfg - Pointer to the DPD capture config structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdCaptureConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdCaptureCfg_t* const dpdCaptureCfg); + +/** +* \brief Read the DPD capture configuration +* +* This function reads the DPD capture configuration in the FW. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] dpdTxChannelSel - Tx channel selection to read DPD capture configuration. Only one Tx channel should be selected +* \param[out] dpdCaptureCfg - Pointer to the DPD capture config structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdCaptureConfigGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e dpdTxChannelSel, + adi_adrv904x_DfeAppCalDpdCaptureCfg_t* const dpdCaptureCfg); + +/** +* \brief Sets the DPD tracking calibration configuration +* +* This function sets the DPD tracking calibration configuration in the FW. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function should be called after DPD Reset and before DPD tracking is enabled. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] dpdTxChannelMask - One or multiple Tx channel selection to apply DPD tracking calibration configuration +* \param[in] dpdTrackCfg - Pointer to the DPD tracking calibration config structure which contains the configuration to be set in FW +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdTrackingConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdTrackCfg_t* const dpdTrackCfg); + + +/** +* \brief Read the DPD tracking calibration configuration +* +* This function reads the DPD tracking calibration configuration in the FW. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] dpdTxChannelSel - Tx channel selection to read DPD tracking calibration configuration. Only one Tx channel should be selected +* \param[out] dpdTrackCfg - Pointer to the DPD tracking calibration config structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdTrackingConfigGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e dpdTxChannelSel, + adi_adrv904x_DfeAppCalDpdTrackCfg_t* const dpdTrackCfg); + +/** +* \brief Sets the DPD Power Meter Configuration +* +* This function sets the DPD Power Meter configuration in the FW. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function should be called after DPD tracking is enabled. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] dpdTxChannelMask - One or multiple Tx channel selection to apply Capture Buffers Access configuration +* \param[in] dpdPowerMeterCfg - Pointer to the DPD Power Meter config structure which contains the configuration to be set in FW +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdPowerMeterConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdPowerMeterCfg_t* const dpdPowerMeterCfg); + +/** +* \brief Read the DPD Power Meter configuration +* +* This function reads the DPD Power Meter configuration in the FW. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called after BBIC requests reading capture data by calling the function adi_adrv904x_DpdPowerMeterConfigSet(). +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] dpdTxChannelSel - Tx channel selection to read DPD Capture Buffers Access configuration. Only one Tx channel should be selected +* \param[out] dpdPowerMeterCfg - Pointer to the DPD Power Meter Configuration structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdPowerMeterConfigGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e dpdTxChannelSel, + adi_adrv904x_DfeAppCalDpdPowerMeterCfg_t* const dpdPowerMeterCfg); + +/** +* \brief Sets the DPD Capture Buffers Access Configuration +* +* This function sets the DPD Capture Buffers Access configuration in the FW. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] dpdTxChannelMask - One or multiple Tx channel selection to apply Capture Buffers Access configuration +* \param[in] dpdCapBufAccess - Pointer to the DPD Capture Buffers Access config structure which contains the configuration to be set in FW +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdCaptureBuffersAccessSet(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + adi_adrv904x_DfeAppFrameworkTrackingCalCapBufAccessSet_t* const dpdCapBufAccess); + +/** +* \brief Read the DPD Capture Buffers Access configuration +* +* This function reads the DPD Capture Buffers Access state and capture buffer addresses +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called after BBIC requests reading capture data by calling the function adi_adrv904x_DpdCaptureBuffersAccessSet(). +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] dpdTxChannelSel - Tx channel selection to read DPD Capture Buffers Access configuration. Only one Tx channel should be selected +* \param[out] dpdCapBufAccess - Pointer to the DPD Capture BUffers Access structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdCaptureBuffersAccessGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e dpdTxChannelSel, + adi_adrv904x_DfeAppFrameworkTrackingCalCapBufAccessGet_t* const dpdCapBufAccess); +/** + * \brief Returns the status of the actuator saturation status + * + * The function can be called to read back the status of the + * acturator saturation status including the saturation of cmul for dinsq calculation for DDR, + * Magnitude saturation because of mag gain multiplication,GMP DDR Datapath Saturation + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in] device Context variable -Context variable -A pointer to the device settings structure + * \param[in] channel Channel selection to read back cal status. Must be a single channel. + * \param[out] calDpdActSatStatus Status of the actuator saturation status, as a structure of type adi_adrv904x_DfeSvcDfeActuatorSaturation_t is returned to this pointer address + * + * \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeDpdActSatStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + adi_adrv904x_DfeSvcDfeActuatorSaturation_t* const calDpdActSatStatus); + +/** + * \brief Returns the active model table + * + * The function can be called to read back active model table. returned value = 0 means M table, 1 for C table. + * If DPD update mode is NOT CMT mode, M table is always in use; + * othwerwise, M table is used for high power and C table is used for low power. + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in] device Context variable -Context variable -A pointer to the device settings structure + * \param[in] channel Channel selection to read back cal status. Must be a single channel. + * \param[out] calDpdActiveModelTable indicates which table is active. + * + * \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeDpdActiveModelTableGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + uint8_t* const calDpdActiveModelTable); +/** + * \brief Read data directly from the capture buffer memory. + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place. It reads data directly from capture buffer memory. + * Intended to be used for debugging only and DPD tracking cal needs to be disabled before reading + * back the data + * Note: This API will NOT perform any scaling to compensate for resolution change in the FW for gain + * expansion and it is up to the user to scale the data if required + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in] device Context variable -Context variable -A pointer to the device settings structure + * \param[in] orxChannelSel Channel selection to read back capture data. Must be a single ORx channel + * \param[out] dpdCaptureData pointer to DPD capture data structure + * + * \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeDpdCaptureDataFromBufMemGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e orxChannelSel, + adi_adrv904x_DfeAppDpdCaptureData_t* const dpdCaptureData); + +/** +* \brief Returns the status of the Dpd Cal Specific status +* +* The function can be called to read back the status of the +* Dpd Cal Specific status in the adi_adrv904x_DfeAppCalDpdStatus_t +* +* \pre This function may be called any time after the device has been initialized, and +* initialization calibrations have taken place +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in] device Context variable -Context variable -A pointer to the device settings structure +* \param[in] channel Channel selection to read back cal status. Must be a single channel. +* \param[out] calDpdSpecStatus Status of the Cal Specific, as a structure of type adi_adrv904x_DfeAppCalDpdStatus_t is returned to this pointer address +* +* \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeDpdCalSpecificStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + adi_adrv904x_DfeAppCalDpdStatus_t* const calDpdSpecStatus); + +/** +* \brief Sets the DPD Stability Configuration +* +* This function sets the DPD Stability configuration in the FW. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function should be called before enabling Calibration. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] dpdTxChannelMask - One or multiple Tx channel selection to apply DPD Stability configuration +* \param[in] dpdStabilityCfg - Pointer to the DPD Stability config structure which contains the configuration to be set in FW +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdStabilityCfgSet(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + adi_adrv904x_DfeAppCalDpdStabilityCfg_t* const dpdStabilityCfg); + +/** +* \brief Read the DPD Stability configuration +* +* This function reads the DPD Stability configuration in the FW. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called after BBIC requests reading capture data by calling the function adi_adrv904x_DpdStabilityCfgSet(). +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] dpdTxChannelSel - Tx channel selection to read DPD Stability configuration. Only one Tx channel should be selected +* \param[out] dpdStabilityCfg - Pointer to the DPD Stability config structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdStabilityCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e dpdTxChannelSel, + adi_adrv904x_DfeAppCalDpdStabilityCfg_t* const dpdStabilityCfg); + +/** + * \brief TDD lut switching time config set for selected channel. It determins the time to switch model + * after each tx raising edge + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Context variable -A pointer to the device settings structure + * \param[in] dfeTxChannelMask - channel mask to set TDD lut switching config + * \param[in] tddLutSwitchConfig -pointer to internal dfe tdd lut switching time config + * + * \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdTddLutSwitchCfgSet(adi_adrv904x_Device_t* const device, + const uint32_t dfeTxChannelMask, + const adi_adrv904x_DfeAppDpdActTddLutSwitch_t* const tddLutSwitchConfig); + +/** + * \brief TDD lut switching config get for selected channel. + * + * \pre This function may be called any time after the device has been initialized, and + * initialization calibrations have taken place + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable -Context variable -A pointer to the device settings structure + * \param[in] dpdTxChannelSel -Channel selection to get TDD lut switching config. Must be a single channel + * \param[out] tddLutSwitchConfig -pointer to internal dfe tdd lut switching config + * + * \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdTddLutSwitchCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e dpdTxChannelSel, + adi_adrv904x_DfeAppDpdActTddLutSwitch_t* const tddLutSwitchConfig); + +/** +* \brief Read the WB Regularization structure that contains the buffer address and size +* +* This function reads the WB Regularization structure in the FW. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function should be called before BBIC transfers WB regularization data to get the address and length for that transfer +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in,out] DfeAppWbReg - Pointer to the WB Regularization structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_WbRegBufferAccess(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeAppwbRegularization_t* const DfeAppWbReg); + +/** +* \brief Write the WB Regularization data to the DFE +* +* This function writes the WB Regularization data to the DFE. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function is used to transfer WB regularization data from the BBIC to the DFE +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] DfeAppWbRegData - Array of the WB Regularization data to write to the DFE +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_WbRegBufferWrite(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeAppwbRegData_t* const DfeAppWbRegData); + +/** +* \brief Set the DPD pathdelay configuration +* +* This function sets the DPD pathdelay configuration. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function can be called any time after device initialization. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] dpdTxChannelMask - One or multiple Tx channel selection to capture configuration +* \param[in] dpdPathdelayCfg - Pointer to the DPD pathdelay status structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdPathdelayCfg(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdPathDlyStatus_t* const dpdPathdelayCfg); + +/** +* \brief DPD reset and pathdelay init +* +* This function resets DPD and sets the pathdelay configuration. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function can be called any time after device initialization. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] dpdTxChannelMask - One or multiple Tx channel selection to capture configuration +* \param[in] dpdResetMode - DPD Reset mode defined in enum adi_adrv904x_DfeAppDpdResetMode_e +* \param[in] dpdPathdelayCfg - Pointer to the DPD pathdelay status structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdResetPathdelayInit(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppDpdResetMode_e dpdResetMode, + const adi_adrv904x_DfeAppCalDpdPathDlyStatus_t* const dpdPathdelayCfg); + +/** +* \brief Seed the DPD pathdelay +* +* This function seeds the DPD pathdelay and estimate the pathdelay during DPD tracking +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function can be called any time after device initialization. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] dpdTxChannelMask - One or multiple Tx channel selection to capture configuration +* \param[in] dpdPathdelay - Pointer to the DPD pathdelay seed structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdPathdelaySeed(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdPathDlySeed_t* const dpdPathdelay); + +/** +* \brief Reset DPD pathdelay seed +* +* This function Reset the DPD pathdelay seed and seeded flag +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function can be called any time after device initialization. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] dpdTxChannelMask - One or multiple Tx channel selection to capture configuration +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdPathdelayResetSeed(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask); + +#endif /* _ADI_ADRV904X_DFE_DPD_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_framework_tracking_cal_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_framework_tracking_cal_t.h new file mode 100644 index 00000000000..1e83fd440a2 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_framework_tracking_cal_t.h @@ -0,0 +1,137 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adi_adrv904x_dfe_framework_tracking_cal_t.h + * + * \brief Contains ADRV904X Tracking Cal Types Download File data structures. + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef ADRV904X_DFE_FRAMEWORK_TRACKING_CAL_T_H__ +#define ADRV904X_DFE_FRAMEWORK_TRACKING_CAL_T_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_dfe_svc_err_object_ids_t.h" + + +#define ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKING_CAL_NUM_OF_CHANNELS 8U /*!< Number of DFE tracking cal channels */ +#define ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKING_CAL_MAX_NUM_ERROR_CODES_TO_PAUSE_CAL (4U) +#define ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKING_CAL_MAX_NUM_DPD_CAPTURE_BUFS_TO_STORE (8U) +/** + * \brief DFE firmware calibration object IDs + */ +#define ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_VSWR (ADI_ADRV904X_DFE_SVC_ERR_OBJID_CAL_START) /*!< Object ID for VSWR cal */ +#define ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_CFR (ADI_ADRV904X_DFE_SVC_ERR_OBJID_CAL_START + 1) /*!< Object ID for CFR cal */ +#define ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD (ADI_ADRV904X_DFE_SVC_ERR_OBJID_CAL_START + 2) /*!< Object ID for DPD cal */ +#define ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_EXT_DFE (ADI_ADRV904X_DFE_SVC_ERR_OBJID_CAL_START + 3) /*!< Object ID for external DFE cal */ + + +/* Subtract the first tracking cal object ID to convert object ID to array index */ +#define ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKING_CAL_OBJ_TO_IDX(x) ((x) - ADI_ADRV904X_DFE_SVC_ERR_OBJID_CAL_START) /*!< Macro for Object ID to index conversion */ + +/* Add the first tracking cal object ID to convert array index to object ID */ +#define ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKING_CAL_IDX_TO_OBJ(x) ((x) + ADI_ADRV904X_DFE_SVC_ERR_OBJID_CAL_START) /*!< Macro for index to Object ID conversion */ + + +/*! Calibration status type */ +typedef enum adi_adrv904x_DfeAppFrameworkTrackingCalStatusType +{ + ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_STATUS_COMMON, /*!< Common calibration status */ + ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_STATUS_SPECIFIC, /*!< Calibration-specific status */ + ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_STATUS_PRIVATE, /*!< Private calibration-specific status */ + ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_STATUS_EXTENDED, /*!< Calibration-extended status */ + ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_STATUS_NUM_STATUS +} adi_adrv904x_DfeAppFrameworkTrackingCalStatusType_e; + +/** + * \brief DFE Tracking calibration types + */ +typedef enum adi_adrv904x_DfeAppFrameworkTrackingCalType +{ + ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_TYPE_VSWR = 0, /*!< VSWR tracking cal */ + ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_TYPE_CFR = 1, /*!< CFR tracking cal */ + ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_TYPE_DPD = 2, /*!< DPD tracking cal */ + ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_TYPE_EXT_DFE = 3, /*!< EXT DFE dumming tracking cal */ + NUM_TRACKCAL_TYPES = 4 /*!< Number of Tracking Calibration Types */ +} adi_adrv904x_DfeAppFrameworkTrackingCalType_e; + +/** + * \brief DFE Tracking calibration mask + */ +typedef enum adi_adrv904x_DfeAppFrameworkTrackingCalibrationMask +{ + ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_TX_VSWR_MASK = 1 << ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_TYPE_VSWR, /*!< VSWR Tracking calibration */ + ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_TX_CFR_MASK = 1 << ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_TYPE_CFR, /*!< CFR Tracking calibration */ + ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_TX_DPD_MASK = 1 << ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_TYPE_DPD, /*!< DPD Tracking calibration */ + ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_TX_EXT_DFE_MASK = 1 << ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_TYPE_EXT_DFE, /*!< EXT DFE Tracking calibration */ +} adi_adrv904x_DfeAppFrameworkTrackingCalibrationMask_e; + +/** + * \brief DFE Tracking Calibration enable/disable types + */ +typedef enum adi_adrv904x_DfeAppTrackingCalEnableDisable +{ + ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_DISABLE = 0, /*!< DFE Framework tracking cal disable */ + ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_ENABLE = 1 /*!< DFE Framework tracking cal enable */ +} adi_adrv904x_DfeAppTrackingCalEnableDisable_e; + +typedef uint32_t adi_adrv904x_DfeAppFrameworkTrackingCalType_t; /*!< adi_adrv904x_DfeAppFrameworkTrackingCalType_e translation for API size */ +typedef uint32_t adi_adrv904x_DfeAppTrackingCalEnableDisable_t; /*!< adi_adrv904x_DfeAppTrackingCalEnableDisable_e translation for API size */ +typedef uint32_t adi_adrv904x_DfeAppFrameworkTrackingCalStateFlag_t; /*!< adi_adrv904x_DfeAppFrameworkTrackingCalStateFlag_e translation for API size */ +typedef uint32_t adi_adrv904x_DfeAppFrameworkTrackingCalibrationMask_t; /*!< adi_adrv904x_DfeAppFrameworkTrackingCalibrationMask_e translation for API size */ + +/** + * \brief Data structure to hold tracking calibration enable masks + */ +ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppFrameworkTrackingCalEnableMasks +{ + adi_adrv904x_DfeAppFrameworkTrackingCalibrationMask_t enableMask[ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKING_CAL_NUM_OF_CHANNELS]; /*!< enableMask; Array of tracking cal masks per channel */ +} adi_adrv904x_DfeAppFrameworkTrackingCalEnableMasks_t; +ADI_ADRV904X_PACK_FINISH + + +/** + * \brief Data structure to hold tracking calibration state information + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppFrameworkTrackingCalState +{ + adi_adrv904x_DfeAppFrameworkTrackingCalibrationMask_t calError[ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKING_CAL_NUM_OF_CHANNELS]; /*!< calError; Array of tracking cal errors per channel */ + adi_adrv904x_DfeAppFrameworkTrackingCalStateFlag_t calState[ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKING_CAL_NUM_OF_CHANNELS][NUM_TRACKCAL_TYPES]; /*!< calError; Array of tracking cal states per cal and channel */ +} adi_adrv904x_DfeAppFrameworkTrackingCalState_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to Set Capture Buffers Access parameters + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppFrameworkTrackingCalCapBufAccessSet +{ + uint8_t stopAfterCapDone; /*!< Skip the following captures and updates after captures are complete for that iteration */ + uint32_t errCodes[ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKING_CAL_MAX_NUM_ERROR_CODES_TO_PAUSE_CAL]; /*!< Array of error codes to pause the cal with capture data */ + uint8_t releaseCapBuf; /*!< Release capture buffers and continue routine capture and updates, this will also clear capIsDone state */ +} adi_adrv904x_DfeAppFrameworkTrackingCalCapBufAccessSet_t; +ADI_ADRV904X_PACK_FINISH + + +/** + * \brief Data structure to Read Capture Buffer Access State and Buffers + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeAppFrameworkTrackingCalCapBufAccessGet +{ + uint8_t capIsDone; /*!< FW will set this bit to indicate cal thread is paused and capture data is ready */ + uint8_t num; /*!< Number of valid captures in pMem array */ + uint64_t pMem[ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKING_CAL_MAX_NUM_DPD_CAPTURE_BUFS_TO_STORE]; /*!< Array of capture buffers */ +} adi_adrv904x_DfeAppFrameworkTrackingCalCapBufAccessGet_t; +ADI_ADRV904X_PACK_FINISH + +#endif /* ADRV904X_DFE_FRAMEWORK_TRACKING_CAL_T_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_osal_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_osal_t.h new file mode 100644 index 00000000000..19929d7e54d --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_osal_t.h @@ -0,0 +1,48 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adi_adrv904x_dfe_osal_t.h + * + * \brief Contains shared types used for OSAL CPU load logging. + * \details Contains typedef which are shared between the BBIC and DFE and used for logging OSAL CPU load information. + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADI_ADRV904X_DFE_OSAL_T_H__ +#define __ADI_ADRV904X_DFE_OSAL_T_H__ + +#include +#include "adi_adrv904x_platform_pack.h" + + +/** \brief The number of processor cores on the DFE CPU */ +#define ADI_ADRV904X_DFE_CPU_MAX_CORES (4u) + + +ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeCpuLoad +{ + uint8_t core[ADI_ADRV904X_DFE_CPU_MAX_CORES]; /**< The load of each DFE CPU core, in units of percent */ + uint8_t total; /**< The load of the entire DFE CPU, in units of percent */ +} adi_adrv904x_DfeCpuLoad_t; +ADI_ADRV904X_PACK_FINISH + + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeCpuAndMemLoad +{ + adi_adrv904x_DfeCpuLoad_t cpuLoad; /**< The load of the entire and each DFE CPU, in units of percent */ + uint32_t memAvailable; /**< The RAM available for the entire DFE CPU, in units of byte */ + uint32_t memAllocated; /**< The RAM allocated for the entire DFE CPU, in units of byte */ +} adi_adrv904x_DfeCpuAndMemLoad_t; +ADI_ADRV904X_PACK_FINISH + +#endif + + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_sbet.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_sbet.h new file mode 100644 index 00000000000..0c053e2d766 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_sbet.h @@ -0,0 +1,121 @@ +/** +* Copyright 2023 - 2023 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_dfe_sbet.h +* \brief Contains ADRV904X SBET function prototypes for +* adi_adrv904x_dfe_sbet.c +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#ifndef _ADI_ADRV904X_DFE_SBET_H_ +#define _ADI_ADRV904X_DFE_SBET_H_ + +#include "adi_adrv904x_dfe_sbet_types.h" +#include "adi_adrv904x_error.h" +#include "adi_common_error_types.h" + +/** +* \brief Configures CFR thresholds for SBET feature. +* +* \pre This function is called after the device has been initialized. User can configure threshold +* for selected configuration set/s. It's users responsibility not to change the thresholds of active +* configuration set during runtime. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] cfrThrConfig - Pointer to threshold configuration data structure to be applied selected Tx channels +* Same configuration will be applied to all 3 engines +* \param[in] hardClipperThreshold - hard clipper thresldhold value used for sbet feature. +* \param[in] cfrTxChannelMask - One or multiple Tx channel selection to apply threshold configuration +* \param[in] cfrPowerIndex - Cfr Power Index selection. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SbetCfrThresholdSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CfrThrConfig_t* const cfrThrConfig, + const uint32_t hardClipperThreshold, + const uint32_t cfrTxChannelMask, + const uint32_t cfrPowerIndex); +/** +* \brief Configures the mapping of DPD to CFR model index for SBET feature. +* +* \pre This function is called after the device has been initialized. User can configure a different +* DPD to CFR model index mapping. It's users responsibility not to change the mapping during runtime. +* The following three configurations are supported: +* config 0: dpd 0 --- cfr 0 +* dpd 1 --- cfr 1 +* dpd 2 --- cfr 1 +* dpd 3 --- cfr 1 +* +* config 1: dpd 0 --- cfr 0 +* dpd 1 --- cfr 0 +* dpd 2 --- cfr 1 +* dpd 3 --- cfr 1 +* +* config 2: dpd 0 --- cfr 0 +* dpd 1 --- cfr 0 +* dpd 2 --- cfr 0 +* dpd 3 --- cfr 1 +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] cfrTxChannelMask - One or multiple Tx channel selection to apply mapping configuration +* \param[in] mapping - SBET mapping of dpd model and cfr model. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SbetCfrMappingSet(adi_adrv904x_Device_t* const device, + const uint32_t cfrTxChannelMask, + const uint32_t mapping); + +/** +* \brief Configures Tx Attenuation for SBET feature. +* +* \pre This function is called after the device has been initialized. User can configure tx attenuation +* for selected tx channel/s. It will be applied when tx on is active and sbet feature enabled. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] configTx - Pointer to sbet tx attenuation configuration data structure to be applied to selected Tx channels +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SbetTxAttenSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SbetTxAtten_t * const configTx); +/** +* \brief retrieves Tx Attenuation for SBET feature. +* +* \pre This function is called after the device has been initialized. User can get tx attenuation +* for selected tx channel/s. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in,out] configTx - Pointer to sbet tx attenuation configuration data structure to be applied to selected Tx channels +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SbetTxAttenGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SbetTxAtten_t* const configTx); + +#endif /* _ADI_ADRV904X_DFE_SBET_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_sbet_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_sbet_types.h new file mode 100644 index 00000000000..0ef8817c595 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_sbet_types.h @@ -0,0 +1,33 @@ +/** +* Copyright 2023 - 2023 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_dfe_sbet_types.h +* +* \brief Contains ADRV904X data types for on board sbet feature +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#ifndef _ADI_ADRV904X_DFE_SBET_TYPES_H_ +#define _ADI_ADRV904X_DFE_SBET_TYPES_H_ + +#include "adi_adrv904x_user.h" +#include "adi_library_types.h" +#include "adi_adrv904x_platform_pack.h" + +/** +* \brief Data structure to hold Tx attenuation to be used when high power DPD Model Index is selected while using SBET feature +*/ +ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_SbetTxAtten +{ + uint32_t txChannelMask; /*!< Tx Channel mask selection */ + uint16_t txAttenuation_mdB; /*!< Tx Attenuation value to use during Sbet in millidB */ +} adi_adrv904x_SbetTxAtten_t; +ADI_ADRV904X_PACK_FINISH + +#endif /* _ADI_ADRV904X_DFE_SBET_TYPES_H_ */ \ No newline at end of file diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_bbic_bridge_version_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_bbic_bridge_version_t.h new file mode 100644 index 00000000000..994993657f0 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_bbic_bridge_version_t.h @@ -0,0 +1,48 @@ +/** + * Copyright 2020 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adi_adrv904x_dfe_svc_bbic_bridge_version_t.h + * \brief Contains data types for DFE SDK version handling service + * + * DFE SDK API Version: 2.10.0.4 + */ + +#ifndef __ADI_ADRV904X_DFE_SVC_BBIC_BRIDGE_VERSION_T_H__ +#define __ADI_ADRV904X_DFE_SVC_BBIC_BRIDGE_VERSION_T_H__ + +#include +#include "adi_adrv904x_platform_pack.h" + +/** + * \brief Version number and type structure for SDK and application + */ +ADI_ADRV904X_PACK_START +typedef struct +{ + uint32_t majorRev; /*!< Major version number */ + uint32_t minorRev; /*!< Minor version number */ + uint32_t maintRev; /*!< Maintain version number */ + uint32_t buildNum; /*!< Build version number */ + uint32_t buildType; /*!< Build type (0, release; 1, debug) */ +} adi_adrv904x_DfeSvcBbicBridgeVersion_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Revision information structure for SDK + */ + ADI_ADRV904X_PACK_START +typedef struct +{ + uint8_t gitHash[44]; /*!< SDK code repo git commit */ + uint8_t branchInfo[80]; /*!< SDK code repo branch information */ +} adrv904x_DfeSvcBbicBridgeSdkRevision_t; +ADI_ADRV904X_PACK_FINISH + +#endif /* __ADI_ADRV904X_DFE_SVC_BBIC_BRIDGE_VERSION_T_H__ */ + + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_dfe_actuator_cmn_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_dfe_actuator_cmn_t.h new file mode 100644 index 00000000000..0c38cb20411 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_dfe_actuator_cmn_t.h @@ -0,0 +1,48 @@ +/** + * Copyright 2020 - 2021 Analog Devices Inc. + * Released under the ADRV904X Software license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adi_adrv904x_dfe_svc_dfe_actuator_cmn_t.h + * \brief DFE actuator service module definitions and types + * + * DFE SDK API Version: 2.10.0.4 + */ + +#ifndef ADRV904X_DFE_SVC_DFE_ACTUATOR_CMN_T_H_ +#define ADRV904X_DFE_SVC_DFE_ACTUATOR_CMN_T_H_ + +#include +#include "adi_adrv904x_platform_pack.h" + +/** + * \brief Enumerated list of options of GMP and DDR mode + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_DFE_ACT_GMP_DDR_MODE0, /*!< GMP0-50 */ + ADI_ADRV904X_DFE_SVC_DFE_ACT_GMP_DDR_MODE1, /*!< GMP0-32 DDR7-6 DDR8-6 DDR9-6 */ + ADI_ADRV904X_DFE_SVC_DFE_ACT_GMP_DDR_MODE2, /*!< GMP0-38 DDR7-6 DDR9-6 */ + ADI_ADRV904X_DFE_SVC_DFE_ACT_GMP_DDR_MODE3, /*!< GMP0-38 DDR7-4 DDR8-4 DDR9-4 */ + ADI_ADRV904X_DFE_SVC_DFE_ACT_GMP_DDR_MODE4, /*!< GMP0-44 DDR7-6 */ + ADI_ADRV904X_DFE_SVC_DFE_ACT_GMP_DDR_MODE5, /*!< GMP0-44 DDR9-6 */ + ADI_ADRV904X_DFE_SVC_DFE_ACT_GMP_DDR_MODE6, /*!< GMP0-44 DDR7-3 DDR9-3 */ + ADI_ADRV904X_DFE_SVC_DFE_ACT_GMP_DDR_MODE7, /*!< GMP0-32 GMP1-9 DDR7-3 DDR8-3 DDR9-3 */ +} adi_adrv904x_DfeSvcDfeActuatorGmpDdrMode_e; + +typedef uint8_t adi_adrv904x_DfeSvcDfeActuatorGmpDdrMode_t; + +/** + * \brief Data structure to hold actuator saturation info + */ +typedef struct +{ + uint32_t dinsqCalcCmulSat; /*!< Indicates the saturation of cmul for dinsq calculation for DDR */ + uint32_t magnitudeGainSat; /*!< Indicates Magnitude saturation because of mag gain multiplication */ + uint32_t gmpDdrDpSat; /*!< Indicates GMP DDR Datapath Saturation */ +} adi_adrv904x_DfeSvcDfeActuatorSaturation_t; + +#endif /* ADRV904X_DFE_SVC_DFE_ACTUATOR_CMN_T_H_ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_dfe_adaptation_cmn_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_dfe_adaptation_cmn_t.h new file mode 100644 index 00000000000..df3fa7deaa1 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_dfe_adaptation_cmn_t.h @@ -0,0 +1,48 @@ +/** + * Copyright 2020 - 2021 Analog Devices Inc. + * Released under the ADRV904X Software license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adi_adrv904x_dfe_svc_dfe_adaptation_cmn_t.h + * \brief DFE adaptation service module definitions and types + * + * DFE SDK API Version: 2.10.0.4 + */ + +#ifndef ADRV904X_DFE_SVC_DFE_ADAPTATION_CMN_T_H_ +#define ADRV904X_DFE_SVC_DFE_ADAPTATION_CMN_T_H_ + +#include +#include "adi_adrv904x_platform_pack.h" + +/** + * \brief Enumerated list of options of XACC operation mode + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_DFE_XACC_FINAL_DONE = 0U, /*!< Default mode: one final interrupt at the end of XACC */ + ADI_ADRV904X_DFE_SVC_DFE_XACC_INTERMEDIATE_DONE = 1U, /*!< Legacy mode: generate interrupt for each XACC */ +} adi_adrv904x_DfeSvcDfeXaccOpMode_e; + +typedef uint8_t adi_adrv904x_DfeSvcDfeXaccOpMode_t; + +/** + * \brief Data structure to hold configuration parameters of hardware adaptation engines + */ +ADI_ADRV904X_PACK_START +typedef struct +{ + uint16_t xaccMaxIteration; /*!< max number of XACC */ + uint16_t xaccFCount; /*!< feature count */ + uint8_t xaccLeak; /*!< damping factor */ + uint8_t featureFilterEn; /*!< enable/disable feature filtering */ + uint8_t numFilterCoefficients; /*!< number of filter coefficients */ + uint8_t numFilterOutput; /*!< number of filter output */ + adi_adrv904x_DfeSvcDfeXaccOpMode_t xaccLegacyMode; /*!< operation mode */ +} adi_adrv904x_DfeSvcDfeAdaptationCfg_t; +ADI_ADRV904X_PACK_FINISH + +#endif /* ADRV904X_DFE_SVC_DFE_ADAPTATION_CMN_T_H_ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_dfe_capture_cmn_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_dfe_capture_cmn_t.h new file mode 100644 index 00000000000..a0a7ac037b8 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_dfe_capture_cmn_t.h @@ -0,0 +1,309 @@ +/** + * Copyright 2020 - 2023 Analog Devices Inc. + * Released under the ADRV904X Software license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adi_adrv904x_dfe_svc_dfe_capture_cmn_t.h + * \brief DFE capture service module definitions and types + * + * DFE SDK API Version: 2.10.0.4 + */ + +#ifndef ADRV904X_DFE_SVC_DFE_CAPTURE_CMN_T_H_ +#define ADRV904X_DFE_SVC_DFE_CAPTURE_CMN_T_H_ + +#include +#include "adi_adrv904x_platform_pack.h" + +/** + * \brief Define maximum number of DPD capture buffers + */ +#define DPD_NUM_CAPTURE_BUFFER_MAX (8u) + +/** + * \brief Enumerated list of options to select capture channel source + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_CH_SRC_SEL_TX, /*!< Tx capture channel */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_CH_SRC_SEL_ALT_TX, /*!< Alt Tx capture channel */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_CH_SRC_SEL_ORX, /*!< ORx capture channel */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_NUM_OF_CH_SRC_SEL /*!< Num of capture channels */ +} adi_adrv904x_DfeSvcDfeCaptureChSrcSel_e; + +/** + * \brief Enumerated list of options to select Rx capture channel source + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_DFE_RX_CAPTURE_CH_SRC_SEL_RX, /*!< Rx capture channel */ + ADI_ADRV904X_DFE_SVC_DFE_RX_CAPTURE_CH_SRC_SEL_ALT_RX, /*!< Alt Rx capture channel */ + ADI_ADRV904X_DFE_SVC_DFE_RX_CAPTURE_NUM_OF_CH_SRC_SEL /*!< Num of capture channels */ +} adi_adrv904x_DfeSvcDfeRxCaptureChSrcSel_e; + +/** + * \brief Defines the capture type being requested. + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_IDLE, /*!< Nothing to capture. */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_FWD_VSWR, /*!< Forward VSWR capture requested. */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_REV_VSWR, /*!< Reverse VSWR capture requested. */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_CLGC, /*!< CLGC capture type requested. */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_DPD_CT, /*!< DPD CT capture type requested. */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_DPD_SIGSTAT, /*!< DPD Sig Stat capture type requested. */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_DPD_ONPASS, /*!< DPD On Pass capture type requested. */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_DPD_REQUEST, /*!< DPD capture type requested. This capture uses FWD path for Orx channel */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_DPD_REV_REQUEST, /*!< DPD capture type requested. This capture uses REV path for Orx channel */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_PWR_MEAS_FWD, /*!< Tx+ORx+Rx Power measurement with ORx FWD direction requested. This capture type should only be used in radio sequencer mode */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_PWR_MEAS_REV, /*!< Tx+ORx+Rx Power measurement with ORx REV direction requested. This capture type should only be used in radio sequencer mode */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_RX, /*!< Rx capture requested. This capture type should only be used in radio sequencer mode */ + ADI_ADRV904X_DFE_SVC_DFE_NUM_OF_CAPTURE_TYPES /*!< Number of capture types. */ +} adi_adrv904x_DfeSvcDfeCaptureType_e; + +/** + * \brief Enumerated list of options to select capture trigger source + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_TRIG_SRC_SW, /*!< SW trigger */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_TRIG_SRC_RADIO, /*!< Radio sequencer trigger */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_TRIG_SRC_GPIO, /*!< GPIO trigger */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_TRIG_SRC_SLICE, /*!< Slice trigger */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_NUM_TRIG_TYPES /*!< Number of trigger source types */ +} adi_adrv904x_DfeSvcDfeCaptureTrigSrc_e; + +/** + * \brief Enumerated list of options to select capture point + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_PT_PRE_CFR, /*!< select pre CFR data */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_PT_PRE_DPD, /*!< select pre DPD input */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_PT_POST_DPD, /*!< select post DPD output */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_PT_CT_DPD, /*!< CT_DPD capture mode */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_PT_NO_CAPTURE, /*!< no capture mode, zeros on bus to save power */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_NUM_PT_TYPES /*!< Number of capture point types */ +} adi_adrv904x_DfeSvcDfeCapturePoint_e; + +/** + * \brief Enumerated list of options to select Rx capture point + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_DFE_RX_CAPTURE_PT_DC_OFFSET, /*!< select DC offset data */ + ADI_ADRV904X_DFE_SVC_DFE_RX_CAPTURE_PT_HB2_INPUT, /*!< select HB2 input */ + ADI_ADRV904X_DFE_SVC_DFE_RX_CAPTURE_PT_QFIR_OUTPUT, /*!< select QFIR output */ + ADI_ADRV904X_DFE_SVC_DFE_RX_CAPTURE_PT_QFIR_INPUT, /*!< select QFIR input */ + ADI_ADRV904X_DFE_SVC_DFE_RX_CAPTURE_NUM_PT_TYPES /*!< Number of capture point types */ +} adi_adrv904x_DfeSvcDfeRxCapturePoint_e; + +/** + * \brief Enumerated list for generic capture period types. + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_POWER_MEAS_DIR_REV, /*!< Orx Power measurement REV direction */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_POWER_MEAS_DIR_FWD, /*!< Orx Power measurement FWD direction */ +} adi_adrv904x_DfeSvcDfeCapturePowerMeasDir_e; + +/** + * \brief Enumerated list of capture target DPD model indexes. + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_TARGET_DPD_MODEL_INDEX_ANY, /*!< Capture target DPD model index any */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_TARGET_DPD_MODEL_INDEX_0, /*!< Capture target DPD model index 0 */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_TARGET_DPD_MODEL_INDEX_1, /*!< Capture target DPD model index 1 */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_TARGET_DPD_MODEL_INDEX_2, /*!< Capture target DPD model index 2 */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_TARGET_DPD_MODEL_INDEX_3, /*!< Capture target DPD model index 3 */ +} adi_adrv904x_DfeSvcDfeCaptureTargetDpdModelIndex_e; + +/** + * \brief Enumerated list of SBET capture ingore count work type. + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_IGNORE_WITHOUT_CHECKING_MATCH_MODEL, /*!< Ignore count without checking the match model */ + ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_IGNORE_CHECKING_MATCH_MODEL, /*!< Ignore count with checking the match model */ +}adi_adrv904x_DfeSvcDfeCaptureIgnCntMode_e; + +/** + * \brief Data structure to hold sbet parameter. + */ +ADI_ADRV904X_PACK_START +typedef struct +{ + adi_adrv904x_DfeSvcDfeCaptureTargetDpdModelIndex_e targetDpdModelIndex; /*!< sbet target model */ + adi_adrv904x_DfeSvcDfeCaptureIgnCntMode_e ignCntMode; /*!< sbet ignore count mode: 0- without checking model 1- checking model */ + uint8_t ignCnt; /*!< sbet ignore count 0 ~ 255 */ +} adi_adrv904x_DfeSvcDfeCaptureSbetParameter_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold configuration parameters of the stop-on-pass capture + */ + ADI_ADRV904X_PACK_START +typedef struct +{ + uint16_t peakPowerThreshHigh; /*!< peak power high threshold */ + uint16_t peakPowerThreshLow; /*!< peak power low threshold */ + uint32_t sumPowerThreshHigh; /*!< sum power high threshold */ + uint32_t sumPowerThreshLow; /*!< sum power low threshold */ + uint32_t instPowerThresh; /*!< instantaneous power power threshold */ + uint16_t maxNumSamplesAbvThresh; /*!< maximum number of samples above sample power threshold */ + uint16_t minNumSamplesAbvThresh; /*!< minimum number of samples above sample power threshold */ + uint16_t iirPwrThreshHigh; /*!< IIR power at the center high threshold */ + uint16_t iirPwrThreshLow; /*!< IIR power at the center low threshold */ + uint8_t capStopOnPassCriteria; /*!< pass criteria bit 0-8 */ +} adi_adrv904x_DfeSvcDfeCaptureStopOnPassCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold capture channel source selections + */ + ADI_ADRV904X_PACK_START +typedef struct +{ + adi_adrv904x_DfeSvcDfeCaptureChSrcSel_e ch0; /*!< capture channel 0 source selection */ + adi_adrv904x_DfeSvcDfeCaptureChSrcSel_e ch1; /*!< capture channel 1 source selection */ + adi_adrv904x_DfeSvcDfeCaptureChSrcSel_e ch2; /*!< capture channel 2 source selection */ +} adi_adrv904x_DfeSvcDfeCaptureChSrcSel_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold Rx capture channel source selections + */ + ADI_ADRV904X_PACK_START +typedef struct +{ + adi_adrv904x_DfeSvcDfeRxCaptureChSrcSel_e ch0; /*!< capture channel 0 source selection */ + adi_adrv904x_DfeSvcDfeRxCaptureChSrcSel_e ch1; /*!< capture channel 1 source selection */ +} adi_adrv904x_DfeSvcDfeRxCaptureChSrcSel_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold capture channel delay settings + */ + ADI_ADRV904X_PACK_START +typedef struct +{ + uint16_t ch0; /*!< capture channel 0 align cycle */ + uint16_t ch1; /*!< capture channel 1 align cycle */ + uint16_t ch2; /*!< capture channel 2 align cycle */ +} adi_adrv904x_DfeSvcDfeCaptureChDelay_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold Rx capture channel delay settings + */ + ADI_ADRV904X_PACK_START +typedef struct +{ + uint16_t ch0; /*!< capture channel 0 align cycle */ + uint16_t ch1; /*!< capture channel 1 align cycle */ +} adi_adrv904x_DfeSvcDfeRxCaptureChDelay_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold configuration parameters of the frame delay capture + */ + ADI_ADRV904X_PACK_START +typedef struct +{ + uint8_t frameDelayEn; /*!< frame delay capture enable (i.e. Tx on capture) */ + uint8_t frameDelayRestartCtrl; /*!< frame delay restart control (0: on capture buffer trigger rising edge, 1: on capture buffer enable rising edge.) */ + uint32_t frameDelay; /*!< frame delay (i.e. delay from edge of the frame) */ + uint32_t frameRollover; /*!< period of frame counter 10-100ms */ +} adi_adrv904x_DfeSvcDfeCaptureFrameDelayCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold configuration parameters of the peak detect capture + */ + ADI_ADRV904X_PACK_START +typedef struct +{ + uint32_t windowLength; /*!< peak search window length */ + uint8_t peakDetIIRDecay; /*!< peak detect IIR decay */ + uint8_t peakDetIIRByp; /*!< peak detect IIR bypass */ + uint8_t peakDetIIREn; /*!< peak detect IIR enable */ + uint8_t peakDetEn; /*!< peak detect enable */ +} adi_adrv904x_DfeSvcDfeCapturePeakDetCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold configuration parameters of the capture statistics control + */ + ADI_ADRV904X_PACK_START +typedef struct +{ + uint8_t statsIIRByp; /*!< stats IIR bypass */ + uint8_t statsIIRDecay; /*!< stats IIR decay */ +} adi_adrv904x_DfeSvcDfeCaptureStatsCtrlCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold configuration parameters of the burst capture + */ + ADI_ADRV904X_PACK_START +typedef struct +{ + uint16_t burstCount; /*!< capture burst count */ + uint32_t burstSpace; /*!< capture burst spacing */ +} adi_adrv904x_DfeSvcDfeCaptureBurstCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold configuration parameters of the VSWR signal accumulation + */ + ADI_ADRV904X_PACK_START +typedef struct +{ + uint32_t accumNumIter; /*!< number of accumulation iterations (Max value = 4194303) */ + uint16_t accumLen; /*!< accumulation length (Max value = 2046). When VSWR playback is being used, user should configure + * accumLen = Playback data length * Orx sample rate / Cfr output sample rate. + * When accumLen is configured to be an odd number capture buffer will output one extra + * I sample which needs to be skipped. For details, please check how VSWR cal thread handles + * capture buffer data*/ +} adi_adrv904x_DfeSvcDfeCaptureVswrAccumCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold capture data status + */ + ADI_ADRV904X_PACK_START +typedef struct +{ + uint32_t statsPeakPwr; /*!< peak power within a capture */ + uint32_t statsNumSampAbvThresh; /*!< Number of samples above threshold */ + uint32_t statsIIRPwrCapMid; /*!< IIR leaky integrator output sampled at 1/2 of capture length */ + uint32_t statsMaxIIRPwr; /*!< Max of IIR leaky integrator output over the capture length */ + uint32_t statsMinIIRPwr; /*!< Min of IIR leaky integrator output over the capture length */ + uint32_t completedCount; /*!< completed capture count */ + uint32_t completedNumIter; /*!< VSWR completed number of accumulations */ + uint32_t errorStatus; /*!< error status, see ADI_ADRV904X_DFE_SVC_DFE_ERROR define above */ + uint32_t peakPos; /*!< peak position */ + uint64_t tssiTx1Power; /*!< TSSI 1 Tx power measurement */ + uint64_t tssiTx2Power; /*!< TSSI 2 Tx power measurement (Possible future) */ + uint64_t tssiOrxPower; /*!< TSSI Orx power measurement */ +} adi_adrv904x_DfeSvcDfeCaptureStats_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold IIR states for the requested blocks + */ + ADI_ADRV904X_PACK_START +typedef struct +{ + uint8_t iirStateValid; /*!< 1: If IIR states are valid, 0:If IIR states are invalid */ + uint8_t iirStateMask[8]; /*!< Shows which rows/columns used to read IIR state from.Byte0:Row0,.. Byte7:Row7 + * For each byte, Bit0:Column0,... Bit7:Column7*/ + uint32_t iirState[8][8]; /*!< IIR states for each column/row. Format:3.18.. TODO: Use a macro instead of 8 */ +} adi_adrv904x_DfeSvcDfeCaptureIIRStates_t; +ADI_ADRV904X_PACK_FINISH + +#endif /* ADRV904X_DFE_SVC_DFE_CAPTURE_CMN_T_H_ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_dfe_ctc_actuator_cmn_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_dfe_ctc_actuator_cmn_t.h new file mode 100644 index 00000000000..408bcb745aa --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_dfe_ctc_actuator_cmn_t.h @@ -0,0 +1,89 @@ +/** + * Copyright 2023 Analog Devices Inc. + * Released under the ADRV904X Software license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adi_adrv904x_dfe_svc_dfe_ctc_actuator_cmn_t.h + * \brief DFE CTC actuator service module definitions and types + * + * DFE SDK API Version: 2.10.0.4 + */ + +#ifndef ADRV904X_DFE_SVC_DFE_CTC_ACTUATOR_CMN_T_H_ +#define ADRV904X_DFE_SVC_DFE_CTC_ACTUATOR_CMN_T_H_ + +#include +#include "adi_adrv904x_platform_pack.h" + +#define ADI_ADRV904X_DFE_SVC_DFE_CTC_ACT_MAX_NUM_ROW (8u) +#define ADI_ADRV904X_DFE_SVC_DFE_CTC_ACT_MAX_NUM_DEC (4u) + +/** + * \brief Enumerated list of decimator selections + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_DFE_CTC_ACT_DECIMATOR_0, /*!< CTC actuator first decimator */ + ADI_ADRV904X_DFE_SVC_DFE_CTC_ACT_DECIMATOR_1, /*!< CTC actuator second decimator */ + ADI_ADRV904X_DFE_SVC_DFE_CTC_ACT_DECIMATOR_2, /*!< CTC actuator third decimator */ + ADI_ADRV904X_DFE_SVC_DFE_CTC_ACT_DECIMATOR_3, /*!< CTC actuator fourth decimator */ + ADI_ADRV904X_DFE_SVC_DFE_CTC_ACT_NUM_DECIMATORS /*!< Number of decimators */ +} adi_adrv904x_DfeSvcDfeCtcActuatorDecimator_e; + +/** + * \brief Enumerated list of input soruce selections + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_DFE_CTC_ACT_INPUT_CFR_IN, /*!< CFR input as CTC input data */ + ADI_ADRV904X_DFE_SVC_DFE_CTC_ACT_INPUT_CFR_ENG0_OUT, /*!< CFR ENG0 output as CTC input data */ + ADI_ADRV904X_DFE_SVC_DFE_CTC_ACT_INPUT_CFR_ENG1_OUT, /*!< CFR ENG1 output as CTC input data */ + ADI_ADRV904X_DFE_SVC_DFE_CTC_ACT_INPUT_CFR_ENG2_OUT, /*!< CFR ENG2 output as CTC input data */ + ADI_ADRV904X_DFE_SVC_DFE_CTC_ACT_NUM_INPUTS /*!< Number of inputs */ +} adi_adrv904x_DfeSvcDfeCtcActuatorInput_e; + +/** + * \brief Data structure to hold the configurations per row + */ +ADI_ADRV904X_PACK_START +typedef struct +{ + uint8_t kPower; /*!< power order of the sample magnitude */ + uint8_t numOfCols; /*!< number of IIR columns in a row (The first column is the low-pass IIR filter and the subsequent columns are all-pass IIR filters) */ + double fLutAddrScale; /*!< ensure that all fLut entries are used for each row*/ + double tau; /*!< L0B0, L0A1, L1B0, L1B1, and L1A1 can be derived from a particular tau */ + adi_adrv904x_DfeSvcDfeCtcActuatorDecimator_e decSelect; /*!< Decimator select for this row */ +} adi_adrv904x_DfeSvcDfeCtcActuatorRowConfig_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold configurations per decimator + */ + ADI_ADRV904X_PACK_START +typedef struct +{ + double kLutAddrScale; /*!< ensure that all kLUT entries are used */ + double absScale; /*!< scale the envelop, for better estimation (improving the condition number of the matrix) and actuation */ + double absOffset; /*!< shifting the output of IIR filters so that the values are all positive and have proper addressing for the kLUT contents */ + uint8_t decRatio; /*!< CIC decimation ratio, Can be used to calculate gain compensation */ +} adi_adrv904x_DfeSvcDfeCtcActuatorDecConfig_t; +ADI_ADRV904X_PACK_FINISH +/** + * \brief Data structure to hold model configuration parameters + */ + ADI_ADRV904X_PACK_START +typedef struct +{ + uint8_t numOfCicDec; /*!< number of CIC decimatiors, upto ADI_ADRV904X_DFE_SVC_DFE_CTC_MAX_NUM_DEC */ + adi_adrv904x_DfeSvcDfeCtcActuatorDecConfig_t decConfig[ADI_ADRV904X_DFE_SVC_DFE_CTC_ACT_MAX_NUM_DEC]; /*!< configurations per decimator */ + adi_adrv904x_DfeSvcDfeCtcActuatorInput_e ctcInputSel; /*!< select CTC input data source */ + uint8_t numOfRows; /*!< number of rows, upto ADI_ADRV904X_DFE_SVC_DFE_CTC_ACT_MAX_NUM_ROW */ + adi_adrv904x_DfeSvcDfeCtcActuatorRowConfig_t rowCfg[ADI_ADRV904X_DFE_SVC_DFE_CTC_ACT_MAX_NUM_ROW]; /*!< Configurations per row */ +} adi_adrv904x_DfeSvcDfeCtcActuatorModelCfg_t; +ADI_ADRV904X_PACK_FINISH +#endif /* ADRV904X_DFE_SVC_DFE_CTC_ACTUATOR_CMN_T_H_ */ + + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_dfe_pwr_mtr_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_dfe_pwr_mtr_t.h new file mode 100644 index 00000000000..2d900d9d336 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_dfe_pwr_mtr_t.h @@ -0,0 +1,345 @@ +/** + * Copyright 2020 - 2021 Analog Devices Inc. + * Released under the ADRV904X Software license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adi_adrv904x_dfe_svc_dfe_pwr_mtr_t.h + * \brief DFE power meter service module definitions and types + * + * DFE SDK API Version: 2.10.0.4 + */ + +#ifndef ADRV904X_DFE_SVC_DFE_PWR_MTR_T_H_ +#define ADRV904X_DFE_SVC_DFE_PWR_MTR_T_H_ + +#include +#include +#include "adi_adrv904x_platform_pack.h" + +/** + * \brief Enumerated list of options to select the TSSI power meter + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_TSSI_TX_1, /*!< Tx TSSI 1 power meter */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_TSSI_TX_2, /*!< Tx TSSI 2 power meter */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_TSSI_ORX, /*!< ORx TSSI power meter */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_TSSI_CDUC_1, /*!< Tx CDUC TSSI 1 power meter */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_TSSI_CDUC_2, /*!< Tx CDUC TSSI 2 power meter */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_TSSI_CDUC_3, /*!< Tx CDUC TSSI 3 power meter */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_TSSI_CDUC_4, /*!< Tx CDUC TSSI 4 power meter */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_TSSI_CDUC_5, /*!< Tx CDUC TSSI 5 power meter */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_TSSI_CDUC_6, /*!< Tx CDUC TSSI 6 power meter */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_TSSI_CDUC_7, /*!< Tx CDUC TSSI 7 power meter */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_TSSI_CDUC_8, /*!< Tx CDUC TSSI 8 power meter */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_NUM_TSSI_METERS, /*!< number of TSSI meters */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_NUM_CLGC_METERS = ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_TSSI_ORX + 1, /*!< Number of TSSI meters for CLGC power measurements */ +} adi_adrv904x_DfeSvcDfePwrMtrTssi_e; + +/** + * \brief Enumerated list of options to select the RSSI power meter + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_RSSI_RX_DDC_0, /*!< Rx DDC RSSI 0 power meter */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_RSSI_RX_DDC_1, /*!< Rx DDC RSSI 1 power meter */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_RSSI_CDDC_1, /*!< Rx CDDC RSSI 1 power meter */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_RSSI_CDDC_2, /*!< Rx CDDC RSSI 2 power meter */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_RSSI_CDDC_3, /*!< Rx CDDC RSSI 3 power meter */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_RSSI_CDDC_4, /*!< Rx CDDC RSSI 4 power meter */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_RSSI_CDDC_5, /*!< Rx CDDC RSSI 5 power meter */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_RSSI_CDDC_6, /*!< Rx CDDC RSSI 6 power meter */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_RSSI_CDDC_7, /*!< Rx CDDC RSSI 7 power meter */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_RSSI_CDDC_8, /*!< Rx CDDC RSSI 8 power meter */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_NUM_RSSI_METERS, /*!< number of RSSI meters */ +} adi_adrv904x_DfeSvcDfePwrMtrRssi_e; + +/** + * \brief Enumerated list of options to select the TX TSSI power meter input source + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_PRE_DPD_HB1_OUT, /*!< 0: TSSI 1: pre-DPD HB1 output */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_PRE_DPD_HB2_OUT_AFTER_HC, /*!< 1: TSSI 1: pre-DPD HB2 output after hard clipper */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_CFR_IN, /*!< 2: TSSI 2: CFR input */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_CFR_OUT, /*!< 3: TSSI 2: CFR output */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_POST_DPD_HB1_OUT, /*!< 4: TSSI 2: post-DPD HB1 output */ + ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_TSSI_NUM_SOURCES /*!< 5: number of Tx sources */ +} adi_adrv904x_DfeSvcDfePwrMtrTssiSrc_e; + +/** + * \brief Typedefs for TSSI done registered callback functions + * + * \param [in] chanNum - channel number + * \param [in] pwrTssiMeasLinear - power measurement results for ORX and Tx TSSIs (linear) + * \param [in] pwrTxTssiSuccessfulFlags - Successful flags bitmask b10:Tx TSSI1, b9:Tx TSSI2, b8:Orx TSSI, b7-0: Carrier TSSI-8 + */ +typedef void (*adi_adrv904x_DfeSvcTssiPwrMtrDoneCallback_t)(const uint8_t chanNum, + uint64_t pwrTssiMeasLinear[ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_NUM_TSSI_METERS], + uint32_t pwrTxTssiSuccessfulFlags); + +/** + * \brief Typedefs for RSSI done registered callback functions + * + * \param [in] chanNum - channel number + * \param [in] pwrRssiMeasLinear - power measurement results for Rx RSSIs (linear) + * \param [in] pwrRxRssiSuccessfulFlags - Successful flags bitmask b9:Rx Band0 RSSI, b8: Rx Band1 RSSI, b7-0: Carrier RSSI-8 + */ +typedef void (*adi_adrv904x_DfeSvcRssiPwrMtrDoneCallback_t)(const uint8_t chanNum, + uint64_t pwrRssiMeasLinear[ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_NUM_RSSI_METERS], + uint32_t pwrRxRssiSuccessfulFlags); +/** + * \brief Data structure to hold TSSI power meter configuration parameters + */ +ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeSvcDfePwrMtrTssiCfg +{ + uint8_t resetAtGainChange; /*!< measurement reset at gain change, NA for ORx TSSI (deprecated and unused) */ + uint8_t sourceSelect; /*!< defined in adi_adrv904x_DfeSvcDfePwrMtrTssiSrc_e, NA for ORx TSSI (Only used in ConfigGet) */ + uint8_t radioSeqPinModeEnable; /*!< radio seq control, radio_seq_sel to be >= 1 for ORx */ + uint8_t opMode; /*!< 1: power of 2 meas specified by duration0, 0: non-power of 2 */ + uint8_t measMode; /*!< 0:immediate, 1:Tx on start delay, 2:Tx on stat and wait delay */ + uint16_t startDelay; /*!< delay meas from Tx on edge for meas mode 1 and 2, range: 1 - 0x1FFF */ + uint16_t contDelay; /*!< similar to startDelay, but for 2nd TDD on duration and beyond, range: 1 - 0x3FFF */ + uint32_t waitDelay; /*!< At end of meas, delay the next meas start in FDD/mode 2/manual, range: 1 - 0xFFFFFF */ + uint8_t fddPinMode; /*!< For FDD only, trigger meas start using a GPIO */ + uint8_t duration0; /*!< meas duration0 */ + uint8_t duration1; /*!< meas duration1 */ + uint8_t duration2; /*!< meas duration2 */ + uint8_t duration3; /*!< meas duration3 */ + uint16_t mulFactor0; /*!< non-power of 2 mode, the weight of power calculated for duration 0, range:0-0x3FF */ + uint16_t mulFactor1; /*!< non-power of 2 mode, the weight of power calculated for duration 1, range:0-0x3FF */ + uint16_t mulFactor2; /*!< non-power of 2 mode, the weight of power calculated for duration 2, range:0-0x3FF */ + uint16_t mulFactor3; /*!< non-power of 2 mode, the weight of power calculated for duration 3, range:0-0x3FF */ + uint8_t setLinearThreshold; /*!< in linear mode, set the threshold (0 or 1) */ + uint32_t linearThreshold; /*!< linear threshold (0 - 0xFFFFFFFF) */ + uint8_t enabled; /*!< measurement is enabled (only applies to get configuration and when making Tx pwr measurement + * requests through capture service) */ + uint32_t debug; /*!< For ADI private tests */ + uint32_t captureTimeUsec; /*!< the expected time (usec) it takes to perform a power measurement */ +} adi_adrv904x_DfeSvcDfePwrMtrTssiCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold RSSI (DDC/CDDC) power meter configuration parameters + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeSvcDfePwrMtrRssiCfg +{ + uint8_t enableGainCalc; /*!< include compensation for the gain */ + uint8_t gaintableStepSize; /*!< gain table step size. NA for CDDC RSSI blocks */ + uint8_t resetAtGainChange; /*!< measurement reset at gain change */ + uint8_t radioSeqPinModeEnable; /*!< radio seq control, radio_seq_sel. NA for DDC RSSI blocks */ + uint8_t opMode; /*!< 1: power of 2 meas specified by duration0, 0: non-power of 2 */ + uint8_t measMode; /*!< 0:immediate, 1:Rx on start delay, 2:Rx on stat and wait delay */ + uint16_t startDelay; /*!< delay meas from Rx on edge for meas mode 1 and 2, range: 1 - 0x1FFF */ + uint16_t contDelay; /*!< similar to startDelay, but for 2nd TDD on duration and beyond, range: 1 - 0x3FFF */ + uint32_t waitDelay; /*!< At end of meas, delay the next meas start in FDD/mode 2/manual, range: 1 - 0xFFFFFF */ + uint8_t fddPinMode; /*!< For FDD only, trigger meas start using a GPIO */ + uint8_t duration0; /*!< meas duration0 */ + uint8_t duration1; /*!< meas duration1 */ + uint8_t duration2; /*!< meas duration2 */ + uint8_t duration3; /*!< meas duration3 */ + uint16_t mulFactor0; /*!< non-power of 2 mode, the weight of power calculated for duration 0 , range:0-0xFF for Band RSSI, 0-0x3FF for carrier RSSI */ + uint16_t mulFactor1; /*!< non-power of 2 mode, the weight of power calculated for duration 1 , range:0-0xFF for Band RSSI, 0-0x3FF for carrier RSSI */ + uint16_t mulFactor2; /*!< non-power of 2 mode, the weight of power calculated for duration 2 , range:0-0xFF for Band RSSI, 0-0x3FF for carrier RSSI */ + uint16_t mulFactor3; /*!< non-power of 2 mode, the weight of power calculated for duration 3 , range:0-0xFF for Band RSSI, 0-0x3FF for carrier RSSI */ + uint8_t enabled; /*!< measurement is enabled (only applies to get configuration and when making Tx pwr measurement + * requests through capture service) */ + uint32_t debug; /*!< For ADI private tests */ + uint32_t captureTimeUsec; /*!< the expected time (usec) it takes to perform a power measurement */ +} adi_adrv904x_DfeSvcDfePwrMtrRssiCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold the power measurement results from an RSSI carrier measurement + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeSvcDfePwrMtrRssiMeasResult +{ + uint8_t powerMeasDb; /*!< Power readback (dB) in 0.25 resolution */ + uint64_t powerMeasLinear; /*!< Power readback (36 bits linear) */ +} adi_adrv904x_DfeSvcDfePwrMtrRssiMeasResult_t; +ADI_ADRV904X_PACK_FINISH + +/* + * \brief Data structure to hold the power measurement results from a TSSI measurement + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeSvcDfePwrMtrTssiMeasResult +{ + uint8_t powerMeasDb; /*!< Power readback (dB) in 0.25 resolution */ + uint64_t powerMeasLinear; /*!< Power readback (36 bits linear) */ + uint8_t thresExceeded; /*!< TSSI 1 or 2 threshold exceeded. */ +} adi_adrv904x_DfeSvcDfePwrMtrTssiMeasResult_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold DPD power meter configuration parameters + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeSvcDfePwrMtrDpdCfg +{ + uint8_t dpdInOutPwrMeasDuration; /*!< power measurement duration (range 0 - 24) */ + uint16_t dpdInOutPwrMeasContDlyCntr; /*!< wait before continuing with power measurement after txon */ + uint8_t dpdInOutPwrMeasTDDModeEn; /*!< run power measurement in TDD mode */ + uint8_t dpdInOutPeakToPowerMode; /*!< enable peak-to-power mode */ + uint8_t dpdInOutPwrMeasPause; /*!< power measurement is paused (only used in the GetConfig) */ + uint8_t dpdInOutPwrMeasEn; /*!< power measurement is enabled (only used in the GetConfig) */ +} adi_adrv904x_DfeSvcDfePwrMtrDpdCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold DPD power meter measurements + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeSvcDfePwrMtrDpdResults +{ + uint8_t pwrDpdIn; /*!< pre-DPD power */ + uint8_t peakPwrDpdIn; /*!< pre-DPD peak power */ + uint8_t pwrDpdOut; /*!< post-DPD power */ + uint8_t peakPwrDpdOut; /*!< post-DPD peak power */ +} adi_adrv904x_DfeSvcDfePwrMtrDpdResults_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Enum of Carriers (mask) within a Tx Channel + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_DFE_TX_CARRIER_NONE = 0x00U, + ADI_ADRV904X_DFE_SVC_DFE_TX_CARRIER_0 = 0x01U, + ADI_ADRV904X_DFE_SVC_DFE_TX_CARRIER_1 = 0x02U, + ADI_ADRV904X_DFE_SVC_DFE_TX_CARRIER_2 = 0x04U, + ADI_ADRV904X_DFE_SVC_DFE_TX_CARRIER_3 = 0x08U, + ADI_ADRV904X_DFE_SVC_DFE_TX_CARRIER_4 = 0x10U, + ADI_ADRV904X_DFE_SVC_DFE_TX_CARRIER_5 = 0x20U, + ADI_ADRV904X_DFE_SVC_DFE_TX_CARRIER_6 = 0x40U, + ADI_ADRV904X_DFE_SVC_DFE_TX_CARRIER_7 = 0x80U, + ADI_ADRV904X_DFE_SVC_DFE_TX_CARRIER_ALL = 0xFFU, +} adi_adrv904x_DfeSvcDfeTxCarrier_e; + +/** + * \brief Enum of Bands (mask) within a Tx Channel + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_DFE_TX_BAND_NONE = 0x00U, + ADI_ADRV904X_DFE_SVC_DFE_TX_BAND_0 = 0x01U, + ADI_ADRV904X_DFE_SVC_DFE_TX_BAND_1 = 0x02U, + ADI_ADRV904X_DFE_SVC_DFE_TX_BAND_ALL = 0x03U, +} adi_adrv904x_DfeSvcDfeTxBand_e; + +/** + * \brief Data structure to hold Tx carrier power meter configuration parameters + */ +ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeSvcDfeTxCarrierPowerMeasCfg +{ + uint8_t measDuration; /*!< Number of samples over which power is + * averaged 2^(measDuration); Range 0 - 18 */ + uint16_t measContinueDelayDuration; /*!< For TDD enable only. + * Set the duration to wait before continuing + * with power measurement after txon goes high */ + uint16_t peakToPowerMode; /*!< When this mode is enabled, power for a given + * measurement duration is available in + * the tx_power bit-field. + * Also, the largest peak (I^2+Q^2) within that duration + * is available in the tx_power_largest_peak bit-field. */ + uint32_t inputSelect; /*!< Selection of the data path point for power calculations. + * 0 = chan filter out, 1 = delay matched out, 2 = multiplier out */ + uint8_t tddModeEnable; /*!< 1 = enable TDD mode, 0 = disable TDD mode */ + + uint8_t enable; /*!< Power measurement is enabled (used in get config). */ + uint8_t pause; /*!< Power measurement is paused (used in get config). */ +} adi_adrv904x_DfeSvcDfeTxCarrierPowerMeasCfg_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold the power measurement results from a Tx carrier + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeSvcDfeTxCarrierPowerMeasResult +{ + int32_t power_mdB; /*!< Average power calculated for the measurement duration in mdB */ + + int32_t largestPeak_mdB; /*!< Highest I^2+Q^2 within a given measurement duration. + * This value is available if the tx_peak_to_power_mode bit-field is set 1. + * in mdB with resolution of 0.25dB. */ +} adi_adrv904x_DfeSvcDfeTxCarrierPowerMeasResult_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold the Tx carrier gain control + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeSvcDfeTxCarrierCarrierGain +{ + uint32_t channelMask; /*!< Mask of Tx Channels for carrier gain control */ + uint32_t carrierMask; /*!< Carrier mask for N carriers where N = 8. These enable gainReg[n] */ + + uint32_t gain_mdB[8]; /*!< Gain in mdB */ +} adi_adrv904x_DfeSvcDfeTxCarrierCarrierGain_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold the Tx carrier band attenuation. + * Used to ensure that the aggregated carrier output doesn't exceed the digital fullscale. + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeSvcDfeTxCarrierCarrierBandAttn +{ + uint32_t channelMask; /*!< Tx Channel Mask selection (8 channels) */ + uint32_t bandMask; /*!< Tx Band Mask selection (2 bands) */ + + uint32_t attn_mdB[2]; /*!< Carrier attenuation for bands. In mdB. + * API will convert to Fixed-point attenuation in Q0.8 format + * to support -0.03 dB (255) to -infinity for 0. */ +} adi_adrv904x_DfeSvcDfeTxCarrierCarrierBandAttn_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold the Post DPD gain parameters + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeSvcDfePostDpdGain +{ + uint8_t magGain; /*!< Actuator Magnitude Square Input Gain Range 0-4*FS. Saturated to 1x. + * Data Format: Unsigned Int.Frac=2.6. Unity gain=0x40.*/ + + uint8_t gmpOutShift; /*!< Actuator Output Shift for gmp terms Range 0-15. Add one to double output gain. + * Output is left shifted to accommodate output normalization. + * Default shift is configured for unity coefficient sum of 0x2000 and + * 2 bits of headroom for individual coefficient. When large number of terms + * are used resulting in bit growth, the output gain can be decreased (right shift) + * to the correct the overall gain. Max dynamic range at out_shift=0, supporting + * all LUTs active and data at maximum. */ + + uint8_t ddrOutShift; /*!< Actuator Output Shift for ddr terms Range 0-15. Add one to double output gain. + * Output is left shifted to accommodate output normalization. + * Default shift is configured for unity coefficient sum of 0x2000 and + * 2 bits of headroom for individual coefficient. When large number of terms + * are used resulting in bit growth, the output gain can be decreased (right shift) + * to the correct the overall gain. Max dynamic range at out_shift=0, supporting + * all LUTs active and data at maximum. */ +} adi_adrv904x_DfeSvcDfePostDpdGain_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Data structure to hold the Tx carrier error status and error mask bits for a Tx channel + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeSvcDfeTxCarrierErrorStatusMask +{ + uint8_t carrFilterError; /*!< Indicates over/underflow in channel filter carrier X (8 bit mask) */ + uint8_t hbError; /*!< Indicates over/underflow in CDUC HB filter (1 bit) */ + uint8_t carrGainError; /*!< Indicates over/underflow in carrier gain X (8 bit mask). */ + uint8_t attenBandError; /*!< Indicates over/underflow in CDUC HD filter attenuation for bandX (2 bit mask) */ +} adi_adrv904x_DfeSvcDfeTxCarrierErrorStatusMask_t; +ADI_ADRV904X_PACK_FINISH + +#endif /* ADRV904X_DFE_SVC_DFE_PWR_MTR_T_H_ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_dfe_vswr_cmn_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_dfe_vswr_cmn_t.h new file mode 100644 index 00000000000..05f2f3d5659 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_dfe_vswr_cmn_t.h @@ -0,0 +1,45 @@ +/** + * Copyright 2020 - 2021 Analog Devices Inc. + * Released under the ADRV904X Software license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file + * \brief DFE capture service module definitions and types + * + * DFE SDK API Version: 2.10.0.4 + */ + +#ifndef ADI_ADRV904X_DFE_SVC_DFE_VSWR_CMN_T_H_ +#define ADI_ADRV904X_DFE_SVC_DFE_VSWR_CMN_T_H_ + +#include +#include "adi_adrv904x_platform_pack.h" + +#define ADI_ADRV904X_VSWR_PLAYBACK_DATA_MAX_NUM_SAMPLES 1023U /*!< VSWR playback data maximum number of samples */ + +/** + * \brief VSWR playback data. It contains 1023 samples maximum + */ +ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_VswrPlaybackData +{ + int16_t playbackDataReal[ADI_ADRV904X_VSWR_PLAYBACK_DATA_MAX_NUM_SAMPLES]; /*!< An array of samples for VSWR playback - 16bit real samples */ + int16_t playbackDataImag[ADI_ADRV904X_VSWR_PLAYBACK_DATA_MAX_NUM_SAMPLES]; /*!< An array of samples for VSWR playback - 16bit imag samples */ + uint16_t numSamples; /*!< No. of samples contained in playbackDataReal and playbackDataImag arrays */ +}adi_adrv904x_VswrPlaybackData_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief VSWR interleaved I/Q playback data. It contains 1023 samples maximum + */ + ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_DfeSvcCaptureVswrPlaybackInterleavedData +{ + int16_t playbackData[ADI_ADRV904X_VSWR_PLAYBACK_DATA_MAX_NUM_SAMPLES * 2]; /*!< An array of I/Q interleaved samples for VSWR playback */ + uint16_t numSamples; /*!< No. of I/Q interleaved samples contained in playbackData */ +}adi_adrv904x_DfeSvcCaptureVswrPlaybackInterleavedData_t; +ADI_ADRV904X_PACK_FINISH +#endif /* ADI_ADRV904X_DFE_SVC_DFE_VSWR_CMN_T_H_ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_err_codes_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_err_codes_t.h new file mode 100644 index 00000000000..8ca85762358 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_err_codes_t.h @@ -0,0 +1,2087 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adi_adrv904x_dfe_svc_err_codes_t.h + * + * \brief Contains DFE error code definitions + * + * \details Contains DFE error code definitions + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADI_ADRV904X_DFE_SVC_ERROR_CODES_T_H__ +#define __ADI_ADRV904X_DFE_SVC_ERROR_CODES_T_H__ + +#include "adi_adrv904x_dfe_svc_err_object_ids_t.h" + + +#define ADI_ADRV904X_DFE_SVC_ERR_COMMON_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_COMMON << 8u) /*!< 0x0000 - Starting common error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_SVC_CMD_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_CMD << 8u) /*!< 0x0100 - Starting Command handler service error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_OSAL << 8u) /*!< 0x0200 - Starting OSAL, event error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_SVC_LOG_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_LOG << 8u) /*!< 0x0300 - Starting Logging error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_DFE << 8u) /*!< 0x0400 - Starting DFE error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_SVC_TIMER_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_TIMER << 8u) /*!< 0x0500 - Starting Timer error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_SVC_RADIO_CTRL_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_RADIO_CTRL << 8u) /*!< 0x0600 - Starting Radio Control error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_SVC_EVENT_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_EVENT << 8u) /*!< 0x0700 - Starting Event Service error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_SVC_CLI_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_CLI << 8u) /*!< 0x0800 - Starting CLI Service error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_SVC_MALLOC_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_MALLOC << 8u) /*!< 0x0900 - Starting Malloc Service error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_SVC_BBIC_BRIDGE_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_BBIC_BRIDGE << 8u) /*!< 0x0A00 - Starting BBIC Bridge Service error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_SVC_BUF_MGMT_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_BUF_MGMT << 8u) /*!< 0x0B00 - Starting Memory Buffer Mgmt Service error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_SVC_CFG_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_CFG << 8u) /*!< 0x0C00 - Starting Configuration Adj Service error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_SVC_ECC_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_ECC << 8u) /*!< 0x0F00 - Starting ECC Service error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_DRV_WDTIMER_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_WATCHDOG << 8u) /*!< 0x1000 - Starting Watchdog error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_SVC_RADIO_CMD_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_RADIO_CMD << 8u) /*!< 0x1100 - Starting Radio Command Service */ + +#define ADI_ADRV904X_DFE_SVC_ERR_SVC_DBG_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_DBG << 8u) /*!< 0x2000 - Starting Debug Mode Service error code */ + +#define ADI_ADRV904X_DFE_SVC_ERR_DRV_GPIO_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_GPIO << 8u) /*!< 0x3000 - Starting GPIO Driver error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_DRV_GPT_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_GPT << 8u) /*!< 0x3100 - Starting GPT Driver error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_DRV_INT_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_INTERRUPT << 8u) /*!< 0x3200 - Starting Interrupt Driver error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_DRV_UART_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_UART << 8u) /*!< 0x3300 - Starting UART Driver error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_DRV_MB_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_MB << 8u) /*!< 0x3400 - Starting Mailbox error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_DRV_SYSCLK_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_SYSCLK << 8u) /*!< 0x3600 - Starting SYSCLOCK Driver error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_DRV_STREAM_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_STREAM << 8u) /*!< 0x3700 - Starting STREAM Driver error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_DRV_PWR_MTR_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_PWR_MTR << 8u) /*!< 0x3800 - Starting Power Meter Driver error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_DMA << 8u) /*!< 0x3900 - Starting DMA driver error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_DRV_CAPTURE_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_CAPTURE << 8u) /*!< 0x3A00 - Starting Capture driver error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_DRV_HW_IF_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_HW_IF << 8u) /*!< 0x3B00 - Starting Hw If driver error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_DRV_DFE_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_DFE << 8u) /*!< 0x3C00 - Starting DFE driver error code */ + +#define ADI_ADRV904X_DFE_SVC_ERR_APP_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_APP_ERROR << 8u) /*!< 0xE000 - Starting Application error code */ + +#define ADI_ADRV904X_DFE_SVC_ERR_DFE_CFG_DEVICE_PROFILE_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_CFG_DEVICE_PROFILE << 8u) /*!< 0x8000 - Starting Device Profile error code */ +#define ADI_ADRV904X_DFE_SVC_ERR_DFE_CFG_RADIO_SEQUENCER_ERROR_CODE_START (ADI_ADRV904X_DFE_SVC_ERR_OBJID_CFG_RADIO_SEQUENCER << 8u) /*!< 0x8100 - Starting Radio Sequencer error code */ + + +/** + * \brief DFE firmware error codes + */ +typedef enum adi_adrv904x_DfeSvcErrCode +{ + ADI_ADRV904X_DFE_SVC_ERR_CODE_NO_ERROR = 0UL, /*!< @errcode: 0x0000 + * @desc: No Error + * @maincause: Operation was Successful + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_NONE + * @mainrecovtext: No Action Required + * @severity: INFO + */ + + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_COMMON Section Base Error Code = 0x0000 ------ @errcode: 0x0000 + * @desc: Common Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_CODE_INVALID_PARAM = (ADI_ADRV904X_DFE_SVC_ERR_COMMON_ERROR_CODE_START + 1u), /*!< @errcode: 0x0001 + * @desc: Common Error: Parameter(s) + * @maincause: Invalid Parameter(s) Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Parameter(s) Provided + * @severity: CRITICAL, FATAL + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_NULL_PTR = (ADI_ADRV904X_DFE_SVC_ERR_COMMON_ERROR_CODE_START + 2u), /*!< @errcode: 0x0002 + * @desc: Common Error: Pointer(s) + * @maincause: Invalid Pointer(s) Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Pointer(s) Provided + * @severity: CRITICAL, FATAL + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_FEATURE_NOT_IMPLEMENTED = (ADI_ADRV904X_DFE_SVC_ERR_COMMON_ERROR_CODE_START + 3u), /*!< @errcode: 0x0003 + * @desc: Common Error: Feature Implementation + * @maincause: Requested Feature has not been Implemented + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check that Feature has been Implemented + * @severity: INFO + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_CRC_CHECK_FAILURE = (ADI_ADRV904X_DFE_SVC_ERR_COMMON_ERROR_CODE_START + 4u), /*!< @errcode: 0x0004 + * @desc: Common Error: CRC Check + * @maincause: Computed CRC does not Match Provided CRC + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Validate Image being Checked & Reprogram Device + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_INSUFFICIENT_MEMORY = (ADI_ADRV904X_DFE_SVC_ERR_COMMON_ERROR_CODE_START + 5u), /*!< @errcode: 0x0005 + * @desc: Common Error: Insufficient Memory + * @maincause: Unable to Allocate requested Memory (i.e. Heap) + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reprogram Device + * @severity: CRITICAL + */ + + + ADI_ADRV904X_DFE_SVC_ERR_CODE_STACK_OVERFLOW = (ADI_ADRV904X_DFE_SVC_ERR_COMMON_ERROR_CODE_START + 6u), /*!< @errcode: 0x0006 + * @desc: Common Error: Stack Overflow + * @maincause: Allocated Stack Size has been Exhausted + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reprogram Device + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_FATAL_EXCEPTION = (ADI_ADRV904X_DFE_SVC_ERR_COMMON_ERROR_CODE_START + 7u), /*!< @errcode: 0x0007 + * @desc: Common Error: Fatal Exception + * @maincause: Fatal Exception has been Triggered by CPU + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reprogram Device + * @severity: FATAL + */ + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_CMD Section Base Error Code = 0x0100 ------ @errcode: 0x0100 + * @desc: Command Interface Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_CODE_SVC_CMD_BAD_TID = (ADI_ADRV904X_DFE_SVC_ERR_SVC_CMD_ERROR_CODE_START + 1u), /*!< @errcode: 0x0101 + * @desc: Command Error: Transaction ID + * @maincause: Invalid Transaction ID Received + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Transaction ID is Valid + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_SVC_CMD_LINK_BUSY = (ADI_ADRV904X_DFE_SVC_ERR_SVC_CMD_ERROR_CODE_START + 2u), /*!< @errcode: 0x0102 + * @desc: Command Error: Link Busy + * @maincause: Link is Currently Processing a Command + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_INTERFACE + * @mainrecovtext: Wait for Link to Complete current Command + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_SVC_CMD_INVALID_LINK_ID = (ADI_ADRV904X_DFE_SVC_ERR_SVC_CMD_ERROR_CODE_START + 3u), /*!< @errcode: 0x0103 + * @desc: Command Error: Link Number + * @maincause: Invalid Link Number Provided in Command + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Valid Link Number is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_SVC_CMD_INVALID_MAILBOX = (ADI_ADRV904X_DFE_SVC_ERR_SVC_CMD_ERROR_CODE_START + 4u), /*!< @errcode: 0x0104 + * @desc: Command Error: Mailbox Number + * @maincause: Invalid Mailbox Number Received + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Mailbox Number is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_SVC_CMD_MSG_TOO_LARGE = (ADI_ADRV904X_DFE_SVC_ERR_SVC_CMD_ERROR_CODE_START + 5u), /*!< @errcode: 0x0105 + * @desc: Command Error: Command Payload Size + * @maincause: Payload Size Exceeds Link Buffer Size + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Valid Payload Size is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_SVC_CMD_BAD_CMD_ID = (ADI_ADRV904X_DFE_SVC_ERR_SVC_CMD_ERROR_CODE_START + 6u), /*!< @errcode: 0x0106 + * @desc: Command Error: Command ID + * @maincause: Invalid Command ID Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Valid Command ID is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_SVC_CMD_BAD_EVENT_TYPE = (ADI_ADRV904X_DFE_SVC_ERR_SVC_CMD_ERROR_CODE_START + 7u), /*!< @errcode: 0x0107 + * @desc: Command Error: Event Type + * @maincause: Invalid Event Type Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Event Type is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_SVC_CMD_BAD_PARAM = (ADI_ADRV904X_DFE_SVC_ERR_SVC_CMD_ERROR_CODE_START + 8u), /*!< @errcode: 0x0108 + * @desc: Command Error: Parameter(s) + * @maincause: Invalid Parameter(s) Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Parameter(s) is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_SVC_CMD_BAD_LINK_BUFFER = (ADI_ADRV904X_DFE_SVC_ERR_SVC_CMD_ERROR_CODE_START + 9u), /*!< @errcode: 0x0109 + * @desc: Command Error: link buffer is NULL + * @maincause: Invalid Parameter(s) Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Parameter(s) is Valid + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_SVC_CMD_TIMEOUT = (ADI_ADRV904X_DFE_SVC_ERR_SVC_CMD_ERROR_CODE_START + 10u), /*!< @errcode: 0x010a + * @desc: Command Error: Mailbox command timed out + * @maincause: Potential timing issue with calibration threads + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Contact ADI with memdump + * @severity: FATAL + */ + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START Section Base Error Code = 0x0200 ------ @errcode: 0x0200 + * @desc: OSAL Service Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_DELETED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x01u), /*!< @errcode: 0x0201 + * @desc: OSAL Service Error: Memory Pool + * @maincause: Memory Pool was Deleted while Thread Suspended + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Feature is reporting an Error + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_POOL_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x02u), /*!< @errcode: 0x0202 + * @desc: OSAL Service Error: Memory Pool Pointer + * @maincause: Invalid Memory Pool Pointer Provided by Thread + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reprogram Device + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_PTR_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x03u), /*!< @errcode: 0x0203 + * @desc: OSAL Service Error: Invalid Pointer + * @maincause: NULL Pointer Detected + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Use Valid Pointer + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_WAIT_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x04u), /*!< @errcode: 0x0204 + * @desc: OSAL Service Error: Semaphore Wait + * @maincause: OSAL Semaphore Wait Timeout + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check that Semaphore is not being requested from ISR + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_SIZE_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x05u), /*!< @errcode: 0x0205 + * @desc: OSAL Service Error: Memory Pool Size + * @maincause: Invalid Memory Pool Size + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check the Memory Pool Size is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_GROUP_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x06u), /*!< @errcode: 0x0206 + * @desc: OSAL Service Error: Event Group Pointer + * @maincause: Event Group Pointer is either NULL or Points to a Group already Created + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Event Group Pointer Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_NO_EVENTS = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x07u), /*!< @errcode: 0x0207 + * @desc: OSAL Service Error: No Event + * @maincause: Service was unable to get the Specified Events + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Events were Created + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_OPTION_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x08u), /*!< @errcode: 0x0208 + * @desc: OSAL Service Error: Option + * @maincause: Invalid Get Option Specified + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Invalid Parameter Passed to Function + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_QUEUE_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x09u), /*!< @errcode: 0x0209 + * @desc: OSAL Service Error: Queue Pointer + * @maincause: Queue Pointer was either NULL or Pointing to a Queue that was already Created + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Queue Pointer is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_QUEUE_EMPTY = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x0au), /*!< @errcode: 0x020a + * @desc: OSAL Service Error: Queue Empty + * @maincause: Message Queue is Empty + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Queue Management + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_QUEUE_FULL = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x0bu), /*!< @errcode: 0x020b + * @desc: OSAL Service Error: Queue Full + * @maincause: Message Queue is Full + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Queue Management + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_SEMAPHORE_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x0cu), /*!< @errcode: 0x020c + * @desc: OSAL Service Error: Semaphore Pointer + * @maincause: Semaphore Pointer was either NULL or Pointing to a Semaphore that was already Created + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Semaphore being used is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_NO_INSTANCE = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x0du), /*!< @errcode: 0x020d + * @desc: OSAL Service Error: No Semaphore + * @maincause: Semaphore Count is Zero + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Semaphore Management + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_THREAD_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x0eu), /*!< @errcode: 0x020e + * @desc: OSAL Service Error: Thread Pointer + * @maincause: Thread Pointer was either NULL or Points to a Thread that was already Created + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Pointer is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_PRIORITY_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x0fu), /*!< @errcode: 0x020f + * @desc: OSAL Service Error: Thread Priority + * @maincause: Invalid Thread Priority was Specified + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Use Valid Thread Priority + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_NO_MEMORY = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x10u), /*!< @errcode: 0x0210 + * @desc: OSAL Service Error: Memory Allocation + * @maincause: Service was unable to Allocate a Block of Memory + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Memory Management + * @severity: + */ + + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_DELETE_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x11u), /*!< @errcode: 0x0211 + * @desc: OSAL Service Error: Thread Delete State + * @maincause: Invalid Thread State for Deletion + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Thread are Correct State for Deletion + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_RESUME_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x12u), /*!< @errcode: 0x0212 + * @desc: OSAL Service Error: Thread Resume State + * @maincause: Thread cannot be Resumed because it is not Suspended + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Thread Management + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_CALLER_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x13u), /*!< @errcode: 0x0213 + * @desc: OSAL Service Error: Non-Thread Calibrationl + * @maincause: API function was Calibrationibrationled from a non-thread + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check how Function was Calibrationibrationled + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_SUSPEND_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x14u), /*!< @errcode: 0x0214 + * @desc: OSAL Service Error: Thread Suspend State + * @maincause: Threads to be suspended must be in Terminated or Completed State + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Thread State + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_TIMER_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x15u), /*!< @errcode: 0x0215 + * @desc: OSAL Service Error: Timer Pointer + * @maincause: Invalid Timer Pointer + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Pointer is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_TICK_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x16u), /*!< @errcode: 0x0216 + * @desc: OSAL Service Error: Timer Tick + * @maincause: Initial Timer Tick Value Cannot be Zero + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Timer Tick is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_ACTIVATE_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x17u), /*!< @errcode: 0x0217 + * @desc: OSAL Service Error: Activation + * @maincause: Invalid Activation was Specified + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Activation Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_THRESH_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x18u), /*!< @errcode: 0x0218 + * @desc: OSAL Service Error: Preemption Threshold + * @maincause: Invalid Preemption Threshold was Specified + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Preemption Threshold is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_SUSPEND_LIFTED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x19u), /*!< @errcode: 0x0219 + * @desc: OSAL Service Error: Delayed Suspension + * @maincause: Previously-set Delayed Suspension was Lifted + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Delayed Suspension + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_WAIT_ABORTED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x1au), /*!< @errcode: 0x021a + * @desc: OSAL Service Error: Wait Abort + * @maincause: Wait was lifted by another thread, timer or ISR + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Event Behaviour + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_WAIT_ABORT_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x1bu), /*!< @errcode: 0x021b + * @desc: OSAL Service Error: Wait Abort Error + * @maincause: Specified Thread is not in the Wait state + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Feature is reporting an Error + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_MUTEX_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x1cu), /*!< @errcode: 0x021c + * @desc: OSAL Service Error: Mutex Pointer + * @maincause: Invalid Mutex pointer + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Mutex Pointer is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_NOT_AVAILABLE = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x1du), /*!< @errcode: 0x021d + * @desc: OSAL Service Error: Mutex UnAvailable + * @maincause: Unable to obtain the Specified Mutex + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Mutex Availability + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_NOT_OWNED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x1eu), /*!< @errcode: 0x021e + * @desc: OSAL Service Error: Mutex Ownership + * @maincause: Specified Mutex is not Owned by the Calibrationler + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Ownership of Mutex + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_INHERIT_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x1fu), /*!< @errcode: 0x021f + * @desc: OSAL Service Error: Priority Inheritance + * @maincause: Invalid Priority Inheritance Parameter Specified + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Priority Inheritance Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_NOT_DONE = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x20u), /*!< @errcode: 0x0220 + * @desc: OSAL Service Error: Operation Failed + * @maincause: Specified Operation was not Completed + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Operation Process + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_CEILING_EXCEEDED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x21u), /*!< @errcode: 0x0221 + * @desc: OSAL Service Error: Semaphore Limit + * @maincause: Semaphore upper limit has been exceeded + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Usage of Semaphores + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_INVALID_CEILING = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x22u), /*!< @errcode: 0x0222 + * @desc: OSAL Service Error: Invalid Semaphore Limit + * @maincause: Specified Semaphore Ceiling is Invalid + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_LOG_LINK_SEARCH_FAILED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x23u), /*!< @errcode: 0x0223 + * @desc: OSAL Service Error: Log Link Search Failed + * @maincause: No Valid Node found in the OSAL Log Link + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Parameter is Valid + * @severity: + */ + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_LOG_LINK_NODE_INVALID = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x24u), /*!< @errcode: 0x0224 + * @desc: OSAL Service Error: Invalid Log Link Node + * @maincause: OSAL Dynamic Link List Functions were Passed an Invalid Node Index as an Input Parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Parameter is Valid + * @severity: + */ + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_LOG_ITEM_INVALID = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x25u), /*!< @errcode: 0x0225 + * @desc: OSAL Service Error: Invalid Log Item + * @maincause: Invalid Input Log Item + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_LOG_INVALID_NULL_POINTER = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x26u), /*!< @errcode: 0x0226 + * @desc: OSAL Service Error: Invalid Log Pointer + * @maincause: Log Function was Passed an Invalid Pointer as a Parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_INVALID_THREADNUMBER = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0x27u), /*!< @errcode: 0x0227 + * @desc: the maximum number of init threads (64) is exceeded + * @maincause: too many threads are being used for initialization + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Parameter is Valid + * @severity: + */ + + /* Reserve OSAL error codes for Samana platform */ + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_PLATFORM_START = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0xF0u), /*!< @errcode: 0x02f0 + * @desc: OSAL Service Error: Osal Platform Start + * @maincause: Osal Platform Start + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_PLATFORM_END = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0xFEu), /*!< @errcode: 0x02fe + * @desc: OSAL Service Error: Osal Platform End + * @maincause: Osal Platform End + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_OSAL_FEATURE_NOT_ENABLED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_OSAL_ERROR_CODE_START + 0xFFu), /*!< @errcode: 0x02ff + * @desc: OSAL Service Error: Disabled Feature + * @maincause: Requested Feature is not Enabled + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Parameter is Valid + * @severity: + */ + + + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_SVC_LOG_ERROR Section Base Error Code = 0x0300 ------ @errcode: 0x0300 + * @desc: Log Trace Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_CODE_LOG_ARG_OUT_OF_RANGE = (ADI_ADRV904X_DFE_SVC_ERR_SVC_LOG_ERROR_CODE_START + 1u), /*!< @errcode: 0x0301 + * @desc: Log Trace Error: Parameter Out of Range + * @maincause: Invalid Log Argument Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Log Trace Argument is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_LOG_INVALID_COREID = (ADI_ADRV904X_DFE_SVC_ERR_SVC_LOG_ERROR_CODE_START + 2u), /*!< @errcode: 0x0302 + * @desc: Log Trace Error: Core ID + * @maincause: Invalid Core ID Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Valid Core ID is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_LOG_UART_TX_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_LOG_ERROR_CODE_START + 3u), /*!< @errcode: 0x0303 + * @desc: Log Trace Error: UART Transmit + * @maincause: UART Failed to Transmit + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_INTERFACE + * @mainrecovtext: Check that UART is Correctly Configured + * @severity: + */ + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START Section Base Error Code = 0x0400 ------ @errcode: 0x0400 + * @desc: DFE Event Service Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_QUEUE_FULL = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 1u), /*!< @errcode: 0x0401 + * @desc: DFE Event Service Error: Capture Queue Full + * @maincause: Capture Queue is Full + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Wait until Queue has Capacity to process Requests + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_MALLOC_FAIL = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 2u), /*!< @errcode: 0x0402 + * @desc: DFE Event Service Error: Memory Allocation + * @maincause: Capture Buffer could not be Allocated + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Wait until more Captures are processed before making a request this size + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_BAD_CAPTURE_TYPE = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 3u), /*!< @errcode: 0x0403 + * @desc: DFE Event Service Error: Capture Type + * @maincause: Invalid Capture Type Provided to Function + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Capture Type Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_CAPTURE_NOT_CONFIGURED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 4u), /*!< @errcode: 0x0404 + * @desc: DFE Event Service Error: Capture Type Request + * @maincause: Capture Type requested was not configured + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Request is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_CAPTURE_PENDING = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 5u), /*!< @errcode: 0x0405 + * @desc: DFE Event Service Error: Capture Buffer Busy + * @maincause: Capture in Progress + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Wait until Current Capture has finished + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 6u), /*!< @errcode: 0x0406 + * @desc: DFE Event Service Error: Event Type + * @maincause: Invalid Event Type Requested + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Event Type Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_ADAPTATION_IN_PROGRESS = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 7u), /*!< @errcode: 0x0407 + * @desc: DFE Event Service Error: Adaptation Busy + * @maincause: Adaptation Currently in Progress + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Wait or Abort Current Request before Calibrationling Again + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_CAPTURE_UNEXPECTED_EVENT = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 8u), /*!< @errcode: 0x0408 + * @desc: DFE Event Service Error: Unexpected Capture Event + * @maincause: Unknown Cause to Error Event + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Request is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_BAD_CAPTURE_CHANNEL = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 9u), /*!< @errcode: 0x0409 + * @desc: DFE Event Service Error: Capture Channel + * @maincause: Invalid Capture Channel Requested + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Capture Channel Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_INVALID_VSWR_DIR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 0xAu), /*!< @errcode: 0x040A + * @desc: DFE Event Service Error: VSWR Direction + * @maincause: Invalid VSWR Direction Parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check VSWR Direction is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_INVALID_CAP_REQ = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 0xBu), /*!< @errcode: 0x040B + * @desc: DFE Event Service Error: Invalid capture requested + * @maincause: Check if the capture request is supported for Radio mode (RS or RCI) + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check if the capture request is supported for Radio mode (RS or RCI) + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_PWR_MTR_ABORT_FAILED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 0xCu), /*!< @errcode: 0x040C + * @desc: DFE Capture Service Error: Power measurement abort has failed (RCI mode) + * @maincause: Unexpected error + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Contact ADI with memdump if the Problem Persists + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_INVALID_CAP_PER_REQ = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 0xDu), /*!< @errcode: 0x040D + * @desc: DFE Event Service Error: Invalid capture period requested + * @maincause: Check if the capture period request is supported(for RS/RCI or DFE mapping mode) + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check if the capture period request is supported(for RS/RCI or DFE mapping mode) + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_CTC_INVALID_DEC_RATE_CFG = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 0xEu), /*!< @errcode: 0x040E + * @desc: DFE Event Service Error: Invalid CTC decimation rate configuration + * @maincause: CTC decimation rate does meet the min/max rate requirement + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check if the CTC decimation rate meets the min/max rate requirement + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_CTC_INVALID_ENV_POWER_CFG = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 0xFu), /*!< @errcode: 0x040F + * @desc: DFE Event Service Error: Invalid CTC envelop power configuration + * @maincause: Invalid CTC envelop power is configured + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check if the CTC envelop power is configured properly + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_CTC_INVALID_NUM_ROWS_CFG = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 0x10u), /*!< @errcode: 0x0410 + * @desc: DFE Event Service Error: Invalid CTC row configuration + * @maincause: Number of CTC rows exceed the maximum allowable rows in the HW + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check if the CTC rows are properly configured + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_CTC_INVALID_NUM_COLS_CFG = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 0x11u), /*!< @errcode: 0x0411 + * @desc: DFE Event Service Error: Invalid CTC column configuration + * @maincause: Number of CTC columns exceed the maximum allowable columns in the HW + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check if the CTC columns are properly configured + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_CTC_DUPLICATE_ENV_POWER_CFG = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 0x12u), /*!< @errcode: 0x0412 + * @desc: DFE Event Service Error: Duplicate CTC envelop power configuration + * @maincause: Duplicate CTC envelop power is configured for the same time constant + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check if the duplicate CTC envelop power is configured for the same time constant + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_CTC_PATH_BALANCE_FAILED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 0x13u), /*!< @errcode: 0x0413 + * @desc: DFE Event Service Error: CTC path balance failed + * @maincause: Main datapath delay is less than CT datapath delay. Path balance can't be achieved. + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Need to reduce the decimator ratios or enable CFR with more CFR engines + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_CTC_PATH_FRAC_BALANCE_NEEDED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 0x14u), /*!< @errcode: 0x0414 + * @desc: DFE Event Service Error: CTC path fractional sample balance required + * @maincause: There is a fractional delay difference between main datapath and CT datapath + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Need to add one delay in both gmp_j_pgrm_delay and gmp_i_pgrm_delay of all GMP models + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_CTC_PATH_FRAC_BALANCE_FAILED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 0x15u), /*!< @errcode: 0x0415 + * @desc: DFE Event Service Error: CTC path exhibits uncorrectable fractional delay + * @maincause: Could be caused by bad configurator settings + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check configurator settings + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_CTC_CAPTURE_ALIGN_FAILED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 0x16u), /*!< @errcode: 0x0416 + * @desc: DFE Event Service Error: Alignment of CTC pre-DPD capture and CTC envelop capture failed + * @maincause: Alignment of CTC pre-DPD capture and CTC envelop capture can not be achieved + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Modification of CTC model configuration is required + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_CTC_INVALID_DEC_SELECTION = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 0x17u), /*!< @errcode: 0x0417 + * @desc: DFE Event Service Error: Invalid decimator selected for a row + * @maincause: Invalid decimator selected for a row + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Modification of CTC model configuration is required + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_CTC_INVALID_FBOX_SCALE = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DFE_ERROR_CODE_START + 0x18u), /*!< @errcode: 0x0418 + * @desc: DFE Event Service Error: Invalid fbox scaler selected + * @maincause: Fbox scaler value cannot be smaller than minimum scaler value detected based on max num of columns + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Increase fbox scaler value + * @severity: + */ + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_RADIO_CTRL Section Base Error Code = 0x0600 ------ @errcode: 0x0600 + * @desc: Radio Control Service Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_CODE_RADIO_CTRL_RS_INVALID_PTRN_TBL = (ADI_ADRV904X_DFE_SVC_ERR_SVC_RADIO_CTRL_ERROR_CODE_START + 1u), /*!< @errcode: 0x0601 + * @desc: Radio Control Service Error: Radio Sequencer Pattern Table + * @maincause: Invalid Radio Sequencer Pattern Table Pointer + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check References to Pattern Tables + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_RADIO_CTRL_RS_LUT_CRC_FAILED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_RADIO_CTRL_ERROR_CODE_START + 2u), /*!< @errcode: 0x0602 + * @desc: Radio Control Service Errors: Radio Sequencer LUT CRC + * @maincause: Computed LUT CRC does not Match the Provided CRC + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Image is Valid & Reprogram Device + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_RADIO_CTRL_RS_NOT_INITIALIZED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_RADIO_CTRL_ERROR_CODE_START + 3u), /*!< @errcode: 0x0603 + * @desc: Radio Control Service Errors: Radio Sequencer Initialization + * @maincause: CPU Profile doesn't Enable the Radio Sequencer + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Review CPU Profile & Reprogram Device + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_RADIO_CTRL_TX_ATT_INVALID_STEPSIZE = (ADI_ADRV904X_DFE_SVC_ERR_SVC_RADIO_CTRL_ERROR_CODE_START + 4u), /*!< @errcode: 0x0604 + * @desc: Radio Control Service Errors: Tx attenuation step size is invalid + * @maincause: Tx attenuation step size is invalid + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Review CPU Profile & Reprogram Device + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_RADIO_CTRL_ORX_ATT_INVALID = (ADI_ADRV904X_DFE_SVC_ERR_SVC_RADIO_CTRL_ERROR_CODE_START + 5u), /*!< @errcode: 0x0605 + * @desc: Radio Control Service Errors: Orx attenuation value invalid + * @maincause: Orx attenuation value is invalid + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Use BBIC API to configure Orx attenuation + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_RADIO_CTRL_TX_ORX_MAP_INVALID = (ADI_ADRV904X_DFE_SVC_ERR_SVC_RADIO_CTRL_ERROR_CODE_START + 6u), /*!< @errcode: 0x0606 + * @desc: Radio Control Service Errors: Tx-Orx mapping invalid + * @maincause: Tx to Orx mapping is not valid because the Orx is not a valid channel number, or the Orx is not connected to any Tx. + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Tx and Orx channel numbers and mapping setting + * @severity: + */ + + + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_EVENT Section Base Error Code = 0x0700 ------ @errcode: 0x0700 + * @desc: Event Service Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_CODE_EVENT_INVALID_TYPE = (ADI_ADRV904X_DFE_SVC_ERR_SVC_EVENT_ERROR_CODE_START + 1u), /*!< @errcode: 0x0701 + * @desc: Event Service Error: Event Type + * @maincause: Invalid Event Type Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Event Type Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_EVENT_REGISTER_LIMIT = (ADI_ADRV904X_DFE_SVC_ERR_SVC_EVENT_ERROR_CODE_START + 2u), /*!< @errcode: 0x0702 + * @desc: Event Service Error: Event Register Limit + * @maincause: Thread Register Limit for same Event Type Reached + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check That All Threads are Required for that Event + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_EVENT_ALREADY_REGISTERED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_EVENT_ERROR_CODE_START + 3u), /*!< @errcode: 0x0703 + * @desc: Event Service Error: Duplicate Thread Registration + * @maincause: Thread already Registered for Event Type + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_EVENT_NOT_REGISTERED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_EVENT_ERROR_CODE_START + 4u), /*!< @errcode: 0x0704 + * @desc: Event Service Error: Event Not Registered + * @maincause: Thread not Registered to Receive Event Type + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Thread can be registered for Event Type + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_EVENT_QUEUE_FULL = (ADI_ADRV904X_DFE_SVC_ERR_SVC_EVENT_ERROR_CODE_START + 5u), /*!< @errcode: 0x0705 + * @desc: Event Service Error: Queue Full + * @maincause: Event could not be Notified because Receiving Thread's Queue was full + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Capacity of Receiving Queue + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_EVENT_TIMEOUT = (ADI_ADRV904X_DFE_SVC_ERR_SVC_EVENT_ERROR_CODE_START + 6u), /*!< @errcode: 0x0706 + * @desc: Event Service Error: Event Timeout + * @maincause: Event Timed Out + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check that Event was Correctly Registered + * @severity: + */ + + + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_MALLOC Section Base Error Code = 0x0900 ------ @errcode: 0x0900 + * @desc: Malloc Service Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_CODE_MALLOC_INIT_FAILED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_MALLOC_ERROR_CODE_START + 0x01u), /*!< @errcode: 0x0901 + * @desc: Malloc Service Error: Service Initialization Failed + * @maincause: Mutex / Byte Pool Create Failure, or Non-Contiguous Memory + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reprogram Device + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_MALLOC_ALLOC_FAILED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_MALLOC_ERROR_CODE_START + 0x02u), /*!< @errcode: 0x0902 + * @desc: Malloc Service Error: Memory Pool Allocation Failed + * @maincause: Memory Pool too small or not enough Space Available + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Memory Requirements & Usage + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_MALLOC_BLK_NOT_CONTIG = (ADI_ADRV904X_DFE_SVC_ERR_SVC_MALLOC_ERROR_CODE_START + 0x03u), /*!< @errcode: 0x0903 + * @desc: Malloc Service Error: Non-Contiguous Memory Region + * @maincause: Memory Block is not Contiguous + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reprogram Device + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_MALLOC_ENABLE_FAILED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_MALLOC_ERROR_CODE_START + 0x04u), /*!< @errcode: 0x0904 + * @desc:Malloc Service Error: Memory Pool Create Failed + * @maincause: Could not Create Dynamic Memory Pools + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Memory Requirements & Usage + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_MALLOC_BLK_UNALIGNED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_MALLOC_ERROR_CODE_START + 0x05u), /*!< @errcode: 0x0905 + * @desc: Malloc Service Error: Memory Alignment Failure + * @maincause: Memory Region not aligned on unsigned long boundary + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Memory Requirements & Usage + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_MALLOC_L4_BOUNDS_FAILURE = (ADI_ADRV904X_DFE_SVC_ERR_SVC_MALLOC_ERROR_CODE_START + 0x06u), /*!< @errcode: 0x0906 + * @desc: Malloc Service Error: L4 Boundary Limit + * @maincause: Requested Memory Region is outside of L4 Memory space + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Memory Requirements & Usage + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_MALLOC_MEM_POOL_BYTES_AVAIL_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_MALLOC_ERROR_CODE_START + 0x07u), /*!< @errcode: 0x0907 + * @desc: Malloc Service Error: Invalid Memory Pool + * @maincause: Number of Memory Pool bytes Available exceeds Memory Pool size + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Memory Requirements & Usage + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_MALLOC_GET_INIT_HEAP_INFO_FAILED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_MALLOC_ERROR_CODE_START + 0x08u), /*!< @errcode: 0x0908 + * @desc: Malloc Service Error: Invalid Heap Memory Pool + * @maincause: Initial Heap Memory Pool is Invalid or Returns Invalid Bytes Available + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Memory Requirements & Usage + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_MALLOC_GET_FREE_SPACE_INFO_FAILED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_MALLOC_ERROR_CODE_START + 0x09u), /*!< @errcode: 0x0909 + * @desc: Malloc Service Error: Free Space Information Get Failed + * @maincause: Free Space Memory Pool is Invalid or Returns Invalid Bytes Available + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Memory Requirements & Usage + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_MALLOC_GET_DYN_MEM_INFO_FAILED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_MALLOC_ERROR_CODE_START + 0x0au), /*!< @errcode: 0x090a + * @desc: Malloc Service Error: Dynamic Memory Information Get Failed + * @maincause: Initial Heap / Free Space Memory Pool Invalid or returns Invalid bytes Available + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Memory Requirements & Usage + * @severity: + */ + + + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_BBIC_BRIDGE Section Base Error Code = 0x0A00 ------ @errcode: 0x0A00 + * @desc: BBIC Bridge Service Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_CODE_BBIC_BRIDGE_INIT_REGION_RELOCATE_FAILED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_BBIC_BRIDGE_ERROR_CODE_START + 1u), /*!< @errcode: 0x0A01 + * @desc: BBIC Bridge Service Error: Firmware Image Initialization Region Size Limit + * @maincause: Firmware Image exceeds Initialization Region Limit + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reduce Firmware Image Size and Reprogram Device. Contact ADI if the Problem Persists + * @severity: + */ + + + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_BUF_MGMT Section Base Error Code = 0x0B00 ------ @errcode: 0x0B00 + * @desc: Memory Buffer Management Service + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_CODE_BUF_MGMT_INIT_FAILURE = (ADI_ADRV904X_DFE_SVC_ERR_SVC_BUF_MGMT_ERROR_CODE_START + 0x01u), /*!< @errcode: 0x0B01 + * @desc: Memory Buffer Management Service Error: Initialization Failed + * @maincause: Memory Allocation Failed + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Memory Requirements & Usage + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_BUF_MGMT_BUF_ACQUIRE_FAILURE = (ADI_ADRV904X_DFE_SVC_ERR_SVC_BUF_MGMT_ERROR_CODE_START + 0x02u), /*!< @errcode: 0x0B02 + * @desc: Memory Buffer Management Service Error: Capture Buffer Acquirement Failed + * @maincause: Lack of Memory Buffer Available for Required Capture + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Memory Requirements & Usage + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_BUF_MGMT_BUF_RELEASE_FAILURE = (ADI_ADRV904X_DFE_SVC_ERR_SVC_BUF_MGMT_ERROR_CODE_START + 0x03u), /*!< @errcode: 0x0B03 + * @desc: Memory Buffer Management Service Error: Capture Mutex Release Failure + * @maincause: External DPD Capture Data Handle in Process + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Capture Status should be Released at this Point + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_BUF_MGMT_BUFFER_INVALID = (ADI_ADRV904X_DFE_SVC_ERR_SVC_BUF_MGMT_ERROR_CODE_START + 0x04u), /*!< @errcode: 0x0B04 + * @desc: Memory Buffer Management Service Error: Invalid Buffer Release + * @maincause: Attempt made to release an Invalid Memory Buffer + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check which Memory Buffers are Available for Release + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_BUF_MGMT_BUF_NO_INSTANCE = (ADI_ADRV904X_DFE_SVC_ERR_SVC_BUF_MGMT_ERROR_CODE_START + 0x05u), /*!< @errcode: 0x0B05 + * @desc: Memory Buffer Management Service Error: No Buffer Instance + * @maincause: Attempt made to acquire more buffers than Available + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Number of Available Buffers + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_BUF_MGMT_ALLOCATE_FAILURE = (ADI_ADRV904X_DFE_SVC_ERR_SVC_BUF_MGMT_ERROR_CODE_START + 0x06u), /*!< @errcode: 0x0B06 + * @desc: Memory Buffer Management Service Error: Buffer Allocation Failed + * @maincause: Unable to Allocate Memory for Buffer Management + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Memory Requirements & Usage + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_BUF_MGMT_BUF_UNAVAILABLE = (ADI_ADRV904X_DFE_SVC_ERR_SVC_BUF_MGMT_ERROR_CODE_START + 0x07u), /*!< @errcode: 0x0B07 + * @desc: Memory Buffer Management Service Error: No Available Buffer + * @maincause: Buffer semaphore count is non-Zero, but no buffers marked Available + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reprogram Device + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_BUF_MGMT_BUF_NOT_ALLOCATED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_BUF_MGMT_ERROR_CODE_START + 0x08u), /*!< @errcode: 0x0B08 + * @desc: Memory Buffer Management Service Error: UnAllocated Buffer + * @maincause: Buffer Type has Zero Allocated Instances + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Buffer Allocations for Buffer Type + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_BUF_MGMT_INVALID_NUM_CHANNELS = (ADI_ADRV904X_DFE_SVC_ERR_SVC_BUF_MGMT_ERROR_CODE_START + 0x09u), /*!< @errcode: 0x0B09 + * @desc: Memory Buffer Management Service Error: Number of Samples + * @maincause: Invalid Number of Samples Parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Number of Samples Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_BUF_MGMT_INVALID_NUM_DPD_FEATURES = (ADI_ADRV904X_DFE_SVC_ERR_SVC_BUF_MGMT_ERROR_CODE_START + 0x0Au), /*!< @errcode: 0x0B0A + * @desc: Memory Buffer Management Service Error: Number of DPD Features + * @maincause: Invalid Number of DPD Features Parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Number of DPD Features Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_BUF_MGMT_INVALID_NUM_FILT_COEFS = (ADI_ADRV904X_DFE_SVC_ERR_SVC_BUF_MGMT_ERROR_CODE_START + 0x0Bu), /*!< @errcode: 0x0B0B + * @desc: Memory Buffer Management Service Error: Number of Filter Coefficients + * @maincause: Invalid Number of Filter Coefficients Parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Number of Filter Coefficients Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_BUF_MGMT_INVALID_NUM_SAMPLES_2_WAY = (ADI_ADRV904X_DFE_SVC_ERR_SVC_BUF_MGMT_ERROR_CODE_START + 0x0Cu), /*!< @errcode: 0x0B0C + * @desc: Memory Buffer Management Service Error: Number of 2-Way Samples + * @maincause: Invalid Number of 2-Way Samples Parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Number of 2-Way Samples Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_BUF_MGMT_INVALID_NUM_SAMPLES_3_WAY = (ADI_ADRV904X_DFE_SVC_ERR_SVC_BUF_MGMT_ERROR_CODE_START + 0x0Du), /*!< @errcode: 0x0B0D + * @desc: Memory Buffer Management Service Error: Number of 3-Way Samples + * @maincause: Invalid Number of 3-Way Samples Parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Number of 3-Way Samples Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_BUF_MGMT_INVALID_NUM_ADAPT_BUFFERS = (ADI_ADRV904X_DFE_SVC_ERR_SVC_BUF_MGMT_ERROR_CODE_START + 0x0Eu), /*!< @errcode: 0x0B0E + * @desc: Memory Buffer Management Service Error: Number of Adaptation Buffers + * @maincause: Invalid Number of Adaptation Buffers Parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Number of Adaptation Buffers Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_BUF_MGMT_INVALID_NUM_CAPTURE_WAYS = (ADI_ADRV904X_DFE_SVC_ERR_SVC_BUF_MGMT_ERROR_CODE_START + 0x0Fu), /*!< @errcode: 0x0B0F + * @desc: Memory Buffer Management Service Error: Number of Capture Ways + * @maincause: Invalid Number of Capture Ways Parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Number of Capture Ways Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_BUF_MGMT_INVALID_NUM_CAPTURE_BUFFERS = (ADI_ADRV904X_DFE_SVC_ERR_SVC_BUF_MGMT_ERROR_CODE_START + 0x10u), /*!< @errcode: 0x0B10 + * @desc: Memory Buffer Management Service Error: Number of Capture Buffers + * @maincause: Invalid Number of Capture Buffers Parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Number of Capture Buffers Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_BUF_MGMT_INVALID_CAPTURE_PER_ADAPT = (ADI_ADRV904X_DFE_SVC_ERR_SVC_BUF_MGMT_ERROR_CODE_START + 0x11u), /*!< @errcode: 0x0B11 + * @desc: Memory Buffer Management Service Error: Number of Captures per Adaptation + * @maincause: Invalid Number of Captures per Adaptation Parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Number of Captures per Adaptation Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_BUF_MGMT_INVALID_NUM_VSWR_SAMPLES = (ADI_ADRV904X_DFE_SVC_ERR_SVC_BUF_MGMT_ERROR_CODE_START + 0x12u), /*!< @errcode: 0x0B12 + * @desc: Memory Buffer Management Service Error: Number of VSWR Samples + * @maincause: Invalid Number of VSWR Samples Parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Number of VSWR Samples Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_BUF_MGMT_INVALID_NUM_VSWR_BUFFERS = (ADI_ADRV904X_DFE_SVC_ERR_SVC_BUF_MGMT_ERROR_CODE_START + 0x13u), /*!< @errcode: 0x0B13 + * @desc: Memory Buffer Management Service Error: Number of VSWR Buffers + * @maincause: Invalid Number of VSWR Buffers Parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Number of VSWR Buffers Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_BUF_MGMT_INVALID_NUM_LUT_BUFFERS = (ADI_ADRV904X_DFE_SVC_ERR_SVC_BUF_MGMT_ERROR_CODE_START + 0x14u), /*!< @errcode: 0x0B14 + * @desc: Memory Buffer Management Service Error: Number of LUT Buffers + * @maincause: Invalid Number of LUT Buffers Parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Number of VSWR Buffers Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_BUF_MGMT_INVALID_NUM_DPD_PROC_BUFFERS = (ADI_ADRV904X_DFE_SVC_ERR_SVC_BUF_MGMT_ERROR_CODE_START + 0x15u), /*!< @errcode: 0x0B15 + * @desc: Memory Buffer Management Service Error: Number of DPD Processing Buffers + * @maincause: Invalid Number of DPD Processing Buffers Parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Number of DPD Processing Buffers Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_BUF_MGMT_INVALID_NUM_CTC_FLUT_BUFFERS = (ADI_ADRV904X_DFE_SVC_ERR_SVC_BUF_MGMT_ERROR_CODE_START + 0x16u), /*!< @errcode: 0x0B16 + * @desc: Memory Buffer Management Service Error: Number of CTC FLUT Buffers + * @maincause: Invalid Number of CTC FLUT Buffers Parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Number of CTC FLUT Buffers Parameter is Valid + * @severity: + */ + + + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_CFG Section Base Error Code = 0x0C00 ------ @errcode: 0x0C00 + * @desc: Configuration Adjustment Service Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_CODE_CFG_KEYMISMATCH = (ADI_ADRV904X_DFE_SVC_ERR_SVC_CFG_ERROR_CODE_START + 1u), /*!< @errcode: 0x0C01 + * @desc: Configuration Adjustment Service Error: Configuration Key MisMatch + * @maincause: Invalid Configuration Key Parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Configuration Key Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_CFG_SYSTEM_CONFIG_LOCKED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_CFG_ERROR_CODE_START + 2u), /*!< @errcode: 0x0C02 + * @desc: Configuration Adjustment Service Error: Configuration Service is Locked + * @maincause: Configuration Service has not been Unlocked + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Unlock Configuration before trying again + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_CFG_GETCONFIG_NOT_SUPPORTED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_CFG_ERROR_CODE_START + 3u), /*!< @errcode: 0x0C03 + * @desc: Configuration Adjustment Service Error: Get Configuration Command + * @maincause: Get Configuration Command is not Supported for the Provided Object ID + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Get Configuration Command is Supported for the Provided Object ID + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_CFG_SETCONFIG_NOT_SUPPORTED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_CFG_ERROR_CODE_START + 4u), /*!< @errcode: 0x0C04 + * @desc: Configuration Adjustment Service Error: Set Configuration Command + * @maincause: Set Configuration Command is not Supported for the Provided ObjID + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Set Configuration Command is Supported for the Provided Object ID + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_CFG_INVALID_CONFIG_OBJECT = (ADI_ADRV904X_DFE_SVC_ERR_SVC_CFG_ERROR_CODE_START + 5u), /*!< @errcode: 0x0C05 + * @desc: Configuration Adjustment Service Error: Configuration Object ID + * @maincause: Invalid Configuration Object ID was received with the last Configuration Command + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Configuration Object ID is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_CFG_LIMIT_REACHED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_CFG_ERROR_CODE_START + 6u), /*!< @errcode: 0x0C06 + * @desc: Configuration Adjustment Service Error: Configuration Limit + * @maincause: Configuration Buffer Limit Reached + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check if all Configurations are Required + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_CFG_INVALID_CONFIG_SIZE = (ADI_ADRV904X_DFE_SVC_ERR_SVC_CFG_ERROR_CODE_START + 7u), /*!< @errcode: 0x0C07 + * @desc: Configuration Adjustment Service Error: Configuration Data Size + * @maincause: Invalid Configuration Data Size Parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Configuration Data Size Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_CFG_INVALID_CONFIG_OFFSET = (ADI_ADRV904X_DFE_SVC_ERR_SVC_CFG_ERROR_CODE_START + 8u), /*!< @errcode: 0x0C08 + * @desc: Configuration Adjustment Service Error: Configuration Offset + * @maincause: Invalid Configuration Offset Parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Configuration Offset Parameter is Valid + * @severity: + */ + + + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_ECC Section Base Error Code = 0x0F00 ------ @errcode: 0x0F00 + * @desc: ECC-Parity Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_CODE_ECC_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_ECC_ERROR_CODE_START + 1u), /*!< @errcode: 0x0F01 + * @desc: ECC-Parity Error: Unrecoverable ECC Error + * @maincause: Memory Hardware Fault + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the Problem Persists + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_ECC_CONFIG_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_SVC_ECC_ERROR_CODE_START + 2u), /*!< @errcode: 0x0F02 + * @desc: ECC-Parity Error: ECC configuration + * @maincause: Incorrect Parameter Provided for ECC configuration + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Ensure Input Parameters are correct + * @severity: + */ + + + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_WATCHDOG Section Base Error Code = 0x1000 ------ @errcode: 0x1000 + * @desc: Watchdog Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_CODE_DRV_WDTIMER_INVALID_PARAMETER = (ADI_ADRV904X_DFE_SVC_ERR_DRV_WDTIMER_ERROR_CODE_START + 1u), /*!< @errcode: 0x1001 + * @desc: Watchdog Error: Watchdog configuration + * @maincause: Incorrect Parameter Provided for Watchdog configuration + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Ensure Input Parameters are correct + * @severity: CRITICAL + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DRV_WDTIMER_TIMER0_EXPIRED = (ADI_ADRV904X_DFE_SVC_ERR_DRV_WDTIMER_ERROR_CODE_START + 2u), /*!< @errcode: 0x1002 + * @desc: Watchdog Error: Watchdog timer 0 expired + * @maincause: Possible system lockup detected + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the Problem Persists + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DRV_WDTIMER_TIMER1_EXPIRED = (ADI_ADRV904X_DFE_SVC_ERR_DRV_WDTIMER_ERROR_CODE_START + 3u), /*!< @errcode: 0x1003 + * @desc: Watchdog Error: Watchdog timer 1 expired + * @maincause: Possible system lockup detected + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the Problem Persists + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DRV_WDTIMER_TIMER2_EXPIRED = (ADI_ADRV904X_DFE_SVC_ERR_DRV_WDTIMER_ERROR_CODE_START + 4u), /*!< @errcode: 0x1004 + * @desc: Watchdog Error: Watchdog timer 2 expired + * @maincause: Possible system lockup detected + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the Problem Persists + * @severity: FATAL + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DRV_WDTIMER_TIMER3_EXPIRED = (ADI_ADRV904X_DFE_SVC_ERR_DRV_WDTIMER_ERROR_CODE_START + 5u), /*!< @errcode: 0x1005 + * @desc: Watchdog Error: Watchdog timer 3 expired + * @maincause: Possible system lockup detected + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device and try again. Contact ADI if the Problem Persists + * @severity: FATAL + */ + + + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_SVC_RADIO_CMD_START Section Base Error Code = 0x1100 ------ @errcode: 0x1100 + * @desc: Radio Command Service Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_CODE_SVC_RADIO_CMD_BAD_TID = (ADI_ADRV904X_DFE_SVC_ERR_SVC_RADIO_CMD_START + 1u), /*!< @errcode: 0x1101 + * @desc: Radio Command Error: Transaction ID + * @maincause: Invalid Transaction ID Received + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Transaction ID is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_SVC_RADIO_CMD_LINK_BUSY = (ADI_ADRV904X_DFE_SVC_ERR_SVC_RADIO_CMD_START + 2u), /*!< @errcode: 0x1102 + * @desc: Radio Command Error: Link Busy + * @maincause: Link is Currently Processing a Command + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_INTERFACE + * @mainrecovtext: Wait for Link to Complete current Command + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_SVC_RADIO_CMD_INVALID_LINK_ID = (ADI_ADRV904X_DFE_SVC_ERR_SVC_RADIO_CMD_START + 3u), /*!< @errcode: 0x1103 + * @desc: Radio Command Error: Link Number + * @maincause: Invalid Link Number Provided in Command + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Valid Link Number is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_SVC_RADIO_CMD_INVALID_MAILBOX = (ADI_ADRV904X_DFE_SVC_ERR_SVC_RADIO_CMD_START + 4u), /*!< @errcode: 0x1104 + * @desc: Radio Command Error: Mailbox Number + * @maincause: Invalid Mailbox Number Received + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Mailbox Number is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_SVC_RADIO_CMD_INVALID_MSG_SIZE = (ADI_ADRV904X_DFE_SVC_ERR_SVC_RADIO_CMD_START + 5u), /*!< @errcode: 0x1105 + * @desc: Radio Command Error: Message size + * @maincause: Invalid Command or Response Size Received + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Command and Response Sizes are Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_SVC_RADIO_CMD_BAD_RESPONSE = (ADI_ADRV904X_DFE_SVC_ERR_SVC_RADIO_CMD_START + 6u), /*!< @errcode: 0x1106 + * @desc: Radio Command Error: Message response content is bad + * @maincause: Response message contains unexpected data + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Command and Response values + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_SVC_RADIO_CMD_INVALID_PARAM = (ADI_ADRV904X_DFE_SVC_ERR_SVC_RADIO_CMD_START + 7u), /*!< @errcode: 0x1107 + * @desc: Radio Command Error: Message parameter is invalid + * @maincause: Message contains an invalid parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check parameters in message + * @severity: + */ + + + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_GPIO Section Base Error Code = 0x2000 ------ @errcode: 0x2000 + * @desc: Debug Service Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_CODE_DBG_KEY_MISMATCH = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DBG_ERROR_CODE_START + 1u), /*!< @errcode: 0x2001 + * @desc: Debug Service Error: Debug Key MisMatch + * @maincause: Invalid Debug Key Parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Debug Key Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DBG_CMD_LEN_INVALID = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DBG_ERROR_CODE_START + 2u), /*!< @errcode: 0x2002 + * @desc: Debug Service Error: Command Length + * @maincause: Invalid Command Length Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Command Length is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DBG_CMD_NOT_SUPPORTED = (ADI_ADRV904X_DFE_SVC_ERR_SVC_DBG_ERROR_CODE_START + 3u), /*!< @errcode: 0x2003 + * @desc: Debug Service Error: Debug Command + * @maincause: Invalid Debug Command Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Debug Command is Valid + * @severity: + */ + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_GPIO Section Base Error Code = 0x3000 ------ @errcode: 0x3000 + * @desc: GPIO Driver Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_CODE_DRV_GPIO_INVALID_SIGNAL_ID = (ADI_ADRV904X_DFE_SVC_ERR_DRV_GPIO_ERROR_CODE_START + 1u), /*!< @errcode: 0x3001 + * @desc: GPIO Driver Error: Signal ID + * @maincause: Invalid Signal ID Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Signal ID Provided is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DRV_GPIO_INVALID_PIN_ID = (ADI_ADRV904X_DFE_SVC_ERR_DRV_GPIO_ERROR_CODE_START + 2u), /*!< @errcode: 0x3002 + * @desc: GPIO Driver Error: Pin ID + * @maincause: Invalid GPIO Pin ID Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Pin ID Provided is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_DRV_NO_GPIO_INPUT_ASSIGNED_TO_ALARM = (ADI_ADRV904X_DFE_SVC_ERR_DRV_GPIO_ERROR_CODE_START + 3u), /*!< @errcode: 0x3003 + * @desc: GPIO Driver Error: Alarm Assignment + * @maincause: Requested Alarm has no GPIO Input Assigned + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Verify Alarm Configuration + * @severity: + */ + + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_GPT Section Base Error Code = 0x3100 ------ @errcode: 0x3100 + * @desc: General Purpose Timer Driver Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_CODE_GPT_ALLOCATED = (ADI_ADRV904X_DFE_SVC_ERR_DRV_GPT_ERROR_CODE_START + 1u), /*!< @errcode: 0x3101 + * @desc: GPT Driver Error: GPT Instance Allocated + * @maincause: Attempt to Allocate previously Allocated GPT instance + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check GPT Allocations + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_GPT_UNALLOCATED = (ADI_ADRV904X_DFE_SVC_ERR_DRV_GPT_ERROR_CODE_START + 2u), /*!< @errcode: 0x3102 + * @desc: GPT Driver Error: GPT Instance Not Allocated + * @maincause: Invalid GPT Instance Allocation State + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check GPT Instance Allocation Status + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_GPT_INIT_INVALID_CORE = (ADI_ADRV904X_DFE_SVC_ERR_DRV_GPT_ERROR_CODE_START + 3u), /*!< @errcode: 0x3103 + * @desc: GPT Driver Error: Processor Core + * @maincause: Invalid Processor Core Parameter + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Processor Core Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_GPT_INIT_INT_CFG_FAILED = (ADI_ADRV904X_DFE_SVC_ERR_DRV_GPT_ERROR_CODE_START + 4u), /*!< @errcode: 0x3104 + * @desc: GPT Driver Error: Interrupt Configuration + * @maincause: Invalid processor core / failed to register IRQ + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check GPT Interrupt Parameters are Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_GPT_MAX_TIMEOUT_EXCEEDED = (ADI_ADRV904X_DFE_SVC_ERR_DRV_GPT_ERROR_CODE_START + 5u), /*!< @errcode: 0x3105 + * @desc: GPT Driver Error: Timeout Limit + * @maincause: Invalid Timeout Limit Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Timeout Limit Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_GPT_INVALID_SCLK_FREQ = (ADI_ADRV904X_DFE_SVC_ERR_DRV_GPT_ERROR_CODE_START + 6u), /*!< @errcode: 0x3106 + * @desc: GPT Driver Error: System Clock Get + * @maincause: Invalid System Clock Get + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check System Clock is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_GPT_MUTEX_FAILURE = (ADI_ADRV904X_DFE_SVC_ERR_DRV_GPT_ERROR_CODE_START + 7u), /*!< @errcode: 0x3107 + * @desc: GPT Driver Error: Mutex + * @maincause: OSAL Mutex Error + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check OSAL Mutex Status + * @severity: + */ + + + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_INTERRUPT Section Base Error Code = 0x3200 ------ @errcode: 0x3200 + * @desc: Interrupt Driver Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_CODE_INT_INVALID_INTID = (ADI_ADRV904X_DFE_SVC_ERR_DRV_INT_ERROR_CODE_START + 1u), /*!< @errcode: 0x3201 + * @desc: Interrupt Driver Error: Interrupt ID + * @maincause: Invalid Interrupt ID Parameter Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Interrupt ID Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_INT_INVALID_CORE = (ADI_ADRV904X_DFE_SVC_ERR_DRV_INT_ERROR_CODE_START + 2u), /*!< @errcode: 0x3202 + * @desc: Interrupt Driver Error: CPU Core ID + * @maincause: Invalid CPU Core ID Parameter Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check CPU Core ID Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_INT_INVALID_PRIORITY = (ADI_ADRV904X_DFE_SVC_ERR_DRV_INT_ERROR_CODE_START + 3u), /*!< @errcode: 0x3203 + * @desc: Interrupt Driver Error: Interrupt Priority + * @maincause: Invalid Interrupt Priority Parameter Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Interrupt Priority Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_INT_INVALID_POINTER = (ADI_ADRV904X_DFE_SVC_ERR_DRV_INT_ERROR_CODE_START + 4u), /*!< @errcode: 0x3204 + * @desc: Interrupt Driver Error: Invalid Interrupt Service Pointer + * @maincause: Invalid Interrupt Service Pointer Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Interrupt Service Pointer is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_INT_UNEXPECTED = (ADI_ADRV904X_DFE_SVC_ERR_DRV_INT_ERROR_CODE_START + 5u), /*!< @errcode: 0x3205 + * @desc: Interrupt Driver Error: Unexpected Interrupt + * @maincause: No handler installed for Interrupt + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check all Interrupts are correctly handled + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_FIQ_UNEXPECTED = (ADI_ADRV904X_DFE_SVC_ERR_DRV_INT_ERROR_CODE_START + 6u), /*!< @errcode: 0x3206 + * @desc: Interrupt Driver Error: Unexpected Fast Interrupt + * @maincause: No handler installed for Fast Interrupt + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check all Fast Interrupts are correctly handled + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_INT_NOT_CONFIG = (ADI_ADRV904X_DFE_SVC_ERR_DRV_INT_ERROR_CODE_START + 7u), /*!< @errcode: 0x3207 + * @desc: Interrupt Driver Error: Unconfigured Interrupt + * @maincause: No handler installed for Interrupt + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Interrupt was configured correctly + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_INT_ENABLED = (ADI_ADRV904X_DFE_SVC_ERR_DRV_INT_ERROR_CODE_START + 8u), /*!< @errcode: 0x3208 + * @desc: Interrupt Driver Error: Active Interrupt + * @maincause: Interrupt not Disabled before subsequent Calibrationibrationl to Configure + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Disable Interrupt before reconfiguration + * @severity: + */ + + /* Reserve Drv Int error codes for Samana platform */ + ADI_ADRV904X_DFE_SVC_ERR_CODE_INT_PLATFORM_START = (ADI_ADRV904X_DFE_SVC_ERR_DRV_INT_ERROR_CODE_START + 0xF0u), /*!< @errcode: 0x32F0 + * @desc: Interrupt Driver Error: Platform Interrupt Start + * @maincause: Platform Interrupt Start + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Interrupt was configured correctly + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_INT_PLATFORM_END = (ADI_ADRV904X_DFE_SVC_ERR_DRV_INT_ERROR_CODE_START + 0xFFu), /*!< @errcode: 0x32FF + * @desc: Interrupt Driver Error: Platform Interrupt End + * @maincause: Platform Interrupt End + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Interrupt was configured correctly + * @severity: + */ + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_UART Section Base Error Code = 0x3300------ @errcode: 0x3300 + * @desc: UART Driver Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_CODE_UART_INVALID_INSTANCE = (ADI_ADRV904X_DFE_SVC_ERR_DRV_UART_ERROR_CODE_START + 1u), /*!< @errcode: 0x3301 + * @desc: UART Driver Error: UART Driver ID + * @maincause: Invalid UART Driver ID Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check UART Driver ID Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_UART_INVALID_SCLK_FREQ = (ADI_ADRV904X_DFE_SVC_ERR_DRV_UART_ERROR_CODE_START + 2u), /*!< @errcode: 0x3302 + * @desc: UART Driver Error: System Clock Get + * @maincause: System Clock Data not Available for Calibrationculation + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check System Clock is Configured Correctly + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_UART_SEM_CREATE_FAILURE = (ADI_ADRV904X_DFE_SVC_ERR_DRV_UART_ERROR_CODE_START + 3u), /*!< @errcode: 0x3303 + * @desc: UART Driver Error: Semaphore Create + * @maincause: OSAL unable to create Semaphore + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check OSAL Semaphores + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_UART_MUTEX_FAILURE = (ADI_ADRV904X_DFE_SVC_ERR_DRV_UART_ERROR_CODE_START + 4u), /*!< @errcode: 0x3304 + * @desc: UART Driver Error: Mutex + * @maincause: OSAL unable to Process Mutex + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check OSAL Mutex + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_UART_INT_INIT_FAILURE = (ADI_ADRV904X_DFE_SVC_ERR_DRV_UART_ERROR_CODE_START + 5u), /*!< @errcode: 0x3305 + * @desc: UART Driver Error: Interrupt Initialization + * @maincause: Interrupt Driver did not Register Interrupt Handler + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Interrupt Handler + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_UART_UNINITIALIZED = (ADI_ADRV904X_DFE_SVC_ERR_DRV_UART_ERROR_CODE_START + 6u), /*!< @errcode: 0x3306 + * @desc: UART Driver Error: Uninitialized + * @maincause: UART Driver Requested is not Initialized + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: UART Driver Requires Initialization before use + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_UART_TX_FIFO_FULL = (ADI_ADRV904X_DFE_SVC_ERR_DRV_UART_ERROR_CODE_START + 7u), /*!< @errcode: 0x3307 + * @desc: UART Driver Error: Tx FIFO Full + * @maincause: Request made to Transmit with Tx FIFO Full + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Wait until UART Driver has transmitted existing Data + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_UART_TX_FAILURE = (ADI_ADRV904X_DFE_SVC_ERR_DRV_UART_ERROR_CODE_START + 8u), /*!< @errcode: 0x3308 + * @desc: UART Driver Error: Semaphore Wait + * @maincause: Unexpected Semaphore Error during UART Transmit + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check OSAL Semaphores + * @severity: + */ + + + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_MB Section Base Error Code = 0x3400------ @errcode: 0x3400 + * @desc: Mailbox Driver Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_CODE_MB_MAILBOX_BUSY = (ADI_ADRV904X_DFE_SVC_ERR_DRV_MB_ERROR_CODE_START + 1u), /*!< @errcode: 0x3401 + * @desc: Mailbox Driver Error: Busy + * @maincause: Mailbox is not Available to process new commands + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Poll Mailbox until Ready + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_MB_MAILBOX_INIT_FAILED = (ADI_ADRV904X_DFE_SVC_ERR_DRV_MB_ERROR_CODE_START + 2u), /*!< @errcode: 0x3402 + * @desc: Mailbox Driver Error: Initialization + * @maincause: Unable to create OSAL Mutex + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check OSAL Mutex for Mailbox + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_MB_MAILBOX_CLR_PENDING_FAILED = (ADI_ADRV904X_DFE_SVC_ERR_DRV_MB_ERROR_CODE_START + 3u), /*!< @errcode: 0x3403 + * @desc: Mailbox Driver Error: Clear/Pending Update + * @maincause: OSAL Mutex Failed during Status Update + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check OSAL Mutex for Mailbox + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_MB_MAILBOX_REGISTER_HANDLER_FAILED = (ADI_ADRV904X_DFE_SVC_ERR_DRV_MB_ERROR_CODE_START + 4u), /*!< @errcode: 0x3404 + * @desc: Mailbox Driver Error: Configuration Update + * @maincause: OSAL Mutex Failed during Configuration Update + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check OSAL Mutex for Mailbox + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_MB_MAILBOX_SEND_CMD_FAILED = (ADI_ADRV904X_DFE_SVC_ERR_DRV_MB_ERROR_CODE_START + 5u), /*!< @errcode: 0x3405 + * @desc: Mailbox Driver Error: Send Command + * @maincause: OSAL Mutex Failed during Send Command + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check OSAL Mutex for Mailbox & if Mailbox was Ready to Accept Commands + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_MB_MAILBOX_FORCE_EXCEPTION_CMD = (ADI_ADRV904X_DFE_SVC_ERR_DRV_MB_ERROR_CODE_START + 6u), /*!< @errcode: 0x3406 + * @desc: Mailbox Driver Error: Forced Exception + * @maincause: Forced Exception Command Received + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reprogram Device + * @severity: + */ + + + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_SYSCLK Section Base Error Code = 0x3600------ @errcode: 0x3600 + * @desc: SYSCLK Driver Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_DRV_SYSCLK_NOINIT_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_DRV_SYSCLK_ERROR_CODE_START + 1u), /*!< @errcode: 0x3601 + * @desc: SYSCLK Driver Error: Initialization + * @maincause: Driver not Initialized + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Configure System Clock + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_SYSCLK_INVALID_PARAM = (ADI_ADRV904X_DFE_SVC_ERR_DRV_SYSCLK_ERROR_CODE_START + 2u), /*!< @errcode: 0x3602 + * @desc: SYSCLK Driver Error: Invalid Frequency + * @maincause: System HS Digital Clock and/or Clock Dividers NOK + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Check Profile Clock Settings + * @severity: + */ + + + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_STREAM Section Base Error Code = 0x3700------ @errcode: 0x3700 + * @desc: STREAM Driver Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_DRV_STREAM_INVALID_PARAM = (ADI_ADRV904X_DFE_SVC_ERR_DRV_STREAM_ERROR_CODE_START + 1u), /*!< @errcode: 0x3701 + * @desc: STREAM Driver Error: Generic Parameter + * @maincause: One or more Input parameters are not Valid + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset device, if Problem Persists contact ADI. + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_STREAM_TIMEOUT = (ADI_ADRV904X_DFE_SVC_ERR_DRV_STREAM_ERROR_CODE_START + 2u), /*!< @errcode: 0x3702 + * @desc: STREAM Driver Error: Timeout + * @maincause: Timeout can occur due to stream processor waiting for other streams to Complete + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset the feature to recover from this error, if Problem Persists contact ADI. + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_STREAM_PREV_TIMEOUT = (ADI_ADRV904X_DFE_SVC_ERR_DRV_STREAM_ERROR_CODE_START + 3u), /*!< @errcode: 0x3703 + * @desc: STREAM Driver Error: Incomplete Task + * @maincause: Previous stream started did not finish + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset the feature to recover from this error. if Problem Persists contact ADI. + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_STREAM_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_DRV_STREAM_ERROR_CODE_START + 4u), /*!< @errcode: 0x3704 + * @desc: STREAM Driver Error: Stream Error + * @maincause: Stream resulted in an error + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset the feature to recover from this error. if Problem Persists contact ADI. + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_STREAM_PREV_ERROR = (ADI_ADRV904X_DFE_SVC_ERR_DRV_STREAM_ERROR_CODE_START + 5u), /*!< @errcode: 0x3705 + * @desc: STREAM Driver Error: Previous Stream Error + * @maincause: Previous stream resulted in an error + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Reset the feature to recover from this error. if Problem Persists contact ADI. + * @severity: + */ + + + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_PWR_MTR Section Base Error Code = 0x3800------ @errcode: 0x3800 + * @desc: Power Meter Driver Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_DRV_PWR_MTR_INVALID_PARAM = (ADI_ADRV904X_DFE_SVC_ERR_DRV_PWR_MTR_ERROR_CODE_START + 1u), /*!< @errcode: 0x3801 + * @desc: Power Meter Driver Error: Parameter + * @maincause: Invalid Channel or Carrier Mask + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Channel and/or Carrier Mask is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_PWR_MTR_NOT_DISABLED = (ADI_ADRV904X_DFE_SVC_ERR_DRV_PWR_MTR_ERROR_CODE_START + 2u), /*!< @errcode: 0x3802 + * @desc: Power Meter Driver Error: Not Disabled + * @maincause: Power Meter is not Disabled + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Power Meter needs to be Disabled + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_PWR_MTR_INVALID_CHANNEL = (ADI_ADRV904X_DFE_SVC_ERR_DRV_PWR_MTR_ERROR_CODE_START + 3u), /*!< @errcode: 0x3803 + * @desc: Channel number inValid + * @maincause: Channel number is inValid for the meter type + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Firmware programmatic error. disable power meter, if Problem Persists contact ADI + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_PWR_MTR_ZERO_SAMPLE_RATE = (ADI_ADRV904X_DFE_SVC_ERR_DRV_PWR_MTR_ERROR_CODE_START + 4u), /*!< @errcode: 0x3804 + * @desc: Sample rate invalid + * @maincause: Selected carrier for TSSI or RSSI may not be initialized + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check if the carriers selected are enabled in the profile being used. + * @severity: + */ + + + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_DMA Section Base Error Code = 0x3900------ @errcode: 0x3900 + * @desc: DMA Driver Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_CHANNEL_INVALID = (ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_ERROR_CODE_START + 1u), /*!< @errcode: 0x3901 + * @desc: DMA Driver Error: DMA Channel Data + * @maincause: Invalid DMA Channel Data Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check DMA Channel Data is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_IN_USE = (ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_ERROR_CODE_START + 2u), /*!< @errcode: 0x3902 + * @desc: DMA Driver Error: DMA Stream Busy + * @maincause: Supplied DMA Channel/stream ID is already open and in use + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Use of Streams + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_NOT_OPEN = (ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_ERROR_CODE_START + 3u), /*!< @errcode: 0x3903 + * @desc: DMA Driver Error: Closed Stream + * @maincause: DMA Stream must be opened before it is used + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Use of Streams + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_ALREADY_RUNNING = (ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_ERROR_CODE_START + 4u), /*!< @errcode: 0x3904 + * @desc: DMA Driver Error: DMA Busy + * @maincause: Function not permitted since DMA transfer is in progress + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Function invoked in incorrect sequence. Check DMA Sequence + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_BAD_STREAM_ID = (ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_ERROR_CODE_START + 5u), /*!< @errcode: 0x3905 + * @desc: DMA Driver Error: Stream ID + * @maincause: Invalid Stream ID Parameter Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Stream ID Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_BAD_PSIZE = (ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_ERROR_CODE_START + 6u), /*!< @errcode: 0x3906 + * @desc: DMA Driver Error: Transfer Size + * @maincause: Invalid Transfer Size Parameter Provided (i.e. only 4 or 8 bytes allowed) + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Psize Calibrationibrationculation is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_BAD_XCOUNT = (ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_ERROR_CODE_START + 7u), /*!< @errcode: 0x3907 + * @desc: DMA Driver Error: xCount + * @maincause: Invalid xCount Parameter Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check xCount Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_BAD_YCOUNT = (ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_ERROR_CODE_START + 0x8u), /*!< @errcode: 0x3908 + * @desc: DMA Driver Error: yCount + * @maincause: Invalid yCount Parameter Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check yCount Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_BAD_START_ADDR = (ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_ERROR_CODE_START + 0x9u), /*!< @errcode: 0x3909 + * @desc: DMA Driver Error: Start Address + * @maincause: Invalid Start Address Parameter Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Start Address Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_ADDR_ALIGNMENT = (ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_ERROR_CODE_START + 0xAu), /*!< @errcode: 0x390A + * @desc: DMA Driver Error: Address Alignment + * @maincause: MSize Calibrationculation doesnt work with Start Address + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Start Address Parameter is Correctly Aligned + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_BAD_HANDLE = (ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_ERROR_CODE_START + 0xBu), /*!< @errcode: 0x390B + * @desc: DMA Driver Error: Handle Validation + * @maincause: DMA Stream Handle was outside Valid Range + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check DMA Stream Handle + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_INVALID_NULL_POINTER = (ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_ERROR_CODE_START + 0xCu), /*!< @errcode: 0x390C + * @desc: DMA Driver Error: NULL Pointer + * @maincause: Invalid Pointer Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_RESET_DEVICE + * @mainrecovtext: Check Pointers Passed as Parameters are Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_NO_BUFFER_TO_PROCESS = (ADI_ADRV904X_DFE_SVC_ERR_DRV_DMA_ERROR_CODE_START + 0xDu), /*!< @errcode: 0x390D + * @desc: DMA Driver Error: Buffer(s) + * @maincause: Invalid Data buffer(s) Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Data buffer(s) Provided are Valid + * @severity: + */ + + + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_CAPTURE Section Base Error Code = 0x3A00------ @errcode: 0x3A00 + * @desc: Capture Driver Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_DRV_CAPTURE_VSWR_PLAYBACK_GENERATOR_ENABLED = (ADI_ADRV904X_DFE_SVC_ERR_DRV_CAPTURE_ERROR_CODE_START + 1u), /*!< @errcode: 0x3A01 + * @desc: Capture Driver Error: VSWR Playback Generator Enabled + * @maincause: VSWR Playback Generator is running when trying to access RAM + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_FEATURE + * @mainrecovtext: Playback Generator must be Disabled while accessing VSWR Playback RAM + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_CAPTURE_VSWR_PLAYBACK_LENGTH_INVALID = (ADI_ADRV904X_DFE_SVC_ERR_DRV_CAPTURE_ERROR_CODE_START + 2u), /*!< @errcode: 0x3A02 + * @desc: Capture Driver Error: VSWR Playback RAM Sample Count + * @maincause: Invalid Sample Count Parameter Provided + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Sample Count Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_CAPTURE_FRACT_CAP_DELAY_FOR_DEC_CAP = (ADI_ADRV904X_DFE_SVC_ERR_DRV_CAPTURE_ERROR_CODE_START + 3u), /*!< @errcode: 0x3A03 + * @desc: Capture Driver Error: Fractional delay needed to align capture sets + * @maincause: Check CFR delay and CT DPD input selection. Fractional delay isn't allowed for capture buffer. + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check CFR and CT_DPD configuration + * @severity: + */ + + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_HW_IF Section Base Error Code = 0x3B00------ @errcode: 0x3B00 + * @desc: Hw If Driver Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + /* Reserve Drv Hw If error codes for Samana platform */ + ADI_ADRV904X_DFE_SVC_ERR_CODE_HW_IF_PLATFORM_START = (ADI_ADRV904X_DFE_SVC_ERR_DRV_HW_IF_ERROR_CODE_START + 0xF0u), /*!< @errcode: 0x3BF0 + * @desc: Hw If Driver Error: Hw If Platform Start + * @maincause: Hw If Platform Start + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Parameter is Valid + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_CODE_HW_IF_PLATFORM_END = (ADI_ADRV904X_DFE_SVC_ERR_DRV_HW_IF_ERROR_CODE_START + 0xFFu), /*!< @errcode: 0x3BFF + * @desc: Hw If Driver Error: Hw If Platform End + * @maincause: Hw If Platform End + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check Parameter is Valid + * @severity: + */ + + /* ----- Object ID = ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_DFE Section Base Error Code = 0x3C00------ @errcode: 0x3C00 + * @desc: DFE Driver Errors + * @maincause: + * @mainrecovenum: + * @severity: + * @separator: true + */ + ADI_ADRV904X_DFE_SVC_ERR_DRV_DFE_INVALID_DECIMATION_RATIO = (ADI_ADRV904X_DFE_SVC_ERR_DRV_DFE_ERROR_CODE_START + 1u), /*!< @errcode: 0x3C01 + * @desc: DFE Driver Error: Invalid decimation ratio for selected decimator + * @maincause: Check if CTC model is configured and decimators in use has non-zero decimation ratios + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check if CTC model is configured and decimators in use has non-zero decimation ratios + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_DFE_INVALID_FIRST_STAGE_INT_RATIO = (ADI_ADRV904X_DFE_SVC_ERR_DRV_DFE_ERROR_CODE_START + 2u), /*!< @errcode: 0x3C02 + * @desc: DFE Driver Error: Invalid first stage interpolation ratio + * @maincause: Check if CTC model is configured and decimators in use has non-zero first stage interpolator + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check if CTC model is configured and decimators in use has non-zero first stage interpolator + * @severity: + */ + + ADI_ADRV904X_DFE_SVC_ERR_DRV_DFE_INVALID_SECOND_STAGE_INT_RATIO = (ADI_ADRV904X_DFE_SVC_ERR_DRV_DFE_ERROR_CODE_START + 3u), /*!< @errcode: 0x3C03 + * @desc: DFE Driver Error: Invalid second stage interpolation ratio + * @maincause: Check if second stage interpolation ratio is non-zero + * @mainrecovenum: ADI_ADRV904X_ERR_ACT_CHECK_PARAM + * @mainrecovtext: Check if second stage interpolation ratio is non-zero + * @severity: + */ +} adi_adrv904x_DfeSvcErrCode_e; + +typedef uint32_t adi_adrv904x_DfeSvcErrCode_t; + +#endif /* __ADI_ADRV904X_DFE_SVC_ERROR_CODES_T_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_err_object_ids_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_err_object_ids_t.h new file mode 100644 index 00000000000..ef3cea49da6 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_err_object_ids_t.h @@ -0,0 +1,108 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adi_adrv904x_dfe_svc_err_object_ids_t.h + * + * \brief Contains DFE Object ID definitions + * + * \details Contains DFE Object ID definitions + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADI_ADRV904X_DFE_SVC_ERR_OBJID_T_H__ +#define __ADI_ADRV904X_DFE_SVC_ERR_OBJID_T_H__ + +#include + +/** + * \brief DFE firmware object IDs + */ +typedef enum +{ + /* Common Object */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_COMMON = 0x00u, /*!< Start of Common OBJID */ + + /* Service Layer */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_CMD = 0x01u, /*!< CMD handler service */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_OSAL = 0x02u, /*!< OS Abstraction Layer Services */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_LOG = 0x03u, /*!< Log Service */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_DFE = 0x04u, /*!< DFE Service */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_TIMER = 0x05u, /*!< Timer Service */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_RADIO_CTRL = 0x06u, /*!< Radio Ctrl Service */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_EVENT = 0x07u, /*!< Event Service */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_CLI = 0x08u, /*!< CLI Service */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_MALLOC = 0x09u, /*!< Malloc Service */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_BBIC_BRIDGE = 0x0Au, /*!< BBIC Bridge service */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_BUF_MGMT = 0x0Bu, /*!< Buffer Mgmt Service */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_CFG = 0x0Cu, /*!< Configuration Framework Service */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_ERRORLOG = 0x0Du, /*!< Error Logging Service */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_INIT = 0x0Eu, /*!< App Init Service */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_ECC = 0x0Fu, /*!< ECC Service */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_WATCHDOG = 0x10u, /*!< Watchdog Timer Service */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_RADIO_CMD = 0x11u, /*!< Radio Command Service */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_EXCEPTION = 0x12u, /*!< Exception handler */ + + /* Debug mode object */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_DBG = 0x20u, /*!< Debug Mode */ + + /* Driver objects*/ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_GPIO = 0x30u, /*!< GPIO */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_GPT = 0x31u, /*!< GPT */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_INTERRUPT = 0x32u, /*!< GPT */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_UART = 0x33u, /*!< UART */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_MB = 0x34u, /*!< MailBox */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_PINTSW = 0x35u, /*!< PINTSW Interrupts*/ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_SYSCLK = 0x36u, /*!< SYSCLK */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_STREAM = 0x37u, /*!< STREAM */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_PWR_MTR = 0x38u, /*!< Power Meter */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_DMA = 0x39u, /*!< DMA */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_CAPTURE = 0x3Au, /*!< Capture driver */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_HW_IF = 0x3Bu, /*!< Hw If */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_DFE = 0x3cu, /*!< DFE */ + + /* Configuration objects */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_CFG_DEVICE_PROFILE = 0x80u, /*!< Configuration profile */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_CFG_RADIO_SEQUENCER = 0x81u, /*!< Radio sequencer module */ + + /* Calibration objects ( 0xB0 - 0xBF ) */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_CAL_START = 0xB0u, /*!< Cal start index */ + + ADI_ADRV904X_DFE_SVC_ERR_OBJID_CAL_END = 0xBFu, /*!< Cal end index */ + /* SDK Application objects, always keep in end */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_APP_START = 0xE0u, /*!< Start of APP OBJID */ + ADI_ADRV904X_DFE_SVC_ERR_OBJID_APP_ERROR = 0xE0u, /*!< APP error */ +} adi_adrv904x_DfeSvcErrObjId_e; + +typedef uint32_t adi_adrv904x_DfeSvcErrObjId_t; + +/* The mask of object Id to get object types */ +#define ADI_ADRV904X_DFE_SVC_ERR_OBJID_BASE_MASK 0xF0u + +/* The first service layer error object ID */ +#define ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_BASE 0x00u + +/* Needed to identify more than 16 service layer objects */ +#define ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_BASE1 0x10u +#define ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_BASE2 0x20u + +/* The first driver error object ID */ +#define ADI_ADRV904X_DFE_SVC_ERR_OBJID_DRV_BASE 0x30u + +/* The first configuration error object ID */ +#define ADI_ADRV904X_DFE_SVC_ERR_OBJID_CONFIG_BASE 0x80u + +/* The first calibration error object ID */ +#define ADI_ADRV904X_DFE_SVC_ERR_OBJID_CAL_BASE 0xB0u + +/* The first SDK Application error object ID */ +#define ADI_ADRV904X_DFE_SVC_ERR_OBJID_SDKAPP_BASE 0xE0u + +#endif /* __ADI_ADRV904X_DFE_SVC_ERR_OBJID_T_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_log_trace_events_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_log_trace_events_t.h new file mode 100644 index 00000000000..3258795020f --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_log_trace_events_t.h @@ -0,0 +1,298 @@ +/** + * Copyright 2020 - 2023 Analog Devices Inc. + * Released under the ADRV904X Software license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adi_adrv904x_dfe_svc_log_trace_events_t.h + * \brief Contains data types for SDK Log Service + * + * SDK API Version: 2.10.0.4 + */ + +#ifndef ADRV904X_DFE_SVC_LOG_TRACE_EVENTS_T_H_ +#define ADRV904X_DFE_SVC_LOG_TRACE_EVENTS_T_H_ + +#include "adi_adrv904x_dfe_svc_err_codes_t.h" + +#define ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_RANGE_SDK_MIN (0x00u) /* Sdk event min range */ +#define ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_RANGE_SDK_MAX (0x7Fu) /* Sdk event max range */ + +#define ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_RANGE_APP_MIN (0x80u) /* App event min range */ +#define ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_RANGE_APP_MAX (0xFFu) /* App event max range */ + +/** + * \brief Enumerated list of different log messages types that the application and + * different SDK components can log. + * + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_LEVEL_DEBUG = 0x1UL, /*!< Debug Message logging, no action required */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_LEVEL_INFO = 0x2UL, /*!< Informative, no action required. Error code parameter will be ignore. Info messages will not be logged to the telemetry*/ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_LEVEL_WARNING = 0x4UL, /*!< Some attention required. Warning messages will not be logged to the telemetry */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_LEVEL_CRITICAL = 0x8UL, /*!< Can be continued after handling */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_LEVEL_FATAL = 0x10UL /*!< Cannot continue, needs reboot */ +} adi_adrv904x_DfeSvcLogTraceLevel_e; + +typedef uint32_t adi_adrv904x_DfeSvcLogTraceLevel_t; + +/* All Logging Enabled in Log Mask*/ +#define ADI_ADRV904X_DFE_SVC_LOG_TRACE_LEVEL_ALL (ADI_ADRV904X_DFE_SVC_LOG_TRACE_LEVEL_DEBUG | ADI_ADRV904X_DFE_SVC_LOG_TRACE_LEVEL_INFO | ADI_ADRV904X_DFE_SVC_LOG_TRACE_LEVEL_WARNING | \ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_LEVEL_CRITICAL | ADI_ADRV904X_DFE_SVC_LOG_TRACE_LEVEL_FATAL) + +/** + * \brief Error Log pairing information memory dump + */ +typedef struct +{ + adi_adrv904x_DfeSvcErrCode_t errLogCode; /*!< error Code */ + adi_adrv904x_DfeSvcLogTraceLevel_t errLogLevel; /*!< error LogLevel */ + uint64_t errLogTimeStamp; /*!< error TimeStamp */ +} adi_adrv904x_DfeSvcLogTraceErrLogData_t; + + +/** + * \brief Error Log information memory dump + */ +typedef struct +{ + adi_adrv904x_DfeSvcLogTraceErrLogData_t comObjErr; /*!< Common Object Error */ + adi_adrv904x_DfeSvcLogTraceErrLogData_t svcLayerErr; /*!< Service Layer */ + adi_adrv904x_DfeSvcLogTraceErrLogData_t drvObjErr; /*!< Driver objects */ + adi_adrv904x_DfeSvcLogTraceErrLogData_t configObjErr; /*!< Configuration objects */ + adi_adrv904x_DfeSvcLogTraceErrLogData_t calObjErr; /*!< Calibration objects */ + adi_adrv904x_DfeSvcLogTraceErrLogData_t sdkAppObjErr; /*!< SDK Application objects */ +} adi_adrv904x_DfeSvcLogTraceErrLog_t; + + +/** + * \brief Typedef representing the event ID for log tracing / telemetry + * - All event IDs must be equal or less than 255 + * - Events used by the SDK must be in range 0..ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_RANGE_APP_MIN-1 (0..127) + * - Events used by the APP must be in range ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_RANGE_APP_MIN..ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_RANGE_APP_MAX (128..255) + */ + +typedef uint8_t adi_adrv904x_DfeSvcLogTraceEvent_t; + +/* + * The memdump tool parses this header file as a configuration file. + * The parser assumes that each telemetry "channel" is defined + * on a line of its own with the following format: + * + * [ws_4]ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_, |*ZZ*| + * + * where: + * - [ws_x] indicates x number whitespaces, ws_4 means 4 spaces is needed + * - indicates optional whitespace + * - is the telemetry channel name, which must be prefixed with "ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_" + * - is the telemetry format (default EVENT), other valid telemetry format are "UINT32" and "WIRE" + * - |* and *| are the start/end of a block comment (really forward slashes) + * + * Example: + * #define ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_NAME |* WIRE *| + * Pay attention that one Event Id can only be used in one kind of data and use corresponding data write interface: + * For "WIRE" type, use the interface "adi_adrv904x_DfeSvcLogTraceAppWire" + * For "EVENT" type, use the interface "adi_adrv904x_DfeSvcLogTraceAppEvent" + * For "UINT32" type, use the interface "adi_adrv904x_DfeSvcLogTraceAppEvent32" + */ + +typedef enum +{ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_START = ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_RANGE_SDK_MIN, + + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_ERROR = ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_RANGE_SDK_MIN, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DRV_INT, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_CAP_PERIOD_CH0, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_CAP_PERIOD_CH1, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_CAP_PERIOD_CH2, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_CAP_PERIOD_CH3, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_CAP_PERIOD_CH4, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_CAP_PERIOD_CH5, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_CAP_PERIOD_CH6, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_CAP_PERIOD_CH7, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_ABORT_CH0, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_ABORT_CH1, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_ABORT_CH2, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_ABORT_CH3, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_ABORT_CH4, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_ABORT_CH5, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_ABORT_CH6, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_ABORT_CH7, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_ABORT_CH0, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_ABORT_CH1, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_ABORT_CH2, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_ABORT_CH3, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_ABORT_CH4, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_ABORT_CH5, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_ABORT_CH6, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_ABORT_CH7, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_START_CH0, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_START_CH1, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_START_CH2, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_START_CH3, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_START_CH4, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_START_CH5, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_START_CH6, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_START_CH7, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_START_CH0, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_START_CH1, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_START_CH2, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_START_CH3, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_START_CH4, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_START_CH5, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_START_CH6, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_START_CH7, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_DONE_CH0, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_DONE_CH1, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_DONE_CH2, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_DONE_CH3, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_DONE_CH4, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_DONE_CH5, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_DONE_CH6, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_DATA_CAP_DONE_CH7, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_DONE_CH0, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_DONE_CH1, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_DONE_CH2, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_DONE_CH3, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_DONE_CH4, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_DONE_CH5, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_DONE_CH6, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_POWER_CAP_DONE_CH7, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_CMD_ACK, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_CMD_INC, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_APP_CMD_ACK, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_APP_CMD_INC, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_MAILBOX_INTERRUPT, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_WATCHDOG_1, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_WATCHDOG_2, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_NMI_EXCEPTION, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_SYNC_EXCEPTION, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_THREAD_ENTER, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_THREAD_ENTER_STACK_START, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_THREAD_ENTER_STACK_PTR, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_THREAD_EXIT, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_THREAD_EXIT_STACK_START, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_THREAD_EXIT_STACK_PTR, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_ISR_ENTER, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_ISR_EXIT, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_ISR_INT_ID, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_ASSERTION, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_TRACE_CYCLE_SYNC, /* UINT32 */ + + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_SDK_END = ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_RANGE_SDK_MAX, + + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_START = ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_RANGE_APP_MIN, + + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_ERROR = ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_RANGE_APP_MIN, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_CLGC_CAP_REQ_CH0, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_CLGC_CAP_REQ_CH1, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_CLGC_CAP_REQ_CH2, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_CLGC_CAP_REQ_CH3, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_CLGC_CAP_REQ_CH4, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_CLGC_CAP_REQ_CH5, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_CLGC_CAP_REQ_CH6, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_CLGC_CAP_REQ_CH7, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_CAP_REQ_CH0, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_CAP_REQ_CH1, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_CAP_REQ_CH2, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_CAP_REQ_CH3, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_CAP_REQ_CH4, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_CAP_REQ_CH5, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_CAP_REQ_CH6, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_CAP_REQ_CH7, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_PROC_STATE_CH0, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_PROC_STATE_CH1, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_PROC_STATE_CH2, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_PROC_STATE_CH3, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_PROC_STATE_CH4, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_PROC_STATE_CH5, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_PROC_STATE_CH6, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_PROC_STATE_CH7, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_RUN_CH0, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_RUN_CH1, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_RUN_CH2, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_RUN_CH3, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_RUN_CH4, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_RUN_CH5, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_RUN_CH6, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_RUN_CH7, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_EXIT_FLAG_RUN_CLEAR_CH0, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_EXIT_FLAG_RUN_CLEAR_CH1, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_EXIT_FLAG_RUN_CLEAR_CH2, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_EXIT_FLAG_RUN_CLEAR_CH3, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_EXIT_FLAG_RUN_CLEAR_CH4, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_EXIT_FLAG_RUN_CLEAR_CH5, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_EXIT_FLAG_RUN_CLEAR_CH6, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_EXIT_FLAG_RUN_CLEAR_CH7, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_EXIT_FLAG_CTRL_CLEAR_CH0, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_EXIT_FLAG_CTRL_CLEAR_CH1, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_EXIT_FLAG_CTRL_CLEAR_CH2, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_EXIT_FLAG_CTRL_CLEAR_CH3, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_EXIT_FLAG_CTRL_CLEAR_CH4, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_EXIT_FLAG_CTRL_CLEAR_CH5, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_EXIT_FLAG_CTRL_CLEAR_CH6, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_EXIT_FLAG_CTRL_CLEAR_CH7, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_WAIT_CH0, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_WAIT_CH1, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_WAIT_CH2, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_WAIT_CH3, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_WAIT_CH4, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_WAIT_CH5, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_WAIT_CH6, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_WAIT_CH7, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_GRAB_CH0, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_GRAB_CH1, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_GRAB_CH2, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_GRAB_CH3, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_GRAB_CH4, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_GRAB_CH5, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_GRAB_CH6, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_GRAB_CH7, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_POST_CH0, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_POST_CH1, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_POST_CH2, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_POST_CH3, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_POST_CH4, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_POST_CH5, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_POST_CH6, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_SEM_POST_CH7, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_CAL_TIMER_CH0, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_CAL_TIMER_CH1, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_CAL_TIMER_CH2, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_CAL_TIMER_CH3, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_CAL_TIMER_CH4, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_CAL_TIMER_CH5, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_CAL_TIMER_CH6, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_DPD_CAL_TIMER_CH7, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_CAL_STATUS_CMD_RECEIVE, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_CAL_STATUS_CMD_DONE, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_CAL_CTRL_CMD_RECEIVE, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_CAL_CTRL_CMD_DONE, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_FEAT_COMP_COMPUTE_START, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_FEAT_COMP_PROCESSED, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_FEAT_COMP_XACC_DONE, /* EVENT */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_CAPTURE_EVENT_CH0, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_CAPTURE_EVENT_CH1, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_CAPTURE_EVENT_CH2, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_CAPTURE_EVENT_CH3, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_CAPTURE_EVENT_CH4, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_CAPTURE_EVENT_CH5, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_CAPTURE_EVENT_CH6, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_CAPTURE_EVENT_CH7, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_VSWR_STATE_CH0, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_VSWR_STATE_CH1, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_VSWR_STATE_CH2, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_VSWR_STATE_CH3, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_VSWR_STATE_CH4, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_VSWR_STATE_CH5, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_VSWR_STATE_CH6, /* UINT32 */ + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_VSWR_STATE_CH7, /* UINT32 */ + + ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_APP_END = ADI_ADRV904X_DFE_SVC_LOG_TRACE_EVENT_RANGE_APP_MAX +} adi_adrv904x_DfeSvcLogTraceEvent_e; + +#endif /* ADRV904X_DFE_SVC_LOG_TRACE_EVENTS_T_H_ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_radio_ctrl_sequencer_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_radio_ctrl_sequencer_t.h new file mode 100644 index 00000000000..ee2a3926e2d --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_radio_ctrl_sequencer_t.h @@ -0,0 +1,356 @@ +/** + * Copyright 2020 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adi_adrv904x_dfe_svc_radio_ctrl_sequencer_t.h + * \brief Contains data types for DFE SDK Radio Sequencer Service + * + * DFE SDK API Version: 2.10.0.4 + */ + +#ifndef __ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_T_H__ +#define __ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_T_H__ + +#include + +/** + * \brief Enum of Radio Sequencers + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_FRAME_TIMING_0, /*!< ID for Radio Sequencer 0 (Frame Timing 0) */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_FRAME_TIMING_1, /*!< ID for Radio Sequencer 1 (Frame Timing 1) */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_FRAME_TIMING_2, /*!< ID for Radio Sequencer 2 (Frame Timing 2) */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_FRAME_TIMING_3, /*!< ID for Radio Sequencer 3 (Frame Timing 3) */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_FRAME_TIMING_4, /*!< ID for Radio Sequencer 4 (Frame Timing 4) */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_FRAME_TIMING_5, /*!< ID for Radio Sequencer 5 (Frame Timing 5) */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_FRAME_TIMING_6, /*!< ID for Radio Sequencer 6 (Frame Timing 6) */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_FRAME_TIMING_7, /*!< ID for Radio Sequencer 7 (Frame Timing 7) */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_FRAME_TIMING_8, /*!< ID for Radio Sequencer 8 (Frame Timing 8) */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_FRAME_TIMING_9, /*!< ID for Radio Sequencer 9 (Frame Timing 9) */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_ORX_0_CAPTURE, /*!< ID for Radio Sequencer 10 (ORX 0 capture) */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_ORX_1_CAPTURE, /*!< ID for Radio Sequencer 11 (ORX 1 capture) */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_ID_RESERVED_0, /*!< ID for Radio Sequencer 12 (Reserved 0) */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_ID_RESERVED_1, /*!< ID for Radio Sequencer 13 (Reserved 1) */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_ID_RESERVED_2, /*!< ID for Radio Sequencer 14 (Reserved 2) */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_ID_RESERVED_3, /*!< ID for Radio Sequencer 15 (Reserved 3) */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_NUM_SEQUENCERS /*!< Total number of sequencers */ +} adi_adrv904x_DfeSvcRadioCtrlSequencerId_e; + +/** + * \brief Enum of possible Radio Sequencers enable mask + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_OFF = 0x00, /*!< No sequencers are enabled */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_0 = 0x01, /*!< Sequencer 0 enabled */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_1 = 0x02, /*!< Sequencer 1 enabled */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_2 = 0x04, /*!< Sequencer 2 enabled */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_3 = 0x08, /*!< Sequencer 3 enabled */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_4 = 0x10, /*!< Sequencer 4 enabled */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_5 = 0x20, /*!< Sequencer 5 enabled */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_6 = 0x40, /*!< Sequencer 6 enabled */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_7 = 0x80, /*!< Sequencer 7 enabled */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_8 = 0x100, /*!< Sequencer 8 enabled */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_9 = 0x200, /*!< Sequencer 9 enabled */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_10 = 0x400, /*!< Sequencer 10 enabled */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_11 = 0x800, /*!< Sequencer 11 enabled */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_12 = 0x1000, /*!< Sequencer 12 enabled */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_13 = 0x2000, /*!< Sequencer 13 enabled */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_14 = 0x4000, /*!< Sequencer 14 enabled */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_15 = 0x8000, /*!< Sequencer 15 enabled */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_ALL = (ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_0 | ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_1 | ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_2 | ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_3 | + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_4 | ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_5 | ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_6 | ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_7 | + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_8 | ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_9 | ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_10 | ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_11 | + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_12 | ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_13 | ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_14 | ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_MASK_15) + /*!< All Sequencers enabled */ +} adi_adrv904x_DfeSvcRadioCtrlSequencersMask_e; + +/** + * \brief Set of system signals controllable by the radio sequencer + */ +typedef enum +{ + /* TX capture buffer enables */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_0_CAP_BUF_EN = 0x00, /*!< TX Channel 0 capture buffer enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_1_CAP_BUF_EN = 0x01, /*!< TX Channel 1 capture buffer enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_2_CAP_BUF_EN = 0x02, /*!< TX Channel 2 capture buffer enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_3_CAP_BUF_EN = 0x03, /*!< TX Channel 3 capture buffer enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_4_CAP_BUF_EN = 0x04, /*!< TX Channel 4 capture buffer enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_5_CAP_BUF_EN = 0x05, /*!< TX Channel 5 capture buffer enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_6_CAP_BUF_EN = 0x06, /*!< TX Channel 6 capture buffer enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_7_CAP_BUF_EN = 0x07, /*!< TX Channel 7 capture buffer enable */ + + /* TX capture buffer triggers */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_0_CAP_BUF_TRIG = 0x08, /*!< TX Channel 0 capture buffer trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_1_CAP_BUF_TRIG = 0x09, /*!< TX Channel 1 capture buffer trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_2_CAP_BUF_TRIG = 0x0A, /*!< TX Channel 2 capture buffer trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_3_CAP_BUF_TRIG = 0x0B, /*!< TX Channel 3 capture buffer trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_4_CAP_BUF_TRIG = 0x0C, /*!< TX Channel 4 capture buffer trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_5_CAP_BUF_TRIG = 0x0D, /*!< TX Channel 5 capture buffer trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_6_CAP_BUF_TRIG = 0x0E, /*!< TX Channel 6 capture buffer trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_7_CAP_BUF_TRIG = 0x0F, /*!< TX Channel 7 capture buffer trigger */ + + /* Core stream triggers */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_0_TRIG = 0x10, /*!< Core Stream 0 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_1_TRIG = 0x11, /*!< Core Stream 1 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_2_TRIG = 0x12, /*!< Core Stream 2 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_3_TRIG = 0x13, /*!< Core Stream 3 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_4_TRIG = 0x14, /*!< Core Stream 4 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_5_TRIG = 0x15, /*!< Core Stream 5 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_6_TRIG = 0x16, /*!< Core Stream 6 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_7_TRIG = 0x17, /*!< Core Stream 7 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_8_TRIG = 0x18, /*!< Core Stream 8 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_9_TRIG = 0x19, /*!< Core Stream 9 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_10_TRIG = 0x1A, /*!< Core Stream 10 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_11_TRIG = 0x1B, /*!< Core Stream 11 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_12_TRIG = 0x1C, /*!< Core Stream 12 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_13_TRIG = 0x1D, /*!< Core Stream 13 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_14_TRIG = 0x1E, /*!< Core Stream 14 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_15_TRIG = 0x1F, /*!< Core Stream 15 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_16_TRIG = 0x20, /*!< Core Stream 16 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_17_TRIG = 0x21, /*!< Core Stream 17 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_18_TRIG = 0x22, /*!< Core Stream 18 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_19_TRIG = 0x23, /*!< Core Stream 19 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_20_TRIG = 0x24, /*!< Core Stream 20 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_21_TRIG = 0x25, /*!< Core Stream 21 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_22_TRIG = 0x26, /*!< Core Stream 22 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_23_TRIG = 0x27, /*!< Core Stream 23 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_24_TRIG = 0x28, /*!< Core Stream 24 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_25_TRIG = 0x29, /*!< Core Stream 25 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_26_TRIG = 0x2A, /*!< Core Stream 26 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_27_TRIG = 0x2B, /*!< Core Stream 27 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_28_TRIG = 0x2C, /*!< Core Stream 28 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_29_TRIG = 0x2D, /*!< Core Stream 29 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_30_TRIG = 0x2E, /*!< Core Stream 30 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_CORE_STREAM_31_TRIG = 0x2F, /*!< Core Stream 31 trigger */ + + /* Radio processor interrupts */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RADIO_PROC_INT_0 = 0x30, /*!< Radio processor interrupt 0 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RADIO_PROC_INT_1 = 0x31, /*!< Radio processor interrupt 1 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RADIO_PROC_INT_2 = 0x32, /*!< Radio processor interrupt 2 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RADIO_PROC_INT_3 = 0x33, /*!< Radio processor interrupt 3 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RADIO_PROC_INT_4 = 0x34, /*!< Radio processor interrupt 4 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RADIO_PROC_INT_5 = 0x35, /*!< Radio processor interrupt 5 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RADIO_PROC_INT_6 = 0x36, /*!< Radio processor interrupt 6 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RADIO_PROC_INT_7 = 0x37, /*!< Radio processor interrupt 7 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RADIO_PROC_INT_8 = 0x38, /*!< Radio processor interrupt 8 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RADIO_PROC_INT_9 = 0x39, /*!< Radio processor interrupt 9 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RADIO_PROC_INT_10 = 0x3A, /*!< Radio processor interrupt 10 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RADIO_PROC_INT_11 = 0x3B, /*!< Radio processor interrupt 11 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RADIO_PROC_INT_12 = 0x3C, /*!< Radio processor interrupt 12 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RADIO_PROC_INT_13 = 0x3D, /*!< Radio processor interrupt 13 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RADIO_PROC_INT_14 = 0x3E, /*!< Radio processor interrupt 14 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RADIO_PROC_INT_15 = 0x3F, /*!< Radio processor interrupt 15 */ + + /* DFE processor interrupts */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_0 = 0x40, /*!< DFE processor interrupt 0 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_1 = 0x41, /*!< DFE processor interrupt 1 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_2 = 0x42, /*!< DFE processor interrupt 2 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_3 = 0x43, /*!< DFE processor interrupt 3 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_4 = 0x44, /*!< DFE processor interrupt 4 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_5 = 0x45, /*!< DFE processor interrupt 5 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_6 = 0x46, /*!< DFE processor interrupt 6 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_7 = 0x47, /*!< DFE processor interrupt 7 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_8 = 0x48, /*!< DFE processor interrupt 8 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_9 = 0x49, /*!< DFE processor interrupt 9 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_10 = 0x4A, /*!< DFE processor interrupt 10 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_11 = 0x4B, /*!< DFE processor interrupt 11 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_12 = 0x4C, /*!< DFE processor interrupt 12 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_13 = 0x4D, /*!< DFE processor interrupt 13 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_14 = 0x4E, /*!< DFE processor interrupt 14 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_15 = 0x4F, /*!< DFE processor interrupt 15 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_16 = 0x50, /*!< DFE processor interrupt 16 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_17 = 0x51, /*!< DFE processor interrupt 17 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_18 = 0x52, /*!< DFE processor interrupt 18 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_19 = 0x53, /*!< DFE processor interrupt 19 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_20 = 0x54, /*!< DFE processor interrupt 20 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_21 = 0x55, /*!< DFE processor interrupt 21 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_22 = 0x56, /*!< DFE processor interrupt 22 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_23 = 0x57, /*!< DFE processor interrupt 23 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_24 = 0x58, /*!< DFE processor interrupt 24 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_25 = 0x59, /*!< DFE processor interrupt 25 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_26 = 0x5A, /*!< DFE processor interrupt 26 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_27 = 0x5B, /*!< DFE processor interrupt 27 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_28 = 0x5C, /*!< DFE processor interrupt 28 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_29 = 0x5D, /*!< DFE processor interrupt 29 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_30 = 0x5E, /*!< DFE processor interrupt 30 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DFE_PROC_INT_31 = 0x5F, /*!< DFE processor interrupt 31 */ + + /* Digital GPIO enables */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_0_EN = 0x60, /*!< Digial GPIO 0 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_1_EN = 0x61, /*!< Digial GPIO 1 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_2_EN = 0x62, /*!< Digial GPIO 2 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_3_EN = 0x63, /*!< Digial GPIO 3 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_4_EN = 0x64, /*!< Digial GPIO 4 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_5_EN = 0x65, /*!< Digial GPIO 5 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_6_EN = 0x66, /*!< Digial GPIO 6 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_7_EN = 0x67, /*!< Digial GPIO 7 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_8_EN = 0x68, /*!< Digial GPIO 8 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_9_EN = 0x69, /*!< Digial GPIO 9 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_10_EN = 0x6A, /*!< Digial GPIO 10 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_11_EN = 0x6B, /*!< Digial GPIO 11 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_12_EN = 0x6C, /*!< Digial GPIO 12 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_13_EN = 0x6D, /*!< Digial GPIO 13 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_14_EN = 0x6E, /*!< Digial GPIO 14 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_15_EN = 0x6F, /*!< Digial GPIO 15 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_16_EN = 0x70, /*!< Digial GPIO 16 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_17_EN = 0x71, /*!< Digial GPIO 17 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_18_EN = 0x72, /*!< Digial GPIO 18 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_19_EN = 0x73, /*!< Digial GPIO 19 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_20_EN = 0x74, /*!< Digial GPIO 20 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_21_EN = 0x75, /*!< Digial GPIO 21 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_22_EN = 0x76, /*!< Digial GPIO 22 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_23_EN = 0x77, /*!< Digial GPIO 23 enable */ + + /* Analog GPIO enables */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ANALOG_GPIO_0_EN = 0x78, /*!< Analog GPIO 0 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ANALOG_GPIO_1_EN = 0x79, /*!< Analog GPIO 1 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ANALOG_GPIO_2_EN = 0x7A, /*!< Analog GPIO 2 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ANALOG_GPIO_3_EN = 0x7B, /*!< Analog GPIO 3 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ANALOG_GPIO_4_EN = 0x7C, /*!< Analog GPIO 4 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ANALOG_GPIO_5_EN = 0x7D, /*!< Analog GPIO 5 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ANALOG_GPIO_6_EN = 0x7E, /*!< Analog GPIO 6 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ANALOG_GPIO_7_EN = 0x7F, /*!< Analog GPIO 7 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ANALOG_GPIO_8_EN = 0x80, /*!< Analog GPIO 8 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ANALOG_GPIO_9_EN = 0x81, /*!< Analog GPIO 9 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ANALOG_GPIO_10_EN = 0x82, /*!< Analog GPIO 10 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ANALOG_GPIO_11_EN = 0x83, /*!< Analog GPIO 11 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ANALOG_GPIO_12_EN = 0x84, /*!< Analog GPIO 12 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ANALOG_GPIO_13_EN = 0x85, /*!< Analog GPIO 13 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ANALOG_GPIO_14_EN = 0x86, /*!< Analog GPIO 14 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ANALOG_GPIO_15_EN = 0x87, /*!< Analog GPIO 15 enable */ + + /* TX channel enables */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_0_CH_EN = 0x88, /*!< TX Channel 0 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_1_CH_EN = 0x89, /*!< TX Channel 1 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_2_CH_EN = 0x8A, /*!< TX Channel 2 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_3_CH_EN = 0x8B, /*!< TX Channel 3 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_4_CH_EN = 0x8C, /*!< TX Channel 4 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_5_CH_EN = 0x8D, /*!< TX Channel 5 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_6_CH_EN = 0x8E, /*!< TX Channel 6 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_7_CH_EN = 0x8F, /*!< TX Channel 7 enable */ + + /* TX antenna enables */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_0_ANT_EN = 0x90, /*!< TX Channel 0 Antenna enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_1_ANT_EN = 0x91, /*!< TX Channel 1 Antenna enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_2_ANT_EN = 0x92, /*!< TX Channel 2 Antenna enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_3_ANT_EN = 0x93, /*!< TX Channel 3 Antenna enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_4_ANT_EN = 0x94, /*!< TX Channel 4 Antenna enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_5_ANT_EN = 0x95, /*!< TX Channel 5 Antenna enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_6_ANT_EN = 0x96, /*!< TX Channel 6 Antenna enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_7_ANT_EN = 0x97, /*!< TX Channel 7 Antenna enable */ + + /* RX channel enables */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_0_CH_EN = 0x98, /*!< RX Channel 0 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_1_CH_EN = 0x99, /*!< RX Channel 1 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_2_CH_EN = 0x9A, /*!< RX Channel 2 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_3_CH_EN = 0x9B, /*!< RX Channel 3 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_4_CH_EN = 0x9C, /*!< RX Channel 4 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_5_CH_EN = 0x9D, /*!< RX Channel 5 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_6_CH_EN = 0x9E, /*!< RX Channel 6 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_7_CH_EN = 0x9F, /*!< RX Channel 7 enable */ + + /* RX antenna enables */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_0_ANT_EN = 0xA0, /*!< RX Channel 0 Antenna enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_1_ANT_EN = 0xA1, /*!< RX Channel 1 Antenna enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_2_ANT_EN = 0xA2, /*!< RX Channel 2 Antenna enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_3_ANT_EN = 0xA3, /*!< RX Channel 3 Antenna enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_4_ANT_EN = 0xA4, /*!< RX Channel 4 Antenna enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_5_ANT_EN = 0xA5, /*!< RX Channel 5 Antenna enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_6_ANT_EN = 0xA6, /*!< RX Channel 6 Antenna enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_7_ANT_EN = 0xA7, /*!< RX Channel 7 Antenna enable */ + + /* ORX channel enables */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ORX_0_CH_EN = 0xA8, /*!< ORX Channel 0 enable */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ORX_1_CH_EN = 0xA9, /*!< ORX Channel 0 enable */ + + /* TX special function triggers + * + * The primary function of these signals is to trigger slice streams. + * + * A secondary function can be enabled depending on "Radio_Sequencer_Mux_Registers" setting to: + * 1. Select VSWR as TXON + * 2. Update trigger for tx attenuation block + * 3. Reset of measurement for DFE TSSI 2 Block + * 4. Reset of measurement for DFE TSSI 1 Block + * + * See "Radio_Sequencer_Mux_Registers" for details + */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_FUNC_0_TRIG = 0xAA, /*!< TX special function #0 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_FUNC_1_TRIG = 0xAB, /*!< TX special function #1 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_FUNC_2_TRIG = 0xAC, /*!< TX special function #2 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_FUNC_3_TRIG = 0xAD, /*!< TX special function #3 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_FUNC_4_TRIG = 0xAE, /*!< TX special function #4 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_FUNC_5_TRIG = 0xAF, /*!< TX special function #5 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_FUNC_6_TRIG = 0xB0, /*!< TX special function #6 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_TX_FUNC_7_TRIG = 0xB1, /*!< TX special function #7 trigger */ + + /* RX special function triggers + * + * The primary function of these signals is to trigger RX slice streams + */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_FUNC_0_TRIG = 0xB2, /*!< RX special function #0 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_FUNC_1_TRIG = 0xB3, /*!< RX special function #1 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_FUNC_2_TRIG = 0xB4, /*!< RX special function #2 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_FUNC_3_TRIG = 0xB5, /*!< RX special function #3 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_FUNC_4_TRIG = 0xB6, /*!< RX special function #4 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_FUNC_5_TRIG = 0xB7, /*!< RX special function #5 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_FUNC_6_TRIG = 0xB8, /*!< RX special function #6 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_RX_FUNC_7_TRIG = 0xB9, /*!< RX special function #7 trigger */ + + /* ORX special function triggers + * + * The primary function of these signals is to trigger ORX slice streams + * + * A secondary function can be enabled depending on ORX "Radio_Sequencer_Mux_Registers" setting to: + * 1. Reset of measurement for the DFE TSSI Block + * + * See ORX "Radio_Sequencer_Mux_Registers" for details + */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ORX_FUNC_0_TRIG = 0xBA, /*!< ORX special function #0 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ORX_FUNC_1_TRIG = 0xBB, /*!< ORX special function #1 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ORX_FUNC_2_TRIG = 0xBC, /*!< ORX special function #2 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ORX_FUNC_3_TRIG = 0xBD, /*!< ORX special function #3 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ORX_FUNC_4_TRIG = 0xBE, /*!< ORX special function #4 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ORX_FUNC_5_TRIG = 0xBF, /*!< ORX special function #5 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ORX_FUNC_6_TRIG = 0xC0, /*!< ORX special function #6 trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ORX_FUNC_7_TRIG = 0xC1, /*!< ORX special function #7 trigger */ + + /* TX/ORX mapping update triggers */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ORX_0_MAP_UPDATE_TRIG = 0xC2, /*!< ORX Channel 0 Tx/Orx mapping update trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ORX_1_MAP_UPDATE_TRIG = 0xC3, /*!< ORX Channel 1 Tx/Orx mapping update trigger */ + + /* GPIO update triggers */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_DIG_GPIO_UPDATE_TRIG = 0xC4, /*!< Digital GPIO update trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ANALOG_GPIO_UPDATE_TRIG = 0xC5, /*!< Analog GPIO update trigger */ + + /* VSWR direction update triggers */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ORX_0_VSWR_DIR_SEL_UPDATE_TRIG = 0xC6, /*!< ORX Channel 0 VSWR direction update trigger */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_ORX_1_VSWR_DIR_SEL_UPDATE_TRIG = 0xC7, /*!< ORX Channel 1 VSWR direction update trigger */ + + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SIGNAL_UNUSED_BEGIN = 0xC8 /*!< Beginning of unused/unmapped signals */ +} adi_adrv904x_DfeSvcRadioCtrlSequencerSignal_e; + +/** + * \brief Structure for holding different errors reported by radio sequencer hardware. + * + */ +typedef struct +{ + uint8_t ssbSyncPhaseError; /*!< Incoming SSB_SYNC from pin has shifted from original SSB_SYNC. 1 - Error Occured, 0 - No Error. */ + uint16_t busErrorMask; /*!< AHB bus has returned an error response.Mask is bit mapped to 16 radio sequencers.Refer adi_adrv904x_DfeSvcRadioCtrlSequencersMask_e to generate the mask. 1 - Error Occured, 0 - No Error. */ + uint16_t fetchErrorMask; /*!< Sequencer was still in FETCH state during a symbol boundary. This is a catastrophic error.Mask is bit mapped to 16 radio sequencers.Refer adi_adrv904x_DfeSvcRadioCtrlSequencersMask_e to generate the mask. 1 - Error Occured, 0 - No Error. */ +} adi_adrv904x_DfeSvcRadioCtrlSequencerErrorInfo_t; + +/** + * \brief Radio sequencer pattern identifier + */ +typedef size_t adi_adrv904x_DfeSvcRadioCtrlSequencerPatternId_t; + +#endif /* __ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_T_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_radio_ctrl_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_radio_ctrl_t.h new file mode 100644 index 00000000000..eb6f5dea5e1 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_radio_ctrl_t.h @@ -0,0 +1,58 @@ +/** + * Copyright 2020 - 2021 Analog Devices Inc. + * Released under the ADRV904X Software license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file + * \brief Radio Control SDK Service API types + * + * SDK API Version: 2.10.0.4 + */ + +#ifndef ADRV904X_DFE_SVC_RADIOCTRL_T_H_ +#define ADRV904X_DFE_SVC_RADIOCTRL_T_H_ + +/** + * \brief Enumerated list for VSWR Fwd/Rev Settings. + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_VSWR_FWD = 1, /*!< Vswr Forward setting */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_VSWR_REV = 0, /*!< Vswr Reverse setting */ +} adi_adrv904x_DfeSvcRadioCtrlVswrFwdRev_e; + +/** + * \brief Enumerated list for Alarm Settings. + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_ALARM_ON = 1, /*!< Alarm on */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_ALARM_OFF = 0, /*!< Alarm off */ +} adi_adrv904x_DfeSvcAlarmState_e; + +/** + * \brief Enumerated list for Alarms. + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_ALARM_0 = 0x01, /*!< Alarm 0 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_ALARM_1 = 0x02, /*!< Alarm 1 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_ALARM_2 = 0x04, /*!< Alarm 2 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_ALARM_3 = 0x08, /*!< Alarm 3 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_ALARM_4 = 0x10, /*!< Alarm 4 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_ALARM_5 = 0x20, /*!< Alarm 5 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_ALARM_6 = 0x40, /*!< Alarm 6 */ + ADI_ADRV904X_DFE_SVC_RADIO_CTRL_ALARM_7 = 0x80, /*!< Alarm 7 */ +} adi_adrv904x_DfeSvcRadioCtrlAlarms_e; + +/** + * \brief defined max number of alarms + */ +#define ADI_ADRV904X_DFE_SVC_RADIO_CTRL_ALARM_MAX 8 + + +#endif /* ADRV904X_DFE_SVC_RADIOCTRL_T_H_ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_watchdog_t.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_watchdog_t.h new file mode 100644 index 00000000000..f3db2bc255d --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_svc_watchdog_t.h @@ -0,0 +1,38 @@ +/** + * Copyright 2020 - 2022 Analog Devices Inc. + * Released under the ADRV904X Software license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adi_adrv904x_dfe_svc_watchdog_t.h + * \brief Contains DFE SDK data types. + * + * DFE SDK API Version: 2.10.0.4 + */ +#ifndef ADRV904X_DFE_SVC_WATCHDOG_T_H_ +#define ADRV904X_DFE_SVC_WATCHDOG_T_H_ + +/*============= I N C L U D E S =============*/ + +#include + +/** + * \brief Watchdog instance enumerations + * + */ +typedef enum +{ + ADI_ADRV904X_DFE_SVC_WATCHDOG_SYSTEM_LOCKUP_INSTANCE = 0, /*!< Watchdog instance responsible for detecting firmware lockup */ + ADI_ADRV904X_DFE_SVC_WATCHDOG_SYSTEM_OVERLOAD_INSTANCE, /*!< Watchdog instance responsible for detecting prolonged CPU overload */ + ADI_ADRV904X_DFE_SVC_WATCHDOG_INSTANCE_2, /*!< Enumeration for Watchdog instance 2 */ + ADI_ADRV904X_DFE_SVC_WATCHDOG_INSTANCE_3, /*!< Enumeration for Watchdog instance 3 */ + ADI_ADRV904X_DFE_SVC_WATCHDOG_NUM_WDT, /*!< Number of Watchdog instances */ +} adi_adrv904x_DfeSvcWatchdogInstance_e; + +typedef uint8_t adi_adrv904x_DfeSvcWatchdogInstance_t; + +#endif /* ADRV904X_DFE_SVC_WATCHDOG_T_H_ */ + + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_utilities.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_utilities.h new file mode 100644 index 00000000000..19638f92c57 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_utilities.h @@ -0,0 +1,136 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_dfe_utilities.h +* \brief Contains top level ADRV904X related function prototypes for +* adi_adrv904x_dfe_utilities.c +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#ifndef _ADI_ADRV904X_DFE_UTILITIES_H_ +#define _ADI_ADRV904X_DFE_UTILITIES_H_ + +#include "adi_adrv904x_dfe_utilities_types.h" +#include "adi_adrv904x_error.h" +#include "adi_adrv904x_dfe_svc_radio_ctrl_sequencer_t.h" + +/** +* \brief Reads back the DFE SDK lib version loaded into the DFE processor +* +* This function reads the DFE processor SDK version number, Major, Minor, Maintenance, +* Build number and the binary type after DFE initial. +* +* \pre This function may be called after the CPU binary have been initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] dfeSdkVersion dfeSdkVersion adi_adrv904x_CpuFwVersion_t pointer to DFE SDK version structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeSdkVersionGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_CpuFwVersion_t* const dfeSdkVersion); + +/** +* \brief Reads back the DFE processor application version loaded into the DFE processor +* +* This function Reads the DFE processor application version number, Major, Minor, +* Maintenance, Build number and the binary type. +* +* \pre This function may be called after the CPU binary have been initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] dfeAppVersion dfeSdkVersion adi_adrv904x_CpuFwVersion_t pointer to DFE processor application version structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE Function completed successfully, no action required +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeAppVersionGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_CpuFwVersion_t* const dfeAppVersion); + +/** +* \brief Function to get Radio Sequencer Error Information +* +* \pre This function may be called after the RS binary have been initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] errorInfo Pointer to readback RS error information +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerErrorInfoGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeSvcRadioCtrlSequencerErrorInfo_t* const errorInfo); + +/** +* \brief Function to clear Radio Sequencer's SSB_SYNC phase error bit +* +* \pre This function should be called by BBIC when it receives an RS SSB_SYNC phase error interupt. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerSsbSyncPhaseErrorClear(adi_adrv904x_Device_t* const device); + +/** +* \brief Function to get DFE Logtrace buffer Information +* +* \pre This function may be called after the logtrace buffer have been initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] logTrace correct sequence character buffer data +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeLogTraceBufferGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeLogTraceBuffer_t* const logTrace); + +/** +* \brief Reads the active capture type selected with Tx to Orx mapping +* +* Based on the tx to orx mapping table used in stream settings, user can select either DPD or VSWR +* captures in RCI mode. This function can be used to retrieve the active capture type configured on the HW. +* When radio sequencer is being used to change tx to orx mapping, return value from this API may not be +* reliable. +* +* \pre This function may be called after the Stream processors have been initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] orx0CaptureType Capture type for Orx0 channel +* \param[out] orx1CaptureType Capture type for Orx0 channel +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCaptureTypeGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeCaptureType_e* const orx0CaptureType, + adi_adrv904x_DfeCaptureType_e* const orx1CaptureType); + + +#endif /* _ADI_ADRV904X_DFE_UTILITIES_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_utilities_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_utilities_types.h new file mode 100644 index 00000000000..59c964131a8 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_utilities_types.h @@ -0,0 +1,57 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_dfe_utilities_types.h +* \brief Contains ADRV904X API Utilities data types +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#ifndef _ADI_ADRV904X_DFE_UTILITIES_TYPES_H_ +#define _ADI_ADRV904X_DFE_UTILITIES_TYPES_H_ + +#include "adi_adrv904x_user.h" +#include "adi_library_types.h" +#include "adi_adrv904x_dfe_cfr.h" +#include "adi_adrv904x_tx.h" +#include "adi_adrv904x_rx.h" + +/** + * \brief Maxinum logtrace buffer size + */ +#define ADI_ADRV904X_MAX_LOGTRACE_SIZE (1024U) + +/** + * \brief the logtrace wait writeflag timeout us + */ +#define ADI_ADRV904X_LOGTRACE_TIMEOUT_US (500U) + +/** + * \brief the logtrace wait writeflag interval us + */ +#define ADI_ADRV904X_LOGTRACE_INTERVAL_US (100U) + +/** +* \brief Data structure to logtrace Buffer +*/ +typedef struct adi_adrv904x_DfeLogTraceBuffer +{ + uint8_t logTraceData[ADI_ADRV904X_MAX_LOGTRACE_SIZE]; /*!< DFE logtrace max data 1024 bytes*/ + uint32_t size; /*!< DFE logtrace data size */ + uint8_t overFlowFlag;/*!< DFE logtrace data overflow >*/ +} adi_adrv904x_DfeLogTraceBuffer_t; + +/** +* \brief Enum for capture type, VSWR vs DPD +*/ +typedef enum adi_adrv904x_DfeCaptureType +{ + ADI_ADRV904X_DFE_CAPTURE_TYPE_DPD = 0, /*!< DPD capture type */ + ADI_ADRV904X_DFE_CAPTURE_TYPE_VSWR = 1 /*!< VSWR capture type */ +} adi_adrv904x_DfeCaptureType_e; + +#endif /* _ADI_ADRV904X_DFE_UTILITIES_TYPES_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_vswr.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_vswr.h new file mode 100644 index 00000000000..0e58a86984c --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_vswr.h @@ -0,0 +1,168 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_dfe_vswr.h +* \brief Contains ADRV904X VSWR function prototypes for +* adi_adrv904x_dfe_vswr.c +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#ifndef _ADI_ADRV904X_DFE_VSWR_H_ +#define _ADI_ADRV904X_DFE_VSWR_H_ + +#include "adi_adrv904x_dfe_vswr_types.h" +#include "adi_adrv904x_error.h" +#include "adi_common_error_types.h" +#include "adi_adrv904x_dfe_cal_vswr_types.h" + +/** +* \brief Write VSWR pulse RAM. +* +* \pre This function is called after the device has been initialized. It's used to write a dataset to VSWR +* playback RAM. This dataset is added to signal on datapath after PreDPD HB1 block. This function call will +* throw error if playback data generation is enabled. It's users responsibility to make sure playback data isn't +* enabled while this API writes a new data set to playback RAM. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] txChannelMask - One or multiple Tx channel selection to apply playback data +* \param[in] playbackData - Pointer to playback data structure to be written to VSWR playback RAM +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_VswrPlaybackDataWrite(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const adi_adrv904x_VswrPlaybackData_t* const playbackData); + +/** +* \brief Write VSWR pulse RAM. +* +* \pre This function is called before the device has been initialized. It's used to write a dataset to VSWR +* playback RAM. This dataset is added to signal on datapath after PreDPD HB1 block. This function call will +* throw error if playback data generation is enabled. It's users responsibility to make sure playback data isn't +* enabled while this API writes a new data set to playback RAM. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] txChannelMask - One or multiple Tx channel selection to apply playback data +* \param[in] playbackData - Pointer to playback data structure to be written to VSWR playback RAM +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_VswrPlaybackDataWrite_v2(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const adi_adrv904x_VswrPlaybackData_t* const playbackData); + + +/** +* \brief Read VSWR pulse RAM. +* +* \pre This function is called after the device has been initialized. It's used to read the dataset stored +* at VSWR playback RAM. This dataset is added to signal on datapath after PreDPD HB1 block. This function call will +* throw error if playback data generation is enabled. It's users responsibility to make sure playback data isn't +* enabled while this API reads playback RAM. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] txChannelSel - Tx channel selection to read playback data, only one tx channel needs to be selected +* \param[out] playbackData - Pointer to playback data structure to be read from VSWR playback RAM +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_VswrPlaybackDataRead(adi_adrv904x_Device_t* const device, + const uint32_t txChannelSel, + adi_adrv904x_VswrPlaybackData_t* const playbackData); + +/** +* \brief Set tracking config for VSWR tracking. +* +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] vswrTxChannelMask - Tx channel mask to set the configuration for. Multiple Tx channels can be selected +* \param[in] cfg - Pointer to tracking config data structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_VswrTrackingConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t vswrTxChannelMask, + const adi_adrv904x_DfeAppCalVswrCfg_t* const cfg); + +/** +* \brief Read tracking config of VSWR tracking. +* +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] vswrTxChannelSel - Tx channel selection to read the configuration of. Only one channel should be selected +* \param[out] cfg - Pointer to tracking config data structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_VswrTrackingConfigGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e vswrTxChannelSel, + adi_adrv904x_DfeAppCalVswrCfg_t* const cfg); + +/** +* \brief Read the VSWR specific status data of selected channel. Common status header can be read +* by using adi_adrv904x_DfeTrackingCalStatusGet function. +* +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] vswrTxChannelSel - Tx channel selection to read the status of VSWR tracking +* \param[out] vswrStatus - Pointer to status data structure +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_VswrStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e vswrTxChannelSel, + adi_adrv904x_DfeAppCalVswrStatus_t* const vswrStatus); + +/** +* \brief Reset VSWR for requested Tx channel/s +* +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] vswrTxChannelMask - Tx channel mask to reset VSWR tracking. Multiple channels can be selected +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_VswrReset(adi_adrv904x_Device_t* const device, + const uint32_t vswrTxChannelMask); + +#endif /* _ADI_ADRV904X_DFE_VSWR_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_vswr_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_vswr_types.h new file mode 100644 index 00000000000..c334eee1a15 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_dfe_vswr_types.h @@ -0,0 +1,35 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_dfe_vswr_types.h +* +* \brief Contains ADRV904X data types for dfe vswr feature +* +* ADRV904X API Version: 2.10.0.4 +*/ + + +#ifndef _ADI_ADRV904X_DFE_VSWR_TYPES_H_ +#define _ADI_ADRV904X_DFE_VSWR_TYPES_H_ + + + +#include "adi_adrv904x_user.h" +#include "adi_library_types.h" +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_dfe_svc_dfe_vswr_cmn_t.h" + +#define ADI_ADVRV904X_TX0_VSWR_PLAYBACK_RAM_BASEADDR 0x608F9000U /*!< Base Address of Pulse RAM for TX0 */ +#define ADI_ADVRV904X_TX1_VSWR_PLAYBACK_RAM_BASEADDR 0x609F9000U /*!< Base Address of Pulse RAM for TX1 */ +#define ADI_ADVRV904X_TX2_VSWR_PLAYBACK_RAM_BASEADDR 0x60AF9000U /*!< Base Address of Pulse RAM for TX2 */ +#define ADI_ADVRV904X_TX3_VSWR_PLAYBACK_RAM_BASEADDR 0x60BF9000U /*!< Base Address of Pulse RAM for TX3 */ +#define ADI_ADVRV904X_TX4_VSWR_PLAYBACK_RAM_BASEADDR 0x60CF9000U /*!< Base Address of Pulse RAM for TX4 */ +#define ADI_ADVRV904X_TX5_VSWR_PLAYBACK_RAM_BASEADDR 0x60DF9000U /*!< Base Address of Pulse RAM for TX5 */ +#define ADI_ADVRV904X_TX6_VSWR_PLAYBACK_RAM_BASEADDR 0x60EF9000U /*!< Base Address of Pulse RAM for TX6 */ +#define ADI_ADVRV904X_TX7_VSWR_PLAYBACK_RAM_BASEADDR 0x60FF9000U /*!< Base Address of Pulse RAM for TX7 */ + +#endif /* _ADI_ADRV904X_DFE_VSWR_TYPES_H_ */ \ No newline at end of file diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_error.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_error.h new file mode 100644 index 00000000000..46a93d3163e --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_error.h @@ -0,0 +1,63 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_error.h +* +* \brief Device Specific Abstractions for Common Error Declarations +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#ifndef _ADI_ADRV904X_ERROR_H_ +#define _ADI_ADRV904X_ERROR_H_ + +#include "adi_adrv904x_types.h" +#include "adi_adrv904x_error_types.h" + +/** + * \brief Service to Lookup the Error Message and Recovery Action for an Error Code + * + * \param[in] errSrc Error Source for the Device Type + * \param[in] errCode Error Code to be Looked Up + * \param[out] errMsgPtr Associated Error Message + * \param[out] errCausePtr Associated Error Cause + * \param[out] actionCodePtr Associated Recovery Action for the Error + * \param[out] actionMsgPtr Associated Action Message + * + * \retval ADI_ADRV904X_ERR_ACT_NONE if Lookup was Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ErrInfoGet(const adi_adrv904x_ErrSource_e errSrc, + const int64_t errCode, + const char** const errMsgPtr, + const char** const errCausePtr, + adi_adrv904x_ErrAction_e* const actionCodePtr, + const char** const actionMsgPtr); + +/** + * \brief Service to Parse Error Data from the Error Structure + * + * \param[in] device Pointer to the device + * \param[in] frameId Stack Trace Frame ID + * \param[out] errSrcPtr Error Source for the Device Type + * \param[out] errCodePtr Associated Error Code + * \param[out] errCausePtr Associated Error Message + * \param[out] errMsgPtr Associated Error Cause + * \param[out] actionCodePtr Associated Recovery Action for the Error + * \param[out] actionMsgPtr Associated Action Message + * + * \retval ADI_ADRV904X_ERR_ACT_NONE if Lookup was Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ErrDataGet(const adi_adrv904x_Device_t* const device, + const adi_common_ErrFrameId_e frameId, + adi_adrv904x_ErrSource_e* const errSrcPtr, + int64_t* const errCodePtr, + const char** const errMsgPtr, + const char** const errCausePtr, + adi_adrv904x_ErrAction_e* const actionCodePtr, + const char** const actionMsgPtr); + +#endif /* _ADI_ADRV904X_ERROR_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_error_type_action.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_error_type_action.h new file mode 100644 index 00000000000..5b1a32d253a --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_error_type_action.h @@ -0,0 +1,50 @@ + /** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + + /** + * \file adi_adrv904x_error_type_action.h + * + * \brief Device Recovery Action Type + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADI_ADRV904X_ERROR_TYPE_ACTION_H_ +#define _ADI_ADRV904X_ERROR_TYPE_ACTION_H_ + + +/** +* \brief ADI ADRV904X Recovery Actions +*/ +typedef enum adi_adrv904x_ErrAction +{ + ADI_ADRV904X_ERR_ACT_RESET_DEVICE = -500, /*!< Device NOK: HW/SW Reset Required */ + + /* All Reset Feature Unique Codes exist between -500 & -400 */ + ADI_ADRV904X_ERR_ACT_RESET_FEATURE = -400, /*!< API NOK: Feature Reset Required */ + + /* All Reset Interface Unique Codes exist between -400 & -300 */ + ADI_ADRV904X_ERR_ACT_RESET_INTERFACE = -300, /*!< API NOK: Interface Reset Required */ + + /* All Check Feature Unique Codes exist between -300 & -200 */ + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE = -200, /*!< API OK; Feature is reporting an Error */ + + /* All Check Interface Unique Codes exist between -200 & -100 */ + ADI_ADRV904X_ERR_ACT_CHECK_INTERFACE = -100, /*!< API OK; Interface is reporting an Error */ + + /* All Development Unique Codes exist between -100 & -1 */ + ADI_ADRV904X_ERR_ACT_OPEN_DEVICE = -10, /*!< API OK; Device Not Open */ + ADI_ADRV904X_ERR_ACT_CHECK_MULTIVERSIONING = -3, /*!< API OK: Note: No other error data set */ + ADI_ADRV904X_ERR_ACT_CHECK_PARAM = -1, /*!< API OK; Invalid Parameter passed to function */ + + /* No Error/Recovery Action */ + ADI_ADRV904X_ERR_ACT_NONE = 0 /*!< API OK; No Action Required */ +} adi_adrv904x_ErrAction_e; + +#endif /* _ADI_ADRV904X_ERROR_TYPE_ACTION_H_ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_error_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_error_types.h new file mode 100644 index 00000000000..b128ae02b4e --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_error_types.h @@ -0,0 +1,483 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adi_adrv904x_error_types.h + * + * \brief Device Specific Error Types + * + * \details + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADI_ADRV904X_ERROR_TYPES_H_ +#define _ADI_ADRV904X_ERROR_TYPES_H_ + +#include "adi_library_types.h" +#include "adi_common_error_types.h" +#include "adi_adrv904x_error_type_action.h" + +/* Cal Error Codes */ + + /* TODO: Implement High Level Error Codes; Reserved: 100 */ +#define ADI_ADRV904X_ERRCODE_CALS_INIT_ERROR_FLAG 100UL /* Init Cals Run Error Flag */ + +/* CPU Error Codes */ + + /* TODO: Implement High Level Error Codes; Reserved: 200 */ +#define ADI_ADRV904X_ERRCODE_CPU_CMD_ID 200UL /* Command ID Error */ +#define ADI_ADRV904X_ERRCODE_CPU_CMD_RESPONSE 201UL /* Command Response Error */ +#define ADI_ADRV904X_ERRCODE_CPU_CMD_TIMEOUT 203UL /* Command Timeout */ +#define ADI_ADRV904X_ERRCODE_CPU_IMAGE_NOT_LOADED 204UL /* CPU Image Not Loaded */ +#define ADI_ADRV904X_ERRCODE_CPU_IMAGE_WRITE 205UL /* CPU Image Write Error */ +#define ADI_ADRV904X_ERRCODE_CPU_PROFILE_WRITE 206UL /* CPU Profile Write Error */ +#define ADI_ADRV904X_ERRCODE_CPU_MAILBOX_READ 207UL /* CPU Mailbox Read Error */ +#define ADI_ADRV904X_ERRCODE_CPU_RAM_ACCESS_START 208UL /* CPU RAM Access Start Error */ +#define ADI_ADRV904X_ERRCODE_CPU_RAM_LOCK 209UL /* RAM Lock/Unlock Error Code */ +#define ADI_ADRV904X_ERRCODE_CPU_RAM_ACCESS_STOP 210UL /* CPU RAM Access Stop Error */ +#define ADI_ADRV904X_ERRCODE_CPU_PING 211UL /* CPU Ping Error */ +#define ADI_ADRV904X_ERRCODE_CPU_BOOT_TIMEOUT 212UL /* CPU Boot Timeout */ + +/* Data Interface Error Codes */ + + /* TODO: Implement High Level Error Codes; Reserved: 300 */ +#define ADI_ADRV904X_ERRCODE_DATAINTERFACE_TEST 300UL /* Example */ + +/* GPIO Error Codes */ + + /* TODO: Implement High Level Error Codes; Reserved: 500 */ +#define ADI_ADRV904X_ERRCODE_GPIO_TEST 500UL /* Example */ + +/* Device HAL Error Codes */ + +#define ADI_ADRV904X_ERRCODE_HAL_SPI_WRITE 600UL /* SPI Write Error */ +#define ADI_ADRV904X_ERRCODE_HAL_SPI_READ 601UL /* SPI Read Error */ +#define ADI_ADRV904X_ERRCODE_HAL_INVALID_DEVICE_STATE 602UL /* Invalid device state */ + +/* JESD Error Codes */ + + /* TODO: Implement High Level Error Codes; Reserved: 700 */ +#define ADI_ADRV904X_ERRCODE_JESD_TEST 700UL /* Example */ + +/* Radio Control Error Codes */ + + /* TODO: Implement High Level Error Codes; Reserved: 800 */ +#define ADI_ADRV904X_ERRCODE_RADIOCTRL_LO_CFG 800UL /* Lo Frequency Configuration Error */ + +/* RX Error Codes */ + + /* TODO: Implement High Level Error Codes; Reserved: 900 */ +#define ADI_ADRV904X_ERRCODE_RX_TEST 900UL /* Example */ + +/* TX Error Codes */ + + /* TODO: Implement High Level Error Codes; Reserved: 1000 */ +#define ADI_ADRV904X_ERRCODE_TX_TEST 1000UL /* Example */ + + /* TODO: Implement High Level Error Codes; Reserved: 1300 */ +#define ADI_ADRV904X_ERRCODE_AGC_TEST 1300UL /* Example */ + +/* +* \brief Device Specific Macro to check for Null Device & Error Pointer +* +* \param devicePtr Device Pointer +*/ +#define ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(devicePtr) \ +if (devicePtr == NULL) \ +{ \ + return ADI_ADRV904X_ERR_ACT_CHECK_PARAM; \ +} + +/* +* \brief Device Specific Macro to check for Null Common Device & Error Pointer +* +* \param commonDev Common Device Pointer, which also contains the Error Pointer +*/ +#define ADI_ADRV904X_NULL_COMMON_PTR_RETURN(commonDev) \ +if ((commonDev == NULL) || \ + (commonDev->errPtr == NULL)) \ +{ \ + return ADI_ADRV904X_ERR_ACT_CHECK_PARAM; \ +} + +/* +* \brief Device Specific Macro to check for Null Pointer +* +* \param ptr Pointer to be checked +*/ +#define ADI_ADRV904X_NULL_PTR_RETURN(ptr) \ +if (ptr == NULL) \ +{ \ + return ADI_ADRV904X_ERR_ACT_CHECK_PARAM; \ +} + +/* +* \brief Macro to perform the following: +* 1) Null Pointer Check +* 2) Report Null Pointer to Error Memory +* 3) Return ADI_COMMON_ERR_ACT_CHECK_PARAM from API + +* \param commonDev Pointer to the common Device Structure (contains a pointer to Error Memory) +* \param ptr Pointer to be checked +* +*/ +#define ADI_ADRV904X_NULL_PTR_REPORT_RETURN(commonDev, ptr) \ +{ \ + if (ptr == NULL) \ + { \ + ADI_ERROR_REPORT( commonDev, \ + ADI_ADRV904X_ERRSRC_API, \ + ADI_COMMON_ERRCODE_NULL_PTR, \ + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, \ + ptr, \ + "Null Pointer"); \ + \ + return ADI_ADRV904X_ERR_ACT_CHECK_PARAM; \ + } \ +} + +/* +* \brief Macro to perform the following: +* 1) Null Pointer Check +* 2) Report Null Pointer to Error Memory +* 3) GOTO label specified + +* \param commonDev Pointer to the common Device Structure (contains a pointer to Error Memory) +* \param ptr Pointer to be checked +* \param label Label for GOTO +* +*/ +#define ADI_ADRV904X_NULL_PTR_REPORT_GOTO(commonDev, ptr, label) \ +{ \ + if (ptr == NULL) \ + { \ + ADI_ERROR_REPORT( commonDev, \ + ADI_ADRV904X_ERRSRC_API, \ + ADI_COMMON_ERRCODE_NULL_PTR, \ + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, \ + ptr, \ + "Null Pointer"); \ + \ + goto label; \ + } \ +} + +/* +* \brief Macro to perform the following: +* 1) Report Feature Not Implemented +* 2) Return Device Specific RecoveryAction (i.e. ADI_ADRV904X_ERR_ACT_CHECK_FEATURE) +*/ +#define ADI_ADRV904X_API_NOT_IMPLEMENTED_REPORT_RETURN( commonDev) \ + \ + ADI_ERROR_REPORT( commonDev, \ + ADI_ADRV904X_ERRSRC_API, \ + ADI_COMMON_ERRCODE_FEATURE_NOT_IMPLEMENTED, \ + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, \ + ADI_NO_VARIABLE, \ + "Feature not implemented"); \ + return ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; \ + +/* +* \brief Macro to perform the following: +* 1) Report Feature Not Implemented +* 2) GOTO label specified +*/ +#define ADI_ADRV904X_API_NOT_IMPLEMENTED_REPORT_GOTO( commonDev, label) \ + \ + ADI_ERROR_REPORT( commonDev, \ + ADI_ADRV904X_ERRSRC_API, \ + ADI_COMMON_ERRCODE_FEATURE_NOT_IMPLEMENTED, \ + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, \ + ADI_NO_VARIABLE, \ + "Feature not implemented"); \ + goto label; \ + +/* +* \brief ADRV904X Error Macro +* 1) Error Table Lookup (Report Lookup Error) +* 2) Report Error Information from Lookup +* 3) Update RecoveryAction +*/ +#define ADI_ADRV904X_ERROR_INFO_GET(errSrc, errCode, variable, recoveryAction, error) \ +{ \ + if (ADI_ADRV904X_ERR_ACT_NONE != adi_adrv904x_ErrInfoGet(errSrc, \ + errCode, \ + &error.errMsg, \ + &error.errCause, \ + &error.actionCode, \ + &error.actionMsg)) \ + { \ + /* Report failure of ADRV904X error lookup */ \ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; \ + ADI_ERROR_REPORT( &device->common, \ + errSrc, \ + errCode, \ + recoveryAction, \ + variable, \ + "Raw Error Data; Cannot Find More Detailed Information"); \ + } \ +} + +/* +* \brief ADRV904X Error Macro +* 1) Error Table Lookup (Report Lookup Error) +* 2) Report Error Information from Lookup +* 3) Update RecoveryAction +*/ +#define ADI_ADRV904X_ERROR_INFO_GET_REPORT(errSrc, errCode, variable, recoveryAction) \ +{ \ + adi_adrv904x_ErrorInfo_t error = { 0, NULL, NULL, ADI_ADRV904X_ERR_ACT_NONE, NULL }; \ + \ + if (ADI_ADRV904X_ERR_ACT_NONE != adi_adrv904x_ErrInfoGet(errSrc, \ + errCode, \ + &error.errMsg, \ + &error.errCause, \ + &error.actionCode, \ + &error.actionMsg)) \ + { \ + /* Report failure of ADRV904X error lookup */ \ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; \ + ADI_ERROR_REPORT( &device->common, \ + errSrc, \ + errCode, \ + recoveryAction, \ + variable, \ + "Raw Error Data; Cannot Find More Detailed Information"); \ + } \ + else \ + { \ + /* Update Stack Trace */ \ + ADI_ERROR_REPORT( &device->common, \ + errSrc, \ + errCode, \ + error.actionCode, \ + variable, \ + error.errMsg); \ + /* Update Additional Debug Information */ \ + ADI_EXT_ERROR_REPORT( &device->common, \ + error.errCause, \ + error.actionMsg); \ + recoveryAction = error.actionCode; \ + } \ +} + +/* +* \brief ADRV904X Error Goto Macro +* 1) Error Table Lookup (Report Lookup Error) +* 2) Report Error Information from Lookup +* 3) Update RecoveryAction +* 4) Goto label with Looked Up Action +*/ +#define ADI_ADRV904X_ERROR_INFO_GET_REPORT_GOTO(errSrc, errCode, variable, recoveryAction, label) \ +{ \ + adi_adrv904x_ErrorInfo_t error = { 0, NULL, NULL, ADI_ADRV904X_ERR_ACT_NONE, NULL }; \ + \ + if(ADI_ADRV904X_ERR_ACT_NONE != adi_adrv904x_ErrInfoGet(errSrc, \ + errCode, \ + &error.errMsg, \ + &error.errCause, \ + &error.actionCode, \ + &error.actionMsg)) \ + { \ + /* Report failure of ADRV904X error lookup */ \ + ADI_ERROR_REPORT( &device->common, \ + errSrc, \ + errCode, \ + ADI_ADRV904X_ERR_ACT_CHECK_FEATURE, \ + variable, \ + "Raw Error Data; Cannot Find More Detailed Information"); \ + goto label; \ + } \ + /* Update Stack Trace */ \ + ADI_ERROR_REPORT( &device->common, \ + errSrc, \ + errCode, \ + error.actionCode, \ + variable, \ + error.errMsg); \ + /* Update Additional Debug Information */ \ + ADI_EXT_ERROR_REPORT( &device->common, \ + error.errCause, \ + error.actionMsg) \ + recoveryAction = error.actionCode; \ + goto label; \ +} +/* DFE CPU Error Codes */ + + /* TODO: Implement High Level Error Codes; Reserved: 1400 */ +#define ADI_ADRV904X_ERRCODE_DFE_CPU_CMD_ID 1400UL /* DFE CPU Command ID Error */ +#define ADI_ADRV904X_ERRCODE_DFE_CPU_CMD_RESPONSE 1401UL /* DFE CPU Command Response Error */ +#define ADI_ADRV904X_ERRCODE_DFE_CPU_CMD_TIMEOUT 1403UL /* DFE CPU Command Timeout */ +#define ADI_ADRV904X_ERRCODE_DFE_CPU_IMAGE_NOT_LOADED 1404UL /* DFE CPU Image Not Loaded */ +#define ADI_ADRV904X_ERRCODE_DFE_CPU_IMAGE_WRITE 1405UL /* DFE CPU Image Write Error */ +#define ADI_ADRV904X_ERRCODE_DFE_CPU_PROFILE_WRITE 1406UL /* DFE CPU Profile Write Error */ +#define ADI_ADRV904X_ERRCODE_DFE_CPU_MAILBOX_READ 1407UL /* DFE CPU Mailbox Read Error */ +#define ADI_ADRV904X_ERRCODE_DFE_CPU_RAM_ACCESS_START 1408UL /* DFE CPU RAM Access Start Error */ +#define ADI_ADRV904X_ERRCODE_DFE_CPU_RAM_LOCK 1409UL /* DFE CPU Lock/Unlock Error Code */ +#define ADI_ADRV904X_ERRCODE_DFE_CPU_RAM_ACCESS_STOP 1410UL /* DFE CPU RAM Access Stop Error */ +#define ADI_ADRV904X_ERRCODE_DFE_CPU_PING 1411UL /* DFE CPU Ping Error */ +#define ADI_ADRV904X_ERRCODE_DFE_CPU_BOOT_TIMEOUT 1412UL /* DFE CPU Boot timeout */ +#define ADI_ADRV904X_ERRCODE_DFE_CPU_BOOT_ERROR 1413UL /* DFE CPU Boot Error */ + +/* +* \brief ADRV904X File Abstractions +*/ +typedef enum adi_adrv904x_File +{ + ADI_ADRV904X_FILE_PUBLIC_AGC = 0x0U, + ADI_ADRV904X_FILE_PRIVATE_AGC, + ADI_ADRV904X_FILE_PUBLIC_CORE, + ADI_ADRV904X_FILE_PUBLIC_CPU, + ADI_ADRV904X_FILE_PRIVATE_CPU, + ADI_ADRV904X_FILE_PUBLIC_CALS, + ADI_ADRV904X_FILE_PRIVATE_CALS, + ADI_ADRV904X_FILE_PUBLIC_DATAINTERFACE, + ADI_ADRV904X_FILE_PRIVATE_DATAINTERFACE, + ADI_ADRV904X_FILE_PUBLIC_DPD, + ADI_ADRV904X_FILE_PRIVATE_DPD, + ADI_ADRV904X_FILE_PUBLIC_ERROR, + ADI_ADRV904X_FILE_PUBLIC_GPIO, + ADI_ADRV904X_FILE_PRIVATE_GPIO, + ADI_ADRV904X_FILE_PUBLIC_HAL, + ADI_ADRV904X_FILE_PRIVATE_HAL, + ADI_ADRV904X_FILE_PUBLIC_RADIOCTRL, + ADI_ADRV904X_FILE_PRIVATE_RADIOCTRL, + ADI_ADRV904X_FILE_PUBLIC_RX, + ADI_ADRV904X_FILE_PRIVATE_RX, + ADI_ADRV904X_FILE_PUBLIC_TX, + ADI_ADRV904X_FILE_PRIVATE_TX, + ADI_ADRV904X_FILE_PUBLIC_UTILITIES, + ADI_ADRV904X_FILE_PUBLIC_DFE_UTILITIES, + ADI_ADRV904X_FILE_PUBLIC_DFE_CPU, + ADI_ADRV904X_FILE_PRIVATE_DFE_CPU, + ADI_ADRV904X_FILE_PUBLIC_DFE_CFR, + ADI_ADRV904X_FILE_PRIVATE_DFE_CFR, + ADI_ADRV904X_FILE_PUBLIC_DFE_SBET, + ADI_ADRV904X_FILE_PUBLIC_DFE_CLGC, + ADI_ADRV904X_FILE_PUBLIC_DFE_DPD, + ADI_ADRV904X_FILE_PUBLIC_DFE_EXT_DFE, + ADI_ADRV904X_FILE_PRIVATE_DFE_DPD, + ADI_ADRV904X_FILE_PRIVATE_DFE_EXT_DFE, + ADI_ADRV904X_FILE_PUBLIC_DFE_VSWR, + ADI_ADRV904X_FILE_PRIVATE_DFE_VSWR, + ADI_ADRV904X_FILE_PRIVATE_CARRIER_RECONFIGURE, + ADI_ADRV904X_FILE_PUBLIC_VERSION, + ADI_ADRV904X_FILE_PRIVATE_INIT, + ADI_ADRV904X_FILE_PRIVATE_SHARED_RESOURCE_MANAGER, + ADI_ADRV904X_FILE_PUBLIC_JESD, + ADI_ADRV904X_FILE_PRIVATE_JESD, + ADI_ADRV904X_FILE_PRIVATE_BINLOADER, +} adi_adrv904x_File_e; + +/** +* \brief ADRV904X Error Sources - Needs to Map onto Common Sources +*/ +typedef enum adi_adrv904x_ErrSource +{ + ADI_ADRV904X_ERRSRC_NONE = ADI_COMMON_ERRSRC_NONE_IDX, /*!< No Error/Source; Common Error Source Mapping */ + ADI_ADRV904X_ERRSRC_API = ADI_COMMON_ERRSRC_API_IDX, /*!< API; Common Error Source Mapping */ + ADI_ADRV904X_ERRSRC_HAL = ADI_COMMON_ERRSRC_HAL_IDX, /*!< HAL; Common Error Source Mapping */ + ADI_ADRV904X_ERRSRC_DEVICEBF = ADI_COMMON_ERRSRC_DEVICEBF_IDX, /*!< Device BF; Common Error Source Mapping */ + ADI_ADRV904X_ERRSRC_AGC, /*!< AGC Error */ + ADI_ADRV904X_ERRSRC_CALS, /*!< Calibration Error */ + ADI_ADRV904X_ERRSRC_CPU_BOOT, /*!< CPU Boot Error */ + ADI_ADRV904X_ERRSRC_CPU_RUNTIME, /*!< CPU Runtime Error */ + ADI_ADRV904X_ERRSRC_CPU, /*!< CPU Error */ + ADI_ADRV904X_ERRSRC_DATAINTERFACE, /*!< Data Interface Error */ + ADI_ADRV904X_ERRSRC_GPIO, /*!< GPIO Error */ + ADI_ADRV904X_ERRSRC_DEVICEHAL, /*!< Device HAL Error */ + ADI_ADRV904X_ERRSRC_JESD, /*!< JESD Error */ + ADI_ADRV904X_ERRSRC_RADIOCTRL, /*!< Radio Control Error */ + ADI_ADRV904X_ERRSRC_RX, /*!< RX Error */ + ADI_ADRV904X_ERRSRC_TX, /*!< TX Error */ + ADI_ADRV904X_ERRSRC_DFE_CPU_BOOT, /*!< DFE CPU Boot Error */ + ADI_ADRV904X_ERRSRC_DFE_CPU_RUNTIME, /*!< DFE CPU Runtime Error */ + ADI_ADRV904X_ERRSRC_DFE_CPU, /*!< DFE CPU Error */ + ADI_ADRV904X_ERRSRC_DFE_APP_RUNTIME, /*!< DFE APP Runtime Error */ + ADI_ADRV904X_ERRSRC_DFE_SVC_RUNTIME, /*!< DFE Svc Runtime Error */ + ADI_ADRV904X_ERRSRC_UNKNOWN /*!< Unknown */ +} adi_adrv904x_ErrSource_e; + +/** +* \brief ADI ADRV904X Error Table Row +*/ +typedef struct adi_adrv904x_ErrTableRow +{ + const int64_t errCode; /*!< Error code */ + const char* const errMsg; /*!< Error message */ + const adi_adrv904x_ErrAction_e action; /*!< Error action */ +} adi_adrv904x_ErrTableRow_t; + +/** +* \brief ADI ADRV904X Device Error Table Row +*/ +typedef struct adi_adrv904x_DeviceErrTableRow +{ + const int64_t errCode; /*!< Error code */ + const char* const errMsg; /*!< Error message */ + const char* const errCause; /*!< Error cause */ + const adi_adrv904x_ErrAction_e actionCode; /*!< Error action */ + const char* const actionMsg; /*!< Error msg */ +} adi_adrv904x_DeviceErrTableRow_t; + +/** +* \brief ADI Common Error Information +*/ +typedef struct adi_adrv904x_ErrorInfo +{ + int64_t errCode; /*!< Error code */ + const char* errMsg; /*!< Error msg */ + const char* errCause; /*!< Error cause */ + adi_adrv904x_ErrAction_e actionCode; /*!< Error action */ + const char* actionMsg; /*!< Error msg */ +} adi_adrv904x_ErrorInfo_t; + +/** +* \brief ADI ADRV904X Error Action Union +*/ +typedef union adi_adrv904x_ErrActionUnion +{ + adi_adrv904x_ErrAction_e deviceAction; /*!< ADRV904X Error Action Type */ + adi_common_ErrAction_t common; /*!< Common Error Action Union */ +} adi_adrv904x_ErrActionUnion_t; + +/* Type Definitions for Device Error Tables */ +typedef adi_adrv904x_ErrTableRow_t adrv904x_CalsErrCodes_t; + +typedef adi_adrv904x_ErrTableRow_t adrv904x_CpuErrCodes_t; + +typedef adi_adrv904x_DeviceErrTableRow_t adrv904x_CpuBootErrCodes_t; + +typedef adi_adrv904x_DeviceErrTableRow_t adrv904x_CpuRuntimeErrCodes_t; + +typedef adi_adrv904x_ErrTableRow_t adrv904x_DataInterfaceErrCodes_t; + +typedef adi_adrv904x_ErrTableRow_t adrv904x_AgcErrCodes_t; + +typedef adi_adrv904x_ErrTableRow_t adrv904x_GpioErrCodes_t; + +typedef adi_adrv904x_ErrTableRow_t adrv904x_HalErrCodes_t; + +typedef adi_adrv904x_ErrTableRow_t adrv904x_JesdErrCodes_t; + +typedef adi_adrv904x_ErrTableRow_t adrv904x_RadioCtrlErrCodes_t; + +typedef adi_adrv904x_ErrTableRow_t adrv904x_RxErrCodes_t; + +typedef adi_adrv904x_ErrTableRow_t adrv904x_TxErrCodes_t; +typedef adi_adrv904x_ErrTableRow_t adrv904x_DfeCpuErrCodes_t; + +typedef adi_adrv904x_DeviceErrTableRow_t adrv904x_DfeCpuBootErrCodes_t; + +typedef adi_adrv904x_DeviceErrTableRow_t adrv904x_DfeCpuRuntimeErrCodes_t; + +typedef adi_adrv904x_DeviceErrTableRow_t adrv904x_DfeAppRuntimeErrCodes_t; + +typedef adi_adrv904x_DeviceErrTableRow_t adrv904x_DfeSvcRuntimeErrCodes_t; + +#endif /* _ADI_ADRV904X_ERROR_TYPES_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_gpio.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_gpio.h new file mode 100644 index 00000000000..6f1df6a1cb8 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_gpio.h @@ -0,0 +1,638 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adi_adrv904x_gpio.h + * \brief Contains ADRV904X GPIO related function prototypes for + * adi_adrv904x_gpio.c + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADI_ADRV904X_GPIO_H_ +#define _ADI_ADRV904X_GPIO_H_ + +#include "adi_adrv904x_gpio_types.h" +#include "adi_adrv904x_error.h" + +/**************************************************************************** + * GPIO related functions + **************************************************************************** + */ +/** +* \brief This API function set all digital GPIO to function as input pins. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioForceHiZAllPins(adi_adrv904x_Device_t* const device); + +/** +* \brief This API function set a given digital GPIO to be an input or output. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] gpio Selected digital GPIO pin +* \param[in] oRide IF override = 0, gpio direction is set by the current OE/IE of the signal on Stg3 of pinmux. +* IF override = 1, gpio direction is forced to IE = 1. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioForceHiZ(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const uint8_t oRide); + +/** + * \brief This API function returns the full status of all device GPIOs + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[out] status Full status readback for all Digital and Analog GPIO pins of the device + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioStatusRead( adi_adrv904x_Device_t* const device, + adi_adrv904x_GpioStatus_t* const status); + + +/** + * \brief This API function returns the currently routed signal/channelMask + * for a selected digital GPIO pin. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] gpio The digital GPIO pin for which to readback the current configuration + * \param[out] signal Signal currently configured for selected digital gpio + * \param[out] channelMask Channel mask currently configured for selected digital gpio + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioConfigGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + adi_adrv904x_GpioSignal_e* const signal, + uint32_t* const channelMask); + +/** + * \brief This API function returns the currently routed signal/channelMask + * for all 24 digital GPIO pins. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[out] signalArray Array of signals currently configured for each digital GPIO + * \param[out] channelMaskArray Array of channelMasks currently configured for each digital GPIO + * \param[in] arraySize Size of user allocated arrays to hold returned signals and channel masks. + Must be at least 24. If more than 24, the remaining elements will be untouched. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioConfigAllGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_GpioSignal_e signalArray[], + uint32_t channelMaskArray[], + const uint32_t arraySize); + +/** + * \brief This API function returns the currently routed signal/channelMask + * for a selected Analog GPIO pin. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] gpio The analog GPIO pin for which to readback the current configuration + * \param[out] signal Signal currently configured for selected analog gpio + * \param[out] channelMask Channel mask currently configured for selected analog gpio + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioAnalogConfigGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioAnaPinSel_e gpio, + adi_adrv904x_GpioSignal_e* const signal, + uint32_t* const channelMask); + +/** + * \brief This API function returns the currently routed signal/channelMask + * for all 16 Analog GPIO pins. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[out] signalArray Array of signals currently configured for each analog GPIO + * \param[out] channelMaskArray Array of channelMasks currently configured for each analog GPIO + * \param[in] arraySize Size of user allocated arrays to hold returned signals and channel masks. + Must be at least 16. If more than 16, the remaining elements will be untouched. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioAnalogConfigAllGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_GpioSignal_e signalArray[], + uint32_t channelMaskArray[], + const uint32_t arraySize); + +/** + * \brief This API function configures a monitor output function for a GPIO. + * + * The monitor outputs allow visibility to some internal ADRV904X signals. Any + * monitor output signal is available on any of the low voltage GPIO[23:0] pins. + * + * If selected signal is ADI_ADRV904X_GPIO_SIGNAL_UNUSED, this function will automatically + * try to release the GPIO pin from a currently routed Monitor Output Signal. This is + * equivalent to calling adi_adrv904x_GpioMonitorOutRelease. + * Else If selected signal is not a monitor output signal, an error will be returned. + * + * If selected signal is not from a Rx/Tx/ORx channel, channel selection will be + * ignored and not range checked. + * If selected signal is from a Rx/Tx channel, channel selection must be in + * in the range 0 to 7. Otherwise an error will be returned. + * If selected signal is from a ORx channel, channel selection must be in + * in the range 0 to 1. Otherwise an error will be returned. + * + * \pre This function may be called any time after device initialization + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] gpio GPIO pin to configure as a Monitor Output + * \param[in] signal Monitor Output signal to observe at selected GPIO + * \param[in] channel Selection of Rx/Tx/ORx channel instance of monitor output signal to observe, if applicable + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioMonitorOutSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const adi_adrv904x_GpioSignal_e signal, + const uint8_t channel); + +/** + * \brief This API function releases a GPIO if it is currently routing a monitor output function. + * + * The monitor outputs allow visibility to some internal ADRV904X signals. Any + * monitor output signal is available on any of the low voltage GPIO[23:0] pins. + * + * If GPIO pin is not routing any signal (signal == ADI_ADRV904X_GPIO_SIGNAL_UNUSED), + * then nothing will change and the function will return successfully. + * If GPIO pin is currently routing a GPIO Monitor Output signal, it will be released, + * the signal will be returned to ADI_ADRV904X_GPIO_SIGNAL_UNUSED, and the function will + * return successfully. + * If GPIO pin is currently routing another type of GPIO signal, then the GPIO will not be + * released and the function will return an error. + * + * \pre This function may be called any time after device initialization + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] gpio GPIO pin to release and disconnect from a Monitor Output function. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioMonitorOutRelease(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio); + +/** + * \brief Allocates and configures selected digital GPIO pins for Manual Input Mode. + * + * A bitmask is used to enable/disable selected GPIO pins. Note that selected pins (pins included in the bitmask) + * must be unallocated before enabling with this function. Otherwise an error is returned. Also note that de-selected pins + * (pins not included in the bitmask) will be checked for current allocation. Those pins that are currently allocated as + * Manual Inputs will be de-allocated. Pins allocated for other features will not be modified. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] gpioInputMask Bitmask to enable Manual Input mode for Digital GPIO pins. + * Mask bit0 represents GPIO[0], bit23 represents GPIO[23]. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioManualInputDirSet( adi_adrv904x_Device_t* const device, + const uint32_t gpioInputMask); + +/** + * \brief Allocates and configures selected digital GPIO pins for Manual Output Mode. + * + * A bitmask is used to enable/disable selected GPIO pins. Note that selected pins (pins included in the bitmask) + * must be unallocated before enabling with this function. Otherwise an error is returned. Also note that de-selected pins + * (pins not included in the bitmask) will be checked for current allocation. Those pins that are currently allocated as + * Manual Outputs will be de-allocated. Pins allocated for other features will not be modified. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] gpioOutputMask Bitmask to enable Manual Output mode for Digital GPIO pins. + * Mask bit0 represents GPIO[0], bit23 represents GPIO[23]. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioManualOutputDirSet( adi_adrv904x_Device_t* const device, + const uint32_t gpioOutputMask); + +/** + * \brief Retrieves input read levels for all digital GPIO pins configured as Manual Inputs. + * + * Bits in gpioInPinLevel are only valid for Digital GPIO pins configured as Manual Input. Ignore bits for all other GPIOs. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[out] gpioInPinLevel Pin levels retrieved for Digital GPIO pins configured as Manual Inputs + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioManualInputPinLevelGet( adi_adrv904x_Device_t* const device, + uint32_t * const gpioInPinLevel); +/** + * \brief Retrieves output drive levels for all digital GPIO pins configured as Manual Outputs. + * + * Bits in gpioOutPinLevel are only valid for Digital GPIO pins configured as Manual Outputs. Ignore bits for all other GPIOs. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[out] gpioOutPinLevel Pin levels retrieved for Digital GPIO pins configured as Manual Outputs + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioManualOutputPinLevelGet( adi_adrv904x_Device_t* const device, + uint32_t * const gpioOutPinLevel); + +/** + * \brief Sets output drive levels for all digital GPIO pins configured as Manual Outputs. + * + * Bits in gpioOutPinLevel are only valid for Digital GPIO pins configured as Manual Outputs. + * Bits for all other GPIOs are ignored by this function. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] gpioPinMask Pinmask to select which Digital GPIO pins will have levels set by gpioOutPinLevel + * \param[in] gpioOutPinLevel Pin levels to be set for Digital GPIO pins configured as Manual Outputs + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioManualOutputPinLevelSet( adi_adrv904x_Device_t* const device, + const uint32_t gpioPinMask, + const uint32_t gpioOutPinLevel); + +/** +* \brief This API function set all analog GPIO to be input pins. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioAnalogForceHiZAllPins(adi_adrv904x_Device_t* const device); + +/** +* \brief This API function set a given analog GPIO to be an input or output. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure +* \param[in] gpio Selected analog GPIO pin +* \param[in] oRide IF override = 0, gpio direction is set by the current OE/IE of the signal on Stg1 of pinmux. +* IF override = 1, gpio direction is forced to IE = 1. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioAnalogForceHiZ( adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioAnaPinSel_e gpio, + const uint8_t oRide); + +/** + * \brief Allocates and configures selected analog GPIO pins for Manual Input Mode. + * + * A bitmask is used to enable/disable selected GPIO pins. Note that selected pins (pins included in the bitmask) + * must be unallocated before enabling with this function. Otherwise an error is returned. Also note that de-selected pins + * (pins not included in the bitmask) will be checked for current allocation. Those pins that are currently allocated as + * Manual Inputs will be de-allocated. Pins allocated for other features will not be modified. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] gpioAnalogInputMask Bitmask to enable Manual Input mode for Analog GPIO pins. + * Mask bit0 represents GPIO[0], bit15 represents GPIO[15]. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioAnalogManualInputDirSet( adi_adrv904x_Device_t* const device, + const uint16_t gpioAnalogInputMask); + +/** + * \brief Allocates and configures selected analog GPIO pins for Manual Output Mode. + * + * A bitmask is used to enable/disable selected GPIO pins. Note that selected pins (pins included in the bitmask) + * must be unallocated before enabling with this function. Otherwise an error is returned. Also note that de-selected pins + * (pins not included in the bitmask) will be checked for current allocation. Those pins that are currently allocated as + * Manual Outputs will be de-allocated. Pins allocated for other features will not be modified. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] gpioAnalogOutputMask Bitmask to enable Manual Output mode for Analog GPIO pins. + * Mask bit0 represents GPIO[0], bit15 represents GPIO[15]. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioAnalogManualOutputDirSet( adi_adrv904x_Device_t* const device, + const uint16_t gpioAnalogOutputMask); + +/** + * \brief Retrieves input read levels for all analog GPIO pins configured as Manual Inputs. + * + * Bits in gpioInPinLevel are only valid for Analog GPIO pins configured as Manual Input. Ignore bits for all other GPIOs. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[out] gpioAnalogInPinLevel Pin levels retrieved for Analog GPIO pins configured as Manual Inputs + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioAnalogManualInputPinLevelGet( adi_adrv904x_Device_t* const device, + uint16_t * const gpioAnalogInPinLevel); + +/** + * \brief Retrieves output drive levels for all analog GPIO pins configured as Manual Outputs. + * + * Bits in gpioOutPinLevel are only valid for Analog GPIO pins configured as Manual Outputs. Ignore bits for all other GPIOs. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[out] gpioAnalogOutPinLevel Pin levels retrieved for Analog GPIO pins configured as Manual Outputs + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioAnalogManualOutputPinLevelGet( adi_adrv904x_Device_t* const device, + uint16_t * const gpioAnalogOutPinLevel); + +/** + * \brief Sets output drive levels for all analog GPIO pins configured as Manual Outputs. + * + * Bits in gpioOutPinLevel are only valid for Analog GPIO pins configured as Manual Outputs. + * Bits for all other GPIOs are ignored by this function. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] gpioAnalogPinMask Pinmask to select which Analog GPIO pins will have levels set by gpioAnalogOutPinLevel + * \param[in] gpioAnalogOutPinLevel Pin levels to be set for Analog GPIO pins configured as Manual Outputs + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioAnalogManualOutputPinLevelSet( adi_adrv904x_Device_t* const device, + const uint16_t gpioAnalogPinMask, + const uint16_t gpioAnalogOutPinLevel); + + +/**************************************************************************** + * GP Int (General Purpose Interrupt) related functions + *************************************************************************** + */ + +/** + * \brief Sets the General Purpose (GP) Interrupt Pin Mask Config for GP Int pins: GP_INT0, GP_INT1, or both. + * Note: It is the GP interrupts corresponding to the CLEARED bit positions in pinMaskCfg.gpIntXMask that + * will cause the external GP_INTx signals to be asserted. E.g. setting all valid bits in that field to 1's + * ensures the corresponding GP_INT signal can never be asserted. + * + * GP Interrupt Bit + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] pinSelect Enum indicating the which GP Interrupt pin masks to set + * \param[in] pinMaskCfg Pointer to data structure holding the GP Interrupt Pin Mask Config to write + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpIntPinMaskCfgSet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpIntPinSelect_e pinSelect, + const adi_adrv904x_GpIntPinMaskCfg_t* const pinMaskCfg); + +/** + * \brief Retrieves the General Purpose (GP) Interrupt Pin Mask Config for GP Int pins: GP_INT0, GP_INT1, or both. + * Note: It is the GP interrupts corresponding to the CLEARED bit positions in returned pinMaskCfg.gpIntXMask that + * will cause the external GP_INTx signals to be asserted. If all valid bits in that field are returned as 1's + * the corresponding GP_INT signal could never be asserted. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] pinSelect Enum indicating the which GP Interrupt pin masks to retrieve + * \param[out] pinMaskCfg Pointer to data structure to contain the GP Interrupt Pin Mask Config retrieved + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpIntPinMaskCfgGet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpIntPinSelect_e pinSelect, + adi_adrv904x_GpIntPinMaskCfg_t* const pinMaskCfg); + +/** + * \brief Reads the General Purpose (GP) Interrupt status bits and can be used to determine what caused a GP Interrupt pin to be asserted. + * + * The status word read-back will show the current value for all interrupt sources, even if they + * are disabled by the mask. However, the GP Interrupt pin will only assert for the enabled sources. + * + * NOTE: This function DOES NOT clear any interrupt status bits. + * + * If a BBIC detects a rising edge on either General Purpose Interrupt pins GP_INT0 or GP_INT1, this function + * allows the BBIC to determine the source of the interrupt. The value returned in the status parameter will show + * one or more sources for the interrupt based on the bit positioning table found in documentation for adi_adrv904x_GpIntWord_t. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[out] gpIntStatus Pointer to data structure to contain the GP Interrupt Status word retrieved + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpIntStatusGet( adi_adrv904x_Device_t* const device, + adi_adrv904x_GpIntMask_t* const gpIntStatus); + +/** + * \brief Clears the General Purpose (GP) Interrupt status bits selected in the gpIntClear word. + * + * Note: The only status bits that can be cleared with this function are those from interrupt + * sources that are Pulse triggered. Those status bits that are Level triggered must be cleared + * in the sub-system in which the interrupt originated. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] gpIntClear Pointer to data structure containing GP Interrupt Clear word selecting the + * status bits to clear. User can pass NULL if they want to clear all status bits. + * Otherwise, a structure can be passed here that manually selects which status bits + * to clear while leaving the others untouched. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpIntStatusClear( adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpIntMask_t* const gpIntClear); + +/** + * \brief Sets the General Purpose (GP) Int Type(Category) for all interrupt sources. + * This function uses a bitmask word to select the Type: Pulse/Edge triggered (default) vs. Level Triggered. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] gpIntStickyBitMask Pointer to data structure containing GP Interrupt word to set interrupt + * source types. Each bit in the word selects the type for the associated interrupt source: + * 0 = Pulse/Edge triggered (default), 1 = Level Triggered + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpIntStickyBitMaskSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpIntMask_t* const gpIntStickyBitMask); +/** + * \brief Retrieves the General Purpose (GP) Int Type(Category) for all interrupt sources. + * This function uses a bitmask word to select the Type: Pulse/Edge triggered (default) vs. Level Triggered. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[out] gpIntStickyBitMask Pointer to data structure to contain retrieved GP Interrupt Type word. + * Each bit in the word selects the type for the associated interrupt source: + * 0 = Pulse/Edge triggered (default), 1 = Level Triggered + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpIntStickyBitMaskGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_GpIntMask_t* const gpIntStickyBitMask); + +/** + * \brief Configures Hysteresis for a given Pin + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] pinName Pin to Configure + * \param[in] enable Enable Flag + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioHysteresisSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioDigitalPin_e pinName, + const uint32_t enable); + +/** + * \brief Gets Hysteresis Status for a given Pin + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] pinName Pin to Configure + * \param[out] enable Enable Flag + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioHysteresisGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioDigitalPin_e pinName, + uint32_t* const enable); + +/** + * \brief Sets Drive Strength Status for a given Pin + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] pinName Pin to Configure + * \param[in] driveStrength Drive Strength State + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioDriveStrengthSet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioDigitalPin_e pinName, + const adi_adrv904x_CmosPadDrvStr_e driveStrength); + + +/** + * \brief Gets Drive Strength Status for a given Pin + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] pinName Pin to Configure + * \param[out] driveStrength Drive Strength State + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioDriveStrengthGet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioDigitalPin_e pinName, + adi_adrv904x_CmosPadDrvStr_e* const driveStrength); + +#endif /* _ADI_ADRV904X_GPIO_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_gpio_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_gpio_types.h new file mode 100644 index 00000000000..b1832d9eea7 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_gpio_types.h @@ -0,0 +1,1241 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adi_adrv904x_gpio_types.h + * \brief Contains functions to allow control of the General Purpose IO functions on the ADRV904X device + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADI_ADRV904X_GPIO_TYPES_H_ +#define _ADI_ADRV904X_GPIO_TYPES_H_ + +#include + +#define ADI_ADRV904X_GPIO_COUNT 24U +#define ADI_ADRV904X_GPIO_ANALOG_COUNT 16U + + +#define ADI_ADRV904X_GPINT_MASK_LOWER_FRAMER_IRQ_0 (uint64_t)(0x0000000000000001ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_FRAMER_IRQ_1 (uint64_t)(0x0000000000000002ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_FRAMER_IRQ_2 (uint64_t)(0x0000000000000004ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_FRAMER_IRQ_3 (uint64_t)(0x0000000000000008ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_FRAMER_IRQ_4 (uint64_t)(0x0000000000000010ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_FRAMER_IRQ_5 (uint64_t)(0x0000000000000020ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_FRAMER_IRQ_6 (uint64_t)(0x0000000000000040ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_FRAMER_IRQ_7 (uint64_t)(0x0000000000000080ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_FRAMER_IRQ_8 (uint64_t)(0x0000000000000100ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_DEFRAMER_IRQ_0 (uint64_t)(0x0000000000000200ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_DEFRAMER_IRQ_1 (uint64_t)(0x0000000000000400ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_DEFRAMER_IRQ_2 (uint64_t)(0x0000000000000800ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_DEFRAMER_IRQ_3 (uint64_t)(0x0000000000001000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_DEFRAMER_IRQ_4 (uint64_t)(0x0000000000002000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_DEFRAMER_IRQ_5 (uint64_t)(0x0000000000004000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_DEFRAMER_IRQ_6 (uint64_t)(0x0000000000008000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_DEFRAMER_IRQ_7 (uint64_t)(0x0000000000010000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_DEFRAMER_IRQ_8 (uint64_t)(0x0000000000020000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_DEFRAMER_IRQ_9 (uint64_t)(0x0000000000040000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_DEFRAMER_IRQ_10 (uint64_t)(0x0000000000080000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_DEFRAMER_IRQ_11 (uint64_t)(0x0000000000100000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_DEFRAMER_IRQ_12 (uint64_t)(0x0000000000200000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_DEFRAMER_IRQ_13 (uint64_t)(0x0000000000400000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_RX0_STREAM_ERROR (uint64_t)(0x0000000000800000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_RX1_STREAM_ERROR (uint64_t)(0x0000000001000000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_RX2_STREAM_ERROR (uint64_t)(0x0000000002000000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_RX3_STREAM_ERROR (uint64_t)(0x0000000004000000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_RX4_STREAM_ERROR (uint64_t)(0x0000000008000000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_RX5_STREAM_ERROR (uint64_t)(0x0000000010000000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_RX6_STREAM_ERROR (uint64_t)(0x0000000020000000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_RX7_STREAM_ERROR (uint64_t)(0x0000000040000000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_TX0_STREAM_ERROR (uint64_t)(0x0000000080000000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_TX1_STREAM_ERROR (uint64_t)(0x0000000100000000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_TX2_STREAM_ERROR (uint64_t)(0x0000000200000000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_TX3_STREAM_ERROR (uint64_t)(0x0000000400000000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_TX4_STREAM_ERROR (uint64_t)(0x0000000800000000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_TX5_STREAM_ERROR (uint64_t)(0x0000001000000000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_TX6_STREAM_ERROR (uint64_t)(0x0000002000000000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_TX7_STREAM_ERROR (uint64_t)(0x0000004000000000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_ORX0_STREAM_ERROR (uint64_t)(0x0000008000000000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_ORX1_STREAM_ERROR (uint64_t)(0x0000010000000000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_CORE_STREAM_ERROR (uint64_t)(0x0000020000000000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_AUX_SPI_CORE_ERROR (uint64_t)(0x0000040000000000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_ERROR_SPI_PAGING (uint64_t)(0x0000080000000000ULL) +#define ADI_ADRV904X_GPINT_MASK_LOWER_ERROR_AUX_SPI_PAGING (uint64_t)(0x0000100000000000ULL) + +#define ADI_ADRV904X_GPINT_MASK_UPPER_ARM1_MEMORY_ECC_ERROR (uint64_t)(0x0000000000000001ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_ARM1_SYSTEM_ERROR (uint64_t)(0x0000000000000002ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_ARM1_CALIBRATION_ERROR (uint64_t)(0x0000000000000004ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_ARM1_WATCHDOG_TIMEOUT (uint64_t)(0x0000000000000008ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_ARM1_FORCE_GP_INTERRUPT (uint64_t)(0x0000000000000010ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_ARM0_MEMORY_ECC_ERROR (uint64_t)(0x0000000000000020ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_ARM0_SYSTEM_ERROR (uint64_t)(0x0000000000000040ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_ARM0_CALIBRATION_ERROR (uint64_t)(0x0000000000000080ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_ARM0_WATCHDOG_TIMEOUT (uint64_t)(0x0000000000000100ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_ARM0_FORCE_GP_INTERRUPT (uint64_t)(0x0000000000000200ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_PA_PROTECTION_TX0_POWER_ERROR (uint64_t)(0x0000000000000400ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_PA_PROTECTION_TX0_SRD_ERROR (uint64_t)(0x0000000000000800ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_PA_PROTECTION_TX1_POWER_ERROR (uint64_t)(0x0000000000001000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_PA_PROTECTION_TX1_SRD_ERROR (uint64_t)(0x0000000000002000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_PA_PROTECTION_TX2_POWER_ERROR (uint64_t)(0x0000000000004000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_PA_PROTECTION_TX2_SRD_ERROR (uint64_t)(0x0000000000008000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_PA_PROTECTION_TX3_POWER_ERROR (uint64_t)(0x0000000000010000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_PA_PROTECTION_TX3_SRD_ERROR (uint64_t)(0x0000000000020000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_PA_PROTECTION_TX4_POWER_ERROR (uint64_t)(0x0000000000040000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_PA_PROTECTION_TX4_SRD_ERROR (uint64_t)(0x0000000000080000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_PA_PROTECTION_TX5_POWER_ERROR (uint64_t)(0x0000000000100000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_PA_PROTECTION_TX5_SRD_ERROR (uint64_t)(0x0000000000200000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_PA_PROTECTION_TX6_POWER_ERROR (uint64_t)(0x0000000000400000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_PA_PROTECTION_TX6_SRD_ERROR (uint64_t)(0x0000000000800000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_PA_PROTECTION_TX7_POWER_ERROR (uint64_t)(0x0000000001000000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_PA_PROTECTION_TX7_SRD_ERROR (uint64_t)(0x0000000002000000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_SERDES_PLL_UNLOCK (uint64_t)(0x0000000004000000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_CLKPLL_OVR_RANGE (uint64_t)(0x0000000008000000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_RFPLL1_CP_OVR_RANGE (uint64_t)(0x0000000010000000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_RFPLL0_CP_OVR_RANGE (uint64_t)(0x0000000020000000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_CLKPLL_UNLOCK (uint64_t)(0x0000000040000000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_RFPLL1_UNLOCK (uint64_t)(0x0000000080000000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_RFPLL0_UNLOCK (uint64_t)(0x0000000100000000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_SPI_AHB_ERROR (uint64_t)(0x0000000200000000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_AUX_SPI_AHB_ERROR (uint64_t)(0x0000000400000000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_SPI_CLK_EFUSE_READ_ABORT (uint64_t)(0x0000000800000000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_AUX_SPI_ABORT (uint64_t)(0x0000001000000000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_SPI_ABORT (uint64_t)(0x0000002000000000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_DFE_CPU_AND_MEM_INT_0 (uint64_t)(0x0000004000000000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_DFE_CPU_AND_MEM_INT_1 (uint64_t)(0x0000008000000000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_DFE_CPU_AND_MEM_INT_2 (uint64_t)(0x0000010000000000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_DFE_CPU_AND_MEM_INT_3 (uint64_t)(0x0000040000000000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_DFE_CPU_AND_MEM_INT_4 (uint64_t)(0x0000080000000000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_DFE_CPU_PINT_SW0 (uint64_t)(0x0000100000000000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_DFE_CPU_PINT_SW1 (uint64_t)(0x0000200000000000ULL) +#define ADI_ADRV904X_GPINT_MASK_UPPER_RADIO_SEQ_ERROR (uint64_t)(0x0000800000000000ULL) + + +/**************************************************************************** + * Digital and Analog GPIO related types + **************************************************************************** + */ + +/** + * \brief Enum to select desired GPIO pin used by the API + */ +typedef enum adi_adrv904x_GpioPinSel +{ + ADI_ADRV904X_GPIO_00 = 0U, /*!< Select GPIO_00*/ + ADI_ADRV904X_GPIO_01, /*!< Select GPIO_01*/ + ADI_ADRV904X_GPIO_02, /*!< Select GPIO_02*/ + ADI_ADRV904X_GPIO_03, /*!< Select GPIO_03*/ + ADI_ADRV904X_GPIO_04, /*!< Select GPIO_04*/ + ADI_ADRV904X_GPIO_05, /*!< Select GPIO_05*/ + ADI_ADRV904X_GPIO_06, /*!< Select GPIO_06*/ + ADI_ADRV904X_GPIO_07, /*!< Select GPIO_07*/ + ADI_ADRV904X_GPIO_08, /*!< Select GPIO_08*/ + ADI_ADRV904X_GPIO_09, /*!< Select GPIO_09*/ + ADI_ADRV904X_GPIO_10, /*!< Select GPIO_10*/ + ADI_ADRV904X_GPIO_11, /*!< Select GPIO_11*/ + ADI_ADRV904X_GPIO_12, /*!< Select GPIO_12*/ + ADI_ADRV904X_GPIO_13, /*!< Select GPIO_13*/ + ADI_ADRV904X_GPIO_14, /*!< Select GPIO_14*/ + ADI_ADRV904X_GPIO_15, /*!< Select GPIO_15*/ + ADI_ADRV904X_GPIO_16, /*!< Select GPIO_16*/ + ADI_ADRV904X_GPIO_17, /*!< Select GPIO_17*/ + ADI_ADRV904X_GPIO_18, /*!< Select GPIO_18*/ + ADI_ADRV904X_GPIO_19, /*!< Select GPIO_19*/ + ADI_ADRV904X_GPIO_20, /*!< Select GPIO_20*/ + ADI_ADRV904X_GPIO_21, /*!< Select GPIO_21*/ + ADI_ADRV904X_GPIO_22, /*!< Select GPIO_22*/ + ADI_ADRV904X_GPIO_23, /*!< Select GPIO_23*/ + ADI_ADRV904X_GPIO_INVALID /*!< Invalid GPIO*/ +} adi_adrv904x_GpioPinSel_e; + +/** +* \brief Enum to select desired Analog GPIO pins used by the API +*/ +typedef enum adi_adrv904x_GpioAnaPinSel +{ + ADI_ADRV904X_GPIO_ANA_00 = 0U, /*!< Select GPIO_ANA_00*/ + ADI_ADRV904X_GPIO_ANA_01, /*!< Select GPIO_ANA_01*/ + ADI_ADRV904X_GPIO_ANA_02, /*!< Select GPIO_ANA_02*/ + ADI_ADRV904X_GPIO_ANA_03, /*!< Select GPIO_ANA_03*/ + ADI_ADRV904X_GPIO_ANA_04, /*!< Select GPIO_ANA_04*/ + ADI_ADRV904X_GPIO_ANA_05, /*!< Select GPIO_ANA_05*/ + ADI_ADRV904X_GPIO_ANA_06, /*!< Select GPIO_ANA_06*/ + ADI_ADRV904X_GPIO_ANA_07, /*!< Select GPIO_ANA_07*/ + ADI_ADRV904X_GPIO_ANA_08, /*!< Select GPIO_ANA_08*/ + ADI_ADRV904X_GPIO_ANA_09, /*!< Select GPIO_ANA_09*/ + ADI_ADRV904X_GPIO_ANA_10, /*!< Select GPIO_ANA_10*/ + ADI_ADRV904X_GPIO_ANA_11, /*!< Select GPIO_ANA_11*/ + ADI_ADRV904X_GPIO_ANA_12, /*!< Select GPIO_ANA_12*/ + ADI_ADRV904X_GPIO_ANA_13, /*!< Select GPIO_ANA_13*/ + ADI_ADRV904X_GPIO_ANA_14, /*!< Select GPIO_ANA_14*/ + ADI_ADRV904X_GPIO_ANA_15, /*!< Select GPIO_ANA_15*/ + ADI_ADRV904X_GPIO_ANA_INVALID /*!< Invalid Analog Gpio*/ +} adi_adrv904x_GpioAnaPinSel_e; + +/** + * \brief Enum to select desired GPIO pin from any type (both Analog and Digital) + */ +typedef enum adi_adrv904x_GpioGenericPinSel +{ + ADI_ADRV904X_GPIO_GENERIC_DIG_00 = 0x1000U, /*!< Select Digital GPIO 00 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_01 = 0x1001U, /*!< Select Digital GPIO 01 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_02 = 0x1002U, /*!< Select Digital GPIO 02 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_03 = 0x1003U, /*!< Select Digital GPIO 03 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_04 = 0x1004U, /*!< Select Digital GPIO 04 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_05 = 0x1005U, /*!< Select Digital GPIO 05 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_06 = 0x1006U, /*!< Select Digital GPIO 06 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_07 = 0x1007U, /*!< Select Digital GPIO 07 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_08 = 0x1008U, /*!< Select Digital GPIO 08 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_09 = 0x1009U, /*!< Select Digital GPIO 09 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_10 = 0x100aU, /*!< Select Digital GPIO 10 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_11 = 0x100bU, /*!< Select Digital GPIO 11 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_12 = 0x100cU, /*!< Select Digital GPIO 12 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_13 = 0x100dU, /*!< Select Digital GPIO 13 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_14 = 0x100eU, /*!< Select Digital GPIO 14 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_15 = 0x100fU, /*!< Select Digital GPIO 15 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_16 = 0x1010U, /*!< Select Digital GPIO 16 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_17 = 0x1011U, /*!< Select Digital GPIO 17 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_18 = 0x1012U, /*!< Select Digital GPIO 18 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_19 = 0x1013U, /*!< Select Digital GPIO 19 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_20 = 0x1014U, /*!< Select Digital GPIO 20 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_21 = 0x1015U, /*!< Select Digital GPIO 21 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_22 = 0x1016U, /*!< Select Digital GPIO 22 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_23 = 0x1017U, /*!< Select Digital GPIO 23 */ + ADI_ADRV904X_GPIO_GENERIC_DIG_START = 0x1000U, + ADI_ADRV904X_GPIO_GENERIC_DIG_END = 0x1017U, + + ADI_ADRV904X_GPIO_GENERIC_ANA_00 = 0x2000U, /*!< Select Analog GPIO 00 */ + ADI_ADRV904X_GPIO_GENERIC_ANA_01 = 0x2001U, /*!< Select Analog GPIO 01 */ + ADI_ADRV904X_GPIO_GENERIC_ANA_02 = 0x2002U, /*!< Select Analog GPIO 02 */ + ADI_ADRV904X_GPIO_GENERIC_ANA_03 = 0x2003U, /*!< Select Analog GPIO 03 */ + ADI_ADRV904X_GPIO_GENERIC_ANA_04 = 0x2004U, /*!< Select Analog GPIO 04 */ + ADI_ADRV904X_GPIO_GENERIC_ANA_05 = 0x2005U, /*!< Select Analog GPIO 05 */ + ADI_ADRV904X_GPIO_GENERIC_ANA_06 = 0x2006U, /*!< Select Analog GPIO 06 */ + ADI_ADRV904X_GPIO_GENERIC_ANA_07 = 0x2007U, /*!< Select Analog GPIO 07 */ + ADI_ADRV904X_GPIO_GENERIC_ANA_08 = 0x2008U, /*!< Select Analog GPIO 08 */ + ADI_ADRV904X_GPIO_GENERIC_ANA_09 = 0x2009U, /*!< Select Analog GPIO 09 */ + ADI_ADRV904X_GPIO_GENERIC_ANA_10 = 0x200aU, /*!< Select Analog GPIO 10 */ + ADI_ADRV904X_GPIO_GENERIC_ANA_11 = 0x200bU, /*!< Select Analog GPIO 11 */ + ADI_ADRV904X_GPIO_GENERIC_ANA_12 = 0x200cU, /*!< Select Analog GPIO 12 */ + ADI_ADRV904X_GPIO_GENERIC_ANA_13 = 0x200dU, /*!< Select Analog GPIO 13 */ + ADI_ADRV904X_GPIO_GENERIC_ANA_14 = 0x200eU, /*!< Select Analog GPIO 14 */ + ADI_ADRV904X_GPIO_GENERIC_ANA_15 = 0x200fU, /*!< Select Analog GPIO 15 */ + ADI_ADRV904X_GPIO_GENERIC_ANA_START = 0x2000U, + ADI_ADRV904X_GPIO_GENERIC_ANA_END = 0x200fU, + + ADI_ADRV904X_GPIO_GENERIC_INVALID = 0xFFFFU /*!< Invalid GPIO */ +} adi_adrv904x_GpioGenericPinSel_e; + +/** + * \brief Enum for ADRV904X GPIO Signals. Must Map to Shared Resource Manager Feature + */ +typedef enum adi_adrv904x_GpioSignal +{ + ADI_ADRV904X_GPIO_SIGNAL_UNUSED = 0U, /*!< Select UNUSED signal */ + ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_SDIO, /*!< Aux SPI port signal: SDIO */ + ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_SDO, /*!< Aux SPI port signal: SDO */ + ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_CLK, /*!< Aux SPI port signal: CLK */ + ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_CSB, /*!< Aux SPI port signal: CSB */ + ADI_ADRV904X_GPIO_SIGNAL_UART_PADRXSIN, /*!< Select UART Receive Input signal */ + ADI_ADRV904X_GPIO_SIGNAL_UART_PADCTS, /*!< Select UART Clear to Send Flow control signal */ + ADI_ADRV904X_GPIO_SIGNAL_UART_PADRTSOUT, /*!< Select UART Request to Send Flow control signal */ + ADI_ADRV904X_GPIO_SIGNAL_UART_PADTXSOUT, /*!< Select UART Transmit Output signal */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_CLK_OUT, /*!< Trace Clk OUT for DFE FW Debug */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_0, /*!< Trace Data Out0 for DFE FW Debug */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_1, /*!< Trace Data Out1 for DFE FW Debug */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_2, /*!< Trace Data Out2 for DFE FW Debug */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_3, /*!< Trace Data Out3 for DFE FW Debug */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_4, /*!< Trace Data Out4 for DFE FW Debug */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_5, /*!< Trace Data Out5 for DFE FW Debug */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_6, /*!< Trace Data Out6 for DFE FW Debug */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_7, /*!< Trace Data Out7 for DFE FW Debug */ + + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_0, /*!< GPIO Manual Output (Drive) Mode: GPIO 00 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_1, /*!< GPIO Manual Output (Drive) Mode: GPIO 01 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_2, /*!< GPIO Manual Output (Drive) Mode: GPIO 02 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_3, /*!< GPIO Manual Output (Drive) Mode: GPIO 03 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_4, /*!< GPIO Manual Output (Drive) Mode: GPIO 04 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_5, /*!< GPIO Manual Output (Drive) Mode: GPIO 05 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_6, /*!< GPIO Manual Output (Drive) Mode: GPIO 06 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_7, /*!< GPIO Manual Output (Drive) Mode: GPIO 07 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_8, /*!< GPIO Manual Output (Drive) Mode: GPIO 08 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_9, /*!< GPIO Manual Output (Drive) Mode: GPIO 09 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_10, /*!< GPIO Manual Output (Drive) Mode: GPIO 10 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_11, /*!< GPIO Manual Output (Drive) Mode: GPIO 11 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_12, /*!< GPIO Manual Output (Drive) Mode: GPIO 12 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_13, /*!< GPIO Manual Output (Drive) Mode: GPIO 13 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_14, /*!< GPIO Manual Output (Drive) Mode: GPIO 14 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_15, /*!< GPIO Manual Output (Drive) Mode: GPIO 15 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_16, /*!< GPIO Manual Output (Drive) Mode: GPIO 16 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_17, /*!< GPIO Manual Output (Drive) Mode: GPIO 17 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_18, /*!< GPIO Manual Output (Drive) Mode: GPIO 18 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_19, /*!< GPIO Manual Output (Drive) Mode: GPIO 19 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_20, /*!< GPIO Manual Output (Drive) Mode: GPIO 20 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_21, /*!< GPIO Manual Output (Drive) Mode: GPIO 21 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_22, /*!< GPIO Manual Output (Drive) Mode: GPIO 22 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_23, /*!< GPIO Manual Output (Drive) Mode: GPIO 23 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_0, /*!< GPIO Manual Input (Receive) Mode: GPIO 00 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_1, /*!< GPIO Manual Input (Receive) Mode: GPIO 01 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_2, /*!< GPIO Manual Input (Receive) Mode: GPIO 02 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_3, /*!< GPIO Manual Input (Receive) Mode: GPIO 03 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_4, /*!< GPIO Manual Input (Receive) Mode: GPIO 04 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_5, /*!< GPIO Manual Input (Receive) Mode: GPIO 05 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_6, /*!< GPIO Manual Input (Receive) Mode: GPIO 06 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_7, /*!< GPIO Manual Input (Receive) Mode: GPIO 07 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_8, /*!< GPIO Manual Input (Receive) Mode: GPIO 08 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_9, /*!< GPIO Manual Input (Receive) Mode: GPIO 09 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_10, /*!< GPIO Manual Input (Receive) Mode: GPIO 10 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_11, /*!< GPIO Manual Input (Receive) Mode: GPIO 11 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_12, /*!< GPIO Manual Input (Receive) Mode: GPIO 12 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_13, /*!< GPIO Manual Input (Receive) Mode: GPIO 13 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_14, /*!< GPIO Manual Input (Receive) Mode: GPIO 14 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_15, /*!< GPIO Manual Input (Receive) Mode: GPIO 15 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_16, /*!< GPIO Manual Input (Receive) Mode: GPIO 16 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_17, /*!< GPIO Manual Input (Receive) Mode: GPIO 17 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_18, /*!< GPIO Manual Input (Receive) Mode: GPIO 18 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_19, /*!< GPIO Manual Input (Receive) Mode: GPIO 19 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_20, /*!< GPIO Manual Input (Receive) Mode: GPIO 20 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_21, /*!< GPIO Manual Input (Receive) Mode: GPIO 21 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_22, /*!< GPIO Manual Input (Receive) Mode: GPIO 22 */ + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_23, /*!< GPIO Manual Input (Receive) Mode: GPIO 23 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_0, /*!< GPIO ARM Output (Drive) Mode: GPIO 00 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_1, /*!< GPIO ARM Output (Drive) Mode: GPIO 01 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_2, /*!< GPIO ARM Output (Drive) Mode: GPIO 02 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_3, /*!< GPIO ARM Output (Drive) Mode: GPIO 03 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_4, /*!< GPIO ARM Output (Drive) Mode: GPIO 04 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_5, /*!< GPIO ARM Output (Drive) Mode: GPIO 05 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_6, /*!< GPIO ARM Output (Drive) Mode: GPIO 06 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_7, /*!< GPIO ARM Output (Drive) Mode: GPIO 07 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_8, /*!< GPIO ARM Output (Drive) Mode: GPIO 08 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_9, /*!< GPIO ARM Output (Drive) Mode: GPIO 09 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_10, /*!< GPIO ARM Output (Drive) Mode: GPIO 10 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_11, /*!< GPIO ARM Output (Drive) Mode: GPIO 11 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_12, /*!< GPIO ARM Output (Drive) Mode: GPIO 12 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_13, /*!< GPIO ARM Output (Drive) Mode: GPIO 13 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_14, /*!< GPIO ARM Output (Drive) Mode: GPIO 14 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_15, /*!< GPIO ARM Output (Drive) Mode: GPIO 15 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_16, /*!< GPIO ARM Output (Drive) Mode: GPIO 16 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_17, /*!< GPIO ARM Output (Drive) Mode: GPIO 17 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_18, /*!< GPIO ARM Output (Drive) Mode: GPIO 18 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_19, /*!< GPIO ARM Output (Drive) Mode: GPIO 19 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_20, /*!< GPIO ARM Output (Drive) Mode: GPIO 20 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_21, /*!< GPIO ARM Output (Drive) Mode: GPIO 21 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_22, /*!< GPIO ARM Output (Drive) Mode: GPIO 22 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_OUTPUT_23, /*!< GPIO ARM Output (Drive) Mode: GPIO 23 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_0, /*!< GPIO ARM Input (Receive) Mode: GPIO 00 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_1, /*!< GPIO ARM Input (Receive) Mode: GPIO 01 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_2, /*!< GPIO ARM Input (Receive) Mode: GPIO 02 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_3, /*!< GPIO ARM Input (Receive) Mode: GPIO 03 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_4, /*!< GPIO ARM Input (Receive) Mode: GPIO 04 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_5, /*!< GPIO ARM Input (Receive) Mode: GPIO 05 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_6, /*!< GPIO ARM Input (Receive) Mode: GPIO 06 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_7, /*!< GPIO ARM Input (Receive) Mode: GPIO 07 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_8, /*!< GPIO ARM Input (Receive) Mode: GPIO 08 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_9, /*!< GPIO ARM Input (Receive) Mode: GPIO 09 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_10, /*!< GPIO ARM Input (Receive) Mode: GPIO 10 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_11, /*!< GPIO ARM Input (Receive) Mode: GPIO 11 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_12, /*!< GPIO ARM Input (Receive) Mode: GPIO 12 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_13, /*!< GPIO ARM Input (Receive) Mode: GPIO 13 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_14, /*!< GPIO ARM Input (Receive) Mode: GPIO 14 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_15, /*!< GPIO ARM Input (Receive) Mode: GPIO 15 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_16, /*!< GPIO ARM Input (Receive) Mode: GPIO 16 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_17, /*!< GPIO ARM Input (Receive) Mode: GPIO 17 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_18, /*!< GPIO ARM Input (Receive) Mode: GPIO 18 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_19, /*!< GPIO ARM Input (Receive) Mode: GPIO 19 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_20, /*!< GPIO ARM Input (Receive) Mode: GPIO 20 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_21, /*!< GPIO ARM Input (Receive) Mode: GPIO 21 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_22, /*!< GPIO ARM Input (Receive) Mode: GPIO 22 */ + ADI_ADRV904X_GPIO_SIGNAL_ARM_INPUT_23, /*!< GPIO ARM Input (Receive) Mode: GPIO 23 */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_FINE_BAND_OUT_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_FINE_BAND_OUT_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_FINE_BAND_OUT_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_FINE_BAND_OUT_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_FINE_BAND_OUT_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_FINE_BAND_OUT_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_CALBITS_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_CALBITS_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_CALBITS_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_CALBITS_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_CALBITS_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_CALBITS_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_PLL_LOCKED, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_OVERRANGE_LOW_FLAG, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_CP_OVERRANGE_HIGH_FLAG, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_COMP_OUT, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_CAL_IN_PROGRESS, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_6, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_7, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_FREQ_COARSE_BAND_OUT_8, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_6, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_7, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_8, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_9, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_ALC_WORD_OUT_10, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_6, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_7, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_8, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_9, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_10, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_VCO_TCIDAC_11, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_6, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CLKPLL_SPARE_7, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_FINE_BAND_OUT_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_FINE_BAND_OUT_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_FINE_BAND_OUT_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_FINE_BAND_OUT_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_FINE_BAND_OUT_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_FINE_BAND_OUT_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_CALBITS_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_CALBITS_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_CALBITS_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_CALBITS_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_CALBITS_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_CALBITS_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_PLL_LOCKED, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_OVERRANGE_LOW_FLAG, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_CP_OVERRANGE_HIGH_FLAG, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_COMP_OUT, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_CAL_IN_PROGRESS, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_6, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_7, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_FREQ_COARSE_BAND_OUT_8, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_6, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_7, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_8, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_9, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_ALC_WORD_OUT_10, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_6, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_7, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_8, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_9, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_10, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_VCO_TCIDAC_11, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_6, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL0_SPARE_7, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_FINE_BAND_OUT_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_FINE_BAND_OUT_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_FINE_BAND_OUT_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_FINE_BAND_OUT_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_FINE_BAND_OUT_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_FINE_BAND_OUT_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_CALBITS_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_CALBITS_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_CALBITS_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_CALBITS_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_CALBITS_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_CALBITS_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_PLL_LOCKED, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_OVERRANGE_LOW_FLAG, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_CP_OVERRANGE_HIGH_FLAG, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_COMP_OUT, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_CAL_IN_PROGRESS, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_6, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_7, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_FREQ_COARSE_BAND_OUT_8, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_6, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_7, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_8, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_9, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_ALC_WORD_OUT_10, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_6, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_7, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_8, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_9, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_10, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_VCO_TCIDAC_11, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_6, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFPLL1_SPARE_7, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_6, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_N_DES_CH_7, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_6, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTAG_DETECTOR_P_DES_CH_7, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RX_SYNC_JTAG_DETECTOR_P_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RX_SYNC_JTAG_DETECTOR_P_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RX_SYNC_JTAG_DETECTOR_P_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RX_SYNC_JTAG_DETECTOR_N_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RX_SYNC_JTAG_DETECTOR_N_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RX_SYNC_JTAG_DETECTOR_N_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_6, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JRX_READ_DATA_7, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_6, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CONTROL_OUT_MUX_JTX_READ_DATA_7, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CONTROL_UPDATE_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CONTROL_UPDATE_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CONTROL_UPDATE_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CONTROL_UPDATE_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MCS_CLK_IND_CORE, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_REF_CLK, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_SPI_REG_ARM0_ERROR, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_SPI_REG_ARM1_ERROR, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_DIG_POWERGOOD, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MASTER_BIAS_CLK, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MBIAS_IGEN_PD_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MBIAS_IGEN_PD_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MBIAS_COMP_OUT_ANA_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MBIAS_COMP_OUT_ANA_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_SPI_REG_MBIAS_IGEN_PTATR_TRIM_DONE_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_SPI_REG_MBIAS_IGEN_PTATR_TRIM_DONE_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_6, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_7, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_8, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_9, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_10, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_11, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_12, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JRX_IRQ_13, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_6, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_7, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JTX_IRQ_8, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_NEW_PHASE_TOGGLE, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_JESD_MCS_CLK_IND, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_SERDES_PLL_PLL_LOCKED, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_SERDES_PLL_VCO_COMP_OUT, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_POWER_ON_RESET_N, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_6, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_7, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_8, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_9, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_10, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_11, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_12, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_13, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_14, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MISR_SIGNATURE_15, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_6, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RX_SPI_SOURCE_7, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_SLICER_POSITION_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_SLICER_POSITION_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_SLICER_POSITION_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_SLICER_POSITION_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MCS_CLK_IND_RX, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFDC_UPDATE, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_SLICER_OVERFLOW, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_AGC_ADCOVRG_SEC_HIGH, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_AGC_OVRG_SEC_HIGH_COUNTER_EXCEEDED, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_TIA_VALID, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RXFE_VALID, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RSSI_DECPWR_READY, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_PEAK_COUNT_EXCEEDED_QEC_ANA, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_PEAK_COUNT_EXCEEDED_QEC_DIG, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RSSI_SYMBOL_READY, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RXON, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_ADC_OVERLOAD_RESET_ADC, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFDC_STATE_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFDC_STATE_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFDC_STATE_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFDC_STATE_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFDC_UPDATE_COUNTER_EXPIRED, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFDC_MEASURE, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFDC_CAL_DONE, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_RFDC_MEASURE_COUNTER_EXPIRED, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_AGC_OVRG_LOW_INT1_COUNTER_EXCEEDED, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_AGC_OVRG_LOW_INT0_COUNTER_EXCEEDED, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_DIG_GAIN_SAT, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_AGC_ADCOVRG_INT1_LOW, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_AGC_ADCOVRG_INT0_LOW, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_AGC_SL_STATE_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_AGC_SL_STATE_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_AGC_GAINUPDATE_COUNTER_EXPIRED, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_AGC_SL_LOW_TH_EXCEEDED, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_AGC_SL_HIGH_TH_EXCEEDED, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_AGC_OVRG_LLB_COUNTER_EXCEEDED, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_AGC_ADCOVRG_LOW, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_AGC_ADCOVRG_HIGH, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_GT_GAIN_CHANGE, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_AGC_OVRG_ULB_COUNTER_EXCEEDED, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_AGC_OVRG_LOW_COUNTER_EXCEEDED, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_AGC_OVRG_HIGH_COUNTER_EXCEEDED, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_BAND_PEAK_COUNT_EXCEEDED_LOW_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_BAND_PEAK_COUNT_EXCEEDED_LOW_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_BAND_PEAK_COUNT_EXCEEDED_HIGH_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_BAND_PEAK_COUNT_EXCEEDED_HIGH_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_BAND_DECPWR_READY_TOGGLE_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_BAND_DECPWR_READY_TOGGLE_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_BAND_DECPWR_READY_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_BAND_DECPWR_READY_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MCS_CLK_IND_TX, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_PA_PROT_SRERROR, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_PA_PROT_PPERROR_OR_APERROR, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_ATTEN_RAMP_UP_PROT, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_ATTEN_RAMP_DOWN_PROT, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_ATTEN_TDD_RAMP_DOWN, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_ATTEN_TDD_RAMP_UP, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_ATTEN_LATCH_EN, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_DTX_POWER_UP_TRIGGER, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_DTX_POWER_DOWN_TRIGGER, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_TX_GAIN_CHANGE, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_TX_POWER_READY, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_PA_PROT_SRD_IRQ, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_TX_TSSI_DUC0_READY, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_ADC_SAMPLE_OVR, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_MCS_CLK_IND_ORX, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_ORX_ON, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_DECPWR_READY, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_ANY_ADC_SAMPLE_OVR, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_0, /*!< Stream Processor Trigger for GPIO 0 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_1, /*!< Stream Processor Trigger for GPIO 1 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_2, /*!< Stream Processor Trigger for GPIO 2 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_3, /*!< Stream Processor Trigger for GPIO 3 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_4, /*!< Stream Processor Trigger for GPIO 4 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_5, /*!< Stream Processor Trigger for GPIO 5 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_6, /*!< Stream Processor Trigger for GPIO 6 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_7, /*!< Stream Processor Trigger for GPIO 7 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_8, /*!< Stream Processor Trigger for GPIO 8 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_9, /*!< Stream Processor Trigger for GPIO 9 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_10, /*!< Stream Processor Trigger for GPIO 10 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_11, /*!< Stream Processor Trigger for GPIO 11 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_12, /*!< Stream Processor Trigger for GPIO 12 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_13, /*!< Stream Processor Trigger for GPIO 13 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_14, /*!< Stream Processor Trigger for GPIO 14 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_15, /*!< Stream Processor Trigger for GPIO 15 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_16, /*!< Stream Processor Trigger for GPIO 16 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_17, /*!< Stream Processor Trigger for GPIO 17 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_18, /*!< Stream Processor Trigger for GPIO 18 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_19, /*!< Stream Processor Trigger for GPIO 19 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_20, /*!< Stream Processor Trigger for GPIO 20 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_21, /*!< Stream Processor Trigger for GPIO 21 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_22, /*!< Stream Processor Trigger for GPIO 22 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_23, /*!< Stream Processor Trigger for GPIO 23 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_0, /*!< Stream Processor Output Signal to Digital GPIO 0 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_1, /*!< Stream Processor Output Signal to Digital GPIO 1 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_2, /*!< Stream Processor Output Signal to Digital GPIO 2 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_3, /*!< Stream Processor Output Signal to Digital GPIO 3 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_4, /*!< Stream Processor Output Signal to Digital GPIO 4 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_5, /*!< Stream Processor Output Signal to Digital GPIO 5 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_6, /*!< Stream Processor Output Signal to Digital GPIO 6 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_7, /*!< Stream Processor Output Signal to Digital GPIO 7 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_8, /*!< Stream Processor Output Signal to Digital GPIO 8 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_9, /*!< Stream Processor Output Signal to Digital GPIO 9 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_10, /*!< Stream Processor Output Signal to Digital GPIO 10 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_11, /*!< Stream Processor Output Signal to Digital GPIO 11 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_12, /*!< Stream Processor Output Signal to Digital GPIO 12 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_13, /*!< Stream Processor Output Signal to Digital GPIO 13 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_14, /*!< Stream Processor Output Signal to Digital GPIO 14 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_15, /*!< Stream Processor Output Signal to Digital GPIO 15 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_16, /*!< Stream Processor Output Signal to Digital GPIO 16 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_17, /*!< Stream Processor Output Signal to Digital GPIO 17 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_18, /*!< Stream Processor Output Signal to Digital GPIO 18 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_19, /*!< Stream Processor Output Signal to Digital GPIO 19 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_20, /*!< Stream Processor Output Signal to Digital GPIO 20 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_21, /*!< Stream Processor Output Signal to Digital GPIO 21 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_22, /*!< Stream Processor Output Signal to Digital GPIO 22 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_23, /*!< Stream Processor Output Signal to Digital GPIO 23 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_0, /*!< Stream Processor Output Signal to Analog GPIO 0 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_1, /*!< Stream Processor Output Signal to Analog GPIO 1 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_2, /*!< Stream Processor Output Signal to Analog GPIO 2 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_3, /*!< Stream Processor Output Signal to Analog GPIO 3 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_4, /*!< Stream Processor Output Signal to Analog GPIO 4 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_5, /*!< Stream Processor Output Signal to Analog GPIO 5 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_6, /*!< Stream Processor Output Signal to Analog GPIO 6 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_7, /*!< Stream Processor Output Signal to Analog GPIO 7 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_8, /*!< Stream Processor Output Signal to Analog GPIO 8 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_9, /*!< Stream Processor Output Signal to Analog GPIO 9 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_10, /*!< Stream Processor Output Signal to Analog GPIO 10 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_11, /*!< Stream Processor Output Signal to Analog GPIO 11 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_12, /*!< Stream Processor Output Signal to Analog GPIO 12 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_13, /*!< Stream Processor Output Signal to Analog GPIO 13 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_14, /*!< Stream Processor Output Signal to Analog GPIO 14 */ + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_15, /*!< Stream Processor Output Signal to Analog GPIO 15 */ + ADI_ADRV904X_GPIO_SIGNAL_PPI16_PEB, /*!< PPI PEB */ + ADI_ADRV904X_GPIO_SIGNAL_PPI16_CLK, /*!< PPI CLK */ + ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_0, /*!< PPI PDI 0 */ + ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_1, /*!< PPI PDI 1 */ + ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_2, /*!< PPI PDI 2 */ + ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_3, /*!< PPI PDI 3 */ + ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_4, /*!< PPI PDI 4 */ + ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_5, /*!< PPI PDI 5 */ + ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_6, /*!< PPI PDI 6 */ + ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_7, /*!< PPI PDI 7 */ + ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_8, /*!< PPI PDI 8 */ + ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_9, /*!< PPI PDI 9 */ + ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_10, /*!< PPI PDI 10 */ + ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_11, /*!< PPI PDI 11 */ + ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_12, /*!< PPI PDI 12 */ + ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_13, /*!< PPI PDI 13 */ + ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_14, /*!< PPI PDI 14 */ + ADI_ADRV904X_GPIO_SIGNAL_PPI16_PDI_15, /*!< PPI PDI 15 */ + ADI_ADRV904X_GPIO_SIGNAL_ADC_TEST_GEN_ENABLE, /*!< Rx Channel(s) Input ADC Test Gen Enable */ + ADI_ADRV904X_GPIO_SIGNAL_AGC_GAIN_CHANGE, /*!< Rx Channel(s) Input AGC Gain Change */ + ADI_ADRV904X_GPIO_SIGNAL_AGC_DEC_GAIN, /*!< Rx Channel(s) Input AGC Decrement Gain */ + ADI_ADRV904X_GPIO_SIGNAL_AGC_INC_GAIN, /*!< Rx Channel(s) Input AGC Increment Gain */ + ADI_ADRV904X_GPIO_SIGNAL_AGC_SLOWLOOP_FREEZE_ENABLE, /*!< Rx Channel(s) Input AGC Slowloop Freeze Enable */ + ADI_ADRV904X_GPIO_SIGNAL_AGC_MANUAL_GAIN_LOCK, /*!< Rx Channel(s) Input AGC Manual Gain Lock */ + ADI_ADRV904X_GPIO_SIGNAL_SELECT_S1, /*!< Tx Channel(s) Input Select S1 for Tx atten signal */ + ADI_ADRV904X_GPIO_SIGNAL_DTX_FORCE_PIN, /*!< Tx Channel(s) Input DTX Force Pin */ + ADI_ADRV904X_GPIO_SIGNAL_TX_ATTEN_UPD_GPIO, /*!< Tx Channel(s) Input Atten Update */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_0, /*!< GPIO Analog Manual Output (Drive) Mode: Analog GPIO 00 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_1, /*!< GPIO Analog Manual Output (Drive) Mode: Analog GPIO 01 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_2, /*!< GPIO Analog Manual Output (Drive) Mode: Analog GPIO 02 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_3, /*!< GPIO Analog Manual Output (Drive) Mode: Analog GPIO 03 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_4, /*!< GPIO Analog Manual Output (Drive) Mode: Analog GPIO 04 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_5, /*!< GPIO Analog Manual Output (Drive) Mode: Analog GPIO 05 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_6, /*!< GPIO Analog Manual Output (Drive) Mode: Analog GPIO 06 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_7, /*!< GPIO Analog Manual Output (Drive) Mode: Analog GPIO 07 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_8, /*!< GPIO Analog Manual Output (Drive) Mode: Analog GPIO 08 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_9, /*!< GPIO Analog Manual Output (Drive) Mode: Analog GPIO 09 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_10, /*!< GPIO Analog Manual Output (Drive) Mode: Analog GPIO 10 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_11, /*!< GPIO Analog Manual Output (Drive) Mode: Analog GPIO 11 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_12, /*!< GPIO Analog Manual Output (Drive) Mode: Analog GPIO 12 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_13, /*!< GPIO Analog Manual Output (Drive) Mode: Analog GPIO 13 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_14, /*!< GPIO Analog Manual Output (Drive) Mode: Analog GPIO 14 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_15, /*!< GPIO Analog Manual Output (Drive) Mode: Analog GPIO 15 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_0, /*!< GPIO Analog Manual Input (Receive) Mode: Analog GPIO 00 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_1, /*!< GPIO Analog Manual Input (Receive) Mode: Analog GPIO 01 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_2, /*!< GPIO Analog Manual Input (Receive) Mode: Analog GPIO 02 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_3, /*!< GPIO Analog Manual Input (Receive) Mode: Analog GPIO 03 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_4, /*!< GPIO Analog Manual Input (Receive) Mode: Analog GPIO 04 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_5, /*!< GPIO Analog Manual Input (Receive) Mode: Analog GPIO 05 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_6, /*!< GPIO Analog Manual Input (Receive) Mode: Analog GPIO 06 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_7, /*!< GPIO Analog Manual Input (Receive) Mode: Analog GPIO 07 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_8, /*!< GPIO Analog Manual Input (Receive) Mode: Analog GPIO 08 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_9, /*!< GPIO Analog Manual Input (Receive) Mode: Analog GPIO 09 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_10, /*!< GPIO Analog Manual Input (Receive) Mode: Analog GPIO 10 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_11, /*!< GPIO Analog Manual Input (Receive) Mode: Analog GPIO 11 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_12, /*!< GPIO Analog Manual Input (Receive) Mode: Analog GPIO 12 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_13, /*!< GPIO Analog Manual Input (Receive) Mode: Analog GPIO 13 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_14, /*!< GPIO Analog Manual Input (Receive) Mode: Analog GPIO 14 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_15, /*!< GPIO Analog Manual Input (Receive) Mode: Analog GPIO 15 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_0, /*!< GPIO Analog ARM Output (Drive) Mode: Analog GPIO 00 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_1, /*!< GPIO Analog ARM Output (Drive) Mode: Analog GPIO 01 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_2, /*!< GPIO Analog ARM Output (Drive) Mode: Analog GPIO 02 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_3, /*!< GPIO Analog ARM Output (Drive) Mode: Analog GPIO 03 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_4, /*!< GPIO Analog ARM Output (Drive) Mode: Analog GPIO 04 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_5, /*!< GPIO Analog ARM Output (Drive) Mode: Analog GPIO 05 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_6, /*!< GPIO Analog ARM Output (Drive) Mode: Analog GPIO 06 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_7, /*!< GPIO Analog ARM Output (Drive) Mode: Analog GPIO 07 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_8, /*!< GPIO Analog ARM Output (Drive) Mode: Analog GPIO 08 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_9, /*!< GPIO Analog ARM Output (Drive) Mode: Analog GPIO 09 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_10, /*!< GPIO Analog ARM Output (Drive) Mode: Analog GPIO 10 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_11, /*!< GPIO Analog ARM Output (Drive) Mode: Analog GPIO 11 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_12, /*!< GPIO Analog ARM Output (Drive) Mode: Analog GPIO 12 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_13, /*!< GPIO Analog ARM Output (Drive) Mode: Analog GPIO 13 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_14, /*!< GPIO Analog ARM Output (Drive) Mode: Analog GPIO 14 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_OUTPUT_15, /*!< GPIO Analog ARM Output (Drive) Mode: Analog GPIO 15 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_0, /*!< GPIO Analog ARM Input (Receive) Mode: Analog GPIO 00 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_1, /*!< GPIO Analog ARM Input (Receive) Mode: Analog GPIO 01 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_2, /*!< GPIO Analog ARM Input (Receive) Mode: Analog GPIO 02 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_3, /*!< GPIO Analog ARM Input (Receive) Mode: Analog GPIO 03 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_4, /*!< GPIO Analog ARM Input (Receive) Mode: Analog GPIO 04 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_5, /*!< GPIO Analog ARM Input (Receive) Mode: Analog GPIO 05 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_6, /*!< GPIO Analog ARM Input (Receive) Mode: Analog GPIO 06 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_7, /*!< GPIO Analog ARM Input (Receive) Mode: Analog GPIO 07 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_8, /*!< GPIO Analog ARM Input (Receive) Mode: Analog GPIO 08 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_9, /*!< GPIO Analog ARM Input (Receive) Mode: Analog GPIO 09 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_10, /*!< GPIO Analog ARM Input (Receive) Mode: Analog GPIO 10 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_11, /*!< GPIO Analog ARM Input (Receive) Mode: Analog GPIO 11 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_12, /*!< GPIO Analog ARM Input (Receive) Mode: Analog GPIO 12 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_13, /*!< GPIO Analog ARM Input (Receive) Mode: Analog GPIO 13 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_14, /*!< GPIO Analog ARM Input (Receive) Mode: Analog GPIO 14 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_ARM_INPUT_15, /*!< GPIO Analog ARM Input (Receive) Mode: Analog GPIO 15 */ + ADI_ADRV904X_GPIO_SIGNAL_RX0_EXT_CONTROL_0, /*!< Analog GPIO output signal for RX0 Gain Control Word Bit0 */ + ADI_ADRV904X_GPIO_SIGNAL_RX0_EXT_CONTROL_1, /*!< Analog GPIO output signal for RX0 Gain Control Word Bit1 */ + ADI_ADRV904X_GPIO_SIGNAL_RX1_EXT_CONTROL_0, /*!< Analog GPIO output signal for RX1 Gain Control Word Bit0 */ + ADI_ADRV904X_GPIO_SIGNAL_RX1_EXT_CONTROL_1, /*!< Analog GPIO output signal for RX1 Gain Control Word Bit1 */ + ADI_ADRV904X_GPIO_SIGNAL_RX2_EXT_CONTROL_0, /*!< Analog GPIO output signal for RX2 Gain Control Word Bit0 */ + ADI_ADRV904X_GPIO_SIGNAL_RX2_EXT_CONTROL_1, /*!< Analog GPIO output signal for RX2 Gain Control Word Bit1 */ + ADI_ADRV904X_GPIO_SIGNAL_RX3_EXT_CONTROL_0, /*!< Analog GPIO output signal for RX3 Gain Control Word Bit0 */ + ADI_ADRV904X_GPIO_SIGNAL_RX3_EXT_CONTROL_1, /*!< Analog GPIO output signal for RX3 Gain Control Word Bit1 */ + ADI_ADRV904X_GPIO_SIGNAL_RX4_EXT_CONTROL_0, /*!< Analog GPIO output signal for RX4 Gain Control Word Bit0 */ + ADI_ADRV904X_GPIO_SIGNAL_RX4_EXT_CONTROL_1, /*!< Analog GPIO output signal for RX4 Gain Control Word Bit1 */ + ADI_ADRV904X_GPIO_SIGNAL_RX5_EXT_CONTROL_0, /*!< Analog GPIO output signal for RX5 Gain Control Word Bit0 */ + ADI_ADRV904X_GPIO_SIGNAL_RX5_EXT_CONTROL_1, /*!< Analog GPIO output signal for RX5 Gain Control Word Bit1 */ + ADI_ADRV904X_GPIO_SIGNAL_RX6_EXT_CONTROL_0, /*!< Analog GPIO output signal for RX6 Gain Control Word Bit0 */ + ADI_ADRV904X_GPIO_SIGNAL_RX6_EXT_CONTROL_1, /*!< Analog GPIO output signal for RX6 Gain Control Word Bit1 */ + ADI_ADRV904X_GPIO_SIGNAL_RX7_EXT_CONTROL_0, /*!< Analog GPIO output signal for RX7 Gain Control Word Bit0 */ + ADI_ADRV904X_GPIO_SIGNAL_RX7_EXT_CONTROL_1, /*!< Analog GPIO output signal for RX7 Gain Control Word Bit1 */ + ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND0_0, /*!< Dual Band Control Rx0 Band 0 Bit 0. Only for Analog GPIO 0 */ + ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND0_1, /*!< Dual Band Control Rx0 Band 0 Bit 1. Only for Analog GPIO 1 */ + ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND1_0, /*!< Dual Band Control Rx0 Band 1 Bit 0. Only for Analog GPIO 2 */ + ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND1_1, /*!< Dual Band Control Rx0 Band 1 Bit 1. Only for Analog GPIO 3 */ + ADI_ADRV904X_GPIO_SIGNAL_RX1_DUALBAND_CONTROL_BAND0_0, /*!< Dual Band Control Rx1 Band 0 Bit 0. Only for Analog GPIO 4 */ + ADI_ADRV904X_GPIO_SIGNAL_RX1_DUALBAND_CONTROL_BAND0_1, /*!< Dual Band Control Rx1 Band 0 Bit 1. Only for Analog GPIO 5 */ + ADI_ADRV904X_GPIO_SIGNAL_RX1_DUALBAND_CONTROL_BAND1_0, /*!< Dual Band Control Rx1 Band 1 Bit 0. Only for Analog GPIO 6 */ + ADI_ADRV904X_GPIO_SIGNAL_RX1_DUALBAND_CONTROL_BAND1_1, /*!< Dual Band Control Rx1 Band 1 Bit 1. Only for Analog GPIO 7 */ + ADI_ADRV904X_GPIO_SIGNAL_RX4_DUALBAND_CONTROL_BAND0_0, /*!< Dual Band Control Rx4 Band 0 Bit 0. Only for Analog GPIO 8 */ + ADI_ADRV904X_GPIO_SIGNAL_RX4_DUALBAND_CONTROL_BAND0_1, /*!< Dual Band Control Rx4 Band 0 Bit 1. Only for Analog GPIO 9 */ + ADI_ADRV904X_GPIO_SIGNAL_RX4_DUALBAND_CONTROL_BAND1_0, /*!< Dual Band Control Rx4 Band 1 Bit 0. Only for Analog GPIO 10 */ + ADI_ADRV904X_GPIO_SIGNAL_RX4_DUALBAND_CONTROL_BAND1_1, /*!< Dual Band Control Rx4 Band 1 Bit 1. Only for Analog GPIO 11 */ + ADI_ADRV904X_GPIO_SIGNAL_RX5_DUALBAND_CONTROL_BAND0_0, /*!< Dual Band Control Rx5 Band 0 Bit 0. Only for Analog GPIO 12 */ + ADI_ADRV904X_GPIO_SIGNAL_RX5_DUALBAND_CONTROL_BAND0_1, /*!< Dual Band Control Rx5 Band 0 Bit 1. Only for Analog GPIO 13 */ + ADI_ADRV904X_GPIO_SIGNAL_RX5_DUALBAND_CONTROL_BAND1_0, /*!< Dual Band Control Rx5 Band 1 Bit 0. Only for Analog GPIO 14 */ + ADI_ADRV904X_GPIO_SIGNAL_RX5_DUALBAND_CONTROL_BAND1_1, /*!< Dual Band Control Rx5 Band 1 Bit 1. Only for Analog GPIO 15 */ + ADI_ADRV904X_GPIO_SIGNAL_RX2_DUALBAND_CONTROL_BAND0_0, /*!< Dual Band Control Rx2 Band 0 Bit 0. Only for Analog GPIO 0 */ + ADI_ADRV904X_GPIO_SIGNAL_RX2_DUALBAND_CONTROL_BAND0_1, /*!< Dual Band Control Rx2 Band 0 Bit 1. Only for Analog GPIO 1 */ + ADI_ADRV904X_GPIO_SIGNAL_RX2_DUALBAND_CONTROL_BAND1_0, /*!< Dual Band Control Rx2 Band 1 Bit 0. Only for Analog GPIO 2 */ + ADI_ADRV904X_GPIO_SIGNAL_RX2_DUALBAND_CONTROL_BAND1_1, /*!< Dual Band Control Rx2 Band 1 Bit 1. Only for Analog GPIO 3 */ + ADI_ADRV904X_GPIO_SIGNAL_RX3_DUALBAND_CONTROL_BAND0_0, /*!< Dual Band Control Rx3 Band 0 Bit 0. Only for Analog GPIO 4 */ + ADI_ADRV904X_GPIO_SIGNAL_RX3_DUALBAND_CONTROL_BAND0_1, /*!< Dual Band Control Rx3 Band 0 Bit 1. Only for Analog GPIO 5 */ + ADI_ADRV904X_GPIO_SIGNAL_RX3_DUALBAND_CONTROL_BAND1_0, /*!< Dual Band Control Rx3 Band 1 Bit 0. Only for Analog GPIO 6 */ + ADI_ADRV904X_GPIO_SIGNAL_RX3_DUALBAND_CONTROL_BAND1_1, /*!< Dual Band Control Rx3 Band 1 Bit 1. Only for Analog GPIO 7 */ + ADI_ADRV904X_GPIO_SIGNAL_RX6_DUALBAND_CONTROL_BAND0_0, /*!< Dual Band Control Rx6 Band 0 Bit 0. Only for Analog GPIO 8 */ + ADI_ADRV904X_GPIO_SIGNAL_RX6_DUALBAND_CONTROL_BAND0_1, /*!< Dual Band Control Rx6 Band 0 Bit 1. Only for Analog GPIO 9 */ + ADI_ADRV904X_GPIO_SIGNAL_RX6_DUALBAND_CONTROL_BAND1_0, /*!< Dual Band Control Rx6 Band 1 Bit 0. Only for Analog GPIO 10 */ + ADI_ADRV904X_GPIO_SIGNAL_RX6_DUALBAND_CONTROL_BAND1_1, /*!< Dual Band Control Rx6 Band 1 Bit 1. Only for Analog GPIO 11 */ + ADI_ADRV904X_GPIO_SIGNAL_RX7_DUALBAND_CONTROL_BAND0_0, /*!< Dual Band Control Rx7 Band 0 Bit 0. Only for Analog GPIO 12 */ + ADI_ADRV904X_GPIO_SIGNAL_RX7_DUALBAND_CONTROL_BAND0_1, /*!< Dual Band Control Rx7 Band 0 Bit 1. Only for Analog GPIO 13 */ + ADI_ADRV904X_GPIO_SIGNAL_RX7_DUALBAND_CONTROL_BAND1_0, /*!< Dual Band Control Rx7 Band 1 Bit 0. Only for Analog GPIO 14 */ + ADI_ADRV904X_GPIO_SIGNAL_RX7_DUALBAND_CONTROL_BAND1_1, /*!< Dual Band Control Rx7 Band 1 Bit 1. Only for Analog GPIO 15 */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_SSB_SYNC, /*!< Radio Sequencer SSB SYNC input Signal from a Digital GPIO. Valid on any Digital GPIO 0-23. Particular Radio Seq selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_0, /*!< Radio Sequencer Output Signal to Digital GPIO[0]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_1, /*!< Radio Sequencer Output Signal to Digital GPIO[1]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_2, /*!< Radio Sequencer Output Signal to Digital GPIO[2]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_3, /*!< Radio Sequencer Output Signal to Digital GPIO[3]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_4, /*!< Radio Sequencer Output Signal to Digital GPIO[4]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_5, /*!< Radio Sequencer Output Signal to Digital GPIO[5]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_6, /*!< Radio Sequencer Output Signal to Digital GPIO[6]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_7, /*!< Radio Sequencer Output Signal to Digital GPIO[7]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_8, /*!< Radio Sequencer Output Signal to Digital GPIO[8]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_9, /*!< Radio Sequencer Output Signal to Digital GPIO[9]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_10, /*!< Radio Sequencer Output Signal to Digital GPIO[10]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_11, /*!< Radio Sequencer Output Signal to Digital GPIO[11]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_12, /*!< Radio Sequencer Output Signal to Digital GPIO[12]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_13, /*!< Radio Sequencer Output Signal to Digital GPIO[13]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_14, /*!< Radio Sequencer Output Signal to Digital GPIO[14]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_15, /*!< Radio Sequencer Output Signal to Digital GPIO[15]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_16, /*!< Radio Sequencer Output Signal to Digital GPIO[16]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_17, /*!< Radio Sequencer Output Signal to Digital GPIO[17]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_18, /*!< Radio Sequencer Output Signal to Digital GPIO[18]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_19, /*!< Radio Sequencer Output Signal to Digital GPIO[19]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_20, /*!< Radio Sequencer Output Signal to Digital GPIO[20]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_21, /*!< Radio Sequencer Output Signal to Digital GPIO[21]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_22, /*!< Radio Sequencer Output Signal to Digital GPIO[22]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_23, /*!< Radio Sequencer Output Signal to Digital GPIO[23]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_0, /*!< Radio Sequencer Output Signal to Analog GPIO[0]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_1, /*!< Radio Sequencer Output Signal to Analog GPIO[1]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_2, /*!< Radio Sequencer Output Signal to Analog GPIO[2]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_3, /*!< Radio Sequencer Output Signal to Analog GPIO[3]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_4, /*!< Radio Sequencer Output Signal to Analog GPIO[4]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_5, /*!< Radio Sequencer Output Signal to Analog GPIO[5]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_6, /*!< Radio Sequencer Output Signal to Analog GPIO[6]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_7, /*!< Radio Sequencer Output Signal to Analog GPIO[7]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_8, /*!< Radio Sequencer Output Signal to Analog GPIO[8]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_9, /*!< Radio Sequencer Output Signal to Analog GPIO[9]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_10, /*!< Radio Sequencer Output Signal to Analog GPIO[10]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_11, /*!< Radio Sequencer Output Signal to Analog GPIO[11]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_12, /*!< Radio Sequencer Output Signal to Analog GPIO[12]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_13, /*!< Radio Sequencer Output Signal to Analog GPIO[13]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_14, /*!< Radio Sequencer Output Signal to Analog GPIO[14]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_15, /*!< Radio Sequencer Output Signal to Analog GPIO[15]. Particular Radio Seq signal selectable in Radio Seq Xbar Config */ + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_ENABLE, /*!< CDDC RSSI Enable input Signal from a Digital GPIO. Valid on any Digital GPIO 0-23.*/ + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_6, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_7, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_TX_TSSI_DUC1_READY, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_0, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_3, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_4, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_5, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_6, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_CDUC_TSSI_READY_7, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_TX_DPD_IN_POWER_READY, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_TX_DPD_OUT_POWER_READY, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_TX_DFE_TSSI_READY_1, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_TX_DFE_TSSI_READY_2, /*!< Monitor Out */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_UART0_PADRXSIN, /*!< Select DFE UART0 Receive Input signal */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_UART0_PADCTS, /*!< Select DFE UART0 Clear to Send Flow control signal */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_UART0_PADRTSOUT, /*!< Select DFE UART0 Request to Send Flow control signal */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_UART0_PADTXSOUT, /*!< Select DFE UART0 Transmit Output signal */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_ARM_TRST, /*!< Select DFE ARM TRST signal. For Test mode only */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_ARM_TDO_SWO_MUX, /*!< Select DFE ARM TDO SWO MUX signal. For Test mode only */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_ARM_TDI, /*!< Select DFE ARM TDI signal. For Test mode only */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_ARM_TMS, /*!< Select DFE ARM TMS signal. For Test mode only */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_ARM_TCK, /*!< Select DFE ARM TCK signal. For Test mode only */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_0, /*!< No-op for GPIO 0. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_1, /*!< No-op for GPIO 1. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_2, /*!< No-op for GPIO 2. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_3, /*!< No-op for GPIO 3. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_4, /*!< No-op for GPIO 4. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_5, /*!< No-op for GPIO 5. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_6, /*!< No-op for GPIO 6. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_7, /*!< No-op for GPIO 7. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_8, /*!< No-op for GPIO 8. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_9, /*!< No-op for GPIO 9. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_10, /*!< No-op for GPIO 10. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_11, /*!< No-op for GPIO 11. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_12, /*!< No-op for GPIO 12. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_13, /*!< No-op for GPIO 13. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_14, /*!< No-op for GPIO 14. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_15, /*!< No-op for GPIO 15. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_16, /*!< No-op for GPIO 16. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_17, /*!< No-op for GPIO 17. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_18, /*!< No-op for GPIO 18. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_19, /*!< No-op for GPIO 19. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_20, /*!< No-op for GPIO 20. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_21, /*!< No-op for GPIO 21. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_22, /*!< No-op for GPIO 22. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_NOOP_23, /*!< No-op for GPIO 23. Unconnected to any function in the device, but treated as allocated. */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_0, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 00 */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_1, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 01 */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_2, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 02 */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_3, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 03 */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_4, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 04 */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_5, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 05 */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_6, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 06 */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_7, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 07 */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_8, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 08 */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_9, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 09 */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_10, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 10 */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_11, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 11 */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_12, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 12 */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_13, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 13 */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_14, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 14 */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_15, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 15 */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_16, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 16 */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_17, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 17 */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_18, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 18 */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_19, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 19 */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_20, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 20 */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_21, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 21 */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_22, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 22 */ + ADI_ADRV904X_GPIO_SIGNAL_DFE_CTRL_OUTPUT_23, /*!< GPIO DFE Control Output (Drive) Mode: GPIO 23 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_0, /*!< Analog GPIO DFE Control Output (Drive) Mode: GPIO 00 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_1, /*!< Analog GPIO DFE Control Output (Drive) Mode: GPIO 01 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_2, /*!< Analog GPIO DFE Control Output (Drive) Mode: GPIO 02 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_3, /*!< Analog GPIO DFE Control Output (Drive) Mode: GPIO 03 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_4, /*!< Analog GPIO DFE Control Output (Drive) Mode: GPIO 04 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_5, /*!< Analog GPIO DFE Control Output (Drive) Mode: GPIO 05 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_6, /*!< Analog GPIO DFE Control Output (Drive) Mode: GPIO 06 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_7, /*!< Analog GPIO DFE Control Output (Drive) Mode: GPIO 07 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_8, /*!< Analog GPIO DFE Control Output (Drive) Mode: GPIO 08 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_9, /*!< Analog GPIO DFE Control Output (Drive) Mode: GPIO 09 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_10, /*!< Analog GPIO DFE Control Output (Drive) Mode: GPIO 10 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_11, /*!< Analog GPIO DFE Control Output (Drive) Mode: GPIO 11 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_12, /*!< Analog GPIO DFE Control Output (Drive) Mode: GPIO 12 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_13, /*!< Analog GPIO DFE Control Output (Drive) Mode: GPIO 13 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_14, /*!< Analog GPIO DFE Control Output (Drive) Mode: GPIO 14 */ + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_DFE_CTRL_OUTPUT_15, /*!< Analog GPIO DFE Control Output (Drive) Mode: GPIO 15 */ + /***Please add GPIO SIGNALS above this line***/ + ADI_ADRV904X_GPIO_SIGNAL_NUM_SIGNALS, /*!< Total Number of GPIO Signals */ + ADI_ADRV904X_GPIO_SIGNAL_INVALID +} adi_adrv904x_GpioSignal_e; + + +/** +* \brief Data structure to hold a full status of all GPIO configurations, both Digital and Analog +*/ +typedef struct adi_adrv904x_GpioStatus +{ + uint32_t digPinAllocated; /*!< Pinmask containing the Digital GPIOs currently allocated for use */ + adi_adrv904x_GpioSignal_e digSignal[ADI_ADRV904X_GPIO_COUNT]; /*!< Array of all Digital GPIO Signals */ + uint32_t digChMask[ADI_ADRV904X_GPIO_COUNT]; /*!< Array of all Digital GPIO Channel Masks */ + uint32_t anaPinAllocated; /*!< Pinmask containing the Analog GPIOs currently allocated for use */ + adi_adrv904x_GpioSignal_e anaSignal[ADI_ADRV904X_GPIO_ANALOG_COUNT]; /*!< Array of all Analog GPIO Signals */ + uint32_t anaChMask[ADI_ADRV904X_GPIO_ANALOG_COUNT]; /*!< Array of all Analog GPIO Channel Masks */ +} adi_adrv904x_GpioStatus_t; + +/**************************************************************************** + * GP Int (General Purpose Interrupt) related types + **************************************************************************** + */ + +/** + * \brief Enum for selecting the GP_INT channel(s) + */ +typedef enum adi_adrv904x_GpIntPinSelect +{ + ADI_ADRV904X_GPINT0, /*!< GP Interrupt Pin0 select */ + ADI_ADRV904X_GPINT1, /*!< GP Interrupt Pin1 select */ + ADI_ADRV904X_GPINTALL /*!< All GP Interrupt pins */ +} adi_adrv904x_GpIntPinSelect_e; + +/** + * \brief Data structure to hold a 96bit GP Interrupt Word. Interrupts are split into 48bit Lower/Upper Words. + * The following table specifies each GP Interrupt source and how it maps to the adi_adrv904x_GpIntWord structure: + * + * | Full(96bit)
Word Bit[n] | GP Interrupt
Mask Bit | Word | Half(48bit)
Word Bit[n] | Byte | Byte
Byte Bit[n] | + * |:--------------------------:|:-----------------------------:|:-----:|:--------------------------:|:-----:|:-------------------:| + * | 0 | FRAMER_IRQ_0 | Lower | 0 | 0 | 0 | + * | 1 | FRAMER_IRQ_1 | Lower | 1 | 0 | 1 | + * | 2 | FRAMER_IRQ_2 | Lower | 2 | 0 | 2 | + * | 3 | FRAMER_IRQ_3 | Lower | 3 | 0 | 3 | + * | 4 | FRAMER_IRQ_4 | Lower | 4 | 0 | 4 | + * | 5 | FRAMER_IRQ_5 | Lower | 5 | 0 | 5 | + * | 6 | FRAMER_IRQ_6 | Lower | 6 | 0 | 6 | + * | 7 | FRAMER_IRQ_7 | Lower | 7 | 0 | 7 | + * | 8 | FRAMER_IRQ_8 | Lower | 8 | 1 | 0 | + * | 9 | DEFRAMER_IRQ_0 | Lower | 9 | 1 | 1 | + * | 10 | DEFRAMER_IRQ_1 | Lower | 10 | 1 | 2 | + * | 11 | DEFRAMER_IRQ_2 | Lower | 11 | 1 | 3 | + * | 12 | DEFRAMER_IRQ_3 | Lower | 12 | 1 | 4 | + * | 13 | DEFRAMER_IRQ_4 | Lower | 13 | 1 | 5 | + * | 14 | DEFRAMER_IRQ_5 | Lower | 14 | 1 | 6 | + * | 15 | DEFRAMER_IRQ_6 | Lower | 15 | 1 | 7 | + * | 16 | DEFRAMER_IRQ_7 | Lower | 16 | 2 | 0 | + * | 17 | DEFRAMER_IRQ_8 | Lower | 17 | 2 | 1 | + * | 18 | DEFRAMER_IRQ_9 | Lower | 18 | 2 | 2 | + * | 19 | DEFRAMER_IRQ_10 | Lower | 19 | 2 | 3 | + * | 20 | DEFRAMER_IRQ_11 | Lower | 20 | 2 | 4 | + * | 21 | DEFRAMER_IRQ_12 | Lower | 21 | 2 | 5 | + * | 22 | DEFRAMER_IRQ_13 | Lower | 22 | 2 | 6 | + * | 23 | RX0_STREAM_ERROR | Lower | 23 | 2 | 7 | + * | 24 | RX1_STREAM_ERROR | Lower | 24 | 3 | 0 | + * | 25 | RX2_STREAM_ERROR | Lower | 25 | 3 | 1 | + * | 26 | RX3_STREAM_ERROR | Lower | 26 | 3 | 2 | + * | 27 | RX4_STREAM_ERROR | Lower | 27 | 3 | 3 | + * | 28 | RX5_STREAM_ERROR | Lower | 28 | 3 | 4 | + * | 29 | RX6_STREAM_ERROR | Lower | 29 | 3 | 5 | + * | 30 | RX7_STREAM_ERROR | Lower | 30 | 3 | 6 | + * | 31 | TX0_STREAM_ERROR | Lower | 31 | 3 | 7 | + * | 32 | TX1_STREAM_ERROR | Lower | 32 | 4 | 0 | + * | 33 | TX2_STREAM_ERROR | Lower | 33 | 4 | 1 | + * | 34 | TX3_STREAM_ERROR | Lower | 34 | 4 | 2 | + * | 35 | TX4_STREAM_ERROR | Lower | 35 | 4 | 3 | + * | 36 | TX5_STREAM_ERROR | Lower | 36 | 4 | 4 | + * | 37 | TX6_STREAM_ERROR | Lower | 37 | 4 | 5 | + * | 38 | TX7_STREAM_ERROR | Lower | 38 | 4 | 6 | + * | 39 | ORX0_STREAM_ERROR | Lower | 39 | 4 | 7 | + * | 40 | ORX1_STREAM_ERROR | Lower | 40 | 5 | 0 | + * | 41 | CORE_STREAM_ERROR | Lower | 41 | 5 | 1 | + * | 42 | AUX_SPI_CORE_ERROR | Lower | 42 | 5 | 2 | + * | 43 | ERROR_SPI_PAGING | Lower | 43 | 5 | 3 | + * | 44 | ERROR_AUX_SPI_PAGING | Lower | 44 | 5 | 4 | + * | 45 | RESERVED | Lower | 45 | 5 | 5 | + * | 46 | RESERVED | Lower | 46 | 5 | 6 | + * | 47 | RESERVED | Lower | 47 | 5 | 7 | + * |----------------------------|-------------------------------|-------|----------------------------|-------|---------------------| + * | 48 | ARM1_MEMORY_ECC_ERROR | Upper | 0 | 6 | 0 | + * | 49 | ARM1_SYSTEM_ERROR | Upper | 1 | 6 | 1 | + * | 50 | ARM1_CALIBRATION_ERROR | Upper | 2 | 6 | 2 | + * | 51 | ARM1_WATCHDOG_TIMEOUT | Upper | 3 | 6 | 3 | + * | 52 | ARM1_FORCE_GP_INTERRUPT | Upper | 4 | 6 | 4 | + * | 53 | ARM0_MEMORY_ECC_ERROR | Upper | 5 | 6 | 5 | + * | 54 | ARM0_SYSTEM_ERROR | Upper | 6 | 6 | 6 | + * | 55 | ARM0_CALIBRATION_ERROR | Upper | 7 | 6 | 7 | + * | 56 | ARM0_WATCHDOG_TIMEOUT | Upper | 8 | 7 | 0 | + * | 57 | ARM0_FORCE_GP_INTERRUPT | Upper | 9 | 7 | 1 | + * | 58 | PA_PROTECTION_TX0_POWER_ERROR | Upper | 10 | 7 | 2 | + * | 59 | PA_PROTECTION_TX0_SRD_ERROR | Upper | 11 | 7 | 3 | + * | 60 | PA_PROTECTION_TX1_POWER_ERROR | Upper | 12 | 7 | 4 | + * | 61 | PA_PROTECTION_TX1_SRD_ERROR | Upper | 13 | 7 | 5 | + * | 62 | PA_PROTECTION_TX2_POWER_ERROR | Upper | 14 | 7 | 6 | + * | 63 | PA_PROTECTION_TX2_SRD_ERROR | Upper | 15 | 7 | 7 | + * | 64 | PA_PROTECTION_TX3_POWER_ERROR | Upper | 16 | 8 | 0 | + * | 65 | PA_PROTECTION_TX3_SRD_ERROR | Upper | 17 | 8 | 1 | + * | 66 | PA_PROTECTION_TX4_POWER_ERROR | Upper | 18 | 8 | 2 | + * | 67 | PA_PROTECTION_TX4_SRD_ERROR | Upper | 19 | 8 | 3 | + * | 68 | PA_PROTECTION_TX5_POWER_ERROR | Upper | 20 | 8 | 4 | + * | 69 | PA_PROTECTION_TX5_SRD_ERROR | Upper | 21 | 8 | 5 | + * | 70 | PA_PROTECTION_TX6_POWER_ERROR | Upper | 22 | 8 | 6 | + * | 71 | PA_PROTECTION_TX6_SRD_ERROR | Upper | 23 | 8 | 7 | + * | 72 | PA_PROTECTION_TX7_POWER_ERROR | Upper | 24 | 9 | 0 | + * | 73 | PA_PROTECTION_TX7_SRD_ERROR | Upper | 25 | 9 | 1 | + * | 74 | SERDES_PLL_UNLOCK | Upper | 26 | 9 | 2 | + * | 75 | CLKPLL_OVR_RANGE | Upper | 27 | 9 | 3 | + * | 76 | RFPLL1_CP_OVR_RANGE | Upper | 28 | 9 | 4 | + * | 77 | RFPLL0_CP_OVR_RANGE | Upper | 29 | 9 | 5 | + * | 78 | CLKPLL_UNLOCK | Upper | 30 | 9 | 6 | + * | 79 | RFPLL1_UNLOCK | Upper | 31 | 9 | 7 | + * | 80 | RFPLL0_UNLOCK | Upper | 32 | 10 | 0 | + * | 81 | SPI_AHB_ERROR | Upper | 33 | 10 | 1 | + * | 82 | AUX_SPI_AHB_ERROR | Upper | 34 | 10 | 2 | + * | 83 | SPI_CLK_EFUSE_READ_ABORT | Upper | 35 | 10 | 3 | + * | 84 | AUX_SPI_ABORT | Upper | 36 | 10 | 4 | + * | 85 | SPI_ABORT | Upper | 37 | 10 | 5 | + * | 86 | DFE_CPU_AND_MEM_INT_0 | Upper | 38 | 10 | 6 | + * | 87 | DFE_CPU_AND_MEM_INT_1 | Upper | 39 | 10 | 7 | + * | 88 | DFE_CPU_AND_MEM_INT_2 | Upper | 40 | 11 | 0 | + * | 89 | RESERVED | Upper | 41 | 11 | 1 | + * | 90 | DFE_CPU_AND_MEM_INT_3 | Upper | 42 | 11 | 2 | + * | 91 | DFE_CPU_AND_MEM_INT_4 | Upper | 43 | 11 | 3 | + * | 92 | DFE_CPU_PINT_SW0 | Upper | 44 | 11 | 4 | + * | 93 | DFE_CPU_PINT_SW1 | Upper | 45 | 11 | 5 | + * | 94 | RESERVED | Upper | 46 | 11 | 6 | + * | 95 | RADIO_SEQ_ERROR | Upper | 47 | 11 | 7 | + * |----------------------------|-------------------------------|-------|----------------------------|-------|---------------------| +*/ +typedef struct adi_adrv904x_GpIntMask +{ + uint64_t lowerMask; /*!< Lower 48 GP Interrupt bits of entire 96 Bit Mask */ + uint64_t upperMask; /*!< Upper 48 GP Interrupt bits of entire 96 Bit Mask */ +} adi_adrv904x_GpIntMask_t; + +/** +* \brief Data structure holding the GP Interrupt Mask Words for all GP Int Pins +*/ +typedef struct adi_adrv904x_GpIntPinMaskCfg +{ + adi_adrv904x_GpIntMask_t gpInt0Mask; /*!< 96 bit GP Interrupt Mask Word for GP Int Pin0 */ + adi_adrv904x_GpIntMask_t gpInt1Mask; /*!< 96 bit GP Interrupt Mask Word for GP Int Pin1 */ +} adi_adrv904x_GpIntPinMaskCfg_t; + + + +/** + * \brief Digital Pin Name + */ +typedef enum adi_adrv904x_GpioDigitalPin +{ + ADI_ADRV904X_IO_GPIO_0 = 0x02U, + ADI_ADRV904X_IO_GPIO_1 = 0x01U, + ADI_ADRV904X_IO_GPIO_2 = 0x40U, + ADI_ADRV904X_IO_GPIO_3 = 0x42U, + ADI_ADRV904X_IO_GPIO_4 = 0x12U, + ADI_ADRV904X_IO_GPIO_5 = 0x00U, + ADI_ADRV904X_IO_GPIO_6 = 0x41U, + ADI_ADRV904X_IO_GPIO_7 = 0x50U, + ADI_ADRV904X_IO_GPIO_8 = 0x13U, + ADI_ADRV904X_IO_GPIO_9 = 0x51U, + ADI_ADRV904X_IO_GPIO_10 = 0x10U, + ADI_ADRV904X_IO_GPIO_11 = 0x52U, + ADI_ADRV904X_IO_GPIO_12 = 0x23U, + ADI_ADRV904X_IO_GPIO_13 = 0x65U, + ADI_ADRV904X_IO_GPIO_14 = 0x21U, + ADI_ADRV904X_IO_GPIO_15 = 0x22U, + ADI_ADRV904X_IO_GPIO_16 = 0x63U, + ADI_ADRV904X_IO_GPIO_17 = 0x60U, + ADI_ADRV904X_IO_GPIO_18 = 0x20U, + ADI_ADRV904X_IO_GPIO_19 = 0x24U, + ADI_ADRV904X_IO_GPIO_20 = 0x62U, + ADI_ADRV904X_IO_GPIO_21 = 0x61U, + ADI_ADRV904X_IO_GPIO_22 = 0x35U, + ADI_ADRV904X_IO_GPIO_23 = 0x70U, + ADI_ADRV904X_O_GPINT_0 = 0x72U, + ADI_ADRV904X_O_GPINT_1 = 0x33U, + ADI_ADRV904X_I_TRX0_EN = 0x03U, + ADI_ADRV904X_I_TRX1_EN = 0x13U, + ADI_ADRV904X_I_TRX2_EN = 0x15U, + ADI_ADRV904X_I_TRX3_EN = 0x25U, + ADI_ADRV904X_I_TRX4_EN = 0x43U, + ADI_ADRV904X_I_TRX5_EN = 0x54U, + ADI_ADRV904X_I_TRX6_EN = 0x55U, + ADI_ADRV904X_I_TRX7_EN = 0x64U, + ADI_ADRV904X_I_ORX0_EN = 0x14U, + ADI_ADRV904X_I_ORX1_EN = 0x53U, + ADI_ADRV904X_I_RESETB = 0x30U, + ADI_ADRV904X_I_SPI_ENB = 0x75U, + ADI_ADRV904X_I_SPI_CLK = 0x31U, + ADI_ADRV904X_IO_SPI_DIO = 0x32U, + ADI_ADRV904X_O_SPI_DO = 0x71U, +} adi_adrv904x_GpioDigitalPin_e; + +#endif /* _ADI_ADRV904X_GPIO_TYPES_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_hal.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_hal.h new file mode 100644 index 00000000000..b5c711f26d8 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_hal.h @@ -0,0 +1,388 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adi_adrv904x_hal.h + * \brief Contains prototypes and macro definitions for Private ADI HAL wrapper + * functions implemented in adi_adrv904x_hal.c + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADI_ADRV904X_HAL_H_ +#define _ADI_ADRV904X_HAL_H_ + +#include "adi_adrv904x_hal_types.h" +#include "adi_adrv904x_error.h" + +/** + * /brief Convenience macro for ADRV904X Device API functions to call adi_common_hal_ApiEnter + */ +#define ADI_ADRV904X_API_ENTRY(commonDev) \ +{ \ + adi_common_ErrAction_e _recoveryAction = adi_common_hal_ApiEnter((commonDev), __func__, ADI_TRUE); \ + \ + if(ADI_COMMON_ERR_ACT_NONE != _recoveryAction) \ + { \ + ADI_API_ERROR_REPORT(commonDev, _recoveryAction, "API Enter Issue"); \ + return (adi_adrv904x_ErrAction_e)_recoveryAction; /* Device Specific Recovery Action Required */ \ + } \ +} + +/** + * /brief Convenience macro for ADRV904X Device API functions to call adi_common_hal_ApiExit + */ +#define ADI_ADRV904X_API_EXIT(commonDev, recoveryAction) \ +{ \ + adi_common_ErrAction_e _recoveryAction = adi_common_hal_ApiExit((commonDev), __func__, ADI_TRUE); \ + \ + if (ADI_COMMON_ERR_ACT_NONE != _recoveryAction) \ + { \ + ADI_API_ERROR_REPORT(commonDev, _recoveryAction, "API Exit Issue"); \ + } \ + \ + if(ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) \ + { \ + return (adi_adrv904x_ErrAction_e) recoveryAction; /* Device Specific Recovery Action Required */ \ + } \ + \ + return (adi_adrv904x_ErrAction_e)_recoveryAction; /* Device Specific Recovery Action Required */ \ +} + +/** + * /brief Convenience macro for ADRV904X Device API functions to call adi_common_hal_ApiEnter_vLogCtl + * with ADI_COMMON_DEVICE_LOGCTL_QUIET (i.e. uses logLevel PRIV for recursive calls to the API). + */ +#define ADI_ADRV904X_API_ENTRY_QUIET(commonDev) \ +{ \ + adi_common_ErrAction_e _recoveryAction = \ + adi_common_hal_ApiEnter_vLogCtl((commonDev), __func__, ADI_TRUE, ADI_COMMON_DEVICE_LOGCTL_QUIET); \ + \ + if(ADI_COMMON_ERR_ACT_NONE != _recoveryAction) \ + { \ + ADI_API_ERROR_REPORT(&device->common, _recoveryAction, "API Enter Issue"); \ + return (adi_adrv904x_ErrAction_e)_recoveryAction; /* Device Specific Recovery Action Required */ \ + } \ +} + +/** + * /brief Convenience macro for ADRV904X Device API functions to call adi_common_hal_ApiExit_vLogCtl + * with ADI_COMMON_DEVICE_LOGCTL_QUIET (i.e. uses logLevel PRIV for recursive calls to the API). + */ +#define ADI_ADRV904X_API_EXIT_QUIET(commonDev, recoveryAction) \ +{ \ + adi_common_ErrAction_e _recoveryAction = \ + adi_common_hal_ApiExit_vLogCtl((commonDev), __func__, ADI_TRUE, ADI_COMMON_DEVICE_LOGCTL_QUIET); \ + \ + if (ADI_COMMON_ERR_ACT_NONE != _recoveryAction) \ + { \ + ADI_API_ERROR_REPORT(&device->common, _recoveryAction, "API Exit Issue"); \ + } \ + \ + if(ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) \ + { \ + return (adi_adrv904x_ErrAction_e) recoveryAction; /* Device Specific Recovery Action Required */ \ + } \ + \ + return (adi_adrv904x_ErrAction_e)_recoveryAction; /* Device Specific Recovery Action Required */ \ +} + +/** +* \brief Writes out the data array of size count. Must be packed according ADI HAL layer specs. +* +* \dep_begin +* \dep{device->halInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure. +* \param[in] data byte array containing the data to write to SPI. Must be packed correctly. +* \param[in,out] count pointer to the number of valid bytes in data parameter. On successful +* completion it is set to 0. +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +* +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SpiFlush(adi_adrv904x_Device_t* const device, + const uint8_t data[], + uint32_t* const count); + +/** +* \brief Writes data from memory to destination registers on the device. +* +* Supports a contiguous writes with a single start address or scattered write to several addresses. +* +* See adi_adrv904x_Registers32Read for important details. +* +* \dep_begin +* \dep{device->halInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure. +* \param[in,out] spiCache If supplied writes operations are cached until adi_adrv904x_SpiFlush +* is used to flush the cache or a subsequent call to this function decides to flush +* the cache. Set to NULL to avoid caching. +* \param[in] addr For a contiguous write supply an array of one element containing the dest addr at which +* to start the write; The Nth element in writeData is written to addr[0] + n. +* For scattered writes supply an array of param count elements; the Nth element in writeData is written +* to addr[n]. All register addresses are 32bit regardless of the data-width of the register. +* \param[in] writeData The data to write. Each element is 32bits wide but depending on the destination +* register address either all 32bits (for addresses >= 0x4000) or only the least-significant +* 8 bits will be written (for addresses 0x0 - 0x3FFF). +* \param[in] mask NULL indicates a contiguous write (see param addr) and no masking occurs - all bits of each dest register +* will be written to. +* If not NULL each register write for each element in writeData is masked with the +* corresponding element of this array. Only the register bits set to 1 in the +* corresponding mask element are updated. Other register bits are left unchanged. +* \param[in] count Number of elements writeData array and if mask is not NULL also mask and addr arrays. +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +* +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Registers32Write(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const uint32_t addr[], + const uint32_t writeData[], + const uint32_t mask[], + const uint32_t count); + +/** +* \brief Writes a 32bits register with 32bits of data to the part. +* +* \dep_begin +* \dep{device->halInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure. +* \param[in,out] spiCache Optional pointer to a spiCache structure if caching writes. If there is no caching passing NULL is valid. +* \param[in] addr the 32bits address of the register to write to. +* \param[in] writeData the 32bits value to write to the register. +* \param[in] mask the 32bits mask to write to the register. +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +* +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Register32Write(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + uint32_t addr, + const uint32_t writeData, + const uint32_t mask); + +/** +* \brief This function serves as a helper function for adi_adrv904x_Registers32Read. This will call Registers32Read with a count value +* set to one. Depending on if addr is Direct SPI (< 0x4000) or AHB access ( all other addresses) that one will correspond to a single +* byte or a full word (4 bytes), respectively. +* +* \dep_begin +* \dep{device->halInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure. +* \param[in,out] spiCache Optional pointer to a spiCache structure if caching writes, the cache will be written out prior to performing the read. If there is no caching passing NULL is valid. +* \param[in] addr the 32bits address of the register to read from. +* \param[out] readData a pointer to a location to write the register data to. +* \param[in] mask the desired mask to logically-and the register value with before returning in readData +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +* +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Register32Read(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + uint32_t addr, + uint32_t* const readData, + const uint32_t mask); + + +/** +* \brief Read from a contiguous range of device registers into memory. +* +* This function is used to access all SPI registers, both Core SPI addresses (addresses < 0x4000) and AHB memory (addresses >= 0x4000). +* For Core SPI addresses it uses direct SPI access. For AHB addresses, it uses the AHB interface registers. +* The only practical difference between the two for the user is the size of the registers. For Core SPI access the register size is 8-bits. +* For AHB access, the register size is 32-bits. This means for Core SPI addresses, the upper three bytes of each readData element are +* not written. +* +* Both Core & AHB register access can take advantage of SPI streaming. There is a local cache that will build up as big of a cache of SPI +* reads as possible before accessing the SPI platform layer. The spiCache parameter is only as a convenience and to keep the prototype across +* API HAL functions similar, ie if a user has an existing spiCache from previous Register(s)32Write they can pass it in here to have it be flushed +* prior to reads being performed. However, SPI reads cannot be cached across Register(s)32Read function calls. +* +* In addition to SPI streaming, there is also AHB auto-increment mode and SPI FIFO mode available for AHB address regions. +* AHB auto-increment allows reading the AHB interface data registers continuously without having to set the AHB address registers each time. +* SPI FIFO allows for SPI streaming and AHB auto-increment to be used together- it allows SPI streaming mode when reading from the same +* register over and over, eg AHB Data interface register. +* The user can set the preference for AHB auto-increment and SPI FIFO mode through adi_adrv904x_AhbReadConfigure. SPI streaming is set when +* the SPI is configured. +* Note: SPI FIFO can only be utilized if auto-increment and SPI streaming is enabled. +* +* The mask parameter allows for mask values to be applied to each register while reading. However, if masking is not necessary a NULL value +* can be used and no masking will be performed. It is recommended for large transactions that mask be NULL unless absolutely necessary. +* Keep in mind that for Direct SPI access, only the least-significant byte will have the mask applied. This means that if there's garbage passed +* into the readData array, there will still be garbage in bytes[3:1] of each readData entry. It is recommended to zero out the memory space +* allocated for readData prior to calling this function if that's a concern. +* +* \dep_begin +* \dep{device->halInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure. +* \param[in,out] spiCache Optional pointer to a spiCache structure if caching writes, the cache will be written out prior to performing the read. +* If there is no caching passing NULL is valid. +* \param[in] addr The 32bit address of the first source register on the device from which to read. +* \param[in,out] readData The destination location to which to write the register data. Must of size at least 'count * sizeof(uint32_t)'. Each register +* is written to a separate element in readData regardless of the size of the device register. +* \param[in] mask If no masking is desired pass in NULL. Otherwise, it should be the same size as count with mask values for each register. +* \param[in] count The number of registers to read. Does NOT indicate number of bytes to read. Registers 0 - 0x3FFF are 8 bit, other registers are 32bit. +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +* +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Registers32Read(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const uint32_t addr, + uint32_t readData[], + uint32_t mask[], + const uint32_t count); + +/** +* \brief Writes data from memory to destination registers on the device using byte arrays. +* +* See adi_adrv904x_Registers32Read for important details. +* +* \dep_begin +* \dep{device->halInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure. +* \param[in,out] spiCache Optional pointer to a spiCache structure if caching writes. If there is no +* caching passing NULL is valid. +* \param[in] addr The destination address on the device. +* \param[in] writeData The data to write. +* \param[in] count The number of bytes to write to the device. +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +* +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RegistersByteWrite(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const uint32_t addr, + const uint8_t writeData[], + const uint32_t count); + +/** +* \brief Read from a contiguous range of device registers into memory. +* +* \dep_begin +* \dep{device->halInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure. +* \param[in,out] spiCache Optional pointer to a spiCache structure if caching writes, the cache will be written out prior to performing the read. +* If there is no caching passing NULL is valid. +* \param[in] addr The 32bit source address of the first source register on the device from which to read. +* \param[in, out] readData The destination to which to write the data. +* \param[in] mask After it is read the Nth element of readData is OR'd with Nth element of mask. Pass NULL for no masking. +* \param[in] count The number of bytes to read. +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +* +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RegistersByteRead(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const uint32_t addr, + uint8_t readData[], + const uint8_t mask[], + const uint32_t count); + +/** +* \brief Read from a contiguous range of device registers into memory. +* +* This function can only access registers that require a 32-bit read/writes. Furthermore both addr and count +* arguments must be divisible by 4. If you don't know whether a memory region is 32bOnly or not use +* Registers32Read() which will invoke this function if required. +* +* Calling flushes the spiCache before transaction to make sure the intended order of SPI transactions isn't +* changed. +* +* \dep_begin +* \dep{device->halInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure. +* \param[in,out] spiCache Optional pointer to a spiCache structure if caching writes, the cache will be written +* out prior to performing the read. If there is no caching passing NULL is valid. +* \param[in] addr The 32bit source address on the device. Must be divisible by 4. +* \param[in,out] readData The destination buffer. Each four bytes read from the device is treated as a single 32bit +* integer and device to host endianess conversion is applied if required. +* \param[in] count The number of *bytes* to read. Must be divisible by 4. All source addresses +* from addr to addr + count - 1 must be in a 32bOnly region. +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +* +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Registers32bOnlyRead(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const uint32_t addr, + uint8_t readData[], + const uint32_t count); + +/** +* \brief Writes to a contiguous range of device registers into memory. +* +* This function is used to access only registers that *require* a 32-bit SPI transaction. This function +* flushes the spiCache before transaction to make sure the intended order of SPI transactions isn't changed. +* +* \dep_begin +* \dep{device->halInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure. +* \param[in,out] spiCache Optional pointer to a spiCache structure if caching writes, the cache will be written out prior to performing the read. +* If there is no caching passing NULL is valid. +* \param[in] addr The 32bit address of the first source register on the device to which to write. +* \param[in] writeData The data to write. Each four elements is treated as a single 32bit integer and host to +* device endianess conversion is applied if required. +* \param[in] count The number of bytes to write. Must be divisible by 4. +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +* +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Registers32bOnlyWrite(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const uint32_t addr, + const uint8_t writeData[], + const uint32_t count); + +/** +* \brief Identical to adrv904x_Registers32bOnlyRead but allows the caller to specify if the read data should be treated +* as raw byte oriented data or as 32bit integers. This influences endianess fix-ups performed. +* +* As indicated by the lack of 'adi_' prefix this function may be called only from other API functions and not from +* applications. It's interface may change without notice. +* +* \dep_begin +* \dep{device->halInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure. +* \param[in,out] spiCache As per adrv904x_Registers32bOnlyRead. +* \param[in] addr As per adrv904x_Registers32bOnlyRead. +* \param[in,out] readData As per adrv904x_Registers32bOnlyRead. +* \param[in] numBytesToRead As per adrv904x_Registers32bOnlyRead. +* \param[in] isByteData If set the data read is treated as 8bit integers otherwise is treated as 32bit integers. +* 32bit integer data is corrected to account for any difference in host and device endianess as it is read. +* 8bit data requires no correction and is placed in memory in the same order as it is in the device's memory. +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +* +*/ +ADI_API adi_adrv904x_ErrAction_e adrv904x_Registers32bOnlyRead_vEndian(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const uint32_t addr, + uint8_t readData[], + const uint32_t numBytesToRead, + const uint8_t isByteData); + +#endif diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_hal_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_hal_types.h new file mode 100644 index 00000000000..b40a5790ed3 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_hal_types.h @@ -0,0 +1,71 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adi_adrv904x_hal_types.h + * \brief Contains prototypes and macro definitions for ADI HAL wrapper + * functions implemented in adi_adrv904x_hal.c + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADI_ADRV904X_HAL_TYPES_H_ +#define _ADI_ADRV904X_HAL_TYPES_H_ + +#include "adi_platform.h" + +/* TODO: Any user changeable #defines need to be moved to adi_adrv904x_user.h */ +#define HAL_TIMEOUT_DEFAULT 100 /* 100ms */ +#define HAL_TIMEOUT_NONE 0x0 /* Non-blocking */ +#define HAL_TIMEOUT_INFINITE 0xFFFFFFFF /* Blocking */ +#define HAL_TIMEOUT_MULT 2 /* HAL timeout worse-case factor */ + +#define MAXSPILOGMESSAGE 64 + +#define ADRV904X_DIRECT_SPI_BYTES 0x3 /* Number of bytes required to use non HW_RMW direct */ +#define ADRV904X_PAGING_SPI_BYTES 0x1B /* Number of bytes required to use non HW_RMW indirect: 9 Direct SPI writes (assumed entire word written, ie mask = 0xFFFFFFFF) */ +#define ADRV904X_SPI_WRITE_POLARITY 0x00 /* Write bit polarity for ADRV904X */ + +#define ADI_ADRV904X_SPI_READ_BYTE 0 +#define ADI_ADRV904X_SPI_READ_HALFWORD 1 +#define ADI_ADRV904X_SPI_READ_WORD 2 + + +/** + * \brief Structure used to track the SPI cache + */ +typedef struct adi_adrv904x_SpiCache +{ + uint8_t data[ADI_HAL_SPI_FIFO_SIZE]; /*!< SPI data buffer. Should not be written to manually. Data gets updated through calls to adi_adrv904x_Register(s)Write */ + uint32_t count; /*!< The number of bytes filled with data buffer. Should not be written to manually. Gets updated through calls to adi_adrv904x_Register(s)Write */ + uint32_t lastSpiAddr; /*!< Address that last byte, at (count - 1) index, in buffer is written to. Should not be written to manually. Gets updated through calls to adi_adrv904x_Register(s)Write */ + uint8_t spiStreamingEn; /*!< Flag used to signal SPI streaming is enabled (1) or disabled (0). Can be changed anytime to switch between streaming & non-streaming. */ +} adi_adrv904x_SpiCache_t; + +/** + * \brief Structure to define a register map with start/end addresses + * + * Describes a memory region consisting of N separate areas. Each area has an identical size and the starting address + * of each area is constant number of bytes (strideValue) from the starting address of the preceeding area. + * + * Visually: + * + * +----------------------------------------------------------------------------------------------------------------------------+ + * | start addr + | ... | end addr + | ~ | start addr | ... | end addr | ~ | start addr + | ... | end addr + | + * | stride * 0 | ... | stride * 0 | ~ | + stride * 1 | ... | +stride * 1 | ~ | stride * | ... | stride * | + * | | | | | | | | | (numInstances - 1) | ... | (numInstances - 1) | + * +----------------------------------------------------------------------------------------------------------------------------+ + * |< ------------- strideValue -------->| + */ +typedef struct adi_adrv904x_RegisterMap +{ + uint32_t startAddr; /* 32 bit Starting address of the register map */ + uint32_t endAddr; /* 32 bit Ending address of the register map */ + uint32_t numOfInstances; /* Num of instances for this register map */ + uint32_t strideValue; /* In bytes. This is the offset between start addresses of consecutive instances, it's a 'don't care' when numOfInstances = 1*/ +} adi_adrv904x_RegisterMap_t; + +#endif diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_lo_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_lo_types.h new file mode 100644 index 00000000000..b035caa590d --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_lo_types.h @@ -0,0 +1,51 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adi_adrv904x_lo_types.h + * + * \brief Contains ADRV904X LO data structures. + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADRV904X_LO_TYPES_H__ +#define __ADRV904X_LO_TYPES_H__ + +#include "adi_adrv904x_platform_pack.h" + +/** + * \brief Enum of LO selections + */ +typedef enum adi_adrv904x_LoName +{ + ADI_ADRV904X_LO0 = 0, /*!< Selects LO0 for Rx and Tx */ + ADI_ADRV904X_LO1, /*!< Selects LO1 for Rx and Tx */ +} adi_adrv904x_LoName_e; + +/** +* \brief Enum of LO Options selections. Feature is not implemented. Use 0 as default. Users are responsible for changing Band NCOs if changing RF LO. +*/ +typedef enum adi_adrv904x_LoOption +{ + ADI_ADRV904X_NCO_NO_OPTION_SELECTED = 0x00, /*!< NCO auto-update disabled - Don't re-program NCOs when programming LO */ + ADI_ADRV904X_NCO_AUTO_UPDATE_DISABLE = 0x01 /*!< Selects the NCO auto update disable */ +} adi_adrv904x_LoOption_e; + +/** + * \brief Enum of PLL selections + */ +typedef enum adi_adrv904x_Pll +{ + ADI_ADRV904X_RF0_PLL = 0, /*!< Selects RF0 PLL */ + ADI_ADRV904X_RF1_PLL, /*!< Selects RF1 PLL */ + ADI_ADRV904X_CLK_PLL, /*!< Selects Clk PLL */ + ADI_ADRV904X_SERDES_PLL /*!< Selects Serdes PLL */ +} adi_adrv904x_Pll_e; + +#endif /* __ADRV904X_LO_TYPES_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_platform_pack.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_platform_pack.h new file mode 100644 index 00000000000..04be8dfc1ef --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_platform_pack.h @@ -0,0 +1,61 @@ +/** + * \file adi_adrv904x_platform_pack.h + * + * \brief Contains platform pack define + * + * \details Contains platform pack define + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADI_ADRV904X_PLATFORM_PACK_H__ +#define __ADI_ADRV904X_PLATFORM_PACK_H__ + +#ifndef ADI_ADRV904X_FW +#include "adi_adrv904x_user.h" +#endif + + +#if (!defined(ADI_ADRV904X_PACK_START) || !defined(ADI_ADRV904X_PACK_FINISH)) +#ifdef __GNUC__ +#define ADI_ADRV904X_PACK_START _Pragma("pack(1)") +#define ADI_ADRV904X_PACK_FINISH _Pragma("pack()") +#elif defined __ICCARM__ +#define ADI_ADRV904X_PACK_START _Pragma("pack(1)") +#define ADI_ADRV904X_PACK_FINISH _Pragma("pack()") +#elif defined _MSC_VER +#define ADI_ADRV904X_PACK_START __pragma(pack(1)) +#define ADI_ADRV904X_PACK_FINISH __pragma(pack()) +#else +#error ( "Define the ADI_ADRV904X_PACK_START and ADI_ADRV904X_PACK_FINISH macros for your compiler." ) +#endif +#endif + +#ifndef ADI_ADRV904X_PACKED +#if defined __ICCARM__ +/* + * Error[Pm154]: in the definition of a function-like macro, each instance of a + * parameter shall be enclosed in parenthesis (MISRA C 2004 rule 19.10) + * + * ADI_ADRV904X_PACKED() is a macro used for structure packing. The parameter + * for this macro must be a structure definition, which cannot be enclosed in + * parenthesis (syntactically invalid). + */ +#pragma diag_suppress=Pm154 +#define ADI_ADRV904X_PACKED(d) _Pragma("pack(1)") d _Pragma("pack()") +#pragma diag_default=Pm154 +#else +#define ADI_ADRV904X_PACKED(d) ADI_ADRV904X_PACK_START d ADI_ADRV904X_PACK_FINISH +#endif +#endif + +#endif /* __ADI_ADRV904X_PLATFORM_PACK_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_radio_seq_image_format_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_radio_seq_image_format_types.h new file mode 100644 index 00000000000..1f73a5f96e1 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_radio_seq_image_format_types.h @@ -0,0 +1,116 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adi_adrv904x_radio_seq_image_format_types.h + * + * \brief Contains ADRV904X Radio Sequencer Download File data structures. + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADI_ADRV904X_RADIO_SEQ_IMAGE_FORMAT_TYPES_H__ +#define __ADI_ADRV904X_RADIO_SEQ_IMAGE_FORMAT_TYPES_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_version_types.h" + +/** + * This header defines the Radio Sequencer Image header structure. + * The data structures are broken up into several portions since some + * some of the data is not exposed to the customer and some portions are. + * The final image format is defined as: + * + * uint32_t magicNumber // Unique tag to define file type + * adrv904x_Version_t revision // File revision + * uint32_t numberPatterns // total number of patterns in sequenceLookupTable[] (max 2048 ) + * uint32_t sequenceSize // Number of uint32_t in the sequenceInstructions[] (each instructions is 4 uint32_t) + * uint32_t seqStartAddr // Start addr of the seq memory region (0x4d300000) + * uint32_t lookupCrc // CRC sequenceLookupTable[] + * uint32_t SequenceCrc // CRC sequenceInstructions[] + * uint32_t fileImageCrc // CRC of the entire file image + * uint8_t xbarSettings[256] // cross bar settings (each byte is encoded as: xbar_ctrl_sel[7:4], xbar_sequencer_sel[3:0]) + * uint32_t sequenceLookupTable[NumberPatterns] // Start addr for each seq + * uint32_t sequenceInstructions[sequenceSize*4] // max 32K bytes. + */ + +/** + * \brief Definition of the Radio Sequencer Magic file number + */ +#define ADI_ADRV904X_RADIO_SEQ_MAGIC_NUMBER (0xAD1000DBu) + +/** + * \brief Definition of the Radio Sequencer Revision + */ +#define ADI_ADRV904X_RADIO_SEQ_REVISION (0x01u) + +/** + * \brief Size of the Xbar settings array + */ +#define ADI_ADRV904X_RADIO_SEQ_XBAR_SIZE (256u) + +/** + * \brief Max size of the lookup table + */ +#define ADI_ADRV904X_RADIO_SEQ_LOOKUP_TAB_MAX_SIZE (2048u) + +/** + * \brief Max size of the pattern image array + */ +#define ADI_ADRV904X_RADIO_SEQ_IMAGE_MAX_SIZE (32768u) + +/** + * \brief Memory region of the pattern image + */ +#define ADI_ADRV904X_RADIO_SEQ_IMAGE_MEM_REGION_START (0x4d300000U) + +/** + * \brief Invalid/Disabled setting (xbar value = 255 i.e Sequencer 15 Signal 15) for Radio Sequencer Crossbar + */ +#define ADI_ADRV904X_RADIO_SEQ_XBAR_INVALID (255U) + + +/** + * \brief Data structure defining the Radio Sequencer image header + */ +ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_RadioSeqImageHeader +{ + uint32_t magicNumber; /*!< Unique tag to define file type */ + adi_adrv904x_Version_t revision; /*!< Radio Seq image revision */ + uint32_t numberPatterns; /*!< Number of patterns defined in the sequence image */ + uint32_t sequenceSize; /*!< Number of uint32_t in the sequence (each instructions is 4 uint32_t) */ + uint32_t seqStartAddr; /*!< Start addr of the seq memory region */ + uint32_t lookupCrc; /*!< Lookup table CRC */ + uint32_t sequenceCrc; /*!< Sequence Image CRC */ + uint32_t fileImageCrc; /*!< CRC of entire file iamge */ +} adi_adrv904x_RadioSeqImageHeader_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Max size of the radio sequencer image file + */ +#define ADI_ADRV904X_RADIO_SEQ_IMAGE_FILE_MAX_SIZE (ADI_ADRV904X_RADIO_SEQ_IMAGE_MAX_SIZE + (ADI_ADRV904X_RADIO_SEQ_LOOKUP_TAB_MAX_SIZE * sizeof(uint32_t)) + ADI_ADRV904X_RADIO_SEQ_XBAR_SIZE + sizeof(adi_adrv904x_RadioSeqImageHeader_t)) + +/** + * \brief Data structure defining the Radio Sequencer Crossbar Settings + */ +typedef uint8_t* adi_adrv904x_RadioSeqXbarSettingsPtr_t; + +/** + * \brief Data structure defining the Radio Sequencer Start Address Lookup Table + */ +typedef uint32_t* adi_adrv904x_RadioSeqLookupTablePtr_t; + +/** + * \brief Data structure defining the Radio Sequencer Pattern Image + */ +typedef uint32_t* adi_adrv904x_RadioSeqPatternImagePtr_t; + +#endif /* __ADI_ADRV904X_RADIO_SEQ_IMAGE_FORMAT_TYPES_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_radioctrl.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_radioctrl.h new file mode 100644 index 00000000000..d3eee3710f7 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_radioctrl.h @@ -0,0 +1,1899 @@ +/** +* Copyright 2015 - 2022 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_radioctrl.h +* \brief Contains ADRV904X function prototypes for +* adi_adrv904x_radioctrl.c +* +* ADRV904X API Version: 2.10.0.4 +*/ + + +#ifndef _ADI_ADRV904X_RADIOCTRL_H_ +#define _ADI_ADRV904X_RADIOCTRL_H_ + +#include "adi_adrv904x_radioctrl_types.h" +#include "adi_adrv904x_error.h" + +/** +* \brief This function is used during the init sequence in order to load the stream +* processor binary images from the stream_image.bin file. The stream_image.bin +* file has a pre-defined structure this function relies on and so the user +* must load the stream_image.bin starting from the beginning. +* The user may load the file in chunks as low as 100 bytes by iterating through +* the entire stream_image.bin file and updating byteOffset on each iteration. +* Once the final chunk of stream_image.bin has been processed the function +* sets the appropriate status flag in device->devStateInfo. +* +* \pre This function is called after adi_adrv904x_Initialize before FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] byteOffset Offset (starting from 0) of where the current binary chunk is located +* in the stream_image.bin file. +* \param[in] binary Byte array containing the current chunk of stream binary file to process +* \param[in] byteCount The number of bytes in the binary parameter +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_StreamImageWrite(adi_adrv904x_Device_t* const device, + uint32_t byteOffset, + const uint8_t binary[], + uint32_t byteCount); + +/** +* \brief Enables or disables all Rx, ORx and Tx channels that are in SPI control mode (see +* adi_adrv904x_RadioCtrlCfgSet. Has no effect on channels that are not set to SPI control mode. +* Furthermore channels that are not initialized will not be enabled. +* +* For use cases where pin mode is not required, this function can be used to enable/disable the +* Rx/Orx/Tx signal paths. This function should be called after initialization and loading the +* stream processor. +* +* orx/rx/tx/ChannelMask Parameters: +* The bits set in this bit-mask indicate the orx/rx/tx channels affected by this call respectively. +* Channels whose bit are not set to 1 in this parameter will not be affected by this function call. +* Whether an affected channel is to be enabled or disabled is indicated by the channel's bit in +* orx/rx/txChannelEnable parameters. The first channel is indicated by the least significant bit, +* the second channel by the next least significant and so on. It is an error to set a bit corresponding +* to a non-existent channel. +* +* orx/rx/tx/ChannelEnable Parameters: +* A bit mask indicating if the channel is to be enabled or disabled. +* Bits relate to channels in the same manner as the orx/rx/txChannelMask parameters. +* If the bit for a channel in the orx/rx/txChannelMask is not set then the channel's bit +* in these parameters has no effect. + +* \pre This function should be called after initialization and loading the stream +* processor. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] orxChannelMask Mask to select Orx channels to be affected with this function call +* \param[in] orxChannelEnable Mask to enable/disable selected Orx channels +* \param[in] rxChannelMask Mask to select Rx channels to be affected with this function call +* \param[in] rxChannelEnable Mask to enable/disable selected Rx channels +* \param[in] txChannelMask Mask to select Tx channels to be affected with this function call +* \param[in] txChannelEnable Mask to enable/disable selected Tx channels +* +* The following table lists the rxChannelMask bits and the corresponding channels +* that are enabled/disabled in SPI mode +* +*|orxChannelMask | Channel Selected/Unselected | +*|:----------------|:----------------------------------------:| +*| bit[0-7] | Reserved | +*| bit[8] | 1 = ORx0 Selected, 0 = ORx0 Unselected | +*| bit[9] | 1 = ORx1 Selected, 0 = ORx1 Unselected | +*| bit[10-31] | Reserved | +* +*|orxChannelEnable | Channel Enable/Disable | +*|:----------------|:----------------------------------------:| +*| bit[0-7] | Reserved | +*| bit[8] | 1 = ORx0 Enable, 0 = ORx0 Disable | +*| bit[9] | 1 = ORx1 Enable, 0 = ORx1 Disable | +*| bit[10-31] | Reserved | +* +*| rxChannelMask | Channel Selected/Unselected | +*|:----------------|:----------------------------------------:| +*| bit[0] | 1 = Rx0 Selected, 0 = Rx0 Unselected | +*| bit[1] | 1 = Rx1 Selected, 0 = Rx1 Unselected | +*| bit[2] | 1 = Rx2 Selected, 0 = Rx2 Unselected | +*| bit[3] | 1 = Rx3 Selected, 0 = Rx3 Unselected | +*| bit[4] | 1 = Rx4 Selected, 0 = Rx4 Unselected | +*| bit[5] | 1 = Rx5 Selected, 0 = Rx5 Unselected | +*| bit[6] | 1 = Rx6 Selected, 0 = Rx6 Unselected | +*| bit[7] | 1 = Rx7 Selected, 0 = Rx7 Unselected | +*| bit[8-31] | Reserved | + +*| rxChannelEnable | Channel Enable/Disable | +*|:----------------|:----------------------------------------:| +*| bit[0] | 1 = Rx0 Enable, 0 = Rx0 Disable | +*| bit[1] | 1 = Rx1 Enable, 0 = Rx1 Disable | +*| bit[2] | 1 = Rx2 Enable, 0 = Rx2 Disable | +*| bit[3] | 1 = Rx3 Enable, 0 = Rx3 Disable | +*| bit[4] | 1 = Rx4 Enable, 0 = Rx4 Disable | +*| bit[5] | 1 = Rx5 Enable, 0 = Rx5 Disable | +*| bit[6] | 1 = Rx6 Enable, 0 = Rx6 Disable | +*| bit[7] | 1 = Rx7 Enable, 0 = Rx7 Disable | +*| bit[8-31] | Reserved | +* +*| txChannelMask | Channel Selected/Unselected | +*|:----------------|:----------------------------------------:| +*| bit[0] | 1 = Tx0 Selected, 0 = Tx0 Unselected | +*| bit[1] | 1 = Tx1 Selected, 0 = Tx1 Unselected | +*| bit[2] | 1 = Tx2 Selected, 0 = Tx2 Unselected | +*| bit[3] | 1 = Tx3 Selected, 0 = Tx3 Unselected | +*| bit[4] | 1 = Tx4 Selected, 0 = Tx4 Unselected | +*| bit[5] | 1 = Tx5 Selected, 0 = Tx5 Unselected | +*| bit[6] | 1 = Tx6 Selected, 0 = Tx6 Unselected | +*| bit[7] | 1 = Tx7 Selected, 0 = Tx7 Unselected | +*| bit[8-31] | Reserved | + +*| txChannelEnable | Channel Enable/Disable | +*|:----------------|:----------------------------------------:| +*| bit[0] | 1 = Tx0 Enable, 0 = Tx0 Disable | +*| bit[1] | 1 = Tx1 Enable, 0 = Tx1 Disable | +*| bit[2] | 1 = Tx2 Enable, 0 = Tx2 Disable | +*| bit[3] | 1 = Tx3 Enable, 0 = Tx3 Disable | +*| bit[4] | 1 = Tx4 Enable, 0 = Tx4 Disable | +*| bit[5] | 1 = Tx5 Enable, 0 = Tx5 Disable | +*| bit[6] | 1 = Tx6 Enable, 0 = Tx6 Disable | +*| bit[7] | 1 = Tx7 Enable, 0 = Tx7 Disable | +*| bit[8-31] | Reserved | +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxTxEnableSet(adi_adrv904x_Device_t* const device, + const uint32_t orxChannelMask, + const uint32_t orxChannelEnable, + const uint32_t rxChannelMask, + const uint32_t rxChannelEnable, + const uint32_t txChannelMask, + const uint32_t txChannelEnable); +/** + * \brief Retrieve the Tx, Rx, and ORx SPI mode bit masks enabled/disabled status. + * + * This function retrieves SPI mode enabling status of Rx/Tx/ORx. + * + * Please see adi_adrv904x_RxTxEnableSet() for bit-to-channel assignments of + * orxChannelMask/rxChannelMask/txChannelMask parameters. + * \pre This function may be called after the device has been fully initialized + * any time during run-time operation, but only after the CPU and GPIO + * have been configured + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X data structure + * \param[out] orxChannelMask Pointer to location of bit mask into which ORx SPI-mode enabled/disabled status will be written. + * \param[out] rxChannelMask Pointer to location of bit mask into which Rx SPI-mode enabled/disabled status will be written. + * \param[out] txChannelMask Pointer to location of bit mask into which Tx SPI-mode enabled/disabled status will be written. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxTxEnableGet(adi_adrv904x_Device_t* const device, + uint32_t* const orxChannelMask, + uint32_t* const rxChannelMask, + uint32_t* const txChannelMask); + +/** + * \brief Retrieves the current effective channel enabled/disabled state regardless of whether the channel is + * under SPI-mode or pin-mode control. + * + * The state of Rx/Tx/ORx channel 0 is written to the least significant bit in the corresponding argument. The + * state of channel 1 to the next most significant bit and so on. A bit value of 1 indicates the channel is + * enabled. Bits outside the range of the number of existing channels are set to 0. + * + * Compare to adi_adrv904x_RxTxEnableGet which retrieve the Tx, Rx, and ORx SPI mode bit masks enabled/disabled + * status. + * + * \pre This function may be called after the device has been fully initialized + * any time during run-time operation, but only after the CPU and GPIO + * have been configured + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X data structure + * \param[out] orxChannelMask the current state of the ORx channels + * \param[out] rxChannelMask the current state of the Rx channels. + * \param[out] txChannelMask the current state of the Tx channels. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ChannelEnableGet(adi_adrv904x_Device_t* const device, + uint32_t* const orxChannelMask, + uint32_t* const rxChannelMask, + uint32_t* const txChannelMask); + +/** + * \brief This function sets up the mode (Pin Mode/Non-Pin Mode) through which the signal path is controlled + * + * The ADRV904X device defaults to Non-pin mode on power up. This function is used to reconfigure + * the signal path control mode of Rx, ORx, Tx signal chains. Non-Pin mode signal chain control + * can be accomplished through adi_adrv904x_RxTxEnableSet() API. The pin mode signal chain control is + * accomplished through input pins to ADRV904X device. + * + * In Pin mode, the Tx and Rx signal chains are controlled using dedicated pins TRXA_CTRL, + * TRXB_CTRL, ... TRXH_CTRL. Use adi_adrv904x_RadioCtrlTxRxEnCfgSet to configure which pins control which + * channels. + * + * \pre This function may be called after the device has been fully initialized + * any time during run-time operation, but only after the CPU and GPIO + * have been configured + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X data structure + * \param[in] radioCtrlCfg is comprised of radio control mode configurations for Rx, ORx and Tx channels + * + * In order to skip configuration for a specific signal chain, set the respective enable mode to invalid. Eg: To skip + * Tx configuration, set radioCtrlCfg->txRadioCtrlModeCfg.txEnableMode to ADI_ADRV904X_TX_EN_INVALID_MODE. Similarly + * to skip Rx configuration set radioCtrlCfg->rxRadioCtrlModeCfg.rxEnableMode to ADI_ADRV904X_RX_EN_INVALID_MODE and + * to skip ORx configuration set radioCtrlCfg->orxRadioCtrlModeCfg.orxEnableMode to ADI_ADRV904X_ORX_EN_INVALID_MODE. + * +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlCfgSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_RadioCtrlModeCfg_t* const radioCtrlCfg); + +/** + * \brief This function controls enablement of Tx & Rx channels and antenna by the eight TRX_CTRL pins: TRXA_CTRL - + * TRXH_CTRL. configurations are only valid for channels in pin-mode; for channels in SPI-mode they are ignored. + * + * The pinIndex and configSel parameters select the desired pin and config member to write. If a field within the + * adi_adrv904x_RadioCtrlTxRxEnCfg_t is not indicated by a bit in configSel parameter that field ignored. Any + * TRX_CTRL pin that is not indicated by a bit in the pinIndex also remains unaffected by the call. + * + * The txRxEnCfg parameter holds an array for Tx/Rx channel enablement and Tx/Rx antenna enablement. + * Each array has eight bytes corresponding to the eight TRX_CTRL pins. Element 0 of each array corresponds to + * TRXA_CTRL, element 1 corresponds to TRXB_CTRL pin. Within each byte bitN corresponds to channel N where bit0 + * is the least-significant bit. + * + * Example: + * txRxEnCfg->txEnMapping[0] = 0x0F --> then asserting TRXA_CTRL Pin will enable Tx Channels 0-3. + * NOTE: the configSel param must also have the TX_ENABLE bit set and the pinSel param must have PIN0 bit + * set for TRX*A* set. + * + * txRxEnCfg->rxAltMapping[3] = 0xF0 --> then asserting TRXD_CTRL Pin will power up the data path for antenna + * calibrations for Rx Channels 4-7 + * NOTE: the configSel param must also have the RX_ALT_ENABLE bit set and the pinSel param must have bit3 for TRX*D* set. + * + * Each pin can be used to control any number of Tx or Rx channels. A single channel can also + * be controlled by multiple pins. Where a single channel is configured to be controlled by multiple pins the channel + * is enable is any one of the pins is asserted. + * + * This function is used during the Post-MCS bring up phase. It can also be called during runtime for calibration + * control. + * + * \pre This function may be called after the device has been fully initialized + * any time during run-time operation, but only after the CPU and GPIO + * have been configured + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X data structure + * \param[in] txRxEnCfg is comprised of radio control TXRX Pin configurations for Rx and Tx channels + * \param[in] pinIndex is a bitmask built up of or'd adi_adrv904x_TxRxEnPin_e values + * \param[in] configSel is a bitmask built up of or'd adi_adrv904x_TxRxEnCfg_e values + * +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlTxRxEnCfgSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RadioCtrlTxRxEnCfg_t* const txRxEnCfg, + uint8_t pinIndex, + uint8_t configSel); + +/** + * \brief This function reads the Tx & Rx GPIO configuration bitfields and stores the values in the blank + * structure passed in. + * + * \pre This function may be called after the device has been fully initialized + * any time during run-time operation, but only after the CPU and GPIO + * have been configured + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X data structure + * \param[out] txRxEnCfg blank structure to hold the current TXRX Pin settings + * +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlTxRxEnCfgGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_RadioCtrlTxRxEnCfg_t* const txRxEnCfg); + +/** + * \brief Reads back the Tx, Rx, and ORx radio control mode configuration + * + * This function retrieves Pin mode / Non pin mode configuration of + * radio ctrl modes for Rx/Tx/ORx signal chains. For Rx, Tx, and ORx signal chains, + * a SPI or Pin mode is returned. + * + * \pre This function may be called after the device has been fully initialized + * any time during run-time operation, but only after the CPU and GPIO + * have been configured + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X data structure + * \param[in] rxChannel Receiver channel for which mode config readback is requested (valid channels Rx0-Rx7, ORx0-ORx1) + * \param[in] txChannel Transmitter channel for which mode config readback is requested (valid channels Tx0-Tx7) + * \param[out] radioCtrlCfg Pointer to radio ctrl config data structure which will be updated with read back + * values for Rx,Tx and ORx signal chain control configs. + * +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_RadioCtrlModeCfg_t* const radioCtrlCfg); + +/** +* \brief Sets the RF LO settings for the desired LO +* +* \pre This function can be called after the CPU has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] loConfig Pointer to the LO config settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_LoFrequencySet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_LoConfig_t* const loConfig); + + +/** +* \brief Gets a Local Oscillator (LO) frequency (RF carrier frequency). +* +* This function is used to get a LO current frequency. The loName field in adi_adrv904x_LoConfigReadback_t needs to be filled in with desired +* enumerate value LO0, LO1 in adi_adrv904x_LoName_e. +* +* This function reads back the maximum LO frequency(of all channels using that LO) after leaf dividers. +* \pre This function can be used after the device has been initialized, firmware loaded and the LO configured. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in,out] loConfig Pointer to the LO config read back settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_LoFrequencyGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_LoConfigReadback_t* const loConfig); + +/** +* \brief API to assign Tx and Rx Channels to PLL's during runtime. +* This API is called to configure PLL assigments for Tx and Rx channels. +* +* \pre This API function can be called after the CPU has been initialized and MCS done. +* \post After the API function is called, strictly need to re-program the PLL's. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] rf0MuxTx0_3 If set to 1 East Tx channels (Tx0-3) are connected to PLL0 (East PLL). If set to 0 Tx0-3 are connected to PLL1 (West PLL). +* \param[in] rf0MuxTx4_7 If set to 1 West Tx channels (Tx4-7) are connected to PLL0 (East PLL). If set to 0 Tx4-7 are connected to PLL1 (West PLL). +* \param[in] rf0MuxRx0_3 If set to 1 East Rx channels (Rx0-3) are connected to PLL0 (East PLL). If set to 0 Rx0-3 are connected to PLL1 (West PLL). +* \param[in] rf0MuxRx4_7 If set to 1 West Rx channels (Rx4-7) are connected to PLL0 (East PLL). If set to 0 Rx4-7 are connected to PLL1 (West PLL). +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfgPllToChanCtrl(adi_adrv904x_Device_t* const device, + uint8_t rf0MuxTx0_3, + uint8_t rf0MuxTx4_7, + uint8_t rf0MuxRx0_3, + uint8_t rf0MuxRx4_7); + +/** +* \brief Sets the RF LO Loop filter parameters for the desired LO. +* This command only updates the loop config parameters in the internal table. +* adi_adrv904x_LoFrequencySet function needs to be called to make the new loop +* configuration effective. +* +* \pre This function can be called after the CPU has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] loName The RF LO selected +* \param[in] loLoopFilterConfig Pointer to the LO config settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_LoLoopFilterSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_LoName_e loName, + const adi_adrv904x_LoLoopFilterCfg_t* const loLoopFilterConfig); + +/** +* \brief Gets the RF LO Loop filter parameters for the desired LO +* +* \pre This function can be called after the CPU has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] loName The RF LO selected +* \param[in,out] loLoopFilterConfig Pointer to the LO config settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_LoLoopFilterGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_LoName_e loName, + adi_adrv904x_LoLoopFilterCfg_t* const loLoopFilterConfig); + +/** +* \brief Gets Local Oscillators (LO) lock status. +* +* This function is used to get all plls lock status. +* +* pllLockStatus bit 0 = CLK PLL Lock status +* pllLockStatus bit 1 = RF0 PLL Lock status +* pllLockStatus bit 2 = RF1 PLL status +* pllLockStatus bit 3 = Serdes PLL Lock Status +* +* A bit value of 1 indicates the corresponding pll is locked +* A bit value of 0 indicates the corresponding pll is unlocked. +* +* \pre This function can be used after the device has been initialized, firmware loaded and the LO configured. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] pllLockStatus Pointer to the pll lock status read back +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_PllStatusGet(adi_adrv904x_Device_t* const device, + uint32_t* const pllLockStatus); + +/** +* \brief Gets all TX and RX LO names and frequencies. +* +* \pre This function can be used after the device has been initialized, firmware loaded and the LO configured. +* It returns the LO frequencies of the RF channels after leaf dividers. +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] rxTxLoFreq Pointer to the structure contain all RX TX LO names and frequencies. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxTxLoFreqGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_RxTxLoFreqReadback_t* const rxTxLoFreq); + +/** +* \brief Get temperature information for the device +* +* This function is used to get temperature information for the device. +* +* \pre This function can be used after the device has been initialized and firmware loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] avgMask Bitmask of adi_adrv904x_DevTempSensorMask_e values indicating which temperature sensor +* readings should be averaged in the tempDegreesCelsiusAvg member of the deviceTemperature structure. +* If 0 is provided, -274 will be returned for the averaged value. +* \param[in,out] deviceTemperature Pointer to structure in which device temperature data should be placed +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TemperatureGet(adi_adrv904x_Device_t* const device, + const uint16_t avgMask, + adi_adrv904x_DevTempData_t* const deviceTemperature); + +/** +* \brief Get enabled temperature sensor information for the device +* +* This function is used to get enabled temperature sensor information for the device. +* +* \pre This function can be used after the device has been initialized and firmware loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] tempEnData Pointer to uint16 in which device enabled temperature sensor data should be placed +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TemperatureEnableGet(adi_adrv904x_Device_t* const device, + uint16_t* const tempEnData); + + +/** +* \brief Set enabled temperature sensor information for the device +* +* This function is used to set enabled temperature sensor information for the device. +* +* \pre This function can be used after the device has been initialized and firmware loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in,out] tempEnData Pointer to uint16 in which device enabled temperature sensor data are set to +* in the event a temp sensor is unavailable (i.e. LDO is off for a particular PLL temp sensor) +* the returned value contains the sensors that are enabled. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TemperatureEnableSet(adi_adrv904x_Device_t* const device, + uint16_t* const tempEnData); + + +/** +* \brief This function associates a GPIO pin with stream processor GP inputs and enables stream trigger +* functionality if a valid GPIO(GPIO0-GPIO23) is assigned to the streamGpInput pins. +* +* There are 24 GPIO inputs available to trigger streams. These GPIO pins can +* be mapped to one of GPIOs[0:23]. +* GPIO input 0 must map to GPIO 0, GPIO input 1 must map to GPIO 1,,, etc.... +* +* To unmap a GPIO association with a stream GP input, please set the GPIO input +* to ADI_ADRV904X_GPIO_INVALID. +* +* \pre This function requires CPU and Stream binaries to be loaded +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] streamGpioPinCfg Pointer to the structure holding GPIO pin to stream GP input mappings (Input) +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_StreamGpioConfigSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_StreamGpioPinCfg_t* const streamGpioPinCfg); + +/** +* \brief This function retrieves the current Tx-ORx mapping control GPIO pins +* +* This function retrieves the GPIOs assigned for Tx-ORx mapping stream triggering +* +* \pre This function can be called anytime after ADRV904X device initialization +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] streamGpioPinCfg Pointer to the structure which will be updated with the +* active GPIO pin to stream GP input mappings (Output) +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_StreamGpioConfigGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_StreamGpioPinCfg_t* const streamGpioPinCfg); + +/** +* \brief This function calculates the ORx NCO frequency shifts, given the Tx Synthesis Bandwidth limits +* +* \pre This function can be called anytime after ADRV904X device initialization +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] orxChannel The ORx channel for which the NCO frequency shifts are to be calculated +* \param[in] txSynthesisBwLower_kHz Lower limit of TX Synthesis Bandwidth +* \param[in] txSynthesisBwUpper_kHz Upper limit of TX Synthesis Bandwidth +* \param[out] ncoShiftFreqAdc_kHz Computed ORx ADC NCO frequency shift +* \param[out] ncoShiftFreqDatapath_kHz Computed ORx Datapath NCO frequency shift +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_OrxNcoFreqCalculate(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e orxChannel, + const uint32_t txSynthesisBwLower_kHz, + const uint32_t txSynthesisBwUpper_kHz, + int32_t* const ncoShiftFreqAdc_kHz, + int32_t* const ncoShiftFreqDatapath_kHz); + +/** +* \brief Configures and allocates selected GPIO pins that will trigger a Stream that handle +* Tx to Orx Mapping changes at runtime. +* +* This function will handle GPIO setup (if appropriate) and store the selected feature mode +* in the device data structure for use at runtime. +* +* \pre This function should not be called outside the initialization process of adi_adrv904x_PostMcsInit and is not called directly by the user. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingInit(adi_adrv904x_Device_t* const device); + +/** +* \brief Gets the Tx to ORx Mapping Configuration setup for the device. +* +* This function retrieves from device handle Tx to ORx mapping configuration setup during initialization. +* +* \pre This function may be called after device Post Msc Initialization. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] mappingConfig The Tx to ORx mapping configuration that was applied to the device during PostMcsInit +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingConfigGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_TxToOrxMappingConfig_t * const mappingConfig); +/** +* \brief Sets the Tx to ORx external signal routing for Tx calibrations that use the ORx for observation. +* +* This function invokes the streams required to setup a Tx to ORx mapping configuration. +* +* \pre This function may be called after the Stream processor initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] mapping Tx to ORx mapping byte to apply. Corresponds to Tx to ORx Mapping Mode and +* Tx Observability Word selected during Initialization. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingSet(adi_adrv904x_Device_t* const device, + const uint8_t mapping); + +/** +* \brief Gets the Tx to ORx external signal routing for Tx calibrations that use the ORx for observation. +* +* This function retrieves from hardware the Tx channel currently mapped to the requested ORx channel +* +* \pre This function may be called after the Stream processors have been initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] orxChannel The ORx channel for which Tx channel mapping is requested +* \param[out] txChannel The Tx channel map to the ORx channel +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e orxChannel, + adi_adrv904x_TxChannels_e* const txChannel); + +/** +* \brief Updates ORx preset Atten value for selected Tx Channel(s) to be used when mapped to an ORx Channel. +* +* User also has the option to update active ORx atten, if appropriate, using immediateUpdate = 1. +* If immediate update is not desired, use immediateUpdate = 0. +* +* \pre This function may be called after device initialization is complete. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] mapping mapping for which to populate preset data to be used by Tx to ORx Mapping feature. +* (!TX_TO_ORX_EXTENDED_MAPPING_FLAG | mapping): Provide a txChannel Mask. See adi_adrv904x_TxChannels_e +* (TX_TO_ORX_EXTENDED_MAPPING_FLAG | mapping): Provide a State Mapping. See State Mappings in adi_adrv904x_TxToOrxMappingPinTable_e +* \param[in] presetAtten_dB Preset value for ORx Atten that will be automatically applied when one +* of the selected Tx Channel(s) is mapped to an ORx channel. +* \param[in] immediateUpdate Option to immediately apply the updated Tx Channel presets to any ORx Channel it is currently mapped to +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingPresetAttenSet( adi_adrv904x_Device_t* const device, + const uint32_t mapping, + const uint8_t presetAtten_dB, + const uint8_t immediateUpdate); + +/** +* \brief Retrieves ORx preset Atten value for selected Mapping to be used when mapped to an ORx Channel. +* +* \pre This function may be called after device initialization is complete. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] mapping Tx to Orx Mapping for which to retrieve preset data to be used by Tx to ORx Mapping feature. +* \param[out] presetAtten_dB Retrieved preset value for ORx Atten that will be automatically applied when the +* selected Tx Channel is mapped to an ORx channel. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingPresetAttenGet_v2( adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxToOrxMappingPinTable_e mapping, + uint8_t* const presetAtten_dB); + +/** +* \brief Retrieves ORx preset Atten value for selected Tx Channel to be used when mapped to an ORx Channel. +* +* \pre This function may be called after device initialization is complete. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] txChannel Tx channel for which to retrieve preset data to be used by Tx to ORx Mapping feature. +* Valid channels include adi_adrv904x_TxChannels_TX[0-7] +* \param[out] presetAtten_dB Retrieved preset value for ORx Atten that will be automatically applied when the +* selected Tx Channel is mapped to an ORx channel. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingPresetAttenGet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + uint8_t* const presetAtten_dB); + +/** +* \brief Updates ORx preset NCO values for selected Tx Channel(s) to be used when mapped to an ORx Channel. +* +* The preset NCO setting is comprised of an ORx ADC NCO Freq and ORx Datapath NCO Freq. User also has the +* option to update active ORx NCO, if appropriate, using immediateUpdate = 1. If immediate update is not +* desired, use immediateUpdate = 0. +* +* \pre This function may be called after device initialization is complete. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] mapping mapping for which to populate preset data to be used by Tx to ORx Mapping feature. +* (!TX_TO_ORX_EXTENDED_MAPPING_FLAG | mapping): Provide a txChannel Mask. See adi_adrv904x_TxChannels_e +* (TX_TO_ORX_EXTENDED_MAPPING_FLAG | mapping): Provide a State Mapping. See State Mappings in adi_adrv904x_TxToOrxMappingPinTable_e +* \param[in] presetNco Configuration of preset values for ORx NCO Frequencies that will be automatically applied +* when one of the selected Tx Channel(s) is mapped to an ORx channel. +* \param[in] immediateUpdate Option to immediately apply the updated Tx Channel presets to any ORx Channel it is currently mapped to +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingPresetNcoSet( adi_adrv904x_Device_t* const device, + const uint32_t mapping, + const adi_adrv904x_TxToOrxMappingPresetNco_t* const presetNco, + const uint8_t immediateUpdate); + +/** +* \brief Retrieves ORx preset NCO values for selected Mapping to be used when mapped to an ORx Channel. +* +* The preset config is comprised of ORx ADC NCO Freq and ORx Datapath NCO Freq. +* +* \pre This function may be called after device initialization is complete. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] mapping Tx to Orx Mapping for which to retrieve preset data to be used by Tx to ORx Mapping feature. +* \param[out] presetNco Retrieved configuration of preset values for ORx NCO Frequencies that will be +* automatically applied when the selected Tx Channel is mapped to an ORx channel. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingPresetNcoGet_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxToOrxMappingPinTable_e mapping, + adi_adrv904x_TxToOrxMappingPresetNco_t* const presetNco); + +/** +* \brief Retrieves ORx preset NCO values for selected Tx Channel to be used when mapped to an ORx Channel. +* +* The preset config is comprised of ORx ADC NCO Freq and ORx Datapath NCO Freq. +* +* \pre This function may be called after device initialization is complete. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] txChannel Tx channel for which to retrieve preset data to be used by Tx to ORx Mapping feature. +* Valid channels include adi_adrv904x_TxChannels_TX[0-7] +* \param[out] presetNco Retrieved configuration of preset values for ORx NCO Frequencies that will be +* automatically applied when the selected Tx Channel is mapped to an ORx channel. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingPresetNcoGet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_TxToOrxMappingPresetNco_t* const presetNco); + +/** +* \brief Reads back the version of the Stream binary loaded into the CPU memory +* +* This function reads the CPU memory to read back the major.minor.maint.build +* version for the Stream binary loaded into CPU memory. +* +* \pre This function may be called after the Stream processors have been initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] streamVersion Pointer to four parts of StreamVersion +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_StreamVersionGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_Version_t* const streamVersion); + +/** +* \brief Configures the preset gain/nco variables for antenna cal +* +* Function to store predefined Antenna Cal configuration. Values in this configuration +* that correspond to user-enabled Antenna Cal options in the Stream Generator will be +* forced when Antenna Cal mode is enabled for a given Rx or Tx Channel. Configurations +* can be unique across channels. Configuration will not be forced immediately; it will +* be forced when Antenna On streams are triggered for a given Rx or Tx Channel by a +* TRX_CTRL pin. To change Tx attenuation, stream processor will use S0 index. User is +* responsible to configure the device to use S0 index(attenuation update trigger disabled) +* before using antenna cal feature. +* +* \pre This function may be called after the Stream processors have been initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] configRx Configuration structure for Rx channel +* \param[in] configTx Configuration structure for Tx channel +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalConfigSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_RxRadioCtrlAntennaCalConfig_t * const configRx, + adi_adrv904x_TxRadioCtrlAntennaCalConfig_t * const configTx); + +/** +* \brief Reads back the antenna calibration configuration for selected channel +* +* +* \pre This function may be called after the Stream processors have been initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in,out] configRx Pointer to configuration structure to be populated with readback values +* \param[in,out] configTx Pointer to configuration structure to be populated with readback values +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalConfigGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_RxRadioCtrlAntennaCalConfig_t * const configRx, + adi_adrv904x_TxRadioCtrlAntennaCalConfig_t * const configTx); + +/** +* \brief Reads back the antenna calibration error status +* +* +* \pre errStatus fields: 0b: Tx Low Stream Error (Tx antenna cal pin de-asserted when Tx channel is enabled) +* 1b: Tx High Stream Error (Tx antenna cal pin asserted when Tx channel is enabled) +* 2b: Tx Low Stream Error (Tx Low stream is triggered when antenna cal is ongoing for this channel) +* 3b: Tx High Stream Error (Tx High stream is triggered when antenna cal is ongoing for this channel) +* 4b: Rx Low Stream Error (Rx antenna cal pin de-asserted when Rx channel is enabled) +* 5b: Rx High Stream Error (Rx antenna cal pin asserted when Rx channel is enabled) +* 6b: Rx Low Stream Error (Rx Low stream is triggered when antenna cal is ongoing for this channel) +* 7b: Rx High Stream Error (Rx High stream is triggered when antenna cal is ongoing for this channel) +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] channelSel Mask to select the channel to read the configuration from. Multiple channel selection isn't allowed +* \param[out] errStatus Pointer to error status byte +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalErrorGet(adi_adrv904x_Device_t* const device, + const uint32_t channelSel, + uint8_t * const errStatus); + +/** +* \brief Sweeps through all 20 stream processors and checks for failures and errors. +* The stream error being reported is the latest to happen. +* This function changes the error data saved from first to last. On first read the errors might be the first ones. +* +* After the errors are reported, the function clears the bits in the error registers. +* +* +* \param[in, out] device Context variable adi_adrv904x_Device_t pointer to the device data structure +* \param[out] streamErr Error array of the 20 stream processors stating which of them had errors and what these errors are +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_StreamProcErrorGet( adi_adrv904x_Device_t* const device, + adi_adrv904x_StreamErrArray_t* const streamErr); + + +/** +* \brief Function to select the Rx/Tx channels to be turned on Rx/Tx antenna cal GPIO pins asserted +* GPIO pin can be selected by using Gpio*Selection fields of streamSettings structure in profile json file. +* Please check GpioFeatureSelection_e of Adrvgen6StreamSettings class. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] txChannelMask Selects the Tx channels to be turned when Rx antenna cal GPIO pin asserted. Bit0:Tx0, Bit1:Tx1 and so on +* \param[in] rxChannelMask Selects the Rx channels to be turned when Tx antenna cal GPIO pin asserted. Bit0:Rx0, Bit1:Rx1 and so on +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalGpioChannelSet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const uint32_t rxChannelMask); + +/** +* \brief Function to read Tx/Rx channel selection for GPIO based antenna cal +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] txChannelMask Pointer to readback value for tx channel selection. Bit0:Tx0, Bit1:Tx1 and so on +* \param[out] rxChannelMask Pointer to readback value for rx channel selection. Bit0:Rx0, Bit1:Rx1 and so on +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalGpioChannelGet(adi_adrv904x_Device_t* const device, + uint32_t * const txChannelMask, + uint32_t * const rxChannelMask); + +/** +* \brief Configures the preset gain/nco variables for antenna cal +* +* Function to store predefined Antenna Cal configuration. Values in this configuration +* that correspond to user-enabled Antenna Cal options in the Stream Generator will be +* forced when Antenna Cal mode is enabled for a given Rx or Tx Channel. Configurations +* can be unique across channels. Configuration will not be forced immediately; it will +* be forced when Antenna On streams are triggered for a given Rx or Tx Channel by a +* TRX_CTRL pin. To change Tx attenuation, stream processor will use S0 index. User is +* responsible to configure the device to use S0 index(attenuation update trigger disabled) +* before using antenna cal feature. +* +* \pre This function may be called after the Stream processors have been initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] configRx Configuration structure for Rx channel +* \param[in] configTx Configuration structure for Tx channel +* \param[in] rxGain - gain value to apply to rx antenna cal +* \param[in] enableFreeze - enable/disable of agc freeze +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalConfigSet_v2(adi_adrv904x_Device_t* const device, + adi_adrv904x_RxRadioCtrlAntennaCalConfig_t * const configRx, + adi_adrv904x_TxRadioCtrlAntennaCalConfig_t * const configTx, + const uint8_t rxGain, + const uint8_t enableFreeze); + + +/** +* \brief This function is used during the init sequence in order to load the radio sequencer +* binary images from the radioSeqBinary.bin file. The radioSeqBinary.bin +* file has a pre-defined structure this function relies on and so the user +* must load the radioSeqBinary.bin starting from the beginning. +* The user may load the file in chunks as low as 100 bytes by iterating through +* the entire radioSeqBinary.bin and updating byteOffset on each iteration. +* Once the final chunk of radioSeqBinary.bin has been processed the function +* sets the appropriate status flag in device->devStateInfo. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] byteOffset Offset (starting from 0) of where the current binary chunk is located +* in the radioSeqBinary.bin file. +* \param[in] binary Byte array containing the current chunk of radio sequence binary file to process +* \param[in] byteCount The number of bytes in the binary parameter +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerImageWrite(adi_adrv904x_Device_t* const device, + uint32_t byteOffset, + const uint8_t binary[], + uint32_t byteCount); + +/** +* \brief Function to write Radio Sequencer multi frame phase adjustment +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] phaseAdjustment value for RS multi frame phase adjustment +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerPhaseSet(adi_adrv904x_Device_t* const device, + uint32_t phaseAdjustment); + +/** +* \brief Function to read Radio Sequencer multi frame phase adjustment +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] phaseAdjustment Pointer to readback value for RS multi frame phase adjustment +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerPhaseGet(adi_adrv904x_Device_t* const device, + uint32_t* phaseAdjustment); + +/** +* \brief This function is used during the preMcsInit sequence in order to load the radio sequencer config. +* +* \pre This function is called after FW image is loaded. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerPreMcsCfg(adi_adrv904x_Device_t* const device); + +/** +* \brief This function is used during the postMcsInit sequence in order to load the radio sequencer config. +* +* \pre This function is called after FW image is loaded. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerPostMcsCfg(adi_adrv904x_Device_t* const device); + +/** +* \brief Function to start radio operation using the Radio Sequencer +* +* Starts radio operation using the default frame timing pattern (pattern 0) for each of the frame timing sequencers (0-9). If a sequencer does not have a frame timing pattern defined, it will execute the null pattern. +* +* \pre This function may be called after the RS binary have been initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerRadioStart(adi_adrv904x_Device_t* const device); + +/** +* \brief Function to stop Radio Sequencer Radio +* +* Stops radio operation by setting all 10 frame timing sequencers to execute the null pattern. This operation occurs immediately, i.e. it does not wait for a multi-frame boundary. +* +* \pre This function may be called after the RS binary have been initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerRadioStop(adi_adrv904x_Device_t* const device); + +/** +* \brief Function to set special pattern for Radio Sequencer +* +* Set customer special frame timing pattern for each radio sequencers (0-9). +* +* \pre This function may be called after the RS binary have been initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] specialPatternInfo - Pointer to the special pattern ID data structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerFrameTimingPatternSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RsSpecialSequencer_t* const specialPatternInfo); + +/** +* \brief Function to get special pattern for Radio Sequencer +* +* Get customer special frame timing pattern for each radio sequencers (0-9). +* +* \pre This function may be called after the RS binary have been initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] specialPatternInfo - Pointer to the special pattern ID data structure pointer. if the specialPatternUsed is false, pattern ID will be 0 +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerFrameTimingPatternGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_RsSpecialSequencer_t* const specialPatternInfo); + +/** +* \brief Function to clear special pattern for Radio Sequencer +* +* Clear customer special frame timing pattern for each radio sequencers (0-9). +* +* \pre This function may be called after the RS binary have been initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerFrameTimingPatternClear(adi_adrv904x_Device_t* const device); + +/** +* \brief Sets the Tx to ORx external signal routing for Tx calibrations that use the ORx for observation. +* +* This function invokes the streams required to setup a Tx to ORx mapping configuration. It also sets the +* direction of VSWR capture. This function should only be used for VSWR calibration. +* +* \pre This function may be called after the Stream processor initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] mapping Tx to ORx mapping byte to apply. Corresponds to Tx to ORx Mapping Mode and +* Tx Observability Word selected during Initialization. +* \param[in] vswrDirection VSWR direction for this mapping, either FWD or REV. Bit 0: Orx0 direction // Bit 1: Orx1 direction +* adi_adrv904x_DfeVswrDirection_e enum can be used to populate these bits +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingAndVswrDirSet(adi_adrv904x_Device_t* const device, + const uint8_t mapping, + const uint8_t vswrDirection); + +/** +* \brief Gets the Tx to ORx external signal routing for Tx calibrations that use the ORx for observation. +* +* This function retrieves from hardware the Tx channel currently mapped to the requested ORx channel. It +* also reads VSWR directions for the selected ORx channel. It should only be used for VSWR calibration +* +* \pre This function may be called after the Stream processors have been initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] orxChannel The ORx channel for which Tx channel mapping is requested +* \param[out] txChannel The Tx channel map to the ORx channel +* \param[out] vswrDirection VSWR direction for this mapping, either FWD or REV +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingAndVswrDirGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e orxChannel, + adi_adrv904x_TxChannels_e* const txChannel, + adi_adrv904x_DfeVswrDirection_e* const vswrDirection); + +/** +* \brief Set the requested PA En input. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] paEnOutput The bitmask selection based on adi_adrv904x_PaEnOutputs_e. +* \param[in] paEnInput The selection of either PA En or DTX. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlPaSelectInputSet(adi_adrv904x_Device_t* const device, + const uint32_t paEnOutput, + const adi_adrv904x_PaEnInputSel_e paEnInput); + +/** +* \brief Get the requested PA En input. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] paEnOutput The selection based on adi_adrv904x_PaEnOutputs_e. +* \param[out] paEnInput Pointer to the value selection of either PA En or DTX. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlPaSelectInputGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_PaEnOutputs_e paEnOutput, + adi_adrv904x_PaEnInputSel_e * const paEnInput); + +/** +* \brief Set the requested DTX fanout to PA_EN configuration. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] txChannelMask - Mask to select Tx channels to be affected with this function call +* \param[in] dtxFanoutCfg - Pointer to the DTX fanout to PA_EN configuration data structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDtxFanoutToPaEnConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const adi_adrv904x_DtxFanoutToPaEnCfg_t * const dtxFanoutCfg); + +/** +* \brief Get the DTX fanout to PA_EN configuration. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] dtxFanoutCfg - Pointer to the DTX fanout to PA_EN configuration data structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDtxFanoutToPaEnConfigGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DtxFanoutToPaEnCfg_t * const dtxFanoutCfg); + +/** +* \brief Configure the external alarm by updating corresponding entries in the External Alarm Configuration table. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] alarmMask The selection bit mask based on adi_adrv904x_Alarms_e. +* \param[in] alarmCfg Pointer to a structure adi_adrv904x_RadioCtrlAlarmConfig_t specifying external alarm configuration. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlExtAlarmConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t alarmMask, + const adi_adrv904x_RadioCtrlAlarmConfig_t * const alarmCfg); + +/** +* \brief Read the configuration data of the external alarm. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] alarmId Specify the alarm based on adi_adrv904x_Alarms_e. +* \param[out] alarmCfg Pointer to a structure adi_adrv904x_RadioCtrlAlarmConfig_t to contain external alarm configuration. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlExtAlarmConfigGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Alarms_e alarmId, + adi_adrv904x_RadioCtrlAlarmConfig_t * const alarmCfg); + +/** +* \brief Retrieve external alarm state for a specific alarm. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] alarmId Specify the alarm based on adi_adrv904x_Alarms_e. +* \param[out] alarmState Pointer to a variable containing value of alarm state. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlExtAlarmStateGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Alarms_e alarmId, + adi_adrv904x_AlarmState_e * const alarmState); + +/** +* \brief Retrieve the state of the GPIO pin assigned to a specific alarm. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] alarmId Specify the alarm based on adi_adrv904x_Alarms_e. +* \param[out] alarmState Pointer to a variable containing value of alarm state. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlExtAlarmGpioStateGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Alarms_e alarmId, + adi_adrv904x_AlarmState_e * const alarmState); + +/** +* \brief Clear a specific external alarm state. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] alarmId The specific alarm based on adi_adrv904x_Alarms_e. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlExtAlarmStateClear(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Alarms_e alarmId); + +/** +* \brief Activate or deactivate the LNA Always-On. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] lnaEnMask The selection bit mask based on adi_adrv904x_LnaEnOutputs_e. +* \param[in] activate Value to indicate the operation: 0= deactivate, 1=activate +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDbgLnaAlwaysOnSet(adi_adrv904x_Device_t* const device, + const uint32_t lnaEnMask, + const uint8_t activate); + +/** +* \brief Retrieving the LNA Always on activation state. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] lnaEnId Specifying which LNA En to retrieve based on adi_adrv904x_LnaEnOutputs_e. +* \param[out] activate Pointer to a value indicating the activation state of a specific LNA En (0=Deactivate, 1=Activate). +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDbgLnaAlwaysOnGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_LnaEnOutputs_e lnaEnId, + uint8_t * const activate); + +/** +* \brief Activate or deactivate the LNA Always-Off. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] lnaEnMask The selection bit mask based on adi_adrv904x_LnaEnOutputs_e. +* \param[in] activate Value to indicate the operation: 0= deactivate, 1=activate +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDbgLnaAlwaysOffSet(adi_adrv904x_Device_t* const device, + const uint32_t lnaEnMask, + const uint8_t activate); + +/** +* \brief Retrieving the LNA Always-Off activation state. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] lnaEnId Specifying which LNA En to retrieve based on adi_adrv904x_LnaEnOutputs_e. +* \param[out] activate Pointer to a value indicating the activation state of a specific LNA En (0=Deactivate, 1=Activate). +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDbgLnaAlwaysOffGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_LnaEnOutputs_e lnaEnId, + uint8_t * const activate); + +/** +* \brief Activate or deactivate the PA Always-On. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] paEnMask The selection bit mask based on adi_adrv904x_PaEnOutputs_e. +* \param[in] activate Value to indicate the operation: 0= deactivate, 1=activate +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDbgPaAlwaysOnSet(adi_adrv904x_Device_t* const device, + const uint32_t paEnMask, + const uint8_t activate); + +/** +* \brief Retrieving the PA Always-On activation state. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] paEnId Specifying which PA En to retrieve based on adi_adrv904x_PaEnOutputs_e. +* \param[out] activate Pointer to a value indicating the activation state of a specific PA En (0=Deactivate, 1=Activate). +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDbgPaAlwaysOnGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_PaEnOutputs_e paEnId, + uint8_t * const activate); + +/** +* \brief Activate or deactivate the PA Always-Off. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] paEnMask The selection bit mask based on adi_adrv904x_PaEnOutputs_e. +* \param[in] activate Value to indicate the operation: 0= deactivate, 1=activate +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDbgPaAlwaysOffSet(adi_adrv904x_Device_t* const device, + const uint32_t paEnMask, + const uint8_t activate); + +/** +* \brief Retrieving the PA Always-Off activation state. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] paEnId Specifying which PA En to retrieve based on adi_adrv904x_PaEnOutputs_e. +* \param[out] activate Pointer to a value indicating the activation state of a specific PA En (0=Deactivate, 1=Activate). +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDbgPaAlwaysOffGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_PaEnOutputs_e paEnId, + uint8_t * const activate); + +/** +* \brief Set the OC Fuse Enable Output state. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] alarmId Specify the alarm based on adi_adrv904x_Alarms_e. +* \param[in] state The state to be set based on adi_adrv904x_OutputState_e. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlOcFuseEnOutSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Alarms_e alarmId, + const adi_adrv904x_OutputState_e state); + +/** +* \brief Set the GPIO output for selected signals. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] gpioSigType The GPIO signal type selection. +* \param[in] signalMask Multiple GPIO signals can be selected with selection bit masks. +* \param[in] gpioPinstate Requested GPIO pin state +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDbgGpioOutputSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_OutGpioSigTypes_e gpioSigType, + const uint8_t signalMask, + const adi_adrv904x_OutGpioPinStates_e gpioPinstate); + +/** +* \brief Retrieve the GPIO output state for selected signal. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] gpioSigType The GPIO signal type selection. +* \param[in] signalMask The GPIO signal selection bit mask. Only one selected signal allow. +* \param[out] gpioPinstate Pointer to a value indicating current GPIO pin state +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDbgGpioOutputGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_OutGpioSigTypes_e gpioSigType, + const uint8_t signalMask, + adi_adrv904x_OutGpioPinStates_e * const gpioPinstate); + + + +/** +* \brief Set the antenna cal carrier config init structure. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] antCalCarrierCfgInit Pointer to the antenna cal carrier config +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalCarrierCfgInitSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RadioCtrlAntCalCarrierCfgInit_t* const antCalCarrierCfgInit); + +/** +* \brief Set the antenna cal carrier config runtime structure. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] antCalCarrierCfg Pointer to the antenna cal carrier config +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalCarrierCfgSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RadioCtrlAntCalCarrierCfg_t* const antCalCarrierCfg); + +/** +* \brief Set the antenna cal carrier config runtime structure and use the provided patternId when done. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] antCalCarrierCfg Pointer to the antenna cal carrier config +* \param[in] postCalPatternId pattern Id to use after antenna calibration +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalCarrierCfgSet_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RadioCtrlAntCalCarrierCfg_t* const antCalCarrierCfg, + uint32_t postCalPatternId); + +/** +* \brief Get the antenna cal carrier config runtime structure. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] antCalCarrierCfg Pointer to the antenna cal carrier config +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalCarrierCfgGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_RadioCtrlAntCalCarrierCfg_t* const antCalCarrierCfg); + +/** +* \brief Clear the antenna cal GPIO counter and gain table index. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalCarrierGainCountersClear(adi_adrv904x_Device_t* const device); + +/** +* \brief Get the antenna cal GPIO counter and gain table index. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] antCalGpioCounter Pointer to the antenna cal GPIO rising edge counter +* \param[out] antCalCarrierTableIndex Pointer to the antenna cal gain table index +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalCarrierGainCountersGet(adi_adrv904x_Device_t* const device, + uint8_t* const antCalGpioCounter, + uint8_t* const antCalCarrierTableIndex); + + + +/** +* \brief Gets the Tx to ORx Mapping Configuration setup for the device, in DFE Control Mode only. +* +* This function retrieves from device handle DFE Control mode Tx to ORx mapping configuration setup during initialization. +* This this function is called to reacback the config, but the device is in RCI mode, an error will be returned. +* +* \pre This function may be called after device Post Msc Initialization. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] mappingConfig The Dfe Control Tx to ORx mapping configuration that was applied to the device during PostMcsInit +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCtrlTxToOrxMappingConfigGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeCtrlTxToOrxMappingConfig_t * const mappingConfig); + +/** +* \brief Sets the DFE CTRL Tx to ORx mapping and drives GPIO outputs for a given Orx Channel to their expected state for Tx Channel +* +* This function invokes the streams required to apply a Tx to ORx mapping configuration +* +* \pre This function may be called after the Stream processor initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] orxChannel The ORx channel for which Tx channel mapping is updated +* \param[in] txChannel The Tx channel to map to the selected ORx channel +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCtrlTxToOrxMappingSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e orxChannel, + const adi_adrv904x_TxChannels_e txChannel); + +/** +* \brief Sets the DFE CTRL Tx to ORx mapping and VSWR Direction and drives GPIO outputs for a given Orx Channel to their expected state for Tx Channel +* +* This function invokes the streams required to apply a Tx to ORx mapping configuration +* +* \pre This function may be called after the Stream processor initialized and loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] orxChannel The ORx channel for which Tx channel mapping is updated +* \param[in] txChannel The Tx channel to map to the selected ORx channel +* \param[in] vswrDirection The VSWR direction to set, either FWD or REV. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCtrlTxToOrxMappingAndVswrDirSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e orxChannel, + const adi_adrv904x_TxChannels_e txChannel, + const adi_adrv904x_DfeVswrDirection_e vswrDirection); + +/** +* \brief Updates the preset GPIO output levels/state to apply when TXOFF state is applied for a given ORx. +* +* \pre This function may be called after the device is initialized and Powerup Stream has run. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] orxChannel The ORx channel for which Tx channel mapping is updated +* \param[in] txOffGpioLevels 4bit (max) gpio state to drive when TX OFF state is selected for orxChannel by adi_adrv904x_DfeCtrlTxToOrxMappingSet() or adi_adrv904x_DfeCtrlTxToOrxMappingAndVswrDirSet() +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCtrlTxToOrxMappingTxOffLevelsSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e orxChannel, + const uint8_t txOffGpioLevels); + +/** +* \brief Readback of AntCal Output GPIO config structure loaded in Stream Processor Binary. +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] pCfg – pointer to Stream GPIO Ant Cal Output Config structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalOutGpioCfgGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_StreamGpioAntCalOutCfg_t* const pCfg); + +/** +* \brief Manually set the Stream GPIO Antenna Cal outputs. Temporary drive states will be overriden at next UL/DL rising/falling edge +* +* \pre This function is called after FW image is loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] drive – Value to manually drive onto Stream Output AntCal GPIOs. Valid range is 8bit (0-255). +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalOutGpioLevelSet(adi_adrv904x_Device_t* const device, + const uint32_t drive); + +/** +* \brief Select GPIO output true table during antenna calibration +* +* +* +* \pre This function is called after the device has been initialized and radio multichip-sync +* (MCS) has been completed. This function shouldn't be called when antenna calibration is ongoing. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] tableSelection - GPIO output true table selection: 0 - MAIN path, 1: SECONDARY path. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalGpioTruthTableSet(adi_adrv904x_Device_t* const device, + uint8_t tableSelection); + +/** +* \brief Retrieve GPIO output true table selection during antenna calibration +* +* +* +* \pre This function is called after the device has been initialized and radio multichip-sync +* (MCS) has been completed +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in,out] pTableSelection - Pointer to GPIO output true table selection: 0 - MAIN path, 1 - SECONDARY path. +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalGpioTruthTableGet(adi_adrv904x_Device_t* const device, + uint8_t* pTableSelection); + +#endif /* _ADI_ADRV904X_RADIOCTRL_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_radioctrl_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_radioctrl_types.h new file mode 100644 index 00000000000..9ecd030343c --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_radioctrl_types.h @@ -0,0 +1,744 @@ +/** +* Copyright 2015 - 2022 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_radioctrl_types.h +* \brief Contains ADRV904X data types for radio ctrl features +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#ifndef _ADI_ADRV904X_RADIOCTRL_TYPES_H_ +#define _ADI_ADRV904X_RADIOCTRL_TYPES_H_ + +#include "adi_adrv904x_lo_types.h" +#include "adi_adrv904x_dev_temp_types.h" +#include "adi_adrv904x_gpio_types.h" +#include "adi_adrv904x_rx_types.h" +#include "adi_adrv904x_tx_types.h" + +#define ADI_ADRV904X_STREAM_MAX 20 +#define ADI_ADRV904X_STREAM_BINARY_IMAGE_FILE_SIZE_BYTES (88*1024) +#define ADI_ADRV904X_TRX_CTRL_PIN_COUNT 8 +#define ADI_ADRV904X_MAX_STREAMGPIO 24 +#define ADI_ADRV904X_TX_TO_ORX_MAPPING_GPIO_MAX 8 +#define ADI_ADRV904X_TX_TO_ORX_MAPPING_PIN_TABLE_SIZE 16 +#define ADI_ADRV904X_STREAM_VERSION_ADDR 0x46A00008 + +#define ADI_ADRV904X_MAX_RADIOSEQUENCER 16U +#define ADI_ADRV904X_MAX_CUSTOMERCONFIGSEQUENCER 10U +#define ADI_ADRV904X_CARRIER_TABLE_COUNT 8U +#define ADI_ADRV904X_DFE_CTRL_TX_TO_ORX_MAPPING_GPIO_MAX 8 +#define ADI_ADRV904X_DFE_CTRL_MAX_GPIO_DIG 24 +#define ADI_ADRV904X_DFE_CTRL_MAX_GPIO_ANA 16 +#define ADI_ADRV904X_DTX_INPUT_MAX 8 +#define ADI_ADRV904X_MAX_STREAM_GPIO_ANTENNA_CAL_OUT_PINS 8 +#define ADI_ADRV904X_MODEL_SWITCH_INPUT_MAX 8 + +/** +* \brief Enum of Tx Enable Modes +*/ +typedef enum adi_adrv904x_TxEnableMode +{ + ADI_ADRV904X_TX_EN_SPI_MODE = 0, /*!< Selects SPI registers to control Tx signal path on/off */ + ADI_ADRV904X_TX_EN_PIN_MODE, /*!< Selects Pin mode to control Tx signal path on/off. Tx signal path is controlled by dedicated input pins to CPU */ + ADI_ADRV904X_TX_EN_INVALID_MODE +} adi_adrv904x_TxEnableMode_e; + +/** +* \brief Enum of Rx Enable Modes +*/ +typedef enum adi_adrv904x_RxEnableMode +{ + ADI_ADRV904X_RX_EN_SPI_MODE = 0, /*!< Selects SPI registers to control Rx signal path on/off */ + ADI_ADRV904X_RX_EN_PIN_MODE, /*!< Selects Pin mode to control Rx signal path on/off. Rx signal path is controlled by dedicated input pins to CPU */ + ADI_ADRV904X_RX_EN_INVALID_MODE +} adi_adrv904x_RxEnableMode_e; + +/** +* \brief Enum of Rx Enable Modes +*/ +typedef enum adi_adrv904x_ORxEnableMode +{ + ADI_ADRV904X_ORX_EN_SPI_MODE = 0, /*!< Selects SPI registers to control ORx signal path on/off */ + ADI_ADRV904X_ORX_EN_PIN_MODE, /*!< Selects Pin mode to control ORx signal path on/off. Rx signal path is controlled by dedicated input pins to CPU */ + ADI_ADRV904X_ORX_EN_INVALID_MODE +} adi_adrv904x_ORxEnableMode_e; +/** + * \brief Enum of the eight TxRx Enable Pins + */ +typedef enum adi_adrv904x_TxRxEnPin +{ + ADI_ADRV904X_TXRXEN_PIN0 = 0x01, /*!< TxRxEn Pin0 */ + ADI_ADRV904X_TXRXEN_PIN1 = 0x02, /*!< TxRxEn Pin1 */ + ADI_ADRV904X_TXRXEN_PIN2 = 0x04, /*!< TxRxEn Pin2 */ + ADI_ADRV904X_TXRXEN_PIN3 = 0x08, /*!< TxRxEn Pin3 */ + ADI_ADRV904X_TXRXEN_PIN4 = 0x10, /*!< TxRxEn Pin4 */ + ADI_ADRV904X_TXRXEN_PIN5 = 0x20, /*!< TxRxEn Pin5 */ + ADI_ADRV904X_TXRXEN_PIN6 = 0x40, /*!< TxRxEn Pin6 */ + ADI_ADRV904X_TXRXEN_PIN7 = 0x80, /*!< TxRxEn Pin7 */ + ADI_ADRV904X_TXRXEN_PINALL = 0xFF /*!< All TxRxEn pins */ +} adi_adrv904x_TxRxEnPin_e; + +/** +* \brief Enum of the TxRx Enable Pin Configuration settings +*/ +typedef enum adi_adrv904x_TxRxEnCfg +{ + ADI_ADRV904X_TXRXEN_TX_ENABLE_MAP = 0x01, /*!< Selects the Tx Enable mapping configuration */ + ADI_ADRV904X_TXRXEN_TX_ALTENABLE_MAP = 0x02, /*!< Selects the Tx Alternate Enable mapping configuration */ + ADI_ADRV904X_TXRXEN_RX_ENABLE_MAP = 0x04, /*!< Selects the Rx Enable mapping configuration */ + ADI_ADRV904X_TXRXEN_RX_ALTENABLE_MAP = 0x08, /*!< Selects the Rx AlternateEnable mapping configuration */ + ADI_ADRV904X_TXRXEN_ALL = 0x0F /*!< Selects all members in the structure */ +} adi_adrv904x_TxRxEnCfg_e; + +/** + * \brief Enum to select desired Tx to ORx Mapping Mode to be used for GPIO/API control + */ +typedef enum adi_adrv904x_TxToOrxMappingMode +{ + ADI_ADRV904X_TX_ORX_MAPPING_MODE_2BIT = 2U, /*!< 2Bit Tx to ORx Mapping Mode*/ + ADI_ADRV904X_TX_ORX_MAPPING_MODE_3BIT = 3U, /*!< 3Bit Tx to ORx Mapping Mode*/ + ADI_ADRV904X_TX_ORX_MAPPING_MODE_4BIT = 4U, /*!< 4Bit Tx to ORx Mapping Mode*/ + ADI_ADRV904X_TX_ORX_MAPPING_MODE_6BIT = 6U, /*!< 6Bit Tx to ORx Mapping Mode*/ + ADI_ADRV904X_TX_ORX_MAPPING_MODE_8BIT = 8U, /*!< 8Bit Tx to ORx Mapping Mode*/ + + ADI_ADRV904X_TX_ORX_MAPPING_MODE_DFE_CTRL = 32U, /*!< DFE Controlled Tx to ORx Mapping Mode */ +} adi_adrv904x_TxToOrxMappingMode_e; + +/** + * \brief Enum to select desired Tx Channel Mapping for a GPIO Pin state + */ +typedef enum adi_adrv904x_TxToOrxMappingPinTable +{ + ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX0 = 0x000U, /*!< Pin state selects Tx0 */ + ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX1 = 0x001U, /*!< Pin state selects Tx1 */ + ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX2 = 0x002U, /*!< Pin state selects Tx2 */ + ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX3 = 0x003U, /*!< Pin state selects Tx3 */ + ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX4 = 0x004U, /*!< Pin state selects Tx4 */ + ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX5 = 0x005U, /*!< Pin state selects Tx5 */ + ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX6 = 0x006U, /*!< Pin state selects Tx6 */ + ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX7 = 0x007U, /*!< Pin state selects Tx7 */ + + ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX0 = 0x008U, /*!< Tx0 channel enabled for VSWR */ + ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX1 = 0x009U, /*!< Tx1 channel enabled for VSWR */ + ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX2 = 0x00AU, /*!< Tx2 channel enabled for VSWR */ + ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX3 = 0x00BU, /*!< Tx3 channel enabled for VSWR */ + ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX4 = 0x00CU, /*!< Tx4 channel enabled for VSWR */ + ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX5 = 0x00DU, /*!< Tx5 channel enabled for VSWR */ + ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX6 = 0x00EU, /*!< Tx6 channel enabled for VSWR */ + ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX7 = 0x00FU, /*!< Tx7 channel enabled for VSWR */ + ADI_ADRV904X_TX_TO_ORX_MAPPING_NO_CHG_FOR_ORX1 = 0x000U, /*!< No Change to Current Mapping for ORX1 */ + ADI_ADRV904X_TX_TO_ORX_MAPPING_NO_CHG_FOR_ORX0 = 0x00FU /*!< No Change to Current Mapping for ORX0 */ +} adi_adrv904x_TxToOrxMappingPinTable_e; + +/** +* \brief Data structure to hold Tx Signal Path Control configurations +*/ +typedef struct adi_adrv904x_TxRadioCtrlModeCfg +{ + adi_adrv904x_TxEnableMode_e txEnableMode; /*!< Configuration for Tx Channel Enable mode */ + uint32_t txChannelMask; /*!< Tx channels for which configuration is valid */ +} adi_adrv904x_TxRadioCtrlModeCfg_t; + +/** +* \brief Data structure to hold Rx Signal Path Control configurations +*/ +typedef struct adi_adrv904x_RxRadioCtrlModeCfg +{ + adi_adrv904x_RxEnableMode_e rxEnableMode; /*!< Configuration for Rx Channel Enable mode */ + uint32_t rxChannelMask; /*!< Rx channels for which configuration is valid */ +} adi_adrv904x_RxRadioCtrlModeCfg_t; + +/** +* \brief Data structure to hold ORx Signal Path Control configurations +*/ +typedef struct adi_adrv904x_ORxRadioCtrlModeCfg +{ + adi_adrv904x_ORxEnableMode_e orxEnableMode; /*!< Configuration for ORx Channel Enable mode */ + uint32_t orxChannelMask; /*!< ORx channels for which configuration is valid */ +} adi_adrv904x_ORxRadioCtrlModeCfg_t; + +/** +* \brief Data structure to hold Signal Path Control configurations +*/ +typedef struct adi_adrv904x_RadioCtrlModeCfg +{ + adi_adrv904x_TxRadioCtrlModeCfg_t txRadioCtrlModeCfg; /*!< Tx signal path enable mode configuration */ + adi_adrv904x_RxRadioCtrlModeCfg_t rxRadioCtrlModeCfg; /*!< Rx signal path enable mode configuration */ + adi_adrv904x_ORxRadioCtrlModeCfg_t orxRadioCtrlModeCfg; /*!< ORx signal path enable mode configuration */ +} adi_adrv904x_RadioCtrlModeCfg_t; + +/** +* \brief Data structure to hold the LO configuration settings +*/ +typedef struct adi_adrv904x_LoConfig +{ + adi_adrv904x_LoName_e loName ; /*!< Select the target RF LO source */ + uint64_t loFrequency_Hz ; /*!< Desired RF LO frequency in Hz */ + adi_adrv904x_LoOption_e loConfigSel ; /*!< Select for LO config */ + } adi_adrv904x_LoConfig_t ; + +/** +* \brief Data structure to indicate to which PLL Tx and Rx Channels are connected. +*/ +typedef struct adi_adrv904x_ChanCtrlToPlls +{ + uint8_t rf0MuxTx0_3; /*!< If set to 1 East Tx channels (Tx0-3) are connected to PLL0 (East PLL). If set to 0 Tx0-3 are connected to PLL1 (West PLL) */ + uint8_t rf0MuxTx4_7; /*!< If set to 1 West Tx channels (Tx4-7) are connected to PLL0 (East PLL). If set to 0 Tx4-7 are connected to PLL1 (West PLL) */ + uint8_t rf0MuxRx0_3; /*!< If set to 1 East Rx channels (Rx0-3) are connected to PLL0 (East PLL). If set to 0 Rx0-3 are connected to PLL1 (West PLL) */ + uint8_t rf0MuxRx4_7; /*!< If set to 1 West Rx channels (Rx4-7) are connected to PLL0 (East PLL). If set to 0 Rx4-7 are connected to PLL1 (West PLL) */ +}adi_adrv904x_ChanCtrlToPlls_t ; + +/** +* \brief Data structure to hold the LO configuration read back values. +*/ +typedef struct adi_adrv904x_LoConfigReadback +{ + adi_adrv904x_LoName_e loName ; /*!< Select the target RF LO source to read back */ + uint64_t loFrequency_Hz ; /*!< RF LO frequency in Hz */ +} adi_adrv904x_LoConfigReadback_t ; + +/** +* \brief Data structure to hold the Radio Control GPIO pin information. +*/ +typedef struct adi_adrv904x_RadioCtrlTxRxEnCfg +{ + uint8_t txEnMapping[ADI_ADRV904X_TRX_CTRL_PIN_COUNT]; /*!< Tx Enable Pin bitfield. Each bit in each byte corresponds to Each Tx Channel, eg txEnMapping[0] => ADI_ADRV904X_TX0. Use adi_adrv904x_TxChannels_e to build up bitmask. */ + uint8_t txAltMapping[ADI_ADRV904X_TRX_CTRL_PIN_COUNT]; /*!< Tx Alternate Enable Pin bitfield. Each bit in each byte corresponds to Each Tx Channel, eg txAltMapping[0] => ADI_ADRV904X_TX0. Use adi_adrv904x_TxChannels_e to build up bitmask. */ + uint8_t rxEnMapping[ADI_ADRV904X_TRX_CTRL_PIN_COUNT]; /*!< Rx Enable Pin bitfield. Each bit in each byte corresponds to Each Rx Channel, eg rxEnMapping[0] => ADI_ADRV904X_RX0. Use adi_adrv904x_RxChannels_e to build up bitmask. */ + uint8_t rxAltMapping[ADI_ADRV904X_TRX_CTRL_PIN_COUNT]; /*!< Rx Alternate Enable Pin bitfield. Each bit in each byte corresponds to Each Rx Channel, eg rxAltMapping[0] => ADI_ADRV904X_RX0. Use adi_adrv904x_RxChannels_e to build up bitmask. */ +} adi_adrv904x_RadioCtrlTxRxEnCfg_t; + +/** +* \brief Data structure to hold Synthesizer RF LO Loop filter settings +*/ +typedef struct adi_adrv904x_LoLoopFilterCfg +{ + uint16_t loopBandwidth_kHz; /*!< Synthesizer LO Loop filter bandwidth. Range 60-1000 */ + uint8_t phaseMargin_degrees; /*!< Synthesizer LO Loop filter phase margin in degrees. Range 45-75 */ +} adi_adrv904x_LoLoopFilterCfg_t; + +/** +* \brief Data structure to hold Stream GPIO pin assignments. +*/ +typedef struct adi_adrv904x_StreamGpioPinCfg +{ + adi_adrv904x_GpioPinSel_e streamGpInput[ADI_ADRV904X_MAX_STREAMGPIO]; /*!< Enable GPIO pin input to ADRV904X stream processor GP input. To enable set streamGpInput[0]=GPIO_00, streamGpInput[1]=GPIO_01,,etc. To disable select ADI_ADRV904X_GPIO_INVALID */ + + adi_adrv904x_GpioPinSel_e streamGpDigOutput[ADI_ADRV904X_DFE_CTRL_MAX_GPIO_DIG]; /*!< Enable digital GPIO pin output to ADRV904X stream processor GP input. To enable set streamGpDigOutput[0]=GPIO_00, streamGpDigOutput[1]=GPIO_01,,etc. To disable select ADI_ADRV904X_GPIO_INVALID */ + adi_adrv904x_GpioAnaPinSel_e streamGpAnaOutput[ADI_ADRV904X_DFE_CTRL_MAX_GPIO_ANA]; /*!< Enable analog GPIO pin output to ADRV904X stream processor GP input. To enable set streamGpAnaOutput[0]=GPIO_00, streamGpAnaOutput[1]=GPIO_01,,etc. To disable select ADI_ADRV904X_GPIO_ANA_INVALID */ +} adi_adrv904x_StreamGpioPinCfg_t; + +/** + * \brief Data structure to hold Tx to ORx configuration settings. + */ +typedef struct adi_adrv904x_TxToOrxMappingConfig +{ + uint16_t txObservability; /*!< Tx observability word. This is a bitmask consisting of eight 2bit-pairs (nibbles), where each nibble makes a Tx channel observable by either ORx0 (set nibble to 2'b01 = 1), ORx1 (set nibble to 2'b10 = 2), or neither (set nibble to 2'b00 = 0). It is not allowed for a single Tx channel to be observable on both ORx0 and ORx1 (e.g. setting a nibble to 2'b11 = 3 is invalid). For example, setting B0 = Tx0 obs by ORx0, B1 = Tx0 obs by Orx1, ..., B8 = Tx4 obs by Orx0, B9 = Tx4 obs on Orx1, ..., B14 = Tx7 obs by Orx0, B15 = Tx7 obs on Orx1 */ + adi_adrv904x_TxToOrxMappingMode_e mode; /*!< Tx to ORx Mapping Mode */ + adi_adrv904x_GpioPinSel_e gpioSelect[ADI_ADRV904X_TX_TO_ORX_MAPPING_GPIO_MAX]; /*!< Select up to 8 GPIO to set mapping */ + adi_adrv904x_TxToOrxMappingPinTable_e pinTableOrx0[ADI_ADRV904X_TX_TO_ORX_MAPPING_PIN_TABLE_SIZE]; /*!< ORX0 Look-Up Table for Tx Channel selection based on GPIO pin states */ + adi_adrv904x_TxToOrxMappingPinTable_e pinTableOrx1[ADI_ADRV904X_TX_TO_ORX_MAPPING_PIN_TABLE_SIZE]; /*!< ORX1 Look-Up Table for Tx Channel selection based on GPIO pin states */ + uint8_t autoSwitchOrxAttenEnable; /*!< Auto-switching of Orx Atten value enabled. 0 = Disabled. 1 = Enabled */ + uint8_t autoSwitchOrxNcoEnable; /*!< Auto-switching of Orx NCO frequency enabled. 0 = Disabled. 1 = Enabled */ + + adi_adrv904x_GpioPinSel_e vswrDirOrx0Gpio; /*!< Select GPIO to map VSWR to ORx0 */ + adi_adrv904x_GpioPinSel_e vswrDirOrx1Gpio; /*!< Select GPIO to map VSWR to ORx1 */ + adi_adrv904x_GpioPinSel_e vswrDirCommonGpio; /*!< Select GPIO to map VSWR to both ORx0 and ORx1 */ + uint8_t vswrDirOrx0GpioPolarity; /*!< Set GPIO polarity for ORx0 mapping. 0 = forward. 1 = reverse */ + uint8_t vswrDirOrx1GpioPolarity; /*!< Set GPIO polarity for ORx1 mapping. 0 = forward. 1 = reverse */ + uint8_t vswrDirCommonGpioPolarity; /*!< Set GPIO polarity for both ORx0 and ORx1 mapping. 0 = forward. 1 = reverse */ +} adi_adrv904x_TxToOrxMappingConfig_t; + +/** + * \brief Structure for preset data used in Tx To Orx Mapping Auto-Update of ORx Atten and NCO Freq based on Mapping + */ +typedef struct adi_adrv904x_TxToOrxMappingPresetNco +{ + int32_t ncoFreqAdc_Khz; + int32_t ncoFreqDatapath_Khz; +} adi_adrv904x_TxToOrxMappingPresetNco_t; + +/** + * \brief loopfilter RX/TX LO command response structure + */ +typedef struct adi_adrv904x_RxTxLoFreqReadback +{ + adi_adrv904x_LoName_e rxLoName [ADI_ADRV904X_MAX_RX_ONLY]; /*!< PLL number of Rx Channels */ + uint32_t rxFreq_Khz [ADI_ADRV904X_MAX_RX_ONLY]; /*!< Freq of Rx Channels */ + adi_adrv904x_LoName_e txLoName [ADI_ADRV904X_MAX_TXCHANNELS]; /*!< PLL number of Tx Channels */ + uint32_t txFreq_Khz [ADI_ADRV904X_MAX_TXCHANNELS]; /*!< Freq of Tx Channels */ +} adi_adrv904x_RxTxLoFreqReadback_t ; + +/** +* \brief Struct for ADRV904X Antenna Cal Mode Pre-set Configuration for Rx +*/ +typedef struct adi_adrv904x_RxRadioCtrlAntennaCalConfig +{ + uint32_t rxChannelMask; /*!< Rx Channel selection */ + uint8_t rxGainIndex; /*!< Rx Gain table index to use during Antenna Cal */ + int32_t rxNcoFreqKhz; /*!< Rx NCO Frequency to use during Antenna Cal */ +} adi_adrv904x_RxRadioCtrlAntennaCalConfig_t; + +/** +* \brief Struct for ADRV904X Antenna Cal Mode Pre-set Configuration for Tx +*/ +typedef struct adi_adrv904x_TxRadioCtrlAntennaCalConfig +{ + uint32_t txChannelMask; /*!< Tx Channel selection */ + uint16_t txAttenuation_mdB; /*!< Tx Attenuation value to use during Antenna Cal [mdB] */ + int32_t txNcoFreqKhz; /*!< Tx NCO Frequency to use during Antenna Cal */ +} adi_adrv904x_TxRadioCtrlAntennaCalConfig_t; + +/** + * \brief Enum to classify the stream type being analyzed + */ +typedef enum adi_adrv904x_StreamProcType +{ + ADI_ADRV904X_STREAM_MAIN = 0U, + ADI_ADRV904X_STREAM_KFA = 1U, + ADI_ADRV904X_STREAM_RX = 2U, + ADI_ADRV904X_STREAM_TX = 3U, + ADI_ADRV904X_STREAM_ORX = 4U +} adi_adrv904x_StreamProcType_e; + +/** +* \brief Enum to indicate error cause (is the output of sp_rdbk_error_val register of each stream processor +*/ +typedef enum adi_adrv904x_StreamError +{ + ADI_ADRV904X_STREAM_ERR_NONE = 0U, + ADI_ADRV904X_STREAM_ERR_SPI_ADDR = 1U, + ADI_ADRV904X_STREAM_ERR_CHECK_INSTR = 2U, + ADI_ADRV904X_STREAM_ERR_TIMEOUT = 4U, + ADI_ADRV904X_STREAM_ERR_STACK_OVERFLOW = 8U, + ADI_ADRV904X_STREAM_ERR_INVALID_STREAM_NUM = 16U, + ADI_ADRV904X_STREAM_ERR_AHB_ADDR = 32U, + ADI_ADRV904X_STREAM_ERR_INVALID_INSTR = 64U, + ADI_ADRV904X_STREAM_ERR_EXT_TIMER = 128U, + ADI_ADRV904X_STREAM_ERR_FIFO_FULL = 256U, + ADI_ADRV904X_STREAM_ERR_POSTED_HRESP_ON_SYSBUS = 512U +} adi_adrv904x_StreamError_e; + +/** +* \brief Data structure to hold each stream processor error information (the stream processor, the stream number and the error code) +*/ +typedef struct adi_adrv904x_StreamErr +{ + uint8_t streamProcId; /*!< stream processor id. Together with streamProcType indicates the Stream Proc */ + uint8_t erroredStreamNumber; /*!< output of reading the sp_errored_stream_number_register */ + adi_adrv904x_StreamProcType_e streamProcType; /*!< would say what type of stream we are dealing with */ + adi_adrv904x_StreamError_e streamErrEnum; /*!< output of reading the sp_rdbk_error_val in enum form */ +} adi_adrv904x_StreamErr_t; + +/** +* \brief Data structure to hold all StreamErr elements inside an array. +*/ +typedef struct adi_adrv904x_StreamErrArray +{ + adi_adrv904x_StreamErr_t streamProcArray[ADI_ADRV904X_STREAM_MAX]; +} adi_adrv904x_StreamErrArray_t; + +/** +* \brief Data structure holding the Radio Ctrl Pre Init +*/ +typedef struct adi_adrv904x_RadioCtrlPreInit_t +{ + adi_adrv904x_GpioPinSel_e radioSequencerSsbSyncGpioCtrl; /*!< Radio Sequencer Ssb Sync Gpio Ctrl Pin Select. Pin is allocated for SSB SYNC use only if Radio Sequencer is enabled. */ + adi_adrv904x_GpioPinSel_e radioSequencerGpioDigOut[ADI_ADRV904X_GPIO_COUNT]; /*!< Enable Digital GPIO pin output from ADRV904X radio sequencer xbar. To enable set radioSequencerGpioDigOut[0]=GPIO_00, radioSequencerGpioDigOut[1]=GPIO_01,,etc. To disable select ADI_ADRV904X_GPIO_INVALID. No allocation of pins is made unles Radio Sequencer is enabled. */ + adi_adrv904x_GpioAnaPinSel_e radioSequencerGpioAnaOut[ADI_ADRV904X_GPIO_ANALOG_COUNT]; /*!< Enable Analog GPIO pin output from ADRV904X radio sequencer xbar. To enable set radioSequencerGpioAnaOut[0]=GPIO_00, radioSequencerGpioAnaOut[1]=GPIO_01,,etc. To disable select ADI_ADRV904X_GPIO_ANA_INVALID. No allocation of pins is made unles Radio Sequencer is enabled. */ +} adi_adrv904x_RadioCtrlPreInit_t; + +/** +* \brief Enum for Vswr directions +*/ +typedef enum adi_adrv904x_DfeVswrDirection +{ + ADI_ADRV904X_DFE_VSWR_REV = 0, /*!< VSWR calibration reverse direction */ + ADI_ADRV904X_DFE_VSWR_FWD = 1 /*!< VSWR calibration forward direction */ +} adi_adrv904x_DfeVswrDirection_e; + +#define ADI_ADRV904X_ALARM_MAX 10 +#define PA_EN_OUT_MAX 8 +#define LNA_EN_OUT_MAX 8 +#define OC_FUSE_EN_OUT_MAX 8 +#define AUX_GRP0_OUT_MAX 8 +#define AUX_GRP1_OUT_MAX 8 + +/** + * \brief Enum of PA_EN outputs + */ +typedef enum adi_adrv904x_PaEnOutputs +{ + ADI_ADRV904X_PA_EN_OUT_NONE = 0x0000, /*!< PA_EN output none */ + ADI_ADRV904X_PA_EN_OUT_0 = 0x0001, /*!< PA_EN output 0 */ + ADI_ADRV904X_PA_EN_OUT_1 = 0x0002, /*!< PA_EN output 1 */ + ADI_ADRV904X_PA_EN_OUT_2 = 0x0004, /*!< PA_EN output 2 */ + ADI_ADRV904X_PA_EN_OUT_3 = 0x0008, /*!< PA_EN output 3 */ + ADI_ADRV904X_PA_EN_OUT_4 = 0x0010, /*!< PA_EN output 4 */ + ADI_ADRV904X_PA_EN_OUT_5 = 0x0020, /*!< PA_EN output 5 */ + ADI_ADRV904X_PA_EN_OUT_6 = 0x0040, /*!< PA_EN output 6 */ + ADI_ADRV904X_PA_EN_OUT_7 = 0x0080, /*!< PA_EN output 7 */ +} adi_adrv904x_PaEnOutputs_e; + +#define ADI_ADRV904X_PA_EN_OUT_ALL (ADI_ADRV904X_PA_EN_OUT_0 | \ + ADI_ADRV904X_PA_EN_OUT_1 | \ + ADI_ADRV904X_PA_EN_OUT_2 | \ + ADI_ADRV904X_PA_EN_OUT_3 | \ + ADI_ADRV904X_PA_EN_OUT_4 | \ + ADI_ADRV904X_PA_EN_OUT_5 | \ + ADI_ADRV904X_PA_EN_OUT_6 | \ + ADI_ADRV904X_PA_EN_OUT_7) + +/** + * \brief Enum of LNA_EN outputs + */ +typedef enum adi_adrv904x_LnaEnOutputs +{ + ADI_ADRV904X_LNA_EN_OUT_NONE = 0x0000, /*!< LNA_EN output none */ + ADI_ADRV904X_LNA_EN_OUT_0 = 0x0001, /*!< LNA_EN output 0 */ + ADI_ADRV904X_LNA_EN_OUT_1 = 0x0002, /*!< LNA_EN output 1 */ + ADI_ADRV904X_LNA_EN_OUT_2 = 0x0004, /*!< LNA_EN output 2 */ + ADI_ADRV904X_LNA_EN_OUT_3 = 0x0008, /*!< LNA_EN output 3 */ + ADI_ADRV904X_LNA_EN_OUT_4 = 0x0010, /*!< LNA_EN output 4 */ + ADI_ADRV904X_LNA_EN_OUT_5 = 0x0020, /*!< LNA_EN output 5 */ + ADI_ADRV904X_LNA_EN_OUT_6 = 0x0040, /*!< LNA_EN output 6 */ + ADI_ADRV904X_LNA_EN_OUT_7 = 0x0080, /*!< LNA_EN output 7 */ +} adi_adrv904x_LnaEnOutputs_e; + +#define ADI_ADRV904X_LNA_EN_OUT_ALL (ADI_ADRV904X_LNA_EN_OUT_0 | \ + ADI_ADRV904X_LNA_EN_OUT_1 | \ + ADI_ADRV904X_LNA_EN_OUT_2 | \ + ADI_ADRV904X_LNA_EN_OUT_3 | \ + ADI_ADRV904X_LNA_EN_OUT_4 | \ + ADI_ADRV904X_LNA_EN_OUT_5 | \ + ADI_ADRV904X_LNA_EN_OUT_6 | \ + ADI_ADRV904X_LNA_EN_OUT_7) + +/** + * \brief Enum of OC fuse enable outputs + */ +typedef enum adi_adrv904x_OcFuseEnOutputs +{ + ADI_ADRV904X_OC_FUSE_EN_OUT_NONE = 0x0000, /*!< OC fuse enable output none */ + ADI_ADRV904X_OC_FUSE_EN_OUT_0 = 0x0001, /*!< OC fuse enable output 0 */ + ADI_ADRV904X_OC_FUSE_EN_OUT_1 = 0x0002, /*!< OC fuse enable output 1 */ + ADI_ADRV904X_OC_FUSE_EN_OUT_2 = 0x0004, /*!< OC fuse enable output 2 */ + ADI_ADRV904X_OC_FUSE_EN_OUT_3 = 0x0008, /*!< OC fuse enable output 3 */ + ADI_ADRV904X_OC_FUSE_EN_OUT_4 = 0x0010, /*!< OC fuse enable output 4 */ + ADI_ADRV904X_OC_FUSE_EN_OUT_5 = 0x0020, /*!< OC fuse enable output 5 */ + ADI_ADRV904X_OC_FUSE_EN_OUT_6 = 0x0040, /*!< OC fuse enable output 6 */ + ADI_ADRV904X_OC_FUSE_EN_OUT_7 = 0x0080, /*!< OC fuse enable output 7 */ +} adi_adrv904x_OcFuseEnOutputs_e; + +#define ADI_ADRV904X_OC_FUSE_EN_OUT_ALL (ADI_ADRV904X_OC_FUSE_EN_OUT_0 | \ + ADI_ADRV904X_OC_FUSE_EN_OUT_1 | \ + ADI_ADRV904X_OC_FUSE_EN_OUT_2 | \ + ADI_ADRV904X_OC_FUSE_EN_OUT_3 | \ + ADI_ADRV904X_OC_FUSE_EN_OUT_4 | \ + ADI_ADRV904X_OC_FUSE_EN_OUT_5 | \ + ADI_ADRV904X_OC_FUSE_EN_OUT_6 | \ + ADI_ADRV904X_OC_FUSE_EN_OUT_7) + +/** + * \brief Enum of AUX Group0 outputs + */ +typedef enum adi_adrv904x_AuxGrp0Outputs +{ + ADI_ADRV904X_AUX_GRP0_OUT_NONE = 0x0000, /*!< AUX Group0 output none */ + ADI_ADRV904X_AUX_GRP0_OUT_0 = 0x0001, /*!< AUX Group0 output 0 */ + ADI_ADRV904X_AUX_GRP0_OUT_1 = 0x0002, /*!< AUX Group0 output 1 */ + ADI_ADRV904X_AUX_GRP0_OUT_2 = 0x0004, /*!< AUX Group0 output 2 */ + ADI_ADRV904X_AUX_GRP0_OUT_3 = 0x0008, /*!< AUX Group0 output 3 */ + ADI_ADRV904X_AUX_GRP0_OUT_4 = 0x0010, /*!< AUX Group0 output 4 */ + ADI_ADRV904X_AUX_GRP0_OUT_5 = 0x0020, /*!< AUX Group0 output 5 */ + ADI_ADRV904X_AUX_GRP0_OUT_6 = 0x0040, /*!< AUX Group0 output 6 */ + ADI_ADRV904X_AUX_GRP0_OUT_7 = 0x0080, /*!< AUX Group0 output 7 */ +} adi_adrv904x_AuxGrp0Outputs_e; + +#define ADI_ADRV904X_AUX_GRP0_OUT_ALL (ADI_ADRV904X_AUX_GRP0_OUT_0 | \ + ADI_ADRV904X_AUX_GRP0_OUT_1 | \ + ADI_ADRV904X_AUX_GRP0_OUT_2 | \ + ADI_ADRV904X_AUX_GRP0_OUT_3 | \ + ADI_ADRV904X_AUX_GRP0_OUT_4 | \ + ADI_ADRV904X_AUX_GRP0_OUT_5 | \ + ADI_ADRV904X_AUX_GRP0_OUT_6 | \ + ADI_ADRV904X_AUX_GRP0_OUT_7) + +/** + * \brief Enum of AUX Group1 outputs + */ +typedef enum adi_adrv904x_AuxGrp1Outputs +{ + ADI_ADRV904X_AUX_GRP1_OUT_NONE = 0x0000, /*!< AUX Group1 output none */ + ADI_ADRV904X_AUX_GRP1_OUT_0 = 0x0001, /*!< AUX Group1 output 0 */ + ADI_ADRV904X_AUX_GRP1_OUT_1 = 0x0002, /*!< AUX Group1 output 1 */ + ADI_ADRV904X_AUX_GRP1_OUT_2 = 0x0004, /*!< AUX Group1 output 2 */ + ADI_ADRV904X_AUX_GRP1_OUT_3 = 0x0008, /*!< AUX Group1 output 3 */ + ADI_ADRV904X_AUX_GRP1_OUT_4 = 0x0010, /*!< AUX Group1 output 4 */ + ADI_ADRV904X_AUX_GRP1_OUT_5 = 0x0020, /*!< AUX Group1 output 5 */ + ADI_ADRV904X_AUX_GRP1_OUT_6 = 0x0040, /*!< AUX Group1 output 6 */ + ADI_ADRV904X_AUX_GRP1_OUT_7 = 0x0080, /*!< AUX Group1 output 7 */ +} adi_adrv904x_AuxGrp1Outputs_e; + +#define ADI_ADRV904X_AUX_GRP1_OUT_ALL (ADI_ADRV904X_AUX_GRP1_OUT_0 | \ + ADI_ADRV904X_AUX_GRP1_OUT_1 | \ + ADI_ADRV904X_AUX_GRP1_OUT_2 | \ + ADI_ADRV904X_AUX_GRP1_OUT_3 | \ + ADI_ADRV904X_AUX_GRP1_OUT_4 | \ + ADI_ADRV904X_AUX_GRP1_OUT_5 | \ + ADI_ADRV904X_AUX_GRP1_OUT_6 | \ + ADI_ADRV904X_AUX_GRP1_OUT_7) + +/** +* \brief Enum of available output GPIO pin states +*/ +typedef enum adi_adrv904x_OutGpioPinStates +{ + ADI_ADRV904X_OUT_GPIO_PIN_STATE_OFF = 0, /*!< Select output GPIO pin ON state */ + ADI_ADRV904X_OUT_GPIO_PIN_STATE_ON = 1, /*!< Select output GPIO pin OFF state */ + ADI_ADRV904X_OUT_GPIO_PIN_STATE_HIGH_Z = 2, /*!< Select output GPIO pin HIGH_Z state*/ + ADI_ADRV904X_OUT_GPIO_PIN_STATE_NORMAL_OP = 3 /*!< Select output GPIO pin NORMAL OPERATION state */ +} adi_adrv904x_OutGpioPinStates_e; + +/** +* \brief Enum of available alarm input GPIO pin modes +*/ +typedef enum adi_adrv904x_AlarmInputGpioPinModes +{ + ADI_ADRV904X_ALARM_INPUT_GPIO_PIN_MODE_ACTIVE_LOW = 0, /*!< Select Active Low mode for alarm input GPIO pin */ + ADI_ADRV904X_ALARM_INPUT_GPIO_PIN_MODE_ACTIVE_HIGH = 1, /*!< Select Active High mode for alarm input GPIO pin */ +} adi_adrv904x_AlarmInputGpioPinModes_e; + +/** +* \brief Enum of available output GPIO pin modes +*/ +typedef enum adi_adrv904x_OutGpioPinModes +{ + ADI_ADRV904X_OUT_GPIO_PIN_MODE_ACTIVE_LOW = 0, /*!< Select Active Low mode for GPIO pin */ + ADI_ADRV904X_OUT_GPIO_PIN_MODE_ACTIVE_HIGH = 1, /*!< Select Active High mode for GPIO pin */ + ADI_ADRV904X_OUT_GPIO_PIN_MODE_HIGH_Z = 2 /*!< Select High_Z mode for GPIO pin */ +} adi_adrv904x_OutGpioPinModes_e; + +/** +* \brief Enum of output GPIO signal types +*/ +typedef enum adi_adrv904x_OutGpioSigTypes +{ + ADI_ADRV904X_OUT_GPIO_SIG_TYPE_LNA_EN = 0x0000, /*!< LNA_EN GPIO signal type. Valid signal range: 0..7 */ + ADI_ADRV904X_OUT_GPIO_SIG_TYPE_PA_EN = 0x0001, /*!< PA_EN GPIO signal type. Valid signal range: 0..7 */ + ADI_ADRV904X_OUT_GPIO_SIG_TYPE_TDD_SW_EN = 0x0002, /*!< TDD_SW_EN GPIO signal type. Valid signal range: 1 */ + ADI_ADRV904X_OUT_GPIO_SIG_TYPE_DRV_PA_EN = 0x0003, /*!< DRV_PA_EN GPIO signal type. Valid signal range: 1 */ + ADI_ADRV904X_OUT_GPIO_SIG_TYPE_FB_SW_EN = 0x0004, /*!< FB_SW_EN GPIO signal type. Valid signal range: 0..7 */ + ADI_ADRV904X_OUT_GPIO_SIG_TYPE_AUX_GRP0_OUT = 0x0005, /*!< AUX_GRP0_OUT GPIO signal type. Valid signal range: 0..7 */ + ADI_ADRV904X_OUT_GPIO_SIG_TYPE_FB_SW_EXT_EN = 0x0006, /*!< FB_SW_EXT_EN GPIO signal type. Valid signal range: 0..7 */ + ADI_ADRV904X_OUT_GPIO_SIG_TYPE_AUX_GRP1_OUT = 0x0007 /*!< AUX_GRP1_OUT GPIO signal type. Valid signal range: 0..7 */ +} adi_adrv904x_OutGpioSigTypes_e; + +/** + * \brief Enum of available alarms + */ +typedef enum adi_adrv904x_Alarms +{ + ADI_ADRV904X_ALARM_0 = 0x0001, /*!< Alarm 0 */ + ADI_ADRV904X_ALARM_1 = 0x0002, /*!< Alarm 1 */ + ADI_ADRV904X_ALARM_2 = 0x0004, /*!< Alarm 2 */ + ADI_ADRV904X_ALARM_3 = 0x0008, /*!< Alarm 3 */ + ADI_ADRV904X_ALARM_4 = 0x0010, /*!< Alarm 4 */ + ADI_ADRV904X_ALARM_5 = 0x0020, /*!< Alarm 5 */ + ADI_ADRV904X_ALARM_6 = 0x0040, /*!< Alarm 6 */ + ADI_ADRV904X_ALARM_7 = 0x0080, /*!< Alarm 7 */ + ADI_ADRV904X_ALARM_8 = 0x0100, /*!< Alarm 8 */ + ADI_ADRV904X_ALARM_9 = 0x0200, /*!< Alarm 9 */ +} adi_adrv904x_Alarms_e; + +#define ADI_ADRV904X_ALARM_MASK_ALL (ADI_ADRV904X_ALARM_0 | \ + ADI_ADRV904X_ALARM_1 | \ + ADI_ADRV904X_ALARM_2 | \ + ADI_ADRV904X_ALARM_3 | \ + ADI_ADRV904X_ALARM_4 | \ + ADI_ADRV904X_ALARM_5 | \ + ADI_ADRV904X_ALARM_6 | \ + ADI_ADRV904X_ALARM_7 | \ + ADI_ADRV904X_ALARM_8 | \ + ADI_ADRV904X_ALARM_9) + +/** + * \brief Enum of available alarm types + */ +typedef enum adi_adrv904x_AlarmType +{ + ADI_ADRV904X_ALARM_TYPE_NONE = 0x0000, /*!< Unused alarm input */ + ADI_ADRV904X_ALARM_TYPE_OCP = 0x0001, /*!< Selects OCP as an alarm type */ + ADI_ADRV904X_ALARM_TYPE_CFPGA = 0x0002, /*!< Selects Control FPGA as an alarm type */ + ADI_ADRV904X_MAX_ALARM_TYPE = 0x0002 /*!< Max value allowed for alarm type */ +} adi_adrv904x_AlarmType_e; + +#define ADI_ADRV904X_ALARM_TYPE_MASK_ALL (ADI_ADRV904X_ALARM_TYPE_OCP | ADI_ADRV904X_ALARM_TYPE_CFPGA) + +/** + * \brief Enum of available alarm states + */ +typedef enum adi_adrv904x_AlarmState +{ + ADI_ADRV904X_ALARM_STATE_INACTIVE = 0x0000, /*!< Alarm is not active */ + ADI_ADRV904X_ALARM_STATE_ACTIVE = 0x0001 /*!< Alarm is active */ +} adi_adrv904x_AlarmState_e; + +/** + * \brief Enum of available output states + */ +typedef enum adi_adrv904x_OutputState_e +{ + ADI_ADRV904X_OUTPUT_DISABLE = 0x0000, /*!< Disable Output */ + ADI_ADRV904X_OUTPUT_ENABLE = 0x0001, /*!< Enable Output */ +} adi_adrv904x_OutputState_e; + +/** + * \brief Enum of available PA_EN inputs + */ +typedef enum adi_adrv904x_PaEnInputSel +{ + ADI_ADRV904X_PA_EN_INPUT_SEL_RS = 0, /*!< Select PA_EN signal from RS */ + ADI_ADRV904X_PA_EN_INPUT_SEL_DTX_RS = 1, /*!< Select DTX signal ANDed with PA_EN */ +} adi_adrv904x_PaEnInputSel_e; + +/** + * \brief Data structure to hold alarm configuration + */ +typedef struct adi_adrv904x_RadioCtrlAlarmConfig +{ + adi_adrv904x_AlarmType_e alarmType; /*!< Source of the alarm */ + uint32_t lnaEnOut; /*!< Used LNA_EN Output. Multi-bits mask of adi_adrv904x_LnaEnOutputs_e */ + uint32_t paEnOut; /*!< Used PA_EN Output. Multi-bits mask of adi_adrv904x_PaEnOutputs_e */ + uint32_t ocFuseEnOut; /*!< Used OC Fuse Enable Output. Multi-bits mask of adi_adrv904x_OcFuseEnOutputs_e */ + uint32_t auxGrp0Out; /*!< Used AUX_GRP0 Output. Multi-bits mask of adi_adrv904x_AuxGrp0Outputs_e */ + uint32_t auxGrp1Out; /*!< Used AUX_GRP1 Output. Multi-bits mask of adi_adrv904x_AuxGrp1Outputs_e */ +} adi_adrv904x_RadioCtrlAlarmConfig_t; + +/** + * \brief Data structure to config customer special frame timing pattern ID for each radio sequencer + */ +typedef struct adi_adrv904x_RsSpecialPattern +{ + uint8_t specialPatternUsed; /*!< Customer special frame timing pattern config flag. true: use customer special pattern; false, use default */ + uint32_t specialPatternId; /*!< Customer special frame timing pattern ID when specialPatternUsed is true */ +} adi_adrv904x_RsSpecialPattern_t; + +/** +* \brief Data structure to hold all special radio sequencer pattern elements inside an array +*/ +typedef struct adi_adrv904x_RsSpecialSequencer +{ + adi_adrv904x_RsSpecialPattern_t specialSequencer[ADI_ADRV904X_MAX_CUSTOMERCONFIGSEQUENCER]; /*!< Customer special frame timing pattern ID for each radio sequencer */ +} adi_adrv904x_RsSpecialSequencer_t; + +typedef struct adi_adrv904x_RadioCtrlAlarmGpioConfig +{ + adi_adrv904x_GpioPinSel_e alarmInputGpio[ADI_ADRV904X_ALARM_MAX]; /*!< Digital GPIOs selected as alarm input */ + adi_adrv904x_AlarmInputGpioPinModes_e alarmInputGpioPinMode[ADI_ADRV904X_ALARM_MAX]; /*!< Selected as alarm input GPIO pin mode */ + + adi_adrv904x_GpioPinSel_e lnaEnOutDigGpio[LNA_EN_OUT_MAX]; /*!< Digital GPIOs selected as LNA_EN outputs */ + adi_adrv904x_GpioAnaPinSel_e lnaEnOutAnaGpio[LNA_EN_OUT_MAX]; /*!< Analog GPIOs selected as LNA_EN outputs */ + adi_adrv904x_OutGpioPinModes_e lnaEnOutGpioPinMode; /*!< Selected as LNA_EN outputs pin mode */ + + adi_adrv904x_GpioPinSel_e paEnOutDigGpio[PA_EN_OUT_MAX]; /*!< Digital GPIOs selected as LNA_EN outputs */ + adi_adrv904x_GpioAnaPinSel_e paEnOutAnaGpio[PA_EN_OUT_MAX]; /*!< Analog GPIOs selected as LNA_EN outputs */ + adi_adrv904x_OutGpioPinModes_e paEnOutGpioPinMode; /*!< Selected as PA_EN outputs pin mode */ + + adi_adrv904x_GpioPinSel_e ocFuseEnOutDigGpio[OC_FUSE_EN_OUT_MAX]; /*!< Digital GPIOs selected as OC_FUSE_EN outputs */ + adi_adrv904x_GpioAnaPinSel_e ocFuseEnOutAnaGpio[OC_FUSE_EN_OUT_MAX]; /*!< Analog GPIOs selected as OC_FUSE_EN outputs */ + adi_adrv904x_OutGpioPinModes_e ocFuseEnOutGpioPinMode; /*!< Selected as OC_FUSE outputs pin mode */ + + adi_adrv904x_GpioPinSel_e auxGrp0OutDigGpio[AUX_GRP0_OUT_MAX]; /*!< Digital GPIOs selected as AUX GRP0 outputs */ + adi_adrv904x_GpioAnaPinSel_e auxGrp0OutAnaGpio[AUX_GRP0_OUT_MAX]; /*!< Analog GPIOs selected as AUX GRP0 outputs */ + adi_adrv904x_OutGpioPinModes_e auxGrp0OutGpioPinMode[AUX_GRP0_OUT_MAX]; /*!< Selected as AUX GRP0 outputs pin mode */ + + adi_adrv904x_GpioPinSel_e auxGrp1OutDigGpio[AUX_GRP1_OUT_MAX]; /*!< Digital GPIOs selected as AUX GRP1 outputs */ + adi_adrv904x_GpioAnaPinSel_e auxGrp1OutAnaGpio[AUX_GRP1_OUT_MAX]; /*!< Analog GPIOs selected as AUX GRP1 outputs */ + adi_adrv904x_OutGpioPinModes_e auxGrp1OutGpioPinMode[AUX_GRP1_OUT_MAX]; /*!< Selected as AUX GRP1 outputs pin mode */ +} adi_adrv904x_RadioCtrlAlarmGpioConfig_t; + + + +/** + * \brief Data structure to hold antenna calibration initial configuration + */ +typedef struct adi_adrv904x_RadioCtrlAntCalCarrierCfgInit +{ + uint32_t commonRxMask; /*!< Common Rx channels mask. It should be 0 if there is no common Rx channel. + It can have multiple bits set, Koror can have multiple Rx channels as common Rx channel */ + uint32_t commonTxMask; /*!< Common Tx channels mask. It should be 0 if there is no common Tx channel. + It can have multiple bits set, Koror can have multiple Tx channels as common Tx channel */ +} adi_adrv904x_RadioCtrlAntCalCarrierCfgInit_t; + +/** + * \brief Data structure to hold antenna calibration configuration + */ +typedef struct adi_adrv904x_RadioCtrlAntCalCarrierCfg +{ + uint32_t patternId; /*!< Pattern id to switch when antenna cal pin is asserted */ + uint8_t numOfGpioToSwitchCarrier; /*!< Number of pattern groups (number of GPIO pin assertions) to switch to next carrier gain */ + uint8_t carrierTable[ADI_ADRV904X_CARRIER_TABLE_COUNT]; /*!< Carrier gain table to be used during antenna cal. this table should be the order of carrier + id's to be calibrated. If not all carriers will be calibrated, table should be padded with 255. + E.g. if just calibrate C0/C1/C2/C3 table should have 0, 1, 2, 3, 255, 255, 255, 255 */ + uint8_t firstPatternNumberOfLoops; /*!< Number of loops for the first pattern during antenna cal */ + uint8_t secondPatternNumberOfLoops; /*!< Number of loops for the second pattern during antenna cal */ + int32_t rxCarrierGainForAntCal[ADI_ADRV904X_MAX_RX_CARRIERS]; /*!< Gain value for each Rx carriers, range from -90000 to 36000, unit, mdB */ + int32_t txCarrierGainForAntCal[ADI_ADRV904X_MAX_TX_CARRIERS]; /*!< Gain value for each Tx carriers, range from -90000 to 36000, unit, mdB */ +} adi_adrv904x_RadioCtrlAntCalCarrierCfg_t; + + + +/** + * \brief Data structure to hold DFE Control Mode Specific Tx to ORx configuration settings. Not for use in RCI mode. + */ +typedef struct adi_adrv904x_DfeCtrlTxToOrxMappingConfig +{ + uint16_t txObservability; /*!< Tx observability word. This is a bitmask consisting of eight 2bit-pairs (nibbles), where each nibble makes a Tx channel observable by either ORx0 (set nibble to 2'b01 = 1), ORx1 (set nibble to 2'b10 = 2), or neither (set nibble to 2'b00 = 0). It is not allowed for a single Tx channel to be observable on both ORx0 and ORx1 (e.g. setting a nibble to 2'b11 = 3 is invalid). For example, setting B0 = Tx0 obs by ORx0, B1 = Tx0 obs by Orx1, ..., B8 = Tx4 obs by Orx0, B9 = Tx4 obs on Orx1, ..., B14 = Tx7 obs by Orx0, B15 = Tx7 obs on Orx1 */ + adi_adrv904x_TxToOrxMappingMode_e mode; /*!< Tx to ORx Mapping Mode */ + adi_adrv904x_GpioGenericPinSel_e gpioSelectOrx0[ADI_ADRV904X_DFE_CTRL_TX_TO_ORX_MAPPING_GPIO_MAX]; /*!< Select up to 4 Digital/Analog GPIO output pins to drive based on current Mapping for Orx0*/ + adi_adrv904x_GpioGenericPinSel_e gpioSelectOrx1[ADI_ADRV904X_DFE_CTRL_TX_TO_ORX_MAPPING_GPIO_MAX]; /*!< Select up to 4 Digital/Analog GPIO output pins to drive based on current Mapping for Orx1*/ + uint32_t pinTableOrx0[ADI_ADRV904X_TX_TO_ORX_MAPPING_PIN_TABLE_SIZE]; /*!< Select GPIO output pin states to drive for any given Tx to ORx Mapping of Orx0 */ + uint32_t pinTableOrx1[ADI_ADRV904X_TX_TO_ORX_MAPPING_PIN_TABLE_SIZE]; /*!< Select GPIO output pin states to drive for any given Tx to ORx Mapping of Orx1 */ + uint8_t autoSwitchOrxAttenEnable; /*!< Auto-switching of Orx Atten value enabled. 0 = Disabled. 1 = Enabled */ + uint8_t autoSwitchOrxNcoEnable; /*!< Auto-switching of Orx NCO frequency enabled. 0 = Disabled. 1 = Enabled */ +} adi_adrv904x_DfeCtrlTxToOrxMappingConfig_t; + +/** +* \brief Data structure to hold DTX input pin assignments. +*/ +typedef struct adi_adrv904x_DtxInputPinCfg +{ + adi_adrv904x_GpioPinSel_e dtxInput[ADI_ADRV904X_DTX_INPUT_MAX]; /*!< Enable DTX pin input to ADRV904X stream processor input. To enable set dtxInput[0]=GPIO_00, dtxInput[1]=GPIO_01,,etc. To disable select ADI_ADRV904X_GPIO_INVALID */ + uint32_t dtxEventWaitTimeNs; /*!< DTX Event Wait Time in [ns] */ +} adi_adrv904x_DtxInputPinCfg_t; + +/** +* \brief Data structure to hold Stream GPIO AntCal Output pin assignments loaded in Stream Processor binary +*/ +typedef struct adi_adrv904x_StreamGpioAntCalOutCfg +{ + adi_adrv904x_GpioGenericPinSel_e gpioSelect[ADI_ADRV904X_MAX_STREAM_GPIO_ANTENNA_CAL_OUT_PINS]; /*!< Stream GPIO Antenna Cal Output assignments */ +} adi_adrv904x_StreamGpioAntCalOutCfg_t; + +/** +* \brief Data structure to hold Model Switch input pin assignments. +*/ +typedef struct adi_adrv904x_ModelSwitchInputPinCfg +{ + adi_adrv904x_GpioPinSel_e modelSwitchInput[ADI_ADRV904X_MODEL_SWITCH_INPUT_MAX]; /*!< Enable Model Switch pin input to ADRV904X stream processor input. To enable set modelSwitchInput[0]=GPIO_00, modelSwitchInput[1]=GPIO_01,,etc. To disable select ADI_ADRV904X_GPIO_INVALID */ +} adi_adrv904x_ModelSwitchInputPinCfg_t; + +/** +* \brief Data structure to hold DTX fanout to PA_EN outputs for all TX channels +*/ +typedef struct adi_adrv904x_DtxFanoutToPaEnCfg +{ + uint32_t fanout[ADI_ADRV904X_MAX_TXCHANNELS]; /*!< Select PA_EN outputs to be driven by DTX for any given Tx. */ +} adi_adrv904x_DtxFanoutToPaEnCfg_t; +#endif /* RADIOCTRL_TYPES */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_rx.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_rx.h new file mode 100644 index 00000000000..3c7823ffd8c --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_rx.h @@ -0,0 +1,1278 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adi_adrv904x_rx.h + * \brief Contains ADRV904X receive related function prototypes for + * adi_adrv904x_rx.c + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADI_ADRV904X_RX_H_ +#define _ADI_ADRV904X_RX_H_ + +#include "adi_adrv904x_rx_types.h" +#include "adi_adrv904x_error.h" + +#include "adi_adrv904x_carrier_reconfigure_types.h" + +/**************************************************************************** + * Initialization functions + **************************************************************************** + */ + + /** + * \brief Programs the gain table settings for Rx channels. + * + * This function can be called by the user to load a custom gain table or + * to reconfigure the gain table.The gain table for a receiver type is set with the + * parameters passed by adi_adrv904x_RxGainTableRow_t gainTablePtr array. + * The array length (n) is dependent upon receiver type. + * The (n) value is conveyed by numGainIndicesInTable. + * All gain tables have a maximum index and a minimum index specified by + * MAX_RX_GAIN_TABLE_NUMINDICES and MIN_RX_GAIN_TABLE_INDEX + * The minimum gain index is application dependent, this can be modified + * in the user space, the absolute maximum and minimum indices are specified + * by MAX_GAIN_TABLE_INDEX and MIN_GAIN_TABLE_INDEX + * + * The Rx max gain index is user configurable. A separate call has to be made + * to adi_adrv904x_RxMinMaxGainIndexSet() API to update the min and max gain + * indices for a given Rx Channel. Updating min and max gain indices are + * decoupled from the main gain table loading so that the user has flexibility + * to load multiple gain table regions and switch between them during runtime. + * + * The gain table configs can be broadcast / multicast based on the channel mask + * parameter in adi_adrv904x_RxGainTableCfg_t structure. + * + *| rxChannelMask | Rx Channels Programmed | + *|:------------------------------------:|:-------------------------------------:| + *| bit[0] = 1 | Enables Rx0 gain table programming---| + *| bit[1] = 1 | Enables Rx1 gain table programming---| + *| bit[2] = 1 | Enables Rx2 gain table programming---| + *| bit[3] = 1 | Enables Rx3 gain table programming---| + *| bit[4] = 1 | Enables Rx4 gain table programming---| + *| bit[5] = 1 | Enables Rx5 gain table programming---| + *| bit[6] = 1 | Enables Rx6 gain table programming---| + *| bit[7] = 1 | Enables Rx7 gain table programming---| + * + * Eg: To program the same gain table to channels Rx0 and Rx4, the rxChannelMask + * should be set to 0x00000011 + * + * Eg: To program a single gain table to all channels, the rxChannelMask + * should be set to 0x000000FF + * + * Partial gain table loads can be done through this API in case of memory constraints / multiple region loading + * For example, consider a 256 row gain table which needs to be loaded in 4 consecutive calls. + * In this case the config parameters for partial loads would be + * Partial Load 1 : gainTableRow[] = gainTable[63:0], gainIndexOffset = 63, numGainIndicesInTable = 64 + * Partial Load 2 : gainTableRow[] = gainTable[127:64], gainIndexOffset = 127, numGainIndicesInTable = 64 + * Partial Load 3 : gainTableRow[] = gainTable[191:128], gainIndexOffset = 191, numGainIndicesInTable = 64 + * Partial Load 4 : gainTableRow[] = gainTable[255:192], gainIndexOffset = 255, numGainIndicesInTable = 64 + * + * Post this multiple partial gain table load, call the function adi_adrv904x_RxMinMaxGainIndexSet(minIndex = 0, maxIndex = 255). + * + * \pre This function called automatically in adi_adrv904x_Initialize() to load + * the default gain table. If the BBIC desires to change or update the + * gain table, it may call this function after initialization but before + * running init cals. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep{device->devStateInfo} + * \dep_end + * + * \param[in,out] device Context variable - Context variable - Structure pointer to the ADRV904X device data structure + * \param[in] rxChannelMask is the set of channels for which current gain table settings are to be programmed. + * Valid Rx channels include Rx0-Rx7 + * \param[in] gainIndexOffset is the starting gain index from which gain table is programmed + * \param[in] gainTableRow Array of gain table row entries for programming + * \param[in] arraySize is the number of gain table rows to be programmed + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxGainTableWrite(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const uint8_t gainIndexOffset, + const adi_adrv904x_RxGainTableRow_t gainTableRow[], + const uint32_t arraySize ); +/** +* \brief Reads the gain table entries for Rx channels requested. +* +* This function can be called by the user to read back the currently programmed gain table +* for a given channel. This function reads the current gain table settings from ADRV904X gain table Static RAMs +* for the requested channel and stores it in the provided memory reference of type adi_adrv904x_RxGainTableCfg_t +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in,out] device Context variable - Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] rxChannel represents the channels for which gain table read back is requested. +* Valid Rx channels include Rx0-Rx7 +* \param[in] gainIndexOffset is the gain index from which gain table read back should start +* \param[in,out] gainTableRow Read back array for gain table row entries which will be updated with the read back values +* \param[in] arraySize is the size of gainTableRow array. It is also the upper limit for the no. of gain indices to read +* \param[out] numGainIndicesRead is the actual no. of gain indices read from SRAM (output). A NULL can be passed +* if the value of no. of gain indices actually read is not required. +* +* \pre This function can be called by the user anytime after initialization. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxGainTableRead(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + const uint8_t gainIndexOffset, + adi_adrv904x_RxGainTableRow_t gainTableRow[], + const uint32_t arraySize, + uint16_t* const numGainIndicesRead); + +/** +* \brief Updates the minimum and maximum gain indices for a requested Rx Channel +* in the device data structure +* +* This function is required to be called by the user right after loading the gain table. +* This function is decoupled from the gain table loading function so that a user has +* flexibility to load multiple gain table regions and switch between multiple gain table +* regions during runtime +* +* The gain table configs can be broadcast / multicast based on the channel mask +* parameter in adi_adrv904x_RxGainTableCfg_t structure. +* +*| rxChannelMask | Rx Channel min & max gain indices updated | +*|:------------------------------------:|:----------------------------------------------:| +*| bit[0] = 1 | Updates Rx0 min & max gain indices------------| +*| bit[1] = 1 | Updates Rx1 min & max gain indices------------| +*| bit[2] = 1 | Updates Rx2 min & max gain indices------------| +*| bit[3] = 1 | Updates Rx3 min & max gain indices------------| +*| bit[4] = 1 | Updates Rx4 min & max gain indices------------| +*| bit[5] = 1 | Updates Rx5 min & max gain indices------------| +*| bit[6] = 1 | Updates Rx6 min & max gain indices------------| +*| bit[7] = 1 | Updates Rx7 min & max gain indices------------| + +* +* Eg: To update min and max gain indices of channels Rx4 and Rx0, the rxChannelMask +* should be set to 0x00000011 +* +* Eg: To update min and max gain indices of all Rx channels, the rxChannelMask +* should be set to 0x000000FF +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in,out] device Context variable - Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] rxChannelMask channel masks for which min and max gain indices are to be updated +* \param[in] minGainIndex is the lower limit of the gain index for a given channel +* \param[in] maxGainIndex is the upper limit of the gain index for a given channel +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxMinMaxGainIndexSet(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const uint8_t minGainIndex, + const uint8_t maxGainIndex); + +/** +* \brief Enable or disable the routing of the external control word from an Rx channel's +* gain table to its external analog GPIO pins. +* +* Typically, these signals are used to control an external LNA. +* The two LSBs of the external control word for Rx channel 0 are output on GPIO_ANA[0:1] +* (the LSB itself on GPIO_ANA0) and so on for the other channels up to Rx channel 7 +* whose external control word is output on GPIO_ANA[14:15]. The mapping from Rx channel +* to analog GPIO pins is fixed. It can be enabled or disabled but the mapping cannot +* be changed. See Full Table below. +* +* If external control for a channel is disabled then it's corresponding analog GPIOs +* are placed in input/high-Z mode. +* +* If rxChannelMask = 0, this is allowed and function will reduce to a No-op command +* +* Rx Channel Analog GPIO pins Table: +* RX0 Gain Control Word [1:0] : GPIO_ANA[1:0] +* RX1 Gain Control Word [1:0] : GPIO_ANA[3:2] +* RX2 Gain Control Word [1:0] : GPIO_ANA[5:4] +* RX3 Gain Control Word [1:0] : GPIO_ANA[7:6] +* RX4 Gain Control Word [1:0] : GPIO_ANA[9:8] +* RX5 Gain Control Word [1:0] : GPIO_ANA[11:10] +* RX6 Gain Control Word [1:0] : GPIO_ANA[13:12] +* RX7 Gain Control Word [1:0] : GPIO_ANA[15:14] +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{device->devStateInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] rxChannelMask Channel bit-mask indicating the Rx channels affected by the call. +* \param[in] channelEnable Enable bit-mask indicating the final state of the channels included in rxChannelMask +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxGainTableExtCtrlPinsSet(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const uint32_t channelEnable); + +/**************************************************************************** + * Runtime functions + **************************************************************************** + */ + + /** + * \brief Sets the Rx Channel Manual Gain Index + * + * If the value passed in the gainIndex parameter is within range of the gain + * table minimum and maximum indices, the Rx channel gain index will be written + * to the transceiver. Else, an error will be returned. The maximum index is 255 + * and the minimum index is application specific. + * + * The default gain table can take values between 0xB7 and 0xFF, + * even though every index is accessible from 0x00 to 0xFF. + * + * \pre This function may be called any time after device initialization + The device must NOT be in spi streaming mode due to this function utilizing the hal layer directly. + If the device is in spi streaming mode, this function may not behave as expected. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure + * \param[in] rxGain is the channelized gain setting parameter + * \param[in] arraySize Size of rxGain array representing no. of configs. + * + * The gain table configs can be broadcast / multicast based on the channel mask + * parameter in adi_adrv904x_RxGain_t structure. + * + *| rxGain[i]->rxChannelMask | Rx Channels to set manual gain | + *|:----------------------------------:|:----------------------------------:| + *| bit[0] | 1 = Rx0 manual gain is updated | + *| bit[1] | 1 = Rx1 manual gain is updated | + *| bit[2] | 1 = Rx2 manual gain is updated | + *| bit[3] | 1 = Rx3 manual gain is updated | + *| bit[4] | 1 = Rx4 manual gain is updated | + *| bit[5] | 1 = Rx5 manual gain is updated | + *| bit[6] | 1 = Rx6 manual gain is updated | + *| bit[7] | 1 = Rx7 manual gain is updated | + * + * Eg: To update manual gain for channels Rx3 and Rx0, the rxGain[i]->rxChannelMask + * should be set to 0x00000009 + * + * Eg: To update manual gain for all Rx channels, the rxGain[i]->rxChannelMask + * should be set to 0x000000FF + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxGainSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxGain_t rxGain[], + const uint32_t arraySize); + +/** +* \brief Reads the Rx MGC Gain Index for the requested Rx channel +* +* This function reads the gain index for the passed channel Rx0-Rx7 +* +* This function reads back the Manual gain index per channel, depending on the gain control mode. +* +* \pre This function may be called any time after device initialization. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X data structure +* \param[in] rxChannel Channel selection to read back gain index for (Valid Rx0-Rx7 only) +* \param[out] rxGain Pointer to the specified channel gain index value +* which will be updated by this function +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxMgcGainGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_RxGain_t * const rxGain); + +/** +* \brief Reads the Rx AGC Gain Index for the requested Rx channel +* +* This function reads the gain index for the passed channel Rx0-Rx7 +* +* This function reads back the AGC gain index per channel, depending on the gain control mode. +* +* +* \pre This function may be called any time after device initialization. +* However, gain indices are tracked only after the device goes into a +* Receiver mode. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X data structure +* \param[in] rxChannel Channel selection to read back gain index for (Valid Rx0-Rx7 only) +* \param[out] rxGain Pointer to the specified channel gain index value +* which will be updated by this function +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxGainGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_RxGain_t * const rxGain); + + +/** +* \brief Retrieves the Rx data path format configuration. +* +* This function will read the current configuration of Rx Data format over the JESD link. +* This function also reads back the current configuration of slicer and formatter blocks +* in the receive signal chain. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the device settings structure +* \param[in] rxChannel The channel for which Rx data path format configuration is requested +* \param[out] rxDataFormat Pointer to the Rx data format configuration structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxDataFormatGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_RxDataFormatRt_t * const rxDataFormat); + +/** +* \brief Sets RX CDDC Formatter configuration (see adrv904x_RxDataFormatSet for details) +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Structure pointer to the ADRV904X device data structure +* \param[in] cddcDataFormat Pointer to the Rx data format configuration structure +* \param[in] arraySize Size of rxDataFormat array representing no. of configs +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CddcDataFormatSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CddcDataFormatRt_t cddcDataFormat[], + const uint32_t arraySize); + +/** +* \brief Retrieves the Cddc data path format configuration. +* +* This function will read the current configuration of Cddc Data format over the JESD link. +* This function also reads back the current configuration of slicer and formatter blocks +* in the receive signal chain. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the device settings structure +* \param[in] rxChannel The channel for which Rx data path format configuration is requested +* \param[out] cddcDataFormat Pointer to the CDDC data format configuration structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CddcDataFormatGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_CddcDataFormatRt_t * const cddcDataFormat); + + +/** +* \brief Gets the gain slicer position +* +* Before this information is valid, the Rx gain compensation feature should be enabled with +* the integer gain slicer sample format enabled. See the adrv904x_RxDataFormatSet function +* to enable gain compensation. This function is not useful in the case of using floating point +* as the gain slicer (data scaling) is applied in the floating point scaled sample. This function +* is also not valid if the selected data format is external slicer mode. +* +* The slicer position is only needed for integer 12bit and 16bit formats. The 24bit sample format +* already applies scaling in the 24bit sample. The data can be scaled in steps of 1dB, 2dB, 4dB, +* 6dB, 8dB configured through the adrv904x_RxDataFormatSet function. +* +* Slicer Position[2:0] | Description +* ---------------------|--------------------------------------------- +* 0 | 0dB gain +* 1 | Rx Data samples should be scaled by 1 x step size(dB) +* 2 | Rx Data samples should be scaled by 2 x step size(dB) +* 3 | Rx Data samples should be scaled by 3 x step size(dB) +* 4 | Rx Data samples should be scaled by 4 x step size(dB) +* 5 | Rx Data samples should be scaled by 5 x step size(dB) +* 6 | Rx Data samples should be scaled by 6 x step size(dB) +* 7 | Rx Data samples should be scaled by 7 x step size(dB) +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X data structure +* \param[in] rxChannel Channel selection to read back gain index for +* \param[out] slicerPosition Pointer to byte which returns the slicer position bits for the requested channel. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxSlicerPositionGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + uint8_t * const slicerPosition); + +/** +* \brief This function reads back the LO Source Mapping to the requested Rx channel. +* +* The LO source select for a given channel is configured during init time. This function +* can be used to read back the configuration during run time. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X data structure +* \param[in] rxChannel Enum to select Rx Channel +* \param[out] rxLoSource Pointer to store Rx channel LO source mapping read back +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxLoSourceGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_LoSel_e * const rxLoSource); + +/** +* \brief Sets the specified Rx NCOs to the given frequency, band number, and enable state in the adi_adrv904x_RxNcoConfig_t structure. +* +* \pre This function can be called after the CPU has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in,out] rxNcoConfig Pointer to the RX NCO config settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxNcoShifterSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxNcoConfig_t * const rxNcoConfig); + +/** +* \brief Gets RX NCO parameters in adi_adrv904x_RxNcoConfigReadbackResp_t structure. +* +* \pre This function can be called after the CPU has been initialized, firmware loaded and the RX NCO configured. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in,out] rxRbConfig Pointer to the RX NCO config read back settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxNcoShifterGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_RxNcoConfigReadbackResp_t* const rxRbConfig); + +/** +* \brief Set RX CDDC NCO parameters in adi_adrv904x_RxCddcNcoConfig_t structure. +* +* \pre This function can be called after the CPU has been initialized, firmware loaded and the RX CDDC NCO configured. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in,out] rxNcoConfig Pointer to the RX CDDC NCO config settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCddcNcoSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxCddcNcoConfig_t* const rxNcoConfig); + +/** +* \brief Set RX CDDC NCO parameters in adi_adrv904x_RxCddcNcoConfigReadbackResp_t structure. +* +* \pre This function can be called after the CPU has been initialized, firmware loaded and the RX CDDC NCO configured. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in,out] rxRbConfig Pointer to the RX CDDC NCO config get settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCddcNcoGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_RxCddcNcoConfigReadbackResp_t* const rxRbConfig); + +/** +* \brief Sets the specified Orx NCOs to the given frequency, band number, and enable state in the adi_adrv904x_ORxNcoConfig_t structure. +* +* This function will also update all Tx To Orx Mapping preset NCO ADC frequencies when called, with the frequency passed. If no preset +* frequencies should be overwritten, refer to OrxNcoSet_v2. +* +* \pre This function can be called after the CPU has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in,out] orxNcoConfig Pointer to the ORX NCO config settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_OrxNcoSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_ORxNcoConfig_t * const orxNcoConfig); + +/** +* \brief Sets the specified Orx NCOs to the given frequency, band number, and enable state in the adi_adrv904x_ORxNcoConfig_t structure. +* +* Different than OrxNcoSet(), this function does not interact or update the Tx to Orx Mapping presets when called, it writes and updates +* the NCO frequencies directly. If the Tx To Orx Mapping selection is changed the NCO frequencies will revert to the preset values. +* +* \pre This function can be called after the CPU has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in,out] orxNcoConfig Pointer to the ORX NCO config settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_OrxNcoSet_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_ORxNcoConfig_t * const orxNcoConfig); + +/** +* \brief Gets ORX NCO parameters in adi_adrv904x_OrxNcoConfigReadback_t structure. +* +* \pre This function can be called after the CPU has been initialized, firmware loaded and the ORX NCO configured. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in,out] orxRbConfig Pointer to the ORX NCO config read back settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_OrxNcoGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_ORxNcoConfigReadbackResp_t* const orxRbConfig); + +/** +* \brief Function to configure Rx decimated power measurement block. +* +* This function can be used to configure decimated power measurements. User can either manually enable/disable +* decimated power measurements or allow AGC block to control power measurements. Measurement point can be selected +* for main path decimated power block only. This function configures Rx dec power block. For Orx dec power block +* please use adi_adrv904x_ORxDecimatedPowerCfgSet function +* Note: The function does not check for duplicated channel assignments across cfg structures. +* Invalid channel mask values will return an error. + +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] rxDecPowerCfg array of structures of type adi_adrv904x_RxDecimatedPowerCfg_t which will configure one or more channels +* \param[in] numOfDecPowerCfgs number of configurations passed in the array +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxDecimatedPowerCfgSet(adi_adrv904x_Device_t * const device, + adi_adrv904x_RxDecimatedPowerCfg_t rxDecPowerCfg[], + const uint32_t numOfDecPowerCfgs); + +/** +* \brief Function to read back Rx decimated power measurement configuration +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] rxChannel Rx channel selection to read decimated power block configuration +* \param[in] decPowerBlockSelection Decimated power block selection to read back configuration +* \param[out] rxDecPowerCfg Decimated power configuration of selected channel/dec power block +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxDecimatedPowerCfgGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + const adi_adrv904x_DecPowerMeasurementBlock_e decPowerBlockSelection, + adi_adrv904x_RxDecimatedPowerCfg_t * const rxDecPowerCfg); + +/** +* \brief Function to readback the decimated power measurement for selected Rx/Orx channel. +* Power readback value is an unsigned 8 bit value with 0.25dB resolution. +* This function can be used to read power measurements for both Rx and Orx channels + +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] rxChannel Channel selection to read decimated power measurement +* \param[in] decPowerBlockSelection Decimated power block selection (unused for Orx channel selections) +* \param[out] powerReadBack Pointer to power measurement readback value +* +* \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxDecimatedPowerGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + const adi_adrv904x_DecPowerMeasurementBlock_e decPowerBlockSelection, + uint8_t * const powerReadBack); + +/** + * \brief Set the attenuation of one or several ORx channels. Attenuation is 0 - 17dB, in steps of 1dB. + * + * \pre This function can be called after the CPU has been initialized, firmware loaded and the ORX NCO configured. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in,out] device Context variable adi_adrv904x_Device_t pointer to the device data structure. + * \param [in] channelMask uint32_t indicates the channels affected. + * \param [in] attenDb uint8_t indicates the attenuation level to apply in Db. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_OrxAttenSet(adi_adrv904x_Device_t* const device, + const uint32_t channelMask, + const uint8_t attenDb); + +/** + * \brief Get the attenuation of an ORx channel. + * + * \param [in, out] device Context variable adi_adrv904x_Device_t pointer to the device data structure. + * \param [in] channelId uint8_t indicates the channels affected. + * \param [out] attenDb uint8_t the channel's attenuation value is written here. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_OrxAttenGet(adi_adrv904x_Device_t* const device, + const uint8_t channelId, + uint8_t* const attenDb); + +/** + * \brief set the Rx gain control mode + * + * \brief The Gain Control Mode for Rx signal can be set to MGC and AGC + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in,out] device Context variable adi_adrv904x_Device_t pointer to the device data structure + * \param [in] gainCtrlModeCfg array to be configured. Parameter is of structure type adi_adrv904x_RxGainCtrlModeCfg_t + * \param [in] arraySize is the no. of elements in gainCtrlModeCfg[] array + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxGainCtrlModeSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxGainCtrlModeCfg_t gainCtrlModeCfg[], + const uint32_t arraySize); + +/** + * \brief get the Rx gain control mode with Rx channel index + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in,out] device Context variable adi_adrv904x_Device_t pointer to the device data structure + * \param [in] rxChannel indicates the Rx channel affected. + * \param [out] gainCtrlMode is the pointer to adi_adrv904x_RxGainCtrlMode_e enum which will + * be updated with the read back config + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxGainCtrlModeGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_RxGainCtrlMode_e* gainCtrlMode); + +/** + * \brief This function sets the temperature gain compensation parameter for Rx channel only + * + * This function can be called at any point. The gain can be configured + * from -6.3 dB to 6.3 dB in 0.1 dB step. Hence allowable range is + * [-63 to +63] with 0 representing 0 dB. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in,out] device Context variable adi_adrv904x_Device_t pointer to the device data structure + * \param [in] rxChannelMask Bit mask representing channels to be programmed (can be multiple channels). + * \param [in] gainValue Gain value to set + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxTempGainCompSet(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const int8_t gainValue); + +/** + * \brief This function gets the temperature gain compensation parameter for Rx channel only. + * Only one channel can be retrieved per call + * + * This function can be called at any point. The gain returned is in the + * range -63 to 63, this means -6.3 dB to 6.3 dB + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in,out] device Context variable adi_adrv904x_Device_t pointer to the device data structure + * \param [in] rxChannel Bit mask representing which channel to retrieve (only one channel returned per call) + * \param [out] gainValue Gain value retrieved + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxTempGainCompGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + int8_t* const gainValue); + +/** + * \brief Allows the data from one or more Rx ADCs to be replaced with a test signal. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in,out] device Context variable adi_adrv904x_Device_t pointer to the device data structure + * \param [in] rxChannelMask Indicates the channels to be affected by the call. + * \param [in] rxTestDataCfg Indicates whether the ADC output signal should be replaced by a test signal for the + * channels in rxChannelMask or whether the normal ADC output should be used. Also describes the test signal. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxTestDataSet(adi_adrv904x_Device_t* device, + const uint32_t rxChannelMask, + const adi_adrv904x_RxTestDataCfg_t* const rxTestDataCfg); + +/** + * \brief Check if the data from an Rx ADC is currently being replaced with a test signal and + * if so retrieves the parameters of the test signal. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in,out] device Context variable adi_adrv904x_Device_t pointer to the device data structure + * \param [in] rxChannel The channel whose information to get. + * \param [out] rxTestDataCfg Indicates whether the Rx ADC signal is being replaced by a test signal + * and if so also the parameters of the test signal. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxTestDataGet(adi_adrv904x_Device_t* device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_RxTestDataCfg_t* const rxTestDataCfg); + +/** +* \brief Controls whether Rx LO mixer is powered down or not when an Rx channel is disabled. +* +* By default the LO is powered down when the Rx is disabled. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param [in,out] device Context variable adi_adrv904x_Device_t pointer to the device data structure +* \param [in] rxChannelMask The Rx channels to affect. Must include at least one channel from Rx0 to Rx7. +* \param [in] enable To change the default behavour and skip the Rx LO mixer power down for the channels in +* rxChannelMask set 'enable' to ADI_DISABLE. Restore the default by setting to ADI_ENABLE. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxLoPowerDownSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannelMask, + const uint8_t enable); + + +/** + * \brief Configure Rx Carrier RSSI (Recieved Signal Strength Indicator). + * + * This function can be used to configure Rx Carrier RSSI's. + * Note: The function does not check for duplicated channel assignments across cfg structures. + * Invalid rxCarrier mask values will return an error + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[in] rxCarrierRssiCfg array of structures of type adi_adrv904x_RxCarrierRssiCfg_t which will configure one or more channels/carriers + * \param[in] numCfgs number of configurations passed in the array + * + * \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierRssiCfgSet(adi_adrv904x_Device_t * const device, + adi_adrv904x_RxCarrierRssiCfg_t rxCarrierRssiCfg[], + const uint32_t numCfgs); + +/** + * \brief Readback Rx Carrier RSSI (Recieved Signal Strength Indicator) configuration. + * + * Invalid channel mask values will return an error. Must select a single + * rxChannel and single rxCarrier combination in mask to be valid. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[in] rxCarrierMask Rx Carrier selection to read RSSI configuration. + * carrierMask takes single value from adi_adrv904x_RxCarrier_e, rxChannelMask allows only single value from adi_adrv904x_RxChannels_e. + * \param[out] cfg Rx Carrier RSSI configuration of selected Rx Carrier + * + * \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierRssiCfgGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxCarrierMask_t * const rxCarrierMask, + adi_adrv904x_RxCarrierRssiCfg_t * const cfg); + +/** +* \brief Enable/Disable Rx Carrier RSSIs +* +* This function is used to enable/disable Rx Carrier RSSIs after configuring +* them as desired using adi_adrv904x_RxCarrierRssiCfgSet(). If measMode = IMMEDIATE, +* an RSSI transition from Disabled to Enabled will automatically trigger the start +* of a measurement. In other measMode's, enabled RSSI measurements will start after +* it's Channels RxOn signal (delayed by RSSI's configured startDelay value). +* +* rxCarrierMask Parameter: +* The bits set in this bit-mask indicate the Rx Carrier RSSIs affected by this call respectively. +* Rx Channels and Carriers whose bit are not set to 1 in this parameter will not be affected by this function call. +* Whether an affected carrier is to be enabled or disabled is indicated by the bit in +* the rxCarrierEnable parameter. The first carrier is indicated by the least significant bit, +* the second carrier by the next least significant and so on. It is an error to set a bit corresponding +* to a non-existent Rx Carrier. +* +* rxCarrierEnable Parameter: +* A bit mask indicating if the Rx Carrier is to be enabled (1) or disabled. (0). +* Bits relate to Rx Carriers in the same manner as the rxCarrierMask parameters. +* If the bit for a Rx Carrier in the rxCarrierMask is not set, then the bit +* in this parameters has no effect. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] rxCarrierMask Mask to select Rx Carrier RSSIs to be affected with this function call +* \param[in] rxCarrierEnable Mask to enable/disable selected Rx Carrier RSSIs +* +* \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierRssiEnable(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxCarrierMask_t * const rxCarrierMask, + const uint32_t rxCarrierEnable); + +/** +* \brief Manual Start Rx Carrier RSSIs +* +* This function is used to manually start any Enabled Rx Carrier RSSIs. No matter which +* measMode is configured, if a target RSSI is enabled, a measurement will start. +* +* rxCarrierMask Parameter: +* The bits set in this bit-mask indicate the Rx Carrier RSSIs affected by this call respectively. +* Rx Channel and Carriers whose bit are set to 1 in this parameter will be started by this function call. +* The first carrier is indicated by the least significant bit, the second carrier by +* the next least significant and so on. It is an error to set a bit corresponding +* to a non-existent Rx Carrier. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] rxCarrierMask Mask to select Rx Carrier RSSIs to be manually started with this function call +* +* \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierRssiManualStart(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxCarrierMask_t * const rxCarrierMask); + +/** + * \brief Manual Pause/Resume Rx Carrier RSSIs + * + * This function is used to manually pause/resume Rx Carrier RSSIs. + * + * rxCarrierMask Parameter: + * The bits set in this bit-mask indicate the Rx Carrier RSSIs affected by this call respectively. + * Rx Channel and Carriers whose bit are not set to 1 in this parameter will not be affected by this function call. + * Whether an affected carrier is to be paused or resumed is indicated by the bit in + * the rxCarrierPause parameter. The first carrier is indicated by the least significant bit, + * the second carrier by the next least significant and so on. It is an error to set a bit corresponding + * to a non-existent Rx Carrier. + * + * rxCarrierPause Parameter: + * A bit mask indicating if the Rx Carrier is to be paused (1) or resumed (0). + * Bits relate to Rx Carriers in the same manner as the rxCarrierMask parameters. + * If the bit for a Rx Carrier in the rxCarrierMask is not set, then the bit + * in this parameters has no effect. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[in] rxCarrierMask Mask to select Rx Carrier RSSIs to be affected with this function call + * \param[in] rxCarrierPause Mask to pause/resume selected Rx Carrier RSSIs + * + * \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierRssiManualPause(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxCarrierMask_t * const rxCarrierMask, + const uint32_t rxCarrierPause); + +/** +* \brief Configure Rx Carrier RSSI GPIO pin selections +* +* This function can be used to configure Rx Carrier RSSI's GPIO pins. All Rx Channels +* are configured at once, both input and output pins. Rx Channels can share Input GPIOs, +* but Output GPIO selections must be unique. In general, GPIOs that are selected must +* not be allocated for use in other features when calling this function. If any GPIO +* selection made in this function call is already allocated, an error will be returned. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] gpioCfg Pointer to structure containing all Rx Carrier RSSI GPIO pin selections +* +* \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierRssiGpioCfgSet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxCarrierRssiGpioCfg_t * const gpioCfg); + +/** + * \brief Readback Rx Carrier RSSI GPIO pin configuration. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[out] gpioCfg Pointer to structure to populate with all Rx Carrier RSSI GPIO pin selections + * + * \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierRssiGpioCfgGet(adi_adrv904x_Device_t * const device, + adi_adrv904x_RxCarrierRssiGpioCfg_t * const gpioCfg); + + +/** + * \brief Readback most recent power measurement from a Rx Carrier RSSI in mdB. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[in] rxCarrierMask Rx Carrier selection from which to read RSSI power measurement. + * carrierMask takes single value from adi_adrv904x_RxCarrier_e, rxChannelMask allows only single value from adi_adrv904x_RxChannels_e. + * \param[out] gain_mdB Pointer to location to store power measurement result for selected Rx Carrier. Signed 32bit value, resolution 1 mdB. + * + * \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierRssiPowerRead(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxCarrierMask_t * const rxCarrierMask, + int32_t * const gain_mdB); + + /** + * \brief Adjust Rx Carrier Gain in mdB. Valid range is -90dB to +36dB. + * + * Note: Gain adjustment is converted to a linear gain value in 7.16 format + * internally, which will affect actual value applied. It is suggested to + * readback the actual value applied in this function by calling + * adi_adrv904x_RxCarrierGainAdjustGet() afterward. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[in] rxCarrierMask Rx Carrier selection from which to set the gain adjustment + * \param[in] gain_mdB Gain adjustment to make to selected Rx Carriers. Signed 32bit value, resolution 1 mdB + * + * \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierGainAdjustSet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxCarrierMask_t * const rxCarrierMask, + const int32_t gain_mdB); + +/** + * \brief Readback current Rx Carrier Gain Adjustment in mdB. Expected range is -90dB to +36dB. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[in] rxCarrierMask Rx Carrier selection from which to get the gain adjustment + * carrierMask takes single value from adi_adrv904x_RxCarrier_e, rxChannelMask allows only single value from adi_adrv904x_RxChannels_e. + * \param[out] gain_mdB Pointer to location to store current gain adjustment for selected Rx Carrier. Signed 32bit value, resolution 1 mdB. + * + * \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierGainAdjustGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxCarrierMask_t * const rxCarrierMask, + int32_t * const gain_mdB); + +/** +* \brief Reconfigure Rx carriers dynamically without reinitialization - Solving without applying solution to HW +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] jesdCfg - Pointer that holds the updated JESD settings to accomdate the new carrier settings +* \param[in] rxCarrierConfigs - Rx Carrier Reconfigure Settings. Struct may be modified by API for endianness before being passed to firmware. +* \param[in] rxCarrierChannelFilterApplicationSel - Rx Carrier Channel Filter application select for each carrier in each profile. The carriers here are applied to the corresponding channelMask in rxCarrierConfigs. +* \param[in] rxCarrierChannelFilter - Rx Carrier Channel Filter Settings. Struct may be modified by API for endianness before being passed to firmware. +* \param[in] numCarrierProfiles number of profiles passed in the arrays. Max is four. +* \param[in] useCustomFilters Select option to use custom filters or ADI presets: 0: Use rxCarrierChannelFilterApplicationSel, 1: Use rxCarrierChannelFilter +* +* \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxDynamicCarrierCalculate(adi_adrv904x_Device_t* const device, + adi_adrv904x_CarrierJesdCfg_t* const jesdCfg, + adi_adrv904x_CarrierRadioCfg_t rxCarrierConfigs[], + const adi_adrv904x_CarrierChannelFilterApplicationSel_t rxCarrierChannelFilterApplicationSel[], + adi_adrv904x_ChannelFilterCfg_t rxCarrierChannelFilter[], + const uint32_t numCarrierProfiles, + const uint8_t useCustomFilters); + +/** +* \brief Reconfigure Rx carriers dynamically without reinitialization - Apply previously solved configuration +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* +* \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxDynamicCarrierWrite(adi_adrv904x_Device_t* const device); + +/** +* \brief Reconfigure Rx carriers dynamically without reinitialization. Wrapper for adi_adrv904x_RxDynamicCarrierReconfigure to select channel filter coefficients +* provided by ADI +* +* Note: The API currently only uses the first profile in rxCarrierConfigs.carrierCfgs input struct. +* +* \pre Part must be put in the appropriate state for this function to work as intendend. At a minimum the following steps must have been performed: +* Disable tracking cals +* Disable PAs +* Disable Tx/Rx/ORx channels. GPIOs are not toggling +* +* +* \post After this function is called at a minimum the following steps must be performed before the device can be used as intended: +* Provide new CFR pulse/config thru API +* Change RFLO +* Re- Enable channels then tracking cals +* Re-Enable PAs +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] jesdCfg - Pointer that holds the updated JESD settings to accomdate the new carrier settings +* \param[in] rxCarrierConfigs - Rx Carrier Reconfigure Settings. Struct may be modified by API for endianness before being passed to firmware. +* \param[in] rxCarrierChannelFilterApplicationSel - Rx Carrier Channel Filter application select for each carrier in each profile. The carriers here are applied to the corresponding channelMask in rxCarrierConfigs. +* \param[in] numCarrierProfiles number of profiles passed in the arrays. Max is four. +* +* \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxDynamicCarrierReconfigureWithFilterSelect( adi_adrv904x_Device_t* const device, + adi_adrv904x_CarrierJesdCfg_t* const jesdCfg, + adi_adrv904x_CarrierRadioCfg_t rxCarrierConfigs[], + const adi_adrv904x_CarrierChannelFilterApplicationSel_t rxCarrierChannelFilterApplicationSel[], + const uint32_t numCarrierProfiles); + +/** +* \brief Reconfigure Rx carriers dynamically without reinitialization +* +* Note: The API currently only uses the first profile in rxCarrierConfigs.carrierCfgs input struct. +* +* \pre Part must be put in the appropriate state for this function to work as intendend. At a minimum the following steps must have been performed: +* Disable tracking cals +* Disable PAs +* Disable Tx/Rx/ORx channels. GPIOs are not toggling +* +* +* \post After this function is called at a minimum the following steps must be performed before the device can be used as intended: +* Provide new CFR pulse/config thru API +* Change RFLO +* Re- Enable channels then tracking cals +* Re-Enable PAs +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] jesdCfg - Pointer that holds the updated JESD settings to accomdate the new carrier settings +* \param[in] rxCarrierConfigs - Rx Carrier Reconfigure Settings. Struct may be modified by API for endianness before being passed to firmware. +* \param[in] rxCarrierChannelFilter - Rx Carrier Channel Filter Settings. Struct may be modified by API for endianness before being passed to firmware. +* \param[in] numCarrierProfiles number of profiles passed in the arrays. Max is four. +* +* \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxDynamicCarrierReconfigure( adi_adrv904x_Device_t* const device, + adi_adrv904x_CarrierJesdCfg_t* const jesdCfg, + adi_adrv904x_CarrierRadioCfg_t rxCarrierConfigs[], + adi_adrv904x_ChannelFilterCfg_t rxCarrierChannelFilter[], + const uint32_t numCarrierProfiles); + +/** +* \brief Retrieve the current Rx Carrier settings for the selected channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] rxChannel - Rx Channel to be retrieved +* \param[out] rxCarrierConfigs - Rx Carrier Reconfigure Settings +* \param[out] carrierRuntimeSettings - Rx Carrier Runtime Settings +* +* \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierSettingsGet( adi_adrv904x_Device_t* const device, + const uint32_t rxChannel, + adi_adrv904x_CarrierRadioCfg_t* const rxCarrierConfigs, + adi_adrv904x_CarrierRuntime_t* const carrierRuntimeSettings); + +/** +* \brief Retrieve the current rx jesd settings +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] rxCarrierJesdCfg - Rx Carrier Reconfigure Settings +* +* \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierJesdCfgGet( adi_adrv904x_Device_t* const device, + adi_adrv904x_CarrierJesdCfg_t* const rxCarrierJesdCfg); + +/** +* \brief Retrieve the current Rx Carrier delay value for the selected channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] rxChannel Channel selection to read latency values +* \param[out] rxCarrierLatencyCfg - Rx Carrier delay settings +* +* \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierLatencyGet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_CarrierReconfigLatencyCfg_t* const rxCarrierLatencyCfg); + +/** + * \brief Set the RSSI (DDC/CDDC) power measurement configuration + * This function sets the configuration of the RSSI (DDC/CDDC) power measurement. + * Must use adi_adrv904x_DfePwrMtrRssiEnable() to enable the meter. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] meterMask - DDC or CDDC type + * \param [in] channelMask - Rx channel number mask; multiple channels allowed + * \param [in] pPwrMtrRssiCfg - pointer to power meter config structure + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxRssiConfigSet(adi_adrv904x_Device_t* const device, + const uint16_t meterMask, + const uint32_t channelMask, + const adi_adrv904x_RxRssiCfg_t* const pPwrMtrRssiCfg); +/** + * \brief Get the RSSI (DDC/CDDC)power measurement configuration + * This function gets the configuration of the RSSI (DDC/CDDC) power measurement + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] meterSel - Meter mask; only one channel allowed + * \param [in] channelSel - Rx channel number mask; only one channel allowed + * \param [out] pPwrMtrRssiCfg - pointer to power meter config structure + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxRssiConfigGet(adi_adrv904x_Device_t* const device, + const uint16_t meterSel, + const uint32_t channelSel, + adi_adrv904x_RxRssiCfg_t* const pPwrMtrRssiCfg); + +/** + * \brief Enable RSSI (DDC/CDDC) power measurement + * This function enables the RSSI (DDC/CDDC) power measurement + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] meterMask - Meter mask; multiple meters allowed + * \param [in] channelMask - Rx channel number mask; multiple channels allowed + * \param [in] enable - enable/disable power meter + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxRssiEnable(adi_adrv904x_Device_t* const device, + const uint16_t meterMask, + const uint32_t channelMask, + const uint8_t enable); +/** + * \brief Readback RSSI (DDC/CDDC) power measurement + * This function reads back the RSSI (DDC/CDDC) power measurement + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] meterSel - Meter mask (only one allowed) + * \param [in] channelSel - Rx channel number mask (only one channel allowed for readback) + * \param [out] pPwrMeasDb - Pointer to power meter read back in dB when applicable + * \param [out] pPwrMeasLinear - Pointer to power meter read back linear value (in dBm) + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxRssiReadBack(adi_adrv904x_Device_t* const device, + const uint16_t meterSel, + const uint32_t channelSel, + float* const pPwrMeasDb, + float* const pPwrMeasLinear); + +#endif /* _ADI_ADRV904X_RX_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_rx_nco.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_rx_nco.h new file mode 100644 index 00000000000..44a27414587 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_rx_nco.h @@ -0,0 +1,128 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adi_adrv904x_rx_nco.h + * + * \brief Contains ADRV904X Rx NCO data structures. + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADI_ADRV904X_RX_NCO_H__ +#define __ADI_ADRV904X_RX_NCO_H__ + +#include +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_cpu_error_codes_types.h" + +typedef uint8_t adi_adrv904x_DdcNumber_t; +typedef uint8_t adi_adrv904x_OrxNcoSelect_t; + +/** + * \brief Enumeration for DDC channel number + */ +typedef enum adi_adrv904x_DdcNumber +{ + ADI_ADRV904X_DDC_BAND_0 = 0u, /*!< DDC channel 0 */ + ADI_ADRV904X_DDC_BAND_1, /*!< DDC channel 1 */ + ADI_ADRV904X_DDC_NUM_BAND +} adi_adrv904x_DdcNumber_e; + +/** + * \brief Enumeration for ORx NCO selections + */ +typedef enum adi_adrv904x_ORxNcoSelect +{ + ADI_ADRV904X_ORX_NCO_DDC = 0u, /*!< DDC NCO selected */ + ADI_ADRV904X_ORX_DATAPATH, /*!< DP NCO selected */ + ADI_ADRV904X_ORX_NUM_NCO, /*!< Number of ORX NCOs */ +} adi_adrv904x_OrxNcoSelect_e; + +/** + * \brief NCO Rx set command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_RxNcoConfig +{ + uint8_t chanSelect; /*!< Rx channel (bit mapped) */ + adi_adrv904x_DdcNumber_t bandSelect; /*!< which band */ + uint8_t enable; /*!< 0: Disable, 1: Enable */ + uint32_t phase; /*!< Phase in degrees (0 - 359) */ + int32_t frequencyKhz; /*!< Frequency in KHz */ +} adi_adrv904x_RxNcoConfig_t;) + +/** + * \brief NCO Rx set command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_RxNcoConfigReadbackResp +{ + adi_adrv904x_CpuErrorCode_t status; /*!< CPU error status code */ + uint8_t chanSelect; /*!< Rx channel (bit mapped) */ + adi_adrv904x_DdcNumber_t bandSelect; /*!< which band */ + uint8_t enabled; /*!< 0: Disabled, 1: Enabled */ + uint32_t phase; /*!< Phase in degrees (0 - 359) */ + int32_t frequencyKhz; /*!< Frequency in KHz */ +} adi_adrv904x_RxNcoConfigReadbackResp_t;) + +/** + * \brief NCO ORx set command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_ORxNcoConfig +{ + uint8_t chanSelect; /*!< Select ORx channel (bit mapped) */ + uint8_t ncoSelect; /*!< NCO select; 0 ADC, 1 Datapath */ + uint8_t enable; /*!< 0: Disable, 1: Enable */ + uint32_t phase; /*!< Phase in degrees (0 - 359) */ + int32_t frequencyKhz; /*!< Desired frequency in KHz */ +} adi_adrv904x_ORxNcoConfig_t;) + +/** + * \brief NCO Orx set command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_ORxNcoConfigReadbackResp +{ + adi_adrv904x_CpuErrorCode_t status; /*!< CPU error status code */ + uint8_t chanSelect; /*!< Select ORx channel (bit mapped) */ + uint8_t ncoSelect; /*!< NCO select; 0 ADC, 1 Datapath */ + uint8_t enabled; /*!< 0: Disabled, 1: Enabled */ + uint32_t phase; /*!< Phase in degrees (0 - 359) */ + int32_t frequencyKhz; /*!< Desired frequency in KHz */ +} adi_adrv904x_ORxNcoConfigReadbackResp_t;) + +/** + * \brief NCO CDDC Rx set command structure (Koror only) + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_RxCddcNcoConfig +{ + uint8_t chanSelect; /*!< Rx channels (bit mapped) */ + uint8_t carrierSelect; /*!< carriers (bit mapped) */ + uint8_t enable; /*!< 0: Disable, 1: Enable */ + uint32_t phase; /*!< Phase in degrees (0 - 359) */ + int32_t frequencyKhz; /*!< Frequency in KHz */ +} adi_adrv904x_RxCddcNcoConfig_t;) + +/** + * \brief NCO CDDC Rx set command response structure (Koror only) + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_RxCddcNcoConfigReadbackResp +{ + adi_adrv904x_CpuErrorCode_t status; /*!< CPU error status code */ + uint8_t chanSelect; /*!< Rx channel (bit mapped) */ + uint8_t carrierSelect; /*!< carrier (bit mapped) */ + uint8_t enabled; /*!< 0: Disabled, 1: Enabled */ + uint32_t phase; /*!< Phase in degrees (0 - 359) */ + int32_t frequencyKhz; /*!< Frequency in KHz */ +} adi_adrv904x_RxCddcNcoConfigReadbackResp_t;) + +#endif /* __ADI_ADRV904X_RX_NCO_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_rx_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_rx_types.h new file mode 100644 index 00000000000..8d470cf0d39 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_rx_types.h @@ -0,0 +1,806 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adi_adrv904x_rx_types.h + * \brief Contains ADRV904X API Rx datapath data types + * +* ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADI_ADRV904X_RX_TYPES_H_ +#define _ADI_ADRV904X_RX_TYPES_H_ + +#include "adi_library_types.h" +#include "adi_adrv904x_gpio_types.h" +#include "adi_adrv904x_rx_nco.h" + +#define ADI_ADRV904X_RX_GAIN_TABLE_SIZE_ROWS 256 +#define ADI_ADRV904X_RX_MAX_GAIN_INDEX 255 + +// TODO: This macro will be a duplicate when adi_adrv904x_types.h is eventually included in user.h +// When adi_adrv904x_types.h is available, remove this duplicate macro define. +#define ADI_ADRV904X_MAX_RX_ONLY 8U +#define ADI_ADRV904X_MAX_ORX_ONLY 2U +#define ADI_ADRV904X_MAX_RX_DDC_BANDS 2 +#define ADI_ADRV904X_MAX_RX_INT_SLICER_BITS 4 +#define ADI_ADRV904X_MAX_ORX_ATTEN_DB 17U + +#define ADI_ADRV904X_MAX_RX_CARRIERS_PER_CHANNEL 8U + +/** + * \brief Enum of possible Rx channel enables + */ +typedef enum adi_adrv904x_RxChannels +{ + ADI_ADRV904X_RXOFF = 0x00U, /*!< No Rx/ORx channels are enabled */ + ADI_ADRV904X_RX0 = 0x01U, /*!< Rx0 channel enabled */ + ADI_ADRV904X_RX1 = 0x02U, /*!< Rx1 channel enabled */ + ADI_ADRV904X_RX2 = 0x04U, /*!< Rx2 channel enabled */ + ADI_ADRV904X_RX3 = 0x08U, /*!< Rx3 channel enabled */ + ADI_ADRV904X_RX4 = 0x10U, /*!< Rx4 channel enabled */ + ADI_ADRV904X_RX5 = 0x20U, /*!< Rx5 channel enabled */ + ADI_ADRV904X_RX6 = 0x40U, /*!< Rx6 channel enabled */ + ADI_ADRV904X_RX7 = 0x80U, /*!< Rx7 channel enabled */ + ADI_ADRV904X_ORX0 = 0x100U, /*!< ORx0 channel enabled */ + ADI_ADRV904X_ORX1 = 0x200U /*!< ORx1 channel enabled */ +} adi_adrv904x_RxChannels_e; + +#define ADI_ADRV904X_RX_MASK_ALL ( ADI_ADRV904X_RX0 | \ + ADI_ADRV904X_RX1 | \ + ADI_ADRV904X_RX2 | \ + ADI_ADRV904X_RX3 | \ + ADI_ADRV904X_RX4 | \ + ADI_ADRV904X_RX5 | \ + ADI_ADRV904X_RX6 | \ + ADI_ADRV904X_RX7) + +#define ADI_ADRV904X_ORX_MASK_ALL (ADI_ADRV904X_ORX0 | ADI_ADRV904X_ORX1) + +/** + * \brief Enum of DDC blocks within an Rx Channel + */ +typedef enum adi_adrv904x_RxDdcs +{ + ADI_ADRV904X_RX_DDC_BAND0 = 0, + ADI_ADRV904X_RX_DDC_BAND1 = 1 +} adi_adrv904x_RxDdcs_e; + +/** + * \brief Enum of possible Rx gain table SRAM base addresses + */ +typedef enum adi_adrv904x_RxChanGainTableBaseAddr +{ + ADI_ADRV904X_RX0_GAIN_TABLE_BASEADDR = 0x600A0000, /*!< Select gain table SRAM base address for Rx0 Channel */ + ADI_ADRV904X_RX1_GAIN_TABLE_BASEADDR = 0x601A0000, /*!< Select gain table SRAM base address for Rx1 Channel */ + ADI_ADRV904X_RX2_GAIN_TABLE_BASEADDR = 0x602A0000, /*!< Select gain table SRAM base address for Rx2 Channel */ + ADI_ADRV904X_RX3_GAIN_TABLE_BASEADDR = 0x603A0000, /*!< Select gain table SRAM base address for Rx3 Channel */ + ADI_ADRV904X_RX4_GAIN_TABLE_BASEADDR = 0x604A0000, /*!< Select gain table SRAM base address for Rx4 Channel */ + ADI_ADRV904X_RX5_GAIN_TABLE_BASEADDR = 0x605A0000, /*!< Select gain table SRAM base address for Rx5 Channel */ + ADI_ADRV904X_RX6_GAIN_TABLE_BASEADDR = 0x606A0000, /*!< Select gain table SRAM base address for Rx6 Channel */ + ADI_ADRV904X_RX7_GAIN_TABLE_BASEADDR = 0x607A0000 /*!< Select gain table SRAM base address for Rx7 Channel */ +} adi_adrv904x_RxChanGainTableBaseAddr_e; + +/** + * \brief Enum to select ADRV904X Rx Data Formatting Options + */ +typedef enum adi_adrv904x_RxDataFormatModes +{ + ADI_ADRV904X_GAIN_COMPENSATION_DISABLED = 0, /*!< Gain Compensation and Data Formatting are disabled */ + ADI_ADRV904X_GAIN_WITH_FLOATING_POINT, /*!< Gain Compensation enabled with floating point data formatting enabled and internal slicer enabled */ + ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_NOGPIO, /*!< Gain Compensation enabled with integer data formatting and internal slicer enabled with no GPIO Slicer Position output. The slicer position is embedded in the JESD data */ + ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_2PIN_MODE, /*!< Gain Compensation enabled with integer data formatting and internal slicer enabled with GPIO Slicer Position output. The least significant 2 bits of the slicer control word are output on the GPIO */ + ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_3PIN_MODE, /*!< Gain Compensation enabled with integer data formatting and internal slicer enabled with GPIO Slicer Position output. The least significant 3 bits of the slicer control word are output on the GPIO */ + ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_4PIN_MODE, /*!< Gain Compensation enabled with integer data formatting and internal slicer enabled with GPIO Slicer Position output. All 4 bits of the slicer control word are output on the GPIOs */ + ADI_ADRV904X_GAIN_WITH_EXTERNAL_SLICER, /*!< NOT SUPPORTED: Gain Compensation enabled with integer data formatting and external slicer enabled */ + ADI_ADRV904X_EMBED_OVERLOAD_MONITOR_DATA /*!< Embed 1-bit/2 bit monitor data on the 2 least significant bits of a 16-bit 2's Complement JESD Rx data */ +} adi_adrv904x_RxDataFormatModes_e; + +/** + * \brief Enum to select ADRV904X Rx Data Formatting Options + */ +typedef enum adi_adrv904x_CddcDataFormatModes +{ + ADI_ADRV904X_CDDC_DISABLED = 0, /*!< CDDC Data formatting monitoring disabled */ + ADI_ADRV904X_CDDC_FLOATING_POINT, /*!< CDDC Data formatting with floating point data formatting enabled */ + ADI_ADRV904X_CDDC_INTEGER, /*!< CDDC Data formatting with integer data formatting enabled */ + ADI_ADRV904X_CDDC_SLICER, /*!< CDDC Data formatting slicer configuration */ + ADI_ADRV904X_CDDC_EMBED_OVERLOAD_MONITOR_DATA /*!< Embed 1-bit/2 bit monitor data on the 2 least significant bits of a 16-bit 2's Complement data */ +} adi_adrv904x_CddcDataFormatModes_e; + +/** + * \brief Enum to hold ADRV904X Floating Point Formatter format which indicates order of sign significand and exponent + */ +typedef enum adi_adrv904x_FpFloatDataFormat +{ + ADI_ADRV904X_FP_FORMAT_SIGN_EXP_SIGNIFICAND = 0, /*!< Floating point format of type {Sign, Exponent, Significand} */ + ADI_ADRV904X_FP_FORMAT_SIGN_SIGNIFICAND_EXP = 1 /*!< Floating point format of type {Sign, Significand, Exponent} */ +} adi_adrv904x_FpFloatDataFormat_e; + +/** + * \brief Enum to hold ADRV904X Floating Point Formatter rounding modes for the Rx data path + */ +typedef enum adi_adrv904x_FpRoundModes +{ + ADI_ADRV904X_ROUND_TO_EVEN = 0, /*!< Round floating point ties to an even value */ + ADI_ADRV904X_ROUNDTOWARDS_POSITIVE = 1, /*!< Round floating point toward the positive direction */ + ADI_ADRV904X_ROUNDTOWARDS_NEGATIVE = 2, /*!< Round floating point toward the negative direction */ + ADI_ADRV904X_ROUNDTOWARDS_ZERO = 3, /*!< Round floating point toward the zero direction */ + ADI_ADRV904X_ROUND_FROM_EVEN = 4 /*!< Round floating point ties away from even value */ +} adi_adrv904x_FpRoundModes_e; + +/** + * \brief Enum to hold ADRV904X Floating Point Formatter number of exponent bits + */ +typedef enum adi_adrv904x_FpExponentModes +{ + ADI_ADRV904X_2_EXPONENTBITS = 0, /*!< Floating point values have 2 exponent bits, 13 significand bits, 1 sign bit */ + ADI_ADRV904X_3_EXPONENTBITS = 1, /*!< Floating point values have 3 exponent bits, 12 significand bits, 1 sign bit */ + ADI_ADRV904X_4_EXPONENTBITS = 2, /*!< Floating point values have 4 exponent bits, 11 significand bits, 1 sign bit */ + ADI_ADRV904X_5_EXPONENTBITS = 3 /*!< Floating point values have 5 exponent bits, 10 significand bits, 1 sign bit */ +} adi_adrv904x_FpExponentModes_e; + +/** + * \brief Enum to hold ADRV904X Rx attenuation values that are used when the + * floating point format is enabled + */ +typedef enum adi_adrv904x_FpAttenSteps +{ + ADI_ADRV904X_FPATTEN_24DB = 4, /*!< Set Rx attenuation to 24 dB when Rx Data format set to floating point mode */ + ADI_ADRV904X_FPATTEN_18DB = 5, /*!< Set Rx attenuation to 18 dB when Rx Data format set to floating point mode */ + ADI_ADRV904X_FPATTEN_12DB = 6, /*!< Set Rx attenuation to 12 dB when Rx Data format set to floating point mode */ + ADI_ADRV904X_FPATTEN_6DB = 7, /*!< Set Rx attenuation to 6 dB when Rx Data format set to floating point mode */ + ADI_ADRV904X_FPATTEN_0DB = 0, /*!< Set Rx attenuation to 0 dB when Rx Data format set to floating point mode */ + ADI_ADRV904X_FPATTEN_MINUS6DB = 1, /*!< Set Rx attenuation to -6 dB when Rx Data format set to floating point mode */ + ADI_ADRV904X_FPATTEN_MINUS12DB = 2, /*!< Set Rx attenuation to -12 dB when Rx Data format set to floating point mode */ + ADI_ADRV904X_FPATTEN_MINUS18DB = 3 /*!< Set Rx attenuation to -18 dB when Rx Data format set to floating point mode */ +} adi_adrv904x_FpAttenSteps_e; + +/** + * \brief Enum to hold ADRV904X Hide Leading One selection + */ +typedef enum adi_adrv904x_FpHideLeadingOne +{ + ADI_ADRV904X_FP_FORMAT_HIDE_LEADING_ONE_DISABLE = 0, /*!< Sets leading one to be at the MSB of the significand */ + ADI_ADRV904X_FP_FORMAT_HIDE_LEADING_ONE_ENABLE = 1 /*!< Hides the leading one in significand to be compatible to the IEEE754 specification */ +} adi_adrv904x_FpHideLeadingOne_e; + +/** + * \brief Enum to hold ADRV904X Floating Point Formatter NaN encode enable + */ +typedef enum adi_adrv904x_FpNanEncode +{ + ADI_ADRV904X_FP_FORMAT_NAN_ENCODE_DISABLE = 0, /*!< Does not reserve highest value of exponent for NaN */ + ADI_ADRV904X_FP_FORMAT_NAN_ENCODE_ENABLE = 1 /*!< Reserve highest value of exponent for NaN */ +} adi_adrv904x_FpNanEncode_e; + + +/** + * \brief Enum to select the overload peak detection input monitor signal source + */ +typedef enum adi_adrv904x_SignalMonitorSrc +{ + + ADI_ADRV904X_SIG_MON_SRC_HB2_OUTPUT, /*!< Use Hb2 block output as input signal */ + ADI_ADRV904X_SIG_MON_SRC_HB2_INPUT, /*!< Use Hb2 block input as input signal */ + ADI_ADRV904X_MAX_SIG_MON_SRC_INVALID /*!< Max number of signal monitor input source */ +} adi_adrv904x_SignalMonitorSrc_e; + + +/** + * \brief Enum to hold ADRV904X integer mode number of embedded slicer bits and positions + */ +typedef enum adi_adrv904x_RxSlicerEmbeddedBits +{ + ADI_ADRV904X_NO_EMBEDDED_SLICER_BITS = 0, /*!< Disabled all embedded slicer bits */ + ADI_ADRV904X_EMBED_1_SLICERBIT_AT_MSB, /*!< Embeds 1 slicer bits on I and 1 slicer bits on Q and the MSB position in the data frame */ + ADI_ADRV904X_EMBED_1_SLICERBIT_AT_LSB, /*!< Embeds 1 slicer bits on I and 1 slicer bits on Q and the LSB position in the data frame */ + ADI_ADRV904X_EMBED_2_SLICERBITS_AT_MSB_3_BIT_SLICER, /*!< Embeds 2 slicer bits on I and 2 slicer bits on Q and the MSB position in the data frame whereas only 3 bits are used for slicer ctrl (2 bits on I, 1 bit Q) */ + ADI_ADRV904X_EMBED_2_SLICERBITS_AT_LSB_3_BIT_SLICER, /*!< Embeds 2 slicer bits on I and 2 slicer bits on Q and the LSB position in the data frame whereas only 3 bits are used for slicer ctrl (2 bits on I, 1 bit Q) */ + ADI_ADRV904X_EMBED_2_SLICERBITS_AT_MSB_4_BIT_SLICER, /*!< Embeds 2 slicer bits on I and 2 slicer bits on Q and the MSB position in the data frame and all 4 bits are used for slicer ctrl*/ + ADI_ADRV904X_EMBED_2_SLICERBITS_AT_LSB_4_BIT_SLICER /*!< Embeds 2 slicer bits on I and 2 slicer bits on Q and the LSB position in the data frame and all 4 bits are used for slicer ctrl*/ +} adi_adrv904x_RxSlicerEmbeddedBits_e; + +/** + * \brief Enum to hold ADRV904X integer sample resolution + */ +typedef enum adi_adrv904x_RxIntSampleResolution +{ + ADI_ADRV904X_INTEGER_12BIT_2SCOMP = 0, /*!< Selects integer sample 12 bit resolution with 2s compliment */ + ADI_ADRV904X_INTEGER_12BIT_SIGNED, /*!< Selects integer sample 12 bit resolution with signed magnitude */ + ADI_ADRV904X_INTEGER_16BIT_2SCOMP, /*!< Selects integer sample 16 bit resolution with 2s compliment */ + ADI_ADRV904X_INTEGER_16BIT_SIGNED /*!< Selects integer sample 16 bit resolution with signed magnitude */ +} adi_adrv904x_RxIntSampleResolution_e; + +/** + * \brief Enum to hold ADRV904X integer mode parity selection for 3 bit slicer mode + */ +typedef enum adi_adrv904x_RxIntParity +{ + ADI_ADRV904X_3BIT_SLICER_EVEN_PARITY = 0, /*!< Even parity for the unused 4th bit in 3 bit slicer mode */ + ADI_ADRV904X_3BIT_SLICER_ODD_PARITY = 1, /*!< Odd parity for the unused 4th bit in 3 bit slicer mode */ + ADI_ADRV904X_NO_PARITY = 2 /*!< Disable parity */ +} adi_adrv904x_RxIntParity_e; + +/** + * \brief Enum to hold ADRV904X slicer control word nibble position + */ +typedef enum adi_adrv904x_RxSlicerEmbeddedPos +{ + ADI_ADRV904X_LOWER_NIBBLE_ON_I = 0, /*!< Place the lower control nibble on I and the upper control nibble on Q */ + ADI_ADRV904X_LOWER_NIBBLE_ON_Q /*!< Place the lower control nibble on Q and the upper control nibble on I */ + +} adi_adrv904x_RxSlicerEmbeddedPos_e; + +/** + * \brief Enum to hold ADRV904X Gain Slicer external pin gain step size. Slicer gain in this mode is determined by multiplying the step size by the step size selection from the base band processor. + */ +typedef enum adi_adrv904x_ExtSlicerStepSizes +{ + ADI_ADRV904X_EXTSLICER_STEPSIZE_1DB = 0, /*!< Set Gain Slicer External gain step size to 1dB */ + ADI_ADRV904X_EXTSLICER_STEPSIZE_2DB, /*!< Set Gain Slicer External gain step size to 2dB */ + ADI_ADRV904X_EXTSLICER_STEPSIZE_3DB, /*!< Set Gain Slicer External gain step size to 3dB */ + ADI_ADRV904X_EXTSLICER_STEPSIZE_4DB, /*!< Set Gain Slicer External gain step size to 4dB */ + ADI_ADRV904X_EXTSLICER_STEPSIZE_6DB /*!< Set Gain Slicer External gain step size to 6dB */ +} adi_adrv904x_ExtSlicerStepSizes_e; + +/** + * \brief Enum to hold ADRV904X Internal Gain Slicer gain step size. Slicer gain in this mode is determined by multiplying the step size by the step size selection from the base band processor. + */ +typedef enum adi_adrv904x_IntSlicerStepSizes +{ + ADI_ADRV904X_INTSLICER_STEPSIZE_1DB = 0, /*!< Set Gain Slicer Internal gain step size to 1dB */ + ADI_ADRV904X_INTSLICER_STEPSIZE_2DB, /*!< Set Gain Slicer Internal gain step size to 2dB */ + ADI_ADRV904X_INTSLICER_STEPSIZE_3DB, /*!< Set Gain Slicer Internal gain step size to 3dB */ + ADI_ADRV904X_INTSLICER_STEPSIZE_4DB, /*!< Set Gain Slicer Internal gain step size to 4dB */ + ADI_ADRV904X_INTSLICER_STEPSIZE_6DB, /*!< Set Gain Slicer Internal gain step size to 6dB */ + ADI_ADRV904X_INTSLICER_STEPSIZE_8DB /*!< Set Gain Slicer Internal gain step size to 8dB */ +} adi_adrv904x_IntSlicerStepSizes_e; + +/** + * \brief Enum to hold ADRV904X Rx Gain Slicer external pin GPIO selection options + */ +typedef enum adi_adrv904x_RxExtSlicerGpioSel +{ + ADI_ADRV904X_EXTSLICER_RX_GPIO_DISABLE = 0, /*!< No GPIO assigned to external slicer */ + ADI_ADRV904X_EXTSLICER_RX_GPIO_INVALID = 9 +} adi_adrv904x_RxExtSlicerGpioSel_e; + +/** +* \brief Enum to hold ADRV904X Embedded Monitor Mode sources +*/ +typedef enum adi_adrv904x_RxEmbeddedMonitorSrc +{ + ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED = 0, /*!< Embedded overload monitor data is not embedded for the selected bit position in 16 bit Rx data */ + ADI_ADRV904X_RX_EMB_MON_SRC_HB2_LOW_THRESH = 3, /*!< Selects digital HB2 low threshold monitor data to be embedded in Rx data */ + ADI_ADRV904X_RX_EMB_MON_SRC_HB2_HIGH_THRESH = 4, /*!< Selects digital HB2 high threshold monitor data to be embedded in Rx data */ + ADI_ADRV904X_RX_EMB_MON_SRC_APD_LOW_THRESH = 5, /*!< Selects analog peak detector low threshold monitor data to be embedded in Rx data */ + ADI_ADRV904X_RX_EMB_MON_SRC_APD_HIGH_THRESH = 6, /*!< Selects analog peak detector high threshold monitor data to be embedded in Rx data */ + ADI_ADRV904X_RX_EMB_MON_SRC_BAND0_LOW_THRESH = 7, /*!< Selects band0 low threshold monitor data to be embedded in Rx data */ + ADI_ADRV904X_RX_EMB_MON_SRC_BAND0_HIGH_THRESH = 8, /*!< Selects band0 high threshold monitor data to be embedded in Rx data */ + ADI_ADRV904X_RX_EMB_MON_SRC_BAND1_LOW_THRESH = 9, /*!< Selects band1 low threshold monitor data to be embedded in Rx data */ + ADI_ADRV904X_RX_EMB_MON_SRC_BAND1_HIGH_THRESH = 10, /*!< Selects band1 high threshold monitor data to be embedded in Rx data */ + ADI_ADRV904X_RX_EMB_MON_SRC_INVALID = 11 /*!< Invalid embedded monitoring source */ +} adi_adrv904x_RxEmbeddedMonitorSrc_e; + +/** +* \brief Enum to hold ADRV904X Embedded Monitor Mode HB2 Low source +*/ +typedef enum adi_adrv904x_RxHb2LowEmbeddedMonitorSrc +{ + ADI_ADRV904X_HB2_LOW_SRC_OVRG_LOW = 0, /*!< Selects digital HB2 lower threshold exceeded flag as HB2 low threshold monitor data */ + ADI_ADRV904X_HB2_LOW_SRC_OVRG_LOW_INT0 = 1, /*!< Selects digital HB2 interval 0 lower threshold exceeded flag as HB2 low threshold monitor data */ + ADI_ADRV904X_HB2_LOW_SRC_OVRG_LOW_INT1 = 2, /*!< Selects digital HB2 interval 1 lower threshold exceeded flag as HB2 low threshold monitor data */ + ADI_ADRV904X_HB2_LOW_SRC_OVRG_LOW_THRESH_CNTR_EXCEEDED = 4, /*!< Selects digital HB2 lower threshold exceeded counter flag as HB2 low threshold monitor data */ + ADI_ADRV904X_HB2_LOW_SRC_OVRG_LOW_INT0_THRESH_CNTR_EXCEEDED = 5, /*!< Selects digital HB2 interval 0 lower threshold exceeded counter flag as HB2 low threshold monitor data */ + ADI_ADRV904X_HB2_LOW_SRC_OVRG_LOW_INT1_THRESH_CNTR_EXCEEDED = 6, /*!< Selects digital HB2 interval 1 lower threshold exceeded counter flag as HB2 low threshold monitor data */ + ADI_ADRV904X_HB2_LOW_SRC_INVALID = 7 /*!< Invalid HB2 low source */ +} adi_adrv904x_RxHb2LowEmbeddedMonitorSrc_e; + +/** +* \brief Enum to hold ADRV904X Embedded Monitor Mode HB2 High source +*/ +typedef enum adi_adrv904x_RxHb2HighEmbeddedMonitorSrc +{ + ADI_ADRV904X_HB2_HIGH_SRC_OVRG_HIGH = 0, /*!< Selects digital HB2 overrange high threshold exceeded flag as HB2 high threshold monitor data */ + ADI_ADRV904X_HB2_HIGH_SRC_OVRG_HIGH_CNTR_EXCEEDED, /*!< Selects digital HB2 overrange high threshold counter exceeded flag as HB2 high threshold monitor data */ + ADI_ADRV904X_HB2_HIGH_SRC_INVALID /*!< Invalid HB2 high source */ +} adi_adrv904x_RxHb2HighEmbeddedMonitorSrc_e; + +/** +* \brief Enum to hold ADRV904X Embedded Monitor Mode Analog Peak Detector Low source +*/ +typedef enum adi_adrv904x_RxApdLowEmbeddedMonitorSrc +{ + ADI_ADRV904X_APD_LOW_SRC_LOWER_LEVEL_BLOCKER_EXCEEDED = 0, /*!< Selects analog peak detector lower level blocker exceeded flag as APD low threshold monitor data */ + ADI_ADRV904X_APD_LOW_SRC_LOWER_LEVEL_BLOCKER_CNTR_EXCEEDED, /*!< Selects analog peak detector lower level blocker counter exceeded flag as APD low threshold monitor data */ + ADI_ADRV904X_APD_LOW_SRC_INVALID /*!< Invalid APD low source */ +} adi_adrv904x_RxApdLowEmbeddedMonitorSrc_e; + +/** +* \brief Enum to hold ADRV904X Embedded Monitor Mode Analog Peak Detector High source +*/ +typedef enum adi_adrv904x_RxApdHighEmbeddedMonitorSrc +{ + ADI_ADRV904X_APD_HIGH_SRC_UPPER_LEVEL_BLOCKER_EXCEEDED = 0, /*!< Selects analog peak detector upper level blocker exceeded flag as APD high threshold monitor data */ + ADI_ADRV904X_APD_HIGH_SRC_UPPER_LEVEL_BLOCKER_CNTR_EXCEEDED, /*!< Selects analog peak detector upper level blocker counter exceeded flag as APD high threshold monitor data */ + ADI_ADRV904X_APD_HIGH_SRC_INVALID /*!< Invalid APD high source */ +} adi_adrv904x_RxApdHighEmbeddedMonitorSrc_e; + + + +/** + * \brief Data structure to hold ADRV904X Rx gain table row entry + */ +typedef struct adi_adrv904x_RxGainTableRow +{ + uint8_t rxFeGain; /*!< Rx Front End gain for a given gain index */ + uint8_t extControl; /*!< External LNA control word */ + int16_t digGain; /*!< Digital gain ranging from -18dB to 50dB (68dB total range) */ + uint16_t phaseOffset; /*!< 16 bit phase offset from 0 - 2pi in resolution of 0.005 degrees */ +} adi_adrv904x_RxGainTableRow_t; + + +/** +* \brief Data structure to hold ADRV904X Rx gain index config +*/ +typedef struct adi_adrv904x_RxGain +{ + uint32_t rxChannelMask; /*!< Rx Channels for which gain index needs to be updated. Bits 0-7 correspond to Rx0-Rx7 respectively */ + uint8_t gainIndex; /*!< Gain Index for the channels selected in rxChannelMask */ +} adi_adrv904x_RxGain_t; + + +/** +* \brief Data structure to hold ADRV904X Floating Point Formatter Configuration +*/ +typedef struct adi_adrv904x_FloatingPointConfigSettings +{ + adi_adrv904x_FpFloatDataFormat_e fpDataFormat; /*!< Floating point format to select between {Sign, Significand, Exponent} and {Sign, Exponent, Significand} */ + adi_adrv904x_FpRoundModes_e fpRoundMode; /*!< Rounding mode for floating point format (See enum values) */ + adi_adrv904x_FpExponentModes_e fpNumExpBits; /*!< Indicates the number of exponent and significand bits in the floating point number */ + adi_adrv904x_FpAttenSteps_e fpAttenSteps; /*!< Attenuate integer data when floating point mode enabled, see enum for values from 0dB to 42dB in 6dB steps */ + adi_adrv904x_FpHideLeadingOne_e fpHideLeadingOne; /*!< 1 = Hides the leading one in significand to be compatible to the IEEE754 specification. 0 = a leading one exists at the MSB of the significand. (Valid: 0, 1) */ + adi_adrv904x_FpNanEncode_e fpEncodeNan; /*!< 1 = encodes the highest value of Exponent to mean NaN (Not a Number) to be compatible to IEEE754 specification (Valid: 0 or 1) */ +} adi_adrv904x_FloatingPointConfigSettings_t; + +/** +* \brief Data structure to hold ADRV904X Floating Point Formatter Configuration +*/ +typedef struct adi_adrv904x_CddcFloatingPointConfigSettings +{ + adi_adrv904x_FpFloatDataFormat_e cddcFpDataFormat; /*!< Floating point format to select between {Sign, Significand, Exponent} and {Sign, Exponent, Significand} */ + adi_adrv904x_FpRoundModes_e cddcFpRoundMode; /*!< Rounding mode for floating point format (See enum values) */ + adi_adrv904x_FpExponentModes_e cddcFpNumExpBits; /*!< Indicates the number of exponent and significand bits in the floating point number */ + adi_adrv904x_FpHideLeadingOne_e cddcFpHideLeadingOne; /*!< 1 = Hides the leading one in significand to be compatible to the IEEE754 specification. 0 = a leading one exists at the MSB of the significand. (Valid: 0, 1) */ + adi_adrv904x_FpNanEncode_e cddcFpEncodeNan; /*!< 1 = encodes the highest value of Exponent to mean NaN (Not a Number) to be compatible to IEEE754 specification (Valid: 0 or 1) */ + uint8_t cddcFpEn; /*!< 1 = Floating point CDDC data formatting enabled (Valid: 0 or 1) */ +} adi_adrv904x_CddcFloatingPointConfigSettings_t; + +/** +* \brief Data structure to hold ADRV904X Integer Formatter Configuration +*/ +typedef struct adi_adrv904x_IntegerConfigSettings +{ + adi_adrv904x_RxSlicerEmbeddedBits_e intEmbeddedBits; /*!< No. of embedded slicer bits in Rx Data */ + adi_adrv904x_RxIntSampleResolution_e intSampleResolution; /*!< Resolution of Rx Data */ + adi_adrv904x_RxIntParity_e intParity; /*!< Parity - applicable only for 3bit slicer mode */ + adi_adrv904x_RxSlicerEmbeddedPos_e intEmbeddedPos; /*!< Selects the position of the upper and lower embedded slicer control word */ +} adi_adrv904x_IntegerConfigSettings_t; + +/** +* \brief Data structure to hold ADRV904X Integer Formatter Configuration +*/ +typedef struct adi_adrv904x_CddcIntegerConfigSettings +{ + adi_adrv904x_RxSlicerEmbeddedBits_e intEmbeddedBits; /*!< No. of embedded slicer bits in Rx Data */ + adi_adrv904x_RxIntSampleResolution_e intSampleResolution; /*!< Resolution of Rx Data */ + adi_adrv904x_RxIntParity_e intParity; /*!< Parity - applicable only for 3bit slicer mode */ + adi_adrv904x_RxSlicerEmbeddedPos_e intEmbeddedPos; /*!< Selects the position of the upper and lower embedded slicer control word */ +} adi_adrv904x_CddcIntegerConfigSettings_t; + +/** + * \brief Data structure to hold ADRV904X Slicer Configuration settings + */ +typedef struct adi_adrv904x_SlicerConfigSettings +{ + adi_adrv904x_ExtSlicerStepSizes_e extSlicerStepSize; /*!< Selects the external pin gain step size */ + adi_adrv904x_IntSlicerStepSizes_e intSlicerStepSize; /*!< Selects the internal pin gain step size */ + adi_adrv904x_RxExtSlicerGpioSel_e extSlicerGpioSelect; /*!< Selects the Ext Ctrl GPIO Configuration for the respective Rx Channel */ + adi_adrv904x_GpioPinSel_e intSlicerGpioSelect[ADI_ADRV904X_MAX_RX_INT_SLICER_BITS]; /*!< Selects the Int Output GPIO Configuration for the respective Rx Channel */ +} adi_adrv904x_SlicerConfigSettings_t; + +/** + * \brief Data structure to hold ADRV904X Slicer Configuration settings + */ +typedef struct adi_adrv904x_CddcSlicerConfigSettings +{ + uint8_t cddcSlicerCarrierSelect; /*!< Selects the Slicer Carrier for CDDC */ + uint8_t cddcFormatterCarrierSelect; /*!< Selects the Formatter Carrier for CDDC */ + uint8_t cddcEn3BitSlicerMode; /*!< Enable 3bit slicer mode for CDDC */ + uint8_t cddcEnSlicerAgcSync; /*!< Enable AGC Sync for CDDC Slicer */ +} adi_adrv904x_CddcSlicerConfigSettings_t; + +/** +* \brief Data structure to hold ADRV904X Rx Embedded Monitor Formatter Configuration +*/ +typedef struct adi_adrv904x_EmbOverloadMonitorConfigSettings +{ + adi_adrv904x_RxEmbeddedMonitorSrc_e embeddedMonitorSrcLsbI; /*!< Selects the monitor data to be embedded into LSB location of 16-bit Rx data - I sample */ + adi_adrv904x_RxEmbeddedMonitorSrc_e embeddedMonitorSrcLsbQ; /*!< Selects the monitor data to be embedded into LSB location of 16-bit Rx data - Q sample */ + adi_adrv904x_RxEmbeddedMonitorSrc_e embeddedMonitorSrcLsbPlusOneI; /*!< Selects the monitor data to be embedded into LSB+1 location of 16-bit Rx data - I sample */ + adi_adrv904x_RxEmbeddedMonitorSrc_e embeddedMonitorSrcLsbPlusOneQ; /*!< Selects the monitor data to be embedded into LSB+1 location of 16-bit Rx data - Q sample */ + adi_adrv904x_RxHb2LowEmbeddedMonitorSrc_e embeddedMonitorHb2LowSrcSel; /*!< If digital HB2 Low monitor is selected to be embedded into Rx data, the source of digital HB2 low threshold is selected by this param */ + adi_adrv904x_RxHb2HighEmbeddedMonitorSrc_e embeddedMonitorHb2HighSrcSel; /*!< If digital HB2 High monitor is selected to be embedded into Rx data, the source of digital HB2 high threshold is selected by this param */ + adi_adrv904x_RxApdLowEmbeddedMonitorSrc_e embeddedMonitorApdLowSrcSel; /*!< If analog peak detector low monitor is selected to be embedded into Rx data, the source of analog peak detector low threshold is selected by this param */ + adi_adrv904x_RxApdHighEmbeddedMonitorSrc_e embeddedMonitorApdHighSrcSel; /*!< If analog peak detector high monitor is selected to be embedded into Rx data, the source of analog peak detector low threshold is selected by this param */ + uint8_t invertHb2Flag; /*!< When inverted, Hb2 embedded overload monitor flag operates as active low, 0:Don't invert / Other:Invert*/ + uint8_t invertApdFlag; /*!< When inverted, Apd embedded overload monitor flag operates as active low, 0:Don't invert / Other:Invert*/ +} adi_adrv904x_EmbOverloadMonitorConfigSettings_t; + +/** +* \brief Data structure to hold ADRV904X Rx Embedded Monitor Formatter Configuration +*/ +typedef struct adi_adrv904x_CddcEmbOverloadMonitorConfigSettings +{ + uint8_t embeddedMonitorSrcLsbI; /*!< Selects the monitor data to be embedded into LSB location of 16-bit Rx data - I sample */ + uint8_t embeddedMonitorSrcLsbQ; /*!< Selects the monitor data to be embedded into LSB location of 16-bit Rx data - Q sample */ + uint8_t embeddedMonitorSrcLsbPlusOneI; /*!< Selects the monitor data to be embedded into LSB+1 location of 16-bit Rx data - I sample */ + uint8_t embeddedMonitorSrcLsbPlusOneQ; /*!< Selects the monitor data to be embedded into LSB+1 location of 16-bit Rx data - Q sample */ +} adi_adrv904x_CddcEmbOverloadMonitorConfigSettings_t; + +/** +* \brief Configuration structure for Rx Data Formatter +*/ +typedef struct adi_adrv904x_RxDataFormat +{ + adi_adrv904x_RxDataFormatModes_e formatSelect; /*!< Rx Channel format mode selects */ + adi_adrv904x_FloatingPointConfigSettings_t floatingPointConfig; /*!< Rx Channel floating point format configuration. Ignored if formatSelect is NOT set to ADI_ADRV904X_GAIN_WITH_FLOATING_POINT */ + adi_adrv904x_IntegerConfigSettings_t integerConfigSettings; /*!< Rx Channel integer format configuration. Please note that integerConfigSettings.intSampleResolution needs to be set to a valid value for all modes of formatSelect */ + adi_adrv904x_SlicerConfigSettings_t slicerConfigSettings; /*!< Rx channel integer slicer configuration. Ignored if formatSelect is NOT ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_NOGPIO, ADI_ADRV904X_GAIN_WITH_INTERNAL_SLICER_2/3/4PIN_MODE or ADI_ADRV904X_GAIN_WITH_EXTERNAL_SLICER_NO_GPIO */ + adi_adrv904x_EmbOverloadMonitorConfigSettings_t embOvldMonitorSettings; /*!< Rx channel embedded overload monitor settings. Ignored if formatSelect is NOT set to ADI_ADRV904X_EMBED_MONITOR_DATA. Embedded overload monitoring is supported for Rx channels only */ + uint8_t externalLnaGain; /*!< Selects Slicer to compensate for external dualband LNA {0 - disabled, 1 - enabled} */ + uint8_t tempCompensationEnable; /*!< Selects Slicer to compensate for temperature variations {0 - disabled, 1 - enabled} */ +} adi_adrv904x_RxDataFormat_t; + +/** +* \brief Configuration structure for CDDC Data Formatter +*/ +typedef struct adi_adrv904x_CddcDataFormat +{ + adi_adrv904x_CddcDataFormatModes_e cddcFormatSelect; /*!< Rx Channel format mode selects */ + adi_adrv904x_CddcFloatingPointConfigSettings_t cddcFloatingPointConfig; /*!< Rx Channel floating point format configuration. Ignored if formatSelect is NOT set to ADI_ADRV904X_GAIN_WITH_FLOATING_POINT */ + adi_adrv904x_CddcIntegerConfigSettings_t cddcIntegerConfigSettings; /*!< Rx Channel integer format configuration. Please note that integerConfigSettings.intSampleResolution needs to be set to a valid value for all modes of formatSelect */ + adi_adrv904x_CddcSlicerConfigSettings_t cddcSlicerConfigSettings; /*!< Rx channel slicer configuration. */ + adi_adrv904x_CddcEmbOverloadMonitorConfigSettings_t cddcEmbOvldMonitorSettings; /*!< Rx channel embedded overload monitor settings. Ignored if formatSelect is NOT set to ADI_ADRV904X_EMBED_MONITOR_DATA. Embedded overload monitoring is supported for Rx channels only */ +} adi_adrv904x_CddcDataFormat_t; + +/** +* \brief Indicates the rx channels to which an instance of adi_adrv904x_RxDataFormat_t applies +*/ +typedef struct adi_adrv904x_RxDataFormatRt +{ + uint32_t rxChannelMask; /*!< The rx channels to which rxDataFormat applies. Suggested to use adi_adrv904x_RxChannels_e to build. */ + adi_adrv904x_RxDataFormat_t rxDataFormat; /*!< RxDataFormat configuration used for channels specified in rxChannelMask */ +} adi_adrv904x_RxDataFormatRt_t; + + +/** +* \brief Indicates the rx channels to which an instance of adi_adrv904x_CddcDataFormat_t applies +*/ +typedef struct adi_adrv904x_CddcDataFormatRt +{ + uint32_t rxChannelMask; /*!< The rx channels to which rxDataFormat applies. Suggested to use adi_adrv904x_RxChannels_e to build. */ + adi_adrv904x_CddcDataFormat_t cddcDataFormat; /*!< RxDataFormat configuration used for channels specified in rxChannelMask */ +} adi_adrv904x_CddcDataFormatRt_t; + +/** +* \brief Enum to hold ADRV904X Decimated power block selection +*/ +typedef enum adi_adrv904x_DecPowerMeasurementBlock +{ + ADI_ADRV904X_DEC_POWER_MAIN_PATH_MEAS_BLOCK = 0x1, /*!< Selects main path decimated power measurement block */ + ADI_ADRV904X_DEC_POWER_BAND_A_MEAS_BLOCK = 0x2, /*!< Selects Band A decimated power measurement block */ + ADI_ADRV904X_DEC_POWER_BAND_B_MEAS_BLOCK = 0x4, /*!< Selects Band B decimated power measurement block */ +} adi_adrv904x_DecPowerMeasurementBlock_e; + +/** +* \brief Enum to select Rx Decimated power measurement control type +*/ +typedef enum adi_adrv904x_DecPowerControl +{ + ADI_ADRV904X_DEC_POWER_MEAS_OFF = 0, /*!< Disable decimated power measurement for selected block */ + ADI_ADRV904X_DEC_POWER_MEAS_ON = 1, /*!< Enable decimated power measurement for selected block. If user enables DEC power measurement with this option + AGC block won't use decimated power measurements*/ + ADI_ADRV904X_DEC_POWER_AGC_MEAS = 2 /*!< Leave decimated power measurement block control to AGC. */ +} adi_adrv904x_DecPowerControl_e; + +/** +* \brief Data structure for Rx decimated power block configuration +*/ +typedef struct adi_adrv904x_RxDecimatedPowerCfg +{ + uint32_t rxChannelMask; /*!< Rx channel selection */ + adi_adrv904x_DecPowerControl_e decPowerControl; /*!< Decimated power measurements control mode */ + uint8_t powerInputSelect; /*!< Use output of Rx for power measurement. 0: DC Offset output, 1: RFIR output, 2: QFIR output, 3:HB2 output. Valid Range from 0 to 3, only effective for main path Dec power*/ + uint8_t measBlockSelectMask; /*!< Select Main path dec power, BandA dec power and/or BandB dec power. Please use adi_adrv904x_DecPowerMeasurementBlock_e to create this mask */ + uint8_t powerMeasurementDuration; /*!< Average power measurement duration = 8*2^powerMeasurementDuration. Valid range from 0 to 31 */ +}adi_adrv904x_RxDecimatedPowerCfg_t; + +/** +* \brief Data structure for Orx decimated power block configuration +*/ +typedef struct adi_adrv904x_ORxDecimatedPowerCfg +{ + uint32_t orxChannelMask; /*!< ORx channel selection */ + uint8_t measurementEnable; /*!< 0:Disable , 1:Enable power measurements */ + uint8_t powerInputSelect; /*!< Signal selection for power measurement. 0: Hb2 input, 1: Hb2 output, 2: Hb1 output */ + uint8_t powerMeasurementDuration; /*!< Average power measurement duration = 8*2^powerMeasurementDuration. Valid range from 0 to 21 */ +}adi_adrv904x_ORxDecimatedPowerCfg_t; + +/** + * \brief Enum to set the Rx gain control mode + */ +typedef enum adi_adrv904x_RxGainCtrlMode +{ + ADI_ADRV904X_MGC = 0, /*!< MGC Mode */ + ADI_ADRV904X_AGC = 2, /*!< AGC Mode */ +} adi_adrv904x_RxGainCtrlMode_e; + +/** + * \brief Data structure to hold Rx gain control mode configurations + */ +typedef struct adi_adrv904x_RxGainCtrlModeCfg +{ + uint32_t rxChannelMask; + adi_adrv904x_RxGainCtrlMode_e gainCtrlMode; +} adi_adrv904x_RxGainCtrlModeCfg_t; + +/** + * /brief Indicates the frequency of the sine wave test signal with respect to the Rx ADC clock. e.g. DIV_40 + * indicates the sine frequency is 1/40th that of the ADC clock. + */ +typedef enum adi_adrv904x_AdcTestSineFreq +{ + ADI_ADRV904X_FS_DIV_40 = 0, + ADI_ADRV904X_FS_DIV_20 = 1, + ADI_ADRV904X_FS_DIV_10 = 2, + ADI_ADRV904X_FS_DIV_5 = 3 +} adi_adrv904x_AdcTestSineFreq_e; + +/** + * /brief Indicates if the output of an Rx ADC is to be replaced by a test signal. Also describes the test + * signal. The signal is always a full-scale sine wave. + */ +typedef struct adi_adrv904x_RxTestDataCfg +{ + adi_adrv904x_AdcTestSineFreq_e sineFreq; /*On transition or Manual Pause), range: 1 - 0x3FFF */ + adi_adrv904x_RxCarrierRssiOpMode_e opMode; /*!< 1: power of 2 meas specified by duration0, 0: non-power of 2 */ /* rssi_default_mode 2bit */ + uint8_t duration0; /*!< meas duration0 */ + uint8_t duration1; /*!< meas duration1 */ + uint8_t duration2; /*!< meas duration2 */ + uint8_t duration3; /*!< meas duration3 */ + uint16_t mulFactor0; /*!< non-power of 2 mode, the weight of power calculated for duration 0 , range:0-0xFF for Band RSSI, 0-0x3FF for carrier RSSI*/ + uint16_t mulFactor1; /*!< non-power of 2 mode, the weight of power calculated for duration 1 , range:0-0xFF for Band RSSI, 0-0x3FF for carrier RSSI*/ + uint16_t mulFactor2; /*!< non-power of 2 mode, the weight of power calculated for duration 2 , range:0-0xFF for Band RSSI, 0-0x3FF for carrier RSSI*/ + uint16_t mulFactor3; /*!< non-power of 2 mode, the weight of power calculated for duration 3 , range:0-0xFF for Band RSSI, 0-0x3FF for carrier RSSI*/ + uint8_t resetAtGainChange; /*!< Measurement is reset at gain change */ /* rssi_reset_on_gain_change 1bit */ + uint8_t fddPinMode; /*!< For FDD mode only, trigger meas start using a GPIO */ /* rssi_pin_mode */ + uint8_t radioSeqTrigEnable; /*!< 1: Radio Sequencer trigger enabled. RS Trigger selected by radioSeqTrigger, 0: GPIO pin selected as trigger */ /* rssi_trigger_source_select 1bit */ + uint8_t radioSeqTrigSelect; /*!< Radio Sequencer trigger selection 0-7 */ /* rssi_rs_trigger_select 3bit */ + uint32_t captureTimeUsec; /*!< the expected time (usec) it takes to perform an RSSI power measurement */ +} adi_adrv904x_RxCarrierRssiCfg_t; + + +/** + * \brief Data structure to hold a Carrier RSSI GPIO pin configuration for a single Rx Channel + */ +typedef struct adi_adrv904x_RxCarrierRssiGpioChannelCfg +{ + adi_adrv904x_GpioPinSel_e enablePin; /*!< Input pins: RSSI Enable GPIO selection for all Carriers in a Rx Channel. User can select ADI_ADRV904X_GPIO_INVALID + if they don't need to use Rx Carrier RSSI Enable GPIO inputs for a channel. More than 1 Rx channel can select a single GPIO pin. */ + adi_adrv904x_GpioPinSel_e readyPin[ADI_ADRV904X_MAX_RX_CARRIERS_PER_CHANNEL]; /*!< Output pins: RSSI Ready GPIO selection for each Carrier in a Rx Channel. User can select ADI_ADRV904X_GPIO_INVALID + if they don't need to use a Rx Carrier Ready signal for a carrier. Only 1 Carrier on 1 Rx channel can select a single GPIO pin. */ +} adi_adrv904x_RxCarrierRssiGpioChannelCfg_t; + +/** + * \brief Data structure to hold Rx Carrier RSSI GPIO pin configuration parameters + */ +typedef struct adi_adrv904x_RxCarrierRssiGpioCfg +{ + adi_adrv904x_RxCarrierRssiGpioChannelCfg_t rxChannel[ADI_ADRV904X_MAX_RX_ONLY]; /*!< Top-level GPIO structure to configure all Rx Carrier RSSI GPIO pins for all Rx Channels */ +} adi_adrv904x_RxCarrierRssiGpioCfg_t; + + + + +/** + * \brief Enum of Rx Carrier RSSI default Operation modes + */ +typedef enum adi_adrv904x_RxDdcRssiOpMode +{ + ADI_ADRV904X_RX_DDC_RSSI_OP_MODE_SUMPOWER2 = 0U, /*!< RSSI*Meas Duration = Sum of [mult[n] * 2^(duration[n])] for n=0-3. Power calculation is accurate to 0.5dB */ + ADI_ADRV904X_RX_DDC_RSSI_OP_MODE_POWER2 = 1U /*!< RSSI Meas Duration = 2^(duration0 + 4). Power calculation is accurate to 0.25dB */ +} adi_adrv904x_RxDdcRssiOpMode_e; + + +/** + * \brief Enum of Rx DDC RSSI default modes + */ +typedef enum adi_adrv904x_RxDdcRssiMeasMode +{ + ADI_ADRV904X_RX_DDC_RSSI_MEAS_MODE_IMMEDIATE = 0U, /*!< Power measurement starts immediately when rssi_enable bit-field is set. */ + ADI_ADRV904X_RX_DDC_RSSI_MEAS_MODE_NEXT_RXON = 1U, /*!< Power measurement starts at the next RxOn */ + ADI_ADRV904X_RX_DDC_RSSI_MEAS_MODE_NEXT_RXON_THEN_WAIT = 2U /*!< Power measurement starts at the next RxOn. + Once measurement is complete, the block waits for a period specified + by rssi_wait_delay and then starts the next measuremen */ +} adi_adrv904x_RxDdcRssiMeasMode_e; + + +/** + * \brief Data structure to hold Rx (DDC/CDDC) RSSI power meter configuration parameters + */ +typedef struct adi_adrv904x_RxRssiCfg +{ + uint16_t meterMask; /*!< meter mask */ + uint32_t channelMask; /*!< Rx Channel Mask selection */ + uint8_t enableGainCalc; /*!< When this bit is set, the power measurement includes compensation + * for the gain that is applied down the datapath. + * When this bit is disabled, the measured power is just what is observed by the + * RSSI block and does not include any gain/attenuation compensation. + */ + uint8_t gaintableStepSize; /*!< DDC - LSB resolution is 0.05dB. (6 bits, 0x3F) */ + uint8_t resetAtGainChange; /*!< When this bit is set, the power measurement will be reset on any gain + * index change from the AGC gaintable. + */ + uint8_t radioSeqPinModeEnable; /*!< radio seq control, radio_seq_sel. NA for DDC RSSI blocks */ + adi_adrv904x_RxDdcRssiOpMode_e opMode; /*!< RSSI Measurement Default operation Mode + * When this bit is 1, the duration of the power measurement is power of 2 and + * is specified by rssi_meas_duration0. + * The other durations do not affect the measurement. + * When this bit is 0, the duration of measurement is non-power of 2. + * In this case, two or more of the rssi_meas_duration0/1/2/3 are used. + * The power from each duration is weighted by rssi_mul_factor0/1/2/3. + * If a given multiplication factor is 0, that duration is not included in the calculation. + * It is required that the lower most multiplication factors can be 0. + * For eg: mul0 = x, mul1 = x, mul2 = 0, mul3 = 0 is valid. mul0 = x, mul1 = 0, mul2 = x, mul3 = x is not valid. + */ + adi_adrv904x_RxDdcRssiMeasMode_e measMode; /*!< RSSI Measurement mode (2 bits) + * 2'b00 - Power measurement starts immediately when rssi_enable bit-field is set. + * 2'b01 - Power measurement starts at the next RxOn. + * There is a delay after the RxOn configured by rssi_start_delay that has to expire before measurement starts. + * Once measurement is complete, the block waits for next RxOn. + * 2'b10 - Power measurement starts at the next RxOn. + * There is a delay after the RxOn configured by rssi_start_delay that has to expire before measurement starts. + * Once measurement is complete, the block waits for a period specified by rssi_wait_delay and then starts the next measurement. + */ + uint16_t startDelay; /*!< Delay in start of Rx RSSI measurement in ddc_hb1_out_clk cycles after RxON goes high. + * Delay = rxon_start_delay[15:0] * 2^4 Max delay at 983MHz is 1msec. + * (13 bits, 0x1FFF) + */ + uint32_t contDelay; /*!< Delay = rssi_cont_delay * 2^4 + * This delay is measured at the end of measurement. + * It delays the start of next measurement in the rssi_mode=0 and 2. + * (24 bits, 0xFFFFFF) + */ + uint32_t waitDelay; /*!< Delay = rssi_wait_delay * 2^4 + * This delay is measured at the end of measurement. + * It delays the start of next measurement in the rssi_mode=0 and 2. + * (24 bits, 0xFFFFFF) + */ + uint8_t fddPinMode; /*!< Enable RSSI via GPIO instead of AHB */ + uint8_t duration0; /*!< Measurement duration for RSSI power. + * Number of samples = 2 ^ (tx_tss_measurement_duration_duc*) + * This is the only duration that is used when rssi_default_mode = 1. + * (5 bits, 0x1F) + */ + uint8_t duration1; /*!< Measurement duration for RSSI power. + * Number of samples = 2 ^ (tx_tss_measurement_duration_duc*) + * This is the only duration that is used when rssi_default_mode = 0. + * It is required to configure the multiplier factor correctly to use this duration. + * (5 bits, 0x1F) + */ + uint8_t duration2; /*!< Measurement duration for RSSI power. + * Number of samples = 2 ^ (tx_tss_measurement_duration_duc*) + * This is the only duration that is used when rssi_default_mode = 0. + * It is required to configure the multiplier factor correctly to use this duration. + * (5 bits, 0x1F) + */ + uint8_t duration3; /*!< Measurement duration for RSSI power. + * Number of samples = 2 ^ (tx_tss_measurement_duration_duc*) + * This is the only duration that is used when rssi_default_mode = 0. + * It is required to configure the multiplier factor correctly to use this duration. + * (5 bits, 0x1F) + */ + uint16_t mulFactor0; /*!< This bit-field is used when rssi_default_mode = 0. + * This is a 0.8 number. This is the weight of power calculated during duration 0. + * (DDC = 8 bits, 0xFF. CDDC = 16 bits, 0xFFFF) + */ + uint16_t mulFactor1; /*!< This bit-field is used when rssi_default_mode = 0. + * This is a 0.8 number. This is the weight of power calculated during duration 1. + * (DDC = 8 bits, 0xFF. CDDC = 16 bits, 0xFFFF) + */ + uint16_t mulFactor2; /*!< This bit-field is used when rssi_default_mode = 0. + * This is a 0.8 number. This is the weight of power calculated during duration 2. + * (DDC = 8 bits, 0xFF. CDDC = 16 bits, 0xFFFF) + */ + uint16_t mulFactor3; /*!< This bit-field is used when rssi_default_mode = 0. + * This is a 0.8 number. This is the weight of power calculated during duration 3. + * (DDC = 8 bits, 0xFF. CDDC = 16 bits, 0xFFFF) + */ + uint32_t debug; /*!< for debugging */ +} adi_adrv904x_RxRssiCfg_t; + +#endif /* _ADI_ADRV904X_RX_TYPES_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_tx.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_tx.h new file mode 100644 index 00000000000..a9eb28f1357 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_tx.h @@ -0,0 +1,1779 @@ +/** + * Copyright 2015 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/** + * \file adi_adrv904x_tx.h + * \brief Contains top level ADRV904X related function prototypes for + * adi_adrv904x_tx.c + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADI_ADRV904X_TX_H_ +#define _ADI_ADRV904X_TX_H_ + +#include "adi_adrv904x_tx_types.h" +#include "adi_adrv904x_error.h" + +#include "adi_adrv904x_dfe_svc_dfe_pwr_mtr_t.h" +#include "adi_adrv904x_carrier_reconfigure_types.h" + +/** + * \brief Get Tx RF output attenuation table data. + * + * A full TxAtten table can be read in a single call. Or the table can be read in several calls, + * reading a subset of the table with each function call using the txAttenIndexOffset parameter. + * + * \pre This function may be called any time after device initialization. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure. + * \param[in] txChannel The tx channel whose atten table to access. + * \param[in] txAttenIndexOffset Index in tx atten table from which to start reading. + * \param[in,out] txAttenTableRows A caller-supplied array where the table data is written. + * \param[in] numTxAttenEntries The number of rows to read from the tx atten table. + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenTableRead(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + const uint32_t txAttenIndexOffset, + adi_adrv904x_TxAttenTableRow_t txAttenTableRows[], + const uint32_t numTxAttenEntries); + +/** +* \brief This API function has to be used in order to set the Tx RF output attenuation +* for the Tx output channels +* +* The attenuation given by txAttenuation.txAttenuation_mdB will be applied to the txChannel or channels +* indicated by the txAttenuation.txChannelMask as follows +* +*| txChannel | Description | +*|:-------------------:|:---------------------------------------------:| +*| ADI_ADRV904X_TX0 | sets attenuation txAttenuation_mdB for TX0 | +*| ADI_ADRV904X_TX1 | sets attenuation txAttenuation_mdB for TX1 | +*| ADI_ADRV904X_TX2 | sets attenuation txAttenuation_mdB for TX2 | +*| ADI_ADRV904X_TX3 | sets attenuation txAttenuation_mdB for TX3 | +*| ADI_ADRV904X_TX4 | sets attenuation txAttenuation_mdB for TX4 | +*| ADI_ADRV904X_TX5 | sets attenuation txAttenuation_mdB for TX5 | +*| ADI_ADRV904X_TX6 | sets attenuation txAttenuation_mdB for TX6 | +*| ADI_ADRV904X_TX7 | sets attenuation txAttenuation_mdB for TX7 | + +* \pre This function may be called any time after device initialization +* \pre This feature requires the initialization to be complete and the attenuation table to be loaded. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure +* \param[in] txAttenuation array of structure type adi_adrv904x_TxAtten_t +* which indicates the channel and the desired TxAttenuation in milli-dB +* (Range: 0 to 41950 mdB) +* \param[in] numTxAttenConfigs array size passed in txAttenuation array +* +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenSet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxAtten_t txAttenuation[], + const uint32_t numTxAttenConfigs); + +/** +* \brief Reads back the attenuation setting for the Tx channel output for the selected channel +* +* This function reads back the Tx attenuation setting for either the Tx0, Tx1, Tx2, Tx3 , Tx4, Tx5, Tx6, Tx7 RF channel currently applied to the transmit chain. +* This function can work with SPI mode or pin controlled Tx attenuation mode using the increment/decrement GPIO +* pins. +* +* \pre This feature requires the initialization to be complete and the attenuation table to be loaded. +* \pre The Tx data path must be powered up for the current attenuation value to be valid. If the Tx data path +* is powered down or the radio is off, the last Tx attenuation setting when the Tx output was previously active will be +* read back. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device's data structure +* \param[in] txChannel channel selection to read the attenuation is of type adi_adrv904x_TxChannels_e +* \param[out] txAttenuation Pointer to structure of adi_adrv904x_TxAtten_t type to store the readback value of the desired Tx channel attenuation in milli-dB (Range: 0 to 41950 mdB) +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_TxAtten_t * const txAttenuation); + +/** +* \brief Configures the Tx attenuation mechanism for one or more channels. +* +* \pre This function is called after the device is initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the adrv904x data structure +* \param[in] chanMask a bit mask indicating the channels to be configured. If the LSB of chanMask is set Tx channel 0 +* will be configured by the call and so on. +* \param[in] txAttenCfg the Tx atten configuration to be assigned to the channels indicated by chanMask +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenCfgSet(adi_adrv904x_Device_t* const device, + const uint32_t chanMask, + adi_adrv904x_TxAttenCfg_t* const txAttenCfg); +/** +* \brief Gets the Tx atten configuration for a channel. +* +* \pre This function is called after the device is initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the adrv904x data structure +* \param[in] txChannel the Tx channel id whose Tx atten to fetch. +* \param[out] txAttenCfg the atten config is written here. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_TxAttenCfg_t* const txAttenCfg); + +/** + * \brief Set the attenuation levels in S0 or S1 registers. + * + * These registers form two of several possible sources for the Tx attenuation applied to a channel. Depending + * on other Tx attenuation-update configuration, which can be set using adi_adrv904x_TxAttenUpdateCfgSet, + * setting the S0, S1 registers may or may not result in an immediate change in a channel's Tx attenuation. + * + * \param[in,out] device Context variable - Pointer to the device data structure. + * \param[in] chanMask Indicates the channels to which the attenuation value applies. + * \param[in] levelMilliDB The Tx attenuation in 1/1000s of a decibel. Valid range 0 - 41950, equivalent to 0 - 41.95 dB. + * \param[in] isS0 If non-zero the value into channels' S0 registers otherwise into their + * S1 registers. + * + * \retval adi_common_ErrAction_e + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenS0S1Set(adi_adrv904x_Device_t* const device, + const uint32_t chanMask, + const uint32_t levelMilliDB, + const uint8_t isS0); + +/** + * \brief Get the attenuation levels in S0 or S1 registers. + * + * \param[in,out] device Context variable - Pointer to the device data structure. + * \param[in] txChannel The channel from which to read. + * \param[out] levelMilliDB The retrieved value is written here. + * \param[in] isS0 If non - zero the channels' S0 register is read otherwise the S1 register. + * + * \retval adi_common_ErrAction_e + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenS0S1Get(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + uint32_t* const levelMilliDB, + const uint8_t isS0); + +/** + * \brief Set the Tx attenuation update configuration for several channels. + * + * Each Tx channel's update configuration consists of: + * - an attenuation level source(S0, S0_OR_S1) + * - an attenuation update trigger(GPIO, SPI, NONE) + * - for the cases of GPIO trigger and S0_OR_S1 source some extra configuration information. + * + * Limitations : + * -Setting any channel to trigger on SPI will implicitly set any channels previously configured to trigger + * on GPIO to have a NONE trigger. + * -Setting any channel to trigger on GPIO will implicitly set any channels previously configured to trigger + * on SPI to have a NONE trigger. + * + * \param[in,out] device Context variable - pointer to the device data structure. + * \param[in] chanMask Tx channels to which the configuration is applied + * \param[in] cfg contains the attenuation update source and trigger settings. + * + * Return Value : + * adi_common_ErrAction_e + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenUpdateCfgSet(adi_adrv904x_Device_t* const device, + const uint32_t chanMask, + const adi_adrv904x_TxAttenUpdateCfg_t* const cfg); + +/** + * \brief Get the Tx attenuation update configuration for a channel. + * + * \param[in,out] device Context variable - pointer to the device data structure. + * \param[in] txChannel Tx channel whose update configuration to get. + * \param[out] cfg the attenuation update settings for chanId are written here. + * + * Return Value : + * adi_common_ErrAction_e + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenUpdateCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_TxAttenUpdateCfg_t* const cfg); + +/** + * \brief Simultaneously update the Tx attenuation level for several channels. + * + * This function only has an effect for channels that have already had their attenuation update trigger set + * to SPI using TxAttenUpdateCfgSet(). The effect of the attenuation update will be simultaneous across all + * affected channels. + * + * \param[in,out] device Context variable - pointer to the device data structure. + * \param[in] chanMask Tx channels on which to update Tx attenuation. + * + * Return Value : + * adi_common_ErrAction_e + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenUpdate(adi_adrv904x_Device_t *const device, + const uint32_t chanMask); + +/** +* \brief This function reads back the LO Source Mapping to the requested Tx channel. +* +* The LO source select for a given channel is configured during init time. This function +* can be used to read back the configuration during run time. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X data structure +* \param[in] txChannel Enum to select Tx Channel +* \param[out] txLoSource Pointer to store Tx channel LO source mapping read back +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxLoSourceGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_LoSel_e * const txLoSource); + +/** +* \brief Function to set the Tx power monitor configuration. +* +* This function can be used to configure peak power monitor and average power monitor blocks. +* A peak is detected if the signal I and Q samples are above a pre-set threshold (PowerMonitorCfg_t.peakPreThreshold) +* and (I^2+Q^2) of the signal exceeds another threshold(PowerMonitorCfg_t.peakThreshold) more than a preset +* count(PowerMonitorCfg_t.peakDetectOverloadCount) within time window configured with PowerMonitorCfg_t.peakDetectOverloadWindowSize. +* If number a valid peaks exceeds PowerMonitorCfg_t.peakCount within PowerMonitorCfg_t.peakDuration time period, peak detection +* error flag is asserted. The signal power (I^2+Q^2) is averaged over a PowerMonitorCfg_t.avgDuration time period and if +* this average value exceeds PowerMonitorCfg_t.avgPowerThreshold, average power error flag is asserted. +* +* This function takes in an array of adi_adrv904x_PowerMonitorCfgRt_t structures to program the Tx channels. +* Each structure has a separate channel mask that indicates to which Tx channels that particular configuration applies. +* Example usage with two different configurations: +* +* txPowerMonitorCfg = (adi_adrv904x_PowerMonitorCfgRt_t *)malloc(2 * sizeof(adi_adrv904x_PowerMonitorCfgRt_t)) +* +* txPowerMonitorCfg[0].txPowerMonitorCfg = txPowerMonitorCfg1; // Configuration 1 loaded with desired configuration values +* txPowerMonitorCfg[0].txChannelMask = (uint32_t)(ADI_ADRV904X_TX0 | ADI_ADRV904X_TX1 | ADI_ADRV904X_TX2 | ADI_ADRV904X_TX3); +* +* txPowerMonitorCfg[1].txPowerMonitorCfg = txPowerMonitorCfg2; // Configuration 2 loaded with desired configuration values +* txPowerMonitorCfg[1].txChannelMask = (uint32_t)(ADI_ADRV904X_TX4 | ADI_ADRV904X_TX5 | ADI_ADRV904X_TX6 | ADI_ADRV904X_TX7); +* +* retVal = adi_adrv904x_TxPowerMonitorCfgSet(device, txPowerMonitorCfg, 2); +* +* Note: The function does not check for duplicated channel assignments across cfg structures. +* Invalid channel mask values will return an error. +* Not all Tx channels must be assigned a configuration. If a channel mask is zero that configuration is ignored, ie no +* error returned. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the adrv904x data structure +* \param[in] txPowerMonitorCfg array of structures of type adi_adrv904x_PowerMonitorCfgRt_t which will configure one or more channels +* \param[in] numPowerProtectCfgs number of configurations passed in the array +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxPowerMonitorCfgSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_PowerMonitorCfgRt_t txPowerMonitorCfg[], + const uint32_t numPowerProtectCfgs); + + + +/** +* \brief Function to get the Tx power monitor configuration. +* +* This function can be used to read back the power monitor configuration for selected channel. +* User can select the Tx channel by using adi_adrv904x_PowerMonitorCfgRt_t.txChannelMask +* Only one Tx channel should be selected at a time, otherwise this function will throw an error. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the adrv904x data structure +* \param[in,out] txPowerMonitorCfg Pointer to power monitor configuration to be populated +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxPowerMonitorCfgGet(adi_adrv904x_Device_t * const device, + adi_adrv904x_PowerMonitorCfgRt_t* const txPowerMonitorCfg); + + +/** +* \brief This function reads the status of events causing Tx power ramp down +* +* Each Tx Channel(0-7) has independent ramp-down event status bits. +* Only one Tx channel should be selected at a time, otherwise this function will throw an error. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the adrv904x data structure +* \param[in] txChannel Channel selection to read error flags +* \param[out] eventBits Pointer to error mask to be populated by this function +* Bit | Description +* ---------- -|----------------------------------------------------------------------------- +* [4-7] | Reserved +* [3] | Pll Unlock / Dfrm Error +* [2] | SRD error +* [1] | Pa Protection Peak Power Error +* [0] | Pa Protection Average Power Error + + +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxProtectionErrorGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + uint32_t* const eventBits); + +/** +* \brief This function clears the error flags causing Tx power ramp down +* +* Each Tx Channel(0-7) has independent ramp-down event flags. +* Only one Tx channel should be selected at a time, otherwise this function will throw an error. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the adrv904x data structure +* \param[in] txChannel Channel selection to clear error flags +* \param[in] eventBits Mask selecting the error flags to be cleared +* Bit | Description +* ----------- |----------------------------------------------------------------------------- +* [4-7] | Reserved +* [3] | Pll Unlock / Dfrm Error +* [2] | SRD error +* [1] | Pa Protection Peak Power Error +* [0] | Pa Protection Average Power Error + + +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxProtectionErrorClear(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxChannels_e txChannel, + const uint32_t eventBits); + + +/** +* \brief Function to set the Tx Slew Rate Detector configuration +* Slew rate is calculated as (I[n]-I[n-1])^2+(Q[n]-Q[n-1])^2 where n is the latest sample index of both I and Q samples. +* If calculated slew is greater than a pre-set limit, txSlewRateDetectorCfg.srdOffset, slew rate error is asserted. +* User might assign slew rate event to GPIO with txSlewRateDetectorCfg.gpioSel. +* +* This function takes in an array of adi_adrv904x_SlewRateDetectorCfgRt_t structures to program the Tx channels. +* Each structure has a separate channel mask that indicates to which Tx channels that particular configuration applies. +* Example usage with two different configurations: +* +* txSlewRateDetectorCfg = (adi_adrv904x_SlewRateDetectorCfgRt_t *)malloc(2 * sizeof(adi_adrv904x_SlewRateDetectorCfgRt_t)) +* +* txSlewRateDetectorCfg[0].txSlewRateDetectorCfg = txSlewRateDetectorCfg1; // Configuration 1 loaded with desired configuration values +* txSlewRateDetectorCfg[0].txChannelMask = (uint32_t)(ADI_ADRV904X_TX0 | ADI_ADRV904X_TX1 | ADI_ADRV904X_TX2 | ADI_ADRV904X_TX3); +* +* txSlewRateDetectorCfg[1].txSlewRateDetectorCfg = txSlewRateDetectorCfg2; // Configuration 2 loaded with desired configuration values +* txSlewRateDetectorCfg[1].txChannelMask = (uint32_t)(ADI_ADRV904X_TX4 | ADI_ADRV904X_TX5 | ADI_ADRV904X_TX6 | ADI_ADRV904X_TX7); +* +* retVal = adi_adrv904x_TxSlewRateDetectorCfgSet(device, txSlewRateDetectorCfg, 2); +* +* Note: The function does not check for duplicated channel assignments across cfg structures. +* Invalid channel mask values will return an error. +* Not all Tx channels must be assigned a configuration. If a channel mask is zero that configuration is ignored, ie no +* error returned. +* +* \pre This function is called after the device is initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the adrv904x data structure +* \param[in] txSlewRateDetectorCfg an array holding all the Slew Rate Detector configurations required with the assigned channel mask +* \param[in] numSlewRateDetCfgs the number of elements in txSlewRateDetectorCfg array + +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxSlewRateDetectorCfgSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SlewRateDetectorCfgRt_t txSlewRateDetectorCfg[], + const uint32_t numSlewRateDetCfgs); + +/** +* \brief Function to get the Tx SRD configuration. +* +* This function can be used to read back the slew rate detector configuration for selected channel. +* User can select the Tx channel by using adi_adrv904x_SlewRateDetectorCfgRt_t.txChannelMask +* Only one Tx channel should be selected at a time, otherwise this function will throw an error. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the adrv904x data structure +* \param[in,out] txSlewRateDetectorCfg Pointer to SRD configuration to be populated +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxSlewRateDetectorCfgGet(adi_adrv904x_Device_t * const device, + adi_adrv904x_SlewRateDetectorCfgRt_t * const txSlewRateDetectorCfg); + +/** +* \brief This function reads SRL statistics. +* Statistics might either be the maximum slew observed or the number of samples which have been +* slew rate limited(Maximum = 65536 sample count) depending on the statistics mode. +* Statistics mode can be selected with adi_adrv904x_TxSlewRateDetectorCfgSet. +* \pre This function is called after the device is initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the adrv904x data structure +* \param[in] txChannel enum to select Tx channel +* \param[in] clearStats 0:Don't clear statistics after reading / 1: Clear statistics after reading. +* \param[out] statisticsReadback Pointer to memory location where readback value will be written +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxSlewRateStatisticsRead(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxChannels_e txChannel, + const uint8_t clearStats, + uint16_t * const statisticsReadback); + +/** +* \brief This function enables/disables the sample hold for tx pa protection ramp. If +* sample hold is enabled, last good sample (the sample before pa protection error flag is +* asserted) is held after FIR1 block. Once the ramp down is completed, signal starts to travel +* in datapath again. This feature can be used to prevent offending sample to reach PA and can be +* useful especially for slew rate events. +* +* \pre This function is called after the device is initialized. +* +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the adrv904x data structure +* \param[in] txChannelMask Tx channel mask to select channel/s for which sample hold will be enabled/disabled +* \param[in] enable 1:Enable sample hold // 0:Disable sample hold + +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxProtectionRampSampleHoldEnableSet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const uint8_t enable); + +/** +* \brief This function reads back sample hold ramp down configuration for selected Tx channel +* +* \pre This function is called after the device is initialized. +* +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the adrv904x data structure +* \param[in] txChannel Tx channel to read sample hold and ramp down configuration +* \param[out] enable Pointer to sample hold and ramp down configuration +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxProtectionRampSampleHoldEnableGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + uint8_t* const enable); + + +/** +* \brief Function to set the Tx Protection Ramp configuration. This function configures Tx ramp-down in +* case of Average Power Error/Peak Power Error/SRD Error/Pll Unlock/Dfrm Irq. Each Tx channel has +* independent ramp-down configuration. +* +* Ramp down functionality uses Tx attenuation block. This would set to tx attenuation index +* to maximum value to ramp down the tx power. +* +* \pre This function is called after the device is initialized. +* +* This function takes in an array of adi_adrv904x_ProtectionRampCfgRt_t structures to program the Tx channels. +* Each structure has a separate channel mask that indicates to which Tx channels that particular configuration applies. +* Example usage with two different configurations: +* +* txProtectionRampCfg = (adi_adrv904x_ProtectionRampCfgRt_t *)malloc(2 * sizeof(adi_adrv904x_ProtectionRampCfgRt_t)) +* +* txProtectionRampCfg[0].txProtectionRampCfg = txProtectionRampCfg1; // Configuration 1 loaded with desired configuration values +* txProtectionRampCfg[0].txChannelMask = (uint32_t)(ADI_ADRV904X_TX0 | ADI_ADRV904X_TX1 | ADI_ADRV904X_TX2 | ADI_ADRV904X_TX3); +* +* txProtectionRampCfg[1].txProtectionRampCfg = txProtectionRampCfg2; // Configuration 2 loaded with desired configuration values +* txProtectionRampCfg[1].txChannelMask = (uint32_t)(ADI_ADRV904X_TX4 | ADI_ADRV904X_TX5 | ADI_ADRV904X_TX6 | ADI_ADRV904X_TX7); +* +* retVal = adi_adrv904x_TxProtectionRampCfgSet(device, txProtectionRampCfg, 2); +* +* Note: The function does not check for duplicated channel assignments across cfg structures. +* Invalid channel mask values will return an error. +* Not all Tx channels must be assigned a configuration. If a channel mask is zero that configuration is ignored, ie no +* error returned. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the adrv904x data structure +* \param[in] txProtectionRampCfg array of structures of type adi_adrv904x_ProtectionRampCfg_t which will configure one or more channels +* \param[in] numProtectionRampCfgs number of configurations passed in the array + +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxProtectionRampCfgSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_ProtectionRampCfgRt_t txProtectionRampCfg[], + const uint32_t numProtectionRampCfgs); + +/** +* \brief Function to read the Tx Protection Ramp configuration. +* +* User can select the Tx channel by using adi_adrv904x_TxProtectionRampCfgRt_t.txChannelMask +* Only one Tx channel should be selected at a time, otherwise this function will throw an error. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the adrv904x data structure +* \param[in,out] txProtectionRampCfg Pointer to ramp down configuration to be populated with readback value +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxProtectionRampCfgGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_ProtectionRampCfgRt_t* const txProtectionRampCfg); + +/** +* \brief This function reads average and peak power, average to peak ratio(if enabled), +* average power at the time when last average power error occurred, peak power at the time +* when last peak power error occurred. Power readback will be returned 0 if corresponding +* block(Avg Power/Peak Power/Average to Peak Ratio) is not enabled. +* +* Average Power in dBFS = 10 * log10(avgPower/2^16) +* Power Error in dBFS = 10 * log10(avgErrorPower/2^16) +* Ratio calculation for avgPeakRatio : avgPower/peakPower = ((avgPeakRatio) / 2^15) + +* \pre This function can be called after the device is initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the adrv904x data structure +* \param[in] txChannel enum to select Tx channel +* \param[out] powerMonitorStatus Pointer to memory location where readback value will be written +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxPowerMonitorStatusGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_TxPowerMonitorStatus_t * const powerMonitorStatus); + + + /** + * \brief Sets the specified Tx Mix NCO to the given frequency, band number, and enable state in the adi_adrv904x_TxNcoMixConfig_t structure. + * + * \pre This function can be called after the CPU has been initialized. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[in] txNcoConfig Pointer to the TX NCO Mix configuration settings + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxNcoShifterSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxNcoMixConfig_t * const txNcoConfig); + +/** + * \brief Gets TX Mix NCO parameters in adi_adrv904x_TxNcoMixConfigReadbackResp_t structure. + * + * \pre This function can be called after the CPU has been initialized, firmware loaded and the TX Mix NCO configured. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[in,out] txRbConfig Pointer to the TX NCO config read back settings + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxNcoShifterGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_TxNcoMixConfigReadbackResp_t* const txRbConfig); + +/** +* \brief Sets the specified Tx CDUC NCO in the adi_adrv904x_TxCducNcoConfig_t structure. +* +* \pre This function can be called after the CPU has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] txCducNcoConfig Pointer to the TX CDUC NCO configuration settings +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxCducNcoSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxCducNcoConfig_t * const txCducNcoConfig); + +/** + * \brief Gets TX CDUC NCO parameters in adi_adrv904x_TxCducNcoConfigReadbackResp_t structure. + * + * \pre This function can be called after the CPU has been initialized, firmware loaded and the TX CDUC NCO configured. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[in,out] txRbConfig Pointer to the TX NCO config read back settings + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxCducNcoGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_TxCducNcoConfigReadbackResp_t* const txRbConfig); + +/** +* \brief Set Fractional Delay via pFIR (Used in CTC Mode 2) +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] txChan - Tx channel +* \param[in] fracDelay - fractional Delay (0:63) +* +* \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxPfirFracDelaySet(adi_adrv904x_Device_t* const device, + const uint8_t txChan, + const uint8_t fracDelay); +/** + * \brief Sets the specified Tx Test NCO to the given frequency, band number, attenuation control, and enable state + * in the adi_adrv904x_TxTestNcoConfig_t structure. + * + * \pre This function can be called after the CPU has been initialized. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[in] txNcoConfig Pointer to the TX NCO Test config settings + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxTestToneSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxTestNcoConfig_t * const txNcoConfig); + +/** + * \brief Gets TX Test NCO parameters in adi_adrv904x_TxTestNcoConfigReadbackResp_t structure. + * + * \pre This function can be called after the CPU has been initialized, firmware loaded and the TX Test NCO configured. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[in,out] txRbConfig Pointer to the RX NCO config read back settings + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxTestToneGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_TxTestNcoConfigReadbackResp_t* const txRbConfig); + +/** +* \brief Function to configure Tx decimated power measurement block. +* +* This function can be used to configure decimated power measurements for Tx channel. +* Measurement point and measurement duration can be selected by user through configuration structure. +* This function configures Tx dec power block. +* +* Note: The function does not check for duplicated channel assignments across cfg structures. +* Invalid channel mask values will return an error. + +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] txDecPowerCfg array of structures of type adi_adrv904x_TxDecimatedPowerCfg_t which will configure one or more channels +* \param[in] numOfDecPowerCfgs number of configurations passed in the array +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxDecimatedPowerCfgSet(adi_adrv904x_Device_t * const device, + adi_adrv904x_TxDecimatedPowerCfg_t txDecPowerCfg[], + const uint32_t numOfDecPowerCfgs); + +/** +* \brief Function to read back Tx decimated power measurement configuration +* +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] txChannel Tx channel selection to read decimated power block configuration +* \param[out] txDecPowerCfg Decimated power configuration of selected channel/dec power block +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxDecimatedPowerCfgGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_TxDecimatedPowerCfg_t * const txDecPowerCfg); + + +/** +* \brief Function to readback the decimated power measurement for selected Tx channel. +* Power readback value is an unsigned 8 bit value with 0.25dB resolution. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] txChannel Channel selection to read decimated power measurement +* \param[out] powerReadBack Pointer to power measurement readback value +* \param[out] powerPeakReadBack Pointer to power measurement readback value +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxDecimatedPowerGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxChannels_e txChannel, + uint8_t * const powerReadBack, + uint8_t * const powerPeakReadBack); + +/** + * \brief Sets the specified Tx Atten Phase in the adi_adrv904x_TxAttenPhaseCfg_t structure. + * + * \pre This function can be called after the CPU has been initialized. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[in] txAttenPhaseCfg Pointer to the TX Atten Phase configuration settings + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenPhaseSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxAttenPhaseCfg_t * const txAttenPhaseCfg); + +/** + * \brief Gets TX Atten Phase in adi_adrv904x_TxAttenPhaseCfg_t structure. + * + * \pre This function can be called after the CPU has been initialized, firmware loaded and the TX Atten Phase configured. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[in,out] txRbConfig Pointer to the TX Atten Phase config read back settings + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenPhaseGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_TxAttenPhaseCfg_t* const txRbConfig); + + +/** +* \brief Configures Discontinuous Transmit (DTX) features +* +* DTX provides the ability to shut down the clock to save power through three different mode: Automatic mode, SPI controlled mode, or Pin Control mode. +* dtx_mode_enable Operation Notes +* 2'b00 DTx mode disable +* 2'b01 Automatic mode. Triggers the power down stream on observing a specified number of zero samples (dtx_zero_counter) on Tx input data. Power up stream is triggered as soon as a non zero sample is seen. The number of samples defined is at the slower of the 2 DUC in clock rates. +* 2'b10 SPI controlled mode In this mode, power down is triggered on setting the dtx_force bitfield. Clearing that bit triggers the power up stream. +* 2'b11 Pin controlled mode In this mode, a GPIO pin specified by the dtx_force_gpio_select controls Power up/down. Rising edge on the pin triggers the power down stream and a falling edge triggers a power up stream +* +* Configure the DTX registers. Set the DTX Mode, DTX zero counter for the Tx channels +* +* The DTX configs can be broadcast / multicast based +* on the channel mask parameter in adi_adrv904x_DtxCfg_t structure. +* +* dtxCfg[i]->txChannelMask | Tx Channels to set DTX +* ---------------------------------|-------------------------------------- +* bit[0] | 1 = Tx0 DTX is updated +* | +* bit[1] | 1 = Tx1 DTX is updated +* | +* bit[2] | 1 = Tx2 DTX is updated +* | +* bit[3] | 1 = Tx3 DTX is updated +* | +* bit[4] | 1 = Tx4 DTX is updated +* | +* bit[5] | 1 = Tx5 DTX is updated +* | +* bit[6] | 1 = Tx6 DTX is updated +* | +* bit[7] | 1 = Tx7 DTX is updated + +* +* Eg: To update DTX for channels Tx3 and Tx0, the dtxCfg[i]->txChannelMask +* should be set to 0x00000009 +* +* Eg: To update DTX for all Tx channels, the dtxCfg[i]->txChannelMask +* should be set to 0x000000FF +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \pre This function may be called any time after device initialization +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] dtxCfg Array of the channelized DTX settings +* \param[in] numDtxCfgs Size of dtxCfg array +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DtxCfgSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DtxCfg_t dtxCfg[], + const uint32_t numDtxCfgs); +/** +* \brief Reads the Discontinuous Transmit (DTX) settings for the requested Tx channel +* +* This function reads the DTX settings for the requested +* channel. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* +* \pre This function may be called any time after device initialization +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] txChannel adi_adrv904x_TxChannels_e enum type to select channel from. +* \param[out] dtxCfg Pointer to the DTX structure for the requested channel. +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +* +* +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DtxCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_DtxCfg_t* const dtxCfg); +/** +* \brief Configures Discontinuous Transmit (DTX) GPIO features +* +* +* Given design constraints and that GPIOs are a shared resource there +* are limitations on the set of valid configurations. This API only +* configures the GPIO settings. For all other settings please use +* the adi_adrv904x_DtxCfgSet() API. +* +* The channel should be selected through dtxGpioCfg structure +* dtxGpioCfg.dtxGpioTxSel[0] = GPIO for channel 0; +* ........... +* dtxGpioCfg.dtxGpioTxSel[7] = GPIO for channel 7; +* +* Errors will be returned under the following conditions: +* - The requested GPIO is being used by another resource +* - The configuration requested is invalid +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] dtxGpioCfg Pointer to the DTX GPIO structure +* +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +* +* +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DtxGpioCfgSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DtxGpioCfg_t* dtxGpioCfg); + +/** +* \brief Reads the Discontinuous Transmit (DTX) for the requested Tx channel +* +* This function reads the DTX GPIO settings for the requested +* channel. +* The channel should be selected through dtxGpioCfg structure +* dtxGpioCfg.dtxGpioTxSel[0] = GPIO for channel 0; +* ........... +* dtxGpioCfg.dtxGpioTxSel[7] = GPIO for channel 7; +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] dtxGpioCfg Pointer to the DTX GPIO structure +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DtxGpioCfgGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DtxGpioCfg_t* const dtxGpioCfg); + + + +/** +* \brief Set the Discontinuous Transmit (DTX) Force bit for the requested Tx channels. +* +* In SPI Mode, power down is triggered on setting the dtx_force bitfield. Clearing that bit triggers the power up stream. +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] txChannelMask Tx Channels for which the DTX Force to be update. +* \param[in] dtxForce DTX status bit to be read +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DtxForceSet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const uint8_t dtxForce); + +/** +* \brief Reads the Discontinuous Transmit (DTX) status for the requested Tx channel +* +* This function reads the DTX status for the requested +* channel. +* +* Status bits logic +* bit0: set by dtx_power_down; clear by dtx_power_up ( or cleared by spi_clear_dtx_status_bit0, not required) +* bit1: set by dtx_power_down; clear by spi_clear_dtx_status_bit1 (executed at the end of power up stream) +* +* \dep_begin +* \dep{device->halDevInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] txChannel Tx Channels for which the DTX Status to read. +* \param[out] dtxStatus DTX status bit to be read +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DtxStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + uint8_t * const dtxStatus); + + + +/** + * \brief Set the Tx TSSI or ORx TSSI power measurement configuration + * This function sets the configuration of the TSSI power measurement. + * Must use adi_adrv904x_DfePwrMtrTssiEnable() to enable the meter. + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] channelMask - Tx or ORx channel number mask; multiple channels allowed + * \param [in] pPwrMtrTssiCfg - pointer to power meter config structure + * \param [in] meter - TSSI Tx (1 or 2) or TSSI ORx + * \param [in] source - source type (only applies to TSSI Tx meters) + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrTssiConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t channelMask, + const adi_adrv904x_DfeSvcDfePwrMtrTssiCfg_t* pPwrMtrTssiCfg, + const adi_adrv904x_DfeSvcDfePwrMtrTssi_e meter, + const adi_adrv904x_DfeSvcDfePwrMtrTssiSrc_e source); +/** + * \brief Get the Tx TSSI or ORx TSSI power measurement configuration + * This function gets the configuration of the TSSI power measurement + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] channelSel - Tx or ORx channel number mask; only one channel allowed + * \param [out] pPwrMtrTssiCfg - pointer to power meter config structure + * \param [in] meter - TSSI Tx (1 or 2) or TSSI ORx + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrTssiConfigGet(adi_adrv904x_Device_t* const device, + const uint32_t channelSel, + adi_adrv904x_DfeSvcDfePwrMtrTssiCfg_t* pPwrMtrTssiCfg, + const adi_adrv904x_DfeSvcDfePwrMtrTssi_e meter); + +/** + * \brief Set Post CFR gain for selected tx channels. + * Linear gain value configured in the HW is 2.6 fixed point value with 0.015625 resolution. User is advised + * to readback the gain with adi_adrv904x_PostCfrGainGet to see the actual value configured on HW due to loss + * of precision + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] txChannelMask - Tx channel mask, one or multiple Tx channels are allowed + * \param [in] gain_milli - Linear CFR gain, Range [0-4000] which corresponds to 0-4.0 linear gain + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_PostCfrGainSet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const uint32_t gain_milli); + +/** + * \brief Get Post CFR gain for selected tx channels. + * Linear gain value configured in the HW is 2.6 fixed point value with 0.015625 resolution. Readback + * value might be slightly different from gain value set with adi_adrv904x_PostCfrGainSet + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] txChannelSel - Tx channel selection. Only one Tx channel should be selected + * \param [out] gain_milli - Pointer to CFR gain to be populated + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_PostCfrGainGet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelSel, + uint32_t * const gain_milli); + +/** + * \brief Enable Tx TSSI or ORx TSSI power measurement + * This function enables the DFE TSSI power measurement + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] channelMask - Tx or ORx channel number mask; multiple channels allowed + * \param [in] enable - enable/disable power meter + * \param [in] meter - TSSI Tx (1 or 2) or TSSI ORx + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrTssiEnable(adi_adrv904x_Device_t* const device, + const uint32_t channelMask, + const uint8_t enable, + const adi_adrv904x_DfeSvcDfePwrMtrTssi_e meter); + +/** + * \brief Enable Tx TSSI 1 and/or TSSI 2 and ORx TSSI power measurement (for CLGC) + * This function enables the DFE TSSI power measurement for ORx and either or both TSSI 1 and TSSI 2 + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] txChannelMask - Tx channel mask; multiple channels allowed + * \param [in] enable - enable/disable power meter + * \param [in] useTxMeter1 - Use Tx TSSI 1 + * \param [in] useTxMeter2 - Use Tx TSSI 2 + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrClgcTssiEnable(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const uint8_t enable, + const uint8_t useTxMeter1, + const uint8_t useTxMeter2); + +/** + * \brief Manually start the power measurement + * This function starts the DFE TSSI power measurement manually + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] channelMask - Tx or ORx channel number mask; multiple channels allowed + * \param [in] start - 1: unpause or start measuring, 0:pause or stop measuring + * \param [in] meter - TSSI Tx (1 or 2) or TSSI ORx + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrTssiManualStart(adi_adrv904x_Device_t* const device, + const uint32_t channelMask, + const uint8_t start, + const adi_adrv904x_DfeSvcDfePwrMtrTssi_e meter); +/** + * \brief Readback dB and linear power measurement + * This function reads back the DFE power measurement and if the set threshold was exceeded + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] channelSel - Tx or ORx channel number mask (only one channel allowed for readback) + * \param [in] meter - TSSI Tx (1 or 2) or TSSI ORx + * \param [out] pPwrMeas - Pointer to power meter read back values, dB and linear + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrTssiReadBack(adi_adrv904x_Device_t* const device, + const uint32_t channelSel, + const adi_adrv904x_DfeSvcDfePwrMtrTssi_e meter, + adi_adrv904x_DfeSvcDfePwrMtrTssiMeasResult_t* pPwrMeas); + +/** + * \brief Readback power measurements for CLGC/TPC + * This function reads back the DFE power measurements for CLGC/TPC + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] txChannelSel - Tx channel number mask (only one channel allowed for readback) + * \param [in] useTxMeter1 - True if use TSSI Tx 1 + * \param [in] useTxMeter2 - True if use TSSI Tx 2 + * \param [out] pPwrMeasTx1 - Pointer to power meter read back for Tx TSSI 1 + * \param [out] pPwrMeasTx2 - Pointer to power meter read back for Tx TSSI 2 + * \param [out] pPwrMeasOrx - Pointer to power meter read back for Orx TSSI + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrClgcTssiReadBack(adi_adrv904x_Device_t* const device, + const uint32_t txChannelSel, + const uint8_t useTxMeter1, + const uint8_t useTxMeter2, + uint64_t *pPwrMeasTx1, + uint64_t *pPwrMeasTx2, + uint64_t *pPwrMeasOrx); + +/** + * \brief DPD input power meter configuration set + * + * The DPD input power meter can be used by itself to measure the pre-DPD Tx + * power for switching DPD model or can be used along with DPD output power + * meter to detect sudden DPD gain variation. Use the Enable/pause command to start the measurement. + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] txChannelMask - Tx channel number mask; multiple channels allowed + * \param [in] pPwrMtrDpdIn - The pointer to input power meter configuration structure + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrDpdInConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const adi_adrv904x_DfeSvcDfePwrMtrDpdCfg_t* pPwrMtrDpdIn); + +/** + * \brief DPD input power meter configuration get + * + * Get the DPD Input power measure configuration + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] txChannelSel - Tx channel number mask; single channel only + * \param [out] pPwrMtrDpdIn - The pointer to input power meter configuration structure + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrDpdInConfigGet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelSel, + adi_adrv904x_DfeSvcDfePwrMtrDpdCfg_t* pPwrMtrDpdIn); + +/** + * \brief DPD output power meter configuration set + * + * The DPD output power meter is usually used along with DPD input power meter + * to detect sudden DPD gain variation. Use the Enable/pause command to start the measurement. + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] txChannelMask - Tx channel mask; multiple channels allowed + * \param [in] pPwrMtrDpdOut - The pointer to output power meter configuration structure + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrDpdOutConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const adi_adrv904x_DfeSvcDfePwrMtrDpdCfg_t* pPwrMtrDpdOut); + +/** + * \brief DPD output power meter configuration get + * + * Get the DPD output power measure configuration + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] txChannelSel - Tx channel number mask; single channel only + * \param [out] pPwrMtrDpdOut - The pointer to output power meter configuration structure + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrDpdOutConfigGet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelSel, + adi_adrv904x_DfeSvcDfePwrMtrDpdCfg_t* pPwrMtrDpdOut); + +/** + * \brief DPD input power meter enable/disable + * + * Use this command AFTER setting the config. + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] txChannelMask - Tx channel number mask; multiple channels allowed + * \param [in] enable - 1 to enable; 0 to disable + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrDpdInEnable(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const uint8_t enable); +/** + * \brief DPD output power meter enable/disable + * + * Use this command AFTER setting the config. + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] txChannelMask - Tx channel number mask; multiple channels allowed + * \param [in] enable - 1 to enable; 0 to disable + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrDpdOutEnable(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const uint8_t enable); +/** + * \brief DPD In/Out power measurement readback + * + * enable dpd out power meter + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] txChannelSel - Tx channel mask (only one channel allowed for readback) + * \param [out] pPwrDpdInOut - Pointer to DPD power measurement readback structure + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrDpdInOutReadBack(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannelSel, + adi_adrv904x_DfeSvcDfePwrMtrDpdResults_t* pPwrDpdInOut); +/** + * \brief Tx carrier power measurement config set + * + * Set the configuration but do not enable. Use adi_adrv904x_DfePwrMtrTxCarrierMeasEnable for that. + * + * How to use example: + * Configure CH3 and CH4, carriers 1 and 2 only. + * channelMask = 0x18 (11000 b) + * carrierMask = 0x6 (0110b) + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] txCarrierMask - Mask of channels and carriers to set - 8 bit masks (multiple channels and carriers allowed) + * \param [in] pPwrTxCarrierCfg - Pointer to carrier power measurement config set structure + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrTxCarrierCfgSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxCarrierMask_t* const txCarrierMask, + const adi_adrv904x_DfeSvcDfeTxCarrierPowerMeasCfg_t* pPwrTxCarrierCfg); +/** + * \brief Tx carrier power measurement config get + * + * How to use example: + * Get the config for CH4, carrier 0. + * channelMask = 0x10 (10000 b) + * carrierMask = 0x1 + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] txCarrierSel - Mask of channels and carriers to set - 8 bit masks (only one channel and carrier allowed) + * \param [out] pPwrTxCarrrierCfgResp - Pointer to carrier power measurement config response structure + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrTxCarrierCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxCarrierMask_t* const txCarrierSel, + adi_adrv904x_DfeSvcDfeTxCarrierPowerMeasCfg_t* pPwrTxCarrrierCfgResp); + +/** + * \brief Tx carrier power measurement enable/disable + * + * How to use example: + * Enable/disable measurements on On CH1 and CH2, enable carrier 1 and disable carrier 0: + * txCarrierMask.channelMask = 0x3 + * txCarrierMask.carrierMask = 0x3 + * enable = 1 (enable the given channels and carriers from txCarrierMask) + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] txCarrierMask - Mask of channels and carriers to set - 8 bit masks (multiple channels and carriers allowed) + * \param [in] enable - Enable flag + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrTxCarrierMeasEnable(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxCarrierMask_t* const txCarrierMask, + const uint8_t enable); + +/** + * \brief Tx carrier power measurement pause/resume (start) + * + * How to use example: + * Start or Unpause CH2,CH8: carrier 1: + * txCarrierMask.channelMask = 0x82 + * txCarrierMask.carrierMask = 0x2 + * start = 1 (start or unpause the given channels and carriers from txCarrierMask) + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] txCarrierMask - Mask of channels and carriers to set - 8 bit masks (multiple channels and carriers allowed) + * \param [in] start - start flag + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrTxCarrierManualStart(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxCarrierMask_t* const txCarrierMask, + const uint8_t start); + +/** + * \brief Tx carrier power measurement get results + * + * How to use example: + * Get measurement results for CH3, carrier 0: + * channelMask = 0x8 (1000b) + * carrierMask = 0x1 + * + * \param [in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param [in] txCarrierSel - Mask of channels and carriers to set - 8 bit masks (only one channel and carrier allowed) + * \param [out] pPwrTxCarrrierMeasResult - Pointer to structure that holds the results + * + * \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrTxCarrierMeasGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxCarrierMask_t* const txCarrierSel, + adi_adrv904x_DfeSvcDfeTxCarrierPowerMeasResult_t* pPwrTxCarrrierMeasResult); + +/** +* \brief Configures Hard clipper configuration for selected channel/s +* +* Use hardClipperConfig -> hardClipperSel Select PostAtten or PreDpd set the configuration for hc hardClipperEnable/hardClipperThreshold. +* +* \pre This function is called after the device has been initialized. User can configure PostAtten/PreDpd hard clipper +* for multiple channels at the same time. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] hardClipperConfig - Pointer to hard clipper configuration struct to be applied +* \param[in] hcTxChannelMask - One or multiple Tx channel selection to apply hard clipper config +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_HardClipperConfigSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_HardClipperConfig_t * const hardClipperConfig, + const uint32_t hcTxChannelMask); + +/** +* \brief Reads hard clipper configuration of selected channel +* +* \pre This function is called after the device has been initialized. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in,out] hardClipperConfig - Pointer to readback hard clipper configuration struct +* \param[in] hcTxChannelSel - Tx channel selection to read hard clipper config +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_HardClipperConfigGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_HardClipperConfig_t * const hardClipperConfig, + const uint32_t hcTxChannelSel); + +/** +* \brief Read Hard Clipper statistics of selected channel +* +* \pre This function is called after the device has been initialized. User should always read the PostAtten and PreDpd Hard Clipper +* statistics. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable -Pointer to the ADRV904X device settings data structure +* \param[in] txChannelSel - Tx channel selection to read statistics +* \param[out] hardClipperStat - Number of peaks clipped at hard clipper +* \param[in] clearStats - 1:Clear statistics upon reading // 0: Don't clear +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_HardClipperStatisticsGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannelSel, + adi_adrv904x_HardClipperStatistics_t * const hardClipperStat, + uint8_t clearStats); + +/** +* \brief Adjust Tx Carrier Gain in mdB. Valid range is -90dB to +36dB. +* +* Note: Gain adjustment is converted to a linear gain value in 7.16 format +* internally, which will affect actual value applied. It is suggested to +* readback the actual value applied in this function by calling +* adi_adrv904x_TxCarrierGainAdjustGet() afterward. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] txCarrierMask Tx Carrier selection from which to set the gain adjustment +* \param[in] gain_mdB Gain adjustment to make to selected Tx Carriers. Signed 32bit value, resolution 1 mdB +* +* \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxCarrierGainAdjustSet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxCarrierMask_t * const txCarrierMask, + const int32_t gain_mdB); + +/** + * \brief Readback current Tx Carrier Gain Adjustment in mdB. Expected range is -90dB to +36dB. + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[in] txCarrierSel Tx Carrier selection from which to get the gain adjustment + * \param[out] gain_mdB Pointer to location to store current gain adjustment for selected Tx Carrier. Signed 32bit value, resolution 1 mdB. + * + * \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxCarrierGainAdjustGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxCarrierMask_t * const txCarrierSel, + int32_t * const gain_mdB); + +/** +* \brief Set the Tx carrier band attenuation +* +* \note This function should not be called when an alarm is active because the attenuation may not be updated correctly. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] txBandMask - pointer to the Tx channel and band mask +* \param[in] atten_mdB - Band Attenuation for selected Tx Carrier. Unsigned 32bit value, resolution 1 mdB. +* +* \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxCarrierBandAttenSet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxBandMask_t * const txBandMask, + const uint32_t atten_mdB); + +/** + * \brief Get the Tx carrier band attenuation + * + * \dep_begin + * \dep{device->common.devHalInfo} + * \dep_end + * + * \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings + * \param[in] txBandSel - pointer to the given Tx channel and band mask (only one Tx, one band allowed) + * \param[out] atten_mdB Pointer to location to store current attenuation for selected Tx Carrier. Unsigned 32bit value, resolution 1 mdB. + * + * \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxCarrierBandAttenGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxBandMask_t * const txBandSel, + uint32_t * const atten_mdB); + +/** +* \brief Set the Tx Post DPD Digital Attenuation +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] txDpdMask - pointer to the Tx channel and id mask +* \param[in] attenParams - Data structure to hold the Post DPD atten parameters. +* +* \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_PostDpdAttenSet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxDpdMask_t * const txDpdMask, + const adi_adrv904x_PostDpdAtten_t * const attenParams); +/** +* \brief Get the Tx Post DPD Digital Attenuation +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] txDpdSel - pointer to the Tx channel and id mask (only one Tx, one id allowed) +* \param[out] attenParams - Data structure to hold the Post DPD atten parameters. +* +* \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_PostDpdAttenGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxDpdMask_t * const txDpdSel, + adi_adrv904x_PostDpdAtten_t * const attenParams); + +/** +* \brief Write to Tx playback RAM. +* +* This function is called after the device has been initialized. It's used to write a dataset to TX +* playback RAM. It's users responsibility to make sure data capture isn't enabled while this API writes +* a new data set to playback RAM. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device settings data structure +* \param[in] txChannelMask - One or multiple Tx channel selection to apply playback data +* \param[in] bandSelect - Select the TX DUC band +* \param[in] playbackData - Pointer to playback data structure to be written to TX playback RAM +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxPlaybackDataWrite(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const uint8_t bandSelect, + const adi_adrv904x_TxPlaybackData_t* const playbackData); + +/** +* \brief Read from Tx playback RAM. +* +* This function is called after the device has been initialized. It's used to read the dataset stored +* at TX playback RAM. It's users responsibility to make sure data capture isn't enabled while this API reads +* from playback RAM. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device settings data structure +* \param[in] txChannelSel - Tx channel selection to read playback data, only one tx channel needs to be selected +* \param[in] bandSelect - Select the TX DUC band +* \param[out] playbackData - Pointer to playback data structure to be read from TX playback RAM +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxPlaybackDataRead(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannelSel, + const uint8_t bandSelect, + adi_adrv904x_TxPlaybackData_t* const playbackData); + +/** +* \brief Start data playback from Tx playback RAM. +* +* This function is called after the device has been initialized. It's used to start a data playback from Tx playback RAM. +* It's users responsibility to make sure data capture isn't enabled while this API reads from playback RAM. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device settings data structure +* \param[in] txChannelSel - Tx channel selection to read playback data, only one tx channel needs to be selected +* \param[in] bandSelect - Select the TX DUC band +* \param[in] dataRate_kHz - Select the data rate for the playback. The playback happens at 1/2 the programmed rate +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxPlaybackStart(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannelSel, + const uint8_t bandSelect, + const uint32_t dataRate_kHz); + +/** +* \brief Stop data playback from Tx playback RAM. +* +* This function is called after the device has been initialized. It's used to stop a data playback from Tx playback RAM. +* It's users responsibility to make sure data capture isn't enabled while this API reads from playback RAM. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep{init-> (most members)} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device settings data structure +* \param[in] txChannelSel - Tx channel selection to read playback data, only one tx channel needs to be selected +* \param[in] bandSelect - Select the TX DUC band +* +* \retval ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxPlaybackStop(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannelSel, + const uint8_t bandSelect); + +/** +* \brief Reconfigure Tx carriers dynamically without reinitialization - Solving without applying solution to HW +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] jesdCfg - Pointer that holds the updated JESD settings to accomdate the new carrier settings +* \param[in] txCarrierConfigs - Tx Carrier Reconfigure Settings. Struct may be modified by API for endianness before being passed to firmware. +* \param[in] txCarrierChannelFilterApplicationSel - Tx Carrier Channel Filter application select for each carrier in each profile. The carriers here are applied to the corresponding channelMask in txCarrierConfigs. +* \param[in] txCarrierChannelFilter - Tx Carrier Channel Filter Settings. Struct may be modified by API for endianness before being passed to firmware. +* \param[in] numCarrierProfiles number of profiles passed in the arrays. Max is four. +* \param[in] useCustomFilters Select option to use custom filters or ADI presets: 0: Use txCarrierChannelFilterApplicationSel, 1: Use txCarrierChannelFilter +* +* \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxDynamicCarrierCalculate( adi_adrv904x_Device_t* const device, + adi_adrv904x_CarrierJesdCfg_t* const jesdCfg, + adi_adrv904x_CarrierRadioCfg_t txCarrierConfigs[], + const adi_adrv904x_CarrierChannelFilterApplicationSel_t txCarrierChannelFilterApplicationSel[], + adi_adrv904x_ChannelFilterCfg_t txCarrierChannelFilter[], + const uint32_t numCarrierProfiles, + const uint8_t useCustomFilters); + +/** +* \brief Reconfigure Tx carriers dynamically without reinitialization - Apply previously solved configuration +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* +* \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxDynamicCarrierWrite(adi_adrv904x_Device_t* const device); + +/** +* \brief Reconfigure Tx carriers dynamically without reinitialization. Wrapper for adi_adrv904x_TxDynamicCarrierReconfigure to select channel filter coefficients +* provided by ADI +* +* Note: The API currently only uses the first profile in txCarrierConfigs.carrierCfgs input struct. +* +* \pre Part must be put in the appropriate state for this function to work as intendend. At a minimum the following steps must have been performed: +* Disable tracking cals +* Disable PAs +* Disable Tx/Rx/ORx channels. GPIOs are not toggling +* +* +* \post After this function is called at a minimum the following steps must be performed before the device can be used as intended: +* Provide new CFR pulse/config thru API +* Change RFLO +* Re- Enable channels then tracking cals +* Re-Enable PAs +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] jesdCfg - Pointer that holds the updated JESD settings to accomdate the new carrier settings +* \param[in] txCarrierConfigs - Tx Carrier Reconfigure Settings. Struct may be modified by API for endianness before being passed to firmware. +* \param[in] txCarrierChannelFilterApplicationSel - Tx Carrier Channel Filter application select for each carrier in each profile +* \param[in] numCarrierProfiles number of profiles passed in the arrays. Max is four. +* +* \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxDynamicCarrierReconfigureWithFilterSelect( adi_adrv904x_Device_t* const device, + adi_adrv904x_CarrierJesdCfg_t* const jesdCfg, + adi_adrv904x_CarrierRadioCfg_t txCarrierConfigs[], + const adi_adrv904x_CarrierChannelFilterApplicationSel_t txCarrierChannelFilterApplicationSel[], + const uint32_t numCarrierProfiles ); + +/** +* \brief Reconfigure Tx carriers dynamically without reinitialization. +* +* Note: The API currently only uses the first profile in txCarrierConfigs.carrierCfgs input struct. +* +* \pre Part must be put in the appropriate state for this function to work as intendend. At a minimum the following steps must have been performed: +* Disable tracking cals +* Disable PAs +* Disable Tx/Rx/ORx channels. GPIOs are not toggling +* +* +* \post After this function is called at a minimum the following steps must be performed before the device can be used as intended: +* Provide new CFR pulse/config thru API +* Change RFLO +* Re- Enable channels then tracking cals +* Re-Enable PAs +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] jesdCfg - Pointer that holds the updated JESD settings to accomdate the new carrier settings +* \param[in] txCarrierConfigs - Tx Carrier Reconfigure Settings. Struct may be modified by API for endianness before being passed to firmware. +* \param[in] txCarrierChannelFilter - Tx Carrier Channel Filter Settings. Struct may be modified by API for endianness before being passed to firmware. +* \param[in] numCarrierProfiles number of profiles passed in the arrays. Max is four. +* +* \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxDynamicCarrierReconfigure( adi_adrv904x_Device_t* const device, + adi_adrv904x_CarrierJesdCfg_t* const jesdCfg, + adi_adrv904x_CarrierRadioCfg_t txCarrierConfigs[], + adi_adrv904x_ChannelFilterCfg_t txCarrierChannelFilter[], + const uint32_t numCarrierProfiles); + +/** +* \brief Retrieve the current tx Carrier settings for the selected channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] txChannel - Tx Channel to be retrieved +* \param[out] txCarrierConfigs - Tx Carrier Reconfigure Settings +* \param[out] carrierRuntimeSettings - Tx Carrier Runtime Settings +* +* \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxCarrierSettingsGet( adi_adrv904x_Device_t* const device, + const uint32_t txChannel, + adi_adrv904x_CarrierRadioCfg_t* const txCarrierConfigs, + adi_adrv904x_CarrierRuntime_t* const carrierRuntimeSettings); + + +/** +* \brief Retrieve the current tx jesd settings +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[out] txCarrierJesdCfg - Tx Carrier Reconfigure Settings +* +* \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxCarrierJesdCfgGet( adi_adrv904x_Device_t* const device, + adi_adrv904x_CarrierJesdCfg_t* const txCarrierJesdCfg); + +/** +* \brief Retrieve the current tx Carrier delay settings for the selected channel +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] txChannel adi_adrv904x_TxChannels_e enum type to read latency values +* \param[out] txCarrierLatencyCfg - Tx Carrier delay settings +* +* \retval adi_common_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxCarrierLatencyGet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_CarrierReconfigLatencyCfg_t* const txCarrierLatencyCfg); +#endif /* _ADI_ADRV904X_TX_H_ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_tx_nco.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_tx_nco.h new file mode 100644 index 00000000000..c25bf234ead --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_tx_nco.h @@ -0,0 +1,171 @@ +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +/** + * \file adi_adrv904x_tx_nco.h + * + * \brief Contains ADRV904X Tx NCO data structures. + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef __ADI_ADRV904X_TX_NCO_H__ +#define __ADI_ADRV904X_TX_NCO_H__ + +#include "adi_adrv904x_platform_pack.h" +#include "adi_adrv904x_cpu_error_codes_types.h" + +#define ADI_ADRV904X_TX_ATTEN_PHASE_SIZE (65u) + +/** + * \brief NCO set Tx MIX command structure + */ +ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_TxNcoMixConfig +{ + uint8_t chanSelect; /*!< Select the Tx channels (bit mapped) to enable/disable */ + + uint8_t bandSelect; /*!< Select the TX DUC band */ + uint8_t enable; /*!< 0: Disable, 1: Enable */ + uint32_t phase; /*!< Phase in degrees (0 - 359) */ + int32_t frequencyKhz; /*!< Desired frequency in KHz */ +} adi_adrv904x_TxNcoMixConfig_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief Enumeration for DDC channel number + */ +typedef enum adi_adrv904x_DucNumber +{ + ADI_ADRV904X_DUC_BAND_0 = 0u, /*!< DUC channel 0 */ + ADI_ADRV904X_DUC_BAND_1, /*!< DUC channel 1 */ + ADI_ADRV904X_DUC_NUM_BAND +} adi_adrv904x_DucNumber_e; + +/** + * \brief NCO TX MIX set command response structure + */ +ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_TxNcoMixConfigReadbackResp +{ + adi_adrv904x_CpuErrorCode_t status; /*!< CPU error status code */ + uint8_t chanSelect; /*!< Tx channels (bit mapped) */ + + uint8_t bandSelect; /*!< Select the TX DUC band */ + uint8_t enable; /*!< 0: Disabled, 1: Enabled */ + uint32_t phase; /*!< Phase in degrees (0 - 359) */ + int32_t frequencyKhz; /*!< frequency in KHz */ +} adi_adrv904x_TxNcoMixConfigReadbackResp_t; +ADI_ADRV904X_PACK_FINISH + +typedef uint8_t adi_adrv904x_TxTestNcoSelect_t; +typedef uint8_t adi_adrv904x_TxTestNcoAtten_t; + +/** + * \brief NCO TX Test Tone NCO Select + */ +typedef enum adi_adrv904x_TxTestNcoSelect +{ + ADI_ADRV904X_TX_TEST_NCO_0 = 0x0u, /*!< First NCO */ + ADI_ADRV904X_TX_TEST_NCO_1 = 0x1u, /*!< Second NCO */ + ADI_ADRV904X_TX_TEST_NCO_MAX_NUM = 0x2u +} adi_adrv904x_TxTestNcoSelect_e; + +/** + * \brief NCO TX Test Tone NCO Attenuation + */ +typedef enum adi_adrv904x_TxTestNcoAtten +{ + ADI_ADRV904X_TX_TEST_NCO_ATTEN_0DB = 0x0u, /*!< 0 dB */ + ADI_ADRV904X_TX_TEST_NCO_ATTEN_6DB = 0x1u, /*!< 6 dB */ + ADI_ADRV904X_TX_TEST_NCO_ATTEN_12DB = 0x2u, /*!< 12 dB */ + ADI_ADRV904X_TX_TEST_NCO_ATTEN_18DB = 0x3u, /*!< 18 dB */ + ADI_ADRV904X_TX_TEST_NCO_ATTEN_24DB = 0x4u, /*!< 24 dB */ + ADI_ADRV904X_TX_TEST_NCO_ATTEN_30DB = 0x5u, /*!< 30 dB */ + ADI_ADRV904X_TX_TEST_NCO_ATTEN_36DB = 0x6u, /*!< 36 dB */ + ADI_ADRV904X_TX_TEST_NCO_ATTEN_42DB = 0x7u, /*!< 42 dB */ + ADI_ADRV904X_TX_TEST_NCO_ATTEN_48DB = 0x8u, /*!< 48 dB */ + ADI_ADRV904X_TX_TEST_NCO_ATTEN_MAX_NUM = 0x9 +} adi_adrv904x_TxTestNcoAtten_e; + +/** + * \brief NCO Tx Test set command structure + */ +ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_TxTestNcoConfig +{ + uint8_t chanSelect; /*!< Select Tx channel (bit mapped) */ + + uint8_t bandSelect; /*!< Select the TX DUC band */ + uint8_t enable; /*!< 0: Disable, 1: Enable */ + adi_adrv904x_TxTestNcoSelect_t ncoSelect; /*!< 0 or 1 */ + uint32_t phase; /*!< Phase in degrees (0 - 359) */ + int32_t frequencyKhz; /*!< Desired frequency in KHz */ + adi_adrv904x_TxTestNcoAtten_t attenCtrl; /*!< Attenuation control */ + /* TODO: Add summing control? */ +} adi_adrv904x_TxTestNcoConfig_t; +ADI_ADRV904X_PACK_FINISH + +/** + * \brief NCO Tx Test set command response structure + */ +ADI_ADRV904X_PACK_START +typedef struct adi_adrv904x_TxTestNcoConfigReadbackResp +{ + adi_adrv904x_CpuErrorCode_t status; /*!< CPU error status code */ + + uint8_t bandSelect; /*!< Select the TX DUC band */ + uint8_t chanSelect; /*!< Select Tx channel (bit mapped) */ + adi_adrv904x_TxTestNcoSelect_t ncoSelect; /*!< 0 or 1 */ + uint8_t enabled; /*!< 0: Disabled, 1: Enabled */ + uint32_t phase; /*!< Phase in degrees (0 - 359) */ + int32_t frequencyKhz; /*!< Desired frequency in KHz */ + adi_adrv904x_TxTestNcoAtten_t attenCtrl; /*!< Attenuation control */ +} adi_adrv904x_TxTestNcoConfigReadbackResp_t; +ADI_ADRV904X_PACK_FINISH + + +/** +* \brief Data structure for Tx Atten Phase configuration +*/ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_TxAttenPhaseCfg +{ + uint8_t chanSelect; /*!< Tx channel (bit mapped) */ + int16_t txAttenPhase[ADI_ADRV904X_TX_ATTEN_PHASE_SIZE]; /*!< Tx atten phase values */ +} adi_adrv904x_TxAttenPhaseCfg_t;) + +/** + * \brief NCO set Tx CDUC command structure + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_TxCducNcoConfig +{ + uint8_t chanSelect; /*!< Select the Tx channels (bit mapped) to enable/disable */ + uint8_t carrierSelect; /*!< Select the carriers (bit mapped) */ + uint8_t enable; /*!< 0: Disable, 1: Enable */ + uint32_t phase; /*!< Phase in degrees (0 - 359) */ + int32_t frequencyKhz; /*!< Desired frequency in KHz */ +} adi_adrv904x_TxCducNcoConfig_t;) + +/** + * \brief NCO TX MIX set command response structure + */ +ADI_ADRV904X_PACKED( +typedef struct adi_adrv904x_TxCducNcoConfigReadbackResp +{ + adi_adrv904x_CpuErrorCode_t status; /*!< CPU error status code */ + uint8_t chanSelect; /*!< Tx channels (bit mapped) */ + uint8_t carrierSelect; /*!< carriers (bit mapped) */ + uint8_t enable; /*!< 0: Disabled, 1: Enabled */ + uint32_t phase; /*!< Phase in degrees (0 - 359) */ + int32_t frequencyKhz; /*!< frequency in KHz */ +} adi_adrv904x_TxCducNcoConfigReadbackResp_t;) + +#endif /* __ADI_ADRV904X_TX_NCO_H__ */ + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_tx_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_tx_types.h new file mode 100644 index 00000000000..c46741bf5d6 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_tx_types.h @@ -0,0 +1,463 @@ +/** +* Copyright 2015 - 2022 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_tx_types.h +* \brief Contains ADRV904X API Tx datapath data types +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#ifndef _ADI_ADRV904X_TX_TYPES_H_ +#define _ADI_ADRV904X_TX_TYPES_H_ + +#include "adi_library_types.h" +#include "adi_adrv904x_tx_nco.h" +#include "adi_adrv904x_gpio_types.h" + +#define ADRV904X_TX_ATTEN_TABLE_MAX_IDX 959 /*!< Maximum valid tx attenuation table index */ +#define ADRV904X_TX_ATTEN_VALUE_MILLI_DB_MAX 41950 /*!< Maximum Value of TX Attenuation in 1/1000s of a dB */ +#define ADRV904X_TX_ATTEN_STEP_SIZE_DIV_0P05 50 /*!< The only supported attenuation step size is 0.05dB */ +#define ADRV904X_TX_ATTEN_STEP_SIZE_DIV_0P1 100 /*!< Not supported */ +#define ADRV904X_TX_ATTEN_STEP_SIZE_DIV_0P2 200 /*!< Not supported */ +#define ADRV904X_TX_ATTEN_STEP_SIZE_DIV_0P4 400 /*!< Not supported */ + +#define ADRV904X_ADDR_TX0_ATTEN_TABLE 0x60812000 +#define ADRV904X_ADDR_TX1_ATTEN_TABLE 0x60912000 +#define ADRV904X_ADDR_TX2_ATTEN_TABLE 0x60A12000 +#define ADRV904X_ADDR_TX3_ATTEN_TABLE 0x60B12000 +#define ADRV904X_ADDR_TX4_ATTEN_TABLE 0x60C12000 +#define ADRV904X_ADDR_TX5_ATTEN_TABLE 0x60D12000 +#define ADRV904X_ADDR_TX6_ATTEN_TABLE 0x60E12000 +#define ADRV904X_ADDR_TX7_ATTEN_TABLE 0x60F12000 + +#define ADRV904X_TX_ATTEN_TABLE_HP_MASK 0x0007F000 +#define ADRV904X_TX_ATTEN_TABLE_HP_SHIFT 12 +#define ADRV904X_TX_ATTEN_TABLE_MULT_MASK 0x00000FFF +#define ADRV904X_TX_ATTEN_TABLE_MULT_SHIFT 0 + +#define ADRV904X_TX_ATTEN_HP_MIN_VALUE 1 +#define ADRV904X_TX_ATTEN_HP_MAX_VALUE 64 +#define ADRV904X_TX_ATTEN_HP_SET_ALL_VALUE 0xFF + +#define ADI_ADRV904X_MAX_TXCHANNELS 8U +#define ADI_ADRV904X_TX_CHAN_ID_MAX (ADI_ADRV904X_MAX_TXCHANNELS - 1U) +#define ADI_ADRV904X_TX_CHAN_MASK_MAX ((1U << (ADI_ADRV904X_TX_CHAN_ID_MAX + 1U)) - 1U) +#define ADI_ADRV904X_TX_PLAYBACK_DATA_MAX_NUM_SAMPLES (8192U) /*!< Maxinum number of TX playback samples */ + +/** + * \brief Enum of possible Tx channel enables + */ +typedef enum adi_adrv904x_TxChannels +{ + ADI_ADRV904X_TXOFF = 0x00U, /*!< No Tx channels are enabled */ + ADI_ADRV904X_TX0 = 0x01U, /*!< Tx0 channel enabled */ + ADI_ADRV904X_TX1 = 0x02U, /*!< Tx1 channel enabled */ + ADI_ADRV904X_TX2 = 0x04U, /*!< Tx2 channel enabled */ + ADI_ADRV904X_TX3 = 0x08U, /*!< Tx3 channel enabled */ + ADI_ADRV904X_TX4 = 0x10U, /*!< Tx4 channel enabled */ + ADI_ADRV904X_TX5 = 0x20U, /*!< Tx5 channel enabled */ + ADI_ADRV904X_TX6 = 0x40U, /*!< Tx6 channel enabled */ + ADI_ADRV904X_TX7 = 0x80U, /*!< Tx7 channel enabled */ + ADI_ADRV904X_TXALL = 0xFFU /*!< All tx channel mask */ +} adi_adrv904x_TxChannels_e; + +/** + * \brief Holds a single row of adrv904x tx attenuation table. + */ +typedef struct adi_adrv904x_TxAttenTableRow +{ + uint16_t txAttenMult; /*!< Tx Attenuation Multiplier (0-4095) */ + uint8_t txAttenHp; /*!< Tx Attenuation HP (0-63) */ + uint8_t reserved; /*!< Reserved */ +} adi_adrv904x_TxAttenTableRow_t; + +/** +* \brief Enum select for pa protection input +*/ +typedef enum adi_adrv904x_PaProtectionInputSel +{ + ADI_ADRV904X_POST_DPD_HC_OUTPUT = 0x0000, /*!< Input data to Pa protection block is probed from Post DPD HC output */ + ADI_ADRV904X_TXQEC_ACTUATOR_OUTPUT = 0x0001 /*!< Input data to Pa protection block is probed from tx qec actuator output */ + +} adi_adrv904x_PaProtectionInputSel_e; + +/** +* \brief Enum select events for triggering ramp down +*/ +typedef enum adi_adrv904x_RampDownTrigger +{ + ADI_ADRV904X_RDT_PEAK_PA = 0x1, /*!< Use the Peak PA block to trigger ramp down event */ + ADI_ADRV904X_RDT_AVG_PA = 0x2, /*!< Use the Average PA block to trigger ramp down event */ + ADI_ADRV904X_RDT_SRD = 0x4, /*!< Use the Slew Rate Detector block to trigger ramp down event */ + ADI_ADRV904X_RDT_CLK_PLL_UNLOCK = 0x8, /*!< Use the CLK PLL unlock to trigger ramp down event */ + ADI_ADRV904X_RDT_RF_PLL1_UNLOCK = 0x10, /*!< Use the RF PLL1 unlock to trigger ramp down event - This enum is deprecated. Please use ADI_ADRV904X_RDT_RF0_PLL_UNLOCK instead */ + ADI_ADRV904X_RDT_RF_PLL2_UNLOCK = 0x20, /*!< Use the RF PLL2 unlock to trigger ramp down event - This enum is deprecated. Please use ADI_ADRV904X_RDT_RF1_PLL_UNLOCK instead */ + ADI_ADRV904X_RDT_RF0_PLL_UNLOCK = 0x10, /*!< Use the RF0 PLL unlock to trigger ramp down event */ + ADI_ADRV904X_RDT_RF1_PLL_UNLOCK = 0x20, /*!< Use the RF1 PLL unlock to trigger ramp down event */ + ADI_ADRV904X_RDT_SERDES_PLL_UNLOCK = 0x40, /*!< Use the SERDES PLL unlock to trigger ramp down event */ + ADI_ADRV904X_RDT_DFMR0_EVENT = 0x80, /*!< Use Deframer0 IRQ to trigger ramp down event - This enum is deprecated */ + ADI_ADRV904X_RDT_DFRM0_EVENT = 0x80, /*!< Use Deframer0 IRQ to trigger ramp down event */ + ADI_ADRV904X_RDT_DFRM1_EVENT = 0x100 /*!< Use Deframer1 IRQ to trigger ramp down event */ +} adi_adrv904x_RampDownTrigger_e; + +/** +* \brief Data structure to hold ADRV904X Tx Peak & Average Power Protection block configuration +*/ +typedef struct adi_adrv904x_PowerMonitorCfg +{ + adi_adrv904x_PaProtectionInputSel_e inputSel; /*!< This selects the source of input signal for power monitor block */ + uint16_t peakThreshold; /*!< Power monitor peak power threshold. Peak Threshold[dBFS] = 10 * Log10(peakThreshold/65535) */ + uint8_t measDuration; /*!< Power monitor peak and avg power measurement duration: Duration = 2^(measDuration + 7) number of cycles. Valid range [0-15] */ + uint8_t peakCount; /*!< Peak count causing peak power error. */ + uint8_t peakErrorClearRequired; /*!< Set this to make the peak power error sticky. When set, user needs to call adi_adrv904x_TxProtectionErrorClear to clear peak power error */ + uint8_t peakPowerEnable; /*!< This enables peak power measurement block. 1 = Peak power error is flagged when peak count is above peak count threshold, 0 = disabled */ + uint8_t peakPowerIrqEnable; /*!< 1 = enables peak power error interrupt, 0 = no IRQ */ + uint16_t avgThreshold; /*!< Power monitor average power threshold. Average Threshold[dBFS] = 10 * Log10(avgThreshold/65535) */ + uint8_t avgErrorClearRequired; /*!< Set this to make the average power error sticky. When set, user needs to call adi_adrv904x_TxProtectionErrorClear to clear average power error */ + uint8_t avgPowerEnable; /*!< This enables average power measurement block. 1 = PA error is flagged when average power measurement is above average power threshold, 0 = disabled */ + uint8_t avgPowerIrqEnable; /*!< 1 = enables average power error interrupt, 0 = no IRQ */ + uint8_t avgPeakRatioEnable; /*!< 1 = enables average to peak power ratio calculation block, both avgPower and peakPower calculations must be enabled before enabling ratio calculation, 0 = disabled */ +}adi_adrv904x_PowerMonitorCfg_t; + +/** + * \brief Indicates the tx channels to which an instance of adi_adrv904x_PowerProtectionCfg_t applies + */ +typedef struct adi_adrv904x_PowerMonitorCfgRt +{ + uint32_t txChannelMask; /*!< The tx channels to which powerCfg applies. Suggested to use adi_adrv904x_TxChannels_e to build. */ + adi_adrv904x_PowerMonitorCfg_t txPowerMonitorCfg; /*!< PowerProtection configuration used for channels specified in txChannelMask */ +} adi_adrv904x_PowerMonitorCfgRt_t; + +/** + * \brief Holds the configuration for the PA protection ramp events + */ +typedef struct adi_adrv904x_ProtectionRampCfg +{ + uint32_t rampDownMask; /*!< Mask showing ramp down events. Bit descriptions can be found at adi_adrv904x_RampDownTrigger_e */ + uint8_t altEventClearReqd; /*!< 1 = user must manually clear pll_jesd_prot_clr after a PLL or JESD ramp down event, 0 = hardware clears */ +} adi_adrv904x_ProtectionRampCfg_t; + +/** + * \brief Indicates the tx channels to which an instance of adi_adrv904x_ProtectionRampCfg_t applies + */ +typedef struct adi_adrv904x_ProtectionRampCfgRt +{ + uint32_t txChannelMask; /*!< The tx channels to which protectionRampCfg applies. Suggested to use adi_adrv904x_TxChannels_e to build. */ + adi_adrv904x_ProtectionRampCfg_t protectionRampCfg; /*!< ProtectionRamp configuration used for channels specified in txChannelMask */ +} adi_adrv904x_ProtectionRampCfgRt_t; + +/** +* \brief Data structure to hold ADRV904X Tx Slew Rate Detector Configuration +*/ +typedef struct adi_adrv904x_SlewRateDetectorCfg +{ + adi_adrv904x_PaProtectionInputSel_e inputSel; /*!< This selects the source of input signal for SRD block */ + uint16_t srdOffset; /*!< These bits sets the offset (threshold) for the slew. Threshold[dBFS] = 10 * Log10(srdOffset/65535) */ + uint8_t srdEnable; /*!< 1:Enable // 0:Disable the slew rate detection block */ + uint8_t srdIrqEnable; /*!< 1:Enable // 0:Disable slew rate interrupt signal */ + uint8_t autoRecoveryWaitTime; /*!< HW will clear the SRD error after this wait time. Any new slew event during the countdown period reinitializes the timer. + This counter runs at the sample rate. Wait period in cycles = 2^(autoRecoveryWaitTime + 6). Valid Range[0-15] */ + uint8_t autoRecoveryEnable; /*!< 1:Enable 0:Disable auto-recovery. If enabled, HW will clear SRD error after autoRecoveryWaitTime. If disabled, + user needs to call adi_adrv904x_TxProtectionErrorClear to clear SRD error. */ + uint8_t autoRecoveryDisableTimerWhenTxOff; /*!< 1:Disable // 0:Enable timer when Tx off. If disabled, auto-recovery counter is disabled when TxOn is low and during txon_wait_period. */ + uint8_t srdStatisticsEnable; /*!< 1:Enable SRD statistics // 0:Disable SRD statistics. When enabled, user can read statistics through adi_adrv904x_TxSlewRateStatisticsRead */ + uint8_t srdStatisticsMode; /*!< 0:Record the maximum slew observed. 1:Record the number of samples which have slew above threshold. */ +} adi_adrv904x_SlewRateDetectorCfg_t; + +/** + * \brief Indicates the tx channels to which an instance of adi_adrv904x_SlewRateDetectorCfg_t applies + */ +typedef struct adi_adrv904x_SlewRateDetectorCfgRt +{ + uint32_t txChannelMask; /*!< The tx channels to which srlCfg applies. Suggested to use adi_adrv904x_TxChannels_e to build. */ + adi_adrv904x_SlewRateDetectorCfg_t srlCfg; /*!< SlewRateDetector configuration used for channels specified in txChannelMask */ +} adi_adrv904x_SlewRateDetectorCfgRt_t; + +/** +* \brief Data structure to hold ADRV904X Tx Power Monitor Status fields +*/ +typedef struct adi_adrv904x_TxPowerMonitorStatus_t +{ + uint16_t avgPower; /*!< Power monitor average power readback. */ + uint16_t peakPower; /*!< Power monitor peak power readback. */ + uint16_t avgErrorPower; /*!< Power monitor average power error. This shows the average + power when average power error flag is asserted. */ + uint16_t peakErrorPower; /*!< Power monitor peak power error. This shows the peak + power when peak power error flag is asserted. */ + uint16_t avgPeakRatio; /*!< Average to Peak power ratio readback. */ + +} adi_adrv904x_TxPowerMonitorStatus_t; + +/** +* \brief Data structure to hold a adrv904x device Tx attenuation calls +*/ +typedef struct adi_adrv904x_TxAtten +{ + uint32_t txChannelMask; /*!< Tx Channel mask selection */ + uint16_t txAttenuation_mdB; /*!< Tx Attenuation value in millidB */ +} adi_adrv904x_TxAtten_t; + +/** +* \brief Enum to set the Tx Attenuation step size +*/ +typedef enum adi_adrv904x_TxAttenStepSize +{ + ADI_ADRV904X_TXATTEN_0P05_DB = 0, /*!< S0, S1 registers programmed in units of 0.05dB */ + ADI_ADRV904X_TXATTEN_0P1_DB = 1, /*!< Not supported */ + ADI_ADRV904X_TXATTEN_0P2_DB = 2, /*!< Not supported */ + ADI_ADRV904X_TXATTEN_0P4_DB = 3, /*!< Not supported */ + ADI_ADRV904X_TXATTEN_INVALID = 4 +} adi_adrv904x_TxAttenStepSize_e; + +/** + * \brief Each Tx channel can have it's Tx attenuation updated from several sources. + */ +typedef enum adi_adrv904x_TxAttenUpdateSrc +{ + ADI_ADRV904X_TXATTEN_UPD_SRC_S0, /*!< The attenuation register S0 */ + ADI_ADRV904X_TXATTEN_UPD_SRC_S0_OR_S1 /*!< Either S0 or S1 depending on a GPIO input level */ +} adi_adrv904x_TxAttenUpdateSrc_e; + +/** + * \brief Tx attenuation update source plus any required extra configuration of source. + */ +typedef struct adi_adrv904x_TxAttenUpdateSrcCfg +{ + adi_adrv904x_TxAttenUpdateSrc_e updateSrc; /*!< The update source */ + + /** If updateSrc is S0_OR_S1 indicates which GPIO input selects between the two. If that GPIO input is + * high S1 is used otherwise S0 used. */ + adi_adrv904x_GpioPinSel_e s0OrS1Gpio; /*!< GPIO selection */ +}adi_adrv904x_TxAttenUpdateSrcCfg_t; + +/** + * \brief Each Tx channel has it's Tx attenuation updated on the occurrence of one of several triggers. + */ +typedef enum adi_adrv904x_TxAttenUpdateTrg_e +{ + ADI_ADRV904X_TXATTEN_UPD_TRG_NONE, + ADI_ADRV904X_TXATTEN_UPD_TRG_SPI, + ADI_ADRV904X_TXATTEN_UPD_TRG_GPIO +} adi_adrv904x_TxAttenUpdateTrg_e; + +/** + * \brief Tx Atten update trigger plus any configuration of that trigger. + */ +typedef struct adi_adrv904x_TxAttenUpdateTrgCfg_t +{ + adi_adrv904x_TxAttenUpdateTrg_e updateTrg; /*!< Update trigger selection */ + adi_adrv904x_GpioPinSel_e triggerGpio; /*!< If updateTrg is GPIO indicate which GPIO rising-edge triggers the update. */ +} adi_adrv904x_TxAttenUpdateTrgCfg_t; + +/** + * \brief Complete configuration for the Tx attenuation update trigger and source for a single channel. + */ +typedef struct adi_adrv904x_TxAttenUpdateCfg +{ + adi_adrv904x_TxAttenUpdateSrcCfg_t srcCfg; /*!< Tx attenuation update source config */ + adi_adrv904x_TxAttenUpdateTrgCfg_t trgCfg; /*!< Tx attenuation update trigger config */ +} adi_adrv904x_TxAttenUpdateCfg_t; + +/** + * \brief Configuration structure for Tx power control + */ +typedef struct adi_adrv904x_TxAttenCfg +{ + adi_adrv904x_TxAttenUpdateCfg_t updateCfg; /*!< Tx atten update configuration */ + adi_adrv904x_TxAttenStepSize_e txAttenStepSize; /*!< The units in which the S0 and S1 registers are programmed */ +} adi_adrv904x_TxAttenCfg_t; + + +/** +* \brief Data structure for Tx decimated power block configuration +*/ +typedef struct adi_adrv904x_TxDecimatedPowerCfg +{ + uint32_t txChannelMask; /*!< Tx channel selection */ + uint8_t measurementEnable; /*!< 0:Disable , 1:Enable power measurements */ + uint8_t powerInputSelect; /*!< Use output of Tx for power measurement. 0: Band DUC output, 1: DPD output 2: QEC output, 3:PFIR output. Valid Range from 0 to 3*/ + uint8_t powerMeasurementDuration; /*!< Average power measurement duration = 8*2^powerMeasurementDuration. Valid range from 0 to 31 */ + uint8_t peakToPowerMode; /*!< 0:Disable , 1:Enable peak-to-power mode. */ +}adi_adrv904x_TxDecimatedPowerCfg_t; + + +/** +* \brief Enum to set the Discontinuous Transmit (DTX) Mode +* This 2 bit bitfield is used to select the mode of operation of the DTx mode control block. +* 00 - DTx mode control disabled +* 01 - Automatic mode. Triggers the power down stream on observing a specified number of zero samples (dtx_zero_counter) on Tx input data. Power up stream is triggered as soon as a non zero sample is seen. +* 10 - SPI controlled mode - In this mode, power down is triggered on setting the dtx_force bitfield. Clearing that bit triggers the power up stream. +* 11 - Pin controlled mode - In this mode, a GPIO pin specified by the dtx_force_gpio_select controls Power up/down. Rising edge on the pin triggers the power down stream and a falling edge triggers a power up stream +*/ +typedef enum adi_adrv904x_DtxMode +{ + ADI_ADRV904X_DTXMODE_DISABLE = 0, /*!< DTX is in Disable Mode */ + ADI_ADRV904X_DTXMODE_AUTO = 1, /*!< DTX is in Automatic Mode */ + ADI_ADRV904X_DTXMODE_SPI = 2, /*!< DTX is in SPI Control Mode */ + ADI_ADRV904X_DTXMODE_PIN = 3 /*!< DTX is in PIN Control Mode */ +} adi_adrv904x_DtxMode_e; + +/** + * \brief Data structure to hold Discontinuous Transmit (DTX) configuration. + */ +typedef struct adi_adrv904x_DtxCfg +{ + uint32_t txChannelMask; /*!< Tx Channels for which the Dtx to be updated. Bits 0-7 correspond to Tx0-Tx7 */ + adi_adrv904x_DtxMode_e dtxMode; /*!< Select the Mode configuration for DTX */ + uint16_t dtxZeroCounter; /*!< DTX Zero Counter for DTX Auto Mode. When dtx_mode_enable=2'b01 (Auto mode), this bitfield specifies the number of continues zeros to trigger DTX power down */ +} adi_adrv904x_DtxCfg_t; + +/** +* \brief Data structure to hold Discontinuous Transmit (DTX) GPIO configuration. +*/ +typedef struct adi_adrv904x_DtxGpioCfg +{ + adi_adrv904x_GpioPinSel_e dtxGpioTxSel[ADI_ADRV904X_MAX_TXCHANNELS]; /*!< GPIO selection for each Tx channel. User can select ADI_ADRV904X_GPIO_INVALID if they don't need to route DTX signal to a GPIO. */ +} adi_adrv904x_DtxGpioCfg_t; + + + +/** + * \brief Enum of Carriers within an Tx Channel + */ +typedef enum adi_adrv904x_TxCarrier +{ + ADI_ADRV904X_TX_CARRIER_NONE = 0x00U, + ADI_ADRV904X_TX_CARRIER_0 = 0x01U, + ADI_ADRV904X_TX_CARRIER_1 = 0x02U, + ADI_ADRV904X_TX_CARRIER_2 = 0x04U, + ADI_ADRV904X_TX_CARRIER_3 = 0x08U, + ADI_ADRV904X_TX_CARRIER_4 = 0x10U, + ADI_ADRV904X_TX_CARRIER_5 = 0x20U, + ADI_ADRV904X_TX_CARRIER_6 = 0x40U, + ADI_ADRV904X_TX_CARRIER_7 = 0x80U, + ADI_ADRV904X_TX_CARRIER_ALL = 0xFFU, +} adi_adrv904x_TxCarrier_e; + +/** + * \brief Hard clipper configuration structure + */ +typedef struct adi_adrv904x_HardClipperConfig +{ + uint8_t hardClipperSel; /*!< Hardclipper PreDpd/PostAtten selection. 1: PreDpd // 0 : PostAtten */ + uint8_t hardClipperEnable; /*!< Hardclipper enable/disable selection. 1: Enable // 0 : Disable */ + uint32_t hardClipperThreshold; /*!< Normalized threshold for the hard clipper in the range 0 to 2^16. + The threshold is relative to 0dBFS which means that a threshold value of 2^16 corresponds to 0dBFS. + The threshold is applied to an approximation of SQRT(I^2 + Q^2). The hard clipper threshold can + be calculated as HardClipperThreshold = 10^(threshold_dBFS/20) * 2^16 */ +} adi_adrv904x_HardClipperConfig_t; + +/** + * \brief Hard Clipper Statistics. For details please check adi_adrv904x_HardClipperStatisticsGet function + */ +typedef struct adi_adrv904x_HardClipperStatistics +{ + uint16_t postAttenHardClipperStat; /*!< Hardclipper PostAtten Statistics. */ + uint16_t preDpdHardClipperStat; /*!< Hardclipper PreDpd Statistics.*/ +} adi_adrv904x_HardClipperStatistics_t; + +#define ADI_ADRV904X_MAX_TX_CARRIERS 8U + +/** + * \brief Data structure to hold Tx Carrier Mask selections (Tx Channel mask + Carrier mask) + */ +typedef struct adi_adrv904x_TxCarrierMask +{ + uint32_t txChannelMask; /*!< Tx Channel Mask selection */ + uint32_t carrierMask; /*!< Carrier Mask selection */ +} adi_adrv904x_TxCarrierMask_t; + +/** + * \brief Data structure to hold Tx Carrier Selections (Tx Channel Select + Carrier Mask) + */ +typedef struct adi_adrv904x_TxCarrierSel +{ + adi_adrv904x_TxChannels_e txChannel; /*!< Tx Channel Selection */ + uint32_t carrierMask; /*!< Carrier Mask selection */ +} adi_adrv904x_TxCarrierSel_t; + +/** + * \brief Enum of Carriers Band within an Tx Channel + */ +typedef enum adi_adrv904x_TxCarrierBand +{ + ADI_ADRV904X_TX_CARRIER_BAND_NONE = 0x00U, + ADI_ADRV904X_TX_CARRIER_BAND_0 = 0x01U, + ADI_ADRV904X_TX_CARRIER_BAND_1 = 0x02U, + ADI_ADRV904X_TX_CARRIER_BAND_ALL = 0x03U, +} adi_adrv904x_TxCarrierBand_e; + +#define ADI_ADRV904X_MAX_TX_CARRIER_BANDS 2U +/** + * \brief Data structure to hold the Tx carrier band Mask selections (Tx Channel mask + band mask). + */ +typedef struct adi_adrv904x_TxBandMask +{ + uint32_t txChannelMask; /*!< Tx Channel Mask selection */ + uint32_t bandMask; /*!< Tx Band Mask selection */ +} adi_adrv904x_TxBandMask_t; + +/** + * \brief Enum of Carriers Band within an Tx Channel + */ +typedef enum adi_adrv904x_TxDpdChanId +{ + ADI_ADRV904X_TX_DPD_ID_NONE = 0x00U, + ADI_ADRV904X_TX_DPD_ID_0 = 0x01U, + ADI_ADRV904X_TX_DPD_ID_1 = 0x02U, + ADI_ADRV904X_TX_DPD_ID_2 = 0x04U, + ADI_ADRV904X_TX_DPD_ID_3 = 0x08, + ADI_ADRV904X_TX_DPD_ID_ALL = 0x0FU, +} adi_adrv904x_TxDpdChanId_e; + +#define ADI_ADRV904X_MAX_TX_DPD_IDS 4U +/** + * \brief Data structure to hold the Tx carrier band Mask selections (Tx Channel mask + band mask). + */ +typedef struct adi_adrv904x_TxDpdMask +{ + uint32_t txChannelMask; /*!< Tx Channel Mask selection */ + uint32_t dpdIdMask; /*!< Tx Dpd Channel Id Mask selection */ +} adi_adrv904x_TxDpdMask_t; + + +/** + * \brief Data structure to hold the Post DPD atten parameters + */ +typedef struct adi_adrv904x_PostDpdAtten +{ + uint8_t magGain; /*!< Actuator Magnitude Square Input Gain Range 0-4*FS. Saturated to 1x. Data Format: Unsigned Int.Frac=2.6. Unity gain=0x40.*/ + + uint8_t gmpOutShift; /*!< Actuator Output Shift for gmp terms Range 0-15. Add one to double output gain. + * Output is left shifted to accommodate output normalization. + * Default shift is configured for unity coefficient sum of 0x2000 and + * 2 bits of headroom for individual coefficient. When large number of terms + * are used resulting in bit growth, the output gain can be decreased (right shift) + * to the correct the overall gain. Max dynamic range at out_shift=0, supporting + * all LUTs active and data at maximum. */ + + uint8_t ddrOutShift; /*!< Actuator Output Shift for ddr terms Range 0-15. Add one to double output gain. + * Output is left shifted to accommodate output normalization. + * Default shift is configured for unity coefficient sum of 0x2000 and + * 2 bits of headroom for individual coefficient. When large number of terms + * are used resulting in bit growth, the output gain can be decreased (right shift) + * to the correct the overall gain. Max dynamic range at out_shift=0, supporting + * all LUTs active and data at maximum. */ + +} adi_adrv904x_PostDpdAtten_t; + +/** + * \brief TX playback data. It contains 4096 samples maximum + */ +typedef struct adi_adrv904x_TxPlaybackData +{ + int16_t playbackDataReal[ADI_ADRV904X_TX_PLAYBACK_DATA_MAX_NUM_SAMPLES]; /*!< An array of samples for TX playback - 16bit real samples */ + int16_t playbackDataImag[ADI_ADRV904X_TX_PLAYBACK_DATA_MAX_NUM_SAMPLES]; /*!< An array of samples for TX playback - 16bit imag samples */ + uint16_t numSamples; /*!< No. of samples contained in playbackDataReal and playbackDataImag arrays */ +}adi_adrv904x_TxPlaybackData_t; + +#endif /* _ADI_ADRV904X_TX_TYPES_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_types.h new file mode 100644 index 00000000000..c387306707a --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_types.h @@ -0,0 +1,658 @@ +/** + * Copyright 2015 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.pdf" file in this zip file. + */ + +/*! +* \file adi_adrv904x_types.h +* \brief Contains ADRV904X API configuration and run-time type definitions +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#ifndef _ADI_ADRV904X_TYPES_H_ +#define _ADI_ADRV904X_TYPES_H_ + +#include "adi_common.h" +#include "adi_adrv904x_user.h" +#include "adi_adrv904x_cpu_types.h" +#include "adi_adrv904x_radioctrl_types.h" +#include "adi_adrv904x_tx_types.h" +#include "adi_adrv904x_rx_types.h" +#include "adi_adrv904x_gpio_types.h" +#include "adi_adrv904x_datainterface_types.h" + +#include "adi_adrv904x_radio_seq_image_format_types.h" +#include "adi_adrv904x_carrier_reconfigure_types.h" +#include "adi_adrv904x_dfe_cal_dpd_types.h" +#include "adi_adrv904x_dfe_cfr_types.h" + +#define ADI_ADRV904X_TX_PROFILE_VALID 0x01 +#define ADI_ADRV904X_RX_PROFILE_VALID 0x02 +#define ADI_ADRV904X_ORX_PROFILE_VALID 0x04 +#define ADI_ADRV904X_NUM_SHARED_RESOURCES 40U + +#define ADRV904X_ADDR_SPI_INTERFACE_CONFIG_A 0x0000 +#define ADRV904X_CONFIG_A_SPI_LSB_FIRST 0x42 +#define ADRV904X_CONFIG_A_SPI_ADDR_ASCENSION 0x24 +#define ADRV904X_CONFIG_A_SPI_SDO_ACTIVE 0x18 +#define ADRV904X_ADDR_DIGITAL_IO_CONTROL 0x0010 +#define ADRV904X_IO_CONTROL_SPI2_OUTS_DRV_SEL 0x02 +#define ADRV904X_IO_CONTROL_SPI_OUTS_DRV_SEL 0x01 +#define ADRV904X_BF_CORE_ADDR 0U + +#define ADRV904X_ADDR_SPI_INTERFACE_CONFIG_B 0x0001 +#define ADRV904X_CONFIG_B_SINGLE_INSTRUCTION 0x80 + +#define ADI_ADRV904X_MAX_UART 4U + +#define ADI_ADRV904X_MAX_RXCHANNELS 10U +#define ADI_ADRV904X_MAX_RX_ONLY 8U +#define ADI_ADRV904X_MAX_ORX 2U + +#define ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET 12 + +#define ADI_ADRV904X_MAX_SERDES_LANES 8U /* Number of lanes in serializer and deserializer */ + +#define ADI_ADRV904X_MAX_CHANNELS 8 + +#define ADI_ADRV904X_MAX_FEATUREMASK 16 + +/** + * \brief Enum of possible channel enables + */ +typedef enum adi_adrv904x_Channels +{ + ADI_ADRV904X_CHOFF = 0x00, /*!< No channels are enabled */ + ADI_ADRV904X_CH0 = 0x01, /*!< Channel 0 enabled */ + ADI_ADRV904X_CH1 = 0x02, /*!< Channel 1 enabled */ + ADI_ADRV904X_CH2 = 0x04, /*!< Channel 2 enabled */ + ADI_ADRV904X_CH3 = 0x08, /*!< Channel 3 enabled */ + ADI_ADRV904X_CH4 = 0x10, /*!< Channel 4 enabled */ + ADI_ADRV904X_CH5 = 0x20, /*!< Channel 5 enabled */ + ADI_ADRV904X_CH6 = 0x40, /*!< Channel 6 enabled */ + ADI_ADRV904X_CH7 = 0x80 /*!< Channel 7 enabled */ +} adi_adrv904x_Channels_e; + +/** + * \brief Data structure to hold ADRV904X API State + */ +typedef enum adi_adrv904x_ApiStates +{ + ADI_ADRV904X_STATE_POWERONRESET = 0x001U, /*!< POR Complete */ + ADI_ADRV904X_STATE_INITIALIZED = 0x002U, /*!< Initialized */ + ADI_ADRV904X_STATE_STREAMLOADED = 0x004U, /*!< Stream Processor Loaded */ + ADI_ADRV904X_STATE_CPUDEBUGLOADED = 0x008U, /*!< CPU Debug SW Loaded */ + ADI_ADRV904X_STATE_CPU0LOADED = 0x010U, /*!< CPU 0 Loaded */ + ADI_ADRV904X_STATE_CPU1LOADED = 0x020U, /*!< CPU 1 Loaded */ + ADI_ADRV904X_STATE_ALLCPUSLOADED = 0x040U, /*!< All CPU's Loaded */ + ADI_ADRV904X_STATE_INITCALS_RUN = 0x080U, /*!< Init Cals Running */ + ADI_ADRV904X_STATE_RADIOON = 0x100U, /*!< Device Running */ + ADI_ADRV904X_STATE_DFECPULOADED = 0x200U, /*!< Dfe Cpu Loaded */ + ADI_ADRV904X_STATE_RSLOADED = 0x400U, /*!< Radio Sequencer Loaded */ + ADI_ADRV904X_STATE_STANDBY = 0x800U, /*!< Part is Powered down in Standby mode */ + ADI_ADRV904X_STATE_JRXREPAIRED = 0x1000U, /*!< Jrx repair has been applied */ + ADI_ADRV904X_STATE_MCSCARRIERRECONFIG = 0x2000U, /*!< Mcs carrier reconfig has been applied */ +} adi_adrv904x_ApiStates_e; + +/** + * \brief Enumerated list of CMOS pads drive strength options for SPI_DO signal. + * + * Note: These are the values used in the device's SpiCfgSettings, resource files and as arguments to + * SpiDoutPadDriveStrengthSet, and are chosen to maintain binary compatability with API versions before + * _STRENGTH_1 and _2 were added. The corresponding bitfield values written to the device differ. + */ +typedef enum adi_adrv904x_CmosPadDrvStr +{ + ADI_ADRV904X_CMOSPAD_DRV_WEAK = 0U, /*!< Minimum pad drive strength */ + ADI_ADRV904X_CMOSPAD_DRV_STRENGTH_1 = 2U, /*!< Is stronger than WEAK */ + ADI_ADRV904X_CMOSPAD_DRV_STRENGTH_2 = 3U, /*!< Is stronger than STRENGTH_1 */ + ADI_ADRV904X_CMOSPAD_DRV_STRONG = 1U, /*!< Maximum pad drive strength */ +} adi_adrv904x_CmosPadDrvStr_e; + +/** +* \brief Enumerated list of options to use to set the LO source for the Rx/Tx and ORx mixers. +*/ +typedef enum adi_adrv904x_LoSel +{ + ADI_ADRV904X_LOSEL_LO0 = 0, /*!< LO0 selection */ + ADI_ADRV904X_LOSEL_LO1 = 1, /*!< LO1 selection */ + } adi_adrv904x_LoSel_e; + +/** +* \brief Enum of possible Capability Feature enables +*/ +typedef enum adi_adrv904x_Feature +{ + ADI_ADRV904X_FEATUREOFF = 0x0000, /*!< No Capability Feature enabled */ + ADI_ADRV904X_FEATURE_RESERVED1 = 0x0001, /*!< Reserve1 feature enabled */ + ADI_ADRV904X_FEATURE_SPI2 = 0x0002, /*!< SPI2 feature enabled */ + ADI_ADRV904X_FEATURE_TXSRD = 0x0004, /*!< Tx Slew Rate Detector feature enabled */ + ADI_ADRV904X_FEATURE_RESERVED2 = 0x0008 /*!< Reserve2 feature enabled jesd compression */ +} adi_adrv904x_Feature_e; + +/** + * \brief Enum of Device Capability Features case index + */ +typedef enum adi_adrv904x_FeatureCaseIndex +{ + ADI_ADRV904X_FEATURE_SERIALIZER = 0x00, /*!< serializer feature case */ + ADI_ADRV904X_FEATURE_DESERIALIZER = 0x01, /*!< deserializer feature case */ + ADI_ADRV904X_FEATURE_TX = 0x02, /*!< txchannel feature case */ + ADI_ADRV904X_FEATURE_RX = 0x03, /*!< rxchannel feature case */ + ADI_ADRV904X_FEATURE_ORX_LOMASK = 0x04 /*!< orxchannel and lomask features case */ +} adi_adrv904x_FeatureCaseIndex_e; + +/** + * \brief MCS Sync Mode + */ +typedef enum adi_adrv904x_McsSyncMode +{ + ADI_ADRV904X_MCS_OFF = 0U, /*!< Notification that MCS is off */ + ADI_ADRV904X_MCS_START = 1U << 0, /*!< Notification that MCS is started */ + + ADI_ADRV904X_MCS_CARRIER_RECONFIG = 1U << 1 /*!< Notification that MCS carrier reconfig is on going */ +} adi_adrv904x_McsSyncMode_e; + +/** + * \brief Data structure to hold Tx data path settings + */ +typedef struct adi_adrv904x_TxChannelCfg +{ + adi_adrv904x_TxAttenCfg_t txAttenCfg; /*!< Tx attenuation config */ + uint16_t txAttenInit_mdB; /*!< Tx attenuation init time value */ + adi_adrv904x_PowerMonitorCfg_t txpowerMonitorCfg; /*!< Tx power monitor configuration */ + adi_adrv904x_SlewRateDetectorCfg_t srlCfg; /*!< Slew rate detector config */ + adi_adrv904x_ProtectionRampCfg_t protectionRampCfg; /*!< Tx Pa protection ramp config */ +} adi_adrv904x_TxChannelCfg_t; + +/** + * \brief Data structure to hold ADRV904X Tx Channel configuration settings + */ +typedef struct adi_adrv904x_TxSettings +{ + adi_adrv904x_TxChannelCfg_t txChannelCfg[ADI_ADRV904X_MAX_TXCHANNELS]; /*!< Tx settings per Tx channel */ +} adi_adrv904x_TxSettings_t; + + +/** + * \brief Data structure to hold Tx data path settings + */ +typedef struct adi_adrv904x_RxChannelCfg +{ + adi_adrv904x_RxDataFormat_t rxDataFormat; /*!< Rx Data Format settings structure */ + uint8_t rxGainIndexInit; /*!< Init Gain Index value for the channels selected */ +} adi_adrv904x_RxChannelCfg_t; + +/** + * \brief Data structure to hold ADRV904X Rx Channel configuration settings + */ +typedef struct adi_adrv904x_RxSettings +{ + adi_adrv904x_RxChannelCfg_t rxChannelCfg[ADI_ADRV904X_MAX_RXCHANNELS]; /*!< Rx settings per Rx channel */ +} adi_adrv904x_RxSettings_t; + +/* +* \brief Data structure to hold ADRV904X device capability settings +*/ +typedef struct adi_adrv904x_CapabilityModel +{ + uint8_t productId; /*!< device Product Id */ + uint8_t siRevision; /*!< device silicon version */ + uint8_t txNumber; /*!< device number of Tx */ + uint8_t rxNumber; /*!< device number of Rx */ + uint8_t orxNumber; /*!< device number of Orx */ + uint32_t txChannelMask; /*!< device ChannelMask of Tx */ + uint32_t rxChannelMask; /*!< device ChannelMask of Rx */ + uint32_t orxChannelMask; /*!< device ChannelMask of Orx */ + uint32_t featureMask; /*!< device featureMask*/ + uint32_t txMaxBw_kHz; /*!< device max BW for Tx */ + uint32_t rxMaxBw_kHz; /*!< device max BW for Rx */ + uint32_t orxMaxBw_kHz; /*!< device max BW for Orx */ + uint32_t rfFreqRangeMin_kHz; /*!< device RF Freq Range Min */ + uint32_t rfFreqRangeMax_kHz; /*!< device RF Freq Range Max */ + uint32_t loMask; /*!< Mask of Hardware Enabled LOs and the bit0 to bit2 correspond to LO1, LO2 and ext LO*/ + uint32_t rfMaxIbw_Mhz; /*!< device Instantaneous Bandwidth Max */ + uint32_t serializerLaneEnableMask; /*!< Mask of Hardware Enabled Serializer Lanes */ + uint32_t deserializerLaneEnableMask; /*!< Mask of Hardware Enabled Deserializer Lanes */ +} adi_adrv904x_CapabilityModel_t; + + +#ifndef CLIENT_IGNORE + +/** +* \brief Data Structure to hold ADRV904X device Rx Max and Min gain indices +*/ +typedef struct adi_adrv904x_GainIndex +{ + uint8_t rx0MinGainIndex; /*!< Current device minimum Rx0 gain index */ + uint8_t rx0MaxGainIndex; /*!< Current device maximum Rx0 gain index */ + uint8_t rx1MinGainIndex; /*!< Current device minimum Rx1 gain index */ + uint8_t rx1MaxGainIndex; /*!< Current device maximum Rx1 gain index */ + uint8_t rx2MinGainIndex; /*!< Current device minimum Rx2 gain index */ + uint8_t rx2MaxGainIndex; /*!< Current device maximum Rx2 gain index */ + uint8_t rx3MinGainIndex; /*!< Current device minimum Rx3 gain index */ + uint8_t rx3MaxGainIndex; /*!< Current device maximum Rx3 gain index */ + uint8_t rx4MinGainIndex; /*!< Current device minimum Rx4 gain index */ + uint8_t rx4MaxGainIndex; /*!< Current device maximum Rx4 gain index */ + uint8_t rx5MinGainIndex; /*!< Current device minimum Rx5 gain index */ + uint8_t rx5MaxGainIndex; /*!< Current device maximum Rx5 gain index */ + uint8_t rx6MinGainIndex; /*!< Current device minimum Rx6 gain index */ + uint8_t rx6MaxGainIndex; /*!< Current device maximum Rx6 gain index */ + uint8_t rx7MinGainIndex; /*!< Current device minimum Rx7 gain index */ + uint8_t rx7MaxGainIndex; /*!< Current device maximum Rx7 gain index */ +} adi_adrv904x_GainIndex_t; + +#endif // !CLIENT_IGNORE + +/** + * \brief Struct for ADRV904X SPI Configuration Settings + */ +typedef struct adi_adrv904x_SpiConfigSettings +{ + uint8_t msbFirst; /*!< 1 = MSB First, 0 = LSB First Bit order for SPI transaction */ + uint8_t fourWireMode; /*!< 1: Use 4-wire SPI, 0: 3-wire SPI (SDIO pin is bidirectional). NOTE: ADI's FPGA platform always uses 4-wire mode */ + adi_adrv904x_CmosPadDrvStr_e cmosPadDrvStrength; /*!< Drive strength of CMOS pads when used as outputs (SDIO, SDO, GP_INTERRUPT, GPIO 1, GPIO 0) */ +} adi_adrv904x_SpiConfigSettings_t; + +/** + * \brief Struct for ADRV904X Aux SPI Interface Configuration. + */ +typedef struct adi_adrv904x_AuxSpiConfig +{ + uint8_t enable; /*!< 1 = ENABLE, 0 = DISABLE */ + adi_adrv904x_GpioPinSel_e gpioCsb; /*!< GPIO[3] or GPIO[16] */ + adi_adrv904x_GpioPinSel_e gpioClk; /*!< GPIO[2] or GPIO[15] */ + adi_adrv904x_GpioPinSel_e gpioSdio; /*!< GPIO[0] or GPIO[13] */ + adi_adrv904x_GpioPinSel_e gpioSdo; /*!< GPIO[1] or GPIO[14] or INVALID */ +} adi_adrv904x_AuxSpiConfig_t; + +/** + * \brief Struct for ADRV904X SPI Configuration Settings + */ +typedef struct adi_adrv904x_SpiOptions +{ + uint8_t allowSpiStreaming; /*!< 0 = SPI Streaming not allowed. 1 = Allowed */ + uint8_t allowAhbAutoIncrement; /*!< 0 = AHB Auto Incr not allowed. 1 = Allowed */ + uint8_t allowAhbSpiFifoMode; /*!< 0 = AHB SPI FIFO use not allowed. 1 = Allowed + Note: AHB SPI FIFO value ignored unless SPI Streaming = 1 + and AHB Auto Incr */ +} adi_adrv904x_SpiOptions_t; + +/** + * \brief Data structure to hold uart settings + */ +typedef struct adi_adrv904x_UartSettings +{ + uint8_t enable; /*!< Enable(1)/Disable(0) Uart GPIO */ + adi_adrv904x_GpioPinSel_e pinSelect; /*!< Holds Uart Gpio Pin Sel. Valid Range (ADI_ADRV904X_GPIO_09|10|11|12) */ +} adi_adrv904x_UartSettings_t; + +/** +* \brief Memdump enum to represent record type +*/ +typedef enum adi_adrv904x_MemdumpRecordType +{ + ADI_ADRV904X_MEMDUMP_FIRMWARE_VER_RECORD = 1U, /* Firmware Version Record */ + ADI_ADRV904X_MEMDUMP_TELEM_RECORD = 2U, /* Relemetry Record */ + ADI_ADRV904X_MEMDUMP_ETM_TRACE_RECORD = 3U, /* ETM/Trace Record */ + ADI_ADRV904X_MEMDUMP_DEV_DRVR_STATE_RECORD = 4U, /* Device Driver State Record */ + ADI_ADRV904X_MEMDUMP_CPU_RAM_RECORD = 5U, /* CPU RAM Record */ + ADI_ADRV904X_MEMDUMP_REG_RECORD = 6U, /* Register Record */ +} adi_adrv904x_MemdumpRecordType_e; + +/** +* \brief Memdump enum to represent CPU Type +*/ +typedef enum adi_adrv904x_MemdumpCpuType +{ + ADI_ADRV904X_MEMDUMP_STREAM_CPU = 0x1U, /* Custom CPU RAM */ + + /* All arm CPU's added below */ + ADI_ADRV904X_MEMDUMP_ARM_V7 = 0x2U, /* 32 bit arm v7 */ + ADI_ADRV904X_MEMDUMP_ARM_V8 = 0x3U, /* aarch64, arm v8 */ + + /* All risc-v CPU's added below */ + ADI_ADRV904X_MEMDUMP_RISC_V_1 = 0x8000U, /* risc-v */ +} adi_adrv904x_MemdumpCpuType_e; + +/** +* \brief Memdump enum to represent FW Type +*/ +typedef enum adi_adrv904x_MemdumpFirmwareType +{ + ADI_ADRV904X_MEMDUMP_STREAM_FW = 0x1U, /* Stream FW */ + ADI_ADRV904X_MEMDUMP_RADIO_FW = 0x2U, /* Radio FW */ + ADI_ADRV904X_MEMDUMP_DFE_FW = 0x3U, /* DFE FW */ +} adi_adrv904x_MemdumpFirmwareType_e; + +/** + * \brief Data structure to hold DFE UART settings + */ +typedef struct adi_adrv904x_DfeUartSettings +{ + uint8_t enableGpioTx; /*!< Enable(1)/Disable(0) GPIO pin for DFE UART TX. DFE UART0 Pin ADI_ADRV904X_GPIO_08. */ + uint8_t enableGpioRx; /*!< Enable(1)/Disable(0) GPIO pin for DFE UART RX. DFE UART0 Pin ADI_ADRV904X_GPIO_17. */ + uint8_t enableGpioCts; /*!< Enable(1)/Disable(0) GPIO pin for DFE UART CTS. DFE UART0 Pin ADI_ADRV904X_GPIO_21. */ + uint8_t enableGpioRts; /*!< Enable(1)/Disable(0) GPIO pin for DFE UART RTS. DFE UART0 Pin ADI_ADRV904X_GPIO_22. */ +} adi_adrv904x_DfeUartSettings_t; + +/** + * \brief Data structure to hold digital clock settings + */ +typedef struct adi_adrv904x_ClockSettings +{ + uint8_t DevClkOnChipTermResEn; /*!< Enables the 100ohm on chip termination resistor 0: Disabled, 1: Enable */ +} adi_adrv904x_ClockSettings_t; + +/** + * \brief Data structure to hold ADRV904X device instance initialization settings + */ +typedef struct adi_adrv904x_Init +{ + adi_adrv904x_SpiOptions_t spiOptionsInit; /*!< Holds the initial SPI runtime settings */ + adi_adrv904x_ClockSettings_t clocks; /*!< Holds settings for CLKPLL and reference clock */ + adi_adrv904x_CpuMemDumpBinaryInfo_t cpuMemDump; /*!< CPU Memory Dump File Settings */ + adi_adrv904x_RxSettings_t rx; /*!< Rx settings data structure */ + adi_adrv904x_TxSettings_t tx; /*!< Tx settings data structure */ + adi_adrv904x_UartSettings_t uart[ADI_ADRV904X_MAX_UART]; /*!< Uart settings data structure */ + adi_adrv904x_GpIntPinMaskCfg_t gpIntPreInit; /*!< GP Interrupt Pin Mask Config data structure to be applied before Device Initialization */ + adi_adrv904x_RadioCtrlPreInit_t radioCtrlPreInit; /*!< Radio Control Config data structure to be applied before Device Initialzation */ + adi_adrv904x_DfeUartSettings_t dfeUart0; /*!< DFE UART0 settings data structure */ +} adi_adrv904x_Init_t; + + +#ifndef CLIENT_IGNORE +/** +* \brief Data structure to hold clock divide ratios +*/ +typedef struct adi_adrv904x_ClkDivideRatios +{ + uint8_t armClkDivideRatio; /*!< ARM clock divide ratio w.r.t hsDigClk */ + uint8_t agcClkDivideRatio; /*!< AGC module clock divide ratio w.r.t hsDigClk */ + uint8_t regClkDivideRatio; /*!< Register bus clock divide ratio w.r.t hsDigClk */ + uint8_t txAttenDeviceClockDivideRatio; /*!< Tx Atten module clock divide ratio w.r.t hsDigClk */ +} adi_adrv904x_ClkDivideRatios_t; + +typedef struct adi_adrv904x_SharedResourcePool +{ + uint32_t featureID; /*!< Holds the feature ID of a shared resource pool member */ + uint8_t semaphoreCount; /*!< Holds the semaphore count of a shared resource pool member */ + uint32_t channelMask; /*!< Holds the channel Mask of a shared resource pool member */ +} adi_adrv904x_SharedResourcePool_t; + +/** + * \brief Data structure to hold a ADRV904X device instance status information + * + * Application layer allocates this memory, but only API writes to it to keep up with the API run time state. + */ +typedef struct adi_adrv904x_Info +{ + uint8_t deviceSiRev; /*!< ADRV904X silicon rev read during HWOpen */ + uint8_t deviceProductId; /*!< ADRV904X Product ID read during HWOpen */ + adi_adrv904x_ApiStates_e devState; /*!< Current device state of the part, i.e., radio on, radio off, arm loaded, etc., defined by deviceState enum */ + uint32_t initializedChannels; /*!< Indicates initialized & calibrated Rx/ORx/Tx chans. RxN is at bit N. TxN is at bit N + ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET */ + uint32_t profilesValid; /*!< Current device profilesValid bit field for use notification, i.e., Tx = 0x01, Rx = 0x02, Orx = 0x04 */ + adi_adrv904x_TxAttenStepSize_e txAttenStepSize[ADI_ADRV904X_MAX_TXCHANNELS]; /*!< Current tx Atten step size for each Tx channel */ + uint64_t swTest; /*!< Software Test Signal */ + uint32_t hsDigClk_kHz; /*!< Calculated in initialize() digital clock used throughout API functions */ + adi_adrv904x_ClkDivideRatios_t clkDivideRatios; /*!< Clock divide ratios w.r.t hsDigClk for various modules in the device */ + uint32_t profileAddr; /*!< Address to load Profile */ + uint32_t adcProfileAddr; /*!< Address to load ADC Profile */ + + adi_adrv904x_GainIndex_t gainIndexes; /*!< Current device Rx min max gain index values */ + uint32_t chunkStreamImageSize[ADI_ADRV904X_STREAM_MAX]; /*!< Stream Image Size */ + uint32_t chunkStreamImageOffset[ADI_ADRV904X_STREAM_MAX];/*!< Stream Image Offset */ + uint32_t currentStreamBinBaseAddr; /*!< Address to load current stream */ + uint32_t currentStreamBaseAddr; /*!< Address to load current stream base */ + uint8_t currentStreamNumberStreams; /*!< Number of Streams for current stream */ + uint8_t currentStreamImageIndex; /*!< Index of current stream */ + uint32_t currentStreamImageSize; /*!< Image size of current stream */ + uint8_t rxFramerNp; /*!< Rx Framer Np - converter sample resolution (12, 16, 24) */ + uint8_t rxChannel3bitSlicerMode; /*!< If a bit is set - corresponding Rx Channel Data format slicer ctrl is 3 bits */ + adi_adrv904x_SharedResourcePool_t sharedResourcePool[ADI_ADRV904X_NUM_SHARED_RESOURCES]; /*!< Shared resource pool for the given device instance*/ + uint8_t linkSharingEnabled; /*!< Link sharing enabled if 1, disabled otherwise */ + adi_adrv904x_Cpu_t cpu; /*!< Processor related info */ + adi_adrv904x_SpiOptions_t spiOptions; /*!< Holds the SPI runtime options used during API function calls */ + uint8_t spiFifoModeOn; /*!< Internal use only: Keeps track of current SPI FIFO mode status. */ + uint8_t autoIncrModeOn; /*!< Internal use only: Keeps track of current auto-increment mode status. */ + uint8_t spiStreamingOn; /*!< Internal use only: Keeps track of current SPI Streaming status. */ + uint32_t currentPageStartingAddress; /*!< Internal use only: Starting address of the current 4K page */ + uint32_t previousSpiStreamingAddress; /*!< Internal use only: Only valid when spiStreamingOn is asserted. Stores the previous address written to determine if a CS toggle is required */ + adi_adrv904x_TxToOrxMappingConfig_t txToOrxMappingConfig; /*!< Internal use only: Tx to Orx Mapping Configuration */ + adi_adrv904x_StreamGpioPinCfg_t streamGpioMapping; /*!< Internal use only: Stream GPIO mapping */ + + adi_adrv904x_ProtectionRampCfgRt_t txProtectionRampCfg[ADI_ADRV904X_MAX_TXCHANNELS]; /*!< Internal use only: PA protection ramp down */ + adi_adrv904x_RadioSeqImageHeader_t rsImageHeader; /*!< Radio Sequence Image Header */ + uint8_t xbarSettings[ADI_ADRV904X_RADIO_SEQ_XBAR_SIZE]; /*!< cross bar settings */ + uint32_t lookupTable[ADI_ADRV904X_RADIO_SEQ_LOOKUP_TAB_MAX_SIZE]; /*!< Sequence lookup table */ + uint32_t lookupCrcRun; /*!< Lookup table CRC run */ + uint32_t sequenceCrcRun; /*!< Sequence Image CRC run */ + uint32_t fileImageCrcRun; /*!< CRC of entire file image run */ + adi_adrv904x_CfrThrConfig_t cfrThresholdsCfg0[ADI_ADRV904X_MAX_TXCHANNELS]; /*!< CFR threshold values for Cfg0 set */ + adi_adrv904x_CfrThrConfig_t cfrThresholdsCfg1[ADI_ADRV904X_MAX_TXCHANNELS]; /*!< CFR threshold values for Cfg1 set */ + uint8_t dfeSwTest; /*!< DFE Software test signal */ + uint8_t rsStarted; /*!< Radio Sequencer started */ + uint8_t rsRadioRunning; /*!< Radio Sequencer Radio Running */ + time_t initGlobalTime; /*!< Initialization time of the system */ + adi_adrv904x_RsSpecialSequencer_t specialSequencerPatternInfo; /*!< Customer special frame timing pattern config for each radio sequencer */ + adi_adrv904x_RadioCtrlAlarmGpioConfig_t alarmGpioConfig; /*!< GPIO pin configuration used by alarms */ + adi_adrv904x_DfeCtrlTxToOrxMappingConfig_t dfeCtrlTxToOrxMappingConfig; /*!< Internal use only: DFE Control Mode Tx to Orx Mapping Configuration */ + adi_adrv904x_DtxInputPinCfg_t dtxInputMapping; /*!< Internal use only: DTX input mapping */ + adi_adrv904x_ModelSwitchInputPinCfg_t modelSwitchInputMapping; /*!< Internal use only: Model Switch input mapping */ + adi_adrv904x_GpioPinSel_e digGpioTddSw; /*!< Digital GPIO TDD SW */ + adi_adrv904x_GpioPinSel_e sbetLatchModelIndex; /*!< Sbet latch dpd power index GPIO */ + adi_adrv904x_GpioAnaPinSel_e anaGpioTddSw; /*!< Analog GPIO TDD SW */ + adi_adrv904x_GpioPinSel_e digGpioPredrive; /*!< Digital GPIO Predrive */ + adi_adrv904x_GpioAnaPinSel_e anaGpioPredrive; /*!< Analog GPIO Predrive */ + adi_adrv904x_StreamGpioAntCalOutCfg_t streamGpioAntCalOutCfg; /*!< Stream GPIO Antenna Cal Output Pin Assignments */ + adi_adrv904x_CarrierReconfigSoln_t txCarrierReconfigSoln; /*!< Internal use only: Tx carrier reconfig solution from last run Solve. To be used at next Apply */ + adi_adrv904x_CarrierReconfigSoln_t rxCarrierReconfigSoln; /*!< Internal use only: Rx carrier reconfig solution from last run Solve. To be used at next Apply */ + adi_adrv904x_CarrierReconfigLatencyCfgTop_t txCarrierLatencySolved; /*!< Internal use only: Tx carrier reconfig latency settings from last solve. May not yet be applied */ + adi_adrv904x_CarrierReconfigLatencyCfgTop_t rxCarrierLatencySolved; /*!< Internal use only: Rx carrier reconfig latency settings from last solve. May not yet be applied */ + adi_adrv904x_CarrierReconfigLatencyCfgTop_t txCarrierLatencyApplied; /*!< Internal use only: Tx carrier reconfig latency settings for currently applied config */ + adi_adrv904x_CarrierReconfigLatencyCfgTop_t rxCarrierLatencyApplied; /*!< Internal use only: Rx carrier reconfig latency settings for currently applied config */ + uint16_t carrierLfsrValue; /*!< Internal use only: LFSR value used in Carrier Reconfig random table generation */ + uint8_t vswrWaveformLoaded[ADI_ADRV904X_MAX_TXCHANNELS]; /*!< Internal use only: Shows if VSWR waveform is loaded by user */ +} adi_adrv904x_Info_t; + +/** + * \brief Data structure to hold band data + */ +typedef struct adi_adrv904x_BandCfgExtract +{ + uint8_t enabled; /*!< Band enabled flag */ + uint32_t rfCenterFreq_kHz; /*!< RF center frequency */ + uint32_t instBw_kHz; /*!< Instantaneous signal bandwidth */ + uint32_t sampleRate_kHz; /*!< Band sample rate */ + uint32_t bandOffset_kHz; /*!< LO and NCO offset */ +} adi_adrv904x_BandCfgExtract_t; + +/** + * \brief Data structure to hold Tx data path settings + */ +typedef struct adi_adrv904x_TxChannelCfgExtract +{ + uint32_t rfBandwidth_kHz; /*!< Tx RF passband bandwidth for the profile */ + uint32_t totalDecimation; /*!< Total DDC decimation */ + uint32_t digChanMask; /*!< Tx digital channel mask indicates which DUCs to initialize */ + uint32_t txLbAdcSampleRate_kHz; /*!< TX LB ADC Sample rate */ + adi_adrv904x_BandCfgExtract_t bandSettings[ADI_ADRV904X_DUC_NUM_BAND]; /*!< Tx DUC settings */ + uint32_t pfirRate_kHz; /*!< Tx PFIR rate */ + adi_adrv904x_CarrierRuntime_t carrierRuntimeSettings; /*!< Tx carrier runtime settings */ + uint8_t bandRatio[ADI_ADRV904X_DUC_NUM_BAND]; /*!< Cduc to band ratio */ + uint8_t maxSlot; /*!< Holds the max slot value for this channel's config */ +} adi_adrv904x_TxChannelCfgExtract_t; + +/** + * \brief Data structure to hold ADRV904X Tx Channel configuration settings + */ +typedef struct adi_adrv904x_TxSettingsExtract +{ + uint32_t txInitChannelMask; /*!< Tx channel mask of which channels to initialize */ + adi_adrv904x_TxChannelCfgExtract_t txChannelCfg[ADI_ADRV904X_MAX_TXCHANNELS]; /*!< Tx settings per Tx channel */ +} adi_adrv904x_TxSettingsExtract_t; + +/** + * \brief Data structure to hold Rx data path settings + */ +typedef struct adi_adrv904x_RxChannelCfgExtract +{ + uint32_t rfBandwidth_kHz; /*!< Rx RF passband bandwidth for the profile */ + uint32_t rxDdc0OutputRate_kHz; /*!< Rx output sample rate per Rx channel Band 0 */ + uint32_t rxDdc1OutputRate_kHz; /*!< Rx output sample rate per Rx channel Band 1 */ + uint32_t digChanMask; /*!< Rx digital channel mask indicates which DDCs to initialize */ + uint32_t rxAdcSampleRate_kHz; /*!< Rx ADC sample rate */ + adi_adrv904x_BandCfgExtract_t bandSettings[ADI_ADRV904X_DDC_NUM_BAND]; /*!< Rx DDC settings for this channel's profile */ + adi_adrv904x_CarrierRuntime_t carrierRuntimeSettings; /*!< Rx carrier runtime settings */ + uint8_t bandRatio[ADI_ADRV904X_DDC_NUM_BAND]; /*!< Cddc to band ratio */ + uint8_t maxSlot; /*!< Holds the max slot value for this channel's config */ +} adi_adrv904x_RxChannelCfgExtract_t; + +/** + * \brief Data structure to hold ORx data path settings + */ +typedef struct adi_adrv904x_OrxChannelCfgExtract +{ + uint32_t rfBandwidth_kHz; /*!< Rx RF passband bandwidth for the profile */ + uint32_t orxOutputRate_kHz; /*!< ORx output sample rate per ORx channel */ + uint32_t orxAdcSampleRate_kHz; /*!< ORx ADC sample rate*/ +} adi_adrv904x_OrxChannelCfgExtract_t; + +/** + * \brief Data structure to hold ADRV904X Rx Channel configuration settings + */ +typedef struct adi_adrv904x_RxSettingsExtract +{ + uint32_t rxInitChannelMask; /*!< Rx channel mask of which channels to initialize */ + adi_adrv904x_RxChannelCfgExtract_t rxChannelCfg[ADI_ADRV904X_MAX_RX_ONLY]; /*!< Rx settings per Rx channel */ +} adi_adrv904x_RxSettingsExtract_t; + +/** + * \brief Data structure to hold digital clock settings + */ +typedef struct adi_adrv904x_ClockSettingsExtract +{ + uint32_t deviceClockScaled_kHz; /*!< Scaled device clock frequency in kHz */ + uint8_t padDivideRatio; /*!< Pad divider ratio calculated by configurator tool */ + uint8_t armClkDivideRatio; /*!< FW Clock Divide ratio calculated by Configurator tool */ + uint8_t armClkDevClkDivRatio; /*!< FW Clock Divide ratio calculated by Configurator tool */ + uint32_t hsDigClk_kHz; /*!< Digital clock */ +} adi_adrv904x_ClockSettingsExtract_t; + +/** + * \brief Data structure to hold Jesd Framer settings + */ +typedef struct adi_adrv904x_FramerSettingsExtract +{ + uint8_t jesdM; /*!< M value */ + uint8_t jesdNp; /*!< Np value */ + uint8_t serialLaneEnabled; /*!< lane enabled*/ + uint32_t iqRate_kHz; /*!< Framer I/Q rate */ + uint32_t laneRate_kHz; /*!< Framer Lane rate */ + uint8_t linkLsSampleXBar [ADI_ADRV904X_NUM_LKSH_SAMPLE_XBAR]; +} adi_adrv904x_FramerSettingsExtract_t; + +/** + * \brief Data structure to hold Jesd Framer settings + */ +typedef struct adi_adrv904x_DeframerSettingsExtract +{ + uint8_t jesdM; /*!< M value */ + uint8_t jesdNp; /*!< Np value */ + uint8_t deserialLaneEnabled; /*!< lane enabled */ + uint32_t iqRate_kHz; /*!< Framer I/Q rate */ + uint32_t laneRate_kHz; /*!< Framer Lane rate */ +} adi_adrv904x_DeframerSettingsExtract_t; + +/** + * \brief Data structure to hold Jesd Framer and Deframer settings + */ +typedef struct adi_adrv904x_JesdSettingsExtract +{ + adi_adrv904x_FramerSettingsExtract_t framerSetting[ADI_ADRV904X_MAX_FRAMERS]; /*!< Framer settings */ + adi_adrv904x_DeframerSettingsExtract_t deframerSetting[ADI_ADRV904X_MAX_DEFRAMERS]; /*!< Deframer setting */ + adi_adrv904x_FramerSettingsExtract_t framerLsSetting[ADI_ADRV904X_MAX_FRAMERS_LS]; /*!< Framer Link Sharing settings */ + uint8_t rxdesQhfrate; /*!< SERDES Rate mode */ +} adi_adrv904x_JesdSettingsExtract_t; + +/* + * \brief Data structure to hold ORx channel configuration settings + */ +typedef struct adi_adrv904x_OrxSettingsExtract +{ + adi_adrv904x_OrxChannelCfgExtract_t orxChannelCfg[ADI_ADRV904X_MAX_ORX]; /*!< Orx output sample rate */ +} adi_adrv904x_OrxSettingsExtract_t; + +typedef struct adi_adrv904x_DfeRadioSeqConfigExtract +{ + uint8_t radioSeqEn; /*!< Radio sequencer top level enable */ + uint8_t sampleClkEn; /*!< Radio sequencer sampling clock enable */ + uint8_t sampleClkDiv; /*!< Radio sequencer sampling clock. Power of 2 encoding */ + uint8_t ssbSyncMode; /*!< Radio sequencer SSB frame sync mode */ + uint32_t ssbSyncPeriod; /*!< Radio sequencer SSB sync duration */ + uint16_t symWidth; /*!< Radio sequencer nominal symbol duration */ + uint16_t extSymWidth; /*!< Radio sequencer extended symbol duration */ + uint16_t extSymSpacing; /*!< Radio sequencer spacing between consecutive extended symbols */ +} adi_adrv904x_DfeRadioSeqConfigExtract_t; + +typedef struct adi_adrv904x_DfeCducConfigExtract +{ + uint32_t cducOutputRate_kHz[ADI_ADRV904X_MAX_CHANNELS]; /*!< CDUC output rate - one for each Tx channel */ + uint32_t dpdOutputRate_kHz[ADI_ADRV904X_MAX_CHANNELS]; /*!< DPD output rate */ +} adi_adrv904x_DfeCducConfigExtract_t; + +typedef struct adi_adrv904x_TxBandLatency +{ + uint16_t duc_cc[ADI_ADRV904X_DUC_NUM_BAND]; +} adi_adrv904x_TxBandLatency_t; + +typedef struct adi_adrv904x_RxBandLatency +{ + uint16_t ddc_cc[ADI_ADRV904X_DDC_NUM_BAND]; +} adi_adrv904x_RxBandLatency_t; + +/** + * \brief Data structure to hold ADRV904X device instance initialization settings + */ +typedef struct adi_adrv904x_InitExtract +{ + + adi_adrv904x_ClockSettingsExtract_t clocks; /*!< Holds settings for CLKPLL and reference clock */ + adi_adrv904x_RxSettingsExtract_t rx; /*!< Rx settings data structure */ + adi_adrv904x_TxSettingsExtract_t tx; /*!< Tx settings data structure */ + adi_adrv904x_OrxSettingsExtract_t orx; /*!< ORx settings data structure */ + adi_adrv904x_JesdSettingsExtract_t jesdSetting; /*!< Jesd settings *//*!< ORx settings data structure */ + uint8_t rxTxCpuConfig[ADI_ADRV904X_MAX_CHANNELS]; /*!< Defines which CPU each channel is assigned to (Rx/Tx) */ + uint8_t orxCpuConfig[ADI_ADRV904X_MAX_ORX]; /*!< Defines which CPU each channel is assigned to (ORx) */ + uint8_t jesd204DesLaneCpuConfig[ADI_ADRV904X_MAX_SERDES_LANES]; /*!< Defines which CPU each deserializer lane calibration is assigned to */ + uint8_t chanAssign[ADI_ADRV904X_MAX_CHANNELS]; /*!< This is used to reference a channel to a rx/tx profile def'n in rxConfig/txConfig */ + uint8_t featureMask[ADI_ADRV904X_MAX_FEATUREMASK]; /*!< Device Extract information 128 bits of Feature Mask */ + adi_adrv904x_DfeRadioSeqConfigExtract_t rs; /*!< Radio Sequencer configuration */ + adi_adrv904x_RadioCtrlPreInit_t radioCtrlPreInit; /*!< Radio Ctrl Pre Init configuration */ + adi_adrv904x_DfeCducConfigExtract_t dfeCduc; /*!< Misc DFE parameters needed by the API */ + adi_adrv904x_CarrierRadioCfg_t rxCarrierConfigs[ADI_ADRV904X_MAX_CHANNELS]; /*!< Rx carrier config settings for each channel */ + adi_adrv904x_CarrierRadioCfg_t txCarrierConfigs[ADI_ADRV904X_MAX_CHANNELS]; /*!< Tx carrier config settings for each channel */ + adi_adrv904x_CarrierJesdCfg_t txCarrierJesdCfg; /*!< Holds Deframer Carrier XBar values */ + adi_adrv904x_CarrierJesdCfg_t rxCarrierJesdCfg; /*!< Holds Framer Carrier XBar values */ + uint8_t framerInterleaveMode[ADI_ADRV904X_MAX_FRAMERS]; /*!< Framer settings */ + uint8_t deframerInterleaveMode[ADI_ADRV904X_MAX_DEFRAMERS]; /*!< Deframer setting */ + adi_adrv904x_TxBandLatency_t txBandLatency[ADI_ADRV904X_MAX_CHANNELS]; /*!< Tx Band Latency values needed for API Reconfig carrier-to-carrier delay calculations */ + adi_adrv904x_RxBandLatency_t rxBandLatency[ADI_ADRV904X_MAX_CHANNELS]; /*!< Rx Band Latency values needed for API Reconfig carrier-to-carrier delay calculations */ +} adi_adrv904x_InitExtract_t; + + +/** + * \brief Data structure to hold ADRV904X device instance settings + */ +typedef struct adi_adrv904x_Device +{ + adi_common_Device_t common; /*!< Common layer structure */ + adi_adrv904x_Info_t devStateInfo; /*!< ADRV904X run time state information container */ + adi_adrv904x_SpiConfigSettings_t spiSettings; /*!< Pointer to ADRV904X SPI Settings */ + adi_adrv904x_InitExtract_t initExtract; /*!< ADRV904X init info extract from CPU Profile container */ +} adi_adrv904x_Device_t; +#endif /* CLIENT_IGNORE */ + +#endif diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_user.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_user.h new file mode 100644 index 00000000000..46d40b084e7 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_user.h @@ -0,0 +1,260 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adi_adrv904x_user.h + * \brief Contains ADRV904X API macro definitions for user to override + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef _ADI_ADRV904X_USER_H_ +#define _ADI_ADRV904X_USER_H_ + +#ifndef ADI_ADRV904X_LOGGING +#define ADI_ADRV904X_LOGGING (uint32_t) ( ADI_HAL_LOG_MSG | \ + ADI_HAL_LOG_WARN | \ + ADI_HAL_LOG_ERR | \ + ADI_HAL_LOG_API) /* LogLevel Set to API, Messages, Warnings, Error */ +#endif /* !ADI_ADRV904X_LOGGING */ + +/* + ***************************************** + * Interface Macros + ****************************************** + */ +#ifndef ADI_ADRV904X_CPU_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES + #define ADI_ADRV904X_CPU_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES 1024U /*!< Please ensure that the CPU Binary Image Size is perfectly divisible by the chunk size */ +#endif /* CPU Binary Image Chunk Loading Size */ + +#ifndef ADI_ADRV904X_CPU_PROFILE_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES +#define ADI_ADRV904X_CPU_PROFILE_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES 1024U /*!< Please ensure that the CPU Profile Binary Image Size is perfectly divisible by the chunk size */ +#endif /* CPU Profile Binary Image Chunk Loading Size */ + +#ifndef ADI_ADRV904X_STREAM_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES + #define ADI_ADRV904X_STREAM_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES 1024U /*!< Please ensure that the Stream Processor Binary Image Size is perfectly divisible by the chunk size */ +#endif /* Steam Processor Binary Image Chunk Loading Size */ + +#ifndef ADI_ADRV904X_RS_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES +#define ADI_ADRV904X_RS_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES 1024U /*!< Please ensure that the Radio Sequencer Binary Image Size is perfectly divisible by the chunk size */ +#endif /* Radio Sequencer Binary Image Chunk Loading Size */ + +#ifndef ADI_ADRV904X_TX_ATTEN_TABLE_CACHE_MAX + #define ADI_ADRV904X_TX_ATTEN_TABLE_CACHE_MAX 256U /*!< Cache value: up to 1024, multiple of 4 */ +#endif + +#ifndef ADI_ADRV904X_MEM_DUMP_CHUNK_SIZE + #define ADI_ADRV904X_MEM_DUMP_CHUNK_SIZE 256U /*!< Cache value: up to 1024, multiple of 4 */ +#endif + +/** + * Macro for compiler-specific structure packing directive. + * Define this if your compiler is not supported in + * devices/adrv904x/public/adi_adrv904x_platform_pack.h. + * See adi_adrv904x_platform_pack.h for examples. To use + * this macro from the list in adi_adrv904x_plaform_pack.h + * remove this definition (including ifndef) + */ +#ifndef ADI_ADRV904X_PACKED + #define ADI_ADRV904X_PACKED(d) _Pragma("pack(1)") d _Pragma("pack()") +#endif + +/* + ***************************************** + * Rx gain tables + ****************************************** + */ +#ifndef ADI_ADRV904X_RX_GAIN_TABLE_ARR_MAX + #define ADI_ADRV904X_RX_GAIN_TABLE_ARR_MAX 1U /*!< Number of Rx Gain Tables to be loaded */ +#endif /* Rx Gain Table Array Size */ + +#ifndef ADI_ADRV904X_MAX_GAIN_TABLE_INDEX + #define ADI_ADRV904X_MAX_GAIN_TABLE_INDEX 255U +#endif + + +#ifndef ADI_ADRV904X_RADIOCTRL_RANGE_CHECK + #define ADI_ADRV904X_RADIOCTRL_RANGE_CHECK 1 +#endif + +/** + * Macro for defining platform-specific byte ordering (endianness). + * Define this if your compiler is not supported in + * devices/adrv904x/private/adrv904x_platform_byte_order.h. + * See adrv904x_platform_byte_order.h for examples. + */ +/* +#ifndef ADI_ADRV904X_LITTLE_ENDIAN +#define ADI_ADRV904X_LITTLE_ENDIAN (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) +#endif +*/ + +#ifndef ADI_ADRV904X_SENDCPUCMD_TIMEOUT_US +#define ADI_ADRV904X_SENDCPUCMD_TIMEOUT_US 2000000 +#endif + +#ifndef ADI_ADRV904X_SENDCPUCMD_INTERVAL_US +#define ADI_ADRV904X_SENDCPUCMD_INTERVAL_US 1000 +#endif + +#ifndef ADI_ADRV904X_READCPURESP_TIMEOUT_US +#define ADI_ADRV904X_READCPURESP_TIMEOUT_US 1000000 +#endif + +#ifndef ADI_ADRV904X_READCPURESP_INTERVAL_US +#define ADI_ADRV904X_READCPURESP_INTERVAL_US 1000 +#endif + +#ifndef ADI_ADRV904X_INITCALSWAIT_INTERVAL_US +#define ADI_ADRV904X_INITCALSWAIT_INTERVAL_US 1000 +#endif + +#ifndef ADI_ADRV904X_TRACKCALDISABLE_TIMEOUT_US +#define ADI_ADRV904X_TRACKCALDISABLE_TIMEOUT_US 4000000 +#endif + +#ifndef ADI_ADRV904X_TRACKCALDISABLE_INTERVAL_US +#define ADI_ADRV904X_TRACKCALDISABLE_INTERVAL_US 100000 +#endif + +#ifndef ADI_ADRV904X_RUNEYESWEEP_TIMEOUT_US +#define ADI_ADRV904X_RUNEYESWEEP_TIMEOUT_US 180000000 +#endif + +#ifndef ADI_ADRV904X_RUNEYESWEEP_INTERVAL_US +#define ADI_ADRV904X_RUNEYESWEEP_INTERVAL_US 10000 +#endif + +#ifndef ADI_ADRV904X_GETCPUBOOTUP_TIMEOUT_US +#define ADI_ADRV904X_GETCPUBOOTUP_TIMEOUT_US 120000000 +#endif + +#ifndef ADI_ADRV904X_GETCPUBOOTUP_INTERVAL_US +#define ADI_ADRV904X_GETCPUBOOTUP_INTERVAL_US 1000 +#endif + +#ifndef ADI_ADRV904X_WRITECPUEXCEPTION_TIMEOUT_US +#define ADI_ADRV904X_WRITECPUEXCEPTION_TIMEOUT_US 5000000 +#endif + +#ifndef ADI_ADRV904X_WRITECPUEXCEPTION_INTERVAL_US +#define ADI_ADRV904X_WRITECPUEXCEPTION_INTERVAL_US 1000 +#endif + +#ifndef ADI_ADRV904X_MIN_GAIN_TABLE_INDEX + #define ADI_ADRV904X_MIN_GAIN_TABLE_INDEX 0 +#endif + +#ifndef ADI_ADRV904X_START_RX_GAIN_INDEX + #define ADI_ADRV904X_START_RX_GAIN_INDEX 255 +#endif + +#ifndef ADI_ADRV904X_MIN_RX_GAIN_TABLE_INDEX + #define ADI_ADRV904X_MIN_RX_GAIN_TABLE_INDEX 0 +#endif + +#ifndef ADI_ADRV904X_FACTORY_TEMPERATURE_TEST + #define ADI_ADRV904X_FACTORY_TEMPERATURE_TEST 70 +#endif + +#ifndef ADI_ADRV904X_FACTORY_TEMPERATURE_MARGIN + #define ADI_ADRV904X_FACTORY_TEMPERATURE_MARGIN 3 +#endif + +#ifndef ADI_ADRV904X_JRXREPAIR_APPLY_WAIT_US + #define ADI_ADRV904X_JRXREPAIR_APPLY_WAIT_US 50000U +#endif + +#ifndef ADI_ADRV904X_JRXREPAIR_TEST_WAIT_US + #define ADI_ADRV904X_JRXREPAIR_TEST_WAIT_US 200000U +#endif + +#ifndef ADI_ADRV904X_DFE_CPUBOOTUP_TIMEOUT_US +#define ADI_ADRV904X_DFE_CPUBOOTUP_TIMEOUT_US 30000000U +#endif + +#ifndef ADI_ADRV904X_DFE_CPUBOOTUP_INTERVAL_US +#define ADI_ADRV904X_DFE_CPUBOOTUP_INTERVAL_US 1000U +#endif + +/* Setting this parameter to 1u will enable logging of all DFE CPU commands and + * their responses to the API log. Data is logged in a raw form and must be + * sent to Analog Devices for analysis. */ +#ifndef ADI_ADRV904X_DFE_LOG_CPU_CMDS +#define ADI_ADRV904X_DFE_LOG_CPU_CMDS 0u +#endif + +#ifndef ADI_ADRV904X_DFE_LOG_CPU_CMDS_NUM_BYTES_PER_LINE +#define ADI_ADRV904X_DFE_LOG_CPU_CMDS_NUM_BYTES_PER_LINE 16u +#endif + +#ifndef ADI_ADRV904X_DFE_MAX_FILE_LENGTH +#define ADI_ADRV904X_DFE_MAX_FILE_LENGTH 256U +#endif + +/** + * \brief Maximum DFE configuration payload size + */ +#ifndef MAX_DFE_CONFIG_DATA_SIZE +#define MAX_DFE_CONFIG_DATA_SIZE 256U +#endif + +#ifndef ADI_ADRV904X_RX_RANGE_CHECK + /* TODO: Turn on when current UT brings Trx CPU to a mode + * that is compatible with RxTxEnableSetRangeCheck */ + #define ADI_ADRV904X_RX_RANGE_CHECK 1 +#endif + + +#ifndef ADI_ADRV904X_API_VERSION_RANGE_CHECK + #define ADI_ADRV904X_API_VERSION_RANGE_CHECK 1 +#endif + +/** + * \brief Enable Flag for Spi Verify Check in PreMcsInit_NonBroadcast + */ + +#ifndef ADI_ADRV904X_SPI_VERIFY + #define ADI_ADRV904X_SPI_VERIFY 0 +#endif + + +/** + * \brief Enable Flag for SPI Pins Hysteresis + */ + + +#ifndef ADI_ADRV904X_SPI_HYSTERESIS + #define ADI_ADRV904X_SPI_HYSTERESIS 0 +#endif + +/** + * \brief Enable Flag for SPI Pins Hysteresis Debug + */ +#ifndef ADI_ADRV904X_SPI_HYSTERESIS_DEBUG + #define ADI_ADRV904X_SPI_HYSTERESIS_DEBUG 0 +#endif + + +/** + * \brief Drive Strength Configuration for ResetB Pin + */ + +#ifndef ADI_ADRV904X_RESETB_PIN_DRIVE_STRENGTH + #define ADI_ADRV904X_RESETB_PIN_DRIVE_STRENGTH 0 +#endif + + +/** + * \brief Enable Flag for ResetB Pin Hysteresis + */ + +#ifndef ADI_ADRV904X_RESETB_PIN_HYSTERESIS + #define ADI_ADRV904X_RESETB_PIN_HYSTERESIS 0 +#endif + +#endif + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_utilities.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_utilities.h new file mode 100644 index 00000000000..217ca860546 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_utilities.h @@ -0,0 +1,462 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_utilities.h +* \brief Contains top level ADRV904X related function prototypes for +* adi_adrv904x_utilities.c +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#ifndef _ADI_ADRV904X_UTILITIES_H_ +#define _ADI_ADRV904X_UTILITIES_H_ + +#include "adi_adrv904x_utilities_types.h" +#include "adi_adrv904x_error.h" + + +/** +* \brief This utility function loads ADRV904X CPU Binary Image +* +* This function reads the CPU Binary Image file from a specified location (e.g. SD card) +* and programs the CPU through CpuImageWrite() API +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* Please note that a large chunk size defined by ADI_ADRV904X_CPU_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES +* in adi_adrv904x_user.h could potentially cause the stack to crash. Please optimize the chunk size +* in accordance with the stack space available +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] cpuBinaryInfo adi_adrv904x_cpuBinaryInfo_t to be loaded +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuImageLoad(adi_adrv904x_Device_t* const device, + const adi_adrv904x_cpuBinaryInfo_t* const cpuBinaryInfo); + +/** +* \brief This utility function loads ADRV904X Stream Binary Image +* +* This function reads the ADRV904X Stream Binary file from a specified location (e.g. SD card) +* and programs the Stream Processor using StreamImageWrite() API +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* Please note that a large chunk size defined by ADI_ADRV904X_STREAM_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES +* in adi_adrv90xxx_user.h could potentially cause the stack to crash. Please optimize the chunk size +* in accordance with the stack space available. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] streamBinaryInfoPtr Pointer to adi_adrv904x_streamBinaryInfo_t for loading Stream Binary Image +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_StreamImageLoad(adi_adrv904x_Device_t* const device, + const adi_adrv904x_streamBinaryInfo_t* const streamBinaryInfoPtr); + +/** +* \brief This utility function loads ADRV904X Rx Gain Table File +* +* This function reads the ADRV904X Rx Gain Table file (i.e. CSV Format) from a specified location +* (e.g. SD card) and programs the ADRV904X CPU SRAM with the gain table for the requested channels +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] rxGainTableInfo Array of adi_adrv904x_RxGainTableInfo_t for loading Rx Gain Tables +* \param[in] rxGainTableArrSize Array Size, i.e. Number of Rx gain Tables being provided to load +* +* Rx Gain Table columns should be arranged in the following order +* +* -------------------------------------------------------------------------------------------------------- +* | Gain Index | FE Control Word | Ext Control | Phase Offset | Digital Gain | +* -------------------------------------------------------------------------------------------------------- +* +* Rx Gain Indices should be arranged in ascending order for row entries starting with the lowest gain index and +* and progressing to highest gain Index +* +* Eg: If the gain table contains entries from index 192 to index 255, the table has to be arranged such that +* first line should contain row entries for index 192 and the last line should contain row entries to index 255 +* with a total of 64 entries. +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxGainTableLoad(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxGainTableInfo_t rxGainTableInfo[], + const uint32_t rxGainTableArrSize); + +/** +* \brief This utility function extract the Init info from the ADRV904X CPU Profile Binary Image +* +* This function reads the CPU Binary Image Profile file from a specified location (e.g. SD card) +* and extract the Init Info, and save in device data structure. This is an init time function and +* is being called by adi_adrv904x_PreMcsInit(). +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] cpuProfileBinaryInfoPtr Pointer to adi_adrv904x_CpuProfileBinaryInfo_t to be loaded +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeviceInfoExtract(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuProfileBinaryInfo_t* const cpuProfileBinaryInfoPtr); + +/** +* \brief This utility function loads ADRV904X CPU Profile Binary Image +* +* This function reads the CPU Binary Image Profile file from a specified location (e.g. SD card) +* and programs the Binary Image Profile through CpuProfileWrite() API +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* Please note that a large chunk size defined by ADI_ADRV904X_CPU_PROFILE_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES +* in adi_adrv904x_user.h could potentially cause the stack to crash. Please optimize the chunk size +* in accordance with the stack space available +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] cpuProfileBinaryInfoPtr Pointer to adi_adrv904x_CpuProfileBinaryInfo_t to be loaded +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuProfileImageLoad(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuProfileBinaryInfo_t* const cpuProfileBinaryInfoPtr); + +#ifndef CLIENT_IGNORE +/** +* \brief This utility function copies ADRV904X Device Data +* +* This function reads the Device State Init Extract Information from one to another. +* DeviceCopy should be called before making the devices available to multiple threads. +* Unlike the other adrv904x device functions DeviceCopy is not thread-safe. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] deviceSrc Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in,out] deviceDest Pointer to the ADRV904X device data structure to get updated settings +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeviceCopy( adi_adrv904x_Device_t* const deviceSrc, + adi_adrv904x_Device_t* const deviceDest); +#endif /* !CLIENT_IGNORE */ + +/** +* \brief This Utility Function executes ADRV904X Pre-MCS Initialization Sequence +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X Device data structure +* \param[in] init Pointer to the ADRV904X Init data structure +* \param[in] trxBinaryInfoPtr Pointer to all TRX File Information for loading +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_PreMcsInit(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Init_t* const init, + const adi_adrv904x_TrxFileInfo_t* const trxBinaryInfoPtr); + +/** +* \brief This utility function executes the non-broadcastable part of +* Pre-MCS init sequence +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X Device data structure +* \param[in] init Pointer to the ADRV904X Init data structure +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_PreMcsInit_NonBroadcast(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Init_t* const init); + +/** +* \brief This Utility Function executes ADRV904X Post-MCS Initialization Sequence +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X Device data structure +* \param[in] utilityInit Pointer to the ADRV904X utility Init data structure +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_PostMcsInit(adi_adrv904x_Device_t* const device, + const adi_adrv904x_PostMcsInit_t* const utilityInit); + +/** +* \brief This function is used to query for the Deserializer Lanes SwC status +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X Device data structure +* \param[out] swcEnMask Deserializer lane mask, which SwC is enabled +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_JrxRepairSwCEnableGet(adi_adrv904x_Device_t* const device, + uint8_t* const swcEnMask); + +/** +* \brief This function is used to set enabled or disabled the Deserializer Lanes SwC status +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X Device data structure +* \param[in] swcEnMask Deserializer lane mask, in which SwC is to be enabled +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_JrxRepairSwCEnableSet(adi_adrv904x_Device_t* const device, + const uint8_t swcEnMask); + +/** +* \brief This function is used to set enabled or disabled the Deserializer Lanes SwC status +* and depending on the number of lanes used use SwC or simply turning VCMs off. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] laneMask Lanes that are required to go into the Vcm fix mode +* \param[in] enableFix If Vcm lanes fix should be enabled or disabled +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_JrxRepairVcmLanesFix(adi_adrv904x_Device_t* const device, + uint8_t laneMask, + uint8_t enableFix); +/** +* \brief This function is used to enable the Jrx repair at startup. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] enableRepair If Jrx repair should be enabled or disabled +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_JrxRepairInitialization(adi_adrv904x_Device_t* const device, + uint8_t enableRepair); + +/** +* \brief This utility function dumps the ADRV904X CPU program and data memory through Registers32Read() API +* +* This function reads the selected CPU Memory and writes the binary byte array directly to a binary file. +* The binaryFilename is opened before reading the CPU memory to verify that the filepath is has valid write access +* before reading CPU memory.A file IO exception will be thrown if write access is not valid for the binaryFilename path. +* +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] cpuMemDumpBinaryInfoPtr Pointer to adi_adrv904x_CpuMemDumpBinaryInfo_t to be loaded +* \param[in] forceException If set to 1 force all CPUs to exception state before dumping memory. +* \param[out] dumpSize Size of the CPU dump in bytes. +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuMemDump(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuMemDumpBinaryInfo_t* const cpuMemDumpBinaryInfoPtr, + const uint8_t forceException, + uint32_t* const dumpSize); + +/** +* \brief This utility function dumps the ADRV904X CPU RAM memory through Registers32Read() API and all other regions are set to zero +* +* This function reads the selected CPU Memory and writes the binary byte array directly to a binary file. +* The binaryFilename is opened before reading the CPU memory to verify that the filepath is has valid write access +* before reading CPU memory.A file IO exception will be thrown if write access is not valid for the binaryFilename path. +* +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] cpuMemDumpBinaryInfoPtr Pointer to adi_adrv904x_CpuMemDumpBinaryInfo_t to be loaded +* \param[in] forceException If set to 1 force all CPUs to exception state before dumping memory. +* \param[out] dumpSize Size of the CPU dump in bytes. +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuMemDump_vRamOnly(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuMemDumpBinaryInfo_t* const cpuMemDumpBinaryInfoPtr, + const uint8_t forceException, + uint32_t* const dumpSize); + +/** +* \brief This utility function reads ADRV904X Rx Gain table file checksum value +* +* This function reads the ADRV904X Rx Gain Table file in csv format from a specified location +* (typically in an SD card) and get checksum information, 32bit, decimal format, in the second line +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] rxGainTableInfoPtr Pointer to adi_adrv904x_RxGainTableInfo_t for loading Rx Gain Table +* \param[out] rxGainTableChecksum is Rx gain table checksum information, 32bit +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxGainTableChecksumRead(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxGainTableInfo_t* const rxGainTableInfoPtr, + uint32_t* const rxGainTableChecksum); +/** +* \brief This utility function calculates ADRV904X Rx Gain table file checksum value +* +* This function calculates the ADRV904X Rx Gain Table from CPU memory and calculate checksum value +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] rxChannel is Rx channel index +* \param[out] rxGainTableChecksum is Rx gain table checksum information, 32bit +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxGainTableChecksumCalculate(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + uint32_t* const rxGainTableChecksum); +/** +* \brief This utility function loads ADRV904X api version, firmware and stream versions, +* ADRV904X Init and PostMcsInit data structures from the Binary Image that also has the profile. +* +* This function reads the CPU Binary Image file from a specified location (e.g. SD card) +* and, if it contains more information than the profile, populates the structs adi_adrv904x_Version_t for +* the api version, adi_adrv904x_CpuFwVersion_t for the firmware version, adi_adrv904x_Version_t for +* the stream version, adi_adrv904x_Init_t init structure and adi_adrv904x_PostMcsInit_t postMcsInit structures. +* In case this function is called and the profile binary does not contain information for the mentioned structures +* it will exit informing such state in the checkOutput output parameter. +* +* This function should be called before adi_adrv904x_PreMcsInit, adi_adrv904x_PreMcsInit_NonBroadcast and adi_adrv904x_PostMcsInit +* as these functions require the structures to be already populated. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] cpuBinaryInfo adi_adrv904x_cpuBinaryInfo_t to be loaded +* \param[out] apiVer Pointer to the ADRV904X api version data structure to be populated +* \param[out] fwVer Pointer to the ADRV904X firmware version data structure to be populated +* \param[out] streamVer Pointer to the ADRV904X stream version data structure to be populated +* \param[out] init Pointer to the ADRV904X Init data structure to be populated +* \param[out] postMcsInit Pointer to the ADRV904X PostMcsInit data structure to be populated +* \param[out] checkOutput Pointer to ADRV904X enum that constains if the profile binary provided contains the desired structures +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_InitDataExtract(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuProfileBinaryInfo_t* const cpuBinaryInfo, + adi_adrv904x_Version_t* const apiVer, + adi_adrv904x_CpuFwVersion_t* const fwVer, + adi_adrv904x_Version_t* const streamVer, + adi_adrv904x_Init_t* const init, + adi_adrv904x_PostMcsInit_t* const postMcsInit, + adi_adrv904x_ExtractInitDataOutput_e* const checkOutput); + +/** +* \brief This function loads Radio Sequencer Binary Image +* +* This function reads the Radio Sequencer Binary Image file from a specified location (e.g. SD card) +* and programs the CPU through RadioSequencerImageWrite() API +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* Please note that a large chunk size defined by ADI_ADRV904X_RS_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES +* in adi_adrv904x_user.h could potentially cause the stack to crash. Please optimize the chunk size +* in accordance with the stack space available +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] rsBinaryInfoPtr adi_adrv904x_RadioSequencerBinaryInfo_t to be loaded +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerImageLoad(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RadioSequencerBinaryInfo_t* const rsBinaryInfoPtr); + +/** +* \brief This function reloads Radio Sequencer Binary Image at runtime +* +* This function reads the Radio Sequencer Binary Image file from a specified location (e.g. SD card) +* stops the RS and programs the RS using RadioSequencerImageLoad() API. This API is intended to facilitate +* rapid pattern development and debug in the lab +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* Please note that a large chunk size defined by ADI_ADRV904X_RS_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES +* in adi_adrv904x_user.h could potentially cause the stack to crash. Please optimize the chunk size +* in accordance with the stack space available +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] rsBinaryInfoPtr adi_adrv904x_RadioSequencerBinaryInfo_t to be loaded +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerImageReload(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RadioSequencerBinaryInfo_t* const rsBinaryInfoPtr); + +/** +* \brief This utility function extracts the pulse data from profile binary and writes it to CFR Pulse RAMs +* +* It reads the CPU Binary Image Profile file from a specified location (e.g. SD card). +* This is an init time function and is being called by adi_adrv904x_PreMcsInit(). +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure containing settings +* \param[in] cpuProfileBinaryInfoPtr Pointer to adi_adrv904x_CpuProfileBinaryInfo_t to be loaded +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrPulseExtractAndWrite(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuProfileBinaryInfo_t* const cpuProfileBinaryInfoPtr); + +#endif /* _ADI_ADRV904X_UTILITIES_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_utilities_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_utilities_types.h new file mode 100644 index 00000000000..1bbf0990a62 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_utilities_types.h @@ -0,0 +1,160 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_utilities_types.h +* \brief Contains ADRV904X API Utilities data types +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#ifndef _ADI_ADRV904X_UTILITIES_TYPES_H_ +#define _ADI_ADRV904X_UTILITIES_TYPES_H_ + +#include "adi_adrv904x_datainterface_types.h" +#include "adi_adrv904x_radioctrl_types.h" +#include "adi_adrv904x_cals_types.h" +#include "adi_adrv904x_gpio_types.h" +#include "adi_adrv904x_user.h" +#include "adi_library_types.h" + +#include "adi_adrv904x_dfe_cpu_types.h" + + #define ADI_ADRV904X_MAX_NUM_CPUS 3U /* Max Number of ADRV904X CPU's */ + #define ADI_ADRV904X_PRODUCT_ID_MASK 0x0200U /* Product ID, used in Memdump Tools*/ + +#define ADI_ADRV904X_MAX_NUM_LO 2U /* Max Number of ADRV904X LO's */ + +#define ADI_ADRV904X_LOAD_ALL_CPUS ADI_ADRV904X_MAX_NUM_CPUS /* Load All Available CPU's */ + +#define ADI_ADRV904X_LOAD_ALL_RXGAIN_TABLES ADI_ADRV904X_RX_GAIN_TABLE_ARR_MAX /* Load All Rx Gain Tables */ +#define ADI_ADRV904X_MAX_FILE_LENGTH 256U /* Max file length for all API files */ +#define ADI_ADRV904X_VRAM_ONLY_SIZE 4U /* vram only table size */ + +#define ADI_ADRV904X_VERSION_PREREL_SIZE 30U /* Size of Prerel string for driver/firmware version */ + +#define ADI_ADRV904X_FIRMWARE_TYPE_ID_SHIFT 24U /* Type shift for FW ID*/ + +#define ADI_ADRV904X_ETM_RECORD_SIZE 8U /* Record size per-core for ETM Trace record */ +#define ADI_ADRV904X_MAX_DFE_ETM 4U /* Max number of ADRV904X DFE ETM's */ +#define ADI_ADRV904X_ETF_RAM_SIZE_OFFSET 2U /* Amount to shift (<<) ETF RSZ value */ +#define ADI_ADRV904X_TRCIDR1_ARCH_SHIFT 4U /* Amount to shift (>>) TRCIDR1 to get ETM Architecture */ +#define ADI_ADRV904X_TRCIDR1_ARCH_MASK 0x00000FF0U /* Mask for TRCIDR1 ETM Architecture positions */ +#define ADI_ADRV904X_TRACE_FORMAT_CORESIGHT 0x1U /* Coresight format for trace data */ + +#define ADI_ADRV904X_MEMDUMP_DEVICE_DRIVER_HEADER_SIZE 56U /* size of memdump device driver header */ +#define ADI_ADRV904X_MEMDUMP_FIRMWARE_VERSION_HEADER_SIZE 44U /* size of memdump firmware header */ +#define ADI_ADRV904X_MEMDUMP_CPU_RAM_HEADER_SIZE 24U /* size of memdump CPU RAM header */ +#define ADI_ADRV904X_MEMDUMP_REGISTER_HEADER_SIZE 16U /* size of memdump register header */ +#define ADI_ADRV904X_MEMDUMP_TELEM_BUFFER_HEADER_SIZE 16U /* size of memdump basic telemetry header */ +#define ADI_ADRV904X_MEMDUMP_TRACE_BUFFER_HEADER_SIZE 12U /* size of memdump basic trace header */ + +/** +* \brief Macro to restore wrOnly bit +* +* \param commonDev Device variable having wrOnly bit to be restored +* \param wrOnlyBit wrOnly bit value to restore +*/ +#define ADI_ADRV904X_WRONLY_SET(commonDev, wrOnlyBit) commonDev.wrOnly = wrOnlyBit + +/** +* \brief Extract Init Data function Output. Informs user if +* the profile bin does not contain the init structures. +*/ +typedef enum adi_adrv904x_ExtractInitDataOutput +{ + ADI_ADRV904X_EXTRACT_INIT_DATA_NOT_POPULATED = 0x00, + /*!< Default value when value is not ran yet */ + ADI_ADRV904X_EXTRACT_INIT_DATA_POPULATED = 0x02, + /*!< Profile bin contains init structures and were populated */ + ADI_ADRV904X_EXTRACT_INIT_DATA_LEGACY_PROFILE_BIN = 0x4 + /*!< Profile bin does NOT contains init structures and function exited without triggering errors */ +} adi_adrv904x_ExtractInitDataOutput_e; + +/** +* \brief Accomodate generic strings to cross client RPC interface +*/ +typedef struct adi_adrv904x_GenericStrBuf +{ + uint8_t c_str[ADI_ADRV904X_MAX_FILE_LENGTH]; /*!< String contents */ +} adi_adrv904x_GenericStrBuf_t; + +/** +* \brief Stream Binary Info Data Structure +*/ +typedef struct adi_adrv904x_streamBinaryInfo +{ + uint8_t filePath[ADI_ADRV904X_MAX_FILE_LENGTH]; /*!< File Path for Stream Binary Image */ +} adi_adrv904x_streamBinaryInfo_t; + +/** +* \brief CPU Binary Info Data Structure +*/ +typedef struct adi_adrv904x_cpuBinaryInfo +{ + uint8_t filePath[ADI_ADRV904X_MAX_FILE_LENGTH]; /*!< File Path for CPU Core Binary Image */ +} adi_adrv904x_cpuBinaryInfo_t; + +/** +* \brief CPU Profile Info Data Structure +*/ +typedef struct adi_adrv904x_CpuProfileBinaryInfo +{ + uint8_t filePath[ADI_ADRV904X_MAX_FILE_LENGTH]; /*!< File Path for CPU Profile Binary Image*/ +} adi_adrv904x_CpuProfileBinaryInfo_t; + +/** +* \brief CPU Memory Dump Info Data Structure +*/ +typedef struct adi_adrv904x_CpuMemDumpBinaryInfo +{ + uint8_t filePath[ADI_ADRV904X_MAX_FILE_LENGTH]; /*!< File Path for CPU Memory Dump Binary Image*/ +} adi_adrv904x_CpuMemDumpBinaryInfo_t; + +/** +* \brief RX Gain Table Info Data Structure +*/ +typedef struct adi_adrv904x_RxGainTableInfo +{ + uint32_t channelMask; /*!< Channel Mask (i.e. Specify Channels, that are initialized, with the given Rx Gain Table */ + uint8_t filePath[ADI_ADRV904X_MAX_FILE_LENGTH]; /*!< File Path for RX Gain Table */ +} adi_adrv904x_RxGainTableInfo_t; + +/** +* \brief Radio Sequencer Binary Info Data Structure +*/ +typedef struct adi_adrv904x_RadioSequencerBinaryInfo +{ + uint8_t filePath[ADI_ADRV904X_MAX_FILE_LENGTH]; /*!< File Path for Radio Sequencer Binary Image */ +} adi_adrv904x_RadioSequencerBinaryInfo_t; + +/** +* \brief TRX File Info Data Structure +*/ +typedef struct adi_adrv904x_TrxFileInfo +{ + adi_adrv904x_streamBinaryInfo_t stream; /*!< Stream File Settings */ + adi_adrv904x_cpuBinaryInfo_t cpu; /*!< CPU File Settings */ + adi_adrv904x_CpuProfileBinaryInfo_t cpuProfile; /*!< CPU Profile File Settings (may also contain init data structures) */ + adi_adrv904x_RxGainTableInfo_t rxGainTable[ADI_ADRV904X_RX_GAIN_TABLE_ARR_MAX]; /*!< Rx Gain Table Settings */ + adi_adrv904x_DfeCpuBinaryInfo_t dfeCpu; /*!< DFE CPU File Settings */ + adi_adrv904x_RadioSequencerBinaryInfo_t radioSequencer; /*!< Radio Sequencer File Settings */ +} adi_adrv904x_TrxFileInfo_t; + +/** +* \brief Data structure to hold Utility Init structures +*/ +typedef struct adi_adrv904x_PostMcsInit +{ + adi_adrv904x_RadioCtrlModeCfg_t radioCtrlCfg; /*!< Holds the setup for the Radio Control Mode (SPI vs PIN mode) used for Radio Control */ + adi_adrv904x_RadioCtrlTxRxEnCfg_t radioCtrlGpioCfg; /*!< Holds the setup for each of the GPIO pins used for Radio Control */ + uint8_t radioCtrlTxRxEnPinSel; /*!< Holds the setup for the TxRxEn pin select used for Radio Control */ + uint8_t radioCtrlTxRxEnCfgSel; /*!< Holds the setup for the TxRxEn config select used for Radio Control */ + adi_adrv904x_GpIntPinMaskCfg_t gpIntPostInit; /*!< Holds the setup for GP Interrupt Pin Mask Config to be applied after initialization*/ + adi_adrv904x_InitCals_t initCals; /*!< Holds the setup for Cals Initialization configuration */ +} adi_adrv904x_PostMcsInit_t; + +#endif /* _ADI_ADRV904X_TX_TYPES_H_ */ diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_version.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_version.h new file mode 100644 index 00000000000..8fce8344acd --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_version.h @@ -0,0 +1,22 @@ +/** +* Copyright 2015 - 2020 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file adi_adrv904x_version.h + * \brief Contains the version number for the ADRV904X API + * + * ADRV904X API version: 2.10.0.4 + */ + +#ifndef _ADI_ADRV904X_VERSION_H_ +#define _ADI_ADRV904X_VERSION_H_ + +#define ADI_ADRV904X_CURRENT_MAJOR_VERSION 2 +#define ADI_ADRV904X_CURRENT_MINOR_VERSION 10 +#define ADI_ADRV904X_CURRENT_MAINTENANCE_VERSION 0 +#define ADI_ADRV904X_CURRENT_BUILD_VERSION 4 + +#endif diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_version_types.h b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_version_types.h new file mode 100644 index 00000000000..63569a9fda9 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/include/adi_adrv904x_version_types.h @@ -0,0 +1,30 @@ +/** + * \file adi_adrv904x_version_types.h + * + * \brief Contains ADRV904X Version data structures. + * + * ADRV904X API Version: 2.10.0.4 + */ + +/** + * Disclaimer Legal Disclaimer + * Copyright 2019 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information + * see the "LICENSE.PDF" file in this zip file. + */ + +#ifndef __ADI_ADRV904X_VERSION_TYPES_H__ +#define __ADI_ADRV904X_VERSION_TYPES_H__ + +typedef struct adi_adrv904x_Version +{ + uint32_t majorVer; /*!< API Major Version number */ + uint32_t minorVer; /*!< API Minor Version number */ + uint32_t maintenanceVer; /*!< API Maintenance number */ + uint32_t buildVer; /*!< API Build Version number */ +} adi_adrv904x_Version_t; + +typedef adi_adrv904x_Version_t adrv904x_Version_t; + +#endif /* __ADI_ADRV904X_VERSION_TYPES_H__ */ + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_agc.c b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_agc.c new file mode 100644 index 00000000000..44ab4ba6f9a --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_agc.c @@ -0,0 +1,2624 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_agc.c +* \brief Contains AGC features related function implementation defined in +* adi_adrv904x_agc.h +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#include "adi_adrv904x_agc.h" +#include "adi_adrv904x_rx.h" + +#include "../../private/bf/adrv904x_bf_rx_funcs_types.h" +#include "../../private/bf/adrv904x_bf_rx_funcs.h" +#include "../../private/bf/adrv904x_bf_rx_ddc_types.h" +#include "../../private/bf/adrv904x_bf_rx_ddc.h" +#include "../../private/bf/adrv904x_bf_rx_dig_types.h" +#include "../../private/bf/adrv904x_bf_rx_dig.h" +#include "../../private/bf/adrv904x_bf_tdr_dpath_top.h" +#include "../../private/include/adrv904x_reg_addr_macros.h" +#include "../../private/include/adrv904x_agc.h" +#include "../../private/include/adrv904x_rx.h" +#include "../../private/include/adrv904x_gpio.h" + + +#define ADI_FILE ADI_ADRV904X_FILE_PUBLIC_AGC + +static const adrv904x_BfRxFuncsChanAddr_e rxChanIdToRxFuncsChanAddr[] = +{ + ADRV904X_BF_SLICE_RX_0__RX_FUNCS, + ADRV904X_BF_SLICE_RX_1__RX_FUNCS, + ADRV904X_BF_SLICE_RX_2__RX_FUNCS, + ADRV904X_BF_SLICE_RX_3__RX_FUNCS, + ADRV904X_BF_SLICE_RX_4__RX_FUNCS, + ADRV904X_BF_SLICE_RX_5__RX_FUNCS, + ADRV904X_BF_SLICE_RX_6__RX_FUNCS, + ADRV904X_BF_SLICE_RX_7__RX_FUNCS +}; + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcGainIndexRangeSet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_AgcGainRange_t agcGainRange[], + const uint32_t numOfAgcRangeCfgs) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t cfgIdx = 0U; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + adrv904x_BfRxFuncsChanAddr_e rxFuncsBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_FUNCS; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, agcGainRange, cleanup); + + if (numOfAgcRangeCfgs == 0U) + { + /* no valid configs */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numOfAgcRangeCfgs, "Invalid Number of AGC Range Configurations"); + goto cleanup; + } + + /* Loop through the number of configurations and perform range checks */ + for (cfgIdx = 0U; cfgIdx < numOfAgcRangeCfgs; ++cfgIdx) + { + recoveryAction = adrv904x_AgcGainRangeCfgRangeCheck(device, &agcGainRange[cfgIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "AGC Min/Max Gain set Range Check Error Reported"); + goto cleanup; + } + } + + /* Write out the configurations */ + for (cfgIdx = 0U; cfgIdx < numOfAgcRangeCfgs; ++cfgIdx) + { + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_RX_ONLY; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(agcGainRange[cfgIdx].rxChannelMask, chanSel)) + { + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(chanSel), &rxFuncsBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid Rx Channel used to determine rx func address"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcMaximumGainIndex_BfSet(device, NULL, rxFuncsBaseAddr, agcGainRange[cfgIdx].maxGainIndex); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing AGC max gain index"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcMinimumGainIndex_BfSet(device, NULL, rxFuncsBaseAddr, agcGainRange[cfgIdx].minGainIndex); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing AGC min gain index"); + goto cleanup; + } + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcGainIndexRangeGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_AgcGainRange_t * const agcGainConfigReadback) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxFuncsChanAddr_e rxFuncsBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_FUNCS; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, agcGainConfigReadback, cleanup); + + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7)) + { + /* Invalid Rx channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Invalid Rx channel selection"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet(device, rxChannel, &rxFuncsBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid Rx Channel used to determine rx func address"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcMaximumGainIndex_BfGet(device, NULL, rxFuncsBaseAddr, &agcGainConfigReadback->maxGainIndex); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading AGC max gain index"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcMinimumGainIndex_BfGet(device, NULL, rxFuncsBaseAddr, &agcGainConfigReadback->minGainIndex); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading AGC min gain index"); + goto cleanup; + } + + agcGainConfigReadback->rxChannelMask = (uint32_t)rxChannel; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcCfgSet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_AgcCfg_t agcConfig[], + const uint32_t numOfAgcCfgs) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t cfgIdx = 0U; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + adrv904x_BfRxFuncsChanAddr_e rxFuncsBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_FUNCS; + adrv904x_BfRxChanAddr_e rxDigBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_DIG; + adrv904x_BfTdrDpathTopChanAddr_e rxAnalogChannelIBitfieldAddr = ADRV904X_BF_SLICE_RX_0__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_; + adrv904x_BfTdrDpathTopChanAddr_e rxAnalogChannelQBitfieldAddr = ADRV904X_BF_SLICE_RX_0__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_; + adi_adrv904x_AgcGainRange_t agcGainRange; + uint8_t rxRefClkCycles = 0U; + uint8_t hb2OutClkDividerVal = 0U; + uint8_t bfValue = 0U; + adi_adrv904x_RxDecimatedPowerCfg_t rxDecPowerCfg; + uint16_t preHb2Threshold = 0U; + static const uint8_t ADC_OVLD_PEAK_COUNT_SPACING = 1U; + static const uint8_t ADC_OVLD_PEAK_COUNT_THRESHOLD = 4U; + static const uint32_t ADC_OVLD_PEAK_COUNT_EXPIRATION = 10U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, agcConfig, cleanup); + + ADI_LIBRARY_MEMSET(&agcGainRange, 0, sizeof(adi_adrv904x_AgcGainRange_t)); + ADI_LIBRARY_MEMSET(&rxDecPowerCfg, 0, sizeof(adi_adrv904x_RxDecimatedPowerCfg_t)); + + if (numOfAgcCfgs == 0U) + { + /* no valid configs */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numOfAgcCfgs, "Invalid Number of AGC Configurations"); + goto cleanup; + } + + /* Loop through the number of configurations and perform range checks */ + for (cfgIdx = 0U; cfgIdx < numOfAgcCfgs; ++cfgIdx) + { + recoveryAction = adrv904x_AgcCfgRangeCheck(device, &agcConfig[cfgIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "AGC Range Check Error Reported"); + goto cleanup; + } + } + + /* Write out the configurations */ + for (cfgIdx = 0U; cfgIdx < numOfAgcCfgs; ++cfgIdx) + { + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_RX_ONLY; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(agcConfig[cfgIdx].rxChannelMask, chanSel)) + { + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(chanSel), &rxFuncsBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Rx funcs address get issue"); + goto cleanup; + } + + recoveryAction = adrv904x_RxAnalogBitfieldAddressGet(device, + (adi_adrv904x_RxChannels_e)(chanSel), + &rxAnalogChannelIBitfieldAddr, + &rxAnalogChannelQBitfieldAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Rx analog address get issue"); + goto cleanup; + } + + recoveryAction = adrv904x_RxBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(chanSel), &rxDigBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Rx digital address get issue"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDig_ReferenceClockCycles_BfGet(device, NULL, rxDigBaseAddr, &rxRefClkCycles); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Error while reading reference clock cycles"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcDelayCounterBaseRate_BfSet(device, NULL, rxFuncsBaseAddr, rxRefClkCycles); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing agc delay counter base rate"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcPeakWaitTime_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeakWaitTime); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing agc peak wait delay"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcOvrgResetpdHighCount_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeakWaitTime); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing agc reset pd high count"); + goto cleanup; + } + + agcGainRange.maxGainIndex = agcConfig[cfgIdx].agcRxMaxGainIndex; + agcGainRange.minGainIndex = agcConfig[cfgIdx].agcRxMinGainIndex; + agcGainRange.rxChannelMask = chanSel; + + recoveryAction = adi_adrv904x_AgcGainIndexRangeSet(device, &agcGainRange, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting agc max/min gain"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcGainUpdateCounter_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcGainUpdateCounter); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing agc gain update counter"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcAttackDelay_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcRxAttackDelay); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing agc attack delay"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcEnableFastRecoveryLoop_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcEnableFastRecoveryLoop); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing fast recovery enable bit"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcLowThsPreventGainInc_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcLowThreshPreventGainInc); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing prevent gain inc when crossing low threshold bit"); + goto cleanup; + } + + /* Bit0 of agcChangeGainIfThreshHigh is used for ADC overload */ + bfValue = agcConfig[cfgIdx].agcChangeGainIfThreshHigh & 0x01U; + recoveryAction = adrv904x_RxFuncs_AgcChangeGainIfUlbthHigh_BfSet(device, NULL, rxFuncsBaseAddr, bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing immediate gain change enable bit for ADC overload"); + goto cleanup; + } + + /* Bit1 of agcChangeGainIfThreshHigh is used for HB2 peak detector */ + bfValue = (agcConfig[cfgIdx].agcChangeGainIfThreshHigh >> 1U) & 0x01U; + recoveryAction = adrv904x_RxFuncs_AgcChangeGainIfAdcovrgHigh_BfSet(device, NULL, rxFuncsBaseAddr, bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing immediate gain change enable bit for Hb2 overload"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcPeakThresholdGainControlMode_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeakThreshGainControlMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing peak threshold gain control mode"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcResetOnRxon_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcResetOnRxon); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing reset on rx on bit"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcSlowLoopSettlingDelay_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcSlowLoopSettlingDelay); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing slow loop settling delay field"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcAdcResetGainStep_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcAdcResetGainStep); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing agc reset gain step field"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcUrangeInterval0_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeak.hb2UnderRangeLowInterval); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing hb2 urange low interval"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcUrangeInterval1Mult_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeak.hb2UnderRangeMidInterval); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing hb2 urange mid interval"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcUrangeInterval2Mult_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeak.hb2UnderRangeHighInterval); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing hb2 urange high interval"); + goto cleanup; + } + + recoveryAction = adrv904x_TdrDpathTop_FlashThresh_BfSet(device, + NULL, + rxAnalogChannelIBitfieldAddr, + agcConfig[cfgIdx].agcPeak.adcOvldLowThresh); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting ADC overload low threshold for I channel"); + goto cleanup; + } + + recoveryAction = adrv904x_TdrDpathTop_FlashThresh_BfSet(device, + NULL, + rxAnalogChannelQBitfieldAddr, + agcConfig[cfgIdx].agcPeak.adcOvldLowThresh); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting ADC overload low threshold for Q channel"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcUlbThresholdExceededCounter_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeak.adcOvldUpperThreshPeakExceededCnt); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing ADC overload high threshold counter"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcLlbThresholdExceededCounter_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeak.adcOvldLowerThreshPeakExceededCnt); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing ADC overload low threshold counter"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcUlbGainStep_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeak.adcOvldGainStepAttack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing ADC overload high gain step"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcLlbGainStep_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeak.adcOvldGainStepRecovery); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing ADC overload low gain step"); + goto cleanup; + } + + if (agcConfig[cfgIdx].agcPeak.enableHb2Overload == 1U) + { + + recoveryAction = adrv904x_RxDig_Hb2OutClkDivideRatio_BfGet(device, NULL, rxDigBaseAddr, &hb2OutClkDividerVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Error while reading hb2 out clock divider value"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDig_PeakDetectClkDivideRatio_BfSet(device, NULL, rxDigBaseAddr, hb2OutClkDividerVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Error while setting peak detector clock divider value"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDig_PeakDetectClkEnable_BfSet(device, NULL, rxDigBaseAddr, ADI_ENABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Error while enabling peak detector clock"); + goto cleanup; + } + } + + recoveryAction = adrv904x_RxHb2OverloadCfgSet(device, + (adi_adrv904x_RxChannels_e)(chanSel), + agcConfig[cfgIdx].agcPeak.enableHb2Overload, + agcConfig[cfgIdx].agcPeak.hb2OverloadSignalSelection, + agcConfig[cfgIdx].agcPeak.hb2OverloadPowerMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing HB2 config"); + goto cleanup; + } + + /* Set prethreshold to the half of lowest underrange threshold */ + if (agcConfig[cfgIdx].agcEnableFastRecoveryLoop == 0U) + { + preHb2Threshold = agcConfig[cfgIdx].agcPeak.hb2UnderRangeHighThresh >> 1U; + } + else + { + preHb2Threshold = agcConfig[cfgIdx].agcPeak.hb2UnderRangeLowThresh >> 1U; + } + + recoveryAction = adrv904x_RxFuncs_OverloadThAgcPre_BfSet(device, NULL, rxFuncsBaseAddr, preHb2Threshold); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting prethreshold for Hb2"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_PeakWindowSizeAgc_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeak.hb2OverloadDurationCnt); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing HB2 second stage peak window"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_PeakSampleCountAgc_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeak.hb2OverloadThreshCnt); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing HB2 second stage peak threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_OverloadThAgcHigh_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeak.hb2HighThresh); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing HB2 high threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_OverloadThAgcInt0Low_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeak.hb2UnderRangeLowThresh); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing HB2 underrange low threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_OverloadThAgcInt1Low_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeak.hb2UnderRangeMidThresh); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing HB2 underrange mid threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_OverloadThAgcLow_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeak.hb2UnderRangeHighThresh); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing HB2 underrange high threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcAdcHighOvrgExceededCounter_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeak.hb2UpperThreshPeakExceededCnt); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing HB2 high threshold counter"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcAdcLowOvrgExceededCounter_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeak.hb2UnderRangeHighThreshExceededCnt); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing HB2 underrange high threshold counter"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcOvrgLowGainStep_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeak.hb2GainStepHighRecovery); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing HB2 underrange high threshold gain step"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcOvrgLowInt0GainStep_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeak.hb2GainStepLowRecovery); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing HB2 underrange low threshold gain step"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcOvrgLowInt1GainStep_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeak.hb2GainStepMidRecovery); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing HB2 underrange mid threshold gain step"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcOvrgHighGainStep_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeak.hb2GainStepAttack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing HB2 high threshold gain step"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcAdcovrgLowInt1Counter_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeak.hb2UnderRangeMidThreshExceededCnt); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing HB2 underrange mid threshold counter"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcAdcovrgLowInt0Counter_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPeak.hb2UnderRangeLowThreshExceededCnt); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing HB2 underrange low threshold counter"); + goto cleanup; + } + + if (agcConfig[cfgIdx].agcPower.powerEnableMeasurement == 1U) + { + rxDecPowerCfg.decPowerControl = ADI_ADRV904X_DEC_POWER_AGC_MEAS; + rxDecPowerCfg.measBlockSelectMask = ADI_ADRV904X_DEC_POWER_MAIN_PATH_MEAS_BLOCK; + rxDecPowerCfg.powerInputSelect = agcConfig[cfgIdx].agcPower.powerInputSelect; + rxDecPowerCfg.powerMeasurementDuration = agcConfig[cfgIdx].agcPower.powerMeasurementDuration; + rxDecPowerCfg.rxChannelMask = chanSel; + + recoveryAction = adi_adrv904x_RxDecimatedPowerCfgSet(device, &rxDecPowerCfg, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing decimated power configuration"); + goto cleanup; + } + } + else + { + recoveryAction = adi_adrv904x_RxDecimatedPowerCfgGet(device, + (adi_adrv904x_RxChannels_e)(chanSel), + ADI_ADRV904X_DEC_POWER_MAIN_PATH_MEAS_BLOCK, + &rxDecPowerCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading Rx decimated power configuration"); + goto cleanup; + } + + if (rxDecPowerCfg.decPowerControl == ADI_ADRV904X_DEC_POWER_AGC_MEAS) + { + /* Main path measurement block is being used for AGC - we should disable it */ + rxDecPowerCfg.decPowerControl = ADI_ADRV904X_DEC_POWER_MEAS_OFF; + rxDecPowerCfg.measBlockSelectMask = ADI_ADRV904X_DEC_POWER_MAIN_PATH_MEAS_BLOCK; + rxDecPowerCfg.powerInputSelect = 0; + rxDecPowerCfg.powerMeasurementDuration = 0; + rxDecPowerCfg.rxChannelMask = chanSel; + + recoveryAction = adi_adrv904x_RxDecimatedPowerCfgSet(device, &rxDecPowerCfg, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing Rx decimated power configuration"); + goto cleanup; + } + } + } + + recoveryAction = adrv904x_RxFuncs_AgcLower0Threshold_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPower.underRangeHighPowerThresh); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing dec power underrange high threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcLower1Threshold_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPower.underRangeLowPowerThresh); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing dec power underrange low threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcLower0ThresholdExceededGainStep_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPower.underRangeHighPowerGainStepRecovery); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing dec power underrange high threshold gain step"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcLower1ThresholdExceededGainStep_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPower.underRangeLowPowerGainStepRecovery); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing dec power underrange low threshold gain step"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcLockLevel_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPower.overRangeLowPowerThresh); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing dec power overrange low threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcUpper1Threshold_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPower.overRangeHighPowerThresh); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing dec power overrange high threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcUpper1ThresholdExceededGainStep_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPower.overRangeHighPowerGainStepAttack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing dec power overrange high threshold gain step"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcUpper0ThresholdExceededGainStep_BfSet(device, NULL, rxFuncsBaseAddr, agcConfig[cfgIdx].agcPower.overRangeLowPowerGainStepAttack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing dec power overrange low threshold gain step"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_PeakCountSpacingAgcHigh_BfSet(device, NULL, rxFuncsBaseAddr, ADC_OVLD_PEAK_COUNT_SPACING); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing peak count spacing for ADC ovld high"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_PeakCountSpacingAgcLow_BfSet(device, NULL, rxFuncsBaseAddr, ADC_OVLD_PEAK_COUNT_SPACING); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing peak count spacing for ADC ovld low"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_PeakCountThresholdAgcHigh_BfSet(device, NULL, rxFuncsBaseAddr, ADC_OVLD_PEAK_COUNT_THRESHOLD); + if(recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing peak count threshold for ADC ovld high"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_PeakCountThresholdAgcLow_BfSet(device, NULL, rxFuncsBaseAddr, ADC_OVLD_PEAK_COUNT_THRESHOLD); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing peak count threshold for ADC ovld low"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_PeakCountExpirationAgc_BfSet(device, NULL, rxFuncsBaseAddr, ADC_OVLD_PEAK_COUNT_EXPIRATION); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing peak count expiration for ADC ovld"); + goto cleanup; + } + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcCfgGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_AgcCfg_t * const agcConfigReadBack) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxFuncsChanAddr_e rxFuncsBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_FUNCS; + adrv904x_BfTdrDpathTopChanAddr_e rxAnalogChannelIBitfieldAddr = ADRV904X_BF_SLICE_RX_0__ADC32_ANALOG_REGS_TDR_DPATH_TOP_0_; + adrv904x_BfTdrDpathTopChanAddr_e rxAnalogChannelQBitfieldAddr = ADRV904X_BF_SLICE_RX_0__ADC32_ANALOG_REGS_TDR_DPATH_TOP_1_; + adi_adrv904x_AgcGainRange_t agcGainRange; + uint8_t bfValue = 0U; + adi_adrv904x_RxDecimatedPowerCfg_t rxDecPowerCfg; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, agcConfigReadBack, cleanup); + + ADI_LIBRARY_MEMSET(&agcGainRange, 0, sizeof(adi_adrv904x_AgcGainRange_t)); + ADI_LIBRARY_MEMSET(&rxDecPowerCfg, 0, sizeof(adi_adrv904x_RxDecimatedPowerCfg_t)); + + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7)) + { + /* Invalid Rx channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Invalid Rx channel selection"); + goto cleanup; + } + + /* Read back Rx func bitfield address for selected channel */ + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet(device, rxChannel, &rxFuncsBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Rx funcs address get issue"); + goto cleanup; + } + + /* Read back Rx analog bitfield address for selected channel */ + recoveryAction = adrv904x_RxAnalogBitfieldAddressGet(device, + rxChannel, + &rxAnalogChannelIBitfieldAddr, + &rxAnalogChannelQBitfieldAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Rx analog address get issue"); + goto cleanup; + } + + agcConfigReadBack->rxChannelMask = (uint32_t)rxChannel; + + recoveryAction = adrv904x_RxFuncs_AgcPeakWaitTime_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPeakWaitTime); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading agc peak wait delay"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_AgcGainIndexRangeGet(device, rxChannel, &agcGainRange); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading agc max/min gain"); + goto cleanup; + } + + agcConfigReadBack->agcRxMinGainIndex = agcGainRange.minGainIndex; + agcConfigReadBack->agcRxMaxGainIndex = agcGainRange.maxGainIndex; + + recoveryAction = adrv904x_RxFuncs_AgcGainUpdateCounter_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcGainUpdateCounter); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading agc gain update counter"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcAttackDelay_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcRxAttackDelay); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading agc attack delay"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcEnableFastRecoveryLoop_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcEnableFastRecoveryLoop); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading fast recovery enable bit"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcLowThsPreventGainInc_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcLowThreshPreventGainInc); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading prevent gain inc when crossing low threshold bit"); + goto cleanup; + } + + /* Bit0 of agcChangeGainIfThreshHigh is used for ADC overload */ + bfValue = 0U; + agcConfigReadBack->agcChangeGainIfThreshHigh = 0U; + recoveryAction = adrv904x_RxFuncs_AgcChangeGainIfUlbthHigh_BfGet(device, NULL, rxFuncsBaseAddr, &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading immediate gain change enable bit for ADC overload"); + goto cleanup; + } + agcConfigReadBack->agcChangeGainIfThreshHigh |= (bfValue & 0x01U); + + /* Bit1 of agcChangeGainIfThreshHigh is used for HB2 peak detector */ + recoveryAction = adrv904x_RxFuncs_AgcChangeGainIfAdcovrgHigh_BfGet(device, NULL, rxFuncsBaseAddr, &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading immediate gain change enable bit for Hb2 overload"); + goto cleanup; + } + agcConfigReadBack->agcChangeGainIfThreshHigh |= ((bfValue & 0x01U) << 1U); + + recoveryAction = adrv904x_RxFuncs_AgcPeakThresholdGainControlMode_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPeakThreshGainControlMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading peak threshold gain control mode"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcResetOnRxon_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcResetOnRxon); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading reset on rx on bit"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcSlowLoopSettlingDelay_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcSlowLoopSettlingDelay); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading slow loop settling delay field"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcAdcResetGainStep_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcAdcResetGainStep); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading agc reset gain step field"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcUrangeInterval0_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPeak.hb2UnderRangeLowInterval); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading hb2 urange low interval"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcUrangeInterval1Mult_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPeak.hb2UnderRangeMidInterval); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading hb2 urange mid interval"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcUrangeInterval2Mult_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPeak.hb2UnderRangeHighInterval); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading hb2 urange high interval"); + goto cleanup; + } + + recoveryAction = adrv904x_TdrDpathTop_FlashThresh_BfGet(device, + NULL, + rxAnalogChannelIBitfieldAddr, + &agcConfigReadBack->agcPeak.adcOvldLowThresh); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading ADC overload low threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcUlbThresholdExceededCounter_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPeak.adcOvldUpperThreshPeakExceededCnt); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading ADC overload high threshold counter"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcLlbThresholdExceededCounter_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPeak.adcOvldLowerThreshPeakExceededCnt); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading ADC overload low threshold counter"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcUlbGainStep_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPeak.adcOvldGainStepAttack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading ADC overload high gain step"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcLlbGainStep_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPeak.adcOvldGainStepRecovery); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading ADC overload low gain step"); + goto cleanup; + } + + recoveryAction = adrv904x_RxHb2OverloadCfgGet(device, + rxChannel, + &agcConfigReadBack->agcPeak.enableHb2Overload, + &agcConfigReadBack->agcPeak.hb2OverloadSignalSelection, + &agcConfigReadBack->agcPeak.hb2OverloadPowerMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading HB2 config"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_PeakWindowSizeAgc_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPeak.hb2OverloadDurationCnt); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading HB2 second stage peak window"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_PeakSampleCountAgc_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPeak.hb2OverloadThreshCnt); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading HB2 second stage peak threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_OverloadThAgcHigh_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPeak.hb2HighThresh); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading writing HB2 high threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_OverloadThAgcInt0Low_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPeak.hb2UnderRangeLowThresh); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading HB2 underrange low threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_OverloadThAgcInt1Low_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPeak.hb2UnderRangeMidThresh); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading HB2 underrange mid threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_OverloadThAgcLow_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPeak.hb2UnderRangeHighThresh); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading HB2 underrange high threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcAdcHighOvrgExceededCounter_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPeak.hb2UpperThreshPeakExceededCnt); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading HB2 high threshold counter"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcAdcLowOvrgExceededCounter_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPeak.hb2UnderRangeHighThreshExceededCnt); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading HB2 underrange high threshold counter"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcOvrgLowGainStep_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPeak.hb2GainStepHighRecovery); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading HB2 underrange high threshold gain step"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcOvrgLowInt0GainStep_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPeak.hb2GainStepLowRecovery); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading HB2 underrange low threshold gain step"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcOvrgLowInt1GainStep_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPeak.hb2GainStepMidRecovery); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading HB2 underrange mid threshold gain step"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcOvrgHighGainStep_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPeak.hb2GainStepAttack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading HB2 high threshold gain step"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcAdcovrgLowInt1Counter_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPeak.hb2UnderRangeMidThreshExceededCnt); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading HB2 underrange mid threshold counter"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcAdcovrgLowInt0Counter_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPeak.hb2UnderRangeLowThreshExceededCnt); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading HB2 underrange low threshold counter"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_RxDecimatedPowerCfgGet(device, rxChannel, ADI_ADRV904X_DEC_POWER_MAIN_PATH_MEAS_BLOCK, &rxDecPowerCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading decimated power configuration"); + goto cleanup; + } + + if (rxDecPowerCfg.decPowerControl == ADI_ADRV904X_DEC_POWER_AGC_MEAS) + { + agcConfigReadBack->agcPower.powerEnableMeasurement = 1U; + } + else + { + agcConfigReadBack->agcPower.powerEnableMeasurement = 0U; + } + + agcConfigReadBack->agcPower.powerInputSelect = rxDecPowerCfg.powerInputSelect; + agcConfigReadBack->agcPower.powerMeasurementDuration = rxDecPowerCfg.powerMeasurementDuration; + + recoveryAction = adrv904x_RxFuncs_AgcLower0Threshold_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPower.underRangeHighPowerThresh); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading dec power underrange high threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcLower1Threshold_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPower.underRangeLowPowerThresh); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading dec power underrange low threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcLower0ThresholdExceededGainStep_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPower.underRangeHighPowerGainStepRecovery); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading dec power underrange high threshold gain step"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcLower1ThresholdExceededGainStep_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPower.underRangeLowPowerGainStepRecovery); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading dec power underrange low threshold gain step"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcLockLevel_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPower.overRangeLowPowerThresh); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading dec power overrange low threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcUpper1Threshold_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPower.overRangeHighPowerThresh); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading dec power overrange high threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcUpper1ThresholdExceededGainStep_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPower.overRangeHighPowerGainStepAttack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading dec power overrange high threshold gain step"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcUpper0ThresholdExceededGainStep_BfGet(device, NULL, rxFuncsBaseAddr, &agcConfigReadBack->agcPower.overRangeLowPowerGainStepAttack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading dec power overrange low threshold gain step"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcFreezeSet(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const uint32_t freezeEnable) + { + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + if ((rxChannelMask > (uint32_t) ADI_ADRV904X_RX_MASK_ALL) || (rxChannelMask == (uint32_t) ADI_ADRV904X_RXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChannelMask, + "Invalid Rx channel is selected. Valid values are any combinations of Rx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_RX_ONLY; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(rxChannelMask, chanSel) == 0) + { + /* Do nothing to this channel. */ + continue; + } + + recoveryAction = adrv904x_RxFuncs_AgcSlowloopFreezeEnable_BfSet(device, + NULL, + rxChanIdToRxFuncsChanAddr[chanIdx], + ADRV904X_BF_EQUAL(freezeEnable, chanSel) ? 1U : 0U); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error setting slow loop freeze enable bitfield"); + goto cleanup; + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); + + } + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcFreezeGet(adi_adrv904x_Device_t* const device, + uint32_t* const freezeEnable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t chanIdx = 0U; + uint8_t bfVal = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, freezeEnable, cleanup); + *freezeEnable = 0U; + + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_RX_ONLY; ++chanIdx) + { + recoveryAction = adrv904x_RxFuncs_AgcSlowloopFreezeEnable_BfGet(device, NULL, rxChanIdToRxFuncsChanAddr[chanIdx], &bfVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error setting bitfield"); + goto cleanup; + } + + *freezeEnable |= (bfVal << chanIdx); + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); + +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcFreezeOnGpioSet(adi_adrv904x_Device_t* const device, + const uint32_t rxChannels, + const adi_adrv904x_GpioPinSel_e gpioPin, + const uint8_t enable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_GpioPinSel_e gpioPinToSet = gpioPin; + adi_adrv904x_Channels_e rxChan = ADI_ADRV904X_CH0; + uint8_t i = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + if ((rxChannels > (uint32_t) ADI_ADRV904X_RX_MASK_ALL) || (rxChannels == (uint32_t) ADI_ADRV904X_RXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChannels, + "Invalid Rx channel is selected. Valid values are any combinations of Rx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + if (enable != ADI_ENABLE && enable != ADI_DISABLE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + enable, + "Enable must be ADI_ENABLE or ADI_DISABLE"); + goto cleanup; + } + + if (enable == ADI_ENABLE) + { + if ((gpioPinToSet < ADI_ADRV904X_GPIO_01) || (gpioPinToSet >= ADI_ADRV904X_GPIO_INVALID)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + gpioPinToSet, + "Invalid GPIO pin. Note ADI_ADRV904X_GPIO_00 cannot be used to control AGC loop"); + goto cleanup; + } + + recoveryAction = adrv904x_GpioSignalSet(device, + gpioPinToSet, + ADI_ADRV904X_GPIO_SIGNAL_AGC_SLOWLOOP_FREEZE_ENABLE, + rxChannels); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Call to adrv904x_GpioSignalSet failed for AGC freeze GPIO"); + goto cleanup; + } + } + else if (enable == ADI_DISABLE) + { + /* To disable Freeze-on-GPIO we need to query for the currently configured GPIO on a channel by channel basis */ + for (i = 0; i < ADI_ADRV904X_MAX_CHANNELS; i++) + { + rxChan = (adi_adrv904x_Channels_e) (1 << i); + if ((rxChan & rxChannels) == 0) + { + /* Channel not in rxChannels. Skip it. */ + continue; + } + + /* Find the currently configured GPIO for AGC-freeze this rxChan */ + recoveryAction = adrv904x_GpioSignalFind(device, + &gpioPinToSet, + ADI_ADRV904X_GPIO_SIGNAL_AGC_SLOWLOOP_FREEZE_ENABLE, + rxChan); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Failed to find GPIO_SIGNAL_AGC_SLOWLOOP_FREEZE_ENABLE for Rx channel"); + goto cleanup; + } + + if (gpioPinToSet == ADI_ADRV904X_GPIO_INVALID) + { + /* Channel already has AGC-freeze-on-GPIO disabled. Skip it. */ + continue; + } + + recoveryAction = adrv904x_GpioSignalRelease(device, + gpioPinToSet, + ADI_ADRV904X_GPIO_SIGNAL_AGC_SLOWLOOP_FREEZE_ENABLE, + rxChannels); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Failed to release GPIO_SIGNAL_AGC_SLOWLOOP_FREEZE_ENABLE signal"); + goto cleanup; + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcFreezeOnGpioGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_GpioPinSel_e* const gpioPin) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gpioPin, cleanup); + *gpioPin = ADI_ADRV904X_GPIO_INVALID; + + if ((rxChannel != (uint32_t)ADI_ADRV904X_RX0) && + (rxChannel != (uint32_t)ADI_ADRV904X_RX1) && + (rxChannel != (uint32_t)ADI_ADRV904X_RX2) && + (rxChannel != (uint32_t)ADI_ADRV904X_RX3) && + (rxChannel != (uint32_t)ADI_ADRV904X_RX4) && + (rxChannel != (uint32_t)ADI_ADRV904X_RX5) && + (rxChannel != (uint32_t)ADI_ADRV904X_RX6) && + (rxChannel != (uint32_t)ADI_ADRV904X_RX7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChannel, + "Invalid Rx channel is selected. Valid values are Rx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + recoveryAction = adrv904x_GpioSignalFind(device, + gpioPin, + ADI_ADRV904X_GPIO_SIGNAL_AGC_SLOWLOOP_FREEZE_ENABLE, + (adi_adrv904x_Channels_e) rxChannel); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + *gpioPin = ADI_ADRV904X_GPIO_INVALID; + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Failed to find GPIO for AGC_SLOWLOOP_FREEZE_ENABLE for Rx channel"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcReset(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + adrv904x_BfRxFuncsChanAddr_e rxFuncsBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_FUNCS; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + if (((rxChannelMask & (~(uint32_t)ADI_ADRV904X_RX_MASK_ALL)) != 0U) || (rxChannelMask == (uint32_t)ADI_ADRV904X_RXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChannelMask, + "Invalid Rx channel is selected. Valid values are any combinations of Rx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_RX_ONLY; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(rxChannelMask, chanSel)) + { + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(chanSel), &rxFuncsBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid Rx Channel used to determine rx func address"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcResetCounters_BfSet(device, NULL, rxFuncsBaseAddr, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting AGC reset counters bit"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcResetCounters_BfSet(device, NULL, rxFuncsBaseAddr, 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while clearing AGC reset counters bit"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcSoftReset_BfSet(device, NULL, rxFuncsBaseAddr, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting AGC soft reset bit"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcSoftReset_BfSet(device, NULL, rxFuncsBaseAddr, 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while clearing AGC soft reset bit"); + goto cleanup; + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxDualBandLnaGainTableWrite(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const uint8_t gainIndexOffset, + const adi_adrv904x_RxDualBandLnaGainTableRow_t gainTableRow[], + const uint32_t arraySize) +{ + static const uint8_t MAX_GAIN_INDEX_OFFSET = 3U; + static const uint8_t MAX_ARRAY_SIZE = 4U; + static const uint32_t NUM_BYTES_PER_GAIN_ROW = 8U; + static const uint32_t WRITE_MASK = 0x0FF00000U; /* Bit 27:20 needs to be written */ + static const uint32_t WRITE_SHIFT = 20U; /* Bit 27:20 needs to be written */ + static const uint8_t MAX_GAIN_CONTROL_WORD = 3U; + static const uint8_t MAX_GAIN_COMPENSATION_VALUE = 63U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + uint8_t baseIndex = 0U; + uint8_t i = 0U; + uint8_t rowCounter = 0U; + uint32_t dualBandRowValue = 0U; + uint32_t addressToWrite = 0U; + uint32_t registerReadVal = 0U; + uint32_t registerWriteVal = 0U; + + const uint32_t rxGainTableBaseAddr[] = + { + ADI_ADRV904X_RX0_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX1_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX2_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX3_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX4_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX5_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX6_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX7_GAIN_TABLE_BASEADDR + }; + + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gainTableRow, cleanup); + + if (((rxChannelMask & (~(uint32_t)ADI_ADRV904X_RX_MASK_ALL)) != 0U) || (rxChannelMask == (uint32_t)ADI_ADRV904X_RXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChannelMask, + "Invalid Rx channel is selected. Valid values are any combinations of Rx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + if (gainIndexOffset > MAX_GAIN_INDEX_OFFSET) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + gainIndexOffset, + "Gain index offset cannot be bigger than 3"); + goto cleanup; + } + + if (arraySize > MAX_ARRAY_SIZE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + arraySize, + "Array size cannot be bigger than 4"); + goto cleanup; + } + + if (arraySize > (gainIndexOffset + 1U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + arraySize, + "Array size cannot be bigger than offset + 1"); + goto cleanup; + } + + baseIndex = (gainIndexOffset - (arraySize - 1U)); + rowCounter = 0U; + + for (i = baseIndex; i <= gainIndexOffset; ++i) + { + if (gainTableRow[rowCounter].externalControlWord > MAX_GAIN_CONTROL_WORD) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + gainTableRow[rowCounter].externalControlWord, + "Gain ctrl word cannot be greater than 3"); + goto cleanup; + } + + if (gainTableRow[rowCounter].gainCompensation > MAX_GAIN_COMPENSATION_VALUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + gainTableRow[rowCounter].gainCompensation, + "Gain compensation value cannot be greater than 63"); + goto cleanup; + } + + dualBandRowValue = ((uint32_t)gainTableRow[rowCounter].externalControlWord & 0x03U) | (((uint32_t)gainTableRow[rowCounter].gainCompensation & 0x3FU) << 0x02U); + dualBandRowValue <<= WRITE_SHIFT; + + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_RX_ONLY; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(rxChannelMask, chanSel)) + { + /* Perform a manual read modify write, since this register map is 32b only */ + addressToWrite = rxGainTableBaseAddr[chanIdx] + ((uint32_t)i * NUM_BYTES_PER_GAIN_ROW); + recoveryAction = adi_adrv904x_Register32Read(device, + NULL, + addressToWrite, + ®isterReadVal, + 0xFFFFFFFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Issue while reading gain row"); + goto cleanup; + } + + registerWriteVal = (registerReadVal & (~WRITE_MASK)) | dualBandRowValue; + recoveryAction = adi_adrv904x_Register32Write(device, + NULL, + addressToWrite, + registerWriteVal, + 0xFFFFFFFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Issue while writing dual band gain row"); + goto cleanup; + } + } + } + + rowCounter++; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxDualBandLnaGainTableRead(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const uint8_t gainIndexOffset, + adi_adrv904x_RxDualBandLnaGainTableRow_t gainTableRow[], + const uint32_t arraySize, + uint8_t* const numGainIndicesRead) +{ + static const uint8_t MAX_GAIN_INDEX_OFFSET = 3U; + static const uint8_t MAX_ARRAY_SIZE = 4U; + static const uint32_t NUM_BYTES_PER_GAIN_ROW = 8U; + static const uint32_t READ_MASK = 0x0FF00000U; /* Bit 27:20 needs to be read */ + static const uint32_t READ_SHIFT = 20U; /* Bit 27:20 needs to be read */ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t chanIdx = 0U; + uint8_t baseIndex = 0U; + uint8_t i = 0U; + uint8_t rowCounter = 0U; + uint32_t dualBandRowValue = 0U; + uint32_t addressToRead = 0U; + const uint32_t rxGainTableBaseAddr[] = + { + ADI_ADRV904X_RX0_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX1_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX2_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX3_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX4_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX5_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX6_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX7_GAIN_TABLE_BASEADDR + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gainTableRow, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, numGainIndicesRead, cleanup); + + if ((rxChannelMask != (uint32_t)ADI_ADRV904X_RX0) && + (rxChannelMask != (uint32_t)ADI_ADRV904X_RX1) && + (rxChannelMask != (uint32_t)ADI_ADRV904X_RX2) && + (rxChannelMask != (uint32_t)ADI_ADRV904X_RX3) && + (rxChannelMask != (uint32_t)ADI_ADRV904X_RX4) && + (rxChannelMask != (uint32_t)ADI_ADRV904X_RX5) && + (rxChannelMask != (uint32_t)ADI_ADRV904X_RX6) && + (rxChannelMask != (uint32_t)ADI_ADRV904X_RX7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChannelMask, + "Invalid Rx channel is selected. Valid values are Rx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + if (gainIndexOffset > MAX_GAIN_INDEX_OFFSET) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + gainIndexOffset, + "Gain index offset cannot be bigger than 3"); + goto cleanup; + } + + if (arraySize > MAX_ARRAY_SIZE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + arraySize, + "Array size cannot be bigger than 4"); + goto cleanup; + } + + if (arraySize > (gainIndexOffset + 1U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + arraySize, + "Array size cannot be bigger than offset + 1"); + goto cleanup; + } + + baseIndex = (gainIndexOffset - (arraySize - 1U)); + rowCounter = 0U; + + chanIdx = adrv904x_RxChannelsToId((adi_adrv904x_RxChannels_e)rxChannelMask); + + for (i = baseIndex; i <= gainIndexOffset; ++i) + { + addressToRead = rxGainTableBaseAddr[chanIdx] + ((uint32_t)i * NUM_BYTES_PER_GAIN_ROW); + recoveryAction = adi_adrv904x_Register32Read(device, + NULL, + addressToRead, + &dualBandRowValue, + 0xFFFFFFFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Issue while reading dual band gain row"); + goto cleanup; + } + + dualBandRowValue &= READ_MASK; + dualBandRowValue >>= READ_SHIFT; + gainTableRow[rowCounter].externalControlWord = (uint8_t)(dualBandRowValue & 0x03U); + gainTableRow[rowCounter].gainCompensation = (uint8_t)((dualBandRowValue >> 0x02U) & 0x3FU); + + rowCounter++; + } + + /*Update no. of gain indices read*/ + if (numGainIndicesRead != NULL) + { + *numGainIndicesRead = rowCounter; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcDualBandCfgSet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_AgcDualBandCfg_t agcDualBandConfig[], + const uint32_t numOfAgcDualBandCfgs) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t cfgIdx = 0U; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + adrv904x_BfRxFuncsChanAddr_e rxFuncsBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_FUNCS; + adrv904x_BfRxDdcChanAddr_e rxDdcBaseAddrBand0 = ADRV904X_BF_SLICE_RX_0__RX_DDC_0_; + adrv904x_BfRxDdcChanAddr_e rxDdcBaseAddrBand1 = ADRV904X_BF_SLICE_RX_0__RX_DDC_1_; + adi_adrv904x_RxDecimatedPowerCfg_t rxDecPowerCfg; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, agcDualBandConfig, cleanup); + + ADI_LIBRARY_MEMSET(&rxDecPowerCfg, 0, sizeof(adi_adrv904x_RxDecimatedPowerCfg_t)); + + if (numOfAgcDualBandCfgs == 0U) + { + /* no valid configs */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numOfAgcDualBandCfgs, "Invalid Number of AGC Dual Band Configurations"); + goto cleanup; + } + + /* Loop through the number of configurations and perform range checks */ + for (cfgIdx = 0U; cfgIdx < numOfAgcDualBandCfgs; ++cfgIdx) + { + recoveryAction = adrv904x_AgcDualBandCfgRangeCheck(device, &agcDualBandConfig[cfgIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "AGC Dual Band Range Check Error Reported"); + goto cleanup; + } + } + + /* Write out the configurations */ + for (cfgIdx = 0U; cfgIdx < numOfAgcDualBandCfgs; ++cfgIdx) + { + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_RX_ONLY; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(agcDualBandConfig[cfgIdx].rxChannelMask, chanSel)) + { + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(chanSel), &rxFuncsBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Rx funcs address get issue"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDdcBitfieldAddressGet(device, + (adi_adrv904x_RxChannels_e)chanSel, + ADI_ADRV904X_RX_DDC_BAND0, + &rxDdcBaseAddrBand0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanSel, "Invalid Rx Channel used to determine rx ddc0 address"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDdcBitfieldAddressGet(device, + (adi_adrv904x_RxChannels_e)chanSel, + ADI_ADRV904X_RX_DDC_BAND1, + &rxDdcBaseAddrBand1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanSel, "Invalid Rx Channel used to determine rx ddc1 address"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcDualbandExtTableUpperIndex_BfSet(device, NULL, rxFuncsBaseAddr, agcDualBandConfig[cfgIdx].agcRxDualbandExtTableUpperIndex); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing dual band ext table upper index"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcDualbandExtTableLowerIndex_BfSet(device, NULL, rxFuncsBaseAddr, agcDualBandConfig[cfgIdx].agcRxDualbandExtTableLowerIndex); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing dual band ext table lower index"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcDualbandPwrMargin_BfSet(device, NULL, rxFuncsBaseAddr, agcDualBandConfig[cfgIdx].agcDualbandPwrMargin); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing dual band power margin"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcDualbandLnaStep_BfSet(device, NULL, rxFuncsBaseAddr, agcDualBandConfig[cfgIdx].agcDualbandLnaStep); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing dual band lna step"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcDualbandHighLnaThreshold_BfSet(device, NULL, rxFuncsBaseAddr, agcDualBandConfig[cfgIdx].agcDualbandHighLnaThreshold); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing dual band high lna threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcDualbandLowLnaThreshold_BfSet(device, NULL, rxFuncsBaseAddr, agcDualBandConfig[cfgIdx].agcDualbandLowLnaThreshold); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing dual band low lna threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcDualbandMaxIndex_BfSet(device, NULL, rxFuncsBaseAddr, agcDualBandConfig[cfgIdx].agcDualBandMaxGainIndex); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing dual band max gain index"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDdc_GainCompForExtGain_BfSet(device, NULL, rxDdcBaseAddrBand0, agcDualBandConfig[cfgIdx].enableGainCompensationForExtLna); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write gain compensation enable bit for ext lna"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDdc_GainCompForExtGain_BfSet(device, NULL, rxDdcBaseAddrBand1, agcDualBandConfig[cfgIdx].enableGainCompensationForExtLna); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write gain compensation enable bit for ext lna"); + goto cleanup; + } + + if (agcDualBandConfig[cfgIdx].agcDualBandEnable == 1U) + { + rxDecPowerCfg.decPowerControl = ADI_ADRV904X_DEC_POWER_AGC_MEAS; + rxDecPowerCfg.measBlockSelectMask = (uint8_t)(ADI_ADRV904X_DEC_POWER_BAND_A_MEAS_BLOCK | ADI_ADRV904X_DEC_POWER_BAND_B_MEAS_BLOCK); + rxDecPowerCfg.powerInputSelect = 0; /* This field is 'Don't Care' when configuring Band decimated power measurements */ + rxDecPowerCfg.powerMeasurementDuration = agcDualBandConfig[cfgIdx].decPowerDdcMeasurementDuration; + rxDecPowerCfg.rxChannelMask = chanSel; + + recoveryAction = adi_adrv904x_RxDecimatedPowerCfgSet(device, &rxDecPowerCfg, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing decimated power configuration"); + goto cleanup; + } + } + else + { + recoveryAction = adi_adrv904x_RxDecimatedPowerCfgGet(device, + (adi_adrv904x_RxChannels_e)(chanSel), + ADI_ADRV904X_DEC_POWER_BAND_A_MEAS_BLOCK, + &rxDecPowerCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading Rx decimated power configuration"); + goto cleanup; + } + + if (rxDecPowerCfg.decPowerControl == ADI_ADRV904X_DEC_POWER_AGC_MEAS) + { + /* Main path measurement block is being used for AGC - we should disable it */ + rxDecPowerCfg.decPowerControl = ADI_ADRV904X_DEC_POWER_MEAS_OFF; + rxDecPowerCfg.measBlockSelectMask = (uint8_t)(ADI_ADRV904X_DEC_POWER_BAND_A_MEAS_BLOCK | ADI_ADRV904X_DEC_POWER_BAND_B_MEAS_BLOCK); + rxDecPowerCfg.powerInputSelect = 0; + rxDecPowerCfg.powerMeasurementDuration = 0; + rxDecPowerCfg.rxChannelMask = chanSel; + + recoveryAction = adi_adrv904x_RxDecimatedPowerCfgSet(device, &rxDecPowerCfg, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing Rx decimated power configuration"); + goto cleanup; + } + } + } + + recoveryAction = adrv904x_RxFuncs_AgcDualbandEnable_BfSet(device, NULL, rxFuncsBaseAddr, agcDualBandConfig[cfgIdx].agcDualBandEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing dual band enable bit"); + goto cleanup; + } + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcDualBandCfgGet(adi_adrv904x_Device_t * const device, + adi_adrv904x_AgcDualBandCfg_t * const agcDualBandConfigReadBack) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxFuncsChanAddr_e rxFuncsBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_FUNCS; + adrv904x_BfRxDdcChanAddr_e rxDdcBaseAddrBand0 = ADRV904X_BF_SLICE_RX_0__RX_DDC_0_; + adi_adrv904x_RxDecimatedPowerCfg_t rxDecPowerCfg; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, agcDualBandConfigReadBack, cleanup); + + ADI_LIBRARY_MEMSET(&rxDecPowerCfg, 0, sizeof(adi_adrv904x_RxDecimatedPowerCfg_t)); + + if ((agcDualBandConfigReadBack->rxChannelMask != ADI_ADRV904X_RX0) && + (agcDualBandConfigReadBack->rxChannelMask != ADI_ADRV904X_RX1) && + (agcDualBandConfigReadBack->rxChannelMask != ADI_ADRV904X_RX2) && + (agcDualBandConfigReadBack->rxChannelMask != ADI_ADRV904X_RX3) && + (agcDualBandConfigReadBack->rxChannelMask != ADI_ADRV904X_RX4) && + (agcDualBandConfigReadBack->rxChannelMask != ADI_ADRV904X_RX5) && + (agcDualBandConfigReadBack->rxChannelMask != ADI_ADRV904X_RX6) && + (agcDualBandConfigReadBack->rxChannelMask != ADI_ADRV904X_RX7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, agcDualBandConfigReadBack->rxChannelMask, "Invalid Rx channel is selected. Valid values are Rx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)agcDualBandConfigReadBack->rxChannelMask, &rxFuncsBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, agcDualBandConfigReadBack->rxChannelMask, "Rx funcs address get issue"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDdcBitfieldAddressGet(device, + (adi_adrv904x_RxChannels_e)agcDualBandConfigReadBack->rxChannelMask, + ADI_ADRV904X_RX_DDC_BAND0, + &rxDdcBaseAddrBand0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, agcDualBandConfigReadBack->rxChannelMask, "Invalid Rx Channel used to determine rx ddc0 address"); + goto cleanup; + } + + + recoveryAction = adrv904x_RxFuncs_AgcDualbandExtTableUpperIndex_BfGet(device, NULL, rxFuncsBaseAddr, &agcDualBandConfigReadBack->agcRxDualbandExtTableUpperIndex); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading dual band ext table upper index"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcDualbandExtTableLowerIndex_BfGet(device, NULL, rxFuncsBaseAddr, &agcDualBandConfigReadBack->agcRxDualbandExtTableLowerIndex); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading dual band ext table lower index"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcDualbandPwrMargin_BfGet(device, NULL, rxFuncsBaseAddr, &agcDualBandConfigReadBack->agcDualbandPwrMargin); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading dual band power margin"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcDualbandLnaStep_BfGet(device, NULL, rxFuncsBaseAddr, &agcDualBandConfigReadBack->agcDualbandLnaStep); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading dual band lna step"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcDualbandHighLnaThreshold_BfGet(device, NULL, rxFuncsBaseAddr, &agcDualBandConfigReadBack->agcDualbandHighLnaThreshold); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading dual band high lna threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcDualbandLowLnaThreshold_BfGet(device, NULL, rxFuncsBaseAddr, &agcDualBandConfigReadBack->agcDualbandLowLnaThreshold); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading dual band low lna threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcDualbandMaxIndex_BfGet(device, NULL, rxFuncsBaseAddr, &agcDualBandConfigReadBack->agcDualBandMaxGainIndex); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading dual band max gain index"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDdc_GainCompForExtGain_BfGet(device, NULL, rxDdcBaseAddrBand0, &agcDualBandConfigReadBack->enableGainCompensationForExtLna); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read gain compensation enable bit for ext lna"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_RxDecimatedPowerCfgGet(device, + (adi_adrv904x_RxChannels_e)(agcDualBandConfigReadBack->rxChannelMask), + ADI_ADRV904X_DEC_POWER_BAND_A_MEAS_BLOCK, + &rxDecPowerCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading Rx decimated power configuration"); + goto cleanup; + } + + agcDualBandConfigReadBack->decPowerDdcMeasurementDuration = rxDecPowerCfg.powerMeasurementDuration; + + recoveryAction = adrv904x_RxFuncs_AgcDualbandEnable_BfGet(device, NULL, rxFuncsBaseAddr, &agcDualBandConfigReadBack->agcDualBandEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading dual band enable bit"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); + +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcDualBandGpioCfgSet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_AgcDualBandGpioCfg_t * agcDualBandGpioConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t i = 0U; + uint16_t gpioSelMask = 0U; + adi_adrv904x_GpioSignal_e option1 = ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND0_0; + adi_adrv904x_GpioSignal_e option2 = ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND0_0; + adi_adrv904x_GpioAnaPinSel_e gpioAnalogSel = ADI_ADRV904X_GPIO_ANA_00; + adi_adrv904x_GpioSignal_e gpioSignalReadBack = ADI_ADRV904X_GPIO_SIGNAL_UNUSED; + uint32_t channelMaskReadBack = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, agcDualBandGpioConfig, cleanup); + + for (i = 0U; i < ADI_ADRV904X_GPIO_ANALOG_COUNT; ++i) + { + gpioSelMask = 1U << i; + if (ADRV904X_BF_EQUAL(agcDualBandGpioConfig->gpioSelectionMask, gpioSelMask)) + { + switch (i) + { + case 0: + option1 = ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND0_0; + option2 = ADI_ADRV904X_GPIO_SIGNAL_RX2_DUALBAND_CONTROL_BAND0_0; + break; + case 1: + option1 = ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND0_1; + option2 = ADI_ADRV904X_GPIO_SIGNAL_RX2_DUALBAND_CONTROL_BAND0_1; + break; + case 2: + option1 = ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND1_0; + option2 = ADI_ADRV904X_GPIO_SIGNAL_RX2_DUALBAND_CONTROL_BAND1_0; + break; + case 3: + option1 = ADI_ADRV904X_GPIO_SIGNAL_RX0_DUALBAND_CONTROL_BAND1_1; + option2 = ADI_ADRV904X_GPIO_SIGNAL_RX2_DUALBAND_CONTROL_BAND1_1; + break; + case 4: + option1 = ADI_ADRV904X_GPIO_SIGNAL_RX1_DUALBAND_CONTROL_BAND0_0; + option2 = ADI_ADRV904X_GPIO_SIGNAL_RX3_DUALBAND_CONTROL_BAND0_0; + break; + case 5: + option1 = ADI_ADRV904X_GPIO_SIGNAL_RX1_DUALBAND_CONTROL_BAND0_1; + option2 = ADI_ADRV904X_GPIO_SIGNAL_RX3_DUALBAND_CONTROL_BAND0_1; + break; + case 6: + option1 = ADI_ADRV904X_GPIO_SIGNAL_RX1_DUALBAND_CONTROL_BAND1_0; + option2 = ADI_ADRV904X_GPIO_SIGNAL_RX3_DUALBAND_CONTROL_BAND1_0; + break; + case 7: + option1 = ADI_ADRV904X_GPIO_SIGNAL_RX1_DUALBAND_CONTROL_BAND1_1; + option2 = ADI_ADRV904X_GPIO_SIGNAL_RX3_DUALBAND_CONTROL_BAND1_1; + break; + case 8: + option1 = ADI_ADRV904X_GPIO_SIGNAL_RX4_DUALBAND_CONTROL_BAND0_0; + option2 = ADI_ADRV904X_GPIO_SIGNAL_RX6_DUALBAND_CONTROL_BAND0_0; + break; + case 9: + option1 = ADI_ADRV904X_GPIO_SIGNAL_RX4_DUALBAND_CONTROL_BAND0_1; + option2 = ADI_ADRV904X_GPIO_SIGNAL_RX6_DUALBAND_CONTROL_BAND0_1; + break; + case 10: + option1 = ADI_ADRV904X_GPIO_SIGNAL_RX4_DUALBAND_CONTROL_BAND1_0; + option2 = ADI_ADRV904X_GPIO_SIGNAL_RX6_DUALBAND_CONTROL_BAND1_0; + break; + case 11: + option1 = ADI_ADRV904X_GPIO_SIGNAL_RX4_DUALBAND_CONTROL_BAND1_1; + option2 = ADI_ADRV904X_GPIO_SIGNAL_RX6_DUALBAND_CONTROL_BAND1_1; + break; + case 12: + option1 = ADI_ADRV904X_GPIO_SIGNAL_RX5_DUALBAND_CONTROL_BAND0_0; + option2 = ADI_ADRV904X_GPIO_SIGNAL_RX7_DUALBAND_CONTROL_BAND0_0; + break; + case 13: + option1 = ADI_ADRV904X_GPIO_SIGNAL_RX5_DUALBAND_CONTROL_BAND0_1; + option2 = ADI_ADRV904X_GPIO_SIGNAL_RX7_DUALBAND_CONTROL_BAND0_1; + break; + case 14: + option1 = ADI_ADRV904X_GPIO_SIGNAL_RX5_DUALBAND_CONTROL_BAND1_0; + option2 = ADI_ADRV904X_GPIO_SIGNAL_RX7_DUALBAND_CONTROL_BAND1_0; + break; + case 15: + option1 = ADI_ADRV904X_GPIO_SIGNAL_RX5_DUALBAND_CONTROL_BAND1_1; + option2 = ADI_ADRV904X_GPIO_SIGNAL_RX7_DUALBAND_CONTROL_BAND1_1; + break; + } + + if ((agcDualBandGpioConfig->analogGpioMapping[i] != option1) && + (agcDualBandGpioConfig->analogGpioMapping[i] != option2) && + (agcDualBandGpioConfig->analogGpioMapping[i] != ADI_ADRV904X_GPIO_SIGNAL_UNUSED)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, agcDualBandGpioConfig->analogGpioMapping, "Invalid GPIO selected. Please check the GPIO table given at function documentation"); + goto cleanup; + } + + gpioAnalogSel = (adi_adrv904x_GpioAnaPinSel_e)i; + if (agcDualBandGpioConfig->analogGpioMapping[i] == ADI_ADRV904X_GPIO_SIGNAL_UNUSED) + { + recoveryAction = adrv904x_GpioAnalogSignalGet(device, gpioAnalogSel, &gpioSignalReadBack, &channelMaskReadBack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while retrieving current signal for the selected gpio"); + goto cleanup; + } + + if ((gpioSignalReadBack != option1) && + (gpioSignalReadBack != option2)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GPIO selected to release is being used by other feature"); + goto cleanup; + } + + recoveryAction = adrv904x_GpioAnalogSignalRelease(device, gpioAnalogSel, gpioSignalReadBack, channelMaskReadBack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to release gpio"); + goto cleanup; + } + } + else + { + recoveryAction = adrv904x_GpioAnalogSignalSet(device, gpioAnalogSel, agcDualBandGpioConfig->analogGpioMapping[i], (uint32_t)ADI_ADRV904X_CHOFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to assign selected signal to GPIO"); + goto cleanup; + } + } + } + } + + /* No error, set recovery action to None */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); + +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcDualBandGpioCfgGet(adi_adrv904x_Device_t * const device, + adi_adrv904x_AgcDualBandGpioCfg_t * const agcDualBandGpioConfigReadBack) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t i = 0U; + uint16_t gpioSelMask = 0U; + adi_adrv904x_GpioAnaPinSel_e gpioAnalogSel = ADI_ADRV904X_GPIO_ANA_00; + adi_adrv904x_GpioSignal_e gpioSignalReadBack = ADI_ADRV904X_GPIO_SIGNAL_UNUSED; + uint32_t channelMaskReadBack = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, agcDualBandGpioConfigReadBack, cleanup); + + for (i = 0U; i < ADI_ADRV904X_GPIO_ANALOG_COUNT; ++i) + { + gpioSelMask = 1U << i; + if (ADRV904X_BF_EQUAL(agcDualBandGpioConfigReadBack->gpioSelectionMask, gpioSelMask)) + { + gpioAnalogSel = (adi_adrv904x_GpioAnaPinSel_e)i; + recoveryAction = adrv904x_GpioAnalogSignalGet(device, gpioAnalogSel, &gpioSignalReadBack, &channelMaskReadBack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while retrieving current signal for the selected gpio"); + goto cleanup; + } + + agcDualBandGpioConfigReadBack->analogGpioMapping[i] = gpioSignalReadBack; + } + else + { + agcDualBandGpioConfigReadBack->analogGpioMapping[i] = ADI_ADRV904X_GPIO_SIGNAL_INVALID; + } + } + + /* No error, set recovery action to None */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); + +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcGpioReSyncSet(adi_adrv904x_Device_t * const device, + uint32_t rxChannelMask, + adi_adrv904x_GpioPinSel_e gpioSelection, + uint8_t enable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + adrv904x_BfRxFuncsChanAddr_e rxFuncsBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_FUNCS; + adi_adrv904x_GpioPinSel_e gpioReadback = ADI_ADRV904X_GPIO_INVALID; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + /*Check that if requested Rx Channel valid*/ + if (((rxChannelMask & (~(uint32_t)ADI_ADRV904X_RX_MASK_ALL)) != 0U) || (rxChannelMask == (uint32_t)ADI_ADRV904X_RXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChannelMask, + "Invalid Rx channel is selected. Valid values are any combinations of Rx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + if (enable > ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + enable, + "enable can be either 0 or 1"); + goto cleanup; + } + + if (gpioSelection == ADI_ADRV904X_GPIO_00) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + enable, + "GPIO0 cannot be used for this feature"); + goto cleanup; + } + + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_RX_ONLY; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(rxChannelMask, chanSel)) + { + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)chanSel, &rxFuncsBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannelMask, "Rx funcs address get issue"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcEnableSyncPulseForGainCounter_BfSet(device, NULL, rxFuncsBaseAddr, enable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing AGC re-sync enable bitfield"); + goto cleanup; + } + + if (gpioSelection == ADI_ADRV904X_GPIO_INVALID) + { + /* Release the signal from this Rx channel */ + + recoveryAction = adrv904x_GpioSignalFind(device, + &gpioReadback, + ADI_ADRV904X_GPIO_SIGNAL_AGC_GAIN_CHANGE, + (adi_adrv904x_Channels_e)(chanSel)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read gpio for selected signal"); + goto cleanup; + } + + recoveryAction = adrv904x_GpioSignalRelease(device, + gpioReadback, + ADI_ADRV904X_GPIO_SIGNAL_AGC_GAIN_CHANGE, + chanSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to release gpio"); + goto cleanup; + } + + } + else + { + /* Assign the signal for this channel */ + recoveryAction = adrv904x_GpioSignalSet(device, + gpioSelection, + ADI_ADRV904X_GPIO_SIGNAL_AGC_GAIN_CHANGE, + chanSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to assign selected signal to GPIO"); + goto cleanup; + } + + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcGpioReSyncGet(adi_adrv904x_Device_t * const device, + const uint32_t rxChannelMask, + adi_adrv904x_GpioPinSel_e * const gpioSelection, + uint8_t * const enable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxFuncsChanAddr_e rxFuncsBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_FUNCS; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gpioSelection, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, enable, cleanup); + + /*Check that if requested Rx Channel valid*/ + if ((rxChannelMask == 0U) || ((rxChannelMask & (rxChannelMask - 1)) != 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChannelMask, + "Invalid Rx channel is selected. Valid values are Rx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)rxChannelMask, &rxFuncsBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannelMask, "Rx funcs address get issue"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcEnableSyncPulseForGainCounter_BfGet(device, NULL, rxFuncsBaseAddr, enable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading AGC re-sync enable bitfield"); + goto cleanup; + } + + recoveryAction = adrv904x_GpioSignalFind(device, + gpioSelection, + ADI_ADRV904X_GPIO_SIGNAL_AGC_GAIN_CHANGE, + (adi_adrv904x_Channels_e)(rxChannelMask)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read gpio for selected signal"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcDualBandActiveExternalLnaGainWordGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + uint8_t * const bandAExternalLnaGainWord, + uint8_t * const bandBExternalLnaGainWord) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxFuncsChanAddr_e rxFuncsBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_FUNCS; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, bandAExternalLnaGainWord, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, bandBExternalLnaGainWord, cleanup); + + /*Check that if requested Rx Channel valid*/ + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7)) + { + /* Invalid Rx channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Invalid Rx channel selection"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet(device, rxChannel, &rxFuncsBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Rx funcs address get issue"); + goto cleanup; + } + + /* Set this field to 0, to readback the active gain index */ + recoveryAction = adrv904x_RxFuncs_ReadGainTable_BfSet(device, NULL, rxFuncsBaseAddr, 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing read gain table bitfield"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_DualbandControlBandA_BfGet(device, NULL, rxFuncsBaseAddr, bandAExternalLnaGainWord); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading external control word for band A"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_DualbandControlBandB_BfGet(device, NULL, rxFuncsBaseAddr, bandBExternalLnaGainWord); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading external control word for band B"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcUpperLevelBlockerGet(adi_adrv904x_Device_t * const device, + uint8_t * const agcULBlockerBitMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + static const adrv904x_BfRxFuncsChanAddr_e rxChannelFuncs[] = { + ADRV904X_BF_SLICE_RX_0__RX_FUNCS, + ADRV904X_BF_SLICE_RX_1__RX_FUNCS, + ADRV904X_BF_SLICE_RX_2__RX_FUNCS, + ADRV904X_BF_SLICE_RX_3__RX_FUNCS, + ADRV904X_BF_SLICE_RX_4__RX_FUNCS, + ADRV904X_BF_SLICE_RX_5__RX_FUNCS, + ADRV904X_BF_SLICE_RX_6__RX_FUNCS, + ADRV904X_BF_SLICE_RX_7__RX_FUNCS + }; + + uint8_t channelBitFieldVal = 0U; + uint8_t channelId = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, agcULBlockerBitMask, cleanup); + + /* clear return byte before readings */ + *agcULBlockerBitMask = 0U; + + for (channelId = 0U; channelId < ADI_ADRV904X_MAX_RX_ONLY; channelId++) + { + recoveryAction = adrv904x_RxFuncs_AgcUlBlocker_BfGet(device, NULL, rxChannelFuncs[channelId], &channelBitFieldVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading agc upper level blocker bitfield"); + goto cleanup; + } + + *agcULBlockerBitMask = *agcULBlockerBitMask | (channelBitFieldVal << channelId); + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcLowerLevelBlockerGet(adi_adrv904x_Device_t * const device, + uint8_t * const agcLLBlockerBitMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + static const adrv904x_BfRxFuncsChanAddr_e rxChannelFuncs[] = { + ADRV904X_BF_SLICE_RX_0__RX_FUNCS, + ADRV904X_BF_SLICE_RX_1__RX_FUNCS, + ADRV904X_BF_SLICE_RX_2__RX_FUNCS, + ADRV904X_BF_SLICE_RX_3__RX_FUNCS, + ADRV904X_BF_SLICE_RX_4__RX_FUNCS, + ADRV904X_BF_SLICE_RX_5__RX_FUNCS, + ADRV904X_BF_SLICE_RX_6__RX_FUNCS, + ADRV904X_BF_SLICE_RX_7__RX_FUNCS + }; + + uint8_t channelBitFieldVal = 0U; + uint8_t channelId = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, agcLLBlockerBitMask, cleanup); + + /* clear return byte before readings */ + *agcLLBlockerBitMask = 0U; + + for (channelId = 0U; channelId < ADI_ADRV904X_MAX_RX_ONLY; channelId++) + { + recoveryAction = adrv904x_RxFuncs_AgcLlBlocker_BfGet(device, NULL, rxChannelFuncs[channelId], &channelBitFieldVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading agc lower level blocker bitfield"); + goto cleanup; + } + + *agcLLBlockerBitMask = *agcLLBlockerBitMask | (channelBitFieldVal << channelId); + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcHighThresholdPeakDetectorGet(adi_adrv904x_Device_t * const device, + uint8_t * const thresholdPeakDetectorBitMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + static const adrv904x_BfRxFuncsChanAddr_e rxChannelFuncs[] = { + ADRV904X_BF_SLICE_RX_0__RX_FUNCS, + ADRV904X_BF_SLICE_RX_1__RX_FUNCS, + ADRV904X_BF_SLICE_RX_2__RX_FUNCS, + ADRV904X_BF_SLICE_RX_3__RX_FUNCS, + ADRV904X_BF_SLICE_RX_4__RX_FUNCS, + ADRV904X_BF_SLICE_RX_5__RX_FUNCS, + ADRV904X_BF_SLICE_RX_6__RX_FUNCS, + ADRV904X_BF_SLICE_RX_7__RX_FUNCS + }; + + uint8_t channelBitFieldVal = 0U; + uint8_t channelId = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, thresholdPeakDetectorBitMask, cleanup); + + /* clear return byte before readings */ + *thresholdPeakDetectorBitMask = 0U; + + for (channelId = 0U; channelId < ADI_ADRV904X_MAX_RX_ONLY; channelId++) + { + recoveryAction = adrv904x_RxFuncs_AgcAdcovrgHigh_BfGet(device, NULL, rxChannelFuncs[channelId], &channelBitFieldVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading agc high threshold peak detector exceeded bitfield"); + goto cleanup; + } + + *thresholdPeakDetectorBitMask = *thresholdPeakDetectorBitMask | (channelBitFieldVal << channelId); + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AgcLowThresholdPeakDetectorGet(adi_adrv904x_Device_t * const device, + uint8_t * const thresholdPeakDetectorBitMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + static const adrv904x_BfRxFuncsChanAddr_e rxChannelFuncs[] = { + ADRV904X_BF_SLICE_RX_0__RX_FUNCS, + ADRV904X_BF_SLICE_RX_1__RX_FUNCS, + ADRV904X_BF_SLICE_RX_2__RX_FUNCS, + ADRV904X_BF_SLICE_RX_3__RX_FUNCS, + ADRV904X_BF_SLICE_RX_4__RX_FUNCS, + ADRV904X_BF_SLICE_RX_5__RX_FUNCS, + ADRV904X_BF_SLICE_RX_6__RX_FUNCS, + ADRV904X_BF_SLICE_RX_7__RX_FUNCS + }; + + uint8_t channelBitFieldVal = 0U; + uint8_t channelId = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, thresholdPeakDetectorBitMask, cleanup); + + /* clear return byte before readings */ + *thresholdPeakDetectorBitMask = 0U; + + for (channelId = 0U; channelId < ADI_ADRV904X_MAX_RX_ONLY; channelId++) + { + recoveryAction = adrv904x_RxFuncs_AgcAdcovrgLow_BfGet(device, NULL, rxChannelFuncs[channelId], &channelBitFieldVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading agc upper level blocker bitfield"); + goto cleanup; + } + + *thresholdPeakDetectorBitMask = *thresholdPeakDetectorBitMask | (channelBitFieldVal << channelId); + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} \ No newline at end of file diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_cals.c b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_cals.c new file mode 100644 index 00000000000..7ef887dc184 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_cals.c @@ -0,0 +1,1774 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_cals.c +* \brief Contains Calibration features related function implementation defined in +* adi_adrv904x_cals.h +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#include "adi_adrv904x_cals.h" +#include "adi_adrv904x_error.h" +#include "adi_adrv904x_cpu.h" + +#include "../../private/bf/adrv904x_bf_rx_funcs.h" +#include "../../private/include/adrv904x_rx.h" +#include "../../private/include/adrv904x_cpu.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PUBLIC_CALS + +/*****************************************************************************/ +/***** Helper functions' definition ******************************************/ +/*****************************************************************************/ +static adi_adrv904x_ErrAction_e adrv904x_CalStatusGet(adi_adrv904x_Device_t* const device, + const adrv904x_CpuObjectId_e objId, + const adi_adrv904x_Channels_e channel, + adi_adrv904x_CalStatus_t* const status); + +static adi_adrv904x_ErrAction_e adrv904x_SendCalStatusCmd(adi_adrv904x_Device_t* const device, + const adrv904x_CpuCmd_CalStatusType_e type, + const adrv904x_CpuObjectId_e calObjId, + const adi_adrv904x_Channels_e channel); + +static adi_adrv904x_ErrAction_e adrv904x_GetCalStatusCmdResp(adi_adrv904x_Device_t* const device, + const adrv904x_CpuObjectId_e objId, + const adi_adrv904x_Channels_e channel, + const size_t calStatusSize, + void* const pRxBuf, + const void** const pCalStatus); + +static adrv904x_CpuObjectId_e adrv904x_InitCalToObjId(const adi_adrv904x_InitCalibrations_e calId); + +static adrv904x_CpuObjectId_e adrv904x_TrackingCalToObjId(const adi_adrv904x_TrackingCalibrationMask_e calId); + +static uint32_t adrv904x_ChanMaskToNum(const adi_adrv904x_Channels_e mask); + +static uint32_t adrv904x_GetBitPosition(const uint32_t mask); + +static adi_adrv904x_ErrAction_e adrv904x_VerifyChannel(const adi_adrv904x_Channels_e channel); + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_InitCalsRun(adi_adrv904x_Device_t* const device, + const adi_adrv904x_InitCals_t* const initCals) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_RunInit_t runInitCmd; + adrv904x_CpuCmd_RunInitResp_t runInitCmdRsp; + uint32_t cpuTypeIdx = 0U; + adi_adrv904x_InitCalibrations_t validCalMask = ADI_ADRV904X_IC_ALL_CALS; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adi_adrv904x_CpuErrorCode_t cpuErrorCode = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, initCals, cleanup); + ADI_LIBRARY_MEMSET(&runInitCmd, 0, sizeof(adrv904x_CpuCmd_RunInit_t)); + ADI_LIBRARY_MEMSET(&runInitCmdRsp, 0, sizeof(adrv904x_CpuCmd_RunInitResp_t)); + + if (initCals->calMask == 0U) + { + /* Don't report an error as this is a valid value. Nothing to do since the calMask is 0 so return. */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + goto cleanup; + } + + if ((initCals->calMask & ~validCalMask) != 0U) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid calMask provided."); + goto cleanup; + } + + if ((initCals->rxChannelMask == 0U) && (initCals->txChannelMask == 0U) && (initCals->orxChannelMask == 0U)) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "At least one channel mask must be non-zero."); + goto cleanup; + } + + if ((initCals->rxChannelMask & ~0xFFU) != 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, initCals->rxChannelMask, "Invalid rxChannelMask provided."); + goto cleanup; + } + + if ((initCals->txChannelMask & ~0xFFU) != 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, initCals->txChannelMask, "Invalid txChannelMask provided."); + goto cleanup; + } + + if ((initCals->orxChannelMask & ~0x3U) != 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, initCals->orxChannelMask, "Invalid orxChannelMask provided."); + goto cleanup; + } + + /* Fill out run init cmd params with user-provided params */ + runInitCmd.config.calMask = ADRV904X_HTOCLL(initCals->calMask); + runInitCmd.config.rxChannelMask = ADRV904X_HTOCL(initCals->rxChannelMask); + runInitCmd.config.txChannelMask = ADRV904X_HTOCL(initCals->txChannelMask); + runInitCmd.config.orxChannelMask = ADRV904X_HTOCL(initCals->orxChannelMask); + + runInitCmd.config.warmBoot = initCals->warmBoot; + + + runInitCmd.config.warmBoot = (initCals->warmBoot & (~ADI_ADRV904X_JRXREPAIR_INIT_ALL)); + + if ((device->devStateInfo.devState & ADI_ADRV904X_STATE_STANDBY) == ADI_ADRV904X_STATE_STANDBY) + { + /* Serdes Initcal required for jesd link bring up */ + runInitCmd.config.calMask = ADRV904X_HTOCLL(initCals->calMask & + (ADI_ADRV904X_IC_SERDES | + ADI_ADRV904X_IC_ADC_RX | /* Run RX ADC */ + ADI_ADRV904X_IC_ADC_ORX)); /* Run ORX ADC */ + + /* Skip initcals during Standby Recover sequence */ + if (runInitCmd.config.calMask == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + goto cleanup; + } + } + + /* For each CPU, send the run init command, wait for a response, and process any errors. */ + for (cpuTypeIdx = 0U; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_RUN_INIT, + (void*)&runInitCmd, + sizeof(runInitCmd), + (void*)&runInitCmdRsp, + sizeof(runInitCmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(runInitCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + } + + device->devStateInfo.devState = (adi_adrv904x_ApiStates_e)(device->devStateInfo.devState | ADI_ADRV904X_STATE_INITCALS_RUN); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_InitCalsDetailedStatusGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_InitCalStatus_t* const initStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_RunInitGetDetailedStatusResp_t runInitStatusRsp = { { { 0U }, { 0U }, 0U, { 0U }, { 0U } } }; + uint32_t i = 0U; + uint32_t cpuTypeIdx = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, initStatus, cleanup); + ADI_LIBRARY_MEMSET(initStatus, 0, sizeof(adi_adrv904x_InitCalStatus_t)); + + /* For each CPU send the run init detailed status cmd and process the response */ + for (cpuTypeIdx = (uint32_t) ADI_ADRV904X_CPU_TYPE_0; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_RUN_INIT_GET_DETAILED_STATUS, + NULL, + 0U, + (void*)&runInitStatusRsp, + sizeof(runInitStatusRsp), + NULL); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_CPU, + ADI_ADRV904X_ERRCODE_CPU_CMD_RESPONSE, + ADI_NO_VARIABLE, + recoveryAction); + goto cleanup; + } + + /* Merge the CPU-specific response into the initStatus structure */ + + /* Calibration duration is MAX(CPU0_duration, CPU1_duration). Select the longest duration here. */ + if (initStatus->calsDurationMsec < ADRV904X_CTOHL(runInitStatusRsp.status.calsDurationMsec)) + { + initStatus->calsDurationMsec = ADRV904X_CTOHL(runInitStatusRsp.status.calsDurationMsec); + } + + /* Go through each channel-specific status item in the response */ + for (i = 0U; i < ADI_ADRV904X_NUM_INIT_CAL_CHANNELS; ++i) + { + /* For channel-specific errors, we can only set one error code. If there are multiple + * errors on this channel, we simply choose the first CPU's error. */ + if (initStatus->initErrCodes[i] == ADRV904X_CPU_NO_ERROR) + { + initStatus->initErrCodes[i] = ADRV904X_CTOHL(runInitStatusRsp.status.initErrCodes[i]); + } + + /* Setup the channel-specific cal mask items. + * Since these are channel masks, it is safe to simply + * OR in the results from each CPU (a CPU that does not run a + * particular cal will have a value of 0 here). */ + initStatus->initErrCals[i] |= ADRV904X_CTOHLL(runInitStatusRsp.status.initErrCals[i]); + initStatus->calsSincePowerUp[i] |= ADRV904X_CTOHLL(runInitStatusRsp.status.calsSincePowerUp[i]); + initStatus->calsLastRun[i] |= ADRV904X_CTOHLL(runInitStatusRsp.status.calsLastRun[i]); + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_InitCalsDetailedStatusGet_v2( adi_adrv904x_Device_t* const device, + adi_adrv904x_InitCalErrData_t* const initCalErrData) +{ + adi_adrv904x_ErrAction_e apiRecoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_ErrAction_e calRecoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_RunInitGetDetailedStatusResp_t runInitStatusRsp = { { { 0U }, { 0U }, 0U, { 0U }, { 0U } } }; + adi_adrv904x_InitCalStatus_t initCalStatus; + adi_adrv904x_ErrorInfo_t error = { 0, NULL, NULL, ADI_ADRV904X_ERR_ACT_NONE, NULL }; + uint32_t idx = 0U; + uint32_t cpuTypeIdx = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, initCalErrData, cleanup); + + ADI_LIBRARY_MEMSET(initCalErrData, 0, sizeof(adi_adrv904x_InitCalErrData_t)); + + ADI_LIBRARY_MEMSET(&initCalStatus, 0, sizeof(adi_adrv904x_InitCalStatus_t)); + + /* For each CPU send the run init detailed status cmd and process the response */ + for (cpuTypeIdx = (uint32_t) ADI_ADRV904X_CPU_TYPE_0; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + apiRecoveryAction = adrv904x_CpuCmdSend(device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_RUN_INIT_GET_DETAILED_STATUS, + NULL, + 0U, + (void*)&runInitStatusRsp, + sizeof(runInitStatusRsp), + NULL); + if (apiRecoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_CPU, + ADI_ADRV904X_ERRCODE_CPU_CMD_RESPONSE, + ADI_NO_VARIABLE, + apiRecoveryAction); + goto cleanup; + } + + /* Merge the CPU-specific response into the initStatus structure */ + + /* Go through each channel-specific status item in the response */ + for (idx = 0U; idx < ADI_ADRV904X_NUM_INIT_CAL_CHANNELS; ++idx) + { + /* For channel-specific errors, we can only set one error code. If there are multiple + * errors on this channel, we simply choose the first CPU's error. */ + if (initCalStatus.initErrCodes[idx] == ADRV904X_CPU_NO_ERROR) + { + initCalStatus.initErrCodes[idx] = ADRV904X_CTOHL(runInitStatusRsp.status.initErrCodes[idx]); + } + + /* Setup the channel-specific cal mask items. + * Since these are channel masks, it is safe to simply + * OR in the results from each CPU (a CPU that does not run a + * particular cal will have a value of 0 here). */ + initCalStatus.initErrCals[idx] |= ADRV904X_CTOHLL(runInitStatusRsp.status.initErrCals[idx]); + initCalStatus.calsSincePowerUp[idx] |= ADRV904X_CTOHLL(runInitStatusRsp.status.calsSincePowerUp[idx]); + initCalStatus.calsLastRun[idx] |= ADRV904X_CTOHLL(runInitStatusRsp.status.calsLastRun[idx]); + } + + /* Pass InitCals Duration on CPU Cores Directly to adi_adrv904x_InitCalErrData_t Structure */ + initCalErrData->calsDurationMsec[cpuTypeIdx] = ADRV904X_CTOHL(runInitStatusRsp.status.calsDurationMsec); + } + + for (idx = 0U; idx < ADI_ADRV904X_NUM_INIT_CAL_CHANNELS; ++idx) + { + /* Error Detail Lookup */ + ADI_ADRV904X_ERROR_INFO_GET(ADI_ADRV904X_ERRSRC_CPU_RUNTIME, + initCalStatus.initErrCodes[idx], + ADI_NO_VARIABLE, + calRecoveryAction, + error); + + /* Populate Cal Error Information Structure */ + initCalErrData->channel[idx].initErrCals = initCalStatus.initErrCals[idx]; + initCalErrData->channel[idx].errCode = initCalStatus.initErrCodes[idx]; + (void) ADI_LIBRARY_STRNCPY((char*) &initCalErrData->channel[idx].errMsg[0U], error.errMsg, ADI_ADRV904X_CHAR_ARRAY_MAX); + (void) ADI_LIBRARY_STRNCPY((char*) &initCalErrData->channel[idx].errCause[0U], error.errCause, ADI_ADRV904X_CHAR_ARRAY_MAX); + initCalErrData->channel[idx].action = (int64_t) error.actionCode; + (void) ADI_LIBRARY_STRNCPY((char*) &initCalErrData->channel[idx].actionMsg[0U], error.actionMsg, ADI_ADRV904X_CHAR_ARRAY_MAX); + initCalErrData->channel[idx].calsSincePowerUp = initCalStatus.calsSincePowerUp[idx]; + initCalErrData->channel[idx].calsLastRun = initCalStatus.calsLastRun[idx]; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, apiRecoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_InitCalsWait( adi_adrv904x_Device_t* const device, + const uint32_t timeoutMs) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t areCalsRunning = 0U; + uint32_t timeElapsedUs = 0U; + uint32_t timeoutUs = timeoutMs * 1000U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + /* While timeoutMs has not expired, execute adi_adrv904x_InitCalsCheckCompleteGet() until completion (or timeout). */ + for (timeElapsedUs = 0U; timeElapsedUs < timeoutUs; timeElapsedUs += ADI_ADRV904X_INITCALSWAIT_INTERVAL_US) + { + recoveryAction = adi_adrv904x_InitCalsCheckCompleteGet(device, &areCalsRunning, ADI_TRUE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + /* Failure indicates one or more init cals failed (and init cals are now complete) */ + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Init Cals Check Complete Issue"); + goto cleanup; + } + + /* Break out here if init cals have completed */ + if (areCalsRunning == 0U) + { + break; + } + + /* Init cals are still in progress. Wait the specified wait interval, then check again for status. */ + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_Wait_us(&device->common, ADI_ADRV904X_INITCALSWAIT_INTERVAL_US); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "HAL Wait Issue"); + goto cleanup; + } + } + + /* Check for timeout */ + if (timeElapsedUs >= timeoutUs) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_FEATURE; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + timeoutUs, + "Initialization Calibrations Timeout"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_InitCalsWait_v2( adi_adrv904x_Device_t* const device, + const uint32_t timeoutMs, + adi_adrv904x_InitCalErrData_t* const initCalErrData) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t areCalsRunning = 0U; + uint32_t timeElapsedUs = 0U; + uint32_t timeoutUs = timeoutMs * 1000U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + /* While timeoutMs has not expired, execute adi_adrv904x_InitCalsCheckCompleteGet() until completion (or timeout). */ + for (timeElapsedUs = 0U; timeElapsedUs < timeoutUs; timeElapsedUs += ADI_ADRV904X_INITCALSWAIT_INTERVAL_US) + { + /* Do Not Check Init Cals Status via this function */ + recoveryAction = adi_adrv904x_InitCalsCheckCompleteGet_v2(device, &areCalsRunning, initCalErrData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Init Cals Check Complete Issue"); + goto cleanup; + } + + /* Break out here if init cals have completed */ + if (areCalsRunning == 0U) + { + break; + } + + /* Init cals are still in progress. Wait the specified wait interval, then check again for status. */ + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_Wait_us(&device->common, ADI_ADRV904X_INITCALSWAIT_INTERVAL_US); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "HAL Wait Issue"); + goto cleanup; + } + } + + /* Check for timeout */ + if (timeElapsedUs >= timeoutUs) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_FEATURE; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + timeoutUs, + "Initialization Calibrations Timeout"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_InitCalsCheckCompleteGet(adi_adrv904x_Device_t* const device, + uint8_t* const areCalsRunning, + const uint8_t calErrorCheck) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_RunInitGetCompletionStatusResp_t runInitCompleteRsp; + uint8_t inProgress = 0U; + uint8_t calSuccess = 1U; + uint32_t cpuTypeIdx = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, areCalsRunning, cleanup); + ADI_LIBRARY_MEMSET(&runInitCompleteRsp, 0, sizeof(adrv904x_CpuCmd_RunInitGetCompletionStatusResp_t)); + + *areCalsRunning = 0U; + + /* For each CPU, check the status of initial calibrations */ + for (cpuTypeIdx = (uint32_t) ADI_ADRV904X_CPU_TYPE_0; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_RUN_INIT_GET_COMPLETION_STATUS, + NULL, + 0U, + (void*)&runInitCompleteRsp, + sizeof(runInitCompleteRsp), + NULL); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + /* Other Command Response Issue */ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_CPU, + ADI_ADRV904X_ERRCODE_CPU_CMD_RESPONSE, + ADI_NO_VARIABLE, + recoveryAction); + goto cleanup; + } + + /* Update the inProgress flag with this CPU's init cal status. + * If any CPU is in progress, the global state is set to 'in progress' */ + inProgress |= runInitCompleteRsp.inProgress; + + /* Update the calSuccess flag with this CPU's init cal status. + * Only if both CPUs are successful is the global status set to 'success' */ + calSuccess &= runInitCompleteRsp.success; + } + + /* Update status flags for caller. */ + if (inProgress == 1U) + { + /* We do not check calSuccess here because it is not valid + * if inProgress == 1 (per interface spec)*/ + *areCalsRunning = 1U; + } + else + { + *areCalsRunning = 0U; + + if (calErrorCheck == ADI_TRUE) + { + /* If cals failed, error here */ + if (calSuccess == 0U) + { + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_CALS, + ADI_ADRV904X_ERRCODE_CALS_INIT_ERROR_FLAG, + ADI_NO_VARIABLE, + recoveryAction); + goto cleanup; + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_InitCalsCheckCompleteGet_v2( adi_adrv904x_Device_t* const device, + uint8_t* const areCalsRunning, + adi_adrv904x_InitCalErrData_t* const initCalErrData) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_RunInitGetCompletionStatusResp_t runInitCompleteRsp; + uint8_t inProgress = 0U; + uint32_t cpuTypeIdx = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, areCalsRunning, cleanup); + ADI_LIBRARY_MEMSET(&runInitCompleteRsp, 0, sizeof(adrv904x_CpuCmd_RunInitGetCompletionStatusResp_t)); + + *areCalsRunning = 0U; + + /* For each CPU, check the status of initial calibrations */ + for (cpuTypeIdx = (uint32_t) ADI_ADRV904X_CPU_TYPE_0; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_RUN_INIT_GET_COMPLETION_STATUS, + NULL, + 0U, + (void*)&runInitCompleteRsp, + sizeof(runInitCompleteRsp), + NULL); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + /* Other Command Response Issue */ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_CPU, + ADI_ADRV904X_ERRCODE_CPU_CMD_RESPONSE, + ADI_NO_VARIABLE, + recoveryAction); + goto cleanup; + } + + /* Update the inProgress flag with this CPU's init cal status. + * If any CPU is in progress, the global state is set to 'in progress'*/ + inProgress |= runInitCompleteRsp.inProgress; + } + + /* Update status flags for caller. */ + if (inProgress == 1U) + { + /* We do not check calSuccess here because it is not valid + * if inProgress == 1 (per interface spec)*/ + *areCalsRunning = 1U; + } + else + { + *areCalsRunning = 0U; + + if (initCalErrData != NULL) + { + ADI_LIBRARY_MEMSET(initCalErrData, 0, sizeof(adi_adrv904x_InitCalErrData_t)); + + /* Detailed Status As an Out Parameter is Optional but we'll report any error information into the error structure either way */ + recoveryAction = adi_adrv904x_InitCalsDetailedStatusGet_v2(device, initCalErrData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Initial Calibration Detailed Status Get Issue"); + goto cleanup; + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_InitCalsAbort(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t cpuTypeIdx = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + /* For each CPU, send the abort command and verify the response */ + for (cpuTypeIdx = (uint32_t) ADI_ADRV904X_CPU_TYPE_0; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_RUN_INIT_ABORT, + NULL, + 0U, + NULL, + 0U, + NULL); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Run Init Abort Command Send Issue"); + goto cleanup; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TrackingCalsEnableSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TrackingCalibrationMask_t calMask, + const uint32_t channelMask, + const adi_adrv904x_TrackingCalEnableDisable_e enableDisableFlag) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t cpuTypeIdx = 0U; + adrv904x_CpuCmd_SetEnabledTrackingCals_t setTrackingCalCmd; + adrv904x_CpuCmd_SetEnabledTrackingCalsResp_t setTrackingCalCmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adi_adrv904x_CpuErrorCode_t cpuErrorCode = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_LIBRARY_MEMSET(&setTrackingCalCmd, 0, sizeof(adrv904x_CpuCmd_SetEnabledTrackingCals_t)); + ADI_LIBRARY_MEMSET(&setTrackingCalCmdRsp, 0, sizeof(adrv904x_CpuCmd_SetEnabledTrackingCalsResp_t)); + + if ((enableDisableFlag != ADI_ADRV904X_TRACKING_CAL_DISABLE) && (enableDisableFlag != ADI_ADRV904X_TRACKING_CAL_ENABLE)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, enableDisableFlag, "Invalid enableDisableFlag provided."); + goto cleanup; + } + + if (calMask == 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, calMask, "Invalid calMask provided."); + goto cleanup; + } + + if ((calMask & ~ADI_ADRV904X_TC_ALL_CALS) != 0U) + { + + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, calMask, "Invalid calMask provided."); + goto cleanup; + } + + /* channelMask == 0 is a valid input for system calibrations (e.g. SERDES cal), so it is not checked. */ + if ((channelMask & ~0xFFU) != 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMask, "Invalid channelMask provided."); + goto cleanup; + } + + /* Build the command */ + setTrackingCalCmd.enableDisable = (adrv904x_TrackingCalEnableDisable_t)enableDisableFlag; + setTrackingCalCmd.calMask = (adi_adrv904x_TrackingCalibrationMask_t)ADRV904X_HTOCL(calMask); + setTrackingCalCmd.channelMask = ADRV904X_HTOCL(channelMask); + + /* For each CPU, send the set-tracking-cal-enable command and verify the response */ + for (cpuTypeIdx = (uint32_t) ADI_ADRV904X_CPU_TYPE_0; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_ENABLED_TRACKING_CALS, + &setTrackingCalCmd, + sizeof(setTrackingCalCmd), + &setTrackingCalCmdRsp, + sizeof(setTrackingCalCmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(setTrackingCalCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TrackingCalsEnableSet_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TrackingCalibrationMask_e calMask, + const adi_adrv904x_ChannelTrackingCals_t* const channelMask, + const adi_adrv904x_TrackingCalEnableDisable_e enableDisableFlag) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t cpuTypeIdx = 0U; + adrv904x_CpuCmd_SetEnabledTrackingCals_v2_t setTrackingCalCmd; + adrv904x_CpuCmd_SetEnabledTrackingCalsResp_t setTrackingCalCmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adi_adrv904x_CpuErrorCode_t cpuErrorCode = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, channelMask, cleanup); + ADI_LIBRARY_MEMSET(&setTrackingCalCmd, 0, sizeof(adrv904x_CpuCmd_SetEnabledTrackingCals_t)); + ADI_LIBRARY_MEMSET(&setTrackingCalCmdRsp, 0, sizeof(adrv904x_CpuCmd_SetEnabledTrackingCalsResp_t)); + + if ((enableDisableFlag != ADI_ADRV904X_TRACKING_CAL_DISABLE) && (enableDisableFlag != ADI_ADRV904X_TRACKING_CAL_ENABLE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, enableDisableFlag, "Invalid enableDisableFlag provided."); + goto cleanup; + } + + /* calMask cannot be zero nor having invalid bits */ + if ((calMask == 0U) || + ((calMask & ~ADI_ADRV904X_TC_ALL_CALS) != 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, calMask, "Invalid calMask provided."); + goto cleanup; + } + + /* channelMask == 0 is a valid input, check for invalid bits. */ + if ((channelMask->rxChannel & ~0xFFU) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMask->rxChannel, "Invalid rxChannelMask provided."); + goto cleanup; + } + + /* txChannelMask == 0 is a valid input, check for invalid bits. */ + if ((channelMask->txChannel & ~0xFFU) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMask->txChannel, "Invalid txChannelMask provided."); + goto cleanup; + } + + /* txChannelMask == 0 is a valid input, check for invalid bits. */ + if ((channelMask->orxChannel & ~0x03U) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMask->orxChannel, "Invalid orxChannelMask provided."); + goto cleanup; + } + + /* laneSerdesMask == 0 is a valid input, check for invalid bits. */ + if ((channelMask->laneSerdes & ~0xFFU) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMask->laneSerdes, "Invalid laneSerdesMask provided."); + goto cleanup; + } + + /* Build the command */ + setTrackingCalCmd.enableDisable = (adrv904x_TrackingCalEnableDisable_t)enableDisableFlag; + setTrackingCalCmd.calMask = (adi_adrv904x_TrackingCalibrationMask_t)ADRV904X_HTOCL(calMask); + setTrackingCalCmd.rxChannel = ADRV904X_HTOCL(channelMask->rxChannel); + setTrackingCalCmd.orxChannel = ADRV904X_HTOCL(channelMask->orxChannel); + setTrackingCalCmd.txChannel = ADRV904X_HTOCL(channelMask->txChannel); + setTrackingCalCmd.laneSerdes = ADRV904X_HTOCL(channelMask->laneSerdes); + + /* For each CPU, send the set-tracking-cal-enable command and verify the response */ + for (cpuTypeIdx = (uint32_t) ADI_ADRV904X_CPU_TYPE_0; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_ENABLED_TRACKING_CALS_V2, + &setTrackingCalCmd, + sizeof(setTrackingCalCmd), + &setTrackingCalCmdRsp, + sizeof(setTrackingCalCmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(setTrackingCalCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TrackingCalsEnableGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_TrackingCalEnableMasks_t* const enableMasks) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t cpuTypeIdx = 0U; + uint32_t channelIdx = 0U; + adrv904x_CpuCmd_GetEnabledTrackingCalsResp_t getTrackingCalCmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adi_adrv904x_CpuErrorCode_t cpuErrorCode = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, enableMasks, cleanup); + ADI_LIBRARY_MEMSET(&getTrackingCalCmdRsp, 0, sizeof(adrv904x_CpuCmd_GetEnabledTrackingCalsResp_t)); + + /* Initialize the caller's buffer */ + ADI_LIBRARY_MEMSET(enableMasks, 0, sizeof(*enableMasks)); + + /* For each CPU, send the get-tracking-cal-enable command and verify the response */ + for (cpuTypeIdx = (uint32_t) ADI_ADRV904X_CPU_TYPE_0; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_GET_ENABLED_TRACKING_CALS, + NULL, + 0U, + &getTrackingCalCmdRsp, + sizeof(getTrackingCalCmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(getTrackingCalCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* If the command was successful, OR the result with the existing result in enableMask. + * Each CPU will only set the enable bit for a particular cal/channel if it "owns" that + * channel. + */ + for (channelIdx = 0U; channelIdx < ADI_ADRV904X_NUM_TRACKING_CAL_CHANNELS; channelIdx++) + { + enableMasks->enableMask[channelIdx] |= ADRV904X_CTOHL(getTrackingCalCmdRsp.enableMasks.enableMask[channelIdx]); + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TrackingCalAllStateGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_TrackingCalState_t* const calState) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t cpuTypeIdx = 0U; + uint32_t channelIdx = 0U; + uint32_t calIdx = 0U; + adrv904x_CpuCmd_GetTrackingCalStateResp_t getStateCmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adi_adrv904x_CpuErrorCode_t cpuErrorCode = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, calState, cleanup); + + /* Initialize the caller's buffer */ + ADI_LIBRARY_MEMSET(calState, 0, sizeof(*calState)); + + ADI_LIBRARY_MEMSET(&getStateCmdRsp, 0, sizeof(adrv904x_CpuCmd_GetTrackingCalStateResp_t)); + + /* For each CPU, send the get-tracking-cal-state command and verify the response */ + for (cpuTypeIdx = (uint32_t) ADI_ADRV904X_CPU_TYPE_0; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_GET_TRACKING_CAL_STATE, + NULL, + 0U, + &getStateCmdRsp, + sizeof(getStateCmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(getStateCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* If the command was successful, OR the result with the existing result in calState. + * Each CPU will only set the state information for a particular cal/channel if it "owns" that + * channel (otherwise it will be set to 0). + */ + for (channelIdx = 0U; channelIdx < ADI_ADRV904X_NUM_TRACKING_CAL_CHANNELS; channelIdx++) + { + calState->calError[channelIdx] |= ADRV904X_CTOHL(getStateCmdRsp.calState.calError[channelIdx]); + + for (calIdx = 0U; calIdx < ADI_ADRV904X_TC_NUM_CALS; calIdx++) + { + calState->calState[channelIdx][calIdx] |= getStateCmdRsp.calState.calState[channelIdx][calIdx]; + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_InitCalStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_InitCalibrations_e calId, + const adi_adrv904x_Channels_e channel, + adi_adrv904x_CalStatus_t* const calStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, calStatus, cleanup); + + if(((calId & (calId - 1U)) != 0U) ||/* Make sure only one bit is set*/ + (calId == 0U) ||/* No bit set */ + ((ADI_ADRV904X_IC_ALL_CALS & calId) != calId /* bit must be in ADI_ADRV904X_IC_ALL_CALS range */ + )) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, calId, "Invalid calId provided."); + goto cleanup; + } + + recoveryAction = adrv904x_VerifyChannel(channel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "channel parameter is invalid."); + goto cleanup; + } + + /* Use the common cal status get handler to get the data from the CPU */ + recoveryAction = adrv904x_CalStatusGet(device, adrv904x_InitCalToObjId(calId), channel, calStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error getting init cal status."); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TrackingCalStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TrackingCalibrationMask_e calId, + const adi_adrv904x_Channels_e channel, + adi_adrv904x_CalStatus_t* const calStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, calStatus, cleanup); + + if (calId == 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, calId, "calId cannot be zero."); + goto cleanup; + } + + recoveryAction = adrv904x_VerifyChannel(channel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "channel parameter is invalid."); + goto cleanup; + } + + /* Use the common cal status get handler to get the data from the CPU */ + recoveryAction = adrv904x_CalStatusGet(device, adrv904x_TrackingCalToObjId(calId), channel, calStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error getting tracking cal status."); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxHrmDataGet(adi_adrv904x_Device_t* const device, + const uint8_t channelMask, + adi_adrv904x_TxHrmData_t txHrmDataArray[], + uint32_t arrayLength) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + uint8_t i = 0U; + uint8_t indexBitSet = 0U; + uint32_t lengthResp = 0U; + uint8_t numBitsSet = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txHrmDataArray, cleanup); + + static const uint16_t CMD_READ_UP_HRM_COEFF = 3U; + + if (channelMask == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMask, "channelMask cannot be zero."); + goto cleanup; + } + + for (i = 0U; i < ADI_ADRV904X_MAX_CHANNELS; i++) + { + if((channelMask & (1U << i)) == (1U << i)) + { + ++numBitsSet; + } + } + + if (numBitsSet != arrayLength) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, arrayLength, "arrayLength must match number of bits high in channelMask"); + goto cleanup; + } + + for (i = 0U; i < ADI_ADRV904X_MAX_CHANNELS; i++) + { + if ((channelMask & (1U << i)) == (1U << i)) + { + recoveryAction = adi_adrv904x_CpuControlCmdExec(device, + ADRV904X_CPU_OBJID_IC_HRM, + CMD_READ_UP_HRM_COEFF, + (adi_adrv904x_Channels_e)(1U << i), + NULL, + 0U, + &lengthResp, + (uint8_t *)&txHrmDataArray[indexBitSet], + 48U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMask, "Couldn't retrieve Hrm Data for this channelMask"); + goto cleanup; + } + ++indexBitSet; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxHrmDataSet(adi_adrv904x_Device_t* const device, + const uint8_t channelMask, + const adi_adrv904x_TxHrmData_t txHrmDataArray[], + uint32_t arrayLength) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + uint8_t i = 0U; + uint8_t indexBitSet = 0U; + uint32_t lengthResp = 0U; + uint8_t numBitsSet = 0U; + + adi_adrv904x_TxHrmData_t txHrmDataArrayResp[8U]; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txHrmDataArray, cleanup); + ADI_LIBRARY_MEMSET(txHrmDataArrayResp, 0U, 8U*sizeof(adi_adrv904x_TxHrmData_t)); + + static const uint16_t CMD_APPLY_HRM_COEFF = 2U; + + if (channelMask == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMask, "channelMask cannot be zero."); + goto cleanup; + } + + for (i = 0U; i < ADI_ADRV904X_MAX_CHANNELS; i++) + { + if ((channelMask & (1U << i)) == (1U << i)) + { + ++numBitsSet; + } + } + + if (numBitsSet != arrayLength) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, arrayLength, "arrayLength must match number of bits high in channelMask"); + goto cleanup; + } + + for (i = 0U; i < ADI_ADRV904X_MAX_CHANNELS; i++) + { + if ((channelMask & (1U << i)) == (1U << i)) + { + recoveryAction = adi_adrv904x_CpuControlCmdExec(device, + ADRV904X_CPU_OBJID_IC_HRM, + CMD_APPLY_HRM_COEFF, + (adi_adrv904x_Channels_e)(1U << i), + (uint8_t*)&txHrmDataArray[indexBitSet], + 48U, + &lengthResp, + (uint8_t*)&txHrmDataArrayResp[indexBitSet], + 48U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMask, "Couldn't retrieve Hrm Data for this channelMask"); + goto cleanup; + } + ++indexBitSet; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +static adi_adrv904x_ErrAction_e adrv904x_CalStatusGet(adi_adrv904x_Device_t* const device, + const adrv904x_CpuObjectId_e objId, + const adi_adrv904x_Channels_e channel, + adi_adrv904x_CalStatus_t* const status) +{ + const adi_adrv904x_CalStatus_t* pCalStatus = NULL; + const adi_adrv904x_CalStatus_t** const ppCalStatus = &pCalStatus; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + char rxBuf[ADRV904X_CPU_CMD_RESP_MAX_SIZE_BYTES] = { 0 }; + + /* Send the cal status get command to the CPU */ + recoveryAction = adrv904x_SendCalStatusCmd(device, ADRV904X_CPU_CMD_CAL_STATUS_COMMON, objId, channel); + if (recoveryAction == ADI_ADRV904X_ERR_ACT_NONE) + { + /* Get the response from the CPU */ + recoveryAction = adrv904x_GetCalStatusCmdResp(device, + objId, + channel, + sizeof(adi_adrv904x_CalStatus_t), + (void*)&rxBuf[0], + (const void** const)ppCalStatus); + if (recoveryAction == ADI_ADRV904X_ERR_ACT_NONE) + { + if (pCalStatus != NULL) + { + /* Translate the response from the CPU */ + status->errorCode = ADRV904X_CTOHL(pCalStatus->errorCode); + status->percentComplete = ADRV904X_CTOHL(pCalStatus->percentComplete); + status->performanceMetric = ADRV904X_CTOHL(pCalStatus->performanceMetric); + status->iterCount = ADRV904X_CTOHL(pCalStatus->iterCount); + status->updateCount = ADRV904X_CTOHL(pCalStatus->updateCount); + } + } + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e adrv904x_SendCalStatusCmd(adi_adrv904x_Device_t* const device, + const adrv904x_CpuCmd_CalStatusType_e type, + const adrv904x_CpuObjectId_e calObjId, + const adi_adrv904x_Channels_e channel) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + char txBuf[ADRV904X_CPU_CMD_MAX_SIZE_BYTES]; + adrv904x_CpuCmd_t* pCmd = NULL; + adrv904x_CpuCmd_GetCalStatus_t* pCalStatusCmd = NULL; + adi_adrv904x_CpuType_e cpuType = ADI_ADRV904X_CPU_TYPE_UNKNOWN; + + /* Get the CPU that is responsible for the requested channel */ + recoveryAction = adrv904x_CpuChannelMappingGet(device, channel, calObjId, &cpuType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid channel-to-CPU mapping"); + return recoveryAction; + } + + /* Build the CPU command */ + pCmd = (adrv904x_CpuCmd_t*)txBuf; + pCalStatusCmd = (adrv904x_CpuCmd_GetCalStatus_t*)((uint8_t*)pCmd + sizeof(adrv904x_CpuCmd_t)); + pCalStatusCmd->type = (adrv904x_CpuCmd_CalStatusType_t) type; + pCalStatusCmd->calObjId = ADRV904X_HTOCL(calObjId); + pCalStatusCmd->channelNum = ADRV904X_HTOCL(adrv904x_ChanMaskToNum(channel)); + + /* Then send it */ + recoveryAction = adrv904x_CpuCmdWrite(device, cpuType, ADRV904X_LINK_ID_0, ADRV904X_CPU_CMD_ID_GET_CAL_STATUS, pCmd, sizeof(adrv904x_CpuCmd_GetCalStatus_t)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error sending GET_CAL_STATUS command."); + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e adrv904x_GetCalStatusCmdResp(adi_adrv904x_Device_t* const device, + const adrv904x_CpuObjectId_e objId, + const adi_adrv904x_Channels_e channel, + const size_t calStatusSize, + void* const pRxBuf, + const void** const pCalStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmdId_t cmdId = 0U; + adrv904x_CpuCmdResp_t* pCmd = (adrv904x_CpuCmdResp_t*)pRxBuf; + adrv904x_CpuCmd_GetCalStatusResp_t* pCmdResp = (adrv904x_CpuCmd_GetCalStatusResp_t*)((uint8_t*)pCmd + sizeof(adrv904x_CpuCmdResp_t)); + adi_adrv904x_CpuType_e cpuType = ADI_ADRV904X_CPU_TYPE_UNKNOWN; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cmdErrorCode = ADRV904X_CPU_NO_ERROR; + + /* Get the CPU that is responsible for the requested channel */ + recoveryAction = adrv904x_CpuChannelMappingGet(device, channel, objId, &cpuType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid channel-to-CPU mapping"); + return recoveryAction; + } + + /* Read the response from the CPU */ + recoveryAction = adrv904x_CpuCmdRespRead(device, cpuType, ADRV904X_LINK_ID_0, &cmdId, pCmd, sizeof(adrv904x_CpuCmd_GetCalStatusResp_t) + calStatusSize, &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + if (cmdStatus == ADRV904X_CPU_CMD_STATUS_CMD_FAILED) + { + /* If the command failed for a command-specific reason, extract the command status code and log the error. */ + cmdErrorCode = (adrv904x_CpuErrorCode_e)ADRV904X_CTOHL((uint32_t)pCmdResp->cmdStatus); + ADI_ERROR_REPORT(&device->common, ADI_ADRV904X_ERRSRC_API, ADI_COMMON_ERRCODE_API, recoveryAction, cmdErrorCode, "GET_CAL_STATUS command failed."); + return recoveryAction; + } + else + { + /* Otherwise log a generic command failed error */ + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error getting response for GET_CAL_STATUS command."); + return recoveryAction; + } + } + + /* Find the cal status in the response payload, and set the caller's pointer to it. */ + *pCalStatus = (void*)((uint8_t*)pCmdResp + sizeof(adrv904x_CpuCmd_GetCalStatusResp_t)); + + return recoveryAction; +} + +static adrv904x_CpuObjectId_e adrv904x_InitCalToObjId(const adi_adrv904x_InitCalibrations_e calId) +{ + return (adrv904x_CpuObjectId_e)adrv904x_GetBitPosition((uint32_t)calId); +} + +static adrv904x_CpuObjectId_e adrv904x_TrackingCalToObjId(const adi_adrv904x_TrackingCalibrationMask_e calId) +{ + adrv904x_CpuObjectId_t objId = 0U; + + objId = adrv904x_GetBitPosition((uint32_t)calId); + objId = ADRV904X_CPU_TRACKING_CAL_IDX_TO_OBJ(objId); + + return (adrv904x_CpuObjectId_e)objId; +} + +static uint32_t adrv904x_ChanMaskToNum(const adi_adrv904x_Channels_e mask) +{ + return adrv904x_GetBitPosition((uint32_t)mask); +} + +static uint32_t adrv904x_GetBitPosition(const uint32_t mask) +{ + uint32_t bitPos = 0U; + + if (mask != 0U) + { + for (bitPos = 0U; ((1U << bitPos) & mask) == 0U; bitPos++) + { + } + } + + return bitPos; +} + +static adi_adrv904x_ErrAction_e adrv904x_VerifyChannel(const adi_adrv904x_Channels_e channel) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Channel must not be set to OFF */ + if (channel != ADI_ADRV904X_CHOFF) + { + /* Channel must contain a single channel number (0-7) */ + if (channel == ADI_ADRV904X_CH0 || + channel == ADI_ADRV904X_CH1 || + channel == ADI_ADRV904X_CH2 || + channel == ADI_ADRV904X_CH3 || + channel == ADI_ADRV904X_CH4 || + channel == ADI_ADRV904X_CH5 || + channel == ADI_ADRV904X_CH6 || + channel == ADI_ADRV904X_CH7) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CalPvtStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + const uint32_t objId, + uint8_t calStatusGet[], + uint32_t length) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const void* pCalStatus = NULL; + const void** const ppCalStatus = &pCalStatus; + char rxBuf[ADRV904X_CPU_CMD_RESP_MAX_SIZE_BYTES]; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, calStatusGet, cleanup); + + recoveryAction = adrv904x_VerifyChannel(channel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "channel parameter is invalid."); + goto cleanup; + } + + if (((objId > ADRV904X_CPU_OBJID_IC_END) && + (objId < ADRV904X_CPU_OBJID_TC_START)) || + (objId > ADRV904X_CPU_OBJID_TC_END)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, length, "objId parameter is invalid."); + goto cleanup; + } + + if (length == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, length, "Length is zero."); + goto cleanup; + } + + /* Send the cal status get command to the CPU */ + recoveryAction = adrv904x_SendCalStatusCmd(device, ADRV904X_CPU_CMD_CAL_STATUS_PRIVATE, (adrv904x_CpuObjectId_e)objId, channel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SendCalStatusCmd failed"); + goto cleanup; + } + + /* Get the response from the CPU */ + recoveryAction = adrv904x_GetCalStatusCmdResp(device, + (adrv904x_CpuObjectId_e)objId, + channel, + length, + (void*)&rxBuf[0], + ppCalStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GetCalStatusCmd failed"); + goto cleanup; + } + + if (pCalStatus == NULL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GET_CAL_STATUS command failed"); + goto cleanup; + } + + ADI_LIBRARY_MEMCPY(calStatusGet, pCalStatus, length); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CalSpecificStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + const uint32_t objId, + uint8_t calStatusGet[], + uint32_t length) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const void* pCalStatus = NULL; + const void** const ppCalStatus = &pCalStatus; + char rxBuf[ADRV904X_CPU_CMD_RESP_MAX_SIZE_BYTES]; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, calStatusGet, cleanup); + + recoveryAction = adrv904x_VerifyChannel(channel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "channel parameter is invalid."); + goto cleanup; + } + + if (((objId > ADRV904X_CPU_OBJID_IC_END) && + (objId < ADRV904X_CPU_OBJID_TC_START)) || + (objId > ADRV904X_CPU_OBJID_TC_END)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, length, "objId parameter is invalid."); + goto cleanup; + } + + if (length == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, length, "Length is zero."); + goto cleanup; + } + + /* Send the cal status get command to the CPU */ + recoveryAction = adrv904x_SendCalStatusCmd(device, ADRV904X_CPU_CMD_CAL_STATUS_SPECIFIC, (adrv904x_CpuObjectId_e)objId, channel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SendCalStatusCmd failed"); + goto cleanup; + } + + /* Get the response from the CPU */ + recoveryAction = adrv904x_GetCalStatusCmdResp(device, + (adrv904x_CpuObjectId_e)objId, + channel, + length, + (void*)&rxBuf[0], + ppCalStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GetCalStatusCmd failed"); + goto cleanup; + } + + if (pCalStatus == NULL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GET_CAL_STATUS command failed"); + goto cleanup; + } + + ADI_LIBRARY_MEMCPY(calStatusGet, pCalStatus, length); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DigDcOffsetEnableSet(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const uint32_t rxChannelEnableDisable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxFuncsChanAddr_e baseAddr = ADRV904X_BF_SLICE_RX_0__RX_FUNCS; + adi_adrv904x_RxChannels_e rxChannel = ADI_ADRV904X_RXOFF; + uint32_t i = 0U; + uint8_t bfValue = ADI_DISABLE; + uint32_t chanSel = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Validate rxChannelMask */ + if (rxChannelMask > 0xFFU) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannelMask, "Invalid channelDisableEnableMask"); + goto cleanup; + } + + for (i = 0U; i < ADI_ADRV904X_MAX_RX_ONLY; ++i) + { + chanSel = 1U << i; + rxChannel = (adi_adrv904x_RxChannels_e)(chanSel); + + if ((rxChannel & rxChannelMask) != rxChannel) + { + /* Channel is not in mask. Skip it. */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + continue; + } + + /* Get Rx Funcs Bitfield Address */ + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet(device, + rxChannel, + &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve Rx Funcs base address"); + goto cleanup; + } + + if ((rxChannelEnableDisable & (uint32_t) rxChannel) == rxChannel) + { + bfValue = ADI_ENABLE; + } + else + { + bfValue = ADI_DISABLE; + } + + recoveryAction = adrv904x_RxFuncs_BbdcTrackingEnable_BfSet(device, + NULL, + baseAddr, + bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "BbdcTrackingEnable Bf Set failed."); + goto cleanup; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DigDcOffsetEnableGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + uint8_t* const isEnabled) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxFuncsChanAddr_e baseAddr = ADRV904X_BF_SLICE_RX_0__RX_FUNCS; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, isEnabled, cleanup); + + /* Get Rx Funcs Bitfield Address */ + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet(device, + rxChannel, + &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve Rx Funcs base address"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_BbdcTrackingEnable_BfGet(device, + NULL, + baseAddr, + isEnabled); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "BbdcTrackingEnable Bf Get failed."); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxLolReset(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxLolReset_t* const txLolReset) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t i = 0U; + uint32_t txChannel = 0U; + uint32_t lengthResp = 0U; + uint8_t ctrlResp[1] = { 0U }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txLolReset, cleanup); + + /* Tx channel mask range check */ + if (txLolReset->channelMask > (uint32_t) ADI_ADRV904X_TXALL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txLolReset->channelMask, "Invalid Tx LOL Channel Mask"); + goto cleanup; + } + + if ((txLolReset->resetType != ADI_ADRV904X_TX_LOL_SOFT_RESET) && + (txLolReset->resetType != ADI_ADRV904X_TX_LOL_HARD_RESET)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txLolReset->resetType, "Invalid Tx LOL Reset Type"); + goto cleanup; + } + + for (i = 0U; i < ADI_ADRV904X_MAX_TXCHANNELS; ++i) + { + txChannel = (1U << i); + + if ((txLolReset->channelMask & txChannel) == txChannel) + { + /* Sending cpu control command with length of ctrlData set to 0 and ctrlData set to NULL. + * This way the default firmware response will never be overridden by this API function + * and no assumption can be made about firmware response. + */ + recoveryAction = adi_adrv904x_CpuControlCmdExec(device, + (uint32_t)ADRV904X_CPU_OBJID_TC_TX_LOL, + (uint16_t)(txLolReset->resetType), + (adi_adrv904x_Channels_e)txChannel, + NULL, + 0U, + &lengthResp, + ctrlResp, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannel, "Tx LOL Reset Issue"); + goto cleanup; + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxQecReset(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxQecReset_t* const txQecReset) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const uint16_t TXQEC_CMD_RESET = 5U; + uint32_t i = 0U; + uint32_t txChannel = 0U; + uint32_t lengthResp = 0U; + uint8_t ctrlData[1] = { 0U }; + uint8_t ctrlResp[1] = { 0U }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txQecReset, cleanup); + + /* Tx channel mask range check */ + if (txQecReset->channelMask > (uint32_t) ADI_ADRV904X_TXALL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txQecReset->channelMask, "Invalid Tx QEC Channel Mask"); + goto cleanup; + } + + if ((txQecReset->resetType != ADI_ADRV904X_TX_QEC_TRACKING_HARD_RESET) && + (txQecReset->resetType != ADI_ADRV904X_TX_QEC_TRACKING_QEC_RESET) && + (txQecReset->resetType != ADI_ADRV904X_TX_QEC_TRACKING_CHANNEL_RESET)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txQecReset->resetType, "Invalid Tx QEC Reset Type"); + goto cleanup; + } + + ctrlData[0U] = txQecReset->resetType; + + for (i = 0U; i < ADI_ADRV904X_MAX_TXCHANNELS; ++i) + { + txChannel = (1U << i); + + if ((txQecReset->channelMask & txChannel) == txChannel) + { + recoveryAction = adi_adrv904x_CpuControlCmdExec(device, + (uint32_t)ADRV904X_CPU_OBJID_TC_TXQEC, + TXQEC_CMD_RESET, + (adi_adrv904x_Channels_e)txChannel, + ctrlData, + 1U, + &lengthResp, + ctrlResp, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannel, "Tx QEC Reset Issue"); + goto cleanup; + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DigDcOffsetCfgSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuCmd_SetDcOffset_t* const dcOffSetCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_CpuCmd_SetDcOffset_t dcOffsetCfgToWrite; + adi_adrv904x_CpuCmd_SetDcOffsetResp_t cmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adi_adrv904x_CpuErrorCode_t cpuErrorCode = 0U; + static const uint32_t MAX_CORNER_FREQ = 11513U; + static const uint32_t MIN_CORNER_FREQ = 3U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dcOffSetCfg, cleanup); + + ADI_LIBRARY_MEMSET(&dcOffsetCfgToWrite, 0, sizeof(adi_adrv904x_CpuCmd_SetDcOffset_t)); + ADI_LIBRARY_MEMSET(&cmdRsp, 0, sizeof(adi_adrv904x_CpuCmd_SetDcOffsetResp_t)); + + if (dcOffSetCfg->chanSelect == ADI_ADRV904X_RXOFF) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, dcOffSetCfg->chanSelect, "Invalid chanSelect provided."); + goto cleanup; + } + + if (dcOffSetCfg->multEnb > 1U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, dcOffSetCfg->multEnb, "Invalid enable selection. Valid values are 0 and 1"); + goto cleanup; + } + + if ((dcOffSetCfg->dcFilterBw_kHz > MAX_CORNER_FREQ) || + (dcOffSetCfg->dcFilterBw_kHz < MIN_CORNER_FREQ)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, dcOffSetCfg->dcFilterBw_kHz, "Invalid corner frequency. Valid range [3-11513 kHz]"); + goto cleanup; + } + + /* Prepare the command payload */ + dcOffsetCfgToWrite.chanSelect = dcOffSetCfg->chanSelect; + dcOffsetCfgToWrite.dcFilterBw_kHz = ADRV904X_HTOCL(dcOffSetCfg->dcFilterBw_kHz); + dcOffsetCfgToWrite.multEnb = dcOffSetCfg->multEnb; + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_DCOFFSET, + (void*)&dcOffsetCfgToWrite, + sizeof(dcOffsetCfgToWrite), + (void*)&cmdRsp, + sizeof(cmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(cmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DigDcOffsetCfgGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_CpuCmd_GetDcOffsetResp_t* const dcOffSetCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_CpuCmd_GetDcOffsetResp_t cmdRsp; + adi_adrv904x_CpuCmd_GetDcOffset_t getCmd; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adi_adrv904x_CpuErrorCode_t cpuErrorCode = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dcOffSetCfg, cleanup); + + ADI_LIBRARY_MEMSET(&cmdRsp, 0, sizeof(adi_adrv904x_CpuCmd_GetDcOffsetResp_t)); + ADI_LIBRARY_MEMSET(&getCmd, 0, sizeof(adi_adrv904x_CpuCmd_GetDcOffset_t)); + + if ((dcOffSetCfg->chanSelect != (uint8_t)ADI_ADRV904X_RX0) && + (dcOffSetCfg->chanSelect != (uint8_t)ADI_ADRV904X_RX1) && + (dcOffSetCfg->chanSelect != (uint8_t)ADI_ADRV904X_RX2) && + (dcOffSetCfg->chanSelect != (uint8_t)ADI_ADRV904X_RX3) && + (dcOffSetCfg->chanSelect != (uint8_t)ADI_ADRV904X_RX4) && + (dcOffSetCfg->chanSelect != (uint8_t)ADI_ADRV904X_RX5) && + (dcOffSetCfg->chanSelect != (uint8_t)ADI_ADRV904X_RX6) && + (dcOffSetCfg->chanSelect != (uint8_t)ADI_ADRV904X_RX7)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, dcOffSetCfg->chanSelect, "Invalid chanSelect provided."); + goto cleanup; + } + + getCmd.chanSelect = dcOffSetCfg->chanSelect; + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_GET_DCOFFSET, + (void*)&getCmd, + sizeof(getCmd), + (void*)&cmdRsp, + sizeof(cmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(cmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* Extract the command-specific response from the response payload */ + dcOffSetCfg->chanSelect = cmdRsp.chanSelect; + dcOffSetCfg->mShift = ADRV904X_CTOHL(cmdRsp.mShift); + dcOffSetCfg->multEnb = cmdRsp.multEnb; + dcOffSetCfg->mult = ADRV904X_CTOHL(cmdRsp.mult); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_core.c b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_core.c new file mode 100644 index 00000000000..6983e1ac6fe --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_core.c @@ -0,0 +1,2144 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_core.c +* \brief Contains ADRV904X features related function implementation defined in +* adi_adrv904x_core.h +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_gpio.h" +#include "adi_adrv904x_error.h" + +#include "adi_adrv904x_version.h" +#include "../../private/include/adrv904x_gpio.h" +#include "../../private/include/adrv904x_cpu.h" +#include "../../private/include/adrv904x_init.h" +#include "../../private/include/adrv904x_shared_resource_manager.h" +#include "../../private/bf/adrv904x_bf_core.h" +#include "../../private/include/adrv904x_reg_addr_macros.h" +#include "../../private/bf/adrv904x_bf_pll_mem_map.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PUBLIC_CORE + +#define ADRV904X_SPI_VERIFY_SCRATCHPAD_ADDR 0x60800000U +#define ADRV904X_SPI_VERIFY_BUFFER_SIZE 50U +#define ADRV904X_SPI_VERIFY_MASK 0xFFFFFFFFU + +static adi_adrv904x_ErrAction_e adrv904x_SingleRegisterSpiVerify(adi_adrv904x_Device_t* const device); +static adi_adrv904x_ErrAction_e adrv904x_MultipleRegisterSpiVerify(adi_adrv904x_Device_t* const device); + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Lock(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + /* Effectively we call adi_common_hal_ApiEnter and exit but don't release the lock on exit */ + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_ApiEnter(&device->common, __func__, ADI_TRUE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API Entry Issue"); + return recoveryAction; + } + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_ApiExit(&device->common, __func__, ADI_FALSE); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Unlock(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + /* Effectively we call adi_common_hal_ApiEnter and exit but don't take the lock on enter */ + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_ApiEnter(&device->common, __func__, ADI_FALSE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API Entry Issue"); + return recoveryAction; + } + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_ApiExit(&device->common, __func__, ADI_TRUE); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_HwOpen(adi_adrv904x_Device_t* const device, + const adi_adrv904x_SpiConfigSettings_t* const spiSettings) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_ErrAction_e exitRecoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, spiSettings, cleanup); + + /* ApiEnter ADI_FALSE => Do all the normal API enter jobs *except* take the mutex + * This is because we don't have a mutex initialized until commonOpen completes. */ + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_ApiEnter(&device->common, __func__, ADI_FALSE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API Entry Issue"); + return recoveryAction; + } + + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_PlatformFunctionCheck(&device->common); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_HAL_ERR_NOT_IMPLEMENTED, + recoveryAction, + ADI_NO_VARIABLE, + "HAL Function Pointers Not Configured Correctly"); + goto cleanup; + } + + /* Store SPI config into device structure */ + if ((spiSettings->cmosPadDrvStrength != ADI_ADRV904X_CMOSPAD_DRV_WEAK) && + (spiSettings->cmosPadDrvStrength != ADI_ADRV904X_CMOSPAD_DRV_STRONG) && + (spiSettings->cmosPadDrvStrength != ADI_ADRV904X_CMOSPAD_DRV_STRENGTH_1) && + (spiSettings->cmosPadDrvStrength != ADI_ADRV904X_CMOSPAD_DRV_STRENGTH_2)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, spiSettings->cmosPadDrvStrength, "Invalid CMOS PAD driver strength."); + goto cleanup; + } + + device->spiSettings.cmosPadDrvStrength = spiSettings->cmosPadDrvStrength; + device->spiSettings.fourWireMode = spiSettings->fourWireMode; + device->spiSettings.msbFirst = spiSettings->msbFirst; + + if (!ADI_COMMON_DEVICE_STATE_IS_OPEN(device->common)) + { + /* Perform Hardware Open Once */ + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_HwOpen(&device->common); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Common HwOpen Issue"); + goto cleanup; + } + + /* Earliest Point for Logging */ + adi_common_LogLevelSet(&device->common, ADI_ADRV904X_LOGGING); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API); + + /* Indicate device is now open or else HwReset will fail */ + ADI_COMMON_DEVICE_STATE_OPEN_SET(device->common); + + if ((device->devStateInfo.devState & ADI_ADRV904X_STATE_POWERONRESET) != ADI_ADRV904X_STATE_POWERONRESET) + { + /* Only HwReset on first call to HwOpen, end user must explicitly call HwReset + * to reboot the part for future reset */ + /* Toggle RESETB pin */ + recoveryAction = adi_adrv904x_HwReset(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "HwReset Failed"); + goto cleanup; + } + } + } + else + { + /* In case HW is already opened then reapply the SPI config setting. */ + recoveryAction = adi_adrv904x_SpiCfgSet(device, &device->spiSettings); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Config Issue"); + goto cleanup; + } + } + +cleanup: + /* ApiExit ADI_FALSE => don't release mutex as we did not take it at the top of the fn */ + exitRecoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_ApiExit(&device->common, __func__, ADI_FALSE); + if (ADI_ADRV904X_ERR_ACT_NONE != exitRecoveryAction) + { + recoveryAction = exitRecoveryAction; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API Exit Issue"); + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_HwClose(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_ErrAction_e exitRecoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + /* ApiEnter ADI_FALSE => Do all the normal API enter jobs *except* take the mutex + * This is because common_HwClose will be destroying the mutex. */ + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_ApiEnter(&device->common, __func__, ADI_FALSE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API Entry Issue"); + return recoveryAction; + } + + if (ADI_COMMON_DEVICE_STATE_IS_OPEN(device->common)) + { + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_HwClose(&device->common); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Common HAL HwClose Failed"); + goto cleanup; + } + /* Indicate the Device is now closed */ + ADI_COMMON_DEVICE_STATE_OPEN_CLR(device->common); + } + +cleanup: + /* ADI_FALSE to not release mutex as we did not take it at the top of the fn */ + exitRecoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_ApiExit(&device->common, __func__, ADI_FALSE); + if (ADI_ADRV904X_ERR_ACT_NONE != exitRecoveryAction) + { + recoveryAction = exitRecoveryAction; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API Exit Issue"); + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_HwReset(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + static const uint8_t WAIT_10_US = 10U; + static const uint8_t RESETB_LEVEL_LOW = 0U; + static const uint8_t RESETB_LEVEL_HIGH = 1U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + /* HwReset is Positive Edge Triggered */ + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_HwReset(&device->common, RESETB_LEVEL_LOW); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue with adi_common_hal_HwReset() setting Level Low"); + goto cleanup; + } + + { + static const uint8_t RESETB_WAIT_MS = 50U; /* move here to fix compiler warning */ + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_Wait_ms(&device->common, RESETB_WAIT_MS); +} + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "HAL Wait(ms) Failed"); + goto cleanup; + } + + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_HwReset(&device->common, RESETB_LEVEL_HIGH); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue with adi_common_hal_HwReset() setting Level High"); + goto cleanup; + } + + /* Give SPI state machine time to come out of reset */ + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_Wait_us(&device->common, WAIT_10_US); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "HAL Wait(us) Failed"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, ADRV904X_ADDR_SPI_INTERFACE_CONFIG_B, ADRV904X_CONFIG_B_SINGLE_INSTRUCTION, 0xFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Config Setup Issue"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_SpiCfgSet(device, &device->spiSettings); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Config Issue"); + goto cleanup; + } + + device->devStateInfo.devState = ADI_ADRV904X_STATE_POWERONRESET; + + /* Reset Shared Resource Manager when HwReset occurs */ + recoveryAction = adrv904x_SharedResourceMgrReset(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Shared Resource Manager Reset Issue"); + goto cleanup; + } + + /* Reset vswr waveform state in case of HW reset */ + (void)ADI_LIBRARY_MEMSET(&device->devStateInfo.vswrWaveformLoaded, 0U, sizeof(device->devStateInfo.vswrWaveformLoaded)); + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Initialize(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Init_t* const init) +{ + adi_adrv904x_Info_t devStateInfoClear; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t idx = 0U; + uint8_t TX_SPIMODE_ENABLE_ALLCH = 0xFFU; + uint8_t RX_SPIMODE_ENABLE_ALLCH = 0xFFU; + uint8_t ORX_SPIMODE_ENABLE_ALLCH = 0x03U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, init, cleanup); + + ADI_LIBRARY_MEMSET(&devStateInfoClear, 0, sizeof(adi_adrv904x_Info_t)); + + /* There is no HW Reset occurring right here, so we cannot throw away current Shared Resource States */ + /* Restore Shared Resource Manager from current device structure.*/ + ADI_LIBRARY_MEMCPY( &devStateInfoClear.sharedResourcePool, &device->devStateInfo.sharedResourcePool, sizeof(device->devStateInfo.sharedResourcePool) ); + + /* Restore silicon revision from current device structure */ + devStateInfoClear.deviceSiRev = device->devStateInfo.deviceSiRev; + devStateInfoClear.swTest = device->devStateInfo.swTest; + devStateInfoClear.dfeSwTest = device->devStateInfo.dfeSwTest; + (void)ADI_LIBRARY_MEMCPY(&devStateInfoClear.vswrWaveformLoaded, &device->devStateInfo.vswrWaveformLoaded, sizeof(device->devStateInfo.vswrWaveformLoaded)); + devStateInfoClear.devState = device->devStateInfo.devState; + device->devStateInfo = devStateInfoClear; + + + /* Set the Memory Repair Start */ + recoveryAction = adrv904x_Core_MemoryRepairStart_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "MemoryRepairStart Set Issue"); + goto cleanup; + } + + /* Give Memory Repair time to work */ + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_Wait_ms(&device->common, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "HAL Wait(ms) Failed"); + goto cleanup; + } + + /* Populate initialization time for device */ + ADI_LIBRARY_TIME(&(device->devStateInfo.initGlobalTime)); + + recoveryAction = adrv904x_Core_MbiasBgCtat_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + 0U, + 0x09U); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Issue while writing CTAT Trim0"); + goto cleanup; + } + + recoveryAction = adrv904x_Core_MbiasBgCtat_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + 1U, + 0x09U); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Issue while writing CTAT Trim1"); + goto cleanup; + } + + recoveryAction = adrv904x_Core_MbiasBgPtat_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + 0U, + 0x1EU); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Issue while writing PTAT Trim0"); + goto cleanup; + } + + recoveryAction = adrv904x_Core_MbiasBgPtat_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + 1U, + 0x1EU); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Issue while writing PTAT Trim1"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_SpiRuntimeOptionsSet(device, &init->spiOptionsInit); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Runtime Options Set Issue"); + goto cleanup; + } + + /* Initializes the part in non-streaming mode. The responsibility is on the API functions internally + * to use streaming when appropriate by calling adrv904x_SpiStreamingEntry when first entering the API + * and adrv904x_SpiStreamingExit when leaving the API. + * */ + recoveryAction = adrv904x_SpiStreamingExit(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI streaming exit issue"); + goto cleanup; + } + + /* Initialize GP Interrupt settings for use during device initialization*/ + recoveryAction = adrv904x_GpIntPreMcsInit(device, &init->gpIntPreInit); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GP Interrupt Initialization Issue"); + goto cleanup; + } + + device->devStateInfo.gainIndexes.rx0MaxGainIndex = ADI_ADRV904X_RX_MAX_GAIN_INDEX; + device->devStateInfo.gainIndexes.rx1MaxGainIndex = ADI_ADRV904X_RX_MAX_GAIN_INDEX; + device->devStateInfo.gainIndexes.rx2MaxGainIndex = ADI_ADRV904X_RX_MAX_GAIN_INDEX; + device->devStateInfo.gainIndexes.rx3MaxGainIndex = ADI_ADRV904X_RX_MAX_GAIN_INDEX; + device->devStateInfo.gainIndexes.rx4MaxGainIndex = ADI_ADRV904X_RX_MAX_GAIN_INDEX; + device->devStateInfo.gainIndexes.rx5MaxGainIndex = ADI_ADRV904X_RX_MAX_GAIN_INDEX; + device->devStateInfo.gainIndexes.rx6MaxGainIndex = ADI_ADRV904X_RX_MAX_GAIN_INDEX; + device->devStateInfo.gainIndexes.rx7MaxGainIndex = ADI_ADRV904X_RX_MAX_GAIN_INDEX; + + /* Disable TRX_CTRL Pin mode until after initialization to prevent any toggling + * pins from interfering with the init sequence. SPI reg to actually enable the + * channels is 0 by default after Power On Reset */ + recoveryAction = adrv904x_Core_RadioControlInterfaceTxSpiModeSel_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + TX_SPIMODE_ENABLE_ALLCH); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to enable TX Radio Control SPI Mode"); + goto cleanup; + } + + recoveryAction = adrv904x_Core_RadioControlInterfaceRxSpiModeSel_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + RX_SPIMODE_ENABLE_ALLCH); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to enable RX Radio Control SPI Mode"); + goto cleanup; + } + + recoveryAction = adrv904x_Core_RadioControlInterfaceOrxSpiModeSel_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + ORX_SPIMODE_ENABLE_ALLCH); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to enable ORX Radio Control SPI Mode"); + goto cleanup; + } + + /* Initialize the CPU memory bank usage */ + recoveryAction = adrv904x_CpuInitialize(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CPU Initialization Issue"); + goto cleanup; + } + + ADI_LIBRARY_MEMCPY( device->devStateInfo.cpu.cpuMemDumpBinaryInfo.filePath, + init->cpuMemDump.filePath, + ADI_ADRV904X_MAX_FILE_LENGTH); + + recoveryAction = adrv904x_ClocksSync(device, init); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CPU Initialization Issue"); + goto cleanup; + } + + /* Config Uart GPIO if enable */ + for (idx = 0U; idx < ADI_ADRV904X_MAX_UART; idx++) + { + if (init->uart[idx].enable == ADI_TRUE) + { + recoveryAction = adrv904x_UartCfg(device, init->uart[idx].pinSelect); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "adi_adrv904x_UartCfg Issue."); + goto cleanup; + } + } + + } + + /* Config DFE UART0 GPIOs */ + recoveryAction = adrv904x_DfeUartCfg(device, 0U, &init->dfeUart0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to configure DFE UART0 pins"); + goto cleanup; + } + + /* Disable stream pin mode until after streams are loaded */ + /* Disable Tx pin mode for all Tx, Rx and ORx channels */ + recoveryAction = adrv904x_Core_RadioControlInterfaceTxSpiEn_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + 0x00U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to disable Radio Control TX channels."); + goto cleanup; + } + + recoveryAction = adrv904x_Core_RadioControlInterfaceRxSpiEn_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + 0x00U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to disable Radio Control RX channels."); + goto cleanup; + } + + recoveryAction = adrv904x_Core_RadioControlInterfaceOrxSpiEn_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + 0x00U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to disable Radio Control ORX channels."); + goto cleanup; + } + + recoveryAction = adi_adrv904x_ProfilesVerify(device, init); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to profiles Verify."); + goto cleanup; + } + + /* Set Initialized Channels */ + if (device->devStateInfo.profilesValid & ADI_ADRV904X_TX_PROFILE_VALID) + { + device->devStateInfo.initializedChannels |= ((device->initExtract.tx.txInitChannelMask & ADI_ADRV904X_TXALL) << ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET); + } + + if (device->devStateInfo.profilesValid & ADI_ADRV904X_RX_PROFILE_VALID) + { + device->devStateInfo.initializedChannels |= (device->initExtract.rx.rxInitChannelMask & ADI_ADRV904X_RX_MASK_ALL); + } + + if (device->devStateInfo.profilesValid & ADI_ADRV904X_ORX_PROFILE_VALID) + { + device->devStateInfo.initializedChannels |= (device->initExtract.rx.rxInitChannelMask & ADI_ADRV904X_ORX_MASK_ALL); + } + device->devStateInfo.hsDigClk_kHz = device->initExtract.clocks.hsDigClk_kHz; + device->devStateInfo.devState = (adi_adrv904x_ApiStates_e)(device->devStateInfo.devState | ADI_ADRV904X_STATE_INITIALIZED); + + + /* set special pattern used flag value for RadioSequencer */ + ADI_LIBRARY_MEMSET((void*)(&(device->devStateInfo.specialSequencerPatternInfo)), 0U, sizeof(adi_adrv904x_RsSpecialSequencer_t)); + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Shutdown(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* TODO: Function not implemented yet. */ + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_API_NOT_IMPLEMENTED_REPORT_GOTO(&device->common, cleanup); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_MultichipSyncSet(adi_adrv904x_Device_t* const device, + const uint8_t enableSync) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_StartMcsResp_t startMcsResp = { ADRV904X_CPU_SYSTEM_SIMULATED_ERROR }; + adrv904x_CpuCmd_McsCompleteResp_t mcsCompleteResp = { ADRV904X_CPU_SYSTEM_SIMULATED_ERROR }; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Verify enableSync parameter */ + if ((enableSync != 0u) && (enableSync != 1U)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, enableSync, "enableSync must be 0 or 1"); + goto cleanup; + } + + if (enableSync == 1U) + { + /* Start MCS */ + + /* Clear the MCS_STATUS register before starting. This register is write-1-clear. + * This register bit is only accessible over SPI & not AHB*/ + recoveryAction = adrv904x_Core_McsStatus_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADI_ENABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to clear MCS status register"); + goto cleanup; + } + + /* Send Start MCS command to CPU */ + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_START_MCS, + NULL, + 0U, + (void*)&startMcsResp, + sizeof(startMcsResp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(startMcsResp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + } + else + { + /* Stop MCS */ + + /* Notify CPU that MCS is complete */ + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_MCS_COMPLETE, + NULL, + 0U, + (void *)&mcsCompleteResp, + sizeof(mcsCompleteResp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(mcsCompleteResp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_MultichipSyncSet_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_McsSyncMode_e mcsMode) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + adrv904x_CpuCmd_StartMcsResp_t startMcsResp = { ADRV904X_CPU_SYSTEM_SIMULATED_ERROR }; + adrv904x_CpuCmd_McsCompleteResp_t mcsCompleteResp = { ADRV904X_CPU_SYSTEM_SIMULATED_ERROR }; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + switch (mcsMode) + { + + case ADI_ADRV904X_MCS_CARRIER_RECONFIG: + device->devStateInfo.devState = (adi_adrv904x_ApiStates_e)(device->devStateInfo.devState | ADI_ADRV904X_STATE_MCSCARRIERRECONFIG); + + /* Send ADRV904X_CPU_CMD_ID_START_MCS_CARRIER_RECONFIG Command */ + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_START_MCS_CARRIER_RECONFIG, + NULL, + 0U, + (void*)&startMcsResp, + sizeof(startMcsResp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(startMcsResp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + break; + case ADI_ADRV904X_MCS_OFF: + switch (device->devStateInfo.devState & ADI_ADRV904X_STATE_MCSCARRIERRECONFIG) + { + + case ADI_ADRV904X_STATE_MCSCARRIERRECONFIG: + /* Send ADRV904X_CPU_CMD_ID_MCS_CARRIER_RECONFIG_COMPLETE Command */ + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_MCS_CARRIER_RECONFIG_COMPLETE, + NULL, + 0U, + (void *)&mcsCompleteResp, + sizeof(mcsCompleteResp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(mcsCompleteResp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + /* clear the devState status of ADI_ADRV904X_STATE_MCSCARRIERRECONFIG */ + device->devStateInfo.devState = (adi_adrv904x_ApiStates_e)(device->devStateInfo.devState & (~ADI_ADRV904X_STATE_MCSCARRIERRECONFIG)); + break; + default: + recoveryAction = adi_adrv904x_MultichipSyncSet(device, 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "adi_adrv904x_MultichipSyncSet Failed"); + goto cleanup; + } + break; + } + break; + case ADI_ADRV904X_MCS_START: + recoveryAction = adi_adrv904x_MultichipSyncSet(device, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "adi_adrv904x_MultichipSyncSet Failed"); + goto cleanup; + } + break; + default: + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, mcsMode, "mcsMode is not valid"); + goto cleanup; + break; + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); + +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_MultichipSyncStatusGet(adi_adrv904x_Device_t* const device, + uint32_t* const mcsStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t mcsStatusRead = 0x0U; + + uint8_t jesdClkPllStatus = 0x0U; + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, mcsStatus, cleanup); + + recoveryAction = adrv904x_Core_McsStatus_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &mcsStatusRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to get Mcs Status"); + /* If Warning we continue executing the API as normal, otherwise goto cleanup */ + goto cleanup; + } + + recoveryAction = adrv904x_PllMemMap_McsSpiStatus_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_CLKPLL, + &jesdClkPllStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to get Mcs Spi Status"); + goto cleanup; + } + + *mcsStatus = (uint32_t)mcsStatusRead; + + *mcsStatus = (uint32_t)((jesdClkPllStatus == 0x1U) ? (mcsStatusRead | (1U << 1U)) : (mcsStatusRead | (0U << 1U))) ; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ProfilesVerify(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Init_t* const init) +{ + /* Set Recovery Action to Error State */ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); /* Lock Device & Log Function Entry */ + + /* Lock must be released before exiting API; + * All Errors should result in 'goto cleanup'; Do not exit function early, i.e. return from API + */ + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, init, cleanup); + + if ((device->initExtract.tx.txInitChannelMask & ADI_ADRV904X_TXALL) != ADI_ADRV904X_TXOFF) + { + device->devStateInfo.profilesValid |= ADI_ADRV904X_TX_PROFILE_VALID; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + + if ((device->initExtract.rx.rxInitChannelMask & ADI_ADRV904X_RX_MASK_ALL) != ADI_ADRV904X_RXOFF) + { + device->devStateInfo.profilesValid |= ADI_ADRV904X_RX_PROFILE_VALID; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + + if ((device->initExtract.rx.rxInitChannelMask & ADI_ADRV904X_ORX_MASK_ALL) != ADI_ADRV904X_RXOFF) + { + device->devStateInfo.profilesValid |= ADI_ADRV904X_ORX_PROFILE_VALID; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SpiCfgSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_SpiConfigSettings_t* const spiCtrlSettings) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; /* Set Recovery Action to Error State */ + + uint8_t spiConfigA = 0U; + static const uint8_t SPICFG_MSBFIRST_OFF = 0U; + static const uint8_t SPICFG_FOURWIREMODE_OFF = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); /* Validate Device Only before Lock */ + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, spiCtrlSettings, cleanup); + + ADI_ADRV904X_API_ENTRY(&device->common); /* Lock Device & Log Function Entry */ + + /* Lock must be released before exiting API; + * All Errors should result in 'goto cleanup'; Do not exit function early, i.e. return from API + */ + + /* core.spi_interface_config_A */ + /* SPI bit is 1 = LSB first */ + if (spiCtrlSettings->msbFirst == SPICFG_MSBFIRST_OFF) + { + spiConfigA |= ADRV904X_CONFIG_A_SPI_LSB_FIRST; + } + + spiConfigA |= ADRV904X_CONFIG_A_SPI_ADDR_ASCENSION; + + if (spiCtrlSettings->fourWireMode != SPICFG_FOURWIREMODE_OFF) + { + spiConfigA |= ADRV904X_CONFIG_A_SPI_SDO_ACTIVE; + } + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, ADRV904X_ADDR_SPI_INTERFACE_CONFIG_A, spiConfigA, 0xFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set SPI Config"); + goto cleanup; + } + + device->spiSettings.fourWireMode = spiCtrlSettings->fourWireMode; + device->spiSettings.msbFirst = spiCtrlSettings->msbFirst; + + /* Setting CMOS PAD Driver Strength */ + if (device->spiSettings.fourWireMode == ADI_TRUE) + { + recoveryAction = adi_adrv904x_GpioDriveStrengthSet(device, ADI_ADRV904X_O_SPI_DO, spiCtrlSettings->cmosPadDrvStrength); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set SPI DO drive strength"); + goto cleanup; + } + } + else + { + recoveryAction = adi_adrv904x_GpioDriveStrengthSet(device, ADI_ADRV904X_IO_SPI_DIO, spiCtrlSettings->cmosPadDrvStrength); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set SPI DIO drive strength"); + goto cleanup; + } + } + + device->spiSettings.cmosPadDrvStrength = spiCtrlSettings->cmosPadDrvStrength; + +#if ADI_ADRV904X_SPI_HYSTERESIS + { + recoveryAction = adi_adrv904x_SpiHysteresisSet(device, ADI_ENABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Hysteresis Configuration Issue"); + goto cleanup; + } + } +#endif + + recoveryAction = adi_adrv904x_GpioDriveStrengthSet( device, + ADI_ADRV904X_I_RESETB, + (adi_adrv904x_CmosPadDrvStr_e) ADI_ADRV904X_RESETB_PIN_DRIVE_STRENGTH); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + + recoveryAction = adi_adrv904x_GpioHysteresisSet(device, ADI_ADRV904X_I_RESETB, ADI_ENABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SpiCfgGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiConfigSettings_t* const spi) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, spi, cleanup); + + spi->fourWireMode = device->spiSettings.fourWireMode; + spi->msbFirst = device->spiSettings.msbFirst; + spi->cmosPadDrvStrength = device->spiSettings.cmosPadDrvStrength; + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AuxSpiCfgSet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_AuxSpiConfig_t* const config) +{ + static const uint32_t NOCHAN_MASK = 0U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_AuxSpiConfig_t readConfig; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, config, cleanup); + + ADI_LIBRARY_MEMSET(&readConfig, 0, sizeof(adi_adrv904x_AuxSpiConfig_t)); + + /* Range check enable */ + if ((config->enable != ADI_ENABLE) && + (config->enable != ADI_DISABLE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, config->enable, "Aux SPI enable can only be 0 or 1."); + goto cleanup; + } + + /* Range check GPIO selections */ + if ((config->enable == ADI_ENABLE) && + (config->gpioCsb != ADI_ADRV904X_GPIO_03) && + (config->gpioCsb != ADI_ADRV904X_GPIO_16)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, config->gpioCsb, "Aux SPI CSB GPIO pin can only be set to GPIO[3] or GPIO[16]."); + goto cleanup; + } + + if ((config->enable == ADI_ENABLE) && + (config->gpioClk != ADI_ADRV904X_GPIO_02) && + (config->gpioClk != ADI_ADRV904X_GPIO_15)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, config->gpioClk, "Aux SPI CLK GPIO pin can only be set to GPIO[2] or GPIO[15]."); + goto cleanup; + } + + if ((config->enable == ADI_ENABLE) && + (config->gpioSdio != ADI_ADRV904X_GPIO_00) && + (config->gpioSdio != ADI_ADRV904X_GPIO_13)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, config->gpioSdio, "Aux SPI SDIO GPIO pin can only be set to GPIO[0] or GPIO[13]."); + goto cleanup; + } + + if ((config->enable == ADI_ENABLE) && + (config->gpioSdo != ADI_ADRV904X_GPIO_01) && + (config->gpioSdo != ADI_ADRV904X_GPIO_14) && + (config->gpioSdo != ADI_ADRV904X_GPIO_INVALID)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, config->gpioSdo, "Aux SPI SDO GPIO pin can only be set to GPIO[1], GPIO[14], or INVALID."); + goto cleanup; + } + + /* Get current config */ + recoveryAction = adi_adrv904x_AuxSpiCfgGet(device, &readConfig); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error retrieving current Aux SPI Configuration."); + goto cleanup; + } + + /* If Aux SPI is currently enabled, disable it */ + if (readConfig.enable) + { + recoveryAction = adrv904x_Core_Spi1En_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + ADI_DISABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error disabling Aux SPI interface."); + goto cleanup; + } + + if (readConfig.gpioCsb != ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = adrv904x_GpioSignalRelease( device, + readConfig.gpioCsb, + ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_CSB, + NOCHAN_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error releasing Aux SPI CSB GPIO pin."); + goto cleanup; + } + } + + if (readConfig.gpioClk != ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = adrv904x_GpioSignalRelease( device, + readConfig.gpioClk, + ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_CLK, + NOCHAN_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error releasing Aux SPI CLK GPIO pin."); + goto cleanup; + } + } + + if (readConfig.gpioSdio != ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = adrv904x_GpioSignalRelease( device, + readConfig.gpioSdio, + ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_SDIO, + NOCHAN_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error releasing Aux SPI SDIO GPIO pin."); + goto cleanup; + } + } + + if (readConfig.gpioSdo != ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = adrv904x_GpioSignalRelease( device, + readConfig.gpioSdo, + ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_SDO, + NOCHAN_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error releasing Aux SPI SDO GPIO pin."); + goto cleanup; + } + } + + } + + /* Enable Aux SPI, if appropriate */ + if (config->enable == ADI_ENABLE) + { + recoveryAction = adrv904x_GpioSignalSet( device, + config->gpioCsb, + ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_CSB, + NOCHAN_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error routing Aux SPI CSB GPIO pin."); + goto cleanup; + } + + recoveryAction = adrv904x_GpioSignalSet( device, + config->gpioClk, + ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_CLK, + NOCHAN_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error routing Aux SPI CLK GPIO pin."); + goto cleanup; + } + + recoveryAction = adrv904x_GpioSignalSet( device, + config->gpioSdio, + ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_SDIO, + NOCHAN_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error routing Aux SPI SDIO GPIO pin."); + goto cleanup; + } + + if (config->gpioSdo != ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = adrv904x_GpioSignalSet( device, + config->gpioSdo, + ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_SDO, + NOCHAN_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error routing Aux SPI SDO GPIO pin."); + goto cleanup; + } + } + + recoveryAction = adrv904x_Core_Spi1En_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + ADI_ENABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error enabling Aux SPI interface."); + goto cleanup; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AuxSpiCfgGet( adi_adrv904x_Device_t* const device, + adi_adrv904x_AuxSpiConfig_t* const config) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, config, cleanup); + + /* Read Aux SPI enable */ + recoveryAction = adrv904x_Core_Spi1En_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &config->enable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading Aux SPI enable setting."); + goto cleanup; + } + + /* Find GPIOs routing Aux SPI signals */ + recoveryAction = adrv904x_GpioSignalFind( device, + &config->gpioCsb, + ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_CSB, + ADI_ADRV904X_CHOFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error retrieving GPIO pin routing Aux SPI CSB signal."); + goto cleanup; + } + + recoveryAction = adrv904x_GpioSignalFind( device, + &config->gpioClk, + ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_CLK, + ADI_ADRV904X_CHOFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error retrieving GPIO pin routing Aux SPI CLK signal."); + goto cleanup; + } + + recoveryAction = adrv904x_GpioSignalFind( device, + &config->gpioSdio, + ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_SDIO, + ADI_ADRV904X_CHOFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error retrieving GPIO pin routing Aux SPI SDIO signal."); + goto cleanup; + } + + recoveryAction = adrv904x_GpioSignalFind( device, + &config->gpioSdo, + ADI_ADRV904X_GPIO_SIGNAL_AUX_SPI_SDO, + ADI_ADRV904X_CHOFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error retrieving GPIO pin routing Aux SPI SDO signal."); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SpiRuntimeOptionsSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_SpiOptions_t* const spiOptions) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, spiOptions, cleanup); + + if (spiOptions->allowAhbAutoIncrement > 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + spiOptions->allowAhbAutoIncrement, + "allowAhbAutoIncrement can only be 0 or 1"); + goto cleanup; + } + + if (spiOptions->allowAhbSpiFifoMode > 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + spiOptions->allowAhbSpiFifoMode, + "allowAhbSpiFifoMode can only be 0 or 1"); + goto cleanup; + } + + if (spiOptions->allowSpiStreaming > 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + spiOptions->allowSpiStreaming, + "allowSpiStreaming can only be 0 or 1"); + goto cleanup; + } + + device->devStateInfo.spiOptions.allowAhbAutoIncrement = spiOptions->allowAhbAutoIncrement; + device->devStateInfo.spiOptions.allowAhbSpiFifoMode = spiOptions->allowAhbSpiFifoMode; + device->devStateInfo.spiOptions.allowSpiStreaming = spiOptions->allowSpiStreaming; + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SpiRuntimeOptionsGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiOptions_t* const spiOptions) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, spiOptions, cleanup); + + spiOptions->allowAhbAutoIncrement = device->devStateInfo.spiOptions.allowAhbAutoIncrement; + spiOptions->allowAhbSpiFifoMode = device->devStateInfo.spiOptions.allowAhbSpiFifoMode; + spiOptions->allowSpiStreaming = device->devStateInfo.spiOptions.allowSpiStreaming; + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +static adi_adrv904x_ErrAction_e adrv904x_SingleRegisterSpiVerify(adi_adrv904x_Device_t* const device) +{ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint16_t vendorIdReadback = 0U; + uint8_t scratchPadReadback = 0U; + static const uint16_t VENDOR_ID = 0x0456U; + static const uint8_t TEST_WORD_1 = 0xB6U; + static const uint8_t TEST_WORD_2 = 0x49U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + recoveryAction = adrv904x_Core_VendorId_BfGet( device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &vendorIdReadback); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Vendor ID Read Issue; Check Platform SPI Driver"); + return recoveryAction; + } + + if (vendorIdReadback != VENDOR_ID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_INTERFACE; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + vendorIdReadback, + "Vendor ID Readback Mismatch; Check Platform SPI Driver"); + return recoveryAction; + } + + /* Writing, reading, then verifying Scratch Pad (Direct SPI access) */ + recoveryAction = adrv904x_Core_ScratchPadWord_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + TEST_WORD_1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Scratchpad Byte Write (1) Issue; Check Platform SPI Driver"); + return recoveryAction; + } + + recoveryAction = adrv904x_Core_ScratchPadWord_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &scratchPadReadback); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Scratchpad Byte Read (1) Issue; Check Platform SPI Driver"); + return recoveryAction; + } + + if (scratchPadReadback != TEST_WORD_1) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_INTERFACE; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + scratchPadReadback, + "Scratchpad Byte Readback Mismatch (1); Check Platform SPI Driver"); + return recoveryAction; + } + + /* Writing, reading, then verifying Scratch Pad (Direct SPI access) */ + recoveryAction = adrv904x_Core_ScratchPadWord_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + TEST_WORD_2); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Scratchpad Byte Write (2) Issue; Check Platform SPI Driver"); + return recoveryAction; + } + + recoveryAction = adrv904x_Core_ScratchPadWord_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &scratchPadReadback); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Scratchpad Byte Read (2) Issue; Check Platform SPI Driver"); + return recoveryAction; + } + + if (scratchPadReadback != TEST_WORD_2) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_INTERFACE; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + scratchPadReadback, + "Scratchpad Byte Readback Mismatch (2) Issue; Check Platform SPI Driver"); + return recoveryAction; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e adrv904x_MultipleRegisterSpiVerify(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + uint32_t i = 0U; + + uint32_t address[ADRV904X_SPI_VERIFY_BUFFER_SIZE] = { 0U }; + uint32_t currentData[ADRV904X_SPI_VERIFY_BUFFER_SIZE] = { 0U }; + uint32_t data[ADRV904X_SPI_VERIFY_BUFFER_SIZE] = { 0U }; + uint32_t mask[ADRV904X_SPI_VERIFY_BUFFER_SIZE] = { 0U }; + uint32_t readBack[ADRV904X_SPI_VERIFY_BUFFER_SIZE] = { 0U }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + if (device->devStateInfo.spiStreamingOn == ADI_TRUE) + { + /* Put the part into streaming mode to help facilitate the large, contiguous SPI writes */ + recoveryAction = adrv904x_SpiStreamingEntry(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue Entering Spi Streaming Mode"); + goto cleanup; + } + } + + for (i = 0U; i < ADRV904X_SPI_VERIFY_BUFFER_SIZE; ++i) + { + address[i] = (ADRV904X_SPI_VERIFY_SCRATCHPAD_ADDR + (i * 4)); + + data[i] = (0x5U + (i * 4U)); + mask[i] = ADRV904X_SPI_VERIFY_MASK; + } + + recoveryAction = adi_adrv904x_Registers32Read( device, + NULL, + ADRV904X_SPI_VERIFY_SCRATCHPAD_ADDR, + ¤tData[0], + &mask[0], + ADRV904X_SPI_VERIFY_BUFFER_SIZE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Scratchpad Multi Register Read Issue; Check Platform SPI Driver"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Registers32Write( device, + NULL, + &address[0], + &data[0], + &mask[0], + ADRV904X_SPI_VERIFY_BUFFER_SIZE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Scratchpad Multi Register Write Issue; Check Platform SPI Driver"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Registers32Read( device, + NULL, + ADRV904X_SPI_VERIFY_SCRATCHPAD_ADDR, + &readBack[0], + &mask[0], + ADRV904X_SPI_VERIFY_BUFFER_SIZE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Scratchpad Multi Register Read Issue; Check Platform SPI Driver"); + goto cleanup; + } + + if (0 != ADI_LIBRARY_MEMCMP(&data[0], &readBack[0], sizeof(data))) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_INTERFACE; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, readBack[0], "Scratchpad Multi Register Readback Issue; Check Platform SPI Driver"); + goto cleanup; + } + +cleanup: + if (ADI_ADRV904X_ERR_ACT_NONE != adi_adrv904x_Registers32Write( device, + NULL, + &address[0], + ¤tData[0], + &mask[0], + ADRV904X_SPI_VERIFY_BUFFER_SIZE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_INTERFACE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "ScratchPad Multi Register Cleanup Issue"); + } + + if (device->devStateInfo.spiStreamingOn == ADI_TRUE) + { + if (ADI_ADRV904X_ERR_ACT_NONE != adrv904x_SpiStreamingExit(device)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_INTERFACE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Spi Streaming Exit Issue"); + } + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SpiVerify(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + recoveryAction = adrv904x_SingleRegisterSpiVerify(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Single Register Spi Verify Issue"); + goto cleanup; + } + + if ((device->devStateInfo.devState & ADI_ADRV904X_STATE_INITIALIZED) == ADI_ADRV904X_STATE_INITIALIZED) + { + recoveryAction = adrv904x_MultipleRegisterSpiVerify(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Multi Register Spi Verify Issue"); + goto cleanup; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ApiVersionGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_Version_t* const apiVersion) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, apiVersion, cleanup); + + apiVersion->majorVer = ADI_ADRV904X_CURRENT_MAJOR_VERSION; + apiVersion->minorVer = ADI_ADRV904X_CURRENT_MINOR_VERSION; + apiVersion->maintenanceVer = ADI_ADRV904X_CURRENT_MAINTENANCE_VERSION; + apiVersion->buildVer = ADI_ADRV904X_CURRENT_BUILD_VERSION; + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeviceRevGet(adi_adrv904x_Device_t* const device, + uint8_t* const siRevision) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t major = 0U; + uint8_t minor = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, siRevision, cleanup); + + *siRevision = 0U; + + /* Read product_id_1 from device to obtain silicon revision code. Comprised of 2 bitfields: major and minor */ + recoveryAction = adrv904x_Core_MaskRevisionMajor_BfGet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &major); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Major Silicon Revision Get Issue"); + goto cleanup; + } + + recoveryAction = adrv904x_Core_MaskRevisionMinor_BfGet( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &minor); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Minor Silicon Revision Get Issue"); + goto cleanup; + } + + /* Construct 8'b siRevision = {4'b major, 4'b minor}*/ + *siRevision = ( (major & 0xF) << 4) | (minor & 0xF); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ProductIdGet(adi_adrv904x_Device_t* const device, + uint8_t* const productId) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + static const uint8_t EFUSE_READY_DEBOUNCE_LIMIT = 30U; + uint8_t pidReady = 0U; + uint8_t retryCount = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); /* Lock Device & Log Function Entry */ + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, productId, cleanup); + + *productId = 0U; + + /* Check the status of the Efuse State machine. + * If Efuse is ready, read the product ID + * otherwise return an error + */ + for (retryCount = 0U; retryCount < EFUSE_READY_DEBOUNCE_LIMIT; ++retryCount) + { + recoveryAction = adrv904x_Core_EfuseProductIdReady_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &pidReady); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Efuse Product Id Ready status"); + goto cleanup; + } + + if (pidReady == 1U) + { + break; + } + } + + if (pidReady == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_DEVICE; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + pidReady, + "Efuse Hardware Not Ready. Repeated Attempts Failed"); + goto cleanup; + } + + /* Read the Product ID */ + recoveryAction = adrv904x_Core_EfuseProductId_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + productId); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Product ID Get Issue"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeviceCapabilityGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_CapabilityModel_t* const devCapability) +{ + /* local variables */ + static const uint32_t ADRV904X_TX_MAX_BW_KHZ = 800000U; + static const uint32_t ADRV9044NB_TX_MAX_BW_KHZ = 600000U; + static const uint32_t ADRV9049_TX_MAX_BW_KHZ = 600000U; + static const uint32_t ADRV9044WB_TX_MAX_BW_KHZ = 200000U; + static const uint32_t ADRV904X_RX_MAX_BW_KHZ = 600000U; + static const uint32_t ADRV9044WB_RX_MAX_BW_KHZ = 200000U; + static const uint32_t ADRV904X_ORX_MAX_BW_KHZ = 800000U; + static const uint32_t ADRV9044WB_ORX_MAX_BW_KHZ = 430000U; + static const uint32_t ADRV904X_RF_FREQ_RANGE_MIN_KHZ = 650000U; + static const uint32_t ADRV904X_RF_FREQ_RANGE_MAX_KHZ = 7100000U; + static const uint32_t ADRV904X_RF_MAX_IBW_MHZ = 400U; + static const uint32_t ADRV9044NB_RF_MAX_IBW_MHZ = 200U; + static const uint32_t ADRV9044WB_RF_MAX_IBW_MHZ = 600U; + static const uint32_t ADRV9049_RF_MAX_IBW_MHZ = 600U; + static const uint32_t ADRV9049_RF_FREQ_RANGE_MAX_KHZ = 6000000U; + + static const uint8_t EXTERNAL_LO_DISABLE_POSITION = 4U; + static const uint8_t INTERNAL_LO_DISABLE_POSITION = 2U; + + uint8_t idx = 0U; + uint8_t i = 0U; + uint8_t count = 0U; + uint8_t temp = 0U; + uint8_t productId = 0U; + uint8_t siRevision = 0U; + uint8_t internalLomask = 0U; + uint8_t externalLomask = 0U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); /* Lock Device & Log Function Entry */ + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, devCapability, cleanup); + + /* Read the Product ID */ + recoveryAction = adi_adrv904x_ProductIdGet(device, &productId); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Product ID Get Issue"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_DeviceRevGet(device, &siRevision); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Device Revision ID Get Issue"); + goto cleanup; + } + + devCapability->productId = productId; + devCapability->siRevision = siRevision; + + /* PID=0 for the EX an XX open feature products,other PID value have not filled in document. */ + switch (productId) + { + case 0U: + devCapability->txMaxBw_kHz = ADRV904X_TX_MAX_BW_KHZ; + devCapability->rxMaxBw_kHz = ADRV904X_RX_MAX_BW_KHZ; + devCapability->orxMaxBw_kHz = ADRV904X_ORX_MAX_BW_KHZ; + devCapability->rfFreqRangeMin_kHz = ADRV904X_RF_FREQ_RANGE_MIN_KHZ; + devCapability->rfFreqRangeMax_kHz = ADRV904X_RF_FREQ_RANGE_MAX_KHZ; + devCapability->rfMaxIbw_Mhz = ADRV904X_RF_MAX_IBW_MHZ; + devCapability->featureMask = ADI_ADRV904X_FEATUREOFF; + break; + + case 71U: /* AD80538 - 9049 */ + devCapability->txMaxBw_kHz = ADRV9049_TX_MAX_BW_KHZ; + devCapability->rxMaxBw_kHz = ADRV904X_RX_MAX_BW_KHZ; + devCapability->orxMaxBw_kHz = ADRV904X_ORX_MAX_BW_KHZ; + devCapability->rfFreqRangeMin_kHz = ADRV904X_RF_FREQ_RANGE_MIN_KHZ; + devCapability->rfFreqRangeMax_kHz = ADRV9049_RF_FREQ_RANGE_MAX_KHZ; + devCapability->rfMaxIbw_Mhz = ADRV9049_RF_MAX_IBW_MHZ; + devCapability->featureMask = ADI_ADRV904X_FEATUREOFF; + break; + + case 72U: /* AD80539 - 9049 */ + devCapability->txMaxBw_kHz = ADRV9049_TX_MAX_BW_KHZ; + devCapability->rxMaxBw_kHz = ADRV904X_RX_MAX_BW_KHZ; + devCapability->orxMaxBw_kHz = ADRV904X_ORX_MAX_BW_KHZ; + devCapability->rfFreqRangeMin_kHz = ADRV904X_RF_FREQ_RANGE_MIN_KHZ; + devCapability->rfFreqRangeMax_kHz = ADRV9049_RF_FREQ_RANGE_MAX_KHZ; + devCapability->rfMaxIbw_Mhz = ADRV9049_RF_MAX_IBW_MHZ; + devCapability->featureMask = ADI_ADRV904X_FEATUREOFF; + break; + + case 69U: /* 9044-NB */ + devCapability->txMaxBw_kHz = ADRV9044NB_TX_MAX_BW_KHZ; + devCapability->rxMaxBw_kHz = ADRV904X_RX_MAX_BW_KHZ; + devCapability->orxMaxBw_kHz = ADRV904X_ORX_MAX_BW_KHZ; + devCapability->rfFreqRangeMin_kHz = ADRV904X_RF_FREQ_RANGE_MIN_KHZ; + devCapability->rfFreqRangeMax_kHz = ADRV904X_RF_FREQ_RANGE_MAX_KHZ; + devCapability->rfMaxIbw_Mhz = ADRV9044NB_RF_MAX_IBW_MHZ; + devCapability->featureMask = ADI_ADRV904X_FEATUREOFF; + break; + + case 70U: /* 9044-WB */ + devCapability->txMaxBw_kHz = ADRV9044WB_TX_MAX_BW_KHZ; + devCapability->rxMaxBw_kHz = ADRV9044WB_RX_MAX_BW_KHZ; + devCapability->orxMaxBw_kHz = ADRV9044WB_ORX_MAX_BW_KHZ; + devCapability->rfFreqRangeMin_kHz = ADRV904X_RF_FREQ_RANGE_MIN_KHZ; + devCapability->rfFreqRangeMax_kHz = ADRV904X_RF_FREQ_RANGE_MAX_KHZ; + devCapability->rfMaxIbw_Mhz = ADRV9044WB_RF_MAX_IBW_MHZ; + devCapability->featureMask = ADI_ADRV904X_FEATUREOFF; + break; + + case 73U: /* AD80538 - 9049 */ + devCapability->txMaxBw_kHz = ADRV9049_TX_MAX_BW_KHZ; + devCapability->rxMaxBw_kHz = ADRV904X_RX_MAX_BW_KHZ; + devCapability->orxMaxBw_kHz = ADRV904X_ORX_MAX_BW_KHZ; + devCapability->rfFreqRangeMin_kHz = ADRV904X_RF_FREQ_RANGE_MIN_KHZ; + devCapability->rfFreqRangeMax_kHz = ADRV9049_RF_FREQ_RANGE_MAX_KHZ; + devCapability->rfMaxIbw_Mhz = ADRV9049_RF_MAX_IBW_MHZ; + devCapability->featureMask = ADI_ADRV904X_FEATUREOFF; + break; + + default: + break; + } + + for (idx = 0; idx < ADI_ADRV904X_MAX_FEATUREMASK ; idx++) + { + switch (idx) + { + case ADI_ADRV904X_FEATURE_SERIALIZER : + devCapability->serializerLaneEnableMask = device->initExtract.featureMask[idx] ^ 0xFFU; + break; + case ADI_ADRV904X_FEATURE_DESERIALIZER : + devCapability->deserializerLaneEnableMask = device->initExtract.featureMask[idx] ^ 0xFFU; + break; + case ADI_ADRV904X_FEATURE_TX: + temp = 1U; + count = 0U; + for (i = 0U; i < ADI_ADRV904X_MAX_TXCHANNELS; ++i) + { + if ((device->initExtract.featureMask[idx] & temp) == 0U) + { + ++count; + } + + temp = temp << 1U; + } + + devCapability->txNumber = count; + devCapability->txChannelMask = device->initExtract.featureMask[idx] ^ 0xFF; + break; + case ADI_ADRV904X_FEATURE_RX : + temp = 1U; + count = 0U; + for (i = 0U; i < ADI_ADRV904X_MAX_RX_ONLY; ++i) + { + if ((device->initExtract.featureMask[idx] & temp) == 0U) + { + ++count; + } + + temp = temp << 1U; + } + + devCapability->rxNumber = count; + devCapability->rxChannelMask = device->initExtract.featureMask[idx] ^ 0xFF; + break; + case ADI_ADRV904X_FEATURE_ORX_LOMASK : + temp = 1U; + count = 0U; + for (i = 0U; i < ADI_ADRV904X_MAX_ORX; ++i) + { + if ((device->initExtract.featureMask[idx] & temp) == 0U) + { + ++count; + } + + temp = temp << 1U; + } + + devCapability->orxNumber = count; + devCapability->orxChannelMask = device->initExtract.featureMask[idx] ^ 0x03U; + + internalLomask = (device->initExtract.featureMask[idx] >> INTERNAL_LO_DISABLE_POSITION) & 0x03U; + externalLomask = (device->initExtract.featureMask[idx] >> EXTERNAL_LO_DISABLE_POSITION) & 0x04U; + devCapability->loMask = (internalLomask | externalLomask) ^ 0x07U; + break; + + default: + break; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SpiDoutPadDriveStrengthSet(adi_adrv904x_Device_t* const device, + const uint8_t driveStrength) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + static const uint8_t SPI_DOUT_PAD_DRIVE_STRENGTH_THREE_WIRE_MODE_ADDR_OFFSET = 0x03U; + static const uint8_t SPI_DOUT_PAD_DRIVE_STRENGTH_THREE_WIRE_MODE_MASK = 0x02U; + + static const uint8_t SPI_DOUT_PAD_DRIVE_STRENGTH_FOUR_WIRE_MODE_ADDR_OFFSET = 0x07U; + static const uint8_t SPI_DOUT_PAD_DRIVE_STRENGTH_FOUR_WIRE_MODE_MASK = 0x01U; + + static const uint8_t DRIVE_STRENGTH_MAX = 0x03U; + uint8_t readBackVal = 0U; + uint8_t registerAddrOffset = 0U; + uint8_t registerMaskVal = 0U; + + static const uint8_t DS_ENUM_CONVERT[] = { 0U, 3U, 1U, 2U }; + + static const uint8_t DS_VALUE_LUT[] = { 0x0U, 0x3U, 0x9U, 0xFU }; + uint8_t dsValue = DS_VALUE_LUT[DS_ENUM_CONVERT[driveStrength]]; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); /* Lock Device & Log Function Entry */ + + if (driveStrength > DRIVE_STRENGTH_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, driveStrength, "Drive strength is above the allowed value."); + goto cleanup; + } + + if (device->spiSettings.fourWireMode == 1U) + { + registerAddrOffset = SPI_DOUT_PAD_DRIVE_STRENGTH_FOUR_WIRE_MODE_ADDR_OFFSET; + registerMaskVal = SPI_DOUT_PAD_DRIVE_STRENGTH_FOUR_WIRE_MODE_MASK; + } + else + { + registerAddrOffset = SPI_DOUT_PAD_DRIVE_STRENGTH_THREE_WIRE_MODE_ADDR_OFFSET; + registerMaskVal = SPI_DOUT_PAD_DRIVE_STRENGTH_THREE_WIRE_MODE_MASK; + } + + /* Configure SPI DOUT DS0 bit, we need to do RMW since its a single bit in DS0 register */ + recoveryAction = adrv904x_Core_PadDs0_BfGet(device, NULL, (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, registerAddrOffset, &readBackVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read DS0 bit"); + goto cleanup; + } + + if (ADRV904X_BF_EQUAL(dsValue, 0x01U)) + { + readBackVal |= (uint8_t) (1U << registerMaskVal); + } + else + { + readBackVal &= (uint8_t)(0U << registerMaskVal); + } + + recoveryAction = adrv904x_Core_PadDs0_BfSet(device, NULL, (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, registerAddrOffset, readBackVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write DS0 bit"); + goto cleanup; + } + + /* Configure SPI DOUT DS1 bit, we need to do RMW since its a single bit in DS1 register */ + recoveryAction = adrv904x_Core_PadDs1_BfGet(device, NULL, (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, registerAddrOffset, &readBackVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read DS1 bit"); + goto cleanup; + } + + if (ADRV904X_BF_EQUAL(dsValue, 0x02U)) + { + readBackVal |= (uint8_t) (1U << registerMaskVal); + } + else + { + readBackVal &= (uint8_t)(0U << registerMaskVal); + } + + recoveryAction = adrv904x_Core_PadDs1_BfSet(device, NULL, (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, registerAddrOffset, readBackVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write DS1 bit"); + goto cleanup; + } + + /* Configure SPI DOUT DS2 bit, we need to do RMW since its a single bit in DS2 register */ + recoveryAction = adrv904x_Core_PadDs2_BfGet(device, NULL, (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, registerAddrOffset, &readBackVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read DS2 bit"); + goto cleanup; + } + + if (ADRV904X_BF_EQUAL(dsValue, 0x04U)) + { + readBackVal |= (uint8_t) (1U << registerMaskVal); + } + else + { + readBackVal &= (uint8_t)(0U << registerMaskVal); + } + + recoveryAction = adrv904x_Core_PadDs2_BfSet(device, NULL, (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, registerAddrOffset, readBackVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write DS2 bit"); + goto cleanup; + } + + /* Configure SPI DOUT DS3 bit, we need to do RMW since its a single bit in DS3 register */ + recoveryAction = adrv904x_Core_PadDs3_BfGet(device, NULL, (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, registerAddrOffset, &readBackVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read DS3 bit"); + goto cleanup; + } + + if (ADRV904X_BF_EQUAL(dsValue, 0x08U)) + { + readBackVal |= (uint8_t) (1U << registerMaskVal); + } + else + { + readBackVal &= (uint8_t)(0U << registerMaskVal); + } + + recoveryAction = adrv904x_Core_PadDs3_BfSet(device, NULL, (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, registerAddrOffset, readBackVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write DS3 bit"); + goto cleanup; + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SpiHysteresisSet( adi_adrv904x_Device_t* const device, + const uint32_t enable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + if (enable > ADI_ENABLE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + enable, + "enable can only be 0 or 1"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_GpioHysteresisSet(device, ADI_ADRV904X_I_SPI_ENB, enable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + + recoveryAction = adi_adrv904x_GpioHysteresisSet(device, ADI_ADRV904X_I_SPI_CLK, enable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + + recoveryAction = adi_adrv904x_GpioHysteresisSet(device, ADI_ADRV904X_IO_SPI_DIO, enable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + + recoveryAction = adi_adrv904x_GpioHysteresisSet(device, ADI_ADRV904X_O_SPI_DO, enable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + + /* SPI Configuration Validation */ + +#if ADI_ADRV904X_SPI_HYSTERESIS_DEBUG + + recoveryAction = adi_adrv904x_GpioHysteresisGet(device, ADI_ADRV904X_I_SPI_ENB, &enableFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + + enableMask |= (enableFlag << 0U); + + recoveryAction = adi_adrv904x_GpioHysteresisGet(device, ADI_ADRV904X_I_SPI_CLK, &enableFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + + enableMask |= (enableFlag << 1U); + + recoveryAction = adi_adrv904x_GpioHysteresisGet(device, ADI_ADRV904X_IO_SPI_DIO, &enableFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + + enableMask |= (enableFlag << 2U); + + recoveryAction = adi_adrv904x_GpioHysteresisGet(device, ADI_ADRV904X_O_SPI_DO, &enableFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + + enableMask |= (enableFlag << 3U); + + if (((enable == ADI_ENABLE) ? 0x0FU : 0x00U) != enableMask) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + enableMask, + "Unexpected SPI Hysteresis Configuration"); + } + +#endif + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DigitalHysteresisSet( adi_adrv904x_Device_t* const device, + const uint32_t enable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t i = 0U; + uint8_t bfValue = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + for (i = 0U; i < ADRV904X_DIGITAL_PIN_GROUP_NUM; ++i) + { + recoveryAction = adrv904x_Core_PadSt_BfSet( device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + i, + ((enable == ADI_ENABLE) ? 0x3FU : 0x00U)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + } + + for (i = 0U; i < ADRV904X_DIGITAL_PIN_GROUP_NUM; ++i) + { + recoveryAction = adrv904x_Core_PadSt_BfGet( device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + i, + &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + + if (bfValue != ((enable == ADI_ENABLE) ? 0x3FU : 0x00U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + bfValue, + "Hysteresis Enable Issue"); + + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + i, + "Pad Group Number"); + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} \ No newline at end of file diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_cpu.c b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_cpu.c new file mode 100644 index 00000000000..2d15a04fc1e --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_cpu.c @@ -0,0 +1,2077 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_cpu.c +* \brief Contains CPU features related function implementation defined in +* adi_adrv904x_cpu.h +* +* ADRV904X API Version: 2.10.0.4 +*/ +#include "adi_adrv904x_cpu.h" + +#include "../../private/include/adrv904x_cpu.h" +#include "../../private/include/adrv904x_cpu_scratch_registers.h" +#include "../../private/include/adrv904x_reg_addr_macros.h" +#include "../../private/include/adrv904x_init.h" +#include "../../private/include/adrv904x_cpu_sw_bkpt_types.h" +#include "../../private/include/adrv904x_gpio.h" +#include "../../private/include/adrv904x_cpu_dfe_init_memory.h" +#include "../../private/include/adrv904x_dfe_memory.h" +#include "../../private/include/adrv904x_dfe_framework_cmd_t.h" +#include "../../private/include/adrv904x_dfe_cpu.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PUBLIC_CPU + +static adi_adrv904x_ErrAction_e adrv904x_CpuStackPtrWrite(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType, + const uint32_t* buf); + +static adi_adrv904x_ErrAction_e adrv904x_CpuBootAddrWrite(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType, + const uint32_t* buf); + +static uint32_t adrv904x_ChannelToChannelId(const adi_adrv904x_Channels_e channel); + +/*****************************************************************************/ +/***** Helper functions' definition ******************************************/ +/*****************************************************************************/ +static adi_adrv904x_ErrAction_e adrv904x_CpuStackPtrWrite(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType, + const uint32_t* buf) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const adi_adrv904x_CpuAddr_t* cpuAddr = NULL; + const uint8_t* bytes = (const uint8_t*) buf; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + cpuAddr = &(device->devStateInfo.cpu.cpuAddr[cpuType]); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cpuAddr); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, buf); + + ADRV904X_SPIWRITEBYTE_RETURN("CPU_STACK_PTR_BYTE_0", cpuAddr->stackPtrAddr, bytes[0U], recoveryAction); + ADRV904X_SPIWRITEBYTE_RETURN("CPU_STACK_PTR_BYTE_1", cpuAddr->stackPtrAddr + 1u, bytes[1U], recoveryAction); + ADRV904X_SPIWRITEBYTE_RETURN("CPU_STACK_PTR_BYTE_2", cpuAddr->stackPtrAddr + 2u, bytes[2U], recoveryAction); + ADRV904X_SPIWRITEBYTE_RETURN("CPU_STACK_PTR_BYTE_3", cpuAddr->stackPtrAddr + 3u, bytes[3U], recoveryAction); + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e adrv904x_CpuBootAddrWrite(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType, + const uint32_t* buf) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_CpuAddr_t* cpuAddr = NULL; + const uint8_t* bytes = (const uint8_t*) buf; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, buf); + + cpuAddr = &(device->devStateInfo.cpu.cpuAddr[cpuType]); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cpuAddr); + + ADRV904X_SPIWRITEBYTE_RETURN("CPU_BOOT_ADDR_BYTE_0", cpuAddr->bootAddr, bytes[0U], recoveryAction); + ADRV904X_SPIWRITEBYTE_RETURN("CPU_BOOT_ADDR_BYTE_1", cpuAddr->bootAddr + 1u, bytes[1U], recoveryAction); + ADRV904X_SPIWRITEBYTE_RETURN("CPU_BOOT_ADDR_BYTE_2", cpuAddr->bootAddr + 2u, bytes[2U], recoveryAction); + ADRV904X_SPIWRITEBYTE_RETURN("CPU_BOOT_ADDR_BYTE_3", cpuAddr->bootAddr + 3u, bytes[3U], recoveryAction); + + return recoveryAction; +} + +static uint32_t adrv904x_ChannelToChannelId(const adi_adrv904x_Channels_e channel) +{ + uint32_t div = 0U; + + for (div = 0U; div < 8U; div++) + { + if ((uint32_t)channel == (1U << div)) + { + break; + } + } + + return div; +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuImageWrite(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuType_e cpuType, + const uint32_t byteOffset, + const uint8_t binary[], + const uint32_t byteCount) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_CpuAddr_t *cpuAddr = NULL; + uint32_t address[1] = { 0U }; + uint32_t debugOffset = 0U; + uint32_t profileOffset = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, binary, cleanup); + + /* Verify cpuType */ + if ((cpuType != ADI_ADRV904X_CPU_TYPE_0) && + (cpuType != ADI_ADRV904X_CPU_TYPE_1)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuType, "Invalid CPU type"); + goto cleanup; + } + + if ((byteCount == 0U) || + ((byteCount & 3U) > 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, byteCount, "Invalid Byte Count; Multiple of 4 Required"); + goto cleanup; + } + + if ((byteOffset & 3U) > 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, byteCount, "Invalid Byte Offset; Multiple of 4 Required"); + goto cleanup; + } + + /* extraction of stack pointer and boot address from top of array */ + if (byteOffset == 0U) + { + if (byteCount < 8U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, byteCount, "Invalid Byte Count; Minimum of 8 Required"); + goto cleanup; + } + + recoveryAction = adrv904x_CpuStackPtrWrite(device, cpuType, (const uint32_t *)binary); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CPU Stack Pointer Write Issue"); + goto cleanup; + } + + recoveryAction = adrv904x_CpuBootAddrWrite(device, cpuType, (const uint32_t *)&binary[4U]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CPU Boot Address Write Issue"); + goto cleanup; + } + } + + if (cpuType == ADI_ADRV904X_CPU_TYPE_1) + { + /* extraction of profile address */ + profileOffset = ADRV904X_PM_DEVICE_PROFILE_PTR & ADI_ADRV904X_CPU_0_BINARY_IMAGE_FILE_SIZE_MASK; + if ((profileOffset >= byteOffset) && + (profileOffset < (byteOffset + byteCount - 4U))) + { + device->devStateInfo.cpu.devProfileAddr = adrv904x_CpuIntFromBytesGet(binary + profileOffset - byteOffset, 4U); + } + } + + if (cpuType == ADI_ADRV904X_CPU_TYPE_0) + { + /* extraction of debug config address */ + debugOffset = ADRV904X_PM_DEBUG_CONFIG_BUF & ADI_ADRV904X_CPU_0_BINARY_IMAGE_FILE_SIZE_MASK; + if ((debugOffset >= byteOffset) && + (debugOffset < (byteOffset + byteCount - 4U))) + { + device->devStateInfo.cpu.devDebugConfigAddr = adrv904x_CpuIntFromBytesGet(binary + debugOffset - byteOffset, 4U); + } + +#if ADI_ADRV904X_API_VERSION_RANGE_CHECK > 0 + + /* extraction of rev data */ + { + uint32_t revOffset = 0U; + adi_adrv904x_Version_t minVersion = { 0U, 0U, 0U, 0U }; + + revOffset = ADRV904X_PM_DEVICE_REV_DATA & ADI_ADRV904X_CPU_0_BINARY_IMAGE_FILE_SIZE_MASK; + if ((revOffset >= byteOffset) && + (revOffset < (byteOffset + byteCount - 4U))) + { + device->devStateInfo.cpu.fwVersion.majorVer = adrv904x_CpuIntFromBytesGet(binary + revOffset - byteOffset, 4U); + } + + revOffset += 4U; + if ((revOffset >= byteOffset) && + (revOffset < (byteOffset + byteCount - 4U))) + { + device->devStateInfo.cpu.fwVersion.minorVer = adrv904x_CpuIntFromBytesGet(binary + revOffset - byteOffset, 4U); + } + + revOffset += 4U; + if ((revOffset >= byteOffset) && + (revOffset < (byteOffset + byteCount - 4U))) + { + device->devStateInfo.cpu.fwVersion.maintenanceVer = adrv904x_CpuIntFromBytesGet(binary + revOffset - byteOffset, 4U); + } + + revOffset += 4U; + if ((revOffset >= byteOffset) && + (revOffset < (byteOffset + byteCount - 4U))) + { + device->devStateInfo.cpu.fwVersion.buildVer = adrv904x_CpuIntFromBytesGet(binary + revOffset - byteOffset, 4U); + + recoveryAction = adi_adrv904x_ApiVersionGet(device, &minVersion); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "ApiVersionGet issue"); + goto cleanup; + } + + recoveryAction = adrv904x_ApiVersionRangeCheck(device, &device->devStateInfo.cpu.fwVersion, &minVersion, &minVersion); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "ApiVersionRangeCheck issue"); + goto cleanup; + } + } + } + #endif + } + + /* get the particular processor's address map */ + cpuAddr = &(device->devStateInfo.cpu.cpuAddr[cpuType]); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuAddr, cleanup); + + address[0U] = cpuAddr->progStartAddr + byteOffset; + + recoveryAction = adi_adrv904x_RegistersByteWrite(device, + NULL, + address[0], + binary, + byteCount); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register Write Issue"); + goto cleanup; + } + + /* mark the image loaded */ + cpuAddr->enabled = ADI_TRUE; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuProfileWrite(adi_adrv904x_Device_t* const device, + const uint32_t byteOffset, + const uint8_t binary[], + const uint32_t byteCount) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t address[1] = { device->devStateInfo.cpu.devProfileAddr + byteOffset }; + uint32_t profileByteCount = 0U; + + uint32_t dfeProfileTempAddr = ADRV904X_DFE_CPU_INIT_ADDR_GET(deviceProfile); + address[0U] = dfeProfileTempAddr + byteOffset; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, binary, cleanup); + + if((byteCount == 0U) || + ((byteCount & 3U) > 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, byteCount, "Invalid Byte Count; Multiple of 4 Required"); + goto cleanup; + } + + if ((byteOffset & 3U) > 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, byteCount, "Invalid Byte Offset; Multiple of 4 Required"); + goto cleanup; + } + +#if ADI_ADRV904X_API_VERSION_RANGE_CHECK > 0 + /* extraction of rev data */ + { + uint32_t revOffset = 0U; + adi_adrv904x_Version_t minVersion = { 0U, 0U, 0U, 0U }; + + if ((revOffset >= byteOffset) && + (revOffset < (byteOffset + byteCount - 4U))) + { + device->devStateInfo.cpu.devProfileVersion.majorVer = adrv904x_CpuIntFromBytesGet(binary + revOffset - byteOffset, 4U); + } + + revOffset += 4U; + if ((revOffset >= byteOffset) && + (revOffset < (byteOffset + byteCount - 4U))) + { + device->devStateInfo.cpu.devProfileVersion.minorVer = adrv904x_CpuIntFromBytesGet(binary + revOffset - byteOffset, 4U); + } + + revOffset += 4U; + if ((revOffset >= byteOffset) && + (revOffset < (byteOffset + byteCount - 4U))) + { + device->devStateInfo.cpu.devProfileVersion.maintenanceVer = adrv904x_CpuIntFromBytesGet(binary + revOffset - byteOffset, 4U); + } + + revOffset += 4U; + if ((revOffset >= byteOffset) && + (revOffset < (byteOffset + byteCount - 4U))) + { + device->devStateInfo.cpu.devProfileVersion.buildVer = adrv904x_CpuIntFromBytesGet(binary + revOffset - byteOffset, 4U); + + + recoveryAction = adi_adrv904x_ApiVersionGet(device, &minVersion); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Device Profile Version Get Issue"); + goto cleanup; + } + + recoveryAction = adrv904x_ApiVersionRangeCheck(device, &device->devStateInfo.cpu.devProfileVersion, &minVersion, &minVersion); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Device Profile Version Range Check Issue"); + goto cleanup; + } + } + } +#endif + + profileByteCount = sizeof(adrv904x_DeviceProfile_t); + if (byteOffset + byteCount > profileByteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, byteCount, "Invalid Byte Count; Must be equal or less than Device Profile"); + goto cleanup; + } + else + { + profileByteCount = byteCount; + } + + recoveryAction = adi_adrv904x_RegistersByteWrite(device, + NULL, + address[0], + binary, + byteCount); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register Write Issue"); + goto cleanup; + } + cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuStart(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_CpuAddr_t *cpuAddr = NULL; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Set the start bit for CPU 0. CPU 0 will then start CPU 1 as required */ + cpuAddr = &(device->devStateInfo.cpu.cpuAddr[ADI_ADRV904X_CPU_TYPE_0]); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuAddr, cleanup); + + if (cpuAddr->enabled != ADI_FALSE) + { + /* Reset Mailbox */ + recoveryAction = adi_adrv904x_Register32Write( device, NULL, cpuAddr->mailboxGetAddr, 0xFFFFFFFFU, 0xFFFFFFFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Mailbox Reset Issue"); + goto cleanup; + } + + /* Clear Masking of Bus Errors before starting core */ + /* Using Direct SPI Write instead of AHB */ + recoveryAction = adrv904x_Core_Arm0MemHrespMask_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + ADI_DISABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CPU 0 Clear Mask Bus Error Issue"); + goto cleanup; + } + + /* Set CPU0 as the primary CPU (and CPU1 as secondary) */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_CPU_CPU0_IS_PRIMARY, + 0x1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Set CPU0 primary bitfield issue"); + goto cleanup; + } + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_CPU_CPU1_IS_PRIMARY, + 0x0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Set CPU1 primary bitfield issue"); + goto cleanup; + } + + /* Start */ + /* Using Direct SPI Write instead of AHB */ + recoveryAction = adrv904x_Core_Arm0M3Run_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + ADI_ENABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CPU 0 Start Issue"); + goto cleanup; + } + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuAddr->enabled, "CPU 0 FW image must be loaded"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuStartStatusCheck(adi_adrv904x_Device_t* const device, + const uint32_t timeout_us) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuBootStatus_e bootStatus = ADRV904X_CPU_BOOT_STATUS_POWER_UP; + uint32_t waitInterval_us = 0U; + uint32_t numEventChecks = 1U; + uint32_t eventCheck = 0U; + uint8_t cpuDebugLoaded = (device->devStateInfo.devState & ADI_ADRV904X_STATE_CPUDEBUGLOADED) ? 1U : 0U; + adi_adrv904x_CpuAddr_t* cpuAddr = NULL; + uint8_t tmpByte = 0U; + uint8_t bootFlag = 0U; + uint32_t errAddress = 0U; + uint32_t productId = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Determine the number of reads equivalent to the requested timeout */ + waitInterval_us = (ADI_ADRV904X_GETCPUBOOTUP_INTERVAL_US > timeout_us) ? timeout_us : ADI_ADRV904X_GETCPUBOOTUP_INTERVAL_US; + numEventChecks = (waitInterval_us == 0U) ? 1U : (timeout_us / waitInterval_us); + + /* Get CPU0's address map */ + cpuAddr = adrv904x_CpuAddrGet(&device->devStateInfo.cpu, ADI_ADRV904X_CPU_TYPE_0); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuAddr, cleanup); + + if (cpuAddr->enabled == ADI_FALSE) + { + /* The application has not called adi_adrv904x_CpuImageWrite successfully first */ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_CPU, + ADI_ADRV904X_ERRCODE_CPU_IMAGE_NOT_LOADED, + ADI_NO_VARIABLE, + recoveryAction); + goto cleanup; + } + + /* Note: There's no need to check CPU1 boot status. CPU0 will wait for CPU1 to boot before reporting + * it's own boot status as successful. + */ + + for (eventCheck = 0U; eventCheck <= numEventChecks; eventCheck++) + { + if (eventCheck == 0U) + { + /* Check CPU Boot has started */ + recoveryAction = adrv904x_Core_Arm0M3Run_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &bootFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + + if (bootFlag == ADI_FALSE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, bootFlag, "CPU 0 Boot Not Started; PreMcsInit NOK"); + goto cleanup; + } + } + + /* Get the CPU boot status */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_CPU_CPU0_BOOT_STATUS_SCRATCH_REG_ID, + &tmpByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "bootStatus read failed"); + goto cleanup; + } + + bootStatus = (adrv904x_CpuBootStatus_e)tmpByte; + + if (bootStatus == ADRV904X_CPU_BOOT_STATUS_POWER_UP || bootStatus == ADRV904X_CPU_BOOT_WAIT_FOR_CPUS) + { + /* Wait interval then check again */ + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_Wait_us(&device->common, waitInterval_us); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Wait#1 failed"); + goto cleanup; + } + continue; + } + else if ((cpuDebugLoaded == 1U) && (bootStatus == ADRV904X_CPU_JTAG_BUILD_STATUS_READY)) + { + /* Wait interval then check again */ + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_Wait_us(&device->common, waitInterval_us); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Wait#2 failed"); + goto cleanup; + } + continue; + } + else if ((cpuDebugLoaded == 0U) && (bootStatus == ADRV904X_CPU_JTAG_BUILD_STATUS_READY)) + { + /* CPU booted successfully into debug mode */ + device->devStateInfo.devState = (adi_adrv904x_ApiStates_e) (device->devStateInfo.devState | ADI_ADRV904X_STATE_CPUDEBUGLOADED); + break; + } + else if (bootStatus == ADRV904X_CPU_STATUS_READY) + { + /* CPU booted successfully to 'normal' mode */ + device->devStateInfo.devState = (adi_adrv904x_ApiStates_e)(device->devStateInfo.devState | ADI_ADRV904X_STATE_ALLCPUSLOADED); + break; + } + else + { + if (bootStatus == ADRV904X_CPU_BOOT_PID_PROFILE_MISMATCH_ERR) + { + /* Get Product ID for Additional Debug */ + if (ADI_ADRV904X_ERR_ACT_NONE == adi_adrv904x_Register32Read( device, + NULL, + ADRV904X_CPU_0_PM_EFUSE_SETTINGS_PTR, + &errAddress, + 0xFFFFFFFFU)) + { + (void) adi_adrv904x_Registers32Read(device, + NULL, + errAddress, + (uint32_t*) &productId, + NULL, + 1U); + productId = (uint8_t)productId; + } + + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_CPU_BOOT, + bootStatus, + productId, + recoveryAction); + } + else + { + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_CPU_BOOT, + bootStatus, + ADI_NO_VARIABLE, + recoveryAction); + } + + goto debug; + } + } + + if (eventCheck > numEventChecks) + { + /* Boot Timeout */ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_CPU, + ADI_ADRV904X_ERRCODE_CPU_BOOT_TIMEOUT, + ADI_NO_VARIABLE, + recoveryAction); + goto debug; + } + +debug: + adrv904x_CpuErrorDebugCheck(device); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuConfigSet( adi_adrv904x_Device_t* const device, + const uint32_t objId, + const uint16_t offset, + const uint8_t configDataSet[], + const uint32_t length) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + char txBuf[sizeof(adrv904x_CpuCmd_SetConfigMaxSize_t)]; + adrv904x_CpuCmd_SetConfig_t* const setInfo = (adrv904x_CpuCmd_SetConfig_t *)&txBuf; + adrv904x_CpuCmd_SetConfigResp_t cmdRsp = { ADRV904X_CPU_SYSTEM_SIMULATED_ERROR }; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + uint32_t i = 0U; + + adi_adrv904x_CpuType_e cpuType[] = { ADI_ADRV904X_CPU_TYPE_0, ADI_ADRV904X_CPU_TYPE_1 }; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, configDataSet, cleanup); + + if ((length > MAX_CONFIG_DATA_SIZE) || + (length == 0U)) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Length is zero or greater than MAX_CONFIG_DATA_SIZE"); + goto cleanup; + } + + ADI_LIBRARY_MEMSET(&txBuf[0U], 0, sizeof(txBuf)); + ADI_LIBRARY_MEMSET(&cmdRsp, 0, sizeof(adrv904x_CpuCmd_SetConfigResp_t)); + + /* Prepare the command payload */ + setInfo->objId = ADRV904X_HTOCL(objId); + setInfo->offset = ADRV904X_HTOCS(offset); + setInfo->length = ADRV904X_HTOCS((uint16_t)length); + + ADI_LIBRARY_MEMCPY((void*)((uint8_t*)setInfo + sizeof(adrv904x_CpuCmd_SetConfig_t)), configDataSet, length) ; + + for (i = 0U; i < (uint32_t)ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++i) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + cpuType[i], + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_CONFIG, + (void*)setInfo, + sizeof(adrv904x_CpuCmd_SetConfig_t)+length, + (void*)&cmdRsp, + sizeof(cmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(cmdRsp.cmdStatus, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuConfigGet( adi_adrv904x_Device_t* const device, + const uint32_t objId, + const uint16_t offset, + uint8_t configDataGet[], + const uint32_t length) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_GetConfig_t getInfo; + uint8_t rxBuf[sizeof(adrv904x_CpuCmd_GetConfigMaxSize_t)]; + adrv904x_CpuCmd_GetConfigResp_t* const getConfigRsp = (adrv904x_CpuCmd_GetConfigResp_t*)&rxBuf; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, configDataGet, cleanup); + + if (length > MAX_CONFIG_DATA_SIZE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Length is greater than MAX_CONFIG_DATA_SIZE"); + goto cleanup; + } + + ADI_LIBRARY_MEMSET(&rxBuf[0U], 0, sizeof(rxBuf)); + ADI_LIBRARY_MEMSET(&getInfo, 0, sizeof(adrv904x_CpuCmd_GetConfig_t)); + + /* Prepare the command payload */ + getInfo.objId = ADRV904X_HTOCL(objId); + getInfo.offset = ADRV904X_HTOCS(offset); + getInfo.length = ADRV904X_HTOCS((uint16_t)length); + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_GET_CONFIG, + (void*)&getInfo, + sizeof(getInfo), + (void*)getConfigRsp, + sizeof(adrv904x_CpuCmd_GetConfigResp_t) + length, + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(getConfigRsp->cmdStatus, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* Extract the command-specific response from the response payload */ + ADI_LIBRARY_MEMCPY((void*)configDataGet, (void*)((uint8_t*)getConfigRsp + sizeof(adrv904x_CpuCmd_GetConfigResp_t)), length); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuDebugModeEnable( adi_adrv904x_Device_t* const device, + const uint32_t enableKey) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_EnterDebugMode_t setInfo = { 0 }; + adrv904x_CpuCmd_EnterDebugModeResp_t cmdRsp = { ADRV904X_CPU_SYSTEM_SIMULATED_ERROR }; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + uint32_t i = 0U; + adi_adrv904x_CpuType_e cpuType[ADI_ADRV904X_CPU_TYPE_MAX_RADIO] = { ADI_ADRV904X_CPU_TYPE_0, ADI_ADRV904X_CPU_TYPE_1 }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Prepare the command payload */ + setInfo.debugModeKey = ADRV904X_HTOCL(enableKey); + + for (i = 0U; i < (uint32_t)ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++i) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + cpuType[i], + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_ENTER_DEBUG_MODE, + (void*)&setInfo, + sizeof(setInfo), + (void*)&cmdRsp, + sizeof(cmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(cmdRsp.cmdStatus, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuConfigUnlock( adi_adrv904x_Device_t* const device, + const uint32_t configKey) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_UnlockConfig_t setInfo = { 0 }; + adrv904x_CpuCmd_UnlockConfigResp_t cmdRsp = { ADRV904X_CPU_SYSTEM_SIMULATED_ERROR }; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + uint32_t i = 0U; + adi_adrv904x_CpuType_e cpuType[ADI_ADRV904X_CPU_TYPE_MAX_RADIO] = { ADI_ADRV904X_CPU_TYPE_0, ADI_ADRV904X_CPU_TYPE_1 }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Prepare the command payload */ + setInfo.configKey = ADRV904X_HTOCL(configKey); + + for (i = 0U; i < (uint32_t)ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++i) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + cpuType[i], + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_UNLOCK_CONFIG, + (void*)&setInfo, + sizeof(setInfo), + (void*)&cmdRsp, + sizeof(cmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(cmdRsp.cmdStatus, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuControlCmdExec(adi_adrv904x_Device_t* const device, + const uint32_t objId, + const uint16_t cpuCmd, + const adi_adrv904x_Channels_e channel, + const uint8_t cpuCtrlData[], + const uint32_t lengthSet, + uint32_t* const lengthResp, + uint8_t ctrlResp[], + const uint32_t lengthGet) +{ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + char txBuf[sizeof(adrv904x_CpuCmd_SetCtrlMaxSize_t)]; + char rxBuf[sizeof(adrv904x_CpuCmd_SetCtrlRespMaxSize_t)]; + adrv904x_CpuCmd_SetCtrl_t* const setInfo = (adrv904x_CpuCmd_SetCtrl_t*)&txBuf; + adrv904x_CpuCmd_SetCtrlResp_t* const cmdRsp = (adrv904x_CpuCmd_SetCtrlResp_t*)&rxBuf; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + uint32_t fwChannel = 0U; + adi_adrv904x_CpuType_e cpuType = ADI_ADRV904X_CPU_TYPE_UNKNOWN; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + if (lengthSet > 0U) + { + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuCtrlData, cleanup); + } + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, ctrlResp, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, lengthResp, cleanup); + + if (objId > 0xFFU) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, objId, "Ctrl command - Invalid Object ID."); + goto cleanup; + } + + /* Allow lengthSet 0 for some use cases (RX_QEC) */ + if (lengthSet > MAX_CTRL_DATA_SIZE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, lengthSet, "Ctrl command length is greater than MAX_CTRL_DATA_SIZE"); + goto cleanup; + } + + if (lengthGet <= 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, lengthGet, "Ctrl command response buffer size must be greater than 0"); + goto cleanup; + } + + /* Get the CPU that is responsible for the requested channel */ + recoveryAction = adrv904x_CpuChannelMappingGet(device, + channel, + (adrv904x_CpuObjectId_e)objId, + &cpuType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "Invalid channelMask provided"); + goto cleanup; + } + else + { + fwChannel = adrv904x_ChannelToChannelId(channel); + } + + ADI_LIBRARY_MEMSET(&txBuf[0U], 0, sizeof(txBuf)); + ADI_LIBRARY_MEMSET(&rxBuf[0U], 0, sizeof(rxBuf)); + + /* Prepare the command payload */ + setInfo->objId = ADRV904X_HTOCL(objId); + setInfo->ctrlCmd = ADRV904X_HTOCS(cpuCmd); + setInfo->channelNum = ADRV904X_HTOCL(fwChannel); + setInfo->length = ADRV904X_HTOCS((uint16_t)lengthSet); + + if (lengthSet > 0U) + { + ADI_LIBRARY_MEMCPY((void*)((uint8_t*)setInfo + sizeof(adrv904x_CpuCmd_SetCtrl_t)), cpuCtrlData, lengthSet); + } + + /* Send command and receive response. + * Since we don't know how much data the CPU will send back, + * we have to request MAX_CONFIG_DATA_SIZE bytes. We will only + * copy out cmdRsp->length bytes of it below. + */ + recoveryAction = adrv904x_CpuCmdSend( device, + cpuType, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_CTRL, + (void*)setInfo, + sizeof(adrv904x_CpuCmd_SetCtrl_t) + lengthSet, + (void*)cmdRsp, + sizeof(adrv904x_CpuCmd_SetCtrlResp_t) + MAX_CONFIG_DATA_SIZE, + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(cmdRsp->cmdStatus, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* Read the response data from the CPU, if the caller's buffer can hold it. */ + *lengthResp = ADRV904X_CTOHS(cmdRsp->length); + if (*lengthResp <= lengthGet) + { + ADI_LIBRARY_MEMSET(ctrlResp, 0, lengthGet); + ADI_LIBRARY_MEMCPY(ctrlResp, (void*)((uint8_t*)cmdRsp + sizeof(adrv904x_CpuCmd_SetCtrlResp_t)), *lengthResp); + } + else + { + *lengthResp = 0U; + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, lengthGet, "Ctrl Cmd Response size is greater than response buffer size"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuLogFilterSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuLogEvent_e eventFilter, + const adi_adrv904x_CpuLogCpuId_e cpuIdFilter, + const adi_adrv904x_CpuLogObjIdFilter_t* const objIdFilter) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t cpuTypeIdx = 0U; + adrv904x_CpuCmd_SetLogFilters_t setLogCmd; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, objIdFilter, cleanup); + + ADI_LIBRARY_MEMSET(&setLogCmd, 0, sizeof(setLogCmd)); + + if ((eventFilter < ADI_ADRV904X_CPU_LOG_EVENT_ERROR) || + (eventFilter > ADI_ADRV904X_CPU_LOG_EVENT_INVALID)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, eventFilter, "Invalid eventFilter provided."); + goto cleanup; + } + + /* cpuIdEventFilter == 0 is a valid parameter and is not checked here */ + if (((cpuIdFilter & ~ADI_ADRV904X_CPU_LOG_CPU_ID_ALL) != 0U) && + (cpuIdFilter != ADI_ADRV904X_CPU_LOG_CPU_ID_INVALID)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuIdFilter, "Invalid cpuIdFilter provided."); + goto cleanup; + } + + /* It is not possible to validate objIdFilter->objId (the list of Object IDs is sparse in the firmware) */ + if ((objIdFilter->objIdFilterEnable != ADI_ADRV904X_CPU_LOG_OBJ_ID_ENABLE) && + (objIdFilter->objIdFilterEnable != ADI_ADRV904X_CPU_LOG_OBJ_ID_DISABLE) && + (objIdFilter->objIdFilterEnable != ADI_ADRV904X_CPU_LOG_OBJ_ID_INVALID)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, objIdFilter->objIdFilterEnable, "Invalid objIdFilter.objIdFilterEnable provided."); + goto cleanup; + } + + /* Build the command */ + setLogCmd.logEventFilter = (adi_adrv904x_CpuLogEvent_t)eventFilter; + setLogCmd.cpuIdFilter = (adi_adrv904x_CpuLogCpuId_t)cpuIdFilter; + setLogCmd.objIdFilter.objIdFilterEnable = objIdFilter->objIdFilterEnable; + setLogCmd.objIdFilter.objId = ADRV904X_HTOCL(objIdFilter->objId); + + /* For each CPU, send the set-log-filters command and verify the response */ + for (cpuTypeIdx = (uint32_t) ADI_ADRV904X_CPU_TYPE_0; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_LOG_FILTERS, + &setLogCmd, + sizeof(setLogCmd), + NULL, + 0, + NULL); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CPU Log Filters Command Send Issue"); + goto cleanup; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuDebugCmdExec( adi_adrv904x_Device_t* const device, + const uint32_t objId, + const uint16_t cpuCmd, + const adi_adrv904x_Channels_e channel, + const uint8_t cpuDebugData[], + const uint32_t lengthSet, + uint32_t* const lengthResp, + uint8_t debugResp[], + const uint32_t lengthGet) +{ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + char txBuf[sizeof(adrv904x_CpuCmd_DebugMaxSize_t)]; + char rxBuf[sizeof(adrv904x_CpuCmd_DebugRespMaxSize_t)]; + adrv904x_CpuCmd_Debug_t* const debugInfo = (adrv904x_CpuCmd_Debug_t*)&txBuf; + adrv904x_CpuCmd_DebugResp_t* const cmdRsp = (adrv904x_CpuCmd_DebugResp_t*)&rxBuf; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_NO_ERROR; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + uint32_t fwChannel = 0U; + adi_adrv904x_CpuType_e cpuType = ADI_ADRV904X_CPU_TYPE_UNKNOWN; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuDebugData, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, debugResp, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, lengthResp, cleanup); + + if (objId > 0xFFU) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, objId, "Cpu Debug command - Invalid Object ID."); + goto cleanup; + } + + if (lengthSet > MAX_DEBUG_DATA_SIZE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, lengthSet, "Cpu Debug command length is greater than MAX_CTRL_DATA_SIZE"); + goto cleanup; + } + + if (lengthSet <= 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, lengthSet, "Cpu Debug command length must be greater than 0"); + goto cleanup; + } + + if (lengthGet <= 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, lengthGet, "Cpu Debug command response buffer size must be greater than 0"); + goto cleanup; + } + + /* Get the CPU that is responsible for the requested channel */ + recoveryAction = adrv904x_CpuChannelMappingGet(device, + channel, + (adrv904x_CpuObjectId_e)objId, + &cpuType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "Invalid channelMask provided"); + goto cleanup; + } + else + { + fwChannel = adrv904x_ChannelToChannelId(channel); + } + + ADI_LIBRARY_MEMSET(&txBuf[0U], 0, sizeof(txBuf)); + ADI_LIBRARY_MEMSET(&rxBuf[0U], 0, sizeof(rxBuf)); + + /* Prepare the command payload */ + debugInfo->objId = ADRV904X_HTOCL(objId); + debugInfo->debugCmd = ADRV904X_HTOCS(cpuCmd); + debugInfo->channelNum = ADRV904X_HTOCL(fwChannel); + debugInfo->length = ADRV904X_HTOCS((uint16_t)lengthSet); + + ADI_LIBRARY_MEMCPY((void*)((uint8_t*)debugInfo + sizeof(adrv904x_CpuCmd_Debug_t)), cpuDebugData, lengthSet); + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + cpuType, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_DEBUG, + (void*)debugInfo, + sizeof(adrv904x_CpuCmd_Debug_t)+lengthSet, + (void*)cmdRsp, + sizeof(adrv904x_CpuCmd_DebugResp_t), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(cmdRsp->cmdStatus, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + if (cmdRsp->length <= lengthGet) + { + ADI_LIBRARY_MEMSET(debugResp, 0, lengthGet); + *lengthResp = cmdRsp->length; + ADI_LIBRARY_MEMCPY(debugResp, ((adrv904x_CpuCmd_DebugMaxSize_t *)cmdRsp)->debugData, *lengthResp); + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, lengthGet, "Debug Cmd Response size is greater than response buffer size"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +static adi_adrv904x_ErrAction_e adrv904x_SendSysStatusCmd(adi_adrv904x_Device_t* const device, + const adrv904x_CpuCmd_SysStatusType_e type, + const adrv904x_CpuObjectId_e sysObjId, + const adi_adrv904x_Channels_e channel) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + char txBuf[ADRV904X_CPU_CMD_MAX_SIZE_BYTES]; + adrv904x_CpuCmd_t* pCmd = NULL; + adrv904x_CpuCmd_GetSysStatus_t* pSysStatusCmd = NULL; + adi_adrv904x_CpuType_e cpuType = ADI_ADRV904X_CPU_TYPE_UNKNOWN; + + /* Get the CPU that is responsible for the requested channel */ + recoveryAction = adrv904x_CpuChannelMappingGet(device, channel, sysObjId, &cpuType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid channel-to-CPU mapping"); + return recoveryAction; + } + + ADI_LIBRARY_MEMSET(&txBuf, 0, sizeof(txBuf)); + + /* Build the CPU command */ + pCmd = (adrv904x_CpuCmd_t*)txBuf; + pSysStatusCmd = (adrv904x_CpuCmd_GetSysStatus_t*)((uint8_t*)pCmd + sizeof(adrv904x_CpuCmd_t)); + pSysStatusCmd->type = (adrv904x_CpuCmd_SysStatusType_t)type; + pSysStatusCmd->sysObjId = ADRV904X_HTOCL(sysObjId); + pSysStatusCmd->channelNum = ADRV904X_HTOCL(adrv904x_ChannelToChannelId(channel)); + + /* Then send it */ + recoveryAction = adrv904x_CpuCmdWrite(device, cpuType, ADRV904X_LINK_ID_0, ADRV904X_CPU_CMD_ID_GET_SYS_STATUS, pCmd, sizeof(adrv904x_CpuCmd_GetSysStatus_t)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error sending GET_SYS_STATUS command."); + return recoveryAction; + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e adrv904x_GetSysStatusCmdResp(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + const size_t sysStatusSize, + void* const pRxBuf, + const void** const pSysStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmdId_t cmdId = 0U; + adrv904x_CpuCmdResp_t* pCmd = (adrv904x_CpuCmdResp_t*)pRxBuf; + adrv904x_CpuCmd_GetSysStatusResp_t* pCmdResp = (adrv904x_CpuCmd_GetSysStatusResp_t*)((uint8_t*)pCmd + sizeof(adrv904x_CpuCmdResp_t)); + adi_adrv904x_CpuType_e cpuType = ADI_ADRV904X_CPU_TYPE_UNKNOWN; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cmdErrorCode = ADRV904X_CPU_NO_ERROR; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, pRxBuf); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, pSysStatus); + + /* Get the CPU that is responsible for the requested channel */ + recoveryAction = adrv904x_CpuChannelMappingGet(device, channel, ADRV904X_CPU_OBJID_SYSTEM_END, &cpuType); /* use any objId other than ORX */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid channel-to-CPU mapping"); + return recoveryAction; + } + + /* Read the response from the CPU */ + recoveryAction = adrv904x_CpuCmdRespRead(device, cpuType, ADRV904X_LINK_ID_0, &cmdId, pCmd, sizeof(adrv904x_CpuCmd_GetSysStatusResp_t) + sysStatusSize, &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + if (cmdStatus == ADRV904X_CPU_CMD_STATUS_CMD_FAILED) + { + /* If the command failed for a command-specific reason, extract the command status code and log the error. */ + cmdErrorCode = (adrv904x_CpuErrorCode_e)ADRV904X_CTOHL((uint32_t)pCmdResp->cmdStatus); + ADI_ERROR_REPORT(&device->common, ADI_ADRV904X_ERRSRC_API, ADI_COMMON_ERRCODE_API, recoveryAction, cmdErrorCode, "GET_SYS_STATUS command failed."); + return recoveryAction; + } + else + { + /* Otherwise log a generic command failed error */ + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error getting response for GET_SYS_STATUS command."); + return recoveryAction; + } + } + + /* Find the sys status in the response payload, and set the caller's pointer to it. */ + *pSysStatus = (void*)((uint8_t*)pCmdResp + sizeof(adrv904x_CpuCmd_GetSysStatusResp_t)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuChannelMappingGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_CpuType_e cpuTypes[], + const uint8_t numSerdesLanes) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + adi_adrv904x_CpuType_e cpuType = ADI_ADRV904X_CPU_TYPE_UNKNOWN; + uint32_t chanSel = 0U; + uint8_t i = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(cpuTypes); + + + if (ADI_ADRV904X_MAX_SERDES_LANES > numSerdesLanes) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numSerdesLanes, "Invalid size of cpuTypes array. Should be equal or smaller to ADI_ADRV904X_MAX_SERDES_LANES"); + goto cleanup; + } + + for (i = 0U; i < numSerdesLanes; i++) + { + /* Get the CPU that is responsible for the requested lane. */ + chanSel = (uint32_t)(1U << i); + recoveryAction = adrv904x_CpuChannelMappingGet(device, (adi_adrv904x_Channels_e)(chanSel), ADRV904X_CPU_OBJID_IC_SERDES, &cpuType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to retrieve cpuType for a particular Serdes lane."); + goto cleanup; + } + + cpuTypes[i] = cpuType; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuSysPvtStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + const uint32_t objId, + uint8_t cpuSysStatusGet[], + const uint32_t length) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const void* pSysStatus = NULL; + const void** const ppSysStatus = &pSysStatus; + char rxBuf[ADRV904X_CPU_CMD_RESP_MAX_SIZE_BYTES]; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuSysStatusGet, cleanup); + + if ((channel != ADI_ADRV904X_CH0) && + (channel != ADI_ADRV904X_CH1) && + (channel != ADI_ADRV904X_CH2) && + (channel != ADI_ADRV904X_CH3) && + (channel != ADI_ADRV904X_CH4) && + (channel != ADI_ADRV904X_CH5) && + (channel != ADI_ADRV904X_CH6) && + (channel != ADI_ADRV904X_CH7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "channel parameter is invalid."); + goto cleanup; + } + + if ((objId <= (uint32_t) ADRV904X_CPU_OBJID_IC_END) || + ((objId >= (uint32_t) ADRV904X_CPU_OBJID_TC_START) && + (objId <= (uint32_t) ADRV904X_CPU_OBJID_TC_END)) || + (objId > (uint32_t) ADRV904X_CPU_OBJID_SYSTEM_END)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, length, "objId parameter is invalid."); + goto cleanup; + } + + if (length == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, length, "Length is zero."); + goto cleanup; + } + + /* Send the system status get command to the CPU */ + recoveryAction = adrv904x_SendSysStatusCmd(device, ADRV904X_CPU_CMD_SYS_STATUS_PRIVATE, (adrv904x_CpuObjectId_e)objId, channel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SendCalStatusCmd failed"); + goto cleanup; + } + + /* Get the response from the CPU */ + recoveryAction = adrv904x_GetSysStatusCmdResp(device, channel, length, (void*)&rxBuf[0], ppSysStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GetCalStatusCmd failed"); + goto cleanup; + } + + if (pSysStatus == NULL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GET_CAL_STATUS command failed"); + goto cleanup; + } + + ADI_LIBRARY_MEMCPY(cpuSysStatusGet, pSysStatus, length); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +static adi_adrv904x_ErrAction_e adrv904x_SysStatusGet(adi_adrv904x_Device_t* const device, + const adrv904x_CpuObjectId_e objId, + const adi_adrv904x_Channels_e channel, + adi_adrv904x_CpuSysStatus_t* const status) +{ + const adi_adrv904x_CpuSysStatus_t* pSysStatus = NULL; + const adi_adrv904x_CpuSysStatus_t** const ppSysStatus = &pSysStatus; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + char rxBuf[ADRV904X_CPU_CMD_RESP_MAX_SIZE_BYTES]; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, status); + + /* Send the sys status get command to the CPU */ + recoveryAction = adrv904x_SendSysStatusCmd(device, ADRV904X_CPU_CMD_SYS_STATUS_PUBLIC, objId, channel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SendSysStatusCmd failed"); + return recoveryAction; + } + + ADI_LIBRARY_MEMSET(&rxBuf, 0, sizeof(rxBuf)); + + /* Get the response from the CPU */ + recoveryAction = adrv904x_GetSysStatusCmdResp(device, channel, sizeof(adi_adrv904x_CpuSysStatus_t), (void*)&rxBuf[0], (const void** const)ppSysStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GetSysStatusCmdResp failed"); + return recoveryAction; + } + + if (pSysStatus != NULL) + { + /* Translate the response from the CPU */ + status->errorCode = ADRV904X_CTOHL(pSysStatus->errorCode); + status->placeHolder = ADRV904X_CTOHL(pSysStatus->placeHolder); + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuSysStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + const uint32_t objId, + adi_adrv904x_CpuSysStatus_t* const cpuSysStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuSysStatus, cleanup); + + if ((channel != ADI_ADRV904X_CH0) && + (channel != ADI_ADRV904X_CH1) && + (channel != ADI_ADRV904X_CH2) && + (channel != ADI_ADRV904X_CH3) && + (channel != ADI_ADRV904X_CH4) && + (channel != ADI_ADRV904X_CH5) && + (channel != ADI_ADRV904X_CH6) && + (channel != ADI_ADRV904X_CH7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "channel parameter is invalid."); + goto cleanup; + } + + if ((objId <= (uint32_t) ADRV904X_CPU_OBJID_IC_END) || + ((objId >= (uint32_t) ADRV904X_CPU_OBJID_TC_START) && + (objId <= (uint32_t) ADRV904X_CPU_OBJID_TC_END)) || + (objId > (uint32_t) ADRV904X_CPU_OBJID_SYSTEM_END)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, objId, "objId parameter is invalid."); + goto cleanup; + } + + /* Use the common system status get handler to get the data from the CPU */ + recoveryAction = adrv904x_SysStatusGet(device, (adrv904x_CpuObjectId_e)objId, channel, cpuSysStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error getting cpu system status."); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuFwVersionGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_CpuFwVersion_t* const cpuFwVersion) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t verCpu[5U] = { 0U }; + adi_adrv904x_CpuAddr_t* cpuAddr = NULL; + adi_adrv904x_CpuType_e cpuType = ADI_ADRV904X_CPU_TYPE_0; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuFwVersion, cleanup); + + if ((device->devStateInfo.devState & ADI_ADRV904X_STATE_CPU0LOADED) != ADI_ADRV904X_STATE_CPU0LOADED || + (device->devStateInfo.devState & ADI_ADRV904X_STATE_CPU1LOADED) != ADI_ADRV904X_STATE_CPU1LOADED) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CPU binary must be loaded before getting fw version"); + goto cleanup; + } + + /* Read the fw version from CPU */ + cpuType = ADI_ADRV904X_CPU_TYPE_0; + cpuAddr = adrv904x_CpuAddrGet(&device->devStateInfo.cpu, cpuType); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuAddr, cleanup); + recoveryAction = adi_adrv904x_Registers32Read(device, NULL, cpuAddr->versionAddr, verCpu, NULL, 5U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading CpuFwVersion CPU registers"); + goto cleanup; + } + + /* Store the fw Version */ + cpuFwVersion->commVer.majorVer = verCpu[0U]; + cpuFwVersion->commVer.minorVer = verCpu[1U]; + cpuFwVersion->commVer.maintenanceVer = verCpu[2U]; + cpuFwVersion->commVer.buildVer = verCpu[3U]; + + cpuFwVersion->cpuFwBuildType = (adi_adrv904x_CpuFwBuildType_e)(verCpu[4U] & (ADI_ADRV904X_CPU_FW_BUILD_DEBUG | ADI_ADRV904X_CPU_FW_BUILD_RELEASE | ADI_ADRV904X_CPU_FW_TRBLSHOOT)); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_HealthMonitorCpuStatusGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_HealthMonitorCpuStatus_t* const healthMonitorStatus) +{ + static const uint32_t CPU_HEALTH_STATUS_ADDR_MASK = 0xFFFFFFFFU; + const uint32_t BYTE_COUNT = sizeof(adi_adrv904x_HealthMonitorCpuStatus_t); + const uint32_t WORD_COUNT = ((BYTE_COUNT + 3U) / 4U); + uint32_t readData[WORD_COUNT]; + ADI_LIBRARY_MEMSET(readData, 0, 4U * WORD_COUNT); + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t cpuHealthStatusAddr = 0U; + adi_adrv904x_HealthMonitorCpuStatus_t* tmpStatus = NULL; + + /* Verify inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, healthMonitorStatus, cleanup); + + /* Clear memory for return data */ + ADI_LIBRARY_MEMSET(healthMonitorStatus, 0, sizeof(adi_adrv904x_HealthMonitorCpuStatus_t)); + + /* Read back cpu health status address */ + recoveryAction = adi_adrv904x_Register32Read(device, NULL, (uint32_t)(ADRV904X_PM_HEALTH_STATUS_PTR), &cpuHealthStatusAddr, CPU_HEALTH_STATUS_ADDR_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading cpu health status address"); + goto cleanup; + } + + /* Readback via shared cpu memory location */ + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, cpuHealthStatusAddr, (uint8_t *)readData, NULL, BYTE_COUNT); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading CPU Health Monitor Status"); + goto cleanup; + } + + /* Re-interrupt readData as the CPU byte-ordered struct. May leave some unused bytes at the tail of the read data. */ + tmpStatus = (adi_adrv904x_HealthMonitorCpuStatus_t*)readData; + + /* Correct byte order and copy to return struct */ + healthMonitorStatus->cpu0.initCalStatusMask = ADRV904X_CTOHLL(tmpStatus->cpu0.initCalStatusMask); + healthMonitorStatus->cpu0.numInitCalErrors = ADRV904X_CTOHL(tmpStatus->cpu0.numInitCalErrors); + healthMonitorStatus->cpu0.trackingCalStatusMask = ADRV904X_CTOHLL(tmpStatus->cpu0.trackingCalStatusMask); + healthMonitorStatus->cpu0.numTrackingCalErrors = ADRV904X_CTOHL(tmpStatus->cpu0.numTrackingCalErrors); + healthMonitorStatus->cpu0.numSystemErrors = ADRV904X_CTOHL(tmpStatus->cpu0.numSystemErrors); + healthMonitorStatus->cpu0.numSystemWarnings = ADRV904X_CTOHL(tmpStatus->cpu0.numSystemWarnings); + healthMonitorStatus->cpu0.cpuUsage = (adi_adrv904x_CpuUsage_e)(tmpStatus->cpu0.cpuUsage); + + healthMonitorStatus->cpu1.initCalStatusMask = ADRV904X_CTOHLL(tmpStatus->cpu1.initCalStatusMask); + healthMonitorStatus->cpu1.numInitCalErrors = ADRV904X_CTOHL(tmpStatus->cpu1.numInitCalErrors); + healthMonitorStatus->cpu1.trackingCalStatusMask = ADRV904X_CTOHLL(tmpStatus->cpu1.trackingCalStatusMask); + healthMonitorStatus->cpu1.numTrackingCalErrors = ADRV904X_CTOHL(tmpStatus->cpu1.numTrackingCalErrors); + healthMonitorStatus->cpu1.numSystemErrors = ADRV904X_CTOHL(tmpStatus->cpu1.numSystemErrors); + healthMonitorStatus->cpu1.numSystemWarnings = ADRV904X_CTOHL(tmpStatus->cpu1.numSystemWarnings); + healthMonitorStatus->cpu1.cpuUsage = (adi_adrv904x_CpuUsage_e)(tmpStatus->cpu1.cpuUsage); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuCheckException(adi_adrv904x_Device_t* const device, + uint32_t* const isException) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t cpuIdx = 0U; + uint32_t excpFlag = 0U; + const uint32_t cpuExceptionAddr[ADI_ADRV904X_CPU_TYPE_MAX_RADIO] = { ADRV904X_CPU_0_PM_EXCEPTION_FLAG, ADRV904X_CPU_1_PM_EXCEPTION_FLAG }; /* Exception Flag Memory */ + + /* Verify inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, isException, cleanup); + + *isException = 0U; + + /* Check exception status of ARM CPUs*/ + for (cpuIdx = ADI_ADRV904X_CPU_TYPE_0; cpuIdx < ADI_ADRV904X_CPU_TYPE_MAX_RADIO; cpuIdx++) + { + recoveryAction = adi_adrv904x_Register32Read(device, NULL, cpuExceptionAddr[cpuIdx], &excpFlag, 0xFFFFFFFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to Read Cpu Exception memory"); + goto cleanup; + } + if (excpFlag != 0U) + { + *isException |= (1U << cpuIdx); + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +static adi_adrv904x_ErrAction_e GetBreakPointTableIndexFromObjId(adi_adrv904x_Device_t* const device, + uint32_t objId, + uint8_t * tableId, + uint32_t * tableBaseAddr) +{ + static const uint32_t BREAKPOINT_TABLE_ADDR_MASK = 0xFFFFFFFFU; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t breakpointRowAddr = 0U; + uint32_t breakpointObjId = 0U; + uint32_t index = 0U; + + /* Read back global breakpoint table address */ + recoveryAction = adi_adrv904x_Register32Read(device, NULL, (uint32_t)(ADRV904X_PM_SW_BKPT_TABLE_PTR), tableBaseAddr, BREAKPOINT_TABLE_ADDR_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading breakpoint table address"); + return recoveryAction; + } + + for (index = 0U; index < ADRV904X_CPU_BKPT_TABLE_SIZE; index++) + { + breakpointRowAddr = (*tableBaseAddr) + (uint32_t)(sizeof(adi_adrv904x_SwBreakPointEntry_t)) * (uint32_t)index; + recoveryAction = adi_adrv904x_Register32Read(device, NULL, breakpointRowAddr, &breakpointObjId, BREAKPOINT_TABLE_ADDR_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading breakpoint object id from table"); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + if (breakpointObjId == objId) + { + *tableId = index; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + } + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e GetBreakPointObjIdFromTableIndex(adi_adrv904x_Device_t* const device, + uint8_t tableId, + uint32_t * objId) +{ + static const uint32_t BREAKPOINT_TABLE_ADDR_MASK = 0xFFFFFFFFU; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t breakPointTableObjIdAddr = 0U; + uint32_t tableBaseAddr = 0U; + + /* Read back global breakpoint table address */ + recoveryAction = adi_adrv904x_Register32Read(device, NULL, (uint32_t)(ADRV904X_PM_SW_BKPT_TABLE_PTR), &tableBaseAddr, BREAKPOINT_TABLE_ADDR_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading breakpoint table address"); + return recoveryAction; + } + + breakPointTableObjIdAddr = tableBaseAddr + (uint32_t)tableId * (uint32_t)(sizeof(adi_adrv904x_SwBreakPointEntry_t)); + recoveryAction = adi_adrv904x_Register32Read(device, NULL, breakPointTableObjIdAddr, objId, BREAKPOINT_TABLE_ADDR_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading breakpoint object id from table"); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_BreakpointSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_SwBreakPointEntry_t * breakPointCfg) +{ + static const uint32_t BREAKPOINT_TABLE_ADDR_MASK = 0xFFFFFFFFU; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t breakPointTableId = 0U; + uint32_t breakPointTableBaseAddr = 0U; + uint32_t breakPointTableChanMaskAddr = 0U; + uint32_t breakPointTableBkptMaskAddr = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, breakPointCfg, cleanup); + + static const uint32_t ALL_CHAN_MASK = ((uint32_t)ADI_ADRV904X_CH0 | + (uint32_t)ADI_ADRV904X_CH1 | + (uint32_t)ADI_ADRV904X_CH2 | + (uint32_t)ADI_ADRV904X_CH3 | + (uint32_t)ADI_ADRV904X_CH4 | + (uint32_t)ADI_ADRV904X_CH5 | + (uint32_t)ADI_ADRV904X_CH6 | + (uint32_t)ADI_ADRV904X_CH7); + + if ((breakPointCfg->chanMask & (~(uint32_t)ALL_CHAN_MASK)) != 0U) + { + /* Invalid channel mask */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, breakPointCfg->chanMask, "Invalid channel mask is selected."); + goto cleanup; + } + + recoveryAction = GetBreakPointTableIndexFromObjId(device, breakPointCfg->objId, &breakPointTableId, &breakPointTableBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading breakpoint table"); + goto cleanup; + } + + breakPointTableChanMaskAddr = breakPointTableBaseAddr + (uint32_t)breakPointTableId * (uint32_t)(sizeof(adi_adrv904x_SwBreakPointEntry_t)) + (uint32_t)(sizeof(breakPointCfg->objId)); + breakPointTableBkptMaskAddr = breakPointTableChanMaskAddr + (uint32_t)(sizeof(breakPointCfg->chanMask)); + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, breakPointTableChanMaskAddr, breakPointCfg->chanMask, BREAKPOINT_TABLE_ADDR_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing channel mask for selected breakpoint"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, breakPointTableBkptMaskAddr, breakPointCfg->bkptMask, BREAKPOINT_TABLE_ADDR_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing breakpoint mask for selected breakpoint"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_BreakpointGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SwBreakPointEntry_t * const breakPointCfgRead) +{ + static const uint32_t BREAKPOINT_TABLE_ADDR_MASK = 0xFFFFFFFFU; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t breakPointTableId = 0U; + uint32_t breakPointTableBaseAddr = 0U; + uint32_t breakPointTableChanMaskAddr = 0U; + uint32_t breakPointTableBkptMaskAddr = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, breakPointCfgRead, cleanup); + + recoveryAction = GetBreakPointTableIndexFromObjId(device, breakPointCfgRead->objId, &breakPointTableId, &breakPointTableBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading breakpoint table"); + goto cleanup; + } + + breakPointTableChanMaskAddr = breakPointTableBaseAddr + (uint32_t)breakPointTableId * (uint32_t)(sizeof(adi_adrv904x_SwBreakPointEntry_t)) + (uint32_t)(sizeof(breakPointCfgRead->objId)); + breakPointTableBkptMaskAddr = breakPointTableChanMaskAddr + (uint32_t)(sizeof(breakPointCfgRead->chanMask)); + + recoveryAction = adi_adrv904x_Register32Read(device, NULL, breakPointTableChanMaskAddr, &breakPointCfgRead->chanMask, BREAKPOINT_TABLE_ADDR_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading channel mask for selected breakpoint"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Read(device, NULL, breakPointTableBkptMaskAddr, &breakPointCfgRead->bkptMask, BREAKPOINT_TABLE_ADDR_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading breakpoint mask for selected breakpoint"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_BreakpointHitRead(adi_adrv904x_Device_t* const device, + adi_adrv904x_SwBreakPointEntry_t * const cpu0BreakpointHit, + adi_adrv904x_SwBreakPointEntry_t * const cpu1BreakpointHit) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + static const uint32_t NO_BREAKPOINT_HIT_VALUE = 0xFFFFFFFFU; + uint8_t breakPointIdCpu0 = 0; + uint8_t breakPointNumCpu0 = 0; + uint8_t breakPointChIdCpu0 = 0; + uint8_t breakPointIdCpu1 = 0; + uint8_t breakPointNumCpu1 = 0; + uint8_t breakPointChIdCpu1 = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpu0BreakpointHit, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpu1BreakpointHit, cleanup); + + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, NULL, ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, (uint8_t)ADRV904X_CPU_CPU0_SWBKPT_INDEX_SCRATCH_REG_ID, &breakPointIdCpu0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading Cpu0 breakpoint Id from scratchpad reg"); + goto cleanup; + } + + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, NULL, ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, (uint8_t)ADRV904X_CPU_CPU0_SWBKPT_BKPT_NUM_SCRATCH_REG_ID, &breakPointNumCpu0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading Cpu0 breakpoint num from scratchpad reg"); + goto cleanup; + } + + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, NULL, ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, (uint8_t)ADRV904X_CPU_CPU0_SWBKPT_CHAN_NUM_SCRATCH_REG_ID, &breakPointChIdCpu0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading Cpu0 breakpoint Ch Id from scratchpad reg"); + goto cleanup; + } + + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, NULL, ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, (uint8_t)ADRV904X_CPU_CPU1_SWBKPT_INDEX_SCRATCH_REG_ID, &breakPointIdCpu1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading Cpu1 breakpoint Id from scratchpad reg"); + goto cleanup; + } + + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, NULL, ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, (uint8_t)ADRV904X_CPU_CPU1_SWBKPT_BKPT_NUM_SCRATCH_REG_ID, &breakPointNumCpu1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading Cpu1 breakpoint num from scratchpad reg"); + goto cleanup; + } + + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, NULL, ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, (uint8_t)ADRV904X_CPU_CPU1_SWBKPT_CHAN_NUM_SCRATCH_REG_ID, &breakPointChIdCpu1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading Cpu1 breakpoint Ch Id from scratchpad reg"); + goto cleanup; + } + + if (breakPointIdCpu0 == 0) + { + cpu0BreakpointHit->objId = NO_BREAKPOINT_HIT_VALUE; + cpu0BreakpointHit->bkptMask = NO_BREAKPOINT_HIT_VALUE; + cpu0BreakpointHit->chanMask = NO_BREAKPOINT_HIT_VALUE; + } + else + { + /* Cpu0 is hit a breakpoint */ + recoveryAction = GetBreakPointObjIdFromTableIndex(device, breakPointIdCpu0, &cpu0BreakpointHit->objId); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading CPU0 breakpoint object id"); + goto cleanup; + } + + cpu0BreakpointHit->bkptMask = (uint32_t)1U << (uint32_t)breakPointNumCpu0; + cpu0BreakpointHit->chanMask = (uint32_t)1U << (uint32_t)breakPointChIdCpu0; + } + + if (breakPointIdCpu1 == 0) + { + cpu1BreakpointHit->objId = NO_BREAKPOINT_HIT_VALUE; + cpu1BreakpointHit->bkptMask = NO_BREAKPOINT_HIT_VALUE; + cpu1BreakpointHit->chanMask = NO_BREAKPOINT_HIT_VALUE; + } + else + { + /* Cpu1 is hit a breakpoint */ + recoveryAction = GetBreakPointObjIdFromTableIndex(device, breakPointIdCpu1, &cpu1BreakpointHit->objId); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading CPU1 breakpoint object id"); + goto cleanup; + } + + cpu1BreakpointHit->bkptMask = (uint32_t)1U << (uint32_t)breakPointNumCpu1; + cpu1BreakpointHit->chanMask = (uint32_t)1U << (uint32_t)breakPointChIdCpu1; + } + + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_BreakpointGpioCfgSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpioOutputForBreakpointHit, + const adi_adrv904x_GpioPinSel_e gpioInputToResumeSleepingTasks) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Range check gpio */ + if (gpioOutputForBreakpointHit > ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, gpioOutputForBreakpointHit, "Invalid GPIO selected. Out of range."); + goto cleanup; + } + + if (gpioInputToResumeSleepingTasks > ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, gpioInputToResumeSleepingTasks, "Invalid GPIO selected. Out of range."); + goto cleanup; + } + + if ((gpioInputToResumeSleepingTasks == gpioOutputForBreakpointHit) && + (gpioInputToResumeSleepingTasks != ADI_ADRV904X_GPIO_INVALID)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, gpioInputToResumeSleepingTasks, "Invalid GPIO selected. GPIO pins can not be the same."); + goto cleanup; + } + + recoveryAction = adrv904x_CpuGpioSet(device, + gpioInputToResumeSleepingTasks, + ADRV904X_CPU_CMD_GPIO_SIGNAL_SWBKPT_RESUME_FROM_BKPT, + ADI_TRUE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while configuring the CPU GPIO input signal"); + goto cleanup; + } + + recoveryAction = adrv904x_CpuGpioSet(device, + gpioOutputForBreakpointHit, + ADRV904X_CPU_CMD_GPIO_SIGNAL_SWBKPT_BKPT_HIT, + ADI_FALSE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while configuring the CPU GPIO output signal"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_BreakpointGpioCfgGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_GpioPinSel_e * const gpioOutputForBreakpointHit, + adi_adrv904x_GpioPinSel_e * const gpioInputToResumeSleepingTasks) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gpioOutputForBreakpointHit, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gpioInputToResumeSleepingTasks, cleanup); + + *gpioOutputForBreakpointHit = ADI_ADRV904X_GPIO_INVALID; + *gpioInputToResumeSleepingTasks = ADI_ADRV904X_GPIO_INVALID; + + recoveryAction = adrv904x_CpuGpioGet(device, gpioOutputForBreakpointHit, ADRV904X_CPU_CMD_GPIO_SIGNAL_SWBKPT_BKPT_HIT); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading GPIO pin for SW breakpoint hit signal"); + goto cleanup; + } + + recoveryAction = adrv904x_CpuGpioGet(device, gpioInputToResumeSleepingTasks, ADRV904X_CPU_CMD_GPIO_SIGNAL_SWBKPT_RESUME_FROM_BKPT); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading GPIO pin for SW resume signal"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_BreakpointResume(adi_adrv904x_Device_t* const device, + const adi_adrv904x_SwBreakPointEntry_t * breakpointToResume, + uint8_t resumeAll) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_ResumeBkpt_t breakpointResumeCmd; + adrv904x_CpuCmd_ResumeBkptResp_t breakpointResumeCmdRsp; + uint32_t cpuTypeIdx = 0U; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, breakpointToResume, cleanup); + + ADI_LIBRARY_MEMSET(&breakpointResumeCmd, 0, sizeof(adrv904x_CpuCmd_ResumeBkpt_t)); + ADI_LIBRARY_MEMSET(&breakpointResumeCmdRsp, 0, sizeof(adrv904x_CpuCmd_ResumeBkptResp_t)); + + if (resumeAll > 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, resumeAll, "resumeAll parameter can be either 0 or 1"); + goto cleanup; + } + + static const uint32_t ALL_CHAN_MASK = ((uint32_t)ADI_ADRV904X_CH0 | + (uint32_t)ADI_ADRV904X_CH1 | + (uint32_t)ADI_ADRV904X_CH2 | + (uint32_t)ADI_ADRV904X_CH3 | + (uint32_t)ADI_ADRV904X_CH4 | + (uint32_t)ADI_ADRV904X_CH5 | + (uint32_t)ADI_ADRV904X_CH6 | + (uint32_t)ADI_ADRV904X_CH7); + + if ((breakpointToResume->chanMask & (~(uint32_t)ALL_CHAN_MASK)) != 0U) + { + /* Invalid channel mask */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, breakpointToResume->chanMask, "Invalid channel mask is selected."); + goto cleanup; + } + + /* Fill out run bkpt resume cmd params with user-provided params */ + breakpointResumeCmd.objectID = ADRV904X_HTOCL(breakpointToResume->objId); + breakpointResumeCmd.chanMask = (uint8_t)(breakpointToResume->chanMask); + breakpointResumeCmd.bResumeAll = (uint8_t)(resumeAll); + + /* For each CPU, send the resume command, wait for a response, and process any errors. */ + for (cpuTypeIdx = 0U; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_RESUME_BKPT, + (void*)&breakpointResumeCmd, + sizeof(breakpointResumeCmd), + (void*)&breakpointResumeCmdRsp, + sizeof(breakpointResumeCmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(breakpointResumeCmdRsp.cmdStatus, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_BreakpointResumeFromHalt(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + recoveryAction = adrv904x_Core_SpDbgGlobalResume_BfSet(device, NULL, ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, 0x0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to set resume bit"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_BreakpointGlobalHaltMaskSet(adi_adrv904x_Device_t* const device, + const uint32_t globalHaltMask) +{ + static const uint32_t GLOBAL_HALTMASK_ADDR_MASK = 0xFFFFFFFFU; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t globalHaltMaskAddr = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Read back global halt mask address */ + recoveryAction = adi_adrv904x_Register32Read(device, NULL, (uint32_t)(ADRV904X_PM_SW_BKPT_GLOBAL_HALT_MASK_PTR), &globalHaltMaskAddr, GLOBAL_HALTMASK_ADDR_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading global halt mask address"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, globalHaltMaskAddr, globalHaltMask, GLOBAL_HALTMASK_ADDR_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing global halt mask value"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_BreakpointGlobalHaltMaskGet(adi_adrv904x_Device_t* const device, + uint32_t * const globalHaltMask) +{ + static const uint32_t GLOBAL_HALTMASK_ADDR_MASK = 0xFFFFFFFFU; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t globalHaltMaskAddr = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, globalHaltMask, cleanup); + + /* Read back global halt mask address */ + recoveryAction = adi_adrv904x_Register32Read(device, NULL, (uint32_t)(ADRV904X_PM_SW_BKPT_GLOBAL_HALT_MASK_PTR), &globalHaltMaskAddr, GLOBAL_HALTMASK_ADDR_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading global halt mask address"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Read(device, NULL, globalHaltMaskAddr, globalHaltMask, GLOBAL_HALTMASK_ADDR_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading global halt mask value"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); + +} diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_datainterface.c b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_datainterface.c new file mode 100644 index 00000000000..57b13267dc7 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_datainterface.c @@ -0,0 +1,10502 @@ +/** +* Copyright 2015 - 2023 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_datainterface.c +* \brief Contains function implementation defined in adi_adrv904x_datainterface.h +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#include "adi_adrv904x_datainterface.h" +#include "adi_adrv904x_cpu.h" +#include "adi_adrv904x_cals.h" +#include "adi_adrv904x_version.h" + +#include "../../private/include/adrv904x_datainterface.h" + +#include "../../private/include/adrv904x_cpu.h" +#include "../../private/include/adrv904x_cpu_cmd_ser_reset.h" +#include "../../private/include/adrv904x_init.h" +#include "../../private/include/adrv904x_reg_addr_macros.h" +#include "../../private/include/adrv904x_struct_endian.h" + + +#include "../../private/bf/adrv904x_bf_tx_dig.h" +#include "../../private/bf/adrv904x_bf_orx_dig.h" + + +#define ADI_FILE ADI_ADRV904X_FILE_PUBLIC_DATAINTERFACE +#define NELEMS(x) (sizeof(x) / sizeof((x)[0])) + +static adi_adrv904x_ErrAction_e adrv904x_IlasChksum(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfrmCompareData_v2_t* dfrmData); + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxOrxDataCaptureStart( adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e channelSelect, + const adi_adrv904x_RxOrxDataCaptureLocation_e captureLocation, + uint32_t captureData[], + const uint32_t captureLength, + const uint8_t trigger, + const uint32_t timeout_us) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t config = 0U; + uint32_t cptCfgAddr = 0U; + adrv904x_CpuCmd_CaptureRamType_e captureRamType = ADRV904X_CPU_CMD_CAP_RAM_TYPE_DPD; + uint8_t success = 0U; + adi_adrv904x_Channels_e fwChannel = ADI_ADRV904X_CH0; + uint8_t bCptBusy = 1U; + uint32_t bStreamDbgFlag = 1U; + const uint32_t writeMask = 0xFFFFFFFFU; + uint32_t waitInterval_us = 0U; + uint32_t numEventChecks = 1U; + uint32_t eventCheck = 0U; + uint8_t curRadClkDivValue = 0U; + uint8_t newRadClkDivValue = 0U; + uint8_t streamingEnabled = 0U; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, captureData, cleanup); + + /* range check the capture data length parameter */ + if ((channelSelect == ADI_ADRV904X_ORX0 || + channelSelect == ADI_ADRV904X_ORX1) && + (captureLength == ADI_ADRV904X_CAPTURE_SIZE_16K || + captureLength == ADI_ADRV904X_CAPTURE_SIZE_32K)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, captureLength, "Error in captureLength size parameter. The captureLength for the ORx capture should be 12k or less"); + goto cleanup; + } + if (captureLength != ADI_ADRV904X_CAPTURE_SIZE_16K && + captureLength != ADI_ADRV904X_CAPTURE_SIZE_32K && + captureLength != ADI_ADRV904X_CAPTURE_SIZE_12K && + captureLength != ADI_ADRV904X_CAPTURE_SIZE_8K && + captureLength != ADI_ADRV904X_CAPTURE_SIZE_4K && + captureLength != ADI_ADRV904X_CAPTURE_SIZE_2K && + captureLength != ADI_ADRV904X_CAPTURE_SIZE_1K && + captureLength != ADI_ADRV904X_CAPTURE_SIZE_512 && + captureLength != ADI_ADRV904X_CAPTURE_SIZE_256 && + captureLength != ADI_ADRV904X_CAPTURE_SIZE_128 && + captureLength != ADI_ADRV904X_CAPTURE_SIZE_64 && + captureLength != ADI_ADRV904X_CAPTURE_SIZE_32) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, captureLength, "Error in captureLength size parameter."); + goto cleanup; + } + + /* range check the channel selection parameter */ + if (channelSelect != ADI_ADRV904X_RX0 && + channelSelect != ADI_ADRV904X_RX1 && + channelSelect != ADI_ADRV904X_RX2 && + channelSelect != ADI_ADRV904X_RX3 && + channelSelect != ADI_ADRV904X_RX4 && + channelSelect != ADI_ADRV904X_RX5 && + channelSelect != ADI_ADRV904X_RX6 && + channelSelect != ADI_ADRV904X_RX7 && + channelSelect != ADI_ADRV904X_ORX0 && + channelSelect != ADI_ADRV904X_ORX1 + ) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelSelect, "Error in the channel selection parameter. Invalid channel selected for capture or readback"); + goto cleanup; + } + + /* range check the capture location parameter */ + if (captureLocation != ADI_ADRV904X_CAPTURE_LOC_DDC0 && + captureLocation != ADI_ADRV904X_CAPTURE_LOC_DATAPATH && + captureLocation != ADI_ADRV904X_CAPTURE_LOC_DPD && + captureLocation != ADI_ADRV904X_CAPTURE_LOC_DPD_PRE && + captureLocation != ADI_ADRV904X_CAPTURE_LOC_DPD_POST && + captureLocation != ADI_ADRV904X_CAPTURE_LOC_FSC && + captureLocation != ADI_ADRV904X_CAPTURE_LOC_ORX_TX0 && + captureLocation != ADI_ADRV904X_CAPTURE_LOC_ORX_TX1 && + captureLocation != ADI_ADRV904X_CAPTURE_LOC_ORX_TX2 && + captureLocation != ADI_ADRV904X_CAPTURE_LOC_ORX_TX3 && + captureLocation != ADI_ADRV904X_CAPTURE_LOC_ORX_TX4 && + captureLocation != ADI_ADRV904X_CAPTURE_LOC_ORX_TX5 && + captureLocation != ADI_ADRV904X_CAPTURE_LOC_ORX_TX6 && + captureLocation != ADI_ADRV904X_CAPTURE_LOC_ORX_TX7 && + captureLocation != ADI_ADRV904X_CAPTURE_LOC_DDC1) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, captureLocation, "Error in the data capture location parameter. Invalid location selected for capture"); + goto cleanup; + } + + /* Determine the number of reads equivalent to the requested timeout */ + waitInterval_us = (1000U > timeout_us) ? timeout_us : 1000U; + numEventChecks = (waitInterval_us == 0U) ? 1U : (timeout_us / waitInterval_us); + numEventChecks = (numEventChecks == 1) ? 2U : numEventChecks; /* Iterate at least twice through the for loops below so we wait at least once */ + + /* resolve the channel and ram type for the firmware */ + if (channelSelect == ADI_ADRV904X_ORX0) + { + captureRamType = ADRV904X_CPU_CMD_CAP_RAM_TYPE_ORX; + fwChannel = ADI_ADRV904X_CH0; + } + else if (channelSelect == ADI_ADRV904X_ORX1) + { + captureRamType = ADRV904X_CPU_CMD_CAP_RAM_TYPE_ORX; + fwChannel = ADI_ADRV904X_CH1; + } + else + { + fwChannel = (adi_adrv904x_Channels_e) channelSelect; + } + + /* Set the configuration */ + recoveryAction = adrv904x_RxOrxDataCaptureConfigSet(device, captureLocation, captureLength, &config); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, captureLocation, "Error setting the data capture configuration"); + goto cleanup; + } + + /* figure out what address the config register is in */ + recoveryAction = adrv904x_RxOrxDataCaptureConfigAddressGet(device, channelSelect, &cptCfgAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error determining the data capture configuration register base address"); + goto cleanup; + } + + /* Write the configuration to the capture control register */ + recoveryAction = adi_adrv904x_Register32Write(device, NULL, cptCfgAddr, config, writeMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing to the data capture configuration register"); + goto cleanup; + } + + /* Retrieve the current divider n value so it can be reset after the capture completes */ + if (channelSelect == ADI_ADRV904X_ORX0 || + channelSelect == ADI_ADRV904X_ORX1) + { + recoveryAction = adrv904x_OrxDig_ObsCapMemClkDivideRatio_BfGet(device, + NULL, + (adrv904x_BfOrxDigChanAddr_e) (cptCfgAddr & ADI_ADRV904X_CAPTURE_LOC_SLICE_MASK), + &curRadClkDivValue); + } + else + { + recoveryAction = adrv904x_TxDig_RadClkDivideRatio_BfGet(device, + NULL, + (adrv904x_BfTxDigChanAddr_e) (cptCfgAddr & ADI_ADRV904X_CAPTURE_LOC_SLICE_MASK), + &curRadClkDivValue); + } + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading from the capture memory clock divider bit field"); + goto cleanup; + } + + /* Calculate what the divider n value needs to be to match the capture clock rate to the sample rate */ + recoveryAction = adrv904x_RadClkDividerValueCalculate(device, + channelSelect, + captureLocation, + &newRadClkDivValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error calculating the capture memory clock divider value"); + goto cleanup; + } + + /* Set the capture clock divider n value */ + if (channelSelect == ADI_ADRV904X_ORX0 || + channelSelect == ADI_ADRV904X_ORX1) + { + recoveryAction = adrv904x_OrxDig_ObsCapMemClkDivideRatio_BfSet(device, + NULL, + (adrv904x_BfOrxDigChanAddr_e) (cptCfgAddr & ADI_ADRV904X_CAPTURE_LOC_SLICE_MASK), + newRadClkDivValue); + } + else + { + recoveryAction = adrv904x_TxDig_RadClkDivideRatio_BfSet(device, + NULL, + (adrv904x_BfTxDigChanAddr_e) (cptCfgAddr & ADI_ADRV904X_CAPTURE_LOC_SLICE_MASK), + newRadClkDivValue); + } + + /* Send firmware command to request access to the RAM */ + recoveryAction = adrv904x_CpuRamAccessStart(device, captureRamType, fwChannel, &success); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error during firmware interaction"); + goto cleanup; + } + + /* Check that RAM access has been granted */ + if (success == 1) + { + /* RAM is available for capture and read back + * if trigger is 0 immediately trigger the capture + * otherwise capture is triggered by the stream processor + */ + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing to the capture memory clock divider bit field"); + goto cleanup; + } + + if (!trigger) + { + /* API sets the capture enable bit ; offset is accounted for in bf function so cptCfgAddr is masked to get the slice base address */ + if (channelSelect == ADI_ADRV904X_ORX0 || + channelSelect == ADI_ADRV904X_ORX1) + { + recoveryAction = adrv904x_OrxDig_CptTrigger_BfSet(device, + NULL, + (adrv904x_BfOrxDigChanAddr_e) (cptCfgAddr & ADI_ADRV904X_CAPTURE_LOC_SLICE_MASK), + (uint8_t) 1U); + } + else + { + recoveryAction = adrv904x_TxDig_TxCptTrigger_BfSet(device, + NULL, + (adrv904x_BfTxDigChanAddr_e) (cptCfgAddr & ADI_ADRV904X_CAPTURE_LOC_SLICE_MASK), + (uint8_t) 1U); + } + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing to the data capture configuration register"); + goto cleanup; + } + } + } + else + { + /* RAM is not available for capture or read back */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error gaining access to the capture memory resource"); + goto cleanup; + } + + if (trigger) + { + /* poll the stream debug register scratch 1 */ + for (eventCheck = 0U; eventCheck <= numEventChecks; eventCheck++) + { + recoveryAction = adrv904x_RxOrxDataCaptureStreamDebugPoll(device, channelSelect, &bStreamDbgFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading from stream debug register"); + goto cleanup; + } + + if (bStreamDbgFlag == 0) + { + break; + } + + if (eventCheck < numEventChecks) /* Don't wait on last iteration */ + { + /* Wait the specified wait interval, then check again for status. */ + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_Wait_us(&device->common, waitInterval_us); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "HAL Wait Issue"); + goto cleanup; + } + } + + } + + if (bStreamDbgFlag > 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Timed out waiting for the data capture to start"); + goto cleanup; + } + } + + /* poll the capture status register until capture busy goes low. */ + for (eventCheck = 0U; eventCheck <= numEventChecks; eventCheck++) + { + recoveryAction = adrv904x_StatusRegisterPoll(device, channelSelect, &bCptBusy); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading from capture memory status register"); + goto cleanup; + } + + if (bCptBusy == 0) + { + break; + } + + if (eventCheck < numEventChecks) /* Don't wait on last iteration */ + { + /* Wait the specified wait interval, then check again for status. */ + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_Wait_us(&device->common, waitInterval_us); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "HAL Wait Issue"); + goto cleanup; + } + } + } + + if (bCptBusy > 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Timed out waiting for Internal RAM capture to complete"); + goto cleanup; + } + + /* API clears the capture enable bit ; offset is accounted for in bf function so cptCfgAddr is masked to get the slice base address */ + if (channelSelect == ADI_ADRV904X_ORX0 || + channelSelect == ADI_ADRV904X_ORX1) + { + recoveryAction = adrv904x_OrxDig_CptTrigger_BfSet( device, + NULL, + (adrv904x_BfOrxDigChanAddr_e) (cptCfgAddr & ADI_ADRV904X_CAPTURE_LOC_SLICE_MASK), + (uint8_t) 0U); + } + else + { + recoveryAction = adrv904x_TxDig_TxCptTrigger_BfSet( device, + NULL, + (adrv904x_BfTxDigChanAddr_e) (cptCfgAddr & ADI_ADRV904X_CAPTURE_LOC_SLICE_MASK), + (uint8_t) 0U); + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing to the data capture configuration register"); + goto cleanup; + } + + /* Put the part into streaming mode to help facilitate the large, contiguous SPI reads in RAM */ + recoveryAction = adrv904x_SpiStreamingEntry(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue with entering Spi Streaming mode"); + goto cleanup; + } + streamingEnabled = 1U; + + /* Read back data from capture memory */ + recoveryAction = adrv904x_RxOrxDataCaptureRead(device, channelSelect, captureData, captureLength, captureLocation); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading from capture memory bank 0"); + goto cleanup; + } + + /* Send firmware command to stop accessing the ram */ + if (success == 1U) + { + /* TODO: This breaks ORx readback */ + /* clear success */ + success = 0U; + recoveryAction = adrv904x_CpuRamAccessStop(device, captureRamType, fwChannel, &success); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error during firmware interaction"); + goto cleanup; + } + } + /* Check that RAM access has been revoked */ + if (success != 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to revoke access to the capture memory resource"); + goto cleanup; + } + + /* Set the capture clock divider n value back to what it was before the capture */ + if (channelSelect == ADI_ADRV904X_ORX0 || + channelSelect == ADI_ADRV904X_ORX1) + { + recoveryAction = adrv904x_OrxDig_ObsCapMemClkDivideRatio_BfSet(device, + NULL, + (adrv904x_BfOrxDigChanAddr_e) (cptCfgAddr & ADI_ADRV904X_CAPTURE_LOC_SLICE_MASK), + curRadClkDivValue); + } + else + { + recoveryAction = adrv904x_TxDig_RadClkDivideRatio_BfSet(device, + NULL, + (adrv904x_BfTxDigChanAddr_e) (cptCfgAddr & ADI_ADRV904X_CAPTURE_LOC_SLICE_MASK), + curRadClkDivValue); + } + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing to the capture memory clock divider bit field"); + goto cleanup; + } + +cleanup: + if (streamingEnabled) + { + if (ADI_ADRV904X_ERR_ACT_NONE != adrv904x_SpiStreamingExit(device)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_INTERFACE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Spi Streaming Exit Issue"); + } + } + + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AdcSampleXbarSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + const adi_adrv904x_AdcSampleXbarCfg_t* const adcXbar) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJtxLinkChanAddr_e framerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_; + uint8_t adcIdx = 0U; + uint8_t validAdc = ADI_FALSE; + uint8_t mValue = 0U; + uint32_t i = 0U; + adi_adrv904x_AdcSampleXbarSel_e validAdcXbar[] = + { + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX0_BAND_0_DATA_I, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX0_BAND_0_DATA_Q, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX0_BAND_1_DATA_I, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX0_BAND_1_DATA_Q, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX1_BAND_0_DATA_I, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX1_BAND_0_DATA_Q, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX1_BAND_1_DATA_I, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX1_BAND_1_DATA_Q, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX2_BAND_0_DATA_I, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX2_BAND_0_DATA_Q, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX2_BAND_1_DATA_I, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX2_BAND_1_DATA_Q, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX3_BAND_0_DATA_I, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX3_BAND_0_DATA_Q, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX3_BAND_1_DATA_I, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX3_BAND_1_DATA_Q, + + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX4_BAND_0_DATA_I, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX4_BAND_0_DATA_Q, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX4_BAND_1_DATA_I, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX4_BAND_1_DATA_Q, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX5_BAND_0_DATA_I, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX5_BAND_0_DATA_Q, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX5_BAND_1_DATA_I, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX5_BAND_1_DATA_Q, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX6_BAND_0_DATA_I, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX6_BAND_0_DATA_Q, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX6_BAND_1_DATA_I, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX6_BAND_1_DATA_Q, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX7_BAND_0_DATA_I, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX7_BAND_0_DATA_Q, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX7_BAND_1_DATA_I, + ADI_ADRV904X_JESD_FRM_SPLXBAR_RX7_BAND_1_DATA_Q, + + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_0, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_1, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_2, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_3, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_4, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_5, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_6, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_I_7, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_0, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_1, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_2, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_3, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_4, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_5, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_6, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX0_DATA_Q_7, + + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_0, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_1, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_2, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_3, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_4, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_5, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_6, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_I_7, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_0, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_1, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_2, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_3, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_4, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_5, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_6, + ADI_ADRV904X_JESD_FRM_SPLXBAR_ORX1_DATA_Q_7, + ADI_ADRV904X_JESD_FRM_SPLXBAR_INVALID + }; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, adcXbar, cleanup); + + /* Get the base address of the selected framer */ + recoveryAction = adrv904x_FramerBitfieldAddressGet(device, framerSel, &framerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected framer"); + goto cleanup; + } + + /* Get the number of converters (M) */ + recoveryAction = adrv904x_JtxLink_JtxMCfg_BfGet(device, + NULL, + framerBaseAddr, + &mValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of converters for the selected framer"); + goto cleanup; + } + mValue += 1; + + if (mValue > ADI_ADRV904X_NUM_FRAMERS_SAMPLE_XBAR) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid M value read from the selected framer"); + goto cleanup; + } + + /* ADC Xbar values validation */ + for (adcIdx = 0; adcIdx < mValue; adcIdx++) + { + validAdc = ADI_FALSE; + for (i = 0; i < (sizeof(validAdcXbar) / sizeof(*validAdcXbar)); i++) + { + if (adcXbar->AdcSampleXbar[adcIdx] != validAdcXbar[i]) + { + continue; + } + else + { + validAdc = ADI_TRUE; + break; + } + } + + /* Expect validAdc to be true (1U) */ + if (validAdc == ADI_FALSE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid ADC Sample Crossbar selection"); + goto cleanup; + } + } + + + { + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + adi_adrv904x_CddcMode_e cddcMode = ADI_ADRV904X_CDDC_MODE; + uint32_t numberOfConverters = ADI_ADRV904X_NUM_FRAMERS_SAMPLE_XBAR; + + /* Framer 2 is not supported in this API */ + if (framerSel == ADI_ADRV904X_FRAMER_2) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid framer selection."); + goto cleanup; + } + else if (framerSel == ADI_ADRV904X_FRAMER_1) + { + /* framer 1 only has half of framer-0 */ + numberOfConverters /= 2; + } + + /* Only supported in bypass mode */ + recoveryAction = adi_adrv904x_CddcModeGet(device, framerSel, &cddcMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting CDDC Mode for the selected framer"); + goto cleanup; + } + + if (cddcMode != ADI_ADRV904X_CDDC_BYPASS_MODE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid CDDC Mode. It must be in CDDC Bypass mode."); + goto cleanup; + } + + /* program the converters */ + for (adcIdx = 0; adcIdx < numberOfConverters; adcIdx++) + { + if (adcXbar->AdcSampleXbar[adcIdx] == ADI_ADRV904X_JESD_FRM_SPLXBAR_INVALID) + { + /* Disable the converters */ + if (framerSel == ADI_ADRV904X_FRAMER_0) + { + recoveryAction = adrv904x_JesdCommon_JtxCoreConvDisableLink0_BfSet(device, + NULL, + commonBaseAddr, + adcIdx, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting sample crossbar for the selected framer"); + goto cleanup; + } + } + else if (framerSel == ADI_ADRV904X_FRAMER_1) + { + recoveryAction = adrv904x_JesdCommon_JtxCoreConvDisableLink1_BfSet(device, + NULL, + commonBaseAddr, + adcIdx, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting sample crossbar for the selected framer"); + goto cleanup; + } + } + } + else + { + /* Enabling the converters and writing Sample Xbar value */ + if (framerSel == ADI_ADRV904X_FRAMER_0) + { + /* Enabling converters */ + recoveryAction = adrv904x_JesdCommon_JtxCoreConvDisableLink0_BfSet(device, + NULL, + commonBaseAddr, + adcIdx, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while enabling converter for the selected framer"); + goto cleanup; + } + + /* Writing Sample Xbar value */ + recoveryAction = adrv904x_JesdCommon_RxSampleSelLink0_BfSet(device, + NULL, + commonBaseAddr, + adcIdx, + (uint8_t) adcXbar->AdcSampleXbar[adcIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting sample crossbar value for the selected framer"); + goto cleanup; + } + } + else if (framerSel == ADI_ADRV904X_FRAMER_1) + { + /* Enabling converters */ + recoveryAction = adrv904x_JesdCommon_JtxCoreConvDisableLink1_BfSet(device, + NULL, + commonBaseAddr, + adcIdx, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while enabling converter for the selected framer"); + goto cleanup; + } + + /* Writing Sample Xbar value */ + recoveryAction = adrv904x_JesdCommon_RxSampleSelLink1_BfSet(device, + NULL, + commonBaseAddr, + adcIdx, + (uint8_t) adcXbar->AdcSampleXbar[adcIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting sample crossbar value for the selected framer"); + goto cleanup; + } + } + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_AdcSampleXbarGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + adi_adrv904x_AdcSampleXbarCfg_t* const adcXbar) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t xbarIdx = 0U; + uint8_t bfValue = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, adcXbar, cleanup); + + + { + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + adi_adrv904x_CddcMode_e cddcMode = ADI_ADRV904X_CDDC_MODE; + uint32_t numberOfConverters = ADI_ADRV904X_NUM_FRAMERS_SAMPLE_XBAR; + + /* Framer 2 is not supported in this API */ + if (framerSel == ADI_ADRV904X_FRAMER_2) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid framer selection."); + goto cleanup; + } + else if (framerSel == ADI_ADRV904X_FRAMER_1) + { + /* framer 1 only has half of framer-0 */ + numberOfConverters /= 2; + } + + /* Only supported in bypass mode */ + recoveryAction = adi_adrv904x_CddcModeGet(device, framerSel, &cddcMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting CDDC Mode for the selected framer"); + goto cleanup; + } + + if (cddcMode != ADI_ADRV904X_CDDC_BYPASS_MODE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid CDDC Mode. It must be in CDDC Bypass mode."); + goto cleanup; + } + + for (xbarIdx = 0U; xbarIdx < numberOfConverters; xbarIdx++) + { + if (framerSel == ADI_ADRV904X_FRAMER_0) + { + /* Get this status of converters */ + recoveryAction = adrv904x_JesdCommon_JtxCoreConvDisableLink0_BfGet(device, + NULL, + commonBaseAddr, + xbarIdx, + &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting converter status for the selected framer"); + goto cleanup; + } + + if (bfValue == 1U) /* Converter is in disable */ + { + adcXbar->AdcSampleXbar[xbarIdx] = ADI_ADRV904X_JESD_FRM_SPLXBAR_INVALID; + } + else /* Converter is in enable */ + { + /* Getting Sample Xbar value */ + recoveryAction = adrv904x_JesdCommon_RxSampleSelLink0_BfGet(device, + NULL, + commonBaseAddr, + xbarIdx, + &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting sample crossbar value for the selected framer"); + goto cleanup; + } + adcXbar->AdcSampleXbar[xbarIdx] = (adi_adrv904x_AdcSampleXbarSel_e) bfValue; + } + } + else if (framerSel == ADI_ADRV904X_FRAMER_1) + { + /* Get this status of converters */ + recoveryAction = adrv904x_JesdCommon_JtxCoreConvDisableLink1_BfGet(device, + NULL, + commonBaseAddr, + xbarIdx, + &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting converter status for the selected framer"); + goto cleanup; + } + + if (bfValue == 1U) /* Converter is in disable */ + { + adcXbar->AdcSampleXbar[xbarIdx] = ADI_ADRV904X_JESD_FRM_SPLXBAR_INVALID; + } + else /* Converter is in enable */ + { + /* Getting Sample Xbar value */ + recoveryAction = adrv904x_JesdCommon_RxSampleSelLink1_BfGet(device, + NULL, + commonBaseAddr, + xbarIdx, + &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting sample crossbar value for the selected framer"); + goto cleanup; + } + adcXbar->AdcSampleXbar[xbarIdx] = (adi_adrv904x_AdcSampleXbarSel_e) bfValue; + } + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DacSampleXbarSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + const adi_adrv904x_DacSampleXbarCfg_t* const dacXbar) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + uint8_t dacIdx = 0U; + uint8_t mValue = 0U; + uint8_t disabledCount = 0U; + uint8_t validDac = ADI_FALSE; + uint32_t i = 0U; + + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + adi_adrv904x_CducMode_e cducMode = ADI_ADRV904X_CDUC_MODE; + adi_adrv904x_DacSampleXbarSel_e validDacXbar[] = + { + ADI_ADRV904X_DEFRAMER_OUT0, + ADI_ADRV904X_DEFRAMER_OUT1, + ADI_ADRV904X_DEFRAMER_OUT2, + ADI_ADRV904X_DEFRAMER_OUT3, + ADI_ADRV904X_DEFRAMER_OUT4, + ADI_ADRV904X_DEFRAMER_OUT5, + ADI_ADRV904X_DEFRAMER_OUT6, + ADI_ADRV904X_DEFRAMER_OUT7, + ADI_ADRV904X_DEFRAMER_OUT8, + ADI_ADRV904X_DEFRAMER_OUT9, + ADI_ADRV904X_DEFRAMER_OUT10, + ADI_ADRV904X_DEFRAMER_OUT11, + ADI_ADRV904X_DEFRAMER_OUT12, + ADI_ADRV904X_DEFRAMER_OUT13, + ADI_ADRV904X_DEFRAMER_OUT14, + ADI_ADRV904X_DEFRAMER_OUT15, + + ADI_ADRV904X_DEFRAMER_OUT16, + ADI_ADRV904X_DEFRAMER_OUT17, + ADI_ADRV904X_DEFRAMER_OUT18, + ADI_ADRV904X_DEFRAMER_OUT19, + ADI_ADRV904X_DEFRAMER_OUT20, + ADI_ADRV904X_DEFRAMER_OUT21, + ADI_ADRV904X_DEFRAMER_OUT22, + ADI_ADRV904X_DEFRAMER_OUT23, + ADI_ADRV904X_DEFRAMER_OUT24, + ADI_ADRV904X_DEFRAMER_OUT25, + ADI_ADRV904X_DEFRAMER_OUT26, + ADI_ADRV904X_DEFRAMER_OUT27, + ADI_ADRV904X_DEFRAMER_OUT28, + ADI_ADRV904X_DEFRAMER_OUT29, + ADI_ADRV904X_DEFRAMER_OUT30, + ADI_ADRV904X_DEFRAMER_OUT31, + + ADI_ADRV904X_DEFRAMER_OUT_INVALID + }; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dacXbar, cleanup); + + /* Get the base address of the selected deframer */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, deframerSel, &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected deframer"); + goto cleanup; + } + + + /* Only supported in bypass mode */ + recoveryAction = adi_adrv904x_CducModeGet(device, deframerSel, &cducMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting CDUC Mode for the selected deframer"); + goto cleanup; + } + + if (cducMode != ADI_ADRV904X_CDUC_BYPASS_MODE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid CDUC Mode. It must be in CDUC Bypass mode."); + goto cleanup; + } + + /* DAC Xbar values validation */ + for (dacIdx = 0; dacIdx < ADI_ADRV904X_NUM_DAC_SAMPLE_XBAR; dacIdx++) + { + /* validate each I and Q of a channel */ + validDac = ADI_FALSE; + for (i = 0; i < (sizeof(validDacXbar) / sizeof(*validDacXbar)); i++) + { + if (dacXbar->txDacChan[dacIdx] != validDacXbar[i]) + { + continue; + } + else + { + validDac = ADI_TRUE; + break; + } + } + + /* Expect validDac to be true (1U) */ + if (validDac == ADI_FALSE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid DAC Sample Crossbar selection"); + goto cleanup; + } + } + + /* Counting the disable sample xbar */ + for (dacIdx = 0; dacIdx < ADI_ADRV904X_NUM_DAC_SAMPLE_XBAR; dacIdx++) + { + /* Counting the disable ones */ + if (dacXbar->txDacChan[dacIdx] == ADI_ADRV904X_DEFRAMER_OUT_INVALID) + + { + disabledCount++; + } + } + + /* get M - Number of converters per device */ + recoveryAction = adrv904x_JrxLink_JrxCoreMCfg_BfGet(device, + NULL, + deframerBaseAddr, + &mValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of converters per device"); + goto cleanup; + } + + mValue += 1; + + /* Verify number of disabled selections, this should be equal to 'ADI_ADRV904X_NUM_DAC_SAMPLE_XBAR -mValue ' */ + if (disabledCount != (ADI_ADRV904X_NUM_DAC_SAMPLE_XBAR - mValue)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Number of valid converter selections doesn't match with deframer M value"); + goto cleanup; + } + + + for (dacIdx = 0; dacIdx < ADI_ADRV904X_NUM_DAC_SAMPLE_XBAR; dacIdx++) + { + if (dacXbar->txDacChan[dacIdx] == ADI_ADRV904X_DEFRAMER_OUT_INVALID) + { + /* Disable the DAC converters */ + if (deframerSel == ADI_ADRV904X_DEFRAMER_0) + { + recoveryAction = adrv904x_JesdCommon_JrxCoreConvDisableLink0_BfSet(device, + NULL, + commonBaseAddr, + dacIdx, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while disabling DAC sample crossbar for the selected deframer"); + goto cleanup; + } + } + else if (deframerSel == ADI_ADRV904X_DEFRAMER_1) + { + recoveryAction = adrv904x_JesdCommon_JrxCoreConvDisableLink1_BfSet(device, + NULL, + commonBaseAddr, + dacIdx, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while disabling DAC sample crossbar for the selected deframer"); + goto cleanup; + } + } + } + else /* Valid DAC sample Xbar value */ + { + /* Enabling the converters and writing Sample Xbar value */ + if (deframerSel == ADI_ADRV904X_DEFRAMER_0) + { + /* Enabling converters */ + recoveryAction = adrv904x_JesdCommon_JrxCoreConvDisableLink0_BfSet(device, + NULL, + commonBaseAddr, + dacIdx, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while enabling converter for the selected deframer"); + goto cleanup; + } + + /* Writing Sample Xbar value */ + recoveryAction = adrv904x_JesdCommon_TxSampleSelLink0_BfSet(device, + NULL, + commonBaseAddr, + dacIdx, + (uint8_t) dacXbar->txDacChan[dacIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting sample crossbar value for the selected deframer"); + goto cleanup; + } + } + else if (deframerSel == ADI_ADRV904X_DEFRAMER_1) + { + /* Enabling converters */ + recoveryAction = adrv904x_JesdCommon_JrxCoreConvDisableLink1_BfSet(device, + NULL, + commonBaseAddr, + dacIdx, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while enabling converter for the selected deframer"); + goto cleanup; + } + + /* Writing DAC Sample Xbar value */ + recoveryAction = adrv904x_JesdCommon_TxSampleSelLink1_BfSet(device, + NULL, + commonBaseAddr, + dacIdx, + (uint8_t) dacXbar->txDacChan[dacIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting sample crossbar value for the selected framer"); + goto cleanup; + } + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DacSampleXbarGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + adi_adrv904x_DacSampleXbarCfg_t* const dacXbar) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + uint8_t bfValue = 0U; + uint8_t dacIdx = 0U; + + + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + adi_adrv904x_CducMode_e cducMode = ADI_ADRV904X_CDUC_MODE; + uint8_t dacValue = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dacXbar, cleanup); + + + /* Only supported in bypass mode */ + recoveryAction = adi_adrv904x_CducModeGet(device, deframerSel, &cducMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting CDUC Mode for the selected deframer"); + goto cleanup; + } + + if (cducMode != ADI_ADRV904X_CDUC_BYPASS_MODE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid CDUC Mode. It must be in CDUC Bypass mode."); + goto cleanup; + } + + /* Get the base address of the selected deframer */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, deframerSel, &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected deframer"); + goto cleanup; + } + + for (dacIdx = 0U; dacIdx < ADI_ADRV904X_NUM_DAC_SAMPLE_XBAR; dacIdx++) + { + if (deframerSel == ADI_ADRV904X_DEFRAMER_0) + { + /* Get this status of converters */ + recoveryAction = adrv904x_JesdCommon_JrxCoreConvDisableLink0_BfGet(device, + NULL, + commonBaseAddr, + dacIdx, + &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting converter status for the selected deframer"); + goto cleanup; + } + + if (bfValue == 1U) /* Converter is in disable */ + { + dacXbar->txDacChan[dacIdx] = ADI_ADRV904X_DEFRAMER_OUT_INVALID; + } + else /* Converter is in enable */ + { + /* Getting Sample Xbar value */ + recoveryAction = adrv904x_JesdCommon_TxSampleSelLink0_BfGet(device, + NULL, + commonBaseAddr, + dacIdx, + &dacValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting sample crossbar value for the selected framer"); + goto cleanup; + } + dacXbar->txDacChan[dacIdx] = (adi_adrv904x_DacSampleXbarSel_e) dacValue; + } + } + else if (deframerSel == ADI_ADRV904X_DEFRAMER_1) + { + /* Get this status of converters */ + recoveryAction = adrv904x_JesdCommon_JrxCoreConvDisableLink1_BfGet(device, + NULL, + commonBaseAddr, + dacIdx, + &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting converter status for the selected deframer"); + goto cleanup; + } + + if (bfValue == 1U) /* Converter is in disable */ + { + dacXbar->txDacChan[dacIdx] = ADI_ADRV904X_DEFRAMER_OUT_INVALID; + } + else /* Converter is in enable */ + { + /* Getting Sample Xbar value */ + recoveryAction = adrv904x_JesdCommon_TxSampleSelLink1_BfGet(device, + NULL, + commonBaseAddr, + dacIdx, + &dacValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting sample crossbar value for the selected deframer"); + goto cleanup; + } + dacXbar->txDacChan[dacIdx] = (adi_adrv904x_DacSampleXbarSel_e) dacValue; + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + adi_adrv904x_FramerCfg_t* const framerCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJtxLinkChanAddr_e framerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_; + uint8_t dataByte = 0U; + uint8_t converter = 0U; + uint8_t enabledFramers = 0U; + uint8_t framerIdx = 0U; + uint8_t tmpByte = 0U; + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, framerCfg, cleanup); + ADI_LIBRARY_MEMSET(framerCfg, 0, sizeof(adi_adrv904x_FramerCfg_t)); + + /* Get all framers link state */ + recoveryAction =adrv904x_JesdCommon_JtxLinkEn_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + &enabledFramers); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get framer link state failed"); + goto cleanup; + } + + /* currently not used */ + framerCfg->overSample = 0; + + /* Get the base address of the selected framer */ + recoveryAction = adrv904x_FramerBitfieldAddressGet(device, framerSel, &framerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected framer"); + goto cleanup; + } + + /* Get the framer link type */ + recoveryAction = adrv904x_JtxLink_JtxLinkType_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->enableJesd204C); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get link type for the selected framer"); + goto cleanup; + } + + /* Get the framer band ID */ + recoveryAction = adrv904x_JtxLink_JtxBidCfg_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->bankId); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get band ID for the selected framer"); + goto cleanup; + } + + /* Get the framer device link ID */ + recoveryAction = adrv904x_JtxLink_JtxDidCfg_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->deviceId); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get device link ID for the selected framer"); + goto cleanup; + } + + /* Get the framer lane ID */ + recoveryAction = adrv904x_JtxLink_JtxLidCfg_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->lane0Id); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lane ID for the selected framer"); + goto cleanup; + } + + /* Get the number of converters (M) */ + recoveryAction = adrv904x_JtxLink_JtxMCfg_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->jesd204M); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of converters for the selected framer"); + goto cleanup; + } + ++framerCfg->jesd204M; + + /* Get the number of frames in a multi-frame/block (K) */ + recoveryAction = adrv904x_JtxLink_JtxKCfg_BfGet(device, + NULL, + framerBaseAddr, + &tmpByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of frames in a multi-frame/block for the selected framer"); + goto cleanup; + } + + framerCfg->jesd204K = tmpByte + 1; + + /* Get the number of octets per lane (F) */ + recoveryAction = adrv904x_JtxLink_JtxFCfg_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->jesd204F); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of octets per frame for the selected framer"); + goto cleanup; + } + ++framerCfg->jesd204F; + + /* Get the total number of bits per sample */ + recoveryAction = adrv904x_JtxLink_JtxNpCfg_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->jesd204Np); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get total number of bits per sample for the selected framer"); + goto cleanup; + } + ++framerCfg->jesd204Np; + + /* Get the number of multiblocks in extended multiblocks (E) */ + framerCfg->jesd204E = 0; + if (framerCfg->enableJesd204C) + { + recoveryAction = adrv904x_JtxLink_JtxECfg_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->jesd204E); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of multiblocks in extended multiblocks for the selected framer"); + goto cleanup; + } + } + + /* Get the scrambler enable */ + recoveryAction = adrv904x_JtxLink_JtxScrCfg_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->scramble); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get alternative scrambler enable for the selected framer"); + goto cleanup; + } + + /* Get the lane crossbar selection and physical lane crossbar */ + recoveryAction = adrv904x_FramerLaneEnableGet(device, framerSel, framerCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lane crossbar selection and physical lane"); + goto cleanup; + } + + /* Get the LMFC phase adjustment */ + recoveryAction = adrv904x_JtxLink_JtxTplPhaseAdjust_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->lmfcOffset); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get the LMFC phase adjustment for the selected framer"); + goto cleanup; + } + + /* Get the Sysref for Relink */ + recoveryAction = adrv904x_JtxLink_JtxSysrefForRelink_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->newSysrefOnRelink); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get the Sysref Relink for the selected framer"); + goto cleanup; + } + + /* Get the Sync-N */ + recoveryAction = adrv904x_JtxLink_JtxSyncNSel_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->syncbInSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get the Sync-N for the selected framer"); + goto cleanup; + } + + /* Get the Sync In LVDS Mode Enable */ + recoveryAction = adrv904x_Core_SyncInCmosSchmittTrigEnable_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &dataByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get the Sync In LVDS Mode Enable"); + goto cleanup; + } + if (framerCfg->syncbInSelect == 0U) + { + framerCfg->syncbInLvdsMode = dataByte & 0x01; + } + else if (framerCfg->syncbInSelect == 1U) + { + framerCfg->syncbInLvdsMode = (dataByte >> 1U) & 0x01; + } + else if (framerCfg->syncbInSelect == 2U) + { + framerCfg->syncbInLvdsMode = (dataByte >> 2U) & 0x01; + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error syncbInSelect is invalid"); + goto cleanup; + } + + /* Get the Sync In LVDS Pn Invert */ + recoveryAction = adrv904x_Core_SyncInLvdsPnInvert_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &framerCfg->syncbInLvdsMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get the Sync In LVDS Pn Invert"); + goto cleanup; + } + + + if (framerSel == ADI_ADRV904X_FRAMER_2) + { + /* Get the ORX ADC Sample Xbar for framer 2 */ + recoveryAction = adi_adrv904x_OrxAdcSampleXbarGet(device, + framerSel, + &framerCfg->orxAdcCrossbar); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get sample crossbar converter."); + goto cleanup; + } + } + else + { + /* Get the ADC Sample Xbar */ + recoveryAction = adi_adrv904x_AdcSampleXbarGet(device, + framerSel, + &framerCfg->adcCrossbar); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get sample crossbar converter."); + goto cleanup; + } + } + + /* Check jesd204M for number of ADCs, mark the unused ones as ADI_ADRV904X_JESD_FRM_SPLXBAR_INVALID */ + for (converter = framerCfg->jesd204M; converter < ADI_ADRV904X_MAX_CONVERTER; converter++) + { + framerCfg->adcCrossbar.AdcSampleXbar[converter] = ADI_ADRV904X_JESD_FRM_SPLXBAR_INVALID; + } + + /* Get the sysref for start up */ + recoveryAction = adrv904x_JtxLink_JtxSysrefForStartup_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->sysrefForStartup); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get the sysref for start up"); + goto cleanup; + } + + /* Get the sysref-N shot enable */ + recoveryAction = adrv904x_JtxLink_JtxTplSysrefNShotEnable_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->sysrefNShotEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get the sysref-N shot enable"); + goto cleanup; + } + + /* Get the sysref-N shot count */ + recoveryAction = adrv904x_JtxLink_JtxTplSysrefNShotCount_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->sysrefNShotCount); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get the sysref-N shot count"); + goto cleanup; + } + + /* Get the sysref ignore when linked */ + recoveryAction = adrv904x_JtxLink_JtxTplSysrefIgnoreWhenLinked_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->sysrefIgnoreWhenLinked); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get the sysref ignore when linked"); + goto cleanup; + } + + /* Get the Framer IQ Rate and Lane Rate */ + switch ((int32_t) framerSel) + { + case ADI_ADRV904X_FRAMER_0: + framerIdx = 0; + break; + + case ADI_ADRV904X_FRAMER_1: + framerIdx = 1; + break; + + case ADI_ADRV904X_FRAMER_2: + framerIdx = 2; + break; + } + framerCfg->iqRate_kHz = device->initExtract.jesdSetting.framerSetting[framerIdx].iqRate_kHz; + framerCfg->laneRate_kHz = device->initExtract.jesdSetting.framerSetting[framerIdx].laneRate_kHz; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerCfgGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DeframerSel_e deframerSel, + adi_adrv904x_DeframerCfg_t* const deframerCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + uint8_t enabledDeframers = 0U; + uint8_t laneIdx = 0U; + uint8_t deframerIdx = 0U; + uint8_t tmpByte = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, deframerCfg, cleanup); + ADI_LIBRARY_MEMSET(deframerCfg, 0, sizeof(adi_adrv904x_DeframerCfg_t)); + + /* Get all deframers link state */ + recoveryAction = adrv904x_JesdCommon_JrxLinkEn_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + &enabledDeframers); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get deframer link state failed"); + goto cleanup; + } + + /* Get the base address of the selected framer */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, deframerSel, &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected framer"); + goto cleanup; + } + + /* Get the deframer link type */ + recoveryAction = adrv904x_JrxLink_JrxLinkType_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->enableJesd204C); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get link type for the selected deframer"); + goto cleanup; + } + + /* Bank ID for Jrx is not available, assign it to zero */ + deframerCfg->bankId = 0; + + /* Get the deframer device ID */ + recoveryAction = adrv904x_JrxLink_JrxCoreDidCfg_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->deviceId); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get device ID for the selected deframer"); + goto cleanup; + } + + /* Get the deframer lane ID */ + for (laneIdx = 0U; laneIdx < ADI_ADRV904X_MAX_DESERIALIZER_LANES; laneIdx++) + { + recoveryAction = adrv904x_JrxLink_JrxCoreLidCfg_BfGet(device, + NULL, + deframerBaseAddr, + laneIdx, + &deframerCfg->laneId[laneIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lane ID for the selected deframer"); + goto cleanup; + } + } + + /* get M - Number of converters per device */ + recoveryAction = adrv904x_JrxLink_JrxCoreMCfg_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->jesd204M); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of converters per device"); + goto cleanup; + } + ++deframerCfg->jesd204M; + + /* get K - Number of frames in extended multiblocks */ + recoveryAction = adrv904x_JrxLink_JrxCoreKCfg_BfGet(device, + NULL, + deframerBaseAddr, + &tmpByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of frames in extended multiblocks"); + goto cleanup; + } + + deframerCfg->jesd204K = tmpByte + 1; + + /* get Np - Total number of bits per sample */ + recoveryAction = adrv904x_JrxLink_JrxCoreNpCfg_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->jesd204Np); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get total number of bits per sample"); + goto cleanup; + } + ++deframerCfg->jesd204Np; + + /* get F - Number of octets per frame per lane*/ + recoveryAction = adrv904x_JrxLink_JrxCoreFCfg_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->jesd204F); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of octets per frame per lane"); + goto cleanup; + } + ++deframerCfg->jesd204F; + + /* get E - Number of multiblocks in extended multiblocks */ + /* This parameter is only valid for Jesd204C */ + deframerCfg->jesd204E = 0; + if (deframerCfg->enableJesd204C == 1) + { + recoveryAction = adrv904x_JrxLink_JrxCoreECfg_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->jesd204E); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of multiblocks in extended multiblocks"); + goto cleanup; + } + } + + /* get descrambling enabled */ + recoveryAction = adrv904x_JrxLink_JrxCoreDscrCfg_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->decrambling); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get descrambling enabled"); + goto cleanup; + } + + /* Get the lane crossbar selection and physical lane crossbar */ + recoveryAction = adrv904x_DeframerLaneEnableGet(device, deframerSel, deframerCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lane crossbar selection and physical lane"); + goto cleanup; + } + + /* get global LMFC phase adjustment */ + recoveryAction = adrv904x_JrxLink_JrxCorePhaseAdjust_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->lmfcOffset); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get global LMFC phase adjustment"); + goto cleanup; + } + + /* get sync Out Cmos Drive strength for both SyncOut0 and SyncOut1 */ + recoveryAction = adrv904x_Core_SyncOut0CmosTxDriveStrength_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &deframerCfg->syncbOut0CmosDriveStrength); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get syncbOut0CmosDriveStrength"); + goto cleanup; + } + + recoveryAction =adrv904x_Core_SyncOut1CmosTxDriveStrength_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &deframerCfg->syncbOut1CmosDriveStrength); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get syncbOut1CmosDriveStrength"); + goto cleanup; + } + + /* get sync out select */ + recoveryAction = adrv904x_JrxLink_JrxCoreSyncNSel_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->syncbOutSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get sync out select"); + goto cleanup; + } + + /* Should be 0, 1, 2, or 3 */ + if (deframerCfg->syncbOutSelect > 3U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid syncbOutSelect value."); + goto cleanup; + } + + /* Re-encode syncbOutSelect to 0: pin-0, 1: pin-1, 2: both pins, 3: no pin selected */ + if (deframerCfg->syncbOutSelect == 0U) + { + deframerCfg->syncbOutSelect = 3U; + } + else + { + deframerCfg->syncbOutSelect -= 1U; + } + + /* If any pin selected */ + if (deframerCfg->syncbOutSelect != 3U) + { + /* get syncbOut Lvds mode */ + recoveryAction = adrv904x_Core_SyncOutLvdsAndCmosEnable_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &deframerCfg->syncbOutLvdsMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get syncbOut Lvds mode"); + goto cleanup; + } + + /* get lvds pin invert */ + recoveryAction = adrv904x_Core_SyncOutLvdsPnInvert_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &deframerCfg->syncbOutLvdsPnInvert); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lvds pin invert"); + goto cleanup; + } + + /* Case link-0 or both link-0 and link-1 selected */ + if ((deframerCfg->syncbOutSelect == 0U) || (deframerCfg->syncbOutSelect == 2U)) + { + deframerCfg->syncbOutLvdsMode = deframerCfg->syncbOutLvdsMode & 0x01U; + deframerCfg->syncbOutLvdsPnInvert = deframerCfg->syncbOutLvdsPnInvert & 0x01U; + } + else if (deframerCfg->syncbOutSelect == 1U) /* Case only link-1 selected */ + { + deframerCfg->syncbOutLvdsMode = (deframerCfg->syncbOutLvdsMode >> 1U) & 0x01U; + deframerCfg->syncbOutLvdsPnInvert = (deframerCfg->syncbOutLvdsPnInvert >> 1U) & 0x01U; + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid 'syncbOutSelect', should be 0-2"); + goto cleanup; + } + } + + /* get Deframer output to DAC mapping */ + recoveryAction = adi_adrv904x_DacSampleXbarGet(device, + deframerSel, + &deframerCfg->dacCrossbar); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get dacCrossbar"); + goto cleanup; + } + + /* get sysref on relink enable */ + recoveryAction = adrv904x_JrxLink_JrxCoreSysrefForRelink_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->newSysrefOnRelink); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get sysref on relink enable"); + goto cleanup; + } + + /* get sysrefForStartup */ + recoveryAction = adrv904x_JrxLink_JrxCoreSysrefForStartup_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->sysrefForStartup); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get sysrefForStartup"); + goto cleanup; + } + + /* get sysrefNhot Enable*/ + recoveryAction = adrv904x_JrxLink_JrxCoreSysrefNShotEnable_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->sysrefNShotEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get sysrefNhot enable"); + goto cleanup; + } + + /* get sysrefNshotCount */ + recoveryAction = adrv904x_JrxLink_JrxCoreSysrefNShotCount_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->sysrefNShotCount); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get sysrefNshotCount"); + goto cleanup; + } + + /* get sysrefIgnoreWhenLinked*/ + recoveryAction = adrv904x_JrxLink_JrxCoreSysrefIgnoreWhenLinked_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->sysrefIgnoreWhenLinked); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get sysrefIgnoreWhenLinked"); + goto cleanup; + } + + /* Get the Deframer IQ Rate and Lane Rate */ + switch ((int32_t) deframerSel) + { + case ADI_ADRV904X_DEFRAMER_0: + deframerIdx = 0; + break; + + case ADI_ADRV904X_DEFRAMER_1: + deframerIdx = 1; + break; + } + deframerCfg->iqRate_kHz = device->initExtract.jesdSetting.deframerSetting[deframerIdx].iqRate_kHz; + deframerCfg->laneRate_kHz = device->initExtract.jesdSetting.deframerSetting[deframerIdx].laneRate_kHz; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerCfgGet_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + const adi_adrv904x_RxChannels_e chanSel, + adi_adrv904x_FramerCfg_t* const framerCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJtxLinkChanAddr_e framerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_; + uint8_t dataByte = 0U; + uint8_t enabledFramers = 0U; + uint8_t framerIdx = 0U; + uint8_t tmpByte = 0U; + uint8_t converter = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, framerCfg, cleanup); + ADI_LIBRARY_MEMSET(framerCfg, 0, sizeof(adi_adrv904x_FramerCfg_t)); + + /* Get all framers link state */ + recoveryAction =adrv904x_JesdCommon_JtxLinkEn_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + &enabledFramers); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get framer link state failed"); + goto cleanup; + } + + /* currently not used */ + framerCfg->overSample = 0; + + /* Get the base address of the selected framer */ + recoveryAction = adrv904x_FramerBitfieldAddressGet(device, framerSel, &framerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected framer"); + goto cleanup; + } + + /* Get the framer link type */ + recoveryAction = adrv904x_JtxLink_JtxLinkType_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->enableJesd204C); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get link type for the selected framer"); + goto cleanup; + } + + /* Get the framer band ID */ + recoveryAction = adrv904x_JtxLink_JtxBidCfg_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->bankId); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get band ID for the selected framer"); + goto cleanup; + } + + /* Get the framer device link ID */ + recoveryAction = adrv904x_JtxLink_JtxDidCfg_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->deviceId); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get device link ID for the selected framer"); + goto cleanup; + } + + /* Get the framer lane ID */ + recoveryAction = adrv904x_JtxLink_JtxLidCfg_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->lane0Id); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lane ID for the selected framer"); + goto cleanup; + } + + /* Get the number of converters (M) */ + recoveryAction = adrv904x_JtxLink_JtxMCfg_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->jesd204M); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of converters for the selected framer"); + goto cleanup; + } + ++framerCfg->jesd204M; + + /* Get the number of frames in a multi-frame/block (K) */ + recoveryAction = adrv904x_JtxLink_JtxKCfg_BfGet(device, + NULL, + framerBaseAddr, + &tmpByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of frames in a multi-frame/block for the selected framer"); + goto cleanup; + } + + framerCfg->jesd204K = tmpByte + 1; + + /* Get the number of octets per lane (F) */ + recoveryAction = adrv904x_JtxLink_JtxFCfg_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->jesd204F); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of octets per frame for the selected framer"); + goto cleanup; + } + ++framerCfg->jesd204F; + + /* Get the total number of bits per sample */ + recoveryAction = adrv904x_JtxLink_JtxNpCfg_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->jesd204Np); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get total number of bits per sample for the selected framer"); + goto cleanup; + } + ++framerCfg->jesd204Np; + + /* Get the number of multiblocks in extended multiblocks (E) */ + framerCfg->jesd204E = 0; + if (framerCfg->enableJesd204C) + { + recoveryAction = adrv904x_JtxLink_JtxECfg_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->jesd204E); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of multiblocks in extended multiblocks for the selected framer"); + goto cleanup; + } + } + + /* Get the scrambler enable */ + recoveryAction = adrv904x_JtxLink_JtxScrCfg_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->scramble); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get alternative scrambler enable for the selected framer"); + goto cleanup; + } + + /* Get the lane crossbar selection and physical lane crossbar */ + recoveryAction = adrv904x_FramerLaneEnableGet(device, framerSel, framerCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lane crossbar selection and physical lane"); + goto cleanup; + } + + /* Get the LMFC phase adjustment */ + recoveryAction = adrv904x_JtxLink_JtxTplPhaseAdjust_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->lmfcOffset); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get the LMFC phase adjustment for the selected framer"); + goto cleanup; + } + + /* Get the Sysref for Relink */ + recoveryAction = adrv904x_JtxLink_JtxSysrefForRelink_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->newSysrefOnRelink); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get the Sysref Relink for the selected framer"); + goto cleanup; + } + + /* Get the Sync-N */ + recoveryAction = adrv904x_JtxLink_JtxSyncNSel_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->syncbInSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get the Sync-N for the selected framer"); + goto cleanup; + } + + /* Get the Sync In LVDS Mode Enable */ + recoveryAction = adrv904x_Core_SyncInCmosSchmittTrigEnable_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &dataByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get the Sync In LVDS Mode Enable"); + goto cleanup; + } + if (framerCfg->syncbInSelect == 0U) + { + framerCfg->syncbInLvdsMode = dataByte & 0x01; + } + else if (framerCfg->syncbInSelect == 1U) + { + framerCfg->syncbInLvdsMode = (dataByte >> 1U) & 0x01; + } + else if (framerCfg->syncbInSelect == 2U) + { + framerCfg->syncbInLvdsMode = (dataByte >> 2U) & 0x01; + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error syncbInSelect is invalid"); + goto cleanup; + } + + /* Get the Sync In LVDS Pn Invert */ + recoveryAction = adrv904x_Core_SyncInLvdsPnInvert_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &framerCfg->syncbInLvdsMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get the Sync In LVDS Pn Invert"); + goto cleanup; + } + + if (framerSel == ADI_ADRV904X_FRAMER_2) + { + /* Get the ORX ADC Sample Xbar for framer 2 */ + recoveryAction = adi_adrv904x_OrxAdcSampleXbarGet(device, + framerSel, + &framerCfg->orxAdcCrossbar); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get sample crossbar converter."); + goto cleanup; + } + } + else + { + /* Get the ADC Sample Xbar */ + recoveryAction = adi_adrv904x_CddcSampleXBarGet(device, + framerSel, + chanSel, + &framerCfg->cddcCrossbar); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get sample crossbar converter."); + goto cleanup; + } + } + + + /* Check jesd204M for number of ADCs, mark the unused ones as ADI_ADRV904X_JESD_FRM_SPLXBAR_INVALID */ + for (converter = framerCfg->jesd204M; converter < ADI_ADRV904X_MAX_CDDC_CONVERTER; converter++) + { + framerCfg->cddcCrossbar.cddcSampleXbar[converter] = ADI_ADRV904X_JESD_FRM_SPLXBAR_INVALID; + } + + /* Get the sysref for start up */ + recoveryAction = adrv904x_JtxLink_JtxSysrefForStartup_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->sysrefForStartup); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get the sysref for start up"); + goto cleanup; + } + + /* Get the sysref-N shot enable */ + recoveryAction = adrv904x_JtxLink_JtxTplSysrefNShotEnable_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->sysrefNShotEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get the sysref-N shot enable"); + goto cleanup; + } + + /* Get the sysref-N shot count */ + recoveryAction = adrv904x_JtxLink_JtxTplSysrefNShotCount_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->sysrefNShotCount); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get the sysref-N shot count"); + goto cleanup; + } + + /* Get the sysref ignore when linked */ + recoveryAction = adrv904x_JtxLink_JtxTplSysrefIgnoreWhenLinked_BfGet(device, + NULL, + framerBaseAddr, + &framerCfg->sysrefIgnoreWhenLinked); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get the sysref ignore when linked"); + goto cleanup; + } + + /* Get the Framer IQ Rate and Lane Rate */ + switch ((int32_t) framerSel) + { + case ADI_ADRV904X_FRAMER_0: + framerIdx = 0; + break; + + case ADI_ADRV904X_FRAMER_1: + framerIdx = 1; + break; + + case ADI_ADRV904X_FRAMER_2: + framerIdx = 2; + break; + } + framerCfg->iqRate_kHz = device->initExtract.jesdSetting.framerSetting[framerIdx].iqRate_kHz; + framerCfg->laneRate_kHz = device->initExtract.jesdSetting.framerSetting[framerIdx].laneRate_kHz; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); + +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerCfgGet_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + const adi_adrv904x_TxChannels_e chanSel, + adi_adrv904x_DeframerCfg_t* const deframerCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + uint8_t enabledDeframers = 0U; + uint8_t laneIdx = 0U; + uint8_t deframerIdx = 0U; + uint8_t tmpByte = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, deframerCfg, cleanup); + ADI_LIBRARY_MEMSET(deframerCfg, 0, sizeof(adi_adrv904x_DeframerCfg_t)); + + /* Get all deframers link state */ + recoveryAction = adrv904x_JesdCommon_JrxLinkEn_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + &enabledDeframers); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get deframer link state failed"); + goto cleanup; + } + + /* Get the base address of the selected framer */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, deframerSel, &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected framer"); + goto cleanup; + } + + /* Get the deframer link type */ + recoveryAction = adrv904x_JrxLink_JrxLinkType_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->enableJesd204C); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get link type for the selected deframer"); + goto cleanup; + } + + /* Bank ID for Jrx is not available, assign it to zero */ + deframerCfg->bankId = 0; + + /* Get the deframer device ID */ + recoveryAction = adrv904x_JrxLink_JrxCoreDidCfg_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->deviceId); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get device ID for the selected deframer"); + goto cleanup; + } + + /* Get the deframer lane ID */ + for (laneIdx = 0U; laneIdx < ADI_ADRV904X_MAX_DESERIALIZER_LANES; laneIdx++) + { + recoveryAction = adrv904x_JrxLink_JrxCoreLidCfg_BfGet(device, + NULL, + deframerBaseAddr, + laneIdx, + &deframerCfg->laneId[laneIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lane ID for the selected deframer"); + goto cleanup; + } + } + + /* get M - Number of converters per device */ + recoveryAction = adrv904x_JrxLink_JrxCoreMCfg_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->jesd204M); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of converters per device"); + goto cleanup; + } + ++deframerCfg->jesd204M; + + /* get K - Number of frames in extended multiblocks */ + recoveryAction = adrv904x_JrxLink_JrxCoreKCfg_BfGet(device, + NULL, + deframerBaseAddr, + &tmpByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of frames in extended multiblocks"); + goto cleanup; + } + + deframerCfg->jesd204K = tmpByte + 1; + + /* get Np - Total number of bits per sample */ + recoveryAction = adrv904x_JrxLink_JrxCoreNpCfg_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->jesd204Np); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get total number of bits per sample"); + goto cleanup; + } + ++deframerCfg->jesd204Np; + + /* get F - Number of octets per frame per lane*/ + recoveryAction = adrv904x_JrxLink_JrxCoreFCfg_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->jesd204F); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of octets per frame per lane"); + goto cleanup; + } + ++deframerCfg->jesd204F; + + /* get E - Number of multiblocks in extended multiblocks */ + /* This parameter is only valid for Jesd204C */ + deframerCfg->jesd204E = 0; + if (deframerCfg->enableJesd204C == 1) + { + recoveryAction = adrv904x_JrxLink_JrxCoreECfg_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->jesd204E); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of multiblocks in extended multiblocks"); + goto cleanup; + } + } + + /* get descrambling enabled */ + recoveryAction = adrv904x_JrxLink_JrxCoreDscrCfg_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->decrambling); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get descrambling enabled"); + goto cleanup; + } + + /* Get the lane crossbar selection and physical lane crossbar */ + recoveryAction = adrv904x_DeframerLaneEnableGet(device, deframerSel, deframerCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lane crossbar selection and physical lane"); + goto cleanup; + } + + /* get global LMFC phase adjustment */ + recoveryAction = adrv904x_JrxLink_JrxCorePhaseAdjust_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->lmfcOffset); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get global LMFC phase adjustment"); + goto cleanup; + } + + /* get sync Out Cmos Drive strength for both SyncOut0 and SyncOut1 */ + recoveryAction = adrv904x_Core_SyncOut0CmosTxDriveStrength_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &deframerCfg->syncbOut0CmosDriveStrength); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get syncbOut0CmosDriveStrength"); + goto cleanup; + } + + recoveryAction =adrv904x_Core_SyncOut1CmosTxDriveStrength_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &deframerCfg->syncbOut1CmosDriveStrength); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get syncbOut1CmosDriveStrength"); + goto cleanup; + } + + /* get sync out select */ + recoveryAction = adrv904x_JrxLink_JrxCoreSyncNSel_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->syncbOutSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get sync out select"); + goto cleanup; + } + + /* Should be 0, 1, 2, or 3 */ + if (deframerCfg->syncbOutSelect > 3U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid syncbOutSelect value."); + goto cleanup; + } + + /* Re-encode syncbOutSelect to 0: pin-0, 1: pin-1, 2: both pins, 3: no pin selected */ + if (deframerCfg->syncbOutSelect == 0U) + { + deframerCfg->syncbOutSelect = 3U; + } + else + { + deframerCfg->syncbOutSelect -= 1U; + } + + /* If any pin selected */ + if (deframerCfg->syncbOutSelect != 3U) + { + /* get syncbOut Lvds mode */ + recoveryAction = adrv904x_Core_SyncOutLvdsAndCmosEnable_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &deframerCfg->syncbOutLvdsMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get syncbOut Lvds mode"); + goto cleanup; + } + + /* get lvds pin invert */ + recoveryAction = adrv904x_Core_SyncOutLvdsPnInvert_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + &deframerCfg->syncbOutLvdsPnInvert); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lvds pin invert"); + goto cleanup; + } + + /* Case link-0 or both link-0 and link-1 selected */ + if ((deframerCfg->syncbOutSelect == 0U) || (deframerCfg->syncbOutSelect == 2U)) + { + deframerCfg->syncbOutLvdsMode = deframerCfg->syncbOutLvdsMode & 0x01U; + deframerCfg->syncbOutLvdsPnInvert = deframerCfg->syncbOutLvdsPnInvert & 0x01U; + } + else if (deframerCfg->syncbOutSelect == 1U) /* Case only link-1 selected */ + { + deframerCfg->syncbOutLvdsMode = (deframerCfg->syncbOutLvdsMode >> 1U) & 0x01U; + deframerCfg->syncbOutLvdsPnInvert = (deframerCfg->syncbOutLvdsPnInvert >> 1U) & 0x01U; + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid 'syncbOutSelect', should be 0-2"); + goto cleanup; + } + } + + /* get Deframer output to DAC mapping */ + recoveryAction = adi_adrv904x_CducSampleXBarGet(device, + deframerSel, + chanSel, + &deframerCfg->cducCrossbar); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get dacCrossbar"); + goto cleanup; + } + + /* get sysref on relink enable */ + recoveryAction = adrv904x_JrxLink_JrxCoreSysrefForRelink_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->newSysrefOnRelink); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get sysref on relink enable"); + goto cleanup; + } + + /* get sysrefForStartup */ + recoveryAction = adrv904x_JrxLink_JrxCoreSysrefForStartup_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->sysrefForStartup); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get sysrefForStartup"); + goto cleanup; + } + + /* get sysrefNhot Enable*/ + recoveryAction = adrv904x_JrxLink_JrxCoreSysrefNShotEnable_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->sysrefNShotEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get sysrefNhot enable"); + goto cleanup; + } + + /* get sysrefNshotCount */ + recoveryAction = adrv904x_JrxLink_JrxCoreSysrefNShotCount_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->sysrefNShotCount); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get sysrefNshotCount"); + goto cleanup; + } + + /* get sysrefIgnoreWhenLinked*/ + recoveryAction = adrv904x_JrxLink_JrxCoreSysrefIgnoreWhenLinked_BfGet(device, + NULL, + deframerBaseAddr, + &deframerCfg->sysrefIgnoreWhenLinked); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get sysrefIgnoreWhenLinked"); + goto cleanup; + } + + /* Get the Deframer IQ Rate and Lane Rate */ + switch ((int32_t) deframerSel) + { + case ADI_ADRV904X_DEFRAMER_0: + deframerIdx = 0; + break; + + case ADI_ADRV904X_DEFRAMER_1: + deframerIdx = 1; + break; + } + deframerCfg->iqRate_kHz = device->initExtract.jesdSetting.deframerSetting[deframerIdx].iqRate_kHz; + deframerCfg->laneRate_kHz = device->initExtract.jesdSetting.deframerSetting[deframerIdx].laneRate_kHz; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerLinkStateSet(adi_adrv904x_Device_t* device, + const uint8_t framerSelMask, + uint8_t const enable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t framerLinkSet = 0U; + uint8_t framerIdx = 0U; + uint8_t framerSel = 0U; + + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Validate parameters */ + if (((framerSelMask & ~ADI_ADRV904X_ALL_FRAMERS) > 0U) || (framerSelMask == 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid framerSelMask."); + goto cleanup; + } + + if ((enable & ~(1U)) > 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid enable parameter."); + goto cleanup; + } + + /* Read the current framer link state */ + recoveryAction = adrv904x_JesdCommon_JtxLinkEn_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + &framerLinkSet); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get framer link state"); + goto cleanup; + } + + for (framerIdx = 0; framerIdx < ADI_ADRV904X_MAX_FRAMERS; framerIdx++) + { + framerSel = 1U << framerIdx; + /* Skip unselected framer */ + if ((framerSel & framerSelMask) == 0) + { + continue; + } + + if (enable) + { + framerLinkSet |= framerSel; + } + else /* disable */ + { + framerLinkSet &= ~framerSel; + } + } + + recoveryAction = adrv904x_JesdCommon_JtxLinkEn_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + framerLinkSet); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to set framer link state"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerLinkStateGet(adi_adrv904x_Device_t* const device, + uint8_t* const framerLinkState) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, framerLinkState, cleanup); + + /* Read the current framer link state */ + recoveryAction = adrv904x_JesdCommon_JtxLinkEn_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + framerLinkState); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get framer link state"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerLinkStateSet(adi_adrv904x_Device_t* device, + const uint8_t deframerSelMask, + uint8_t const enable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t deframerLinkSet = 0U; + uint8_t deframerIdx = 0U; + uint8_t deframerSel = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Validate parameters */ + if (((deframerSelMask & ~ADI_ADRV904X_ALL_DEFRAMER) > 0U) || (deframerSelMask == 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid deframerSelMask."); + goto cleanup; + } + + if ((enable & ~(1U)) > 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid enable parameter."); + goto cleanup; + } + + /* Get all deframers link state */ + recoveryAction = adrv904x_JesdCommon_JrxLinkEn_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + &deframerLinkSet); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get deframer link state"); + goto cleanup; + } + + /* Prepare for deframers enabling and disabling */ + for (deframerIdx = 0; deframerIdx < ADI_ADRV904X_MAX_DEFRAMERS; deframerIdx++) + { + deframerSel = 1U << deframerIdx; + if ((deframerSel & deframerSelMask) > 0) + { + if (enable) + { + deframerLinkSet |= deframerSel; + } + else /* disable */ + { + deframerLinkSet &= ~deframerSel; + } + } + } + + recoveryAction = adrv904x_JesdCommon_JrxLinkEn_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + deframerLinkSet); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to set deframer link state"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerLinkStateGet(adi_adrv904x_Device_t* device, + uint8_t* const deframerLinkState) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, deframerLinkState, cleanup); + + /* Get all deframers link state */ + recoveryAction = adrv904x_JesdCommon_JrxLinkEn_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + deframerLinkState); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get deframer link state"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmPrbsCountReset(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + recoveryAction = adrv904x_JesdCommon_JrxTestLaneClearErrors_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to clear test lane JRX error"); + goto cleanup; + } + + recoveryAction = adrv904x_JesdCommon_JrxTestLaneClearErrors_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to perform PRBS Count Reset"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmPrbsCheckerStateSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfrmPrbsCfg_t * const dfrmPrbsCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dfrmPrbsCfg, cleanup); + + /* Validate parameters */ + if (dfrmPrbsCfg->polyOrder > ADI_ADRV904X_USERDATA) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid parameter: test mode"); + goto cleanup; + } + + /* Clear error counter for all lanes */ + recoveryAction = adi_adrv904x_DfrmPrbsCountReset(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to reset PRBS Count error"); + goto cleanup; + } + + recoveryAction = adrv904x_JesdCommon_JrxTestSource_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + dfrmPrbsCfg->checkerLocation); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to set Checker Location."); + goto cleanup; + } + + recoveryAction = adrv904x_JesdCommon_JrxTestMode_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + dfrmPrbsCfg->polyOrder); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to set Test Mode."); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmPrbsCheckerStateGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfrmPrbsCfg_t * const dfrmPrbsCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t regValue = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dfrmPrbsCfg, cleanup); + + recoveryAction = adrv904x_JesdCommon_JrxTestSource_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + ®Value); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get Checker Location."); + goto cleanup; + } + + dfrmPrbsCfg->checkerLocation = (adi_adrv904x_DeframerPrbsCheckLoc_e) regValue; + + recoveryAction = adrv904x_JesdCommon_JrxTestMode_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + ®Value); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get Test Mode."); + goto cleanup; + } + + dfrmPrbsCfg->polyOrder = (adi_adrv904x_DeframerPrbsOrder_e) regValue; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerSysrefCtrlSet(adi_adrv904x_Device_t* const device, + const uint8_t framerSelMask, + uint8_t const enable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t maskSysref = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Validate parameters */ + if (((framerSelMask & ~ADI_ADRV904X_ALL_FRAMERS) > 0U) || (framerSelMask == 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid framerSelMask."); + goto cleanup; + } + + if ((enable & ~(1U)) > 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid enable parameter."); + goto cleanup; + } + + /* Converting enable value to sysref mask value. + * Note that the sysref mask when high, mask any incoming SYSREF to 0 + */ + maskSysref = (enable == 0U) ? 1U : 0U; + + if (framerSelMask & ADI_ADRV904X_FRAMER_0) + { + recoveryAction = adrv904x_JtxLink_JtxTplSysrefMask_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_, + maskSysref); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to set SYSREF CRTL for framer 0."); + goto cleanup; + } + } + + if (framerSelMask & ADI_ADRV904X_FRAMER_1) + { + recoveryAction = adrv904x_JtxLink_JtxTplSysrefMask_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_, + maskSysref); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to set SYSREF CRTL for framer 1."); + goto cleanup; + } + } + + if (framerSelMask & ADI_ADRV904X_FRAMER_2) + { + recoveryAction = adrv904x_JtxLink_JtxTplSysrefMask_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_, + maskSysref); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to set SYSREF CRTL for framer 2."); + goto cleanup; + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerSysrefCtrlGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + uint8_t * const enable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJtxLinkChanAddr_e framerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_; + uint8_t maskSysref = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, enable, cleanup); + + /* Get the base address of the selected framer */ + recoveryAction = adrv904x_FramerBitfieldAddressGet(device, framerSel, &framerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected framer"); + goto cleanup; + } + + /* Read the current framer SYSREF CTRL */ + recoveryAction = adrv904x_JtxLink_JtxTplSysrefMask_BfGet(device, + NULL, + framerBaseAddr, + &maskSysref); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get framer SYSREF CTRL"); + goto cleanup; + } + + *enable = ((~maskSysref) & 0x01); + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerSysrefCtrlSet(adi_adrv904x_Device_t* const device, + const uint8_t deframerSelMask, + uint8_t const enable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t maskSysref = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Validate parameters */ + if (((deframerSelMask & ~ADI_ADRV904X_ALL_DEFRAMER) > 0U) || (deframerSelMask == 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid deframerSelMask."); + goto cleanup; + } + + if ((enable & ~(1U)) > 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid enable parameter."); + goto cleanup; + } + + /* Converting enable value to sysref mask value. + * Note that the sysref mask when low, mask any incoming SYSREF to 0 + */ + maskSysref = enable; + + if (deframerSelMask & ADI_ADRV904X_DEFRAMER_0) + { + recoveryAction = adrv904x_JrxLink_JrxCoreSysrefEnable_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_, + maskSysref); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to set SYSREF CRTL for deframer 0."); + goto cleanup; + } + } + + if (deframerSelMask & ADI_ADRV904X_DEFRAMER_1) + { + recoveryAction = adrv904x_JrxLink_JrxCoreSysrefEnable_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_1_, + maskSysref); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to set SYSREF CRTL for deframer 1."); + goto cleanup; + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerSysrefCtrlGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + uint8_t * const enable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + uint8_t regValue = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, enable, cleanup); + + /* Get the base address of the selected framer */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, deframerSel, &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected deframer"); + goto cleanup; + } + + /* Read the current framer SYSREF CTRL */ + recoveryAction = adrv904x_JrxLink_JrxCoreSysrefEnable_BfGet(device, + NULL, + deframerBaseAddr, + ®Value); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get deframer SYSREF CTRL"); + goto cleanup; + } + + *enable = regValue; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerTestDataSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_FrmTestDataCfg_t * const frmTestDataCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t framerLinkState; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, frmTestDataCfg, cleanup); + + /* Validate parameters */ + if (((frmTestDataCfg->framerSelMask & ~ADI_ADRV904X_ALL_FRAMERS) > 0U) || + (frmTestDataCfg->framerSelMask == 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid framerSelMask."); + goto cleanup; + } + + if (frmTestDataCfg->framerSelMask & ADI_ADRV904X_FRAMER_0) + { + recoveryAction = adrv904x_JtxLink_JtxTestGenMode_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_, + (uint8_t) frmTestDataCfg->testDataSource); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to set PRBS Test Gen Mode for framer 0."); + goto cleanup; + } + + recoveryAction = adrv904x_JtxLink_JtxTestGenSel_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_, + (uint8_t) frmTestDataCfg->injectPoint); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to set PRBS Test Inject Point for framer 0."); + goto cleanup; + } + } + + if (frmTestDataCfg->framerSelMask & ADI_ADRV904X_FRAMER_1) + { + recoveryAction = adrv904x_JtxLink_JtxTestGenMode_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_, + (uint8_t) frmTestDataCfg->testDataSource); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to set PRBS Test Gen Mode for framer 1."); + goto cleanup; + } + + recoveryAction = adrv904x_JtxLink_JtxTestGenSel_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_, + (uint8_t) frmTestDataCfg->injectPoint); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to set PRBS Test Inject Point for framer 1."); + goto cleanup; + } + } + + if (frmTestDataCfg->framerSelMask & ADI_ADRV904X_FRAMER_2) + { + recoveryAction = adrv904x_JtxLink_JtxTestGenMode_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_, + (uint8_t) frmTestDataCfg->testDataSource); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to set PRBS Test Gen Mode for framer 2."); + goto cleanup; + } + + recoveryAction = adrv904x_JtxLink_JtxTestGenSel_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_, + (uint8_t) frmTestDataCfg->injectPoint); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to set PRBS Test Inject Point for framer 2."); + goto cleanup; + } + } + + /* Toggle framer link enable changing to PRBS otherwise PRBS might get stuck */ + /* Read the current framer link state */ + recoveryAction = adrv904x_JesdCommon_JtxLinkEn_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + &framerLinkState); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get framer link state"); + goto cleanup; + } + + recoveryAction = adrv904x_JesdCommon_JtxLinkEn_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + 0u); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to set framer link state"); + goto cleanup; + } + + recoveryAction = adrv904x_JesdCommon_JtxLinkEn_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + framerLinkState); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to set framer link state"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerTestDataGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + adi_adrv904x_FrmTestDataCfg_t * const frmTestDataCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJtxLinkChanAddr_e framerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_; + uint8_t tmpByte = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, frmTestDataCfg, cleanup); + + /* Get the base address of the selected framer */ + recoveryAction = adrv904x_FramerBitfieldAddressGet(device, framerSel, &framerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected framer"); + goto cleanup; + } + + /* Read the current framer PRBS Gen Mode */ + recoveryAction = adrv904x_JtxLink_JtxTestGenMode_BfGet(device, + NULL, + framerBaseAddr, + &tmpByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get framer PRBS Gen Mode"); + goto cleanup; + } + + frmTestDataCfg->testDataSource = (adi_adrv904x_FramerDataSource_e)tmpByte; + + /* Read the current framer PRBS Inject Point */ + recoveryAction = adrv904x_JtxLink_JtxTestGenSel_BfGet(device, + NULL, + framerBaseAddr, + &tmpByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get framer PRBS Inject Point"); + goto cleanup; + } + + frmTestDataCfg->injectPoint = (adi_adrv904x_FramerDataInjectPoint_e)tmpByte; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmPrbsErrCountGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfrmPrbsErrCounters_t * const counters) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t regData = 0U; + uint8_t laneIdx = 0U; + uint8_t tmpByte = 0U; + + adi_adrv904x_DfrmPrbsCfg_t dfrmPrbsCfg; + + ADI_LIBRARY_MEMSET(&dfrmPrbsCfg, 0, sizeof(adi_adrv904x_DfrmPrbsCfg_t)); + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, counters, cleanup); + + recoveryAction = adi_adrv904x_DfrmPrbsCheckerStateGet(device, &dfrmPrbsCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to get the PRBS mode"); + goto cleanup; + } + + counters->sampleSource = dfrmPrbsCfg.checkerLocation; + if ( (dfrmPrbsCfg.checkerLocation == ADI_ADRV904X_PRBSCHECK_SAMPLEDATA) && (dfrmPrbsCfg.polyOrder != ADI_ADRV904X_USERDATA) ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error: The HW isn't configured as expected for sample data mode. Call adi_adrv904x_DfrmPrbsCheckerStateSet() with the appropriate config"); + goto cleanup; + } + + if (counters->sampleSource == ADI_ADRV904X_PRBSCHECK_SAMPLEDATA) + { + /* Trigger update of the sample error counters */ + recoveryAction = adrv904x_JesdCommon_JrxTestSampleUpdateErrorCount_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to update test sample error count."); + goto cleanup; + } + + /* Now read the sample counter value. We use the zeroth index only in sample mode. */ + recoveryAction = adrv904x_JesdCommon_JrxTestSampleErrorCount_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + &tmpByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get test sample error count."); + goto cleanup; + } + + counters->laneErrors[0] = tmpByte; + + recoveryAction = adrv904x_JesdCommon_JrxTestSampleErrorFlag_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get test sample error flag."); + goto cleanup; + } + counters->errorStatus[0] |= ((regData & 1U) << 1); + + recoveryAction = adrv904x_JesdCommon_JrxTestSampleClearErrors_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get test sample error flag."); + goto cleanup; + } + counters->errorStatus[0] |= ((regData & 1U) << 2); + } + + if (counters->sampleSource == ADI_ADRV904X_PRBSCHECK_LANEDATA) + { + /* Trigger update of lane error counters */ + recoveryAction = adrv904x_JesdCommon_JrxTestLaneUpdateErrorCount_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to update test lane error count."); + goto cleanup; + } + + for (laneIdx = 0; laneIdx < ADI_ADRV904X_MAX_DESERIALIZER_LANES; laneIdx++) + { + recoveryAction = adrv904x_JesdCommon_JrxTestLaneErrorCount_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + &counters->laneErrors[laneIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get test lane error count."); + goto cleanup; + } + + recoveryAction = adrv904x_JesdCommon_JrxTestLaneInv_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get test lane error count."); + goto cleanup; + } + + counters->errorStatus[laneIdx] = regData; + + recoveryAction = adrv904x_JesdCommon_JrxTestLaneInvalidDataFlag_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get test lane invalid data flag."); + goto cleanup; + } + + counters->errorStatus[laneIdx] |= ((regData & 1U) << 1U); + + recoveryAction = adrv904x_JesdCommon_JrxTestLaneErrorFlag_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get test lane error flag."); + goto cleanup; + } + + counters->errorStatus[laneIdx] |= ((regData & 1U) << 2U); + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SerializerReset(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t framerLinkType = 0U; + uint8_t phyLanePd = 0U; + uint8_t phyLanePdMask = 0U; + uint8_t phyLaneIdx = 0U; + adrv904x_BfSerdesTxdigPhyRegmapCore1p2ChanAddr_e laneSerdesPhyBitfieldAddr = ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_0_; + adrv904x_CpuCmd_JtxLanePower_t jtxPwrCmd; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_LIBRARY_MEMSET(&jtxPwrCmd, 0, sizeof(jtxPwrCmd)); + + /* Get the framer link type: 204B or 204C - Check link0 type only */ + recoveryAction = adrv904x_JtxLink_JtxLinkType_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_, + &framerLinkType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get link type for the selected framer"); + goto cleanup; + } + + /* The reset sequence differs for 204c/204b mode */ + if (framerLinkType == 0U) + { + /* 204B case: + * 1. Set the clock offset to 4 for powered-up lanes + * 2. Then send CPU_CMD_ID_JESD_SER_RESET */ + + /* Iterate over each jtx lane. If lane is powered-up set the clock offset to 4. */ + for(phyLaneIdx = 0U ; phyLaneIdx < ADI_ADRV904X_MAX_SERDES_LANES ; phyLaneIdx++) + { + recoveryAction = (adi_adrv904x_ErrAction_e) adrv904x_FramerLaneSerdesPhyBitfieldAddressGet(device, + phyLaneIdx, + &laneSerdesPhyBitfieldAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lane serdes PHY address."); + goto cleanup; + } + + recoveryAction = adrv904x_GetJtxLanePoweredDown(device, + laneSerdesPhyBitfieldAddr, + &phyLanePd); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading Jtx lane power-up status"); + goto cleanup; + } + + if (phyLanePd == 0U) + { + /* Jtx lane is powered-up; set Clockoffset to 4 */ + recoveryAction = adrv904x_SerdesTxdigPhyRegmapCore1p2_ClkoffsetSerRc_BfSet( device, + NULL, + laneSerdesPhyBitfieldAddr, + 4U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing to serializer clock offset"); + goto cleanup; + } + } + } /* End for loop to set clock offset on powered lanes */ + + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + + adrv904x_CpuCmd_SerReset_t serReset; + adrv904x_CpuCmd_SerResetResp_t serResetResp; + ADI_LIBRARY_MEMSET(&serReset, 0, sizeof(adrv904x_CpuCmd_SerReset_t)); + ADI_LIBRARY_MEMSET(&serResetResp, 0, sizeof(adrv904x_CpuCmd_SerResetResp_t)); + + /* Use default reset parameter */ + serReset.serResetParm = ADRV904X_HTOCL(1u); + /* Send serializer reset command */ + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_JESD_SER_RESET, + (void*)&serReset, + sizeof(serReset), + (void*)&serResetResp, + sizeof(serResetResp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(serResetResp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + } /* End 204b case */ + else + { + /* 204C case: + * 1. Power down currenty powered up lanes and set their FIFO addrs and clk offsets. + * 2. Power up ALL lanes. + * 3. Power down the originally powered down lanes. */ + for (phyLaneIdx = 0U; phyLaneIdx < ADI_ADRV904X_MAX_SERDES_LANES; phyLaneIdx++) + { + recoveryAction = (adi_adrv904x_ErrAction_e) adrv904x_FramerLaneSerdesPhyBitfieldAddressGet(device, + phyLaneIdx, + &laneSerdesPhyBitfieldAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lane serdes PHY address."); + goto cleanup; + } + + recoveryAction = adrv904x_GetJtxLanePoweredDown(device, + laneSerdesPhyBitfieldAddr, + &phyLanePd); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading Jtx lane power-up status"); + goto cleanup; + } + + /* Keep track of powered-down lanes */ + phyLanePdMask |= phyLanePd << phyLaneIdx; + + if (phyLanePd == 0U) + { + /* Lane is powered up; power it down */ + /* Prepare the command payload to power-down the lane. uint8_t fields don't require HTOC conversion. */ + jtxPwrCmd.jtxLaneMask = 1U << phyLaneIdx; + jtxPwrCmd.jtxLanePower = 0x00; + + /* Send command. There is no cmd-specific response expected. + * This command is always sent to CPU0 regardless of lane-CPU assignment. */ + recoveryAction = adrv904x_CpuCmdSend(device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_JESD_TX_LANE_POWER, + (void*)&jtxPwrCmd, + sizeof(jtxPwrCmd), + NULL, + 0U, + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to call CPU cmd ADRV904X_CPU_CMD_ID_JESD_TX_LANE_POWER"); + goto cleanup; + } + + /* set FIFO Start Addr to 1 */ + recoveryAction = adrv904x_SerdesTxdigPhyRegmapCore1p2_FifoStartAddr_BfSet( device, + NULL, + laneSerdesPhyBitfieldAddr, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing Fifo Start Address"); + goto cleanup; + } + + /* set Clockoffset to 1 */ + recoveryAction = adrv904x_SerdesTxdigPhyRegmapCore1p2_ClkoffsetSerRc_BfSet( device, + NULL, + laneSerdesPhyBitfieldAddr, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing digital logic clock shift"); + goto cleanup; + } + } + } /* end for loop per lane to set clk offset and fifo */ + + /* Power up all lanes */ + /* uint8_t fields don't require HTOC conversion. */ + jtxPwrCmd.jtxLaneMask = 0xFF; + jtxPwrCmd.jtxLanePower = 0xFF; + + /* Send command. There is no cmd-specific response expected. + * This command is always sent to CPU0 regardless of lane-CPU assignment. */ + recoveryAction = adrv904x_CpuCmdSend(device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_JESD_TX_LANE_POWER, + (void*)&jtxPwrCmd, + sizeof(jtxPwrCmd), + NULL, + 0U, + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to call CPU cmd ADRV904X_CPU_CMD_ID_JESD_TX_LANE_POWER"); + goto cleanup; + } + + /* Now put the lanes that were powered down before this fn was called back into power-down. */ + jtxPwrCmd.jtxLaneMask = phyLanePdMask; + jtxPwrCmd.jtxLanePower = 0x00; + + /* Send command. There is no cmd-specific response expected. + * This command is always sent to CPU0 regardless of lane-CPU assignment. */ + recoveryAction = adrv904x_CpuCmdSend(device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_JESD_TX_LANE_POWER, + (void*)&jtxPwrCmd, + sizeof(jtxPwrCmd), + NULL, + 0U, + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to re-powerdown disabled lanes."); + goto cleanup; + } + + } /* End 204c if */ + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerLmfcOffsetSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSelect, + const uint16_t lmfcOffset) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJtxLinkChanAddr_e framerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_; + uint16_t kValue = 0U; + uint8_t sValue = 0U; + uint8_t tmpByte = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Get the base address of the selected framer */ + recoveryAction = adrv904x_FramerBitfieldAddressGet(device, framerSelect, &framerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected framer"); + goto cleanup; + } + + /* get K - Number of frames in extended multiblocks */ + recoveryAction = adrv904x_JtxLink_JtxKCfg_BfGet(device, + NULL, + framerBaseAddr, + &tmpByte); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of frames in extended multiblocks"); + goto cleanup; + } + + kValue = tmpByte + 1; + + /* get S - Samples per converter per frame */ + recoveryAction = adrv904x_JtxLink_JtxSCfg_BfGet(device, + NULL, + framerBaseAddr, + &sValue); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get samples per frame"); + goto cleanup; + } + ++sValue; + + if (lmfcOffset > ((kValue * sValue) - 1)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, lmfcOffset, "lmfcOffet should be less than or equal to K*S-1"); + goto cleanup; + } + + recoveryAction = adrv904x_JtxLink_JtxTplPhaseAdjust_BfSet(device, + NULL, + framerBaseAddr, + lmfcOffset); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing phase adjust value for the selected framer"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerLmfcOffsetGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSelect, + uint16_t * const lmfcOffset) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJtxLinkChanAddr_e framerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, lmfcOffset, cleanup); + + /* Get the base address of the selected framer */ + recoveryAction = adrv904x_FramerBitfieldAddressGet(device, framerSelect, &framerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected framer"); + goto cleanup; + } + + recoveryAction = adrv904x_JtxLink_JtxTplPhaseAdjust_BfGet(device, + NULL, + framerBaseAddr, + lmfcOffset); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading phase adjust value for selected framer"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmLmfcOffsetSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSelect, + const uint16_t lmfcOffset) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + uint16_t kValue = 0U; + uint8_t sValue = 0U; + uint8_t tmpByte = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Get the base address of the selected deframer */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, deframerSelect, &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected deframer"); + goto cleanup; + } + + /* get K - Number of frames in extended multiblocks */ + recoveryAction = adrv904x_JrxLink_JrxCoreKCfg_BfGet(device, + NULL, + deframerBaseAddr, + &tmpByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of frames in extended multiblocks"); + goto cleanup; + } + + kValue = tmpByte + 1; + + /* get S - Samples per converter per frame */ + recoveryAction = adrv904x_JrxLink_JrxCoreSCfg_BfGet(device, + NULL, + deframerBaseAddr, + &sValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get samples per frame"); + goto cleanup; + } + ++sValue; + + if (lmfcOffset > ((kValue * sValue) - 1)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, lmfcOffset, "lmfcOffet should be less than or equal to K*S-1"); + goto cleanup; + } + + recoveryAction = adrv904x_JrxLink_JrxCorePhaseAdjust_BfSet(device, + NULL, + deframerBaseAddr, + lmfcOffset); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing phase adjust value"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmLmfcOffsetGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSelect, + uint16_t * const lmfcOffset) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, lmfcOffset, cleanup); + + /* Get the base address of the selected deframer */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, deframerSelect, &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected deframer"); + goto cleanup; + } + + recoveryAction = adrv904x_JrxLink_JrxCorePhaseAdjust_BfGet(device, + NULL, + deframerBaseAddr, + lmfcOffset); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading phase adjust value"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmPhaseDiffGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSelect, + uint16_t * const phaseDiff) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + uint16_t kValue = 0U; + uint8_t sValue = 0U; + uint16_t phaseDiffReadback = 0U; + uint16_t phaseAdjReadback = 0U; + uint16_t kTimesS = 0U; + uint8_t tmpByte = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, phaseDiff, cleanup); + + /* Get the base address of the selected deframer */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, deframerSelect, &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected deframer"); + goto cleanup; + } + + /* get K - Number of frames in extended multiblocks */ + recoveryAction = adrv904x_JrxLink_JrxCoreKCfg_BfGet(device, + NULL, + deframerBaseAddr, + &tmpByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get number of frames in extended multiblocks"); + goto cleanup; + } + + kValue = tmpByte + 1; + + /* get S - Samples per converter per frame */ + recoveryAction = adrv904x_JrxLink_JrxCoreSCfg_BfGet(device, + NULL, + deframerBaseAddr, + &sValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get samples per frame"); + goto cleanup; + } + ++sValue; + + /* get phase diff for selected deframer */ + recoveryAction = adrv904x_JrxLink_JrxCorePhaseDiff_BfGet(device, + NULL, + deframerBaseAddr, + &phaseDiffReadback); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading phase diff value from device"); + goto cleanup; + } + + recoveryAction = adrv904x_JrxLink_JrxCorePhaseAdjust_BfGet(device, + NULL, + deframerBaseAddr, + &phaseAdjReadback); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading phase adjust value"); + goto cleanup; + } + + kTimesS = (uint16_t)kValue * (uint16_t)sValue; + + /* Calculate the phase diff after the adjustment by using K*S circular buffer */ + *phaseDiff = (kTimesS + phaseDiffReadback - phaseAdjReadback) % kTimesS; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + adi_adrv904x_FramerStatus_t * const framerStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJtxLinkChanAddr_e framerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_; + uint8_t framerLinkType = 0U; + uint8_t regData = 0U; + const uint8_t linkType204C = 0x80U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, framerStatus, cleanup); + ADI_LIBRARY_MEMSET(framerStatus, 0, sizeof(adi_adrv904x_FramerStatus_t)); + + framerStatus->status = 0U; + + /* Get the base address of the selected framer */ + recoveryAction = adrv904x_FramerBitfieldAddressGet(device, framerSel, &framerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected framer"); + goto cleanup; + } + + /* Get the framer link type: 204B or 204C */ + recoveryAction = adrv904x_JtxLink_JtxLinkType_BfGet(device, + NULL, + framerBaseAddr, + &framerLinkType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get link type for the selected framer"); + goto cleanup; + } + + /* Get TPL CFG Invalid bit */ + recoveryAction = adrv904x_JtxLink_JtxTplCfgInvalid_BfGet(device, + NULL, + framerBaseAddr, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get TPL CFG invalid bit for the selected framer"); + goto cleanup; + } + framerStatus->status |= ((regData & 1U) << 0U); /* set bit 0 */ + + /* Get TPL Sysref Received bit */ + if (framerLinkType != 0U) /* 204C case */ + { + framerStatus->status |= linkType204C; /* set 204C bit */ + recoveryAction = adrv904x_JtxLink_JtxDl204cSysrefRcvd_BfGet(device, + NULL, + framerBaseAddr, + ®Data); + } + else /* 204B */ + { + framerStatus->status &= ~linkType204C; /* clear 204C bit */ + + recoveryAction = adrv904x_JtxLink_JtxTplSysrefRcvd_BfGet(device, + NULL, + framerBaseAddr, + ®Data); + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get TPL Sysref Received bit for the selected framer"); + goto cleanup; + } + framerStatus->status |= ((regData & 1U) << 1U); /* set bit 1 */ + + /* Get TPL Sysref Phase Err bit */ + recoveryAction = adrv904x_JtxLink_JtxTplSysrefPhaseErr_BfGet(device, + NULL, + framerBaseAddr, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get TPL Sysref Phase Err bit for the selected framer"); + goto cleanup; + } + framerStatus->status |= ((regData & 1U) << 2U); /* set bit 2 */ + + /* Get Pclk Slow Error bit */ + recoveryAction = adrv904x_JtxLink_JtxPclkSlowError_BfGet(device, + NULL, + framerBaseAddr, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get Pclk Slow Error bit for the selected framer"); + goto cleanup; + } + framerStatus->status |= ((regData & 1U) << 3U); /* set bit 3 */ + + /* Get Pclk Fast Error bit */ + recoveryAction = adrv904x_JtxLink_JtxPclkFastError_BfGet(device, + NULL, + framerBaseAddr, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get Pclk Fast Error bit for the selected framer"); + goto cleanup; + } + framerStatus->status |= ((regData & 1U) << 4U); /* set bit 4 */ + + if (framerLinkType != 0U) /* 204C case */ + { + goto cleanup; /* Done for 204C case */ + } + + /* Get SyncN Sel */ + recoveryAction = adrv904x_JtxLink_JtxSyncNSel_BfGet(device, + NULL, + framerBaseAddr, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get SyncN Sel for the selected framer"); + goto cleanup; + } + + /* Reset framer address to active framer depending to value of Sync Sel value */ + if (regData == 0) + { + framerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_; + } + else if (regData == 1) + { + framerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_1_; + } + else if (regData == 2) + { + framerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_2_; + } + else + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SyncN Sel is invalid for the selected framer"); + goto cleanup; + } + + /* Get 204B SyncN */ + recoveryAction = adrv904x_JtxLink_JtxDl204bSyncN_BfGet(device, + NULL, + framerBaseAddr, + &framerStatus->syncNSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get SyncN for the selected framer"); + goto cleanup; + } + + /* Get 204B SyncNe Count */ + recoveryAction = adrv904x_JtxLink_JtxDl204bSyncNeCount_BfGet(device, + NULL, + framerBaseAddr, + &framerStatus->framerSyncNeCount); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get SyncNe Count for the selected framer"); + goto cleanup; + } + + /* Get 204B QBF State */ + recoveryAction = adrv904x_JtxLink_JtxDl204bState_BfGet(device, + NULL, + framerBaseAddr, + &framerStatus->qbfStateStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get QBF State for the selected framer"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + adi_adrv904x_DeframerStatus_t * const deframerStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + adi_adrv904x_DeframerCfg_t deframerCfg; /* Initialized later on */ + uint8_t deframerLinkType = 0U; + uint8_t laneId = 0U; + uint8_t laneSel = 0U; + uint8_t laneIdx = 0U; + uint8_t regData = 0U; + const uint8_t linkType204C = 0x01U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, deframerStatus, cleanup); + + ADI_LIBRARY_MEMSET(&deframerCfg, 0, sizeof(adi_adrv904x_DeframerCfg_t)); + + /* Get the base address of the selected deframer */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, deframerSel, &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected deframer"); + goto cleanup; + } + + /* Get the deframer link type: 204B or 204C */ + recoveryAction = adrv904x_JrxLink_JrxLinkType_BfGet(device, + NULL, + deframerBaseAddr, + &deframerLinkType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get link type for the selected deframer"); + goto cleanup; + } + + /* Get Deframer Lane Crossbar information */ + recoveryAction = adrv904x_DeframerLaneEnableGet(device, deframerSel, &deframerCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lane cross bar the selected deframer"); + goto cleanup; + } + + for (laneId = 0U; laneId < ADI_ADRV904X_MAX_SERDES_LANES; ++laneId) + { + laneSel = 1U << laneId; + if ((deframerCfg.deserializerLanesEnabled & laneSel) == laneSel) + { + /* Find first lane in use. */ + laneIdx = laneId; + break; + } + } + + if (deframerLinkType != 0) /* 204C case */ + { + deframerStatus->reserved |= linkType204C; /* Set 204C indication bit */ + + recoveryAction = adrv904x_JesdCommon_JrxDl204cState_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + &deframerStatus->status); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get 204C status for the selected deframer"); + goto cleanup; + } + + goto cleanup; /* Done for 204C case */ + } + + deframerStatus->reserved &= ~linkType204C; /* Clear 204C indication bit */ + + /* Get 204B SyncN Sel */ + recoveryAction = adrv904x_JrxLink_JrxCoreSyncNSel_BfGet(device, + NULL, + deframerBaseAddr, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get SyncN Sel for the selected deframer"); + goto cleanup; + } + deframerStatus->status |= ((regData & 1U) << 0U); /* set bit 0 */ + + /* Get 204B Sysref Received */ + recoveryAction = adrv904x_JrxLink_JrxCoreSysrefRcvd_BfGet(device, + NULL, + deframerBaseAddr, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get Sysref Received for the selected deframer"); + goto cleanup; + } + deframerStatus->status |= ((regData & 1U) << 1U); /* set bit 1 */ + + /* Get 204B User Data */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bUserData_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get User Data for the selected deframer"); + goto cleanup; + } + deframerStatus->status |= ((regData & 1U) << 2U); /* set bit 2 */ + + /* deframerStatus->status bit 3 is reserved */ + + /* Get 204B FS Lost */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bFsLost_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get FS Lost for the selected deframer"); + goto cleanup; + } + deframerStatus->status |= ((regData & 1U) << 4U); /* set bit 4 */ + + /* Get 204B EOMF Event */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bEomfEvent_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get EOMF Event for the selected deframer"); + goto cleanup; + } + deframerStatus->status |= ((regData & 1U) << 5U); /* set bit 5 */ + + /* Get 204B EOF Event */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bEofEvent_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get EOF Event for the selected deframer"); + goto cleanup; + } + deframerStatus->status |= ((regData & 1U) << 6U); /* set bit 6 */ + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerStatusGet_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + adi_adrv904x_DeframerStatus_v2_t * const deframerStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + adi_adrv904x_DeframerCfg_t deframerCfg; /* Initialized later on */ + uint8_t deframerLinkType = 0U; + uint8_t laneId = 0U; + uint8_t phyLaneId = 0U; + uint8_t regData = 0U; + const uint8_t linkType204C = 0x01U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, deframerStatus, cleanup); + + ADI_LIBRARY_MEMSET(&deframerCfg, 0, sizeof(adi_adrv904x_DeframerCfg_t)); + ADI_LIBRARY_MEMSET(deframerStatus, 0, sizeof(adi_adrv904x_DeframerStatus_v2_t)); + + /* Get the base address of the selected deframer */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, deframerSel, &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected deframer"); + goto cleanup; + } + + /* Get deframer link up/down status and set linkState bit 1 */ + recoveryAction = adrv904x_JrxLink_JrxCoreUsrDataRdy_BfGet(device, + NULL, + deframerBaseAddr, + ®Data); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get link condition for the selected deframer"); + goto cleanup; + } + + if (regData == 1U) + { + deframerStatus->linkState |= 1U << 1U; /* Set linkState bit 1 */ + } + else + { + deframerStatus->linkState &= ~(1U << 1U); /* Clear linkState bit 1 */ + } + + /* Get Deframer Lane Crossbar information and set phyLaneMask */ + recoveryAction = adrv904x_DeframerLaneEnableGet(device, deframerSel, &deframerCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lane cross bar the selected deframer"); + goto cleanup; + } + + /* Get the deframer link type: 204B or 204C */ + recoveryAction = adrv904x_JrxLink_JrxLinkType_BfGet(device, + NULL, + deframerBaseAddr, + &deframerLinkType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get link type for the selected deframer"); + goto cleanup; + } + + if (deframerLinkType != 0U) + { + /* 204C link type case */ + deframerStatus->linkState |= linkType204C; /* Set linkState bit 0 to indicate link type 204C */ + } + else + { + /* 204B link type case */ + deframerStatus->linkState &= ~linkType204C; /* Clear linkState bit 0 to indicate link type 204B */ + } + + for (laneId = 0U; laneId < ADI_ADRV904X_MAX_SERDES_LANES; ++laneId) + { + phyLaneId = deframerCfg.deserializerLaneCrossbar.deframerInputLaneSel[laneId]; + + /* verify that physical lane is enabled */ + if (phyLaneId < ADI_ADRV904X_MAX_SERDES_LANES) + { + deframerStatus->phyLaneMask |= (0x1U << phyLaneId); /* enable phy lane in Mask */ + deframerStatus->laneStatus[phyLaneId] |= (1U << 3U); /* Set bit 3 to indicate this lane is enabled */ + } + else + { + continue; /* out of range phyLaneId means not enabled */ + } + + /* 204C link type case */ + if (deframerLinkType != 0U) + { + recoveryAction = adrv904x_JesdCommon_JrxDl204cState_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + phyLaneId, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get 204C status for the selected deframer"); + goto cleanup; + } + + deframerStatus->laneStatus[phyLaneId] |= (regData & 0x07U); /* Get lane status bit 0, 1, and 2 */ + continue; /* Get next lane status */ + } + + /* Get 204B SyncN Sel */ + recoveryAction = adrv904x_JrxLink_JrxCoreSyncNSel_BfGet(device, + NULL, + deframerBaseAddr, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get SyncN Sel for the selected deframer"); + goto cleanup; + } + deframerStatus->laneStatus[phyLaneId] |= ((regData & 1U) << 0U); /* set bit 0 */ + + /* Get 204B Sysref Received */ + recoveryAction = adrv904x_JrxLink_JrxCoreSysrefRcvd_BfGet(device, + NULL, + deframerBaseAddr, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get Sysref Received for the selected deframer"); + goto cleanup; + } + deframerStatus->laneStatus[phyLaneId] |= ((regData & 1U) << 1U); /* set bit 1 */ + + /* Get 204B User Data */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bUserData_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + phyLaneId, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get User Data for the selected deframer"); + goto cleanup; + } + deframerStatus->laneStatus[phyLaneId] |= ((regData & 1U) << 2U); /* set bit 2 */ + + /* deframerStatus->status bit 3 is reserved */ + + /* Get 204B FS Lost */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bFsLost_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + phyLaneId, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get FS Lost for the selected deframer"); + goto cleanup; + } + deframerStatus->laneStatus[phyLaneId] |= ((regData & 1U) << 4U); /* set bit 4 */ + + /* Get 204B EOMF Event */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bEomfEvent_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + phyLaneId, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get EOMF Event for the selected deframer"); + goto cleanup; + } + deframerStatus->laneStatus[phyLaneId] |= ((regData & 1U) << 5U); /* set bit 5 */ + + /* Get 204B EOF Event */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bEofEvent_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + phyLaneId, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get EOF Event for the selected deframer"); + goto cleanup; + } + deframerStatus->laneStatus[phyLaneId] |= ((regData & 1U) << 6U); /* set bit 6 */ + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmErrCounterStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + const uint8_t laneNumber, + adi_adrv904x_DfrmErrCounterStatus_t * const errCounterStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + uint8_t regData = 0U; + uint8_t deframerLinkType = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, errCounterStatus, cleanup); + + if (laneNumber >= ADI_ADRV904X_MAX_SERDES_LANES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid laneNumber for the selected deframer."); + goto cleanup; + } + + /* Get the base address of the selected deframer */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, deframerSel, &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected deframer"); + goto cleanup; + } + + /* Get the deframer link type: 204B or 204C */ + recoveryAction = adrv904x_JrxLink_JrxLinkType_BfGet(device, + NULL, + deframerBaseAddr, + &deframerLinkType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get link type for the selected deframer"); + goto cleanup; + } + + if (deframerLinkType != 0U) /* 204C */ + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid link type: only supports 204B link."); + goto cleanup; + } + + /* Get 204B BDE */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bBde_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneNumber, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get Bad Disparity errors for the selected deframer"); + goto cleanup; + } + errCounterStatus->laneStatus |= ((regData & 1U) << 0U); /* set bit 0 */ + + /* Get 204B CGS */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bCgs_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneNumber, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get Code Group Sync for the selected deframer"); + goto cleanup; + } + errCounterStatus->laneStatus |= ((regData & 1U) << 1U); /* set bit 1 */ + + /* Get 204B CKS */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bCks_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneNumber, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get Computed CheckSum status for the selected deframer"); + goto cleanup; + } + errCounterStatus->laneStatus |= ((regData & 1U) << 2U); /* set bit 2 */ + + /* Get 204B FS */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bFs_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneNumber, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get Frame Sync status for the selected deframer"); + goto cleanup; + } + errCounterStatus->laneStatus |= ((regData & 1U) << 3U); /* set bit 3 */ + + /* Get 204B ILD */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bIld_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneNumber, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get Inter-Lane De-skew status for the selected deframer"); + goto cleanup; + } + errCounterStatus->laneStatus |= ((regData & 1U) << 4U); /* set bit 4 */ + + /* Get 204B ILS */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bIls_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneNumber, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get Initial Lane Synchronization status for the selected deframer"); + goto cleanup; + } + errCounterStatus->laneStatus |= ((regData & 1U) << 5U); /* set bit 5 */ + + /* Get 204B NIT */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bNit_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneNumber, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get Not-In-Table errors status for the selected deframer"); + goto cleanup; + } + errCounterStatus->laneStatus |= ((regData & 1U) << 6U); /* set bit 6 */ + + /* Get 204B UEK */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bUek_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneNumber, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get Unexpected K-character errors status for the selected deframer"); + goto cleanup; + } + errCounterStatus->laneStatus |= ((regData & 1U) << 7U); /* set bit 7 */ + + /* Get 204B BD-Cnt */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bBdCnt_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneNumber, + &errCounterStatus->bdCntValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get Bad Disparity 8-bit error counters for the selected deframer"); + goto cleanup; + } + + /* Get 204B UEK-Cnt */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bUekCnt_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneNumber, + &errCounterStatus->uekCntValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get Unexpected K-character 8-bit error counters for the selected deframer"); + goto cleanup; + } + + /* Get 204B NIT-Cnt */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bNitCnt_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneNumber, + &errCounterStatus->nitCntValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get Not-In-Table 8-bit error counters for the selected deframer"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmErrCounterReset(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + const uint8_t laneNumber, + uint32_t const errCounterMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + uint8_t deframerLinkType = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + if (laneNumber >= ADI_ADRV904X_MAX_SERDES_LANES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid laneNumber for the selected deframer."); + goto cleanup; + } + + /* Get the base address of the selected deframer */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, deframerSel, &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected deframer"); + goto cleanup; + } + + /* Get the deframer link type: 204B or 204C */ + recoveryAction = adrv904x_JrxLink_JrxLinkType_BfGet(device, + NULL, + deframerBaseAddr, + &deframerLinkType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get link type for the selected deframer"); + goto cleanup; + } + + if (deframerLinkType != 0U) /* 204C */ + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid link type: only supports 204B link."); + goto cleanup; + } + + if ((errCounterMask & (uint32_t) ADI_ADRV904X_DFRM_BD_CLEAR) != 0U) + { + recoveryAction = adrv904x_JesdCommon_JrxDl204bEcntRst_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneNumber, + 0x01); /* bit 0 for BD */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to clear Bad Disparity counter for the selected deframer"); + goto cleanup; + } + } + + if ((errCounterMask & (uint32_t) ADI_ADRV904X_DFRM_INT_CLEAR) != 0U) + { + recoveryAction = adrv904x_JesdCommon_JrxDl204bEcntRst_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneNumber, + 0x02); /* bit 1 for INT */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to clear Not-In-Table counter for the selected deframer"); + goto cleanup; + } + } + + if ((errCounterMask & (uint32_t) ADI_ADRV904X_DFRM_UEK_CLEAR) != 0U) + { + recoveryAction = adrv904x_JesdCommon_JrxDl204bEcntRst_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneNumber, + 0x04); /* bit 2 for INT */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to clearUnexpected K-character counter for the selected deframer"); + goto cleanup; + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmErrCounterThresholdSet(adi_adrv904x_Device_t* const device, + const uint8_t threshold) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + recoveryAction = adrv904x_JesdCommon_JrxCrcErrCntThreshold_BfSet(device, NULL, ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, threshold); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to set Threshold of CRC errors"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Dfrm204cErrCounterStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + const uint8_t laneNumber, + adi_adrv904x_Dfrm204cErrCounterStatus_t * const errCounterStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + uint8_t deframerLinkType = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, errCounterStatus, cleanup); + + if (laneNumber >= ADI_ADRV904X_MAX_SERDES_LANES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid laneNumber for the selected deframer."); + goto cleanup; + } + + /* Get the base address of the selected deframer */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, deframerSel, &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected deframer"); + goto cleanup; + } + + /* Get the deframer link type: 204B or 204C */ + recoveryAction = adrv904x_JrxLink_JrxLinkType_BfGet(device, + NULL, + deframerBaseAddr, + &deframerLinkType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get link type for the selected deframer"); + goto cleanup; + } + + if (deframerLinkType == 0U) /* 204B */ + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid link type: only supports 204C link."); + goto cleanup; + } + + recoveryAction = adrv904x_JesdCommon_JrxDl204cShErrCnt_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneNumber, + &errCounterStatus->shCntValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get block alignment errors counter for the selected deframer"); + goto cleanup; + } + + recoveryAction = adrv904x_JesdCommon_JrxDl204cEmbErrCnt_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneNumber, + &errCounterStatus->embCntValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get extended multiblocks alignment errors counter for the selected deframer"); + goto cleanup; + } + + recoveryAction = adrv904x_JesdCommon_JrxDl204cMbErrCnt_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneNumber, + &errCounterStatus->mbCntValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get multiblocks alignment errors counter for the selected deframer"); + goto cleanup; + } + + recoveryAction = adrv904x_JesdCommon_JrxDl204cCrcErrCnt_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneNumber, + &errCounterStatus->crcCntValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CRC parity errors counter for the selected deframer"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Dfrm204cErrCounterReset(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + uint8_t deframerLinkType = 0U; + + uint8_t writeGpIntPin1Bool = 0U; + uint8_t writeGpIntPin0Bool = 0U; + uint8_t gpintTmpByteData[2] = { 0U }; + uint8_t gpintPin1ByteData[2] = { 0U }; + uint8_t gpintPin0ByteData[2] = { 0U }; + + static const uint8_t GPINT_DFRM0_204C_LL_CRC_BYTE1_MASK = (1U << 2U); + static const uint8_t GPINT_DFRM1_204C_LL_CRC_BYTE2_MASK = (1U << 0U); + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + + /* Get the base address of the selected deframer */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, deframerSel, &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected deframer"); + goto cleanup; + } + + /* Get the deframer link type: 204B or 204C */ + recoveryAction = adrv904x_JrxLink_JrxLinkType_BfGet(device, + NULL, + deframerBaseAddr, + &deframerLinkType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get link type for the selected deframer"); + goto cleanup; + } + + if (deframerLinkType == 0U) /* 204B */ + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid link type: only supports 204C link."); + goto cleanup; + } + + /* Read GPINT registers */ + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, ADRV904X_ADDR_GPINT_MASK_PIN1_BYTE1, gpintPin1ByteData, NULL, 2U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "adi_adrv904x_RegistersByteRead GPINT_PIN1 issue"); + goto cleanup; + } + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, ADRV904X_ADDR_GPINT_MASK_PIN0_BYTE1, gpintPin0ByteData, NULL, 2U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "adi_adrv904x_RegistersByteRead GPINT_PIN0 issue"); + goto cleanup; + } + + /* Disable GPINT while clearing Error Counter */ + gpintTmpByteData[0] = gpintPin1ByteData[0] | GPINT_DFRM0_204C_LL_CRC_BYTE1_MASK; + gpintTmpByteData[1] = gpintPin1ByteData[1] | GPINT_DFRM1_204C_LL_CRC_BYTE2_MASK; + writeGpIntPin1Bool = (gpintTmpByteData[0] != gpintPin1ByteData[0]) || (gpintTmpByteData[1] != gpintPin1ByteData[1]); + if (writeGpIntPin1Bool) + { + recoveryAction = adi_adrv904x_RegistersByteWrite(device, NULL, ADRV904X_ADDR_GPINT_MASK_PIN1_BYTE1, gpintTmpByteData, 2U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "adi_adrv904x_RegistersByteWrite Disable GPINT_PIN1 issue"); + goto cleanup; + } + } + + gpintTmpByteData[0] = gpintPin0ByteData[0] | GPINT_DFRM0_204C_LL_CRC_BYTE1_MASK; + gpintTmpByteData[1] = gpintPin0ByteData[1] | GPINT_DFRM1_204C_LL_CRC_BYTE2_MASK; + writeGpIntPin0Bool = (gpintTmpByteData[0] != gpintPin0ByteData[0]) || (gpintTmpByteData[1] != gpintPin0ByteData[1]); + if (writeGpIntPin0Bool) + { + recoveryAction = adi_adrv904x_RegistersByteWrite(device, NULL, ADRV904X_ADDR_GPINT_MASK_PIN0_BYTE1, gpintTmpByteData, 2U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "adi_adrv904x_RegistersByteWrite Disable GPINT_PIN0 issue"); + goto cleanup; + } + } + + recoveryAction = adrv904x_JesdCommon_JrxDl204cClrErrCnt_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to clear error counters for the selected deframer"); + goto cleanup; + } + + /* 204C Clear Err Counter bit is not self clearing bit so it must be set back to 0 */ + recoveryAction = adrv904x_JesdCommon_JrxDl204cClrErrCnt_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to clear error bit for the selected deframer"); + goto cleanup; + } + + /* Clear GPINT status bits */ + gpintTmpByteData[0] = GPINT_DFRM0_204C_LL_CRC_BYTE1_MASK; + gpintTmpByteData[1] = GPINT_DFRM1_204C_LL_CRC_BYTE2_MASK; + recoveryAction = adi_adrv904x_RegistersByteWrite(device, NULL, ADRV904X_ADDR_GPINT_STATUS_BYTE1, gpintTmpByteData, 2U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error clearing GP Interrupt Status bits."); + return recoveryAction; + } + + /* Restore GPINT config */ + if (writeGpIntPin1Bool) + { + recoveryAction = adi_adrv904x_RegistersByteWrite(device, NULL, ADRV904X_ADDR_GPINT_MASK_PIN1_BYTE1, gpintPin1ByteData, 2U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "adi_adrv904x_RegistersByteWrite Restore GPINT_PIN1 issue"); + goto cleanup; + } + } + + if (writeGpIntPin0Bool) + { + recoveryAction = adi_adrv904x_RegistersByteWrite(device, NULL, ADRV904X_ADDR_GPINT_MASK_PIN0_BYTE1, gpintPin0ByteData, 2U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "adi_adrv904x_RegistersByteWrite Restore GPINT_PIN0 issue"); + goto cleanup; + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmLinkConditionGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + uint8_t * const dfrmLinkCondition) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dfrmLinkCondition, cleanup); + + /* Get the base address of the selected deframer */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, deframerSel, &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected deframer"); + goto cleanup; + } + + recoveryAction = adrv904x_JrxLink_JrxCoreUsrDataRdy_BfGet(device, + NULL, + deframerBaseAddr, + dfrmLinkCondition); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get link condition for the selected deframer"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmFifoDepthGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + const uint8_t laneNumber, + uint8_t * const fifoDepth) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, fifoDepth, cleanup); + + if (laneNumber >= ADI_ADRV904X_MAX_SERDES_LANES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid laneNumber for the selected deframer."); + goto cleanup; + } + + /* Get the base address of the selected deframer */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, deframerSel, &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected deframer"); + goto cleanup; + } + + recoveryAction = adrv904x_JrxLink_JrxTplBufDepth_BfGet(device, + NULL, + deframerBaseAddr, + laneNumber, + fifoDepth); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get elastic FIFO depth for the selected deframer"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmCoreBufDepthGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + uint8_t * const coreBufDepth) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, coreBufDepth, cleanup); + + /* Get the base address of the selected deframer */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, deframerSel, &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected deframer"); + goto cleanup; + } + + recoveryAction = adrv904x_JrxLink_JrxCoreBufDepth_BfGet(device, + NULL, + deframerBaseAddr, + coreBufDepth); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get core buffer depth for the selected deframer"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerLoopbackSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_AdcSampleXbarCfg_t adcCrossbar; /* Initialized below */ + uint8_t framerEnabled = 0; + uint8_t deframerEnabled = 0; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_LIBRARY_MEMSET(&adcCrossbar, 0, sizeof(adi_adrv904x_AdcSampleXbarCfg_t)); + + /* Verify only one framer is selected */ + if ((framerSel == 0) || /* one framer must be selected */ + (framerSel & (framerSel - 1)) || /* ensure no more than one framer is selected */ + ((framerSel & ~ADI_ADRV904X_ALL_FRAMERS) != 0)) /* ensure non-framer bits are not set */ + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid framer selection"); + goto cleanup; + } + + /* Get all framers link state */ + recoveryAction = adrv904x_JesdCommon_JtxLinkEn_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + &framerEnabled); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get framer link state failed"); + goto cleanup; + } + + /* Verify the select framer is enabled */ + if ((framerEnabled & framerSel) == 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error: The selected framer must be enabled."); + goto cleanup; + } + + /* Verify at least one deframer is enabled */ + recoveryAction = adrv904x_JesdCommon_JrxLinkEn_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + &deframerEnabled); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get deframer link state failed"); + goto cleanup; + } + + /* Verify the select deframer is enabled */ + if ((deframerEnabled & (uint8_t) ADI_ADRV904X_ALL_DEFRAMER) == 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error: at least one deframer must be enabled."); + goto cleanup; + } + + /* Configuring ADC Crossbar for loopback */ + adcCrossbar.AdcSampleXbar[ 0] = (adi_adrv904x_AdcSampleXbarSel_e) ADI_ADRV904X_JESD_FRM_LB_XBAR_TX0_DATA_I; + adcCrossbar.AdcSampleXbar[ 1] = (adi_adrv904x_AdcSampleXbarSel_e) ADI_ADRV904X_JESD_FRM_LB_XBAR_TX0_DATA_Q; + adcCrossbar.AdcSampleXbar[ 2] = (adi_adrv904x_AdcSampleXbarSel_e) ADI_ADRV904X_JESD_FRM_LB_XBAR_TX1_DATA_I; + adcCrossbar.AdcSampleXbar[ 3] = (adi_adrv904x_AdcSampleXbarSel_e) ADI_ADRV904X_JESD_FRM_LB_XBAR_TX1_DATA_Q; + adcCrossbar.AdcSampleXbar[ 4] = (adi_adrv904x_AdcSampleXbarSel_e) ADI_ADRV904X_JESD_FRM_LB_XBAR_TX2_DATA_I; + adcCrossbar.AdcSampleXbar[ 5] = (adi_adrv904x_AdcSampleXbarSel_e) ADI_ADRV904X_JESD_FRM_LB_XBAR_TX2_DATA_Q; + adcCrossbar.AdcSampleXbar[ 6] = (adi_adrv904x_AdcSampleXbarSel_e) ADI_ADRV904X_JESD_FRM_LB_XBAR_TX3_DATA_I; + adcCrossbar.AdcSampleXbar[ 7] = (adi_adrv904x_AdcSampleXbarSel_e) ADI_ADRV904X_JESD_FRM_LB_XBAR_TX3_DATA_Q; + adcCrossbar.AdcSampleXbar[ 8] = (adi_adrv904x_AdcSampleXbarSel_e) ADI_ADRV904X_JESD_FRM_LB_XBAR_TX4_DATA_I; + adcCrossbar.AdcSampleXbar[ 9] = (adi_adrv904x_AdcSampleXbarSel_e) ADI_ADRV904X_JESD_FRM_LB_XBAR_TX4_DATA_Q; + adcCrossbar.AdcSampleXbar[10] = (adi_adrv904x_AdcSampleXbarSel_e) ADI_ADRV904X_JESD_FRM_LB_XBAR_TX5_DATA_I; + adcCrossbar.AdcSampleXbar[11] = (adi_adrv904x_AdcSampleXbarSel_e) ADI_ADRV904X_JESD_FRM_LB_XBAR_TX5_DATA_Q; + adcCrossbar.AdcSampleXbar[12] = (adi_adrv904x_AdcSampleXbarSel_e) ADI_ADRV904X_JESD_FRM_LB_XBAR_TX6_DATA_I; + adcCrossbar.AdcSampleXbar[13] = (adi_adrv904x_AdcSampleXbarSel_e) ADI_ADRV904X_JESD_FRM_LB_XBAR_TX6_DATA_Q; + adcCrossbar.AdcSampleXbar[14] = (adi_adrv904x_AdcSampleXbarSel_e) ADI_ADRV904X_JESD_FRM_LB_XBAR_TX7_DATA_I; + adcCrossbar.AdcSampleXbar[15] = (adi_adrv904x_AdcSampleXbarSel_e) ADI_ADRV904X_JESD_FRM_LB_XBAR_TX7_DATA_Q; + + recoveryAction = adi_adrv904x_AdcSampleXbarSet(device, framerSel, &adcCrossbar); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to set ADC Xbar loopback for the selected framer."); + goto cleanup; + } + + /* Enable framer loopback */ + recoveryAction = adrv904x_JesdCommon_JtxSampleLoopback_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + framerSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to enable loopback for the selected framer"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerLoopbackDisable(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + const adi_adrv904x_AdcSampleXbarCfg_t* const adcXbar) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t framerEnabled = 0U; + uint8_t framerLoopbackEnabled = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, adcXbar, cleanup); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Verify only one framer is selected */ + if ((framerSel == 0U) || /* one framer must be selected */ + (framerSel & (framerSel - 1)) || /* ensure no more than one framer is selected */ + ((framerSel & ~ADI_ADRV904X_ALL_FRAMERS) != 0U)) /* ensure non-framer bits are not set */ + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, framerSel, "Invalid framer selection"); + goto cleanup; + } + + /* Get all framers link state */ + recoveryAction = adrv904x_JesdCommon_JtxLinkEn_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + &framerEnabled); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get framer link state failed"); + goto cleanup; + } + + /* Verify the select framer is enabled */ + if ((framerEnabled & framerSel) == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, framerSel, "Error: The selected framer must be enabled."); + goto cleanup; + } + + recoveryAction = adrv904x_JesdCommon_JtxSampleLoopback_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + &framerLoopbackEnabled); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to read which framers have enabled loopbacks"); + goto cleanup; + } + + /* Verify the select framer has its loopback enabled */ + if ((framerLoopbackEnabled & framerSel) == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, framerSel, "Error: The selected framer loopback has not been enabled."); + goto cleanup; + } + + /* Disable framer loopback for that particular framer*/ + recoveryAction = adrv904x_JesdCommon_JtxSampleLoopback_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + (framerLoopbackEnabled & ~framerSel)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to disable loopback for the selected framer"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_AdcSampleXbarSet(device, framerSel, adcXbar); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to set ADC Xbar loopback for the selected framer."); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerLoopbackSet(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t framerEnabled = 0U; + uint8_t deframerEnabled = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Get all framers link state */ + recoveryAction = adrv904x_JesdCommon_JtxLinkEn_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + &framerEnabled); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get framer link state failed"); + goto cleanup; + } + + /* Verify at least one framer is enabled */ + if ((framerEnabled & (uint8_t) ADI_ADRV904X_ALL_FRAMERS) == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error: At least one framer must be enabled."); + goto cleanup; + } + + /* Verify at least one deframer is enabled */ + recoveryAction = adrv904x_JesdCommon_JrxLinkEn_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + &deframerEnabled); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get deframer link state failed"); + goto cleanup; + } + + if ((deframerEnabled & (uint8_t) ADI_ADRV904X_ALL_DEFRAMER) == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error: deframer-0 must be enabled."); + goto cleanup; + } + + /* If framer 0 not enabled, enable it to use it as loopback */ + if ((framerEnabled & (uint8_t) ADI_ADRV904X_FRAMER_0) == 0U) + { + framerEnabled = framerEnabled | ADI_ADRV904X_FRAMER_0; + recoveryAction = adrv904x_JesdCommon_JtxLinkEn_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + framerEnabled); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get framer link state failed"); + goto cleanup; + } + } + + /* Enable deframer loopback */ + recoveryAction = adrv904x_JesdCommon_JrxSampleLoopback_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + ADI_ENABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to enable deframer loopback"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerLoopbackDisable(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Disable deframer loopback */ + recoveryAction = adrv904x_JesdCommon_JrxSampleLoopback_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + ADI_DISABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to disable deframer loopback"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerLoopbackDisable_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + const adi_adrv904x_AdcSampleXbarCfg_t* const adcXbar) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t framerEnabled = 0U; + uint8_t deframerLoopbackEnabled = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, adcXbar, cleanup); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Verify only one deframer is selected */ + if ((framerSel == 0U) || /* one deframer must be selected */ + (framerSel & (framerSel - 1U)) || /* ensure no more than one deframer is selected */ + ((framerSel & ~ADI_ADRV904X_ALL_DEFRAMER) != 0U)) /* ensure non-deframer bits are not set */ + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, framerSel, "Invalid deframer selection"); + goto cleanup; + } + + /* Get all framers link state */ + recoveryAction = adrv904x_JesdCommon_JtxLinkEn_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + &framerEnabled); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get deframer link state failed"); + goto cleanup; + } + + /* Verify the select deframer is enabled */ + if ((framerEnabled & framerSel) == 0U) //TODO: does this framer NEED to be framer 0?? + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, framerSel, "Error: The selected framer must be enabled."); + goto cleanup; + } + + recoveryAction = adrv904x_JesdCommon_JrxSampleLoopback_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + &deframerLoopbackEnabled); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to read which deframers have enabled loopbacks"); + goto cleanup; + } + + /* Verify the deframer has its loopback enabled */ + if (deframerLoopbackEnabled == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, deframerLoopbackEnabled, "Error: The deframer loopback has not been enabled."); + goto cleanup; + } + + /* Disable deframer loopback */ + recoveryAction = adrv904x_JesdCommon_JrxSampleLoopback_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + ADI_DISABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to disable deframer loopback"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_AdcSampleXbarSet(device, framerSel, adcXbar); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to set ADC Xbar loopback for the selected framer."); + goto cleanup; + } + + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerLaneLoopbackSet(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t framerEnabled = 0; + uint8_t deframerEnabled = 0; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Get all framers link state */ + recoveryAction = adrv904x_JesdCommon_JtxLinkEn_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + &framerEnabled); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get framer link state failed"); + goto cleanup; + } + + /* Verify at least one framer is enabled */ + if ((framerEnabled & (uint8_t) ADI_ADRV904X_ALL_FRAMERS) == 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error: at least one framer must be enabled."); + goto cleanup; + } + + /* Verify at least one deframer is enabled */ + recoveryAction = adrv904x_JesdCommon_JrxLinkEn_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + &deframerEnabled); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get deframer link state failed"); + goto cleanup; + } + + if ((deframerEnabled & (uint8_t) ADI_ADRV904X_ALL_DEFRAMER) == 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error: at least one deframer must be enabled."); + goto cleanup; + } + + /* Enable deframer lane loopback */ + recoveryAction = adrv904x_JesdCommon_JrxLaneLoopback_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + ADI_ENABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to enable deframer lane loopback"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerLaneLoopbackDisable(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Disable deframer lane loopback */ + recoveryAction = adrv904x_JesdCommon_JrxLaneLoopback_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + ADI_DISABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to disable deframer lane loopback"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerSyncbModeSet(adi_adrv904x_Device_t* const device, + const uint8_t framerSelMask, + const uint8_t syncbMode) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJtxLinkChanAddr_e framerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_; + adi_adrv904x_FramerSel_e framerSel = ADI_ADRV904X_FRAMER_0; + uint32_t framerSelection = 0U; + + uint32_t i = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Check framer id */ + if ((framerSelMask < (uint8_t)ADI_ADRV904X_FRAMER_0) || + (framerSelMask > (uint8_t)ADI_ADRV904X_ALL_FRAMERS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid framer selection"); + goto cleanup; + } + + /* Check syncb mode */ + if ((syncbMode != 1U) && + (syncbMode != 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid framer syncb mode value"); + goto cleanup; + } + + /* Framer syncb mode set */ + for (i = 0U; i < ADI_ADRV904X_MAX_FRAMERS; i++) + { + framerSelection = 1U << i; + framerSel = (adi_adrv904x_FramerSel_e)(framerSelection); + + if ((framerSelMask & (uint8_t)framerSelection) != 0U) + { + /* Get framer base address */ + recoveryAction = adrv904x_FramerBitfieldAddressGet(device, + framerSel, + &framerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting base address for framer"); + goto cleanup; + } + + /* Set syncb mode */ + recoveryAction = adrv904x_JtxLink_JtxDl204bSyncNForceEn_BfSet(device, + NULL, + framerBaseAddr, + syncbMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting syncb mode for framer"); + goto cleanup; + } + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerSyncbModeGet(adi_adrv904x_Device_t* const device, + const uint8_t framerSelMask, + uint8_t* const syncbMode) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJtxLinkChanAddr_e framerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, syncbMode, cleanup); + + /* Get framer base address */ + recoveryAction = adrv904x_FramerBitfieldAddressGet(device, + (adi_adrv904x_FramerSel_e)framerSelMask, + &framerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting base address for framer"); + goto cleanup; + } + + /* Framer syncb mode get */ + recoveryAction = adrv904x_JtxLink_JtxDl204bSyncNForceEn_BfGet(device, + NULL, + framerBaseAddr, + syncbMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting syncb mode for framer"); + goto cleanup; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerSyncbStatusSet(adi_adrv904x_Device_t* const device, + const uint8_t framerSelMask, + const uint8_t syncbStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJtxLinkChanAddr_e framerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_; + adi_adrv904x_FramerSel_e framerSel = ADI_ADRV904X_FRAMER_0; + uint32_t framerSelection = 0U; + uint32_t i = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Check framer id */ + if ((framerSelMask < (uint8_t)ADI_ADRV904X_FRAMER_0) || + (framerSelMask > (uint8_t)ADI_ADRV904X_ALL_FRAMERS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid framer selection"); + goto cleanup; + } + + /* Check syncb force enable value */ + if ((syncbStatus != 1U) && + (syncbStatus != 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid framer syncb status value"); + goto cleanup; + } + + /* Framer syncb status set */ + for (i = 0U; i < ADI_ADRV904X_MAX_FRAMERS; i++) + { + framerSelection = 1U << i; + framerSel = (adi_adrv904x_FramerSel_e)(framerSelection); + + if ((framerSelMask & (uint8_t)framerSelection) != 0U) + { + /* Get framer base address */ + recoveryAction = adrv904x_FramerBitfieldAddressGet(device, + framerSel, + &framerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting base address for framer"); + goto cleanup; + } + + /* Set syncb status enable */ + recoveryAction = adrv904x_JtxLink_JtxDl204bSyncNForceVal_BfSet(device, + NULL, + framerBaseAddr, + syncbStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting syncb status for framer"); + goto cleanup; + } + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerSyncbStatusGet(adi_adrv904x_Device_t* const device, + const uint8_t framerSelMask, + uint8_t* const syncbStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJtxLinkChanAddr_e framerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, syncbStatus, cleanup); + + /* Get framer base address */ + recoveryAction = adrv904x_FramerBitfieldAddressGet(device, + (adi_adrv904x_FramerSel_e)framerSelMask, + &framerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting base address for framer"); + goto cleanup; + } + + /* Framer syncb status get */ + recoveryAction = adrv904x_JtxLink_JtxDl204bSyncN_BfGet(device, + NULL, + framerBaseAddr, + syncbStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting syncb status for framer"); + goto cleanup; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerSyncbErrCntGet(adi_adrv904x_Device_t* const device, + const uint8_t framerSelMask, + uint8_t* const syncbErrCnt) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJtxLinkChanAddr_e framerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, syncbErrCnt, cleanup); + + /* Get framer base address */ + recoveryAction = adrv904x_FramerBitfieldAddressGet(device, + (adi_adrv904x_FramerSel_e)framerSelMask, + &framerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting base address for framer"); + goto cleanup; + } + + /* Framer syncb error counter get */ + recoveryAction = adrv904x_JtxLink_JtxDl204bSyncNeCount_BfGet(device, + NULL, + framerBaseAddr, + syncbErrCnt); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting syncb error counter for framer"); + goto cleanup; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerSyncbErrCntReset(adi_adrv904x_Device_t* const device, + const uint8_t framerSelMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJtxLinkChanAddr_e framerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_; + adi_adrv904x_FramerSel_e framerSel = ADI_ADRV904X_FRAMER_0; + uint32_t framerSelection = 0U; + uint32_t i = 0U; + const uint8_t syncbErrCntClear = 1U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Check framer id */ + if ((framerSelMask < (uint8_t)ADI_ADRV904X_FRAMER_0) || + (framerSelMask > (uint8_t)ADI_ADRV904X_ALL_FRAMERS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid framer selection"); + goto cleanup; + } + + /* Framer syncb error counter clear */ + for (i = 0U; i < ADI_ADRV904X_MAX_FRAMERS; i++) + { + framerSelection = 1U << i; + framerSel = (adi_adrv904x_FramerSel_e)(framerSelection); + + if ((framerSelMask & (uint8_t)framerSelection) != 0U) + { + /* Get framer base address */ + recoveryAction = adrv904x_FramerBitfieldAddressGet(device, + framerSel, + &framerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting base address for framer"); + goto cleanup; + } + + /* Clear syncb error counter */ + recoveryAction = adrv904x_JtxLink_JtxDl204bClearSyncNeCount_BfSet(device, + NULL, + framerBaseAddr, + syncbErrCntClear); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while clearing syncb error counter for framer"); + goto cleanup; + } + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerSyncbErrCntGet(adi_adrv904x_Device_t* const device, + const uint8_t deframerSelMask, + uint8_t* const syncbErrCnt) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, syncbErrCnt, cleanup); + + /* Get deframer base address */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, + (adi_adrv904x_DeframerSel_e)deframerSelMask, + &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting base address for deframer"); + goto cleanup; + } + + /* Deframer syncb error counter get */ + recoveryAction = adrv904x_JrxLink_JrxCoreSyncNeCount_BfGet(device, + NULL, + deframerBaseAddr, + syncbErrCnt); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting syncb error counter for deframer"); + goto cleanup; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerSyncbErrCntReset(adi_adrv904x_Device_t* const device, + const uint8_t deframerSelMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + adi_adrv904x_DeframerSel_e deframerSel = ADI_ADRV904X_DEFRAMER_0; + uint32_t deframerSelection = 0U; + uint32_t i = 0U; + const uint8_t syncbErrCntClear = 1U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Check deframer id */ + if ((deframerSelMask < (uint8_t)ADI_ADRV904X_DEFRAMER_0) || + (deframerSelMask > (uint8_t)ADI_ADRV904X_ALL_DEFRAMER)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid deframer selection"); + goto cleanup; + } + + /* Deframer syncb error counter clear */ + for (i = 0U; i < ADI_ADRV904X_MAX_DEFRAMERS; i++) + { + deframerSelection = 1U << i; + deframerSel = (adi_adrv904x_DeframerSel_e)(deframerSelection); + + if ((deframerSelMask & (uint8_t)deframerSelection) != 0U) + { + /* Get deframer base address */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, + deframerSel, + &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting base address for deframer"); + goto cleanup; + } + + /* Clear syncb error counter */ + recoveryAction = adrv904x_JrxLink_JrxCoreClearSyncNeCount_BfSet(device, + NULL, + deframerBaseAddr, + syncbErrCntClear); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while clearing syncb error counter for deframer"); + goto cleanup; + } + + /* Reset syncb error counter after clear */ + recoveryAction = adrv904x_JrxLink_JrxCoreClearSyncNeCount_BfSet(device, + NULL, + deframerBaseAddr, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while resetting syncb error counter for deframer"); + goto cleanup; + } + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerErrorCtrl(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + const adi_adrv904x_SerdesErrAction_e action) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJtxLinkChanAddr_e framerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_; + + uint32_t framerIdx = 0U; + uint8_t errClr = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + if (((uint32_t)action & ADI_ADRV904X_SERDES_ALL_ERR_CLEAR) == 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, action, "Invalid Serdes Error Action Selected"); + goto cleanup; + } + + for (framerIdx = 0U; framerIdx < (uint32_t)ADI_ADRV904X_MAX_FRAMERS; framerIdx++) + { + if ((((1U << framerIdx) & (uint32_t)framerSel) == 0U) || + ((device->initExtract.jesdSetting.framerSetting[framerIdx].serialLaneEnabled == 0U) && (framerSel == ADI_ADRV904X_ALL_FRAMERS))) + { + /* skip if framer is not selected or if it is an unused framer and all framer is selected */ + continue; + } + + /* Get the base address of the selected framer */ + recoveryAction = adrv904x_FramerBitfieldAddressGet(device, (adi_adrv904x_FramerSel_e)(1U << framerIdx), &framerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected framer"); + goto cleanup; + } + + /* Handle PCLK Errors */ + if ((action & ADI_ADRV904X_SERDES_PCLK_ERR_CLEAR) == ADI_ADRV904X_SERDES_PCLK_ERR_CLEAR) + { + /* Read PCLK error clear bitfield */ + recoveryAction = adrv904x_JtxLink_JtxPclkErrorClear_BfGet(device, NULL, framerBaseAddr, &errClr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT(&device->common, ADI_ADRV904X_ERRSRC_API, ADI_COMMON_ERRCODE_API, recoveryAction, framerIdx, "Failed to Read Framer PCLK Error Clear status"); + goto cleanup; + } + } + else + { + errClr = 0U; + } + + if ((action & ADI_ADRV904X_SERDES_PCLK_ERR_DISABLE) == ADI_ADRV904X_SERDES_PCLK_ERR_DISABLE) + { + /* Set the bitfield to 1 disables the Error and clears it */ + recoveryAction = adrv904x_JtxLink_JtxPclkErrorClear_BfSet(device, NULL, framerBaseAddr, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT(&device->common, ADI_ADRV904X_ERRSRC_API, ADI_COMMON_ERRCODE_API, recoveryAction, framerIdx, "Failed to Clear/Disable Framer PCLK Error"); + goto cleanup; + } + } + + if ((action & ADI_ADRV904X_SERDES_PCLK_ERR_ENABLE) == ADI_ADRV904X_SERDES_PCLK_ERR_ENABLE) + { + /* Set the bitfield to 0 enables the Error */ + recoveryAction = adrv904x_JtxLink_JtxPclkErrorClear_BfSet(device, NULL, framerBaseAddr, errClr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT(&device->common, ADI_ADRV904X_ERRSRC_API, ADI_COMMON_ERRCODE_API, recoveryAction, framerIdx, "Failed to Enable Framer PCLK Error"); + goto cleanup; + } + } + + /* Handle SYSREF Phase Error */ + if ((action & ADI_ADRV904X_SERDES_SYSREF_ERR_CLEAR) == ADI_ADRV904X_SERDES_SYSREF_ERR_CLEAR) + { + /* Read Sysref phase error clear bitfield */ + recoveryAction = adrv904x_JtxLink_JtxTplSysrefClrPhaseErr_BfGet(device, NULL, framerBaseAddr, &errClr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT(&device->common, ADI_ADRV904X_ERRSRC_API, ADI_COMMON_ERRCODE_API, recoveryAction, framerIdx, "Failed to Read Framer Sysref Phase Error Clear status"); + goto cleanup; + } + } + else + { + errClr = 0U; + } + + if ((action & ADI_ADRV904X_SERDES_SYSREF_ERR_DISABLE) == ADI_ADRV904X_SERDES_SYSREF_ERR_DISABLE) + { + /* Set the bitfield to 1 disables the Error and clears it */ + recoveryAction = adrv904x_JtxLink_JtxTplSysrefClrPhaseErr_BfSet(device, NULL, framerBaseAddr, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT(&device->common, ADI_ADRV904X_ERRSRC_API, ADI_COMMON_ERRCODE_API, recoveryAction, framerIdx, "Failed to Clear/Disable Framer Sysref Phase Error"); + goto cleanup; + } + } + + if ((action & ADI_ADRV904X_SERDES_SYSREF_ERR_ENABLE) == ADI_ADRV904X_SERDES_SYSREF_ERR_ENABLE) + { + /* Set the bitfield to 0 enables the Error */ + recoveryAction = adrv904x_JtxLink_JtxTplSysrefClrPhaseErr_BfSet(device, NULL, framerBaseAddr, errClr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT(&device->common, ADI_ADRV904X_ERRSRC_API, ADI_COMMON_ERRCODE_API, recoveryAction, framerIdx, "Failed to Enable Framer Sysref Phase Error"); + goto cleanup; + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeframerErrorCtrl(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + const adi_adrv904x_SerdesErrAction_e action) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + + uint32_t deframerIdx = 0U; + uint8_t errClr = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + if (((uint32_t)action & ADI_ADRV904X_SERDES_ALL_ERR_CLEAR) == 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, action, "Invalid Serdes Error Action Selected"); + goto cleanup; + } + + for (deframerIdx = 0U; deframerIdx < (uint32_t)ADI_ADRV904X_MAX_DEFRAMERS; deframerIdx++) + { + if ((((1U << deframerIdx) & (uint32_t)deframerSel) == 0U) || + ((device->initExtract.jesdSetting.deframerSetting[deframerIdx].deserialLaneEnabled == 0U) && (deframerSel == ADI_ADRV904X_ALL_DEFRAMER))) + { + /* skip if deframer is not selected or if it is an unused deframer and all deframer is selected */ + continue; + } + + /* Get the base address of the selected deframer */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, (adi_adrv904x_DeframerSel_e)(1U << deframerIdx), &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected deframer"); + goto cleanup; + } + + /* Handle PCLK Errors */ + if ((action & ADI_ADRV904X_SERDES_PCLK_ERR_CLEAR) == ADI_ADRV904X_SERDES_PCLK_ERR_CLEAR) + { + /* Read PCLK error clear bitfield */ + recoveryAction = adrv904x_JrxLink_JrxCorePclkErrorClear_BfGet(device, NULL, deframerBaseAddr, &errClr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT(&device->common, ADI_ADRV904X_ERRSRC_API, ADI_COMMON_ERRCODE_API, recoveryAction, deframerIdx, "Failed to Read Deframer PCLK Error Clear status"); + goto cleanup; + } + } + else + { + errClr = 0U; + } + + if ((action & ADI_ADRV904X_SERDES_PCLK_ERR_DISABLE) == ADI_ADRV904X_SERDES_PCLK_ERR_DISABLE) + { + /* Set the bitfield to 1 disables the Error and clears it */ + recoveryAction = adrv904x_JrxLink_JrxCorePclkErrorClear_BfSet(device, NULL, deframerBaseAddr, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT(&device->common, ADI_ADRV904X_ERRSRC_API, ADI_COMMON_ERRCODE_API, recoveryAction, deframerIdx, "Failed to Clear/Disable Deframer PCLK Error"); + goto cleanup; + } + } + + if ((action & ADI_ADRV904X_SERDES_PCLK_ERR_ENABLE) == ADI_ADRV904X_SERDES_PCLK_ERR_ENABLE) + { + /* Set the bitfield to 0 enables the Error */ + recoveryAction = adrv904x_JrxLink_JrxCorePclkErrorClear_BfSet(device, NULL, deframerBaseAddr, errClr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT(&device->common, ADI_ADRV904X_ERRSRC_API, ADI_COMMON_ERRCODE_API, recoveryAction, deframerIdx, "Failed to Enable Deframer PCLK Error"); + goto cleanup; + } + } + + /* Handle SYSREF Phase Error */ + if ((action & ADI_ADRV904X_SERDES_SYSREF_ERR_CLEAR) == ADI_ADRV904X_SERDES_SYSREF_ERR_CLEAR) + { + /* Read Sysref phase error clear bitfield */ + recoveryAction = adrv904x_JrxLink_JrxCoreSysrefClrPhaseErr_BfGet(device, NULL, deframerBaseAddr, &errClr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT(&device->common, ADI_ADRV904X_ERRSRC_API, ADI_COMMON_ERRCODE_API, recoveryAction, deframerIdx, "Failed to Read Deframer Sysref Phase Error Clear status"); + goto cleanup; + } + } + else + { + errClr = 0U; + } + + if ((action & ADI_ADRV904X_SERDES_SYSREF_ERR_DISABLE) == ADI_ADRV904X_SERDES_SYSREF_ERR_DISABLE) + { + /* Set the bitfield to 1 disables the Error and clears it */ + recoveryAction = adrv904x_JrxLink_JrxCoreSysrefClrPhaseErr_BfSet(device, NULL, deframerBaseAddr, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT(&device->common, ADI_ADRV904X_ERRSRC_API, ADI_COMMON_ERRCODE_API, recoveryAction, deframerIdx, "Failed to Clear/Disable Deframer Sysref Phase Error"); + goto cleanup; + } + } + + if ((action & ADI_ADRV904X_SERDES_SYSREF_ERR_ENABLE) == ADI_ADRV904X_SERDES_SYSREF_ERR_ENABLE) + { + /* Set the bitfield to 0 enables the Error */ + recoveryAction = adrv904x_JrxLink_JrxCoreSysrefClrPhaseErr_BfSet(device, NULL, deframerBaseAddr, errClr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT(&device->common, ADI_ADRV904X_ERRSRC_API, ADI_COMMON_ERRCODE_API, recoveryAction, deframerIdx, "Failed to Enable Deframer Sysref Phase Error"); + goto cleanup; + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmIlasMismatchGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + adi_adrv904x_DfrmCompareData_t* const dfrmData) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + adi_adrv904x_DeframerCfg_t deframerCfg; /* Initialized later on */ + uint8_t deframerLinkType = 0U; + uint8_t laneId = 0U; + uint8_t laneSel = 0U; + uint8_t laneIdx = 0xFF; + uint8_t regData = 0U; + uint8_t cfgData = 0U; + uint32_t ilasIdx = 0U; + uint32_t zeroData = 0U; + /* uint16_t irqVec = 0U; */ + /* uint16_t cfgMismatch = 0U; */ + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dfrmData, cleanup); + ADI_LIBRARY_MEMSET(&deframerCfg, 0U, sizeof(adi_adrv904x_DeframerCfg_t)); + ADI_LIBRARY_MEMSET(dfrmData, 0U, sizeof(adi_adrv904x_DfrmCompareData_t)); + + /* Get the base address of the selected deframer */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, deframerSel, &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected deframer"); + goto cleanup; + } + + recoveryAction = adrv904x_JesdCommon_JrxLinkEn_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading deframer enabled status"); + goto cleanup; + } + + /* Check if deframer requested is enabled, if not return error */ + if ((regData & deframerSel) == 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error: Requested deframer not enabled"); + goto cleanup; + } + + /* Get the deframer link type: 204B or 204C */ + recoveryAction = adrv904x_JrxLink_JrxLinkType_BfGet(device, + NULL, + deframerBaseAddr, + &deframerLinkType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading link type from device"); + goto cleanup; + } + + if (deframerLinkType != 0U) /* 204C is not supported */ + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid link type: only supports 204B link."); + goto cleanup; + } + + /* Get Deframer Lane Crossbar information to find the first lane in used */ + recoveryAction = adrv904x_DeframerLaneEnableGet(device, deframerSel, &deframerCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lane cross bar the selected deframer"); + goto cleanup; + } + + for (laneId = 0U; laneId < ADI_ADRV904X_MAX_SERDES_LANES; ++laneId) + { + laneSel = 1U << laneId; + if ((deframerCfg.deserializerLanesEnabled & laneSel) == laneSel) + { + /* Find first lane in use. */ + laneIdx = laneId; + break; + } + } + + if (laneIdx == 0xFF) /* No active lane found - Still have initialized value */ + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to find active lane for the selected deframer"); + goto cleanup; + } + + + /* TODO: We can not use this field, because hw calculates checksum with BankID =0, + * Add code to calculate checksum in SW */ + + /* Checking IRQ Vector if HW reporting any CFG mismatch */ + /* + recoveryAction = adrv904x_JesdCommon_JrxDl204bIrqVec_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + &irqVec); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get IRQ Vector for the selected deframer"); + goto cleanup; + } + */ + /* cfgMismatch = irqVec >> 8U; */ + + /*** Comparing DID ***/ + /* ILAS DID */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg0_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS DID for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData.dfrmDID = regData; + zeroData = (regData == 0) ? zeroData : (zeroData | (1U << ilasIdx)); + + /* CFG DID */ + recoveryAction = adrv904x_JrxLink_JrxCoreDidCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG DID cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmDID = cfgData; + + /* Compare ILAS & CFG DID */ + if (dfrmData->dfrmIlasData.dfrmDID != dfrmData->dfrmCfgData.dfrmDID) + { + dfrmData->ilasMismatchDfrm |= (1U << ilasIdx); + } + ilasIdx++; + + /*** Comparing BID ***/ + /* ILAS BID */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg1_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS BID for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData.dfrmBID = (regData & 0x0F); + zeroData = (regData == 0) ? zeroData : (zeroData | (1U << ilasIdx)); + + /* CFG BID is not supported so deframer assign it to ILAS read */ + dfrmData->dfrmCfgData.dfrmBID = dfrmData->dfrmIlasData.dfrmBID; + + /* Compare ILAS & CFG BID */ + if (dfrmData->dfrmIlasData.dfrmBID != dfrmData->dfrmCfgData.dfrmBID) + { + dfrmData->ilasMismatchDfrm |= (1U << ilasIdx); + } + ilasIdx++; + + /*** Comparing LID ***/ + /* ILAS LID */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg2_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS LID for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData.dfrmLID0 = (regData & 0x1F); + zeroData = (regData == 0) ? zeroData : (zeroData | (1U << ilasIdx)); + + /* CFG LID */ + recoveryAction = adrv904x_JrxLink_JrxCoreLidCfg_BfGet(device, + NULL, + deframerBaseAddr, + laneIdx, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG LID cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmLID0 = cfgData; + + /* Compare ILAS & CFG LID */ + if (dfrmData->dfrmIlasData.dfrmLID0 != dfrmData->dfrmCfgData.dfrmLID0) + { + dfrmData->ilasMismatchDfrm |= (1U << ilasIdx); + } + ilasIdx++; + + /*** Comparing L ***/ + /* ILAS L */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg3_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS L for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData.dfrmL = (regData & 0x1F); + zeroData = (regData == 0) ? zeroData : (zeroData | (1U << ilasIdx)); + + /* CFG L */ + recoveryAction = adrv904x_JrxLink_JrxCoreLCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG L cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmL = cfgData; + + /* Compare ILAS & CFG L */ + if (dfrmData->dfrmIlasData.dfrmL != dfrmData->dfrmCfgData.dfrmL) + { + dfrmData->ilasMismatchDfrm |= (1U << ilasIdx); + } + ilasIdx++; + + /*** Comparing DSCR ***/ + /* ILAS DSCR */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg3_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS DSCR for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData.dfrmSCR = ((regData & 0x80) >> 7); + zeroData = (regData == 0) ? zeroData : (zeroData | (1U << ilasIdx)); + + /* CFG DSCR */ + recoveryAction = adrv904x_JrxLink_JrxCoreDscrCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG DSCR cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmSCR = cfgData; + + /* Compare ILAS & CFG DSCR */ + if (dfrmData->dfrmIlasData.dfrmSCR != dfrmData->dfrmCfgData.dfrmSCR) + { + dfrmData->ilasMismatchDfrm |= (1U << ilasIdx); + } + ilasIdx++; + + /*** Comparing F ***/ + /* ILAS F */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg4_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS F for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData.dfrmF = regData; + zeroData = (regData == 0) ? zeroData : (zeroData | (1U << ilasIdx)); + + /* CFG F */ + recoveryAction = adrv904x_JrxLink_JrxCoreFCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG F cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmF = cfgData; + + /* Compare ILAS & CFG F */ + if (dfrmData->dfrmIlasData.dfrmF != dfrmData->dfrmCfgData.dfrmF) + { + dfrmData->ilasMismatchDfrm |= (1U << ilasIdx); + } + ilasIdx++; + + /*** Comparing K ***/ + /* ILAS K */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg5_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS K for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData.dfrmK = (regData & 0x1F); + zeroData = (regData == 0) ? zeroData : (zeroData | (1U << ilasIdx)); + + /* CFG K */ + recoveryAction = adrv904x_JrxLink_JrxCoreKCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG K cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmK = cfgData; + + /* Compare ILAS & CFG K */ + if (dfrmData->dfrmIlasData.dfrmK != dfrmData->dfrmCfgData.dfrmK) + { + dfrmData->ilasMismatchDfrm |= (1U << ilasIdx); + } + ilasIdx++; + + /*** Comparing M ***/ + /* ILAS M */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg6_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS M for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData.dfrmM = regData; + zeroData = (regData == 0) ? zeroData : (zeroData | (1U << ilasIdx)); + + /* CFG M */ + recoveryAction = adrv904x_JrxLink_JrxCoreMCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG M cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmM = cfgData; + + /* Compare ILAS & CFG M */ + if (dfrmData->dfrmIlasData.dfrmM != dfrmData->dfrmCfgData.dfrmM) + { + dfrmData->ilasMismatchDfrm |= (1U << ilasIdx); + } + ilasIdx++; + + /*** Comparing N ***/ + /* ILAS N */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg7_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS N for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData.dfrmN = (regData & 0x1F); + zeroData = (regData == 0) ? zeroData : (zeroData | (1U << ilasIdx)); + + /* CFG N */ + recoveryAction = adrv904x_JrxLink_JrxCoreNCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG N cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmN = cfgData; + + /* Compare ILAS & CFG N */ + if (dfrmData->dfrmIlasData.dfrmN != dfrmData->dfrmCfgData.dfrmN) + { + dfrmData->ilasMismatchDfrm |= (1U << ilasIdx); + } + ilasIdx++; + + /*** Comparing CS ***/ + /* ILAS CS */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg7_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS CS for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData.dfrmCS = ((regData & 0xC0) >> 6); + zeroData = (regData == 0) ? zeroData : (zeroData | (1U << ilasIdx)); + + /* CFG CS */ + recoveryAction = adrv904x_JrxLink_JrxCoreCsCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG CS cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmCS = cfgData; + + /* Compare ILAS & CFG CS */ + if (dfrmData->dfrmIlasData.dfrmCS != dfrmData->dfrmCfgData.dfrmCS) + { + dfrmData->ilasMismatchDfrm |= (1U << ilasIdx); + } + ilasIdx++; + + /*** Comparing NP ***/ + /* ILAS NP */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg8_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS NP for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData.dfrmNP = (regData & 0X1F); + zeroData = (regData == 0) ? zeroData : (zeroData | (1U << ilasIdx)); + + /* CFG NP */ + recoveryAction = adrv904x_JrxLink_JrxCoreNpCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG NP cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmNP = cfgData; + + /* Compare ILAS & CFG NP */ + if (dfrmData->dfrmIlasData.dfrmNP != dfrmData->dfrmCfgData.dfrmNP) + { + dfrmData->ilasMismatchDfrm |= (1U << ilasIdx); + } + ilasIdx++; + + /*** Comparing S ***/ + /* ILAS S */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg9_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS S for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData.dfrmS = (regData & 0X1F); + zeroData = (regData == 0) ? zeroData : (zeroData | (1U << ilasIdx)); + + /* CFG S */ + recoveryAction = adrv904x_JrxLink_JrxCoreSCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG S cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmS = cfgData; + + /* Compare ILAS & CFG S */ + if (dfrmData->dfrmIlasData.dfrmS != dfrmData->dfrmCfgData.dfrmS) + { + dfrmData->ilasMismatchDfrm |= (1U << ilasIdx); + } + ilasIdx++; + + /*** Comparing CF ***/ + /* ILAS CF */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg10_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS CF for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData.dfrmCF = (regData & 0X1F); + zeroData = (regData == 0) ? zeroData : (zeroData | (1U << ilasIdx)); + + /* CFG CF */ + /* CF is not supported so deframer assign it to value read */ + dfrmData->dfrmCfgData.dfrmCF = dfrmData->dfrmIlasData.dfrmCF; + + /* Compare ILAS & CFG CF */ + if (dfrmData->dfrmIlasData.dfrmCF != dfrmData->dfrmCfgData.dfrmCF) + { + dfrmData->ilasMismatchDfrm |= (1U << ilasIdx); + } + ilasIdx++; + + /*** Comparing HD ***/ + /* ILAS HD */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg10_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS HD for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData.dfrmHD = ((regData & 0x80) >> 7); + zeroData = (regData == 0) ? zeroData : (zeroData | (1U << ilasIdx)); + + /* CFG HD */ + recoveryAction = adrv904x_JrxLink_JrxCoreHdCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG HD cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmHD = cfgData; + + /* Compare ILAS & CFG HD */ + if (dfrmData->dfrmIlasData.dfrmHD != dfrmData->dfrmCfgData.dfrmHD) + { + dfrmData->ilasMismatchDfrm |= (1U << ilasIdx); + } + ilasIdx++; + + /*** Comparing CHKSUM ***/ + /* ILAS CHKSUM */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg13_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS CHKSUM for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData.dfrmFCHK0 = regData; + + /* CFG CHKSUM */ + recoveryAction = adrv904x_JrxLink_JrxCoreChksumCfg_BfGet(device, + NULL, + deframerBaseAddr, + laneIdx, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG CHKSUM cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmFCHK0 = cfgData; + + /* Compare ILAS & CFG CHKSUM */ + if (dfrmData->dfrmIlasData.dfrmFCHK0 != dfrmData->dfrmCfgData.dfrmFCHK0) + { + dfrmData->ilasMismatchDfrm |= (1U << ilasIdx); + } + ilasIdx++; + + dfrmData->zeroCheckFlag = zeroData; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +static adi_adrv904x_ErrAction_e adrv904x_IlasChksum(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfrmCompareData_v2_t* dfrmData) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t laneIdx = 0U; + uint8_t chksum = 0U; + uint8_t preChksum = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_NULL_PTR_RETURN(dfrmData); + + + + /* Calculate checksum for common fields */ + preChksum = dfrmData->dfrmCfgData.jesdV; /* JESDV */ + preChksum += dfrmData->dfrmCfgData.subclassV; /* SUBCLASSV */ + preChksum += dfrmData->dfrmCfgData.dfrmDID; /* DID */ + preChksum += dfrmData->dfrmCfgData.dfrmL; /* L */ + preChksum += dfrmData->dfrmCfgData.dfrmF; /* F */ + preChksum += dfrmData->dfrmCfgData.dfrmK; /* K */ + preChksum += dfrmData->dfrmCfgData.dfrmM; /* M */ + preChksum += dfrmData->dfrmCfgData.dfrmN; /* N */ + preChksum += dfrmData->dfrmCfgData.dfrmCS; /* CS */ + preChksum += dfrmData->dfrmCfgData.dfrmNP; /* NP */ + preChksum += dfrmData->dfrmCfgData.dfrmS; /* S */ + preChksum += dfrmData->dfrmCfgData.dfrmHD; /* HD */ + preChksum += dfrmData->dfrmCfgData.dfrmSCR; /* SCR */ + preChksum += dfrmData->dfrmCfgData.dfrmCF; /* CF */ + + /* Continue to calculate checksum to include lane dependency */ + for (laneIdx = 0; laneIdx < ADI_ADRV904X_MAX_SERDES_LANES; laneIdx++) + { + chksum = preChksum; + chksum += dfrmData->dfrmIlasData[laneIdx].dfrmBID; /* use lane BID */ + chksum += dfrmData->dfrmIlasData[laneIdx].dfrmLID; /* use lane LID */ + + dfrmData->cfgDataChksum[laneIdx] = chksum; + + if (dfrmData->cfgDataChksum[laneIdx] != dfrmData->dfrmIlasData[laneIdx].dfrmFCHK) + { + dfrmData->ilasMismatchDfrm[laneIdx] |= ADI_ADRV904X_ILAS_CKSM; + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmIlasMismatchGet_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + adi_adrv904x_DfrmCompareData_v2_t* const dfrmData) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJrxLinkChanAddr_e deframerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JRX_LINK_0_; + adi_adrv904x_DeframerCfg_t deframerCfg; /* Initialized later on */ + uint8_t deframerLinkType = 0U; + uint8_t laneIdx = 0U; + uint8_t regData = 0U; + uint8_t cfgData = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dfrmData, cleanup); + ADI_LIBRARY_MEMSET(&deframerCfg, 0U, sizeof(adi_adrv904x_DeframerCfg_t)); + ADI_LIBRARY_MEMSET(dfrmData, 0U, sizeof(adi_adrv904x_DfrmCompareData_v2_t)); + + /* Get the base address of the selected deframer */ + recoveryAction = adrv904x_DeframerBitfieldAddressGet(device, deframerSel, &deframerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected deframer"); + goto cleanup; + } + + recoveryAction = adrv904x_JesdCommon_JrxLinkEn_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading deframer enabled status"); + goto cleanup; + } + + /* Check if deframer requested is enabled, if not return error */ + if ((regData & deframerSel) == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error: Requested deframer not enabled"); + goto cleanup; + } + + /* Get the deframer link type: 204B or 204C */ + recoveryAction = adrv904x_JrxLink_JrxLinkType_BfGet(device, + NULL, + deframerBaseAddr, + &deframerLinkType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading link type from device"); + goto cleanup; + } + + if (deframerLinkType != 0U) /* 204C is not supported */ + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid link type: only supports 204B link."); + goto cleanup; + } + + /* Get Deframer Lane Crossbar information to find the first lane in used */ + recoveryAction = adrv904x_DeframerLaneEnableGet(device, deframerSel, &deframerCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lane cross bar the selected deframer"); + goto cleanup; + } + dfrmData->phyLaneEnMask = deframerCfg.deserializerLanesEnabled; + + /***** Read all necessary configuration of the selected deframer for comparison *****/ + + /* CFG DID */ + recoveryAction = adrv904x_JrxLink_JrxCoreDidCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG DID cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmDID = cfgData; + + /* CFG L */ + recoveryAction = adrv904x_JrxLink_JrxCoreLCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG L cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmL = cfgData; + + /* CFG DSCR */ + recoveryAction = adrv904x_JrxLink_JrxCoreDscrCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG DSCR cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmSCR = cfgData; + + /* CFG F */ + recoveryAction = adrv904x_JrxLink_JrxCoreFCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG F cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmF = cfgData; + + /* CFG K */ + recoveryAction = adrv904x_JrxLink_JrxCoreKCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG K cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmK = cfgData; + + /* CFG M */ + recoveryAction = adrv904x_JrxLink_JrxCoreMCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG M cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmM = cfgData; + + /* CFG N */ + recoveryAction = adrv904x_JrxLink_JrxCoreNCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG N cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmN = cfgData; + + /* CFG CS */ + recoveryAction = adrv904x_JrxLink_JrxCoreCsCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG CS cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmCS = cfgData; + + /* CFG NP */ + recoveryAction = adrv904x_JrxLink_JrxCoreNpCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG NP cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmNP = cfgData; + + /* CFG S */ + recoveryAction = adrv904x_JrxLink_JrxCoreSCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG S cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmS = cfgData; + + /* CFG HD */ + recoveryAction = adrv904x_JrxLink_JrxCoreHdCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG HD cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.dfrmHD = cfgData; + + /* CFG CF is always zero */ + dfrmData->dfrmCfgData.dfrmCF = 0U; + + /* CFG JESDV */ + recoveryAction = adrv904x_JrxLink_JrxCoreJesdvCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG JESDV cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.jesdV = cfgData; + + /* CFG SUBCLASSV */ + recoveryAction = adrv904x_JrxLink_JrxCoreSubclassvCfg_BfGet(device, + NULL, + deframerBaseAddr, + &cfgData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get CFG SUBCLASSV cfg for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmCfgData.subclassV = cfgData; + + /***** Read configuration for each lane and compare with the selected deframer configuration *****/ + + for (laneIdx = 0U; laneIdx < ADI_ADRV904X_MAX_SERDES_LANES; laneIdx++) + { + if ((dfrmData->phyLaneEnMask & (1U << laneIdx)) == 0U) + { + continue; /* skip lane that is not enabled */ + } + + /*** Read and comparing lane DID ***/ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg0_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS DID for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData[laneIdx].dfrmDID = regData; + + if (dfrmData->dfrmIlasData[laneIdx].dfrmDID != 0U) + { + dfrmData->zeroCheckFlag[laneIdx] |= ADI_ADRV904X_ILAS_DID; + } + + if (dfrmData->dfrmIlasData[laneIdx].dfrmDID != dfrmData->dfrmCfgData.dfrmDID) + { + dfrmData->ilasMismatchDfrm[laneIdx] |= ADI_ADRV904X_ILAS_DID; + } + + /*** Read and comparing lane BID ***/ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg1_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS BID for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData[laneIdx].dfrmBID = (regData & 0x0FU); + + if (dfrmData->dfrmIlasData[laneIdx].dfrmBID != 0U) + { + dfrmData->zeroCheckFlag[laneIdx] |= ADI_ADRV904X_ILAS_BID; + } + + /* CFG BID is not supported so deframer assign it to lane ILAS read */ + dfrmData->dfrmCfgData.dfrmBID = dfrmData->dfrmIlasData[laneIdx].dfrmBID; + + if (dfrmData->dfrmIlasData[laneIdx].dfrmBID != dfrmData->dfrmCfgData.dfrmBID) + { + dfrmData->ilasMismatchDfrm[laneIdx] |= ADI_ADRV904X_ILAS_BID; + } + + /*** Read and comparing lane LID ***/ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg2_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS LID for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData[laneIdx].dfrmLID = (regData & 0x1FU); + + if (dfrmData->dfrmIlasData[laneIdx].dfrmLID != 0U) + { + dfrmData->zeroCheckFlag[laneIdx] |= ADI_ADRV904X_ILAS_LID; + } + + if (dfrmData->dfrmIlasData[laneIdx].dfrmLID != dfrmData->dfrmCfgData.dfrmLID) + { + dfrmData->ilasMismatchDfrm[laneIdx] |= ADI_ADRV904X_ILAS_LID; + } + + /*** Read and comparing lane L and SCR ***/ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg3_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS L and SCR for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData[laneIdx].dfrmL = (regData & 0x1FU); + dfrmData->dfrmIlasData[laneIdx].dfrmSCR = ((regData & 0x80U) >> 7U); + + if (dfrmData->dfrmIlasData[laneIdx].dfrmL != 0U) + { + dfrmData->zeroCheckFlag[laneIdx] |= ADI_ADRV904X_ILAS_L; + } + + if (dfrmData->dfrmIlasData[laneIdx].dfrmL != dfrmData->dfrmCfgData.dfrmL) + { + dfrmData->ilasMismatchDfrm[laneIdx] |= ADI_ADRV904X_ILAS_L; + } + + /*** Comparing lane DSCR ***/ + if (dfrmData->dfrmIlasData[laneIdx].dfrmSCR != 0U) + { + dfrmData->zeroCheckFlag[laneIdx] |= ADI_ADRV904X_ILAS_SCR; + } + + if (dfrmData->dfrmIlasData[laneIdx].dfrmSCR != dfrmData->dfrmCfgData.dfrmSCR) + { + dfrmData->ilasMismatchDfrm[laneIdx] |= ADI_ADRV904X_ILAS_SCR; + } + + /*** Read and comparing lane F ***/ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg4_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS F for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData[laneIdx].dfrmF = regData; + + if (dfrmData->dfrmIlasData[laneIdx].dfrmF != 0U) + { + dfrmData->zeroCheckFlag[laneIdx] |= ADI_ADRV904X_ILAS_F; + } + + if (dfrmData->dfrmIlasData[laneIdx].dfrmF != dfrmData->dfrmCfgData.dfrmF) + { + dfrmData->ilasMismatchDfrm[laneIdx] |= ADI_ADRV904X_ILAS_F; + } + + /*** Read and comparing lane K ***/ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg5_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS K for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData[laneIdx].dfrmK = (regData & 0x1FU); + + if (dfrmData->dfrmIlasData[laneIdx].dfrmK != 0U) + { + dfrmData->zeroCheckFlag[laneIdx] |= ADI_ADRV904X_ILAS_K; + } + + if (dfrmData->dfrmIlasData[laneIdx].dfrmK != dfrmData->dfrmCfgData.dfrmK) + { + dfrmData->ilasMismatchDfrm[laneIdx] |= ADI_ADRV904X_ILAS_K; + } + + /*** Read and comparing lane M ***/ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg6_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS M for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData[laneIdx].dfrmM = regData; + + if (dfrmData->dfrmIlasData[laneIdx].dfrmM != 0U) + { + dfrmData->zeroCheckFlag[laneIdx] |= ADI_ADRV904X_ILAS_M; + } + + if (dfrmData->dfrmIlasData[laneIdx].dfrmM != dfrmData->dfrmCfgData.dfrmM) + { + dfrmData->ilasMismatchDfrm[laneIdx] |= ADI_ADRV904X_ILAS_M; + } + + /*** Read and comparing lane N and CS ***/ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg7_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS N and CS for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData[laneIdx].dfrmN = (regData & 0x1FU); + dfrmData->dfrmIlasData[laneIdx].dfrmCS = ((regData & 0xC0U) >> 6U); + + if (dfrmData->dfrmIlasData[laneIdx].dfrmN != 0U) + { + dfrmData->zeroCheckFlag[laneIdx] |= ADI_ADRV904X_ILAS_N; + } + + if (dfrmData->dfrmIlasData[laneIdx].dfrmN != dfrmData->dfrmCfgData.dfrmN) + { + dfrmData->ilasMismatchDfrm[laneIdx] |= ADI_ADRV904X_ILAS_N; + } + + /*** Comparing lane CS ***/ + if (dfrmData->dfrmIlasData[laneIdx].dfrmCS != 0U) + { + dfrmData->zeroCheckFlag[laneIdx] |= ADI_ADRV904X_ILAS_CS; + } + + if (dfrmData->dfrmIlasData[laneIdx].dfrmCS != dfrmData->dfrmCfgData.dfrmCS) + { + dfrmData->ilasMismatchDfrm[laneIdx] |= ADI_ADRV904X_ILAS_CS; + } + + /*** Read and comparing lane NP and JESDV ***/ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg8_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS NP and JESDV for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData[laneIdx].dfrmNP = (regData & 0X1FU); + dfrmData->dfrmIlasData[laneIdx].jesdV = (regData & 0XE0U) >> 5U; + + if (dfrmData->dfrmIlasData[laneIdx].dfrmNP != 0U) + { + dfrmData->zeroCheckFlag[laneIdx] |= ADI_ADRV904X_ILAS_NP; + } + + if (dfrmData->dfrmIlasData[laneIdx].dfrmNP != dfrmData->dfrmCfgData.dfrmNP) + { + dfrmData->ilasMismatchDfrm[laneIdx] |= ADI_ADRV904X_ILAS_NP; + } + + /*** Comparing lane JESDV ***/ + if (dfrmData->dfrmIlasData[laneIdx].jesdV != 0U) + { + dfrmData->zeroCheckFlag[laneIdx] |= ADI_ADRV904X_ILAS_JESDV; + } + + if (dfrmData->dfrmIlasData[laneIdx].jesdV != dfrmData->dfrmCfgData.jesdV) + { + dfrmData->ilasMismatchDfrm[laneIdx] |= ADI_ADRV904X_ILAS_JESDV; + } + + /*** Read and comparing lane S ***/ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg9_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS S for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData[laneIdx].dfrmS = (regData & 0X1FU); + dfrmData->dfrmIlasData[laneIdx].subclassV = (regData & 0XE0) >> 5U; + + if (dfrmData->dfrmIlasData[laneIdx].dfrmS != 0U) + { + dfrmData->zeroCheckFlag[laneIdx] |= ADI_ADRV904X_ILAS_S; + } + + if (dfrmData->dfrmIlasData[laneIdx].dfrmS != dfrmData->dfrmCfgData.dfrmS) + { + dfrmData->ilasMismatchDfrm[laneIdx] |= ADI_ADRV904X_ILAS_S; + } + + /*** Comparing lane SUBCLASSV ***/ + if (dfrmData->dfrmIlasData[laneIdx].subclassV != 0U) + { + dfrmData->zeroCheckFlag[laneIdx] |= ADI_ADRV904X_ILAS_SUBCLASSV; + } + + if (dfrmData->dfrmIlasData[laneIdx].subclassV != dfrmData->dfrmCfgData.subclassV) + { + dfrmData->ilasMismatchDfrm[laneIdx] |= ADI_ADRV904X_ILAS_SUBCLASSV; + } + + /*** Read and comparing lane CF ***/ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg10_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS CF and HD for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData[laneIdx].dfrmCF = (regData & 0X1FU); + dfrmData->dfrmIlasData[laneIdx].dfrmHD = ((regData & 0x80U) >> 7U); + + if (dfrmData->dfrmIlasData[laneIdx].dfrmCF != 0U) + { + dfrmData->zeroCheckFlag[laneIdx] |= ADI_ADRV904X_ILAS_CF; + } + + if (dfrmData->dfrmIlasData[laneIdx].dfrmCF != dfrmData->dfrmCfgData.dfrmCF) + { + dfrmData->ilasMismatchDfrm[laneIdx] |= ADI_ADRV904X_ILAS_CF; + } + + /*** Comparing lane HD ***/ + if (dfrmData->dfrmIlasData[laneIdx].dfrmHD != 0U) + { + dfrmData->zeroCheckFlag[laneIdx] |= ADI_ADRV904X_ILAS_HD; + } + + if (dfrmData->dfrmIlasData[laneIdx].dfrmHD != dfrmData->dfrmCfgData.dfrmHD) + { + dfrmData->ilasMismatchDfrm[laneIdx] |= ADI_ADRV904X_ILAS_HD; + } + + /*** Read lane CHKSUM ***/ + recoveryAction = adrv904x_JesdCommon_JrxDl204bL0Rxcfg13_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON, + laneIdx, + ®Data); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get ILAS CHKSUM for the selected deframer"); + goto cleanup; + } + dfrmData->dfrmIlasData[laneIdx].dfrmFCHK = regData; + + /*** Set lane mismatch bit map */ + if (dfrmData->ilasMismatchDfrm[laneIdx] != 0U) + { + dfrmData->laneMismatchMask |= 1U << laneIdx; + } + } + + /*** Calculate and compare CHKSUM ***/ + recoveryAction = adrv904x_IlasChksum(device, dfrmData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to compare ILAS CHKSUM for the selected deframer"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmIrqMaskGet( adi_adrv904x_Device_t* const device, + uint16_t* const irqMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, irqMask, cleanup); + *irqMask = 0U; + + /* Read back the Dfrm IRQ Mask Vector for deframers */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bIrqClr_BfGet( device, + NULL, + commonBaseAddr, + irqMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading 204B Irq Mask for Deframers"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmIrqMaskSet( adi_adrv904x_Device_t* const device, + const uint16_t irqMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Set the Dfrm IRQ Mask Vector for deframers */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bIrqClr_BfSet( device, + NULL, + commonBaseAddr, + irqMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error setting 204B Irq Mask for Deframers"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmIrqSourceReset( adi_adrv904x_Device_t* const device) +{ + static const uint16_t irqMask_Clr = 0xFFFFU; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + uint16_t irqMask_Save = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Read back the Dfrm IRQ Vector, clear interrupts, restore original mask */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bIrqClr_BfGet( device, + NULL, + commonBaseAddr, + &irqMask_Save); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error saving initial 204B Irq Mask for Deframers"); + goto cleanup; + } + + recoveryAction = adrv904x_JesdCommon_JrxDl204bIrqClr_BfSet( device, + NULL, + commonBaseAddr, + irqMask_Clr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error clearing all 204B Irqs for Deframers"); + goto cleanup; + } + + recoveryAction = adrv904x_JesdCommon_JrxDl204bIrqClr_BfSet( device, + NULL, + commonBaseAddr, + irqMask_Save); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error restoring initial 204B Irq Mask for Deframers"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmIrqSourceGet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSelect, + adi_adrv904x_DeframerIrqVector_t* const irqSourceVector) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + adi_adrv904x_DeframerCfg_t deframerCfg[ADI_ADRV904X_MAX_DEFRAMERS]; + uint8_t deframerIdx = 0U; + uint8_t laneIdx = 0U; + uint8_t laneSel = 0U; + + ADI_LIBRARY_MEMSET(&deframerCfg, 0, sizeof(deframerCfg)); + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, irqSourceVector, cleanup); + + /* Range Check deframerSelect */ + if ((deframerSelect != ADI_ADRV904X_DEFRAMER_0) && + (deframerSelect != ADI_ADRV904X_DEFRAMER_1) && + (deframerSelect != ADI_ADRV904X_ALL_DEFRAMER)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, deframerSelect, "Invalid JESD Deframer Select Value. Must select Deframer 0, 1, or All."); + goto cleanup; + } + + /* Clear irqSourceVector */ + ADI_LIBRARY_MEMSET(irqSourceVector, 0, sizeof(adi_adrv904x_DeframerIrqVector_t)); + + /* Determine which lane vectors are used by each deframer */ + for (deframerIdx = 0U; deframerIdx < ADI_ADRV904X_MAX_DEFRAMERS; deframerIdx++) + { + recoveryAction = adi_adrv904x_DeframerCfgGet(device, ADI_ADRV904X_DEFRAMER_0, &deframerCfg[deframerIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error retrieving deframer configuration"); + goto cleanup; + } + } + + /* Read back Dfrm IRQ Vectors for all lanes enabled for any selected deframer */ + for (laneIdx = 0U; laneIdx < ADI_ADRV904X_MAX_DESERIALIZER_LANES; laneIdx++) + { + laneSel = 1U << laneIdx; + + // Read this lane if enabled for a selected deframer + if ((deframerSelect == ADI_ADRV904X_DEFRAMER_0) || + (deframerSelect == ADI_ADRV904X_ALL_DEFRAMER)) + { + if ((deframerCfg[0U].deserializerLanesEnabled & laneSel) != 0U) + { + recoveryAction = adrv904x_JesdCommon_JrxDl204bIrqVec_BfGet( device, + NULL, + commonBaseAddr, + laneIdx, + &irqSourceVector->lane[laneIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading Irq Source Vector for a deserialized lane enabled for Deframer0."); + goto cleanup; + } + + irqSourceVector->deframer0 |= irqSourceVector->lane[laneIdx]; + } + } + + if ((deframerSelect == ADI_ADRV904X_DEFRAMER_1) || + (deframerSelect == ADI_ADRV904X_ALL_DEFRAMER)) + { + if ((deframerCfg[1U].deserializerLanesEnabled & laneSel) != 0U) + { + recoveryAction = adrv904x_JesdCommon_JrxDl204bIrqVec_BfGet( device, + NULL, + commonBaseAddr, + laneIdx, + &irqSourceVector->lane[laneIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading Irq Source Vector for a deserialized lane enabled for Deframer0."); + goto cleanup; + } + + irqSourceVector->deframer1 |= irqSourceVector->lane[laneIdx]; + } + } + + } + + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmErrCntrCntrlSet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfrmErrCounterIrqSel_e interruptEnable, + const uint8_t laneNumber, + const uint8_t errCounterControl, + const uint8_t errCounterHoldCfg) +{ + static const uint16_t IRQERRCOUNTERMASK = 0x00E0U; + static const uint8_t ERRCOUNTERRSTMASK = 0X70U; + static const uint8_t ERRCOUNTERCNTRLMASK = 0x07U; + static const uint8_t ERRCOUNTERHOLDMASK = 0x07U; + static const uint8_t ERRCOUNTERRSTSHIFT = 4U; + static const uint8_t CLEAR_RESET = 0x00U; + static const uint8_t MAX_COUNTER = 0xFFU; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + uint16_t irqMask = 0U; + uint8_t errorCounterReset = 0x00U; + uint8_t errorCounterConfig = 0x00U; + uint8_t lcl_errCounterHoldCfg = 0x00U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Check interrupt enable is valid */ + if ((interruptEnable != ADI_ADRV904X_DFRM_ERR_COUNT_ENABLE_IRQ) && + (interruptEnable != ADI_ADRV904X_DFRM_ERR_COUNT_DISABLE_IRQ)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, interruptEnable, "Invalid JESD 204b Deframer Error Counter Interrupt Enable value. Must select Enable or Disable."); + goto cleanup; + } + + /* Check lane number */ + if (laneNumber >= ADI_ADRV904X_MAX_DESERIALIZER_LANES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, laneNumber, "Invalid Lane Number value selected. Must Select lane 0-7."); + goto cleanup; + } + + /* Read current irq mask for read/modify/write */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bIrqClr_BfGet( device, + NULL, + commonBaseAddr, + &irqMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error saving initial 204B Irq Mask for Deframers"); + goto cleanup; + } + + /* Mask or unmask the three 204B Error-Counter based IRQs (BD/NIT/UnexpectedK) */ + if (interruptEnable == ADI_ADRV904X_DFRM_ERR_COUNT_ENABLE_IRQ) + { + irqMask &= (~IRQERRCOUNTERMASK); + } + else + { + irqMask |= IRQERRCOUNTERMASK; + } + + /* Write modified irqMask to device */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bIrqClr_BfSet( device, + NULL, + commonBaseAddr, + irqMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error setting new 204B Irq Mask for Deframers"); + goto cleanup; + } + + /* Extract 3 reset bits from input argument */ + errorCounterReset = (errCounterControl & ERRCOUNTERRSTMASK) >> ERRCOUNTERRSTSHIFT; + + /* Mask 3 config bits from input argument */ + errorCounterConfig = errCounterControl & ERRCOUNTERCNTRLMASK; + lcl_errCounterHoldCfg = errCounterHoldCfg & ERRCOUNTERHOLDMASK; + + /* Reset the requested error counters */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bEcntRst_BfSet( device, + NULL, + commonBaseAddr, + laneNumber, + errorCounterReset); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to reset error counters."); + goto cleanup; + } + + /* Clear reset bits */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bEcntRst_BfSet( device, + NULL, + commonBaseAddr, + laneNumber, + CLEAR_RESET); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to clear reset flag for error counters."); + goto cleanup; + } + + /* Set error counter threshold to 255 */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bEth_BfSet( device, + NULL, + commonBaseAddr, + MAX_COUNTER); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to clear set error threshold."); + goto cleanup; + } + + /* Write counter enable bits */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bEcntEna_BfSet( device, + NULL, + commonBaseAddr, + laneNumber, + errorCounterConfig); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write error counter enable."); + goto cleanup; + } + + /* Write the error counter hold configuration */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bEcntTch_BfSet( device, + NULL, + commonBaseAddr, + laneNumber, + lcl_errCounterHoldCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write error counter hold configuration."); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfrmErrCntrCntrlGet( adi_adrv904x_Device_t* const device, + const uint8_t laneNumber, + uint8_t* const errCounterControl, + uint8_t* const errCounterHoldCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, errCounterControl, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, errCounterHoldCfg, cleanup); + + /* Check lane number */ + if (laneNumber >= ADI_ADRV904X_MAX_DESERIALIZER_LANES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, laneNumber, "Invalid Lane Number value selected. Must Select lane 0-7."); + goto cleanup; + } + + /* Read out the contents of the error counter control */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bEcntEna_BfGet( device, + NULL, + commonBaseAddr, + laneNumber, + errCounterControl); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read error counter control."); + goto cleanup; + } + + /* Read out the contents of the error counter hold configuration */ + recoveryAction = adrv904x_JesdCommon_JrxDl204bEcntTch_BfGet( device, + NULL, + commonBaseAddr, + laneNumber, + errCounterHoldCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read error counter hold configuration."); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RunEyeSweep(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuCmd_RunEyeSweep_t* const runEyeSweep, + adi_adrv904x_CpuCmd_RunEyeSweepResp_t* const runEyeSweepResp) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_RunEyeSweep_t runEyeSweepCmd; + adrv904x_CpuCmd_RunEyeSweepResp_t runEyeSweepCmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + adi_adrv904x_CpuType_e cpuType = ADI_ADRV904X_CPU_TYPE_UNKNOWN; + uint32_t chanSel = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, runEyeSweep, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, runEyeSweepResp, cleanup); + ADI_LIBRARY_MEMSET(&runEyeSweepCmd, 0, sizeof(adrv904x_CpuCmd_RunEyeSweep_t)); + ADI_LIBRARY_MEMSET(&runEyeSweepCmdRsp, 0, sizeof(adrv904x_CpuCmd_RunEyeSweepResp_t)); + + if (runEyeSweep->lane > 7U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, runEyeSweep->lane, "Invalid lane provided."); + goto cleanup; + } + + if (runEyeSweep->prbsPattern > 3U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, runEyeSweep->prbsPattern, "Invalid prbsPattern provided."); + goto cleanup; + } + + if (runEyeSweep->forceUsingOuter > 1U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, runEyeSweep->forceUsingOuter, "Invalid forceUsingOuter provided."); + goto cleanup; + } + + if (runEyeSweep->prbsCheckDuration_ms == 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, runEyeSweep->prbsCheckDuration_ms, "Invalid prbsCheckDuration_ms provided."); + goto cleanup; + } + + /* Get the CPU that is responsible for the requested lane. */ + chanSel = 1U << (uint32_t)runEyeSweep->lane; + recoveryAction = adrv904x_CpuChannelMappingGet(device, (adi_adrv904x_Channels_e)(chanSel), ADRV904X_CPU_OBJID_IC_SERDES, &cpuType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, runEyeSweep->lane, "Invalid lane provided"); + goto cleanup; + } + + /* Prepare the command payload */ + runEyeSweepCmd.lane = (uint8_t)runEyeSweep->lane; + runEyeSweepCmd.prbsPattern = (uint8_t)runEyeSweep->prbsPattern; + runEyeSweepCmd.forceUsingOuter = (uint8_t)runEyeSweep->forceUsingOuter; + runEyeSweepCmd.prbsCheckDuration_ms = ADRV904X_HTOCL(runEyeSweep->prbsCheckDuration_ms); + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + cpuType, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_RUN_SERDES_EYE_SWEEP, + (void*)&runEyeSweepCmd, + sizeof(runEyeSweepCmd), + (void*)&runEyeSweepCmdRsp, + sizeof(runEyeSweepCmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(runEyeSweepCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* Extract the command-specific response from the response payload */ + runEyeSweepResp->spoLeft = runEyeSweepCmdRsp.spoLeft; + runEyeSweepResp->spoRight = runEyeSweepCmdRsp.spoRight; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RunEyeSweep_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuCmd_RunEyeSweep_t* const runEyeSweep, + adi_adrv904x_CpuCmd_RunEyeSweepResp_t* const runEyeSweepResp) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t chanSel = 0U; + uint32_t lengthResp = 0U; + uint32_t timeElapsedUs = 0U; + uint32_t le32PrbsCheckDuration_ms = 0U; + adi_adrv904x_CpuCmd_RunEyeSweepResp_t* runEyeSweepCmdRsp = NULL; + uint8_t ctrlDataSet[ADRV904X_SERDES_HORIZ_EYE_SWEEP_CMD_SIZE_BYTES]; + uint8_t ctrlDataGet[ADRV904X_SERDES_HORIZ_EYE_SWEEP_CMD_SIZE_BYTES]; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, runEyeSweep, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, runEyeSweepResp, cleanup); + + ADI_LIBRARY_MEMSET((void*)ctrlDataSet, 0, sizeof(ctrlDataSet)); + ADI_LIBRARY_MEMSET((void*)ctrlDataGet, 0, sizeof(ctrlDataGet)); + + /* Verify Parameters*/ + if (runEyeSweep->lane > 7U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, runEyeSweep->lane, "Invalid lane provided."); + goto cleanup; + } + + if (runEyeSweep->prbsPattern > 3U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, runEyeSweep->prbsPattern, "Invalid prbsPattern provided."); + goto cleanup; + } + + if (runEyeSweep->prbsCheckDuration_ms == 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, runEyeSweep->prbsCheckDuration_ms, "Invalid prbsCheckDuration_ms provided."); + goto cleanup; + } + + le32PrbsCheckDuration_ms = ADRV904X_HTOCL(runEyeSweep->prbsCheckDuration_ms); + + /* Get channel corresponded to the requested lane. */ + chanSel = 1U << (uint32_t)runEyeSweep->lane; + + /* Prepare the command payload */ + ctrlDataSet[0] = (uint8_t)runEyeSweep->lane; + ctrlDataSet[1] = (uint8_t)ADRV904X_SERDES_TEST_CMD; + ctrlDataSet[2] = (uint8_t)ADRV904X_SERDES_TEST_HORIZ_EYE_SWEEP; + ctrlDataSet[3] = 0x01U; + ctrlDataSet[4] = (uint8_t)runEyeSweep->prbsPattern; + ctrlDataSet[8] = (uint8_t)(le32PrbsCheckDuration_ms & 0xFFU); + ctrlDataSet[9] = (uint8_t)((le32PrbsCheckDuration_ms >> 8U) & 0xFFU); + ctrlDataSet[10] = (uint8_t)((le32PrbsCheckDuration_ms >> 16U) & 0xFFU); + ctrlDataSet[11] = (uint8_t)((le32PrbsCheckDuration_ms >> 24U) & 0xFFU); + ctrlDataSet[12] = 0x01U; + + /* Exec command */ + recoveryAction = adi_adrv904x_CpuControlCmdExec(device, + ADRV904X_CPU_OBJID_IC_SERDES, + ADRV904X_SERDES_CTRL_SET_FSM_CMD, + (adi_adrv904x_Channels_e)(chanSel), + ctrlDataSet, + sizeof(ctrlDataSet), + &lengthResp, + ctrlDataGet, + sizeof(ctrlDataGet)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + chanSel, + "Failed to Run Horizontal Eye Sweep"); + goto cleanup; + } + + runEyeSweepCmdRsp = (adi_adrv904x_CpuCmd_RunEyeSweepResp_t*)((uint8_t*)ctrlDataGet + ADRV904X_SERDES_CTRL_FSM_CMD_RSP_HDR_SIZE_BYTES); + + /* Poll Serdes Calibration Status for completion of the Eye Sweep */ + for (timeElapsedUs = 0U; timeElapsedUs < ADI_ADRV904X_RUNEYESWEEP_TIMEOUT_US; timeElapsedUs += ADI_ADRV904X_RUNEYESWEEP_INTERVAL_US) + { + /* Get Serdes Calibration Status */ + recoveryAction = adi_adrv904x_CalSpecificStatusGet( device, + (adi_adrv904x_Channels_e)(chanSel), + ADRV904X_CPU_OBJID_TC_SERDES, + ctrlDataGet, + sizeof(ctrlDataGet)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get Serdes calibration status failed"); + goto cleanup; + } + + /* Break out here if Eye sweep have been completed */ + if (ctrlDataGet[1] == (uint8_t)ADRV904X_SERDES_TEST_CMD_DONE) + { + break; + } + + /* Eye Sweep is still in progress. Wait the specified wait interval, then check again for status. */ + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_Wait_us(&device->common, ADI_ADRV904X_RUNEYESWEEP_INTERVAL_US); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "HAL Wait Issue"); + goto cleanup; + } + } + + /* Check for timeout */ + if (timeElapsedUs >= ADI_ADRV904X_RUNEYESWEEP_TIMEOUT_US) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_FEATURE; + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_TIMEOUT, + recoveryAction, + timeElapsedUs, + "Run Horizontal Eye Sweep Timeout"); + goto cleanup; + } + + /* Extract the command-specific response from the response payload */ + runEyeSweepResp->spoLeft = runEyeSweepCmdRsp->spoLeft; + runEyeSweepResp->spoRight = runEyeSweepCmdRsp->spoRight; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RunVerticalEyeSweep(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuCmd_RunVertEyeSweep_t* const runVerticalEyeSweep, + adi_adrv904x_CpuCmd_RunVertEyeSweepResp_t* const runVerticalEyeSweepResp) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_RunVertEyeSweep_t runVerticalEyeSweepCmd; + adrv904x_CpuCmd_RunVertEyeSweepResp_t runVerticalEyeSweepCmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + adi_adrv904x_CpuType_e cpuType = ADI_ADRV904X_CPU_TYPE_UNKNOWN; + uint32_t chanSel = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, runVerticalEyeSweep, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, runVerticalEyeSweepResp, cleanup); + + ADI_LIBRARY_MEMSET(&runVerticalEyeSweepCmd, 0, sizeof(adrv904x_CpuCmd_RunVertEyeSweep_t)); + ADI_LIBRARY_MEMSET(&runVerticalEyeSweepCmdRsp, 0, sizeof(adrv904x_CpuCmd_RunVertEyeSweepResp_t)); + + if (runVerticalEyeSweep->lane > 7U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, runVerticalEyeSweep->lane, "Invalid lane provided."); + goto cleanup; + } + + /* Get the CPU that is responsible for the requested lane. */ + chanSel = (uint32_t)(1U << runVerticalEyeSweep->lane); + recoveryAction = adrv904x_CpuChannelMappingGet(device, (adi_adrv904x_Channels_e)(chanSel), ADRV904X_CPU_OBJID_IC_SERDES, &cpuType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, runVerticalEyeSweep->lane, "Invalid lane provided"); + goto cleanup; + } + + /* Prepare the command payload */ + runVerticalEyeSweepCmd.lane = (uint8_t)runVerticalEyeSweep->lane; + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + cpuType, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_RUN_SERDES_VERT_EYE_SWEEP, + (void*)&runVerticalEyeSweepCmd, + sizeof(runVerticalEyeSweepCmd), + (void*)&runVerticalEyeSweepCmdRsp, + sizeof(runVerticalEyeSweepCmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(runVerticalEyeSweepCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* Extract the command-specific response from the response payload */ + ADI_LIBRARY_MEMCPY(&runVerticalEyeSweepResp->eyeHeightsAtSpo, runVerticalEyeSweepCmdRsp.eyeHeightsAtSpo, sizeof(runVerticalEyeSweepCmdRsp.eyeHeightsAtSpo)); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RunVerticalEyeSweep_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuCmd_RunVertEyeSweep_t* const runVerticalEyeSweep, + adi_adrv904x_CpuCmd_RunVertEyeSweepResp_t* const runVerticalEyeSweepResp) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t chanSel = 0U; + uint32_t lengthResp = 0U; + uint32_t timeElapsedUs = 0U; + adi_adrv904x_CpuCmd_RunVertEyeSweepResp_t* runEyeSweepCmdRsp = NULL; + uint8_t ctrlDataSet[ADRV904X_SERDES_VERT_EYE_SWEEP_CMD_SIZE_BYTES]; + uint8_t ctrlDataGet[sizeof(adi_adrv904x_CpuCmd_RunVertEyeSweepResp_t) + ADRV904X_SERDES_CTRL_FSM_CMD_RSP_HDR_SIZE_BYTES]; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, runVerticalEyeSweep, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, runVerticalEyeSweepResp, cleanup); + + ADI_LIBRARY_MEMSET((void*)ctrlDataSet, 0, sizeof(ctrlDataSet)); + ADI_LIBRARY_MEMSET((void*)ctrlDataGet, 0, sizeof(ctrlDataGet)); + + if (runVerticalEyeSweep->lane > 7U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, runVerticalEyeSweep->lane, "Invalid lane provided."); + goto cleanup; + } + + /* Get channel corresponded to the requested lane. */ + chanSel = 1U << (uint32_t)runVerticalEyeSweep->lane; + + /* Prepare the command payload */ + ctrlDataSet[0] = (uint8_t)runVerticalEyeSweep->lane; + ctrlDataSet[1] = (uint8_t)ADRV904X_SERDES_TEST_CMD; + ctrlDataSet[2] = (uint8_t)ADRV904X_SERDES_TEST_VERT_EYE_SWEEP; + ctrlDataSet[3] = 0x01U; + ctrlDataSet[4] = 0x10U; + ctrlDataSet[5] = 0x01U; + + /* Exec command */ + recoveryAction = adi_adrv904x_CpuControlCmdExec(device, + ADRV904X_CPU_OBJID_IC_SERDES, + ADRV904X_SERDES_CTRL_SET_FSM_CMD, + (adi_adrv904x_Channels_e)(chanSel), + ctrlDataSet, + sizeof(ctrlDataSet), + &lengthResp, + ctrlDataGet, + sizeof(ctrlDataGet)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + chanSel, + "Failed to Run Vertical Eye Sweep"); + goto cleanup; + } + + runEyeSweepCmdRsp = (adi_adrv904x_CpuCmd_RunVertEyeSweepResp_t*)((uint8_t*)ctrlDataGet + ADRV904X_SERDES_CTRL_FSM_CMD_RSP_HDR_SIZE_BYTES); + + /* Poll Serdes Calibration Status for completion of the Eye Sweep */ + for (timeElapsedUs = 0U; timeElapsedUs < ADI_ADRV904X_RUNEYESWEEP_TIMEOUT_US; timeElapsedUs += ADI_ADRV904X_RUNEYESWEEP_INTERVAL_US) + { + /* Get Serdes Calibration Status */ + recoveryAction = adi_adrv904x_CalSpecificStatusGet( device, + (adi_adrv904x_Channels_e)(chanSel), + ADRV904X_CPU_OBJID_TC_SERDES, + ctrlDataGet, + sizeof(ctrlDataGet)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get Serdes calibration status failed"); + goto cleanup; + } + + /* Break out here if Eye sweep have been completed */ + if (ctrlDataGet[1] == (uint8_t)ADRV904X_SERDES_TEST_CMD_DONE) + { + break; + } + + /* Eye Sweep is still in progress. Wait the specified wait interval, then check again for status. */ + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_Wait_us(&device->common, ADI_ADRV904X_RUNEYESWEEP_INTERVAL_US); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "HAL Wait Issue"); + goto cleanup; + } + } + + /* Check for timeout */ + if (timeElapsedUs >= ADI_ADRV904X_RUNEYESWEEP_TIMEOUT_US) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_FEATURE; + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_TIMEOUT, + recoveryAction, + timeElapsedUs, + "Run Vertical Eye Sweep Timeout"); + goto cleanup; + } + + /* Extract the command-specific response from the response payload */ + ADI_LIBRARY_MEMCPY(&runVerticalEyeSweepResp->eyeHeightsAtSpo, runEyeSweepCmdRsp->eyeHeightsAtSpo, sizeof(runEyeSweepCmdRsp->eyeHeightsAtSpo)); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SerializerReset_v2(adi_adrv904x_Device_t* const device, + adi_adrv904x_CpuCmd_SerReset_t* const pSerResetParms, + adi_adrv904x_CpuCmd_SerResetResp_t* const pSerResetResp) +{ + uint8_t framerLinkType = 0U; + uint8_t phyLanePd = 0U; + uint8_t phyLaneIdx = 0U; + adrv904x_BfSerdesTxdigPhyRegmapCore1p2ChanAddr_e laneSerdesPhyBitfieldAddr = ADRV904X_BF_DIGITAL_CORE_JESD_SERIALIZER_SER_PHY_0_; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + adrv904x_CpuCmd_SerReset_t serReset; + adrv904x_CpuCmd_SerResetResp_t serResetResp; + uint8_t presetClockOffsets = 0U; + adrv904x_CpuCmd_JtxLanePower_t jtxPwrCmd; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pSerResetParms, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pSerResetResp, cleanup); + + ADI_LIBRARY_MEMSET(&serReset, 0, sizeof(adrv904x_CpuCmd_SerReset_t)); + ADI_LIBRARY_MEMSET(&serResetResp, 0, sizeof(adrv904x_CpuCmd_SerResetResp_t)); + ADI_LIBRARY_MEMSET(&jtxPwrCmd, 0, sizeof(jtxPwrCmd)); + + /* copy parameter */ + serReset.serResetParm = ADRV904X_HTOCL(pSerResetParms->serResetParm); + presetClockOffsets = pSerResetParms->presetClockOffsets; + + /* Get the framer link type: 204B or 204C - Check link0 type only */ + recoveryAction = adrv904x_JtxLink_JtxLinkType_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_, + &framerLinkType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get link type for the selected framer"); + goto cleanup; + } + + if (presetClockOffsets) + { + for (phyLaneIdx = 0U; phyLaneIdx < ADI_ADRV904X_MAX_SERDES_LANES; phyLaneIdx++) + { + recoveryAction = (adi_adrv904x_ErrAction_e) adrv904x_FramerLaneSerdesPhyBitfieldAddressGet(device, + phyLaneIdx, + &laneSerdesPhyBitfieldAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lane serdes PHY address."); + goto cleanup; + } + + recoveryAction = adrv904x_GetJtxLanePoweredDown(device, + laneSerdesPhyBitfieldAddr, + &phyLanePd); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading Jtx lane power-up status"); + goto cleanup; + } + + if (phyLanePd == 0U) + { + /* Lane is powered up; Determine the reset sequence based on the 204c/204b mode */ + if (framerLinkType == 0U) + { + /* 204b case set Clockoffset to 4 */ + recoveryAction = adrv904x_SerdesTxdigPhyRegmapCore1p2_ClkoffsetSerRc_BfSet( device, + NULL, + laneSerdesPhyBitfieldAddr, + 4U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing to serializer clock offset"); + goto cleanup; + } + + } + else + { + /* 204C - set FIFO Start Addr to 1 */ + recoveryAction = adrv904x_SerdesTxdigPhyRegmapCore1p2_FifoStartAddr_BfSet( device, + NULL, + laneSerdesPhyBitfieldAddr, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing Fifo Start Address"); + goto cleanup; + } + + /* set Clockoffset to 1 */ + recoveryAction = adrv904x_SerdesTxdigPhyRegmapCore1p2_ClkoffsetSerRc_BfSet( device, + NULL, + laneSerdesPhyBitfieldAddr, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing digital logic clock shift"); + goto cleanup; + } + } + } + } /* End for loop per lane */ + } + + /* Send serializer reset command */ + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_JESD_SER_RESET, + (void*)&serReset, + sizeof(serReset), + (void*)&serResetResp, + sizeof(serResetResp), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(serResetResp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* Extract the command-specific response from the response payload */ + pSerResetResp->serResetResults = ADRV904X_CTOHL(serResetResp.serResetResults); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SerLaneCfgGet(adi_adrv904x_Device_t* const device, + const uint8_t laneNumber, + adi_adrv904x_SerLaneCfg_t* const serLaneCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_GetJesdSerLaneCfg_t getJesdSerLaneCfg; + adrv904x_CpuCmd_GetJesdSerLaneCfgResp_t getJesdSerLaneCfgResp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + adi_adrv904x_CpuType_e cpuType = ADI_ADRV904X_CPU_TYPE_UNKNOWN; + uint32_t chanSel = 0U; + + ADI_LIBRARY_MEMSET(&getJesdSerLaneCfg, 0, sizeof(adrv904x_CpuCmd_GetJesdSerLaneCfg_t)); + ADI_LIBRARY_MEMSET(&getJesdSerLaneCfgResp, 0, sizeof(adrv904x_CpuCmd_GetJesdSerLaneCfgResp_t)); + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, serLaneCfg, cleanup); + + if (laneNumber > 7U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, laneNumber, "Invalid lane provided."); + goto cleanup; + } + + ADI_LIBRARY_MEMSET(serLaneCfg, 0, sizeof(adi_adrv904x_SerLaneCfg_t)); + + /* Get the CPU that is responsible for the requested lane. TODO: Using channel mapping for now */ + chanSel = 1U << (uint32_t)laneNumber; + recoveryAction = adrv904x_CpuChannelMappingGet(device, (adi_adrv904x_Channels_e)(chanSel), ADRV904X_CPU_OBJID_SYSTEM_END, &cpuType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, laneNumber, "Invalid lane provided"); + goto cleanup; + } + + /* Prepare the command payload */ + getJesdSerLaneCfg.lane = (uint8_t)laneNumber; + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + cpuType, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_JESD_SER_LANE_GET_CFG, + (void*)&getJesdSerLaneCfg, + sizeof(getJesdSerLaneCfg), + (void*)&getJesdSerLaneCfgResp, + sizeof(getJesdSerLaneCfgResp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(getJesdSerLaneCfgResp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* Extract the command-specific response from the response payload */ + serLaneCfg->outputDriveSwing = (adi_adrv904x_SerLaneCfgOutputDriveSwing_e)getJesdSerLaneCfgResp.outputDriveSwing; + serLaneCfg->preEmphasis = (adi_adrv904x_SerLaneCfgPreEmphasis_e)getJesdSerLaneCfgResp.preEmphasis; + serLaneCfg->postEmphasis = (adi_adrv904x_SerLaneCfgPostEmphasis_e)getJesdSerLaneCfgResp.postEmphasis; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SerLaneCfgSet(adi_adrv904x_Device_t* const device, + const uint8_t laneNumber, + const adi_adrv904x_SerLaneCfg_t* const serLaneCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_SetJesdSerLaneCfg_t setJesdSerLaneCfg; + adrv904x_CpuCmd_SetJesdSerLaneCfgResp_t setJesdSerLaneCfgResp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adi_adrv904x_CpuErrorCode_t cpuErrorCode = 0U; + adi_adrv904x_CpuType_e cpuType = ADI_ADRV904X_CPU_TYPE_UNKNOWN; + uint32_t chanSel = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, serLaneCfg, cleanup); + ADI_LIBRARY_MEMSET(&setJesdSerLaneCfg, 0, sizeof(adrv904x_CpuCmd_SetJesdSerLaneCfg_t)); + ADI_LIBRARY_MEMSET(&setJesdSerLaneCfgResp, 0, sizeof(adrv904x_CpuCmd_SetJesdSerLaneCfgResp_t)); + + if (laneNumber > 7U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, laneNumber, "Invalid lane provided."); + goto cleanup; + } + + /* Get the CPU that is responsible for the requested lane. TODO: Using channel mapping for now */ + chanSel = 1U << (uint32_t)laneNumber; + recoveryAction = adrv904x_CpuChannelMappingGet(device, (adi_adrv904x_Channels_e)(chanSel), ADRV904X_CPU_OBJID_SYSTEM_END, &cpuType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, laneNumber, "Invalid lane provided"); + goto cleanup; + } + + /* Prepare the command payload */ + setJesdSerLaneCfg.lane = (uint8_t)laneNumber; + setJesdSerLaneCfg.outputDriveSwing = (uint8_t)serLaneCfg->outputDriveSwing; + setJesdSerLaneCfg.preEmphasis = (uint8_t)serLaneCfg->preEmphasis; + setJesdSerLaneCfg.postEmphasis = (uint8_t)serLaneCfg->postEmphasis; + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + cpuType, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_JESD_SER_LANE_SET_CFG, + (void*)&setJesdSerLaneCfg, + sizeof(setJesdSerLaneCfg), + (void*)&setJesdSerLaneCfgResp, + sizeof(setJesdSerLaneCfgResp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(setJesdSerLaneCfgResp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_FramerTestDataInjectError(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSelect, + const uint8_t laneMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + adrv904x_BfJtxLinkChanAddr_e framerBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JTX_LINK_0_; + uint8_t ballLane = 0U; + uint8_t invert = 0U; + uint8_t pnInvertBit = 0U; + uint8_t dieLaneId = 0U; + uint8_t framerOutForLane = 0U; + + static const uint8_t framerLaneLamTbl[ADI_ADRV904X_MAX_SERIALIZER_LANES] = { 1u, /* [0] SEROUT A */ + 3u, /* [1] SEROUT B */ + 5u, /* [2] SEROUT C */ + 7u, /* [3] SEROUT D */ + 0u, /* [4] SEROUT E */ + 2u, /* [5] SEROUT F */ + 4u, /* [6] SEROUT G */ + 6u /* [7] SEROUT H */ + }; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Get the base address of the selected framer */ + recoveryAction = adrv904x_FramerBitfieldAddressGet(device, framerSelect, &framerBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get base address for the selected framer"); + goto cleanup; + } + + for (ballLane = 0U; ballLane < ADI_ADRV904X_MAX_SERIALIZER_LANES ; ballLane++) + { + invert = ((laneMask >> ballLane) & 0x01U); + + if (invert == 1) + { + dieLaneId = framerLaneLamTbl[ballLane]; + + /* PN Invert occurs at framer output before lane crossbar */ + recoveryAction = adrv904x_JtxLink_JtxLaneSel_BfGet(device, + NULL, + framerBaseAddr, + dieLaneId, + &framerOutForLane); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get lane select for the selected framer"); + goto cleanup; + } + + if (framerOutForLane < ADI_ADRV904X_MAX_SERIALIZER_LANES) + { + /* Read current PN invert setting and set it back at end*/ + recoveryAction = adrv904x_JtxLink_JtxLaneInv_BfGet(device, + NULL, + framerBaseAddr, + framerOutForLane, + &pnInvertBit); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get pn invert bit for the selected framer"); + goto cleanup; + } + + recoveryAction = adrv904x_JtxLink_JtxLaneInv_BfSet(device, + NULL, + framerBaseAddr, + framerOutForLane, + ((~pnInvertBit) & 0x01U)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to set pn invert bit for the selected framer"); + goto cleanup; + } + + recoveryAction = adrv904x_JtxLink_JtxLaneInv_BfSet(device, + NULL, + framerBaseAddr, + framerOutForLane, + pnInvertBit); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to set pn invert bit for the selected framer"); + goto cleanup; + } + + } + else + { + /* Lane disabled - do not invert */ + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +/* Open 'filePath' for logging serdes cal status. + * + * Create the file if required. Ensure the header information is written to start of the file. + * + * On success return a FILE* to the opened file; On failure return NULL. + */ +static FILE* adrv904x_openSerdesCalStatusLogFile(const adi_adrv904x_GenericStrBuf_t* const filePath) +{ + FILE* filePtr = NULL; + long filePos = 0; + +#ifdef __GNUC__ + filePtr = ADI_LIBRARY_FOPEN((const char *)filePath->c_str, "a"); +#else + if (ADI_LIBRARY_FOPEN_S(&filePtr, (const char*)filePath->c_str, "a") != 0) +#endif + + if (filePtr == NULL) + { + return NULL; + } + + filePos = ADI_LIBRARY_FTELL(filePtr); + + if (filePos == 0) + { + /* The file was created by fopen or was empty when opened; Write the header lines. */ + ADI_LIBRARY_FPRINTF(filePtr, "Per-lane Serdes initCal (ic) and trackingCal (tc) status\n"); + ADI_LIBRARY_FPRINTF(filePtr, + "APIver: %d.%d.%d.%d\n", + ADI_ADRV904X_CURRENT_MAJOR_VERSION, + ADI_ADRV904X_CURRENT_MINOR_VERSION, + ADI_ADRV904X_CURRENT_MAINTENANCE_VERSION, + ADI_ADRV904X_CURRENT_BUILD_VERSION); + ADI_LIBRARY_FPRINTF(filePtr, + "laneId,\"ic\",msg,temperature,lpfIndex,ctleIndex,numEyes,bsum,bsum_dc,spoLeft,spoRight,eom," + "eomMax,pd,innerUp,innerDown,outerUp,outerDown,b[]\n"); + ADI_LIBRARY_FPRINTF(filePtr, + "laneId,\"tc\",msg,temperature,pd[],dllPeakPd[],dllPeakPdDelta[],innerUp,innerDown,outerUp,outerDown," + "b[],ps[],yVector[]\n"); + } + + if (ferror(filePtr) != 0) + { + /* Open worked, write failed; Close file and return NULL. */ + ADI_LIBRARY_FCLOSE(filePtr); + return NULL; + } + + /* Success */ + return filePtr; +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SerdesInitCalStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GenericStrBuf_t* const filePath, + const uint8_t laneNumber, + const adi_adrv904x_GenericStrBuf_t* const msg, + adi_adrv904x_SerdesInitCalStatus_t* const calStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adi_adrv904x_CpuType_e cpuType = ADI_ADRV904X_CPU_TYPE_UNKNOWN; + adrv904x_CpuCmd_SerdesCalStatusGet_t cpuCmd; + adrv904x_SerdesInitCalStatusCmdResp_t cmdResp; + FILE* filePtr = NULL; + uint32_t i = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, calStatus, cleanup); + /* filePath and msg may be NULL */ + + ADI_LIBRARY_MEMSET(&cpuCmd, 0, sizeof(cpuCmd)); + ADI_LIBRARY_MEMSET(&cmdResp, 0, sizeof(cmdResp)); + + if (laneNumber >= ADRV904X_JESD_MAX_DESERIALIZER_LANES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, ADI_ADRV904X_ERR_ACT_CHECK_PARAM, laneNumber, "Invalid laneNumber value"); + goto cleanup; + } + + /* Get the CPU that is responsible for the requested lane. */ + recoveryAction = adrv904x_CpuChannelMappingGet(device, (adi_adrv904x_Channels_e)(1U << laneNumber), ADRV904X_CPU_OBJID_IC_SERDES, &cpuType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, laneNumber, "Lane to CPU lookup failed"); + goto cleanup; + } + + /* Prepare the command payload */ + cpuCmd.lane = laneNumber; + CTOH_STRUCT(adrv904x_CpuCmd_SerdesCalStatusGet, cpuCmd); + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend(device, + cpuType, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_GET_SERDES_FG_METRICS, + (void*)&cpuCmd, + sizeof(cpuCmd), + (void*)&cmdResp, + sizeof(cmdResp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to call CPU cmd SERDES_TEST_GET_FG_METRICS"); + goto cleanup; + } + + CTOH_STRUCT(cmdResp, adrv904x_SerdesInitCalStatusCmdResp); + + if (cmdStatus != ADRV904X_CPU_CMD_STATUS_NO_ERROR) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + ADI_ERROR_REPORT(&device->common, + ADI_COMMON_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + cmdResp.cpuErrorCode, + "CPU cmd SERDES_TEST_GET_FG_METRICS failed"); + goto cleanup; + } + + *calStatus = cmdResp.details; + + if (filePath == NULL || filePath->c_str[0] == '\0') + { + /* No log file has been supplied; We're done. */ + goto cleanup; + } + + /* Log file supplied; Write data to it. */ + filePtr = adrv904x_openSerdesCalStatusLogFile(filePath); + + if (filePtr == NULL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, filePath, "Unable to open serdes init cal status log file"); + goto cleanup; + } + + /* File is open and header line, if required, has been written; Write data line.*/ + ADI_LIBRARY_FPRINTF(filePtr, + "%u,ic,%s,%d,%u,%u,%u,%u,%u,%u,%u,%u,%u,%d,%d,%d,%d,%d,[", + laneNumber, + msg ? (const char*) msg->c_str : "", + calStatus->temperature, + calStatus->lpfIndex, + calStatus->ctleIndex, + calStatus->numEyes, + calStatus->bsum, + calStatus->bsum_dc, + calStatus->spoLeft, + calStatus->spoRight, + calStatus->eom, + calStatus->eomMax, + calStatus->pd, + calStatus->innerUp, + calStatus->innerDown, + calStatus->outerUp, + calStatus->outerDown); + + for (i = 0U; i < NELEMS(calStatus->b); i++) + { + ADI_LIBRARY_FPRINTF(filePtr, "%d ", calStatus->b[i]); + } + ADI_LIBRARY_FPRINTF(filePtr, "]\n"); + ADI_LIBRARY_FFLUSH(filePtr); + + if (ADI_LIBRARY_FERROR(filePtr) != 0) + { + /* Some part of write to file failed. */ + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_FEATURE; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, filePath, "Failed to write to serdes init cal status log file"); + goto cleanup; + } + +cleanup: + if (filePtr != NULL) + { + ADI_LIBRARY_FCLOSE(filePtr); + } + + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SerdesTrackingCalStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GenericStrBuf_t* const filePath, + const uint8_t laneNumber, + const adi_adrv904x_GenericStrBuf_t* const msg, + adi_adrv904x_SerdesTrackingCalStatus_t* const calStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adi_adrv904x_CpuType_e cpuType = ADI_ADRV904X_CPU_TYPE_UNKNOWN; + adrv904x_CpuCmd_SerdesCalStatusGet_t cpuCmd; + adrv904x_SerdesTrackingCalStatusCmdResp_t cmdResp; + FILE* filePtr = NULL; + uint32_t i = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, calStatus, cleanup); + /* msg and filePath may be NULL */ + + ADI_LIBRARY_MEMSET(&cpuCmd, 0, sizeof(cpuCmd)); + ADI_LIBRARY_MEMSET(&cmdResp, 0, sizeof(cmdResp)); + + if (laneNumber >= ADRV904X_JESD_MAX_DESERIALIZER_LANES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, ADI_ADRV904X_ERR_ACT_CHECK_PARAM, laneNumber, "Invalid laneNumber value"); + goto cleanup; + } + + /* Get the CPU that is responsible for the requested lane. */ + recoveryAction = adrv904x_CpuChannelMappingGet(device, (adi_adrv904x_Channels_e)(1U << laneNumber), ADRV904X_CPU_OBJID_IC_SERDES, &cpuType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, laneNumber, "Lane to CPU lookup failed"); + goto cleanup; + } + + /* Prepare the command payload */ + cpuCmd.lane = laneNumber; + CTOH_STRUCT(adrv904x_CpuCmd_SerdesCalStatusGet, cpuCmd); + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend(device, + cpuType, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_GET_SERDES_BG_METRICS, //SERDES_TEST_GET_FG_METRICS && SERDES_TEST_GET_BG_METRICS + (void*)&cpuCmd, + sizeof(cpuCmd), + (void*)&cmdResp, + sizeof(cmdResp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to call CPU cmd SERDES_TEST_GET_BG_METRICS"); + goto cleanup; + } + + CTOH_STRUCT(cmdResp, adrv904x_SerdesTrackingCalStatusCmdResp); + + if (cmdStatus != ADRV904X_CPU_CMD_STATUS_NO_ERROR) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + ADI_ERROR_REPORT(&device->common, + ADI_COMMON_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + cmdResp.cpuErrorCode, + "CPU cmd SERDES_TEST_GET_BG_METRICS failed"); + goto cleanup; + } + + *calStatus = cmdResp.details; + + if (filePath == NULL || filePath->c_str[0] == '\0') + { + /* No log file has been supplied; We're done. */ + goto cleanup; + } + + /* Log file supplied; Write data to it. */ + filePtr = adrv904x_openSerdesCalStatusLogFile(filePath); + + if (filePtr == NULL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, filePath, "Unable to open serdes init cal status log file"); + goto cleanup; + } + + /* File is open and header line, if required, has been written; Write data line.*/ + ADI_LIBRARY_FPRINTF(filePtr, + "%u,tc,%s,%d,[", + laneNumber, + msg ? (const char*) msg->c_str : "", + calStatus->temperature); + + for (i = 0U; i < NELEMS(calStatus->pd); i++) + { + ADI_LIBRARY_FPRINTF(filePtr, "%d ", calStatus->pd[i]); + } + ADI_LIBRARY_FPRINTF(filePtr, "],["); + + for (i = 0U; i < NELEMS(calStatus->dllPeakPd); i++) + { + ADI_LIBRARY_FPRINTF(filePtr, "%d ", calStatus->dllPeakPd[i]); + } + ADI_LIBRARY_FPRINTF(filePtr, "],["); + + for (i = 0U; i < NELEMS(calStatus->dllPeakPdDelta); i++) + { + ADI_LIBRARY_FPRINTF(filePtr, "%d ", calStatus->dllPeakPdDelta[i]); + } + ADI_LIBRARY_FPRINTF(filePtr, "],%d,%d,%d,%d,[", calStatus->innerUp, calStatus->innerDown, calStatus->outerUp, calStatus->outerDown); + + for (i = 0U; i < NELEMS(calStatus->b); i++) + { + ADI_LIBRARY_FPRINTF(filePtr, "%d ", calStatus->b[i]); + } + ADI_LIBRARY_FPRINTF(filePtr, "],["); + + for (i = 0U; i < NELEMS(calStatus->ps); i++) + { + ADI_LIBRARY_FPRINTF(filePtr, "%f ", calStatus->ps[i]); + } + ADI_LIBRARY_FPRINTF(filePtr, "],["); + + for (i = 0U; i < NELEMS(calStatus->yVector); i++) + { + ADI_LIBRARY_FPRINTF(filePtr, "%f ", calStatus->yVector[i]); + } + ADI_LIBRARY_FPRINTF(filePtr, "]\n"); + ADI_LIBRARY_FFLUSH(filePtr); + + if (ADI_LIBRARY_FERROR(filePtr) != 0) + { + /* Write to file failed. */ + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_FEATURE; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, filePath, "Failed to write to tracking cal status log file"); + goto cleanup; + } + +cleanup: + if (filePtr != NULL) + { + ADI_LIBRARY_FCLOSE(filePtr); + } + + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CddcModeSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + const adi_adrv904x_CddcMode_e cddcMode) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + uint8_t regValue = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Check framer selection: only Framer 0 and 1 supported */ + if ((framerSel != ADI_ADRV904X_FRAMER_0) && + (framerSel != ADI_ADRV904X_FRAMER_1)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid framer selection"); + goto cleanup; + } + + /* Get framer CDDC mode */ + recoveryAction = adrv904x_JesdCommon_CddcBypassMode_BfGet(device, + NULL, + commonBaseAddr, + ®Value); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting CDDC bypass mode for the selected framer"); + goto cleanup; + } + + if (cddcMode == ADI_ADRV904X_CDDC_BYPASS_MODE) + { + /* Enabled CDDC Bypass Mode for the selected framer */ + regValue |= framerSel; + } + else + { + /* Disabled CDDC Bypass Mode for the selected framer */ + regValue &= ~framerSel; + } + + /* Set CDDC mode */ + recoveryAction = adrv904x_JesdCommon_CddcBypassMode_BfSet(device, + NULL, + commonBaseAddr, + regValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting CDDC bypass mode for the selected framer"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CddcModeGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + adi_adrv904x_CddcMode_e * const cddcMode) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + uint8_t regValue = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cddcMode, cleanup); + + /* Check framer selection */ + if ((framerSel & ~ADI_ADRV904X_ALL_FRAMERS) != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid framer selection"); + goto cleanup; + } + + if (framerSel == ADI_ADRV904X_FRAMER_2) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + *cddcMode = ADI_ADRV904X_CDDC_BYPASS_MODE; + } + else + { + /* Get framer CDDC mode for all framers */ + recoveryAction = adrv904x_JesdCommon_CddcBypassMode_BfGet(device, + NULL, + commonBaseAddr, + ®Value); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting CDDC mode for the selected framer"); + goto cleanup; + } + + if ((regValue & framerSel) != 0) + { + *cddcMode = ADI_ADRV904X_CDDC_BYPASS_MODE; + } + else + { + *cddcMode = ADI_ADRV904X_CDDC_MODE; + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CducModeSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + const adi_adrv904x_CducMode_e cducMode) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + uint8_t regValue = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Check deframer selection */ + if ((deframerSel & ~ADI_ADRV904X_ALL_DEFRAMER) != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid deframer selection"); + goto cleanup; + } + + /* Get deframer CDUC mode */ + recoveryAction = adrv904x_JesdCommon_CducBypassMode_BfGet(device, + NULL, + commonBaseAddr, + ®Value); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting CDUC bypass mode for the selected deframer"); + goto cleanup; + } + + if (cducMode == ADI_ADRV904X_CDUC_BYPASS_MODE) + { + /* Enabled CDUC Bypass Mode for the selected deframer */ + regValue |= deframerSel; + } + else + { + /* Disabled CDUC Bypass Mode for the selected deframer */ + regValue &= ~deframerSel; + } + + /* Set CDUC mode */ + recoveryAction = adrv904x_JesdCommon_CducBypassMode_BfSet(device, + NULL, + commonBaseAddr, + regValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting CDUC bypass mode for the selected deframer"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CducModeGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + adi_adrv904x_CducMode_e * const cducMode) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + uint8_t regValue = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cducMode, cleanup); + + /* Check deframer selection */ + if ((deframerSel & ~ADI_ADRV904X_ALL_DEFRAMER) != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid deframer selection"); + goto cleanup; + } + + /* Get framer CDUC mode for all deframers */ + recoveryAction = adrv904x_JesdCommon_CducBypassMode_BfGet(device, + NULL, + commonBaseAddr, + ®Value); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting CDUC mode for the selected deframer"); + goto cleanup; + } + + if ((regValue & deframerSel) != 0) + { + *cducMode = ADI_ADRV904X_CDUC_BYPASS_MODE; + } + else + { + *cducMode = ADI_ADRV904X_CDUC_MODE; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CddcSampleXBarSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + const adi_adrv904x_RxChannels_e rxChanSel, + const adi_adrv904x_CddcSampleXbarCfg_t * const cddcSampleXbarCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + uint32_t cddcXbarLimit = 0U; + uint32_t index = 0U; + uint8_t regValue = 0U; + uint8_t xbarEntryValue = 0U; + adi_adrv904x_ErrAction_e(*CddcSampleXBarBfSet)(adi_adrv904x_Device_t*, + adi_adrv904x_SpiCache_t* const, + const adrv904x_BfJesdCommonChanAddr_e, + uint8_t, + const uint8_t) = NULL; + adi_adrv904x_ErrAction_e(*CddcSampleXBarConverterBfSet)(adi_adrv904x_Device_t* const, + adi_adrv904x_SpiCache_t* const, + const adrv904x_BfJesdCommonChanAddr_e, + uint8_t, + const uint8_t) = NULL; + adi_adrv904x_ErrAction_e(*CddcSampleXBarConverterBfGet)(adi_adrv904x_Device_t* const, + adi_adrv904x_SpiCache_t* const, + const adrv904x_BfJesdCommonChanAddr_e, + uint8_t, + uint8_t* const) = NULL; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cddcSampleXbarCfg, cleanup); + + /* Verify only one valid RX channel is selected */ + if ((rxChanSel == 0) || /* No RXchannel selected */ + ((rxChanSel & ~ADI_ADRV904X_RX_MASK_ALL) != 0) || /* non RX bits is set */ + ((rxChanSel & (rxChanSel - 1)) != 0)) /* more than 1 bit is set */ + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid RX channel selection"); + goto cleanup; + } + + /* Check framer selection: only Framer 0 and 1 supported and assign sample xbar limit per framer */ + if (framerSel == ADI_ADRV904X_FRAMER_0) + { + cddcXbarLimit = ADI_ADRV904X_MAX_FRM_CARRIER_XBAR_IDX; + CddcSampleXBarConverterBfSet = adrv904x_JesdCommon_JtxCoreConvDisableLink0_BfSet; + CddcSampleXBarConverterBfGet = adrv904x_JesdCommon_JtxCoreConvDisableLink0_BfGet; + + switch ((uint32_t) rxChanSel) + { + case ADI_ADRV904X_RX0: + CddcSampleXBarBfSet = adrv904x_JesdCommon_Rx0ChSampleSelLink0_BfSet; + break; + case ADI_ADRV904X_RX1: + CddcSampleXBarBfSet = adrv904x_JesdCommon_Rx1ChSampleSelLink0_BfSet; + break; + case ADI_ADRV904X_RX2: + CddcSampleXBarBfSet = adrv904x_JesdCommon_Rx2ChSampleSelLink0_BfSet; + break; + case ADI_ADRV904X_RX3: + CddcSampleXBarBfSet = adrv904x_JesdCommon_Rx3ChSampleSelLink0_BfSet; + break; + case ADI_ADRV904X_RX4: + CddcSampleXBarBfSet = adrv904x_JesdCommon_Rx4ChSampleSelLink0_BfSet; + break; + case ADI_ADRV904X_RX5: + CddcSampleXBarBfSet = adrv904x_JesdCommon_Rx5ChSampleSelLink0_BfSet; + break; + case ADI_ADRV904X_RX6: + CddcSampleXBarBfSet = adrv904x_JesdCommon_Rx6ChSampleSelLink0_BfSet; + break; + case ADI_ADRV904X_RX7: + CddcSampleXBarBfSet = adrv904x_JesdCommon_Rx7ChSampleSelLink0_BfSet; + break; + } + } + else if (framerSel == ADI_ADRV904X_FRAMER_1) + { + cddcXbarLimit = ADI_ADRV904X_MAX_FRM_CARRIER_XBAR_IDX / 2U; /* framer 1 has half of framer 0 */ + CddcSampleXBarConverterBfSet = adrv904x_JesdCommon_JtxCoreConvDisableLink1_BfSet; + CddcSampleXBarConverterBfGet = adrv904x_JesdCommon_JtxCoreConvDisableLink1_BfGet; + + switch ((int32_t) rxChanSel) + { + case ADI_ADRV904X_RX0: + CddcSampleXBarBfSet = adrv904x_JesdCommon_Rx0ChSampleSelLink1_BfSet; + break; + case ADI_ADRV904X_RX1: + CddcSampleXBarBfSet = adrv904x_JesdCommon_Rx1ChSampleSelLink1_BfSet; + break; + case ADI_ADRV904X_RX2: + CddcSampleXBarBfSet = adrv904x_JesdCommon_Rx2ChSampleSelLink1_BfSet; + break; + case ADI_ADRV904X_RX3: + CddcSampleXBarBfSet = adrv904x_JesdCommon_Rx3ChSampleSelLink1_BfSet; + break; + case ADI_ADRV904X_RX4: + CddcSampleXBarBfSet = adrv904x_JesdCommon_Rx4ChSampleSelLink1_BfSet; + break; + case ADI_ADRV904X_RX5: + CddcSampleXBarBfSet = adrv904x_JesdCommon_Rx5ChSampleSelLink1_BfSet; + break; + case ADI_ADRV904X_RX6: + CddcSampleXBarBfSet = adrv904x_JesdCommon_Rx6ChSampleSelLink1_BfSet; + break; + case ADI_ADRV904X_RX7: + CddcSampleXBarBfSet = adrv904x_JesdCommon_Rx7ChSampleSelLink1_BfSet; + break; + } + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid framer selection"); + goto cleanup; + } + + /* Verifying and setting CDDC Sample XBar for all entries */ + for (index = 0U; index < cddcXbarLimit; index++) + { + /* Read Xbar converter entry status */ + recoveryAction = CddcSampleXBarConverterBfGet(device, + NULL, + commonBaseAddr, + index, + &xbarEntryValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting CDDC Sample XBar Converter index."); + goto cleanup; + } + + /* Verify sample xbar value before write */ + if (cddcSampleXbarCfg->cddcSampleXbar[index] == ADI_ADRV904X_XBAR_ENTRY_DISABLED) + { + /* Set the XBar Converter as disabled */ + regValue = ADI_ADRV904X_XBAR_CONTROL_INDEX_DISABLED; + recoveryAction = CddcSampleXBarConverterBfSet(device, + NULL, + commonBaseAddr, + index, + regValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while disable CDDC Sample XBar Converter index."); + goto cleanup; + } + } + else if (cddcSampleXbarCfg->cddcSampleXbar[index] < ADI_ADRV904X_MAX_SAMPLE_XBAR_INDEX_VALUE) + { + /* Enable the Sample Xbar converter index */ + if (xbarEntryValue == ADI_ADRV904X_XBAR_CONTROL_INDEX_DISABLED) + { + regValue = ADI_ADRV904X_XBAR_CONTROL_INDEX_ENABLED; + recoveryAction = CddcSampleXBarConverterBfSet(device, + NULL, + commonBaseAddr, + index, + regValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting CDDC Sample XBar Converter index."); + goto cleanup; + } + } + + /* Writing CDDC Sample Xbar Index value */ + recoveryAction = CddcSampleXBarBfSet(device, + NULL, + commonBaseAddr, + index, + cddcSampleXbarCfg->cddcSampleXbar[index]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting CDDC Sample XBar selected framer and Rx channel."); + goto cleanup; + } + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid CDDC Sample Xbar configuration value."); + goto cleanup; + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CddcSampleXBarGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + const adi_adrv904x_RxChannels_e rxChanSel, + adi_adrv904x_CddcSampleXbarCfg_t * const cddcSampleXbarCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + uint32_t cddcXbarLimit = 0U; + uint32_t index = 0U; + uint8_t regValue = 0U; + adi_adrv904x_ErrAction_e(*CddcSampleXBarBfGet)(adi_adrv904x_Device_t*, + adi_adrv904x_SpiCache_t* const, + const adrv904x_BfJesdCommonChanAddr_e, + uint8_t, + uint8_t* const) = NULL; + + adi_adrv904x_ErrAction_e(*CddcSampleXBarConverterBfGet)(adi_adrv904x_Device_t* const, + adi_adrv904x_SpiCache_t* const, + const adrv904x_BfJesdCommonChanAddr_e, + uint8_t, + uint8_t* const) = NULL; + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cddcSampleXbarCfg, cleanup); + + /* Verify only one valid RX channel is selected */ + if ((rxChanSel == 0) || /* No RXchannel selected */ + ((rxChanSel & ~ADI_ADRV904X_RX_MASK_ALL) != 0) || /* non RX bits is set */ + ((rxChanSel & (rxChanSel - 1)) != 0)) /* more than 1 bit is set */ + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid RX channel selection"); + goto cleanup; + } + + /* Check framer selection: only Framer 0 and 1 supported and assign values */ + if (framerSel == ADI_ADRV904X_FRAMER_0) + { + cddcXbarLimit = ADI_ADRV904X_MAX_FRM_CARRIER_XBAR_IDX; + CddcSampleXBarConverterBfGet = adrv904x_JesdCommon_JtxCoreConvDisableLink0_BfGet; + + switch ((uint32_t) rxChanSel) + { + case ADI_ADRV904X_RX0: + CddcSampleXBarBfGet = adrv904x_JesdCommon_Rx0ChSampleSelLink0_BfGet; + break; + case ADI_ADRV904X_RX1: + CddcSampleXBarBfGet = adrv904x_JesdCommon_Rx1ChSampleSelLink0_BfGet; + break; + case ADI_ADRV904X_RX2: + CddcSampleXBarBfGet = adrv904x_JesdCommon_Rx2ChSampleSelLink0_BfGet; + break; + case ADI_ADRV904X_RX3: + CddcSampleXBarBfGet = adrv904x_JesdCommon_Rx3ChSampleSelLink0_BfGet; + break; + case ADI_ADRV904X_RX4: + CddcSampleXBarBfGet = adrv904x_JesdCommon_Rx4ChSampleSelLink0_BfGet; + break; + case ADI_ADRV904X_RX5: + CddcSampleXBarBfGet = adrv904x_JesdCommon_Rx5ChSampleSelLink0_BfGet; + break; + case ADI_ADRV904X_RX6: + CddcSampleXBarBfGet = adrv904x_JesdCommon_Rx6ChSampleSelLink0_BfGet; + break; + case ADI_ADRV904X_RX7: + CddcSampleXBarBfGet = adrv904x_JesdCommon_Rx7ChSampleSelLink0_BfGet; + break; + } + } + else if (framerSel == ADI_ADRV904X_FRAMER_1) + { + cddcXbarLimit = ADI_ADRV904X_MAX_FRM_CARRIER_XBAR_IDX / 2U; /* framer 1 has half of framer 0 */ + CddcSampleXBarConverterBfGet = adrv904x_JesdCommon_JtxCoreConvDisableLink1_BfGet; + + switch ((int32_t) rxChanSel) + { + case ADI_ADRV904X_RX0: + CddcSampleXBarBfGet = adrv904x_JesdCommon_Rx0ChSampleSelLink1_BfGet; + break; + case ADI_ADRV904X_RX1: + CddcSampleXBarBfGet = adrv904x_JesdCommon_Rx1ChSampleSelLink1_BfGet; + break; + case ADI_ADRV904X_RX2: + CddcSampleXBarBfGet = adrv904x_JesdCommon_Rx2ChSampleSelLink1_BfGet; + break; + case ADI_ADRV904X_RX3: + CddcSampleXBarBfGet = adrv904x_JesdCommon_Rx3ChSampleSelLink1_BfGet; + break; + case ADI_ADRV904X_RX4: + CddcSampleXBarBfGet = adrv904x_JesdCommon_Rx4ChSampleSelLink1_BfGet; + break; + case ADI_ADRV904X_RX5: + CddcSampleXBarBfGet = adrv904x_JesdCommon_Rx5ChSampleSelLink1_BfGet; + break; + case ADI_ADRV904X_RX6: + CddcSampleXBarBfGet = adrv904x_JesdCommon_Rx6ChSampleSelLink1_BfGet; + break; + case ADI_ADRV904X_RX7: + CddcSampleXBarBfGet = adrv904x_JesdCommon_Rx7ChSampleSelLink1_BfGet; + break; + } + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid framer selection"); + goto cleanup; + } + + /* Getting CDDC Sample XBar for all entries */ + for (index = 0U; index < cddcXbarLimit; index++) + { + /* Get the CDDC Sample XBar Converter status first */ + recoveryAction = CddcSampleXBarConverterBfGet(device, + NULL, + commonBaseAddr, + index, + ®Value); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting CDDC Sample XBar Converter index."); + goto cleanup; + } + + if (regValue == ADI_ADRV904X_XBAR_CONTROL_INDEX_DISABLED) + { + /* The CDDC Sample XBar Converter status is disabled so assign disable value to the index. */ + cddcSampleXbarCfg->cddcSampleXbar[index] = ADI_ADRV904X_XBAR_ENTRY_DISABLED; + } + else + { + /* The CDDC Sample XBar Converter status is enabled so read value from register */ + recoveryAction = CddcSampleXBarBfGet(device, + NULL, + commonBaseAddr, + index, + ®Value); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting CDDC Sample XBar selected framer and Rx channel."); + goto cleanup; + } + + cddcSampleXbarCfg->cddcSampleXbar[index] = regValue; + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CducSampleXBarSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + const adi_adrv904x_TxChannels_e txChanSel, + const adi_adrv904x_CducSampleXbarCfg_t * const cducSampleXbarCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + uint32_t cducXbarLimit = 0U; + uint32_t index = 0U; + uint8_t regValue = 0U; + uint8_t xbarEntryValue = 0U; + + adi_adrv904x_ErrAction_e(*CducSampleXBarBfSet)(adi_adrv904x_Device_t*, + adi_adrv904x_SpiCache_t* const, + const adrv904x_BfJesdCommonChanAddr_e, + uint8_t, + const uint8_t) = NULL; + adi_adrv904x_ErrAction_e(*CducSampleXBarConverterBfSet)(adi_adrv904x_Device_t* const, + adi_adrv904x_SpiCache_t* const, + const adrv904x_BfJesdCommonChanAddr_e, + uint8_t, + const uint8_t) = NULL; + adi_adrv904x_ErrAction_e(*CducSampleXBarConverterBfGet)(adi_adrv904x_Device_t* const, + adi_adrv904x_SpiCache_t* const, + const adrv904x_BfJesdCommonChanAddr_e, + uint8_t, + uint8_t* const) = NULL; + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cducSampleXbarCfg, cleanup); + + /* Verify only one valid TX channel is selected */ + if ((txChanSel == 0) || /* No TXchannel selected */ + ((txChanSel & ~ADI_ADRV904X_TXALL) != 0) || /* non TX bits is set */ + ((txChanSel & (txChanSel - 1)) != 0)) /* more than 1 bit is set */ + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid TX channel selection"); + goto cleanup; + } + + /* Check deframer selection and assign sample xbar limit per deframer */ + if (deframerSel == ADI_ADRV904X_DEFRAMER_0) + { + cducXbarLimit = ADI_ADRV904X_MAX_DFRM_CARRIER_XBAR_IDX; + CducSampleXBarConverterBfSet = adrv904x_JesdCommon_JrxCoreConvDisableLink0_BfSet; + CducSampleXBarConverterBfGet = adrv904x_JesdCommon_JrxCoreConvDisableLink0_BfGet; + + switch ((uint32_t) txChanSel) + { + case ADI_ADRV904X_TX0: + CducSampleXBarBfSet = adrv904x_JesdCommon_Tx0ChSampleSelLink0_BfSet; + break; + case ADI_ADRV904X_TX1: + CducSampleXBarBfSet = adrv904x_JesdCommon_Tx1ChSampleSelLink0_BfSet; + break; + case ADI_ADRV904X_TX2: + CducSampleXBarBfSet = adrv904x_JesdCommon_Tx2ChSampleSelLink0_BfSet; + break; + case ADI_ADRV904X_TX3: + CducSampleXBarBfSet = adrv904x_JesdCommon_Tx3ChSampleSelLink0_BfSet; + break; + case ADI_ADRV904X_TX4: + CducSampleXBarBfSet = adrv904x_JesdCommon_Tx4ChSampleSelLink0_BfSet; + break; + case ADI_ADRV904X_TX5: + CducSampleXBarBfSet = adrv904x_JesdCommon_Tx5ChSampleSelLink0_BfSet; + break; + case ADI_ADRV904X_TX6: + CducSampleXBarBfSet = adrv904x_JesdCommon_Tx6ChSampleSelLink0_BfSet; + break; + case ADI_ADRV904X_TX7: + CducSampleXBarBfSet = adrv904x_JesdCommon_Tx7ChSampleSelLink0_BfSet; + break; + } + } + else if (deframerSel == ADI_ADRV904X_DEFRAMER_1) + { + cducXbarLimit = ADI_ADRV904X_MAX_DFRM_CARRIER_XBAR_IDX / 2U; /* deframer 1 has half of deframer 0 */ + CducSampleXBarConverterBfSet = adrv904x_JesdCommon_JrxCoreConvDisableLink1_BfSet; + CducSampleXBarConverterBfGet = adrv904x_JesdCommon_JrxCoreConvDisableLink1_BfGet; + + switch ((int32_t) txChanSel) + { + case ADI_ADRV904X_TX0: + CducSampleXBarBfSet = adrv904x_JesdCommon_Tx0ChSampleSelLink1_BfSet; + break; + case ADI_ADRV904X_TX1: + CducSampleXBarBfSet = adrv904x_JesdCommon_Tx1ChSampleSelLink1_BfSet; + break; + case ADI_ADRV904X_TX2: + CducSampleXBarBfSet = adrv904x_JesdCommon_Tx2ChSampleSelLink1_BfSet; + break; + case ADI_ADRV904X_TX3: + CducSampleXBarBfSet = adrv904x_JesdCommon_Tx3ChSampleSelLink1_BfSet; + break; + case ADI_ADRV904X_TX4: + CducSampleXBarBfSet = adrv904x_JesdCommon_Tx4ChSampleSelLink1_BfSet; + break; + case ADI_ADRV904X_TX5: + CducSampleXBarBfSet = adrv904x_JesdCommon_Tx5ChSampleSelLink1_BfSet; + break; + case ADI_ADRV904X_TX6: + CducSampleXBarBfSet = adrv904x_JesdCommon_Tx6ChSampleSelLink1_BfSet; + break; + case ADI_ADRV904X_TX7: + CducSampleXBarBfSet = adrv904x_JesdCommon_Tx7ChSampleSelLink1_BfSet; + break; + } + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid deframer selection"); + goto cleanup; + } + + /* Verifying and setting CDUC Sample XBar for all entries */ + for (index = 0U; index < cducXbarLimit; index++) + { + /* Read Xbar converter index status */ + recoveryAction = CducSampleXBarConverterBfGet(device, + NULL, + commonBaseAddr, + index, + &xbarEntryValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting CDUC Sample XBar Converter index."); + goto cleanup; + } + + /* Verify sample xbar value before write */ + if (cducSampleXbarCfg->cducSampleXbar[index] == ADI_ADRV904X_XBAR_ENTRY_DISABLED) + { + /* Set the XBar Converter as disabled */ + regValue = ADI_ADRV904X_XBAR_CONTROL_INDEX_DISABLED; + recoveryAction = CducSampleXBarConverterBfSet(device, + NULL, + commonBaseAddr, + index, + regValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while disable CDUC Sample XBar Converter index."); + goto cleanup; + } + } + else if (cducSampleXbarCfg->cducSampleXbar[index] < ADI_ADRV904X_MAX_SAMPLE_XBAR_INDEX_VALUE) + { + /* Enable the Sample Xbar converter index if it is disabled */ + if (xbarEntryValue == ADI_ADRV904X_XBAR_CONTROL_INDEX_DISABLED) + { + regValue = ADI_ADRV904X_XBAR_CONTROL_INDEX_ENABLED; + recoveryAction = CducSampleXBarConverterBfSet(device, + NULL, + commonBaseAddr, + index, + regValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting CDUC Sample XBar Converter index."); + goto cleanup; + } + } + + /* Writing CDUC Sample Xbar Index value */ + recoveryAction = CducSampleXBarBfSet(device, + NULL, + commonBaseAddr, + index, + cducSampleXbarCfg->cducSampleXbar[index]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting CDUC Sample XBar selected deframer and Tx channel."); + goto cleanup; + } + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid CDUC Sample Xbar configuration value."); + goto cleanup; + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CducSampleXBarGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + const adi_adrv904x_TxChannels_e txChanSel, + adi_adrv904x_CducSampleXbarCfg_t * const cducSampleXbarCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + uint32_t cducXbarLimit = 0U; + uint32_t index = 0U; + uint8_t regValue = 0U; + adi_adrv904x_ErrAction_e(*CducSampleXBarBfGet)(adi_adrv904x_Device_t*, + adi_adrv904x_SpiCache_t* const, + const adrv904x_BfJesdCommonChanAddr_e, + uint8_t, + uint8_t* const) = NULL; + adi_adrv904x_ErrAction_e(*CducSampleXBarConverterBfGet)(adi_adrv904x_Device_t* const, + adi_adrv904x_SpiCache_t* const, + const adrv904x_BfJesdCommonChanAddr_e, + uint8_t, + uint8_t* const) = NULL; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cducSampleXbarCfg, cleanup); + + /* Verify only one valid TX channel is selected */ + if ((txChanSel == 0) || /* No TXchannel selected */ + ((txChanSel & ~ADI_ADRV904X_TXALL) != 0) || /* non TX bits is set */ + ((txChanSel & (txChanSel - 1)) != 0)) /* more than 1 bit is set */ + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid TX channel selection"); + goto cleanup; + } + + /* Check deframer selection and assign values */ + if (deframerSel == ADI_ADRV904X_DEFRAMER_0) + { + cducXbarLimit = ADI_ADRV904X_MAX_DFRM_CARRIER_XBAR_IDX; + CducSampleXBarConverterBfGet = adrv904x_JesdCommon_JrxCoreConvDisableLink0_BfGet; + + switch ((uint32_t) txChanSel) + { + case ADI_ADRV904X_TX0: + CducSampleXBarBfGet = adrv904x_JesdCommon_Tx0ChSampleSelLink0_BfGet; + break; + case ADI_ADRV904X_TX1: + CducSampleXBarBfGet = adrv904x_JesdCommon_Tx1ChSampleSelLink0_BfGet; + break; + case ADI_ADRV904X_TX2: + CducSampleXBarBfGet = adrv904x_JesdCommon_Tx2ChSampleSelLink0_BfGet; + break; + case ADI_ADRV904X_TX3: + CducSampleXBarBfGet = adrv904x_JesdCommon_Tx3ChSampleSelLink0_BfGet; + break; + case ADI_ADRV904X_TX4: + CducSampleXBarBfGet = adrv904x_JesdCommon_Tx4ChSampleSelLink0_BfGet; + break; + case ADI_ADRV904X_TX5: + CducSampleXBarBfGet = adrv904x_JesdCommon_Tx5ChSampleSelLink0_BfGet; + break; + case ADI_ADRV904X_TX6: + CducSampleXBarBfGet = adrv904x_JesdCommon_Tx6ChSampleSelLink0_BfGet; + break; + case ADI_ADRV904X_TX7: + CducSampleXBarBfGet = adrv904x_JesdCommon_Tx7ChSampleSelLink0_BfGet; + break; + } + } + else if (deframerSel == ADI_ADRV904X_DEFRAMER_1) + { + cducXbarLimit = ADI_ADRV904X_MAX_DFRM_CARRIER_XBAR_IDX / 2U; /* deframer 1 has half of deframer 0 */ + CducSampleXBarConverterBfGet = adrv904x_JesdCommon_JrxCoreConvDisableLink1_BfGet; + + switch ((int32_t) txChanSel) + { + case ADI_ADRV904X_TX0: + CducSampleXBarBfGet = adrv904x_JesdCommon_Tx0ChSampleSelLink1_BfGet; + break; + case ADI_ADRV904X_TX1: + CducSampleXBarBfGet = adrv904x_JesdCommon_Tx1ChSampleSelLink1_BfGet; + break; + case ADI_ADRV904X_TX2: + CducSampleXBarBfGet = adrv904x_JesdCommon_Tx2ChSampleSelLink1_BfGet; + break; + case ADI_ADRV904X_TX3: + CducSampleXBarBfGet = adrv904x_JesdCommon_Tx3ChSampleSelLink1_BfGet; + break; + case ADI_ADRV904X_TX4: + CducSampleXBarBfGet = adrv904x_JesdCommon_Tx4ChSampleSelLink1_BfGet; + break; + case ADI_ADRV904X_TX5: + CducSampleXBarBfGet = adrv904x_JesdCommon_Tx5ChSampleSelLink1_BfGet; + break; + case ADI_ADRV904X_TX6: + CducSampleXBarBfGet = adrv904x_JesdCommon_Tx6ChSampleSelLink1_BfGet; + break; + case ADI_ADRV904X_TX7: + CducSampleXBarBfGet = adrv904x_JesdCommon_Tx7ChSampleSelLink1_BfGet; + break; + } + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid deframer selection"); + goto cleanup; + } + + /* Getting CDUC Sample XBar for all entries */ + for (index = 0U; index < cducXbarLimit; index++) + { + /* Get the CDUC Sample XBar Converter status first */ + recoveryAction = CducSampleXBarConverterBfGet(device, + NULL, + commonBaseAddr, + index, + ®Value); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting CDUC Sample XBar Converter index."); + goto cleanup; + } + + if (regValue == ADI_ADRV904X_XBAR_CONTROL_INDEX_DISABLED) + { + /* The CDUC Sample XBar Converter status is disabled so assign disable value to the index. */ + cducSampleXbarCfg->cducSampleXbar[index] = ADI_ADRV904X_XBAR_ENTRY_DISABLED; + } + else + { + /* The CDUC Sample XBar Converter status is enabled so read value from register */ + recoveryAction = CducSampleXBarBfGet(device, + NULL, + commonBaseAddr, + index, + ®Value); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting CDUC Sample XBar selected deframer and Tx channel."); + goto cleanup; + } + + cducSampleXbarCfg->cducSampleXbar[index] = regValue; + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CddcRxChanXBarSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + const adi_adrv904x_CddcChannelXbarCfg_t * const cddcChannelXbarCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + uint32_t cddcXbarLimit = 0U; + uint32_t index = 0U; + uint8_t channelXbarEntry = 0U; + adi_adrv904x_ErrAction_e(*CddcJtxChannelXBarBfSet)(adi_adrv904x_Device_t*, + adi_adrv904x_SpiCache_t* const, + const adrv904x_BfJesdCommonChanAddr_e, + uint8_t, + const uint8_t) = NULL; + + adi_adrv904x_ErrAction_e(*CddcXBarConverterBfSet)(adi_adrv904x_Device_t* const, + adi_adrv904x_SpiCache_t* const, + const adrv904x_BfJesdCommonChanAddr_e, + uint8_t, + const uint8_t) = NULL; + + adi_adrv904x_ErrAction_e(*CddcXBarConverterBfGet)(adi_adrv904x_Device_t* const, + adi_adrv904x_SpiCache_t* const, + const adrv904x_BfJesdCommonChanAddr_e, + uint8_t, + uint8_t* const) = NULL; + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cddcChannelXbarCfg, cleanup); + + /* Check framer selection: only Framer 0 and 1 supported and assign channel xbar limit per framer */ + if (framerSel == ADI_ADRV904X_FRAMER_0) + { + cddcXbarLimit = ADI_ADRV904X_MAX_FRM_CARRIER_XBAR_IDX; + CddcJtxChannelXBarBfSet = adrv904x_JesdCommon_JtxChannelSelLink0_BfSet; + CddcXBarConverterBfGet = adrv904x_JesdCommon_JtxCoreConvDisableLink0_BfGet; + CddcXBarConverterBfSet = adrv904x_JesdCommon_JtxCoreConvDisableLink0_BfSet; + } + else if (framerSel == ADI_ADRV904X_FRAMER_1) + { + cddcXbarLimit = ADI_ADRV904X_MAX_FRM_CARRIER_XBAR_IDX / 2U; /* framer 1 has half of framer 0 */ + CddcJtxChannelXBarBfSet = adrv904x_JesdCommon_JtxChannelSelLink1_BfSet; + CddcXBarConverterBfGet = adrv904x_JesdCommon_JtxCoreConvDisableLink1_BfGet; + CddcXBarConverterBfSet = adrv904x_JesdCommon_JtxCoreConvDisableLink1_BfSet; + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid framer selection"); + goto cleanup; + } + + /* Verifying and setting CDDC RX Channel XBar for all entries */ + for (index = 0U; index < cddcXbarLimit; index++) + { + /* Read entry status */ + recoveryAction = CddcXBarConverterBfGet(device, + NULL, + commonBaseAddr, + index, + &channelXbarEntry); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting CDDC XBar Converter index."); + goto cleanup; + } + + /* Verify channel xbar value before write */ + if (cddcChannelXbarCfg->cddcChannelXbar[index] == ADI_ADRV904X_XBAR_ENTRY_DISABLED) + { + /* The value indicates the entry is to disable so disable the entry */ + recoveryAction = CddcXBarConverterBfSet(device, + NULL, + commonBaseAddr, + index, + ADI_ADRV904X_XBAR_CONTROL_INDEX_DISABLED); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting CDDC XBar Converter index."); + goto cleanup; + } + } + else if (cddcChannelXbarCfg->cddcChannelXbar[index] > ADI_ADRV904X_MAX_CHANNEL_XBAR_VALUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid RX CDDC Channel Crossbar value."); + goto cleanup; + } + else /* Valid value */ + { + /* Enable the entry if it is disable. */ + if (channelXbarEntry == ADI_ADRV904X_XBAR_CONTROL_INDEX_DISABLED) + { + recoveryAction = CddcXBarConverterBfSet(device, + NULL, + commonBaseAddr, + index, + ADI_ADRV904X_XBAR_CONTROL_INDEX_ENABLED); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting CDDC XBar Converter index."); + goto cleanup; + } + } + + /* Write value */ + recoveryAction = CddcJtxChannelXBarBfSet(device, + NULL, + commonBaseAddr, + index, + cddcChannelXbarCfg->cddcChannelXbar[index]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting CDDC Channel XBar selected framer."); + goto cleanup; + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CddcRxChanXBarGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + adi_adrv904x_CddcChannelXbarCfg_t * const cddcChannelXbarCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + uint32_t cddcXbarLimit = 0U; + uint32_t index = 0U; + uint8_t regValue = 0U; + adi_adrv904x_ErrAction_e(*CddcJtxChannelXBarBfGet)(adi_adrv904x_Device_t*, + adi_adrv904x_SpiCache_t* const, + const adrv904x_BfJesdCommonChanAddr_e, + uint8_t, + uint8_t* const) = NULL; + + adi_adrv904x_ErrAction_e(*CddcXBarConverterBfGet)(adi_adrv904x_Device_t* const, + adi_adrv904x_SpiCache_t* const, + const adrv904x_BfJesdCommonChanAddr_e, + uint8_t, + uint8_t* const) = NULL; + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cddcChannelXbarCfg, cleanup); + + /* Check framer selection: only Framer 0 and 1 supported and assign values */ + if (framerSel == ADI_ADRV904X_FRAMER_0) + { + cddcXbarLimit = ADI_ADRV904X_MAX_FRM_CARRIER_XBAR_IDX; + CddcXBarConverterBfGet = adrv904x_JesdCommon_JtxCoreConvDisableLink0_BfGet; + CddcJtxChannelXBarBfGet = adrv904x_JesdCommon_JtxChannelSelLink0_BfGet; + } + else if (framerSel == ADI_ADRV904X_FRAMER_1) + { + cddcXbarLimit = ADI_ADRV904X_MAX_FRM_CARRIER_XBAR_IDX / 2U; /* framer 1 has half of framer 0 */ + CddcXBarConverterBfGet = adrv904x_JesdCommon_JtxCoreConvDisableLink1_BfGet; + CddcJtxChannelXBarBfGet = adrv904x_JesdCommon_JtxChannelSelLink1_BfGet; + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid framer selection"); + goto cleanup; + } + + /* Getting CDDC Sample XBar for all entries */ + for (index = 0U; index < cddcXbarLimit; index++) + { + /* Get the CDDC Sample XBar Converter status first */ + recoveryAction = CddcXBarConverterBfGet(device, + NULL, + commonBaseAddr, + index, + ®Value); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting CDDC Crossbar Converter index."); + goto cleanup; + } + + if (regValue == ADI_ADRV904X_XBAR_CONTROL_INDEX_ENABLED) + { + /* The CDDC Sample XBar Converter status is enabled so read value from register */ + recoveryAction = CddcJtxChannelXBarBfGet(device, + NULL, + commonBaseAddr, + index, + ®Value); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting CDDC Sample XBar selected framer and Rx channel."); + goto cleanup; + } + + cddcChannelXbarCfg->cddcChannelXbar[index] = regValue; + } + else + { + cddcChannelXbarCfg->cddcChannelXbar[index] = ADI_ADRV904X_XBAR_ENTRY_DISABLED; + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CducTxChanXBarSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + const adi_adrv904x_CducChannelXbarCfg_t * const cducChannelXbarCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + uint32_t cducXbarLimit = 0U; + uint32_t index = 0U; + uint8_t channelXbarEntry = 0U; + + adi_adrv904x_ErrAction_e(*CducJrxXBarBfSet)(adi_adrv904x_Device_t*, + adi_adrv904x_SpiCache_t* const, + const adrv904x_BfJesdCommonChanAddr_e, + uint8_t, + const uint8_t) = NULL; + + adi_adrv904x_ErrAction_e(*CducXBarConverterBfGet)(adi_adrv904x_Device_t* const, + adi_adrv904x_SpiCache_t* const, + const adrv904x_BfJesdCommonChanAddr_e, + uint8_t, + uint8_t* const) = NULL; + + adi_adrv904x_ErrAction_e(*CducXBarConverterBfSet)(adi_adrv904x_Device_t* const, + adi_adrv904x_SpiCache_t* const, + const adrv904x_BfJesdCommonChanAddr_e, + uint8_t, + const uint8_t) = NULL; + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cducChannelXbarCfg, cleanup); + + /* Check deframer selection and assign channel xbar limit per deframer */ + if (deframerSel == ADI_ADRV904X_DEFRAMER_0) + { + cducXbarLimit = ADI_ADRV904X_MAX_DFRM_CARRIER_XBAR_IDX; + CducJrxXBarBfSet = adrv904x_JesdCommon_JrxChannelSelLink0_BfSet; + CducXBarConverterBfGet = adrv904x_JesdCommon_JrxCoreConvDisableLink0_BfGet; + CducXBarConverterBfSet = adrv904x_JesdCommon_JrxCoreConvDisableLink0_BfSet; + } + else if (deframerSel == ADI_ADRV904X_DEFRAMER_1) + { + cducXbarLimit = ADI_ADRV904X_MAX_DFRM_CARRIER_XBAR_IDX / 2U; /* deframer 1 has half of deframer 0 */ + CducJrxXBarBfSet = adrv904x_JesdCommon_JrxChannelSelLink1_BfSet; + CducXBarConverterBfGet = adrv904x_JesdCommon_JrxCoreConvDisableLink1_BfGet; + CducXBarConverterBfSet = adrv904x_JesdCommon_JrxCoreConvDisableLink1_BfSet; + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid deframer selection"); + goto cleanup; + } + + /* Verifying and setting CDUC Channel XBar for all entries */ + for (index = 0U; index < cducXbarLimit; index++) + { + /* Read the CDUC channel xbar entry */ + recoveryAction = CducXBarConverterBfGet(device, + NULL, + commonBaseAddr, + index, + &channelXbarEntry); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting CDUC XBar Converter index."); + goto cleanup; + } + + /* Verify Channel xbar value before write */ + if (cducChannelXbarCfg->cducChannelXbar[index] == ADI_ADRV904X_XBAR_ENTRY_DISABLED) + { + /* The value indicates the entry is to disable so disable the entry */ + recoveryAction = CducXBarConverterBfSet(device, + NULL, + commonBaseAddr, + index, + ADI_ADRV904X_XBAR_CONTROL_INDEX_DISABLED); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting CDUC XBar Converter index."); + goto cleanup; + } + } + else if (cducChannelXbarCfg->cducChannelXbar[index] > ADI_ADRV904X_MAX_CHANNEL_XBAR_VALUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid CDUC Channel Xbar configuration value."); + goto cleanup; + } + else /* valid value */ + { + /* Enable xbar entry if it is disable */ + if (channelXbarEntry == ADI_ADRV904X_XBAR_CONTROL_INDEX_DISABLED) + { + recoveryAction = CducXBarConverterBfSet(device, + NULL, + commonBaseAddr, + index, + ADI_ADRV904X_XBAR_CONTROL_INDEX_ENABLED); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting CDUC XBar Converter index."); + goto cleanup; + } + } + + /* Writing CDUC Sample Xbar Index value */ + recoveryAction = CducJrxXBarBfSet(device, + NULL, + commonBaseAddr, + index, + cducChannelXbarCfg->cducChannelXbar[index]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting CDUC Channel XBar selected deframer."); + goto cleanup; + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CducTxChanXBarGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DeframerSel_e deframerSel, + adi_adrv904x_CducChannelXbarCfg_t * const cducChannelXbarCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + uint32_t cducXbarLimit = 0U; + uint32_t index = 0U; + uint8_t regValue = 0U; + adi_adrv904x_ErrAction_e(*CducJrxXBarBfGet)(adi_adrv904x_Device_t*, + adi_adrv904x_SpiCache_t* const, + const adrv904x_BfJesdCommonChanAddr_e, + uint8_t, + uint8_t* const) = NULL; + + adi_adrv904x_ErrAction_e(*CducXBarConverterBfGet)(adi_adrv904x_Device_t* const, + adi_adrv904x_SpiCache_t* const, + const adrv904x_BfJesdCommonChanAddr_e, + uint8_t, + uint8_t* const) = NULL; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cducChannelXbarCfg, cleanup); + + /* Check deframer selection and assign values */ + if (deframerSel == ADI_ADRV904X_DEFRAMER_0) + { + cducXbarLimit = ADI_ADRV904X_MAX_DFRM_CARRIER_XBAR_IDX; + CducJrxXBarBfGet = adrv904x_JesdCommon_JrxChannelSelLink0_BfGet; + CducXBarConverterBfGet = adrv904x_JesdCommon_JrxCoreConvDisableLink0_BfGet; + } + else if (deframerSel == ADI_ADRV904X_DEFRAMER_1) + { + cducXbarLimit = ADI_ADRV904X_MAX_DFRM_CARRIER_XBAR_IDX / 2U; /* deframer 1 has half of deframer 0 */ + CducJrxXBarBfGet = adrv904x_JesdCommon_JrxChannelSelLink1_BfGet; + CducXBarConverterBfGet = adrv904x_JesdCommon_JrxCoreConvDisableLink1_BfGet; + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid deframer selection"); + goto cleanup; + } + + /* Getting CDUC Sample XBar for all entries */ + for (index = 0U; index < cducXbarLimit; index++) + { + /* Get the CDUC XBar Converter status first */ + recoveryAction = CducXBarConverterBfGet(device, + NULL, + commonBaseAddr, + index, + ®Value); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting CDUC Channel XBar Converter index."); + goto cleanup; + } + + if (regValue == ADI_ADRV904X_XBAR_CONTROL_INDEX_DISABLED) + { + /* The CDUC Sample XBar Converter status is disabled so assign disable value to the index. */ + cducChannelXbarCfg->cducChannelXbar[index] = ADI_ADRV904X_XBAR_ENTRY_DISABLED; + } + else + { + /* The CDUC Channel XBar Converter status is enabled so read value from register */ + recoveryAction = CducJrxXBarBfGet(device, + NULL, + commonBaseAddr, + index, + ®Value); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting CDUC Channel XBar selected deframer."); + goto cleanup; + } + + cducChannelXbarCfg->cducChannelXbar[index] = regValue; + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_OrxAdcSampleXbarSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + const adi_adrv904x_OrxAdcSampleXbarCfg_t* const orxAdcXbar) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t OrxAdcIdx = 0U; + uint8_t validAdc = ADI_FALSE; + uint32_t i = 0U; + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + adi_adrv904x_OrxAdcSampleXbarSel_e validOrxAdcXbar[] = + { + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_I_0, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_I_1, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_I_2, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_I_3, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_I_4, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_I_5, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_I_6, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_I_7, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_Q_0, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_Q_1, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_Q_2, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_Q_3, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_Q_4, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_Q_5, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_Q_6, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX0_DATA_Q_7, + + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_I_0, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_I_1, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_I_2, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_I_3, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_I_4, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_I_5, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_I_6, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_I_7, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_Q_0, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_Q_1, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_Q_2, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_Q_3, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_Q_4, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_Q_5, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_Q_6, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_ORX1_DATA_Q_7, + ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_INVALID + }; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, orxAdcXbar, cleanup); + + /* Only Framer 2 is supported in this API */ + if (framerSel != ADI_ADRV904X_FRAMER_2) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid framer selection."); + goto cleanup; + } + + /* ADC Xbar values validation */ + for (OrxAdcIdx = 0; OrxAdcIdx < ADI_ADRV904X_NUM_ORX_ADC_SAMPLE_XBAR; OrxAdcIdx++) + { + validAdc = ADI_FALSE; + for (i = 0; i < (sizeof(validOrxAdcXbar) / sizeof(*validOrxAdcXbar)); i++) + { + if (orxAdcXbar->OrxAdcSampleXbar[OrxAdcIdx] != validOrxAdcXbar[i]) + { + continue; + } + else + { + validAdc = ADI_TRUE; + break; + } + } + + /* Expect validAdc to be true (1U) */ + if (validAdc == ADI_FALSE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid ORX ADC Sample Crossbar selection"); + goto cleanup; + } + } + + /* program the converters */ + for (OrxAdcIdx = 0; OrxAdcIdx < ADI_ADRV904X_NUM_ORX_ADC_SAMPLE_XBAR; OrxAdcIdx++) + { + if (orxAdcXbar->OrxAdcSampleXbar[OrxAdcIdx] == ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_INVALID) + { + /* Disable the converters */ + recoveryAction = adrv904x_JesdCommon_JtxCoreConvDisableLink2_BfSet(device, + NULL, + commonBaseAddr, + OrxAdcIdx, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting orx sample crossbar for the selected framer"); + goto cleanup; + } + } + else + { + /* Enabling converters */ + recoveryAction = adrv904x_JesdCommon_JtxCoreConvDisableLink2_BfSet(device, + NULL, + commonBaseAddr, + OrxAdcIdx, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while enabling converter for the selected framer"); + goto cleanup; + } + + /* Writing ORX Sample Xbar value */ + recoveryAction = adrv904x_JesdCommon_OrxSampleSelLink2_BfSet(device, + NULL, + commonBaseAddr, + OrxAdcIdx, + (uint8_t) orxAdcXbar->OrxAdcSampleXbar[OrxAdcIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting orx sample crossbar value for the selected framer"); + goto cleanup; + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_OrxAdcSampleXbarGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_FramerSel_e framerSel, + adi_adrv904x_OrxAdcSampleXbarCfg_t* const orxAdcXbar) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t xbarIdx = 0U; + uint8_t bfValue = 0U; + uint8_t adcValue = 0U; + adrv904x_BfJesdCommonChanAddr_e commonBaseAddr = ADRV904X_BF_DIGITAL_CORE_JESD_JESD_COMMON; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, orxAdcXbar, cleanup); + + /* Only Framer 2 is supported in this API */ + if (framerSel != ADI_ADRV904X_FRAMER_2) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid framer selection."); + goto cleanup; + } + + for (xbarIdx = 0U; xbarIdx < ADI_ADRV904X_NUM_ORX_ADC_SAMPLE_XBAR; xbarIdx++) + { + /* Get this status of converters */ + recoveryAction = adrv904x_JesdCommon_JtxCoreConvDisableLink2_BfGet(device, + NULL, + commonBaseAddr, + xbarIdx, + &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting converter status for the selected framer"); + goto cleanup; + } + + if (bfValue == 1U) /* Converter is in disable */ + { + orxAdcXbar->OrxAdcSampleXbar[xbarIdx] = ADI_ADRV904X_JESD_ADC_SAMPLE_XBAR_INVALID; + } + else /* Converter is in enable */ + { + /* Getting Sample Xbar value */ + recoveryAction = adrv904x_JesdCommon_OrxSampleSelLink2_BfGet(device, + NULL, + commonBaseAddr, + xbarIdx, + &adcValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting sample crossbar value for the selected framer"); + goto cleanup; + } + orxAdcXbar->OrxAdcSampleXbar[xbarIdx] = (adi_adrv904x_OrxAdcSampleXbarSel_e) adcValue; + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_dfe_cfr.c b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_dfe_cfr.c new file mode 100644 index 00000000000..54d307f76a5 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_dfe_cfr.c @@ -0,0 +1,2168 @@ +/** +* Copyright 2015 - 2023 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_dfe_cfr.c +* \brief Contains CFR features related function implementations +* +* ADRV904X API Version: 2.10.0.4 +*/ +#include "adi_adrv904x_dfe_cfr.h" +#include "adi_adrv904x_tx.h" +#include "adi_adrv904x_hal.h" + +#include "../../private/include/adrv904x_radioctrl.h" +#include "../../private/include/adrv904x_tx.h" +#include "../../private/include/adrv904x_dfe_cfr.h" +#include "../../private/include/adrv904x_reg_addr_macros.h" +#include "../../private/include/adrv904x_stream_proc_types.h" +#include "../../private/bf/adrv904x_bf_streamproc_channel_types.h" +#include "../../private/include/adrv904x_dfe_cfr.h" +#include "../../private/include/adrv904x_cpu_scratch_registers.h" + +#include "../../private/bf/adrv904x_bf_core.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PUBLIC_DFE_CFR + + +static adi_adrv904x_ErrAction_e adrv904x_CfrActiveConfigUpdateCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e cfrTxChannelSel, + uint32_t configSelectMask); + +static adi_adrv904x_ErrAction_e adrv904x_CfrActivePulseUpdateCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e cfrTxChannelSel, + uint32_t pulseSelectMask); + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrThresholdSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CfrThrConfig_t* const cfrThrConfig, + const uint32_t cfrTxChannelMask, + const uint32_t configSelectMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxCfrRegChanAddr_e txCfrBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cfrThrConfig, cleanup); + + /* Check that if requested Tx Channel valid*/ + if (((cfrTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || + (cfrTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + /* Check that if requested config set is valid*/ + if (((configSelectMask & (~(uint32_t)ADI_ADRV904X_CFR_CFGALL)) != 0U) || + (configSelectMask == 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + configSelectMask, + "Invalid configuration selected. Valid values are any combinations of CFG0/1"); + goto cleanup; + } + + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(cfrTxChannelMask, chanSel)) + { + recoveryAction = adrv904x_CfrRegsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txCfrBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid Tx Channel used to determine CFR base address"); + goto cleanup; + } + + recoveryAction = adrv904x_CfrActiveConfigUpdateCheck(device, + (adi_adrv904x_TxChannels_e)(chanSel), + configSelectMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, configSelectMask, "Requested configuration is actively being used by CFR engine"); + goto cleanup; + } + + /* Set engine 0 Thresh Sq*/ + recoveryAction = adrv904x_CfrWritePeakThreshSq(device, + cfrThrConfig->cfrEngine0PeakThresholdScaler, + cfrThrConfig->cfrPeakThreshold, + txCfrBaseAddr, + configSelectMask, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing threshold sq for engine 0"); + goto cleanup; + } + + /* Set engine 1 Thresh Sq*/ + recoveryAction = adrv904x_CfrWritePeakThreshSq(device, + cfrThrConfig->cfrEngine1PeakThresholdScaler, + cfrThrConfig->cfrPeakThreshold, + txCfrBaseAddr, + configSelectMask, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing threshold sq for engine 1"); + goto cleanup; + } + + /* Set engine 2 Thresh Sq*/ + recoveryAction = adrv904x_CfrWritePeakThreshSq(device, + cfrThrConfig->cfrEngine2PeakThresholdScaler, + cfrThrConfig->cfrPeakThreshold, + txCfrBaseAddr, + configSelectMask, + 2U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing threshold sq for engine 2"); + goto cleanup; + } + + /* Set engine 0 Thresh Sqrt*/ + recoveryAction = adrv904x_CfrWritePeakThreshSqrt(device, + cfrThrConfig->cfrEngine0PeakThresholdScaler, + cfrThrConfig->cfrPeakThreshold, + txCfrBaseAddr, + configSelectMask, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing threshold sqrt for engine 0"); + goto cleanup; + } + + /* Set engine 1 Thresh Sqrt*/ + recoveryAction = adrv904x_CfrWritePeakThreshSqrt(device, + cfrThrConfig->cfrEngine1PeakThresholdScaler, + cfrThrConfig->cfrPeakThreshold, + txCfrBaseAddr, + configSelectMask, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing threshold sqrt for engine 1"); + goto cleanup; + } + + /* Set engine 2 Thresh Sqrt*/ + recoveryAction = adrv904x_CfrWritePeakThreshSqrt(device, + cfrThrConfig->cfrEngine2PeakThresholdScaler, + cfrThrConfig->cfrPeakThreshold, + txCfrBaseAddr, + configSelectMask, + 2U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing threshold sqrt for engine 2"); + goto cleanup; + } + + /* Set engine 0 Correction Threshold */ + recoveryAction = adrv904x_CfrWriteCorrectionThresh(device, + cfrThrConfig->cfrCorrectionThresholdScaler, + cfrThrConfig->cfrPeakThreshold, + txCfrBaseAddr, + configSelectMask, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing correction threshold for engine 0"); + goto cleanup; + } + + /* Set engine 1 Correction Threshold */ + recoveryAction = adrv904x_CfrWriteCorrectionThresh(device, + cfrThrConfig->cfrCorrectionThresholdScaler, + cfrThrConfig->cfrPeakThreshold, + txCfrBaseAddr, + configSelectMask, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing correction threshold for engine 1"); + goto cleanup; + } + + /* Set engine 2 Correction Threshold */ + recoveryAction = adrv904x_CfrWriteCorrectionThresh(device, + cfrThrConfig->cfrCorrectionThresholdScaler, + cfrThrConfig->cfrPeakThreshold, + txCfrBaseAddr, + configSelectMask, + 2U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing correction threshold for engine 2"); + goto cleanup; + } + + /* Update device info struct with new thresholds */ + if (ADRV904X_BF_EQUAL(configSelectMask, (uint32_t)ADI_ADRV904X_CFR_CFG0)) + { + device->devStateInfo.cfrThresholdsCfg0[chanIdx].cfrPeakThreshold = cfrThrConfig->cfrPeakThreshold; + device->devStateInfo.cfrThresholdsCfg0[chanIdx].cfrEngine0PeakThresholdScaler = cfrThrConfig->cfrEngine0PeakThresholdScaler; + device->devStateInfo.cfrThresholdsCfg0[chanIdx].cfrEngine1PeakThresholdScaler = cfrThrConfig->cfrEngine1PeakThresholdScaler; + device->devStateInfo.cfrThresholdsCfg0[chanIdx].cfrEngine2PeakThresholdScaler = cfrThrConfig->cfrEngine2PeakThresholdScaler; + device->devStateInfo.cfrThresholdsCfg0[chanIdx].cfrCorrectionThresholdScaler = cfrThrConfig->cfrCorrectionThresholdScaler; + } + + if (ADRV904X_BF_EQUAL(configSelectMask, (uint32_t)ADI_ADRV904X_CFR_CFG1)) + { + device->devStateInfo.cfrThresholdsCfg1[chanIdx].cfrPeakThreshold = cfrThrConfig->cfrPeakThreshold; + device->devStateInfo.cfrThresholdsCfg1[chanIdx].cfrEngine0PeakThresholdScaler = cfrThrConfig->cfrEngine0PeakThresholdScaler; + device->devStateInfo.cfrThresholdsCfg1[chanIdx].cfrEngine1PeakThresholdScaler = cfrThrConfig->cfrEngine1PeakThresholdScaler; + device->devStateInfo.cfrThresholdsCfg1[chanIdx].cfrEngine2PeakThresholdScaler = cfrThrConfig->cfrEngine2PeakThresholdScaler; + device->devStateInfo.cfrThresholdsCfg1[chanIdx].cfrCorrectionThresholdScaler = cfrThrConfig->cfrCorrectionThresholdScaler; + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrThresholdGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_CfrThrConfig_t* const cfrThrConfig, + const uint32_t cfrTxChannelSel, + const uint32_t configSelect) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t chanIdx = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cfrThrConfig, cleanup); + + switch (cfrTxChannelSel) + { + case ADI_ADRV904X_TX0: + chanIdx = 0U; + break; + case ADI_ADRV904X_TX1: + chanIdx = 1U; + break; + case ADI_ADRV904X_TX2: + chanIdx = 2U; + break; + case ADI_ADRV904X_TX3: + chanIdx = 3U; + break; + case ADI_ADRV904X_TX4: + chanIdx = 4U; + break; + case ADI_ADRV904X_TX5: + chanIdx = 5U; + break; + case ADI_ADRV904X_TX6: + chanIdx = 6U; + break; + case ADI_ADRV904X_TX7: + chanIdx = 7U; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrTxChannelSel, + "Invalid Tx channel is selected. Valid values are Tx0/1/2/3/4/5/6/7"); + goto cleanup; + break; + } + + /* Read threshold configuration from device struct */ + if (configSelect == (uint32_t)ADI_ADRV904X_CFR_CFG0) + { + cfrThrConfig->cfrPeakThreshold = device->devStateInfo.cfrThresholdsCfg0[chanIdx].cfrPeakThreshold; + cfrThrConfig->cfrEngine0PeakThresholdScaler = device->devStateInfo.cfrThresholdsCfg0[chanIdx].cfrEngine0PeakThresholdScaler; + cfrThrConfig->cfrEngine1PeakThresholdScaler = device->devStateInfo.cfrThresholdsCfg0[chanIdx].cfrEngine1PeakThresholdScaler; + cfrThrConfig->cfrEngine2PeakThresholdScaler = device->devStateInfo.cfrThresholdsCfg0[chanIdx].cfrEngine2PeakThresholdScaler; + cfrThrConfig->cfrCorrectionThresholdScaler = device->devStateInfo.cfrThresholdsCfg0[chanIdx].cfrCorrectionThresholdScaler; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + else if (configSelect == (uint32_t)ADI_ADRV904X_CFR_CFG1) + { + cfrThrConfig->cfrPeakThreshold = device->devStateInfo.cfrThresholdsCfg1[chanIdx].cfrPeakThreshold; + cfrThrConfig->cfrEngine0PeakThresholdScaler = device->devStateInfo.cfrThresholdsCfg1[chanIdx].cfrEngine0PeakThresholdScaler; + cfrThrConfig->cfrEngine1PeakThresholdScaler = device->devStateInfo.cfrThresholdsCfg1[chanIdx].cfrEngine1PeakThresholdScaler; + cfrThrConfig->cfrEngine2PeakThresholdScaler = device->devStateInfo.cfrThresholdsCfg1[chanIdx].cfrEngine2PeakThresholdScaler; + cfrThrConfig->cfrCorrectionThresholdScaler = device->devStateInfo.cfrThresholdsCfg1[chanIdx].cfrCorrectionThresholdScaler; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + configSelect, + "Invalid Cfr config selected. User should select either CFG0 or CFG1"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrEnableSet(adi_adrv904x_Device_t* const device, + const uint32_t cfrEngineEnable[], + const uint32_t cfrEngineBypass[], + const uint32_t arraySize, + const uint32_t cfrTxChannelMask, + const uint32_t configSelectMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxCfrRegChanAddr_e txCfrBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG; + + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + uint32_t engineIdx = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cfrEngineEnable, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cfrEngineBypass, cleanup); + + /*Check that if requested Tx Channel valid*/ + if (((cfrTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || + (cfrTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + /*Check that if requested config set is valid*/ + if (((configSelectMask & (~(uint32_t)ADI_ADRV904X_CFR_CFGALL)) != 0U) || + (configSelectMask == 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + configSelectMask, + "Invalid configuration selected. Valid values are any combinations of CFG0/1"); + goto cleanup; + } + + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(cfrTxChannelMask, chanSel)) + { + recoveryAction = adrv904x_CfrRegsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txCfrBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid Tx Channel used to determine CFR base address"); + goto cleanup; + } + + recoveryAction = adrv904x_CfrActiveConfigUpdateCheck(device, + (adi_adrv904x_TxChannels_e)(chanSel), + configSelectMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, configSelectMask, "Requested configuration is actively being used by CFR engine"); + goto cleanup; + } + + if (ADRV904X_BF_EQUAL(configSelectMask, (uint32_t)ADI_ADRV904X_CFR_CFG0)) + { + for (engineIdx = 0U; engineIdx < arraySize; ++engineIdx) + { + /* Write engine enable - Cfg0 */ + recoveryAction = adrv904x_TxCfrReg_Cfr0CtrlEn_BfSet(device, + NULL, + txCfrBaseAddr, + engineIdx, + cfrEngineEnable[engineIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing engine enable Cfg0"); + goto cleanup; + } + + /* Write engine bypass - Cfg0 */ + recoveryAction = adrv904x_TxCfrReg_Cfr0CtrlByp_BfSet(device, + NULL, + txCfrBaseAddr, + engineIdx, + cfrEngineBypass[engineIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing engine bypass Cfg0"); + goto cleanup; + } + } + } + + if (ADRV904X_BF_EQUAL(configSelectMask, (uint32_t)ADI_ADRV904X_CFR_CFG1)) + { + for (engineIdx = 0U; engineIdx < arraySize; ++engineIdx) + { + /* Write engine enable - Cfg1 */ + recoveryAction = adrv904x_TxCfrReg_Cfr1CtrlEn_BfSet(device, + NULL, + txCfrBaseAddr, + engineIdx, + cfrEngineEnable[engineIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing engine enable Cfg1"); + goto cleanup; + } + + /* Write engine bypass - Cfg1 */ + recoveryAction = adrv904x_TxCfrReg_Cfr1CtrlByp_BfSet(device, + NULL, + txCfrBaseAddr, + engineIdx, + cfrEngineBypass[engineIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing engine bypass Cfg1"); + goto cleanup; + } + } + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrEnableGet(adi_adrv904x_Device_t* const device, + uint32_t cfrEngineEnable[], + uint32_t cfrEngineBypass[], + const uint32_t arraySize, + const uint32_t cfrTxChannelSel, + const uint32_t configSelect) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxCfrRegChanAddr_e txCfrBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG; + uint8_t tmpReadBack = 0U; + uint32_t engineIdx = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cfrEngineEnable, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cfrEngineBypass, cleanup); + + recoveryAction = adrv904x_CfrRegsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(cfrTxChannelSel), &txCfrBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cfrTxChannelSel, "Invalid Tx Channel used to determine CFR base address"); + goto cleanup; + } + + if (configSelect == (uint32_t)ADI_ADRV904X_CFR_CFG0) + { + for (engineIdx = 0U; engineIdx < arraySize; ++engineIdx) + { + /* Read engine enable - Cfg0 */ + recoveryAction = adrv904x_TxCfrReg_Cfr0CtrlEn_BfGet(device, + NULL, + txCfrBaseAddr, + engineIdx, + &tmpReadBack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading engine enable Cfg0"); + goto cleanup; + } + + cfrEngineEnable[engineIdx] = tmpReadBack; + + /* Read engine bypass - Cfg0 */ + recoveryAction = adrv904x_TxCfrReg_Cfr0CtrlByp_BfGet(device, + NULL, + txCfrBaseAddr, + engineIdx, + &tmpReadBack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading engine bypass Cfg0"); + goto cleanup; + } + + cfrEngineBypass[engineIdx] = tmpReadBack; + } + } + else if (configSelect == (uint32_t)ADI_ADRV904X_CFR_CFG1) + { + for (engineIdx = 0U; engineIdx < arraySize; ++engineIdx) + { + /* Read engine enable - Cfg1 */ + recoveryAction = adrv904x_TxCfrReg_Cfr1CtrlEn_BfGet(device, + NULL, + txCfrBaseAddr, + engineIdx, + &tmpReadBack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading engine enable Cfg1"); + goto cleanup; + } + + cfrEngineEnable[engineIdx] = tmpReadBack; + + /* Read engine bypass - Cfg1 */ + recoveryAction = adrv904x_TxCfrReg_Cfr1CtrlByp_BfGet(device, + NULL, + txCfrBaseAddr, + engineIdx, + &tmpReadBack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading engine bypass Cfg1"); + goto cleanup; + } + + cfrEngineBypass[engineIdx] = tmpReadBack; + } + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + configSelect, + "Invalid Cfr config selected. User should select either CFG0 or CFG1"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrConfigSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CfrConfig_t* const cfrCtrlConfig, + const uint32_t cfrTxChannelMask, + const uint32_t configSelectMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cfrCtrlConfig, cleanup); + + /* Check that if requested Tx Channel valid*/ + if (((cfrTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || + (cfrTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + /* Check that if requested config set is valid*/ + if (((configSelectMask & (~(uint32_t)ADI_ADRV904X_CFR_CFGALL)) != 0U) || + (configSelectMask == 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + configSelectMask, + "Invalid configuration selected. Valid values are any combinations of CFG0/1"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_CfrThresholdSet(device, + &cfrCtrlConfig->cfrThreshold, + cfrTxChannelMask, + configSelectMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting CFR thresholds"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_CfrEnableSet(device, + &cfrCtrlConfig->cfrEngineEnable[0], + &cfrCtrlConfig->cfrEngineBypass[0], + ADI_ADRV904X_NUM_OF_CFR_ENGINES, + cfrTxChannelMask, + configSelectMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting CFR engine/bypass configuration"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrConfigGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_CfrConfig_t* const cfrCtrlConfig, + const uint32_t cfrTxChannelSel, + const uint32_t configSelect) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cfrCtrlConfig, cleanup); + + recoveryAction = adi_adrv904x_CfrThresholdGet(device, + &cfrCtrlConfig->cfrThreshold, + cfrTxChannelSel, + configSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading CFR thresholds"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_CfrEnableGet(device, + &cfrCtrlConfig->cfrEngineEnable[0], + &cfrCtrlConfig->cfrEngineBypass[0], + ADI_ADRV904X_NUM_OF_CFR_ENGINES, + cfrTxChannelSel, + configSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading CFR engine/bypass configuration"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrActiveCfgSet(adi_adrv904x_Device_t* const device, + const uint32_t cfrTxChannelMask, + const adi_adrv904x_CfrConfigSel_e configSelect, + const uint8_t immediateUpdate) +{ + static const uint32_t txScratchPadAddr[] = { (uint32_t)ADRV904X_ADDR_TX0_STREAM_SCRATCH0, + (uint32_t)ADRV904X_ADDR_TX1_STREAM_SCRATCH0, + (uint32_t)ADRV904X_ADDR_TX2_STREAM_SCRATCH0, + (uint32_t)ADRV904X_ADDR_TX3_STREAM_SCRATCH0, + (uint32_t)ADRV904X_ADDR_TX4_STREAM_SCRATCH0, + (uint32_t)ADRV904X_ADDR_TX5_STREAM_SCRATCH0, + (uint32_t)ADRV904X_ADDR_TX6_STREAM_SCRATCH0, + (uint32_t)ADRV904X_ADDR_TX7_STREAM_SCRATCH0 }; + + static const uint32_t CFR_MODE_CHANGE_REQ = 0x00001000U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxCfrRegChanAddr_e txCfrBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG; + + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + uint8_t activeCfgSet = 0U; + uint32_t txScratchValue = 0U; + uint8_t actTxChannelMask = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /*Check that if requested Tx Channel valid*/ + if (((cfrTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || + (cfrTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + /*Check that if requested config set is valid*/ + if ((configSelect != ADI_ADRV904X_CFR_CFG0) && + (configSelect != ADI_ADRV904X_CFR_CFG1)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + configSelect, + "Invalid configuration selected. Valid values are CFG0/1"); + goto cleanup; + } + + /* Check if immediateUpdate parameter is valid */ + if (immediateUpdate > 2U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + immediateUpdate, + "immediateUpdate value is invalid. Valid values 0-2"); + goto cleanup; + } + + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(cfrTxChannelMask, chanSel)) + { + recoveryAction = adrv904x_CfrRegsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txCfrBaseAddr); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid Tx Channel used to determine CFR base address"); + goto cleanup; + } + + /* Read active configuration */ + recoveryAction = adrv904x_TxCfrReg_CfrCtrlActiveSet_BfGet(device, + NULL, + txCfrBaseAddr, + &activeCfgSet); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading active config set"); + goto cleanup; + } + + if (activeCfgSet != ((uint8_t)configSelect - 1)) + { + if (immediateUpdate == 2U) + { + /* Read the scratchpad register */ + recoveryAction = adi_adrv904x_Register32Read(device, + NULL, + txScratchPadAddr[chanIdx], + &txScratchValue, + 0xFFFFFFFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot read Tx scratch pad register"); + goto cleanup; + } + + if (txScratchValue & CFR_MODE_CHANGE_REQ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Another request already active"); + goto cleanup; + } + + /* Update Tx channel bitmask */ + actTxChannelMask |= (uint8_t)chanSel; + } + else if (immediateUpdate == 1U) + { + /* Assert config select toggle bit to switch to requested configuration */ + adrv904x_TxCfrReg_CfrCtrlChSet_BfSet(device, + NULL, + txCfrBaseAddr, + ADI_TRUE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing CFR ch set bit"); + goto cleanup; + } + } + else + { + /* TODO: Trigger stream to change active configuration on next carrier configuration. We may not need to trigger this stream + * based on the solution for TRDIG-2870 */ + } + } + } + } + + if (immediateUpdate == 2U) + { + /* Set CFR active config set change request */ + recoveryAction = adrv904x_TxStreamTrigger(device, actTxChannelMask, (uint8_t)ADRV904X_STREAM_TX_SET_CFR_CFG_SET_CHANGE_REQ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while triggering TX stream"); + goto cleanup; + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrActiveCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannelSel, + adi_adrv904x_CfrConfigSel_e* const configSelectRead) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxCfrRegChanAddr_e txCfrBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG; + uint8_t tmpReadbackVal = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, configSelectRead, cleanup); + + recoveryAction = adrv904x_CfrRegsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(txChannelSel), &txCfrBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelSel, "Invalid Tx Channel used to determine CFR base address"); + goto cleanup; + } + + /* Read active configuration */ + recoveryAction = adrv904x_TxCfrReg_CfrCtrlActiveSet_BfGet(device, + NULL, + txCfrBaseAddr, + &tmpReadbackVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading active config set"); + goto cleanup; + } + + *configSelectRead = (adi_adrv904x_CfrConfigSel_e)(tmpReadbackVal + 1U); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrActivePulseSet(adi_adrv904x_Device_t* const device, + const uint32_t cfrTxChannelMask, + const adi_adrv904x_CfrPulseSel_e pulseSelect, + const uint8_t immediateUpdate) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxCfrRegChanAddr_e txCfrBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG; + + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + uint8_t activePulse = 0U; + uint8_t pulseSelBfVal = 0U; + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /*Check that if requested Tx Channel valid*/ + if (((cfrTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || + (cfrTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + /*Check that if requested config set is valid*/ + if ((pulseSelect != ADI_ADRV904X_CFR_PULSE0) && + (pulseSelect != ADI_ADRV904X_CFR_PULSE1)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pulseSelect, + "Invalid pulse selected. Valid values are Pulse0/1"); + goto cleanup; + } + + /* Check if immediateUpdate parameter is valid */ + if (immediateUpdate > ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + immediateUpdate, + "immediateUpdate value is invalid. Valid values 0-1"); + goto cleanup; + } + + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(cfrTxChannelMask, chanSel)) + { + recoveryAction = adrv904x_CfrRegsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txCfrBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid Tx Channel used to determine CFR base address"); + goto cleanup; + } + + /* Read active pulse */ + recoveryAction = adrv904x_TxCfrReg_CfrCtrlPulSel_BfGet(device, + NULL, + txCfrBaseAddr, + &activePulse); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading active pulse"); + goto cleanup; + } + + /* Pulse select bf value is 0 and 1*/ + pulseSelBfVal = (uint8_t)pulseSelect - 1U; + if (activePulse != (uint8_t)pulseSelBfVal) + { + if (immediateUpdate == ADI_TRUE) + { + /* Write the pulse selection immediately */ + adrv904x_TxCfrReg_CfrCtrlPulSel_BfSet(device, + NULL, + txCfrBaseAddr, + pulseSelBfVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing CFR pulse set bit"); + goto cleanup; + } + } + else + { + /* TODO: Trigger stream to change pulse on next carrier configuration. We may not need to trigger this stream + * based on the solution for TRDIG-2870 */ + } + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrActivePulseGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannelSel, + adi_adrv904x_CfrPulseSel_e* const pulseSelectRead) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxCfrRegChanAddr_e txCfrBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG; + uint8_t tmpReadbackVal = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pulseSelectRead, cleanup); + + recoveryAction = adrv904x_CfrRegsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(txChannelSel), &txCfrBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelSel, "Invalid Tx Channel used to determine CFR base address"); + goto cleanup; + } + + /* Read active configuration */ + recoveryAction = adrv904x_TxCfrReg_CfrCtrlPulSel_BfGet(device, + NULL, + txCfrBaseAddr, + &tmpReadbackVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading active pulse"); + goto cleanup; + } + + *pulseSelectRead = (adi_adrv904x_CfrPulseSel_e)(tmpReadbackVal + 1U); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrStatisticsCfgSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CfrStatisticsCfg_t* const cfrStatisticsConfig, + const uint32_t cfrTxChannelMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxCfrRegChanAddr_e txCfrBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG; + static const uint8_t WINDOW_SIZE_MAX = 15U; + + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + uint8_t engineIdx = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cfrStatisticsConfig, cleanup); + + /*Check that if requested Tx Channel valid*/ + if (((cfrTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || + (cfrTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + /* Check if window enable parameter is valid */ + if (cfrStatisticsConfig->windowEn > ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrStatisticsConfig->windowEn, + "windowEn value is invalid. Valid values 0-1"); + goto cleanup; + } + + /* Check if window size parameter is valid */ + if (cfrStatisticsConfig->windowSize > WINDOW_SIZE_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrStatisticsConfig->windowSize, + "windowSize value is invalid. Valid range [0-15]"); + goto cleanup; + } + + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(cfrTxChannelMask, chanSel)) + { + recoveryAction = adrv904x_CfrRegsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txCfrBaseAddr); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid Tx Channel used to determine CFR base address"); + goto cleanup; + } + + for (engineIdx = 0U; engineIdx < ADI_ADRV904X_NUM_OF_CFR_ENGINES; ++engineIdx) + { + /* Write window enable bit */ + recoveryAction = adrv904x_TxCfrReg_CfrDbgPkStatWindowEn_BfSet(device, + NULL, + txCfrBaseAddr, + engineIdx, + cfrStatisticsConfig->windowEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing statistics window enable"); + goto cleanup; + } + + /* Write window size bit */ + recoveryAction = adrv904x_TxCfrReg_CfrDbgPkStatWindowSz_BfSet(device, + NULL, + txCfrBaseAddr, + engineIdx, + cfrStatisticsConfig->windowSize); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing statistics window size"); + goto cleanup; + } + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrStatisticsCfgGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_CfrStatisticsCfg_t* const cfrStatisticsConfig, + const uint32_t cfrTxChannelSel) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxCfrRegChanAddr_e txCfrBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG; + uint8_t tmpReadbackVal = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cfrStatisticsConfig, cleanup); + + recoveryAction = adrv904x_CfrRegsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(cfrTxChannelSel), &txCfrBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cfrTxChannelSel, "Invalid Tx Channel used to determine CFR base address"); + goto cleanup; + } + + /* Read window enable from engine 0, since we configure the same setting to all engines */ + recoveryAction = adrv904x_TxCfrReg_CfrDbgPkStatWindowEn_BfGet(device, + NULL, + txCfrBaseAddr, + 0U, + &tmpReadbackVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading statistics window enable"); + goto cleanup; + } + cfrStatisticsConfig->windowEn = tmpReadbackVal; + + /* Read window size from engine 0, since we configure the same setting to all engines */ + recoveryAction = adrv904x_TxCfrReg_CfrDbgPkStatWindowSz_BfGet(device, + NULL, + txCfrBaseAddr, + 0U, + &tmpReadbackVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading statistics window size"); + goto cleanup; + } + + cfrStatisticsConfig->windowSize = tmpReadbackVal; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrStatisticsGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_CfrStatistics_t* const cfrStatistics, + const adi_adrv904x_TxChannels_e cfrTxChannelSel, + const uint8_t prevWindow, + const uint8_t clearStats) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxCfrRegChanAddr_e txCfrBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG; + uint32_t engineIdx = 0U; + + uint16_t* const cfrPeaksDetected[ADI_ADRV904X_NUM_OF_CFR_ENGINES] = { &cfrStatistics->cfrEngine1PeaksDetected, &cfrStatistics->cfrEngine2PeaksDetected, &cfrStatistics->cfrEngine3PeaksDetected }; + uint8_t* const cfrPeaksSkippedWFifo[ADI_ADRV904X_NUM_OF_CFR_ENGINES] = { &cfrStatistics->cfrEngine1PeaksSkippedWFifo, &cfrStatistics->cfrEngine2PeaksSkippedWFifo, &cfrStatistics->cfrEngine3PeaksSkippedWFifo }; + uint8_t* const cfrPeaksSkippedPFifo[ADI_ADRV904X_NUM_OF_CFR_ENGINES] = { &cfrStatistics->cfrEngine1PeaksSkippedPFifo, &cfrStatistics->cfrEngine2PeaksSkippedPFifo, &cfrStatistics->cfrEngine3PeaksSkippedPFifo }; + uint16_t* const cfrPeaksSkippedCPC[ADI_ADRV904X_NUM_OF_CFR_ENGINES] = { &cfrStatistics->cfrEngine1PeaksSkippedCPC, &cfrStatistics->cfrEngine2PeaksSkippedCPC, &cfrStatistics->cfrEngine3PeaksSkippedCPC }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cfrStatistics, cleanup); + + /* Check if prevWindow parameter is valid */ + if (prevWindow > ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + prevWindow, + "prevWindow value is invalid. Valid values 0-1"); + goto cleanup; + } + + /* Check if clearStats parameter is valid */ + if (clearStats > ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + clearStats, + "clearStats value is invalid. Valid values 0-1"); + goto cleanup; + } + + recoveryAction = adrv904x_CfrRegsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(cfrTxChannelSel), &txCfrBaseAddr); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cfrTxChannelSel, "Invalid Tx Channel used to determine CFR base address"); + goto cleanup; + } + + for (engineIdx = 0U; engineIdx < ADI_ADRV904X_NUM_OF_CFR_ENGINES; ++engineIdx) + { + recoveryAction = adrv904x_TxCfrReg_CfrDbgPkReadStat_BfSet(device, + NULL, + txCfrBaseAddr, + engineIdx, + ADI_TRUE); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while updating CFR statistics"); + goto cleanup; + } + + if (prevWindow == ADI_TRUE) + { + /* Read number of peaks detected */ + recoveryAction = adrv904x_TxCfrReg_CfrDbgPkFoundPrvWin_BfGet(device, + NULL, + txCfrBaseAddr, + engineIdx, + cfrPeaksDetected[engineIdx]); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading peaks detected"); + goto cleanup; + } + + /* Read number of peaks skipped at weight FIFO */ + recoveryAction = adrv904x_TxCfrReg_CfrDbgPkLostWfPrvWin_BfGet(device, + NULL, + txCfrBaseAddr, + engineIdx, + cfrPeaksSkippedWFifo[engineIdx]); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading peaks skipped at weight FIFO"); + goto cleanup; + } + + /* Read number of peaks skipped at peak FIFO */ + recoveryAction = adrv904x_TxCfrReg_CfrDbgPkLostPfPrvWin_BfGet(device, + NULL, + txCfrBaseAddr, + engineIdx, + cfrPeaksSkippedPFifo[engineIdx]); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading peaks skipped at peak FIFO"); + goto cleanup; + } + + /* Read number of peaks skipped at CPC */ + recoveryAction = adrv904x_TxCfrReg_CfrDbgPkLostCpcPrvWin_BfGet(device, + NULL, + txCfrBaseAddr, + engineIdx, + cfrPeaksSkippedCPC[engineIdx]); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading peaks skipped at CPC"); + goto cleanup; + } + } + else + { + /* Read number of peaks detected */ + recoveryAction = adrv904x_TxCfrReg_CfrDbgPkFoundCurWin_BfGet(device, + NULL, + txCfrBaseAddr, + engineIdx, + cfrPeaksDetected[engineIdx]); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading peaks detected"); + goto cleanup; + } + + /* Read number of peaks skipped at weight FIFO */ + recoveryAction = adrv904x_TxCfrReg_CfrDbgPkLostWfCurWin_BfGet(device, + NULL, + txCfrBaseAddr, + engineIdx, + cfrPeaksSkippedWFifo[engineIdx]); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading peaks skipped at weight FIFO"); + goto cleanup; + } + + /* Read number of peaks skipped at peak FIFO */ + recoveryAction = adrv904x_TxCfrReg_CfrDbgPkLostPfCurWin_BfGet(device, + NULL, + txCfrBaseAddr, + engineIdx, + cfrPeaksSkippedPFifo[engineIdx]); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading peaks skipped at peak FIFO"); + goto cleanup; + } + + /* Read number of peaks skipped at CPC */ + recoveryAction = adrv904x_TxCfrReg_CfrDbgPkLostCpcCurWin_BfGet(device, + NULL, + txCfrBaseAddr, + engineIdx, + cfrPeaksSkippedCPC[engineIdx]); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading peaks skipped at CPC"); + goto cleanup; + } + } + } + + if (clearStats == ADI_TRUE) + { + /* Clear CFR statistics for all engines*/ + for (engineIdx = 0U; engineIdx < ADI_ADRV904X_NUM_OF_CFR_ENGINES; ++engineIdx) + { + recoveryAction = adrv904x_TxCfrReg_CfrDbgPkClrStat_BfSet(device, + NULL, + txCfrBaseAddr, + engineIdx, + ADI_TRUE); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while clearing CFR statistics"); + goto cleanup; + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +static adi_adrv904x_ErrAction_e readCfrPulseRam(adi_adrv904x_Device_t* const device, + const uint8_t interpolationRateMult, + int16_t* const coeffRealHalfPulse, + int16_t* const coeffImagHalfPulse, + const uint16_t numCoeffs, + const uint32_t baseAddr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + uint32_t rowMinSampleIdx = 0U; + uint32_t rowMaxSampleIdx = 0U; + uint32_t rowIdx = 0U; + uint32_t rowToRead[1] = { 0U }; + uint32_t sampleCounter = 0U; + uint32_t addressToRead = 0U; + uint32_t rowCounter = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffRealHalfPulse); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, coeffImagHalfPulse); + + for (rowIdx = 0; rowIdx < ADI_ADRV904X_CFR_PULSE_RAM_NUM_OF_ROWS; rowIdx++) + { + rowMaxSampleIdx = rowMinSampleIdx + interpolationRateMult * 3; + + if (numCoeffs > rowMaxSampleIdx) + { + rowCounter = 0U; + for (sampleCounter = rowMinSampleIdx; + sampleCounter < (rowMinSampleIdx + (ADI_ADRV904X_CFR_PULSE_RAM_ROW_SAMPLE_SIZE * interpolationRateMult)); + sampleCounter += interpolationRateMult) + { + addressToRead = baseAddr + rowIdx * ADI_ADRV904X_CFR_PULSE_RAM_ROW_SIZE + rowCounter; + + recoveryAction = adi_adrv904x_Register32Read(device, + NULL, + addressToRead, + (uint32_t*)&rowToRead[0U], + 0xFFFFFFFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register Read Issue"); + return recoveryAction; + } + + coeffRealHalfPulse[sampleCounter] = (int16_t)((rowToRead[0] >> 0U) & 0x0000FFFFU); + coeffImagHalfPulse[sampleCounter] = (int16_t)((rowToRead[0] >> 16U) & 0x0000FFFFU); + rowCounter += ADI_ADRV904X_CFR_PULSE_RAM_ROW_SAMPLE_SIZE; + } + } + + rowMinSampleIdx = (rowMaxSampleIdx + interpolationRateMult) % 1023U; + } + + return recoveryAction; +} +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrCorrectionPulseWrite(adi_adrv904x_Device_t* const device, + const uint32_t cfrTxChannelMask, + const adi_adrv904x_CfrCorrectionPulse_t cfrCorrectionPulses[], + const uint32_t numCorrectionPulses) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxCfrRegChanAddr_e txCfrBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG; + uint32_t pulseIdx = 0U; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + uint8_t interpolationRate = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cfrCorrectionPulses, cleanup); + + /*Check that if requested Tx Channel valid*/ + if (((cfrTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || + (cfrTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + /* Check that if pulse data is valid */ + for (pulseIdx = 0U; pulseIdx < numCorrectionPulses; ++pulseIdx) + { + recoveryAction = adrv904x_CfrPulseWriteRangeCheck(device, &cfrCorrectionPulses[pulseIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CFR pulse range check failed"); + goto cleanup; + } + } + + for (pulseIdx = 0U; pulseIdx < numCorrectionPulses; ++pulseIdx) + { + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(cfrTxChannelMask, chanSel)) + { + recoveryAction = adrv904x_CfrRegsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txCfrBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid Tx Channel used to determine CFR base address"); + goto cleanup; + } + + /* Check if we're writing to the pulse which is being used actively */ + recoveryAction = adrv904x_CfrActivePulseUpdateCheck(device, + (adi_adrv904x_TxChannels_e)(chanSel), + cfrCorrectionPulses[pulseIdx].pulseSelectMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cfrCorrectionPulses[pulseIdx].pulseSelectMask, "Requested pulse is actively being used by CFR engine"); + goto cleanup; + } + + /* Write Pulse 0 */ + if (ADRV904X_BF_EQUAL(cfrCorrectionPulses[pulseIdx].pulseSelectMask, ADI_ADRV904X_CFR_PULSE0)) + { + recoveryAction = adrv904x_TxCfrReg_Cfr0PulInterp_BfGet(device, + NULL, + txCfrBaseAddr, + &interpolationRate); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading interpolation rate"); + goto cleanup; + } + + recoveryAction = adrv904x_CfrCorrectionPulseWrite(device, + ADI_ADRV904X_CFR_PULSE0, + chanIdx, + interpolationRate, + &cfrCorrectionPulses[pulseIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing the pulse 0"); + goto cleanup; + } + } + + /* Write Pulse 1*/ + if (ADRV904X_BF_EQUAL(cfrCorrectionPulses[pulseIdx].pulseSelectMask, ADI_ADRV904X_CFR_PULSE1)) + { + recoveryAction = adrv904x_TxCfrReg_Cfr1PulInterp_BfGet(device, + NULL, + txCfrBaseAddr, + &interpolationRate); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading interpolation rate"); + goto cleanup; + } + + recoveryAction = adrv904x_CfrCorrectionPulseWrite(device, + ADI_ADRV904X_CFR_PULSE1, + chanIdx, + interpolationRate, + &cfrCorrectionPulses[pulseIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing the pulse 1"); + goto cleanup; + } + } + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrCorrectionPulseRead(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e cfrTxChannelSel, + adi_adrv904x_CfrCorrectionPulse_t* const cfrCorrectionPulse, + const adi_adrv904x_CfrPulseSel_e pulseSelect) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxCfrRegChanAddr_e txCfrBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG; + uint32_t pulseBaseAddresses[ADI_ADRV904X_MAX_TXCHANNELS] = {ADI_ADVRV904X_TX0_PULSE_RAM_BASEADDR, + ADI_ADVRV904X_TX1_PULSE_RAM_BASEADDR, + ADI_ADVRV904X_TX2_PULSE_RAM_BASEADDR, + ADI_ADVRV904X_TX3_PULSE_RAM_BASEADDR, + ADI_ADVRV904X_TX4_PULSE_RAM_BASEADDR, + ADI_ADVRV904X_TX5_PULSE_RAM_BASEADDR, + ADI_ADVRV904X_TX6_PULSE_RAM_BASEADDR, + ADI_ADVRV904X_TX7_PULSE_RAM_BASEADDR}; + + uint8_t interpolationRate = 0U; + uint8_t interpolationRateMult = 0U; + uint32_t baseAddrToRead = 0U; + uint32_t addrOffset = 0U; + uint16_t halfPulseLength = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cfrCorrectionPulse, cleanup); + + ADI_LIBRARY_MEMSET(&cfrCorrectionPulse->coeffImagHalfPulse, 0, (sizeof(int16_t) * ADI_ADRV904X_MAX_CFR_CORRECTION_PULSE_LEN)); + ADI_LIBRARY_MEMSET(&cfrCorrectionPulse->coeffRealHalfPulse, 0, (sizeof(int16_t) * ADI_ADRV904X_MAX_CFR_CORRECTION_PULSE_LEN)); + + recoveryAction = adrv904x_CfrRegsBitfieldAddressGet(device, cfrTxChannelSel, &txCfrBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cfrTxChannelSel, "Invalid Tx Channel used to determine CFR base address"); + goto cleanup; + } + + switch (cfrTxChannelSel) + { + case ADI_ADRV904X_TX0: + baseAddrToRead = pulseBaseAddresses[0]; + break; + case ADI_ADRV904X_TX1: + baseAddrToRead = pulseBaseAddresses[1]; + break; + case ADI_ADRV904X_TX2: + baseAddrToRead = pulseBaseAddresses[2]; + break; + case ADI_ADRV904X_TX3: + baseAddrToRead = pulseBaseAddresses[3]; + break; + case ADI_ADRV904X_TX4: + baseAddrToRead = pulseBaseAddresses[4]; + break; + case ADI_ADRV904X_TX5: + baseAddrToRead = pulseBaseAddresses[5]; + break; + case ADI_ADRV904X_TX6: + baseAddrToRead = pulseBaseAddresses[6]; + break; + case ADI_ADRV904X_TX7: + baseAddrToRead = pulseBaseAddresses[7]; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cfrTxChannelSel, "Invalid Tx Channel used to determine pulse base address"); + goto cleanup; + break; + } + + if ((pulseSelect != ADI_ADRV904X_CFR_PULSE0) && + (pulseSelect != ADI_ADRV904X_CFR_PULSE1)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, pulseSelect, "Invalid pulseSelect. Valid values are PULSE0/1"); + goto cleanup; + } + + /* Read Half pulse length*/ + if (pulseSelect == ADI_ADRV904X_CFR_PULSE0) + { + recoveryAction = adrv904x_TxCfrReg_Cfr0PulHpl_BfGet(device, + NULL, + txCfrBaseAddr, + &halfPulseLength); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading half pulse length"); + goto cleanup; + } + + recoveryAction = adrv904x_TxCfrReg_Cfr0PulInterp_BfGet(device, + NULL, + txCfrBaseAddr, + &interpolationRate); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading interpolation rate"); + goto cleanup; + } + } + else + { + recoveryAction = adrv904x_TxCfrReg_Cfr1PulHpl_BfGet(device, + NULL, + txCfrBaseAddr, + &halfPulseLength); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading half pulse length"); + goto cleanup; + } + + recoveryAction = adrv904x_TxCfrReg_Cfr1PulInterp_BfGet(device, + NULL, + txCfrBaseAddr, + &interpolationRate); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading interpolation rate"); + goto cleanup; + } + } + + /* Interpolation rate in HW 0=1x // 1=2x // 2=4x*/ + interpolationRateMult = 1 << interpolationRate; + + /* Set RAM0 bank as shadow RAM */ + recoveryAction = adrv904x_TxCfrReg_CfrRamShadowRamSel_BfSet(device, + NULL, + txCfrBaseAddr, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writin Shadow RAM bf"); + goto cleanup; + } + + /* Programmed half pulse length = Number of coefficents / interpolationRate - 1*/ + halfPulseLength = (halfPulseLength + 1U) * interpolationRateMult; + if (halfPulseLength != cfrCorrectionPulse->numCoeffs) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, halfPulseLength, "Half pulse length doesn't match the num of coefficients user requested"); + goto cleanup; + } + + addrOffset = (ADI_ADRV904X_CFR_PULSE_RAM_SIZE * 2U) + (ADI_ADRV904X_CFR_PULSE_RAM_SIZE * ((uint32_t)pulseSelect - 1U)); + recoveryAction = readCfrPulseRam(device, + interpolationRateMult, + cfrCorrectionPulse->coeffRealHalfPulse, + cfrCorrectionPulse->coeffImagHalfPulse, + cfrCorrectionPulse->numCoeffs, + (baseAddrToRead + addrOffset)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CFR pulse read failed"); + goto cleanup; + } + + cfrCorrectionPulse->pulseSelectMask = (uint8_t)pulseSelect; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + + +static adi_adrv904x_ErrAction_e adrv904x_CfrActiveConfigUpdateCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e cfrTxChannelSel, + const uint32_t configSelectMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_CfrConfigSel_e activeCfgReadBack = ADI_ADRV904X_CFR_CFG0; + adi_adrv904x_CfrConfig_t activeCfrConfig; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_LIBRARY_MEMSET(&activeCfrConfig, 0, sizeof(adi_adrv904x_CfrConfig_t)); + + /* Readback the active config for this channel */ + recoveryAction = adi_adrv904x_CfrActiveCfgGet(device, + cfrTxChannelSel, + &activeCfgReadBack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, activeCfgReadBack, "Error while reading active config"); + return recoveryAction; + } + + /* Read the current CFR config */ + recoveryAction = adi_adrv904x_CfrEnableGet(device, + &activeCfrConfig.cfrEngineEnable[0], + &activeCfrConfig.cfrEngineBypass[0], + ADI_ADRV904X_NUM_OF_CFR_ENGINES, + cfrTxChannelSel, + (uint32_t)activeCfgReadBack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, activeCfgReadBack, "Error while reading CFR config"); + return recoveryAction; + } + + if ((activeCfrConfig.cfrEngineEnable[0] == ADI_TRUE) || + (activeCfrConfig.cfrEngineEnable[1] == ADI_TRUE) || + (activeCfrConfig.cfrEngineEnable[2] == ADI_TRUE)) + { + /* Report error if any of the CFR engines are enabled and user is writing to active config */ + if (ADRV904X_BF_EQUAL(configSelectMask, activeCfgReadBack)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + configSelectMask, + "Selected config is actively being used by CFR block"); + return recoveryAction; + } + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e adrv904x_CfrActivePulseUpdateCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e cfrTxChannelSel, + const uint32_t pulseSelectMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_CfrPulseSel_e activePulseReadBack = ADI_ADRV904X_CFR_PULSE0; + adi_adrv904x_CfrConfigSel_e activeCfgReadBack = ADI_ADRV904X_CFR_CFG0; + adi_adrv904x_CfrConfig_t activeCfrConfig; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_LIBRARY_MEMSET(&activeCfrConfig, 0, sizeof(adi_adrv904x_CfrConfig_t)); + + /* Readback the active pulse for this channel */ + recoveryAction = adi_adrv904x_CfrActivePulseGet(device, + cfrTxChannelSel, + &activePulseReadBack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, activePulseReadBack, "Error while reading active pulse"); + return recoveryAction; + } + + /* Readback the active config for this channel */ + recoveryAction = adi_adrv904x_CfrActiveCfgGet(device, + cfrTxChannelSel, + &activeCfgReadBack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, activeCfgReadBack, "Error while reading active config"); + return recoveryAction; + } + + /* Read the current CFR config */ + recoveryAction = adi_adrv904x_CfrEnableGet(device, + &activeCfrConfig.cfrEngineEnable[0], + &activeCfrConfig.cfrEngineBypass[0], + ADI_ADRV904X_NUM_OF_CFR_ENGINES, + cfrTxChannelSel, + (uint32_t)activeCfgReadBack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, activeCfgReadBack, "Error while reading CFR config"); + return recoveryAction; + } + + if ((activeCfrConfig.cfrEngineEnable[0] == ADI_TRUE) || + (activeCfrConfig.cfrEngineEnable[1] == ADI_TRUE) || + (activeCfrConfig.cfrEngineEnable[2] == ADI_TRUE)) + { + /* Report error if any of the CFR engines are enabled and user is writing to active pulse */ + if (ADRV904X_BF_EQUAL(pulseSelectMask, activePulseReadBack)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pulseSelectMask, + "Selected pulse is actively being used by CFR block"); + return recoveryAction; + } + } + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrControlPeakDurationSet(adi_adrv904x_Device_t* const device, + const uint32_t cfrTxChannelMask, + const uint32_t configSelectMask, + const uint8_t samplesCount) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + uint8_t txChanIdx = 0U; + uint8_t txChanSel = 0U; + uint8_t NUMBER_OF_ENGINES = 3U; + uint8_t engineIdx = 0U; + adrv904x_BfTxCfrRegChanAddr_e txCfrRegAddr[ADI_ADRV904X_MAX_TXCHANNELS] = + { + ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG, + ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG, + ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG, + ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG, + ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG, + ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG, + ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG, + ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Check that if requested Tx Channel valid */ + if (((cfrTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || + (cfrTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + /* Check that if requested config set is valid */ + if (((configSelectMask & (~(uint32_t)ADI_ADRV904X_CFR_CFGALL)) != 0U) || + (configSelectMask == 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + configSelectMask, + "Invalid configuration selected. Valid values are any combinations of CFG0/1"); + goto cleanup; + } + + for (txChanIdx = 0U; txChanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++txChanIdx) + { + txChanSel = 1U << txChanIdx; + + /* Skipping unselected channels */ + if ((txChanSel & cfrTxChannelMask) == 0U) + { + continue; + } + + /* Verify that the selected CFG is not currently active */ + recoveryAction = adrv904x_CfrActiveConfigUpdateCheck(device, + (adi_adrv904x_TxChannels_e)(txChanSel), + configSelectMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, configSelectMask, "Requested configuration is actively being used by CFR engine"); + goto cleanup; + } + + for (engineIdx = 0; engineIdx < NUMBER_OF_ENGINES; engineIdx++) + { + if ((configSelectMask & ADI_ADRV904X_CFR_CFG0) != 0u) + { + recoveryAction = adrv904x_TxCfrReg_Cfr0CtrlPkDur_BfSet(device, + NULL, + txCfrRegAddr[txChanIdx], + engineIdx, + samplesCount); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, engineIdx, "Error while setting CFR 0 Peak Duration for the selected CFR engine"); + goto cleanup; + } + } + else if ((configSelectMask & ADI_ADRV904X_CFR_CFG1) != 0u) + { + recoveryAction = adrv904x_TxCfrReg_Cfr1CtrlPkDur_BfSet(device, + NULL, + txCfrRegAddr[txChanIdx], + engineIdx, + samplesCount); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, engineIdx, "Error while setting CFR 1 Peak Duration for the selected CFR engine"); + goto cleanup; + } + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrControlPeakDurationGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannelSel, + const adi_adrv904x_CfrConfigSel_e configSelect, + uint8_t* const samplesCount) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxCfrRegChanAddr_e txCfrRegAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, samplesCount, cleanup); + + /* Check that if requested Tx Channel valid and get address */ + switch (txChannelSel) + { + case ADI_ADRV904X_TX0: + txCfrRegAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG; + break; + case ADI_ADRV904X_TX1: + txCfrRegAddr = ADRV904X_BF_SLICE_TX_1__TX_DFE_TX_CFR_TX_CFR_REG; + break; + case ADI_ADRV904X_TX2: + txCfrRegAddr = ADRV904X_BF_SLICE_TX_2__TX_DFE_TX_CFR_TX_CFR_REG; + break; + case ADI_ADRV904X_TX3: + txCfrRegAddr = ADRV904X_BF_SLICE_TX_3__TX_DFE_TX_CFR_TX_CFR_REG; + break; + case ADI_ADRV904X_TX4: + txCfrRegAddr = ADRV904X_BF_SLICE_TX_4__TX_DFE_TX_CFR_TX_CFR_REG; + break; + case ADI_ADRV904X_TX5: + txCfrRegAddr = ADRV904X_BF_SLICE_TX_5__TX_DFE_TX_CFR_TX_CFR_REG; + break; + case ADI_ADRV904X_TX6: + txCfrRegAddr = ADRV904X_BF_SLICE_TX_6__TX_DFE_TX_CFR_TX_CFR_REG; + break; + case ADI_ADRV904X_TX7: + txCfrRegAddr = ADRV904X_BF_SLICE_TX_7__TX_DFE_TX_CFR_TX_CFR_REG; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txChannelSel, + "Invalid Tx channel is selected. Valid values are Tx0/1/2/3/4/5/6/7"); + goto cleanup; + break; + } + + /* Use engine 0 to read value since all of the engines configured the same value */ + switch (configSelect) + { + case ADI_ADRV904X_CFR_CFG0: + recoveryAction = adrv904x_TxCfrReg_Cfr0CtrlPkDur_BfGet(device, + NULL, + txCfrRegAddr, + 0u, + samplesCount); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, configSelect, "Error while setting CFR Peak Duration for the selected CFG and CFR engine"); + goto cleanup; + } + break; + + case ADI_ADRV904X_CFR_CFG1: + recoveryAction = adrv904x_TxCfrReg_Cfr1CtrlPkDur_BfGet(device, + NULL, + txCfrRegAddr, + 0u, + samplesCount); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, configSelect, "Error while setting CFR Peak Duration for the selected CFG and CFR engine"); + goto cleanup; + } + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + configSelect, + "Invalid CFG selected."); + goto cleanup; + break; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrControlDelaySet(adi_adrv904x_Device_t* const device, + const uint32_t cfrTxChannelMask, + const uint16_t delay0, + const uint16_t delay1, + const uint16_t delay2) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const uint16_t maxDelay = 1023; + uint32_t txChanIdx = 0U; + uint32_t txChanSel = 0U; + uint32_t packedDelay = 0U; + + static const uint32_t txScratchPadAddr[] = { (uint32_t)ADRV904X_ADDR_TX0_STREAM_SCRATCH5, + (uint32_t)ADRV904X_ADDR_TX1_STREAM_SCRATCH5, + (uint32_t)ADRV904X_ADDR_TX2_STREAM_SCRATCH5, + (uint32_t)ADRV904X_ADDR_TX3_STREAM_SCRATCH5, + (uint32_t)ADRV904X_ADDR_TX4_STREAM_SCRATCH5, + (uint32_t)ADRV904X_ADDR_TX5_STREAM_SCRATCH5, + (uint32_t)ADRV904X_ADDR_TX6_STREAM_SCRATCH5, + (uint32_t)ADRV904X_ADDR_TX7_STREAM_SCRATCH5 }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Check that if requested Tx Channel valid */ + if (((cfrTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || + (cfrTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + /* Check that all 3 delay values are valid */ + if (delay0 > maxDelay) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + delay0, + "CFR delay is out of range. delay0"); + goto cleanup; + } + + if (delay1 > maxDelay) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + delay1, + "CFR delay is out of range. delay1"); + goto cleanup; + } + + if (delay2 > maxDelay) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + delay2, + "CFR delay is out of range. delay2"); + goto cleanup; + } + + packedDelay = (uint32_t) delay0; + packedDelay |= (uint32_t) delay1 << 10u; + packedDelay |= (uint32_t) delay2 << 20u; + + for (txChanIdx = 0U; txChanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++txChanIdx) + { + txChanSel = 1U << txChanIdx; + + if ((txChanSel & cfrTxChannelMask) != 0U) + { + /* Write to Tx stream proc scratch5 register (bits 29-0) + * Note: Not using BfSet because it writes the 4 bytes individually. + * We want to write the 30 bit parameter at once. + * Otherwise, if TX fall stream runs during that time, + * the delays written to the CFR block may be incorrect. + */ + recoveryAction = adi_adrv904x_Register32Write(device, + NULL, + txScratchPadAddr[txChanIdx], + packedDelay, + 0x3FFFFFFFU); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txScratchPadAddr[txChanIdx], + "Register32Write failed"); + goto cleanup; + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrControlDelayGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannelSel, + uint16_t* const delay0, + uint16_t* const delay1, + uint16_t* const delay2) +{ adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t txChanIdx = 0U; + uint32_t txChanSel = 0U; + uint32_t packedDelay = 0U; + const uint32_t delayMask = 0x3FFU; + + static const uint32_t txScratchPadAddr[] = { (uint32_t)ADRV904X_ADDR_TX0_STREAM_SCRATCH5, + (uint32_t)ADRV904X_ADDR_TX1_STREAM_SCRATCH5, + (uint32_t)ADRV904X_ADDR_TX2_STREAM_SCRATCH5, + (uint32_t)ADRV904X_ADDR_TX3_STREAM_SCRATCH5, + (uint32_t)ADRV904X_ADDR_TX4_STREAM_SCRATCH5, + (uint32_t)ADRV904X_ADDR_TX5_STREAM_SCRATCH5, + (uint32_t)ADRV904X_ADDR_TX6_STREAM_SCRATCH5, + (uint32_t)ADRV904X_ADDR_TX7_STREAM_SCRATCH5 }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, delay0, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, delay1, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, delay2, cleanup); + + /* Check that if requested Tx Channel valid */ + if ((txChannelSel == 0U) || + ((txChannelSel & (txChannelSel - 1)) != 0u)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txChannelSel, + "Invalid Tx channel is selected. Channel must be != 0 and only one channel allowed"); + goto cleanup; + } + + for (txChanIdx = 0U; txChanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++txChanIdx) + { + txChanSel = 1U << txChanIdx; + + if ((txChanSel & txChannelSel) != 0U) + { + /* Write to Tx stream proc scratch5 register (bits 29-0) + * Note: Not using BfSet because it writes the 4 bytes individually. + * We want to write the 30 bit parameter at once. + * Otherwise, if TX fall stream runs during that time, + * the delays written to the CFR block may be incorrect. + */ + recoveryAction = adi_adrv904x_Register32Read(device, + NULL, + txScratchPadAddr[txChanIdx], + &packedDelay, + 0xFFFFFFFF); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txScratchPadAddr[txChanIdx], + "Register32Read failed"); + goto cleanup; + } + + *delay0 = (uint16_t)(packedDelay & delayMask); + *delay1 = (uint16_t)((packedDelay >> 10) & delayMask); + *delay2 = (uint16_t)((packedDelay >> 20) & delayMask); + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_dfe_clgc.c b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_dfe_clgc.c new file mode 100644 index 00000000000..1fcaeda98b3 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_dfe_clgc.c @@ -0,0 +1,547 @@ +/** +* Copyright 2015 - 2022 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_dfe_clgc.c +* \brief Contains CLGC features related function implementations +* +* ADRV904X API Version: 2.10.0.4 +*/ +#include "adi_library_types.h" +#include "adi_adrv904x_dfe_clgc.h" +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_tx.h" +#include "adi_adrv904x_hal.h" +#include "adi_adrv904x_dfe_cpu.h" +#include "adi_adrv904x_dfe_cal_clgc_types.h" +#include "adi_adrv904x_dfe_framework_tracking_cal_t.h" +#include "../../private/include/adrv904x_platform_byte_order.h" +#include "../../private/include/adrv904x_dfe_cpu.h" + + +#define ADI_FILE ADI_ADRV904X_FILE_PUBLIC_DFE_CLGC + +static adi_adrv904x_ErrAction_e adrv904x_ClgcCaptureConfigSetRangeCheck(adi_adrv904x_Device_t* const device, + const uint32_t clgcTxChannelMask, + const adi_adrv904x_DfeAppCalClgcCaptureCfg_t* const clgcCaptureCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, clgcCaptureCfg); + + if (((clgcTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (clgcTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + clgcTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + if (clgcCaptureCfg->capMode > ADI_ADRV904X_DFE_APP_CAL_CLGC_CAPTURE_MODE_PEAK_DET) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + clgcCaptureCfg->capMode, + "Invalid capMode is selected"); + return recoveryAction; + } + + if (clgcCaptureCfg->numCapBatches < 1) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + clgcCaptureCfg->numCapBatches, + "Invalid numCapBatches is selected. It must be greater than 0"); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e adrv904x_ClgcTrackConfigSetRangeCheck(adi_adrv904x_Device_t* const device, + const uint32_t clgcTxChannelMask, + const adi_adrv904x_DfeAppCalClgcTrackCfg_t* const clgcTrackCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, clgcTrackCfg); + + if (((clgcTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (clgcTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + clgcTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + return recoveryAction; + } + + if (clgcTrackCfg->enClgc > 0x1u) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + clgcTrackCfg->enClgc, + "Invalid enClgc is selected. 1 is for enable and 0 is for disable."); + return recoveryAction; + } + + if (clgcTrackCfg->enPaProtect > 0x1u) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + clgcTrackCfg->enPaProtect, + "Invalid enPaProtect is selected. 1 is for enable and 0 is for disable."); + return recoveryAction; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + return recoveryAction; +} +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ClgcCaptureConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t clgcTxChannelMask, + const adi_adrv904x_DfeAppCalClgcCaptureCfg_t* const clgcCaptureCfg) +{ + const uint16_t CLGC_CTRL_CAPTURE_CONFIG_SET = ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_CAPTURE_CONFIG | + ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_COMMAND_FLAG | + ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_SET_FLAG; + adi_adrv904x_DfeAppCalClgcCaptureCfg_t tmpClgcCaptureCfg; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + uint32_t i = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, clgcCaptureCfg, cleanup); + + recoveryAction = adrv904x_ClgcCaptureConfigSetRangeCheck(device, clgcTxChannelMask, clgcCaptureCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Clgc Capture Config range check failed."); + goto cleanup; + } + + ADI_LIBRARY_MEMCPY((void *)&tmpClgcCaptureCfg, clgcCaptureCfg, sizeof(adi_adrv904x_DfeAppCalClgcCaptureCfg_t)); + + tmpClgcCaptureCfg.numCapBatches = ADRV904X_HTOCL(tmpClgcCaptureCfg.numCapBatches); + tmpClgcCaptureCfg.capDurationUs = ADRV904X_HTOCL(tmpClgcCaptureCfg.capDurationUs); + tmpClgcCaptureCfg.capMode = ADRV904X_HTOCL(tmpClgcCaptureCfg.capMode); + tmpClgcCaptureCfg.capPeriodUs = ADRV904X_HTOCL(tmpClgcCaptureCfg.capPeriodUs); + tmpClgcCaptureCfg.minOrxPowThres = ADRV904X_HTOCL(tmpClgcCaptureCfg.minOrxPowThres); + tmpClgcCaptureCfg.minTxPowThres = ADRV904X_HTOCL(tmpClgcCaptureCfg.minTxPowThres); + + for (i = 0; i < ADI_ADRV904X_MAX_TXCHANNELS; i++) + { + uint32_t txChan = (1 << i); + if (clgcTxChannelMask & txChan) + { + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + CLGC_CTRL_CAPTURE_CONFIG_SET, + (adi_adrv904x_Channels_e)txChan, + (const uint8_t*)&tmpClgcCaptureCfg, + sizeof(tmpClgcCaptureCfg), + &lengthResp, + NULL, + 0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChan, "Failed to send request"); + goto cleanup; + } + } + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ClgcCaptureConfigGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e clgcTxChannelSel, + adi_adrv904x_DfeAppCalClgcCaptureCfg_t* const clgcCaptureCfg) +{ + const uint16_t CLGC_CTRL_CAPTURE_CONFIG_GET = ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_CAPTURE_CONFIG | + ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_COMMAND_FLAG; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, clgcCaptureCfg, cleanup); + + /*Check that if requested Tx Channel valid*/ + /* Channel must contain a single channel number (0-7) */ + recoveryAction = adrv904x_DfeVerifyChannel((adi_adrv904x_Channels_e)clgcTxChannelSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, clgcTxChannelSel, "channel parameter is invalid."); + goto cleanup; + } + + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + CLGC_CTRL_CAPTURE_CONFIG_GET, + (adi_adrv904x_Channels_e)clgcTxChannelSel, + NULL, + 0, + &lengthResp, + (uint8_t*)clgcCaptureCfg, + sizeof(*clgcCaptureCfg)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, clgcTxChannelSel, "Failed to send request"); + goto cleanup; + } + + clgcCaptureCfg->numCapBatches = ADRV904X_CTOHL(clgcCaptureCfg->numCapBatches); + clgcCaptureCfg->capDurationUs = ADRV904X_CTOHL(clgcCaptureCfg->capDurationUs); + clgcCaptureCfg->capMode = ADRV904X_CTOHL(clgcCaptureCfg->capMode); + clgcCaptureCfg->capPeriodUs = ADRV904X_CTOHL(clgcCaptureCfg->capPeriodUs); + clgcCaptureCfg->minOrxPowThres = ADRV904X_CTOHL(clgcCaptureCfg->minOrxPowThres); + clgcCaptureCfg->minTxPowThres = ADRV904X_CTOHL(clgcCaptureCfg->minTxPowThres); + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ClgcTrackingConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t clgcTxChannelMask, + const adi_adrv904x_DfeAppCalClgcTrackCfg_t* const clgcTrackCfg) +{ + const uint16_t CLGC_CTRL_TRACK_CONFIG_SET = ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_TRACK_CONFIG | + ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_COMMAND_FLAG | + ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_SET_FLAG; + adi_adrv904x_DfeAppCalClgcTrackCfg_t tmpClgcTrackCfg; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + uint32_t i = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, clgcTrackCfg, cleanup); + + recoveryAction = adrv904x_ClgcTrackConfigSetRangeCheck(device, clgcTxChannelMask, clgcTrackCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Clgc Tracking Config range check failed."); + goto cleanup; + } + + ADI_LIBRARY_MEMCPY((void *)&tmpClgcTrackCfg, clgcTrackCfg, sizeof(adi_adrv904x_DfeAppCalClgcTrackCfg_t)); + + tmpClgcTrackCfg.enClgc = tmpClgcTrackCfg.enClgc; + tmpClgcTrackCfg.enPaProtect = tmpClgcTrackCfg.enPaProtect; + tmpClgcTrackCfg.expLoopPowGain = ADRV904X_HTOCL(tmpClgcTrackCfg.expLoopPowGain); + tmpClgcTrackCfg.maxLoopGainAdjustdB = ADRV904X_HTOCL(tmpClgcTrackCfg.maxLoopGainAdjustdB); + tmpClgcTrackCfg.maxTxAttenLimitdB = ADRV904X_HTOCL(tmpClgcTrackCfg.maxTxAttenLimitdB); + tmpClgcTrackCfg.minTxAttenLimitdB = ADRV904X_HTOCL(tmpClgcTrackCfg.minTxAttenLimitdB); + + for (i = 0; i < ADI_ADRV904X_MAX_TXCHANNELS; i++) + { + uint32_t txChan = (1 << i); + if (clgcTxChannelMask & txChan) + { + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + CLGC_CTRL_TRACK_CONFIG_SET, + (adi_adrv904x_Channels_e)txChan, + (const uint8_t*)&tmpClgcTrackCfg, + sizeof(tmpClgcTrackCfg), + &lengthResp, + NULL, + 0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChan, "Failed to send request"); + goto cleanup; + } + } + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ClgcTrackingConfigGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e clgcTxChannelSel, + adi_adrv904x_DfeAppCalClgcTrackCfg_t* const clgcTrackCfg) +{ + const uint16_t CLGC_CTRL_TRACK_CONFIG_GET = ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_TRACK_CONFIG | + ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_COMMAND_FLAG; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, clgcTrackCfg, cleanup); + + /*Check that if requested Tx Channel valid*/ + /* Channel must contain a single channel number (0-7) */ + recoveryAction = adrv904x_DfeVerifyChannel((adi_adrv904x_Channels_e)clgcTxChannelSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, clgcTxChannelSel, "channel parameter is invalid."); + goto cleanup; + } + + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + CLGC_CTRL_TRACK_CONFIG_GET, + (adi_adrv904x_Channels_e)clgcTxChannelSel, + NULL, + 0, + &lengthResp, + (uint8_t*)clgcTrackCfg, + sizeof(*clgcTrackCfg)); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, clgcTxChannelSel, "Failed to send request"); + goto cleanup; + } + + clgcTrackCfg->enClgc = clgcTrackCfg->enClgc; + clgcTrackCfg->enPaProtect = clgcTrackCfg->enPaProtect; + clgcTrackCfg->expLoopPowGain = ADRV904X_CTOHL(clgcTrackCfg->expLoopPowGain); + clgcTrackCfg->maxLoopGainAdjustdB = ADRV904X_CTOHL(clgcTrackCfg->maxLoopGainAdjustdB); + clgcTrackCfg->maxTxAttenLimitdB = ADRV904X_CTOHL(clgcTrackCfg->maxTxAttenLimitdB); + clgcTrackCfg->minTxAttenLimitdB = ADRV904X_CTOHL(clgcTrackCfg->minTxAttenLimitdB); + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ClgcTrackingRun(adi_adrv904x_Device_t* const device, + const uint32_t clgcTxChannelMask) +{ + const uint16_t CLGC_CTRL_TRACK_RUN_CMD = ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_TRACK_RUN | + ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_COMMAND_FLAG; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + uint32_t i = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + if (((clgcTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (clgcTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + clgcTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + + goto cleanup; + } + + for (i = 0; i < ADI_ADRV904X_MAX_TXCHANNELS; i++) + { + uint32_t txChan = (1 << i); + if (clgcTxChannelMask & txChan) + { + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + CLGC_CTRL_TRACK_RUN_CMD, + (adi_adrv904x_Channels_e)txChan, + NULL, + 0, + &lengthResp, + NULL, + 0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChan, "Failed to send request"); + goto cleanup; + } + } + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ClgcTrackingReset(adi_adrv904x_Device_t* const device, + const uint32_t clgcTxChannelMask) +{ + const uint16_t CLGC_CTRL_TRACK_RESET_CMD = ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_TRACK_RESET | + ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_COMMAND_FLAG; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + uint32_t i = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + if (((clgcTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (clgcTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + clgcTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + + goto cleanup; + } + + for (i = 0; i < ADI_ADRV904X_MAX_TXCHANNELS; i++) + { + uint32_t txChan = (1 << i); + if (clgcTxChannelMask & txChan) + { + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + CLGC_CTRL_TRACK_RESET_CMD, + (adi_adrv904x_Channels_e)txChan, + NULL, + 0, + &lengthResp, + NULL, + 0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChan, "Failed to send request"); + goto cleanup; + } + } + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeClgcCaptureBuffersAccessSet(adi_adrv904x_Device_t* const device, + const uint32_t clgcTxChannelMask, + adi_adrv904x_DfeAppFrameworkTrackingCalCapBufAccessSet_t* const clgcCapBufAccess) +{ + const uint16_t CLGC_CTRL_CAPTURE_BUF_ACCESS_SET = ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_CAPTURE_BUF_ACCESS | + ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_COMMAND_FLAG | + ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_SET_FLAG; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, clgcCapBufAccess, cleanup); + + recoveryAction = adrv904x_DfeCaptureBuffersAccessSet(device, + clgcTxChannelMask, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + CLGC_CTRL_CAPTURE_BUF_ACCESS_SET, + clgcCapBufAccess); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to send request"); + goto cleanup; + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeClgcCaptureBuffersAccessGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e clgcTxChannelSel, + adi_adrv904x_DfeAppFrameworkTrackingCalCapBufAccessGet_t* const clgcCapBufAccess) +{ + const uint16_t CLGC_CTRL_CAPTURE_BUF_ACCESS_GET = ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_CAPTURE_BUF_ACCESS | + ADI_ADRV904X_DFE_APP_CAL_CLGC_CTRL_COMMAND_FLAG; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, clgcCapBufAccess, cleanup); + + recoveryAction = adrv904x_DfeCaptureBuffersAccessGet(device, + clgcTxChannelSel, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + CLGC_CTRL_CAPTURE_BUF_ACCESS_GET, + clgcCapBufAccess); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to send request"); + goto cleanup; + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeClgcStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e clgcTxChannelSel, + adi_adrv904x_DfeAppCalClgcStatus_t* const clgcStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const adi_adrv904x_DfeAppFrameworkTrackingCalibrationMask_e calId = ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_TX_DPD_MASK; + adi_adrv904x_DfeAppCalClgcStatus_t clgcCalStatus; + + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, clgcStatus, cleanup); + + /*Check that if requested Tx Channel valid*/ + /* Channel must contain a single channel number (0-7) */ + recoveryAction = adrv904x_DfeVerifyChannel((adi_adrv904x_Channels_e)clgcTxChannelSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, clgcTxChannelSel, "channel parameter is invalid."); + goto cleanup; + } + + /* Use the common cal status get handler to get the data from the CPU */ + recoveryAction = adi_adrv904x_DfeCalExtendedStatusGet(device, + (adi_adrv904x_Channels_e)clgcTxChannelSel, + adrv904x_DfeTrackingCalToObjId(calId), + (uint8_t *)&clgcCalStatus, + sizeof(clgcCalStatus)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error getting tracking cal status."); + goto cleanup; + } + + /* Translate the response from the CPU */ + clgcStatus->hdr.errorCode = ADRV904X_CTOHL(clgcCalStatus.hdr.errorCode); + clgcStatus->hdr.iterCount = ADRV904X_CTOHL(clgcCalStatus.hdr.iterCount); + clgcStatus->hdr.percentComplete = ADRV904X_CTOHL(clgcCalStatus.hdr.percentComplete); + clgcStatus->hdr.performanceMetric = ADRV904X_CTOHL(clgcCalStatus.hdr.performanceMetric); + clgcStatus->hdr.updateCount = ADRV904X_CTOHL(clgcCalStatus.hdr.updateCount); + + clgcStatus->loopPowGain = ADRV904X_CTOHL(clgcCalStatus.loopPowGain); + clgcStatus->orxPwr = ADRV904X_CTOHL(clgcCalStatus.orxPwr); + clgcStatus->txAttenAdjdB = ADRV904X_CTOHL(clgcCalStatus.txAttenAdjdB); + clgcStatus->txPwr = ADRV904X_CTOHL(clgcCalStatus.txPwr); + clgcStatus->numCapBatchesRun = ADRV904X_CTOHL(clgcCalStatus.numCapBatchesRun); + clgcStatus->actCapDurationUs = ADRV904X_CTOHL(clgcCalStatus.actCapDurationUs); + clgcStatus->capStartRetryCount = ADRV904X_CTOHL(clgcCalStatus.capStartRetryCount); + clgcStatus->capAbortRetryCount = ADRV904X_CTOHL(clgcCalStatus.capAbortRetryCount); + clgcStatus->capInvalidRetryCount = ADRV904X_CTOHL(clgcCalStatus.capInvalidRetryCount); + clgcStatus->lowSigRetryCount = ADRV904X_CTOHL(clgcCalStatus.lowSigRetryCount); + clgcStatus->txAttenChangeCount = ADRV904X_CTOHL(clgcCalStatus.txAttenChangeCount); + clgcStatus->orxGainChangeCount = ADRV904X_CTOHL(clgcCalStatus.orxGainChangeCount); + clgcStatus->txAttenLimitCount = ADRV904X_CTOHL(clgcCalStatus.txAttenLimitCount); + clgcStatus->paProtectAssertCount = ADRV904X_CTOHL(clgcCalStatus.paProtectAssertCount); + clgcStatus->lowSigErrorCount = ADRV904X_CTOHL(clgcCalStatus.lowSigErrorCount); + clgcStatus->capAbortErrorCount = ADRV904X_CTOHL(clgcCalStatus.capAbortErrorCount); + clgcStatus->capInvalidErrorCount = ADRV904X_CTOHL(clgcCalStatus.capInvalidErrorCount); + clgcStatus->capStartErrorCount = ADRV904X_CTOHL(clgcCalStatus.capStartErrorCount); + clgcStatus->appExitRequestCount = ADRV904X_CTOHL(clgcCalStatus.appExitRequestCount); + clgcStatus->gainMonAssertedCount = ADRV904X_CTOHL(clgcCalStatus.gainMonAssertedCount); + clgcStatus->periodEndedErrorCount = ADRV904X_CTOHL(clgcCalStatus.periodEndedErrorCount); + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_dfe_cpu.c b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_dfe_cpu.c new file mode 100644 index 00000000000..0a3dc4bf28b --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_dfe_cpu.c @@ -0,0 +1,2665 @@ +/** +* Copyright 2015 - 2023 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_dfe_cpu.c +* \brief Contains CPU features related function implementation defined in +* adi_adrv904x_dfe_cpu.h +* +* ADRV904X API Version: 2.10.0.4 +*/ + + +#include "adi_adrv904x_dfe_cpu.h" +#include "adi_adrv904x_dfe_framework_tracking_cal_t.h" +#include "adi_adrv904x_dfe_svc_log_trace_events_t.h" +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_hal.h" +#include "adi_adrv904x_error_type_action.h" +#include "adi_adrv904x_cpu.h" +#include "adi_adrv904x_cpu_sys_types.h" +#include "../../private/include/adrv904x_cpu_cmd_cal_status.h" +#include "../../private/include/adrv904x_cpu_cmd_ctrl.h" +#include "../../private/bf/adrv904x_bf_core_types.h" +#include "../../private/bf/adrv904x_bf_core.h" +#include "../../private/include/adrv904x_init.h" +#include "../../private/include/adrv904x_dfe_framework_cmd_t.h" +#include "../../private/include/adrv904x_dfe_memory.h" +#include "../../private/include/adrv904x_dfe_svc_bbic_bridge_t.h" +#include "../../private/include/adrv904x_cpu_scratch_registers.h" +#include "../../private/include/adrv904x_dfe_svc_err_dfe_boot_status_t.h" +#include "../../private/include/adrv904x_cpu.h" +#include "../../private/include/adrv904x_gpio.h" +#include "../../private/include/adrv904x_dfe_cpu.h" +#include "../../private/include/adrv904x_cpu_dfe_init_memory.h" +#include "../../private/include/adrv904x_cpu_archive_types.h" +#include "../../private/include/adrv904x_dfe_memory.h" +#include "../../private/include/adrv904x_radioctrl.h" +#include "../../private/include/adrv904x_dfe_svc_cmd_t.h" +#include "../../private/include/adrv904x_dfe_framework_cmd_sys_status_t.h" +#include "../../private/include/adrv904x_dfe_svc_bbic_bridge_t.h" + + +#define ADI_FILE ADI_ADRV904X_FILE_PUBLIC_DFE_CPU +#define ADI_ADRV904X_CPU_BINARY_IMAGE_LOAD_HEADER_BYTES (sizeof(uint32_t) + sizeof(adrv904x_CpuArchiveHeader_t) ) +#define ADRV904X_DFE_CPU_CRC_SEED 0xFFFFFFFFU + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeLoadGet( adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeCpuLoad_t* const pDfeLoad) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_DfeSvcCmdCpuAndMemLoadGetResp_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pDfeLoad, cleanup); + + ADI_LIBRARY_MEMSET(pDfeLoad, 0, sizeof(adi_adrv904x_DfeCpuLoad_t)); + ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_CPU_LOAD_GET, + 0U, + 0U, + (void *)&respStruct, + sizeof(adrv904x_DfeSvcCmdCpuAndMemLoadGetResp_t), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DfeSvcCmdSend - DFE Load info get"); + goto cleanup; + } + + if (respStruct.status != ADI_ADRV904X_DFE_SVC_ERR_CODE_NO_ERROR) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, respStruct.status, "DFE load info status"); + goto cleanup; + } + + /* Copy response parameters to pDfeLoadInfo */ + ADI_LIBRARY_MEMCPY((adi_adrv904x_DfeCpuLoad_t*)pDfeLoad, (adi_adrv904x_DfeCpuLoad_t*)&(respStruct.load.cpuLoad), sizeof(adi_adrv904x_DfeCpuLoad_t)); + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuAndMemLoadGet( adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeCpuAndMemLoad_t* const pDfeLoad) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_DfeSvcCmdCpuAndMemLoadGetResp_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pDfeLoad, cleanup); + + ADI_LIBRARY_MEMSET(pDfeLoad, 0, sizeof(adi_adrv904x_DfeCpuAndMemLoad_t)); + ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_CPU_LOAD_GET, + 0U, + 0U, + (void *)&respStruct, + sizeof(adrv904x_DfeSvcCmdCpuAndMemLoadGetResp_t), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DfeSvcCmdSend - DFE Load info get"); + goto cleanup; + } + + if (respStruct.status != ADI_ADRV904X_DFE_SVC_ERR_CODE_NO_ERROR) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, respStruct.status, "DFE load info status"); + goto cleanup; + } + + /* Copy response parameters to pDfeLoadInfo */ + ADI_LIBRARY_MEMCPY((adi_adrv904x_DfeCpuAndMemLoad_t*)pDfeLoad, (adi_adrv904x_DfeCpuAndMemLoad_t*)&(respStruct.load), sizeof(adi_adrv904x_DfeCpuAndMemLoad_t)); + + /* Convertion between BE and LE */ + pDfeLoad->memAvailable = ADRV904X_CTOHL(pDfeLoad->memAvailable); + pDfeLoad->memAllocated = ADRV904X_CTOHL(pDfeLoad->memAllocated); + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuStart(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + static const uint32_t A55_CONFIG_SIGNAL_ADDRESS = 0xb2220000U; + static const uint32_t CLK_RST_CTRL_CFG_ADDRESS = 0xb2210000U; + + static const uint32_t CPU_RVBARADDR0 = 0xb2220020U; + static const uint32_t CPU_RVBARADDR1 = 0xb2220040U; + static const uint32_t CPU_RVBARADDR2 = 0xb2220060U; + static const uint32_t CPU_RVBARADDR3 = 0xb2220080U; + + uint32_t a55CfgSignalRegVal = 0xF0FU; /* 111100001111 : 64 bit architecture, others default */ + uint32_t resetVectorAddress = ADRV904X_DFE_CODE_MEM_REGION_START; + + uint32_t clkRstCtrlCfgRegVal = 0x280001U; + uint32_t READ_WRITE_MASK = 0xFFFFFFFFU; + + /* Check if M4 radio processor is up and running */ + recoveryAction = adi_adrv904x_CpuStartStatusCheck(device, ADI_ADRV904X_GETCPUBOOTUP_TIMEOUT_US); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Radio Processor Need to be up and running before DFE processor Boot."); + goto cleanup; + } + + /* MMR Configuration: A55_CONFIG_SIGNAL_ADDRESS : Select 64 bit architecture, rest all default 111100001111 + + Bits Name Description Reset + 31:24 CLUSTERIDAFF3 Value read in ClusterID Affinity Level-3 field, MPIDR bits[39:32]. 'h00 + 23:16 CLUSTERIDAFF2 Value read in ClusterID Affinity Level-2 field, MPIDR bits[23:16]. 'h00 + 15:12 VINITHI Enable high exception vectors,0:Starts at 0x00000000;1:Starts at 0xFFFF0000.'h0 + 11:08 CFGTE Enable Thumb exceptions, 0 TE is LOW, 1 TE is HIGH 'hf + 7:04 CFGEND Endianness configuration .0 EE bit is LOW; 1 EE bit is HIGH. 'h0 + 3:00 AA64NAA32 Register width state. The options are: 0 AArch32; 1 AArch64. 'hF + */ + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, A55_CONFIG_SIGNAL_ADDRESS, a55CfgSignalRegVal, READ_WRITE_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to write to DFE A55_CONFIG_SIGNALS"); + goto cleanup; + } + + /* Set reset vector base address for all cores in registers RVBARADDR0/1/2/3 */ + /* Core 0 */ + recoveryAction = adi_adrv904x_Register32Write(device, NULL, CPU_RVBARADDR0, resetVectorAddress, READ_WRITE_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to write to DFE RVBARADDR0"); + goto cleanup; + } + + /* Core 1 */ + recoveryAction = adi_adrv904x_Register32Write(device, NULL, CPU_RVBARADDR1, resetVectorAddress, READ_WRITE_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to write to DFE RVBARADDR1"); + goto cleanup; + } + + /* Core 2 */ + recoveryAction = adi_adrv904x_Register32Write(device, NULL, CPU_RVBARADDR2, resetVectorAddress, READ_WRITE_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to write to DFE RVBARADDR2"); + goto cleanup; + } + + /* Core 3 */ + recoveryAction = adi_adrv904x_Register32Write(device, NULL, CPU_RVBARADDR3, resetVectorAddress, READ_WRITE_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to write to DFE RVBARADDR3"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, CLK_RST_CTRL_CFG_ADDRESS, clkRstCtrlCfgRegVal, READ_WRITE_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to write to DFE CLK_RST_CTRL_CFG"); + goto cleanup; + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuImageLoad(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeCpuBinaryInfo_t* const cpuDfeBinaryInfo) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + FILE* cpuImageFilePtr = NULL; + uint32_t fileSize = 0U; + uint32_t byteCount = 0U; + uint32_t offset = 0U; + uint32_t fileCRC = 0U; + uint32_t crc = ADRV904X_DFE_CPU_CRC_SEED; + + uint8_t streamingEnabled = 0U; + uint8_t cpuImageChunk[ADI_ADRV904X_CPU_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES] = { 0 }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuDfeBinaryInfo, cleanup); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuDfeBinaryInfo->filePath, cleanup); + + recoveryAction = adrv904x_PackagingInformationValidate(device, cpuDfeBinaryInfo); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot validate DFE package"); + goto cleanup; + } + + if (ADI_LIBRARY_STRNLEN((const char*)cpuDfeBinaryInfo->filePath, ADI_ADRV904X_MAX_FILE_LENGTH) == ADI_ADRV904X_MAX_FILE_LENGTH) + { + /* Path is not terminated */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuDfeBinaryInfo->filePath, "Unterminated path string"); + goto cleanup; + } + + /* Open CPU archive file */ +#ifdef __GNUC__ + cpuImageFilePtr = ADI_LIBRARY_FOPEN((const char *)cpuDfeBinaryInfo->filePath, "rb"); +#else + if (ADI_LIBRARY_FOPEN_S(&cpuImageFilePtr, (const char *)cpuDfeBinaryInfo->filePath, "rb") != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuDfeBinaryInfo->filePath, "Invalid Binary File or Path Detected"); + goto cleanup; + } +#endif + if (NULL == cpuImageFilePtr) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuDfeBinaryInfo->filePath, "Invalid Binary File or Path Detected"); + goto cleanup; + } + + /* Determine file size */ + if (ADI_LIBRARY_FSEEK(cpuImageFilePtr, 0U, SEEK_END) != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuDfeBinaryInfo->filePath, "Seek to EOF Failed"); + goto cleanup; + } + + /* ADI_LIBRARY_FTELL returns long type */ + fileSize = (uint32_t) ADI_LIBRARY_FTELL(cpuImageFilePtr); + + /* Check if DFE Cpu Image File is Empty */ + if (fileSize == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuDfeBinaryInfo->filePath, "Zero Length DFE Cpu Image Detected"); + goto cleanup; + } + + /* Check that size of the file is a multiple of 4 */ + if ((fileSize & 0x3U) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuDfeBinaryInfo->filePath, "Incorrect DFE Cpu Binary File Block Size"); + goto cleanup; + } + + /* Rewind the file pointer to beginning of the file */ + if (ADI_LIBRARY_FSEEK(cpuImageFilePtr,0L, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuDfeBinaryInfo->filePath, "Unable to Rewind File Pointer for DFE Cpu Binary"); + goto cleanup; + } + + /* read fileCRC */ + byteCount = ADI_LIBRARY_FREAD(&fileCRC, 1, sizeof(fileCRC), cpuImageFilePtr); + if ( byteCount != sizeof(fileCRC) ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuDfeBinaryInfo->filePath, "Error reading File CRC from CPU image file"); + goto cleanup; + } + fileCRC = ADRV904X_CTOHL( fileCRC ); + + /* Read the header */ + byteCount = ADI_LIBRARY_FREAD(&cpuImageChunk[0U], 1, sizeof(adrv904x_CpuArchiveHeader_t), cpuImageFilePtr); + if (byteCount != sizeof(adrv904x_CpuArchiveHeader_t) ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuDfeBinaryInfo->filePath, "Unable to Read Header from CPU image file"); + goto cleanup; + } + + crc = adrv904x_DfeCrc32Chunk( &cpuImageChunk[0U], byteCount, crc, 0 ); + + /* Put the part into streaming mode to help facilitate the large, contiguous SPI writes */ + recoveryAction = adrv904x_SpiStreamingEntry(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue with entering Spi Streaming mode"); + goto cleanup; + } + streamingEnabled = 1U; + + /* enable ahb spi bridge */ + recoveryAction = adrv904x_Core_AhbSpiBridgeEnable_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADI_ENABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue while attempting to set ahb spi bridge enable bit"); + goto cleanup; + } + + /* Load DFE CPU image */ + offset = ADRV904X_DFE_CODE_MEM_REGION_START; + fileSize -= ADI_ADRV904X_CPU_BINARY_IMAGE_LOAD_HEADER_BYTES; + while( fileSize > 0) + { + uint32_t blockSize = ( ADI_ADRV904X_CPU_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES < fileSize)? ADI_ADRV904X_CPU_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES : fileSize; + byteCount = ADI_LIBRARY_FREAD(&cpuImageChunk[0U], 1, blockSize, cpuImageFilePtr); + if (byteCount != blockSize) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuDfeBinaryInfo->filePath, "Error reading from CPU image file"); + goto cleanup; + } + /* SPI write the chunk to memory */ + recoveryAction = adi_adrv904x_RegistersByteWrite(device, NULL, offset, &cpuImageChunk[0U], blockSize); + offset += blockSize; + fileSize -= blockSize; + crc = adrv904x_DfeCrc32Chunk( &cpuImageChunk[0U], byteCount, crc, (fileSize == 0) ? 1:0 ); + } + + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error loading DFE CPU image"); + goto cleanup; + } + /* check the file CRC */ + if ( fileCRC != crc ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, crc, "DFE File CRC is invalid"); + goto cleanup; + } + + /* Load successful. Update device state. */ + device->devStateInfo.devState = (adi_adrv904x_ApiStates_e)(device->devStateInfo.devState | ADI_ADRV904X_STATE_DFECPULOADED); + + /* Close CPU Image File */ + if (0 == ADI_LIBRARY_FCLOSE(cpuImageFilePtr)) + { + cpuImageFilePtr = NULL; + } + else + { + cpuImageFilePtr = NULL; + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuDfeBinaryInfo->filePath, "Cannot Close CPU Image File"); + goto cleanup; + } + +cleanup: + + if (cpuImageFilePtr != NULL) + { + /* Close CPU Image File */ + if (0 != ADI_LIBRARY_FCLOSE(cpuImageFilePtr)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot Close DFE CPU Image File"); + } + } + + if (streamingEnabled) + { + if (ADI_ADRV904X_ERR_ACT_NONE != adrv904x_SpiStreamingExit(device)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_INTERFACE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Spi Streaming Exit Issue"); + } + } + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuStartStatusCheck(adi_adrv904x_Device_t* const device, + const uint32_t timeout_us) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_DfeSvcErrDfeBootStatus_e bootStatus = ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_POWER_UP; + uint32_t waitInterval_us = 0U; + uint32_t numEventChecks = 1U; + uint32_t eventCheck = 0U; + uint32_t readyForReload = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Determine the number of reads equivalent to the requested timeout */ + waitInterval_us = (ADI_ADRV904X_DFE_CPUBOOTUP_INTERVAL_US > timeout_us) ? + timeout_us : ADI_ADRV904X_DFE_CPUBOOTUP_INTERVAL_US; + numEventChecks = (waitInterval_us == 0U) ? 1U : (timeout_us / waitInterval_us); + + /* Note: Waits for the initial boot thread to complete. SDK services are expected + * to be up, but any threads spun up from the initial boot thread, such as the thread + * containing application_init() may or may not have completed by the time status = READY. + */ + for (eventCheck = 0U; eventCheck < numEventChecks; ++eventCheck) + { + /* Get the CPU boot status */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_DFE_BOOT_STATUS_SCRATCH_REG_ID, + (uint8_t*) &bootStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "bootStatus read failed"); + goto cleanup; + } + if (bootStatus == ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_FW_CRC_ERR || + bootStatus == ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_UNEXPECTED_ERR) + { + /* Known error conditions. No need to continue to wait. Error out now. */ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_DFE_CPU_BOOT, + bootStatus, + ADI_NO_VARIABLE, + recoveryAction); + + /* DFE boot error */ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_DFE_CPU, + ADI_ADRV904X_ERRCODE_DFE_CPU_BOOT_ERROR, + ADI_NO_VARIABLE, + recoveryAction); + goto cleanup; + } + else if (bootStatus == ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_READY) + { + /* CPU booted successfully to 'normal' mode */ + break; + } + else if (bootStatus == ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_READY_FOR_RELOAD) + { + /* If boot status is READY FOR RELOAD, exit early and let timeout error reporting return the boot status */ + readyForReload = 1U; + break; + } + else + { + /* Wait interval then check again */ + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_Wait_us(&device->common, waitInterval_us); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Wait failed"); + goto cleanup; + } + continue; + } + } + + if ((eventCheck >= numEventChecks) || + (readyForReload == 1U)) + { + /* Last boot state */ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_DFE_CPU_BOOT, + bootStatus, + bootStatus, + recoveryAction); + + /* Timeout message */ + ADI_ADRV904X_ERROR_INFO_GET_REPORT( ADI_ADRV904X_ERRSRC_DFE_CPU, + ADI_ADRV904X_ERRCODE_DFE_CPU_BOOT_TIMEOUT, + ADI_NO_VARIABLE, + recoveryAction); + + adrv904x_CpuErrorDebugCheck(device); + + adrv904x_DfeCpuErrorDebugCheck(device); + + goto cleanup; + } + + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuCheckException(adi_adrv904x_Device_t* const device, + uint32_t* const isException) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t address = 0U; + uint32_t coreIdx = 0U; + adrv904x_DfeSvcCmdDfeExceptionData_t exceptionData; + + /* Verify inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, isException, cleanup); + + /* Initialize output, local struct */ + *isException = 0U; + ADI_LIBRARY_MEMSET(&exceptionData, 0, sizeof(exceptionData)); + + /* Get DFE exception data address from CPU */ + recoveryAction = adrv904x_DfeSdkDataAddrGet(device, &address); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE exception data address"); + goto cleanup; + } + address += ADI_LIBRARY_OFFSETOF(adrv904x_DfeSvcBbicBridgeSdkData_t, dfeExceptionSnapshotData); + + /* Read the exception data */ + recoveryAction = adi_adrv904x_Registers32Read(device, NULL, address, (uint32_t*)&exceptionData, NULL, sizeof(adrv904x_DfeSvcCmdDfeExceptionData_t) / sizeof(uint32_t)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE exception data registers"); + goto cleanup; + } + + /* Analyse exception data for each DFE core */ + for (coreIdx = 0; coreIdx < ADRV904X_DFE_PLATFORM_NUM_CORES; coreIdx++) + { + if (exceptionData.ExceptionFlag[coreIdx] != (uint32_t)ADRV904X_DFE_PLATFORM_NO_EXCEPTION) + { + *isException |= (1U << coreIdx); + } + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePrepareLoad(adi_adrv904x_Device_t* const device, + const uint8_t reload) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + static const uint32_t CLK_RST_CTRL_CFG_ADDRESS = 0xb2210000U; + static const uint32_t A55_MISC_ADDRESS = 0xb22200a0U; + static const uint32_t L4CTL_CFG_INIT_START = 0xb0800024U; + static const uint32_t L4CTL_CFG_INIT_END = 0xb0b00024U; + static const uint32_t L4CTL_BANK_OFFSET = 0x100000U; /* Offset between L4CTL Bank addresses */ + static const uint32_t READ_WRITE_MASK = 0xFFFFFFFFU; + static const uint32_t L4_INIT_BANK_MASK = 0xFFU; + static const uint32_t L4_INIT_TIME_US = 1000U; + + uint8_t dummyWrite = 0U; + uint32_t i = 0U; + uint32_t clkRstCtrlCfgRegVal = 0x280000U; /* TRACECLK divider value CLK_RST_CTRL_CFG[21:19] */ + uint32_t a55MiscRegVal = 0U; + + adrv904x_DfeSvcCmdPrepareReload_t prepReload = { 0U }; + adrv904x_DfeSvcCmdPrepareReloadResp_t prepReloadResp = { ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED }; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + uint32_t dfeSwBootFlagAddr = ADRV904X_DFE_CPU_INIT_ADDR_GET(swBootFlag); + adrv904x_DfeSvcBbicBridgeSdkBootFlag_t dfeCpuBootFlag = ADRV904X_DFE_SVC_BBIC_BRIDGE_SDK_BOOT_FLAG_DEFAULT; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + if (reload > 0U) + { + /* Send SDK command to prepare for reload. Receive response */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_PREPARE_RELOAD, + (void*)&prepReload, + sizeof(adrv904x_DfeSvcCmdPrepareReload_t), + (void*)&prepReloadResp, + sizeof(adrv904x_DfeSvcCmdPrepareReloadResp_t), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(prepReloadResp.cmdStatus, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* Override Init Boot Flag as BBIC Reload */ + dfeCpuBootFlag = ADRV904X_DFE_SVC_BBIC_BRIDGE_SDK_BOOT_FLAG_BBIC_RELOAD; + } + + recoveryAction = adrv904x_Core_A55SysclkEnable_BfSet(device, NULL, ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue while attempting to set a55 sys clk enable"); + goto cleanup; + } + + /* Kill a55 clock by setting GLOBAL_A55_CLK_EN bit to zero */ + clkRstCtrlCfgRegVal &= ~(1U << 0U); + recoveryAction = adi_adrv904x_Register32Write(device, NULL, CLK_RST_CTRL_CFG_ADDRESS, clkRstCtrlCfgRegVal, READ_WRITE_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to write to CLK_RST_CTRL_CFG"); + goto cleanup; + } + + /* Setup A55 clock divider ratios */ + recoveryAction = adrv904x_Core_A55CclkDivideRatio_BfSet(device, NULL, ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue while attempting to set a55 Clk Divide Ratio"); + goto cleanup; + } + + recoveryAction = adrv904x_Core_A55CclkDivideRatioDevClk_BfSet(device, NULL, ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue while attempting to set a55 Clk Divide Ratio dev clk"); + goto cleanup; + } + + /* warm reset via CLK_RST_CTRL_CFG register bit3 (GLOBAL_WARM_SW_RST)*/ + clkRstCtrlCfgRegVal |= (1U << 3U); + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, CLK_RST_CTRL_CFG_ADDRESS, clkRstCtrlCfgRegVal, READ_WRITE_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to write to CLK_RST_CTRL_CFG"); + goto cleanup; + } + + /* Perform 3 dummy reads to pass time waiting for clocks to settle */ + for (i = 0U; i < 3U; i++) + { + recoveryAction = adrv904x_Core_ScratchPadWord_BfSet(device, NULL, (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, dummyWrite); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Dummy Readback issue"); + goto cleanup; + } + } + + clkRstCtrlCfgRegVal = 0x28FFB8U; + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, CLK_RST_CTRL_CFG_ADDRESS, clkRstCtrlCfgRegVal, READ_WRITE_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to write to CLK_RST_CTRL_CFG"); + goto cleanup; + } + + /* TODO: Assert common reset of sysClk sw rst bit in digital register (NOT YET DEFINED IN REGMAP)*/ + + /* Configure A55_CONFIG.A55_MISC register to define the L4 memory view. */ + + /* Set bit 16 (arb_scheme_a55_periph_fabric)*/ + a55MiscRegVal = (1U << 16U); + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, A55_MISC_ADDRESS, a55MiscRegVal, READ_WRITE_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to write to A55_MISC_ADDRESS"); + goto cleanup; + } + + /* zero fill each L4 memory cfg addresses*/ + for (i = L4CTL_CFG_INIT_START; i <= L4CTL_CFG_INIT_END; i += L4CTL_BANK_OFFSET) + { + /* clear bits for banks 0-7 */ + recoveryAction = adi_adrv904x_Register32Write(device, NULL, i, 0U, READ_WRITE_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to write to L4CTL_CFG_INIT"); + goto cleanup; + } + } + for (i = L4CTL_CFG_INIT_START; i <= L4CTL_CFG_INIT_END; i += L4CTL_BANK_OFFSET) + { + /* set bits for banks 0-7 */ + recoveryAction = adi_adrv904x_Register32Write(device, NULL, i, L4_INIT_BANK_MASK, READ_WRITE_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to write to L4CTL_CFG_INIT"); + goto cleanup; + } + } + + /* Give L4 RAMs time to initialize*/ + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_Wait_us(&device->common, L4_INIT_TIME_US); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "HAL Wait Request Issue"); + goto cleanup; + } + + /* Set init struct boot flag to indicate standard load vs. reload */ + recoveryAction = adi_adrv904x_RegistersByteWrite(device, NULL, dfeSwBootFlagAddr, &dfeCpuBootFlag, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot write sw test flag to DFE memory"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuReload(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeCpuBinaryInfo_t* const cpuDfeBinaryInfo) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_DfeSvcErrDfeBootStatus_e powerUpBootStatus = ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_POWER_UP; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuDfeBinaryInfo, cleanup); + + /* Prepare for Load */ + recoveryAction = adi_adrv904x_DfePrepareLoad(device, 1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DFE processor reload failed during prepare for load."); + goto cleanup; + } + + /* Load Images for all the DFE CPU cores*/ + recoveryAction = adi_adrv904x_DfeCpuImageLoad(device, cpuDfeBinaryInfo); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DFE processor reload failed during image load."); + goto cleanup; + } + + /* Reload the radio sequencer pattern table. + * This will do nothing if the radio sequencer is not enabled. + */ + recoveryAction = adrv904x_RadioSequencerDfePtrnLookupTableSet(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to reload radio sequencer pattern lookup table for DFE."); + goto cleanup; + } + + /* Set the CPU boot status to POWERUP */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_DFE_BOOT_STATUS_SCRATCH_REG_ID, + (uint8_t) powerUpBootStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "bootStatus set failed"); + goto cleanup; + } + + /* Start DFE CPU core(s) in broadcast mode*/ + recoveryAction = adi_adrv904x_DfeCpuStart(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DFE processor reload failed during start."); + goto cleanup; + } + + /* Check DFE processor boot status*/ + recoveryAction = adi_adrv904x_DfeCpuStartStatusCheck(device, ADI_ADRV904X_DFE_CPUBOOTUP_TIMEOUT_US); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DFE processor reload failed."); + goto cleanup; + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeAppCommand(adi_adrv904x_Device_t* const device, + const uint8_t command, + const uint8_t payload[], + const uint32_t payload_length, + const uint8_t response[], + const uint32_t response_length) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t txBuf[sizeof(adrv904x_CpuCmd_SetDfeConfigMaxSize_t)]; + uint8_t rxBuf[sizeof(adrv904x_CpuCmd_SetDfeConfigMaxSize_t)]; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + adrv904x_DfeAppFrameworkCmdGenericResp_t* const cmdRsp = (adrv904x_DfeAppFrameworkCmdGenericResp_t*)&rxBuf; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, payload, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, response, cleanup); + + /* payload pointer/length mismatch check is performed in adrv904x_CpuCmdSend */ + if (payload_length > sizeof(txBuf)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, payload_length, "payload_length is larger than transmit buffer size"); + goto cleanup; + } + + /* response pointer/length mismatch check is performed in adrv904x_CpuCmdSend */ + if (response_length > sizeof(rxBuf)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, response_length, "response_length is larger than receive buffer size"); + goto cleanup; + } + + ADI_LIBRARY_MEMSET(&txBuf[0U], 0, sizeof(txBuf)); + ADI_LIBRARY_MEMSET(&rxBuf[0U], 0, sizeof(rxBuf)); + ADI_LIBRARY_MEMCPY((void*)((uint8_t*)txBuf), payload, payload_length); + + /* Send command and receive response */ + recoveryAction = adrv904x_DfeAppCmdSend(device, + ADRV904X_LINK_ID_0, + command, + (void*)txBuf, + payload_length, + (void*)&rxBuf, + sizeof(rxBuf), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_APP_CMD_RESP_CHECK_GOTO(cmdRsp->status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* copy the command response back to the caller's buffer */ + ADI_LIBRARY_MEMCPY((void *)response, (void *)rxBuf, response_length); +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeTrackingCalsEnableSet(adi_adrv904x_Device_t* const device, + const uint32_t calMask, + const uint32_t channelMask, + const adi_adrv904x_DfeAppTrackingCalEnableDisable_t enableDisableFlag) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + adrv904x_DfeAppFrameworkCmdAppSetEnabledCals_t setTrackCal; + adrv904x_DfeAppFrameworkCmdAppSetEnabledCalsResp_t setTrackCalRsp; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_LIBRARY_MEMSET(&setTrackCal, 0, sizeof(adrv904x_DfeAppFrameworkCmdAppSetEnabledCals_t)); + ADI_LIBRARY_MEMSET(&setTrackCalRsp, 0, sizeof(adrv904x_DfeAppFrameworkCmdAppSetEnabledCalsResp_t)); + + setTrackCal.calMask = ADRV904X_HTOCL(calMask); + setTrackCal.channelMask = ADRV904X_HTOCL(channelMask); + setTrackCal.bEnable = (bool)enableDisableFlag; + + /* validate input parameters */ + if ((enableDisableFlag != ADI_ADRV904X_TRACKING_CAL_DISABLE) && (enableDisableFlag != ADI_ADRV904X_TRACKING_CAL_ENABLE)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, enableDisableFlag, "Invalid enableDisableFlag provided."); + goto cleanup; + } + + if (calMask == 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, calMask, "Invalid calMask provided."); + goto cleanup; + } + + /* channelMask == 0 is a valid input for system calibrations (e.g. SERDES cal), so it is not checked. */ + if ((channelMask & ~0xFFU) != 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMask, "Invalid channelMask provided."); + goto cleanup; + } + + /* Send command and receive response */ + recoveryAction = adrv904x_DfeAppCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_ENABLEDISABLE, + (void*)&setTrackCal, + sizeof(adrv904x_DfeAppFrameworkCmdAppSetEnabledCals_t), + (void*)&setTrackCalRsp, + sizeof(adrv904x_DfeAppFrameworkCmdAppSetEnabledCalsResp_t), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_APP_CMD_RESP_CHECK_GOTO(setTrackCalRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeTrackingCalsEnableGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeAppFrameworkTrackingCalEnableMasks_t* const enableMasks) +{ + uint32_t channelIdx = 0U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeAppErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_APP_ERR_CODE_NO_ERROR; + adrv904x_DfeAppFrameworkCmdAppGetEnabledTrackingCalsResp_t getTrackCalRsp; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, enableMasks, cleanup); + + ADI_LIBRARY_MEMSET(enableMasks, 0, sizeof(*enableMasks)); + ADI_LIBRARY_MEMSET(&getTrackCalRsp, 0, sizeof(adrv904x_DfeAppFrameworkCmdAppGetEnabledTrackingCalsResp_t)); + + /* Send command and receive response */ + recoveryAction = adrv904x_DfeAppCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_GETENABLEDISABLE, + 0U, + 0U, + (void*)&getTrackCalRsp, + sizeof(adrv904x_DfeAppFrameworkCmdAppGetEnabledTrackingCalsResp_t), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_APP_CMD_RESP_CHECK_GOTO(getTrackCalRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + for (channelIdx = 0U; channelIdx < ADI_ADRV904X_NUM_TRACKING_CAL_CHANNELS; channelIdx++) + { + enableMasks->enableMask[channelIdx] |= ADRV904X_CTOHL(getTrackCalRsp.enableMasks.enableMask[channelIdx]); + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeTrackingCalTimerSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeAppFrameworkTrackingCalType_t calType, + const uint32_t calTimerValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeAppErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_APP_ERR_CODE_NO_ERROR; + + adrv904x_DfeAppFrameworkCmdAppSetTimer_t setTrackCalTimer; + adrv904x_DfeAppFrameworkCmdAppSetTimerResp_t setTrackCalTimerRsp; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_LIBRARY_MEMSET(&setTrackCalTimer, 0, sizeof(adrv904x_DfeAppFrameworkCmdAppSetTimer_t)); + ADI_LIBRARY_MEMSET(&setTrackCalTimerRsp, 0, sizeof(adrv904x_DfeAppFrameworkCmdAppSetTimerResp_t)); + + setTrackCalTimer.calType = ADRV904X_HTOCL(calType); + setTrackCalTimer.calTimerSetValue = ADRV904X_HTOCL(calTimerValue); + + /* validate input parameters */ + if (calType >= NUM_TRACKCAL_TYPES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, calType, "Invalid calType provided."); + goto cleanup; + } + + if ((calTimerValue < 200U) || (calTimerValue > 5000U)) /* cal timer constrained to between 200 and 5000 milliseconds */ + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, calTimerValue, "Invalid calTimerValue provided. Timer value must be between 200mS and 5000mS."); + goto cleanup; + } + + /* Send command and receive response */ + recoveryAction = adrv904x_DfeAppCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_SETTIMER, + (void*)&setTrackCalTimer, + sizeof(adrv904x_DfeAppFrameworkCmdAppSetTimer_t), + (void*)&setTrackCalTimerRsp, + sizeof(adrv904x_DfeAppFrameworkCmdAppSetTimerResp_t), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_APP_CMD_RESP_CHECK_GOTO(setTrackCalTimerRsp.cmdStatus, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeTrackingCalTimerGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeAppFrameworkTrackingCalType_t calType, + uint32_t* const calTimerValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeAppErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_APP_ERR_CODE_NO_ERROR; + + adrv904x_DfeAppFrameworkCmdAppGetTimer_t getTrackCalTimer; + adrv904x_DfeAppFrameworkCmdAppGetTimerResp_t getTrackCalTimerRsp; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_LIBRARY_MEMSET(&getTrackCalTimer, 0, sizeof(adrv904x_DfeAppFrameworkCmdAppGetTimer_t)); + ADI_LIBRARY_MEMSET(&getTrackCalTimerRsp, 0, sizeof(adrv904x_DfeAppFrameworkCmdAppGetTimerResp_t)); + + getTrackCalTimer.calType = ADRV904X_HTOCL(calType); + + /* validate input parameters */ + if (calType >= NUM_TRACKCAL_TYPES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, calType, "Invalid calType provided."); + goto cleanup; + } + + /* Send command and receive response */ + recoveryAction = adrv904x_DfeAppCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_GETTIMER, + (void*)&getTrackCalTimer, + sizeof(adrv904x_DfeAppFrameworkCmdAppGetTimer_t), + (void*)&getTrackCalTimerRsp, + sizeof(adrv904x_DfeAppFrameworkCmdAppGetTimerResp_t), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_APP_CMD_RESP_CHECK_GOTO(getTrackCalTimerRsp.cmdStatus, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + *calTimerValue = ADRV904X_CTOHL(getTrackCalTimerRsp.calTimerGetValue); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeSvcConfigSet(adi_adrv904x_Device_t* const device, + const uint8_t configID, + const uint32_t offset, + const uint8_t buffer[], + const uint32_t size) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t cmdBuf[sizeof(adrv904x_DfeSvcCmdSetConfig_t) + MAX_DFE_CONFIG_DATA_SIZE]; + adrv904x_DfeSvcCmdSetConfig_t *setConfig; + adrv904x_DfeSvcCmdSetConfigResp_t setConfigResp; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, buffer, cleanup); + + /* verify the configuration data size is not too large */ + if (size > MAX_DFE_CONFIG_DATA_SIZE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, size, "size is larger than maximum configuration data size"); + goto cleanup; + } + + ADI_LIBRARY_MEMSET(&cmdBuf[0U], 0, sizeof(cmdBuf)); + ADI_LIBRARY_MEMSET(&setConfigResp, 0, sizeof(adrv904x_DfeSvcCmdSetConfigResp_t)); + + setConfig = (adrv904x_DfeSvcCmdSetConfig_t *)&cmdBuf; + setConfig->objId = (adi_adrv904x_DfeSvcErrObjId_e)configID; + setConfig->offset = ADRV904X_HTOCL(offset); + setConfig->length = ADRV904X_HTOCL(size); + ADI_LIBRARY_MEMCPY(&cmdBuf[sizeof(adrv904x_DfeSvcCmdSetConfig_t)], buffer, size); + + /* Send command and receive response */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_SET_CONFIG, + (void*)cmdBuf, + sizeof(adrv904x_DfeSvcCmdSetConfig_t) + size, + (void*)&setConfigResp, + sizeof(setConfigResp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(setConfigResp.cmdStatus, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeAppConfigSet(adi_adrv904x_Device_t* const device, + const uint8_t configID, + const uint32_t offset, + const uint8_t buffer[], + const uint32_t size) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t cmdBuf[sizeof(adrv904x_DfeAppFrameworkCmdAppSetConfig_t) + MAX_DFE_CONFIG_DATA_SIZE]; + adrv904x_DfeAppFrameworkCmdAppSetConfig_t *setConfig = NULL; + adrv904x_DfeAppFrameworkCmdAppSetConfigResp_t setConfigResp; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeAppErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_APP_ERR_CODE_NO_ERROR; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, buffer, cleanup); + + /* verify the configuration data size is not too large */ + if (size > MAX_DFE_CONFIG_DATA_SIZE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, size, "size is larger than maximum configuration data size"); + goto cleanup; + } + + ADI_LIBRARY_MEMSET(&cmdBuf[0U], 0, sizeof(cmdBuf)); + ADI_LIBRARY_MEMSET(&setConfigResp, 0, sizeof(adrv904x_DfeAppFrameworkCmdAppSetConfigResp_t)); + + setConfig = (adrv904x_DfeAppFrameworkCmdAppSetConfig_t*)&cmdBuf; + setConfig->objId = ADRV904X_HTOCL(configID); + setConfig->offset = ADRV904X_HTOCL(offset); + setConfig->length = ADRV904X_HTOCL(size); + ADI_LIBRARY_MEMCPY(&cmdBuf[sizeof(adrv904x_DfeAppFrameworkCmdAppSetConfig_t)], buffer, size); + + /* Send command and receive response */ + recoveryAction = adrv904x_DfeAppCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_SETCONFIG, + (void*)cmdBuf, + sizeof(adrv904x_DfeAppFrameworkCmdAppSetConfig_t) + size, + (void*)&setConfigResp, + sizeof(setConfigResp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_APP_CMD_RESP_CHECK_GOTO(setConfigResp.cmdStatus, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeSvcConfigGet(adi_adrv904x_Device_t* const device, + const uint8_t configID, + const uint32_t offset, + const uint8_t buffer[], + const uint32_t size) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t rspBuf[sizeof(adrv904x_DfeSvcCmdGetConfigResp_t) + MAX_DFE_CONFIG_DATA_SIZE]; + adrv904x_DfeSvcCmdGetConfig_t getConfig; + adrv904x_DfeSvcCmdGetConfigResp_t* const getConfigResp = (adrv904x_DfeSvcCmdGetConfigResp_t*)&rspBuf; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, buffer, cleanup); + + /* verify the configuration data size is not too large */ + if (size > MAX_DFE_CONFIG_DATA_SIZE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, size, "size is larger than maximum configuration data size"); + goto cleanup; + } + + ADI_LIBRARY_MEMSET(&rspBuf[0U], 0, sizeof(rspBuf)); + + getConfig.objId = (adi_adrv904x_DfeSvcErrObjId_e)configID; + getConfig.offset = ADRV904X_HTOCL(offset); + getConfig.length = ADRV904X_HTOCL(size); + + /* Send command and receive response */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_GET_CONFIG, + (void*)&getConfig, + sizeof(adrv904x_DfeSvcCmdGetConfig_t), + (void*)getConfigResp, + sizeof(adrv904x_DfeSvcCmdGetConfigResp_t) + size, + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(getConfigResp->cmdStatus, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + ADI_LIBRARY_MEMCPY((void*)buffer, (void*)((uint8_t*)getConfigResp + sizeof(adrv904x_DfeSvcCmdGetConfigResp_t)), size); +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeAppConfigGet(adi_adrv904x_Device_t* const device, + const uint8_t configID, + const uint32_t offset, + const uint8_t buffer[], + const uint32_t size) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t rspBuf[sizeof(adrv904x_DfeAppFrameworkCmdAppGetConfigResp_t) + MAX_DFE_CONFIG_DATA_SIZE]; + adrv904x_DfeAppFrameworkCmdAppGetConfig_t getConfig; + adrv904x_DfeAppFrameworkCmdAppGetConfigResp_t* const getConfigResp = (adrv904x_DfeAppFrameworkCmdAppGetConfigResp_t*)&rspBuf; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeAppErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_APP_ERR_CODE_NO_ERROR; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, buffer, cleanup); + + /* verify the configuration data size is not too large */ + if (size > MAX_DFE_CONFIG_DATA_SIZE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, size, "size is larger than maximum configuration data size"); + goto cleanup; + } + + ADI_LIBRARY_MEMSET(&rspBuf[0U], 0, sizeof(rspBuf)); + + getConfig.objId = configID; + getConfig.offset = ADRV904X_HTOCL(offset); + getConfig.length = ADRV904X_HTOCL(size); + + /* Send command and receive response */ + recoveryAction = adrv904x_DfeAppCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_GETCONFIG, + (void*)&getConfig, + sizeof(adrv904x_DfeAppFrameworkCmdAppGetConfig_t), + (void*)getConfigResp, + sizeof(adrv904x_DfeAppFrameworkCmdAppGetConfigResp_t) + size, + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_APP_CMD_RESP_CHECK_GOTO(getConfigResp->cmdStatus, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + ADI_LIBRARY_MEMCPY((void*)buffer, (void*)((uint8_t*)getConfigResp + sizeof(adrv904x_DfeAppFrameworkCmdAppGetConfigResp_t)), size); +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeConfigUnlock(adi_adrv904x_Device_t* const device, + const uint32_t cfgKey) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_DfeSvcCmdUnlockConfig_t unlockCfg; + adrv904x_DfeSvcCmdUnlockConfigResp_t unlockCfgResp; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + unlockCfg.configKey = ADRV904X_HTOCL(cfgKey); + + /* Send command and receive response */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_UNLOCK_CONFIG, + (void*)&unlockCfg, + sizeof(adrv904x_DfeSvcCmdUnlockConfig_t), + (void*)&unlockCfgResp, + sizeof(adrv904x_DfeSvcCmdUnlockConfigResp_t), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(unlockCfgResp.cmdStatus, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeSysStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + const uint32_t objID, + adi_adrv904x_CpuSysStatus_t* const status) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, status, cleanup); + + /* validate the input parameters */ + recoveryAction = adrv904x_DfeVerifyChannel(channel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "channel parameter is invalid."); + goto cleanup; + } + + if (((objID < (uint32_t) ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_VSWR) || + (objID > (uint32_t) ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD)) && + (objID != (uint32_t) ADRV904X_DFE_APP_FRAMEWORK_CMD_OBJID_DRV_DUMMY)) /* DUMMY objID used for testing */ + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, objID, "objID parameter is invalid."); + goto cleanup; + } + + /* Use the common system status get handler to get the data from the CPU */ + recoveryAction = adrv904x_DfeSysStatusGet(device, (adrv904x_CpuObjectId_e)objID, channel, status); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error getting cpu system status."); + goto cleanup; + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeAppControlCmdExec(adi_adrv904x_Device_t* const device, + const uint32_t objId, + const uint16_t cpuCmd, + const adi_adrv904x_Channels_e channel, + const uint8_t cpuCtrlData[], + const uint32_t lengthSet, + uint32_t* const lengthResp, + uint8_t ctrlResp[], + const uint32_t lengthGet) +{ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t txBuf[SVC_BBIC_BRIDGE_MAX_MAILBOX_LINK_SIZE]; + uint8_t rxBuf[SVC_BBIC_BRIDGE_MAX_MAILBOX_LINK_SIZE]; + adrv904x_DfeAppFrameworkCmdAppSetCtrl_t* setInfo = NULL; + adrv904x_DfeAppFrameworkCmdAppSetCtrlResp_t* const cmdRsp = (adrv904x_DfeAppFrameworkCmdAppSetCtrlResp_t*)&rxBuf; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeAppErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_APP_ERR_CODE_NO_ERROR; + uint32_t fwChannel = 0U; + uint16_t cmdRspLen = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + if (lengthSet > 0U) + { + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuCtrlData, cleanup); + } + + if (lengthGet > 0U) + { + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, ctrlResp, cleanup); + } + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, lengthResp, cleanup); + + if (objId > 0xFFU) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, objId, "Ctrl command - Invalid Object ID."); + goto cleanup; + } + + /* Allow lengthSet 0 for some use cases (RX_QEC) */ + if (lengthSet > (SVC_BBIC_BRIDGE_MAX_MAILBOX_LINK_SIZE - sizeof(adrv904x_DfeAppFrameworkCmdAppSetCtrl_t) + - sizeof(adrv904x_DfeAppFrameworkCmdAppCmd_t) + - sizeof(adrv904x_CpuCmd_t))) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, lengthSet, "Ctrl command length is greater than SVC_BBIC_BRIDGE_MAX_MAILBOX_LINK_SIZE"); + goto cleanup; + } + + + if (lengthGet > (SVC_BBIC_BRIDGE_MAX_MAILBOX_LINK_SIZE - sizeof(adrv904x_DfeAppFrameworkCmdAppSetCtrlResp_t) - + sizeof(adrv904x_CpuCmdResp_t))) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, lengthGet, "Ctrl command response length is greater than SVC_BBIC_BRIDGE_MAX_MAILBOX_LINK_SIZE"); + goto cleanup; + } + + fwChannel = adrv904x_DfeChannelToChannelId(channel); + + ADI_LIBRARY_MEMSET(&txBuf[0U], 0, sizeof(txBuf)); + ADI_LIBRARY_MEMSET(&rxBuf[0U], 0, sizeof(rxBuf)); + + /* Prepare the command payload */ + setInfo = (adrv904x_DfeAppFrameworkCmdAppSetCtrl_t*)((uint8_t*)txBuf); + setInfo->objId = ADRV904X_HTOCL(objId); + setInfo->ctrlCmd = ADRV904X_HTOCS(cpuCmd); + setInfo->channelNum = ADRV904X_HTOCL(fwChannel); + setInfo->length = ADRV904X_HTOCS((uint16_t)lengthSet); + + if (lengthSet > 0U) + { + ADI_LIBRARY_MEMCPY((void*)((uint8_t*)setInfo + sizeof(adrv904x_DfeAppFrameworkCmdAppSetCtrl_t)), cpuCtrlData, lengthSet); + } + + /* Send command and receive response. + * Since we don't know how much data the CPU will send back, + * we have to request MAX_DFE_CONFIG_DATA_SIZE bytes. We will only + * copy out cmdRsp->length bytes of it below. + */ + + /* Then send it */ + recoveryAction = adrv904x_DfeAppCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_CTRL, + (void*)&txBuf, + (sizeof(adrv904x_DfeAppFrameworkCmdAppSetCtrl_t) + lengthSet), + (void*)cmdRsp, + (sizeof(adrv904x_DfeAppFrameworkCmdAppSetCtrlResp_t) + lengthGet), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_APP_CMD_RESP_CHECK_GOTO(cmdRsp->cmdStatus, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + cmdRspLen = ADRV904X_CTOHS(cmdRsp->length); + + if (cmdRspLen < sizeof(adrv904x_DfeAppFrameworkCmdAppSetCtrlResp_t)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cmdRspLen, "Invalid Ctrl command response size"); + goto cleanup; + } + + /* Read the response data from the CPU, if the caller's buffer can hold it. */ + *lengthResp = cmdRspLen - sizeof(adrv904x_DfeAppFrameworkCmdAppSetCtrlResp_t); + + if (*lengthResp <= lengthGet) + { + ADI_LIBRARY_MEMSET(ctrlResp, 0, lengthGet); + ADI_LIBRARY_MEMCPY(ctrlResp, (void*)((uint8_t*)cmdRsp + sizeof(adrv904x_DfeAppFrameworkCmdAppSetCtrlResp_t)), *lengthResp); + } + else + { + *lengthResp = 0U; + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, lengthGet, "Ctrl Cmd Response size is greater than response buffer size"); + goto cleanup; + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeTrackingCalAllStateGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeAppFrameworkTrackingCalState_t* const calState) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + uint32_t channelIdx = 0U; + uint32_t calIdx = 0U; + adrv904x_DfeAppFrameworkCmdAppGetTrackingCalStateResp_t getStateCmdRsp; + adi_adrv904x_DfeAppErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_APP_ERR_CODE_NO_ERROR; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, calState, cleanup); + + /* Initialize the caller's buffer */ + ADI_LIBRARY_MEMSET(calState, 0, sizeof(*calState)); + + ADI_LIBRARY_MEMSET(&getStateCmdRsp, 0, sizeof(adrv904x_DfeAppFrameworkCmdAppGetTrackingCalStateResp_t)); + + /* Send command and receive response */ + recoveryAction = adrv904x_DfeAppCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_GETCALSTATE, + NULL, + 0U, + &getStateCmdRsp, + sizeof(getStateCmdRsp), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(getStateCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* If the command was successful, OR the result with the existing result in calState. + * Each CPU will only set the state information for a particular cal/channel if it "owns" that + * channel (otherwise it will be set to 0). + */ + for (channelIdx = 0U; channelIdx < ADI_ADRV904X_NUM_TRACKING_CAL_CHANNELS; channelIdx++) + { + calState->calError[channelIdx] |= ADRV904X_CTOHL(getStateCmdRsp.calState.calError[channelIdx]); + + for (calIdx = 0U; calIdx < NUM_TRACKCAL_TYPES; calIdx++) /* NUM_TRACKCAL_TYPES is of adi_app_FrameworkTrackingCalType_e */ + { + calState->calState[channelIdx][calIdx] |= getStateCmdRsp.calState.calState[channelIdx][calIdx]; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeTrackingCalStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeAppFrameworkTrackingCalibrationMask_e calId, + const adi_adrv904x_Channels_e channel, + adi_adrv904x_CalStatus_t* const calStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, calStatus, cleanup); + + if (calId == 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, calId, "calId cannot be zero."); + goto cleanup; + } + + recoveryAction = adrv904x_DfeVerifyChannel(channel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "channel parameter is invalid."); + goto cleanup; + } + + /* Use the common cal status get handler to get the data from the CPU */ + recoveryAction = adrv904x_DfeCalCommonStatusGet(device, adrv904x_DfeTrackingCalToObjId(calId), channel, calStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error getting tracking cal status."); + goto cleanup; + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCaptureSequencerConfigSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeAppCaptureSequencerCfg_t* const capSeqCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + char txBuf[ADRV904X_CPU_CMD_MAX_SIZE_BYTES]; + char rxBuf[ADRV904X_CPU_CMD_RESP_MAX_SIZE_BYTES]; + adrv904x_DfeAppFrameworkCmdAppSetCapSeqCfg_t * capSeqCfgCmd = NULL; + adrv904x_DfeAppFrameworkCmdAppSetCapSeqCfgResp_t* capSeqCfgCmdRsp = NULL; + adi_adrv904x_DfeAppErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_APP_ERR_CODE_NO_ERROR; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, capSeqCfg, cleanup); + + ADI_LIBRARY_MEMSET(&txBuf[0U], 0, sizeof(txBuf)); + ADI_LIBRARY_MEMSET(&rxBuf[0U], 0, sizeof(rxBuf)); + + if (capSeqCfg->skipCapturePeriodIfNoRequest > 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, capSeqCfg->skipCapturePeriodIfNoRequest, "skipCapturePeriodIfNoRequest cannot be greater than 1."); + goto cleanup; + } + + if (capSeqCfg->singleCapturePeriod > 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, capSeqCfg->singleCapturePeriod, "skipCapturePeriodIfNoRequest cannot be greater than 1."); + goto cleanup; + } + + if (capSeqCfg->dummyCapPerNumOfMultiframes == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, capSeqCfg->dummyCapPerNumOfMultiframes, "dummyCapPerNumOfMultiframes cannot be 0"); + goto cleanup; + } + + if ((capSeqCfg->dummyCapPerLengthMs < 2U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, capSeqCfg->dummyCapPerLengthMs, "dummyCapPerLengthMs cannot be smaller than 2 ms"); + goto cleanup; + } + + if ((capSeqCfg->dummyCapPerMinimumPeriodMs < 100U) || (capSeqCfg->dummyCapPerMinimumPeriodMs > 5000U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, capSeqCfg->dummyCapPerMinimumPeriodMs, "dummyCapPerMinimumPeriodMs range is [100,5000]"); + goto cleanup; + } + + + /* Build the CPU command */ + capSeqCfgCmd = (adrv904x_DfeAppFrameworkCmdAppSetCapSeqCfg_t*)((uint8_t*)txBuf); + capSeqCfgCmd->capSeqCfgSet.skipCapturePeriodIfNoRequest = capSeqCfg->skipCapturePeriodIfNoRequest; + capSeqCfgCmd->capSeqCfgSet.singleCapturePeriod = capSeqCfg->singleCapturePeriod; + capSeqCfgCmd->capSeqCfgSet.dummyCapPerNumOfMultiframes = capSeqCfg->dummyCapPerNumOfMultiframes; + capSeqCfgCmd->capSeqCfgSet.dummyCapPerLengthMs = capSeqCfg->dummyCapPerLengthMs; + capSeqCfgCmd->capSeqCfgSet.dummyCapPerMinimumPeriodMs = ADRV904X_HTOCS(capSeqCfg->dummyCapPerMinimumPeriodMs); + + capSeqCfgCmdRsp = (adrv904x_DfeAppFrameworkCmdAppSetCapSeqCfgResp_t*)((uint8_t*)rxBuf); + + /* Then send it */ + recoveryAction = adrv904x_DfeAppCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_SETCAPSEQCFG, + (void*)txBuf, + sizeof(adrv904x_DfeAppFrameworkCmdAppSetCapSeqCfg_t), + (void*)capSeqCfgCmdRsp, + sizeof(adrv904x_DfeAppFrameworkCmdAppSetCapSeqCfgResp_t), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_APP_CMD_RESP_CHECK_RETURN(capSeqCfgCmdRsp->cmdStatus, cmdStatus, cpuErrorCode, recoveryAction); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCaptureSequencerConfigGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeAppCaptureSequencerCfg_t* const capSeqCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + char txBuf[ADRV904X_CPU_CMD_MAX_SIZE_BYTES]; + char rxBuf[ADRV904X_CPU_CMD_RESP_MAX_SIZE_BYTES]; + adrv904x_DfeAppFrameworkCmdAppGetCapSeqCfgResp_t* capSeqCfgCmdRsp = NULL; + adi_adrv904x_DfeAppErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_APP_ERR_CODE_NO_ERROR; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, capSeqCfg, cleanup); + + ADI_LIBRARY_MEMSET(&txBuf[0U], 0, sizeof(txBuf)); + ADI_LIBRARY_MEMSET(&rxBuf[0U], 0, sizeof(rxBuf)); + + /* Build the CPU command */ + capSeqCfgCmdRsp = (adrv904x_DfeAppFrameworkCmdAppGetCapSeqCfgResp_t*)((uint8_t*)rxBuf); + + /* Then send it */ + recoveryAction = adrv904x_DfeAppCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_GETCAPSEQCFG, + (void*)txBuf, + 1U, + (void*)capSeqCfgCmdRsp, + sizeof(adrv904x_DfeAppFrameworkCmdAppGetCapSeqCfgResp_t), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_APP_CMD_RESP_CHECK_RETURN(capSeqCfgCmdRsp->cmdStatus, cmdStatus, cpuErrorCode, recoveryAction); + goto cleanup; + } + + capSeqCfg->skipCapturePeriodIfNoRequest = capSeqCfgCmdRsp->capSeqCfgGet.skipCapturePeriodIfNoRequest; + capSeqCfg->singleCapturePeriod = capSeqCfgCmdRsp->capSeqCfgGet.singleCapturePeriod; + capSeqCfg->dummyCapPerNumOfMultiframes = capSeqCfgCmdRsp->capSeqCfgGet.dummyCapPerNumOfMultiframes; + capSeqCfg->dummyCapPerLengthMs = capSeqCfgCmdRsp->capSeqCfgGet.dummyCapPerLengthMs; + capSeqCfg->dummyCapPerMinimumPeriodMs = ADRV904X_CTOHS(capSeqCfgCmdRsp->capSeqCfgGet.dummyCapPerMinimumPeriodMs); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); + +} +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCalPvtStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + const uint32_t objId, + uint8_t calStatusGet[], + const uint32_t length) +{ + /* stubbed var to bypass stubbed function build errors */ + /* remove the 3 lines below for implementation */ + (void) objId; + (void) calStatusGet; + (void) channel; + (void) length; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + + /* TODO: Function not implemented yet. */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_API_NOT_IMPLEMENTED_REPORT_GOTO(&device->common, cleanup); +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCalSpecificStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + const uint32_t objId, + uint8_t calStatusGet[], + const uint32_t length) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + uint8_t txBuf[ADRV904X_CPU_CMD_MAX_SIZE_BYTES]; + uint8_t rxBuf[ADRV904X_CPU_CMD_RESP_MAX_SIZE_BYTES]; + adrv904x_DfeAppFrameworkCmdAppGetCalStatus_t* calStatusCmd = NULL; + adrv904x_DfeAppFrameworkCmdAppGetCalStatusResp_t* sendCalStatusCmdRsp = NULL; + adi_adrv904x_DfeAppErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_APP_ERR_CODE_NO_ERROR; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, calStatusGet, cleanup); + + ADI_LIBRARY_MEMSET(&txBuf[0U], 0, sizeof(txBuf)); + ADI_LIBRARY_MEMSET(&rxBuf[0U], 0, sizeof(rxBuf)); + + /* validate the input parameters */ + recoveryAction = adrv904x_DfeVerifyChannel(channel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + channel, + "channel parameter is invalid."); + goto cleanup; + } + + /* Build the CPU command */ + calStatusCmd = (adrv904x_DfeAppFrameworkCmdAppGetCalStatus_t*)((uint8_t*)txBuf); + calStatusCmd->type = ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_STATUS_SPECIFIC; + calStatusCmd->calObjId = ADRV904X_HTOCL(objId); + calStatusCmd->channelNum = ADRV904X_HTOCL(adrv904x_DfeChanMaskToNum(channel)); + + sendCalStatusCmdRsp = (adrv904x_DfeAppFrameworkCmdAppGetCalStatusResp_t*)((uint8_t*)rxBuf); + + /* Then send it */ + recoveryAction = adrv904x_DfeAppCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_GETCALSTATUS, + (void*)txBuf, + sizeof(adrv904x_DfeAppFrameworkCmdAppGetCalStatus_t), + (void*)sendCalStatusCmdRsp, + sizeof(adrv904x_DfeAppFrameworkCmdAppGetCalStatusResp_t) + length, + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_APP_CMD_RESP_CHECK_RETURN(sendCalStatusCmdRsp->cmdStatus, cmdStatus, cpuErrorCode, recoveryAction); + goto cleanup; + } + ADI_LIBRARY_MEMCPY(calStatusGet,(uint8_t *)(rxBuf + sizeof(adrv904x_DfeAppFrameworkCmdAppGetCalStatusResp_t)), length); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCalExtendedStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + const uint32_t objId, + uint8_t calStatusGet[], + const uint32_t length) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + char txBuf[ADRV904X_CPU_CMD_MAX_SIZE_BYTES]; + char rxBuf[ADRV904X_CPU_CMD_RESP_MAX_SIZE_BYTES]; + adrv904x_DfeAppFrameworkCmdAppGetCalStatus_t* calStatusCmd = NULL; + adrv904x_DfeAppFrameworkCmdAppGetCalStatusResp_t* sendCalStatusCmdRsp = NULL; + adi_adrv904x_DfeAppErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_APP_ERR_CODE_NO_ERROR; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, calStatusGet, cleanup); + + ADI_LIBRARY_MEMSET(&txBuf[0U], 0, sizeof(txBuf)); + ADI_LIBRARY_MEMSET(&rxBuf[0U], 0, sizeof(rxBuf)); + + /* validate the input parameters */ + recoveryAction = adrv904x_DfeVerifyChannel(channel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + channel, + "channel parameter is invalid."); + goto cleanup; + } + + /* Build the CPU command */ + calStatusCmd = (adrv904x_DfeAppFrameworkCmdAppGetCalStatus_t*)((uint8_t*)txBuf); + calStatusCmd->type = ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_STATUS_EXTENDED; + calStatusCmd->calObjId = ADRV904X_HTOCL(objId); + calStatusCmd->channelNum = ADRV904X_HTOCL(adrv904x_DfeChanMaskToNum(channel)); + + sendCalStatusCmdRsp = (adrv904x_DfeAppFrameworkCmdAppGetCalStatusResp_t*)((uint8_t*)rxBuf); + + /* Then send it */ + recoveryAction = adrv904x_DfeAppCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_APP_FRAMEWORK_CMD_TRACKINGCAL_GETCALSTATUS, + (void*)txBuf, + sizeof(adrv904x_DfeAppFrameworkCmdAppGetCalStatus_t), + (void*)sendCalStatusCmdRsp, + sizeof(adrv904x_DfeAppFrameworkCmdAppGetCalStatusResp_t) + length, + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_APP_CMD_RESP_CHECK_RETURN(sendCalStatusCmdRsp->cmdStatus, cmdStatus, cpuErrorCode, recoveryAction); + goto cleanup; + } + ADI_LIBRARY_MEMCPY(calStatusGet, (uint8_t *)(rxBuf + sizeof(adrv904x_DfeAppFrameworkCmdAppGetCalStatusResp_t)), length); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeAppInitStatusGet(adi_adrv904x_Device_t* const device, + uint32_t* const dfeAppInitStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t address = 0U; + uint32_t status = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dfeAppInitStatus, cleanup); + + if ((device->devStateInfo.devState & ADI_ADRV904X_STATE_DFECPULOADED) != ADI_ADRV904X_STATE_DFECPULOADED) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DFE CPU bin must be loaded before getting SDK app init status"); + goto cleanup; + } + + /* Get dfe app init status address from CPU */ + recoveryAction = adrv904x_DfeSdkDataAddrGet(device, &address); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE SDK app init status address"); + goto cleanup; + } + + address += ADI_LIBRARY_OFFSETOF(adrv904x_DfeSvcBbicBridgeSdkData_t, appInitStatus); + /* Read and Store the app init status */ + recoveryAction = adi_adrv904x_Register32Read(device, NULL, address, (uint32_t*)&status, 0xFFFFFFFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE SDK app init status registers"); + goto cleanup; + } + + *dfeAppInitStatus = adrv904x_CpuIntFromBytesGet((uint8_t*)&status, 4U); +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeBootErrorGet( adi_adrv904x_Device_t* const device, + uint32_t* const dfeBootError) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t address = 0U; + uint32_t booterrorCode = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dfeBootError, cleanup); + + if ((device->devStateInfo.devState & ADI_ADRV904X_STATE_DFECPULOADED) != ADI_ADRV904X_STATE_DFECPULOADED) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DFE CPU bin must be loaded before getting DFE SDK boot error code"); + goto cleanup; + } + + /* Get DFE boot error code address from CPU */ + recoveryAction = adrv904x_DfeSdkDataAddrGet(device, &address); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE boot error code address"); + goto cleanup; + } + + address += ADI_LIBRARY_OFFSETOF(adrv904x_DfeSvcBbicBridgeSdkData_t, dfeBootError); + /* Read and Store the DFE boot error code */ + recoveryAction = adi_adrv904x_Register32Read(device, NULL, address, (uint32_t*)&booterrorCode, 0xFFFFFFFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE SDK Boot Error code registers"); + goto cleanup; + } + + *dfeBootError = adrv904x_CpuIntFromBytesGet((uint8_t*)&booterrorCode, 4U); +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeFwDebugModeSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeFwDebugMode_e dfeFwDebugMode) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t gpioPinList[][2] = { + { ADI_ADRV904X_GPIO_SIGNAL_DFE_ARM_TRST, 10U }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_ARM_TDO_SWO_MUX, 11U }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_ARM_TDI, 12U }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_ARM_TMS, 13U }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_ARM_TCK, 14U }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_CLK_OUT, 15U }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_0, 16U }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_1, 17U }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_2, 18U }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_3, 19U }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_4, 20U }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_5, 21U }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_6, 22U }, + { ADI_ADRV904X_GPIO_SIGNAL_DFE_TRACE_DATA_OUT_7, 23U } + }; + uint8_t gpioPinIdx = 0U; + uint32_t GPIO_PIN_START = 0U; + uint32_t GPIO_PIN_END = 0U; + /* TODO: Remove as part of TPGSWE-5768 */ + uint32_t dfeSwBootFlagAddr = ADRV904X_DFE_CPU_INIT_ADDR_GET(swBootFlag); + adrv904x_DfeSvcBbicBridgeSdkBootFlag_t jtagDebugEnable = ADRV904X_DFE_SVC_BBIC_BRIDGE_SDK_BOOT_FLAG_DEBUG_JTAG_ENABLE; + /* TODO: End remove */ + + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + if (dfeFwDebugMode == ADI_ADRV904X_DFE_FW_DEBUG_MODE_SWD) + { + GPIO_PIN_START = 3U; + GPIO_PIN_END = 5U; + } + else if (dfeFwDebugMode == ADI_ADRV904X_DFE_FW_DEBUG_MODE_JTAG) + { + GPIO_PIN_START = 0U; + GPIO_PIN_END = 5U; + } + else if (dfeFwDebugMode == ADI_ADRV904X_DFE_FW_DEBUG_MODE_JTAG4) + { + GPIO_PIN_START = 0U; + GPIO_PIN_END = 10U; + } + else if (dfeFwDebugMode == ADI_ADRV904X_DFE_FW_DEBUG_MODE_JTAG8) + { + GPIO_PIN_START = 0U; + GPIO_PIN_END = 14U; + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid DFE FW Debug Mode selection."); + goto cleanup; + } + + /* Now set the GPIO Pin for Debug */ + for (gpioPinIdx = GPIO_PIN_START; gpioPinIdx < GPIO_PIN_END; gpioPinIdx++) + { + /* Take the GPIO Pin if it is used by some other features */ + recoveryAction = adrv904x_GpioSignalRelease(device, + (adi_adrv904x_GpioPinSel_e) gpioPinList[gpioPinIdx][1], + (adi_adrv904x_GpioSignal_e) gpioPinList[gpioPinIdx][0], + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting GPIO pin for FW Debug"); + goto cleanup; + } + + recoveryAction = adrv904x_GpioSignalSet(device, + (adi_adrv904x_GpioPinSel_e) gpioPinList[gpioPinIdx][1], + (adi_adrv904x_GpioSignal_e) gpioPinList[gpioPinIdx][0], + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting GPIO pin for FW Debug"); + goto cleanup; + } + } + + /* TODO: Remove as part of TPGSWE-5768 */ + /* Enable SDK debug SWD/JTAG in the SDK */ + recoveryAction = adi_adrv904x_RegistersByteWrite(device, NULL, dfeSwBootFlagAddr, &jtagDebugEnable, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot write SDK debug enable flag to DFE memory"); + goto cleanup; + } + /* TODO: End remove */ + + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeSysPvtStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + const uint32_t objID, + uint8_t cpuSysStatusGet[], + const uint32_t length) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const void* pSysStatus = NULL; + const void** const ppSysStatus = &pSysStatus; + char rxBuf[ADRV904X_CPU_CMD_RESP_MAX_SIZE_BYTES]; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuSysStatusGet, cleanup); + + /* validate the input parameters */ + recoveryAction = adrv904x_DfeVerifyChannel(channel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "channel parameter is invalid."); + goto cleanup; + } + + if (((objID < (uint32_t) ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_VSWR) || + (objID > (uint32_t) ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD)) && + (objID != (uint32_t) ADRV904X_DFE_APP_FRAMEWORK_CMD_OBJID_DRV_DUMMY)) /* DUMMY objID used for testing */ + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, objID, "objID parameter is invalid."); + goto cleanup; + } + + if (length == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, length, "Length is zero."); + goto cleanup; + } + + /* Send the system status get command to the CPU */ + recoveryAction = adrv904x_DfeSendSysStatusCmd(device, + ADRV904X_DFE_FRAMEWORK_CMD_SYS_STATUS_PRIVATE, + (adrv904x_CpuObjectId_e)objID, + channel); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SendCalStatusCmd failed"); + goto cleanup; + } + + /* Get the response from the CPU */ + recoveryAction = adrv904x_DfeGetSysStatusCmdResp(device, + channel, + length, + (void*)&rxBuf[0], + ppSysStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GetCalStatusCmd failed"); + goto cleanup; + } + + if (pSysStatus == NULL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GET_CAL_STATUS command failed"); + goto cleanup; + } + + ADI_LIBRARY_MEMCPY(cpuSysStatusGet, pSysStatus, length); +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuLogMaskSet( adi_adrv904x_Device_t* const device, + const uint32_t logMaskSet) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + /* All Logging Enabled in Log Mask*/ + const uint32_t LOG_TRACE_LEVEL_ALL = 0x1FU; + + adrv904x_DfeSvcCmdSetLogMaskCmd_t setLogMask; + adrv904x_DfeSvcCmdGetLogMaskResp_t setLogMaskRsp; + ADI_LIBRARY_MEMSET(&setLogMask, 0, sizeof(adrv904x_DfeSvcCmdSetLogMaskCmd_t)); + ADI_LIBRARY_MEMSET(&setLogMaskRsp, 0, sizeof(adrv904x_DfeSvcCmdGetLogMaskResp_t)); + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + setLogMask.logMask = ADRV904X_HTOCL(logMaskSet); + + /* validate input parameters */ + + if ((logMaskSet == 0U) || + (logMaskSet > LOG_TRACE_LEVEL_ALL)) + { + + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, logMaskSet, "Invalid logMask provided."); + goto cleanup; + } + + + /* Send command and receive response */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_LOG_MASK_SET, + (void*)&setLogMask, + sizeof(adrv904x_DfeSvcCmdSetLogMaskCmd_t), + (void*)&setLogMaskRsp, + sizeof(adrv904x_DfeSvcCmdGetLogMaskResp_t), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(setLogMaskRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); + +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuLogMaskGet( adi_adrv904x_Device_t* const device, + uint32_t* const logMaskGet) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + adrv904x_DfeSvcCmdGetLogMaskResp_t getLogMaskRsp; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, logMaskGet, cleanup); + + ADI_LIBRARY_MEMSET(logMaskGet, 0, sizeof(*logMaskGet)); + ADI_LIBRARY_MEMSET(&getLogMaskRsp, 0, sizeof(adrv904x_DfeSvcCmdGetLogMaskResp_t)); + + /* Send command and receive response */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_LOG_MASK_GET, + 0U, + 0U, + (void*)&getLogMaskRsp, + sizeof(adrv904x_DfeSvcCmdGetLogMaskResp_t), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(getLogMaskRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + *logMaskGet = getLogMaskRsp.logMask; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); + +} +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuTelemetryMaskSet( adi_adrv904x_Device_t* const device, + const uint64_t sdkTelemetryMask0, + const uint64_t sdkTelemetryMask1, + const uint64_t appTelemetryMask0, + const uint64_t appTelemetryMask1) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + adrv904x_DfeSvcCmdSetTelemetryMaskCmd_t setTelemetryMask; + adrv904x_DfeSvcCmdGenericResp_t setTelemetryMaskRsp; + ADI_LIBRARY_MEMSET(&setTelemetryMask, 0, sizeof(adrv904x_DfeSvcCmdSetTelemetryMaskCmd_t)); + ADI_LIBRARY_MEMSET(&setTelemetryMaskRsp, 0, sizeof(adrv904x_DfeSvcCmdGenericResp_t)); + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + setTelemetryMask.sdkTelemetryMask0 = ADRV904X_HTOCLL(sdkTelemetryMask0); + setTelemetryMask.sdkTelemetryMask1 = ADRV904X_HTOCLL(sdkTelemetryMask1); + setTelemetryMask.appTelemetryMask0 = ADRV904X_HTOCLL(appTelemetryMask0); + setTelemetryMask.appTelemetryMask1 = ADRV904X_HTOCLL(appTelemetryMask1); + + /* Send command and receive response */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_TELEMETRY_MASK_SET, + (void*)&setTelemetryMask, + sizeof(adrv904x_DfeSvcCmdSetTelemetryMaskCmd_t), + (void*)&setTelemetryMaskRsp, + sizeof(adrv904x_DfeSvcCmdGenericResp_t), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(setTelemetryMaskRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); + +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuTelemetryMaskGet( adi_adrv904x_Device_t* const device, + uint64_t * const sdkTelemetryMask0, + uint64_t * const sdkTelemetryMask1, + uint64_t * const appTelemetryMask0, + uint64_t * const appTelemetryMask1) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + adrv904x_DfeSvcCmdGetTelemetryMaskResp_t getTelemetryMaskRsp; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, sdkTelemetryMask0, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, sdkTelemetryMask1, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, appTelemetryMask0, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, appTelemetryMask1, cleanup); + + ADI_LIBRARY_MEMSET(&getTelemetryMaskRsp, 0, sizeof(adrv904x_DfeSvcCmdGetTelemetryMaskResp_t)); + + /* Send command and receive response */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_TELEMETRY_MASK_GET, + 0U, + 0U, + (void*)&getTelemetryMaskRsp, + sizeof(adrv904x_DfeSvcCmdGetTelemetryMaskResp_t), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(getTelemetryMaskRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + *sdkTelemetryMask0 = ADRV904X_CTOHLL(getTelemetryMaskRsp.sdkTelemetryMask0); + *sdkTelemetryMask1 = ADRV904X_CTOHLL(getTelemetryMaskRsp.sdkTelemetryMask1); + *appTelemetryMask0 = ADRV904X_CTOHLL(getTelemetryMaskRsp.appTelemetryMask0); + *appTelemetryMask1 = ADRV904X_CTOHLL(getTelemetryMaskRsp.appTelemetryMask1); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeDebugMode(adi_adrv904x_Device_t* const device, + const uint32_t debugModeKey) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_DfeSvcCmdDebugMode_t debugMode; + adrv904x_DfeSvcCmdDebugModeResp_t debugModeResp; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + debugMode.svcDebugModeKey = ADRV904X_HTOCL(debugModeKey); + + /* Send command and receive response */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_DEBUG, + (void*)&debugMode, + sizeof(adrv904x_DfeSvcCmdDebugMode_t), + (void*)&debugModeResp, + sizeof(adrv904x_DfeSvcCmdDebugModeResp_t), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(debugModeResp.cmdStatus, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeDebugModeCmd(adi_adrv904x_Device_t* const device, + const uint32_t objId, + const uint16_t cpuCmd, + const uint8_t cpuDebugData[], + const uint32_t lengthSet, + uint32_t* const lengthResp, + uint8_t debugResp[], + const uint32_t lengthGet) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + char txBuf[sizeof(adrv904x_CpuCmd_DebugMaxSize_t)]; + char rxBuf[sizeof(adrv904x_CpuCmd_DebugRespMaxSize_t)]; + adrv904x_DfeSvcCmdDebugCmd_t* const debugModeCmd = (adrv904x_DfeSvcCmdDebugCmd_t*)&txBuf; + adrv904x_DfeSvcCmdDebugCmdResp_t* const debugModeCmdResp = (adrv904x_DfeSvcCmdDebugCmdResp_t*)&rxBuf; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuDebugData, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, debugResp, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, lengthResp, cleanup); + + if ((objId != ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_ECC) && /* currently, only two */ + (objId != ADI_ADRV904X_DFE_SVC_ERR_OBJID_SVC_LOG)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, objId, "DFE Cpu Debug command - Invalid Object ID."); + goto cleanup; + } + + if (lengthSet > MAX_DEBUG_DATA_SIZE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, lengthSet, "DFE Cpu Debug command length is greater than MAX_DEBUG_DATA_SIZE"); + goto cleanup; + } + + if (lengthSet == 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, lengthSet, "DFE Cpu Debug command length must be greater than 0"); + goto cleanup; + } + + if (lengthGet == 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, lengthGet, "DFE Cpu Debug command response buffer size must be greater than 0"); + goto cleanup; + } + + ADI_LIBRARY_MEMSET(&txBuf[0U], 0, sizeof(txBuf)); + ADI_LIBRARY_MEMSET(&rxBuf[0U], 0, sizeof(rxBuf)); + + /* Prepare the command payload */ + debugModeCmd->objId = ADRV904X_HTOCL(objId); + debugModeCmd->debugCmd = ADRV904X_HTOCS(cpuCmd); + debugModeCmd->length = ADRV904X_HTOCS((uint16_t)lengthSet); + + ADI_LIBRARY_MEMCPY((void*)((uint8_t*)debugModeCmd + sizeof(adrv904x_DfeSvcCmdDebugCmd_t)), cpuDebugData, lengthSet); + + /* Send command and receive response */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_DEBUG_CMD, + (void*)txBuf, + sizeof(adrv904x_DfeSvcCmdDebugCmd_t)+lengthSet, + (void*)rxBuf, + sizeof(adrv904x_DfeSvcCmdDebugCmdResp_t), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(debugModeCmdResp->cmdStatus, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + if (debugModeCmdResp->length <= lengthGet) + { + ADI_LIBRARY_MEMSET(debugResp, 0, lengthGet); + *lengthResp = debugModeCmdResp->length; + ADI_LIBRARY_MEMCPY(debugResp, ((adrv904x_CpuCmd_DebugMaxSize_t *)debugModeCmdResp)->debugData, *lengthResp); + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, lengthGet, "Debug Cmd Response size is greater than response buffer size"); + goto cleanup; + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeWatchdogConfigSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeSvcWatchdogInstance_t wdt, + const uint32_t timeout_ms) +{ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_DfeSvcCmdWatchdogConfig_t setConfig; + adrv904x_DfeSvcCmdWatchdogConfigResp_t setConfigResp; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_CpuErrorCode_t cpuErrorCode = 0U; + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* verify the configuration wdt */ + if (wdt > ADI_ADRV904X_DFE_SVC_WATCHDOG_NUM_WDT) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, wdt, "Invalid wdt provided."); + goto cleanup; + } + + setConfig.wdt = (uint8_t)wdt; + setConfig.timeout_ms = ADRV904X_HTOCL(timeout_ms); + + /* Send command and receive response */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_WATCHDOG_CONFIG, + (void*)&setConfig, + sizeof(adrv904x_DfeSvcCmdWatchdogConfig_t), + (void*)&setConfigResp, + sizeof(adrv904x_DfeSvcCmdWatchdogConfigResp_t), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(setConfigResp.cmdStatus, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeUpdateEcc(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_DfeSvcEccUpdateResp_t eccUpdateResp; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Send command and receive response */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_UPDATE_ECC, + 0U, + 0U, + (void*)&eccUpdateResp, + sizeof(adrv904x_DfeSvcEccUpdateResp_t), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(eccUpdateResp.cmdStatus, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuPintSwStatusGet(adi_adrv904x_Device_t* const device, + uint8_t* const statusPintSw0, + uint8_t* const statusPintSw1) +{ + const uint32_t ADDRESS_DFE_CPU_READ_PINT_SW0 = 0xb2220108U; + const uint32_t ADDRESS_DFE_CPU_READ_PINT_SW1 = 0xb2220118U; + const uint32_t READ_WRITE_MASK = 0xFFFFFFFFU; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t tmpRead = 0U; + + /* Check inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, statusPintSw0, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, statusPintSw1, cleanup); + + /* Read PintSw0 interrupt status */ + recoveryAction = adi_adrv904x_Register32Read(device, NULL, ADDRESS_DFE_CPU_READ_PINT_SW0, &tmpRead, READ_WRITE_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read DFE CPU PintSw0 Status."); + goto cleanup; + } + *statusPintSw0 = (uint8_t)tmpRead; + + /* Read PintSw1 interrupt status */ + recoveryAction = adi_adrv904x_Register32Read(device, NULL, ADDRESS_DFE_CPU_READ_PINT_SW1, &tmpRead, READ_WRITE_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read DFE CPU PintSw1 Status."); + goto cleanup; + } + *statusPintSw1 = (uint8_t)tmpRead; +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuPintSwStatusClear(adi_adrv904x_Device_t* const device, + const uint8_t clearPintSw0, + const uint8_t clearPintSw1) +{ + const uint32_t ADDRESS_DFE_CPU_CLEAR_PINT_SW0 = 0xb2220104U; + const uint32_t ADDRESS_DFE_CPU_CLEAR_PINT_SW1 = 0xb2220114U; + const uint32_t READ_WRITE_MASK = 0xFFFFFFFFU; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, ADDRESS_DFE_CPU_CLEAR_PINT_SW0, (uint32_t)clearPintSw0, READ_WRITE_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to clear selected interrupts in DFE CPU PINTSW0."); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, ADDRESS_DFE_CPU_CLEAR_PINT_SW1, (uint32_t)clearPintSw1, READ_WRITE_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to clear selected interrupts in DFE CPU PINTSW1."); + goto cleanup; + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuPintSw0DetailedInfoGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeCpuPintSw0Status_e interruptSelect, + uint32_t* const pInfo) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const uint32_t DEFAULT_INFO = 0U; + const uint32_t MAXNUM_ERROBJ = sizeof(adi_adrv904x_DfeSvcLogTraceErrLog_t) / sizeof(adi_adrv904x_DfeSvcLogTraceErrLogData_t); + uint32_t loop = 0U; + uint64_t lastLatestTimeStamp = 0U; + adi_adrv904x_DfeSvcLogTraceLevel_t logTraceLevelSelect = 0U; + adi_adrv904x_DfeSvcLogTraceErrLog_t lastError; + adi_adrv904x_DfeSvcLogTraceErrLogData_t* pLastErrorData = (adi_adrv904x_DfeSvcLogTraceErrLogData_t*)&lastError; + + /* Check inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pInfo, cleanup); + + ADI_LIBRARY_MEMSET(&lastError, 0, sizeof(lastError)); + + /* Return detailed info stored from the the last instance of selected interrupt. Limited to uint32_t data */ + if (interruptSelect == ADI_ADRV904X_DFE_CPU_PINTSW0_STATUS_INT_0_FATAL_ERROR) + { + logTraceLevelSelect = ADI_ADRV904X_DFE_SVC_LOG_TRACE_LEVEL_FATAL; + } + else if (interruptSelect == ADI_ADRV904X_DFE_CPU_PINTSW0_STATUS_INT_0_CRITICAL_ERROR) + { + logTraceLevelSelect = ADI_ADRV904X_DFE_SVC_LOG_TRACE_LEVEL_CRITICAL; + } + else /* Nothing useful to return in this case*/ + { + /* Allow the user to call this function with no error selected and it be a no-op */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + *pInfo = DEFAULT_INFO; + goto cleanup; + } + + if (logTraceLevelSelect != 0U) + { + recoveryAction = adrv904x_DfeLastErrorCodeGet(device, &lastError); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error retrieving logTrace Error"); + goto cleanup; + } + else + { + *pInfo = DEFAULT_INFO; + for (loop = 0U; loop < MAXNUM_ERROBJ; loop++) + { + if (pLastErrorData->errLogLevel == logTraceLevelSelect) + { + if (pLastErrorData->errLogTimeStamp > lastLatestTimeStamp) + { + lastLatestTimeStamp = pLastErrorData->errLogTimeStamp; + *pInfo = pLastErrorData->errLogCode; + } + } + pLastErrorData++; + } + } + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeSvcLogTraceErrLogGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeSvcLogTraceErrLog_t* const lastErrorData) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, lastErrorData, cleanup); + + recoveryAction = adrv904x_DfeLastErrorCodeGet(device, lastErrorData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error retrieving last Error Data"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCpuPintSw1DetailedInfoGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DfeCpuPintSw1Status_e interruptSelect, + uint32_t* const pInfo) +{ + const uint32_t DEFAULT_INFO = 0U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t readScratch = 0U; + uint32_t address = 0U; + uint32_t vswrAlarm = 0U; + + /* Check inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pInfo, cleanup); + + /* Return detailed info stored from the the last instance of selected interrupt. Limited to uint32_t data */ + switch (interruptSelect) + { + case (ADI_ADRV904X_DFE_CPU_PINTSW1_STATUS_INT_0_TDD_LUT_UPDATE_IN_PROGRESS_TXON): + /* Readback the Tx Channel that last triggered this error. Stored in a scratchpad by Core Stream Proc */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_DFE_DMA_REQUEST_ERROR, + &readScratch); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed readback of Tx Channel Mask of last DFE CPU LUT Copy Error"); + goto cleanup; + } + *pInfo = (uint32_t)(readScratch); + break; + + case (ADI_ADRV904X_DFE_CPU_PINTSW1_STATUS_INT_1_VSWR_ALARM): + /* Get VSWR alarm status address */ + recoveryAction = adrv904x_DfeSdkDataAddrGet(device, &address); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue reading SDK data address"); + goto cleanup; + } + address += ADI_LIBRARY_OFFSETOF(adrv904x_DfeSvcBbicBridgeSdkData_t, vswrAlarm); + + /* Read the VSWR alarm data */ + recoveryAction = adi_adrv904x_Register32Read(device, NULL, address, &vswrAlarm, 0xFFFFFFFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue reading VSWR alarm status"); + goto cleanup; + } + *pInfo = adrv904x_CpuIntFromBytesGet((uint8_t*)&vswrAlarm, 4U); + break; + + case (ADI_ADRV904X_DFE_CPU_PINTSW1_STATUS_INT_NONE): /* Fallthrough */ + default: + /* Allow the user to call this function with no error selected and it be a no-op */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + *pInfo = DEFAULT_INFO; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_dfe_dpd.c b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_dfe_dpd.c new file mode 100644 index 00000000000..e7fa3cdf84c --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_dfe_dpd.c @@ -0,0 +1,1921 @@ +/** +* Copyright 2015 - 2023 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_dfe_dpd.c +* \brief Contains DPD features related function implementations +* +* ADRV904X API Version: 2.10.0.4 +*/ +#include "adi_common_hal.h" +#include "adi_library_types.h" +#include "adi_adrv904x_dfe_dpd.h" +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_tx.h" +#include "adi_adrv904x_hal.h" +#include "adi_adrv904x_dfe_cpu.h" +#include "adi_adrv904x_dfe_cal_dpd_types.h" +#include "adi_adrv904x_dfe_framework_tracking_cal_t.h" +#include "../../private/include/adrv904x_platform_byte_order.h" +#include "../../private/include/adrv904x_dfe_cpu.h" +#include "../../private/include/adrv904x_dfe_dpd.h" +#include "../../private/bf/adrv904x_bf_cap_buf_mmr.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PUBLIC_DFE_DPD + +#define DPD_CTRL_SET_CMD_FLAG (0x10) + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdModelConfigDpdSet(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdModelType_e dpdModelType, + const adi_adrv904x_DfeAppCalDpdModelDesc_t* const modelDesc) +{ + const uint16_t DPD_CTRL_MODEL_CONFIG_SET = 0 | DPD_CTRL_SET_CMD_FLAG; + uint8_t cpuCtrlData[sizeof(adi_adrv904x_DfeAppCalDpdModelType_t) + sizeof(adi_adrv904x_DfeAppCalDpdModelDesc_t)]; + adi_adrv904x_DfeAppCalDpdModelDesc_t *pTmpModelDesc = + (adi_adrv904x_DfeAppCalDpdModelDesc_t *)(cpuCtrlData + sizeof(adi_adrv904x_DfeAppCalDpdModelType_t)); + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + uint32_t i = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, modelDesc, cleanup); + + recoveryAction = adrv904x_DpdModelConfigDpdSetRangeCheck(device, dpdTxChannelMask, dpdModelType, modelDesc); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DpdModelConfigDpdSet range check failed "); + goto cleanup; + } + + ADI_LIBRARY_MEMCPY((void*)cpuCtrlData, (const void *)&dpdModelType, sizeof(adi_adrv904x_DfeAppCalDpdModelType_t)); + ADI_LIBRARY_MEMCPY((void*)(cpuCtrlData + sizeof(adi_adrv904x_DfeAppCalDpdModelType_t)), (const void * const)modelDesc, sizeof(adi_adrv904x_DfeAppCalDpdModelDesc_t)); + + /* Note that all the integer fields of *pTmpModelDesc and it's sub-strucutures are uint8_t so require no endianess + * corrections. */ + + for (i = 0U; i < pTmpModelDesc->features; ++i) + { + pTmpModelDesc->feature[i].a.real = ADRV904X_HTOCLL(pTmpModelDesc->feature[i].a.real); + pTmpModelDesc->feature[i].a.imag = ADRV904X_HTOCLL(pTmpModelDesc->feature[i].a.imag); + } + pTmpModelDesc->features = ADRV904X_HTOCS(pTmpModelDesc->features); + + for (i = 0U; i < ADI_ADRV904X_MAX_TXCHANNELS; ++i) + { + uint32_t txChan = (1 << i); + if (dpdTxChannelMask & txChan) + { + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + DPD_CTRL_MODEL_CONFIG_SET, + (adi_adrv904x_Channels_e)txChan, + cpuCtrlData, + sizeof(cpuCtrlData), + &lengthResp, + NULL, + 0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChan, "Failed to send request"); + goto cleanup; + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdModelConfigDpdGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e dpdTxChannelSel, + const adi_adrv904x_DfeAppCalDpdModelType_e dpdModelType, + adi_adrv904x_DfeAppCalDpdModelDesc_t* const modelDesc) +{ + const uint16_t DPD_CTRL_MODEL_CONFIG_GET = 0; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + uint32_t i = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, modelDesc, cleanup); + + /*Check that if requested Tx Channel valid*/ + /* Channel must contain a single channel number (0-7) */ + recoveryAction = adrv904x_DfeVerifyChannel((adi_adrv904x_Channels_e)dpdTxChannelSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, dpdTxChannelSel, "channel parameter is invalid."); + goto cleanup; + } + + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + DPD_CTRL_MODEL_CONFIG_GET, + (adi_adrv904x_Channels_e)dpdTxChannelSel, + (const uint8_t*)&dpdModelType, + sizeof(adi_adrv904x_DfeAppCalDpdModelType_t), + &lengthResp, + (uint8_t *)modelDesc, + sizeof(adi_adrv904x_DfeAppCalDpdModelDesc_t)); + + if (recoveryAction == ADI_ADRV904X_ERR_ACT_NONE) + { + if (modelDesc->features == 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, modelDesc->features, "The number of features is greater than maximum allowed"); + goto cleanup; + } + } + + if (recoveryAction == ADI_ADRV904X_ERR_ACT_NONE) + { + modelDesc->features = ADRV904X_CTOHS(modelDesc->features); + modelDesc->dpdPartial.partial = ADRV904X_CTOHL(modelDesc->dpdPartial.partial); + modelDesc->mode = ADRV904X_CTOHL(modelDesc->mode); + modelDesc->actDepth = ADRV904X_CTOHL(modelDesc->actDepth); + + for (i = 0U; i < modelDesc->features; ++i) + { + modelDesc->feature[i].a.real = ADRV904X_HTOCLL(modelDesc->feature[i].a.real); + modelDesc->feature[i].a.imag = ADRV904X_HTOCLL(modelDesc->feature[i].a.imag); + } + + /* mem set the unused features*/ + int memsetSize = sizeof(adi_adrv904x_DfeAppCalDpdAdpFeatureRow_t) * (ADI_ADRV904X_DFE_APP_CAL_DPD_MAX_NUM_FEATURES - modelDesc->features); + ADI_LIBRARY_MEMSET(&(modelDesc->feature[modelDesc->features]), 0, memsetSize); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdReset(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const adi_adrv904x_DfeAppDpdResetMode_e dpdResetMode) +{ + const uint16_t DPD_CTRL_DPD_RESET = 4U; /* DPD_CTRL_RESET */ + uint16_t dpdResetCmd = 0U; + uint32_t lengthResp = 0U; + uint32_t chIdx = 0U; + uint32_t chSelect = 0U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Validate txChannel: only one channel allowed */ + if ((txChannelMask == ADI_ADRV904X_TXOFF) || /* No channel selected */ + ((txChannelMask & ~ADI_ADRV904X_TXALL) != 0)) /* Unsupported channel selected */ + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelMask, "Invalid TX channel selected."); + goto cleanup; + } + + /* Validate dpdResetMode */ + switch (dpdResetMode) + { + case ADI_ADRV904X_DFE_APP_DPD_RESET_FULL: + dpdResetCmd = DPD_CTRL_DPD_RESET; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, dpdResetMode, "Invalid DPD Reset Mode selected."); + goto cleanup; + } + + for (chIdx = 0U; chIdx < ADI_ADRV904X_MAX_TXCHANNELS; chIdx++) + { + chSelect = 1 << chIdx; + if ((chSelect & txChannelMask) == 0) + { + continue; /* Skip unselected TX channel */ + } + + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + dpdResetCmd, + (adi_adrv904x_Channels_e)chSelect, + NULL, + 0, + &lengthResp, + NULL, + 0); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chSelect, "Failed to send request for DPD Reset"); + goto cleanup; + } + } + + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdModelConfigCtcSet(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdModelType_e dpdModelType, + const adi_adrv904x_DfeAppCalCtcModelDesc_t* const modelDesc) +{ + const uint16_t DPD_CTRL_MODEL_CONFIG_SET = 0 | DPD_CTRL_SET_CMD_FLAG; + uint8_t cpuCtrlData[sizeof(adi_adrv904x_DfeAppCalDpdModelType_t) + sizeof(adi_adrv904x_DfeAppCalCtcModelDesc_t)]; + adi_adrv904x_DfeAppCalCtcModelDesc_t *pTmpModelDesc = + (adi_adrv904x_DfeAppCalCtcModelDesc_t *)(cpuCtrlData + sizeof(adi_adrv904x_DfeAppCalDpdModelType_t)); + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + uint32_t i = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, modelDesc, cleanup); + + recoveryAction = adrv904x_DpdModelConfigCtcSetRangeCheck(device, dpdTxChannelMask, dpdModelType, modelDesc); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DpdModelConfigCtcSet range check failed."); + goto cleanup; + } + + ADI_LIBRARY_MEMCPY((void*)cpuCtrlData, (const void *)&dpdModelType, sizeof(adi_adrv904x_DfeAppCalDpdModelType_t)); + ADI_LIBRARY_MEMCPY((void*)(cpuCtrlData + sizeof(adi_adrv904x_DfeAppCalDpdModelType_t)), (const void *const)modelDesc, sizeof(adi_adrv904x_DfeAppCalCtcModelDesc_t)); + + /* Note that all the integer fields of *pTmpModelDesc and it's sub-strucutures are uint8_t so require no endianess + * corrections. */ + + pTmpModelDesc->kLutAddrScale = ADRV904X_HTOCL(pTmpModelDesc->kLutAddrScale); + pTmpModelDesc->fLutAddrScale = ADRV904X_HTOCL(pTmpModelDesc->fLutAddrScale); + + for (i = 0U; i < pTmpModelDesc->features; ++i) + { + pTmpModelDesc->feature[i].c = ADRV904X_HTOCS(pTmpModelDesc->feature[i].c); + pTmpModelDesc->feature[i].d = ADRV904X_HTOCS(pTmpModelDesc->feature[i].d); + + pTmpModelDesc->feature[i].a.real = ADRV904X_HTOCLL(pTmpModelDesc->feature[i].a.real); + pTmpModelDesc->feature[i].a.imag = ADRV904X_HTOCLL(pTmpModelDesc->feature[i].a.imag); + } + + for (i = 0; i < ADI_ADRV904X_MAX_TXCHANNELS; i++) + { + uint32_t txChan = (1 << i); + if (dpdTxChannelMask & txChan) + { + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + DPD_CTRL_MODEL_CONFIG_SET, + (adi_adrv904x_Channels_e)txChan, + cpuCtrlData, + sizeof(cpuCtrlData), + &lengthResp, + NULL, + 0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChan, "Failed to send request"); + goto cleanup; + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdModelConfigCtcGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e dpdTxChannelSel, + const adi_adrv904x_DfeAppCalDpdModelType_e dpdModelType, + adi_adrv904x_DfeAppCalCtcModelDesc_t* const modelDesc) +{ + const uint16_t DPD_CTRL_MODEL_CONFIG_GET = 0; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + uint32_t i = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, modelDesc, cleanup); + + /*Check that if requested Tx Channel valid*/ + /* Channel must contain a single channel number (0-7) */ + recoveryAction = adrv904x_DfeVerifyChannel((adi_adrv904x_Channels_e)dpdTxChannelSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, dpdTxChannelSel, "channel parameter is invalid."); + goto cleanup; + } + + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + DPD_CTRL_MODEL_CONFIG_GET, + (adi_adrv904x_Channels_e)dpdTxChannelSel, + (const uint8_t*)&dpdModelType, + sizeof(adi_adrv904x_DfeAppCalDpdModelType_t), + &lengthResp, + (uint8_t *)modelDesc, + sizeof(*modelDesc)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to send request"); + goto cleanup; + } + + if (modelDesc->features == 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, modelDesc->features, "The number of features is greater than maximum allowed"); + goto cleanup; + } + + modelDesc->ctcPartial.partial = ADRV904X_CTOHL(modelDesc->ctcPartial.partial); + + modelDesc->kLutAddrScale = ADRV904X_CTOHL(modelDesc->kLutAddrScale); + modelDesc->fLutAddrScale = ADRV904X_CTOHL(modelDesc->fLutAddrScale); + + for (i = 0U; i < modelDesc->features; ++i) + { + modelDesc->feature[i].c = ADRV904X_CTOHS(modelDesc->feature[i].c); + modelDesc->feature[i].d = ADRV904X_CTOHS(modelDesc->feature[i].d); + + modelDesc->feature[i].a.real = ADRV904X_CTOHLL(modelDesc->feature[i].a.real); + modelDesc->feature[i].a.imag = ADRV904X_CTOHLL(modelDesc->feature[i].a.imag); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdActuatorGainMonitorConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdPowerMeterCfg_t* const dpdPowerMeterCfg) +{ + const uint16_t DPD_CTRL_PWR_MON_CONFIG_SET = 2 | DPD_CTRL_SET_CMD_FLAG; + adi_adrv904x_DfeAppCalDpdPowerMeterCfg_t tmpDpdPowerMeterCfg; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + uint32_t i = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dpdPowerMeterCfg, cleanup); + + ADI_LIBRARY_MEMCPY((void *)&tmpDpdPowerMeterCfg, dpdPowerMeterCfg, sizeof(adi_adrv904x_DfeAppCalDpdPowerMeterCfg_t)); + + recoveryAction = adrv904x_DpdActuatorGainMonitorConfigSetRangeCheck(device, dpdTxChannelMask, dpdPowerMeterCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DPD Actuator Gain monitor range check failed."); + goto cleanup; + } + + tmpDpdPowerMeterCfg.dpdInOutQualLim = ADRV904X_HTOCL(tmpDpdPowerMeterCfg.dpdInOutQualLim); + tmpDpdPowerMeterCfg.dpdInOutMinGainLim = ADRV904X_HTOCL(tmpDpdPowerMeterCfg.dpdInOutMinGainLim); + tmpDpdPowerMeterCfg.dpdInOutMaxGainLim = ADRV904X_HTOCL(tmpDpdPowerMeterCfg.dpdInOutMaxGainLim); + tmpDpdPowerMeterCfg.dpdInOutPwrMeasContDlyCntr = ADRV904X_HTOCS(tmpDpdPowerMeterCfg.dpdInOutPwrMeasContDlyCntr); + + for (i = 0; i < ADI_ADRV904X_MAX_TXCHANNELS; i++) + { + uint32_t txChan = (1 << i); + if (dpdTxChannelMask & txChan) + { + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + DPD_CTRL_PWR_MON_CONFIG_SET, + (adi_adrv904x_Channels_e)txChan, + (const uint8_t*)&tmpDpdPowerMeterCfg, + sizeof(tmpDpdPowerMeterCfg), + &lengthResp, + NULL, + 0); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChan, "Failed to send request"); + goto cleanup; + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdActuatorGainMonitorConfigGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e dpdTxChannelSel, + adi_adrv904x_DfeAppCalDpdPowerMeterCfg_t* const dpdPowerMeterCfg) +{ + const uint16_t DPD_CTRL_PWR_MON_CONFIG_GET = 2; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dpdPowerMeterCfg, cleanup); + + /*Check that if requested Tx Channel valid*/ + /* Channel must contain a single channel number (0-7) */ + recoveryAction = adrv904x_DfeVerifyChannel((adi_adrv904x_Channels_e)dpdTxChannelSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, dpdTxChannelSel, "channel parameter is invalid."); + goto cleanup; + } + + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + DPD_CTRL_PWR_MON_CONFIG_GET, + (adi_adrv904x_Channels_e)dpdTxChannelSel, + NULL, + 0, + &lengthResp, + (uint8_t*)dpdPowerMeterCfg, + sizeof(*dpdPowerMeterCfg)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + dpdPowerMeterCfg->dpdInOutQualLim = ADRV904X_CTOHL(dpdPowerMeterCfg->dpdInOutQualLim); + dpdPowerMeterCfg->dpdInOutMinGainLim = ADRV904X_HTOCL(dpdPowerMeterCfg->dpdInOutMinGainLim); + dpdPowerMeterCfg->dpdInOutMaxGainLim = ADRV904X_HTOCL(dpdPowerMeterCfg->dpdInOutMaxGainLim); + dpdPowerMeterCfg->dpdInOutPwrMeasContDlyCntr = ADRV904X_CTOHS(dpdPowerMeterCfg->dpdInOutPwrMeasContDlyCntr); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdCaptureConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdCaptureCfg_t* const dpdCaptureCfg) +{ + const uint16_t DPD_CTRL_CAPTURE_CONFIG_SET = 3 | DPD_CTRL_SET_CMD_FLAG; + adi_adrv904x_DfeAppCalDpdCaptureCfg_t tmpDpdCaptureCfg; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + uint32_t i = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dpdCaptureCfg, cleanup); + + recoveryAction = adrv904x_DpdCaptureConfigSetRangeCheck(device, dpdTxChannelMask, dpdCaptureCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DPD Actuator Gain monitor range check failed."); + goto cleanup; + } + + ADI_LIBRARY_MEMCPY((void *)&tmpDpdCaptureCfg, dpdCaptureCfg, sizeof(adi_adrv904x_DfeAppCalDpdCaptureCfg_t)); + + tmpDpdCaptureCfg.capPeakDetCfg.windowLength = ADRV904X_HTOCL(tmpDpdCaptureCfg.capPeakDetCfg.windowLength); + + for (i = 0; i < ADI_ADRV904X_MAX_TXCHANNELS; i++) + { + uint32_t txChan = (1 << i); + if (dpdTxChannelMask & txChan) + { + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + DPD_CTRL_CAPTURE_CONFIG_SET, + (adi_adrv904x_Channels_e)txChan, + (const uint8_t*)&tmpDpdCaptureCfg, + sizeof(tmpDpdCaptureCfg), + &lengthResp, + NULL, + 0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChan, "Failed to send request"); + goto cleanup; + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdCaptureConfigGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e dpdTxChannelSel, + adi_adrv904x_DfeAppCalDpdCaptureCfg_t* const dpdCaptureCfg) +{ + const uint16_t DPD_CTRL_CAPTURE_CONFIG_GET = 3; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dpdCaptureCfg, cleanup); + + /*Check that if requested Tx Channel valid*/ + /* Channel must contain a single channel number (0-7) */ + recoveryAction = adrv904x_DfeVerifyChannel((adi_adrv904x_Channels_e)dpdTxChannelSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, dpdTxChannelSel, "channel parameter is invalid."); + goto cleanup; + } + + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + DPD_CTRL_CAPTURE_CONFIG_GET, + (adi_adrv904x_Channels_e)dpdTxChannelSel, + NULL, + 0, + &lengthResp, + (uint8_t*)dpdCaptureCfg, + sizeof(*dpdCaptureCfg)); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + dpdCaptureCfg->capPeakDetCfg.windowLength = ADRV904X_CTOHL(dpdCaptureCfg->capPeakDetCfg.windowLength); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdTrackingConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdTrackCfg_t* const dpdTrackCfg) +{ + const uint16_t DPD_CTRL_TRACK_CONFIG_SET = 1 | DPD_CTRL_SET_CMD_FLAG; + adi_adrv904x_DfeAppCalDpdTrackCfg_t tmpDpdTrackCfg; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + uint32_t i = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dpdTrackCfg, cleanup); + + recoveryAction = adrv904x_DpdTrackingConfigSetRangeCheck(device, dpdTxChannelMask, dpdTrackCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "dpdTrackCfg range check failed."); + goto cleanup; + } + + ADI_LIBRARY_MEMCPY((void *)&tmpDpdTrackCfg, dpdTrackCfg, sizeof(adi_adrv904x_DfeAppCalDpdTrackCfg_t)); + + tmpDpdTrackCfg.adapt.numDpdSamples = ADRV904X_HTOCS(tmpDpdTrackCfg.adapt.numDpdSamples); + for (i = 0; i < ADI_ADRV904X_DFE_APP_CAL_DPD_MAX_NUM_COEFFICIENTS; i++) + { + tmpDpdTrackCfg.filterCoef[i] = ADRV904X_HTOCS(tmpDpdTrackCfg.filterCoef[i]); + } + tmpDpdTrackCfg.mThresholdDB = ADRV904X_HTOCL(tmpDpdTrackCfg.mThresholdDB); + tmpDpdTrackCfg.cThresholdDB = ADRV904X_HTOCL(tmpDpdTrackCfg.cThresholdDB); + tmpDpdTrackCfg.thresholdOverlapDB = ADRV904X_HTOCS(tmpDpdTrackCfg.thresholdOverlapDB); + tmpDpdTrackCfg.numberOfMultiFrames = ADRV904X_HTOCL(tmpDpdTrackCfg.numberOfMultiFrames); + tmpDpdTrackCfg.estSizeOfCoefBias = ADRV904X_HTOCS(tmpDpdTrackCfg.estSizeOfCoefBias); + tmpDpdTrackCfg.ctc1StatsSampleNum = ADRV904X_HTOCL(tmpDpdTrackCfg.ctc1StatsSampleNum); + tmpDpdTrackCfg.bwDetCfg.corrLagMax = ADRV904X_HTOCS(tmpDpdTrackCfg.bwDetCfg.corrLagMax); + + for (i = 0; i < ADI_ADRV904X_MAX_TXCHANNELS; i++) + { + uint32_t txChan = (1 << i); + if (dpdTxChannelMask & txChan) + { + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + DPD_CTRL_TRACK_CONFIG_SET, + (adi_adrv904x_Channels_e)txChan, + (const uint8_t*)&tmpDpdTrackCfg, + sizeof(tmpDpdTrackCfg), + &lengthResp, + NULL, + 0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChan, "Failed to send request"); + goto cleanup; + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdTrackingConfigGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e dpdTxChannelSel, + adi_adrv904x_DfeAppCalDpdTrackCfg_t* const dpdTrackCfg) +{ + const uint16_t DPD_CTRL_TRACK_CONFIG_GET = 1; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + uint32_t i = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dpdTrackCfg, cleanup); + + /*Check that if requested Tx Channel valid*/ + /* Channel must contain a single channel number (0-7) */ + recoveryAction = adrv904x_DfeVerifyChannel((adi_adrv904x_Channels_e)dpdTxChannelSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, dpdTxChannelSel, "channel parameter is invalid."); + goto cleanup; + } + + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + DPD_CTRL_TRACK_CONFIG_GET, + (adi_adrv904x_Channels_e)dpdTxChannelSel, + NULL, + 0, + &lengthResp, + (uint8_t*)dpdTrackCfg, + sizeof(*dpdTrackCfg)); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + dpdTrackCfg->adapt.numDpdSamples = ADRV904X_CTOHS(dpdTrackCfg->adapt.numDpdSamples); + + for (i = 0; i < ADI_ADRV904X_DFE_APP_CAL_DPD_MAX_NUM_COEFFICIENTS; i++) + { + dpdTrackCfg->filterCoef[i] = ADRV904X_CTOHS(dpdTrackCfg->filterCoef[i]); + } + + dpdTrackCfg->mThresholdDB = ADRV904X_CTOHL(dpdTrackCfg->mThresholdDB); + dpdTrackCfg->cThresholdDB = ADRV904X_CTOHL(dpdTrackCfg->cThresholdDB); + dpdTrackCfg->numberOfMultiFrames = ADRV904X_CTOHL(dpdTrackCfg->numberOfMultiFrames); + dpdTrackCfg->estSizeOfCoefBias = ADRV904X_CTOHS(dpdTrackCfg->estSizeOfCoefBias); + dpdTrackCfg->thresholdOverlapDB = ADRV904X_CTOHS(dpdTrackCfg->thresholdOverlapDB); + } + + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdPowerMeterConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdPowerMeterCfg_t* const dpdPowerMeterCfg) +{ + const uint16_t DPD_POWER_METER_CONFIG_SET = 2 | DPD_CTRL_SET_CMD_FLAG; + adi_adrv904x_DfeAppCalDpdPowerMeterCfg_t tmpDpdPowerMeterCfg; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + uint32_t i = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dpdPowerMeterCfg, cleanup); + + ADI_LIBRARY_MEMCPY((void *)&tmpDpdPowerMeterCfg, dpdPowerMeterCfg, sizeof(adi_adrv904x_DfeAppCalDpdPowerMeterCfg_t)); + + if (((dpdTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (dpdTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + for (i = 0; i < ADI_ADRV904X_MAX_TXCHANNELS; i++) + { + uint32_t txChan = (1 << i); + if (dpdTxChannelMask & txChan) + { + recoveryAction = adi_adrv904x_DfeAppControlCmdExec( device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + DPD_POWER_METER_CONFIG_SET, + (adi_adrv904x_Channels_e)txChan, + (const uint8_t*)&tmpDpdPowerMeterCfg, + sizeof(tmpDpdPowerMeterCfg), + &lengthResp, + NULL, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChan, "Failed to send request"); + goto cleanup; + } + } + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdPowerMeterConfigGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e dpdTxChannelSel, + adi_adrv904x_DfeAppCalDpdPowerMeterCfg_t* const dpdPowerMeterCfg) +{ + const uint16_t DPD_POWER_METER_CONFIG_GET = 2; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dpdPowerMeterCfg, cleanup); + + /*Check that if requested Tx Channel valid*/ + /* Channel must contain a single channel number (0-7) */ + recoveryAction = adrv904x_DfeVerifyChannel((adi_adrv904x_Channels_e)dpdTxChannelSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, dpdTxChannelSel, "channel parameter is invalid."); + goto cleanup; + } + + recoveryAction = adi_adrv904x_DfeAppControlCmdExec( device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + DPD_POWER_METER_CONFIG_GET, + (adi_adrv904x_Channels_e)dpdTxChannelSel, + NULL, + 0, + &lengthResp, + (uint8_t*)dpdPowerMeterCfg, + sizeof(*dpdPowerMeterCfg)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + dpdPowerMeterCfg->dpdInOutQualLim = ADRV904X_CTOHL(dpdPowerMeterCfg->dpdInOutQualLim); + dpdPowerMeterCfg->dpdInOutMinGainLim = ADRV904X_CTOHL(dpdPowerMeterCfg->dpdInOutMinGainLim); + dpdPowerMeterCfg->dpdInOutMaxGainLim = ADRV904X_CTOHL(dpdPowerMeterCfg->dpdInOutMaxGainLim); + dpdPowerMeterCfg->dpdInOutPwrMeasDuration = ADRV904X_CTOHS(dpdPowerMeterCfg->dpdInOutPwrMeasDuration); + dpdPowerMeterCfg->dpdInOutPwrMeasContDlyCntr = ADRV904X_CTOHS(dpdPowerMeterCfg->dpdInOutPwrMeasContDlyCntr); + dpdPowerMeterCfg->dpdInOutPwrMeasEn = ADRV904X_CTOHS(dpdPowerMeterCfg->dpdInOutPwrMeasEn); + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdCaptureBuffersAccessSet(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + adi_adrv904x_DfeAppFrameworkTrackingCalCapBufAccessSet_t* const dpdCapBufAccess) +{ + const uint16_t DPD_CTRL_CAPTURE_BUF_ACCESS_SET = 5 | DPD_CTRL_SET_CMD_FLAG; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dpdCapBufAccess, cleanup); + + recoveryAction = adrv904x_DfeCaptureBuffersAccessSet(device, + dpdTxChannelMask, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + DPD_CTRL_CAPTURE_BUF_ACCESS_SET, + dpdCapBufAccess); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to send request"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdCaptureBuffersAccessGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e dpdTxChannelSel, + adi_adrv904x_DfeAppFrameworkTrackingCalCapBufAccessGet_t* const dpdCapBufAccess) +{ + const uint16_t DPD_CTRL_CAPTURE_BUF_ACCESS_GET = 5; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dpdCapBufAccess, cleanup); + + recoveryAction = adrv904x_DfeCaptureBuffersAccessGet(device, + dpdTxChannelSel, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + DPD_CTRL_CAPTURE_BUF_ACCESS_GET, + dpdCapBufAccess); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to send request"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeDpdActSatStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + adi_adrv904x_DfeSvcDfeActuatorSaturation_t* const calDpdActSatStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const adi_adrv904x_DfeAppFrameworkTrackingCalibrationMask_e calId = ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_TX_DPD_MASK; + adi_adrv904x_DfeAppCalDpdStatus_t specificCalStatus; + + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, calDpdActSatStatus, cleanup); + + /*Check that if requested Tx Channel valid*/ + /* Channel must contain a single channel number (0-7) */ + recoveryAction = adrv904x_DfeVerifyChannel(channel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "channel parameter is invalid."); + goto cleanup; + } + + /* Use the common cal status get handler to get the data from the CPU */ + recoveryAction = adi_adrv904x_DfeCalSpecificStatusGet(device, + channel, + adrv904x_DfeTrackingCalToObjId(calId), + (uint8_t *)&specificCalStatus, + sizeof(specificCalStatus)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error getting tracking cal status."); + goto cleanup; + } + + calDpdActSatStatus->dinsqCalcCmulSat = ADRV904X_CTOHL(specificCalStatus.dfeActSatStatus.dinsqCalcCmulSat); + calDpdActSatStatus->gmpDdrDpSat = ADRV904X_CTOHL(specificCalStatus.dfeActSatStatus.gmpDdrDpSat); + calDpdActSatStatus->magnitudeGainSat = ADRV904X_CTOHL(specificCalStatus.dfeActSatStatus.magnitudeGainSat); + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeDpdActiveModelTableGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + uint8_t* const calDpdActiveModelTable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const adi_adrv904x_DfeAppFrameworkTrackingCalibrationMask_e calId = ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_TX_DPD_MASK; + adi_adrv904x_DfeAppCalDpdStatus_t specificCalStatus; + + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, calDpdActiveModelTable, cleanup); + + /*Check that if requested Tx Channel valid*/ + /* Channel must contain a single channel number (0-7) */ + recoveryAction = adrv904x_DfeVerifyChannel(channel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "channel parameter is invalid."); + goto cleanup; + } + + /* Use the common cal status get handler to get the data from the CPU */ + recoveryAction = adi_adrv904x_DfeCalSpecificStatusGet( device, + channel, + adrv904x_DfeTrackingCalToObjId(calId), + (uint8_t *)&specificCalStatus, + sizeof(specificCalStatus)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error getting tracking cal status."); + goto cleanup; + } + + *calDpdActiveModelTable = specificCalStatus.activeModel; + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeDpdCaptureDataFromBufMemGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e orxChannelSel, + adi_adrv904x_DfeAppDpdCaptureData_t* dpdCaptureData) +{ + const uint32_t CAPBUFF0_ADDR = 0xb2080000U; + const uint32_t CAPBUFF1_ADDR = 0xb2180000U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_Bf_CapBufMmr_Ch0SrcSel_e ch0SrcSel = ADRV904X_BF_CAP_BUF_MMR_CH0_SRC_SEL_RSVD; + adrv904x_Bf_CapBufMmr_Ch1SrcSel_e ch1SrcSel = ADRV904X_BF_CAP_BUF_MMR_CH1_SRC_SEL_RSVD; + adrv904x_Bf_CapBufMmr_Ch2SrcSel_e ch2SrcSel = ADRV904X_BF_CAP_BUF_MMR_CH2_SRC_SEL_RSVD; + adrv904x_Bf_CapBufMmr_CapEnSrc_e capEnSrc = ADRV904X_BF_CAP_BUF_MMR_CAP_EN_SRC_CAP_EN_NONE; + adrv904x_Bf_CapBufMmr_CapPauseSrc_e capPauseSrc = ADRV904X_BF_CAP_BUF_MMR_CAP_PAUSE_SRC_CAP_PAUSE_SLICE; + uint32_t captureBuffer[ADI_ADRV904X_DFE_APP_CAL_DPD_CAPTURE_SAMPLES_NUM] = { 0U }; + adrv904x_BfCapBufMmrChanAddr_e capBufMmrRegisterBankBaseAddr = ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_0_; + uint32_t captureBufferAddr[ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_NUM_OF_CH_SRC_SEL] = { 0U }; + uint32_t capBufMmrRamBaseAddr = CAPBUFF0_ADDR; + adi_adrv904x_DfeSvcDfeCaptureChSrcSel_e srcSelForCh[ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_NUM_OF_CH_SRC_SEL] = + { ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_NUM_OF_CH_SRC_SEL }; + uint16_t capDepth = 0U; + uint8_t capChannel = 0U; + uint8_t capNumChannels = 0U; + uint32_t sampleIdx = 0U; + uint16_t sampleArrSize = 0U; + int16_t* dpdCaptureDataI = NULL; + int16_t* dpdCaptureDataQ = NULL; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dpdCaptureData, cleanup); + + ADI_LIBRARY_MEMSET(dpdCaptureData, 0, sizeof(adi_adrv904x_DfeAppDpdCaptureData_t)); + + /* orxChannelSel must contain a single ORx channel number (0-1) */ + if ((orxChannelSel != ADI_ADRV904X_CH0) && + (orxChannelSel != ADI_ADRV904X_CH1)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + goto cleanup; + } + + /* Update the capture buffer register bank and RAM addresses base on TX channel */ + if (orxChannelSel > ADI_ADRV904X_CH0) + { + capBufMmrRamBaseAddr = CAPBUFF1_ADDR; + capBufMmrRegisterBankBaseAddr = ADRV904X_BF_PROC_DFE_PERIP_CAPBUF_1_; + } + + /* Get the number of captured samples from CAP_DEPTH.Capture_depth bitfield */ + recoveryAction = adrv904x_CapBufMmr_CaptureDepth_BfGet(device, + NULL, + capBufMmrRegisterBankBaseAddr, + &capDepth); + if ((recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) || (capDepth == 0)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, capDepth, "Invalid value of CAP_DEPTH.Capture_depth"); + goto cleanup; + } + + sampleArrSize = 2 * (capDepth + 1); + if(sampleArrSize > ADI_ADRV904X_DFE_APP_CAL_DPD_CAPTURE_SAMPLES_NUM) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, capDepth, "Unsupported sample array size"); + goto cleanup; + } + + dpdCaptureData->txCaptureData.dpdCaptureSampleArrSize = sampleArrSize; + dpdCaptureData->txAltCaptureData.dpdCaptureSampleArrSize = sampleArrSize; + dpdCaptureData->orxCaptureData.dpdCaptureSampleArrSize = sampleArrSize; + + /* Get the number of channels for capture from CAP_NUM_CHANNELS.num_channels bitfield */ + recoveryAction = adrv904x_CapBufMmr_NumChannels_BfGet(device, + NULL, + capBufMmrRegisterBankBaseAddr, + &capNumChannels); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, capNumChannels, "Failed to retrieve the value of CAP_NUM_CHANNELS.num_channels"); + goto cleanup; + } + + /* Check if capNumChannels parameter is valid */ + if(capNumChannels == 2U) + { + captureBufferAddr[0U] = capBufMmrRamBaseAddr; + captureBufferAddr[1U] = captureBufferAddr[0U] + 0x8000; + captureBufferAddr[2U] = 0U; + } + else if(capNumChannels == 3U) + { + captureBufferAddr[0U] = capBufMmrRamBaseAddr; + captureBufferAddr[1U] = captureBufferAddr[0U] + 0x8000; + captureBufferAddr[2U] = captureBufferAddr[0U] + 0x4000; + + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + capNumChannels, + "Invalid number of channels for capture"); + goto cleanup; + } + + recoveryAction = adrv904x_CapBufMmr_Ch0SrcSel_BfGet(device, + NULL, + capBufMmrRegisterBankBaseAddr, + &ch0SrcSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, ch0SrcSel, "Failed to retrieve the value of CAP_CH_SRC_SEL.ch0_src_sel"); + goto cleanup; + } + if (ch0SrcSel > ADRV904X_BF_CAP_BUF_MMR_CH0_SRC_SEL_ORX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, ch0SrcSel, "Failed to retrieve the value of CAP_CH_SRC_SEL.ch0_src_sel"); + goto cleanup; + } + + recoveryAction = adrv904x_CapBufMmr_Ch1SrcSel_BfGet(device, + NULL, + capBufMmrRegisterBankBaseAddr, + &ch1SrcSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, ch1SrcSel, "Failed to retrieve the value of CAP_CH_SRC_SEL.ch1src_sel"); + goto cleanup; + } + if (ch1SrcSel > ADRV904X_BF_CAP_BUF_MMR_CH1_SRC_SEL_ORX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, ch1SrcSel, "Failed to retrieve the value of CAP_CH_SRC_SEL.ch1_src_sel"); + goto cleanup; + } + + if (capNumChannels == 3U) + { + recoveryAction = adrv904x_CapBufMmr_Ch2SrcSel_BfGet(device, + NULL, + capBufMmrRegisterBankBaseAddr, + &ch2SrcSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, ch2SrcSel, "Failed to retrieve the value of CAP_CH_SRC_SEL.ch2src_sel"); + goto cleanup; + } + if (ch2SrcSel > ADRV904X_BF_CAP_BUF_MMR_CH2_SRC_SEL_ORX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, ch2SrcSel, "Failed to retrieve the value of CAP_CH_SRC_SEL.ch2src_sel"); + goto cleanup; + } + } + + srcSelForCh[0] = (adi_adrv904x_DfeSvcDfeCaptureChSrcSel_e)ch0SrcSel; + srcSelForCh[1] = (adi_adrv904x_DfeSvcDfeCaptureChSrcSel_e)ch1SrcSel; + srcSelForCh[2] = (adi_adrv904x_DfeSvcDfeCaptureChSrcSel_e)ch2SrcSel; + + /* Get cap_en_src mode */ + recoveryAction = adrv904x_CapBufMmr_CapEnSrc_BfGet(device, + NULL, + capBufMmrRegisterBankBaseAddr, + &capEnSrc); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set cap_en_src to CAP_EN_SW mode"); + goto cleanup; + } + + /* Get cap_pause_src */ + recoveryAction = adrv904x_CapBufMmr_CapPauseSrc_BfGet(device, + NULL, + capBufMmrRegisterBankBaseAddr, + &capPauseSrc); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set cap_pause_src to CAP_PAUSE_SW mode"); + goto cleanup; + } + + /* Disable clock */ + recoveryAction = adrv904x_CapBufMmr_ClockEnable_BfSet(device, + NULL, + capBufMmrRegisterBankBaseAddr, + 0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to disable clock"); + goto cleanup; + } + + /* Enable the capture buffer debug mode */ + recoveryAction = adrv904x_CapBufMmr_DebugModeEn_BfSet(device, + NULL, + capBufMmrRegisterBankBaseAddr, + 1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to enable capture buffer debug mode"); + goto cleanup; + } + + /* Enable clock */ + recoveryAction = adrv904x_CapBufMmr_ClockEnable_BfSet(device, + NULL, + capBufMmrRegisterBankBaseAddr, + 1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to disable clock"); + goto cleanup; + } + + /* Set cap_en_src to CAP_EN_SW mode */ + recoveryAction = adrv904x_CapBufMmr_CapEnSrc_BfSet(device, + NULL, + capBufMmrRegisterBankBaseAddr, + ADRV904X_BF_CAP_BUF_MMR_CAP_EN_SRC_CAP_EN_SW); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set cap_en_src to CAP_EN_SW mode"); + goto cleanup; + } + + /* Set cap_pause_src to CAP_PAUSE_SW mode */ + recoveryAction = adrv904x_CapBufMmr_CapPauseSrc_BfSet(device, + NULL, + capBufMmrRegisterBankBaseAddr, + ADRV904X_BF_CAP_BUF_MMR_CAP_PAUSE_SRC_CAP_PAUSE_SW); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set cap_pause_src to CAP_PAUSE_SW mode"); + goto cleanup; + } + + for (capChannel = 0; capChannel < capNumChannels; capChannel++) + { + /* Check address of buffer used for capture channel 2 */ + if ((capChannel == 2U) && (captureBufferAddr[2] == 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Buffer address for capture channel 2 is NULL"); + goto cleanup; + } + + /* Read the capture data through SPI */ + recoveryAction = adi_adrv904x_Registers32Read(device, NULL, captureBufferAddr[capChannel], captureBuffer, NULL, sampleArrSize); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DPD capture data"); + goto cleanup; + } + + if (srcSelForCh[capChannel] == ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_CH_SRC_SEL_TX) + { + dpdCaptureDataI = dpdCaptureData->txCaptureData.dpdCaptureDataI; + dpdCaptureDataQ = dpdCaptureData->txCaptureData.dpdCaptureDataQ; + } + else if (srcSelForCh[capChannel] == ADI_ADRV904X_DFE_SVC_DFE_CAPTURE_CH_SRC_SEL_ALT_TX) + { + dpdCaptureDataI = dpdCaptureData->txAltCaptureData.dpdCaptureDataI; + dpdCaptureDataQ = dpdCaptureData->txAltCaptureData.dpdCaptureDataQ; + } + else + { + dpdCaptureDataI = dpdCaptureData->orxCaptureData.dpdCaptureDataI; + dpdCaptureDataQ = dpdCaptureData->orxCaptureData.dpdCaptureDataQ; + } + + for (sampleIdx = 0U; sampleIdx < sampleArrSize; sampleIdx++) + { + dpdCaptureDataQ[sampleIdx] = captureBuffer[sampleIdx] & 0x0000FFFFU; + dpdCaptureDataI[sampleIdx] = (captureBuffer[sampleIdx] >> 16U) & 0x0000FFFFU; + } + } + + recoveryAction = adrv904x_CapBufMmr_CapEnSrc_BfSet(device, + NULL, + capBufMmrRegisterBankBaseAddr, + capEnSrc); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set cap_en_src to CAP_EN_SW mode"); + goto cleanup; + } + + recoveryAction = adrv904x_CapBufMmr_CapPauseSrc_BfSet(device, + NULL, + capBufMmrRegisterBankBaseAddr, + capPauseSrc); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set cap_pause_src to CAP_PAUSE_SW mode"); + goto cleanup; + } + + /* Disable the capture buffer debug mode */ + recoveryAction = adrv904x_CapBufMmr_DebugModeEn_BfSet(device, + NULL, + capBufMmrRegisterBankBaseAddr, + 0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to disable capture buffer debug mode"); + goto cleanup; + } + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeDpdCalSpecificStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e channel, + adi_adrv904x_DfeAppCalDpdStatus_t* const calDpdSpecStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const adi_adrv904x_DfeAppFrameworkTrackingCalibrationMask_e calId = ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_TX_DPD_MASK; + adi_adrv904x_DfeAppCalDpdStatus_t specificCalStatus; + + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, calDpdSpecStatus, cleanup); + + /*Check that if requested Tx Channel valid*/ + /* Channel must contain a single channel number (0-7) */ + recoveryAction = adrv904x_DfeVerifyChannel(channel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channel, "channel parameter is invalid."); + goto cleanup; + } + + /* Use the common cal status get handler to get the data from the CPU */ + recoveryAction = adi_adrv904x_DfeCalSpecificStatusGet(device, + channel, + adrv904x_DfeTrackingCalToObjId(calId), + (uint8_t *)&specificCalStatus, + sizeof(specificCalStatus)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error getting tracking cal status."); + goto cleanup; + } + + /* Translate the response from the CPU */ + calDpdSpecStatus->hdr.errorCode = ADRV904X_CTOHL(specificCalStatus.hdr.errorCode); + calDpdSpecStatus->hdr.iterCount = ADRV904X_CTOHL(specificCalStatus.hdr.iterCount); + calDpdSpecStatus->hdr.percentComplete = ADRV904X_CTOHL(specificCalStatus.hdr.percentComplete); + calDpdSpecStatus->hdr.performanceMetric = ADRV904X_CTOHL(specificCalStatus.hdr.performanceMetric); + calDpdSpecStatus->hdr.updateCount = ADRV904X_CTOHL(specificCalStatus.hdr.updateCount); + + calDpdSpecStatus->dpdPathDlyStatus.intActDelay = ADRV904X_CTOHL(specificCalStatus.dpdPathDlyStatus.intActDelay); + calDpdSpecStatus->dpdPathDlyStatus.intExtDelay = ADRV904X_CTOHL(specificCalStatus.dpdPathDlyStatus.intExtDelay); + calDpdSpecStatus->dpdPathDlyStatus.fracExtDelay = ADRV904X_CTOHL(specificCalStatus.dpdPathDlyStatus.fracExtDelay); + + calDpdSpecStatus->dfeActSatStatus.dinsqCalcCmulSat = ADRV904X_CTOHL(specificCalStatus.dfeActSatStatus.dinsqCalcCmulSat); + calDpdSpecStatus->dfeActSatStatus.gmpDdrDpSat = ADRV904X_CTOHL(specificCalStatus.dfeActSatStatus.gmpDdrDpSat); + calDpdSpecStatus->dfeActSatStatus.magnitudeGainSat = ADRV904X_CTOHL(specificCalStatus.dfeActSatStatus.magnitudeGainSat); + + calDpdSpecStatus->activeModel = ADRV904X_CTOHL(specificCalStatus.activeModel); + calDpdSpecStatus->updatedModel = ADRV904X_CTOHL(specificCalStatus.updatedModel); + calDpdSpecStatus->powerR = ADRV904X_CTOHL(specificCalStatus.powerR); + calDpdSpecStatus->txPower = ADRV904X_CTOHL(specificCalStatus.txPower); + calDpdSpecStatus->copiedModelMask = specificCalStatus.copiedModelMask; + for (uint8_t i = 0; i < ADI_ADRV904X_DFE_APP_CAL_DPD_MAX_NUM_PARTIAL_GRP; i++) + { + calDpdSpecStatus->powerM[i] = ADRV904X_CTOHL(specificCalStatus.powerM[i]); + calDpdSpecStatus->powerC[i] = ADRV904X_CTOHL(specificCalStatus.powerC[i]); + } + + for (int i = 0; i < ADI_ADRV904X_DFE_APP_CAL_DPD_STABILITY_LEN; i++) + { + calDpdSpecStatus->stability[i] = ADRV904X_CTOHL(specificCalStatus.stability[i]); + } + for (int i = 0; i < ADI_ADRV904X_DFE_APP_CAL_DPD_ERR_WORD_LEN; i++) + { + calDpdSpecStatus->errStatWord[i] = ADRV904X_CTOHS(specificCalStatus.errStatWord[i]); + } + for (int i = 0; i < ADI_ADRV904X_DFE_APP_CAL_DPD_ERR_WORD_LEN; i++) + { + calDpdSpecStatus->actionWord[i] = ADRV904X_CTOHS(specificCalStatus.actionWord[i]); + } + calDpdSpecStatus->capStartRetryCount = ADRV904X_CTOHL(specificCalStatus.capStartRetryCount); + calDpdSpecStatus->capAbortRetryCount = ADRV904X_CTOHL(specificCalStatus.capAbortRetryCount); + calDpdSpecStatus->capInvalidRetryCount = ADRV904X_CTOHL(specificCalStatus.capInvalidRetryCount); + calDpdSpecStatus->maxFracEstErrorCount = ADRV904X_CTOHL(specificCalStatus.maxFracEstErrorCount); + calDpdSpecStatus->cholSolverErrorCount = ADRV904X_CTOHL(specificCalStatus.cholSolverErrorCount); + calDpdSpecStatus->appExitRequestCount = ADRV904X_CTOHL(specificCalStatus.appExitRequestCount); + calDpdSpecStatus->lutEntrySatErrorCount = ADRV904X_CTOHL(specificCalStatus.lutEntrySatErrorCount); + calDpdSpecStatus->stabilityErrorCount = ADRV904X_CTOHL(specificCalStatus.stabilityErrorCount); + calDpdSpecStatus->lowPowerErrorCount = ADRV904X_CTOHL(specificCalStatus.lowPowerErrorCount); + calDpdSpecStatus->highPowerErrorCount = ADRV904X_CTOHL(specificCalStatus.highPowerErrorCount); + calDpdSpecStatus->saturationErrorCount = ADRV904X_CTOHL(specificCalStatus.saturationErrorCount); + calDpdSpecStatus->lowPeakErrorCount = ADRV904X_CTOHL(specificCalStatus.lowPeakErrorCount); + calDpdSpecStatus->capAbortErrorCount = ADRV904X_CTOHL(specificCalStatus.capAbortErrorCount); + calDpdSpecStatus->pathDelayErrorCount = ADRV904X_CTOHL(specificCalStatus.pathDelayErrorCount); + calDpdSpecStatus->capInvalidErrorCount = ADRV904X_CTOHL(specificCalStatus.capInvalidErrorCount); + calDpdSpecStatus->noLutUpdateCount = ADRV904X_CTOHL(specificCalStatus.noLutUpdateCount); + calDpdSpecStatus->noFlutUpdateCount = ADRV904X_CTOHL(specificCalStatus.noFlutUpdateCount); + + calDpdSpecStatus->capStartErrorCount = ADRV904X_CTOHL(specificCalStatus.capStartErrorCount); + calDpdSpecStatus->periodEndedErrorCount = ADRV904X_CTOHL(specificCalStatus.periodEndedErrorCount); + calDpdSpecStatus->lutUpdDmaNotTrigCount = ADRV904X_CTOHL(specificCalStatus.lutUpdDmaNotTrigCount); + for (uint8_t i = 0; i < ADI_ADRV904X_DFE_APP_CAL_DPD_GMP_POWER_MODELS; i++) + { + calDpdSpecStatus->lutSaturationMask[i] = ADRV904X_CTOHLL(specificCalStatus.lutSaturationMask[i]); + } + + for (uint8_t i = 0; i < 8; i++) + { + calDpdSpecStatus->ctc1UpThresVals[i] = ADRV904X_CTOHLL(specificCalStatus.ctc1UpThresVals[i]); + calDpdSpecStatus->ctc1LowThresVals[i] = ADRV904X_CTOHLL(specificCalStatus.ctc1LowThresVals[i]); + } + + calDpdSpecStatus->ctc1MaxPeakVal = ADRV904X_CTOHLL(specificCalStatus.ctc1MaxPeakVal); + calDpdSpecStatus->ctc1MinPeakVal = ADRV904X_CTOHLL(specificCalStatus.ctc1MinPeakVal); + + /* + * TODO: revist defs for ADRV904X_CTOHL and ADRV904X_CTOHLL with big endian hosts. + * Currently they do NOT appear to work for float and double types in this case. + */ + calDpdSpecStatus->bwDetStatus.beta2Curr = ADRV904X_CTOHL(specificCalStatus.bwDetStatus.beta2Curr); + calDpdSpecStatus->bwDetStatus.beta2Prev = ADRV904X_CTOHL(specificCalStatus.bwDetStatus.beta2Prev); + calDpdSpecStatus->bwDetStatus.beta2Min = ADRV904X_CTOHL(specificCalStatus.bwDetStatus.beta2Min); + calDpdSpecStatus->bwDetStatus.beta2Max = ADRV904X_CTOHL(specificCalStatus.bwDetStatus.beta2Max); + calDpdSpecStatus->bwDetStatus.extDelayTrack = ADRV904X_CTOHLL(specificCalStatus.bwDetStatus.extDelayTrack); + calDpdSpecStatus->bwDetStatus.bwDetStateCurr = specificCalStatus.bwDetStatus.bwDetStateCurr; + calDpdSpecStatus->bwDetStatus.bwDetStateBest = specificCalStatus.bwDetStatus.bwDetStateBest; + calDpdSpecStatus->learningModeCurr = specificCalStatus.learningModeCurr; + + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdStabilityCfgSet(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + adi_adrv904x_DfeAppCalDpdStabilityCfg_t* const dpdStabilityCfg) +{ + const uint16_t DPD_CTRL_STABILITY_CFG_SET = 6 | DPD_CTRL_SET_CMD_FLAG; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + uint32_t lengthResp = 0; + uint32_t i = 0; + adi_adrv904x_DfeAppCalDpdStabilityCfg_t dpdStabilityCfgTmp; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dpdStabilityCfg, cleanup); + + if (((dpdTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (dpdTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + dpdTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + ADI_LIBRARY_MEMSET(&dpdStabilityCfgTmp, 0, sizeof(adi_adrv904x_DfeAppCalDpdStabilityCfg_t)); + + for (i = 0; i < ADI_ADRV904X_DFE_APP_CAL_DPD_STABILITY_LEN; i++) + { + dpdStabilityCfgTmp.bit[i].LTGT = ADRV904X_HTOCS(dpdStabilityCfg->bit[i].LTGT); + dpdStabilityCfgTmp.bit[i].persistentCnt = ADRV904X_HTOCS(dpdStabilityCfg->bit[i].persistentCnt); + dpdStabilityCfgTmp.bit[i].threshold0 = ADRV904X_HTOCS(dpdStabilityCfg->bit[i].threshold0); + dpdStabilityCfgTmp.bit[i].threshold1 = ADRV904X_HTOCS(dpdStabilityCfg->bit[i].threshold1); + } + + for (i = 0; i < ADI_ADRV904X_DFE_APP_CAL_DPD_ERR_WORD_LEN; i++) + { + dpdStabilityCfgTmp.error[i].actionWord = ADRV904X_HTOCS(dpdStabilityCfg->error[i].actionWord); + dpdStabilityCfgTmp.error[i].mask = ADRV904X_HTOCS(dpdStabilityCfg->error[i].mask); + } + + for (i = 0; i < ADI_ADRV904X_MAX_TXCHANNELS; i++) + { + uint32_t txChan = (1 << i); + if (dpdTxChannelMask & txChan) + { + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + DPD_CTRL_STABILITY_CFG_SET, + (adi_adrv904x_Channels_e)txChan, + (const uint8_t*)&dpdStabilityCfgTmp, + sizeof(dpdStabilityCfgTmp), + &lengthResp, + NULL, + 0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChan, "Failed to send request"); + goto cleanup; + } + } + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdStabilityCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e dpdTxChannelSel, + adi_adrv904x_DfeAppCalDpdStabilityCfg_t* const dpdStabilityCfg) +{ + const uint16_t DPD_CTRL_STABILITY_CFG_GET = 6; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + uint32_t i = 0; + adi_adrv904x_DfeAppCalDpdStabilityCfg_t dpdStabilityCfgTmp; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dpdStabilityCfg, cleanup); + + /*Check that if requested Tx Channel valid*/ + /* Channel must contain a single channel number (0-7) */ + recoveryAction = adrv904x_DfeVerifyChannel((adi_adrv904x_Channels_e)dpdTxChannelSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, dpdTxChannelSel, "channel parameter is invalid."); + goto cleanup; + } + + ADI_LIBRARY_MEMSET(&dpdStabilityCfgTmp, 0, sizeof(adi_adrv904x_DfeAppCalDpdStabilityCfg_t)); + + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + DPD_CTRL_STABILITY_CFG_GET, + (adi_adrv904x_Channels_e)dpdTxChannelSel, + NULL, + 0, + &lengthResp, + (uint8_t*)&dpdStabilityCfgTmp, + sizeof(dpdStabilityCfgTmp)); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, dpdTxChannelSel, "Failed to send request"); + goto cleanup; + } + + for (i = 0; i < ADI_ADRV904X_DFE_APP_CAL_DPD_STABILITY_LEN; i++) + { + dpdStabilityCfg->bit[i].LTGT = ADRV904X_CTOHS(dpdStabilityCfgTmp.bit[i].LTGT); + dpdStabilityCfg->bit[i].persistentCnt = ADRV904X_CTOHS(dpdStabilityCfgTmp.bit[i].persistentCnt); + dpdStabilityCfg->bit[i].threshold0 = ADRV904X_CTOHS(dpdStabilityCfgTmp.bit[i].threshold0); + dpdStabilityCfg->bit[i].threshold1 = ADRV904X_CTOHS(dpdStabilityCfgTmp.bit[i].threshold1); + } + + for (i = 0; i < ADI_ADRV904X_DFE_APP_CAL_DPD_ERR_WORD_LEN; i++) + { + dpdStabilityCfg->error[i].actionWord = ADRV904X_CTOHS(dpdStabilityCfgTmp.error[i].actionWord); + dpdStabilityCfg->error[i].mask = ADRV904X_CTOHS(dpdStabilityCfgTmp.error[i].mask); + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_WbRegBufferAccess(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeAppwbRegularization_t* const dfeAppWbReg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_NO_ERROR; + adrv904x_DfeSvcCmdStatus_t svcCmdStatus; + adrv904x_DfeSvcCmdWbRegBufferAccessResp_t dfeSvcWbRegResp; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dfeAppWbReg, cleanup); + + ADI_LIBRARY_MEMSET(&dfeSvcWbRegResp, 0, sizeof(adrv904x_DfeSvcCmdWbRegBufferAccessResp_t)); + + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_WBREG_ACCESS, + NULL, + 0, + (void*)&dfeSvcWbRegResp, + sizeof(adrv904x_DfeSvcCmdWbRegBufferAccessResp_t), + &svcCmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(dfeSvcWbRegResp.status, (adrv904x_CpuCmdStatus_e)svcCmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + dfeAppWbReg->wbRegStartAddress = ADRV904X_CTOHLL(dfeSvcWbRegResp.wbRegStartAddress); + dfeAppWbReg->wbRegBufferSize = ADRV904X_CTOHL(dfeSvcWbRegResp.wbRegBufferSize); + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_WbRegBufferWrite(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeAppwbRegData_t* const DfeAppWbRegData) +{ + uint32_t i = 0u; + uint16_t* DfeAppWbRegDataTmp = (uint16_t*)DfeAppWbRegData; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adi_adrv904x_SpiCache_t spiCache; + adi_adrv904x_DfeAppwbRegularization_t dfeAppWbRegTmp; + adi_adrv904x_DfeAppwbRegularization_t dfeAppWbReg; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, DfeAppWbRegData, cleanup); + + ADI_LIBRARY_MEMSET(&dfeAppWbRegTmp, 0, sizeof(adi_adrv904x_DfeAppwbRegularization_t)); + ADI_LIBRARY_MEMSET(&spiCache, 0, sizeof(adi_adrv904x_SpiCache_t)); + + recoveryAction = adi_adrv904x_WbRegBufferAccess(device, + &dfeAppWbRegTmp); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, 0, "Failed to send WBReg access request"); + goto cleanup; + } + + dfeAppWbReg.wbRegStartAddress = ADRV904X_CTOHLL(dfeAppWbRegTmp.wbRegStartAddress); + dfeAppWbReg.wbRegBufferSize = ADRV904X_CTOHL(dfeAppWbRegTmp.wbRegBufferSize); + + for (i = dfeAppWbReg.wbRegStartAddress; i < (dfeAppWbReg.wbRegStartAddress + dfeAppWbReg.wbRegBufferSize); i += 2U) + { + recoveryAction = adi_adrv904x_Register32Write(device, (adi_adrv904x_SpiCache_t* const)&spiCache, i, ADRV904X_HTOCS(*DfeAppWbRegDataTmp++), 0x0000FFFFu); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, 0, "Failed to write WBReg data"); + goto cleanup; + } + } + + recoveryAction = adi_adrv904x_SpiFlush(device, spiCache.data, (uint32_t* const)&spiCache.count); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, 0, "Failed to send SPI Flush"); + goto cleanup; + } + + /* call a 2nd time to clear the cache */ + recoveryAction = adi_adrv904x_WbRegBufferAccess(device, &dfeAppWbRegTmp); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, 0, "Failed to send WBReg cleanup"); + goto cleanup; + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdTddLutSwitchCfgSet(adi_adrv904x_Device_t* const device, + const uint32_t dfeTxChannelMask, + const adi_adrv904x_DfeAppDpdActTddLutSwitch_t* const tddLutSwitchConfig) +{ + const uint16_t DPD_CTRL_TDD_LUT_SWITCH_CONFIG_SET = 8 | DPD_CTRL_SET_CMD_FLAG; + adi_adrv904x_DfeAppDpdActTddLutSwitch_t tmpTddLutSwitchConfig; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + uint32_t i = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, tddLutSwitchConfig, cleanup); + + ADI_LIBRARY_MEMSET(&tmpTddLutSwitchConfig, 0, sizeof(adi_adrv904x_DfeAppDpdActTddLutSwitch_t)); + tmpTddLutSwitchConfig.txOnMdl0SwitchEn = ADRV904X_HTOCS(tddLutSwitchConfig->txOnMdl0SwitchEn); + tmpTddLutSwitchConfig.txOnMdl1SwitchEn = ADRV904X_HTOCS(tddLutSwitchConfig->txOnMdl1SwitchEn); + tmpTddLutSwitchConfig.txOnMdlSwitchDlyCnt = ADRV904X_HTOCS(tddLutSwitchConfig->txOnMdlSwitchDlyCnt); + + for (i = 0; i < ADI_ADRV904X_DFE_APP_CAL_DPD_TDD_LUT_SWITCH_CAP_NUM; i++) + { + tmpTddLutSwitchConfig.capDelay[i] = ADRV904X_HTOCS(tddLutSwitchConfig->capDelay[i]); + } + + for (i = 0; i < ADI_ADRV904X_MAX_TXCHANNELS; i++) + { + uint32_t txChan = 1 << i; + if (dfeTxChannelMask & txChan) + { + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + DPD_CTRL_TDD_LUT_SWITCH_CONFIG_SET, + (adi_adrv904x_Channels_e)txChan, + (const uint8_t*)&tmpTddLutSwitchConfig, + sizeof(tmpTddLutSwitchConfig), + &lengthResp, + NULL, + 0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChan, "Failed to send TDD lut switch cfgset request"); + goto cleanup; + } + } + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); + +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdTddLutSwitchCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e dpdTxChannelSel, + adi_adrv904x_DfeAppDpdActTddLutSwitch_t* const tddLutSwitchConfig) +{ + const uint16_t DPD_CTRL_TDD_LUT_SWITCH_CONFIG_GET = 8; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + uint32_t i = 0; + adi_adrv904x_DfeAppDpdActTddLutSwitch_t tmpTddLutSwitchConfig; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, tddLutSwitchConfig, cleanup); + + /*Check that if requested Tx Channel valid*/ + /* Channel must contain a single channel number (0-7) */ + recoveryAction = adrv904x_DfeVerifyChannel((adi_adrv904x_Channels_e)dpdTxChannelSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, dpdTxChannelSel, "channel parameter is invalid."); + goto cleanup; + } + + ADI_LIBRARY_MEMSET(&tmpTddLutSwitchConfig, 0, sizeof(adi_adrv904x_DfeAppDpdActTddLutSwitch_t)); + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + DPD_CTRL_TDD_LUT_SWITCH_CONFIG_GET, + (adi_adrv904x_Channels_e)dpdTxChannelSel, + NULL, + 0, + &lengthResp, + (uint8_t*)&tmpTddLutSwitchConfig, + sizeof(tmpTddLutSwitchConfig)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, dpdTxChannelSel, "Failed to send TDD lut switch cfgget request"); + goto cleanup; + } + + tddLutSwitchConfig->txOnMdl0SwitchEn = ADRV904X_CTOHS(tmpTddLutSwitchConfig.txOnMdl0SwitchEn); + tddLutSwitchConfig->txOnMdl1SwitchEn = ADRV904X_CTOHS(tmpTddLutSwitchConfig.txOnMdl1SwitchEn); + tddLutSwitchConfig->txOnMdlSwitchDlyCnt = ADRV904X_CTOHS(tmpTddLutSwitchConfig.txOnMdlSwitchDlyCnt); + + for (i = 0; i < ADI_ADRV904X_DFE_APP_CAL_DPD_TDD_LUT_SWITCH_CAP_NUM; i++) + { + tddLutSwitchConfig->capDelay[i] = ADRV904X_CTOHS(tmpTddLutSwitchConfig.capDelay[i]); + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); + +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdPathdelayCfg(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdPathDlyStatus_t* const dpdPathdelayCfg) +{ + const uint16_t DPD_CTRL_PATHDELAY_CONFIG = 9U; + adi_adrv904x_DfeAppCalDpdPathDlyStatus_t tmpDpdPathdelayCfg; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + uint32_t lengthResp = 0; + uint32_t i = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dpdPathdelayCfg, cleanup); + + ADI_LIBRARY_MEMCPY((void *)&tmpDpdPathdelayCfg, dpdPathdelayCfg, sizeof(adi_adrv904x_DfeAppCalDpdPathDlyStatus_t)); + + if ((tmpDpdPathdelayCfg.fracExtDelay > 63) || (tmpDpdPathdelayCfg.fracExtDelay < 0)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + tmpDpdPathdelayCfg.fracExtDelay, + "Invalid fracExtDelay is selected. Valid values are non-negative values less than 63."); + goto cleanup; + } + + if ((tmpDpdPathdelayCfg.intActDelay < -255) || (tmpDpdPathdelayCfg.intActDelay > 0)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + tmpDpdPathdelayCfg.intActDelay, + "Invalid intActDelay is selected. Valid values are greater than -255 and less than 0."); + goto cleanup; + } + + if ((tmpDpdPathdelayCfg.intExtDelay < -255) || (tmpDpdPathdelayCfg.intExtDelay > 0)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + tmpDpdPathdelayCfg.intExtDelay, + "Invalid intExtDelay is selected. Valid values are greater than -255 and less than 0."); + goto cleanup; + } + + if (((dpdTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (dpdTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + tmpDpdPathdelayCfg.intActDelay = ADRV904X_HTOCL(tmpDpdPathdelayCfg.intActDelay); + tmpDpdPathdelayCfg.intExtDelay = ADRV904X_HTOCL(tmpDpdPathdelayCfg.intExtDelay); + tmpDpdPathdelayCfg.fracExtDelay = ADRV904X_HTOCL(tmpDpdPathdelayCfg.fracExtDelay); + + for (i = 0; i < ADI_ADRV904X_MAX_TXCHANNELS; i++) + { + uint32_t txChan = (1 << i); + if (dpdTxChannelMask & txChan) + { + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + DPD_CTRL_PATHDELAY_CONFIG, + (adi_adrv904x_Channels_e)txChan, + (const uint8_t*)&tmpDpdPathdelayCfg, + sizeof(tmpDpdPathdelayCfg), + &lengthResp, + NULL, + 0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChan, "Failed to send request"); + goto cleanup; + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdResetPathdelayInit(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppDpdResetMode_e dpdResetMode, + const adi_adrv904x_DfeAppCalDpdPathDlyStatus_t* const dpdPathdelayCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dpdPathdelayCfg, cleanup); + + if (((dpdTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (dpdTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_DpdReset(device, dpdTxChannelMask, dpdResetMode); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, dpdTxChannelMask, "Failed to send DpdReset request"); + goto cleanup; + } + else + { + recoveryAction = adi_adrv904x_DpdPathdelayCfg(device, dpdTxChannelMask, dpdPathdelayCfg); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, dpdTxChannelMask, "Failed to send DpdPathdelayCfg request"); + goto cleanup; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdPathdelaySeed(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask, + const adi_adrv904x_DfeAppCalDpdPathDlySeed_t* const dpdPathdelay) +{ + const uint16_t DPD_CTRL_PATHDELAY_SEED = 10 | DPD_CTRL_SET_CMD_FLAG; + adi_adrv904x_DfeAppCalDpdPathDlySeed_t tmpDpdPathdelay; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + uint32_t lengthResp = 0; + uint32_t i = 0; + int32_t qualrange_max = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dpdPathdelay, cleanup); + + ADI_LIBRARY_MEMCPY((void *)&tmpDpdPathdelay, dpdPathdelay, sizeof(adi_adrv904x_DfeAppCalDpdPathDlySeed_t)); + + if ((tmpDpdPathdelay.seed.fracExtDelay > 63) || (tmpDpdPathdelay.seed.fracExtDelay < 0)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + tmpDpdPathdelay.seed.fracExtDelay, + "Invalid fracExtDelay is selected. Valid values are non-negative values less than 63."); + goto cleanup; + } + + if ((tmpDpdPathdelay.seed.intActDelay < -255) || (tmpDpdPathdelay.seed.intActDelay > 0)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + tmpDpdPathdelay.seed.intActDelay, + "Invalid intActDelay is selected. Valid values are greater than -255 and less than 0."); + goto cleanup; + } + + if ((tmpDpdPathdelay.seed.intExtDelay < -255) || (tmpDpdPathdelay.seed.intExtDelay > 0)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + tmpDpdPathdelay.seed.intExtDelay, + "Invalid intExtDelay is selected. Valid values are greater than -255 and less than 0."); + goto cleanup; + } + + qualrange_max = abs(tmpDpdPathdelay.seed.intExtDelay); + if (abs(tmpDpdPathdelay.seed.intExtDelay + 255) < abs(tmpDpdPathdelay.seed.intExtDelay)) + { + qualrange_max = abs(tmpDpdPathdelay.seed.intExtDelay + 255); + } + + if ((tmpDpdPathdelay.qualifyRange > qualrange_max) || (tmpDpdPathdelay.qualifyRange < 0)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, tmpDpdPathdelay.qualifyRange, "Invalid qualifyRange is selected. 0 is the valid minimum value allowed"); + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, qualrange_max, "Maximum qualrange_max allowed"); + + goto cleanup; + } + + if (((dpdTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (dpdTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + tmpDpdPathdelay.seed.intActDelay = ADRV904X_HTOCL(tmpDpdPathdelay.seed.intActDelay); + tmpDpdPathdelay.seed.intExtDelay = ADRV904X_HTOCL(tmpDpdPathdelay.seed.intExtDelay); + tmpDpdPathdelay.seed.fracExtDelay = ADRV904X_HTOCL(tmpDpdPathdelay.seed.fracExtDelay); + tmpDpdPathdelay.optSearchEnable = ADRV904X_HTOCL(tmpDpdPathdelay.optSearchEnable); + tmpDpdPathdelay.qualifyRange = ADRV904X_HTOCL(tmpDpdPathdelay.qualifyRange); + + for (i = 0; i < ADI_ADRV904X_MAX_TXCHANNELS; i++) + { + uint32_t txChan = (1 << i); + if (dpdTxChannelMask & txChan) + { + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + DPD_CTRL_PATHDELAY_SEED, + (adi_adrv904x_Channels_e)txChan, + (const uint8_t*)&tmpDpdPathdelay, + sizeof(tmpDpdPathdelay), + &lengthResp, + NULL, + 0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChan, "Failed to send request"); + goto cleanup; + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DpdPathdelayResetSeed(adi_adrv904x_Device_t* const device, + const uint32_t dpdTxChannelMask) +{ + const uint16_t DPD_CTRL_PATHDELAY_SEED = 10; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + uint32_t lengthResp = 0; + uint32_t i = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + if (((dpdTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (dpdTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dpdTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + for (i = 0; i < ADI_ADRV904X_MAX_TXCHANNELS; i++) + { + uint32_t txChan = (1 << i); + if (dpdTxChannelMask & txChan) + { + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_DPD, + DPD_CTRL_PATHDELAY_SEED, + (adi_adrv904x_Channels_e)txChan, + NULL, + 0, + &lengthResp, + NULL, + 0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChan, "Failed to send request"); + goto cleanup; + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_dfe_sbet.c b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_dfe_sbet.c new file mode 100644 index 00000000000..03d6ef75aab --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_dfe_sbet.c @@ -0,0 +1,502 @@ +/** +* Copyright 2015 - 2023 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_dfe_cfr.c +* \brief Contains CFR features related function implementations +* +* ADRV904X API Version: 2.10.0.4 +*/ +#include "adi_adrv904x_dfe_sbet.h" +#include "adi_adrv904x_dfe_cfr.h" +#include "adi_adrv904x_tx.h" +#include "adi_adrv904x_hal.h" + +#include "../../private/include/adrv904x_radioctrl.h" +#include "../../private/include/adrv904x_tx.h" +#include "../../private/include/adrv904x_dfe_cfr.h" +#include "../../private/include/adrv904x_reg_addr_macros.h" +#include "../../private/include/adrv904x_stream_proc_types.h" +#include "../../private/bf/adrv904x_bf_streamproc_channel_types.h" +#include "../../private/include/adrv904x_cpu_scratch_registers.h" + +#include "../../private/bf/adrv904x_bf_core.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PUBLIC_DFE_SBET + + +static adi_adrv904x_ErrAction_e adrv904x_CfrActiveConfigUpdateCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e cfrTxChannelSel, + uint32_t configSelectMask); + + + + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SbetCfrThresholdSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CfrThrConfig_t* const cfrThrConfig, + const uint32_t hardClipperThreshold, + const uint32_t cfrTxChannelMask, + const uint32_t cfrPowerIndex) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxCfrRegChanAddr_e txCfrBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG; + uint32_t configSelectMask = (uint32_t)ADI_ADRV904X_CFR_CFG1; + + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cfrThrConfig, cleanup); + + /* Check that if requested Tx Channel valid*/ + if (((cfrTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || + (cfrTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + /* Check that if DPD Model Index is valid*/ + if (cfrPowerIndex >= 2) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrPowerIndex, + "Invalid Cfr Power Index selected. Valid values are 0 and 1"); + goto cleanup; + } + + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(cfrTxChannelMask, chanSel)) + { + recoveryAction = adrv904x_CfrRegsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txCfrBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid Tx Channel used to determine CFR base address"); + goto cleanup; + } + + recoveryAction = adrv904x_CfrActiveConfigUpdateCheck(device, + (adi_adrv904x_TxChannels_e)(chanSel), + configSelectMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, configSelectMask, "Requested configuration is actively being used by CFR engine"); + goto cleanup; + } + + /* Set engine 1 or 2 Thresh Sq*/ + recoveryAction = adrv904x_CfrWritePeakThreshSq(device, + cfrThrConfig->cfrEngine0PeakThresholdScaler, + cfrThrConfig->cfrPeakThreshold, + txCfrBaseAddr, + configSelectMask, + cfrPowerIndex); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing threshold sq for engine 0"); + goto cleanup; + } + + /* Set engine 1 or 2 Thresh Sqrt*/ + recoveryAction = adrv904x_CfrWritePeakThreshSqrt(device, + cfrThrConfig->cfrEngine0PeakThresholdScaler, + cfrThrConfig->cfrPeakThreshold, + txCfrBaseAddr, + configSelectMask, + cfrPowerIndex); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing threshold sqrt for engine 0"); + goto cleanup; + } + + + /* Set engine 1 or 2 Correction Threshold */ + recoveryAction = adrv904x_CfrWriteCorrectionThresh(device, + cfrThrConfig->cfrCorrectionThresholdScaler, + cfrThrConfig->cfrPeakThreshold, + txCfrBaseAddr, + configSelectMask, + cfrPowerIndex); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing correction threshold for engine 0"); + goto cleanup; + } + /* the pre-DPD hard clipper threshold is stored in CFR1_THR_SQ2 or CFR1_THR_SQRT2 */ + if (cfrPowerIndex == 0U) + { + recoveryAction = adrv904x_TxCfrReg_Cfr1ThrSq_BfSet(device, + NULL, + txCfrBaseAddr, + 2u, + (uint32_t)hardClipperThreshold); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing dpd Powerindex:0 hardClipperThreshold"); + goto cleanup; + } + } + else //if (cfrPowerIndex == 1U) + { + recoveryAction = adrv904x_TxCfrReg_Cfr1ThrSqrt_BfSet(device, + NULL, + txCfrBaseAddr, + 2u, + (uint32_t)hardClipperThreshold); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing dpd Powerindex:1 hardClipperThreshold"); + goto cleanup; + } + } + } + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SbetTxAttenSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SbetTxAtten_t * const configTx) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxCfrRegChanAddr_e txCfrBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG; + + uint16_t attenRegVal = 0U; + uint32_t chanSel = 0U; + uint32_t chanIdx = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, configTx, cleanup); + + if ((configTx->txChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + configTx->txChannelMask, + "Invalid channel is selected for Sbet Tx config. Valid values are 0 or any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(configTx->txChannelMask, chanSel)) + { + if (configTx->txAttenuation_mdB > ADRV904X_TX_ATTEN_VALUE_MILLI_DB_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + configTx->txAttenuation_mdB, + "Invalid txAttenuation_mdB value"); + goto cleanup; + } + + recoveryAction = adrv904x_CfrRegsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txCfrBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid Tx Channel used to determine CFR base address"); + goto cleanup; + } + + /* Conversion from the requested atten level (milli-dB) to equivalent + * TxAttenTable index is always done based on a step size of 0.05. + * Other step sizes are not supported. */ + attenRegVal = (configTx->txAttenuation_mdB / ADRV904X_TX_ATTEN_STEP_SIZE_DIV_0P05); + + /* setting Tx attenuation for sbet*/ + recoveryAction = adrv904x_TxCfrReg_Cfr1ThrCor_BfSet(device, + NULL, + txCfrBaseAddr, + 2u, + (uint32_t)attenRegVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing tx attenuation"); + goto cleanup; + } + } + } + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SbetTxAttenGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SbetTxAtten_t * const configTx) +{ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxCfrRegChanAddr_e txCfrBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG; + uint32_t attenRegVal = 0U; + uint32_t chanSel = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, configTx, cleanup); + + if ((configTx->txChannelMask != (uint32_t)ADI_ADRV904X_TXOFF) && + (configTx->txChannelMask != (uint32_t)ADI_ADRV904X_TX0) && + (configTx->txChannelMask != (uint32_t)ADI_ADRV904X_TX1) && + (configTx->txChannelMask != (uint32_t)ADI_ADRV904X_TX2) && + (configTx->txChannelMask != (uint32_t)ADI_ADRV904X_TX3) && + (configTx->txChannelMask != (uint32_t)ADI_ADRV904X_TX4) && + (configTx->txChannelMask != (uint32_t)ADI_ADRV904X_TX5) && + (configTx->txChannelMask != (uint32_t)ADI_ADRV904X_TX6) && + (configTx->txChannelMask != (uint32_t)ADI_ADRV904X_TX7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + configTx->txChannelMask, + "Invalid Tx channel is selected. User should select one channel or CHOFF only"); + goto cleanup; + } + + if (configTx->txChannelMask == (uint32_t)ADI_ADRV904X_TXOFF) + { + configTx->txAttenuation_mdB = 0U; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + else + { + chanSel = configTx->txChannelMask; + + recoveryAction = adrv904x_CfrRegsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txCfrBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanSel, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + recoveryAction = adrv904x_TxCfrReg_Cfr1ThrCor_BfGet(device, + NULL, + txCfrBaseAddr, + 2u, + &attenRegVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx slice attenuation"); + goto cleanup; + } + /* Conversion from the atten level (milli-dB) to equivalent + * TxAttenTable index is always done based on a step size of 0.05. + * Other step sizes are not supported. */ + configTx->txAttenuation_mdB = (uint16_t)(attenRegVal * ADRV904X_TX_ATTEN_STEP_SIZE_DIV_0P05); + } + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SbetCfrMappingSet(adi_adrv904x_Device_t* const device, + const uint32_t cfrTxChannelMask, + const uint32_t mapping) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + uint32_t dpdPowerIndex = 0U; + uint8_t cfrPowIdxPerChan = 0U; + uint8_t cfrPowerIndex[4] = { 0U, 0U, 0U, 0U}; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Check that if requested Tx Channel valid*/ + if (((cfrTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || + (cfrTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfrTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + /* Check that if Mapping is valid*/ + if (mapping > 2) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + mapping, + "Invalid cfr dpd mapping selected. Valid values are 0..2"); + goto cleanup; + } + + for (dpdPowerIndex = 0; dpdPowerIndex < 4; dpdPowerIndex++) + { + switch (dpdPowerIndex) + { + case 0: + cfrPowIdxPerChan = 0; + break; + case 1: + if (mapping == 0) + { + cfrPowIdxPerChan = 1; + } + else + { + cfrPowIdxPerChan = 0; + } + break; + case 2: + if (mapping == 2) + { + cfrPowIdxPerChan = 0; + } + else + { + cfrPowIdxPerChan = 1; + } + break; + case 3: + cfrPowIdxPerChan = 1; + break; + } + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(cfrTxChannelMask, chanSel)) + { + cfrPowerIndex[dpdPowerIndex] &= ~(0x1 << chanIdx); + cfrPowerIndex[dpdPowerIndex] |= cfrPowIdxPerChan << chanIdx; + } + } + } + + //for dpd model index 0 + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_SBET_DPD_TO_CFR_TRANSLATION_TBL_0, + cfrPowerIndex[0]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing sbet mapping for dpd model 0"); + goto cleanup; + } + //for dpd model index 1 + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_SBET_DPD_TO_CFR_TRANSLATION_TBL_1, + cfrPowerIndex[1]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing sbet mapping for dpd model 1"); + goto cleanup; + } + //for dpd model index 2 + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_SBET_DPD_TO_CFR_TRANSLATION_TBL_2, + cfrPowerIndex[2]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing sbet mapping for dpd model 2"); + goto cleanup; + } + //for dpd model index 3 + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_SBET_DPD_TO_CFR_TRANSLATION_TBL_3, + cfrPowerIndex[3]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing sbet mapping for dpd model 3"); + goto cleanup; + } + + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +static adi_adrv904x_ErrAction_e adrv904x_CfrActiveConfigUpdateCheck(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e cfrTxChannelSel, + const uint32_t configSelectMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_CfrConfigSel_e activeCfgReadBack = ADI_ADRV904X_CFR_CFG0; + adi_adrv904x_CfrConfig_t activeCfrConfig; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_LIBRARY_MEMSET(&activeCfrConfig, 0, sizeof(adi_adrv904x_CfrConfig_t)); + + /* Readback the active config for this channel */ + recoveryAction = adi_adrv904x_CfrActiveCfgGet(device, + cfrTxChannelSel, + &activeCfgReadBack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, activeCfgReadBack, "Error while reading active config"); + return recoveryAction; + } + + /* Read the current CFR config */ + recoveryAction = adi_adrv904x_CfrEnableGet(device, + &activeCfrConfig.cfrEngineEnable[0], + &activeCfrConfig.cfrEngineBypass[0], + ADI_ADRV904X_NUM_OF_CFR_ENGINES, + cfrTxChannelSel, + (uint32_t)activeCfgReadBack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, activeCfgReadBack, "Error while reading CFR config"); + return recoveryAction; + } + + if ((activeCfrConfig.cfrEngineEnable[0] == ADI_TRUE) || + (activeCfrConfig.cfrEngineEnable[1] == ADI_TRUE) || + (activeCfrConfig.cfrEngineEnable[2] == ADI_TRUE)) + { + /* Report error if any of the CFR engines are enabled and user is writing to active config */ + if (ADRV904X_BF_EQUAL(configSelectMask, activeCfgReadBack)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + configSelectMask, + "Selected config is actively being used by CFR block"); + return recoveryAction; + } + } + + return recoveryAction; +} + + + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_dfe_utilities.c b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_dfe_utilities.c new file mode 100644 index 00000000000..a8513c82c38 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_dfe_utilities.c @@ -0,0 +1,488 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_dfe_utilities.c +* \brief Contains ADI Transceiver CPU functions +* Analog Devices maintains and provides updates to this code layer. +* The end user should not modify this file or any code in this directory. +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#include "adi_adrv904x_dfe_utilities.h" +#include "adi_adrv904x_dfe_cfr.h" +#include "adi_adrv904x_hal.h" +#include "adi_adrv904x_tx.h" +#include "adi_adrv904x_rx.h" +#include "adi_library.h" + +#include "../../private/include/adrv904x_dfe_svc_log_trace_t.h" +#include "../../private/include/adrv904x_dfe_svc_bbic_bridge_t.h" +#include "../../private/include/adrv904x_dfe_cpu.h" +#include "../../private/include/adrv904x_cpu.h" +#include "../../private/include/adrv904x_radioctrl.h" +#include "../../private/bf/adrv904x_bf_sequencer.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PUBLIC_DFE_UTILITIES + +/*****************************************************************************/ +/***** Helper functions' prototypes ******************************************/ +/*****************************************************************************/ + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeSdkVersionGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_CpuFwVersion_t* const dfeSdkVersion) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t address = 0U; + adi_adrv904x_DfeSvcBbicBridgeVersion_t ver = { 0, 0, 0, 0, 0 }; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dfeSdkVersion, cleanup); + + if ((device->devStateInfo.devState & ADI_ADRV904X_STATE_DFECPULOADED) != ADI_ADRV904X_STATE_DFECPULOADED) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DFE CPU bin must be loaded before getting SDK Lib version"); + goto cleanup; + } + + /* Get dfe sdk version address from CPU */ + recoveryAction = adrv904x_DfeSdkDataAddrGet(device, &address); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE SDK LIB version address"); + goto cleanup; + } + + address += ADI_LIBRARY_OFFSETOF(adrv904x_DfeSvcBbicBridgeSdkData_t, sdkVersion); + /* Read and Store the SDK lib version */ + recoveryAction = adi_adrv904x_Registers32Read(device, NULL, address, (uint32_t*)&ver, NULL, sizeof(adi_adrv904x_DfeSvcBbicBridgeVersion_t) / 4); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE SDK Lib Version registers"); + goto cleanup; + } + + dfeSdkVersion->commVer.majorVer = adrv904x_CpuIntFromBytesGet((uint8_t*)&ver.majorRev, 4); + dfeSdkVersion->commVer.minorVer = adrv904x_CpuIntFromBytesGet((uint8_t*)&ver.minorRev, 4); + dfeSdkVersion->commVer.maintenanceVer = adrv904x_CpuIntFromBytesGet((uint8_t*)&ver.maintRev, 4); + dfeSdkVersion->commVer.buildVer = adrv904x_CpuIntFromBytesGet((uint8_t*)&ver.buildNum, 4); + dfeSdkVersion->cpuFwBuildType = (adi_adrv904x_CpuFwBuildType_e)(adrv904x_CpuIntFromBytesGet((uint8_t*)&ver.buildType, 4) & + (ADI_ADRV904X_CPU_FW_BUILD_DEBUG | ADI_ADRV904X_CPU_FW_BUILD_RELEASE | ADI_ADRV904X_CPU_FW_TRBLSHOOT)); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeAppVersionGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_CpuFwVersion_t* const dfeAppVersion) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t address = 0U; + adi_adrv904x_DfeSvcBbicBridgeVersion_t ver = { 0, 0, 0, 0, 0 }; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dfeAppVersion, cleanup); + + if ((device->devStateInfo.devState & ADI_ADRV904X_STATE_DFECPULOADED) != ADI_ADRV904X_STATE_DFECPULOADED) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DFE CPU bin must be loaded before getting SDK Lib version"); + goto cleanup; + } + + /* Get dfe sdk version address from CPU */ + recoveryAction = adrv904x_DfeSdkDataAddrGet(device, &address); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE SDK LIB version address"); + goto cleanup; + } + + address += ADI_LIBRARY_OFFSETOF(adrv904x_DfeSvcBbicBridgeSdkData_t, appVersion); + /* Read and Store the DFE app version */ + recoveryAction = adi_adrv904x_Registers32Read(device, NULL, address, (uint32_t*)&ver, NULL, sizeof(adi_adrv904x_DfeSvcBbicBridgeVersion_t) / 4); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE SDK Lib Version registers"); + goto cleanup; + } + dfeAppVersion->commVer.majorVer = adrv904x_CpuIntFromBytesGet((uint8_t*)&ver.majorRev, 4); + dfeAppVersion->commVer.minorVer = adrv904x_CpuIntFromBytesGet((uint8_t*)&ver.minorRev, 4); + dfeAppVersion->commVer.maintenanceVer = adrv904x_CpuIntFromBytesGet((uint8_t*)&ver.maintRev, 4); + dfeAppVersion->commVer.buildVer = adrv904x_CpuIntFromBytesGet((uint8_t*)&ver.buildNum, 4); + dfeAppVersion->cpuFwBuildType = (adi_adrv904x_CpuFwBuildType_e)(adrv904x_CpuIntFromBytesGet((uint8_t*)&ver.buildType, 4) & + (ADI_ADRV904X_CPU_FW_BUILD_DEBUG | ADI_ADRV904X_CPU_FW_BUILD_RELEASE | ADI_ADRV904X_CPU_FW_TRBLSHOOT)); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerErrorInfoGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeSvcRadioCtrlSequencerErrorInfo_t* const errorInfo) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfSequencerChanAddr_e sequencerBaseAddr = ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS; + const uint32_t RADIO_SEQUENCER_NUM_SEQUENCERS = 16U; + const uint32_t RADIO_SEQUENCER_CONFIG_0_REG_OFFSET = 0x20U; + const uint32_t BUS_ERROR_BITP = 20U; + const uint32_t BUS_ERROR_BITM = 0x00100000U; + const uint32_t FETCH_ERROR_BITP = 16U; + const uint32_t FETCH_ERROR_BITM = 0x00010000U; + uint8_t channelId = 0U; + uint8_t regData = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, errorInfo, cleanup); + + ADI_LIBRARY_MEMSET(errorInfo, 0, sizeof(adi_adrv904x_DfeSvcRadioCtrlSequencerErrorInfo_t)); + + /* Check that Radio Sequencer has been loaded before getting RS error info */ + if ((device->devStateInfo.devState & ADI_ADRV904X_STATE_RSLOADED) != ADI_ADRV904X_STATE_RSLOADED) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Radio Sequencer should have been loaded before getting RS error info"); + goto cleanup; + } + + /* Get ssbSyncPhaseError */ + recoveryAction = adrv904x_Sequencer_SsbSyncPhaseError_BfGet(device, + NULL, + sequencerBaseAddr, + &errorInfo->ssbSyncPhaseError); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting radio sequencer SSB Sync Phase Error. "); + goto cleanup; + } + + /* Get busErrorMask and fetchErrorMask */ + for (channelId = 0; channelId < RADIO_SEQUENCER_NUM_SEQUENCERS; channelId++) + { + uint32_t regVal = 0; + recoveryAction = adi_adrv904x_Register32Read(device, + NULL, + ((uint32_t) sequencerBaseAddr + RADIO_SEQUENCER_CONFIG_0_REG_OFFSET + channelId * 4), + ®Val, + 0xFFFFFFFFU); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting radio sequencer Bus Error Mask. "); + goto cleanup; + } + + regData = (regVal & BUS_ERROR_BITM) >> BUS_ERROR_BITP; + errorInfo->busErrorMask |= ((regData & 0x1U) << channelId); + + regData = (regVal & FETCH_ERROR_BITM) >> FETCH_ERROR_BITP; + errorInfo->fetchErrorMask |= ((regData & 0x1U) << channelId); + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerSsbSyncPhaseErrorClear(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfSequencerChanAddr_e sequencerBaseAddr = ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS; + uint8_t bfValue; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Get tracking mode */ + recoveryAction = adrv904x_Sequencer_SsbSyncTrackingMode_BfGet(device, + NULL, + sequencerBaseAddr, + &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting radio sequencer SSB SYNC Tracking Mode. "); + goto cleanup; + } + + /* Valid ssb_sync_tracking_mode value: 0, 1, 2 */ + if(bfValue == 0) + { + /* do nothing but return */ + goto cleanup; + } + + if (bfValue > 3U) + { + /* Potential hardware error needs to be reported. */ + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid bit field value for SSB SYNC Tracking Mode. "); + goto cleanup; + } + + /* ssb_sync_tracking_mode > 0 */ + /* Reset SSB_SYNC phase error (requre a 0-1-0 transition sequence) */ + bfValue = 0x00; + recoveryAction = adrv904x_Sequencer_SsbSyncPhaseErrorClear_BfSet(device, + NULL, + sequencerBaseAddr, + bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting radio sequencer SSB Sync Phase Error. "); + goto cleanup; + } + + bfValue = 0x01; + recoveryAction = adrv904x_Sequencer_SsbSyncPhaseErrorClear_BfSet(device, + NULL, + sequencerBaseAddr, + bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting radio sequencer SSB Sync Phase Error. "); + goto cleanup; + } + + bfValue = 0x00; + recoveryAction = adrv904x_Sequencer_SsbSyncPhaseErrorClear_BfSet(device, + NULL, + sequencerBaseAddr, + bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting radio sequencer SSB Sync Phase Error. "); + goto cleanup; + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeLogTraceBufferGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeLogTraceBuffer_t* const logTrace) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_CpuErrorCode_t cpuErrorCode = 0U; + uint32_t address = 0U; + uint32_t timeout_us = ADI_ADRV904X_LOGTRACE_TIMEOUT_US; + uint8_t waitInterval_us = ADI_ADRV904X_LOGTRACE_INTERVAL_US; + uint8_t waitCount = 0; + + uint32_t getDfeLogtraceData[ADI_ADRV904X_MAX_LOGTRACE_SIZE / sizeof(uint32_t)] = { 0 }; + uint8_t sortLogTraceData[ADI_ADRV904X_MAX_LOGTRACE_SIZE] = { 0 }; + + adrv904x_DfeSvcCmdLogTraceBuffer_t logTraceCmd; + adrv904x_DfeSvcCmdLogTraceBufferResp_t logTraceBufferResp; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + + adrv904x_DfeSvcLogTraceBuffer_t logTraceBuffer = { 0, 0, 0, 0, 0, 0, 0, 0}; + adrv904x_DfeSvcLogTraceBuffer_t* pLogTraceBuffer; + + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, logTrace, cleanup); + + ADI_LIBRARY_MEMSET(logTrace, 0, sizeof(adi_adrv904x_DfeLogTraceBuffer_t)); + + ADI_LIBRARY_MEMSET(&logTraceCmd, 0, sizeof(adrv904x_DfeSvcCmdLogTraceBuffer_t)); + + ADI_LIBRARY_MEMSET(&logTraceBufferResp, 0, sizeof(adrv904x_DfeSvcCmdLogTraceBufferResp_t)); + + recoveryAction = adrv904x_DfeSdkDataAddrGet(device, &address); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE SDK Data address"); + goto cleanup; + } + + /*Get logTraceBuffer address*/ + address += ADI_LIBRARY_OFFSETOF(adrv904x_DfeSvcBbicBridgeSdkData_t, logDataBuffer); + + logTraceCmd.svcLogTraceBufferStatus = ADI_ADRV904X_DFE_SVC_LOGTRACE_BUSY; + + /* Send command and receive response */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_LOGTRACE_BUFFER, + (void*)&logTraceCmd, + sizeof(adrv904x_DfeSvcCmdLogTraceBuffer_t), + (void*)&logTraceBufferResp, + sizeof(adrv904x_DfeSvcCmdLogTraceBufferResp_t), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(logTraceBufferResp.cmdStatus, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* Read the exception data */ + recoveryAction = adi_adrv904x_Registers32Read(device, NULL, address, (uint32_t*)&logTraceBuffer, NULL, sizeof(adrv904x_DfeSvcLogTraceBuffer_t) / sizeof(uint32_t)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE exception data registers"); + goto cleanup; + } + + /* Read logbuffer start */ + logTrace->size = logTraceBuffer.size; + logTrace->overFlowFlag = logTraceBuffer.overflowFlag; + + /* Read the exception data */ + recoveryAction = adi_adrv904x_Registers32Read(device, NULL, (uint32_t)logTraceBuffer.pData, (uint32_t*)&getDfeLogtraceData, NULL, logTraceBuffer.size / sizeof(uint32_t)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE exception data registers"); + goto cleanup; + } + + do + { + if (waitCount < (timeout_us / waitInterval_us)) + { + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_Wait_us(&device->common, waitInterval_us); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "HAL Wait Request Issue"); + return recoveryAction; + } + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "The logTrace buffer write timeout"); + return recoveryAction; + } + + /* update logTraceBuffer */ + recoveryAction = adi_adrv904x_Registers32Read(device, NULL, address, (uint32_t*)&logTraceBuffer, NULL, sizeof(adrv904x_DfeSvcLogTraceBuffer_t) / sizeof(uint32_t)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE exception data registers"); + goto cleanup; + } + + /* waiting for the number of 100us*/ + waitCount++; + + } while (logTraceBuffer.writeFlag); + + for (unsigned int i = 0; i < (logTraceBuffer.size / sizeof(uint32_t)); i++) + { + for (unsigned int j = 0; j < sizeof(uint32_t); j++) + { + sortLogTraceData[j + i * 4] = (uint8_t)(getDfeLogtraceData[i] >> (j * 8) & 0xff); + } + } + + pLogTraceBuffer = &logTraceBuffer; + + /* Handle the log data*/ + if (ADI_ADRV904X_DFE_SVC_LOGTRACE_BUFFER_EMPTY(pLogTraceBuffer)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "The logTrace buffer is empty."); + return recoveryAction; + } + else + { + /* sort logtrace to memory buffer */ + for (unsigned int i = 0; i < logTraceBuffer.size; i++) + { + if ((logTraceBuffer.rdIndex + i) < logTraceBuffer.size) + { + logTrace->logTraceData[i] = sortLogTraceData[logTraceBuffer.rdIndex + i]; + } + else + { + logTrace->logTraceData[i] = sortLogTraceData[(logTraceBuffer.rdIndex + i) % logTraceBuffer.size]; + } + } + } + + /* Read logBuffer finish */ + logTraceCmd.svcLogTraceBufferStatus = ADI_ADRV904X_DFE_SVC_LOGTRACE_RELEASE; + + cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + /* Send command and receive response */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_LOGTRACE_BUFFER, + /*waiting dfe ticket merge and change to new macro*/ + (void*)&logTraceCmd, + sizeof(adrv904x_DfeSvcCmdLogTraceBuffer_t), + (void*)&logTraceBufferResp, + sizeof(adrv904x_DfeSvcCmdLogTraceBufferResp_t), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(logTraceBufferResp.cmdStatus, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCaptureTypeGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeCaptureType_e* const orx0CaptureType, + adi_adrv904x_DfeCaptureType_e* const orx1CaptureType) +{ + static const uint8_t CAPTURE_TYPE_MASK = 0x08U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t readbackVal = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, orx0CaptureType, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, orx1CaptureType, cleanup); + + /* Readback capture type for Orx0*/ + recoveryAction = adrv904x_Core_RadioControlInterfaceOrx0MapShadow_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &readbackVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while retrieving current capture type for Orx0."); + goto cleanup; + } + + *orx0CaptureType = ((readbackVal & CAPTURE_TYPE_MASK) > 0U) ? ADI_ADRV904X_DFE_CAPTURE_TYPE_VSWR : ADI_ADRV904X_DFE_CAPTURE_TYPE_DPD; + + /* Readback capture type for Orx1*/ + recoveryAction = adrv904x_Core_RadioControlInterfaceOrx1MapShadow_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &readbackVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while retrieving current capture type for Orx1."); + goto cleanup; + } + + *orx1CaptureType = ((readbackVal & CAPTURE_TYPE_MASK) > 0U) ? ADI_ADRV904X_DFE_CAPTURE_TYPE_VSWR : ADI_ADRV904X_DFE_CAPTURE_TYPE_DPD; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_dfe_vswr.c b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_dfe_vswr.c new file mode 100644 index 00000000000..972617ec5c1 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_dfe_vswr.c @@ -0,0 +1,720 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_dfe_vswr.c +* \brief Contains VSWR feature related function implementations +* +* ADRV904X API Version: 2.10.0.4 +*/ +#include "adi_adrv904x_dfe_vswr.h" +#include "adi_adrv904x_tx.h" +#include "adi_adrv904x_hal.h" +#include "adi_adrv904x_dfe_cpu.h" +#include "adi_adrv904x_dfe_framework_tracking_cal_t.h" + +#include "../../private/include/adrv904x_tx.h" +#include "../../private/include/adrv904x_reg_addr_macros.h" + + +#include "../../private/include/adrv904x_dfe_svc_err_dfe_boot_status_t.h" +#include "../../private/bf/adrv904x_bf_tx_dfe_dig_regs.h" +#include "../../private/include/adrv904x_dfe_cpu.h" + + +#define ADI_FILE ADI_ADRV904X_FILE_PUBLIC_DFE_VSWR + + +static adi_adrv904x_ErrAction_e adrv904x_TxVswrPlaybackDataWrite(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const adi_adrv904x_VswrPlaybackData_t* const playbackData, + const uint8_t a55Running); + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_VswrPlaybackDataWrite(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const adi_adrv904x_VswrPlaybackData_t* const playbackData) +{ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + + recoveryAction = adrv904x_TxVswrPlaybackDataWrite(device, + txChannelMask, + playbackData, + ADI_TRUE); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Tx VSWR Playback RAM Write Issue"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_VswrPlaybackDataWrite_v2(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const adi_adrv904x_VswrPlaybackData_t* const playbackData) +{ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, playbackData, cleanup); + + + recoveryAction = adrv904x_TxVswrPlaybackDataWrite(device, + txChannelMask, + playbackData, + ADI_FALSE); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Tx VSWR Playback RAM Write Issue"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_VswrPlaybackDataRead(adi_adrv904x_Device_t* const device, + const uint32_t txChannelSel, + adi_adrv904x_VswrPlaybackData_t* const playbackData) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + + uint32_t i = 0U; + uint16_t bfReadback = 0U; + uint32_t baseAddrToRead = 0U; + uint8_t playbackEnableRead = 0U; + adrv904x_BfTxDfeDigRegsChanAddr_e txDfeDigBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DFE_DIG_REGS; + uint32_t dataToReadArr[ADI_ADRV904X_VSWR_PLAYBACK_DATA_MAX_NUM_SAMPLES]; + + uint32_t vswrPlaybackBaseAddressArr[ADI_ADRV904X_MAX_TXCHANNELS] = { + ADI_ADVRV904X_TX0_VSWR_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX1_VSWR_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX2_VSWR_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX3_VSWR_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX4_VSWR_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX5_VSWR_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX6_VSWR_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX7_VSWR_PLAYBACK_RAM_BASEADDR + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_LIBRARY_MEMSET(&dataToReadArr[0U], 0, sizeof(dataToReadArr)); + + /*Check that if requested Tx Channel valid*/ + switch (txChannelSel) + { + case ADI_ADRV904X_TX0: + baseAddrToRead = vswrPlaybackBaseAddressArr[0]; + break; + case ADI_ADRV904X_TX1: + baseAddrToRead = vswrPlaybackBaseAddressArr[1]; + break; + case ADI_ADRV904X_TX2: + baseAddrToRead = vswrPlaybackBaseAddressArr[2]; + break; + case ADI_ADRV904X_TX3: + baseAddrToRead = vswrPlaybackBaseAddressArr[3]; + break; + case ADI_ADRV904X_TX4: + baseAddrToRead = vswrPlaybackBaseAddressArr[4]; + break; + case ADI_ADRV904X_TX5: + baseAddrToRead = vswrPlaybackBaseAddressArr[5]; + break; + case ADI_ADRV904X_TX6: + baseAddrToRead = vswrPlaybackBaseAddressArr[6]; + break; + case ADI_ADRV904X_TX7: + baseAddrToRead = vswrPlaybackBaseAddressArr[7]; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, baseAddrToRead, "Invalid Tx Channel used to determine vswr playback address"); + goto cleanup; + break; + } + + ADI_LIBRARY_MEMSET(playbackData->playbackDataReal, 0, sizeof(playbackData->playbackDataReal)); + ADI_LIBRARY_MEMSET(playbackData->playbackDataImag, 0, sizeof(playbackData->playbackDataImag)); + + recoveryAction = adrv904x_TxDfeDigBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(txChannelSel), &txDfeDigBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelSel, "Invalid Tx Channel used to determine Tx Dfe Dig base address"); + goto cleanup; + } + + /* Check if playback data enabled before reading RAM */ + recoveryAction = adrv904x_TxDfeDigRegs_TxVswrDataGenEnable_BfGet(device, + NULL, + txDfeDigBaseAddr, + &playbackEnableRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading VSWR data playback"); + goto cleanup; + } + + if (playbackEnableRead == ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Playback generator should be disabled while reading from playback RAM"); + goto cleanup; + } + + /* Enable AHB access to VSWR playback RAM */ + recoveryAction = adrv904x_TxDfeDigRegs_TxVswrDataGenAhbAccessEnable_BfSet(device, + NULL, + txDfeDigBaseAddr, + ADI_TRUE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while enabling VSWR RAM access"); + goto cleanup; + } + + /* Read the number of samples */ + recoveryAction = adrv904x_TxDfeDigRegs_TxVswrDataGenMaxSamples_BfGet(device, + NULL, + txDfeDigBaseAddr, + &bfReadback); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading number of samples"); + goto cleanup; + } + + playbackData->numSamples = bfReadback; + + if (playbackData->numSamples > ADI_ADRV904X_VSWR_PLAYBACK_DATA_MAX_NUM_SAMPLES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + playbackData->numSamples, + "Number of samples read from device is greater than ADI_ADRV904X_VSWR_PLAYBACK_DATA_MAX_NUM_SAMPLES"); + goto cleanup; + + } + + recoveryAction = adi_adrv904x_Registers32Read(device, + NULL, + baseAddrToRead, + dataToReadArr, + NULL, + playbackData->numSamples); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register Write Issue"); + goto cleanup; + } + + for (i = 0; i < playbackData->numSamples; ++i) + { + playbackData->playbackDataReal[i] = (int16_t)((dataToReadArr[i] >> 0U) & 0x0000FFFFU); + playbackData->playbackDataImag[i] = (int16_t)((dataToReadArr[i] >> 16U) & 0x0000FFFFU); + } + + /* Dsiable AHB access to VSWR playback RAM */ + recoveryAction = adrv904x_TxDfeDigRegs_TxVswrDataGenAhbAccessEnable_BfSet(device, + NULL, + txDfeDigBaseAddr, + ADI_FALSE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while disabling VSWR RAM access"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_VswrTrackingConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t vswrTxChannelMask, + const adi_adrv904x_DfeAppCalVswrCfg_t* const cfg) +{ + const uint16_t VSWR_CTRL_TRACK_CONFIG_SET = (uint16_t)(ADI_ADRV904X_DFE_APP_CAL_VSWR_CTRL_CONFIG | ADI_ADRV904X_DFE_APP_CAL_VSWR_CTRL_SET_FLAG); + const uint32_t VSWR_MAX_ACCUM_ITERATIONS = 0x3FFFFFU; + const uint8_t VSWR_MAX_ALARM_ITER_WINDOW = 64U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_DfeAppCalVswrCfg_t vswrConfig; + uint32_t lengthResp = 0; + uint32_t i = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cfg, cleanup); + + if (((vswrTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (vswrTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + vswrTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + if (cfg->accumNumIter > VSWR_MAX_ACCUM_ITERATIONS) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cfg->accumNumIter, "Number of iterations cannot be larger than 0x3FFFFFU"); + goto cleanup; + } + + /* Check minor alarm configuration */ + if (cfg->minorAlarm.iterWindow > VSWR_MAX_ALARM_ITER_WINDOW) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cfg->minorAlarm.iterWindow, "Minor alarm iteration window cannot be larger than 64U"); + goto cleanup; + } + if (cfg->minorAlarm.iterThresholdCount > cfg->minorAlarm.iterWindow) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cfg->minorAlarm.iterThresholdCount, "Minor alarm threshold iter count cannot be larger than iter window size"); + goto cleanup; + } + if ((cfg->minorAlarm.iterWindow > 0) && (cfg->minorAlarm.thresholdmdB > cfg->returnLossThreshmdB)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cfg->minorAlarm.thresholdmdB, "Minor alarm threshold cannot be larger than returnLossThreshmdB"); + goto cleanup; + } + + /* Check major alarm configuration */ + if (cfg->majorAlarm.iterWindow > VSWR_MAX_ALARM_ITER_WINDOW) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cfg->majorAlarm.iterWindow, "Major alarm iteration window cannot be larger than 64U"); + goto cleanup; + } + if (cfg->majorAlarm.iterThresholdCount > cfg->majorAlarm.iterWindow) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cfg->majorAlarm.iterThresholdCount, "Major alarm threshold iter count cannot be larger than iter window size"); + goto cleanup; + } + if ((cfg->majorAlarm.iterWindow > 0) && (cfg->majorAlarm.thresholdmdB > cfg->returnLossThreshmdB)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cfg->majorAlarm.thresholdmdB, "Major alarm threshold cannot be larger than returnLossThreshmdB"); + goto cleanup; + } + + ADI_LIBRARY_MEMCPY((void *)&vswrConfig, cfg, sizeof(adi_adrv904x_DfeAppCalVswrCfg_t)); + vswrConfig.accumNumIter = ADRV904X_HTOCL(vswrConfig.accumNumIter); + vswrConfig.returnLossThreshmdB = ADRV904X_HTOCL(vswrConfig.returnLossThreshmdB); + vswrConfig.reversePathOffsetmdB = ADRV904X_HTOCL(vswrConfig.reversePathOffsetmdB); + vswrConfig.minorAlarm.thresholdmdB = ADRV904X_HTOCL(vswrConfig.minorAlarm.thresholdmdB); + vswrConfig.majorAlarm.thresholdmdB = ADRV904X_HTOCL(vswrConfig.majorAlarm.thresholdmdB); + + for (i = 0; i < ADI_ADRV904X_MAX_TXCHANNELS; i++) + { + uint32_t txChan = (1 << i); + if (vswrTxChannelMask & txChan) + { + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_VSWR, + VSWR_CTRL_TRACK_CONFIG_SET, + (adi_adrv904x_Channels_e)txChan, + (const uint8_t*)&vswrConfig, + sizeof(adi_adrv904x_DfeAppCalVswrCfg_t), + &lengthResp, + NULL, + 0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChan, "Failed to send request"); + goto cleanup; + } + } + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_VswrTrackingConfigGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e vswrTxChannelSel, + adi_adrv904x_DfeAppCalVswrCfg_t* const cfg) +{ + const uint16_t VSWR_CTRL_TRACK_CONFIG_GET = (uint16_t)(ADI_ADRV904X_DFE_APP_CAL_VSWR_CTRL_CONFIG); + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cfg, cleanup); + + /*Check that if requested Tx Channel valid*/ + /* Channel must contain a single channel number (0-7) */ + recoveryAction = adrv904x_DfeVerifyChannel((adi_adrv904x_Channels_e)vswrTxChannelSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, vswrTxChannelSel, "channel parameter is invalid."); + goto cleanup; + } + + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_VSWR, + VSWR_CTRL_TRACK_CONFIG_GET, + (adi_adrv904x_Channels_e)vswrTxChannelSel, + NULL, + 0, + &lengthResp, + (uint8_t*)cfg, + sizeof(adi_adrv904x_DfeAppCalVswrCfg_t)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + cfg->accumNumIter = ADRV904X_CTOHL(cfg->accumNumIter); + cfg->returnLossThreshmdB = ADRV904X_CTOHL(cfg->returnLossThreshmdB); + cfg->reversePathOffsetmdB = ADRV904X_CTOHL(cfg->reversePathOffsetmdB); + cfg->minorAlarm.thresholdmdB = ADRV904X_CTOHL(cfg->minorAlarm.thresholdmdB); + cfg->majorAlarm.thresholdmdB = ADRV904X_CTOHL(cfg->majorAlarm.thresholdmdB); + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_VswrStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Channels_e vswrTxChannelSel, + adi_adrv904x_DfeAppCalVswrStatus_t* const vswrStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const adi_adrv904x_DfeAppFrameworkTrackingCalibrationMask_e calId = ADI_ADRV904X_DFE_APP_FRAMEWORK_TRACKINGCAL_TX_VSWR_MASK; + uint32_t i = 0u; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, vswrStatus, cleanup); + + /*Check that if requested Tx Channel valid*/ + /* Channel must contain a single channel number (0-7) */ + recoveryAction = adrv904x_DfeVerifyChannel(vswrTxChannelSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, vswrTxChannelSel, "channel parameter is invalid."); + goto cleanup; + } + + /* Use the common cal status get handler to get the data from the CPU */ + recoveryAction = adi_adrv904x_DfeCalSpecificStatusGet(device, + vswrTxChannelSel, + adrv904x_DfeTrackingCalToObjId(calId), + (uint8_t *)vswrStatus, + sizeof(adi_adrv904x_DfeAppCalVswrStatus_t)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error getting VSWR tracking cal status."); + goto cleanup; + } + + /* Generic header */ + vswrStatus->hdr.errorCode = ADRV904X_CTOHL(vswrStatus->hdr.errorCode); + vswrStatus->hdr.iterCount = ADRV904X_CTOHL(vswrStatus->hdr.iterCount); + vswrStatus->hdr.percentComplete = ADRV904X_CTOHL(vswrStatus->hdr.percentComplete); + vswrStatus->hdr.performanceMetric = ADRV904X_CTOHL(vswrStatus->hdr.performanceMetric); + vswrStatus->hdr.updateCount = ADRV904X_CTOHL(vswrStatus->hdr.updateCount); + + /* VSWR specific fields */ + for (i = 0u; i < ADI_ADRV904X_DFE_APP_CAL_VSWR_NUM_REFLECTIONS; ++i) + { + vswrStatus->reflection[i].returnLossmdB = ADRV904X_CTOHL(vswrStatus->reflection[i].returnLossmdB); + vswrStatus->reflection[i].sampleDelay = ADRV904X_CTOHS(vswrStatus->reflection[i].sampleDelay); + } + vswrStatus->fwdSampleDelay = ADRV904X_CTOHS(vswrStatus->fwdSampleDelay); + vswrStatus->fwdGainmdB = ADRV904X_CTOHL(vswrStatus->fwdGainmdB); + vswrStatus->fwdCaptureTimeStamp_us = ADRV904X_CTOHLL(vswrStatus->fwdCaptureTimeStamp_us); + vswrStatus->revCaptureTimeStamp_us = ADRV904X_CTOHLL(vswrStatus->revCaptureTimeStamp_us); + vswrStatus->fwdCapturePowermdB = ADRV904X_CTOHL(vswrStatus->fwdCapturePowermdB); + vswrStatus->revCapturePowermdB = ADRV904X_CTOHL(vswrStatus->revCapturePowermdB); + vswrStatus->txPlaybackPowermdB = ADRV904X_CTOHL(vswrStatus->txPlaybackPowermdB); + vswrStatus->captureAccumLength = ADRV904X_CTOHS(vswrStatus->captureAccumLength); + + /* Capture related status fields */ + vswrStatus->capStartRetryCount = ADRV904X_CTOHL(vswrStatus->capStartRetryCount); + vswrStatus->capAbortRetryCount = ADRV904X_CTOHL(vswrStatus->capAbortRetryCount); + vswrStatus->capInvalidRetryCount = ADRV904X_CTOHL(vswrStatus->capInvalidRetryCount); + vswrStatus->capAbortErrorCount = ADRV904X_CTOHL(vswrStatus->capAbortErrorCount); + vswrStatus->capInvalidErrorCount = ADRV904X_CTOHL(vswrStatus->capInvalidErrorCount); + vswrStatus->capStartErrorCount = ADRV904X_CTOHL(vswrStatus->capStartErrorCount); + vswrStatus->periodEndedErrorCount = ADRV904X_CTOHL(vswrStatus->periodEndedErrorCount); + vswrStatus->txAttenChangeCount = ADRV904X_CTOHL(vswrStatus->txAttenChangeCount); + + vswrStatus->fwdPathUnstableCount = ADRV904X_CTOHL(vswrStatus->fwdPathUnstableCount); + vswrStatus->minorAlarmCount = ADRV904X_CTOHL(vswrStatus->minorAlarmCount); + vswrStatus->majorAlarmCount = ADRV904X_CTOHL(vswrStatus->majorAlarmCount); + + vswrStatus->calExitRequestCount = ADRV904X_CTOHL(vswrStatus->calExitRequestCount); + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_VswrReset(adi_adrv904x_Device_t* const device, + const uint32_t vswrTxChannelMask) +{ + const uint16_t VSWR_CTRL_RESET = (uint16_t)(ADI_ADRV904X_DFE_APP_CAL_VSWR_CTRL_RESET); + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lengthResp = 0; + uint32_t i = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + if (((vswrTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (vswrTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + vswrTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + for (i = 0; i < ADI_ADRV904X_MAX_TXCHANNELS; i++) + { + uint32_t txChan = (1 << i); + if (vswrTxChannelMask & txChan) + { + recoveryAction = adi_adrv904x_DfeAppControlCmdExec(device, + ADI_ADRV904X_DFE_APP_FRAMEWORK_OBJID_CAL_VSWR, + VSWR_CTRL_RESET, + (adi_adrv904x_Channels_e)txChan, + NULL, + 0U, + &lengthResp, + NULL, + 0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChan, "Failed to send request"); + goto cleanup; + } + } + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + + +static adi_adrv904x_ErrAction_e adrv904x_TxVswrPlaybackDataWrite(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const adi_adrv904x_VswrPlaybackData_t* const playbackData, + const uint8_t a55Running) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_DfeSvcErrDfeBootStatus_e bootStatus = ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_POWER_UP; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + uint32_t i = 0U; + uint32_t dataToWrite = 0U; + uint8_t playbackEnableRead = 0U; + uint32_t origEccState = 0U; + uint8_t initEcc = ADI_FALSE; + adrv904x_BfTxDfeDigRegsChanAddr_e txDfeDigBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DFE_DIG_REGS; + uint32_t dataToWriteArr[ADI_ADRV904X_VSWR_PLAYBACK_DATA_MAX_NUM_SAMPLES]; + uint32_t vswrPlaybackBaseAddressArr[ADI_ADRV904X_MAX_TXCHANNELS] = { + ADI_ADVRV904X_TX0_VSWR_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX1_VSWR_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX2_VSWR_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX3_VSWR_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX4_VSWR_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX5_VSWR_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX6_VSWR_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX7_VSWR_PLAYBACK_RAM_BASEADDR + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_NULL_PTR_RETURN(playbackData); + ADI_LIBRARY_MEMSET(&dataToWriteArr[0U], 0, sizeof(dataToWriteArr)); + + /*Check that if requested Tx Channel valid*/ + if (((txChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || + (txChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + if (playbackData->numSamples > ADI_ADRV904X_VSWR_PLAYBACK_DATA_MAX_NUM_SAMPLES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + playbackData->numSamples, + "Number of samples cannot be greater than ADI_ADRV904X_VSWR_PLAYBACK_DATA_MAX_NUM_SAMPLES"); + goto cleanup; + } + + if (a55Running == ADI_TRUE) + { + /* Read Enabled ECC scrubbing memory regions for VSWR playback RAM */ + recoveryAction = adrv904x_DfeEccEnableGet(device, + &origEccState); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading VSWR RAM ECC state"); + goto cleanup; + } + else + { + initEcc = ADI_TRUE; + } + } + else /* need to confirm A55 is not running so it doesn't interfere with VSWR PLayback RAM access */ + { + /* Get the CPU boot status */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_DFE_BOOT_STATUS_SCRATCH_REG_ID, + (uint8_t*) &bootStatus); + if (bootStatus != ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_POWER_UP) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while accessing VSWR RAM. A55 running"); + goto cleanup; + } + } + + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(txChannelMask, chanSel)) + { + recoveryAction = adrv904x_TxDfeDigBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txDfeDigBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanSel, "Invalid Tx Channel used to determine Tx Dfe Dig base address"); + goto cleanup; + } + + /* Check if playback data is enabled before writing a new dataset*/ + recoveryAction = adrv904x_TxDfeDigRegs_TxVswrDataGenEnable_BfGet(device, + NULL, + txDfeDigBaseAddr, + &playbackEnableRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading VSWR data playback"); + goto cleanup; + } + + if (playbackEnableRead == ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Playback generator should be disabled while writing to playback RAM"); + goto cleanup; + } + + /* Enable AHB access to VSWR playback RAM */ + recoveryAction = adrv904x_TxDfeDigRegs_TxVswrDataGenAhbAccessEnable_BfSet(device, + NULL, + txDfeDigBaseAddr, + ADI_TRUE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while enabling VSWR RAM access"); + goto cleanup; + } + + if (a55Running == ADI_TRUE) + { + /* Disable ECC scrubbing for VSWR playback RAM */ + recoveryAction = adrv904x_DfeEccEnableSet(device, + ~(0x00000004u << chanIdx) & origEccState); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while disabling VSWR RAM ECC scrubbing"); + goto cleanup; + } + } + + for (i = 0; i < playbackData->numSamples; ++i) + { + dataToWrite = ((((uint32_t)playbackData->playbackDataReal[i] << 0U) & 0x0000FFFFU) | + (((uint32_t)playbackData->playbackDataImag[i] << 16U) & 0xFFFF0000U)); + + dataToWriteArr[i] = dataToWrite; + } + + recoveryAction = adi_adrv904x_Registers32Write(device, + NULL, + &vswrPlaybackBaseAddressArr[chanIdx], + dataToWriteArr, + NULL, + playbackData->numSamples); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register Write Issue"); + goto cleanup; + } + /* Program the number of samples */ + recoveryAction = adrv904x_TxDfeDigRegs_TxVswrDataGenMaxSamples_BfSet(device, + NULL, + txDfeDigBaseAddr, + playbackData->numSamples); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing number of samples"); + goto cleanup; + } + + /* Disable AHB access to VSWR playback RAM */ + recoveryAction = adrv904x_TxDfeDigRegs_TxVswrDataGenAhbAccessEnable_BfSet(device, + NULL, + txDfeDigBaseAddr, + ADI_FALSE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while disabling VSWR RAM access"); + goto cleanup; + } + + device->devStateInfo.vswrWaveformLoaded[chanIdx] = ADI_TRUE; + } + } + +cleanup: + if (initEcc == ADI_TRUE) + { + /* Restore ECC scrubbing for VSWR playback RAM */ + recoveryAction = adrv904x_DfeEccEnableSet(device, + origEccState); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while restoring VSWR RAM ECC scrubbing"); + } + } + + return recoveryAction; +} diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_error.c b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_error.c new file mode 100644 index 00000000000..cf04824210a --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_error.c @@ -0,0 +1,453 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_error.c +* +* \brief Device Specific Abstractions for Common Error Definitions +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#include "adi_adrv904x_error.h" + +#include "../../private/include/adrv904x_cpu_error_tables.h" + + +#include "../../private/include/adrv904x_dfe_app_error_tables.h" +#include "../../private/include/adrv904x_dfe_svc_error_tables.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PUBLIC_ERROR + + +/* Error Code Tables */ + +/* API ADRV904X Module Specific Error Tables */ + +static const adrv904x_CalsErrCodes_t adrv904x_CalsErrTable[] = +{ + { ADI_ADRV904X_ERRCODE_CALS_INIT_ERROR_FLAG, ADI_STRING("Init Cals Error - Please Perform a InitCalsDetailedStatusGet for more Information"), ADI_ADRV904X_ERR_ACT_CHECK_FEATURE } +}; + +static const adrv904x_CpuErrCodes_t adrv904x_CpuErrTable[] = +{ + { ADI_ADRV904X_ERRCODE_CPU_CMD_ID, ADI_STRING("CPU Command ID Error"), ADI_ADRV904X_ERR_ACT_CHECK_PARAM }, + { ADI_ADRV904X_ERRCODE_CPU_CMD_RESPONSE, ADI_STRING("CPU Command Response Error"), ADI_ADRV904X_ERR_ACT_RESET_FEATURE }, + { ADI_ADRV904X_ERRCODE_CPU_CMD_TIMEOUT, ADI_STRING("CPU Command Timeout"), ADI_ADRV904X_ERR_ACT_CHECK_FEATURE }, + { ADI_ADRV904X_ERRCODE_CPU_IMAGE_NOT_LOADED, ADI_STRING("CPU Image Write Required before Boot Status Check"), ADI_ADRV904X_ERR_ACT_CHECK_PARAM }, + { ADI_ADRV904X_ERRCODE_CPU_IMAGE_WRITE, ADI_STRING("CPU Image Write Error"), ADI_ADRV904X_ERR_ACT_CHECK_FEATURE }, + { ADI_ADRV904X_ERRCODE_CPU_PROFILE_WRITE, ADI_STRING("CPU Profile Write Error"), ADI_ADRV904X_ERR_ACT_CHECK_PARAM }, + { ADI_ADRV904X_ERRCODE_CPU_MAILBOX_READ, ADI_STRING("CPU Mailbox Error"), ADI_ADRV904X_ERR_ACT_CHECK_FEATURE }, + { ADI_ADRV904X_ERRCODE_CPU_RAM_ACCESS_START, ADI_STRING("RAM Access Start Issue"), ADI_ADRV904X_ERR_ACT_CHECK_PARAM }, + { ADI_ADRV904X_ERRCODE_CPU_RAM_LOCK, ADI_STRING("RAM Lock Issue"), ADI_ADRV904X_ERR_ACT_RESET_FEATURE }, + { ADI_ADRV904X_ERRCODE_CPU_RAM_ACCESS_STOP, ADI_STRING("RAM Access Stop Issue"), ADI_ADRV904X_ERR_ACT_CHECK_PARAM }, + { ADI_ADRV904X_ERRCODE_CPU_PING, ADI_STRING("CPU Ping Issue"), ADI_ADRV904X_ERR_ACT_RESET_FEATURE }, + { ADI_ADRV904X_ERRCODE_CPU_BOOT_TIMEOUT, ADI_STRING("CPU Boot Timeout"), ADI_ADRV904X_ERR_ACT_RESET_DEVICE } +}; + +/* CPU Boot & Runtime Errors are device error tables provided by firmware */ + +static const adrv904x_DataInterfaceErrCodes_t adrv904x_DataInterfaceErrTable[] = +{ + { ADI_ADRV904X_ERRCODE_DATAINTERFACE_TEST, ADI_STRING("Implement Data Interfaces Errors"), ADI_ADRV904X_ERR_ACT_CHECK_PARAM } +}; + +static const adrv904x_AgcErrCodes_t adrv904x_AgcErrTable[] = +{ + { ADI_ADRV904X_ERRCODE_AGC_TEST, ADI_STRING("Implement AGC Errors"), ADI_ADRV904X_ERR_ACT_CHECK_PARAM } +}; + +static const adrv904x_GpioErrCodes_t adrv904x_GpioErrTable[] = +{ + { ADI_ADRV904X_ERRCODE_GPIO_TEST, ADI_STRING("Implement Gpio Errors"), ADI_ADRV904X_ERR_ACT_CHECK_PARAM } +}; + +static const adrv904x_HalErrCodes_t adrv904x_HalErrTable[] = +{ + { ADI_ADRV904X_ERRCODE_HAL_SPI_WRITE, ADI_STRING("SPI Write Error"), ADI_ADRV904X_ERR_ACT_CHECK_INTERFACE }, + { ADI_ADRV904X_ERRCODE_HAL_SPI_READ, ADI_STRING("SPI Read Error"), ADI_ADRV904X_ERR_ACT_CHECK_INTERFACE } +}; + +static const adrv904x_JesdErrCodes_t adrv904x_JesdErrTable[] = +{ + { ADI_ADRV904X_ERRCODE_JESD_TEST, ADI_STRING("Implement JESD Errors"), ADI_ADRV904X_ERR_ACT_CHECK_PARAM } +}; + +static const adrv904x_RadioCtrlErrCodes_t adrv904x_RadioCtrlErrTable[] = +{ + { ADI_ADRV904X_ERRCODE_RADIOCTRL_LO_CFG, ADI_STRING("Lo Frequency Configuration Error"), ADI_ADRV904X_ERR_ACT_CHECK_PARAM } +}; + +static const adrv904x_RxErrCodes_t adrv904x_RxErrTable[] = +{ + { ADI_ADRV904X_ERRCODE_RX_TEST, ADI_STRING("Implement Rx Errors"), ADI_ADRV904X_ERR_ACT_CHECK_PARAM } +}; + +static const adrv904x_TxErrCodes_t adrv904x_TxErrTable[] = +{ + { ADI_ADRV904X_ERRCODE_TX_TEST, ADI_STRING("Implement Tx Errors"), ADI_ADRV904X_ERR_ACT_CHECK_PARAM } +}; +static const adrv904x_DfeCpuErrCodes_t adrv904x_DfeCpuErrTable[] = +{ + { ADI_ADRV904X_ERRCODE_DFE_CPU_CMD_ID, ADI_STRING("DFE CPU Command ID Error"), ADI_ADRV904X_ERR_ACT_CHECK_PARAM }, + { ADI_ADRV904X_ERRCODE_DFE_CPU_CMD_RESPONSE, ADI_STRING("DFE CPU Command Response Error"), ADI_ADRV904X_ERR_ACT_RESET_FEATURE }, + { ADI_ADRV904X_ERRCODE_DFE_CPU_CMD_TIMEOUT, ADI_STRING("DFE CPU Command Timeout"), ADI_ADRV904X_ERR_ACT_CHECK_FEATURE }, + { ADI_ADRV904X_ERRCODE_DFE_CPU_IMAGE_NOT_LOADED, ADI_STRING("DFE CPU Image Write Required before Boot Status Check"), ADI_ADRV904X_ERR_ACT_CHECK_PARAM }, + { ADI_ADRV904X_ERRCODE_DFE_CPU_IMAGE_WRITE, ADI_STRING("DFE CPU Image Write Error"), ADI_ADRV904X_ERR_ACT_CHECK_FEATURE }, + { ADI_ADRV904X_ERRCODE_DFE_CPU_PROFILE_WRITE, ADI_STRING("DFE CPU Profile Write Error"), ADI_ADRV904X_ERR_ACT_CHECK_PARAM }, + { ADI_ADRV904X_ERRCODE_DFE_CPU_MAILBOX_READ, ADI_STRING("DFE CPU Mailbox Error"), ADI_ADRV904X_ERR_ACT_CHECK_FEATURE }, + { ADI_ADRV904X_ERRCODE_DFE_CPU_RAM_ACCESS_START, ADI_STRING("DFE CPU RAM Access Start Issue"), ADI_ADRV904X_ERR_ACT_CHECK_PARAM }, + { ADI_ADRV904X_ERRCODE_DFE_CPU_RAM_LOCK, ADI_STRING("DFE CPU RAM Lock Issue"), ADI_ADRV904X_ERR_ACT_RESET_FEATURE }, + { ADI_ADRV904X_ERRCODE_DFE_CPU_RAM_ACCESS_STOP, ADI_STRING("DFE CPU RAM Access Stop Issue"), ADI_ADRV904X_ERR_ACT_CHECK_PARAM }, + { ADI_ADRV904X_ERRCODE_DFE_CPU_PING, ADI_STRING("DFE CPU Ping Issue"), ADI_ADRV904X_ERR_ACT_RESET_FEATURE }, + { ADI_ADRV904X_ERRCODE_DFE_CPU_BOOT_TIMEOUT, ADI_STRING("DFE CPU Boot Timeout"), ADI_ADRV904X_ERR_ACT_RESET_DEVICE }, + { ADI_ADRV904X_ERRCODE_DFE_CPU_BOOT_ERROR, ADI_STRING("DFE CPU Boot error"), ADI_ADRV904X_ERR_ACT_RESET_DEVICE } +}; + +/*****************************************************************************/ +/***** Local functions' prototypes *******************************************/ +/*****************************************************************************/ + +/** +* \brief Service to Lookup a specified Error Table +* +* \param[in] errTable Error Table to be Looked Up +* \param[in] errTableSize Error Table Size +* \param[in] errCode Error Code to be Looked Up +* \param[out] errMsgPtr Associated Error Message from Look Up Table +* \param[out] errActionPtr Associated Error Action from Look Up Table +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +static adi_adrv904x_ErrAction_e adrv904x_ErrTableLookUp(const adi_adrv904x_ErrTableRow_t errTable[], + const size_t errTableSize, + const uint32_t errCode, + const char** const errMsgPtr, + adi_adrv904x_ErrAction_e* const errActionPtr); + +/** +* \brief Service to Lookup a specified Device Error Table +* +* \param[in] errTable Device Error Table to be Looked Up +* \param[in] errTableSize Error Table Size +* \param[in] errCode Error Code to be Looked Up +* \param[out] errMsgPtr Associated Error Message from Look Up Table +* \param[out] errCausePtr Associated Error Cause from Look Up Table +* \param[out] actionCodePtr Associated Error Action from Look Up Table +* \param[out] actionMsgPtr Associated Error Cause from Look Up Table +* +* \retval adi_adrv904x_ErrAction_e - ADI_ADRV904X_ERR_ACT_NONE if Successful +*/ +static adi_adrv904x_ErrAction_e adrv904x_DeviceErrTableLookUp(const adi_adrv904x_DeviceErrTableRow_t errTable[], + const size_t errTableSize, + const uint32_t errCode, + const char** const errMsgPtr, + const char** const errCausePtr, + adi_adrv904x_ErrAction_e* const actionCodePtr, + const char** const actionMsgPtr); + + +/*****************************************************************************/ +/***** Local data types ******************************************************/ +/*****************************************************************************/ + + +/*****************************************************************************/ +/***** Functions' definition *************************************************/ +/*****************************************************************************/ +static adi_adrv904x_ErrAction_e adrv904x_ErrTableLookUp(const adi_adrv904x_ErrTableRow_t errTable[], + const size_t errTableSize, + const uint32_t errCode, + const char** const errMsgPtr, + adi_adrv904x_ErrAction_e* const actionCodePtr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t idx = 0U; + + ADI_ADRV904X_NULL_PTR_RETURN(errMsgPtr); + + ADI_ADRV904X_NULL_PTR_RETURN(actionCodePtr); + + if (errTableSize >= sizeof(adi_adrv904x_ErrTableRow_t)) + { + for (idx = 0U; (idx < (errTableSize / sizeof(adi_adrv904x_ErrTableRow_t))); ++idx) + { + if (errCode == errTable[idx].errCode) + { + *errMsgPtr = errTable[idx].errMsg; + *actionCodePtr = errTable[idx].action; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + } + } + } + + return recoveryAction; +} + +static adi_adrv904x_ErrAction_e adrv904x_DeviceErrTableLookUp(const adi_adrv904x_DeviceErrTableRow_t errTable[], + const size_t errTableSize, + const uint32_t errCode, + const char** const errMsgPtr, + const char** const errCausePtr, + adi_adrv904x_ErrAction_e* const actionCodePtr, + const char** const actionMsgPtr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t idx = 0U; + + ADI_ADRV904X_NULL_PTR_RETURN(errMsgPtr); + + ADI_ADRV904X_NULL_PTR_RETURN(errCausePtr); + + ADI_ADRV904X_NULL_PTR_RETURN(actionCodePtr); + + ADI_ADRV904X_NULL_PTR_RETURN(actionMsgPtr); + + if (errTableSize >= sizeof(adi_adrv904x_DeviceErrTableRow_t)) + { + for (idx = 0U; (idx < (errTableSize / sizeof(adi_adrv904x_DeviceErrTableRow_t))); ++idx) + { + if (errCode == errTable[idx].errCode) + { + *errMsgPtr = errTable[idx].errMsg; + *errCausePtr = errTable[idx].errCause; + *actionCodePtr = errTable[idx].actionCode; + *actionMsgPtr = errTable[idx].actionMsg; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + break; + } + } + } + + return recoveryAction; +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ErrInfoGet(const adi_adrv904x_ErrSource_e errSrc, + const int64_t errCode, + const char** const errMsgPtr, + const char** const errCausePtr, + adi_adrv904x_ErrAction_e* const actionCodePtr, + const char** const actionMsgPtr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Validate Arguments */ + ADI_ADRV904X_NULL_PTR_RETURN(errMsgPtr); + + ADI_ADRV904X_NULL_PTR_RETURN(errCausePtr); + + ADI_ADRV904X_NULL_PTR_RETURN(actionCodePtr); + + ADI_ADRV904X_NULL_PTR_RETURN(actionMsgPtr); + + /* Default Values */ + *errMsgPtr = NULL; + *errCausePtr = NULL; + *actionCodePtr = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + *actionMsgPtr = NULL; + + switch (errSrc) + { + case ADI_ADRV904X_ERRSRC_API: + case ADI_ADRV904X_ERRSRC_HAL: + case ADI_ADRV904X_ERRSRC_DEVICEBF: + /* Sources using Common Errors */ + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_ErrorGet(errCode, + errMsgPtr, + (adi_common_ErrAction_e* const) actionCodePtr); + break; + + case ADI_ADRV904X_ERRSRC_DEVICEHAL: + recoveryAction = adrv904x_ErrTableLookUp(adrv904x_HalErrTable, + sizeof(adrv904x_HalErrTable), + errCode, + errMsgPtr, + actionCodePtr); + break; + + case ADI_ADRV904X_ERRSRC_CALS: + recoveryAction = adrv904x_ErrTableLookUp(adrv904x_CalsErrTable, + sizeof(adrv904x_CalsErrTable), + errCode, + errMsgPtr, + actionCodePtr); + break; + + case ADI_ADRV904X_ERRSRC_CPU_BOOT: + recoveryAction = adrv904x_DeviceErrTableLookUp( adrv904x_CpuBootErrTable, + sizeof(adrv904x_CpuBootErrTable), + errCode, + errMsgPtr, + errCausePtr, + actionCodePtr, + actionMsgPtr); + break; + + case ADI_ADRV904X_ERRSRC_CPU_RUNTIME: + recoveryAction = adrv904x_DeviceErrTableLookUp(adrv904x_CpuRunTimeErrTable, + sizeof(adrv904x_CpuRunTimeErrTable), + errCode, + errMsgPtr, + errCausePtr, + actionCodePtr, + actionMsgPtr); + break; + + case ADI_ADRV904X_ERRSRC_CPU: + recoveryAction = adrv904x_ErrTableLookUp(adrv904x_CpuErrTable, + sizeof(adrv904x_CpuErrTable), + errCode, + errMsgPtr, + actionCodePtr); + break; + + case ADI_ADRV904X_ERRSRC_DATAINTERFACE: + recoveryAction = adrv904x_ErrTableLookUp(adrv904x_DataInterfaceErrTable, + sizeof(adrv904x_DataInterfaceErrTable), + errCode, + errMsgPtr, + actionCodePtr); + break; + + case ADI_ADRV904X_ERRSRC_AGC: + recoveryAction = adrv904x_ErrTableLookUp(adrv904x_AgcErrTable, + sizeof(adrv904x_AgcErrTable), + errCode, + errMsgPtr, + actionCodePtr); + break; + case ADI_ADRV904X_ERRSRC_GPIO: + recoveryAction = adrv904x_ErrTableLookUp(adrv904x_GpioErrTable, + sizeof(adrv904x_GpioErrTable), + errCode, + errMsgPtr, + actionCodePtr); + break; + + case ADI_ADRV904X_ERRSRC_JESD: + recoveryAction = adrv904x_ErrTableLookUp(adrv904x_JesdErrTable, + sizeof(adrv904x_JesdErrTable), + errCode, + errMsgPtr, + actionCodePtr); + break; + + case ADI_ADRV904X_ERRSRC_RADIOCTRL: + recoveryAction = adrv904x_ErrTableLookUp(adrv904x_RadioCtrlErrTable, + sizeof(adrv904x_RadioCtrlErrTable), + errCode, + errMsgPtr, + actionCodePtr); + break; + + case ADI_ADRV904X_ERRSRC_RX: + recoveryAction = adrv904x_ErrTableLookUp(adrv904x_RxErrTable, + sizeof(adrv904x_RxErrTable), + errCode, + errMsgPtr, + actionCodePtr); + break; + + case ADI_ADRV904X_ERRSRC_TX: + recoveryAction = adrv904x_ErrTableLookUp(adrv904x_TxErrTable, + sizeof(adrv904x_TxErrTable), + errCode, + errMsgPtr, + actionCodePtr); + break; + case ADI_ADRV904X_ERRSRC_DFE_CPU_BOOT: + recoveryAction = adrv904x_DeviceErrTableLookUp(adrv904x_DfeCpuBootErrTable, + sizeof(adrv904x_DfeCpuBootErrTable), + errCode, + errMsgPtr, + errCausePtr, + actionCodePtr, + actionMsgPtr); + break; + + case ADI_ADRV904X_ERRSRC_DFE_CPU: + recoveryAction = adrv904x_ErrTableLookUp(adrv904x_DfeCpuErrTable, + sizeof(adrv904x_DfeCpuErrTable), + errCode, + errMsgPtr, + actionCodePtr); + break; + + case ADI_ADRV904X_ERRSRC_DFE_APP_RUNTIME: + recoveryAction = adrv904x_DeviceErrTableLookUp(adrv904x_DfeAppRunTimeErrTable, + sizeof(adrv904x_DfeAppRunTimeErrTable), + errCode, + errMsgPtr, + errCausePtr, + actionCodePtr, + actionMsgPtr); + break; + + case ADI_ADRV904X_ERRSRC_DFE_SVC_RUNTIME: + recoveryAction = adrv904x_DeviceErrTableLookUp(adrv904x_DfeSvcRunTimeErrTable, + sizeof(adrv904x_DfeSvcRunTimeErrTable), + errCode, + errMsgPtr, + errCausePtr, + actionCodePtr, + actionMsgPtr); + break; + case ADI_ADRV904X_ERRSRC_NONE: + case ADI_ADRV904X_ERRSRC_UNKNOWN: + /* Fall Through */ + + default: + /* Invalid Error Source; No Lookup can be performed */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + break; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ErrDataGet(const adi_adrv904x_Device_t* const device, + const adi_common_ErrFrameId_e frameId, + adi_adrv904x_ErrSource_e* const errSrcPtr, + int64_t* const errCodePtr, + const char** const errMsgPtr, + const char** const errCausePtr, + adi_adrv904x_ErrAction_e* const actionCodePtr, + const char** const actionMsgPtr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_common_ErrFrame_t errFrame = { ADI_COMMON_ERR_ACT_NONE, { 0, NULL, 0U }, { 0U, NULL, 0U }, { NULL, 0 } }; + + + /* Validate Arguments */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_NULL_PTR_RETURN(errSrcPtr); + + ADI_ADRV904X_NULL_PTR_RETURN(errCodePtr); + + ADI_ADRV904X_NULL_PTR_RETURN(errMsgPtr); + + ADI_ADRV904X_NULL_PTR_RETURN(actionCodePtr); + + /* Parse Error Frame */ + recoveryAction = (adi_adrv904x_ErrAction_e) ADI_ERROR_FRAME_GET(&device->common, frameId, &errFrame); + if (ADI_ADRV904X_ERR_ACT_NONE == recoveryAction) + { + /* Convert to adrv904x Error Source */ + *errSrcPtr = (adi_adrv904x_ErrSource_e) errFrame.errInfo.errSrc; + *errCodePtr = errFrame.errInfo.errCode; + recoveryAction = adi_adrv904x_ErrInfoGet( *errSrcPtr, + *errCodePtr, + errMsgPtr, + errCausePtr, + actionCodePtr, + actionMsgPtr); + } + + return recoveryAction; +} \ No newline at end of file diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_gpio.c b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_gpio.c new file mode 100644 index 00000000000..4d860286956 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_gpio.c @@ -0,0 +1,1938 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_gpio.c +* \brief Contains GPIO feature related function implementation defined in +* adi_adrv904x_gpio.h +* +* ADRV904X API Version: 2.10.0.4 +*/ +#include "adi_adrv904x_gpio.h" + +#include "../../private/include/adrv904x_gpio.h" +#include "../../private/include/adrv904x_radioctrl.h" +#include "../../private/bf/adrv904x_bf_core.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PUBLIC_GPIO + +static const adi_adrv904x_GpioSignal_e manualModeInputSignal[ADI_ADRV904X_GPIO_COUNT] = { + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_0, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_1, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_2, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_3, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_4, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_5, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_6, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_7, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_8, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_9, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_10, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_11, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_12, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_13, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_14, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_15, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_16, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_17, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_18, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_19, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_20, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_21, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_22, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_INPUT_23 +}; + +static const adi_adrv904x_GpioSignal_e manualModeOutputSignal[ADI_ADRV904X_GPIO_COUNT] = { + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_0, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_1, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_2, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_3, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_4, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_5, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_6, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_7, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_8, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_9, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_10, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_11, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_12, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_13, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_14, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_15, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_16, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_17, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_18, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_19, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_20, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_21, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_22, + ADI_ADRV904X_GPIO_SIGNAL_MANUAL_MODE_OUTPUT_23 +}; + +static const adi_adrv904x_GpioSignal_e analogManualModeInputSignal[ADI_ADRV904X_GPIO_ANALOG_COUNT] = { + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_0, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_1, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_2, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_3, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_4, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_5, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_6, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_7, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_8, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_9, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_10, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_11, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_12, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_13, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_14, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_INPUT_15 +}; + +static const adi_adrv904x_GpioSignal_e analogManualModeOutputSignal[ADI_ADRV904X_GPIO_ANALOG_COUNT] = { + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_0, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_1, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_2, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_3, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_4, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_5, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_6, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_7, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_8, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_9, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_10, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_11, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_12, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_13, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_14, + ADI_ADRV904X_GPIO_SIGNAL_ANALOG_MANUAL_MODE_OUTPUT_15 +}; + +/**************************************************************************** + * GPIO related functions + **************************************************************************** + */ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioForceHiZAllPins(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + uint8_t gpioPin; + uint8_t override = 1; + for(gpioPin = ADI_ADRV904X_GPIO_00; gpioPin <= ADI_ADRV904X_GPIO_23; gpioPin++) + { + recoveryAction = adrv904x_GpioIeOverride(device, (adi_adrv904x_GpioPinSel_e)gpioPin, override); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write gpio source control override."); + goto cleanup; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioForceHiZ(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const uint8_t override) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + recoveryAction = adrv904x_GpioIeOverride(device, gpio, override); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write gpio source control override."); + } + + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioAnalogForceHiZAllPins(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + uint8_t gpioPin; + uint8_t override = 1; + for(gpioPin = ADI_ADRV904X_GPIO_ANA_00; gpioPin <= ADI_ADRV904X_GPIO_ANA_15; gpioPin++) + { + recoveryAction = adrv904x_GpioAnalogIeOverride(device, (adi_adrv904x_GpioAnaPinSel_e)gpioPin, override); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write gpio source control override."); + goto cleanup; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); + +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioAnalogForceHiZ( adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioAnaPinSel_e gpio, + const uint8_t override) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + recoveryAction = adrv904x_GpioAnalogIeOverride(device, gpio, override); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write gpio source control override."); + } + + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); + +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioStatusRead( adi_adrv904x_Device_t* const device, + adi_adrv904x_GpioStatus_t* const status) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_GpioStatus_t read; + uint8_t i = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, status, cleanup); + + /* Clear out readback structure*/ + ADI_LIBRARY_MEMSET(&read, 0, sizeof(adi_adrv904x_GpioStatus_t)); + + /* Readback Digital GPIO configs */ + recoveryAction = adi_adrv904x_GpioConfigAllGet(device, read.digSignal, read.digChMask, ADI_ADRV904X_GPIO_COUNT); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading back the status of all Digital GPIOs"); + goto cleanup; + } + + /* Readback Analog GPIO configs */ + recoveryAction = adi_adrv904x_GpioAnalogConfigAllGet(device, read.anaSignal, read.anaChMask, ADI_ADRV904X_GPIO_COUNT); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading back the status of all Analog GPIOs"); + goto cleanup; + } + + /* Build pinmask for allocated digital pins */ + read.digPinAllocated = 0U; + for (i = 0U; i < ADI_ADRV904X_GPIO_COUNT; i++) + { + if (read.digSignal[i] != ADI_ADRV904X_GPIO_SIGNAL_UNUSED) + { + read.digPinAllocated |= (1U << i); + } + } + + /* Build pinmask for allocated analog pins */ + read.anaPinAllocated = 0U; + for (i = 0U; i < ADI_ADRV904X_GPIO_ANALOG_COUNT; i++) + { + if (read.anaSignal[i] != ADI_ADRV904X_GPIO_SIGNAL_UNUSED) + { + read.anaPinAllocated |= (1U << i); + } + } + + /* Set status to readback structure */ + *status = read; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioConfigGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + adi_adrv904x_GpioSignal_e* const signal, + uint32_t* const channelMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, signal, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, channelMask, cleanup); + + /* Range check gpio */ + if ((gpio < ADI_ADRV904X_GPIO_00) || + (gpio >= ADI_ADRV904X_GPIO_INVALID)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, recoveryAction, gpio, "Invalid GPIO selected. Out of range."); + goto cleanup; + } + + /* Call utility to retrieve current signal/channelMask for selected gpio */ + recoveryAction = adrv904x_GpioSignalGet( device, gpio, signal, channelMask ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while obtaining current GPIO configuration"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioConfigAllGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_GpioSignal_e signalArray[], + uint32_t channelMaskArray[], + const uint32_t arraySize) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t gpioIdx = 0U; + adi_adrv904x_GpioPinSel_e tmpGpio = ADI_ADRV904X_GPIO_INVALID; + adi_adrv904x_GpioSignal_e tmpSig = ADI_ADRV904X_GPIO_SIGNAL_INVALID; + uint32_t tmpMask = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, signalArray, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, channelMaskArray, cleanup); + + /* Range check arraySize */ + if ( arraySize < ADI_ADRV904X_GPIO_INVALID ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, recoveryAction, arraySize, "Insufficient arraySize provided by user to store GPIO signalArray and channelMaskArray. arraySize must be greater than or equal to 24."); + goto cleanup; + } + + /* Iterate through all gpios */ + for ( gpioIdx = 0U; gpioIdx < ADI_ADRV904X_GPIO_INVALID; gpioIdx++ ) + { + /* Call utility to retrieve signal/channelMask for the gpio */ + tmpGpio = (adi_adrv904x_GpioPinSel_e)gpioIdx; + recoveryAction = adrv904x_GpioSignalGet( device, tmpGpio, &tmpSig, &tmpMask ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while obtaining current GPIO configuration"); + goto cleanup; + } + + /* Store results into arrays */ + signalArray[gpioIdx] = tmpSig; + channelMaskArray[gpioIdx] = tmpMask; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioAnalogConfigGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioAnaPinSel_e gpio, + adi_adrv904x_GpioSignal_e* const signal, + uint32_t* const channelMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, signal, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, channelMask, cleanup); + + /* Range check gpio */ + if ((gpio < ADI_ADRV904X_GPIO_ANA_00) || + (gpio >= ADI_ADRV904X_GPIO_ANA_INVALID)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, recoveryAction, gpio, "Invalid GPIO selected. Out of range."); + goto cleanup; + } + + /* Call utility to retrieve current signal/channelMask for selected gpio */ + recoveryAction = adrv904x_GpioAnalogSignalGet( device, gpio, signal, channelMask ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while obtaining current GPIO configuration"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioAnalogConfigAllGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_GpioSignal_e signalArray[], + uint32_t channelMaskArray[], + const uint32_t arraySize) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t gpioIdx = 0U; + adi_adrv904x_GpioAnaPinSel_e tmpGpio = ADI_ADRV904X_GPIO_ANA_INVALID; + adi_adrv904x_GpioSignal_e tmpSig = ADI_ADRV904X_GPIO_SIGNAL_INVALID; + uint32_t tmpMask = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, signalArray, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, channelMaskArray, cleanup); + + /* Range check arraySize */ + if ( arraySize < ADI_ADRV904X_GPIO_ANA_INVALID ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, recoveryAction, arraySize, "Insufficient arraySize provided by user to store GPIO signalArray and channelMaskArray. arraySize must be greater than or equal to 24."); + goto cleanup; + } + + /* Iterate through all gpios */ + for ( gpioIdx = 0U; gpioIdx < ADI_ADRV904X_GPIO_ANA_INVALID; gpioIdx++ ) + { + /* Call utility to retrieve signal/channelMask for the gpio */ + tmpGpio = (adi_adrv904x_GpioAnaPinSel_e)gpioIdx; + recoveryAction = adrv904x_GpioAnalogSignalGet( device, tmpGpio, &tmpSig, &tmpMask ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while obtaining current GPIO configuration"); + goto cleanup; + } + + /* Store results into arrays */ + signalArray[gpioIdx] = tmpSig; + channelMaskArray[gpioIdx] = tmpMask; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioMonitorOutSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio, + const adi_adrv904x_GpioSignal_e signal, + const uint8_t channel) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_GpioSignalInfo_t info = { ADI_ADRV904X_GPIO_SIGNAL_UNUSED, ADRV904X_GPIO_DOMAIN_NONE, ADRV904X_GPIO_ROUTE_OFF, 0U, 0U, 0 }; + uint32_t channelMask = 0U; + uint8_t isValidFlag = ADI_FALSE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Range check gpio */ + if ((gpio < ADI_ADRV904X_GPIO_00) || + (gpio >= ADI_ADRV904X_GPIO_INVALID)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, recoveryAction, gpio, "Invalid GPIO selected. Out of range."); + goto cleanup; + } + + /* Range check signal */ + if ((signal < ADI_ADRV904X_GPIO_SIGNAL_UNUSED) || + (signal >= ADI_ADRV904X_GPIO_SIGNAL_NUM_SIGNALS)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, recoveryAction, signal, "Invalid signal selected. Out of range."); + goto cleanup; + } + + /* If signal is UNUSED, automatically try to release this pin from Monitor Output routing */ + if (signal == ADI_ADRV904X_GPIO_SIGNAL_UNUSED) + { + /* Done whether successfully released or not */ + recoveryAction = adi_adrv904x_GpioMonitorOutRelease(device, gpio); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while releasing GPIO from a Monitor Output"); + } + goto cleanup; + } + + /* Get signal info struct */ + recoveryAction = adrv904x_GpioSignalInfoGet(device, signal, &info); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while obtaining signal info"); + goto cleanup; + } + + /* Check if signal is a valid monitor output signal using the route */ + recoveryAction = adrv904x_GpioMonitorOutSignalValidCheck(device, signal, channel, &isValidFlag, &channelMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error checking Monitor Out signal validity"); + goto cleanup; + } + if (isValidFlag != ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, signal, "GPIO signal is not a valid GPIO Monitor Output."); + goto cleanup; + } + + /* Set the signal to the GPIO */ + recoveryAction = adrv904x_GpioSignalSet( device, gpio, signal, channelMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while routing selected monitor output signal to GPIO."); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioMonitorOutRelease(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioPinSel_e gpio) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_GpioSignal_e signal = ADI_ADRV904X_GPIO_SIGNAL_UNUSED; + uint8_t isValidFlag = ADI_FALSE; + uint32_t channelMask = 0U; + uint8_t channel = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Range check gpio */ + if ((gpio < ADI_ADRV904X_GPIO_00) || + (gpio >= ADI_ADRV904X_GPIO_INVALID)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, recoveryAction, gpio, "Invalid GPIO selected. Out of range."); + goto cleanup; + } + + /* Retrieve gpio's current signal */ + recoveryAction = adrv904x_GpioSignalGet(device, gpio, &signal, &channelMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while retreiving currently routed GPIO signal."); + goto cleanup; + } + + /* Check for UNUSED. If UNUSED, nothing to do */ + if (signal == ADI_ADRV904X_GPIO_SIGNAL_UNUSED) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + goto cleanup; + } + + /* Convert channelMask to channel index */ + switch (channelMask) + { + case 0x01U: + channel = 0U; + break; + case 0x02U: + channel = 1U; + break; + case 0x04U: + channel = 2U; + break; + case 0x08U: + channel = 3U; + break; + case 0x10U: + channel = 4U; + break; + case 0x20U: + channel = 5U; + break; + case 0x40U: + channel = 6U; + break; + case 0x80U: + channel = 7U; + break; + default: + channel = 0U; + break; + } + + /* Check for if the gpio is currently routing a valid Monitor Out Signal */ + recoveryAction = adrv904x_GpioMonitorOutSignalValidCheck(device, signal, channel, &isValidFlag, NULL); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error checking Monitor Out signal validity"); + goto cleanup; + } + if (isValidFlag != ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, signal, "GPIO signal is not a valid GPIO Monitor Output."); + goto cleanup; + } + + /* Release GPIO */ + recoveryAction = adrv904x_GpioSignalRelease(device, gpio, signal, channelMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error releasing GPIO from Monitor Out signal."); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioManualInputDirSet( adi_adrv904x_Device_t* const device, + const uint32_t gpioInputMask) +{ + static const uint32_t channelMask = 0U; + static const uint32_t RANGE_CHECK_MASK = 0xFF000000U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_GpioSignal_e prevSignalArray[ADI_ADRV904X_GPIO_COUNT] = { ADI_ADRV904X_GPIO_SIGNAL_UNUSED }; + uint32_t channelMaskArray[ADI_ADRV904X_GPIO_COUNT] = { 0U }; + uint32_t idx = 0U; + uint32_t tmpMask = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Range check input */ + if ((gpioInputMask & RANGE_CHECK_MASK) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, recoveryAction, gpioInputMask, "Invalid GPIO Input Mask. Out of range."); + goto cleanup; + } + + /* Get current GPIO configs */ + recoveryAction = adi_adrv904x_GpioConfigAllGet( device, prevSignalArray, channelMaskArray, ADI_ADRV904X_GPIO_COUNT ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while retreiving current GPIO configurations."); + goto cleanup; + } + + /* Check that all set-pins are unused or already allocated as Manual Inputs */ + for ( idx = 0U; idx < ADI_ADRV904X_GPIO_COUNT; idx++ ) + { + tmpMask = 1U << idx; + if (((gpioInputMask & tmpMask) != 0U) && + (prevSignalArray[idx] != ADI_ADRV904X_GPIO_SIGNAL_UNUSED) && + (prevSignalArray[idx] != manualModeInputSignal[idx])) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, recoveryAction, gpioInputMask, "Invalid GPIO Input Mask. A selected pin is already in use by another feature."); + goto cleanup; + } + } + + /* Deallocate and disconnect any unset-pins that were previously allocated as Manual Inputs */ + for ( idx = 0U; idx < ADI_ADRV904X_GPIO_COUNT; idx++ ) + { + tmpMask = 1U << idx; + if (((gpioInputMask & tmpMask) == 0U) && + (prevSignalArray[idx] == manualModeInputSignal[idx])) + { + recoveryAction = adrv904x_GpioSignalRelease( device, (adi_adrv904x_GpioPinSel_e)idx, prevSignalArray[idx], channelMaskArray[idx] ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while releasing a GPIO from use as a Manual Input."); + goto cleanup; + } + } + } + + /* Configure all set-pins */ + for ( idx = 0U; idx < ADI_ADRV904X_GPIO_COUNT; idx++ ) + { + tmpMask = 1U << idx; + if ((gpioInputMask & tmpMask) != 0U) + { + recoveryAction = adrv904x_GpioSignalSet( device, (adi_adrv904x_GpioPinSel_e)idx, manualModeInputSignal[idx], channelMask ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while configuring a GPIO for use as a Manual Input."); + goto cleanup; + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioManualOutputDirSet( adi_adrv904x_Device_t* const device, + const uint32_t gpioOutputMask) +{ + static const uint32_t channelMask = 0U; + static const uint32_t RANGE_CHECK_MASK = 0xFF000000U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_GpioSignal_e prevSignalArray[ADI_ADRV904X_GPIO_COUNT] = { ADI_ADRV904X_GPIO_SIGNAL_UNUSED }; + uint32_t channelMaskArray[ADI_ADRV904X_GPIO_COUNT] = { 0U }; + uint32_t idx = 0U; + uint32_t tmpMask = 0U; + uint32_t clearDrivePins = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Range check input */ + if ((gpioOutputMask & RANGE_CHECK_MASK) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, recoveryAction, gpioOutputMask, "Invalid GPIO Output Mask. Out of range."); + goto cleanup; + } + + /* Get current GPIO configs */ + recoveryAction = adi_adrv904x_GpioConfigAllGet( device, prevSignalArray, channelMaskArray, ADI_ADRV904X_GPIO_COUNT ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while retreiving current GPIO configurations."); + goto cleanup; + } + + /* Check that all set-pins are unused or already allocated as Manual Outputs */ + for ( idx = 0U; idx < ADI_ADRV904X_GPIO_COUNT; idx++ ) + { + tmpMask = 1U << idx; + if (((gpioOutputMask & tmpMask) != 0U) && + (prevSignalArray[idx] != ADI_ADRV904X_GPIO_SIGNAL_UNUSED) && + (prevSignalArray[idx] != manualModeOutputSignal[idx])) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, recoveryAction, gpioOutputMask, "Invalid GPIO Output Mask. A selected pin is already in use by another feature."); + goto cleanup; + } + } + + /* Deallocate and disconnect any unset-pins that were previously allocated as Manual Outputs */ + for ( idx = 0U; idx < ADI_ADRV904X_GPIO_COUNT; idx++ ) + { + tmpMask = 1U << idx; + if (((gpioOutputMask & tmpMask) == 0U) && + (prevSignalArray[idx] == manualModeOutputSignal[idx])) + { + recoveryAction = adrv904x_GpioSignalRelease( device, (adi_adrv904x_GpioPinSel_e)idx, prevSignalArray[idx], channelMaskArray[idx] ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while releasing a GPIO from use as a Manual Output."); + goto cleanup; + } + + clearDrivePins |= tmpMask; + } + } + + /* Clear the GpioFromMaster drive bits from any deallocated pins */ + recoveryAction = adrv904x_Core_GpioFromMasterClear_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + clearDrivePins); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while clearing drive levels for GPIOs previously allocated as Manual Mode Outputs."); + goto cleanup; + } + + /* Configure all set-pins */ + for ( idx = 0U; idx < ADI_ADRV904X_GPIO_COUNT; idx++ ) + { + tmpMask = 1U << idx; + if ((gpioOutputMask & tmpMask) != 0U) + { + recoveryAction = adrv904x_GpioSignalSet( device, (adi_adrv904x_GpioPinSel_e)idx, manualModeOutputSignal[idx], channelMask ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while configuring a GPIO for use as a Manual Output."); + goto cleanup; + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioManualInputPinLevelGet( adi_adrv904x_Device_t* const device, + uint32_t * const gpioInPinLevel) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gpioInPinLevel, cleanup); + + /* Readback bitfield */ + /* Using Direct SPI instead of AHB */ + recoveryAction = adrv904x_Core_GpioSpiRead_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + gpioInPinLevel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while reading back GPIO Manual Mode Input Word values."); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioManualOutputPinLevelGet( adi_adrv904x_Device_t* const device, + uint32_t * const gpioOutPinLevel) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gpioOutPinLevel, cleanup); + + /* Readback bitfield */ + /* Using Direct SPI instead of AHB */ + recoveryAction = adrv904x_Core_GpioFromMaster_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + gpioOutPinLevel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while reading back GPIO Manual Mode Output Word values."); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioManualOutputPinLevelSet( adi_adrv904x_Device_t* const device, + const uint32_t gpioPinMask, + const uint32_t gpioOutPinLevel) +{ + static const uint32_t VALID_RANGE_MASK = 0x00FFFFFFU; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t channelMaskArray[ADI_ADRV904X_GPIO_COUNT] = { 0U }; + uint32_t currentLevel = 0U; + uint32_t toggleLevel = 0U; + uint32_t idx = 0U; + uint32_t tmpMask = 0U; + uint32_t allocatedMask = 0U; + adi_adrv904x_GpioSignal_e signalArray[ADI_ADRV904X_GPIO_COUNT] = + { + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Range check input */ + if ((gpioOutPinLevel & VALID_RANGE_MASK) != gpioOutPinLevel) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, gpioOutPinLevel, "Invalid GPIO Output pin levels. Out of range."); + goto cleanup; + } + + /* Range check pinmask */ + if ((gpioPinMask & VALID_RANGE_MASK) != gpioPinMask) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, gpioPinMask, "Invalid GPIO pinmask. Out of range."); + goto cleanup; + } + + /* Readback all GPIO allocations */ + recoveryAction = adi_adrv904x_GpioConfigAllGet(device, signalArray, channelMaskArray, ADI_ADRV904X_GPIO_COUNT); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while retreiving current GPIO configurations."); + goto cleanup; + } + + /* Build mask containing only/all pins allocated for this feature */ + for (idx = 0U; idx < ADI_ADRV904X_GPIO_COUNT; idx++) + { + tmpMask = 1U << idx; + if (signalArray[idx] == manualModeOutputSignal[idx]) + { + allocatedMask |= tmpMask; + } + else + { + tmpMask = ~tmpMask; + allocatedMask &= tmpMask; + } + } + + /* Check that gpioPinMask contains only pins that are allocated for this feature */ + if ((gpioPinMask & allocatedMask) != gpioPinMask) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, gpioPinMask, "Invalid GPIO pinmask. Includes pins that are not allocated as Manual Mode Outputs."); + goto cleanup; + } + + /* Readback current drive state of Digital GPIO pins */ + recoveryAction = adi_adrv904x_GpioManualOutputPinLevelGet(device, ¤tLevel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while retrieving current GPIO Manual Mode drive levels."); + goto cleanup; + } + + /* XOR with current levels with target levels to determine which pins need to toggle */ + toggleLevel = currentLevel ^ gpioOutPinLevel; + + /* Mask out pins that are not in the requested gpioPinMask. They should not be toggled. */ + toggleLevel &= gpioPinMask; + + /* Toggle appropriate pins to achieve target levels */ + recoveryAction = adrv904x_Core_GpioFromMasterToggle_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + toggleLevel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting GPIO output levels."); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioAnalogManualInputDirSet(adi_adrv904x_Device_t* const device, + const uint16_t gpioAnalogInputMask) +{ + static const uint32_t channelMask = 0U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_GpioSignal_e prevSignalArray[ADI_ADRV904X_GPIO_ANALOG_COUNT] = { ADI_ADRV904X_GPIO_SIGNAL_UNUSED }; + uint32_t channelMaskArray[ADI_ADRV904X_GPIO_ANALOG_COUNT] = { 0U }; + uint32_t idx = 0U; + uint32_t tmpMask = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Get current GPIO configs */ + recoveryAction = adi_adrv904x_GpioAnalogConfigAllGet( device, prevSignalArray, channelMaskArray, ADI_ADRV904X_GPIO_ANALOG_COUNT ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while retreiving current Analog GPIO configurations."); + goto cleanup; + } + + /* Check that all set-pins are unused or already allocated as Manual Inputs */ + for ( idx = 0U; idx < ADI_ADRV904X_GPIO_ANALOG_COUNT; idx++ ) + { + tmpMask = 1U << idx; + if (((gpioAnalogInputMask & tmpMask) != 0U) && + (prevSignalArray[idx] != ADI_ADRV904X_GPIO_SIGNAL_UNUSED) && + (prevSignalArray[idx] != analogManualModeInputSignal[idx])) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, recoveryAction, gpioAnalogInputMask, "Invalid Analog GPIO Input Mask. A selected pin is already in use by another feature."); + goto cleanup; + } + } + + /* Deallocate and disconnect any unset-pins that were previously allocated as Manual Inputs */ + for ( idx = 0U; idx < ADI_ADRV904X_GPIO_ANALOG_COUNT; idx++ ) + { + tmpMask = 1U << idx; + if (((gpioAnalogInputMask & tmpMask) == 0U) && + (prevSignalArray[idx] == analogManualModeInputSignal[idx])) + { + recoveryAction = adrv904x_GpioAnalogSignalRelease(device, (adi_adrv904x_GpioAnaPinSel_e)idx, prevSignalArray[idx], channelMaskArray[idx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while releasing an Analog GPIO from use as a Manual Input."); + goto cleanup; + } + } + } + + /* Configure all set-pins */ + for ( idx = 0U; idx < ADI_ADRV904X_GPIO_ANALOG_COUNT; idx++ ) + { + tmpMask = 1U << idx; + if ((gpioAnalogInputMask & tmpMask) != 0U) + { + recoveryAction = adrv904x_GpioAnalogSignalSet(device, (adi_adrv904x_GpioAnaPinSel_e)idx, analogManualModeInputSignal[idx], channelMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while configuring an Analog GPIO for use as a Manual Input."); + goto cleanup; + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioAnalogManualOutputDirSet( adi_adrv904x_Device_t* const device, + const uint16_t gpioAnalogOutputMask) +{ + static const uint32_t channelMask = 0U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_GpioSignal_e prevSignalArray[ADI_ADRV904X_GPIO_ANALOG_COUNT] = { ADI_ADRV904X_GPIO_SIGNAL_UNUSED }; + uint32_t channelMaskArray[ADI_ADRV904X_GPIO_ANALOG_COUNT] = { 0U }; + uint32_t idx = 0U; + uint32_t tmpMask = 0U; + uint32_t clearDrivePins = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Get current GPIO configs */ + recoveryAction = adi_adrv904x_GpioAnalogConfigAllGet( device, prevSignalArray, channelMaskArray, ADI_ADRV904X_GPIO_ANALOG_COUNT ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while retreiving current Analog GPIO configurations."); + goto cleanup; + } + + /* Check that all set-pins are unused or already allocated as Manual Inputs */ + for ( idx = 0U; idx < ADI_ADRV904X_GPIO_ANALOG_COUNT; idx++ ) + { + tmpMask = 1U << idx; + if (((gpioAnalogOutputMask & tmpMask) != 0U) && + (prevSignalArray[idx] != ADI_ADRV904X_GPIO_SIGNAL_UNUSED) && + (prevSignalArray[idx] != analogManualModeOutputSignal[idx])) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, recoveryAction, gpioAnalogOutputMask, "Invalid Analog GPIO Output Mask. A selected pin is already in use by another feature."); + goto cleanup; + } + } + + /* Deallocate and disconnect any unset-pins that were previously allocated as Analog Manual Outputs */ + for ( idx = 0U; idx < ADI_ADRV904X_GPIO_ANALOG_COUNT; idx++ ) + { + tmpMask = 1U << idx; + if (((gpioAnalogOutputMask & tmpMask) == 0U) && + (prevSignalArray[idx] == analogManualModeOutputSignal[idx])) + { + recoveryAction = adrv904x_GpioAnalogSignalRelease( device, (adi_adrv904x_GpioAnaPinSel_e)idx, prevSignalArray[idx], channelMaskArray[idx] ); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while releasing an Analog GPIO from use as a Manual Output."); + goto cleanup; + } + + clearDrivePins |= tmpMask; + } + } + + /* Clear the GpioFromMaster drive bits from any deallocated pins */ + recoveryAction = adrv904x_Core_GpioAnalogFromMasterClear_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + clearDrivePins); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while clearing drive levels for GPIOs previously allocated as Manual Mode Outputs."); + goto cleanup; + } + + /* Configure all set-pins */ + for ( idx = 0U; idx < ADI_ADRV904X_GPIO_ANALOG_COUNT; idx++ ) + { + tmpMask = 1U << idx; + if ((gpioAnalogOutputMask & tmpMask) != 0U) + { + recoveryAction = adrv904x_GpioAnalogSignalSet(device, (adi_adrv904x_GpioAnaPinSel_e)idx, analogManualModeOutputSignal[idx], channelMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while configuring an Analog GPIO for use as a Manual Output."); + goto cleanup; + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioAnalogManualInputPinLevelGet( adi_adrv904x_Device_t* const device, + uint16_t * const gpioAnalogInPinLevel) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gpioAnalogInPinLevel, cleanup); + + /* Readback bitfield */ + /* Using Direct SPI instead of AHB */ + recoveryAction = adrv904x_Core_GpioAnalogSpiRead_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + gpioAnalogInPinLevel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while reading back ANalog GPIO Manual Mode Input Word values."); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioAnalogManualOutputPinLevelGet(adi_adrv904x_Device_t* const device, + uint16_t * const gpioAnalogOutPinLevel) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gpioAnalogOutPinLevel, cleanup); + + /* Readback bitfield */ + /* Using Direct SPI instead of AHB */ + recoveryAction = adrv904x_Core_GpioAnalogFromMaster_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + gpioAnalogOutPinLevel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "Error while reading back Analog GPIO Manual Mode Output Word values."); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioAnalogManualOutputPinLevelSet(adi_adrv904x_Device_t* const device, + const uint16_t gpioAnalogPinMask, + const uint16_t gpioAnalogOutPinLevel) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t channelMaskArray[ADI_ADRV904X_GPIO_COUNT] = { 0U }; + uint16_t currentLevel = 0U; + uint32_t toggleLevel = 0U; + uint32_t idx = 0U; + uint16_t tmpMask = 0U; + uint32_t allocatedMask = 0U; + adi_adrv904x_GpioSignal_e signalArray[ADI_ADRV904X_GPIO_ANALOG_COUNT] = + { + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED, + ADI_ADRV904X_GPIO_SIGNAL_UNUSED + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Readback all Analog GPIO allocations */ + recoveryAction = adi_adrv904x_GpioAnalogConfigAllGet(device, signalArray, channelMaskArray, ADI_ADRV904X_GPIO_ANALOG_COUNT); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while retreiving current Analog GPIO configurations."); + goto cleanup; + } + + /* Build mask containing only/all pins allocated for this features */ + for (idx = 0U; idx < ADI_ADRV904X_GPIO_ANALOG_COUNT; idx++) + { + tmpMask = 1U << idx; + if (signalArray[idx] == analogManualModeOutputSignal[idx]) + { + allocatedMask |= tmpMask; + } + else + { + tmpMask = ~tmpMask; + allocatedMask &= tmpMask; + } + } + + /* Check that gpioAnalogPinMask contains only pins that are allocated for this feature */ + if ((gpioAnalogPinMask & allocatedMask) != gpioAnalogPinMask) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, gpioAnalogPinMask, "Invalid Analog GPIO pinmask. Includes pins that are not allocated as Analog Manual Mode Outputs."); + goto cleanup; + } + + /* Readback current drive state of Digital GPIO pins */ + recoveryAction = adi_adrv904x_GpioAnalogManualOutputPinLevelGet(device, ¤tLevel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while retrieving current Analog GPIO Manual Mode drive levels."); + goto cleanup; + } + + /* XOR with current levels with target levels to determine which pins need to toggle */ + toggleLevel = (uint32_t)(currentLevel ^ gpioAnalogOutPinLevel); + + /* Mask out pins that are not in the requested gpioAnalogPinMask. They should not be toggled. */ + toggleLevel &= gpioAnalogPinMask; + + /* Toggle appropriate pins to achieve target levels */ + recoveryAction = adrv904x_Core_GpioAnalogFromMasterToggle_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + toggleLevel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting Analog GPIO output levels."); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +/**************************************************************************** + * GP Int (General Purpose Interrupt) related functions + *************************************************************************** + */ + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpIntPinMaskCfgSet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpIntPinSelect_e pinSelect, + const adi_adrv904x_GpIntPinMaskCfg_t* const pinMaskCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Validate inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pinMaskCfg, cleanup); + + if ((pinSelect != ADI_ADRV904X_GPINT0) && + (pinSelect != ADI_ADRV904X_GPINT1) && + (pinSelect != ADI_ADRV904X_GPINTALL)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, pinSelect, "Invalid GP Interrupt pin(s) selected. Out of range."); + goto cleanup; + } + + /* Set GPINT0 Mask */ + if ((pinSelect == ADI_ADRV904X_GPINT0) || + (pinSelect == ADI_ADRV904X_GPINTALL)) + { + recoveryAction = adrv904x_Core_GpInterruptsMaskLowerWordPin0_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + pinMaskCfg->gpInt0Mask.lowerMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing GP Interrupt Mask Lower Word for GP Int0."); + goto cleanup; + } + + recoveryAction = adrv904x_Core_GpInterruptsMaskUpperWordPin0_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + pinMaskCfg->gpInt0Mask.upperMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing GP Interrupt Mask Upper Word for GP Int0."); + goto cleanup; + } + } + + /* Set GPINT1 Mask */ + if ((pinSelect == ADI_ADRV904X_GPINT1) || + (pinSelect == ADI_ADRV904X_GPINTALL)) + { + recoveryAction = adrv904x_Core_GpInterruptsMaskLowerWordPin1_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + pinMaskCfg->gpInt1Mask.lowerMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing GP Interrupt Mask Lower Word for GP Int1."); + goto cleanup; + } + + recoveryAction = adrv904x_Core_GpInterruptsMaskUpperWordPin1_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + pinMaskCfg->gpInt1Mask.upperMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing GP Interrupt Mask Upper Word for GP Int1."); + goto cleanup; + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpIntPinMaskCfgGet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpIntPinSelect_e pinSelect, + adi_adrv904x_GpIntPinMaskCfg_t* const pinMaskCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Validate inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pinMaskCfg, cleanup); + + if ((pinSelect != ADI_ADRV904X_GPINT0) && + (pinSelect != ADI_ADRV904X_GPINT1) && + (pinSelect != ADI_ADRV904X_GPINTALL)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, pinSelect, "Invalid GP Interrupt pin(s) selected. Out of range."); + goto cleanup; + } + + /* Get GPINT0 Mask */ + if ((pinSelect == ADI_ADRV904X_GPINT0) || + (pinSelect == ADI_ADRV904X_GPINTALL)) + { + recoveryAction = adrv904x_Core_GpInterruptsMaskLowerWordPin0_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &pinMaskCfg->gpInt0Mask.lowerMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading GP Interrupt Mask Lower Word for GP Int0."); + goto cleanup; + } + + recoveryAction = adrv904x_Core_GpInterruptsMaskUpperWordPin0_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &pinMaskCfg->gpInt0Mask.upperMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading GP Interrupt Mask Upper Word for GP Int0."); + goto cleanup; + } + } + + /* Get GPINT1 Mask */ + if ((pinSelect == ADI_ADRV904X_GPINT1) || + (pinSelect == ADI_ADRV904X_GPINTALL)) + { + recoveryAction = adrv904x_Core_GpInterruptsMaskLowerWordPin1_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &pinMaskCfg->gpInt1Mask.lowerMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading GP Interrupt Mask Lower Word for GP Int1."); + goto cleanup; + } + + recoveryAction = adrv904x_Core_GpInterruptsMaskUpperWordPin1_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &pinMaskCfg->gpInt1Mask.upperMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading GP Interrupt Mask Upper Word for GP Int1."); + goto cleanup; + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpIntStatusGet( adi_adrv904x_Device_t* const device, + adi_adrv904x_GpIntMask_t* const gpIntStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Validate inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gpIntStatus, cleanup); + + /* Get GP interrupt status bits */ + recoveryAction = adrv904x_Core_GpInterruptsStatusLowerWord_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &gpIntStatus->lowerMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading GP Interrupt Status Lower Word."); + goto cleanup; + } + + recoveryAction = adrv904x_Core_GpInterruptsStatusUpperWord_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &gpIntStatus->upperMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading GP Interrupt Status Upper Word."); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpIntStatusClear( adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpIntMask_t* const gpIntClear) +{ + static const uint64_t GP_INT_48BIT_ALL = 0x0000FFFFFFFFFFFFULL; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint64_t tmpLower = 0ULL; + uint64_t tmpUpper = 0ULL; + + /* Validate inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* If gpIntClear is NULL ptr, simply clear all GP Int source status bits */ + tmpLower = (gpIntClear == NULL) ? GP_INT_48BIT_ALL : gpIntClear->lowerMask; + tmpUpper = (gpIntClear == NULL) ? GP_INT_48BIT_ALL : gpIntClear->upperMask; + + /* Clear selected GP Interrupt status bits*/ + recoveryAction = adrv904x_Core_GpInterruptsStatusLowerWord_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + tmpLower); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error clearing selected GP Interrupt Status Lower Word bits."); + goto cleanup; + } + + recoveryAction = adrv904x_Core_GpInterruptsStatusUpperWord_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + tmpUpper); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error clearing selected GP Interrupt Status Upper Word bits."); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpIntStickyBitMaskSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpIntMask_t* const gpIntStickyBitMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Validate inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gpIntStickyBitMask, cleanup); + + /* Setup proper GP Interrupt Type defaults (Level vs Edge Triggered) */ + recoveryAction = adrv904x_GpIntTypeSet(device, gpIntStickyBitMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing default GP Interrupt Types."); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpIntStickyBitMaskGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_GpIntMask_t* const gpIntStickyBitMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Validate inputs */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gpIntStickyBitMask, cleanup); + + /* Setup proper GP Interrupt Type defaults (Level vs Edge Triggered) */ + recoveryAction = adrv904x_GpIntTypeGet(device, gpIntStickyBitMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing default GP Interrupt Types."); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioHysteresisSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioDigitalPin_e pinName, + const uint32_t enable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t bfValue = 0U; + + const uint8_t PAD_DS_GROUP = (uint8_t) ((pinName & 0xF0U) >> 4U); + const uint8_t PAD_DS_PIN_INDEX = (uint8_t) (pinName & 0x0FU); + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + if (PAD_DS_GROUP > ADRV904X_DIGITAL_PIN_GROUP_NUM) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + PAD_DS_GROUP, + "Invalid Pin ID"); + goto cleanup; + } + + if (PAD_DS_PIN_INDEX > ADRV904X_DIGITAL_PIN_PER_GROUP_NUM) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + PAD_DS_PIN_INDEX, + "Invalid Pin ID"); + goto cleanup; + } + + if (enable > ADI_ENABLE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + enable, + "GPIO Hysterisis Enable Flag can only be 0 or 1"); + goto cleanup; + } + + /* Read Modify Write */ + + recoveryAction = adrv904x_Core_PadSt_BfGet( device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + PAD_DS_GROUP, + &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + + if (enable == ADI_ENABLE) + { + bfValue = (bfValue | (1U << PAD_DS_PIN_INDEX)); + } + else + { + bfValue = (bfValue & (0U << PAD_DS_PIN_INDEX)); + } + + recoveryAction = adrv904x_Core_PadSt_BfSet( device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + PAD_DS_GROUP, + bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioHysteresisGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioDigitalPin_e pinName, + uint32_t* const enable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t bfValue = 0U; + + const uint8_t PAD_DS_GROUP = (uint8_t) ((pinName & 0xF0U) >> 4U); + const uint8_t PAD_DS_PIN_INDEX = (uint8_t) (pinName & 0x0FU); + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, enable, cleanup); + + *enable = 0U; + + if (PAD_DS_GROUP > ADRV904X_DIGITAL_PIN_GROUP_NUM) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + PAD_DS_GROUP, + "Invalid Pin ID"); + goto cleanup; + } + + if (PAD_DS_PIN_INDEX > ADRV904X_DIGITAL_PIN_PER_GROUP_NUM) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + PAD_DS_PIN_INDEX, + "Invalid Pin ID"); + goto cleanup; + } + + recoveryAction = adrv904x_Core_PadSt_BfGet( device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + PAD_DS_GROUP, + &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + + *enable = ((bfValue & (1U << PAD_DS_PIN_INDEX)) != 0U) ? ADI_ENABLE : ADI_DISABLE; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioDriveStrengthSet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioDigitalPin_e pinName, + const adi_adrv904x_CmosPadDrvStr_e driveStrength) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t dsRead[] = { 0U, 0U, 0U, 0U }; + uint8_t dsWrite[] = { 0U, 0U, 0U, 0U }; + uint8_t i = 0U; + + const uint8_t PAD_DS_GROUP = (uint8_t) ((pinName & 0xF0U) >> 4U); + const uint8_t PAD_DS_PIN_INDEX = (uint8_t) (pinName & 0x0FU); + + static const uint8_t DS_ENUM_CONVERT[] = { 0U, 3U, 1U, 2U }; + + const uint8_t IDX = DS_ENUM_CONVERT[driveStrength]; + + static const uint8_t DS_VALUE[] = { 0x0U, 0x3U, 0x9U, 0xFU }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + if (PAD_DS_GROUP > ADRV904X_DIGITAL_PIN_GROUP_NUM) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + PAD_DS_GROUP, + "Invalid Pin ID"); + goto cleanup; + } + + if (PAD_DS_PIN_INDEX > ADRV904X_DIGITAL_PIN_PER_GROUP_NUM) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + PAD_DS_PIN_INDEX, + "Invalid Pin ID"); + goto cleanup; + } + + if (driveStrength > ADI_ADRV904X_CMOSPAD_DRV_STRENGTH_2) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + driveStrength, + "Invalid GPIO Drive Strength Setting"); + goto cleanup; + } + + /* Read Modify Write */ + + /* 1) Read */ + recoveryAction = adrv904x_Core_PadDs0_BfGet( device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + PAD_DS_GROUP, + &dsRead[0]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + + recoveryAction = adrv904x_Core_PadDs1_BfGet( device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + PAD_DS_GROUP, + &dsRead[1]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + + recoveryAction = adrv904x_Core_PadDs2_BfGet( device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + PAD_DS_GROUP, + &dsRead[2]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + + recoveryAction = adrv904x_Core_PadDs3_BfGet( device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + PAD_DS_GROUP, + &dsRead[3]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + + /* 2) Modify */ + + for (i = 0U; i < sizeof(dsWrite); ++i) + { + /* Checking DS Bit of the DS Value to be Used */ + if ((DS_VALUE[IDX] & (1U << i)) != 0U) + { + dsWrite[i] = (uint8_t)(dsRead[i] | (1U << PAD_DS_PIN_INDEX)); + } + else + { + dsWrite[i] = (uint8_t)(dsRead[i] & (0U << PAD_DS_PIN_INDEX)); + } + } + + /* 3) Write */ + + if (dsWrite[0] != dsRead[0]) + { + recoveryAction = adrv904x_Core_PadDs0_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + PAD_DS_GROUP, + dsWrite[0]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + } + + if (dsWrite[1] != dsRead[1]) + { + recoveryAction = adrv904x_Core_PadDs1_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + PAD_DS_GROUP, + dsWrite[1]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + } + + if (dsWrite[2] != dsRead[2]) + { + recoveryAction = adrv904x_Core_PadDs2_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + PAD_DS_GROUP, + dsWrite[2]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + } + + if (dsWrite[3] != dsRead[3]) + { + recoveryAction = adrv904x_Core_PadDs3_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + PAD_DS_GROUP, + dsWrite[3]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_GpioDriveStrengthGet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_GpioDigitalPin_e pinName, + adi_adrv904x_CmosPadDrvStr_e* const driveStrength) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t dsRead[] = { 0U, 0U, 0U, 0U }; + uint8_t i = 0U; + + uint8_t dsValue = 0U; + + const uint8_t PAD_DS_GROUP = (uint8_t) ((pinName & 0xF0U) >> 4U); + const uint8_t PAD_DS_PIN_INDEX = (uint8_t) (pinName & 0x0FU); + + static const adi_adrv904x_CmosPadDrvStr_e ENUM_DS_CONVERT[] = { ADI_ADRV904X_CMOSPAD_DRV_WEAK, ADI_ADRV904X_CMOSPAD_DRV_STRENGTH_1, ADI_ADRV904X_CMOSPAD_DRV_STRENGTH_2, ADI_ADRV904X_CMOSPAD_DRV_STRONG }; + + static const uint8_t DS_VALUE_IDX[] = { 0x0U, 0x3U, 0x9U, 0xFU }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, driveStrength, cleanup); + + *driveStrength = (adi_adrv904x_CmosPadDrvStr_e) (0xFFU); + + if (PAD_DS_GROUP > ADRV904X_DIGITAL_PIN_GROUP_NUM) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + PAD_DS_GROUP, + "Invalid Pin ID"); + goto cleanup; + } + + if (PAD_DS_PIN_INDEX > ADRV904X_DIGITAL_PIN_PER_GROUP_NUM) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + PAD_DS_PIN_INDEX, + "Invalid Pin ID"); + goto cleanup; + } + + recoveryAction = adrv904x_Core_PadDs0_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + PAD_DS_GROUP, + &dsRead[0]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + + recoveryAction = adrv904x_Core_PadDs1_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + PAD_DS_GROUP, + &dsRead[1]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + + recoveryAction = adrv904x_Core_PadDs2_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + PAD_DS_GROUP, + &dsRead[2]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + + recoveryAction = adrv904x_Core_PadDs3_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + PAD_DS_GROUP, + &dsRead[3]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + + for (i = 0U; i < sizeof(dsRead); ++i) + { + if ((dsRead[i] & (1U << PAD_DS_PIN_INDEX)) != 0U) + { + dsValue |= (uint8_t) (1U << i); + } + } + + for (i = 0U; i < sizeof(DS_VALUE_IDX); ++i) + { + if (DS_VALUE_IDX[i] == dsValue) + { + *driveStrength = ENUM_DS_CONVERT[i]; + } + } + + if (*driveStrength == (adi_adrv904x_CmosPadDrvStr_e)(0xFFU)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + dsValue, + "Invalid Drive Strength Value"); + + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + *driveStrength, + "Invalid Drive Strength Value"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} \ No newline at end of file diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_hal.c b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_hal.c new file mode 100644 index 00000000000..004bf0544d3 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_hal.c @@ -0,0 +1,2658 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_hal.c +* \brief Contains ADI Transceiver Hardware Abstraction functions +* Analog Devices maintains and provides updates to this code layer. +* The end user should not modify this file or any code in this directory. +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#include "adi_adrv904x_hal.h" +#include "adi_adrv904x_tx_types.h" +#include "adi_adrv904x_error.h" + +#include "../../private/include/adrv904x_reg_addr_macros.h" +#include "../../private/include/adrv904x_platform_byte_order.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PUBLIC_HAL + +/* + * Private Helpers + * + **/ + +/* Used to re-write single byte AHB register read/writes to equivalent + * but faster SPI register read/writes. */ +static const uint32_t SPI_ONLY_REGS_ADDR = 0x47000000U; +static const uint32_t DIRECT_SPI_REGION_LEN = 0x4000U; + +/** +* \brief Helper function to check the address passed into the Registers32bOnlyRead and Registers32bOnlyWrite functions +* +* \dep_begin +* \dep{device->halInfo} +* \dep_end +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure. +* \param[in] addr The 32bit address that is checked to see if it lies in a region of the register map that requires +* a 32-bit spi transaction to be performed. +* \param[in] count The number of bytes to read or write. Count should be greater than 0 and a multiple of 4. Furthermore, +* for semaphore registers the count needs to be exactly 4. +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +* +*/ +static adi_adrv904x_ErrAction_e adrv904x_ThirtyTwoBitAhbAccessRangeCheck(adi_adrv904x_Device_t* const device, + const uint32_t addr, + const uint32_t count); + +/** +* \brief Encodes a write to a 'Direct SPI' device register. Appends encoded data to a caller +* supplied buffer and may flush that buffer using SpiFlush(). +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure. +* \param[out] wrData caller supplied buffer to hold the encoded data byte array. Must be large enough to +* hold the required data. +* \param[out] numWrBytes is set to the number of valid bytes in wrData after the call. The caller +* must monitor this value and manually call SpiFlush if a call to this function would overrun the +* buffer. If the buffer is flushed during the call numWrBytes will be set to 0 (unless the call appends +* further bytes after the flush). +* \param[in] addr the device register to write to. Must be 'Direct SPI' register i.e. less that DIRECT_SPI_REGION_LEN. +* \param[in] mask Only the register bits where the corresponding bit in mask are set to 1 will be written to. +* The other register bits at addr will be left unchanged. +* \param[in] data the data to write. +* \param[in] writeFlag +* +* If the device is in streaming or FIFO mode it's possible that only the data byte needs to be appended to wrData. +* numWrBytes will only increment by one in this case. +* +* If mask is anything except 0xFF, hardware masking will be utilized automatically. This requires additional SPI +* writes to the masking register. These additional register writes are added through recursive calls to DirectSpiDataPack. +* It will also result in existing wrData contents being flushed. +*/ +static adi_adrv904x_ErrAction_e adrv904x_DirectSpiDataPack(adi_adrv904x_Device_t* const device, + uint8_t* const wrData, + uint32_t* const numWrBytes, + const uint16_t addr, + const uint8_t mask, + const uint8_t data, + const uint8_t writeFlag) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t initialDataByte = (*numWrBytes == 0) ? 1U : 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, wrData); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numWrBytes); + + if (mask == 0xFFU) + { + /* mask = 0xFF => No write to device masking register required */ + + /* Three conditions need to be met to add only the data & not the addr to the byte array: + * - device is in streaming mode, AND + * - This is not the first data byte going across SPI, AND + * - The current address is the next sequentially from the previous address + * ---or--- + * - device is in SPI FIFO mode, AND + * - This is not the first data byte going across SPI, AND + * - the address is equal to the previous address + * */ + if (((device->devStateInfo.spiStreamingOn == 1U) && + (initialDataByte != 1U) && + (addr == device->devStateInfo.previousSpiStreamingAddress + 1U)) || + ((device->devStateInfo.spiFifoModeOn == 1U) && + (initialDataByte != 1U) && + (addr == device->devStateInfo.previousSpiStreamingAddress))) + { + /* No need to write address. Just data required. */ + wrData[(*numWrBytes)++] = (uint8_t)data; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + else + { + /* Need to write an address to wrData */ + if ((device->devStateInfo.spiStreamingOn == 1U) && (initialDataByte != 1U)) + { + /* Streaming mode and buffer has an existing write it it. Flush out and start new write */ + if (writeFlag == ADRV904X_SPI_WRITE_POLARITY) + { + recoveryAction = adi_adrv904x_SpiFlush( device, wrData, numWrBytes); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flushing Issue"); + return recoveryAction; + } + } + else + { + /* Because we have to flush and don't have a way to send the read data back to the user */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + writeFlag, + "Non consecutive reads cannot be packed together in streaming mode"); + return recoveryAction; + } + } + + /* Address Format: + * + * | Byte 0 | Byte 1 | + * | Bit 7 6 5 - 0 | 7 - 0 | + * +--------------------------+-----------------+------------+------------+ + * | read/write | Addr[14] | Addr[13:8] | Addr[7:0] | + * | SPI_WRITE_POLARITY read | 0 direct region | | | + * |!SPI_WRITE_POLARITY write | 1 paged region | | | + * +--------------------------+-----------------+------------+------------+ + */ + + wrData[(*numWrBytes)++] = (uint8_t)(((writeFlag & 0x01U) << 7U) | ((addr >> 8U) & 0x7FU)); + wrData[(*numWrBytes)++] = (uint8_t)(addr); + /* coverity will trigger an error which is OK in this case. */ + wrData[(*numWrBytes)++] = (uint8_t)data; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + } + else + { + /* mask != 0xFF requires a mask value to be written to device masking register */ + + if (device->devStateInfo.spiStreamingOn == 0U) + { + recoveryAction = adrv904x_DirectSpiDataPack(device, + wrData, + numWrBytes, + ADRV904X_ADDR_SPI0_MASK_7TO0, + 0xFFU, + mask, + writeFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + recoveryAction = adrv904x_DirectSpiDataPack(device, + wrData, + numWrBytes, + addr, + 0xFFU, + data, + writeFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + } + else + { + /* Masked write in streaming mode. */ + + /* Flush current wrData. */ + recoveryAction = adi_adrv904x_SpiFlush( device, wrData, numWrBytes); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flushing Issue"); + return recoveryAction; + } + + /* Flush out a write to the h/w mask register */ + recoveryAction = adrv904x_DirectSpiDataPack( device, wrData, numWrBytes, ADRV904X_ADDR_SPI0_MASK_7TO0, 0xFF, mask, writeFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_SpiFlush( device, wrData, numWrBytes); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flushing Issue"); + return recoveryAction; + } + + /* Flush out a write to the destination register */ + recoveryAction = adrv904x_DirectSpiDataPack( device, wrData, numWrBytes, addr, 0xFFU, data, writeFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_SpiFlush( device, wrData, numWrBytes); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flushing Issue"); + return recoveryAction; + } + } + } + + device->devStateInfo.previousSpiStreamingAddress = addr; + + return recoveryAction; +} + +/** +* \brief Encodes a write to a AHB device register. Appends encoded data to a caller +* supplied buffer and may flush that buffer using SpiFlush(). +* +* Writes to AHB registers are effected by writes to special paging registers to select the correct page (only +* if not alredy selected) and then Direct SPI write to the currently selected page. Therefore this function does +* not write directly to wrData itself but delegates adrv904x_DirectSpiDataPack to do so. +* +* \param[in,out] device Context variable - Pointer to the ADRV904X device data structure. +* \param[out] wrData caller supplied buffer to hold the encoded data byte array. Must be large enough to +* hold the required data. +* \param[out] numWrBytes is set to the number of valid of bytes in wrData after the call. The caller +* must monitor this value and manually call SpiFlush if a call to this function would overrun the +* buffer. If buffer flushed during the call numWrBytes will be set to 0 (unless the call appends +* further bytes after the flush). +* \param[in] addr the device register to write to. Must be 'Direct SPI' register i.e. less that DIRECT_SPI_REGION_LEN. +* \param[in] mask Only the register bits where the corresponding bit in mask are set to 1 will be written to. +* The other register bits at addr will be left unchanged. +* \param[in] data the data to write. +* \param[in] writeFlag The value to be bitwise OR'd into the MSB of the 16-bit address. +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +static adi_adrv904x_ErrAction_e adrv904x_PagingSpiDataPack(adi_adrv904x_Device_t* const device, + uint8_t* const wrData, + uint32_t* const numWrBytes, + uint32_t addr, + uint32_t mask, + uint32_t data, + const uint8_t writeFlag) +{ + static const uint16_t SPI_MASK = 0x3FFFU; + uint16_t SPI_PAGING = (uint16_t) DIRECT_SPI_REGION_LEN; + uint32_t dataOffset = 0U; /* Offset from pageAddr to the highest byte address within pageMask that contains set bits */ + + /* SPI Paging variables: */ + uint32_t byteShiftVal = 0; /* The offset from pageAddr to dest addres */ + uint32_t pageAddr = 0; /* The 32bit-aligned address before dest address */ + uint64_t pageMask = 0; /* Equivalent to mask param but to be applied to pageAddr */ + uint64_t pageData = 0; /* Equivalent to data param but to be applied to pageAddr */ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, wrData); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, numWrBytes); + + /* Calculate paging variables. + * + * For example when addr is one up from a 32b aligned address: + * + * <----------------------------- pageMask (64b) ------------------------------------------> + * Vars <----------------------------- pageData (64b) ------------------------------------------> + * <-------------------- mask (32b) ------------------> + * <-------------------- data (32b) ------------------> + * Device Reg. + * Addr b...00 b...01 b...10 b...11 b...00 b...01 b...10 b...11 + * | 32b | 32b | + * | aligned | aligned | + * +----------+------------+------------+------------+------------+------------+------------+------------+ + * Vars | pageAddr | addr | | | | | | | + * |----------+------------+------------+------------|------------+------------+------------+------------+ + * + **/ + + byteShiftVal = addr - (addr & ~0x3U); + pageAddr = (addr & ~0x3U); + pageMask = ((uint64_t)mask) << (8U * byteShiftVal) ; + pageData = ((uint64_t)(data)) << (8U * byteShiftVal); + + if ((pageMask & 0x00FF000000000000ULL) > 0U) + { + dataOffset = 6U; + } + else if ((pageMask & 0x0000FF0000000000ULL) > 0U) + { + dataOffset = 5U; + } + else if ((pageMask & 0x000000FF00000000ULL) > 0U) + { + dataOffset = 4U; + } + else if ((pageMask & 0xFF000000ULL) > 0U) + { + dataOffset = 3U; + } + else if ((pageMask & 0x00FF0000ULL) > 0U) + { + dataOffset = 2U; + } + else if ((pageMask & 0x0000FF00ULL) > 0U) + { + dataOffset = 1U; + } + else if ((pageMask & 0x000000FFULL) > 0U) + { + dataOffset = 0U; + } + else + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing invalid mask"); + return recoveryAction; + } + + /* SPI InDirect address. Write paging registers */ + /* Update page addr is less than current page starting address OR greater than page size (4k) from starting address */ + if ((pageAddr < device->devStateInfo.currentPageStartingAddress) || ((pageAddr + dataOffset) > (device->devStateInfo.currentPageStartingAddress + SPI_MASK))) + { + /* The write affects bits outside of the page currently selected by the device page registers. Update them. */ + recoveryAction = adrv904x_DirectSpiDataPack(device, wrData, numWrBytes, ADRV904X_ADDR_SPI0_PAGE_31TO24, 0xFFU, (uint8_t)(pageAddr >> 24U), writeFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + recoveryAction = adrv904x_DirectSpiDataPack(device, wrData, numWrBytes, ADRV904X_ADDR_SPI0_PAGE_23TO16, 0xFFU, (uint8_t)(pageAddr >> 16U), writeFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + recoveryAction = adrv904x_DirectSpiDataPack(device, wrData, numWrBytes, ADRV904X_ADDR_SPI0_PAGE_15TO8, 0xFFU, (uint8_t)(pageAddr >> 8U), writeFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + recoveryAction = adrv904x_DirectSpiDataPack(device, wrData, numWrBytes, ADRV904X_ADDR_SPI0_PAGE_7TO0, 0xFFU, (uint8_t)(pageAddr >> 0U), writeFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + recoveryAction = adrv904x_DirectSpiDataPack(device, wrData, numWrBytes, ADRV904X_ADDR_SPI0_PAGING_CONTROL, 0xFFU, (uint8_t)(0U), writeFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + + device->devStateInfo.currentPageStartingAddress = pageAddr; + } + + /* Update addr from AHB address space to offset into currently selected page */ + addr = pageAddr - device->devStateInfo.currentPageStartingAddress; + + /* Depending on the mask bits set and the offset of addr from next lower 32bit aligned + * addr at most most four of a possible seven writes releative to the 32bit alinged addr + * will be generated. */ + if ((pageMask & 0x000000FFULL) > 0U) + { + recoveryAction = adrv904x_DirectSpiDataPack(device, wrData, numWrBytes, (uint16_t)(SPI_PAGING | ((addr & SPI_MASK) + 0U)), (uint8_t)(pageMask >> 0U), (uint8_t)(pageData >> 0U), writeFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + } + if ((pageMask & 0x0000FF00ULL) > 0U) + { + recoveryAction = adrv904x_DirectSpiDataPack(device, wrData, numWrBytes, (uint16_t)(SPI_PAGING | ((addr & SPI_MASK) + 1U)), (uint8_t)(pageMask >> 8U), (uint8_t)(pageData >> 8U), writeFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + } + if ((pageMask & 0x00FF0000ULL) > 0U) + { + recoveryAction = adrv904x_DirectSpiDataPack(device, wrData, numWrBytes, (uint16_t)(SPI_PAGING | ((addr & SPI_MASK) + 2U)), (uint8_t)(pageMask >> 16U), (uint8_t)(pageData >> 16U), writeFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + } + if ((pageMask & 0xFF000000ULL) > 0U) + { + recoveryAction = adrv904x_DirectSpiDataPack(device, wrData, numWrBytes, (uint16_t)(SPI_PAGING | ((addr & SPI_MASK) + 3)), (uint8_t)(pageMask >> 24), (uint8_t)(pageData >> 24), writeFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + } + if ((pageMask & 0x000000FF00000000ULL) > 0U) + { + recoveryAction = adrv904x_DirectSpiDataPack(device, wrData, numWrBytes, (uint16_t)(SPI_PAGING | ((addr & SPI_MASK) + 4)), (uint8_t)(pageMask >> 32), (uint8_t)(pageData >> 32), writeFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + } + if ((pageMask & 0x0000FF0000000000ULL) > 0ULL) + { + recoveryAction = adrv904x_DirectSpiDataPack(device, wrData, numWrBytes, (uint16_t)(SPI_PAGING | ((addr & SPI_MASK) + 5)), (uint8_t)(pageMask >> 40), (uint8_t)(pageData >> 40), writeFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + } + if ((pageMask & 0x00FF000000000000ULL) > 0ULL) + { + recoveryAction = adrv904x_DirectSpiDataPack(device, wrData, numWrBytes, (uint16_t)(SPI_PAGING | ((addr & SPI_MASK) + 6)), (uint8_t)(pageMask >> 48), (uint8_t)(pageData >> 48), writeFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + } + + return recoveryAction; +} + + +/** +* \brief Writes out the data array of size count and returns parsed return data. Must be packed according ADIHAL layer specs. +* +* \dep_begin +* \dep{device->halInfo} +* \dep_end +* +* \param device Pointer to the ADRV904X device data structure. +* \param txData byte array containing the data to write to SPI. Must be packed correctly. +* \param byteCount pointer to the number of bytes in data parameter. +* \param rxData empty array that will hold the raw SPI data. Must be at least as large as txData array +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +* +*/ +static adi_adrv904x_ErrAction_e adrv904x_SpiFlushWithRead(adi_adrv904x_Device_t* const device, + const uint8_t txData[], + const uint16_t byteCount, + uint8_t rxData[]) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_hal_Err_e halError = ADI_HAL_ERR_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, txData); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxData); + + halError = adi_hal_SpiRead(device->common.devHalInfo, &txData[0U], rxData, byteCount); + if (ADI_HAL_ERR_OK == halError) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + else + { + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_ErrCodeConvert(halError); + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_DEVICEHAL, + ADI_ADRV904X_ERRCODE_HAL_SPI_READ, + recoveryAction, + halError, + "SPI Read Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +/** +* \brief Extracts the register data from the raw data received on a SPI transaction to a byte array. +* +* \dep_begin +* \dep{device->halInfo} +* \dep_end +* +* \param device Pointer to the ADRV904X device data structure. +* \param rxData array of raw data bytes from a recent SPI read, e.g from calling adrv904x_SpiFlushWithRead +* \param rxDataCount the number of bytes included in rxData +* \param parsedData blank array that will hold the parsed data from rxData +* \param parsedDataCount The number of bytes to extract from rxData +* \param parsedDataStride Nth byte extracted is written to parsedData[parsedDataStride * n]. +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +* +*/ +static adi_adrv904x_ErrAction_e adrv904x_SpiDataParse(adi_adrv904x_Device_t* const device, + const uint8_t rxData[], + const uint16_t rxDataCount, + uint8_t parsedData[], + const uint32_t parsedDataCount, + const uint8_t parsedDataStride) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t i = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + if (device->devStateInfo.spiStreamingOn == 0U) + { + /* Two address bytes + 1 data byte for each parsedDataCount --> must also be a multiple of three */ + if (((rxDataCount % 3U) != 0U) || (parsedDataCount != (rxDataCount / 3U))) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + parsedDataCount, + "Number of bytes read does not match requested number of registers"); + return recoveryAction; + } + + for (i = 0U; i < parsedDataCount; ++i) + { + /* + * stride = 3 bytes (if not streaming stride = word size * 3) + * offset = 2 for initial 2-byte address + */ + parsedData[i * parsedDataStride] = rxData[(i * 3U) + 2U]; + } + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + else + { + /* byteCount should include the two extra bytes for starting address */ + if (parsedDataCount != ((uint32_t)rxDataCount - 2U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + parsedDataCount, + "Number of bytes read does not match requested number of registers"); + return recoveryAction; + } + + for (i = 0U; i < parsedDataCount; ++i) + { + /* + * stride = 1 byte (if streaming stride = word size) + * offset = 2 for initial 2-byte address + */ + parsedData[i * parsedDataStride] = rxData[i + 2U]; + } + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + + return recoveryAction; +} + +/* + * \brief Writes the AHB address to the AHB interface SPI registers and performs SpiFlush + **/ +static adi_adrv904x_ErrAction_e adrv904x_DmaAddrSet(adi_adrv904x_Device_t* const device, + const uint32_t address) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t localSpiCache[12U] = { 0U }; /* 12 bytes is max needed to set address when non-streaming mode */ + uint32_t localCacheCount = 0U; + uint8_t spiReg = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + recoveryAction = adrv904x_DirectSpiDataPack(device, &localSpiCache[0U], &localCacheCount, ADRV904X_ADDR_SPIDMA0_ADDR3, 0xFFU, (uint8_t)(address >> 24U), ADRV904X_SPI_WRITE_POLARITY); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_SPI, + "DMA Address Write (Address: 0x%08" PRIX32" Data: 0x%08" PRIX32" Mask: 0x%08" PRIX32")", + ADRV904X_ADDR_SPIDMA0_ADDR3, + (uint8_t)(address >> 24U), + 0xFFU); + + recoveryAction = adrv904x_DirectSpiDataPack(device, &localSpiCache[0U], &localCacheCount, ADRV904X_ADDR_SPIDMA0_ADDR2, 0xFFU, (uint8_t)(address >> 16U), ADRV904X_SPI_WRITE_POLARITY); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_SPI, + "DMA Address Write (Address: 0x%08" PRIX32" Data: 0x%08" PRIX32" Mask: 0x%08" PRIX32")", + ADRV904X_ADDR_SPIDMA0_ADDR2, + (uint8_t) (address >> 16U), + 0xFFU); + + recoveryAction = adrv904x_DirectSpiDataPack(device, &localSpiCache[0U], &localCacheCount, ADRV904X_ADDR_SPIDMA0_ADDR1, 0xFFU, (uint8_t)(address >> 8U), ADRV904X_SPI_WRITE_POLARITY); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_SPI, + "DMA Address Write (Address: 0x%08" PRIX32" Data: 0x%08" PRIX32" Mask: 0x%08" PRIX32")", + ADRV904X_ADDR_SPIDMA0_ADDR1, + (uint8_t) (address >> 8U), + 0xFFU); + + recoveryAction = adrv904x_DirectSpiDataPack(device, &localSpiCache[0U], &localCacheCount, ADRV904X_ADDR_SPIDMA0_ADDR0, 0xFFU, (uint8_t)address, ADRV904X_SPI_WRITE_POLARITY); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_SPI, + "DMA Address Write (Address: 0x%08" PRIX32" Data: 0x%08" PRIX32" Mask: 0x%08" PRIX32")", + ADRV904X_ADDR_SPIDMA0_ADDR0, + (uint8_t) address, + 0xFFU); + + recoveryAction = adi_adrv904x_SpiFlush(device, localSpiCache, &localCacheCount); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flushing Issue"); + return recoveryAction; + } + + if ((device->devStateInfo.autoIncrModeOn == ADI_TRUE) && + (device->devStateInfo.spiStreamingOn == ADI_TRUE) && + (device->devStateInfo.spiOptions.allowAhbSpiFifoMode == ADI_TRUE)) + { + /* 0x1U = enable FIFO for byte mode (hard coded to byte mode) */ + spiReg = ADI_TRUE; + device->devStateInfo.spiFifoModeOn = ADI_TRUE; + + recoveryAction = adrv904x_DirectSpiDataPack(device, + &localSpiCache[0U], + &localCacheCount, + ADRV904X_ADDR_SPIFIFO_MODE, + 0xFFU, + spiReg, + ADRV904X_SPI_WRITE_POLARITY); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_SPI, + "DMA Address Write (Address: 0x%08" PRIX32" Data: 0x%08" PRIX32" Mask: 0x%08" PRIX32")", + ADRV904X_ADDR_SPIFIFO_MODE, + spiReg, + 0xFFU); + + recoveryAction = adi_adrv904x_SpiFlush(device, localSpiCache, &localCacheCount); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flushing Issue"); + return recoveryAction; + } + } + + return recoveryAction; +} + +/* + * \brief Writes the AHB configuration (from device structure) + * to the AHB interface SPI registers and performs SpiFlush. + * Sets the file-scoped global variables for SPI FIFO and Auto-Increment. + **/ +static adi_adrv904x_ErrAction_e adrv904x_IndirectReadSetup(adi_adrv904x_Device_t* const device, + uint8_t enAhbAutoIncrement) +{ + uint8_t localSpiCache[6U] = { 0U }; /* 6 bytes is max needed to configure AHB interface */ + uint32_t localCacheCount = 0U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + /* Bit shifts in Ctrl register */ + static const uint8_t SPIDMA0_AUTO_INCR = 1U; + static const uint8_t SPIDMA0_RD_WRB = 7U; + uint8_t spiReg = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Setup ctrl word for AHB read */ + spiReg |= (1U << SPIDMA0_RD_WRB); + /* Hard coded use of byte mode for Direct & Indirect access */ + /* spiReg |= (device->devStateInfo.ahbBusSize & 0x3U) << SPIDMA0_BUS_SIZE; */ + if (enAhbAutoIncrement == 1U) + { + spiReg |= (1U << SPIDMA0_AUTO_INCR); + device->devStateInfo.autoIncrModeOn = ADI_ENABLE; + } + else + { + device->devStateInfo.autoIncrModeOn = ADI_DISABLE; + } + + recoveryAction = adrv904x_DirectSpiDataPack(device, + &localSpiCache[0U], + &localCacheCount, + ADRV904X_ADDR_SPIDMA0_CTL, + 0xFFU, + spiReg, + ADRV904X_SPI_WRITE_POLARITY); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + + recoveryAction = adi_adrv904x_SpiFlush(device, localSpiCache, &localCacheCount); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flushing Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +/* + * \brief Clears the AHB configuration and performs SpiFlush. + * Clears the file-scoped global variables for SPI FIFO and Auto-Increment. + * + * NOTE: Public API's Clear Error Structure On Entry + * - Clean Up Functions Cannot Call Public API's + * - API could have already logged error information to Error Structure + */ +static adi_adrv904x_ErrAction_e adrv904x_IndirectReadTeardown(adi_adrv904x_Device_t* const device) +{ + uint8_t localSpiCache[6U] = { 0U }; /* 6 bytes is max needed to configure AHB interface */ + uint32_t localCacheCount = 0U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t spiReg = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + recoveryAction = adrv904x_DirectSpiDataPack(device, + &localSpiCache[0U], + &localCacheCount, + ADRV904X_ADDR_SPIDMA0_CTL, + 0xFFU, + spiReg, + ADRV904X_SPI_WRITE_POLARITY); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_SPI, + "Direct Write (Address: 0x%08" PRIX32" Data: 0x%08" PRIX32" Mask: 0x%08" PRIX32")", + ADRV904X_ADDR_SPIDMA0_CTL, + spiReg, + 0xFFU); + + device->devStateInfo.spiFifoModeOn = ADI_FALSE; + device->devStateInfo.autoIncrModeOn = ADI_FALSE; + + recoveryAction = adrv904x_DirectSpiDataPack(device, + &localSpiCache[0U], + &localCacheCount, + ADRV904X_ADDR_SPIFIFO_MODE, + 0xFFU, + spiReg, + ADRV904X_SPI_WRITE_POLARITY); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + return recoveryAction; + } + + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_SPI, + "Direct Write (Address: 0x%08" PRIX32" Data: 0x%08" PRIX32" Mask: 0x%08" PRIX32")", + ADRV904X_ADDR_SPIFIFO_MODE, + spiReg, + 0xFFU); + + recoveryAction = adi_adrv904x_SpiFlush(device, localSpiCache, &localCacheCount); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Tear down SPI Flushing Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +/** +* \brief Transmits txData on SPI, parses received data and extracts payload. +* +* Calls adrv904x_SpiFlushWithRead followed by adrv904x_SpiDataParse. +* +* \dep_begin +* \dep{device->halInfo} +* \dep_end +* +* \param device Pointer to the ADRV904X device data structure. +* \param txData bytes to transmit on SPI +* \param byteCount number of bytes in txData +* \param finalDataOut Register data parsed from SPI rx data is written here +* \param finalDataOutCount Number of bytes expected to be in rxData +* \param finalDataOutStride Nth byte extracted from rxData is written to parsedData[parsedDataStride * n]. +* +* \retval adi_adrv904x_ErrAction_e, ADI_ADRV904X_ERR_ACT_NONE if successful +*/ +static adi_adrv904x_ErrAction_e adrv904x_FlushParse(adi_adrv904x_Device_t* const device, + const uint8_t txData[], + const uint16_t byteCount, + uint8_t finalDataOut[], + const uint32_t finalDataOutCount, + const uint8_t finalDataOutStride) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t rxData[ADI_HAL_SPI_FIFO_SIZE] = { 0U }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + /* Final flush before exiting the function. */ + recoveryAction = adrv904x_SpiFlushWithRead(device, txData, byteCount, rxData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flush with Read Issue"); + return recoveryAction; + } + + recoveryAction = adrv904x_SpiDataParse(device, rxData, byteCount, finalDataOut, finalDataOutCount, finalDataOutStride); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Data Parsing Issue"); + return recoveryAction; + } + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adrv904x_Registers32bOnlyRead_vEndian(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const uint32_t addr, + uint8_t readData[], + const uint32_t numBytesToRead, + uint8_t isByteData) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t i = 0U; /* loop index */ + uint32_t readDataIndex = 0U; + uint8_t spiDmaCtl[1] = { 0x88U }; + uint8_t lclByte[1] = { 0U }; + const uint8_t AUTOINCMASK = 0x2U; + uint8_t devSpiOptionsAllowAutoIncr = 0U; + uint8_t initialAutoIncrHwState = 0U; + uint32_t i32 = 0U; + uint8_t* i32Bytes = (uint8_t*) &i32; /* Hold the big endian version of AHB DMA Read back data [32:0] */ + uint32_t localAddr = addr; /* In case auto-increment is disabled we'll use this to keep track of the current address to read from */ + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, readData); + + if (spiCache != NULL) + { + recoveryAction = adi_adrv904x_SpiFlush(device, spiCache->data, &spiCache->count); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flush Issue After CPU Mailbox Buffer Write"); + goto cleanup; + } + } + + /* Check that the range of addresses meets the criteria for 32bOnly read.*/ + recoveryAction = adrv904x_ThirtyTwoBitAhbAccessRangeCheck(device, addr, numBytesToRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Range check failed. Address does not require a 32-bit SPI transaction."); + goto cleanup; + } + + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, ADRV904X_ADDR_SPIDMA0_CTL, lclByte, NULL, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading from the spi dma control register."); + goto cleanup; + } + + /* Is the auto-incr bit set? */ + if ((lclByte[0] & AUTOINCMASK) == AUTOINCMASK) + { + initialAutoIncrHwState = 1U; + } + + /* read/wrb | sys_codeb | bus_waiting | bus_response | bus_size[1] | bus_size[0] | auto_incr | bus_sel */ + if (device->devStateInfo.spiOptions.allowAhbAutoIncrement) + { + spiDmaCtl[0] = lclByte[0] | (uint8_t) 0x8AU; /* Read, word-mode, auto-increment enabled */ + devSpiOptionsAllowAutoIncr = 1U; + } + else + { + spiDmaCtl[0] = lclByte[0] | (uint8_t) 0x88U; /* Read, word-mode, auto-increment disabled */ + } + + /* Write the DMA control register */ + recoveryAction = adi_adrv904x_RegistersByteWrite(device, NULL, ADRV904X_ADDR_SPIDMA0_CTL, spiDmaCtl, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing to the spi dma control register."); + goto cleanup; + } + + /* Write the bus address */ + recoveryAction = adrv904x_DmaAddrSet(device, localAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing to the spi dma address registers."); + goto cleanup; + } + + /* Foreach 4-bytes to read except the last one (in order to avoid side-effects of DMA's read-ahead). */ + for (i = 0U; i < numBytesToRead / 4U - 1U; ++i) + { + /* Read the data */ + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, ADRV904X_ADDR_SPIDMA0_DATA3, &i32Bytes[0], NULL, 4U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading from the spi dma data registers."); + goto cleanup; + } + + /* The 32b-only regions are read via the DMA registers which are BE. So i32Bytes is BE at this point. */ + if (isByteData != 0) + { + /* Data in i32 byte-oriented. Convert to device endianess so that byte order here in the host is the same as + * that on the device. */ + i32 = ADRV904X_NTOCL(i32); + } + else + { + /* Data in i32 BE 32bit integer. Convert to host endianess. */ + i32 = ADRV904X_NTOHL(i32); + } + + readData[readDataIndex] = i32Bytes[0]; + readData[readDataIndex + 1] = i32Bytes[1]; + readData[readDataIndex + 2] = i32Bytes[2]; + readData[readDataIndex + 3] = i32Bytes[3]; + + readDataIndex += 4U; + localAddr += 4U; + + if (devSpiOptionsAllowAutoIncr == ADI_FALSE) + { + /* Device's auto-increment feature is off; We must explicity write to the DMA dest addr register. */ + recoveryAction = adrv904x_DmaAddrSet(device, localAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing to the spi dma address registers."); + goto cleanup; + } + } + } + + /* Now do the last 4 bytes but without auto-increment enabled. + * Auto-incr will always read 4 bytes ahead of the last requested address which can have unintended effects + * such as access violations or triggering clear-on-read. */ + + if (devSpiOptionsAllowAutoIncr != 0U) + { + /* Auto-incr is set on in the device. Turn it off */ + spiDmaCtl[0U] = spiDmaCtl[0U] & (uint8_t)(~AUTOINCMASK); + recoveryAction = adi_adrv904x_RegistersByteWrite(device, NULL, ADRV904X_ADDR_SPIDMA0_CTL, spiDmaCtl, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing to the spi dma control register."); + goto cleanup; + } + } + + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, ADRV904X_ADDR_SPIDMA0_DATA3, &i32Bytes[0], NULL, 4U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error reading from the spi dma data registers."); + goto cleanup; + } + + /* The 32b-only regions are read via the DMA registers which are BE. So i32Bytes is BE at this point. */ + if (isByteData != 0) + { + /* Data in i32 byte-oriented. Convert to device endianess so that byte order here in the host is the same as + * that on the device. */ + i32 = ADRV904X_NTOCL(i32); + } + else + { + /* Data in i32 BE 32bit integer. Convert to host endianess. */ + i32 = ADRV904X_NTOHL(i32); + } + + readData[readDataIndex] = i32Bytes[0]; + readData[readDataIndex + 1] = i32Bytes[1]; + readData[readDataIndex + 2] = i32Bytes[2]; + readData[readDataIndex + 3] = i32Bytes[3]; + + if (initialAutoIncrHwState) + { + /* Auto-increment was on when we entered, turn it back on before we exit */ + spiDmaCtl[0] = spiDmaCtl[0U] | AUTOINCMASK; + recoveryAction = adi_adrv904x_RegistersByteWrite(device, NULL, ADRV904X_ADDR_SPIDMA0_CTL, spiDmaCtl, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing to the spi dma control register."); + goto cleanup; + } + } + +cleanup: + return recoveryAction; +} + + +/* + * Public Functions + * + **/ +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_SpiFlush(adi_adrv904x_Device_t* const device, + const uint8_t data[], + uint32_t* const count) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_hal_Err_e halError = ADI_HAL_ERR_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY_QUIET(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, count, cleanup); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, data, cleanup); + + if (*count == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + goto cleanup; + } + + halError = adi_hal_SpiWrite(device->common.devHalInfo, &data[0U], *count); + if (ADI_HAL_ERR_OK == halError) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + else + { + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_ErrCodeConvert(halError); + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_DEVICEHAL, + ADI_ADRV904X_ERRCODE_HAL_SPI_WRITE, + recoveryAction, + halError, + "SPI Write Issue"); + goto cleanup; + } + + *count = 0U; + +cleanup : + ADI_ADRV904X_API_EXIT_QUIET(&device->common, recoveryAction); +} + +/** + * Defines certain memory regions on the device that are: + * - big endian + * - must be accessed at a 32bit aligned address + * - must be accessed with 32bit wide reads, writes. + * + * Each array element defines a single memory region. Each region consists of N memory areas as per adi_adrv904x_RegisterMap_t. + */ +static const adi_adrv904x_RegisterMap_t adrv904x_ThirtyTwoBitRegisterMapArray[] = +{ + /* First mem area startAddr, first area endAddr, num mem areas, offset between area start addrs */ + { (uint32_t)ADRV904X_ORX_ANALOG_ADC_ADDR_BASE, (uint32_t)(ADRV904X_ORX_ANALOG_ADC_ADDR_BASE + ADRV904X_ORX_ANALOG_ADC_REG_LEN), (uint32_t)ADI_ADRV904X_MAX_ORX, (uint32_t)ADRV904X_AHB_ADDR_STRIDE }, + { (uint32_t)ADRV904X_ORX_RAM_ADDR_BASE, (uint32_t)(ADRV904X_ORX_RAM_ADDR_BASE + ADRV904X_ORX_RAM_REG_LEN), (uint32_t)ADI_ADRV904X_MAX_ORX, (uint32_t)ADRV904X_AHB_ADDR_STRIDE }, + { (uint32_t)ADRV904X_RX_GAIN_TABLE_ADDR_BASE, (uint32_t)(ADRV904X_RX_GAIN_TABLE_ADDR_BASE + ADRV904X_RX_GAIN_TABLE_REG_LEN), (uint32_t)ADI_ADRV904X_MAX_RX_ONLY, (uint32_t)ADRV904X_AHB_ADDR_STRIDE }, + { (uint32_t)ADRV904X_TX_DPD_RAM_ADDR_BASE, (uint32_t)(ADRV904X_TX_DPD_RAM_ADDR_BASE + ADRV904X_TX_DPD_RAM_REG_LEN), (uint32_t)ADI_ADRV904X_MAX_TXCHANNELS, (uint32_t)ADRV904X_AHB_ADDR_STRIDE }, + { (uint32_t)ADRV904X_TX_ATTEN_TABLE_ADDR_BASE, (uint32_t)(ADRV904X_TX_ATTEN_TABLE_ADDR_BASE + ADRV904X_TX_ATTEN_TABLE_REG_LEN), (uint32_t)ADI_ADRV904X_MAX_TXCHANNELS, (uint32_t)ADRV904X_AHB_ADDR_STRIDE }, + { (uint32_t)ADRV904X_UART_ADDR_BASE, (uint32_t)(ADRV904X_UART_ADDR_BASE + ADRV904X_UART_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_SPI_MASTER_ADDR_BASE, (uint32_t)(ADRV904X_SPI_MASTER_ADDR_BASE + ADRV904X_SPI_MASTER_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_INTR_TSMTR_ADDR_BASE, (uint32_t)(ADRV904X_INTR_TSMTR_ADDR_BASE + ADRV904X_INTR_TSMTR_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_TELEMETRY_ADDR_BASE, (uint32_t)(ADRV904X_TELEMETRY_ADDR_BASE + ADRV904X_TELEMETRY_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_SEMAPHORE_ADDR_BASE, (uint32_t)(ADRV904X_SEMAPHORE_ADDR_BASE + ADRV904X_SEMAPHORE_ADDR_STRIDE), 32U, (uint32_t)ADRV904X_SEMAPHORE_ADDR_STRIDE } + , + { (uint32_t)ADRV904X_CORE_0_INTR_AGG_ADDR_BASE, (uint32_t)(ADRV904X_CORE_0_INTR_AGG_ADDR_BASE + ADRV904X_CORE_0_INTR_AGG_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_CORE_1_INTR_AGG_ADDR_BASE, (uint32_t)(ADRV904X_CORE_1_INTR_AGG_ADDR_BASE + ADRV904X_CORE_1_INTR_AGG_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_TX_DPD_ACT_LUT_ADDR_BASE, (uint32_t)(ADRV904X_TX_DPD_ACT_LUT_ADDR_BASE + ADRV904X_TX_DPD_ACT_LUT_REG_LEN), (uint32_t)ADI_ADRV904X_MAX_TXCHANNELS, (uint32_t)ADRV904X_AHB_ADDR_STRIDE }, + { (uint32_t)ADRV904X_TX_ANA_LB_ADC_32_ADDR_BASE, (uint32_t)(ADRV904X_TX_ANA_LB_ADC_32_ADDR_BASE + ADRV904X_TX_ANA_LB_ADC_32_REG_LEN),(uint32_t)ADI_ADRV904X_MAX_TXCHANNELS, (uint32_t)ADRV904X_AHB_ADDR_STRIDE }, + { (uint32_t)ADRV904X_TX_SEMAPHORE_ADDR_BASE, (uint32_t)(ADRV904X_TX_SEMAPHORE_ADDR_BASE + ADRV904X_TX_SEMAPHORE_REG_LEN), (uint32_t)ADI_ADRV904X_MAX_TXCHANNELS, (uint32_t)ADRV904X_AHB_ADDR_STRIDE }, + { (uint32_t)ADRV904X_TX_CFR_PULSE_RAM_ADDR_BASE, (uint32_t)(ADRV904X_TX_CFR_PULSE_RAM_ADDR_BASE + ADRV904X_TX_CFR_PULSE_RAM_REG_LEN),(uint32_t)ADI_ADRV904X_MAX_TXCHANNELS, (uint32_t)ADRV904X_AHB_ADDR_STRIDE }, + { (uint32_t)ADRV904X_RX_SEMAPHORE_ADDR_BASE, (uint32_t)(ADRV904X_RX_SEMAPHORE_ADDR_BASE + ADRV904X_RX_SEMAPHORE_REG_LEN), (uint32_t)ADI_ADRV904X_MAX_RX_ONLY, (uint32_t)ADRV904X_AHB_ADDR_STRIDE }, + { (uint32_t)ADRV904X_ORX_SEMAPHORE_ADDR_BASE, (uint32_t)(ADRV904X_ORX_SEMAPHORE_ADDR_BASE + ADRV904X_ORX_SEMAPHORE_REG_LEN), (uint32_t)ADI_ADRV904X_MAX_ORX, (uint32_t)ADRV904X_AHB_ADDR_STRIDE }, + { (uint32_t)ADRV904X_RS_GLOBAL_CFG_1_ADDR_BASE, (uint32_t)(ADRV904X_RS_GLOBAL_CFG_1_ADDR_BASE + ADRV904X_RS_GLOBAL_CFG_1_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_RS_CONFIG_0_ADDR_BASE, (uint32_t)(ADRV904X_RS_CONFIG_0_ADDR_BASE + ADRV904X_RS_CONFIG_0_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_A55_INTR_AGG_ADDR_BASE, (uint32_t)(ADRV904X_A55_INTR_AGG_ADDR_BASE + ADRV904X_A55_INTR_AGG_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_A55_INTR_TSMTR_ADDR_BASE, (uint32_t)(ADRV904X_A55_INTR_TSMTR_ADDR_BASE + ADRV904X_A55_INTR_TSMTR_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_A55_UART0_ADDR_BASE, (uint32_t)(ADRV904X_A55_UART0_ADDR_BASE + ADRV904X_A55_UART0_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_A55_UART1_ADDR_BASE, (uint32_t)(ADRV904X_A55_UART1_ADDR_BASE + ADRV904X_A55_UART1_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_A55_TRU_ADDR_BASE, (uint32_t)(ADRV904X_A55_TRU_ADDR_BASE + ADRV904X_A55_TRU_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_A55_GIC_ADDR_BASE, (uint32_t)(ADRV904X_A55_GIC_ADDR_BASE + ADRV904X_A55_GIC_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_A55_MDMA_ADDR_BASE, (uint32_t)(ADRV904X_A55_MDMA_ADDR_BASE + ADRV904X_A55_MDMA_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_A55_L4CFG_ADDR_BASE, (uint32_t)(ADRV904X_A55_L4CFG_ADDR_BASE + ADRV904X_A55_L4CFG_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_A55_CAPBUFDDE_ADDR_BASE, (uint32_t)(ADRV904X_A55_CAPBUFDDE_ADDR_BASE + ADRV904X_A55_CAPBUFDDE_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_A55_TSGEN_CTRL_ADDR_BASE, (uint32_t)(ADRV904X_A55_TSGEN_CTRL_ADDR_BASE + ADRV904X_A55_TSGEN_CTRL_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_A55_MMR_FABRIC_ADDR_BASE, (uint32_t)(ADRV904X_A55_MMR_FABRIC_ADDR_BASE + ADRV904X_A55_MMR_FABRIC_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_A55_SYSTEM_CTI_ADDR_BASE, (uint32_t)(ADRV904X_A55_SYSTEM_CTI_ADDR_BASE + ADRV904X_A55_SYSTEM_CTI_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_A55_ATB_FUNNEL_ADDR_BASE, (uint32_t)(ADRV904X_A55_ATB_FUNNEL_ADDR_BASE + ADRV904X_A55_ATB_FUNNEL_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_A55_TRACE_FIFO_ADDR_BASE, (uint32_t)(ADRV904X_A55_TRACE_FIFO_ADDR_BASE + ADRV904X_A55_TRACE_FIFO_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_A55_TPIU_ADDR_BASE, (uint32_t)(ADRV904X_A55_TPIU_ADDR_BASE + ADRV904X_A55_TPIU_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_A55_PE_DBGVIEW_ADDR_BASE, (uint32_t)(ADRV904X_A55_PE_DBGVIEW_ADDR_BASE + ADRV904X_A55_PE_DBGVIEW_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_A55_PE_SYSVIEW_ADDR_BASE, (uint32_t)(ADRV904X_A55_PE_SYSVIEW_ADDR_BASE + ADRV904X_A55_PE_SYSVIEW_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_A55_FABRIC_ADDR_BASE, (uint32_t)(ADRV904X_A55_FABRIC_ADDR_BASE + ADRV904X_A55_FABRIC_REG_LEN), 1U, 0U }, + { (uint32_t)ADRV904X_TX_VSWR_PLAYBACK_RAM_ADDR_BASE, (uint32_t)(ADRV904X_TX_VSWR_PLAYBACK_RAM_ADDR_BASE + ADRV904X_TX_VSWR_PLAYBACK_RAM_REG_LEN), (uint32_t)ADI_ADRV904X_MAX_TXCHANNELS, (uint32_t)ADRV904X_AHB_ADDR_STRIDE }, + { (uint32_t)ADRV904X_TX_CAPTURE_RAM_ADDR_BASE, (uint32_t)(ADRV904X_TX_CAPTURE_RAM_ADDR_BASE + ADRV904X_TX_CAPTURE_RAM_REG_LEN), (uint32_t)ADI_ADRV904X_MAX_TXCHANNELS, (uint32_t)ADRV904X_AHB_ADDR_STRIDE }, +}; + +/* + * Return ADI_TRUE if the entire adrv904x memory area starting at addr and of length numBytes lies within a 32bOnly region. + * + * Does not check alignment of the memory area. + */ +static uint8_t adrv904x_Is32BitAccess(const uint32_t addr, + const uint32_t numBytes) +{ + uint8_t sizeOfRegMapArray = (uint8_t)(sizeof(adrv904x_ThirtyTwoBitRegisterMapArray) / sizeof(adrv904x_ThirtyTwoBitRegisterMapArray[0])); + uint8_t is32BitAccess = 0U; + uint8_t i = 0U; + uint32_t j = 0U; + + for (i = 0U; i < sizeOfRegMapArray; i++) + { + for (j = 0U; j < adrv904x_ThirtyTwoBitRegisterMapArray[i].numOfInstances; j++) + { + if ((addr >= (adrv904x_ThirtyTwoBitRegisterMapArray[i].startAddr + (adrv904x_ThirtyTwoBitRegisterMapArray[i].strideValue * j))) && + (addr < (adrv904x_ThirtyTwoBitRegisterMapArray[i].endAddr + (adrv904x_ThirtyTwoBitRegisterMapArray[i].strideValue * j))) && + ((addr + numBytes - 1U) >= (adrv904x_ThirtyTwoBitRegisterMapArray[i].startAddr + (adrv904x_ThirtyTwoBitRegisterMapArray[i].strideValue * j))) && + ((addr + numBytes - 1U) < (adrv904x_ThirtyTwoBitRegisterMapArray[i].endAddr + (adrv904x_ThirtyTwoBitRegisterMapArray[i].strideValue * j)))) + { + is32BitAccess = 1U; + return is32BitAccess; + } + } + } + + return is32BitAccess; +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Register32Write(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + uint32_t addr, + const uint32_t writeData, + const uint32_t mask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY_QUIET(&device->common); + + /* Re-write addresses so that writes to 0x4700'0000 - 0x4700'3FFF are done + * via the faster direct spi protocol. Possible as that memory region is aliased to 0x0 - 0x3FFF. */ + if ((addr >= SPI_ONLY_REGS_ADDR) && + (addr < (SPI_ONLY_REGS_ADDR + DIRECT_SPI_REGION_LEN) && + mask <= 0xFFU)) + { + addr -= SPI_ONLY_REGS_ADDR; + } + + recoveryAction = adi_adrv904x_Registers32Write(device, spiCache, &addr, &writeData, &mask, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Registers32Write Issue"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT_QUIET(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Registers32Write(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const uint32_t addr[], + const uint32_t writeData[], + const uint32_t mask[], + const uint32_t count) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint16_t SPI_PAGING = (uint16_t) DIRECT_SPI_REGION_LEN; + uint32_t i = 0U; + uint32_t numWrBytes = 0U; + uint8_t wrData[ADI_HAL_SPI_FIFO_SIZE] = { 0U }; + uint32_t *numWrBytesPtr = NULL; + uint8_t *wrDataPtr = NULL; + uint32_t writeData32 = 0U; + uint32_t writeMask32 = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY_QUIET(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, addr, cleanup); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, writeData, cleanup); + + if (spiCache == NULL) + { + wrDataPtr = &wrData[0U]; + numWrBytesPtr = &numWrBytes; + } + else + { + wrDataPtr = spiCache->data; + numWrBytesPtr = &spiCache->count; + } + + if (mask != NULL) + { + /* This is a scattered (non-contiguous) write: + * - each element of addr[] param indicates dest addr for each corresponding element in writeData[] param + * - each element of mask[] param indicates write mask for each corresponding element in writeData[] param + */ + for (i = 0U; i < count; ++i) + { + writeData32 = writeData[i]; + writeMask32 = mask[i]; + + if (adrv904x_Is32BitAccess(addr[i], 1U) == ADI_TRUE) + { + /* Address is a 32bOnly area use adi_adrv904x_Registers32bOnlyWrite */ + /* Manual flush so that we can call Registers32bOnlyWrite with a null spiCache */ + recoveryAction = adi_adrv904x_SpiFlush(device, wrDataPtr, numWrBytesPtr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flush Issue"); + goto cleanup; + } + + if (mask[i] != 0xFFFFFFFFU) + { + /* Mask must be all Fs for 32bOnly regions */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + mask[i], + "Address is in 32bit register map, mask should be 0xFFFFFFFFU"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Registers32bOnlyWrite(device, + NULL, + addr[i], + (uint8_t*) &writeData32, + 4U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Registers32bOnlyWrite Issue"); + goto cleanup; + } + + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_SPI, + "32-Bit Write (Address: 0x%08" PRIX32" Data: 0x%08" PRIX32")", + addr[i], + writeData32); + } + else if (addr[i] < SPI_PAGING) + { + /* This is a scattered (non-contiguous) write to the Direct Area */ + if ((writeData32 & writeMask32) > 0xFFU) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + writeData, + "Overflow data on a Direct SPI write"); + goto cleanup; + } + if ((*numWrBytesPtr + ADRV904X_DIRECT_SPI_BYTES) > ADI_HAL_SPI_FIFO_SIZE) + { + recoveryAction = adi_adrv904x_SpiFlush( device, wrDataPtr, numWrBytesPtr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flush Issue"); + goto cleanup; + } + } + + recoveryAction = adrv904x_DirectSpiDataPack(device, + wrDataPtr, + numWrBytesPtr, + addr[i], + writeMask32, + writeData32, + ADRV904X_SPI_WRITE_POLARITY); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + goto cleanup; + } + + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_SPI, + "Direct Write (Address: 0x%08" PRIX32" Data: 0x%08" PRIX32" Mask: 0x%08" PRIX32")", + addr[i], + writeData32, + writeMask32); + } + else + { + /* This is a scattered (non-contiguous) write to the AHB area. Uses paging. */ + if ((*numWrBytesPtr + ADRV904X_PAGING_SPI_BYTES) > ADI_HAL_SPI_FIFO_SIZE) + { + recoveryAction = adi_adrv904x_SpiFlush( device, wrDataPtr, numWrBytesPtr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flush Issue"); + goto cleanup; + } + } + + recoveryAction = adrv904x_PagingSpiDataPack(device, + wrDataPtr, + numWrBytesPtr, + addr[i], + writeMask32, + writeData32, + ADRV904X_SPI_WRITE_POLARITY); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Paging SPI Data Packing Issue"); + goto cleanup; + } + + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_SPI, + "Page Write (Address: 0x%08" PRIX32" Data: 0x%08" PRIX32" Mask: 0x%08" PRIX32")", + addr[i], + writeData32, + writeMask32); + } + } + } + else + { + /* mask == NULL => this is a contiguous write: + * - addr[0] is taken as the dest address. mask[] param is ignored. + * - writeData[0] is written to addr[0], writeData[1] is written to next address. + * Next address is addr + 1 for addrs in SPI_PAGING area. addr + 4 for others. + */ + + uint32_t baseAddr = addr[0U]; + + if (adrv904x_Is32BitAccess(baseAddr, 1U) == ADI_TRUE) + { + /* Address is a 32bOnly area use adi_adrv904x_Registers32bOnlyWrite */ + for (i = 0U; i < count; ++i) + { + writeData32 = writeData[i]; + /* Manual flush so that we can call Registers32bOnlyWrite with a null spiCache */ + recoveryAction = adi_adrv904x_SpiFlush(device, wrDataPtr, numWrBytesPtr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flush Issue"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Registers32bOnlyWrite(device, + NULL, + baseAddr, + (uint8_t*) &writeData32, + 4U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Registers32bOnlyWrite Issue"); + goto cleanup; + } + + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_SPI, + "32-Bit Write (Address: 0x%08" PRIX32" Data: 0x%08" PRIX32")", + baseAddr, + writeData32); + + baseAddr = baseAddr + 4U; + } + } + else if (baseAddr < SPI_PAGING) + { + /* Contiguous/non-masked direct-area write. */ + for (i = 0U; i < count; ++i) + { + writeData32 = writeData[i]; + + if ((writeData32) > 0xFFU) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + writeData, + "Overflow data on a Direct SPI write"); + goto cleanup; + } + + if ((*numWrBytesPtr + ADRV904X_DIRECT_SPI_BYTES) > ADI_HAL_SPI_FIFO_SIZE) + { + recoveryAction = adi_adrv904x_SpiFlush( device, wrDataPtr, numWrBytesPtr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flush Issue"); + goto cleanup; + } + } + + recoveryAction = adrv904x_DirectSpiDataPack(device, + wrDataPtr, + numWrBytesPtr, + baseAddr, + 0xFFU, + writeData32, + ADRV904X_SPI_WRITE_POLARITY); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + goto cleanup; + } + + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_SPI, + "Bulk Direct Write (Address: 0x%08" PRIX32" Data: 0x%08" PRIX32" Mask: 0x%08" PRIX32")", + baseAddr, + writeData32, + 0xFFU); + + baseAddr = baseAddr + 1U; + } + } + else + { + /* Contiguous/non-masked AHB write. Uses paging area. */ + for (i = 0U; i < count; ++i) + { + writeData32 = writeData[i]; + + if ((*numWrBytesPtr + ADRV904X_PAGING_SPI_BYTES) > ADI_HAL_SPI_FIFO_SIZE) + { + recoveryAction = adi_adrv904x_SpiFlush( device, wrDataPtr, numWrBytesPtr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flush Issue"); + goto cleanup; + } + } + + recoveryAction = adrv904x_PagingSpiDataPack(device, + wrDataPtr, + numWrBytesPtr, + baseAddr, + 0xFFFFFFFFU, + writeData32, + ADRV904X_SPI_WRITE_POLARITY); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Paging SPI Data Packing Issue"); + goto cleanup; + } + + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_SPI, + "Page Write (Address: 0x%08" PRIX32" Data: 0x%08" PRIX32" Mask: 0x%08" PRIX32")", + baseAddr, + writeData[i], + 0xFFFFFFFFU); + + baseAddr = baseAddr + 4U; + } + } + } + + if (spiCache == NULL) + { + recoveryAction = adi_adrv904x_SpiFlush( device, wrDataPtr, numWrBytesPtr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flushing Issue"); + goto cleanup; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT_QUIET(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Register32Read(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + uint32_t addr, + uint32_t* const readData, + const uint32_t mask) +{ + uint8_t readBytes[4] = { 0U, 0U, 0U, 0U }; + uint32_t count = 0U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY_QUIET(&device->common); + + /* Re-write addresses so that writes to 0x4700'0000 - 0x4700'3FFF are done + * via the faster direct spi protocol. That memory region is aliased to 0x0 to 0x4000. */ + if((addr >= SPI_ONLY_REGS_ADDR) && + (addr < (SPI_ONLY_REGS_ADDR + DIRECT_SPI_REGION_LEN) && + mask <= 0xFFU)) + { + addr -= SPI_ONLY_REGS_ADDR; + } + + /* Lazy read with RegistersByteRead only the amount of bytes that the mask needs. + * It avoids 0xFF54 errors on the firmware side when adi_adrv904x_Register32Read + * is used in BfGet functions and simplifies SPI transactions */ + count = (mask <= 0xFFU) ? 1U : ((mask <= 0xFFFFU) ? 2U : ((mask <= 0xFFFFFFU) ? 3U : 4U)); + + recoveryAction = adi_adrv904x_RegistersByteRead(device, spiCache, addr, readBytes, NULL, count); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RegistersByteRead issue"); + goto cleanup; + } + + /* Device are LE; Convert host-endianness */ + *readData = ( ((uint32_t)readBytes[0] << 0U) | + ((uint32_t)readBytes[1] << 8U) | + ((uint32_t)readBytes[2] << 16U) | + ((uint32_t)readBytes[3] << 24U)); + *readData &= mask; + +cleanup : + ADI_ADRV904X_API_EXIT_QUIET(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Registers32Read(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const uint32_t addr, + uint32_t readData[], + uint32_t mask[], + const uint32_t count) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_ErrAction_e exitRecoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint16_t SPI_PAGING = (uint16_t) DIRECT_SPI_REGION_LEN; + + uint32_t i = 0U; + uint32_t j = 0U; + uint32_t localCacheCount = 0U; /* Number of total bytes packed into the byte array for SPI transactions */ + uint32_t currentRdCount = 0U; /* Number of registers that are to be read in the current byte array. Different than localCacheCount b/c it doesn't include address packing */ + uint32_t readDataIndex = 0U; /* The current index in readData where data should be placed after it is read. Since it's possible multiple SPI transactions can occur based on the number of bytes requested */ + uint8_t localCache[ADI_HAL_SPI_FIFO_SIZE] = { 0U }; + uint32_t currentAddress = addr; /* In the case when we need to flush in the middle of byte packing we need to keep track of where the next buffer will start from */ + uint8_t *readDataBytes; /* Used to cast readData array to a byte array */ + uint8_t parsedDataStride = 0U; /* Used when parsing data to determine where the next register value should be placed in readData */ + uint32_t lastByteBool = 0U; + uint32_t disableAutoIncrement = 0U; + const uint32_t numRegistersToRead = count; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY_QUIET(&device->common); + + if (device->common.wrOnly == ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_INTERFACE; + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_DEVICEHAL, + ADI_ADRV904X_ERRCODE_HAL_INVALID_DEVICE_STATE, + recoveryAction, + device->common.wrOnly, + "Device is currently in write-only mode"); + goto cleanup; + } + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, readData, cleanup); + + readDataBytes = (uint8_t *)readData; + + if (spiCache != NULL) + { + /* spiCache is a parameter to this function as a convenience. It is only used to flush any previous writes that have been cached. */ + recoveryAction = adi_adrv904x_SpiFlush( device, spiCache->data, &spiCache->count); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flushing Issue"); + goto cleanup; + } + } + + if (adrv904x_Is32BitAccess(addr, numRegistersToRead * 4) == ADI_TRUE) + { + /* Address is a 32bOnly area use adi_adrv904x_Registers32bOnlyRead */ + for (i = 0U; i < numRegistersToRead; ++i) + { + if ((mask != NULL) && (mask[i] != 0xFFFFFFFFU)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + mask, + "Address is in 32bit register map, mask should be 0xFFFFFFFFU"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Registers32bOnlyRead( device, + NULL, + addr + (4U * i), + (uint8_t*) &readData[i], + 4U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Registers32bOnlyRead Issue"); + goto cleanup; + } + + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_SPI, + "32-Bit Read( Address: 0x%08" PRIX32" Data: 0x%08" PRIX32")", + (addr + (4U * i)), + readData[i]); + } + /* There is no need to fix up endianess like in the 'addr < SPI_PAGING' and 'non-32bOnly' scenarios + * as adi_adrv904x_Registers32bOnlyRead has already done it. */ + } + else if (addr < SPI_PAGING) + { + /* For Direct SPI we're processing bytes that need to be indexed into a uint32_t array */ + parsedDataStride = 4U; /* Each byte read from device is copied an element of uint32_t readData[] */ + + for (i = 0U; i < numRegistersToRead; ++i) + { + /* For direct SPI reads we can handle any number of bytes and only initiate a SPI transaction when the + * buffer is full or after we've packed all the reads together */ + if ((localCacheCount + ADRV904X_DIRECT_SPI_BYTES) > ADI_HAL_SPI_FIFO_SIZE) + { + recoveryAction = adrv904x_FlushParse( device, + localCache, + localCacheCount, + &readDataBytes[readDataIndex * parsedDataStride], + currentRdCount, + parsedDataStride); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "AHB Flushing issue."); + goto cleanup; + } + localCacheCount = 0U; + readDataIndex += currentRdCount; + currentRdCount = 0U; + } + + recoveryAction = adrv904x_DirectSpiDataPack(device, + localCache, + &localCacheCount, + currentAddress, + 0xFFU, + 0x00U, + ~ADRV904X_SPI_WRITE_POLARITY); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Pack Issue"); + goto cleanup; + } + + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_SPI, + "Direct Read (Address: 0x%08" PRIX32" Data: 0x%08" PRIX32" Mask: 0x%08" PRIX32")", + currentAddress, + readDataBytes[readDataIndex * parsedDataStride], + 0xFFU); + + /* Keeping track of how many registers in this localCache instance. + * This will get cleared on a all to adrv_FlushParse. + * */ + currentRdCount++; + + /* Keeping track of which AHB address we're looking at. + * This will NOT get cleared on a all to adrv_FlushParse. + * */ + currentAddress++; + } + + recoveryAction = adrv904x_FlushParse( device, + localCache, + localCacheCount, + &readDataBytes[readDataIndex * parsedDataStride], + currentRdCount, + parsedDataStride); + + for (i = 0; i < numRegistersToRead; ++i) + { + readData[i] = ADRV904X_CTOHL(readData[i]); + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "AHB Flushing issue."); + goto cleanup; + } + } + else + { + /* Src addr is AHB region. We are processing bytes and treating the readData array as a byte array */ + parsedDataStride = 1U; + + /* Pack the ctrl and first addr then flush to write immediately */ + /* Using the configCache to keep things separate */ + recoveryAction = adrv904x_IndirectReadSetup(device, device->devStateInfo.spiOptions.allowAhbAutoIncrement); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DMA Ctrl Issue"); + goto cleanup; + } + + /* No matter what we always need to set the address for the first read. */ + recoveryAction = adrv904x_DmaAddrSet(device, currentAddress); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DMA Address Pack Issue"); + goto cleanup; + } + + for (i = 0U; i < numRegistersToRead; ++i) + { + + if ((localCacheCount + (ADRV904X_DIRECT_SPI_BYTES * 4U)) > ADI_HAL_SPI_FIFO_SIZE) + { + recoveryAction = adrv904x_FlushParse( device, + localCache, + localCacheCount, + &readDataBytes[readDataIndex], + currentRdCount, + parsedDataStride); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "AHB Flushing issue."); + goto cleanup; + } + localCacheCount = 0U; + readDataIndex += currentRdCount; + currentRdCount = 0U; + } + + /* This loops reads each byte of the current 32-bit AHB register */ + for (j = 0U; j < 4U; j++) + { + lastByteBool = (i == (numRegistersToRead - 1)) && (j == 3); + disableAutoIncrement = (i == (numRegistersToRead - 1)) && (j == 2); + + recoveryAction = adrv904x_DirectSpiDataPack(device, localCache, &localCacheCount, ADRV904X_ADDR_SPIDMA0_DATA0, 0xFF, 0x00, ~ADRV904X_SPI_WRITE_POLARITY); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + goto cleanup; + } + + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_SPI, + "Page Read (Address: 0x%08" PRIX32" Data: 0x%08" PRIX32" Mask: 0x%08" PRIX32")", + currentAddress, + readDataBytes[readDataIndex], + 0xFFU); + + /* Keeping track of how many registers in this localCache instance. + * This will get cleared on a all to adrv_FlushParse. + * */ + ++currentRdCount; + + /* Keeping track of which AHB address we're looking at. + * This will NOT get cleared on a all to adrv_FlushParse. + * */ + ++currentAddress; + + /* Cases where we need to flush prior to reading next word: + * - SPI streaming WITHOUT Spi FIFO mode enabled + * - because reading the same register over & over again will throw an error + * in SPI streaming + * - auto-increment is turned off + * - because we need to set the address for the next byte + * */ + if (((device->devStateInfo.spiStreamingOn == 1U) && (device->devStateInfo.spiFifoModeOn == 0U)) || + (device->devStateInfo.autoIncrModeOn == 0U)) + { + recoveryAction = adrv904x_FlushParse( device, + localCache, + localCacheCount, + &readDataBytes[readDataIndex], + currentRdCount, + parsedDataStride); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "AHB Flushing issue."); + goto cleanup; + } + localCacheCount = 0U; + readDataIndex += currentRdCount; + currentRdCount = 0U; + } + + /* Set the address on the first byte or each time if auto-increment is off. + * This also ensures we will NOT set the address when SPI FIFO mode because we cannot + * be in SPI FIFO mode with auto increment off. + * */ + if ((lastByteBool == 0U) && (device->devStateInfo.autoIncrModeOn == 0U)) + { + recoveryAction = adrv904x_DmaAddrSet(device, currentAddress); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DMA Address Pack Issue"); + goto cleanup; + } + } + else if (disableAutoIncrement == 1U) + { + /* auto-increment can cause invalid memory regions to be accessed. + * Because of that, on the final word to read turn off auto increment. + */ + recoveryAction = adrv904x_FlushParse( device, + localCache, + localCacheCount, + &readDataBytes[readDataIndex], + currentRdCount, + parsedDataStride); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "AHB Flushing issue."); + goto cleanup; + } + localCacheCount = 0U; + readDataIndex += currentRdCount; + currentRdCount = 0U; + + /* Pack the ctrl and first addr then flush to write immediately */ + /* Using the configCache to keep things separate */ + recoveryAction = adrv904x_IndirectReadSetup(device, ADI_DISABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DMA Ctrl Issue"); + goto cleanup; + } + } + } /* foreach byte of 32bit register */ + } /* foreach 32bit register to read */ + + /* Final flush before exit in case there's still cached up reads. */ + if (localCacheCount != 0U) + { + recoveryAction = adrv904x_FlushParse( device, + localCache, + localCacheCount, + &readDataBytes[readDataIndex], + currentRdCount, + parsedDataStride); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "AHB Flushing issue."); + goto cleanup; + } + } + + /* Convert endianess all AHB register reads from device to host byte-order */ + for (i = 0; i < numRegistersToRead; i++) + { + readData[i] = ADRV904X_CTOHL(readData[i]); + } + } + + /* Clean up the data for the following cases: + * - If masking is required + */ + if (mask != NULL) + { + for (i = 0U; i < numRegistersToRead; ++i) + { + readData[i] &= mask[i]; + } + } + +cleanup: + if (addr >= SPI_PAGING) + { + /* Reset any indirect configurations if used. */ + exitRecoveryAction = adrv904x_IndirectReadTeardown(device); + if (ADI_ADRV904X_ERR_ACT_NONE != exitRecoveryAction) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_INTERFACE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API Exit Issue"); + } + } + + ADI_ADRV904X_API_EXIT_QUIET(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RegistersByteWrite(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const uint32_t addr, + const uint8_t writeData[], + const uint32_t count) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint16_t SPI_PAGING = (uint16_t) DIRECT_SPI_REGION_LEN; + uint32_t i = 0U; + uint32_t numWrBytes = 0U; + uint8_t wrData[ADI_HAL_SPI_FIFO_SIZE] = {0U}; + uint32_t *numWrBytesPtr = NULL; + uint8_t *wrDataPtr = NULL; + uint32_t baseAddr = addr; + uint32_t wordWriteCount = 0U; /* Word Write Count */ + uint32_t wordWriteIndex = 0U; /* Word Write Index */ + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY_QUIET(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, writeData, cleanup); + + if (spiCache == NULL) + { + wrDataPtr = &wrData[0U]; + numWrBytesPtr = &numWrBytes; + } + else + { + wrDataPtr = spiCache->data; + numWrBytesPtr = &spiCache->count; + } + + if (adrv904x_Is32BitAccess(addr, count) == ADI_TRUE) + { + /* Write to 32bOnly area */ + /* Calculate Number of 32 Bit Register Write Transactions Required */ + if ((count & 3U) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, count, "32-Bit Access Requires Count to be Multiples of 4"); + goto cleanup; + } + + wordWriteCount = count >> 2U; + wordWriteIndex = wordWriteCount - 1U; + + /* Manual flush so that we can call Registers32bOnlyWrite with a null spiCache */ + recoveryAction = adi_adrv904x_SpiFlush(device, wrDataPtr, numWrBytesPtr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flush Issue"); + goto cleanup; + } + + for (i = 0U; i < wordWriteCount; ++i) + { + recoveryAction = adi_adrv904x_Registers32bOnlyWrite(device, + NULL, + addr + (4U * wordWriteIndex), + &writeData[4U * wordWriteIndex], + 4U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Registers32bOnlyRead Issue"); + goto cleanup; + } + ++wordWriteIndex; + } + + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_SPI, + "32-Bit Write (Address: 0x%08" PRIX32" Data: 0x%08" PRIX32")", + addr, + writeData); + } + else if (baseAddr < SPI_PAGING) + { + /* Write to direct area */ + for (i = 0U; i < count; ++i) + { + if ((*numWrBytesPtr + ADRV904X_DIRECT_SPI_BYTES) > ADI_HAL_SPI_FIFO_SIZE) + { + recoveryAction = adi_adrv904x_SpiFlush(device, wrDataPtr, numWrBytesPtr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flush Issue"); + goto cleanup; + } + } + + recoveryAction = adrv904x_DirectSpiDataPack(device, + wrDataPtr, + numWrBytesPtr, + baseAddr, + 0xFFU, + writeData[i], + ADRV904X_SPI_WRITE_POLARITY); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + goto cleanup; + } + + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_SPI, + "Direct Write (Address: 0x%08" PRIX32" Data: 0x%08" PRIX32" Mask: 0x%08" PRIX32")", + baseAddr, + writeData[i], + 0xFFU); + + baseAddr = baseAddr + 1U; + } + } + else + { + /* Write to AHB address. Uses paging. */ + for (i = 0U; i < count; ++i) + { + if ((*numWrBytesPtr + ADRV904X_PAGING_SPI_BYTES) > ADI_HAL_SPI_FIFO_SIZE) + { + recoveryAction = adi_adrv904x_SpiFlush(device, wrDataPtr, numWrBytesPtr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flush Issue"); + goto cleanup; + } + } + + recoveryAction = adrv904x_PagingSpiDataPack(device, + wrDataPtr, + numWrBytesPtr, + baseAddr, + 0xFFU, + (uint32_t) writeData[i], + ADRV904X_SPI_WRITE_POLARITY); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Paging SPI Data Packing Issue"); + goto cleanup; + } + + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_SPI, + "Page Write (Address: 0x%08" PRIX32" Data: 0x%08" PRIX32" Mask: 0x%08" PRIX32")", + baseAddr, + writeData[i], + 0xFFU); + + baseAddr = baseAddr + 1U; + } + } + + if (adrv904x_Is32BitAccess(addr, count) != ADI_TRUE) + { + if (spiCache == NULL) + { + recoveryAction = adi_adrv904x_SpiFlush(device, wrDataPtr, numWrBytesPtr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flushing Issue"); + goto cleanup; + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT_QUIET(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RegistersByteRead(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const uint32_t addr, + uint8_t readData[], + const uint8_t mask[], + const uint32_t count) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_ErrAction_e exitRecoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint16_t SPI_PAGING = (uint16_t) DIRECT_SPI_REGION_LEN; + + uint32_t i = 0U; + uint32_t localCacheCount = 0U; /* Number of total bytes packed into the byte array for SPI transactions */ + uint32_t currentRdCount = 0U; /* Number of registers that are to be read in the current byte array. Different than localCacheCount b/c it doesn't include address packing */ + uint32_t readDataIndex = 0U; /* The current index in readData where data should be placed after it is read. Since it's possible multiple SPI transactions can occur based on the number of bytes requested */ + uint8_t localCache[ADI_HAL_SPI_FIFO_SIZE] = { 0U }; + uint32_t currentAddress = 0U; /* In the case when we need to flush in the middle of byte packing we need to keep track of where the next buffer will start from */ + uint8_t *readDataBytes; /* Used to cast readData array to a byte array */ + uint8_t parsedDataStride = 0U; /* Used when parsing data to determine where the next register value should be placed in readData */ + uint32_t wordReadCount = 0U; /* Word Read Count */ + uint32_t addrActual = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY_QUIET(&device->common); + + /* Re-write addresses so that writes to 0x4700'0000 - 0x4700'3FFF are done + * via the faster direct spi protocol. Possible as that memory region is aliased to 0x0 to 0x4000. */ + if ((addr >= SPI_ONLY_REGS_ADDR) && + (addr < (SPI_ONLY_REGS_ADDR + DIRECT_SPI_REGION_LEN))) + { + addrActual = addr - SPI_ONLY_REGS_ADDR; + } + else + { + addrActual = addr; + } + + currentAddress = addrActual; + + if (device->common.wrOnly == ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_INTERFACE; + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_DEVICEHAL, + ADI_ADRV904X_ERRCODE_HAL_INVALID_DEVICE_STATE, + recoveryAction, + device->common.wrOnly, + "Device is currently in write-only mode"); + goto cleanup; + } + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, readData, cleanup); + + readDataBytes = (uint8_t *)readData; + + if (spiCache != NULL) + { + /* spiCache is a parameter to this function as a convenience. It is only used to flush any previous writes that have been cached. */ + recoveryAction = adi_adrv904x_SpiFlush( device, spiCache->data, &spiCache->count); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flushing Issue"); + goto cleanup; + } + } + + if (adrv904x_Is32BitAccess(addrActual, count) == ADI_TRUE) + { + /* Calculate Number of 32 Bit Register Read Transactions Required */ + if ((count & 3U) != 0U) + { + wordReadCount = (count >> 2U) + 1U; + } + else + { + wordReadCount = count >> 2U; + } + + for (i = 0U; i < wordReadCount; ++i) + { + /* Address is in the 32b register maps, force adi_adrv904x_Registers32bOnlyRead */ + if ((mask != NULL) && (mask[i] != 0xFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + mask, + "Address is in 32bit register map, mask should be 0xFFFFFFFF"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Registers32bOnlyRead( device, + NULL, + addrActual + (4U * i), + &readData[(4U * i)], + 4U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Registers32bOnlyRead Issue"); + goto cleanup; + } + + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_SPI, + "32-Bit Read (Address: 0x%08" PRIX32" Data: 0x%08" PRIX32")", + (addrActual + (4U * i)), + readData[(4U * i)]); + } + } + else if (addrActual < SPI_PAGING) + { + /* For Direct SPI we're processing bytes that need to be indexed into a uint8_t array */ + parsedDataStride = 1U; + + for (i = 0U; i < count; ++i) + { + /* For direct SPI reads we can handle any number of bytes and only initiate a SPI transaction when the buffer is full + * or after we've packed all the reads together */ + if ((localCacheCount + ADRV904X_DIRECT_SPI_BYTES) > ADI_HAL_SPI_FIFO_SIZE) + { + recoveryAction = adrv904x_FlushParse(device, + localCache, + localCacheCount, + &readDataBytes[readDataIndex * parsedDataStride], + currentRdCount, + parsedDataStride); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "AHB Flushing issue."); + goto cleanup; + } + localCacheCount = 0U; + readDataIndex += currentRdCount; + currentRdCount = 0U; + } + + recoveryAction = adrv904x_DirectSpiDataPack(device, + localCache, + &localCacheCount, + currentAddress, + 0xFFU, + 0x00U, + ~ADRV904X_SPI_WRITE_POLARITY); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Pack Issue"); + goto cleanup; + } + + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_SPI, + "Direct Read (Address: 0x%08" PRIX32" Data: 0x%08" PRIX32" Mask: 0x%08" PRIX32")", + currentAddress, + readDataBytes[readDataIndex * parsedDataStride], + 0xFFU); + + /* Keeping track of how many registers in this localCache instance. + * This will get cleared on a all to adrv_FlushParse. + * */ + ++currentRdCount; + + /* Keeping track of which AHB address we're looking at. + * This will NOT get cleared on a all to adrv_FlushParse. + * */ + ++currentAddress; + } + + recoveryAction = adrv904x_FlushParse(device, + localCache, + localCacheCount, + &readDataBytes[readDataIndex * parsedDataStride], + currentRdCount, + parsedDataStride); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "AHB Flushing issue."); + goto cleanup; + } + } + else /* Paging/AHB region must use the AHB indirect interface */ + { + /* For AHB we're processing bytes and treating the readData array as a byte array + * */ + parsedDataStride = 1U; + + /* auto-increment can cause invalid memory regions to be accessed. + * Because of that, on the final word to read turn off auto increment. + * This logic also prevents auto-increment from being used when count == 1 + * */ + if (count == 1U) + { + /* Pack the ctrl and first addr then flush to write immediately */ + /* Using the configCache to keep things separate */ + recoveryAction = adrv904x_IndirectReadSetup(device, ADI_DISABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DMA Ctrl Issue"); + goto cleanup; + } + } + else if (i == 0U) + { + /* Pack the ctrl and first addr then flush to write immediately */ + /* Using the configCache to keep things separate */ + recoveryAction = adrv904x_IndirectReadSetup(device, device->devStateInfo.spiOptions.allowAhbAutoIncrement); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DMA Ctrl Issue"); + goto cleanup; + } + } + + /* No matter what we always need to set the address for the first read. */ + recoveryAction = adrv904x_DmaAddrSet(device, currentAddress); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DMA Address Pack Issue"); + goto cleanup; + } + + for (i = 0U; i < count; ++i) + { + + if ((localCacheCount + (ADRV904X_DIRECT_SPI_BYTES)) > ADI_HAL_SPI_FIFO_SIZE) + { + recoveryAction = adrv904x_FlushParse(device, + localCache, + localCacheCount, + &readDataBytes[readDataIndex], + currentRdCount, + parsedDataStride); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "AHB Flushing issue."); + goto cleanup; + } + localCacheCount = 0U; + readDataIndex += currentRdCount; + currentRdCount = 0U; + } + + recoveryAction = adrv904x_DirectSpiDataPack(device, localCache, &localCacheCount, ADRV904X_ADDR_SPIDMA0_DATA0, 0xFF, 0x00, ~ADRV904X_SPI_WRITE_POLARITY); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Direct SPI Data Packing Issue"); + goto cleanup; + } + + ADI_VARIABLE_LOG( &device->common, + ADI_HAL_LOG_SPI, + "Page Read (Address: 0x%08" PRIX32" Data: 0x%08" PRIX32" Mask: 0x%08" PRIX32")", + currentAddress, + readDataBytes[readDataIndex], + 0xFFU); + + /* Keeping track of how many registers in this localCache instance. + * This will get cleared on a all to adrv_FlushParse. + * */ + ++currentRdCount; + + /* Keeping track of which AHB address we're looking at. + * This will NOT get cleared on a all to adrv_FlushParse. + * */ + ++currentAddress; + + /* Cases where we need to flush prior to reading next word: + * - SPI streaming WITHOUT Spi FIFO mode enabled + * - because reading the same register over & over again will throw an error + * in SPI streaming + * - auto-increment is turned on and second to last byte has been cached + * - because the last byte needs to be read with autoincrement disabled to avoid + * writing illegal addresses into the AHB bus + * - auto-increment is turned off + * - because we need to set the address for the next byte + * */ + if (((device->devStateInfo.spiStreamingOn == 1U) && (device->devStateInfo.spiFifoModeOn == 0U)) || + ((device->devStateInfo.autoIncrModeOn == 1U) && i == (count - 2U)) || + (device->devStateInfo.autoIncrModeOn == 0U)) + { + recoveryAction = adrv904x_FlushParse(device, + localCache, + localCacheCount, + &readDataBytes[readDataIndex], + currentRdCount, + parsedDataStride); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "AHB Flushing issue."); + goto cleanup; + } + + localCacheCount = 0U; + readDataIndex += currentRdCount; + currentRdCount = 0U; + } + + /* Set the address on the first byte or each time if auto-increment is off. + * This also ensures we will NOT set the address when SPI FIFO mode because we cannot + * be in SPI FIFO mode with auto increment off. + * Does not need to be done on the last iteration. + */ + if ((device->devStateInfo.autoIncrModeOn == 0U) && (i < (count - 1U))) + { + recoveryAction = adrv904x_DmaAddrSet(device, currentAddress); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DMA Address Pack Issue"); + goto cleanup; + } + } + else if ((device->devStateInfo.autoIncrModeOn == 1U) && (i == (count - 2U))) + { + /* (count - 1) cached reads have been flushed and auto-increment should be disabled + * for the last byte read to avoid invalid memory regions to be accessed. + */ + recoveryAction = adrv904x_IndirectReadSetup(device, ADI_DISABLE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DMA Ctrl Issue"); + goto cleanup; + } + } + } + + if (adrv904x_Is32BitAccess(addrActual, count) != ADI_TRUE) + { + /* Final flush before exit in case there's still cached up reads. */ + if (localCacheCount != 0U) + { + recoveryAction = adrv904x_FlushParse(device, + localCache, + localCacheCount, + &readDataBytes[readDataIndex], + currentRdCount, + parsedDataStride); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "AHB Flushing issue."); + goto cleanup; + } + } + } + } + + /* Clean up the data for the following cases: + * - If masking is required + */ + if (mask != NULL) + { + for (i = 0U; i < count; ++i) + { + readData[i] &= mask[i]; + } + } + +cleanup: + if (addrActual >= SPI_PAGING) + { + /* Reset any indirect configurations if used. */ + exitRecoveryAction = adrv904x_IndirectReadTeardown(device); + if (ADI_ADRV904X_ERR_ACT_NONE != exitRecoveryAction) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_INTERFACE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API Exit Issue"); + } + } + + ADI_ADRV904X_API_EXIT_QUIET(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Registers32bOnlyRead(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const uint32_t addr, + uint8_t readData[], + const uint32_t count) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, readData); + + ADI_ADRV904X_API_ENTRY_QUIET(&device->common); + + recoveryAction = adrv904x_Registers32bOnlyRead_vEndian(device, + spiCache, + addr, + readData, + count, + 0U); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "adrv904x_Registers32bOnlyRead_vEndian failed"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT_QUIET(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_Registers32bOnlyWrite(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const uint32_t addr, + const uint8_t writeData[], + const uint32_t count) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t i = 0U; /* loop index */ + uint32_t j = 0U; /* loop index */ + uint32_t dataAligned32 = 0U; + uint8_t *dataAligned8 = (uint8_t*) &dataAligned32; /* Alias to dataAligned32 usable where uint8_t* arg is required */ + const uint32_t numBytesToWrite = count; + + /* read/wrb | sys_codeb | bus_waiting | bus_response | bus_size[1] | bus_size[0] | auto_incr | bus_sel */ + /* 0 0 0 0 1 0 0 0 */ + uint8_t spiDmaCtl[1U] = { 0x08U }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, writeData); + + ADI_ADRV904X_API_ENTRY_QUIET(&device->common); + + if (spiCache != NULL) + { + recoveryAction = adi_adrv904x_SpiFlush(device, spiCache->data, &spiCache->count); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flush Issue After CPU Mailbox Buffer Write"); + goto cleanup; + } + } + + /* Range check: is the address one that requires a 32-bit transactions? + * does addr + count - 4 lie within valid range? + */ + recoveryAction = adrv904x_ThirtyTwoBitAhbAccessRangeCheck(device, addr, numBytesToWrite); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Range check failed. Address does not require a 32-bit SPI transaction."); + goto cleanup; + } + + /* Write the DMA control register */ + recoveryAction = adi_adrv904x_RegistersByteWrite(device, NULL, ADRV904X_ADDR_SPIDMA0_CTL, spiDmaCtl, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing to the spi dma control register."); + goto cleanup; + } + + for (i = 0U; i < (numBytesToWrite / 4U); ++i) + { + /* Write the bus address */ + recoveryAction = adrv904x_DmaAddrSet(device, addr + (4U * i)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing to the spi dma address registers."); + goto cleanup; + } + + /* Ensure data is word aligned before using endianess macro */ + for (j = 0U; j < 4U; ++j) + { + dataAligned8[j] = writeData[(i * 4U) + j]; + } + + /* Data to be written to the DMA register must be big-endian */ + dataAligned32 = ADRV904X_HTONL(dataAligned32); + + recoveryAction = adi_adrv904x_RegistersByteWrite(device, NULL, ADRV904X_ADDR_SPIDMA0_DATA3, dataAligned8, 4U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing to the spi dma data registers."); + goto cleanup; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT_QUIET(&device->common, recoveryAction); + +} + +/* + * Return ADI_ADRV904X_ERR_ACT_NONE if the entire adrv904x memory area starting at addr and of length numBytes lies + * within a 32bOnly region and the start & end of the memory area is 4-byte aligned and the memory region is not + * zero length. + */ +static adi_adrv904x_ErrAction_e adrv904x_ThirtyTwoBitAhbAccessRangeCheck(adi_adrv904x_Device_t* const device, + const uint32_t addr, + const uint32_t numBytes) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + /* check that the count value is a multiple of 4 and not equal to 0U*/ + if (numBytes % 4U != 0U || + ((addr + numBytes - 4U) % 4U != 0U) || + numBytes == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numBytes, "The count parameter must greater than 0 and be a multiple of four."); + return recoveryAction; + } + + if (adrv904x_Is32BitAccess(addr, numBytes) != ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numBytes, "The address range is not completely in a 32-bit AHB region."); + return recoveryAction; + } + + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, addr, "The specified memory location does not require the use of 32-bit SPI transactions."); + return recoveryAction; + } + + return recoveryAction; +} diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_radioctrl.c b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_radioctrl.c new file mode 100644 index 00000000000..8c7a508b3cd --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_radioctrl.c @@ -0,0 +1,9207 @@ +/** +* Copyright 2015 - 2022 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_radioctrl.c +* \brief Contains CPU features related function implementation defined in +* adi_adrv904x_radioctrl.h +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#include + +#include "adi_adrv904x_radioctrl.h" +#include "adi_adrv904x_cals.h" +#include "adi_adrv904x_cpu.h" +#include "adi_adrv904x_tx.h" +#include "adi_adrv904x_core.h" +#include "adi_adrv904x_types.h" +#include "adi_adrv904x_version_types.h" + +#include "../../private/include/adrv904x_radioctrl.h" +#include "../../private/bf/adrv904x_bf_pll_mem_map.h" +#include "../../private/include/adrv904x_cpu_scratch_registers.h" +#include "../../private/include/adrv904x_cpu.h" +#include "../../private/include/adrv904x_rx.h" +#include "../../private/include/adrv904x_tx.h" +#include "../../private/include/adrv904x_gpio.h" +#include "../../private/include/adrv904x_radioctrl.h" +#include "../../private/bf/adrv904x_bf_tx_funcs.h" +#include "../../private/bf/adrv904x_bf_streamproc.h" +#include "../../private/include/adrv904x_init.h" +#include "../../private/include/adrv904x_stream_proc_types.h" + + +#include "../../private/bf/adrv904x_bf_sequencer.h" +#include "adi_adrv904x_dfe_svc_radio_ctrl_sequencer_t.h" +#include "../../private/include/adrv904x_dfe_cfr.h" +#include "../../private/include/adrv904x_dfe_cpu.h" +#include "../../private/include/adrv904x_dfe_svc_radio_ctrl_sequencer_t.h" +#include "../../private/include/adrv904x_dfe_svc_bbic_bridge_t.h" +#include "../../private/include/adrv904x_dfe_framework_cmd_t.h" +#include "../../private/include/adrv904x_cpu_memory.h" +#include "../../private/bf/adrv904x_bf_streamproc_channel.h" +#include "../../private/include/adrv904x_stream_id_types.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PUBLIC_RADIOCTRL + + +/**************************************************************************** + * Helper functions + **************************************************************************** + */ + +/** +* \brief Based off the structure of the stream_image.bin this function extracts +* the size and offset of a single slice processor. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param binary Pointer to the start of slice data in stream_image.bin +* \param binaryImageSize Pointer to a short where the slice size in bytes will be placed +* \param binaryImageOffset Pointer to a short that will store the slice image offset +* in the stream_image.bin file +*/ +static void adrv904x_BinaryImageInfoGet(const uint8_t binary[], + uint32_t* const binaryImageSize, + uint32_t* const binaryImageOffset) +{ + /* populating variables from binary array */ + *binaryImageSize = ((((uint32_t)binary[3U]) << 24U) | (((uint32_t)binary[2U]) << 16U) | (((uint32_t)binary[1U]) << 8U) | ((uint32_t)binary[0U])); + *binaryImageOffset = ((((uint32_t)binary[7U]) << 24U) | (((uint32_t)binary[6U]) << 16U) | (((uint32_t)binary[5U]) << 8U) | ((uint32_t)binary[4U])); +} + +/** +* \brief Based off the structure of the stream_image.bin this function extracts +* the base address of a single slice. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param binary Pointer to the start of slice image in stream_image.bin +* \param word Pointer to a word where the slice base address will be stored +*/ +static void adrv904x_BinaryParamsGetBaseAddr(const uint8_t binary[], uint32_t* const word) +{ + /* populating variables from binary array */ + *word = (((uint32_t)binary[3U]) << 24U) | (((uint32_t)binary[2U]) << 16U) | (((uint32_t)binary[1U]) << 8U) | (uint32_t)(binary[0U]); +} + +/** +* \brief Based off the structure of the stream_image.bin this function extracts +* the number of streams and slice image size. +* +* \dep_begin +* \dep{device->common.devHalInfo} +* \dep_end +* +* \param binary Pointer to the start of slice image in stream_image.bin +* \param numberStreams Pointer to a byte that will store the number of streams for this slice +* \param imageSize Pointer to a short that will store the slice size in bytes +*/ +static void adrv904x_BinaryParamsGetNumberStreamImageSize( const uint8_t binary[], + uint8_t* const numberStreams, + uint32_t* const imageSize) +{ + *numberStreams = binary[0U]; + *imageSize = (((uint32_t)binary[3U]) << 8) | (uint32_t)(binary[2U]); +} + +static adi_adrv904x_GpioPinSel_e adrv904x_StreamGleanGpioNumberGet(uint32_t gpioSelectionArr[], adrv904x_StreamGpioFeatureSelection_e featureSelect) +{ + uint32_t gpioIdx = 0U; + + if (gpioSelectionArr == NULL) + { + return ADI_ADRV904X_GPIO_INVALID; + } + + switch (featureSelect) + { + case ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT0: + case ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT1: + case ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT2: + case ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT3: + case ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT4: + case ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT5: + case ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT6: + case ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT7: + + case ADRV904X_STREAM_GPIO_ALARM_INPUT_0: + case ADRV904X_STREAM_GPIO_ALARM_INPUT_1: + case ADRV904X_STREAM_GPIO_ALARM_INPUT_2: + case ADRV904X_STREAM_GPIO_ALARM_INPUT_3: + case ADRV904X_STREAM_GPIO_ALARM_INPUT_4: + case ADRV904X_STREAM_GPIO_ALARM_INPUT_5: + case ADRV904X_STREAM_GPIO_ALARM_INPUT_6: + case ADRV904X_STREAM_GPIO_ALARM_INPUT_7: + case ADRV904X_STREAM_GPIO_ALARM_INPUT_8: + case ADRV904X_STREAM_GPIO_ALARM_INPUT_9: + case ADRV904X_STREAM_GPIO_PA_EN_OUT_0: + case ADRV904X_STREAM_GPIO_PA_EN_OUT_1: + case ADRV904X_STREAM_GPIO_PA_EN_OUT_2: + case ADRV904X_STREAM_GPIO_PA_EN_OUT_3: + case ADRV904X_STREAM_GPIO_PA_EN_OUT_4: + case ADRV904X_STREAM_GPIO_PA_EN_OUT_5: + case ADRV904X_STREAM_GPIO_PA_EN_OUT_6: + case ADRV904X_STREAM_GPIO_PA_EN_OUT_7: + case ADRV904X_STREAM_GPIO_LNA_EN_OUT_0: + case ADRV904X_STREAM_GPIO_LNA_EN_OUT_1: + case ADRV904X_STREAM_GPIO_LNA_EN_OUT_2: + case ADRV904X_STREAM_GPIO_LNA_EN_OUT_3: + case ADRV904X_STREAM_GPIO_LNA_EN_OUT_4: + case ADRV904X_STREAM_GPIO_LNA_EN_OUT_5: + case ADRV904X_STREAM_GPIO_LNA_EN_OUT_6: + case ADRV904X_STREAM_GPIO_LNA_EN_OUT_7: + case ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_0: + case ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_1: + case ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_2: + case ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_3: + case ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_4: + case ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_5: + case ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_6: + case ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_7: + case ADRV904X_STREAM_GPIO_VSWR_DIR_ORX0: + case ADRV904X_STREAM_GPIO_VSWR_DIR_ORX1: + case ADRV904X_STREAM_GPIO_VSWR_DIR_ORX_CMN: + case ADRV904X_STREAM_GPIO_SBET_LATCH_DPD_MODEL_INDEX: + case ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX0_MAP_BIT0: + case ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX0_MAP_BIT1: + case ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX0_MAP_BIT2: + case ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX0_MAP_BIT3: + case ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX0_MAP_BIT4: + case ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX0_MAP_BIT5: + case ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX1_MAP_BIT0: + case ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX1_MAP_BIT1: + case ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX1_MAP_BIT2: + case ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX1_MAP_BIT3: + case ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX1_MAP_BIT4: + case ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX1_MAP_BIT5: + case ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT0: + case ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT1: + case ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT2: + case ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT3: + case ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT4: + case ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT5: + case ADRV904X_STREAM_GPIO_DTX_INPUT_0: + case ADRV904X_STREAM_GPIO_DTX_INPUT_1: + case ADRV904X_STREAM_GPIO_DTX_INPUT_2: + case ADRV904X_STREAM_GPIO_DTX_INPUT_3: + case ADRV904X_STREAM_GPIO_DTX_INPUT_4: + case ADRV904X_STREAM_GPIO_DTX_INPUT_5: + case ADRV904X_STREAM_GPIO_DTX_INPUT_6: + case ADRV904X_STREAM_GPIO_DTX_INPUT_7: + case ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX0: + case ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX1: + case ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX2: + case ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX3: + case ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX4: + case ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX5: + case ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX6: + case ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX7: + case ADRV904X_STREAM_GPIO_TDD_SW: + case ADRV904X_STREAM_GPIO_PREDRIVE_EN: + case ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN0: + case ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN1: + case ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN2: + case ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN3: + case ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN4: + case ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN5: + case ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN6: + case ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN7: + case ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_0: + case ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_1: + case ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_2: + case ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_3: + case ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_4: + case ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_5: + case ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_6: + case ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_7: + case ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_0: + case ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_1: + case ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_2: + case ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_3: + case ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_4: + case ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_5: + case ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_6: + case ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_7: + break; + + case ADRV904X_STREAM_GPIO_TX_ANTENNA_CAL: + case ADRV904X_STREAM_GPIO_RX_ANTENNA_CAL: + case ADRV904X_STREAM_GPIO_TX_PAP_FOR_EXT_LO0_UNLOCK: + case ADRV904X_STREAM_GPIO_TX_PAP_FOR_EXT_LO1_UNLOCK: + /* Fall Through */ + + default: + return ADI_ADRV904X_GPIO_INVALID; + break; + } + + for (gpioIdx = 0U; gpioIdx < ADI_ADRV904X_GPIO_COUNT; gpioIdx++) + { + if (gpioSelectionArr[gpioIdx] == (uint32_t)featureSelect) + { + return (adi_adrv904x_GpioPinSel_e)gpioIdx; + } + } + + return ADI_ADRV904X_GPIO_INVALID; +} + + +static adi_adrv904x_GpioAnaPinSel_e adrv904x_StreamGleanAnaGpioNumberGet(uint32_t gpioSelectionArr[], + adrv904x_StreamAnaGpioFeatureSelection_e featureSelect) +{ + uint32_t gpioIdx = 0U; + + if (gpioSelectionArr == NULL) + { + return ADI_ADRV904X_GPIO_ANA_INVALID; + } + + switch (featureSelect) + { + case ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_0: + case ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_1: + case ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_2: + case ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_3: + case ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_4: + case ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_5: + case ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_6: + case ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_7: + case ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_0: + case ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_1: + case ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_2: + case ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_3: + case ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_4: + case ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_5: + case ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_6: + case ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_7: + case ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_0: + case ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_1: + case ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_2: + case ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_3: + case ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_4: + case ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_5: + case ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_6: + case ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_7: + case ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX0_MAP_BIT0: + case ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX0_MAP_BIT1: + case ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX0_MAP_BIT2: + case ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX0_MAP_BIT3: + case ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX0_MAP_BIT4: + case ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX0_MAP_BIT5: + case ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX1_MAP_BIT0: + case ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX1_MAP_BIT1: + case ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX1_MAP_BIT2: + case ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX1_MAP_BIT3: + case ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX1_MAP_BIT4: + case ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX1_MAP_BIT5: + case ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT0: + case ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT1: + case ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT2: + case ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT3: + case ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT4: + case ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT5: + case ADRV904X_STREAM_ANALOG_GPIO_TDD_SW: + case ADRV904X_STREAM_ANALOG_GPIO_PREDRIVE_EN: + case ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN0: + case ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN1: + case ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN2: + case ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN3: + case ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN4: + case ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN5: + case ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN6: + case ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN7: + case ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_0: + case ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_1: + case ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_2: + case ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_3: + case ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_4: + case ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_5: + case ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_6: + case ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_7: + case ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_0: + case ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_1: + case ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_2: + case ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_3: + case ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_4: + case ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_5: + case ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_6: + case ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_7: + break; + default: + return ADI_ADRV904X_GPIO_ANA_INVALID; + break; + } + + for (gpioIdx = 0U; gpioIdx < ADI_ADRV904X_GPIO_COUNT; gpioIdx++) + { + if (gpioSelectionArr[gpioIdx] == (uint32_t)featureSelect) + { + return (adi_adrv904x_GpioAnaPinSel_e)gpioIdx; + } + } + return ADI_ADRV904X_GPIO_ANA_INVALID; +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_StreamImageWrite(adi_adrv904x_Device_t* const device, + uint32_t byteOffset, + const uint8_t binary[], + uint32_t byteCount) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t binaryImageSize = 0U; + uint32_t binaryImageOffset = 0U; + uint32_t i = 0U; + uint32_t addr = 0U; + uint32_t mask = 0U; + uint32_t word1 = 0U; + uint32_t binOffset = 0U; + uint32_t streamCtl = 0U; + uint8_t byte1 = 0U; + uint32_t imageSize = 0U; + uint32_t imageOffset = 0U; + uint32_t streamCtlAddr[] = { + ADRV904X_ADDR_MAIN_STREAM_CTL, + //todo- this value needs to be update when the kfa stream_reset bit is enabled + ADRV904X_ADDR_KFA_STREAM_CTL, + ADRV904X_ADDR_TX0_STREAM_CTL, + ADRV904X_ADDR_TX1_STREAM_CTL, + ADRV904X_ADDR_TX2_STREAM_CTL, + ADRV904X_ADDR_TX3_STREAM_CTL, + ADRV904X_ADDR_TX4_STREAM_CTL, + ADRV904X_ADDR_TX5_STREAM_CTL, + ADRV904X_ADDR_TX6_STREAM_CTL, + ADRV904X_ADDR_TX7_STREAM_CTL, + ADRV904X_ADDR_RX0_STREAM_CTL, + ADRV904X_ADDR_RX1_STREAM_CTL, + ADRV904X_ADDR_RX2_STREAM_CTL, + ADRV904X_ADDR_RX3_STREAM_CTL, + ADRV904X_ADDR_RX4_STREAM_CTL, + ADRV904X_ADDR_RX5_STREAM_CTL, + ADRV904X_ADDR_RX6_STREAM_CTL, + ADRV904X_ADDR_RX7_STREAM_CTL, + ADRV904X_ADDR_ORX0_STREAM_CTL, + ADRV904X_ADDR_ORX1_STREAM_CTL + }; + + /* Default value assigned by hardware */ + uint32_t coreSliceControlDefaultVal = 0x80U; + + /* Number of bytes in the stream_image.bin header that contains + * all the meta-data required to parse stream_image.bin + * This also indicates the byte address where the core processor + * starts. + */ + static const uint32_t STREAM_METADATA_HEADER_SIZE_START_BYTE = 24U; + static const uint32_t STREAM_METADATA_HEADER_SIZE_DATA_LENGTH = 4U; + static const uint32_t STREAM_IMAGE_SLICE_INFO_START_BYTE = 28U; + static const uint32_t STREAM_PROCESSOR_META_DATA_SIZE_BYTES = 8U; + static const uint32_t STREAM_IMAGE_GPIO00_START_BYTE = 190U; + static const uint32_t STREAM_IMAGE_TXORXMAPPINGMODE_START_BYTE = 287U; + static const uint32_t STREAM_IMAGE_TXORXOBSERVABILITY_START_BYTE = 289U; + static const uint32_t STREAM_IMAGE_TXTOORXMAPPINGPINTABLEORX0_00_START_BYTE = 291U; + static const uint32_t STREAM_IMAGE_TXTOORXMAPPINGPINTABLEORX1_00_START_BYTE = 355U; + static const uint32_t STREAM_IMAGE_TXTOORXMAPPINAUTOSWITCHORXATTENENABLE_START_BYTE = 419U; + static const uint32_t STREAM_IMAGE_TXTOORXMAPPINAUTOSWITCHORXNCOENABLE_START_BYTE = 420U; + + + static const uint32_t STREAM_IMAGE_VSWRDIRORX0GPIOPOLARITY_START_BYTE = 437U; + static const uint32_t STREAM_IMAGE_VSWRDIRORX1GPIOPOLARITY_START_BYTE = 438U; + static const uint32_t STREAM_IMAGE_VSWRDIRCOMMONGPIOPOLARITY_START_BYTE = 439U; + static const uint32_t STREAM_IMAGE_ANA_GPIO00_START_BYTE = 440U; + static const uint32_t STREAM_IMAGE_EA_PA_EN_PIN_MODE_START_BYTE = 504U; + static const uint32_t STREAM_IMAGE_EA_LNA_EN_PIN_MODE_START_BYTE = 508U; + static const uint32_t STREAM_IMAGE_EA_OC_FUSE_EN_PIN_MODE_START_BYTE = 508U; + static const uint32_t STREAM_IMAGE_EA_ALARM_INPUT_PIN_MODE_START_BYTE = 512U; + static const uint32_t STREAM_IMAGE_EA_AUX_GRP0_OUT_PIN_MODE_START_BYTE = 563U; + static const uint32_t STREAM_IMAGE_EA_AUX_GRP1_OUT_PIN_MODE_START_BYTE = 579U; + static const uint32_t STREAM_IMAGE_DTX_EVENT_WAIT_TIME_NS = 596U; + + uint32_t FINAL_STREAM_IMAGE_HEADER_SIZE_BYTES = 0U; + + uint32_t gpioAssignments[ADI_ADRV904X_GPIO_COUNT] = { 0U }; + + uint32_t anaGpioAssignments[ADI_ADRV904X_GPIO_ANALOG_COUNT] = { 0U }; + adi_adrv904x_GpioPinSel_e tmpDig = ADI_ADRV904X_GPIO_INVALID; + adi_adrv904x_GpioAnaPinSel_e tmpAna = ADI_ADRV904X_GPIO_ANA_INVALID; + adi_adrv904x_GpioGenericPinSel_e tmpGen = ADI_ADRV904X_GPIO_GENERIC_INVALID; + int bitIdx = 0U; + uint32_t gpioIdx = 0U; + uint32_t idx = 0U; + + + /* CPU stream download order: main, kfa, tx0/1/2/3/4/5/6/7, rx0/1/2/3/4/5/6/7, orx0/1 */ + static const uint32_t streamChannel[] = { + 0xFFFFFFFFU, + 0x0U, + ADI_ADRV904X_TX0 << ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET, + ADI_ADRV904X_TX1 << ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET, + ADI_ADRV904X_TX2 << ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET, + ADI_ADRV904X_TX3 << ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET, + ADI_ADRV904X_TX4 << ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET, + ADI_ADRV904X_TX5 << ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET, + ADI_ADRV904X_TX6 << ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET, + ADI_ADRV904X_TX7 << ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET, + ADI_ADRV904X_RX0, + ADI_ADRV904X_RX1, + ADI_ADRV904X_RX2, + ADI_ADRV904X_RX3, + ADI_ADRV904X_RX4, + ADI_ADRV904X_RX5, + ADI_ADRV904X_RX6, + ADI_ADRV904X_RX7, + ADI_ADRV904X_ORX0, + ADI_ADRV904X_ORX1 + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, binary, cleanup); + + if ((byteCount == 0U) || + ((byteCount % 4U) > 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + byteCount, + "Invalid byteCount. Must be multiple of 4."); + goto cleanup; + } + + if ((byteOffset % 4U) > 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + byteCount, + "Invalid byteOffset. Must be multiple of 4."); + goto cleanup; + } + + /* When byteOffset is zero that indicates the first time this function. + * has been called for a particular stream_image.bin so the header info + * must be extracted. We need all the information extracted in a single + * call which is why min chunk size is the same as FINAL_STREAM_IMAGE_HEADER_SIZE_BYTES. + * */ + if (byteOffset == 0U) + { + /* Check that enough data was passed in to read the stream header size from the stream */ + if (byteCount < STREAM_METADATA_HEADER_SIZE_START_BYTE + STREAM_METADATA_HEADER_SIZE_DATA_LENGTH) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + byteCount, + "Must pass in chunk size greater than current stream image header."); + goto cleanup; + } + + /* Glean stream header size from the binary itself */ + FINAL_STREAM_IMAGE_HEADER_SIZE_BYTES = adrv904x_CpuIntFromBytesGet(binary + STREAM_METADATA_HEADER_SIZE_START_BYTE, + STREAM_METADATA_HEADER_SIZE_DATA_LENGTH); + + /* Verify that enough data was passed in to read the entire stream header */ + if (byteCount < FINAL_STREAM_IMAGE_HEADER_SIZE_BYTES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + byteCount, + "Must pass in chunk size greater than current stream image header."); + goto cleanup; + } + +#if ADI_ADRV904X_API_VERSION_RANGE_CHECK > 0 + { + adi_adrv904x_Version_t version = { 0U, 0U, 0U, 0U }; + adi_adrv904x_Version_t minVersion = { 0U, 0U, 0U, 0U }; + static const uint32_t STREAM_IMAGE_VERSION_ID_START_BYTE = 8U; + + version.majorVer = adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_VERSION_ID_START_BYTE + 0U, 4U); + version.minorVer = adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_VERSION_ID_START_BYTE + 4U, 4U); + version.maintenanceVer = adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_VERSION_ID_START_BYTE + 8U, 4U); + version.buildVer = adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_VERSION_ID_START_BYTE + 12U, 4U); + + recoveryAction = adi_adrv904x_ApiVersionGet(device, &minVersion); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Stream Binary Version Get Issue"); + goto cleanup; + } + + recoveryAction = adrv904x_ApiVersionRangeCheck(device, &version, &minVersion, &minVersion); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Stream Binary Range Check Issue"); + goto cleanup; + } + } +#endif + + /* Glean the 24 GPIO selections made in the Stream Binary */ + for (gpioIdx = 0U; gpioIdx < ADI_ADRV904X_GPIO_COUNT; gpioIdx++) + { + gpioAssignments[gpioIdx] = adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_GPIO00_START_BYTE + (gpioIdx * 4U), 4U); + + /* If stream feature is a basic stream input that requires no special handling, add it to generic Stream triggers list */ + switch (gpioAssignments[gpioIdx]) + { + case (ADRV904X_STREAM_GPIO_TX_ANTENNA_CAL): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_RX_ANTENNA_CAL): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_TX_PAP_FOR_EXT_LO0_UNLOCK): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_TX_PAP_FOR_EXT_LO1_UNLOCK): /* Fallthrough */ + + case (ADRV904X_STREAM_GPIO_ALARM_INPUT_0): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_ALARM_INPUT_1): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_ALARM_INPUT_2): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_ALARM_INPUT_3): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_ALARM_INPUT_4): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_ALARM_INPUT_5): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_ALARM_INPUT_6): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_ALARM_INPUT_7): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_ALARM_INPUT_8): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_ALARM_INPUT_9): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_RS_PATTERN_SWITCHING): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX0): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX1): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX2): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX3): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX4): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX5): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX6): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX7): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_SBET_LATCH_DPD_MODEL_INDEX): /* Fallthrough */ + device->devStateInfo.streamGpioMapping.streamGpInput[gpioIdx] = (adi_adrv904x_GpioPinSel_e)gpioIdx; + break; + + + // The RS_SSB_SYNC_PIN input to ADRV904X stream processor GP input is enabled dynamically by API which starts RS + case (ADRV904X_STREAM_GPIO_RS_SSB_SYNC_PIN): /* Fallthrough */ + + // Default: Do Nothing + default: + device->devStateInfo.streamGpioMapping.streamGpInput[gpioIdx] = ADI_ADRV904X_GPIO_INVALID; + break; + } + + + switch (gpioAssignments[gpioIdx]) + { + case (ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN0): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN1): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN2): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN3): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN4): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN5): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN6): /* Fallthrough */ + case (ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN7): /* Fallthrough */ + + device->devStateInfo.streamGpioMapping.streamGpDigOutput[gpioIdx] = (adi_adrv904x_GpioPinSel_e)gpioIdx; + break; + + // Default: Do Nothing + default: + device->devStateInfo.streamGpioMapping.streamGpDigOutput[gpioIdx] = ADI_ADRV904X_GPIO_INVALID; + break; + } + } + + + for (gpioIdx = 0U; gpioIdx < ADI_ADRV904X_GPIO_ANALOG_COUNT; gpioIdx++) + { + anaGpioAssignments[gpioIdx] = adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_ANA_GPIO00_START_BYTE + (gpioIdx * 4U), 4U); + + switch (anaGpioAssignments[gpioIdx]) + { + case (ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN0): /* Fallthrough */ + case (ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN1): /* Fallthrough */ + case (ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN2): /* Fallthrough */ + case (ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN3): /* Fallthrough */ + case (ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN4): /* Fallthrough */ + case (ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN5): /* Fallthrough */ + case (ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN6): /* Fallthrough */ + case (ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN7): /* Fallthrough */ + + device->devStateInfo.streamGpioMapping.streamGpAnaOutput[gpioIdx] = (adi_adrv904x_GpioAnaPinSel_e)gpioIdx; + break; + + // Default: Do Nothing + default : + device->devStateInfo.streamGpioMapping.streamGpAnaOutput[gpioIdx] = ADI_ADRV904X_GPIO_ANA_INVALID; + break; + } + } + + /* Update device handle Tx Orx Mapping config */ + device->devStateInfo.txToOrxMappingConfig.gpioSelect[0U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT0); + device->devStateInfo.txToOrxMappingConfig.gpioSelect[1U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT1); + device->devStateInfo.txToOrxMappingConfig.gpioSelect[2U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT2); + device->devStateInfo.txToOrxMappingConfig.gpioSelect[3U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT3); + device->devStateInfo.txToOrxMappingConfig.gpioSelect[4U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT4); + device->devStateInfo.txToOrxMappingConfig.gpioSelect[5U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT5); + device->devStateInfo.txToOrxMappingConfig.gpioSelect[6U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT6); + device->devStateInfo.txToOrxMappingConfig.gpioSelect[7U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_TX_TO_ORX_MAPPING_BIT7); + + + device->devStateInfo.alarmGpioConfig.alarmInputGpio[0U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_ALARM_INPUT_0); + device->devStateInfo.alarmGpioConfig.alarmInputGpio[1U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_ALARM_INPUT_1); + device->devStateInfo.alarmGpioConfig.alarmInputGpio[2U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_ALARM_INPUT_2); + device->devStateInfo.alarmGpioConfig.alarmInputGpio[3U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_ALARM_INPUT_3); + device->devStateInfo.alarmGpioConfig.alarmInputGpio[4U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_ALARM_INPUT_4); + device->devStateInfo.alarmGpioConfig.alarmInputGpio[5U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_ALARM_INPUT_5); + device->devStateInfo.alarmGpioConfig.alarmInputGpio[6U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_ALARM_INPUT_6); + device->devStateInfo.alarmGpioConfig.alarmInputGpio[7U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_ALARM_INPUT_7); + device->devStateInfo.alarmGpioConfig.alarmInputGpio[8U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_ALARM_INPUT_8); + device->devStateInfo.alarmGpioConfig.alarmInputGpio[9U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_ALARM_INPUT_9); + + device->devStateInfo.alarmGpioConfig.lnaEnOutDigGpio[0U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_LNA_EN_OUT_0); + device->devStateInfo.alarmGpioConfig.lnaEnOutDigGpio[1U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_LNA_EN_OUT_1); + device->devStateInfo.alarmGpioConfig.lnaEnOutDigGpio[2U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_LNA_EN_OUT_2); + device->devStateInfo.alarmGpioConfig.lnaEnOutDigGpio[3U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_LNA_EN_OUT_3); + device->devStateInfo.alarmGpioConfig.lnaEnOutDigGpio[4U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_LNA_EN_OUT_4); + device->devStateInfo.alarmGpioConfig.lnaEnOutDigGpio[5U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_LNA_EN_OUT_5); + device->devStateInfo.alarmGpioConfig.lnaEnOutDigGpio[6U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_LNA_EN_OUT_6); + device->devStateInfo.alarmGpioConfig.lnaEnOutDigGpio[7U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_LNA_EN_OUT_7); + + device->devStateInfo.alarmGpioConfig.paEnOutDigGpio[0U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_PA_EN_OUT_0); + device->devStateInfo.alarmGpioConfig.paEnOutDigGpio[1U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_PA_EN_OUT_1); + device->devStateInfo.alarmGpioConfig.paEnOutDigGpio[2U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_PA_EN_OUT_2); + device->devStateInfo.alarmGpioConfig.paEnOutDigGpio[3U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_PA_EN_OUT_3); + device->devStateInfo.alarmGpioConfig.paEnOutDigGpio[4U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_PA_EN_OUT_4); + device->devStateInfo.alarmGpioConfig.paEnOutDigGpio[5U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_PA_EN_OUT_5); + device->devStateInfo.alarmGpioConfig.paEnOutDigGpio[6U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_PA_EN_OUT_6); + device->devStateInfo.alarmGpioConfig.paEnOutDigGpio[7U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_PA_EN_OUT_7); + + device->devStateInfo.alarmGpioConfig.ocFuseEnOutDigGpio[0U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_0); + device->devStateInfo.alarmGpioConfig.ocFuseEnOutDigGpio[1U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_1); + device->devStateInfo.alarmGpioConfig.ocFuseEnOutDigGpio[2U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_2); + device->devStateInfo.alarmGpioConfig.ocFuseEnOutDigGpio[3U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_3); + device->devStateInfo.alarmGpioConfig.ocFuseEnOutDigGpio[4U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_4); + device->devStateInfo.alarmGpioConfig.ocFuseEnOutDigGpio[5U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_5); + device->devStateInfo.alarmGpioConfig.ocFuseEnOutDigGpio[6U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_6); + device->devStateInfo.alarmGpioConfig.ocFuseEnOutDigGpio[7U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_OC_FUSE_EN_OUT_7); + + device->devStateInfo.alarmGpioConfig.auxGrp0OutDigGpio[0U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_0); + device->devStateInfo.alarmGpioConfig.auxGrp0OutDigGpio[1U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_1); + device->devStateInfo.alarmGpioConfig.auxGrp0OutDigGpio[2U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_2); + device->devStateInfo.alarmGpioConfig.auxGrp0OutDigGpio[3U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_3); + device->devStateInfo.alarmGpioConfig.auxGrp0OutDigGpio[4U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_4); + device->devStateInfo.alarmGpioConfig.auxGrp0OutDigGpio[5U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_5); + device->devStateInfo.alarmGpioConfig.auxGrp0OutDigGpio[6U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_6); + device->devStateInfo.alarmGpioConfig.auxGrp0OutDigGpio[7U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_AUX_GRP0_OUT_7); + + device->devStateInfo.alarmGpioConfig.auxGrp1OutDigGpio[0U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_0); + device->devStateInfo.alarmGpioConfig.auxGrp1OutDigGpio[1U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_1); + device->devStateInfo.alarmGpioConfig.auxGrp1OutDigGpio[2U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_2); + device->devStateInfo.alarmGpioConfig.auxGrp1OutDigGpio[3U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_3); + device->devStateInfo.alarmGpioConfig.auxGrp1OutDigGpio[4U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_4); + device->devStateInfo.alarmGpioConfig.auxGrp1OutDigGpio[5U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_5); + device->devStateInfo.alarmGpioConfig.auxGrp1OutDigGpio[6U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_6); + device->devStateInfo.alarmGpioConfig.auxGrp1OutDigGpio[7U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_AUX_GRP1_OUT_7); + + device->devStateInfo.alarmGpioConfig.lnaEnOutAnaGpio[0U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_0); + device->devStateInfo.alarmGpioConfig.lnaEnOutAnaGpio[1U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_1); + device->devStateInfo.alarmGpioConfig.lnaEnOutAnaGpio[2U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_2); + device->devStateInfo.alarmGpioConfig.lnaEnOutAnaGpio[3U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_3); + device->devStateInfo.alarmGpioConfig.lnaEnOutAnaGpio[4U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_4); + device->devStateInfo.alarmGpioConfig.lnaEnOutAnaGpio[5U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_5); + device->devStateInfo.alarmGpioConfig.lnaEnOutAnaGpio[6U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_6); + device->devStateInfo.alarmGpioConfig.lnaEnOutAnaGpio[7U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_LNA_EN_OUT_7); + + device->devStateInfo.alarmGpioConfig.paEnOutAnaGpio[0U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_0); + device->devStateInfo.alarmGpioConfig.paEnOutAnaGpio[1U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_1); + device->devStateInfo.alarmGpioConfig.paEnOutAnaGpio[2U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_2); + device->devStateInfo.alarmGpioConfig.paEnOutAnaGpio[3U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_3); + device->devStateInfo.alarmGpioConfig.paEnOutAnaGpio[4U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_4); + device->devStateInfo.alarmGpioConfig.paEnOutAnaGpio[5U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_5); + device->devStateInfo.alarmGpioConfig.paEnOutAnaGpio[6U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_6); + device->devStateInfo.alarmGpioConfig.paEnOutAnaGpio[7U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_PA_EN_OUT_7); + + device->devStateInfo.alarmGpioConfig.ocFuseEnOutAnaGpio[0U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_0); + device->devStateInfo.alarmGpioConfig.ocFuseEnOutAnaGpio[1U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_1); + device->devStateInfo.alarmGpioConfig.ocFuseEnOutAnaGpio[2U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_2); + device->devStateInfo.alarmGpioConfig.ocFuseEnOutAnaGpio[3U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_3); + device->devStateInfo.alarmGpioConfig.ocFuseEnOutAnaGpio[4U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_4); + device->devStateInfo.alarmGpioConfig.ocFuseEnOutAnaGpio[5U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_5); + device->devStateInfo.alarmGpioConfig.ocFuseEnOutAnaGpio[6U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_6); + device->devStateInfo.alarmGpioConfig.ocFuseEnOutAnaGpio[7U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANA_GPIO_OC_FUSE_EN_OUT_7); + + device->devStateInfo.alarmGpioConfig.auxGrp0OutAnaGpio[0U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_0); + device->devStateInfo.alarmGpioConfig.auxGrp0OutAnaGpio[1U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_1); + device->devStateInfo.alarmGpioConfig.auxGrp0OutAnaGpio[2U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_2); + device->devStateInfo.alarmGpioConfig.auxGrp0OutAnaGpio[3U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_3); + device->devStateInfo.alarmGpioConfig.auxGrp0OutAnaGpio[4U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_4); + device->devStateInfo.alarmGpioConfig.auxGrp0OutAnaGpio[5U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_5); + device->devStateInfo.alarmGpioConfig.auxGrp0OutAnaGpio[6U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_6); + device->devStateInfo.alarmGpioConfig.auxGrp0OutAnaGpio[7U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP0_OUT_7); + + device->devStateInfo.alarmGpioConfig.auxGrp1OutAnaGpio[0U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_0); + device->devStateInfo.alarmGpioConfig.auxGrp1OutAnaGpio[1U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_1); + device->devStateInfo.alarmGpioConfig.auxGrp1OutAnaGpio[2U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_2); + device->devStateInfo.alarmGpioConfig.auxGrp1OutAnaGpio[3U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_3); + device->devStateInfo.alarmGpioConfig.auxGrp1OutAnaGpio[4U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_4); + device->devStateInfo.alarmGpioConfig.auxGrp1OutAnaGpio[5U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_5); + device->devStateInfo.alarmGpioConfig.auxGrp1OutAnaGpio[6U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_6); + device->devStateInfo.alarmGpioConfig.auxGrp1OutAnaGpio[7U] = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANALOG_GPIO_AUX_GRP1_OUT_7); + + /* Update device handle alarm input config */ + device->devStateInfo.alarmGpioConfig.alarmInputGpioPinMode[0U] = + (adi_adrv904x_AlarmInputGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_ALARM_INPUT_PIN_MODE_START_BYTE + 0, 2U); + device->devStateInfo.alarmGpioConfig.alarmInputGpioPinMode[1U] = + (adi_adrv904x_AlarmInputGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_ALARM_INPUT_PIN_MODE_START_BYTE + 2, 2U); + device->devStateInfo.alarmGpioConfig.alarmInputGpioPinMode[2U] = + (adi_adrv904x_AlarmInputGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_ALARM_INPUT_PIN_MODE_START_BYTE + 4, 2U); + device->devStateInfo.alarmGpioConfig.alarmInputGpioPinMode[3U] = + (adi_adrv904x_AlarmInputGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_ALARM_INPUT_PIN_MODE_START_BYTE + 6, 2U); + device->devStateInfo.alarmGpioConfig.alarmInputGpioPinMode[4U] = + (adi_adrv904x_AlarmInputGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_ALARM_INPUT_PIN_MODE_START_BYTE + 8, 2U); + device->devStateInfo.alarmGpioConfig.alarmInputGpioPinMode[5U] = + (adi_adrv904x_AlarmInputGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_ALARM_INPUT_PIN_MODE_START_BYTE + 10, 2U); + device->devStateInfo.alarmGpioConfig.alarmInputGpioPinMode[6U] = + (adi_adrv904x_AlarmInputGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_ALARM_INPUT_PIN_MODE_START_BYTE + 12, 2U); + device->devStateInfo.alarmGpioConfig.alarmInputGpioPinMode[7U] = + (adi_adrv904x_AlarmInputGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_ALARM_INPUT_PIN_MODE_START_BYTE + 14, 2U); + device->devStateInfo.alarmGpioConfig.alarmInputGpioPinMode[8U] = + (adi_adrv904x_AlarmInputGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_ALARM_INPUT_PIN_MODE_START_BYTE + 16, 2U); + device->devStateInfo.alarmGpioConfig.alarmInputGpioPinMode[9U] = + (adi_adrv904x_AlarmInputGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_ALARM_INPUT_PIN_MODE_START_BYTE + 18, 2U); + + /* Update device handle alarm output config */ + device->devStateInfo.alarmGpioConfig.paEnOutGpioPinMode = + (adi_adrv904x_OutGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_PA_EN_PIN_MODE_START_BYTE, 4U); + device->devStateInfo.alarmGpioConfig.lnaEnOutGpioPinMode = + (adi_adrv904x_OutGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_LNA_EN_PIN_MODE_START_BYTE, 4U); + device->devStateInfo.alarmGpioConfig.ocFuseEnOutGpioPinMode = + (adi_adrv904x_OutGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_OC_FUSE_EN_PIN_MODE_START_BYTE, 4U); + + device->devStateInfo.alarmGpioConfig.auxGrp0OutGpioPinMode[0U] = + (adi_adrv904x_OutGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_AUX_GRP0_OUT_PIN_MODE_START_BYTE + 0, 2U); /* Check this >?>?>?*/ + device->devStateInfo.alarmGpioConfig.auxGrp0OutGpioPinMode[1U] = + (adi_adrv904x_OutGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_AUX_GRP0_OUT_PIN_MODE_START_BYTE + 2, 2U); + device->devStateInfo.alarmGpioConfig.auxGrp0OutGpioPinMode[2U] = + (adi_adrv904x_OutGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_AUX_GRP0_OUT_PIN_MODE_START_BYTE + 4, 2U); + device->devStateInfo.alarmGpioConfig.auxGrp0OutGpioPinMode[3U] = + (adi_adrv904x_OutGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_AUX_GRP0_OUT_PIN_MODE_START_BYTE + 6, 2U); + device->devStateInfo.alarmGpioConfig.auxGrp0OutGpioPinMode[4U] = + (adi_adrv904x_OutGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_AUX_GRP0_OUT_PIN_MODE_START_BYTE + 8, 2U); + device->devStateInfo.alarmGpioConfig.auxGrp0OutGpioPinMode[5U] = + (adi_adrv904x_OutGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_AUX_GRP0_OUT_PIN_MODE_START_BYTE + 10, 2U); + device->devStateInfo.alarmGpioConfig.auxGrp0OutGpioPinMode[6U] = + (adi_adrv904x_OutGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_AUX_GRP0_OUT_PIN_MODE_START_BYTE + 12, 2U); + device->devStateInfo.alarmGpioConfig.auxGrp0OutGpioPinMode[7U] = + (adi_adrv904x_OutGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_AUX_GRP0_OUT_PIN_MODE_START_BYTE + 14, 2U); + + device->devStateInfo.alarmGpioConfig.auxGrp1OutGpioPinMode[0U] = + (adi_adrv904x_OutGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_AUX_GRP1_OUT_PIN_MODE_START_BYTE + 0, 2U); + device->devStateInfo.alarmGpioConfig.auxGrp1OutGpioPinMode[1U] = + (adi_adrv904x_OutGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_AUX_GRP1_OUT_PIN_MODE_START_BYTE + 2, 2U); + device->devStateInfo.alarmGpioConfig.auxGrp1OutGpioPinMode[2U] = + (adi_adrv904x_OutGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_AUX_GRP1_OUT_PIN_MODE_START_BYTE + 4, 2U); + device->devStateInfo.alarmGpioConfig.auxGrp1OutGpioPinMode[3U] = + (adi_adrv904x_OutGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_AUX_GRP1_OUT_PIN_MODE_START_BYTE + 6, 2U); + device->devStateInfo.alarmGpioConfig.auxGrp1OutGpioPinMode[4U] = + (adi_adrv904x_OutGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_AUX_GRP1_OUT_PIN_MODE_START_BYTE + 8, 2U); + device->devStateInfo.alarmGpioConfig.auxGrp1OutGpioPinMode[5U] = + (adi_adrv904x_OutGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_AUX_GRP1_OUT_PIN_MODE_START_BYTE + 10, 2U); + device->devStateInfo.alarmGpioConfig.auxGrp1OutGpioPinMode[6U] = + (adi_adrv904x_OutGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_AUX_GRP1_OUT_PIN_MODE_START_BYTE + 12, 2U); + device->devStateInfo.alarmGpioConfig.auxGrp1OutGpioPinMode[7U] = + (adi_adrv904x_OutGpioPinModes_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_EA_AUX_GRP1_OUT_PIN_MODE_START_BYTE + 14, 2U); + + /* Update device handle DTX input config */ + device->devStateInfo.dtxInputMapping.dtxInput[0U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_DTX_INPUT_0); + device->devStateInfo.dtxInputMapping.dtxInput[1U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_DTX_INPUT_1); + device->devStateInfo.dtxInputMapping.dtxInput[2U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_DTX_INPUT_2); + device->devStateInfo.dtxInputMapping.dtxInput[3U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_DTX_INPUT_3); + device->devStateInfo.dtxInputMapping.dtxInput[4U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_DTX_INPUT_4); + device->devStateInfo.dtxInputMapping.dtxInput[5U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_DTX_INPUT_5); + device->devStateInfo.dtxInputMapping.dtxInput[6U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_DTX_INPUT_6); + device->devStateInfo.dtxInputMapping.dtxInput[7U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_DTX_INPUT_7); + device->devStateInfo.dtxInputMapping.dtxEventWaitTimeNs = (uint32_t)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_DTX_EVENT_WAIT_TIME_NS, 4U); + + /* Update device handle GPIO Model Switch input config */ + device->devStateInfo.modelSwitchInputMapping.modelSwitchInput[0U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX0); + device->devStateInfo.modelSwitchInputMapping.modelSwitchInput[1U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX1); + device->devStateInfo.modelSwitchInputMapping.modelSwitchInput[2U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX2); + device->devStateInfo.modelSwitchInputMapping.modelSwitchInput[3U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX3); + device->devStateInfo.modelSwitchInputMapping.modelSwitchInput[4U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX4); + device->devStateInfo.modelSwitchInputMapping.modelSwitchInput[5U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX5); + device->devStateInfo.modelSwitchInputMapping.modelSwitchInput[6U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX6); + device->devStateInfo.modelSwitchInputMapping.modelSwitchInput[7U] = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_MODEL_SWITCH_INPUT_TX7); + + /* Update GPIO TDD SW to either Digital or Analog */ + device->devStateInfo.digGpioTddSw = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_TDD_SW); + device->devStateInfo.anaGpioTddSw = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANALOG_GPIO_TDD_SW); + + /* Update device handle SBET Latch Power index input config */ + device->devStateInfo.sbetLatchModelIndex = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_SBET_LATCH_DPD_MODEL_INDEX); + + /* Update GPIO Predrive to either Digital or Analog */ + device->devStateInfo.digGpioPredrive = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_PREDRIVE_EN); + device->devStateInfo.anaGpioPredrive = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, ADRV904X_STREAM_ANALOG_GPIO_PREDRIVE_EN); + + /* Decipher DFE Ctrl Mapping GPIO selections into final Cfg value */ + for (bitIdx = 0U; bitIdx < ADI_ADRV904X_DFE_CTRL_TX_TO_ORX_MAPPING_GPIO_MAX; bitIdx++) + { + adrv904x_StreamGpioFeatureSelection_e featureCmnDig = ADRV904X_STREAM_GPIO_UNUSED; + adrv904x_StreamGpioFeatureSelection_e featureOrx0Dig = ADRV904X_STREAM_GPIO_UNUSED; + adrv904x_StreamGpioFeatureSelection_e featureOrx1Dig = ADRV904X_STREAM_GPIO_UNUSED; + + adrv904x_StreamAnaGpioFeatureSelection_e featureCmnAna = ADRV904X_STREAM_ANA_GPIO_UNUSED; + adrv904x_StreamAnaGpioFeatureSelection_e featureOrx0Ana = ADRV904X_STREAM_ANA_GPIO_UNUSED; + adrv904x_StreamAnaGpioFeatureSelection_e featureOrx1Ana = ADRV904X_STREAM_ANA_GPIO_UNUSED; + + if (bitIdx < 4) + { + featureCmnDig = (adrv904x_StreamGpioFeatureSelection_e)(ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT0 + bitIdx); + featureOrx0Dig = (adrv904x_StreamGpioFeatureSelection_e)(ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX0_MAP_BIT0 + bitIdx); + featureOrx1Dig = (adrv904x_StreamGpioFeatureSelection_e)(ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX1_MAP_BIT0 + bitIdx); + + featureCmnAna = (adrv904x_StreamAnaGpioFeatureSelection_e)(ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT0 + bitIdx); + featureOrx0Ana = (adrv904x_StreamAnaGpioFeatureSelection_e)(ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX0_MAP_BIT0 + bitIdx); + featureOrx1Ana = (adrv904x_StreamAnaGpioFeatureSelection_e)(ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX1_MAP_BIT0 + bitIdx); + } + else + { + featureCmnDig = (adrv904x_StreamGpioFeatureSelection_e)(ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT4 + (bitIdx - 4)); + featureOrx0Dig = (adrv904x_StreamGpioFeatureSelection_e)(ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX0_MAP_BIT4 + (bitIdx - 4)); + featureOrx1Dig = (adrv904x_StreamGpioFeatureSelection_e)(ADRV904X_STREAM_GPIO_DFE_TX_TO_ORX1_MAP_BIT4 + (bitIdx - 4)); + + featureCmnAna = (adrv904x_StreamAnaGpioFeatureSelection_e)(ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX_CMN_MAP_BIT4 + (bitIdx - 4)); + featureOrx0Ana = (adrv904x_StreamAnaGpioFeatureSelection_e)(ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX0_MAP_BIT4 + (bitIdx - 4)); + featureOrx1Ana = (adrv904x_StreamAnaGpioFeatureSelection_e)(ADRV904X_STREAM_ANALOG_GPIO_DFE_TX_TO_ORX1_MAP_BIT4 + (bitIdx - 4)); + } + + /* Look for CMN mapping bit for this bitIdx first */ + tmpDig = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, featureCmnDig); + tmpAna = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, featureCmnAna); + tmpGen = + (tmpDig != ADI_ADRV904X_GPIO_INVALID) ? (adi_adrv904x_GpioGenericPinSel_e)(ADI_ADRV904X_GPIO_GENERIC_DIG_START + tmpDig) : + (tmpAna != ADI_ADRV904X_GPIO_ANA_INVALID) ? (adi_adrv904x_GpioGenericPinSel_e)(ADI_ADRV904X_GPIO_GENERIC_ANA_START + tmpAna) : + (ADI_ADRV904X_GPIO_GENERIC_INVALID); + + device->devStateInfo.dfeCtrlTxToOrxMappingConfig.gpioSelectOrx0[bitIdx] = tmpGen; + device->devStateInfo.dfeCtrlTxToOrxMappingConfig.gpioSelectOrx1[bitIdx] = tmpGen; + + /* If we didn't find a valid CMN mapping bit selected for bitIdx, then look for orx-specific mapping bits */ + if (device->devStateInfo.dfeCtrlTxToOrxMappingConfig.gpioSelectOrx0[bitIdx] == ADI_ADRV904X_GPIO_GENERIC_INVALID) + { + tmpDig = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, featureOrx0Dig); + tmpAna = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, featureOrx0Ana); + tmpGen = + (tmpDig != ADI_ADRV904X_GPIO_INVALID) ? (adi_adrv904x_GpioGenericPinSel_e)(ADI_ADRV904X_GPIO_GENERIC_DIG_START + tmpDig) : + (tmpAna != ADI_ADRV904X_GPIO_ANA_INVALID) ? (adi_adrv904x_GpioGenericPinSel_e)(ADI_ADRV904X_GPIO_GENERIC_ANA_START + tmpAna) : + (ADI_ADRV904X_GPIO_GENERIC_INVALID); + + device->devStateInfo.dfeCtrlTxToOrxMappingConfig.gpioSelectOrx0[bitIdx] = tmpGen; + } + + if (device->devStateInfo.dfeCtrlTxToOrxMappingConfig.gpioSelectOrx1[bitIdx] == ADI_ADRV904X_GPIO_GENERIC_INVALID) + { + tmpDig = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, featureOrx1Dig); + tmpAna = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, featureOrx1Ana); + tmpGen = + (tmpDig != ADI_ADRV904X_GPIO_INVALID) ? (adi_adrv904x_GpioGenericPinSel_e)(ADI_ADRV904X_GPIO_GENERIC_DIG_START + tmpDig) : + (tmpAna != ADI_ADRV904X_GPIO_ANA_INVALID) ? (adi_adrv904x_GpioGenericPinSel_e)(ADI_ADRV904X_GPIO_GENERIC_ANA_START + tmpAna) : + (ADI_ADRV904X_GPIO_GENERIC_INVALID); + + device->devStateInfo.dfeCtrlTxToOrxMappingConfig.gpioSelectOrx1[bitIdx] = tmpGen; + } + } + + /* Decipher Stream Output Antenna Cal GPIO selections into final Cfg value */ + for (bitIdx = 0U; bitIdx < ADI_ADRV904X_MAX_STREAM_GPIO_ANTENNA_CAL_OUT_PINS; bitIdx++) + { + /* Check for Digital GPIO selection. If not, check for Analog GPIO selection. If neither are found, default to INVALID (which means none) */ + adrv904x_StreamGpioFeatureSelection_e featureDig = (adrv904x_StreamGpioFeatureSelection_e) (ADRV904X_STREAM_GPIO_ANTENNA_CAL_OUT_PIN0 + bitIdx); + adrv904x_StreamAnaGpioFeatureSelection_e featureAna = (adrv904x_StreamAnaGpioFeatureSelection_e)(ADRV904X_STREAM_ANALOG_GPIO_ANTENNA_CAL_OUT_PIN0 + bitIdx); + + tmpDig = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, featureDig); + tmpAna = adrv904x_StreamGleanAnaGpioNumberGet(anaGpioAssignments, featureAna); + tmpGen = + (tmpDig != ADI_ADRV904X_GPIO_INVALID) ? (adi_adrv904x_GpioGenericPinSel_e)(ADI_ADRV904X_GPIO_GENERIC_DIG_START + tmpDig) : + (tmpAna != ADI_ADRV904X_GPIO_ANA_INVALID) ? (adi_adrv904x_GpioGenericPinSel_e)(ADI_ADRV904X_GPIO_GENERIC_ANA_START + tmpAna) : + (ADI_ADRV904X_GPIO_GENERIC_INVALID); + device->devStateInfo.streamGpioAntCalOutCfg.gpioSelect[bitIdx] = tmpGen; + } + + device->devStateInfo.txToOrxMappingConfig.txObservability = (uint16_t)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_TXORXOBSERVABILITY_START_BYTE, 2U); + + device->devStateInfo.txToOrxMappingConfig.mode = (adi_adrv904x_TxToOrxMappingMode_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_TXORXMAPPINGMODE_START_BYTE, 1U); + + for (idx = 0U; idx < ADI_ADRV904X_TX_TO_ORX_MAPPING_PIN_TABLE_SIZE; idx++) + { + device->devStateInfo.txToOrxMappingConfig.pinTableOrx0[idx] = (adi_adrv904x_TxToOrxMappingPinTable_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_TXTOORXMAPPINGPINTABLEORX0_00_START_BYTE + (idx * 4U), 4U); + + device->devStateInfo.txToOrxMappingConfig.pinTableOrx1[idx] = (adi_adrv904x_TxToOrxMappingPinTable_e)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_TXTOORXMAPPINGPINTABLEORX1_00_START_BYTE + (idx * 4U), 4U); + } + device->devStateInfo.txToOrxMappingConfig.autoSwitchOrxAttenEnable = (uint8_t)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_TXTOORXMAPPINAUTOSWITCHORXATTENENABLE_START_BYTE, 1U); + + device->devStateInfo.txToOrxMappingConfig.autoSwitchOrxNcoEnable = (uint8_t)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_TXTOORXMAPPINAUTOSWITCHORXNCOENABLE_START_BYTE, 1U); + + + device->devStateInfo.txToOrxMappingConfig.vswrDirOrx0Gpio = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_VSWR_DIR_ORX0); + device->devStateInfo.txToOrxMappingConfig.vswrDirOrx1Gpio = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_VSWR_DIR_ORX1); + device->devStateInfo.txToOrxMappingConfig.vswrDirCommonGpio = adrv904x_StreamGleanGpioNumberGet(gpioAssignments, ADRV904X_STREAM_GPIO_VSWR_DIR_ORX_CMN); + + device->devStateInfo.txToOrxMappingConfig.vswrDirOrx0GpioPolarity = (uint8_t)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_VSWRDIRORX0GPIOPOLARITY_START_BYTE, 1U); + device->devStateInfo.txToOrxMappingConfig.vswrDirOrx1GpioPolarity = (uint8_t)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_VSWRDIRORX1GPIOPOLARITY_START_BYTE, 1U); + device->devStateInfo.txToOrxMappingConfig.vswrDirCommonGpioPolarity = (uint8_t)adrv904x_CpuIntFromBytesGet(binary + STREAM_IMAGE_VSWRDIRCOMMONGPIOPOLARITY_START_BYTE, 1U); + + /* Duplicate the common values from RCI mode Mapping Config into DFE CTRL mode Mapping Config */ + device->devStateInfo.dfeCtrlTxToOrxMappingConfig.txObservability = device->devStateInfo.txToOrxMappingConfig.txObservability; + device->devStateInfo.dfeCtrlTxToOrxMappingConfig.mode = device->devStateInfo.txToOrxMappingConfig.mode; + device->devStateInfo.dfeCtrlTxToOrxMappingConfig.autoSwitchOrxAttenEnable = device->devStateInfo.txToOrxMappingConfig.autoSwitchOrxAttenEnable; + device->devStateInfo.dfeCtrlTxToOrxMappingConfig.autoSwitchOrxNcoEnable = device->devStateInfo.txToOrxMappingConfig.autoSwitchOrxNcoEnable; + for (idx = 0U; idx < ADI_ADRV904X_TX_TO_ORX_MAPPING_PIN_TABLE_SIZE; idx++) + { + device->devStateInfo.dfeCtrlTxToOrxMappingConfig.pinTableOrx0[idx] = device->devStateInfo.txToOrxMappingConfig.pinTableOrx0[idx]; + device->devStateInfo.dfeCtrlTxToOrxMappingConfig.pinTableOrx1[idx] = device->devStateInfo.txToOrxMappingConfig.pinTableOrx1[idx]; + } + + for (i = 0; i < ADI_ADRV904X_STREAM_MAX; ++i) + { + adrv904x_BinaryImageInfoGet(&binary[STREAM_IMAGE_SLICE_INFO_START_BYTE + i * STREAM_PROCESSOR_META_DATA_SIZE_BYTES], &binaryImageSize, &binaryImageOffset); + device->devStateInfo.chunkStreamImageSize[i] = binaryImageSize; + device->devStateInfo.chunkStreamImageOffset[i] = binaryImageOffset; + } + + /* Variables used to track the status of stream_image.bin parsing + * across multiple calls to this function. + * */ + device->devStateInfo.currentStreamImageIndex = 0U; + device->devStateInfo.currentStreamBinBaseAddr = 0U; + device->devStateInfo.currentStreamBaseAddr = 0U; + device->devStateInfo.currentStreamImageSize = 0U; + device->devStateInfo.currentStreamNumberStreams = 0U; + } + + for (i = device->devStateInfo.currentStreamImageIndex; i < ADI_ADRV904X_STREAM_MAX; ++i) + { + imageOffset = device->devStateInfo.chunkStreamImageOffset[i]; + + /* NOTE: the i == 0 if-statements are for the most part required because core + * slice control registers are in Direct SPI address range instead of AHB memory. + * */ + + /* The core processor binary header starts after the stream_image.bin header. + * But what gets written to the core AHB address includes the stream_image.bin + * header. */ + if (i == 0U) + { + imageOffset = FINAL_STREAM_IMAGE_HEADER_SIZE_BYTES; + } + + /* The if-statements below are to see if the current chunk of stream_image.bin + * includes certain necessary information for a particular slice, e.g. the binary + * base address which is the first word of a slice binary image. */ + if ((byteOffset <= imageOffset) && + ((byteOffset + byteCount) >= imageOffset + 4U)) + { + binOffset = imageOffset - byteOffset; + adrv904x_BinaryParamsGetBaseAddr(&binary[binOffset], &word1); + device->devStateInfo.currentStreamBinBaseAddr = word1; + device->devStateInfo.currentStreamImageSize = device->devStateInfo.chunkStreamImageSize[i]; + } + + if ((byteOffset <= imageOffset + 4U) && + ((byteOffset + byteCount) >= imageOffset + 8U)) + { + binOffset = imageOffset + 4U - byteOffset; + adrv904x_BinaryParamsGetBaseAddr(&binary[binOffset], &word1); + device->devStateInfo.currentStreamBaseAddr = word1; + } + + if ((byteOffset <= imageOffset + 8U) && + ((byteOffset + byteCount) >= imageOffset + 12U)) + { + binOffset = imageOffset + 8U - byteOffset; + adrv904x_BinaryParamsGetNumberStreamImageSize(&binary[binOffset], &byte1, &word1); + device->devStateInfo.currentStreamNumberStreams = byte1; + } + + /* If these tracking variables have been set for the current slice that means we are in a state + * where we can write the chunk to ARM memory. + * */ + if ((device->devStateInfo.currentStreamBinBaseAddr > 0U) && + (device->devStateInfo.currentStreamImageSize > 0U)) + { + addr = streamCtlAddr[i]; + + /* This if-statement will only be true the first time we have encounter a slice image because + * currentStreamImageSize gets decremented on each function call, so we can use this as a way + * to initialize slice startup items, e.g. putting the slice into reset while it's image is getting + * written. */ + if (device->devStateInfo.currentStreamImageSize == device->devStateInfo.chunkStreamImageSize[i]) + { + if ((device->devStateInfo.initializedChannels & streamChannel[i]) > 0U) + { + //todo: this assumes kfa stream_reset is in spi-only re.g.s + if ((i == 0U) || (i == 1U)) + { + streamCtl = coreSliceControlDefaultVal | (1U << ADRV904X_STREAM_RESET_BIT); + mask = 0xFFU; + } + else + { + /* Default for Rx stream_config_0 is zero*/ + streamCtl = (1U << ADRV904X_RX_STREAM_RESET_BIT); + mask = 0xFFFFFFFFU; + } + recoveryAction = adi_adrv904x_Register32Write(device, NULL, addr, streamCtl, mask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set Stream Ctrl"); + goto cleanup; + } + } + } + + /* This if statement is in the case a byte chunk has a boundary between two slice images so we only write + * the remaining bytes of the current slice. + * */ + if (byteCount >= device->devStateInfo.currentStreamImageSize) + { + imageSize = device->devStateInfo.currentStreamImageSize; + } + else + { + imageSize = byteCount; + } + + /* Load the stream image to memory, starting at the memory address specified by Stream_binary_base + * if the corresponding channel has been initialized. + * */ + if ((device->devStateInfo.initializedChannels & streamChannel[i]) > 0) + { + recoveryAction = adi_adrv904x_RegistersByteWrite(device, + NULL, + device->devStateInfo.currentStreamBinBaseAddr, + binary, + imageSize); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write stream binary"); + goto cleanup; + } + } + else + { + //stream is disabled but no need to report an error + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + + byteCount -= imageSize; + byteOffset += imageSize; + binary += imageSize; + device->devStateInfo.currentStreamImageSize -= imageSize; + device->devStateInfo.currentStreamBinBaseAddr += imageSize; + + /* After an entire slice image has been written we need to set the corresponding stream control register. */ + if (device->devStateInfo.currentStreamImageSize == 0U) + { + + if ((device->devStateInfo.initializedChannels & streamChannel[i]) > 0U) + { + //todo: this assumes kfa stream_reset is in spi-only regs + if((i == 0U) || (i == 1U)) + { + streamCtl = coreSliceControlDefaultVal; + mask = 0xFFU; + + /* Populate registers(stream_base_byte0) and (stream_base_byte1)with the lower 16 bits of the Stream_base. */ + recoveryAction = adi_adrv904x_Register32Write(device, + NULL, + addr + ADRV904X_STREAM_BASE_BYTE0_REG_OFFSET, + (uint8_t)(device->devStateInfo.currentStreamBaseAddr), + mask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set Stream Ctrl - Lower Byte"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Write(device, + NULL, + addr + ADRV904X_STREAM_BASE_BYTE1_REG_OFFSET, + (uint8_t)(device->devStateInfo.currentStreamBaseAddr >> 8U), + mask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set Stream Ctrl - Upper Byte"); + goto cleanup; + } + + /* Populate register (last_stream_num)with the No_of_streams value. */ + recoveryAction = adi_adrv904x_Register32Write(device, + NULL, + addr + ADRV904X_LAST_STREAM_NUMBER_REG_OFFSET, + (uint8_t)(device->devStateInfo.currentStreamNumberStreams - 1U), + mask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set Stream Ctrl - Number of Streams"); + goto cleanup; + } + + } + else + { + mask = 0xFFFFFFFFU; + streamCtl = 0U; + + /* Populate registers(stream_base_byte0) and (stream_base_byte1)with the lower 16 bits of the Stream_base. */ + streamCtl |= (device->devStateInfo.currentStreamBaseAddr & 0xFFU) << ADRV904X_RX_STREAM_BASE_BYTE0_BIT; + streamCtl |= ((device->devStateInfo.currentStreamBaseAddr >> 8U) & 0xFFU) << ADRV904X_RX_STREAM_BASE_BYTE1_BIT; + + /* Populate register (last_stream_num)with the No_of_streams value. */ + streamCtl |= ((device->devStateInfo.currentStreamNumberStreams - 1U) & 0xFFU) << ADRV904X_RX_LAST_STREAM_NUMBER_BIT; + + /* Stream config 1 holds the base address & last stream number */ + recoveryAction = adi_adrv904x_Register32Write(device, NULL, addr + 4U, streamCtl, mask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set Stream Ctrl 1"); + goto cleanup; + } + + /* Just clear reset bit on other channel processors */ + streamCtl = 0U; + + } + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, addr, streamCtl, mask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set Stream Ctrl"); + goto cleanup; + } + } + + ++device->devStateInfo.currentStreamImageIndex; + device->devStateInfo.currentStreamBinBaseAddr = 0U; + device->devStateInfo.currentStreamBaseAddr = 0U; + device->devStateInfo.currentStreamImageSize = 0U; + device->devStateInfo.currentStreamNumberStreams = 0U; + } + else + { + //stream is disabled but no need to report an error + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + } + else + { + break; + } + + if (byteCount == 0U) + { + break; + } + } + + if (device->devStateInfo.currentStreamImageIndex == ADI_ADRV904X_STREAM_MAX) + { + device->devStateInfo.devState = (adi_adrv904x_ApiStates_e)(device->devStateInfo.devState | ADI_ADRV904X_STATE_STREAMLOADED); + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxTxEnableSet(adi_adrv904x_Device_t* const device, + const uint32_t orxChannelMask, + const uint32_t orxChannelEnable, + const uint32_t rxChannelMask, + const uint32_t rxChannelEnable, + const uint32_t txChannelMask, + const uint32_t txChannelEnable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + +#if ADI_ADRV904X_RADIOCTRL_RANGE_CHECK > 0 + recoveryAction = adrv904x_RxTxEnableSetRangeCheck(device, orxChannelMask, orxChannelEnable, rxChannelMask, rxChannelEnable, txChannelMask, txChannelEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxTxEnableSetRangeCheck Issue"); + goto cleanup; + } +#endif + + /*Enable requested Rx Channel signal chains*/ + recoveryAction = adrv904x_RxEnableSet(device, rxChannelMask, rxChannelEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxEnableSet Issue"); + goto cleanup; + } + + /* Enable requested ORx Channel signal chains */ + recoveryAction = adrv904x_OrxEnableSet(device, orxChannelMask, orxChannelEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "OrxEnableSet Issue"); + goto cleanup; + } + + /* Enable requested Tx Channel signal chains */ + recoveryAction = adrv904x_TxEnableSet(device, txChannelMask, txChannelEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "TxEnableSet Issue"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxTxEnableGet(adi_adrv904x_Device_t* const device, + uint32_t* const orxChannelMask, + uint32_t* const rxChannelMask, + uint32_t* const txChannelMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t regVal = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, orxChannelMask, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxChannelMask, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txChannelMask, cleanup); + + /* Get RX Channel Enabling bit mask */ + recoveryAction = adrv904x_Core_RadioControlInterfaceRxSpiEn_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + ®Val); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RX Channel status get failed."); + goto cleanup; + } + *rxChannelMask = (uint32_t) regVal; + + /* Get ORX Channel Enabling bit mask */ + recoveryAction = adrv904x_Core_RadioControlInterfaceOrxSpiEn_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + ®Val); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "ORX Channel status get failed."); + goto cleanup; + } + *orxChannelMask = ((uint32_t) regVal) << ADI_ADRV904X_MAX_RX_ONLY; + + /* Get TX Channel Enabling bit mask */ + recoveryAction = adrv904x_Core_RadioControlInterfaceTxSpiEn_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) ADRV904X_BF_CORE_ADDR, + ®Val); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "TX Channel status get failed."); + goto cleanup; + } + *txChannelMask = (uint32_t) regVal; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_ChannelEnableGet(adi_adrv904x_Device_t* const device, + uint32_t* const orxChannelMask, + uint32_t* const rxChannelMask, + uint32_t* const txChannelMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t tmpByte = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, orxChannelMask, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxChannelMask, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txChannelMask, cleanup); + + *orxChannelMask = 0U; + *rxChannelMask = 0U; + *txChannelMask = 0U; + + recoveryAction = adrv904x_Core_RadioControlInterfaceTxonReadback_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &tmpByte); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "TxonReadback issue"); + goto cleanup; + } + + *txChannelMask = tmpByte; + + recoveryAction = adrv904x_Core_RadioControlInterfaceRxonReadback_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &tmpByte); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxonReadback issue"); + goto cleanup; + } + + *rxChannelMask = tmpByte; + + recoveryAction = adrv904x_Core_RadioControlInterfaceOrxonReadback_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &tmpByte); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "OrxonReadback issue"); + goto cleanup; + } + + *orxChannelMask = tmpByte; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); + +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlCfgSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_RadioCtrlModeCfg_t* const radioCtrlCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, radioCtrlCfg, cleanup); + +#if ADI_ADRV904X_RADIOCTRL_RANGE_CHECK > 0 + recoveryAction = adrv904x_RadioCtrlCfgSetRangeCheck(device, radioCtrlCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RadioCtrlCfgSetRangeCheck Issue"); + goto cleanup; + } +#endif + + if (((device->devStateInfo.profilesValid & ADI_ADRV904X_RX_PROFILE_VALID) == ADI_ADRV904X_RX_PROFILE_VALID) && + (radioCtrlCfg->rxRadioCtrlModeCfg.rxEnableMode != ADI_ADRV904X_RX_EN_INVALID_MODE) && + (radioCtrlCfg->rxRadioCtrlModeCfg.rxChannelMask != ADI_ADRV904X_RXOFF)) + { + recoveryAction = adrv904x_RxRadioCtrlCfgSet(device, &radioCtrlCfg->rxRadioCtrlModeCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxRadioCtrlCfgSet Issue"); + goto cleanup; + } + } + + if (((device->devStateInfo.profilesValid & ADI_ADRV904X_TX_PROFILE_VALID) == ADI_ADRV904X_TX_PROFILE_VALID) && + (radioCtrlCfg->txRadioCtrlModeCfg.txEnableMode != ADI_ADRV904X_TX_EN_INVALID_MODE) && + (radioCtrlCfg->txRadioCtrlModeCfg.txChannelMask != ADI_ADRV904X_TXOFF)) + { + recoveryAction = adrv904x_TxRadioCtrlCfgSet(device, &radioCtrlCfg->txRadioCtrlModeCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "TxRadioCtrlCfgSet Issue"); + goto cleanup; + } + } + + if (((device->devStateInfo.profilesValid & ADI_ADRV904X_ORX_PROFILE_VALID) == ADI_ADRV904X_ORX_PROFILE_VALID) && + (radioCtrlCfg->orxRadioCtrlModeCfg.orxEnableMode != ADI_ADRV904X_ORX_EN_INVALID_MODE) && + (radioCtrlCfg->orxRadioCtrlModeCfg.orxChannelMask != ADI_ADRV904X_RXOFF)) + { + recoveryAction = adrv904x_OrxRadioCtrlCfgSet(device, &radioCtrlCfg->orxRadioCtrlModeCfg); + if(recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "OrxRadioCtrlCfgSet Issue"); + goto cleanup; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_RadioCtrlModeCfg_t* const radioCtrlCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, radioCtrlCfg, cleanup); + + if (rxChannel > ADI_ADRV904X_ORX1) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, recoveryAction, rxChannel, "Invalid Rx/ORx Channel"); + goto cleanup; + } + + if (txChannel > ADI_ADRV904X_TX7) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannel, "Invalid Tx Channel"); + goto cleanup; + } + + if ((txChannel == ADI_ADRV904X_TXOFF) && + (rxChannel == ADI_ADRV904X_RXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannel, "No valid Tx and Rx channels"); + goto cleanup; + } + + if ((rxChannel >= ADI_ADRV904X_RX0) && (rxChannel <= ADI_ADRV904X_RX7)) + { + recoveryAction = adrv904x_RxRadioCtrlCfgGet(device, rxChannel, &radioCtrlCfg->rxRadioCtrlModeCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxRadioCtrlCfgGet Issue"); + goto cleanup; + } + } + + if ((txChannel >= ADI_ADRV904X_TX0) && (txChannel <= ADI_ADRV904X_TX7)) + { + recoveryAction = adrv904x_TxRadioCtrlCfgGet(device, txChannel, &radioCtrlCfg->txRadioCtrlModeCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "TxRadioCtrlCfgGet Issue"); + goto cleanup; + } + } + + if ((rxChannel >= ADI_ADRV904X_ORX0) && (rxChannel <= ADI_ADRV904X_ORX1)) + { + recoveryAction = adrv904x_OrxRadioCtrlCfgGet(device, rxChannel, &radioCtrlCfg->orxRadioCtrlModeCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "OrxRadioCtrlCfgGet Issue"); + goto cleanup; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_LoFrequencySet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_LoConfig_t* const loConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxFuncsChanAddr_e txBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_FUNCS; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + + adrv904x_CpuCmd_SetLoFreq_t loInfo; + adrv904x_CpuCmd_SetLoFreqResp_t cmdRsp; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + + uint8_t writeGpIntPin1Bool = 0U; + uint8_t writeGpIntPin0Bool = 0U; + uint8_t writePllUnlockMaskBool[ADI_ADRV904X_MAX_TXCHANNELS]; + + uint8_t tmpPllRampDownMask = 0U; + uint8_t origPllRampDownMask[ADI_ADRV904X_MAX_TXCHANNELS]; + uint8_t i = 0U; + uint8_t pllUnlockRampDownMask = 0U; + uint32_t tmpTxChannelMask = 0U; + + uint8_t gpIntMaskRegsOrig[4] = { 0U, 0U, 0U, 0U }; + uint8_t gpIntMaskRegsTmp[4] = { 0U, 0U, 0U, 0U }; + uint8_t* gpIntMaskPin1Byte9 = &gpIntMaskRegsOrig[0]; + uint8_t* gpIntMaskPin0Byte9 = &gpIntMaskRegsOrig[2]; + + static const uint8_t GPINT_RF1_PLL_OVERRANGE_BYTE9_MASK = (1U << 4U); + static const uint8_t GPINT_RF0_PLL_OVERRANGE_BYTE9_MASK = (1U << 5U); + static const uint8_t GPINT_RF1_PLL_UNLOCK_BYTE9_MASK = (1U << 7U); + static const uint8_t GPINT_RF0_PLL_UNLOCK_BYTE10_MASK = (1U << 0U); + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, loConfig, cleanup); + + ADI_LIBRARY_MEMSET(&loInfo, 0, sizeof(adrv904x_CpuCmd_SetLoFreq_t)); + ADI_LIBRARY_MEMSET(&cmdRsp, 0, sizeof(adrv904x_CpuCmd_SetLoFreqResp_t)); + ADI_LIBRARY_MEMSET(&writePllUnlockMaskBool, 0, sizeof(writePllUnlockMaskBool)); + ADI_LIBRARY_MEMSET(&origPllRampDownMask, 0, sizeof(origPllRampDownMask)); + +#if ADI_ADRV904X_RADIOCTRL_RANGE_CHECK > 0 + recoveryAction = adrv904x_LoFrequencySetRangeCheck(device, loConfig); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "LoFrequencySetRangeCheck Issue"); + goto cleanup; + } +#endif + + /* Read GPINT registers */ + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, ADRV904X_ADDR_GPINT_MASK_PIN1_BYTE9, gpIntMaskPin1Byte9, NULL, 2U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Registers32Read GPINT_PIN1 issue"); + goto cleanup; + } + recoveryAction = adi_adrv904x_RegistersByteRead(device, NULL, ADRV904X_ADDR_GPINT_MASK_PIN0_BYTE9, gpIntMaskPin0Byte9, NULL, 2U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Registers32Read GPINT_PIN0 issue"); + goto cleanup; + } + ADI_LIBRARY_MEMCPY(gpIntMaskRegsTmp, gpIntMaskRegsOrig, sizeof(gpIntMaskRegsOrig)); + gpIntMaskPin1Byte9 = &gpIntMaskRegsTmp[0]; + gpIntMaskPin0Byte9 = &gpIntMaskRegsTmp[2]; + + /* Based on loName determine the GPINT and PLL-unlock Tx rampdown to disable */ + switch (loConfig->loName) + { + case ADI_ADRV904X_LO0: + pllUnlockRampDownMask = (uint8_t)ADI_ADRV904X_RDT_RF0_PLL_UNLOCK; + gpIntMaskPin1Byte9[1] |= GPINT_RF0_PLL_UNLOCK_BYTE10_MASK; + gpIntMaskPin0Byte9[1] |= GPINT_RF0_PLL_UNLOCK_BYTE10_MASK; + break; + case ADI_ADRV904X_LO1: + pllUnlockRampDownMask = (uint8_t)ADI_ADRV904X_RDT_RF1_PLL_UNLOCK; + gpIntMaskPin1Byte9[0] |= GPINT_RF1_PLL_UNLOCK_BYTE9_MASK; + gpIntMaskPin0Byte9[0] |= GPINT_RF1_PLL_UNLOCK_BYTE9_MASK; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, loConfig->loName, "Invalid LO selected for setting LO frequency"); + goto cleanup; + } + + pllUnlockRampDownMask >>= 3U; + + /* Disable various GP INTs while changing frequency */ + gpIntMaskPin1Byte9[0] |= (GPINT_RF0_PLL_OVERRANGE_BYTE9_MASK | GPINT_RF1_PLL_OVERRANGE_BYTE9_MASK); + gpIntMaskPin0Byte9[0] |= (GPINT_RF0_PLL_OVERRANGE_BYTE9_MASK | GPINT_RF1_PLL_OVERRANGE_BYTE9_MASK); + /* Write GPINT registers if Byte9 or Byte10 have been changed */ + writeGpIntPin1Bool = (gpIntMaskPin1Byte9[0] != gpIntMaskRegsOrig[0]) || (gpIntMaskPin1Byte9[1] != gpIntMaskRegsOrig[1]); + writeGpIntPin0Bool = (gpIntMaskPin0Byte9[0] != gpIntMaskRegsOrig[2]) || (gpIntMaskPin0Byte9[1] != gpIntMaskRegsOrig[3]); + if (writeGpIntPin1Bool) + { + recoveryAction = adi_adrv904x_RegistersByteWrite(device, NULL, ADRV904X_ADDR_GPINT_MASK_PIN1_BYTE9, gpIntMaskPin1Byte9, 2U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Registers32Write GPINT_PIN1 issue"); + goto cleanup; + } + } + if (writeGpIntPin0Bool) + { + recoveryAction = adi_adrv904x_RegistersByteWrite(device, NULL, ADRV904X_ADDR_GPINT_MASK_PIN0_BYTE9, gpIntMaskPin0Byte9, 2U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Registers32Write GPINT_PIN0 issue"); + goto cleanup; + } + } + + /* Store current PLL Unlock mask for ramp down configuration for each channel and update them temporarily */ + for (i = 0U; i < ADI_ADRV904X_MAX_TXCHANNELS; ++i) + { + tmpTxChannelMask = (uint32_t)((uint32_t)1U << i); + + if (((device->devStateInfo.initializedChannels >> ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET) & tmpTxChannelMask) == 0U) + { + /* skip for uninitialized channels */ + continue; + } + + /* Retrieve the base address for selected tx channel */ + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)tmpTxChannelMask, &txBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, tmpTxChannelMask, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + /* Store pll unlock mask */ + recoveryAction = adrv904x_TxFuncs_PllUnlockMask_BfGet(device, NULL, txBaseAddr, &origPllRampDownMask[i]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading Tx Pll Unlock Mask for ramp-down config"); + goto cleanup; + } + + tmpPllRampDownMask = origPllRampDownMask[i] | pllUnlockRampDownMask; /* 1 means disabled */ + /* store boolean on whether temporary values to be written are different from the original */ + writePllUnlockMaskBool[i] = (tmpPllRampDownMask != origPllRampDownMask[i]); + + /* update pll unlock mask if tmp value is different */ + if (writePllUnlockMaskBool[i]) + { + recoveryAction = adrv904x_TxFuncs_PllUnlockMask_BfSet(device, NULL, txBaseAddr, tmpPllRampDownMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing temporary Tx Pll Unlock Mask for ramp-down config"); + goto cleanup; + } + } + } + + /* Prepare the command payload */ + loInfo.loName = (adi_adrv904x_LoName_t) loConfig->loName; + loInfo.loConfigSel = (adi_adrv904x_LoOption_t) ADRV904X_HTOCL(loConfig->loConfigSel) ; + loInfo.loFrequency_Hz = (uint64_t) ADRV904X_HTOCLL(loConfig->loFrequency_Hz); + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_LO_FREQUENCY, + (void*)&loInfo, + sizeof(loInfo), + (void*)&cmdRsp, + sizeof(cmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(cmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* Write back original GPINT settings */ + gpIntMaskPin1Byte9 = &gpIntMaskRegsOrig[0]; + gpIntMaskPin0Byte9 = &gpIntMaskRegsOrig[2]; + if (writeGpIntPin1Bool) + { + recoveryAction = adi_adrv904x_RegistersByteWrite(device, NULL, ADRV904X_ADDR_GPINT_MASK_PIN1_BYTE9, gpIntMaskPin1Byte9, 2U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Registers32Write GPINT_PIN1 issue"); + goto cleanup; + } + } + if (writeGpIntPin0Bool) + { + recoveryAction = adi_adrv904x_RegistersByteWrite(device, NULL, ADRV904X_ADDR_GPINT_MASK_PIN0_BYTE9, gpIntMaskPin0Byte9, 2U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Registers32Write GPINT_PIN0 issue"); + goto cleanup; + } + } + + /* Restore Pll unlock masks for ramp-down configuration */ + for (i = 0; i < ADI_ADRV904X_MAX_TXCHANNELS; ++i) + { + tmpTxChannelMask = (uint32_t)((uint32_t)1U << i); + + if ((((device->devStateInfo.initializedChannels >> ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET) & tmpTxChannelMask) == 0U) || + (writePllUnlockMaskBool[i] == 0U)) + { + /* skip for uninitialized channels or unchanged Pll unlock masks*/ + continue; + } + + /* Retrieve the base address for selected tx channel */ + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)tmpTxChannelMask, &txBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, tmpTxChannelMask, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PllUnlockMask_BfSet(device, NULL, txBaseAddr, origPllRampDownMask[i]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing temporary Tx Pll Unlock Mask for ramp-down config"); + goto cleanup; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_LoFrequencyGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_LoConfigReadback_t* const loConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_GetLoFreqResp_t cmdRsp; + adrv904x_CpuCmd_GetLoFreq_t loCmd; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, loConfig, cleanup); + + ADI_LIBRARY_MEMSET(&cmdRsp, 0, sizeof(adrv904x_CpuCmd_GetLoFreqResp_t)); + ADI_LIBRARY_MEMSET(&loCmd, 0, sizeof(adrv904x_CpuCmd_GetLoFreq_t)); + + /* Executing the GET LO Freq command */ + loCmd.loName = (adi_adrv904x_LoName_t) loConfig->loName; + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_GET_LO_FREQUENCY, + (void*)&loCmd, + sizeof(loCmd), + (void*)&cmdRsp, + sizeof(cmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(cmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + loConfig->loFrequency_Hz = (uint64_t) ADRV904X_CTOHLL(cmdRsp.loFrequency_Hz); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfgPllToChanCtrl(adi_adrv904x_Device_t* const device, + uint8_t rf0MuxTx0_3, + uint8_t rf0MuxTx4_7, + uint8_t rf0MuxRx0_3, + uint8_t rf0MuxRx4_7) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_ChanCtrlToPlls_t ChanCtrlToPllsPayload; + adrv904x_CpuCmd_ChanCtrlToPllsResp_t cmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + + /* check Device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_LIBRARY_MEMSET(&ChanCtrlToPllsPayload, 0, sizeof(adrv904x_CpuCmd_ChanCtrlToPlls_t)); + ADI_LIBRARY_MEMSET(&cmdRsp, 0, sizeof(adrv904x_CpuCmd_ChanCtrlToPllsResp_t)); + + /* Prepare the command Payload */ + ChanCtrlToPllsPayload.rf0MuxTx0_3 = (uint8_t) rf0MuxTx0_3; + ChanCtrlToPllsPayload.rf0MuxTx4_7 = (uint8_t) rf0MuxTx4_7; + ChanCtrlToPllsPayload.rf0MuxRx0_3 = (uint8_t) rf0MuxRx0_3; + ChanCtrlToPllsPayload.rf0MuxRx4_7 = (uint8_t) rf0MuxRx4_7; + + /* Send Command and Receive Response */ + recoveryAction = adrv904x_CpuCmdSend(device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_CHAN_TO_PLLS, + (void*)&ChanCtrlToPllsPayload, + sizeof(ChanCtrlToPllsPayload), + (void*)&cmdRsp, + sizeof(cmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(cmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_LoLoopFilterSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_LoName_e loName, + const adi_adrv904x_LoLoopFilterCfg_t* const loLoopFilterConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_SetLoopfilter_t loopFilterPayload; + adrv904x_CpuCmd_SetLoopfilterResp_t cmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, loLoopFilterConfig, cleanup); + + ADI_LIBRARY_MEMSET(&loopFilterPayload, 0, sizeof(adrv904x_CpuCmd_SetLoopfilter_t)); + ADI_LIBRARY_MEMSET(&cmdRsp, 0, sizeof(adrv904x_CpuCmd_SetLoopfilterResp_t)); + +#if ADI_ADRV904X_RADIOCTRL_RANGE_CHECK > 0 + recoveryAction = adrv904x_LoLoopFilterSetRangeCheck(device, loName, loLoopFilterConfig); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "LoLoopFilterRangeCheck Issue"); + goto cleanup; + } +#endif + + loopFilterPayload.loName = (adi_adrv904x_LoName_t)(loName); + loopFilterPayload.loopBandwidth = ADRV904X_HTOCL((uint32_t)(loLoopFilterConfig->loopBandwidth_kHz * 1000U)); + loopFilterPayload.phaseMargin = ADRV904X_HTOCL((uint32_t)loLoopFilterConfig->phaseMargin_degrees); + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_LOOPFILTER, + (void*)&loopFilterPayload, + sizeof(loopFilterPayload), + (void*)&cmdRsp, + sizeof(cmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(cmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_LoLoopFilterGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_LoName_e loName, + adi_adrv904x_LoLoopFilterCfg_t* const loLoopFilterConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_GetLoopfilter_t loopFilterPayload; + adrv904x_CpuCmd_GetLoopfilterResp_t cmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, loLoopFilterConfig, cleanup); + + ADI_LIBRARY_MEMSET(&loopFilterPayload, 0, sizeof(adrv904x_CpuCmd_GetLoopfilter_t)); + ADI_LIBRARY_MEMSET(&cmdRsp, 0, sizeof(adrv904x_CpuCmd_GetLoopfilterResp_t)); + + if ((loName != ADI_ADRV904X_LO0) && (loName != ADI_ADRV904X_LO1)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, recoveryAction, loName, "Invalid LO Name"); + goto cleanup; + } + loopFilterPayload.loName = (adi_adrv904x_LoName_t)(loName); + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_GET_LOOPFILTER, + (void*)&loopFilterPayload, + sizeof(loopFilterPayload), + (void*)&cmdRsp, + sizeof(cmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(cmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + loLoopFilterConfig->loopBandwidth_kHz = (uint16_t) (ADRV904X_CTOHL(cmdRsp.loopBandwidth) / 1000); + loLoopFilterConfig->phaseMargin_degrees = (uint8_t) ADRV904X_CTOHL(cmdRsp.phaseMargin); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_PllStatusGet(adi_adrv904x_Device_t* const device, + uint32_t* const pllLockStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + static const uint8_t CLK_PLL_LOCK_STATUS_SHIFT = 0U; + static const uint8_t LO0_LOCK_STATUS_SHIFT = 1U; + static const uint8_t LO1_LOCK_STATUS_SHIFT = 2U; + static const uint8_t SERDES_PLL_LOCK_STATUS_SHIFT = 3U; + static const uint32_t LOCK_BIT_MASK = 0x00000001U; + + uint8_t pllLockStatusRead = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pllLockStatus, cleanup); + + /* Clear status of all PLLs */ + *pllLockStatus = 0U; + + /* Read CLK Pll status */ + recoveryAction = adrv904x_PllMemMap_SynLock_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_CLKPLL, + &pllLockStatusRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API Get CLK PLL Lock Status Failed."); + goto cleanup; + } + + /* Update pllLockStatus bit 0 with Clk Pll Status */ + *pllLockStatus |= ((uint32_t)pllLockStatusRead & LOCK_BIT_MASK) << CLK_PLL_LOCK_STATUS_SHIFT; + + /* Read LO0 Pll status */ + recoveryAction = adrv904x_PllMemMap_SynLock_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_EAST_RFPLL, + &pllLockStatusRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API Get LO0 Lock Status Failed."); + goto cleanup; + } + + /* Update pllLockStatus bit 1 with LO0 Pll Status */ + *pllLockStatus |= ((uint32_t)pllLockStatusRead & LOCK_BIT_MASK) << LO0_LOCK_STATUS_SHIFT; + + /* Read LO1 Pll status */ + recoveryAction = adrv904x_PllMemMap_SynLock_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_WEST_RFPLL, + &pllLockStatusRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API Get LO1 Lock Status Failed."); + goto cleanup; + } + + /* Update pllLockStatus bit 2 with LO1 Pll Status */ + *pllLockStatus |= ((uint32_t)pllLockStatusRead & LOCK_BIT_MASK) << LO1_LOCK_STATUS_SHIFT; + + /* Read SERDES Pll status */ + recoveryAction = adrv904x_PllMemMap_SynLock_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_SERDES_PLL, + &pllLockStatusRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API Get SERDES PLL Lock Status Failed."); + goto cleanup; + } + + /* Update pllLockStatus bit 3 with Serdes Pll Status */ + *pllLockStatus |= ((uint32_t)pllLockStatusRead & LOCK_BIT_MASK) << SERDES_PLL_LOCK_STATUS_SHIFT; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxTxLoFreqGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_RxTxLoFreqReadback_t* const rxTxLoFreq) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_GetRxTxLoFreqResp_t cmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + uint8_t i = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxTxLoFreq, cleanup); + + ADI_LIBRARY_MEMSET(&cmdRsp, 0, sizeof(adrv904x_CpuCmd_GetRxTxLoFreqResp_t)); + ADI_LIBRARY_MEMSET(rxTxLoFreq, 0, sizeof(adi_adrv904x_RxTxLoFreqReadback_t)); + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_GET_RXTXLOFREQ, + (void*) NULL, /* No CMD load needed for this cmd */ + 0U, + (void*)&cmdRsp, + sizeof(cmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(cmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* Copying CPU responses back to user structure */ + for(i = 0 ; i < ADI_ADRV904X_MAX_RX_ONLY ; i++) + { + rxTxLoFreq->rxLoName[i] = (adi_adrv904x_LoName_e)ADRV904X_CTOHL((uint32_t)cmdRsp.rxLoName[i]); + rxTxLoFreq->rxFreq_Khz[i] = ADRV904X_CTOHL(cmdRsp.rxFreq[i]); + } + + for (i = 0U; i < ADI_ADRV904X_MAX_TXCHANNELS; i++) + { + rxTxLoFreq->txLoName[i] = (adi_adrv904x_LoName_e)ADRV904X_CTOHL((uint32_t)cmdRsp.txLoName[i]); + rxTxLoFreq->txFreq_Khz[i] = ADRV904X_CTOHL(cmdRsp.txFreq[i]); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlTxRxEnCfgSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RadioCtrlTxRxEnCfg_t* const txRxEnCfg, + uint8_t pinIndex, + uint8_t configSel) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t i = 0U; + + adrv904xCoreBfSet8FnPtr_t adrvCoreRadioControlInterfaceTRxEnPinXBfSet[4][ADI_ADRV904X_TRX_CTRL_PIN_COUNT] = + { + { + adrv904x_Core_RadioControlInterfaceTxEnPin0_BfSet, + adrv904x_Core_RadioControlInterfaceTxEnPin1_BfSet, + adrv904x_Core_RadioControlInterfaceTxEnPin2_BfSet, + adrv904x_Core_RadioControlInterfaceTxEnPin3_BfSet, + adrv904x_Core_RadioControlInterfaceTxEnPin4_BfSet, + adrv904x_Core_RadioControlInterfaceTxEnPin5_BfSet, + adrv904x_Core_RadioControlInterfaceTxEnPin6_BfSet, + adrv904x_Core_RadioControlInterfaceTxEnPin7_BfSet + }, + { + adrv904x_Core_RadioControlInterfaceTxAntEnPin0_BfSet, + adrv904x_Core_RadioControlInterfaceTxAntEnPin1_BfSet, + adrv904x_Core_RadioControlInterfaceTxAntEnPin2_BfSet, + adrv904x_Core_RadioControlInterfaceTxAntEnPin3_BfSet, + adrv904x_Core_RadioControlInterfaceTxAntEnPin4_BfSet, + adrv904x_Core_RadioControlInterfaceTxAntEnPin5_BfSet, + adrv904x_Core_RadioControlInterfaceTxAntEnPin6_BfSet, + adrv904x_Core_RadioControlInterfaceTxAntEnPin7_BfSet + }, + { + adrv904x_Core_RadioControlInterfaceRxEnPin0_BfSet, + adrv904x_Core_RadioControlInterfaceRxEnPin1_BfSet, + adrv904x_Core_RadioControlInterfaceRxEnPin2_BfSet, + adrv904x_Core_RadioControlInterfaceRxEnPin3_BfSet, + adrv904x_Core_RadioControlInterfaceRxEnPin4_BfSet, + adrv904x_Core_RadioControlInterfaceRxEnPin5_BfSet, + adrv904x_Core_RadioControlInterfaceRxEnPin6_BfSet, + adrv904x_Core_RadioControlInterfaceRxEnPin7_BfSet + }, + { + adrv904x_Core_RadioControlInterfaceRxAntEnPin0_BfSet, + adrv904x_Core_RadioControlInterfaceRxAntEnPin1_BfSet, + adrv904x_Core_RadioControlInterfaceRxAntEnPin2_BfSet, + adrv904x_Core_RadioControlInterfaceRxAntEnPin3_BfSet, + adrv904x_Core_RadioControlInterfaceRxAntEnPin4_BfSet, + adrv904x_Core_RadioControlInterfaceRxAntEnPin5_BfSet, + adrv904x_Core_RadioControlInterfaceRxAntEnPin6_BfSet, + adrv904x_Core_RadioControlInterfaceRxAntEnPin7_BfSet + } + }; + + adi_adrv904x_TxRxEnPin_e arrayTxRxPin[ADI_ADRV904X_TRX_CTRL_PIN_COUNT] = + { + ADI_ADRV904X_TXRXEN_PIN0, + ADI_ADRV904X_TXRXEN_PIN1, + ADI_ADRV904X_TXRXEN_PIN2, + ADI_ADRV904X_TXRXEN_PIN3, + ADI_ADRV904X_TXRXEN_PIN4, + ADI_ADRV904X_TXRXEN_PIN5, + ADI_ADRV904X_TXRXEN_PIN6, + ADI_ADRV904X_TXRXEN_PIN7 + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txRxEnCfg, cleanup); + + if (pinIndex < ADI_ADRV904X_TXRXEN_PIN0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, pinIndex, "Invalid pinIndex"); + goto cleanup; + } + + if ((configSel < ADI_ADRV904X_TXRXEN_TX_ENABLE_MAP) || + (configSel > ADI_ADRV904X_TXRXEN_ALL)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, configSel, "Invalid configSel"); + goto cleanup; + } + + for (i = 0; i < ADI_ADRV904X_TRX_CTRL_PIN_COUNT; i++) + { + if (ADRV904X_BF_EQUAL(pinIndex, arrayTxRxPin[i])) + { + if (ADRV904X_BF_EQUAL(configSel, ADI_ADRV904X_TXRXEN_TX_ENABLE_MAP)) + { + recoveryAction = adrvCoreRadioControlInterfaceTRxEnPinXBfSet[0][i](device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + txRxEnCfg->txEnMapping[i]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API TX Radio Control En Pin Failed."); + goto cleanup; + } + } + + if (ADRV904X_BF_EQUAL(configSel, (uint8_t)ADI_ADRV904X_TXRXEN_TX_ALTENABLE_MAP)) + { + recoveryAction = adrvCoreRadioControlInterfaceTRxEnPinXBfSet[1][i](device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + txRxEnCfg->txAltMapping[i]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API TX Radio Control Alternate En Pin Failed."); + goto cleanup; + } + } + + if (ADRV904X_BF_EQUAL(configSel, ADI_ADRV904X_TXRXEN_RX_ENABLE_MAP)) + { + recoveryAction = adrvCoreRadioControlInterfaceTRxEnPinXBfSet[2][i](device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + txRxEnCfg->rxEnMapping[i]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API RX Radio Control En Pin Failed."); + goto cleanup; + } + } + + if (ADRV904X_BF_EQUAL(configSel, ADI_ADRV904X_TXRXEN_RX_ALTENABLE_MAP)) + { + recoveryAction = adrvCoreRadioControlInterfaceTRxEnPinXBfSet[3][i](device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + txRxEnCfg->rxAltMapping[i]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API RX Radio Control Alternate En Pin Failed."); + goto cleanup; + } + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlTxRxEnCfgGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_RadioCtrlTxRxEnCfg_t* const txRxEnCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t i = 0U; + + adrv904xCoreBfGet8FnPtr_t adrvCoreRadioControlInterfaceTRxEnPinXBfGet[4][ADI_ADRV904X_TRX_CTRL_PIN_COUNT] = + { + { + adrv904x_Core_RadioControlInterfaceTxEnPin0_BfGet, + adrv904x_Core_RadioControlInterfaceTxEnPin1_BfGet, + adrv904x_Core_RadioControlInterfaceTxEnPin2_BfGet, + adrv904x_Core_RadioControlInterfaceTxEnPin3_BfGet, + adrv904x_Core_RadioControlInterfaceTxEnPin4_BfGet, + adrv904x_Core_RadioControlInterfaceTxEnPin5_BfGet, + adrv904x_Core_RadioControlInterfaceTxEnPin6_BfGet, + adrv904x_Core_RadioControlInterfaceTxEnPin7_BfGet + }, + { + adrv904x_Core_RadioControlInterfaceTxAntEnPin0_BfGet, + adrv904x_Core_RadioControlInterfaceTxAntEnPin1_BfGet, + adrv904x_Core_RadioControlInterfaceTxAntEnPin2_BfGet, + adrv904x_Core_RadioControlInterfaceTxAntEnPin3_BfGet, + adrv904x_Core_RadioControlInterfaceTxAntEnPin4_BfGet, + adrv904x_Core_RadioControlInterfaceTxAntEnPin5_BfGet, + adrv904x_Core_RadioControlInterfaceTxAntEnPin6_BfGet, + adrv904x_Core_RadioControlInterfaceTxAntEnPin7_BfGet + }, + { + adrv904x_Core_RadioControlInterfaceRxEnPin0_BfGet, + adrv904x_Core_RadioControlInterfaceRxEnPin1_BfGet, + adrv904x_Core_RadioControlInterfaceRxEnPin2_BfGet, + adrv904x_Core_RadioControlInterfaceRxEnPin3_BfGet, + adrv904x_Core_RadioControlInterfaceRxEnPin4_BfGet, + adrv904x_Core_RadioControlInterfaceRxEnPin5_BfGet, + adrv904x_Core_RadioControlInterfaceRxEnPin6_BfGet, + adrv904x_Core_RadioControlInterfaceRxEnPin7_BfGet + }, + { + adrv904x_Core_RadioControlInterfaceRxAntEnPin0_BfGet, + adrv904x_Core_RadioControlInterfaceRxAntEnPin1_BfGet, + adrv904x_Core_RadioControlInterfaceRxAntEnPin2_BfGet, + adrv904x_Core_RadioControlInterfaceRxAntEnPin3_BfGet, + adrv904x_Core_RadioControlInterfaceRxAntEnPin4_BfGet, + adrv904x_Core_RadioControlInterfaceRxAntEnPin5_BfGet, + adrv904x_Core_RadioControlInterfaceRxAntEnPin6_BfGet, + adrv904x_Core_RadioControlInterfaceRxAntEnPin7_BfGet + } + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txRxEnCfg, cleanup); + + for (i = 0; i < ADI_ADRV904X_TRX_CTRL_PIN_COUNT; i++) + { + recoveryAction = adrvCoreRadioControlInterfaceTRxEnPinXBfGet[0][i](device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &txRxEnCfg->txEnMapping[i]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API TX Radio Control En Pin Failed."); + goto cleanup; + } + + recoveryAction = adrvCoreRadioControlInterfaceTRxEnPinXBfGet[1][i](device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &txRxEnCfg->txAltMapping[i]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API TX Radio Control Alternate En Pin Failed."); + goto cleanup; + } + + recoveryAction = adrvCoreRadioControlInterfaceTRxEnPinXBfGet[2][i](device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &txRxEnCfg->rxEnMapping[i]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API RX Radio Control En Pin Failed."); + goto cleanup; + } + + recoveryAction = adrvCoreRadioControlInterfaceTRxEnPinXBfGet[3][i](device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &txRxEnCfg->rxAltMapping[i]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "API RX Radio Control Alternate En Pin Failed."); + goto cleanup; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TemperatureGet(adi_adrv904x_Device_t* const device, + const uint16_t avgMask, + adi_adrv904x_DevTempData_t* const deviceTemperature) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_GetDevTemp_t devTempCmd; + adrv904x_CpuCmd_GetDevTempResp_t devTempCmdResp; + adrv904x_CpuCmd_GetDevTempResp_t devTempCmdResp0; + adrv904x_CpuCmd_GetDevTempResp_t devTempCmdResp1; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + const int16_t ADRV904X_TEMP_UNUSED = -274; + uint32_t cpuTypeIdx = 0U; + uint32_t curTempSensor = 0U; + uint16_t avgDiv = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, deviceTemperature, cleanup); + + ADI_LIBRARY_MEMSET(&devTempCmd, 0, sizeof(adrv904x_CpuCmd_GetDevTemp_t)); + ADI_LIBRARY_MEMSET(&devTempCmdResp, 0, sizeof(adrv904x_CpuCmd_GetDevTempResp_t)); + ADI_LIBRARY_MEMSET(&devTempCmdResp0, 0, sizeof(adrv904x_CpuCmd_GetDevTempResp_t)); + ADI_LIBRARY_MEMSET(&devTempCmdResp1, 0, sizeof(adrv904x_CpuCmd_GetDevTempResp_t)); + + /* Set ADRV904X_CPU_CMD_ID_GET_DEVICE_TEMPERATURE command parameters */ + devTempCmd.avgMask = ADRV904X_HTOCS(avgMask); + + for (cpuTypeIdx = (uint32_t) ADI_ADRV904X_CPU_TYPE_0; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_GET_DEVICE_TEMPERATURE, + (void*)&devTempCmd, + sizeof(devTempCmd), + (void*)&devTempCmdResp, + sizeof(devTempCmdResp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(devTempCmdResp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + else + { + if (cpuTypeIdx == (uint32_t) ADI_ADRV904X_CPU_TYPE_0) + { + devTempCmdResp0 = devTempCmdResp; + } + if (cpuTypeIdx == (uint32_t) ADI_ADRV904X_CPU_TYPE_1) + { + devTempCmdResp1 = devTempCmdResp; + } + } + } + + /* Copy/translate the temperature data to the caller's buffer */ + deviceTemperature->avgMask = ADRV904X_CTOHS(devTempCmdResp0.tempData.avgMask | devTempCmdResp1.tempData.avgMask); + deviceTemperature->tempDegreesCelsiusAvg = 0; + for( curTempSensor = 0U; curTempSensor < ADI_ADRV904X_DEVTEMP_MAX_SENSORS; curTempSensor++) + { + if ((int16_t)ADRV904X_CTOHS(devTempCmdResp0.tempData.tempDegreesCelsius[curTempSensor]) == ADRV904X_TEMP_UNUSED ) + { + deviceTemperature->tempDegreesCelsius[curTempSensor] = ADRV904X_CTOHS(devTempCmdResp1.tempData.tempDegreesCelsius[curTempSensor]); + } + else + { + deviceTemperature->tempDegreesCelsius[curTempSensor] = ADRV904X_CTOHS(devTempCmdResp0.tempData.tempDegreesCelsius[curTempSensor]); + } + + if ((deviceTemperature->tempDegreesCelsius[curTempSensor] != ADRV904X_TEMP_UNUSED) && + (deviceTemperature->avgMask & (0x0001 << curTempSensor))) + { + deviceTemperature->tempDegreesCelsiusAvg += deviceTemperature->tempDegreesCelsius[curTempSensor]; + ++avgDiv; + } + } + + if ((avgDiv > 0) && (deviceTemperature->avgMask > 0)) + { + deviceTemperature->tempDegreesCelsiusAvg /= avgDiv; + } + else + { + deviceTemperature->tempDegreesCelsiusAvg = ADRV904X_TEMP_UNUSED; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TemperatureEnableGet(adi_adrv904x_Device_t* const device, + uint16_t* const tempEnData) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_GetDevTempSnsEnResp_t devTempEnCmdResp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + uint32_t cpuTypeIdx = 0U; + + /* Check for pointer not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(tempEnData); + + ADI_LIBRARY_MEMSET(&devTempEnCmdResp, 0, sizeof(adrv904x_CpuCmd_GetDevTempSnsEnResp_t)); + *tempEnData = 0; + + for (cpuTypeIdx = (uint32_t) ADI_ADRV904X_CPU_TYPE_0; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response*/ + recoveryAction = adrv904x_CpuCmdSend( device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_GET_ENABLED_TEMPSENSORS, + (void*) NULL, /* No CMD load needed for this cmd */ + 0U, + (void*)&devTempEnCmdResp, + sizeof(devTempEnCmdResp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(devTempEnCmdResp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + else + { + /* Copy/translate the temperature data to the caller's buffer */ + *tempEnData |= (ADRV904X_CTOHS(devTempEnCmdResp.tempEnData)); + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TemperatureEnableSet(adi_adrv904x_Device_t* const device, + uint16_t* const tempEnData) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_SetDevTempSnsEn_t devTempCmd; + adrv904x_CpuCmd_SetDevTempSnsEnResp_t devTempEnCmdResp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + uint32_t cpuTypeIdx = 0U; + + /* Check for pointer not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(tempEnData); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_LIBRARY_MEMSET(&devTempEnCmdResp, 0, sizeof(adrv904x_CpuCmd_SetDevTempSnsEnResp_t)); + /* Set ADRV904X_CPU_CMD_ID_GET_DEVICE_TEMPERATURE command parameters */ + devTempCmd.tempEnData = ADRV904X_HTOCS(*tempEnData); + *tempEnData = 0; + + for (cpuTypeIdx = (uint32_t) ADI_ADRV904X_CPU_TYPE_0; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response; cpu0*/ + recoveryAction = adrv904x_CpuCmdSend( device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_ENABLED_TEMPSENSORS, + (void*)&devTempCmd, + sizeof(devTempCmd), + (void*)&devTempEnCmdResp, + sizeof(devTempEnCmdResp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(devTempEnCmdResp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + else + { + *tempEnData |= ADRV904X_CTOHS(devTempEnCmdResp.tempEnData); + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_StreamGpioConfigSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_StreamGpioPinCfg_t* const streamGpioPinCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + int idx = 0; + + adi_adrv904x_GpioSignal_e signals[ADI_ADRV904X_MAX_STREAMGPIO] = { + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_0, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_1, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_2, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_3, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_4, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_5, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_6, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_7, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_8, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_9, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_10, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_11, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_12, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_13, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_14, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_15, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_16, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_17, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_18, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_19, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_20, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_21, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_22, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_23 + }; + + + adi_adrv904x_GpioSignal_e digOutputSignals[ADI_ADRV904X_DFE_CTRL_MAX_GPIO_DIG] = { + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_0, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_1, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_2, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_3, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_4, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_5, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_6, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_7, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_8, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_9, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_10, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_11, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_12, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_13, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_14, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_15, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_16, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_17, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_18, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_19, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_20, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_21, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_22, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_23 + }; + + adi_adrv904x_GpioSignal_e anaOutputSignals[ADI_ADRV904X_DFE_CTRL_MAX_GPIO_ANA] = { + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_0, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_1, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_2, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_3, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_4, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_5, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_6, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_7, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_8, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_9, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_10, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_11, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_12, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_13, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_14, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_15 + }; + + adi_adrv904x_GpioAnaPinSel_e analogPinSelect = ADI_ADRV904X_GPIO_ANA_INVALID; + + adi_adrv904x_GpioPinSel_e pinSelect = ADI_ADRV904X_GPIO_INVALID; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, streamGpioPinCfg, cleanup); + +#if ADI_ADRV904X_RADIOCTRL_RANGE_CHECK > 0 + recoveryAction = adrv904x_StreamGpioConfigSetRangeCheck(device, + streamGpioPinCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "StreamGpioSignalSetRangeCheck issue"); + goto cleanup; + } +#endif + + /* Release all Stream GPIO if valid */ + for (idx = 0U; idx < ADI_ADRV904X_MAX_STREAMGPIO; idx++) + { + /* Find the signal for this gpio index */ + recoveryAction = adrv904x_GpioSignalFind(device, &pinSelect, signals[idx], ADI_ADRV904X_CHOFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + idx, + "GpioSignalFind issue"); + goto cleanup; + } + + /* Release if pinSelect is valid */ + if (pinSelect != ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = adrv904x_GpioSignalRelease(device, pinSelect, signals[idx], ADI_ADRV904X_CHOFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + idx, + "GpioSignalRelease issue"); + goto cleanup; + } + } + } + + /* Config Stream GPIO if valid */ + for (idx = 0U; idx < ADI_ADRV904X_MAX_STREAMGPIO; idx++) + { + /* Set if pinSelect is valid */ + if (streamGpioPinCfg->streamGpInput[idx] != ADI_ADRV904X_GPIO_INVALID) + { + pinSelect = (adi_adrv904x_GpioPinSel_e)(idx); + + /* Set the signal for this gpio */ + recoveryAction = adrv904x_GpioSignalSet(device, pinSelect, signals[idx], ADI_ADRV904X_CHOFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + idx, + "GpioSignalSet issue"); + goto cleanup; + } + } + } + + + + /* Release Digital Output GPIO used by Stream Processor */ + for (idx = 0U; idx < ADI_ADRV904X_DFE_CTRL_MAX_GPIO_DIG; idx++) + { + /* Find the signal for this gpio index */ + recoveryAction = adrv904x_GpioSignalFind(device, &pinSelect, digOutputSignals[idx], ADI_ADRV904X_CHOFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + idx, + "GpioSignalFind issue"); + goto cleanup; + } + + /* Release if pinSelect is valid */ + if (pinSelect != ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = adrv904x_GpioSignalRelease(device, pinSelect, digOutputSignals[idx], ADI_ADRV904X_CHOFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + idx, + "GpioSignalRelease issue"); + goto cleanup; + } + } + } + + /* Config Digital Output GPIO used by Stream Processor */ + for (idx = 0U; idx < ADI_ADRV904X_DFE_CTRL_MAX_GPIO_DIG; idx++) + { + /* Set if pinSelect is valid */ + if (streamGpioPinCfg->streamGpDigOutput[idx] != ADI_ADRV904X_GPIO_INVALID) + { + pinSelect = (adi_adrv904x_GpioPinSel_e)(idx); + + /* Set the signal for this gpio */ + recoveryAction = adrv904x_GpioSignalSet(device, pinSelect, digOutputSignals[idx], ADI_ADRV904X_CHOFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + idx, + "GpioSignalSet issue"); + goto cleanup; + } + } + } + + /* Release Analog Output GPIO used by Stream Processor */ + for (idx = 0U; idx < ADI_ADRV904X_DFE_CTRL_MAX_GPIO_ANA; idx++) + { + /* Find the signal for this gpio index */ + recoveryAction = adrv904x_GpioAnalogSignalFind(device, &analogPinSelect, anaOutputSignals[idx], ADI_ADRV904X_CHOFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + idx, + "GpioSignalFind issue"); + goto cleanup; + } + + /* Release if analogPinSelect is valid */ + if (analogPinSelect != ADI_ADRV904X_GPIO_ANA_INVALID) + { + recoveryAction = adrv904x_GpioAnalogSignalRelease(device, analogPinSelect, anaOutputSignals[idx], ADI_ADRV904X_CHOFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + idx, + "GpioSignalRelease issue"); + goto cleanup; + } + } + } + + /* Config Analog Output GPIO used by Stream Processor */ + for (idx = 0U; idx < ADI_ADRV904X_DFE_CTRL_MAX_GPIO_ANA; idx++) + { + /* Set if analogPinSelect is valid */ + if (streamGpioPinCfg->streamGpAnaOutput[idx] != ADI_ADRV904X_GPIO_ANA_INVALID) + { + analogPinSelect = (adi_adrv904x_GpioAnaPinSel_e)(idx); + + /* Set the signal for this gpio */ + recoveryAction = adrv904x_GpioAnalogSignalSet(device, analogPinSelect, anaOutputSignals[idx], ADI_ADRV904X_CHOFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + idx, + "GpioSignalSet issue"); + goto cleanup; + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_StreamGpioConfigGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_StreamGpioPinCfg_t* const streamGpioPinCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + int idx = 0; + adi_adrv904x_GpioSignal_e signals[ADI_ADRV904X_MAX_STREAMGPIO] = { + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_0, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_1, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_2, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_3, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_4, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_5, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_6, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_7, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_8, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_9, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_10, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_11, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_12, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_13, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_14, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_15, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_16, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_17, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_18, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_19, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_20, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_21, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_22, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_PIN_23 + }; + + + adi_adrv904x_GpioSignal_e digOutputSignals[ADI_ADRV904X_DFE_CTRL_MAX_GPIO_DIG] = { + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_0, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_1, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_2, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_3, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_4, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_5, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_6, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_7, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_8, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_9, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_10, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_11, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_12, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_13, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_14, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_15, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_16, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_17, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_18, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_19, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_20, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_21, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_22, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_DIGITAL_OUT_23 + }; + + adi_adrv904x_GpioSignal_e anaOutputSignals[ADI_ADRV904X_DFE_CTRL_MAX_GPIO_ANA] = { + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_0, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_1, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_2, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_3, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_4, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_5, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_6, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_7, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_8, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_9, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_10, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_11, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_12, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_13, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_14, + ADI_ADRV904X_GPIO_SIGNAL_GPIO_STREAM_PROC_ANALOG_OUT_15 + }; + + adi_adrv904x_GpioAnaPinSel_e analogPinSelect = ADI_ADRV904X_GPIO_ANA_INVALID; + + adi_adrv904x_GpioPinSel_e pinSelect = ADI_ADRV904X_GPIO_INVALID; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, streamGpioPinCfg, cleanup); + + for (idx = 0U; idx < ADI_ADRV904X_MAX_STREAMGPIO; idx++) + { + /* Find the signal for this gpio index */ + recoveryAction = adrv904x_GpioSignalFind(device, &pinSelect, signals[idx], ADI_ADRV904X_CHOFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "GpioSignalGet issue"); + goto cleanup; + } + + streamGpioPinCfg->streamGpInput[idx] = pinSelect; + } + + + for (idx = 0U; idx < ADI_ADRV904X_DFE_CTRL_MAX_GPIO_DIG; idx++) + { + /* Find the signal for this gpio index */ + recoveryAction = adrv904x_GpioSignalFind(device, &pinSelect, digOutputSignals[idx], ADI_ADRV904X_CHOFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "GpioSignalGet issue for digital output"); + goto cleanup; + } + streamGpioPinCfg->streamGpDigOutput[idx] = pinSelect; + } + + for (idx = 0U; idx < ADI_ADRV904X_DFE_CTRL_MAX_GPIO_ANA; idx++) + { + /* Find the signal for this gpio index */ + recoveryAction = adrv904x_GpioAnalogSignalFind(device, &analogPinSelect, anaOutputSignals[idx], ADI_ADRV904X_CHOFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "GpioSignalGet issue for analog output"); + goto cleanup; + } + streamGpioPinCfg->streamGpAnaOutput[idx] = analogPinSelect; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_OrxNcoFreqCalculate(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e orxChannel, + const uint32_t txSynthesisBwLower_kHz, + const uint32_t txSynthesisBwUpper_kHz, + int32_t* const ncoShiftFreqAdc_kHz, + int32_t* const ncoShiftFreqDatapath_kHz) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + uint32_t orxChannelIdx = 0U; + uint32_t centreTxSynthesisBw_kHz = (txSynthesisBwLower_kHz + txSynthesisBwUpper_kHz)/2U; + uint32_t boundaryDistanceLower = 0U; + uint32_t boundaryDistanceUpper = 0U; + uint32_t nyquistZone1SynthesisBwUpper = 0U; + uint32_t nyquistZone1SynthesisBwLower = 0U; + uint32_t orxAdcSampleRate_kHz = 0U; + int32_t passbandEdgeShift = 0; + int32_t localNcoShiftFreqAdc_kHz = 0; + uint8_t validRangeSynthesisBw = 0U; + + const uint32_t ORX_ADC_RATE_GUARD_REGION_KHZ = 100000U; /* Distance between the RF synthesis BW edges and multiples of FS/2 */ + const float HB_FILTER_PASSBAND_EDGE = 0.44f; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, ncoShiftFreqAdc_kHz, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, ncoShiftFreqDatapath_kHz, cleanup); + + /* Range check orxChannel enum */ + if ((orxChannel != ADI_ADRV904X_ORX0) && + (orxChannel != ADI_ADRV904X_ORX1)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, recoveryAction, orxChannel, "ORx Channel selected is invalid. Must select ORx0-1."); + goto cleanup; + } + + orxChannelIdx = (orxChannel == ADI_ADRV904X_ORX0) ? 0U : 1U; + orxAdcSampleRate_kHz = device->initExtract.orx.orxChannelCfg[orxChannelIdx].orxAdcSampleRate_kHz; + /* Pick only the data that lies in the 0 to Fs region and shift that to DC */ + localNcoShiftFreqAdc_kHz = -(int32_t)(centreTxSynthesisBw_kHz % orxAdcSampleRate_kHz); + /* Recalculate the upper and lower synthesis Bw edges such that it lies in the 0 to Fs region*/ + nyquistZone1SynthesisBwUpper = txSynthesisBwUpper_kHz % orxAdcSampleRate_kHz; + nyquistZone1SynthesisBwLower = txSynthesisBwLower_kHz % orxAdcSampleRate_kHz; + + /* if the RF synthesis BW lies across an Fs boundary, the values of the upper synthesis BW + * would end up lower than the lower synthesis BW edge */ + if (nyquistZone1SynthesisBwUpper < nyquistZone1SynthesisBwLower) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txSynthesisBwUpper_kHz, + "Invalid relation between Tx synthesis bandwidth upper and lower frequencies in the first Nyquist Zone"); + goto cleanup; + } + + /* Make sure the Synthesis Bandwidth is at least 100 MHz away from DC and Fs/2 or Fs/2 and Fs */ + /* If the signal lies in a odd nyquist zones (0 to 0.5*Fs) we need a -ve frequency shift at the NCO */ + if ((nyquistZone1SynthesisBwLower >= (ORX_ADC_RATE_GUARD_REGION_KHZ)) && + (nyquistZone1SynthesisBwUpper <= ((orxAdcSampleRate_kHz / 2U) - ORX_ADC_RATE_GUARD_REGION_KHZ))) + { + validRangeSynthesisBw = ADI_TRUE; + boundaryDistanceUpper = (orxAdcSampleRate_kHz / 2U) - nyquistZone1SynthesisBwUpper; + boundaryDistanceLower = nyquistZone1SynthesisBwLower; + } + + /* If the signal lies in a odd nyquist zones (0.5*Fs to Fs, 1.5*Fs to 2*Fs, 2.5Fs to 3*Fs) + * we need a +ve frequency shift at the NCO */ + if ((nyquistZone1SynthesisBwLower >= ((orxAdcSampleRate_kHz / 2U) + ORX_ADC_RATE_GUARD_REGION_KHZ)) && + (nyquistZone1SynthesisBwUpper <= (orxAdcSampleRate_kHz - ORX_ADC_RATE_GUARD_REGION_KHZ))) + { + validRangeSynthesisBw = ADI_TRUE; + boundaryDistanceUpper = orxAdcSampleRate_kHz - nyquistZone1SynthesisBwUpper; + boundaryDistanceLower = nyquistZone1SynthesisBwLower - (orxAdcSampleRate_kHz / 2U); + } + + /* Case when the Synthesis Bandwidth is very close to the Fs or Fs/2 boundary*/ + if (validRangeSynthesisBw == ADI_FALSE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txSynthesisBwUpper_kHz, + "Invalid range for Tx synthesis bandwidth upper and lower frequencies"); + goto cleanup; + } + + passbandEdgeShift = (int32_t)((HB_FILTER_PASSBAND_EDGE * + device->initExtract.orx.orxChannelCfg[orxChannelIdx].orxOutputRate_kHz) - + ((float)(txSynthesisBwUpper_kHz - centreTxSynthesisBw_kHz))); + /* If passbandEdgeShift is less than 0, the synthesis BW is greater than the 88% bandwidth supported by the ORx*/ + if (passbandEdgeShift < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txSynthesisBwUpper_kHz, + "Tx synthesis bandwidth is greater than the maximum supported by the ORX channel"); + goto cleanup; + } + + if (boundaryDistanceLower < boundaryDistanceUpper) + { + /* If the closest image is on the lower side of the SBW, we shift the + * observed synthesis BW to the lower edge the passband (- 0.44 * Fs)*/ + *ncoShiftFreqAdc_kHz = localNcoShiftFreqAdc_kHz - passbandEdgeShift; + *ncoShiftFreqDatapath_kHz = passbandEdgeShift; + } + else + { + /* If the closest image is on the upper side of the SBW, we shift the + * observed synthesis BW to the upper edge the passband (+ 0.44 * Fs)*/ + *ncoShiftFreqAdc_kHz = localNcoShiftFreqAdc_kHz + passbandEdgeShift; + *ncoShiftFreqDatapath_kHz = -passbandEdgeShift; + } + + /* Success */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingInit(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + + if (device->devStateInfo.txToOrxMappingConfig.mode != ADI_ADRV904X_TX_ORX_MAPPING_MODE_DFE_CTRL) + { + /* Initializes the RCI Tx To Orx Mapping Config, including its GPIOs */ + recoveryAction = adrv904x_TxToOrxMappingInit(device, &device->devStateInfo.txToOrxMappingConfig); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RCI Tx To Orx Mapping Init Failed"); + goto cleanup; + } + } + else + { + /* Initializes the DFE Ctrl Tx To Orx Mapping Config, including its GPIOs */ + recoveryAction = adrv904x_DfeCtrlTxToOrxMappingInit(device, &device->devStateInfo.dfeCtrlTxToOrxMappingConfig); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DFE Ctrl Tx To Orx Mapping Init Failed"); + goto cleanup; + } + } + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingConfigGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_TxToOrxMappingConfig_t* const mappingConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + adi_adrv904x_TxToOrxMappingMode_e lclMode = ADI_ADRV904X_TX_ORX_MAPPING_MODE_DFE_CTRL; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common) ; + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, mappingConfig, cleanup); + + + /* Check that Mapping Mode is NOT DFE CTRL. If it is, throw an error */ + lclMode = device->devStateInfo.txToOrxMappingConfig.mode; + if (lclMode == ADI_ADRV904X_TX_ORX_MAPPING_MODE_DFE_CTRL) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + lclMode, + "Device Tx to Orx Mapping is in DFE Ctrl Mode. This function can only be used in RCI mapping modes."); + goto cleanup; + } + + /* Grab configuration stored in the device handle*/ + ADI_LIBRARY_MEMCPY(mappingConfig, &device->devStateInfo.txToOrxMappingConfig, sizeof(adi_adrv904x_TxToOrxMappingConfig_t)); + + /*Success*/ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingSet(adi_adrv904x_Device_t* const device, + const uint8_t mapping) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t modeMask = 0U; + + + /* Always set VSWR FWD direction for non-VSWR tx-to-orx mapping commands on both Orx0/1 */ + uint8_t vswrDirection = ((uint8_t)ADI_ADRV904X_DFE_VSWR_FWD << 0U) | ((uint8_t)ADI_ADRV904X_DFE_VSWR_FWD << 1U); + + /* Check that Mapping Mode is NOT DFE CTRL. If it is, throw an error */ + adi_adrv904x_TxToOrxMappingMode_e lclMode = device->devStateInfo.txToOrxMappingConfig.mode; + if (lclMode == ADI_ADRV904X_TX_ORX_MAPPING_MODE_DFE_CTRL) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + lclMode, + "Device Tx to Orx Mapping is in DFE Ctrl Mode. This function can only be used in RCI mapping modes."); + goto cleanup; + } + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Get modeMask from the mode*/ + switch (device->devStateInfo.txToOrxMappingConfig.mode) + { + case ADI_ADRV904X_TX_ORX_MAPPING_MODE_2BIT: + modeMask = 0x03U; + break; + case ADI_ADRV904X_TX_ORX_MAPPING_MODE_3BIT: + modeMask = 0x07U; + break; + case ADI_ADRV904X_TX_ORX_MAPPING_MODE_4BIT: + modeMask = 0x0FU; + break; + case ADI_ADRV904X_TX_ORX_MAPPING_MODE_6BIT: + modeMask = 0x3FU; + break; + case ADI_ADRV904X_TX_ORX_MAPPING_MODE_8BIT: /* Fallthrough */ + default: + modeMask = 0xFFU; + break; + } + + /* Range check mapping byte against Mapping Mode */ + if ((mapping & modeMask) != mapping) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + mapping, + "Tx to Orx Mapping byte requested is not valid for use with the device's Mapping Mode configuration"); + goto cleanup; + } + + /* Write mapping byte to scratch reg for the stream to readback */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + ADRV904X_CPU_TX_ORX_MAPPING_SET_SCRATCH_REG_ID, + mapping); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while setting Tx to ORx mapping selection."); + goto cleanup; + } + + + /* Always set VSWR FWD direction for non-VSWR tx-to-orx mapping commands */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + ADRV904X_DFE_VSWR_DIRECTION_SCRATCH_REG_ID, + vswrDirection); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while setting Vswr direction scrathpad register"); + goto cleanup; + } + + /* Trigger stream */ + recoveryAction = adrv904x_StreamTrigger(device, ADRV904X_STREAM_MAIN_TX_TO_ORX_MAP); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while triggering Core Stream to apply Tx to Orx mapping"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e orxChannel, + adi_adrv904x_TxChannels_e* const txChannel) +{ + static const uint8_t NIBBLE_TX_MASK = 0x07U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t readNibble = 0U; + uint8_t txIdx = 0U; + uint8_t noMapState = 0U; + uint32_t txChanSel = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common) ; + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txChannel, cleanup); + + /* Range check orxChannel enum */ + if ((orxChannel != ADI_ADRV904X_ORX0) && + (orxChannel != ADI_ADRV904X_ORX1)) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + orxChannel, + "ORx Channel selected is invalid. Must select ORx0-1.") ; + goto cleanup; + } + + /* Readback current mapping */ + if (orxChannel == ADI_ADRV904X_ORX0) + { + recoveryAction = adrv904x_Core_RadioControlInterfaceOrx0Map_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &readNibble); + } + else + { + recoveryAction = adrv904x_Core_RadioControlInterfaceOrx1Map_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &readNibble); + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while retrieving current Tx to ORx map for selected ORx channel."); + goto cleanup; + } + + if (noMapState ) + { + *txChannel = ADI_ADRV904X_TXOFF; + } + else + { + txIdx = NIBBLE_TX_MASK & readNibble; + txChanSel = 1U << (uint32_t)txIdx; + *txChannel = (adi_adrv904x_TxChannels_e)(txChanSel); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingPresetAttenSet( adi_adrv904x_Device_t* const device, + const uint32_t mapping, + const uint8_t presetAtten_dB, + const uint8_t immediateUpdate) +{ + static const uint8_t MAX_ORX_ATTEN_DB = 16U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t txIdx = 0U; + uint32_t txChannelMask = (mapping & (~TX_TO_ORX_EXTENDED_MAPPING_FLAG)); + uint32_t extendedMappingFlag = (mapping & TX_TO_ORX_EXTENDED_MAPPING_FLAG); + uint8_t tmpMask = 0U; + adi_adrv904x_Channels_e tmpChannel = ADI_ADRV904X_CHOFF; + uint8_t sendToCpu[ADI_ADRV904X_CPU_TYPE_MAX_RADIO] = { ADI_FALSE, ADI_FALSE }; + uint8_t txChanMaskForCpu[ADI_ADRV904X_CPU_TYPE_MAX_RADIO] = { 0U }; + uint32_t cpuIdx = 0U; + adi_adrv904x_CpuType_e cpuType = ADI_ADRV904X_CPU_TYPE_UNKNOWN; + + adrv904x_CpuCmd_SetTxToOrxPresetAtten_t cmd; + adrv904x_CpuCmd_SetTxToOrxPresetAttenResp_t cmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_MAILBOX_ERROR; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_LIBRARY_MEMSET(&cmd, 0, sizeof(adrv904x_CpuCmd_SetTxToOrxPresetAtten_t)); + ADI_LIBRARY_MEMSET(&cmdRsp, 0, sizeof(adrv904x_CpuCmd_SetTxToOrxPresetAttenResp_t)); + + + + if (extendedMappingFlag != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + mapping, + "Requested Mapping is not supported"); + goto cleanup; + + } + + /* Check that requested mapping are valid */ + if ((txChannelMask != (txChannelMask & 0x00FFU)) || /* Value Not in Range 0x00 to 0xFF */ + (mapping == TX_TO_ORX_EXTENDED_MAPPING_FLAG) || /* Extended Flag & 0x00 Bitmask */ + (txChannelMask == 0U)) /* 0x00 Bitmask */ + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + txChannelMask, + "Requested Mapping is Invalid"); + goto cleanup; + } + + /* Check preset value is valid */ + if (presetAtten_dB > MAX_ORX_ATTEN_DB) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + presetAtten_dB, + "presetAtten_dB outside maximum range"); + goto cleanup; + } + + /* Check that immediateUpdate is valid */ + if ((immediateUpdate != ADI_TRUE) && + (immediateUpdate != ADI_FALSE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + immediateUpdate, + "immediateUpdate is invalid. Must be 0 or 1."); + goto cleanup; + } + + /* Check that immediateUpdate is valid for State Mappings */ + if ((immediateUpdate == ADI_TRUE) && + (extendedMappingFlag == TX_TO_ORX_EXTENDED_MAPPING_FLAG)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + immediateUpdate, + "Immediate Update Cannot Be Performed with a State Mapping"); + goto cleanup; + } + + if (extendedMappingFlag == TX_TO_ORX_EXTENDED_MAPPING_FLAG) + { + /* State Mapping Specific Command */ + cmd.extendedMappingFlag = ADI_TRUE; + sendToCpu[0U] = ADI_TRUE; + cmd.chanSelect = txChannelMask; + } + else + { + for (txIdx = 0U; txIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++txIdx) + { + /* Get channel number enum for this txIdx */ + tmpMask = (1U << txIdx); + tmpMask = (tmpMask & ((uint8_t) txChannelMask)); + tmpChannel = (adi_adrv904x_Channels_e)(tmpMask); + + /* If channel enum is TXOFF, skip this channel */ + if (tmpChannel == ADI_ADRV904X_CHOFF) + { + continue; + } + + /* Get the CPU assigned to this channel*/ + recoveryAction = adrv904x_CpuChannelMappingGet( device, tmpChannel, ADRV904X_CPU_OBJID_SYSTEM_END, &cpuType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to get CPU channel mapping"); + goto cleanup; + } + + /* Set bit for target CPU */ + cpuIdx = (uint8_t)(cpuType); + sendToCpu[cpuIdx] = ADI_TRUE; + txChanMaskForCpu[cpuIdx] |= tmpMask; + } + } + + /* Loop through CPUs and send CPU cmd to only those required */ + for (cpuIdx = 0U; cpuIdx < (uint32_t)ADI_ADRV904X_CPU_TYPE_MAX_RADIO; cpuIdx++) + { + if (sendToCpu[cpuIdx] == ADI_TRUE) + { + /* Set cpuType */ + cpuType = (adi_adrv904x_CpuType_e)cpuIdx; + + /* Setup cmd-specific payload */ + if (extendedMappingFlag != TX_TO_ORX_EXTENDED_MAPPING_FLAG) + { + cmd.chanSelect = txChanMaskForCpu[cpuIdx]; + } + cmd.presetAtten_dB = (uint8_t) presetAtten_dB; + cmd.immediateUpdate = (uint8_t) immediateUpdate; + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + cpuType, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_TX_TO_ORX_PRESET_ATTEN, + (void*)&cmd, + sizeof(cmd), + (void*)&cmdRsp, + sizeof(cmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(cmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingPresetAttenGet_v2( adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxToOrxMappingPinTable_e mapping, + uint8_t* const presetAtten_dB) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t scratchRegId = 0U; + uint8_t scratchAttenVal = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, presetAtten_dB, cleanup); + + *presetAtten_dB = 0U; + + /* Check that requested Mapping is valid and determine scratchpadRegId for selected Mapping */ + switch (mapping) + { + case ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX0: + scratchRegId = ADRV904X_CPU_TX_0_ORX_ATTEN; + break; + + case ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX1: + scratchRegId = ADRV904X_CPU_TX_1_ORX_ATTEN; + break; + + case ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX2: + scratchRegId = ADRV904X_CPU_TX_2_ORX_ATTEN; + break; + + case ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX3: + scratchRegId = ADRV904X_CPU_TX_3_ORX_ATTEN; + break; + + case ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX4: + scratchRegId = ADRV904X_CPU_TX_4_ORX_ATTEN; + break; + + case ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX5: + scratchRegId = ADRV904X_CPU_TX_5_ORX_ATTEN; + break; + + case ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX6: + scratchRegId = ADRV904X_CPU_TX_6_ORX_ATTEN; + break; + + case ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX7: + scratchRegId = ADRV904X_CPU_TX_7_ORX_ATTEN; + break; + + + case ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX0: + scratchRegId = ADRV904X_CPU_MAPVAL_8_ATTEN; + break; + + case ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX1: + scratchRegId = ADRV904X_CPU_MAPVAL_9_ATTEN; + break; + + case ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX2: + scratchRegId = ADRV904X_CPU_MAPVAL_A_ATTEN; + break; + + case ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX3: + scratchRegId = ADRV904X_CPU_MAPVAL_B_ATTEN; + break; + + case ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX4: + scratchRegId = ADRV904X_CPU_MAPVAL_C_ATTEN; + break; + + case ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX5: + scratchRegId = ADRV904X_CPU_MAPVAL_D_ATTEN; + break; + + case ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX6: + scratchRegId = ADRV904X_CPU_MAPVAL_E_ATTEN; + break; + + case ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX7: + scratchRegId = ADRV904X_CPU_MAPVAL_F_ATTEN; + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + mapping, + "Requested Mapping is Invalid - Check adi_adrv904x_TxToOrxMapping_e for Valid Values"); + goto cleanup; + break; + } + + /* Readback Scratchpad value */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + scratchRegId, + &scratchAttenVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read Tx to Orx Preset value for Orx Atten"); + goto cleanup; + } + + /* Convert to dB, same as in OrxAttenGet*/ + recoveryAction = adrv904x_ORxTrmAttenToDb(device, scratchAttenVal, presetAtten_dB); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to resolve Orx Atten value in dB for Tx to Orx Preset"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingPresetAttenGet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + uint8_t* const presetAtten_dB) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t scratchRegId = 0U; + uint8_t scratchAttenVal = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, presetAtten_dB, cleanup); + + /* Check that requested Tx channel is valid and determine scratchpadRegId for selected channel */ + switch (txChannel) + { + case ADI_ADRV904X_TX0: + scratchRegId = ADRV904X_CPU_TX_0_ORX_ATTEN; + break; + + case ADI_ADRV904X_TX1: + scratchRegId = ADRV904X_CPU_TX_1_ORX_ATTEN; + break; + + case ADI_ADRV904X_TX2: + scratchRegId = ADRV904X_CPU_TX_2_ORX_ATTEN; + break; + + case ADI_ADRV904X_TX3: + scratchRegId = ADRV904X_CPU_TX_3_ORX_ATTEN; + break; + + case ADI_ADRV904X_TX4: + scratchRegId = ADRV904X_CPU_TX_4_ORX_ATTEN; + break; + + case ADI_ADRV904X_TX5: + scratchRegId = ADRV904X_CPU_TX_5_ORX_ATTEN; + break; + + case ADI_ADRV904X_TX6: + scratchRegId = ADRV904X_CPU_TX_6_ORX_ATTEN; + break; + + case ADI_ADRV904X_TX7: + scratchRegId = ADRV904X_CPU_TX_7_ORX_ATTEN; + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + txChannel, + "Requested Tx channel is invalid. Must be Tx Channel 0-7."); + goto cleanup; + break; + } + + /* Readback Scratchpad value */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + scratchRegId, + &scratchAttenVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read Tx to Orx Preset value for Orx Atten"); + goto cleanup; + } + + /* Convert to dB, same as in OrxAttenGet*/ + recoveryAction = adrv904x_ORxTrmAttenToDb(device, scratchAttenVal, presetAtten_dB); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to resolve Orx Atten value in dB for Tx to Orx Preset"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingPresetNcoSet( adi_adrv904x_Device_t* const device, + const uint32_t mapping, + const adi_adrv904x_TxToOrxMappingPresetNco_t* const presetNco, + const uint8_t immediateUpdate) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t txIdx = 0U; + uint32_t txChannelMask = (mapping & (~TX_TO_ORX_EXTENDED_MAPPING_FLAG)); + uint32_t extendedMappingFlag = (mapping & TX_TO_ORX_EXTENDED_MAPPING_FLAG); + uint8_t tmpMask = 0U; + adi_adrv904x_Channels_e tmpChannel = ADI_ADRV904X_CHOFF; + uint8_t sendToCpu[ADI_ADRV904X_CPU_TYPE_MAX_RADIO] = { ADI_FALSE, ADI_FALSE }; + uint8_t txChanMaskForCpu[ADI_ADRV904X_CPU_TYPE_MAX_RADIO] = { 0U }; + uint32_t cpuIdx = 0U; + adi_adrv904x_CpuType_e cpuType = ADI_ADRV904X_CPU_TYPE_UNKNOWN; + + adrv904x_CpuCmd_SetTxToOrxPresetNco_t cmd; + adrv904x_CpuCmd_SetTxToOrxPresetNcoResp_t cmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_MAILBOX_ERROR; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common) ; + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, presetNco, cleanup); + + ADI_LIBRARY_MEMSET(&cmd, 0, sizeof(adrv904x_CpuCmd_SetTxToOrxPresetNco_t)); + ADI_LIBRARY_MEMSET(&cmdRsp, 0, sizeof(adrv904x_CpuCmd_SetTxToOrxPresetNcoResp_t)); + + + + if (extendedMappingFlag != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + mapping, + "Requested Mapping is not supported"); + goto cleanup; + } + + /* Check that requested mapping are valid */ + if ((txChannelMask != (txChannelMask & 0x00FFU)) || /* Value Not in Range 0x00 to 0xFF */ + (mapping == TX_TO_ORX_EXTENDED_MAPPING_FLAG) || /* Extended Flag & 0x00 Bitmask */ + (txChannelMask == 0U)) /* 0x00 Bitmask */ + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + txChannelMask, + "Requested Mapping is Invalid"); + goto cleanup; + } + + /* Check preset adc nco freq value is valid */ + if ((presetNco->ncoFreqAdc_Khz > 8388607) || + (presetNco->ncoFreqAdc_Khz < -8388608)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + presetNco->ncoFreqAdc_Khz, + "presetNco->ncoFreqAdc_Khz outside maximum range. Must be in range -8388608 to 8388607"); + goto cleanup; + } + + /* Check preset datapath nco freq value is valid */ + if ((presetNco->ncoFreqDatapath_Khz > 8388607) || + (presetNco->ncoFreqDatapath_Khz < -8388608)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + presetNco->ncoFreqDatapath_Khz, + "presetNco->ncoFreqDatapath_Khz outside maximum range. Must be in range -8388608 to 8388607"); + goto cleanup; + } + + /* Check that immediateUpdate is valid */ + if ((immediateUpdate != ADI_TRUE) && + (immediateUpdate != ADI_FALSE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + immediateUpdate, + "immediateUpdate is invalid. Must be 0 or 1."); + goto cleanup; + } + + /* Check that immediateUpdate is valid for State Mappings */ + if ((immediateUpdate == ADI_TRUE) && + (extendedMappingFlag == TX_TO_ORX_EXTENDED_MAPPING_FLAG)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + immediateUpdate, + "Immediate Update Cannot Be Performed with a State Mapping"); + goto cleanup; + } + + if (extendedMappingFlag == TX_TO_ORX_EXTENDED_MAPPING_FLAG) + { + /* State Mapping Specific Command */ + cmd.extendedMappingFlag = ADI_TRUE; + sendToCpu[0U] = ADI_TRUE; + cmd.chanSelect = txChannelMask; + } + else + { + for (txIdx = 0U; txIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++txIdx) + { + /* Get channel number enum for this txIdx */ + tmpMask = (1U << txIdx); + tmpMask &= txChannelMask; + tmpChannel = (adi_adrv904x_Channels_e)(tmpMask); + + /* If channel enum is TXOFF, skip this channel */ + if (tmpChannel == ADI_ADRV904X_CHOFF) + { + continue; + } + + /* Get the CPU assigned to this channel */ + recoveryAction = adrv904x_CpuChannelMappingGet(device, tmpChannel, ADRV904X_CPU_OBJID_SYSTEM_END, &cpuType); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to get CPU channel mapping"); + goto cleanup; + } + + /* Set bit for target CPU */ + cpuIdx = (uint8_t)(cpuType); + sendToCpu[cpuIdx] = ADI_TRUE; + txChanMaskForCpu[cpuIdx] |= tmpMask; + } + } + + /* Loop through CPUs and send ARM cmd to only those required */ + for (cpuIdx = 0U; cpuIdx < (uint32_t)ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuIdx) + { + if (sendToCpu[cpuIdx] == ADI_TRUE) + { + /* Set cpuType */ + cpuType = (adi_adrv904x_CpuType_e)cpuIdx; + + /* Setup cmd-specific payload */ + if (extendedMappingFlag != TX_TO_ORX_EXTENDED_MAPPING_FLAG) + { + cmd.chanSelect = txChanMaskForCpu[cpuIdx]; + } + cmd.ncoFreqAdc_Khz = ADRV904X_HTOCL(presetNco->ncoFreqAdc_Khz); + cmd.ncoFreqDatapath_Khz = ADRV904X_HTOCL(presetNco->ncoFreqDatapath_Khz); + cmd.immediateUpdate = immediateUpdate; + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + cpuType, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_TX_TO_ORX_PRESET_NCO, + (void*)&cmd, + sizeof(cmd), + (void*)&cmdRsp, + sizeof(cmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(cmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingPresetNcoGet_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxToOrxMappingPinTable_e mapping, + adi_adrv904x_TxToOrxMappingPresetNco_t* const presetNco) +{ + const uint8_t NCO_NUM_BYTES = 3U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t scratchRegIdStart_adc = 0U; + uint8_t scratchRegIdStart_dp = 0U; + uint8_t tmpByte = 0U; + uint32_t tmpAdc = 0U; + uint32_t tmpDp = 0U; + uint8_t idx = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, presetNco, cleanup); + + ADI_LIBRARY_MEMSET(presetNco, 0, sizeof(adi_adrv904x_TxToOrxMappingPresetNco_t)); + + /* Check that requested Tx channel is valid and determine scratchpadRegIdStart for selected channel */ + switch (mapping) + { + case ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX0: + scratchRegIdStart_adc = ADRV904X_CPU_TX_0_ORX_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_TX_0_ORX_NCO_DP_FREQ_MSB; + break; + + case ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX1: + scratchRegIdStart_adc = ADRV904X_CPU_TX_1_ORX_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_TX_1_ORX_NCO_DP_FREQ_MSB; + break; + + case ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX2: + scratchRegIdStart_adc = ADRV904X_CPU_TX_2_ORX_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_TX_2_ORX_NCO_DP_FREQ_MSB; + break; + + case ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX3: + scratchRegIdStart_adc = ADRV904X_CPU_TX_3_ORX_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_TX_3_ORX_NCO_DP_FREQ_MSB; + break; + + case ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX4: + scratchRegIdStart_adc = ADRV904X_CPU_TX_4_ORX_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_TX_4_ORX_NCO_DP_FREQ_MSB; + break; + + case ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX5: + scratchRegIdStart_adc = ADRV904X_CPU_TX_5_ORX_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_TX_5_ORX_NCO_DP_FREQ_MSB; + break; + + case ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX6: + scratchRegIdStart_adc = ADRV904X_CPU_TX_6_ORX_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_TX_6_ORX_NCO_DP_FREQ_MSB; + break; + + case ADI_ADRV904X_TX_ORX_MAPPING_PIN_TABLE_TX7: + scratchRegIdStart_adc = ADRV904X_CPU_TX_7_ORX_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_TX_7_ORX_NCO_DP_FREQ_MSB; + break; + + + case ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX0: + scratchRegIdStart_adc = ADRV904X_CPU_MAPVAL_8_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_MAPVAL_8_NCO_DP_FREQ_MSB; + break; + + case ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX1: + scratchRegIdStart_adc = ADRV904X_CPU_MAPVAL_9_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_MAPVAL_9_NCO_DP_FREQ_MSB; + break; + + case ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX2: + scratchRegIdStart_adc = ADRV904X_CPU_MAPVAL_A_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_MAPVAL_A_NCO_DP_FREQ_MSB; + break; + + case ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX3: + scratchRegIdStart_adc = ADRV904X_CPU_MAPVAL_B_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_MAPVAL_B_NCO_DP_FREQ_MSB; + break; + + case ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX4: + scratchRegIdStart_adc = ADRV904X_CPU_MAPVAL_C_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_MAPVAL_C_NCO_DP_FREQ_MSB; + break; + + case ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX5: + scratchRegIdStart_adc = ADRV904X_CPU_MAPVAL_D_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_MAPVAL_D_NCO_DP_FREQ_MSB; + break; + + case ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX6: + scratchRegIdStart_adc = ADRV904X_CPU_MAPVAL_E_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_MAPVAL_E_NCO_DP_FREQ_MSB; + break; + + case ADI_ADRV904X_TX_TO_ORX_VSWR_MAPPING_TX7: + scratchRegIdStart_adc = ADRV904X_CPU_MAPVAL_F_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_MAPVAL_F_NCO_DP_FREQ_MSB; + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + mapping, + "Requested Mapping is Invalid - Check adi_adrv904x_TxToOrxMappingPinTable_e for Valid Values"); + goto cleanup; + break; + } + + /* Readback Scratchpad values */ + for (idx = 0U; idx < NCO_NUM_BYTES; ++idx) + { + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + (scratchRegIdStart_adc - idx), + &tmpByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read Tx to Orx Preset value for Orx ADC NCO"); + goto cleanup; + } + tmpAdc <<= 8U; + tmpAdc |= ((uint32_t)tmpByte); + + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + (scratchRegIdStart_dp - idx), + &tmpByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read Tx to Orx Preset value for Orx Datapath NCO"); + goto cleanup; + } + tmpDp <<= 8U; + tmpDp |= ((uint32_t)tmpByte); + } + + /* Readback values are 24bits. Returned results are int32_t, so sign extend data as needed */ + if ((tmpAdc & 0x00800000U) != 0U) + { + tmpAdc |= 0xFF000000U; + } + + if ((tmpDp & 0x00800000U) != 0U) + { + tmpDp |= 0xFF000000U; + } + + /* Store results */ + presetNco->ncoFreqAdc_Khz = (int32_t)tmpAdc; + presetNco->ncoFreqDatapath_Khz = (int32_t)tmpDp; + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingPresetNcoGet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_TxToOrxMappingPresetNco_t* const presetNco) +{ + const uint8_t NCO_NUM_BYTES = 3U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t scratchRegIdStart_adc = 0U; + uint8_t scratchRegIdStart_dp = 0U; + uint8_t tmpByte = 0U; + uint32_t tmpAdc = 0U; + uint32_t tmpDp = 0U; + uint8_t idx = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, presetNco, cleanup); + + ADI_LIBRARY_MEMSET(presetNco, 0, sizeof(adi_adrv904x_TxToOrxMappingPresetNco_t)); + + /* Check that requested Tx channel is valid and determine scratchpadRegIdStart for selected channel */ + switch (txChannel) + { + case ADI_ADRV904X_TX0: + scratchRegIdStart_adc = ADRV904X_CPU_TX_0_ORX_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_TX_0_ORX_NCO_DP_FREQ_MSB; + break; + + case ADI_ADRV904X_TX1: + scratchRegIdStart_adc = ADRV904X_CPU_TX_1_ORX_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_TX_1_ORX_NCO_DP_FREQ_MSB; + break; + + case ADI_ADRV904X_TX2: + scratchRegIdStart_adc = ADRV904X_CPU_TX_2_ORX_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_TX_2_ORX_NCO_DP_FREQ_MSB; + break; + + case ADI_ADRV904X_TX3: + scratchRegIdStart_adc = ADRV904X_CPU_TX_3_ORX_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_TX_3_ORX_NCO_DP_FREQ_MSB; + break; + + case ADI_ADRV904X_TX4: + scratchRegIdStart_adc = ADRV904X_CPU_TX_4_ORX_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_TX_4_ORX_NCO_DP_FREQ_MSB; + break; + + case ADI_ADRV904X_TX5: + scratchRegIdStart_adc = ADRV904X_CPU_TX_5_ORX_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_TX_5_ORX_NCO_DP_FREQ_MSB; + break; + + case ADI_ADRV904X_TX6: + scratchRegIdStart_adc = ADRV904X_CPU_TX_6_ORX_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_TX_6_ORX_NCO_DP_FREQ_MSB; + break; + + case ADI_ADRV904X_TX7: + scratchRegIdStart_adc = ADRV904X_CPU_TX_7_ORX_NCO_ADC_FREQ_MSB; + scratchRegIdStart_dp = ADRV904X_CPU_TX_7_ORX_NCO_DP_FREQ_MSB; + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + txChannel, + "Requested Tx channel is invalid. Must be Tx Channel 0-7."); + goto cleanup; + break; + } + + /* Readback Scratchpad values */ + for (idx = 0U; idx < NCO_NUM_BYTES; idx++) + { + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + (scratchRegIdStart_adc - idx), + &tmpByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read Tx to Orx Preset value for Orx ADC NCO"); + goto cleanup; + } + tmpAdc <<= 8U; + tmpAdc |= ((uint32_t) tmpByte); + + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + (scratchRegIdStart_dp - idx), + &tmpByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read Tx to Orx Preset value for Orx Datapath NCO"); + goto cleanup; + } + tmpDp <<= 8U; + tmpDp |= ((uint32_t) tmpByte); + } + + /* Readback values are 24bits. Returned results are int32_t, so sign extend data as needed */ + if ((tmpAdc & 0x00800000U) != 0U) + { + tmpAdc |= 0xFF000000U; + } + + if ((tmpDp & 0x00800000U) != 0U) + { + tmpDp |= 0xFF000000U; + } + + /* Store results */ + presetNco->ncoFreqAdc_Khz = (int32_t)tmpAdc; + presetNco->ncoFreqDatapath_Khz = (int32_t)tmpDp; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_StreamVersionGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_Version_t* const streamVersion) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t ver[4U] = { 0U }; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, streamVersion, cleanup); + + if ((device->devStateInfo.devState & ADI_ADRV904X_STATE_STREAMLOADED) != ADI_ADRV904X_STATE_STREAMLOADED) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Stream binary must be loaded before getting stream version"); + goto cleanup; + } + + /* Read the StreamVersion */ + recoveryAction = adi_adrv904x_Registers32Read(device, NULL, ADI_ADRV904X_STREAM_VERSION_ADDR, ver, NULL, 4U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading Stream Version registers"); + goto cleanup; + } + /* Store the StreamVersion */ + streamVersion->majorVer = ver[0U]; + streamVersion->minorVer = ver[1U]; + streamVersion->maintenanceVer = ver[2U]; + streamVersion->buildVer = ver[3U]; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalConfigSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_RxRadioCtrlAntennaCalConfig_t * const configRx, + adi_adrv904x_TxRadioCtrlAntennaCalConfig_t * const configTx) +{ + + static const uint32_t txScratchPad2[] = { (uint32_t)ADRV904X_ADDR_TX0_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_TX1_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_TX2_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_TX3_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_TX4_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_TX5_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_TX6_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_TX7_STREAM_SCRATCH2 }; + + static const uint32_t rxScratchPad2[] = { (uint32_t)ADRV904X_ADDR_RX0_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_RX1_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_RX2_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_RX3_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_RX4_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_RX5_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_RX6_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_RX7_STREAM_SCRATCH2 }; + + static const uint32_t TX_SCRATCH2_WRITE_MASK = 0x00FFFFFFU; + static const uint32_t RX_SCRATCH_WRITE_MASK = 0xFFFFFFFFU; + static const uint32_t RX_SCRATCH_WRITE_SHIFT = 24U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t txScratch2WriteValue = 0U; + uint32_t rxScratchWriteValue = 0U; + adi_adrv904x_RxGain_t rxGain; + uint16_t attenRegVal = 0U; + uint32_t chanId = 0U; + uint32_t chanSel = 0U; + adrv904x_BfTxFuncsChanAddr_e txBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_FUNCS; + + adrv904x_BfTxCfrRegChanAddr_e txCfrBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_CFR_TX_CFR_REG; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, configRx, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, configTx, cleanup); + + ADI_LIBRARY_MEMSET(&rxGain, 0, sizeof(rxGain)); + + /*Check that if requested Rx Channel valid*/ + if ((configRx->rxChannelMask & (~(uint32_t)ADI_ADRV904X_RX_MASK_ALL)) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + configRx->rxChannelMask, + "Invalid channel is selected for Rx config. Valid values are 0 or any combinations of Rx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + if ((configTx->txChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + configTx->txChannelMask, + "Invalid channel is selected for Tx config. Valid values are 0 or any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + txScratch2WriteValue = (uint32_t)(configTx->txNcoFreqKhz) & TX_SCRATCH2_WRITE_MASK; + /* Change the sign of the frequency because there is an I/Q swap in the HW */ + rxScratchWriteValue = (((uint32_t)configRx->rxGainIndex & 0x000000FF) << RX_SCRATCH_WRITE_SHIFT) | + ((uint32_t)(-configRx->rxNcoFreqKhz) & 0x00FFFFFF); + + /* for each Tx channel in txChannelMask */ + for (chanId = 0U; chanId < ADI_ADRV904X_MAX_TXCHANNELS; chanId++) + { + if ((configTx->txChannelMask & (1U << chanId)) == 0U) + { + /* Skip channel. It's not in chanMask. */ + continue; + } + + if (configTx->txAttenuation_mdB > ADRV904X_TX_ATTEN_VALUE_MILLI_DB_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + configTx->txAttenuation_mdB, + "Invalid txAttenuation_mdB value"); + goto cleanup; + } + + /* ChanId is selected in chanMask */ + chanSel = (1U << chanId); + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanId, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + + recoveryAction = adrv904x_CfrRegsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txCfrBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanSel, "Invalid Tx Channel used to determine CFR base address"); + goto cleanup; + } + + /* Conversion from the requested atten level (milli-dB) to equivalent + * TxAttenTable index is always done based on a step size of 0.05. + * Other step sizes are not supported. */ + attenRegVal = (configTx->txAttenuation_mdB / ADRV904X_TX_ATTEN_STEP_SIZE_DIV_0P05); + + recoveryAction = adrv904x_TxFuncs_TxAttenuation_BfSet(device, + NULL, + txBaseAddr, + attenRegVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx PA Protect Input Select"); + goto cleanup; + } + + + /* storing Tx attenuation for AC. This value is only used when SBET is enabled */ + recoveryAction = adrv904x_TxCfrReg_Cfr1Spare_BfSet(device, + NULL, + txCfrBaseAddr, + (uint32_t)attenRegVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Cfr1 Spare register"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, txScratchPad2[chanId], txScratch2WriteValue, TX_SCRATCH2_WRITE_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot write Tx scratch pad register 2"); + goto cleanup; + } + } + + /* for each Rx channel in rxChannelMask */ + for (chanId = 0U; chanId < ADI_ADRV904X_MAX_RX_ONLY; chanId++) + { + if ((configRx->rxChannelMask & (1U << chanId)) == 0) + { + /* Skip channel. It's not in chanMask. */ + continue; + } + + rxGain.gainIndex = configRx->rxGainIndex; + rxGain.rxChannelMask = configRx->rxChannelMask; + + recoveryAction = adrv904x_RxGainSetRangeCheck(device, &rxGain, 1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Rx gain is out of range"); + goto cleanup; + } + + /* ChanId is selected in chanMask */ + recoveryAction = adi_adrv904x_Register32Write(device, NULL, rxScratchPad2[chanId], rxScratchWriteValue, RX_SCRATCH_WRITE_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot write Rx scratch pad register 2"); + goto cleanup; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalConfigGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_RxRadioCtrlAntennaCalConfig_t * const configRx, + adi_adrv904x_TxRadioCtrlAntennaCalConfig_t * const configTx) +{ + + static const uint32_t txScratchPad2[] = { + (uint32_t)ADRV904X_ADDR_TX0_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_TX1_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_TX2_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_TX3_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_TX4_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_TX5_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_TX6_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_TX7_STREAM_SCRATCH2 + }; + + static const uint32_t rxScratchPad2[] = { + (uint32_t)ADRV904X_ADDR_RX0_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_RX1_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_RX2_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_RX3_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_RX4_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_RX5_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_RX6_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_RX7_STREAM_SCRATCH2 + }; + + static const uint32_t TX_SCRATCH2_READ_MASK = 0x00FFFFFFU; + static const uint32_t RX_SCRATCH2_READ_MASK = 0xFFFFFFFFU; + static const uint32_t RX_SCRATCH2_READ_SHIFT = 24U; + static const uint32_t NCO_SIGN_MASK = 0x00800000U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t txScratch2ReadValue = 0U; + uint32_t rxScratch2ReadValue = 0U; + uint16_t attenRegVal = 0U; + uint32_t txChanId = 0U; + uint32_t rxChanId = 0U; + uint32_t chanSel = 0U; + adrv904x_BfTxFuncsChanAddr_e txBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_FUNCS; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, configRx, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, configTx, cleanup); + + if ((configRx->rxChannelMask != (uint32_t)ADI_ADRV904X_RXOFF) && + (configRx->rxChannelMask != (uint32_t)ADI_ADRV904X_RX0) && + (configRx->rxChannelMask != (uint32_t)ADI_ADRV904X_RX1) && + (configRx->rxChannelMask != (uint32_t)ADI_ADRV904X_RX2) && + (configRx->rxChannelMask != (uint32_t)ADI_ADRV904X_RX3) && + (configRx->rxChannelMask != (uint32_t)ADI_ADRV904X_RX4) && + (configRx->rxChannelMask != (uint32_t)ADI_ADRV904X_RX5) && + (configRx->rxChannelMask != (uint32_t)ADI_ADRV904X_RX6) && + (configRx->rxChannelMask != (uint32_t)ADI_ADRV904X_RX7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + configRx->rxChannelMask, + "Invalid Rx channel is selected. User should select one channel or CHOFF only"); + goto cleanup; + } + + if ((configTx->txChannelMask != (uint32_t)ADI_ADRV904X_TXOFF) && + (configTx->txChannelMask != (uint32_t)ADI_ADRV904X_TX0) && + (configTx->txChannelMask != (uint32_t)ADI_ADRV904X_TX1) && + (configTx->txChannelMask != (uint32_t)ADI_ADRV904X_TX2) && + (configTx->txChannelMask != (uint32_t)ADI_ADRV904X_TX3) && + (configTx->txChannelMask != (uint32_t)ADI_ADRV904X_TX4) && + (configTx->txChannelMask != (uint32_t)ADI_ADRV904X_TX5) && + (configTx->txChannelMask != (uint32_t)ADI_ADRV904X_TX6) && + (configTx->txChannelMask != (uint32_t)ADI_ADRV904X_TX7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + configTx->txChannelMask, + "Invalid Tx channel is selected. User should select one channel or CHOFF only"); + goto cleanup; + } + + if (configTx->txChannelMask == (uint32_t)ADI_ADRV904X_TXOFF) + { + configTx->txAttenuation_mdB = 0U; + configTx->txNcoFreqKhz = 0; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + else + { + chanSel = configTx->txChannelMask; + txChanId = adrv904x_TxChannelsToId((adi_adrv904x_TxChannels_e)chanSel); + + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanSel, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_TxAttenuation_BfGet(device, + NULL, + txBaseAddr, + &attenRegVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx slice attenuation"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Read(device, NULL, txScratchPad2[txChanId], &txScratch2ReadValue, TX_SCRATCH2_READ_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot read Tx scratch pad register 2"); + goto cleanup; + } + + if ((txScratch2ReadValue & NCO_SIGN_MASK) > 0) + { + /* handle the negative case */ + configTx->txNcoFreqKhz = (int32_t)((~txScratch2ReadValue & 0x00FFFFFF) + 1) * (-1); + } + else + { + /* handle the positive case */ + configTx->txNcoFreqKhz = (int32_t)(txScratch2ReadValue & 0x00FFFFFF); + } + + /* Conversion from the atten level (milli-dB) to equivalent + * TxAttenTable index is always done based on a step size of 0.05. + * Other step sizes are not supported. */ + configTx->txAttenuation_mdB = (attenRegVal * ADRV904X_TX_ATTEN_STEP_SIZE_DIV_0P05); + } + + if (configRx->rxChannelMask == (uint32_t)ADI_ADRV904X_RXOFF) + { + configRx->rxGainIndex = 0U; + configRx->rxNcoFreqKhz = 0; + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + else + { + chanSel = configRx->rxChannelMask; + rxChanId = adrv904x_RxChannelsToId((adi_adrv904x_RxChannels_e)chanSel); + + recoveryAction = adi_adrv904x_Register32Read(device, NULL, rxScratchPad2[rxChanId], &rxScratch2ReadValue, RX_SCRATCH2_READ_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot read Rx scratch pad register 2"); + goto cleanup; + } + + if ((rxScratch2ReadValue & NCO_SIGN_MASK) > 0) + { + /* handle the negative case */ + configRx->rxNcoFreqKhz = (int32_t)((~rxScratch2ReadValue & 0x00FFFFFF) + 1) * (-1); + } + else + { + /* handle the positive case */ + configRx->rxNcoFreqKhz = (int32_t)(rxScratch2ReadValue & 0x00FFFFFF); + } + configRx->rxNcoFreqKhz *= (-1); /* Change the sign of the frequency because there is an I/Q swap in the HW */ + + configRx->rxGainIndex = (rxScratch2ReadValue >> RX_SCRATCH2_READ_SHIFT); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalErrorGet(adi_adrv904x_Device_t* const device, + const uint32_t channelSel, + uint8_t * const errStatus) +{ + static const uint32_t txScratchPad1[] = { + (uint32_t)ADRV904X_ADDR_TX0_STREAM_SCRATCH1, + (uint32_t)ADRV904X_ADDR_TX1_STREAM_SCRATCH1, + (uint32_t)ADRV904X_ADDR_TX2_STREAM_SCRATCH1, + (uint32_t)ADRV904X_ADDR_TX3_STREAM_SCRATCH1, + (uint32_t)ADRV904X_ADDR_TX4_STREAM_SCRATCH1, + (uint32_t)ADRV904X_ADDR_TX5_STREAM_SCRATCH1, + (uint32_t)ADRV904X_ADDR_TX6_STREAM_SCRATCH1, + (uint32_t)ADRV904X_ADDR_TX7_STREAM_SCRATCH1 + }; + + static const uint32_t rxScratchPad0[] = { + (uint32_t)ADRV904X_ADDR_RX0_STREAM_SCRATCH0, + (uint32_t)ADRV904X_ADDR_RX1_STREAM_SCRATCH0, + (uint32_t)ADRV904X_ADDR_RX2_STREAM_SCRATCH0, + (uint32_t)ADRV904X_ADDR_RX3_STREAM_SCRATCH0, + (uint32_t)ADRV904X_ADDR_RX4_STREAM_SCRATCH0, + (uint32_t)ADRV904X_ADDR_RX5_STREAM_SCRATCH0, + (uint32_t)ADRV904X_ADDR_RX6_STREAM_SCRATCH0, + (uint32_t)ADRV904X_ADDR_RX7_STREAM_SCRATCH0 + }; + + static const uint32_t TX_ANT_CAL_ERROR_READ_MASK = 0x000000D8U; + static const uint32_t RX_ANT_CAL_ERROR_READ_MASK = 0x00000CC0U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t txScratch1ReadValue = 0U; + uint32_t rxScratch0ReadValue = 0U; + uint32_t chanId = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, errStatus, cleanup); + + if ((channelSel != (uint32_t)ADI_ADRV904X_CH0) && + (channelSel != (uint32_t)ADI_ADRV904X_CH1) && + (channelSel != (uint32_t)ADI_ADRV904X_CH2) && + (channelSel != (uint32_t)ADI_ADRV904X_CH3) && + (channelSel != (uint32_t)ADI_ADRV904X_CH4) && + (channelSel != (uint32_t)ADI_ADRV904X_CH5) && + (channelSel != (uint32_t)ADI_ADRV904X_CH6) && + (channelSel != (uint32_t)ADI_ADRV904X_CH7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + channelSel, + "Invalid channel is selected. User should select one channel only"); + goto cleanup; + + } + + chanId = adrv904x_TxChannelsToId((adi_adrv904x_TxChannels_e)channelSel); + + recoveryAction = adi_adrv904x_Register32Read(device, NULL, txScratchPad1[chanId], &txScratch1ReadValue, TX_ANT_CAL_ERROR_READ_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot read Tx scratch pad register 1"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Read(device, NULL, rxScratchPad0[chanId], &rxScratch0ReadValue, RX_ANT_CAL_ERROR_READ_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot read Rx scratch pad register 0"); + goto cleanup; + } + + /* In scratch register, Bit 3-4 has Tx Low High stream errors - Bit 6-7 has Tx Ant Cal Low High stream errors */ + txScratch1ReadValue = ((txScratch1ReadValue & 0xC0U) >> 6U) | ((txScratch1ReadValue & 0x18U) >> 1U); + + /* In scratch register, Bit 10-11 has Rx Low High stream errors - Bit 6-7 has Tx Ant Cal Low High stream errors */ + rxScratch0ReadValue = ((rxScratch0ReadValue & 0xC0U) >> 6U) | ((rxScratch0ReadValue & 0xC00U) >> 8U); + + /* Store Tx error bits in LSB and Rx error bits in MSB */ + *errStatus = (txScratch1ReadValue) | (rxScratch0ReadValue << 4U); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_StreamProcErrorGet( adi_adrv904x_Device_t* const device, + adi_adrv904x_StreamErrArray_t* const streamErr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t isErrInStream = 0U; + uint16_t streamErrorCode = 0U; + uint8_t i = 0U; + + /*struct to aid separate processor type and id for each stream processor*/ + typedef struct adrv904x_streamProcAttribs + { + adrv904x_BfStreamprocChanAddr_e chanAddr; + adi_adrv904x_StreamProcType_e procType; + uint8_t procId; + } adrv904x_streamProcAttribs_t; + + /*Creates the NUM_STREAM_PROCS size array for the stream processors. + *Each element is a struct that has the address, the type and the id of the stream processor*/ + static const adrv904x_streamProcAttribs_t streamProcAttribs[ADI_ADRV904X_STREAM_MAX] = { + {ADRV904X_BF_DIGITAL_CORE_MAIN_STREAM_PROC, ADI_ADRV904X_STREAM_MAIN, 0}, + {ADRV904X_BF_DIGITAL_CORE_KFA_STREAM_PROC_REGS, ADI_ADRV904X_STREAM_KFA, 0}, + {ADRV904X_BF_SLICE_RX_0__SLICE_AHB_STREAM_PROC, ADI_ADRV904X_STREAM_RX, 0}, + {ADRV904X_BF_SLICE_RX_1__SLICE_AHB_STREAM_PROC, ADI_ADRV904X_STREAM_RX, 1}, + {ADRV904X_BF_SLICE_RX_2__SLICE_AHB_STREAM_PROC, ADI_ADRV904X_STREAM_RX, 2}, + {ADRV904X_BF_SLICE_RX_3__SLICE_AHB_STREAM_PROC, ADI_ADRV904X_STREAM_RX, 3}, + {ADRV904X_BF_SLICE_RX_4__SLICE_AHB_STREAM_PROC, ADI_ADRV904X_STREAM_RX, 4}, + {ADRV904X_BF_SLICE_RX_5__SLICE_AHB_STREAM_PROC, ADI_ADRV904X_STREAM_RX, 5}, + {ADRV904X_BF_SLICE_RX_6__SLICE_AHB_STREAM_PROC, ADI_ADRV904X_STREAM_RX, 6}, + {ADRV904X_BF_SLICE_RX_7__SLICE_AHB_STREAM_PROC, ADI_ADRV904X_STREAM_RX, 7}, + {ADRV904X_BF_SLICE_TX_0__SLICE_AHB_STREAM_PROC, ADI_ADRV904X_STREAM_TX, 0}, + {ADRV904X_BF_SLICE_TX_1__SLICE_AHB_STREAM_PROC, ADI_ADRV904X_STREAM_TX, 1}, + {ADRV904X_BF_SLICE_TX_2__SLICE_AHB_STREAM_PROC, ADI_ADRV904X_STREAM_TX, 2}, + {ADRV904X_BF_SLICE_TX_3__SLICE_AHB_STREAM_PROC, ADI_ADRV904X_STREAM_TX, 3}, + {ADRV904X_BF_SLICE_TX_4__SLICE_AHB_STREAM_PROC, ADI_ADRV904X_STREAM_TX, 4}, + {ADRV904X_BF_SLICE_TX_5__SLICE_AHB_STREAM_PROC, ADI_ADRV904X_STREAM_TX, 5}, + {ADRV904X_BF_SLICE_TX_6__SLICE_AHB_STREAM_PROC, ADI_ADRV904X_STREAM_TX, 6}, + {ADRV904X_BF_SLICE_TX_7__SLICE_AHB_STREAM_PROC, ADI_ADRV904X_STREAM_TX, 7}, + {ADRV904X_BF_SLICE_ORX_0__SLICE_AHB_STREAM_PROC, ADI_ADRV904X_STREAM_ORX, 0}, + {ADRV904X_BF_SLICE_ORX_1__SLICE_AHB_STREAM_PROC, ADI_ADRV904X_STREAM_ORX, 1} + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, streamErr, cleanup); + + ADI_LIBRARY_MEMSET(streamErr, 0, sizeof(adi_adrv904x_StreamErrArray_t)); + + for (i = 0U; i < ADI_ADRV904X_STREAM_MAX; i++) + { + /*Initializes the streamErr with the streamProcType and streamProcId for each stream processor*/ + streamErr->streamProcArray[i].streamProcType = streamProcAttribs[i].procType; + streamErr->streamProcArray[i].streamProcId = streamProcAttribs[i].procId; + + recoveryAction = adrv904x_Streamproc_DbgRdbkMode_BfSet(device, NULL, streamProcAttribs[i].chanAddr, 1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue setting Stream Error to volatile status"); + goto cleanup; + } + + recoveryAction = adrv904x_Streamproc_StreamError_BfGet(device, NULL, streamProcAttribs[i].chanAddr, &isErrInStream); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue reading status error bit"); + goto cleanup; + } + if (isErrInStream == ADI_TRUE) + { + /* Since an error was detected, the stream number that triggered the error and the error + * code are saved in the stream processor struct. After storing these informations, the error + * status is reset*/ + recoveryAction = adrv904x_Streamproc_ErroredStreamNumber_BfGet( device, + NULL, + streamProcAttribs[i].chanAddr, + &streamErr->streamProcArray[i].erroredStreamNumber); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue reading the stream number that triggered the error"); + goto cleanup; + } + recoveryAction = adrv904x_Streamproc_RdbkErrorVal_BfGet(device, + NULL, + streamProcAttribs[i].chanAddr, + &streamErrorCode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue reading the error code for the stream error"); + goto cleanup; + } + streamErr->streamProcArray[i].streamErrEnum = (adi_adrv904x_StreamError_e)streamErrorCode; + + /*Clear the error in streams:*/ + recoveryAction = adrv904x_Streamproc_ErroredStreamNumber_BfSet( device, + NULL, + streamProcAttribs[i].chanAddr, + 0xFU); /*is cleared when writing a dummy value*/ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue resetting the stream error number"); + goto cleanup; + } + recoveryAction = adrv904x_Streamproc_StreamError_BfSet( device, + NULL, + streamProcAttribs[i].chanAddr, + 1U); /*Writing 1 clears error bit*/ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue resetting the status error bit"); + goto cleanup; + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalGpioChannelSet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const uint32_t rxChannelMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + if ((txChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txChannelMask, + "Invalid Tx channel is selected. Valid values are 0 or any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + if ((rxChannelMask & (~(uint32_t)ADI_ADRV904X_RX_MASK_ALL)) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChannelMask, + "Invalid Rx channel is selected. Valid values are 0 or any combinations of Rx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + /* Write Tx Scratchpad value */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + ADRV904X_GPIO_ANTCAL_TX_MASK, + (uint8_t)txChannelMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write GPIO antenna cal Tx selection to scratchpad register"); + goto cleanup; + } + + /* Write Rx Scratchpad value */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + ADRV904X_GPIO_ANTCAL_RX_MASK, + (uint8_t)rxChannelMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write GPIO antenna cal Rx selection to scratchpad register"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalGpioChannelGet(adi_adrv904x_Device_t* const device, + uint32_t * const txChannelMask, + uint32_t * const rxChannelMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t scratchPadValue = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txChannelMask, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxChannelMask, cleanup); + + /* Read Tx Scratchpad value */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + ADRV904X_GPIO_ANTCAL_TX_MASK, + &scratchPadValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read GPIO antenna cal Tx selection to scratchpad register"); + goto cleanup; + } + *txChannelMask = (uint32_t)scratchPadValue; + + /* Read Rx Scratchpad value */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + ADRV904X_GPIO_ANTCAL_RX_MASK, + &scratchPadValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read GPIO antenna cal Rx selection to scratchpad register"); + goto cleanup; + } + *rxChannelMask = (uint32_t)scratchPadValue; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); + +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalConfigSet_v2(adi_adrv904x_Device_t* const device, + adi_adrv904x_RxRadioCtrlAntennaCalConfig_t * const configRx, + adi_adrv904x_TxRadioCtrlAntennaCalConfig_t * const configTx, + const uint8_t rxGainValue, + const uint8_t enableFreeze) +{ + + static const uint32_t txScratchPad2[] = { (uint32_t)ADRV904X_ADDR_TX0_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_TX1_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_TX2_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_TX3_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_TX4_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_TX5_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_TX6_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_TX7_STREAM_SCRATCH2 }; + + static const uint32_t rxScratchPad2[] = { (uint32_t)ADRV904X_ADDR_RX0_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_RX1_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_RX2_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_RX3_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_RX4_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_RX5_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_RX6_STREAM_SCRATCH2, + (uint32_t)ADRV904X_ADDR_RX7_STREAM_SCRATCH2 }; + + static const uint32_t rxScratchPad5[] = { (uint32_t)ADRV904X_ADDR_RX0_STREAM_SCRATCH5, + (uint32_t)ADRV904X_ADDR_RX1_STREAM_SCRATCH5, + (uint32_t)ADRV904X_ADDR_RX2_STREAM_SCRATCH5, + (uint32_t)ADRV904X_ADDR_RX3_STREAM_SCRATCH5, + (uint32_t)ADRV904X_ADDR_RX4_STREAM_SCRATCH5, + (uint32_t)ADRV904X_ADDR_RX5_STREAM_SCRATCH5, + (uint32_t)ADRV904X_ADDR_RX6_STREAM_SCRATCH5, + (uint32_t)ADRV904X_ADDR_RX7_STREAM_SCRATCH5 }; + + static const uint32_t TX_SCRATCH2_WRITE_MASK = 0x00FFFFFFU; + static const uint32_t RX_SCRATCH_WRITE_MASK = 0xFFFFFFFFU; + static const uint32_t RX_SCRATCH_WRITE_SHIFT = 24U; + static const uint32_t RX_SCRATCH5_GAIN_SHIFT = 8U; + static const uint32_t RX_SCRATCH5_WRITE_MASk = 0xFF01U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t txScratch2WriteValue = 0U; + uint32_t rxScratchWriteValue = 0U; + uint32_t rxScratch5WriteValue = 0U; + adi_adrv904x_RxGain_t rxGain; + uint16_t attenRegVal = 0U; + uint32_t chanId = 0U; + uint32_t chanSel = 0U; + adrv904x_BfTxFuncsChanAddr_e txBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_FUNCS; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, configRx, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, configTx, cleanup); + + ADI_LIBRARY_MEMSET(&rxGain, 0, sizeof(rxGain)); + + /* Check enable parameter is valid */ + if ((enableFreeze != ADI_ENABLE) && (enableFreeze != ADI_DISABLE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + enableFreeze, + "enableFreeze parameter must be either 0 for disabled or 1 for enabled"); + goto cleanup; + } + + /*Check that if requested Rx Channel valid*/ + if ((configRx->rxChannelMask & (~(uint32_t)ADI_ADRV904X_RX_MASK_ALL)) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + configRx->rxChannelMask, + "Invalid channel is selected for Rx config. Valid values are 0 or any combinations of Rx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + if ((configTx->txChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + configTx->txChannelMask, + "Invalid channel is selected for Tx config. Valid values are 0 or any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + txScratch2WriteValue = (uint32_t)(configTx->txNcoFreqKhz) & TX_SCRATCH2_WRITE_MASK; + /* Change the sign of the frequency because there is an I/Q swap in the HW */ + rxScratchWriteValue = (((uint32_t)configRx->rxGainIndex & 0x000000FF) << RX_SCRATCH_WRITE_SHIFT) | + ((uint32_t)(-configRx->rxNcoFreqKhz) & 0x00FFFFFF); + + /* for each Tx channel in txChannelMask */ + for (chanId = 0U; chanId < ADI_ADRV904X_MAX_TXCHANNELS; chanId++) + { + if ((configTx->txChannelMask & (1U << chanId)) == 0U) + { + /* Skip channel. It's not in chanMask. */ + continue; + } + + if (configTx->txAttenuation_mdB > ADRV904X_TX_ATTEN_VALUE_MILLI_DB_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + configTx->txAttenuation_mdB, + "Invalid txAttenuation_mdB value"); + goto cleanup; + } + + /* ChanId is selected in chanMask */ + chanSel = (1U << chanId); + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanId, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + /* Conversion from the atten level (milli-dB) to equivalent + * TxAttenTable index is always done based on a step size of 0.05. + * Other step sizes are not supported. */ + attenRegVal = (configTx->txAttenuation_mdB / ADRV904X_TX_ATTEN_STEP_SIZE_DIV_0P05); + + recoveryAction = adrv904x_TxFuncs_TxAttenuation_BfSet(device, + NULL, + txBaseAddr, + attenRegVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx PA Protect Input Select"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, txScratchPad2[chanId], txScratch2WriteValue, TX_SCRATCH2_WRITE_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot write Tx scratch pad register 2"); + goto cleanup; + } + } + + /* for each Rx channel in rxChannelMask */ + for (chanId = 0U; chanId < ADI_ADRV904X_MAX_RX_ONLY; chanId++) + { + /* Write freeze and gainvalue to each scratchpad register */ + rxScratch5WriteValue = (((uint32_t)enableFreeze) | ((uint32_t)rxGainValue) << RX_SCRATCH5_GAIN_SHIFT); + recoveryAction = adi_adrv904x_Register32Write(device, NULL, rxScratchPad5[chanId], rxScratch5WriteValue, RX_SCRATCH5_WRITE_MASk); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot write Rx scratch pad register 5"); + goto cleanup; + } + + if ((configRx->rxChannelMask & (1U << chanId)) == 0) + { + /* Skip channel. It's not in chanMask. */ + continue; + } + + rxGain.gainIndex = configRx->rxGainIndex; + rxGain.rxChannelMask = configRx->rxChannelMask; + + recoveryAction = adrv904x_RxGainSetRangeCheck(device, &rxGain, 1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Rx gain is out of range"); + goto cleanup; + } + + /* ChanId is selected in chanMask */ + recoveryAction = adi_adrv904x_Register32Write(device, NULL, rxScratchPad2[chanId], rxScratchWriteValue, RX_SCRATCH_WRITE_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot write Rx scratch pad register 2"); + goto cleanup; + } + + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerImageWrite(adi_adrv904x_Device_t* const device, + uint32_t byteOffset, + const uint8_t binary[], + uint32_t byteCount) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_RadioSeqImageHeader_t rsImageHeader; + uint32_t imageSize = 0U; + uint32_t imageOffset = 0U; + uint32_t i = 0U; + uint8_t finalCrc = 0U; + uint8_t binaryZero[4] = {0U}; + uint32_t xbarImageSize = 0U; + uint32_t lookupImageSize = 0U; + uint32_t sequenceImageSize = 0U; + uint32_t xbarImageOffset = 0U; + uint32_t lookupImageOffset = 0U; + uint32_t sequenceImageOffset = 0U; + uint32_t address[1] = { 0U }; + static const uint32_t RS_IMAGE_VERSION_ID_START_BYTE = ADI_LIBRARY_OFFSETOF(adi_adrv904x_RadioSeqImageHeader_t, revision); + + static const uint32_t FINAL_RS_IMAGE_HEADER_SIZE_BYTES = sizeof(adi_adrv904x_RadioSeqImageHeader_t); + + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, binary, cleanup); + + if ((byteCount == 0U) || + ((byteCount % 4U) > 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + byteCount, + "Invalid byteCount. Must be multiple of 4."); + goto cleanup; + } + if ((byteOffset % 4U) > 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + byteCount, + "Invalid byteOffset. Must be multiple of 4."); + goto cleanup; + } + + /* When byteOffset is zero that indicates the first time this function. + * has been called for a particular radioSeqBinary.bin so the header info + * must be extracted. We need all the information extracted in a single + * call which is why min chunk size is the same as FINAL_RS_IMAGE_HEADER_SIZE_BYTES. + * + */ + if (byteOffset == 0U) + { + if (byteCount < FINAL_RS_IMAGE_HEADER_SIZE_BYTES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + byteCount, + "Must pass in chunk size greater than current radio sequencer image header."); + goto cleanup; + } + + rsImageHeader.magicNumber = adrv904x_CpuIntFromBytesGet(&binary[ADI_LIBRARY_OFFSETOF(adi_adrv904x_RadioSeqImageHeader_t, magicNumber)], 4U); + rsImageHeader.revision.majorVer = adrv904x_CpuIntFromBytesGet(binary + RS_IMAGE_VERSION_ID_START_BYTE + 0U, 4U); + rsImageHeader.revision.minorVer = adrv904x_CpuIntFromBytesGet(binary + RS_IMAGE_VERSION_ID_START_BYTE + 4U, 4U); + rsImageHeader.revision.maintenanceVer = adrv904x_CpuIntFromBytesGet(binary + RS_IMAGE_VERSION_ID_START_BYTE + 8U, 4U); + rsImageHeader.revision.buildVer = adrv904x_CpuIntFromBytesGet(binary + RS_IMAGE_VERSION_ID_START_BYTE + 12U, 4U); + rsImageHeader.numberPatterns = adrv904x_CpuIntFromBytesGet(&binary[ADI_LIBRARY_OFFSETOF(adi_adrv904x_RadioSeqImageHeader_t, numberPatterns)], 4U); + rsImageHeader.sequenceSize = adrv904x_CpuIntFromBytesGet(&binary[ADI_LIBRARY_OFFSETOF(adi_adrv904x_RadioSeqImageHeader_t, sequenceSize)], 4U); + rsImageHeader.seqStartAddr = adrv904x_CpuIntFromBytesGet(&binary[ADI_LIBRARY_OFFSETOF(adi_adrv904x_RadioSeqImageHeader_t, seqStartAddr)], 4U); + rsImageHeader.lookupCrc = adrv904x_CpuIntFromBytesGet(&binary[ADI_LIBRARY_OFFSETOF(adi_adrv904x_RadioSeqImageHeader_t, lookupCrc)], 4U); + rsImageHeader.sequenceCrc = adrv904x_CpuIntFromBytesGet(&binary[ADI_LIBRARY_OFFSETOF(adi_adrv904x_RadioSeqImageHeader_t, sequenceCrc)], 4U); + rsImageHeader.fileImageCrc = adrv904x_CpuIntFromBytesGet(&binary[ADI_LIBRARY_OFFSETOF(adi_adrv904x_RadioSeqImageHeader_t, fileImageCrc)], 4U); + + if (rsImageHeader.magicNumber != ADI_ADRV904X_RADIO_SEQ_MAGIC_NUMBER) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rsImageHeader.magicNumber, "Unsupported Radio Sequencer image file detected"); + goto cleanup; + } + +#if ADI_ADRV904X_API_VERSION_RANGE_CHECK > 0 + { + adi_adrv904x_Version_t minRevision = { 0U, 0U, 0U, 0U }; + + recoveryAction = adi_adrv904x_ApiVersionGet(device, &minRevision); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Radio Sequencer Binary Version Get Issue"); + goto cleanup; + } + + recoveryAction = adrv904x_ApiVersionRangeCheck(device, &(rsImageHeader.revision), &minRevision, &minRevision); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Radio Sequencer Binary Range Check Issue"); + goto cleanup; + } + } +#endif + + if (rsImageHeader.sequenceSize > (ADI_ADRV904X_RADIO_SEQ_IMAGE_MAX_SIZE / sizeof(uint32_t))) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rsImageHeader.sequenceSize, "Unsupported Radio Sequencer image file detected"); + goto cleanup; + } + + if (rsImageHeader.numberPatterns > ADI_ADRV904X_RADIO_SEQ_LOOKUP_TAB_MAX_SIZE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rsImageHeader.numberPatterns, "Unsupported Radio Sequencer image file detected"); + goto cleanup; + } + + if (rsImageHeader.seqStartAddr != ADI_ADRV904X_RADIO_SEQ_IMAGE_MEM_REGION_START) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rsImageHeader.seqStartAddr, "Unsupported Radio Sequencer image file detected"); + goto cleanup; + } + + /* Save to use later in case of multiple call to this API */ + ADI_LIBRARY_MEMCPY(&device->devStateInfo.rsImageHeader, &rsImageHeader, sizeof(device->devStateInfo.rsImageHeader)); + + /* Init CRC to 0 */ + device->devStateInfo.lookupCrcRun = 0U; + device->devStateInfo.sequenceCrcRun = 0U; + device->devStateInfo.fileImageCrcRun = 0U; + + /* Run file image CRC */ + device->devStateInfo.fileImageCrcRun = adrv904x_Crc32ForChunk(binary, FINAL_RS_IMAGE_HEADER_SIZE_BYTES-4U, device->devStateInfo.fileImageCrcRun, 0U); + device->devStateInfo.fileImageCrcRun = adrv904x_Crc32ForChunk(binaryZero, 4U, device->devStateInfo.fileImageCrcRun, 0U); + + imageSize = FINAL_RS_IMAGE_HEADER_SIZE_BYTES; + byteOffset += imageSize; + binary += imageSize; + byteCount -= imageSize; + + if (byteCount == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + goto cleanup; + } + } + + /* Run file image CRC */ + device->devStateInfo.fileImageCrcRun = adrv904x_Crc32ForChunk(binary, byteCount, device->devStateInfo.fileImageCrcRun, 0U); + + xbarImageSize = ADI_ADRV904X_RADIO_SEQ_XBAR_SIZE; + xbarImageOffset = FINAL_RS_IMAGE_HEADER_SIZE_BYTES; + + lookupImageSize = device->devStateInfo.rsImageHeader.numberPatterns * sizeof(uint32_t); + lookupImageOffset = xbarImageOffset + ADI_ADRV904X_RADIO_SEQ_XBAR_SIZE; + + sequenceImageSize = device->devStateInfo.rsImageHeader.sequenceSize * sizeof(uint32_t); + sequenceImageOffset = lookupImageOffset + lookupImageSize; + + /* Save xbarSettings */ + if ((byteOffset >= xbarImageOffset) && + (byteOffset < lookupImageOffset)) + { + imageOffset = byteOffset - xbarImageOffset; + imageSize = xbarImageSize - imageOffset; + if (byteCount < imageSize) + { + imageSize = byteCount; + } + + + for (i = 0; i < imageSize; i++) + { + device->devStateInfo.xbarSettings[imageOffset + i] = binary[i]; + } + + byteOffset += imageSize; + binary += imageSize; + byteCount -= imageSize; + + if (byteCount == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + goto cleanup; + } + } + + /* Save sequence lookup table */ + if ((byteOffset >= lookupImageOffset) && + (byteOffset < sequenceImageOffset)) + { + imageOffset = byteOffset - lookupImageOffset; + imageSize = lookupImageSize - imageOffset; + + if (byteCount < imageSize) + { + imageSize = byteCount; + finalCrc = 0U; + } + else + { + finalCrc = 1U; + } + + device->devStateInfo.lookupCrcRun = adrv904x_Crc32ForChunk(binary, imageSize, device->devStateInfo.lookupCrcRun, finalCrc); + + if ((finalCrc == 1U) && + (device->devStateInfo.lookupCrcRun != device->devStateInfo.rsImageHeader.lookupCrc)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, device->devStateInfo.lookupCrcRun, "Unsupported Radio Sequencer image file detected (file is corrupt)"); + goto cleanup; + } + + for (i = 0; i < imageSize; i = i + sizeof(uint32_t)) + { + device->devStateInfo.lookupTable[(imageOffset + i) / sizeof(uint32_t)] = adrv904x_CpuIntFromBytesGet(&binary[i], sizeof(uint32_t)); + } + + byteOffset += imageSize; + binary += imageSize; + byteCount -= imageSize; + + if (byteCount == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + goto cleanup; + } + } + + + /* write sequence Instruction */ + if ((byteOffset >= sequenceImageOffset)) + { + imageOffset = byteOffset - sequenceImageOffset; + imageSize = sequenceImageSize - imageOffset; + + if (byteCount < imageSize) + { + imageSize = byteCount; + finalCrc = 0U; + } + else + { + finalCrc = 1U; + } + + device->devStateInfo.sequenceCrcRun = adrv904x_Crc32ForChunk(binary, imageSize, device->devStateInfo.sequenceCrcRun, finalCrc); + + if ((finalCrc == 1U) && + (device->devStateInfo.sequenceCrcRun != device->devStateInfo.rsImageHeader.sequenceCrc)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, device->devStateInfo.sequenceCrcRun, "Unsupported Radio Sequencer image file detected (file is corrupt)"); + goto cleanup; + } + + address[0U] = device->devStateInfo.rsImageHeader.seqStartAddr + imageOffset; + recoveryAction = adi_adrv904x_RegistersByteWrite(device, + NULL, + address[0], + binary, + imageSize); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write radio sequence Instruction"); + goto cleanup; + } + + if (finalCrc == 1U) + { + /* Run file image CRC */ + device->devStateInfo.fileImageCrcRun = adrv904x_Crc32ForChunk(binary, 0U, device->devStateInfo.fileImageCrcRun, 1U); + if (device->devStateInfo.fileImageCrcRun != device->devStateInfo.rsImageHeader.fileImageCrc) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, device->devStateInfo.fileImageCrcRun, "Unsupported Radio Sequencer image file detected (file is corrupt)"); + goto cleanup; + } + + device->devStateInfo.devState = (adi_adrv904x_ApiStates_e)(device->devStateInfo.devState | ADI_ADRV904X_STATE_RSLOADED); + } + } + + /* Write radio sequencer image size to the radio processor for CRC verificaiton */ + recoveryAction = adi_adrv904x_Register32Write(device, NULL, ADRV904X_DM_RSEQ_IMAGE_SIZE, sequenceImageSize, 0xFFFFFFFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing radio sequencer image size value"); + goto cleanup; + } + + /* Write radio sequencer CRC to the radio processor for run-time verification */ + recoveryAction = adi_adrv904x_Register32Write(device, NULL, ADRV904X_DM_RSEQ_IMAGE_CRC, device->devStateInfo.sequenceCrcRun, 0xFFFFFFFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing radio sequencer image size value"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerPhaseSet(adi_adrv904x_Device_t* const device, uint32_t phaseAdjustment) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfSequencerChanAddr_e sequencerBaseAddr = ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + +#if ADI_ADRV904X_RADIOCTRL_RANGE_CHECK > 0 + recoveryAction = adrv904x_RadioSequencerPhaseSetRangeCheck(device, phaseAdjustment); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RadioSequencerPhaseSetRangeCheck Issue"); + goto cleanup; + } +#endif + + /* Check that Radio Sequencer has been loaded before setting multiframer phase offset */ + if ((device->devStateInfo.devState & ADI_ADRV904X_STATE_RSLOADED) != ADI_ADRV904X_STATE_RSLOADED) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Radio Sequencer should have been loaded before setting multiframer phase offset"); + goto cleanup; + } + + /* Set multi frame phase adjustment */ + recoveryAction = adrv904x_Sequencer_MultiframePhaseAdjust_BfSet(device, + NULL, + sequencerBaseAddr, + phaseAdjustment); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting multiframe phase adjustment"); + goto cleanup; + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerPhaseGet(adi_adrv904x_Device_t* const device, uint32_t* phaseAdjustment) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfSequencerChanAddr_e sequencerBaseAddr = ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS; + const uint32_t RADIO_SEQUENCER_GLOBAL_CONFIG_1_REG_OFFSET = 0x8U; + const uint32_t SSB_SYNC_PHASE_BITM = 0x01FFFFFFU; + uint32_t regVal = 0; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, phaseAdjustment, cleanup); + + /* Check that Radio Sequencer has been loaded before getting SSB phase offset */ + if ((device->devStateInfo.devState & ADI_ADRV904X_STATE_RSLOADED) != ADI_ADRV904X_STATE_RSLOADED) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Radio Sequencer should have been loaded before getting SSB phase adjustment"); + goto cleanup; + } + + /* Get ssb_sync_phase */ + recoveryAction = adi_adrv904x_Register32Read(device, + NULL, + ((uint32_t) sequencerBaseAddr + RADIO_SEQUENCER_GLOBAL_CONFIG_1_REG_OFFSET), + ®Val, + 0xFFFFFFFFU); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting SSB sync phase adjustment"); + goto cleanup; + } + + *phaseAdjustment = regVal & SSB_SYNC_PHASE_BITM; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerPreMcsCfg(adi_adrv904x_Device_t* const device) +{ + const adi_adrv904x_GpioSignal_e sigDigitalOut[ADI_ADRV904X_GPIO_COUNT] = { + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_0, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_1, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_2, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_3, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_4, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_5, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_6, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_7, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_8, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_9, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_10, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_11, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_12, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_13, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_14, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_15, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_16, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_17, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_18, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_19, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_20, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_21, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_22, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_DIGITAL_OUT_23 + }; + const adi_adrv904x_GpioSignal_e sigAnalogOut[ADI_ADRV904X_GPIO_ANALOG_COUNT] = { + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_0, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_1, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_2, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_3, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_4, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_5, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_6, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_7, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_8, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_9, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_10, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_11, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_12, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_13, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_14, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_ANALOG_OUT_15 + }; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfSequencerChanAddr_e sequencerBaseAddr = ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS; + uint32_t chanId = 0u; + uint32_t gpio = 0u; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Check that Radio Sequencer Enable */ + if (device->initExtract.rs.radioSeqEn == ADI_FALSE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + goto cleanup; + } + + /* Check that Radio Sequencer has been loaded */ + if ((device->devStateInfo.devState & ADI_ADRV904X_STATE_RSLOADED) != ADI_ADRV904X_STATE_RSLOADED) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Radio Sequencer Image is not loaded."); + goto cleanup; + } + + /* Set sample clk divide ratio */ + recoveryAction = adrv904x_Core_RsSampleClkDivideRatio_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + device->initExtract.rs.sampleClkDiv); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while rs sample clk divide ratio."); + goto cleanup; + } + + /* Set sample clk enable */ + recoveryAction = adrv904x_Core_RsSampleClkEnable_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + device->initExtract.rs.sampleClkEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while rs sample clk divide enable."); + goto cleanup; + } + + /* Set pointer init */ + for (chanId = 0; chanId < ADI_ADRV904X_MAX_RADIOSEQUENCER; chanId++) + { + recoveryAction = adrv904x_Sequencer_PointerInit_BfSet(device, + NULL, + sequencerBaseAddr, + chanId, + ADI_ADRV904X_RADIO_SEQ_IMAGE_MEM_REGION_START >> 4u); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting pointer init."); + goto cleanup; + } + } + + /* Allocate and setup all GPIOs used by the radio sequencer. */ + /* Note: These will never be de-allocated from use by this feature during runtime. */ + + /* Set SSB SYNC GPIO Pin*/ + if (device->initExtract.radioCtrlPreInit.radioSequencerSsbSyncGpioCtrl != ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = adrv904x_GpioSignalSet(device, + device->initExtract.radioCtrlPreInit.radioSequencerSsbSyncGpioCtrl, + ADI_ADRV904X_GPIO_SIGNAL_RADIO_SEQ_SSB_SYNC, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to assign Radio Sequencer SSB SYNC input signal to GPIO"); + goto cleanup; + } + } + + /* Setup Digital GPIO Output Pins for Radio Sequencer */ + for (gpio = 0U; gpio < ADI_ADRV904X_GPIO_COUNT; gpio++) + { + if (device->initExtract.radioCtrlPreInit.radioSequencerGpioDigOut[gpio] != ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = adrv904x_GpioSignalSet(device, + device->initExtract.radioCtrlPreInit.radioSequencerGpioDigOut[gpio], + sigDigitalOut[gpio], + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to assign Radio Sequencer Output signal to Digital GPIO"); + goto cleanup; + } + } + } + + /* Setup Analog GPIO Output Pins for Radio Sequencer */ + for (gpio = 0U; gpio < ADI_ADRV904X_GPIO_ANALOG_COUNT; gpio++) + { + if (device->initExtract.radioCtrlPreInit.radioSequencerGpioAnaOut[gpio] != ADI_ADRV904X_GPIO_ANA_INVALID) + { + recoveryAction = adrv904x_GpioAnalogSignalSet(device, + device->initExtract.radioCtrlPreInit.radioSequencerGpioAnaOut[gpio], + sigAnalogOut[gpio], + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to assign Radio Sequencer Output signal to Analog GPIO"); + goto cleanup; + } + } + } + + /* Set XBAR */ + for (chanId = 0; chanId < ADI_ADRV904X_RADIO_SEQ_XBAR_SIZE; chanId++) + { + recoveryAction = adrv904x_Sequencer_XbarCtrlSel_BfSet(device, + NULL, + sequencerBaseAddr, + chanId, + (device->devStateInfo.xbarSettings[chanId] >> 4u)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting xbar control sel."); + goto cleanup; + } + + recoveryAction = adrv904x_Sequencer_XbarSequencerSel_BfSet(device, + NULL, + sequencerBaseAddr, + chanId, + (device->devStateInfo.xbarSettings[chanId] & 0x0F)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting xbar sequencer sel."); + goto cleanup; + } + } + + /* Set ssb sync tracking mode */ + recoveryAction = adrv904x_Sequencer_SsbSyncTrackingMode_BfSet(device, + NULL, + sequencerBaseAddr, + device->initExtract.rs.ssbSyncMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting ssb sycn tracking mode."); + goto cleanup; + } + + /* Set ssb sync period */ + recoveryAction = adrv904x_Sequencer_SsbSyncPeriod_BfSet(device, + NULL, + sequencerBaseAddr, + device->initExtract.rs.ssbSyncPeriod); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting ssb sycn period."); + goto cleanup; + } + + /* Set short symbol width */ + recoveryAction = adrv904x_Sequencer_ShortSymbolWidth_BfSet(device, + NULL, + sequencerBaseAddr, + device->initExtract.rs.symWidth); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting short symbol width."); + goto cleanup; + } + + /* Set extended symbol width */ + recoveryAction = adrv904x_Sequencer_ExtendedSymbolWidth_BfSet(device, + NULL, + sequencerBaseAddr, + device->initExtract.rs.extSymWidth); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting extended symbol width."); + goto cleanup; + } + + /* Set extended symbol spacing */ + recoveryAction = adrv904x_Sequencer_ExtendedSymbolSpacing_BfSet(device, + NULL, + sequencerBaseAddr, + device->initExtract.rs.extSymSpacing); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting extended symbol spacing."); + goto cleanup; + } + + /* Set global reset */ + recoveryAction = adrv904x_Sequencer_GlobalReset_BfSet(device, + NULL, + sequencerBaseAddr, + 0u); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting global reset."); + goto cleanup; + } + + /* Set all Tx/Rx/ORx and antenna enables to be under RS control */ + recoveryAction = adrv904x_Core_TxRsModeSel_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + 0xFFu); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting Tx control to RS mode"); + goto cleanup; + } + recoveryAction = adrv904x_Core_RxRsModeSel_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + 0xFFu); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting Rx control to RS mode"); + goto cleanup; + } + recoveryAction = adrv904x_Core_OrxRsModeSel_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + 0x3u); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting ORx control to RS mode"); + goto cleanup; + } + recoveryAction = adrv904x_Core_TxAntRsModeSel_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + 0xFFu); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting Tx Antenna control to RS mode"); + goto cleanup; + } + recoveryAction = adrv904x_Core_RxAntRsModeSel_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + 0xFFu); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting Rx Antenna control to RS mode"); + goto cleanup; + } + + /* Send the pattern lookup table to the DFE */ + recoveryAction = adrv904x_RadioSequencerDfePtrnLookupTableSet(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting pattern lookup table."); + goto cleanup; + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerPostMcsCfg(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Check that Radio Sequencer Enable */ + if (device->initExtract.rs.radioSeqEn == ADI_FALSE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + goto cleanup; + } + + /* Check that Radio Sequencer has been loaded */ + if ((device->devStateInfo.devState & ADI_ADRV904X_STATE_RSLOADED) != ADI_ADRV904X_STATE_RSLOADED) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Radio Sequencer Image is not loaded."); + goto cleanup; + } + + /* All Done */ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerRadioStart(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t sequencerId = 0x0U; + uint32_t patternId = ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_NULL_PATTERN_GLOBAL_PTRN_ID; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Check that Radio Sequencer Enable */ + if (device->initExtract.rs.radioSeqEn == ADI_FALSE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + goto cleanup; + } + + /* Check that Radio Sequencer has been loaded before getting RS error info */ + if ((device->devStateInfo.devState & ADI_ADRV904X_STATE_RSLOADED) != ADI_ADRV904X_STATE_RSLOADED) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Radio Sequencer should have been loaded before starting Radio Sequencer"); + goto cleanup; + } + + if (device->devStateInfo.rsRadioRunning == ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + goto cleanup; + } + else + { + /* First, enable/start all radio sequencers */ + recoveryAction = adrv904x_RadioSequencerStart(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while starting radio sequencer.\n"); + goto cleanup; + } + + /* Set the patternId for all the radio sequencers */ + for (sequencerId = ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_FRAME_TIMING_0; sequencerId <= ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_FRAME_TIMING_9; sequencerId++) + { + if (device->devStateInfo.specialSequencerPatternInfo.specialSequencer[sequencerId].specialPatternUsed == ADI_FALSE) + { + patternId = ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_DEFAULT_FRAMING_TIMING_SEQ_PTRN_ID; + } + else + { + patternId = device->devStateInfo.specialSequencerPatternInfo.specialSequencer[sequencerId].specialPatternId; + } + + patternId = ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_SEQ_PTRN_ID_TO_GLOBAL_ID(sequencerId, patternId); + recoveryAction = adrv904x_RadioSequencerPatternSet(device, sequencerId, patternId); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting RS pattern. \n"); + goto cleanup; + } + } + + recoveryAction = adrv904x_RadioSequencerApply(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting RS Apply. \n"); + goto cleanup; + } + + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_RADIO_START, + NULL, + 0, + NULL, + 0, + NULL); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while sending RS Radio Start. \n"); + goto cleanup; + } + + device->devStateInfo.rsRadioRunning = ADI_TRUE; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerRadioStop(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t sequencerId = 0x0U; + uint32_t patternId = ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_NULL_PATTERN_GLOBAL_PTRN_ID; + adrv904x_BfSequencerChanAddr_e sequencerBaseAddr = ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Check that Radio Sequencer Enable */ + if (device->initExtract.rs.radioSeqEn == ADI_FALSE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + goto cleanup; + } + + /* Check that Radio Sequencer has been loaded before getting RS error info */ + if ((device->devStateInfo.devState & ADI_ADRV904X_STATE_RSLOADED) != ADI_ADRV904X_STATE_RSLOADED) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Radio Sequencer should have been loaded before starting Radio Sequencer"); + goto cleanup; + } + + if (device->initExtract.rs.ssbSyncMode == 0) + { + /* Check that Radio Sequencer was started */ + if (device->devStateInfo.rsRadioRunning == ADI_FALSE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + goto cleanup; + } + + /* Set the patternId for all the radio sequencers */ + for (sequencerId = ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_FRAME_TIMING_0; + sequencerId <= ADI_ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_FRAME_TIMING_9; sequencerId++) + { + recoveryAction = adrv904x_RadioSequencerPatternSet(device, sequencerId, patternId); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting RS pattern. \n"); + goto cleanup; + } + } + } + else + { + recoveryAction = adrv904x_Sequencer_GlobalReset_BfSet(device, NULL, sequencerBaseAddr, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting RS Global Reset. \n"); + goto cleanup; + } + } + + recoveryAction = adrv904x_RadioSequencerApplyImmediately(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting RS Apply Immediately. \n"); + goto cleanup; + } + + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_RADIO_STOP, + NULL, + 0, + NULL, + 0, + NULL); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while sending RS Radio Stop. \n"); + goto cleanup; + } + + if (device->initExtract.rs.ssbSyncMode != 0) + { + device->devStateInfo.rsStarted = ADI_FALSE; + } + device->devStateInfo.rsRadioRunning = ADI_FALSE; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerFrameTimingPatternSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RsSpecialSequencer_t* const specialPatternInfo) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t patternUsed = 0U; + uint32_t patternId = 0U; + uint32_t i = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, specialPatternInfo, cleanup); + + /* Config special pattern ID into device structure for further usage */ + for (i = 0U; i < ADI_ADRV904X_MAX_CUSTOMERCONFIGSEQUENCER; i++) + { + patternUsed = specialPatternInfo->specialSequencer[i].specialPatternUsed; + patternId = specialPatternInfo->specialSequencer[i].specialPatternId; + + if (patternId >= ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_NUM_PATTERNS_PER_SEQUENCER) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid input pattern id.\n"); + goto cleanup; + } + + if (patternUsed == ADI_FALSE) + { + /* Clear special radio sequencer pattern info */ + device->devStateInfo.specialSequencerPatternInfo.specialSequencer[i].specialPatternUsed = ADI_FALSE; + device->devStateInfo.specialSequencerPatternInfo.specialSequencer[i].specialPatternId = 0U; + } + else + { + device->devStateInfo.specialSequencerPatternInfo.specialSequencer[i].specialPatternUsed = ADI_TRUE; + device->devStateInfo.specialSequencerPatternInfo.specialSequencer[i].specialPatternId = patternId; + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerFrameTimingPatternGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_RsSpecialSequencer_t* const specialPatternInfo) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, specialPatternInfo, cleanup); + + ADI_LIBRARY_MEMCPY((void*)specialPatternInfo, (void*)(&(device->devStateInfo.specialSequencerPatternInfo)), sizeof(adi_adrv904x_RsSpecialSequencer_t)); + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerFrameTimingPatternClear(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Clear special pattern used flag and pattern ID array */ + ADI_LIBRARY_MEMSET((void*)(&(device->devStateInfo.specialSequencerPatternInfo)), 0U, sizeof(adi_adrv904x_RsSpecialSequencer_t)); + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingAndVswrDirSet(adi_adrv904x_Device_t* const device, + const uint8_t mapping, + const uint8_t vswrDirection) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + static const uint8_t VSWR_DIRECTION_MAX = 3U; + uint8_t modeMask = 0U; + + /* Check that Mapping Mode is NOT DFE CTRL. If it is, throw an error */ + adi_adrv904x_TxToOrxMappingMode_e lclMode = device->devStateInfo.txToOrxMappingConfig.mode; + if (lclMode == ADI_ADRV904X_TX_ORX_MAPPING_MODE_DFE_CTRL) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + lclMode, + "Device Tx to Orx Mapping is in DFE Ctrl Mode. This function can only be used in RCI mapping modes."); + goto cleanup; + } + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Get modeMask from the mode*/ + switch (device->devStateInfo.txToOrxMappingConfig.mode) + { + case ADI_ADRV904X_TX_ORX_MAPPING_MODE_2BIT: + modeMask = 0x03U; + break; + case ADI_ADRV904X_TX_ORX_MAPPING_MODE_3BIT: + modeMask = 0x07U; + break; + case ADI_ADRV904X_TX_ORX_MAPPING_MODE_4BIT: + modeMask = 0x0FU; + break; + case ADI_ADRV904X_TX_ORX_MAPPING_MODE_6BIT: + modeMask = 0x3FU; + break; + case ADI_ADRV904X_TX_ORX_MAPPING_MODE_8BIT: /* Fallthrough */ + default: + modeMask = 0xFFU; + break; + } + + /* Range check mapping byte against Mapping Mode */ + if ((mapping & modeMask) != mapping) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + mapping, + "Tx to Orx Mapping byte requested is not valid for use with the device's Mapping Mode configuration"); + goto cleanup; + } + + if (vswrDirection > VSWR_DIRECTION_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + vswrDirection, + "VSWR direction must be a 2bit value, Orx0:Bit0 , Orx1:Bit1"); + goto cleanup; + } + + /* Write mapping byte to scratch reg for the stream to readback */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + ADRV904X_CPU_TX_ORX_MAPPING_SET_SCRATCH_REG_ID, + mapping); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while setting Tx to ORx mapping selection."); + goto cleanup; + } + + /* Set VSWR direction to scrathpad register */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + ADRV904X_DFE_VSWR_DIRECTION_SCRATCH_REG_ID, + vswrDirection); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while setting Vswr direction scrathpad register"); + goto cleanup; + } + + /* Trigger stream */ + recoveryAction = adrv904x_StreamTrigger(device, ADRV904X_STREAM_MAIN_TX_TO_ORX_MAP); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while triggering Core Stream to apply Tx to Orx mapping"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxToOrxMappingAndVswrDirGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e orxChannel, + adi_adrv904x_TxChannels_e* const txChannel, + adi_adrv904x_DfeVswrDirection_e* const vswrDirection) +{ + static const uint8_t NIBBLE_TX_MASK = 0x07U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t readNibble = 0U; + uint8_t orxIdx = 0U; + uint8_t txIdx = 0U; + uint16_t observabilityBit = 0U; + uint8_t observable = 0U; + uint8_t noMapState = 0U; + uint32_t txChanSel = 0U; + uint8_t vswrDir = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common) ; + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txChannel, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, vswrDirection, cleanup); + + /* Range check orxChannel enum */ + if( (orxChannel != ADI_ADRV904X_ORX0) && + (orxChannel != ADI_ADRV904X_ORX1) ) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + orxChannel, + "ORx Channel selected is invalid. Must select ORx0-1.") ; + goto cleanup; + } + + /* Readback current mapping */ + if (orxChannel == ADI_ADRV904X_ORX0) + { + orxIdx = 0U; + recoveryAction = adrv904x_Core_RadioControlInterfaceOrx0Map_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &readNibble); + } + else + { + orxIdx = 1U; + recoveryAction = adrv904x_Core_RadioControlInterfaceOrx1Map_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &readNibble); + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while retrieving current Tx to ORx map for selected ORx channel."); + goto cleanup; + } + + txIdx = NIBBLE_TX_MASK & readNibble; + observabilityBit = 1U << (2U*txIdx + orxIdx); + observable = (observabilityBit & device->devStateInfo.txToOrxMappingConfig.txObservability) ? ADI_TRUE : ADI_FALSE; + + if (noMapState || + !observable ) + { + *txChannel = ADI_ADRV904X_TXOFF; + } + else + { + txChanSel = 1U << (uint32_t)txIdx; + *txChannel = (adi_adrv904x_TxChannels_e)(txChanSel); + } + + if (orxChannel == ADI_ADRV904X_ORX0) + { + recoveryAction = adrv904x_Core_VswrFwdRev0Sel_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &vswrDir); + } + else + { + recoveryAction = adrv904x_Core_VswrFwdRev1Sel_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &vswrDir); + } + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while retrieving current Vswr direction bit for selected ORx channel."); + goto cleanup; + } + + *vswrDirection = (adi_adrv904x_DfeVswrDirection_e)vswrDir; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlPaSelectInputSet(adi_adrv904x_Device_t* const device, + const uint32_t paEnOutput, + const adi_adrv904x_PaEnInputSel_e paEnInput) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t newPaEnDtxShadow = 0U; + uint8_t curPaEnDtxShadow = 0U; + uint8_t bitPos = 0U; + uint8_t bitVal = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Range check paEnOutput value according to adi_adrv904x_PaEnOutputs_e enum */ + if ((paEnOutput >> 8U) != 0U) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + paEnOutput, + "paEnOutput selected value is invalid. Only bit 0-7 is allowed."); + goto cleanup; + } + + /* Range check paEnInput enum */ + if ((paEnInput >> 1U) != 0U) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + paEnInput, + "paEnInput selected value is invalid. Must either 0 or 1."); + goto cleanup; + } + + /* Read back the current shadow value */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_PA_EN_WITH_DTX_OUTPUT_SHADOW, + &curPaEnDtxShadow); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while retrieving current PA En DTX shadow register."); + goto cleanup; + } + + newPaEnDtxShadow = curPaEnDtxShadow; + for (bitPos = 0; bitPos < PA_EN_OUT_MAX; bitPos++) + { + bitVal = 1 << bitPos; + /* Skip unselected bitmask */ + if ((paEnOutput & bitVal) == 0U) + { + continue; + } + + if (paEnInput == ADI_ADRV904X_PA_EN_INPUT_SEL_RS) + { + if ((newPaEnDtxShadow & bitVal) != 0) + { + newPaEnDtxShadow &= ~bitVal; + } + } + else if (paEnInput == ADI_ADRV904X_PA_EN_INPUT_SEL_DTX_RS) + { + if ((newPaEnDtxShadow & bitVal) == 0) + { + newPaEnDtxShadow |= bitVal; + } + } + } + + /* Write the new shadow value */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_PA_EN_WITH_DTX_OUTPUT_SHADOW, + newPaEnDtxShadow); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while setting new PA En DTX shadow register."); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlPaSelectInputGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_PaEnOutputs_e paEnOutput, + adi_adrv904x_PaEnInputSel_e * const paEnInput) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t curPaEnDtxShadow = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, paEnInput, cleanup); + + /* Range check paEnOutput value according to adi_adrv904x_PaEnOutputs_e enum and only one bit is set */ + if (((paEnOutput >> 8U) != 0U) || + ((paEnOutput & (paEnOutput -1)) != 0) || + (paEnOutput == 0U)) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + paEnOutput, + "paEnOutput selected value is invalid. Only one bit 0-7 is allowed."); + goto cleanup; + } + + /* Read back the current shadow value */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_PA_EN_WITH_DTX_OUTPUT_SHADOW, + &curPaEnDtxShadow); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while retrieving current PA En DTX shadow register."); + goto cleanup; + } + + if ((curPaEnDtxShadow & paEnOutput) == 0U) + { + *paEnInput = ADI_ADRV904X_PA_EN_INPUT_SEL_RS; + } + else + { + *paEnInput = ADI_ADRV904X_PA_EN_INPUT_SEL_DTX_RS; + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDtxFanoutToPaEnConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const adi_adrv904x_DtxFanoutToPaEnCfg_t * const dtxFanoutCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t nonzeroFanoutBm = 0x00U; + + uint8_t txIdx = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dtxFanoutCfg, cleanup); + + if (txChannelMask > (uint32_t)ADI_ADRV904X_TXALL) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txChannelMask, + "txChannelMask selected value is invalid. Only bit 0-7 is allowed."); + goto cleanup; + } + + if (device->devStateInfo.dtxInputMapping.dtxEventWaitTimeNs > 0) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + device->devStateInfo.dtxInputMapping.dtxEventWaitTimeNs, + "The DTX Event Wait Time cannot be set when DTX Fanout method is used."); + goto cleanup; + } + + for (txIdx = 0; txIdx < ADI_ADRV904X_MAX_TXCHANNELS; txIdx++) + { + /* Skip unselected TX channels */ + if (((uint32_t)txChannelMask & (1 << txIdx) ) == 0U) + { + continue; + } + + /* Range check DTX fanout value according to adi_adrv904x_PaEnOutputs_e enum */ + if (dtxFanoutCfg->fanout[txIdx] > ADI_ADRV904X_PA_EN_OUT_ALL) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dtxFanoutCfg->fanout[txIdx], + "Selected DTX fanout value is invalid. Only bit 0-7 is allowed."); + goto cleanup; + } + + /* Write the requested DTX fanout to scratchpad table */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (ADRV904X_DTX_FANOUT_TO_PA_EN_TBL_TX0 + txIdx), + dtxFanoutCfg->fanout[txIdx]); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while writing the value of DTX fanout to PA_EN."); + goto cleanup; + } + + if (dtxFanoutCfg->fanout[txIdx] != 0U) + { + nonzeroFanoutBm |= ((1 << txIdx)); + } + } + + /* Write the requested DTX fanout to scratchpad table */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (ADRV904X_NONZERO_DTX_FANOUT_TO_PA_EN_FOR_TX_BM), + nonzeroFanoutBm); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while writing the value of DTX fanout bitmap."); + goto cleanup; + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDtxFanoutToPaEnConfigGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DtxFanoutToPaEnCfg_t * const dtxFanoutCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t regValue = 0U; + uint8_t txIdx = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dtxFanoutCfg, cleanup); + + ADI_LIBRARY_MEMSET(dtxFanoutCfg, 0, sizeof(adi_adrv904x_DtxFanoutToPaEnCfg_t)); + + for (txIdx = 0; txIdx < ADI_ADRV904X_MAX_TXCHANNELS; txIdx++) + { + /* Read DTX fanout to PA_EN */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (ADRV904X_DTX_FANOUT_TO_PA_EN_TBL_TX0 + txIdx), + ®Value); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while reading the value of DTX fanout to PA_EN."); + goto cleanup; + } + + dtxFanoutCfg->fanout[txIdx] = regValue; + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlExtAlarmConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t alarmMask, + const adi_adrv904x_RadioCtrlAlarmConfig_t * const alarmCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t extendedCoreScratchRegBaseAddress = 0U; + uint32_t tempAddress = 0U; + uint8_t origEccState = 0U; + uint16_t scratchId = 0U; + uint8_t alarmIdx = 0U; + uint16_t alarmVal = 0U; + uint8_t regValue = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, alarmCfg, cleanup); + + /* Range check alarmMask value according to adi_adrv904x_Alarms_e enum */ + if (((alarmMask >> ADI_ADRV904X_ALARM_MAX) != 0U) || + (alarmMask == 0U)) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + alarmMask, + "alarmMask selected value is invalid. Only bit 0-9 is allowed."); + goto cleanup; + } + + /* Check alarm type */ + if ((alarmCfg->alarmType == ADI_ADRV904X_ALARM_TYPE_NONE) && + ((alarmCfg->lnaEnOut != 0) || (alarmCfg->paEnOut !=0) || (alarmCfg->auxGrp0Out != 0) || (alarmCfg->auxGrp1Out != 0))) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + alarmMask, + "alarmType selected value is invalid."); + goto cleanup; + } + + for (alarmIdx = 0; alarmIdx < ADI_ADRV904X_ALARM_MAX; alarmIdx++) + { + alarmVal = (uint16_t)1 << alarmIdx; + + /* Skip unselected bitmask */ + if ((alarmMask & alarmVal) == 0U) + { + continue; + } + + /* Range check alarmType value. */ + if ((uint8_t) alarmCfg->alarmType > ADI_ADRV904X_MAX_ALARM_TYPE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + alarmCfg->alarmType, + "alarmType selected value is invalid. Only value less than 2 is allowed."); + goto cleanup; + } + + /* Read current value of scratchpad register */ + scratchId = ADRV904X_EA_TYPE_TBL_ALARM_0 + alarmIdx; + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + scratchId, + ®Value); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while reading scratchpad register value."); + goto cleanup; + } + + /* Only 3 Most Significant Bits are used for Alarm Type */ + regValue = (regValue & 0x1F) | (alarmCfg->alarmType << 5); + + /* Write the Alarm Type */ + scratchId = ADRV904X_EA_TYPE_TBL_ALARM_0 + alarmIdx; + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + scratchId, + regValue); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while setting new External Alarm type."); + goto cleanup; + } + + /* Read the base address for extended core scratch registers located in M4 heap*/ + recoveryAction = adi_adrv904x_Register32Read(device, NULL, ADRV904X_PM_CORE_SCRATCH_EXT_PTR, &extendedCoreScratchRegBaseAddress, 0xFFFFFFFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading extended core stream scratch base addr"); + goto cleanup; + } + + /* Read the current ECC scrubbing state in M4 before disabling ECC */ + recoveryAction = adi_adrv904x_EccEnableGet(device, &origEccState); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading ECC state of M4"); + return recoveryAction; + } + + /* Disable ECC before we write to M4 memory */ + recoveryAction = adi_adrv904x_EccEnableSet(device, 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while disabling ECC scrubbing on M4"); + return recoveryAction; + } + + /* Write LNA En */ + tempAddress = extendedCoreScratchRegBaseAddress + 4U * (ADRV904X_EA_IMP_LNA_EN_TBL_ALARM_0 + alarmIdx); + recoveryAction = adi_adrv904x_Register32Write(device, NULL, tempAddress, alarmCfg->lnaEnOut, 0x000000FF); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while setting new LNA En value."); + goto cleanup; + } + + /* Write PA En */ + tempAddress = extendedCoreScratchRegBaseAddress + 4U * (ADRV904X_EA_IMP_PA_EN_TBL_ALARM_0 + alarmIdx); + recoveryAction = adi_adrv904x_Register32Write(device, NULL, tempAddress, alarmCfg->paEnOut, 0x000000FF); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while setting new PA En value."); + goto cleanup; + } + + /* Write OC Fuse En Out */ + tempAddress = extendedCoreScratchRegBaseAddress + 4U * (ADRV904X_EA_IMP_OC_FUSE_EN_TBL_ALARM_0 + alarmIdx); + recoveryAction = adi_adrv904x_Register32Write(device, NULL, tempAddress, alarmCfg->ocFuseEnOut, 0x000000FF); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while setting new OC Fuse En Out value."); + goto cleanup; + } + + /* Write Aux Grp0 */ + tempAddress = extendedCoreScratchRegBaseAddress + 4U * (ADRV904X_EA_IMP_AUX_GRP0_TBL_ALARM_0 + alarmIdx); + recoveryAction = adi_adrv904x_Register32Write(device, NULL, tempAddress, alarmCfg->auxGrp0Out, 0x000000FF); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while setting new Aux Grp0 Out value."); + goto cleanup; + } + + /* Write Aux Grp1 */ + tempAddress = extendedCoreScratchRegBaseAddress + 4U * (ADRV904X_EA_IMP_AUX_GRP1_TBL_ALARM_0 + alarmIdx); + recoveryAction = adi_adrv904x_Register32Write(device, NULL, tempAddress, alarmCfg->auxGrp1Out, 0x000000FF); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while setting new Aux Grp1 Out value."); + goto cleanup; + } + + /* Restore ECC scrubbing before we exit */ + recoveryAction = adi_adrv904x_EccEnableSet(device, origEccState); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while restoring ECC scrubbing on M4"); + return recoveryAction; + } + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlExtAlarmConfigGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Alarms_e alarmId, + adi_adrv904x_RadioCtrlAlarmConfig_t * const alarmCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t extendedCoreScratchRegBaseAddress = 0U; + uint32_t tempAddress = 0U; + uint16_t scratchId = 0U; + uint8_t alarmIdx = 0U; + uint8_t regValue = 0U; + uint32_t regValue32 = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, alarmCfg, cleanup); + + ADI_LIBRARY_MEMSET(alarmCfg, 0, sizeof(adi_adrv904x_RadioCtrlAlarmConfig_t)); + + /* Range check alarmId value according to adi_adrv904x_Alarms_e enum */ + if (((alarmId >> ADI_ADRV904X_ALARM_MAX) != 0U) || + ((alarmId & (alarmId -1)) != 0) || + (alarmId == 0U)) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + alarmId, + "alarmId selected value is invalid."); + goto cleanup; + } + + for (alarmIdx = 0; alarmIdx < ADI_ADRV904X_ALARM_MAX; alarmIdx++) + { + if (((uint32_t)alarmId & ((uint32_t)1 << alarmIdx)) > 0) + { + break; + } + } + + if (alarmIdx >= ADI_ADRV904X_ALARM_MAX) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + alarmId, + "alarmId selected value is invalid."); + goto cleanup; + } + + /* Read the Alarm Type */ + scratchId = ADRV904X_EA_TYPE_TBL_ALARM_0 + alarmIdx; + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + scratchId, + ®Value); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while reading new External Alarm type."); + goto cleanup; + } + + /* Only 3 Most Significant Bits are used for Alarm Type */ + alarmCfg->alarmType = (adi_adrv904x_AlarmType_e)((regValue & 0xE0) >> 5); + + recoveryAction = adi_adrv904x_Register32Read(device, NULL, ADRV904X_PM_CORE_SCRATCH_EXT_PTR, &extendedCoreScratchRegBaseAddress, 0xFFFFFFFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading extended core stream scratch base addr"); + goto cleanup; + } + + /* Read LNA En */ + tempAddress = extendedCoreScratchRegBaseAddress + 4U * (ADRV904X_EA_IMP_LNA_EN_TBL_ALARM_0 + alarmIdx); + recoveryAction = adi_adrv904x_Register32Read(device, NULL, tempAddress, ®Value32, 0xFFFFFFFF); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while reading new LNA En value."); + goto cleanup; + } + alarmCfg->lnaEnOut = (uint8_t)regValue32; + + /* Read PA En */ + tempAddress = extendedCoreScratchRegBaseAddress + 4U * (ADRV904X_EA_IMP_PA_EN_TBL_ALARM_0 + alarmIdx); + recoveryAction = adi_adrv904x_Register32Read(device, NULL, tempAddress, ®Value32, 0xFFFFFFFF); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while reading new PA En value."); + goto cleanup; + } + alarmCfg->paEnOut = (uint8_t)regValue32; + + /* Read OC Fuse En Out */ + tempAddress = extendedCoreScratchRegBaseAddress + 4U * (ADRV904X_EA_IMP_OC_FUSE_EN_TBL_ALARM_0 + alarmIdx); + recoveryAction = adi_adrv904x_Register32Read(device, NULL, tempAddress, ®Value32, 0xFFFFFFFF); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while reading new OC Fuse En Out value."); + goto cleanup; + } + alarmCfg->ocFuseEnOut = (uint8_t)regValue32; + + /* Read Aux Grp0 */ + tempAddress = extendedCoreScratchRegBaseAddress + 4U * (ADRV904X_EA_IMP_AUX_GRP0_TBL_ALARM_0 + alarmIdx); + recoveryAction = adi_adrv904x_Register32Read(device, NULL, tempAddress, ®Value32, 0xFFFFFFFF); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while reading new Aux Grp0 value."); + goto cleanup; + } + alarmCfg->auxGrp0Out = (uint8_t)regValue32; + + + /* Read Aux Grp1 */ + tempAddress = extendedCoreScratchRegBaseAddress + 4U * (ADRV904X_EA_IMP_AUX_GRP1_TBL_ALARM_0 + alarmIdx); + recoveryAction = adi_adrv904x_Register32Read(device, NULL, tempAddress, ®Value32, 0xFFFFFFFF); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while reading new Aux Grp1 value."); + goto cleanup; + } + alarmCfg->auxGrp1Out = (uint8_t)regValue32; + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlExtAlarmStateGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Alarms_e alarmId, + adi_adrv904x_AlarmState_e * const alarmState) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint16_t scratchId = 0U; + uint8_t alarmIdx = 0U; + uint8_t activePaEnAlarm = 0U; + uint8_t activeLnaEnAlarm = 0U; + uint8_t activeAuxGrp0OutAlarm = 0U; + uint8_t activeAuxGrp1OutAlarm = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, alarmState, cleanup); + + /* Range check alarmId value according to adi_adrv904x_Alarms_e enum */ + if (((alarmId >> ADI_ADRV904X_ALARM_MAX) != 0U) || + ((alarmId & (alarmId - 1)) != 0) || + (alarmId == 0U)) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + alarmId, + "alarmId selected value is invalid."); + goto cleanup; + } + + for (alarmIdx = 0; alarmIdx < ADI_ADRV904X_ALARM_MAX; alarmIdx++) + { + if (((uint32_t)alarmId & ((uint32_t)1 << alarmIdx)) > 0) + { + break; + } + } + + /* Read the current active PA En Alarm */ + scratchId = ADRV904X_EA_CURR_AFCTD_PA_EN_TBL_ALARM_0 + alarmIdx; + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + scratchId, + &activePaEnAlarm); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while reading EA_CURR_AFCTD_PA_EN_TBL."); + goto cleanup; + } + + /* Read the current active LNA En Alarm */ + scratchId = ADRV904X_EA_CURR_AFCTD_LNA_EN_TBL_ALARM_0 + alarmIdx; + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + scratchId, + &activeLnaEnAlarm); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while reading EA_CURR_AFCTD_LNA_EN_TBL."); + goto cleanup; + } + + /* Read the current active AUX GRP0 output Alarm */ + scratchId = ADRV904X_EA_CURR_AFCTD_AUX_GRP0_TBL_ALARM_0 + alarmIdx; + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + scratchId, + &activeAuxGrp0OutAlarm); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while reading EA_CURR_AFCTD_AUX_GRP0_OUT_TBL."); + goto cleanup; + } + + /* Read the current active AUX GRP1 output Alarm */ + scratchId = ADRV904X_EA_CURR_AFCTD_AUX_GRP1_TBL_ALARM_0 + alarmIdx; + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + scratchId, + &activeAuxGrp1OutAlarm); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while reading EA_CURR_AFCTD_AUX_GRP1_OUT_TBL."); + goto cleanup; + } + + *alarmState = ADI_ADRV904X_ALARM_STATE_INACTIVE; + if ((activePaEnAlarm != 0U) || (activeLnaEnAlarm != 0U) || (activeAuxGrp0OutAlarm != 0U) || (activeAuxGrp1OutAlarm != 0U)) + { + *alarmState = ADI_ADRV904X_ALARM_STATE_ACTIVE; + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlExtAlarmGpioStateGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Alarms_e alarmId, + adi_adrv904x_AlarmState_e * const alarmState) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t gpioInPinLevel = 0U; + uint8_t alarmIdx = 0U; + uint8_t gpioPin = 0U; + uint16_t gpioPinPolarity = 0U; + uint8_t tempReg = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, alarmState, cleanup); + + /* Range check alarmId value according to adi_adrv904x_Alarms_e enum */ + if (((alarmId >> ADI_ADRV904X_ALARM_MAX) != 0U) || + ((alarmId & (alarmId - 1)) != 0) || + (alarmId == 0U)) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + alarmId, + "alarmId selected value is invalid."); + goto cleanup; + } + + /* Initialize the alarm state to inactive */ + *alarmState = ADI_ADRV904X_ALARM_STATE_INACTIVE; + + for (alarmIdx = 0; alarmIdx < ADI_ADRV904X_ALARM_MAX; alarmIdx++) + { + if ((uint32_t)(alarmId & ((uint32_t)1 << alarmIdx)) > 0) + { + break; + } + } + + /* Find which GPIO pin is assigned as an input to this alarm */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (ADRV904X_EA_TYPE_TBL_ALARM_0 + alarmIdx), + &gpioPin); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while reading External Alarm type table."); + goto cleanup; + } + + /* Only 5 LSB bits are used as GPIO pin number */ + gpioPin &= 0x1F; + + if (gpioPin == 0x1F) + { + ADI_API_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + "No GPIO input pin assigned to the alarm."); + goto cleanup; + } + + recoveryAction = adrv904x_Core_GpioSpiRead_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &gpioInPinLevel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while reading back GPIO Manual Mode Input Word values."); + goto cleanup; + } + + /* Find the polarity of the pin assigned to this alarm */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_INPUT_PIN_POLARITY_BM_0, + &tempReg); + gpioPinPolarity = tempReg; + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while reading External Alarm pin polarity, byte0."); + goto cleanup; + } + + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_INPUT_PIN_POLARITY_BM_1, + &tempReg); + gpioPinPolarity |= (((uint16_t)tempReg << 8U) & 0xFF00U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while reading External Alarm pin polarity, byte1."); + goto cleanup; + } + + gpioPinPolarity &= (1 << alarmIdx); + gpioInPinLevel &= (1 << gpioPin); + + /* Check the state of the GPIO pin assigned to this alarm. */ + if (((gpioInPinLevel == 0) && (gpioPinPolarity == 0)) || + ((gpioInPinLevel != 0) && (gpioPinPolarity != 0))) + { + *alarmState = ADI_ADRV904X_ALARM_STATE_ACTIVE; + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlExtAlarmStateClear(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Alarms_e alarmId) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t gpioInPinLevel = 0U; + uint16_t gpioPinPolarity = 0U; + uint8_t alarmIdx = 0U; + uint8_t gpioPin = 0U; + uint8_t regVal = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Range check alarmId value according to adi_adrv904x_Alarms_e enum */ + if (((alarmId >> ADI_ADRV904X_ALARM_MAX) != 0U) || + ((alarmId & (alarmId - 1)) != 0) || + (alarmId == 0U)) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + alarmId, + "alarmId selected value is invalid."); + goto cleanup; + } + + for (alarmIdx = 0; alarmIdx < ADI_ADRV904X_ALARM_MAX; alarmIdx++) + { + if (((uint32_t)alarmId & ((uint32_t)1 << alarmIdx)) > 0) + { + break; + } + } + + /* Find which GPIO pin is assigned as an input to this alarm */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (ADRV904X_EA_TYPE_TBL_ALARM_0 + alarmIdx), + &gpioPin); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while reading External Alarm type table."); + goto cleanup; + } + + /* Only 5 LSB bits are used as GPIO pin number */ + gpioPin &= 0x1F; + + if (gpioPin == 0x1F) + { + ADI_API_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + "No GPIO input pin assigned to the alarm."); + goto cleanup; + } + + recoveryAction = adrv904x_Core_GpioSpiRead_BfGet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + &gpioInPinLevel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while reading back GPIO Manual Mode Input Word values."); + goto cleanup; + } + + /* Find the polarity of the pin assigned to this alarm */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_INPUT_PIN_POLARITY_BM_0, + ®Val); + gpioPinPolarity = regVal; + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while reading External Alarm pin polarity, byte0."); + goto cleanup; + } + + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_INPUT_PIN_POLARITY_BM_1, + ®Val); + gpioPinPolarity |= (((uint16_t)regVal << 8U) & 0xFF00U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while reading External Alarm pin polarity, byte1."); + goto cleanup; + } + + gpioPinPolarity &= (1 << alarmIdx); + gpioInPinLevel &= (1 << gpioPin); + + /* Check the state of the GPIO pin assigned to this alarm. If still active, report an error */ + if (((gpioInPinLevel == 0) && (gpioPinPolarity == 0)) || + ((gpioInPinLevel != 0) && (gpioPinPolarity != 0))) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Incorrect state if the GPIO pin assigned as alarm input."); + goto cleanup; + } + + /* Set the Alarm ID */ + regVal = (uint8_t) alarmIdx; + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_TMP_ALARM_ID_LNA_PA_BM, + regVal); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while setting alarm id."); + goto cleanup; + } + + /* Trigger stream */ + recoveryAction = adrv904x_StreamTrigger(device, ADRV904X_STREAM_EXT_ALARM_STATE_CLEAR); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while triggering Core Stream to apply Ext Alarm State Clear."); + goto cleanup; + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDbgLnaAlwaysOnSet(adi_adrv904x_Device_t* const device, + const uint32_t lnaEnMask, + const uint8_t activate) +{ + const uint8_t MAX_SIGNAL = 8U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lnaEnWithAssignedGpiosBitmask = 0; + uint8_t signalOffset = 0U; + uint8_t isDigital = 0U; + uint8_t lnaEnAlwaysOffFlags = 0U; + uint8_t lnaEnAlwaysOnFlags = 0U; + uint8_t lnaEnAffectedByAlarm = 0U; + uint8_t lnaEnOutputBm = 0U; + adi_adrv904x_OutGpioPinStates_e gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_NORMAL_OP; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Range check lnaEnMask value according to adi_adrv904x_LnaEnOutputs_e enum */ + if (((lnaEnMask >> 8U) != 0U) || + (lnaEnMask == 0U)) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + lnaEnMask, + "lnaEnMask selected value is invalid."); + goto cleanup; + } + + /* Get the ALWAYS OFF flag for all LNA_EN signals */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_LNA_EN_ALWAYS_OFF, + &lnaEnAlwaysOffFlags); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while getting LNA EN ALWAYS OFF."); + goto cleanup; + } + + /* Get the ALWAYS ON flag for all LNA_EN signals */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_LNA_EN_ALWAYS_ON, + &lnaEnAlwaysOnFlags); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while getting LNA EN ALWAYS ON."); + goto cleanup; + } + + /* Create a bitmap of all LNA_EN which have GPIO pin assigned */ + for (signalOffset = 0; signalOffset < MAX_SIGNAL; signalOffset++) + { + if ((device->devStateInfo.alarmGpioConfig.lnaEnOutDigGpio[signalOffset] == ADI_ADRV904X_GPIO_INVALID) && + (device->devStateInfo.alarmGpioConfig.lnaEnOutAnaGpio[signalOffset] == ADI_ADRV904X_GPIO_ANA_INVALID)) + { + lnaEnWithAssignedGpiosBitmask &= ~(1 << signalOffset); + } + else + { + lnaEnWithAssignedGpiosBitmask |= (1 << signalOffset); + } + } + + if (activate == ADI_TRUE) + { + /* Check if any if the requested LNA_EN signals has ALWAYS_OFF flag already set */ + if ((lnaEnMask & lnaEnAlwaysOffFlags) != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + lnaEnMask, + "One of the selected LNA EN signals has ALWAYS OFF flag set."); + goto cleanup; + } + + /* Update the Always ON flag */ + lnaEnAlwaysOnFlags |= lnaEnMask; + + /* Set pin state to the value selected in the device profile */ + switch (device->devStateInfo.alarmGpioConfig.lnaEnOutGpioPinMode) + { + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_ACTIVE_LOW): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_ON; + break; + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_ACTIVE_HIGH): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_OFF; + break; + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_HIGH_Z): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_HIGH_Z; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + device->devStateInfo.alarmGpioConfig.lnaEnOutGpioPinMode, + "Unexpected LNA EN pin mode."); + goto cleanup; + } + + /* Update the output for all LNA_EN specified in the request which have GPIO pin assigned and set the debug flag */ + recoveryAction = adrv904x_RadioCtrlDbgGpioOutputSet(device, + ADI_ADRV904X_OUT_GPIO_SIG_TYPE_LNA_EN, + (lnaEnMask & lnaEnWithAssignedGpiosBitmask), + gpioPinstate, + isDigital, + 2); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while updating LNA EN ALWAYS ON outputs."); + goto cleanup; + } + } + else + { + /* Update the Always ON flag */ + lnaEnAlwaysOnFlags &= ~lnaEnMask; + + /* Only update the LNA_EN outputs which are not frozen by Always OFF flag */ + lnaEnOutputBm = lnaEnMask & ~lnaEnAlwaysOffFlags; + + /* Check which LNA_EN outputs are affected by an active alarm */ + recoveryAction = adrv904x_RadioCtrlDbgGpioGetLnaEnAffectedByAlarms(device, + &lnaEnAffectedByAlarm); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while getting bitmap of LNA_EN outputs currently affected by active alarm."); + goto cleanup; + } + + /* First, handle the LNA_EN outputs affected by active alarms */ + + /* Change pin state to the deactive state */ + switch (device->devStateInfo.alarmGpioConfig.lnaEnOutGpioPinMode) + { + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_ACTIVE_LOW): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_OFF; + break; + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_ACTIVE_HIGH): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_ON; + break; + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_HIGH_Z): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_HIGH_Z; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + device->devStateInfo.alarmGpioConfig.lnaEnOutGpioPinMode, + "Unexpected LNA EN pin mode."); + goto cleanup; + } + + /* Update the LNA_EN outputs affected by active alarms which have GPIO pin assigned and clear the debug flag */ + recoveryAction = adrv904x_RadioCtrlDbgGpioOutputSet(device, + ADI_ADRV904X_OUT_GPIO_SIG_TYPE_LNA_EN, + (lnaEnOutputBm & lnaEnAffectedByAlarm & lnaEnWithAssignedGpiosBitmask), + gpioPinstate, + isDigital, + 1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while updating LNA EN outputs affected by alarms."); + goto cleanup; + } + + /* Then, the rest of the outputs can be set to normal operation */ + + /* Set pin state to Normal Operation (RS controlled) and clear the debug flag */ + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_NORMAL_OP; + + recoveryAction = adrv904x_RadioCtrlDbgGpioOutputSet(device, + ADI_ADRV904X_OUT_GPIO_SIG_TYPE_LNA_EN, + (lnaEnOutputBm & ~lnaEnAffectedByAlarm & lnaEnWithAssignedGpiosBitmask), + gpioPinstate, + isDigital, + 1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while updating LNA EN outputs not affected by alarms."); + goto cleanup; + } + } + + /* Update the ALWAYS ON flag for LNA_EN signals */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_LNA_EN_ALWAYS_ON, + lnaEnAlwaysOnFlags); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while setting LNA EN ALWAYS ON."); + goto cleanup; + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDbgLnaAlwaysOnGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_LnaEnOutputs_e lnaEnId, + uint8_t * const activate) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t regVal = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, activate, cleanup); + + *activate = ADI_FALSE; + + /* Range check lnaEnId value according to adi_adrv904x_LnaEnOutputs_e enum */ + if (((lnaEnId >> 8U) != 0U) || + ((lnaEnId & (lnaEnId - 1)) != 0) || + (lnaEnId == 0U)) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + lnaEnId, + "lnaEnId selected value is invalid."); + goto cleanup; + } + + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_LNA_EN_ALWAYS_ON, + ®Val); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while getting LNA EN ALWAYS ON."); + goto cleanup; + } + + if ((regVal & lnaEnId) != 0) + { + *activate = ADI_TRUE; + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDbgLnaAlwaysOffSet(adi_adrv904x_Device_t* const device, + const uint32_t lnaEnMask, + const uint8_t activate) +{ + const uint8_t MAX_SIGNAL = 8U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t lnaEnWithAssignedGpiosBitmask = 0; + uint8_t signalOffset = 0U; + uint8_t isDigital = 0U; + uint8_t lnaEnAlwaysOffFlags = 0U; + uint8_t lnaEnAlwaysOnFlags = 0U; + uint8_t lnaEnAffectedByAlarm = 0U; + uint8_t lnaEnOutputBm = 0U; + adi_adrv904x_OutGpioPinStates_e gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_NORMAL_OP; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Range check lnaEnMask value according to adi_adrv904x_LnaEnOutputs_e enum */ + if (((lnaEnMask >> 8U) != 0U) || + (lnaEnMask == 0U)) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + lnaEnMask, + "lnaEnMask selected value is invalid."); + goto cleanup; + } + + /* Get the ALWAYS OFF flag for all LNA_EN signals */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_LNA_EN_ALWAYS_OFF, + &lnaEnAlwaysOffFlags); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while getting LNA EN ALWAYS OFF."); + goto cleanup; + } + + /* Get the ALWAYS ON flag for all LNA_EN signals */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_LNA_EN_ALWAYS_ON, + &lnaEnAlwaysOnFlags); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while getting LNA EN ALWAYS ON."); + goto cleanup; + } + + /* Create a bitmap of all LNA_EN which have GPIO pin assigned */ + for (signalOffset = 0; signalOffset < MAX_SIGNAL; signalOffset++) + { + if ((device->devStateInfo.alarmGpioConfig.lnaEnOutDigGpio[signalOffset] == ADI_ADRV904X_GPIO_INVALID) && + (device->devStateInfo.alarmGpioConfig.lnaEnOutAnaGpio[signalOffset] == ADI_ADRV904X_GPIO_ANA_INVALID)) + { + lnaEnWithAssignedGpiosBitmask &= ~(1 << signalOffset); + } + else + { + lnaEnWithAssignedGpiosBitmask |= (1 << signalOffset); + } + } + + if (activate == ADI_TRUE) + { + /* Check if any if the reuested LNA_EN signals has ALWAYS_ON flag already set */ + if ((lnaEnMask & lnaEnAlwaysOnFlags) != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + lnaEnMask, + "One of the selected LNA EN signals has ALWAYS ON flag set."); + goto cleanup; + } + + /* Update the Always OFF flag */ + lnaEnAlwaysOffFlags |= lnaEnMask; + + /* Set pin state to the value selected in the device profile */ + switch (device->devStateInfo.alarmGpioConfig.lnaEnOutGpioPinMode) + { + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_ACTIVE_LOW): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_OFF; + break; + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_ACTIVE_HIGH): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_ON; + break; + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_HIGH_Z): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_HIGH_Z; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + device->devStateInfo.alarmGpioConfig.lnaEnOutGpioPinMode, + "Unexpected LNA EN pin mode."); + goto cleanup; + } + + /* Update the output for all LNA_EN specified in the request which have GPIO pin assigned and set the debug flag */ + recoveryAction = adrv904x_RadioCtrlDbgGpioOutputSet(device, + ADI_ADRV904X_OUT_GPIO_SIG_TYPE_LNA_EN, + (lnaEnMask & lnaEnWithAssignedGpiosBitmask), + gpioPinstate, + isDigital, + 2); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while updating LNA EN ALWAYS ON outputs."); + goto cleanup; + } + } + else + { + /* Update the Always OFF flag */ + lnaEnAlwaysOffFlags &= ~lnaEnMask; + + + /* Only update the LNA_EN outputs which are not frozen by Always ON flag */ + lnaEnOutputBm = lnaEnMask & ~lnaEnAlwaysOnFlags; + + /* Check which LNA_EN outputs are affected by an active alarm */ + recoveryAction = adrv904x_RadioCtrlDbgGpioGetLnaEnAffectedByAlarms(device, + &lnaEnAffectedByAlarm); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while getting bitmap of LNA_EN outputs currently affected by active alarm."); + goto cleanup; + } + + /* First, handle the LNA_EN outputs affected by active alarms */ + + /* Change pin state to the deactive state */ + switch (device->devStateInfo.alarmGpioConfig.lnaEnOutGpioPinMode) + { + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_ACTIVE_LOW): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_OFF; + break; + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_ACTIVE_HIGH): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_ON; + break; + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_HIGH_Z): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_HIGH_Z; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + device->devStateInfo.alarmGpioConfig.lnaEnOutGpioPinMode, + "Unexpected LNA EN pin mode."); + goto cleanup; + } + + /* Update the LNA_EN outputs affected by active alarms which have GPIO pin assigned and clear the debug flag */ + recoveryAction = adrv904x_RadioCtrlDbgGpioOutputSet(device, + ADI_ADRV904X_OUT_GPIO_SIG_TYPE_LNA_EN, + (lnaEnOutputBm & lnaEnAffectedByAlarm & lnaEnWithAssignedGpiosBitmask), + gpioPinstate, + isDigital, + 1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while updating LNA EN outputs affected by alarms."); + goto cleanup; + } + + /* Then, the rest of the outputs can be set to normal operation */ + + /* Set pin state to Normal Operation (RS controlled) and clear the debug flag */ + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_NORMAL_OP; + + recoveryAction = adrv904x_RadioCtrlDbgGpioOutputSet(device, + ADI_ADRV904X_OUT_GPIO_SIG_TYPE_LNA_EN, + (lnaEnOutputBm & ~lnaEnAffectedByAlarm & lnaEnWithAssignedGpiosBitmask), + gpioPinstate, + isDigital, + 1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while updating LNA EN outputs not affected by alarms."); + goto cleanup; + } + } + + /* Write back the value of the ALWAYS OFF flag for LNA_EN signals */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_LNA_EN_ALWAYS_OFF, + lnaEnAlwaysOffFlags); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while setting LNA EN ALWAYS OFF."); + goto cleanup; + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDbgLnaAlwaysOffGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_LnaEnOutputs_e lnaEnId, + uint8_t * const activate) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t regVal = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, activate, cleanup); + + *activate = ADI_FALSE; + + /* Range check lnaEnId value according to adi_adrv904x_LnaEnOutputs_e enum */ + if (((lnaEnId >> 8U) != 0U) || + ((lnaEnId & (lnaEnId - 1)) != 0) || + (lnaEnId == 0U)) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + lnaEnId, + "lnaEnId selected value is invalid."); + goto cleanup; + } + + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_LNA_EN_ALWAYS_OFF, + ®Val); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while reading LNA EN ALWAYS OFF."); + goto cleanup; + } + + if ((regVal & lnaEnId) != 0) + { + *activate = ADI_TRUE; + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDbgPaAlwaysOnSet(adi_adrv904x_Device_t* const device, + const uint32_t paEnMask, + const uint8_t activate) +{ + const uint8_t MAX_SIGNAL = 8U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t paEnWithAssignedGpiosBitmask = 0; + uint8_t signalOffset = 0U; + uint8_t isDigital = 0U; + uint8_t paEnAlwaysOffFlags = 0U; + uint8_t paEnAlwaysOnFlags = 0U; + uint8_t paEnAffectedByAlarm = 0U; + uint8_t paEnOutputBm = 0U; + adi_adrv904x_OutGpioPinStates_e gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_NORMAL_OP; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Range check lnaEnMask value according to adi_adrv904x_PaEnOutputs_e enum */ + if (((paEnMask >> 8U) != 0U) || + (paEnMask == 0U)) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + paEnMask, + "paEnMask selected value is invalid."); + goto cleanup; + } + + /* Get the ALWAYS OFF flag for all PA_EN signals */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_PA_EN_ALWAYS_OFF, + &paEnAlwaysOffFlags); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while getting PA EN ALWAYS OFF."); + goto cleanup; + } + + /* Get the ALWAYS ON flag for all PA_EN signals */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_PA_EN_ALWAYS_ON, + &paEnAlwaysOnFlags); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while getting PA EN ALWAYS ON."); + goto cleanup; + } + + /* Create a bitmap of all PA_EN which have GPIO pin assigned */ + for (signalOffset = 0; signalOffset < MAX_SIGNAL; signalOffset++) + { + if ((device->devStateInfo.alarmGpioConfig.paEnOutDigGpio[signalOffset] == ADI_ADRV904X_GPIO_INVALID) && + (device->devStateInfo.alarmGpioConfig.paEnOutAnaGpio[signalOffset] == ADI_ADRV904X_GPIO_ANA_INVALID)) + { + paEnWithAssignedGpiosBitmask &= ~(1 << signalOffset); + } + else + { + paEnWithAssignedGpiosBitmask |= (1 << signalOffset); + } + } + + if (activate == ADI_TRUE) + { + /* Check if any if the requested PA_EN signals has ALWAYS_OFF flag already set */ + if ((paEnMask & paEnAlwaysOffFlags) != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + paEnMask, + "One of the selected PA EN signals has ALWAYS OFF flag set."); + goto cleanup; + } + + /* Update the Always ON flag */ + paEnAlwaysOnFlags |= paEnMask; + + /* Set pin state to the value selected in the device profile */ + switch (device->devStateInfo.alarmGpioConfig.paEnOutGpioPinMode) + { + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_ACTIVE_LOW): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_ON; + break; + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_ACTIVE_HIGH): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_OFF; + break; + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_HIGH_Z): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_HIGH_Z; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + device->devStateInfo.alarmGpioConfig.paEnOutGpioPinMode, + "Unexpected PA EN pin mode."); + goto cleanup; + } + + /* Update the output for all PA_EN specified in the request which have GPIO pin assigned and set the debug flag */ + recoveryAction = adrv904x_RadioCtrlDbgGpioOutputSet(device, + ADI_ADRV904X_OUT_GPIO_SIG_TYPE_PA_EN, + (paEnMask & paEnWithAssignedGpiosBitmask), + gpioPinstate, + isDigital, + 2); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while updating PA EN ALWAYS ON outputs."); + goto cleanup; + } + } + else + { + /* Update the Always ON flag */ + paEnAlwaysOnFlags &= ~paEnMask; + + /* Only update the PA_EN outputs which are not frozen by Always OFF flag */ + paEnOutputBm = paEnMask & ~paEnAlwaysOffFlags; + + /* Check which PA_EN outputs are affected by an active alarm */ + recoveryAction = adrv904x_RadioCtrlDbgGpioGetPaEnAffectedByAlarms(device, + &paEnAffectedByAlarm); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while getting bitmap of PA_EN outputs currently affected by active alarm."); + goto cleanup; + } + + /* First, handle the PA_EN outputs affected by active alarms */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_TMP_ALARM_ID_LNA_PA_BM, + (paEnOutputBm & paEnAffectedByAlarm)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while setting ADRV904X_EA_TMP_ALARM_ID_LNA_PA_BM."); + goto cleanup; + } + + /* Trigger stream to mute TXes affected by active alarms */ + recoveryAction = adrv904x_StreamTrigger(device, ADRV904X_STREAM_EXT_ALARM_UPDATE_ALARM_OUTPUTS); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while triggering Core Stream to update alarm outputs."); + goto cleanup; + } + + /* Change pin state to the deactive state */ + switch (device->devStateInfo.alarmGpioConfig.paEnOutGpioPinMode) + { + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_ACTIVE_LOW): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_OFF; + break; + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_ACTIVE_HIGH): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_ON; + break; + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_HIGH_Z): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_HIGH_Z; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + device->devStateInfo.alarmGpioConfig.paEnOutGpioPinMode, + "Unexpected PA EN pin mode."); + goto cleanup; + } + + /* Update the PA_EN outputs affected by active alarms which have GPIO pin assigned and clear the debug flag */ + recoveryAction = adrv904x_RadioCtrlDbgGpioOutputSet(device, + ADI_ADRV904X_OUT_GPIO_SIG_TYPE_PA_EN, + (paEnOutputBm & paEnAffectedByAlarm & paEnWithAssignedGpiosBitmask), + gpioPinstate, + isDigital, + 1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while updating PA EN outputs affected by alarms."); + goto cleanup; + } + + /* Then, the rest of the outputs can be set to normal operation */ + + /* Set pin state to Normal Operation (RS controlled) and clear the debug flag */ + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_NORMAL_OP; + + recoveryAction = adrv904x_RadioCtrlDbgGpioOutputSet(device, + ADI_ADRV904X_OUT_GPIO_SIG_TYPE_PA_EN, + (paEnOutputBm & ~paEnAffectedByAlarm & paEnWithAssignedGpiosBitmask), + gpioPinstate, + isDigital, + 1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while updating PA EN outputs not affected by alarms."); + goto cleanup; + } + } + + /* Write back the value of the ALWAYS ON flag for PA_EN signals */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_PA_EN_ALWAYS_ON, + paEnAlwaysOnFlags); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while setting PA EN ALWAYS ON."); + goto cleanup; + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDbgPaAlwaysOnGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_PaEnOutputs_e paEnId, + uint8_t * const activate) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t regVal = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, activate, cleanup); + + *activate = ADI_FALSE; + + /* Range check lnaEnId value according to adi_adrv904x_PaEnOutputs_e enum */ + if (((paEnId >> 8U) != 0U) || + ((paEnId & (paEnId - 1)) != 0) || + (paEnId == 0U)) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + paEnId, + "paEnId selected value is invalid."); + goto cleanup; + } + + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_PA_EN_ALWAYS_ON, + ®Val); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while reading PA EN ALWAYS ON."); + goto cleanup; + } + + if ((regVal & paEnId) != 0) + { + *activate = ADI_TRUE; + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDbgPaAlwaysOffSet(adi_adrv904x_Device_t* const device, + const uint32_t paEnMask, + const uint8_t activate) +{ + const uint8_t MAX_SIGNAL = 8U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t paEnWithAssignedGpiosBitmask = 0; + uint8_t signalOffset = 0U; + uint8_t isDigital = 0U; + uint8_t paEnAlwaysOffFlags = 0U; + uint8_t paEnAlwaysOnFlags = 0U; + uint8_t paEnAffectedByAlarm = 0U; + uint8_t paEnOutputBm = 0U; + adi_adrv904x_OutGpioPinStates_e gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_NORMAL_OP; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Range check lnaEnMask value according to adi_adrv904x_PaEnOutputs_e enum */ + if (((paEnMask >> 8U) != 0U) || + (paEnMask == 0U)) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + paEnMask, + "paEnMask selected value is invalid."); + goto cleanup; + } + + /* Get the ALWAYS OFF flag for all PA_EN signals */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_PA_EN_ALWAYS_OFF, + &paEnAlwaysOffFlags); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while getting PA EN ALWAYS OFF."); + goto cleanup; + } + + /* Get the ALWAYS ON flag for all PA_EN signals */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_PA_EN_ALWAYS_ON, + &paEnAlwaysOnFlags); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while getting PA EN ALWAYS ON."); + goto cleanup; + } + + /* Create a bitmap of all PA_EN which have GPIO pin assigned */ + for (signalOffset = 0; signalOffset < MAX_SIGNAL; signalOffset++) + { + if ((device->devStateInfo.alarmGpioConfig.paEnOutDigGpio[signalOffset] == ADI_ADRV904X_GPIO_INVALID) && + (device->devStateInfo.alarmGpioConfig.paEnOutAnaGpio[signalOffset] == ADI_ADRV904X_GPIO_ANA_INVALID)) + { + paEnWithAssignedGpiosBitmask &= ~(1 << signalOffset); + } + else + { + paEnWithAssignedGpiosBitmask |= (1 << signalOffset); + } + } + + if (activate == ADI_TRUE) + { + /* Check if any if the reuested PA_EN signals has ALWAYS_ON flag already set */ + if ((paEnMask & paEnAlwaysOnFlags) != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + paEnMask, + "One of the selected PA EN signals has ALWAYS ON flag set."); + goto cleanup; + } + + /* Update the Always OFF flag */ + paEnAlwaysOffFlags |= paEnMask; + + /* Set pin state to the value selected in the device profile */ + switch (device->devStateInfo.alarmGpioConfig.paEnOutGpioPinMode) + { + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_ACTIVE_LOW): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_OFF; + break; + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_ACTIVE_HIGH): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_ON; + break; + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_HIGH_Z): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_HIGH_Z; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + device->devStateInfo.alarmGpioConfig.paEnOutGpioPinMode, + "Unexpected PA EN pin mode."); + goto cleanup; + } + + /* Update the output for all PA_EN specified in the request which have GPIO pin assigned and set the debug flag */ + recoveryAction = adrv904x_RadioCtrlDbgGpioOutputSet(device, + ADI_ADRV904X_OUT_GPIO_SIG_TYPE_PA_EN, + (paEnMask & paEnWithAssignedGpiosBitmask), + gpioPinstate, + isDigital, + 2); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while updating PA EN outputs."); + goto cleanup; + } + } + else + { + /* Update the Always OFF flag */ + paEnAlwaysOffFlags &= ~paEnMask; + + /* Only update the PA_EN outputs which are not frozen by Always ON flag */ + paEnOutputBm = paEnMask & ~paEnAlwaysOnFlags; + + /* Check which PA_EN outputs are affected by active alarms */ + recoveryAction = adrv904x_RadioCtrlDbgGpioGetPaEnAffectedByAlarms(device, + &paEnAffectedByAlarm); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while getting bitmap of PA_EN outputs currently affected by active alarms."); + goto cleanup; + } + + /* First, handle the PA_EN outputs affected by active alarms */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_TMP_ALARM_ID_LNA_PA_BM, + (paEnOutputBm & paEnAffectedByAlarm)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while setting ADRV904X_EA_TMP_ALARM_ID_LNA_PA_BM."); + goto cleanup; + } + + /* Trigger stream to mute TXes affected by active alarms */ + recoveryAction = adrv904x_StreamTrigger(device, ADRV904X_STREAM_EXT_ALARM_UPDATE_ALARM_OUTPUTS); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while triggering Core Stream to update alarm outputs."); + goto cleanup; + } + + /* Change pin state to the deactive state */ + switch (device->devStateInfo.alarmGpioConfig.paEnOutGpioPinMode) + { + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_ACTIVE_LOW): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_OFF; + break; + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_ACTIVE_HIGH): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_ON; + break; + case (ADI_ADRV904X_OUT_GPIO_PIN_MODE_HIGH_Z): + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_HIGH_Z; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + device->devStateInfo.alarmGpioConfig.paEnOutGpioPinMode, + "Unexpected PA EN pin mode."); + goto cleanup; + } + + /* Update the PA_EN outputs affected by active alarms which have GPIO pin assigned and clear the debug flag */ + recoveryAction = adrv904x_RadioCtrlDbgGpioOutputSet(device, + ADI_ADRV904X_OUT_GPIO_SIG_TYPE_PA_EN, + (paEnOutputBm & paEnAffectedByAlarm & paEnWithAssignedGpiosBitmask), + gpioPinstate, + isDigital, + 1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while updating PA EN outputs affected by alarms."); + goto cleanup; + } + + /* Then, the rest of the outputs can be set to normal operation */ + + /* Set pin state to Normal Operation (RS controlled) and clear the debug flag */ + gpioPinstate = ADI_ADRV904X_OUT_GPIO_PIN_STATE_NORMAL_OP; + + recoveryAction = adrv904x_RadioCtrlDbgGpioOutputSet(device, + ADI_ADRV904X_OUT_GPIO_SIG_TYPE_PA_EN, + (paEnOutputBm & ~paEnAffectedByAlarm & paEnWithAssignedGpiosBitmask), + gpioPinstate, + isDigital, + 1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while updating PA EN outputs not affected by alarms."); + goto cleanup; + } + } + + /* Update the ALWAYS OFF flag for PA_EN signals */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_PA_EN_ALWAYS_OFF, + paEnAlwaysOffFlags); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while setting PA EN ALWAYS OFF."); + goto cleanup; + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDbgPaAlwaysOffGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_PaEnOutputs_e paEnId, + uint8_t * const activate) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t regVal = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, activate, cleanup); + + *activate = ADI_FALSE; + + /* Range check lnaEnId value according to adi_adrv904x_PaEnOutputs_e enum */ + if (((paEnId >> 8U) != 0U) || + ((paEnId & (paEnId - 1)) != 0) || + (paEnId == 0U)) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + paEnId, + "paEnId selected value is invalid."); + goto cleanup; + } + + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_PA_EN_ALWAYS_OFF, + ®Val); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while reading PA EN ALWAYS OFF."); + goto cleanup; + } + + if ((regVal & paEnId) != 0) + { + *activate = ADI_TRUE; + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDbgGpioOutputSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_OutGpioSigTypes_e gpioSigType, + const uint8_t signalMask, + const adi_adrv904x_OutGpioPinStates_e gpioPinstate) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t isDigital = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Validate the input parameters */ + recoveryAction = adrv904x_RadioCtrlDbgGpioOutputRangeCheck(device, gpioSigType, signalMask, ADI_TRUE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Invalid parameters."); + goto cleanup; + } + + /* Setting the registers */ + recoveryAction = adrv904x_RadioCtrlDbgGpioOutputSet(device, gpioSigType, signalMask, gpioPinstate, isDigital, 0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Failed to set registers."); + goto cleanup; + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlDbgGpioOutputGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_OutGpioSigTypes_e gpioSigType, + const uint8_t signalMask, + adi_adrv904x_OutGpioPinStates_e * const gpioPinstate) + { + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t gpioIdx = 0U; + uint8_t isDigital = 0U; + uint8_t i = 0U; + uint8_t signalOffset = 0U; + const uint8_t MAX_SIGNAL = 8U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gpioPinstate, cleanup); + + /* Validate the input parameters */ + recoveryAction = adrv904x_RadioCtrlDbgGpioOutputRangeCheck(device, gpioSigType, signalMask, ADI_FALSE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Invalid parameters."); + goto cleanup; + } + + /* Find the signal offset based on mask selection */ + for (i = 0; i < MAX_SIGNAL; i++) + { + if ((signalMask & (1 << i)) != 0U) + { + signalOffset = i; + break; + } + } + + /* Based on the input parameters, find the GPIO Index in the GPIO Pins Configuration */ + recoveryAction = adrv904x_RadioCtrlDbgGpioOutputFind(device, gpioSigType, signalOffset, &gpioIdx, &isDigital); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Failed to find GPIO based on the input parameters."); + goto cleanup; + } + + /* Get the GPIO Pin State */ + recoveryAction = adrv904x_RadioCtrlDbgGpioOutputGet(device, gpioSigType, signalOffset, gpioPinstate, gpioIdx, isDigital); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Failed to get the GPIO Pin State."); + goto cleanup; + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); + +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlOcFuseEnOutSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Alarms_e alarmId, + const adi_adrv904x_OutputState_e state) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t regVal = 0U; + uint8_t alarmIdx = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Range check alarmId value according to adi_adrv904x_Alarms_e enum */ + if (((alarmId >> ADI_ADRV904X_ALARM_MAX) != 0U) || + ((alarmId & (alarmId - 1)) != 0) || + (alarmId == 0U)) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + alarmId, + "alarmId selected value is invalid."); + goto cleanup; + } + + for (alarmIdx = 0U; alarmIdx < ADI_ADRV904X_ALARM_MAX; alarmIdx++) + { + if (((uint32_t)alarmId & ((uint32_t)1 << alarmIdx)) > 0) + { + break; + } + } + + regVal = alarmIdx; + if (state == ADI_ADRV904X_OUTPUT_ENABLE) + { + /* set the msb if it is enable. */ + regVal |= 0x80U; + } + + /* Write alarm ID and state */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_EA_TMP_ALARM_ID_LNA_PA_BM, + regVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while setting Alarm Id and state."); + goto cleanup; + } + + /* Trigger stream */ + recoveryAction = adrv904x_StreamTrigger(device, ADRV904X_STREAM_OC_FUSE_EN_OUT); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while triggering Core Stream to apply OC Fuse En Out State."); + goto cleanup; + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalCarrierCfgInitSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RadioCtrlAntCalCarrierCfgInit_t* const antCalCarrierCfgInit) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t i = 0U; + + const adrv904x_BfStreamprocChannelChanAddr_e rxStreamProcChannelBaseAddr[ADI_ADRV904X_MAX_RX_ONLY] = + { + ADRV904X_BF_SLICE_RX_0__SLICE_AHB_STREAM_PROC_CHANNEL, + ADRV904X_BF_SLICE_RX_1__SLICE_AHB_STREAM_PROC_CHANNEL, + ADRV904X_BF_SLICE_RX_2__SLICE_AHB_STREAM_PROC_CHANNEL, + ADRV904X_BF_SLICE_RX_3__SLICE_AHB_STREAM_PROC_CHANNEL, + ADRV904X_BF_SLICE_RX_4__SLICE_AHB_STREAM_PROC_CHANNEL, + ADRV904X_BF_SLICE_RX_5__SLICE_AHB_STREAM_PROC_CHANNEL, + ADRV904X_BF_SLICE_RX_6__SLICE_AHB_STREAM_PROC_CHANNEL, + ADRV904X_BF_SLICE_RX_7__SLICE_AHB_STREAM_PROC_CHANNEL + }; + + const adrv904x_BfStreamprocChannelChanAddr_e txStreamProcChannelBaseAddr[ADI_ADRV904X_MAX_TXCHANNELS] = + { + ADRV904X_BF_SLICE_TX_0__SLICE_AHB_STREAM_PROC_CHANNEL, + ADRV904X_BF_SLICE_TX_1__SLICE_AHB_STREAM_PROC_CHANNEL, + ADRV904X_BF_SLICE_TX_2__SLICE_AHB_STREAM_PROC_CHANNEL, + ADRV904X_BF_SLICE_TX_3__SLICE_AHB_STREAM_PROC_CHANNEL, + ADRV904X_BF_SLICE_TX_4__SLICE_AHB_STREAM_PROC_CHANNEL, + ADRV904X_BF_SLICE_TX_5__SLICE_AHB_STREAM_PROC_CHANNEL, + ADRV904X_BF_SLICE_TX_6__SLICE_AHB_STREAM_PROC_CHANNEL, + ADRV904X_BF_SLICE_TX_7__SLICE_AHB_STREAM_PROC_CHANNEL + }; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, antCalCarrierCfgInit, cleanup); + + /* Write common Rx channel mask to scratch reg */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (uint16_t)ADRV904X_ANTENNA_CAL_COMMON_RX_CHANNEL_MASK, + (uint8_t)(antCalCarrierCfgInit->commonRxMask)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while write common Rx channel mask."); + goto cleanup; + } + + /* Write common Tx channel mask to scratch reg */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (uint16_t)ADRV904X_ANTENNA_CAL_COMMON_TX_CHANNEL_MASK, + (uint8_t)(antCalCarrierCfgInit->commonTxMask)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while write common Tx channel mask."); + goto cleanup; + } + + + for (i = 0U; i < ADI_ADRV904X_MAX_RX_ONLY; i++) + { + if ((antCalCarrierCfgInit->commonRxMask & (1U << i)) == 0U) + { + recoveryAction = adrv904x_StreamprocChannel_MaskChAntRiseStreamToCore_BfSet(device, NULL, rxStreamProcChannelBaseAddr[i], 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, i, "Rx stream proc channel rise to core failure"); + goto cleanup; + } + + recoveryAction = adrv904x_StreamprocChannel_MaskChAntFallStreamToCore_BfSet(device, NULL, rxStreamProcChannelBaseAddr[i], 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, i, "Rx stream proc channel fall to core failure"); + goto cleanup; + } + } + + } + + for (i = 0U; i < ADI_ADRV904X_MAX_TXCHANNELS; i++) + { + if ((antCalCarrierCfgInit->commonTxMask & (1U << i)) == 0U) + { + recoveryAction = adrv904x_StreamprocChannel_MaskChAntRiseStreamToCore_BfSet(device, NULL, txStreamProcChannelBaseAddr[i], 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, i, "Tx stream proc channel rise to core failure"); + goto cleanup; + } + + recoveryAction = adrv904x_StreamprocChannel_MaskChAntFallStreamToCore_BfSet(device, NULL, txStreamProcChannelBaseAddr[i], 0x1U); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, i, "Tx stream proc channel fall to core failure"); + goto cleanup; + } + } + } + + /* Trigger stream */ + recoveryAction = adrv904x_StreamTrigger(device, ADRV904X_STREAM_ANT_CAL_UPDATE_SLICE_SCRATCHPAD_REG); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while triggering Core Stream to update the Rx/Tx channel mask"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalCarrierCfgSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RadioCtrlAntCalCarrierCfg_t* const antCalCarrierCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, antCalCarrierCfg, cleanup); + + recoveryAction = adi_adrv904x_RadioCtrlAntCalCarrierConfigSet(device, antCalCarrierCfg, 0, ADI_FALSE); /* parameter validation is done in this helper function */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting Radio Control Antenna Calibration Carrier Configuration."); + return recoveryAction; + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalCarrierCfgSet_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RadioCtrlAntCalCarrierCfg_t* const antCalCarrierCfg, + uint32_t postCalPatternId) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, antCalCarrierCfg, cleanup); + if ((postCalPatternId >= device->devStateInfo.rsImageHeader.numberPatterns) || (postCalPatternId >= ADI_ADRV904X_RADIO_SEQ_LOOKUP_TAB_MAX_SIZE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + postCalPatternId, + "Invalid input postCalPatternId. \n"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_RadioCtrlAntCalCarrierConfigSet(device, antCalCarrierCfg, postCalPatternId, ADI_TRUE); /* parameter validation is done in this helper function */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting Radio Control Antenna Calibration Carrier Configuration."); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalCarrierCfgGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_RadioCtrlAntCalCarrierCfg_t* const antCalCarrierCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t i = 0U; + uint8_t value = 0U; + int32_t carrierGain = 0; + uint32_t carrierGainReg = 0U; + const uint32_t DIG_GAIN_MULT = 65536U; + uint32_t extendedCoreScratchRegBaseAddress = 0U; + uint32_t tempAddress = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, antCalCarrierCfg, cleanup); + + ADI_LIBRARY_MEMSET(antCalCarrierCfg, 0, sizeof(adi_adrv904x_RadioCtrlAntCalCarrierCfg_t)); + + /* Read pattern ID from scratch reg */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (uint16_t)ADRV904X_ANTENNA_CAL_PATTERN_ID_TO_SWITCH_BYTE_0, + &value); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while read patternId"); + goto cleanup; + } + + antCalCarrierCfg->patternId = (uint32_t)value; + + /* Read GPIO number from scratch reg */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (uint16_t)ADRV904X_ANTENNA_CAL_NUMBER_OF_GPIO_TO_SWITCH_CARRIER, + &(antCalCarrierCfg->numOfGpioToSwitchCarrier)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while read numOfGpioToSwitchCarrier"); + goto cleanup; + } + + /* Read carrier table from scratch reg*/ + for (i = 0U; i < ADI_ADRV904X_CARRIER_TABLE_COUNT; i++) + { + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (uint16_t)(ADRV904X_ANTENNA_CAL_CARRIER_GAIN_TABLE_BYTE_0 + i), + &(antCalCarrierCfg->carrierTable[i])); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, i, "Error while read carrierTable"); + goto cleanup; + } + } + + /* Read first pattern number from scratch reg */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (uint16_t)ADRV904X_ANTENNA_CAL_FIRST_PATTERN_NUMBER_OF_LOOPS, + &(antCalCarrierCfg->firstPatternNumberOfLoops)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while read firstPatternNumberOfLoops"); + goto cleanup; + } + + /* Increment the value to match the decrement done by the set function */ + antCalCarrierCfg->firstPatternNumberOfLoops += 1; + + /* Read second pattern number from scratch reg */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (uint16_t)ADRV904X_ANTENNA_CAL_SECOND_PATTERN_NUMBER_OF_LOOPS, + &(antCalCarrierCfg->secondPatternNumberOfLoops)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while read secondPatternNumberOfLoops"); + goto cleanup; + } + + /* Increment the value to match the decrement done by the set function */ + antCalCarrierCfg->secondPatternNumberOfLoops += 1; + + /* Read the base address for extended core scratch registers located in M4 heap*/ + recoveryAction = adi_adrv904x_Register32Read(device, NULL, ADRV904X_PM_CORE_SCRATCH_EXT_PTR, &extendedCoreScratchRegBaseAddress, 0xFFFFFFFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading extended core stream scratch base addr"); + goto cleanup; + } + + for (i = 0U; i < ADI_ADRV904X_MAX_RX_CARRIERS; i++) + { + carrierGainReg = 0U; + tempAddress = extendedCoreScratchRegBaseAddress + 4U * (ADRV904X_ANTENNA_CAL_RX_CARRIER_0_GAIN + i); + recoveryAction = adi_adrv904x_Register32Read(device, NULL, tempAddress, &carrierGainReg, 0xFFFFFFFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading Rx carrier gain byte."); + goto cleanup; + } + + /* Mask first 23 bits of register */ + carrierGainReg &= 0x3FFFFF; + if (carrierGainReg != 0U) + { + /* Convert from 7.16 to mdB. value in mdB = (1000*20*log10(reg value/2^16)) */ + //carrierGain = (int32_t)(1000U * 20U * (double)log10((double)carrierGainReg / DIG_GAIN_MULT)); + carrierGain = (int32_t)(20 * log10((100000UL * (double)carrierGainReg) / DIG_GAIN_MULT) - 100); + } + + antCalCarrierCfg->rxCarrierGainForAntCal[i] = carrierGain; + } + + + for (i = 0U; i < ADI_ADRV904X_MAX_TX_CARRIERS; i++) + { + carrierGainReg = 0U; + tempAddress = extendedCoreScratchRegBaseAddress + 4U * (ADRV904X_ANTENNA_CAL_TX_CARRIER_0_GAIN + i); + recoveryAction = adi_adrv904x_Register32Read(device, NULL, tempAddress, &carrierGainReg, 0xFFFFFFFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading Tx carrier gain byte."); + goto cleanup; + } + + /* Mask first 23 bits of register */ + carrierGainReg &= 0x3FFFFF; + + if (carrierGainReg != 0) + { + /* Convert from 7.16 to mdB. value in mdB = (1000*20*log10(reg value/2^16)) */ + carrierGain = (int32_t)(1000U * 20U * (double)log10((double)carrierGainReg / DIG_GAIN_MULT)); + } + + antCalCarrierCfg->txCarrierGainForAntCal[i] = carrierGain; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalCarrierGainCountersClear(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Clear GPIO counter */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (uint16_t)ADRV904X_ANTENNA_CAL_GPIO_RISING_EDGE_COUNTER, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while write antenna cal GPIO counter"); + goto cleanup; + } + + /* Clear gain table index */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (uint16_t)ADRV904X_ANTENNA_CAL_CARRIER_GAIN_TABLE_INDEX, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while write gain table index"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalCarrierGainCountersGet(adi_adrv904x_Device_t* const device, + uint8_t* const antCalGpioCounter, + uint8_t* const antCalCarrierTableIndex) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, antCalGpioCounter, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, antCalCarrierTableIndex, cleanup); + + /* Read GPIO counter from scratch reg */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (uint16_t)ADRV904X_ANTENNA_CAL_GPIO_RISING_EDGE_COUNTER, + antCalGpioCounter); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while read antenna cal GPIO counter"); + goto cleanup; + } + + /* Read gain table index from scratch reg */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (uint16_t)ADRV904X_ANTENNA_CAL_CARRIER_GAIN_TABLE_INDEX, + antCalCarrierTableIndex); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while read gain table index"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCtrlTxToOrxMappingConfigGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DfeCtrlTxToOrxMappingConfig_t * const mappingConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_TxToOrxMappingMode_e lclMode = device->devStateInfo.dfeCtrlTxToOrxMappingConfig.mode; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common) ; + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, mappingConfig, cleanup); + + /* Check that Mapping Mode DFE CTRL. Otherwise throw an error */ + if (lclMode != ADI_ADRV904X_TX_ORX_MAPPING_MODE_DFE_CTRL) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + lclMode, + "Device Tx to Orx Mapping Mode is for a RCI mode. This function can only be used to readback a DFE Ctrl Mode mapping configuration. It cannot be used to readback a RCI mapping configuration."); + goto cleanup; + } + + /* Grab configuration stored in the device handle*/ + ADI_LIBRARY_MEMCPY(mappingConfig, &device->devStateInfo.dfeCtrlTxToOrxMappingConfig, sizeof(adi_adrv904x_DfeCtrlTxToOrxMappingConfig_t)); + + /*Success*/ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCtrlTxToOrxMappingSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e orxChannel, + const adi_adrv904x_TxChannels_e txChannel) + +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + recoveryAction = adrv904x_DfeCtrlTxToOrxMappingBaseSet(device, orxChannel, txChannel, 0U, ADI_ADRV904X_DFE_VSWR_FWD); + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while applying mapping."); + goto cleanup; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCtrlTxToOrxMappingAndVswrDirSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e orxChannel, + const adi_adrv904x_TxChannels_e txChannel, + const adi_adrv904x_DfeVswrDirection_e vswrDirection) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + recoveryAction = adrv904x_DfeCtrlTxToOrxMappingBaseSet(device, orxChannel, txChannel, 1U, vswrDirection); + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while applying mapping,and VSWR direction."); + goto cleanup; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfeCtrlTxToOrxMappingTxOffLevelsSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e orxChannel, + const uint8_t txOffGpioLevels) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_TxToOrxMappingMode_e lclMode = device->devStateInfo.dfeCtrlTxToOrxMappingConfig.mode; + uint16_t channelId = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Check that Mapping Mode DFE CTRL. Otherwise throw an error */ + if (lclMode != ADI_ADRV904X_TX_ORX_MAPPING_MODE_DFE_CTRL) + { + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + lclMode, + "Device Tx to Orx Mapping Mode is a RCI mode. This function can only be used for DFE Control mode."); + goto cleanup; + } + + /* Range check txOffGpioLevels */ + if ((txOffGpioLevels & 0x3F) != txOffGpioLevels) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txOffGpioLevels, + "txOffGpioLevels is invalid. Must select a 6bit value.") ; + goto cleanup; + } + + if (orxChannel == ADI_ADRV904X_ORX0) + { + channelId = ADRV904X_CPU_TX_ORX_MAPPING_PIN_STATE_ORX0_ALL_OFF; + } + else if (orxChannel == ADI_ADRV904X_ORX1) + { + channelId = ADRV904X_CPU_TX_ORX_MAPPING_PIN_STATE_ORX1_ALL_OFF; + } + else + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + orxChannel, + "ORx Channel selected is invalid. Must select ORx0-1."); + goto cleanup; + } + + /* Update the requested state to scratch regs */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e)ADRV904X_BF_CORE_ADDR, + channelId, + txOffGpioLevels); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while setting Tx to ORx mapping selection."); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalOutGpioCfgGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_StreamGpioAntCalOutCfg_t* const pCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pCfg, cleanup); + + /* Memcpy stored cfg structure from device handle directly to return struct */ + ADI_LIBRARY_MEMCPY(pCfg, &device->devStateInfo.streamGpioAntCalOutCfg, sizeof(adi_adrv904x_StreamGpioAntCalOutCfg_t)); + + /*Success*/ + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalOutGpioLevelSet(adi_adrv904x_Device_t* const device, + const uint32_t drive) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bitIdx = 0U; + uint32_t bitVal = 0U; + uint32_t gpioIdx = 0U; + uint32_t tmpBit = 0U; + uint32_t digSet = 0U; + uint32_t digClr = 0U; + uint32_t anaSet = 0U; + uint32_t anaClr = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Range check drive value */ + if (drive > (1u << ADI_ADRV904X_MAX_STREAM_GPIO_ANTENNA_CAL_OUT_PINS) - 1u) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, recoveryAction, drive, "Invalid drive value. Valid range is 0-255"); + goto cleanup; + } + + /* Build up set/clr values to apply: Digital and Analog */ + for (bitIdx = 0U; bitIdx < ADI_ADRV904X_MAX_STREAM_GPIO_ANTENNA_CAL_OUT_PINS; bitIdx++) + { + /* Determine bitVal for this bitIdx */ + bitVal = (drive >> bitIdx) & 0x1; + + if ((device->devStateInfo.streamGpioAntCalOutCfg.gpioSelect[bitIdx] >= ADI_ADRV904X_GPIO_GENERIC_DIG_START) && + (device->devStateInfo.streamGpioAntCalOutCfg.gpioSelect[bitIdx] <= ADI_ADRV904X_GPIO_GENERIC_DIG_END)) + { + /* Digital pin was selected for this bitIdx. */ + gpioIdx = (uint32_t)device->devStateInfo.streamGpioAntCalOutCfg.gpioSelect[bitIdx] - ADI_ADRV904X_GPIO_GENERIC_DIG_START; + tmpBit = (1 << gpioIdx); + + /* OR in tmpBit to the set or clr value */ + if (bitVal == 1) + { + digSet |= tmpBit; + } + else + { + digClr |= tmpBit; + } + } + else if ((device->devStateInfo.streamGpioAntCalOutCfg.gpioSelect[bitIdx] >= ADI_ADRV904X_GPIO_GENERIC_ANA_START) && + (device->devStateInfo.streamGpioAntCalOutCfg.gpioSelect[bitIdx] <= ADI_ADRV904X_GPIO_GENERIC_ANA_END)) + { + /* Analog pin was selected for this bitIdx. */ + gpioIdx = (uint32_t)device->devStateInfo.streamGpioAntCalOutCfg.gpioSelect[bitIdx] - ADI_ADRV904X_GPIO_GENERIC_ANA_START; + tmpBit = (1 << gpioIdx); + + /* OR in tmpBit to the set or clr value */ + if (bitVal == 1) + { + anaSet |= tmpBit; + } + else + { + anaClr |= tmpBit; + } + } + + } + + /* Digital SET */ + recoveryAction = adrv904x_Core_GpioFromMasterSet_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) 0U, + digSet); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Digital GPIO Set issue"); + goto cleanup; + } + + /* Digital CLR */ + recoveryAction = adrv904x_Core_GpioFromMasterClear_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) 0U, + digClr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Digital GPIO Clr issue"); + goto cleanup; + } + + /* Analog SET */ + recoveryAction = adrv904x_Core_GpioAnalogFromMasterSet_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) 0U, + (uint16_t)anaSet); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Analog GPIO Set issue"); + goto cleanup; + } + + /* Analog CLR */ + recoveryAction = adrv904x_Core_GpioAnalogFromMasterClear_BfSet(device, + NULL, + (adrv904x_BfCoreChanAddr_e) 0U, + (uint16_t)anaClr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Analog GPIO Clr issue"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalGpioTruthTableSet(adi_adrv904x_Device_t* const device, + uint8_t tableSelection) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + if(tableSelection > 1) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "tableSelection can only be 0 or 1"); + goto cleanup; + } + + /* Update scratch reg that switch GPIO true table selection */ + recoveryAction = adrv904x_Core_ScratchReg_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_ANTENNA_CAL_GPIO_TRUTH_TABLE_SEL, + tableSelection); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "adrv904x_Core_ScratchReg_BfSet(): Error"); + goto cleanup; + } + + /* Trigger stream */ + if(tableSelection == 0) + { + recoveryAction = adrv904x_StreamTrigger(device, ADRV904X_STREAM_ID__CORE__ANT_CAL_SET_OUTPUT_GPIO_MAIN_PATH_NORMAL_OPERATION); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while triggering Core Stream to update the GPIO true table"); + goto cleanup; + } + } + + if(tableSelection == 1) + { + recoveryAction = adrv904x_StreamTrigger(device, ADRV904X_STREAM_ID__CORE__ANT_CAL_SET_OUTPUT_GPIO_SECONDARY_PATH_NORMAL_OPERATION); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while triggering Core Stream to update the GPIO true table"); + goto cleanup; + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioCtrlAntCalGpioTruthTableGet(adi_adrv904x_Device_t* const device, + uint8_t* pTableSelection) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(pTableSelection); + + /* Read scratch reg that stores GPIO true table selection */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_ANTENNA_CAL_GPIO_TRUTH_TABLE_SEL, + pTableSelection); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, + recoveryAction, + "Error while getting GPIO true table selection"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_rx.c b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_rx.c new file mode 100644 index 00000000000..ca2dd56ea3d --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_rx.c @@ -0,0 +1,5364 @@ +/** +* Copyright 2015 - 2023 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_rx.c +* \brief Contains Rx features related function implementation defined in +* adi_adrv904x_rx.h +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#include "adi_adrv904x_rx.h" +#include "adi_adrv904x_cpu.h" +#include "adi_adrv904x_hal.h" +#include "adi_adrv904x_radioctrl.h" + +#include "../../private/include/adrv904x_rx.h" +#include "../../private/include/adrv904x_tx.h" +#include "../../private/include/adrv904x_gpio.h" +#include "../../private/bf/adrv904x_bf_rx_funcs.h" +#include "../../private/bf/adrv904x_bf_rx_ddc.h" +#include "../../private/bf/adrv904x_bf_rx_dig.h" +#include "../../private/bf/adrv904x_bf_orx_dig.h" +#include "../../private/include/adrv904x_cpu.h" +#include "../../private/include/adrv904x_reg_addr_macros.h" + +#include "../../private/bf/adrv904x_bf_cddc_funcs.h" +#include "../../private/bf/adrv904x_bf_cddc_hb_dpath.h" +#include "../../private/include/adrv904x_carrier_reconfigure.h" +#include "../../private/include/adrv904x_dfe_cpu.h" +#include "../../private/include/adrv904x_dfe_svc_cmd_t.h" +#include "../../private/include/adrv904x_dfe_svc_cmd_dfe_pwr_mtr_t.h" + + +#define ADI_FILE ADI_ADRV904X_FILE_PUBLIC_RX + +#define ADI_ADRV904X_NUM_GPIOS_IN_RX_GAIN_CTRL_PIN_FEATURE 2U +#define ADI_ADRV904X_NUM_GPIOS_IN_RX_EXT_CTRL_WORD_OUTPUT_FEATURE 8U +#define ADI_ADRV904X_NUM_GPIOS_IN_RX_DUALBAND_CTRL_WORD_OUTPUT_FEATURE 8U +#define ADI_ADRV904X_NUM_BYTES_PER_RX_GAIN_INDEX 8U +#define MAX_ORX_CHANNEL_ID 1U +#define ADC_TEST_GEN_SEL_BYBASS 0x0U +#define ADC_TEST_GEN_SEL_SINE 0x3U +#define ADC_TEST_GEN_EN_SEL_SPI 0x1U +#define ADC_TEST_GEN_CLK_ADC 0x0U + + + +#define MAX_CDDC_NCO_FREQ_KHZ (8388607) /* 0x7FFFFF */ +#define MAX_CDDC_NCO_PHASE_DEGREES (360) + +static const uint8_t MAX_ORX_CHANNEL_MASK = (1U << (MAX_ORX_CHANNEL_ID + 1U)) - 1U; + +/* Simple mapping from ORx channel id to corresponding OrxWest regmap addr */ +static const adrv904x_BfActrlOrxWestRegmapChanAddr_e chanIdToOrxWestRegmapChanAddr[] = +{ + ADRV904X_BF_SLICE_ORX_0__ORX_ANALOG_ADC_8B_VENUS_ACTRL_WEST_REGMAP, + ADRV904X_BF_SLICE_ORX_1__ORX_ANALOG_ADC_8B_VENUS_ACTRL_WEST_REGMAP +}; + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxGainTableWrite(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const uint8_t gainIndexOffset, + const adi_adrv904x_RxGainTableRow_t gainTableRow[], + const uint32_t arraySize) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t baseIndex = 0U; + uint32_t baseAddress[1] = { 0U }; + uint16_t numGainIndicesToWrite = arraySize; + /*Maximum Array Size = Max Gain Table Size x Bytes Per Gain Table Entry*/ + uint8_t cpuDmaData[((ADI_ADRV904X_MAX_GAIN_TABLE_INDEX - ADI_ADRV904X_MIN_GAIN_TABLE_INDEX) + 1U) * ADI_ADRV904X_NUM_BYTES_PER_RX_GAIN_INDEX] = { 0U }; + adrv904x_BfRxDdcChanAddr_e ddcBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_DDC_0_; + uint32_t chanId = 0U; + adi_adrv904x_SpiCache_t spiCache = { { 0U }, 0U, 0U, 0U }; + + const uint32_t rxGainTableBaseAddr[] = + { + ADI_ADRV904X_RX0_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX1_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX2_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX3_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX4_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX5_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX6_GAIN_TABLE_BASEADDR, + ADI_ADRV904X_RX7_GAIN_TABLE_BASEADDR + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gainTableRow, cleanup); + +#if ADI_ADRV904X_RX_RANGE_CHECK > 0 + recoveryAction = adrv904x_RxGainTableWriteRangeCheck(device, rxChannelMask, gainIndexOffset, gainTableRow, numGainIndicesToWrite); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxGainTableWriteRangeCheck Issue"); + goto cleanup; + } +#endif + + /*Calculate base index for the config*/ + baseIndex = (gainIndexOffset - (numGainIndicesToWrite - 1U)); + + /*Format Gain Table Entries*/ + recoveryAction = adrv904x_RxGainTableFormat(device, gainTableRow, &cpuDmaData[0U], numGainIndicesToWrite); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxGainTableFormat Issue"); + goto cleanup; + } + + /*Resolve the RX Channel SRAM to program*/ + /*If Rx Channel Mask Set by user for this config, load Rx gain table*/ + for (chanId = 0U; chanId < ADI_ADRV904X_MAX_RX_ONLY; ++chanId) + { + adi_adrv904x_RxChannels_e rxChannel = (adi_adrv904x_RxChannels_e) (rxChannelMask & (1U << chanId)); + if (rxChannel > 0U) + { + /*Resolve Rx1 Gain Table SRAM load start address*/ + baseAddress[0U] = rxGainTableBaseAddr[chanId] + (baseIndex * ADI_ADRV904X_NUM_BYTES_PER_RX_GAIN_INDEX); + + /*Write to the SRAM via ARM DMA*/ + recoveryAction = adi_adrv904x_Registers32bOnlyWrite(device, + &spiCache, + baseAddress[0U], + &cpuDmaData[0U], + (numGainIndicesToWrite * ADI_ADRV904X_NUM_BYTES_PER_RX_GAIN_INDEX)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Issue while writing gain table."); + goto cleanup; + } + recoveryAction = adrv904x_RxDdcBitfieldAddressGet(device, rxChannel, ADI_ADRV904X_RX_DDC_BAND0, &ddcBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read DDC address"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDdc_DigitalGainEnable_BfSet(device, &spiCache, ddcBaseAddr, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue while writing Gain Comp Config0 DDC0"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDdcBitfieldAddressGet(device, rxChannel, ADI_ADRV904X_RX_DDC_BAND1, &ddcBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read DDC address"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDdc_DigitalGainEnable_BfSet(device, &spiCache, ddcBaseAddr, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue while writing Gain Comp Config0 DDC1"); + goto cleanup; + } + } + } + + recoveryAction = adi_adrv904x_SpiFlush(device, spiCache.data, &spiCache.count); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Flush Issue After CPU Mailbox Buffer Write"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxGainTableRead(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + const uint8_t gainIndexOffset, + adi_adrv904x_RxGainTableRow_t gainTableRow[], + const uint32_t arraySize, + uint16_t* const numGainIndicesRead) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + uint32_t baseAddress = 0U; + uint32_t maxReadGainIndices = arraySize; + uint16_t numGainIndicesReadVal = 0U; + /*Maximum Array Size = Max Gain Table Size x Bytes Per Gain Table Entry*/ + uint8_t cpuAhbData[((ADI_ADRV904X_MAX_GAIN_TABLE_INDEX - ADI_ADRV904X_MIN_GAIN_TABLE_INDEX) + 1U) * ADI_ADRV904X_NUM_BYTES_PER_RX_GAIN_INDEX]; + + ADI_LIBRARY_MEMSET(&cpuAhbData, 0, sizeof(cpuAhbData)); + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gainTableRow, cleanup); + +#if ADI_ADRV904X_RX_RANGE_CHECK > 0 + recoveryAction = adrv904x_RxGainTableReadRangeCheck(device, + rxChannel, + gainIndexOffset, + gainTableRow, + maxReadGainIndices); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxGainTableReadRangeCheck Issue"); + goto cleanup; + } +#endif + + /*Calculate no. of indices to read and the base address for the config*/ + recoveryAction = adrv904x_RxGainTableReadParamsCompute( device, + rxChannel, + maxReadGainIndices, + gainIndexOffset, + &numGainIndicesReadVal, + &baseAddress); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxGainTableReadParamsCompute Issue"); + goto cleanup; + } + + /*Read Gain Table Data for the requested channel via ARM DMA*/ + recoveryAction = adi_adrv904x_Registers32bOnlyRead(device, + NULL, + baseAddress, + &cpuAhbData[0U], + (numGainIndicesReadVal * ADI_ADRV904X_NUM_BYTES_PER_RX_GAIN_INDEX)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error Reading Gain Table ARM DMA"); + goto cleanup; + } + + /*Parse gain table data obtained in ARM DMA data format to an rx gain table row entry data structure memory*/ + recoveryAction = adrv904x_RxGainTableParse(device, &gainTableRow[0U], &cpuAhbData[0], numGainIndicesReadVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxGainTableParse Issue"); + goto cleanup; + } + + /*Update no. of gain indices read*/ + if (numGainIndicesRead != NULL) + { + *numGainIndicesRead = numGainIndicesReadVal; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxGainTableExtCtrlPinsSet(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const uint32_t channelEnable) +{ + #define NUM_GPIO_PER_CHANNEL 2U + + static const adi_adrv904x_GpioAnaPinSel_e gpioLut[ADI_ADRV904X_MAX_RX_ONLY][NUM_GPIO_PER_CHANNEL] = { + { ADI_ADRV904X_GPIO_ANA_00, ADI_ADRV904X_GPIO_ANA_01 }, + { ADI_ADRV904X_GPIO_ANA_02, ADI_ADRV904X_GPIO_ANA_03 }, + { ADI_ADRV904X_GPIO_ANA_04, ADI_ADRV904X_GPIO_ANA_05 }, + { ADI_ADRV904X_GPIO_ANA_06, ADI_ADRV904X_GPIO_ANA_07 }, + { ADI_ADRV904X_GPIO_ANA_08, ADI_ADRV904X_GPIO_ANA_09 }, + { ADI_ADRV904X_GPIO_ANA_10, ADI_ADRV904X_GPIO_ANA_11 }, + { ADI_ADRV904X_GPIO_ANA_12, ADI_ADRV904X_GPIO_ANA_13 }, + { ADI_ADRV904X_GPIO_ANA_14, ADI_ADRV904X_GPIO_ANA_15 } + }; + + static const adi_adrv904x_GpioSignal_e sigLut[ADI_ADRV904X_MAX_RX_ONLY][NUM_GPIO_PER_CHANNEL] = { + { ADI_ADRV904X_GPIO_SIGNAL_RX0_EXT_CONTROL_0, ADI_ADRV904X_GPIO_SIGNAL_RX0_EXT_CONTROL_1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX1_EXT_CONTROL_0, ADI_ADRV904X_GPIO_SIGNAL_RX1_EXT_CONTROL_1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX2_EXT_CONTROL_0, ADI_ADRV904X_GPIO_SIGNAL_RX2_EXT_CONTROL_1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX3_EXT_CONTROL_0, ADI_ADRV904X_GPIO_SIGNAL_RX3_EXT_CONTROL_1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX4_EXT_CONTROL_0, ADI_ADRV904X_GPIO_SIGNAL_RX4_EXT_CONTROL_1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX5_EXT_CONTROL_0, ADI_ADRV904X_GPIO_SIGNAL_RX5_EXT_CONTROL_1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX6_EXT_CONTROL_0, ADI_ADRV904X_GPIO_SIGNAL_RX6_EXT_CONTROL_1 }, + { ADI_ADRV904X_GPIO_SIGNAL_RX7_EXT_CONTROL_0, ADI_ADRV904X_GPIO_SIGNAL_RX7_EXT_CONTROL_1 } + }; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t currentChannelMask = 0U; + uint8_t chIdx = 0U; + uint8_t gpioIdx = 0U; + adi_adrv904x_GpioSignal_e getSig = ADI_ADRV904X_GPIO_SIGNAL_UNUSED; + uint32_t getChanMask = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + /*Check that rxChannelMask is valid*/ + if (rxChannelMask > (uint32_t)( ADI_ADRV904X_RX0 | ADI_ADRV904X_RX1 | ADI_ADRV904X_RX2 | ADI_ADRV904X_RX3 | + ADI_ADRV904X_RX4 | ADI_ADRV904X_RX5 | ADI_ADRV904X_RX6 | ADI_ADRV904X_RX7 )) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannelMask, + "Invalid Rx Channel mask parameter. Valid Rx channel masks include 0x0-0xff"); + goto cleanup; + } + + /*Check that channelEnable is Valid*/ + if (channelEnable > (uint32_t)( ADI_ADRV904X_RX0 | ADI_ADRV904X_RX1 | ADI_ADRV904X_RX2 | ADI_ADRV904X_RX3 | + ADI_ADRV904X_RX4 | ADI_ADRV904X_RX5 | ADI_ADRV904X_RX6 | ADI_ADRV904X_RX7 )) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + channelEnable, + "Invalid channelEnable mask parameter. Valid Enable Channel bitmasks 0x0-0xff"); + goto cleanup; + } + + /* If no channels were selected, this is an allowed noop */ + if (rxChannelMask == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + else + { + + /*Iterate through rxChannelMask, enabling/disabling selected channels*/ + for (chIdx = 0U; chIdx < ADI_ADRV904X_MAX_RX_ONLY; chIdx++) + { + /* Update currentChannelMask enum var for this chIdx */ + currentChannelMask = (adi_adrv904x_RxChannels_e)(1U << chIdx); + + /*Check if this channel should be affected*/ + if ((currentChannelMask & rxChannelMask) != 0U) + { + + /* Enable Analog GPIOs for this channel */ + if ((currentChannelMask & channelEnable) != 0U) + { + for (gpioIdx = 0U; gpioIdx < NUM_GPIO_PER_CHANNEL; gpioIdx++) + { + /*Route signals for this channel to Analog GPIOs*/ + recoveryAction = adrv904x_GpioAnalogSignalSet( device, + gpioLut[chIdx][gpioIdx], + sigLut[chIdx][gpioIdx], + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioAnalogSignalSet Issue"); + goto cleanup; + } + } /* end of gpioIdx for loop */ + + } /* end Enable block */ + /* Disable Analog GPIOs for this channel */ + else + { + + for (gpioIdx = 0U; gpioIdx < NUM_GPIO_PER_CHANNEL; gpioIdx++) + { + /* Check if the GPIO has the associated Signal routed. */ + recoveryAction = adrv904x_GpioAnalogSignalGet( device, + gpioLut[chIdx][gpioIdx], + &getSig, + &getChanMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioAnalogSignalGet Issue"); + goto cleanup; + } + + /* If the expected signal is currently routed, release/disconnect the pin */ + if (getSig == sigLut[chIdx][gpioIdx]) + { + recoveryAction = adrv904x_GpioAnalogSignalRelease( device, + gpioLut[chIdx][gpioIdx], + sigLut[chIdx][gpioIdx], + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GpioAnalogSignalRelease Issue"); + goto cleanup; + } + } + + } /* end of gpioIdx for loop */ + + } /* end Disable block */ + + } /* End if channel-affected block */ + + } /* end rxChannel for loop */ + + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxMinMaxGainIndexSet(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const uint8_t minGainIndex, + const uint8_t maxGainIndex) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + +#if ADI_ADRV904X_RX_RANGE_CHECK > 0 + recoveryAction = adrv904x_RxMinMaxGainIndexSetRangeCheck(device, rxChannelMask, minGainIndex, maxGainIndex); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxMinMaxGainIndexSetRangeCheck Issue"); + goto cleanup; + } +#endif + + /*Update device gain table min and max gain indices*/ + if ((rxChannelMask & (uint32_t)ADI_ADRV904X_RX0) == (uint32_t)ADI_ADRV904X_RX0) + { + device->devStateInfo.gainIndexes.rx0MaxGainIndex = maxGainIndex; + device->devStateInfo.gainIndexes.rx0MinGainIndex = minGainIndex; + } + + if ((rxChannelMask & (uint32_t)ADI_ADRV904X_RX1) == (uint32_t)ADI_ADRV904X_RX1) + { + device->devStateInfo.gainIndexes.rx1MaxGainIndex = maxGainIndex; + device->devStateInfo.gainIndexes.rx1MinGainIndex = minGainIndex; + } + + if ((rxChannelMask & (uint32_t)ADI_ADRV904X_RX2) == (uint32_t)ADI_ADRV904X_RX2) + { + device->devStateInfo.gainIndexes.rx2MaxGainIndex = maxGainIndex; + device->devStateInfo.gainIndexes.rx2MinGainIndex = minGainIndex; + } + + if ((rxChannelMask & (uint32_t)ADI_ADRV904X_RX3) == (uint32_t)ADI_ADRV904X_RX3) + { + device->devStateInfo.gainIndexes.rx3MaxGainIndex = maxGainIndex; + device->devStateInfo.gainIndexes.rx3MinGainIndex = minGainIndex; + } + + if ((rxChannelMask & (uint32_t)ADI_ADRV904X_RX4) == (uint32_t)ADI_ADRV904X_RX4) + { + device->devStateInfo.gainIndexes.rx4MaxGainIndex = maxGainIndex; + device->devStateInfo.gainIndexes.rx4MinGainIndex = minGainIndex; + } + + if ((rxChannelMask & (uint32_t)ADI_ADRV904X_RX5) == (uint32_t)ADI_ADRV904X_RX5) + { + device->devStateInfo.gainIndexes.rx5MaxGainIndex = maxGainIndex; + device->devStateInfo.gainIndexes.rx5MinGainIndex = minGainIndex; + } + + if ((rxChannelMask & (uint32_t)ADI_ADRV904X_RX6) == (uint32_t)ADI_ADRV904X_RX6) + { + device->devStateInfo.gainIndexes.rx6MaxGainIndex = maxGainIndex; + device->devStateInfo.gainIndexes.rx6MinGainIndex = minGainIndex; + } + + if ((rxChannelMask & (uint32_t)ADI_ADRV904X_RX7) == (uint32_t)ADI_ADRV904X_RX7) + { + device->devStateInfo.gainIndexes.rx7MaxGainIndex = maxGainIndex; + device->devStateInfo.gainIndexes.rx7MinGainIndex = minGainIndex; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + goto cleanup; /* Added to deal with Compiler Warning when ADI_ADRV904X_RX_RANGE_CHECK = 0 */ + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxGainSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxGain_t rxGain[], + const uint32_t arraySize) +{ + static const uint32_t RX0_FUNC_ADDR_BASE = 0x60030050U; + static const uint8_t DATA_TRANSACTION_1_SIZE = 18U; + static const uint8_t DATA_TRANSACTION_2_SIZE = 6U; + + uint32_t configIndex = 0U; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + + /* Used to track whether its our first write or not, used to limit number of spi bytes being transmitted */ + uint8_t firstWrite = 0U; + + uint8_t rxFuncFirstByte = (uint8_t)(RX0_FUNC_ADDR_BASE >> 24U); + uint8_t rxFuncSecondByte = 0x00U; + uint8_t rxFuncThirdByte = 0x00U; + uint8_t rxFuncLastByte = (uint8_t)(RX0_FUNC_ADDR_BASE & 0xFFU); + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_hal_Err_e halError = ADI_HAL_ERR_PARAM; + + /* Hardcoded 18 byte data array for first spi transaction with placeholders for addresses and data + dataPageSetup[0] : 0x01U msb of paging register (ADRV904X_ADDR_SPI0_PAGE_31TO24) address + dataPageSetup[1] : 0x26U lsb of paging register (ADRV904X_ADDR_SPI0_PAGE_31TO24) address + dataPageSetup[2] : 0x60U first byte of slice register address + dataPageSetup[3] : 0x01U msb of paging register (ADRV904X_ADDR_SPI0_PAGE_23TO16) address + dataPageSetup[4] : 0x27U lsb of paging register (ADRV904X_ADDR_SPI0_PAGE_23TO16) address + dataPageSetup[5] : 0x00U PLACEHOLDER - Next byte of slice register address + dataPageSetup[6] : 0x01U msb of paging register (ADRV904X_ADDR_SPI0_PAGE_15TO8) address + dataPageSetup[7] : 0x28U lsb of paging register (ADRV904X_ADDR_SPI0_PAGE_15TO8) address + dataPageSetup[8] : 0x00U Next byte of slice register address + dataPageSetup[9] : 0x01U msb of paging register (ADRV904X_ADDR_SPI0_PAGE_7TO0) address + dataPageSetup[10] : 0x29U lsb of paging register (ADRV904X_ADDR_SPI0_PAGE_7TO0) address + dataPageSetup[11] : 0x50U Next byte of slice register address + dataPageSetup[12] : 0x01U msb of paging register (ADRV904X_ADDR_SPI0_PAGING_CONTROL) address + dataPageSetup[13] : 0x2AU lsb of paging register (ADRV904X_ADDR_SPI0_PAGING_CONTROL) address + dataPageSetup[14] : 0x00U Data to write to paging congtrol register + dataPageSetup[15] : 0x40U msb of calculated address depending on paging config and spi write polarity + dataPageSetup[16] : 0x01U lsb of calculated address depending on paging config and spi write polarity + dataPageSetup[17] : 0x00U PLACEHOLDER - will be replaced with gain index value for that given slice + */ + uint8_t dataPageSetup[] = { 0x01U, 0x26U, rxFuncFirstByte, 0x01U, 0x27U, rxFuncSecondByte, 0x01U, 0x28U, rxFuncThirdByte, 0x01U, 0x29U, rxFuncLastByte, 0x01U, 0x2aU, 0x00U, 0x40U, 0x01U, 0x00U}; + + /* Hardcoded 6 byte data array for every subsequent spi transaction + data[0] : 0x01U msb of paging register (ADRV904X_ADDR_SPI0_PAGE_31TO24) address + data[1] : 0x27U lsb of paging register (ADRV904X_ADDR_SPI0_PAGE_31TO24) address + data[2] : 0x00U PLACEHOLDER - Byte of slice register address which can be calculated based on which channel you are dealing with + data[3] : 0x40U msb of calculated address depending on paging config and spi write polarity + data[4] : 0x01U lsb of calculated address depending on paging config and spi write polarity + data[5] : 0x00U PLACEHOLDER - will be replaced with gain index value for that given slice + */ + uint8_t data[] = { 0x01U, 0x27U, 0x00U, 0x40U, 0x01U, 0x00U }; + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + +#if ADI_ADRV904X_RX_RANGE_CHECK > 0U + recoveryAction = adrv904x_RxGainSetRangeCheck(device, rxGain, arraySize); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxGainSetRangeCheck Issue"); + goto cleanup; + } +#endif + + /*Update manual gain index setting for the requested channel */ + for (configIndex = 0U; configIndex < arraySize; ++configIndex) + { + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_RX_ONLY; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(rxGain[configIndex].rxChannelMask, chanSel)) + { + /* calculate part of address related to given channel id */ + rxFuncSecondByte = (uint8_t)(3U + (chanIdx << 4U)); + device->devStateInfo.currentPageStartingAddress = (uint32_t)((rxFuncFirstByte << 24) + (rxFuncSecondByte << 16) + (rxFuncThirdByte << 8) + rxFuncLastByte); + /* check if its the first time we've called this function so we can setup the paging registers */ + if (firstWrite == 0U) + { + dataPageSetup[5U] = rxFuncSecondByte; + dataPageSetup[17U] = rxGain[configIndex].gainIndex; + halError = adi_hal_SpiWrite(device->common.devHalInfo, dataPageSetup, DATA_TRANSACTION_1_SIZE); + if (halError != ADI_HAL_ERR_OK) + { + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_ErrCodeConvert(halError); + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dataPageSetup, + "Error writing rx gain value"); + goto cleanup; + } + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + /* update first write to signify we have wrote the data at least once and paging registers are configured correctly */ + firstWrite = 1U; + } + else + { + /* update data array to point to correct slice and with correct gain index for given configIndex */ + data[2U] = rxFuncSecondByte; + data[5U] = rxGain[configIndex].gainIndex; + halError = adi_hal_SpiWrite(device->common.devHalInfo, data, DATA_TRANSACTION_2_SIZE); + if (halError != ADI_HAL_ERR_OK) + { + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_ErrCodeConvert(halError); + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + data, + "Error writing rx gain value"); + goto cleanup; + } + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + } + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxMgcGainGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_RxGain_t * const rxGain) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxFuncsChanAddr_e rxFuncsBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_FUNCS; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + +#if ADI_ADRV904X_RX_RANGE_CHECK > 0 + recoveryAction = adrv904x_RxGainGetRangeCheck(device, rxChannel, rxGain); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxGainGetRangeCheck Issue"); + goto cleanup; + } +#endif + + /*Check for null rxGain pointer*/ + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxGain, cleanup); + + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet(device, rxChannel, &rxFuncsBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Invalid Rx Channel used to determine rx func address"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcManualGainIndex_BfGet(device, + NULL, + rxFuncsBaseAddr, + &rxGain->gainIndex); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to get Rx manual gain index for channel"); + goto cleanup; + } + + /* Set rxChannelMask to a valid Rx Channel */ + rxGain->rxChannelMask = (uint32_t)rxChannel; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxGainGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_RxGain_t * const rxGain) +{ + static const uint8_t LATCH_READBACK_DUMMY_DATA = 0xFFU; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxFuncsChanAddr_e rxFuncsBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_FUNCS; + uint8_t latchReadback = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + +#if ADI_ADRV904X_RX_RANGE_CHECK > 0 + recoveryAction = adrv904x_RxGainGetRangeCheck(device, rxChannel, rxGain); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxGainGetRangeCheck Issue"); + goto cleanup; + } +#endif + + /*Check for null rxGain pointer*/ + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxGain, cleanup); + + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet(device, + rxChannel, + &rxFuncsBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Rx funcs address get issue"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_AgcEnableGainIndexUpdate_BfGet(device, NULL, rxFuncsBaseAddr, &latchReadback); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading enable gain index update bit"); + goto cleanup; + } + + if (latchReadback == ADI_TRUE) + { + recoveryAction = adrv904x_RxFuncs_AgcGainIndex_BfSet(device, + NULL, + rxFuncsBaseAddr, + LATCH_READBACK_DUMMY_DATA); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing dummy data to latch gain index readback"); + goto cleanup; + } + } + + recoveryAction = adrv904x_RxFuncs_AgcGainIndex_BfGet(device, + NULL, + rxFuncsBaseAddr, + &rxGain->gainIndex); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading AGC gain index"); + goto cleanup; + } + + /* Set rxChannelMask to a valid Rx Channel */ + rxGain->rxChannelMask = (uint32_t)rxChannel; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxDataFormatGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_RxDataFormatRt_t * const rxDataFormat) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, rxDataFormat); + + /* Check if the requested rxChannel is valid Rx or ORx channel. */ + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7) && + (rxChannel != ADI_ADRV904X_ORX0) && + (rxChannel != ADI_ADRV904X_ORX1) ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "Invalid Rx Channel Requested for RxDataFormatGet"); + goto cleanup; + } + + /* Retrieve the format selection with adrv904x_RxDataFormatSelectGet */ + recoveryAction = adrv904x_RxDataFormatSelectGet(device, + rxChannel, + &rxDataFormat->rxDataFormat.formatSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error getting RxDataFormat formatSelect"); + goto cleanup; + } + + /* Retrieve the floating point format configuration with adrv904x_RxDataFormatFloatingPointGet */ + recoveryAction = adrv904x_RxDataFormatFloatingPointGet( device, + rxChannel, + &rxDataFormat->rxDataFormat.floatingPointConfig); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error getting RxDataFormat floatingPointConfig"); + goto cleanup; + } + + + /* Retrieve the integer format configuration with adrv904x_RxDataFormatIntegerGet */ + recoveryAction = adrv904x_RxDataFormatIntegerGet( device, + rxChannel, + &rxDataFormat->rxDataFormat.integerConfigSettings, + &rxDataFormat->rxDataFormat.slicerConfigSettings); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error getting RxDataFormat integerConfigSettings and slicerConfigSettings"); + goto cleanup; + } + + /* Retrieve the embedded overload indicator format configuration with adrv904x_RxDataFormatEmbOvldMonitorGet */ + recoveryAction = adrv904x_RxDataFormatEmbOvldMonitorGet( device, + rxChannel, + &rxDataFormat->rxDataFormat.embOvldMonitorSettings); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error getting RxDataFormat embOvldMonitorSettings"); + goto cleanup; + } + + /* Retrieve the external LNA gain compensation and gain temperature compensation with adrv904x_RxGainCompExtLnaGet and adrv904x_RxGainCompTempEnableGet */ + recoveryAction = adrv904x_RxGainCompExtLnaGet( device, + rxChannel, + &rxDataFormat->rxDataFormat.externalLnaGain); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error getting RxDataFormat externalLnaGain"); + goto cleanup; + } + + recoveryAction = adrv904x_RxGainCompTempEnableGet( device, + rxChannel, + &rxDataFormat->rxDataFormat.tempCompensationEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error getting RxDataFormat tempCompensationEnable"); + goto cleanup; + } + + /* Populate the rxChannelMask field of the output structure with the specified channel. */ + rxDataFormat->rxChannelMask = rxChannel; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CddcDataFormatSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CddcDataFormatRt_t cddcDataFormat[], + const uint32_t arraySize) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Null pointer checks */ + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cddcDataFormat, cleanup); + /* Range Check inputs */ +#if ADI_ADRV904X_RX_RANGE_CHECK > 0 + recoveryAction = adrv904x_CddcDataFormatSetRangeCheck(device, cddcDataFormat, arraySize); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "cddcDataFormat range check failure."); + goto cleanup; + } +#endif + + /* Iterate over arraySize elements of cddcDataFormat */ + for (uint32_t configIdx = 0U; configIdx < arraySize; configIdx++) + { + + switch (cddcDataFormat[configIdx].cddcDataFormat.cddcFormatSelect) + { + + /*If Floating Point mode selected, Configure floating point*/ + case ADI_ADRV904X_CDDC_FLOATING_POINT: + recoveryAction = adrv904x_CddcDataFormatFloatingPointSet(device, + cddcDataFormat[configIdx].rxChannelMask, + &cddcDataFormat[configIdx].cddcDataFormat.cddcFloatingPointConfig); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error setting CddcDataFormat cddcFloatingPointConfig"); + goto cleanup; + } + break; + + /* Integer and slicer config settings */ + case ADI_ADRV904X_CDDC_INTEGER: + recoveryAction = adrv904x_CddcDataFormatIntegerSet(device, + cddcDataFormat[configIdx].rxChannelMask, + cddcDataFormat[configIdx].cddcDataFormat.cddcFormatSelect, + &cddcDataFormat[configIdx].cddcDataFormat.cddcIntegerConfigSettings, + &cddcDataFormat[configIdx].cddcDataFormat.cddcSlicerConfigSettings); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error setting CddcDataFormat cddcIntegerConfigSettings and cddcSlicerConfigSettings"); + goto cleanup; + } + break; + + case ADI_ADRV904X_CDDC_SLICER: + recoveryAction = adrv904x_CddcDataFormatSlicerSet(device, + cddcDataFormat[configIdx].rxChannelMask, + &cddcDataFormat[configIdx].cddcDataFormat.cddcSlicerConfigSettings); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error setting CddcDataFormat cddcSlicerConfigSettings "); + goto cleanup; + } + break; + + case ADI_ADRV904X_CDDC_EMBED_OVERLOAD_MONITOR_DATA: /* Embedded overload indicator settings are currently not implemented */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + ADI_ADRV904X_API_NOT_IMPLEMENTED_REPORT_GOTO(&device->common, cleanup); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + ADI_ADRV904X_API_NOT_IMPLEMENTED_REPORT_GOTO(&device->common, cleanup); + break; + } + } +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CddcDataFormatGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_CddcDataFormatRt_t * const cddcDataFormat) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + /* Null pointer checks */ + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cddcDataFormat, cleanup); + + /* Check if the requested rxChannel is valid Rx or ORx channel. */ + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7) && + (rxChannel != ADI_ADRV904X_ORX0) && + (rxChannel != ADI_ADRV904X_ORX1) ) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChannel, + "Invalid Rx Channel Requested for CddcDataFormatGet"); + goto cleanup; + } + + /* Retrieve the format selection with adrv904x_CddcDataFormatSelectGet */ + recoveryAction = adrv904x_CddcDataFormatSelectGet(device, + rxChannel, + &cddcDataFormat->cddcDataFormat.cddcFormatSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error getting CddcDataFormat formatSelect"); + goto cleanup; + } + + /* Retrieve the floating point format configuration with adrv904x_CddcDataFormatFloatingPointGet */ + recoveryAction = adrv904x_CddcDataFormatFloatingPointGet(device, + rxChannel, + &cddcDataFormat->cddcDataFormat.cddcFloatingPointConfig); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error getting CddcDataFormat floatingPointConfig"); + goto cleanup; + } + + + /* Retrieve the integer format configuration with adrv904x_CddcDataFormatIntegerGet */ + recoveryAction = adrv904x_CddcDataFormatIntegerGet(device, + rxChannel, + &cddcDataFormat->cddcDataFormat.cddcIntegerConfigSettings, + &cddcDataFormat->cddcDataFormat.cddcSlicerConfigSettings); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error getting CddcDataFormat integerConfigSettings and slicerConfigSettings"); + goto cleanup; + } + + /* Retrieve the embedded overload indicator format configuration with adrv904x_CddcDataFormatEmbOvldMonitorGet */ + recoveryAction = adrv904x_CddcDataFormatEmbOvldMonitorGet(device, + rxChannel, + &cddcDataFormat->cddcDataFormat.cddcEmbOvldMonitorSettings); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error getting CddcDataFormat embOvldMonitorSettings"); + goto cleanup; + } + + /* Populate the rxChannelMask field of the output structure with the specified channel. */ + cddcDataFormat->rxChannelMask = rxChannel; +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxSlicerPositionGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + uint8_t* const slicerPosition) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxFuncsChanAddr_e rxFuncsChanAddr = ADRV904X_BF_SLICE_RX_0__RX_FUNCS; + + /* Null pointer checks */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, slicerPosition, cleanup); + + /* Check that the requested rxChannel is valid. ORx not allowed */ + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, recoveryAction, rxChannel, "Invalid Rx Channel Requested for reading slicer position"); + goto cleanup; + } + + /* Get Rx Funcs Bitfield Address */ + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet( device, + rxChannel, + &rxFuncsChanAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while attempting to retrieve Rx Funcs base address"); + goto cleanup; + } + + /* Get Slicer Position from Bitfield */ + recoveryAction = adrv904x_RxFuncs_RxdpSlicerPosition_BfGet(device, + NULL, + rxFuncsChanAddr, + slicerPosition); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT( &device->common, recoveryAction, "RxdpSlicerPosition readback issue"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxLoSourceGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_LoSel_e * const rxLoSource) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Check Rx data format config pointer is not NULL*/ + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxLoSource, cleanup); + + /* Check that the requested rxChannel is valid */ + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "Invalid Rx channel selected for LO source mapping read back. Valid Rx channels are Rx0-Rx7."); + goto cleanup; + } + + /* Check that rx profile is valid in current config */ + if (((device->devStateInfo.profilesValid & ADI_ADRV904X_RX_PROFILE_VALID) != ADI_ADRV904X_RX_PROFILE_VALID) + || (device->devStateInfo.initializedChannels & (uint32_t)rxChannel) == 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + rxChannel, + "LO source read back requested for an Rx channel but Rx profile is invalid or channel not initialized in the device structure"); + goto cleanup; + } + + /* Readback Rx LO source selection */ + recoveryAction = adrv904x_RxLoSourceGet(device, rxChannel, rxLoSource); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error retrieving Lo Source for Rx channel."); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxNcoShifterSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxNcoConfig_t* const rxNcoConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_RxNcoConfig_t rxNcoInfo; + adrv904x_RxNcoConfigResp_t cmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + uint32_t cpuTypeIdx = 0U; + uint8_t channelMaskRet = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxNcoConfig, cleanup); + ADI_LIBRARY_MEMSET(&rxNcoInfo, 0, sizeof(rxNcoInfo)); + ADI_LIBRARY_MEMSET(&cmdRsp, 0, sizeof(cmdRsp)); + + if (rxNcoConfig->bandSelect >= ADRV904X_DDC_NUM_BAND) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxNcoConfig->bandSelect, "Invalid bandSelect provided."); + goto cleanup; + } + + /* Prepare the command payload */ + rxNcoInfo.chanSelect = (uint8_t) rxNcoConfig->chanSelect; + rxNcoInfo.bandSelect = (adi_adrv904x_DdcNumber_t) rxNcoConfig->bandSelect; + rxNcoInfo.enable = (uint8_t) rxNcoConfig->enable; + rxNcoInfo.phase = (uint32_t) ADRV904X_HTOCL(rxNcoConfig->phase); + rxNcoInfo.frequencyKhz = (int32_t) ADRV904X_HTOCL(rxNcoConfig->frequencyKhz); + + /* For each CPU, send the command, wait for a response, and process any errors. + * Only the CPU that owns this channel will set chanSelect in its response. + */ + for (cpuTypeIdx = 0U; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_RX_NCO, + (void*)&rxNcoInfo, + sizeof(rxNcoInfo), + (void*)&cmdRsp, + sizeof(cmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(cmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + channelMaskRet |= cmdRsp.chanSelect; + if (channelMaskRet == rxNcoInfo.chanSelect) + { + goto cleanup; + } + } + /* if didn't go to cleanup, then some error occurred.*/ + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMaskRet, "Firmware did not execute cmd on all channels requested"); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxNcoShifterGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_RxNcoConfigReadbackResp_t* const rxRbConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_RxNcoConfigReadback_t rxNcoCfgRbCmd; + adi_adrv904x_RxNcoConfigReadbackResp_t rxNcoCfgGetCmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_NO_ERROR; + uint32_t cpuType = 0U; + uint32_t chIdx = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxRbConfig, cleanup); + + ADI_LIBRARY_MEMSET(&rxNcoCfgRbCmd, 0, sizeof(rxNcoCfgRbCmd)); + ADI_LIBRARY_MEMSET(&rxNcoCfgGetCmdRsp, 0, sizeof(rxNcoCfgGetCmdRsp)); + + /* Testing if channel mask has more than two channels activated */ + if (rxRbConfig->chanSelect == (uint8_t) ADI_ADRV904X_RXOFF || + rxRbConfig->chanSelect > (uint8_t) ADI_ADRV904X_RX7 || + (((rxRbConfig->chanSelect - 1) & rxRbConfig->chanSelect) != 0U)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxRbConfig->chanSelect, "Invalid chanSelect provided."); + goto cleanup; + } + + if (rxRbConfig->bandSelect >= ADRV904X_DDC_NUM_BAND) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxRbConfig->bandSelect, "Invalid bandSelect provided."); + goto cleanup; + } + + /* Get CPU assigned to this channel */ + for (chIdx = 0U; chIdx < ADI_ADRV904X_MAX_CHANNELS; chIdx++) + { + if (rxRbConfig->chanSelect == ((uint8_t)1U << chIdx)) + { + cpuType = device->initExtract.rxTxCpuConfig[chIdx]; + break; + } + } + + /* Prepare the command payload */ + rxNcoCfgRbCmd.chanSelect = (uint8_t) rxRbConfig->chanSelect; + rxNcoCfgRbCmd.bandSelect = (adi_adrv904x_DdcNumber_t) rxRbConfig->bandSelect; + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend(device, + (adi_adrv904x_CpuType_e)cpuType, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_GET_RX_NCO, + (void*)&rxNcoCfgRbCmd, + sizeof(rxNcoCfgRbCmd), + (void*)&rxNcoCfgGetCmdRsp, + sizeof(rxNcoCfgGetCmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO((adrv904x_CpuErrorCode_e)rxNcoCfgGetCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup) ; + } + + if (rxNcoCfgGetCmdRsp.chanSelect == rxNcoCfgRbCmd.chanSelect) + { + /* Extract the command-specific response from the response payload */ + rxRbConfig->enabled = (uint8_t) rxNcoCfgGetCmdRsp.enabled; + rxRbConfig->phase = (uint32_t) ADRV904X_CTOHL(rxNcoCfgGetCmdRsp.phase); + rxRbConfig->frequencyKhz = (int32_t) ADRV904X_CTOHL(rxNcoCfgGetCmdRsp.frequencyKhz); + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxRbConfig->chanSelect, "Channel is not handled by the CPU"); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_OrxNcoSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_ORxNcoConfig_t * const orxNcoConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_ORxNcoConfig_t orxNcoInfo; + adrv904x_ORxNcoConfigResp_t cmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adi_adrv904x_CpuErrorCode_t cpuErrorCode = 0U; + uint32_t cpuTypeIdx = 0U; + uint8_t channelMaskRet = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, orxNcoConfig, cleanup); + + ADI_LIBRARY_MEMSET(&orxNcoInfo, 0, sizeof(orxNcoInfo)); + ADI_LIBRARY_MEMSET(&cmdRsp, 0, sizeof(cmdRsp)); + + /* Prepare the command payload */ + orxNcoInfo.chanSelect = (uint8_t) orxNcoConfig->chanSelect; + orxNcoInfo.ncoSelect = (uint8_t) orxNcoConfig->ncoSelect; + orxNcoInfo.enable = (uint8_t) orxNcoConfig->enable; + orxNcoInfo.phase = (uint32_t) ADRV904X_HTOCL(orxNcoConfig->phase); + orxNcoInfo.frequencyKhz = (int32_t) ADRV904X_HTOCL(orxNcoConfig->frequencyKhz); + + /* For each CPU, send the command, wait for a response, and process any errors. + * Only the CPU that owns this channel will set chanSelect in its response. + */ + for (cpuTypeIdx = 0U; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_ORX_NCO, + (void*)&orxNcoInfo, + sizeof(orxNcoInfo), + (void*)&cmdRsp, + sizeof(cmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(cmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + channelMaskRet |= cmdRsp.chanSelect; + if (channelMaskRet == orxNcoInfo.chanSelect) + { + goto cleanup; + } + } + /* if didn't go to cleanup, then some error occurred.*/ + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMaskRet, "Firmware did not execute cmd on all channels requested"); + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_OrxNcoSet_v2(adi_adrv904x_Device_t* const device, + const adi_adrv904x_ORxNcoConfig_t * const orxNcoConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_ORxNcoConfig_t orxNcoInfo; + adrv904x_ORxNcoConfigResp_t cmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adi_adrv904x_CpuErrorCode_t cpuErrorCode = 0U; + uint32_t cpuTypeIdx = 0U; + uint8_t channelMaskRet = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, orxNcoConfig, cleanup); + + ADI_LIBRARY_MEMSET(&orxNcoInfo, 0, sizeof(orxNcoInfo)); + ADI_LIBRARY_MEMSET(&cmdRsp, 0, sizeof(cmdRsp)); + + /* Prepare the command payload */ + orxNcoInfo.chanSelect = (uint8_t) orxNcoConfig->chanSelect; + orxNcoInfo.ncoSelect = (uint8_t) orxNcoConfig->ncoSelect; + orxNcoInfo.enable = (uint8_t) orxNcoConfig->enable; + orxNcoInfo.phase = (uint32_t) ADRV904X_HTOCL(orxNcoConfig->phase); + orxNcoInfo.frequencyKhz = (int32_t) ADRV904X_HTOCL(orxNcoConfig->frequencyKhz); + + /* For each CPU, send the command, wait for a response, and process any errors. + * Only the CPU that owns this channel will set chanSelect in its response. + */ + for (cpuTypeIdx = 0U; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_ORX_NCO_V2, + (void*)&orxNcoInfo, + sizeof(orxNcoInfo), + (void*)&cmdRsp, + sizeof(cmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(cmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + channelMaskRet |= cmdRsp.chanSelect; + if (channelMaskRet == orxNcoInfo.chanSelect) + { + goto cleanup; + } + } + /* if didn't go to cleanup, then some error occurred.*/ + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMaskRet, "Firmware did not execute cmd on all channels requested"); + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_OrxNcoGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_ORxNcoConfigReadbackResp_t* const orxRbConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_ORxNcoConfigReadback_t orxNcoCfgRbCmd; + adi_adrv904x_ORxNcoConfigReadbackResp_t orxNcoCfgGetCmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + uint32_t cpuTypeIdx = 0U; + uint8_t channelMaskRet = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, orxRbConfig, cleanup); + ADI_LIBRARY_MEMSET(&orxNcoCfgRbCmd, 0, sizeof(orxNcoCfgRbCmd)); + ADI_LIBRARY_MEMSET(&orxNcoCfgGetCmdRsp, 0, sizeof(orxNcoCfgGetCmdRsp)); + + /* Testing if channel mask has more than two channels activated*/ + if (orxRbConfig->chanSelect == (uint8_t) ADI_ADRV904X_RXOFF || + orxRbConfig->chanSelect > (uint8_t) ADI_ADRV904X_RX7 || + (((orxRbConfig->chanSelect - 1) & orxRbConfig->chanSelect) != 0U)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, orxRbConfig->chanSelect, "Invalid chanSelect provided."); + goto cleanup; + } + + /* Prepare the command payload */ + orxNcoCfgRbCmd.chanSelect = (uint8_t) orxRbConfig->chanSelect; + orxNcoCfgRbCmd.ncoSelect = (uint8_t) orxRbConfig->ncoSelect; + + /* For each CPU, send the command, wait for a response, and process any errors. + * Only the CPU that owns this channel will set chanSelect in its response. + */ + for (cpuTypeIdx = 0U; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_GET_ORX_NCO, + (void*)&orxNcoCfgRbCmd, + sizeof(orxNcoCfgRbCmd), + (void*)&orxNcoCfgGetCmdRsp, + sizeof(orxNcoCfgGetCmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO((adrv904x_CpuErrorCode_e)orxNcoCfgGetCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup) ; + } + + channelMaskRet = orxNcoCfgGetCmdRsp.chanSelect; + if (channelMaskRet == orxNcoCfgRbCmd.chanSelect) + { + /* Extract the command-specific response from the response payload */ + orxRbConfig->enabled = (uint8_t) orxNcoCfgGetCmdRsp.enabled; + orxRbConfig->ncoSelect = (uint8_t) orxNcoCfgGetCmdRsp.ncoSelect; + orxRbConfig->phase = (uint32_t) ADRV904X_CTOHL(orxNcoCfgGetCmdRsp.phase); + orxRbConfig->frequencyKhz = (int32_t) ADRV904X_CTOHL(orxNcoCfgGetCmdRsp.frequencyKhz); + goto cleanup; + } + } + /* if didn't go to cleanup, then some error occurred.*/ + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMaskRet, "Firmware did not execute cmd on all channels requested"); + + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCddcNcoSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxCddcNcoConfig_t* const rxNcoConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_RxCddcNcoConfig_t rxNcoInfo; + adi_adrv904x_RxCddcNcoConfigReadbackResp_t cmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + uint32_t cpuTypeIdx = 0U; + uint8_t channelMaskRet = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxNcoConfig, cleanup); + ADI_LIBRARY_MEMSET(&rxNcoInfo, 0, sizeof(rxNcoInfo)); + ADI_LIBRARY_MEMSET(&cmdRsp, 0, sizeof(cmdRsp)); + + if (rxNcoConfig->chanSelect == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxNcoConfig->chanSelect, "Invalid chanSelect provided."); + goto cleanup; + } + + if (rxNcoConfig->carrierSelect == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxNcoConfig->carrierSelect, "Invalid carrier provided."); + goto cleanup; + } + + recoveryAction = adrv904x_RxCddcCarrierCheck(device, rxNcoConfig->chanSelect, rxNcoConfig->carrierSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxCddcCarrierCheck issue"); + goto cleanup; + } + + if (rxNcoConfig->phase > MAX_CDDC_NCO_PHASE_DEGREES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxNcoConfig->phase, "Invalid phase provided."); + goto cleanup; + } + + if ((rxNcoConfig->frequencyKhz > MAX_CDDC_NCO_FREQ_KHZ) || + (rxNcoConfig->frequencyKhz < -MAX_CDDC_NCO_FREQ_KHZ)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxNcoConfig->frequencyKhz, "Invalid frequency provided."); + goto cleanup; + } + + /* Prepare the command payload */ + rxNcoInfo.chanSelect = (uint8_t) rxNcoConfig->chanSelect; + rxNcoInfo.carrierSelect = (uint8_t) rxNcoConfig->carrierSelect; + rxNcoInfo.enable = (uint8_t) rxNcoConfig->enable; + rxNcoInfo.phase = (uint32_t) ADRV904X_HTOCL(rxNcoConfig->phase); + + /* NOTE: Because the Rx CDDC flip is reversed, must change the sign */ + rxNcoInfo.frequencyKhz = -(int32_t) ADRV904X_HTOCL(rxNcoConfig->frequencyKhz); + + /* For each CPU, send the command, wait for a response, and process any errors. + * Only the CPU that owns this channel will set chanSelect in its response. + */ + for (cpuTypeIdx = 0U; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend(device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_RX_CDDC_NCO, + (void*)&rxNcoInfo, + sizeof(rxNcoInfo), + (void*)&cmdRsp, + sizeof(cmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO((adrv904x_CpuErrorCode_e)cmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + channelMaskRet |= cmdRsp.chanSelect; + if (channelMaskRet == rxNcoInfo.chanSelect) + { + break; /* Commands are done */ + } + } + + /* The above loop should always break before cpuTypeIdx reaches ADI_ADRV904X_CPU_TYPE_MAX_RADIO */ + if (cpuTypeIdx >= ADI_ADRV904X_CPU_TYPE_MAX_RADIO) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMaskRet, "FW did not execute cmd on all channels requested"); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCddcNcoGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_RxCddcNcoConfigReadbackResp_t* const rxRbConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_RxCddcNcoConfig_t rxNcoCfgRbCmd; + adi_adrv904x_RxCddcNcoConfigReadbackResp_t rxNcoCfgGetCmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + uint32_t cpuTypeIdx = 0U; + uint8_t channelMaskRet = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxRbConfig, cleanup); + + ADI_LIBRARY_MEMSET(&rxNcoCfgRbCmd, 0, sizeof(rxNcoCfgRbCmd)); + ADI_LIBRARY_MEMSET(&rxNcoCfgGetCmdRsp, 0, sizeof(rxNcoCfgGetCmdRsp)); + + /* Testing if channel mask has more than two channels activated*/ + if (rxRbConfig->chanSelect == (uint8_t) ADI_ADRV904X_RXOFF || + rxRbConfig->chanSelect > (uint8_t) ADI_ADRV904X_RX7 || + (((rxRbConfig->chanSelect - 1) & rxRbConfig->chanSelect) != 0U)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxRbConfig->chanSelect, "Invalid chanSelect provided."); + goto cleanup; + } + + /* Testing if carrier mask has more than two carrier activated */ + if ((rxRbConfig->carrierSelect == (uint8_t)ADI_ADRV904X_RX_CARRIER_NONE) || + (rxRbConfig->carrierSelect > (uint8_t)ADI_ADRV904X_RX_CARRIER_7) || + (((rxRbConfig->carrierSelect - 1) & rxRbConfig->carrierSelect) != 0U)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxRbConfig->carrierSelect, "Invalid carrierSelect provided."); + goto cleanup; + } + + recoveryAction = adrv904x_RxCddcCarrierCheck(device, rxRbConfig->chanSelect, rxRbConfig->carrierSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxCddcCarrierCheck issue"); + goto cleanup; + } + + /* Prepare the command payload */ + rxNcoCfgRbCmd.chanSelect = (uint8_t) rxRbConfig->chanSelect; + rxNcoCfgRbCmd.carrierSelect = (uint8_t) rxRbConfig->carrierSelect; + + /* For each CPU, send the command, wait for a response, and process any errors. + * Only the CPU that owns this channel will set chanSelect in its response. + */ + for (cpuTypeIdx = 0U; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend(device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_GET_RX_CDDC_NCO, + (void*)&rxNcoCfgRbCmd, + sizeof(rxNcoCfgRbCmd), + (void*)&rxNcoCfgGetCmdRsp, + sizeof(rxNcoCfgGetCmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO((adrv904x_CpuErrorCode_e)rxNcoCfgGetCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup) ; + } + + channelMaskRet = rxNcoCfgGetCmdRsp.chanSelect; + if (channelMaskRet == rxNcoCfgRbCmd.chanSelect) + { + /* Extract the command-specific response from the response payload */ + rxRbConfig->chanSelect = (uint8_t) ADRV904X_CTOHL(rxNcoCfgGetCmdRsp.chanSelect); + rxRbConfig->carrierSelect = (uint8_t) ADRV904X_CTOHL(rxNcoCfgGetCmdRsp.carrierSelect); + rxRbConfig->enabled = (uint8_t) rxNcoCfgGetCmdRsp.enabled; + rxRbConfig->phase = (uint32_t) ADRV904X_CTOHL(rxNcoCfgGetCmdRsp.phase); + + /* NOTE: Because the Rx CDDC flip is reversed, must change the sign */ + rxRbConfig->frequencyKhz = -(int32_t) ADRV904X_CTOHL(rxNcoCfgGetCmdRsp.frequencyKhz); + break; + } + } + + /* The above loop should always break before cpuTypeIdx reaches ADI_ADRV904X_CPU_TYPE_MAX_RADIO */ + if (cpuTypeIdx >= ADI_ADRV904X_CPU_TYPE_MAX_RADIO) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMaskRet, "FW did not execute cmd on all channels requested"); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxDecimatedPowerCfgSet(adi_adrv904x_Device_t * const device, + adi_adrv904x_RxDecimatedPowerCfg_t rxDecPowerCfg[], + const uint32_t numOfDecPowerCfgs) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + static const uint8_t TDD_MODE_ENABLE_DEFAULT_VAL = 1U; + static const uint16_t TDD_MODE_DELAY_DEFAULT_VAL = 0U; + static const uint8_t NUMBER_OF_RX_DDC = 2U; + uint32_t cfgIdx = 0U; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + uint8_t decPowerEnable = 0U; + uint8_t decPowerAgcSelect = 0U; + uint8_t decPowerClockEnable = 0U; + uint8_t hb2OutClkDivRatio = 0U; + uint8_t ddcSelection = 0U; + uint32_t ddcMask = 0U; + adrv904x_BfRxFuncsChanAddr_e rxFuncsBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_FUNCS; + adrv904x_BfRxChanAddr_e rxDigBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_DIG; + adrv904x_BfRxDdcChanAddr_e ddcAddr = ADRV904X_BF_SLICE_RX_0__RX_DDC_0_; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxDecPowerCfg, cleanup); + + if (numOfDecPowerCfgs == 0U) + { + /* no valid configs */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numOfDecPowerCfgs, "Invalid Number of Dec Power Configurations"); + goto cleanup; + } + + /* Loop through the number of configurations and perform range checks */ + for (cfgIdx = 0U; cfgIdx < numOfDecPowerCfgs; ++cfgIdx) + { + recoveryAction = adrv904x_DecPowerCfgRangeCheck(device, &rxDecPowerCfg[cfgIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Dec power range Check Error Reported"); + goto cleanup; + } + } + + /* Write out the configurations */ + for (cfgIdx = 0U; cfgIdx < numOfDecPowerCfgs; ++cfgIdx) + { + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_RX_ONLY; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(rxDecPowerCfg[cfgIdx].rxChannelMask, chanSel)) + { + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(chanSel), &rxFuncsBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid Rx Channel used to determine rx func address"); + goto cleanup; + } + + recoveryAction = adrv904x_RxBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(chanSel), &rxDigBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid Rx Channel used to determine rx dig address"); + goto cleanup; + } + + if (rxDecPowerCfg[cfgIdx].decPowerControl == ADI_ADRV904X_DEC_POWER_MEAS_OFF) + { + /* Manual(SPI) control, user disables the dec power measurement */ + decPowerEnable = 0U; + decPowerAgcSelect = 0U; + decPowerClockEnable = 0U; + } + else if (rxDecPowerCfg[cfgIdx].decPowerControl == ADI_ADRV904X_DEC_POWER_MEAS_ON) + { + /* Manual(SPI) control, user enables the dec power measurement */ + decPowerEnable = 1U; + decPowerAgcSelect = 0U; + decPowerClockEnable = 1U; + } + else + { + /* AGC controls the decimated power, decPowerEnable is a don't care for this case */ + decPowerEnable = 0U; + decPowerAgcSelect = 1U; + decPowerClockEnable = 1U; + } + + /* 1 - Clock configuration for decimated power block */ + recoveryAction = adrv904x_RxDig_Hb2OutClkDivideRatio_BfGet(device, NULL, rxDigBaseAddr, &hb2OutClkDivRatio); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read hb2 out clk divide ratio"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDig_DecpwrClkDivideRatio_BfSet(device, NULL, rxDigBaseAddr, hb2OutClkDivRatio); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write dec power clk divide ratio"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDig_DecpwrClkEnable_BfSet(device, NULL, rxDigBaseAddr, decPowerClockEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to set dec power clk enable bit"); + goto cleanup; + } + + /* 2 - Main path Dec power configuration */ + if (ADRV904X_BF_EQUAL(rxDecPowerCfg[cfgIdx].measBlockSelectMask, (uint32_t)ADI_ADRV904X_DEC_POWER_MAIN_PATH_MEAS_BLOCK)) + { + /* Disable Dec Power While Changing Configs */ + recoveryAction = adrv904x_RxFuncs_DecPowerEnable_BfSet(device, NULL, rxFuncsBaseAddr, 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write dec power enable bit"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_DecPowerDataSel_BfSet(device, NULL, rxFuncsBaseAddr, rxDecPowerCfg[cfgIdx].powerInputSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write signal source for decimated power measurement"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_DecPowerMeasurementDuration_BfSet(device, NULL, rxFuncsBaseAddr, rxDecPowerCfg[cfgIdx].powerMeasurementDuration); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write decimated power measurement duration"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_DecPowerEnSpiOrAgcSelect_BfSet(device, NULL, rxFuncsBaseAddr, decPowerAgcSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write dec power AGC select bit"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_DecPowerTddModeEnable_BfSet(device, NULL, rxFuncsBaseAddr, TDD_MODE_ENABLE_DEFAULT_VAL); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to enable Tdd mode for decimated power measurement"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_DecPowerStartDelayCounter_BfSet(device, NULL, rxFuncsBaseAddr, TDD_MODE_DELAY_DEFAULT_VAL); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to enable Tdd mode for decimated power measurement"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_DecPowerEnable_BfSet(device, NULL, rxFuncsBaseAddr, decPowerEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write dec power enable bit"); + goto cleanup; + } + } + + /* 3 - Configure Band Decimated power blocks */ + ddcMask = 0U; + if (ADRV904X_BF_EQUAL(rxDecPowerCfg[cfgIdx].measBlockSelectMask, (uint32_t)ADI_ADRV904X_DEC_POWER_BAND_A_MEAS_BLOCK)) + { + ddcMask |= (1U << (uint32_t)ADI_ADRV904X_RX_DDC_BAND0); + } + + if (ADRV904X_BF_EQUAL(rxDecPowerCfg[cfgIdx].measBlockSelectMask, (uint32_t)ADI_ADRV904X_DEC_POWER_BAND_B_MEAS_BLOCK)) + { + ddcMask |= (1U << (uint32_t)ADI_ADRV904X_RX_DDC_BAND1); + } + + for (ddcSelection = 0U; ddcSelection < NUMBER_OF_RX_DDC; ddcSelection++) + { + if (ADRV904X_BF_EQUAL(ddcMask, (uint32_t)(1U << ddcSelection))) + { + /* Get Rx DDC Bitfield Address */ + recoveryAction = adrv904x_RxDdcBitfieldAddressGet(device, + (adi_adrv904x_RxChannels_e)(chanSel), + (adi_adrv904x_RxDdcs_e)ddcSelection, + &ddcAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Rx ddc bit field address"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDdc_DecPowerMeasurementDuration_BfSet(device, NULL, ddcAddr, rxDecPowerCfg[cfgIdx].powerMeasurementDuration); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write decimated power measurement duration"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDdc_DecPowerEnable_BfSet(device, NULL, ddcAddr, decPowerEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write dec power enable bit"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDdc_DecPowerEnSpiOrAgcSelect_BfSet(device, NULL, ddcAddr, decPowerAgcSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write dec power AGC select bit"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDdc_DecPowerTddModeEnable_BfSet(device, NULL, ddcAddr, TDD_MODE_ENABLE_DEFAULT_VAL); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to enable Tdd mode for decimated power measurement"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDdc_DecPowerStartDelayCounter_BfSet(device, NULL, ddcAddr, TDD_MODE_DELAY_DEFAULT_VAL); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to enable Tdd mode for decimated power measurement"); + goto cleanup; + } + } + } + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxDecimatedPowerCfgGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + const adi_adrv904x_DecPowerMeasurementBlock_e decPowerBlockSelection, + adi_adrv904x_RxDecimatedPowerCfg_t * const rxDecPowerCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxFuncsChanAddr_e rxFuncsBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_FUNCS; + adrv904x_BfRxDdcChanAddr_e ddcAddr = ADRV904X_BF_SLICE_RX_0__RX_DDC_0_; + uint8_t decPowerEnable = 0U; + uint8_t decPowerAgcSelect = 0U; + adi_adrv904x_RxDdcs_e ddcSelection = ADI_ADRV904X_RX_DDC_BAND0; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxDecPowerCfg, cleanup); + + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7)) + { + /* Invalid Rx channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Invalid Rx channel selection"); + goto cleanup; + } + + if ((decPowerBlockSelection != ADI_ADRV904X_DEC_POWER_MAIN_PATH_MEAS_BLOCK) && + (decPowerBlockSelection != ADI_ADRV904X_DEC_POWER_BAND_A_MEAS_BLOCK) && + (decPowerBlockSelection != ADI_ADRV904X_DEC_POWER_BAND_B_MEAS_BLOCK)) + { + /* Invalid decimated power block selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, decPowerBlockSelection, "Invalid decimated power block selection"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet(device, rxChannel, &rxFuncsBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Invalid Rx Channel used to determine rx func address"); + goto cleanup; + } + + rxDecPowerCfg->rxChannelMask = (uint32_t)rxChannel; + + if (decPowerBlockSelection == ADI_ADRV904X_DEC_POWER_MAIN_PATH_MEAS_BLOCK) + { + recoveryAction = adrv904x_RxFuncs_DecPowerDataSel_BfGet(device, NULL, rxFuncsBaseAddr, &rxDecPowerCfg->powerInputSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read signal source for decimated power measurement"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_DecPowerMeasurementDuration_BfGet(device, NULL, rxFuncsBaseAddr, &rxDecPowerCfg->powerMeasurementDuration); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read decimated power measurement duration"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_DecPowerEnable_BfGet(device, NULL, rxFuncsBaseAddr, &decPowerEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write dec power enable bit"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_DecPowerEnSpiOrAgcSelect_BfGet(device, NULL, rxFuncsBaseAddr, &decPowerAgcSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write dec power AGC select bit"); + goto cleanup; + } + + rxDecPowerCfg->measBlockSelectMask = (uint8_t)ADI_ADRV904X_DEC_POWER_MAIN_PATH_MEAS_BLOCK; + } + else + { + if (decPowerBlockSelection == ADI_ADRV904X_DEC_POWER_BAND_A_MEAS_BLOCK) + { + ddcSelection = ADI_ADRV904X_RX_DDC_BAND0; + rxDecPowerCfg->measBlockSelectMask = (uint8_t)ADI_ADRV904X_DEC_POWER_BAND_A_MEAS_BLOCK; + } + else + { + ddcSelection = ADI_ADRV904X_RX_DDC_BAND1; + rxDecPowerCfg->measBlockSelectMask = (uint8_t)ADI_ADRV904X_DEC_POWER_BAND_B_MEAS_BLOCK; + } + + recoveryAction = adrv904x_RxDdcBitfieldAddressGet(device, rxChannel, ddcSelection, &ddcAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read DDC address"); + goto cleanup; + } + + rxDecPowerCfg->powerInputSelect = 0U; /* Input selection is not supported for DDC */ + + recoveryAction = adrv904x_RxDdc_DecPowerMeasurementDuration_BfGet(device, NULL, ddcAddr, &rxDecPowerCfg->powerMeasurementDuration); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read decimated power measurement duration"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDdc_DecPowerEnable_BfGet(device, NULL, ddcAddr, &decPowerEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write dec power enable bit"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDdc_DecPowerEnSpiOrAgcSelect_BfGet(device, NULL, ddcAddr, &decPowerAgcSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write dec power AGC select bit"); + goto cleanup; + } + } + + if ((decPowerEnable == 0U) && (decPowerAgcSelect == 0U)) + { + rxDecPowerCfg->decPowerControl = ADI_ADRV904X_DEC_POWER_MEAS_OFF; + } + else if ((decPowerEnable == 1U) && (decPowerAgcSelect == 0U)) + { + rxDecPowerCfg->decPowerControl = ADI_ADRV904X_DEC_POWER_MEAS_ON; + } + else if (decPowerAgcSelect == 1U) + { + rxDecPowerCfg->decPowerControl = ADI_ADRV904X_DEC_POWER_AGC_MEAS; + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid dec power measurement configuration is detected"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxDecimatedPowerGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxChannels_e rxChannel, + const adi_adrv904x_DecPowerMeasurementBlock_e decPowerBlockSelection, + uint8_t * const powerReadBack) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxFuncsChanAddr_e rxFuncsBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_FUNCS; + adrv904x_BfRxDdcChanAddr_e ddcAddr = ADRV904X_BF_SLICE_RX_0__RX_DDC_0_; + adi_adrv904x_RxDdcs_e ddcSelection = ADI_ADRV904X_RX_DDC_BAND0; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, powerReadBack, cleanup); + + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7) + ) + { + /* Invalid channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Invalid channel selection"); + goto cleanup; + } + + if ((rxChannel == ADI_ADRV904X_ORX0) || + (rxChannel == ADI_ADRV904X_ORX1)) + { + } + else if (decPowerBlockSelection == ADI_ADRV904X_DEC_POWER_MAIN_PATH_MEAS_BLOCK) + { + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet(device, + rxChannel, + &rxFuncsBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid Rx Channel used to determine rx func address"); + goto cleanup; + } + + recoveryAction = adrv904x_RxFuncs_DecPowerReadback_BfSet(device, + NULL, + rxFuncsBaseAddr, + 1U); + if(recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting decimated power readback latch bit"); + goto cleanup ; + } + + recoveryAction = adrv904x_RxFuncs_DecPowerValue_BfGet(device, + NULL, + rxFuncsBaseAddr, + powerReadBack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading main path decimated power for selected Rx channel"); + goto cleanup; + } + } + else + { + if (decPowerBlockSelection == ADI_ADRV904X_DEC_POWER_BAND_A_MEAS_BLOCK) + { + ddcSelection = ADI_ADRV904X_RX_DDC_BAND0; + + } + else if (decPowerBlockSelection == ADI_ADRV904X_DEC_POWER_BAND_B_MEAS_BLOCK) + { + ddcSelection = ADI_ADRV904X_RX_DDC_BAND1; + } + else + { + /* Invalid decPowerBlockSelection selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid decPowerBlockSelection selection"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDdcBitfieldAddressGet(device, + rxChannel, + ddcSelection, + &ddcAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read DDC address"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDdc_DecPowerValueReadback_BfSet(device, + NULL, + ddcAddr, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting decimated power readback latch bit"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDdc_DecPowerValue_BfGet(device, + NULL, + ddcAddr, + powerReadBack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading band decimated power for selected Rx channel"); + goto cleanup; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_OrxAttenSet(adi_adrv904x_Device_t* const device, + const uint32_t channelMask, + const uint8_t attenDb) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t chanId = 0U; + uint8_t trmAtten = 0U; + uint8_t trmAttenBwCapEn = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + if (channelMask > MAX_ORX_CHANNEL_MASK) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + channelMask, + "Invalid channelMask"); + goto cleanup; + } + + if (attenDb > ADI_ADRV904X_MAX_ORX_ATTEN_DB) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + attenDb, + "attenDb outside maximum range"); + goto cleanup; + } + + recoveryAction = adrv904x_ORxAttenDbToRegValues(device, attenDb, &trmAtten, &trmAttenBwCapEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "adrv904x_ORxAttenDbToRegValues failed"); + goto cleanup; + } + + /* for each channel in channelMask */ + for (chanId = 0U; chanId <= MAX_ORX_CHANNEL_ID; chanId++) + { + if ((channelMask & (1 << chanId)) == 0) + { + /* Skip this channel */ + continue; + } + + /* ensure channel's trm_atten_pd is always set 0 */ + recoveryAction = adrv904x_ActrlOrxWestRegmap_TrmAttenPd_BfSet(device, NULL, chanIdToOrxWestRegmapChanAddr[chanId], 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error setting TrmAttenPd bitfield"); + goto cleanup; + } + + /* ensure channel's trm_cm_cap_en is always set 1 */ + recoveryAction = adrv904x_ActrlOrxWestRegmap_TrmAttenCmCapEn_BfSet(device, NULL, chanIdToOrxWestRegmapChanAddr[chanId], 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error setting TrmAttenCmCapEn bitfield"); + goto cleanup; + } + + /* Set this ORx channel's trm_atten bitfield */ + recoveryAction = adrv904x_ActrlOrxWestRegmap_TrmAtten_BfSet(device, + NULL, + chanIdToOrxWestRegmapChanAddr[chanId], + (adrv904x_Bf_ActrlOrxWestRegmap_TrmAtten_e)trmAtten); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "ORX attenuator trimmer set issue"); + goto cleanup; + } + + /* Set this ORx channel's trm_atten_bw_cap - NOTE: the register is called trm_atten_spare2 */ + recoveryAction = adrv904x_ActrlOrxWestRegmap_TrmAttenSpare2_BfSet(device, + NULL, + chanIdToOrxWestRegmapChanAddr[chanId], + trmAttenBwCapEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error setting TrmAttenSpare2 bitfield"); + goto cleanup; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_OrxAttenGet(adi_adrv904x_Device_t* const device, + const uint8_t channelId, + uint8_t* const attenDb) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + adrv904x_Bf_ActrlOrxWestRegmap_TrmAtten_e trmAtten = ADRV904X_BF_ACTRL_ORX_WEST_REGMAP_TRM_ATTEN_ATTEN_0DB; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + if (channelId > MAX_ORX_CHANNEL_ID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + channelId, + "Invalid channelId"); + goto cleanup; + } + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, attenDb, cleanup); + + /* Get the channel's attenuation */ + recoveryAction = adrv904x_ActrlOrxWestRegmap_TrmAtten_BfGet(device, + NULL, + chanIdToOrxWestRegmapChanAddr[channelId], + &trmAtten); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + ADI_NO_VARIABLE, + "ORX attenuator trimmer get issue"); + goto cleanup; + } + + recoveryAction = adrv904x_ORxTrmAttenToDb(device, trmAtten, attenDb); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + ADI_NO_VARIABLE, + "adrv904x_ORxTrmAttenToDb failed"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxGainCtrlModeSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxGainCtrlModeCfg_t gainCtrlModeCfg[], + const uint32_t arraySize) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxFuncsChanAddr_e rxChannelBitfieldAddr; + uint32_t gainCtrlModeIndex = 0U; + uint32_t rxChannelIndex = 0U; + uint32_t rxChannel = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gainCtrlModeCfg, cleanup); + + if (arraySize == 0U) + { + /* no valid configs */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, arraySize, "Invalid number of gain control mode array"); + goto cleanup; + } + + /* check each item in the input array, make sure the parameters are valid */ + for (gainCtrlModeIndex = 0; gainCtrlModeIndex < arraySize; gainCtrlModeIndex++) + { + /* rxChannelMask should larger than 0 and less than 0x100 */ + if ((gainCtrlModeCfg[gainCtrlModeIndex].rxChannelMask == 0U) || + ((gainCtrlModeCfg[gainCtrlModeIndex].rxChannelMask & (~(uint32_t)ADI_ADRV904X_RX_MASK_ALL)) != 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, gainCtrlModeCfg[gainCtrlModeIndex].rxChannelMask, "Invalid Rx channel mask"); + goto cleanup; + } + + /* gainCtrlMode just support MGC and AGC type */ + if ((gainCtrlModeCfg[gainCtrlModeIndex].gainCtrlMode != ADI_ADRV904X_MGC) && + (gainCtrlModeCfg[gainCtrlModeIndex].gainCtrlMode != ADI_ADRV904X_AGC)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, gainCtrlModeCfg[gainCtrlModeIndex].gainCtrlMode, "Invalid Rx channel gain control mode"); + goto cleanup; + } + } + + for (gainCtrlModeIndex = 0U; gainCtrlModeIndex < arraySize; gainCtrlModeIndex++) + { + for (rxChannelIndex = 0U; rxChannelIndex < ADI_ADRV904X_MAX_RX_ONLY; rxChannelIndex++) + { + rxChannel = 1U << rxChannelIndex; + if ((gainCtrlModeCfg[gainCtrlModeIndex].rxChannelMask & rxChannel) == rxChannel) + { + /* get the Rx channel function address */ + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet(device, + (adi_adrv904x_RxChannels_e)rxChannel, + &rxChannelBitfieldAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Invalid Rx channel function address"); + goto cleanup; + } + + /* set gain control mode */ + recoveryAction = adrv904x_RxFuncs_AgcSetup_BfSet(device, + NULL, + rxChannelBitfieldAddr, + (uint8_t)gainCtrlModeCfg[gainCtrlModeIndex].gainCtrlMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Rx channel gain control mode set failure"); + goto cleanup; + } + } + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxGainCtrlModeGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_RxGainCtrlMode_e* gainCtrlMode) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxFuncsChanAddr_e rxChannelBitfieldAddr; + uint8_t value = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gainCtrlMode, cleanup); + + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7)) + { + /* Invalid Rx channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Invalid Rx channel selection"); + goto cleanup; + } + + /* get the Rx channel function address */ + recoveryAction = adrv904x_RxFuncsBitfieldAddressGet(device, + rxChannel, + &rxChannelBitfieldAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Invalid Rx channel function address"); + goto cleanup; + } + + /* set gain control mode */ + recoveryAction = adrv904x_RxFuncs_AgcSetup_BfGet(device, + NULL, + rxChannelBitfieldAddr, + &value); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Rx channel gain control mode get failure"); + goto cleanup; + } + + /* update gain control mode information */ + *gainCtrlMode = (adi_adrv904x_RxGainCtrlMode_e)value; + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxTempGainCompSet(adi_adrv904x_Device_t* const device, + const uint32_t rxChannelMask, + const int8_t gainValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxDdcChanAddr_e rxChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_0__RX_DDC_0_; + uint32_t rxChannelIndex = 0U; + uint32_t rxChannel = 0U; + uint32_t ddcBand = 0U; + uint8_t value = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* rxChannelMask should larger than 0 and less than 0x100 */ + if ((rxChannelMask == 0U) || + ((rxChannelMask & (~(uint32_t)ADI_ADRV904X_RX_MASK_ALL)) != 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannelMask, "Invalid Rx channel mask"); + goto cleanup; + } + + /* check that gainValue is within allowable range */ + if ((gainValue < -63) || + (gainValue > 63)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, gainValue, "Invalid Rx channel temperature gain value"); + goto cleanup; + } + else + { + /* register expects sign-magnitude value hence if value is negative, need to convert out of two's compliment and set the sign bit (bit 7) to 1 */ + if (gainValue < 0) + { + value = (uint8_t)((gainValue * (-1)) | 0x40); + } + else + { + value = (uint8_t)gainValue; + } + } + + for (rxChannelIndex = 0U; rxChannelIndex < ADI_ADRV904X_MAX_RX_ONLY; rxChannelIndex++) + { + rxChannel = 1U << rxChannelIndex; + if ((rxChannelMask & rxChannel) == rxChannel) + { + /* if an Rx channel mask is set, resolve the corresponding Rx DDC Bitfield Addresses (2 DDCs per channel)*/ + for (ddcBand = 0U; ddcBand < ADI_ADRV904X_MAX_RX_DDC_BANDS; ddcBand++) + { + recoveryAction = adrv904x_RxDdcBitfieldAddressGet(device, + (adi_adrv904x_RxChannels_e)rxChannel, + (adi_adrv904x_RxDdcs_e)ddcBand, + &rxChannelBitfieldAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, ddcBand, "get Rx channel DDC base address failure"); + goto cleanup; + } + + /* set temperature gain value */ + recoveryAction = adrv904x_RxDdc_RxTempGainComp_BfSet(device, + NULL, + rxChannelBitfieldAddr, + value); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "set Rx channel temperature gain value failure"); + goto cleanup; + } + } + } + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxTempGainCompGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + int8_t* const gainValue) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxDdcChanAddr_e rxChannelBitfieldAddr = ADRV904X_BF_SLICE_RX_0__RX_DDC_0_; + uint8_t value = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gainValue, cleanup); + + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7)) + { + /* Invalid Rx channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Invalid Rx channel selection"); + goto cleanup; + } + + /* get the Rx channel DDC0 address */ + recoveryAction = adrv904x_RxDdcBitfieldAddressGet(device, + rxChannel, + ADI_ADRV904X_RX_DDC_BAND0, + &rxChannelBitfieldAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "get Rx channel DDC0 address failure"); + goto cleanup; + } + + /* get temperature gain value */ + recoveryAction = adrv904x_RxDdc_RxTempGainComp_BfGet(device, + NULL, + rxChannelBitfieldAddr, + &value); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "get Rx channel temperature gain value failure"); + goto cleanup; + } + + /* convert from 7-bit sign magnitude format to 8-bit two's complement + * sign magnitude format: sign bit + data bit (amplitude value), not use complement code + */ + if ((value & 0x40U) > 0) + { + /* handle the negative case */ + *gainValue = (int8_t)(value & 0x3FU) * (-1); + } + else + { + /* handle the positive case */ + *gainValue = (int8_t)value; + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxTestDataSet(adi_adrv904x_Device_t* device, + const uint32_t rxChannelMask, + const adi_adrv904x_RxTestDataCfg_t* const rxTestDataCfg) +{ + /* The full range of generator selection options are not made available via the API we just use these + * two internally */ + uint8_t rxChannelIndex = 0U; + uint32_t chanSel = 0U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxDigChanAddr_e rxDigBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_DIG; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxTestDataCfg, cleanup); + + if ((rxChannelMask == 0U) || + ((rxChannelMask > (uint32_t) ADI_ADRV904X_RX_MASK_ALL))) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannelMask, "Invalid Rx channel mask"); + goto cleanup; + } + + for (rxChannelIndex = 0U; rxChannelIndex < ADI_ADRV904X_MAX_RX_ONLY; rxChannelIndex++) + { + chanSel = 1U << rxChannelIndex; + adi_adrv904x_RxChannels_e rxChannel = (adi_adrv904x_RxChannels_e)(chanSel); + if ((rxChannelMask & (uint32_t) rxChannel) == 0) + { + /* This channel is not set in the rxChannelMask arg - skip it */ + continue; + } + + recoveryAction = adrv904x_RxBitfieldAddressGet(device, rxChannel, &rxDigBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Invalid Rx Channel used to determine rx dig address"); + goto cleanup; + } + + if (rxTestDataCfg->enable == 0U) + { + /* Disable the test signal */ + + /* Set register-control to disable test signal*/ + recoveryAction = adrv904x_RxDig_AdcTestGenEnSpi_BfSet(device, NULL, rxDigBaseAddr, 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set ADC test generator enable SPI."); + goto cleanup; + } + + /* Set test signal enablement to be controlled by register (not GPIO) */ + recoveryAction = adrv904x_RxDig_AdcTestGenEnSel_BfSet(device, NULL, rxDigBaseAddr, ADC_TEST_GEN_EN_SEL_SPI); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to disable Rx ADC test signal. Could not set ADC test generator enable select."); + goto cleanup; + } + } + else + { + /* Enable the test signal */ + + /* First range check the freq */ + if (rxTestDataCfg->sineFreq > ADI_ADRV904X_FS_DIV_5 || rxTestDataCfg->sineFreq < ADI_ADRV904X_FS_DIV_40) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxTestDataCfg->sineFreq, "Invalid frequency"); + goto cleanup; + } + + /* Always use full-scale sine - other signal types are not exposed via the API */ + recoveryAction = adrv904x_RxDig_AdcTestGenSel_BfSet(device, NULL, rxDigBaseAddr, ADC_TEST_GEN_SEL_SINE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set ADC test generator select."); + goto cleanup; + } + + /* Always set the test signal frequency relative to ADC clock */ + recoveryAction = adrv904x_RxDig_AdcTestClkSel_BfSet(device, NULL, rxDigBaseAddr, ADC_TEST_GEN_CLK_ADC); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to enable ADC test generator clock select."); + goto cleanup; + } + + /* Set the test signal frequency */ + recoveryAction = adrv904x_RxDig_AdcTestGenSineFreq_BfSet(device, NULL, rxDigBaseAddr, (uint8_t) rxTestDataCfg->sineFreq); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set ADC test generator sine freq."); + goto cleanup; + } + + /* Set register-control to enable test signal*/ + recoveryAction = adrv904x_RxDig_AdcTestGenEnSpi_BfSet(device, NULL, rxDigBaseAddr, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set ADC test generator enable SPI."); + goto cleanup; + } + + /* Set test signal enablement to be controlled by register (not GPIO) */ + recoveryAction = adrv904x_RxDig_AdcTestGenEnSel_BfSet(device, NULL, rxDigBaseAddr, ADC_TEST_GEN_EN_SEL_SPI); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to set test generator enable select."); + goto cleanup; + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxTestDataGet(adi_adrv904x_Device_t* device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_RxTestDataCfg_t* const rxTestDataCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfRxDigChanAddr_e rxDigBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_DIG; + + /* Hold bitfield values read back */ + uint8_t genEnSel = 0U; /* Set adc_test_gen_en source to SPI */ + uint8_t genSel = 0U; /* Test signal type: Full scale, bypass etc */ + uint8_t clkSel = 0U; /* Send test data into ADC iface FIFO */ + uint8_t genEnSpi = 0U; /* Start sending test data */ + uint8_t tmpByte = 0U; /* Temp storage */ + adi_adrv904x_AdcTestSineFreq_e genSineFreq = ADI_ADRV904X_FS_DIV_40; /* Test signal frequency */ + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxTestDataCfg, cleanup); + + recoveryAction = adrv904x_RxBitfieldAddressGet(device, rxChannel, &rxDigBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Invalid Rx channel used to determine rx dig address"); + goto cleanup; + } + + recoveryAction = adrv904x_RxDig_AdcTestGenSel_BfGet(device, NULL, rxDigBaseAddr, &genSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read ADC test generator select."); + goto cleanup; + } + + recoveryAction = adrv904x_RxDig_AdcTestClkSel_BfGet(device, NULL, rxDigBaseAddr, &clkSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read ADC test generator clock select."); + goto cleanup; + } + + recoveryAction = adrv904x_RxDig_AdcTestGenEnSel_BfGet(device, NULL, rxDigBaseAddr, &genEnSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read ADC test generator enable select."); + goto cleanup; + } + + recoveryAction = adrv904x_RxDig_AdcTestGenSineFreq_BfGet(device, NULL, rxDigBaseAddr, &tmpByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read ADC test generator sine freq."); + goto cleanup; + } + + genSineFreq = (adi_adrv904x_AdcTestSineFreq_e)tmpByte; + + recoveryAction = adrv904x_RxDig_AdcTestGenEnSpi_BfGet(device, NULL, rxDigBaseAddr, &genEnSpi); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read ADC test generator enable SPI."); + goto cleanup; + } + + /* Return 'enabled' only if the settings are exactly as the setter function would enable */ + if ((genSel == ADC_TEST_GEN_SEL_SINE) && + (clkSel != 0U) && + (genEnSel == ADC_TEST_GEN_EN_SEL_SPI) && + (genEnSpi == 1U)) + { + rxTestDataCfg->enable = 1U; + rxTestDataCfg->sineFreq = genSineFreq; + } + else + { + rxTestDataCfg->enable = 0U; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxLoPowerDownSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannelMask, + const uint8_t enable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t rxScratch7Addr = 0U; + uint8_t i = 0U; + + static const uint32_t rxChanToScratch7Addr[ADI_ADRV904X_MAX_RX_ONLY] = { + ADRV904X_ADDR_RX0_STREAM_SCRATCH7, + ADRV904X_ADDR_RX1_STREAM_SCRATCH7, + ADRV904X_ADDR_RX2_STREAM_SCRATCH7, + ADRV904X_ADDR_RX3_STREAM_SCRATCH7, + ADRV904X_ADDR_RX4_STREAM_SCRATCH7, + ADRV904X_ADDR_RX5_STREAM_SCRATCH7, + ADRV904X_ADDR_RX6_STREAM_SCRATCH7, + ADRV904X_ADDR_RX7_STREAM_SCRATCH7, + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + if ((rxChannelMask < ADI_ADRV904X_RX0) || (rxChannelMask >= ADI_ADRV904X_ORX0)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannelMask, "Invalid Rx channel passed - must be from Rx0 up to Rx7."); + goto cleanup; + } + + if ((enable != ADI_DISABLE) && (enable != ADI_ENABLE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, enable, "Invalid enable value passed - must be ADI_ENABLE or ADI_DISABLE"); + goto cleanup; + } + + for (i = 0U; i < ADI_ADRV904X_MAX_RX_ONLY; i++) + { + if (((uint32_t)rxChannelMask & (1U << i)) == (1U << i)) + { + rxScratch7Addr = rxChanToScratch7Addr[i]; + + /* Stream scratch pad bit is set to *skip* power down so is logical inversion of *enable* power down */ + recoveryAction = adi_adrv904x_Register32Write( device, + NULL, + rxScratch7Addr, + (uint32_t)(!enable), + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "SPI Issue while writing on stream scratch register."); + goto cleanup; + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierRssiCfgSet(adi_adrv904x_Device_t * const device, + adi_adrv904x_RxCarrierRssiCfg_t rxCarrierRssiCfg[], + const uint32_t numCfgs) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t cfgIdx = 0U; + uint32_t carrierIdx = 0U; + uint32_t carrierSel = 0U; + uint32_t rxIdx = 0U; + uint32_t rxSel = 0U; + + adrv904x_BfCddcFuncsChanAddr_e cddcFuncsChanBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxCarrierRssiCfg, cleanup); + + if (numCfgs == 0U) + { + /* no valid configs */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numCfgs, "Invalid Number of Rssi Configurations"); + goto cleanup; + } + +#if ADI_ADRV904X_RX_RANGE_CHECK > 0 + /* Loop through the number of configurations and perform range checks */ + for (cfgIdx = 0U; cfgIdx < numCfgs; ++cfgIdx) + { + recoveryAction = adrv904x_RxCarrierRssiCfgRangeCheck(device, &rxCarrierRssiCfg[cfgIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Rx Carrier Rssi Cfg range check Error Reported"); + goto cleanup; + } + } +#endif + + /* Write out the configurations */ + for (cfgIdx = 0U; cfgIdx < numCfgs; ++cfgIdx) + { + for (rxIdx = 0U; rxIdx < ADI_ADRV904X_MAX_RX_ONLY; rxIdx++) + { + rxSel = 1U << rxIdx; + if ((rxCarrierRssiCfg[cfgIdx].rxCarrierMask.rxChannelMask & rxSel) > 0) + { + /* Convert the rxSel to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_CddcFuncsBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(rxSel), &cddcFuncsChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxSel, "Invalid Rx Carrier used to determine SPI address"); + goto cleanup; + } + + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_RX_CARRIERS; carrierIdx++) + { + carrierSel = 1U << carrierIdx; + if ((rxCarrierRssiCfg[cfgIdx].rxCarrierMask.carrierMask & carrierSel) > 0) + { + /* rssi_mode */ + recoveryAction = adrv904x_CddcFuncs_RssiMode_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rxCarrierRssiCfg[cfgIdx].measMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting rssi measurement mode selection"); + goto cleanup; + } + + /* rssi_start_delay */ + recoveryAction = adrv904x_CddcFuncs_RssiStartDelay_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rxCarrierRssiCfg[cfgIdx].startDelay); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting rssi start delay"); + goto cleanup; + } + + /* rssi_wait_delay */ + recoveryAction = adrv904x_CddcFuncs_RssiWaitDelay_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rxCarrierRssiCfg[cfgIdx].waitDelay); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting rssi wait delay"); + goto cleanup; + } + + /* rssi_continuous_meas_delay */ + recoveryAction = adrv904x_CddcFuncs_RssiContinuousMeasDelay_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rxCarrierRssiCfg[cfgIdx].pauseDelay); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting rssi pause delay"); + goto cleanup; + } + + /* rssi_default_mode */ + recoveryAction = adrv904x_CddcFuncs_RssiDefaultMode_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rxCarrierRssiCfg[cfgIdx].opMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting rssi op mode"); + goto cleanup; + } + + /* rssi_meas_duration */ + recoveryAction = adrv904x_CddcFuncs_RssiMeasDuration0_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rxCarrierRssiCfg[cfgIdx].duration0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting rssi duration 0"); + goto cleanup; + } + + recoveryAction = adrv904x_CddcFuncs_RssiMeasDuration1_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rxCarrierRssiCfg[cfgIdx].duration1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting rssi duration 1"); + goto cleanup; + } + + recoveryAction = adrv904x_CddcFuncs_RssiMeasDuration2_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rxCarrierRssiCfg[cfgIdx].duration2); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting rssi duration 2"); + goto cleanup; + } + + + recoveryAction = adrv904x_CddcFuncs_RssiMeasDuration3_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rxCarrierRssiCfg[cfgIdx].duration3); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting rssi duration 3"); + goto cleanup; + } + + /* rssi_mul_factor */ + recoveryAction = adrv904x_CddcFuncs_RssiMulFactor0_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rxCarrierRssiCfg[cfgIdx].mulFactor0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting rssi mul factor 0"); + goto cleanup; + } + + recoveryAction = adrv904x_CddcFuncs_RssiMulFactor1_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rxCarrierRssiCfg[cfgIdx].mulFactor1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting rssi mul factor 1"); + goto cleanup; + } + + recoveryAction = adrv904x_CddcFuncs_RssiMulFactor2_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rxCarrierRssiCfg[cfgIdx].mulFactor2); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting rssi mul factor 2"); + goto cleanup; + } + + recoveryAction = adrv904x_CddcFuncs_RssiMulFactor3_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rxCarrierRssiCfg[cfgIdx].mulFactor3); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting rssi mul factor 3"); + goto cleanup; + } + + /* rssi_reset_on_gain_change 1bit */ + recoveryAction = adrv904x_CddcFuncs_RssiResetOnGainChange_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rxCarrierRssiCfg[cfgIdx].resetAtGainChange); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting rssi reset at gain change"); + goto cleanup; + } + + /* rssi_pin_mode */ + recoveryAction = adrv904x_CddcFuncs_RssiPinMode_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rxCarrierRssiCfg[cfgIdx].fddPinMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting rssi fdd pin mode"); + goto cleanup; + } + + /* rssi_trigger_source_select 1bit */ + recoveryAction = adrv904x_CddcFuncs_RssiTriggerSourceSelect_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rxCarrierRssiCfg[cfgIdx].radioSeqTrigEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting rssi radio seq trig enable"); + goto cleanup; + } + + /* rssi_rs_trigger_select 3bit */ + recoveryAction = adrv904x_CddcFuncs_RssiRsTriggerSelect_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rxCarrierRssiCfg[cfgIdx].radioSeqTrigSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting rssi radio seq trig select"); + goto cleanup; + } + } + } + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierRssiCfgGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxCarrierMask_t * const rxCarrierMask, + adi_adrv904x_RxCarrierRssiCfg_t * const rxCarrierRssiCfg) + +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t carrierIdx = 0U; + uint8_t bfValue = 0U; + + adrv904x_BfCddcFuncsChanAddr_e cddcFuncsChanBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxCarrierRssiCfg, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxCarrierMask, cleanup); + + switch (rxCarrierMask->carrierMask) + { + case ADI_ADRV904X_RX_CARRIER_0: + carrierIdx = 0U; + break; + case ADI_ADRV904X_RX_CARRIER_1: + carrierIdx = 1U; + break; + case ADI_ADRV904X_RX_CARRIER_2: + carrierIdx = 2U; + break; + case ADI_ADRV904X_RX_CARRIER_3: + carrierIdx = 3U; + break; + case ADI_ADRV904X_RX_CARRIER_4: + carrierIdx = 4U; + break; + case ADI_ADRV904X_RX_CARRIER_5: + carrierIdx = 5U; + break; + case ADI_ADRV904X_RX_CARRIER_6: + carrierIdx = 6U; + break; + case ADI_ADRV904X_RX_CARRIER_7: + carrierIdx = 7U; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxCarrierMask->carrierMask, + "Invalid Rx carrier selection"); + goto cleanup; + break; + } + + if ((rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX0) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX1) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX2) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX3) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX4) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX5) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX6) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX7)) + { + /* Invalid Rx channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxCarrierMask->rxChannelMask, "Invalid Rx channel selection"); + goto cleanup; + } + + /* Read out the configurations */ + /* Convert the rxSel to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_CddcFuncsBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(rxCarrierMask->rxChannelMask), &cddcFuncsChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxCarrierMask->rxChannelMask, "Invalid Rx Channel used to determine SPI address"); + goto cleanup; + } + + /* rssi_mode */ + recoveryAction = adrv904x_CddcFuncs_RssiMode_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting rssi measurement mode selection"); + goto cleanup; + } + rxCarrierRssiCfg->measMode = (adi_adrv904x_RxCarrierRssiMeasMode_e)bfValue; + + /* rssi_start_delay */ + recoveryAction = adrv904x_CddcFuncs_RssiStartDelay_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &rxCarrierRssiCfg->startDelay); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting rssi start delay"); + goto cleanup; + } + + /* rssi_wait_delay */ + recoveryAction = adrv904x_CddcFuncs_RssiWaitDelay_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &rxCarrierRssiCfg->waitDelay); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting rssi wait delay"); + goto cleanup; + } + + /* rssi_meas_delay */ + recoveryAction = adrv904x_CddcFuncs_RssiContinuousMeasDelay_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &rxCarrierRssiCfg->pauseDelay); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting rssi pause delay"); + goto cleanup; + } + + /* rssi_default_mode */ + recoveryAction = adrv904x_CddcFuncs_RssiDefaultMode_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting rssi op mode"); + goto cleanup; + } + rxCarrierRssiCfg->opMode = (adi_adrv904x_RxCarrierRssiOpMode_e)bfValue; + + /* rssi_meas_duration */ + recoveryAction = adrv904x_CddcFuncs_RssiMeasDuration0_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &rxCarrierRssiCfg->duration0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting rssi duration 0"); + goto cleanup; + } + + recoveryAction = adrv904x_CddcFuncs_RssiMeasDuration1_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &rxCarrierRssiCfg->duration1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting rssi duration 1"); + goto cleanup; + } + + recoveryAction = adrv904x_CddcFuncs_RssiMeasDuration2_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &rxCarrierRssiCfg->duration2); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting rssi duration 2"); + goto cleanup; + } + + + recoveryAction = adrv904x_CddcFuncs_RssiMeasDuration3_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &rxCarrierRssiCfg->duration3); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting rssi duration 3"); + goto cleanup; + } + + /* rssi_mul_factor */ + recoveryAction = adrv904x_CddcFuncs_RssiMulFactor0_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &rxCarrierRssiCfg->mulFactor0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting rssi mul factor 0"); + goto cleanup; + } + + recoveryAction = adrv904x_CddcFuncs_RssiMulFactor1_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &rxCarrierRssiCfg->mulFactor1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting rssi mul factor 1"); + goto cleanup; + } + + recoveryAction = adrv904x_CddcFuncs_RssiMulFactor2_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &rxCarrierRssiCfg->mulFactor2); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting rssi mul factor 2"); + goto cleanup; + } + + recoveryAction = adrv904x_CddcFuncs_RssiMulFactor3_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &rxCarrierRssiCfg->mulFactor3); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting rssi mul factor 3"); + goto cleanup; + } + + /* rssi_reset_on_gain_change 1bit */ + recoveryAction = adrv904x_CddcFuncs_RssiResetOnGainChange_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &rxCarrierRssiCfg->resetAtGainChange); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting rssi reset at gain change"); + goto cleanup; + } + + /* rssi_pin_mode */ + recoveryAction = adrv904x_CddcFuncs_RssiPinMode_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &rxCarrierRssiCfg->fddPinMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting rssi fdd pin mode"); + goto cleanup; + } + + /* rssi_trigger_source_select 1bit */ + recoveryAction = adrv904x_CddcFuncs_RssiTriggerSourceSelect_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &rxCarrierRssiCfg->radioSeqTrigEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting rssi radio seq trig enable"); + goto cleanup; + } + + /* rssi_rs_trigger_select 3bit */ + recoveryAction = adrv904x_CddcFuncs_RssiRsTriggerSelect_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &rxCarrierRssiCfg->radioSeqTrigSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting rssi radio seq trig select"); + goto cleanup; + } + + rxCarrierRssiCfg->rxCarrierMask.carrierMask = rxCarrierMask->carrierMask; + rxCarrierRssiCfg->rxCarrierMask.rxChannelMask = rxCarrierMask->rxChannelMask; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierRssiEnable(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxCarrierMask_t * const rxCarrierMask, + const uint32_t rxCarrierEnable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t carrierIdx = 0U; + uint32_t carrierSel = 0U; + uint32_t rxIdx = 0U; + uint32_t rxSel = 0U; + uint8_t rssiEn = 0U; + + adrv904x_BfCddcFuncsChanAddr_e cddcFuncsChanBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxCarrierMask, cleanup); + + if (((rxCarrierMask->carrierMask & (~(uint32_t)ADI_ADRV904X_RX_CARRIER_ALL)) != 0U) || + (rxCarrierMask->carrierMask == (uint32_t)ADI_ADRV904X_RX_CARRIER_NONE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxCarrierMask->carrierMask, + "Invalid Rx carrier mask is selected. Valid values are any combinations of RxCarrier0/1/2/3/4/5/6/7"); + goto cleanup; + } + + if (((rxCarrierMask->rxChannelMask & (~(uint32_t)ADI_ADRV904X_RX_MASK_ALL)) != 0U) || + (rxCarrierMask->rxChannelMask == (uint32_t)ADI_ADRV904X_RXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxCarrierMask->rxChannelMask, + "Invalid Rx channel mask is selected. Valid values are any combinations of Rx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + if (((rxCarrierEnable & (~(uint32_t)ADI_ADRV904X_RX_CARRIER_ALL)) != 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxCarrierEnable, + "Invalid Rx carrier enable mask is selected. Valid values are any combinations of RxCarrier0/1/2/3/4/5/6/7"); + goto cleanup; + } + + /* Write out the enable */ + for (rxIdx = 0U; rxIdx < ADI_ADRV904X_MAX_RX_ONLY; rxIdx++) + { + rxSel = 1U << rxIdx; + if ((rxCarrierMask->rxChannelMask & rxSel) > 0) + { + /* Convert the rxSel to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_CddcFuncsBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(rxSel), &cddcFuncsChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxSel, "Invalid Rx Carrier used to determine SPI address"); + goto cleanup; + } + + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_RX_CARRIERS; carrierIdx++) + { + carrierSel = 1U << carrierIdx; + if ((rxCarrierMask->carrierMask & carrierSel) > 0) + { + rssiEn = 0U; + if ((rxCarrierEnable & carrierSel) > 0) + { + rssiEn = 1U; + } + + /* rssi_enable */ + recoveryAction = adrv904x_CddcFuncs_RssiEnable_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rssiEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting rssi enable selection"); + goto cleanup; + } + + } + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierRssiManualStart(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxCarrierMask_t * const rxCarrierMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t carrierIdx = 0U; + uint32_t carrierSel = 0U; + uint32_t rxIdx = 0U; + uint32_t rxSel = 0U; + uint8_t rssiStart = 1U; + + adrv904x_BfCddcFuncsChanAddr_e cddcFuncsChanBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxCarrierMask, cleanup); + + if (((rxCarrierMask->carrierMask & (~(uint32_t)ADI_ADRV904X_RX_CARRIER_ALL)) != 0U) || + (rxCarrierMask->carrierMask == (uint32_t)ADI_ADRV904X_RX_CARRIER_NONE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxCarrierMask->carrierMask, + "Invalid Rx carrier mask is selected. Valid values are any combinations of RxCarrier0/1/2/3/4/5/6/7"); + goto cleanup; + } + + if (((rxCarrierMask->rxChannelMask & (~(uint32_t)ADI_ADRV904X_RX_MASK_ALL)) != 0U) || + (rxCarrierMask->rxChannelMask == (uint32_t)ADI_ADRV904X_RXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxCarrierMask->rxChannelMask, + "Invalid Rx channel mask is selected. Valid values are any combinations of Rx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + /* Write out the manual start */ + for (rxIdx = 0U; rxIdx < ADI_ADRV904X_MAX_RX_ONLY; rxIdx++) + { + rxSel = 1U << rxIdx; + if ((rxCarrierMask->rxChannelMask & rxSel) > 0) + { + /* Convert the rxSel to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_CddcFuncsBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(rxSel), &cddcFuncsChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxSel, "Invalid Rx Carrier used to determine SPI address"); + goto cleanup; + } + + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_RX_CARRIERS; carrierIdx++) + { + carrierSel = 1U << carrierIdx; + if ((rxCarrierMask->carrierMask & carrierSel) > 0) + { + recoveryAction = adrv904x_CddcFuncs_RssiManualMeas_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rssiStart); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting rssi manual start"); + goto cleanup; + } + + } + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierRssiManualPause(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxCarrierMask_t * const rxCarrierMask, + const uint32_t rxCarrierPause) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t carrierIdx = 0U; + uint32_t carrierSel = 0U; + uint32_t rxIdx = 0U; + uint32_t rxSel = 0U; + uint8_t rssiPause = 0U; + + adrv904x_BfCddcFuncsChanAddr_e cddcFuncsChanBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxCarrierMask, cleanup); + + if (((rxCarrierMask->carrierMask & (~(uint32_t)ADI_ADRV904X_RX_CARRIER_ALL)) != 0U) || + (rxCarrierMask->carrierMask == (uint32_t)ADI_ADRV904X_RX_CARRIER_NONE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxCarrierMask->carrierMask, + "Invalid Rx carrier mask is selected. Valid values are any combinations of RxCarrier0/1/2/3/4/5/6/7"); + goto cleanup; + } + + if (((rxCarrierMask->rxChannelMask & (~(uint32_t)ADI_ADRV904X_RX_MASK_ALL)) != 0U) || + (rxCarrierMask->rxChannelMask == (uint32_t)ADI_ADRV904X_RXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxCarrierMask->rxChannelMask, + "Invalid Rx channel mask is selected. Valid values are any combinations of Rx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + if (((rxCarrierPause & (~(uint32_t)ADI_ADRV904X_RX_CARRIER_ALL)) != 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxCarrierPause, + "Invalid Rx carrier pause mask is selected. Valid values are any combinations of RxCarrier0/1/2/3/4/5/6/7"); + goto cleanup; + } + + + /* Write out the manual pause */ + for (rxIdx = 0U; rxIdx < ADI_ADRV904X_MAX_RX_ONLY; rxIdx++) + { + rxSel = 1U << rxIdx; + if ((rxCarrierMask->rxChannelMask & rxSel) > 0) + { + /* Convert the rxSel to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_CddcFuncsBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(rxSel), &cddcFuncsChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxSel, "Invalid Rx Carrier used to determine SPI address"); + goto cleanup; + } + + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_RX_CARRIERS; carrierIdx++) + { + carrierSel = 1U << carrierIdx; + if ((rxCarrierMask->carrierMask & carrierSel) > 0) + { + rssiPause = 0U; + if ((rxCarrierPause & carrierSel) > 0) + { + rssiPause = 1U; + } + + recoveryAction = adrv904x_CddcFuncs_RssiManualPause_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + rssiPause); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting rssi manual pause"); + goto cleanup; + } + + } + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierRssiGpioCfgSet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxCarrierRssiGpioCfg_t * const gpioCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + uint32_t chanIdx = 0U; + uint32_t carrierIdx = 0U; + adi_adrv904x_GpioSignal_e cddcSignals[ADI_ADRV904X_MAX_RX_CARRIERS_PER_CHANNEL] = { + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_0, + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_1, + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_2, + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_3, + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_4, + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_5, + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_6, + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_7 + }; + + adi_adrv904x_GpioPinSel_e pinSelect = ADI_ADRV904X_GPIO_INVALID; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gpioCfg, cleanup); + + /* Check all GPIO are valid */ + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_RX_ONLY; chanIdx++) + { + /* Check if enable pin is valid */ + if (gpioCfg->rxChannel[chanIdx].enablePin > ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid Enable GPIO pin selected. To disable, please select ADI_ADRV904X_GPIO_INVALID"); + goto cleanup; + } + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_RX_CARRIERS_PER_CHANNEL; carrierIdx++) + { + /* Check if ready pin is valid */ + if (gpioCfg->rxChannel[chanIdx].readyPin[carrierIdx] > ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, carrierIdx, "Invalid Ready GPIO pin selected. To disable, please select ADI_ADRV904X_GPIO_INVALID"); + goto cleanup; + } + } + } + + /* Release all rssi GPIO if valid */ + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_RX_ONLY; chanIdx++) + { + /* Find the signal for this gpio index */ + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_RX_CARRIERS_PER_CHANNEL; carrierIdx++) + { + recoveryAction = adrv904x_GpioSignalFind(device, &pinSelect, cddcSignals[carrierIdx], (adi_adrv904x_Channels_e)(1U << chanIdx)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + carrierIdx, + "GpioSignalFind issue"); + goto cleanup; + } + + /* Release if pinSelect is valid */ + if (pinSelect != ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = adrv904x_GpioSignalRelease(device, pinSelect, cddcSignals[carrierIdx], (adi_adrv904x_Channels_e)(1U << chanIdx)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + carrierIdx, + "GpioSignalRelease issue"); + goto cleanup; + } + } + } + + /* Find the signal for this gpio index */ + recoveryAction = adrv904x_GpioSignalFind(device, &pinSelect, ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_ENABLE, (adi_adrv904x_Channels_e)(1U << chanIdx)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + chanIdx, + "GpioSignalFind issue"); + goto cleanup; + } + + /* Release if pinSelect is valid */ + if (pinSelect != ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = adrv904x_GpioSignalRelease(device, pinSelect, ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_ENABLE, (adi_adrv904x_Channels_e)(1U << chanIdx)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + chanIdx, + "GpioSignalRelease issue"); + goto cleanup; + } + } + } + + /* Config RSSI GPIO if valid */ + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_RX_ONLY; chanIdx++) + { + /* Set if pinSelect is valid */ + if (gpioCfg->rxChannel[chanIdx].enablePin != ADI_ADRV904X_GPIO_INVALID) + { + pinSelect = gpioCfg->rxChannel[chanIdx].enablePin; + /* Set the signal for this gpio */ + recoveryAction = adrv904x_GpioSignalSet(device, pinSelect, ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_ENABLE, 1U<< chanIdx); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + chanIdx, + "GpioSignalSet issue"); + goto cleanup; + } + } + + /* Set if pinSelect is valid */ + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_RX_CARRIERS_PER_CHANNEL; carrierIdx++) + { + + if (gpioCfg->rxChannel[chanIdx].readyPin[carrierIdx] != ADI_ADRV904X_GPIO_INVALID) + { + pinSelect = gpioCfg->rxChannel[chanIdx].readyPin[carrierIdx]; + + /* Set the signal for this gpio */ + recoveryAction = adrv904x_GpioSignalSet(device, pinSelect, cddcSignals[carrierIdx], 1U << chanIdx); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + carrierIdx, + "GpioSignalSet issue"); + goto cleanup; + } + } + } + + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierRssiGpioCfgGet(adi_adrv904x_Device_t * const device, + adi_adrv904x_RxCarrierRssiGpioCfg_t * const gpioCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + uint32_t chanIdx = 0U; + uint32_t carrierIdx = 0U; + adi_adrv904x_GpioSignal_e cddcSignals[ADI_ADRV904X_MAX_RX_ONLY] = { + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_0, + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_1, + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_2, + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_3, + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_4, + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_5, + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_6, + ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_READY_7 + }; + + adi_adrv904x_GpioPinSel_e pinSelect = ADI_ADRV904X_GPIO_INVALID; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gpioCfg, cleanup); + + /* Find all rssi pin */ + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_RX_ONLY; chanIdx++) + { + /* Find the signal for this gpio index */ + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_RX_CARRIERS_PER_CHANNEL; carrierIdx++) + { + recoveryAction = adrv904x_GpioSignalFind(device, &pinSelect, cddcSignals[carrierIdx], (adi_adrv904x_Channels_e)(1U << chanIdx)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + carrierIdx, + "GpioSignalFind issue"); + goto cleanup; + } + + gpioCfg->rxChannel[chanIdx].readyPin[carrierIdx] = pinSelect; + } + + /* Find the signal for this gpio index */ + recoveryAction = adrv904x_GpioSignalFind(device, &pinSelect, ADI_ADRV904X_GPIO_SIGNAL_CDDC_RSSI_ENABLE, (adi_adrv904x_Channels_e)(1U << chanIdx)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + chanIdx, + "GpioSignalFind issue"); + goto cleanup; + } + + gpioCfg->rxChannel[chanIdx].enablePin = pinSelect; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierRssiPowerRead(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxCarrierMask_t* const rxCarrierMask, + int32_t* const gain_mdB) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t carrierIdx = 0U; + uint64_t bfValue = 0U; + adrv904x_BfCddcFuncsChanAddr_e cddcFuncsChanBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_FUNCS; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxCarrierMask, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gain_mdB, cleanup); + + switch (rxCarrierMask->carrierMask) + { + case ADI_ADRV904X_RX_CARRIER_0: + carrierIdx = 0U; + break; + case ADI_ADRV904X_RX_CARRIER_1: + carrierIdx = 1U; + break; + case ADI_ADRV904X_RX_CARRIER_2: + carrierIdx = 2U; + break; + case ADI_ADRV904X_RX_CARRIER_3: + carrierIdx = 3U; + break; + case ADI_ADRV904X_RX_CARRIER_4: + carrierIdx = 4U; + break; + case ADI_ADRV904X_RX_CARRIER_5: + carrierIdx = 5U; + break; + case ADI_ADRV904X_RX_CARRIER_6: + carrierIdx = 6U; + break; + case ADI_ADRV904X_RX_CARRIER_7: + carrierIdx = 7U; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxCarrierMask->carrierMask, + "Invalid Rx carrier selection"); + goto cleanup; + break; + } + + if ((rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX0) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX1) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX2) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX3) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX4) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX5) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX6) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX7)) + { + /* Invalid Rx channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxCarrierMask->rxChannelMask, "Invalid Rx channel selection"); + goto cleanup; + } + + /* Read out the configurations */ + /* Convert the rxSel to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_CddcFuncsBitfieldAddressGet( device, + (adi_adrv904x_RxChannels_e)(rxCarrierMask->rxChannelMask), + &cddcFuncsChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxCarrierMask->rxChannelMask, "Invalid Rx Channel used to determine SPI address"); + goto cleanup; + } + + /* rssi__latch_linear_power_readback */ + recoveryAction = adrv904x_CddcFuncs_RssiLatchLinearPowerReadback_BfSet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting rssi latch linear power readback"); + goto cleanup; + } + + /* rssi_linear_power_readback + * The BF function will read 2 32-bit registers and combine them into 64 bit bfValue value + */ + recoveryAction = adrv904x_CddcFuncs_RssiLinearPowerReadback_BfGet(device, + NULL, + cddcFuncsChanBaseAddr, + carrierIdx, + &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting rssi linear power readback"); + goto cleanup; + } + + /* The bfValue is in 0.36 bit format. Convert it to mdb */ + *gain_mdB = 10 * log10(bfValue / pow(2,36)) * 1000; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierGainAdjustSet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxCarrierMask_t * const rxCarrierMask, + const int32_t gain_mdB) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t carrierIdx = 0U; + uint32_t carrierSel = 0U; + uint32_t rxIdx = 0U; + uint32_t rxSel = 0U; + uint32_t bfValue = 0U; + const int32_t DIG_GAIN_MIN = -90000; + const int32_t DIG_GAIN_MAX = 36000; + const uint32_t DIG_GAIN_MULT = 65535U; + adrv904x_BfCddcHbDpathChanAddr_e cddcHbDpathChanBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxCarrierMask, cleanup); + + if (((rxCarrierMask->carrierMask & (~(uint32_t)ADI_ADRV904X_RX_CARRIER_ALL)) != 0U) || + (rxCarrierMask->carrierMask == (uint32_t)ADI_ADRV904X_RX_CARRIER_NONE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxCarrierMask->carrierMask, + "Invalid Rx carrier mask is selected. Valid values are any combinations of RxCarrier0/1/2/3/4/5/6/7"); + goto cleanup; + } + + if (((rxCarrierMask->rxChannelMask & (~(uint32_t)ADI_ADRV904X_RX_MASK_ALL)) != 0U) || + (rxCarrierMask->rxChannelMask == (uint32_t)ADI_ADRV904X_RXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxCarrierMask->rxChannelMask, + "Invalid Rx channel mask is selected. Valid values are any combinations of Rx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + if ((gain_mdB < DIG_GAIN_MIN) || (gain_mdB > DIG_GAIN_MAX)) + { + /* Invalid gain_mdB selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, gain_mdB, "Invalid gain_mdB selection. Valid value are from -90000mdB to 36000mdB"); + goto cleanup; + } + + /* Convert from mdB to 7.16. (reg value = 10**(value in mdB/1000/20)) * 2^16) */ + bfValue = (uint32_t)((double)pow(10, (double)gain_mdB / 1000U / 20U) * DIG_GAIN_MULT); + + /* Write out the enable */ + for (rxIdx = 0U; rxIdx < ADI_ADRV904X_MAX_RX_ONLY; rxIdx++) + { + rxSel = 1U << rxIdx; + if ((rxCarrierMask->rxChannelMask & rxSel) > 0U) + { + /* Convert the rxSel to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_CddcHbDpathBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(rxSel), &cddcHbDpathChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxSel, "Invalid Rx Carrier used to determine SPI address"); + goto cleanup; + } + + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_RX_CARRIERS; carrierIdx++) + { + carrierSel = 1U << carrierIdx; + if ((rxCarrierMask->carrierMask & carrierSel) > 0U) + { + switch (carrierSel) + { + case ADI_ADRV904X_RX_CARRIER_0: + recoveryAction = adrv904x_CddcHbDpath_CarrierGain0_BfSet(device, + NULL, + cddcHbDpathChanBaseAddr, + bfValue); + break; + case ADI_ADRV904X_RX_CARRIER_1: + recoveryAction = adrv904x_CddcHbDpath_CarrierGain1_BfSet(device, + NULL, + cddcHbDpathChanBaseAddr, + bfValue); + break; + case ADI_ADRV904X_RX_CARRIER_2: + recoveryAction = adrv904x_CddcHbDpath_CarrierGain2_BfSet(device, + NULL, + cddcHbDpathChanBaseAddr, + bfValue); + break; + case ADI_ADRV904X_RX_CARRIER_3: + recoveryAction = adrv904x_CddcHbDpath_CarrierGain3_BfSet(device, + NULL, + cddcHbDpathChanBaseAddr, + bfValue); + break; + case ADI_ADRV904X_RX_CARRIER_4: + recoveryAction = adrv904x_CddcHbDpath_CarrierGain4_BfSet(device, + NULL, + cddcHbDpathChanBaseAddr, + bfValue); + break; + case ADI_ADRV904X_RX_CARRIER_5: + recoveryAction = adrv904x_CddcHbDpath_CarrierGain5_BfSet(device, + NULL, + cddcHbDpathChanBaseAddr, + bfValue); + break; + case ADI_ADRV904X_RX_CARRIER_6: + recoveryAction = adrv904x_CddcHbDpath_CarrierGain6_BfSet(device, + NULL, + cddcHbDpathChanBaseAddr, + bfValue); + break; + case ADI_ADRV904X_RX_CARRIER_7: + recoveryAction = adrv904x_CddcHbDpath_CarrierGain7_BfSet(device, + NULL, + cddcHbDpathChanBaseAddr, + bfValue); + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxCarrierMask->carrierMask, + "Invalid Rx carrier selection"); + goto cleanup; + break; + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting carrier gain"); + goto cleanup; + } + + recoveryAction = adrv904x_CddcHbDpath_CarrierGainEnable_BfSet(device, + NULL, + cddcHbDpathChanBaseAddr, + carrierIdx, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting carrier gain enable"); + goto cleanup; + } + } + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierGainAdjustGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_RxCarrierMask_t * const rxCarrierMask, + int32_t * const gain_mdB) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValue = 0U; + const uint32_t DIG_GAIN_MULT = 65535U; + + adrv904x_BfCddcHbDpathChanAddr_e cddcHbDpathChanBaseAddr = ADRV904X_BF_SLICE_RX_0__RX_CDDC_RX_CDDC_HB_DPATH; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxCarrierMask, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gain_mdB, cleanup); + + if ((rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX0) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX1) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX2) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX3) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX4) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX5) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX6) && + (rxCarrierMask->rxChannelMask != ADI_ADRV904X_RX7)) + { + /* Invalid Rx channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxCarrierMask->rxChannelMask, "Invalid Rx channel selection"); + goto cleanup; + } + + *gain_mdB = 0; + + /* Read out the configurations */ + /* Convert the rxCarrierMask->rxChannelMask to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_CddcHbDpathBitfieldAddressGet(device, (adi_adrv904x_RxChannels_e)(rxCarrierMask->rxChannelMask), &cddcHbDpathChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxCarrierMask->rxChannelMask, "Invalid Rx Channel used to determine SPI address"); + goto cleanup; + } + + switch (rxCarrierMask->carrierMask) + { + case ADI_ADRV904X_RX_CARRIER_0: + recoveryAction = adrv904x_CddcHbDpath_CarrierGain0_BfGet(device, + NULL, + cddcHbDpathChanBaseAddr, + &bfValue); + break; + case ADI_ADRV904X_RX_CARRIER_1: + recoveryAction = adrv904x_CddcHbDpath_CarrierGain1_BfGet(device, + NULL, + cddcHbDpathChanBaseAddr, + &bfValue); + break; + case ADI_ADRV904X_RX_CARRIER_2: + recoveryAction = adrv904x_CddcHbDpath_CarrierGain2_BfGet(device, + NULL, + cddcHbDpathChanBaseAddr, + &bfValue); + break; + case ADI_ADRV904X_RX_CARRIER_3: + recoveryAction = adrv904x_CddcHbDpath_CarrierGain3_BfGet(device, + NULL, + cddcHbDpathChanBaseAddr, + &bfValue); + break; + case ADI_ADRV904X_RX_CARRIER_4: + recoveryAction = adrv904x_CddcHbDpath_CarrierGain4_BfGet(device, + NULL, + cddcHbDpathChanBaseAddr, + &bfValue); + break; + case ADI_ADRV904X_RX_CARRIER_5: + recoveryAction = adrv904x_CddcHbDpath_CarrierGain5_BfGet(device, + NULL, + cddcHbDpathChanBaseAddr, + &bfValue); + break; + case ADI_ADRV904X_RX_CARRIER_6: + recoveryAction = adrv904x_CddcHbDpath_CarrierGain6_BfGet(device, + NULL, + cddcHbDpathChanBaseAddr, + &bfValue); + break; + case ADI_ADRV904X_RX_CARRIER_7: + recoveryAction = adrv904x_CddcHbDpath_CarrierGain7_BfGet(device, + NULL, + cddcHbDpathChanBaseAddr, + &bfValue); + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxCarrierMask->carrierMask, + "Invalid Rx carrier selection"); + goto cleanup; + break; + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting Rx Carrier Gain."); + goto cleanup; + } + + if (bfValue != 0U) + { + /* Convert from 7.16 to mdB. value in mdB = (1000*20*log10(reg value/2^16)) */ + //*gain_mdB = (int32_t)(1000U * 20U * log10((double)bfValue / DIG_GAIN_MULT)); + *gain_mdB = (int32_t)(20 * log10((100000UL * (double)bfValue) / DIG_GAIN_MULT) - 100); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxDynamicCarrierCalculate(adi_adrv904x_Device_t* const device, + adi_adrv904x_CarrierJesdCfg_t* const jesdCfg, + adi_adrv904x_CarrierRadioCfg_t rxCarrierConfigs[], + const adi_adrv904x_CarrierChannelFilterApplicationSel_t rxCarrierChannelFilterApplicationSel[], + adi_adrv904x_ChannelFilterCfg_t rxCarrierChannelFilter[], + const uint32_t numCarrierProfiles, + const uint8_t useCustomFilters) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_ChannelFilterCfg_t localFilterCfg[ADI_ADRV904X_MAX_NUM_PROFILES]; + char coeffLoadBuf[sizeof(adi_adrv904x_ChannelFilterLoadMaxSize_t)]; + adi_adrv904x_ChannelFilterLoad_t* const channelFilterLoad = (adi_adrv904x_ChannelFilterLoad_t*)&coeffLoadBuf; + adi_adrv904x_CarrierReconfigSoln_t soln; + adi_adrv904x_CarrierRadioCfgCmd_t chFilterCmd; + adi_adrv904x_ChannelFilterResp_t chFilterCmdRsp; + adi_adrv904x_ChannelFilterOutputCfg_t chFilterOutput; + adi_adrv904x_ChannelFilterLoadResp_t chFilterLoadCmdRsp; + uint32_t rxIdx = 0U; + uint32_t rxSel = 0U; + uint32_t bandIdx = 0U; + uint32_t carrierIdx = 0U; + uint32_t coeffLoadIdx = 0U; + uint32_t profileIdx = 0U; + uint32_t coeffAddressOffset = 0U; + uint32_t coeffIdx = 0U; + int32_t coeffTableIdx = 0U; + const int16_t *coeffTable = NULL; + int16_t coeffTableSize = 0; + uint32_t numberOfFilterTaps = 0U; + uint8_t asymmetricFilterTaps = 0U; + + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + adi_adrv904x_RxTxLoFreqReadback_t rxTxLoReadback; + adi_adrv904x_RxNcoConfigReadbackResp_t rxRbConfig; + uint32_t currentBandCenter_kHz = 0U; + adi_adrv904x_CarrierReconfigProfileCfgOut_t* pProfileCfgOut = NULL; + adrv904x_CarrierInitialCfg_t lclInitialCfg[ADI_ADRV904X_MAX_NUM_PROFILES]; + adrv904x_CarrierInitialCfg_t* pInitialCfg = NULL; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, jesdCfg, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxCarrierConfigs, cleanup); + + ADI_LIBRARY_MEMSET(&chFilterLoadCmdRsp, 0, sizeof(chFilterLoadCmdRsp)); + ADI_LIBRARY_MEMSET(&chFilterCmd, 0, sizeof(chFilterCmd)); + ADI_LIBRARY_MEMSET(&chFilterCmdRsp, 0, sizeof(chFilterCmdRsp)); + ADI_LIBRARY_MEMSET(&chFilterOutput, 0, sizeof(chFilterOutput)); + ADI_LIBRARY_MEMSET(&soln, 0, sizeof(soln)); + ADI_LIBRARY_MEMSET(&rxTxLoReadback, 0, sizeof(rxTxLoReadback)); + ADI_LIBRARY_MEMSET(&rxRbConfig, 0, sizeof(rxRbConfig)); + ADI_LIBRARY_MEMSET(&lclInitialCfg, 0, sizeof(lclInitialCfg)); + + if (numCarrierProfiles > ADI_ADRV904X_MAX_NUM_PROFILES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numCarrierProfiles, "Up to four profiles allowed."); + goto cleanup; + } + + /* If caller is not using custom filters, they must select filter application enum */ + if (useCustomFilters == 0U) + { + /* For this option, verify that application sel array pointer is valid */ + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxCarrierChannelFilterApplicationSel, cleanup); + + /* Populate local filter data with preset */ + for (profileIdx = 0U; profileIdx < numCarrierProfiles; profileIdx++) + { + /* Clear localFilterCfg before populating */ + ADI_LIBRARY_MEMSET(&localFilterCfg[profileIdx], 0, sizeof(adi_adrv904x_ChannelFilterCfg_t)); + + /* Reset coefficient index for each profile */ + coeffIdx = 0U; + + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_CARRIERS; carrierIdx++) + { + if (rxCarrierConfigs[profileIdx].carriers[carrierIdx].enable == 1U) + { + recoveryAction = adrv904x_ChannelFilterCoefsGet( + device, + rxCarrierChannelFilterApplicationSel[profileIdx].channelFilterApplicationSel[carrierIdx], + &rxCarrierConfigs[profileIdx].carriers[carrierIdx], + &coeffTable, + &coeffTableSize, + &numberOfFilterTaps, + &asymmetricFilterTaps, + ADI_FALSE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting carrier channel filter"); + goto cleanup; + } + + for (coeffTableIdx = 0U; coeffTableIdx < coeffTableSize; coeffTableIdx++) + { + localFilterCfg[profileIdx].coeffs[coeffIdx] = coeffTable[coeffTableIdx]; + coeffIdx++; + if (coeffIdx >= ADI_ADRV904X_NUM_CF_COEFFICIENTS) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, coeffIdx, "Carrier coefficients did not fit in the space provided"); + goto cleanup; + } + } + localFilterCfg[profileIdx].carrierFilterCfg.numberOfFilterTaps[carrierIdx] = numberOfFilterTaps; + localFilterCfg[profileIdx].carrierFilterCfg.asymmetricFilterTaps[carrierIdx] = asymmetricFilterTaps; + } + } + } + } + /* Else, caller will provide their own filter configs */ + else + { + /* For this option, verify that channel filter array pointer is valid */ + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxCarrierChannelFilter, cleanup); + for (profileIdx = 0U; profileIdx < numCarrierProfiles; profileIdx++) + { + /* Copy filter cfg into local array */ + ADI_LIBRARY_MEMCPY(&localFilterCfg[profileIdx], &rxCarrierChannelFilter[profileIdx], sizeof(adi_adrv904x_ChannelFilterCfg_t)); + } + } + + /* Initialize lcl solution structure */ + recoveryAction = adrv904x_ReconfigSolutionInit(device, jesdCfg, rxCarrierConfigs, numCarrierProfiles, &soln); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Could not initialize struct"); + goto cleanup; + } + + /* Readback key values from current HW conditions , store in the pInitialCfg for each Profile (4 max) + * - adi_adrv904x_RxTxLoFreqGet() - Rx/Tx LO Frequencies + * - adi_adrv904x_RxNcoShifterGet() - Rx Band NCO and Center Freq + */ + recoveryAction = adi_adrv904x_RxTxLoFreqGet(device, + &rxTxLoReadback); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "adi_adrv904x_RxTxLoFreqGet failed"); + goto cleanup; + } + + for (profileIdx = 0U; profileIdx < numCarrierProfiles; profileIdx++) + { + /* Set convenience pointer to output profile */ + pProfileCfgOut = &soln.outputs.profileCfgs[profileIdx]; + + /* Set convenience pointer to lcl var profile of lclInitialCfg */ + pInitialCfg = &lclInitialCfg[profileIdx]; + + /* rxChannelMask should larger than 0 and less than 0x100 */ + if ((rxCarrierConfigs[profileIdx].channelMask == 0U) || + ((rxCarrierConfigs[profileIdx].channelMask & (~(uint32_t)ADI_ADRV904X_RX_MASK_ALL)) != 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxCarrierConfigs[profileIdx].channelMask, "Invalid chanSelect provided."); + goto cleanup; + } + + /* + * For each channel in this profile verify it was initialized with the same profile. + * The band settings were extracted on a channel basis. We'll find the first channel that's assigned to this profile + * and use it's band setting. Then verify the remaining channels in this profile match. + * + * */ + for (rxIdx = 0U; rxIdx < ADI_ADRV904X_MAX_RX_ONLY; rxIdx++) + { + rxSel = 1U << rxIdx; + if ((rxCarrierConfigs[profileIdx].channelMask & rxSel) > 0U) + { + if (device->initExtract.chanAssign[rxIdx] != profileIdx) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxIdx, "Channels cannot be reconfigured using a different profile than the profile select they were initialized."); + goto cleanup; + } + + for (bandIdx = 0U; bandIdx < ADI_ADRV904X_DDC_NUM_BAND; bandIdx++) + { + if (device->initExtract.rx.rxChannelCfg[rxIdx].bandSettings[bandIdx].enabled == ADI_TRUE) + { + ADI_LIBRARY_MEMSET(&rxRbConfig, 0, sizeof(rxRbConfig)); + + rxRbConfig.bandSelect = bandIdx; + rxRbConfig.chanSelect = rxSel; + + recoveryAction = adi_adrv904x_RxNcoShifterGet( device, &rxRbConfig); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "adi_adrv904x_RxNcoShifterGet failed"); + goto cleanup; + } + + currentBandCenter_kHz = rxTxLoReadback.rxFreq_Khz[rxIdx] - rxRbConfig.frequencyKhz; + + if (pInitialCfg->bandSettings[bandIdx].rfCenterFreq_kHz == 0U) + { + /* Copy the band settings but use the NCO shift value to shift the center frequency based on the current runtime settings */ + ADI_LIBRARY_MEMCPY( &(pInitialCfg->bandSettings[bandIdx]), + &(device->initExtract.rx.rxChannelCfg[rxIdx].bandSettings[bandIdx]), + sizeof(pInitialCfg->bandSettings[bandIdx])); + pInitialCfg->bandSettings[bandIdx].rfCenterFreq_kHz = currentBandCenter_kHz; + pInitialCfg->maxSlot = device->initExtract.rx.rxChannelCfg[rxIdx].maxSlot; + } + else if (pInitialCfg->bandSettings[bandIdx].rfCenterFreq_kHz != currentBandCenter_kHz) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxCarrierConfigs[profileIdx].channelMask, "Each channel in a single profile must have matching band center frequencies, e.g. all NCOs in a single profile must be the same value."); + goto cleanup; + } + } + } + } + } + + /* Sort carriers for this profile into Bands 0 vs. Band 1 based on frequencies */ + /* Will throw an error if a carrier's bw falls outside both Band's bw */ + recoveryAction = adrv904x_RxCarrierBandSorting( device, + pInitialCfg, + &rxCarrierConfigs[profileIdx], + pProfileCfgOut); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid band selection"); + goto cleanup; + } + + /* Determine new Carrier NCOs based on the new carrier center frequencies vs. the Band Center frequencies */ + recoveryAction = adrv904x_RxCarrierNcoReconfig( device, + pInitialCfg, + &rxCarrierConfigs[profileIdx], + pProfileCfgOut); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid NCO settings"); + goto cleanup; + } + + recoveryAction = adrv904x_CarrierJesdParametersCalculate( device, + pInitialCfg, + &rxCarrierConfigs[profileIdx], + pProfileCfgOut, + ADI_TRUE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid JESD settings"); + goto cleanup; + } + + /* Reset the buffer each profile. channelFilterLoad maps to this buffer */ + ADI_LIBRARY_MEMSET(&coeffLoadBuf, 0, sizeof(coeffLoadBuf)); + + /* Perform endianness correction and load channel filter coefficients */ + channelFilterLoad->coeffIdx = 0U; + for (coeffIdx = 0U; coeffIdx < ADI_ADRV904X_NUM_CF_COEFFICIENTS; coeffIdx++) + { + coeffAddressOffset = coeffLoadIdx * sizeof(int16_t); + ADI_LIBRARY_MEMCPY((void*)((uint8_t*)channelFilterLoad + sizeof(adi_adrv904x_ChannelFilterLoad_t) + coeffAddressOffset), (void*)(&localFilterCfg[profileIdx].coeffs[coeffIdx]), sizeof(int16_t)); + coeffLoadIdx++; + + /* Once we fill up enough coefficients or we're on the last coefficient send to fw and clear out the buffer */ + if ((coeffLoadIdx == ADI_ADRV904X_CHAN_FILTER_COEFF_LOAD_LEN) || (coeffIdx == (ADI_ADRV904X_NUM_CF_COEFFICIENTS - 1U))) + { + /* Using coeffLoadIdx after incremented to give us the number of coefficients actually loaded */ + channelFilterLoad->coeffNum = (uint16_t)ADRV904X_HTOCL(coeffLoadIdx); + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_LOAD_CHANNEL_FILTER_COEFFS, + (void*)channelFilterLoad, + sizeof(coeffLoadBuf), + (void*)&chFilterLoadCmdRsp, + sizeof(chFilterLoadCmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO((adrv904x_CpuErrorCode_e)chFilterLoadCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + ADI_LIBRARY_MEMSET(&coeffLoadBuf, 0, sizeof(coeffLoadBuf)); + + channelFilterLoad->coeffIdx = coeffIdx + 1; + coeffLoadIdx = 0U; + } + } + + /* Perform endianness correction and load channel filter configs */ + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_CARRIERS; carrierIdx++) + { + localFilterCfg[profileIdx].carrierFilterCfg.numberOfFilterTaps[carrierIdx] = (uint32_t)ADRV904X_HTOCL(localFilterCfg[profileIdx].carrierFilterCfg.numberOfFilterTaps[carrierIdx]); + localFilterCfg[profileIdx].carrierFilterCfg.asymmetricFilterTaps[carrierIdx] = localFilterCfg[profileIdx].carrierFilterCfg.asymmetricFilterTaps[carrierIdx]; + } + + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_LOAD_CHANNEL_FILTER_CFG, + (void*)&(localFilterCfg[profileIdx].carrierFilterCfg), + sizeof(localFilterCfg[profileIdx].carrierFilterCfg), + (void*)&chFilterLoadCmdRsp, + sizeof(chFilterLoadCmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO((adrv904x_CpuErrorCode_e)chFilterLoadCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* Create local cmd data with Endianness correction */ + chFilterCmd.carrierRadioCfg.channelMask = (uint32_t)ADRV904X_HTOCL(rxCarrierConfigs[profileIdx].channelMask); + + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_CARRIERS; carrierIdx++) + { + chFilterCmd.carrierRadioCfg.carriers[carrierIdx].enable = rxCarrierConfigs[profileIdx].carriers[carrierIdx].enable; + chFilterCmd.carrierRadioCfg.carriers[carrierIdx].sampleRate_kHz = (uint32_t)ADRV904X_HTOCL(rxCarrierConfigs[profileIdx].carriers[carrierIdx].sampleRate_kHz); + chFilterCmd.carrierRadioCfg.carriers[carrierIdx].ibw_kHz = (uint32_t)ADRV904X_HTOCL(rxCarrierConfigs[profileIdx].carriers[carrierIdx].ibw_kHz); + chFilterCmd.carrierRadioCfg.carriers[carrierIdx].centerFrequency_kHz = (uint32_t)ADRV904X_HTOCL(rxCarrierConfigs[profileIdx].carriers[carrierIdx].centerFrequency_kHz); + } + chFilterCmd.apply = 0u; + + /* Reset for each profile */ + ADI_LIBRARY_MEMSET(&chFilterCmdRsp, 0, sizeof(chFilterCmdRsp)); + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_RX_CARRIER_RECONFIGURE, + (void*)&chFilterCmd, + sizeof(chFilterCmd), + (void*)&chFilterCmdRsp, + sizeof(chFilterCmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO((adrv904x_CpuErrorCode_e)chFilterCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* Pull out necessary results from response with Endianness correction */ + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_CARRIERS; carrierIdx++) + { + chFilterOutput.numberOfFilterTaps[carrierIdx] = ADRV904X_CTOHS(chFilterCmdRsp.carrierFilterOutCfg.numberOfFilterTaps[carrierIdx]); + chFilterOutput.dataPipeStop[carrierIdx] = ADRV904X_CTOHS(chFilterCmdRsp.carrierFilterOutCfg.dataPipeStop[carrierIdx]); + chFilterOutput.bypassFilter[carrierIdx] = ADRV904X_CTOHS(chFilterCmdRsp.carrierFilterOutCfg.bypassFilter[carrierIdx]); + chFilterOutput.oddFilterTaps[carrierIdx] = ADRV904X_CTOHS(chFilterCmdRsp.carrierFilterOutCfg.oddFilterTaps[carrierIdx]); + } + + /* Calculate CDDC delays */ + recoveryAction = adrv904x_CddcDelayConfigurationCalculate( device, + &rxCarrierConfigs[profileIdx], + &chFilterOutput, + pProfileCfgOut); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue with delay calculation"); + goto cleanup; + } + + + } /* End of profile forloop */ + + + /* Store Rx solution structure to device handle. To be used in next call to Apply() stage */ + ADI_LIBRARY_MEMCPY(&device->devStateInfo.rxCarrierReconfigSoln, &soln, sizeof(adi_adrv904x_CarrierReconfigSoln_t)); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxDynamicCarrierWrite(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_CarrierRadioCfgCmd_t chFilterCmd; + adi_adrv904x_ChannelFilterResp_t chFilterCmdRsp; + adi_adrv904x_ChannelFilterOutputCfg_t chFilterOutput; + uint32_t rxIdx = 0U; + uint32_t rxSel = 0U; + uint32_t carrierIdx = 0U; + uint32_t profileIdx = 0U; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + adi_adrv904x_CarrierReconfigSoln_t* soln = NULL; + adi_adrv904x_CarrierRadioCfg_t* pProfileCfgIn = NULL; + adi_adrv904x_CarrierReconfigProfileCfgOut_t* pProfileCfgOut = NULL; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_LIBRARY_MEMSET(&chFilterCmd, 0, sizeof(chFilterCmd)); + ADI_LIBRARY_MEMSET(&chFilterCmdRsp, 0, sizeof(chFilterCmdRsp)); + ADI_LIBRARY_MEMSET(&chFilterOutput, 0, sizeof(chFilterOutput)); + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + /* Convenience pointer to soln from last Solve() call */ + soln = &device->devStateInfo.rxCarrierReconfigSoln; + + for (profileIdx = 0U; profileIdx < soln->inputs.numProfiles; profileIdx++) + { + pProfileCfgIn = &soln->inputs.profileCfgs[profileIdx]; + pProfileCfgOut = &soln->outputs.profileCfgs[profileIdx]; + + /* Create local cmd data with Endianness correction */ + chFilterCmd.carrierRadioCfg.channelMask = (uint32_t)ADRV904X_HTOCL(pProfileCfgIn->channelMask); + + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_CARRIERS; carrierIdx++) + { + chFilterCmd.carrierRadioCfg.carriers[carrierIdx].enable = pProfileCfgIn->carriers[carrierIdx].enable; + chFilterCmd.carrierRadioCfg.carriers[carrierIdx].sampleRate_kHz = (uint32_t)ADRV904X_HTOCL(pProfileCfgIn->carriers[carrierIdx].sampleRate_kHz); + chFilterCmd.carrierRadioCfg.carriers[carrierIdx].ibw_kHz = (uint32_t)ADRV904X_HTOCL(pProfileCfgIn->carriers[carrierIdx].ibw_kHz); + chFilterCmd.carrierRadioCfg.carriers[carrierIdx].centerFrequency_kHz = (uint32_t)ADRV904X_HTOCL(pProfileCfgIn->carriers[carrierIdx].centerFrequency_kHz); + } + chFilterCmd.apply = 1u; + + /* Reset for each profile */ + ADI_LIBRARY_MEMSET(&chFilterCmdRsp, 0, sizeof(chFilterCmdRsp)); + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_RX_CARRIER_RECONFIGURE, + (void*)&chFilterCmd, + sizeof(chFilterCmd), + (void*)&chFilterCmdRsp, + sizeof(chFilterCmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO((adrv904x_CpuErrorCode_e)chFilterCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + + /* Program Carrier Rx JESD Config */ + recoveryAction = adrv904x_CarrierRxJesdConfigSet( device, + pProfileCfgIn->channelMask, + pProfileCfgOut); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reconfiguring carriers"); + goto cleanup; + } + + for (rxIdx = 0U; rxIdx < ADI_ADRV904X_MAX_RX_ONLY; rxIdx++) + { + rxSel = 1U << rxIdx; + if ((pProfileCfgIn->channelMask & rxSel) > 0U) + { + recoveryAction = adrv904x_RxCarrierConfigSet( device, + rxIdx, + pProfileCfgOut); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reconfiguring carriers"); + goto cleanup; + } + + /* TPGSWE-7944: Skip following write due to BfSet bugs */ + + /* Note: The following API RxCarrierDelaySet() is reported not working. + recoveryAction = adrv904x_RxCarrierDelaySet( device, + rxIdx, + &pProfileCfgOut->delayCfg.bufferCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reconfiguring delay params"); + goto cleanup; + } + */ + + /* Update stored carrier settings */ + ADI_LIBRARY_MEMCPY(&device->initExtract.rxCarrierConfigs[rxIdx], pProfileCfgIn, sizeof(adi_adrv904x_CarrierRadioCfg_t)); + ADI_LIBRARY_MEMCPY(&device->initExtract.rx.rxChannelCfg[rxIdx].carrierRuntimeSettings, &(pProfileCfgOut->carrierCfgs), sizeof(adi_adrv904x_CarrierRuntime_t)); + } + } + } + + recoveryAction = adrv904x_CalculateRxSampleXbarSlotConfig(device, &soln->inputs.jesdCfg, &soln->outputs); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_RxJesdConfigSet( device, + &soln->outputs); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reconfiguring carriers"); + goto cleanup; + } + + /* Update stored JESD settings */ + ADI_LIBRARY_MEMCPY(&device->initExtract.rxCarrierJesdCfg, &soln->inputs.jesdCfg, sizeof(adi_adrv904x_CarrierJesdCfg_t)); + + /* Updated stored "applied" latency results */ + ADI_LIBRARY_MEMCPY( + &(device->devStateInfo.rxCarrierLatencyApplied), + &(device->devStateInfo.rxCarrierLatencySolved), + sizeof(adi_adrv904x_CarrierReconfigLatencyCfgTop_t)); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxDynamicCarrierReconfigureWithFilterSelect( adi_adrv904x_Device_t* const device, + adi_adrv904x_CarrierJesdCfg_t* const jesdCfg, + adi_adrv904x_CarrierRadioCfg_t rxCarrierConfigs[], + const adi_adrv904x_CarrierChannelFilterApplicationSel_t rxCarrierChannelFilterApplicationSel[], + const uint32_t numCarrierProfiles) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, jesdCfg, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxCarrierConfigs, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxCarrierChannelFilterApplicationSel, cleanup); + + if (numCarrierProfiles > ADI_ADRV904X_MAX_NUM_PROFILES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numCarrierProfiles, "Up to four profiles allowed."); + goto cleanup; + } + + /* Solve */ + recoveryAction = adi_adrv904x_RxDynamicCarrierCalculate(device, jesdCfg, rxCarrierConfigs, rxCarrierChannelFilterApplicationSel, NULL, numCarrierProfiles, ADI_FALSE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while calculating RxDynamicCarrier"); + goto cleanup; + } + + /* Apply */ + recoveryAction = adi_adrv904x_RxDynamicCarrierWrite(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while applying RxDynamicCarrier to HW"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxDynamicCarrierReconfigure( adi_adrv904x_Device_t* const device, + adi_adrv904x_CarrierJesdCfg_t* const jesdCfg, + adi_adrv904x_CarrierRadioCfg_t rxCarrierConfigs[], + adi_adrv904x_ChannelFilterCfg_t rxCarrierChannelFilter[], + const uint32_t numCarrierProfiles) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, jesdCfg, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxCarrierConfigs, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxCarrierChannelFilter, cleanup); + + if (numCarrierProfiles > ADI_ADRV904X_MAX_NUM_PROFILES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numCarrierProfiles, "Up to four profiles allowed."); + goto cleanup; + } + + /* Solve */ + recoveryAction = adi_adrv904x_RxDynamicCarrierCalculate(device, jesdCfg, rxCarrierConfigs, NULL, rxCarrierChannelFilter, numCarrierProfiles, ADI_TRUE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while calculating RxDynamicCarrier"); + goto cleanup; + } + + /* Apply */ + recoveryAction = adi_adrv904x_RxDynamicCarrierWrite(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while applying RxDynamicCarrier to HW"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierSettingsGet( adi_adrv904x_Device_t* const device, + const uint32_t rxChannel, + adi_adrv904x_CarrierRadioCfg_t* const rxCarrierConfigs, + adi_adrv904x_CarrierRuntime_t* const carrierRuntimeSettings) +{ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxCarrierConfigs, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, carrierRuntimeSettings, cleanup); + + ADI_LIBRARY_MEMCPY(rxCarrierConfigs, &device->initExtract.rxCarrierConfigs[rxChannel], sizeof(adi_adrv904x_CarrierRadioCfg_t)); + ADI_LIBRARY_MEMCPY(carrierRuntimeSettings, &device->initExtract.rx.rxChannelCfg[rxChannel].carrierRuntimeSettings, sizeof(adi_adrv904x_CarrierRuntime_t)); + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierJesdCfgGet( adi_adrv904x_Device_t* const device, + adi_adrv904x_CarrierJesdCfg_t * const rxCarrierJesdCfg) +{ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxCarrierJesdCfg, cleanup); + + ADI_LIBRARY_MEMCPY(rxCarrierJesdCfg, &device->initExtract.rxCarrierJesdCfg, sizeof(adi_adrv904x_CarrierJesdCfg_t)); + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxCarrierLatencyGet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + adi_adrv904x_CarrierReconfigLatencyCfg_t* const rxCarrierLatencyCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxCarrierLatencyCfg, cleanup); + + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7)) + { + /* Invalid Rx channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxChannel, "Invalid Rx channel selection"); + goto cleanup; + } + + + ADI_LIBRARY_MEMCPY( + rxCarrierLatencyCfg, + &(device->devStateInfo.rxCarrierLatencyApplied.channel[adrv904x_RxChannelsToId(rxChannel)]), + sizeof(adi_adrv904x_CarrierReconfigLatencyCfg_t)); + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxRssiConfigSet(adi_adrv904x_Device_t* const device, + const uint16_t meterMask, + const uint32_t channelMask, + const adi_adrv904x_RxRssiCfg_t* const pPwrMtrRssiCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adrv904x_DfeSvcCmdDfeMtrRssiConfigSet_t cmdStruct; + adrv904x_DfeSvcCmdGenericResp_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + uint8_t ddcMeter = ADI_FALSE; + uint8_t cddcMeter = ADI_FALSE; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pPwrMtrRssiCfg, cleanup); + + (void) ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + (void) ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + if ((meterMask & 0x3u) != 0u) + { + ddcMeter = ADI_TRUE; + } + if ((meterMask & 0x3FCu) != 0u) + { + cddcMeter = ADI_TRUE; + } + if ((ddcMeter == ADI_TRUE) && (cddcMeter == ADI_TRUE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + meterMask, + "Invalid RSSI meter mask (expect DDC or CDDC mask not both) "); + goto cleanup; + } + + if ((ddcMeter == ADI_FALSE) && (cddcMeter == ADI_FALSE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + meterMask, + "Invalid RSSI meter mask (cannot be 0) "); + goto cleanup; + } + + recoveryAction = adrv904x_ValidateMask((uint8_t)channelMask, 0u); /* allow multiples */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + channelMask, + "Invalid channel mask"); + goto cleanup; + } + + if (ddcMeter == ADI_TRUE) + { + if (pPwrMtrRssiCfg->gaintableStepSize > 0x3FU) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrRssiCfg->gaintableStepSize, + "RSSI gain table step size. Valid values are <= 0x3F"); + goto cleanup; + } + } + + if (pPwrMtrRssiCfg->opMode >= 2u) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrRssiCfg->opMode, + "RSSI operation mode is invalid. Valid values are 0 and 1"); + goto cleanup; + } + + if (pPwrMtrRssiCfg->measMode > 2u) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrRssiCfg->measMode, + "RSSI measurement mode is invalid. Valid values are 0 - 2"); + goto cleanup; + } + + if (pPwrMtrRssiCfg->startDelay > 0x1FFFU) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrRssiCfg->startDelay, + "RSSI startDelay is invalid. Valid values are <= 0x1FFF"); + goto cleanup; + } + + if (pPwrMtrRssiCfg->contDelay > 0x1FFFU) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrRssiCfg->contDelay, + "RSSI contDelay is invalid. Valid values are <= 0x1FFF"); + goto cleanup; + } + + if (pPwrMtrRssiCfg->waitDelay > 0xFFFFFFU) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrRssiCfg->waitDelay, + "RSSI waitDelay is invalid. Valid values are <= 0xFFFFFF"); + goto cleanup; + } + + if (pPwrMtrRssiCfg->fddPinMode > 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrRssiCfg->fddPinMode, + "RSSI fddPinMode is invalid. Valid values are 0 and 1"); + goto cleanup; + } + + if (pPwrMtrRssiCfg->duration0 > 31U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrRssiCfg->duration0, + "RSSI duration0 is invalid. Valid values are 0 - 31"); + goto cleanup; + } + + if (pPwrMtrRssiCfg->duration1 > 31U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrRssiCfg->duration1, + "RSSI duration1 is invalid. Valid values are 0 - 31"); + goto cleanup; + } + + if (pPwrMtrRssiCfg->duration2 > 31U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrRssiCfg->duration2, + "RSSI duration2 is invalid. Valid values are 0 - 31"); + goto cleanup; + } + + if (pPwrMtrRssiCfg->duration3 > 31U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrRssiCfg->duration3, + "RSSI duration3 is invalid. Valid values are 0 - 31"); + goto cleanup; + } + + cmdStruct.meterMask = meterMask; + cmdStruct.chanMask = (uint8_t)channelMask; + cmdStruct.pwrMtrRssiCfg.enableGainCalc = (uint8_t)pPwrMtrRssiCfg->enableGainCalc; + cmdStruct.pwrMtrRssiCfg.gaintableStepSize = (uint8_t)pPwrMtrRssiCfg->gaintableStepSize; + cmdStruct.pwrMtrRssiCfg.resetAtGainChange = (uint8_t)pPwrMtrRssiCfg->resetAtGainChange; + cmdStruct.pwrMtrRssiCfg.radioSeqPinModeEnable = (uint8_t)pPwrMtrRssiCfg->radioSeqPinModeEnable; + cmdStruct.pwrMtrRssiCfg.opMode = (uint8_t)pPwrMtrRssiCfg->opMode; + cmdStruct.pwrMtrRssiCfg.measMode = (uint8_t)pPwrMtrRssiCfg->measMode; + cmdStruct.pwrMtrRssiCfg.startDelay = (uint16_t)ADRV904X_HTOCS(pPwrMtrRssiCfg->startDelay); + cmdStruct.pwrMtrRssiCfg.contDelay = (uint16_t)ADRV904X_HTOCS(pPwrMtrRssiCfg->contDelay); + cmdStruct.pwrMtrRssiCfg.waitDelay = (uint32_t)ADRV904X_HTOCL(pPwrMtrRssiCfg->waitDelay); + cmdStruct.pwrMtrRssiCfg.fddPinMode = (uint8_t)pPwrMtrRssiCfg->fddPinMode; + cmdStruct.pwrMtrRssiCfg.duration0 = (uint8_t)pPwrMtrRssiCfg->duration0; + cmdStruct.pwrMtrRssiCfg.duration1 = (uint8_t)pPwrMtrRssiCfg->duration1; + cmdStruct.pwrMtrRssiCfg.duration2 = (uint8_t)pPwrMtrRssiCfg->duration2; + cmdStruct.pwrMtrRssiCfg.duration3 = (uint8_t)pPwrMtrRssiCfg->duration3; + cmdStruct.pwrMtrRssiCfg.mulFactor0 = (uint16_t)ADRV904X_HTOCS(pPwrMtrRssiCfg->mulFactor0); + cmdStruct.pwrMtrRssiCfg.mulFactor1 = (uint16_t)ADRV904X_HTOCS(pPwrMtrRssiCfg->mulFactor1); + cmdStruct.pwrMtrRssiCfg.mulFactor2 = (uint16_t)ADRV904X_HTOCS(pPwrMtrRssiCfg->mulFactor2); + cmdStruct.pwrMtrRssiCfg.mulFactor3 = (uint16_t)ADRV904X_HTOCS(pPwrMtrRssiCfg->mulFactor3); + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_RSSI_CONFIG_SET, + (uint8_t*)&cmdStruct, + sizeof(cmdStruct), + (uint8_t*)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(respStruct.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxRssiConfigGet(adi_adrv904x_Device_t* const device, + const uint16_t meterSel, + const uint32_t channelSel, + adi_adrv904x_RxRssiCfg_t* const pPwrMtrRssiCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adrv904x_DfeSvcCmdDfeMtrRssiConfigGet_t cmdStruct; + adrv904x_DfeSvcCmdDfeMtrRssiConfigGetResp_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcDfePwrMtrRssiCfg_t *pPwrMtrRssiCfgResp = &respStruct.pwrMtrRssiCfg; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pPwrMtrRssiCfg, cleanup); + + (void) ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + (void) ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + /* Only one meter allowed */ + if (!((meterSel == 0x001u) || /* DDC_0 */ + (meterSel == 0x002u) || /* DDC_1 */ + (meterSel == 0x004u) || /* CDDC_0 */ + (meterSel == 0x008u) || /* CDDC_1 */ + (meterSel == 0x010u) || /* CDDC_2 */ + (meterSel == 0x020u) || /* CDDC_3 */ + (meterSel == 0x040u) || /* CDDC_4 */ + (meterSel == 0x080u) || /* CDDC_5 */ + (meterSel == 0x100u) || /* CDDC_6 */ + (meterSel == 0x200u))) /* CDDC_7 */ + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + meterSel, + "Invalid meter type - only expect one meter"); + goto cleanup; + } + + recoveryAction = adrv904x_ValidateMask((uint8_t)channelSel, 1u); /* don't allow multiples */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + channelSel, + "Invalid channel mask"); + goto cleanup; + } + + cmdStruct.meterMask = meterSel; + cmdStruct.chanMask = channelSel; + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_RSSI_CONFIG_GET, + (uint8_t*)&cmdStruct, + sizeof(cmdStruct), + (uint8_t*)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(respStruct.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + pPwrMtrRssiCfg->channelMask = (uint8_t)channelSel; + pPwrMtrRssiCfg->enableGainCalc = (uint8_t)pPwrMtrRssiCfgResp->enableGainCalc; + pPwrMtrRssiCfg->gaintableStepSize = (uint8_t)pPwrMtrRssiCfgResp->gaintableStepSize; + pPwrMtrRssiCfg->resetAtGainChange = (uint8_t)pPwrMtrRssiCfgResp->resetAtGainChange; + pPwrMtrRssiCfg->radioSeqPinModeEnable = (uint8_t)pPwrMtrRssiCfgResp->radioSeqPinModeEnable; + pPwrMtrRssiCfg->opMode = (adi_adrv904x_RxDdcRssiOpMode_e)pPwrMtrRssiCfgResp->opMode; + pPwrMtrRssiCfg->measMode = (adi_adrv904x_RxDdcRssiMeasMode_e)pPwrMtrRssiCfgResp->measMode; + pPwrMtrRssiCfg->startDelay = (uint16_t)ADRV904X_HTOCS(pPwrMtrRssiCfgResp->startDelay); + pPwrMtrRssiCfg->contDelay = (uint16_t)ADRV904X_HTOCS(pPwrMtrRssiCfgResp->contDelay); + pPwrMtrRssiCfg->waitDelay = (uint32_t)ADRV904X_HTOCL(pPwrMtrRssiCfgResp->waitDelay); + pPwrMtrRssiCfg->fddPinMode = (uint8_t)pPwrMtrRssiCfgResp->fddPinMode; + pPwrMtrRssiCfg->duration0 = (uint8_t)pPwrMtrRssiCfgResp->duration0; + pPwrMtrRssiCfg->duration1 = (uint8_t)pPwrMtrRssiCfgResp->duration1; + pPwrMtrRssiCfg->duration2 = (uint8_t)pPwrMtrRssiCfgResp->duration2; + pPwrMtrRssiCfg->duration3 = (uint8_t)pPwrMtrRssiCfgResp->duration3; + pPwrMtrRssiCfg->mulFactor0 = (uint16_t)ADRV904X_HTOCS(pPwrMtrRssiCfgResp->mulFactor0); + pPwrMtrRssiCfg->mulFactor1 = (uint16_t)ADRV904X_HTOCS(pPwrMtrRssiCfgResp->mulFactor1); + pPwrMtrRssiCfg->mulFactor2 = (uint16_t)ADRV904X_HTOCS(pPwrMtrRssiCfgResp->mulFactor2); + pPwrMtrRssiCfg->mulFactor3 = (uint16_t)ADRV904X_HTOCS(pPwrMtrRssiCfgResp->mulFactor3); + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxRssiEnable(adi_adrv904x_Device_t* const device, + const uint16_t meterMask, + const uint32_t channelMask, + const uint8_t enable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adrv904x_DfeSvcCmdDfeMtrRssiEnable_t cmdStruct; + adrv904x_DfeSvcCmdGenericResp_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + (void) ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + (void) ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + if ((meterMask == 0u) || (meterMask > 0x3FF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + meterMask, + "Invalid meter mask - expect 0x1 to 0x3FF"); + goto cleanup; + } + + /* Validate channelMask */ + recoveryAction = adrv904x_ValidateMask((uint8_t)channelMask, 0u); /* allow multiples */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + channelMask, + "Invalid channel mask"); + goto cleanup; + } + + + cmdStruct.meterMask = meterMask; + cmdStruct.chanMask = channelMask; + cmdStruct.enable = enable; + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_RSSI_ENABLE, + (uint8_t*)&cmdStruct, + sizeof(cmdStruct), + (uint8_t*)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(respStruct.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxRssiReadBack(adi_adrv904x_Device_t* const device, + const uint16_t meterSel, + const uint32_t channelSel, + float* const pPwrMeasDb, + float* const pPwrMeasLinear) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adrv904x_DfeSvcCmdDfeMtrRssiReadback_t cmdStruct; + adrv904x_DfeSvcCmdDfeMtrRssiReadbackResp_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + (void) ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + (void) ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pPwrMeasDb, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pPwrMeasLinear, cleanup) + + /* Only one meter allowed */ + if (!((meterSel == 0x001u) || /* DDC_0 */ + (meterSel == 0x002u) || /* DDC_1 */ + (meterSel == 0x004u) || /* CDDC_0 */ + (meterSel == 0x008u) || /* CDDC_1 */ + (meterSel == 0x010u) || /* CDDC_2 */ + (meterSel == 0x020u) || /* CDDC_3 */ + (meterSel == 0x040u) || /* CDDC_4 */ + (meterSel == 0x080u) || /* CDDC_5 */ + (meterSel == 0x100u) || /* CDDC_6 */ + (meterSel == 0x200u))) /* CDDC_7 */ + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + meterSel, + "Invalid RSSI meter mask"); + goto cleanup; + } + + recoveryAction = adrv904x_ValidateMask((uint8_t)channelSel, 1u); /* Only one allowed */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + channelSel, + "Invalid channel mask"); + goto cleanup; + } + + cmdStruct.chanMask = channelSel; + cmdStruct.meterMask = meterSel; + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_RSSI_READBACK, + (uint8_t*)&cmdStruct, + sizeof(cmdStruct), + (uint8_t*)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(respStruct.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + if ( (respStruct.chanMask != cmdStruct.chanMask) + || (respStruct.meterMask != cmdStruct.meterMask)) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "response mismatch."); + goto cleanup; + } + + *pPwrMeasDb = (float)respStruct.pwrMeasDb / 4.0f; + *pPwrMeasLinear = 10 * log10(respStruct.pwrMeasLinear / pow(2,36)); +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_tx.c b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_tx.c new file mode 100644 index 00000000000..4138cf32d36 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_tx.c @@ -0,0 +1,8629 @@ +/** +* Copyright 2015 - 2023 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_tx.c +* \brief Contains ADRV904X features related function implementation defined in +* adi_adrv904x_tx.h +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#include "adi_adrv904x_tx.h" + +#include "../../private/include/adrv904x_tx.h" +#include "../../private/include/adrv904x_cpu.h" +#include "../../private/include/adrv904x_reg_addr_macros.h" +#include "../../private/include/adrv904x_gpio.h" +#include "../../private/include/adrv904x_radioctrl.h" +#include "../../private/include/adrv904x_stream_proc_types.h" +#include "../../private/bf/adrv904x_bf_tx_funcs.h" +#include "../../private/bf/adrv904x_bf_tx_dig.h" + +#include "adi_adrv904x_dfe_cpu.h" +#include "../../private/bf/adrv904x_bf_tx_band_duc.h" +#include "../../private/include/adrv904x_dfe_cfr.h" +#include "../../private/include/adrv904x_dfe_cpu.h" +#include "../../private/include/adrv904x_dfe_svc_cmd_t.h" +#include "../../private/include/adrv904x_dfe_svc_cmd_dfe_pwr_mtr_t.h" +#include "../../private/include/adrv904x_dfe_svc_cmd_dfe_radio_t.h" +#include "../../private/bf/adrv904x_bf_tx_dfe_dig_regs.h" +#include "../../private/bf/adrv904x_bf_cduc_hb_dpath.h" +#include "../../private/bf/adrv904x_bf_tx_dpd_act_mmr.h" +#include "../../private/include/adrv904x_carrier_reconfigure.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PUBLIC_TX + + +#define ADI_ADVRV904X_TX_DUC1_PLAYBACK_RAM_OFFSET 0x8000U /*!< DUC1 Playback RAM Offset */ +#define ADI_ADVRV904X_TX0_PLAYBACK_RAM_BASEADDR 0x60800000U /*!< Base Address of Playback RAM for TX0 */ +#define ADI_ADVRV904X_TX1_PLAYBACK_RAM_BASEADDR 0x60900000U /*!< Base Address of Playback RAM for TX1 */ +#define ADI_ADVRV904X_TX2_PLAYBACK_RAM_BASEADDR 0x60A00000U /*!< Base Address of Playback RAM for TX2 */ +#define ADI_ADVRV904X_TX3_PLAYBACK_RAM_BASEADDR 0x60B00000U /*!< Base Address of Playback RAM for TX3 */ +#define ADI_ADVRV904X_TX4_PLAYBACK_RAM_BASEADDR 0x60C00000U /*!< Base Address of Playback RAM for TX4 */ +#define ADI_ADVRV904X_TX5_PLAYBACK_RAM_BASEADDR 0x60D00000U /*!< Base Address of Playback RAM for TX5 */ +#define ADI_ADVRV904X_TX6_PLAYBACK_RAM_BASEADDR 0x60E00000U /*!< Base Address of Playback RAM for TX6 */ +#define ADI_ADVRV904X_TX7_PLAYBACK_RAM_BASEADDR 0x60F00000U /*!< Base Address of Playback RAM for TX7 */ + +#define TX_ATTEN_EDGE_TRIGGER 0U +#define TX_ATTEN_LEVEL_TRIGGER 1U +#define TX_ATTEN_TABLE_INDEX_RANGE_CHECK 33U + + +#define MAX_CDUC_NCO_FREQ_KHZ (8388607) /* 0x7FFFFF */ +#define MAX_CDUC_NCO_PHASE_DEGREES (360) + +/* Some tyepdefs and static fn ptrs to make the S0S1 Bf access manageable */ +typedef adi_adrv904x_ErrAction_e(*txAttenSetFnPtr_t)(adi_adrv904x_Device_t *device, + adi_adrv904x_SpiCache_t *spiCache, + adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t bfValue); + +typedef adi_adrv904x_ErrAction_e(*txAttenGetFnPtr_t)(adi_adrv904x_Device_t *device, + adi_adrv904x_SpiCache_t *spiCache, + adrv904x_BfCoreChanAddr_e baseAddr, + uint16_t *bfValue); + +typedef adi_adrv904x_ErrAction_e(*txAttenUpdateFnPtr_t)(adi_adrv904x_Device_t* const device, + adi_adrv904x_SpiCache_t* const spiCache, + const adrv904x_BfCoreChanAddr_e baseAddr, + const uint8_t bfValue); + +static const txAttenSetFnPtr_t txAttenChanS0S1SetFnPtrs[ADI_ADRV904X_MAX_TXCHANNELS][2] = +{ + { adrv904x_Core_Tx0AttenS0_BfSet, adrv904x_Core_Tx0AttenS1_BfSet }, + { adrv904x_Core_Tx1AttenS0_BfSet, adrv904x_Core_Tx1AttenS1_BfSet }, + { adrv904x_Core_Tx2AttenS0_BfSet, adrv904x_Core_Tx2AttenS1_BfSet }, + { adrv904x_Core_Tx3AttenS0_BfSet, adrv904x_Core_Tx3AttenS1_BfSet }, + { adrv904x_Core_Tx4AttenS0_BfSet, adrv904x_Core_Tx4AttenS1_BfSet }, + { adrv904x_Core_Tx5AttenS0_BfSet, adrv904x_Core_Tx5AttenS1_BfSet }, + { adrv904x_Core_Tx6AttenS0_BfSet, adrv904x_Core_Tx6AttenS1_BfSet }, + { adrv904x_Core_Tx7AttenS0_BfSet, adrv904x_Core_Tx7AttenS1_BfSet }, +}; + +static const txAttenGetFnPtr_t txAttenChanS0S1GetFnPtrs[ADI_ADRV904X_MAX_TXCHANNELS][2] = +{ + { adrv904x_Core_Tx0AttenS0_BfGet, adrv904x_Core_Tx0AttenS1_BfGet }, + { adrv904x_Core_Tx1AttenS0_BfGet, adrv904x_Core_Tx1AttenS1_BfGet }, + { adrv904x_Core_Tx2AttenS0_BfGet, adrv904x_Core_Tx2AttenS1_BfGet }, + { adrv904x_Core_Tx3AttenS0_BfGet, adrv904x_Core_Tx3AttenS1_BfGet }, + { adrv904x_Core_Tx4AttenS0_BfGet, adrv904x_Core_Tx4AttenS1_BfGet }, + { adrv904x_Core_Tx5AttenS0_BfGet, adrv904x_Core_Tx5AttenS1_BfGet }, + { adrv904x_Core_Tx6AttenS0_BfGet, adrv904x_Core_Tx6AttenS1_BfGet }, + { adrv904x_Core_Tx7AttenS0_BfGet, adrv904x_Core_Tx7AttenS1_BfGet }, +}; + +static const txAttenUpdateFnPtr_t txAttenChanS0S1UpdateFnPtrs[ADI_ADRV904X_MAX_TXCHANNELS][2] = +{ + { adrv904x_Core_Tx0AttenUpdateS0_BfSet, adrv904x_Core_Tx0AttenUpdateS1_BfSet }, + { adrv904x_Core_Tx1AttenUpdateS0_BfSet, adrv904x_Core_Tx1AttenUpdateS1_BfSet }, + { adrv904x_Core_Tx2AttenUpdateS0_BfSet, adrv904x_Core_Tx2AttenUpdateS1_BfSet }, + { adrv904x_Core_Tx3AttenUpdateS0_BfSet, adrv904x_Core_Tx3AttenUpdateS1_BfSet }, + { adrv904x_Core_Tx4AttenUpdateS0_BfSet, adrv904x_Core_Tx4AttenUpdateS1_BfSet }, + { adrv904x_Core_Tx5AttenUpdateS0_BfSet, adrv904x_Core_Tx5AttenUpdateS1_BfSet }, + { adrv904x_Core_Tx6AttenUpdateS0_BfSet, adrv904x_Core_Tx6AttenUpdateS1_BfSet }, + { adrv904x_Core_Tx7AttenUpdateS0_BfSet, adrv904x_Core_Tx7AttenUpdateS1_BfSet }, +}; + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenTableRead(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + const uint32_t txAttenIndexOffset, + adi_adrv904x_TxAttenTableRow_t txAttenTableRows[], + const uint32_t numTxAttenEntries) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t i = 0U; + uint32_t tableAddr = 0U; + /* Ensure alignment of cfgData */ + uint32_t cfgData32[ADI_ADRV904X_TX_ATTEN_TABLE_CACHE_MAX / 4U] = { 0U }; + uint8_t* cfgData = (uint8_t*) cfgData32; + uint32_t start = 0U; + uint32_t stop = 0U; + uint32_t data = 0U; + uint32_t offset; + uint32_t numBytesToRead = 0U; + static const uint8_t TX_ENTRY_SIZE = 4U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + tableAddr = adrv904x_txAttenAddrLookup(txChannel); + if (tableAddr == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannel, "Invalid TxChannel"); + goto cleanup; + } + + if (((device->devStateInfo.initializedChannels >> ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET) & txChannel) != txChannel) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannel, "TxChannel not initialized"); + goto cleanup; + } + + if (numTxAttenEntries == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numTxAttenEntries, "Number of TxAttenuation Entries cannot be 0"); + goto cleanup; + } + + if ((txAttenIndexOffset + numTxAttenEntries - 1U) > ADRV904X_TX_ATTEN_TABLE_MAX_IDX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numTxAttenEntries, "Request exceeds Attenuation Table Bounds"); + goto cleanup; + } + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txAttenTableRows, cleanup); + + start = 0U; + stop = 0U; + offset = (txAttenIndexOffset * TX_ENTRY_SIZE) + tableAddr; + + numBytesToRead = numTxAttenEntries * TX_ENTRY_SIZE; + if (numBytesToRead > ADI_ADRV904X_TX_ATTEN_TABLE_CACHE_MAX) + { + numBytesToRead = ADI_ADRV904X_TX_ATTEN_TABLE_CACHE_MAX; + } + + recoveryAction = adi_adrv904x_Registers32bOnlyRead(device, NULL, (offset + stop), cfgData, numBytesToRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Registers32Read Issue"); + goto cleanup; + } + + for (i = 0; i < numTxAttenEntries; i++) + { + data = *((uint32_t*)(cfgData + start)); + txAttenTableRows[i].txAttenHp = ADRV904X_BF_DECODE(data, ADRV904X_TX_ATTEN_TABLE_HP_MASK, ADRV904X_TX_ATTEN_TABLE_HP_SHIFT); + txAttenTableRows[i].txAttenMult = ADRV904X_BF_DECODE(data, ADRV904X_TX_ATTEN_TABLE_MULT_MASK, ADRV904X_TX_ATTEN_TABLE_MULT_SHIFT); + + start += TX_ENTRY_SIZE; + + if ((start >= ADI_ADRV904X_TX_ATTEN_TABLE_CACHE_MAX) && + ((i + 1U) < numTxAttenEntries)) + { + numBytesToRead = (numTxAttenEntries - (i + 1U)) * TX_ENTRY_SIZE; + if (numBytesToRead > ADI_ADRV904X_TX_ATTEN_TABLE_CACHE_MAX) + { + numBytesToRead = ADI_ADRV904X_TX_ATTEN_TABLE_CACHE_MAX; + } + + stop += start; + recoveryAction = adi_adrv904x_Registers32bOnlyRead(device, NULL, (offset + stop), cfgData, numBytesToRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Registers32Read Issue"); + goto cleanup; + } + start = 0U; + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxAtten_t txAttenuation[], + const uint32_t numTxAttenConfigs) +{ + static const uint8_t DATA_TRANSACTION_1_SIZE = 9u; + static const uint8_t DATA_TRANSACTION_2_SIZE = 6U; + static const uint8_t DATA_TRANSATCTION_FF_SIZE = 3U; + static const uint8_t CH0_START_ADDRESS = 0xB3U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_hal_Err_e halError = ADI_HAL_ERR_PARAM; + + uint32_t attenRegVal = 0U; + uint32_t i = 0U; + + /* Variables for minimum Tx attenuation range check - only for A0 and A1 silicon */ + uint16_t minAttenIndexSet = UINT16_MAX; + uint16_t attenIndex = 0U; + + uint8_t chanId = 0U; + uint8_t addrLsb = 0U; + uint8_t latchMask = 0U; + uint8_t attenLsb = 0U; + /* Hardcoded 9 byte data array for first spi transaction with placeholders for addresses and data + data1[0] : 0x01U msb of masking register address + data1[1] : 0x32U lsb of masking register address + data1[2] : 0x03U mask indicating which bits to set in target register + data1[3] : 0x01U msb of address to write + data1[4] : 0x00U PLACEHOLDER - will be replaced with msb (i.e. lsb +1 address ) corresponding to address of relevant tx channel + data1[5] : 0x00U PLACEHOLDER - will be replaced with the lsb for given tx attenuation value + data1[6] : 0x01U msb of address to write + data1[7] : 0x00U PLACEHOLDER - will be replaced with lsb corresponding to address of relevant tx channel + data1[8] : 0x00U PLACEHOLDER - will be replaced with the msb for given tx attenuation value + */ + uint8_t data1[] = { 0x01U, 0x32U, 0x03U, 0x01U, 0x00U, 0x00U, 0x01U, 0x00U, 0x00U }; + + /* Spi Transaction array data for general case of latching mask != 0xFF which does require masking register usage + data1[0] : 0x01U msb of masking register address + data1[1] : 0x32U lsb of masking register address + data1[2] : 0x00U Placeholder - to be replaced by latching mask calculated during function + data1[3] : 0x01U msb of latch register address + data1[4] : 0xD3U lsb of latch register address + data1[5] : 0x00U Placeholder - will be replaced with latch mask value calculated in function + */ + uint8_t data2[] = { 0x01U, 0x32U, 0x00U, 0x01U, 0xD3U, 0x00U }; + /* Spi Transaction array data for special case of latching mask == 0xFF (all channels) which does not require masking register + dataFF[0] : 0x01U msb of latch register address + dataFF[1] : 0xD3U lsb of latch register address + dataFF[2] : 0x00U Placeholder - will be replaced with latch mask value calculated in function + */ + uint8_t dataFF[] = { 0x01U, 0xD3U, 0x00U }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txAttenuation, cleanup); + + if (numTxAttenConfigs == 0U) + { + /* no valid configs */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numTxAttenConfigs, "Invalid Number of TxAttentuation Configurations"); + goto cleanup; + } + + /* Loop through the number of configurations and check attenuation mode */ + for (i = 0U; i < numTxAttenConfigs; ++i) + { + if (txAttenuation[i].txAttenuation_mdB > ADRV904X_TX_ATTEN_VALUE_MILLI_DB_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txAttenuation[i].txAttenuation_mdB, + "Invalid txAttenuation_mdB value"); + goto cleanup; + } + + /*Check that if requested Tx Channel valid*/ + if (((txAttenuation[i].txChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || + (txAttenuation[i].txChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txAttenuation[i].txChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + } + + /* Loop through the number of configurations passed */ + for (i = 0U; i < numTxAttenConfigs; ++i) + { + /* for each Tx channel in chanMask */ + for (chanId = 0U; chanId <= ADI_ADRV904X_TX_CHAN_ID_MAX; ++chanId) + { + if ((txAttenuation[i].txChannelMask & (1U << chanId)) == 0U) + { + /* Skip channel. It's not in chanMask. */ + continue; + } + + /* Conversion from the requested atten level (milli-dB) to equivalent + * TxAttenTable index is always done based on a step size of 0.05. + * This also means the register value to be programmed equals the + * atten table index. Other step sizes are not supported. */ + attenIndex = (txAttenuation[i].txAttenuation_mdB / ADRV904X_TX_ATTEN_STEP_SIZE_DIV_0P05); + attenRegVal = attenIndex; + if (attenIndex < minAttenIndexSet) + { + minAttenIndexSet = attenIndex; + } + + /* Calculate address based on channel id */ + addrLsb = CH0_START_ADDRESS + (chanId << 2U); + /* Isolate Lsb for data to write */ + attenLsb = (uint8_t)(attenRegVal - ((attenRegVal >> 8U) << 8U)); + /* pack placeholders in spi data1 array */ + data1[4U] = (uint8_t)(addrLsb + 1U); + data1[5U] = (uint8_t)(attenRegVal >> 8U); + data1[7U] = addrLsb; + data1[8U] = attenLsb; + halError = adi_hal_SpiWrite(device->common.devHalInfo, data1, DATA_TRANSACTION_1_SIZE); + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_ErrCodeConvert(halError); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + data1, + "Error writing tx atten values"); + goto cleanup; + } + + /* build mask for latching only selected channel latches */ + latchMask |= 1U << chanId; + } + } + /* Special Case where mask of 0xFF does not require a masking register to be wrote first */ + if (latchMask == 0xFFU) + { + dataFF[2U] = latchMask; + halError = adi_hal_SpiWrite(device->common.devHalInfo, dataFF, DATA_TRANSATCTION_FF_SIZE); + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_ErrCodeConvert(halError); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dataFF, + "Error writing Attenuation Latch Value"); + goto cleanup; + } + } + else + { + data2[2U] = latchMask; + data2[5U] = latchMask; + halError = adi_hal_SpiWrite(device->common.devHalInfo, data2, DATA_TRANSACTION_2_SIZE); + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_ErrCodeConvert(halError); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + data2, + "Error writing Attenuation Latch Value"); + goto cleanup; + } + } +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); + +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_TxAtten_t * const txAttenuation) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint16_t txAttenReadBack = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txAttenuation, cleanup); + + switch (txChannel) + { + case ADI_ADRV904X_TX0: + recoveryAction = adrv904x_Core_Tx0AttenS0_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &txAttenReadBack); + break; + + case ADI_ADRV904X_TX1: + recoveryAction = adrv904x_Core_Tx1AttenS0_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &txAttenReadBack); + break; + + case ADI_ADRV904X_TX2: + recoveryAction = adrv904x_Core_Tx2AttenS0_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &txAttenReadBack); + break; + + case ADI_ADRV904X_TX3: + recoveryAction = adrv904x_Core_Tx3AttenS0_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &txAttenReadBack); + break; + + case ADI_ADRV904X_TX4: + recoveryAction = adrv904x_Core_Tx4AttenS0_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &txAttenReadBack); + break; + + case ADI_ADRV904X_TX5: + recoveryAction = adrv904x_Core_Tx5AttenS0_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &txAttenReadBack); + break; + + case ADI_ADRV904X_TX6: + recoveryAction = adrv904x_Core_Tx6AttenS0_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &txAttenReadBack); + break; + + case ADI_ADRV904X_TX7: + recoveryAction = adrv904x_Core_Tx7AttenS0_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &txAttenReadBack); + break; + + case ADI_ADRV904X_TXOFF: /* Fall Through */ + case ADI_ADRV904X_TXALL: + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + txChannel, + "Invalid TxChannel"); + goto cleanup; + break; + + } + + /* API Call Check for all Switch Statement */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + txChannel, + "Failure to Read Tx Attenuation for Given Channel"); + goto cleanup; + } + + + /* Convert from atten table index to milli dB */ + txAttenuation->txAttenuation_mdB = (txAttenReadBack * ADRV904X_TX_ATTEN_STEP_SIZE_DIV_0P05); + txAttenuation->txChannelMask = txChannel; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxNcoShifterSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxNcoMixConfig_t * const txNcoConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_TxNcoMixConfig_t txNcoInfo; + adrv904x_TxNcoMixConfigResp_t cmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + uint32_t cpuTypeIdx = 0U; + uint8_t channelMaskRet = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txNcoConfig, cleanup); + + ADI_LIBRARY_MEMSET(&txNcoInfo, 0, sizeof(txNcoInfo)); + ADI_LIBRARY_MEMSET(&cmdRsp, 0, sizeof(cmdRsp)); + + if (txNcoConfig->chanSelect == 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txNcoConfig->chanSelect, "Invalid chanSelect provided."); + goto cleanup; + } + + + if (txNcoConfig->bandSelect > 1U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txNcoConfig->bandSelect, "Invalid bandSelect provided."); + goto cleanup; + } + + if (txNcoConfig->enable > 1U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txNcoConfig->enable, "Invalid enable provided."); + goto cleanup; + } + + /* Prepare the command payload */ + txNcoInfo.chanSelect = (uint8_t) txNcoConfig->chanSelect; + + txNcoInfo.bandSelect = (uint8_t) txNcoConfig->bandSelect; + + txNcoInfo.enable = (uint8_t) txNcoConfig->enable; + txNcoInfo.phase = (uint32_t) ADRV904X_HTOCL(txNcoConfig->phase); + txNcoInfo.frequencyKhz = (int32_t) ADRV904X_HTOCL(txNcoConfig->frequencyKhz); + + /* For each CPU, send the command, wait for a response, and process any errors. + * Only the CPU that owns this channel will set chanSelect in its response. + */ + for (cpuTypeIdx = 0U; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend(device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_TX_MIX_NCO, + (void*)&txNcoInfo, + sizeof(txNcoInfo), + (void*)&cmdRsp, + sizeof(cmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(cmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + channelMaskRet |= cmdRsp.chanSelect; + if (channelMaskRet == txNcoInfo.chanSelect) + { + break; /* Commands are done */ + } + } + + /* The above loop should always break before cpuTypeIdx reaches ADI_ADRV904X_CPU_TYPE_MAX_RADIO */ + if (cpuTypeIdx >= ADI_ADRV904X_CPU_TYPE_MAX_RADIO) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMaskRet, "FW did not execute cmd on all channels requested"); + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxNcoShifterGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_TxNcoMixConfigReadbackResp_t* const txRbConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_TxNcoMixConfigReadback_t txNcoCfgRbCmd; + adi_adrv904x_TxNcoMixConfigReadbackResp_t txNcoCfgGetCmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_NO_ERROR; + uint32_t cpuType = 0U; + uint32_t chIdx = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txRbConfig, cleanup); + + ADI_LIBRARY_MEMSET(&txNcoCfgRbCmd, 0, sizeof(txNcoCfgRbCmd)); + ADI_LIBRARY_MEMSET(&txNcoCfgGetCmdRsp, 0, sizeof(txNcoCfgGetCmdRsp)); + + /* Testing if channel mask has more than two channels activated*/ + if (txRbConfig->chanSelect == (uint8_t) ADI_ADRV904X_TXOFF || + txRbConfig->chanSelect > (uint8_t) ADI_ADRV904X_TX7 || + (((txRbConfig->chanSelect - 1) & txRbConfig->chanSelect) != 0U)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txRbConfig->chanSelect, "Invalid chanSelect provided."); + goto cleanup; + } + + /* Get CPU assigned to this channel */ + for (chIdx = 0U; chIdx < ADI_ADRV904X_MAX_CHANNELS; chIdx++) + { + if (txRbConfig->chanSelect == ((uint8_t)1U << chIdx)) + { + cpuType = device->initExtract.rxTxCpuConfig[chIdx]; + break; + } + } + + /* Prepare the command payload */ + txNcoCfgRbCmd.chanSelect = (uint8_t) txRbConfig->chanSelect; + + + txNcoCfgRbCmd.bandSelect = (uint8_t) txRbConfig->bandSelect; + if (txNcoCfgRbCmd.bandSelect > 1U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txNcoCfgRbCmd.bandSelect, "Invalid bandSelect provided."); + goto cleanup; + } + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend(device, + (adi_adrv904x_CpuType_e)cpuType, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_GET_TX_MIX_NCO, + (void*)&txNcoCfgRbCmd, + sizeof(txNcoCfgRbCmd), + (void*)&txNcoCfgGetCmdRsp, + sizeof(txNcoCfgGetCmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO((adrv904x_CpuErrorCode_e)txNcoCfgGetCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup) ; + } + + if (txNcoCfgGetCmdRsp.chanSelect == txNcoCfgRbCmd.chanSelect) + { + /* Extract the command-specific response from the response payload */ + txRbConfig->enable = (uint8_t) txNcoCfgGetCmdRsp.enable; + txRbConfig->phase = (uint32_t) ADRV904X_CTOHL(txNcoCfgGetCmdRsp.phase); + txRbConfig->frequencyKhz = (int32_t) ADRV904X_CTOHL(txNcoCfgGetCmdRsp.frequencyKhz); + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txRbConfig->chanSelect, "Channel is not handled by the CPU"); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxTestToneSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxTestNcoConfig_t * const txNcoConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_TxTestNcoConfig_t txNcoInfo; + adrv904x_TxTestNcoConfigResp_t cmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + uint32_t cpuTypeIdx = 0U; + uint8_t channelMaskRet = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txNcoConfig, cleanup); + ADI_LIBRARY_MEMSET(&txNcoInfo, 0, sizeof(txNcoInfo)); + ADI_LIBRARY_MEMSET(&cmdRsp, 0, sizeof(cmdRsp)); + + if (txNcoConfig->chanSelect == 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txNcoConfig->chanSelect, "Invalid chanSelect provided."); + goto cleanup; + } + + + if (txNcoConfig->bandSelect > 1U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txNcoConfig->bandSelect, "Invalid bandSelect provided."); + goto cleanup; + } + + if (txNcoConfig->ncoSelect >= ADI_ADRV904X_TX_TEST_NCO_MAX_NUM) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txNcoConfig->ncoSelect, "Invalid ncoSelect provided."); + goto cleanup; + } + + if (txNcoConfig->enable > 1U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txNcoConfig->enable, "Invalid enable provided."); + goto cleanup; + } + + if (txNcoConfig->attenCtrl >= ADI_ADRV904X_TX_TEST_NCO_ATTEN_MAX_NUM) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txNcoConfig->attenCtrl, "Invalid attenCtrl provided."); + goto cleanup; + } + + /* Prepare the command payload */ + txNcoInfo.chanSelect = (uint8_t) txNcoConfig->chanSelect; + + txNcoInfo.bandSelect = (uint8_t) txNcoConfig->bandSelect; + + txNcoInfo.ncoSelect = (adi_adrv904x_TxTestNcoSelect_t) txNcoConfig->ncoSelect; + txNcoInfo.enable = (uint8_t) txNcoConfig->enable; + txNcoInfo.phase = (uint32_t) ADRV904X_HTOCL(txNcoConfig->phase); + txNcoInfo.frequencyKhz = (int32_t) ADRV904X_HTOCL(txNcoConfig->frequencyKhz); + txNcoInfo.attenCtrl = (adi_adrv904x_TxTestNcoAtten_t) txNcoConfig->attenCtrl; + + /* For each CPU, send the command, wait for a response, and process any errors. + * Only the CPU that owns this channel will set chanSelect in its response. + */ + for (cpuTypeIdx = 0U; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend(device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_TX_TEST_NCO, + (void*)&txNcoInfo, + sizeof(txNcoInfo), + (void*)&cmdRsp, + sizeof(cmdRsp), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(cmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + channelMaskRet |= cmdRsp.chanSelect; + if (channelMaskRet == txNcoInfo.chanSelect) + { + break; /* Commands are done */ + } + } + + /* The above loop should always break before cpuTypeIdx reaches ADI_ADRV904X_CPU_TYPE_MAX_RADIO */ + if (cpuTypeIdx >= ADI_ADRV904X_CPU_TYPE_MAX_RADIO) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMaskRet, "FW did not execute cmd on all channels requested"); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxTestToneGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_TxTestNcoConfigReadbackResp_t* const txRbConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_TxTestNcoConfigReadback_t txNcoCfgRbCmd; + adi_adrv904x_TxTestNcoConfigReadbackResp_t txNcoCfgGetCmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + uint32_t cpuTypeIdx = 0U; + uint8_t channelMaskRet = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txRbConfig, cleanup); + + ADI_LIBRARY_MEMSET(&txNcoCfgRbCmd, 0, sizeof(txNcoCfgRbCmd)); + ADI_LIBRARY_MEMSET(&txNcoCfgGetCmdRsp, 0, sizeof(txNcoCfgGetCmdRsp)); + + /* Testing if channel mask has more than two channels activated*/ + if (txRbConfig->chanSelect == (uint8_t) ADI_ADRV904X_TXOFF || + txRbConfig->chanSelect > (uint8_t) ADI_ADRV904X_TX7 || + (((txRbConfig->chanSelect - 1) & txRbConfig->chanSelect) != 0U)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txRbConfig->chanSelect, "Invalid chanSelect provided."); + goto cleanup; + } + + + + if (txRbConfig->bandSelect > 1U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txRbConfig->bandSelect, "Invalid bandSelect provided."); + goto cleanup; + } + + if (txRbConfig->ncoSelect >= ADI_ADRV904X_TX_TEST_NCO_MAX_NUM) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txRbConfig->ncoSelect, "Invalid ncoSelect provided."); + goto cleanup; + } + + /* Prepare the command payload */ + txNcoCfgRbCmd.chanSelect = (uint8_t) txRbConfig->chanSelect; + + txNcoCfgRbCmd.bandSelect = (uint8_t) txRbConfig->bandSelect; + txNcoCfgRbCmd.ncoSelect = (adi_adrv904x_TxTestNcoSelect_t) txRbConfig->ncoSelect; + + /* For each CPU, send the command, wait for a response, and process any errors. + * Only the CPU that owns this channel will set chanSelect in its response. + */ + for (cpuTypeIdx = 0U; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend(device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_GET_TX_TEST_NCO, + (void*)&txNcoCfgRbCmd, + sizeof(txNcoCfgRbCmd), + (void*)&txNcoCfgGetCmdRsp, + sizeof(txNcoCfgGetCmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO((adrv904x_CpuErrorCode_e)txNcoCfgGetCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + channelMaskRet = txNcoCfgGetCmdRsp.chanSelect; + if (channelMaskRet == txNcoCfgRbCmd.chanSelect) + { + /* Extract the command-specific response from the response payload */ + txRbConfig->chanSelect = (uint8_t)txNcoCfgGetCmdRsp.chanSelect; + + txRbConfig->bandSelect = (uint8_t)txNcoCfgGetCmdRsp.bandSelect; + txRbConfig->bandSelect = 0; + txRbConfig->ncoSelect = (uint8_t) txNcoCfgGetCmdRsp.ncoSelect; + txRbConfig->enabled = (uint8_t) txNcoCfgGetCmdRsp.enabled; + txRbConfig->attenCtrl = txNcoCfgGetCmdRsp.attenCtrl; + txRbConfig->phase = (uint32_t) ADRV904X_CTOHL(txNcoCfgGetCmdRsp.phase); + txRbConfig->frequencyKhz = (int32_t) ADRV904X_CTOHL(txNcoCfgGetCmdRsp.frequencyKhz); + break; /* Commands are done */ + } + } + + /* The above loop should always break before cpuTypeIdx reaches ADI_ADRV904X_CPU_TYPE_MAX_RADIO */ + if (cpuTypeIdx >= ADI_ADRV904X_CPU_TYPE_MAX_RADIO) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMaskRet, "FW did not execute cmd on all channels requested"); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxCducNcoSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxCducNcoConfig_t * const txCducNcoConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_TxCducNcoConfig_t txNcoInfo; + adrv904x_TxNcoCducConfigResp_t cmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + uint32_t cpuTypeIdx = 0U; + uint8_t channelMaskRet = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txCducNcoConfig, cleanup); + + ADI_LIBRARY_MEMSET(&txNcoInfo, 0, sizeof(txNcoInfo)); + ADI_LIBRARY_MEMSET(&cmdRsp, 0, sizeof(cmdRsp)); + + if (txCducNcoConfig->chanSelect == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txCducNcoConfig->chanSelect, "Invalid chanSelect provided."); + goto cleanup; + } + + if (txCducNcoConfig->carrierSelect == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txCducNcoConfig->carrierSelect, "Invalid carrier provided."); + goto cleanup; + } + + recoveryAction = adrv904x_TxCducCarrierCheck(device, txCducNcoConfig->chanSelect, txCducNcoConfig->carrierSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "TxCducCarrierCheck issue"); + goto cleanup; + } + + if (txCducNcoConfig->enable > 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txCducNcoConfig->enable, "Invalid enable provided."); + goto cleanup; + } + + if (txCducNcoConfig->phase > MAX_CDUC_NCO_PHASE_DEGREES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txCducNcoConfig->phase, "Invalid phase provided."); + goto cleanup; + } + + if ((txCducNcoConfig->frequencyKhz > MAX_CDUC_NCO_FREQ_KHZ) || + (txCducNcoConfig->frequencyKhz < -MAX_CDUC_NCO_FREQ_KHZ)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txCducNcoConfig->frequencyKhz, "Invalid frequency provided."); + goto cleanup; + } + + /* Prepare the command payload */ + txNcoInfo.chanSelect = (uint8_t) txCducNcoConfig->chanSelect; + txNcoInfo.carrierSelect = (uint8_t) txCducNcoConfig->carrierSelect; + txNcoInfo.enable = (uint8_t) txCducNcoConfig->enable; + txNcoInfo.phase = (uint32_t) ADRV904X_HTOCL(txCducNcoConfig->phase); + txNcoInfo.frequencyKhz = (int32_t) ADRV904X_HTOCL(txCducNcoConfig->frequencyKhz); + + /* For each CPU, send the command, wait for a response, and process any errors. + * Only the CPU that owns this channel will set chanSelect in its response. + */ + for (cpuTypeIdx = 0U; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend(device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_TX_CDUC_NCO, + (void*)&txNcoInfo, + sizeof(txNcoInfo), + (void*)&cmdRsp, + sizeof(cmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(cmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + channelMaskRet |= cmdRsp.chanSelect; + if (channelMaskRet == txNcoInfo.chanSelect) + { + break; /* Commands are done */ + } + } + + /* The above loop should always break before cpuTypeIdx reaches ADI_ADRV904X_CPU_TYPE_MAX_RADIO */ + if (cpuTypeIdx >= ADI_ADRV904X_CPU_TYPE_MAX_RADIO) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMaskRet, "FW did not execute cmd on all channels requested"); + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxCducNcoGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_TxCducNcoConfigReadbackResp_t* const txRbConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_TxCducNcoConfig_t txNcoCfgGetRbCmd; + adi_adrv904x_TxCducNcoConfigReadbackResp_t txNcoCfgGetCmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + uint32_t cpuTypeIdx = 0U; + uint8_t channelMaskRet = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txRbConfig, cleanup); + + ADI_LIBRARY_MEMSET(&txNcoCfgGetRbCmd, 0, sizeof(txNcoCfgGetRbCmd)); + ADI_LIBRARY_MEMSET(&txNcoCfgGetCmdRsp, 0, sizeof(txNcoCfgGetCmdRsp)); + + /* Test if channel mask contains one and only one channel */ + if (txRbConfig->chanSelect == (uint8_t) ADI_ADRV904X_TXOFF || + txRbConfig->chanSelect > (uint8_t) ADI_ADRV904X_TX7 || + (((txRbConfig->chanSelect - 1) & txRbConfig->chanSelect) != 0U)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txRbConfig->chanSelect, "Invalid chanSelect provided."); + goto cleanup; + } + + /* Testing if carrier mask has more than two cariers activated */ + if ((txRbConfig->carrierSelect == (uint8_t)ADI_ADRV904X_TX_CARRIER_NONE) || + (txRbConfig->carrierSelect > (uint8_t)ADI_ADRV904X_TX_CARRIER_7) || + (((txRbConfig->carrierSelect - 1) & txRbConfig->carrierSelect) != 0U)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txRbConfig->carrierSelect, "Invalid carrierSelect provided."); + goto cleanup; + } + + recoveryAction = adrv904x_TxCducCarrierCheck(device, txRbConfig->chanSelect, txRbConfig->carrierSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "TxCducCarrierCheck issue"); + goto cleanup; + } + + /* Prepare the command payload */ + txNcoCfgGetRbCmd.chanSelect = (uint8_t) txRbConfig->chanSelect; + txNcoCfgGetRbCmd.carrierSelect = (uint8_t) txRbConfig->carrierSelect; + + /* For each CPU, send the command, wait for a response, and process any errors. + * Only the CPU that owns this channel will set chanSelect in its response. + */ + for (cpuTypeIdx = 0U; cpuTypeIdx < (uint32_t) ADI_ADRV904X_CPU_TYPE_MAX_RADIO; ++cpuTypeIdx) + { + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend(device, + (adi_adrv904x_CpuType_e)cpuTypeIdx, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_GET_TX_CDUC_NCO, + (void*)&txNcoCfgGetRbCmd, + sizeof(txNcoCfgGetRbCmd), + (void*)&txNcoCfgGetCmdRsp, + sizeof(txNcoCfgGetCmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO((adrv904x_CpuErrorCode_e)txNcoCfgGetCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup) ; + } + + channelMaskRet = txNcoCfgGetCmdRsp.chanSelect; + if (channelMaskRet == txNcoCfgGetRbCmd.chanSelect) + { + /* Extract the command-specific response from the response payload */ + txRbConfig->enable = (uint8_t) txNcoCfgGetCmdRsp.enable; + txRbConfig->phase = (uint32_t) ADRV904X_CTOHL(txNcoCfgGetCmdRsp.phase); + txRbConfig->frequencyKhz = (int32_t) ADRV904X_CTOHL(txNcoCfgGetCmdRsp.frequencyKhz); + break; /* Commands are done */ + } + } + + /* The above loop should always break before cpuTypeIdx reaches ADI_ADRV904X_CPU_TYPE_MAX_RADIO */ + if (cpuTypeIdx >= ADI_ADRV904X_CPU_TYPE_MAX_RADIO) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMaskRet, "FW did not execute cmd on all channels requested"); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxPfirFracDelaySet(adi_adrv904x_Device_t* const device, + const uint8_t txChan, + const uint8_t fracDelay) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + adrv904x_DfeSvctxPfirFracDelaySet_t cmdStruct; + adrv904x_DfeSvctxPfirFracDelaySetResp_t respStruct; + + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + if (txChan >= ADI_ADRV904X_MAX_TXCHANNELS) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChan, "Invalid txChan provided."); + goto cleanup; + } + + if (fracDelay < 64) + { + /* Do nothing, fracDelay is valid. */ + } + else + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, fracDelay, "Invalid fracDelay provided."); + goto cleanup; + } + + /* Prepare the command payload */ + cmdStruct.txChannel = txChan; + cmdStruct.fracDelay = fracDelay; + + /* Send command and receive response to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_RADIO_TX_PFIR_FRAC_DELAY_SET, + (uint8_t *)&cmdStruct, + sizeof(cmdStruct), + (uint8_t *)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DfeSvcCmdSend - ctc2 frac delay set"); + goto cleanup; + } + + if (respStruct.status != ADI_ADRV904X_DFE_SVC_ERR_CODE_NO_ERROR) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, respStruct.status, "Ctc2 frac delay set status"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenS0S1Set(adi_adrv904x_Device_t* const device, + const uint32_t chanMask, + const uint32_t levelMilliDB, + const uint8_t isS0) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t chanId = 0U; + uint8_t isS1 = !isS0; + uint32_t attenRegVal = 0U; + + /* Variables for minimum Tx attenuation range check - only for A0 and A1 silicon */ + uint16_t minAttenIndexSet = UINT16_MAX; + uint16_t attenIndex = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + if ((chanMask > ADI_ADRV904X_TX_CHAN_MASK_MAX) || + (chanMask == 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + chanMask, + "Invalid channel mask"); + goto cleanup; + } + + if (levelMilliDB > ADRV904X_TX_ATTEN_VALUE_MILLI_DB_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + levelMilliDB, + "Value exceeds max attenuation value"); + goto cleanup; + } + + /* for each Tx channel in chanMask */ + for (chanId = 0U; chanId <= ADI_ADRV904X_TX_CHAN_ID_MAX; ++chanId) + { + if ((chanMask & (1U << chanId)) == 0U) + { + /* Skip channel. It's not in chanMask. */ + continue; + } + + /* ChanId is selected in chanMask */ + + /* Conversion from the requested atten level (milli-dB) to equivalent + * TxAttenTable index is always done based on a step size of 0.05. + * This also means the register value to be programmed equals the + * atten table index. Other step sizes are not supported. */ + attenIndex = (levelMilliDB / ADRV904X_TX_ATTEN_STEP_SIZE_DIV_0P05); + attenRegVal = attenIndex; + + if (attenIndex < minAttenIndexSet) + { + minAttenIndexSet = attenIndex; + } + + /* Write to the S0/S1 register */ + recoveryAction = txAttenChanS0S1SetFnPtrs[chanId][isS1](device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + attenRegVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + chanId, + "Failure to write S0/S1 TxAttenuation"); + goto cleanup; + } + + /* Latch in the S0/S1 register */ + recoveryAction = txAttenChanS0S1UpdateFnPtrs[chanId][isS1]( device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT( &device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + chanId, + "Failure to update S0/S1 TxAttenuation"); + goto cleanup; + } + } /* for each Tx channel */ +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenS0S1Get(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + uint32_t* const levelMilliDB, + const uint8_t isS0) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t isS1 = !isS0; + uint16_t attenRegVal = 0U; + uint8_t chanId = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, levelMilliDB, cleanup); + + ADI_ADRV904X_API_ENTRY(&device->common); + + chanId = adrv904x_TxChannelsToId(txChannel); + if (chanId > ADI_ADRV904X_TX_CHAN_ID_MAX) + { + ADI_PARAM_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + chanId, + "Invalid channel id"); + goto cleanup; + } + + /* Read back the S0/S1 register */ + recoveryAction = (adi_adrv904x_ErrAction_e)txAttenChanS0S1GetFnPtrs[chanId][isS1](device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &attenRegVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_API, + recoveryAction, + chanId, + "Failure to write S0/S1 TxAttenuation"); + goto cleanup; + } + + /* Conversion from the attenTableIndex read back to the equivalent + * atten level (milli-Db) is always done based on a step size of + * 0.05. Other step sizes are not supported. + */ + *levelMilliDB = attenRegVal * ADRV904X_TX_ATTEN_STEP_SIZE_DIV_0P05; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenUpdateCfgSet(adi_adrv904x_Device_t* const device, + const uint32_t chanMask, + const adi_adrv904x_TxAttenUpdateCfg_t* const cfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t chanId = 0; + uint32_t chanSel = 0U; + adrv904x_BfTxDigChanAddr_e txDigChanBaseAddr = (adrv904x_BfTxDigChanAddr_e)0U; + adrv904x_BfTxFuncsChanAddr_e txFuncsChanBaseAddr = (adrv904x_BfTxFuncsChanAddr_e)0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cfg, cleanup); + + if ((chanMask > ADI_ADRV904X_TX_CHAN_MASK_MAX) || + (chanMask == 0U)) + { + ADI_PARAM_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + chanMask, + "Invalid channel mask"); + goto cleanup; + } + + if (cfg->trgCfg.updateTrg != ADI_ADRV904X_TXATTEN_UPD_TRG_NONE && + cfg->trgCfg.updateTrg != ADI_ADRV904X_TXATTEN_UPD_TRG_SPI && + cfg->trgCfg.updateTrg != ADI_ADRV904X_TXATTEN_UPD_TRG_GPIO) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfg->trgCfg.updateTrg, + "Invalid ADI_ADRV904X_TXATTEN_UPD_TRG value"); + goto cleanup; + } + + if (cfg->srcCfg.updateSrc != ADI_ADRV904X_TXATTEN_UPD_SRC_S0 && + cfg->srcCfg.updateSrc != ADI_ADRV904X_TXATTEN_UPD_SRC_S0_OR_S1) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfg->srcCfg.updateSrc, + "Invalid ADI_ADRV904X_TXATTEN_UPD_SRC value"); + goto cleanup; + } + + /* If update is via gpio verify the trigger gpio is valid. + * Note: Due to h/w pinmux limitations pin0 cannot be routed for use as the trigger. */ + if (cfg->trgCfg.updateTrg == ADI_ADRV904X_TXATTEN_UPD_TRG_GPIO && + (cfg->trgCfg.triggerGpio >= ADI_ADRV904X_GPIO_INVALID || + cfg->trgCfg.triggerGpio == 0U)) + { + ADI_PARAM_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + cfg->trgCfg.triggerGpio, + "Invalid triggerGpio"); + goto cleanup; + } + + /* If use of S0/S1 is determined via gpio ensure gpio is valid. + * Note: Due to h/w pinmux limitations pin0 cannot be routed for use as the S0_S1 src */ + if (cfg->srcCfg.updateSrc == ADI_ADRV904X_TXATTEN_UPD_SRC_S0_OR_S1 && + (cfg->srcCfg.s0OrS1Gpio >= ADI_ADRV904X_GPIO_INVALID || + cfg->srcCfg.s0OrS1Gpio == 0U)) + { + ADI_PARAM_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + cfg->srcCfg.s0OrS1Gpio, + "Invalid s0OrS1Gpio"); + goto cleanup; + } + + /* If update is via gpio and S1/S0 is determined by gpio verify + * the gpios are different */ + if (cfg->trgCfg.updateTrg == ADI_ADRV904X_TXATTEN_UPD_TRG_GPIO && + cfg->srcCfg.updateSrc == ADI_ADRV904X_TXATTEN_UPD_SRC_S0_OR_S1 && + cfg->trgCfg.triggerGpio == cfg->srcCfg .s0OrS1Gpio ) + { + ADI_PARAM_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + ADI_NO_VARIABLE, + "Cannot use same GPIO for trigger gpio and S0/S1 selection"); + goto cleanup; + } + + /* The global CoreSpiEnable bit is set for SPI trigger; Unset for any other trigger. */ + recoveryAction = adrv904x_Core_TxAttenUpdCoreSpiEn_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + (cfg->trgCfg.updateTrg == ADI_ADRV904X_TXATTEN_UPD_TRG_SPI)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Call to adrv904x_Core_TxAttenUpdCoreSpiEn_BfSet failed."); + goto cleanup; + } + + /* Routing of GPIO signals to TxChans for update triggering + * must be done for all channels in a single call not channel by channel */ + if (cfg->trgCfg.updateTrg == ADI_ADRV904X_TXATTEN_UPD_TRG_GPIO) + { + /* Route selected trigger GPIO to TxChans*/ + recoveryAction = adrv904x_GpioSignalSet(device, + cfg->trgCfg.triggerGpio, + ADI_ADRV904X_GPIO_SIGNAL_TX_ATTEN_UPD_GPIO, + chanMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Call to adrv904x_GpioSignalSet failed for trigger GPIO"); + goto cleanup; + } + } + + /* Routing of GPIO signals to TxChans for S0/S1 selection + * must be done for all channels in a single call not channel by channel */ + if (cfg->srcCfg.updateSrc == ADI_ADRV904X_TXATTEN_UPD_SRC_S0_OR_S1) + { + /* Configuring which GPIO selects S0/S1. */ + recoveryAction = adrv904x_GpioSignalSet(device, + cfg->srcCfg.s0OrS1Gpio, + ADI_ADRV904X_GPIO_SIGNAL_SELECT_S1, + chanMask); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Call to adrv904x_GpioSignalSet failed for S0/S1 gpio."); + goto cleanup; + } + } + + /* for each Tx channel in chanMask */ + for (chanId = 0U; chanId <= ADI_ADRV904X_TX_CHAN_ID_MAX; chanId++) + { + chanSel = 1U << chanId; + + if ((chanMask & (1 << chanId)) == 0) + { + /* Skip channel. It's not in chanMask. */ + continue; + } + + /* Convert the chanId to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txFuncsChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanId, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + recoveryAction = adrv904x_TxDigBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txDigChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanId, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + switch (cfg->trgCfg.updateTrg) + { + case ADI_ADRV904X_TXATTEN_UPD_TRG_NONE: + /* Do not trigger update from GPIO */ + recoveryAction = adrv904x_TxFuncs_TxAttenUpdGpioEn_BfSet(device, + NULL, + txFuncsChanBaseAddr, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Call to adrv904x_TxFuncs_TxAttenUpdGpioEn_BfSet failed."); + goto cleanup; + } + break; + case ADI_ADRV904X_TXATTEN_UPD_TRG_SPI: + /* Hardware supports level trigger for SPI but we don't expose that. Is always edge triggered. */ + recoveryAction = adrv904x_TxFuncs_TxAttenUpdTrgSel_BfSet(device, + NULL, + txFuncsChanBaseAddr, + TX_ATTEN_EDGE_TRIGGER); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Call to adrv904x_TxFuncs_TxAttenUpdTrgSel_BfSet failed."); + goto cleanup; + } + break; + case ADI_ADRV904X_TXATTEN_UPD_TRG_GPIO: + /* Do trigger update from GPIO */ + recoveryAction = adrv904x_TxFuncs_TxAttenUpdGpioEn_BfSet(device, + NULL, + txFuncsChanBaseAddr, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Call to adrv904x_TxFuncs_TxAttenUpdGpioEn_BfSet failed."); + goto cleanup; + } + + /* Always set edge triggered. Hardware supports level trigger for GPIO but we don't expose that. */ + recoveryAction = adrv904x_TxFuncs_TxAttenUpdTrgSel_BfSet(device, + NULL, + txFuncsChanBaseAddr, + TX_ATTEN_EDGE_TRIGGER); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Call to adrv904x_TxFuncs_TxAttenUpdTrgSel_BfSet failed."); + goto cleanup; + } + + /* Setting the GPIO that triggers the update is done by adrv904x_GpioSignalSet above. */ + + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfg->trgCfg.updateTrg, + "Invalid ADI_ADRV904X_TXATTEN_UPD_TRG value"); + goto cleanup; + break; + } + + switch (cfg->srcCfg.updateSrc) + { + case ADI_ADRV904X_TXATTEN_UPD_SRC_S0: + /* Turn off use of per-slice tx_attenuation register as that would override S0 */ + recoveryAction = adrv904x_TxFuncs_UseSliceAttenValue_BfSet(device, + NULL, + txFuncsChanBaseAddr, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Call to adrv904x_TxFuncs_UseSliceAttenValue_BfSet failed."); + goto cleanup; + } + + /* Turn off use of GPIO to select between S0/S1 */ + recoveryAction = adrv904x_TxFuncs_UseAttenWordS1ViaGpioPin_BfSet(device, + NULL, + txFuncsChanBaseAddr, + 0U); + break; + case ADI_ADRV904X_TXATTEN_UPD_SRC_S0_OR_S1: + /* Turn off use of per-slice tx_attenuation register that would override S0 */ + recoveryAction = adrv904x_TxFuncs_UseSliceAttenValue_BfSet(device, + NULL, + txFuncsChanBaseAddr, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Call to adrv904x_TxFuncs_UseSliceAttenValue_BfSet failed."); + goto cleanup; + } + + /* Turn on use of GPIO to select between S0/S1 */ + recoveryAction = adrv904x_TxFuncs_UseAttenWordS1ViaGpioPin_BfSet(device, + NULL, + txFuncsChanBaseAddr, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Call to adrv904x_TxFuncs_UseAttenWordS1ViaGpioPin_BfSet failed."); + goto cleanup; + } + + /* Configuring which GPIO selects S0/S1 is done by adrv904x_GpioSignalSet above. */ + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + cfg->srcCfg.updateSrc, + "Invalid ADI_ADRV904X_TXATTEN_UPD_SRC value"); + goto cleanup; + break; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenUpdateCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_TxAttenUpdateCfg_t* const cfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxDigChanAddr_e txDigChanBaseAddr = (adrv904x_BfTxDigChanAddr_e)0U; + adrv904x_BfTxFuncsChanAddr_e txFuncsChanBaseAddr = (adrv904x_BfTxFuncsChanAddr_e)0U; + uint8_t chanId = 0U; + + uint8_t updCoreSpiEn = 0U; /* global config that overrides the per-channel updGpioEn */ + uint8_t updGpioEn = 0U; /* enables gpio update trigger */ + uint8_t trgCfgTriggerGpio = 0U; /* identifies gpio update trigger */ + uint8_t useS1ViaGpioPin = 0U; /* enables S0/S1 selection via GPIO */ + uint8_t srcCfgS0OrS1Gpio = 0U; /* identifies S0/S1 selection GPIO */ + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cfg, cleanup); + + chanId = adrv904x_TxChannelsToId(txChannel); + if (chanId > ADI_ADRV904X_TX_CHAN_ID_MAX) + { + ADI_PARAM_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + chanId, + "Invalid channel id"); + goto cleanup; + } + + /* Convert the chanId to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, txChannel, &txFuncsChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanId, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + recoveryAction = adrv904x_TxDigBitfieldAddressGet(device, txChannel, &txDigChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanId, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + recoveryAction = adrv904x_Core_TxAttenUpdCoreSpiEn_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + &updCoreSpiEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Call to adrv904x_Core_TxAttenUpdCoreSpiEn_BfGet failed."); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_TxAttenUpdGpioEn_BfGet(device, + NULL, + txFuncsChanBaseAddr, + &updGpioEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Call to adrv904x_TxFuncs_TxAttenUpdGpioEn_BfGet failed."); + goto cleanup; + } + + recoveryAction = adrv904x_TxDig_TxAttenUpdGpioSelect_BfGet(device, + NULL, + txDigChanBaseAddr, + &trgCfgTriggerGpio); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Call to adrv904x_TxDig_TxAttenUpdGpioSelect_BfGet failed."); + goto cleanup; + } + + /* Turn off use of GPIO to select between S0/S1 */ + recoveryAction = adrv904x_TxFuncs_UseAttenWordS1ViaGpioPin_BfGet(device, + NULL, + txFuncsChanBaseAddr, + &useS1ViaGpioPin); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Call to adrv904x_TxFuncs_UseAttenWordS1ViaGpioPin_BfGet failed."); + goto cleanup; + } + + recoveryAction = adrv904x_TxDig_Spi2TxAttenGpioSelect_BfGet(device, + NULL, + txDigChanBaseAddr, + &srcCfgS0OrS1Gpio); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Call to adrv904x_TxDig_Spi2TxAttenGpioSelect_BfGet failed."); + goto cleanup; + } + + /* Analyze the device settings and populate the cfg structure accordingly */ + if (useS1ViaGpioPin == 0) + { + cfg->srcCfg.updateSrc = ADI_ADRV904X_TXATTEN_UPD_SRC_S0; + } + else + { + cfg->srcCfg.updateSrc = ADI_ADRV904X_TXATTEN_UPD_SRC_S0_OR_S1; + cfg->srcCfg.s0OrS1Gpio = (adi_adrv904x_GpioPinSel_e)srcCfgS0OrS1Gpio; + } + + if (updCoreSpiEn > 0) + { + cfg->trgCfg.updateTrg = ADI_ADRV904X_TXATTEN_UPD_TRG_SPI; + } + else if (updGpioEn > 0) + { + cfg->trgCfg.updateTrg = ADI_ADRV904X_TXATTEN_UPD_TRG_GPIO; + cfg->trgCfg.triggerGpio = (adi_adrv904x_GpioPinSel_e)trgCfgTriggerGpio ; + } + else + { + cfg->trgCfg.updateTrg = ADI_ADRV904X_TXATTEN_UPD_TRG_NONE; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenUpdate(adi_adrv904x_Device_t *const device, + const uint32_t chanMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + if ((chanMask > ADI_ADRV904X_TX_CHAN_MASK_MAX) || + (chanMask == 0U)) + { + ADI_PARAM_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERR_ACT_CHECK_PARAM, + chanMask, + "Invalid channel mask"); + goto cleanup; + } + + recoveryAction = adrv904x_Core_TxAttenUpdCoreSpi_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + chanMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to update TxAtten"); + goto cleanup; + } + + recoveryAction = adrv904x_Core_TxAttenUpdCoreSpi_BfSet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to reset update TxAtten bits"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxLoSourceGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_LoSel_e * const txLoSource) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Check Tx data format config pointer is not NULL*/ + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txLoSource, cleanup); + + /* Check that the requested txChannel is valid */ + if ((txChannel != ADI_ADRV904X_TX0) && + (txChannel != ADI_ADRV904X_TX1) && + (txChannel != ADI_ADRV904X_TX2) && + (txChannel != ADI_ADRV904X_TX3) && + (txChannel != ADI_ADRV904X_TX4) && + (txChannel != ADI_ADRV904X_TX5) && + (txChannel != ADI_ADRV904X_TX6) && + (txChannel != ADI_ADRV904X_TX7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + txChannel, + "Invalid Tx channel selected for LO source mapping read back. Valid Tx channels are Tx0-Tx7."); + goto cleanup; + } + + /* Check that Tx profile is valid in current config */ + if (((device->devStateInfo.profilesValid & ADI_ADRV904X_TX_PROFILE_VALID) != ADI_ADRV904X_TX_PROFILE_VALID) + || ((device->devStateInfo.initializedChannels >> ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET) & (uint32_t)txChannel) == 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT( &device->common, + recoveryAction, + txChannel, + "LO source read back requested for an Tx channel but Tx profile is invalid or channel not initialized in the device structure"); + goto cleanup; + } + + /* Readback Tx LO source selection */ + recoveryAction = adrv904x_TxLoSourceGet(device, txChannel, txLoSource); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error retrieving Lo Source for Tx channel."); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxPowerMonitorCfgSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_PowerMonitorCfgRt_t txPowerMonitorCfg[], + const uint32_t numPowerProtectCfgs) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t cfgIdx = 0U; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + adrv904x_BfTxFuncsChanAddr_e txBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_FUNCS; + static const uint16_t MAX_PEAK_PRE_THRESHOLD = 511U; + uint16_t peakPreThreShold = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txPowerMonitorCfg, cleanup); + + if (numPowerProtectCfgs == 0U) + { + /* no valid configs */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numPowerProtectCfgs, "Invalid Number of Tx Power Monitor Configurations"); + goto cleanup; + } + + /* Loop through the number of configurations and perform range checks */ + for (cfgIdx = 0U; cfgIdx < numPowerProtectCfgs; ++cfgIdx) + { + recoveryAction = adrv904x_TxPowerMonitorCfgRangeCheck(device, &txPowerMonitorCfg[cfgIdx].txPowerMonitorCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Tx Power Monitor Range Check Error Reported"); + goto cleanup; + } + + /*Check that if requested Tx Channel valid*/ + if (((txPowerMonitorCfg[cfgIdx].txChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (txPowerMonitorCfg[cfgIdx].txChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txPowerMonitorCfg[cfgIdx].txChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + } + + /* Write out the configurations to appropriate bitfields */ + for (cfgIdx = 0U; cfgIdx < numPowerProtectCfgs; ++cfgIdx) + { + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(txPowerMonitorCfg[cfgIdx].txChannelMask, chanSel)) + { + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + /* Peak Pre Threshold must be set to (peakThreshold/2) / 2^(16-9) to adjust bus width */ + peakPreThreShold = txPowerMonitorCfg[cfgIdx].txPowerMonitorCfg.peakThreshold >> 8; + if (peakPreThreShold > MAX_PEAK_PRE_THRESHOLD) + { + /* Saturate pre threshold */ + peakPreThreShold = MAX_PEAK_PRE_THRESHOLD; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionOverloadThPre_BfSet(device, + NULL, + txBaseAddr, + peakPreThreShold); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx PA Protect Peak Pre-Threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionInputSel_BfSet(device, + NULL, + txBaseAddr, + (uint8_t)txPowerMonitorCfg[cfgIdx].txPowerMonitorCfg.inputSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx PA Protect Input Select"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionPeakThreshold_BfSet(device, + NULL, + txBaseAddr, + txPowerMonitorCfg[cfgIdx].txPowerMonitorCfg.peakThreshold); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx PA Protect Peak Threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionPeakDur_BfSet(device, + NULL, + txBaseAddr, + txPowerMonitorCfg[cfgIdx].txPowerMonitorCfg.measDuration); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx PA Protect Peak Duration"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionPeakCount_BfSet(device, + NULL, + txBaseAddr, + txPowerMonitorCfg[cfgIdx].txPowerMonitorCfg.peakCount); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx PA Protect Peak Count"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionPeakpowerErrorClearRequired_BfSet(device, + NULL, + txBaseAddr, + txPowerMonitorCfg[cfgIdx].txPowerMonitorCfg.peakErrorClearRequired); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx PA Protect Peak Error Clear Required"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionPeakpowerEn_BfSet(device, + NULL, + txBaseAddr, + txPowerMonitorCfg[cfgIdx].txPowerMonitorCfg.peakPowerEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx PA Protect Peak Power Enable"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionPeakpowerIrqEn_BfSet(device, + NULL, + txBaseAddr, + txPowerMonitorCfg[cfgIdx].txPowerMonitorCfg.peakPowerIrqEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx PA Protect Peak Power IRQ enable"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionAverageThreshold_BfSet(device, + NULL, + txBaseAddr, + txPowerMonitorCfg[cfgIdx].txPowerMonitorCfg.avgThreshold); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx PA Protect Average Threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionAverageDur_BfSet(device, + NULL, + txBaseAddr, + txPowerMonitorCfg[cfgIdx].txPowerMonitorCfg.measDuration); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx PA Protect Average Duration"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionAvgpowerErrorClearRequired_BfSet(device, + NULL, + txBaseAddr, + txPowerMonitorCfg[cfgIdx].txPowerMonitorCfg.avgErrorClearRequired); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx PA Protect Average Error Clear Required"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionAvgpowerEn_BfSet(device, + NULL, + txBaseAddr, + txPowerMonitorCfg[cfgIdx].txPowerMonitorCfg.avgPowerEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx PA Protect Average Enable"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionAvgpowerIrqEn_BfSet(device, + NULL, + txBaseAddr, + txPowerMonitorCfg[cfgIdx].txPowerMonitorCfg.avgPowerIrqEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx PA Protect Average IRQ Enable"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionAprEn_BfSet(device, + NULL, + txBaseAddr, + txPowerMonitorCfg[cfgIdx].txPowerMonitorCfg.avgPeakRatioEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx Average to Peak Ratio Enable"); + goto cleanup; + } + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxPowerMonitorCfgGet(adi_adrv904x_Device_t * const device, + adi_adrv904x_PowerMonitorCfgRt_t* const txPowerMonitorCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxFuncsChanAddr_e txBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_FUNCS; + uint8_t tempByte = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txPowerMonitorCfg, cleanup); + + /* Retrieve the base address of selected channel. This function call will also range check the txChannelMask */ + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)txPowerMonitorCfg->txChannelMask, &txBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txPowerMonitorCfg->txChannelMask, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionInputSel_BfGet(device, + NULL, + txBaseAddr, + &tempByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx PA Protect Input Select"); + goto cleanup; + } + txPowerMonitorCfg->txPowerMonitorCfg.inputSel = (adi_adrv904x_PaProtectionInputSel_e)tempByte; + + recoveryAction = adrv904x_TxFuncs_PaProtectionPeakThreshold_BfGet(device, + NULL, + txBaseAddr, + &txPowerMonitorCfg->txPowerMonitorCfg.peakThreshold); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx PA Protect Peak Threshold"); + goto cleanup; + } + + /* Peak and Average measurement durations are programmed same to HW */ + recoveryAction = adrv904x_TxFuncs_PaProtectionPeakDur_BfGet(device, + NULL, + txBaseAddr, + &txPowerMonitorCfg->txPowerMonitorCfg.measDuration); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx PA Protect Peak Duration"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionPeakCount_BfGet(device, + NULL, + txBaseAddr, + &txPowerMonitorCfg->txPowerMonitorCfg.peakCount); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx PA Protect Peak Count"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionPeakpowerErrorClearRequired_BfGet(device, + NULL, + txBaseAddr, + &txPowerMonitorCfg->txPowerMonitorCfg.peakErrorClearRequired); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx PA Protect Peak Error Clear Required"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionPeakpowerEn_BfGet(device, + NULL, + txBaseAddr, + &txPowerMonitorCfg->txPowerMonitorCfg.peakPowerEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx PA Protect Peak Power Enable"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionPeakpowerIrqEn_BfGet(device, + NULL, + txBaseAddr, + &txPowerMonitorCfg->txPowerMonitorCfg.peakPowerIrqEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx PA Protect Peak Power IRQ enable"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionAverageThreshold_BfGet(device, + NULL, + txBaseAddr, + &txPowerMonitorCfg->txPowerMonitorCfg.avgThreshold); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx PA Protect Average Threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionAvgpowerErrorClearRequired_BfGet(device, + NULL, + txBaseAddr, + &txPowerMonitorCfg->txPowerMonitorCfg.avgErrorClearRequired); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx PA Protect Average Error Clear Required"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionAvgpowerEn_BfGet(device, + NULL, + txBaseAddr, + &txPowerMonitorCfg->txPowerMonitorCfg.avgPowerEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx PA Protect Average Enable"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionAvgpowerIrqEn_BfGet(device, + NULL, + txBaseAddr, + &txPowerMonitorCfg->txPowerMonitorCfg.avgPowerIrqEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx PA Protect Average IRQ Enable"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionAprEn_BfGet(device, + NULL, + txBaseAddr, + &txPowerMonitorCfg->txPowerMonitorCfg.avgPeakRatioEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx PA Protect Average to Peak Ratio Enable"); + goto cleanup; + } + + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxProtectionErrorGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + uint32_t* const eventBits) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxFuncsChanAddr_e txBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_FUNCS; + uint8_t bfValue = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, eventBits, cleanup); + + /* Clear the memory before setting individual bits for different events */ + *eventBits = 0U; + + /* Retrieve the base address of selected channel. This function call will also range check the txChannelMask */ + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)txChannel, &txBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannel, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionAvgpowerError_BfGet(device, + NULL, + txBaseAddr, + &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx Average Power Error Bit"); + goto cleanup; + } + + *eventBits |= (uint32_t) (bfValue & 0x01U); + + recoveryAction = adrv904x_TxFuncs_PaProtectionPeakpowerError_BfGet(device, + NULL, + txBaseAddr, + &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx Peak Power Error Bit"); + goto cleanup; + } + + *eventBits |= (((uint32_t) (bfValue & 0x01U)) << 1U); + + recoveryAction = adrv904x_TxFuncs_SrdError_BfGet(device, + NULL, + txBaseAddr, + &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx SRD Error Bit"); + goto cleanup; + } + + *eventBits |= (((uint32_t) (bfValue & 0x01U)) << 2U); + + recoveryAction = adrv904x_TxFuncs_PllJesdProtEvent_BfGet(device, + NULL, + txBaseAddr, + &bfValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx Pll Unlock/Dfrm Irq Error"); + goto cleanup; + } + + *eventBits |= (((uint32_t) (bfValue & 0x01U)) << 3U); + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxProtectionErrorClear(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxChannels_e txChannel, + const uint32_t eventBits) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxFuncsChanAddr_e txBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_FUNCS; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + /* Retrieve the base address of selected channel. This function call will also range check the txChannelMask */ + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)txChannel, &txBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannel, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + if (ADRV904X_BF_EQUAL(eventBits, 0x01U)) + { + recoveryAction = adrv904x_TxFuncs_PaProtectionAvgpowerErrorClear_BfSet(device, + NULL, + txBaseAddr, + ADI_TRUE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to set Tx Average Power Error Clear Bit"); + goto cleanup; + } + } + + if (ADRV904X_BF_EQUAL(eventBits, 0x02U)) + { + recoveryAction = adrv904x_TxFuncs_PaProtectionPeakpowerErrorClear_BfSet(device, + NULL, + txBaseAddr, + ADI_TRUE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to set Tx Peak Power Error Clear Bit"); + goto cleanup; + } + } + + if (ADRV904X_BF_EQUAL(eventBits, 0x04U)) + { + recoveryAction = adrv904x_TxFuncs_SrdErrorClear_BfSet(device, + NULL, + txBaseAddr, + ADI_TRUE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to set SRD Error Clear Bit"); + goto cleanup; + } + } + + if (ADRV904X_BF_EQUAL(eventBits, 0x08U)) + { + recoveryAction = adrv904x_TxFuncs_PllJesdProtClr_BfSet(device, + NULL, + txBaseAddr, + ADI_TRUE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to set Pll Unlock/Dfrm Irq Error Clear Bit"); + goto cleanup; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxSlewRateDetectorCfgSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_SlewRateDetectorCfgRt_t txSlewRateDetectorCfg[], + const uint32_t numSlewRateDetCfgs) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t cfgIdx = 0U; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + adrv904x_BfTxFuncsChanAddr_e txBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_FUNCS; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txSlewRateDetectorCfg, cleanup); + + if (numSlewRateDetCfgs == 0U) + { + /* no valid configs */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numSlewRateDetCfgs, "Invalid Number of Tx SRD Configurations"); + goto cleanup; + } + + /* Loop through the number of configurations and perform range checks */ + for (cfgIdx = 0U; cfgIdx < numSlewRateDetCfgs; ++cfgIdx) + { + recoveryAction = adrv904x_TxSlewRateDetectorCfgRangeCheck(device, &txSlewRateDetectorCfg[cfgIdx].srlCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Tx SRD Range Check Error Reported"); + goto cleanup; + } + + /*Check that if requested Tx Channel valid*/ + if (((txSlewRateDetectorCfg[cfgIdx].txChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (txSlewRateDetectorCfg[cfgIdx].txChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txSlewRateDetectorCfg[cfgIdx].txChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + } + + /* Write out the configurations to appropriate bitfields */ + for (cfgIdx = 0U; cfgIdx < numSlewRateDetCfgs; ++cfgIdx) + { + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(txSlewRateDetectorCfg[cfgIdx].txChannelMask, chanSel)) + { + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_SrdDinSel_BfSet(device, + NULL, + txBaseAddr, + (uint8_t)txSlewRateDetectorCfg[cfgIdx].srlCfg.inputSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx SRD input selection"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_SrdSlewOffset_BfSet(device, + NULL, + txBaseAddr, + txSlewRateDetectorCfg[cfgIdx].srlCfg.srdOffset); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx SRD threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_SrdEn_BfSet(device, + NULL, + txBaseAddr, + txSlewRateDetectorCfg[cfgIdx].srlCfg.srdEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx SRD enable"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_SrdIrqEn_BfSet(device, + NULL, + txBaseAddr, + txSlewRateDetectorCfg[cfgIdx].srlCfg.srdIrqEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx SRD Irq enable"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_SrdArvWait_BfSet(device, + NULL, + txBaseAddr, + txSlewRateDetectorCfg[cfgIdx].srlCfg.autoRecoveryWaitTime); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write auto recovery wait time"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_SrdArvEn_BfSet(device, + NULL, + txBaseAddr, + txSlewRateDetectorCfg[cfgIdx].srlCfg.autoRecoveryEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write auto recovery enable"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_SrdArvTxonQual_BfSet(device, + NULL, + txBaseAddr, + txSlewRateDetectorCfg[cfgIdx].srlCfg.autoRecoveryDisableTimerWhenTxOff); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write auto recovery disable timer when Tx off"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_SrdStatEn_BfSet(device, + NULL, + txBaseAddr, + txSlewRateDetectorCfg[cfgIdx].srlCfg.srdStatisticsEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write statistics enable"); + goto cleanup; + } + + /* Clear statistics before setting statistics mode */ + recoveryAction = adrv904x_TxFuncs_SrdStatMode_BfSet(device, + NULL, + txBaseAddr, + (2U | txSlewRateDetectorCfg[cfgIdx].srlCfg.srdStatisticsMode)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to clear statistics"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_SrdStatMode_BfSet(device, + NULL, + txBaseAddr, + txSlewRateDetectorCfg[cfgIdx].srlCfg.srdStatisticsMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write statistics mode"); + goto cleanup; + } + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxSlewRateDetectorCfgGet(adi_adrv904x_Device_t * const device, + adi_adrv904x_SlewRateDetectorCfgRt_t * const txSlewRateDetectorCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxFuncsChanAddr_e txBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_FUNCS; + uint8_t tempByte = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txSlewRateDetectorCfg, cleanup); + + /* Retrieve the base address of selected channel. This function call will also range check the txChannelMask */ + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)txSlewRateDetectorCfg->txChannelMask, &txBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txSlewRateDetectorCfg->txChannelMask, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_SrdDinSel_BfGet(device, + NULL, + txBaseAddr, + &tempByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx SRD input selection"); + goto cleanup; + } + txSlewRateDetectorCfg->srlCfg.inputSel = (adi_adrv904x_PaProtectionInputSel_e)tempByte; + + recoveryAction = adrv904x_TxFuncs_SrdSlewOffset_BfGet(device, + NULL, + txBaseAddr, + &txSlewRateDetectorCfg->srlCfg.srdOffset); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx SRD threshold"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_SrdEn_BfGet(device, + NULL, + txBaseAddr, + &txSlewRateDetectorCfg->srlCfg.srdEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx SRD enable"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_SrdIrqEn_BfGet(device, + NULL, + txBaseAddr, + &txSlewRateDetectorCfg->srlCfg.srdIrqEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx SRD Irq enable"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_SrdArvWait_BfGet(device, + NULL, + txBaseAddr, + &txSlewRateDetectorCfg->srlCfg.autoRecoveryWaitTime); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read auto recovery wait time"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_SrdArvEn_BfGet(device, + NULL, + txBaseAddr, + &txSlewRateDetectorCfg->srlCfg.autoRecoveryEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read auto recovery enable"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_SrdArvTxonQual_BfGet(device, + NULL, + txBaseAddr, + &txSlewRateDetectorCfg->srlCfg.autoRecoveryDisableTimerWhenTxOff); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read auto recovery disable timer when Tx off"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_SrdStatEn_BfGet(device, + NULL, + txBaseAddr, + &txSlewRateDetectorCfg->srlCfg.srdStatisticsEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read statistics enable"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_SrdStatMode_BfGet(device, + NULL, + txBaseAddr, + &txSlewRateDetectorCfg->srlCfg.srdStatisticsMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read statistics mode"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxSlewRateStatisticsRead(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxChannels_e txChannel, + const uint8_t clearStats, + uint16_t * const statisticsReadback) +{ + static const uint8_t SINGLE_BIT_MAX = 1U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxFuncsChanAddr_e txBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_FUNCS; + uint8_t tempByte = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, statisticsReadback, cleanup); + + if (clearStats > SINGLE_BIT_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + clearStats, + "clearStats value is invalid. Valid values 0-1"); + goto cleanup; + } + + /* Clear the memory to make sure statistics readback will be correct */ + *statisticsReadback = 0; + + /* Retrieve the base address of selected channel. This function call will also range check the txChannelMask */ + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, txChannel, &txBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannel, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_SrdStat_BfGet(device, + NULL, + txBaseAddr, + statisticsReadback); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read statistics"); + goto cleanup; + } + + if (clearStats == 1U) + { + recoveryAction = adrv904x_TxFuncs_SrdStatMode_BfGet(device, + NULL, + txBaseAddr, + &tempByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read statistics mode"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_SrdStatMode_BfSet(device, + NULL, + txBaseAddr, + (tempByte | 2U)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to clear statistics"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_SrdStatMode_BfSet(device, + NULL, + txBaseAddr, + tempByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to restore statistics mode"); + goto cleanup; + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxProtectionRampSampleHoldEnableSet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const uint8_t enable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + adrv904x_BfTxFuncsChanAddr_e txBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_FUNCS; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + /*Check that if requested Tx Channel valid*/ + if (((txChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (txChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + if (enable > ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + enable, + "enable value is invalid. Valid values 0-1"); + goto cleanup; + } + + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + if (ADRV904X_BF_EQUAL(txChannelMask, (uint32_t)(1U << chanIdx))) + { + chanSel = 1U << chanIdx; + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + + recoveryAction = adrv904x_TxFuncs_AnaRampHoldSampleEn_BfSet(device, + NULL, + txBaseAddr, + enable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx Analog sample hold and ramp down bit"); + goto cleanup; + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxProtectionRampSampleHoldEnableGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + uint8_t* const enable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxFuncsChanAddr_e txBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_FUNCS; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, enable, cleanup); + + /* Retrieve the base address for selected tx channel. This will also range check the txChannelMask parameter */ + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, txChannel, &txBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannel, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_AnaRampHoldSampleEn_BfGet(device, + NULL, + txBaseAddr, + enable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx Analog sample hold and ramp down bit"); + goto cleanup; + } + + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxProtectionRampCfgSet(adi_adrv904x_Device_t* const device, + adi_adrv904x_ProtectionRampCfgRt_t txProtectionRampCfg[], + const uint32_t numProtectionRampCfgs) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t cfgIdx = 0U; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + adrv904x_BfTxFuncsChanAddr_e txBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_FUNCS; + uint8_t jesdDfrmMask = 0U; + uint8_t pllUnlockMask = 0U; + uint8_t srdRdnEn = 0U; + uint8_t avgPowerRdnEn = 0U; + uint8_t peakPowerRdnEn = 0U; + + uint32_t allRampDownMasks = (uint32_t)ADI_ADRV904X_RDT_PEAK_PA | + (uint32_t)ADI_ADRV904X_RDT_AVG_PA | + (uint32_t)ADI_ADRV904X_RDT_SRD | + (uint32_t)ADI_ADRV904X_RDT_CLK_PLL_UNLOCK | + (uint32_t)ADI_ADRV904X_RDT_RF0_PLL_UNLOCK | + (uint32_t)ADI_ADRV904X_RDT_RF1_PLL_UNLOCK | + (uint32_t)ADI_ADRV904X_RDT_SERDES_PLL_UNLOCK | + (uint32_t)ADI_ADRV904X_RDT_DFRM0_EVENT | + (uint32_t)ADI_ADRV904X_RDT_DFRM1_EVENT; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txProtectionRampCfg, cleanup); + + if (numProtectionRampCfgs == 0U) + { + /* no valid configs */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numProtectionRampCfgs, "Invalid Number of Tx Protection Ramp Configurations"); + goto cleanup; + } + + /* Loop through the number of configurations and perform range checks */ + for (cfgIdx = 0U; cfgIdx < numProtectionRampCfgs; ++cfgIdx) + { + if ((txProtectionRampCfg[cfgIdx].protectionRampCfg.rampDownMask & (~allRampDownMasks)) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txProtectionRampCfg[cfgIdx].protectionRampCfg.rampDownMask, + "Ramp down mask selection is invalid. Valid values are any combinations of bitmasks given in adi_adrv904x_RampDownTrigger_e"); + goto cleanup; + } + + if (txProtectionRampCfg[cfgIdx].protectionRampCfg.altEventClearReqd > 1U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txProtectionRampCfg[cfgIdx].protectionRampCfg.altEventClearReqd, + "Invalid altEventClearReqd selection. Valid values are 0-1"); + goto cleanup; + } + + /*Check that if requested Tx Channel valid*/ + if(((txProtectionRampCfg[cfgIdx].txChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (txProtectionRampCfg[cfgIdx].txChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txProtectionRampCfg[cfgIdx].txChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + } + + /* Write out the configurations to appropriate bitfields */ + for (cfgIdx = 0U; cfgIdx < numProtectionRampCfgs; ++cfgIdx) + { + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(txProtectionRampCfg[cfgIdx].txChannelMask, (uint32_t)(chanSel))) + { + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + jesdDfrmMask = ((txProtectionRampCfg[cfgIdx].protectionRampCfg.rampDownMask >> 0x7U) & 0x3U); + /* Setting these bits will disable the rampdown for dfrm events, so toggle user selection */ + jesdDfrmMask = ~jesdDfrmMask; + jesdDfrmMask &= 0x3U; + recoveryAction = adrv904x_TxFuncs_JesdDfrmMask_BfSet(device, + NULL, + txBaseAddr, + jesdDfrmMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx Jesd Dfrm Mask"); + goto cleanup; + } + + pllUnlockMask = ((txProtectionRampCfg[cfgIdx].protectionRampCfg.rampDownMask >> 0x3U) & 0xFU); + /* Setting these bits will disable the rampdown for pll unlock events, so toggle user selection */ + pllUnlockMask = ~pllUnlockMask; + pllUnlockMask &= 0xFU; + recoveryAction = adrv904x_TxFuncs_PllUnlockMask_BfSet(device, + NULL, + txBaseAddr, + pllUnlockMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx PLL Unlock Mask"); + goto cleanup; + } + + srdRdnEn = ((txProtectionRampCfg[cfgIdx].protectionRampCfg.rampDownMask >> 0x2U) & 0x1U); + recoveryAction = adrv904x_TxFuncs_SrdRdnEn_BfSet(device, + NULL, + txBaseAddr, + srdRdnEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx SRD Ramp Down Mask"); + goto cleanup; + } + + avgPowerRdnEn = ((txProtectionRampCfg[cfgIdx].protectionRampCfg.rampDownMask >> 0x1U) & 0x1U); + recoveryAction = adrv904x_TxFuncs_PaProtectionAvgpowerRdnEn_BfSet(device, + NULL, + txBaseAddr, + avgPowerRdnEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx Average Power Ramp Down Mask"); + goto cleanup; + } + + peakPowerRdnEn = (txProtectionRampCfg[cfgIdx].protectionRampCfg.rampDownMask & 0x1U); + recoveryAction = adrv904x_TxFuncs_PaProtectionPeakpowerRdnEn_BfSet(device, + NULL, + txBaseAddr, + peakPowerRdnEn); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx Peak Power Ramp Down Mask"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PllJesdProtClrReqd_BfSet(device, + NULL, + txBaseAddr, + txProtectionRampCfg[cfgIdx].protectionRampCfg.altEventClearReqd); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx Power Protect Event Clear Required"); + goto cleanup; + } + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxProtectionRampCfgGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_ProtectionRampCfgRt_t* const txProtectionRampCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxFuncsChanAddr_e txBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_FUNCS; + uint8_t tempByte = 0U; + uint32_t tmpRampDownMask = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txProtectionRampCfg, cleanup); + + /* Retrieve the base address for selected tx channel. This will also range check the txChannelMask parameter */ + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(txProtectionRampCfg->txChannelMask), &txBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txProtectionRampCfg->txChannelMask, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_JesdDfrmMask_BfGet(device, + NULL, + txBaseAddr, + &tempByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx Jesd Dfrm Mask"); + goto cleanup; + } + /* bit = 1 means ramp down is disabled. So toggle the bits before returning it to user */ + tempByte = ~tempByte; + tempByte &= 0x3U; + tmpRampDownMask |= (uint32_t)tempByte << 0x0007U; + + recoveryAction = adrv904x_TxFuncs_PllUnlockMask_BfGet(device, + NULL, + txBaseAddr, + &tempByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx PLL Unlock Mask"); + goto cleanup; + } + /* bit = 1 means ramp down is disabled. So toggle the bits before returning it to user */ + tempByte = ~tempByte; + tempByte &= 0xFU; + tmpRampDownMask |= (uint32_t)tempByte << 0x0003U; + + recoveryAction = adrv904x_TxFuncs_SrdRdnEn_BfGet(device, + NULL, + txBaseAddr, + &tempByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx SRD Ramp Down Mask"); + goto cleanup; + } + tmpRampDownMask |= (uint32_t)tempByte << 0x0002U; + + recoveryAction = adrv904x_TxFuncs_PaProtectionAvgpowerRdnEn_BfGet(device, + NULL, + txBaseAddr, + &tempByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx Average Power Ramp Down Mask"); + goto cleanup; + } + tmpRampDownMask |= (uint32_t)tempByte << 0x0001U; + + recoveryAction = adrv904x_TxFuncs_PaProtectionPeakpowerRdnEn_BfGet(device, + NULL, + txBaseAddr, + &tempByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx Peak Power Ramp Down Mask"); + goto cleanup; + } + tmpRampDownMask |= (uint32_t)tempByte << 0x0000U; + + recoveryAction = adrv904x_TxFuncs_PllJesdProtClrReqd_BfGet(device, + NULL, + txBaseAddr, + &txProtectionRampCfg->protectionRampCfg.altEventClearReqd); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx Power Protect Event Clear Required"); + goto cleanup; + } + + txProtectionRampCfg->protectionRampCfg.rampDownMask = tmpRampDownMask; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxPowerMonitorStatusGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_TxPowerMonitorStatus_t * const powerMonitorStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxFuncsChanAddr_e txBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_FUNCS; + uint8_t tempByte = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, powerMonitorStatus, cleanup); + + /* Retrieve the base address for selected tx channel. This will also range check the txChannel parameter */ + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, txChannel, &txBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannel, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionReadbackUpdate_BfSet(device, + NULL, + txBaseAddr, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to set readback update bitfield"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionPeakpowerEn_BfGet(device, + NULL, + txBaseAddr, + &tempByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx PA Protect Peak Power Enable"); + goto cleanup; + } + + if (tempByte == 1U) + { + /* Read power levels only if peak power measurement block is enabled */ + recoveryAction = adrv904x_TxFuncs_PaProtectionPeakPower_BfGet(device, + NULL, + txBaseAddr, + &powerMonitorStatus->peakPower); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read average power"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionPeakErrorPower_BfGet(device, + NULL, + txBaseAddr, + &powerMonitorStatus->peakErrorPower); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read peak error power"); + goto cleanup; + } + } + else + { + powerMonitorStatus->peakPower = 0U; + powerMonitorStatus->peakErrorPower = 0U; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionAvgpowerEn_BfGet(device, + NULL, + txBaseAddr, + &tempByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx PA Protect Avg Power Enable"); + goto cleanup; + } + + if (tempByte == 1U) + { + recoveryAction = adrv904x_TxFuncs_PaProtectionAveragePower_BfGet(device, + NULL, + txBaseAddr, + &powerMonitorStatus->avgPower); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read average power"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionAverageErrorPower_BfGet(device, + NULL, + txBaseAddr, + &powerMonitorStatus->avgErrorPower); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read average error power"); + goto cleanup; + } + } + else + { + powerMonitorStatus->avgPower = 0U; + powerMonitorStatus->avgErrorPower = 0U; + } + + recoveryAction = adrv904x_TxFuncs_PaProtectionAprEn_BfGet(device, + NULL, + txBaseAddr, + &tempByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx PA Protect Average to Peak Ratio Enable"); + goto cleanup; + } + + if (tempByte == 1U) + { + recoveryAction = adrv904x_TxFuncs_PaProtectionAveragePeakRatio_BfGet(device, + NULL, + txBaseAddr, + &powerMonitorStatus->avgPeakRatio); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to read average to peak ratio"); + goto cleanup; + } + } + else + { + powerMonitorStatus->avgPeakRatio = 0U; + } + + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenCfgSet(adi_adrv904x_Device_t* const device, + const uint32_t chanMask, + adi_adrv904x_TxAttenCfg_t* const txAttenCfg) +{ + const uint8_t TX_ATTEN_MODE_SPI = 1U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t chanId = 0U; + uint32_t chanSel = 0U; + adrv904x_BfTxFuncsChanAddr_e txFuncsChanAddr = ADRV904X_BF_SLICE_TX_0__TX_FUNCS; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txAttenCfg, cleanup); + + if (chanMask > ADI_ADRV904X_TX_CHAN_MASK_MAX || + chanMask == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanMask, "Invalid channel mask."); + goto cleanup; + } + + if (txAttenCfg->txAttenStepSize >= ADI_ADRV904X_TXATTEN_INVALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txAttenCfg->txAttenStepSize, "Tx atten step size is invalid."); + goto cleanup; + } + + /* adi_adrv904x_TxAttenUpdateCfgSet already validates everything within txAttenCfg->updateCfg */ + recoveryAction = adi_adrv904x_TxAttenUpdateCfgSet(device, chanMask, &txAttenCfg->updateCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Tx atten config failed to set update config"); + goto cleanup; + } + + for (chanId = 0U; chanId < ADI_ADRV904X_MAX_TXCHANNELS; chanId++) + { + chanSel = 1U << chanId; + if ((chanMask & chanSel) == 0) + { + /* chanId not set in chanMask - skip this channel */ + continue; + } + + /* Convert the chanId to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txFuncsChanAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanId, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + /* Ensure mode is SPI mode */ + recoveryAction = adrv904x_TxFuncs_TxAttenMode_BfSet(device, NULL, txFuncsChanAddr, TX_ATTEN_MODE_SPI); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx Atten Mode"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_TxAttenConfig_BfSet(device, NULL, txFuncsChanAddr, txAttenCfg->txAttenStepSize); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx Use Atten Step Size"); + goto cleanup; + } + device->devStateInfo.txAttenStepSize[chanId] = txAttenCfg->txAttenStepSize; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_TxAttenCfg_t* const txAttenCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxFuncsChanAddr_e txFuncsChanAddr = ADRV904X_BF_SLICE_TX_0__TX_FUNCS; + uint8_t chanId = 0U; + uint8_t tmpByte = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txAttenCfg, cleanup); + + + chanId = adrv904x_TxChannelsToId(txChannel); + if (chanId > ADI_ADRV904X_TX_CHAN_ID_MAX) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanId, "Invalid channel id."); + goto cleanup; + } + + recoveryAction = adi_adrv904x_TxAttenUpdateCfgGet(device, txChannel, &txAttenCfg->updateCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to get tx atten update config"); + goto cleanup; + } + + /* Convert the chanId to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, txChannel, &txFuncsChanAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanId, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + /* Fetch the const step mode config items */ + recoveryAction = adrv904x_TxFuncs_TxAttenConfig_BfGet(device, NULL, txFuncsChanAddr, &tmpByte); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx Atten Step Size"); + goto cleanup; + } + + txAttenCfg->txAttenStepSize = (adi_adrv904x_TxAttenStepSize_e)tmpByte; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxDecimatedPowerCfgSet(adi_adrv904x_Device_t * const device, + adi_adrv904x_TxDecimatedPowerCfg_t txDecPowerCfg[], + const uint32_t numOfDecPowerCfgs) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t cfgIdx = 0U; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + + adrv904x_BfTxFuncsChanAddr_e txFuncsChanBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_FUNCS; + adrv904x_BfTxDigChanAddr_e txDigChanBaseAddr = (adrv904x_BfTxDigChanAddr_e)0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txDecPowerCfg, cleanup); + + if (numOfDecPowerCfgs == 0U) + { + /* no valid configs */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numOfDecPowerCfgs, "Invalid Number of Dec Power Configurations"); + goto cleanup; + } + + /* Loop through the number of configurations and perform range checks */ + for (cfgIdx = 0U; cfgIdx < numOfDecPowerCfgs; ++cfgIdx) + { + recoveryAction = adrv904x_TxDecPowerCfgRangeCheck(device, &txDecPowerCfg[cfgIdx]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Tx Dec power range check Error Reported"); + goto cleanup; + } + } + + /* Write out the configurations */ + for (cfgIdx = 0U; cfgIdx < numOfDecPowerCfgs; ++cfgIdx) + { + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; chanIdx++) + { + chanSel = 1U << chanIdx; + if ((txDecPowerCfg[cfgIdx].txChannelMask & chanSel) > 0) + { + /* Convert the chanId to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txFuncsChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_TxPowerInputSelect_BfSet(device, + NULL, + txFuncsChanBaseAddr, + txDecPowerCfg[cfgIdx].powerInputSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting power measurement input selection"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_TxPowerMeasurementDuration_BfSet(device, + NULL, + txFuncsChanBaseAddr, + txDecPowerCfg[cfgIdx].powerMeasurementDuration); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting power measurement duration"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_TxPeakToPowerMode_BfSet(device, + NULL, + txFuncsChanBaseAddr, + txDecPowerCfg[cfgIdx].peakToPowerMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting peak to power mode"); + goto cleanup; + } + + recoveryAction = adrv904x_TxDigBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txDigChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + + { + /* For ADRV904X, calculate the clock divide rate to match the powerInputSelect */ + uint8_t clkDivRatio = 0; + uint32_t outputRate; + uint32_t clkDiv = 0; + + switch (txDecPowerCfg[cfgIdx].powerInputSelect) + { + case 0: /* Band DUC output */ + outputRate = device->initExtract.dfeCduc.cducOutputRate_kHz[chanIdx]; + break; + case 1: /* DPD output is the same as PFIR */ + case 2: /* QEC output is the same as PFIR */ + case 3: /* PFIR output */ + default: + outputRate = device->initExtract.tx.txChannelCfg[chanIdx].pfirRate_kHz; + break; + } + + if (outputRate == 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "outputRate is 0"); + goto cleanup; + } + + clkDiv = device->initExtract.clocks.hsDigClk_kHz / outputRate; + + switch (clkDiv) + { + case 1: clkDivRatio = 0u; break; + case 2: clkDivRatio = 1u; break; + case 4: clkDivRatio = 2u; break; + case 8: clkDivRatio = 3u; break; + case 16: clkDivRatio = 4u; break; + case 32: clkDivRatio = 5u; break; + case 64: clkDivRatio = 6u; break; + case 128: clkDivRatio = 7u; break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "clocks not divisable by power of 2"); + goto cleanup; + break; + } + + recoveryAction = adrv904x_TxDig_PowerMeasClkDivideRatio_BfSet(device, + NULL, + txDigChanBaseAddr, + clkDivRatio); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Error while setting power meas clock div ratio"); + goto cleanup; + } + + /* Enable/disable the clock */ + recoveryAction = adrv904x_TxDig_PowerMeasClkEnable_BfSet(device, + NULL, + txDigChanBaseAddr, + txDecPowerCfg[cfgIdx].measurementEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Error while enabling power meas clock"); + goto cleanup; + } + } + + if (txDecPowerCfg[cfgIdx].measurementEnable == 1U) + { + recoveryAction = adrv904x_TxDig_StreamprocPfirClkEnable_BfSet(device, + NULL, + txDigChanBaseAddr, + txDecPowerCfg[cfgIdx].measurementEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting tx stream proc pfir clk enable bit"); + goto cleanup; + } + } + + recoveryAction = adrv904x_TxFuncs_TxPowerMeasurementEnable_BfSet(device, + NULL, + txFuncsChanBaseAddr, + txDecPowerCfg[cfgIdx].measurementEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting power measurement enable bit"); + goto cleanup; + } + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxDecimatedPowerCfgGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_TxDecimatedPowerCfg_t * const txDecPowerCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxFuncsChanAddr_e txFuncsChanBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_FUNCS; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txDecPowerCfg, cleanup); + + if ((txChannel != ADI_ADRV904X_TX0) && + (txChannel != ADI_ADRV904X_TX1) && + (txChannel != ADI_ADRV904X_TX2) && + (txChannel != ADI_ADRV904X_TX3) && + (txChannel != ADI_ADRV904X_TX4) && + (txChannel != ADI_ADRV904X_TX5) && + (txChannel != ADI_ADRV904X_TX6) && + (txChannel != ADI_ADRV904X_TX7)) + { + /* Invalid tx channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannel, "Invalid Tx channel selection"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, txChannel, &txFuncsChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannel, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_TxPowerInputSelect_BfGet(device, + NULL, + txFuncsChanBaseAddr, + &txDecPowerCfg->powerInputSelect); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading power measurement input selection"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_TxPowerMeasurementDuration_BfGet(device, + NULL, + txFuncsChanBaseAddr, + &txDecPowerCfg->powerMeasurementDuration); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading power measurement duration"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_TxPeakToPowerMode_BfGet(device, + NULL, + txFuncsChanBaseAddr, + &txDecPowerCfg->peakToPowerMode); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading peak to power mode bit"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_TxPowerMeasurementEnable_BfGet(device, + NULL, + txFuncsChanBaseAddr, + &txDecPowerCfg->measurementEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading power measurement enable bit"); + goto cleanup; + } + + txDecPowerCfg->txChannelMask = (uint32_t)txChannel; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxDecimatedPowerGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxChannels_e txChannel, + uint8_t * const powerReadBack, + uint8_t * const powerPeakReadBack) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxFuncsChanAddr_e txFuncsChanBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_FUNCS; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, powerReadBack, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, powerPeakReadBack, cleanup); + + if ((txChannel != ADI_ADRV904X_TX0) && + (txChannel != ADI_ADRV904X_TX1) && + (txChannel != ADI_ADRV904X_TX2) && + (txChannel != ADI_ADRV904X_TX3) && + (txChannel != ADI_ADRV904X_TX4) && + (txChannel != ADI_ADRV904X_TX5) && + (txChannel != ADI_ADRV904X_TX6) && + (txChannel != ADI_ADRV904X_TX7)) + { + /* Invalid Tx channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannel, "Invalid channel selection"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncsBitfieldAddressGet(device, txChannel, &txFuncsChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannel, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_TxPowerMeasurementReadback_BfSet(device, + NULL, + txFuncsChanBaseAddr, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting decimated power readback latch bit"); + goto cleanup; + } + + recoveryAction = adrv904x_TxFuncs_TxPower_BfGet(device, + NULL, + txFuncsChanBaseAddr, + powerReadBack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading decimated power for selected Tx channel"); + goto cleanup; + } + + + recoveryAction = adrv904x_TxFuncs_TxPowerLargestPeak_BfGet(device, + NULL, + txFuncsChanBaseAddr, + powerPeakReadBack); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading decimated peak power for selected Tx channel"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenPhaseSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxAttenPhaseCfg_t * const txAttenPhaseCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_SetTxAttenPhase_t txAttenPhaseInfo; + adrv904x_CpuCmd_SetTxAttenPhaseResp_t cmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + uint32_t i = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txAttenPhaseCfg, cleanup); + ADI_LIBRARY_MEMSET(&txAttenPhaseInfo, 0, sizeof(txAttenPhaseInfo)); + ADI_LIBRARY_MEMSET(&cmdRsp, 0, sizeof(cmdRsp)); + + if (txAttenPhaseCfg->chanSelect == 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txAttenPhaseCfg->chanSelect, "Invalid chanSelect provided."); + goto cleanup; + } + + /* Prepare the command payload */ + txAttenPhaseInfo.chanSelect = (uint8_t) txAttenPhaseCfg->chanSelect; + for (i = 0U; i < ADI_ADRV904X_TX_ATTEN_PHASE_SIZE; i++) + { + txAttenPhaseInfo.txAttenPhase[i] = ADRV904X_HTOCS(txAttenPhaseCfg->txAttenPhase[i]); + } + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_SET_TX_ATTEN_PHASE, + (void*)&txAttenPhaseInfo, + sizeof(txAttenPhaseInfo), + (void*)&cmdRsp, + sizeof(cmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(cmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxAttenPhaseGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_TxAttenPhaseCfg_t* const txRbConfig) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_CpuCmd_GetTxAttenPhase_t txAttenPhaseCfgRbCmd; + adrv904x_CpuCmd_GetTxAttenPhaseResp_t txAttenPhaseCfgGetcmdRsp; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + uint32_t i = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txRbConfig, cleanup); + ADI_LIBRARY_MEMSET(&txAttenPhaseCfgRbCmd, 0, sizeof(txAttenPhaseCfgRbCmd)); + ADI_LIBRARY_MEMSET(&txAttenPhaseCfgGetcmdRsp, 0, sizeof(txAttenPhaseCfgGetcmdRsp)); + + /* Test if channel mask is 0 or has more than one channel set */ + if (txRbConfig->chanSelect == (uint8_t) ADI_ADRV904X_TXOFF || + txRbConfig->chanSelect > (uint8_t) ADI_ADRV904X_TX7 || + (((txRbConfig->chanSelect - 1) & txRbConfig->chanSelect) != 0U)) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txRbConfig->chanSelect, "Invalid chanSelect provided."); + goto cleanup; + } + + /* Prepare the command payload */ + txAttenPhaseCfgRbCmd.chanSelect = (uint8_t) txRbConfig->chanSelect; + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_GET_TX_ATTEN_PHASE, + (void*)&txAttenPhaseCfgRbCmd, + sizeof(txAttenPhaseCfgRbCmd), + (void*)&txAttenPhaseCfgGetcmdRsp, + sizeof(txAttenPhaseCfgGetcmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO(txAttenPhaseCfgGetcmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* Extract the command-specific response from the response payload */ + for (i = 0U; i < ADI_ADRV904X_TX_ATTEN_PHASE_SIZE; i++) + { + txRbConfig->txAttenPhase[i] = ADRV904X_CTOHS(txAttenPhaseCfgGetcmdRsp.txAttenPhase[i]); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DtxCfgSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DtxCfg_t dtxCfg[], + const uint32_t numDtxCfgs) +{ + static const uint32_t txScratchPad6[] = { (uint32_t)ADRV904X_ADDR_TX0_STREAM_SCRATCH6, + (uint32_t)ADRV904X_ADDR_TX1_STREAM_SCRATCH6, + (uint32_t)ADRV904X_ADDR_TX2_STREAM_SCRATCH6, + (uint32_t)ADRV904X_ADDR_TX3_STREAM_SCRATCH6, + (uint32_t)ADRV904X_ADDR_TX4_STREAM_SCRATCH6, + (uint32_t)ADRV904X_ADDR_TX5_STREAM_SCRATCH6, + (uint32_t)ADRV904X_ADDR_TX6_STREAM_SCRATCH6, + (uint32_t)ADRV904X_ADDR_TX7_STREAM_SCRATCH6 + }; + static const uint32_t TX_SCRATCH_MASK = 0xFFFF0103U; + static const uint32_t DTX_MODE_MASK = 0x00000003U; + static const uint32_t DTX_MODE_SHIFT = 0U; + static const uint32_t DTX_ZERO_COUNT_MASK = 0xFFFF0000U; + static const uint32_t DTX_ZERO_COUNT_SHIFT = 16U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t cfgIdx = 0U; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + uint32_t txScratch6Value = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dtxCfg, cleanup); + + if (numDtxCfgs == 0U) + { + /* no valid configs */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numDtxCfgs, "Invalid Number of Tx DTX Configurations"); + goto cleanup; + } + + /* Loop through the number of configurations and perform range checks */ + for (cfgIdx = 0U; cfgIdx < numDtxCfgs; ++cfgIdx) + { + /*Check that if requested Tx Channel valid*/ + if (((dtxCfg[cfgIdx].txChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (dtxCfg[cfgIdx].txChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dtxCfg[cfgIdx].txChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + /*Check that if requested DTX Mode is valid*/ + if (dtxCfg[cfgIdx].dtxMode > ADI_ADRV904X_DTXMODE_PIN) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dtxCfg[cfgIdx].dtxMode, + "Invalid DTX mode selection. Valid values are 0/1/2/3"); + goto cleanup; + } + } + + /* Write out the configurations to appropriate bitfields */ + for (cfgIdx = 0U; cfgIdx < numDtxCfgs; ++cfgIdx) + { + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(dtxCfg[cfgIdx].txChannelMask, chanSel)) + { + /* Update TX scratch register with DTX config for specific channel */ + recoveryAction = adi_adrv904x_Register32Read(device, NULL, txScratchPad6[chanIdx], &txScratch6Value, TX_SCRATCH_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot read Tx scratch pad register 6"); + goto cleanup; + } + + txScratch6Value &= (~DTX_MODE_MASK); + txScratch6Value |= ((uint32_t)(dtxCfg[cfgIdx].dtxMode) << DTX_MODE_SHIFT); + txScratch6Value &= (~DTX_ZERO_COUNT_MASK); + txScratch6Value |= ((uint32_t)(dtxCfg[cfgIdx].dtxZeroCounter) << DTX_ZERO_COUNT_SHIFT); + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, txScratchPad6[chanIdx], txScratch6Value, TX_SCRATCH_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot write Tx scratch pad register 6"); + goto cleanup; + } + } + } + + /* For each cfgIdx, trigger stream to update DTX mode config registers while writing to DTX ClearStatus bits */ + recoveryAction = adrv904x_TxStreamTrigger(device, (uint8_t)dtxCfg[cfgIdx].txChannelMask, (uint8_t)ADRV904X_STREAM_TX_WRITE_DTX_MODE_CONFIG_CLRSTATUS); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dtxCfg[cfgIdx].txChannelMask, + "Error while triggering TX stream"); + goto cleanup; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DtxCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_DtxCfg_t* const dtxCfg) +{ + static const uint32_t txScratchPad6[] = { (uint32_t)ADRV904X_ADDR_TX0_STREAM_SCRATCH6, + (uint32_t)ADRV904X_ADDR_TX1_STREAM_SCRATCH6, + (uint32_t)ADRV904X_ADDR_TX2_STREAM_SCRATCH6, + (uint32_t)ADRV904X_ADDR_TX3_STREAM_SCRATCH6, + (uint32_t)ADRV904X_ADDR_TX4_STREAM_SCRATCH6, + (uint32_t)ADRV904X_ADDR_TX5_STREAM_SCRATCH6, + (uint32_t)ADRV904X_ADDR_TX6_STREAM_SCRATCH6, + (uint32_t)ADRV904X_ADDR_TX7_STREAM_SCRATCH6 + }; + static const uint32_t DTX_MODE_MASK = 0x00000003U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxDigChanAddr_e txDigChanBaseAddr = (adrv904x_BfTxDigChanAddr_e)0U; + uint32_t txScratch6Value = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dtxCfg, cleanup); + + if ((txChannel != ADI_ADRV904X_TX0) && + (txChannel != ADI_ADRV904X_TX1) && + (txChannel != ADI_ADRV904X_TX2) && + (txChannel != ADI_ADRV904X_TX3) && + (txChannel != ADI_ADRV904X_TX4) && + (txChannel != ADI_ADRV904X_TX5) && + (txChannel != ADI_ADRV904X_TX6) && + (txChannel != ADI_ADRV904X_TX7)) + { + /* Invalid tx channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannel, "Invalid Tx channel selection"); + goto cleanup; + } + + for (uint32_t chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + if ((1U << chanIdx) == txChannel) + { + /* Read DTX configuration stored in scratch register to retrieve DTX Mode */ + recoveryAction = adi_adrv904x_Register32Read(device, NULL, txScratchPad6[chanIdx], &txScratch6Value, DTX_MODE_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot read Tx scratch pad register 6"); + goto cleanup; + } + + dtxCfg->dtxMode = (adi_adrv904x_DtxMode_e)(txScratch6Value); + } + } + + /* Retrieve Zero count via BfGet */ + recoveryAction = adrv904x_TxDigBitfieldAddressGet(device, txChannel, &txDigChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannel, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + recoveryAction = adrv904x_TxDig_DtxZeroCounter_BfGet(device, + NULL, + txDigChanBaseAddr, + &dtxCfg->dtxZeroCounter); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting dtx zero counter "); + goto cleanup; + } + + dtxCfg->txChannelMask = (uint32_t)txChannel; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DtxGpioCfgSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_DtxGpioCfg_t* dtxGpioCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + + uint8_t profileCfgOk = 0U; + uint8_t dtxPinChannelMasks[ADI_ADRV904X_DTX_INPUT_MAX] = { 0U }; + adi_adrv904x_GpioPinSel_e gpioReadback = ADI_ADRV904X_GPIO_INVALID; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dtxGpioCfg, cleanup); + + /* Check all Dtx GPIO if valid */ + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + /* Check if pin is valid */ + if (dtxGpioCfg->dtxGpioTxSel[chanIdx] > ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid DTX GPIO pin selected. To disable, please select ADI_ADRV904X_GPIO_INVALID"); + goto cleanup; + } + + /* Skip ADI_ADRV904X_GPIO_INVALID */ + if (dtxGpioCfg->dtxGpioTxSel[chanIdx] == ADI_ADRV904X_GPIO_INVALID) + { + continue; + } + + + /* Confirm Dtx GPIO has been configured as Dtx input in profile and build channel mask per DTX input pin */ + profileCfgOk = 0U; + for (int dtxIdx = 0U; dtxIdx < ADI_ADRV904X_DTX_INPUT_MAX; dtxIdx++) + { + if (dtxGpioCfg->dtxGpioTxSel[chanIdx] == device->devStateInfo.dtxInputMapping.dtxInput[dtxIdx]) + { + dtxPinChannelMasks[dtxIdx] |= (1U << chanIdx); + profileCfgOk = 1U; + } + } + if (profileCfgOk == 0U) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "DTX GPIO pin selected has not been configured as DTX input in device profile"); + goto cleanup; + } + } + + /* First release all GPIOs used for tx internal signals */ + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + chanSel = 1U << chanIdx; + recoveryAction = adrv904x_GpioSignalFind(device, + &gpioReadback, + ADI_ADRV904X_GPIO_SIGNAL_DTX_FORCE_PIN, + (adi_adrv904x_Channels_e)(chanSel)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read gpio for selected signal"); + goto cleanup; + } + + if (gpioReadback != ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = adrv904x_GpioSignalRelease(device, + gpioReadback, + ADI_ADRV904X_GPIO_SIGNAL_DTX_FORCE_PIN, + (adi_adrv904x_Channels_e)(1U <common, recoveryAction, "Failure to release gpio"); + goto cleanup; + } + } + } + + /* Then assign new GPIOs for Tx internal signals */ + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + if (dtxGpioCfg->dtxGpioTxSel[chanIdx] != ADI_ADRV904X_GPIO_INVALID) + { + recoveryAction = adrv904x_GpioSignalSet(device, + dtxGpioCfg->dtxGpioTxSel[chanIdx], + ADI_ADRV904X_GPIO_SIGNAL_DTX_FORCE_PIN, + (adi_adrv904x_Channels_e)(1U << chanIdx)); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Failure to assign selected signal to GPIO for chanIdx"); + goto cleanup; + } + } + } + + + /* Write DTX input channel masks to core stream scratch registers */ + recoveryAction = adi_adrv904x_RegistersByteWrite(device, + NULL, + (uint32_t)ADRV904X_ADDR_CORE_STREAM_SCRATCH481, + dtxPinChannelMasks, + ADI_ADRV904X_DTX_INPUT_MAX); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Failure to write channel masks to scratch registers"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DtxGpioCfgGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_DtxGpioCfg_t* const dtxGpioCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + adi_adrv904x_GpioPinSel_e gpioReadback = ADI_ADRV904X_GPIO_INVALID; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dtxGpioCfg, cleanup); + + /* Then assign new GPIOs for Tx internal signals */ + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + chanSel = 1U << chanIdx; + recoveryAction = adrv904x_GpioSignalFind(device, + &gpioReadback, + ADI_ADRV904X_GPIO_SIGNAL_DTX_FORCE_PIN, + (adi_adrv904x_Channels_e)chanSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read gpio for selected signal"); + goto cleanup; + } + + dtxGpioCfg->dtxGpioTxSel[chanIdx] = gpioReadback; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DtxForceSet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const uint8_t dtxForce) +{ + static const uint32_t txScratchPad6[] = { (uint32_t)ADRV904X_ADDR_TX0_STREAM_SCRATCH6, + (uint32_t)ADRV904X_ADDR_TX1_STREAM_SCRATCH6, + (uint32_t)ADRV904X_ADDR_TX2_STREAM_SCRATCH6, + (uint32_t)ADRV904X_ADDR_TX3_STREAM_SCRATCH6, + (uint32_t)ADRV904X_ADDR_TX4_STREAM_SCRATCH6, + (uint32_t)ADRV904X_ADDR_TX5_STREAM_SCRATCH6, + (uint32_t)ADRV904X_ADDR_TX6_STREAM_SCRATCH6, + (uint32_t)ADRV904X_ADDR_TX7_STREAM_SCRATCH6 + }; + static const uint32_t TX_SCRATCH_MASK = 0xFFFF0103U; + static const uint32_t DTX_FORCE_MASK = 0x00000100U; + static const uint32_t DTX_FORCE_SHIFT = 8U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + uint32_t txScratch6Value = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + /*Check that if requested Tx Channel valid*/ + if (((txChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (txChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + /*Check that if requested DTX Force is valid*/ + if (dtxForce > ADI_ENABLE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + dtxForce, + "Invalid DTX Force bit. Valid values are 0/1"); + goto cleanup; + } + + + /* Write out the configurations to appropriate bitfields */ + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(txChannelMask, chanSel)) + { + /* Update TX scratch register with DTX config for specific channel */ + recoveryAction = adi_adrv904x_Register32Read(device, NULL, txScratchPad6[chanIdx], &txScratch6Value, TX_SCRATCH_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot read Tx scratch pad register 6"); + goto cleanup; + } + + txScratch6Value = (txScratch6Value & (~DTX_FORCE_MASK)) | ((uint32_t)(dtxForce) << DTX_FORCE_SHIFT); + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, txScratchPad6[chanIdx], txScratch6Value, TX_SCRATCH_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot write Tx scratch pad register 6"); + goto cleanup; + } + } + } + + recoveryAction = adrv904x_TxStreamTrigger(device, (uint8_t)txChannelMask, (uint8_t)ADRV904X_STREAM_TX_WRITE_DTX_MODE_CONFIG); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while triggering TX stream"); + goto cleanup; + } + + + /* Trigger stream to execute manual DTX activate/deactivate */ + if (dtxForce == ADI_ENABLE) + { + recoveryAction = adrv904x_TxStreamTrigger(device, (uint8_t)txChannelMask, (uint8_t)ADRV904X_STREAM_TX_WRITE_DTX_MANUAL_ACTIVATE); + } + else + { + recoveryAction = adrv904x_TxStreamTrigger(device, (uint8_t)txChannelMask, (uint8_t)ADRV904X_STREAM_TX_WRITE_DTX_MANUAL_DEACTIVATE); + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Error while triggering TX stream"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DtxStatusGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + uint8_t * const dtxStatus) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxDigChanAddr_e txDigChanBaseAddr = (adrv904x_BfTxDigChanAddr_e)0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dtxStatus, cleanup); + + if ((txChannel != ADI_ADRV904X_TX0) && + (txChannel != ADI_ADRV904X_TX1) && + (txChannel != ADI_ADRV904X_TX2) && + (txChannel != ADI_ADRV904X_TX3) && + (txChannel != ADI_ADRV904X_TX4) && + (txChannel != ADI_ADRV904X_TX5) && + (txChannel != ADI_ADRV904X_TX6) && + (txChannel != ADI_ADRV904X_TX7)) + { + /* Invalid tx channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannel, "Invalid Tx channel selection"); + goto cleanup; + } + + recoveryAction = adrv904x_TxDigBitfieldAddressGet(device, txChannel, &txDigChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannel, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + recoveryAction = adrv904x_TxDig_DtxStatus_BfGet(device, + NULL, + txDigChanBaseAddr, + dtxStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting dtx mode "); + goto cleanup; + + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrTssiConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t channelMask, + const adi_adrv904x_DfeSvcDfePwrMtrTssiCfg_t *pPwrMtrTssiCfg, + const adi_adrv904x_DfeSvcDfePwrMtrTssi_e meter, + const adi_adrv904x_DfeSvcDfePwrMtrTssiSrc_e source) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adrv904x_DfeSvcCmdDfeMtrTssiConfigSet_t cmdStruct; + adrv904x_DfeSvcCmdGenericResp_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pPwrMtrTssiCfg, cleanup); + + ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + /* Validate channelMask, meter, source */ + recoveryAction = adrv904x_ValidateMask((uint8_t)channelMask, 0u); /* allow multiples */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMask, "Invalid channel mask"); + goto cleanup; + } + + /* Validate pPwrMtrTssiCfg parameters: */ + if (meter >= ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_NUM_TSSI_METERS) + { + /* 0: TSSI_1, 1: TSSI_2, 2: ORx, 3~10: CDUC TSSI 1~8 */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + meter, + "TSSI meter is invalid. Valid values defined by adi_adrv904x_DfeSvcDfePwrMtrTssi_e"); + + goto cleanup; + } + + if (meter == ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_TSSI_TX_1) /* TSSI_1 (See TxSliceUserGuide 9.4) */ + { + if (source > ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_PRE_DPD_HB2_OUT_AFTER_HC) + { + /* This is a 2 bit register field: + * Pre-DPD HB1 (0) --> 2'b00 + * Pre-DPD HB2 (1) --> 2'b01 NOTE: output after hard clipper + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrTssiCfg->sourceSelect, + "TSSI sourceSelect is invalid. Valid values are 0,1 (adi_adrv904x_DfeSvcDfePwrMtrTssiSrc_e)"); + + goto cleanup; + } + } + if (meter == ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_TSSI_TX_2) /* TSSI_2 (See TxSliceUserGuide 9.4) */ + { + if ((source < ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_CFR_IN) || + (source > ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_POST_DPD_HB1_OUT)) + { + /* This is a 2 bit register field. + * CFR input (2) --> 2'b01 + * CFR output (3) --> 2'b01 + * DPD HB1 out (4) --> 2'b10 + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrTssiCfg->sourceSelect, + "TSSI sourceSelect is invalid. Valid values are 2,3,4 (adi_adrv904x_DfeSvcDfePwrMtrTssiSrc_e)"); + + goto cleanup; + } + } + + if (pPwrMtrTssiCfg->opMode > 2u) + { + /* 2'b00 - the duration of measurement is non-power of 2. In this case, + * two or more of the tssi_meas_duration0/1/2/3/_duc* are used. + * The power from each duration is weighted by tx_tssi_mul_factor0/1/2/3_duc*. + * If a given multiplication factor is 0, that duration is not included in the + * calculation. It is required that the lower most multiplication factors can be 0. + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrTssiCfg->opMode, + "TSSI default mode is invalid. Valid values are 0 and 1."); + + goto cleanup; + } + + if (pPwrMtrTssiCfg->measMode > 2u) + { + /* 2'b00 - Power measurement starts immediately when tx_tssi_duc*_enable bit-field is set. + * 2'b01 - Power measurement starts at the next TxOn. There is a delay after the TxOn configured + * by tx_tssi_start_delay that has to expire before measurement starts. + * Once measurement is complete, the block waits for next TxOn. + * 2'b10 - Power measurement starts at the next TxOn. There is a delay after the TxOn configured + * by tx_tssi_start_delay that has to expire before measurement starts. + * Once measurement is complete, the block waits for a period specified by + * tx_tssi_wait_delay and then starts the next measurement. + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrTssiCfg->measMode, + "TSSI measurement mode is invalid. Valid values are 0 - 2."); + + goto cleanup; + } + + if (pPwrMtrTssiCfg->radioSeqPinModeEnable > 1u) + { + /* When set, this bitfield allows the radio sequencer to restart the power measurement. */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrTssiCfg->radioSeqPinModeEnable, + "TSSI radio seq pin mode enable invalid. Valid values are 0 and 1."); + + goto cleanup; + } + + if ((pPwrMtrTssiCfg->startDelay > 0x1FFFU) || /* 13 bits */ + ((pPwrMtrTssiCfg->measMode != 0u) && (pPwrMtrTssiCfg->startDelay == 0U))) /* 0 only allowed in FDD mode */ + { + /* This delay is measured from the rising edge of TxOn signal and is used to delay start of + * measurement in modes described by pPwrMtrTssiCfg->measMode. */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrTssiCfg->startDelay, + "TSSI startDelay is invalid. Valid values are 0 or 1 - 0x1FFF. FDD allows 0."); + + goto cleanup; + } + + if ((pPwrMtrTssiCfg->waitDelay > 0xFFFFFFU) || /* 24 bits */ + ((pPwrMtrTssiCfg->measMode != 0u) && (pPwrMtrTssiCfg->waitDelay == 0U))) /* 0 only allowed in FDD mode */ + { + /* This delay is measured at the end of measurement. + * It delays the start of next measurement in the meas mode = 0 and 2. + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrTssiCfg->waitDelay, + "TSSI waitDelay is invalid. Valid values are 0 or 1 - 0xFFFFFF. FDD allows 0."); + + goto cleanup; + } + + if ((pPwrMtrTssiCfg->contDelay > 0x3FFFU) || /* 14 bits */ + ((pPwrMtrTssiCfg->measMode != 0u) && (pPwrMtrTssiCfg->contDelay == 0U)))/* 0 only allowed in FDD mode */ + { + /* This delay is measured from the rising edge of TxOn signal and is used to delay start of + * measurement in modes described by pPwrMtrTssiCfg->measMode. This delay comes in to play + * only in certain mode when a measurement is not completed during TxOn. + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrTssiCfg->contDelay, + "TSSI contDelay is invalid. Valid values are 0 or 1 - 0x3FFF. FDD allows 0."); + + goto cleanup; + } + + if (pPwrMtrTssiCfg->fddPinMode > 1U) /* 1 bit */ + { + /* Enable pin mode for FDD operation. + * When enabled, a GPIO pin can be used to trigger the start of power measurement. + * When the GPIO pin goes high, the start delay counter is enabled. + * Power measurement starts at the expiry of that counter. + * See GPIO documentation on how to configure a specific pin as a trigger. + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrTssiCfg->fddPinMode, + "TSSI fddPinMode is invalid. Valid values are 0 and 1."); + + goto cleanup; + } + + if (pPwrMtrTssiCfg->duration0 > 28U) + { + /* Measurement duration for TSSI power. + * Number of samples = 2 ^ (tx_tss_measurement_duration_duc* +4) + * This is the only duration that is used when meas mode = 1. + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrTssiCfg->duration0, + "TSSI duration0 is invalid. Valid values are 0 - 28."); + + goto cleanup; + } + + if (pPwrMtrTssiCfg->duration1 > 28U) + { + /* Measurement duration for TSSI power. + * Number of samples = 2 ^ (tx_tss_measurement_duration_duc* +4) + * This is the only duration that is used when meas mode = 0. + * It is required to configure the multiplier factor correctly to use this duration. + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrTssiCfg->duration1, + "TSSI duration1 is invalid. Valid values are 0 - 28."); + + goto cleanup; + } + + if (pPwrMtrTssiCfg->duration2 > 28U) + { + /* Measurement duration for TSSI power. + * Number of samples = 2 ^ (tx_tss_measurement_duration_duc* +4) + * This is the only duration that is used when meas mode = 0. + * It is required to configure the multiplier factor correctly to use this duration. + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrTssiCfg->duration2, + "TSSI duration2 is invalid. Valid values are 0 - 28."); + + goto cleanup; + } + + if (pPwrMtrTssiCfg->duration3 > 28U) + { + /* Measurement duration for TSSI power. + * Number of samples = 2 ^ (tx_tss_measurement_duration_duc* +4) + * This is the only duration that is used when meas mode = 0. + * It is required to configure the multiplier factor correctly to use this duration. + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrTssiCfg->duration3, + "TSSI duration3 is invalid. Valid values are 0 - 28."); + + goto cleanup; + } + + if (pPwrMtrTssiCfg->mulFactor0 > 0x3FFU) + { + /* This bit-field is used when tx_tssi_default_mode = 0. + * This is a 0.8 number. This is the weight of power calculated during duration 0. + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrTssiCfg->mulFactor0, + "TSSI mulFactor0 is invalid. Valid values are 0 - 0x3FF."); + + goto cleanup; + } + + if (pPwrMtrTssiCfg->mulFactor1 > 0x3FFU) + { + /* This bit-field is used when tx_tssi_default_mode = 0. + * This is a 0.8 number. This is the weight of power calculated during duration 1. + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrTssiCfg->mulFactor1, + "TSSI mulFactor1 is invalid. Valid values are 0 - 0x3FF."); + + goto cleanup; + } + + if (pPwrMtrTssiCfg->mulFactor2 > 0x3FFU) + { + /* This bit-field is used when tx_tssi_default_mode = 0. + * This is a 0.8 number. This is the weight of power calculated during duration 2. + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrTssiCfg->mulFactor2, + "TSSI mulFactor2 is invalid. Valid values are 0 - 0x3FF."); + + goto cleanup; + } + + if (pPwrMtrTssiCfg->mulFactor3 > 0x3FFU) + { + /* This bit-field is used when tx_tssi_default_mode = 0. + * This is a 0.8 number. This is the weight of power calculated during duration 3. + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrTssiCfg->mulFactor3, + "TSSI mulFactor3 is invalid. Valid values are 0 - 0x3FF."); + + goto cleanup; + } + + if (pPwrMtrTssiCfg->captureTimeUsec > 500000U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrTssiCfg->captureTimeUsec, + "TSSI captureTimeUsec is invalid. Valid values are < 500000 (0.5 sec)"); + + goto cleanup; + } + + cmdStruct.chanMask = channelMask; + cmdStruct.meter = meter; + cmdStruct.source = source; + + cmdStruct.pwrMtrTssiCfg.resetAtGainChange = (uint8_t)0; /* deprecated and unused so always set to 0 */ + cmdStruct.pwrMtrTssiCfg.radioSeqPinModeEnable = (uint8_t)pPwrMtrTssiCfg->radioSeqPinModeEnable; + cmdStruct.pwrMtrTssiCfg.opMode = (uint8_t)pPwrMtrTssiCfg->opMode; + cmdStruct.pwrMtrTssiCfg.measMode = (uint8_t)pPwrMtrTssiCfg->measMode; + cmdStruct.pwrMtrTssiCfg.startDelay = (uint16_t)ADRV904X_HTOCS(pPwrMtrTssiCfg->startDelay); + cmdStruct.pwrMtrTssiCfg.contDelay = (uint16_t)ADRV904X_HTOCS(pPwrMtrTssiCfg->contDelay); + cmdStruct.pwrMtrTssiCfg.waitDelay = (uint32_t)ADRV904X_HTOCL(pPwrMtrTssiCfg->waitDelay); + cmdStruct.pwrMtrTssiCfg.fddPinMode = (uint8_t)pPwrMtrTssiCfg->fddPinMode; + cmdStruct.pwrMtrTssiCfg.duration0 = (uint8_t)pPwrMtrTssiCfg->duration0; + cmdStruct.pwrMtrTssiCfg.duration1 = (uint8_t)pPwrMtrTssiCfg->duration1; + cmdStruct.pwrMtrTssiCfg.duration2 = (uint8_t)pPwrMtrTssiCfg->duration2; + cmdStruct.pwrMtrTssiCfg.duration3 = (uint8_t)pPwrMtrTssiCfg->duration3; + cmdStruct.pwrMtrTssiCfg.mulFactor0 = (uint16_t)ADRV904X_HTOCS(pPwrMtrTssiCfg->mulFactor0); + cmdStruct.pwrMtrTssiCfg.mulFactor1 = (uint16_t)ADRV904X_HTOCS(pPwrMtrTssiCfg->mulFactor1); + cmdStruct.pwrMtrTssiCfg.mulFactor2 = (uint16_t)ADRV904X_HTOCS(pPwrMtrTssiCfg->mulFactor2); + cmdStruct.pwrMtrTssiCfg.mulFactor3 = (uint16_t)ADRV904X_HTOCS(pPwrMtrTssiCfg->mulFactor3); + cmdStruct.pwrMtrTssiCfg.setLinearThreshold = (uint8_t)pPwrMtrTssiCfg->setLinearThreshold; + cmdStruct.pwrMtrTssiCfg.linearThreshold = (uint32_t)ADRV904X_HTOCL(pPwrMtrTssiCfg->linearThreshold); + cmdStruct.pwrMtrTssiCfg.enabled = (uint8_t)pPwrMtrTssiCfg->enabled; + cmdStruct.pwrMtrTssiCfg.debug = (uint32_t)ADRV904X_HTOCL(pPwrMtrTssiCfg->debug); + cmdStruct.pwrMtrTssiCfg.captureTimeUsec = (uint32_t)ADRV904X_HTOCL(pPwrMtrTssiCfg->captureTimeUsec); + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_TSSI_CONFIG_SET, + (uint8_t *)&cmdStruct, + sizeof(cmdStruct), + (uint8_t *)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(respStruct.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrTssiConfigGet(adi_adrv904x_Device_t* const device, + const uint32_t channelSel, + adi_adrv904x_DfeSvcDfePwrMtrTssiCfg_t *pPwrMtrTssiCfg, + const adi_adrv904x_DfeSvcDfePwrMtrTssi_e meter) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adrv904x_DfeSvcCmdDfeMtrTssiConfigGet_t cmdStruct; + adrv904x_DfeSvcCmdDfeMtrTssiConfigGetResp_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pPwrMtrTssiCfg, cleanup); + + ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + /* Validate channelSel */ + recoveryAction = adrv904x_ValidateMask((uint8_t)channelSel, 1u); /* don't allow multiples */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelSel, "Invalid channel mask"); + goto cleanup; + } + + /* Validate meter parameter: */ + if (meter >= ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_NUM_TSSI_METERS) + { + /* 0: Tx TSSI (1), 1: Tx TSSI (2), 2: ORx TSSI, 3~10: CDUC TSSI 1~8 */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + meter, + "TSSI meter is invalid. Valid values defined by adi_adrv904x_DfeSvcDfePwrMtrTssi_e"); + + goto cleanup; + } + + cmdStruct.chanMask = (uint8_t)channelSel; + cmdStruct.meter = (uint8_t)meter; + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_TSSI_CONFIG_GET, + (uint8_t *)&cmdStruct, + sizeof(cmdStruct), + (uint8_t *)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(respStruct.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* Copy response parameters to pPwrMtrTssiCfg */ + pPwrMtrTssiCfg->resetAtGainChange = (uint8_t)respStruct.pwrMtrTssiCfg.resetAtGainChange; /* deprecated and unused */ + pPwrMtrTssiCfg->sourceSelect = (uint8_t)respStruct.pwrMtrTssiCfg.sourceSelect; + pPwrMtrTssiCfg->radioSeqPinModeEnable = (uint8_t)respStruct.pwrMtrTssiCfg.radioSeqPinModeEnable; + pPwrMtrTssiCfg->opMode = (uint8_t)respStruct.pwrMtrTssiCfg.opMode; + pPwrMtrTssiCfg->measMode = (uint8_t)respStruct.pwrMtrTssiCfg.measMode; + pPwrMtrTssiCfg->startDelay = (uint16_t)ADRV904X_CTOHS(respStruct.pwrMtrTssiCfg.startDelay); + pPwrMtrTssiCfg->contDelay = (uint16_t)ADRV904X_CTOHS(respStruct.pwrMtrTssiCfg.contDelay); + pPwrMtrTssiCfg->waitDelay = (uint32_t)ADRV904X_CTOHL(respStruct.pwrMtrTssiCfg.waitDelay); + pPwrMtrTssiCfg->fddPinMode = (uint8_t)respStruct.pwrMtrTssiCfg.fddPinMode; + pPwrMtrTssiCfg->duration0 = (uint8_t)respStruct.pwrMtrTssiCfg.duration0; + pPwrMtrTssiCfg->duration1 = (uint8_t)respStruct.pwrMtrTssiCfg.duration1; + pPwrMtrTssiCfg->duration2 = (uint8_t)respStruct.pwrMtrTssiCfg.duration2; + pPwrMtrTssiCfg->duration3 = (uint8_t)respStruct.pwrMtrTssiCfg.duration3; + pPwrMtrTssiCfg->mulFactor0 = (uint16_t)ADRV904X_CTOHS(respStruct.pwrMtrTssiCfg.mulFactor0); + pPwrMtrTssiCfg->mulFactor1 = (uint16_t)ADRV904X_CTOHS(respStruct.pwrMtrTssiCfg.mulFactor1); + pPwrMtrTssiCfg->mulFactor2 = (uint16_t)ADRV904X_CTOHS(respStruct.pwrMtrTssiCfg.mulFactor2); + pPwrMtrTssiCfg->mulFactor3 = (uint16_t)ADRV904X_CTOHS(respStruct.pwrMtrTssiCfg.mulFactor3); + pPwrMtrTssiCfg->setLinearThreshold = (uint8_t)respStruct.pwrMtrTssiCfg.setLinearThreshold; + pPwrMtrTssiCfg->linearThreshold = (uint32_t)ADRV904X_CTOHL(respStruct.pwrMtrTssiCfg.linearThreshold); + pPwrMtrTssiCfg->captureTimeUsec = (uint32_t)ADRV904X_HTOCL(respStruct.pwrMtrTssiCfg.captureTimeUsec); + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_PostCfrGainSet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const uint32_t gain_milli) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + static const uint32_t MAX_GAIN_MDB = 4000U; + static const uint32_t MAX_GAIN_BFV = 255U; + uint32_t gainBfVal32 = 0U; + uint8_t gainBfVal = 0U; + adrv904x_BfTxDfeDigRegsChanAddr_e txBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DFE_DIG_REGS; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + if (gain_milli > MAX_GAIN_MDB) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + gain_milli, + "Gain value exceed the limit. Range is [0-4000]"); + goto cleanup; + } + + /*Check that if requested Tx Channel valid*/ + if (((txChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || (txChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + gainBfVal32 = (gain_milli * (uint32_t)64U) / (uint32_t)1000U; + if (gainBfVal32 > MAX_GAIN_BFV) + { + gainBfVal32 = MAX_GAIN_BFV; + } + gainBfVal = (uint8_t)gainBfVal32; + + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(txChannelMask, chanSel)) + { + recoveryAction = adrv904x_TxDfeDigBitfieldAddressGet(device, + (adi_adrv904x_TxChannels_e)chanSel, + &txBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid Tx Channel used to determine base address"); + goto cleanup; + } + + recoveryAction = adrv904x_TxDfeDigRegs_PostCfrDigitalGain_BfSet(device, + NULL, + txBaseAddr, + gainBfVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to write Tx Post CFR gain value"); + goto cleanup; + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_PostCfrGainGet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelSel, + uint32_t * const gain_milli) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + uint8_t gainBfVal = 0U; + adrv904x_BfTxDfeDigRegsChanAddr_e txBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DFE_DIG_REGS; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gain_milli, cleanup); + + recoveryAction = adrv904x_TxDfeDigBitfieldAddressGet(device, + (adi_adrv904x_TxChannels_e)txChannelSel, + &txBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelSel, "Invalid Tx Channel used to determine base address"); + goto cleanup; + } + + recoveryAction = adrv904x_TxDfeDigRegs_PostCfrDigitalGain_BfGet(device, + NULL, + txBaseAddr, + &gainBfVal); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read Tx Post CFR gain value"); + goto cleanup; + } + + *gain_milli = ((uint32_t)gainBfVal * (uint32_t)1000U) / (uint32_t)64U; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); + +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrTssiEnable(adi_adrv904x_Device_t* const device, + const uint32_t channelMask, + const uint8_t enable, + const adi_adrv904x_DfeSvcDfePwrMtrTssi_e meter) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adrv904x_DfeSvcCmdDfeMtrTssiEnable_t cmdStruct; + adrv904x_DfeSvcCmdGenericResp_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + /* Validate channelMask */ + recoveryAction = adrv904x_ValidateMask((uint8_t)channelMask, 0u); /* allow multiples */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMask, "Invalid channel mask"); + goto cleanup; + } + + /* Validate meter */ + if (meter >= ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_NUM_TSSI_METERS) + { + /* 0: Tx TSSI (1), 1: Tx TSSI (2); 2: ORx TSSI, 3~10: CDUC TSSI 1~8 */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + meter, + "TSSI meter is invalid. Valid values defined by adi_adrv904x_DfeSvcDfePwrMtrTssi_e"); + + goto cleanup; + } + + cmdStruct.chanMask = (uint8_t)channelMask; + cmdStruct.enable = (uint8_t)enable; + cmdStruct.meter = (uint8_t)meter; + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_TSSI_ENABLE, + (uint8_t *)&cmdStruct, + sizeof(cmdStruct), + (uint8_t *)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(respStruct.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrClgcTssiEnable(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const uint8_t enable, + const uint8_t useTxMeter1, + const uint8_t useTxMeter2) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adrv904x_DfeSvcCmdDfeMtrClgcTssiEnable_t cmdStruct; + adrv904x_DfeSvcCmdGenericResp_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + /* Validate channelMask */ + recoveryAction = adrv904x_ValidateMask((uint8_t)txChannelMask, 0u); /* allow multiples */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelMask, "Invalid tx channel mask"); + goto cleanup; + } + + /* Validate meter flags. At least one of them must be used */ + if ((useTxMeter1 == 0u) && (useTxMeter2 == 0u)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + useTxMeter1, + "Both Tx TSSI meters are not used. At least one must be used."); + + goto cleanup; + } + + cmdStruct.chanMask = txChannelMask; + cmdStruct.enable = enable; + cmdStruct.useTxMeter1 = useTxMeter1; + cmdStruct.useTxMeter2 = useTxMeter2; + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_CLGC_TSSI_ENABLE, + (uint8_t *)&cmdStruct, + sizeof(cmdStruct), + (uint8_t *)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(respStruct.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrTssiManualStart(adi_adrv904x_Device_t* const device, + const uint32_t channelMask, + const uint8_t start, + const adi_adrv904x_DfeSvcDfePwrMtrTssi_e meter) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adrv904x_DfeSvcCmdDfeMtrTssiManualStart_t cmdStruct; + adrv904x_DfeSvcCmdGenericResp_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + /* Validate channelMask */ + recoveryAction = adrv904x_ValidateMask((uint8_t)channelMask, 0u); /* allow multiples */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelMask, "Invalid channel mask"); + goto cleanup; + } + + /* Validate meter */ + if (meter > ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_TSSI_ORX) + { + /* 0: Tx TSSI (1), 1: Tx TSSI (2); 2: ORx TSSI */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + meter, + "TSSI meter is invalid. Valid values defined by adi_adrv904x_DfeSvcDfePwrMtrTssi_e"); + + goto cleanup; + } + + cmdStruct.chanMask = (uint8_t)channelMask; + cmdStruct.start = (uint8_t)start; + cmdStruct.meter = (uint8_t)meter; + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_TSSI_MANUAL_START, + (uint8_t *)&cmdStruct, + sizeof(cmdStruct), + (uint8_t *)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(respStruct.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrTssiReadBack(adi_adrv904x_Device_t* const device, + const uint32_t channelSel, + const adi_adrv904x_DfeSvcDfePwrMtrTssi_e meter, + adi_adrv904x_DfeSvcDfePwrMtrTssiMeasResult_t *pPwrMeas) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adrv904x_DfeSvcCmdDfeMtrTssiReadback_t cmdStruct; + adrv904x_DfeSvcCmdDfeMtrTssiReadbackResp_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pPwrMeas, cleanup); + + /* Validate channelSel */ + recoveryAction = adrv904x_ValidateMask((uint8_t)channelSel, 1u); /* Only one allowed */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, channelSel, "Invalid channel mask"); + goto cleanup; + } + + /* Validate meter */ + if (meter >= ADI_ADRV904X_DFE_SVC_DFE_PWR_MTR_NUM_TSSI_METERS) + { + /* 0: Tx TSSI (1), 1: Tx TSSI (2); 2: ORx TSSI 3~10: CDUC TSSI (1~8) */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + meter, + "TSSI meter is invalid. Valid values defined by adi_adrv904x_DfeSvcDfePwrMtrTssi_e"); + + goto cleanup; + } + + cmdStruct.chanMask = (uint8_t)channelSel; + cmdStruct.meter = (uint8_t)meter; + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_TSSI_READBACK, + (uint8_t *)&cmdStruct, + sizeof(cmdStruct), + (uint8_t *)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(respStruct.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + if ( (respStruct.chanMask != cmdStruct.chanMask) + || (respStruct.meter != cmdStruct.meter)) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "response mismatch."); + goto cleanup; + } + + pPwrMeas->powerMeasDb = respStruct.pwrMeasDb; + pPwrMeas->powerMeasLinear = respStruct.pwrMeasLinear; + pPwrMeas->thresExceeded = respStruct.thresExceeded; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrClgcTssiReadBack(adi_adrv904x_Device_t* const device, + const uint32_t txChannelSel, + const uint8_t useTxMeter1, + const uint8_t useTxMeter2, + uint64_t *pPwrMeasTx1, + uint64_t *pPwrMeasTx2, + uint64_t *pPwrMeasOrx) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adrv904x_DfeSvcCmdDfeMtrClgcTssiReadback_t cmdStruct; + adrv904x_DfeSvcCmdDfeMtrClgcTssiReadbackResp_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pPwrMeasTx1, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pPwrMeasTx2, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pPwrMeasOrx, cleanup); + + /* Validate txChannelSel */ + recoveryAction = adrv904x_ValidateMask((uint8_t)txChannelSel, 1u); /* Only one allowed */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelSel, "Invalid channel mask"); + goto cleanup; + } + + /* Validate meter flags. At least one of them must be used */ + if ((useTxMeter1 == 0u) && (useTxMeter2 == 0u)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + useTxMeter1, + "Both Tx TSSI meters are not used. At least one must be used."); + + goto cleanup; + } + + cmdStruct.txChanMask = txChannelSel; + cmdStruct.useTxMeter1 = useTxMeter1; + cmdStruct.useTxMeter2 = useTxMeter2; + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_CLGC_TSSI_READBACK, + (uint8_t *)&cmdStruct, + sizeof(cmdStruct), + (uint8_t *)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(respStruct.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + if (respStruct.txChanMask != cmdStruct.txChanMask) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "chan mask response mismatch."); + goto cleanup; + } + + if ((respStruct.useTxMeter1 != cmdStruct.useTxMeter1) || + (respStruct.useTxMeter2 != cmdStruct.useTxMeter2)) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "response mismatch."); + goto cleanup; + } + + *pPwrMeasTx1 = respStruct.pwrMeasTx1; + *pPwrMeasTx2 = respStruct.pwrMeasTx2; + *pPwrMeasOrx = respStruct.pwrMeasOrx; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrDpdInConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const adi_adrv904x_DfeSvcDfePwrMtrDpdCfg_t *pPwrMtrDpdIn) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adrv904x_DfeSvcCmdDfeMtrDpdConfig_t cmdStruct; + adrv904x_DfeSvcCmdGenericResp_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pPwrMtrDpdIn, cleanup); + + ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + /* Validate txChannelMask */ + recoveryAction = adrv904x_ValidateMask((uint8_t)txChannelMask, 0u); /* allow multiples */ + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelMask, "Invalid Tx channel mask"); + goto cleanup; + } + + /* Validate pPwrMtrDpdIn parameters */ + if (pPwrMtrDpdIn->dpdInOutPwrMeasDuration > 24u) + { + /* Power measurement duration. + * The number of samples over which power is averaged is given by 2^(power_measurement_duration). + * The range for this bit-field is 0 to 24. + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrDpdIn->dpdInOutPwrMeasDuration, + "dpdInPwrMeasDuration is invalid. Valid values are 0 - 24"); + + goto cleanup; + } + + if (pPwrMtrDpdIn->dpdInOutPwrMeasTDDModeEn > 1U) + { + /* Set to 1 to enable TDD mode for the power measurement block. + * Measurement is paused when txon is low. + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrDpdIn->dpdInOutPwrMeasTDDModeEn, + "dpdInPwrMeasTDDModeEn is invalid. Valid values are 0 and 1"); + + goto cleanup; + } + + if (pPwrMtrDpdIn->dpdInOutPeakToPowerMode > 1U) + { + /* Enable peak-to-power mode. + * When this mode is enabled, power for a given measurement duration is available + * in the tx_power bit-field. Also, the largest peak (I^2+Q^2) within that + * duration is available in the tx_power_largest_peak bit-field. + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrDpdIn->dpdInOutPeakToPowerMode, + "dpdInPeakToPowerMode is invalid. Valid values are 0 and 1"); + + goto cleanup; + } + + /* NOTE: The FW is intentionally not setting the enable or pause bits here. + * There are separate API commands for that. + */ + + cmdStruct.txChanMask = (uint8_t)txChannelMask; + + cmdStruct.pwrMtrDpdConfig.dpdInOutPwrMeasDuration = (uint8_t)pPwrMtrDpdIn->dpdInOutPwrMeasDuration; + cmdStruct.pwrMtrDpdConfig.dpdInOutPwrMeasContDlyCntr = (uint16_t)ADRV904X_HTOCS(pPwrMtrDpdIn->dpdInOutPwrMeasContDlyCntr); + cmdStruct.pwrMtrDpdConfig.dpdInOutPwrMeasTDDModeEn = (uint8_t)pPwrMtrDpdIn->dpdInOutPwrMeasTDDModeEn; + cmdStruct.pwrMtrDpdConfig.dpdInOutPeakToPowerMode = (uint8_t)pPwrMtrDpdIn->dpdInOutPeakToPowerMode; + cmdStruct.pwrMtrDpdConfig.dpdInOutPwrMeasPause = (uint8_t)0; /* not used */ + cmdStruct.pwrMtrDpdConfig.dpdInOutPwrMeasEn = (uint8_t)0; /* not used */ + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_IN_CONFIG_SET, + (uint8_t *)&cmdStruct, + sizeof(cmdStruct), + (uint8_t *)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(respStruct.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrDpdInConfigGet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelSel, + adi_adrv904x_DfeSvcDfePwrMtrDpdCfg_t* pPwrMtrDpdIn) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adrv904x_DfeSvcCmdDfeMtrDpdConfigGet_t cmdStruct; + adrv904x_DfeSvcCmdDfeMtrDpdConfig_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pPwrMtrDpdIn, cleanup); + + ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + /* Validate txChannelSel */ + recoveryAction = adrv904x_ValidateMask((uint8_t)txChannelSel, 1u); /* only one allowed */ + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelSel, "Invalid Tx channel mask"); + goto cleanup; + } + + cmdStruct.txChanMask = (uint8_t)txChannelSel; + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_IN_CONFIG_GET, + (uint8_t *)&cmdStruct, + sizeof(cmdStruct), + (uint8_t *)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(respStruct.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* Copy response parameters to pPwrMtrDpdIn */ + pPwrMtrDpdIn->dpdInOutPwrMeasDuration = (uint8_t)respStruct.pwrMtrDpdConfig.dpdInOutPwrMeasDuration; + pPwrMtrDpdIn->dpdInOutPwrMeasContDlyCntr = (uint16_t)ADRV904X_CTOHS(respStruct.pwrMtrDpdConfig.dpdInOutPwrMeasContDlyCntr); + pPwrMtrDpdIn->dpdInOutPwrMeasTDDModeEn = (uint8_t)respStruct.pwrMtrDpdConfig.dpdInOutPwrMeasTDDModeEn; + pPwrMtrDpdIn->dpdInOutPeakToPowerMode = (uint8_t)respStruct.pwrMtrDpdConfig.dpdInOutPeakToPowerMode; + pPwrMtrDpdIn->dpdInOutPwrMeasPause = (uint8_t)respStruct.pwrMtrDpdConfig.dpdInOutPwrMeasPause; + pPwrMtrDpdIn->dpdInOutPwrMeasEn = (uint8_t)respStruct.pwrMtrDpdConfig.dpdInOutPwrMeasEn; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrDpdOutConfigSet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const adi_adrv904x_DfeSvcDfePwrMtrDpdCfg_t *pPwrMtrDpdOut) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adrv904x_DfeSvcCmdDfeMtrDpdConfig_t cmdStruct; + adrv904x_DfeSvcCmdGenericResp_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pPwrMtrDpdOut, cleanup); + + /* Validate txChannelMask*/ + recoveryAction = adrv904x_ValidateMask((uint8_t)txChannelMask, 0u); /* allow multiples */ + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelMask, "Invalid Tx channel mask"); + goto cleanup; + } + + if (pPwrMtrDpdOut->dpdInOutPwrMeasDuration > 24u) + { + /* Power measurement duration. + * The number of samples over which power is averaged is given by 2^(power_measurement_duration). + * The range for this bit-field is 0 to 24. + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrDpdOut->dpdInOutPwrMeasDuration, + "dpdOutPwrMeasDuration is invalid. Valid values are 0 - 24"); + + goto cleanup; + } + + if (pPwrMtrDpdOut->dpdInOutPwrMeasTDDModeEn > 1U) + { + /* Set to 1 to enable TDD mode for the power measurement block. + * Measurement is paused when txon is low. + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrDpdOut->dpdInOutPwrMeasTDDModeEn, + "dpdOutPwrMeasTDDModeEn is invalid. Valid values are 0 and 1"); + + goto cleanup; + } + + if (pPwrMtrDpdOut->dpdInOutPeakToPowerMode > 1U) + { + /* Enable peak-to-power mode. + * When this mode is enabled, power for a given measurement duration is available + * in the tx_power bit-field. Also, the largest peak (I^2+Q^2) within that + * duration is available in the tx_power_largest_peak bit-field. + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrMtrDpdOut->dpdInOutPeakToPowerMode, + "dpdOutPeakToPowerMode is invalid. Valid values are 0 and 1"); + + goto cleanup; + } + + /* NOTE: The API is intentionally not setting the enable or pause bits here. + * There are separate API commands for that. + */ + cmdStruct.txChanMask = (uint8_t)txChannelMask; + + cmdStruct.pwrMtrDpdConfig.dpdInOutPwrMeasDuration = (uint8_t)pPwrMtrDpdOut->dpdInOutPwrMeasDuration; + cmdStruct.pwrMtrDpdConfig.dpdInOutPwrMeasContDlyCntr = (uint16_t)ADRV904X_HTOCS(pPwrMtrDpdOut->dpdInOutPwrMeasContDlyCntr); + cmdStruct.pwrMtrDpdConfig.dpdInOutPwrMeasTDDModeEn = (uint8_t)pPwrMtrDpdOut->dpdInOutPwrMeasTDDModeEn; + cmdStruct.pwrMtrDpdConfig.dpdInOutPeakToPowerMode = (uint8_t)pPwrMtrDpdOut->dpdInOutPeakToPowerMode; + cmdStruct.pwrMtrDpdConfig.dpdInOutPwrMeasPause = (uint8_t)0; /* not used */ + cmdStruct.pwrMtrDpdConfig.dpdInOutPwrMeasEn = (uint8_t)0; /* not used */ + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_OUT_CONFIG_SET, + (uint8_t *)&cmdStruct, + sizeof(cmdStruct), + (uint8_t *)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(respStruct.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrDpdOutConfigGet(adi_adrv904x_Device_t* const device, + const uint32_t txChannelSel, + adi_adrv904x_DfeSvcDfePwrMtrDpdCfg_t* pPwrMtrDpdOut) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adrv904x_DfeSvcCmdDfeMtrDpdConfigGet_t cmdStruct; + adrv904x_DfeSvcCmdDfeMtrDpdConfig_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pPwrMtrDpdOut, cleanup); + + ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + /* Validate txChannelSel */ + recoveryAction = adrv904x_ValidateMask((uint8_t)txChannelSel, 1u); /* only one allowed */ + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelSel, "Invalid Tx channel mask"); + goto cleanup; + } + + cmdStruct.txChanMask = (uint8_t)txChannelSel; + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_OUT_CONFIG_GET, + (uint8_t *)&cmdStruct, + sizeof(cmdStruct), + (uint8_t *)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(respStruct.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* Copy response parameters to pPwrMtrDpdOut */ + pPwrMtrDpdOut->dpdInOutPwrMeasDuration = (uint8_t)respStruct.pwrMtrDpdConfig.dpdInOutPwrMeasDuration; + pPwrMtrDpdOut->dpdInOutPwrMeasContDlyCntr = (uint16_t)ADRV904X_CTOHS(respStruct.pwrMtrDpdConfig.dpdInOutPwrMeasContDlyCntr); + pPwrMtrDpdOut->dpdInOutPwrMeasTDDModeEn = (uint8_t)respStruct.pwrMtrDpdConfig.dpdInOutPwrMeasTDDModeEn; + pPwrMtrDpdOut->dpdInOutPeakToPowerMode = (uint8_t)respStruct.pwrMtrDpdConfig.dpdInOutPeakToPowerMode; + pPwrMtrDpdOut->dpdInOutPwrMeasPause = (uint8_t)respStruct.pwrMtrDpdConfig.dpdInOutPwrMeasPause; + pPwrMtrDpdOut->dpdInOutPwrMeasEn = (uint8_t)respStruct.pwrMtrDpdConfig.dpdInOutPwrMeasEn; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrDpdInEnable(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const uint8_t enable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adrv904x_DfeSvcCmdDfeMtrDpdEnable_t cmdStruct; + adrv904x_DfeSvcCmdGenericResp_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + /* Validate txChannelMask */ + recoveryAction = adrv904x_ValidateMask((uint8_t)txChannelMask, 0u); /* allow multiples */ + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelMask, "Invalid Tx channel mask"); + goto cleanup; + } + + cmdStruct.txChanMask = (uint8_t)txChannelMask; + cmdStruct.enable = (uint8_t)enable; + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_IN_ENABLE, + (uint8_t *)&cmdStruct, + sizeof(cmdStruct), + (uint8_t *)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(respStruct.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrDpdOutEnable(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const uint8_t enable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adrv904x_DfeSvcCmdDfeMtrDpdEnable_t cmdStruct; + adrv904x_DfeSvcCmdGenericResp_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + /* Validate txChannelMask */ + recoveryAction = adrv904x_ValidateMask((uint8_t)txChannelMask, 0u); /* allow multiples */ + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelMask, "Invalid Tx channel mask"); + goto cleanup; + } + + cmdStruct.txChanMask = (uint8_t)txChannelMask; + cmdStruct.enable = (uint8_t)enable; + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_OUT_ENABLE, + (uint8_t *)&cmdStruct, + sizeof(cmdStruct), + (uint8_t *)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(respStruct.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrDpdInOutReadBack(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannelSel, + adi_adrv904x_DfeSvcDfePwrMtrDpdResults_t *pPwrDpdInOut) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adrv904x_DfeSvcCmdDfeMtrDpdReadback_t cmdStruct; + adrv904x_DfeSvcCmdDfeMtrDpdReadbackResp_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pPwrDpdInOut, cleanup); + + /* Validate Tx channel */ + recoveryAction = adrv904x_ValidateMask((uint8_t)txChannelSel, 1u); /* Only one allowed */ + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelSel, "Invalid Tx channel mask"); + goto cleanup; + } + + cmdStruct.txChannel = (uint8_t)txChannelSel; + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_PWR_MTR_DPD_IN_OUT_READBACK, + (uint8_t *)&cmdStruct, + sizeof(cmdStruct), + (uint8_t *)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(respStruct.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + if (respStruct.txChannel != cmdStruct.txChannel) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "response mismatch for txChannel"); + goto cleanup; + } + + /* Copy response parameters to pPwrDpdInOut */ + pPwrDpdInOut->pwrDpdIn = (uint8_t)respStruct.pwrMtrResp.pwrDpdIn; + pPwrDpdInOut->peakPwrDpdIn = (uint8_t)respStruct.pwrMtrResp.peakPwrDpdIn; + pPwrDpdInOut->pwrDpdOut = (uint8_t)respStruct.pwrMtrResp.pwrDpdOut; + pPwrDpdInOut->peakPwrDpdOut = (uint8_t)respStruct.pwrMtrResp.peakPwrDpdOut; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrTxCarrierCfgSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxCarrierMask_t * const txCarrierMask, + const adi_adrv904x_DfeSvcDfeTxCarrierPowerMeasCfg_t * pPwrTxCarrierCfg) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adrv904x_DfeSvcDfeAppCmd_TxCarrierPwrMeasConfig_t cmdStruct; + adrv904x_DfeSvcCmdGenericResp_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txCarrierMask, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pPwrTxCarrierCfg, cleanup); + + /* Validate Tx channel mask */ + recoveryAction = adrv904x_ValidateMask((uint8_t)txCarrierMask->txChannelMask, 0u); /* allow multiples */ + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txCarrierMask->txChannelMask, "Invalid Tx channel mask"); + goto cleanup; + } + + /* Validate Tx carrier mask (same rules as Tx channel) */ + recoveryAction = adrv904x_ValidateMask((uint8_t)txCarrierMask->carrierMask, 0u); /* allow multiples but not 0 */ + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txCarrierMask->carrierMask, "Invalid Tx carrier mask"); + goto cleanup; + } + + /* Scan through each channel to validate the carrier mask */ + recoveryAction = adrv904x_TxCducCarrierCheck(device, txCarrierMask->txChannelMask, txCarrierMask->carrierMask); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting enabled carriers"); + goto cleanup; + } + + cmdStruct.channelMask = (uint32_t)ADRV904X_HTOCL(txCarrierMask->txChannelMask); + cmdStruct.carrierMask = (uint32_t)ADRV904X_HTOCL(txCarrierMask->carrierMask); + + /* Validate pPwrTxCarrierCfg parameters */ + if (pPwrTxCarrierCfg->measDuration > 18U) + { + /* Power measurement duration. + * The number of samples over which power is averaged is given by 2^(power_measurement_duration). + * The range for this bit-field is 0 to 18. + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrTxCarrierCfg->measDuration, + "measDuration is invalid. Valid values are 0 - 18"); + + goto cleanup; + } + + if (pPwrTxCarrierCfg->peakToPowerMode > 1u) + { + /* Enable peak-to-power mode. + * When this mode is enabled, power for a given measurement duration is available + * in the tx_power bit-field. Also, the largest peak (I^2+Q^2) within that duration + * is available in the tx_power_largest_peak bit-field + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrTxCarrierCfg->peakToPowerMode, + "peakToPowerMode is invalid. Valid values are 0 and 1"); + + goto cleanup; + } + + if (pPwrTxCarrierCfg->inputSelect > 2U) + { + /* This bit-field allows selection of the data path point for power calculations. + * 4'b00 - channel filter out 4'b01 - delay matcher out 4'b10 - multiplier out + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrTxCarrierCfg->inputSelect, + "inputSelect is invalid. Valid values are 0 - 2"); + + goto cleanup; + } + + if (pPwrTxCarrierCfg->tddModeEnable > 1U) + { + /* Set to 1 to enable TDD mode for the power measurement block. + * Measurement is paused when txon is low. + */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + pPwrTxCarrierCfg->tddModeEnable, + "tddModeEnable is invalid. Valid values are 0 and 1"); + + goto cleanup; + } + + ADI_LIBRARY_MEMCPY((void*)&cmdStruct.cfg, (const void*)pPwrTxCarrierCfg, sizeof(*pPwrTxCarrierCfg)); + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_TX_CARRIER_PWR_MEAS_CONFIG_SET, + (uint8_t *)&cmdStruct, + sizeof(cmdStruct), + (uint8_t *)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(respStruct.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrTxCarrierCfgGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxCarrierMask_t* const txCarrierSel, + adi_adrv904x_DfeSvcDfeTxCarrierPowerMeasCfg_t *pPwrTxCarrrierCfgResp) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adrv904x_DfeSvcDfeAppCmd_TxCarrierPwrMeasConfigGet_t cmdStruct; + adrv904x_DfeSvcDfeAppCmd_TxCarrierPwrMeasConfigGetResp_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txCarrierSel, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pPwrTxCarrrierCfgResp, cleanup); + + ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + /* Validate Tx channel mask */ + recoveryAction = adrv904x_ValidateMask((uint8_t)txCarrierSel->txChannelMask, 1u); /* Only one allowed */ + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txCarrierSel->txChannelMask, "Invalid Tx channel mask"); + goto cleanup; + } + + /* Validate Tx carrier mask */ + recoveryAction = adrv904x_ValidateMask((uint8_t)txCarrierSel->carrierMask, 1u); /* Only one allowed */ + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txCarrierSel->carrierMask, "Invalid Tx carrier mask"); + goto cleanup; + } + + /* Scan through each channel to validate the carrier mask */ + recoveryAction = adrv904x_TxCducCarrierCheck(device, txCarrierSel->txChannelMask, txCarrierSel->carrierMask); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting enabled carriers"); + goto cleanup; + } + + cmdStruct.channelMask = (uint32_t)ADRV904X_HTOCL(txCarrierSel->txChannelMask); + cmdStruct.carrierMask = (uint32_t)ADRV904X_HTOCL(txCarrierSel->carrierMask); + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_TX_CARRIER_PWR_MEAS_CONFIG_GET, + (uint8_t *)&cmdStruct, + sizeof(cmdStruct), + (uint8_t *)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(respStruct.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + if (respStruct.channelMask != txCarrierSel->txChannelMask) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, respStruct.channelMask, "Tx carrier config get status - bad channel"); + goto cleanup; + } + + if (respStruct.carrierMask != txCarrierSel->carrierMask) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, respStruct.carrierMask, "Tx carrier config get status - bad carrier"); + goto cleanup; + } + + /* Copy response parameters to pPwrTxCarrrierCfgResp */ + pPwrTxCarrrierCfgResp->measDuration = (uint8_t)respStruct.cfg.measDuration; + pPwrTxCarrrierCfgResp->measContinueDelayDuration = (uint16_t)ADRV904X_CTOHS(respStruct.cfg.measContinueDelayDuration); + pPwrTxCarrrierCfgResp->peakToPowerMode = (uint16_t)ADRV904X_CTOHS(respStruct.cfg.peakToPowerMode); + pPwrTxCarrrierCfgResp->inputSelect = (uint32_t)ADRV904X_CTOHL(respStruct.cfg.inputSelect); + pPwrTxCarrrierCfgResp->tddModeEnable = (uint8_t)respStruct.cfg.tddModeEnable; + pPwrTxCarrrierCfgResp->enable = (uint8_t)respStruct.cfg.enable; + pPwrTxCarrrierCfgResp->pause = (uint8_t)respStruct.cfg.pause; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrTxCarrierMeasEnable(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxCarrierMask_t * const txCarrierMask, + const uint8_t enable) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adrv904x_DfeSvcDfeAppCmd_TxCarrierPwrMeasEnable_t cmdStruct; + adrv904x_DfeSvcCmdGenericResp_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txCarrierMask, cleanup); + ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + /* Validate Tx channel mask */ + recoveryAction = adrv904x_ValidateMask((uint8_t)txCarrierMask->txChannelMask, 0u); /* allow multiples */ + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txCarrierMask->txChannelMask, "Invalid Tx channel mask"); + goto cleanup; + } + + /* Validate Tx carrier mask (multiples ok) */ + recoveryAction = adrv904x_ValidateMask((uint8_t)txCarrierMask->carrierMask, 0u); /* allow multiples */ + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid Tx carrier mask for enable"); + goto cleanup; + } + + /* Scan through each channel to validate the carrier mask */ + recoveryAction = adrv904x_TxCducCarrierCheck(device, txCarrierMask->txChannelMask, txCarrierMask->carrierMask); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting enabled carriers"); + goto cleanup; + } + + cmdStruct.channelMask = (uint32_t)ADRV904X_HTOCL(txCarrierMask->txChannelMask); + cmdStruct.carrierMask = (uint32_t)ADRV904X_HTOCL(txCarrierMask->carrierMask); + cmdStruct.enable = (uint8_t)enable; + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_TX_CARRIER_PWR_MEAS_ENABLE, + (uint8_t *)&cmdStruct, + sizeof(cmdStruct), + (uint8_t *)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(respStruct.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrTxCarrierManualStart(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxCarrierMask_t * const txCarrierMask, + const uint8_t start) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adrv904x_DfeSvcDfeAppCmd_TxCarrierPwrMeasManualStart_t cmdStruct; + adrv904x_DfeSvcCmdGenericResp_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txCarrierMask, cleanup); + ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + /* Validate Tx channel mask */ + recoveryAction = adrv904x_ValidateMask((uint8_t)txCarrierMask->txChannelMask, 0u); /* allow multiples */ + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txCarrierMask->txChannelMask, "Invalid Tx channel mask"); + goto cleanup; + } + + /* Validate Tx carrier mask */ + recoveryAction = adrv904x_ValidateMask((uint8_t)txCarrierMask->carrierMask, 0u); /* allow multiples */ + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txCarrierMask->carrierMask, "Invalid Tx carrier mask"); + goto cleanup; + } + + /* Scan through each channel to validate the carrier mask */ + recoveryAction = adrv904x_TxCducCarrierCheck(device, txCarrierMask->txChannelMask, txCarrierMask->carrierMask); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting enabled carriers"); + goto cleanup; + } + + cmdStruct.channelMask = (uint32_t)ADRV904X_HTOCL(txCarrierMask->txChannelMask); + cmdStruct.carrierMask = (uint32_t)ADRV904X_HTOCL(txCarrierMask->carrierMask); + cmdStruct.start = (uint8_t)start; + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_TX_CARRIER_PWR_MEAS_MANUAL_START, + (uint8_t *)&cmdStruct, + sizeof(cmdStruct), + (uint8_t *)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(respStruct.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DfePwrMtrTxCarrierMeasGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxCarrierMask_t* const txCarrierSel, + adi_adrv904x_DfeSvcDfeTxCarrierPowerMeasResult_t *pPwrTxCarrrierMeasResult) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + adrv904x_DfeSvcDfeAppCmd_TxCarrierPwrMeasGet_t cmdStruct; + adrv904x_DfeSvcDfeAppCmd_TxCarrierPwrMeasGetResp_t respStruct; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adi_adrv904x_DfeSvcErrCode_e cpuErrorCode = ADI_ADRV904X_DFE_SVC_ERR_CODE_DFE_EVENT_UNEXPECTED; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txCarrierSel, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, pPwrTxCarrrierMeasResult, cleanup); + + ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + /* Validate Tx channel mask */ + recoveryAction = adrv904x_ValidateMask((uint8_t)txCarrierSel->txChannelMask, 1u); /* Only one allowed */ + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txCarrierSel->txChannelMask, "Invalid Tx channel mask"); + goto cleanup; + } + + /* Validate Tx carrier mask */ + recoveryAction = adrv904x_ValidateMask((uint8_t)txCarrierSel->carrierMask, 1u); /* Only one allowed */ + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txCarrierSel->carrierMask, "Invalid Tx carrier mask"); + goto cleanup; + } + + /* Scan through each channel to validate the carrier mask */ + recoveryAction = adrv904x_TxCducCarrierCheck(device, txCarrierSel->txChannelMask, txCarrierSel->carrierMask); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting enabled carriers"); + goto cleanup; + } + + cmdStruct.channelMask = (uint32_t)ADRV904X_HTOCL(txCarrierSel->txChannelMask); + cmdStruct.carrierMask = (uint32_t)ADRV904X_HTOCL(txCarrierSel->carrierMask); + + /* Send command to DFE */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_TX_CARRIER_PWR_MEAS_GET, + (uint8_t *)&cmdStruct, + sizeof(cmdStruct), + (uint8_t *)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_DFE_SVC_CMD_RESP_CHECK_GOTO(respStruct.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* Copy response results to pPwrTxCarrrierMeasResult */ + ADI_LIBRARY_MEMCPY((void*)pPwrTxCarrrierMeasResult, (void*)&respStruct.result, sizeof(*pPwrTxCarrrierMeasResult)); + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxCarrierGainAdjustSet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxCarrierMask_t * const txCarrierMask, + const int32_t gain_mdB) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t carrierIdx = 0U; + uint32_t carrierSel = 0U; + uint32_t txIdx = 0U; + uint32_t txSel = 0U; + uint32_t bfValue = 0U; + const int32_t DIG_GAIN_MIN = -90000; + const int32_t DIG_GAIN_MAX = 36000; + const uint32_t DIG_GAIN_MULT = 65535U; + adrv904x_BfCducHbDpathChanAddr_e cducHbDpathChanBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txCarrierMask, cleanup); + + if (((txCarrierMask->carrierMask & (~(uint32_t)ADI_ADRV904X_TX_CARRIER_ALL)) != 0U) || + (txCarrierMask->carrierMask == (uint32_t)ADI_ADRV904X_TX_CARRIER_NONE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txCarrierMask->carrierMask, + "Invalid Tx carrier mask is selected. Valid values are any combinations of TxCarrier0/1/2/3/4/5/6/7"); + goto cleanup; + } + + if (((txCarrierMask->txChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || + (txCarrierMask->txChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txCarrierMask->txChannelMask, + "Invalid Tx channel mask is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + if ((gain_mdB < DIG_GAIN_MIN) || (gain_mdB > DIG_GAIN_MAX)) + { + /* Invalid gain_mdB selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, gain_mdB, "Invalid gain_mdB selection. Valid value are from -90000mdB to 36000mdB"); + goto cleanup; + } + + /* Convert from mdB to 7.16. (reg value = 10**(value in mdB/1000/20)) * 2^16) */ + bfValue = (uint32_t)((double)pow(10, (double)gain_mdB / 1000U / 20U) * DIG_GAIN_MULT); + + /* Write out the enable */ + for (txIdx = 0U; txIdx < ADI_ADRV904X_MAX_TXCHANNELS; txIdx++) + { + txSel = 1U << txIdx; + if ((txCarrierMask->txChannelMask & txSel) > 0U) + { + /* Convert the txSel to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_CducHbDpathBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(txSel), &cducHbDpathChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txSel, "Invalid Tx Carrier used to determine SPI address"); + goto cleanup; + } + + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_TX_CARRIERS; carrierIdx++) + { + carrierSel = 1U << carrierIdx; + if ((txCarrierMask->carrierMask & carrierSel) > 0U) + { + switch (carrierSel) + { + case ADI_ADRV904X_TX_CARRIER_0: + recoveryAction = adrv904x_CducHbDpath_CarrierGain0_BfSet(device, + NULL, + cducHbDpathChanBaseAddr, + bfValue); + break; + case ADI_ADRV904X_TX_CARRIER_1: + recoveryAction = adrv904x_CducHbDpath_CarrierGain1_BfSet(device, + NULL, + cducHbDpathChanBaseAddr, + bfValue); + break; + case ADI_ADRV904X_TX_CARRIER_2: + recoveryAction = adrv904x_CducHbDpath_CarrierGain2_BfSet(device, + NULL, + cducHbDpathChanBaseAddr, + bfValue); + break; + case ADI_ADRV904X_TX_CARRIER_3: + recoveryAction = adrv904x_CducHbDpath_CarrierGain3_BfSet(device, + NULL, + cducHbDpathChanBaseAddr, + bfValue); + break; + case ADI_ADRV904X_TX_CARRIER_4: + recoveryAction = adrv904x_CducHbDpath_CarrierGain4_BfSet(device, + NULL, + cducHbDpathChanBaseAddr, + bfValue); + break; + case ADI_ADRV904X_TX_CARRIER_5: + recoveryAction = adrv904x_CducHbDpath_CarrierGain5_BfSet(device, + NULL, + cducHbDpathChanBaseAddr, + bfValue); + break; + case ADI_ADRV904X_TX_CARRIER_6: + recoveryAction = adrv904x_CducHbDpath_CarrierGain6_BfSet(device, + NULL, + cducHbDpathChanBaseAddr, + bfValue); + break; + case ADI_ADRV904X_TX_CARRIER_7: + recoveryAction = adrv904x_CducHbDpath_CarrierGain7_BfSet(device, + NULL, + cducHbDpathChanBaseAddr, + bfValue); + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txCarrierMask->carrierMask, + "Invalid Tx carrier selection"); + goto cleanup; + break; + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting carrier gain"); + goto cleanup; + } + + recoveryAction = adrv904x_CducHbDpath_CarrierGainEnable_BfSet(device, + NULL, + cducHbDpathChanBaseAddr, + carrierIdx, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting carrier gain enable"); + goto cleanup; + } + + } + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxCarrierGainAdjustGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxCarrierMask_t * const txCarrierSel, + int32_t * const gain_mdB) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bfValue = 0U; + const uint32_t DIG_GAIN_MULT = 65535U; + + adrv904x_BfCducHbDpathChanAddr_e cducHbDpathChanBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txCarrierSel, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, gain_mdB, cleanup); + + *gain_mdB = 0; + + if ((txCarrierSel->txChannelMask != ADI_ADRV904X_TX0) && + (txCarrierSel->txChannelMask != ADI_ADRV904X_TX1) && + (txCarrierSel->txChannelMask != ADI_ADRV904X_TX2) && + (txCarrierSel->txChannelMask != ADI_ADRV904X_TX3) && + (txCarrierSel->txChannelMask != ADI_ADRV904X_TX4) && + (txCarrierSel->txChannelMask != ADI_ADRV904X_TX5) && + (txCarrierSel->txChannelMask != ADI_ADRV904X_TX6) && + (txCarrierSel->txChannelMask != ADI_ADRV904X_TX7)) + { + /* Invalid Tx channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txCarrierSel->txChannelMask, "Invalid Tx channel selection"); + goto cleanup; + } + + /* Read out the configurations */ + /* Convert the txCarrierSel->txChannelMask to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_CducHbDpathBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(txCarrierSel->txChannelMask), &cducHbDpathChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txCarrierSel->txChannelMask, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + switch (txCarrierSel->carrierMask) + { + case ADI_ADRV904X_TX_CARRIER_0: + recoveryAction = adrv904x_CducHbDpath_CarrierGain0_BfGet(device, + NULL, + cducHbDpathChanBaseAddr, + &bfValue); + break; + case ADI_ADRV904X_TX_CARRIER_1: + recoveryAction = adrv904x_CducHbDpath_CarrierGain1_BfGet(device, + NULL, + cducHbDpathChanBaseAddr, + &bfValue); + break; + case ADI_ADRV904X_TX_CARRIER_2: + recoveryAction = adrv904x_CducHbDpath_CarrierGain2_BfGet(device, + NULL, + cducHbDpathChanBaseAddr, + &bfValue); + break; + case ADI_ADRV904X_TX_CARRIER_3: + recoveryAction = adrv904x_CducHbDpath_CarrierGain3_BfGet(device, + NULL, + cducHbDpathChanBaseAddr, + &bfValue); + break; + case ADI_ADRV904X_TX_CARRIER_4: + recoveryAction = adrv904x_CducHbDpath_CarrierGain4_BfGet(device, + NULL, + cducHbDpathChanBaseAddr, + &bfValue); + break; + case ADI_ADRV904X_TX_CARRIER_5: + recoveryAction = adrv904x_CducHbDpath_CarrierGain5_BfGet(device, + NULL, + cducHbDpathChanBaseAddr, + &bfValue); + break; + case ADI_ADRV904X_TX_CARRIER_6: + recoveryAction = adrv904x_CducHbDpath_CarrierGain6_BfGet(device, + NULL, + cducHbDpathChanBaseAddr, + &bfValue); + break; + case ADI_ADRV904X_TX_CARRIER_7: + recoveryAction = adrv904x_CducHbDpath_CarrierGain7_BfGet(device, + NULL, + cducHbDpathChanBaseAddr, + &bfValue); + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txCarrierSel->carrierMask, + "Invalid Tx carrier selection"); + goto cleanup; + break; + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting Tx Carrier Gain."); + goto cleanup; + } + + if (bfValue != 0U) + { + /* Convert from 7.16 to mdB. value in mdB = (1000*20*log10(reg value/2^16)) */ + //*gain_mdB = (int32_t)(1000U * 20U * log10((double)bfValue / DIG_GAIN_MULT)); + *gain_mdB = (int32_t)(20 * log10((100000UL * (double)bfValue) / DIG_GAIN_MULT) - 100); + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxCarrierBandAttenSet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxBandMask_t * const txBandMask, + const uint32_t atten_mdB) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t bandIdx = 0U; + uint32_t bandSel = 0U; + uint32_t txIdx = 0U; + uint32_t txSel = 0U; + uint32_t attenRegVal = 0U; + const uint32_t DIG_GAIN_MULT = 256U; + adrv904x_BfCducHbDpathChanAddr_e cducHbDpathChanBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txBandMask, cleanup); + + if (((txBandMask->bandMask & (~(uint32_t)ADI_ADRV904X_TX_CARRIER_BAND_ALL)) != 0U) || + (txBandMask->bandMask == (uint32_t)ADI_ADRV904X_TX_CARRIER_BAND_NONE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txBandMask->bandMask, + "Invalid Tx carrier band mask is selected. Valid values are any combinations of TxCarrierBand0/1"); + goto cleanup; + } + + if (((txBandMask->txChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || + (txBandMask->txChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txBandMask->txChannelMask, + "Invalid Tx channel mask is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + for (txIdx = 0U; txIdx < ADI_ADRV904X_MAX_TXCHANNELS; txIdx++) + { + txSel = 1U << txIdx; + if ((txBandMask->txChannelMask & txSel) > 0U) + { + /* Convert the txSel to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_CducHbDpathBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(txSel), &cducHbDpathChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txSel, "Invalid Tx Carrier used to determine SPI address"); + goto cleanup; + } + + for (bandIdx = 0U; bandIdx < ADI_ADRV904X_MAX_TX_CARRIER_BANDS; bandIdx++) + { + bandSel = 1U << bandIdx; + if ((txBandMask->bandMask & bandSel) > 0U) + { + /* Convert from the requested atten level (milli-dB) to equivalent */ + /* Convert from mdB to 0.8. (reg value = 10**(value in mdB/1000/20)) * 2^8) */ + attenRegVal = (uint32_t)((double)pow(10, (0.0 - (double)atten_mdB) / 1000U / 20U) * DIG_GAIN_MULT); + + if (attenRegVal > 255U) + { + /* Invalid attenRegVal selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, attenRegVal, "Invalid attenRegVal selection."); + goto cleanup; + } + + switch (bandSel) + { + case ADI_ADRV904X_TX_CARRIER_BAND_0: + recoveryAction = adrv904x_CducHbDpath_CarrBand0Attn_BfSet(device, + NULL, + cducHbDpathChanBaseAddr, + attenRegVal); + break; + case ADI_ADRV904X_TX_CARRIER_BAND_1: + recoveryAction = adrv904x_CducHbDpath_CarrBand1Attn_BfSet(device, + NULL, + cducHbDpathChanBaseAddr, + attenRegVal); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txBandMask->bandMask, + "Invalid Tx carrier band selection"); + goto cleanup; + break; + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting carrier band attn"); + goto cleanup; + } + + } + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxCarrierBandAttenGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxBandMask_t * const txBandSel, + uint32_t * const atten_mdB) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t bfValue = 0U; + const uint32_t DIG_GAIN_MULT = 256U; + adrv904x_BfCducHbDpathChanAddr_e cducHbDpathChanBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_CDUC_TX_CDUC_HB_DPATH; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txBandSel, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, atten_mdB, cleanup); + + if ((txBandSel->txChannelMask != ADI_ADRV904X_TX0) && + (txBandSel->txChannelMask != ADI_ADRV904X_TX1) && + (txBandSel->txChannelMask != ADI_ADRV904X_TX2) && + (txBandSel->txChannelMask != ADI_ADRV904X_TX3) && + (txBandSel->txChannelMask != ADI_ADRV904X_TX4) && + (txBandSel->txChannelMask != ADI_ADRV904X_TX5) && + (txBandSel->txChannelMask != ADI_ADRV904X_TX6) && + (txBandSel->txChannelMask != ADI_ADRV904X_TX7)) + { + /* Invalid Tx channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txBandSel->txChannelMask, "Invalid Tx channel selection"); + goto cleanup; + } + + /* Convert the txBandSel->txChannelMask to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_CducHbDpathBitfieldAddressGet(device, + (adi_adrv904x_TxChannels_e)(txBandSel->txChannelMask), + &cducHbDpathChanBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txBandSel->txChannelMask, "Invalid Tx Channel used to determine SPI address"); + goto cleanup; + } + + switch (txBandSel->bandMask) + { + case ADI_ADRV904X_TX_CARRIER_BAND_0: + recoveryAction = adrv904x_CducHbDpath_CarrBand0Attn_BfGet(device, + NULL, + cducHbDpathChanBaseAddr, + &bfValue); + break; + case ADI_ADRV904X_TX_CARRIER_BAND_1: + recoveryAction = adrv904x_CducHbDpath_CarrBand1Attn_BfGet(device, + NULL, + cducHbDpathChanBaseAddr, + &bfValue); + break; + + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txBandSel->bandMask, + "Invalid Tx carrier band selection"); + goto cleanup; + break; + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting Tx Carrier Band Atten."); + goto cleanup; + } + + /* Convert from 0.8 to mdB. value in mdB = (1000*20*log10(reg value/2^8)) */ + if (bfValue > 0) + { + //*atten_mdB = 0 - (1000U * 20U * (double)log10((double)bfValue / DIG_GAIN_MULT)); + *atten_mdB = 0 - (20 * log10((100000UL * (double)bfValue) / DIG_GAIN_MULT) - 100); + } + else + { + *atten_mdB = 0xFFFFFFFFU; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_PostDpdAttenSet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxDpdMask_t * const txDpdMask, + const adi_adrv904x_PostDpdAtten_t * const attenParams) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t txIdx = 0U; + uint32_t txSel = 0U; + uint32_t dpdIdx = 0U; + uint32_t dpdSel = 0U; + adrv904x_BfTxDpdActMmrChanAddr_e baseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DPD_ACT_MMR; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txDpdMask, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, attenParams, cleanup); + + if (((txDpdMask->txChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || + (txDpdMask->txChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txDpdMask->txChannelMask, + "Invalid Tx channel mask is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + if (((txDpdMask->dpdIdMask & (~(uint32_t)ADI_ADRV904X_TX_DPD_ID_ALL)) != 0U) || + (txDpdMask->dpdIdMask == (uint32_t)ADI_ADRV904X_TX_DPD_ID_NONE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txDpdMask->dpdIdMask, + "Invalid Tx dpd id mask is selected. Valid values are any combinations of TxDdpId0/1/2/3"); + goto cleanup; + } + + if ((attenParams->gmpOutShift > 15U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, attenParams->gmpOutShift, "Invalid gmpOutShift selection. Valid value are from 0 to 15"); + goto cleanup; + } + + if ((attenParams->ddrOutShift > 15U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, attenParams->ddrOutShift, "Invalid ddrOutShift selection. Valid value are from 0 to 15"); + goto cleanup; + } + + for (txIdx = 0U; txIdx < ADI_ADRV904X_MAX_TXCHANNELS; txIdx++) + { + txSel = 1U << txIdx; + if ((txDpdMask->txChannelMask & txSel) > 0U) + { + /* Convert the txSel to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_DpdActMmrBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(txSel), &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txSel, "Invalid Tx Carrier used to determine SPI address"); + goto cleanup; + } + + for (dpdIdx = 0U; dpdIdx < ADI_ADRV904X_MAX_TX_DPD_IDS; dpdIdx++) + { + dpdSel = 1U << dpdIdx; + if ((txDpdMask->dpdIdMask & dpdSel) > 0U) + { + recoveryAction = adrv904x_TxDpdActMmr_MagGain_BfSet(device, + NULL, + baseAddr, + dpdIdx, + attenParams->magGain); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting Tx Dpd Mag Gain."); + goto cleanup; + } + + recoveryAction = adrv904x_TxDpdActMmr_DpdGmpOutShift_BfSet(device, + NULL, + baseAddr, + dpdIdx, + attenParams->gmpOutShift); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting Tx Dpd Gmp Out Shift."); + goto cleanup; + } + + recoveryAction = adrv904x_TxDpdActMmr_DpdDdrOutShift_BfSet(device, + NULL, + baseAddr, + dpdIdx, + attenParams->ddrOutShift); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting Tx Dpd Ddr Out Shift."); + goto cleanup; + } + } + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_PostDpdAttenGet(adi_adrv904x_Device_t * const device, + const adi_adrv904x_TxDpdMask_t * const txDpdSel, + adi_adrv904x_PostDpdAtten_t * const attenParams) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t dpdIdx = 0U; + uint32_t dpdSel = 0U; + adrv904x_BfTxDpdActMmrChanAddr_e baseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DPD_ACT_MMR; + + /* Check device pointer is not null */ + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txDpdSel, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, attenParams, cleanup); + + if ((txDpdSel->txChannelMask != ADI_ADRV904X_TX0) && + (txDpdSel->txChannelMask != ADI_ADRV904X_TX1) && + (txDpdSel->txChannelMask != ADI_ADRV904X_TX2) && + (txDpdSel->txChannelMask != ADI_ADRV904X_TX3) && + (txDpdSel->txChannelMask != ADI_ADRV904X_TX4) && + (txDpdSel->txChannelMask != ADI_ADRV904X_TX5) && + (txDpdSel->txChannelMask != ADI_ADRV904X_TX6) && + (txDpdSel->txChannelMask != ADI_ADRV904X_TX7)) + { + /* Invalid Tx channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txDpdSel->txChannelMask, "Invalid Tx channel selection"); + goto cleanup; + } + + if ((txDpdSel->dpdIdMask != ADI_ADRV904X_TX_DPD_ID_0) && + (txDpdSel->dpdIdMask != ADI_ADRV904X_TX_DPD_ID_1) && + (txDpdSel->dpdIdMask != ADI_ADRV904X_TX_DPD_ID_2) && + (txDpdSel->dpdIdMask != ADI_ADRV904X_TX_DPD_ID_3)) + { + /* Invalid Tx dpd id selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txDpdSel->dpdIdMask, "Invalid Tx dpd id selection"); + goto cleanup; + } + + /* Convert the txDpdSel->txChannelMask to the base address value required by the bitfield functions */ + recoveryAction = adrv904x_DpdActMmrBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(txDpdSel->txChannelMask), &baseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txDpdSel->txChannelMask, "Invalid Tx Carrier used to determine SPI address"); + goto cleanup; + } + + for (dpdIdx = 0U; dpdIdx < ADI_ADRV904X_MAX_TX_DPD_IDS; dpdIdx++) + { + dpdSel = 1U << dpdIdx; + if ((txDpdSel->dpdIdMask & dpdSel) > 0U) + { + recoveryAction = adrv904x_TxDpdActMmr_MagGain_BfGet(device, + NULL, + baseAddr, + dpdIdx, + &attenParams->magGain); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting Tx Dpd Mag Gain."); + goto cleanup; + } + + recoveryAction = adrv904x_TxDpdActMmr_DpdGmpOutShift_BfGet(device, + NULL, + baseAddr, + dpdIdx, + &attenParams->gmpOutShift); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting Tx Dpd Gmp Out Shift."); + goto cleanup; + } + + recoveryAction = adrv904x_TxDpdActMmr_DpdDdrOutShift_BfGet(device, + NULL, + baseAddr, + dpdIdx, + &attenParams->ddrOutShift); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting Tx Dpd Ddr Out Shift."); + goto cleanup; + } + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_HardClipperConfigSet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_HardClipperConfig_t * const hardClipperConfig, + const uint32_t hcTxChannelMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxDatapathChanAddr_e txDatapathHcBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DATAPATH; + adrv904x_BfTxDfeDigRegsChanAddr_e txDfeDigHcBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DFE_DIG_REGS; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, hardClipperConfig, cleanup); + + /*Check that if requested Tx Channel valid*/ + if (((hcTxChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || + (hcTxChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + hcTxChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + /* Check hc select parameter is valid */ + if (hardClipperConfig->hardClipperSel > ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + hardClipperConfig->hardClipperSel, + "hardClipperSel value is invalid. Valid value 0-1"); + goto cleanup; + } + + /* Check if window size parameter is valid */ + if (hardClipperConfig->hardClipperEnable > ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + hardClipperConfig->hardClipperEnable, + "hardClipperEnable value is invalid. Valid value 0-1"); + goto cleanup; + } + + if (hardClipperConfig->hardClipperSel == 0) /* PostAtten hardClipper mode*/ + { + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(hcTxChannelMask, chanSel)) + { + recoveryAction = adrv904x_CfrDatapathBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txDatapathHcBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid Tx Channel used to determine data path base address"); + goto cleanup; + } + + /* Write hard clipper threshold value */ + recoveryAction = adrv904x_TxDatapath_PostAttenHcThreshold_BfSet(device, + NULL, + txDatapathHcBaseAddr, + hardClipperConfig->hardClipperThreshold); /* TODO: Apply threshold transformation if needed */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing hard clipper threshold"); + goto cleanup; + } + + /* Write hard clipper enable bit */ + recoveryAction = adrv904x_TxDatapath_PostAttenHcEn_BfSet(device, + NULL, + txDatapathHcBaseAddr, + hardClipperConfig->hardClipperEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing hard clipper enable"); + goto cleanup; + } + + } + } + } + else /* PreDpd hardClipper mode*/ + { + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(hcTxChannelMask, chanSel)) + { + recoveryAction = adrv904x_TxDfeDigBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txDfeDigHcBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanIdx, "Invalid Tx Channel used to determine Tx Dfe Dig base address"); + goto cleanup; + } + + /* Write hard clipper threshold value */ + recoveryAction = adrv904x_TxDfeDigRegs_PreDpdHcThreshold_BfSet(device, + NULL, + txDfeDigHcBaseAddr, + hardClipperConfig->hardClipperThreshold); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing hard clipper threshold"); + goto cleanup; + } + + /* Write hard clipper enable bit */ + recoveryAction = adrv904x_TxDfeDigRegs_PreDpdHcEn_BfSet(device, + NULL, + txDfeDigHcBaseAddr, + hardClipperConfig->hardClipperEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing hard clipper enable"); + goto cleanup; + } + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_HardClipperConfigGet(adi_adrv904x_Device_t* const device, + adi_adrv904x_HardClipperConfig_t * const hardClipperConfig, + const uint32_t hcTxChannelSel) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxDatapathChanAddr_e txDatapathHcBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DATAPATH; + adrv904x_BfTxDfeDigRegsChanAddr_e txDfeDigHcBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DFE_DIG_REGS; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, hardClipperConfig, cleanup); + + /* Check hc mode parameter is valid */ + if (hardClipperConfig->hardClipperSel > ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + hardClipperConfig->hardClipperSel, + "hardClipperSel value is invalid. Valid value 0-1"); + goto cleanup; + } + + if (hardClipperConfig->hardClipperSel == 0) /* PostAtten hardClipper mode*/ + { + recoveryAction = adrv904x_CfrDatapathBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(hcTxChannelSel), &txDatapathHcBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, hcTxChannelSel, "Invalid Tx Channel used to determine data path base address"); + goto cleanup; + } + + /* Read hard clipper enable bit */ + recoveryAction = adrv904x_TxDatapath_PostAttenHcEn_BfGet(device, + NULL, + txDatapathHcBaseAddr, + &hardClipperConfig->hardClipperEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading PostAtten hard clipper enable"); + goto cleanup; + } + + /* Read hard clipper threshold value */ + recoveryAction = adrv904x_TxDatapath_PostAttenHcThreshold_BfGet(device, + NULL, + txDatapathHcBaseAddr, + &hardClipperConfig->hardClipperThreshold); /* TODO: Apply threshold transformation if needed */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading PostAtten hard clipper threshold"); + goto cleanup; + } + } + else /* PreDpd hardClipper mode*/ + { + recoveryAction = adrv904x_TxDfeDigBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(hcTxChannelSel), &txDfeDigHcBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, hcTxChannelSel, "Invalid Tx Channel used to determine Tx Dfe Dig base address"); + goto cleanup; + } + + /* Read hard clipper enable bit */ + recoveryAction = adrv904x_TxDfeDigRegs_PreDpdHcEn_BfGet(device, + NULL, + txDfeDigHcBaseAddr, + &hardClipperConfig->hardClipperEnable); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing PreDpd hard clipper enable"); + goto cleanup; + } + + /* Read hard clipper threshold value */ + recoveryAction = adrv904x_TxDfeDigRegs_PreDpdHcThreshold_BfGet(device, + NULL, + txDfeDigHcBaseAddr, + &hardClipperConfig->hardClipperThreshold); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing PreDpd hard clipper threshold"); + goto cleanup; + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_HardClipperStatisticsGet(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannelSel, + adi_adrv904x_HardClipperStatistics_t * const hardClipperStat, + uint8_t clearStats) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxDatapathChanAddr_e txDatapathHcBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DATAPATH; + adrv904x_BfTxDfeDigRegsChanAddr_e txDfeDigHcBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DFE_TX_DFE_DIG_REGS; + uint16_t postAttenHardClipperStat = 0; + uint16_t preDpdHardClipperStat = 0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, hardClipperStat, cleanup); + + /* Check if clearStats parameter is valid */ + if (clearStats > ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + clearStats, + "clearStats value is invalid. Valid values 0-1"); + goto cleanup; + } + + recoveryAction = adrv904x_TxDfeDigBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(txChannelSel), &txDfeDigHcBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelSel, "Invalid Tx Channel used to determine Tx Dfe Dig base address"); + goto cleanup; + } + + /* Update PreDpdHC statistics */ + recoveryAction = adrv904x_TxDfeDigRegs_PreDpdHcCntUpd_BfSet(device, + NULL, + txDfeDigHcBaseAddr, + ADI_TRUE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while updating PreDpdHC statistics"); + goto cleanup; + } + + /* Read PreDpd hard clipper statistics */ + recoveryAction = adrv904x_TxDfeDigRegs_PreDpdHcClipCntStat_BfGet(device, + NULL, + txDfeDigHcBaseAddr, + &preDpdHardClipperStat); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading peaks clipped at PreDpdHC"); + goto cleanup; + } + + hardClipperStat->preDpdHardClipperStat = preDpdHardClipperStat; + + recoveryAction = adrv904x_CfrDatapathBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(txChannelSel), &txDatapathHcBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelSel, "Invalid Tx Channel used to determine data path base address"); + goto cleanup; + } + + /* Update PostAttenHC statistics */ + recoveryAction = adrv904x_TxDatapath_PostAttenHcCntUpd_BfSet(device, + NULL, + txDatapathHcBaseAddr, + ADI_TRUE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while updating PostAttenHC statistics"); + goto cleanup; + } + + /* Read PostAtten hard clipper statistics */ + recoveryAction = adrv904x_TxDatapath_PostAttenHcClipCntStat_BfGet(device, + NULL, + txDatapathHcBaseAddr, + &postAttenHardClipperStat); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading peaks clipped at PostAttenHC"); + goto cleanup; + } + + hardClipperStat->postAttenHardClipperStat = postAttenHardClipperStat; + + if (clearStats == ADI_TRUE) + { + /* Clear PreDpdHC statistics */ + recoveryAction = adrv904x_TxDfeDigRegs_PreDpdHcCntClear_BfSet(device, + NULL, + txDfeDigHcBaseAddr, + ADI_TRUE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while clearing PreDpdHC statistics"); + goto cleanup; + } + /* Clear PostAttenHC statistics */ + recoveryAction = adrv904x_TxDatapath_PostAttenHcCntClear_BfSet(device, + NULL, + txDatapathHcBaseAddr, + ADI_TRUE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while clearing PostAttenHC statistics"); + goto cleanup; + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxPlaybackDataWrite(adi_adrv904x_Device_t* const device, + const uint32_t txChannelMask, + const uint8_t bandSelect, + const adi_adrv904x_TxPlaybackData_t* const playbackData) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t chanIdx = 0U; + uint32_t chanSel = 0U; + uint32_t i = 0U; + uint32_t dataToWrite = 0U; + uint8_t captureEnableRead = 0U; + adrv904x_BfTxDigChanAddr_e txDigBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DIG; + uint32_t dataToWriteArr[ADI_ADRV904X_TX_PLAYBACK_DATA_MAX_NUM_SAMPLES]; + uint32_t txPlaybackDuc0BaseAddressArr[ADI_ADRV904X_MAX_TXCHANNELS] = { + ADI_ADVRV904X_TX0_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX1_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX2_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX3_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX4_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX5_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX6_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX7_PLAYBACK_RAM_BASEADDR + }; + uint32_t txPlaybackDuc1BaseAddressArr[ADI_ADRV904X_MAX_TXCHANNELS] = { + (ADI_ADVRV904X_TX0_PLAYBACK_RAM_BASEADDR + ADI_ADVRV904X_TX_DUC1_PLAYBACK_RAM_OFFSET), + (ADI_ADVRV904X_TX1_PLAYBACK_RAM_BASEADDR + ADI_ADVRV904X_TX_DUC1_PLAYBACK_RAM_OFFSET), + (ADI_ADVRV904X_TX2_PLAYBACK_RAM_BASEADDR + ADI_ADVRV904X_TX_DUC1_PLAYBACK_RAM_OFFSET), + (ADI_ADVRV904X_TX3_PLAYBACK_RAM_BASEADDR + ADI_ADVRV904X_TX_DUC1_PLAYBACK_RAM_OFFSET), + (ADI_ADVRV904X_TX4_PLAYBACK_RAM_BASEADDR + ADI_ADVRV904X_TX_DUC1_PLAYBACK_RAM_OFFSET), + (ADI_ADVRV904X_TX5_PLAYBACK_RAM_BASEADDR + ADI_ADVRV904X_TX_DUC1_PLAYBACK_RAM_OFFSET), + (ADI_ADVRV904X_TX6_PLAYBACK_RAM_BASEADDR + ADI_ADVRV904X_TX_DUC1_PLAYBACK_RAM_OFFSET), + (ADI_ADVRV904X_TX7_PLAYBACK_RAM_BASEADDR + ADI_ADVRV904X_TX_DUC1_PLAYBACK_RAM_OFFSET) + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, playbackData, cleanup); + ADI_LIBRARY_MEMSET(&dataToWriteArr[0U], 0, sizeof(dataToWriteArr)); + + /*Check that if requested Tx Channel valid*/ + if (((txChannelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U) || + (txChannelMask == (uint32_t)ADI_ADRV904X_TXOFF)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + txChannelMask, + "Invalid Tx channel is selected. Valid values are any combinations of Tx0/1/2/3/4/5/6/7"); + goto cleanup; + } + + if (bandSelect > 1) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + bandSelect, + "Band value cannot be greater than 1"); + goto cleanup; + } + + if (playbackData->numSamples > ADI_ADRV904X_TX_PLAYBACK_DATA_MAX_NUM_SAMPLES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + playbackData->numSamples, + "Number of samples cannot be greater than ADI_ADRV904X_TX_PLAYBACK_DATA_MAX_NUM_SAMPLES"); + goto cleanup; + } + + if ((playbackData->numSamples % 2) != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + playbackData->numSamples, + "Number of samples is not even"); + goto cleanup; + } + + for (chanIdx = 0U; chanIdx < ADI_ADRV904X_MAX_TXCHANNELS; ++chanIdx) + { + chanSel = 1U << chanIdx; + if (ADRV904X_BF_EQUAL(txChannelMask, chanSel)) + { + recoveryAction = adrv904x_TxDigBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(chanSel), &txDigBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanSel, "Invalid Tx Channel used to determine Tx Dig base address"); + goto cleanup; + } + + /* Check if TX DPD capture is enabled before writing a new dataset*/ + recoveryAction = adrv904x_TxDig_TxDpdCptEn_BfGet(device, + NULL, + txDigBaseAddr, + &captureEnableRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading TX DPD capture state"); + goto cleanup; + } + + if (captureEnableRead == ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "TX DPD capture should be disabled while writing to playback RAM"); + goto cleanup; + } + + /* Check if TX FSC capture is enabled before writing a new dataset*/ + recoveryAction = adrv904x_TxDig_TxFscCptEn_BfGet(device, + NULL, + txDigBaseAddr, + &captureEnableRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading TX FSC capture state"); + goto cleanup; + } + + if (captureEnableRead == ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "TX FSC capture should be disabled while writing to playback RAM"); + goto cleanup; + } + + /* Check if TX Loopback capture is enabled before writing a new dataset*/ + recoveryAction = adrv904x_TxDig_TxLpbCptEn_BfGet(device, + NULL, + txDigBaseAddr, + &captureEnableRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading TX Loopback capture state"); + goto cleanup; + } + + if (captureEnableRead == ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "TX Loopback capture should be disabled while writing to playback RAM"); + goto cleanup; + } + + /* Check if TX RX ADC capture is enabled before writing a new dataset*/ + recoveryAction = adrv904x_TxDig_TxRadCptEn_BfGet(device, + NULL, + txDigBaseAddr, + &captureEnableRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading TX RX ADC capture state"); + goto cleanup; + } + + if (captureEnableRead == ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "TX RX ADC capture should be disabled while writing to playback RAM"); + goto cleanup; + } + + for (i = 0; i < playbackData->numSamples; ++i) + { + int j; + // swap the order of samples + if ((i % 2) == 0) + { + j = i + 1; + } + else + { + j = i - 1; + } + + dataToWrite = ((((uint32_t)playbackData->playbackDataReal[i] << 0U) & 0x0000FFFFU) | + (((uint32_t)playbackData->playbackDataImag[i] << 16U) & 0xFFFF0000U)); + + dataToWriteArr[j] = dataToWrite; + } + + if (bandSelect == 0) + { + recoveryAction = adi_adrv904x_Registers32Write(device, + NULL, + &txPlaybackDuc0BaseAddressArr[chanIdx], + dataToWriteArr, + NULL, + ADI_ADRV904X_TX_PLAYBACK_DATA_MAX_NUM_SAMPLES); + } + else + { + recoveryAction = adi_adrv904x_Registers32Write(device, + NULL, + &txPlaybackDuc1BaseAddressArr[chanIdx], + dataToWriteArr, + NULL, + ADI_ADRV904X_TX_PLAYBACK_DATA_MAX_NUM_SAMPLES); + } + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register Write Issue"); + goto cleanup; + } + } + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxPlaybackDataRead(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannelSel, + const uint8_t bandSelect, + adi_adrv904x_TxPlaybackData_t* const playbackData) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t i = 0U; + uint32_t baseAddrToRead = 0U; + uint8_t captureEnableRead = 0U; + adrv904x_BfTxDigChanAddr_e txDigBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DIG; + uint32_t dataToReadArr[ADI_ADRV904X_TX_PLAYBACK_DATA_MAX_NUM_SAMPLES]; + + uint32_t txPlaybackBaseAddressArr[ADI_ADRV904X_MAX_TXCHANNELS] = { + ADI_ADVRV904X_TX0_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX1_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX2_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX3_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX4_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX5_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX6_PLAYBACK_RAM_BASEADDR, + ADI_ADVRV904X_TX7_PLAYBACK_RAM_BASEADDR + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, playbackData, cleanup); + ADI_LIBRARY_MEMSET(&dataToReadArr[0U], 0, sizeof(dataToReadArr)); + + if (bandSelect > 1) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + bandSelect, + "Band value cannot be greater than 1"); + goto cleanup; + } + + /*Check that if requested Tx Channel valid*/ + switch (txChannelSel) + { + case ADI_ADRV904X_TX0: + baseAddrToRead = txPlaybackBaseAddressArr[0]; + break; + case ADI_ADRV904X_TX1: + baseAddrToRead = txPlaybackBaseAddressArr[1]; + break; + case ADI_ADRV904X_TX2: + baseAddrToRead = txPlaybackBaseAddressArr[2]; + break; + case ADI_ADRV904X_TX3: + baseAddrToRead = txPlaybackBaseAddressArr[3]; + break; + case ADI_ADRV904X_TX4: + baseAddrToRead = txPlaybackBaseAddressArr[4]; + break; + case ADI_ADRV904X_TX5: + baseAddrToRead = txPlaybackBaseAddressArr[5]; + break; + case ADI_ADRV904X_TX6: + baseAddrToRead = txPlaybackBaseAddressArr[6]; + break; + case ADI_ADRV904X_TX7: + baseAddrToRead = txPlaybackBaseAddressArr[7]; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, baseAddrToRead, "Invalid Tx Channel used to determine TX playback address"); + goto cleanup; + break; + } + + if (bandSelect == 1) + { + baseAddrToRead += ADI_ADVRV904X_TX_DUC1_PLAYBACK_RAM_OFFSET; + } + + ADI_LIBRARY_MEMSET(playbackData->playbackDataReal, 0, sizeof(playbackData->playbackDataReal)); + ADI_LIBRARY_MEMSET(playbackData->playbackDataImag, 0, sizeof(playbackData->playbackDataImag)); + + recoveryAction = adrv904x_TxDigBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(txChannelSel), &txDigBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelSel, "Invalid Tx Channel used to determine Tx Dfe base address"); + goto cleanup; + } + + /* Check if TX DPD capture is enabled before reading a dataset*/ + recoveryAction = adrv904x_TxDig_TxDpdCptEn_BfGet(device, + NULL, + txDigBaseAddr, + &captureEnableRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading TX DPD capture state"); + goto cleanup; + } + + if (captureEnableRead == ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "TX DPD capture should be disabled while reading from playback RAM"); + goto cleanup; + } + + /* Check if TX FSC capture is enabled before reading a dataset*/ + recoveryAction = adrv904x_TxDig_TxFscCptEn_BfGet(device, + NULL, + txDigBaseAddr, + &captureEnableRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading TX FSC capture state"); + goto cleanup; + } + + if (captureEnableRead == ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "TX FSC capture should be disabled while reading from playback RAM"); + goto cleanup; + } + + /* Check if TX Loopback capture is enabled before reading a dataset*/ + recoveryAction = adrv904x_TxDig_TxLpbCptEn_BfGet(device, + NULL, + txDigBaseAddr, + &captureEnableRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading TX Loopback capture state"); + goto cleanup; + } + + if (captureEnableRead == ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "TX Loopback capture should be disabled while reading from playback RAM"); + goto cleanup; + } + + /* Check if TX RX ADC capture is enabled before reading a dataset*/ + recoveryAction = adrv904x_TxDig_TxRadCptEn_BfGet(device, + NULL, + txDigBaseAddr, + &captureEnableRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading TX RX ADC capture state"); + goto cleanup; + } + + if (captureEnableRead == ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "TX RX ADC capture should be disabled while reading from playback RAM"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Registers32Read(device, + NULL, + baseAddrToRead, + dataToReadArr, + NULL, + ADI_ADRV904X_TX_PLAYBACK_DATA_MAX_NUM_SAMPLES); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Register Read Issue"); + goto cleanup; + } + + for (i = 0; i < ADI_ADRV904X_TX_PLAYBACK_DATA_MAX_NUM_SAMPLES; ++i) + { + // swap the order of samples + int j; + if ((i % 2) == 0) + { + j = i + 1; + } + else + { + j = i - 1; + } + + playbackData->playbackDataReal[i] = (int16_t)((dataToReadArr[j] >> 0U) & 0x0000FFFFU); + playbackData->playbackDataImag[i] = (int16_t)((dataToReadArr[j] >> 16U) & 0x0000FFFFU); + } + playbackData->numSamples = ADI_ADRV904X_TX_PLAYBACK_DATA_MAX_NUM_SAMPLES; + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxPlaybackStart(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannelSel, + const uint8_t bandSelect, + const uint32_t dataRate_kHz) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t captureEnableRead = 0U; + uint8_t radClkDiv = 0U; + uint8_t radClkDivLog2 = 0U; + adrv904x_BfTxDigChanAddr_e txDigBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DIG; + adrv904x_BfTxBandDucChanAddr_e txBandDucBaseAddrDuc0 = ADRV904X_BF_SLICE_TX_0__TX_BAND_DUC0; + adrv904x_BfTxBandDucChanAddr_e txBandDucBaseAddrDuc1 = ADRV904X_BF_SLICE_TX_0__TX_BAND_DUC0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + if (bandSelect > 1) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + bandSelect, + "Band value cannot be greater than 1"); + goto cleanup; + } + + /* Get the base address for DUC0. This function checks the provided TX channel */ + recoveryAction = adrv904x_TxBandDuc0BitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(txChannelSel), &txBandDucBaseAddrDuc0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelSel, "Invalid Tx Channel used to determine Tx Band DUC0 base address"); + goto cleanup; + } + + /* Get the base address for DUC1. This function checks the provided TX channel */ + recoveryAction = adrv904x_TxBandDuc1BitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(txChannelSel), &txBandDucBaseAddrDuc1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelSel, "Invalid Tx Channel used to determine Tx Band DUC1 base address"); + goto cleanup; + } + + recoveryAction = adrv904x_TxDigBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(txChannelSel), &txDigBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelSel, "Invalid Tx Channel used to determine Tx Dig base address"); + goto cleanup; + } + + /* Check if TX DPD capture is enabled before starting a playback*/ + recoveryAction = adrv904x_TxDig_TxDpdCptEn_BfGet(device, + NULL, + txDigBaseAddr, + &captureEnableRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading TX DPD capture state"); + goto cleanup; + } + + if (captureEnableRead == ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "TX DPD capture should be disabled while reading from playback RAM"); + goto cleanup; + } + + /* Check if TX FSC capture is enabled before before starting a playback*/ + recoveryAction = adrv904x_TxDig_TxFscCptEn_BfGet(device, + NULL, + txDigBaseAddr, + &captureEnableRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading TX FSC capture state"); + goto cleanup; + } + + if (captureEnableRead == ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "TX FSC capture should be disabled while reading from playback RAM"); + goto cleanup; + } + + /* Check if TX Loopback capture is enabled before before starting a playback*/ + recoveryAction = adrv904x_TxDig_TxLpbCptEn_BfGet(device, + NULL, + txDigBaseAddr, + &captureEnableRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading TX Loopback capture state"); + goto cleanup; + } + + if (captureEnableRead == ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "TX Loopback capture should be disabled while reading from playback RAM"); + goto cleanup; + } + + /* Check if TX RX ADC capture is enabled before before starting a playback*/ + recoveryAction = adrv904x_TxDig_TxRadCptEn_BfGet(device, + NULL, + txDigBaseAddr, + &captureEnableRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading TX RX ADC capture state"); + goto cleanup; + } + + if (captureEnableRead == ADI_TRUE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "TX RX ADC capture should be disabled while reading from playback RAM"); + goto cleanup; + } + + if (device->devStateInfo.hsDigClk_kHz == 0U) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid HS DIG clock frequency"); + goto cleanup; + } + + if ((device->devStateInfo.hsDigClk_kHz < dataRate_kHz) || (device->devStateInfo.hsDigClk_kHz % dataRate_kHz)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid data rate"); + goto cleanup; + } + + if(bandSelect == 0) + { + /* Set the DUC0 Input to RAM Playback input */ + recoveryAction = adrv904x_TxBandDuc_DucInputSelect_BfSet(device, + NULL, + txBandDucBaseAddrDuc0, + 0x4U); /* TxAd-hocTesting(RAM Playback) input */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting DUC0 Input"); + goto cleanup; + } + + /* Mask Input I data for DUC1 */ + recoveryAction = adrv904x_TxBandDuc_MaskDucInputI_BfSet(device, + NULL, + txBandDucBaseAddrDuc1, + 0x1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while unmasking I data for DUC1"); + goto cleanup; + } + + /* Mask Input Q data for DUC1 */ + recoveryAction = adrv904x_TxBandDuc_MaskDucInputQ_BfSet(device, + NULL, + txBandDucBaseAddrDuc1, + 0x1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while unmasking Q data for DUC1"); + goto cleanup; + } + } + else + { + /* Set the DUC1 Input to RAM Playback input */ + recoveryAction = adrv904x_TxBandDuc_DucInputSelect_BfSet(device, + NULL, + txBandDucBaseAddrDuc1, + 0x4U); /* TxAd-hocTesting(RAMPlayback) input */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting DUC0 Input"); + goto cleanup; + } + + /* Mask Input I data for DUC0 */ + recoveryAction = adrv904x_TxBandDuc_MaskDucInputI_BfSet(device, + NULL, + txBandDucBaseAddrDuc0, + 0x1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while unmasking I data for DUC0"); + goto cleanup; + } + + /* Mask Input Q data for DUC0 */ + recoveryAction = adrv904x_TxBandDuc_MaskDucInputQ_BfSet(device, + NULL, + txBandDucBaseAddrDuc0, + 0x1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while unmasking Q data for DUC0"); + goto cleanup; + } + } + + radClkDiv = device->devStateInfo.hsDigClk_kHz / dataRate_kHz; + while (((radClkDiv) >>= 1) > 0U) + { + ++radClkDivLog2; + } + + /* Program the SRAM playback clock (rad_clk) */ + recoveryAction = adrv904x_TxDig_RadClkDivideRatio_BfSet(device, + NULL, + txDigBaseAddr, + radClkDivLog2); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting RAD Clock Divide Ratio"); + goto cleanup; + } + + /* Enable the RAD Clock */ + recoveryAction = adrv904x_TxDig_RadClkEnable_BfSet(device, + NULL, + txDigBaseAddr, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting RAD Clock Enable"); + goto cleanup; + } + + /* Set tx_dig.tx_rad_cpt_mode to 8 */ + recoveryAction = adrv904x_TxDig_TxRadCptMode_BfSet(device, + NULL, + txDigBaseAddr, + 8U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting RAD CPT mode bitfield"); + goto cleanup; + } + + /* Set the tx_rad_cpt_en bitfield to 1 */ + recoveryAction = adrv904x_TxDig_TxRadCptEn_BfSet(device, + NULL, + txDigBaseAddr, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting TX RX ADC capture state"); + goto cleanup; + } + + /* To start playing back the data from memory, set cpt_trigger bitfield. */ + recoveryAction = adrv904x_TxDig_TxCptTrigger_BfSet(device, + NULL, + txDigBaseAddr, + 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting capture trigger"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxPlaybackStop(adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannelSel, + const uint8_t bandSelect) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adrv904x_BfTxDigChanAddr_e txDigBaseAddr = ADRV904X_BF_SLICE_TX_0__TX_DIG; + adrv904x_BfTxBandDucChanAddr_e txBandDucBaseAddrDuc0 = ADRV904X_BF_SLICE_TX_0__TX_BAND_DUC0; + adrv904x_BfTxBandDucChanAddr_e txBandDucBaseAddrDuc1 = ADRV904X_BF_SLICE_TX_0__TX_BAND_DUC0; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + if (bandSelect > 1) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + bandSelect, + "Band value cannot be greater than 1"); + goto cleanup; + } + + recoveryAction = adrv904x_TxBandDuc0BitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(txChannelSel), &txBandDucBaseAddrDuc0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelSel, "Invalid Tx Channel used to determine Tx Band DUC0 base address"); + goto cleanup; + } + + recoveryAction = adrv904x_TxBandDuc1BitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(txChannelSel), &txBandDucBaseAddrDuc1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelSel, "Invalid Tx Channel used to determine Tx Band DUC1 base address"); + goto cleanup; + } + + recoveryAction = adrv904x_TxDigBitfieldAddressGet(device, (adi_adrv904x_TxChannels_e)(txChannelSel), &txDigBaseAddr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannelSel, "Invalid Tx Channel used to determine Tx Dig base address"); + goto cleanup; + } + + if (bandSelect == 0) + { + /* Set the DUC0 Input to default (JESD data) */ + recoveryAction = adrv904x_TxBandDuc_DucInputSelect_BfSet(device, + NULL, + txBandDucBaseAddrDuc0, + 0x0U); /* JESD data - default setting */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting DUC0 Input"); + goto cleanup; + } + + /* Unmask Input I data for DUC1 */ + recoveryAction = adrv904x_TxBandDuc_MaskDucInputI_BfSet(device, + NULL, + txBandDucBaseAddrDuc1, + 0x0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while unmasking I data for DUC1"); + goto cleanup; + } + + /* Unmask Input Q data for DUC1 */ + recoveryAction = adrv904x_TxBandDuc_MaskDucInputQ_BfSet(device, + NULL, + txBandDucBaseAddrDuc1, + 0x0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while unmasking Q data for DUC1"); + goto cleanup; + } + } + else + { + /* Set the DUC1 Input to default (JESD data) */ + recoveryAction = adrv904x_TxBandDuc_DucInputSelect_BfSet(device, + NULL, + txBandDucBaseAddrDuc1, + 0x0U); /* JESD data - default setting */ + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting DUC0 Input"); + goto cleanup; + } + + /* Unmask Input I data for DUC0 */ + recoveryAction = adrv904x_TxBandDuc_MaskDucInputI_BfSet(device, + NULL, + txBandDucBaseAddrDuc0, + 0x0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while unmasking I data for DUC0"); + goto cleanup; + } + + /* Unmask Input Q data for DUC0 */ + recoveryAction = adrv904x_TxBandDuc_MaskDucInputQ_BfSet(device, + NULL, + txBandDucBaseAddrDuc0, + 0x0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while unmasking Q data for DUC0"); + goto cleanup; + } + } + + /* Set tx_dig.tx_rad_cpt_mode to 9 */ + recoveryAction = adrv904x_TxDig_TxRadCptMode_BfSet(device, + NULL, + txDigBaseAddr, + 9U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting RAD CPT mode"); + goto cleanup; + } + + /* Set the tx_rad_cpt_en bitfield to 0 */ + recoveryAction = adrv904x_TxDig_TxRadCptEn_BfSet(device, + NULL, + txDigBaseAddr, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting TX RX ADC capture state"); + goto cleanup; + } + + /* Clear cpt_trigger bitfield */ + recoveryAction = adrv904x_TxDig_TxCptTrigger_BfSet(device, + NULL, + txDigBaseAddr, + 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting TX RX ADC capture state"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxDynamicCarrierCalculate( adi_adrv904x_Device_t* const device, + adi_adrv904x_CarrierJesdCfg_t* const jesdCfg, + adi_adrv904x_CarrierRadioCfg_t txCarrierConfigs[], + const adi_adrv904x_CarrierChannelFilterApplicationSel_t txCarrierChannelFilterApplicationSel[], + adi_adrv904x_ChannelFilterCfg_t txCarrierChannelFilter[], + const uint32_t numCarrierProfiles, + const uint8_t useCustomFilters) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_ChannelFilterCfg_t localFilterCfg[ADI_ADRV904X_MAX_NUM_PROFILES]; + char coeffLoadBuf[sizeof(adi_adrv904x_ChannelFilterLoadMaxSize_t)]; + adi_adrv904x_ChannelFilterLoad_t* const channelFilterLoad = (adi_adrv904x_ChannelFilterLoad_t*)&coeffLoadBuf; + adi_adrv904x_CarrierReconfigSoln_t soln; + adi_adrv904x_CarrierRadioCfgCmd_t chFilterCmd; + adi_adrv904x_ChannelFilterResp_t chFilterCmdRsp; + adi_adrv904x_ChannelFilterOutputCfg_t chFilterOutput; + adi_adrv904x_ChannelFilterLoadResp_t chFilterLoadCmdRsp; + uint32_t txIdx = 0U; + uint32_t bandIdx = 0U; + uint32_t txSel = 0U; + uint32_t carrierIdx = 0U; + uint32_t coeffLoadIdx = 0U; + uint32_t profileIdx = 0U; + uint32_t coeffAddressOffset = 0U; + uint32_t coeffIdx = 0U; + int32_t coeffTableIdx = 0U; + const int16_t *coeffTable = NULL; + int16_t coeffTableSize = 0; + uint32_t numberOfFilterTaps = 0U; + uint8_t asymmetricFilterTaps = 0U; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + adi_adrv904x_RxTxLoFreqReadback_t rxTxLoReadback; + adi_adrv904x_TxNcoMixConfigReadbackResp_t txRbConfig; + uint32_t currentBandCenter_kHz = 0U; + adi_adrv904x_CarrierReconfigProfileCfgOut_t* pProfileCfgOut = NULL; + adrv904x_CarrierInitialCfg_t lclInitialCfg[ADI_ADRV904X_MAX_NUM_PROFILES]; + adrv904x_CarrierInitialCfg_t* pInitialCfg = NULL; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, jesdCfg, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txCarrierConfigs, cleanup); + + ADI_LIBRARY_MEMSET(&chFilterLoadCmdRsp, 0, sizeof(chFilterLoadCmdRsp)); + ADI_LIBRARY_MEMSET(&chFilterCmd, 0, sizeof(chFilterCmd)); + ADI_LIBRARY_MEMSET(&chFilterCmdRsp, 0, sizeof(chFilterCmdRsp)); + ADI_LIBRARY_MEMSET(&chFilterOutput, 0, sizeof(chFilterOutput)); + ADI_LIBRARY_MEMSET(&soln, 0, sizeof(soln)); + ADI_LIBRARY_MEMSET(&rxTxLoReadback, 0, sizeof(rxTxLoReadback)); + ADI_LIBRARY_MEMSET(&txRbConfig, 0, sizeof(txRbConfig)); + ADI_LIBRARY_MEMSET(&lclInitialCfg, 0, sizeof(lclInitialCfg)); + + if (numCarrierProfiles > ADI_ADRV904X_MAX_NUM_PROFILES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numCarrierProfiles, "Up to four profiles allowed."); + goto cleanup; + } + + /* If caller is not using custom filters, they must select filter application enum */ + if (useCustomFilters == 0U) + { + /* For this option, verify that application sel array pointer is valid */ + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txCarrierChannelFilterApplicationSel, cleanup); + + /* Populate local filter data with preset */ + for (profileIdx = 0U; profileIdx < numCarrierProfiles; profileIdx++) + { + /* Clear localFilterCfg before populating */ + ADI_LIBRARY_MEMSET(&localFilterCfg[profileIdx], 0, sizeof(adi_adrv904x_ChannelFilterCfg_t)); + + /* Reset coefficient index for each profile */ + coeffIdx = 0U; + + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_CARRIERS; carrierIdx++) + { + if (txCarrierConfigs[profileIdx].carriers[carrierIdx].enable == 1U) + { + recoveryAction = adrv904x_ChannelFilterCoefsGet( + device, + txCarrierChannelFilterApplicationSel[profileIdx].channelFilterApplicationSel[carrierIdx], + &txCarrierConfigs[profileIdx].carriers[carrierIdx], + &coeffTable, + &coeffTableSize, + &numberOfFilterTaps, + &asymmetricFilterTaps, + ADI_FALSE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting carrier channel filter"); + goto cleanup; + } + + for (coeffTableIdx = 0U; coeffTableIdx < coeffTableSize; coeffTableIdx++) + { + localFilterCfg[profileIdx].coeffs[coeffIdx] = coeffTable[coeffTableIdx]; + coeffIdx++; + if (coeffIdx >= ADI_ADRV904X_NUM_CF_COEFFICIENTS) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, coeffIdx, "Carrier coefficients did not fit in the space provided"); + goto cleanup; + } + } + localFilterCfg[profileIdx].carrierFilterCfg.numberOfFilterTaps[carrierIdx] = numberOfFilterTaps; + localFilterCfg[profileIdx].carrierFilterCfg.asymmetricFilterTaps[carrierIdx] = asymmetricFilterTaps; + } + } + } + } + /* Else, caller will provide their own filter configs */ + else + { + /* For this option, verify that channel filter array pointer is valid */ + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txCarrierChannelFilter, cleanup); + for (profileIdx = 0U; profileIdx < numCarrierProfiles; profileIdx++) + { + /* Copy filter cfg into local array */ + ADI_LIBRARY_MEMCPY(&localFilterCfg[profileIdx], &txCarrierChannelFilter[profileIdx], sizeof(adi_adrv904x_ChannelFilterCfg_t)); + } + } + + /* Initialize lcl solution structure */ + recoveryAction = adrv904x_ReconfigSolutionInit(device, jesdCfg, txCarrierConfigs, numCarrierProfiles, &soln); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Could not initialize struct"); + goto cleanup; + } + + /* Readback key values from current HW conditions , store in the pInitialCfg for each Profile (4 max) + * - adi_adrv904x_RxTxLoFreqGet() - Rx/Tx LO Frequencies + * - adi_adrv904x_TxNcoShifterGet() - Tx Band NCO and Center Freq + */ + recoveryAction = adi_adrv904x_RxTxLoFreqGet(device, + &rxTxLoReadback); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "adi_adrv904x_RxTxLoFreqGet failed"); + goto cleanup; + } + + for (profileIdx = 0U; profileIdx < numCarrierProfiles; profileIdx++) + { + /* Set convenience pointer to output profile */ + pProfileCfgOut = &soln.outputs.profileCfgs[profileIdx]; + + /* Set convenience pointer to lcl var profile of lclInitialCfg */ + pInitialCfg = &lclInitialCfg[profileIdx]; + + if ((txCarrierConfigs[profileIdx].channelMask == 0U) || + ((txCarrierConfigs[profileIdx].channelMask & (~(uint32_t)ADI_ADRV904X_TXALL)) != 0U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txCarrierConfigs[profileIdx].channelMask, "Invalid chanSelect provided."); + goto cleanup; + } + + /* + * For each channel in this profile verify it was initialized with the same profile. + * The band settings were extracted on a channel basis. We'll find the first channel that's assigned to this profile + * and use it's band setting. Then verify the remaining channels in this profile match. + * + * */ + for (txIdx = 0U; txIdx < ADI_ADRV904X_MAX_TXCHANNELS; txIdx++) + { + txSel = 1U << txIdx; + if ((txCarrierConfigs[profileIdx].channelMask & txSel) > 0U) + { + for (bandIdx = 0U; bandIdx < ADI_ADRV904X_DUC_NUM_BAND; bandIdx++) + { + if (device->initExtract.tx.txChannelCfg[txIdx].bandSettings[bandIdx].enabled == ADI_TRUE) + { + ADI_LIBRARY_MEMSET(&txRbConfig, 0, sizeof(txRbConfig)); + + txRbConfig.bandSelect = bandIdx; + txRbConfig.chanSelect = txSel; + + recoveryAction = adi_adrv904x_TxNcoShifterGet( device, &txRbConfig); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "adi_adrv904x_TxNcoShifterGet failed"); + goto cleanup; + } + + currentBandCenter_kHz = rxTxLoReadback.txFreq_Khz[txIdx] + txRbConfig.frequencyKhz; + if (pInitialCfg->bandSettings[bandIdx].rfCenterFreq_kHz == 0U) + { + /* Copy all settings and overwrite centerFreq with current NCO values */ + ADI_LIBRARY_MEMCPY( &(pInitialCfg->bandSettings[bandIdx]), + &(device->initExtract.tx.txChannelCfg[txIdx].bandSettings[bandIdx]), + sizeof(pInitialCfg->bandSettings[bandIdx])); + pInitialCfg->bandSettings[bandIdx].rfCenterFreq_kHz = currentBandCenter_kHz; + pInitialCfg->maxSlot = device->initExtract.tx.txChannelCfg[txIdx].maxSlot; + } + else if (pInitialCfg->bandSettings[bandIdx].rfCenterFreq_kHz != currentBandCenter_kHz) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txCarrierConfigs[profileIdx].channelMask, "Each channel in a single profile must have matching band center frequencies, e.g. all NCOs in a single profile must be the same value."); + goto cleanup; + } + } + } + } + } + + /* Sort carriers for this profile into Bands 0 vs. Band 1 based on frequencies */ + /* Will throw an error if a carrier's bw falls outside both Band's bw */ + recoveryAction = adrv904x_TxCarrierBandSorting( device, + pInitialCfg, + &txCarrierConfigs[profileIdx], + pProfileCfgOut); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid band selection"); + goto cleanup; + } + + /* Select Band Attenuations based on the number of carriers in each Band */ + recoveryAction = adrv904x_TxCarrierBandAttenConfig( device, + &txCarrierConfigs[profileIdx], + pProfileCfgOut); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid band atten settings"); + goto cleanup; + } + + /* Determine new Carrier NCOs based on the new carrier center frequencies vs. the Band Center frequencies */ + recoveryAction = adrv904x_TxCarrierNcoReconfig( device, + pInitialCfg, + &txCarrierConfigs[profileIdx], + pProfileCfgOut); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid NCO settings"); + goto cleanup; + } + + /* JESD PARAMETER CALCULATION */ + recoveryAction = adrv904x_CarrierJesdParametersCalculate( device, + pInitialCfg, + &txCarrierConfigs[profileIdx], + pProfileCfgOut, + ADI_FALSE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Invalid JESD settings"); + goto cleanup; + } + + /* Reset the buffer each profile. channelFilterLoad maps to this buffer */ + ADI_LIBRARY_MEMSET(&coeffLoadBuf, 0, sizeof(coeffLoadBuf)); + + /* Perform endianness correction and load channel filter coefficients */ + channelFilterLoad->coeffIdx = 0U; + for (coeffIdx = 0U; coeffIdx < ADI_ADRV904X_NUM_CF_COEFFICIENTS; coeffIdx++) + { + coeffAddressOffset = coeffLoadIdx * sizeof(int16_t); + ADI_LIBRARY_MEMCPY((void*)((uint8_t*)channelFilterLoad + sizeof(adi_adrv904x_ChannelFilterLoad_t) + coeffAddressOffset), (void*)(&localFilterCfg[profileIdx].coeffs[coeffIdx]), sizeof(int16_t)); + coeffLoadIdx++; + + /* Once we fill up enough coefficients or we're on the last coefficient send to fw and clear out the buffer */ + if ((coeffLoadIdx == ADI_ADRV904X_CHAN_FILTER_COEFF_LOAD_LEN) || (coeffIdx == (ADI_ADRV904X_NUM_CF_COEFFICIENTS - 1U))) + { + /* Using coeffLoadIdx after incremented to give us the number of coefficients actually loaded */ + channelFilterLoad->coeffNum = (uint16_t)ADRV904X_HTOCL(coeffLoadIdx); + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_LOAD_CHANNEL_FILTER_COEFFS, + (void*)channelFilterLoad, + sizeof(coeffLoadBuf), + (void*)&chFilterLoadCmdRsp, + sizeof(chFilterLoadCmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO((adrv904x_CpuErrorCode_e)chFilterLoadCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + ADI_LIBRARY_MEMSET(&coeffLoadBuf, 0, sizeof(coeffLoadBuf)); + + channelFilterLoad->coeffIdx = coeffIdx + 1; + coeffLoadIdx = 0U; + } + } + + /* Perform endianness correction and load channel filter configs */ + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_CARRIERS; carrierIdx++) + { + localFilterCfg[profileIdx].carrierFilterCfg.numberOfFilterTaps[carrierIdx] = (uint32_t)ADRV904X_HTOCL(localFilterCfg[profileIdx].carrierFilterCfg.numberOfFilterTaps[carrierIdx]); + localFilterCfg[profileIdx].carrierFilterCfg.asymmetricFilterTaps[carrierIdx] = localFilterCfg[profileIdx].carrierFilterCfg.asymmetricFilterTaps[carrierIdx]; + } + + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_LOAD_CHANNEL_FILTER_CFG, + (void*)&(localFilterCfg[profileIdx].carrierFilterCfg), + sizeof(localFilterCfg[profileIdx].carrierFilterCfg), + (void*)&chFilterLoadCmdRsp, + sizeof(chFilterLoadCmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO((adrv904x_CpuErrorCode_e)chFilterLoadCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* Create local cmd data with Endianness correction */ + chFilterCmd.carrierRadioCfg.channelMask = (uint32_t)ADRV904X_HTOCL(txCarrierConfigs[profileIdx].channelMask); + + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_CARRIERS; carrierIdx++) + { + chFilterCmd.carrierRadioCfg.carriers[carrierIdx].enable = txCarrierConfigs[profileIdx].carriers[carrierIdx].enable; + chFilterCmd.carrierRadioCfg.carriers[carrierIdx].sampleRate_kHz = (uint32_t)ADRV904X_HTOCL(txCarrierConfigs[profileIdx].carriers[carrierIdx].sampleRate_kHz); + chFilterCmd.carrierRadioCfg.carriers[carrierIdx].ibw_kHz = (uint32_t)ADRV904X_HTOCL(txCarrierConfigs[profileIdx].carriers[carrierIdx].ibw_kHz); + chFilterCmd.carrierRadioCfg.carriers[carrierIdx].centerFrequency_kHz = (uint32_t)ADRV904X_HTOCL(txCarrierConfigs[profileIdx].carriers[carrierIdx].centerFrequency_kHz); + } + chFilterCmd.apply = 0u; + + /* Reset for each profile */ + ADI_LIBRARY_MEMSET(&chFilterCmdRsp, 0, sizeof(chFilterCmdRsp)); + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_TX_CARRIER_RECONFIGURE, + (void*)&chFilterCmd, + sizeof(chFilterCmd), + (void*)&chFilterCmdRsp, + sizeof(chFilterCmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO((adrv904x_CpuErrorCode_e)chFilterCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* Pull out necessary results from response with Endianness correction */ + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_CARRIERS; carrierIdx++) + { + chFilterOutput.numberOfFilterTaps[carrierIdx] = ADRV904X_CTOHS(chFilterCmdRsp.carrierFilterOutCfg.numberOfFilterTaps[carrierIdx]); + chFilterOutput.dataPipeStop[carrierIdx] = ADRV904X_CTOHS(chFilterCmdRsp.carrierFilterOutCfg.dataPipeStop[carrierIdx]); + chFilterOutput.bypassFilter[carrierIdx] = ADRV904X_CTOHS(chFilterCmdRsp.carrierFilterOutCfg.bypassFilter[carrierIdx]); + chFilterOutput.oddFilterTaps[carrierIdx] = ADRV904X_CTOHS(chFilterCmdRsp.carrierFilterOutCfg.oddFilterTaps[carrierIdx]); + } + recoveryAction = adrv904x_CducDelayConfigurationCalculate( device, + &txCarrierConfigs[profileIdx], + &chFilterOutput, + pProfileCfgOut); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue with delay calculation"); + goto cleanup; + } +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + for (uint32_t slot = 0; slot < ADI_ADRV904X_MAX_NO_OF_JESD_IFACE_SLOTS; slot++) + { + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Pre-Shuffle Iface-SlotTable[%d] = %d", slot, pProfileCfgOut->internalJesdCfg.ifaceSlotTable[slot]); + } + for (uint32_t slot = 0; slot < ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS; slot++) + { + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Pre-Shuffle SlotTable[%d] = %d", slot, pProfileCfgOut->internalJesdCfg.slotTable[slot]); + } + + /* Slot Shuffling Algorithm */ + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Slot Shuffle START ------------------------------------------------------------ %d", 0); +#endif + recoveryAction = adrv904x_CarrierDelaySlotShuffleSet( device, + &txCarrierConfigs[profileIdx], + &chFilterOutput, + pProfileCfgOut, + ADI_FALSE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Tx Carrier Slot Shuffling Strategies Failed"); + goto cleanup; + } +#if (ADI_ENABLE_DELAY_MATCHING_LOG_PRINTS == 1) + for (uint32_t slot = 0; slot < ADI_ADRV904X_MAX_NO_OF_JESD_IFACE_SLOTS; slot++) + { + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Post-Shuffle Iface-SlotTable[%d] = %d", slot, pProfileCfgOut->internalJesdCfg.ifaceSlotTable[slot]); + } + for (uint32_t slot = 0; slot < ADI_ADRV904X_NO_OF_JESD_CARRIER_SLOTS; slot++) + { + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Post Shuffle SlotTable[%d] = %d", slot, pProfileCfgOut->internalJesdCfg.slotTable[slot]); + } + + + ADI_VARIABLE_LOG(&device->common, ADI_HAL_LOG_MSG, "Slot Shuffle STOP ------------------------------------------------------------ %d", 0); +#endif + } /* End of profile forloop */ + + /* Store Tx solution structure to device handle. To be used in next call to Apply() stage */ + ADI_LIBRARY_MEMCPY(&device->devStateInfo.txCarrierReconfigSoln, &soln, sizeof(adi_adrv904x_CarrierReconfigSoln_t)); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxDynamicCarrierWrite(adi_adrv904x_Device_t* const device) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_CarrierRadioCfgCmd_t chFilterCmd; + adi_adrv904x_ChannelFilterResp_t chFilterCmdRsp; + adi_adrv904x_ChannelFilterOutputCfg_t chFilterOutput; + uint32_t txIdx = 0U; + uint32_t txSel = 0U; + uint32_t carrierIdx = 0U; + uint32_t profileIdx = 0U; + adrv904x_CpuCmdStatus_e cmdStatus = ADRV904X_CPU_CMD_STATUS_GENERIC; + adrv904x_CpuErrorCode_e cpuErrorCode = ADRV904X_CPU_SYSTEM_SIMULATED_ERROR; + adi_adrv904x_CarrierReconfigSoln_t* soln = NULL; + adi_adrv904x_CarrierRadioCfg_t* pProfileCfgIn = NULL; + adi_adrv904x_CarrierReconfigProfileCfgOut_t* pProfileCfgOut = NULL; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_LIBRARY_MEMSET(&chFilterCmd, 0, sizeof(chFilterCmd)); + ADI_LIBRARY_MEMSET(&chFilterCmdRsp, 0, sizeof(chFilterCmdRsp)); + ADI_LIBRARY_MEMSET(&chFilterOutput, 0, sizeof(chFilterOutput)); + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + /* Convenience pointer to soln from last Solve() call */ + soln = &device->devStateInfo.txCarrierReconfigSoln; + + for (profileIdx = 0U; profileIdx < soln->inputs.numProfiles; profileIdx++) + { + pProfileCfgIn = &soln->inputs.profileCfgs[profileIdx]; + pProfileCfgOut = &soln->outputs.profileCfgs[profileIdx]; + + /* Create local cmd data with Endianness correction */ + chFilterCmd.carrierRadioCfg.channelMask = (uint32_t)ADRV904X_HTOCL(pProfileCfgIn->channelMask); + + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_CARRIERS; carrierIdx++) + { + chFilterCmd.carrierRadioCfg.carriers[carrierIdx].enable = pProfileCfgIn->carriers[carrierIdx].enable; + chFilterCmd.carrierRadioCfg.carriers[carrierIdx].sampleRate_kHz = (uint32_t)ADRV904X_HTOCL(pProfileCfgIn->carriers[carrierIdx].sampleRate_kHz); + chFilterCmd.carrierRadioCfg.carriers[carrierIdx].ibw_kHz = (uint32_t)ADRV904X_HTOCL(pProfileCfgIn->carriers[carrierIdx].ibw_kHz); + chFilterCmd.carrierRadioCfg.carriers[carrierIdx].centerFrequency_kHz = (uint32_t)ADRV904X_HTOCL(pProfileCfgIn->carriers[carrierIdx].centerFrequency_kHz); + } + chFilterCmd.apply = 1u; + + /* Reset for each profile */ + ADI_LIBRARY_MEMSET(&chFilterCmdRsp, 0, sizeof(chFilterCmdRsp)); + + /* Send command and receive response */ + recoveryAction = adrv904x_CpuCmdSend( device, + ADI_ADRV904X_CPU_TYPE_0, + ADRV904X_LINK_ID_0, + ADRV904X_CPU_CMD_ID_TX_CARRIER_RECONFIGURE, + (void*)&chFilterCmd, + sizeof(chFilterCmd), + (void*)&chFilterCmdRsp, + sizeof(chFilterCmdRsp), + &cmdStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_ADRV904X_CPU_CMD_RESP_CHECK_GOTO((adrv904x_CpuErrorCode_e)chFilterCmdRsp.status, cmdStatus, cpuErrorCode, recoveryAction, cleanup); + } + + /* Program Carrier Tx JESD Config */ + recoveryAction = adrv904x_CarrierTxJesdConfigSet( device, + pProfileCfgIn->channelMask, + pProfileCfgOut); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reconfiguring carriers"); + goto cleanup; + } + + for (txIdx = 0U; txIdx < ADI_ADRV904X_MAX_TXCHANNELS; txIdx++) + { + txSel = 1U << txIdx; + if ((pProfileCfgIn->channelMask & txSel) > 0U) + { + recoveryAction = adrv904x_TxCarrierConfigSet( device, + txIdx, + pProfileCfgOut); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reconfiguring carriers"); + goto cleanup; + } + + /* TPGSWE-7944: Skip following write due to BfSet bugs */ + + /* Note: The following API TxCarrierDelaySet() is reported not working. + recoveryAction = adrv904x_TxCarrierDelaySet( device, + txIdx, + &pProfileCfgOut->delayCfg.bufferCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reconfiguring delay params"); + goto cleanup; + } + */ + + /* Update stored carrier settings */ + ADI_LIBRARY_MEMCPY(&device->initExtract.txCarrierConfigs[txIdx], pProfileCfgIn, sizeof(adi_adrv904x_CarrierRadioCfg_t)); + ADI_LIBRARY_MEMCPY(&device->initExtract.tx.txChannelCfg[txIdx].carrierRuntimeSettings, &(pProfileCfgOut->carrierCfgs), sizeof(adi_adrv904x_CarrierRuntime_t)); + } + } + } + + recoveryAction = adrv904x_CalculateTxSampleXbarSlotConfig(device, &soln->inputs.jesdCfg, &soln->outputs); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + return recoveryAction; + } + + recoveryAction = adrv904x_TxJesdConfigSet( device, + &soln->outputs); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reconfiguring carriers"); + goto cleanup; + } + + /* Update stored JESD settings */ + ADI_LIBRARY_MEMCPY(&device->initExtract.txCarrierJesdCfg, &soln->inputs.jesdCfg, sizeof(adi_adrv904x_CarrierJesdCfg_t)); + + /* Updated stored "applied" latency results */ + ADI_LIBRARY_MEMCPY( + &(device->devStateInfo.txCarrierLatencyApplied), + &(device->devStateInfo.txCarrierLatencySolved), + sizeof(adi_adrv904x_CarrierReconfigLatencyCfgTop_t)); + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxDynamicCarrierReconfigureWithFilterSelect( adi_adrv904x_Device_t* const device, + adi_adrv904x_CarrierJesdCfg_t* const jesdCfg, + adi_adrv904x_CarrierRadioCfg_t txCarrierConfigs[], + const adi_adrv904x_CarrierChannelFilterApplicationSel_t txCarrierChannelFilterApplicationSel[], + const uint32_t numCarrierProfiles ) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, jesdCfg, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txCarrierConfigs, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txCarrierChannelFilterApplicationSel, cleanup); + + if (numCarrierProfiles > ADI_ADRV904X_MAX_NUM_PROFILES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numCarrierProfiles, "Up to four profiles allowed."); + goto cleanup; + } + + /* Solve */ + recoveryAction = adi_adrv904x_TxDynamicCarrierCalculate(device, jesdCfg, txCarrierConfigs, txCarrierChannelFilterApplicationSel, NULL, numCarrierProfiles, ADI_FALSE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while calculating TxDynamicCarrier"); + goto cleanup; + } + + /* Apply */ + recoveryAction = adi_adrv904x_TxDynamicCarrierWrite(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while applying TxDynamicCarrier to HW"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxDynamicCarrierReconfigure( adi_adrv904x_Device_t* const device, + adi_adrv904x_CarrierJesdCfg_t* const jesdCfg, + adi_adrv904x_CarrierRadioCfg_t txCarrierConfigs[], + adi_adrv904x_ChannelFilterCfg_t txCarrierChannelFilter[], + const uint32_t numCarrierProfiles) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, jesdCfg, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txCarrierConfigs, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txCarrierChannelFilter, cleanup); + + if (numCarrierProfiles > ADI_ADRV904X_MAX_NUM_PROFILES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numCarrierProfiles, "Up to four profiles allowed."); + goto cleanup; + } + + /* Solve */ + recoveryAction = adi_adrv904x_TxDynamicCarrierCalculate(device, jesdCfg, txCarrierConfigs, NULL, txCarrierChannelFilter, numCarrierProfiles, ADI_TRUE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while calculating TxDynamicCarrier"); + goto cleanup; + } + + /* Apply */ + recoveryAction = adi_adrv904x_TxDynamicCarrierWrite(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while applying TxDynamicCarrier to HW"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxCarrierSettingsGet( adi_adrv904x_Device_t* const device, + const uint32_t txChannel, + adi_adrv904x_CarrierRadioCfg_t* const txCarrierConfigs, + adi_adrv904x_CarrierRuntime_t* const carrierRuntimeSettings) +{ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txCarrierConfigs, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, carrierRuntimeSettings, cleanup); + + ADI_LIBRARY_MEMCPY(txCarrierConfigs, &device->initExtract.txCarrierConfigs[txChannel], sizeof(adi_adrv904x_CarrierRadioCfg_t)); + ADI_LIBRARY_MEMCPY(carrierRuntimeSettings, &device->initExtract.tx.txChannelCfg[txChannel].carrierRuntimeSettings, sizeof(adi_adrv904x_CarrierRuntime_t)); + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxCarrierJesdCfgGet( adi_adrv904x_Device_t* const device, + adi_adrv904x_CarrierJesdCfg_t* const txCarrierJesdCfg) +{ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txCarrierJesdCfg, cleanup); + + ADI_LIBRARY_MEMCPY(txCarrierJesdCfg, &device->initExtract.txCarrierJesdCfg, sizeof(adi_adrv904x_CarrierJesdCfg_t)); + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_TxCarrierLatencyGet( adi_adrv904x_Device_t* const device, + const adi_adrv904x_TxChannels_e txChannel, + adi_adrv904x_CarrierReconfigLatencyCfg_t* const txCarrierLatencyCfg) +{ + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, txCarrierLatencyCfg, cleanup); + + if ((txChannel != ADI_ADRV904X_TX0) && + (txChannel != ADI_ADRV904X_TX1) && + (txChannel != ADI_ADRV904X_TX2) && + (txChannel != ADI_ADRV904X_TX3) && + (txChannel != ADI_ADRV904X_TX4) && + (txChannel != ADI_ADRV904X_TX5) && + (txChannel != ADI_ADRV904X_TX6) && + (txChannel != ADI_ADRV904X_TX7)) + { + /* Invalid Channel selection */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, txChannel, "Invalid Tx Channel Selection"); + goto cleanup; + } + + + ADI_LIBRARY_MEMCPY( + txCarrierLatencyCfg, + &(device->devStateInfo.txCarrierLatencyApplied.channel[adrv904x_TxChannelsToId(txChannel)]), + sizeof(adi_adrv904x_CarrierReconfigLatencyCfg_t)); + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} diff --git a/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_utilities.c b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_utilities.c new file mode 100644 index 00000000000..e2234b97cf6 --- /dev/null +++ b/drivers/rf-transceiver/koror/devices/adrv904x/public/src/adi_adrv904x_utilities.c @@ -0,0 +1,6042 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_adrv904x_utilities.c +* \brief Contains ADI Transceiver CPU functions +* Analog Devices maintains and provides updates to this code layer. +* The end user should not modify this file or any code in this directory. +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#include "adi_adrv904x_utilities.h" +#include "adi_adrv904x_cpu.h" +#include "adi_adrv904x_datainterface.h" +#include "adi_adrv904x_radioctrl.h" +#include "adi_adrv904x_cals.h" +#include "adi_adrv904x_tx.h" +#include "adi_library.h" + +#include "adi_adrv904x_dfe_cpu.h" + +#include "../../private/include/adrv904x_init.h" +#include "../../private/include/adrv904x_cpu_archive_types.h" +#include "../../private/include/adrv904x_rx.h" +#include "../../private/include/adrv904x_cpu.h" +#include "../../private/include/adrv904x_gpio.h" +#include "../../private/include/adrv904x_datainterface.h" +#include "../../private/include/adrv904x_cpu_cmd_fast_attack.h" +#include "../../private/include/adrv904x_binloader.h" +#include "../../private/bf/adrv904x_bf_tx_dig.h" +#include "../../public/include/adi_adrv904x_version.h" +#include "../../public/include/adi_adrv904x_core.h" +#include "../../private/bf/adrv904x_bf_core.h" + + +#include "../../private/include/adrv904x_dfe_svc_bbic_bridge_t.h" +#include "../../private/include/adrv904x_dfe_svc_cmd_force_exception.h" +#include "../../private/include/adrv904x_dfe_cpu.h" +#include "../../private/include/adrv904x_dfe_cfr.h" +#include "../../private/include/adrv904x_dfe_svc_err_dfe_boot_status_t.h" +#include "../../private/include/adrv904x_carrier_reconfigure_types.h" +#include "../../private/include/adrv904x_dfe_vswr.h" + + +#include "../../private/include/adrv904x_radioctrl.h" +#include "../../private/include/adrv904x_dfe_svc_radio_ctrl_sequencer_t.h" +#include "../../private/bf/adrv904x_bf_sequencer.h" + +#define ADI_FILE ADI_ADRV904X_FILE_PUBLIC_UTILITIES + +/*****************************************************************************/ +/***** Helper functions' prototypes ******************************************/ +/*****************************************************************************/ +static adi_adrv904x_ErrAction_e adrv904x_CpuLoadUtil(adi_adrv904x_Device_t* const device, + const adi_adrv904x_cpuBinaryInfo_t* const cpuBinaryInfo, + FILE* cpuImageFilePtr, + const adi_adrv904x_CpuType_e cpuType); +static uint32_t adrv904x_insert64Bits( uint8_t* array, + uint64_t storeVariable); +static uint32_t adrv904x_insert32Bits( uint8_t* array, + uint32_t storeVariable); +static uint32_t adrv904x_insert16Bits( uint8_t* array, + uint16_t storeVariable); +static uint32_t adrv904x_insert8Bits( uint8_t* array, + uint8_t storeVariable); + +static adi_adrv904x_ErrAction_e adrv904x_dumpMemoryRegion( adi_adrv904x_Device_t* const device, + FILE **ofp, + uint32_t startAddr, + uint32_t endAddr, + uint32_t* const dumpSize, + uint32_t *recordCrc); + +static adi_adrv904x_ErrAction_e adrv904x_dumpTraceCpuData( adi_adrv904x_Device_t* const device, + FILE **ofp, + uint32_t baseAddr, + uint32_t *recordCrc); + +static void adrv904x_EndiannessCheckAndConvert(void* const buffer, const size_t elementSize, const size_t elementCount); + +#define VARIABLE_ASSIGNMENT(target, source) \ + target = source; \ + if(ADRV904X_LITTLE_ENDIAN == 0) \ + { \ + adrv904x_EndiannessCheckAndConvert(&target, sizeof(target), 1);\ + }\ + +static size_t adrv904x_VariableFromFileExtract(adi_adrv904x_Device_t* const device, + void* const buffer, + const size_t elementSize, + const size_t elementCount, + FILE* file); + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuImageLoad(adi_adrv904x_Device_t* const device, + const adi_adrv904x_cpuBinaryInfo_t* const cpuBinaryInfo) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + FILE* cpuImageFilePtr = NULL; + uint32_t fileSize = 0U; + uint32_t byteCount = 0U; + uint32_t expFileSize = 0U; + adrv904x_CpuArchiveHeader_t archiveHdr; + uint32_t i = 0u; + uint32_t expectedXSum = 0U; + uint8_t* archivePtr = NULL; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuBinaryInfo, cleanup); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuBinaryInfo->filePath, cleanup); + + ADI_LIBRARY_MEMSET(&archiveHdr, 0, sizeof(adrv904x_CpuArchiveHeader_t)); + + if (ADI_LIBRARY_STRNLEN((const char*)cpuBinaryInfo->filePath, ADI_ADRV904X_MAX_FILE_LENGTH) == ADI_ADRV904X_MAX_FILE_LENGTH) + { + /* Path is not terminated */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuBinaryInfo->filePath, "Unterminated path string"); + goto cleanup; + } + + /* Open CPU archive file */ +#ifdef __GNUC__ + cpuImageFilePtr = ADI_LIBRARY_FOPEN((const char *)cpuBinaryInfo->filePath, "rb"); +#else + if (ADI_LIBRARY_FOPEN_S(&cpuImageFilePtr, (const char *)cpuBinaryInfo->filePath, "rb") != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuBinaryInfo->filePath, "Invalid Binary File or Path Detected"); + goto cleanup; + } +#endif + if (NULL == cpuImageFilePtr) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuBinaryInfo->filePath, "Invalid Binary File or Path Detected"); + goto cleanup; + } + + /* Determine file size */ + if (ADI_LIBRARY_FSEEK(cpuImageFilePtr, 0, SEEK_END) != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuBinaryInfo->filePath, "Seek to EOF Failed"); + goto cleanup; + } + + /* ADI_LIBRARY_FTELL returns long type */ + fileSize = (uint32_t) ADI_LIBRARY_FTELL(cpuImageFilePtr); + + /* Check if CPU Image File is Empty */ + if (fileSize == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuBinaryInfo->filePath, "Zero Length CPU Image Detected"); + goto cleanup; + } + + /* Check that size of the file is a multiple of 4 */ + if ((fileSize & 0x3U) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuBinaryInfo->filePath, "Incorrect CPU Binary File Block Size"); + goto cleanup; + } + + /* Verify file contains at least the archive header */ + if (fileSize < sizeof(adrv904x_CpuArchiveHeader_t)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuBinaryInfo->filePath, "Invalid CPU image file detected (very small)"); + goto cleanup; + } + + /* Rewind the file pointer to beginning of the file */ + if (ADI_LIBRARY_FSEEK(cpuImageFilePtr, 0U, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuBinaryInfo->filePath, "Unable to Rewind File Pointer for CPU Binary"); + goto cleanup; + } + + /* Read out the archive header */ + byteCount = ADI_LIBRARY_FREAD(&archiveHdr, 1, sizeof(archiveHdr), cpuImageFilePtr); + if (byteCount != sizeof(archiveHdr)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuBinaryInfo->filePath, "Error reading header from CPU image file"); + goto cleanup; + } + + /* Extract archive header contents (stored in CPU byte order) */ + archiveHdr.magicNum = ADRV904X_CTOHL(archiveHdr.magicNum); + archiveHdr.formatRev = ADRV904X_CTOHL(archiveHdr.formatRev); + archiveHdr.xsum = ADRV904X_CTOHL(archiveHdr.xsum); + + /* Calculate the expected archive header checksum + * (inverted byte sum of magicNum and formatRev) + */ + expectedXSum = 0U; + archivePtr = (uint8_t*)&archiveHdr; + for (i = 0U; i < sizeof(archiveHdr) - sizeof(archiveHdr.xsum); i++) + { + expectedXSum += archivePtr[i]; + } + expectedXSum = ~expectedXSum; + + /* Verify header checksum is correct */ + if (expectedXSum != archiveHdr.xsum) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuBinaryInfo->filePath, "Corrupted CPU image file detected"); + goto cleanup; + } + + /* Verify header magic number is correct */ + if (archiveHdr.magicNum != ADRV904X_CPU_ARCHIVE_MAGIC_NUM) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuBinaryInfo->filePath, "Unsupported CPU image file detected"); + goto cleanup; + } + + /* Verify archive format revision is correct */ + if (archiveHdr.formatRev != ADRV904X_CPU_ARCHIVE_REV_1) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuBinaryInfo->filePath, "Unsupported CPU image file detected"); + goto cleanup; + } + + /* Verify file size is correct (header + two CPU images) */ + expFileSize = sizeof(adrv904x_CpuArchiveHeader_t) + ADI_ADRV904X_CPU_0_BINARY_IMAGE_FILE_SIZE_BYTES + ADI_ADRV904X_CPU_1_BINARY_IMAGE_FILE_SIZE_BYTES; + if (fileSize != expFileSize) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuBinaryInfo->filePath, "Invalid CPU image file detected"); + goto cleanup; + } + + /* Put the part into streaming mode to help facilitate the large, contiguous SPI writes in CpuImageWrite */ + recoveryAction = adrv904x_SpiStreamingEntry(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue with entering Spi Streaming mode"); + goto cleanup; + } + + /* Load CPU0 image */ + recoveryAction = adrv904x_CpuLoadUtil(device, cpuBinaryInfo, cpuImageFilePtr, ADI_ADRV904X_CPU_TYPE_0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error loading CPU0 image"); + goto cleanup; + } + + /* Load CPU1 image */ + recoveryAction = adrv904x_CpuLoadUtil(device, cpuBinaryInfo, cpuImageFilePtr, ADI_ADRV904X_CPU_TYPE_1); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error loading CPU1 image"); + goto cleanup; + } + + /* Load successful. Update device state. */ + device->devStateInfo.devState = (adi_adrv904x_ApiStates_e)(device->devStateInfo.devState | ADI_ADRV904X_STATE_CPU0LOADED | ADI_ADRV904X_STATE_CPU1LOADED); + + /* Close CPU Image File */ + if (0 == ADI_LIBRARY_FCLOSE(cpuImageFilePtr)) + { + cpuImageFilePtr = NULL; + } + else + { + cpuImageFilePtr = NULL; + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuBinaryInfo->filePath, "Cannot Close CPU Image File"); + goto cleanup; + } + +cleanup : + if (cpuImageFilePtr != NULL) + { + /* Close CPU Image File */ + if (0 != ADI_LIBRARY_FCLOSE(cpuImageFilePtr)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot Close CPU Image File"); + } + } + + if (device->devStateInfo.spiStreamingOn == ADI_TRUE) + { + if( ADI_ADRV904X_ERR_ACT_NONE != adrv904x_SpiStreamingExit(device)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_INTERFACE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Spi Streaming Exit Issue"); + } + } + + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_StreamImageLoad(adi_adrv904x_Device_t* const device, + const adi_adrv904x_streamBinaryInfo_t* const streamBinaryInfoPtr) +{ + const size_t BIN_ELEMENT_SIZE = 1U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + FILE* streamBinaryFilePtr = NULL; + uint32_t fileSize = 0U; + uint32_t numFileChunks = 0U; + uint32_t chunkIndex = 0U; + uint8_t streamBinaryImageBuffer[ADI_ADRV904X_STREAM_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES]; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, streamBinaryInfoPtr, cleanup); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, streamBinaryInfoPtr->filePath, cleanup); + + if (ADI_LIBRARY_STRNLEN((const char*)streamBinaryInfoPtr->filePath, ADI_ADRV904X_MAX_FILE_LENGTH) == ADI_ADRV904X_MAX_FILE_LENGTH) + { + /* Path is not terminated */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, streamBinaryInfoPtr->filePath, "Unterminated path string"); + goto cleanup; + } + + /* Open Stream Binary File */ +#ifdef __GNUC__ + streamBinaryFilePtr = ADI_LIBRARY_FOPEN((const char *)streamBinaryInfoPtr->filePath, "rb"); +#else + if (ADI_LIBRARY_FOPEN_S(&streamBinaryFilePtr, (const char *)streamBinaryInfoPtr->filePath, "rb") != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, streamBinaryInfoPtr->filePath, "Invalid Binary File or Path Detected"); + goto cleanup; + } +#endif + + if (NULL == streamBinaryFilePtr) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, streamBinaryInfoPtr->filePath, "Invalid Binary File or Path Detected"); + goto cleanup; + } + + /*Determine file size*/ + if (ADI_LIBRARY_FSEEK(streamBinaryFilePtr, 0U, SEEK_END) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, streamBinaryFilePtr, "Seek to EOF Failed"); + goto cleanup; + } + + /* ADI_LIBRARY_FTELL returns long type */ + fileSize = (uint32_t) ADI_LIBRARY_FTELL(streamBinaryFilePtr); + numFileChunks = (uint32_t)(fileSize / ADI_ADRV904X_STREAM_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES); + + /* Check that Stream binary file is not empty */ + if (fileSize == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, streamBinaryFilePtr, "Zero Length Stream Image Detected"); + goto cleanup; + } + + /* Check that Stream binary file size does not exceed maximum size */ + if (fileSize > ADI_ADRV904X_STREAM_BINARY_IMAGE_FILE_SIZE_BYTES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, fileSize, "Stream Binary Size exceeds Maximum Limit"); + goto cleanup; + } + + /* Check that size of the file is a multiple of 4 */ + if ((fileSize & 0x3U) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, streamBinaryInfoPtr->filePath, "Incorrect Stream Binary File Block Size"); + goto cleanup; + } + + /* Rewind the file pointer to beginning of the file */ + if (ADI_LIBRARY_FSEEK(streamBinaryFilePtr, 0U, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, streamBinaryFilePtr, "Unable to Rewind File Pointer for CPU Binary"); + goto cleanup; + } + + /* Put the part into streaming mode to help facilitate the large, contiguous SPI writes in CpuImageWrite */ + recoveryAction = adrv904x_SpiStreamingEntry(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue with entering Spi Streaming mode"); + goto cleanup; + } + + /* Read Stream binary file */ + for (chunkIndex = 0U; chunkIndex < numFileChunks; ++chunkIndex) + { + if (ADI_LIBRARY_FREAD(&streamBinaryImageBuffer[0U], BIN_ELEMENT_SIZE, ADI_ADRV904X_STREAM_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES, streamBinaryFilePtr) < ADI_ADRV904X_STREAM_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numFileChunks, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + } + + /* Write Stream binary */ + recoveryAction = adi_adrv904x_StreamImageWrite( device, + (chunkIndex * ADI_ADRV904X_STREAM_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES), + &streamBinaryImageBuffer[0U], + ADI_ADRV904X_STREAM_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue During Binary Loading (e.g. SPI Issue)"); + goto cleanup; + } + } + + +cleanup : + if (streamBinaryFilePtr != NULL) + { + /* Close Stream binary file */ + if (0 != ADI_LIBRARY_FCLOSE(streamBinaryFilePtr)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot Close Stream Image File"); + } + } + + if (device->devStateInfo.spiStreamingOn == ADI_TRUE) + { + if (ADI_ADRV904X_ERR_ACT_NONE != adrv904x_SpiStreamingExit(device)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_INTERFACE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Spi Streaming Exit Issue"); + } + } + + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxGainTableLoad(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxGainTableInfo_t rxGainTableInfo[], + const uint32_t rxGainTableArrSize) +{ + const uint8_t LINE_BUFFER_SIZE = 128U; + const uint8_t HEADER_BUFFER_SIZE = 16U; + const uint8_t NUM_COLUMNS = 5U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t arrayIndex = 0U; + uint8_t minGainIndex = 0U; + uint8_t maxGainIndex = 0U; + uint8_t prevGainIndex = 0U; + uint8_t gainIndex = 0U; + uint16_t lineCount = 0U; + FILE* rxGainTableFilePtr = NULL; + char rxGainTableLineBuffer[LINE_BUFFER_SIZE]; + char headerStr1[HEADER_BUFFER_SIZE]; + char headerStr2[HEADER_BUFFER_SIZE]; + char headerStr3[HEADER_BUFFER_SIZE]; + char headerStr4[HEADER_BUFFER_SIZE]; + char headerStr5[HEADER_BUFFER_SIZE]; + adi_adrv904x_RxGainTableRow_t rxGainTableRowBuffer[ADI_ADRV904X_RX_GAIN_TABLE_SIZE_ROWS]; + adi_adrv904x_Version_t tableVersion = { 0, 0, 0, 0 }; + uint32_t checksum[4U] = { 0, 0, 0, 0 }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + if (0U == rxGainTableArrSize) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxGainTableArrSize, "Invalid Array Size"); + goto cleanup; + } + + for (arrayIndex = 0U; arrayIndex < rxGainTableArrSize; ++arrayIndex) + { + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxGainTableInfo[arrayIndex].filePath, cleanup); + + if (0U == rxGainTableInfo[arrayIndex].channelMask) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxGainTableInfo[arrayIndex].channelMask, "Invalid Rx Gain Table Channel Mask Detected"); + goto cleanup; + } + + if (ADI_LIBRARY_STRNLEN((const char*)rxGainTableInfo[arrayIndex].filePath, ADI_ADRV904X_MAX_FILE_LENGTH) == ADI_ADRV904X_MAX_FILE_LENGTH) + { + /* Path is not terminated */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxGainTableInfo[arrayIndex].filePath, "Unterminated path string"); + goto cleanup; + } + + /* Open Rx Gain Table CSV file */ +#ifdef __GNUC__ + rxGainTableFilePtr = ADI_LIBRARY_FOPEN((const char *)rxGainTableInfo[arrayIndex].filePath, "r"); +#else + if (ADI_LIBRARY_FOPEN_S(&rxGainTableFilePtr, (const char *)rxGainTableInfo[arrayIndex].filePath, "r") != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxGainTableInfo[arrayIndex].filePath, "File is already Open or Invalid CSV File/Path Detected"); + goto cleanup; + } +#endif + if (rxGainTableFilePtr == NULL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxGainTableInfo[arrayIndex].filePath, "File is already Open or Invalid CSV File/Path Detected"); + goto cleanup; + } + + + + /* Check for empty Rx Gain Table */ + if (fgets(rxGainTableLineBuffer, sizeof(rxGainTableLineBuffer), rxGainTableFilePtr) != NULL) + { + + /* Parse the first line of the Rx Gain Table file which contains the version info */ +#ifdef __GNUC__ + if (sscanf(rxGainTableLineBuffer, + "%[^,],%u,%u,%u,%u", + headerStr1, + (uint32_t*)&tableVersion.majorVer, + (uint32_t*)&tableVersion.minorVer, + (uint32_t*)&tableVersion.maintenanceVer, + (uint32_t*)&tableVersion.buildVer) != NUM_COLUMNS) +#else + if (sscanf_s(rxGainTableLineBuffer, + "%[^,],%d,%d,%d,%d", + headerStr1, + (uint32_t)sizeof(headerStr1), + &version.majorVer, + &version.minorVer, + &version.maintenanceVer, + &version.buildVer) != NUM_COLUMNS) +#endif + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxGainTableInfo[arrayIndex].filePath, "Invalid Rx Gain Table Format Detected"); + goto cleanup; + } + + /* Verify that Gain Table Version Format is correct */ + if (ADI_LIBRARY_STRSTR(headerStr1, "Version") == NULL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, headerStr1, "Version Column Expected First"); + goto cleanup; + } + + +#if ADI_ADRV904X_API_VERSION_RANGE_CHECK > 0 + { + adi_adrv904x_Version_t currentVersion = { 0U, 0U, 0U, 0U }; + + recoveryAction = adi_adrv904x_ApiVersionGet(device, ¤tVersion); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxGainTable Version Get Issue"); + goto cleanup; + } + + recoveryAction = adrv904x_ApiVersionRangeCheck(device, &tableVersion, ¤tVersion, ¤tVersion); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RxGainTable Version Check Issue"); + goto cleanup; + } + } +#endif + + if (fgets(rxGainTableLineBuffer, sizeof(rxGainTableLineBuffer), rxGainTableFilePtr) == NULL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxGainTableFilePtr, "Empty Rx Gain Table Detected"); + goto cleanup; + } + + /* Parse the second line of the Rx Gain Table file which contains the checksum info */ +#ifdef __GNUC__ + if (sscanf(rxGainTableLineBuffer, + "%[^,],%u,%u,%u,%u", + headerStr1, + (uint32_t*)&checksum[0], + (uint32_t*)&checksum[1], + (uint32_t*)&checksum[2], + (uint32_t*)&checksum[3]) != NUM_COLUMNS) +#else + if (sscanf_s(rxGainTableLineBuffer, + "%[^,],%d,%d,%d,%d", + headerStr1, + (uint32_t)sizeof(headerStr1), + &checksum[0], + &checksum[1], + &checksum[2], + &checksum[3]) != NUM_COLUMNS) +#endif + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxGainTableInfo[arrayIndex].filePath, "Invalid Rx Gain Table Format Detected"); + goto cleanup; + } + + /* Verify that Gain Table Version Format is correct */ + if (ADI_LIBRARY_STRSTR(headerStr1, "Checksum") == NULL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, headerStr1, "Checksum Column Expected First"); + goto cleanup; + } + + if (fgets(rxGainTableLineBuffer, sizeof(rxGainTableLineBuffer), rxGainTableFilePtr) == NULL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxGainTableFilePtr, "Empty Rx Gain Table Detected"); + goto cleanup; + } + + /* Parse the third line of the Rx Gain Table file which contains header strings for each column in the table */ +#ifdef __GNUC__ + if (sscanf( rxGainTableLineBuffer, + "%[^,],%[^,],%[^,],%[^,],%[^\n]", + headerStr1, + headerStr2, + headerStr3, + headerStr4, + headerStr5) != NUM_COLUMNS) +#else + if (sscanf_s( rxGainTableLineBuffer, + "%[^,],%[^,],%[^,],%[^,],%[^\n]", + headerStr1, + (uint32_t)sizeof(headerStr1), + headerStr2, + (uint32_t)sizeof(headerStr2), + headerStr3, + (uint32_t)sizeof(headerStr3), + headerStr4, + (uint32_t)sizeof(headerStr4), + headerStr5, + (uint32_t)sizeof(headerStr5)) != NUM_COLUMNS) +#endif + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxGainTableInfo[arrayIndex].filePath, "Invalid Rx Gain Table Format Detected"); + goto cleanup; + } + + /* Verify that Gain Table Format is correct */ + if (ADI_LIBRARY_STRSTR(headerStr1, "Gain Index") == NULL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, headerStr1, "Gain Index Column Expected First"); + goto cleanup; + } + + if (ADI_LIBRARY_STRSTR(headerStr2, "FE Control Word") == NULL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, headerStr2, "FE Control Column Expected Second"); + goto cleanup; + } + + if (ADI_LIBRARY_STRSTR(headerStr3, "Ext Control") == NULL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, headerStr3, "Ext Control Column Expected Third"); + goto cleanup; + } + + if (ADI_LIBRARY_STRSTR(headerStr4, "Phase Offset") == NULL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, headerStr4, "Phase Offset Column Expected Fourth"); + goto cleanup; + } + + if (ADI_LIBRARY_STRSTR(headerStr5, "Digital Gain") == NULL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, headerStr5, "Digital Gain Column Expected Fifth"); + goto cleanup; + } + + /* Put the part into streaming mode to help facilitate the large, contiguous SPI writes in CpuImageWrite */ + recoveryAction = adrv904x_SpiStreamingEntry(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue with entering Spi Streaming mode"); + goto cleanup; + } + + /* Loop until the gain table end is reached or no. of lines scanned exceeds maximum */ + while ((fgets(rxGainTableLineBuffer, sizeof(rxGainTableLineBuffer), rxGainTableFilePtr) != NULL) && + (lineCount < ADI_ADRV904X_RX_GAIN_TABLE_SIZE_ROWS)) + { +#ifdef __GNUC__ + if (sscanf(rxGainTableLineBuffer, + "%hhu,%hhu,%hhu,%hu,%hd", + &gainIndex, + &rxGainTableRowBuffer[lineCount].rxFeGain, + &rxGainTableRowBuffer[lineCount].extControl, + &rxGainTableRowBuffer[lineCount].phaseOffset, + &rxGainTableRowBuffer[lineCount].digGain) != NUM_COLUMNS) +#else + if (sscanf_s(rxGainTableLineBuffer, + "%hhu,%hhu,%hhu,%hu,%hd", + &gainIndex, + &rxGainTableRowBuffer[lineCount].rxFeGain, + &rxGainTableRowBuffer[lineCount].extControl, + &rxGainTableRowBuffer[lineCount].phaseOffset, + &rxGainTableRowBuffer[lineCount].digGain) != NUM_COLUMNS) +#endif + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, gainIndex, "Insufficient entries in Rx gain table row entry"); + goto cleanup; + } + + if (lineCount == 0U) + { + minGainIndex = gainIndex; + } + else + { + /* Check that gain indices are arranged in ascending order */ + if (prevGainIndex != (gainIndex - 1U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, gainIndex, "Gain Indices not in Ascending Order"); + goto cleanup; + } + } + + prevGainIndex = gainIndex; + lineCount++; + } + + maxGainIndex = gainIndex; + + recoveryAction = adi_adrv904x_RxGainTableWrite( device, + (rxGainTableInfo[arrayIndex].channelMask & device->devStateInfo.initializedChannels), + maxGainIndex, + &rxGainTableRowBuffer[0U], + lineCount); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue with RX Gain Table Writing"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_RxMinMaxGainIndexSet( device, + (rxGainTableInfo[arrayIndex].channelMask & device->devStateInfo.initializedChannels), + minGainIndex, + maxGainIndex); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue with Setting Min/Max Gain Index"); + goto cleanup; + } + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxGainTableFilePtr, "Empty Rx Gain Table Detected"); + goto cleanup; + } + + /* Close Rx Gain Table csv file, (part of for loop) */ + if (0 == ADI_LIBRARY_FCLOSE(rxGainTableFilePtr)) + { + rxGainTableFilePtr = NULL; + } + else + { + rxGainTableFilePtr = NULL; + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot Close CSV File"); + goto cleanup; + } + } + +cleanup : + if (rxGainTableFilePtr != NULL) + { + /* Close Rx Gain Table csv file */ + if (0 != ADI_LIBRARY_FCLOSE(rxGainTableFilePtr)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot Close CSV File"); + } + } + + if (device->devStateInfo.spiStreamingOn == ADI_TRUE) + { + if (ADI_ADRV904X_ERR_ACT_NONE != adrv904x_SpiStreamingExit(device)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_INTERFACE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Spi Streaming Exit Issue"); + } + } + + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuProfileImageLoad(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuProfileBinaryInfo_t* const cpuProfileBinaryInfoPtr) +{ + const size_t BIN_ELEMENT_SIZE = 1U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + FILE* cpuProfileFilePtr = NULL; + uint32_t totalFileSize = 0U; + uint32_t numFileChunks = 0U; + uint32_t chunkIndex = 0U; + uint32_t byteCount = 0U; + uint8_t cpuProfileBinaryImageBuffer[ADI_ADRV904X_CPU_PROFILE_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES]; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuProfileBinaryInfoPtr, cleanup); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuProfileBinaryInfoPtr->filePath, cleanup); + + if (ADI_LIBRARY_STRNLEN((const char*)cpuProfileBinaryInfoPtr->filePath, ADI_ADRV904X_MAX_FILE_LENGTH) == ADI_ADRV904X_MAX_FILE_LENGTH) + { + /* Path is not terminated */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileBinaryInfoPtr->filePath, "Unterminated path string"); + goto cleanup; + } + + /* Open ARM binary file */ +#ifdef __GNUC__ + cpuProfileFilePtr = ADI_LIBRARY_FOPEN((const char *)cpuProfileBinaryInfoPtr->filePath, "rb"); +#else + if (ADI_LIBRARY_FOPEN_S(&cpuProfileFilePtr, (const char *)cpuProfileBinaryInfoPtr->filePath, "rb") != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileBinaryInfoPtr->filePath, "Unable to open CPU Profile Binary. Please check filepath is correct"); + goto cleanup; + } +#endif + + if (NULL == cpuProfileFilePtr) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to open CPU Profile Binary. Please check filepath is correct") + goto cleanup; + } + + /* Determine file size */ + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, 0U, SEEK_END) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Seek to EOF Failed"); + goto cleanup; + } + + /* ADI_LIBRARY_FTELL returns long type */ + totalFileSize = (uint32_t) ADI_LIBRARY_FTELL(cpuProfileFilePtr); + + /* Check that FW binary file is not empty */ + if (0U == totalFileSize) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, totalFileSize, "Zero Length CPU Profile Binary Detected"); + goto cleanup; + } + + /* Check that FW Profile binary file size is not smaller than server size */ + if (totalFileSize < ADRV904X_DEVICE_PROFILE_SIZE_BYTES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, totalFileSize, "CPU Profile Binary Size smaller than Server ADRV904X_DEVICE_PROFILE_SIZE_BYTES"); + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, ADRV904X_DEVICE_PROFILE_SIZE_BYTES, "ADRV904X_DEVICE_PROFILE_SIZE_BYTES bigger than CPU Profile Binary Size"); + goto cleanup; + } + + /*check if the CPU Profile Binary Image Size is perfectly divisible by the chunk size*/ + if ((ADRV904X_DEVICE_PROFILE_SIZE_BYTES & 0x3U) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Incorrect CPU Profile Binary Structure Size"); + goto cleanup; + } + + /* Calculate the number of chunks to be written for radio profile */ + numFileChunks = (uint32_t)(ADRV904X_DEVICE_PROFILE_SIZE_BYTES / ADI_ADRV904X_CPU_PROFILE_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES) + 1; + + /* Rewind the file pointer to beginning of the file */ + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, 0U, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary"); + goto cleanup; + } + + /* Put the part into streaming mode to help facilitate the large, contiguous SPI writes in CpuImageWrite */ + recoveryAction = adrv904x_SpiStreamingEntry(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue with entering Spi Streaming mode"); + goto cleanup; + } + + /* Read ARM binary file */ + for (chunkIndex = 0U; chunkIndex < numFileChunks; ++chunkIndex) + { + if ((byteCount = ADI_LIBRARY_FREAD(&cpuProfileBinaryImageBuffer[0U], BIN_ELEMENT_SIZE, ADI_ADRV904X_CPU_PROFILE_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES, cpuProfileFilePtr)) > 0) + { + /* In case the bin file has also the Init_t and PostMcsInit_t, keep the last chunkSize only the part belonging to profile */ + if (chunkIndex == (numFileChunks - 1U)) + { + byteCount = ADRV904X_DEVICE_PROFILE_SIZE_BYTES - (chunkIndex) * ADI_ADRV904X_CPU_PROFILE_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES; + } + + /* Write the CPU Profile binary chunk */ + recoveryAction = adi_adrv904x_CpuProfileWrite( device, + (chunkIndex * ADI_ADRV904X_CPU_PROFILE_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES), + &cpuProfileBinaryImageBuffer[0U], + byteCount); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during CPU Profile Write"); + goto cleanup; + } + } + else if (ferror(cpuProfileFilePtr)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numFileChunks, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + } + } + +cleanup: + if (cpuProfileFilePtr != NULL) + { + /* Close CPU Profile binary file */ + if (0 != ADI_LIBRARY_FCLOSE(cpuProfileFilePtr)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot Close CPU Profile Binary File"); + } + } + + if (device->devStateInfo.spiStreamingOn == ADI_TRUE) + { + if (ADI_ADRV904X_ERR_ACT_NONE != adrv904x_SpiStreamingExit(device)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_INTERFACE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Spi Streaming Exit Issue"); + } + } + + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeviceInfoExtract(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuProfileBinaryInfo_t* const cpuProfileBinaryInfoPtr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + FILE* cpuProfileFilePtr = NULL; + uint32_t fileSize = 0U; + adrv904x_DeviceProfile_t* const deviceProfile = NULL; + uint32_t offset = 0U; + uint32_t readSize = 0U; + uint32_t idx = 0U; + uint32_t bandIdx = 0U; + uint32_t targetIdx = 0U; + uint32_t digMask = 0U; + adi_adrv904x_InitExtract_t InitExtractClear; + adrv904x_TxConfig_t txConfig; + adrv904x_RxConfig_t rxConfig; + adrv904x_OrxConfig_t orxConfig; + adrv904x_JesdSettings_t jesdProfile; + + uint32_t carrierIdx = 0U; + uint32_t minCarriersKhz = UINT32_MAX; + uint32_t minIfaceKhz = ADRV904X_JESD_IQ_RATE_KHZ; + adrv904x_DfeRadioSequencerConfig_t radioSeqProfile; /*!< Radio Sequencer configuration */ + adrv904x_CarrierDdcConfig_t carrierDdcConfig; + adrv904x_CarrierDucConfig_t carrierDucConfig; + adrv904x_DfeJesdSettings_t dfeJesdProfile; + adrv904x_TxDfeDpdConfig_t dpdConfig; + uint32_t txConfigOffset = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuProfileBinaryInfoPtr, cleanup); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuProfileBinaryInfoPtr->filePath, cleanup); + + ADI_LIBRARY_MEMSET(&InitExtractClear, 0, sizeof(InitExtractClear)); + ADI_LIBRARY_MEMSET(&txConfig, 0, sizeof(txConfig)); + ADI_LIBRARY_MEMSET(&rxConfig, 0, sizeof(rxConfig)); + ADI_LIBRARY_MEMSET(&orxConfig, 0, sizeof(orxConfig)); + ADI_LIBRARY_MEMSET(&jesdProfile, 0, sizeof(jesdProfile)); + + ADI_LIBRARY_MEMSET(&radioSeqProfile, 0, sizeof(radioSeqProfile)); + ADI_LIBRARY_MEMSET(&carrierDdcConfig, 0, sizeof(carrierDdcConfig)); + ADI_LIBRARY_MEMSET(&carrierDucConfig, 0, sizeof(carrierDucConfig)); + ADI_LIBRARY_MEMSET(&dfeJesdProfile, 0, sizeof(dfeJesdProfile)); + ADI_LIBRARY_MEMSET(&dpdConfig, 0, sizeof(dpdConfig)); + + if (ADI_LIBRARY_STRNLEN((const char*)cpuProfileBinaryInfoPtr->filePath, ADI_ADRV904X_MAX_FILE_LENGTH) == ADI_ADRV904X_MAX_FILE_LENGTH) + { + /* Path is not terminated */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileBinaryInfoPtr->filePath, "Unterminated path string"); + goto cleanup; + } + + /* Open ARM binary file */ +#ifdef __GNUC__ + cpuProfileFilePtr = ADI_LIBRARY_FOPEN((const char *)cpuProfileBinaryInfoPtr->filePath, "rb"); +#else + if (ADI_LIBRARY_FOPEN_S(&cpuProfileFilePtr, (const char *)cpuProfileBinaryInfoPtr->filePath, "rb") != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileBinaryInfoPtr->filePath, "Unable to open CPU Profile Binary. Please check filepath is correct"); + goto cleanup; + } +#endif + + if (NULL == cpuProfileFilePtr) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to open CPU Profile Binary. Please check filepath is correct") + goto cleanup; + } + + /* Determine file size */ + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, 0U, SEEK_END) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Seek to EOF Failed"); + goto cleanup; + } + + /* ADI_LIBRARY_FTELL returns long type */ + fileSize = (uint32_t) ADI_LIBRARY_FTELL(cpuProfileFilePtr); + + /* Check that FW binary file is not empty */ + if (0U == fileSize) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, fileSize, "Zero Length CPU Profile Binary Detected"); + goto cleanup; + } + + /* Check that FW Profile binary file size is not smaller than server size */ + if (fileSize < ADRV904X_DEVICE_PROFILE_SIZE_BYTES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, fileSize, "CPU Profile Binary Size smaller than Server ADRV904X_DEVICE_PROFILE_SIZE_BYTES"); + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, ADRV904X_DEVICE_PROFILE_SIZE_BYTES, "ADRV904X_DEVICE_PROFILE_SIZE_BYTES bigger than CPU Profile Binary Size"); + goto cleanup; + } + + /* Clear all variables */ + device->initExtract = InitExtractClear; + + /* Read scaled device clock frequency */ + offset = ADI_LIBRARY_OFFSETOF(adrv904x_RadioProfile_t, deviceClkScaledFreq_kHz); + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, offset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary"); + goto cleanup; + } + + if ((adrv904x_VariableFromFileExtract(device, &device->initExtract.clocks.deviceClockScaled_kHz, sizeof(deviceProfile->radioProfile.deviceClkScaledFreq_kHz), 1, cpuProfileFilePtr)) <= 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + } + + /* Read Pad Divider */ + offset = ADI_LIBRARY_OFFSETOF(adrv904x_RadioProfile_t, padDiv); + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, offset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary"); + goto cleanup; + } + + if ((adrv904x_VariableFromFileExtract(device, &device->initExtract.clocks.padDivideRatio, sizeof(deviceProfile->radioProfile.padDiv), 1, cpuProfileFilePtr)) <= 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + } + + /* Read armClkDiv */ + offset = ADI_LIBRARY_OFFSETOF(adrv904x_RadioProfile_t, armClkDiv); + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, offset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary"); + goto cleanup; + } + + if ((adrv904x_VariableFromFileExtract(device, &device->initExtract.clocks.armClkDivideRatio, sizeof(deviceProfile->radioProfile.armClkDiv), 1, cpuProfileFilePtr)) <= 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + } + + /* Read DevClk armClkDiv */ + offset = ADI_LIBRARY_OFFSETOF(adrv904x_RadioProfile_t, armClkDivDevClk); + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, offset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary"); + goto cleanup; + } + + if ((adrv904x_VariableFromFileExtract(device, &device->initExtract.clocks.armClkDevClkDivRatio, sizeof(deviceProfile->radioProfile.armClkDivDevClk), 1, cpuProfileFilePtr)) <= 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + } + + /* Read chanConfig */ + offset = ADI_LIBRARY_OFFSETOF(adrv904x_RadioProfile_t, chanConfig); + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, offset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary"); + goto cleanup; + } + + if ((adrv904x_VariableFromFileExtract(device, &device->initExtract.rx.rxInitChannelMask, sizeof(deviceProfile->radioProfile.chanConfig), 1, cpuProfileFilePtr)) <= 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + } + + device->initExtract.tx.txInitChannelMask = device->initExtract.rx.rxInitChannelMask & ADI_ADRV904X_TXALL; + device->initExtract.rx.rxInitChannelMask = (device->initExtract.rx.rxInitChannelMask >> 8) & (ADI_ADRV904X_RX_MASK_ALL | ADI_ADRV904X_ORX_MASK_ALL); + + /* Read rxTxCpuConfig */ + offset = ADI_LIBRARY_OFFSETOF(adrv904x_RadioProfile_t, rxTxCpuConfig); + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, offset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary"); + goto cleanup; + } + + if ((adrv904x_VariableFromFileExtract(device, &device->initExtract.rxTxCpuConfig[0], sizeof(deviceProfile->radioProfile.rxTxCpuConfig), 1, cpuProfileFilePtr)) <= 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + } + + /* Read orxCpuConfig */ + offset = ADI_LIBRARY_OFFSETOF(adrv904x_RadioProfile_t, orxCpuConfig); + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, offset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary"); + goto cleanup; + } + + if ((adrv904x_VariableFromFileExtract(device, &device->initExtract.orxCpuConfig[0], sizeof(deviceProfile->radioProfile.orxCpuConfig), 1, cpuProfileFilePtr)) <= 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + } + + /* Read chanAssign */ + offset = ADI_LIBRARY_OFFSETOF(adrv904x_RadioProfile_t, chanAssign); + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, offset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary"); + goto cleanup; + } + + if ((adrv904x_VariableFromFileExtract(device, &device->initExtract.chanAssign[0], sizeof(deviceProfile->radioProfile.chanAssign), 1, cpuProfileFilePtr)) <= 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + } + + /* Read hsDigClk_kHz */ + offset = ADI_LIBRARY_OFFSETOF(adrv904x_RadioProfile_t, hsDigFreq_kHz); + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, offset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary"); + goto cleanup; + } + + if ((ADI_LIBRARY_FREAD(&device->initExtract.clocks.hsDigClk_kHz, sizeof(deviceProfile->radioProfile.hsDigFreq_kHz), 1, cpuProfileFilePtr)) <= 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + } + + /* Read feature mask */ + offset = ADI_LIBRARY_OFFSETOF(adrv904x_RadioProfile_t, featureMask); + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, offset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary"); + goto cleanup; + } + + if ((ADI_LIBRARY_FREAD(&device->initExtract.featureMask[0], sizeof(deviceProfile->radioProfile.featureMask), 1, cpuProfileFilePtr)) <= 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + } + + /* Read JESD Profile */ + offset = ADI_LIBRARY_OFFSETOF(adrv904x_RadioProfile_t, jesdProfile); + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, offset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary"); + goto cleanup; + } + + if ((ADI_LIBRARY_FREAD(&jesdProfile, sizeof(deviceProfile->radioProfile.jesdProfile), 1, cpuProfileFilePtr)) <= 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + } + + VARIABLE_ASSIGNMENT(device->initExtract.jesdSetting.rxdesQhfrate, jesdProfile.rxdesQhfrate); + + for (idx = 0U; idx < ADI_ADRV904X_MAX_FRAMERS; idx++) + { + VARIABLE_ASSIGNMENT(device->initExtract.jesdSetting.framerSetting[idx].iqRate_kHz, jesdProfile.framer[idx].iqRate_kHz) ; + VARIABLE_ASSIGNMENT(device->initExtract.jesdSetting.framerSetting[idx].laneRate_kHz, jesdProfile.framer[idx].laneRate_kHz) ; + VARIABLE_ASSIGNMENT(device->initExtract.jesdSetting.framerSetting[idx].jesdM, jesdProfile.framer[idx].M) ; + VARIABLE_ASSIGNMENT(device->initExtract.jesdSetting.framerSetting[idx].jesdNp, jesdProfile.framer[idx].Np) ; + VARIABLE_ASSIGNMENT(device->initExtract.jesdSetting.framerSetting[idx].serialLaneEnabled, jesdProfile.framer[idx].serializerLanesEnabled) ; + } + + for (idx = 0U; idx < ADI_ADRV904X_MAX_DEFRAMERS; idx++) + { + VARIABLE_ASSIGNMENT(device->initExtract.jesdSetting.deframerSetting[idx].iqRate_kHz, jesdProfile.deframer[idx].iqRate_kHz) ; + VARIABLE_ASSIGNMENT(device->initExtract.jesdSetting.deframerSetting[idx].laneRate_kHz, jesdProfile.deframer[idx].laneRate_kHz) ; + VARIABLE_ASSIGNMENT(device->initExtract.jesdSetting.deframerSetting[idx].deserialLaneEnabled, jesdProfile.deframer[idx].deserializerLanesEnabled) ; + VARIABLE_ASSIGNMENT(device->initExtract.jesdSetting.deframerSetting[idx].jesdM, jesdProfile.deframer[idx].M); + VARIABLE_ASSIGNMENT(device->initExtract.jesdSetting.deframerSetting[idx].jesdNp, jesdProfile.deframer[idx].Np); + } + + for (idx = 0U; idx < ADI_ADRV904X_MAX_FRAMERS_LS; idx++) + { + if (jesdProfile.linkSharingCfg[idx].linkSharingEnabled == ADI_ENABLE) + { + VARIABLE_ASSIGNMENT(device->initExtract.jesdSetting.framerLsSetting[idx].jesdM, jesdProfile.linkSharingCfg[idx].M) ; + VARIABLE_ASSIGNMENT(device->initExtract.jesdSetting.framerLsSetting[idx].jesdNp, jesdProfile.linkSharingCfg[idx].Np) ; + } + else + { + device->initExtract.jesdSetting.framerLsSetting[idx].jesdM = 0; + device->initExtract.jesdSetting.framerLsSetting[idx].jesdNp = 0; + } + } + + for (idx = 0U; idx < ADRV904X_JESD_MAX_LKSH_SAMPLE_XBAR_IDX; idx++) + { + VARIABLE_ASSIGNMENT(device->initExtract.jesdSetting.framerLsSetting[0].linkLsSampleXBar[idx], jesdProfile.linkSharingCfg[0].sampleXBar[idx]) ; + VARIABLE_ASSIGNMENT(device->initExtract.jesdSetting.framerLsSetting[1].linkLsSampleXBar[idx], jesdProfile.linkSharingCfg[1].sampleXBar[idx]) ; + } + + /* Read CPU ID that maps a deserializer lane to CPU0/1 for SERDES cals */ + for (idx = 0U; idx < ADI_ADRV904X_MAX_SERDES_LANES; idx++) + { + VARIABLE_ASSIGNMENT(device->initExtract.jesd204DesLaneCpuConfig[idx], jesdProfile.deserializerLane[idx].cpuId) ; + } + + for (idx = 0U; idx < ADRV904X_NUM_TXRX_CHAN; idx++) + { + + readSize = sizeof(rxConfig); + switch (device->initExtract.chanAssign[idx]) + { + case 0U: + /* Read rxConfig[0]*/ + offset = ADI_LIBRARY_OFFSETOF(adrv904x_RadioProfile_t, rxConfig[0U]); + break; + + case 1U: + /* Read rxConfig[1]*/ + offset = ADI_LIBRARY_OFFSETOF(adrv904x_RadioProfile_t, rxConfig[1U]); + break; + case 2U: + /* Read rxConfig[2]*/ + offset = ADI_LIBRARY_OFFSETOF(adrv904x_RadioProfile_t, rxConfig[2U]); + break; + case 3U: + /* Read rxConfig[3]*/ + offset = ADI_LIBRARY_OFFSETOF(adrv904x_RadioProfile_t, rxConfig[3U]); + break; + case 255U: + /* Channel disabled */ + offset = 0; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + break; + } + + + if (offset == 0U) + { /* channel disabled */ + device->initExtract.rx.rxChannelCfg[idx].rfBandwidth_kHz = 0U; + device->initExtract.rx.rxChannelCfg[idx].rxDdc0OutputRate_kHz = 0U; + device->initExtract.rx.rxChannelCfg[idx].rxDdc1OutputRate_kHz = 0U; + device->initExtract.rx.rxChannelCfg[idx].digChanMask = 0U; + device->initExtract.rx.rxChannelCfg[idx].rxAdcSampleRate_kHz = 0U; + } + else + { + uint32_t totalDecimationDDC1 = 0U; + uint32_t totalDecimationDDC0 = 0U; + uint32_t rxOutputRate_kHz = 0U; + uint8_t rxBandEnbDDC0 = 0U; + uint8_t rxBandEnbDDC1 = 0U; + + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, offset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary"); + goto cleanup; + } + + if ((ADI_LIBRARY_FREAD(&rxConfig, readSize, 1, cpuProfileFilePtr)) <= 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + } + + VARIABLE_ASSIGNMENT(totalDecimationDDC1, rxConfig.rxddc[1].totalDecimation); + VARIABLE_ASSIGNMENT(totalDecimationDDC0, rxConfig.rxddc[0].totalDecimation); + VARIABLE_ASSIGNMENT(rxOutputRate_kHz, rxConfig.rxOutputRate_kHz); + VARIABLE_ASSIGNMENT(rxBandEnbDDC0, rxConfig.rxddc[0].rxBandEnb); + VARIABLE_ASSIGNMENT(rxBandEnbDDC1, rxConfig.rxddc[1].rxBandEnb); + + if (rxConfig.rxddc[1].rxBandEnb == 0U) + { + VARIABLE_ASSIGNMENT(device->initExtract.rx.rxChannelCfg[idx].rxDdc0OutputRate_kHz, rxConfig.rxOutputRate_kHz) ; + device->initExtract.rx.rxChannelCfg[idx].rxDdc1OutputRate_kHz = 0U; + + } + else if (totalDecimationDDC1 > totalDecimationDDC0) + { + //Band 0 has lower totalDecimation + device->initExtract.rx.rxChannelCfg[idx].rxDdc0OutputRate_kHz = rxOutputRate_kHz; + device->initExtract.rx.rxChannelCfg[idx].rxDdc1OutputRate_kHz = (rxOutputRate_kHz * totalDecimationDDC0) / totalDecimationDDC1 ; + } + else + { + //Band 1 has lower totalDecimation + device->initExtract.rx.rxChannelCfg[idx].rxDdc0OutputRate_kHz = (rxOutputRate_kHz * totalDecimationDDC1) / totalDecimationDDC0; + device->initExtract.rx.rxChannelCfg[idx].rxDdc1OutputRate_kHz = rxOutputRate_kHz; + } + + for (bandIdx = 0U; bandIdx < ADI_ADRV904X_DDC_NUM_BAND; bandIdx++) + { + if (rxConfig.rxddc[bandIdx].rxBandEnb == 1U) + { + uint32_t ncoFreqin_kHz = 0U; + uint32_t ibwCenterFreq_kHz = 0U; + uint32_t rfCenterFreq_kHz = 0U; + VARIABLE_ASSIGNMENT(ncoFreqin_kHz, rxConfig.rxddc[bandIdx].ncoFreqin_kHz); + VARIABLE_ASSIGNMENT(ibwCenterFreq_kHz, rxConfig.ibwCenterFreq_kHz); + VARIABLE_ASSIGNMENT(rfCenterFreq_kHz, rxConfig.rxddc[bandIdx].rfCenterFreq_kHz); + + device->initExtract.rx.rxChannelCfg[idx].bandSettings[bandIdx].enabled = ADI_TRUE; + VARIABLE_ASSIGNMENT(device->initExtract.rx.rxChannelCfg[idx].bandSettings[bandIdx].instBw_kHz, rxConfig.rxddc[bandIdx].instBw_kHz); + VARIABLE_ASSIGNMENT(device->initExtract.rx.rxChannelCfg[idx].bandSettings[bandIdx].rfCenterFreq_kHz, rxConfig.rxddc[bandIdx].rfCenterFreq_kHz); + device->initExtract.rx.rxChannelCfg[idx].bandSettings[bandIdx].sampleRate_kHz = device->initExtract.clocks.hsDigClk_kHz / (1U << rxConfig.rxddc[bandIdx].hb1OutputClkDiv); + device->initExtract.rx.rxChannelCfg[idx].bandSettings[bandIdx].bandOffset_kHz = ncoFreqin_kHz - (ibwCenterFreq_kHz - rfCenterFreq_kHz); + } + else + { + device->initExtract.rx.rxChannelCfg[idx].bandSettings[bandIdx].enabled = ADI_FALSE; + device->initExtract.rx.rxChannelCfg[idx].bandSettings[bandIdx].instBw_kHz = 0U; + device->initExtract.rx.rxChannelCfg[idx].bandSettings[bandIdx].rfCenterFreq_kHz = 0U; + device->initExtract.rx.rxChannelCfg[idx].bandSettings[bandIdx].sampleRate_kHz = 0U; + device->initExtract.rx.rxChannelCfg[idx].bandSettings[bandIdx].bandOffset_kHz = 0U; + } + } + + VARIABLE_ASSIGNMENT(device->initExtract.rx.rxChannelCfg[idx].rfBandwidth_kHz, rxConfig.ibw_kHz) ; + VARIABLE_ASSIGNMENT(device->initExtract.rx.rxChannelCfg[idx].rxAdcSampleRate_kHz, rxConfig.adcClockRate_kHz) ; + digMask = rxBandEnbDDC1; + digMask <<= 1; + digMask |= rxBandEnbDDC0; + device->initExtract.rx.rxChannelCfg[idx].digChanMask = digMask; + } + } + + for (idx = 0U; idx < ADI_ADRV904X_MAX_ORX; idx++) + { + readSize = sizeof(orxConfig); + switch (idx) + { + case 0U: + offset = ADI_LIBRARY_OFFSETOF(adrv904x_RadioProfile_t, orxConfig[0U]); + break; + case 1U: + offset = ADI_LIBRARY_OFFSETOF(adrv904x_RadioProfile_t, orxConfig[1U]); + break; +#if ADI_ADRV904X_MAX_ORX > 2 + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; +#endif + } + + targetIdx = idx; + + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, offset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary"); + goto cleanup; + } + + if ((ADI_LIBRARY_FREAD(&orxConfig, readSize, 1, cpuProfileFilePtr)) <= 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + } + + VARIABLE_ASSIGNMENT(device->initExtract.orx.orxChannelCfg[targetIdx].rfBandwidth_kHz, orxConfig.sbw_kHz) ; + VARIABLE_ASSIGNMENT(device->initExtract.orx.orxChannelCfg[targetIdx].orxOutputRate_kHz, orxConfig.orxOutputRate_kHz) ; + VARIABLE_ASSIGNMENT(device->initExtract.orx.orxChannelCfg[targetIdx].orxAdcSampleRate_kHz, orxConfig.adcClockRate_kHz) ; + } + + for (idx = 0U; idx < ADRV904X_NUM_TXRX_CHAN; idx++) + { + + readSize = sizeof(txConfig); + switch (device->initExtract.chanAssign[idx]) + { + case 0U: + /* Read txConfig[0] */ + offset = ADI_LIBRARY_OFFSETOF(adrv904x_RadioProfile_t, txConfig[0U]); + break; + + case 1U: + /* Read txConfig[1] */ + offset = ADI_LIBRARY_OFFSETOF(adrv904x_RadioProfile_t, txConfig[1U]); + break; + case 2U: + /* Read txConfig[2] */ + offset = ADI_LIBRARY_OFFSETOF(adrv904x_RadioProfile_t, txConfig[2U]); + break; + case 3U: + /* Read txConfig[3] */ + offset = ADI_LIBRARY_OFFSETOF(adrv904x_RadioProfile_t, txConfig[3U]); + break; + case 255U: + /* Channel disabled */ + offset = 0U; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + break; + } + + if (offset == 0U) + { /* channel disabled */ + device->initExtract.tx.txChannelCfg[idx].rfBandwidth_kHz = 0U; + device->initExtract.tx.txChannelCfg[idx].totalDecimation = 0U; + device->initExtract.tx.txChannelCfg[idx].digChanMask = 0U; + device->initExtract.tx.txChannelCfg[idx].txLbAdcSampleRate_kHz = 0U; + } + else + { + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, offset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary"); + goto cleanup; + } + + if ((ADI_LIBRARY_FREAD(&txConfig, readSize, 1, cpuProfileFilePtr)) <= 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + } + + VARIABLE_ASSIGNMENT(device->initExtract.tx.txChannelCfg[idx].rfBandwidth_kHz, txConfig.ibw_kHz) ; + VARIABLE_ASSIGNMENT(device->initExtract.tx.txChannelCfg[idx].totalDecimation, txConfig.txduc[0].totalDecimation); + VARIABLE_ASSIGNMENT(device->initExtract.tx.txChannelCfg[idx].digChanMask, txConfig.txduc[0].rxBandEnb); + VARIABLE_ASSIGNMENT(device->initExtract.tx.txChannelCfg[idx].txLbAdcSampleRate_kHz, txConfig.lpbkAdcClkRate_kHz); + + for (bandIdx = 0U; bandIdx < ADI_ADRV904X_DUC_NUM_BAND; bandIdx++) + { + if (txConfig.txduc[bandIdx].rxBandEnb == 1U) + { + uint8_t tinClkDiv = 0U; + uint32_t ncoFreqin_kHz = 0U; + uint32_t ibwCenterFreq_kHz = 0U; + uint32_t rfCenterFreq_kHz = 0U; + VARIABLE_ASSIGNMENT(tinClkDiv, txConfig.txduc[bandIdx].tinClkDiv); + VARIABLE_ASSIGNMENT(ncoFreqin_kHz, txConfig.txduc[bandIdx].ncoFreqin_kHz); + VARIABLE_ASSIGNMENT(ibwCenterFreq_kHz, txConfig.ibwCenterFreq_kHz); + VARIABLE_ASSIGNMENT(rfCenterFreq_kHz, txConfig.txduc[bandIdx].rfCenterFreq_kHz); + + device->initExtract.tx.txChannelCfg[idx].bandSettings[bandIdx].enabled = ADI_TRUE; + VARIABLE_ASSIGNMENT(device->initExtract.tx.txChannelCfg[idx].bandSettings[bandIdx].instBw_kHz, txConfig.txduc[bandIdx].instBw_kHz); + VARIABLE_ASSIGNMENT(device->initExtract.tx.txChannelCfg[idx].bandSettings[bandIdx].rfCenterFreq_kHz, txConfig.txduc[bandIdx].rfCenterFreq_kHz); + device->initExtract.tx.txChannelCfg[idx].bandSettings[bandIdx].sampleRate_kHz = device->initExtract.clocks.hsDigClk_kHz / (1U << tinClkDiv); + device->initExtract.tx.txChannelCfg[idx].bandSettings[bandIdx].bandOffset_kHz = ncoFreqin_kHz - (ibwCenterFreq_kHz - rfCenterFreq_kHz); + } + else + { + device->initExtract.tx.txChannelCfg[idx].bandSettings[bandIdx].enabled = ADI_FALSE; + device->initExtract.tx.txChannelCfg[idx].bandSettings[bandIdx].instBw_kHz = 0U; + device->initExtract.tx.txChannelCfg[idx].bandSettings[bandIdx].rfCenterFreq_kHz = 0U; + device->initExtract.tx.txChannelCfg[idx].bandSettings[bandIdx].sampleRate_kHz = 0U; + device->initExtract.tx.txChannelCfg[idx].bandSettings[bandIdx].bandOffset_kHz = 0U; + } + } + + + VARIABLE_ASSIGNMENT(device->initExtract.tx.txChannelCfg[idx].pfirRate_kHz, txConfig.txPfirClk_kHz) ; + + + if (device->initExtract.tx.txChannelCfg[idx].totalDecimation > 8U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + } + } + } + + /* DFE jesd settings */ + offset = ADI_LIBRARY_OFFSETOF(adrv904x_DeviceProfile_t, dfeProfile) + + ADI_LIBRARY_OFFSETOF(adrv904x_DfeProfile_t, jesdProfile); + + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, offset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary"); + goto cleanup; + } + + if ((ADI_LIBRARY_FREAD(&dfeJesdProfile, sizeof(dfeJesdProfile), 1, cpuProfileFilePtr)) <= 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + } + + + for (idx = 0U; idx < ADI_ADRV904X_MAX_FRAMERS; idx++) + { + VARIABLE_ASSIGNMENT(device->initExtract.framerInterleaveMode[idx], dfeJesdProfile.framer[idx].jesd204cInterleave); + } + + for (idx = 0U; idx < ADI_ADRV904X_MAX_DEFRAMERS; idx++) + { + VARIABLE_ASSIGNMENT(device->initExtract.deframerInterleaveMode[idx], dfeJesdProfile.deframer[idx].jesd204cInterleave); + } + + /* Read radio sequence profile */ + offset = ADI_LIBRARY_OFFSETOF(adrv904x_DeviceProfile_t, dfeProfile) + + ADI_LIBRARY_OFFSETOF(adrv904x_DfeProfile_t, radioSeqProfile); + + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, offset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary"); + goto cleanup; + } + + if ((ADI_LIBRARY_FREAD(&radioSeqProfile, sizeof(radioSeqProfile), 1, cpuProfileFilePtr)) <= 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + } + + VARIABLE_ASSIGNMENT(device->initExtract.rs.radioSeqEn, radioSeqProfile.radioSeqEn) ; + VARIABLE_ASSIGNMENT(device->initExtract.rs.sampleClkEn, radioSeqProfile.sampleClkEn) ; + VARIABLE_ASSIGNMENT(device->initExtract.rs.sampleClkDiv, radioSeqProfile.sampleClkDiv) ; + VARIABLE_ASSIGNMENT(device->initExtract.rs.ssbSyncMode, radioSeqProfile.ssbSyncMode) ; + device->initExtract.rs.ssbSyncPeriod = ADRV904X_CTOHL(radioSeqProfile.ssbSyncPeriod); + device->initExtract.rs.symWidth = ADRV904X_CTOHS(radioSeqProfile.symWidth); + device->initExtract.rs.extSymWidth = ADRV904X_CTOHS(radioSeqProfile.extSymWidth); + device->initExtract.rs.extSymSpacing = ADRV904X_CTOHS(radioSeqProfile.extSymSpacing); + + for (idx = 0U; idx < ADRV904X_NUM_TXRX_CHAN; idx++) + { + uint8_t carriersEnabled = 0U; + + switch (device->initExtract.chanAssign[idx]) + { + case 0U: + txConfigOffset = ADI_LIBRARY_OFFSETOF(adrv904x_DfeProfile_t, txConfig[0U]); + break; + case 1U: + txConfigOffset = ADI_LIBRARY_OFFSETOF(adrv904x_DfeProfile_t, txConfig[1U]); + break; + case 2U: + txConfigOffset = ADI_LIBRARY_OFFSETOF(adrv904x_DfeProfile_t, txConfig[2U]); + break; + case 3U: + txConfigOffset = ADI_LIBRARY_OFFSETOF(adrv904x_DfeProfile_t, txConfig[3U]); + break; + case 255U: + /* Channel disabled */ + txConfigOffset = 0U; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Invalid chanAssign - cduc"); + goto cleanup; + break; + } + + offset = ADI_LIBRARY_OFFSETOF(adrv904x_DeviceProfile_t, dfeProfile) + + txConfigOffset + + ADI_LIBRARY_OFFSETOF(adrv904x_DfeTxConfig_t, cduc); + + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, offset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary - carrier"); + goto cleanup; + } + + if ((ADI_LIBRARY_FREAD(&carrierDucConfig, sizeof(carrierDucConfig), 1, cpuProfileFilePtr)) <= 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File - carrier"); + goto cleanup; + } + VARIABLE_ASSIGNMENT(device->initExtract.dfeCduc.cducOutputRate_kHz[idx], carrierDucConfig.carriers[0].inputRate_kHz); + VARIABLE_ASSIGNMENT(carriersEnabled, carrierDucConfig.carriersEnabled); + + VARIABLE_ASSIGNMENT(device->initExtract.tx.txChannelCfg[idx].bandRatio[0], carrierDucConfig.bandRatio[0]); + VARIABLE_ASSIGNMENT(device->initExtract.tx.txChannelCfg[idx].bandRatio[1], carrierDucConfig.bandRatio[1]); + VARIABLE_ASSIGNMENT(device->initExtract.tx.txChannelCfg[idx].maxSlot, carrierDucConfig.maxSlot); + + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_CARRIERS; carrierIdx++) + { + if (((carriersEnabled) & (1U << carrierIdx)) > 0U) + { + uint8_t bandSelect = 0U; + int32_t ncoFreq_kHz = 0U; + VARIABLE_ASSIGNMENT(bandSelect, carrierDucConfig.carriers[carrierIdx].bandSelect); + VARIABLE_ASSIGNMENT(ncoFreq_kHz, carrierDucConfig.carriers[carrierIdx].ncoFreq_kHz); + + device->initExtract.txCarrierConfigs[idx].carriers[carrierIdx].enable = ADI_ENABLE; + VARIABLE_ASSIGNMENT(device->initExtract.txCarrierConfigs[idx].carriers[carrierIdx].sampleRate_kHz, carrierDucConfig.carriers[carrierIdx].inputRate_kHz); + device->initExtract.txCarrierConfigs[idx].carriers[carrierIdx].centerFrequency_kHz = + device->initExtract.tx.txChannelCfg[idx].bandSettings[bandSelect].rfCenterFreq_kHz + + ncoFreq_kHz; + VARIABLE_ASSIGNMENT(device->initExtract.txCarrierConfigs[idx].carriers[carrierIdx].ibw_kHz, carrierDucConfig.carriers[carrierIdx].ibw_kHz); + + VARIABLE_ASSIGNMENT(device->initExtract.tx.txChannelCfg[idx].carrierRuntimeSettings.carrierEnable[carrierIdx], 1U); + VARIABLE_ASSIGNMENT(device->initExtract.tx.txChannelCfg[idx].carrierRuntimeSettings.bandSelect[carrierIdx], carrierDucConfig.carriers[carrierIdx].bandSelect); + VARIABLE_ASSIGNMENT(device->initExtract.tx.txChannelCfg[idx].carrierRuntimeSettings.mixerEnable[carrierIdx], carrierDucConfig.carriers[carrierIdx].mixerEnable); + VARIABLE_ASSIGNMENT(device->initExtract.tx.txChannelCfg[idx].carrierRuntimeSettings.decimationRatio[carrierIdx], carrierDucConfig.carriers[carrierIdx].decimationRatio); + VARIABLE_ASSIGNMENT(device->initExtract.tx.txChannelCfg[idx].carrierRuntimeSettings.interpolationRatio[carrierIdx], carrierDucConfig.carriers[carrierIdx].interpolationRatio); + VARIABLE_ASSIGNMENT(device->initExtract.tx.txChannelCfg[idx].carrierRuntimeSettings.ncoFreq_kHz[carrierIdx], carrierDucConfig.carriers[carrierIdx].ncoFreq_kHz); + VARIABLE_ASSIGNMENT(device->initExtract.tx.txChannelCfg[idx].carrierRuntimeSettings.carrierRateRatio[carrierIdx], carrierDucConfig.carriers[carrierIdx].carrierRateRatio); + VARIABLE_ASSIGNMENT(device->initExtract.tx.txChannelCfg[idx].carrierRuntimeSettings.outputRate_kHz[carrierIdx], carrierDucConfig.carriers[carrierIdx].outputRate_kHz); + + if (device->initExtract.txCarrierConfigs[idx].carriers[carrierIdx].sampleRate_kHz < minCarriersKhz) + { + minCarriersKhz = device->initExtract.txCarrierConfigs[idx].carriers[carrierIdx].sampleRate_kHz; + } + } + } + + if (minCarriersKhz < minIfaceKhz) + { + device->initExtract.tx.txChannelCfg[idx].maxSlot /= (minIfaceKhz / minCarriersKhz); + } + + /* DPD output profile */ + offset = ADI_LIBRARY_OFFSETOF( adrv904x_DeviceProfile_t, dfeProfile) + + txConfigOffset + + ADI_LIBRARY_OFFSETOF(adrv904x_DfeTxConfig_t, dpd); + + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, offset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary - dpd"); + goto cleanup; + } + + if ((ADI_LIBRARY_FREAD(&dpdConfig, sizeof(dpdConfig), 1, cpuProfileFilePtr)) <= 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File - dpd"); + goto cleanup; + } + VARIABLE_ASSIGNMENT(device->initExtract.dfeCduc.dpdOutputRate_kHz[idx], dpdConfig.actRate_kHz); + + for (bandIdx = 0U; bandIdx < (uint32_t)ADI_ADRV904X_DUC_NUM_BAND; bandIdx++) + { + uint32_t bandLatencyOffset = 0U; + switch (bandIdx) + { + case 0U: + bandLatencyOffset = ADI_LIBRARY_OFFSETOF(adrv904x_DfeTxConfig_t, bandDucLatency[0U]); + break; + case 1U: + bandLatencyOffset = ADI_LIBRARY_OFFSETOF(adrv904x_DfeTxConfig_t, bandDucLatency[1U]); + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Invalid bandIdx - tx duc"); + goto cleanup; + break; + } + + offset = ADI_LIBRARY_OFFSETOF(adrv904x_DeviceProfile_t, dfeProfile) + + txConfigOffset + + bandLatencyOffset; + + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, offset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary - tx band duc latency"); + goto cleanup; + } + + uint16_t tmpBandLatency = 0U; + if ((ADI_LIBRARY_FREAD(&tmpBandLatency, sizeof(tmpBandLatency), 1, cpuProfileFilePtr)) <= 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File - carrier"); + goto cleanup; + } + + VARIABLE_ASSIGNMENT(device->initExtract.txBandLatency[idx].duc_cc[bandIdx], tmpBandLatency); + } + + } + + for (idx = 0U; idx < ADRV904X_NUM_TXRX_CHAN; idx++) + { + uint32_t rxConfigOffset; + uint8_t carriersEnabled = 0U; + + switch (device->initExtract.chanAssign[idx]) + { + case 0U: + rxConfigOffset = ADI_LIBRARY_OFFSETOF(adrv904x_DfeProfile_t, rxConfig[0U]); + break; + case 1U: + rxConfigOffset = ADI_LIBRARY_OFFSETOF(adrv904x_DfeProfile_t, rxConfig[1U]); + break; + case 2U: + rxConfigOffset = ADI_LIBRARY_OFFSETOF(adrv904x_DfeProfile_t, rxConfig[2U]); + break; + case 3U: + rxConfigOffset = ADI_LIBRARY_OFFSETOF(adrv904x_DfeProfile_t, rxConfig[3U]); + break; + case 255U: + /* Channel disabled */ + rxConfigOffset = 0U; + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Invalid chanAssign - rx carrier"); + goto cleanup; + break; + } + + offset = ADI_LIBRARY_OFFSETOF(adrv904x_DeviceProfile_t, dfeProfile) + + rxConfigOffset + + ADI_LIBRARY_OFFSETOF(adrv904x_DfeRxConfig_t, cddc); + + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, offset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary - carrier"); + goto cleanup; + } + + if ((ADI_LIBRARY_FREAD(&carrierDdcConfig, sizeof(carrierDdcConfig), 1, cpuProfileFilePtr)) <= 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File - carrier"); + goto cleanup; + } + + VARIABLE_ASSIGNMENT(device->initExtract.rx.rxChannelCfg[idx].bandRatio[0], carrierDdcConfig.bandRatio[0]); + VARIABLE_ASSIGNMENT(device->initExtract.rx.rxChannelCfg[idx].bandRatio[1], carrierDdcConfig.bandRatio[1]); + VARIABLE_ASSIGNMENT(device->initExtract.rx.rxChannelCfg[idx].maxSlot, carrierDdcConfig.maxSlot); + + VARIABLE_ASSIGNMENT(carriersEnabled, carrierDdcConfig.carriersEnabled); + + for (carrierIdx = 0U; carrierIdx < ADI_ADRV904X_MAX_CARRIERS; carrierIdx++) + { + if (((carrierDdcConfig.carriersEnabled) & (1U << carrierIdx)) > 0U) + { + device->initExtract.rxCarrierConfigs[idx].carriers[carrierIdx].enable = 1U; + VARIABLE_ASSIGNMENT(device->initExtract.rxCarrierConfigs[idx].carriers[carrierIdx].sampleRate_kHz, carrierDdcConfig.carriers[carrierIdx].inputRate_kHz); + device->initExtract.rxCarrierConfigs[idx].carriers[carrierIdx].centerFrequency_kHz = device->initExtract.rx.rxChannelCfg[idx].bandSettings[carrierDdcConfig.carriers[carrierIdx].bandSelect].rfCenterFreq_kHz + carrierDdcConfig.carriers[carrierIdx].ncoFreq_kHz; //<<< TODO BOM TMP VARS + VARIABLE_ASSIGNMENT(device->initExtract.rxCarrierConfigs[idx].carriers[carrierIdx].ibw_kHz, carrierDdcConfig.carriers[carrierIdx].ibw_kHz); + + VARIABLE_ASSIGNMENT(device->initExtract.rx.rxChannelCfg[idx].carrierRuntimeSettings.carrierEnable[carrierIdx], 1U); + VARIABLE_ASSIGNMENT(device->initExtract.rx.rxChannelCfg[idx].carrierRuntimeSettings.bandSelect[carrierIdx], carrierDdcConfig.carriers[carrierIdx].bandSelect); + VARIABLE_ASSIGNMENT(device->initExtract.rx.rxChannelCfg[idx].carrierRuntimeSettings.mixerEnable[carrierIdx], carrierDdcConfig.carriers[carrierIdx].mixerEnable); + VARIABLE_ASSIGNMENT(device->initExtract.rx.rxChannelCfg[idx].carrierRuntimeSettings.decimationRatio[carrierIdx], carrierDdcConfig.carriers[carrierIdx].decimationRatio); + VARIABLE_ASSIGNMENT(device->initExtract.rx.rxChannelCfg[idx].carrierRuntimeSettings.interpolationRatio[carrierIdx], carrierDdcConfig.carriers[carrierIdx].interpolationRatio); + VARIABLE_ASSIGNMENT(device->initExtract.rx.rxChannelCfg[idx].carrierRuntimeSettings.ncoFreq_kHz[carrierIdx], carrierDdcConfig.carriers[carrierIdx].ncoFreq_kHz); + VARIABLE_ASSIGNMENT(device->initExtract.rx.rxChannelCfg[idx].carrierRuntimeSettings.carrierRateRatio[carrierIdx], carrierDdcConfig.carriers[carrierIdx].carrierRateRatio); + VARIABLE_ASSIGNMENT(device->initExtract.rx.rxChannelCfg[idx].carrierRuntimeSettings.outputRate_kHz[carrierIdx], carrierDdcConfig.carriers[carrierIdx].outputRate_kHz); + } + } + + for (bandIdx = 0U; bandIdx < (uint32_t)ADI_ADRV904X_DDC_NUM_BAND; bandIdx++) + { + uint32_t bandLatencyOffset = 0U; + switch (bandIdx) + { + case 0U: + bandLatencyOffset = ADI_LIBRARY_OFFSETOF(adrv904x_DfeRxConfig_t, bandDdcLatency[0U]); + break; + case 1U: + bandLatencyOffset = ADI_LIBRARY_OFFSETOF(adrv904x_DfeRxConfig_t, bandDdcLatency[1U]); + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Invalid bandIdx - rx ddc"); + goto cleanup; + break; + } + + offset = ADI_LIBRARY_OFFSETOF(adrv904x_DeviceProfile_t, dfeProfile) + + rxConfigOffset + + bandLatencyOffset; + + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, offset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary - rx band ddc latency"); + goto cleanup; + } + + uint16_t tmpBandLatency = 0U; + if ((ADI_LIBRARY_FREAD(&tmpBandLatency, sizeof(tmpBandLatency), 1, cpuProfileFilePtr)) <= 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File - rx band ddc latency"); + goto cleanup; + } + + VARIABLE_ASSIGNMENT(device->initExtract.rxBandLatency[idx].ddc_cc[bandIdx], tmpBandLatency); + } + + } + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup: + if (cpuProfileFilePtr != NULL) + { + /* Close CPU Profile binary file */ + if (0 != ADI_LIBRARY_FCLOSE(cpuProfileFilePtr)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot Close CPU Profile Binary File"); + } + } + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_DeviceCopy(adi_adrv904x_Device_t* const deviceSrc, + adi_adrv904x_Device_t* const deviceDest) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(deviceSrc); + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(deviceDest); + + /* Ignore Common Device & SPI Settings */ + (void) ADI_LIBRARY_MEMCPY(&deviceDest->devStateInfo, &deviceSrc->devStateInfo, sizeof(adi_adrv904x_Info_t)); + (void) ADI_LIBRARY_MEMCPY(&deviceDest->initExtract, &deviceSrc->initExtract, sizeof(adi_adrv904x_InitExtract_t)); + + return recoveryAction; +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_PreMcsInit(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Init_t* const init, + const adi_adrv904x_TrxFileInfo_t* const trxBinaryInfoPtr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, init, cleanup); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, trxBinaryInfoPtr, cleanup); + + /* Prevent any Read Operation from device during Broadcast */ + ADI_ADRV904X_WRONLY_SET(device->common, ADI_TRUE); + + /* Extract Info from CPU Profile Binary */ + recoveryAction = adi_adrv904x_DeviceInfoExtract(device, &trxBinaryInfoPtr->cpuProfile); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during CPU Profile Binary Image Extract"); + goto cleanup; + } + + /* Initialize TRX Device */ + recoveryAction = adi_adrv904x_Initialize(device, init); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "TRX Device Initialization Failed"); + goto cleanup; + } + + /* Load Stream Binary Image */ + recoveryAction = adi_adrv904x_StreamImageLoad(device, &trxBinaryInfoPtr->stream); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Stream Binary Image Loading"); + goto cleanup; + } + + /* Load CPU Binary File(s) */ + recoveryAction = adi_adrv904x_CpuImageLoad(device, &trxBinaryInfoPtr->cpu); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during CPU Binary Image Loading"); + goto cleanup; + } + + /* Prepare for DFE CPU Binary Loading */ + recoveryAction = adi_adrv904x_DfePrepareLoad(device, 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during DFE CPU prepare for load."); + goto cleanup; + } + + /* Load CPU Profile Binary */ + recoveryAction = adi_adrv904x_CpuProfileImageLoad(device, &trxBinaryInfoPtr->cpuProfile); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during CPU Profile Binary Image Loading"); + goto cleanup; + } + + /* Load Rx Gain Table(s) */ + recoveryAction = adi_adrv904x_RxGainTableLoad(device, &trxBinaryInfoPtr->rxGainTable[0U], ADI_ADRV904X_LOAD_ALL_RXGAIN_TABLES); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during RX Gain Table Loading"); + goto cleanup; + } + + /* Load Images for all the DFE CPU cores*/ + if (ADI_LIBRARY_STRNLEN((const char*)trxBinaryInfoPtr->dfeCpu.filePath, ADI_ADRV904X_MAX_FILE_LENGTH) != 0) + { + recoveryAction = adi_adrv904x_DfeCpuImageLoad(device, &trxBinaryInfoPtr->dfeCpu); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during DFE CPU image load."); + goto cleanup; + } + } + + /* Load Radio Sequence Binary Image */ + if (device->initExtract.rs.radioSeqEn == ADI_TRUE) + { + recoveryAction = adi_adrv904x_RadioSequencerImageLoad(device, &trxBinaryInfoPtr->radioSequencer); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Radio Sequence Binary Image Loading"); + goto cleanup; + } + } + + /* Read CFR pulse from profile binary and write it to pulse RAMs */ + recoveryAction = adi_adrv904x_CfrPulseExtractAndWrite(device, &trxBinaryInfoPtr->cpuProfile); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error happened while writing CFR pulse"); + goto cleanup; + } + + /* CPU Bootup */ + recoveryAction = adi_adrv904x_CpuStart(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during TRX CPU Start"); + goto cleanup; + } + +cleanup : + ADI_ADRV904X_WRONLY_SET(device->common, ADI_FALSE); + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_PreMcsInit_NonBroadcast(adi_adrv904x_Device_t* const device, + const adi_adrv904x_Init_t* const init) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + adi_adrv904x_RxDataFormatRt_t rxDataFormatRt; + adi_adrv904x_RxGain_t rxGain; + uint32_t i = 0u; + uint32_t rxChannels[] = { + (uint32_t)ADI_ADRV904X_RX0, + (uint32_t)ADI_ADRV904X_RX1, + (uint32_t)ADI_ADRV904X_RX2, + (uint32_t)ADI_ADRV904X_RX3, + (uint32_t)ADI_ADRV904X_RX4, + (uint32_t)ADI_ADRV904X_RX5, + (uint32_t)ADI_ADRV904X_RX6, + (uint32_t)ADI_ADRV904X_RX7, + (uint32_t)ADI_ADRV904X_ORX0, + (uint32_t)ADI_ADRV904X_ORX1 + }; + + adi_adrv904x_TxAtten_t txAtten; + adi_adrv904x_TxAttenCfg_t txAttenCfg; + adi_adrv904x_PowerMonitorCfgRt_t txPowerMonitorCfg; + adi_adrv904x_SlewRateDetectorCfgRt_t txSrlCfg; + adi_adrv904x_ProtectionRampCfgRt_t txProtectionRampCfg; + uint8_t txInputInterpolation = 0U; + uint32_t chanMask = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, init, cleanup); + + ADI_LIBRARY_MEMSET(&txAtten, 0, sizeof(txAtten)); + ADI_LIBRARY_MEMSET(&txAttenCfg, 0, sizeof(txAttenCfg)); + ADI_LIBRARY_MEMSET(&txPowerMonitorCfg, 0, sizeof(txPowerMonitorCfg)); + ADI_LIBRARY_MEMSET(&txSrlCfg, 0, sizeof(txSrlCfg)); + ADI_LIBRARY_MEMSET(&txProtectionRampCfg, 0, sizeof(txProtectionRampCfg)); + ADI_LIBRARY_MEMSET(&rxDataFormatRt, 0, sizeof(rxDataFormatRt)); + ADI_LIBRARY_MEMSET(&rxGain, 0, sizeof(rxGain)); + + recoveryAction = adi_adrv904x_CpuStartStatusCheck(device, ADI_ADRV904X_GETCPUBOOTUP_TIMEOUT_US); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CPU Boot Issue"); + goto cleanup; + } + +#if ADI_ADRV904X_SPI_VERIFY + recoveryAction = adi_adrv904x_SpiVerify(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } +#endif + + recoveryAction = adi_adrv904x_DeviceRevGet(device, &(device->devStateInfo.deviceSiRev)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failure to read device silicon revision"); + goto cleanup; + } + + if (device->devStateInfo.profilesValid & ADI_ADRV904X_TX_PROFILE_VALID) + { + /* For each tx channel */ + for (i = 0U; i < ADI_ADRV904X_MAX_TXCHANNELS; ++i) + { + chanMask = 1U << i; + if (ADRV904X_BF_EQUAL(device->initExtract.tx.txInitChannelMask, chanMask) == 0) + { + /* Channel disabled - skip */ + continue; + } + + /* Tx channel is enabled */ + txAttenCfg = init->tx.txChannelCfg[i].txAttenCfg; + + recoveryAction = adi_adrv904x_TxAttenCfgSet(device, chanMask, &txAttenCfg); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Tx Atten Configuration Failed"); + goto cleanup; + } + + txAtten.txChannelMask = chanMask; + txAtten.txAttenuation_mdB = init->tx.txChannelCfg[i].txAttenInit_mdB; + + recoveryAction = adi_adrv904x_TxAttenSet(device, &txAtten, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + if (recoveryAction != ADI_ADRV904X_ERR_ACT_RESET_FEATURE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Tx Initial Attenuation Set Failed"); + goto cleanup; + } + } + + txInputInterpolation = (uint8_t)device->initExtract.tx.txChannelCfg[i].totalDecimation; + + recoveryAction = adrv904x_TxPowerMonitorInitialize(device, chanMask, txInputInterpolation); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Tx Power Monitor Initialize Failed"); + goto cleanup; + } + + txPowerMonitorCfg.txChannelMask = chanMask; + txPowerMonitorCfg.txPowerMonitorCfg = init->tx.txChannelCfg[i].txpowerMonitorCfg; + + recoveryAction = adi_adrv904x_TxPowerMonitorCfgSet(device, &txPowerMonitorCfg, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Tx Power Protection Configuration Failed"); + goto cleanup; + } + + txSrlCfg.txChannelMask = chanMask; + txSrlCfg.srlCfg = init->tx.txChannelCfg[i].srlCfg; + + recoveryAction = adi_adrv904x_TxSlewRateDetectorCfgSet(device, &txSrlCfg, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Tx Slew Rate Detector Configuration Failed"); + goto cleanup; + } + + txProtectionRampCfg.txChannelMask = chanMask; + recoveryAction = adi_adrv904x_TxProtectionRampCfgSet(device, &txProtectionRampCfg, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Tx Protection Ramp Configuration Failed"); + goto cleanup; + } + + /* Store PA protection ramp down config and handle this part in the post MCS step */ + device->devStateInfo.txProtectionRampCfg[i].txChannelMask = chanMask; + device->devStateInfo.txProtectionRampCfg[i].protectionRampCfg = init->tx.txChannelCfg[i].protectionRampCfg; + + if (device->devStateInfo.vswrWaveformLoaded[i] == 0U) + { + recoveryAction = adrv904x_VswrPlaybackDatNumOfSamplesInit(device, (adi_adrv904x_TxChannels_e)chanMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Tx VSWR playback init failed"); + goto cleanup; + } + } + } + } + + /* Initializing RX configuration */ + if (device->devStateInfo.profilesValid & ADI_ADRV904X_RX_PROFILE_VALID) + { + for (i = 0U; i < (sizeof(rxChannels) / sizeof(rxChannels[0U])); ++i) + { + if ((device->initExtract.rx.rxInitChannelMask & rxChannels[i]) > 0U) + { + /* Correct the Rx Channel Mask from the profile */ + rxDataFormatRt.rxChannelMask = rxChannels[i]; + rxDataFormatRt.rxDataFormat = init->rx.rxChannelCfg[i].rxDataFormat; + + /* Setup the Rx data formatter */ + recoveryAction = adrv904x_RxDataFormatSet(device, &rxDataFormatRt, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RX Data Format set Failed"); + goto cleanup; + } + + /* Setup Rx AGC overload protection registers */ + recoveryAction = adrv904x_RxOverloadProtectionSet(device, (adi_adrv904x_RxChannels_e)rxChannels[i]); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RX Overload Protection set Failed"); + goto cleanup; + } + + if (i < ADI_ADRV904X_MAX_RX_ONLY) + { + /* Correct the Rx Channel Mask from the profile */ + rxGain.rxChannelMask = rxChannels[i]; + rxGain.gainIndex = init->rx.rxChannelCfg[i].rxGainIndexInit; + + /* Setup the Rx Gain */ + recoveryAction = adi_adrv904x_RxGainSet(device, &rxGain, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "RX Gain set Failed"); + goto cleanup; + } + } + } + } + } + + /* Initializing Radio Sequence configuration */ + ADI_LIBRARY_MEMCPY(&device->initExtract.radioCtrlPreInit, + &init->radioCtrlPreInit, + sizeof(device->initExtract.radioCtrlPreInit)); + recoveryAction = adi_adrv904x_RadioSequencerPreMcsCfg(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Radio Sequence configuration Failed"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_PostMcsInit(adi_adrv904x_Device_t* const device, + const adi_adrv904x_PostMcsInit_t* const utilityInit) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const uint32_t INIT_CALS_TIMEOUT_MS = 60000U; /* 60 Seconds Timeout */ + adi_adrv904x_InitCalErrData_t initCalErrData; + uint8_t idx = 0U; + adi_adrv904x_RadioCtrlTxRxEnCfg_t allDisabledTxRxEnCfg; + + + uint8_t i = 0U; + uint32_t chanMask = 0U; + adi_adrv904x_GpIntMask_t gpIntClear = { 0ULL, 0ULL }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, utilityInit, cleanup); + + ADI_LIBRARY_MEMSET(&initCalErrData, 0, sizeof(adi_adrv904x_InitCalErrData_t)); + ADI_LIBRARY_MEMSET(&allDisabledTxRxEnCfg, 0, sizeof(allDisabledTxRxEnCfg)); + + + /* Initializing Radio Sequence configuration */ + recoveryAction = adi_adrv904x_RadioSequencerPostMcsCfg(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Radio Sequence configuration Failed"); + goto cleanup; + } + + /*Initialize radio control. This is required to run before running init cals*/ + /* Sets up Radio Ctrl mode for Rx/ORx/Tx signal chains (SPI vs Pin mode) */ + if ((utilityInit->radioCtrlCfg.txRadioCtrlModeCfg.txChannelMask != 0U) || + (utilityInit->radioCtrlCfg.rxRadioCtrlModeCfg.rxChannelMask != 0U) || + (utilityInit->radioCtrlCfg.orxRadioCtrlModeCfg.orxChannelMask != 0U)) + { + recoveryAction = adi_adrv904x_RadioCtrlCfgSet(device, (adi_adrv904x_RadioCtrlModeCfg_t*) &utilityInit->radioCtrlCfg); + if (ADI_ADRV904X_ERR_ACT_NONE != recoveryAction) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Radio Control Config Set Failed"); + goto cleanup; + } + } + + /* Sets up Radio Ctrl TxRx Enable Config for Pin mode (Config will be ignore in SPI mode) */ + if ((utilityInit->radioCtrlTxRxEnCfgSel != 0U) || (utilityInit->radioCtrlTxRxEnPinSel != 0U)) + { + recoveryAction = adi_adrv904x_RadioCtrlTxRxEnCfgSet(device, + &allDisabledTxRxEnCfg, + ADI_ADRV904X_TXRXEN_PINALL, + ADI_ADRV904X_TXRXEN_TX_ENABLE_MAP | ADI_ADRV904X_TXRXEN_RX_ENABLE_MAP); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Radio Control TxRxEnCfg set to default failed"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_RadioCtrlTxRxEnCfgSet(device, + &utilityInit->radioCtrlGpioCfg, + utilityInit->radioCtrlTxRxEnPinSel, + utilityInit->radioCtrlTxRxEnCfgSel); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Radio Control TxRxEnCfg Set Failed"); + goto cleanup; + } + } + + /* Sets up the GPIO pin mapping used by stream processor */ + recoveryAction = adi_adrv904x_StreamGpioConfigSet(device, &device->devStateInfo.streamGpioMapping); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Stream Gpio Config Set Failed"); + goto cleanup; + } + + /* Sets up the Tx to Orx pin mapping */ + recoveryAction = adi_adrv904x_TxToOrxMappingInit(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Tx To Orx Mapping Init Failed"); + goto cleanup; + } + + /* Initialize GP Interrupt settings for use during device initialization*/ + /* Set GP Int Pin Masks to selected states */ + recoveryAction = adi_adrv904x_GpIntPinMaskCfgSet(device, ADI_ADRV904X_GPINTALL, &utilityInit->gpIntPostInit); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error writing GP Interrupt Mask Array."); + goto cleanup; + } + + /* Clear all status bits */ + recoveryAction = adi_adrv904x_GpIntStatusClear(device, NULL); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error clearing GP Interrupt Status bits."); + goto cleanup; + } + + /*Initialize cals*/ + if ((utilityInit->initCals.rxChannelMask != 0U) || + (utilityInit->initCals.txChannelMask != 0U) || + (utilityInit->initCals.orxChannelMask != 0U) || + (utilityInit->initCals.calMask != 0U)) + { + recoveryAction = adi_adrv904x_InitCalsRun(device, &utilityInit->initCals); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "InitCalsRun Failed"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_InitCalsWait_v2(device, INIT_CALS_TIMEOUT_MS, &initCalErrData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Initial Calibration Wait Issue"); + goto cleanup; + } + + for (idx = 0; idx < ADI_ADRV904X_NUM_INIT_CAL_CHANNELS; ++idx) + { + if (initCalErrData.channel[idx].errCode != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_FEATURE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "InitCals Error - Get More Information via Detailed Status Get"); + goto cleanup; + } + } + } + + + /* Config Tx PA protection ramp down */ + if (device->devStateInfo.profilesValid & ADI_ADRV904X_TX_PROFILE_VALID) + { + /* Clear the Tx PA GP Int */ + gpIntClear.lowerMask = 0x3FFC00ULL; + gpIntClear.upperMask = 0x1C7FFFC00ULL; + recoveryAction = adi_adrv904x_GpIntStatusClear(device, &gpIntClear); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "GP INT Tx PA protection bit clear failed"); + goto cleanup; + } + + /* For each tx channel */ + for (i = 0U; i < ADI_ADRV904X_MAX_TXCHANNELS; ++i) + { + chanMask = 1U << i; + if (ADRV904X_BF_EQUAL(device->initExtract.tx.txInitChannelMask, chanMask) == 0) + { + /* Channel disabled - skip */ + continue; + } + + /* Clear the Tx PA error event */ + recoveryAction = adi_adrv904x_TxProtectionErrorClear(device, + (adi_adrv904x_TxChannels_e)chanMask, + (uint32_t)(ADI_ADRV904X_RDT_PEAK_PA | + ADI_ADRV904X_RDT_AVG_PA | + ADI_ADRV904X_RDT_SRD | + ADI_ADRV904X_RDT_CLK_PLL_UNLOCK | + ADI_ADRV904X_RDT_RF0_PLL_UNLOCK | + ADI_ADRV904X_RDT_RF1_PLL_UNLOCK | + ADI_ADRV904X_RDT_SERDES_PLL_UNLOCK | + ADI_ADRV904X_RDT_DFRM0_EVENT | + ADI_ADRV904X_RDT_DFRM1_EVENT)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanMask, "Tx PA protection event clear failed"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_TxProtectionRampCfgSet(device, &(device->devStateInfo.txProtectionRampCfg[i]), 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, chanMask, "Tx Protection Ramp Configuration Failed"); + goto cleanup; + } + } + } + + if (device->devStateInfo.devState & ADI_ADRV904X_STATE_DFECPULOADED) + { + recoveryAction = adi_adrv904x_DfeCpuStart(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DFE processor issue during start."); + goto cleanup; + } + /* Check DFE processor boot status */ + recoveryAction = adi_adrv904x_DfeCpuStartStatusCheck(device, ADI_ADRV904X_DFE_CPUBOOTUP_TIMEOUT_US); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "DFE CPU Boot Issue"); + goto cleanup; + } + } + + + recoveryAction = adi_adrv904x_JrxRepairInitialization(device, utilityInit->initCals.warmBoot); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Jrx repair at initialization failed"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +static adi_adrv904x_ErrAction_e adrv904x_CpuMemDumpBinWrite(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuMemDumpBinaryInfo_t* const cpuMemDumpBinaryInfoPtr, + const uint8_t forceException, + uint32_t* const dumpSize, + const uint8_t ramOnlyFlag) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + FILE* ofp = NULL; + uint32_t byteCount = 0U; + uint32_t cpuIdx = 0U; + uint32_t exceptionValue = 0U; + uint8_t binaryRead[ADI_ADRV904X_MEM_DUMP_CHUNK_SIZE + 10] = { 0U }; + uint32_t tableIdx = 0U; + uint32_t i = 0U; + uint32_t startAddr = 0U; + uint32_t endAddr = 0U; + uint32_t timeout_us = 0U; + uint32_t waitInterval_us = 0U; + uint32_t eventCheck = 0U; + uint32_t numEventChecks = 0U; + uint32_t cpuTableSize = 0U; + uint8_t txChanId = 0U; + uint8_t sliceClkEn = 0x01U; + const uint32_t STREAM_CPU_RAM_ADDR = 0x46A00000U; + adrv904x_BfTxDigChanAddr_e txDigBaseAddr[ADI_ADRV904X_MAX_TXCHANNELS] = { ADRV904X_BF_SLICE_TX_0__TX_DIG, ADRV904X_BF_SLICE_TX_1__TX_DIG, ADRV904X_BF_SLICE_TX_2__TX_DIG, ADRV904X_BF_SLICE_TX_3__TX_DIG, ADRV904X_BF_SLICE_TX_4__TX_DIG, ADRV904X_BF_SLICE_TX_5__TX_DIG, ADRV904X_BF_SLICE_TX_6__TX_DIG, ADRV904X_BF_SLICE_TX_7__TX_DIG }; + + uint32_t recordCrc = 0U; + uint8_t recordPadding = 0U; + + + uint32_t offset = 0U; + uint32_t sizeFlag = 0U; + const uint32_t cpuCrashAddr[] = { 0U }; /* Skip these addresses that causes CPU crash */ + uint8_t skipRead = ADI_FALSE; + uint32_t dfeTableSize = 0U; + uint32_t dfeExceptionFlag = ADRV904X_DFE_PLATFORM_NO_EXCEPTION; + uint32_t count = 0U; + uint8_t bootStatus = 0U; + const uint32_t DFE_EXCEPTION_DONE_MAX_COUNT = 500U; + const uint32_t DFE_EXCEPTION_DONE_WAIT_US = 1000U; + const uint32_t SPI_ONLY_REGS_ADDR = 0x47000000U; + const uint32_t DIRECT_SPI_REGION_LEN = 0x4000U; + + /* File header variables */ + uint16_t fileFormatVersion = 0U; + uint16_t productId = 0U; + uint16_t productRevision = 0U; + time_t rawtime; + struct tm *tmPtr; + + /* Generic record header varibales */ + uint32_t recordType; + uint32_t recordLength; + uint8_t endianness = 0U; + + /* Device Driver record variables */ + uint16_t driverId; + uint16_t instanceId; + uint32_t driverStateLength; + uint16_t driverVersionMajor; + uint16_t driverVersionMinor; + uint16_t driverVersionPatch; + uint8_t driverVersionPrerel[ADI_ADRV904X_VERSION_PREREL_SIZE] = {0U}; + uint32_t driverVersionBuild; + uint16_t tmYear = 0U; + uint8_t tmMonth = 0U; + uint8_t tmDay = 0U; + uint8_t tmHour = 0U; + uint8_t tmMin = 0U; + uint8_t tmSec = 0U; + uint8_t* driverPtr; + + /* CPU RAM Record Variables */ + uint64_t startAddress; + uint32_t memLength; + uint16_t ramId; + uint16_t cpuType; + + /* Telemetry Buffer Record Variables */ + uint32_t bufferLength; + uint16_t bufferId; + uint16_t formatVersion = 0x1U; + + /* Register Record Variables */ + uint32_t length; + uint8_t registerWidth; + + + /* ETM Trace Record Variables */ + uint32_t traceBufferLength = 0U; + uint16_t traceFormat; + uint8_t numCpus = 0U; + uint16_t cpuArch; + uint16_t etmType; + uint16_t cpuFormat; + uint8_t configLength; + uint32_t traceDataLength; + uint32_t etmOn[ADRV904X_ETM_MAX] = {0U}; + uint32_t read32 = 0U; + + /* Firmware Version Records */ + uint16_t firmwareSemverMajor; + uint16_t firmwareSemverMinor; + uint16_t firmwareSemverPatch; + uint8_t firmwareVersionPrerel[ADI_ADRV904X_VERSION_PREREL_SIZE] = {0U}; + uint32_t firmwareSemverBuild; + uint32_t firmwareId; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuMemDumpBinaryInfoPtr, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuMemDumpBinaryInfoPtr->filePath, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dumpSize, cleanup); + + if ((forceException != 0U) && + (forceException != 1U)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, forceException, "forceException param must be 0 or 1"); + goto cleanup; + } + +#ifdef __GNUC__ + ofp = ADI_LIBRARY_FOPEN((const char*)cpuMemDumpBinaryInfoPtr->filePath, "wb"); +#else + ADI_LIBRARY_FOPEN_S(&ofp, (const char*)cpuMemDumpBinaryInfoPtr->filePath, "wb"); +#endif + + if (ofp == NULL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, ofp, "Unable to open binary image file. Please check if the path is correct"); + goto cleanup; + } + + + /* Check ETM Values before exceptions */ + for(i = 0; i < ADRV904X_ETM_MAX; i++) + { + recoveryAction = adi_adrv904x_Register32Read( device, + NULL, + adrv904x_DfeEtmMemDumpTable[i].baseAddr + ADRV904X_ETM_TRCPRGCTLR_OFFSET, + &read32, /* trace enabled for ETM*/ + 0xFFFFFFFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, ofp, "Unable to Read trace memory"); + goto cleanup; + } + + if(read32 != 0U) + { + etmOn[i] = 1U; + numCpus++; + configLength = adrv904x_DfeEtmMemDumpTable[i].configSize * adrv904x_DfeEtmMemDumpTable[i].dataSize; + traceBufferLength += ADI_ADRV904X_ETM_RECORD_SIZE + configLength + ((configLength % 8) ? 8 - (configLength % 8) : 0); + } + } + + if (forceException == ADI_TRUE) + { + + /* Poll until CPU is in exception state or timeout */ + timeout_us = ADI_ADRV904X_WRITECPUEXCEPTION_TIMEOUT_US; + waitInterval_us = ADI_ADRV904X_WRITECPUEXCEPTION_INTERVAL_US; +#if ADI_ADRV904X_WRITECPUEXCEPTION_INTERVAL_US > ADI_ADRV904X_WRITECPUEXCEPTION_TIMEOUT_US + waitInterval_us = timeout_us; +#elif ADI_ADRV904X_WRITECPUEXCEPTION_INTERVAL_US == 0 + waitInterval_us = timeout_us; +#endif + numEventChecks = timeout_us / waitInterval_us; + for (eventCheck = 0U; eventCheck <= numEventChecks; ++eventCheck) + { + if (exceptionValue == (uint32_t)ADRV904X_CPU_NO_EXCEPTION) + { + /* For each main CPU force an exception unless it is already in exception state */ + for (cpuIdx = ADI_ADRV904X_CPU_TYPE_0; cpuIdx < ADI_ADRV904X_CPU_TYPE_MAX_RADIO; cpuIdx++) + { + recoveryAction = adi_adrv904x_CpuCheckException(device, (uint32_t*)&exceptionValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to Read Cpu memory"); + goto cleanup; + } + if (exceptionValue == (uint32_t)ADRV904X_CPU_NO_EXCEPTION) + { + /* CPU is not in exception state; Force it into exception state */ + recoveryAction = adrv904x_CpuForceException(device, (adi_adrv904x_CpuType_e)cpuIdx); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CpuForceException issue"); + goto cleanup; + } + recoveryAction = adi_adrv904x_CpuCheckException(device, (uint32_t*)&exceptionValue); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to Read Cpu memory"); + goto cleanup; + } + if (exceptionValue == (uint32_t)ADRV904X_CPU_NO_EXCEPTION) + { + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_Wait_us(&device->common, waitInterval_us); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "HAL Wait Request Issue"); + goto cleanup; + } + } + else + { + /* CPU is now in exception state so break out of the cpuIdx for loop*/ + break; + } + } + } + } + /* Force a DFE exception if no DFE core is currently in exception state */ + if (dfeExceptionFlag == (uint32_t)ADRV904X_DFE_PLATFORM_NO_EXCEPTION) + { + /* Read the exception data */ + recoveryAction = adi_adrv904x_DfeCpuCheckException(device, (uint32_t*)&dfeExceptionFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE exception data registers"); + goto cleanup; + } + if (dfeExceptionFlag == (uint32_t)ADRV904X_DFE_PLATFORM_NO_EXCEPTION) + { + /* No DFE core is in exception state; Force them into exception state. */ + recoveryAction = adrv904x_CpuForceException(device, ADI_ADRV904X_CPU_TYPE_DFE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "CpuForceException issue for DFE CPU"); + goto cleanup; + } + /* Read the address of exception data */ + recoveryAction = adi_adrv904x_DfeCpuCheckException(device, (uint32_t*)&dfeExceptionFlag); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Reading DFE exception data registers"); + goto cleanup; + } + if (dfeExceptionFlag == (uint32_t)ADRV904X_DFE_PLATFORM_NO_EXCEPTION) + { + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_Wait_us(&device->common, waitInterval_us); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "HAL Wait Request Issue for DFE CPU"); + goto cleanup; + } + } + } + } + if ((exceptionValue != (uint32_t)ADRV904X_CPU_NO_EXCEPTION) && (dfeExceptionFlag != (uint32_t)ADRV904X_DFE_PLATFORM_NO_EXCEPTION)) + { + /* Break out of the eventCheck for loop */ + break; + } + } + } + + /* Enable the Tx slice clock of the uninitialized TX channels to avoid the invalid memdump */ + sliceClkEn = 0x01U; + for (txChanId = 0U; txChanId <= ADI_ADRV904X_TX_CHAN_ID_MAX; txChanId++) + { + if (((device->devStateInfo.initializedChannels >> ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET) & (0x01 << (uint32_t)txChanId)) == 0U) + { + adrv904x_TxDig_TxAttenClkEnable_BfSet(device, NULL, txDigBaseAddr[txChanId], sliceClkEn); + } + } + + *dumpSize = 0U; + + /* Generate Header for dump file*/ + fileFormatVersion = 0x1U; + productRevision = device->devStateInfo.deviceSiRev; + /* Determine product ID */ + adrv904x_Core_EfuseProductId_BfGet(device, NULL, ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, (uint8_t*) &productId); + productId = ADI_ADRV904X_PRODUCT_ID_MASK | productId; + /* Find dump time */ + ADI_LIBRARY_TIME(&rawtime); + tmPtr = ADI_LIBRARY_GMTIME(&rawtime); + + /* Generate header record*/ + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + byteCount = 0U; + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], fileFormatVersion); + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], productId); + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], productRevision); + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], tmPtr->tm_year); + byteCount += adrv904x_insert8Bits( &binaryRead[byteCount], tmPtr->tm_mon); + byteCount += adrv904x_insert8Bits( &binaryRead[byteCount], tmPtr->tm_mday); + byteCount += adrv904x_insert8Bits( &binaryRead[byteCount], tmPtr->tm_hour); + byteCount += adrv904x_insert8Bits( &binaryRead[byteCount], tmPtr->tm_min); + byteCount += adrv904x_insert8Bits( &binaryRead[byteCount], tmPtr->tm_sec); + byteCount += 3U; /* Padding to align to 64-bit boundary */ + /* calculate CRC*/ + recordCrc = adrv904x_Crc32ForChunk(binaryRead, byteCount, recordCrc, ADI_TRUE); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], recordCrc); + byteCount += 4U; /* Padding to align to 64-bit boundary */ + + /* Insert file header */ + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + + /* Generate Device Driver Record */ + recordCrc = 0U; + byteCount = 0U; + recordType = ADI_ADRV904X_MEMDUMP_DEV_DRVR_STATE_RECORD; + recordLength = ADI_ADRV904X_MEMDUMP_DEVICE_DRIVER_HEADER_SIZE + sizeof(*device); + /* Generate basic header */ + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], recordType); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], recordLength); + /* Insert record header */ + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + byteCount = 0U; + + /* Get driver record values */ + driverId = 0U; /* TBD */ + instanceId = device->common.id; + driverStateLength = sizeof(*device); + driverVersionMajor = ADI_ADRV904X_CURRENT_MAJOR_VERSION; + driverVersionMinor = ADI_ADRV904X_CURRENT_MINOR_VERSION; + driverVersionPatch = ADI_ADRV904X_CURRENT_MAINTENANCE_VERSION; + driverVersionBuild = ADI_ADRV904X_CURRENT_BUILD_VERSION; + + /* Only Koror enables init time */ + tmPtr = ADI_LIBRARY_GMTIME(&(device->devStateInfo.initGlobalTime)); + tmYear = tmPtr->tm_year; + tmMonth = tmPtr->tm_mon; + tmDay = tmPtr->tm_mday; + tmHour = tmPtr->tm_hour; + tmMin = tmPtr->tm_min; + tmSec = tmPtr->tm_sec; + + /* Compile driver record header */ + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], driverId); + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], instanceId); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], driverStateLength); + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], driverVersionMajor); + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], driverVersionMinor); + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], driverVersionPatch); + for(i = 0U; i < ADI_ADRV904X_VERSION_PREREL_SIZE; i++) + { + byteCount += adrv904x_insert8Bits(&binaryRead[byteCount], driverVersionPrerel[i]); + } + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], driverVersionBuild); + byteCount += adrv904x_insert8Bits( &binaryRead[byteCount], endianness); + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], tmYear); + byteCount += adrv904x_insert8Bits( &binaryRead[byteCount], tmMonth); + byteCount += adrv904x_insert8Bits( &binaryRead[byteCount], tmDay); + byteCount += adrv904x_insert8Bits( &binaryRead[byteCount], tmHour); + byteCount += adrv904x_insert8Bits( &binaryRead[byteCount], tmMin); + byteCount += adrv904x_insert8Bits( &binaryRead[byteCount], tmSec); + + /* Publish driver header to file */ + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + recordCrc = adrv904x_Crc32ForChunk(binaryRead, byteCount, recordCrc, ADI_FALSE); + + /* Begin publishing Device Handle */ + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + byteCount = 0U; + driverPtr = (uint8_t*) device; + for(i = 0U; i < driverStateLength; i++) + { + if(byteCount >= ADI_ADRV904X_MEM_DUMP_CHUNK_SIZE) + { + /* If at maximum length for buffer, flush */ + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + recordCrc = adrv904x_Crc32ForChunk(binaryRead, byteCount, recordCrc, ADI_FALSE); + byteCount = 0U; + } + /* Set buffer to data and increment ptr */ + byteCount += adrv904x_insert8Bits(&binaryRead[byteCount], *(driverPtr++)); + } + /* Flush remaining data, even if smaller than chunk size */ + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + /* Calculate final crc */ + recordCrc = adrv904x_Crc32ForChunk(binaryRead, byteCount, recordCrc, ADI_TRUE); + + /* Append CRC32 and padding*/ + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + recordPadding = (recordLength % 8U) ? 8U - (recordLength % 8U) : 0U; + adrv904x_insert32Bits(&binaryRead[recordPadding], recordCrc); + byteCount = 8U + recordPadding; + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + + /* Begin Radio FW Record */ + recordCrc = 0U; + byteCount = 0U; + recordType = ADI_ADRV904X_MEMDUMP_FIRMWARE_VER_RECORD; + recordLength = ADI_ADRV904X_MEMDUMP_FIRMWARE_VERSION_HEADER_SIZE; + + /* Generate basic header */ + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], recordType); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], recordLength); + /* Insert record header */ + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + byteCount = 0U; + + /* Get driver record values */ + firmwareSemverMajor = ADI_ADRV904X_CURRENT_MAJOR_VERSION; + firmwareSemverMinor = ADI_ADRV904X_CURRENT_MINOR_VERSION; + firmwareSemverPatch = ADI_ADRV904X_CURRENT_MAINTENANCE_VERSION; + firmwareSemverBuild = ADI_ADRV904X_CURRENT_BUILD_VERSION; + firmwareId = ADI_ADRV904X_MEMDUMP_RADIO_FW << ADI_ADRV904X_FIRMWARE_TYPE_ID_SHIFT; + + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], firmwareSemverMajor); + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], firmwareSemverMinor); + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], firmwareSemverPatch); + for(i = 0U; i < ADI_ADRV904X_VERSION_PREREL_SIZE; i++) + { + byteCount += adrv904x_insert8Bits(&binaryRead[byteCount], firmwareVersionPrerel[i]); + } + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], firmwareSemverBuild); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], firmwareId); + + /* Publish firmware record to file */ + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + recordCrc = adrv904x_Crc32ForChunk(binaryRead, byteCount, recordCrc, ADI_TRUE); + + /* Append CRC32 and padding*/ + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + recordPadding = (recordLength % 8U) ? 8U - (recordLength % 8U) : 0U; + adrv904x_insert32Bits(&binaryRead[recordPadding], recordCrc); + byteCount = 8U + recordPadding; + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + + + /* Begin DFE FW Record */ + recordCrc = 0U; + byteCount = 0U; + recordType = ADI_ADRV904X_MEMDUMP_FIRMWARE_VER_RECORD; + recordLength = ADI_ADRV904X_MEMDUMP_FIRMWARE_VERSION_HEADER_SIZE; + + /* Generate basic header */ + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], recordType); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], recordLength); + /* Insert record header */ + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + byteCount = 0U; + + /* Get driver record values */ + firmwareSemverMajor = device->devStateInfo.cpu.fwVersion.majorVer; + firmwareSemverMinor = device->devStateInfo.cpu.fwVersion.minorVer; + firmwareSemverPatch = device->devStateInfo.cpu.fwVersion.maintenanceVer; + firmwareSemverBuild = device->devStateInfo.cpu.fwVersion.buildVer; + firmwareId = ADI_ADRV904X_MEMDUMP_DFE_FW << ADI_ADRV904X_FIRMWARE_TYPE_ID_SHIFT; + + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], firmwareSemverMajor); + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], firmwareSemverMinor); + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], firmwareSemverPatch); + for(i = 0U; i < ADI_ADRV904X_VERSION_PREREL_SIZE; i++) + { + byteCount += adrv904x_insert8Bits(&binaryRead[byteCount], firmwareVersionPrerel[i]); + } + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], firmwareSemverBuild); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], firmwareId); + + /* Publish firmware record to file */ + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + recordCrc = adrv904x_Crc32ForChunk(binaryRead, byteCount, recordCrc, ADI_TRUE); + + /* Append CRC32 and padding*/ + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + recordPadding = (recordLength % 8U) ? 8U - (recordLength % 8U) : 0U; + adrv904x_insert32Bits(&binaryRead[recordPadding], recordCrc); + byteCount = 8U + recordPadding; + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + + /* Begin Stream FW Record */ + recordCrc = 0U; + byteCount = 0U; + recordType = ADI_ADRV904X_MEMDUMP_FIRMWARE_VER_RECORD; + recordLength = ADI_ADRV904X_MEMDUMP_FIRMWARE_VERSION_HEADER_SIZE; + + /* Generate basic header */ + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], recordType); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], recordLength); + /* Insert record header */ + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + byteCount = 0U; + + /* Get driver record values */ + firmwareSemverMajor = device->devStateInfo.cpu.devProfileVersion.majorVer; + firmwareSemverMinor = device->devStateInfo.cpu.devProfileVersion.minorVer; + firmwareSemverPatch = device->devStateInfo.cpu.devProfileVersion.maintenanceVer; + firmwareSemverBuild = device->devStateInfo.cpu.devProfileVersion.buildVer; + firmwareId = ADI_ADRV904X_MEMDUMP_STREAM_FW << ADI_ADRV904X_FIRMWARE_TYPE_ID_SHIFT; + + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], firmwareSemverMajor); + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], firmwareSemverMinor); + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], firmwareSemverPatch); + for(i = 0U; i < ADI_ADRV904X_VERSION_PREREL_SIZE; i++) + { + byteCount += adrv904x_insert8Bits(&binaryRead[byteCount], firmwareVersionPrerel[i]); + } + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], firmwareSemverBuild); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], firmwareId); + + /* Publish firmware record to file */ + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + recordCrc = adrv904x_Crc32ForChunk(binaryRead, byteCount, recordCrc, ADI_TRUE); + + /* Append CRC32 and padding*/ + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + recordPadding = (recordLength % 8U) ? 8U - (recordLength % 8U) : 0U; + adrv904x_insert32Bits(&binaryRead[recordPadding], recordCrc); + byteCount = 8U + recordPadding; + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + + + /* Begin trace record */ + recordCrc = 0U; + byteCount = 0U; + + /* Find Trace ETF buffer size */ + recoveryAction = adi_adrv904x_Register32Read( device, + NULL, + ADRV904X_A55_TRACE_FIFO_ADDR_BASE + ADRV904X_ETF_RSZ_OFFSET, + &read32, /* ETF Buffer Size / 4 */ + 0xFFFFFFFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to Read ETM memory"); + goto cleanup; + } + traceDataLength = (read32 << ADI_ADRV904X_ETF_RAM_SIZE_OFFSET); + + /* Generate basic header */ + recordType = ADI_ADRV904X_MEMDUMP_ETM_TRACE_RECORD; + recordLength = ADI_ADRV904X_MEMDUMP_TRACE_BUFFER_HEADER_SIZE + traceBufferLength + traceDataLength; + + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], recordType); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], recordLength); + + /* Insert record header */ + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + byteCount = 0U; + + /* Get remaining trace record values */ + traceFormat = ADI_ADRV904X_TRACE_FORMAT_CORESIGHT; + endianness = 0U; + + /* Compile trace record header */ + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], traceBufferLength); + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], traceFormat); + byteCount += adrv904x_insert8Bits( &binaryRead[byteCount], numCpus); + byteCount += adrv904x_insert8Bits( &binaryRead[byteCount], endianness); + /* Flush data */ + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + recordCrc = adrv904x_Crc32ForChunk(binaryRead, byteCount, recordCrc, ADI_FALSE); + byteCount = 0U; + + /* Begin loop through all relevant trace-generating devices */ + for(i = 0U; i < ADRV904X_ETM_MAX; i++) + { + if(etmOn[i] == ADI_TRUE) + { + cpuArch = ADI_ADRV904X_MEMDUMP_ARM_V8; + + recoveryAction = adi_adrv904x_Register32Read( device, + NULL, + adrv904x_DfeEtmMemDumpTable[i].baseAddr + ADRV904X_ETM_TRCIDR1_OFFSET, + &read32, + ADI_ADRV904X_TRCIDR1_ARCH_MASK); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to Read ETM memory"); + goto cleanup; + } + etmType = read32 >> ADI_ADRV904X_TRCIDR1_ARCH_SHIFT; + cpuFormat = adrv904x_DfeEtmMemDumpTable[i].format; + configLength = adrv904x_DfeEtmMemDumpTable[i].configSize * adrv904x_DfeEtmMemDumpTable[i].dataSize; + endianness = 0U; + + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], cpuArch); + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], etmType); + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], cpuFormat); + byteCount += adrv904x_insert8Bits( &binaryRead[byteCount], configLength); + byteCount += adrv904x_insert8Bits( &binaryRead[byteCount], endianness); + + /* Flush data */ + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + recordCrc = adrv904x_Crc32ForChunk(binaryRead, byteCount, recordCrc, ADI_FALSE); + + adrv904x_dumpTraceCpuData( device, + &ofp, + adrv904x_DfeEtmMemDumpTable[i].baseAddr, + &recordCrc); + + byteCount = 0U; + } + } + + /* Insert trace data size */ + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], traceDataLength); + /* Flush data */ + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + recordCrc = adrv904x_Crc32ForChunk(binaryRead, byteCount, recordCrc, ADI_FALSE); + byteCount = 0U; + + /* Insert trace data */ + traceDataLength = traceDataLength >> ADI_ADRV904X_ETF_RAM_SIZE_OFFSET; + for(i = 0U; i < (traceDataLength); i++) + { + /* Read data in 4B incements*/ + recoveryAction = adi_adrv904x_Register32Read( device, + NULL, + ADRV904X_A55_TRACE_FIFO_ADDR_BASE + ADRV904X_ETF_RRD_OFFSET, + &read32, + 0xFFFFFFFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to Read ETM memory"); + goto cleanup; + } + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], read32); + + /* Flush data if next read would exceed chunk size */ + if((byteCount + sizeof(uint32_t)) > ADI_ADRV904X_MEM_DUMP_CHUNK_SIZE) + { + /* Flush data */ + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + recordCrc = adrv904x_Crc32ForChunk(binaryRead, byteCount, recordCrc, ADI_FALSE); + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + byteCount = 0U; + } + } + /* Push remaining data */ + if(byteCount != 0U) + { + /* Flush data */ + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + } + recordCrc = adrv904x_Crc32ForChunk(binaryRead, byteCount, recordCrc, ADI_TRUE); + + /* Append CRC32 and padding*/ + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + recordPadding = (recordLength % 8U) ? 8U - (recordLength % 8U) : 0U; + adrv904x_insert32Bits(&binaryRead[recordPadding], recordCrc); + byteCount = 8U + recordPadding; + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + + /* Loop through the radio CPU RAM dump table a write memory to file */ + cpuTableSize = sizeof(adrv904x_CpuRamMemDumpTable) / sizeof(adrv904x_CpuRamMemDump_t); + if(ramOnlyFlag == 1U && cpuTableSize > ADI_ADRV904X_VRAM_ONLY_SIZE) + { + cpuTableSize = ADI_ADRV904X_VRAM_ONLY_SIZE; + } + + for (tableIdx = 0U; tableIdx < cpuTableSize; tableIdx++) + { + + startAddr = adrv904x_CpuRamMemDumpTable[tableIdx].cpuMemAddr; + endAddr = adrv904x_CpuRamMemDumpTable[tableIdx].cpuMemAddr + adrv904x_CpuRamMemDumpTable[tableIdx].cpuMemSize - 1; + + /* Generate CPU RAM Record */ + recordCrc = 0U; + byteCount = 0U; + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + + /* Insert basic record header */ + recordType = ADI_ADRV904X_MEMDUMP_CPU_RAM_RECORD; + recordLength = ADI_ADRV904X_MEMDUMP_CPU_RAM_HEADER_SIZE + adrv904x_CpuRamMemDumpTable[tableIdx].cpuMemSize; + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], recordType); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], recordLength); + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + + /* Reset values for CPU record header */ + byteCount = 0U; + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + + /* Construct CPU RAM record header */ + startAddress = startAddr; + memLength = adrv904x_CpuRamMemDumpTable[tableIdx].cpuMemSize; + ramId = adrv904x_CpuRamMemDumpTable[tableIdx].ramId; + endianness = adrv904x_CpuRamMemDumpTable[tableIdx].cpuMemEndianness; + if(startAddr >= STREAM_CPU_RAM_ADDR) + { + cpuType = ADI_ADRV904X_MEMDUMP_STREAM_CPU; + } + else + { + cpuType = ADI_ADRV904X_MEMDUMP_ARM_V7; + } + byteCount += adrv904x_insert64Bits(&binaryRead[byteCount], startAddress); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], memLength); + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], ramId); + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], cpuType); + byteCount += adrv904x_insert8Bits (&binaryRead[byteCount], endianness); + byteCount += 7U; /* Padding */ + + /* Insert CPU RAM record header */ + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + recordCrc = adrv904x_Crc32ForChunk(binaryRead, byteCount, recordCrc, ADI_FALSE); + byteCount = 0U; + + recoveryAction = adrv904x_dumpMemoryRegion( device, + &ofp, + startAddr, + endAddr, + dumpSize, + &recordCrc); + + if(recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write CRC to a binary file."); + goto cleanup; + } + + /* Append CRC32 and padding*/ + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + recordPadding = (recordLength % 8U) ? 8U - (recordLength % 8U) : 0U; + adrv904x_insert32Bits(&binaryRead[recordPadding], recordCrc); + byteCount = 8U + recordPadding; + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + + } + byteCount = 0U; + recordCrc = 0U; + + /* Loop through the radio cpu telemetry dump table a write memory to file */ + cpuTableSize = sizeof(adrv904x_TelemetryMemDumpTable) / sizeof(adrv904x_CpuMemDump_t); + if(ramOnlyFlag == 0U) + { + for (tableIdx = 0U; tableIdx < cpuTableSize; tableIdx++) + { + + startAddr = adrv904x_TelemetryMemDumpTable[tableIdx].cpuMemAddr; + endAddr = adrv904x_TelemetryMemDumpTable[tableIdx].cpuMemAddr + adrv904x_TelemetryMemDumpTable[tableIdx].cpuMemSize - 1; + + /* Generate Telemetry Buffer Record */ + recordCrc = 0U; + byteCount = 0U; + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + + /* Insert basic record header */ + recordType = ADI_ADRV904X_MEMDUMP_TELEM_RECORD; + recordLength = ADI_ADRV904X_MEMDUMP_TELEM_BUFFER_HEADER_SIZE + adrv904x_TelemetryMemDumpTable[tableIdx].cpuMemSize; + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], recordType); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], recordLength); + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + + /* Reset values for telemetry buffer record header */ + byteCount = 0U; + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + + /* Construct Telemetry record header*/ + bufferLength = adrv904x_TelemetryMemDumpTable[tableIdx].cpuMemSize; + bufferId = ADI_ADRV904X_PRODUCT_ID_MASK; + endianness = adrv904x_TelemetryMemDumpTable[tableIdx].cpuMemEndianness; + + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], bufferLength); + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], bufferId); + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], formatVersion); + byteCount += adrv904x_insert8Bits( &binaryRead[byteCount], endianness); + byteCount += 7U; /* Padding */ + + /* Insert telemetry buffer record header */ + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + recordCrc = adrv904x_Crc32ForChunk(binaryRead, byteCount, recordCrc, ADI_FALSE); + byteCount = 0U; + + recoveryAction = adrv904x_dumpMemoryRegion( device, + &ofp, + startAddr, + endAddr, + dumpSize, + &recordCrc); + + if(recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write CRC to a binary file."); + goto cleanup; + } + /* Append CRC32 and padding*/ + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + recordPadding = (recordLength % 8U) ? 8U - (recordLength % 8U) : 0U; + adrv904x_insert32Bits(&binaryRead[recordPadding], recordCrc); + byteCount = 8U + recordPadding; + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + } + } + byteCount = 0U; + recordCrc = 0U; + + /* Loop through the radio cpu memory dump table a write memory to file */ + cpuTableSize = sizeof(adrv904x_CpuMemDumpTable) / sizeof(adrv904x_CpuMemDump_t); + if(ramOnlyFlag == 0U) + { + for (tableIdx = 0U; tableIdx < cpuTableSize; tableIdx++) + { + + startAddr = adrv904x_CpuMemDumpTable[tableIdx].cpuMemAddr; + endAddr = adrv904x_CpuMemDumpTable[tableIdx].cpuMemAddr + adrv904x_CpuMemDumpTable[tableIdx].cpuMemSize - 1; + + /* Generate Register Record */ + recordCrc = 0U; + byteCount = 0U; + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + + /* Insert basic record header */ + recordType = ADI_ADRV904X_MEMDUMP_REG_RECORD; + recordLength = ADI_ADRV904X_MEMDUMP_REGISTER_HEADER_SIZE + adrv904x_CpuMemDumpTable[tableIdx].cpuMemSize; + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], recordType); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], recordLength); + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + + /* Reset values for register record header */ + byteCount = 0U; + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + + + /* Construct Register record header*/ + startAddress = adrv904x_CpuMemDumpTable[tableIdx].cpuMemAddr; + length = adrv904x_CpuMemDumpTable[tableIdx].cpuMemSize; + registerWidth = adrv904x_CpuMemDumpTable[tableIdx].cpuMemWidth; + endianness = adrv904x_CpuMemDumpTable[tableIdx].cpuMemEndianness; + + byteCount += adrv904x_insert64Bits(&binaryRead[byteCount], startAddress); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], length); + byteCount += adrv904x_insert8Bits( &binaryRead[byteCount], registerWidth); + byteCount += adrv904x_insert8Bits( &binaryRead[byteCount], endianness); + byteCount += 2U; /* Padding */ + + /* Insert register buffer record header */ + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + recordCrc = adrv904x_Crc32ForChunk(binaryRead, byteCount, recordCrc, ADI_FALSE); + byteCount = 0U; + + recoveryAction = adrv904x_dumpMemoryRegion( device, + &ofp, + startAddr, + endAddr, + dumpSize, + &recordCrc); + + if(recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write CRC to a binary file."); + goto cleanup; + } + + /* Append CRC32 and padding*/ + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + recordPadding = (recordLength % 8U) ? 8U - (recordLength % 8U) : 0U; + adrv904x_insert32Bits(&binaryRead[recordPadding], recordCrc); + byteCount = 8U + recordPadding; + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + } + } + byteCount = 0U; + + + while ((forceException == 1U) && (count < DFE_EXCEPTION_DONE_MAX_COUNT)) + { + /* Get the CPU boot status */ + recoveryAction = adrv904x_Core_ScratchReg_BfGet(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_SPI_ONLY_REGS, + ADRV904X_DFE_BOOT_STATUS_SCRATCH_REG_ID, + (uint8_t*) &bootStatus); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "bootStatus read failed"); + goto cleanup; + } + if (bootStatus == ADRV904X_DFE_SVC_ERR_DFE_BOOT_STATUS_EXCEPTION_DONE) + { + break; + } + else + { + count++; + recoveryAction = (adi_adrv904x_ErrAction_e)adi_common_hal_Wait_us(&device->common, DFE_EXCEPTION_DONE_WAIT_US); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "HAL Wait Request Issue"); + goto cleanup; + } + } + } + /* Loop through the dfe memory dump table a write dfe memory to file */ + dfeTableSize = sizeof(adrv904x_DfeMemDumpTable) / sizeof(adrv904x_CpuRamMemDump_t); + for (tableIdx = 0U; tableIdx < dfeTableSize; tableIdx++) + { + startAddr = adrv904x_DfeMemDumpTable[tableIdx].cpuMemAddr; + endAddr = adrv904x_DfeMemDumpTable[tableIdx].cpuMemAddr + adrv904x_DfeMemDumpTable[tableIdx].cpuMemSize - 1; + /* Generate CPU RAM Record */ + recordCrc = 0U; + byteCount = 0U; + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + + /* Insert basic record header */ + recordType = ADI_ADRV904X_MEMDUMP_CPU_RAM_RECORD; + recordLength = ADI_ADRV904X_MEMDUMP_CPU_RAM_HEADER_SIZE + adrv904x_DfeMemDumpTable[tableIdx].cpuMemSize; + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], recordType); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], recordLength); + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + + /* Reset values for DFE RAM record header */ + byteCount = 0U; + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); /* Set binary to 0's */ + + /* Construct DFE RAM record header */ + startAddress = startAddr; + memLength = adrv904x_DfeMemDumpTable[tableIdx].cpuMemSize; + ramId = adrv904x_DfeMemDumpTable[tableIdx].ramId; + cpuType = ADI_ADRV904X_MEMDUMP_ARM_V8; + endianness = adrv904x_DfeMemDumpTable[tableIdx].cpuMemEndianness; + byteCount += adrv904x_insert64Bits(&binaryRead[byteCount], startAddress); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], memLength); + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], ramId); + byteCount += adrv904x_insert16Bits(&binaryRead[byteCount], cpuType); + byteCount += adrv904x_insert8Bits (&binaryRead[byteCount], endianness); + byteCount += 7U; /* Padding */ + + /* Insert DFE RAM record header */ + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + recordCrc = adrv904x_Crc32ForChunk(binaryRead, byteCount, recordCrc, ADI_FALSE); + byteCount = 0U; + + if (startAddr == 0) + { + break; /* last entry */ + } + + /* if the cpuMemSize = 1, set the sizeFlag as 1 to ensure enter the below loop */ + if (startAddr == endAddr) + { + sizeFlag = 1; + } + + for (offset = startAddr; ((offset < endAddr) || (1 == sizeFlag)); offset += ADI_ADRV904X_MEM_DUMP_CHUNK_SIZE) + { + /* Clean the flag for waiting for next cpuMemSize = 1 */ + sizeFlag = 0; + if (offset < (endAddr - ADI_ADRV904X_MEM_DUMP_CHUNK_SIZE)) + { + byteCount = ADI_ADRV904X_MEM_DUMP_CHUNK_SIZE; + } + else + { + byteCount = endAddr + 1 - offset; + } + + *dumpSize += byteCount; + + + skipRead = ADI_FALSE; + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); + + for (i = 0; i < sizeof(cpuCrashAddr) / sizeof(uint32_t); i++) + { + if (offset == cpuCrashAddr[i]) + { + skipRead = ADI_TRUE; + break; + } + } + + if (skipRead == ADI_FALSE) + { + + /* DIRECT READ Byte */ + if ((offset >= SPI_ONLY_REGS_ADDR) && + (offset < (SPI_ONLY_REGS_ADDR + DIRECT_SPI_REGION_LEN))) + { + for (i = 0; i < byteCount; i++) + { + recoveryAction = adi_adrv904x_Register32Read(device, NULL, offset + i, &read32, 0xFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset + i, "Unable to Read dfe memory"); + goto cleanup; + } + binaryRead[i] = (uint8_t)read32; + } + } + else + { + recoveryAction = adi_adrv904x_Registers32Read(device, NULL, offset, (uint32_t *)binaryRead, NULL, (byteCount + 3) / 4); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Unable to Read dfe memory"); + goto cleanup; + } + } + } + + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + + if (offset >= endAddr - ADI_ADRV904X_MEM_DUMP_CHUNK_SIZE) + { + recordCrc = adrv904x_Crc32ForChunk(binaryRead, byteCount, recordCrc, ADI_TRUE); + } + else + { + recordCrc = adrv904x_Crc32ForChunk(binaryRead, byteCount, recordCrc, ADI_FALSE); + } + } + /* Append CRC32 and padding*/ + ADI_LIBRARY_MEMSET(binaryRead, 0U, sizeof(binaryRead)); /* Set binary to 0's */ + recordPadding = (recordLength % 8U) ? 8U - (recordLength % 8U) : 0U; + adrv904x_insert32Bits(&binaryRead[recordPadding], recordCrc); + byteCount = 8U + recordPadding; + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + goto cleanup; + } + } + +cleanup: + /*Close ARM binary file*/ + if (ofp != NULL) + { + if (ADI_LIBRARY_FCLOSE(ofp) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to close a binary file. Possible memory shortage while flushing / other I/O errors."); + } + } + + /* Disable the Tx slice clock of the uninitialized TX channels to retrieve the normal status before memory dump */ + sliceClkEn = 0x00U; + for (txChanId = 0U; txChanId <= ADI_ADRV904X_TX_CHAN_ID_MAX; txChanId++) + { + if (((device->devStateInfo.initializedChannels >> ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET) & (0x01 << (uint32_t)txChanId)) == 0U) + { + adrv904x_TxDig_TxAttenClkEnable_BfSet(device, NULL, txDigBaseAddr[txChanId], sliceClkEn); + } + } + + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} +static uint32_t adrv904x_insert64Bits( uint8_t* array, + uint64_t storeVariable) +{ + if(array == NULL) + { + return 0U; /* Return number of Bytes stored */ + } + *(array++) = storeVariable & 0xFFU; + *(array++) = (storeVariable >> 8) & 0xFFU; + *(array++) = (storeVariable >> 16) & 0xFFU; + *(array++) = (storeVariable >> 24) & 0xFFU; + *(array++) = (storeVariable >> 32) & 0xFFU; + *(array++) = (storeVariable >> 40) & 0xFFU; + *(array++) = (storeVariable >> 48) & 0xFFU; + *(array) = (storeVariable >> 56) & 0xFFU; + return 8U; /* Return number of Bytes stored */ +} +static uint32_t adrv904x_insert32Bits( uint8_t* array, + uint32_t storeVariable) +{ + if(array == NULL) + { + return 0U; /* Return number of Bytes stored */ + } + *(array++) = storeVariable & 0xFFU; + *(array++) = (storeVariable >> 8) & 0xFFU; + *(array++) = (storeVariable >> 16) & 0xFFU; + *(array) = (storeVariable >> 24) & 0xFFU; + return 4U; +} +static uint32_t adrv904x_insert16Bits( uint8_t* array, + uint16_t storeVariable) +{ + if(array == NULL) + { + return 0U; /* Return number of Bytes stored */ + } + *(array++) = storeVariable & 0xFFU; + *(array) = (storeVariable >> 8) & 0xFFU; + return 2U; /* Return number of Bytes stored */ +} +static uint32_t adrv904x_insert8Bits( uint8_t* array, + uint8_t storeVariable) +{ + if(array == NULL) + { + return 0U; /* Return number of Bytes stored */ + } + *(array) = storeVariable & 0xFFU; + return 1U; /* Return number of Bytes stored */ +} + +static adi_adrv904x_ErrAction_e adrv904x_dumpMemoryRegion( adi_adrv904x_Device_t* const device, + FILE **ofp, + uint32_t startAddr, + uint32_t endAddr, + uint32_t* const dumpSize, + uint32_t *recordCrc) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint32_t sizeFlag = 0U; + uint32_t offset = 0U; + uint32_t byteCount = 0U; + uint32_t read32 = 0U; + uint32_t i = 0U; + uint8_t skipRead = ADI_FALSE; + uint8_t binaryRead[ADI_ADRV904X_MEM_DUMP_CHUNK_SIZE + 10] = { 0U }; + const uint32_t cpuCrashAddr[] = { 0U }; /* Skip these addresses that causes CPU crash */ + const uint32_t SPI_ONLY_REGS_ADDR = 0x47000000U; + const uint32_t DIRECT_SPI_REGION_LEN = 0x4000U; + const uint32_t HARDWARE_SEMAPHORE_ADDR = 0x46500000U; + const uint32_t HARDWARE_SEMAPHORE_LEN = 0x200000U; + + if (startAddr == 0) + { + return ADI_ADRV904X_ERR_ACT_NONE; /* last entry */ + } + + /* if the cpuMemSize = 1, set the sizeFlag as 1 to ensure enter the below loop */ + if (startAddr == endAddr) + { + sizeFlag = 1U; + } + + for (offset = startAddr; ((offset < endAddr) || (1 == sizeFlag)); offset += ADI_ADRV904X_MEM_DUMP_CHUNK_SIZE) + { + /* Clean the flag for waiting for next cpuMemSize = 1 */ + sizeFlag = 0U; + if (offset < (endAddr - ADI_ADRV904X_MEM_DUMP_CHUNK_SIZE)) + { + byteCount = ADI_ADRV904X_MEM_DUMP_CHUNK_SIZE; + } + else + { + byteCount = endAddr + 1 - offset; + } + + *dumpSize += byteCount; + + + skipRead = ADI_FALSE; + ADI_LIBRARY_MEMSET(binaryRead, 0, sizeof(binaryRead)); + + for (i = 0U; i < sizeof(cpuCrashAddr) / sizeof(uint32_t); i++) + { + if (offset == cpuCrashAddr[i]) + { + skipRead = ADI_TRUE; + break; + } + } + + if (skipRead == ADI_FALSE) + { + + /* DIRECT READ Byte */ + if ((offset >= SPI_ONLY_REGS_ADDR) && + (offset < (SPI_ONLY_REGS_ADDR + DIRECT_SPI_REGION_LEN))) + { + for (i = 0; i < byteCount; i++) + { + recoveryAction = adi_adrv904x_Register32Read(device, NULL, offset + i, &read32, 0xFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset + i, "Unable to Read Cpu memory"); + return recoveryAction; + } + binaryRead[i] = (uint8_t)read32; + } + } + else + { + recoveryAction = adi_adrv904x_Registers32Read(device, NULL, offset, (uint32_t *)binaryRead, NULL, (byteCount + 3) / 4); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Unable to Read Cpu memory"); + return recoveryAction; + } + /* + * Hardware semaphore register check and reset operation: + * Hardware semaphore register will be set to 0x00 on read, + * The value will be set to all 1s on read if current value is all 0s, + * So need to retrieve the value after reading it in the CpuMemDump + */ + if (((offset + byteCount) < (HARDWARE_SEMAPHORE_ADDR + HARDWARE_SEMAPHORE_LEN)) && + (offset >= HARDWARE_SEMAPHORE_ADDR)) + { + recoveryAction = adi_adrv904x_Registers32Write(device, NULL, &offset, (uint32_t *)binaryRead, NULL, (byteCount + 3) / 4); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Unable to re-write the hardware semaphore"); + return recoveryAction; + } + } + } + } + + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + *ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + return recoveryAction; + } + /* Add the CRC value at the end of Radio side memory dump */ + if (offset >= endAddr - ADI_ADRV904X_MEM_DUMP_CHUNK_SIZE) + { + *recordCrc = adrv904x_Crc32ForChunk(binaryRead, byteCount, *recordCrc, ADI_TRUE); + } + else + { + *recordCrc = adrv904x_Crc32ForChunk(binaryRead, byteCount, *recordCrc, ADI_FALSE); + } + } + return ADI_ADRV904X_ERR_ACT_NONE; +} + + +static adi_adrv904x_ErrAction_e adrv904x_dumpTraceCpuData( adi_adrv904x_Device_t* const device, + FILE **ofp, + uint32_t baseAddr, + uint32_t *recordCrc) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + if (ofp == NULL || *ofp == NULL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, *ofp, "Unable to open binary image file. Please check if the path is correct"); + return recoveryAction; + } + + uint32_t byteCount = 0x0U; + uint32_t padding = 0x0U; + uint8_t binaryRead[ADI_ADRV904X_MEM_DUMP_CHUNK_SIZE + 10] = { 0U }; + + /* TODO: This should be ETM type specific? */ + uint32_t trcconfigr; + uint32_t trctraceidr; + uint32_t trcauthstatus; + uint32_t trcidr0; + uint32_t trcidr1; + uint32_t trcidr2; + uint32_t trcidr8; + uint32_t trcidr9; + uint32_t trcidr10; + uint32_t trcidr11; + uint32_t trcidr12; + uint32_t trcidr13; + + /* Set config values */ + recoveryAction = adi_adrv904x_Register32Read( device, + NULL, + baseAddr + ADRV904X_ETM_TRCCONFIGR_OFFSET, + &trcconfigr, + 0xFFFFFFFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to Read ETM memory"); + return recoveryAction; + } + recoveryAction = adi_adrv904x_Register32Read( device, + NULL, + baseAddr + ADRV904X_ETM_TRCTRACEIDR_OFFSET, + &trctraceidr, + 0xFFFFFFFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to Read ETM memory"); + return recoveryAction; + } + trcauthstatus = 0x0U; + recoveryAction = adi_adrv904x_Register32Read( device, + NULL, + baseAddr + ADRV904X_ETM_TRCIDR0_OFFSET, + &trcidr0, + 0xFFFFFFFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to Read ETM memory"); + return recoveryAction; + } + recoveryAction = adi_adrv904x_Register32Read( device, + NULL, + baseAddr + ADRV904X_ETM_TRCIDR1_OFFSET, + &trcidr1, + 0xFFFFFFFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to Read ETM memory"); + return recoveryAction; + } + recoveryAction = adi_adrv904x_Register32Read( device, + NULL, + baseAddr + ADRV904X_ETM_TRCIDR2_OFFSET, + &trcidr2, + 0xFFFFFFFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Unable to Read ETM memory"); + return recoveryAction; + } + trcidr8 = 0x0U; + trcidr9 = 0x0U; + trcidr10 = 0x0U; + trcidr11 = 0x0U; + trcidr12 = 0x0U; + trcidr13 = 0x0U; + + /* Push config values */ + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], trcconfigr); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], trctraceidr); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], trcauthstatus); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], trcidr0); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], trcidr1); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], trcidr2); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], trcidr8); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], trcidr9); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], trcidr10); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], trcidr11); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], trcidr12); + byteCount += adrv904x_insert32Bits(&binaryRead[byteCount], trcidr13); + + padding = ((byteCount % 8U) ? 8U - (byteCount % 8U) : 0U); + byteCount += padding; + + if (ADI_LIBRARY_FWRITE(binaryRead, + 1, + byteCount, + *ofp) != byteCount) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Fatal error while trying to write a binary file."); + return recoveryAction; + } + *recordCrc = adrv904x_Crc32ForChunk(binaryRead, byteCount, *recordCrc, ADI_FALSE); + + return ADI_ADRV904X_ERR_ACT_NONE; +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuMemDump(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuMemDumpBinaryInfo_t* const cpuMemDumpBinaryInfoPtr, + const uint8_t forceException, + uint32_t* const dumpSize) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuMemDumpBinaryInfoPtr, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dumpSize, cleanup); + + + recoveryAction = adrv904x_CpuMemDumpBinWrite(device, cpuMemDumpBinaryInfoPtr, forceException, dumpSize, 0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CpuMemDump_vRamOnly(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuMemDumpBinaryInfo_t* const cpuMemDumpBinaryInfoPtr, + const uint8_t forceException, + uint32_t* const dumpSize) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuMemDumpBinaryInfoPtr, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, dumpSize, cleanup); + + + recoveryAction = adrv904x_CpuMemDumpBinWrite(device, cpuMemDumpBinaryInfoPtr, forceException, dumpSize, 1U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, ADI_NO_ERROR_MESSAGE); + goto cleanup; + } + + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_JrxRepairSwCEnableGet(adi_adrv904x_Device_t* const device, + uint8_t* const swcEnMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + uint8_t ctrlDataSet[9U]; + uint8_t ctrlDataGet[9U]; + uint8_t usedDeserLanes = 0U; + uint8_t localSwcEnMask = 0U; + uint8_t laneSel = 0U; + + uint32_t lengthResp = 0U; + uint32_t timeElapsedUs = 0U; + uint32_t index = 0U; + uint32_t laneCnt = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, swcEnMask, cleanup); + + /* Prepare the command payload */ + ctrlDataSet[0] = 0x00U; + ctrlDataSet[1] = (uint8_t)ADRV904X_SERDES_TEST_CMD; + ctrlDataSet[2] = (uint8_t)ADRV904X_SERDES_TEST_SET_VCM_SWC; + ctrlDataSet[3] = 0x01U; + ctrlDataSet[4] = 0x00U; + ctrlDataSet[5] = 0x00U; + ctrlDataSet[6] = 0x00U; + ctrlDataSet[7] = 0x00U; + ctrlDataSet[8] = 0x00U; + + for (index = 0U; index < (uint32_t)ADI_ADRV904X_MAX_DEFRAMERS; index++) + { + usedDeserLanes |= device->initExtract.jesdSetting.deframerSetting[index].deserialLaneEnabled; + } + + /* Run the command for two used lanes */ + for (index = 0U; (index < (uint32_t)ADI_ADRV904X_MAX_DESERIALIZER_LANES) && (laneCnt < 2U); index++) + { + laneSel = (1U << index); + + if ((usedDeserLanes & laneSel) == 0U) + { + continue; + } + + laneCnt++; + ctrlDataSet[0] = (uint8_t)index; + + /* Exec command */ + recoveryAction = adi_adrv904x_CpuControlCmdExec(device, + ADRV904X_CPU_OBJID_IC_SERDES, + ADRV904X_SERDES_CTRL_SET_FSM_CMD, + (adi_adrv904x_Channels_e)laneSel, + ctrlDataSet, + sizeof(ctrlDataSet), + &lengthResp, + ctrlDataGet, + sizeof(ctrlDataGet)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to run Jrx VCM Switch C Set command"); + goto cleanup; + } + + /* Poll Serdes Calibration Status for completion of the SwC set Command */ + for (timeElapsedUs = 0U; timeElapsedUs < ADI_ADRV904X_TRACKCALDISABLE_TIMEOUT_US; timeElapsedUs += ADI_ADRV904X_TRACKCALDISABLE_INTERVAL_US) + { + /* Get Serdes Calibration Status */ + recoveryAction = adi_adrv904x_CalSpecificStatusGet( device, + (adi_adrv904x_Channels_e)laneSel, + ADRV904X_CPU_OBJID_TC_SERDES, + ctrlDataGet, + sizeof(ctrlDataGet)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get SwC set Command status failed"); + goto cleanup; + } + + /* Break out here if SwC set Command have been completed */ + if (ctrlDataGet[1] == (uint8_t)ADRV904X_SERDES_TEST_CMD_DONE) + { + break; + } + + /* SwC set Command is still in progress. Wait the specified wait interval, then check again for status. */ + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_Wait_us(&device->common, ADI_ADRV904X_TRACKCALDISABLE_INTERVAL_US); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "HAL Wait Issue"); + goto cleanup; + } + } + + /* Check for timeout */ + if (timeElapsedUs >= ADI_ADRV904X_TRACKCALDISABLE_TIMEOUT_US) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_FEATURE; + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_TIMEOUT, + recoveryAction, + timeElapsedUs, + "SwC set Command Timeout"); + goto cleanup; + } + + localSwcEnMask |= ctrlDataGet[ADRV904X_SERDES_CTRL_FSM_CMD_RSP_HDR_SIZE_BYTES]; + } + + *swcEnMask = localSwcEnMask; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_JrxRepairSwCEnableSet(adi_adrv904x_Device_t* const device, + const uint8_t swcEnMask) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + + uint8_t ctrlDataSet[9U]; + uint8_t ctrlDataGet[9U]; + uint8_t usedDeserLanes = 0U; + uint8_t laneSel = 0U; + + uint32_t lengthResp = 0U; + uint32_t timeElapsedUs = 0U; + uint32_t index = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_LIBRARY_MEMSET(ctrlDataSet, 0U, sizeof(ctrlDataSet)); + ADI_LIBRARY_MEMSET(ctrlDataGet, 0U, sizeof(ctrlDataGet)); + + for (index = 0U; index < (uint32_t)ADI_ADRV904X_MAX_DEFRAMERS; index++) + { + usedDeserLanes |= device->initExtract.jesdSetting.deframerSetting[index].deserialLaneEnabled; + } + + /* get first used lane */ + for (index = 0U; index < (uint32_t)ADI_ADRV904X_MAX_DESERIALIZER_LANES; index++) + { + laneSel = (1U << index); + if ((usedDeserLanes & laneSel) != 0U) + { + break; + } + } + + /* Prepare the command payload */ + ctrlDataSet[0] = (uint8_t)index; + ctrlDataSet[1] = (uint8_t)ADRV904X_SERDES_TEST_CMD; + ctrlDataSet[2] = (uint8_t)ADRV904X_SERDES_TEST_SET_VCM_SWC; + ctrlDataSet[3] = 0x01U; + ctrlDataSet[4] = usedDeserLanes; + ctrlDataSet[5] = swcEnMask; + ctrlDataSet[6] = usedDeserLanes; + ctrlDataSet[7] = swcEnMask; + ctrlDataSet[8] = (swcEnMask == 0x00U) ? 0x00U : 0x01U; + + /* Exec command */ + recoveryAction = adi_adrv904x_CpuControlCmdExec(device, + ADRV904X_CPU_OBJID_IC_SERDES, + ADRV904X_SERDES_CTRL_SET_FSM_CMD, + (adi_adrv904x_Channels_e)laneSel, + ctrlDataSet, + sizeof(ctrlDataSet), + &lengthResp, + ctrlDataGet, + sizeof(ctrlDataGet)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to run Jrx VCM Switch C Set command"); + goto cleanup; + } + + /* Poll Serdes Calibration Status for completion of the SwC set Command */ + for (timeElapsedUs = 0U; timeElapsedUs < ADI_ADRV904X_TRACKCALDISABLE_TIMEOUT_US; timeElapsedUs += ADI_ADRV904X_TRACKCALDISABLE_INTERVAL_US) + { + /* Get Serdes Calibration Status */ + recoveryAction = adi_adrv904x_CalSpecificStatusGet( device, + (adi_adrv904x_Channels_e)laneSel, + ADRV904X_CPU_OBJID_TC_SERDES, + ctrlDataGet, + sizeof(ctrlDataGet)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Get SwC set Command status failed"); + goto cleanup; + } + + /* Break out here if SwC set Command have been completed */ + if (ctrlDataGet[1] == (uint8_t)ADRV904X_SERDES_TEST_CMD_DONE) + { + break; + } + + /* SwC set Command is still in progress. Wait the specified wait interval, then check again for status. */ + recoveryAction = (adi_adrv904x_ErrAction_e) adi_common_hal_Wait_us(&device->common, ADI_ADRV904X_TRACKCALDISABLE_INTERVAL_US); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "HAL Wait Issue"); + goto cleanup; + } + } + + /* Check for timeout */ + if (timeElapsedUs >= ADI_ADRV904X_TRACKCALDISABLE_TIMEOUT_US) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_FEATURE; + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_TIMEOUT, + recoveryAction, + timeElapsedUs, + "SwC set Command Timeout"); + goto cleanup; + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_JrxRepairVcmLanesFix(adi_adrv904x_Device_t* const device, + uint8_t laneMask, + uint8_t enableFix) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t index = 0U; + uint8_t numDeserLanesUsed = 0U; + uint8_t actionLaneSelector = 0U; + + const uint8_t swcVcmDisabled = 0U; + const uint8_t swcVcmEnabledLaneUsed = 1U; + const uint8_t swcVcmEnabledLaneUnused = 2U; + + static const uint32_t DESER_PD_REG_0_ADDRESS[] = { + ADRV904X_ADDR_DESER_PHY0_PD_REG_0, + ADRV904X_ADDR_DESER_PHY1_PD_REG_0, + ADRV904X_ADDR_DESER_PHY2_PD_REG_0, + ADRV904X_ADDR_DESER_PHY3_PD_REG_0, + ADRV904X_ADDR_DESER_PHY4_PD_REG_0, + ADRV904X_ADDR_DESER_PHY5_PD_REG_0, + ADRV904X_ADDR_DESER_PHY6_PD_REG_0, + ADRV904X_ADDR_DESER_PHY7_PD_REG_0 + }; + /* reg add; disable swc/subs; enable used swc/subs; enabled unused swc/subs */ + static const uint32_t DESER_PD_REG_0_VALUE[] = { + 0x01U, /* Reset value of register */ + 0xFFU, /* No power-downs on the enabled lanes */ + 0x35U /* Several power-downs on the disabled lanes to save power */ + }; + + static const uint32_t DESER_PD_REG_1_ADDRESS[] = { + ADRV904X_ADDR_DESER_PHY0_PD_REG_1, + ADRV904X_ADDR_DESER_PHY1_PD_REG_1, + ADRV904X_ADDR_DESER_PHY2_PD_REG_1, + ADRV904X_ADDR_DESER_PHY3_PD_REG_1, + ADRV904X_ADDR_DESER_PHY4_PD_REG_1, + ADRV904X_ADDR_DESER_PHY5_PD_REG_1, + ADRV904X_ADDR_DESER_PHY6_PD_REG_1, + ADRV904X_ADDR_DESER_PHY7_PD_REG_1, + }; + /* reg add; disable swc/subs; enable used swc/subs; enabled unused swc/subs */ + static const uint32_t DESER_PD_REG_1_VALUE[] = { + 0x00U, /* Reset value of register */ + 0x02U, /* Powers down the CM amp on the enabled lanes. */ + 0x07U /* More power-down facilities on the disabled lanes to save power */ + }; + + static const uint32_t DESER_CORE1P2_TEST_ADDRESS[] = { + ADRV904X_ADDR_DESER_PHY0_CORE1P2_TEST, + ADRV904X_ADDR_DESER_PHY1_CORE1P2_TEST, + ADRV904X_ADDR_DESER_PHY2_CORE1P2_TEST, + ADRV904X_ADDR_DESER_PHY3_CORE1P2_TEST, + ADRV904X_ADDR_DESER_PHY4_CORE1P2_TEST, + ADRV904X_ADDR_DESER_PHY5_CORE1P2_TEST, + ADRV904X_ADDR_DESER_PHY6_CORE1P2_TEST, + ADRV904X_ADDR_DESER_PHY7_CORE1P2_TEST + }; + /* reg add; disable swc/subs; enable used swc/subs; enabled unused swc/subs */ + static const uint32_t DESER_CORE1P2_TEST_VALUE[] = { + 0x00U, /* Reset value of register */ + 30U, /*This connects the CM node of the used lanes to the AMUX*/ + 29U, /*This connects the CM bias node of the unused lanes to the AMUX*/ + }; + + static const uint32_t DESER_CORE1P2_DECFE_CTL0_ADDRESS[] = { + ADRV904X_ADDR_DESER_PHY0_CORE1P2_DECFE_CTL0, + ADRV904X_ADDR_DESER_PHY1_CORE1P2_DECFE_CTL0, + ADRV904X_ADDR_DESER_PHY2_CORE1P2_DECFE_CTL0, + ADRV904X_ADDR_DESER_PHY3_CORE1P2_DECFE_CTL0, + ADRV904X_ADDR_DESER_PHY4_CORE1P2_DECFE_CTL0, + ADRV904X_ADDR_DESER_PHY5_CORE1P2_DECFE_CTL0, + ADRV904X_ADDR_DESER_PHY6_CORE1P2_DECFE_CTL0, + ADRV904X_ADDR_DESER_PHY7_CORE1P2_DECFE_CTL0 + }; + /* reg add; disable swc/subs; enable used swc/subs; enabled unused swc/subs */ + static const uint32_t DESER_CORE1P2_DECFE_CTL0_VALUE[] = { + 0x00U, /* Reset value of register */ + 0xFFU, /* No power-downs on the enabled lanes */ + 0x0FU /* More power-down facilities on the disabled lanes */ + }; + + static const uint32_t DESER_CORE1P2_DECFE_CTL18_ADDRESS[] = { + ADRV904X_ADDR_DESER_PHY0_CORE1P2_DECFE_CTL18, + ADRV904X_ADDR_DESER_PHY1_CORE1P2_DECFE_CTL18, + ADRV904X_ADDR_DESER_PHY2_CORE1P2_DECFE_CTL18, + ADRV904X_ADDR_DESER_PHY3_CORE1P2_DECFE_CTL18, + ADRV904X_ADDR_DESER_PHY4_CORE1P2_DECFE_CTL18, + ADRV904X_ADDR_DESER_PHY5_CORE1P2_DECFE_CTL18, + ADRV904X_ADDR_DESER_PHY6_CORE1P2_DECFE_CTL18, + ADRV904X_ADDR_DESER_PHY7_CORE1P2_DECFE_CTL18 + }; + /* reg add; disable swc/subs; enable used swc/subs; enabled unused swc/subs */ + static const uint32_t DESER_CORE1P2_DECFE_CTL18_VALUE[] = { + 0x00U, /* Reset value of register */ + 0xFFU, /* No power-downs on the enabled lanes */ + 0x01U /* More power-down facilities on the disabled lanes */ + }; + static const uint32_t DESER_CORE1P2_DECFE_CTL28_ADDRESS[] = { + ADRV904X_ADDR_DESER_PHY0_CORE1P2_DECFE_CTL28, + ADRV904X_ADDR_DESER_PHY1_CORE1P2_DECFE_CTL28, + ADRV904X_ADDR_DESER_PHY2_CORE1P2_DECFE_CTL28, + ADRV904X_ADDR_DESER_PHY3_CORE1P2_DECFE_CTL28, + ADRV904X_ADDR_DESER_PHY4_CORE1P2_DECFE_CTL28, + ADRV904X_ADDR_DESER_PHY5_CORE1P2_DECFE_CTL28, + ADRV904X_ADDR_DESER_PHY6_CORE1P2_DECFE_CTL28, + ADRV904X_ADDR_DESER_PHY7_CORE1P2_DECFE_CTL28 + }; + /* reg add; disable swc/subs; enable used swc/subs; enabled unused swc/subs */ + static const uint32_t DESER_CORE1P2_DECFE_CTL28_VALUE[] = { + 0x00U, /* Reset value of register */ + 0xFFU, /* Not used on used lanes */ + 0xFFU /* More power-down facilities on the disabled lanes */ + }; + static const uint32_t DESER_CORE1P2_DECFE_CTL31_ADDRESS[] = { + ADRV904X_ADDR_DESER_PHY0_CORE1P2_DECFE_CTL31, + ADRV904X_ADDR_DESER_PHY1_CORE1P2_DECFE_CTL31, + ADRV904X_ADDR_DESER_PHY2_CORE1P2_DECFE_CTL31, + ADRV904X_ADDR_DESER_PHY3_CORE1P2_DECFE_CTL31, + ADRV904X_ADDR_DESER_PHY4_CORE1P2_DECFE_CTL31, + ADRV904X_ADDR_DESER_PHY5_CORE1P2_DECFE_CTL31, + ADRV904X_ADDR_DESER_PHY6_CORE1P2_DECFE_CTL31, + ADRV904X_ADDR_DESER_PHY7_CORE1P2_DECFE_CTL31 + }; + /* reg add; disable swc/subs; enable used swc/subs; enabled unused swc/subs */ + static const uint32_t DESER_CORE1P2_DECFE_CTL31_VALUE[] = { + 0x00U, /* Reset value of register */ + 0xFFU, /* Not used on used lanes */ + 0x01U /* More power-down facilities on the disabled lanes */ + }; + + static const uint32_t DESER_CORE1P2_DECFE_CTL41_ADDRESS[] = { + ADRV904X_ADDR_DESER_PHY0_CORE1P2_DECFE_CTL41, + ADRV904X_ADDR_DESER_PHY1_CORE1P2_DECFE_CTL41, + ADRV904X_ADDR_DESER_PHY2_CORE1P2_DECFE_CTL41, + ADRV904X_ADDR_DESER_PHY3_CORE1P2_DECFE_CTL41, + ADRV904X_ADDR_DESER_PHY4_CORE1P2_DECFE_CTL41, + ADRV904X_ADDR_DESER_PHY5_CORE1P2_DECFE_CTL41, + ADRV904X_ADDR_DESER_PHY6_CORE1P2_DECFE_CTL41, + ADRV904X_ADDR_DESER_PHY7_CORE1P2_DECFE_CTL41 + }; + /* reg add; disable swc/subs; enable used swc/subs; enabled unused swc/subs */ + static const uint32_t DESER_CORE1P2_DECFE_CTL41_VALUE[] = { + 0x00U, /* Reset value of register */ + 0x00U, /* Not used on used lanes */ + 0xFFU /* More power-down facilities on the disabled lanes */ + }; + static const uint32_t DESER_CORE1P2_DECFE_CTL43_ADDRESS[] = { + ADRV904X_ADDR_DESER_PHY0_CORE1P2_DECFE_CTL43, + ADRV904X_ADDR_DESER_PHY1_CORE1P2_DECFE_CTL43, + ADRV904X_ADDR_DESER_PHY2_CORE1P2_DECFE_CTL43, + ADRV904X_ADDR_DESER_PHY3_CORE1P2_DECFE_CTL43, + ADRV904X_ADDR_DESER_PHY4_CORE1P2_DECFE_CTL43, + ADRV904X_ADDR_DESER_PHY5_CORE1P2_DECFE_CTL43, + ADRV904X_ADDR_DESER_PHY6_CORE1P2_DECFE_CTL43, + ADRV904X_ADDR_DESER_PHY7_CORE1P2_DECFE_CTL43 + }; + /* reg add; disable swc/subs; enable used swc/subs; enabled unused swc/subs */ + static const uint32_t DESER_CORE1P2_DECFE_CTL43_VALUE[] = { + 0x00U, /* Reset value of register */ + 0xFFU, /* Not used on used lanes */ + 0x80U /* More power-down facilities on the disabled lanes */ + }; + static const uint32_t DESER_CORE1P2_DECFE_CTL45_ADDRESS[] = { + ADRV904X_ADDR_DESER_PHY0_CORE1P2_DECFE_CTL45, + ADRV904X_ADDR_DESER_PHY1_CORE1P2_DECFE_CTL45, + ADRV904X_ADDR_DESER_PHY2_CORE1P2_DECFE_CTL45, + ADRV904X_ADDR_DESER_PHY3_CORE1P2_DECFE_CTL45, + ADRV904X_ADDR_DESER_PHY4_CORE1P2_DECFE_CTL45, + ADRV904X_ADDR_DESER_PHY5_CORE1P2_DECFE_CTL45, + ADRV904X_ADDR_DESER_PHY6_CORE1P2_DECFE_CTL45, + ADRV904X_ADDR_DESER_PHY7_CORE1P2_DECFE_CTL45 + }; + /* reg add; disable swc/subs; enable used swc/subs; enabled unused swc/subs */ + static const uint32_t DESER_CORE1P2_DECFE_CTL45_VALUE[] = { + 0x00U, /* Reset value of register */ + 0xFFU, /* Not used on used lanes */ + 0x80U /* More power-down facilities on the disabled lanes */ + }; + + static const uint32_t DESER_CORE1P2_DECFE_CTL49_ADDRESS[] = { + ADRV904X_ADDR_DESER_PHY0_CORE1P2_DECFE_CTL49, + ADRV904X_ADDR_DESER_PHY1_CORE1P2_DECFE_CTL49, + ADRV904X_ADDR_DESER_PHY2_CORE1P2_DECFE_CTL49, + ADRV904X_ADDR_DESER_PHY3_CORE1P2_DECFE_CTL49, + ADRV904X_ADDR_DESER_PHY4_CORE1P2_DECFE_CTL49, + ADRV904X_ADDR_DESER_PHY5_CORE1P2_DECFE_CTL49, + ADRV904X_ADDR_DESER_PHY6_CORE1P2_DECFE_CTL49, + ADRV904X_ADDR_DESER_PHY7_CORE1P2_DECFE_CTL49 + }; + /* reg add; disable swc/subs; enable used swc/subs; enabled unused swc/subs */ + static const uint32_t DESER_CORE1P2_DECFE_CTL49_VALUE[] = { + 0x20U, /* Reset value of register */ + 0xFFU, /* Not used on used lanes */ + 0x06U /* Powers down the CM amp on the disabled lanes */ + }; + + static const uint32_t DESER_CORE1P2_DECFE_CTL54_ADDRESS[] = { + ADRV904X_ADDR_DESER_PHY0_CORE1P2_DECFE_CTL54, + ADRV904X_ADDR_DESER_PHY1_CORE1P2_DECFE_CTL54, + ADRV904X_ADDR_DESER_PHY2_CORE1P2_DECFE_CTL54, + ADRV904X_ADDR_DESER_PHY3_CORE1P2_DECFE_CTL54, + ADRV904X_ADDR_DESER_PHY4_CORE1P2_DECFE_CTL54, + ADRV904X_ADDR_DESER_PHY5_CORE1P2_DECFE_CTL54, + ADRV904X_ADDR_DESER_PHY6_CORE1P2_DECFE_CTL54, + ADRV904X_ADDR_DESER_PHY7_CORE1P2_DECFE_CTL54 + }; + /* reg add; disable swc/subs; enable used swc/subs; enabled unused swc/subs */ + static const uint32_t DESER_CORE1P2_DECFE_CTL54_VALUE[] = { + 0x00U, /* Reset value of register */ + 0xFFU, /* Not used on used lanes */ + 0x05U /* More power-down facilities on the disabled lanes */ + }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + if ((enableFix != ADI_TRUE) && (enableFix != ADI_FALSE)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, enableFix, "input parameter \"enableFix\" should be either True or False."); + goto cleanup; + } + + numDeserLanesUsed = ((laneMask >> 7U) & 1U) + \ + ((laneMask >> 6U) & 1U) + \ + ((laneMask >> 5U) & 1U) + \ + ((laneMask >> 4U) & 1U) + \ + ((laneMask >> 3U) & 1U) + \ + ((laneMask >> 2U) & 1U) + \ + ((laneMask >> 1U) & 1U) + \ + (laneMask & 1U); + + if (enableFix == ADI_TRUE) + { + recoveryAction = adi_adrv904x_Register32Write(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_DESERIALIZER_DESER_PHY_TOP_8PACK, + 0x00, + 0xFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write to ADRV904X_BF_DIGITAL_CORE_JESD_DESERIALIZER_DESER_PHY_TOP_8PACK"); + goto cleanup; + } + for (index = 0U; index < (uint32_t)ADI_ADRV904X_MAX_DESERIALIZER_LANES; index++) + { + /* Lane NOT being used */ + actionLaneSelector = swcVcmEnabledLaneUnused; + + if ((laneMask & (1U << index)) == 0U) + { + recoveryAction = adi_adrv904x_Register32Write(device, NULL, DESER_CORE1P2_DECFE_CTL49_ADDRESS[index], DESER_CORE1P2_DECFE_CTL49_VALUE[actionLaneSelector], 0x07U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write to ADRV904X_ADDR_DESER_PHY_CORE1P2_DECFE_CTL49 of one of the lanes"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, DESER_PD_REG_0_ADDRESS[index], DESER_PD_REG_0_VALUE[actionLaneSelector], 0x3FU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write to ADRV904X_ADDR_DESER_PHY_PD_REG_0 of one of the lanes"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, DESER_PD_REG_1_ADDRESS[index], DESER_PD_REG_1_VALUE[actionLaneSelector], 0x07U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write to ADRV904X_ADDR_DESER_PHY_PD_REG_1 of one of the lanes"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, DESER_CORE1P2_DECFE_CTL18_ADDRESS[index], DESER_CORE1P2_DECFE_CTL18_VALUE[actionLaneSelector], 0x01U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write to ADRV904X_ADDR_DESER_PHY_CORE1P2_DECFE_CTL18 of one of the lanes"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, DESER_CORE1P2_DECFE_CTL31_ADDRESS[index], DESER_CORE1P2_DECFE_CTL31_VALUE[actionLaneSelector], 0x01U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write to ADRV904X_ADDR_DESER_PHY_CORE1P2_DECFE_CTL31 of one of the lanes"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, DESER_CORE1P2_DECFE_CTL54_ADDRESS[index], DESER_CORE1P2_DECFE_CTL54_VALUE[actionLaneSelector], 0x0FU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write to ADRV904X_ADDR_DESER_PHY_CORE1P2_DECFE_CTL54 of one of the lanes"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, DESER_CORE1P2_DECFE_CTL0_ADDRESS[index], DESER_CORE1P2_DECFE_CTL0_VALUE[actionLaneSelector], 0x0FU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write to ADRV904X_ADDR_DESER_PHY_CORE1P2_DECFE_CTL0 of one of the lanes"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, DESER_CORE1P2_DECFE_CTL28_ADDRESS[index], DESER_CORE1P2_DECFE_CTL28_VALUE[actionLaneSelector], 0xFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write to ADRV904X_ADDR_DESER_PHY_CORE1P2_DECFE_CTL28 of one of the lanes"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, DESER_CORE1P2_DECFE_CTL41_ADDRESS[index], DESER_CORE1P2_DECFE_CTL41_VALUE[actionLaneSelector], 0xFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write to ADRV904X_ADDR_DESER_PHY_CORE1P2_DECFE_CTL41 of one of the lanes"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, DESER_CORE1P2_DECFE_CTL43_ADDRESS[index], DESER_CORE1P2_DECFE_CTL43_VALUE[actionLaneSelector], 0xFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write to ADRV904X_ADDR_DESER_PHY_CORE1P2_DECFE_CTL43 of one of the lanes"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, DESER_CORE1P2_DECFE_CTL45_ADDRESS[index], DESER_CORE1P2_DECFE_CTL45_VALUE[actionLaneSelector], 0xFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write to ADRV904X_ADDR_DESER_PHY_CORE1P2_DECFE_CTL45 of one of the lanes"); + goto cleanup; + } + } + } + if (numDeserLanesUsed > 0x4U) + { + recoveryAction = adi_adrv904x_JrxRepairSwCEnableSet(device, laneMask); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to Set SwC Enabled"); + goto cleanup; + } + + for (index = 0U; index < (uint32_t)ADI_ADRV904X_MAX_DESERIALIZER_LANES; index++) + { + if ((laneMask & (1U << index)) == 0U) + { + /* Lane NOT being used */ + actionLaneSelector = swcVcmEnabledLaneUnused; + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, DESER_CORE1P2_TEST_ADDRESS[index], DESER_CORE1P2_TEST_VALUE[actionLaneSelector], 0x1FU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write to DESERDES CORE1P2_TEST"); + goto cleanup; + } + } + } + } + else + { + for (index = 0U; index < (uint32_t)ADI_ADRV904X_MAX_DESERIALIZER_LANES; index++) + { + actionLaneSelector = ((laneMask & (1U << index)) == 0U) ? swcVcmEnabledLaneUnused : swcVcmEnabledLaneUsed; + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, DESER_PD_REG_1_ADDRESS[index], DESER_PD_REG_1_VALUE[actionLaneSelector], 0x07U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write to DESERDES PD_REG_1"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, DESER_CORE1P2_TEST_ADDRESS[index], DESER_CORE1P2_TEST_VALUE[actionLaneSelector], 0x1FU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write to DESERDES CORE1P2_TEST"); + goto cleanup; + } + } + } + + /* Indicate that JRxRepair has been applied */ + device->devStateInfo.devState = (adi_adrv904x_ApiStates_e)(device->devStateInfo.devState | ADI_ADRV904X_STATE_JRXREPAIRED); + + } + else + { + if (numDeserLanesUsed <= 0x4U) + { + for (index = 0U; index < (uint32_t)ADI_ADRV904X_MAX_DESERIALIZER_LANES; index++) + { + actionLaneSelector = swcVcmDisabled; + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, DESER_PD_REG_1_ADDRESS[index], DESER_PD_REG_1_VALUE[actionLaneSelector], 0x07U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write to ADRV904X_ADDR_DESER_PHY_PD_REG_1 of one of the lanes"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_Register32Write(device, NULL, DESER_CORE1P2_TEST_ADDRESS[index], DESER_CORE1P2_TEST_VALUE[actionLaneSelector], 0x1FU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write to DESERDES CORE1P2_TEST"); + goto cleanup; + } + } + } + else + { + recoveryAction = adi_adrv904x_JrxRepairSwCEnableSet(device, 0x0U); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to Set SwC Disabled"); + goto cleanup; + } + } + + recoveryAction = adi_adrv904x_Register32Write(device, + NULL, + ADRV904X_BF_DIGITAL_CORE_JESD_DESERIALIZER_DESER_PHY_TOP_8PACK, + ~laneMask, + 0xFF); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to write to ADRV904X_BF_DIGITAL_CORE_JESD_DESERIALIZER_DESER_PHY_TOP_8PACK"); + goto cleanup; + } + + /* Indicate that JRxRepair is disabled */ + device->devStateInfo.devState = (adi_adrv904x_ApiStates_e)(device->devStateInfo.devState & ~ADI_ADRV904X_STATE_JRXREPAIRED); + + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_JrxRepairInitialization(adi_adrv904x_Device_t* const device, + uint8_t enableRepair) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t idx = 0U; + uint8_t screenID = 0U; + uint8_t usedDeserLanes = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + + recoveryAction = adrv904x_JrxRepairScreenTestChecker(device, &screenID); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Screen check has failed."); + goto cleanup; + } + + if (((enableRepair & ADI_ADRV904X_JRXREPAIR_INIT_ALL) == ADI_ADRV904X_JRXREPAIR_INIT_ALL) || + (((enableRepair & ADI_ADRV904X_JRXREPAIR_INIT_NONSCREENED) == ADI_ADRV904X_JRXREPAIR_INIT_NONSCREENED) && (screenID == ADI_FALSE))) + { + for (idx = 0U; idx < (uint8_t)ADI_ADRV904X_MAX_DEFRAMERS; idx++) + { + usedDeserLanes |= device->initExtract.jesdSetting.deframerSetting[idx].deserialLaneEnabled; + } + + recoveryAction = adi_adrv904x_JrxRepairVcmLanesFix(device, usedDeserLanes, ADI_TRUE); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to fix enable VCM fix"); + goto cleanup; + } + } + + cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +/* Helper function to load CPU image from file. SHOULD ONLY BE CALLED FROM adi_adrv904x_CpuImageLoad() */ +static adi_adrv904x_ErrAction_e adrv904x_CpuLoadUtil(adi_adrv904x_Device_t* const device, + const adi_adrv904x_cpuBinaryInfo_t* const cpuBinaryInfo, + FILE* cpuImageFilePtr, + const adi_adrv904x_CpuType_e cpuType) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + uint32_t numFileChunks = 0U; + uint32_t chunkIndex = 0U; + uint8_t cpuImageChunk[ADI_ADRV904X_CPU_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES]; + uint32_t byteCount = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cpuBinaryInfo); + + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, cpuImageFilePtr); + + /* Calculate number of image chunks to write */ + if (cpuType == ADI_ADRV904X_CPU_TYPE_0) + { + numFileChunks = (uint32_t)(ADI_ADRV904X_CPU_0_BINARY_IMAGE_FILE_SIZE_BYTES / ADI_ADRV904X_CPU_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES); + } + else if (cpuType == ADI_ADRV904X_CPU_TYPE_1) + { + numFileChunks = (uint32_t)(ADI_ADRV904X_CPU_1_BINARY_IMAGE_FILE_SIZE_BYTES / ADI_ADRV904X_CPU_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES); + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuType, "Invalid CPU type"); + return recoveryAction; + } + + for (chunkIndex = 0U; chunkIndex < numFileChunks; ++chunkIndex) + { + /* Read Segment of CPU Image */ + byteCount = ADI_LIBRARY_FREAD(&cpuImageChunk[0U], 1, ADI_ADRV904X_CPU_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES, cpuImageFilePtr); + if (byteCount == ADI_ADRV904X_CPU_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES) + { + /* Write CPU Image Segment */ + recoveryAction = adi_adrv904x_CpuImageWrite(device, + cpuType, + (chunkIndex * ADI_ADRV904X_CPU_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES), + &cpuImageChunk[0U], + byteCount); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error During Binary Loading (e.g. SPI Issue)"); + return recoveryAction; + } + } + else + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuBinaryInfo->filePath, "Error Reading Block of Data from CPU Binary File"); + return recoveryAction; + } + } + + return recoveryAction; +} + +static void adrv904x_EndiannessCheckAndConvert(void* const buffer, const size_t elementSize, const size_t elementCount) +{ + /* new function entry reporting */ + uint8_t i = 0U; + uint16_t* tmp16; + uint32_t* tmp32; + uint64_t* tmp64; + + if (elementSize == 2U) + { + //biteswap small + tmp16 = (uint16_t* const)buffer; + for (i = 0; i < elementCount; i++) { + tmp16[i] = ADRV904X_HTOCS(tmp16[i]); + } + } + else if (elementSize == 4U) + { + //biteswap large + tmp32 = (uint32_t* const)buffer; + for (i = 0; i < elementCount; i++) { + tmp32[i] = ADRV904X_HTOCL(tmp32[i]); + } + } + else if (elementSize == 8U) + { + //biteswap large large + tmp64 = (uint64_t* const)buffer; + for (i = 0; i < elementCount; i++) { + tmp64[i] = ADRV904X_HTOCLL(tmp64[i]); + } + } +} +static size_t adrv904x_VariableFromFileExtract(adi_adrv904x_Device_t* const device, + void* const buffer, + const size_t elementSize, + const size_t elementCount, + FILE* file) +{ + ADI_FUNCTION_ENTRY_LOG(&device->common, ADI_HAL_LOG_API_PRIV); + ADI_ADRV904X_NULL_PTR_REPORT_RETURN(&device->common, file); + + uint8_t returnValue = ADI_LIBRARY_FREAD(buffer, 1, elementSize * elementCount, file); + if (returnValue > 0) + { + adrv904x_EndiannessCheckAndConvert(buffer, elementSize, elementCount); + } + return returnValue; +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxGainTableChecksumRead(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxGainTableInfo_t* const rxGainTableInfoPtr, + uint32_t* const rxGainTableChecksum) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + const uint8_t LINE_BUFFER_SIZE = 128U; + const uint8_t HEADER_BUFFER_SIZE = 16U; + const uint8_t NUM_COLUMNS = 5U; + FILE* rxGainTableFilePtr = NULL; + char rxGainTableLineBuffer[LINE_BUFFER_SIZE]; + char headerStr1[HEADER_BUFFER_SIZE]; + adi_adrv904x_Version_t tableVersion = { 0U, 0U, 0U, 0U }; + uint32_t checksum[4U] = { 0U, 0U, 0U, 0U }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxGainTableChecksum, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxGainTableInfoPtr, cleanup); + + if (ADI_LIBRARY_STRNLEN((const char*)rxGainTableInfoPtr->filePath, ADI_ADRV904X_MAX_FILE_LENGTH) == ADI_ADRV904X_MAX_FILE_LENGTH) + { + /* Path is not terminated */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxGainTableInfoPtr->filePath, "Unterminated path string"); + goto cleanup; + } + + /* Open Rx Gain Table CSV file */ +#ifdef __GNUC__ + rxGainTableFilePtr = ADI_LIBRARY_FOPEN((const char *)rxGainTableInfoPtr->filePath, "r"); +#else + if (ADI_LIBRARY_FOPEN_S(&rxGainTableFilePtr, (const char *)rxGainTableInfoPtr->filePath, "r") != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxGainTableInfoPtr->filePath, + "Unable to open Rx Gain Table csv file. Please check if the path is correct or the file is open in another program"); + + goto cleanup; + } +#endif + + if (rxGainTableFilePtr == NULL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxGainTableInfoPtr->filePath, + "Invalid Rx Gain Table csv file path while attempting to load Rx Gain Table"); + goto cleanup; + } + + if (fgets(rxGainTableLineBuffer, sizeof(rxGainTableLineBuffer), rxGainTableFilePtr) == NULL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxGainTableFilePtr, "Empty Rx Gain Table Detected"); + goto cleanup; + } + + + /* Parse the first line of the Rx Gain Table file which contains the version info */ +#ifdef __GNUC__ + if (sscanf(rxGainTableLineBuffer, + "%[^,],%u,%u,%u,%u", + headerStr1, + (uint32_t*)&tableVersion.majorVer, + (uint32_t*)&tableVersion.minorVer, + (uint32_t*)&tableVersion.maintenanceVer, + (uint32_t*)&tableVersion.buildVer) != NUM_COLUMNS) +#else + if (sscanf_s(rxGainTableLineBuffer, + "%[^,],%d,%d,%d,%d", + headerStr1, + (uint32_t)sizeof(headerStr1), + &version.majorVer, + &version.minorVer, + &version.maintenanceVer, + &version.buildVer) != NUM_COLUMNS) +#endif + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxGainTableInfoPtr->filePath, "Invalid Rx Gain Table Format Detected"); + goto cleanup; + } + + /* Verify that Gain Table Version Format is correct */ + if (ADI_LIBRARY_STRSTR(headerStr1, "Version") == NULL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, headerStr1, "Version Column Expected First"); + goto cleanup; + } + + + if (fgets(rxGainTableLineBuffer, sizeof(rxGainTableLineBuffer), rxGainTableFilePtr) == NULL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxGainTableFilePtr, "Empty Rx Gain Table Detected"); + goto cleanup; + } + + /* Parse the second line of the Rx Gain Table file which contains the checksum info */ +#ifdef __GNUC__ + if (sscanf(rxGainTableLineBuffer, + "%[^,],%u,%u,%u,%u", + headerStr1, + (uint32_t*)&checksum[0], + (uint32_t*)&checksum[1], + (uint32_t*)&checksum[2], + (uint32_t*)&checksum[3]) != NUM_COLUMNS) +#else + if (sscanf_s(rxGainTableLineBuffer, + "%[^,],%d,%d,%d,%d", + headerStr1, + (uint32_t)sizeof(headerStr1), + &checksum[0], + &checksum[1], + &checksum[2], + &checksum[3]) != NUM_COLUMNS) +#endif + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rxGainTableInfoPtr->filePath, "Invalid Rx Gain Table Format Detected"); + goto cleanup; + } + + /* Verify that Gain Table Checksum Format is correct */ + if (ADI_LIBRARY_STRSTR(headerStr1, "Checksum") == NULL) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, headerStr1, "Checksum Column Expected First"); + goto cleanup; + } + + *rxGainTableChecksum = checksum[0]; + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup: + + if (rxGainTableFilePtr != NULL) + { + /* Close Rx Gain Table csv file */ + if (ADI_LIBRARY_FCLOSE(rxGainTableFilePtr) != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxGainTableInfoPtr->filePath, + "Fatal error while trying to close Rx Gain Table csv file. Possible memory shortage while flushing / other I/O errors."); + } + } + + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RxGainTableChecksumCalculate(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RxChannels_e rxChannel, + uint32_t* const rxGainTableChecksum) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + +#define MAX_RX_GAIN_TABLE_LINES 256U +#define GAIN_TABLE_SIZE 7U + static const uint8_t INDEX_MASK = 0xFFU; + static const uint8_t PHASE_OFFSET_MASK = 0xFFU; + static const uint8_t PHASE_OFFSET_SHIFT = 8U; + static const uint8_t DIG_GAIN_MASK = 0xFFU; + static const uint8_t DIG_GAIN_SHIFT = 8U; + + uint16_t numGainIndicesRead = 0U; + uint32_t i = 0U; + uint32_t checksum = 0U; + uint8_t finalCrc = ADI_FALSE; + + adi_adrv904x_RxGainTableRow_t gainTableRow[MAX_RX_GAIN_TABLE_LINES]; + uint8_t gainTableData[GAIN_TABLE_SIZE] = { 0U }; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + ADI_ADRV904X_API_ENTRY(&device->common); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rxGainTableChecksum, cleanup); + ADI_LIBRARY_MEMSET(&gainTableRow, 0, sizeof(gainTableRow)); + + /* Check that the channel requested is valid */ + if ((rxChannel != ADI_ADRV904X_RX0) && + (rxChannel != ADI_ADRV904X_RX1) && + (rxChannel != ADI_ADRV904X_RX2) && + (rxChannel != ADI_ADRV904X_RX3) && + (rxChannel != ADI_ADRV904X_RX4) && + (rxChannel != ADI_ADRV904X_RX5) && + (rxChannel != ADI_ADRV904X_RX6) && + (rxChannel != ADI_ADRV904X_RX7)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChannel, + "Invalid Rx Channel Requested for gain table read. Valid Rx channels include Rx0-Rx7"); + goto cleanup; + } + + recoveryAction = adi_adrv904x_RxGainTableRead(device, + rxChannel, + ADI_ADRV904X_MAX_GAIN_TABLE_INDEX, + gainTableRow, + MAX_RX_GAIN_TABLE_LINES, + &numGainIndicesRead); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + rxChannel, + "Rx Gain Table read failure"); + goto cleanup; + } + + if (numGainIndicesRead != MAX_RX_GAIN_TABLE_LINES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, + recoveryAction, + numGainIndicesRead, + "Rx Gain Table read number of lines wrong"); + goto cleanup; + } + + for (i = 0; i < MAX_RX_GAIN_TABLE_LINES; i++) + { + gainTableData[0] = (uint8_t)(i & INDEX_MASK); + gainTableData[1] = (uint8_t)(gainTableRow[i].rxFeGain); + gainTableData[2] = (uint8_t)(gainTableRow[i].extControl); + gainTableData[3] = (uint8_t)(gainTableRow[i].phaseOffset & PHASE_OFFSET_MASK); + gainTableData[4] = (uint8_t)((gainTableRow[i].phaseOffset >> PHASE_OFFSET_SHIFT) & PHASE_OFFSET_MASK); + gainTableData[5] = (uint8_t)(gainTableRow[i].digGain & DIG_GAIN_MASK); + gainTableData[6] = (uint8_t)((gainTableRow[i].digGain >> DIG_GAIN_SHIFT) & DIG_GAIN_MASK); + + if (i == (MAX_RX_GAIN_TABLE_LINES - 1)) + { + finalCrc = ADI_TRUE; + } + + checksum = adrv904x_Crc32ForChunk(gainTableData, + GAIN_TABLE_SIZE, + checksum, + finalCrc); + } + + *rxGainTableChecksum = checksum; + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_InitDataExtract(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuProfileBinaryInfo_t* const cpuBinaryInfo, + adi_adrv904x_Version_t* const apiVer, + adi_adrv904x_CpuFwVersion_t* const fwVer, + adi_adrv904x_Version_t* const streamVer, + adi_adrv904x_Init_t* const init, + adi_adrv904x_PostMcsInit_t* const postMcsInit, + adi_adrv904x_ExtractInitDataOutput_e* const checkOutput) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + FILE* cpuProfileFilePtr = NULL; + uint32_t totalFileSize = 0U; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, apiVer, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, fwVer, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, streamVer, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, init, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, postMcsInit, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, checkOutput, cleanup); + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuBinaryInfo, cleanup); + + if (ADI_LIBRARY_STRNLEN((const char*)cpuBinaryInfo->filePath, ADI_ADRV904X_MAX_FILE_LENGTH) == ADI_ADRV904X_MAX_FILE_LENGTH) + { + /* Path is not terminated */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuBinaryInfo, "Unterminated path string"); + goto cleanup; + } + + /* Open cpu profile binary file */ +#ifdef __GNUC__ + cpuProfileFilePtr = ADI_LIBRARY_FOPEN((const char*)cpuBinaryInfo->filePath, "rb"); +#else + if (ADI_LIBRARY_FOPEN_S(&cpuProfileFilePtr, (const char*)cpuBinaryInfo->filePath, "rb") != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileBinaryInfoPtr->filePath, "Unable to open CPU Profile Binary. Please check filepath is correct"); + goto cleanup; + } +#endif + + if (NULL == cpuProfileFilePtr) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to open CPU Profile Binary. Please check filepath is correct") + goto cleanup; + } + + /* Determine file size */ + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, 0U, SEEK_END) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Seek to EOF Failed"); + goto cleanup; + } + + /* ADI_LIBRARY_FTELL returns long type */ + totalFileSize = (uint32_t) ADI_LIBRARY_FTELL(cpuProfileFilePtr); + + /* Check that cpu profile binary file is not empty */ + if (0U == totalFileSize) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, totalFileSize, "Zero Length CPU Profile Binary Detected"); + goto cleanup; + } + + if ((uint32_t)sizeof(adrv904x_DeviceProfile_t) == totalFileSize) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + *checkOutput = ADI_ADRV904X_EXTRACT_INIT_DATA_LEGACY_PROFILE_BIN; + goto cleanup; + } + + if(ADI_LIBRARY_FSEEK(cpuProfileFilePtr, 0, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Could not rewind to start"); + goto cleanup; + } + + recoveryAction = adrv904x_LoadBinFile(device, cpuProfileFilePtr, apiVer, fwVer, streamVer, init, postMcsInit, (uint32_t)sizeof(adrv904x_DeviceProfile_t)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuBinaryInfo->filePath, "Issue with file path for cpu profile"); + goto cleanup; + } + + *checkOutput = ADI_ADRV904X_EXTRACT_INIT_DATA_POPULATED; + +cleanup: + if (cpuProfileFilePtr != NULL) + { + /* Close CPU Profile binary file */ + if (0 != ADI_LIBRARY_FCLOSE(cpuProfileFilePtr)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot Close CPU Profile Binary File"); + } + } + + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerImageLoad(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RadioSequencerBinaryInfo_t* const rsBinaryInfoPtr) +{ + const size_t BIN_ELEMENT_SIZE = 1U; + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + FILE* rsBinaryFilePtr = NULL; + uint32_t fileSize = 0U; + uint32_t numFileChunks = 0U; + uint32_t chunkIndex = 0U; + uint8_t rsBinaryImageBuffer[ADI_ADRV904X_RS_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES]; + uint32_t byteCount = 0U; + + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rsBinaryInfoPtr, cleanup); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rsBinaryInfoPtr->filePath, cleanup); + + if (ADI_LIBRARY_STRNLEN((const char*)rsBinaryInfoPtr->filePath, ADI_ADRV904X_MAX_FILE_LENGTH) == ADI_ADRV904X_MAX_FILE_LENGTH) + { + /* Path is not terminated */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rsBinaryInfoPtr->filePath, "Unterminated path string"); + goto cleanup; + } + + /* Open Stream Binary File */ +#ifdef __GNUC__ + rsBinaryFilePtr = ADI_LIBRARY_FOPEN((const char *)rsBinaryInfoPtr->filePath, "rb"); +#else + if (ADI_LIBRARY_FOPEN_S(&rsBinaryFilePtr, (const char *)rsBinaryInfoPtr->filePath, "rb") != 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rsBinaryInfoPtr->filePath, "Invalid Binary File or Path Detected"); + goto cleanup; + } +#endif + + if (NULL == rsBinaryFilePtr) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rsBinaryInfoPtr->filePath, "Invalid Binary File or Path Detected"); + goto cleanup; + } + + /*Determine file size*/ + if (ADI_LIBRARY_FSEEK(rsBinaryFilePtr, 0U, SEEK_END) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rsBinaryFilePtr, "Seek to EOF Failed"); + goto cleanup; + } + + /* ADI_LIBRARY_FTELL returns long type */ + fileSize = (uint32_t) ADI_LIBRARY_FTELL(rsBinaryFilePtr); + numFileChunks = (uint32_t)(fileSize / ADI_ADRV904X_RS_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES + 1); + + /* Check that Radio Sequencer binary file is not empty */ + if (fileSize == 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rsBinaryFilePtr, "Zero Length Radio Sequencer Image Detected"); + goto cleanup; + } + + /* Check that Radio Sequencer binary file size does not exceed maximum size */ + if (fileSize > ADI_ADRV904X_RADIO_SEQ_IMAGE_FILE_MAX_SIZE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, fileSize, "Radio Sequencer Binary Size exceeds Maximum Limit"); + goto cleanup; + } + + /* Check that size of the file is a multiple of 4 */ + if ((fileSize & 0x3U) != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rsBinaryInfoPtr->filePath, "Incorrect Radio Sequencer Binary File Block Size"); + goto cleanup; + } + + /* Rewind the file pointer to beginning of the file */ + if (ADI_LIBRARY_FSEEK(rsBinaryFilePtr, 0U, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, rsBinaryFilePtr, "Unable to Rewind File Pointer for CPU Binary"); + goto cleanup; + } + + /* Put the part into streaming mode to help facilitate the large, contiguous SPI writes in CpuImageWrite */ + recoveryAction = adrv904x_SpiStreamingEntry(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue with entering Spi Streaming mode"); + goto cleanup; + } + + /* Read ARM binary file */ + for (chunkIndex = 0U; chunkIndex < numFileChunks; ++chunkIndex) + { + if ((byteCount = ADI_LIBRARY_FREAD(&rsBinaryImageBuffer[0U], BIN_ELEMENT_SIZE, ADI_ADRV904X_RS_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES, rsBinaryFilePtr)) > 0) + { + /* Write Radio Sequencer binary */ + recoveryAction = adi_adrv904x_RadioSequencerImageWrite(device, + (chunkIndex * ADI_ADRV904X_RS_BINARY_IMAGE_LOAD_CHUNK_SIZE_BYTES), + &rsBinaryImageBuffer[0U], + byteCount); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Issue during Radio Sequencer Write"); + goto cleanup; + } + } + else if (ferror(rsBinaryFilePtr)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, numFileChunks, "Error Reading Block of Data from Radio Sequencer Binary File"); + goto cleanup; + } + } +cleanup: + if (rsBinaryFilePtr != NULL) + { + /* Close Radio Sequencer binary file */ + if (0 != ADI_LIBRARY_FCLOSE(rsBinaryFilePtr)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot Close Radio Sequencer Image File"); + } + } + + if (device->devStateInfo.spiStreamingOn == ADI_TRUE) + { + if (ADI_ADRV904X_ERR_ACT_NONE != adrv904x_SpiStreamingExit(device)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_INTERFACE; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Spi Streaming Exit Issue"); + } + } + + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_RadioSequencerImageReload(adi_adrv904x_Device_t* const device, + const adi_adrv904x_RadioSequencerBinaryInfo_t* const rsBinaryInfoPtr) +{ + const adrv904x_BfSequencerChanAddr_e sequencerBaseAddr = ADRV904X_BF_DIGITAL_CORE_SEQUENCER_REGS; + const uint32_t RS_TOTAL_NUM_OF_SEQUENCERS = 16U; + const uint32_t RADIO_SEQUENCER_CONFIG_0_REG_OFFSET = 0x20U; + const uint32_t DBG_PROGRAM_COUNTER_BITP = 0U; + const uint32_t DBG_PROGRAM_COUNTER_BITM = 0x0000FFFFU; + const uint32_t RESET_HOLD_BITP = 28U; + const uint32_t RADIO_SEQUENCER_NUM_SEQUENCERS = 16U; + const uint32_t RS_NUM_FRAME_TIMING_SEQUENCERS = 10U; + const uint32_t RS_NUM_GPR_PER_SEQUENCERS = 16U; + const uint32_t RS_STOP_WAIT_INTERVAL_US = 100U; + const uint32_t RS_STOP_WAIT_CNT = 1000U; + + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + uint8_t channelId = 0U; + uint8_t resetHold = 1U; + bool rsRadioRunning = false; + uint32_t pointerInit = 0x0U; + uint8_t stopComplete = 0U; + uint32_t waitCounter = 0U; + uint32_t curPc = 0U; + adrv904x_DfeSvcCmdStatus_t cmdStatus = ADRV904X_DFE_SVC_CMD_STATUS_GENERIC; + adrv904x_DfeSvcRadioCtrlSequencerInitData_t cmdStruct; + adrv904x_DfeSvcCmdGenericResp_t respStruct; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, rsBinaryInfoPtr, cleanup); + + ADI_LIBRARY_MEMSET(&cmdStruct, 0, sizeof(cmdStruct)); + ADI_LIBRARY_MEMSET(&respStruct, 0, sizeof(respStruct)); + + /* Check that Radio Sequencer Enable */ + if (device->initExtract.rs.radioSeqEn == ADI_FALSE) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + goto cleanup; + } + + /* Check that Radio Sequencer has been loaded before getting RS error info */ + if ((device->devStateInfo.devState & ADI_ADRV904X_STATE_RSLOADED) != ADI_ADRV904X_STATE_RSLOADED) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, + recoveryAction, + "Radio Sequencer should have been loaded before calling this API"); + goto cleanup; + } + + rsRadioRunning = device->devStateInfo.rsRadioRunning; + + /* Check if radio operation is in progress */ + if (rsRadioRunning == ADI_TRUE) + { + /* Stop the radio operation */ + recoveryAction = adi_adrv904x_RadioSequencerRadioStop(device); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to stop the RS radio operation"); + goto cleanup; + } + + /* Get the null pattern address */ + recoveryAction = adrv904x_RadioSequencerPatternAddrGet(device, + ADRV904X_DFE_SVC_RADIO_CTRL_SEQUENCER_NULL_PATTERN_GLOBAL_PTRN_ID, + &pointerInit); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to get address of RS null pattern"); + goto cleanup; + } + + /* Wait until all frame timing radio sequencers have started executing the null pattern before continuing. */ + stopComplete = 0U; + for (waitCounter = 0U; waitCounter < RS_STOP_WAIT_CNT; waitCounter++) + { + /* Assume that all have started until proven otherwise below */ + stopComplete = 1U; + + /* Verify the the current PC == pointerInit */ + for (channelId = 0; channelId < RS_NUM_FRAME_TIMING_SEQUENCERS; channelId++) + { + recoveryAction = adi_adrv904x_Register32Read(device, + NULL, + ((uint32_t) sequencerBaseAddr + RADIO_SEQUENCER_CONFIG_0_REG_OFFSET + channelId * 4), + &curPc, + 0xFFFFFFFFU); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading RS dbg_program_counter bitfield"); + goto cleanup; + } + + curPc = (curPc & DBG_PROGRAM_COUNTER_BITM) >> DBG_PROGRAM_COUNTER_BITP; + if (curPc != (pointerInit & DBG_PROGRAM_COUNTER_BITM)) + { + /* One of the radio sequencers hasn't started executing the startup pattern yet. + * Continue checking for completion. + */ + stopComplete = 0U; + } + } + + if (stopComplete == 0U) + { + /* Wait a bit before running the check again */ + recoveryAction = (adi_adrv904x_ErrAction_e)adi_common_hal_Wait_us(&device->common, RS_STOP_WAIT_INTERVAL_US); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while waiting for Radio Sequencer to stop"); + goto cleanup; + } + } + else + { + /* All radio sequencers are executing the null pattern, exit the wait loop */ + break; + } + } + + /* Radio sequencer didn't stop in the specified amount of time. */ + if (stopComplete == 0U) + { + /* Set the RS status to not started */ + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_DEVICE; + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_TIMEOUT, + recoveryAction, + ADI_NO_VARIABLE, + "Radio Sequencer Stop Timeout"); + goto cleanup; + } + } + + /* Set the reset_hold for all the 16 radio sequencers */ + for (channelId = 0U; channelId < RADIO_SEQUENCER_NUM_SEQUENCERS; channelId++) + { + uint32_t regVal = 0U; + recoveryAction = adi_adrv904x_Register32Read(device, + NULL, + ((uint32_t) sequencerBaseAddr + RADIO_SEQUENCER_CONFIG_0_REG_OFFSET + channelId * 4U), + ®Val, + 0xFFFFFFFFU); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while reading RS reset_hold bitfield"); + goto cleanup; + } + + regVal = (resetHold == 0U) ? regVal & (~(1U << RESET_HOLD_BITP)) : regVal | (1U << RESET_HOLD_BITP); + + recoveryAction = adi_adrv904x_Register32Write(device, + NULL, + ((uint32_t) sequencerBaseAddr + RADIO_SEQUENCER_CONFIG_0_REG_OFFSET + channelId * 4U), + regVal, + 0xFFFFFFFFU); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting RS reset_hold bitfield"); + goto cleanup; + } + } + + recoveryAction = adrv904x_RadioSequencerApplyImmediately(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting RS Apply Immediately"); + goto cleanup; + } + + /* Confirm that RS has stopped executing by reading the dbg_state bitfield (RESET = 3'b100) */ + stopComplete = 0U; + for (waitCounter = 0U; waitCounter < RS_STOP_WAIT_CNT; waitCounter++) + { + /* Assume that all have in reset state until proven otherwise below */ + stopComplete = 1U; + + for (channelId = 0U; channelId < RADIO_SEQUENCER_NUM_SEQUENCERS; channelId++) + { + uint8_t bfValue = 0xFF; + recoveryAction = adrv904x_Sequencer_DbgState_BfGet(device, + NULL, + sequencerBaseAddr, + channelId, + &bfValue); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while getting dbg_state bitfield"); + goto cleanup; + } + + /* Check the dbg_state bf value */ + if (bfValue != 0x4) + { + stopComplete = 0U; + } + } + + if (stopComplete == 0U) + { + /* Wait a bit before running the check again */ + recoveryAction = (adi_adrv904x_ErrAction_e)adi_common_hal_Wait_us(&device->common, RS_STOP_WAIT_INTERVAL_US); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while waiting for Radio Sequencer to stop"); + goto cleanup; + } + } + else + { + /* All radio sequencers are executing the null pattern, exit the wait loop */ + break; + } + } + + /* Radio sequencer didn't stopped executing in the specified amount of time */ + if (stopComplete == 0U) + { + /* Set the RS status to not started */ + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_DEVICE; + ADI_ERROR_REPORT(&device->common, + ADI_ADRV904X_ERRSRC_API, + ADI_COMMON_ERRCODE_TIMEOUT, + recoveryAction, + ADI_NO_VARIABLE, + "Radio sequencer didn't stopped executing in the specified amount of time"); + goto cleanup; + } + + + /* Load new RS image */ + recoveryAction = adi_adrv904x_RadioSequencerImageLoad(device, rsBinaryInfoPtr); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while loading RS image"); + goto cleanup; + } + + /* Initialize the command structure */ + cmdStruct.numberPatterns = ADRV904X_HTOCL(device->devStateInfo.rsImageHeader.numberPatterns); + cmdStruct.sequenceLookupTableCrc = ADRV904X_HTOCL(device->devStateInfo.rsImageHeader.lookupCrc); + + for (uint32_t i = 0U; i < device->devStateInfo.rsImageHeader.numberPatterns; i++) + { + cmdStruct.sequenceLookupTable[i] = ADRV904X_HTOCL(device->devStateInfo.lookupTable[i]); + } + + /* Issue mailbox cmd to DFE to reload its copy of pattern lookup table */ + recoveryAction = adrv904x_DfeSvcCmdSend(device, + ADRV904X_LINK_ID_0, + ADRV904X_DFE_SVC_CMD_ID_RS_PATTERN_LUT_SET, + (uint8_t *)&cmdStruct, + sizeof(cmdStruct), + (uint8_t *)&respStruct, + sizeof(respStruct), + &cmdStatus); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while sending command to update pattern lookup table"); + goto cleanup; + } + + if (respStruct.status != ADI_ADRV904X_DFE_SVC_ERR_CODE_NO_ERROR) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_RESET_DEVICE; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, respStruct.status, "Unexpected DFE response"); + goto cleanup; + } + + /* Re-initialize the XBAR settings */ + for (uint32_t idx = 0; idx < ADI_ADRV904X_RADIO_SEQ_XBAR_SIZE; idx++) + { + recoveryAction = adrv904x_Sequencer_XbarCtrlSel_BfSet(device, + NULL, + sequencerBaseAddr, + idx, + (device->devStateInfo.xbarSettings[idx] >> 4u)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting xbar control sel"); + goto cleanup; + } + + recoveryAction = adrv904x_Sequencer_XbarSequencerSel_BfSet(device, + NULL, + sequencerBaseAddr, + idx, + (device->devStateInfo.xbarSettings[idx] & 0x0F)); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting xbar sequencer sel"); + goto cleanup; + } + } + + /* Set relevant RS registers to reset value */ + for (channelId = 0U; channelId < RADIO_SEQUENCER_NUM_SEQUENCERS; channelId++) + { + recoveryAction = adrv904x_Sequencer_ExternalJumpEnable_BfSet(device, + NULL, + sequencerBaseAddr, + channelId, + 0x00); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while resetting external_jump_enable bitfield"); + goto cleanup; + } + + recoveryAction = adrv904x_Sequencer_ExternalJumpPointer_BfSet(device, + NULL, + sequencerBaseAddr, + channelId, + 0xFFF0); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while resetting external_jump_pointer bitfield"); + goto cleanup; + } + } + + /* Set GPRs registers to reset value */ + for (uint32_t idx = 0U; idx < (RS_TOTAL_NUM_OF_SEQUENCERS * RS_NUM_GPR_PER_SEQUENCERS); idx++) + { + recoveryAction = adrv904x_Sequencer_GeneralPurposeReg_BfSet(device, + NULL, + sequencerBaseAddr, + channelId, + 0); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while resetting general_purpose_reg bitfield"); + goto cleanup; + } + } + + recoveryAction = adrv904x_RadioSequencerApplyImmediately(device); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while setting RS Apply Immediately"); + goto cleanup; + } + + + /* Clear the rsStarted flag so RadioSequencerStart will re-init RS */ + device->devStateInfo.rsStarted = ADI_FALSE; + + /* Restart RS radio operation if it was in operation previous to this + * call to Reload(). Otherwise, leave the RS in reset, waiting for the + * user to call RadioStart() when ready to resume radio operation. + */ + if (rsRadioRunning) + { + recoveryAction = adi_adrv904x_RadioSequencerRadioStart(device); + + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Failed to start the RS radio operation"); + goto cleanup; + } + } + +cleanup: + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} + + + +ADI_API adi_adrv904x_ErrAction_e adi_adrv904x_CfrPulseExtractAndWrite(adi_adrv904x_Device_t* const device, + const adi_adrv904x_CpuProfileBinaryInfo_t* const cpuProfileBinaryInfoPtr) +{ + adi_adrv904x_ErrAction_e recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + FILE* cpuProfileFilePtr = NULL; + + uint32_t fileSize = 0U; + adrv904x_DeviceProfile_t* const deviceProfile = NULL; + uint8_t pulseSelect = 0U; + uint32_t offset = 0U; + uint32_t txConfigOffset = 0U; + uint32_t i = 0U; + uint8_t chanAssignArray[ADI_ADRV904X_MAX_CHANNELS] = { 0U }; + + adrv904x_TxDfeCfrConfig_t cfrConfig; + + ADI_ADRV904X_NULL_DEVICE_PTR_RETURN(device); + + ADI_ADRV904X_API_ENTRY(&device->common); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuProfileBinaryInfoPtr, cleanup); + + ADI_ADRV904X_NULL_PTR_REPORT_GOTO(&device->common, cpuProfileBinaryInfoPtr->filePath, cleanup); + + ADI_LIBRARY_MEMSET(&cfrConfig, 0, sizeof(adrv904x_TxDfeCfrConfig_t)); + + if (ADI_LIBRARY_STRNLEN((const char*)cpuProfileBinaryInfoPtr->filePath, ADI_ADRV904X_MAX_FILE_LENGTH) == ADI_ADRV904X_MAX_FILE_LENGTH) + { + /* Path is not terminated */ + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileBinaryInfoPtr->filePath, "Unterminated path string"); + goto cleanup; + } + + /* Open ARM binary file */ +#ifdef __GNUC__ + cpuProfileFilePtr = ADI_LIBRARY_FOPEN((const char *)cpuProfileBinaryInfoPtr->filePath, "rb"); +#else + if (ADI_LIBRARY_FOPEN_S(&cpuProfileFilePtr, (const char *)cpuProfileBinaryInfoPtr->filePath, "rb") != 0U) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileBinaryInfoPtr->filePath, "Unable to open CPU Profile Binary. Please check filepath is correct"); + goto cleanup; + } +#endif + + if (NULL == cpuProfileFilePtr) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to open CPU Profile Binary. Please check filepath is correct") + goto cleanup; + } + + /* Determine file size */ + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, 0U, SEEK_END) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Seek to EOF Failed"); + goto cleanup; + } + + /* ADI_LIBRARY_FTELL returns long type */ + fileSize = (uint32_t) ADI_LIBRARY_FTELL(cpuProfileFilePtr); + + /* Check that FW binary file is not empty */ + if (0U == fileSize) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, fileSize, "Zero Length CPU Profile Binary Detected"); + goto cleanup; + } + + /* Check that FW Profile binary file size is not smaller than server size */ + if (fileSize < ADRV904X_DEVICE_PROFILE_SIZE_BYTES) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, fileSize, "CPU Profile Binary Size smaller than Server ADRV904X_DEVICE_PROFILE_SIZE_BYTES"); + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, ADRV904X_DEVICE_PROFILE_SIZE_BYTES, "ADRV904X_DEVICE_PROFILE_SIZE_BYTES bigger than CPU Profile Binary Size"); + goto cleanup; + } + + /* Read chanAssign */ + offset = ADI_LIBRARY_OFFSETOF(adrv904x_RadioProfile_t, chanAssign); + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, offset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary"); + goto cleanup; + } + + if ((ADI_LIBRARY_FREAD(&chanAssignArray[0], sizeof(deviceProfile->radioProfile.chanAssign), 1, cpuProfileFilePtr)) <= 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + } + + for (i = 0; i < ADI_ADRV904X_MAX_CHANNELS; ++i) + { + if (((device->devStateInfo.initializedChannels >> ADI_ADRV904X_TX_INITIALIZED_CH_OFFSET) & (uint32_t)(1U << i)) == 0U) + { + /* Skip uninitialized channels */ + continue; + } + + pulseSelect = chanAssignArray[i]; + switch (pulseSelect) + { + case 0: + txConfigOffset = ADI_LIBRARY_OFFSETOF(adrv904x_DfeProfile_t, txConfig[0]); + break; + case 1: + txConfigOffset = ADI_LIBRARY_OFFSETOF(adrv904x_DfeProfile_t, txConfig[1]); + break; + case 2: + txConfigOffset = ADI_LIBRARY_OFFSETOF(adrv904x_DfeProfile_t, txConfig[2]); + break; + case 3: + txConfigOffset = ADI_LIBRARY_OFFSETOF(adrv904x_DfeProfile_t, txConfig[3]); + break; + default: + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + break; + } + + offset = ADI_LIBRARY_OFFSETOF(adrv904x_DeviceProfile_t, dfeProfile) + + txConfigOffset + + ADI_LIBRARY_OFFSETOF(adrv904x_DfeTxConfig_t, cfr); + + if (ADI_LIBRARY_FSEEK(cpuProfileFilePtr, offset, SEEK_SET) < 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, cpuProfileFilePtr, "Unable to Rewind File Pointer for CPU Binary"); + goto cleanup; + } + + if ((ADI_LIBRARY_FREAD(&cfrConfig, sizeof(adrv904x_TxDfeCfrConfig_t), 1, cpuProfileFilePtr)) <= 0) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_PARAM_ERROR_REPORT(&device->common, recoveryAction, offset, "Error Reading Block of Data from CPU Binary File"); + goto cleanup; + } + + if (cfrConfig.cfr0PulseData.numCoeffs != 0U) + { + recoveryAction = adrv904x_CfrCorrectionPulseWrite(device, + ADI_ADRV904X_CFR_PULSE0, + i, + cfrConfig.cfr0Interpolation, + (adi_adrv904x_CfrCorrectionPulse_t*)&cfrConfig.cfr0PulseData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing pulse 0"); + goto cleanup; + } + } + + if (cfrConfig.cfr1PulseData.numCoeffs != 0U) + { + recoveryAction = adrv904x_CfrCorrectionPulseWrite(device, + ADI_ADRV904X_CFR_PULSE1, + i, + cfrConfig.cfr1Interpolation, + (adi_adrv904x_CfrCorrectionPulse_t *)&cfrConfig.cfr1PulseData); + if (recoveryAction != ADI_ADRV904X_ERR_ACT_NONE) + { + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Error while writing pulse 1"); + goto cleanup; + } + } + } + + + recoveryAction = ADI_ADRV904X_ERR_ACT_NONE; + +cleanup: + if (cpuProfileFilePtr != NULL) + { + /* Close CPU Profile binary file */ + if (0 != ADI_LIBRARY_FCLOSE(cpuProfileFilePtr)) + { + recoveryAction = ADI_ADRV904X_ERR_ACT_CHECK_PARAM; + ADI_API_ERROR_REPORT(&device->common, recoveryAction, "Cannot Close CPU Profile Binary File"); + } + } + ADI_ADRV904X_API_EXIT(&device->common, recoveryAction); +} diff --git a/drivers/rf-transceiver/koror/platforms/adi_library.c b/drivers/rf-transceiver/koror/platforms/adi_library.c new file mode 100644 index 00000000000..3c91eb2b5ab --- /dev/null +++ b/drivers/rf-transceiver/koror/platforms/adi_library.c @@ -0,0 +1,206 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_library.c +* \brief Contains implementations of standard library functions +* +* ADRV904X API Version: 2.10.0.4 +*/ +#include "adi_library.h" + +ADI_API void* adi_library_memset(void* dst, int c, size_t len) +{ + uint8_t* target = NULL; + + target = (uint8_t*) dst; + + if ((dst == NULL) || (len <= 0)) + { + return (NULL); + } + + for (; len; len--) + { + *target++ = (uint8_t) c; + } + + return target; +} + +ADI_API void* adi_library_memcpy(void* dst, const void* src, size_t len) +{ + uint8_t* target = NULL; + const uint8_t* source = NULL; + + target = (uint8_t*) dst; + source = (const uint8_t*) src; + + if ((dst == NULL) || (src == NULL) || (len <= 0U)) + return (NULL); + + for (; len; len--) + { + *target++ = *source++; + } + + return dst; +} + +ADI_API size_t adi_library_strlen(const char* src) +{ + uint8_t* target = NULL; + const uint8_t* source = NULL; + + target = (uint8_t*) src; + source = (const uint8_t*) src; + + if (src == NULL) + { + return (0U); + } + + /* Find NULL character in the src string */ + for (; *target != '\0'; target++) + { + /* Do nothing */ + } + + /* The delta is the length */ + return (target - source); +} + +ADI_API size_t adi_library_strnlen(const char* src, size_t maxlen) +{ + uint8_t* target = NULL; + const uint8_t* source = NULL; + + target = (uint8_t*) src; + source = (const uint8_t*) src; + + if ((src == NULL) || (maxlen <= 0U)) + { + return (0U); + } + + for (; *target != '\0'; target++) + { + if ((size_t) (target - source) > maxlen) + { + return (maxlen); + } + } + + return (target - source); +} + +ADI_API char* adi_library_strchr(const char* src, int c) +{ + char* target = NULL; + + target = (char*) src; + + if (target == NULL) + { + return (NULL); + } + + for (; *target != '\0'; target++) + { + if (*target == (char) c) + { + return (target); + } + } + + return (NULL); +} + +ADI_API char* adi_library_strcat(char* dst, const char* src) +{ + char* target = dst; + char* source = NULL; + source = (char*) src; + + if ((dst == NULL) || (src == NULL)) + { + return (NULL); + } + + /* Move target pointer to the end of target string. */ + for (; *target != '\0'; target++) + { + /* Do Nothing */ + } + + /* Copy every byte from source string to target */ + for (; *source != '\0'; source++, target++) + { + *target = *source; + } + + /* set last byte as NULL */ + *target = '\0'; + + return (dst); +} + +ADI_API char* adi_library_strncat(char* dst, const char* src, size_t n) +{ + char* target = dst; + char* source = NULL; + + source = (char*) src; + + if ((dst == NULL) || (src == NULL) || (n <= 0U)) + { + return (NULL); + } + + /* Move target pointer to the end of target string. */ + for (; *target != '\0'; target++) + { + /* Do Nothing */ + } + + /* Copy every byte from source string to target */ + for (; *source != '\0'; source++, target++) + { + if (n != 0U) + { + *target = *source; + n--; + } + else + { + break; + } + } + + /* set last byte as NULL */ + *target = '\0'; + + return (dst); +} + +ADI_API char* adi_library_strdup(const char* stringPtr) +{ + size_t stringLength = adi_library_strlen(stringPtr) + 1; + + if (stringPtr == NULL) + { + return NULL; + } + + void* duplicateString = malloc(stringLength); + + if (duplicateString == NULL) + { + return NULL; + } + + return (char*) ADI_LIBRARY_MEMCPY(duplicateString, stringPtr, stringLength); +} \ No newline at end of file diff --git a/drivers/rf-transceiver/koror/platforms/adi_library.h b/drivers/rf-transceiver/koror/platforms/adi_library.h new file mode 100644 index 00000000000..4d5fb0d94ed --- /dev/null +++ b/drivers/rf-transceiver/koror/platforms/adi_library.h @@ -0,0 +1,100 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ +/** +* \file adi_library.h +* +* ADRV904X API Version: 2.10.0.4 +*/ +#ifndef _ADI_LIBRARY_H_ +#define _ADI_LIBRARY_H_ + +#include "adi_library_types.h" +#include "adi_platform.h" + +/** +* \brief A function to set a n byte of memory to a specific character. +* +* \param dst is a pointer to the chunk of memory +* \param c value to be set is passed as an int but function fills memory using unsigned char conversion +* \param len is the size of the chunk of memory. +* +* \retval Returns pointer to the dst when successful, NULL when error occurred. +*/ +ADI_API void* adi_library_memset(void* dst, int c, size_t len); + +/** +* \brief A function to copy len bytes from memory area src to memory area dst. +* +* \param dst destination memory (copy to). +* \param src source memory (copy from). +* \param len is the size of the chunk of dst when successful, NULL when error occurred. +* +* \retval Returns pointer to the dst. +*/ +ADI_API void* adi_library_memcpy(void* dst, const void* src, size_t len); + +/** +* \brief A function to determine the length of a string. +* +* \param src points to a string. +* +* \retval Returns the length of the string, 0 when error occurred. +*/ +ADI_API size_t adi_library_strlen(const char* src); + +/** +* \brief A function to determine the length of a fixed-size string. +* +* \param src points to a string. +* \param maxlen is at most of the string length. +* +* \retval Returns the length of the string or maxlen if '\0' is not found in the string, or 0 when error occurred. +*/ +ADI_API size_t adi_library_strnlen(const char* src, size_t maxlen); + +/** +* \brief A function to return a pointer to the first occurrence of the character c in the string src. +* +* \param src points to a string. +* \param c is a character to look for in the src string. +* +* \retval Return a pointer to the matched character or NULL if the character is not found or error occurred. +*/ +ADI_API char* adi_library_strchr(const char* src, int c); + +/** +* \brief A function appends the src string to the dst string. dst string must have enough room for both strings. +* +* \param dst points to a string +* \param src points to a string +* +* \retval Return a pointer to the resulting string dst, NULL when error occurred. +*/ +ADI_API char* adi_library_strcat(char* dst, const char* src); + +/** +* \brief A function appends n bytes the src string to the dst string. dst string must have enough room for dst string and n bytes. +* +* \param dst points to a string. +* \param src points to a string. +* \param n number of bytes to use from src string. +* +* \retval Return a pointer to the resulting string dst, NULL when error occurred. +*/ +ADI_API char* adi_library_strncat(char* dst, const char* src, size_t n); + +/** +* \brief A function to duplicate a string +* +* NOTE: Caller is responsible for managing/freeing duplicate string (i.e. Duplication done using malloc()) +* +* \param[in] stringPtr points to a string to be duplicated +* +* \retval Pointer to duplicated string or NULL for error +*/ +ADI_API char* adi_library_strdup(const char* stringPtr); + +#endif /*_ADI_LIBRARY_H_ */ diff --git a/drivers/rf-transceiver/koror/platforms/adi_library_types.h b/drivers/rf-transceiver/koror/platforms/adi_library_types.h new file mode 100644 index 00000000000..b9b2b17ae09 --- /dev/null +++ b/drivers/rf-transceiver/koror/platforms/adi_library_types.h @@ -0,0 +1,106 @@ +/** +* Copyright 2015 - 2022 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_library_types.h +* +* ADRV904X API Version: 2.10.0.4 +*/ +#ifndef _ADI_LIBRARY_TYPES_H_ +#define _ADI_LIBRARY_TYPES_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* stddef.h */ +#define ADI_LIBRARY_OFFSETOF offsetof + +/* stdio.h */ +#define ADI_LIBRARY_PRINTF printf +#define ADI_LIBRARY_FPRINTF fprintf +#define ADI_LIBRARY_SPRINTF sprintf +#define ADI_LIBRARY_SNPRINTF snprintf +#define ADI_LIBRARY_VPRINTF vprintf +#define ADI_LIBRARY_VSNPRINTF vsnprintf +#define ADI_LIBRARY_FFLUSH fflush +#define ADI_LIBRARY_FSEEK fseek +#define ADI_LIBRARY_FREAD fread +#define ADI_LIBRARY_FWRITE fwrite +#define ADI_LIBRARY_FOPEN fopen +#define ADI_LIBRARY_FOPEN_S fopen_s +#define ADI_LIBRARY_FCLOSE fclose +#define ADI_LIBRARY_FTELL ftell +#define ADI_LIBRARY_FERROR ferror +#define ADI_LIBRARY_SETVBUF setvbuf + +/* stdlib.h */ +#define ADI_LIBRARY_CALLOC calloc +#define ADI_LIBRARY_FREE free +#define ADI_LIBRARY_RAND rand +#define ADI_LIBRARY_EXIT exit +#define ADI_LIBRARY_ABS abs + +/* stdarg.h */ +#define ADI_LIBRARY_VA_START va_start +#define ADI_LIBRARY_VA_END va_end + +/* math.h*/ +#define ADI_LIBRARY_CEIL ceil + +/* string.h */ +#define ADI_LIBRARY_MEMSET memset +#define ADI_LIBRARY_MEMCPY memcpy +#define ADI_LIBRARY_STRLEN strlen +#define ADI_LIBRARY_MEMCMP memcmp +#define ADI_LIBRARY_STRCMP strcmp +#define ADI_LIBRARY_STRTOK strtok +#define ADI_LIBRARY_STRTOK_R strtok_r + +#if __STDC_VERSION__ >= 199901L /* C99 */ + #define ADI_LIBRARY_STRNLEN adi_library_strnlen /* ADI Implementation Required for C99 Make File Test */ +#else + #define ADI_LIBRARY_STRNLEN strnlen +#endif + +#define ADI_LIBRARY_STRCHR strchr +#define ADI_LIBRARY_STRCAT strcat +#define ADI_LIBRARY_STRNCAT strncat +#define ADI_LIBRARY_STRNCPY strncpy + +#if __STDC_VERSION__ >= 199901L /* C99 */ + #define ADI_LIBRARY_STRDUP adi_library_strdup /* ADI Implementation Required for C99 Make File Test */ +#else + #define ADI_LIBRARY_STRDUP strdup +#endif + +#define ADI_LIBRARY_STRSTR strstr + +/* time.h */ + +#define ADI_LIBRARY_TIME time +#define ADI_LIBRARY_LOCALTIME_R localtime_r +#define ADI_LIBRARY_MKTIME mktime +#define ADI_LIBRARY_CTIME ctime +#define ADI_LIBRARY_NANOSLEEP nanosleep +#define ADI_LIBRARY_CLOCK clock +#define ADI_LIBRARY_CLOCKS_PER_SEC CLOCKS_PER_SEC +#define ADI_LIBRARY_GMTIME gmtime + +/* ctype.h */ +#define ADI_LIBRARY_TOUPPER toupper +#define ADI_LIBRARY_TOLOWER tolower + + +#endif /* _ADI_LIBRARY_TYPES_H_ */ diff --git a/drivers/rf-transceiver/koror/platforms/adi_platform.c b/drivers/rf-transceiver/koror/platforms/adi_platform.c new file mode 100644 index 00000000000..c2bfc6c5de7 --- /dev/null +++ b/drivers/rf-transceiver/koror/platforms/adi_platform.c @@ -0,0 +1,191 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_platform.c +* +* \brief Definitions for ADI Specific Platforms +* +* ADRV904X API Version: 2.10.0.4 +*/ + +#include "adi_platform.h" + +#ifdef _ADI_ADS10_PLATFORM +#include "ads10/ads10_init.h" +#include "ads10/ads10_i2c.h" +#include "ads10/ads10_spi.h" +#include "ads10/ads10_timer.h" +#include "ads10/ads10_bbic_control.h" +#include "posix/posix_mutex.h" +#endif + +#include "../platforms/common/tls.h" +#include "../platforms/common/adi_logging.h" + +///* +// * Function pointer assignment for default configuration +// */ +// +///* Initialization interface to open, init, close drivers and pointers to resources */ +//adi_hal_Err_e (*adi_hal_HwOpen)(void* const devHalCfg) = NULL; +// +//adi_hal_Err_e (*adi_hal_HwClose)(void* const devHalCfg) = NULL; +// +//adi_hal_Err_e (*adi_hal_HwReset)(void* const devHalCfg, const uint8_t pinLevel) = NULL; +// +//void* (*adi_hal_DevHalCfgCreate)( const uint32_t interfaceMask, +// const uint8_t spiChipSelect, +// const char* const logFilename) = NULL; +// +//adi_hal_Err_e (*adi_hal_DevHalCfgFree)(void* devHalCfg) = NULL; +// +///* SPI Interface */ +//adi_hal_Err_e (*adi_hal_SpiWrite)( void* const devHalCfg, +// const uint8_t txData[], +// const uint32_t numTxBytes) = NULL; +// +//adi_hal_Err_e (*adi_hal_SpiRead)( void* const devHalCfg, +// const uint8_t txData[], +// uint8_t rxData[], +// const uint32_t numRxBytes) = NULL; +// +///* I2C Interface */ +//adi_hal_Err_e(*adi_hal_I2cWrite)( void* const devHalCfg, +// const uint8_t txData[], +// const uint32_t numTxBytes) = NULL; +// +//adi_hal_Err_e(*adi_hal_I2cRead)( void* const devHalCfg, +// const uint8_t txData[], +// const uint32_t numTxBytes, +// uint8_t rxData[], +// const uint32_t numRxBytes) = NULL; +// +///* Logging interface */ +//adi_hal_Err_e (*adi_hal_LogFileOpen)( void* const devHalCfg, +// const char* const filename) = NULL; +// +//adi_hal_Err_e (*adi_hal_LogLevelSet)( void* const devHalCfg, +// const uint32_t logLevelMask) = NULL; +// +//adi_hal_Err_e (*adi_hal_LogLevelGet)( void* const devHalCfg, +// uint32_t* const logLevelMask) = NULL; +// +//adi_hal_Err_e (*adi_hal_LogStatusGet)( void* const devHalCfg, +// adi_hal_LogStatusGet_t* const logStatus) = NULL; +// +//adi_hal_Err_e (*adi_hal_LogConsoleSet)( void* const devHalCfg, +// const adi_hal_LogConsole_e logConsoleFlag) = NULL; +// +// +// +//adi_hal_Err_e (*adi_hal_LogWrite)( void* const devHalCfg, +// const adi_hal_LogLevel_e logLevel, +// const uint8_t indent, +// const char* const comment, +// va_list argp) = NULL; +// +//adi_hal_Err_e (*adi_hal_LogFileClose)(void* const devHalCfg) = NULL; +// +///* Timer interface */ +//adi_hal_Err_e (*adi_hal_Wait_ms)(void* const devHalCfg, const uint32_t time_ms) = NULL; +//adi_hal_Err_e (*adi_hal_Wait_us)(void* const devHalCfg, const uint32_t time_us) = NULL; +// +///* BBIC control interface */ +//adi_hal_Err_e (*adi_hal_BbicRegisterRead)( void* const devHalCfg, +// const uint32_t addr, +// uint32_t* const data) = NULL; +// +//adi_hal_Err_e (*adi_hal_BbicRegisterWrite)( void* const devHalCfg, +// const uint32_t addr, +// const uint32_t data) = NULL; +// +//adi_hal_Err_e (*adi_hal_BbicRegistersRead)( void* const devHalCfg, +// const uint32_t addr, +// uint32_t data[], +// const uint32_t numDataWords) = NULL; +// +//adi_hal_Err_e (*adi_hal_BbicRegistersWrite)(void* const devHalCfg, +// const uint32_t addr, +// const uint32_t data[], +// const uint32_t numDataWords) = NULL; +// +///* Thread Interface */ +//adi_hal_thread_t (*adi_hal_ThreadSelf)(void) = NULL; +// +//adi_hal_Err_e (*adi_hal_TlsSet)(const adi_hal_TlsType_e tlsType, void* const value) = NULL; +// +//void* (*adi_hal_TlsGet)(const adi_hal_carrierGainRegTlsType_e tlsType) = NULL; +// +///* Mutex Interface */ +//adi_hal_Err_e(*adi_hal_MutexInit)(adi_hal_mutex_t* const mutex) = NULL; +//adi_hal_Err_e(*adi_hal_MutexLock)(adi_hal_mutex_t* const mutex) = NULL; +//adi_hal_Err_e(*adi_hal_MutexUnlock)(adi_hal_mutex_t* const mutex) = NULL; +//adi_hal_Err_e(*adi_hal_MutexDestroy)(adi_hal_mutex_t* const mutex) = NULL; +// +//adi_hal_Err_e(*adi_hal_BoardIdentify)(char** boardNames, int32_t* numBoards) = NULL; +// +//ADI_API adi_hal_Err_e adi_hal_PlatformSetup(const adi_hal_Platforms_e platform) +//{ +// adi_hal_Err_e error = ADI_HAL_ERR_PARAM; +// +// switch (platform) +// { +// case ADI_ADS10_PLATFORM: +//#ifdef _ADI_ADS10_PLATFORM +// adi_hal_HwOpen = ads10_HwOpen; +// adi_hal_HwClose = ads10_HwClose; +// adi_hal_HwReset = ads10_HwReset; +// adi_hal_DevHalCfgCreate = ads10_DevHalCfgCreate; +// adi_hal_DevHalCfgFree = ads10_DevHalCfgFree; +// +//#ifdef ADI_ADRV904X_SPI_DEV_DRIVER_EN +// adi_hal_SpiWrite = ads10_SpiWrite; +// adi_hal_SpiRead = ads10_SpiRead; +//#else +// adi_hal_SpiWrite = ads10_SpiWrite_v2; +// adi_hal_SpiRead = ads10_SpiRead_v2; +//#endif +// adi_hal_I2cWrite = NULL; /* ADS10 does not require I2C interface to any devices used in device API layer */ +// adi_hal_I2cRead = NULL; /* ADS10 does not require I2C interface to any devices used in device API layer */ +// +// adi_hal_LogFileOpen = adi_LogFileOpen; +// adi_hal_LogLevelSet = adi_LogLevelSet; +// adi_hal_LogLevelGet = adi_LogLevelGet; +// adi_hal_LogStatusGet = adi_LogStatusGet; +// adi_hal_LogConsoleSet = adi_LogConsoleSet; +// adi_hal_LogWrite = adi_LogWrite; +// adi_hal_LogFileClose = adi_LogFileClose; +// +// adi_hal_Wait_us = ads10_TimerWait_us; +// adi_hal_Wait_ms = ads10_TimerWait_ms; +// +// /* only required to support the ADI FPGA*/ +// adi_hal_BbicRegisterRead = ads10_BbicRegisterRead; +// adi_hal_BbicRegisterWrite = ads10_BbicRegisterWrite; +// adi_hal_BbicRegistersRead = ads10_BbicRegistersRead; +// adi_hal_BbicRegistersWrite = ads10_BbicRegistersWrite; +// +// adi_hal_ThreadSelf = posix_ThreadSelf; +// adi_hal_TlsGet = common_TlsGet; +// adi_hal_TlsSet = common_TlsSet; +// adi_hal_MutexInit = posix_MutexInit; +// adi_hal_MutexLock = posix_MutexLock; +// adi_hal_MutexUnlock = posix_MutexUnlock; +// adi_hal_MutexDestroy = posix_MutexDestroy; +// adi_hal_BoardIdentify = ads10_BoardIdentify; +// error = common_TlsInit(); +//#else +// error = ADI_HAL_ERR_NOT_IMPLEMENTED; +//#endif +// break; +// default: +// error = ADI_HAL_ERR_PARAM; +// break; +// } +// +// return error; +//} diff --git a/drivers/rf-transceiver/koror/platforms/adi_platform.h b/drivers/rf-transceiver/koror/platforms/adi_platform.h new file mode 100644 index 00000000000..a2d805efa98 --- /dev/null +++ b/drivers/rf-transceiver/koror/platforms/adi_platform.h @@ -0,0 +1,533 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** +* \file adi_platform.h +* +* \brief Declarations for Generic ADI Platform +* +* ADRV904X API Version: 2.10.0.4 +* +* \note Implementation required to guarantee ADI Device functionality +* +* WARNING: Declarations in this file MUST NOT be modified +* +* Set of Global Function Pointers Requiring Definition & Initialization for use with ADI Devices +* +* HAL Configurations are Opaque to ADI Devices (i.e. using void* for devHalCfg) +* adi_hal_Interfaces_e - Bit Mask Abstraction for defining interfaces for a HAL Configuration +* +* One HAL Configuration Required per Device (i.e. ADI Device Structure includes HAL Device Pointer) +* +* Basic Sequence: +* +* 1) adi_hal_DevHalCfgCreate() -> Interfaces Defined are Hardware/Feature Specific +* 2) adi_hal_HwOpen() -> Enable all Selected HAL Interfaces & Features +* 3) Use Device -> Hardware Ready for Use +* 4) adi_hal_HwClose() -> Release all Resources, i.e. Clean-up Task +* 5) adi_hal_DevHalCfgFree() -> Free Memory, i.e. Clean-up Task +* +* Logging Feature is per HAL Configuration (i.e. Each ADI Device has its own log file) +* +* HAL API's include multi-threaded applications support +* Single Threaded Applications must stub these API's (i.e. return success) +*/ + +#ifndef __ADI_PLATFORM_H__ +#define __ADI_PLATFORM_H__ + +#ifdef __GNUC__ /* __unix__ verify if our linux image declare this */ + #define OS_Windows 0 +#else /* windows */ + +#if _WIN64 == 0 /* _Win32 */ + #define OS_Windows 32 +#elif _WIN64 == 1 /* _Win64 */ + #define OS_Windows 64 +#endif +#endif + +#ifndef ADI_API + #ifdef __cplusplus + #define ADI_API extern "C" + #else + #define ADI_API + #endif +#endif +#ifndef ADI_API_EX + #ifdef __cplusplus + #define ADI_API_EX ADI_API + #else + #define ADI_API_EX ADI_API extern + #endif +#endif + +/* ADI_HAL_MAX_THREADS defines the maximum number of threads that can simultaneously use the API. Effectively + * it is the maximum number of threads that can have an adi_common_ErrData_t registered (using adi_hal_TlsSet) + * at one time. */ +#ifndef ADI_HAL_MAX_THREADS +#define ADI_HAL_MAX_THREADS 1U +#endif + +#if ADI_HAL_MAX_THREADS <= 0 +#error "ADI_HAL_MAX_THREADS defined as <=0. It must be defined to be >= 1 or omitted in which case it defaults to 1." +#endif + +#include "adi_platform_types.h" +#include "adi_platform_impl.h" + +/** + * BBIC Init, Open, Close functions + */ + +/** + * \brief Returns a handle to a HAL configuration with the specified interfaces enabled and based + * on the supplied parameters. Several HAL configurations may be created independently. A HAL + * configuration must be obtained via this function and must be supplied as the \p devHalCfg + * parameter to all other HAL API functions. + * + * \post After creation the returned devHalCfg needs to be opened with adi_hal_HwOpen before being + * used. + * + * \post To prevent resource leakage all HAL configurations must eventually be freed using + * adi_hal_DevHalCfgFree. + * + * \retval void* - Pointer to Object Containing HAL Configuration + */ +ADI_API_EX void* (*adi_hal_DevHalCfgCreate)(const uint32_t interfaceMask, const uint8_t spiChipSelect, const char* const logFilename); + +/** + * \brief Prepares the HAL interfaces associated with the devHalCfg handle for use. + * + * This function must be called before any of the other HAL functions are called for the + * same \param devHalCfg. This function must be called only once for each value of \param devHalCfg. + * + * Applications do not need to call this function directly. Opening is done by assigning + * the devHalCfg to an ADI device and opening that device with a device-specific HwOpen + * call (e.g. adi_adrv904x_HwOpen). + * + * \pre The value of \param devHalCfg has been previously returned from a call to + * adi_hal_DevHalCfgCreate. + * + * \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful + */ +ADI_API_EX adi_hal_Err_e (*adi_hal_HwOpen)(void* const devHalCfg); + +/** + * \brief Notifies the HAL that the configuration is no longer required and that any resources + * acquired for that configuration may be released. Must be called before adi_hal_DevHalCfgFree. + * + * Applications do not need to call this function directly. Closing is done by closing the ADI + * device to which the devHalCfg was assigned. i.e by calling a device-specific HwClose function + * (e.g. adi_adrv904x_HwClose). + * + * \pre The value of \param devHalCfg has been previously returned from a call to + * adi_hal_DevHalCfgCreate. + * + * \pre The value of \param devHalCfg has been opened with adi_hal_HwOpen. + * + * \post After this call the configuration must be freed using adi_hal_DevHalCfgFree. + * \post After this call no function except adi_hal_DevHalCfgFree may be called in relation to this + * devHalCfg. The devHalCfg may not be re-opened. + * + * \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful + */ +ADI_API_EX adi_hal_Err_e (*adi_hal_HwClose)(void* const devHalCfg); + +/** + * \brief Performs a reset (which may be a physical power-on reset or power-cycle) of the device + * addressed by the HAL configuration's SPI interface. + * + * \pre The value of \param devHalCfg has been previously returned from a call to + * adi_hal_DevHalCfgCreate. + * + * \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful + */ +ADI_API_EX adi_hal_Err_e (*adi_hal_HwReset)(void* const devHalCfg, const uint8_t pinLevel); + +/** + * \brief Indicate that the client is finished with a HAL configuration itself. The configuration + * can only be freed after first being closed with adi_hal_HwClose. After this function the + * supplied HAL configuration handle may no longer be used with any HAL API function. + * + * \pre The value of \param devHalCfg has been previously returned from a call to + * adi_hal_DevHalCfgCreate. + * + * \pre The \param devHalCfg has been closed with adi_hal_HwClose. + * + * \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful + */ +ADI_API_EX adi_hal_Err_e (*adi_hal_DevHalCfgFree)(void* devHalCfg); + +/** + * \brief Function to write the the specified data to the device I2C port + * + * If numTxBytes is 0, no transaction is to take place and function is to + * return ADI_HAL_ERR_OK. + * + * \param devHalCfg Pointer to device instance specific platform settings + * \param txData Byte array of data to write to the I2C device. First byte +* should be the I2C register address followed by one or more data bytes. + * \param numTxBytes Number of bytes in the txData array + * + * \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful + */ +ADI_API_EX adi_hal_Err_e(*adi_hal_I2cWrite)(void* const devHalCfg, const uint8_t txData[], const uint32_t numTxBytes); + +/** + * \brief Function to read data from the device via I2C port + * + * If numRxBytes is 0, no transaction is to take place and function is to + * return ADI_HAL_ERR_OK. + * + * \param devHalCfg Pointer to device instance specific platform settings + * \param txData Byte array of data to write to the I2C device. Depending on the +* I2C device, this might just be 1 byte containing the register +* address to read + * \param numTxBytes Number of bytes in the txData array + * \param rxData Byte array to return the read back data + * \param numRxBytes Number of bytes to read back, and size of rxData array + * + * \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful + */ +ADI_API_EX adi_hal_Err_e(*adi_hal_I2cRead)(void* const devHalCfg, const uint8_t txData[], const uint32_t numTxBytes, + uint8_t rxData[], const uint32_t numRxBytes); + +/** + * \brief Function to write the the specified data to the device SPI port + * + * If numTxBytes is 0, no transaction is to take place and function is to + * return ADI_HAL_ERR_OK. + * + * \param devHalCfg Pointer to device instance specific platform settings + * \param txData Array of data to be written to the device + * \param numTxBytes Size of txData + * + * \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful + */ +ADI_API_EX adi_hal_Err_e (*adi_hal_SpiWrite)(void* const devHalCfg, const uint8_t txData[], const uint32_t numTxBytes); + +/** + * \brief Function to read data from the device via SPI port + * + * Input arrays will be the same size to support full duplex SPI drivers. + * + * If numRxBytes is 0, no transaction is to take place and function is to + * return ADI_HAL_ERR_OK. + * + * \param devHalCfg Pointer to device instance specific platform settings + * \param txData Array of bytes to write to the device + * \param rxData Array of bytes read from the device + * \param numRxBytes Size of txData and rxData arrays. Arrays must be of + * the same size. + * + * \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful + */ +ADI_API_EX adi_hal_Err_e (*adi_hal_SpiRead)(void* const devHalCfg, + const uint8_t txData[], + uint8_t rxData[], + const uint32_t numRxBytes); + +/** +* \brief Service to get Logging Status +* +* \param devHalCfg Pointer to device instance specific platform settings +* \param logStatus Pointer to Structure that will be populated with Log Status +* +* \note Error Count & Flags are reset after each Status Call +* +* \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful +*/ +ADI_API_EX adi_hal_Err_e (*adi_hal_LogStatusGet)(void* const devHalCfg, adi_hal_LogStatusGet_t* const logStatus); + +/** +* \brief Opens a logFile. If the file is already open it will be closed and reopened. +* +* This function opens the file for writing and saves the resulting file +* descriptor to the devHalCfg structure. +* +* \param devHalCfg Pointer to device instance specific platform settings +* \param filename The user provided name of the file to open. +* +* \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful +* +*/ +ADI_API_EX adi_hal_Err_e (*adi_hal_LogFileOpen)(void* const devHalCfg, const char* const filename); + +/** +* \brief Service to Close a Log File +* +* \param devHalCfg Pointer to device instance specific platform settings +* +* \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful +* +*/ +ADI_API_EX adi_hal_Err_e (*adi_hal_LogFileClose)(void* const devHalCfg); + +/** +* \brief Sets the log level, allowing the end user to select the granularity of +* what events get logged. +* +* \param devHalCfg Pointer to device instance specific platform settings +* \param logMask Bitwise Mask of adi_hal_LogLevel_e values to capture messages of a specific type +* +* \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful +* +*/ +ADI_API_EX adi_hal_Err_e (*adi_hal_LogLevelSet)(void* const devHalCfg, const uint32_t logMask); + +/** + * \brief Gets the currently set log level: the mask of different types of log + * events that are currently enabled to be logged. + * + * \param devHalCfg Pointer to device instance specific platform settings + * \param logMask Bitwise Mask of adi_hal_LogLevel_e values to capture messages of a specific type + * + * \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful + * + */ +ADI_API_EX adi_hal_Err_e (*adi_hal_LogLevelGet)(void* const devHalCfg, uint32_t* const logMask); + +/** + * \brief Service to Set to Logging to Console Flag + * + * \param devHalCfg Pointer to device instance specific platform settings + * \param logConsoleFlag Log to Console Flag Setting + * + * \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful + * + */ +ADI_API_EX adi_hal_Err_e (*adi_hal_LogConsoleSet)(void* const devHalCfg, const adi_hal_LogConsole_e logConsoleFlag); + + +/** +* \brief Writes a message to the currently open logFile specified in the +* adi_hal_LogCfg_t of the devHalCfg structure passed +* +* Uses the vfprintf functionality to allow the user to supply the format and +* the number of arguments that will be logged. +* +* \param devHalCfg Pointer to device instance specific platform settings +* \param logLevel Specified Logging Level +* \param comment the string to include in the line added to the log. +* \param argp variable argument list to be printed +* +* \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful +* +*/ +ADI_API_EX adi_hal_Err_e (*adi_hal_LogWrite)( void* const devHalCfg, + const adi_hal_LogLevel_e logLevel, + const uint8_t indent, + const char* const comment, + va_list argp); + +/** +* \brief Provides a blocking delay of the current thread +* +* \param devHalCfg Pointer to device instance specific platform settings +* \param time_us the time to delay in micro seconds +* +* \retval ADI_HAL_ERR_OK Function completed successfully +*/ +ADI_API_EX adi_hal_Err_e (*adi_hal_Wait_us)(void* const devHalCfg, const uint32_t time_us); + +/** +* \brief Provides a blocking delay of the current thread +* +* \param devHalCfg Pointer to device instance specific platform settings +* \param time_ms the Time to delay in milli seconds +* +* \retval ADI_HAL_ERR_OK Function completed successfully +* +*/ +ADI_API_EX adi_hal_Err_e (*adi_hal_Wait_ms)(void* const devHalCfg, const uint32_t time_ms); + +/** + * \brief Function to read a single BBIC control register + * + * \param devHalCfg Pointer to device instance specific platform settings + * \param addr 32bit address of BBIC register to read + * \param data 32bit Pointer to store return value representing the data of the register at the specified address + * + * \retval ADI_HAL_ERR_OK Function completed successfully + */ +ADI_API_EX adi_hal_Err_e (*adi_hal_BbicRegisterRead)(void* const devHalCfg, const uint32_t addr, uint32_t* const data); + +/** + * \brief Function to write a single BBIC control register + * + * \param devHalCfg Pointer to device instance specific platform settings + * \param addr 32bit address of BBIC register to write + * \param data 32bit data to write to the register at the specified address + * + * \retval ADI_HAL_ERR_OK Function completed successfully + */ +ADI_API_EX adi_hal_Err_e (*adi_hal_BbicRegisterWrite)(void* const devHalCfg, const uint32_t addr, const uint32_t data); + +/** + * \brief Function to read multiple consecutive BBIC control registers starting at a specified register address. + * + * If numDataWords is 0, no transaction is to take place and function is to + * return ADI_HAL_ERR_OK. + * + * \param devHalCfg Pointer to device instance specific platform settings + * \param addr 32bit address of BBIC register to start reading from + * \param data 32bit Pointer to store return array representing the data starting at the specified register address + and ending at (addr + numDataWords -1) + * \param numDataWords Number of elements in the data array + * + * \retval ADI_HAL_ERR_OK Function completed successfully + */ +ADI_API_EX adi_hal_Err_e (*adi_hal_BbicRegistersRead)( void* const devHalCfg, + const uint32_t addr, + uint32_t data[], + const uint32_t numDataWords); + +/** + * \brief Function to write multiple consecutive BBIC control registers starting at a specified register address. + * + * If numDataWords is 0, no transaction is to take place and function is to + * return ADI_HAL_ERR_OK. + * + * \param devHalCfg Pointer to device instance specific platform settings + * \param addr 32bit address of BBIC register to start writing to + * \param data 32bit Pointer to array representing the data to write starting at the specified register address + * and ending at (addr + numDataWords -1) + * \param numDataWords Number of elements in the data array + * + * \retval ADI_HAL_ERR_OK Function completed successfully + */ +ADI_API_EX adi_hal_Err_e (*adi_hal_BbicRegistersWrite)( void* const devHalCfg, + const uint32_t addr, + const uint32_t data[], + const uint32_t numDataWords); + +/** + * \brief Returns the ID of the calling thread. + * + * Non-multithreaded HALs must implement this function but may return the same value regardless + * of the calling thread. + */ +ADI_API_EX adi_hal_thread_t (*adi_hal_ThreadSelf)(void); + +/** + * \brief Before being used a mutex must be initialized with this function. The mutex is + * initialized into the unlocked state. + * + * The HAL mutex API intends to be a subset of the Linux implementation of the POSIX API. + * Some differences: + * - There is no HAL_MUTEX_INITIALIZER - adi_hal_mutex_init must be used. + * - There is no adi_hal_mutexattr_settype - all mutex's are recursive. + * - adi_hal_mutex_lock blocks indefinitely - there is no adi_hal_trylock nor + * pthread_mutex_timedlock. + * - Any failure of any functions of the API is indicated by returning a non-zero value. + * - There is no requirement to allow mutex's to be re-initialized after being destroyed. + * - TODO BOM - refine error handling. + * - TODO BOM - refine blocking semantics. Do we need to specify 'blocks indefinitely' we could + * allow a HAL specific timeout returning something like EAGAIN but need a way to + * route this platform specific code back to the API client. + * + * If the HAL provided to the API does not support multi-threading the HAL must still + * define hal_mutex_t and supply implementations of adi_hal_MutexXxx functions returning + * ADI_HAL_ERR_OK. + */ +ADI_API_EX adi_hal_Err_e (*adi_hal_MutexInit)(adi_hal_mutex_t* const mutex); + +/** + * \brief Acquire the mutex. + * + * Will block indefinitely to acquire the mutex. All mutex's are recursive so the same thread can + * lock the same mutex multiple times but must take care to unlock it the same number of times + * before another thread can acquire it. + * + * Non-multithreaded HALs must implement this function but it can just simply return 0 + */ +ADI_API_EX adi_hal_Err_e (*adi_hal_MutexLock)(adi_hal_mutex_t* const mutex); + +/** + * \brief Unlocks the mutex. + */ +ADI_API_EX adi_hal_Err_e (*adi_hal_MutexUnlock)(adi_hal_mutex_t* const mutex); + +/** + * \brief Signal to the HAL that the mutex is no longer required and any associated resources can + * be released. The mutex must itself must already be released (i.e. has been unlocked as many + * times as it has been locked). After being destroyed a mutex must not be used or initialized + * again. + * + * Non-multithreaded HALs must implement this function but it can just simply return 0 + */ +ADI_API_EX adi_hal_Err_e (*adi_hal_MutexDestroy)(adi_hal_mutex_t* const mutex); + +/** + * \brief Store \param value on behalf of the calling thread and associate it with \param tlsType. + * To retrieve the value later the same thread calls adi_hal_TlsGet using the same value of + * \param tlsType. + * + * If adi_hal_TlsSet was previously called with a different value the new value overwrites the existing + * value stored. Until a thread calls adi_hal_TlsSet the value associated with that thread is NULL for + * all values of \param tlsType. + * + * The HAL thread-local storage API intends to be similar to the POSIX pthread_set/get specific API. + * But only allows a small number of key values which removes the need for a function similar to + * pthread_key_create() and replaces pthread_key_t with adi_hal_TlsType_e. + * + * Implementations must support tlsTypes of HAL_TLS_ERR and may support other values. + * + * A call supplying a \param value of NULL marks the TLS slot for the calling thread as empty and + * the slot may be assigned subsequently to another thread. A call supplying a \param value of NULL + * cannot fail. + * + * A HAL implementation may have a fixed, low limit on TLS slots. All client threads that call an + * ADI API function MUST after it's final API call and before termination call + * adi_hal_set_tls(HAL_TLS_END, NULL) to ensure its TLS slots are made available for subsequent + * threads using the API. + * + * Non-multithreaded HALs must implement this function and still keep an association between \param + * tlsType and \param value but can use the same association for each thread - i.e. simply ignore + * the identity of the calling thread so that a value set by one thread overwrites the value + * set by any previous thread. + */ +ADI_API_EX adi_hal_Err_e (*adi_hal_TlsSet)(const adi_hal_TlsType_e tlsType, void* const value); + +/** + * \brief Return the value associated with the calling thread for \param tlsType. + * + * Non-multithreaded HALs must implement this function and still keep an association between \param + * tlsType and \param value but can use the same association for each thread - i.e. simply ignore + * the identity of the calling thread so the value returned for all threads is the same. + * + * Further details of the HAL thread-local storage API are detailed by adi_hal_TlsSet. + */ +ADI_API_EX void* (*adi_hal_TlsGet)(const adi_hal_TlsType_e tlsType); + +/** + * \brief HAL Platform Setup + * + * This function assigns each function pointer declared in adi_platform.h to the correct + * implementation defined in the platform files associated with the adi_hal_Platforms_e + * platform input parameter. + * + * \param devHalInfo Pointer to be assumed as an ADI HAL Configuration + * \param platform ADI Platform Type to be Configured + * + * \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful + */ +ADI_API_EX adi_hal_Err_e adi_hal_PlatformSetup(const adi_hal_Platforms_e platform); + + +/** + * \brief HAL Board Identify + * + * \param boardName Pointer to Board Name String + * + * \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful + */ +ADI_API_EX adi_hal_Err_e(*adi_hal_BoardIdentify)(char** boardNames, int32_t* numBoards); + +#endif /* __ADI_PLATFORM_H__ */ + + diff --git a/drivers/rf-transceiver/koror/platforms/adi_platform_aux.c b/drivers/rf-transceiver/koror/platforms/adi_platform_aux.c new file mode 100644 index 00000000000..41bcf28b73b --- /dev/null +++ b/drivers/rf-transceiver/koror/platforms/adi_platform_aux.c @@ -0,0 +1,31 @@ +/* + * Functions to read I2C EEPROM info based on FMC EEPROM format + */ + +#include "adi_platform_aux.h" + +#ifdef __GNUC__ +#include +#include +#include +#include + +ADI_API void __gcov_flush(); +#else +#ifdef _WIN64 +#define ssize_t __int64 +#else +#define ssize_t long +#endif +#endif + +ADI_API int32_t adi_platform_gcov_flush() +{ +#ifdef __GNUC__ + (void) ADI_LIBRARY_PRINTF("Flushing gcov files ... OK\n"); /*not resolved*/ + ADI_LIBRARY_FFLUSH(stdout); +// __gcov_flush(); +#endif + return (0); +} + diff --git a/drivers/rf-transceiver/koror/platforms/adi_platform_aux.h b/drivers/rf-transceiver/koror/platforms/adi_platform_aux.h new file mode 100644 index 00000000000..494bbef3b82 --- /dev/null +++ b/drivers/rf-transceiver/koror/platforms/adi_platform_aux.h @@ -0,0 +1,9 @@ +#ifndef _ADI_PLATFORM_AUX_H__ +#define _ADI_PLATFORM_AUX_H__ + +#include "adi_platform.h" + +ADI_API int32_t adi_platform_gcov_flush(); + +#endif + diff --git a/drivers/rf-transceiver/koror/platforms/adi_platform_impl.h b/drivers/rf-transceiver/koror/platforms/adi_platform_impl.h new file mode 100644 index 00000000000..4e6d5d22071 --- /dev/null +++ b/drivers/rf-transceiver/koror/platforms/adi_platform_impl.h @@ -0,0 +1,35 @@ +/* + * HAL implementors/porters may modify this file to suit the underlying OS + * and hardware. For instance to map abstract HAL types to concrete + * platform/OS-dependent types. + */ + +#ifndef __ADI_PLATFORM_IMPL_H__ +#define __ADI_PLATFORM_IMPL_H__ + +#include "adi_platform_impl_types.h" + +/* Add custom platform functions here */ +FILE* fopen(const char * filename, const char *mode); + +extern int fseekx (FILE * stream, long int offset, int origin); +#define fseek( stream, offset, origin) fseekx( stream, offset, origin) +extern long int ftell (FILE *stream); + +extern int __fclose (FILE *stream); +#define fclose(filename) __fclose(filename) +extern char * fgets(char *dst, int num, FILE *stream); +extern size_t fread(void *ptr, size_t size, size_t count, FILE *stream); +extern size_t fwrite (const void * ptr, size_t size, size_t count, FILE *stream); + +extern FILE* __fopen(const char * filename, const char *mode); +#define fopen(filename, mode) __fopen(filename, mode) + +extern int32_t no_os_log_base_2(uint32_t x); +#undef log2 +#define log2(x) no_os_log_base_2(x); + +extern long int_20db_to_mag(long a, int mdB); + +#endif + diff --git a/drivers/rf-transceiver/koror/platforms/adi_platform_impl_types.h b/drivers/rf-transceiver/koror/platforms/adi_platform_impl_types.h new file mode 100644 index 00000000000..94ff0f3c653 --- /dev/null +++ b/drivers/rf-transceiver/koror/platforms/adi_platform_impl_types.h @@ -0,0 +1,73 @@ +/* + * HAL implementors/porters may modify this file to suit the underlying OS + * and hardware. For instance to map abstract HAL types to concrete + * platform/OS-dependent types. + */ + +#ifndef __ADI_PLATFORM_IMPL_TYPES_H__ +#define __ADI_PLATFORM_IMPL_TYPES_H__ + +#include +typedef pthread_mutex_t adi_hal_mutex_t; +typedef pthread_t adi_hal_thread_t; +/** + * \brief Default filepath for logfiles if none provided + * + * This should be used in platform implementation of adi_hal_LogFileOpen + * to define the default logfile path. + */ +#define ADI_PLATFORM_LOG_PATH_DEFAULT "adi_default_log.txt" + + +/** + * \brief Max number of characters for log file + * + * This should be used in platform implementation of adi_hal_LogFileOpen + * to define the max filepath length. + */ +#define ADI_HAL_STRING_LENGTH 256U + +/** + * \brief Max number of characters per log message + * + * This should be used in platform implementation of adi_hal_LogWrite + * to define the number of characters allowed per log message. + */ +#define ADI_HAL_MAX_LOG_LINE 1000U + +/** + * \brief Max number of lines in log file + * + * This should be used in platform implementation of adi_hal_LogWrite. + * This will ensure log files do not become excessively large during + * operation. + */ +#define ADI_HAL_LOG_MAX_NUM_LINES 2000000U + +/** + * \brief Size, in bytes, of the FIFO used in the SPI driver. + * + * This is critical to get correct based on hardware SPI driver + * if the DUT is placed in streaming mode, since the API SPI + * functions use this value to determine when a new address phase + * should be inserted into the SPI data stream. + */ +#define ADI_HAL_SPI_FIFO_SIZE 255U + + +/** + * \brief Default mode for log console output + * + * Can be used in platform implementation of adi_hal_DevHalCfgCreate to + * give a default value for log console mode when configuring logging. + */ +#define ADI_LOG_CONSOLE_DEFAULT_MODE ADI_LOG_CONSOLE_OFF + +typedef struct no_os_hal_fileio +{ + char *data; + char *ptr, *start, *end; +} CUSTOM_FILE; + +#endif + diff --git a/drivers/rf-transceiver/koror/platforms/adi_platform_types.h b/drivers/rf-transceiver/koror/platforms/adi_platform_types.h new file mode 100644 index 00000000000..481a5323ddd --- /dev/null +++ b/drivers/rf-transceiver/koror/platforms/adi_platform_types.h @@ -0,0 +1,305 @@ +/** + * Copyright 2015 - 2021 Analog Devices Inc. + * Released under the ADRV904X API license, for more information. + * see the "LICENSE.pdf" file in this zip file. + */ + +#ifndef __ADI_PLATFORM_TYPES_H__ +#define __ADI_PLATFORM_TYPES_H__ + +#include "adi_library_types.h" +#include "adi_platform_impl_types.h" + +#define PLATFORM_ENV_VARIABLE "ADI_PLATFORM_NAME" + +#define MEM_SIZE_4KB (uint32_t) 0x00001000U +#define MEM_SIZE_16PLUSMB (uint32_t) 0x010B0000U +#define MEM_SIZE_16MB (uint32_t) 0x01000000U +#define MEM_SIZE_256MB (uint32_t) 0x10000000U +#define MEM_SIZE_512MB (uint32_t) 0x20000000U +#define MEM_SIZE_1GB (uint32_t) 0x40000000U + +#define SYM2STR(x) #x + +#define LOG_ERR_COUNT_LIMIT (uint8_t) 0xFFU + +#define ADI_DEVICE_HAL_OPEN 1U +#define ADI_DEVICE_HAL_CLOSED 0U + +/** + * \brief HAL Error Codes + * + * Hal Error Codes is flexible to Extended onto Operating System Codes + * + * Linux System Errors Ranger 1 - 124 + * + * Offset HAL Errors to 256 + * + * Current ADI Platform will not extend error codes, instead store the OS Error Code into the Device HAL Structure + */ +typedef enum adi_hal_Err +{ + ADI_HAL_ERR_OK = 0x00L, /*!< No Error */ + ADI_HAL_ERR_NULL_PTR = 0xFFL, /*!< Null Pointer */ + ADI_HAL_ERR_PARAM, /*!< Invalid Parameter Error */ + ADI_HAL_ERR_I2C, /*!< I2C Error */ + ADI_HAL_ERR_I2C_WRITE, /*!< I2C Write Error */ + ADI_HAL_ERR_I2C_READ, /*!< I2C Read Error */ + ADI_HAL_ERR_SPI, /*!< SPI Error */ + ADI_HAL_ERR_SPI_WRITE, /*!< SPI Write Error */ + ADI_HAL_ERR_SPI_READ, /*!< SPI Read Error */ + ADI_HAL_ERR_SPI_CS, /*!< SPI Chip Select Error */ + ADI_HAL_ERR_GPIO, /*!< GPIO Error */ + ADI_HAL_ERR_TIMER, /*!< Timer Error */ + ADI_HAL_ERR_BBICCTRL, /*!< BBIC Control Error */ + ADI_HAL_ERR_BBICCTRL_CORE, /*!< BBIC Core Error */ + ADI_HAL_ERR_BBICCTRL_WORD_BOUNDARY, /*!< BBIC Address must be word aligned */ + ADI_HAL_ERR_BBICCTRL_RAM, /*!< BBIC RAM Error */ + ADI_HAL_ERR_BBICCTRL_SPI, /*!< BBIC SPI Error */ + ADI_HAL_ERR_MEMORY, /*!< Memory Error (e.g. Allocation) */ + ADI_HAL_ERR_LOG, /*!< Logging Error */ + ADI_HAL_ERR_LIBRARY, /*!< Library Module Error Code */ + ADI_HAL_ERR_EEPROM_DATA, /*!< EEPROM Data Error Code (e.g. Failed CRC, Invalid Structure Parameter(s) */ + ADI_HAL_ERR_NOT_IMPLEMENTED /*!< HAL Feature Not Implemented */ +} adi_hal_Err_e; + +/** + * \brief Logging Error Codes + */ +typedef enum adi_hal_LogErr +{ + ADI_LOG_ERR_OK = 0x00UL, /*!< No Error */ + ADI_LOG_ERR_OPENING_FILE = 0x01UL, /*!< Opening Log File Error Flag */ + ADI_LOG_ERR_CLOSING_FILE = 0x02UL, /*!< Closing Log File Error Flag */ + ADI_LOG_ERR_FFLUSH = 0x04UL, /*!< Stream Buffer Flushing Error */ + ADI_LOG_ERR_LEVEL = 0x08UL, /*!< Log Level Error Flag */ + ADI_LOG_ERR_WRITE = 0x10UL, /*!< Writing to File Error Flag */ + ADI_LOG_ERR_REWIND = 0x20UL /*!< File Position Reset */ +} adi_hal_LogErr_e; + +/** + * \brief Log Level Message Categories + */ +typedef enum adi_hal_LogLevel +{ + ADI_HAL_LOG_NONE = 0x0UL, /*!< No Logging Flag */ + ADI_HAL_LOG_MSG = 0x1UL, /*!< Message Logging Flag */ + ADI_HAL_LOG_WARN = 0x2UL, /*!< Warning Message Logging Flag */ + ADI_HAL_LOG_ERR = 0x4UL, /*!< Error Message Logging Flag */ + ADI_HAL_LOG_API = 0x8UL, /*!< API Entry Logging Flag */ + ADI_HAL_LOG_API_PRIV = 0x10UL, /*!< Private API Entry Flag */ + ADI_HAL_LOG_BF = 0x20UL, /*!< Bitfield API Entry Flag */ + ADI_HAL_LOG_HAL = 0x40UL, /*!< HAL API Entry Flag */ + ADI_HAL_LOG_SPI = 0x80UL, /*!< SPI Transaction Flag */ + ADI_HAL_LOG_ALL = 0xFFUL /*!< All Logging Enabled */ +} adi_hal_LogLevel_e; + +/** + * \brief Enum type for Console Logging + */ +typedef enum adi_hal_LogConsole +{ + ADI_LOG_CONSOLE_OFF = 0UL, /*!< Logging to Console Disabled */ + ADI_LOG_CONSOLE_ON /*!< Logging to Console Enabled */ +} adi_hal_LogConsole_e; + +/** + * \brief Enum type for HAL platforms + */ +typedef enum adi_hal_Platforms +{ + ADI_ADS10_PLATFORM = 0U, /*!< ADS10 Platform */ + ADI_UNKNOWN_PLATFORM +} adi_hal_Platforms_e; + +/** +* \brief Enum type for HAL Board (daughter card) Identity +*/ +typedef enum adi_hal_Boards +{ + ADI_BOARD_UNKNOWN = 0U, /*!< Unknown Board Type */ + ADI_BOARD_BLANK_EEPROM /*!< Selects for no daughter board present */ +} adi_hal_Boards_e; + +/** + * \brief Enum type for the hardware interfaces supported by the platform. + * Each device specifies which interfaces it needs from the BBIC in its + * devHalCfg structure. + */ +typedef enum adi_hal_Interfaces +{ + ADI_HAL_INTERFACE_SPI = 0x01U, /* Device requires SPI interface from BBIC */ + ADI_HAL_INTERFACE_LOG = 0x02U, /* Device requires Logging interface from BBIC */ + ADI_HAL_INTERFACE_BBICCTRL = 0x04U, /* Device requires BBIC Register/Control interface from BBIC. Mutually exclusive with HWRESET */ + ADI_HAL_INTERFACE_HWRESET = 0x08U, /* Device requires GPIO (reset pins) interface from BBIC. Mutually exclusive with BBICCTRL */ + ADI_HAL_INTERFACE_TIMER = 0x10U, /* Device requires Timer interface from BBIC */ + ADI_HAL_INTERFACE_I2C = 0x20U, /* Device requires I2C interface from BBIC */ + ADI_HAL_INTERFACE_EEPROM = 0x40U /* Device requires EEPROM interface from BBIC */ +} adi_hal_Interfaces_e; + +/** + * \brief BBIC interfaces + */ +typedef enum adi_hal_BbicInterfaces +{ + ADI_HAL_BBIC_CORE = 0x01U, /* Core FPGA registers, including HwReset pins */ + ADI_HAL_BBIC_RAM = 0x02U, /* Ram registers */ + ADI_HAL_BBIC_SPI = 0x04U /* Advanced SPI configuration registers */ +} adi_hal_BbicInterfaces_e; + +/** + * \brief The set of key values HAL supports for associating a value with a thread. + */ +typedef enum +{ + HAL_TLS_ERR = 0U, /*!< Key for associating an adi_common_ErrData_t with a thread. */ + HAL_TLS_USR, /*!< Key for associating an arbitrary void* with a thread. */ + HAL_TLS_END /*!< Marks end of valid values; And a special case in adi_hal_TlsSet */ +} adi_hal_TlsType_e; + +/** + * \brief Data Structure for Logging Facility + */ +typedef struct adi_hal_LogCfg +{ + uint8_t interfaceEnabled; /*!< Interface Enabled Flag */ + uint32_t logMask; /*!< Logging BitMask */ + FILE* logfd; /*!< File Pointer for Log File */ + char logFileName[ADI_HAL_STRING_LENGTH]; /*!< Log File Name */ + uint32_t currentLineNumber; /*!< Current Line Number */ + adi_hal_LogConsole_e logConsole; /*!< Logging to Console Flag */ + uint8_t errCount; /*!< Logging Feature Error Count */ + uint32_t errFlags; /*!< Bit Mask for Logging Feature Error Types */ +} adi_hal_LogCfg_t; + +/** + * \brief Data Structure for Logging Status + */ +typedef struct adi_hal_LogStatusGet +{ + uint8_t interfaceEnabled; /*!< Interface Enabled Flag */ + uint8_t fileOpen; /*!< Logging BitMask */ + const char* logFileName; /*!< File Pointer for Log File */ + uint32_t logMask; /*!< Log File Name */ + adi_hal_LogConsole_e logConsole; /*!< Logging to Console Flag */ + uint8_t errCount; /*!< Logging Feature Error Count */ + uint32_t errFlags; /*!< Bit Mask of adi_hal_LogErr_e Flags for Logging Feature Error Types */ + uint32_t currentLineNumber; /*!< Current Line Number */ +} adi_hal_LogStatusGet_t; + +/** + * \brief Data structure for SPI configuration + */ +typedef struct adi_hal_SpiCfg +{ + uint8_t interfaceEnabled; + int fd; + char spidevName[ADI_HAL_STRING_LENGTH]; + uint8_t chipSelectIndex; /*!< valid 1~8 */ + uint8_t CPHA; /*!< clock phase, sets which clock edge the data updates (valid 0 or 1) */ + uint8_t CPOL; /*!< clock polarity 0 = clock starts low, 1 = clock starts high */ + uint8_t enSpiStreaming; /*!< Not implemented. SW feature to improve SPI throughput. */ + uint8_t autoIncAddrUp; /*!< Not implemented. For SPI Streaming, set address increment direction. 1= next addr = addr+1, 0:addr = addr-1 */ + uint8_t fourWireMode; /*!< 1: Use 4-wire SPI, 0: 3-wire SPI (SDIO pin is bidirectional). NOTE: ADI's FPGA platform always uses 4-wire mode. */ + uint32_t spiClkFreq_Hz; /*!< SPI Clk frequency in Hz (default 25000000), platform will use next lowest frequency that it's baud rate generator can create */ +} adi_hal_SpiCfg_t; + +/** + * \brief Data structure for Hardware reset pin functionality + */ + typedef struct adi_hal_HwResetCfg +{ + uint8_t interfaceEnabled; /*!< */ + uint32_t resetPinIndex; /*!< */ +} adi_hal_HwResetCfg_t; + +/** + * \brief Data structure for I2C configuration + */ +typedef struct adi_hal_I2cCfg +{ + uint8_t interfaceEnabled; + int fd; + char drvName[ADI_HAL_STRING_LENGTH]; +} adi_hal_I2cCfg_t; + +/** + * \brief Data structure for EEPROM configuration + */ +typedef struct adi_hal_EepromCfg +{ + uint8_t interfaceEnabled; + FILE* fd; + char drvName[ADI_HAL_STRING_LENGTH]; +} adi_hal_EepromCfg_t; + +/** + * \brief Data structure for memory Fpga Driver configuration + */ +typedef struct adi_hal_fpga_AxiCfg +{ + char drvName[ADI_HAL_STRING_LENGTH]; + uint32_t mapSize; + uintptr_t mappedMemoryPtr; + int fd; +} adi_hal_fpga_AxiCfg_t; + +/** + * \brief Data structure to hold platform Hardware layer + * settings for all system related feature of the ADI transceiver device + * If the system has multiple ADI transceivers, the user should create one of + * theses structures per transceiver device to specify the HAL settings + * per transceiver device. + */ +typedef struct adi_hal_BbicCfg +{ + uint8_t interfaceEnabled; /*!< Bitmask for the BBIC interfaces. Follows adi_hal_BbicInterfaces_e */ + adi_hal_fpga_AxiCfg_t coreRegsCfg; + adi_hal_fpga_AxiCfg_t ramCfg; + adi_hal_fpga_AxiCfg_t spiAdvRegsCfg; + adi_hal_fpga_AxiCfg_t spi2AdvRegsCfg; +} adi_hal_BbicCfg_t; + +typedef struct adi_hal_TimerCfg +{ + uint8_t interfaceEnabled; /*!< 1: Enable timer interface // 0: Disable timer interface */ +} adi_hal_TimerCfg_t; + +/** + * \brief Data structure to hold platform Hardware layer + * settings for all system/platform related features. + + * If the system has multiple ADI transceivers/devices, the user should create one of + * theses structures per device to specify the HAL settings + * per transceiver device. + */ +typedef struct adi_hal_Cfg +{ + uint32_t interfacemask; /*!< Interface Mask Requested */ + uint8_t openFlag; /*!< Device Open Status Flag */ + char typeName[ADI_HAL_STRING_LENGTH]; /*!< Type Name */ + adi_hal_SpiCfg_t spiCfg; /*!< SPI Configuration */ + adi_hal_LogCfg_t logCfg; /*!< LOG Configuration */ + adi_hal_BbicCfg_t bbicCfg; /*!< BBIC Configuration */ + adi_hal_HwResetCfg_t hwResetCfg; /*!< HW Reset Configuration */ + adi_hal_I2cCfg_t i2cCfg; /*!< I2C Configuration */ + adi_hal_TimerCfg_t timerCfg; /*!< Timer Configuration */ + adi_hal_EepromCfg_t eepromCfg; /*!< Eeprom Configuration */ + int32_t error; /*!< Operating System Error Code */ +} adi_hal_Cfg_t; + +/** + * \brief HAL Board Information Structure + */ +typedef struct adi_hal_BoardInfo +{ + uint8_t manufacturer[ADI_HAL_STRING_LENGTH]; /* Manufacturer */ + uint8_t productName[ADI_HAL_STRING_LENGTH]; /* Product Name */ + uint8_t serialNumber[ADI_HAL_STRING_LENGTH]; /* Serial Number */ + uint8_t partNumber[ADI_HAL_STRING_LENGTH]; /* Part Number */ + uint8_t pcbId[ADI_HAL_STRING_LENGTH]; /* PCB ID */ + uint8_t pcbName[ADI_HAL_STRING_LENGTH]; /* PCB Name */ + uint8_t bomRev[ADI_HAL_STRING_LENGTH]; /* BOM Revision */ +} adi_hal_BoardInfo_t; + +#endif /* __ADI_PLATFORM_TYPES_H__*/ diff --git a/drivers/rf-transceiver/koror/platforms/common/adi_logging.c b/drivers/rf-transceiver/koror/platforms/common/adi_logging.c new file mode 100644 index 00000000000..d93050967a0 --- /dev/null +++ b/drivers/rf-transceiver/koror/platforms/common/adi_logging.c @@ -0,0 +1,489 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/* +* \file adi_logging.c +*/ + +#include "adi_logging.h" +#include "adi_library.h" + +typedef struct tm tm_t; + +ADI_API adi_hal_Err_e adi_LogFileOpen(void* const devHalCfg, const char* const filename) +{ + adi_hal_Err_e halError = ADI_HAL_ERR_NULL_PTR; + adi_hal_Cfg_t* halCfg = NULL; + time_t seconds = { 0 }; + tm_t timeStampRec; + const tm_t* timeStamp = NULL; + + if (NULL != devHalCfg) + { + halError = ADI_HAL_ERR_PARAM; + + /* Assume ADI HAL Structure */ + halCfg = (adi_hal_Cfg_t*) devHalCfg; + + if (0U != halCfg->logCfg.interfaceEnabled) + { + halError = ADI_HAL_ERR_LOG; + /* Check if Log File is already Open */ + if (NULL != halCfg->logCfg.logfd) + { + (void) adi_LogFileClose(devHalCfg); + } + + if (NULL == halCfg->logCfg.logfd) /* No Log File Open */ + { + if (NULL != filename) + { + /* New File Name */ + (void) ADI_LIBRARY_STRNCPY(halCfg->logCfg.logFileName, filename, (ADI_HAL_STRING_LENGTH-1)); + } + + halCfg->logCfg.logfd = ADI_LIBRARY_FOPEN(halCfg->logCfg.logFileName, "w+"); + if (NULL != halCfg->logCfg.logfd) + { + /* Time Stamp Log File */ + ADI_LIBRARY_MEMSET(&timeStampRec, 0, sizeof(timeStampRec)); + (void) ADI_LIBRARY_TIME(&seconds); + timeStamp = ADI_LIBRARY_LOCALTIME_R(&seconds, &timeStampRec); /* Returned value points to a shared internal statically allocated object */ + if (EOF != ADI_LIBRARY_FPRINTF( halCfg->logCfg.logfd, + "ADI Log File: %s \nCreated: %04d-%02d-%02d %02d:%02d:%02d \nLog Mask: 0x%" PRIX32 "\n\n\n", + halCfg->logCfg.logFileName, + timeStamp->tm_year + 1900, + timeStamp->tm_mon + 1, + timeStamp->tm_mday, + timeStamp->tm_hour, + timeStamp->tm_min, + timeStamp->tm_sec, + halCfg->logCfg.logMask)) + { + if (EOF != ADI_LIBRARY_FFLUSH(halCfg->logCfg.logfd)) + { + halCfg->logCfg.currentLineNumber = 0U; + halCfg->logCfg.errCount = 0U; + halCfg->logCfg.errFlags = 0U; + halError = ADI_HAL_ERR_OK; + } + } + } + } + } + + if (ADI_HAL_ERR_OK != halError) + { + if (LOG_ERR_COUNT_LIMIT > halCfg->logCfg.errCount) + { + ++halCfg->logCfg.errCount; + } + halCfg->logCfg.errFlags |= ADI_LOG_ERR_OPENING_FILE; + } + } + + return halError; +} + +ADI_API adi_hal_Err_e adi_LogFileFlush(void* const devHalCfg) +{ + adi_hal_Err_e halError = ADI_HAL_ERR_NULL_PTR; + adi_hal_Cfg_t* halCfg = NULL; + + if (NULL != devHalCfg) + { + halError = ADI_HAL_ERR_PARAM; + + /* Assume ADI HAL Structure */ + halCfg = (adi_hal_Cfg_t*) devHalCfg; + + if (0U != halCfg->logCfg.interfaceEnabled) + { + halError = ADI_HAL_ERR_LOG; + + if (NULL != halCfg->logCfg.logfd) + { + if (EOF != ADI_LIBRARY_FFLUSH(halCfg->logCfg.logfd)) + { + halError = ADI_HAL_ERR_OK; + } + } + } + + if (ADI_HAL_ERR_OK != halError) + { + if (LOG_ERR_COUNT_LIMIT > halCfg->logCfg.errCount) + { + ++halCfg->logCfg.errCount; + } + halCfg->logCfg.errFlags |= ADI_LOG_ERR_FFLUSH; + } + } + + return halError; +} + +ADI_API adi_hal_Err_e adi_LogFileClose(void* const devHalCfg) +{ + adi_hal_Err_e halError = ADI_HAL_ERR_NULL_PTR; + adi_hal_Cfg_t* halCfg = NULL; + + if (NULL != devHalCfg) + { + halError = ADI_HAL_ERR_PARAM; + + /* Assume ADI HAL Structure */ + halCfg = (adi_hal_Cfg_t*) devHalCfg; + + if (0U != halCfg->logCfg.interfaceEnabled) + { + halError = ADI_HAL_ERR_LOG; + + if (NULL != halCfg->logCfg.logfd) + { + if (0 == ADI_LIBRARY_FFLUSH(halCfg->logCfg.logfd)) + { + if (EOF != ADI_LIBRARY_FCLOSE(halCfg->logCfg.logfd)) + { + halCfg->logCfg.logfd = NULL; + halError = ADI_HAL_ERR_OK; + } + } + } + } + + if (ADI_HAL_ERR_OK != halError) + { + if (LOG_ERR_COUNT_LIMIT > halCfg->logCfg.errCount) + { + ++halCfg->logCfg.errCount; + } + halCfg->logCfg.errFlags |= ADI_LOG_ERR_CLOSING_FILE; + } + } + + return halError; +} + +ADI_API adi_hal_Err_e adi_LogLevelSet(void* const devHalCfg, const uint32_t logMask) +{ + adi_hal_Err_e halError = ADI_HAL_ERR_NULL_PTR; + adi_hal_Cfg_t* halCfg = NULL; + time_t seconds = { 0 }; + tm_t timeStampRec; + const tm_t* timeStamp = NULL; + + if (NULL != devHalCfg) + { + halError = ADI_HAL_ERR_PARAM; + /* Assume ADI HAL Structure */ + halCfg = (adi_hal_Cfg_t*) devHalCfg; + if (0U != halCfg->logCfg.interfaceEnabled) + { + halError = ADI_HAL_ERR_LOG; + halCfg->logCfg.logMask = logMask; + + if (NULL != halCfg->logCfg.logfd) + { + /* Time Stamp Log File with Log Mask */ + ADI_LIBRARY_MEMSET(&timeStampRec, 0, sizeof(timeStampRec)); + (void) ADI_LIBRARY_TIME(&seconds); + timeStamp = ADI_LIBRARY_LOCALTIME_R(&seconds, &timeStampRec); /* Returned value points to a shared internal statically allocated object */ + if (EOF != ADI_LIBRARY_FPRINTF(halCfg->logCfg.logfd, + "%04d-%02d-%02d %02d:%02d:%02d: Log Mask: 0x%" PRIX32 "\n", + timeStamp->tm_year + 1900, + timeStamp->tm_mon + 1, + timeStamp->tm_mday, + timeStamp->tm_hour, + timeStamp->tm_min, + timeStamp->tm_sec, + halCfg->logCfg.logMask)) + { + if (EOF != ADI_LIBRARY_FFLUSH(halCfg->logCfg.logfd)) + { + halError = ADI_HAL_ERR_OK; + } + } + } + } + + if (ADI_HAL_ERR_OK != halError) + { + if (LOG_ERR_COUNT_LIMIT > halCfg->logCfg.errCount) + { + ++halCfg->logCfg.errCount; + } + halCfg->logCfg.errFlags |= ADI_LOG_ERR_LEVEL; + } + } + + return halError; +} + +ADI_API adi_hal_Err_e adi_LogLevelGet(void* const devHalCfg, uint32_t* const logMask) +{ + adi_hal_Err_e halError = ADI_HAL_ERR_NULL_PTR; + adi_hal_Cfg_t* halCfg = NULL; + + if ((NULL != devHalCfg) && + (NULL != logMask)) + { + halError = ADI_HAL_ERR_PARAM; + /* Assume ADI HAL Structure */ + halCfg = (adi_hal_Cfg_t*) devHalCfg; + if (0U != halCfg->logCfg.interfaceEnabled) + { + *logMask = halCfg->logCfg.logMask; + halError = ADI_HAL_ERR_OK; + } + + if (ADI_HAL_ERR_OK != halError) + { + if (LOG_ERR_COUNT_LIMIT > halCfg->logCfg.errCount) + { + ++halCfg->logCfg.errCount; + } + halCfg->logCfg.errFlags |= ADI_LOG_ERR_LEVEL; + } + } + + return halError; +} + +ADI_API adi_hal_Err_e adi_LogStatusGet( void* const devHalCfg, + adi_hal_LogStatusGet_t* const logStatus) +{ + adi_hal_Err_e halError = ADI_HAL_ERR_NULL_PTR; + adi_hal_Cfg_t* halCfg = NULL; + + if ((NULL != devHalCfg) && + (NULL != logStatus)) + { + /* Assume ADI HAL Structure */ + halCfg = (adi_hal_Cfg_t*) devHalCfg; + + (void) ADI_LIBRARY_MEMSET(logStatus, 0, sizeof(adi_hal_LogStatusGet_t)); + + + + /* Copy Data */ + logStatus->interfaceEnabled = halCfg->logCfg.interfaceEnabled; + logStatus->logMask = halCfg->logCfg.logMask; + logStatus->logFileName = halCfg->logCfg.logFileName; + logStatus->errCount = halCfg->logCfg.errCount; + logStatus->errFlags = halCfg->logCfg.errFlags; + logStatus->currentLineNumber = halCfg->logCfg.currentLineNumber; + + /* Log Error Information is relative to previous call */ + halCfg->logCfg.errFlags = (uint32_t) ADI_LOG_ERR_OK; + halCfg->logCfg.errCount = 0U; + halError = ADI_HAL_ERR_OK; + } + + return halError; +} + +ADI_API adi_hal_Err_e adi_LogConsoleSet(void* const devHalCfg, const adi_hal_LogConsole_e logConsoleFlag) +{ + adi_hal_Err_e halError = ADI_HAL_ERR_NULL_PTR; + adi_hal_Cfg_t* halCfg = NULL; + + if (NULL != devHalCfg) + { + halError = ADI_HAL_ERR_PARAM; + + /* Assume ADI HAL Structure */ + halCfg = (adi_hal_Cfg_t*) devHalCfg; + + if (0U != halCfg->logCfg.interfaceEnabled) + { + halCfg->logCfg.logConsole = logConsoleFlag; + halError = ADI_HAL_ERR_OK; + } + + if (ADI_HAL_ERR_OK != halError) + { + if (LOG_ERR_COUNT_LIMIT > halCfg->logCfg.errCount) + { + ++halCfg->logCfg.errCount; + } + halCfg->logCfg.errFlags |= ADI_LOG_ERR_LEVEL; + } + } + + return halError; +} + +ADI_API adi_hal_Err_e adi_LogWrite( void* const devHalCfg, + const adi_hal_LogLevel_e logLevel, + const uint8_t indent, + const char* const comment, + va_list argp) +{ + adi_hal_Err_e halError = ADI_HAL_ERR_NULL_PTR; + adi_hal_Cfg_t* halCfg = NULL; + char logMsg[ADI_HAL_MAX_LOG_LINE] = { 0 }; + const char* logMsgLevel = NULL; + char* logMsgPtr = NULL; + time_t seconds = { 0 }; + const tm_t* timeStamp = NULL; + tm_t timeStampRec; + + if (NULL != devHalCfg) + { + halError = ADI_HAL_ERR_PARAM; + + /* Assume ADI HAL Structure */ + halCfg = (adi_hal_Cfg_t*) devHalCfg; + + if ((0U != halCfg->logCfg.interfaceEnabled) && /* Interface Enabled */ + (ADI_HAL_LOG_NONE != halCfg->logCfg.logMask) && /* Logging Mask Set */ + (ADI_HAL_LOG_ALL > logLevel) && /* Valid Logging Level */ + (NULL != halCfg->logCfg.logfd)) /* File is Open */ + { + halError = ADI_HAL_ERR_LOG; + + if (halCfg->logCfg.currentLineNumber >= ADI_HAL_LOG_MAX_NUM_LINES) + { + /* Keep Existing Log Data in File until there is something to overwrite with */ + rewind(halCfg->logCfg.logfd); + if (LOG_ERR_COUNT_LIMIT > halCfg->logCfg.errCount) + { + ++halCfg->logCfg.errCount; + } + halCfg->logCfg.errFlags |= ADI_LOG_ERR_REWIND; + halCfg->logCfg.currentLineNumber = 0U; + } + + /* Check Message Logging Level against the Log Level Mask */ + if ((halCfg->logCfg.logMask & ADI_HAL_LOG_MSG) && (logLevel == ADI_HAL_LOG_MSG)) + { + logMsgLevel = "MESSAGE: "; + } + else if ((halCfg->logCfg.logMask & ADI_HAL_LOG_WARN) && (logLevel == ADI_HAL_LOG_WARN)) + { + logMsgLevel = "WARNING: "; + } + else if ((halCfg->logCfg.logMask & ADI_HAL_LOG_ERR) && (logLevel == ADI_HAL_LOG_ERR)) + { + logMsgLevel = "ERROR: "; + } + else if ((halCfg->logCfg.logMask & ADI_HAL_LOG_API) && (logLevel == ADI_HAL_LOG_API)) + { + logMsgLevel = "API_PUBLIC: "; + } + else if ((halCfg->logCfg.logMask & ADI_HAL_LOG_BF) && (logLevel == ADI_HAL_LOG_BF)) + { + logMsgLevel = "API_BITFIELD: "; + } + else if ((halCfg->logCfg.logMask & ADI_HAL_LOG_HAL) && (logLevel == ADI_HAL_LOG_HAL)) + { + logMsgLevel = "HAL: "; + } + else if ((halCfg->logCfg.logMask & ADI_HAL_LOG_SPI) && (logLevel == ADI_HAL_LOG_SPI)) + { + logMsgLevel = "SPI: "; + } + else if ((halCfg->logCfg.logMask & ADI_HAL_LOG_API_PRIV) && (logLevel == ADI_HAL_LOG_API_PRIV)) + { + logMsgLevel = "API_PRIVATE: "; + } + else + { + /* Do Nothing; Logging Level not set in the Mask */ + halError = ADI_HAL_ERR_PARAM; + } + + if (ADI_HAL_ERR_PARAM != halError) + { + /* Input Parameters OK at this Point; Logging Level Enabled */ + halError = ADI_HAL_ERR_LOG; + ADI_LIBRARY_MEMSET(&timeStampRec, 0, sizeof(timeStampRec)); + (void) ADI_LIBRARY_TIME(&seconds); + timeStamp = ADI_LIBRARY_LOCALTIME_R(&seconds, &timeStampRec); /* Returned value points to a shared internal statically allocated object */ + if (-1 < ADI_LIBRARY_SNPRINTF( logMsg, + ADI_HAL_MAX_LOG_LINE, + "%04d-%02d-%02d %02d:%02d:%02d: %s", + timeStamp->tm_year + 1900, + timeStamp->tm_mon + 1, + timeStamp->tm_mday, + timeStamp->tm_hour, + timeStamp->tm_min, + timeStamp->tm_sec, + logMsgLevel)) + { + /* Indentation */ + logMsgPtr = logMsg + ADI_LIBRARY_STRLEN(logMsg); + if (indent > 0U) + { + (void) ADI_LIBRARY_MEMSET(logMsgPtr, ' ', indent); + logMsgPtr[indent] = '\0'; + } + + logMsgPtr = logMsg + ADI_LIBRARY_STRLEN(logMsg); + + if (-1 < ADI_LIBRARY_VSNPRINTF( (logMsgPtr), /* Pointer to End of Log Message Header */ + (ADI_HAL_MAX_LOG_LINE - ADI_LIBRARY_STRLEN(logMsg)), /* Adjusted Line Limit based on Log Message Header */ + comment, + argp)) /* Append Incoming Log Message */ + { + /* Logging To File */ + if (-1 < ADI_LIBRARY_FPRINTF(halCfg->logCfg.logfd, "%s\n", logMsg)) + { + if (0 == ADI_LIBRARY_FFLUSH(halCfg->logCfg.logfd)) + { + /* Log Information may be still buffered at this point */ + ++halCfg->logCfg.currentLineNumber; + halError = ADI_HAL_ERR_OK; + } + } + + if (0U != halCfg->logCfg.logConsole) + { + /* Writing to STDOUT; API Logic is geared for Writing to File */ + (void) ADI_LIBRARY_FPRINTF(stdout, "%s\n", logMsg); + (void) ADI_LIBRARY_FFLUSH(stdout); + } + } + } + } + } + + if ((ADI_HAL_ERR_OK != halError) && /* Log Write OK; Not an Error */ + (ADI_HAL_ERR_PARAM != halError)) /* Log Writing Not Enabled OR Log Level is not Enabled in the Mask; Not an Error */ + { + if (LOG_ERR_COUNT_LIMIT > halCfg->logCfg.errCount) + { + ++halCfg->logCfg.errCount; + } + halCfg->logCfg.errFlags |= ADI_LOG_ERR_WRITE; + } + } + + return halError; +} + +ADI_API adi_hal_Err_e adi_LogWrite1(void* const devHalCfg, + const adi_hal_LogLevel_e logLevel, + const char* const comment, + ...) +{ + adi_hal_Err_e halError = ADI_HAL_ERR_NULL_PTR; + va_list empty_va_list; + + if ((NULL != devHalCfg) && + (NULL != comment)) + { + ADI_LIBRARY_VA_START(empty_va_list, comment); + /* Logging Feature will report Errors to own Data Structure */ + (void) adi_LogWrite(devHalCfg, logLevel, 0, comment, empty_va_list); + ADI_LIBRARY_VA_END(empty_va_list); + + halError = ADI_HAL_ERR_OK; + } + + return halError; +} diff --git a/drivers/rf-transceiver/koror/platforms/common/adi_logging.h b/drivers/rf-transceiver/koror/platforms/common/adi_logging.h new file mode 100644 index 00000000000..1fec696e5af --- /dev/null +++ b/drivers/rf-transceiver/koror/platforms/common/adi_logging.h @@ -0,0 +1,139 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + + +/** +* \file common/adi_logging.h +*/ + +#ifndef _ADS10_LOGGING_H_ +#define _ADS10_LOGGING_H_ + +#include "adi_platform.h" + +/** +* \brief Opens a logFile. If the file is already open it will be closed and reopened. +* +* This function opens the file for writing and saves the resulting file +* descriptor to the devHalCfg structure. +* +* \param devHalCfg Pointer to device instance specific platform settings +* \param filename The user provided name of the file to open. +* +* \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful +* +*/ +ADI_API adi_hal_Err_e adi_LogFileOpen(void* const devHalCfg, const char* const filename); + +/** +* \brief Flushes the logFile buffer to the currently open log file. +* +* \param devHalCfg Pointer to device instance specific platform settings +* +* \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful +* +*/ +ADI_API adi_hal_Err_e adi_LogFileFlush(void* const devHalCfg); + +/** +* \brief Service to Close a Log File +* +* \param devHalCfg Pointer to device instance specific platform settings +* +* \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful +* +*/ +ADI_API adi_hal_Err_e adi_LogFileClose(void* const devHalCfg); + +/** +* \brief Sets the log level, allowing the end user to select the granularity of +* what events get logged. +* +* \param devHalCfg Pointer to device instance specific platform settings +* \param logMask A mask of valid log levels to allow to be written to the log file. +* +* \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful +* +*/ +ADI_API adi_hal_Err_e adi_LogLevelSet(void* const devHalCfg, const uint32_t logMask); + +/** + * \brief Gets the currently set log level: the mask of different types of log + * events that are currently enabled to be logged. + * + * \param devHalCfg Pointer to device instance specific platform settings + * \param logMask Returns the current log level mask. + * + * \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful + * + */ +ADI_API adi_hal_Err_e adi_LogLevelGet(void* const devHalCfg, uint32_t* const logMask); + +/** +* \brief Service to get Logging Status +* +* \param devHalCfg Pointer to device instance specific platform settings +* \param logStatus Pointer to Structure that will be populated with Log Status +* +* \note Error Count & Flags are reset after each Status Call +* +* \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful +*/ +ADI_API adi_hal_Err_e adi_LogStatusGet(void* const devHalCfg, adi_hal_LogStatusGet_t* const logStatus); + +/** + * \brief Service to Set to Logging to Console Flag + * + * \param devHalCfg Pointer to device instance specific platform settings + * \param logConsoleFlag Log to Console Flag Setting + * + * \retval adi_hal_LogErr_e - ADI_LOG_ERR_OK if successful + * + */ +ADI_API adi_hal_Err_e adi_LogConsoleSet(void* const devHalCfg, const adi_hal_LogConsole_e logConsoleFlag); + +/** +* \brief Writes a message to the currently open logFile specified in the +* adi_hal_LogCfg_t of the devHalCfg structure passed +* +* Uses the vfprintf functionality to allow the user to supply the format and +* the number of arguments that will be logged. +* +* \param devHalCfg Pointer to device instance specific platform settings +* \param logLevel the log level to be written into +* \param comment the string to include in the line added to the log. +* \param argp variable argument list to be printed +* +* \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful +* +*/ +ADI_API adi_hal_Err_e adi_LogWrite( void* const devHalCfg, + const adi_hal_LogLevel_e logLevel, + const uint8_t indent, + const char* const comment, + va_list argp); + +/** +* \brief Writes a message to the currently open logFile specified in the +* adi_hal_LogCfg_t of the devHalCfg structure passed +* +* Uses the vfprintf functionality to allow the user to supply the format and +* the number of arguments that will be logged. +* +* \param devHalCfg Pointer to device instance specific platform settings +* \param logLevel log level to be written into +* \param comment the string to include in the line added to the log. +* \param ... variable arguments to be printed +* +* \retval adi_hal_Err_e - ADI_HAL_ERR_OK if successful +* +*/ +ADI_API adi_hal_Err_e adi_LogWrite1(void* const devHalCfg, + const adi_hal_LogLevel_e logLevel, + const char* const comment, + ...); + +#endif /* _adi_LOGGING_H_ */ diff --git a/drivers/rf-transceiver/koror/platforms/common/tls.c b/drivers/rf-transceiver/koror/platforms/common/tls.c new file mode 100644 index 00000000000..04a7fdb612b --- /dev/null +++ b/drivers/rf-transceiver/koror/platforms/common/tls.c @@ -0,0 +1,131 @@ +#include "tls.h" + +typedef struct +{ + adi_hal_thread_t thread; + void* value; +} thread_to_value_t; + +/* ADI Error Reporting Dependency on HAL_TLS_ERR being set to NULL if not configured */ +static thread_to_value_t store[HAL_TLS_END][ADI_HAL_MAX_THREADS] = { { { 0, NULL } }, { { 0, NULL } } }; +static adi_hal_mutex_t storeMutex; + +adi_hal_Err_e common_TlsInit(void) +{ + if (adi_hal_MutexInit == NULL) + { + return ADI_HAL_ERR_NOT_IMPLEMENTED; + } + + /* Error Reporting Dependency on HAL_TLS_ERR being set to NULL if not configured */ + ADI_LIBRARY_MEMSET(store, 0, sizeof(store)); + + return adi_hal_MutexInit(&storeMutex); +} + +adi_hal_Err_e common_TlsSet(const adi_hal_TlsType_e tlsType, void* const value) +{ + adi_hal_Err_e retVal = ADI_HAL_ERR_OK; + uint32_t idx = 0U; + uint32_t freeSlotIdx = ADI_HAL_MAX_THREADS; + adi_hal_thread_t thisThread = adi_hal_ThreadSelf(); + + if (tlsType == HAL_TLS_END) + { + /* Special convenience case that a thread can remove all it TLS + * items in one call by passing (HAL_TLS_END, NULL); */ + if (value != NULL) + { + return ADI_HAL_ERR_PARAM; + } + + /* Passing NULL cannot fail by definition - no need to check rtn values */ + (void) common_TlsSet(HAL_TLS_ERR, NULL); + (void) common_TlsSet(HAL_TLS_USR, NULL); + + return ADI_HAL_ERR_OK; + } + + (void) adi_hal_MutexLock(&storeMutex); + + /* Find the thread's slot or failing that a free slot */ + for (idx = 0; idx < ADI_HAL_MAX_THREADS; ++idx) + { + if ((store[tlsType][idx].value == NULL) && (freeSlotIdx == ADI_HAL_MAX_THREADS)) + { + /* This is the first free slot found - remember it in case there + * is no slot found for the thread. For subsequent free slots this won't + * happen as freeSlotIdx is no longer == ADI_HAL_MAX_THREADS. + */ + freeSlotIdx = idx; + } + + if (store[tlsType][idx].thread == thisThread) + { + /* Slot found for this thread */ + break; + } + } + + if (idx < ADI_HAL_MAX_THREADS) + { + /* idx is at slot for this thread - update */ + store[tlsType][idx].thread = thisThread; + store[tlsType][idx].value = value; + } + else if (freeSlotIdx < ADI_HAL_MAX_THREADS) + { + /* no entry for this thread use the free slot */ + store[tlsType][freeSlotIdx].thread = thisThread; + store[tlsType][freeSlotIdx].value = value; + } + else if (value == NULL) + { + /* no slot available but as we are storing NULL which is used to indicate that + * the value entry for this thread is being removed that is success. + */ + retVal = ADI_HAL_ERR_OK; + } + else + { + /* no slot available for the entry */ + retVal = ADI_HAL_ERR_MEMORY; + } + + (void) adi_hal_MutexUnlock(&storeMutex); + + return retVal; +} + +void* common_TlsGet(adi_hal_TlsType_e tlsType) +{ + uint32_t idx = 0; + void* retVal = NULL; + + adi_hal_thread_t thisThread = adi_hal_ThreadSelf(); + + if (tlsType == HAL_TLS_END) + { + return NULL; + } + + (void) adi_hal_MutexLock(&storeMutex); + + /* Find the thread's slot */ + for (idx = 0; idx < ADI_HAL_MAX_THREADS; idx++) + { + if (store[tlsType][idx].thread == thisThread) + { + break; + } + } + + if (idx < ADI_HAL_MAX_THREADS) + { + retVal = store[tlsType][idx].value; + } + + (void) adi_hal_MutexUnlock(&storeMutex); + + return retVal; +} diff --git a/drivers/rf-transceiver/koror/platforms/common/tls.h b/drivers/rf-transceiver/koror/platforms/common/tls.h new file mode 100644 index 00000000000..d30263aab89 --- /dev/null +++ b/drivers/rf-transceiver/koror/platforms/common/tls.h @@ -0,0 +1,25 @@ +#ifndef TLS_H +#define TLS_H + +#include + +/** + * Not part of the HAL interface. Must be called before any of the HAL TLS functions are called. + * This function depends on HAL functionality so the HAL function pointers must be assigned + * before it is called. + */ +ADI_API adi_hal_Err_e common_TlsInit(void); + +/** + * Provides an implementation for the corresponding HAL interface function. See the HAL interface + * definition for details. + */ +ADI_API adi_hal_Err_e common_TlsSet(const adi_hal_TlsType_e tlsType, void* const value); + +/** + * Provides an implementation for the corresponding HAL interface function. See the HAL interface + * definition for details. + */ +ADI_API void* common_TlsGet(const adi_hal_TlsType_e tlsType); + +#endif diff --git a/projects/adrv904x/Makefile b/projects/adrv904x/Makefile new file mode 100644 index 00000000000..f61224ccd49 --- /dev/null +++ b/projects/adrv904x/Makefile @@ -0,0 +1,16 @@ +# Select the example you want to enable by choosing y for enabling and n for disabling +BASIC_EXAMPLE = y +DMA_EXAMPLE = n +IIO_EXAMPLE = n + +# Uncomment to use the desired platform +PLATFORM = xilinx + +include ../../tools/scripts/generic_variables.mk + +include src.mk + +include ../../tools/scripts/generic.mk + +LIB_FLAGS += -lm +LDFLAGS += -Xlinker --defsym=_HEAP_SIZE=0x800000 diff --git a/projects/adrv904x/README.rst b/projects/adrv904x/README.rst new file mode 100644 index 00000000000..a7df91127fb --- /dev/null +++ b/projects/adrv904x/README.rst @@ -0,0 +1,321 @@ +============================ +adrv904x no-OS Sample Poject +============================ + +Supported Devices +================= + +`ADRV9040 `_ + +Supported Carriers +================== + +`ZCU102 `_ + +.. Naming Conventions +.. ================== + +.. This guide is a source of information for system engineers and software developers using the Analog Devices, Inc., ADRV904x +.. family of software defined radio transceivers. This family consists of the ADRV9026 integrated quad RF transceiver and the ADRV9029 +.. integrated quad RF transceiver with digital predistortion (DPD) and crest factor reduction (CFR) capability. + +Prerequisites +============= + +Prior to building the project, the environment for the development of Xilinx projects must be set up. These are presented in the *Build Prerequisites* section of no-OS build guide available here: https://wiki.analog.com/resources/no-os/build. + +Building and Running the Project +================================ + +The steps indicated at the following address have to be followed for building the project, for debugging, and running. These steps are adapted to the used platform and host OS: https://wiki.analog.com/resources/no-os/build. + +Currently, the project is only intended to be run on the `ZCU102 `_ target, so the Xilinx procedure is to be followed. + +1. Open a terminal and navigate to this project directory (if building on Windows, `Git Bash` has to be used). +2. Type ``make -j`` in order to build the project. +3. Increase the HEAP size to 0x800000 +4. Add the math library to the gcc linker + +The last two steps are performed in the Vitis IDE. + +Make sure to connect your adrv904x evaluation board to the correct FMC connector (FMC2 for ZCU102) or the carrier you use before programming it. + +Fore more details about the available make rules, check out `this page `_. + +Project Layout and HDL Generation +================================= + +This is how the `adrv904x no-OS project `_ looks like as a file tree: + +| no-OS/projects/adrv904x/ +| ├── Makefile +| ├── README.rst +| ├── src +| │   ├── common +| │   │   ├── ADRV9040_RxGainTable.h +| │   │   ├── app_config.h +| │   │   ├── common_data.c +| │   │   ├── common_data.h +| │   │   ├── firmware +| │   │   │   ├── ActiveUseCase_profile.h +| │   │   │   ├── ActiveUtilInit_profile.h +| │   │   │   ├── ADRV9040_DFE_CALS_FW.h +| │   │   │   ├── ADRV9040_FW.h +| │   │   │   ├── DeviceProfileTest.h +| │   │   │   └── stream_image.h +| │   │   ├── hal +| │   │   │   ├── no_os_platform.c +| │   │   │   └── no_os_platform.h +| │   │   ├── initdata.c +| │   │   └── initdata.h +| │   ├── examples +| │   │   ├── basic_example +| │   │   │   ├── basic_example.c +| │   │   │   └── basic_example.h +| │   │   ├── dma_example +| │   │   │   ├── dma_example.c +| │   │   │   └── dma_example.h +| │   │   ├── examples_src.mk +| │   │   └── iio_example +| │   │   ├── iio_example.c +| │   │   └── iio_example.h +| │   ├── LICENSE_API +| │   ├── LICENSE_FW +| │   └── platform +| │   ├── platform_includes.h +| │   └── xilinx +| │   ├── main.c +| │   ├── parameters.c +| │   ├── parameters.h +| │   └── platform_src.mk +| ├── src.mk +| └── system_top.xsa + +Note the presence of the system_top.xsa. In order to build this `no-OS `_ project, you need such an .xsa file present in the project directory, as shown above. In case you don't have one, either obtain a pre-built file or build it yourself by following the `Building HDL guide `_. + +And this is how the corresponding `drivers section `_ looks like as a file tree (the Madura API can be found under common and devices directories): + +| no-OS/drivers/rf-transceiver/koror/ +| ├── adrv904x.c +| ├── adrv904x_conv.c +| ├── adrv904x.h +| ├── common +| │   ├── adi_common.h +| │   ├── adi_common_macros.h +| │   ├── adi_common_types.h +| │   ├── adi_common_user.h +| │   ├── adi_error +| │   │   ├── adi_common_error.c +| │   │   ├── adi_common_error.h +| │   │   └── adi_common_error_types.h +| │   ├── adi_hal +| │   │   ├── adi_common_hal.c +| │   │   └── adi_common_hal.h +| │   └── adi_logging +| │   ├── adi_common_log.c +| │   ├── adi_common_log.h +| │   └── adi_common_log_types.h +| ├── devices +| │   └── adrv904x +| │   ├── multiver +| │   │   ├── adi_adrv904x_all_types.h +| │   │   └── adi_adrv904x_api.h +| │   ├── private +| │   │   ├── bf +| │   │   ├── include +| │   │   └── src +| │   └── public +| │   ├── include +| │   └── src +| ├── platforms +| │   ├── adi_library.c +| │   ├── adi_library.h +| │   ├── adi_library_types.h +| │   ├── adi_platform_aux.c +| │   ├── adi_platform_aux.h +| │   ├── adi_platform.c +| │   ├── adi_platform.h +| │   ├── adi_platform_impl.h +| │   ├── adi_platform_impl_types.h +| │   ├── adi_platform_types.h +| │   └── common +| │   ├── adi_logging.c +| │   ├── adi_logging.h +| │   ├── tls.c +| │   └── tls.h +| └── README.rst + + +Demo Applications +================= + +The demo applications highlight the functionality of the adrv904x evaluation board. Three examples are provided in the sample project: + +* Basic Example +* DMA Example +* IIO Example + +An example is selected by specifying ``y`` as the value of the corresponding variable in the project Makefile. Below is an example for activating the basic example: + +.. code-block:: bash + + BASIC_EXAMPLE = y + DMA_EXAMPLE = n + IIO_EXAMPLE = n + +Another way of selecting a demo is by passing variables to ``make`` through command line arguments: + +.. code-block:: bash + + make DMA_EXAMPLE=y IIO_EXAMPLE=n + +Note that only one example can be enabled at a time. Therefore, when using command line arguments, the settings in the Makefile should be taken into account. The command line overwrites the values in the Makefile. + +Basic Example +------------- + +The basic example simply initializes the components on the evaluation board and enables a JESD link. Tx will transmit a DDS waveform with the default parameters set by the DAC driver. The output looks like the one below: + +.. code-block:: bash + + rx_adxcvr: Using QPLL with previously defined settings. + Firmware file: ADRV9040_FW.bin + Gain Table file: RxGainTable.csv + Streams file: stream_image.bin + Device Profile file: DeviceProfileTest.bin + DFE file: ADRV9040_DFE_CALS_FW.bin + Radio Sequencer file: + + adrv904x_setup() + adrv904x-phy Rev 0, API version: 2.10.0.4 found + adrv904x-device revision: 0xa0 + + Using the Profile Init and PostMcsInit Structures + tx_dac: Successfully initialized (491564941 Hz) + tx_adxcvr: OK (16220160 kHz) + rx_adxcvr: OK (16220160 kHz) + Link0 deframerStatus linkState 0x3 + WARNING: Link0 deframerStatus 0 laneStatus 0xE + WARNING: Link0 deframerStatus 1 laneStatus 0xE + WARNING: Link0 deframerStatus 2 laneStatus 0xE + WARNING: Link0 deframerStatus 3 laneStatus 0xE + WARNING: Link0 deframerStatus 4 laneStatus 0xE + WARNING: Link0 deframerStatus 5 laneStatus 0xE + WARNING: Link0 deframerStatus 6 laneStatus 0xE + WARNING: Link0 deframerStatus 7 laneStatus 0xE + + adrv904x-phy Rev 160, API version: 2.10.0.4 + + tx_jesd status: + Link is enabled + Measured Link Clock: 245.782 MHz + Reported Link Clock: 245.760 MHz + Lane rate: 16220.160 MHz + Lane rate / 66: 245.760 MHz + LEMC rate: 7.680 MHz + Link status: DATA + SYSREF captured: Yes + SYSREF alignment error: No + rx_jesd status: + Link is enabled + Measured Link Clock: 245.782 MHz + Reported Link Clock: 245.760 MHz + Lane rate: 16220.160 MHz + Lane rate / 66: 245.760 MHz + LEMC rate: 7.680 MHz + Link status: DATA + SYSREF captured: Yes + SYSREF alignment error: No + ERR: ../adrv904x/src/common/hal/no_os_platform.c:244:no_os_LogWrite(): ERROR:Device Information: Type: 0, ID: 1, Name: ADRV9040 + Recovery Action: 0xFFFFFFF6 + Event Information: + Error Code: 0x6 + Error Source: 0x1 + Error Message: API Enter Issue + File Information: + Line: 574 + Function: adi_adrv904x_Shutdown + File: 2 + Variable Information: + Variable Name: 0 + Variable Data: 0x0 + + + +DMA Example +----------- + +DMA example is a standard example that sends a sinewave on Tx channels using DMA from a lookup table. If you physically loopback a Tx channel to an Rx channel via an electrical wire, you may run the DMA_EXAMPLE and read the received data at Rx from its particular memory address. + +Select the example through command line arguments as below: + +.. code-block:: bash + + make BASIC_EXAMPLE=n DMA_EXAMPLE=y IIO_EXAMPLE=n + +To run the DMA example, you simply need to run the application as usual by: + +* making sure it was built with the ``DMA_EXAMPLE`` flag (``DMA_EXAMPLE = y`` in the Makefile or as command line argument for ``make``), as already mentioned +* monitoring the serial terminal for messages printed by the application + +After the output from the basic example, the application will eventually print something like this: + +.. code-block:: bash + + DMA_EXAMPLE Tx: address=0x434800 samples=8192 channels=16 bits=32 + DMA_EXAMPLE Rx: address=0x43c800 samples=262144 channels=16 bits=16 + +This means that the memory address where the data at Rx is stored is ``0x43c800``. There are a total of 65536 samples, 16-bit wide across 8 channels, which is equivalent to 8192, 16-bit samples per channel. The location of the transmitted data is also given (0x1dc900). + +At this point you may use a Tcl script to retrieve data from memory and store it into .csv files for processing: + +.. code-block:: bash + + xsct tools/scripts/platform/xilinx/capture.tcl ZYNQ_PSU 0x43c800 262144 16 16 + +You can find more information about the data `here `_. + +The data in the .csv files generated can be visualised using the `plot.py `_ script in the `no-OS repository `_. The following command will display the data on all 8 channels: + +.. code-block:: bash + + python do_graph.py 16 + +IIO Example +----------- + +IIO demo is a standard example, provided in most `no-OS projects `_, that launches a IIOD server on the board so that the user may connect to it via an IIO client. Using iio-oscilloscope, the user can configure the DAC and view the ADC data on a plot. + +To build the IIOD demo, add the following flags when invoking make which will build the IIOD server and the IIO section of the driver: + +.. code-block:: bash + + make BASIC_EXAMPLE=n DMA_EXAMPLE=n IIO_EXAMPLE=y + +To run the IIOD demo, first connect to the board via UART to see the runtime output messages with the following settings: + +.. code-block:: bash + + Baud Rate: 115200 + Data: 8 bit + Parity: None + Stop bits: 1 bit + Flow Control: none + +Please note that for proper message display, you may need to convert all LF characters to CRLF, if your serial terminal supports it. + +With a serial terminal correctly configured and listening to incoming messages, launch the application (make run or click the debug button in your SDK). Runtime messages specific to the application will apear on your serial terminal screen, and eventually the following message is printed, after the output from the basic example: + +.. code-block:: bash + + Running IIOD server... + If successful, you may connect an IIO client application by: + 1. Disconnecting the serial terminal you use to view this message. + 2. Connecting the IIO client application using the serial backend configured as shown: + Baudrate: 921600 + Data size: 8 bits + Parity: none + Stop bits: 1 + Flow control: none + +This message implies a IIOD server is being run and you may connect to it using a serial-backend enabled `iio-oscilloscope `_ and with the settings indicated at the serial terminal. diff --git a/projects/adrv904x/src.mk b/projects/adrv904x/src.mk new file mode 100644 index 00000000000..0a997d4d3e1 --- /dev/null +++ b/projects/adrv904x/src.mk @@ -0,0 +1,97 @@ +################################################################################ +# # +# Shared variables: # +# - PROJECT # +# - DRIVERS # +# - INCLUDE # +# - PLATFORM_DRIVERS # +# - NO-OS # +# # +################################################################################ +include $(PROJECT)/src/platform/$(PLATFORM)/platform_src.mk +include $(PROJECT)/src/examples/examples_src.mk + +SRCS += $(PROJECT)/src/platform/$(PLATFORM)/main.c + +INCS += $(PROJECT)/src/common/common_data.h \ + $(PROJECT)/src/common/clkgen_routines.h \ + $(PROJECT)/src/common/app_config.h \ + $(PROJECT)/src/common/initdata.h \ + $(PROJECT)/src/common/ADRV9040_RxGainTable.h \ + $(PROJECT)/src/common/hal/no_os_platform.h \ + $(PROJECT)/src/common/firmware/ADRV9040_DFE_CALS_FW.h \ + $(PROJECT)/src/common/firmware/ADRV9040_FW.h \ + $(PROJECT)/src/common/firmware/stream_image.h \ + $(PROJECT)/src/common/firmware/DeviceProfileTest.h + +SRCS += $(PROJECT)/src/common/common_data.c \ + $(PROJECT)/src/common/clkgen_routines.c \ + $(PROJECT)/src/common/initdata.c \ + $(PROJECT)/src/common/hal/no_os_platform.c + +INCS += $(PROJECT)/src/platform/platform_includes.h \ + $(PROJECT)/src/platform/$(PLATFORM)/parameters.h +SRCS += $(PROJECT)/src/platform/$(PLATFORM)/parameters.c + +SRCS += $(DRIVERS)/axi_core/axi_adc_core/axi_adc_core.c \ + $(DRIVERS)/axi_core/axi_dac_core/axi_dac_core.c \ + $(DRIVERS)/axi_core/axi_dmac/axi_dmac.c \ + $(DRIVERS)/axi_core/jesd204/axi_jesd204_rx.c \ + $(DRIVERS)/axi_core/jesd204/axi_jesd204_tx.c \ + $(DRIVERS)/frequency/ad9528/ad9528.c \ + $(NO-OS)/util/no_os_util.c \ + $(NO-OS)/util/no_os_clk.c \ + $(NO-OS)/util/no_os_alloc.c \ + $(NO-OS)/util/no_os_mutex.c\ + $(DRIVERS)/api/no_os_spi.c \ + $(DRIVERS)/api/no_os_gpio.c \ + $(NO-OS)/jesd204/jesd204-core.c \ + $(NO-OS)/jesd204/jesd204-fsm.c +SRCS += $(DRIVERS)/axi_core/jesd204/axi_adxcvr.c \ + $(DRIVERS)/axi_core/clk_axi_clkgen/clk_axi_clkgen.c +ifeq (y,$(strip $(IIOD))) +LIBRARIES += iio +SRCS += $(NO-OS)/util/no_os_lf256fifo.c \ + $(NO-OS)/util/no_os_fifo.c \ + $(NO-OS)/util/no_os_list.c \ + $(DRIVERS)/axi_core/iio_axi_adc/iio_axi_adc.c \ + $(DRIVERS)/axi_core/iio_axi_dac/iio_axi_dac.c \ + $(NO-OS)/iio/iio_app/iio_app.c \ + $(DRIVERS)/api/no_os_uart.c \ + $(DRIVERS)/api/no_os_irq.c +endif + +# Koror API sources +SRC_DIRS += $(DRIVERS)/rf-transceiver/koror + +INCS += $(DRIVERS)/axi_core/axi_adc_core/axi_adc_core.h \ + $(DRIVERS)/axi_core/axi_dac_core/axi_dac_core.h \ + $(DRIVERS)/axi_core/axi_dmac/axi_dmac.h \ + $(DRIVERS)/axi_core/jesd204/axi_jesd204_rx.h \ + $(DRIVERS)/axi_core/jesd204/axi_jesd204_tx.h \ + $(DRIVERS)/frequency/ad9528/ad9528.h +INCS += $(DRIVERS)/axi_core/jesd204/axi_adxcvr.h \ + $(DRIVERS)/axi_core/clk_axi_clkgen/clk_axi_clkgen.h +INCS += $(INCLUDE)/no_os_axi_io.h \ + $(INCLUDE)/no_os_spi.h \ + $(INCLUDE)/no_os_irq.h \ + $(INCLUDE)/no_os_gpio.h \ + $(INCLUDE)/no_os_error.h \ + $(INCLUDE)/no_os_delay.h \ + $(INCLUDE)/no_os_util.h \ + $(INCLUDE)/no_os_clk.h \ + $(INCLUDE)/no_os_print_log.h \ + $(INCLUDE)/no_os_alloc.h \ + $(INCLUDE)/no_os_mutex.h \ + $(INCLUDE)/jesd204.h \ + $(NO-OS)/jesd204/jesd204-priv.h +ifeq (y,$(strip $(IIOD))) +INCS += $(INCLUDE)/no_os_fifo.h \ + $(INCLUDE)/no_os_irq.h \ + $(INCLUDE)/no_os_uart.h \ + $(INCLUDE)/no_os_lf256fifo.h \ + $(INCLUDE)/no_os_list.h \ + $(DRIVERS)/axi_core/iio_axi_adc/iio_axi_adc.h \ + $(NO-OS)/iio/iio_app/iio_app.h \ + $(DRIVERS)/axi_core/iio_axi_dac/iio_axi_dac.h +endif diff --git a/projects/adrv904x/src/LICENSE_API b/projects/adrv904x/src/LICENSE_API new file mode 100644 index 00000000000..affbfeddc56 --- /dev/null +++ b/projects/adrv904x/src/LICENSE_API @@ -0,0 +1,98 @@ +API Source Code Software License Agreement + +BEFORE YOU SELECT THE "I ACCEPT" BUTTON AT THE BOTTOM OF THIS WINDOW, +CAREFULLY READ THE TERMS AND CONDITIONS SET FORTH BELOW. BY SELECTING +THE “I ACCEPT” BUTTON BELOW, OR DOWNLOADING, REPRODUCING, DISTRIBUTING +OR OTHERWISE USING THE SOFTWARE, YOU AGREE TO BE BOUND BY THE TERMS AND +CONDITIONS SET FORTH BELOW. IF YOU DO NOT AGREE TO ALL OF THE TERMS AND +CONDITIONS, SELECT THE 'I DO NOT ACCEPT' BUTTON AND YOU MUST NOT +DOWNLOAD, INSTALL OR OTHERWISE USE THE SOFTWARE. + +DOWNLOADING, REPRODUCING, DISTRIBUTING OR OTHERWISE USING THE SOFTWARE +CONSTITUTES ACCEPTANCE OF THIS LICENSE. THE SOFTWARE MAY NOT BE USED +EXCEPT AS EXPRESSLY AUTHORIZED UNDER THIS LICENSE. + +The software is protected by copyright law and international copyright +treaties. + + 1. License Grant: Subject to the terms and conditions of this +license, the software may be reproduced, modified and distributed in +source code and object code form. + + 2. Conditions: + a. Any distribution of the software must retain all copyright +and other proprietary notices. The software that is distributed +(including modified versions of the software) shall be subject to the +terms and conditions of this license. + b. Licensee shall not use the name or any trademark of ADI +(including those of its licensors) or any contributor to endorse or +promote products without prior written consent of the owner of the name +or trademark. The term “contributor” means any person or entity that +modifies or distributes the software. + c. Use or distribution of the software may or may not infringe +patent rights of one or more patent holders. This license does not +alleviate Licensee’s obligation to obtain separate licenses from patent +holders. + d. All rights not expressly granted hereunder are reserved to +ADI and its licensors. + e. This license shall be governed by the laws of Massachusetts, +without regard to its conflict of laws rules. The software shall only +be used in compliance with all applicable laws and regulations, +including without limitation export control laws. + + 3. WARRANTY DISCLAIMER: THE SOFTWARE AND ANY RELATED INFORMATION +AND/OR ADVICE IS PROVIDED ON AN “AS IS” BASIS, WITHOUT REPRESENTATIONS, +GUARANTEES OR WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, ORAL OR +WRITTEN, INCLUDING WITHOUT LIMITATION, WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. There is +no obligation to provide software support or updates. The software is +not fault-tolerant and is not intended for use in high risk +applications, including without limitation in the operation of nuclear +facilities, aircraft navigation or control systems, air traffic +control, life support machines, weapons systems or any other +application in which the failure of the software could lead to death, +personal injury, or severe physical or environmental damages. The +software is not authorized to be used under such circumstances. + + 4. LIMITATION OF LIABILITY: TO THE MAXIMUM EXTENT PERMITTED BY LAW, +ADI (INCLUDING ITS LICENSORS) AND CONTRIBUTORS SHALL NOT BE LIABLE FOR +ANY DAMAGES ARISING FROM OR RELATED TO THE SOFTWARE, ITS USE OR ANY +RELATED INFORMATION AND/OR SERVICES, INCLUDING BUT NOT LIMITED TO ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE, EXEMPLARY, +CONSEQUENTIAL OR ANALOGOUS DAMAGES (INCLUDING WITHOUT LIMITATION ANY +DAMAGES RESULTING FROM LOSS OF USE, DATA, REVENUE, PROFITS, OR SAVINGS, +COMPUTER DAMAGE OR ANY OTHER CAUSE), UNDER ANY LEGAL THEORY (INCLUDING +WITHOUT LIMITATION CONTRACT, WARRANTY, TORT, NEGLIGENCE, STRICT OR +PRODUCT LIABILITY), EVEN IF IT HAS BEEN INFORMED OF THE POSSIBILITY OF +SUCH DAMAGES. Some jurisdictions do not permit the exclusion or +limitation of liability for consequential, incidental or other damages, +and, as such, some portion of the above limitation may not apply. In +such jurisdictions, liability is limited to the greatest extent +permitted by law. + + 5. Third Party Software: The software may be accompanied by or +include software made available by one or more third parties (“Third +Party Software”). Each portion of Third Party Software is subject to +its own separate software license terms and conditions (“Third Party +Licenses”). The Third Party Licenses for Third Party Software delivered +with the software are set forth or identified (by url or otherwise) in +(i) Appendix A to this license (if any), (ii) the applicable software +header or footer text, (iii) a text file located in the directory of +the applicable Third Party Software component and/or (iv) such other +location customarily used for licensing terms. The use of each portion +of Third Party Software is subject to the Third Party Licenses, and you +agree that your use of any Third Party Software is bound by the +applicable Third Party License. You agree to review and comply with all +applicable Third Party Licenses prior to any use or distribution of any +Third Party Software. Third Party Software is provided on an “as is” +basis without any representation, warranty or liability of any kind. +ADI (including its licensors) and contributors shall have no liability +or responsibility for the operation or performance of the Third Party +Software and shall not be liable for any damages, costs, or expenses, +direct or indirect, arising out of the performance or failure to +perform of the Third Party Software. ADI (including its licensors) and +contributors shall be entitled to the benefit of any and all +limitations of liability and disclaimers of warranties contained in the +Third Party Licenses. For the avoidance of doubt, this license does not +alter, limit or expand the terms and conditions of, or rights granted +to you pursuant to, Third Party Licenses. diff --git a/projects/adrv904x/src/LICENSE_FW b/projects/adrv904x/src/LICENSE_FW new file mode 100644 index 00000000000..4a6a5dce87c --- /dev/null +++ b/projects/adrv904x/src/LICENSE_FW @@ -0,0 +1,231 @@ +Firmware Software License Agreement + +This Firmware Software License Agreement (the “Agreement”) is a legal +agreement between Analog Devices, Inc., a Massachusetts corporation, +with its principal office at One Technology Way, Norwood, +Massachusetts, USA 02062 (“Analog Devices”) and you (personally or on +behalf of your employer, as applicable) (“Licensee”) for the software +and related documentation that accompanies this Agreement (the +“Licensed Software”). YOU AGREE THAT YOU ARE BOUND BY THE TERMS AND +CONDITIONS OF THIS AGREEMENT BY DOWNLOADING, INSTALLING, COPYING OR +USING THE SOFTWARE. IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY +OR USE THE SOFTWARE. + + 1. License Grant: Subject to terms of this Agreement, Analog +Devices grants to Licensee a non-exclusive license, without charge, to +copy, use and distribute Licensed Software in object code form, and to +incorporate Licensed Software in object code form into Licensee +products. + + 2. Excluded Licenses: Any license, agreement or other document +issued, entered into or granted by Licensee that purports to apply any +Excluded License to any portion of Licensed Software shall be null and +void with regard to Licensed Software. An “Excluded License” means any +license, including licenses for “open source” code (as defined by the +Free Software Foundation), that requires as a condition of use, +modification, and/or distribution of software subject to the Excluded +License, that such software or other software combined and/or +distributed with such software be (i) disclosed or distributed in +source code form; (ii) licensed for the purpose of making derivative +works; or (iii) redistributable at no charge. The restrictions of this +section apply regardless of whether the Licensed Software is intended +or designed to run in an environment that includes software under an +Excluded License. + + 3. Reserved Rights: All rights not expressly granted in this +Agreement are reserved to Analog Devices and its licensors. Analog +Devices and its licensors retain all right, title and interest in the +Licensed Software and modifications thereof, including all related +patent, copyright and other intellectual property rights, and Licensee +shall not take any action inconsistent with such ownership. It is +agreed that because of the proprietary nature of the Licensed Software, +Analog Devices’ remedies at law for a breach by the Licensee of its +obligations under this License will be inadequate and that Analog +Devices will, in the event of such breach, be entitled to equitable +relief, including injunctive relief, without the posting of any bond, +in addition to all other remedies provided under this License or +available at law. + + 4. Updates: If Analog Devices elects to make any update, upgrade or +new version of the Licensed Software (“Updates”) available to Licensee, +such Updates shall be deemed to be Licensed Software under this +Agreement. Analog Devices shall have no obligation to provide support +or Updates. + + 5. Publicity: Notwithstanding anything in this Agreement, Licensee +may not use any trademark or trade name of Analog Devices or make any +public announcement regarding the existence of this Agreement without +Analog Devices’ prior written consent. + + 6. Feedback: Licensee may from time to time provide suggestions, +ideas, comments or other feedback (“Feedback”) to Analog Devices with +respect to the Licensed Software. Licensee agrees that all Feedback is +and shall be given entirely voluntarily. To the extent Licensee +provides such Feedback, however, Licensee hereby grants to Analog +Devices a non-exclusive, irrevocable, perpetual, worldwide, +royalty-free, transferable license, with the right to sublicense, under +Licensee’s intellectual property, to use and disclose Feedback in any +manner Analog Devices chooses and to display, perform, copy, make, have +made, use, sell, and otherwise dispose of Analog Devices’ and its +licensee’s products embodying such Feedback in any manner and via any +media Analog Devices chooses, without reference to its source or other +obligation to Analog Devices, even if the Feedback is designated as +confidential. + + 7. Copyright Notice: In no event shall Licensee remove any +copyright or other intellectual property notice or other legend +contained on or in copies of Licensed Software or displayed by any +Licensed Software. + + 8. Third Party Software: The Licensed Software may be accompanied +by or include software made available by one or more third parties +(“Third Party Software”). Each portion of Third Party Software is +subject to its own separate software license terms and conditions +(“Third Party Licenses”). The Third Party Licenses for Third Party +Software delivered with the Licensed Software may be set forth or +identified (by URL or otherwise) in (i) Appendix A to this license (if +any), (ii) the applicable software header or footer text, (iii) a text +file located in the directory of the applicable Third Party Software +component and/or (iv) such other location customarily used for +licensing terms. The use of each portion of Third Party Software is +subject to the Third Party Licenses, and you agree that your use of any +Third Party Software is bound by the applicable Third Party License. +You agree to review and comply with all applicable Third Party Licenses +prior to any use or distribution of any Third Party Software. Third +Party Software is provided on an “as is” basis without any +representation, warranty or liability of any kind. Analog Devices +(including its licensors) shall have no liability or responsibility for +the operation or performance of the Third Party Software and shall not +be liable for any damages, costs, or expenses, direct or indirect, +arising out of the performance or failure to perform of the Third Party +Software. Analog Devices (including its licensors) shall be entitled to +the benefit of any and all limitations of liability and disclaimers of +warranties contained in the Third Party Licenses. For the avoidance of +doubt, this license does not alter, limit or expand the terms and +conditions of, or rights granted to you pursuant to, Third Party +Licenses. + + 9. Licensee Requirements: Use or distribution of the Licensed +Software may or may not infringe patent rights of one or more patent +holders. This license does not alleviate Licensee’s obligation to +obtain separate licenses from patent holders. Licensee shall defend, +indemnify and hold Analog Devices, its licensors, and their respective +officers, directors, employees and agents (each an “Indemnified Party”) +harmless from and against any damages, fines, penalties, assessments, +liabilities, costs and expenses (including reasonable attorneys’ fees +and court costs) in the event that any claim is brought against an +Indemnified Party (i) arising or alleged to arise from Licensee’s use +or distribution of Licensed Software or Third Party Software, or (ii) +on account of Licensee’s failure to obtain any required license or +consent to use or distribute Licensed Software or Third Party Software. +Licensee shall bear any and all expenses and pay any and all taxes that +may be payable in relation to this Agreement. + + 10. DISCLAIMER AND LIMITATION OF WARRANTIES: LICENSED SOFTWARE AND +THIRD PARTY SOFTWARE ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +AND ANALOG DEVICES, FOR ITSELF AND ITS LICENSORS, HEREBY DISCLAIMS ALL +WARRANTIES, WHETHER EXPRESS OR IMPLIED, ORAL OR WRITTEN, WITH RESPECT +TO THE LICENSED SOFTWARE AND THIRD PARTY SOFTWARE, INCLUDING, BUT NOT +LIMITED TO, ANY EXPRESS AND IMPLIED WARRANTIES OF MERCHANTABILITY; +FITNESS FOR PARTICULAR PURPOSE AND SYSTEM INTEGRATION; CONDITIONS OF +QUALITY AND ACCURACY OF INFORMATIONAL CONTENT; NON-INFRINGEMENT; QUIET +ENJOYMENT; AND TITLE. LICENSEE AGREES THAT ANY EFFORTS BY ANALOG +DEVICES TO MODIFY OR UPDATE LICENSED SOFTWARE OR THIRD PARTY SOFTWARE +SHALL NOT BE DEEMED A WAIVER OF THESE LIMITATIONS, AND THAT ANY ANALOG +DEVICES WARRANTIES SHALL NOT BE DEEMED TO HAVE FAILED OF THEIR +ESSENTIAL PURPOSE. + + 11. LIMITATION OF LIABILITY: TO THE MAXIMUM EXTENT PERMITTED BY +LAW, ANALOG DEVICES (INCLUDING ITS LICENSORS) SHALL NOT BE LIABLE FOR +ANY DAMAGES ARISING FROM OR RELATED TO THE LICENSED SOFTWARE, THIRD +PARTY SOFTWARE, THEIR USE OR ANY RELATED INFORMATION AND/OR SERVICES, +INCLUDING BUT NOT LIMITED TO ANY INDIRECT,a INCIDENTAL, SPECIAL, +PUNITIVE, EXEMPLARY, CONSEQUENTIAL OR ANALOGOUS DAMAGES (INCLUDING +WITHOUT LIMITATION ANY DAMAGES RESULTING FROM LOSS OF USE, DATA, +REVENUE, PROFITS, OR SAVINGS, COMPUTER DAMAGE OR ANY OTHER CAUSE), +UNDER ANY LEGAL THEORY (INCLUDING WITHOUT LIMITATION CONTRACT, +WARRANTY, TORT, NEGLIGENCE, STRICT OR PRODUCT LIABILITY), EVEN IF IT +HAS BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. + + IN NO EVENT SHALL ANALOG DEVICES’ OR ITS LICENSORS’ CUMULATIVE +LIABILITY FOR DAMAGES TO LICENSEE FOR ANY AND ALL CAUSES WHATSOEVER, +REGARDLESS OF THE FORM OF ANY CLAIMS OR ACTIONS, EXCEED THE GREATER OF +(1) ONE HUNDRED U.S. DOLLARS ($100.00 U.S.) OR (2) THE AMOUNT PAID TO +ANALOG DEVICES HEREUNDER FOR THE LICENSED SOFTWARE. + + Some jurisdictions do not permit the exclusion or limitation of +liability for consequential or incidental damages, and, as such, some +portion of the above limitation may not apply to Licensee. In such +jurisdictions, Analog Devices' liability is limited to the greatest +extent permitted by law. + + 12. HIGH RISK APPLICATIONS: THE LICENSED SOFTWARE IS NOT DESIGNED +OR INTENDED FOR USE IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE +PERFORMANCE, INCLUDING, WITHOUT LIMITATION, IN THE OPERATION OF NUCLEAR +FACILITIES, AIRCRAFT NAVIGATION OR CONTROL SYSTEMS, AIR TRAFFIC +CONTROL, LIFE SUPPORT MACHINES, WEAPONS SYSTEMS, OR ANY OTHER +APPLICATION IN WHICH THE FAILURE OF THE LICENSED SOFTWARE COULD LEAD TO +DEATH, PERSONAL INJURY OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGES +(“HIGH RISK ACTIVITIES”). LICENSED SOFTWARE IS NOT DESIGNED, +AUTHORIZED, OR WARRANTED TO BE SUITABLE FOR USE IN CONNECTION WITH HIGH +RISK ACTIVITIES. USE OF LICENSED SOFTWARE IN CONNECTION WITH HIGH RISK +ACTIVITIES IS UNDERSTOOD TO BE FULLY AT LICENSEE’S RISK. + + 13. Choice of Law: This Agreement and any dispute related to the +Licensed Software shall be governed by the laws of the Commonwealth of +Massachusetts, United States of America, without reference to its +principles of conflicts of laws, and, as to matters affecting +copyrights, trademarks and patents, in addition, by applicable United +States federal law. The parties agree that the jurisdiction and venue +of any action with respect to this Agreement shall be in a court of +competent subject matter jurisdiction located in the Commonwealth of +Massachusetts, and each of the parties hereby agrees to submit itself +to the exclusive jurisdiction and venue of such courts for the purpose +of any such action, except that Analog Devices may seek injunctive +relief in any venue of its choosing. Licensee hereby submits to +personal jurisdiction in such courts. The parties hereto specifically +exclude the United Nations Convention on Contracts for the +International Sale of Goods and the Uniform Computer Information +Transactions Act from this Agreement and any transaction between them +that may be implemented in connection with this Agreement. The original +of this Agreement has been written in English. The parties hereto waive +any statute, law, or regulation that might provide an alternative law +or forum or to have this Agreement written in any language other than +English. + + 14. Export: Licensee shall defend, indemnify and hold harmless +Analog Devices from and against any damages, fines, penalties, +assessments, liabilities, costs and expenses (including reasonable +attorneys’ fees and court costs) arising out of any failure by Licensee +to comply with any applicable export control laws or regulations. + + 15. Compliance with Laws of Other Jurisdictions: Licensee shall +comply with all laws, legislation, rules, regulations, governmental +requirements and industry standards with respect to Licensed Software, +and the performance by Licensee of its obligations hereunder, existing +in any applicable jurisdiction. + + 16. Assignment: Analog Devices may assign, transfer, or sublicense +this Agreement or any rights or obligations hereunder at any time in +its sole discretion. + + 17. Waiver; Modification; Severability: No waiver, consent, +modification or change of terms of this Agreement shall bind either +party unless in writing signed by both parties, and then such waiver, +consent, modification or change shall be effective only in the specific +instance and for the specific purpose given. If any provision of this +Agreement is unenforceable, such provision shall be enforced to the +extent possible under applicable law, and the remaining provisions will +remain in effect. + + 18. Entire Agreement: This Agreement supersedes any and all other +agreements, either oral or in writing, between the parties with respect +to the matters stated herein. If, for any reason, any provision of this +Agreement is held invalid, such invalidity shall not affect the +remainder of this Agreement, and this Agreement shall continue in force +and effect to the full extent allowed by law. For the avoidance of +doubt, all Licensed Software under this Agreement is subject to the +terms and conditions of this Agreement and not any agreement or terms +for purchase of Analog Devices products, even if the Licensed Software +is delivered with such products. + diff --git a/projects/adrv904x/src/common/ADRV9040_RxGainTable.h b/projects/adrv904x/src/common/ADRV9040_RxGainTable.h new file mode 100644 index 00000000000..fded50087de --- /dev/null +++ b/projects/adrv904x/src/common/ADRV9040_RxGainTable.h @@ -0,0 +1,306 @@ +/***************************************************************************//** + * @file ADRV9040_RxGainTable.h + * @brief adrv9040 RX gain table. + * @author GMois (george.mois@analog.com) +******************************************************************************** + * Copyright 2023(c) Analog Devices, Inc. + * + * 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 Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights + * of one or more patent holders. This license does not release you + * from the requirement that you obtain separate licenses from these + * patent holders to use this software. + * - Use of the software either in source or binary form, must be run + * on or directly connected to an Analog Devices Inc. component. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, 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 ADRV9040_RX_GAIN_TABLE_H +#define ADRV9040_RX_GAIN_TABLE_H + +#include + +const char *ADRV9040_RxGainTable_text = + "Version,2,10,0,4\n\ +Checksum,3032671981,0,0,0\n\ +Gain Index,FE Control Word,Ext Control,Phase Offset,Digital Gain\n\ +0,0,0,0,0,\n\ +1,0,0,0,0,\n\ +2,0,0,0,0,\n\ +3,0,0,0,0,\n\ +4,0,0,0,0,\n\ +5,0,0,0,0,\n\ +6,0,0,0,0,\n\ +7,0,0,0,0,\n\ +8,0,0,0,0,\n\ +9,0,0,0,0,\n\ +10,0,0,0,0,\n\ +11,0,0,0,0,\n\ +12,0,0,0,0,\n\ +13,0,0,0,0,\n\ +14,0,0,0,0,\n\ +15,0,0,0,0,\n\ +16,0,0,0,0,\n\ +17,0,0,0,0,\n\ +18,0,0,0,0,\n\ +19,0,0,0,0,\n\ +20,0,0,0,0,\n\ +21,0,0,0,0,\n\ +22,0,0,0,0,\n\ +23,0,0,0,0,\n\ +24,0,0,0,0,\n\ +25,0,0,0,0,\n\ +26,0,0,0,0,\n\ +27,0,0,0,0,\n\ +28,0,0,0,0,\n\ +29,0,0,0,0,\n\ +30,0,0,0,0,\n\ +31,0,0,0,0,\n\ +32,0,0,0,0,\n\ +33,0,0,0,0,\n\ +34,0,0,0,0,\n\ +35,0,0,0,0,\n\ +36,0,0,0,0,\n\ +37,0,0,0,0,\n\ +38,0,0,0,0,\n\ +39,0,0,0,0,\n\ +40,0,0,0,0,\n\ +41,0,0,0,0,\n\ +42,0,0,0,0,\n\ +43,0,0,0,0,\n\ +44,0,0,0,0,\n\ +45,0,0,0,0,\n\ +46,0,0,0,0,\n\ +47,0,0,0,0,\n\ +48,0,0,0,0,\n\ +49,0,0,0,0,\n\ +50,0,0,0,0,\n\ +51,0,0,0,0,\n\ +52,0,0,0,0,\n\ +53,0,0,0,0,\n\ +54,0,0,0,0,\n\ +55,0,0,0,0,\n\ +56,0,0,0,0,\n\ +57,0,0,0,0,\n\ +58,0,0,0,0,\n\ +59,0,0,0,0,\n\ +60,0,0,0,0,\n\ +61,0,0,0,0,\n\ +62,0,0,0,0,\n\ +63,0,0,0,0,\n\ +64,0,0,0,0,\n\ +65,0,0,0,0,\n\ +66,0,0,0,0,\n\ +67,0,0,0,0,\n\ +68,0,0,0,0,\n\ +69,0,0,0,0,\n\ +70,0,0,0,0,\n\ +71,0,0,0,0,\n\ +72,0,0,0,0,\n\ +73,0,0,0,0,\n\ +74,0,0,0,0,\n\ +75,0,0,0,0,\n\ +76,0,0,0,0,\n\ +77,0,0,0,0,\n\ +78,0,0,0,0,\n\ +79,0,0,0,0,\n\ +80,0,0,0,0,\n\ +81,0,0,0,0,\n\ +82,0,0,0,0,\n\ +83,0,0,0,0,\n\ +84,0,0,0,0,\n\ +85,0,0,0,0,\n\ +86,0,0,0,0,\n\ +87,0,0,0,0,\n\ +88,0,0,0,0,\n\ +89,0,0,0,0,\n\ +90,0,0,0,0,\n\ +91,0,0,0,0,\n\ +92,0,0,0,0,\n\ +93,0,0,0,0,\n\ +94,0,0,0,0,\n\ +95,0,0,0,0,\n\ +96,0,0,0,0,\n\ +97,0,0,0,0,\n\ +98,0,0,0,0,\n\ +99,0,0,0,0,\n\ +100,0,0,0,0,\n\ +101,0,0,0,0,\n\ +102,0,0,0,0,\n\ +103,0,0,0,0,\n\ +104,0,0,0,0,\n\ +105,0,0,0,0,\n\ +106,0,0,0,0,\n\ +107,0,0,0,0,\n\ +108,0,0,0,0,\n\ +109,0,0,0,0,\n\ +110,0,0,0,0,\n\ +111,0,0,0,0,\n\ +112,0,0,0,0,\n\ +113,0,0,0,0,\n\ +114,0,0,0,0,\n\ +115,0,0,0,0,\n\ +116,0,0,0,0,\n\ +117,0,0,0,0,\n\ +118,0,0,0,0,\n\ +119,0,0,0,0,\n\ +120,0,0,0,0,\n\ +121,0,0,0,0,\n\ +122,0,0,0,0,\n\ +123,0,0,0,0,\n\ +124,0,0,0,0,\n\ +125,0,0,0,0,\n\ +126,0,0,0,0,\n\ +127,0,0,0,0,\n\ +128,0,0,0,0,\n\ +129,0,0,0,0,\n\ +130,0,0,0,0,\n\ +131,0,0,0,0,\n\ +132,0,0,0,0,\n\ +133,0,0,0,0,\n\ +134,0,0,0,0,\n\ +135,0,0,0,0,\n\ +136,0,0,0,0,\n\ +137,0,0,0,0,\n\ +138,0,0,0,0,\n\ +139,0,0,0,0,\n\ +140,0,0,0,0,\n\ +141,0,0,0,0,\n\ +142,0,0,0,0,\n\ +143,0,0,0,0,\n\ +144,0,0,0,0,\n\ +145,0,0,0,0,\n\ +146,0,0,0,0,\n\ +147,0,0,0,0,\n\ +148,0,0,0,0,\n\ +149,0,0,0,0,\n\ +150,0,0,0,0,\n\ +151,0,0,0,0,\n\ +152,0,0,0,0,\n\ +153,0,0,0,0,\n\ +154,0,0,0,0,\n\ +155,0,0,0,0,\n\ +156,0,0,0,0,\n\ +157,0,0,0,0,\n\ +158,0,0,0,0,\n\ +159,0,0,0,0,\n\ +160,0,0,0,0,\n\ +161,0,0,0,0,\n\ +162,0,0,0,0,\n\ +163,0,0,0,0,\n\ +164,0,0,0,0,\n\ +165,0,0,0,0,\n\ +166,0,0,0,0,\n\ +167,0,0,0,0,\n\ +168,0,0,0,0,\n\ +169,0,0,0,0,\n\ +170,0,0,0,0,\n\ +171,0,0,0,0,\n\ +172,0,0,0,0,\n\ +173,0,0,0,0,\n\ +174,0,0,0,0,\n\ +175,0,0,0,0,\n\ +176,0,0,0,0,\n\ +177,0,0,0,0,\n\ +178,0,0,0,0,\n\ +179,0,0,0,0,\n\ +180,0,0,0,0,\n\ +181,0,0,0,0,\n\ +182,0,0,0,0,\n\ +183,251,0,0,-20,\n\ +184,251,0,0,-10,\n\ +185,251,0,0,0,\n\ +186,251,0,0,10,\n\ +187,250,0,0,-17,\n\ +188,250,0,0,-7,\n\ +189,250,0,0,3,\n\ +190,250,0,0,13,\n\ +191,249,0,0,-9,\n\ +192,249,0,0,1,\n\ +193,249,0,0,11,\n\ +194,248,0,0,-4,\n\ +195,248,0,0,6,\n\ +196,247,0,0,-11,\n\ +197,247,0,0,-1,\n\ +198,247,0,0,9,\n\ +199,246,0,0,0,\n\ +200,246,0,0,10,\n\ +201,245,0,0,0,\n\ +202,244,0,0,-5,\n\ +203,244,0,0,5,\n\ +204,243,0,0,0,\n\ +205,242,0,0,-3,\n\ +206,241,0,0,-6,\n\ +207,241,0,0,4,\n\ +208,240,0,0,3,\n\ +209,239,0,0,0,\n\ +210,238,0,0,0,\n\ +211,237,0,0,0,\n\ +212,236,0,0,1,\n\ +213,235,0,0,2,\n\ +214,234,0,0,4,\n\ +215,232,0,0,-1,\n\ +216,231,0,0,0,\n\ +217,229,0,0,-3,\n\ +218,228,0,0,1,\n\ +219,226,0,0,-1,\n\ +220,225,0,0,3,\n\ +221,223,0,0,1,\n\ +222,221,0,0,1,\n\ +223,219,0,0,1,\n\ +224,216,0,0,-2,\n\ +225,214,0,0,-1,\n\ +226,212,0,0,1,\n\ +227,209,0,0,0,\n\ +228,206,0,0,-1,\n\ +229,203,0,0,-1,\n\ +230,200,0,0,0,\n\ +231,197,0,0,0,\n\ +232,193,0,0,0,\n\ +233,189,0,0,-1,\n\ +234,185,0,0,-1,\n\ +235,181,0,0,0,\n\ +236,176,0,0,-1,\n\ +237,172,0,0,1,\n\ +238,166,0,0,-1,\n\ +239,161,0,0,0,\n\ +240,155,0,0,0,\n\ +241,149,0,0,0,\n\ +242,142,0,0,0,\n\ +243,135,0,0,0,\n\ +244,127,0,0,-1,\n\ +245,119,0,0,0,\n\ +246,111,0,0,0,\n\ +247,101,0,0,0,\n\ +248,91,0,0,0,\n\ +249,81,0,0,0,\n\ +250,70,0,0,0,\n\ +251,57,0,0,0,\n\ +252,45,0,0,0,\n\ +253,31,0,0,0,\n\ +254,16,0,0,0,\n\ +255,0,0,0,0,\n"; + +#endif + diff --git a/projects/adrv904x/src/common/app_config.h b/projects/adrv904x/src/common/app_config.h new file mode 100644 index 00000000000..8454cbba6d0 --- /dev/null +++ b/projects/adrv904x/src/common/app_config.h @@ -0,0 +1,65 @@ +/***************************************************************************//** + * @file adrv904x/src/common/app_config.h + * @brief Config file for the ADRV904x project. + * @author GMois (george.mois@analog.com) +******************************************************************************** + * Copyright 2023(c) Analog Devices, Inc. + * + * 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 Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights + * of one or more patent holders. This license does not release you + * from the requirement that you obtain separate licenses from these + * patent holders to use this software. + * - Use of the software either in source or binary form, must be run + * on or directly connected to an Analog Devices Inc. component. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, 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 APP_CONFIG_H_ +#define APP_CONFIG_H_ + +//#define IIO_SUPPORT + +//#define DMA_EXAMPLE + +#define UART_BAUDRATE 921600 + +#define ADRV904X_DEVICE_CLK_KHZ 245760 +#define ADRV904X_LANE_RATE_KHZ 16220160 + +#define ADRV904X_TX_JESD_OCTETS_PER_FRAME 4 +#define ADRV904X_TX_JESD_FRAMES_PER_MULTIFRAME 64 +#define ADRV904X_TX_JESD_CONVS_PER_DEVICE 16 +#define ADRV904X_TX_JESD_CONV_RESOLUTION 16 +#define ADRV904X_TX_JESD_BITS_PER_SAMPLE 16 +#define ADRV904X_TX_JESD_HIGH_DENSITY 1 +#define ADRV904X_TX_JESD_CTRL_BITS_PER_SAMPLE 0 +#define ADRV904X_TX_JESD_SUBCLASS 1 + +#define ADRV904X_RX_JESD_OCTETS_PER_FRAME 4 +#define ADRV904X_RX_JESD_FRAMES_PER_MULTIFRAME 64 +#define ADRV904X_RX_JESD_SUBCLASS 1 + +#endif /* APP_CONFIG_H_ */ diff --git a/projects/adrv904x/src/common/common_data.c b/projects/adrv904x/src/common/common_data.c new file mode 100644 index 00000000000..cfcd354b71e --- /dev/null +++ b/projects/adrv904x/src/common/common_data.c @@ -0,0 +1,66 @@ +/***************************************************************************//** + * @file adrv904x/src/common/common_data.c + * @brief Defines common data to be used by adrv904x examples. + * @author GMois (george.mois@analog.com) +******************************************************************************** + * Copyright 2023(c) Analog Devices, Inc. + * + * 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 Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights + * of one or more patent holders. This license does not release you + * from the requirement that you obtain separate licenses from these + * patent holders to use this software. + * - Use of the software either in source or binary form, must be run + * on or directly connected to an Analog Devices Inc. component. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, 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 Files **********************************/ +/******************************************************************************/ +#include "common_data.h" +#include "parameters.h" + +/******************************************************************************/ +/********************** Macros and Constants Definitions **********************/ +/******************************************************************************/ + +/* Initialize the SPI structure */ +const struct no_os_spi_init_param ad9528_spi_param = { + .device_id = SPI_DEVICE_ID, + .max_speed_hz = 10000000u, + .chip_select = AD9528_CS, + .mode = NO_OS_SPI_MODE_0, + .platform_ops = &xil_spi_ops, + .extra = &spi_extra +}; + +/* Initialize the clkchip GPIO structure */ +const struct no_os_gpio_init_param clkchip_gpio_init_param = { + .number = AD9528_RESET_B, + .platform_ops = &xil_gpio_ops, + .extra = &xil_gpio_param +}; + diff --git a/projects/adrv904x/src/common/common_data.h b/projects/adrv904x/src/common/common_data.h new file mode 100644 index 00000000000..da74414e224 --- /dev/null +++ b/projects/adrv904x/src/common/common_data.h @@ -0,0 +1,55 @@ +/***************************************************************************//** + * @file adrv904x/src/common/common_data.h + * @brief Defines common data to be used by adrv904x examples. + * @author GMois (george.mois@analog.com) +******************************************************************************** + * Copyright 2023(c) Analog Devices, Inc. + * + * 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 Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights + * of one or more patent holders. This license does not release you + * from the requirement that you obtain separate licenses from these + * patent holders to use this software. + * - Use of the software either in source or binary form, must be run + * on or directly connected to an Analog Devices Inc. component. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, 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 __COMMON_DATA_H__ +#define __COMMON_DATA_H__ + +/******************************************************************************/ +/***************************** Include Files **********************************/ +/******************************************************************************/ +#include "platform_includes.h" +#include "no_os_gpio.h" +#include "no_os_spi.h" + +/******************************************************************************/ +/********************** Macros and Constants Definitions **********************/ +/******************************************************************************/ +extern const struct no_os_spi_init_param ad9528_spi_param; +extern const struct no_os_gpio_init_param clkchip_gpio_init_param; + +#endif /* __COMMON_DATA_H__ */ diff --git a/projects/adrv904x/src/common/firmware/ADRV9040_DFE_CALS_FW.h b/projects/adrv904x/src/common/firmware/ADRV9040_DFE_CALS_FW.h new file mode 100644 index 00000000000..979bdb96584 --- /dev/null +++ b/projects/adrv904x/src/common/firmware/ADRV9040_DFE_CALS_FW.h @@ -0,0 +1,33281 @@ +/***************************************************************************//** + * @file ADRV9040_DFE_CALS_FW.h + * @brief Koror DFE calls firmware binary. + * @author George Mois (george.mois@analog.com) +******************************************************************************** + * Copyright 2023(c) Analog Devices, Inc. + * + * 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 Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights + * of one or more patent holders. This license does not release you + * from the requirement that you obtain separate licenses from these + * patent holders to use this software. + * - Use of the software either in source or binary form, must be run + * on or directly connected to an Analog Devices Inc. component. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, 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 ADRV9040_DFE_CALS_FW_H +#define ADRV9040_DFE_CALS_FW_H + +unsigned char ADRV9040_DFE_CALS_FW_bin[] = { + 0x60, 0x56, 0xcf, 0x3b, 0x02, 0x00, 0x10, 0xad, 0x01, 0x00, 0x00, 0x00, + 0x60, 0x06, 0xac, 0xd3, 0xc1, 0x21, 0x00, 0x58, 0x01, 0xc0, 0x18, 0xd5, + 0xc1, 0x21, 0x00, 0x58, 0x01, 0xc0, 0x1c, 0xd5, 0xc1, 0x21, 0x00, 0x58, + 0x01, 0xc0, 0x1e, 0xd5, 0x1f, 0x11, 0x1e, 0xd5, 0xdf, 0x3f, 0x03, 0xd5, + 0xe0, 0x01, 0x80, 0xd2, 0xa0, 0xcc, 0x1e, 0xd5, 0xdf, 0x3f, 0x03, 0xd5, + 0xa0, 0xcc, 0x18, 0xd5, 0x23, 0x90, 0x80, 0xd2, 0x03, 0x11, 0x1e, 0xd5, + 0xdf, 0x3f, 0x03, 0xd5, 0xe0, 0x01, 0x80, 0xd2, 0xa0, 0xc9, 0x1c, 0xd5, + 0xdf, 0x3f, 0x03, 0xd5, 0xa0, 0xcc, 0x18, 0xd5, 0x02, 0x00, 0xb0, 0xd2, + 0x02, 0x11, 0x1c, 0xd5, 0x1f, 0x21, 0x1c, 0xd5, 0xa0, 0x00, 0x38, 0xd5, + 0xa0, 0x00, 0x1c, 0xd5, 0x00, 0x00, 0x38, 0xd5, 0x00, 0x00, 0x1c, 0xd5, + 0x45, 0xca, 0x00, 0x94, 0xf3, 0x03, 0x00, 0xaa, 0x5f, 0x11, 0x1e, 0xd5, + 0x5f, 0x11, 0x1c, 0xd5, 0x00, 0x00, 0x80, 0xd2, 0x00, 0x10, 0x1e, 0xd5, + 0x00, 0x10, 0x1c, 0xd5, 0x00, 0x10, 0x18, 0xd5, 0x40, 0x1e, 0x00, 0x58, + 0x00, 0x28, 0x13, 0xcb, 0x1f, 0x00, 0x00, 0x91, 0x13, 0x01, 0x00, 0xb5, + 0x00, 0x1e, 0x00, 0x58, 0x21, 0x1e, 0x00, 0x58, 0x21, 0x00, 0x00, 0xcb, + 0x93, 0x22, 0x00, 0x94, 0x00, 0x1e, 0x00, 0x58, 0x21, 0x00, 0x80, 0xd2, + 0x01, 0x00, 0x00, 0xf9, 0xa1, 0x1d, 0x00, 0x58, 0x21, 0x00, 0x40, 0xf9, + 0x3f, 0x04, 0x00, 0xf1, 0xa1, 0xff, 0xff, 0x54, 0x6f, 0x22, 0x00, 0x94, + 0x00, 0x06, 0x80, 0xd2, 0xe1, 0x03, 0x13, 0xaa, 0x04, 0xcd, 0x00, 0x94, + 0x26, 0xca, 0x00, 0x94, 0xa2, 0xcc, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, + 0xb0, 0xcc, 0x00, 0x94, 0xe0, 0x03, 0x14, 0x2a, 0x21, 0x00, 0x80, 0x52, + 0xe9, 0xcc, 0x00, 0x94, 0xe0, 0x1f, 0x80, 0xd2, 0x00, 0x46, 0x18, 0xd5, + 0x73, 0x00, 0x00, 0xb5, 0x20, 0x00, 0x80, 0x52, 0x3c, 0xcd, 0x00, 0x94, + 0xa1, 0x00, 0x00, 0x10, 0x21, 0x40, 0x1e, 0xd5, 0xa1, 0x38, 0x80, 0xd2, + 0x01, 0x40, 0x1e, 0xd5, 0xe0, 0x03, 0x9f, 0xd6, 0xc0, 0x1a, 0x00, 0x58, + 0x00, 0x20, 0x13, 0xcb, 0x1f, 0x00, 0x00, 0x91, 0xbf, 0x40, 0x00, 0xd5, + 0xdf, 0x3f, 0x03, 0xd5, 0x60, 0x1a, 0x00, 0x58, 0x00, 0x30, 0x13, 0xcb, + 0x1f, 0x00, 0x00, 0x91, 0x00, 0x06, 0xa0, 0xd2, 0x40, 0x10, 0x18, 0xd5, + 0xe2, 0xc9, 0x00, 0x94, 0x1f, 0x87, 0x08, 0xd5, 0xc1, 0x19, 0x00, 0x58, + 0x01, 0x20, 0x18, 0xd5, 0x81, 0xe8, 0x9f, 0xd2, 0x81, 0x00, 0xa0, 0xf2, + 0x01, 0xa2, 0x18, 0xd5, 0x61, 0x19, 0x00, 0x58, 0x41, 0x20, 0x18, 0xd5, + 0xdf, 0x3f, 0x03, 0xd5, 0xe0, 0x03, 0x14, 0x2a, 0x01, 0x00, 0x80, 0x52, + 0x02, 0x1c, 0x80, 0x52, 0xaf, 0xcc, 0x00, 0x94, 0xe0, 0x03, 0x14, 0x2a, + 0x01, 0x00, 0x80, 0x52, 0x94, 0xcc, 0x00, 0x94, 0x00, 0x1f, 0x80, 0xd2, + 0x00, 0x46, 0x18, 0xd5, 0x20, 0x00, 0x80, 0xd2, 0xe0, 0xcc, 0x18, 0xd5, + 0xdf, 0x3f, 0x03, 0xd5, 0x53, 0x13, 0x00, 0xb5, 0x40, 0x00, 0x80, 0x52, + 0xc8, 0xcc, 0x00, 0x94, 0xf5, 0x16, 0x00, 0x58, 0xe0, 0x03, 0x15, 0xaa, + 0x01, 0x04, 0x80, 0xd2, 0xb0, 0xc9, 0x00, 0x94, 0xf6, 0x16, 0x00, 0x58, + 0x01, 0x00, 0x82, 0xd2, 0xe0, 0x03, 0x16, 0xaa, 0xac, 0xc9, 0x00, 0x94, + 0xa4, 0x14, 0x00, 0x58, 0x97, 0x7c, 0x5e, 0xd3, 0xc1, 0x06, 0x40, 0xb2, + 0xa1, 0x7a, 0x37, 0xf8, 0x82, 0x74, 0x55, 0xd3, 0x05, 0x16, 0x00, 0x58, + 0xa3, 0x04, 0x00, 0xd1, 0x63, 0x74, 0x55, 0xd3, 0x63, 0x04, 0x00, 0x91, + 0x63, 0x00, 0x02, 0xcb, 0x84, 0xa8, 0x6b, 0x92, 0x81, 0x15, 0x00, 0x58, + 0x21, 0x00, 0x04, 0xaa, 0xc0, 0x0e, 0x02, 0x8b, 0x63, 0x04, 0x00, 0xf1, + 0x01, 0x84, 0x00, 0xf8, 0x21, 0x00, 0x48, 0x91, 0xa1, 0xff, 0xff, 0x54, + 0xf8, 0x14, 0x00, 0x58, 0x04, 0x15, 0x00, 0x58, 0x99, 0x7c, 0x5e, 0xd3, + 0x3f, 0x03, 0x17, 0xeb, 0xd8, 0x02, 0x98, 0x9a, 0xc0, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x18, 0xaa, 0x01, 0x00, 0x82, 0xd2, 0x91, 0xc9, 0x00, 0x94, + 0x01, 0x07, 0x40, 0xb2, 0xa1, 0x7a, 0x39, 0xf8, 0x82, 0x74, 0x55, 0xd3, + 0x84, 0xa8, 0x6b, 0x92, 0xc1, 0x13, 0x00, 0x58, 0x21, 0x00, 0x04, 0xaa, + 0x01, 0x7b, 0x22, 0xf8, 0xa4, 0x13, 0x00, 0x58, 0xf8, 0x03, 0x16, 0xaa, + 0x82, 0x74, 0x55, 0xd3, 0x84, 0xa8, 0x6b, 0x92, 0x21, 0x12, 0x00, 0x58, + 0x21, 0x00, 0x04, 0xaa, 0x01, 0x7b, 0x22, 0xf8, 0x16, 0x13, 0x00, 0x58, + 0x01, 0x00, 0x82, 0xd2, 0xe0, 0x03, 0x16, 0xaa, 0x7f, 0xc9, 0x00, 0x94, + 0xc4, 0x12, 0x00, 0x58, 0x97, 0x7c, 0x5e, 0xd3, 0xc1, 0x06, 0x40, 0xb2, + 0xa1, 0x7a, 0x37, 0xf8, 0x82, 0x74, 0x55, 0xd3, 0x65, 0x12, 0x00, 0x58, + 0xa3, 0x04, 0x00, 0xd1, 0x63, 0x74, 0x55, 0xd3, 0x63, 0x04, 0x00, 0x91, + 0x63, 0x00, 0x02, 0xcb, 0x84, 0xa8, 0x6b, 0x92, 0xa1, 0x10, 0x00, 0x58, + 0x21, 0x00, 0x04, 0xaa, 0xc0, 0x0e, 0x02, 0x8b, 0x63, 0x04, 0x00, 0xf1, + 0x01, 0x84, 0x00, 0xf8, 0x21, 0x00, 0x48, 0x91, 0xa1, 0xff, 0xff, 0x54, + 0x16, 0x11, 0x00, 0x58, 0x01, 0x00, 0x82, 0xd2, 0xe0, 0x03, 0x16, 0xaa, + 0x69, 0xc9, 0x00, 0x94, 0xc4, 0x10, 0x00, 0x58, 0x97, 0x7c, 0x5e, 0xd3, + 0xc1, 0x06, 0x40, 0xb2, 0xa1, 0x7a, 0x37, 0xf8, 0x82, 0x74, 0x55, 0xd3, + 0x65, 0x10, 0x00, 0x58, 0xa3, 0x04, 0x00, 0xd1, 0x63, 0x74, 0x55, 0xd3, + 0x63, 0x04, 0x00, 0x91, 0x63, 0x00, 0x02, 0xcb, 0x84, 0xa8, 0x6b, 0x92, + 0xe1, 0x0d, 0x00, 0x58, 0x21, 0x00, 0x04, 0xaa, 0xc0, 0x0e, 0x02, 0x8b, + 0x63, 0x04, 0x00, 0xf1, 0x01, 0x84, 0x00, 0xf8, 0x21, 0x00, 0x48, 0x91, + 0xa1, 0xff, 0xff, 0x54, 0x16, 0x0f, 0x00, 0x58, 0x01, 0x00, 0x82, 0xd2, + 0xe0, 0x03, 0x16, 0xaa, 0x53, 0xc9, 0x00, 0x94, 0xc4, 0x0e, 0x00, 0x58, + 0x97, 0x7c, 0x5e, 0xd3, 0xc1, 0x06, 0x40, 0xb2, 0xa1, 0x7a, 0x37, 0xf8, + 0x82, 0x74, 0x55, 0xd3, 0x65, 0x0e, 0x00, 0x58, 0xa3, 0x04, 0x00, 0xd1, + 0x63, 0x74, 0x55, 0xd3, 0x63, 0x04, 0x00, 0x91, 0x63, 0x00, 0x02, 0xcb, + 0x84, 0xa8, 0x6b, 0x92, 0xe1, 0x0d, 0x00, 0x58, 0x21, 0x00, 0x04, 0xaa, + 0xc0, 0x0e, 0x02, 0x8b, 0x63, 0x04, 0x00, 0xf1, 0x01, 0x84, 0x00, 0xf8, + 0x21, 0x00, 0x48, 0x91, 0xa1, 0xff, 0xff, 0x54, 0x9f, 0x3b, 0x03, 0xd5, + 0x01, 0x10, 0x38, 0xd5, 0x21, 0x00, 0x40, 0xb2, 0x21, 0xf8, 0x7e, 0x92, + 0x01, 0x10, 0x18, 0xd5, 0xdf, 0x3f, 0x03, 0xd5, 0x9f, 0x3b, 0x03, 0xd5, + 0x1f, 0x71, 0x08, 0xd5, 0x9f, 0x3b, 0x03, 0xd5, 0xdf, 0x3f, 0x03, 0xd5, + 0x01, 0x10, 0x38, 0xd5, 0x21, 0x00, 0x7e, 0xb2, 0x21, 0x00, 0x74, 0xb2, + 0x01, 0x10, 0x18, 0xd5, 0xdf, 0x3f, 0x03, 0xd5, 0x60, 0x0b, 0x00, 0x58, + 0x01, 0x00, 0x80, 0xd2, 0x62, 0x0b, 0x00, 0x58, 0x42, 0x00, 0x00, 0xcb, + 0x21, 0x16, 0x01, 0x94, 0x40, 0x0b, 0x00, 0x58, 0x6b, 0x15, 0x01, 0x94, + 0x96, 0x15, 0x01, 0x94, 0x20, 0x0b, 0x00, 0x58, 0x21, 0x00, 0x80, 0xd2, + 0x01, 0x00, 0x00, 0xf9, 0x01, 0x01, 0x80, 0xd2, 0x7b, 0xc9, 0x00, 0x94, + 0x20, 0x00, 0x80, 0xd2, 0xa1, 0x0a, 0x00, 0x58, 0x3a, 0xcb, 0x00, 0x94, + 0x6b, 0x15, 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x09, 0x00, 0x58, + 0x21, 0x00, 0x40, 0xf9, 0x3f, 0x04, 0x00, 0xf1, 0xa1, 0xff, 0xff, 0x54, + 0x01, 0x10, 0x38, 0xd5, 0x21, 0x00, 0x40, 0xb2, 0x21, 0x00, 0x7e, 0xb2, + 0x21, 0x00, 0x74, 0xb2, 0x21, 0xf8, 0x7e, 0x92, 0x01, 0x10, 0x18, 0xd5, + 0xdf, 0x3f, 0x03, 0xd5, 0x29, 0xcb, 0x00, 0x94, 0x7f, 0x20, 0x03, 0xd5, + 0xff, 0xff, 0xff, 0x17, 0x00, 0x08, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xb5, 0x22, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x15, 0x06, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xf8, 0x03, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xa5, 0x22, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa1, 0x22, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x22, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x25, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x22, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7f, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x25, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x22, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x29, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x22, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x7f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x23, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x03, 0x21, + 0x00, 0x00, 0x00, 0x00, 0x29, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x15, 0x06, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x61, 0x22, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xd0, 0x59, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x03, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x06, 0x06, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x55, 0x18, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x2b, 0x18, 0x01, 0x14, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x10, 0x18, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0xf5, 0x17, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0xd5, 0x17, 0x01, 0x14, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0xab, 0x17, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x90, 0x17, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x75, 0x17, 0x01, 0x14, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x55, 0x17, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x2b, 0x17, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x10, 0x17, 0x01, 0x14, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0xf5, 0x16, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0xd5, 0x16, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0xab, 0x16, 0x01, 0x14, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x90, 0x16, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x75, 0x16, 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x16, 0x01, 0x14, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x2b, 0x16, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x10, 0x16, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0xf5, 0x15, 0x01, 0x14, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0xd5, 0x15, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0xab, 0x15, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x90, 0x15, 0x01, 0x14, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x75, 0x15, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x55, 0x15, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x2b, 0x15, 0x01, 0x14, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x10, 0x15, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0xf5, 0x14, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0xd5, 0x14, 0x01, 0x14, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0xab, 0x14, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x90, 0x14, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x75, 0x14, 0x01, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x55, 0x14, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x2b, 0x14, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x10, 0x14, 0x01, 0x14, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0xf5, 0x13, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0xd5, 0x13, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0xab, 0x13, 0x01, 0x14, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x90, 0x13, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x75, 0x13, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x55, 0x13, 0x01, 0x14, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x2b, 0x13, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x10, 0x13, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0xf5, 0x12, 0x01, 0x14, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0xd5, 0x12, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0xab, 0x12, 0x01, 0x14, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x90, 0x12, 0x01, 0x14, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x75, 0x12, 0x01, 0x14, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfb, 0x73, 0xbf, 0xa9, 0xf9, 0x6b, 0xbf, 0xa9, 0xf7, 0x63, 0xbf, 0xa9, + 0xf5, 0x5b, 0xbf, 0xa9, 0xf3, 0x53, 0xbf, 0xa9, 0xf3, 0x53, 0xc1, 0xa8, + 0xf5, 0x5b, 0xc1, 0xa8, 0xf7, 0x63, 0xc1, 0xa8, 0xf9, 0x6b, 0xc1, 0xa8, + 0xfb, 0x73, 0xc1, 0xa8, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0x2a, + 0xe1, 0xb3, 0x00, 0x91, 0xff, 0x2f, 0x00, 0xb9, 0x60, 0x0e, 0x40, 0xf9, + 0xa1, 0x2b, 0x00, 0x94, 0x20, 0x01, 0x00, 0x35, 0xe0, 0x2f, 0x40, 0xb9, + 0x41, 0x02, 0x80, 0x52, 0x00, 0x00, 0x01, 0x0a, 0x1f, 0x00, 0x01, 0x6b, + 0xe0, 0x01, 0x00, 0x54, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0x23, 0x02, 0x00, 0x90, 0x63, 0x80, 0x2b, 0x91, + 0x5a, 0x4e, 0x00, 0x94, 0xe0, 0x2f, 0x40, 0xb9, 0x41, 0x02, 0x80, 0x52, + 0x00, 0x00, 0x01, 0x0a, 0x1f, 0x00, 0x01, 0x6b, 0x61, 0xfe, 0xff, 0x54, + 0x60, 0x0e, 0x40, 0xf9, 0x02, 0x00, 0x80, 0x52, 0x01, 0x20, 0x80, 0x52, + 0x71, 0x2b, 0x00, 0x94, 0xc0, 0xfd, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, + 0x23, 0x02, 0x00, 0x90, 0x63, 0x20, 0x2c, 0x91, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0x4a, 0x4e, 0x00, 0x94, 0xe7, 0xff, 0xff, 0x17, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0xf3, 0x03, 0x00, 0xaa, 0x21, 0x00, 0x80, 0x52, 0x00, 0xb0, 0x00, 0x91, + 0x01, 0xfc, 0x9f, 0x08, 0x40, 0x00, 0x80, 0x52, 0xe0, 0x29, 0x00, 0x94, + 0x60, 0x0a, 0x40, 0xf9, 0xfa, 0x29, 0x00, 0x94, 0x1f, 0x6c, 0x08, 0x71, + 0x04, 0x18, 0x40, 0x7a, 0x81, 0x00, 0x00, 0x54, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x0b, 0x40, 0xf9, + 0xe2, 0x03, 0x00, 0x2a, 0xfd, 0x7b, 0xc2, 0xa8, 0x23, 0x02, 0x00, 0x90, + 0x63, 0xc0, 0x2c, 0x91, 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0x30, 0x4e, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0xaa, 0x60, 0x00, 0x40, 0xb9, + 0x1f, 0x90, 0x00, 0x71, 0xc0, 0x06, 0x00, 0x54, 0xf7, 0x63, 0x03, 0xa9, + 0xf8, 0x02, 0x00, 0xf0, 0x00, 0x83, 0x58, 0x39, 0xf5, 0x5b, 0x02, 0xa9, + 0xf7, 0x03, 0x03, 0xaa, 0xf3, 0x03, 0x01, 0xaa, 0xf6, 0x03, 0x02, 0xaa, + 0xf5, 0x03, 0x04, 0x2a, 0xe0, 0x09, 0x00, 0x34, 0xe0, 0x03, 0x13, 0xaa, + 0x77, 0x06, 0x00, 0xf9, 0x16, 0xc4, 0x02, 0xf8, 0x1f, 0xfc, 0x9f, 0x08, + 0xe4, 0x12, 0x40, 0xb9, 0xe2, 0x03, 0x14, 0xaa, 0xe1, 0x06, 0x40, 0xf9, + 0x7f, 0x32, 0x00, 0xb9, 0x60, 0x0a, 0x40, 0xf9, 0xe3, 0x03, 0x13, 0xaa, + 0x06, 0x00, 0x80, 0x52, 0x05, 0x03, 0x80, 0x52, 0xa4, 0x29, 0x00, 0x94, + 0x40, 0x06, 0x00, 0x35, 0x60, 0x0a, 0x40, 0xf9, 0x00, 0x07, 0x00, 0xb4, + 0xe1, 0x06, 0x40, 0xf9, 0x60, 0x0e, 0x40, 0xf9, 0x1e, 0x2b, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0x80, 0x03, 0x00, 0x35, 0x60, 0x0e, 0x40, 0xf9, + 0x40, 0x04, 0x00, 0xb4, 0x60, 0x12, 0x40, 0xf9, 0x20, 0x02, 0x00, 0xb4, + 0xe1, 0xff, 0xff, 0xf0, 0x21, 0x00, 0x3f, 0x91, 0x01, 0x30, 0x00, 0xf9, + 0xe1, 0x7f, 0x40, 0xb2, 0x15, 0x68, 0x00, 0xb9, 0x7f, 0x02, 0x01, 0xeb, + 0x48, 0x0b, 0x00, 0x54, 0xe1, 0x0e, 0x40, 0xf9, 0xe2, 0x03, 0x13, 0x2a, + 0x23, 0x00, 0x80, 0x52, 0x81, 0x2a, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, + 0xa0, 0x09, 0x00, 0x35, 0x60, 0x12, 0x40, 0xf9, 0x80, 0x07, 0x00, 0xb4, + 0x75, 0x2a, 0x00, 0xb9, 0xd4, 0x05, 0x00, 0x34, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, + 0x23, 0x02, 0x00, 0x90, 0x63, 0x60, 0x2f, 0x91, 0x00, 0x02, 0x80, 0x52, + 0x01, 0x1c, 0x80, 0x52, 0xe7, 0x4d, 0x00, 0x94, 0x60, 0x0e, 0x40, 0xf9, + 0x00, 0xfc, 0xff, 0xb5, 0x23, 0x02, 0x00, 0x90, 0x63, 0x00, 0x30, 0x91, + 0xc2, 0xfc, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, 0x40, 0x00, 0x80, 0x52, + 0xdf, 0x4d, 0x00, 0x94, 0xd9, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, + 0x23, 0x02, 0x00, 0x90, 0x63, 0x60, 0x2e, 0x91, 0x00, 0x02, 0x80, 0x52, + 0x01, 0x1c, 0x80, 0x52, 0xd8, 0x4d, 0x00, 0x94, 0x60, 0x0a, 0x40, 0xf9, + 0x40, 0xf9, 0xff, 0xb5, 0x23, 0x02, 0x00, 0x90, 0x63, 0x00, 0x2f, 0x91, + 0xe2, 0xfc, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, 0x40, 0x00, 0x80, 0x52, + 0xd0, 0x4d, 0x00, 0x94, 0xc3, 0xff, 0xff, 0x17, 0x21, 0x02, 0x00, 0x90, + 0xe0, 0x02, 0x00, 0xf0, 0x21, 0x60, 0x2d, 0x91, 0x00, 0x00, 0x17, 0x91, + 0x1e, 0x2a, 0x00, 0x94, 0x00, 0x03, 0x00, 0x35, 0x20, 0x00, 0x80, 0x52, + 0x00, 0x83, 0x18, 0x39, 0xaa, 0xff, 0xff, 0x17, 0x60, 0x0a, 0x40, 0xf9, + 0x74, 0x29, 0x00, 0x94, 0x20, 0xfa, 0xff, 0x34, 0x23, 0x02, 0x00, 0x90, + 0x63, 0x60, 0x31, 0x91, 0xa2, 0xfc, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, + 0x40, 0x00, 0x80, 0x52, 0xbd, 0x4d, 0x00, 0x94, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xca, 0xff, 0xff, 0x17, 0x23, 0x02, 0x00, 0x90, + 0x63, 0x60, 0x30, 0x91, 0xa2, 0xfc, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, + 0x40, 0x00, 0x80, 0x52, 0xb4, 0x4d, 0x00, 0x94, 0x75, 0x2a, 0x00, 0xb9, + 0xbf, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0x23, 0x02, 0x00, 0x90, + 0x63, 0xc0, 0x2d, 0x91, 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xac, 0x4d, 0x00, 0x94, 0xe3, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, + 0x23, 0x02, 0x00, 0x90, 0x63, 0xc0, 0x30, 0x91, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xa5, 0x4d, 0x00, 0x94, 0xae, 0xff, 0xff, 0x17, + 0x40, 0x00, 0x80, 0x52, 0x23, 0x02, 0x00, 0x90, 0x63, 0x60, 0x30, 0x91, + 0xa2, 0xfc, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, 0x9e, 0x4d, 0x00, 0x94, + 0x60, 0x12, 0x40, 0xf9, 0xa0, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0x16, 0x00, 0x40, 0xf9, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0xc1, 0x02, 0x40, 0xf9, + 0xf7, 0x1b, 0x00, 0xf9, 0xff, 0x4b, 0x00, 0xb9, 0x20, 0x00, 0x3f, 0xd6, + 0x60, 0x0e, 0x40, 0xf9, 0x41, 0x03, 0x80, 0x52, 0xd4, 0x2a, 0x00, 0x94, + 0xa0, 0x21, 0x00, 0x35, 0x60, 0x0e, 0x40, 0xf9, 0x02, 0x00, 0x80, 0x52, + 0xa1, 0x04, 0x80, 0x52, 0xa7, 0x2a, 0x00, 0x94, 0x20, 0x20, 0x00, 0x35, + 0x95, 0x02, 0x00, 0xf0, 0xb5, 0x22, 0x26, 0x91, 0xf4, 0x02, 0x00, 0xf0, + 0x94, 0x02, 0x17, 0x91, 0x37, 0x02, 0x00, 0x90, 0xf7, 0x22, 0x2c, 0x91, + 0x1f, 0x20, 0x03, 0xd5, 0x60, 0x0e, 0x40, 0xf9, 0xe3, 0x23, 0x01, 0x91, + 0x04, 0x00, 0x80, 0x12, 0x22, 0x00, 0x80, 0x52, 0x01, 0xe0, 0x87, 0x52, + 0xa5, 0x2a, 0x00, 0x94, 0x1f, 0x68, 0x08, 0x71, 0x80, 0x05, 0x00, 0x54, + 0x60, 0x11, 0x00, 0x35, 0xe1, 0x4b, 0x40, 0xb9, 0xa1, 0x00, 0x58, 0x36, + 0xc1, 0x0a, 0x40, 0xf9, 0xe0, 0x03, 0x13, 0xaa, 0x20, 0x00, 0x3f, 0xd6, + 0xe1, 0x4b, 0x40, 0xb9, 0xe1, 0x01, 0x48, 0x36, 0x60, 0x12, 0x40, 0xf9, + 0x60, 0x03, 0x00, 0xb4, 0x14, 0x2a, 0x00, 0x94, 0x00, 0x1b, 0x00, 0x35, + 0x60, 0x0e, 0x40, 0xf9, 0x41, 0x00, 0x80, 0x52, 0xb0, 0x2a, 0x00, 0x94, + 0xa0, 0x19, 0x00, 0x35, 0x60, 0x0e, 0x40, 0xf9, 0x02, 0x00, 0x80, 0x52, + 0x21, 0x00, 0x80, 0x52, 0x83, 0x2a, 0x00, 0x94, 0x20, 0x07, 0x00, 0x35, + 0xe1, 0x4b, 0x40, 0xb9, 0xc1, 0x01, 0x50, 0x36, 0x60, 0x12, 0x40, 0xf9, + 0x80, 0x01, 0x00, 0xb4, 0x60, 0x0e, 0x40, 0xf9, 0x21, 0x00, 0x80, 0x52, + 0xa3, 0x2a, 0x00, 0x94, 0x20, 0x17, 0x00, 0x35, 0x60, 0x0e, 0x40, 0xf9, + 0x02, 0x00, 0x80, 0x52, 0x41, 0x00, 0x80, 0x52, 0x76, 0x2a, 0x00, 0x94, + 0xa0, 0x04, 0x00, 0x35, 0xe1, 0x4b, 0x40, 0xb9, 0x1f, 0x20, 0x03, 0xd5, + 0xc1, 0x01, 0x60, 0x37, 0xa1, 0x00, 0x68, 0x36, 0xc1, 0x12, 0x40, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0x20, 0x00, 0x3f, 0xd6, 0xe1, 0x4b, 0x40, 0xb9, + 0x41, 0x05, 0x40, 0x37, 0xa0, 0x02, 0x40, 0x39, 0x80, 0xf9, 0xff, 0x35, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x14, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0xbe, 0x29, 0x00, 0x94, 0x1f, 0x68, 0x08, 0x71, + 0x80, 0xff, 0xff, 0x54, 0x40, 0x11, 0x00, 0x35, 0x60, 0x06, 0x40, 0xf9, + 0x00, 0x20, 0x40, 0xb9, 0x00, 0x5c, 0x01, 0x51, 0xff, 0x4c, 0x00, 0x94, + 0x60, 0xb2, 0x00, 0x91, 0x1f, 0xfc, 0x9f, 0x08, 0xe0, 0x03, 0x14, 0xaa, + 0xa7, 0x29, 0x00, 0x94, 0x40, 0x0f, 0x00, 0x35, 0xc1, 0x0e, 0x40, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0x20, 0x00, 0x3f, 0xd6, 0xe1, 0x4b, 0x40, 0xb9, + 0xe0, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0x01, 0x1c, 0x80, 0x52, + 0xe3, 0x03, 0x17, 0xaa, 0x00, 0x01, 0x80, 0x52, 0x2c, 0x4d, 0x00, 0x94, + 0xe1, 0x4b, 0x40, 0xb9, 0xd8, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, + 0x01, 0x1c, 0x80, 0x52, 0xe3, 0x03, 0x17, 0xaa, 0x00, 0x01, 0x80, 0x52, + 0x25, 0x4d, 0x00, 0x94, 0xe1, 0x4b, 0x40, 0xb9, 0xc3, 0xff, 0xff, 0x17, + 0x60, 0x0e, 0x40, 0xf9, 0x02, 0x00, 0x80, 0x52, 0x01, 0x01, 0x80, 0x52, + 0xff, 0x4f, 0x00, 0xb9, 0x3e, 0x2a, 0x00, 0x94, 0xc0, 0x0e, 0x00, 0x35, + 0x60, 0x0e, 0x40, 0xf9, 0x81, 0x00, 0x80, 0x52, 0x62, 0x2a, 0x00, 0x94, + 0x60, 0x0d, 0x00, 0x35, 0xe0, 0x03, 0x14, 0xaa, 0x01, 0x00, 0x80, 0x12, + 0x92, 0x29, 0x00, 0x94, 0x1f, 0x68, 0x08, 0x71, 0x80, 0xff, 0xff, 0x54, + 0x20, 0x09, 0x00, 0x35, 0x60, 0x0e, 0x40, 0xf9, 0xe1, 0x33, 0x01, 0x91, + 0x48, 0x2a, 0x00, 0x94, 0xc0, 0x07, 0x00, 0x35, 0xe1, 0x4f, 0x40, 0xb9, + 0x40, 0x02, 0x80, 0x52, 0x20, 0x00, 0x00, 0x0a, 0x1f, 0x48, 0x00, 0x71, + 0xc0, 0x04, 0x00, 0x54, 0xe0, 0x03, 0x14, 0xaa, 0x78, 0x29, 0x00, 0x94, + 0xe0, 0x05, 0x00, 0x35, 0x60, 0x12, 0x40, 0xf9, 0x80, 0x00, 0x00, 0xb4, + 0x61, 0x2a, 0x40, 0xb9, 0xb7, 0x29, 0x00, 0x94, 0xc0, 0x0e, 0x00, 0x35, + 0x60, 0x06, 0x40, 0xf9, 0x00, 0x20, 0x40, 0xb9, 0x00, 0x9c, 0x01, 0x51, + 0xc2, 0x4c, 0x00, 0x94, 0xc1, 0x06, 0x40, 0xf9, 0xe0, 0x03, 0x13, 0xaa, + 0x20, 0x00, 0x3f, 0xd6, 0x60, 0x0e, 0x40, 0xf9, 0x01, 0x01, 0x80, 0x52, + 0x40, 0x2a, 0x00, 0x94, 0x80, 0x06, 0x00, 0x35, 0x60, 0x0e, 0x40, 0xf9, + 0x02, 0x00, 0x80, 0x52, 0x81, 0x00, 0x80, 0x52, 0x13, 0x2a, 0x00, 0x94, + 0xe0, 0xf4, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, 0xe3, 0x03, 0x17, 0xaa, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0xed, 0x4c, 0x00, 0x94, + 0xa1, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0x23, 0x02, 0x00, 0x90, + 0x63, 0xa0, 0x32, 0x91, 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0xe6, 0x4c, 0x00, 0x94, 0x9a, 0xff, 0xff, 0x17, 0x00, 0x40, 0x83, 0x52, + 0x3f, 0x00, 0x00, 0x6a, 0x21, 0xfb, 0xff, 0x54, 0x60, 0x06, 0x40, 0xf9, + 0x00, 0x20, 0x40, 0xb9, 0x00, 0x7c, 0x01, 0x51, 0xa2, 0x4c, 0x00, 0x94, + 0x60, 0xb2, 0x00, 0x91, 0x1f, 0xfc, 0x9f, 0x08, 0xe0, 0x03, 0x14, 0xaa, + 0x4a, 0x29, 0x00, 0x94, 0x60, 0xfa, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, + 0x23, 0x02, 0x00, 0x90, 0x63, 0x60, 0x34, 0x91, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xd3, 0x4c, 0x00, 0x94, 0xcc, 0xff, 0xff, 0x17, + 0xe2, 0x03, 0x00, 0x2a, 0x23, 0x02, 0x00, 0x90, 0x63, 0x80, 0x2b, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0xcc, 0x4c, 0x00, 0x94, + 0xbd, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0x23, 0x02, 0x00, 0x90, + 0x63, 0xc0, 0x33, 0x91, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xc5, 0x4c, 0x00, 0x94, 0xb2, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, + 0x23, 0x02, 0x00, 0x90, 0x63, 0x00, 0x32, 0x91, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0xbe, 0x4c, 0x00, 0x94, 0xc7, 0xff, 0xff, 0x17, + 0xe2, 0x03, 0x00, 0x2a, 0x23, 0x02, 0x00, 0x90, 0x63, 0x60, 0x34, 0x91, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0xb7, 0x4c, 0x00, 0x94, + 0x81, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0x23, 0x02, 0x00, 0x90, + 0x63, 0xc0, 0x33, 0x91, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xb0, 0x4c, 0x00, 0x94, 0x71, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, + 0x23, 0x02, 0x00, 0x90, 0x63, 0x00, 0x32, 0x91, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0xa9, 0x4c, 0x00, 0x94, 0x90, 0xff, 0xff, 0x17, + 0xe2, 0x03, 0x00, 0x2a, 0xe3, 0x03, 0x17, 0xaa, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0xa3, 0x4c, 0x00, 0x94, 0x86, 0xff, 0xff, 0x17, + 0xe2, 0x03, 0x00, 0x2a, 0x23, 0x02, 0x00, 0x90, 0x63, 0x00, 0x32, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x9c, 0x4c, 0x00, 0x94, + 0x42, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0x23, 0x02, 0x00, 0x90, + 0x63, 0x00, 0x32, 0x91, 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0x95, 0x4c, 0x00, 0x94, 0x2e, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, + 0x23, 0x02, 0x00, 0x90, 0x63, 0x40, 0x33, 0x91, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0x8e, 0x4c, 0x00, 0x94, 0x23, 0xff, 0xff, 0x17, + 0xe2, 0x03, 0x00, 0x2a, 0x23, 0x02, 0x00, 0x90, 0x63, 0x00, 0x35, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x87, 0x4c, 0x00, 0x94, + 0x85, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0x23, 0x02, 0x00, 0x90, + 0x63, 0x20, 0x2c, 0x91, 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0x80, 0x4c, 0x00, 0x94, 0xfa, 0xfe, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, + 0x23, 0x02, 0x00, 0x90, 0x63, 0x00, 0x32, 0x91, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0x79, 0x4c, 0x00, 0x94, 0xee, 0xfe, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0x0a, 0x28, 0x00, 0x94, + 0xe1, 0x03, 0x00, 0xaa, 0x00, 0x00, 0x80, 0x52, 0x81, 0x00, 0x00, 0xb4, + 0x21, 0xb0, 0x00, 0x91, 0x20, 0xfc, 0xdf, 0x08, 0x00, 0x1c, 0x00, 0x12, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0x00, 0x08, 0x40, 0xf9, 0x60, 0x02, 0x00, 0xb4, + 0xf4, 0x02, 0x00, 0xf0, 0x94, 0x02, 0x17, 0x91, 0xe0, 0x03, 0x14, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0xda, 0x28, 0x00, 0x94, 0x1f, 0x68, 0x08, 0x71, + 0x80, 0xff, 0xff, 0x54, 0xc0, 0x02, 0x00, 0x35, 0xe0, 0x03, 0x13, 0xaa, + 0x11, 0xfe, 0xff, 0x97, 0x60, 0x0e, 0x40, 0xf9, 0x02, 0x00, 0x80, 0x52, + 0x01, 0x00, 0x81, 0x52, 0x75, 0x29, 0x00, 0x94, 0x80, 0x03, 0x00, 0x35, + 0xe0, 0x03, 0x14, 0xaa, 0xc2, 0x28, 0x00, 0x94, 0x80, 0x00, 0x00, 0x35, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf3, 0x53, 0x41, 0xa9, 0xe2, 0x03, 0x00, 0x2a, 0xfd, 0x7b, 0xc2, 0xa8, + 0x23, 0x02, 0x00, 0x90, 0x63, 0x60, 0x34, 0x91, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x46, 0x4c, 0x00, 0x14, 0xe2, 0x03, 0x00, 0x2a, + 0x23, 0x02, 0x00, 0x90, 0x63, 0xc0, 0x33, 0x91, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x40, 0x4c, 0x00, 0x94, 0xe0, 0x03, 0x13, 0xaa, + 0xf6, 0xfd, 0xff, 0x97, 0x60, 0x0e, 0x40, 0xf9, 0x02, 0x00, 0x80, 0x52, + 0x01, 0x00, 0x81, 0x52, 0x5a, 0x29, 0x00, 0x94, 0xc0, 0xfc, 0xff, 0x34, + 0xe2, 0x03, 0x00, 0x2a, 0x23, 0x02, 0x00, 0x90, 0x63, 0x20, 0x2c, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x33, 0x4c, 0x00, 0x94, + 0xe0, 0x03, 0x14, 0xaa, 0xa1, 0x28, 0x00, 0x94, 0x00, 0xfc, 0xff, 0x34, + 0xe2, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0x00, 0x08, 0x40, 0xf9, 0x60, 0x02, 0x00, 0xb4, + 0xf4, 0x02, 0x00, 0xf0, 0x94, 0x02, 0x17, 0x91, 0xe0, 0x03, 0x14, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0x9e, 0x28, 0x00, 0x94, 0x1f, 0x68, 0x08, 0x71, + 0x80, 0xff, 0xff, 0x54, 0xc0, 0x02, 0x00, 0x35, 0xe0, 0x03, 0x13, 0xaa, + 0xd5, 0xfd, 0xff, 0x97, 0x60, 0x0e, 0x40, 0xf9, 0x02, 0x00, 0x80, 0x52, + 0x01, 0x00, 0x82, 0x52, 0x39, 0x29, 0x00, 0x94, 0x80, 0x03, 0x00, 0x35, + 0xe0, 0x03, 0x14, 0xaa, 0x86, 0x28, 0x00, 0x94, 0x80, 0x00, 0x00, 0x35, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf3, 0x53, 0x41, 0xa9, 0xe2, 0x03, 0x00, 0x2a, 0xfd, 0x7b, 0xc2, 0xa8, + 0x23, 0x02, 0x00, 0x90, 0x63, 0x60, 0x34, 0x91, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x0a, 0x4c, 0x00, 0x14, 0xe2, 0x03, 0x00, 0x2a, + 0x23, 0x02, 0x00, 0x90, 0x63, 0xc0, 0x33, 0x91, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x04, 0x4c, 0x00, 0x94, 0xe0, 0x03, 0x13, 0xaa, + 0xba, 0xfd, 0xff, 0x97, 0x60, 0x0e, 0x40, 0xf9, 0x02, 0x00, 0x80, 0x52, + 0x01, 0x00, 0x82, 0x52, 0x1e, 0x29, 0x00, 0x94, 0xc0, 0xfc, 0xff, 0x34, + 0xe2, 0x03, 0x00, 0x2a, 0x23, 0x02, 0x00, 0x90, 0x63, 0x20, 0x2c, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0xf7, 0x4b, 0x00, 0x94, + 0xe0, 0x03, 0x14, 0xaa, 0x65, 0x28, 0x00, 0x94, 0x00, 0xfc, 0xff, 0x34, + 0xe2, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0x00, 0x08, 0x40, 0xf9, 0x60, 0x02, 0x00, 0xb4, + 0xf4, 0x02, 0x00, 0xf0, 0x94, 0x02, 0x17, 0x91, 0xe0, 0x03, 0x14, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0x62, 0x28, 0x00, 0x94, 0x1f, 0x68, 0x08, 0x71, + 0x80, 0xff, 0xff, 0x54, 0xc0, 0x02, 0x00, 0x35, 0xe0, 0x03, 0x13, 0xaa, + 0x99, 0xfd, 0xff, 0x97, 0x60, 0x0e, 0x40, 0xf9, 0x02, 0x00, 0x80, 0x52, + 0x01, 0x00, 0x84, 0x52, 0xfd, 0x28, 0x00, 0x94, 0x80, 0x03, 0x00, 0x35, + 0xe0, 0x03, 0x14, 0xaa, 0x4a, 0x28, 0x00, 0x94, 0x80, 0x00, 0x00, 0x35, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf3, 0x53, 0x41, 0xa9, 0xe2, 0x03, 0x00, 0x2a, 0xfd, 0x7b, 0xc2, 0xa8, + 0x23, 0x02, 0x00, 0x90, 0x63, 0x60, 0x34, 0x91, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xce, 0x4b, 0x00, 0x14, 0xe2, 0x03, 0x00, 0x2a, + 0x23, 0x02, 0x00, 0x90, 0x63, 0xc0, 0x33, 0x91, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xc8, 0x4b, 0x00, 0x94, 0xe0, 0x03, 0x13, 0xaa, + 0x7e, 0xfd, 0xff, 0x97, 0x60, 0x0e, 0x40, 0xf9, 0x02, 0x00, 0x80, 0x52, + 0x01, 0x00, 0x84, 0x52, 0xe2, 0x28, 0x00, 0x94, 0xc0, 0xfc, 0xff, 0x34, + 0xe2, 0x03, 0x00, 0x2a, 0x23, 0x02, 0x00, 0x90, 0x63, 0x20, 0x2c, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0xbb, 0x4b, 0x00, 0x94, + 0xe0, 0x03, 0x14, 0xaa, 0x29, 0x28, 0x00, 0x94, 0x00, 0xfc, 0xff, 0x34, + 0xe2, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0x00, 0x08, 0x40, 0xf9, 0x40, 0x03, 0x00, 0xb4, + 0xf4, 0x02, 0x00, 0xf0, 0x94, 0x02, 0x17, 0x91, 0xe0, 0x03, 0x14, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0x26, 0x28, 0x00, 0x94, 0x1f, 0x68, 0x08, 0x71, + 0x80, 0xff, 0xff, 0x54, 0xa0, 0x03, 0x00, 0x35, 0xe0, 0x03, 0x13, 0xaa, + 0x5d, 0xfd, 0xff, 0x97, 0x60, 0x0e, 0x40, 0xf9, 0x01, 0xa0, 0x80, 0x52, + 0xea, 0x28, 0x00, 0x94, 0x60, 0x04, 0x00, 0x35, 0x60, 0x0e, 0x40, 0xf9, + 0x02, 0x00, 0x80, 0x52, 0x01, 0x40, 0x80, 0x52, 0xbd, 0x28, 0x00, 0x94, + 0x20, 0x05, 0x00, 0x35, 0x61, 0x32, 0x40, 0xb9, 0xe0, 0x03, 0x14, 0xaa, + 0x21, 0x04, 0x00, 0x11, 0x61, 0x32, 0x00, 0xb9, 0x07, 0x28, 0x00, 0x94, + 0x80, 0x00, 0x00, 0x35, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x53, 0x41, 0xa9, 0xe2, 0x03, 0x00, 0x2a, + 0xfd, 0x7b, 0xc2, 0xa8, 0x23, 0x02, 0x00, 0x90, 0x63, 0x60, 0x34, 0x91, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x8b, 0x4b, 0x00, 0x14, + 0xe2, 0x03, 0x00, 0x2a, 0x23, 0x02, 0x00, 0x90, 0x63, 0xc0, 0x33, 0x91, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x85, 0x4b, 0x00, 0x94, + 0xe0, 0x03, 0x13, 0xaa, 0x3b, 0xfd, 0xff, 0x97, 0x60, 0x0e, 0x40, 0xf9, + 0x01, 0xa0, 0x80, 0x52, 0xc8, 0x28, 0x00, 0x94, 0xe0, 0xfb, 0xff, 0x34, + 0xe2, 0x03, 0x00, 0x2a, 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0x23, 0x02, 0x00, 0x90, 0x63, 0x00, 0x32, 0x91, 0x79, 0x4b, 0x00, 0x94, + 0x60, 0x0e, 0x40, 0xf9, 0x02, 0x00, 0x80, 0x52, 0x01, 0x40, 0x80, 0x52, + 0x95, 0x28, 0x00, 0x94, 0x20, 0xfb, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x23, 0x02, 0x00, 0x90, + 0x63, 0x20, 0x2c, 0x91, 0x6e, 0x4b, 0x00, 0x94, 0x61, 0x32, 0x40, 0xb9, + 0xe0, 0x03, 0x14, 0xaa, 0x21, 0x04, 0x00, 0x11, 0x61, 0x32, 0x00, 0xb9, + 0xd9, 0x27, 0x00, 0x94, 0x60, 0xfa, 0xff, 0x34, 0xd5, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, + 0x00, 0x08, 0x40, 0xf9, 0xff, 0x2f, 0x00, 0xb9, 0x20, 0x02, 0x00, 0xb4, + 0xf4, 0x02, 0x00, 0xf0, 0x94, 0x02, 0x17, 0x91, 0x1f, 0x20, 0x03, 0xd5, + 0xe0, 0x03, 0x14, 0xaa, 0x01, 0x00, 0x80, 0x12, 0xd4, 0x27, 0x00, 0x94, + 0x1f, 0x68, 0x08, 0x71, 0x80, 0xff, 0xff, 0x54, 0x80, 0x02, 0x00, 0x35, + 0x60, 0x32, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x51, 0x60, 0x32, 0x00, 0xb9, + 0x40, 0x03, 0x00, 0x34, 0xe0, 0x03, 0x14, 0xaa, 0xbf, 0x27, 0x00, 0x94, + 0x80, 0x00, 0x00, 0x35, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x23, 0x02, 0x00, 0x90, 0x63, 0x60, 0x34, 0x91, + 0x45, 0x4b, 0x00, 0x94, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, 0x23, 0x02, 0x00, 0x90, + 0x63, 0xc0, 0x33, 0x91, 0x00, 0x02, 0x80, 0x52, 0x41, 0x00, 0x80, 0x52, + 0x3c, 0x4b, 0x00, 0x94, 0x60, 0x32, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x51, + 0x60, 0x32, 0x00, 0xb9, 0x00, 0xfd, 0xff, 0x35, 0x60, 0x0e, 0x40, 0xf9, + 0xe1, 0xb3, 0x00, 0x91, 0x6d, 0x28, 0x00, 0x94, 0xc0, 0x01, 0x00, 0x35, + 0xe1, 0x2f, 0x40, 0xb9, 0x60, 0x0e, 0x40, 0xf9, 0x41, 0x02, 0x20, 0x37, + 0x01, 0x40, 0x80, 0x52, 0x77, 0x28, 0x00, 0x94, 0xc0, 0xfb, 0xff, 0x34, + 0xe2, 0x03, 0x00, 0x2a, 0x23, 0x02, 0x00, 0x90, 0x63, 0xa0, 0x35, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x28, 0x4b, 0x00, 0x94, + 0xd7, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0x23, 0x02, 0x00, 0x90, + 0x63, 0x80, 0x2b, 0x91, 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0x21, 0x4b, 0x00, 0x94, 0xed, 0xff, 0xff, 0x17, 0x02, 0x00, 0x80, 0x52, + 0x01, 0xa0, 0x80, 0x52, 0x3d, 0x28, 0x00, 0x94, 0x60, 0x00, 0x00, 0x35, + 0x60, 0x0e, 0x40, 0xf9, 0xea, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, + 0x23, 0x02, 0x00, 0x90, 0x63, 0x20, 0x2c, 0x91, 0x00, 0x01, 0x80, 0x52, + 0x01, 0x1c, 0x80, 0x52, 0x14, 0x4b, 0x00, 0x94, 0x60, 0x0e, 0x40, 0xf9, + 0xe2, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, + 0x00, 0x08, 0x40, 0xf9, 0xe0, 0x02, 0x00, 0xb4, 0xf4, 0x02, 0x00, 0xf0, + 0x94, 0x02, 0x17, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0x01, 0x00, 0x80, 0x12, + 0x82, 0x27, 0x00, 0x94, 0x1f, 0x68, 0x08, 0x71, 0x80, 0xff, 0xff, 0x54, + 0x40, 0x03, 0x00, 0x35, 0xe0, 0x03, 0x13, 0xaa, 0xb9, 0xfc, 0xff, 0x97, + 0x60, 0x0e, 0x40, 0xf9, 0x01, 0xa2, 0x80, 0x52, 0x46, 0x28, 0x00, 0x94, + 0x00, 0x04, 0x00, 0x35, 0x60, 0x0e, 0x40, 0xf9, 0x02, 0x00, 0x80, 0x52, + 0x01, 0x44, 0x80, 0x52, 0x19, 0x28, 0x00, 0x94, 0xc0, 0x04, 0x00, 0x35, + 0xe0, 0x03, 0x14, 0xaa, 0x66, 0x27, 0x00, 0x94, 0x80, 0x00, 0x00, 0x35, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf3, 0x53, 0x41, 0xa9, 0xe2, 0x03, 0x00, 0x2a, 0xfd, 0x7b, 0xc2, 0xa8, + 0x23, 0x02, 0x00, 0x90, 0x63, 0x60, 0x34, 0x91, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xea, 0x4a, 0x00, 0x14, 0xe2, 0x03, 0x00, 0x2a, + 0x23, 0x02, 0x00, 0x90, 0x63, 0xc0, 0x33, 0x91, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xe4, 0x4a, 0x00, 0x94, 0xe0, 0x03, 0x13, 0xaa, + 0x9a, 0xfc, 0xff, 0x97, 0x60, 0x0e, 0x40, 0xf9, 0x01, 0xa2, 0x80, 0x52, + 0x27, 0x28, 0x00, 0x94, 0x40, 0xfc, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x23, 0x02, 0x00, 0x90, + 0x63, 0x00, 0x32, 0x91, 0xd8, 0x4a, 0x00, 0x94, 0x60, 0x0e, 0x40, 0xf9, + 0x02, 0x00, 0x80, 0x52, 0x01, 0x44, 0x80, 0x52, 0xf4, 0x27, 0x00, 0x94, + 0x80, 0xfb, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, 0x23, 0x02, 0x00, 0x90, + 0x63, 0x20, 0x2c, 0x91, 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0xcd, 0x4a, 0x00, 0x94, 0xe0, 0x03, 0x14, 0xaa, 0x3b, 0x27, 0x00, 0x94, + 0xc0, 0xfa, 0xff, 0x34, 0xd8, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, + 0x00, 0x08, 0x40, 0xf9, 0xc0, 0x02, 0x00, 0xb4, 0xf4, 0x02, 0x00, 0xf0, + 0x94, 0x02, 0x17, 0x91, 0xff, 0x2f, 0x00, 0xb9, 0x1f, 0x20, 0x03, 0xd5, + 0xe0, 0x03, 0x14, 0xaa, 0x01, 0x00, 0x80, 0x12, 0x38, 0x27, 0x00, 0x94, + 0x1f, 0x68, 0x08, 0x71, 0x80, 0xff, 0xff, 0x54, 0x20, 0x04, 0x00, 0x35, + 0x60, 0x0e, 0x40, 0xf9, 0xe1, 0xb3, 0x00, 0x91, 0xee, 0x27, 0x00, 0x94, + 0x60, 0x01, 0x00, 0x35, 0xe0, 0x2f, 0x40, 0xb9, 0x60, 0x00, 0x20, 0x36, + 0x60, 0x32, 0x40, 0xb9, 0x80, 0x04, 0x00, 0x34, 0xe0, 0x03, 0x14, 0xaa, + 0x1f, 0x27, 0x00, 0x94, 0xa0, 0x01, 0x00, 0x35, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, + 0x23, 0x02, 0x00, 0x90, 0x63, 0x80, 0x2b, 0x91, 0x00, 0x01, 0x80, 0x52, + 0x01, 0x1c, 0x80, 0x52, 0xa5, 0x4a, 0x00, 0x94, 0xe0, 0x2f, 0x40, 0xb9, + 0x60, 0xfe, 0x27, 0x36, 0xf0, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x23, 0x02, 0x00, 0x90, + 0x63, 0x60, 0x34, 0x91, 0x9c, 0x4a, 0x00, 0x94, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x23, 0x02, 0x00, 0x90, + 0x63, 0xc0, 0x33, 0x91, 0x93, 0x4a, 0x00, 0x94, 0x60, 0x0e, 0x40, 0xf9, + 0xe1, 0xb3, 0x00, 0x91, 0xc8, 0x27, 0x00, 0x94, 0x60, 0xfb, 0xff, 0x34, + 0xe4, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x13, 0xaa, 0x44, 0xfc, 0xff, 0x97, + 0x60, 0x0e, 0x40, 0xf9, 0x02, 0x00, 0x80, 0x52, 0x01, 0x20, 0x80, 0x52, + 0xa8, 0x27, 0x00, 0x94, 0xe0, 0xfa, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, + 0x23, 0x02, 0x00, 0x90, 0x63, 0x20, 0x2c, 0x91, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0x81, 0x4a, 0x00, 0x94, 0xd0, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0x00, 0x08, 0x40, 0xf9, 0xe0, 0x03, 0x00, 0xb4, + 0xf4, 0x02, 0x00, 0xf0, 0x94, 0x02, 0x17, 0x91, 0xf5, 0x13, 0x00, 0xf9, + 0x1f, 0x20, 0x03, 0xd5, 0xe0, 0x03, 0x14, 0xaa, 0x01, 0x00, 0x80, 0x12, + 0xec, 0x26, 0x00, 0x94, 0x1f, 0x68, 0x08, 0x71, 0x80, 0xff, 0xff, 0x54, + 0x20, 0x04, 0x00, 0x35, 0x62, 0x32, 0x40, 0xb9, 0x03, 0x4c, 0x80, 0x52, + 0x60, 0x0e, 0x40, 0xf9, 0x5f, 0x00, 0x00, 0x71, 0x02, 0xa2, 0x80, 0x52, + 0x01, 0x0c, 0x80, 0x52, 0x15, 0x02, 0x80, 0x52, 0x21, 0x10, 0x83, 0x1a, + 0xb5, 0x12, 0x82, 0x1a, 0xab, 0x27, 0x00, 0x94, 0xa0, 0x03, 0x00, 0x35, + 0x60, 0x0e, 0x40, 0xf9, 0xe1, 0x03, 0x15, 0x2a, 0x02, 0x00, 0x80, 0x52, + 0x7e, 0x27, 0x00, 0x94, 0x60, 0x04, 0x00, 0x35, 0xe0, 0x03, 0x14, 0xaa, + 0xcb, 0x26, 0x00, 0x94, 0xa0, 0x00, 0x00, 0x35, 0xf5, 0x13, 0x40, 0xf9, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf3, 0x53, 0x41, 0xa9, 0xe2, 0x03, 0x00, 0x2a, 0xf5, 0x13, 0x40, 0xf9, + 0x03, 0x02, 0x00, 0xf0, 0x63, 0x60, 0x34, 0x91, 0x41, 0x00, 0x80, 0x52, + 0xfd, 0x7b, 0xc3, 0xa8, 0x00, 0x02, 0x80, 0x52, 0x4d, 0x4a, 0x00, 0x14, + 0xe2, 0x03, 0x00, 0x2a, 0x03, 0x02, 0x00, 0xf0, 0x63, 0xc0, 0x33, 0x91, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x47, 0x4a, 0x00, 0x94, + 0xda, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0x03, 0x02, 0x00, 0xf0, 0x63, 0x00, 0x32, 0x91, + 0x40, 0x4a, 0x00, 0x94, 0x60, 0x0e, 0x40, 0xf9, 0xe1, 0x03, 0x15, 0x2a, + 0x02, 0x00, 0x80, 0x52, 0x5c, 0x27, 0x00, 0x94, 0xe0, 0xfb, 0xff, 0x34, + 0xe2, 0x03, 0x00, 0x2a, 0x03, 0x02, 0x00, 0xf0, 0x63, 0x20, 0x2c, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x35, 0x4a, 0x00, 0x94, + 0xe0, 0x03, 0x14, 0xaa, 0xa3, 0x26, 0x00, 0x94, 0x20, 0xfb, 0xff, 0x34, + 0xdc, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x02, 0x00, 0xd0, 0x73, 0x02, 0x17, 0x91, + 0xf4, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x13, 0xaa, 0x01, 0x00, 0x80, 0x12, + 0xa4, 0x26, 0x00, 0x94, 0x1f, 0x68, 0x08, 0x71, 0x80, 0xff, 0xff, 0x54, + 0x80, 0x01, 0x00, 0x35, 0x80, 0x0e, 0x40, 0xf9, 0x02, 0x00, 0x80, 0x52, + 0x01, 0x08, 0x80, 0x52, 0x41, 0x27, 0x00, 0x94, 0x40, 0x02, 0x00, 0x35, + 0xe0, 0x03, 0x13, 0xaa, 0x8e, 0x26, 0x00, 0x94, 0x00, 0x03, 0x00, 0x35, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe2, 0x03, 0x00, 0x2a, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x03, 0x02, 0x00, 0xf0, 0x63, 0xc0, 0x33, 0x91, 0x14, 0x4a, 0x00, 0x94, + 0x80, 0x0e, 0x40, 0xf9, 0x02, 0x00, 0x80, 0x52, 0x01, 0x08, 0x80, 0x52, + 0x30, 0x27, 0x00, 0x94, 0x00, 0xfe, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, + 0x03, 0x02, 0x00, 0xf0, 0x63, 0x20, 0x2c, 0x91, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0x09, 0x4a, 0x00, 0x94, 0xe0, 0x03, 0x13, 0xaa, + 0x77, 0x26, 0x00, 0x94, 0x40, 0xfd, 0xff, 0x34, 0xf3, 0x53, 0x41, 0xa9, + 0xe2, 0x03, 0x00, 0x2a, 0xfd, 0x7b, 0xc2, 0xa8, 0x03, 0x02, 0x00, 0xf0, + 0x63, 0x60, 0x34, 0x91, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xfe, 0x49, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x03, 0x01, 0x2a, + 0x01, 0x08, 0x40, 0xf9, 0x41, 0x02, 0x00, 0xb4, 0xfd, 0x7b, 0xbe, 0xa9, + 0x02, 0x00, 0x80, 0x52, 0x81, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x0c, 0x40, 0xf9, 0xe3, 0x73, 0x00, 0x91, 0xff, 0x1f, 0x00, 0xb9, + 0x1e, 0x27, 0x00, 0x94, 0xe2, 0x03, 0x00, 0x2a, 0x00, 0x00, 0x80, 0x52, + 0x22, 0x01, 0x00, 0x35, 0xe2, 0x1f, 0x40, 0xb9, 0x61, 0x03, 0x9c, 0x52, + 0xfd, 0x7b, 0xc2, 0xa8, 0x5f, 0x00, 0x7e, 0xf2, 0x00, 0x10, 0x81, 0x1a, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x03, 0x02, 0x00, 0xf0, + 0x63, 0xa0, 0x32, 0x91, 0xe2, 0x49, 0x00, 0x94, 0xe2, 0x1f, 0x40, 0xb9, + 0x61, 0x03, 0x9c, 0x52, 0x80, 0x03, 0x9c, 0x52, 0xfd, 0x7b, 0xc2, 0xa8, + 0x5f, 0x00, 0x7e, 0xf2, 0x00, 0x10, 0x81, 0x1a, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x01, 0x08, 0x40, 0xf9, 0xff, 0x1f, 0x00, 0xb9, + 0x01, 0x01, 0x00, 0xb4, 0x00, 0x0c, 0x40, 0xf9, 0xe1, 0x73, 0x00, 0x91, + 0x09, 0x27, 0x00, 0x94, 0xe0, 0x00, 0x00, 0x35, 0xe0, 0x73, 0x40, 0x39, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x80, 0x52, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, + 0x03, 0x02, 0x00, 0xf0, 0x63, 0x80, 0x2b, 0x91, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0xc4, 0x49, 0x00, 0x94, 0xf4, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x40, 0xf9, + 0x1f, 0x00, 0x00, 0xf1, 0xe0, 0x07, 0x9f, 0x1a, 0xc0, 0x03, 0x5f, 0xd6, + 0x01, 0x28, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe2, 0x03, 0x00, 0x2a, 0x00, 0x00, 0x80, 0x52, + 0xa2, 0x00, 0x00, 0x35, 0x06, 0x00, 0x00, 0x14, 0x00, 0x04, 0x00, 0x11, + 0x1f, 0x80, 0x00, 0x71, 0x60, 0x00, 0x00, 0x54, 0x41, 0x24, 0xc0, 0x1a, + 0x81, 0xff, 0x07, 0x36, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x90, 0x01, 0x02, 0x00, 0xf0, + 0x42, 0x80, 0x21, 0x91, 0x21, 0x40, 0x36, 0x91, 0xe0, 0x02, 0x00, 0xd0, + 0x26, 0x00, 0x80, 0x52, 0x00, 0xa0, 0x28, 0x91, 0x45, 0x02, 0x80, 0x52, + 0x04, 0x00, 0x82, 0x52, 0x03, 0x00, 0x80, 0xd2, 0x36, 0x25, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x54, 0x00, 0x80, 0x52, 0xff, 0x1f, 0x00, 0xf9, + 0xc0, 0x04, 0x00, 0xb4, 0x14, 0x04, 0x40, 0xb9, 0xf3, 0x03, 0x00, 0xaa, + 0xf4, 0x04, 0x00, 0x35, 0xf5, 0x5b, 0x02, 0xa9, 0x15, 0x04, 0x40, 0xf9, + 0xa1, 0x02, 0x40, 0x79, 0x3f, 0x24, 0x00, 0x71, 0x60, 0x19, 0x00, 0x54, + 0xe8, 0x09, 0x00, 0x54, 0x3f, 0x0c, 0x00, 0x71, 0x40, 0x12, 0x00, 0x54, + 0xa9, 0x07, 0x00, 0x54, 0x3f, 0x1c, 0x00, 0x71, 0x60, 0x19, 0x00, 0x54, + 0x3f, 0x20, 0x00, 0x71, 0x41, 0x05, 0x00, 0x54, 0xa0, 0x22, 0x40, 0xb8, + 0xa2, 0x12, 0x40, 0x79, 0x01, 0x04, 0x00, 0x12, 0x3f, 0x04, 0x00, 0x71, + 0xa0, 0x13, 0x00, 0x54, 0x3f, 0x08, 0x00, 0x71, 0x00, 0x24, 0x00, 0x54, + 0xf6, 0x02, 0x00, 0xd0, 0xc0, 0x2a, 0x46, 0xb9, 0xd4, 0xa2, 0x18, 0x91, + 0x1f, 0x00, 0x00, 0x71, 0x42, 0x3c, 0x40, 0x92, 0xe3, 0x17, 0x9f, 0x1a, + 0x42, 0x10, 0x00, 0x91, 0xe2, 0x1f, 0x00, 0xf9, 0x1f, 0x20, 0x03, 0xd5, + 0xe1, 0x03, 0x14, 0xaa, 0xe0, 0x03, 0x13, 0xaa, 0x58, 0x53, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0xf5, 0x5b, 0x42, 0xa9, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x84, 0x00, 0x80, 0xd2, 0xe1, 0x02, 0x00, 0xd0, 0x20, 0x20, 0x9c, 0x52, + 0xe2, 0x20, 0x80, 0x52, 0xf4, 0x03, 0x00, 0x2a, 0x20, 0x28, 0x06, 0xb9, + 0x03, 0x02, 0x00, 0xf0, 0x63, 0xe0, 0x36, 0x91, 0xe0, 0x03, 0x04, 0x2a, + 0x21, 0x00, 0x80, 0x52, 0xe4, 0x1f, 0x00, 0xf9, 0x66, 0x49, 0x00, 0x94, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x3f, 0x10, 0x00, 0x71, 0xe1, 0x0f, 0x00, 0x54, + 0xa2, 0x2a, 0x40, 0x39, 0xf6, 0x02, 0x00, 0xd0, 0xd4, 0xa2, 0x18, 0x91, + 0xa0, 0x22, 0x40, 0xb8, 0xa1, 0x62, 0x40, 0xb8, 0xc6, 0x03, 0x00, 0x94, + 0x81, 0x00, 0x80, 0xd2, 0x1f, 0x00, 0x00, 0x71, 0xe2, 0x03, 0x01, 0xaa, + 0xe3, 0x17, 0x9f, 0x1a, 0xc0, 0x2a, 0x06, 0xb9, 0xe1, 0x1f, 0x00, 0xf9, + 0xd9, 0xff, 0xff, 0x17, 0x3f, 0x04, 0x00, 0x71, 0xc0, 0x0f, 0x00, 0x54, + 0x3f, 0x08, 0x00, 0x71, 0x81, 0x03, 0x00, 0x54, 0xa1, 0x0e, 0x40, 0x79, + 0xf6, 0x02, 0x00, 0xd0, 0xa3, 0x1a, 0x40, 0x79, 0xa4, 0x3a, 0x00, 0x91, + 0xa0, 0x22, 0x40, 0xb8, 0xa2, 0x0a, 0x40, 0xb9, 0x5c, 0x03, 0x00, 0x94, + 0xc0, 0x2a, 0x06, 0xb9, 0x20, 0x0a, 0x00, 0x35, 0xf5, 0x5b, 0x42, 0xa9, + 0xcf, 0xff, 0xff, 0x17, 0x3f, 0x44, 0x00, 0x71, 0xc0, 0x12, 0x00, 0x54, + 0x89, 0x04, 0x00, 0x54, 0x3f, 0x4c, 0x00, 0x71, 0x60, 0x13, 0x00, 0x54, + 0x3f, 0x50, 0x00, 0x71, 0xa1, 0x02, 0x00, 0x54, 0xf6, 0x02, 0x00, 0xd0, + 0xd4, 0xa2, 0x18, 0x91, 0x80, 0x12, 0x00, 0x91, 0x35, 0x0d, 0x00, 0x94, + 0xc0, 0x2a, 0x06, 0xb9, 0x20, 0x09, 0x00, 0x34, 0x03, 0x00, 0x80, 0x52, + 0xe2, 0x1f, 0x40, 0xf9, 0xba, 0xff, 0xff, 0x17, 0x41, 0x0a, 0x00, 0x35, + 0xf6, 0x02, 0x00, 0xd0, 0xd4, 0xa2, 0x18, 0x91, 0xa1, 0x22, 0x40, 0xb8, + 0x00, 0x01, 0x80, 0xd2, 0x23, 0x00, 0x80, 0x52, 0xe2, 0x03, 0x00, 0xaa, + 0xdf, 0x2a, 0x06, 0xb9, 0x81, 0x06, 0x00, 0xb9, 0xe0, 0x1f, 0x00, 0xf9, + 0xaf, 0xff, 0xff, 0x17, 0x3f, 0x48, 0x00, 0x71, 0xc1, 0x08, 0x00, 0x54, + 0xa1, 0x2a, 0x40, 0x39, 0xf6, 0x02, 0x00, 0xd0, 0xa0, 0x22, 0x40, 0xb8, + 0xa2, 0x62, 0x40, 0xb8, 0xe6, 0x03, 0x00, 0x94, 0xc0, 0x2a, 0x06, 0xb9, + 0x60, 0x03, 0x00, 0x34, 0xd4, 0xa2, 0x18, 0x91, 0xe8, 0xff, 0xff, 0x17, + 0x3f, 0x3c, 0x00, 0x71, 0x20, 0x10, 0x00, 0x54, 0x3f, 0x40, 0x00, 0x71, + 0x01, 0x01, 0x00, 0x54, 0xa0, 0x06, 0x40, 0x79, 0xf6, 0x02, 0x00, 0xd0, + 0xd4, 0xa2, 0x18, 0x91, 0xa2, 0x1a, 0x00, 0x91, 0x81, 0x00, 0x80, 0x52, + 0xa0, 0x04, 0x00, 0x94, 0xba, 0xff, 0xff, 0x17, 0x3f, 0x28, 0x00, 0x71, + 0x01, 0x06, 0x00, 0x54, 0xf6, 0x02, 0x00, 0xd0, 0xd4, 0xa2, 0x18, 0x91, + 0x80, 0x12, 0x00, 0x91, 0x3d, 0x04, 0x00, 0x94, 0x81, 0x04, 0x80, 0xd2, + 0x1f, 0x00, 0x00, 0x71, 0xe2, 0x03, 0x01, 0xaa, 0xe3, 0x17, 0x9f, 0x1a, + 0xc0, 0x2a, 0x06, 0xb9, 0xe1, 0x1f, 0x00, 0xf9, 0x8c, 0xff, 0xff, 0x17, + 0x80, 0x00, 0x80, 0xd2, 0xf4, 0x02, 0x00, 0xd0, 0x94, 0xa2, 0x18, 0x91, + 0xe2, 0x03, 0x00, 0xaa, 0x23, 0x00, 0x80, 0x52, 0xe0, 0x1f, 0x00, 0xf9, + 0x85, 0xff, 0xff, 0x17, 0xa1, 0x0e, 0x40, 0x79, 0xf6, 0x02, 0x00, 0xd0, + 0xa3, 0x1a, 0x40, 0x79, 0xa4, 0x3a, 0x00, 0x91, 0xa0, 0x22, 0x40, 0xb8, + 0xa2, 0x0a, 0x40, 0xb9, 0x44, 0x03, 0x00, 0x94, 0xc0, 0x2a, 0x06, 0xb9, + 0x20, 0xf6, 0xff, 0x34, 0xc0, 0x00, 0x80, 0xd2, 0xf4, 0x02, 0x00, 0xd0, + 0x94, 0xa2, 0x18, 0x91, 0xe2, 0x03, 0x00, 0xaa, 0x03, 0x00, 0x80, 0x52, + 0xe0, 0x1f, 0x00, 0xf9, 0x75, 0xff, 0xff, 0x17, 0x40, 0x01, 0x80, 0xd2, + 0x23, 0x00, 0x80, 0x52, 0xe2, 0x03, 0x00, 0xaa, 0xe0, 0x1f, 0x00, 0xf9, + 0x70, 0xff, 0xff, 0x17, 0xa1, 0x0e, 0x40, 0x79, 0xf6, 0x02, 0x00, 0xd0, + 0xd4, 0xa2, 0x18, 0x91, 0x83, 0x12, 0x00, 0x91, 0xe1, 0x04, 0x00, 0x94, + 0xc0, 0x2a, 0x06, 0xb9, 0xa2, 0x12, 0x40, 0x79, 0x62, 0xff, 0xff, 0x17, + 0x84, 0x00, 0x80, 0xd2, 0xe0, 0x02, 0x00, 0xd0, 0x21, 0x20, 0x9c, 0x52, + 0x03, 0x02, 0x00, 0xf0, 0x63, 0xa0, 0x36, 0x91, 0x01, 0x28, 0x06, 0xb9, + 0xe2, 0xdf, 0x83, 0x12, 0xe0, 0x03, 0x04, 0x2a, 0x21, 0x00, 0x80, 0x52, + 0x14, 0x20, 0x9c, 0x52, 0xe4, 0x1f, 0x00, 0xf9, 0xd6, 0x48, 0x00, 0x94, + 0xf5, 0x5b, 0x42, 0xa9, 0x5f, 0xff, 0xff, 0x17, 0xa0, 0x22, 0x40, 0xb8, + 0x01, 0x04, 0x00, 0x12, 0x3f, 0x04, 0x00, 0x71, 0x00, 0x0b, 0x00, 0x54, + 0x3f, 0x08, 0x00, 0x71, 0x80, 0x0b, 0x00, 0x54, 0xf4, 0x02, 0x00, 0xd0, + 0x94, 0xa2, 0x18, 0x91, 0x02, 0x00, 0x80, 0xd2, 0x03, 0x00, 0x80, 0x52, + 0x4f, 0xff, 0xff, 0x17, 0xf6, 0x02, 0x00, 0xd0, 0xd4, 0xa2, 0x18, 0x91, + 0x80, 0x12, 0x00, 0x91, 0xb9, 0x03, 0x00, 0x94, 0x81, 0x14, 0x80, 0xd2, + 0xb8, 0xff, 0xff, 0x17, 0x81, 0x7f, 0x80, 0xd2, 0xc0, 0x05, 0x80, 0x12, + 0xe1, 0x1f, 0x00, 0xf9, 0xf6, 0x02, 0x00, 0xd0, 0xd4, 0xa2, 0x18, 0x91, + 0x81, 0x48, 0x00, 0x94, 0xa4, 0x22, 0x40, 0xb8, 0x82, 0x12, 0x00, 0x91, + 0xa0, 0x62, 0x40, 0xb8, 0xe3, 0xe3, 0x00, 0x91, 0xa1, 0xa2, 0x40, 0xb8, + 0x67, 0x03, 0x00, 0x94, 0xc0, 0x2a, 0x06, 0xb9, 0xe0, 0xef, 0xff, 0x35, + 0xe1, 0x1f, 0x40, 0xf9, 0xa0, 0x05, 0x80, 0x12, 0x21, 0x10, 0x00, 0x91, + 0xe1, 0x1f, 0x00, 0xf9, 0x74, 0x48, 0x00, 0x94, 0x23, 0x00, 0x80, 0x52, + 0xe2, 0x1f, 0x40, 0xf9, 0x33, 0xff, 0xff, 0x17, 0xa0, 0x06, 0x40, 0x79, + 0xf6, 0x02, 0x00, 0xd0, 0xd4, 0xa2, 0x18, 0x91, 0x81, 0x00, 0x80, 0x52, + 0x82, 0x12, 0x00, 0x91, 0x6b, 0x04, 0x00, 0x94, 0x01, 0x01, 0x80, 0xd2, + 0x4d, 0xff, 0xff, 0x17, 0xf6, 0x02, 0x00, 0xd0, 0xa0, 0x0a, 0x00, 0x91, + 0x56, 0x0c, 0x00, 0x94, 0xc0, 0x2a, 0x06, 0xb9, 0x60, 0xf3, 0xff, 0x34, + 0xd4, 0xa2, 0x18, 0x91, 0x03, 0x00, 0x80, 0x52, 0xe2, 0x1f, 0x40, 0xf9, + 0x22, 0xff, 0xff, 0x17, 0xf6, 0x02, 0x00, 0xd0, 0xa0, 0x62, 0x40, 0xb8, + 0xc1, 0x7f, 0x80, 0xd2, 0xe1, 0x1f, 0x00, 0xf9, 0xdf, 0x52, 0x0c, 0x79, + 0x01, 0xc0, 0x02, 0x51, 0x3f, 0x3c, 0x00, 0x71, 0x69, 0x01, 0x00, 0x54, + 0xa1, 0x0a, 0x40, 0x39, 0x1f, 0xc0, 0x03, 0x71, 0x01, 0x02, 0x00, 0x35, + 0xa0, 0x06, 0x00, 0x54, 0xf4, 0x02, 0x00, 0xd0, 0x94, 0xa2, 0x18, 0x91, + 0x02, 0x80, 0x80, 0xd2, 0x23, 0x00, 0x80, 0x52, 0xe2, 0x1f, 0x00, 0xf9, + 0x10, 0xff, 0xff, 0x17, 0x20, 0x00, 0x80, 0x52, 0xd4, 0xa2, 0x18, 0x91, + 0xc0, 0x52, 0x0c, 0x79, 0x03, 0x00, 0x80, 0x52, 0x80, 0x01, 0x80, 0xd2, + 0xe2, 0x03, 0x00, 0xaa, 0xe0, 0x1f, 0x00, 0xf9, 0x08, 0xff, 0xff, 0x17, + 0x41, 0xfe, 0xff, 0x54, 0xd4, 0xa2, 0x18, 0x91, 0xe0, 0xdd, 0x97, 0xd2, + 0xa0, 0xd5, 0xbb, 0xf2, 0x42, 0x01, 0x80, 0xd2, 0xe0, 0xdd, 0xd7, 0xf2, + 0xa0, 0x55, 0xf7, 0xf2, 0x80, 0x22, 0x00, 0xf8, 0xed, 0xff, 0xff, 0x17, + 0xa1, 0x0e, 0x40, 0x79, 0xa3, 0x2a, 0x00, 0x91, 0xa2, 0x12, 0x40, 0x79, + 0x5d, 0x02, 0x00, 0x94, 0xf5, 0x5b, 0x42, 0xa9, 0xfe, 0xfe, 0xff, 0x17, + 0x42, 0x12, 0x00, 0x94, 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x04, 0x00, 0x71, + 0x80, 0x03, 0x00, 0x54, 0xf6, 0x02, 0x00, 0xd0, 0x00, 0x28, 0x9c, 0x52, + 0x03, 0x00, 0x80, 0x52, 0xc0, 0x2a, 0x06, 0xb9, 0x80, 0x00, 0x80, 0xd2, + 0xf4, 0x02, 0x00, 0xd0, 0x94, 0xa2, 0x18, 0x91, 0xe2, 0x03, 0x00, 0xaa, + 0xe0, 0x1f, 0x00, 0xf9, 0xeb, 0xfe, 0xff, 0x17, 0xa0, 0x0e, 0x40, 0x79, + 0xf6, 0x02, 0x00, 0xd0, 0xd4, 0xa2, 0x18, 0x91, 0xe1, 0x03, 0x02, 0x2a, + 0x82, 0x12, 0x00, 0x91, 0x23, 0x04, 0x00, 0x94, 0xc0, 0x2a, 0x06, 0xb9, + 0xa2, 0x12, 0x40, 0x79, 0xdc, 0xfe, 0xff, 0x17, 0xd4, 0xa2, 0x18, 0x91, + 0xe0, 0xdd, 0x97, 0xd2, 0xa0, 0x55, 0xb7, 0xf2, 0x42, 0x01, 0x80, 0xd2, + 0xe0, 0xdd, 0xd7, 0xf2, 0xa0, 0xd5, 0xfb, 0xf2, 0x80, 0x22, 0x00, 0xf8, + 0xc8, 0xff, 0xff, 0x17, 0xa0, 0x0e, 0x40, 0x79, 0xf6, 0x02, 0x00, 0xd0, + 0xa1, 0x12, 0x40, 0x79, 0xa2, 0x2a, 0x00, 0x91, 0xdb, 0x03, 0x00, 0x94, + 0x1f, 0x00, 0x00, 0x71, 0xe3, 0x17, 0x9f, 0x1a, 0xc0, 0x2a, 0x06, 0xb9, + 0xe1, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf5, 0x5b, 0x02, 0xa9, 0xf3, 0x02, 0x00, 0xd0, 0x75, 0xc2, 0x2e, 0x91, + 0xe0, 0x03, 0x15, 0xaa, 0xf7, 0x63, 0x03, 0xa9, 0xf9, 0x23, 0x00, 0xf9, + 0x9f, 0x22, 0x00, 0x94, 0x20, 0x07, 0x00, 0x35, 0x60, 0xda, 0x45, 0xf9, + 0x21, 0x00, 0x80, 0x52, 0xbf, 0x22, 0x00, 0x94, 0xe2, 0x03, 0x00, 0x2a, + 0x60, 0x07, 0x00, 0x35, 0xb4, 0x10, 0x00, 0xf0, 0x94, 0x42, 0x2d, 0x91, + 0x16, 0x02, 0x00, 0xf0, 0xd6, 0x62, 0x38, 0x91, 0x17, 0x02, 0x00, 0xf0, + 0xf7, 0x02, 0x39, 0x91, 0x19, 0x02, 0x00, 0xf0, 0x39, 0x83, 0x39, 0x91, + 0x18, 0x02, 0x00, 0xf0, 0x18, 0x23, 0x3a, 0x91, 0xa0, 0x02, 0x40, 0xf9, + 0xe1, 0x03, 0x14, 0xaa, 0x02, 0x00, 0x80, 0x12, 0xe7, 0x22, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x14, 0xaa, 0xf3, 0x01, 0x00, 0x35, + 0x87, 0xfe, 0xff, 0x97, 0x00, 0xff, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, + 0xe3, 0x03, 0x16, 0xaa, 0x01, 0x1c, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, + 0x21, 0x48, 0x00, 0x94, 0xa0, 0x02, 0x40, 0xf9, 0xe1, 0x03, 0x14, 0xaa, + 0x02, 0x00, 0x80, 0x12, 0xd9, 0x22, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x14, 0xaa, 0x73, 0xfe, 0xff, 0x34, 0xe4, 0x03, 0x13, 0x2a, + 0xe3, 0x03, 0x17, 0xaa, 0x02, 0x00, 0x80, 0x52, 0x21, 0x00, 0x80, 0x52, + 0x40, 0x00, 0x80, 0x52, 0x14, 0x48, 0x00, 0x94, 0x7f, 0x1a, 0x1c, 0x71, + 0xe0, 0x00, 0x00, 0x54, 0xe2, 0x03, 0x13, 0x2a, 0xe3, 0x03, 0x18, 0xaa, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x0d, 0x48, 0x00, 0x94, + 0xde, 0xff, 0xff, 0x17, 0xe3, 0x03, 0x19, 0xaa, 0x02, 0x00, 0x80, 0x52, + 0x01, 0x1c, 0x80, 0x52, 0x40, 0x00, 0x80, 0x52, 0x07, 0x48, 0x00, 0x94, + 0xd8, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0x03, 0x02, 0x00, 0xf0, + 0x63, 0x40, 0x37, 0x91, 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x00, 0x48, 0x00, 0x94, 0xc2, 0xff, 0xff, 0x17, 0x03, 0x02, 0x00, 0xf0, + 0x63, 0xc0, 0x37, 0x91, 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xfa, 0x47, 0x00, 0x94, 0xc1, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xba, 0xa9, + 0x02, 0x0a, 0x80, 0xd2, 0x23, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0x04, 0x04, 0x40, 0xf9, 0xf3, 0x53, 0x01, 0xa9, 0x53, 0x02, 0x00, 0x90, + 0x61, 0x42, 0x18, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0x93, 0x24, 0x40, 0xb9, + 0xf7, 0x63, 0x03, 0xa9, 0x17, 0x03, 0x00, 0xb0, 0xf5, 0x62, 0x1b, 0x91, + 0x73, 0xc2, 0x02, 0x51, 0x00, 0x1c, 0x80, 0x52, 0xff, 0x8f, 0x09, 0x29, + 0xa0, 0x06, 0x00, 0xb9, 0x73, 0x06, 0x02, 0x9b, 0x76, 0x1a, 0x40, 0xf9, + 0xb6, 0x03, 0x00, 0xb4, 0xa1, 0x06, 0x40, 0xf9, 0x14, 0x03, 0x00, 0xb0, + 0x94, 0xc2, 0x16, 0x91, 0xb8, 0x22, 0x40, 0x79, 0xe0, 0x03, 0x14, 0xaa, + 0x02, 0x3f, 0x40, 0x92, 0x2e, 0x08, 0x01, 0x94, 0xe1, 0xda, 0x46, 0xb9, + 0xe4, 0x33, 0x01, 0x91, 0xa0, 0x16, 0x40, 0xb9, 0xe3, 0x03, 0x18, 0x2a, + 0x66, 0x26, 0x40, 0xf9, 0xe2, 0x03, 0x14, 0xaa, 0x05, 0x20, 0x80, 0x52, + 0xc0, 0x02, 0x3f, 0xd6, 0x1f, 0x00, 0x00, 0x71, 0xe2, 0x4f, 0x40, 0xb9, + 0x60, 0x00, 0x80, 0x52, 0xe1, 0x03, 0x14, 0xaa, 0xe3, 0x17, 0x9f, 0x1a, + 0xe0, 0x57, 0x00, 0xb9, 0xe0, 0x43, 0x01, 0x91, 0xae, 0x51, 0x00, 0x94, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x00, 0x80, 0x52, + 0x14, 0x03, 0x00, 0xb0, 0x94, 0xc2, 0x16, 0x91, 0x02, 0x00, 0x80, 0xd2, + 0xe1, 0x03, 0x14, 0xaa, 0xe0, 0x57, 0x00, 0xb9, 0xe0, 0x43, 0x01, 0x91, + 0xa1, 0x51, 0x00, 0x94, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xb9, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x03, 0x00, 0xaa, 0x80, 0x05, 0x80, 0x12, 0xf5, 0x5b, 0x02, 0xa9, + 0x81, 0x06, 0x40, 0xf9, 0xf7, 0x63, 0x03, 0xa9, 0x17, 0x03, 0x00, 0xb0, + 0xf6, 0x02, 0x1b, 0x91, 0xff, 0x5f, 0x00, 0xb9, 0x33, 0x24, 0x40, 0xb9, + 0x38, 0x00, 0x80, 0x52, 0xf9, 0x23, 0x00, 0xf9, 0x6e, 0x47, 0x00, 0x94, + 0x75, 0xc2, 0x02, 0x51, 0x41, 0x02, 0x00, 0x90, 0x21, 0x40, 0x18, 0x91, + 0x00, 0x0a, 0x80, 0xd2, 0xf3, 0x03, 0x15, 0xaa, 0x02, 0x1c, 0x80, 0x52, + 0xc2, 0x06, 0x00, 0xb9, 0xb5, 0x06, 0x00, 0x9b, 0xf8, 0x63, 0x00, 0xb9, + 0xb9, 0x16, 0x40, 0xf9, 0x19, 0x06, 0x00, 0xb4, 0x7f, 0x12, 0x00, 0x71, + 0x09, 0x02, 0x00, 0x54, 0xf3, 0x02, 0x00, 0xd0, 0x73, 0xe2, 0x2e, 0x91, + 0x40, 0x00, 0x80, 0x52, 0x03, 0x00, 0x80, 0x52, 0xe0, 0x67, 0x00, 0xb9, + 0xe2, 0x5f, 0x40, 0xb9, 0xe1, 0x03, 0x13, 0xaa, 0xe0, 0x83, 0x01, 0x91, + 0x74, 0x51, 0x00, 0x94, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc7, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x80, 0x06, 0x40, 0xf9, 0x14, 0x20, 0x40, 0xb9, + 0x4b, 0x16, 0x00, 0x94, 0x7f, 0x12, 0x00, 0x71, 0xa0, 0xfd, 0xff, 0x54, + 0x9f, 0xfe, 0x03, 0x71, 0x18, 0x23, 0xd4, 0x1a, 0x00, 0x03, 0x00, 0x0a, + 0x04, 0x18, 0x40, 0x7a, 0x00, 0xfd, 0xff, 0x54, 0xc1, 0x06, 0x40, 0xf9, + 0xf3, 0x02, 0x00, 0xd0, 0x73, 0xe2, 0x2e, 0x91, 0xd4, 0x22, 0x40, 0x79, + 0xe0, 0x03, 0x13, 0xaa, 0x82, 0x3e, 0x40, 0x92, 0xcd, 0x07, 0x01, 0x94, + 0xe1, 0xc2, 0x46, 0xb9, 0xe3, 0x03, 0x14, 0x2a, 0xa6, 0x26, 0x40, 0xf9, + 0xe0, 0x03, 0x18, 0x2a, 0xe2, 0x03, 0x13, 0xaa, 0xe4, 0x73, 0x01, 0x91, + 0x05, 0x3f, 0x85, 0x52, 0x20, 0x03, 0x3f, 0xd6, 0x41, 0x00, 0x80, 0x52, + 0xe1, 0x67, 0x00, 0xb9, 0xe0, 0x00, 0x00, 0x34, 0x03, 0x00, 0x80, 0x52, + 0xd9, 0xff, 0xff, 0x17, 0xf3, 0x02, 0x00, 0xd0, 0x73, 0xe2, 0x2e, 0x91, + 0x40, 0x00, 0x80, 0x52, 0xe0, 0x67, 0x00, 0xb9, 0x60, 0x05, 0x80, 0x12, + 0x2e, 0x47, 0x00, 0x94, 0x23, 0x00, 0x80, 0x52, 0xd1, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbc, 0xa9, 0x02, 0x0a, 0x80, 0xd2, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0xaa, 0x00, 0x04, 0x40, 0xf9, + 0xf5, 0x5b, 0x02, 0xa9, 0x55, 0x02, 0x00, 0x90, 0xa1, 0x42, 0x18, 0x91, + 0x13, 0x24, 0x40, 0xb9, 0x75, 0xc2, 0x02, 0x51, 0xf3, 0x03, 0x15, 0xaa, + 0xb5, 0x06, 0x02, 0x9b, 0xb6, 0x06, 0x40, 0xf9, 0xd6, 0x01, 0x00, 0xb4, + 0x7f, 0x12, 0x00, 0x71, 0x29, 0x02, 0x00, 0x54, 0xd3, 0x02, 0x9c, 0x52, + 0xe0, 0x03, 0x14, 0xaa, 0x41, 0xfc, 0xff, 0x97, 0xe0, 0x03, 0x14, 0xaa, + 0x1f, 0xfd, 0xff, 0x97, 0x03, 0x02, 0x00, 0xf0, 0x63, 0xa0, 0x3a, 0x91, + 0xe2, 0x03, 0x13, 0x2a, 0x01, 0x1c, 0x80, 0x52, 0x40, 0x00, 0x80, 0x52, + 0x49, 0x47, 0x00, 0x94, 0xf3, 0x53, 0x41, 0xa9, 0x00, 0x00, 0x80, 0x52, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xe4, 0x22, 0x00, 0x14, + 0xf7, 0x1b, 0x00, 0xf9, 0x17, 0x20, 0x40, 0xb9, 0x01, 0x16, 0x00, 0x94, + 0x7f, 0x12, 0x00, 0x71, 0xe1, 0x03, 0x00, 0x2a, 0xe0, 0x00, 0x00, 0x54, + 0x20, 0x00, 0x80, 0x52, 0xff, 0xfe, 0x03, 0x71, 0x00, 0x20, 0xd7, 0x1a, + 0x01, 0x00, 0x01, 0x0a, 0x24, 0x18, 0x40, 0x7a, 0x61, 0x00, 0x00, 0x54, + 0xf7, 0x1b, 0x40, 0xf9, 0xe3, 0xff, 0xff, 0x17, 0xa1, 0x26, 0x40, 0xf9, + 0xc0, 0x02, 0x3f, 0xd6, 0x1f, 0x78, 0x40, 0xf2, 0xe1, 0x00, 0x00, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0x00, 0x00, 0x80, 0x52, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xcc, 0x22, 0x00, 0x14, + 0x13, 0x3c, 0x00, 0x12, 0xf7, 0x1b, 0x40, 0xf9, 0xd7, 0xff, 0xff, 0x17, + 0xfd, 0x7b, 0xbc, 0xa9, 0x03, 0x0a, 0x80, 0xd2, 0x42, 0x02, 0x00, 0x90, + 0x42, 0x40, 0x18, 0x91, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x03, 0x00, 0xaa, 0x00, 0x04, 0x40, 0xf9, 0xf5, 0x5b, 0x02, 0xa9, + 0x15, 0x4c, 0x44, 0x29, 0xf7, 0x1b, 0x00, 0xf9, 0x61, 0xc2, 0x02, 0x51, + 0xf3, 0x03, 0x01, 0xaa, 0x21, 0x7c, 0x03, 0x9b, 0x57, 0x00, 0x01, 0x8b, + 0x56, 0x68, 0x61, 0xf8, 0xd6, 0x02, 0x00, 0xb4, 0x7f, 0x12, 0x00, 0x71, + 0xc9, 0x00, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xd0, 0x15, 0x00, 0x94, 0xe1, 0x03, 0x00, 0x2a, 0x7f, 0x12, 0x00, 0x71, + 0x00, 0xff, 0xff, 0x54, 0x20, 0x00, 0x80, 0x52, 0xbf, 0xfe, 0x03, 0x71, + 0x00, 0x20, 0xd5, 0x1a, 0x01, 0x00, 0x01, 0x0a, 0x24, 0x18, 0x40, 0x7a, + 0x40, 0xfe, 0xff, 0x54, 0xe1, 0x26, 0x40, 0xf9, 0xc0, 0x02, 0x3f, 0xd6, + 0x80, 0x06, 0x40, 0xf9, 0x15, 0x20, 0x40, 0xb9, 0x01, 0x03, 0x00, 0xb0, + 0xb3, 0x0e, 0x13, 0x0b, 0x20, 0x00, 0x80, 0x52, 0x22, 0xf0, 0x46, 0xb9, + 0x13, 0x20, 0xd3, 0x1a, 0xf5, 0x5b, 0x42, 0xa9, 0x53, 0x00, 0x33, 0x0a, + 0x33, 0xf0, 0x06, 0xb9, 0xf3, 0x53, 0x41, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb8, 0xa9, 0x01, 0x1c, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x04, 0x40, 0xf9, 0xf3, 0x53, 0x01, 0xa9, + 0x14, 0x00, 0x80, 0xd2, 0xf7, 0x63, 0x03, 0xa9, 0x17, 0x38, 0x80, 0x52, + 0x13, 0x24, 0x40, 0xb9, 0x00, 0x20, 0x40, 0xb9, 0x18, 0x03, 0x00, 0xb0, + 0x73, 0xc2, 0x02, 0x51, 0xf5, 0x5b, 0x02, 0xa9, 0x36, 0x00, 0x80, 0x52, + 0xf9, 0x6b, 0x04, 0xa9, 0xf9, 0x03, 0x16, 0x2a, 0x77, 0x7e, 0xb7, 0x9b, + 0xfa, 0x02, 0x00, 0xb0, 0x5a, 0x23, 0x1b, 0x91, 0xf6, 0x73, 0x00, 0xb9, + 0xd6, 0x22, 0xc0, 0x1a, 0xf6, 0x03, 0x36, 0x2a, 0xfa, 0x02, 0x1a, 0x8b, + 0x01, 0xb3, 0x06, 0xb9, 0xfb, 0x2b, 0x00, 0xf9, 0xfb, 0x03, 0x16, 0x2a, + 0x04, 0x00, 0x00, 0x14, 0x94, 0x06, 0x00, 0x91, 0x9f, 0x22, 0x00, 0xf1, + 0x20, 0x02, 0x00, 0x54, 0x7f, 0x12, 0x00, 0x71, 0x88, 0xff, 0xff, 0x54, + 0x94, 0x15, 0x00, 0x94, 0x7f, 0x12, 0x00, 0x71, 0x20, 0xff, 0xff, 0x54, + 0x21, 0x23, 0xd4, 0x1a, 0x3f, 0x00, 0x00, 0x6a, 0xc0, 0xfe, 0xff, 0x54, + 0x75, 0x27, 0xd4, 0x9a, 0x95, 0xfe, 0x07, 0x36, 0x00, 0x07, 0x80, 0xd2, + 0x80, 0x6a, 0x00, 0x9b, 0x94, 0x06, 0x00, 0x91, 0x15, 0xfb, 0xff, 0x97, + 0x9f, 0x22, 0x00, 0xf1, 0x21, 0xfe, 0xff, 0x54, 0xfa, 0x02, 0x00, 0xb0, + 0x5a, 0x23, 0x1b, 0x91, 0xfa, 0x02, 0x1a, 0x8b, 0xfb, 0x03, 0x16, 0x2a, + 0x14, 0x00, 0x80, 0xd2, 0x39, 0x00, 0x80, 0x52, 0x04, 0x00, 0x00, 0x14, + 0x94, 0x06, 0x00, 0x91, 0x9f, 0x22, 0x00, 0xf1, 0x60, 0x02, 0x00, 0x54, + 0x7f, 0x12, 0x00, 0x71, 0x88, 0xff, 0xff, 0x54, 0x7a, 0x15, 0x00, 0x94, + 0x7f, 0x12, 0x00, 0x71, 0x20, 0xff, 0xff, 0x54, 0x21, 0x23, 0xd4, 0x1a, + 0x3f, 0x00, 0x00, 0x6a, 0xc0, 0xfe, 0xff, 0x54, 0x75, 0x27, 0xd4, 0x9a, + 0x95, 0xfe, 0x07, 0x36, 0x00, 0x07, 0x80, 0xd2, 0x01, 0x00, 0x80, 0x12, + 0x80, 0x6a, 0x00, 0x9b, 0x94, 0x06, 0x00, 0x91, 0xb2, 0xfc, 0xff, 0x97, + 0x9f, 0x22, 0x00, 0xf1, 0x01, 0xfe, 0xff, 0x54, 0x1f, 0x20, 0x03, 0xd5, + 0x40, 0x02, 0x00, 0x90, 0x01, 0x40, 0x18, 0x91, 0xe0, 0x03, 0x13, 0x2a, + 0x02, 0x0a, 0x80, 0xd2, 0x00, 0x04, 0x02, 0x9b, 0x04, 0x08, 0x40, 0xf9, + 0x64, 0x06, 0x00, 0xb4, 0x18, 0xc3, 0x1a, 0x91, 0x03, 0x24, 0x40, 0xf9, + 0x01, 0x0f, 0x40, 0x79, 0x00, 0x0b, 0x40, 0x79, 0x02, 0x07, 0x40, 0xf9, + 0x80, 0x00, 0x3f, 0xd6, 0x1f, 0x00, 0x00, 0x71, 0xf8, 0x03, 0x00, 0x2a, + 0xf9, 0x17, 0x9f, 0x1a, 0xfa, 0x02, 0x00, 0xb0, 0x5a, 0x23, 0x1b, 0x91, + 0xfa, 0x02, 0x1a, 0x8b, 0xf6, 0x03, 0x16, 0x2a, 0x14, 0x00, 0x80, 0xd2, + 0x37, 0x00, 0x80, 0x52, 0x04, 0x00, 0x00, 0x14, 0x94, 0x06, 0x00, 0x91, + 0x9f, 0x22, 0x00, 0xf1, 0x20, 0x02, 0x00, 0x54, 0x7f, 0x12, 0x00, 0x71, + 0x88, 0xff, 0xff, 0x54, 0x4e, 0x15, 0x00, 0x94, 0x7f, 0x12, 0x00, 0x71, + 0x20, 0xff, 0xff, 0x54, 0xe1, 0x22, 0xd4, 0x1a, 0x3f, 0x00, 0x00, 0x6a, + 0xc0, 0xfe, 0xff, 0x54, 0xd5, 0x26, 0xd4, 0x9a, 0x95, 0xfe, 0x07, 0x36, + 0x00, 0x07, 0x80, 0xd2, 0x80, 0x6a, 0x00, 0x9b, 0x94, 0x06, 0x00, 0x91, + 0x1f, 0xfb, 0xff, 0x97, 0x9f, 0x22, 0x00, 0xf1, 0x21, 0xfe, 0xff, 0x54, + 0x24, 0x00, 0x80, 0x52, 0xe3, 0x03, 0x19, 0x2a, 0xe1, 0xa3, 0x01, 0x91, + 0xe0, 0xc3, 0x01, 0x91, 0x82, 0x00, 0x80, 0xd2, 0xf8, 0x6b, 0x00, 0xb9, + 0xe4, 0x77, 0x00, 0xb9, 0x59, 0x50, 0x00, 0x94, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x2b, 0x40, 0xf9, 0xfd, 0x7b, 0xc8, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x19, 0x00, 0x80, 0x52, 0x98, 0x02, 0x9c, 0x52, 0xd5, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb8, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x53, 0x02, 0x00, 0x90, + 0x73, 0x42, 0x18, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x02, 0x00, 0xb0, + 0xb5, 0x22, 0x1b, 0x91, 0xf6, 0x02, 0x00, 0xb0, 0xd6, 0xe2, 0x1a, 0x91, + 0xf9, 0x6b, 0x04, 0xa9, 0x5a, 0x02, 0x00, 0x90, 0x40, 0x43, 0x1d, 0x91, + 0x19, 0x00, 0x80, 0x52, 0xf7, 0x63, 0x03, 0xa9, 0x18, 0x00, 0x80, 0xd2, + 0x17, 0x00, 0x80, 0xd2, 0xfb, 0x73, 0x05, 0xa9, 0xe0, 0x37, 0x00, 0xf9, + 0x1c, 0x02, 0x00, 0xd0, 0x80, 0x83, 0x3b, 0x91, 0xe0, 0x3f, 0x00, 0xf9, + 0x16, 0x15, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, 0xe0, 0x37, 0x40, 0xf9, + 0xfc, 0x03, 0x15, 0xaa, 0x1a, 0x00, 0x80, 0xd2, 0x1b, 0x03, 0x00, 0x8b, + 0x10, 0x15, 0x00, 0x94, 0x27, 0x00, 0x80, 0x52, 0xe1, 0x20, 0xda, 0x1a, + 0x3f, 0x00, 0x00, 0x6a, 0x80, 0x01, 0x00, 0x54, 0x60, 0x02, 0x40, 0xf9, + 0x00, 0x01, 0x00, 0xb4, 0x81, 0x0b, 0x40, 0xf9, 0xe0, 0x03, 0x14, 0x2a, + 0x00, 0x24, 0xda, 0x9a, 0x81, 0x00, 0x00, 0xb4, 0x81, 0x0f, 0x40, 0xf9, + 0x41, 0x00, 0x00, 0xb4, 0xe0, 0x02, 0x00, 0x37, 0x9f, 0x7f, 0x01, 0xa9, + 0x9f, 0x13, 0x00, 0xf9, 0x5a, 0x07, 0x00, 0x91, 0x9c, 0xe3, 0x00, 0x91, + 0x5f, 0x23, 0x00, 0xf1, 0xa1, 0xfd, 0xff, 0x54, 0xf7, 0x02, 0x07, 0x91, + 0xb5, 0x02, 0x07, 0x91, 0xff, 0x02, 0x1c, 0xf1, 0x18, 0x03, 0x05, 0x91, + 0xd6, 0x12, 0x00, 0x91, 0x39, 0x23, 0x00, 0x11, 0x73, 0x42, 0x01, 0x91, + 0xe1, 0xfb, 0xff, 0x54, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xc8, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x03, 0x05, 0x80, 0xd2, 0x01, 0x07, 0x80, 0xd2, 0xc4, 0x02, 0x40, 0xb9, + 0xe0, 0xff, 0xff, 0xd0, 0x41, 0x57, 0x01, 0x9b, 0x00, 0x80, 0x0c, 0x91, + 0x43, 0x6f, 0x03, 0x9b, 0xfa, 0x77, 0x00, 0xb9, 0xe2, 0x3f, 0x40, 0xf9, + 0xf7, 0xf7, 0xff, 0x97, 0xe8, 0x77, 0x40, 0xb9, 0x00, 0x03, 0x00, 0x90, + 0x01, 0xf0, 0x46, 0xb9, 0x27, 0x00, 0x80, 0x52, 0x08, 0x01, 0x19, 0x0b, + 0xe7, 0x20, 0xc8, 0x1a, 0xe7, 0x00, 0x01, 0x2a, 0x07, 0xf0, 0x06, 0xb9, + 0xda, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, + 0x04, 0xc0, 0x02, 0x51, 0x07, 0x38, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0x84, 0x7c, 0xa7, 0x9b, 0x06, 0x03, 0x00, 0x90, 0xc5, 0xc0, 0x1a, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x02, 0x00, 0x90, 0x73, 0x22, 0x1b, 0x91, + 0xc0, 0xb0, 0x06, 0xb9, 0x74, 0x02, 0x07, 0x91, 0x93, 0x00, 0x13, 0x8b, + 0x94, 0x02, 0x04, 0x8b, 0x20, 0x00, 0x80, 0x52, 0xa1, 0x08, 0x00, 0x79, + 0xa2, 0x0c, 0x00, 0x79, 0xa3, 0x04, 0x00, 0xf9, 0xe0, 0x33, 0x00, 0xb9, + 0x1f, 0x20, 0x03, 0xd5, 0xe0, 0x03, 0x13, 0xaa, 0x43, 0xfc, 0xff, 0x97, + 0x1f, 0x1c, 0x00, 0x72, 0x01, 0x02, 0x00, 0x54, 0x73, 0xe2, 0x00, 0x91, + 0x7f, 0x02, 0x14, 0xeb, 0x41, 0xff, 0xff, 0x54, 0x24, 0x00, 0x80, 0x52, + 0x25, 0x02, 0x9c, 0x52, 0xe1, 0xa3, 0x00, 0x91, 0xe0, 0xc3, 0x00, 0x91, + 0x03, 0x00, 0x80, 0x52, 0x82, 0x00, 0x80, 0xd2, 0xe5, 0x2b, 0x00, 0xb9, + 0xe4, 0x37, 0x00, 0xb9, 0xd5, 0x4f, 0x00, 0x94, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x13, 0xaa, + 0x88, 0xf9, 0xff, 0x97, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0x15, 0xc0, 0x02, 0x51, 0xbf, 0x12, 0x00, 0x71, + 0xa9, 0x00, 0x00, 0x54, 0x20, 0x02, 0x9c, 0x52, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf6, 0x03, 0x04, 0xaa, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0x2a, 0xf3, 0x03, 0x02, 0x2a, + 0xf7, 0x63, 0x03, 0xa9, 0xf7, 0x03, 0x01, 0x2a, 0x78, 0x3c, 0x00, 0x12, + 0x9b, 0x14, 0x00, 0x94, 0xbf, 0x12, 0x00, 0x71, 0xe0, 0x00, 0x00, 0x54, + 0x22, 0x00, 0x80, 0x52, 0x7f, 0xfe, 0x03, 0x71, 0x42, 0x20, 0xd3, 0x1a, + 0x40, 0x00, 0x00, 0x0a, 0x04, 0x18, 0x40, 0x7a, 0x81, 0x00, 0x00, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xea, 0xff, 0xff, 0x17, + 0x02, 0x07, 0x80, 0x52, 0x04, 0x38, 0x80, 0x52, 0x03, 0x03, 0x00, 0x90, + 0x61, 0x00, 0x1b, 0x91, 0x62, 0x7e, 0xa2, 0x9b, 0xe0, 0x02, 0x00, 0x90, + 0x00, 0x20, 0x1b, 0x91, 0xb5, 0x0a, 0xa4, 0x9b, 0x77, 0xc0, 0x06, 0xb9, + 0xb5, 0x02, 0x00, 0x8b, 0x34, 0x04, 0x00, 0xb9, 0xe0, 0x03, 0x15, 0xaa, + 0x36, 0x04, 0x00, 0xf9, 0x38, 0x20, 0x00, 0x79, 0x33, 0x14, 0x00, 0xb9, + 0x00, 0xfc, 0xff, 0x97, 0x1f, 0x1c, 0x00, 0x72, 0x80, 0xfd, 0xff, 0x54, + 0xe0, 0x03, 0x15, 0xaa, 0x90, 0xf9, 0xff, 0x97, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0x07, 0xc0, 0x02, 0x51, 0x09, 0x38, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0x13, 0x07, 0x80, 0x52, + 0xe7, 0x7c, 0xa9, 0x9b, 0x08, 0x03, 0x00, 0x90, 0x05, 0x61, 0x1b, 0x91, + 0x53, 0x1c, 0xb3, 0x9b, 0xe6, 0x02, 0x00, 0x90, 0xc6, 0x20, 0x1b, 0x91, + 0x73, 0x02, 0x06, 0x8b, 0x01, 0xd9, 0x06, 0xb9, 0xa0, 0x04, 0x00, 0xb9, + 0xe0, 0x03, 0x13, 0xaa, 0xa4, 0x04, 0x00, 0xf9, 0xa3, 0x20, 0x00, 0x79, + 0xa2, 0x14, 0x00, 0xb9, 0xe1, 0xfb, 0xff, 0x97, 0x1f, 0x1c, 0x00, 0x72, + 0xa1, 0x00, 0x00, 0x54, 0x20, 0x02, 0x9c, 0x52, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x13, 0xaa, + 0xa9, 0xf9, 0xff, 0x97, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xb9, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x02, 0x00, 0x90, + 0x94, 0x22, 0x1b, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x00, 0x2a, + 0xf7, 0x63, 0x03, 0xa9, 0xf7, 0x03, 0x01, 0x2a, 0xf9, 0x6b, 0x04, 0xa9, + 0x3a, 0x00, 0x80, 0x52, 0xfb, 0x73, 0x05, 0xa9, 0x5b, 0x1c, 0x00, 0x12, + 0x47, 0x14, 0x00, 0x94, 0x1c, 0x00, 0x80, 0xd2, 0xf7, 0x02, 0x00, 0x0a, + 0x38, 0x02, 0x00, 0xf0, 0x00, 0x43, 0x19, 0x91, 0xe0, 0x37, 0x00, 0xf9, + 0xa0, 0x26, 0xdc, 0x9a, 0xa0, 0x01, 0x00, 0x37, 0x9c, 0x07, 0x00, 0x91, + 0x94, 0x02, 0x07, 0x91, 0x9f, 0x13, 0x00, 0xf1, 0x61, 0xff, 0xff, 0x54, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x0a, 0x80, 0xd2, + 0xe1, 0x37, 0x40, 0xf9, 0x80, 0x7f, 0x00, 0x9b, 0x03, 0x68, 0x61, 0xf8, + 0x83, 0x00, 0x00, 0xb4, 0xe1, 0x03, 0x1b, 0x2a, 0xe0, 0x03, 0x17, 0x2a, + 0x60, 0x00, 0x3f, 0xd6, 0xf6, 0x03, 0x17, 0x2a, 0x13, 0x00, 0x80, 0xd2, + 0x19, 0x07, 0x80, 0xd2, 0x04, 0x00, 0x00, 0x14, 0x73, 0x06, 0x00, 0x91, + 0x7f, 0x22, 0x00, 0xf1, 0xc0, 0xfc, 0xff, 0x54, 0xc0, 0x26, 0xd3, 0x9a, + 0x80, 0xff, 0x07, 0x36, 0x78, 0x52, 0x19, 0x9b, 0x21, 0x14, 0x00, 0x94, + 0xe4, 0x03, 0x00, 0x2a, 0x41, 0x23, 0xd3, 0x1a, 0xe0, 0x03, 0x18, 0xaa, + 0x3f, 0x00, 0x04, 0x6a, 0xa0, 0xfe, 0xff, 0x54, 0x9b, 0xfb, 0xff, 0x97, + 0x1f, 0x1c, 0x00, 0x72, 0xe0, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x18, 0xaa, + 0x7b, 0x00, 0x00, 0x34, 0xda, 0xfa, 0xff, 0x97, 0xee, 0xff, 0xff, 0x17, + 0x44, 0xfa, 0xff, 0x97, 0xec, 0xff, 0xff, 0x17, 0x20, 0x02, 0x9c, 0x52, + 0xd7, 0xff, 0xff, 0x17, 0x25, 0x02, 0x00, 0xf0, 0xa6, 0x40, 0x18, 0x91, + 0x05, 0xc0, 0x02, 0x51, 0x00, 0x0a, 0x80, 0xd2, 0xa5, 0x18, 0x00, 0x9b, + 0xe0, 0x03, 0x01, 0x2a, 0xe1, 0x03, 0x02, 0xaa, 0xe2, 0x03, 0x03, 0xaa, + 0xe3, 0x03, 0x04, 0x2a, 0xa6, 0x10, 0x40, 0xf9, 0xc6, 0x00, 0x00, 0xb4, + 0xa4, 0x24, 0x40, 0xf9, 0x25, 0x00, 0x80, 0x52, 0xf0, 0x03, 0x06, 0xaa, + 0xa0, 0x20, 0xc0, 0x1a, 0x00, 0x02, 0x1f, 0xd6, 0x40, 0x02, 0x9c, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x13, 0xc0, 0x02, 0x51, 0x7f, 0x12, 0x00, 0x71, 0xa9, 0x00, 0x00, 0x54, + 0x20, 0x02, 0x9c, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf4, 0x03, 0x02, 0x2a, 0xf5, 0x13, 0x00, 0xf9, + 0x35, 0x1c, 0x00, 0x12, 0xef, 0x13, 0x00, 0x94, 0x7f, 0x12, 0x00, 0x71, + 0xe0, 0x00, 0x00, 0x54, 0x21, 0x00, 0x80, 0x52, 0x9f, 0xfe, 0x03, 0x71, + 0x21, 0x20, 0xd4, 0x1a, 0x20, 0x00, 0x00, 0x0a, 0x04, 0x18, 0x40, 0x7a, + 0x61, 0x00, 0x00, 0x54, 0xf5, 0x13, 0x40, 0xf9, 0xef, 0xff, 0xff, 0x17, + 0x02, 0x07, 0x80, 0x52, 0x01, 0x38, 0x80, 0x52, 0xe0, 0x02, 0x00, 0x90, + 0x00, 0x20, 0x1b, 0x91, 0x94, 0x7e, 0xa2, 0x9b, 0x73, 0x52, 0xa1, 0x9b, + 0x00, 0x00, 0x13, 0x8b, 0x5d, 0xfb, 0xff, 0x97, 0x1f, 0x1c, 0x00, 0x72, + 0xa0, 0xfe, 0xff, 0x54, 0xbf, 0x02, 0x00, 0x71, 0xe0, 0x02, 0x00, 0x90, + 0x00, 0xd0, 0x1b, 0x91, 0xe1, 0x07, 0x9f, 0x1a, 0x73, 0x02, 0x00, 0x8b, + 0x61, 0xfe, 0x9f, 0x08, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xba, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0xf6, 0x03, 0x00, 0xaa, 0xf5, 0x02, 0x00, 0x90, 0xb5, 0x22, 0x1b, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf7, 0x63, 0x03, 0xa9, 0x18, 0x80, 0x00, 0x91, + 0x17, 0x00, 0x80, 0x52, 0xf9, 0x6b, 0x04, 0xa9, 0x39, 0x00, 0x80, 0x52, + 0x1a, 0x07, 0x80, 0xd2, 0xfb, 0x2b, 0x00, 0xf9, 0xbe, 0x13, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0xdf, 0x7e, 0x00, 0xa9, 0xdf, 0x7e, 0x01, 0xa9, + 0xdf, 0x7e, 0x02, 0xa9, 0xdf, 0x7e, 0x03, 0xa9, 0xdf, 0x7e, 0x04, 0xa9, + 0xdf, 0x7e, 0x05, 0xa9, 0xdf, 0x7e, 0x06, 0xa9, 0xdf, 0x7e, 0x07, 0xa9, + 0xdf, 0x7e, 0x08, 0xa9, 0xdf, 0x7e, 0x09, 0xa9, 0x3b, 0x23, 0xd7, 0x1a, + 0x13, 0x00, 0x80, 0xd2, 0x34, 0x02, 0x00, 0x35, 0x73, 0x06, 0x00, 0x91, + 0x7f, 0x22, 0x00, 0xf1, 0xa1, 0xff, 0xff, 0x54, 0xf7, 0x06, 0x00, 0x11, + 0xb5, 0x02, 0x07, 0x91, 0xff, 0x12, 0x00, 0x71, 0x18, 0x13, 0x00, 0x91, + 0xc1, 0xfe, 0xff, 0x54, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x2b, 0x40, 0xf9, 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x9f, 0x13, 0x00, 0x94, 0xe1, 0x03, 0x00, 0x2a, 0x22, 0x23, 0xd3, 0x1a, + 0x60, 0x56, 0x1a, 0x9b, 0x5f, 0x00, 0x01, 0x6a, 0x60, 0xfd, 0xff, 0x54, + 0x01, 0xfb, 0xff, 0x97, 0x00, 0x1c, 0x00, 0x12, 0x61, 0xee, 0x7c, 0xd3, + 0x00, 0x6b, 0x21, 0xb8, 0xc0, 0xfc, 0x37, 0x36, 0xc0, 0x7a, 0x73, 0xb8, + 0x00, 0x00, 0x1b, 0x2a, 0xc0, 0x7a, 0x33, 0xb8, 0xe2, 0xff, 0xff, 0x17, + 0xfd, 0x7b, 0xba, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf7, 0x63, 0x03, 0xa9, + 0xf7, 0x03, 0x00, 0xaa, 0x18, 0x07, 0x80, 0xd2, 0xf3, 0x53, 0x01, 0xa9, + 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x02, 0x00, 0x90, 0xb5, 0x22, 0x1b, 0x91, + 0xf9, 0x6b, 0x04, 0xa9, 0x16, 0x00, 0x80, 0x52, 0xfb, 0x2b, 0x00, 0xf9, + 0x84, 0x13, 0x00, 0x94, 0x3b, 0x00, 0x80, 0xd2, 0xf4, 0x03, 0x00, 0x2a, + 0xf9, 0x03, 0x1b, 0x2a, 0xff, 0x7e, 0x00, 0xa9, 0xff, 0x7e, 0x01, 0xa9, + 0x7a, 0x23, 0xd6, 0x9a, 0x13, 0x00, 0x80, 0xd2, 0x14, 0x02, 0x00, 0x35, + 0x73, 0x06, 0x00, 0x91, 0x7f, 0x22, 0x00, 0xf1, 0xa1, 0xff, 0xff, 0x54, + 0xd6, 0x06, 0x00, 0x11, 0xb5, 0x02, 0x07, 0x91, 0xdf, 0x12, 0x00, 0x71, + 0xe1, 0xfe, 0xff, 0x54, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x2b, 0x40, 0xf9, 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x6c, 0x13, 0x00, 0x94, 0xe1, 0x03, 0x00, 0x2a, 0x22, 0x23, 0xd3, 0x1a, + 0x60, 0x56, 0x18, 0x9b, 0x5f, 0x00, 0x01, 0x6a, 0x80, 0xfd, 0xff, 0x54, + 0xce, 0xfa, 0xff, 0x97, 0x40, 0xfd, 0x27, 0x36, 0xe0, 0x7a, 0x73, 0xb8, + 0x00, 0x00, 0x1a, 0x2a, 0xe0, 0x7a, 0x33, 0xb8, 0xe6, 0xff, 0xff, 0x17, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0x2a, 0x7f, 0x0e, 0x00, 0x71, 0xf5, 0x13, 0x00, 0xf9, + 0xf5, 0x03, 0x02, 0xaa, 0x09, 0x01, 0x00, 0x54, 0x01, 0x00, 0x80, 0x52, + 0x60, 0x02, 0x9c, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xa1, 0x02, 0x00, 0xb9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf4, 0x03, 0x01, 0x2a, 0x50, 0x13, 0x00, 0x94, 0x21, 0x00, 0x80, 0x52, + 0x9f, 0xfe, 0x03, 0x71, 0x21, 0x20, 0xd4, 0x1a, 0x21, 0x00, 0x00, 0x0a, + 0x24, 0x18, 0x40, 0x7a, 0xc0, 0x02, 0x9c, 0x52, 0x01, 0x00, 0x80, 0x52, + 0x40, 0xfe, 0xff, 0x54, 0x02, 0x38, 0x80, 0xd2, 0x01, 0x07, 0x80, 0x52, + 0xe0, 0x02, 0x00, 0x90, 0x00, 0x20, 0x1b, 0x91, 0x73, 0x7e, 0x02, 0x9b, + 0x93, 0x4e, 0xa1, 0x9b, 0x00, 0x00, 0x13, 0x8b, 0xa8, 0xfa, 0xff, 0x97, + 0xe1, 0x03, 0x00, 0x2a, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0x21, 0x10, 0x44, 0xd3, 0xa1, 0x02, 0x00, 0xb9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x12, + 0x23, 0x3c, 0x00, 0x12, 0x64, 0x00, 0x00, 0x0b, 0x9f, 0x40, 0x00, 0x71, + 0x6d, 0x00, 0x00, 0x54, 0xe0, 0x02, 0x9c, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xbc, 0xa9, 0xe1, 0x03, 0x02, 0xaa, 0x62, 0x3c, 0x40, 0x92, + 0xfd, 0x03, 0x00, 0x91, 0xf7, 0x63, 0x03, 0xa9, 0xf7, 0x02, 0x00, 0x90, + 0xf7, 0x22, 0x1b, 0x91, 0x18, 0x00, 0x80, 0xd2, 0xf5, 0x5b, 0x02, 0xa9, + 0x35, 0x00, 0x80, 0x52, 0xf6, 0x02, 0x00, 0x90, 0xd6, 0xe2, 0x1a, 0x91, + 0xc0, 0x22, 0x20, 0x8b, 0xf3, 0x53, 0x01, 0xa9, 0xaf, 0x04, 0x01, 0x94, + 0xf4, 0x03, 0x17, 0xaa, 0x13, 0x00, 0x80, 0x52, 0x04, 0x00, 0x00, 0x14, + 0x94, 0xe2, 0x00, 0x91, 0x7f, 0x22, 0x00, 0x71, 0x20, 0x02, 0x00, 0x54, + 0x18, 0x13, 0x00, 0x94, 0xe2, 0x03, 0x00, 0x2a, 0xa1, 0x22, 0xd3, 0x1a, + 0xe0, 0x03, 0x14, 0xaa, 0x3f, 0x00, 0x02, 0x6a, 0x73, 0x06, 0x00, 0x11, + 0xe0, 0xfe, 0xff, 0x54, 0x91, 0xfa, 0xff, 0x97, 0x1f, 0x1c, 0x00, 0x72, + 0x80, 0xfe, 0xff, 0x54, 0xc1, 0x02, 0x40, 0xb9, 0xe0, 0x03, 0x14, 0xaa, + 0x94, 0xe2, 0x00, 0x91, 0x8f, 0xfa, 0xff, 0x97, 0x7f, 0x22, 0x00, 0x71, + 0x21, 0xfe, 0xff, 0x54, 0x18, 0x03, 0x07, 0x91, 0xd6, 0x12, 0x00, 0x91, + 0x1f, 0x03, 0x1c, 0xf1, 0xf7, 0x02, 0x07, 0x91, 0xc1, 0xfc, 0xff, 0x54, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x3c, 0x00, 0x12, 0x21, 0x3c, 0x00, 0x12, + 0x24, 0x00, 0x03, 0x0b, 0x9f, 0x40, 0x00, 0x71, 0x8c, 0x01, 0x00, 0x54, + 0xe4, 0x02, 0x00, 0x90, 0x84, 0xe0, 0x1a, 0x91, 0xfd, 0x7b, 0xbf, 0xa9, + 0xe0, 0x03, 0x02, 0xaa, 0x22, 0x3c, 0x40, 0x92, 0xfd, 0x03, 0x00, 0x91, + 0x81, 0x20, 0x23, 0x8b, 0x80, 0x04, 0x01, 0x94, 0x00, 0x00, 0x80, 0x52, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x02, 0x9c, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x13, 0xc0, 0x02, 0x51, 0xe0, 0x03, 0x01, 0x2a, 0x6b, 0xfa, 0xff, 0x97, + 0x7f, 0x12, 0x00, 0x71, 0x89, 0x00, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf4, 0x03, 0x00, 0x2a, + 0xdc, 0x12, 0x00, 0x94, 0x7f, 0x12, 0x00, 0x71, 0x40, 0xff, 0xff, 0x54, + 0x21, 0x00, 0x80, 0x52, 0x9f, 0xfe, 0x03, 0x71, 0x21, 0x20, 0xd4, 0x1a, + 0x20, 0x00, 0x00, 0x0a, 0x04, 0x18, 0x40, 0x7a, 0x80, 0xfe, 0xff, 0x54, + 0x02, 0x07, 0x80, 0x52, 0x01, 0x38, 0x80, 0x52, 0xe0, 0x02, 0x00, 0x90, + 0x00, 0x20, 0x1b, 0x91, 0x94, 0x7e, 0xa2, 0x9b, 0x74, 0x52, 0xa1, 0x9b, + 0x94, 0x02, 0x00, 0x8b, 0xe0, 0x03, 0x14, 0xaa, 0x4b, 0xfa, 0xff, 0x97, + 0x1f, 0x1c, 0x00, 0x72, 0x20, 0xfd, 0xff, 0x54, 0xe0, 0x03, 0x14, 0xaa, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0x3d, 0xf9, 0xff, 0x17, + 0x24, 0x02, 0x00, 0xf0, 0x85, 0x40, 0x18, 0x91, 0x04, 0xc0, 0x02, 0x51, + 0x07, 0x0a, 0x80, 0xd2, 0x20, 0x3c, 0x00, 0x12, 0x41, 0x3c, 0x00, 0x12, + 0x84, 0x14, 0x07, 0x9b, 0x85, 0x0c, 0x40, 0xf9, 0xa5, 0x00, 0x00, 0xb4, + 0xe2, 0x03, 0x03, 0xaa, 0xf0, 0x03, 0x05, 0xaa, 0x83, 0x24, 0x40, 0xf9, + 0x00, 0x02, 0x1f, 0xd6, 0xa0, 0x02, 0x9c, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x21, 0x1c, 0x00, 0x12, 0x83, 0x02, 0x80, 0x52, + 0x04, 0x03, 0x00, 0x90, 0x84, 0xe0, 0x1b, 0x91, 0x1f, 0x0c, 0x00, 0x71, + 0x23, 0x7c, 0xa3, 0x9b, 0xe0, 0x02, 0x00, 0x54, 0x1f, 0x10, 0x00, 0x71, + 0x80, 0x04, 0x00, 0x54, 0x1f, 0x04, 0x00, 0x71, 0x80, 0x05, 0x00, 0x54, + 0x1f, 0x08, 0x00, 0x71, 0x81, 0x06, 0x00, 0x54, 0x84, 0x0c, 0x21, 0x8b, + 0x63, 0x00, 0x05, 0x91, 0x00, 0x03, 0x00, 0x90, 0x00, 0xe0, 0x20, 0x91, + 0x03, 0x00, 0x03, 0x8b, 0x26, 0x68, 0x01, 0x11, 0x80, 0x40, 0x40, 0xf9, + 0x25, 0x88, 0x00, 0x11, 0x21, 0xd4, 0x01, 0x11, 0x24, 0x00, 0x80, 0x52, + 0x46, 0x14, 0x00, 0x29, 0x41, 0x08, 0x00, 0xb9, 0x44, 0x30, 0x00, 0x39, + 0x40, 0x0c, 0x01, 0xa9, 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x84, 0x0c, 0x21, 0x8b, 0x63, 0x80, 0x07, 0x91, 0x00, 0x03, 0x00, 0x90, + 0x00, 0xe0, 0x20, 0x91, 0x03, 0x00, 0x03, 0x8b, 0x25, 0x48, 0x01, 0x11, + 0x80, 0x60, 0x40, 0xf9, 0x24, 0x68, 0x00, 0x11, 0x21, 0xf4, 0x01, 0x11, + 0x45, 0x10, 0x00, 0x29, 0x41, 0x08, 0x00, 0xb9, 0x5f, 0x30, 0x00, 0x39, + 0x40, 0x0c, 0x01, 0xa9, 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x84, 0x0c, 0x21, 0x8b, 0x63, 0x00, 0x0a, 0x91, 0x00, 0x03, 0x00, 0x90, + 0x00, 0xe0, 0x20, 0x91, 0x03, 0x00, 0x03, 0x8b, 0x26, 0x28, 0x01, 0x11, + 0x25, 0x48, 0x00, 0x11, 0x21, 0x14, 0x02, 0x11, 0x80, 0x80, 0x40, 0xf9, + 0xe1, 0xff, 0xff, 0x17, 0x84, 0x0c, 0x21, 0x8b, 0x63, 0x80, 0x02, 0x91, + 0x00, 0x03, 0x00, 0x90, 0x00, 0xe0, 0x20, 0x91, 0x03, 0x00, 0x03, 0x8b, + 0x25, 0x08, 0x01, 0x11, 0x80, 0x20, 0x40, 0xf9, 0x24, 0x28, 0x00, 0x11, + 0x21, 0xb4, 0x01, 0x11, 0xe7, 0xff, 0xff, 0x17, 0x27, 0x7c, 0x40, 0x93, + 0x00, 0x03, 0x00, 0x90, 0x00, 0xe0, 0x20, 0x91, 0x26, 0xe8, 0x00, 0x11, + 0x03, 0x00, 0x03, 0x8b, 0x25, 0x08, 0x00, 0x11, 0x21, 0x94, 0x01, 0x11, + 0x80, 0x78, 0x67, 0xf8, 0xce, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x34, + 0x3f, 0x04, 0x00, 0x71, 0x61, 0x00, 0x00, 0x54, 0x21, 0x6f, 0x00, 0x14, + 0x18, 0x6f, 0x00, 0x14, 0x60, 0x80, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x63, 0x3c, 0x00, 0x12, 0x46, 0x3c, 0x00, 0x12, + 0xe5, 0x03, 0x00, 0xaa, 0x7f, 0x00, 0x01, 0x6b, 0xc0, 0x00, 0x03, 0x0b, + 0xa8, 0x01, 0x00, 0x54, 0x1f, 0x00, 0x01, 0x6b, 0xa0, 0x01, 0x9c, 0x52, + 0xc8, 0x01, 0x00, 0x54, 0xfd, 0x7b, 0xbf, 0xa9, 0x62, 0x3c, 0x40, 0x92, + 0xa1, 0x20, 0x26, 0x8b, 0xfd, 0x03, 0x00, 0x91, 0xe0, 0x03, 0x04, 0xaa, + 0xe2, 0x03, 0x01, 0x94, 0x00, 0x00, 0x80, 0x52, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x1f, 0x00, 0x01, 0x6b, 0x80, 0x01, 0x9c, 0x52, + 0x00, 0x94, 0x80, 0x1a, 0xc0, 0x03, 0x5f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x63, 0x3c, 0x00, 0x12, 0x47, 0x3c, 0x00, 0x12, + 0xe6, 0x03, 0x00, 0xaa, 0x7f, 0x00, 0x01, 0x6b, 0xe0, 0x00, 0x03, 0x0b, + 0xa8, 0x01, 0x00, 0x54, 0x1f, 0x00, 0x01, 0x6b, 0xa0, 0x01, 0x9c, 0x52, + 0xc8, 0x01, 0x00, 0x54, 0xfd, 0x7b, 0xbf, 0xa9, 0x62, 0x3c, 0x40, 0x92, + 0xe1, 0x03, 0x04, 0xaa, 0xfd, 0x03, 0x00, 0x91, 0xc0, 0x20, 0x27, 0x8b, + 0xca, 0x03, 0x01, 0x94, 0x00, 0x00, 0x80, 0x52, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x1f, 0x00, 0x01, 0x6b, 0x80, 0x01, 0x9c, 0x52, + 0x00, 0x94, 0x80, 0x1a, 0xc0, 0x03, 0x5f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb8, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf7, 0x63, 0x03, 0xa9, 0x18, 0x03, 0x00, 0x90, 0x18, 0xe3, 0x1b, 0x91, + 0xf9, 0x6b, 0x04, 0xa9, 0x19, 0x03, 0x00, 0x90, 0x39, 0xe3, 0x20, 0x91, + 0x1a, 0x00, 0x80, 0xd2, 0xf3, 0x53, 0x01, 0xa9, 0xf5, 0x5b, 0x02, 0xa9, + 0xfb, 0x2b, 0x00, 0xf9, 0x3b, 0x00, 0x80, 0x52, 0xff, 0x7f, 0x06, 0xa9, + 0xff, 0x7f, 0x07, 0xa9, 0x57, 0x1f, 0x00, 0x12, 0xf4, 0x03, 0x18, 0xaa, + 0xf6, 0x03, 0x19, 0xaa, 0x15, 0x00, 0x80, 0xd2, 0x1f, 0x20, 0x03, 0xd5, + 0xdf, 0x02, 0x00, 0x39, 0xe0, 0x03, 0x14, 0xaa, 0xba, 0x1d, 0x00, 0x94, + 0x40, 0x01, 0x00, 0x34, 0xb3, 0x04, 0x9c, 0x52, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x2b, 0x40, 0xf9, 0xfd, 0x7b, 0xc8, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x83, 0x01, 0x91, 0xe1, 0x03, 0x17, 0x2a, + 0xe0, 0x03, 0x15, 0x2a, 0x58, 0xff, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x60, 0xfe, 0xff, 0x35, 0xe1, 0x63, 0x40, 0xb9, 0x80, 0x02, 0x40, 0xf9, + 0xcb, 0x1d, 0x00, 0x94, 0x40, 0x01, 0x00, 0x34, 0x53, 0x26, 0x9c, 0x52, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x2b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc8, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe1, 0x67, 0x40, 0xb9, + 0xb5, 0x06, 0x00, 0x91, 0x80, 0x02, 0x40, 0xf9, 0xd6, 0x82, 0x02, 0x91, + 0xbc, 0x1d, 0x00, 0x94, 0x40, 0xfe, 0xff, 0x35, 0xe1, 0x6b, 0x40, 0xb9, + 0x94, 0x02, 0x01, 0x91, 0x80, 0x02, 0x5c, 0xf8, 0xb7, 0x1d, 0x00, 0x94, + 0xa0, 0xfd, 0xff, 0x35, 0xbf, 0x16, 0x00, 0xf1, 0x81, 0xfa, 0xff, 0x54, + 0x60, 0x07, 0x00, 0x11, 0x7f, 0x1f, 0x00, 0x71, 0x5a, 0x07, 0x00, 0x91, + 0x39, 0x53, 0x00, 0x91, 0x18, 0x23, 0x00, 0x91, 0x1b, 0x1c, 0x00, 0x12, + 0x09, 0xf9, 0xff, 0x54, 0xd1, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xa5, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0xaa, + 0xf5, 0x5b, 0x02, 0xa9, 0xf7, 0x63, 0x03, 0xa9, 0xf7, 0x03, 0x01, 0xaa, + 0xf9, 0x6b, 0x04, 0xa9, 0xfb, 0x73, 0x05, 0xa9, 0x1c, 0x24, 0x40, 0x39, + 0x18, 0x20, 0x40, 0x39, 0xe0, 0x03, 0x08, 0x91, 0xff, 0x0b, 0x04, 0x39, + 0xff, 0x07, 0x01, 0xb9, 0x1f, 0xfc, 0x31, 0xa9, 0x1f, 0xfc, 0x32, 0xa9, + 0x99, 0x02, 0x40, 0x29, 0xe0, 0x97, 0x00, 0xb9, 0xe0, 0x03, 0x08, 0x91, + 0xff, 0xb7, 0x00, 0xf9, 0xff, 0x7f, 0x17, 0xa9, 0x1f, 0xfc, 0x33, 0xa9, + 0x80, 0x0e, 0x40, 0xb9, 0xe0, 0x9b, 0x00, 0xb9, 0xe0, 0x03, 0x08, 0x91, + 0xff, 0x7f, 0x18, 0xa9, 0x1f, 0xfc, 0x34, 0xa9, 0x1f, 0xfc, 0x35, 0xa9, + 0xff, 0x7f, 0x19, 0xa9, 0xff, 0x7f, 0x1a, 0xa9, 0x93, 0x56, 0x41, 0xa9, + 0xf3, 0x47, 0x00, 0xf9, 0x80, 0xee, 0x42, 0xa9, 0xf5, 0x83, 0x07, 0xa9, + 0x8e, 0xf6, 0xff, 0x97, 0x00, 0x1c, 0x00, 0x72, 0xe0, 0x93, 0x00, 0xb9, + 0xc1, 0x14, 0x00, 0x54, 0x9f, 0x23, 0x00, 0x71, 0xb6, 0x2a, 0x9c, 0x52, + 0x88, 0x14, 0x00, 0x54, 0x23, 0x07, 0x00, 0x51, 0x7f, 0x28, 0x00, 0x71, + 0x48, 0x44, 0x00, 0x54, 0x00, 0x02, 0x00, 0xd0, 0x00, 0x00, 0x3f, 0x91, + 0xe2, 0x63, 0x04, 0x91, 0xe1, 0x03, 0x18, 0x2a, 0x00, 0x58, 0x63, 0xb8, + 0xff, 0xfe, 0xff, 0x97, 0xf6, 0x03, 0x00, 0x2a, 0x20, 0x13, 0x00, 0x35, + 0xe0, 0x9b, 0x40, 0xf9, 0x01, 0x00, 0x40, 0x39, 0x1f, 0x04, 0x00, 0xb9, + 0xa1, 0x00, 0x00, 0x35, 0xe0, 0x03, 0x1b, 0xaa, 0x60, 0x02, 0x3f, 0xd6, + 0xf6, 0x03, 0x00, 0x2a, 0x20, 0x2a, 0x00, 0x34, 0xc1, 0x10, 0x80, 0x52, + 0xe0, 0x1f, 0x80, 0x52, 0x21, 0x28, 0xd9, 0x1a, 0x21, 0x00, 0x00, 0x12, + 0xe1, 0x6f, 0x00, 0xb9, 0x00, 0x24, 0xd8, 0x1a, 0x33, 0x1f, 0x08, 0x53, + 0x1a, 0x00, 0x00, 0x12, 0x40, 0x00, 0x00, 0x36, 0x41, 0x40, 0x00, 0x35, + 0x01, 0xa3, 0x00, 0x51, 0xe2, 0x3b, 0x80, 0x52, 0x62, 0x02, 0x02, 0x2a, + 0xe1, 0xff, 0x13, 0x29, 0x21, 0x1c, 0x00, 0x12, 0xe1, 0xb3, 0x00, 0xb9, + 0x41, 0x62, 0x80, 0x52, 0x61, 0x02, 0x01, 0x2a, 0xe2, 0xbb, 0x00, 0xb9, + 0xa2, 0x5d, 0x80, 0x52, 0x62, 0x02, 0x02, 0x2a, 0xe1, 0xc3, 0x00, 0xb9, + 0xe1, 0x5f, 0x80, 0x52, 0x61, 0x02, 0x01, 0x2a, 0xe2, 0xc7, 0x00, 0xb9, + 0x22, 0x56, 0x80, 0x52, 0x62, 0x02, 0x02, 0x2a, 0xe1, 0xcf, 0x00, 0xb9, + 0x81, 0x51, 0x80, 0x52, 0x61, 0x02, 0x01, 0x2a, 0xe2, 0xdb, 0x00, 0xb9, + 0xc2, 0x52, 0x80, 0x52, 0x62, 0x02, 0x02, 0x2a, 0xe1, 0xef, 0x00, 0xb9, + 0x21, 0x53, 0x80, 0x52, 0x61, 0x02, 0x01, 0x2a, 0xe2, 0xf3, 0x00, 0xb9, + 0x62, 0x4d, 0x80, 0x52, 0x62, 0x02, 0x02, 0x2a, 0xe2, 0xdf, 0x00, 0xb9, + 0x62, 0x4e, 0x80, 0x52, 0x62, 0x02, 0x02, 0x2a, 0xe2, 0x87, 0x1e, 0x29, + 0xe1, 0x4d, 0x80, 0x52, 0x61, 0x02, 0x01, 0x2a, 0xe1, 0xe3, 0x00, 0xb9, + 0x61, 0x5a, 0x80, 0x52, 0x61, 0x02, 0x01, 0x2a, 0xe0, 0x9b, 0x40, 0xf9, + 0xe1, 0xcb, 0x00, 0xb9, 0xc1, 0x44, 0x80, 0x52, 0x61, 0x02, 0x01, 0x2a, + 0x22, 0x44, 0x80, 0x52, 0x62, 0x02, 0x02, 0x2a, 0xe1, 0xd3, 0x00, 0xb9, + 0x41, 0x3f, 0x80, 0x52, 0x61, 0x02, 0x01, 0x2a, 0xe2, 0xb7, 0x00, 0xb9, + 0x82, 0x45, 0x80, 0x52, 0x62, 0x02, 0x02, 0x2a, 0xe1, 0xe7, 0x00, 0xb9, + 0xc1, 0x36, 0x80, 0x52, 0x61, 0x02, 0x01, 0x2a, 0x1f, 0xd0, 0x00, 0xb8, + 0x1f, 0x10, 0x01, 0x78, 0xff, 0x73, 0x00, 0xb9, 0xff, 0xff, 0x14, 0x29, + 0xe1, 0xaf, 0x00, 0xb9, 0xc1, 0x39, 0x80, 0x52, 0x61, 0x02, 0x01, 0x2a, + 0xe1, 0xbf, 0x00, 0xb9, 0xe2, 0xd7, 0x00, 0xb9, 0x02, 0x42, 0x80, 0x52, + 0x62, 0x02, 0x02, 0x2a, 0xe2, 0xeb, 0x00, 0xb9, 0xe0, 0x03, 0x08, 0x91, + 0x1f, 0xfc, 0x30, 0xa9, 0x16, 0x08, 0x00, 0x35, 0xe0, 0x97, 0x40, 0xf9, + 0xe1, 0x23, 0x04, 0x91, 0x42, 0x1f, 0x80, 0x52, 0x53, 0x1d, 0x00, 0x94, + 0xf5, 0x03, 0x00, 0x2a, 0x21, 0xf6, 0xff, 0x97, 0x00, 0x1c, 0x00, 0x12, + 0xbf, 0x6a, 0x08, 0x71, 0x04, 0x08, 0x40, 0x7a, 0x21, 0x08, 0x00, 0x54, + 0x1c, 0xf6, 0xff, 0x97, 0x1f, 0x1c, 0x00, 0x72, 0x00, 0x1c, 0x00, 0x54, + 0xbf, 0x1a, 0x1c, 0x71, 0x80, 0x07, 0x00, 0x54, 0x75, 0x09, 0x00, 0x35, + 0xe0, 0x0b, 0x41, 0xb9, 0xe1, 0x1b, 0x41, 0xb9, 0x1f, 0x00, 0x01, 0x6b, + 0xa0, 0x26, 0x00, 0x54, 0xe1, 0x1f, 0x41, 0xb9, 0x1f, 0x00, 0x01, 0x6b, + 0x00, 0x2a, 0x00, 0x54, 0xe1, 0x23, 0x41, 0xb9, 0x1f, 0x00, 0x01, 0x6b, + 0xc1, 0x5a, 0x00, 0x54, 0x54, 0x11, 0x00, 0x94, 0xa0, 0x53, 0x00, 0x34, + 0x4e, 0x11, 0x00, 0x94, 0x60, 0x53, 0x00, 0x35, 0xe0, 0x9b, 0x40, 0xf9, + 0x01, 0x00, 0x40, 0x39, 0xe1, 0xff, 0x00, 0xb9, 0xe1, 0x52, 0x00, 0x34, + 0x1f, 0x00, 0x00, 0x39, 0xe0, 0x93, 0x40, 0xb9, 0x00, 0x21, 0x00, 0x35, + 0x7a, 0x00, 0x00, 0x34, 0xe0, 0x6f, 0x40, 0xb9, 0x00, 0x42, 0x00, 0x35, + 0xfe, 0xf5, 0xff, 0x97, 0x1f, 0x1c, 0x00, 0x72, 0x01, 0x5f, 0x00, 0x54, + 0xe1, 0x47, 0x40, 0xf9, 0xe0, 0x03, 0x1b, 0xaa, 0x20, 0x00, 0x3f, 0xd6, + 0xf6, 0x03, 0x00, 0x2a, 0x00, 0x02, 0x00, 0x35, 0xe2, 0x9b, 0x40, 0xf9, + 0x23, 0x00, 0x80, 0x52, 0xe1, 0x03, 0x1b, 0xaa, 0xe0, 0x13, 0x04, 0x91, + 0x43, 0x00, 0x00, 0x39, 0xe2, 0x3f, 0x40, 0xf9, 0x40, 0x00, 0x3f, 0xd6, + 0xf6, 0x03, 0x00, 0x2a, 0xe1, 0x9b, 0x40, 0xf9, 0xe0, 0x07, 0x41, 0xb9, + 0x20, 0x08, 0x00, 0xb9, 0x7a, 0x00, 0x00, 0x34, 0xe0, 0x6f, 0x40, 0xb9, + 0xc0, 0x3f, 0x00, 0x35, 0xf6, 0x38, 0x00, 0x34, 0x15, 0x00, 0x80, 0x52, + 0x1a, 0x00, 0x00, 0x14, 0x16, 0x00, 0xb0, 0x52, 0xe0, 0x03, 0x16, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xdb, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x93, 0x40, 0xb9, 0x00, 0x4f, 0x00, 0x34, + 0x1a, 0x16, 0x00, 0x35, 0xe1, 0x07, 0x41, 0xb9, 0xe2, 0x0b, 0x04, 0x91, + 0xe0, 0x03, 0x18, 0x2a, 0x66, 0x6d, 0x00, 0x94, 0xf5, 0x03, 0x00, 0x2a, + 0x00, 0x01, 0x00, 0x35, 0xe0, 0x0b, 0x44, 0x39, 0x40, 0x4f, 0x00, 0x35, + 0xe1, 0x07, 0x41, 0xb9, 0xe0, 0x03, 0x18, 0x2a, 0xeb, 0x6d, 0x00, 0x94, + 0xf5, 0x03, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x34, 0x14, 0x11, 0x00, 0x94, + 0x80, 0x13, 0x00, 0x34, 0xe0, 0x9b, 0x40, 0xf9, 0x00, 0x00, 0x40, 0x39, + 0xc0, 0x03, 0x00, 0x34, 0xff, 0x0f, 0x04, 0x39, 0x3a, 0x16, 0x00, 0x35, + 0x3f, 0x23, 0x00, 0x71, 0x80, 0x42, 0x00, 0x54, 0x08, 0x0f, 0x00, 0x54, + 0x3f, 0x0f, 0x00, 0x71, 0x40, 0x33, 0x00, 0x54, 0xa9, 0x00, 0x00, 0x54, + 0x3f, 0x23, 0x00, 0x71, 0x20, 0x33, 0x00, 0x54, 0x00, 0x00, 0x80, 0x52, + 0x06, 0x00, 0x00, 0x14, 0x3f, 0x07, 0x00, 0x71, 0xe0, 0x31, 0x00, 0x54, + 0x3f, 0x0b, 0x00, 0x71, 0x61, 0x32, 0x00, 0x54, 0x80, 0x00, 0x80, 0x52, + 0xe1, 0x03, 0x18, 0x2a, 0xe2, 0x0f, 0x04, 0x91, 0x5c, 0x03, 0x00, 0x94, + 0xf9, 0x03, 0x00, 0x2a, 0xe1, 0x0f, 0x44, 0x39, 0x61, 0x3d, 0x00, 0x34, + 0x7a, 0x00, 0x00, 0x34, 0xe0, 0x6f, 0x40, 0xb9, 0xe0, 0x46, 0x00, 0x35, + 0xe0, 0x9b, 0x40, 0xf9, 0x1f, 0x00, 0x00, 0x39, 0xf9, 0x2e, 0x00, 0x35, + 0xf5, 0x01, 0x00, 0x34, 0xfa, 0x00, 0x00, 0x34, 0xe0, 0x6f, 0x40, 0xb9, + 0xa0, 0x00, 0x00, 0x34, 0xa1, 0x6f, 0x80, 0x52, 0x00, 0xa3, 0x00, 0x51, + 0x61, 0x02, 0x01, 0x2a, 0xf7, 0x41, 0x00, 0x94, 0x03, 0x02, 0x00, 0xb0, + 0xe2, 0x03, 0x15, 0x2a, 0xe4, 0x03, 0x18, 0x2a, 0x63, 0x40, 0x3c, 0x91, + 0x81, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x10, 0x42, 0x00, 0x94, + 0x36, 0x07, 0x00, 0x34, 0x00, 0x00, 0xb0, 0x52, 0xdf, 0x02, 0x00, 0x6b, + 0x81, 0x2a, 0x9c, 0x52, 0xc0, 0x29, 0x9c, 0x12, 0xc4, 0x12, 0x41, 0x7a, + 0xc0, 0x02, 0x00, 0x0b, 0xe1, 0x07, 0x9f, 0x1a, 0x1f, 0x08, 0x00, 0x71, + 0xf5, 0x97, 0x9f, 0x1a, 0x35, 0x00, 0x15, 0x0a, 0x7a, 0x09, 0x00, 0x34, + 0xe0, 0x6f, 0x40, 0xb9, 0x20, 0x09, 0x00, 0x34, 0x19, 0xa3, 0x00, 0x51, + 0xe1, 0x70, 0x80, 0x52, 0xe0, 0x03, 0x19, 0x2a, 0x61, 0x02, 0x01, 0x2a, + 0xdd, 0x41, 0x00, 0x94, 0x55, 0x34, 0x00, 0x35, 0x1f, 0x20, 0x03, 0xd5, + 0xe0, 0x93, 0x44, 0x39, 0x60, 0x04, 0x00, 0x34, 0x80, 0x2a, 0x40, 0x39, + 0x20, 0x04, 0x00, 0x35, 0xe0, 0x73, 0x40, 0xb9, 0x14, 0x3c, 0x00, 0x12, + 0xc0, 0x03, 0x00, 0x34, 0x19, 0xa3, 0x00, 0x51, 0xfc, 0xc3, 0x05, 0x91, + 0x1b, 0x00, 0x80, 0x52, 0x80, 0x73, 0x80, 0x52, 0x73, 0x02, 0x00, 0x2a, + 0xf7, 0x3f, 0x00, 0xf9, 0xf7, 0x03, 0x1c, 0xaa, 0xfc, 0x03, 0x19, 0x2a, + 0xf9, 0x03, 0x18, 0x2a, 0xf8, 0x6f, 0x40, 0xb9, 0xf6, 0x93, 0x00, 0xb9, + 0xf6, 0x03, 0x1b, 0x2a, 0xfb, 0x03, 0x13, 0x2a, 0xf3, 0x97, 0x40, 0xb9, + 0x15, 0x02, 0x00, 0xb0, 0xb5, 0x02, 0x3e, 0x91, 0x1f, 0x20, 0x03, 0xd5, + 0x5a, 0x00, 0x00, 0x34, 0x18, 0x20, 0x00, 0x35, 0xe1, 0x03, 0x13, 0x2a, + 0xe0, 0x03, 0x17, 0xaa, 0x36, 0xfe, 0xff, 0x97, 0x60, 0x10, 0x00, 0x35, + 0xd6, 0x06, 0x00, 0x11, 0xf7, 0x22, 0x00, 0x91, 0x9f, 0x22, 0x36, 0x6b, + 0xe8, 0xfe, 0xff, 0x54, 0xf6, 0x93, 0x40, 0xb9, 0xf7, 0x3f, 0x40, 0xf9, + 0xe0, 0x9b, 0x40, 0xf9, 0x01, 0x3c, 0x40, 0x39, 0xe1, 0x0a, 0x00, 0x39, + 0x01, 0x38, 0x40, 0x39, 0xe1, 0x06, 0x00, 0x39, 0x01, 0x34, 0x40, 0x39, + 0xe1, 0x02, 0x00, 0x39, 0x02, 0x40, 0x40, 0x39, 0x01, 0x44, 0x40, 0x39, + 0x00, 0x48, 0x40, 0x39, 0xe0, 0x16, 0x00, 0x39, 0xe0, 0xc3, 0x41, 0x39, + 0xe2, 0x0e, 0x00, 0x39, 0xe1, 0x12, 0x00, 0x39, 0xe0, 0x42, 0x00, 0x39, + 0xe0, 0x03, 0x16, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xfd, 0x7b, 0xdb, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x3f, 0x2b, 0x00, 0x71, + 0x20, 0x24, 0x00, 0x54, 0x3f, 0x2f, 0x00, 0x71, 0xa1, 0x02, 0x00, 0x54, + 0xe0, 0x00, 0x80, 0x52, 0x90, 0xff, 0xff, 0x17, 0xf5, 0xf7, 0xff, 0x34, + 0x00, 0x01, 0x80, 0x52, 0xe4, 0x03, 0x18, 0x2a, 0xe2, 0x03, 0x16, 0x2a, + 0x03, 0x02, 0x00, 0xb0, 0x01, 0x1c, 0x80, 0x52, 0x63, 0x40, 0x3d, 0x91, + 0xb2, 0x41, 0x00, 0x94, 0xe0, 0x93, 0x44, 0x39, 0x40, 0xfb, 0xff, 0x34, + 0xb7, 0xff, 0xff, 0x17, 0xbf, 0x1a, 0x1c, 0x71, 0x41, 0xe4, 0xff, 0x54, + 0xfa, 0xe1, 0xff, 0x34, 0xe0, 0x6f, 0x40, 0xb9, 0xc0, 0x26, 0x00, 0x35, + 0xf6, 0x6f, 0x40, 0xb9, 0x0b, 0xff, 0xff, 0x17, 0x3f, 0x27, 0x00, 0x71, + 0xa1, 0x21, 0x00, 0x54, 0xa0, 0x00, 0x80, 0x52, 0x7a, 0xff, 0xff, 0x17, + 0x73, 0x10, 0x00, 0x94, 0x80, 0xec, 0xff, 0x35, 0xe0, 0x9b, 0x40, 0xf9, + 0x1f, 0x00, 0x00, 0x39, 0x81, 0xff, 0xff, 0x17, 0xe0, 0x6f, 0x40, 0xb9, + 0x00, 0xea, 0xff, 0x34, 0xe0, 0x73, 0x42, 0x39, 0xe1, 0xaf, 0x40, 0xb9, + 0x7a, 0x41, 0x00, 0x94, 0x4c, 0xff, 0xff, 0x17, 0xe2, 0x9b, 0x40, 0xf9, + 0x23, 0x00, 0x80, 0x52, 0xe1, 0x03, 0x1b, 0xaa, 0xe0, 0x13, 0x04, 0x91, + 0x43, 0x00, 0x00, 0x39, 0xa0, 0x02, 0x3f, 0xd6, 0xf6, 0x03, 0x00, 0x2a, + 0xe1, 0x9b, 0x40, 0xf9, 0xe0, 0x07, 0x41, 0xb9, 0x20, 0x08, 0x00, 0xb9, + 0xd6, 0xd4, 0xff, 0x35, 0x20, 0x00, 0x80, 0x52, 0x20, 0x04, 0x00, 0xb9, + 0xe0, 0x93, 0x00, 0xb9, 0xa2, 0xfe, 0xff, 0x17, 0xe0, 0x6f, 0x40, 0xb9, + 0xe0, 0xe9, 0xff, 0x34, 0x02, 0xa3, 0x00, 0x51, 0xc1, 0x68, 0x80, 0x52, + 0xe0, 0x03, 0x02, 0x2a, 0x61, 0x02, 0x01, 0x2a, 0xe2, 0x93, 0x00, 0xb9, + 0x62, 0x41, 0x00, 0x94, 0x3f, 0x23, 0x00, 0x71, 0x80, 0x2b, 0x00, 0x54, + 0xe2, 0x93, 0x40, 0xb9, 0x88, 0x27, 0x00, 0x54, 0x3f, 0x0f, 0x00, 0x71, + 0x20, 0x1c, 0x00, 0x54, 0xa8, 0x26, 0x00, 0x54, 0x3f, 0x07, 0x00, 0x71, + 0x40, 0x1b, 0x00, 0x54, 0x3f, 0x0b, 0x00, 0x71, 0x80, 0xe9, 0xff, 0x54, + 0xe0, 0x0f, 0x44, 0x39, 0xf9, 0x2a, 0x9c, 0x52, 0x20, 0x19, 0x00, 0x34, + 0xe0, 0x03, 0x02, 0x2a, 0x21, 0x6a, 0x80, 0x52, 0x61, 0x02, 0x01, 0x2a, + 0x50, 0x41, 0x00, 0x94, 0x4e, 0xff, 0xff, 0x17, 0x7a, 0x00, 0x00, 0x34, + 0xe0, 0x6f, 0x40, 0xb9, 0xa0, 0x20, 0x00, 0x35, 0xe1, 0x07, 0x41, 0xb9, + 0xe2, 0x0b, 0x04, 0x91, 0xe0, 0x03, 0x18, 0x2a, 0x84, 0x6c, 0x00, 0x94, + 0xf5, 0x03, 0x00, 0x2a, 0xc0, 0xe4, 0xff, 0x35, 0xe0, 0x0b, 0x44, 0x39, + 0xe0, 0x3e, 0x00, 0x35, 0xe1, 0x07, 0x41, 0xb9, 0xe0, 0x03, 0x18, 0x2a, + 0x09, 0x6d, 0x00, 0x94, 0xf5, 0x03, 0x00, 0x2a, 0xe0, 0xe3, 0xff, 0x35, + 0xe0, 0x9b, 0x40, 0xf9, 0x41, 0x00, 0x80, 0x52, 0x01, 0x04, 0x00, 0xb9, + 0xbe, 0xfe, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0xe5, 0x03, 0x19, 0x2a, + 0xe4, 0x03, 0x16, 0x2a, 0xe3, 0x03, 0x15, 0xaa, 0x81, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x54, 0x41, 0x00, 0x94, 0x77, 0xff, 0xff, 0x17, + 0xe1, 0x07, 0x41, 0xb9, 0xe2, 0x0f, 0x41, 0xb9, 0xe0, 0x8b, 0x40, 0xf9, + 0x5f, 0x00, 0x01, 0x6b, 0x41, 0x36, 0x00, 0x54, 0x1f, 0x14, 0x2c, 0x71, + 0x80, 0x0f, 0x00, 0x54, 0xa0, 0x1a, 0x00, 0x35, 0x7a, 0x00, 0x00, 0x34, + 0xe0, 0x6f, 0x40, 0xb9, 0x40, 0x29, 0x00, 0x35, 0xe1, 0xc3, 0x41, 0x39, + 0xe2, 0x03, 0x1b, 0xaa, 0xe3, 0x43, 0x40, 0xf9, 0xe0, 0x23, 0x04, 0x91, + 0x60, 0x00, 0x3f, 0xd6, 0xf5, 0x03, 0x00, 0x2a, 0x80, 0x0d, 0x00, 0x34, + 0xf6, 0x03, 0x15, 0x2a, 0xcb, 0xf4, 0xff, 0x97, 0xe1, 0x07, 0x41, 0xb9, + 0xe0, 0x03, 0x18, 0x2a, 0xe4, 0x6c, 0x00, 0x94, 0xf5, 0x03, 0x00, 0x2a, + 0x40, 0xdf, 0xff, 0x35, 0xe0, 0x9b, 0x40, 0xf9, 0xff, 0xa3, 0x00, 0xb9, + 0x41, 0x00, 0x80, 0x52, 0x01, 0x04, 0x00, 0xb9, 0x98, 0xfe, 0xff, 0x17, + 0xe0, 0x07, 0x41, 0xb9, 0xe1, 0x0f, 0x41, 0xb9, 0x3f, 0x00, 0x00, 0x6b, + 0x61, 0x34, 0x00, 0x54, 0xe0, 0x8b, 0x40, 0xf9, 0xe0, 0x33, 0x00, 0xb4, + 0xe1, 0x93, 0x44, 0x39, 0x21, 0x02, 0x00, 0x34, 0xe1, 0x03, 0x08, 0x91, + 0xe2, 0xc3, 0x06, 0x91, 0x04, 0x14, 0x40, 0xa9, 0x24, 0x94, 0x33, 0xa9, + 0xe1, 0x3b, 0x40, 0xf9, 0x04, 0x14, 0x41, 0xa9, 0x41, 0x0c, 0x21, 0x8b, + 0xe2, 0x03, 0x08, 0x91, 0x44, 0x94, 0x34, 0xa9, 0x04, 0x14, 0x42, 0xa9, + 0x44, 0x94, 0x35, 0xa9, 0x04, 0x18, 0x40, 0xf9, 0xe4, 0xb7, 0x00, 0xf9, + 0xe2, 0x9f, 0x40, 0xf9, 0x22, 0x00, 0x1c, 0xf8, 0xe2, 0x06, 0x00, 0xf9, + 0xe0, 0x73, 0x40, 0xb9, 0xe1, 0x9b, 0x40, 0xf9, 0x00, 0x04, 0x00, 0x11, + 0x00, 0x1c, 0x00, 0x12, 0xe0, 0xff, 0x00, 0xb9, 0x20, 0x30, 0x00, 0x39, + 0xa2, 0xf4, 0xff, 0x97, 0x1f, 0x1c, 0x00, 0x72, 0x01, 0x32, 0x00, 0x54, + 0xe1, 0xf3, 0x43, 0x39, 0xe2, 0x03, 0x1b, 0xaa, 0x84, 0x12, 0x40, 0xf9, + 0xe0, 0x23, 0x04, 0x91, 0x80, 0x00, 0x3f, 0xd6, 0xff, 0x8b, 0x00, 0xf9, + 0xf6, 0x03, 0x00, 0x2a, 0x00, 0x2a, 0x9c, 0x52, 0xdf, 0x02, 0x00, 0x6b, + 0x60, 0x0f, 0x00, 0x54, 0x20, 0x2a, 0x9c, 0x52, 0xdf, 0x02, 0x00, 0x6b, + 0xa0, 0x1c, 0x00, 0x54, 0x76, 0x33, 0x00, 0x35, 0xfa, 0x00, 0x00, 0x34, + 0xe0, 0x6f, 0x40, 0xb9, 0xa0, 0x00, 0x00, 0x34, 0xe0, 0x73, 0x42, 0x39, + 0xe1, 0xdb, 0x40, 0xb9, 0xe0, 0x40, 0x00, 0x94, 0x1f, 0x20, 0x03, 0xd5, + 0xe1, 0xff, 0x40, 0xb9, 0x9f, 0x03, 0x01, 0x6b, 0x69, 0x15, 0x00, 0x54, + 0xe0, 0x9b, 0x40, 0xf9, 0xe1, 0x73, 0x00, 0xb9, 0xe1, 0x00, 0x80, 0x52, + 0xff, 0xff, 0x14, 0x29, 0x01, 0x04, 0x00, 0xb9, 0xe2, 0x3f, 0x40, 0xf9, + 0xe1, 0x03, 0x1b, 0xaa, 0xe0, 0x13, 0x04, 0x91, 0x40, 0x00, 0x3f, 0xd6, + 0xf6, 0x03, 0x00, 0x2a, 0xe1, 0x9b, 0x40, 0xf9, 0xe0, 0x07, 0x41, 0xb9, + 0x20, 0x08, 0x00, 0xb9, 0x7a, 0x00, 0x00, 0x34, 0xe0, 0x6f, 0x40, 0xb9, + 0x00, 0x10, 0x00, 0x35, 0x76, 0xd5, 0xff, 0x35, 0x4d, 0xfe, 0xff, 0x17, + 0xe0, 0x9b, 0x40, 0xf9, 0x41, 0x00, 0x80, 0x52, 0x01, 0x04, 0x00, 0xb9, + 0x3a, 0xc9, 0xff, 0x34, 0xe0, 0x6f, 0x40, 0xb9, 0x80, 0x0e, 0x00, 0x35, + 0x16, 0x00, 0x80, 0x52, 0x45, 0xfe, 0xff, 0x17, 0xe1, 0x03, 0x1b, 0x2a, + 0xe0, 0x03, 0x1c, 0x2a, 0xbf, 0x40, 0x00, 0x94, 0xfe, 0xfe, 0xff, 0x17, + 0x02, 0xa3, 0x00, 0x51, 0xa1, 0x32, 0x80, 0x52, 0xe0, 0x03, 0x02, 0x2a, + 0x61, 0x02, 0x01, 0x2a, 0xb9, 0x40, 0x00, 0x94, 0xfa, 0xfd, 0xff, 0x17, + 0xf6, 0x2a, 0x9c, 0x52, 0x7e, 0xfe, 0xff, 0x17, 0x61, 0xf4, 0xff, 0x97, + 0x1f, 0x1c, 0x00, 0x72, 0x61, 0x30, 0x00, 0x54, 0xff, 0xa3, 0x00, 0xb9, + 0x34, 0xfe, 0xff, 0x17, 0xe1, 0x93, 0x44, 0x39, 0x21, 0x0b, 0x00, 0x34, + 0xe1, 0xa3, 0x40, 0xb9, 0x22, 0x00, 0x80, 0x52, 0xe0, 0x9b, 0x40, 0xf9, + 0x21, 0x04, 0x00, 0x11, 0x21, 0x1c, 0x00, 0x12, 0xe1, 0xa3, 0x00, 0xb9, + 0x01, 0x34, 0x40, 0x39, 0x02, 0x40, 0x00, 0x39, 0x21, 0x04, 0x00, 0x11, + 0x01, 0x34, 0x00, 0x39, 0x7a, 0x00, 0x00, 0x34, 0xe0, 0x6f, 0x40, 0xb9, + 0x60, 0x22, 0x00, 0x35, 0xe0, 0xa3, 0x40, 0xb9, 0x1f, 0x24, 0x00, 0x71, + 0xe8, 0x2a, 0x00, 0x54, 0x4a, 0xf4, 0xff, 0x97, 0x1f, 0x1c, 0x00, 0x72, + 0xc1, 0x2a, 0x00, 0x54, 0xe2, 0x3f, 0x40, 0xf9, 0xe1, 0x03, 0x1b, 0xaa, + 0xe0, 0x13, 0x04, 0x91, 0x40, 0x00, 0x3f, 0xd6, 0xf6, 0x03, 0x00, 0x2a, + 0xe1, 0x9b, 0x40, 0xf9, 0xe0, 0x07, 0x41, 0xb9, 0x20, 0x08, 0x00, 0xb9, + 0x7a, 0x00, 0x00, 0x34, 0xe0, 0x6f, 0x40, 0xb9, 0x80, 0x0b, 0x00, 0x35, + 0x16, 0xce, 0xff, 0x35, 0xe0, 0x9b, 0x40, 0xf9, 0x81, 0x00, 0x80, 0x52, + 0x01, 0x04, 0x00, 0xb9, 0x0f, 0xfe, 0xff, 0x17, 0x7b, 0x0f, 0x00, 0x94, + 0x40, 0x0e, 0x00, 0x35, 0x1f, 0x20, 0x03, 0xd5, 0xf6, 0x03, 0x19, 0x2a, + 0x3a, 0xd1, 0xff, 0x34, 0xe0, 0x6f, 0x40, 0xb9, 0xe0, 0xd0, 0xff, 0x34, + 0x00, 0xa3, 0x00, 0x51, 0xa1, 0x6e, 0x80, 0x52, 0x61, 0x02, 0x01, 0x2a, + 0x81, 0x40, 0x00, 0x94, 0x82, 0xfe, 0xff, 0x17, 0x60, 0x00, 0x80, 0x52, + 0x74, 0xfe, 0xff, 0x17, 0xc0, 0x00, 0x80, 0x52, 0x72, 0xfe, 0xff, 0x17, + 0x40, 0x00, 0x80, 0x52, 0x70, 0xfe, 0xff, 0x17, 0x69, 0x0f, 0x00, 0x94, + 0x80, 0x16, 0x00, 0x35, 0xf6, 0x2a, 0x9c, 0x52, 0xef, 0xff, 0xff, 0x17, + 0xe0, 0x9b, 0x40, 0xf9, 0xe1, 0xff, 0x40, 0xb9, 0xe1, 0x93, 0x00, 0xb9, + 0x21, 0x00, 0x80, 0x52, 0x01, 0x04, 0x00, 0xb9, 0xf3, 0xfd, 0xff, 0x17, + 0xe1, 0xa7, 0x40, 0xb9, 0x22, 0x00, 0x80, 0x52, 0xe0, 0x9b, 0x40, 0xf9, + 0x21, 0x04, 0x00, 0x11, 0x21, 0x1c, 0x00, 0x12, 0xe1, 0xa7, 0x00, 0xb9, + 0x01, 0x38, 0x40, 0x39, 0x02, 0x44, 0x00, 0x39, 0x21, 0x04, 0x00, 0x11, + 0x01, 0x38, 0x00, 0x39, 0x9a, 0x13, 0x00, 0x34, 0xe1, 0x6f, 0x40, 0xb9, + 0x21, 0x18, 0x00, 0x35, 0xe1, 0x9b, 0x40, 0xb9, 0xe2, 0xa7, 0x40, 0xb9, + 0x3f, 0x00, 0x02, 0x6b, 0x89, 0x22, 0x00, 0x54, 0xe1, 0x93, 0x44, 0x39, + 0x81, 0x0a, 0x00, 0x34, 0xe1, 0x97, 0x40, 0xb9, 0xe0, 0xe3, 0x04, 0x91, + 0xd2, 0xfc, 0xff, 0x97, 0xe0, 0x09, 0x00, 0x34, 0xe1, 0xff, 0x40, 0xb9, + 0xe1, 0x73, 0x00, 0xb9, 0xf5, 0x03, 0x00, 0x2a, 0x35, 0xfe, 0xff, 0x17, + 0xe0, 0x73, 0x42, 0x39, 0xe1, 0xbb, 0x40, 0xb9, 0x52, 0x40, 0x00, 0x94, + 0xd4, 0xfd, 0xff, 0x17, 0xe0, 0x73, 0x42, 0x39, 0xe1, 0xbf, 0x40, 0xb9, + 0x4e, 0x40, 0x00, 0x94, 0xd0, 0xfd, 0xff, 0x17, 0xe0, 0x73, 0x42, 0x39, + 0xe1, 0xcb, 0x40, 0xb9, 0x4a, 0x40, 0x00, 0x94, 0x36, 0xc5, 0xff, 0x35, + 0xcb, 0xfd, 0xff, 0x17, 0xe0, 0x73, 0x42, 0x39, 0xe1, 0xc3, 0x40, 0xb9, + 0x45, 0x40, 0x00, 0x94, 0xf9, 0xfe, 0xff, 0x17, 0xe0, 0x73, 0x42, 0x39, + 0xe1, 0xc7, 0x40, 0xb9, 0x41, 0x40, 0x00, 0x94, 0xee, 0xfd, 0xff, 0x17, + 0xe0, 0x73, 0x42, 0x39, 0xe1, 0xcf, 0x40, 0xb9, 0x3d, 0x40, 0x00, 0x94, + 0x36, 0xc0, 0xff, 0x35, 0xc6, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x19, 0x2a, + 0xe1, 0x71, 0x80, 0x52, 0x61, 0x02, 0x01, 0x2a, 0x37, 0x40, 0x00, 0x94, + 0x9e, 0xfe, 0xff, 0x17, 0xe0, 0x73, 0x42, 0x39, 0xe1, 0xeb, 0x40, 0xb9, + 0x33, 0x40, 0x00, 0x94, 0xa2, 0xff, 0xff, 0x17, 0xa3, 0x1e, 0x00, 0x54, + 0xe0, 0x9b, 0x40, 0xf9, 0x01, 0x01, 0x80, 0x52, 0x01, 0x04, 0x00, 0xb9, + 0x7a, 0x09, 0x00, 0x34, 0xe0, 0x6f, 0x40, 0xb9, 0x60, 0x1e, 0x00, 0x35, + 0xe0, 0xff, 0x40, 0xb9, 0x16, 0x00, 0x80, 0x52, 0xe0, 0x73, 0x00, 0xb9, + 0x07, 0xfe, 0xff, 0x17, 0x3f, 0x23, 0x00, 0x71, 0xe0, 0xd9, 0xff, 0x54, + 0x00, 0x00, 0x80, 0x52, 0x19, 0xfe, 0xff, 0x17, 0x3f, 0x2b, 0x00, 0x71, + 0x80, 0xf4, 0xff, 0x54, 0x3f, 0x2f, 0x00, 0x71, 0x80, 0xd0, 0xff, 0x54, + 0x3f, 0x27, 0x00, 0x71, 0xe1, 0xd8, 0xff, 0x54, 0xa0, 0x00, 0x80, 0x52, + 0x11, 0xfe, 0xff, 0x17, 0x0a, 0x0f, 0x00, 0x94, 0x40, 0xc3, 0xff, 0x34, + 0x22, 0x01, 0x80, 0x52, 0x02, 0x00, 0xa8, 0x72, 0xe0, 0x23, 0x04, 0x91, + 0x01, 0x00, 0x80, 0x52, 0xe2, 0x0b, 0x01, 0xb9, 0xf8, 0x0f, 0x01, 0xb9, + 0xff, 0x8b, 0x00, 0xf9, 0xd1, 0x1a, 0x00, 0x94, 0xa0, 0x0a, 0x00, 0x34, + 0xe1, 0x9b, 0x40, 0xf9, 0xf5, 0x03, 0x00, 0x2a, 0x3f, 0x00, 0x00, 0x39, + 0xd9, 0xc1, 0xff, 0x34, 0x83, 0xff, 0xff, 0x17, 0xe0, 0x9b, 0x40, 0xf9, + 0xc1, 0x00, 0x80, 0x52, 0x01, 0x04, 0x00, 0xb9, 0xe1, 0xc3, 0x41, 0x39, + 0x01, 0x30, 0x00, 0x39, 0x2f, 0xff, 0xff, 0x17, 0x20, 0x00, 0x80, 0x52, + 0xf9, 0xfd, 0xff, 0x17, 0xe0, 0x9b, 0x40, 0xf9, 0x22, 0x00, 0x80, 0x52, + 0x01, 0x3c, 0x40, 0x39, 0x02, 0x48, 0x00, 0x39, 0x21, 0x04, 0x00, 0x11, + 0x01, 0x3c, 0x00, 0x39, 0x7a, 0x00, 0x00, 0x34, 0xe0, 0x6f, 0x40, 0xb9, + 0x20, 0x0e, 0x00, 0x35, 0xe0, 0xab, 0x40, 0xb9, 0xa0, 0x15, 0x00, 0x35, + 0xeb, 0x0e, 0x00, 0x94, 0x40, 0x02, 0x00, 0x35, 0x7a, 0x00, 0x00, 0x34, + 0xe0, 0x6f, 0x40, 0xb9, 0xc0, 0x0d, 0x00, 0x35, 0xe0, 0x93, 0x44, 0x39, + 0xa0, 0x00, 0x00, 0x34, 0xe1, 0x97, 0x40, 0xb9, 0xe0, 0xe3, 0x04, 0x91, + 0x66, 0xfc, 0xff, 0x97, 0xa0, 0xf2, 0xff, 0x35, 0xe0, 0x9b, 0x40, 0xf9, + 0xa1, 0x00, 0x80, 0x52, 0x22, 0x00, 0x80, 0x52, 0xe2, 0xab, 0x00, 0xb9, + 0x01, 0x04, 0x00, 0xb9, 0xe1, 0xc3, 0x41, 0x39, 0x01, 0x30, 0x00, 0x39, + 0x0f, 0xff, 0xff, 0x17, 0xd4, 0x0e, 0x00, 0x94, 0xc0, 0xfd, 0xff, 0x35, + 0xe0, 0xff, 0x40, 0xb9, 0x15, 0x00, 0x80, 0x52, 0xe0, 0x73, 0x00, 0xb9, + 0xbf, 0xfd, 0xff, 0x17, 0xe1, 0xb7, 0x40, 0xb9, 0xe0, 0xc3, 0x42, 0x39, + 0xdc, 0x3f, 0x00, 0x94, 0xe1, 0xc3, 0x41, 0x39, 0xe2, 0x03, 0x1b, 0xaa, + 0xe3, 0x43, 0x40, 0xf9, 0xe0, 0x23, 0x04, 0x91, 0x60, 0x00, 0x3f, 0xd6, + 0xf5, 0x03, 0x00, 0x2a, 0xa0, 0x02, 0x00, 0x34, 0xe1, 0xd3, 0x40, 0xb9, + 0xe0, 0xc3, 0x42, 0x39, 0xd2, 0x3f, 0x00, 0x94, 0x7d, 0xf3, 0xff, 0x97, + 0xe0, 0x73, 0x42, 0x39, 0xf6, 0x03, 0x15, 0x2a, 0xe1, 0xd7, 0x40, 0xb9, + 0xcd, 0x3f, 0x00, 0x94, 0xae, 0xfe, 0xff, 0x17, 0x02, 0xa3, 0x00, 0x51, + 0x77, 0xfe, 0xff, 0x17, 0xe1, 0x9b, 0x40, 0xb9, 0xe2, 0xa7, 0x40, 0xb9, + 0x3f, 0x00, 0x02, 0x6b, 0x08, 0xed, 0xff, 0x54, 0xe3, 0xff, 0xff, 0x17, + 0xf9, 0x2a, 0x9c, 0x52, 0xab, 0xff, 0xff, 0x17, 0x76, 0x2a, 0x9c, 0x52, + 0xa1, 0xfd, 0xff, 0x17, 0x6c, 0xf3, 0xff, 0x97, 0x1f, 0x1c, 0x00, 0x72, + 0xc1, 0xfd, 0xff, 0x54, 0xff, 0xa3, 0x00, 0xb9, 0x3f, 0xfd, 0xff, 0x17, + 0x20, 0x00, 0x80, 0x52, 0x7a, 0x1b, 0x00, 0x94, 0xe0, 0x03, 0x15, 0x2a, + 0xa9, 0xff, 0xff, 0x17, 0x15, 0x00, 0x80, 0x52, 0x16, 0x00, 0xb0, 0x52, + 0xba, 0xb2, 0xff, 0x34, 0xe0, 0x6f, 0x40, 0xb9, 0x60, 0xb2, 0xff, 0x34, + 0x02, 0xa3, 0x00, 0x51, 0xc1, 0x3a, 0x80, 0x52, 0xe0, 0x03, 0x02, 0x2a, + 0x61, 0x02, 0x01, 0x2a, 0xae, 0x3f, 0x00, 0x94, 0x8d, 0xfd, 0xff, 0x17, + 0x5a, 0x03, 0x00, 0x34, 0xe0, 0x6f, 0x40, 0xb9, 0x16, 0x00, 0xb0, 0x52, + 0x20, 0xb1, 0xff, 0x34, 0x02, 0xa3, 0x00, 0x51, 0xe1, 0x37, 0x80, 0x52, + 0xe0, 0x03, 0x02, 0x2a, 0x61, 0x02, 0x01, 0x2a, 0xa4, 0x3f, 0x00, 0x94, + 0x83, 0xfd, 0xff, 0x17, 0xe1, 0xdf, 0x40, 0xb9, 0xe0, 0xc3, 0x42, 0x39, + 0xa0, 0x3f, 0x00, 0x94, 0xe0, 0x9b, 0x40, 0xb9, 0xe1, 0xa7, 0x40, 0xb9, + 0x1f, 0x00, 0x01, 0x6b, 0x29, 0x0a, 0x00, 0x54, 0xe0, 0xc3, 0x42, 0x39, + 0xe1, 0xe3, 0x40, 0xb9, 0x99, 0x3f, 0x00, 0x94, 0xe0, 0x93, 0x44, 0x39, + 0xa0, 0xf1, 0xff, 0x34, 0xe0, 0xc3, 0x42, 0x39, 0xe1, 0xf7, 0x40, 0xb9, + 0x94, 0x3f, 0x00, 0x94, 0x37, 0xff, 0xff, 0x17, 0x15, 0x00, 0x80, 0x52, + 0x16, 0x00, 0xb0, 0x52, 0x70, 0xfd, 0xff, 0x17, 0xe0, 0x73, 0x42, 0x39, + 0xe1, 0xe7, 0x40, 0xb9, 0x8d, 0x3f, 0x00, 0x94, 0xeb, 0xfe, 0xff, 0x17, + 0xb6, 0x29, 0x9c, 0x52, 0x6a, 0xfd, 0xff, 0x17, 0xe0, 0x73, 0x42, 0x39, + 0xe1, 0xef, 0x40, 0xb9, 0x87, 0x3f, 0x00, 0x94, 0x8d, 0xff, 0xff, 0x17, + 0xe0, 0xc3, 0x42, 0x39, 0xe1, 0xf3, 0x40, 0xb9, 0x83, 0x3f, 0x00, 0x94, + 0xe0, 0x93, 0x44, 0x39, 0xa0, 0xf2, 0xff, 0x34, 0xe0, 0xc3, 0x42, 0x39, + 0xe1, 0xfb, 0x40, 0xb9, 0x7e, 0x3f, 0x00, 0x94, 0x8d, 0xff, 0xff, 0x17, + 0x3a, 0x01, 0x00, 0x34, 0xe0, 0x6f, 0x40, 0xb9, 0xd6, 0x29, 0x9c, 0x52, + 0x20, 0xab, 0xff, 0x34, 0x02, 0xa3, 0x00, 0x51, 0x61, 0x12, 0x1c, 0x32, + 0xe0, 0x03, 0x02, 0x2a, 0x75, 0x3f, 0x00, 0x94, 0x54, 0xfd, 0xff, 0x17, + 0xf5, 0x03, 0x1a, 0x2a, 0xd6, 0x29, 0x9c, 0x52, 0x51, 0xfd, 0xff, 0x17, + 0x55, 0x00, 0x80, 0x52, 0x4f, 0xfd, 0xff, 0x17, 0x7a, 0xff, 0xff, 0x34, + 0xe0, 0x6f, 0x40, 0xb9, 0xd6, 0x29, 0x9c, 0x52, 0x60, 0xa9, 0xff, 0x34, + 0x02, 0xa3, 0x00, 0x51, 0xc1, 0x48, 0x80, 0x52, 0xe0, 0x03, 0x02, 0x2a, + 0x61, 0x02, 0x01, 0x2a, 0x66, 0x3f, 0x00, 0x94, 0x45, 0xfd, 0xff, 0x17, + 0xe0, 0xff, 0x40, 0xb9, 0xe0, 0x73, 0x00, 0xb9, 0x1a, 0xfa, 0xff, 0x34, + 0xe0, 0x6f, 0x40, 0xb9, 0x16, 0x00, 0xb0, 0x52, 0xe0, 0xa7, 0xff, 0x34, + 0x02, 0xa3, 0x00, 0x51, 0xc1, 0x4b, 0x80, 0x52, 0xe0, 0x03, 0x02, 0x2a, + 0x61, 0x02, 0x01, 0x2a, 0x5a, 0x3f, 0x00, 0x94, 0x39, 0xfd, 0xff, 0x17, + 0x15, 0x00, 0x80, 0x52, 0x16, 0x00, 0xb0, 0x52, 0xda, 0xa6, 0xff, 0x34, + 0xe0, 0x6f, 0x40, 0xb9, 0x80, 0xa6, 0xff, 0x34, 0x02, 0xa3, 0x00, 0x51, + 0x61, 0x5e, 0x80, 0x52, 0xe0, 0x03, 0x02, 0x2a, 0x61, 0x02, 0x01, 0x2a, + 0x4f, 0x3f, 0x00, 0x94, 0x2e, 0xfd, 0xff, 0x17, 0x96, 0x2a, 0x9c, 0x52, + 0x2c, 0xfd, 0xff, 0x17, 0xe0, 0xff, 0x40, 0xb9, 0xe0, 0x73, 0x00, 0xb9, + 0x29, 0xfd, 0xff, 0x17, 0xf6, 0x29, 0x9c, 0x52, 0x27, 0xfd, 0xff, 0x17, + 0x9a, 0xf6, 0xff, 0x34, 0xe0, 0x6f, 0x40, 0xb9, 0x60, 0xf6, 0xff, 0x34, + 0x02, 0xa3, 0x00, 0x51, 0xe1, 0x40, 0x80, 0x52, 0xe0, 0x03, 0x02, 0x2a, + 0x61, 0x02, 0x01, 0x2a, 0x16, 0x00, 0xb0, 0x52, 0x3e, 0x3f, 0x00, 0x94, + 0x1d, 0xfd, 0xff, 0x17, 0xe0, 0xff, 0x40, 0xb9, 0x56, 0x2a, 0x9c, 0x52, + 0xe0, 0x73, 0x00, 0xb9, 0x19, 0xfd, 0xff, 0x17, 0x02, 0xa3, 0x00, 0x51, + 0xe0, 0xff, 0x40, 0xb9, 0x61, 0x58, 0x80, 0x52, 0x61, 0x02, 0x01, 0x2a, + 0xe0, 0x73, 0x00, 0xb9, 0xe0, 0x03, 0x02, 0x2a, 0x32, 0x3f, 0x00, 0x94, + 0x11, 0xfd, 0xff, 0x17, 0x16, 0x00, 0x80, 0x52, 0x11, 0xfe, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0x81, 0x02, 0x00, 0x90, 0x1f, 0x00, 0x00, 0x71, 0xfd, 0x03, 0x00, 0x91, + 0x23, 0xa0, 0x4b, 0xb9, 0x80, 0x02, 0x00, 0x90, 0x02, 0x98, 0x4b, 0xb9, + 0x24, 0x01, 0x80, 0x52, 0x04, 0x00, 0xa8, 0x72, 0xe0, 0x43, 0x00, 0x91, + 0x42, 0x00, 0x83, 0x1a, 0x01, 0x00, 0x80, 0x52, 0xe4, 0x0b, 0x02, 0x29, + 0xff, 0x0f, 0x00, 0xf9, 0xde, 0x19, 0x00, 0x94, 0x60, 0x00, 0x00, 0x35, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe4, 0x17, 0x40, 0xb9, + 0xe2, 0x03, 0x00, 0x2a, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x03, 0x02, 0x00, 0xb0, 0x63, 0xc0, 0x3f, 0x91, 0x34, 0x3f, 0x00, 0x94, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0x00, 0x0e, 0x00, 0x94, 0x20, 0x07, 0x00, 0x34, + 0xe0, 0x02, 0x00, 0xf0, 0x00, 0x80, 0x78, 0x39, 0x00, 0x07, 0x00, 0x34, + 0x60, 0x06, 0x40, 0xb9, 0x34, 0x04, 0x9c, 0x52, 0x1f, 0x1c, 0x00, 0x71, + 0xc8, 0x05, 0x00, 0x54, 0x60, 0x02, 0x40, 0xb9, 0x1f, 0x20, 0x00, 0x71, + 0x68, 0x05, 0x00, 0x54, 0xf5, 0x13, 0x00, 0xf9, 0xf5, 0x02, 0x00, 0xf0, + 0xb5, 0x62, 0x2d, 0x91, 0x1f, 0x20, 0x03, 0xd5, 0xe0, 0x03, 0x15, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0x96, 0x1b, 0x00, 0x94, 0x1f, 0x68, 0x08, 0x71, + 0x80, 0xff, 0xff, 0x54, 0x80, 0x06, 0x00, 0x35, 0x60, 0x12, 0x40, 0x29, + 0x05, 0x2d, 0x80, 0xd2, 0x03, 0x05, 0x80, 0xd2, 0xa1, 0x10, 0x00, 0xb0, + 0x21, 0x80, 0x2d, 0x91, 0xe2, 0x03, 0x04, 0x2a, 0x42, 0x7c, 0x05, 0x9b, + 0x00, 0x08, 0x03, 0x9b, 0x20, 0x00, 0x00, 0x8b, 0x02, 0x70, 0x40, 0x39, + 0x22, 0x04, 0x00, 0x35, 0x66, 0x1e, 0x40, 0xa9, 0x06, 0x1c, 0x00, 0xa9, + 0x24, 0x00, 0x80, 0x52, 0x62, 0x12, 0x40, 0xb9, 0x14, 0x00, 0x80, 0x52, + 0x02, 0x10, 0x00, 0xb9, 0x60, 0x0a, 0x40, 0x29, 0x45, 0x7c, 0x05, 0x9b, + 0x03, 0x14, 0x03, 0x9b, 0x21, 0x00, 0x03, 0x8b, 0x24, 0x70, 0x00, 0x39, + 0xe0, 0x03, 0x15, 0xaa, 0x6f, 0x1b, 0x00, 0x94, 0x40, 0x05, 0x00, 0x35, + 0xe0, 0x02, 0x00, 0xf0, 0x00, 0xe0, 0x2e, 0x91, 0xb7, 0x1a, 0x00, 0x94, + 0x1f, 0x6c, 0x08, 0x71, 0x04, 0x18, 0x40, 0x7a, 0x81, 0x03, 0x00, 0x54, + 0xf5, 0x13, 0x40, 0xf9, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xc2, 0x0d, 0x00, 0x94, + 0xe0, 0xf8, 0xff, 0x35, 0x14, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x03, 0x02, 0x00, 0xd0, 0x02, 0x00, 0x80, 0x52, 0x63, 0x60, 0x01, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0xf4, 0x28, 0x9c, 0x52, + 0xe5, 0x3e, 0x00, 0x94, 0xe4, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, + 0x03, 0x02, 0x00, 0xd0, 0x63, 0xa0, 0x00, 0x91, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xde, 0x3e, 0x00, 0x94, 0xc7, 0xff, 0xff, 0x17, + 0xe2, 0x03, 0x00, 0x2a, 0x03, 0x02, 0x00, 0xd0, 0x63, 0x00, 0x03, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0xd7, 0x3e, 0x00, 0x94, + 0xf5, 0x13, 0x40, 0xf9, 0xdf, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, + 0x03, 0x02, 0x00, 0xd0, 0x63, 0x40, 0x02, 0x91, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xcf, 0x3e, 0x00, 0x94, 0xd1, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0x2a, 0xf4, 0x03, 0x02, 0xaa, + 0xf5, 0x5b, 0x02, 0xa9, 0xf6, 0x03, 0x01, 0x2a, 0x99, 0x0d, 0x00, 0x94, + 0x20, 0x05, 0x00, 0x34, 0xe0, 0x02, 0x00, 0xf0, 0x00, 0x80, 0x78, 0x39, + 0x20, 0x04, 0x00, 0x34, 0xdf, 0x1e, 0x00, 0x71, 0x20, 0x04, 0x9c, 0x52, + 0x62, 0x9a, 0x48, 0x7a, 0xc8, 0x03, 0x00, 0x54, 0xf5, 0x02, 0x00, 0xf0, + 0xb5, 0x62, 0x2d, 0x91, 0xe0, 0x03, 0x15, 0xaa, 0x01, 0x00, 0x80, 0x12, + 0x34, 0x1b, 0x00, 0x94, 0x1f, 0x68, 0x08, 0x71, 0x80, 0xff, 0xff, 0x54, + 0x40, 0x04, 0x00, 0x35, 0xe0, 0x03, 0x16, 0x2a, 0x03, 0x2d, 0x80, 0xd2, + 0x02, 0x05, 0x80, 0xd2, 0xa1, 0x10, 0x00, 0xb0, 0x21, 0x80, 0x2d, 0x91, + 0x00, 0x7c, 0x03, 0x9b, 0x73, 0x02, 0x02, 0x9b, 0x33, 0x00, 0x13, 0x8b, + 0x60, 0x72, 0x40, 0x39, 0x80, 0x02, 0x00, 0x35, 0x9f, 0x02, 0x00, 0x39, + 0xe0, 0x03, 0x15, 0xaa, 0x18, 0x1b, 0x00, 0x94, 0xe0, 0x00, 0x00, 0x34, + 0xe2, 0x03, 0x00, 0x2a, 0x03, 0x02, 0x00, 0xd0, 0x63, 0x40, 0x02, 0x91, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0xa1, 0x3e, 0x00, 0x94, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x6b, 0x0d, 0x00, 0x94, + 0xe0, 0xfa, 0xff, 0x35, 0x00, 0x00, 0x80, 0x52, 0xf9, 0xff, 0xff, 0x17, + 0x20, 0x00, 0x80, 0x52, 0x80, 0x02, 0x00, 0x39, 0x7f, 0x72, 0x00, 0x39, + 0xeb, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0x03, 0x02, 0x00, 0xd0, + 0x63, 0xa0, 0x00, 0x91, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x8e, 0x3e, 0x00, 0x94, 0xd9, 0xff, 0xff, 0x17, 0xe3, 0x02, 0x00, 0xf0, + 0x63, 0x80, 0x78, 0x39, 0x63, 0x00, 0x00, 0x35, 0x00, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x02, 0x00, 0xf0, 0x94, 0x62, 0x2d, 0x91, + 0xf3, 0x03, 0x01, 0x2a, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x00, 0xaa, + 0xf6, 0x03, 0x02, 0x2a, 0xe0, 0x03, 0x14, 0xaa, 0x01, 0x00, 0x80, 0x12, + 0xf8, 0x1a, 0x00, 0x94, 0x1f, 0x68, 0x08, 0x71, 0x80, 0xff, 0xff, 0x54, + 0x20, 0x0c, 0x00, 0x35, 0xd6, 0x09, 0x00, 0x35, 0xa4, 0x10, 0x00, 0xb0, + 0x84, 0x80, 0x2d, 0x91, 0x80, 0xf0, 0x05, 0x91, 0x84, 0x70, 0x1c, 0x91, + 0x02, 0x01, 0x80, 0x52, 0x21, 0x01, 0x80, 0x52, 0x03, 0xa0, 0x05, 0xd1, + 0x62, 0x04, 0x00, 0x29, 0x63, 0xa0, 0x00, 0x91, 0x1f, 0x00, 0x03, 0xeb, + 0xa1, 0xff, 0xff, 0x54, 0x00, 0xa0, 0x05, 0x91, 0x1f, 0x00, 0x04, 0xeb, + 0x21, 0xff, 0xff, 0x54, 0x73, 0x06, 0x00, 0x34, 0xa4, 0x10, 0x00, 0xb0, + 0x84, 0x80, 0x2d, 0x91, 0x89, 0x02, 0x00, 0x90, 0x29, 0x81, 0x2e, 0x91, + 0x88, 0x02, 0x00, 0x90, 0x08, 0x61, 0x2e, 0x91, 0x66, 0x06, 0x00, 0x51, + 0xe1, 0x03, 0x15, 0xaa, 0x02, 0x00, 0x80, 0xd2, 0x07, 0x05, 0x80, 0xd2, + 0x05, 0x2d, 0x80, 0xd2, 0x10, 0x00, 0x00, 0x14, 0xe0, 0x03, 0x00, 0x2a, + 0x2a, 0x08, 0x40, 0xb9, 0x00, 0x7c, 0x07, 0x9b, 0x63, 0x00, 0x05, 0x9b, + 0x83, 0x00, 0x03, 0x8b, 0x6a, 0x14, 0x00, 0xb9, 0x23, 0x00, 0x40, 0xb9, + 0x2a, 0x0c, 0x40, 0xb9, 0x60, 0x00, 0x05, 0x9b, 0x80, 0x00, 0x00, 0x8b, + 0x0a, 0x18, 0x00, 0xb9, 0x42, 0x04, 0x00, 0x91, 0x21, 0x20, 0x00, 0x91, + 0x7f, 0x02, 0x02, 0x6b, 0x09, 0x03, 0x00, 0x54, 0x23, 0x00, 0x40, 0x29, + 0xdf, 0x00, 0x02, 0x6b, 0xe3, 0x03, 0x03, 0x2a, 0xc8, 0xfd, 0xff, 0x54, + 0xe0, 0x03, 0x00, 0x2a, 0xaa, 0x2e, 0x40, 0x29, 0x00, 0x7c, 0x07, 0x9b, + 0x63, 0x00, 0x05, 0x9b, 0x83, 0x00, 0x03, 0x8b, 0x6a, 0x14, 0x00, 0xb9, + 0x2a, 0x00, 0x40, 0xb9, 0xe3, 0x03, 0x0a, 0x2a, 0x60, 0x00, 0x05, 0x9b, + 0x80, 0x00, 0x00, 0x8b, 0x0b, 0x18, 0x00, 0xb9, 0x16, 0x02, 0x00, 0x35, + 0x0a, 0x01, 0x00, 0xb9, 0x42, 0x04, 0x00, 0x91, 0x21, 0x20, 0x00, 0x91, + 0x7f, 0x02, 0x02, 0x6b, 0x20, 0xc0, 0x5f, 0xb8, 0x00, 0x05, 0x00, 0xb9, + 0x48, 0xfd, 0xff, 0x54, 0xe0, 0x03, 0x14, 0xaa, 0xa5, 0x1a, 0x00, 0x94, + 0x60, 0x04, 0x00, 0x35, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x2a, 0x01, 0x00, 0xb9, 0x20, 0x04, 0x40, 0xb9, 0x20, 0x05, 0x00, 0xb9, + 0xda, 0xff, 0xff, 0x17, 0xdf, 0x06, 0x00, 0x71, 0x01, 0xf8, 0xff, 0x54, + 0xa4, 0x10, 0x00, 0x90, 0x84, 0x80, 0x2d, 0x91, 0x81, 0x70, 0x1c, 0x91, + 0x84, 0xf0, 0x32, 0x91, 0x03, 0x01, 0x80, 0x52, 0x22, 0x01, 0x80, 0x52, + 0x20, 0xa0, 0x05, 0xd1, 0x1f, 0x20, 0x03, 0xd5, 0x03, 0x08, 0x00, 0x29, + 0x00, 0xa0, 0x00, 0x91, 0x1f, 0x00, 0x01, 0xeb, 0xa1, 0xff, 0xff, 0x54, + 0x21, 0xa0, 0x05, 0x91, 0x3f, 0x00, 0x04, 0xeb, 0x01, 0xff, 0xff, 0x54, + 0xb0, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0x03, 0x02, 0x00, 0xb0, + 0x63, 0xa0, 0x00, 0x91, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x13, 0x3e, 0x00, 0x94, 0x9a, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x03, 0x02, 0x00, 0xb0, + 0x63, 0x40, 0x02, 0x91, 0x0c, 0x3e, 0x00, 0x94, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x02, 0x00, 0xd0, 0x60, 0xa2, 0x38, 0x91, 0x5f, 0x18, 0x00, 0x94, + 0xc0, 0x0a, 0x00, 0x35, 0x60, 0x16, 0x47, 0xf9, 0x21, 0x01, 0x80, 0x52, + 0x01, 0x00, 0xa8, 0x72, 0x7e, 0x18, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, + 0xc0, 0x08, 0x00, 0x35, 0x60, 0x16, 0x47, 0xf9, 0x01, 0x07, 0x80, 0x52, + 0x79, 0x18, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, 0xa0, 0x0b, 0x00, 0x35, + 0x60, 0x16, 0x47, 0xf9, 0x21, 0x07, 0x80, 0x52, 0x74, 0x18, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0x20, 0x0a, 0x00, 0x35, 0x01, 0x02, 0x00, 0xb0, + 0xe0, 0x02, 0x00, 0xd0, 0x21, 0xe0, 0x07, 0x91, 0x00, 0x60, 0x2d, 0x91, + 0x3d, 0x1a, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, 0xe0, 0x0f, 0x00, 0x35, + 0xa3, 0x10, 0x00, 0x90, 0x63, 0x80, 0x2d, 0x91, 0x13, 0x00, 0x80, 0x52, + 0xa2, 0x00, 0x80, 0x52, 0xf5, 0x5b, 0x02, 0xa9, 0xf7, 0x1b, 0x00, 0xf9, + 0xe0, 0x03, 0x03, 0xaa, 0x01, 0x00, 0x80, 0x52, 0x01, 0x4c, 0x00, 0x29, + 0x21, 0x04, 0x00, 0x11, 0x1f, 0x20, 0x00, 0x39, 0x3f, 0x24, 0x00, 0x71, + 0x02, 0xfc, 0x01, 0x29, 0x00, 0xa0, 0x00, 0x91, 0x1f, 0x40, 0x1f, 0x38, + 0x21, 0xff, 0xff, 0x54, 0x73, 0x06, 0x00, 0x11, 0x63, 0xa0, 0x05, 0x91, + 0x7f, 0x22, 0x00, 0x71, 0x61, 0xfe, 0xff, 0x54, 0x76, 0x02, 0x00, 0xf0, + 0xd6, 0x42, 0x2e, 0x91, 0xf5, 0x02, 0x00, 0xd0, 0xb5, 0x02, 0x35, 0x91, + 0x37, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x15, 0xaa, 0xc4, 0x0e, 0x40, 0x39, + 0xf4, 0xff, 0xff, 0xf0, 0x94, 0x42, 0x31, 0x91, 0x01, 0x02, 0x00, 0xb0, + 0x03, 0x00, 0x80, 0x52, 0x21, 0xe0, 0x08, 0x91, 0x02, 0x00, 0x80, 0x52, + 0xb4, 0x32, 0x00, 0xf9, 0xa4, 0x6a, 0x00, 0xb9, 0xb7, 0xb2, 0x01, 0x39, + 0x4a, 0x1a, 0x00, 0x94, 0xc1, 0x0e, 0x40, 0x39, 0xb4, 0x6a, 0x00, 0xf9, + 0xf4, 0x03, 0x00, 0x2a, 0xa1, 0xda, 0x00, 0xb9, 0xb7, 0x72, 0x03, 0x39, + 0x00, 0x06, 0x00, 0x34, 0xe2, 0x03, 0x14, 0x2a, 0x03, 0x02, 0x00, 0xb0, + 0x63, 0x60, 0x09, 0x91, 0x41, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0xb6, 0x3d, 0x00, 0x94, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0x07, 0x00, 0x00, 0x14, 0xe2, 0x03, 0x00, 0x2a, 0x03, 0x02, 0x00, 0xb0, + 0x63, 0x80, 0x04, 0x91, 0x41, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0xad, 0x3d, 0x00, 0x94, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf4, 0x03, 0x00, 0x2a, + 0xe2, 0x03, 0x00, 0x2a, 0x41, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0x03, 0x02, 0x00, 0xb0, 0x63, 0xc0, 0x03, 0x91, 0xa2, 0x3d, 0x00, 0x94, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, 0x03, 0x02, 0x00, 0xb0, + 0x63, 0xc0, 0x06, 0x91, 0x41, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0x98, 0x3d, 0x00, 0x94, 0xeb, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x03, 0x02, 0x00, 0xb0, + 0x63, 0xa0, 0x05, 0x91, 0x91, 0x3d, 0x00, 0x94, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xa0, 0xc2, 0x01, 0x91, 0x01, 0x02, 0x00, 0xb0, 0x03, 0x00, 0x80, 0x52, + 0x21, 0x20, 0x09, 0x91, 0x22, 0x00, 0x80, 0x52, 0x0f, 0x1a, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0x40, 0xf9, 0xff, 0x35, 0x02, 0x00, 0x00, 0x90, + 0x01, 0x02, 0x00, 0xb0, 0x42, 0x00, 0x29, 0x91, 0x21, 0x20, 0x0a, 0x91, + 0xe0, 0x02, 0x00, 0xd0, 0x26, 0x00, 0x80, 0x52, 0x00, 0xe0, 0x2e, 0x91, + 0x05, 0x03, 0x80, 0x52, 0x04, 0x00, 0x82, 0x52, 0x03, 0x00, 0x80, 0xd2, + 0x0e, 0x19, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, 0xe0, 0x02, 0x00, 0x35, + 0xe1, 0x02, 0x00, 0xd0, 0x02, 0x00, 0x80, 0x52, 0x60, 0x02, 0x00, 0xf0, + 0x00, 0x40, 0x26, 0x91, 0x37, 0x80, 0x38, 0x39, 0x01, 0x04, 0x80, 0x52, + 0xe5, 0xfe, 0xff, 0x97, 0x60, 0x02, 0x00, 0xf0, 0x22, 0x00, 0x80, 0x52, + 0x00, 0x40, 0x2a, 0x91, 0x01, 0x04, 0x80, 0x52, 0xe0, 0xfe, 0xff, 0x97, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xbd, 0xff, 0xff, 0x17, + 0xe2, 0x03, 0x00, 0x2a, 0x03, 0x02, 0x00, 0xb0, 0x63, 0x40, 0x08, 0x91, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x63, 0x3d, 0x00, 0x94, + 0xb6, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x13, 0x2a, 0xe2, 0x03, 0x14, 0x2a, + 0x03, 0x02, 0x00, 0xb0, 0x63, 0x80, 0x0a, 0x91, 0x41, 0x00, 0x80, 0x52, + 0x5c, 0x3d, 0x00, 0x94, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xad, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xb8, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x01, 0xaa, + 0xf7, 0x63, 0x03, 0xa9, 0xf9, 0x6b, 0x04, 0xa9, 0xfb, 0x73, 0x05, 0xa9, + 0xe0, 0x0f, 0x00, 0x35, 0x61, 0x02, 0x00, 0xf0, 0x20, 0x60, 0x2e, 0x91, + 0xf3, 0x03, 0x00, 0xaa, 0x3b, 0x98, 0x4b, 0xb9, 0x14, 0x04, 0x40, 0xb9, + 0xe1, 0x03, 0x1b, 0x2a, 0x19, 0x2d, 0x80, 0xd2, 0xe0, 0x03, 0x14, 0x2a, + 0x18, 0x05, 0x80, 0xd2, 0xb7, 0x10, 0x00, 0x90, 0xf7, 0x82, 0x2d, 0x91, + 0x21, 0x7c, 0x19, 0x9b, 0x00, 0x04, 0x18, 0x9b, 0xe0, 0x02, 0x00, 0x8b, + 0x01, 0x80, 0x42, 0x29, 0x61, 0x02, 0x00, 0x29, 0xe2, 0x03, 0x01, 0x2a, + 0xe1, 0x03, 0x00, 0x2a, 0x40, 0x7c, 0x19, 0x9b, 0x20, 0x00, 0x18, 0x9b, + 0xe0, 0x02, 0x00, 0x8b, 0x00, 0x70, 0x40, 0x39, 0x00, 0x03, 0x00, 0x35, + 0x7a, 0x02, 0x00, 0xf0, 0x5a, 0x43, 0x2e, 0x91, 0xfc, 0x83, 0x01, 0x91, + 0x16, 0x7d, 0x80, 0x52, 0x40, 0x03, 0x40, 0x39, 0x40, 0x05, 0x00, 0x34, + 0x60, 0x0a, 0x40, 0x29, 0xe1, 0x03, 0x00, 0x2a, 0x7f, 0x03, 0x00, 0x6b, + 0xe0, 0x03, 0x02, 0x2a, 0x00, 0x0a, 0x00, 0x54, 0x21, 0x7c, 0x19, 0x9b, + 0x00, 0x04, 0x18, 0x9b, 0xe0, 0x02, 0x00, 0x8b, 0x01, 0x80, 0x42, 0x29, + 0x61, 0x02, 0x00, 0x29, 0xe2, 0x03, 0x01, 0x2a, 0xe1, 0x03, 0x00, 0x2a, + 0x40, 0x7c, 0x19, 0x9b, 0x20, 0x00, 0x18, 0x9b, 0xe0, 0x02, 0x00, 0x8b, + 0x00, 0x70, 0x40, 0x39, 0xc0, 0xfd, 0xff, 0x34, 0x16, 0x2d, 0x80, 0xd2, + 0x18, 0x05, 0x80, 0xd2, 0x54, 0x7c, 0x16, 0x9b, 0x21, 0x50, 0x18, 0x9b, + 0xf4, 0x02, 0x01, 0x8b, 0x9f, 0x72, 0x00, 0x39, 0x33, 0x04, 0x00, 0x94, + 0x80, 0x12, 0x00, 0xf9, 0x61, 0x0a, 0x40, 0x29, 0x42, 0x7c, 0x18, 0x9b, + 0x21, 0x08, 0x16, 0x9b, 0xf7, 0x02, 0x01, 0x8b, 0xe0, 0x06, 0x40, 0xa9, + 0xa0, 0x06, 0x00, 0xa9, 0xe0, 0x12, 0x40, 0xb9, 0xa0, 0x12, 0x00, 0xb9, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xfd, 0x7b, 0xc8, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x1c, 0xaa, + 0xff, 0x7f, 0x06, 0xa9, 0xff, 0x7f, 0x07, 0xa9, 0x36, 0xf8, 0xff, 0x97, + 0x60, 0x0a, 0x40, 0x29, 0x81, 0x5b, 0x60, 0xb8, 0x41, 0xfa, 0x17, 0x37, + 0x22, 0xfa, 0xff, 0x35, 0x19, 0x04, 0x00, 0x94, 0xe1, 0x03, 0x00, 0xaa, + 0x62, 0x02, 0x40, 0x29, 0x42, 0x7c, 0x19, 0x9b, 0x00, 0x08, 0x18, 0x9b, + 0xe0, 0x02, 0x00, 0x8b, 0x00, 0x10, 0x40, 0xf9, 0x22, 0x04, 0x00, 0x94, + 0x41, 0x0b, 0x40, 0x79, 0x21, 0x7c, 0x16, 0x1b, 0x1f, 0x40, 0x21, 0xeb, + 0x83, 0xf8, 0xff, 0x54, 0x76, 0x52, 0x40, 0x29, 0x0c, 0x04, 0x00, 0x94, + 0x64, 0x0e, 0x40, 0x29, 0xe2, 0x03, 0x16, 0x2a, 0xe1, 0x03, 0x14, 0x2a, + 0x05, 0x01, 0x80, 0x52, 0x42, 0x7c, 0x19, 0x9b, 0x21, 0x08, 0x18, 0x9b, + 0x99, 0x7c, 0x19, 0x9b, 0xe1, 0x02, 0x01, 0x8b, 0x78, 0x64, 0x18, 0x9b, + 0xf7, 0x02, 0x18, 0x8b, 0x20, 0x10, 0x00, 0xf9, 0xe0, 0x06, 0x40, 0xa9, + 0xa0, 0x06, 0x00, 0xa9, 0xe0, 0x12, 0x40, 0xb9, 0xa5, 0x02, 0x00, 0xb9, + 0xa0, 0x12, 0x00, 0xb9, 0xb3, 0x0b, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, + 0xe0, 0x07, 0x9f, 0x1a, 0xa0, 0x22, 0x00, 0x39, 0xce, 0xff, 0xff, 0x17, + 0x9f, 0x02, 0x02, 0x6b, 0x01, 0xf6, 0xff, 0x54, 0x20, 0x01, 0x80, 0xd2, + 0x00, 0x01, 0xc0, 0xf2, 0xa0, 0x02, 0x00, 0xf9, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xc8, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x61, 0x02, 0x00, 0xf0, 0x20, 0x80, 0x2e, 0x91, + 0xf3, 0x03, 0x00, 0xaa, 0x3b, 0xa0, 0x4b, 0xb9, 0x14, 0x04, 0x40, 0xb9, + 0x82, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb2, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x01, 0xaa, 0xe1, 0xff, 0x00, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x00, 0x2a, 0xff, 0xff, 0x00, 0x39, + 0xff, 0x7f, 0x04, 0xa9, 0xff, 0x7f, 0x05, 0xa9, 0xff, 0x7f, 0x06, 0xa9, + 0xff, 0x7f, 0x07, 0xa9, 0x38, 0x63, 0x00, 0x94, 0xf6, 0xff, 0x40, 0x39, + 0xf6, 0x00, 0x00, 0x34, 0x16, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x16, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xce, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf4, 0x02, 0x00, 0xd0, 0x94, 0x62, 0x2d, 0x91, + 0x1f, 0x20, 0x03, 0xd5, 0xe0, 0x03, 0x14, 0xaa, 0x01, 0x00, 0x80, 0x12, + 0x2a, 0x19, 0x00, 0x94, 0x1f, 0x68, 0x08, 0x71, 0x80, 0xff, 0xff, 0x54, + 0x20, 0x07, 0x00, 0x35, 0xe1, 0x03, 0x13, 0xaa, 0xe0, 0x03, 0x15, 0x2a, + 0x50, 0xff, 0xff, 0x97, 0x80, 0x07, 0x00, 0x35, 0x60, 0x02, 0x40, 0xb9, + 0x1f, 0x24, 0x00, 0x71, 0x80, 0x04, 0x00, 0x54, 0x61, 0x06, 0x40, 0xb9, + 0x3f, 0x20, 0x00, 0x71, 0x20, 0x04, 0x00, 0x54, 0x62, 0x22, 0x40, 0x39, + 0x1f, 0x20, 0x00, 0x71, 0x63, 0x0e, 0x40, 0xb9, 0xe4, 0x17, 0x9f, 0x1a, + 0xe0, 0x07, 0x10, 0x29, 0x40, 0x00, 0x00, 0x52, 0xf5, 0x0b, 0x11, 0x29, + 0x9f, 0x00, 0x00, 0x6a, 0xe3, 0x97, 0x00, 0xb9, 0xc1, 0x08, 0x00, 0x54, + 0xe2, 0x0f, 0x44, 0xa9, 0xe2, 0x8f, 0x09, 0xa9, 0xe0, 0x03, 0x02, 0x91, + 0xe6, 0x1f, 0x45, 0xa9, 0xff, 0x93, 0x00, 0xb9, 0xe4, 0x17, 0x46, 0xa9, + 0xe6, 0x9f, 0x0a, 0xa9, 0xe2, 0x0f, 0x47, 0xa9, 0xe4, 0x97, 0x0b, 0xa9, + 0xe2, 0x8f, 0x0c, 0xa9, 0xff, 0x6f, 0x00, 0xf9, 0xdf, 0x67, 0x00, 0x94, + 0xc0, 0x04, 0x00, 0x34, 0xe2, 0x03, 0x00, 0x2a, 0x03, 0x02, 0x00, 0xb0, + 0xe4, 0x03, 0x15, 0x2a, 0x63, 0xe0, 0x0b, 0x91, 0x36, 0x00, 0x80, 0x52, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x82, 0x3c, 0x00, 0x94, + 0x1f, 0x20, 0x03, 0xd5, 0xe0, 0x03, 0x14, 0xaa, 0xef, 0x18, 0x00, 0x94, + 0xc0, 0xf8, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x03, 0x02, 0x00, 0xb0, 0x63, 0x40, 0x02, 0x91, + 0x78, 0x3c, 0x00, 0x94, 0xe0, 0x03, 0x16, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xce, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe2, 0x03, 0x00, 0x2a, 0x03, 0x02, 0x00, 0xb0, 0x63, 0xa0, 0x00, 0x91, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x6d, 0x3c, 0x00, 0x94, + 0xc2, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0x03, 0x02, 0x00, 0xb0, + 0x63, 0x20, 0x0b, 0x91, 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0x66, 0x3c, 0x00, 0x94, 0xad, 0xff, 0xff, 0x17, 0xe0, 0x8f, 0x40, 0xb9, + 0x1f, 0x04, 0x00, 0x71, 0x60, 0x00, 0x00, 0x54, 0x36, 0x00, 0x80, 0x52, + 0xe0, 0xff, 0xff, 0x17, 0xe0, 0x83, 0x40, 0xb9, 0x1f, 0x20, 0x00, 0x71, + 0x81, 0xff, 0xff, 0x54, 0xe0, 0x03, 0x15, 0x2a, 0xe2, 0x02, 0x00, 0xd0, + 0x42, 0x00, 0x35, 0x91, 0x03, 0x0e, 0x80, 0xd2, 0x61, 0x02, 0x00, 0xf0, + 0x00, 0x08, 0x03, 0x9b, 0x21, 0x4c, 0x6e, 0x39, 0x09, 0x19, 0x00, 0x94, + 0x60, 0xf9, 0xff, 0x35, 0x36, 0x00, 0x80, 0x52, 0xd2, 0xff, 0xff, 0x17, + 0x60, 0x02, 0x00, 0xf0, 0x00, 0x48, 0x6e, 0x39, 0xe0, 0x97, 0x00, 0xb9, + 0xb8, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, + 0x1c, 0x0b, 0x00, 0x94, 0x80, 0x00, 0x00, 0x35, 0x94, 0x2c, 0x9c, 0x52, + 0x15, 0x0b, 0x00, 0x94, 0x00, 0x03, 0x00, 0x34, 0xf5, 0x13, 0x00, 0xf9, + 0xf5, 0x02, 0x00, 0xd0, 0xb5, 0x62, 0x2d, 0x91, 0xe0, 0x03, 0x15, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0xba, 0x18, 0x00, 0x94, 0x1f, 0x68, 0x08, 0x71, + 0x80, 0xff, 0xff, 0x54, 0x00, 0x06, 0x00, 0x35, 0x63, 0x02, 0x40, 0x39, + 0x60, 0x2c, 0x9c, 0x52, 0x61, 0x0a, 0x40, 0x39, 0x62, 0x06, 0x40, 0x39, + 0x7f, 0x08, 0x00, 0x71, 0xf4, 0x33, 0x80, 0x1a, 0x5f, 0x08, 0x00, 0x71, + 0x94, 0x32, 0x80, 0x1a, 0x41, 0x01, 0x00, 0x35, 0xf4, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x15, 0xaa, 0x9f, 0x18, 0x00, 0x94, 0x00, 0x03, 0x00, 0x35, + 0xf5, 0x13, 0x40, 0xf9, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x61, 0x0e, 0x40, 0x39, + 0x3f, 0x04, 0x00, 0x71, 0xa9, 0xfe, 0xff, 0x54, 0x61, 0x0a, 0x40, 0x79, + 0x82, 0x64, 0x82, 0x52, 0x21, 0x90, 0x01, 0x51, 0x5f, 0x20, 0x21, 0x6b, + 0x03, 0xfe, 0xff, 0x54, 0x14, 0xfe, 0xff, 0x35, 0x60, 0x02, 0x00, 0xf0, + 0x01, 0x40, 0x2e, 0x91, 0x62, 0x02, 0x40, 0xb9, 0x02, 0x90, 0x0b, 0xb9, + 0x60, 0x0a, 0x40, 0x79, 0x20, 0x08, 0x00, 0x79, 0xe0, 0x03, 0x15, 0xaa, + 0x88, 0x18, 0x00, 0x94, 0x40, 0xfd, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x03, 0x02, 0x00, 0xb0, + 0x63, 0x40, 0x02, 0x91, 0x11, 0x3c, 0x00, 0x94, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, 0x03, 0x02, 0x00, 0xb0, + 0x63, 0xa0, 0x00, 0x91, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x06, 0x3c, 0x00, 0x94, 0xcb, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, + 0xd4, 0x0a, 0x00, 0x94, 0x80, 0x00, 0x00, 0x35, 0x94, 0x2c, 0x9c, 0x52, + 0xcd, 0x0a, 0x00, 0x94, 0x80, 0x02, 0x00, 0x34, 0xf4, 0x02, 0x00, 0xd0, + 0x94, 0x62, 0x2d, 0x91, 0x1f, 0x20, 0x03, 0xd5, 0xe0, 0x03, 0x14, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0x72, 0x18, 0x00, 0x94, 0x1f, 0x68, 0x08, 0x71, + 0x80, 0xff, 0xff, 0x54, 0xe0, 0x01, 0x00, 0x35, 0x61, 0x02, 0x00, 0xf0, + 0x22, 0x40, 0x2e, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0x14, 0x00, 0x80, 0x52, + 0x21, 0x90, 0x4b, 0xb9, 0x61, 0x02, 0x00, 0xb9, 0x41, 0x08, 0x40, 0x79, + 0x61, 0x0a, 0x00, 0x79, 0x5a, 0x18, 0x00, 0x94, 0x80, 0x01, 0x00, 0x35, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, 0x03, 0x02, 0x00, 0xb0, + 0x63, 0xa0, 0x00, 0x91, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xdf, 0x3b, 0x00, 0x94, 0xec, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x03, 0x02, 0x00, 0xb0, + 0x63, 0x40, 0x02, 0x91, 0xd8, 0x3b, 0x00, 0x94, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xb6, 0xa9, 0x00, 0x01, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0x75, 0x02, 0x00, 0xf0, 0xb5, 0xa2, 0x2e, 0x91, + 0xf7, 0x63, 0x03, 0xa9, 0x17, 0x02, 0x00, 0xb0, 0xf7, 0x82, 0x12, 0x91, + 0xff, 0x7f, 0x07, 0xa9, 0x38, 0x01, 0x80, 0x52, 0x18, 0x00, 0xa8, 0x72, + 0xff, 0xff, 0x08, 0xa9, 0x36, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x01, 0xa9, + 0x14, 0x00, 0x80, 0x52, 0x13, 0x00, 0x80, 0x52, 0xf9, 0x23, 0x00, 0xf9, + 0xe0, 0x77, 0x00, 0xb9, 0xff, 0x83, 0x00, 0xb9, 0xe0, 0x8f, 0x00, 0xb9, + 0xff, 0x9b, 0x00, 0xb9, 0xe0, 0x63, 0x01, 0x91, 0xb5, 0xff, 0xff, 0x97, + 0xe0, 0x67, 0x41, 0x39, 0xe0, 0x05, 0x00, 0x35, 0x93, 0x03, 0x00, 0x34, + 0xf4, 0x03, 0x00, 0x34, 0xe0, 0x02, 0x00, 0xd0, 0xe1, 0x83, 0x01, 0x91, + 0x82, 0x3e, 0x80, 0x52, 0x00, 0x14, 0x47, 0xf9, 0x6c, 0x16, 0x00, 0x94, + 0xa0, 0x07, 0x00, 0x35, 0xe0, 0x63, 0x40, 0xb9, 0x1f, 0x00, 0x18, 0x6b, + 0x40, 0x0a, 0x00, 0x54, 0x1f, 0xe0, 0x00, 0x71, 0x80, 0x0c, 0x00, 0x54, + 0x1f, 0xe4, 0x00, 0x71, 0x41, 0x0d, 0x00, 0x54, 0xe0, 0x43, 0x42, 0x39, + 0x80, 0x00, 0x00, 0x35, 0xb4, 0x11, 0x00, 0x34, 0x14, 0x00, 0x80, 0x52, + 0x36, 0x00, 0x80, 0x52, 0xa0, 0x02, 0x40, 0x39, 0xe0, 0xfc, 0xff, 0x35, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xca, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe1, 0xc3, 0x01, 0x91, 0xd1, 0xfe, 0xff, 0x97, 0x13, 0x1c, 0x00, 0x12, + 0x74, 0xfc, 0xff, 0x35, 0xe1, 0x23, 0x02, 0x91, 0x20, 0x00, 0x80, 0x52, + 0xcc, 0xfe, 0xff, 0x97, 0x14, 0x1c, 0x00, 0x12, 0xf9, 0x03, 0x13, 0x2a, + 0x73, 0x02, 0x14, 0x2a, 0x73, 0x1e, 0x00, 0x12, 0xb3, 0x02, 0x00, 0x35, + 0x40, 0x01, 0x80, 0x52, 0x2d, 0x17, 0x00, 0x94, 0xa0, 0x02, 0x40, 0x39, + 0x14, 0x00, 0x80, 0x52, 0x00, 0xfa, 0xff, 0x35, 0xe9, 0xff, 0xff, 0x17, + 0x60, 0x02, 0x14, 0x2a, 0x00, 0x1c, 0x00, 0x12, 0x16, 0x04, 0x00, 0x34, + 0x20, 0xfa, 0xff, 0x35, 0xe1, 0xc3, 0x01, 0x91, 0xbb, 0xfe, 0xff, 0x97, + 0x19, 0x1c, 0x00, 0x72, 0x41, 0x0e, 0x00, 0x54, 0xe1, 0x23, 0x02, 0x91, + 0x20, 0x00, 0x80, 0x52, 0xb6, 0xfe, 0xff, 0x97, 0x14, 0x1c, 0x00, 0x12, + 0xf3, 0x03, 0x14, 0x2a, 0xb3, 0xfd, 0xff, 0x34, 0xe0, 0x02, 0x00, 0xd0, + 0xf3, 0x03, 0x19, 0x2a, 0xe1, 0x83, 0x01, 0x91, 0x82, 0x3e, 0x80, 0x52, + 0x00, 0x14, 0x47, 0xf9, 0x31, 0x16, 0x00, 0x94, 0xc0, 0xf8, 0xff, 0x34, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x68, 0x08, 0x71, 0xc1, 0xe0, 0x80, 0x52, + 0x04, 0x10, 0x41, 0x7a, 0xa0, 0xf9, 0xff, 0x54, 0x00, 0x02, 0x80, 0x52, + 0xe3, 0x03, 0x17, 0xaa, 0xa2, 0xfb, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, + 0x6a, 0x3b, 0x00, 0x94, 0xa0, 0x02, 0x40, 0x39, 0xc0, 0xf5, 0xff, 0x35, + 0xc7, 0xff, 0xff, 0x17, 0x40, 0xf6, 0xff, 0x35, 0xe1, 0x23, 0x02, 0x91, + 0x20, 0x00, 0x80, 0x52, 0x9b, 0xfe, 0xff, 0x97, 0x14, 0x1c, 0x00, 0x72, + 0xa1, 0x0a, 0x00, 0x54, 0xe1, 0xc3, 0x01, 0x91, 0x00, 0x00, 0x80, 0x52, + 0x96, 0xfe, 0xff, 0x97, 0x13, 0x1c, 0x00, 0x12, 0xf9, 0x03, 0x13, 0x2a, + 0xcc, 0xff, 0xff, 0x17, 0xe0, 0x77, 0x40, 0xb9, 0xe1, 0x67, 0x40, 0xb9, + 0x1f, 0x00, 0x01, 0x6b, 0xe0, 0x17, 0x9f, 0x1a, 0x60, 0x02, 0x00, 0x6a, + 0x41, 0x05, 0x00, 0x54, 0xe0, 0x8f, 0x40, 0xb9, 0x1f, 0x00, 0x01, 0x6b, + 0xe0, 0x17, 0x9f, 0x1a, 0x80, 0x02, 0x00, 0x6a, 0x61, 0x03, 0x00, 0x54, + 0x00, 0x02, 0x80, 0x52, 0x03, 0x02, 0x00, 0xb0, 0x63, 0xc0, 0x0e, 0x91, + 0xa2, 0xfb, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, 0x4a, 0x3b, 0x00, 0x94, + 0xa0, 0x02, 0x40, 0x39, 0xc0, 0xf1, 0xff, 0x35, 0xa7, 0xff, 0xff, 0x17, + 0xe0, 0xe3, 0x41, 0x39, 0x60, 0xf4, 0xff, 0x35, 0x73, 0x04, 0x00, 0x34, + 0xa0, 0x02, 0x40, 0x39, 0x16, 0x00, 0x80, 0x52, 0x13, 0x00, 0x80, 0x52, + 0xc0, 0xf0, 0xff, 0x35, 0x9f, 0xff, 0xff, 0x17, 0x00, 0x02, 0x80, 0x52, + 0x03, 0x02, 0x00, 0xb0, 0x63, 0xe0, 0x11, 0x91, 0xa2, 0xfb, 0x83, 0x12, + 0x01, 0x1c, 0x80, 0x52, 0x39, 0x3b, 0x00, 0x94, 0xa0, 0x02, 0x40, 0x39, + 0xa0, 0xef, 0xff, 0x35, 0x96, 0xff, 0xff, 0x17, 0xe1, 0x43, 0x42, 0x39, + 0x01, 0xf2, 0xff, 0x35, 0xf4, 0x03, 0x00, 0x2a, 0x03, 0x02, 0x00, 0xb0, + 0x63, 0xc0, 0x0d, 0x91, 0xa2, 0xfb, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x2d, 0x3b, 0x00, 0x94, 0x8a, 0xff, 0xff, 0x17, + 0xe1, 0xe3, 0x41, 0x39, 0xe1, 0xfc, 0xff, 0x35, 0xf3, 0x03, 0x00, 0x2a, + 0x03, 0x02, 0x00, 0xb0, 0x63, 0xc0, 0x0c, 0x91, 0xa2, 0xfb, 0x83, 0x12, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x23, 0x3b, 0x00, 0x94, + 0x80, 0xff, 0xff, 0x17, 0x00, 0x02, 0x80, 0x52, 0x03, 0x02, 0x00, 0xb0, + 0x63, 0xa0, 0x0f, 0x91, 0xa2, 0xfb, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, + 0x1c, 0x3b, 0x00, 0x94, 0xa0, 0x02, 0x40, 0x39, 0x00, 0xec, 0xff, 0x35, + 0x79, 0xff, 0xff, 0x17, 0x00, 0x02, 0x80, 0x52, 0x03, 0x02, 0x00, 0xb0, + 0x63, 0xc0, 0x10, 0x91, 0xa2, 0xfb, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, + 0x13, 0x3b, 0x00, 0x94, 0xa0, 0x02, 0x40, 0x39, 0xe0, 0xea, 0xff, 0x35, + 0x70, 0xff, 0xff, 0x17, 0xf3, 0x03, 0x19, 0x2a, 0x14, 0x00, 0x80, 0x52, + 0x59, 0xff, 0xff, 0x17, 0x13, 0x00, 0x80, 0x52, 0x57, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xe1, 0x02, 0x00, 0xd0, 0x21, 0xc0, 0x38, 0x91, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0x2a, 0x00, 0x0c, 0x80, 0xd2, + 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x14, 0xaa, 0x94, 0x06, 0x00, 0x9b, + 0x16, 0x02, 0x00, 0xb0, 0xd6, 0x82, 0x14, 0x91, 0x93, 0x0c, 0x80, 0x52, + 0x03, 0x00, 0x00, 0x14, 0x73, 0x06, 0x00, 0x71, 0x80, 0x02, 0x00, 0x54, + 0xe0, 0x03, 0x14, 0xaa, 0x21, 0x00, 0x80, 0x52, 0x72, 0x17, 0x00, 0x94, + 0x60, 0xff, 0xff, 0x35, 0xe0, 0x03, 0x15, 0x2a, 0x63, 0xab, 0x00, 0x94, + 0xe0, 0x03, 0x14, 0xaa, 0x61, 0x17, 0x00, 0x94, 0x80, 0x00, 0x00, 0x35, + 0x80, 0x0c, 0x80, 0x52, 0x8e, 0x16, 0x00, 0x94, 0xf1, 0xff, 0xff, 0x17, + 0xe2, 0x03, 0x00, 0x2a, 0xe4, 0x03, 0x15, 0x2a, 0xe3, 0x03, 0x16, 0xaa, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0xe7, 0x3a, 0x00, 0x94, + 0xf7, 0xff, 0xff, 0x17, 0xe4, 0x03, 0x15, 0x2a, 0x03, 0x02, 0x00, 0xb0, + 0xf3, 0x53, 0x41, 0xa9, 0x63, 0x80, 0x13, 0x91, 0xf5, 0x5b, 0x42, 0xa9, + 0x82, 0x40, 0x80, 0x52, 0xfd, 0x7b, 0xc3, 0xa8, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xdc, 0x3a, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, + 0xcf, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x80, 0x52, 0xcb, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0x1f, 0x0c, 0x00, 0x71, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf5, 0x5b, 0x02, 0xa9, + 0xf5, 0x03, 0x00, 0x2a, 0xf6, 0x03, 0x01, 0x2a, 0x68, 0x07, 0x00, 0x54, + 0x21, 0x03, 0x00, 0x35, 0xf4, 0x02, 0x00, 0xd0, 0x80, 0xc2, 0x38, 0x91, + 0xf4, 0x03, 0x15, 0x2a, 0x01, 0x0c, 0x80, 0xd2, 0x93, 0x0c, 0x80, 0x52, + 0x94, 0x02, 0x01, 0x9b, 0x03, 0x00, 0x00, 0x14, 0x73, 0x06, 0x00, 0x71, + 0x80, 0x0b, 0x00, 0x54, 0xe0, 0x03, 0x14, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x38, 0x17, 0x00, 0x94, 0x60, 0xff, 0xff, 0x35, 0xe0, 0x03, 0x15, 0x2a, + 0xc9, 0xaa, 0x00, 0x94, 0xe0, 0x03, 0x14, 0xaa, 0x27, 0x17, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0x20, 0x09, 0x00, 0x35, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x3f, 0x8c, 0x01, 0x71, 0xe9, 0x05, 0x00, 0x54, + 0xf7, 0x1b, 0x00, 0xf9, 0xf8, 0x08, 0x00, 0x94, 0xf4, 0x02, 0x00, 0xd0, + 0x82, 0xc2, 0x38, 0x91, 0xf4, 0x03, 0x15, 0x2a, 0x17, 0x7d, 0x80, 0x52, + 0x01, 0x0c, 0x80, 0xd2, 0x93, 0x0c, 0x80, 0x52, 0x17, 0x7c, 0x17, 0x1b, + 0x94, 0x0a, 0x01, 0x9b, 0x03, 0x00, 0x00, 0x14, 0x73, 0x06, 0x00, 0x71, + 0xa0, 0x07, 0x00, 0x54, 0xe0, 0x03, 0x14, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0x1a, 0x17, 0x00, 0x94, 0x60, 0xff, 0xff, 0x35, 0xe2, 0x03, 0x16, 0x2a, + 0xe1, 0x03, 0x17, 0x2a, 0xe0, 0x03, 0x15, 0x2a, 0xc5, 0xaa, 0x00, 0x94, + 0xe0, 0x03, 0x14, 0xaa, 0x07, 0x17, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0x00, 0x04, 0x00, 0x35, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe4, 0x03, 0x00, 0x2a, 0x03, 0x02, 0x00, 0xb0, + 0x01, 0x02, 0x80, 0x52, 0x63, 0x80, 0x15, 0x91, 0xe0, 0x03, 0x01, 0x2a, + 0x22, 0x00, 0x80, 0x52, 0x33, 0x00, 0x80, 0x52, 0x87, 0x3a, 0x00, 0x94, + 0x56, 0xfa, 0xff, 0x34, 0xd1, 0x08, 0x00, 0x94, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x01, 0x02, 0x80, 0x52, 0x03, 0x02, 0x00, 0xb0, + 0xe0, 0x03, 0x01, 0x2a, 0x63, 0x60, 0x16, 0x91, 0x84, 0x0c, 0x80, 0x52, + 0x22, 0x00, 0x80, 0x52, 0x79, 0x3a, 0x00, 0x94, 0x33, 0x00, 0x80, 0x52, + 0xc3, 0x08, 0x00, 0x94, 0xf2, 0xff, 0xff, 0x17, 0x01, 0x02, 0x80, 0x52, + 0xe4, 0x03, 0x15, 0x2a, 0xe0, 0x03, 0x01, 0x2a, 0xe2, 0x03, 0x13, 0x2a, + 0x03, 0x02, 0x00, 0xb0, 0x63, 0x80, 0x14, 0x91, 0x6f, 0x3a, 0x00, 0x94, + 0xf7, 0x1b, 0x40, 0xf9, 0xb9, 0xff, 0xff, 0x17, 0x01, 0x02, 0x80, 0x52, + 0xe4, 0x03, 0x15, 0x2a, 0xe0, 0x03, 0x01, 0x2a, 0xe2, 0x03, 0x13, 0x2a, + 0x03, 0x02, 0x00, 0xb0, 0x63, 0x80, 0x14, 0x91, 0x66, 0x3a, 0x00, 0x94, + 0xb1, 0xff, 0xff, 0x17, 0xf7, 0x1b, 0x40, 0xf9, 0x01, 0x02, 0x80, 0x52, + 0xe4, 0x03, 0x15, 0x2a, 0xe0, 0x03, 0x01, 0x2a, 0x03, 0x02, 0x00, 0x90, + 0x82, 0x40, 0x80, 0x52, 0x63, 0x80, 0x13, 0x91, 0x93, 0x40, 0x80, 0x52, + 0x5c, 0x3a, 0x00, 0x94, 0xa7, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x02, 0x00, 0xb0, 0x94, 0xc2, 0x38, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0x15, 0x02, 0x00, 0x90, 0xb5, 0x62, 0x17, 0x91, + 0x96, 0x02, 0x06, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0xe1, 0x03, 0x15, 0xaa, + 0x94, 0x82, 0x01, 0x91, 0xa0, 0x16, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0xc0, 0x05, 0x00, 0x35, 0xdf, 0x02, 0x14, 0xeb, 0x21, 0xff, 0xff, 0x54, + 0x77, 0x05, 0x00, 0x94, 0x1f, 0x08, 0x00, 0x71, 0x81, 0x00, 0x00, 0x54, + 0x50, 0x38, 0x00, 0x94, 0x1f, 0x1c, 0x00, 0x72, 0x20, 0x05, 0x00, 0x54, + 0x01, 0x7d, 0x80, 0x52, 0x00, 0x00, 0x80, 0x52, 0x6f, 0xff, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0x80, 0x04, 0x00, 0x35, 0x01, 0xc4, 0x89, 0x52, + 0x20, 0x00, 0x80, 0x52, 0x6a, 0xff, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x00, 0x35, 0xe2, 0xff, 0xff, 0xf0, 0x01, 0x02, 0x00, 0x90, + 0x42, 0x80, 0x38, 0x91, 0x21, 0xe0, 0x17, 0x91, 0xe0, 0x02, 0x00, 0xb0, + 0x26, 0x00, 0x80, 0x52, 0x00, 0xc0, 0x3e, 0x91, 0x05, 0x00, 0x80, 0x52, + 0x04, 0x00, 0x82, 0x52, 0x03, 0x00, 0x80, 0xd2, 0x69, 0x15, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0x40, 0x02, 0x00, 0x35, 0xf3, 0x53, 0x41, 0xa9, + 0xe2, 0xff, 0xff, 0xf0, 0xf5, 0x5b, 0x42, 0xa9, 0x42, 0xc0, 0x38, 0x91, + 0xfd, 0x7b, 0xc3, 0xa8, 0x01, 0x02, 0x00, 0x90, 0xe0, 0x02, 0x00, 0xd0, + 0x21, 0x60, 0x18, 0x91, 0x00, 0xe0, 0x04, 0x91, 0x26, 0x00, 0x80, 0x52, + 0xe5, 0x01, 0x80, 0x52, 0x04, 0x00, 0x82, 0x52, 0x03, 0x00, 0x80, 0xd2, + 0x59, 0x15, 0x00, 0x14, 0x4c, 0x05, 0x00, 0x94, 0x1f, 0x08, 0x00, 0x71, + 0xc0, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x38, 0x00, 0x94, 0xfa, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xe0, 0x73, 0x00, 0x91, 0xff, 0x1f, 0x00, 0xb9, 0xac, 0x70, 0x00, 0x94, + 0xe0, 0x1f, 0x40, 0xb9, 0x60, 0x00, 0x00, 0x35, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xfb, 0x70, 0x00, 0x94, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbd, 0xa9, 0x02, 0x00, 0x00, 0x90, + 0x42, 0xc0, 0x11, 0x91, 0xfd, 0x03, 0x00, 0x91, 0x61, 0x02, 0x00, 0xd0, + 0x24, 0x54, 0x4c, 0xb9, 0x01, 0x00, 0x00, 0x90, 0x21, 0x00, 0x05, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x02, 0x00, 0xd0, 0x94, 0x02, 0x0b, 0x91, + 0xf5, 0x13, 0x00, 0xf9, 0xf5, 0x02, 0x00, 0xd0, 0xb5, 0xe2, 0x0c, 0x91, + 0x03, 0x7d, 0x80, 0x52, 0xf3, 0x03, 0x00, 0x2a, 0x81, 0x32, 0x00, 0xf9, + 0x83, 0x6a, 0x00, 0xb9, 0xa2, 0x32, 0x00, 0xf9, 0xa4, 0x6a, 0x00, 0xb9, + 0x9f, 0xb2, 0x01, 0x39, 0xbf, 0xb2, 0x01, 0x39, 0x72, 0x70, 0x00, 0x94, + 0xe0, 0x03, 0x00, 0x34, 0x61, 0x06, 0x00, 0x51, 0x3f, 0xf8, 0x0f, 0x71, + 0xe8, 0x00, 0x00, 0x54, 0x01, 0x00, 0x80, 0x52, 0x62, 0x26, 0xc1, 0x1a, + 0x22, 0x01, 0x00, 0x37, 0x21, 0x04, 0x00, 0x11, 0x3f, 0x28, 0x00, 0x71, + 0x81, 0xff, 0xff, 0x54, 0x40, 0xe0, 0x81, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x24, 0x7c, 0x7c, 0xd3, 0x62, 0x02, 0x00, 0xd0, 0x42, 0xc0, 0x2e, 0x91, + 0xa5, 0x10, 0x00, 0x90, 0xa3, 0x80, 0x1a, 0x91, 0x46, 0x00, 0x04, 0x8b, + 0xa1, 0xa0, 0x06, 0xb9, 0xe7, 0x02, 0x00, 0xd0, 0x42, 0x68, 0x64, 0xf8, + 0xf3, 0x30, 0x03, 0xb9, 0xc1, 0x04, 0x40, 0xf9, 0x62, 0x84, 0x00, 0xa9, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x01, 0x02, 0x00, 0x90, 0xe0, 0x03, 0x15, 0xaa, + 0x21, 0xe0, 0x18, 0x91, 0x23, 0x00, 0x80, 0x52, 0x02, 0x00, 0x80, 0x52, + 0x51, 0x16, 0x00, 0x94, 0x80, 0xfb, 0xff, 0x35, 0xe0, 0x03, 0x14, 0xaa, + 0x01, 0x02, 0x00, 0x90, 0x23, 0x00, 0x80, 0x52, 0x21, 0x20, 0x19, 0x91, + 0x02, 0x00, 0x80, 0x52, 0x4a, 0x16, 0x00, 0x94, 0xd5, 0xff, 0xff, 0x17, + 0x01, 0x04, 0x00, 0x51, 0x3f, 0xf8, 0x0f, 0x71, 0x28, 0x07, 0x00, 0x54, + 0xa7, 0x10, 0x00, 0x90, 0xe7, 0x80, 0x1a, 0x91, 0x65, 0x02, 0x00, 0xd0, + 0xa5, 0xc0, 0x2e, 0x91, 0x02, 0x00, 0x80, 0x52, 0x03, 0x00, 0x80, 0x52, + 0x88, 0x00, 0x80, 0xd2, 0xe6, 0x04, 0x40, 0xf9, 0x05, 0x00, 0x00, 0x14, + 0x63, 0x04, 0x00, 0x11, 0xa5, 0x40, 0x00, 0x91, 0x7f, 0x28, 0x00, 0x71, + 0xc0, 0x05, 0x00, 0x54, 0x01, 0x24, 0xc3, 0x1a, 0x61, 0xff, 0x07, 0x36, + 0xa6, 0x10, 0x40, 0xa9, 0xdf, 0x00, 0x04, 0xeb, 0xa8, 0x05, 0x00, 0x54, + 0xff, 0x43, 0x00, 0xd1, 0xe1, 0x03, 0x06, 0xaa, 0x1f, 0x20, 0x03, 0xd5, + 0x22, 0x00, 0x40, 0xb9, 0xe2, 0x0f, 0x00, 0xb9, 0xe2, 0x0f, 0x40, 0xb9, + 0x22, 0x44, 0x00, 0xb8, 0x9f, 0x00, 0x01, 0xeb, 0x62, 0xff, 0xff, 0x54, + 0x81, 0x00, 0x06, 0xcb, 0xc2, 0x04, 0x00, 0x91, 0x84, 0x04, 0x00, 0x91, + 0x21, 0xf4, 0x7e, 0x92, 0x5f, 0x00, 0x04, 0xeb, 0x21, 0x10, 0x00, 0x91, + 0x21, 0x90, 0x88, 0x9a, 0x22, 0x00, 0x80, 0x52, 0xc6, 0x00, 0x01, 0x8b, + 0x63, 0x04, 0x00, 0x11, 0xa5, 0x40, 0x00, 0x91, 0x7f, 0x28, 0x00, 0x71, + 0x80, 0x01, 0x00, 0x54, 0x01, 0x24, 0xc3, 0x1a, 0x61, 0xff, 0x07, 0x36, + 0xa6, 0x10, 0x40, 0xa9, 0xdf, 0x00, 0x04, 0xeb, 0xe9, 0xfc, 0xff, 0x54, + 0x63, 0x04, 0x00, 0x11, 0xa5, 0x40, 0x00, 0x91, 0x7f, 0x28, 0x00, 0x71, + 0x22, 0x00, 0x80, 0x52, 0xe1, 0xfe, 0xff, 0x54, 0x1f, 0x20, 0x03, 0xd5, + 0x42, 0x00, 0x00, 0x34, 0xe6, 0x04, 0x00, 0xf9, 0x00, 0x00, 0x80, 0x52, + 0xff, 0x43, 0x00, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0xe0, 0x81, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x42, 0x00, 0x00, 0x34, 0xe6, 0x04, 0x00, 0xf9, + 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x22, 0x00, 0x80, 0x52, + 0xca, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x10, 0x00, 0x90, + 0xa6, 0x80, 0x1a, 0x91, 0xe7, 0x02, 0x00, 0xd0, 0xe3, 0x30, 0x43, 0xb9, + 0xa0, 0xa0, 0x46, 0xb9, 0xff, 0x43, 0x00, 0xd1, 0x60, 0x24, 0xc0, 0x1a, + 0x40, 0x02, 0x00, 0x36, 0x63, 0x02, 0x00, 0xd0, 0x60, 0x50, 0x4c, 0xb9, + 0x40, 0x04, 0x00, 0x34, 0x01, 0x00, 0x80, 0x52, 0xc0, 0x90, 0x40, 0xa9, + 0x04, 0x00, 0x00, 0x14, 0x62, 0x50, 0x4c, 0xb9, 0x5f, 0x00, 0x01, 0x6b, + 0x29, 0x04, 0x00, 0x54, 0x02, 0x00, 0x40, 0xb9, 0x21, 0x04, 0x00, 0x11, + 0xe2, 0x0f, 0x00, 0xb9, 0xe2, 0x0f, 0x40, 0xb9, 0x02, 0x44, 0x00, 0xb8, + 0x1f, 0x00, 0x04, 0xeb, 0xe3, 0xfe, 0xff, 0x54, 0xe3, 0x30, 0x43, 0xb9, + 0xa0, 0xa0, 0x46, 0xb9, 0x41, 0x01, 0x80, 0x52, 0x1f, 0x20, 0x03, 0xd5, + 0x00, 0x04, 0x00, 0x11, 0xe2, 0x03, 0x03, 0x2a, 0x1f, 0x24, 0x00, 0x71, + 0x08, 0x02, 0x00, 0x54, 0x62, 0x24, 0xc0, 0x1a, 0x62, 0x00, 0x00, 0x37, + 0x21, 0x04, 0x00, 0x71, 0x21, 0xff, 0xff, 0x54, 0x02, 0x7c, 0x7c, 0xd3, + 0x61, 0x02, 0x00, 0xd0, 0x21, 0xc0, 0x2e, 0x91, 0xa0, 0xa0, 0x06, 0xb9, + 0x20, 0x00, 0x02, 0x8b, 0x21, 0x68, 0x62, 0xf8, 0x00, 0x04, 0x40, 0xf9, + 0xc1, 0x80, 0x00, 0xa9, 0x00, 0x00, 0x80, 0x52, 0xff, 0x43, 0x00, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x80, 0x52, 0xf1, 0xff, 0xff, 0x17, + 0xc0, 0x04, 0x00, 0xf9, 0x00, 0x00, 0x80, 0x52, 0xff, 0x43, 0x00, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x02, 0x00, 0xd0, + 0x73, 0xe2, 0x0c, 0x91, 0xe0, 0x03, 0x13, 0xaa, 0xe2, 0x15, 0x00, 0x94, + 0x80, 0x00, 0x00, 0x34, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xb9, 0xff, 0xff, 0x97, 0xe0, 0x03, 0x13, 0xaa, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xcd, 0x15, 0x00, 0x14, + 0xfd, 0x7b, 0xbe, 0xa9, 0xe4, 0x03, 0x02, 0xaa, 0xe3, 0x03, 0x01, 0x2a, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0x73, 0x02, 0x00, 0xd0, + 0x73, 0x42, 0x31, 0x91, 0xe2, 0x03, 0x00, 0x2a, 0x01, 0x01, 0x80, 0x52, + 0xe0, 0x03, 0x13, 0xaa, 0x56, 0x03, 0x00, 0x94, 0xe2, 0x02, 0x00, 0xd0, + 0x42, 0xe0, 0x0c, 0x91, 0x61, 0x06, 0x40, 0xb9, 0x41, 0x68, 0x00, 0xb9, + 0x80, 0x00, 0x00, 0x34, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x0b, 0x40, 0xf9, 0xe0, 0x03, 0x02, 0xaa, + 0xfd, 0x7b, 0xc2, 0xa8, 0xce, 0x15, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0xe3, 0x03, 0x01, 0x2a, 0xe4, 0x03, 0x02, 0xaa, 0x01, 0x01, 0x80, 0x52, + 0xe2, 0x03, 0x00, 0x2a, 0x60, 0x02, 0x00, 0xd0, 0x00, 0x40, 0x31, 0x91, + 0x2a, 0x03, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x12, + 0x1f, 0x04, 0x00, 0x71, 0x69, 0x00, 0x00, 0x54, 0x60, 0x00, 0x84, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0xef, 0x6f, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0x2a, 0x00, 0x04, 0x00, 0x51, + 0x1f, 0xf8, 0x0f, 0x71, 0xa9, 0x00, 0x00, 0x54, 0x40, 0xe0, 0x81, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf4, 0x02, 0x00, 0xd0, 0x94, 0xe2, 0x0c, 0x91, 0xe0, 0x03, 0x14, 0xaa, + 0xa2, 0x15, 0x00, 0x94, 0x20, 0xff, 0xff, 0x35, 0xe1, 0x02, 0x00, 0xd0, + 0xe0, 0x03, 0x14, 0xaa, 0x33, 0x30, 0x03, 0xb9, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0x8f, 0x15, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe1, 0x03, 0x00, 0xaa, 0xe0, 0x02, 0x00, 0xd0, + 0x02, 0x30, 0x43, 0xb9, 0x00, 0x00, 0x80, 0x52, 0x22, 0x00, 0x00, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0x89, 0x07, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0x2f, 0xaf, 0x00, 0x94, + 0x61, 0xd0, 0x9b, 0x52, 0x61, 0x63, 0xa8, 0x72, 0x73, 0x7e, 0xa1, 0x9b, + 0x73, 0xfe, 0x72, 0xd3, 0x00, 0x08, 0xd3, 0x9a, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0xeb, 0xe0, 0x87, 0x9f, 0x9a, + 0x20, 0x00, 0x00, 0xcb, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbc, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0xc0, 0x04, 0x00, 0xb4, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0xaa, 0x00, 0x2c, 0x40, 0xb9, + 0x1f, 0x20, 0x00, 0x71, 0xa9, 0x01, 0x00, 0x54, 0x22, 0x61, 0x81, 0x52, + 0x03, 0x02, 0x00, 0x90, 0x63, 0x60, 0x19, 0x91, 0x61, 0x01, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xc6, 0x38, 0x00, 0x94, 0x36, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xe0, 0x03, 0x16, 0x2a, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x80, 0x1e, 0x40, 0xb9, + 0x1f, 0x00, 0x04, 0x71, 0xe8, 0x02, 0x00, 0x54, 0x80, 0x22, 0x40, 0xb9, + 0x1f, 0x00, 0x01, 0x71, 0xa8, 0x0f, 0x00, 0x54, 0x80, 0x36, 0x40, 0xb9, + 0x1f, 0x04, 0x00, 0x71, 0x60, 0x02, 0x00, 0x54, 0x1f, 0x08, 0x00, 0x71, + 0x40, 0x0f, 0x00, 0x54, 0x1f, 0x0c, 0x00, 0x71, 0xe2, 0x61, 0x81, 0x52, + 0x01, 0xfd, 0xff, 0x54, 0x81, 0x0e, 0x40, 0xb9, 0x3f, 0x08, 0x40, 0x71, + 0x89, 0x0e, 0x00, 0x54, 0x82, 0x61, 0x81, 0x52, 0xe3, 0xff, 0xff, 0x17, + 0xf3, 0x53, 0x41, 0xa9, 0x36, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x16, 0x2a, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x42, 0x61, 0x81, 0x52, 0xdb, 0xff, 0xff, 0x17, 0x81, 0x0e, 0x40, 0xb9, + 0x3f, 0x08, 0x40, 0x71, 0x88, 0xfe, 0xff, 0x54, 0x81, 0xe2, 0x40, 0x39, + 0x41, 0x0d, 0x00, 0x35, 0x80, 0x02, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x51, + 0x1f, 0xfc, 0x00, 0x71, 0x88, 0x0f, 0x00, 0x54, 0x1f, 0x20, 0x03, 0xd5, + 0x80, 0x06, 0x40, 0xb9, 0x1f, 0x10, 0x00, 0x71, 0x88, 0x0e, 0x00, 0x54, + 0x80, 0x1a, 0x40, 0xb9, 0x1f, 0x00, 0x20, 0x71, 0xe8, 0x0e, 0x00, 0x54, + 0x80, 0x16, 0x40, 0xb9, 0x62, 0x62, 0x81, 0x52, 0x1f, 0x40, 0x00, 0x71, + 0xe8, 0xf8, 0xff, 0x54, 0x80, 0x32, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x51, + 0x1f, 0xfc, 0x00, 0x71, 0xa8, 0x19, 0x00, 0x54, 0x80, 0xe6, 0x40, 0x39, + 0xa0, 0x00, 0x00, 0x34, 0x80, 0x2a, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x51, + 0x1f, 0x04, 0x00, 0x71, 0x88, 0x1e, 0x00, 0x54, 0x80, 0x3e, 0x40, 0xb9, + 0x1f, 0x00, 0x01, 0x71, 0x08, 0x0d, 0x00, 0x54, 0x73, 0x02, 0x00, 0xd0, + 0x73, 0x62, 0x34, 0x91, 0x02, 0x80, 0x80, 0xd2, 0x01, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x13, 0xaa, 0x2e, 0xf9, 0x00, 0x94, 0x02, 0x80, 0x80, 0xd2, + 0x01, 0x00, 0x80, 0x52, 0x60, 0x02, 0x00, 0xf0, 0x00, 0x80, 0x07, 0x91, + 0x29, 0xf9, 0x00, 0x94, 0x02, 0x80, 0x80, 0xd2, 0x01, 0x00, 0x80, 0x52, + 0x60, 0x02, 0x00, 0xf0, 0x00, 0xa0, 0x1a, 0x91, 0x24, 0xf9, 0x00, 0x94, + 0x02, 0x80, 0x80, 0xd2, 0x01, 0x00, 0x80, 0x52, 0x60, 0x02, 0x00, 0xf0, + 0x00, 0xc0, 0x2d, 0x91, 0x1f, 0xf9, 0x00, 0x94, 0x02, 0x80, 0x80, 0xd2, + 0x01, 0x00, 0x80, 0x52, 0x80, 0x02, 0x00, 0x90, 0x00, 0x20, 0x27, 0x91, + 0x1a, 0xf9, 0x00, 0x94, 0x02, 0x80, 0x80, 0xd2, 0x01, 0x00, 0x80, 0x52, + 0x80, 0x02, 0x00, 0x90, 0x00, 0x00, 0x14, 0x91, 0x15, 0xf9, 0x00, 0x94, + 0x02, 0x80, 0x80, 0xd2, 0x01, 0x00, 0x80, 0x52, 0x80, 0x02, 0x00, 0x90, + 0x00, 0xe0, 0x00, 0x91, 0x10, 0xf9, 0x00, 0x94, 0x02, 0x80, 0x80, 0xd2, + 0x01, 0x00, 0x80, 0x52, 0x80, 0x02, 0x00, 0x90, 0x00, 0x40, 0x3a, 0x91, + 0x0b, 0xf9, 0x00, 0x94, 0x80, 0x02, 0x00, 0xb0, 0x02, 0x80, 0x80, 0xd2, + 0x00, 0x60, 0x0d, 0x91, 0x01, 0x00, 0x80, 0x52, 0x06, 0xf9, 0x00, 0x94, + 0x80, 0xe2, 0x40, 0x39, 0x80, 0x07, 0x00, 0x34, 0x81, 0x06, 0x40, 0xb9, + 0x80, 0x0e, 0x40, 0xb9, 0x82, 0x36, 0x40, 0xb9, 0x5f, 0x04, 0x00, 0x71, + 0x00, 0x7c, 0x01, 0x1b, 0x01, 0x74, 0x7b, 0xd3, 0xc0, 0x17, 0x00, 0x54, + 0x84, 0x0a, 0x40, 0xb9, 0xc3, 0x00, 0x80, 0x52, 0x80, 0x12, 0x40, 0xb9, + 0x75, 0x02, 0x00, 0xd0, 0xb5, 0x62, 0x31, 0x91, 0x5f, 0x08, 0x00, 0x71, + 0x00, 0x7c, 0x04, 0x1b, 0x00, 0x7c, 0x03, 0x1b, 0x00, 0xf0, 0x7d, 0xd3, + 0x40, 0x1b, 0x00, 0x54, 0x5f, 0x0c, 0x00, 0x71, 0x60, 0x1a, 0x00, 0x54, + 0x29, 0x00, 0x80, 0x52, 0xbf, 0x5e, 0x00, 0xf9, 0xb3, 0x00, 0x00, 0x14, + 0x62, 0x61, 0x81, 0x52, 0x72, 0xff, 0xff, 0x17, 0x81, 0x12, 0x40, 0xb9, + 0x3f, 0x04, 0x40, 0x71, 0x28, 0x19, 0x00, 0x54, 0x81, 0xe2, 0x40, 0x39, + 0xa1, 0x00, 0x00, 0x34, 0x81, 0x26, 0x40, 0xb9, 0x21, 0x04, 0x00, 0x51, + 0x3f, 0x04, 0x00, 0x71, 0x88, 0x13, 0x00, 0x54, 0x01, 0x04, 0x00, 0x51, + 0x3f, 0x08, 0x00, 0x71, 0xe8, 0x0e, 0x00, 0x54, 0x81, 0x02, 0x40, 0xb9, + 0x21, 0x04, 0x00, 0x51, 0x3f, 0xfc, 0x00, 0x71, 0x88, 0x01, 0x00, 0x54, + 0x1f, 0x04, 0x00, 0x71, 0x00, 0xf2, 0xff, 0x54, 0x1f, 0x08, 0x00, 0x71, + 0x80, 0x06, 0x40, 0xb9, 0x20, 0x0e, 0x00, 0x54, 0x1f, 0x10, 0x00, 0x71, + 0xc9, 0x0d, 0x00, 0x54, 0x03, 0x02, 0x00, 0x90, 0x63, 0x60, 0x19, 0x91, + 0x22, 0x62, 0x81, 0x52, 0x59, 0xff, 0xff, 0x17, 0x02, 0x62, 0x81, 0x52, + 0x55, 0xff, 0xff, 0x17, 0x42, 0x62, 0x81, 0x52, 0x53, 0xff, 0xff, 0x17, + 0x03, 0x02, 0x00, 0x90, 0x63, 0x00, 0x1a, 0x91, 0xc2, 0x62, 0x81, 0x52, + 0x51, 0xff, 0xff, 0x17, 0x75, 0x02, 0x00, 0xd0, 0xb5, 0x62, 0x31, 0x91, + 0x09, 0x00, 0x80, 0x52, 0xbf, 0xb2, 0x00, 0xb9, 0xbf, 0x5e, 0x00, 0xf9, + 0xbf, 0x7a, 0x05, 0xb9, 0xbf, 0xc2, 0x02, 0xf9, 0xbf, 0x42, 0x0a, 0xb9, + 0xbf, 0x26, 0x05, 0xf9, 0x84, 0x82, 0x42, 0x29, 0x07, 0x40, 0x86, 0xd2, + 0x81, 0xe6, 0x40, 0x39, 0x02, 0x00, 0x82, 0xd2, 0x88, 0x32, 0x40, 0xb9, + 0x05, 0x00, 0x90, 0xd2, 0x83, 0x3e, 0x40, 0xb9, 0x00, 0x78, 0x7d, 0xd3, + 0x00, 0x00, 0x06, 0x91, 0x26, 0x00, 0x80, 0x52, 0xa8, 0x0a, 0x0f, 0xb9, + 0xa7, 0x8a, 0x07, 0xf9, 0xa6, 0x9a, 0x18, 0xb9, 0xa5, 0x52, 0x0c, 0xf9, + 0xa4, 0x62, 0x1d, 0xb9, 0xa0, 0xb6, 0x0e, 0xf9, 0xa3, 0xf2, 0x26, 0xb9, + 0xa2, 0x7e, 0x13, 0xf9, 0x21, 0x08, 0x00, 0x34, 0x81, 0x2a, 0x40, 0xb9, + 0x00, 0x80, 0x87, 0xd2, 0xa1, 0x2a, 0x22, 0xb9, 0xa0, 0x1a, 0x11, 0xf9, + 0x89, 0xe9, 0xff, 0x35, 0x80, 0x02, 0x40, 0xb9, 0xa0, 0xd2, 0x13, 0xb9, + 0x80, 0x36, 0x40, 0xb9, 0x1f, 0x08, 0x00, 0x71, 0xe0, 0x0e, 0x00, 0x54, + 0xc0, 0x0f, 0x00, 0x36, 0x80, 0x0e, 0x40, 0xb9, 0xf7, 0x63, 0x03, 0xa9, + 0x00, 0x74, 0x7d, 0xd3, 0x00, 0x00, 0x06, 0x91, 0xa0, 0xee, 0x09, 0xf9, + 0xf4, 0x03, 0x15, 0xaa, 0x17, 0x00, 0x80, 0xd2, 0x09, 0x00, 0x00, 0x14, + 0x81, 0x56, 0x40, 0xf9, 0xf7, 0x06, 0x00, 0x91, 0x94, 0x22, 0x13, 0x91, + 0x3a, 0x14, 0x00, 0x94, 0xf6, 0x03, 0x00, 0x2a, 0xe0, 0x02, 0x00, 0x35, + 0xff, 0x26, 0x00, 0xf1, 0xe0, 0x05, 0x00, 0x54, 0x82, 0xb2, 0x40, 0xb9, + 0xe0, 0x03, 0x14, 0xaa, 0x81, 0x22, 0x40, 0xf9, 0x96, 0x22, 0x01, 0x91, + 0x01, 0x14, 0x00, 0x94, 0xe2, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x16, 0xaa, + 0x22, 0xfe, 0xff, 0x34, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x03, 0x02, 0x00, 0x90, 0x63, 0xa0, 0x1a, 0x91, 0xd5, 0x37, 0x00, 0x94, + 0x01, 0x99, 0x80, 0xd2, 0xe0, 0x03, 0x16, 0xaa, 0xf5, 0x56, 0x01, 0x9b, + 0xa1, 0x56, 0x40, 0xf9, 0x24, 0x14, 0x00, 0x94, 0xf6, 0x03, 0x00, 0x2a, + 0x00, 0x0d, 0x00, 0x34, 0x03, 0x02, 0x00, 0x90, 0x63, 0x40, 0x1b, 0x91, + 0xe2, 0x03, 0x16, 0x2a, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x36, 0x60, 0x81, 0x52, 0xc7, 0x37, 0x00, 0x94, 0xe0, 0x03, 0x16, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x03, 0x02, 0x00, 0x90, + 0x63, 0x60, 0x19, 0x91, 0x82, 0x62, 0x81, 0x52, 0xf5, 0xfe, 0xff, 0x17, + 0xbf, 0x2a, 0x22, 0xb9, 0xbf, 0x1a, 0x11, 0xf9, 0xc2, 0xff, 0xff, 0x17, + 0xe2, 0x61, 0x81, 0x52, 0xee, 0xfe, 0xff, 0x17, 0x80, 0x0a, 0x40, 0xb9, + 0x1f, 0x20, 0x00, 0x71, 0xc9, 0xe3, 0xff, 0x54, 0x90, 0xff, 0xff, 0x17, + 0x00, 0x79, 0x85, 0xd2, 0xb8, 0x02, 0x00, 0x8b, 0x37, 0x00, 0x80, 0x52, + 0x60, 0x02, 0x5f, 0xb8, 0x80, 0x02, 0x00, 0x34, 0xf4, 0x03, 0x13, 0xaa, + 0x15, 0x00, 0x80, 0x52, 0x07, 0x00, 0x00, 0x14, 0x80, 0x02, 0x00, 0xf9, + 0x94, 0x42, 0x00, 0x91, 0x97, 0x82, 0x1f, 0x38, 0x60, 0x02, 0x5f, 0xb8, + 0xbf, 0x02, 0x00, 0x6b, 0x62, 0x01, 0x00, 0x54, 0x60, 0x02, 0x44, 0xb9, + 0xb5, 0x06, 0x00, 0x11, 0x61, 0x82, 0x5f, 0xf8, 0x86, 0x06, 0x00, 0x94, + 0xc0, 0xfe, 0xff, 0xb5, 0x03, 0x02, 0x00, 0x90, 0x63, 0xe0, 0x1b, 0x91, + 0xc2, 0x60, 0x81, 0x52, 0x61, 0x01, 0x80, 0x52, 0xd3, 0xff, 0xff, 0x17, + 0x73, 0x22, 0x13, 0x91, 0x7f, 0x02, 0x18, 0xeb, 0x21, 0xfd, 0xff, 0x54, + 0xd2, 0xff, 0xff, 0x17, 0x03, 0x02, 0x00, 0x90, 0x63, 0x60, 0x19, 0x91, + 0xc2, 0x61, 0x81, 0x52, 0xcc, 0xfe, 0xff, 0x17, 0x03, 0x02, 0x00, 0x90, + 0x63, 0x60, 0x19, 0x91, 0xa2, 0x62, 0x81, 0x52, 0xc8, 0xfe, 0xff, 0x17, + 0x75, 0x02, 0x00, 0xd0, 0xb5, 0x62, 0x31, 0x91, 0x09, 0x00, 0x80, 0x52, + 0xa1, 0x5e, 0x00, 0xf9, 0x83, 0x82, 0x43, 0x29, 0x81, 0x01, 0x80, 0x52, + 0x42, 0x00, 0x80, 0x52, 0x85, 0x26, 0x40, 0xb9, 0xa2, 0x42, 0x0a, 0xb9, + 0x24, 0x00, 0x80, 0x52, 0x00, 0x7c, 0x03, 0x1b, 0xa5, 0xb2, 0x00, 0xb9, + 0xa4, 0x7a, 0x05, 0xb9, 0x00, 0x00, 0x00, 0x0b, 0x02, 0x7c, 0x7e, 0xd3, + 0xa2, 0x26, 0x05, 0xf9, 0x00, 0x7c, 0xa1, 0x9b, 0xa0, 0xc2, 0x02, 0xf9, + 0x6e, 0xff, 0xff, 0x17, 0x80, 0x12, 0x40, 0xb9, 0xc1, 0x00, 0x80, 0x52, + 0xf7, 0x63, 0x03, 0xa9, 0x00, 0x7c, 0x01, 0x1b, 0x00, 0x00, 0x03, 0x91, + 0x00, 0x00, 0x00, 0x8b, 0xa0, 0xee, 0x09, 0xf9, 0x89, 0xff, 0xff, 0x17, + 0x36, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xbf, 0xee, 0x09, 0xf9, + 0xae, 0xfe, 0xff, 0x17, 0xa2, 0x61, 0x81, 0x52, 0xa5, 0xfe, 0xff, 0x17, + 0x3f, 0x00, 0x00, 0xeb, 0x09, 0x00, 0x80, 0x52, 0x20, 0x20, 0x80, 0x9a, + 0xa0, 0x5e, 0x00, 0xf9, 0xdf, 0xff, 0xff, 0x17, 0x09, 0x00, 0x80, 0x52, + 0xa0, 0x5e, 0x00, 0xf9, 0xdc, 0xff, 0xff, 0x17, 0x36, 0x60, 0x81, 0x52, + 0x9f, 0xff, 0xff, 0x17, 0x5f, 0x00, 0x00, 0xf1, 0x02, 0x18, 0x48, 0x7a, + 0xc8, 0x02, 0x00, 0x54, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf7, 0x63, 0x03, 0xa9, 0xf7, 0x03, 0x00, 0x2a, 0xf3, 0x53, 0x01, 0xa9, + 0x14, 0x99, 0x80, 0xd2, 0xf3, 0x03, 0x00, 0x2a, 0xf4, 0x7e, 0x14, 0x9b, + 0xf5, 0x5b, 0x02, 0xa9, 0x76, 0x02, 0x00, 0xd0, 0xd6, 0x62, 0x31, 0x91, + 0xf5, 0x03, 0x02, 0xaa, 0xd8, 0x02, 0x14, 0x8b, 0x00, 0x61, 0x81, 0x52, + 0x02, 0xb3, 0x40, 0xb9, 0x02, 0x01, 0x00, 0x35, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0x03, 0x18, 0xaa, 0x91, 0x13, 0x00, 0x94, 0x1f, 0x34, 0x08, 0x71, + 0x04, 0x18, 0x40, 0x7a, 0x60, 0x01, 0x00, 0x54, 0x1f, 0x68, 0x08, 0x71, + 0x60, 0xfe, 0xff, 0x54, 0xe2, 0x03, 0x00, 0x2a, 0x03, 0x02, 0x00, 0x90, + 0x63, 0x80, 0x1c, 0x91, 0x00, 0x02, 0x80, 0x52, 0x41, 0x00, 0x80, 0x52, + 0x3e, 0x37, 0x00, 0x94, 0x40, 0x60, 0x81, 0x52, 0xeb, 0xff, 0xff, 0x17, + 0x1f, 0x34, 0x08, 0x71, 0xe1, 0x00, 0x00, 0x54, 0xa0, 0x60, 0x81, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0xfc, 0xff, 0x35, + 0x94, 0x22, 0x01, 0x91, 0xd4, 0x02, 0x14, 0x8b, 0xe0, 0x03, 0x14, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0xaa, 0x13, 0x00, 0x94, 0x1f, 0x68, 0x08, 0x71, + 0x80, 0xff, 0xff, 0x54, 0x20, 0x01, 0x00, 0x34, 0xe2, 0x03, 0x00, 0x2a, + 0x03, 0x02, 0x00, 0x90, 0x63, 0xc0, 0x1d, 0x91, 0x00, 0x02, 0x80, 0x52, + 0x41, 0x00, 0x80, 0x52, 0x25, 0x37, 0x00, 0x94, 0x40, 0x60, 0x81, 0x52, + 0xd2, 0xff, 0xff, 0x17, 0x00, 0x99, 0x80, 0xd2, 0xe0, 0x5a, 0x00, 0x9b, + 0x03, 0xb0, 0x40, 0xb9, 0xc3, 0x03, 0x00, 0xb4, 0xe0, 0x03, 0x18, 0xaa, + 0x01, 0x00, 0x80, 0xd2, 0x04, 0x00, 0x00, 0x14, 0x21, 0x04, 0x00, 0x91, + 0x3f, 0x00, 0x03, 0xeb, 0x00, 0x03, 0x00, 0x54, 0x02, 0x20, 0x43, 0x39, + 0x00, 0x40, 0x00, 0x91, 0x62, 0xff, 0xff, 0x34, 0x02, 0x99, 0x80, 0xd2, + 0x21, 0x30, 0x00, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0xf7, 0x7e, 0x02, 0x9b, + 0xc2, 0x02, 0x17, 0x8b, 0xe1, 0x12, 0x01, 0x8b, 0xc3, 0x02, 0x01, 0x8b, + 0xc1, 0x6a, 0x61, 0xf8, 0x7f, 0x20, 0x00, 0x39, 0xa1, 0x02, 0x00, 0xf9, + 0x41, 0x5c, 0x40, 0xf9, 0xa1, 0x06, 0x00, 0xf9, 0x79, 0x13, 0x00, 0x94, + 0xc0, 0xfb, 0xff, 0x35, 0xb3, 0x12, 0x00, 0xb9, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x03, 0x02, 0x00, 0x90, 0x63, 0x40, 0x1d, 0x91, + 0xe2, 0x60, 0x81, 0x52, 0x61, 0x01, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xfc, 0x36, 0x00, 0x94, 0xe0, 0x03, 0x14, 0xaa, 0x6a, 0x13, 0x00, 0x94, + 0xe0, 0xf9, 0xff, 0x35, 0x40, 0x60, 0x81, 0x52, 0xa6, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0xb4, + 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x03, 0x00, 0xaa, 0x20, 0x00, 0x80, 0x52, 0xf5, 0x5b, 0x02, 0xa9, + 0x96, 0x12, 0x40, 0xb9, 0xdf, 0x22, 0x00, 0x71, 0xe8, 0x02, 0x00, 0x54, + 0xf6, 0x03, 0x16, 0x2a, 0x15, 0x99, 0x80, 0xd2, 0xf7, 0x63, 0x03, 0xa9, + 0x60, 0x02, 0x00, 0xd0, 0x17, 0x60, 0x31, 0x91, 0xd5, 0x7e, 0x15, 0x9b, + 0xb3, 0x22, 0x01, 0x91, 0xf3, 0x02, 0x13, 0x8b, 0xe0, 0x03, 0x13, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0x5c, 0x13, 0x00, 0x94, 0x1f, 0x68, 0x08, 0x71, + 0x80, 0xff, 0xff, 0x54, 0xe0, 0x01, 0x00, 0x34, 0x03, 0x02, 0x00, 0x90, + 0x63, 0x80, 0x1f, 0x91, 0xe2, 0x03, 0x00, 0x2a, 0x00, 0x02, 0x80, 0x52, + 0x41, 0x00, 0x80, 0x52, 0xd7, 0x36, 0x00, 0x94, 0xf7, 0x63, 0x43, 0xa9, + 0x60, 0x60, 0x81, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x99, 0x80, 0xd2, 0xc0, 0x5e, 0x00, 0x9b, + 0x02, 0xb0, 0x40, 0xb9, 0x02, 0x08, 0x00, 0xb4, 0xf8, 0x02, 0x15, 0x8b, + 0x15, 0x00, 0x80, 0xd2, 0xe0, 0x03, 0x18, 0xaa, 0x85, 0x02, 0x40, 0xf9, + 0x04, 0x00, 0x00, 0x14, 0xb5, 0x06, 0x00, 0x91, 0xbf, 0x02, 0x02, 0xeb, + 0xe0, 0x03, 0x00, 0x54, 0x01, 0x60, 0x40, 0xf9, 0x00, 0x40, 0x00, 0x91, + 0x3f, 0x00, 0x05, 0xeb, 0x41, 0xff, 0xff, 0x54, 0x01, 0x99, 0x80, 0xd2, + 0xa0, 0x32, 0x00, 0x91, 0xd6, 0x7e, 0x01, 0x9b, 0xd6, 0x12, 0x00, 0x8b, + 0xe0, 0x02, 0x16, 0x8b, 0x01, 0x20, 0x40, 0x39, 0x01, 0x06, 0x00, 0x35, + 0x21, 0x00, 0x80, 0x52, 0x01, 0x20, 0x00, 0x39, 0x80, 0x12, 0x40, 0xb9, + 0x1f, 0x10, 0x00, 0x71, 0x00, 0x04, 0x00, 0x54, 0x1f, 0x18, 0x00, 0x71, + 0x20, 0x06, 0x00, 0x54, 0xe0, 0x03, 0x13, 0xaa, 0x1f, 0x13, 0x00, 0x94, + 0x40, 0xfa, 0xff, 0x35, 0x9f, 0x02, 0x00, 0xf9, 0xe0, 0x03, 0x18, 0xaa, + 0xe7, 0x12, 0x00, 0x94, 0x60, 0x02, 0x00, 0x35, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x01, 0x99, 0x80, 0xd2, 0xa0, 0x32, 0x00, 0x91, + 0xd6, 0x7e, 0x01, 0x9b, 0xc0, 0x12, 0x00, 0x8b, 0xe0, 0x02, 0x00, 0x8b, + 0x00, 0x20, 0x40, 0x39, 0xc0, 0x02, 0x00, 0x35, 0xe0, 0x03, 0x13, 0xaa, + 0x0c, 0x13, 0x00, 0x94, 0xe0, 0xf7, 0xff, 0x35, 0x80, 0x60, 0x81, 0x52, + 0xf7, 0x63, 0x43, 0xa9, 0xc4, 0xff, 0xff, 0x17, 0x03, 0x02, 0x00, 0x90, + 0x63, 0x20, 0x20, 0x91, 0xe2, 0x03, 0x00, 0x2a, 0xbb, 0xff, 0xff, 0x17, + 0xf7, 0x09, 0x00, 0x94, 0x01, 0x03, 0x80, 0xd2, 0xb5, 0x7e, 0x01, 0x9b, + 0x01, 0x00, 0x15, 0x8b, 0x1f, 0x68, 0x35, 0xb8, 0x3f, 0x04, 0x00, 0xf9, + 0x3f, 0x10, 0x00, 0xb9, 0xdc, 0xff, 0xff, 0x17, 0x00, 0x20, 0x43, 0x39, + 0xa0, 0xfd, 0xff, 0x34, 0x85, 0x02, 0x40, 0xf9, 0x03, 0x02, 0x00, 0x90, + 0x84, 0x12, 0x40, 0xb9, 0x63, 0x60, 0x1e, 0x91, 0x82, 0x60, 0x81, 0x52, + 0x61, 0x01, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x82, 0x36, 0x00, 0x94, + 0xe4, 0xff, 0xff, 0x17, 0xe8, 0x09, 0x00, 0x94, 0xed, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0xf9, + 0xe3, 0x03, 0x00, 0xaa, 0x00, 0x04, 0x00, 0xd1, 0x1f, 0x08, 0x00, 0xf1, + 0xc8, 0x00, 0x00, 0x54, 0x3f, 0x04, 0x40, 0xf1, 0x20, 0x00, 0x80, 0x52, + 0x60, 0x88, 0x43, 0xfa, 0x81, 0x00, 0x00, 0x54, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x3f, 0x08, 0x40, 0xf1, + 0x60, 0x88, 0x42, 0xfa, 0x60, 0xff, 0xff, 0x54, 0x3f, 0x10, 0x40, 0xf1, + 0x60, 0x88, 0x41, 0xfa, 0x00, 0xff, 0xff, 0x54, 0x63, 0x7c, 0x01, 0x9b, + 0x00, 0x00, 0x80, 0x52, 0x63, 0xf4, 0x7e, 0xd3, 0x43, 0x00, 0x00, 0xf9, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x20, 0xf1, + 0x89, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, 0x3f, 0x00, 0x00, 0xf9, + 0xc0, 0x03, 0x5f, 0xd6, 0x02, 0xf0, 0x7d, 0xd3, 0x00, 0x00, 0x80, 0x52, + 0x22, 0x00, 0x00, 0xf9, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x03, 0x00, 0xaa, + 0x1f, 0xfc, 0x0f, 0xf1, 0x89, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, + 0x3f, 0x00, 0x00, 0xf9, 0xc0, 0x03, 0x5f, 0xd6, 0x03, 0x06, 0x80, 0xd2, + 0x00, 0x00, 0x80, 0x52, 0x42, 0x7c, 0x03, 0x9b, 0x22, 0x00, 0x00, 0xf9, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x63, 0x02, 0x00, 0xb0, + 0x63, 0x60, 0x31, 0x91, 0x05, 0x00, 0x80, 0x52, 0x09, 0x00, 0x00, 0x14, + 0x64, 0xb8, 0x4e, 0xf9, 0x63, 0x40, 0x00, 0x91, 0x9f, 0x00, 0x00, 0xf1, + 0x80, 0x10, 0x40, 0xfa, 0x80, 0x01, 0x00, 0x54, 0xa5, 0x04, 0x00, 0x11, + 0xbf, 0x00, 0x01, 0x71, 0xc0, 0x01, 0x00, 0x54, 0x64, 0xf0, 0x49, 0xf9, + 0x9f, 0x00, 0x00, 0xf1, 0x80, 0x10, 0x40, 0xfa, 0xa1, 0xfe, 0xff, 0x54, + 0x25, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x80, 0x52, 0x5f, 0x00, 0x00, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x25, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x80, 0x52, + 0x21, 0x00, 0x80, 0x52, 0x41, 0x00, 0x00, 0x39, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x02, 0x00, 0xb0, 0x00, 0xb0, 0x4e, 0x39, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xe4, 0x03, 0x00, 0x2a, 0x1f, 0x0c, 0x1c, 0x72, + 0x20, 0x3c, 0x00, 0x12, 0x41, 0x3c, 0x00, 0x12, 0x21, 0x01, 0x00, 0x54, + 0x84, 0x0c, 0x7c, 0xd3, 0xe2, 0x01, 0x00, 0xf0, 0x42, 0xa0, 0x28, 0x91, + 0x44, 0x68, 0x64, 0xf8, 0xc4, 0x00, 0x00, 0xb4, 0xe2, 0x03, 0x03, 0xaa, + 0xf0, 0x03, 0x04, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xa0, 0x80, 0x81, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x80, 0x81, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x21, 0x0d, 0x84, 0x52, 0x81, 0x9d, 0xa2, 0x72, 0x1f, 0x00, 0x01, 0x6b, + 0x60, 0x00, 0x00, 0x54, 0x20, 0x80, 0x81, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0xe1, 0x02, 0x00, 0xb0, 0x22, 0x00, 0x80, 0x52, 0x00, 0x00, 0x80, 0x52, + 0x22, 0xb0, 0x0e, 0x39, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xe5, 0x02, 0x00, 0xb0, 0xa4, 0xa0, 0x0e, 0x91, 0x27, 0x3c, 0x00, 0x12, + 0x41, 0x3c, 0x00, 0x12, 0x86, 0x10, 0x40, 0x39, 0xdf, 0x04, 0x00, 0x71, + 0x60, 0x00, 0x00, 0x54, 0x40, 0x80, 0x81, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0xa2, 0xa8, 0x43, 0xb9, 0x5f, 0x24, 0x00, 0x71, 0x68, 0x02, 0x00, 0x54, + 0x84, 0x4c, 0x22, 0x8b, 0x42, 0x04, 0x00, 0x11, 0xa2, 0xa8, 0x03, 0xb9, + 0x1f, 0x0c, 0x1c, 0x72, 0x80, 0x08, 0x00, 0xb9, 0x87, 0x18, 0x00, 0x79, + 0x81, 0x1c, 0x00, 0x79, 0xa1, 0x01, 0x00, 0x54, 0x02, 0x0c, 0x7c, 0xd3, + 0xe0, 0x01, 0x00, 0xf0, 0x00, 0xa0, 0x28, 0x91, 0x00, 0x00, 0x02, 0x8b, + 0x04, 0x04, 0x40, 0xf9, 0x24, 0x01, 0x00, 0xb4, 0xe2, 0x03, 0x03, 0xaa, + 0xe0, 0x03, 0x07, 0x2a, 0xf0, 0x03, 0x04, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x80, 0x81, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0xa0, 0x80, 0x81, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x80, 0x80, 0x81, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x63, 0x3c, 0x00, 0x12, 0x46, 0x3c, 0x00, 0x12, 0xe5, 0x03, 0x00, 0xaa, + 0x7f, 0x00, 0x01, 0x6b, 0xc0, 0x00, 0x03, 0x0b, 0xa8, 0x01, 0x00, 0x54, + 0x1f, 0x00, 0x01, 0x6b, 0x00, 0x81, 0x81, 0x52, 0xc8, 0x01, 0x00, 0x54, + 0xfd, 0x7b, 0xbf, 0xa9, 0x62, 0x3c, 0x40, 0x92, 0xa1, 0x20, 0x26, 0x8b, + 0xfd, 0x03, 0x00, 0x91, 0xe0, 0x03, 0x04, 0xaa, 0x2a, 0xf6, 0x00, 0x94, + 0x00, 0x00, 0x80, 0x52, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x1f, 0x00, 0x01, 0x6b, 0xe0, 0x97, 0x9f, 0x1a, 0x00, 0x1c, 0x30, 0x11, + 0xc0, 0x03, 0x5f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x63, 0x3c, 0x00, 0x12, 0x47, 0x3c, 0x00, 0x12, 0xe6, 0x03, 0x00, 0xaa, + 0x7f, 0x00, 0x01, 0x6b, 0xe0, 0x00, 0x03, 0x0b, 0xa8, 0x01, 0x00, 0x54, + 0x1f, 0x00, 0x01, 0x6b, 0x00, 0x81, 0x81, 0x52, 0xc8, 0x01, 0x00, 0x54, + 0xfd, 0x7b, 0xbf, 0xa9, 0x62, 0x3c, 0x40, 0x92, 0xe1, 0x03, 0x04, 0xaa, + 0xfd, 0x03, 0x00, 0x91, 0xc0, 0x20, 0x27, 0x8b, 0x12, 0xf6, 0x00, 0x94, + 0x00, 0x00, 0x80, 0x52, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x1f, 0x00, 0x01, 0x6b, 0xe0, 0x97, 0x9f, 0x1a, 0x00, 0x1c, 0x30, 0x11, + 0xc0, 0x03, 0x5f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xe6, 0x03, 0x00, 0xaa, 0x81, 0x04, 0x00, 0xb4, 0xe2, 0x04, 0x00, 0xb4, + 0x3f, 0x08, 0x40, 0xf2, 0x03, 0x00, 0x80, 0x12, 0x81, 0x00, 0x00, 0x54, + 0x0b, 0x00, 0x00, 0x14, 0x3f, 0x08, 0x40, 0xf2, 0x20, 0x01, 0x00, 0x54, + 0x24, 0x14, 0x40, 0x38, 0x42, 0x04, 0x00, 0xf1, 0x63, 0x40, 0xc4, 0x1a, + 0x61, 0xff, 0xff, 0x54, 0xe3, 0x03, 0x23, 0x2a, 0x00, 0x00, 0x80, 0x52, + 0xc3, 0x00, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0xe4, 0x03, 0x01, 0xaa, + 0x5f, 0x20, 0x00, 0xf1, 0x69, 0x01, 0x00, 0x54, 0x40, 0x24, 0x00, 0xd1, + 0x00, 0xfc, 0x43, 0xd3, 0x04, 0x04, 0x00, 0x91, 0x24, 0x0c, 0x04, 0x8b, + 0x25, 0x84, 0x40, 0xf8, 0x3f, 0x00, 0x04, 0xeb, 0x63, 0x4c, 0xc5, 0x9a, + 0xa1, 0xff, 0xff, 0x54, 0x42, 0x20, 0x00, 0xd1, 0x42, 0x0c, 0x00, 0xcb, + 0x82, 0x00, 0x02, 0x8b, 0x1f, 0x20, 0x03, 0xd5, 0x81, 0x14, 0x40, 0x38, + 0x5f, 0x00, 0x04, 0xeb, 0x63, 0x40, 0xc1, 0x1a, 0xa1, 0xff, 0xff, 0x54, + 0xe9, 0xff, 0xff, 0x17, 0x01, 0x00, 0x80, 0x12, 0x20, 0x00, 0x80, 0x52, + 0xc1, 0x00, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x03, 0x00, 0x80, 0x52, + 0xe4, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbf, 0xa9, 0x00, 0x20, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0x25, 0x93, 0x00, 0x94, 0x1f, 0x1c, 0x00, 0x72, 0x81, 0x10, 0x00, 0xf0, + 0x20, 0xe0, 0x1a, 0x39, 0x40, 0x01, 0x00, 0x54, 0x00, 0x00, 0x80, 0x52, + 0x8f, 0xa5, 0x00, 0x94, 0x20, 0x00, 0x80, 0x52, 0x8d, 0xa5, 0x00, 0x94, + 0x40, 0x00, 0x80, 0x52, 0x8b, 0xa5, 0x00, 0x94, 0xfd, 0x7b, 0xc1, 0xa8, + 0x60, 0x00, 0x80, 0x52, 0x88, 0xa5, 0x00, 0x14, 0x01, 0x03, 0x80, 0x52, + 0x00, 0x20, 0x80, 0x52, 0x21, 0x93, 0x00, 0x94, 0xf4, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe1, 0x03, 0x00, 0x2a, 0x00, 0x20, 0x80, 0x52, 0x1a, 0x93, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, + 0x00, 0x20, 0x80, 0x52, 0x06, 0x93, 0x00, 0x94, 0xe1, 0x03, 0x00, 0x2a, + 0x00, 0x00, 0x80, 0x52, 0x61, 0x02, 0x00, 0x39, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0xaa, + 0xe0, 0x7f, 0x80, 0x52, 0x97, 0xfb, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0xb1, 0x8c, 0x00, 0x94, 0xb3, 0x00, 0x00, 0x34, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x61, 0x01, 0x80, 0x52, 0x00, 0x20, 0x80, 0x52, 0xf9, 0x92, 0x00, 0x94, + 0xc0, 0xff, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0xfe, 0xff, 0x35, + 0x81, 0x01, 0x80, 0x52, 0x00, 0x20, 0x80, 0x52, 0xf3, 0x92, 0x00, 0x94, + 0xe0, 0x03, 0x14, 0xaa, 0x71, 0xfc, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x00, 0xfe, 0xff, 0x35, 0xc1, 0x01, 0x80, 0x52, 0x00, 0x20, 0x80, 0x52, + 0xec, 0x92, 0x00, 0x94, 0xb3, 0x04, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0x40, 0xfd, 0xff, 0x35, 0xe1, 0x01, 0x80, 0x52, 0x00, 0x20, 0x80, 0x52, + 0xe6, 0x92, 0x00, 0x94, 0x80, 0x4a, 0x40, 0xb9, 0x40, 0x34, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0x60, 0xfc, 0xff, 0x35, 0xa1, 0x04, 0x80, 0x52, + 0x00, 0x20, 0x80, 0x52, 0xdf, 0x92, 0x00, 0x94, 0xda, 0xfa, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0xa0, 0xfb, 0xff, 0x35, 0x7f, 0x08, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0xaa, 0x81, 0x08, 0x00, 0x94, 0xe7, 0x03, 0x00, 0xaa, + 0xe1, 0x01, 0x00, 0xf0, 0xe0, 0x01, 0x00, 0xf0, 0x00, 0xe0, 0x2c, 0x91, + 0x66, 0x12, 0x40, 0xb9, 0x62, 0x0e, 0x40, 0x29, 0x21, 0xa0, 0x2c, 0x91, + 0x64, 0x16, 0x41, 0x29, 0x18, 0x3d, 0x00, 0x94, 0x01, 0x02, 0x80, 0x52, + 0x00, 0x20, 0x80, 0x52, 0xcd, 0x92, 0x00, 0x94, 0x80, 0x42, 0x40, 0xb9, + 0x5f, 0x0f, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0x40, 0xf9, 0xff, 0x35, + 0x21, 0x02, 0x80, 0x52, 0x00, 0x20, 0x80, 0x52, 0xc6, 0x92, 0x00, 0x94, + 0x29, 0x0a, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0x80, 0xf8, 0xff, 0x35, + 0x61, 0x02, 0x80, 0x52, 0x00, 0x20, 0x80, 0x52, 0xc0, 0x92, 0x00, 0x94, + 0x80, 0x4e, 0x40, 0xb9, 0x72, 0x3e, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0xa0, 0xf7, 0xff, 0x35, 0xc1, 0x04, 0x80, 0x52, 0x00, 0x20, 0x80, 0x52, + 0xb9, 0x92, 0x00, 0x94, 0x68, 0x0b, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0xe0, 0xf6, 0xff, 0x35, 0x81, 0x02, 0x80, 0x52, 0x00, 0x20, 0x80, 0x52, + 0xb3, 0x92, 0x00, 0x94, 0x4a, 0x4c, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0x20, 0xf6, 0xff, 0x35, 0x80, 0xe2, 0x40, 0x39, 0xa0, 0x02, 0x00, 0x35, + 0x80, 0xea, 0x40, 0x39, 0x70, 0x68, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0x60, 0xf5, 0xff, 0x35, 0x09, 0x4c, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0x00, 0xf5, 0xff, 0x35, 0xc1, 0x02, 0x80, 0x52, 0x00, 0x20, 0x80, 0x52, + 0xa4, 0x92, 0x00, 0x94, 0x00, 0x00, 0x00, 0x90, 0x00, 0x80, 0x0d, 0x91, + 0xc5, 0xaa, 0x00, 0x94, 0x61, 0x04, 0x80, 0x52, 0x00, 0x20, 0x80, 0x52, + 0x9e, 0x92, 0x00, 0x94, 0xf3, 0x53, 0x41, 0xa9, 0xa0, 0x7f, 0x80, 0x52, + 0xfd, 0x7b, 0xc2, 0xa8, 0xea, 0xfa, 0xff, 0x17, 0xa1, 0x02, 0x80, 0x52, + 0x00, 0x20, 0x80, 0x52, 0x97, 0x92, 0x00, 0x94, 0x0e, 0x64, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0xa0, 0xf2, 0xff, 0x35, 0xe6, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0x2a, + 0x24, 0x08, 0x00, 0x94, 0xe4, 0x03, 0x13, 0x2a, 0xe3, 0x01, 0x00, 0xf0, + 0xf3, 0x0b, 0x40, 0xf9, 0x63, 0xa0, 0x2d, 0x91, 0xfd, 0x7b, 0xc2, 0xa8, + 0x02, 0x00, 0x80, 0x52, 0xc1, 0x01, 0x80, 0x52, 0x40, 0x00, 0x80, 0x52, + 0xd7, 0x34, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x80, 0x52, 0xef, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x08, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, + 0x01, 0x02, 0x80, 0xd2, 0x81, 0x00, 0xc0, 0xf2, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xe0, 0x02, 0x00, 0xb0, 0x13, 0x00, 0x10, 0x91, + 0x01, 0x00, 0x02, 0xf9, 0x03, 0x01, 0x80, 0xd2, 0x02, 0x00, 0x82, 0xd2, + 0x01, 0x00, 0x81, 0xd2, 0x00, 0x08, 0x80, 0xd2, 0x03, 0x00, 0xc4, 0xf2, + 0x02, 0x02, 0xc0, 0xf2, 0x01, 0x20, 0xc0, 0xf2, 0x40, 0x00, 0xc0, 0xf2, + 0x63, 0x8a, 0x00, 0xa9, 0x61, 0x82, 0x01, 0xa9, 0xf5, 0x13, 0x00, 0xf9, + 0x55, 0x00, 0x80, 0x52, 0x75, 0x2a, 0x00, 0xb9, 0x83, 0x03, 0x00, 0x94, + 0x44, 0x04, 0x80, 0xd2, 0xe5, 0x03, 0x00, 0x2a, 0x44, 0x00, 0xc0, 0xf2, + 0x23, 0x20, 0x80, 0x52, 0x02, 0x04, 0xc0, 0xd2, 0xe1, 0x03, 0x16, 0xb2, + 0x20, 0x01, 0x80, 0x52, 0x65, 0x2e, 0x00, 0xb9, 0x64, 0x1a, 0x00, 0xf9, + 0x63, 0x72, 0x00, 0x79, 0x7f, 0xea, 0x00, 0x39, 0x62, 0xc2, 0x03, 0xf8, + 0x61, 0x26, 0x00, 0xf9, 0x39, 0xff, 0xff, 0x97, 0xe0, 0x03, 0x13, 0xaa, + 0xd3, 0xab, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, 0xa0, 0x02, 0x00, 0x34, + 0x01, 0x03, 0x80, 0x52, 0xe0, 0xff, 0x00, 0x91, 0xe1, 0xff, 0x00, 0x39, + 0x35, 0xff, 0xff, 0x97, 0xe5, 0xff, 0x40, 0x39, 0xe4, 0x03, 0x14, 0x2a, + 0xe2, 0x03, 0x14, 0x2a, 0x81, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0xe3, 0x01, 0x00, 0xf0, 0x63, 0xa0, 0x2f, 0x91, 0x99, 0x34, 0x00, 0x94, + 0xe0, 0x03, 0x14, 0x2a, 0xef, 0x07, 0x00, 0x94, 0xb2, 0x0d, 0x00, 0x94, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x13, 0xaa, + 0x33, 0xff, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0x20, 0xfd, 0xff, 0x35, + 0xe0, 0x03, 0x15, 0x2a, 0xcf, 0x07, 0x00, 0x94, 0x40, 0x01, 0x80, 0x52, + 0x19, 0xff, 0xff, 0x97, 0x26, 0x00, 0x80, 0x52, 0x42, 0x01, 0x00, 0xf0, + 0xe1, 0x01, 0x00, 0xf0, 0x42, 0x40, 0x19, 0x91, 0x21, 0x40, 0x2e, 0x91, + 0xe0, 0x02, 0x00, 0xb0, 0x05, 0x01, 0x80, 0x52, 0x00, 0x40, 0x11, 0x91, + 0x04, 0x00, 0x82, 0x52, 0x03, 0x00, 0x80, 0xd2, 0xba, 0x0f, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0x60, 0x00, 0x00, 0x34, 0xd7, 0xff, 0xff, 0x17, + 0x1a, 0x10, 0x00, 0x94, 0xc5, 0x07, 0x00, 0x94, 0xe1, 0x03, 0x00, 0x2a, + 0x20, 0x00, 0x80, 0x52, 0x3f, 0x00, 0x00, 0x6b, 0x61, 0xff, 0xff, 0x54, + 0xe0, 0x03, 0x01, 0x2a, 0x03, 0xff, 0xff, 0x97, 0xe3, 0x01, 0x00, 0xf0, + 0x63, 0xa0, 0x2e, 0x91, 0x02, 0x00, 0x80, 0x52, 0x81, 0x00, 0x80, 0x52, + 0x40, 0x00, 0x80, 0x52, 0x6d, 0x34, 0x00, 0x94, 0x9c, 0xff, 0xff, 0x97, + 0xe4, 0x03, 0x00, 0x2a, 0x02, 0x00, 0x80, 0x52, 0x81, 0x00, 0x80, 0x52, + 0x40, 0x00, 0x80, 0x52, 0xe3, 0x01, 0x00, 0xf0, 0x63, 0x20, 0x2f, 0x91, + 0x65, 0x34, 0x00, 0x94, 0xe0, 0x03, 0x14, 0x2a, 0xbb, 0x07, 0x00, 0x94, + 0x7e, 0x0d, 0x00, 0x94, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xce, 0x0c, 0x00, 0x94, + 0x60, 0x07, 0x00, 0x35, 0xf3, 0x53, 0x01, 0xa9, 0x97, 0x35, 0x00, 0x94, + 0x9a, 0x35, 0x00, 0x94, 0x09, 0x07, 0x00, 0x94, 0x54, 0x11, 0x00, 0xd0, + 0x94, 0x02, 0x00, 0x91, 0x00, 0x00, 0x80, 0x52, 0xe1, 0xfe, 0xff, 0x97, + 0x7c, 0x07, 0x00, 0x94, 0x1b, 0xaa, 0x00, 0x94, 0x72, 0x07, 0x00, 0x94, + 0x5d, 0x32, 0x00, 0x94, 0x74, 0x07, 0x00, 0x94, 0x5f, 0x32, 0x00, 0x94, + 0x7a, 0x07, 0x00, 0x94, 0xc9, 0x3c, 0x00, 0x94, 0x7c, 0x07, 0x00, 0x94, + 0xbf, 0x0c, 0x00, 0x94, 0x80, 0x00, 0x80, 0x52, 0xd5, 0xfe, 0xff, 0x97, + 0xe0, 0x03, 0x14, 0xaa, 0x2b, 0x07, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0xe0, 0x00, 0x00, 0x34, 0xe0, 0x03, 0x13, 0x2a, 0x97, 0x07, 0x00, 0x94, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xa0, 0x00, 0x80, 0x52, 0xc9, 0xfe, 0xff, 0x97, + 0x01, 0x00, 0x80, 0xd2, 0x00, 0x00, 0x80, 0x52, 0xb2, 0x00, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0x80, 0xfe, 0xff, 0x35, 0xc0, 0x00, 0x80, 0x52, + 0xc2, 0xfe, 0xff, 0x97, 0x00, 0x00, 0x80, 0xd2, 0x5c, 0x0f, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0xc0, 0xfd, 0xff, 0x35, 0xe0, 0x00, 0x80, 0x52, + 0xbc, 0xfe, 0xff, 0x97, 0xa1, 0x3f, 0x00, 0xf0, 0x21, 0xfc, 0x3f, 0x91, + 0xe0, 0x03, 0x14, 0xaa, 0x80, 0x03, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0xaa, 0x0c, 0x00, 0x94, 0xb3, 0xfc, 0xff, 0x35, 0x40, 0x02, 0x80, 0x52, + 0xb3, 0xfe, 0xff, 0x97, 0xfa, 0x06, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0x00, 0xfc, 0xff, 0x35, 0xf3, 0x53, 0x41, 0xa9, 0x92, 0x0c, 0x00, 0x94, + 0xe0, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x90, 0x00, 0x40, 0x19, 0x91, + 0xba, 0x0d, 0x00, 0x94, 0x00, 0x00, 0x80, 0x52, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x01, 0x80, 0x52, 0xa5, 0xfe, 0xff, 0x97, + 0xf8, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0x59, 0x4e, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0xc0, 0x05, 0x00, 0x35, 0xe0, 0x02, 0x00, 0xb0, 0x00, 0xe0, 0x50, 0x39, + 0x80, 0x02, 0x00, 0x34, 0x20, 0x00, 0x80, 0x52, 0x86, 0x63, 0x00, 0x94, + 0x20, 0x02, 0x00, 0x34, 0xe2, 0x03, 0x00, 0x2a, 0xf3, 0x03, 0x00, 0x2a, + 0xe3, 0x01, 0x00, 0xf0, 0x63, 0x40, 0x31, 0x91, 0xc1, 0x01, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0xfe, 0x33, 0x00, 0x94, 0x26, 0x00, 0x00, 0x14, + 0xe0, 0x03, 0x02, 0x2a, 0x01, 0x00, 0x80, 0x12, 0x22, 0x00, 0x80, 0x52, + 0x69, 0x66, 0x00, 0x94, 0xa0, 0x04, 0x00, 0x35, 0x73, 0x06, 0x00, 0x11, + 0x7f, 0x22, 0x00, 0x71, 0x00, 0x01, 0x00, 0x54, 0xb4, 0x02, 0x00, 0x94, + 0x01, 0x24, 0xd3, 0x1a, 0x62, 0x1e, 0x00, 0x12, 0xa1, 0xfe, 0x07, 0x37, + 0x73, 0x06, 0x00, 0x11, 0x7f, 0x22, 0x00, 0x71, 0x41, 0xff, 0xff, 0x54, + 0xf5, 0x67, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0x20, 0x04, 0x00, 0x35, + 0x40, 0x04, 0x80, 0x52, 0x79, 0xfe, 0xff, 0x97, 0xc1, 0x01, 0x80, 0x52, + 0xf3, 0x03, 0x00, 0x2a, 0xe2, 0x03, 0x00, 0x2a, 0xe3, 0x01, 0x00, 0xf0, + 0x63, 0x40, 0x33, 0x91, 0x40, 0x00, 0x80, 0x52, 0xe2, 0x33, 0x00, 0x94, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, 0xe3, 0x01, 0x00, 0xf0, + 0x63, 0xa0, 0x30, 0x91, 0xc1, 0x01, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0xd8, 0x33, 0x00, 0x94, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe4, 0x03, 0x13, 0x2a, + 0xe2, 0x03, 0x00, 0x2a, 0xf3, 0x03, 0x00, 0x2a, 0xe3, 0x01, 0x00, 0xf0, + 0xc1, 0x01, 0x80, 0x52, 0x63, 0x00, 0x32, 0x91, 0x00, 0x01, 0x80, 0x52, + 0xcc, 0x33, 0x00, 0x94, 0xf4, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x13, 0x2a, + 0xc1, 0x01, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0xe3, 0x01, 0x00, 0xf0, + 0x63, 0xa0, 0x32, 0x91, 0xc5, 0x33, 0x00, 0x94, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xe0, 0x7f, 0x00, 0x91, + 0xff, 0x7f, 0x00, 0x39, 0xf4, 0x06, 0x00, 0x94, 0xe0, 0x7f, 0x40, 0x39, + 0x1f, 0x54, 0x01, 0x71, 0x60, 0x00, 0x00, 0x54, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x21, 0x03, 0x80, 0x52, 0x00, 0x20, 0x80, 0x52, + 0x60, 0x91, 0x00, 0x94, 0x81, 0x02, 0x00, 0x90, 0x20, 0x60, 0x47, 0xb9, + 0x1f, 0x04, 0x00, 0x71, 0xc1, 0x00, 0x00, 0x54, 0x21, 0x80, 0x1d, 0x91, + 0x1f, 0x20, 0x03, 0xd5, 0x20, 0x00, 0x40, 0xb9, 0x1f, 0x04, 0x00, 0x71, + 0xa0, 0xff, 0xff, 0x54, 0x20, 0x00, 0x80, 0x52, 0xb1, 0x31, 0x00, 0x94, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0xf4, 0x03, 0x01, 0xaa, + 0x00, 0x20, 0x80, 0x52, 0x3e, 0x91, 0x00, 0x94, 0x03, 0x1c, 0x00, 0x12, + 0x7f, 0x64, 0x00, 0x71, 0x81, 0x00, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe1, 0x03, 0x13, 0xaa, + 0xe2, 0x03, 0x14, 0xaa, 0x94, 0x10, 0x00, 0xf0, 0x80, 0x02, 0x1b, 0x91, + 0xdb, 0xfd, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0x95, 0x06, 0x00, 0x94, + 0x81, 0x10, 0x00, 0xf0, 0x20, 0xbc, 0x06, 0xb9, 0x93, 0x00, 0x00, 0x35, + 0x81, 0xc2, 0x46, 0xb9, 0x1f, 0x00, 0x01, 0x6b, 0x20, 0xfe, 0xff, 0x54, + 0xe0, 0x02, 0x80, 0x52, 0x19, 0xfe, 0xff, 0x97, 0x7f, 0x20, 0x03, 0xd5, + 0x7f, 0x20, 0x03, 0xd5, 0xfe, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xe0, 0x1f, 0x00, 0xb9, + 0xe1, 0x0b, 0x00, 0xf9, 0xff, 0x3f, 0x00, 0xb9, 0x80, 0x02, 0x00, 0x90, + 0x00, 0xa0, 0x1d, 0x91, 0x1f, 0x00, 0x00, 0xf9, 0xe0, 0x1f, 0x40, 0xb9, + 0x1f, 0x08, 0x00, 0x71, 0xe1, 0x01, 0x00, 0x54, 0xe0, 0x0b, 0x40, 0xf9, + 0x1f, 0x00, 0x00, 0xf1, 0x80, 0x01, 0x00, 0x54, 0x02, 0x6d, 0x80, 0xd2, + 0xe1, 0x0b, 0x40, 0xf9, 0x80, 0x10, 0x00, 0xf0, 0x00, 0x20, 0x1b, 0x91, + 0xc2, 0xf3, 0x00, 0x94, 0x80, 0x02, 0x00, 0x90, 0x00, 0xa0, 0x1d, 0x91, + 0x81, 0x10, 0x00, 0xf0, 0x21, 0x20, 0x1b, 0x91, 0x01, 0x00, 0x00, 0xf9, + 0xa3, 0x01, 0x00, 0x14, 0xe0, 0x1f, 0x40, 0xb9, 0x1f, 0x00, 0x00, 0x71, + 0x01, 0x34, 0x00, 0x54, 0x00, 0x7b, 0x80, 0xd2, 0x00, 0x40, 0xa0, 0xf2, + 0x00, 0x00, 0x40, 0xf9, 0xe0, 0x17, 0x00, 0xf9, 0xff, 0x3b, 0x00, 0xb9, + 0xe0, 0x17, 0x40, 0xf9, 0x00, 0x7c, 0x40, 0x92, 0xe0, 0x17, 0x00, 0xf9, + 0xe0, 0x17, 0x40, 0xf9, 0x0b, 0x02, 0x00, 0x94, 0x00, 0x1c, 0x00, 0x12, + 0x1f, 0x00, 0x00, 0x71, 0x60, 0x32, 0x00, 0x54, 0xe0, 0x17, 0x40, 0xf9, + 0x01, 0x00, 0x40, 0xb9, 0x20, 0xa2, 0x9b, 0x52, 0x40, 0xb5, 0xaa, 0x72, + 0x3f, 0x00, 0x00, 0x6b, 0xa1, 0x31, 0x00, 0x54, 0xe0, 0x17, 0x40, 0xf9, + 0x01, 0x70, 0x40, 0xb9, 0x80, 0x10, 0x00, 0xf0, 0x00, 0x20, 0x1b, 0x91, + 0x01, 0x8c, 0x00, 0xb9, 0xe0, 0x17, 0x40, 0xf9, 0x01, 0x74, 0x40, 0xb9, + 0x80, 0x10, 0x00, 0xf0, 0x00, 0x20, 0x1b, 0x91, 0x01, 0x90, 0x00, 0xb9, + 0xe0, 0x17, 0x40, 0xf9, 0x01, 0x78, 0x40, 0xb9, 0x80, 0x10, 0x00, 0xf0, + 0x00, 0x20, 0x1b, 0x91, 0x01, 0x94, 0x00, 0xb9, 0xe0, 0x17, 0x40, 0xf9, + 0x01, 0x04, 0x40, 0xb9, 0x80, 0x10, 0x00, 0xf0, 0x00, 0x20, 0x1b, 0x91, + 0x01, 0x00, 0x00, 0xb9, 0xe0, 0x17, 0x40, 0xf9, 0x00, 0x38, 0x41, 0xb9, + 0x01, 0x1c, 0x00, 0x12, 0x80, 0x10, 0x00, 0xf0, 0x00, 0x20, 0x1b, 0x91, + 0x01, 0x38, 0x04, 0x39, 0xe0, 0x17, 0x40, 0xf9, 0x01, 0x30, 0x41, 0xb9, + 0x80, 0x10, 0x00, 0xf0, 0x00, 0x20, 0x1b, 0x91, 0x01, 0xc4, 0x00, 0xb9, + 0xe0, 0x17, 0x40, 0xf9, 0x01, 0x34, 0x41, 0xb9, 0x80, 0x10, 0x00, 0xf0, + 0x00, 0x20, 0x1b, 0x91, 0x01, 0xc8, 0x00, 0xb9, 0xe0, 0x17, 0x40, 0xf9, + 0x01, 0x3c, 0x41, 0xb9, 0x80, 0x10, 0x00, 0xf0, 0x00, 0x20, 0x1b, 0x91, + 0x01, 0x10, 0x01, 0xb9, 0xe0, 0x17, 0x40, 0xf9, 0x00, 0x70, 0x40, 0xb9, + 0xde, 0x01, 0x00, 0x94, 0xe1, 0x03, 0x00, 0x2a, 0x80, 0x10, 0x00, 0xf0, + 0x00, 0x20, 0x1b, 0x91, 0x01, 0x98, 0x00, 0xb9, 0xe0, 0x17, 0x40, 0xf9, + 0x00, 0x74, 0x40, 0xb9, 0xd7, 0x01, 0x00, 0x94, 0xe1, 0x03, 0x00, 0x2a, + 0x80, 0x10, 0x00, 0xf0, 0x00, 0x20, 0x1b, 0x91, 0x01, 0x9c, 0x00, 0xb9, + 0xe0, 0x17, 0x40, 0xf9, 0x00, 0x78, 0x40, 0xb9, 0xd0, 0x01, 0x00, 0x94, + 0xe1, 0x03, 0x00, 0x2a, 0x80, 0x10, 0x00, 0xf0, 0x00, 0x20, 0x1b, 0x91, + 0x01, 0xa0, 0x00, 0xb9, 0xff, 0x3b, 0x00, 0xb9, 0x98, 0x00, 0x00, 0x14, + 0xe1, 0x17, 0x40, 0xf9, 0xe0, 0x3b, 0x80, 0xb9, 0x00, 0xf4, 0x7e, 0xd3, + 0x20, 0x00, 0x00, 0x8b, 0x01, 0x08, 0x40, 0xb9, 0x80, 0x10, 0x00, 0xf0, + 0x02, 0x20, 0x1b, 0x91, 0xe0, 0x3b, 0x80, 0xb9, 0x00, 0xf4, 0x7e, 0xd3, + 0x40, 0x00, 0x00, 0x8b, 0x01, 0x04, 0x00, 0xb9, 0xe1, 0x17, 0x40, 0xf9, + 0xe0, 0x3b, 0x80, 0xb9, 0x00, 0x70, 0x00, 0x91, 0x00, 0xf4, 0x7e, 0xd3, + 0x20, 0x00, 0x00, 0x8b, 0x01, 0x0c, 0x40, 0xb9, 0x80, 0x10, 0x00, 0xf0, + 0x02, 0x20, 0x1b, 0x91, 0xe0, 0x3b, 0x80, 0xb9, 0x00, 0x40, 0x00, 0x91, + 0x00, 0xf4, 0x7e, 0xd3, 0x40, 0x00, 0x00, 0x8b, 0x01, 0x04, 0x00, 0xb9, + 0xe1, 0x17, 0x40, 0xf9, 0xe0, 0x3b, 0x80, 0xb9, 0x20, 0x00, 0x00, 0x8b, + 0x02, 0x00, 0x45, 0x39, 0x80, 0x10, 0x00, 0xf0, 0x01, 0x20, 0x1b, 0x91, + 0xe0, 0x3b, 0x80, 0xb9, 0x20, 0x00, 0x00, 0x8b, 0xe1, 0x03, 0x02, 0x2a, + 0x01, 0x18, 0x04, 0x39, 0xe0, 0x17, 0x40, 0xf9, 0xe1, 0x3b, 0x80, 0xb9, + 0x21, 0x10, 0x01, 0x91, 0x01, 0x78, 0x61, 0xb8, 0x80, 0x10, 0x00, 0xf0, + 0x02, 0x20, 0x1b, 0x91, 0xe0, 0x3b, 0x80, 0xb9, 0x00, 0xa0, 0x00, 0x91, + 0x00, 0xf4, 0x7e, 0xd3, 0x40, 0x00, 0x00, 0x8b, 0x01, 0x04, 0x00, 0xb9, + 0xe0, 0x17, 0x40, 0xf9, 0xe1, 0x3b, 0x80, 0xb9, 0x21, 0xf0, 0x00, 0x91, + 0x01, 0x78, 0x61, 0xb8, 0x80, 0x10, 0x00, 0xf0, 0x02, 0x20, 0x1b, 0x91, + 0xe0, 0x3b, 0x80, 0xb9, 0x00, 0xc0, 0x00, 0x91, 0x00, 0xf4, 0x7e, 0xd3, + 0x40, 0x00, 0x00, 0x8b, 0x01, 0x0c, 0x00, 0xb9, 0xe1, 0x17, 0x40, 0xf9, + 0xe0, 0x3b, 0x80, 0xb9, 0x20, 0x00, 0x00, 0x8b, 0x02, 0x90, 0x42, 0x39, + 0x80, 0x10, 0x00, 0xf0, 0x01, 0x20, 0x1b, 0x91, 0xe0, 0x3b, 0x80, 0xb9, + 0x20, 0x00, 0x00, 0x8b, 0xe1, 0x03, 0x02, 0x2a, 0x01, 0xb0, 0x03, 0x39, + 0xe1, 0x17, 0x40, 0xf9, 0xe0, 0x3b, 0x80, 0xb9, 0x20, 0x00, 0x00, 0x8b, + 0x02, 0xb0, 0x42, 0x39, 0x80, 0x10, 0x00, 0xf0, 0x01, 0x20, 0x1b, 0x91, + 0xe0, 0x3b, 0x80, 0xb9, 0x20, 0x00, 0x00, 0x8b, 0xe1, 0x03, 0x02, 0x2a, + 0x01, 0xd0, 0x03, 0x39, 0xe1, 0x17, 0x40, 0xf9, 0xe0, 0x3b, 0x80, 0xb9, + 0x20, 0x00, 0x00, 0x8b, 0x02, 0xd0, 0x42, 0x39, 0x80, 0x10, 0x00, 0xf0, + 0x01, 0x20, 0x1b, 0x91, 0xe0, 0x3b, 0x80, 0xb9, 0x20, 0x00, 0x00, 0x8b, + 0xe1, 0x03, 0x02, 0x2a, 0x01, 0xf0, 0x03, 0x39, 0xe1, 0x17, 0x40, 0xf9, + 0xe0, 0x3b, 0x80, 0xb9, 0x00, 0xe0, 0x06, 0x91, 0x00, 0x00, 0x00, 0x8b, + 0x20, 0x00, 0x00, 0x8b, 0x02, 0x18, 0x40, 0x79, 0x80, 0x10, 0x00, 0xf0, + 0x01, 0x20, 0x1b, 0x91, 0xe0, 0x3b, 0x80, 0xb9, 0x00, 0x40, 0x06, 0x91, + 0x00, 0x00, 0x00, 0x8b, 0x20, 0x00, 0x00, 0x8b, 0xe1, 0x03, 0x02, 0x2a, + 0x01, 0x10, 0x00, 0x79, 0xe1, 0x17, 0x40, 0xf9, 0xe0, 0x3b, 0x80, 0xb9, + 0x00, 0x00, 0x07, 0x91, 0x00, 0x00, 0x00, 0x8b, 0x20, 0x00, 0x00, 0x8b, + 0x02, 0x18, 0x40, 0x79, 0x80, 0x10, 0x00, 0xf0, 0x01, 0x20, 0x1b, 0x91, + 0xe0, 0x3b, 0x80, 0xb9, 0x00, 0x60, 0x06, 0x91, 0x00, 0x00, 0x00, 0x8b, + 0x20, 0x00, 0x00, 0x8b, 0xe1, 0x03, 0x02, 0x2a, 0x01, 0x10, 0x00, 0x79, + 0xe1, 0x17, 0x40, 0xf9, 0xe0, 0x3b, 0x80, 0xb9, 0x00, 0x20, 0x07, 0x91, + 0x00, 0x00, 0x00, 0x8b, 0x20, 0x00, 0x00, 0x8b, 0x02, 0x18, 0x40, 0x79, + 0x80, 0x10, 0x00, 0xf0, 0x01, 0x20, 0x1b, 0x91, 0xe0, 0x3b, 0x80, 0xb9, + 0x00, 0x80, 0x06, 0x91, 0x00, 0x00, 0x00, 0x8b, 0x20, 0x00, 0x00, 0x8b, + 0xe1, 0x03, 0x02, 0x2a, 0x01, 0x10, 0x00, 0x79, 0xe1, 0x17, 0x40, 0xf9, + 0xe0, 0x3b, 0x80, 0xb9, 0x20, 0x00, 0x00, 0x8b, 0x02, 0xb0, 0x4e, 0x39, + 0x80, 0x10, 0x00, 0xf0, 0x01, 0x20, 0x1b, 0x91, 0xe0, 0x3b, 0x80, 0xb9, + 0x20, 0x00, 0x00, 0x8b, 0xe1, 0x03, 0x02, 0x2a, 0x01, 0x60, 0x0d, 0x39, + 0xe1, 0x17, 0x40, 0xf9, 0xe0, 0x3b, 0x80, 0xb9, 0x20, 0x00, 0x00, 0x8b, + 0x02, 0xd0, 0x4e, 0x39, 0x80, 0x10, 0x00, 0xf0, 0x01, 0x20, 0x1b, 0x91, + 0xe0, 0x3b, 0x80, 0xb9, 0x20, 0x00, 0x00, 0x8b, 0xe1, 0x03, 0x02, 0x2a, + 0x01, 0x80, 0x0d, 0x39, 0xe0, 0x3b, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x11, + 0xe0, 0x3b, 0x00, 0xb9, 0xe0, 0x3b, 0x40, 0xb9, 0x1f, 0x1c, 0x00, 0x71, + 0xed, 0xec, 0xff, 0x54, 0xff, 0x3b, 0x00, 0xb9, 0x3e, 0x00, 0x00, 0x14, + 0xe0, 0x17, 0x40, 0xf9, 0xe1, 0x3b, 0x80, 0xb9, 0x21, 0x50, 0x00, 0x91, + 0x01, 0x78, 0x61, 0xb8, 0x80, 0x10, 0x00, 0xf0, 0x02, 0x20, 0x1b, 0x91, + 0xe0, 0x3b, 0x80, 0xb9, 0x00, 0x60, 0x00, 0x91, 0x00, 0xf4, 0x7e, 0xd3, + 0x40, 0x00, 0x00, 0x8b, 0x01, 0x0c, 0x00, 0xb9, 0xe1, 0x17, 0x40, 0xf9, + 0xe0, 0x3b, 0x80, 0xb9, 0x00, 0x50, 0x00, 0x91, 0x00, 0xf4, 0x7e, 0xd3, + 0x20, 0x00, 0x00, 0x8b, 0x01, 0x08, 0x40, 0xb9, 0x80, 0x10, 0x00, 0xf0, + 0x02, 0x20, 0x1b, 0x91, 0xe0, 0x3b, 0x80, 0xb9, 0x00, 0x70, 0x00, 0x91, + 0x00, 0xf4, 0x7e, 0xd3, 0x40, 0x00, 0x00, 0x8b, 0x01, 0x04, 0x00, 0xb9, + 0xe1, 0x17, 0x40, 0xf9, 0xe0, 0x3b, 0x80, 0xb9, 0x00, 0x40, 0x00, 0x91, + 0x00, 0xf4, 0x7e, 0xd3, 0x20, 0x00, 0x00, 0x8b, 0x01, 0x08, 0x40, 0xb9, + 0x80, 0x10, 0x00, 0xd0, 0x02, 0x20, 0x1b, 0x91, 0xe0, 0x3b, 0x80, 0xb9, + 0x00, 0x60, 0x00, 0x91, 0x00, 0xf4, 0x7e, 0xd3, 0x40, 0x00, 0x00, 0x8b, + 0x01, 0x04, 0x00, 0xb9, 0xe1, 0x17, 0x40, 0xf9, 0xe0, 0x3b, 0x80, 0xb9, + 0x20, 0x00, 0x00, 0x8b, 0x02, 0xf0, 0x42, 0x39, 0x80, 0x10, 0x00, 0xd0, + 0x01, 0x20, 0x1b, 0x91, 0xe0, 0x3b, 0x80, 0xb9, 0x20, 0x00, 0x00, 0x8b, + 0xe1, 0x03, 0x02, 0x2a, 0x01, 0x10, 0x04, 0x39, 0xe0, 0x17, 0x40, 0xf9, + 0xe1, 0x3b, 0x80, 0xb9, 0x21, 0x60, 0x00, 0x91, 0x01, 0x78, 0x61, 0xb8, + 0x80, 0x10, 0x00, 0xd0, 0x02, 0x20, 0x1b, 0x91, 0xe0, 0x3b, 0x80, 0xb9, + 0x00, 0x70, 0x00, 0x91, 0x00, 0xf4, 0x7e, 0xd3, 0x40, 0x00, 0x00, 0x8b, + 0x01, 0x0c, 0x00, 0xb9, 0xe0, 0x3b, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x11, + 0xe0, 0x3b, 0x00, 0xb9, 0xe0, 0x3b, 0x40, 0xb9, 0x1f, 0x04, 0x00, 0x71, + 0x2d, 0xf8, 0xff, 0x54, 0xe0, 0x17, 0x40, 0xf9, 0x01, 0x68, 0x40, 0xb9, + 0x80, 0x10, 0x00, 0xd0, 0x00, 0x20, 0x1b, 0x91, 0x01, 0x84, 0x00, 0xb9, + 0xe0, 0x17, 0x40, 0xf9, 0x01, 0x6c, 0x40, 0xb9, 0x80, 0x10, 0x00, 0xd0, + 0x00, 0x20, 0x1b, 0x91, 0x01, 0x88, 0x00, 0xb9, 0xff, 0x3b, 0x00, 0xb9, + 0x58, 0x00, 0x00, 0x14, 0xe1, 0x17, 0x40, 0xf9, 0xe0, 0x3b, 0x80, 0xb9, + 0x00, 0x80, 0x02, 0x91, 0x00, 0x00, 0x00, 0x8b, 0x20, 0x00, 0x00, 0x8b, + 0x02, 0x20, 0x40, 0x39, 0x80, 0x10, 0x00, 0xd0, 0x01, 0x20, 0x1b, 0x91, + 0xe0, 0x3b, 0x80, 0xb9, 0x00, 0x20, 0x02, 0x91, 0x00, 0x00, 0x00, 0x8b, + 0x20, 0x00, 0x00, 0x8b, 0xe1, 0x03, 0x02, 0x2a, 0x01, 0x10, 0x00, 0x39, + 0xe1, 0x17, 0x40, 0xf9, 0xe0, 0x3b, 0x80, 0xb9, 0x00, 0x00, 0x00, 0x8b, + 0x20, 0x00, 0x00, 0x8b, 0x02, 0x24, 0x45, 0x39, 0x80, 0x10, 0x00, 0xd0, + 0x01, 0x20, 0x1b, 0x91, 0xe0, 0x3b, 0x80, 0xb9, 0x00, 0x00, 0x00, 0x8b, + 0x20, 0x00, 0x00, 0x8b, 0xe1, 0x03, 0x02, 0x2a, 0x01, 0x54, 0x04, 0x39, + 0xff, 0xdf, 0x00, 0x39, 0x19, 0x00, 0x00, 0x14, 0xe0, 0xdf, 0x40, 0x39, + 0xe3, 0xdf, 0x40, 0x39, 0xe1, 0x17, 0x40, 0xf9, 0x00, 0x7c, 0x40, 0x93, + 0xe2, 0x3b, 0x80, 0xb9, 0x42, 0xf0, 0x7d, 0xd3, 0x40, 0x00, 0x00, 0x8b, + 0x00, 0x50, 0x01, 0x91, 0x00, 0xf4, 0x7e, 0xd3, 0x20, 0x00, 0x00, 0x8b, + 0x01, 0x08, 0x40, 0xb9, 0x80, 0x10, 0x00, 0xd0, 0x02, 0x20, 0x1b, 0x91, + 0x60, 0x7c, 0x40, 0x93, 0xe3, 0x3b, 0x80, 0xb9, 0x63, 0xf0, 0x7d, 0xd3, + 0x60, 0x00, 0x00, 0x8b, 0x00, 0x20, 0x01, 0x91, 0x00, 0xf4, 0x7e, 0xd3, + 0x40, 0x00, 0x00, 0x8b, 0x01, 0x04, 0x00, 0xb9, 0xe0, 0xdf, 0x40, 0x39, + 0x00, 0x04, 0x00, 0x11, 0xe0, 0xdf, 0x00, 0x39, 0xe0, 0xdf, 0x40, 0x39, + 0x1f, 0x1c, 0x00, 0x71, 0xc9, 0xfc, 0xff, 0x54, 0xff, 0xdb, 0x00, 0x39, + 0x19, 0x00, 0x00, 0x14, 0xe0, 0xdb, 0x40, 0x39, 0xe3, 0xdb, 0x40, 0x39, + 0xe1, 0x17, 0x40, 0xf9, 0x00, 0x7c, 0x40, 0x93, 0xe2, 0x3b, 0x80, 0xb9, + 0x42, 0xf0, 0x7d, 0xd3, 0x40, 0x00, 0x00, 0x8b, 0x00, 0x50, 0x02, 0x91, + 0x00, 0xf4, 0x7e, 0xd3, 0x20, 0x00, 0x00, 0x8b, 0x01, 0x08, 0x40, 0xb9, + 0x80, 0x10, 0x00, 0xd0, 0x02, 0x20, 0x1b, 0x91, 0x60, 0x7c, 0x40, 0x93, + 0xe3, 0x3b, 0x80, 0xb9, 0x63, 0xf0, 0x7d, 0xd3, 0x60, 0x00, 0x00, 0x8b, + 0x00, 0x20, 0x02, 0x91, 0x00, 0xf4, 0x7e, 0xd3, 0x40, 0x00, 0x00, 0x8b, + 0x01, 0x04, 0x00, 0xb9, 0xe0, 0xdb, 0x40, 0x39, 0x00, 0x04, 0x00, 0x11, + 0xe0, 0xdb, 0x00, 0x39, 0xe0, 0xdb, 0x40, 0x39, 0x1f, 0x1c, 0x00, 0x71, + 0xc9, 0xfc, 0xff, 0x54, 0xe0, 0x3b, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x11, + 0xe0, 0x3b, 0x00, 0xb9, 0xe0, 0x3b, 0x40, 0xb9, 0x1f, 0x1c, 0x00, 0x71, + 0xed, 0xf4, 0xff, 0x54, 0xe0, 0x17, 0x40, 0xf9, 0x01, 0x58, 0x43, 0xb9, + 0x80, 0x10, 0x00, 0xd0, 0x00, 0x20, 0x1b, 0x91, 0x01, 0x24, 0x03, 0xb9, + 0x60, 0x02, 0x00, 0xf0, 0x00, 0xa0, 0x1d, 0x91, 0x81, 0x10, 0x00, 0xd0, + 0x21, 0x20, 0x1b, 0x91, 0x01, 0x00, 0x00, 0xf9, 0x60, 0x02, 0x00, 0xf0, + 0x00, 0xa0, 0x1d, 0x91, 0x00, 0x00, 0x40, 0xf9, 0x1f, 0x00, 0x00, 0xf1, + 0x81, 0x01, 0x00, 0x54, 0xe0, 0x1f, 0x40, 0xb9, 0x1f, 0x04, 0x00, 0x71, + 0xe1, 0x00, 0x00, 0x54, 0x60, 0x02, 0x00, 0xf0, 0x00, 0xa0, 0x1d, 0x91, + 0xe1, 0x01, 0x00, 0xd0, 0x21, 0xe0, 0x33, 0x91, 0x01, 0x00, 0x00, 0xf9, + 0x03, 0x00, 0x00, 0x14, 0x40, 0x00, 0x80, 0x52, 0xe0, 0x3f, 0x00, 0xb9, + 0xe0, 0x3f, 0x40, 0xb9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x02, 0x00, 0xf0, + 0x00, 0xb4, 0x43, 0xf9, 0x00, 0x00, 0x40, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x61, 0x02, 0x00, 0xf0, 0x21, 0xb4, 0x43, 0xf9, 0x1f, 0x08, 0x00, 0x71, + 0x00, 0x30, 0x9f, 0x1a, 0x20, 0x08, 0x00, 0x8b, 0x00, 0x64, 0x40, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x61, 0x02, 0x00, 0xf0, + 0x21, 0xb4, 0x43, 0xf9, 0x1f, 0x20, 0x00, 0x71, 0x00, 0x30, 0x9f, 0x1a, + 0x20, 0x00, 0x00, 0x8b, 0x00, 0x18, 0x44, 0x39, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x02, 0x00, 0xf0, + 0x21, 0xb4, 0x43, 0xf9, 0x1f, 0x20, 0x00, 0x71, 0x00, 0x30, 0x9f, 0x1a, + 0x20, 0x08, 0x00, 0x8b, 0x00, 0xa4, 0x40, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x61, 0x02, 0x00, 0xf0, 0x21, 0xb4, 0x43, 0xf9, + 0x1f, 0x20, 0x00, 0x71, 0x00, 0x30, 0x9f, 0x1a, 0x20, 0x08, 0x00, 0x8b, + 0x00, 0xcc, 0x40, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x61, 0x02, 0x00, 0xf0, 0x21, 0xb4, 0x43, 0xf9, 0x1f, 0x20, 0x00, 0x71, + 0x00, 0x30, 0x9f, 0x1a, 0x20, 0x00, 0x00, 0x8b, 0x00, 0xb0, 0x43, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x61, 0x02, 0x00, 0xf0, + 0x21, 0xb4, 0x43, 0xf9, 0x1f, 0x20, 0x00, 0x71, 0x00, 0x30, 0x9f, 0x1a, + 0x20, 0x00, 0x00, 0x8b, 0x00, 0xd0, 0x43, 0x39, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x61, 0x02, 0x00, 0xf0, 0x21, 0xb4, 0x43, 0xf9, + 0x1f, 0x20, 0x00, 0x71, 0x00, 0x30, 0x9f, 0x1a, 0x20, 0x00, 0x00, 0x8b, + 0x00, 0xf0, 0x43, 0x39, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x61, 0x02, 0x00, 0xf0, 0x21, 0xb4, 0x43, 0xf9, 0x1f, 0x20, 0x00, 0x71, + 0x00, 0x30, 0x9f, 0x1a, 0x20, 0x04, 0x00, 0x8b, 0x00, 0x50, 0x46, 0x79, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x61, 0x02, 0x00, 0xf0, + 0x21, 0xb4, 0x43, 0xf9, 0x1f, 0x20, 0x00, 0x71, 0x00, 0x30, 0x9f, 0x1a, + 0x20, 0x00, 0x00, 0x8b, 0x00, 0x60, 0x4d, 0x39, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x61, 0x02, 0x00, 0xf0, 0x21, 0xb4, 0x43, 0xf9, + 0x1f, 0x20, 0x00, 0x71, 0x00, 0x30, 0x9f, 0x1a, 0x20, 0x00, 0x00, 0x8b, + 0x00, 0x80, 0x4d, 0x39, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x02, 0x00, 0xf0, 0x00, 0xb4, 0x43, 0xf9, 0x01, 0x7d, 0x80, 0x52, + 0x00, 0x00, 0x40, 0xb9, 0x00, 0x7c, 0x01, 0x1b, 0x00, 0x7c, 0x05, 0x53, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x9f, 0x68, 0xb2, + 0x00, 0x00, 0x01, 0x8b, 0x81, 0xff, 0xbb, 0x12, 0x1f, 0x00, 0x01, 0xeb, + 0xe0, 0x87, 0x9f, 0x1a, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe1, 0x03, 0x00, 0x2a, 0x00, 0x00, 0x80, 0x52, + 0x01, 0x01, 0x00, 0x34, 0x1f, 0x20, 0x03, 0xd5, 0x22, 0x00, 0x00, 0x12, + 0x21, 0x7c, 0x01, 0x53, 0x00, 0x00, 0x02, 0x0b, 0x1f, 0x80, 0x00, 0x71, + 0x24, 0x98, 0x40, 0x7a, 0x61, 0xff, 0xff, 0x54, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x02, 0x00, 0xf0, 0x00, 0xb4, 0x43, 0xf9, + 0x00, 0x8c, 0x40, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x02, 0x00, 0xf0, + 0x00, 0xb4, 0x43, 0xf9, 0x00, 0x90, 0x40, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x02, 0x00, 0xf0, 0x00, 0xb4, 0x43, 0xf9, 0x00, 0x94, 0x40, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x02, 0x00, 0xf0, 0x00, 0xb4, 0x43, 0xf9, + 0x00, 0x98, 0x40, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x02, 0x00, 0xf0, + 0x00, 0xb4, 0x43, 0xf9, 0x00, 0x24, 0x43, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x02, 0x00, 0xf0, 0x00, 0xb4, 0x43, 0xf9, 0x00, 0x38, 0x44, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x02, 0x00, 0xf0, 0x00, 0xb4, 0x43, 0xf9, + 0x00, 0xc4, 0x40, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x02, 0x00, 0xf0, + 0x00, 0xb4, 0x43, 0xf9, 0x00, 0xc8, 0x40, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x02, 0x00, 0xf0, 0x00, 0xb4, 0x43, 0xf9, 0x00, 0x10, 0x41, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf9, 0x23, 0x00, 0xf9, 0x19, 0x00, 0x80, 0xd2, 0x21, 0x0a, 0x00, 0xb4, + 0xf7, 0x63, 0x03, 0xa9, 0x3f, 0x08, 0x40, 0xf2, 0xf7, 0x03, 0x01, 0xaa, + 0x19, 0x00, 0x80, 0xd2, 0x61, 0x09, 0x00, 0x54, 0xf8, 0x02, 0x00, 0x90, + 0x18, 0x63, 0x17, 0x91, 0x01, 0x00, 0x80, 0x12, 0xf5, 0x5b, 0x02, 0xa9, + 0xf6, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x18, 0xaa, 0x88, 0x0d, 0x00, 0x94, + 0x80, 0x0a, 0x00, 0x35, 0xf3, 0x53, 0x01, 0xa9, 0x91, 0x01, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0xaa, 0xc0, 0x00, 0x00, 0xb5, 0x4d, 0x00, 0x00, 0x14, + 0xe0, 0x03, 0x14, 0xaa, 0x90, 0x01, 0x00, 0x94, 0xf4, 0x03, 0x00, 0xaa, + 0x20, 0x09, 0x00, 0xb4, 0xe1, 0x03, 0x16, 0x2a, 0xe0, 0x03, 0x14, 0xaa, + 0xdf, 0x01, 0x00, 0x94, 0x1f, 0x1c, 0x00, 0x72, 0x00, 0xff, 0xff, 0x54, + 0xe0, 0x03, 0x14, 0xaa, 0x93, 0x01, 0x00, 0x94, 0x1f, 0x1c, 0x00, 0x72, + 0x81, 0xfe, 0xff, 0x54, 0xe1, 0x03, 0x17, 0xaa, 0xe0, 0x03, 0x14, 0xaa, + 0xa2, 0x01, 0x00, 0x94, 0xf5, 0x02, 0x00, 0xcb, 0xe0, 0x03, 0x14, 0xaa, + 0x7f, 0x01, 0x00, 0x94, 0xf3, 0x03, 0x00, 0xaa, 0x40, 0x01, 0x00, 0xb5, + 0x10, 0x00, 0x00, 0x14, 0x9b, 0x01, 0x00, 0x94, 0xe1, 0x03, 0x00, 0xaa, + 0xb5, 0x02, 0x01, 0xeb, 0xe0, 0x03, 0x13, 0xaa, 0x80, 0x01, 0x00, 0x54, + 0x76, 0x01, 0x00, 0x94, 0xf3, 0x03, 0x00, 0xaa, 0x60, 0xfc, 0xff, 0xb4, + 0xe0, 0x03, 0x13, 0xaa, 0x8a, 0x01, 0x00, 0x94, 0xe2, 0x03, 0x00, 0x2a, + 0xe1, 0x03, 0x15, 0xaa, 0xe0, 0x03, 0x13, 0xaa, 0x5f, 0x1c, 0x00, 0x72, + 0x41, 0xfe, 0xff, 0x54, 0x75, 0xfb, 0xff, 0xb5, 0xe0, 0x03, 0x14, 0xaa, + 0xf5, 0x03, 0x17, 0xaa, 0xa5, 0x01, 0x00, 0x94, 0xf3, 0x03, 0x14, 0xaa, + 0xf9, 0x03, 0x00, 0xaa, 0xe1, 0x03, 0x15, 0xaa, 0xe0, 0x03, 0x13, 0xaa, + 0x90, 0x01, 0x00, 0x94, 0xb5, 0x02, 0x00, 0xcb, 0xe1, 0x03, 0x16, 0x2a, + 0xe0, 0x03, 0x13, 0xaa, 0xa4, 0x01, 0x00, 0x94, 0xe0, 0x03, 0x13, 0xaa, + 0x95, 0x00, 0x00, 0xb4, 0x5d, 0x01, 0x00, 0x94, 0xf3, 0x03, 0x00, 0xaa, + 0xa0, 0xfe, 0xff, 0xb5, 0x39, 0xf9, 0xff, 0xb4, 0xe0, 0x03, 0x18, 0xaa, + 0x3c, 0x0d, 0x00, 0x94, 0x00, 0x01, 0x00, 0x35, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xe0, 0x03, 0x19, 0xaa, + 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe2, 0x03, 0x00, 0x2a, 0xe3, 0x01, 0x00, 0xf0, 0x63, 0x80, 0x01, 0x91, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0xbe, 0x30, 0x00, 0x94, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf3, 0xff, 0xff, 0x17, 0x19, 0x00, 0x80, 0xd2, 0xeb, 0xff, 0xff, 0x17, + 0xe2, 0x03, 0x00, 0x2a, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xe3, 0x01, 0x00, 0xf0, 0x63, 0x00, 0x02, 0x91, 0xb2, 0x30, 0x00, 0x94, + 0xe0, 0x03, 0x19, 0xaa, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0xf4, 0x03, 0x01, 0xaa, 0xe0, 0x02, 0x00, 0x90, + 0xe1, 0x01, 0x00, 0xf0, 0x00, 0x60, 0x17, 0x91, 0x21, 0x80, 0x02, 0x91, + 0xf3, 0x0c, 0x00, 0x94, 0xc0, 0x00, 0x00, 0x35, 0xe1, 0x03, 0x14, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0x81, 0x00, 0x00, 0x14, 0xe2, 0x03, 0x00, 0x2a, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xe3, 0x01, 0x00, 0xf0, 0x63, 0xc0, 0x02, 0x91, + 0x93, 0x30, 0x00, 0x94, 0x20, 0x20, 0x81, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0x01, 0x00, 0x80, 0x12, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x02, 0x00, 0x90, + 0x73, 0x62, 0x17, 0x91, 0xe0, 0x03, 0x13, 0xaa, 0x01, 0x0d, 0x00, 0x94, + 0x00, 0x02, 0x00, 0x35, 0x1f, 0x02, 0x00, 0x94, 0x00, 0x00, 0x00, 0x90, + 0x00, 0x40, 0x14, 0x91, 0x58, 0x02, 0x00, 0x94, 0x77, 0x02, 0x00, 0x94, + 0x14, 0x1c, 0x00, 0x12, 0xe0, 0x03, 0x13, 0xaa, 0xec, 0x0c, 0x00, 0x94, + 0x20, 0x02, 0x00, 0x35, 0x9f, 0x02, 0x00, 0x71, 0x80, 0x20, 0x81, 0x52, + 0xe0, 0x13, 0x80, 0x1a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xe3, 0x01, 0x00, 0xf0, 0x63, 0xc0, 0x03, 0x91, + 0x6f, 0x30, 0x00, 0x94, 0x80, 0x20, 0x81, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0xe3, 0x01, 0x00, 0xf0, + 0x63, 0x40, 0x03, 0x91, 0x65, 0x30, 0x00, 0x94, 0x80, 0x20, 0x81, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x50, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0x24, 0x00, 0xb1, 0x08, 0x02, 0x00, 0x54, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0xf3, 0x03, 0x00, 0xaa, 0x00, 0x20, 0x00, 0x91, 0xad, 0x02, 0x00, 0x94, + 0xa0, 0x00, 0x00, 0xb4, 0x13, 0x84, 0x00, 0xf8, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x80, 0xd2, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x80, 0xd2, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0x00, 0x00, 0xf1, 0x24, 0x18, 0x40, 0xfa, 0xc0, 0x03, 0x00, 0x54, + 0x02, 0x01, 0x80, 0x92, 0x42, 0x08, 0xc1, 0x9a, 0x5f, 0x00, 0x00, 0xeb, + 0x43, 0x03, 0x00, 0x54, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0x13, 0x7c, 0x01, 0x9b, 0x7f, 0x26, 0x00, 0xb1, + 0xe8, 0x01, 0x00, 0x54, 0x60, 0x22, 0x00, 0x91, 0x92, 0x02, 0x00, 0x94, + 0xe3, 0x03, 0x00, 0xaa, 0x60, 0x01, 0x00, 0xb4, 0x73, 0x84, 0x00, 0xf8, + 0xe2, 0x03, 0x13, 0xaa, 0x01, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x03, 0xaa, + 0xe3, 0xf0, 0x00, 0x94, 0xe3, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x03, 0xaa, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x03, 0x00, 0x80, 0xd2, 0xe0, 0x03, 0x03, 0xaa, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x03, 0x00, 0x80, 0xd2, + 0xe0, 0x03, 0x03, 0xaa, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0xb4, 0x00, 0x20, 0x00, 0xd1, 0xbe, 0x02, 0x00, 0x14, + 0xc0, 0x03, 0x5f, 0xd6, 0x02, 0x04, 0x40, 0xf9, 0x03, 0x00, 0x80, 0x12, + 0x21, 0x04, 0x40, 0xf9, 0x5f, 0x00, 0x01, 0xeb, 0xe0, 0x27, 0x9f, 0x1a, + 0x00, 0x90, 0x83, 0x1a, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xb3, 0xff, 0xff, 0xf0, 0x73, 0x02, 0x00, 0x91, 0x1f, 0x00, 0x13, 0xeb, + 0x82, 0x01, 0x00, 0x54, 0xe3, 0x01, 0x00, 0xf0, 0x63, 0xc0, 0x06, 0x91, + 0x34, 0x00, 0x80, 0x52, 0xc2, 0x20, 0x81, 0x52, 0x21, 0x01, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x0b, 0x30, 0x00, 0x94, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xa2, 0x3f, 0xa0, 0xf0, 0x42, 0x00, 0x00, 0x91, 0x62, 0x02, 0x02, 0x8b, + 0x3f, 0x00, 0x02, 0xeb, 0x20, 0x30, 0x53, 0xfa, 0xe3, 0x37, 0x9f, 0x1a, + 0x1f, 0x00, 0x01, 0xeb, 0x02, 0x90, 0x42, 0xfa, 0xe2, 0x27, 0x9f, 0x1a, + 0x7f, 0x00, 0x02, 0x6a, 0x60, 0xfd, 0xff, 0x54, 0xf5, 0x5b, 0x02, 0xa9, + 0xf6, 0x02, 0x00, 0xf0, 0xf5, 0x02, 0x00, 0xf0, 0xc0, 0x56, 0x02, 0xf9, + 0x1f, 0x08, 0x40, 0xf2, 0xa1, 0x5a, 0x02, 0xf9, 0xc1, 0x0b, 0x00, 0x54, + 0xe0, 0x02, 0x00, 0xf0, 0x00, 0xe0, 0x10, 0x91, 0xe3, 0x02, 0x00, 0xb0, + 0x63, 0xe0, 0x00, 0x91, 0xe1, 0x01, 0x00, 0xf0, 0x02, 0x80, 0x84, 0x52, + 0x21, 0x40, 0x04, 0x91, 0x03, 0x30, 0x00, 0xf9, 0xc0, 0x0c, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0xe0, 0x0b, 0x00, 0x35, 0x02, 0xf0, 0x80, 0xd2, + 0x01, 0x00, 0x80, 0x52, 0xe0, 0x02, 0x00, 0x90, 0x00, 0xe0, 0x22, 0x91, + 0x95, 0xf0, 0x00, 0x94, 0xc4, 0x56, 0x42, 0xf9, 0xe2, 0x02, 0x00, 0x90, + 0x42, 0xe0, 0x18, 0x91, 0x06, 0x01, 0xa0, 0xd2, 0xa0, 0x5a, 0x42, 0xf9, + 0xed, 0x03, 0x06, 0xaa, 0xe1, 0x03, 0x02, 0xaa, 0xc6, 0x00, 0x04, 0xcb, + 0x0c, 0x04, 0x00, 0x91, 0x05, 0x00, 0x80, 0x52, 0xeb, 0x03, 0x80, 0x52, + 0xea, 0x4b, 0x40, 0xb2, 0x09, 0x02, 0x80, 0x52, 0x07, 0x00, 0x00, 0x14, + 0x3f, 0x04, 0x00, 0xf9, 0xa5, 0x04, 0x00, 0x11, 0x73, 0x02, 0x42, 0x91, + 0xbf, 0x40, 0x00, 0x71, 0x21, 0xa0, 0x00, 0x91, 0x60, 0x03, 0x00, 0x54, + 0x33, 0x34, 0x00, 0xa9, 0x63, 0x02, 0x0a, 0x8b, 0x7f, 0x00, 0x04, 0xeb, + 0x33, 0x08, 0x00, 0xf9, 0x3f, 0x2c, 0x03, 0x29, 0x25, 0x20, 0x00, 0xb9, + 0x82, 0x05, 0x00, 0x54, 0x3f, 0x04, 0x00, 0xf9, 0x23, 0x00, 0x40, 0xf9, + 0x7f, 0x00, 0x00, 0xeb, 0x08, 0xfe, 0xff, 0x54, 0x28, 0x04, 0x40, 0xf9, + 0x87, 0x01, 0x03, 0xcb, 0x63, 0x00, 0x08, 0x8b, 0x63, 0x04, 0x00, 0xd1, + 0x1f, 0x00, 0x03, 0xeb, 0x62, 0xfd, 0xff, 0x54, 0x23, 0x18, 0x40, 0xb9, + 0xa5, 0x04, 0x00, 0x11, 0x27, 0x04, 0x00, 0xf9, 0x73, 0x02, 0x42, 0x91, + 0x63, 0x00, 0x1c, 0x32, 0x23, 0x18, 0x00, 0xb9, 0xbf, 0x40, 0x00, 0x71, + 0x21, 0xa0, 0x00, 0x91, 0xe1, 0xfc, 0xff, 0x54, 0x44, 0x60, 0x09, 0x91, + 0x1f, 0x20, 0x03, 0xd5, 0x41, 0x04, 0x40, 0xf9, 0x01, 0x01, 0x00, 0xb4, + 0x40, 0x18, 0x40, 0xf9, 0xc0, 0x00, 0x00, 0xb4, 0x43, 0x00, 0x40, 0xf9, + 0x40, 0x14, 0x40, 0xf9, 0x21, 0x00, 0x03, 0x8b, 0x3f, 0x00, 0x00, 0xeb, + 0x41, 0x05, 0x00, 0x54, 0x42, 0xa0, 0x00, 0x91, 0x5f, 0x00, 0x04, 0xeb, + 0xa1, 0xfe, 0xff, 0x54, 0xe0, 0x02, 0x00, 0xf0, 0xe2, 0x02, 0x00, 0xf0, + 0x21, 0x00, 0x80, 0x52, 0x5f, 0xa0, 0x14, 0x39, 0x01, 0xe0, 0x12, 0x39, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x63, 0x02, 0x06, 0x8b, + 0x7f, 0x02, 0x04, 0xeb, 0x82, 0xfa, 0xff, 0x54, 0x24, 0x0c, 0x00, 0xa9, + 0x24, 0x08, 0x00, 0xf9, 0x29, 0x18, 0x00, 0xb9, 0xd0, 0xff, 0xff, 0x17, + 0xa2, 0x20, 0x81, 0x52, 0x21, 0x01, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x34, 0x00, 0x80, 0x52, 0xe3, 0x01, 0x00, 0xf0, 0x63, 0x60, 0x05, 0x91, + 0x91, 0x2f, 0x00, 0x94, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe2, 0x03, 0x00, 0x2a, 0xe3, 0x01, 0x00, 0xf0, 0x63, 0xa0, 0x04, 0x91, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x34, 0x20, 0x81, 0x52, + 0x85, 0x2f, 0x00, 0x94, 0xf5, 0x5b, 0x42, 0xa9, 0x79, 0xff, 0xff, 0x17, + 0xe3, 0x01, 0x00, 0xf0, 0x63, 0x20, 0x06, 0x91, 0x62, 0x20, 0x81, 0x52, + 0x21, 0x01, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x34, 0x20, 0x81, 0x52, + 0x7c, 0x2f, 0x00, 0x94, 0xf5, 0x5b, 0x42, 0xa9, 0x70, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x02, 0x00, 0x90, 0x00, 0xe0, 0x18, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0xb4, + 0x01, 0x20, 0x40, 0xb9, 0xe0, 0x02, 0x00, 0x90, 0x02, 0xe0, 0x18, 0x91, + 0x03, 0x05, 0x80, 0x52, 0x20, 0x04, 0x00, 0x11, 0x1f, 0x0c, 0x40, 0xf2, + 0x00, 0x08, 0xa3, 0x9b, 0x00, 0x10, 0x9f, 0x9a, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x80, 0xd2, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x00, 0x00, 0xb4, + 0x03, 0x08, 0x40, 0xa9, 0x01, 0x08, 0x40, 0xf9, 0x20, 0x00, 0x03, 0xcb, + 0x1f, 0x00, 0x02, 0xeb, 0xe0, 0x17, 0x9f, 0x1a, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xb4, + 0x01, 0x00, 0x40, 0xf9, 0x00, 0x08, 0x40, 0xf9, 0x3f, 0x00, 0x00, 0xeb, + 0xe0, 0x17, 0x9f, 0x1a, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0xe3, 0x03, 0x00, 0xaa, 0x00, 0x00, 0x80, 0xd2, + 0xe3, 0x00, 0x00, 0xb4, 0x64, 0x08, 0x40, 0xa9, 0x60, 0x08, 0x40, 0xf9, + 0x42, 0x00, 0x04, 0x8b, 0x40, 0x00, 0x00, 0xcb, 0x1f, 0x00, 0x01, 0xeb, + 0x00, 0x90, 0x81, 0x9a, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe2, 0x03, 0x00, 0xaa, 0x00, 0x00, 0x80, 0xd2, + 0x22, 0x01, 0x00, 0xb4, 0x40, 0x0c, 0x40, 0xa9, 0x44, 0x08, 0x40, 0xf9, + 0x63, 0x00, 0x00, 0x8b, 0x60, 0x00, 0x04, 0xeb, 0x80, 0x00, 0x00, 0x54, + 0x1f, 0x00, 0x01, 0xeb, 0x62, 0x00, 0x00, 0x54, 0x43, 0x08, 0x00, 0xf9, + 0xc0, 0x03, 0x5f, 0xd6, 0x84, 0x00, 0x01, 0x8b, 0xe0, 0x03, 0x01, 0xaa, + 0x44, 0x08, 0x00, 0xf9, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x00, 0x00, 0xb4, + 0x00, 0x08, 0x40, 0xf9, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x80, 0xd2, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0xb4, 0xe5, 0x01, 0x00, 0xf0, + 0xa5, 0x80, 0x0d, 0x91, 0x03, 0x08, 0x43, 0x29, 0x24, 0x00, 0x80, 0x52, + 0xa5, 0x58, 0x61, 0xb8, 0x84, 0x20, 0xc1, 0x1a, 0x63, 0x00, 0x04, 0x2a, + 0x21, 0x04, 0x00, 0x51, 0x42, 0x00, 0x05, 0x0a, 0x03, 0x08, 0x03, 0x29, + 0x3f, 0x08, 0x00, 0x71, 0x68, 0x00, 0x00, 0x54, 0xe0, 0x02, 0x00, 0xf0, + 0x1f, 0xe0, 0x12, 0x39, 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0xaa, + 0x00, 0x00, 0x80, 0x52, 0xa2, 0x01, 0x00, 0xb4, 0xe3, 0x01, 0x00, 0xf0, + 0x63, 0x80, 0x0d, 0x91, 0x44, 0x18, 0x40, 0xb9, 0x00, 0x00, 0x80, 0x52, + 0x63, 0x58, 0x61, 0xb8, 0x9f, 0x00, 0x23, 0x6a, 0xc1, 0x00, 0x00, 0x54, + 0x42, 0x1c, 0x40, 0xb9, 0x20, 0x00, 0x80, 0x52, 0x01, 0x20, 0xc1, 0x1a, + 0x3f, 0x00, 0x02, 0x6a, 0xe0, 0x07, 0x9f, 0x1a, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xa8, 0xa9, 0x1f, 0x00, 0x00, 0xf1, 0x24, 0x18, 0x40, 0xfa, + 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x00, 0xaa, + 0xf6, 0x03, 0x01, 0xaa, 0xfb, 0x73, 0x05, 0xa9, 0xa0, 0x07, 0x00, 0x54, + 0xe1, 0xe3, 0x01, 0x91, 0xe0, 0x02, 0x00, 0xf0, 0x00, 0xe0, 0x10, 0x91, + 0xf9, 0x6b, 0x04, 0xa9, 0xff, 0xff, 0x07, 0xa9, 0xe6, 0x0b, 0x00, 0x94, + 0xfc, 0x03, 0x00, 0x2a, 0x80, 0x08, 0x00, 0x35, 0xf7, 0x63, 0x03, 0xa9, + 0x19, 0x80, 0x84, 0xd2, 0xf7, 0x3f, 0x40, 0xf9, 0xff, 0x02, 0x19, 0xeb, + 0xe8, 0x0c, 0x00, 0x54, 0xe0, 0x02, 0x00, 0xf0, 0x00, 0xa0, 0x54, 0x39, + 0x21, 0x03, 0x17, 0xcb, 0xf3, 0x53, 0x01, 0xa9, 0xe1, 0x33, 0x00, 0xf9, + 0x00, 0x0a, 0x00, 0x35, 0xfa, 0x43, 0x40, 0xf9, 0xf3, 0x03, 0x02, 0x91, + 0xff, 0x37, 0x00, 0xf9, 0xf4, 0x02, 0x00, 0x90, 0x94, 0xe2, 0x22, 0x91, + 0x94, 0x42, 0x00, 0x91, 0xfb, 0x03, 0x06, 0x91, 0x18, 0x00, 0x80, 0xd2, + 0x19, 0x00, 0x80, 0xd2, 0xe0, 0x03, 0x13, 0xaa, 0x02, 0x20, 0x80, 0xd2, + 0x01, 0x00, 0x80, 0x52, 0x98, 0xef, 0x00, 0x94, 0x1f, 0x20, 0x03, 0xd5, + 0x82, 0x82, 0x5f, 0xf8, 0xe1, 0x03, 0x13, 0xaa, 0xe0, 0x03, 0x14, 0xaa, + 0xe2, 0x01, 0x00, 0xb4, 0xc6, 0x0b, 0x00, 0x94, 0xa0, 0x0a, 0x00, 0x35, + 0x82, 0x82, 0x5f, 0xf8, 0x94, 0xe2, 0x01, 0x91, 0x61, 0x02, 0x40, 0xf9, + 0x40, 0x00, 0x01, 0xcb, 0x3f, 0x00, 0x02, 0xeb, 0x28, 0x0c, 0x00, 0x54, + 0x60, 0x06, 0x00, 0xf9, 0x73, 0x42, 0x00, 0x91, 0x39, 0x03, 0x01, 0x8b, + 0x18, 0x03, 0x00, 0x8b, 0x7f, 0x03, 0x13, 0xeb, 0xe1, 0xfd, 0xff, 0x54, + 0xe0, 0x37, 0x40, 0xf9, 0xf7, 0x02, 0x1a, 0x8b, 0xe3, 0x02, 0x19, 0x8b, + 0x18, 0x00, 0x18, 0x8b, 0xe0, 0x33, 0x40, 0xf9, 0xf3, 0x53, 0x41, 0xa9, + 0x19, 0x03, 0x00, 0x8b, 0xf7, 0x63, 0x43, 0xa9, 0x1f, 0x00, 0x00, 0x14, + 0xe3, 0x01, 0x00, 0xf0, 0x63, 0xc0, 0x08, 0x91, 0x42, 0x00, 0x80, 0x52, + 0x21, 0x01, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0xc6, 0x2e, 0x00, 0x94, + 0xdf, 0x02, 0x00, 0xf1, 0xa4, 0x1a, 0x40, 0xfa, 0x21, 0x0b, 0x00, 0x54, + 0x5c, 0x21, 0x81, 0x52, 0xe0, 0x03, 0x1c, 0x2a, 0xf5, 0x5b, 0x42, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xd8, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe2, 0x03, 0x00, 0x2a, 0xe3, 0x01, 0x00, 0xf0, 0x63, 0x40, 0x08, 0x91, + 0x41, 0x00, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0xb7, 0x2e, 0x00, 0x94, + 0xe3, 0x01, 0x00, 0xf0, 0x63, 0x20, 0x0a, 0x91, 0x02, 0x21, 0x81, 0x52, + 0x21, 0x01, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0xb1, 0x2e, 0x00, 0x94, + 0x5c, 0x21, 0x81, 0x52, 0x03, 0x00, 0x80, 0xd2, 0x19, 0x00, 0x80, 0xd2, + 0xa3, 0x02, 0x00, 0xf9, 0xe0, 0x03, 0x1c, 0x2a, 0xd9, 0x02, 0x00, 0xf9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xfd, 0x7b, 0xd8, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x03, 0x02, 0x91, + 0xe0, 0x02, 0x00, 0xf0, 0xe1, 0x03, 0x13, 0xaa, 0x00, 0x00, 0x13, 0x91, + 0x85, 0x0b, 0x00, 0x94, 0xa0, 0x05, 0x00, 0x35, 0xfa, 0x43, 0x40, 0xf9, + 0xb8, 0x03, 0xa0, 0xf0, 0x18, 0x03, 0x00, 0x91, 0x5f, 0x03, 0x18, 0xeb, + 0xa8, 0x00, 0x00, 0x54, 0x00, 0x03, 0x1a, 0xcb, 0xe0, 0x37, 0x00, 0xf9, + 0xf7, 0x3f, 0x40, 0xf9, 0xa6, 0xff, 0xff, 0x17, 0xf3, 0x53, 0x41, 0xa9, + 0x1f, 0x20, 0x03, 0xd5, 0xe3, 0x01, 0x00, 0xf0, 0x63, 0x60, 0x07, 0x91, + 0xe2, 0x20, 0x81, 0x52, 0x21, 0x01, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, + 0x8f, 0x2e, 0x00, 0x94, 0xf7, 0x63, 0x43, 0xa9, 0xd7, 0xff, 0xff, 0x17, + 0xe2, 0x03, 0x00, 0x2a, 0xe3, 0x01, 0x00, 0xf0, 0x63, 0x40, 0x08, 0x91, + 0x41, 0x00, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0x87, 0x2e, 0x00, 0x94, + 0xe3, 0x01, 0x00, 0xf0, 0x63, 0x80, 0x09, 0x91, 0x22, 0x21, 0x81, 0x52, + 0x21, 0x01, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0x81, 0x2e, 0x00, 0x94, + 0x5c, 0x21, 0x81, 0x52, 0x03, 0x00, 0x80, 0xd2, 0x19, 0x00, 0x80, 0xd2, + 0xf3, 0x53, 0x41, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xce, 0xff, 0xff, 0x17, + 0xe3, 0x01, 0x00, 0xf0, 0x63, 0x60, 0x07, 0x91, 0xe2, 0x20, 0x81, 0x52, + 0x21, 0x01, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0x75, 0x2e, 0x00, 0x94, + 0xee, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0xe3, 0x01, 0x00, 0xf0, + 0x63, 0x40, 0x08, 0x91, 0x41, 0x00, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, + 0x6e, 0x2e, 0x00, 0x94, 0xf3, 0x53, 0x41, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xb5, 0xff, 0xff, 0x17, 0x03, 0x00, 0x80, 0xd2, 0x5c, 0x21, 0x81, 0x52, + 0xf9, 0x6b, 0x04, 0xa9, 0x19, 0x00, 0x80, 0xd2, 0xb9, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbf, 0xa9, 0xe5, 0x02, 0x00, 0x90, + 0xa5, 0xe0, 0x18, 0x91, 0xfd, 0x03, 0x00, 0x91, 0xee, 0x02, 0x00, 0xd0, + 0xe0, 0x02, 0x00, 0xd0, 0x02, 0x54, 0x42, 0xf9, 0xcb, 0x02, 0x00, 0xf0, + 0x6b, 0xe1, 0x22, 0x91, 0xaa, 0x00, 0x0a, 0x91, 0xdf, 0x51, 0x02, 0xf9, + 0x08, 0x00, 0x80, 0xd2, 0x0d, 0x0f, 0x80, 0xd2, 0x1f, 0x20, 0x03, 0xd5, + 0xa6, 0x04, 0x40, 0xf9, 0x86, 0x02, 0x00, 0xb4, 0xa7, 0x00, 0x40, 0xf9, + 0x03, 0x7d, 0x0d, 0x9b, 0xa9, 0x08, 0x40, 0xf9, 0xe0, 0x03, 0x05, 0xaa, + 0x64, 0x01, 0x03, 0x8b, 0xec, 0x00, 0x02, 0xcb, 0x3f, 0x01, 0x07, 0xeb, + 0x81, 0x00, 0x80, 0x52, 0x60, 0x01, 0x00, 0x54, 0xff, 0x00, 0x02, 0xeb, + 0xa0, 0x00, 0x00, 0x54, 0x08, 0x05, 0x00, 0x91, 0xc8, 0x51, 0x02, 0xf9, + 0x62, 0x69, 0x23, 0xf8, 0x8c, 0x04, 0x00, 0xf9, 0x25, 0xff, 0xff, 0x97, + 0x1f, 0x1c, 0x00, 0x72, 0xc6, 0x00, 0x07, 0x8b, 0xc2, 0x00, 0x89, 0x9a, + 0xa5, 0xa0, 0x00, 0x91, 0xbf, 0x00, 0x0a, 0xeb, 0x21, 0xfd, 0xff, 0x54, + 0xe0, 0x02, 0x00, 0xd0, 0x00, 0x58, 0x42, 0xf9, 0x1f, 0x00, 0x02, 0xeb, + 0x43, 0x01, 0x00, 0x54, 0x01, 0x0f, 0x80, 0xd2, 0x00, 0x04, 0x00, 0x91, + 0x00, 0x00, 0x02, 0xcb, 0x01, 0x7d, 0x01, 0x9b, 0x08, 0x05, 0x00, 0x91, + 0xc8, 0x51, 0x02, 0xf9, 0x63, 0x01, 0x01, 0x8b, 0x62, 0x69, 0x21, 0xf8, + 0x60, 0x04, 0x00, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, 0xe1, 0x03, 0x08, 0xaa, + 0xe0, 0x03, 0x0b, 0xaa, 0xe3, 0xff, 0xff, 0xf0, 0x63, 0x00, 0x24, 0x91, + 0x02, 0x0f, 0x80, 0xd2, 0x53, 0xef, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x02, 0x00, 0xd0, 0xa1, 0x52, 0x42, 0xf9, + 0xc1, 0x02, 0x00, 0xb4, 0xf6, 0x03, 0x00, 0xaa, 0xb5, 0x82, 0x12, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xd3, 0x02, 0x00, 0xf0, 0x73, 0xe2, 0x22, 0x91, + 0x14, 0x00, 0x80, 0xd2, 0x04, 0x00, 0x00, 0x14, 0x73, 0xe2, 0x01, 0x91, + 0x3f, 0x00, 0x14, 0xeb, 0x69, 0x01, 0x00, 0x54, 0x61, 0x06, 0x40, 0xf9, + 0x80, 0x00, 0x80, 0x52, 0x94, 0x06, 0x00, 0x91, 0xc0, 0x02, 0x3f, 0xd6, + 0xa1, 0x02, 0x40, 0xf9, 0x00, 0xff, 0xff, 0xb5, 0x7f, 0x06, 0x00, 0xf9, + 0x3f, 0x00, 0x14, 0xeb, 0x73, 0xe2, 0x01, 0x91, 0xe8, 0xfe, 0xff, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0xf6, 0x02, 0x00, 0xd0, 0xc0, 0x52, 0x42, 0xf9, 0xf3, 0x53, 0x01, 0xa9, + 0x00, 0x0a, 0x00, 0xb4, 0xf7, 0x63, 0x03, 0xa9, 0xd8, 0x02, 0x00, 0xf0, + 0x18, 0xe3, 0x22, 0x91, 0xf7, 0x01, 0x00, 0xd0, 0xf7, 0xe2, 0x0a, 0x91, + 0xf3, 0x03, 0x18, 0xaa, 0x55, 0x40, 0x80, 0x52, 0x14, 0x00, 0x80, 0xd2, + 0x05, 0x00, 0x00, 0x14, 0xc1, 0x52, 0x42, 0xf9, 0x73, 0xe2, 0x01, 0x91, + 0x3f, 0x00, 0x14, 0xeb, 0xc9, 0x03, 0x00, 0x54, 0x62, 0x06, 0x40, 0xf9, + 0x94, 0x06, 0x00, 0x91, 0x42, 0xff, 0xff, 0xb4, 0x63, 0x02, 0x40, 0xf9, + 0x63, 0x3a, 0x00, 0xf9, 0xe1, 0x03, 0x17, 0xaa, 0x60, 0x42, 0x00, 0x91, + 0xc1, 0x0a, 0x00, 0x94, 0xf5, 0x03, 0x00, 0x2a, 0x60, 0xfe, 0xff, 0x34, + 0xe2, 0x03, 0x00, 0x2a, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xe3, 0x01, 0x00, 0xd0, 0x63, 0x80, 0x0b, 0x91, 0xe5, 0x2d, 0x00, 0x94, + 0xc1, 0x52, 0x42, 0xf9, 0xe0, 0x03, 0x18, 0xaa, 0x02, 0x0f, 0x80, 0xd2, + 0x13, 0x00, 0x80, 0x52, 0xe3, 0xff, 0xff, 0xf0, 0x63, 0x00, 0x24, 0x91, + 0x06, 0xef, 0x00, 0x94, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe3, 0xff, 0xff, 0xf0, 0x63, 0x00, 0x24, 0x91, + 0xe0, 0x03, 0x18, 0xaa, 0x02, 0x0f, 0x80, 0xd2, 0x13, 0x00, 0x80, 0x52, + 0xfa, 0xee, 0x00, 0x94, 0xb5, 0x00, 0x00, 0x35, 0xe0, 0x02, 0x00, 0xd0, + 0x00, 0xe0, 0x52, 0x39, 0x33, 0x00, 0x80, 0x52, 0xe0, 0x00, 0x00, 0x35, + 0xf7, 0x63, 0x43, 0xa9, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0x02, 0x00, 0xd0, 0x00, 0x00, 0x13, 0x91, 0xa3, 0xff, 0x07, 0xd0, + 0x63, 0x00, 0x00, 0x91, 0xa2, 0x03, 0xa0, 0xd0, 0x42, 0x00, 0x00, 0x91, + 0xe1, 0x01, 0x00, 0xd0, 0x21, 0x20, 0x0c, 0x91, 0x03, 0x30, 0x00, 0xf9, + 0x91, 0x0a, 0x00, 0x94, 0xe1, 0x02, 0x00, 0xd0, 0x1f, 0x00, 0x00, 0x71, + 0xf5, 0x5b, 0x42, 0xa9, 0x33, 0xa0, 0x14, 0x39, 0xf3, 0x17, 0x9f, 0x1a, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe3, 0xff, 0xff, 0xf0, + 0xc0, 0x02, 0x00, 0xf0, 0x63, 0x00, 0x24, 0x91, 0x00, 0xe0, 0x22, 0x91, + 0x02, 0x0f, 0x80, 0xd2, 0x01, 0x00, 0x80, 0xd2, 0x13, 0x00, 0x80, 0x52, + 0xd3, 0xee, 0x00, 0x94, 0xdf, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbb, 0xa9, 0xe2, 0x03, 0x00, 0x2a, 0x03, 0x00, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0xe1, 0x23, 0x01, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0xf6, 0x03, 0x00, 0xaa, 0xe0, 0x02, 0x00, 0xd0, 0x00, 0xe0, 0x10, 0x91, + 0xff, 0x27, 0x00, 0xf9, 0x9e, 0x0a, 0x00, 0x94, 0x40, 0x03, 0x00, 0x34, + 0xf5, 0x02, 0x00, 0xd0, 0xa0, 0x52, 0x42, 0xf9, 0xa0, 0x03, 0x00, 0xb4, + 0xf3, 0x53, 0x01, 0xa9, 0xd3, 0x02, 0x00, 0xf0, 0x73, 0xe2, 0x22, 0x91, + 0x14, 0x00, 0x80, 0xd2, 0xf7, 0x1b, 0x00, 0xf9, 0xf7, 0x03, 0x16, 0x2a, + 0x05, 0x00, 0x00, 0x14, 0xa1, 0x52, 0x42, 0xf9, 0x73, 0xe2, 0x01, 0x91, + 0x3f, 0x00, 0x14, 0xeb, 0x09, 0x02, 0x00, 0x54, 0x61, 0x06, 0x40, 0xf9, + 0x94, 0x06, 0x00, 0x91, 0x41, 0xff, 0xff, 0xb4, 0xe2, 0x03, 0x17, 0x2a, + 0xe1, 0x23, 0x01, 0x91, 0x60, 0x42, 0x00, 0x91, 0x03, 0x00, 0x80, 0x52, + 0x87, 0x0a, 0x00, 0x94, 0x80, 0xfe, 0xff, 0x35, 0xf3, 0x53, 0x41, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xf5, 0x5b, 0x42, 0xa9, 0xe0, 0x27, 0x40, 0xf9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x53, 0x41, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xe0, 0x02, 0x00, 0xd0, 0x00, 0xa0, 0x54, 0x39, + 0x80, 0x01, 0x00, 0x35, 0x42, 0x20, 0x81, 0x52, 0x21, 0x01, 0x80, 0x52, + 0x80, 0x00, 0x80, 0x52, 0xe3, 0x01, 0x00, 0xd0, 0x63, 0x80, 0x0c, 0x91, + 0xff, 0x27, 0x00, 0xf9, 0x74, 0x2d, 0x00, 0x94, 0xf5, 0x5b, 0x42, 0xa9, + 0xe0, 0x27, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0x02, 0x00, 0xd0, 0xe2, 0x03, 0x16, 0x2a, 0xe1, 0x23, 0x01, 0x91, + 0x00, 0x00, 0x13, 0x91, 0x03, 0x00, 0x80, 0x52, 0x6a, 0x0a, 0x00, 0x94, + 0xe0, 0xfd, 0xff, 0x35, 0xf5, 0x5b, 0x42, 0xa9, 0xe0, 0x27, 0x40, 0xf9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x6e, 0x0a, 0x00, 0x94, 0x60, 0x00, 0x00, 0x35, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xc1, 0xa8, + 0xe2, 0x03, 0x00, 0x2a, 0xe3, 0x01, 0x00, 0xd0, 0x63, 0x00, 0x0d, 0x91, + 0x41, 0x00, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0x58, 0x2d, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x02, 0x00, 0xd0, 0x00, 0x50, 0x20, 0x91, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x85, 0xd2, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbf, 0xa9, + 0x00, 0x20, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, 0xe9, 0x8a, 0x00, 0x94, + 0x00, 0x1c, 0x00, 0x12, 0x01, 0xf0, 0xa7, 0x12, 0x62, 0x03, 0x00, 0xb0, + 0x43, 0x64, 0x64, 0x39, 0x62, 0x03, 0x00, 0xb0, 0x42, 0x60, 0x64, 0x39, + 0x21, 0x00, 0x40, 0x39, 0x7f, 0x00, 0x00, 0x71, 0x41, 0x10, 0x81, 0x1a, + 0x1f, 0x64, 0x00, 0x71, 0x60, 0x03, 0x00, 0xb0, 0x60, 0x01, 0x00, 0x54, + 0xc1, 0x00, 0x00, 0x34, 0x3f, 0x04, 0x00, 0x71, 0x80, 0x01, 0x00, 0x54, + 0xfd, 0x7b, 0xc1, 0xa8, 0x1f, 0x1c, 0x09, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x21, 0x00, 0x80, 0x52, 0x01, 0x1c, 0x09, 0xb9, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x41, 0x00, 0x80, 0x52, 0x01, 0x1c, 0x09, 0xb9, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x61, 0x00, 0x80, 0x52, + 0x01, 0x1c, 0x09, 0xb9, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x02, 0x00, 0xb0, + 0x84, 0xb0, 0x19, 0x91, 0x83, 0x02, 0x00, 0xb0, 0x63, 0x30, 0x19, 0x91, + 0x62, 0x02, 0x00, 0xd0, 0x42, 0xc0, 0x1d, 0x91, 0x9f, 0x7c, 0x00, 0xa9, + 0x81, 0x00, 0x80, 0x52, 0x20, 0x20, 0x80, 0x52, 0x7f, 0x7c, 0x00, 0xa9, + 0x9f, 0x7c, 0x01, 0xa9, 0x7f, 0x7c, 0x01, 0xa9, 0xd4, 0x8a, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc1, 0x82, 0x81, 0xd2, 0xe1, 0x0f, 0xb8, 0xf2, 0x1f, 0x00, 0x01, 0xeb, + 0x69, 0x00, 0x00, 0x54, 0x20, 0x40, 0x81, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xbf, 0xa9, 0x22, 0x7d, 0x9e, 0xd2, 0xe0, 0x02, 0x00, 0xd0, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0xc0, 0x14, 0x91, 0xe1, 0x82, 0x81, 0xd2, + 0xe1, 0x0f, 0xb8, 0xf2, 0x5b, 0xed, 0x00, 0x94, 0x22, 0x7d, 0x9e, 0xd2, + 0x01, 0x00, 0x80, 0x52, 0xe0, 0x82, 0x81, 0xd2, 0xe0, 0x0f, 0xb8, 0xf2, + 0xb6, 0xed, 0x00, 0x94, 0x61, 0x03, 0x00, 0xb0, 0x22, 0x00, 0x80, 0x52, + 0x00, 0x00, 0x80, 0x52, 0xfd, 0x7b, 0xc1, 0xa8, 0x22, 0x64, 0x24, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x03, 0x00, 0xb0, 0x04, 0x64, 0x64, 0x39, + 0x85, 0xfe, 0x9b, 0xd2, 0xe5, 0x0f, 0xb8, 0xf2, 0x60, 0xfe, 0x9b, 0xd2, + 0xe0, 0x0f, 0xb8, 0xf2, 0xa1, 0xfe, 0x9b, 0xd2, 0xe1, 0x0f, 0xb8, 0xf2, + 0xc3, 0xfe, 0x9b, 0xd2, 0xe3, 0x0f, 0xb8, 0xf2, 0x06, 0x00, 0x40, 0x39, + 0xa2, 0x00, 0x40, 0x39, 0x21, 0x00, 0x40, 0x39, 0x63, 0x00, 0x40, 0x39, + 0xc4, 0x00, 0x00, 0x35, 0x60, 0x1c, 0x08, 0x53, 0xc2, 0x20, 0x02, 0x2a, + 0x00, 0x40, 0x01, 0x2a, 0x00, 0x00, 0x02, 0x2a, 0xc0, 0x03, 0x5f, 0xd6, + 0x40, 0x03, 0x00, 0xf0, 0x00, 0x0c, 0x49, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x03, 0x00, 0xf0, 0x00, 0x40, 0x24, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x02, 0x00, 0xd0, + 0x00, 0xc0, 0x14, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x02, 0x00, 0xb0, 0x00, 0x30, 0x1a, 0x91, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0xb0, 0x00, 0x80, 0x26, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0xb0, + 0x00, 0x30, 0x08, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x02, 0x00, 0xb0, 0x00, 0xb0, 0x1b, 0x91, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0xb0, 0x00, 0xe0, 0x26, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0xa7, 0x12, + 0x62, 0x03, 0x00, 0xb0, 0x43, 0x64, 0x64, 0x39, 0x62, 0x03, 0x00, 0xb0, + 0x42, 0x60, 0x64, 0x39, 0x21, 0x00, 0x40, 0x39, 0x7f, 0x00, 0x00, 0x71, + 0x41, 0x10, 0x81, 0x1a, 0x01, 0x00, 0x00, 0x39, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x02, 0x00, 0xb0, + 0xe3, 0x03, 0x00, 0x2a, 0x81, 0x00, 0x80, 0xd2, 0x40, 0x50, 0x26, 0x91, + 0x43, 0x94, 0x09, 0xb9, 0xe2, 0xa0, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0xb0, 0x00, 0x94, 0x49, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x60, 0x02, 0x00, 0xd0, + 0x00, 0xc0, 0x1d, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x02, 0x00, 0xd0, 0x00, 0x60, 0x1e, 0x91, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x82, 0x02, 0x00, 0xb0, 0xe3, 0x03, 0x00, 0x2a, + 0x81, 0x00, 0x80, 0xd2, 0x40, 0x60, 0x26, 0x91, 0x43, 0x98, 0x09, 0xb9, + 0xce, 0xa0, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x03, 0x00, 0xb0, 0x00, 0x1c, 0x49, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0xb0, 0x00, 0x60, 0x29, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0xd0, + 0x00, 0x60, 0x01, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x02, 0x00, 0xb0, 0x00, 0x70, 0x26, 0x91, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x03, 0x00, 0xb0, 0x00, 0x00, 0x25, 0x91, + 0xca, 0x08, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0xe4, 0x03, 0x00, 0x2a, 0x1f, 0x0c, 0x00, 0x71, 0xfd, 0x03, 0x00, 0x91, + 0x88, 0x02, 0x00, 0x54, 0x82, 0x02, 0x00, 0xd0, 0x42, 0xa0, 0x19, 0x91, + 0xe0, 0x43, 0x00, 0x91, 0x01, 0x00, 0x80, 0x52, 0xff, 0x0f, 0x00, 0xf9, + 0x42, 0x58, 0x64, 0xb8, 0xe2, 0x7f, 0x02, 0x29, 0x30, 0x07, 0x00, 0x94, + 0x20, 0x01, 0x00, 0x34, 0xe2, 0x03, 0x00, 0x2a, 0x1f, 0x2c, 0x08, 0x71, + 0x00, 0x02, 0x00, 0x54, 0xe3, 0x01, 0x00, 0xd0, 0x63, 0x80, 0x0e, 0x91, + 0xc1, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x77, 0x2c, 0x00, 0x94, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x02, 0x00, 0x80, 0x52, + 0xc1, 0x00, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0xe3, 0x01, 0x00, 0xd0, + 0x63, 0x20, 0x0f, 0x91, 0x6f, 0x2c, 0x00, 0x94, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe3, 0x01, 0x00, 0xd0, 0x63, 0xe0, 0x0d, 0x91, + 0xc1, 0x00, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0x68, 0x2c, 0x00, 0x94, + 0xf1, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xd0, 0x6a, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbf, 0xa9, 0x00, 0x00, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0xd1, 0x6a, 0x00, 0x94, 0xfd, 0x7b, 0xc1, 0xa8, + 0x20, 0x00, 0x80, 0x52, 0xce, 0x6a, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbf, 0xa9, 0x00, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0xd1, 0x6a, 0x00, 0x94, 0xfd, 0x7b, 0xc1, 0xa8, 0x20, 0x00, 0x80, 0x52, + 0xce, 0x6a, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x62, 0x03, 0x00, 0xb0, + 0x43, 0x90, 0x64, 0x39, 0x23, 0x02, 0x00, 0x34, 0x1f, 0x3c, 0x00, 0x71, + 0x88, 0x01, 0x00, 0x54, 0x62, 0x03, 0x00, 0xb0, 0x42, 0x98, 0x44, 0xf9, + 0x3f, 0x00, 0x02, 0xeb, 0x02, 0x01, 0x00, 0x54, 0x62, 0x03, 0x00, 0xb0, + 0x43, 0x9c, 0x44, 0xf9, 0x22, 0x00, 0x80, 0x52, 0x61, 0x78, 0x61, 0xb8, + 0x3f, 0x04, 0x00, 0x31, 0x60, 0x00, 0x00, 0x54, 0xc5, 0x6a, 0x00, 0x14, + 0x22, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x02, 0x2a, 0xc0, 0x03, 0x5f, 0xd6, + 0x62, 0xc0, 0x80, 0x52, 0xe0, 0x03, 0x02, 0x2a, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, 0x05, 0x00, 0x34, + 0xe3, 0x03, 0x00, 0xaa, 0xe4, 0x01, 0x00, 0xd0, 0x84, 0xe0, 0x10, 0x91, + 0x20, 0x04, 0x00, 0x51, 0x66, 0x04, 0x00, 0x91, 0x01, 0x00, 0x80, 0x52, + 0xc6, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x80, 0x52, 0x1f, 0x20, 0x03, 0xd5, + 0x62, 0x14, 0x40, 0x38, 0x45, 0x0c, 0x00, 0x12, 0xdf, 0x00, 0x03, 0xeb, + 0x42, 0x7c, 0x04, 0x53, 0x40, 0x10, 0x00, 0x2a, 0x00, 0x00, 0x01, 0x4a, + 0x02, 0x7c, 0x1c, 0x53, 0xa0, 0x10, 0x00, 0x2a, 0x82, 0x78, 0x62, 0xb8, + 0x40, 0x00, 0x00, 0x4a, 0x02, 0x7c, 0x1c, 0x53, 0x81, 0x78, 0x62, 0xb8, + 0x81, 0xfe, 0xff, 0x54, 0x00, 0x6c, 0x1c, 0x53, 0x02, 0x00, 0x01, 0x4a, + 0x42, 0x7c, 0x1c, 0x53, 0x83, 0x78, 0x62, 0xb8, 0x00, 0x00, 0x01, 0x4a, + 0xe4, 0x01, 0x00, 0xd0, 0x84, 0xe0, 0x10, 0x91, 0x82, 0x00, 0x80, 0x52, + 0x60, 0x10, 0x00, 0x4a, 0x42, 0x04, 0x00, 0x71, 0x60, 0x01, 0x00, 0x54, + 0x01, 0x7c, 0x1c, 0x53, 0x00, 0x6c, 0x1c, 0x53, 0x42, 0x04, 0x00, 0x71, + 0x81, 0x78, 0x61, 0xb8, 0x03, 0x00, 0x01, 0x4a, 0x00, 0x00, 0x01, 0x4a, + 0x63, 0x7c, 0x1c, 0x53, 0x83, 0x78, 0x63, 0xb8, 0x60, 0x10, 0x00, 0x4a, + 0xe1, 0xfe, 0xff, 0x54, 0xc0, 0x03, 0x5f, 0xd6, 0x03, 0x00, 0x80, 0x52, + 0x00, 0x00, 0x80, 0x52, 0xec, 0xff, 0xff, 0x17, 0xc0, 0x09, 0x00, 0xb4, + 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x13, 0x00, 0x60, 0xb9, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x00, 0xaa, + 0x61, 0x06, 0x00, 0x51, 0x3f, 0xfc, 0x1f, 0x71, 0xc9, 0x00, 0x00, 0x54, + 0x20, 0xc0, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x61, 0x76, 0x1e, 0x53, + 0xf7, 0x1b, 0x00, 0xf9, 0xbf, 0xff, 0xff, 0x97, 0xe1, 0x03, 0x00, 0x2a, + 0xa2, 0x06, 0x60, 0xb9, 0x40, 0xc0, 0x80, 0x52, 0x5f, 0x00, 0x01, 0x6b, + 0xc0, 0x00, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x74, 0x03, 0x00, 0xb0, 0x76, 0x03, 0x00, 0xb0, 0xc0, 0x9e, 0x44, 0xf9, + 0xf3, 0x03, 0x13, 0x2a, 0x93, 0x9a, 0x04, 0xf9, 0xa0, 0x06, 0x00, 0xb4, + 0xc2, 0xfb, 0xff, 0x97, 0x93, 0x9a, 0x44, 0xf9, 0x77, 0xf6, 0x7e, 0xd3, + 0xe0, 0x03, 0x17, 0xaa, 0x86, 0xfb, 0xff, 0x97, 0xc0, 0x9e, 0x04, 0xf9, + 0xf4, 0x03, 0x00, 0xaa, 0xe0, 0x06, 0x00, 0xb4, 0xe2, 0x03, 0x17, 0xaa, + 0xe1, 0x03, 0x15, 0xaa, 0x2c, 0xec, 0x00, 0x94, 0x73, 0x03, 0x00, 0xb4, + 0x65, 0x03, 0x00, 0xb0, 0xa4, 0x20, 0x49, 0xb9, 0x00, 0x00, 0x80, 0x52, + 0x01, 0x00, 0x80, 0x52, 0x02, 0x00, 0x80, 0xd2, 0x08, 0x00, 0x00, 0x14, + 0x9f, 0x00, 0x03, 0x6b, 0x61, 0x03, 0x00, 0x54, 0x22, 0x04, 0x00, 0x11, + 0xe4, 0x03, 0x03, 0x2a, 0xe1, 0x03, 0x02, 0xaa, 0x7f, 0x42, 0x22, 0xeb, + 0x89, 0x01, 0x00, 0x54, 0x82, 0x7a, 0x62, 0xb8, 0x43, 0x3c, 0x10, 0x12, + 0x5f, 0x0c, 0x40, 0xf2, 0x41, 0x02, 0x00, 0x54, 0xa1, 0xfe, 0xff, 0x35, + 0x22, 0x04, 0x00, 0x11, 0xe4, 0x03, 0x03, 0x2a, 0xe1, 0x03, 0x02, 0xaa, + 0x20, 0x00, 0x80, 0x52, 0x7f, 0x42, 0x22, 0xeb, 0xc8, 0xfe, 0xff, 0x54, + 0x40, 0x00, 0x00, 0x34, 0xa3, 0x20, 0x09, 0xb9, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0xc0, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x80, 0x00, 0x00, 0x34, 0xa4, 0x20, 0x09, 0xb9, + 0xf7, 0x1b, 0x40, 0xf9, 0xb7, 0xff, 0xff, 0x17, 0xf7, 0x1b, 0x40, 0xf9, + 0xb5, 0xff, 0xff, 0x17, 0x77, 0xf6, 0x7e, 0xd3, 0xe0, 0x03, 0x17, 0xaa, + 0x54, 0xfb, 0xff, 0x97, 0xc0, 0x9e, 0x04, 0xf9, 0xf4, 0x03, 0x00, 0xaa, + 0xa0, 0x00, 0x00, 0xb4, 0xe2, 0x03, 0x17, 0xaa, 0xe1, 0x03, 0x15, 0xaa, + 0xfa, 0xeb, 0x00, 0x94, 0xcf, 0xff, 0xff, 0x17, 0xa0, 0x00, 0x80, 0x52, + 0xf7, 0x1b, 0x40, 0xf9, 0xa9, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0x33, 0xc0, 0x80, 0x52, 0xbc, 0xfe, 0xff, 0x97, 0x20, 0x02, 0x00, 0xb4, + 0x96, 0xff, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0xc0, 0x01, 0x00, 0x35, + 0xab, 0x6a, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0x60, 0x01, 0x00, 0x35, + 0xe1, 0xb3, 0x00, 0x91, 0xe0, 0xa3, 0x00, 0x91, 0x36, 0x6a, 0x00, 0x94, + 0xe0, 0x0b, 0x45, 0x29, 0x61, 0x03, 0x00, 0xb0, 0x63, 0x03, 0x00, 0xb0, + 0x24, 0x00, 0x80, 0x52, 0x00, 0x00, 0x02, 0x0b, 0x20, 0x28, 0x09, 0xb9, + 0x64, 0x90, 0x24, 0x39, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x02, 0x51, 0x1f, 0x0c, 0x00, 0x71, + 0x69, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x82, 0x02, 0x00, 0xd0, 0x42, 0x60, 0x19, 0x91, 0x01, 0x00, 0x00, 0x90, + 0x21, 0x40, 0x1d, 0x91, 0x40, 0x58, 0x60, 0xb8, 0x26, 0x6a, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x02, 0x51, 0x1f, 0x0c, 0x00, 0x71, + 0x69, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x81, 0x02, 0x00, 0xd0, 0x21, 0x60, 0x19, 0x91, 0x20, 0x58, 0x60, 0xb8, + 0x30, 0x6a, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xe1, 0x01, 0x00, 0xd0, + 0x02, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0x75, 0x03, 0x00, 0xb0, 0xb5, 0x02, 0x25, 0x91, 0xe0, 0x03, 0x15, 0xaa, + 0x21, 0xa0, 0x0f, 0x91, 0x16, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x01, 0xa9, + 0x89, 0x07, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x01, 0x00, 0x34, + 0xe5, 0x03, 0x00, 0x2a, 0xe6, 0x03, 0x16, 0x2a, 0x00, 0x01, 0x80, 0x52, + 0xe4, 0x03, 0x13, 0x2a, 0xe2, 0x03, 0x13, 0x2a, 0xe3, 0x01, 0x00, 0xd0, + 0x21, 0x00, 0x80, 0x52, 0x63, 0xe0, 0x0f, 0x91, 0x5a, 0x2b, 0x00, 0x94, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x01, 0x00, 0x00, 0x90, + 0x21, 0x00, 0x1d, 0x91, 0xa0, 0x00, 0x80, 0x52, 0xc5, 0x88, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0x20, 0x01, 0x00, 0x34, 0x21, 0x00, 0x00, 0x14, + 0x80, 0x06, 0x00, 0x11, 0x34, 0x00, 0x80, 0x52, 0x1f, 0x00, 0x14, 0x6b, + 0xe1, 0x87, 0x9f, 0x1a, 0x7f, 0x02, 0x00, 0x71, 0x21, 0x00, 0x9f, 0x1a, + 0xe1, 0x01, 0x00, 0x34, 0xe0, 0x03, 0x15, 0xaa, 0x01, 0x32, 0x80, 0x52, + 0x8c, 0x07, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0xb4, 0xfe, 0xff, 0x35, + 0x00, 0x00, 0x80, 0x52, 0xd8, 0x69, 0x00, 0x94, 0x80, 0x06, 0x00, 0x11, + 0x34, 0x00, 0x80, 0x52, 0x1f, 0x00, 0x14, 0x6b, 0xe1, 0x87, 0x9f, 0x1a, + 0x7f, 0x02, 0x00, 0x71, 0x21, 0x00, 0x9f, 0x1a, 0x61, 0xfe, 0xff, 0x35, + 0xa0, 0x00, 0x80, 0x52, 0xc3, 0x88, 0x00, 0x94, 0xf6, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x15, 0xaa, 0x64, 0x07, 0x00, 0x94, 0x33, 0xfa, 0xff, 0x35, + 0xf3, 0x03, 0x16, 0x2a, 0xf6, 0xf9, 0xff, 0x35, 0x00, 0xfb, 0xff, 0x34, + 0xf3, 0x03, 0x00, 0x2a, 0xcc, 0xff, 0xff, 0x17, 0xa0, 0x00, 0x80, 0x52, + 0xb8, 0x88, 0x00, 0x94, 0xf3, 0x03, 0x14, 0x2a, 0xf6, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x15, 0xaa, 0x58, 0x07, 0x00, 0x94, 0xc5, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0x23, 0x01, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0xf3, 0x03, 0x02, 0xaa, 0xe2, 0xb3, 0x00, 0x91, 0x63, 0x02, 0x00, 0xb9, + 0x4d, 0x6b, 0x00, 0x94, 0xe0, 0x2f, 0x40, 0xb9, 0xa0, 0x00, 0x00, 0x35, + 0x7f, 0x02, 0x00, 0xb9, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x1f, 0x04, 0x00, 0x71, 0xa1, 0x00, 0x00, 0x54, + 0x60, 0x02, 0x00, 0xb9, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x1f, 0x0c, 0x00, 0x71, 0x60, 0xff, 0xff, 0x54, + 0x1f, 0x10, 0x00, 0x71, 0x81, 0xfe, 0xff, 0x54, 0x60, 0x02, 0x00, 0xb9, + 0xf8, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xc5, 0xf9, 0xff, 0x97, 0x13, 0x00, 0x80, 0x52, 0xf4, 0x03, 0x00, 0x2a, + 0x04, 0x00, 0x00, 0x14, 0x73, 0x06, 0x00, 0x11, 0x7f, 0x22, 0x00, 0x71, + 0x60, 0x01, 0x00, 0x54, 0x81, 0x26, 0xd3, 0x9a, 0x81, 0xff, 0x07, 0x36, + 0xe0, 0x03, 0x13, 0x2a, 0x43, 0x6b, 0x00, 0x94, 0xe0, 0x03, 0x13, 0x2a, + 0x21, 0x00, 0x80, 0x52, 0x73, 0x06, 0x00, 0x11, 0x67, 0x6b, 0x00, 0x94, + 0x7f, 0x22, 0x00, 0x71, 0xe1, 0xfe, 0xff, 0x54, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xc2, 0xf9, 0xff, 0x97, + 0x1f, 0x04, 0x00, 0x71, 0x60, 0x00, 0x00, 0x54, 0xfd, 0x7b, 0xc1, 0xa8, + 0xe2, 0xff, 0xff, 0x17, 0x45, 0xff, 0xff, 0x97, 0xa0, 0xff, 0xff, 0x34, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0x01, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0x2a, 0x47, 0x6b, 0x00, 0x94, + 0xe0, 0x03, 0x13, 0x2a, 0x21, 0x00, 0x80, 0x52, 0x34, 0x6b, 0x00, 0x94, + 0xe0, 0x03, 0x13, 0x2a, 0x01, 0x00, 0x80, 0x52, 0x51, 0x6b, 0x00, 0x94, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x03, 0x2a, 0xf3, 0x03, 0x00, 0x2a, + 0xf5, 0x5b, 0x02, 0xa9, 0x36, 0x3c, 0x00, 0x12, 0x55, 0x3c, 0x00, 0x12, + 0x01, 0x00, 0x80, 0x52, 0x43, 0x6b, 0x00, 0x94, 0x9f, 0x06, 0x00, 0x71, + 0x60, 0x01, 0x00, 0x54, 0xe0, 0x03, 0x13, 0x2a, 0x01, 0x00, 0x80, 0x52, + 0x1e, 0x6b, 0x00, 0x94, 0xbf, 0x06, 0x00, 0x71, 0x60, 0x01, 0x00, 0x54, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe1, 0x03, 0x14, 0x2a, + 0xe0, 0x03, 0x13, 0x2a, 0x14, 0x6b, 0x00, 0x94, 0xbf, 0x06, 0x00, 0x71, + 0xe1, 0xfe, 0xff, 0x54, 0xe1, 0x03, 0x15, 0x2a, 0xe0, 0x03, 0x13, 0x2a, + 0x27, 0x6b, 0x00, 0x94, 0xe1, 0x03, 0x15, 0x2a, 0xe0, 0x03, 0x13, 0x2a, + 0x1c, 0x6b, 0x00, 0x94, 0xe1, 0x03, 0x16, 0x2a, 0xe0, 0x03, 0x13, 0x2a, + 0x11, 0x6b, 0x00, 0x94, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0x5f, 0x10, 0x00, 0x71, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x03, 0x2a, 0xf3, 0x03, 0x00, 0x2a, + 0x00, 0x01, 0x00, 0x54, 0xe3, 0x03, 0x01, 0x2a, 0x28, 0x04, 0x00, 0x54, + 0x5f, 0x08, 0x00, 0x71, 0xa0, 0x04, 0x00, 0x54, 0x5f, 0x0c, 0x00, 0x71, + 0x21, 0x02, 0x00, 0x54, 0x1f, 0x20, 0x03, 0xd5, 0x2a, 0x6b, 0x00, 0x94, + 0x9f, 0x06, 0x00, 0x71, 0x01, 0x00, 0x80, 0x52, 0xf4, 0x17, 0x9f, 0x1a, + 0xf3, 0x01, 0x00, 0x35, 0xa0, 0x0d, 0x80, 0x52, 0xac, 0x87, 0x00, 0x94, + 0x1f, 0x00, 0x00, 0x71, 0x84, 0x0a, 0x40, 0x7a, 0xe0, 0x01, 0x00, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0x01, 0x00, 0x80, 0x52, 0xfd, 0x7b, 0xc2, 0xa8, + 0x00, 0x10, 0x80, 0x52, 0xa4, 0x87, 0x00, 0x14, 0x42, 0x02, 0x00, 0x34, + 0x5f, 0x04, 0x00, 0x71, 0xe0, 0xfd, 0xff, 0x54, 0xef, 0xff, 0xff, 0x17, + 0xc0, 0x0d, 0x80, 0x52, 0x9e, 0x87, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, + 0x84, 0x0a, 0x40, 0x7a, 0x21, 0x02, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x5f, 0x18, 0x00, 0x71, + 0x80, 0xfc, 0xff, 0x54, 0x09, 0x01, 0x00, 0x54, 0x44, 0x1c, 0x00, 0x51, + 0x9f, 0x04, 0x00, 0x71, 0x28, 0xfc, 0xff, 0x54, 0xe1, 0x03, 0x03, 0x2a, + 0xe0, 0x03, 0x13, 0x2a, 0x02, 0x00, 0x80, 0x52, 0xdc, 0xff, 0xff, 0x17, + 0x5f, 0x14, 0x00, 0x71, 0x40, 0xfb, 0xff, 0x54, 0xda, 0xff, 0xff, 0x17, + 0xf3, 0x53, 0x41, 0xa9, 0x01, 0x00, 0x80, 0x52, 0xfd, 0x7b, 0xc2, 0xa8, + 0x20, 0x10, 0x80, 0x52, 0x86, 0x87, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x64, 0x6b, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x01, 0x2a, 0xc1, 0x7b, 0x94, 0x52, + 0x7f, 0x02, 0x01, 0x6b, 0x02, 0x98, 0x47, 0x7a, 0xa9, 0x00, 0x00, 0x54, + 0x20, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x14, 0x1c, 0x00, 0x12, 0xe0, 0x03, 0x14, 0x2a, + 0x76, 0x6b, 0x00, 0x94, 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x08, 0x00, 0x71, + 0xe0, 0x03, 0x00, 0x54, 0xc8, 0x01, 0x00, 0x54, 0x80, 0x02, 0x00, 0x34, + 0x1f, 0x04, 0x00, 0x71, 0xe1, 0x02, 0x00, 0x54, 0xe0, 0xa3, 0x90, 0x52, + 0x60, 0x3d, 0xaa, 0x72, 0x73, 0x7e, 0xa0, 0x9b, 0x60, 0xfe, 0x65, 0xd3, + 0xe1, 0x03, 0x14, 0x2a, 0x71, 0x6b, 0x00, 0x94, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x1f, 0x0c, 0x00, 0x71, 0x61, 0x01, 0x00, 0x54, 0xe0, 0xa3, 0x90, 0x52, + 0x60, 0x3d, 0xaa, 0x72, 0x73, 0x7e, 0xa0, 0x9b, 0x60, 0xfe, 0x67, 0xd3, + 0xf4, 0xff, 0xff, 0x17, 0xe0, 0xa3, 0x90, 0x52, 0x60, 0x3d, 0xaa, 0x72, + 0x73, 0x7e, 0xa0, 0x9b, 0x60, 0xfe, 0x64, 0xd3, 0xef, 0xff, 0xff, 0x17, + 0x80, 0xc0, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0xa3, 0x90, 0x52, 0x60, 0x3d, 0xaa, 0x72, + 0x73, 0x7e, 0xa0, 0x9b, 0x60, 0xfe, 0x66, 0xd3, 0xe6, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbc, 0xa9, 0x1f, 0x1c, 0x00, 0x71, 0xfd, 0x03, 0x00, 0x91, + 0xff, 0x7f, 0x07, 0x29, 0x89, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x03, 0x02, 0xaa, 0xe2, 0xf3, 0x00, 0x91, 0xf5, 0x13, 0x00, 0xf9, + 0xf5, 0x03, 0x01, 0xaa, 0xe1, 0xe3, 0x00, 0x91, 0x13, 0x1c, 0x00, 0x12, + 0xe0, 0x03, 0x13, 0x2a, 0x90, 0x6c, 0x00, 0x94, 0xe0, 0x03, 0x13, 0x2a, + 0x3a, 0x6b, 0x00, 0x94, 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x08, 0x00, 0x71, + 0x20, 0x03, 0x00, 0x54, 0x28, 0x01, 0x00, 0x54, 0xa0, 0x01, 0x00, 0x34, + 0x1f, 0x04, 0x00, 0x71, 0x01, 0x03, 0x00, 0x54, 0xe2, 0x3b, 0x40, 0xb9, + 0x83, 0x0c, 0x80, 0x52, 0xe1, 0x3f, 0x40, 0xb9, 0x00, 0x00, 0x80, 0x52, + 0x08, 0x00, 0x00, 0x14, 0x1f, 0x0c, 0x00, 0x71, 0x21, 0x02, 0x00, 0x54, + 0xe2, 0x3b, 0x40, 0xb9, 0x03, 0x32, 0x80, 0x52, 0xf9, 0xff, 0xff, 0x17, + 0xe2, 0x07, 0x47, 0x29, 0x43, 0x06, 0x80, 0x52, 0x42, 0x7c, 0x03, 0x1b, + 0x21, 0x7c, 0x03, 0x1b, 0xa2, 0x02, 0x00, 0xb9, 0xf5, 0x13, 0x40, 0xf9, + 0x81, 0x02, 0x00, 0xb9, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x3b, 0x40, 0xb9, 0x03, 0x19, 0x80, 0x52, + 0xec, 0xff, 0xff, 0x17, 0xbf, 0x02, 0x00, 0xb9, 0x80, 0xc0, 0x80, 0x52, + 0xf5, 0x13, 0x40, 0xf9, 0x9f, 0x02, 0x00, 0xb9, 0xf3, 0x53, 0x41, 0xa9, + 0xd0, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0x1f, 0x04, 0x00, 0x71, 0xfd, 0x03, 0x00, 0x91, 0xff, 0xbf, 0x00, 0x39, + 0x89, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x01, 0xaa, + 0xe1, 0xbf, 0x00, 0x91, 0xc5, 0x6c, 0x00, 0x94, 0xe1, 0xbf, 0x40, 0x39, + 0x3f, 0x14, 0x00, 0x71, 0xe9, 0x01, 0x00, 0x54, 0x20, 0x20, 0x00, 0x51, + 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x14, 0x00, 0x71, 0xc8, 0x00, 0x00, 0x54, + 0x21, 0x08, 0x00, 0x51, 0x61, 0x02, 0x00, 0x39, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x0b, 0x40, 0xf9, 0xef, 0xff, 0xff, 0x17, 0x20, 0x40, 0x00, 0x51, + 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x14, 0x00, 0x71, 0xe8, 0x00, 0x00, 0x54, + 0x21, 0x10, 0x00, 0x51, 0x61, 0x02, 0x00, 0x39, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x7f, 0x02, 0x00, 0x39, 0xa0, 0xc0, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, + 0xe1, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0xf3, 0x03, 0x01, 0xaa, 0x20, 0x01, 0x00, 0x34, 0x1f, 0x04, 0x00, 0x71, + 0x00, 0x02, 0x00, 0x54, 0x01, 0x01, 0x80, 0x52, 0x61, 0x02, 0x00, 0x39, + 0xc0, 0xc0, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x43, 0x6a, 0x00, 0x94, 0x60, 0x02, 0x00, 0x39, + 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x20, 0x00, 0x71, 0xc0, 0xc0, 0x80, 0x52, + 0xe0, 0x33, 0x80, 0x1a, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x42, 0x6a, 0x00, 0x94, 0x60, 0x02, 0x00, 0x39, + 0x00, 0x1c, 0x00, 0x12, 0xf7, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0xe2, 0x03, 0x00, 0xaa, + 0xc3, 0x12, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, 0xe2, 0x0f, 0x00, 0xf9, + 0xe0, 0x43, 0x00, 0x91, 0x42, 0x04, 0x40, 0xb9, 0x01, 0x00, 0x80, 0x52, + 0xe3, 0x13, 0x00, 0xb9, 0xe2, 0x17, 0x00, 0xb9, 0x5a, 0x04, 0x00, 0x94, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x74, 0x03, 0x00, 0x90, + 0x80, 0x02, 0x26, 0x91, 0xff, 0x03, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0xa0, 0x01, 0x00, 0x34, 0x14, 0x00, 0x00, 0x90, 0x94, 0xc2, 0x0a, 0x91, + 0xe1, 0x03, 0x14, 0xaa, 0x20, 0x00, 0x80, 0x52, 0x04, 0x89, 0x00, 0x94, + 0xe1, 0x03, 0x14, 0xaa, 0x40, 0x00, 0x80, 0x52, 0x01, 0x89, 0x00, 0x94, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x80, 0xc2, 0x44, 0xf9, 0xc1, 0x12, 0x80, 0x52, + 0x22, 0x04, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0x00, 0xfe, 0xff, 0x35, + 0xf7, 0x87, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0xed, 0xff, 0xff, 0x17, + 0xfd, 0x7b, 0xbb, 0xa9, 0x5f, 0x00, 0x00, 0xf1, 0x84, 0x18, 0x40, 0xfa, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x53, 0x00, 0x80, 0x52, + 0x80, 0x06, 0x00, 0x54, 0xf5, 0x5b, 0x02, 0xa9, 0xf4, 0x03, 0x04, 0xaa, + 0xf5, 0x03, 0x06, 0x2a, 0xf7, 0x1b, 0x00, 0xf9, 0x21, 0x1c, 0x00, 0x12, + 0x63, 0x3c, 0x00, 0x12, 0xb7, 0x3c, 0x00, 0x12, 0x00, 0x06, 0x00, 0x35, + 0x24, 0x00, 0x80, 0x52, 0x73, 0x20, 0x82, 0x52, 0x21, 0x06, 0x00, 0x35, + 0x7f, 0x60, 0x00, 0x71, 0xb3, 0x20, 0x82, 0x52, 0xe2, 0x9a, 0x58, 0x7a, + 0xa8, 0x05, 0x00, 0x54, 0x80, 0x04, 0x00, 0x51, 0xe1, 0x01, 0x00, 0xb0, + 0x21, 0x40, 0x16, 0x91, 0x20, 0x10, 0x00, 0x8b, 0x16, 0x04, 0x40, 0xf9, + 0xc0, 0x02, 0x40, 0xf9, 0xe4, 0x43, 0x00, 0xb9, 0xff, 0x43, 0x04, 0xf8, + 0xe3, 0x00, 0x00, 0x34, 0x07, 0x00, 0x80, 0xd2, 0x41, 0x68, 0x67, 0xf8, + 0x01, 0x68, 0x27, 0xf8, 0xe7, 0x20, 0x00, 0x91, 0x7f, 0x00, 0x07, 0x6b, + 0x88, 0xff, 0xff, 0x54, 0x61, 0x3c, 0x40, 0x92, 0x8d, 0x9d, 0x00, 0x94, + 0xe0, 0x03, 0x01, 0x91, 0x4c, 0x88, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0xc0, 0x03, 0x00, 0x35, 0xe1, 0x03, 0x15, 0x2a, 0xe0, 0x03, 0x01, 0x91, + 0x8b, 0x88, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0xa0, 0x04, 0x00, 0x34, + 0x1f, 0x18, 0x1c, 0x71, 0xe0, 0x05, 0x00, 0x54, 0xe2, 0x03, 0x00, 0x2a, + 0xe3, 0x01, 0x00, 0xb0, 0x63, 0x80, 0x12, 0x91, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0x51, 0x29, 0x00, 0x94, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x1f, 0x04, 0x00, 0x71, + 0x44, 0x00, 0x80, 0x52, 0x93, 0x20, 0x82, 0x52, 0xe0, 0xf9, 0xff, 0x54, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe2, 0x03, 0x00, 0x2a, 0x81, 0x06, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0xe3, 0x01, 0x00, 0xb0, 0x63, 0x20, 0x13, 0x91, 0x3b, 0x29, 0x00, 0x94, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xd5, 0x02, 0x40, 0xf9, 0xe1, 0x3e, 0x40, 0x92, 0xe0, 0x03, 0x15, 0xaa, + 0x6b, 0x9d, 0x00, 0x94, 0x01, 0x00, 0x80, 0xd2, 0x37, 0xfd, 0xff, 0x34, + 0xa2, 0x6a, 0x61, 0xf8, 0x82, 0x6a, 0x21, 0xf8, 0x21, 0x20, 0x00, 0x91, + 0xff, 0x02, 0x01, 0x6b, 0x88, 0xff, 0xff, 0x54, 0xe3, 0xff, 0xff, 0x17, + 0x41, 0x00, 0x80, 0x52, 0xe3, 0x01, 0x00, 0xb0, 0x63, 0xe0, 0x11, 0x91, + 0xe0, 0x03, 0x01, 0x2a, 0x02, 0x00, 0x80, 0x52, 0x23, 0x29, 0x00, 0x94, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xd2, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbb, 0xa9, 0x08, 0x09, 0x80, 0x52, 0x86, 0x0c, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0x81, 0x02, 0x00, 0xb0, 0x27, 0xa0, 0x5a, 0x39, + 0xe4, 0xe3, 0x00, 0x91, 0xe2, 0xa3, 0x00, 0x91, 0xe7, 0x04, 0x00, 0x11, + 0x05, 0x03, 0x80, 0x52, 0xff, 0x1c, 0x00, 0x72, 0x03, 0x02, 0x80, 0x52, + 0xe7, 0x14, 0x9f, 0x1a, 0x27, 0xa0, 0x1a, 0x39, 0x01, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0x2a, 0x00, 0x00, 0x80, 0x52, + 0xe8, 0x53, 0x00, 0x79, 0xe7, 0xab, 0x00, 0x39, 0xff, 0xb3, 0x02, 0x78, + 0xf4, 0xd3, 0x02, 0xb8, 0x7e, 0xff, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0xa0, 0x00, 0x00, 0x35, 0xe0, 0x33, 0x44, 0xb8, 0x9f, 0x02, 0x00, 0x6b, + 0xc0, 0x00, 0x00, 0x54, 0xd3, 0x20, 0x82, 0x52, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x02, 0x00, 0x80, 0x52, 0x21, 0x00, 0x80, 0x52, 0x40, 0x00, 0x80, 0x52, + 0xe3, 0x01, 0x00, 0xb0, 0x63, 0xc0, 0x13, 0x91, 0xf6, 0x28, 0x00, 0x94, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xba, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x33, 0x1c, 0x00, 0x12, + 0xf5, 0x13, 0x00, 0xf9, 0x15, 0x1c, 0x00, 0x12, 0x60, 0x06, 0x00, 0x51, + 0x00, 0x1c, 0x00, 0x12, 0x1f, 0xfc, 0x00, 0x71, 0xe0, 0x1f, 0x80, 0x52, + 0x64, 0x82, 0x40, 0x7a, 0x61, 0x00, 0x00, 0x54, 0xbf, 0x1e, 0x00, 0x71, + 0xa9, 0x01, 0x00, 0x54, 0xe2, 0x20, 0x82, 0x52, 0xf4, 0x03, 0x02, 0x2a, + 0xe3, 0x01, 0x00, 0xb0, 0x63, 0x00, 0x14, 0x91, 0x21, 0x00, 0x80, 0x52, + 0x80, 0x00, 0x80, 0x52, 0xdc, 0x28, 0x00, 0x94, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc6, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x80, 0x02, 0x00, 0xb0, 0x07, 0xa0, 0x5a, 0x39, + 0x49, 0x3c, 0x00, 0x13, 0x68, 0x3c, 0x00, 0x13, 0xe7, 0x04, 0x00, 0x11, + 0x0b, 0x09, 0x80, 0x52, 0xff, 0x1c, 0x00, 0x72, 0x0a, 0x20, 0x80, 0x52, + 0xe7, 0x14, 0x9f, 0x1a, 0xbf, 0x0e, 0x00, 0x71, 0x07, 0xa0, 0x1a, 0x39, + 0xe4, 0x23, 0x01, 0x91, 0xe0, 0x97, 0x9f, 0x1a, 0xe2, 0xe3, 0x00, 0x91, + 0x86, 0x0c, 0x80, 0x52, 0x05, 0x03, 0x80, 0x52, 0x03, 0x02, 0x80, 0x52, + 0x01, 0x00, 0x80, 0x52, 0xeb, 0x73, 0x00, 0x79, 0xe7, 0xeb, 0x00, 0x39, + 0xea, 0xb3, 0x03, 0x78, 0xf5, 0xf7, 0x00, 0x39, 0xf3, 0xfb, 0x00, 0x39, + 0xe9, 0xf3, 0x03, 0x78, 0xe8, 0x13, 0x04, 0x78, 0x35, 0xff, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0x60, 0x00, 0x00, 0x34, 0x02, 0x3c, 0x00, 0x12, + 0xd9, 0xff, 0xff, 0x17, 0xe1, 0x4b, 0x41, 0x39, 0xe0, 0xf3, 0x40, 0x39, + 0x3f, 0x00, 0x00, 0x6b, 0x80, 0x00, 0x00, 0x54, 0xc2, 0x20, 0x82, 0x52, + 0xf4, 0x03, 0x02, 0x2a, 0xd2, 0xff, 0xff, 0x17, 0xe0, 0x4f, 0x41, 0x39, + 0x1f, 0x00, 0x15, 0x6b, 0x61, 0xff, 0xff, 0x54, 0xe0, 0x53, 0x41, 0x39, + 0x1f, 0x00, 0x13, 0x6b, 0x01, 0xff, 0xff, 0x54, 0xd0, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb9, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0x36, 0x1c, 0x00, 0x12, + 0xc1, 0x06, 0x00, 0x51, 0x21, 0x1c, 0x00, 0x12, 0x3f, 0xfc, 0x00, 0x71, + 0xa8, 0x04, 0x00, 0x54, 0xf7, 0x1b, 0x00, 0xf9, 0x17, 0x1c, 0x00, 0x12, + 0xff, 0x1e, 0x00, 0x71, 0x88, 0x05, 0x00, 0x54, 0x80, 0x02, 0x00, 0xb0, + 0x07, 0xa0, 0x5a, 0x39, 0x09, 0x09, 0x80, 0x52, 0x08, 0x40, 0x80, 0x52, + 0xe7, 0x04, 0x00, 0x11, 0xe4, 0x63, 0x01, 0x91, 0xff, 0x1c, 0x00, 0x72, + 0x86, 0x0c, 0x80, 0x52, 0xe7, 0x14, 0x9f, 0x1a, 0xff, 0x0e, 0x00, 0x71, + 0x07, 0xa0, 0x1a, 0x39, 0x05, 0x03, 0x80, 0x52, 0xe0, 0x97, 0x9f, 0x1a, + 0x01, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x02, 0xaa, + 0xf3, 0x03, 0x03, 0xaa, 0xe2, 0x23, 0x01, 0x91, 0x03, 0x02, 0x80, 0x52, + 0xe9, 0x93, 0x00, 0x79, 0xe7, 0x2b, 0x01, 0x39, 0xe8, 0xb3, 0x04, 0x78, + 0xf7, 0x37, 0x01, 0x39, 0xf6, 0x3b, 0x01, 0x39, 0xff, 0x3f, 0x01, 0x39, + 0xfb, 0xfe, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, 0x80, 0x02, 0x00, 0x34, + 0x02, 0x3c, 0x00, 0x12, 0xf3, 0x53, 0x41, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0x03, 0x00, 0x00, 0x14, 0xe2, 0x20, 0x82, 0x52, 0xf5, 0x03, 0x02, 0x2a, + 0xe3, 0x01, 0x00, 0xb0, 0x63, 0x80, 0x14, 0x91, 0x21, 0x00, 0x80, 0x52, + 0x80, 0x00, 0x80, 0x52, 0x76, 0x28, 0x00, 0x94, 0xe0, 0x03, 0x15, 0x2a, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe2, 0x20, 0x82, 0x52, 0xf5, 0x03, 0x02, 0x2a, 0xf7, 0x1b, 0x40, 0xf9, + 0xf4, 0xff, 0xff, 0x17, 0xe1, 0x8b, 0x41, 0x39, 0xe0, 0x33, 0x41, 0x39, + 0x3f, 0x00, 0x00, 0x6b, 0xc0, 0x00, 0x00, 0x54, 0xc2, 0x20, 0x82, 0x52, + 0xf5, 0x03, 0x02, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xeb, 0xff, 0xff, 0x17, 0xe0, 0x8f, 0x41, 0x39, 0x1f, 0x00, 0x17, 0x6b, + 0x21, 0xff, 0xff, 0x54, 0xe0, 0x93, 0x41, 0x39, 0x1f, 0x00, 0x16, 0x6b, + 0xc1, 0xfe, 0xff, 0x54, 0xe0, 0x53, 0x46, 0x78, 0x80, 0x02, 0x00, 0x79, + 0xe0, 0x73, 0x46, 0x78, 0x60, 0x02, 0x00, 0x79, 0xf3, 0x53, 0x41, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xe3, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x1c, 0x00, 0x12, + 0x9f, 0x1e, 0x00, 0x71, 0x28, 0x04, 0x00, 0x54, 0x80, 0x02, 0x00, 0xb0, + 0x07, 0xa0, 0x5a, 0x39, 0x28, 0x1c, 0x00, 0x12, 0x0a, 0x09, 0x80, 0x52, + 0xe7, 0x04, 0x00, 0x11, 0x09, 0x60, 0x80, 0x52, 0xff, 0x1c, 0x00, 0x72, + 0xe4, 0xe3, 0x00, 0x91, 0xe7, 0x14, 0x9f, 0x1a, 0x9f, 0x0e, 0x00, 0x71, + 0x07, 0xa0, 0x1a, 0x39, 0xe2, 0xa3, 0x00, 0x91, 0xe0, 0x97, 0x9f, 0x1a, + 0x86, 0x0c, 0x80, 0x52, 0x05, 0x03, 0x80, 0x52, 0x03, 0x02, 0x80, 0x52, + 0x01, 0x00, 0x80, 0x52, 0xea, 0x53, 0x00, 0x79, 0xe7, 0xab, 0x00, 0x39, + 0xe9, 0xb3, 0x02, 0x78, 0xf4, 0xb7, 0x00, 0x39, 0xe8, 0xbb, 0x00, 0x39, + 0xb0, 0xfe, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0x60, 0x02, 0x00, 0x35, + 0xe1, 0x0b, 0x41, 0x39, 0xe0, 0xb3, 0x40, 0x39, 0x3f, 0x00, 0x00, 0x6b, + 0x20, 0x02, 0x00, 0x54, 0xc2, 0x20, 0x82, 0x52, 0xf3, 0x03, 0x02, 0x2a, + 0x03, 0x00, 0x00, 0x14, 0xe2, 0x20, 0x82, 0x52, 0xf3, 0x03, 0x02, 0x2a, + 0xe3, 0x01, 0x00, 0xb0, 0x63, 0x00, 0x15, 0x91, 0x21, 0x00, 0x80, 0x52, + 0x80, 0x00, 0x80, 0x52, 0x28, 0x28, 0x00, 0x94, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x02, 0x3c, 0x00, 0x12, 0xf6, 0xff, 0xff, 0x17, 0xe0, 0x0f, 0x41, 0x39, + 0x1f, 0x00, 0x14, 0x6b, 0xc1, 0xfd, 0xff, 0x54, 0xf7, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xba, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x1c, 0x00, 0x12, 0x9f, 0x1e, 0x00, 0x71, + 0x48, 0x04, 0x00, 0x54, 0x80, 0x02, 0x00, 0xb0, 0x07, 0xa0, 0x5a, 0x39, + 0x09, 0x09, 0x80, 0x52, 0x08, 0x80, 0x80, 0x52, 0xe7, 0x04, 0x00, 0x11, + 0xe4, 0x23, 0x01, 0x91, 0xff, 0x1c, 0x00, 0x72, 0xe2, 0xe3, 0x00, 0x91, + 0xe7, 0x14, 0x9f, 0x1a, 0x9f, 0x0e, 0x00, 0x71, 0x07, 0xa0, 0x1a, 0x39, + 0x86, 0x0c, 0x80, 0x52, 0xe0, 0x97, 0x9f, 0x1a, 0x05, 0x03, 0x80, 0x52, + 0x03, 0x02, 0x80, 0x52, 0xf5, 0x13, 0x00, 0xf9, 0xf5, 0x03, 0x01, 0xaa, + 0x01, 0x00, 0x80, 0x52, 0xe9, 0x73, 0x00, 0x79, 0xe7, 0xeb, 0x00, 0x39, + 0xe8, 0xb3, 0x03, 0x78, 0xf4, 0xf7, 0x00, 0x39, 0x78, 0xfe, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0x80, 0x02, 0x00, 0x35, 0xe1, 0x4b, 0x41, 0x39, + 0xe0, 0xf3, 0x40, 0x39, 0x3f, 0x00, 0x00, 0x6b, 0x60, 0x02, 0x00, 0x54, + 0xc2, 0x20, 0x82, 0x52, 0xf3, 0x03, 0x02, 0x2a, 0xf5, 0x13, 0x40, 0xf9, + 0x03, 0x00, 0x00, 0x14, 0xe2, 0x20, 0x82, 0x52, 0xf3, 0x03, 0x02, 0x2a, + 0xe3, 0x01, 0x00, 0xb0, 0x63, 0x80, 0x14, 0x91, 0x21, 0x00, 0x80, 0x52, + 0x80, 0x00, 0x80, 0x52, 0xef, 0x27, 0x00, 0x94, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x02, 0x3c, 0x00, 0x12, 0xf5, 0x13, 0x40, 0xf9, 0xf5, 0xff, 0xff, 0x17, + 0xe0, 0x4f, 0x41, 0x39, 0x1f, 0x00, 0x14, 0x6b, 0x81, 0xfd, 0xff, 0x54, + 0xe0, 0x53, 0x41, 0x39, 0xa0, 0x02, 0x00, 0x39, 0xf5, 0x13, 0x40, 0xf9, + 0xf3, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xba, 0xa9, 0x21, 0x1c, 0x00, 0x12, + 0x3f, 0xfc, 0x00, 0x71, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x88, 0x00, 0x00, 0x54, 0x14, 0x1c, 0x00, 0x12, 0x9f, 0x1e, 0x00, 0x71, + 0x89, 0x01, 0x00, 0x54, 0xe2, 0x20, 0x82, 0x52, 0xf3, 0x03, 0x02, 0x2a, + 0xe3, 0x01, 0x00, 0xb0, 0x63, 0x80, 0x15, 0x91, 0x21, 0x00, 0x80, 0x52, + 0x80, 0x00, 0x80, 0x52, 0xd1, 0x27, 0x00, 0x94, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x00, 0x23, 0x1e, 0x00, 0x50, 0xa8, 0x52, 0x01, 0x00, 0x27, 0x1e, + 0x3f, 0x80, 0x00, 0x71, 0x82, 0x02, 0x00, 0xb0, 0x40, 0xa0, 0x5a, 0x39, + 0x01, 0x90, 0xa7, 0x52, 0xe8, 0x13, 0x00, 0xfd, 0x01, 0x38, 0x21, 0x1e, + 0x00, 0x04, 0x00, 0x11, 0x28, 0x00, 0x27, 0x1e, 0x6b, 0x04, 0x80, 0x52, + 0x4a, 0x06, 0x80, 0x52, 0xe9, 0x00, 0x80, 0x52, 0x88, 0x00, 0xa0, 0x52, + 0xe4, 0x23, 0x01, 0x91, 0x20, 0x8c, 0x20, 0x1e, 0x1f, 0x1c, 0x00, 0x72, + 0x00, 0x14, 0x9f, 0x1a, 0x9f, 0x0e, 0x00, 0x71, 0x07, 0x1c, 0x00, 0x12, + 0x40, 0xa0, 0x1a, 0x39, 0x06, 0x71, 0x82, 0x52, 0xe0, 0x97, 0x9f, 0x1a, + 0x08, 0x08, 0x28, 0x1e, 0xe2, 0xc3, 0x00, 0x91, 0x05, 0x03, 0x80, 0x52, + 0x83, 0x02, 0x80, 0x52, 0x01, 0x00, 0x80, 0x52, 0xeb, 0x63, 0x00, 0x79, + 0xe7, 0x67, 0x00, 0x79, 0xea, 0x37, 0x00, 0xb9, 0xe9, 0x73, 0x00, 0x79, + 0xf4, 0x77, 0x00, 0x79, 0xe8, 0x3f, 0x00, 0xb9, 0xe8, 0x43, 0x00, 0xbd, + 0x20, 0xfe, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0x80, 0x00, 0x00, 0x34, + 0x02, 0x3c, 0x00, 0x12, 0xe8, 0x13, 0x40, 0xfd, 0xce, 0xff, 0xff, 0x17, + 0xe0, 0x63, 0x45, 0xbc, 0xe0, 0x53, 0x41, 0x39, 0x10, 0x20, 0x28, 0x1e, + 0x01, 0x39, 0x20, 0x1e, 0x00, 0x38, 0x28, 0x1e, 0x00, 0xcc, 0x21, 0x1e, + 0x1f, 0x00, 0x14, 0x6b, 0xa0, 0x00, 0x00, 0x54, 0xc2, 0x20, 0x82, 0x52, + 0xf3, 0x03, 0x02, 0x2a, 0xe8, 0x13, 0x40, 0xfd, 0xc2, 0xff, 0xff, 0x17, + 0xe0, 0x57, 0x41, 0x39, 0x1f, 0x04, 0x00, 0x71, 0x41, 0xff, 0xff, 0x54, + 0x00, 0xc0, 0x22, 0x1e, 0xe0, 0x01, 0x00, 0xb0, 0x01, 0xc4, 0x42, 0xfd, + 0x10, 0x20, 0x61, 0x1e, 0xac, 0xfe, 0xff, 0x54, 0xe8, 0x13, 0x40, 0xfd, + 0xbd, 0xff, 0xff, 0x17, 0xd0, 0x06, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x03, 0x00, 0x90, + 0xe1, 0x03, 0x00, 0xaa, 0x40, 0xa4, 0x06, 0xf9, 0x00, 0x80, 0x02, 0x91, + 0x3f, 0x00, 0x00, 0xf9, 0x21, 0x40, 0x00, 0x91, 0x3f, 0x80, 0x1f, 0xb8, + 0x3f, 0x00, 0x00, 0xeb, 0x81, 0xff, 0xff, 0x54, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf7, 0x63, 0x03, 0xa9, 0xf9, 0x23, 0x00, 0xf9, + 0x78, 0x03, 0x00, 0x90, 0x19, 0xa7, 0x46, 0xf9, 0xf5, 0x5b, 0x02, 0xa9, + 0xb9, 0x05, 0x00, 0xb4, 0xf7, 0x01, 0x00, 0xb0, 0xf7, 0xc2, 0x16, 0x91, + 0x76, 0x03, 0x00, 0x90, 0xd6, 0x22, 0x26, 0x91, 0x15, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x00, 0x80, 0xd2, 0x07, 0x00, 0x00, 0x14, + 0x73, 0x7e, 0x7c, 0xd3, 0x94, 0x06, 0x00, 0x91, 0x33, 0x03, 0x13, 0x8b, + 0x9f, 0x2a, 0x00, 0xf1, 0x7f, 0x0e, 0x00, 0xb9, 0x00, 0x03, 0x00, 0x54, + 0x00, 0x02, 0x80, 0xd2, 0x09, 0xf7, 0xff, 0x97, 0x81, 0xee, 0x7c, 0xd3, + 0xf3, 0x03, 0x14, 0x2a, 0x22, 0x03, 0x01, 0x8b, 0x20, 0x6b, 0x21, 0xf8, + 0xe0, 0x03, 0x00, 0xb4, 0x1f, 0x7c, 0x00, 0xa9, 0x40, 0x08, 0x40, 0xb9, + 0x1f, 0x04, 0x00, 0x71, 0x01, 0xfe, 0xff, 0x54, 0x00, 0x0c, 0x80, 0xd2, + 0xe1, 0x03, 0x17, 0xaa, 0x73, 0x7e, 0x7c, 0xd3, 0x80, 0x5a, 0x00, 0x9b, + 0x94, 0x06, 0x00, 0x91, 0xaa, 0x03, 0x00, 0x94, 0xb5, 0x02, 0x00, 0x2a, + 0x19, 0xa7, 0x46, 0xf9, 0x9f, 0x2a, 0x00, 0xf1, 0x33, 0x03, 0x13, 0x8b, + 0x7f, 0x0e, 0x00, 0xb9, 0x41, 0xfd, 0xff, 0x54, 0xe0, 0x03, 0x15, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x75, 0x40, 0x80, 0x52, 0xe0, 0x03, 0x15, 0x2a, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x42, 0x80, 0x52, 0xb5, 0x02, 0x00, 0x2a, + 0xe1, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbb, 0xa9, 0x1f, 0x24, 0x00, 0x71, 0xfd, 0x03, 0x00, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0xb5, 0x44, 0x80, 0x52, 0x28, 0x06, 0x00, 0x54, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0x2a, 0xf6, 0x03, 0x14, 0x2a, + 0xf7, 0x63, 0x03, 0xa9, 0x77, 0x03, 0x00, 0x90, 0xf3, 0xa6, 0x46, 0xf9, + 0x80, 0x7e, 0x7c, 0xd3, 0xf8, 0x03, 0x01, 0xaa, 0x60, 0x02, 0x00, 0x8b, + 0x00, 0x08, 0x40, 0xb9, 0x1f, 0x04, 0x00, 0x71, 0x20, 0x05, 0x00, 0x54, + 0xc0, 0xee, 0x7c, 0xd3, 0x60, 0x6a, 0x60, 0xf8, 0x80, 0x07, 0x00, 0xb4, + 0xf9, 0x23, 0x00, 0xf9, 0xf9, 0x03, 0x00, 0xaa, 0x00, 0x04, 0x40, 0xf9, + 0xc0, 0xff, 0xff, 0xb5, 0x00, 0x02, 0x80, 0xd2, 0xc6, 0xf6, 0xff, 0x97, + 0xf5, 0x03, 0x00, 0xaa, 0xc0, 0x06, 0x00, 0xb4, 0x18, 0x7c, 0x00, 0xa9, + 0x01, 0x02, 0x80, 0xd2, 0x48, 0x9b, 0x00, 0x94, 0x35, 0x07, 0x00, 0xf9, + 0xe0, 0x03, 0x19, 0xaa, 0x01, 0x02, 0x80, 0xd2, 0x44, 0x9b, 0x00, 0x94, + 0x15, 0x00, 0x80, 0x52, 0xf3, 0xa6, 0x46, 0xf9, 0xf9, 0x23, 0x40, 0xf9, + 0xd6, 0xee, 0x7c, 0xd3, 0xe0, 0x03, 0x13, 0xaa, 0x73, 0x02, 0x16, 0x8b, + 0x01, 0x14, 0x80, 0xd2, 0x62, 0x0e, 0x40, 0xb9, 0x42, 0x04, 0x00, 0x11, + 0x62, 0x0e, 0x00, 0xb9, 0x39, 0x9b, 0x00, 0x94, 0xe0, 0xa6, 0x46, 0xf9, + 0x16, 0x00, 0x16, 0x8b, 0xc0, 0x0a, 0x40, 0xb9, 0x1f, 0x04, 0x00, 0x71, + 0x20, 0x02, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xe0, 0x03, 0x15, 0x2a, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x03, 0x00, 0x90, 0x00, 0x20, 0x26, 0x91, + 0x02, 0x0c, 0x80, 0x52, 0x01, 0x00, 0x80, 0x12, 0x80, 0x02, 0xa2, 0x9b, + 0x79, 0x03, 0x00, 0x94, 0xf5, 0x03, 0x00, 0x2a, 0x60, 0xfe, 0xff, 0x35, + 0xf3, 0xa6, 0x46, 0xf9, 0xcf, 0xff, 0xff, 0x17, 0x60, 0x03, 0x00, 0x90, + 0x00, 0x20, 0x26, 0x91, 0x01, 0x0c, 0x80, 0x52, 0x80, 0x02, 0xa1, 0x9b, + 0x64, 0x03, 0x00, 0x94, 0xb5, 0x02, 0x00, 0x2a, 0xe0, 0x03, 0x15, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xd5, 0x44, 0x80, 0x52, + 0xd6, 0xff, 0xff, 0x17, 0x15, 0x42, 0x80, 0x52, 0xf9, 0x23, 0x40, 0xf9, + 0xd3, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x80, 0x10, 0x00, 0xb0, 0x01, 0xb0, 0x47, 0xf9, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x01, 0xa9, 0xa2, 0xff, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x81, 0x10, 0x00, 0xb0, 0x21, 0xc0, 0x3d, 0x91, 0x00, 0x00, 0x80, 0x52, + 0x9d, 0xff, 0xff, 0x97, 0x81, 0x10, 0x00, 0xb0, 0x21, 0x00, 0x3f, 0x91, + 0x73, 0x02, 0x00, 0x2a, 0x00, 0x00, 0x80, 0x52, 0x98, 0xff, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0x81, 0x10, 0x00, 0xb0, 0x21, 0x00, 0x38, 0x91, + 0x00, 0x00, 0x80, 0x52, 0x93, 0xff, 0xff, 0x97, 0x81, 0x10, 0x00, 0xd0, + 0x21, 0x00, 0x00, 0x91, 0x94, 0x02, 0x00, 0x2a, 0x00, 0x00, 0x80, 0x52, + 0x8e, 0xff, 0xff, 0x97, 0x94, 0x02, 0x13, 0x2a, 0x81, 0x10, 0x00, 0xd0, + 0x21, 0x24, 0x40, 0xf9, 0xf3, 0x03, 0x00, 0x2a, 0x20, 0x00, 0x80, 0x52, + 0x88, 0xff, 0xff, 0x97, 0x73, 0x02, 0x00, 0x2a, 0x81, 0x10, 0x00, 0xd0, + 0x21, 0x00, 0x01, 0x91, 0x20, 0x00, 0x80, 0x52, 0x83, 0xff, 0xff, 0x97, + 0x81, 0x10, 0x00, 0x90, 0x21, 0x68, 0x46, 0xf9, 0x74, 0x02, 0x14, 0x2a, + 0xf3, 0x03, 0x00, 0x2a, 0x60, 0x00, 0x80, 0x52, 0x7d, 0xff, 0xff, 0x97, + 0x73, 0x02, 0x00, 0x2a, 0x81, 0x10, 0x00, 0xb0, 0x21, 0xa0, 0x33, 0x91, + 0x60, 0x00, 0x80, 0x52, 0x78, 0xff, 0xff, 0x97, 0x81, 0x10, 0x00, 0xd0, + 0x21, 0x2c, 0x40, 0xf9, 0x73, 0x02, 0x14, 0x2a, 0xf4, 0x03, 0x00, 0x2a, + 0xa0, 0x00, 0x80, 0x52, 0x72, 0xff, 0xff, 0x97, 0x94, 0x02, 0x00, 0x2a, + 0x81, 0x10, 0x00, 0xd0, 0x21, 0xd0, 0x01, 0x91, 0xa0, 0x00, 0x80, 0x52, + 0x6d, 0xff, 0xff, 0x97, 0x81, 0x10, 0x00, 0xd0, 0x21, 0x44, 0x40, 0xf9, + 0x94, 0x02, 0x13, 0x2a, 0xf3, 0x03, 0x00, 0x2a, 0x80, 0x00, 0x80, 0x52, + 0x67, 0xff, 0xff, 0x97, 0x73, 0x02, 0x00, 0x2a, 0x81, 0x10, 0x00, 0xd0, + 0x21, 0x40, 0x01, 0x91, 0x80, 0x00, 0x80, 0x52, 0x62, 0xff, 0xff, 0x97, + 0x81, 0x10, 0x00, 0xd0, 0x21, 0x40, 0x40, 0xf9, 0x74, 0x02, 0x14, 0x2a, + 0xf3, 0x03, 0x00, 0x2a, 0xc0, 0x00, 0x80, 0x52, 0x5c, 0xff, 0xff, 0x97, + 0x73, 0x02, 0x00, 0x2a, 0x81, 0x10, 0x00, 0xd0, 0x21, 0xc0, 0x01, 0x91, + 0xc0, 0x00, 0x80, 0x52, 0x57, 0xff, 0xff, 0x97, 0x81, 0x10, 0x00, 0xd0, + 0x21, 0x1c, 0x40, 0xf9, 0x73, 0x02, 0x14, 0x2a, 0xf4, 0x03, 0x00, 0x2a, + 0x40, 0x00, 0x80, 0x52, 0x51, 0xff, 0xff, 0x97, 0x94, 0x02, 0x00, 0x2a, + 0x81, 0x10, 0x00, 0xd0, 0x21, 0xe0, 0x01, 0x91, 0x40, 0x00, 0x80, 0x52, + 0x4c, 0xff, 0xff, 0x97, 0x81, 0x10, 0x00, 0x90, 0x21, 0xc0, 0x46, 0xb9, + 0x94, 0x02, 0x13, 0x2a, 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x00, 0x80, 0x52, + 0x46, 0xff, 0xff, 0x97, 0x73, 0x02, 0x00, 0x2a, 0x81, 0x10, 0x00, 0x90, + 0x21, 0xbc, 0x46, 0xb9, 0xe0, 0x00, 0x80, 0x52, 0x74, 0x02, 0x14, 0x2a, + 0x40, 0xff, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0x9a, 0xf9, 0xff, 0x97, + 0xe1, 0x03, 0x00, 0xaa, 0x00, 0x01, 0x80, 0x52, 0x3b, 0xff, 0xff, 0x97, + 0x73, 0x02, 0x00, 0x2a, 0x85, 0x04, 0x00, 0x94, 0x73, 0x02, 0x14, 0x2a, + 0xe1, 0x03, 0x00, 0xaa, 0x20, 0x01, 0x80, 0x52, 0x35, 0xff, 0xff, 0x97, + 0x00, 0x00, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbf, 0xa9, 0x00, 0x04, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0xf9, 0xf0, 0xff, 0x97, 0xc4, 0x9c, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0x60, 0x03, 0x00, 0x90, 0x00, 0x6c, 0x47, 0xf9, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, 0xd0, 0xfe, 0xff, 0x97, + 0xa0, 0x00, 0x00, 0x34, 0x64, 0x05, 0x00, 0x94, 0x7f, 0x20, 0x03, 0xd5, + 0x7f, 0x20, 0x03, 0xd5, 0xfe, 0xff, 0xff, 0x17, 0x41, 0x03, 0x00, 0xf0, + 0x60, 0x03, 0x80, 0x52, 0x33, 0x6c, 0x07, 0xf9, 0xe3, 0xf0, 0xff, 0x97, + 0x12, 0x93, 0x00, 0x94, 0x00, 0xff, 0xff, 0x35, 0x80, 0x03, 0x80, 0x52, + 0xdf, 0xf0, 0xff, 0x97, 0x56, 0x99, 0x00, 0x94, 0x80, 0xfe, 0xff, 0x35, + 0xa0, 0x03, 0x80, 0x52, 0xdb, 0xf0, 0xff, 0x97, 0xd2, 0x9b, 0x00, 0x94, + 0x00, 0xfe, 0xff, 0x35, 0xc0, 0x03, 0x80, 0x52, 0xd7, 0xf0, 0xff, 0x97, + 0x46, 0x9c, 0x00, 0x94, 0x80, 0xfd, 0xff, 0x35, 0xe0, 0x03, 0x80, 0x52, + 0xd3, 0xf0, 0xff, 0x97, 0xb6, 0x1f, 0x00, 0x94, 0x7f, 0x20, 0x03, 0xd5, + 0xe8, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbf, 0xa9, 0x40, 0x03, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0xc9, 0xf0, 0xff, 0x97, 0xc0, 0x01, 0x00, 0x94, + 0xe2, 0xff, 0xff, 0xf0, 0xe1, 0x01, 0x00, 0x90, 0x40, 0x03, 0x00, 0xf0, + 0x42, 0x40, 0x3f, 0x91, 0x21, 0x20, 0x17, 0x91, 0x00, 0x40, 0x35, 0x91, + 0x26, 0x00, 0x80, 0x52, 0x05, 0x00, 0x80, 0x52, 0x04, 0x00, 0x82, 0x52, + 0x03, 0x00, 0x80, 0xd2, 0x69, 0x01, 0x00, 0x94, 0x60, 0x00, 0x00, 0x35, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x7f, 0x20, 0x03, 0xd5, + 0x7f, 0x20, 0x03, 0xd5, 0xfe, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf9, 0x6b, 0x04, 0xa9, 0xf9, 0x03, 0x00, 0xaa, 0xe0, 0x73, 0x1f, 0x32, + 0xf3, 0x53, 0x01, 0xa9, 0xf5, 0x5b, 0x02, 0xa9, 0x35, 0x03, 0x40, 0xb9, + 0xf7, 0x63, 0x03, 0xa9, 0x37, 0x1c, 0x00, 0x12, 0xbf, 0x02, 0x00, 0x6b, + 0x41, 0x03, 0x00, 0xf0, 0x21, 0x70, 0x47, 0xf9, 0x89, 0x00, 0x00, 0x54, + 0x20, 0x16, 0x80, 0x52, 0x00, 0x00, 0xb8, 0x72, 0xb5, 0x02, 0x00, 0x0b, + 0x00, 0x09, 0x80, 0x52, 0x16, 0x00, 0x80, 0x52, 0x38, 0x00, 0x80, 0xd2, + 0xb5, 0x06, 0xa0, 0x9b, 0xb5, 0xa2, 0x01, 0x91, 0xb3, 0x22, 0x00, 0x91, + 0xba, 0x22, 0x01, 0x91, 0x74, 0xfe, 0xdf, 0xc8, 0xf4, 0x00, 0x00, 0xb4, + 0xe1, 0x03, 0x19, 0xaa, 0x80, 0x42, 0x00, 0x91, 0x02, 0x00, 0x80, 0x52, + 0xf7, 0x01, 0x00, 0x34, 0x1e, 0x02, 0x00, 0x94, 0xe0, 0x01, 0x00, 0x35, + 0x73, 0x22, 0x00, 0x91, 0x5f, 0x03, 0x13, 0xeb, 0xc1, 0xfe, 0xff, 0x54, + 0x20, 0x00, 0x80, 0xd2, 0xa0, 0x02, 0xe0, 0xf8, 0xe0, 0x03, 0x16, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf8, 0x01, 0x00, 0x94, 0x60, 0xfe, 0xff, 0x34, 0x94, 0x22, 0x00, 0x91, + 0x81, 0x02, 0xf8, 0xf8, 0xdf, 0x02, 0x00, 0x71, 0xd6, 0x12, 0x80, 0x1a, + 0xee, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xe2, 0x73, 0x1f, 0x32, 0x3f, 0x00, 0x02, 0x6b, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0xaa, 0xf5, 0x13, 0x00, 0xf9, + 0x55, 0x03, 0x00, 0xf0, 0xa0, 0x72, 0x47, 0xf9, 0x89, 0x00, 0x00, 0x54, + 0x33, 0x16, 0x80, 0x52, 0x13, 0x00, 0xb8, 0x72, 0x21, 0x00, 0x13, 0x0b, + 0x13, 0x09, 0x80, 0x52, 0x21, 0x00, 0xb3, 0x9b, 0x00, 0x10, 0x00, 0x91, + 0x33, 0xa0, 0x01, 0x91, 0x01, 0x00, 0x80, 0x12, 0x5a, 0x02, 0x00, 0x94, + 0xc0, 0x02, 0x00, 0x35, 0x63, 0x22, 0x00, 0x91, 0x61, 0x22, 0x01, 0x91, + 0xe2, 0x03, 0x03, 0xaa, 0x1f, 0x20, 0x03, 0xd5, 0x40, 0xfc, 0xdf, 0xc8, + 0x42, 0x20, 0x00, 0x91, 0x9f, 0x02, 0x00, 0xeb, 0x00, 0x01, 0x00, 0x54, + 0x3f, 0x00, 0x02, 0xeb, 0x61, 0xff, 0xff, 0x54, 0x60, 0xfc, 0xdf, 0xc8, + 0xc0, 0x01, 0x00, 0xb4, 0x63, 0x20, 0x00, 0x91, 0x3f, 0x00, 0x03, 0xeb, + 0x81, 0xff, 0xff, 0x54, 0xa0, 0x72, 0x47, 0xf9, 0xf3, 0x53, 0x41, 0xa9, + 0x00, 0x10, 0x00, 0x91, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0x38, 0x02, 0x00, 0x14, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x74, 0xfc, 0x9f, 0xc8, + 0xf5, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0x01, 0xbd, 0x8a, 0xd2, 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x13, 0x00, 0xf9, + 0x55, 0x03, 0x00, 0xf0, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0x2a, + 0x20, 0x00, 0x80, 0xd2, 0x70, 0xf5, 0xff, 0x97, 0xa0, 0x72, 0x07, 0xf9, + 0x80, 0x02, 0x00, 0xb4, 0x00, 0x10, 0x00, 0x91, 0xe1, 0x01, 0x00, 0x90, + 0x21, 0x80, 0x17, 0x91, 0x06, 0x02, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0xa0, 0x72, 0x47, 0xf9, 0xf3, 0x00, 0x00, 0x35, 0x14, 0x00, 0x00, 0xb9, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x84, 0xf5, 0xff, 0x97, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x13, 0x42, 0x80, 0x52, + 0xf4, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x54, 0x00, 0x80, 0x52, 0x20, 0x02, 0x00, 0xb4, + 0xf3, 0x03, 0x00, 0xaa, 0x01, 0x12, 0x80, 0xd2, 0x20, 0x00, 0x80, 0xd2, + 0x50, 0xf5, 0xff, 0x97, 0x60, 0x02, 0x00, 0xf9, 0xc0, 0x02, 0x00, 0xb4, + 0x41, 0x03, 0x00, 0xf0, 0x23, 0x70, 0x47, 0xf9, 0x00, 0x40, 0x00, 0x91, + 0xe1, 0x01, 0x00, 0x90, 0x82, 0x00, 0x80, 0x52, 0x21, 0x80, 0x17, 0x91, + 0x63, 0x00, 0x40, 0xb9, 0x56, 0x01, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, + 0xa0, 0x00, 0x00, 0x35, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x02, 0x40, 0xf9, + 0x62, 0xf5, 0xff, 0x97, 0x7f, 0x02, 0x00, 0xf9, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x14, 0x42, 0x80, 0x52, 0xf4, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x01, 0x00, 0xb4, 0xe3, 0x0b, 0x02, 0x32, + 0x23, 0x00, 0x03, 0x0b, 0x7f, 0xfc, 0x01, 0x71, 0x24, 0xe0, 0x80, 0x52, + 0x83, 0x12, 0x80, 0x52, 0x20, 0x80, 0x43, 0x7a, 0x69, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x04, 0x2a, 0xc0, 0x03, 0x5f, 0xd6, 0x82, 0xff, 0xff, 0x17, + 0x44, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x04, 0x2a, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xb4, + 0x3f, 0xbc, 0x02, 0x71, 0x22, 0xe0, 0x80, 0x52, 0x69, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x02, 0x2a, 0xc0, 0x03, 0x5f, 0xd6, 0x76, 0xff, 0xff, 0x17, + 0x42, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x02, 0x2a, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x1c, 0x00, 0x12, + 0x80, 0x01, 0x00, 0xb4, 0x03, 0x00, 0x40, 0xb9, 0xe2, 0x0b, 0x02, 0x32, + 0x84, 0x12, 0x80, 0x52, 0x25, 0xe0, 0x80, 0x52, 0x62, 0x00, 0x02, 0x0b, + 0x5f, 0xfc, 0x01, 0x71, 0x60, 0x80, 0x44, 0x7a, 0x69, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x05, 0x2a, 0xc0, 0x03, 0x5f, 0xd6, 0x30, 0xff, 0xff, 0x17, + 0x45, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x05, 0x2a, 0xc0, 0x03, 0x5f, 0xd6, + 0x21, 0x1c, 0x00, 0x12, 0x00, 0x01, 0x00, 0xb4, 0x02, 0x00, 0x40, 0xb9, + 0x23, 0xe0, 0x80, 0x52, 0x5f, 0xbc, 0x02, 0x71, 0x69, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x03, 0x2a, 0xc0, 0x03, 0x5f, 0xd6, 0x24, 0xff, 0xff, 0x17, + 0x43, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x03, 0x2a, 0xc0, 0x03, 0x5f, 0xd6, + 0x1f, 0x00, 0x00, 0xf1, 0x24, 0x18, 0x40, 0xfa, 0x61, 0x00, 0x00, 0x54, + 0x40, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, + 0x00, 0x40, 0x00, 0x91, 0x46, 0x01, 0x00, 0x94, 0xe0, 0x00, 0x00, 0x35, + 0x61, 0x02, 0x40, 0xf9, 0x21, 0x04, 0x00, 0x91, 0x61, 0x02, 0x00, 0xf9, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x1f, 0x28, 0x08, 0x71, 0xc1, 0xe0, 0x80, 0x52, 0x00, 0x10, 0x81, 0x1a, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x89, 0x16, 0x00, 0x94, 0xf3, 0x03, 0x00, 0xaa, 0x14, 0xa8, 0x40, 0xf9, + 0x96, 0x16, 0x00, 0x94, 0x81, 0x02, 0x56, 0xa9, 0x20, 0x00, 0x3f, 0xd6, + 0x60, 0x03, 0x00, 0x90, 0x00, 0x00, 0x06, 0x91, 0x71, 0x07, 0x00, 0x94, + 0xe0, 0x03, 0x13, 0xaa, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0x61, 0x06, 0x00, 0x14, 0xfd, 0x7b, 0xbb, 0xa9, 0xe1, 0x01, 0x00, 0x90, + 0x03, 0x08, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0x75, 0x03, 0x00, 0x90, 0xb5, 0x02, 0x06, 0x91, 0xe0, 0x03, 0x15, 0xaa, + 0x21, 0xc0, 0x17, 0x91, 0x02, 0x00, 0x80, 0x52, 0xb2, 0x07, 0x00, 0x94, + 0xa0, 0x06, 0x00, 0x35, 0xf6, 0x01, 0x00, 0x90, 0xd6, 0xa2, 0x18, 0x91, + 0xf7, 0x63, 0x03, 0xa9, 0xf7, 0x01, 0x00, 0x90, 0xf7, 0x02, 0x19, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xe0, 0x03, 0x15, 0xaa, 0x01, 0x00, 0x80, 0x12, + 0x64, 0x07, 0x00, 0x94, 0x40, 0x01, 0x00, 0x34, 0x02, 0x00, 0x17, 0x32, + 0xe3, 0x03, 0x16, 0xaa, 0x41, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x01, 0x2a, + 0x02, 0x25, 0x00, 0x94, 0xe0, 0x03, 0x15, 0xaa, 0x01, 0x00, 0x80, 0x12, + 0x5b, 0x07, 0x00, 0x94, 0x00, 0xff, 0xff, 0x35, 0x5d, 0x16, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0xaa, 0x13, 0x78, 0x40, 0xf9, 0x1f, 0x00, 0x13, 0xeb, + 0xe0, 0xfd, 0xff, 0x54, 0xf9, 0x23, 0x00, 0xf9, 0x04, 0x00, 0x00, 0x14, + 0x73, 0x7a, 0x40, 0xf9, 0x9f, 0x02, 0x13, 0xeb, 0x00, 0x02, 0x00, 0x54, + 0x79, 0x4e, 0x40, 0xb9, 0x3f, 0x0b, 0x00, 0x71, 0x61, 0xff, 0xff, 0x54, + 0xe0, 0x03, 0x13, 0xaa, 0x78, 0xaa, 0x40, 0xf9, 0x62, 0x06, 0x00, 0x94, + 0x60, 0x01, 0x00, 0x35, 0x00, 0xbb, 0x40, 0xf9, 0xa0, 0xfe, 0xff, 0xb4, + 0xc6, 0xf4, 0xff, 0x97, 0x1f, 0xbb, 0x00, 0xf9, 0x73, 0x7a, 0x40, 0xf9, + 0x9f, 0x02, 0x13, 0xeb, 0x61, 0xfe, 0xff, 0x54, 0x1f, 0x20, 0x03, 0xd5, + 0xf9, 0x23, 0x40, 0xf9, 0xd9, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, + 0xe1, 0x03, 0x19, 0x2a, 0xe3, 0x03, 0x17, 0xaa, 0x80, 0x00, 0x80, 0x52, + 0xde, 0x24, 0x00, 0x94, 0xf1, 0xff, 0xff, 0x17, 0xf5, 0x5b, 0x42, 0xa9, + 0x02, 0x00, 0x17, 0x32, 0xfd, 0x7b, 0xc5, 0xa8, 0xe3, 0x01, 0x00, 0x90, + 0x63, 0x20, 0x18, 0x91, 0x41, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0xd5, 0x24, 0x00, 0x14, 0xfd, 0x7b, 0xbe, 0xa9, 0x02, 0x20, 0x80, 0xd2, + 0x01, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0x73, 0x03, 0x00, 0x90, 0x60, 0x02, 0x02, 0x91, 0x7d, 0xe5, 0x00, 0x94, + 0x41, 0x01, 0x80, 0x52, 0x00, 0x00, 0x80, 0x52, 0x61, 0x82, 0x00, 0xb9, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc3, 0x01, 0xd1, + 0xfd, 0x7b, 0x02, 0xa9, 0xfd, 0x83, 0x00, 0x91, 0xf3, 0x53, 0x03, 0xa9, + 0xa0, 0x07, 0x00, 0xb4, 0xf3, 0x03, 0x00, 0xaa, 0xbf, 0x7c, 0x00, 0x71, + 0x80, 0x40, 0x00, 0x11, 0xf4, 0x03, 0x80, 0x52, 0xb4, 0x90, 0x94, 0x1a, + 0xf5, 0x5b, 0x04, 0xa9, 0xf6, 0x03, 0x02, 0xaa, 0xf5, 0x03, 0x03, 0xaa, + 0xf7, 0x63, 0x05, 0xa9, 0xf8, 0x03, 0x04, 0x2a, 0xf7, 0x03, 0x06, 0x2a, + 0xf9, 0x33, 0x00, 0xf9, 0xf9, 0x03, 0x01, 0xaa, 0x56, 0xf4, 0xff, 0x97, + 0x60, 0xba, 0x00, 0xf9, 0x60, 0x06, 0x00, 0xb4, 0x00, 0x3c, 0x00, 0x91, + 0x01, 0x2c, 0x80, 0x52, 0xff, 0x03, 0x00, 0xb9, 0x04, 0xec, 0x7c, 0x92, + 0xff, 0x0b, 0x00, 0xb9, 0xe7, 0x03, 0x14, 0x2a, 0xe1, 0x13, 0x00, 0xb9, + 0xe6, 0x03, 0x14, 0x2a, 0x64, 0xbe, 0x00, 0xf9, 0xe5, 0x03, 0x18, 0x2a, + 0x78, 0x82, 0x01, 0xb9, 0xe0, 0x03, 0x13, 0xaa, 0xe1, 0x03, 0x19, 0xaa, + 0x02, 0x00, 0x00, 0x90, 0x03, 0x00, 0x80, 0x52, 0x42, 0x40, 0x13, 0x91, + 0x2f, 0x06, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, 0x20, 0x02, 0x00, 0x35, + 0x73, 0xaa, 0x00, 0xf9, 0x76, 0x56, 0x16, 0xa9, 0x37, 0x01, 0x00, 0x35, + 0xe0, 0x03, 0x14, 0x2a, 0xfd, 0x7b, 0x42, 0xa9, 0xf3, 0x53, 0x43, 0xa9, + 0xf5, 0x5b, 0x44, 0xa9, 0xf7, 0x63, 0x45, 0xa9, 0xf9, 0x33, 0x40, 0xf9, + 0xff, 0xc3, 0x01, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x13, 0xaa, + 0xec, 0x05, 0x00, 0x94, 0xc0, 0xfe, 0xff, 0x34, 0xf4, 0x03, 0x00, 0x2a, + 0x1f, 0x20, 0x03, 0xd5, 0xf5, 0x5b, 0x44, 0xa9, 0x94, 0x02, 0x17, 0x32, + 0xf7, 0x63, 0x45, 0xa9, 0xf9, 0x33, 0x40, 0xf9, 0xe0, 0x03, 0x14, 0x2a, + 0xfd, 0x7b, 0x42, 0xa9, 0xf3, 0x53, 0x43, 0xa9, 0xff, 0xc3, 0x01, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x74, 0x40, 0x80, 0x52, 0xe0, 0x03, 0x14, 0x2a, + 0xfd, 0x7b, 0x42, 0xa9, 0xf3, 0x53, 0x43, 0xa9, 0xff, 0xc3, 0x01, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x14, 0x42, 0x80, 0x52, 0xf5, 0x5b, 0x44, 0xa9, + 0xf7, 0x63, 0x45, 0xa9, 0xf9, 0x33, 0x40, 0xf9, 0xf1, 0xff, 0xff, 0x17, + 0x02, 0x00, 0x00, 0x90, 0xe1, 0x01, 0x00, 0x90, 0x42, 0x40, 0x14, 0x91, + 0x21, 0x60, 0x19, 0x91, 0x40, 0x03, 0x00, 0xf0, 0x26, 0x00, 0x80, 0x52, + 0x00, 0xc0, 0x3b, 0x91, 0xe5, 0x01, 0x80, 0x52, 0x04, 0x00, 0x82, 0x52, + 0x03, 0x00, 0x80, 0xd2, 0xaa, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x02, 0x80, 0x52, 0xbf, 0x00, 0x07, 0x6b, 0xa5, 0x20, 0x87, 0x1a, + 0xa5, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xc6, 0x15, 0x00, 0x94, 0x60, 0x00, 0x00, 0xb4, 0x00, 0xa8, 0x40, 0xf9, + 0x00, 0xb4, 0x40, 0xf9, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xe0, 0x00, 0x00, 0x34, + 0xed, 0x13, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, 0x01, 0x00, 0x17, 0x32, + 0x20, 0x10, 0x80, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xbf, 0x05, 0x00, 0x94, 0x00, 0x00, 0x80, 0x52, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xa9, 0x05, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, + 0x01, 0x00, 0x17, 0x32, 0x20, 0x10, 0x80, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x40, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x79, 0x05, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, + 0x01, 0x00, 0x17, 0x32, 0x20, 0x10, 0x80, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x40, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x20, 0x05, 0x00, 0xb4, 0x54, 0x7c, 0x03, 0x1b, + 0xf3, 0x03, 0x00, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x02, 0x2a, + 0x94, 0x06, 0x00, 0x11, 0xf6, 0x03, 0x03, 0x2a, 0xf7, 0x1b, 0x00, 0xf9, + 0x80, 0x76, 0x1e, 0x53, 0xf7, 0x03, 0x01, 0xaa, 0xf4, 0x03, 0x00, 0xaa, + 0xce, 0xf3, 0xff, 0x97, 0x60, 0x3a, 0x00, 0xf9, 0x20, 0x04, 0x00, 0xb4, + 0x05, 0x0c, 0x00, 0x91, 0x75, 0x5a, 0x0d, 0x29, 0xa3, 0xf4, 0x7e, 0x92, + 0x63, 0x3e, 0x00, 0xf9, 0x84, 0x12, 0x00, 0x51, 0xe2, 0x03, 0x15, 0x2a, + 0xe1, 0x03, 0x17, 0xaa, 0xe0, 0x03, 0x13, 0xaa, 0x05, 0x0d, 0x80, 0x52, + 0x82, 0x07, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, 0xe0, 0x00, 0x00, 0x35, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x14, 0x00, 0x17, 0x32, 0x60, 0x3a, 0x40, 0xf9, 0xef, 0xf3, 0xff, 0x97, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x74, 0x40, 0x80, 0x52, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x14, 0x42, 0x80, 0x52, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xeb, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xe9, 0x06, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, 0x01, 0x00, 0x17, 0x32, + 0x20, 0x10, 0x80, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x40, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x05, 0x07, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, 0x01, 0x00, 0x17, 0x32, + 0x20, 0x10, 0x80, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x40, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x21, 0x07, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, 0x01, 0x00, 0x17, 0x32, + 0x20, 0x10, 0x80, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x40, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, 0x03, 0x08, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0x78, 0x06, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, + 0x01, 0x00, 0x17, 0x32, 0x20, 0x10, 0x80, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x40, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x4d, 0x06, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, 0x01, 0x00, 0x17, 0x32, + 0x20, 0x10, 0x80, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x40, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x11, 0x06, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, 0x01, 0x00, 0x17, 0x32, + 0x20, 0x10, 0x80, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x40, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x11, 0x06, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, 0x01, 0x00, 0x17, 0x32, + 0x20, 0x10, 0x80, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x40, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, 0x03, 0x0c, 0x80, 0x52, + 0x22, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, 0xd3, 0x07, 0x00, 0x94, + 0x1f, 0x00, 0x00, 0x71, 0x01, 0x00, 0x17, 0x32, 0x20, 0x10, 0x80, 0x1a, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x40, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xa5, 0x07, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, + 0x01, 0x00, 0x17, 0x32, 0x20, 0x10, 0x80, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x40, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x51, 0x07, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, + 0x01, 0x00, 0x17, 0x32, 0x20, 0x10, 0x80, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x40, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x61, 0x07, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, + 0x01, 0x00, 0x17, 0x32, 0x20, 0x10, 0x80, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x40, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, + 0x66, 0x1c, 0x00, 0x12, 0x07, 0x0c, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0x03, 0xb0, 0x41, 0x39, 0x04, 0x68, 0x40, 0xb9, 0x7f, 0x00, 0x00, 0x71, + 0xe3, 0x03, 0x02, 0x2a, 0x02, 0x30, 0x40, 0xf9, 0x85, 0x00, 0x9f, 0x1a, + 0x0d, 0x04, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, 0x01, 0x00, 0x17, 0x32, + 0x20, 0x10, 0x80, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x40, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x8d, 0x04, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, 0x01, 0x00, 0x17, 0x32, + 0x20, 0x10, 0x80, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x40, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xe9, 0x03, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, 0x01, 0x00, 0x17, 0x32, + 0x20, 0x10, 0x80, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x40, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x03, 0x00, 0xb4, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x01, 0x2a, 0xf3, 0x03, 0x00, 0xaa, + 0xda, 0x03, 0x00, 0x94, 0xa0, 0x00, 0x00, 0x34, 0x00, 0x00, 0x17, 0x32, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x62, 0xb2, 0x41, 0x39, 0xe1, 0x03, 0x14, 0x2a, 0xe0, 0x03, 0x13, 0xaa, + 0x5f, 0x00, 0x00, 0x71, 0x82, 0x02, 0x9f, 0x1a, 0x43, 0x04, 0x00, 0x94, + 0xc0, 0xfe, 0xff, 0x35, 0xe0, 0x03, 0x13, 0xaa, 0x64, 0x04, 0x00, 0x94, + 0x1f, 0x00, 0x00, 0x71, 0x01, 0x00, 0x17, 0x32, 0x20, 0x10, 0x80, 0x1a, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x40, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xb4, + 0xfd, 0x7b, 0xbf, 0xa9, 0xe3, 0x03, 0x02, 0x2a, 0x04, 0x0c, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0x02, 0x30, 0x40, 0xf9, 0x6e, 0x08, 0x00, 0x94, + 0x1f, 0x00, 0x00, 0x71, 0x01, 0x00, 0x17, 0x32, 0x20, 0x10, 0x80, 0x1a, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x40, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0xb4, 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xe6, 0x23, 0x01, 0x91, 0xe5, 0xc3, 0x00, 0x91, 0xe4, 0x03, 0x01, 0x91, + 0xe3, 0xb3, 0x00, 0x91, 0xe2, 0xd3, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0xf3, 0x03, 0x01, 0xaa, 0xe1, 0xe3, 0x00, 0x91, 0x4d, 0x08, 0x00, 0x94, + 0xc0, 0x00, 0x00, 0x35, 0xe1, 0x37, 0x40, 0xb9, 0x61, 0x02, 0x00, 0xf9, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x01, 0x00, 0x80, 0xd2, 0x61, 0x02, 0x00, 0xf9, 0x00, 0x00, 0x17, 0x32, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x40, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x9d, 0x08, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, + 0x01, 0x00, 0x17, 0x32, 0x20, 0x10, 0x80, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x40, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x0e, 0x08, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, 0x01, 0x00, 0x17, 0x32, + 0x20, 0x10, 0x80, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x40, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, 0x02, 0x09, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0xb4, 0x07, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, + 0x01, 0x00, 0x17, 0x32, 0x20, 0x10, 0x80, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x40, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x61, 0x07, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, 0x01, 0x00, 0x17, 0x32, + 0x20, 0x10, 0x80, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x40, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x69, 0x07, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, 0x01, 0x00, 0x17, 0x32, + 0x20, 0x10, 0x80, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x40, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, 0xe3, 0x03, 0x01, 0xaa, + 0x04, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, 0x02, 0x00, 0x80, 0x52, + 0x01, 0x00, 0x80, 0x12, 0x59, 0x07, 0x00, 0x94, 0x00, 0x00, 0x80, 0x52, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x40, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, + 0xe1, 0x03, 0x21, 0x2a, 0x42, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0x37, 0x07, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, 0x01, 0x00, 0x17, 0x32, + 0x20, 0x10, 0x80, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x40, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x02, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbc, 0xa9, 0x22, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0x73, 0x03, 0x00, 0x90, 0x73, 0x02, 0x02, 0x91, + 0xff, 0x7f, 0x02, 0xa9, 0x60, 0x02, 0x03, 0x91, 0xff, 0x7f, 0x03, 0xa9, + 0x1f, 0x20, 0x03, 0xd5, 0x01, 0x80, 0xa2, 0x38, 0x3f, 0x1c, 0x00, 0x72, + 0xc1, 0xff, 0xff, 0x54, 0xe3, 0x98, 0x00, 0x94, 0xe3, 0x83, 0x00, 0x91, + 0xe1, 0x03, 0x13, 0xaa, 0x66, 0x82, 0x00, 0x91, 0x24, 0x04, 0x40, 0xf9, + 0x22, 0x14, 0x40, 0xf9, 0x3f, 0x14, 0x00, 0xf9, 0x45, 0x00, 0x00, 0x8b, + 0x64, 0x00, 0x00, 0xb4, 0xa2, 0x00, 0x04, 0xcb, 0x20, 0x04, 0x00, 0xf9, + 0x24, 0x34, 0x40, 0xf9, 0x3f, 0x34, 0x00, 0xf9, 0x25, 0x24, 0x40, 0xf9, + 0x42, 0x00, 0x04, 0x8b, 0x62, 0x00, 0x00, 0xf9, 0x04, 0x00, 0x05, 0xcb, + 0x82, 0x00, 0x02, 0x8b, 0x65, 0x00, 0x00, 0xb4, 0x62, 0x00, 0x00, 0xf9, + 0x20, 0x24, 0x00, 0xf9, 0x21, 0x20, 0x00, 0x91, 0x63, 0x20, 0x00, 0x91, + 0x3f, 0x00, 0x06, 0xeb, 0x81, 0xfd, 0xff, 0x54, 0x61, 0x02, 0x03, 0x91, + 0x3f, 0xfc, 0x9f, 0x08, 0x47, 0x03, 0x00, 0xf0, 0xe4, 0x74, 0x47, 0xf9, + 0x22, 0x00, 0x80, 0xd2, 0x03, 0x00, 0x80, 0xd2, 0x86, 0x0c, 0x80, 0xd2, + 0x04, 0x00, 0x04, 0xcb, 0xe1, 0x83, 0x00, 0x91, 0x65, 0x02, 0x02, 0x8b, + 0x21, 0x0c, 0x02, 0x8b, 0x42, 0x04, 0x00, 0x91, 0x5f, 0x14, 0x00, 0xf1, + 0x21, 0x80, 0x5f, 0xf8, 0x63, 0x00, 0x01, 0x8b, 0x21, 0x7c, 0x06, 0x9b, + 0x21, 0x08, 0xc4, 0x9a, 0xa1, 0x1c, 0x02, 0x39, 0xc1, 0xfe, 0xff, 0x54, + 0x63, 0x7c, 0x06, 0x9b, 0x84, 0xf4, 0x7e, 0xd3, 0xe0, 0x74, 0x07, 0xf9, + 0x63, 0x08, 0xc4, 0x9a, 0x63, 0x32, 0x02, 0x39, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf5, 0x13, 0x00, 0xf9, + 0x54, 0x03, 0x00, 0xf0, 0x95, 0x02, 0x02, 0x91, 0xce, 0xfa, 0xff, 0x97, + 0xb3, 0x02, 0x03, 0x91, 0xf4, 0x03, 0x00, 0x2a, 0x22, 0x00, 0x80, 0x52, + 0x61, 0x82, 0xa2, 0x38, 0x3f, 0x1c, 0x00, 0x72, 0xc1, 0xff, 0xff, 0x54, + 0xb4, 0x4e, 0x34, 0x8b, 0x9e, 0x98, 0x00, 0x94, 0x80, 0x06, 0x00, 0xf9, + 0x7f, 0xfe, 0x9f, 0x08, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x13, 0x00, 0xf9, 0x55, 0x03, 0x00, 0xf0, + 0xb5, 0x02, 0x02, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xb6, 0xfa, 0xff, 0x97, + 0xb3, 0x02, 0x03, 0x91, 0xf4, 0x03, 0x00, 0x2a, 0x22, 0x00, 0x80, 0x52, + 0x61, 0x82, 0xa2, 0x38, 0x3f, 0x1c, 0x00, 0x72, 0xc1, 0xff, 0xff, 0x54, + 0x87, 0x98, 0x00, 0x94, 0xe1, 0x03, 0x14, 0x2a, 0x22, 0x10, 0x00, 0x91, + 0xa1, 0x0e, 0x01, 0x8b, 0xb5, 0x0e, 0x02, 0x8b, 0x22, 0x04, 0x40, 0xf9, + 0x3f, 0x04, 0x00, 0xf9, 0xa1, 0x06, 0x40, 0xf9, 0x21, 0x00, 0x02, 0xcb, + 0x21, 0x00, 0x00, 0x8b, 0xa1, 0x06, 0x00, 0xf9, 0x7f, 0xfe, 0x9f, 0x08, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf5, 0x13, 0x00, 0xf9, 0x54, 0x03, 0x00, 0xf0, + 0x95, 0x02, 0x02, 0x91, 0x96, 0xfa, 0xff, 0x97, 0xb3, 0x02, 0x03, 0x91, + 0xf4, 0x03, 0x00, 0x2a, 0x22, 0x00, 0x80, 0x52, 0x61, 0x82, 0xa2, 0x38, + 0x3f, 0x1c, 0x00, 0x72, 0xc1, 0xff, 0xff, 0x54, 0xb4, 0x4e, 0x34, 0x8b, + 0x66, 0x98, 0x00, 0x94, 0x80, 0x26, 0x00, 0xf9, 0x7f, 0xfe, 0x9f, 0x08, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf5, 0x13, 0x00, 0xf9, 0x80, 0xfa, 0xff, 0x97, + 0x41, 0x03, 0x00, 0xf0, 0x35, 0x00, 0x02, 0x91, 0xb3, 0x02, 0x03, 0x91, + 0xf4, 0x03, 0x00, 0x2a, 0x20, 0x00, 0x80, 0x52, 0x61, 0x82, 0xa0, 0x38, + 0x3f, 0x1c, 0x00, 0x72, 0xc1, 0xff, 0xff, 0x54, 0x4f, 0x98, 0x00, 0x94, + 0xe1, 0x03, 0x14, 0x2a, 0x23, 0x30, 0x00, 0x91, 0x21, 0x20, 0x00, 0x91, + 0xa3, 0x0e, 0x03, 0x8b, 0xa1, 0x0e, 0x01, 0x8b, 0x62, 0x04, 0x40, 0xf9, + 0x24, 0x04, 0x40, 0xf9, 0x3f, 0x04, 0x00, 0xf9, 0x41, 0x00, 0x04, 0xcb, + 0x21, 0x00, 0x00, 0x8b, 0x61, 0x04, 0x00, 0xf9, 0x7f, 0xfe, 0x9f, 0x08, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x03, 0x00, 0xf0, 0x00, 0x00, 0x02, 0x91, 0x00, 0x20, 0x02, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0xaa, 0x40, 0x01, 0x00, 0xb4, + 0x43, 0x03, 0x00, 0xf0, 0x63, 0x00, 0x02, 0x91, 0x01, 0x24, 0x00, 0x91, + 0x00, 0x14, 0x00, 0x91, 0x64, 0x88, 0x40, 0xb9, 0x44, 0x00, 0x00, 0xb9, + 0x63, 0x30, 0x42, 0x39, 0x43, 0x10, 0x00, 0x39, 0x82, 0xf1, 0xff, 0x17, + 0x40, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x03, 0x00, 0xf0, + 0x1f, 0x00, 0x00, 0x71, 0xe1, 0x03, 0x00, 0x2a, 0x43, 0x01, 0x80, 0x52, + 0x00, 0x00, 0x80, 0x52, 0x21, 0x10, 0x83, 0x1a, 0x41, 0x80, 0x00, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0xe1, 0x03, 0x00, 0xaa, 0xc0, 0x00, 0x00, 0xb4, + 0x40, 0x03, 0x00, 0xf0, 0x02, 0x80, 0x40, 0xb9, 0x00, 0x00, 0x80, 0x52, + 0x22, 0x00, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x38, 0xd5, + 0x42, 0x3c, 0x48, 0xd3, 0x5f, 0x00, 0x00, 0xf1, 0x40, 0x00, 0x00, 0x54, + 0xc0, 0x03, 0x5f, 0xd6, 0xfb, 0x73, 0xbf, 0xa9, 0xfd, 0x7b, 0xbf, 0xa9, + 0xaf, 0x00, 0x00, 0x94, 0xfc, 0x03, 0x00, 0xaa, 0x21, 0x04, 0x00, 0x58, + 0x20, 0x00, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x11, 0x20, 0x00, 0x00, 0xb9, + 0xe1, 0x03, 0x00, 0x58, 0x20, 0x00, 0x40, 0xf9, 0x02, 0x00, 0x40, 0xf9, + 0x5f, 0x00, 0x00, 0xf1, 0xa0, 0x00, 0x00, 0x54, 0x83, 0x03, 0x00, 0x58, + 0x22, 0x00, 0x80, 0x52, 0x62, 0x00, 0x00, 0xb9, 0x09, 0x00, 0x00, 0x14, + 0x00, 0x20, 0x00, 0x91, 0x23, 0x03, 0x00, 0x58, 0x62, 0x00, 0x40, 0xf9, + 0x1f, 0x00, 0x02, 0xeb, 0x61, 0x00, 0x00, 0x54, 0xe3, 0x02, 0x00, 0x58, + 0x60, 0x00, 0x40, 0xf9, 0x20, 0x00, 0x00, 0xf9, 0x01, 0x02, 0x00, 0x58, + 0x20, 0x00, 0x40, 0xb9, 0x1f, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x54, + 0xac, 0x08, 0x00, 0x94, 0xd7, 0x09, 0x00, 0x94, 0xe0, 0x03, 0x1c, 0xaa, + 0x71, 0x00, 0x00, 0x94, 0xfd, 0x7b, 0xc1, 0xa8, 0xfb, 0x73, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xcc, 0x21, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x30, 0xba, 0x21, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x38, 0xbb, 0x21, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x58, 0xbb, 0x21, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xc8, 0xbc, 0x21, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x42, 0x3b, 0xd5, 0xdf, 0x43, 0x03, 0xd5, 0xfd, 0x7b, 0xbf, 0xa9, + 0xf3, 0x53, 0xbf, 0xa9, 0xf5, 0x5b, 0xbf, 0xa9, 0xf7, 0x63, 0xbf, 0xa9, + 0xf9, 0x6b, 0xbf, 0xa9, 0xfb, 0x73, 0xbf, 0xa9, 0xa8, 0x00, 0x38, 0xd5, + 0x08, 0x3d, 0x48, 0xd3, 0x45, 0x06, 0x00, 0x58, 0xa6, 0x78, 0x68, 0xf8, + 0xc7, 0x0c, 0x41, 0xb9, 0xff, 0x00, 0x00, 0x71, 0x00, 0x01, 0x00, 0x54, + 0xe8, 0x27, 0xbf, 0xad, 0xea, 0x2f, 0xbf, 0xad, 0xec, 0x37, 0xbf, 0xad, + 0xee, 0x3f, 0xbf, 0xad, 0x22, 0x44, 0x3b, 0xd5, 0x03, 0x44, 0x3b, 0xd5, + 0xe2, 0x0f, 0xbf, 0xa9, 0x01, 0x00, 0x80, 0xd2, 0xe0, 0x07, 0xbf, 0xa9, + 0xf3, 0x03, 0x05, 0xaa, 0xf4, 0x03, 0x06, 0xaa, 0xf5, 0x03, 0x08, 0xaa, + 0xe7, 0x97, 0x00, 0x94, 0xe8, 0x03, 0x15, 0xaa, 0xe5, 0x03, 0x13, 0xaa, + 0xe6, 0x03, 0x14, 0xaa, 0xe2, 0x03, 0x00, 0x58, 0x41, 0x78, 0x68, 0xb8, + 0xe4, 0x03, 0x00, 0x91, 0xc4, 0x04, 0x00, 0xf9, 0xa3, 0x03, 0x00, 0x58, + 0x64, 0x78, 0x68, 0xf8, 0x9f, 0x00, 0x00, 0x91, 0x04, 0x00, 0x80, 0xd2, + 0x3f, 0x00, 0x00, 0x71, 0x60, 0x00, 0x00, 0x54, 0x44, 0x78, 0x28, 0xb8, + 0xc1, 0x24, 0x00, 0xb9, 0xa4, 0x78, 0x28, 0xf8, 0x23, 0x00, 0x80, 0xd2, + 0xbf, 0x3b, 0x03, 0xd5, 0xc3, 0x04, 0x01, 0xb9, 0xbf, 0x3b, 0x03, 0xd5, + 0x43, 0x02, 0x00, 0x58, 0x61, 0x02, 0x00, 0x58, 0x24, 0x00, 0x00, 0xb9, + 0x64, 0x08, 0x00, 0xb9, 0xe1, 0x7f, 0x40, 0xb2, 0x61, 0x04, 0x00, 0xb9, + 0xbf, 0x3b, 0x03, 0xd5, 0x64, 0x00, 0x00, 0xb9, 0x9f, 0x3b, 0x03, 0xd5, + 0x9f, 0x20, 0x03, 0xd5, 0xa4, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xcf, 0x21, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbb, 0x21, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x78, 0xcf, 0x21, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xcf, 0x21, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xb8, 0xcf, 0x21, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x0c, 0x40, 0xf9, 0x84, 0xec, 0x7c, 0x92, + 0x02, 0x00, 0x80, 0xd2, 0x03, 0x00, 0x80, 0xd2, 0x82, 0x0c, 0xbf, 0xa9, + 0x82, 0x0c, 0xbf, 0xa9, 0x82, 0x0c, 0xbf, 0xa9, 0x82, 0x0c, 0xbf, 0xa9, + 0x82, 0x0c, 0xbf, 0xa9, 0x82, 0x0c, 0xbf, 0xa9, 0x82, 0x0c, 0xbf, 0xa9, + 0x82, 0x0c, 0xbf, 0xa9, 0x82, 0x0c, 0xbf, 0xa9, 0x82, 0x0c, 0xbf, 0xa9, + 0x82, 0x0c, 0xbf, 0xa9, 0x82, 0x0c, 0xbf, 0xa9, 0x82, 0x0c, 0xbf, 0xa9, + 0x82, 0x0c, 0xbf, 0xa9, 0x82, 0x0c, 0xbf, 0xa9, 0x82, 0x0c, 0xbf, 0xa9, + 0x82, 0x0c, 0xbf, 0xa9, 0x82, 0x00, 0x80, 0xd2, 0xe3, 0x03, 0x01, 0xaa, + 0x82, 0x0c, 0xbf, 0xa9, 0x04, 0x04, 0x00, 0xf9, 0x23, 0x00, 0x80, 0xd2, + 0x03, 0x04, 0x01, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0xdf, 0x43, 0x03, 0xd5, + 0xa1, 0x00, 0x38, 0xd5, 0x21, 0x3c, 0x48, 0xd3, 0x22, 0x03, 0x00, 0x58, + 0x43, 0x04, 0x40, 0xb9, 0x3f, 0x00, 0x03, 0x6b, 0x61, 0x02, 0x00, 0x54, + 0x43, 0x08, 0x40, 0xb9, 0x7f, 0x00, 0x00, 0x71, 0x00, 0x02, 0x00, 0x54, + 0x63, 0x04, 0x00, 0x51, 0x43, 0x08, 0x00, 0xb9, 0x7f, 0x00, 0x00, 0x71, + 0x81, 0x01, 0x00, 0x54, 0x02, 0x02, 0x00, 0x58, 0x43, 0x00, 0x40, 0xb9, + 0x7f, 0x00, 0x00, 0x71, 0x01, 0x01, 0x00, 0x54, 0x42, 0x01, 0x00, 0x58, + 0x03, 0x00, 0x80, 0x12, 0x43, 0x04, 0x00, 0xb9, 0xbf, 0x3b, 0x03, 0xd5, + 0x03, 0x00, 0x80, 0x52, 0x43, 0x00, 0x00, 0xb9, 0x9f, 0x3b, 0x03, 0xd5, + 0x20, 0x42, 0x1b, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xcf, 0x21, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xb8, 0xcf, 0x21, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x42, 0x3b, 0xd5, 0xdf, 0x43, 0x03, 0xd5, + 0xa2, 0x00, 0x38, 0xd5, 0x42, 0x3c, 0x48, 0xd3, 0xc1, 0x02, 0x00, 0x58, + 0x23, 0x04, 0x40, 0xb9, 0x7f, 0x00, 0x02, 0x6b, 0xc0, 0x01, 0x00, 0x54, + 0xbf, 0x3b, 0x03, 0xd5, 0x24, 0xfc, 0x5f, 0x88, 0x84, 0x00, 0x00, 0x34, + 0x20, 0x42, 0x1b, 0xd5, 0xdf, 0x3f, 0x03, 0xd5, 0xf3, 0xff, 0xff, 0x17, + 0x24, 0x00, 0x80, 0xd2, 0x24, 0x7c, 0x05, 0x88, 0x65, 0x00, 0x00, 0x34, + 0x20, 0x42, 0x1b, 0xd5, 0xee, 0xff, 0xff, 0x17, 0xbf, 0x3b, 0x03, 0xd5, + 0x22, 0x04, 0x00, 0xb9, 0x25, 0x08, 0x40, 0xb9, 0xa5, 0x04, 0x00, 0x11, + 0x25, 0x08, 0x00, 0xb9, 0xbf, 0x3b, 0x03, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0xcf, 0x21, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xdf, 0x43, 0x03, 0xd5, 0xa2, 0x00, 0x38, 0xd5, + 0x42, 0x3c, 0x48, 0xd3, 0xa1, 0x02, 0x00, 0x18, 0xc3, 0x02, 0x00, 0x58, + 0x60, 0x78, 0x62, 0xb8, 0x1f, 0x00, 0x01, 0x6b, 0xc1, 0xff, 0xff, 0x54, + 0x80, 0x02, 0x00, 0x58, 0xe1, 0x03, 0x00, 0x91, 0x21, 0x3c, 0x00, 0xd1, + 0x21, 0xec, 0x7c, 0x92, 0x01, 0x78, 0x22, 0xf8, 0x24, 0x02, 0x00, 0x58, + 0x80, 0x00, 0x40, 0xb9, 0x1f, 0x00, 0x00, 0x71, 0xc0, 0xff, 0xff, 0x54, + 0x00, 0x00, 0x80, 0xd2, 0x60, 0x78, 0x22, 0xb8, 0x60, 0x00, 0x40, 0xb9, + 0x1f, 0x00, 0x00, 0x71, 0xc1, 0xff, 0xff, 0x54, 0x28, 0x00, 0x00, 0x14, + 0xc0, 0x03, 0x5f, 0xd6, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xce, 0x21, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x78, 0xcf, 0x21, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x34, 0xd0, 0x21, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x21, 0x42, 0x3b, 0xd5, 0xdf, 0x43, 0x03, 0xd5, 0xa2, 0x00, 0x38, 0xd5, + 0x42, 0x3c, 0x48, 0xd3, 0x83, 0x00, 0x00, 0x58, 0x60, 0x78, 0x62, 0xf8, + 0x21, 0x42, 0x1b, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, 0xc0, 0xcf, 0x21, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x21, 0x42, 0x3b, 0xd5, 0xdf, 0x43, 0x03, 0xd5, + 0xa2, 0x00, 0x38, 0xd5, 0x42, 0x3c, 0x48, 0xd3, 0x83, 0x00, 0x00, 0x58, + 0x60, 0x78, 0x62, 0xb8, 0x21, 0x42, 0x1b, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0xce, 0x21, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x9f, 0x3b, 0x03, 0xd5, + 0x22, 0x00, 0x80, 0xd2, 0x03, 0xbc, 0x70, 0xd3, 0x42, 0x00, 0x03, 0xaa, + 0xa2, 0xcb, 0x18, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, 0xa0, 0x00, 0x38, 0xd5, + 0x00, 0x3c, 0x48, 0xd3, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x43, 0x03, 0xd5, 0xb4, 0x00, 0x38, 0xd5, 0x94, 0x3e, 0x48, 0xd3, + 0x21, 0x0e, 0x00, 0x58, 0xdf, 0x43, 0x03, 0xd5, 0x20, 0x78, 0x74, 0xf8, + 0x1f, 0x00, 0x00, 0xf1, 0x20, 0xff, 0xff, 0x54, 0x02, 0x23, 0x80, 0x52, + 0x02, 0x00, 0x02, 0x8b, 0x43, 0xfc, 0x5f, 0x88, 0x7f, 0x00, 0x00, 0x71, + 0x81, 0xfe, 0xff, 0x54, 0x23, 0x00, 0x80, 0x52, 0x43, 0x7c, 0x04, 0x88, + 0x9f, 0x00, 0x00, 0x71, 0x01, 0xfe, 0xff, 0x54, 0xbf, 0x3b, 0x03, 0xd5, + 0x03, 0x04, 0x41, 0xb9, 0x7f, 0x00, 0x00, 0x71, 0xa1, 0x00, 0x00, 0x54, + 0x03, 0x00, 0x80, 0x52, 0x43, 0x00, 0x00, 0xb9, 0xbf, 0x3b, 0x03, 0xd5, + 0xe8, 0xff, 0xff, 0x17, 0x03, 0x00, 0x80, 0x52, 0x03, 0x04, 0x01, 0xb9, + 0xbf, 0x3b, 0x03, 0xd5, 0x03, 0x00, 0x80, 0x52, 0x43, 0x00, 0x00, 0xb9, + 0xbf, 0x3b, 0x03, 0xd5, 0xe2, 0x0a, 0x00, 0x58, 0x40, 0x78, 0x34, 0xf8, + 0xbf, 0x3b, 0x03, 0xd5, 0x21, 0x78, 0x74, 0xf8, 0x1f, 0x00, 0x01, 0x6b, + 0xe0, 0x00, 0x00, 0x54, 0x01, 0x00, 0x80, 0x52, 0x41, 0x78, 0x34, 0xf8, + 0x21, 0x00, 0x80, 0x52, 0x01, 0x04, 0x01, 0xb9, 0xbf, 0x3b, 0x03, 0xd5, + 0xd6, 0xff, 0xff, 0x17, 0x02, 0x04, 0x40, 0xb9, 0x03, 0x24, 0x40, 0xb9, + 0x42, 0x04, 0x00, 0x11, 0x02, 0x04, 0x00, 0xb9, 0x22, 0x09, 0x00, 0x58, + 0x04, 0x04, 0x40, 0xf9, 0x9f, 0x00, 0x00, 0x91, 0x43, 0x78, 0x34, 0xb8, + 0xf3, 0x03, 0x00, 0xaa, 0xec, 0x96, 0x00, 0x94, 0xe0, 0x03, 0x13, 0xaa, + 0xe4, 0x17, 0xc1, 0xa8, 0xbf, 0x00, 0x00, 0xf1, 0x40, 0x05, 0x00, 0x54, + 0x04, 0x40, 0x18, 0xd5, 0x25, 0x40, 0x18, 0xd5, 0x01, 0x0c, 0x41, 0xb9, + 0x3f, 0x00, 0x00, 0x71, 0x80, 0x02, 0x00, 0x54, 0xe0, 0x07, 0xc1, 0xa8, + 0x20, 0x44, 0x1b, 0xd5, 0x01, 0x44, 0x1b, 0xd5, 0xfe, 0x7f, 0xc1, 0xac, + 0xfc, 0x77, 0xc1, 0xac, 0xfa, 0x6f, 0xc1, 0xac, 0xf8, 0x67, 0xc1, 0xac, + 0xf6, 0x5f, 0xc1, 0xac, 0xf4, 0x57, 0xc1, 0xac, 0xf2, 0x4f, 0xc1, 0xac, + 0xf0, 0x47, 0xc1, 0xac, 0xee, 0x3f, 0xc1, 0xac, 0xec, 0x37, 0xc1, 0xac, + 0xea, 0x2f, 0xc1, 0xac, 0xe8, 0x27, 0xc1, 0xac, 0xe6, 0x1f, 0xc1, 0xac, + 0xe4, 0x17, 0xc1, 0xac, 0xe2, 0x0f, 0xc1, 0xac, 0xe0, 0x07, 0xc1, 0xac, + 0xfc, 0x77, 0xc1, 0xa8, 0xfa, 0x6f, 0xc1, 0xa8, 0xf8, 0x67, 0xc1, 0xa8, + 0xf6, 0x5f, 0xc1, 0xa8, 0xf4, 0x57, 0xc1, 0xa8, 0xf2, 0x4f, 0xc1, 0xa8, + 0xf0, 0x47, 0xc1, 0xa8, 0xee, 0x3f, 0xc1, 0xa8, 0xec, 0x37, 0xc1, 0xa8, + 0xea, 0x2f, 0xc1, 0xa8, 0xe8, 0x27, 0xc1, 0xa8, 0xe6, 0x1f, 0xc1, 0xa8, + 0xe4, 0x17, 0xc1, 0xa8, 0xe2, 0x0f, 0xc1, 0xa8, 0xe0, 0x07, 0xc1, 0xa8, + 0xfd, 0x7b, 0xc1, 0xa8, 0xe0, 0x03, 0x9f, 0xd6, 0x01, 0x0c, 0x41, 0xb9, + 0x3f, 0x00, 0x00, 0x71, 0x00, 0x01, 0x00, 0x54, 0xe0, 0x07, 0xc1, 0xa8, + 0x20, 0x44, 0x1b, 0xd5, 0x01, 0x44, 0x1b, 0xd5, 0xee, 0x3f, 0xc1, 0xac, + 0xec, 0x37, 0xc1, 0xac, 0xea, 0x2f, 0xc1, 0xac, 0xe8, 0x27, 0xc1, 0xac, + 0xfb, 0x73, 0xc1, 0xa8, 0xf9, 0x6b, 0xc1, 0xa8, 0xf7, 0x63, 0xc1, 0xa8, + 0xf5, 0x5b, 0xc1, 0xa8, 0xf3, 0x53, 0xc1, 0xa8, 0xfd, 0x7b, 0xc1, 0xa8, + 0x24, 0x42, 0x1b, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0xd0, 0x21, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xcf, 0x21, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xbb, 0x21, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x42, 0x3b, 0xd5, + 0x20, 0x42, 0x1b, 0xd5, 0xe0, 0x03, 0x01, 0xaa, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0x07, 0xbf, 0xa9, 0xe2, 0x0f, 0xbf, 0xa9, 0xa1, 0x00, 0x38, 0xd5, + 0x21, 0x3c, 0x48, 0xd3, 0xc3, 0x06, 0x00, 0x58, 0x62, 0x78, 0x61, 0xb8, + 0x5f, 0x00, 0x00, 0x71, 0x40, 0x02, 0x00, 0x54, 0x42, 0x04, 0x00, 0x11, + 0x62, 0x78, 0x21, 0xb8, 0xe4, 0x17, 0xbf, 0xa9, 0xe6, 0x1f, 0xbf, 0xa9, + 0xe8, 0x27, 0xbf, 0xa9, 0xea, 0x2f, 0xbf, 0xa9, 0xec, 0x37, 0xbf, 0xa9, + 0xee, 0x3f, 0xbf, 0xa9, 0xf0, 0x47, 0xbf, 0xa9, 0xf2, 0x4f, 0xbf, 0xa9, + 0x00, 0x40, 0x38, 0xd5, 0x21, 0x40, 0x38, 0xd5, 0xe0, 0x07, 0xbf, 0xa9, + 0xfd, 0x7b, 0xbf, 0xa9, 0x94, 0x96, 0x00, 0x94, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x42, 0x04, 0x00, 0x11, 0x62, 0x78, 0x21, 0xb8, + 0x22, 0x04, 0x00, 0x58, 0x40, 0x78, 0x61, 0xf8, 0x1f, 0x00, 0x00, 0xf1, + 0xe0, 0x02, 0x00, 0x54, 0xe4, 0x17, 0xbf, 0xa9, 0xe6, 0x1f, 0xbf, 0xa9, + 0xe8, 0x27, 0xbf, 0xa9, 0xea, 0x2f, 0xbf, 0xa9, 0xec, 0x37, 0xbf, 0xa9, + 0xee, 0x3f, 0xbf, 0xa9, 0xf0, 0x47, 0xbf, 0xa9, 0xf2, 0x4f, 0xbf, 0xa9, + 0x04, 0x40, 0x38, 0xd5, 0x25, 0x40, 0x38, 0xd5, 0xe4, 0x17, 0xbf, 0xa9, + 0xe4, 0x03, 0x00, 0x91, 0x04, 0x04, 0x00, 0xf9, 0x43, 0x02, 0x00, 0x58, + 0xa1, 0x00, 0x38, 0xd5, 0x21, 0x3c, 0x48, 0xd3, 0x64, 0x78, 0x61, 0xf8, + 0x9f, 0x00, 0x00, 0x91, 0xfd, 0x7b, 0xbf, 0xa9, 0x78, 0x96, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbf, 0xa9, + 0x74, 0x96, 0x00, 0x94, 0xfd, 0x7b, 0xc1, 0xa8, 0xff, 0xc3, 0x00, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0xce, 0x21, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xcf, 0x21, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x78, 0xcf, 0x21, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xdf, 0x43, 0x03, 0xd5, 0x6d, 0x96, 0x00, 0x94, + 0xa8, 0x00, 0x38, 0xd5, 0x08, 0x3d, 0x48, 0xd3, 0x43, 0x0d, 0x00, 0x58, + 0x62, 0x78, 0x68, 0xb8, 0x42, 0x04, 0x00, 0x51, 0x62, 0x78, 0x28, 0xb8, + 0x5f, 0x00, 0x00, 0x71, 0x00, 0x02, 0x00, 0x54, 0xe4, 0x17, 0xc1, 0xa8, + 0x04, 0x40, 0x18, 0xd5, 0x25, 0x40, 0x18, 0xd5, 0xf2, 0x4f, 0xc1, 0xa8, + 0xf0, 0x47, 0xc1, 0xa8, 0xee, 0x3f, 0xc1, 0xa8, 0xec, 0x37, 0xc1, 0xa8, + 0xea, 0x2f, 0xc1, 0xa8, 0xe8, 0x27, 0xc1, 0xa8, 0xe6, 0x1f, 0xc1, 0xa8, + 0xe4, 0x17, 0xc1, 0xa8, 0xe2, 0x0f, 0xc1, 0xa8, 0xe0, 0x07, 0xc1, 0xa8, + 0xfd, 0x7b, 0xc1, 0xa8, 0xe0, 0x03, 0x9f, 0xd6, 0xe1, 0x0a, 0x00, 0x58, + 0x20, 0x78, 0x68, 0xf8, 0x1f, 0x00, 0x00, 0xf1, 0xe0, 0x09, 0x00, 0x54, + 0xa3, 0x0a, 0x00, 0x58, 0x62, 0x78, 0x68, 0xf8, 0x1f, 0x00, 0x02, 0xeb, + 0x20, 0x01, 0x00, 0x54, 0x63, 0x0a, 0x00, 0x58, 0x63, 0x04, 0x40, 0xb9, + 0x7f, 0x00, 0x08, 0x6b, 0xc1, 0x02, 0x00, 0x54, 0x23, 0x0a, 0x00, 0x58, + 0x62, 0x00, 0x40, 0xb9, 0x5f, 0x00, 0x00, 0x71, 0x40, 0x02, 0x00, 0x54, + 0x04, 0x04, 0x40, 0xf9, 0x9f, 0x00, 0x00, 0x91, 0xe4, 0x17, 0xc1, 0xa8, + 0x04, 0x40, 0x18, 0xd5, 0x25, 0x40, 0x18, 0xd5, 0xf2, 0x4f, 0xc1, 0xa8, + 0xf0, 0x47, 0xc1, 0xa8, 0xee, 0x3f, 0xc1, 0xa8, 0xec, 0x37, 0xc1, 0xa8, + 0xea, 0x2f, 0xc1, 0xa8, 0xe8, 0x27, 0xc1, 0xa8, 0xe6, 0x1f, 0xc1, 0xa8, + 0xe4, 0x17, 0xc1, 0xa8, 0xe2, 0x0f, 0xc1, 0xa8, 0xe0, 0x07, 0xc1, 0xa8, + 0xfd, 0x7b, 0xc1, 0xa8, 0xe0, 0x03, 0x9f, 0xd6, 0x04, 0x04, 0x40, 0xf9, + 0x9f, 0x00, 0x00, 0x91, 0xe4, 0x17, 0xc1, 0xa8, 0xf4, 0x57, 0xbf, 0xa9, + 0xf6, 0x5f, 0xbf, 0xa9, 0xf8, 0x67, 0xbf, 0xa9, 0xfa, 0x6f, 0xbf, 0xa9, + 0xfc, 0x77, 0xbf, 0xa9, 0x03, 0x0c, 0x41, 0xb9, 0x7f, 0x00, 0x00, 0x71, + 0x80, 0x02, 0x00, 0x54, 0xe0, 0x07, 0xbf, 0xad, 0xe2, 0x0f, 0xbf, 0xad, + 0xe4, 0x17, 0xbf, 0xad, 0xe6, 0x1f, 0xbf, 0xad, 0xe8, 0x27, 0xbf, 0xad, + 0xea, 0x2f, 0xbf, 0xad, 0xec, 0x37, 0xbf, 0xad, 0xee, 0x3f, 0xbf, 0xad, + 0xf0, 0x47, 0xbf, 0xad, 0xf2, 0x4f, 0xbf, 0xad, 0xf4, 0x57, 0xbf, 0xad, + 0xf6, 0x5f, 0xbf, 0xad, 0xf8, 0x67, 0xbf, 0xad, 0xfa, 0x6f, 0xbf, 0xad, + 0xfc, 0x77, 0xbf, 0xad, 0xfe, 0x7f, 0xbf, 0xad, 0x22, 0x44, 0x3b, 0xd5, + 0x03, 0x44, 0x3b, 0xd5, 0xe2, 0x0f, 0xbf, 0xa9, 0xe4, 0x17, 0xbf, 0xa9, + 0xe3, 0x03, 0x00, 0x91, 0x03, 0x04, 0x00, 0xf9, 0xa3, 0x03, 0x00, 0x58, + 0x64, 0x78, 0x68, 0xf8, 0x9f, 0x00, 0x00, 0x91, 0x83, 0x03, 0x00, 0x58, + 0x62, 0x78, 0x68, 0xb8, 0x5f, 0x00, 0x00, 0x71, 0x80, 0x00, 0x00, 0x54, + 0x02, 0x24, 0x00, 0xb9, 0x02, 0x00, 0x80, 0x52, 0x62, 0x78, 0x28, 0xb8, + 0x02, 0x00, 0x80, 0xd2, 0x22, 0x78, 0x28, 0xf8, 0x22, 0x00, 0x80, 0xd2, + 0xbf, 0x3b, 0x03, 0xd5, 0x02, 0x04, 0x01, 0xb9, 0xbf, 0x3b, 0x03, 0xd5, + 0x21, 0x02, 0x00, 0x58, 0x21, 0x40, 0x18, 0xd5, 0xe0, 0x03, 0x9f, 0xd6, + 0x00, 0xce, 0x21, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xcf, 0x21, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x21, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xcf, 0x21, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xb8, 0xcf, 0x21, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x78, 0xcf, 0x21, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xbb, 0x21, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xd6, 0x00, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xdf, 0x43, 0x03, 0xd5, 0x20, 0x01, 0x00, 0x58, + 0xe1, 0x03, 0x00, 0x91, 0x21, 0x3c, 0x00, 0xd1, 0x21, 0xec, 0x7c, 0x92, + 0x01, 0x00, 0x00, 0xf9, 0xc0, 0x00, 0x00, 0x58, 0xe1, 0x00, 0x00, 0x58, + 0x01, 0x00, 0x00, 0xf9, 0xc0, 0x03, 0x5f, 0xd6, 0x78, 0xcf, 0x21, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x68, 0xd0, 0x21, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x23, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xb4, + 0x02, 0x00, 0x40, 0xb9, 0xa1, 0x29, 0x89, 0x52, 0x81, 0x2a, 0xa8, 0x72, + 0x5f, 0x00, 0x01, 0x6b, 0x60, 0x00, 0x00, 0x54, 0xa0, 0x02, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x74, 0x06, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x80, 0x01, 0x71, + 0x04, 0x08, 0x40, 0xfa, 0x61, 0x00, 0x00, 0x54, 0xa0, 0x02, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xba, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, + 0xf6, 0x03, 0x05, 0x2a, 0xf5, 0x03, 0x06, 0x2a, 0xf7, 0x63, 0x03, 0xa9, + 0xf8, 0x03, 0x03, 0x2a, 0xf7, 0x03, 0x04, 0x2a, 0xf9, 0x6b, 0x04, 0xa9, + 0xfa, 0x03, 0x01, 0xaa, 0xf9, 0x03, 0x02, 0xaa, 0xfb, 0x2b, 0x00, 0xf9, + 0x39, 0xfe, 0xff, 0x97, 0x7b, 0x10, 0x00, 0xf0, 0x61, 0xbb, 0x4f, 0xb9, + 0x21, 0x04, 0x00, 0x11, 0x61, 0xbb, 0x0f, 0xb9, 0x14, 0xfe, 0xff, 0x97, + 0x60, 0x10, 0x00, 0xf0, 0x01, 0xe8, 0x4c, 0xb9, 0x60, 0x10, 0x00, 0xd0, + 0x14, 0x68, 0x46, 0xf9, 0x61, 0x01, 0x00, 0x34, 0x7f, 0x02, 0x14, 0xeb, + 0x20, 0x05, 0x00, 0x54, 0x00, 0x00, 0x80, 0x52, 0x03, 0x00, 0x00, 0x14, + 0x7f, 0x02, 0x14, 0xeb, 0xa0, 0x04, 0x00, 0x54, 0x00, 0x04, 0x00, 0x11, + 0x1f, 0x00, 0x01, 0x6b, 0x94, 0x2a, 0x40, 0xf9, 0x61, 0xff, 0xff, 0x54, + 0x24, 0xfe, 0xff, 0x97, 0x61, 0xbb, 0x4f, 0xb9, 0x21, 0x04, 0x00, 0x51, + 0x61, 0xbb, 0x0f, 0xb9, 0x00, 0xfe, 0xff, 0x97, 0xbb, 0x0c, 0x00, 0x94, + 0x7f, 0x02, 0x14, 0xeb, 0xe0, 0x03, 0x00, 0x54, 0xd7, 0x04, 0x00, 0x34, + 0xbf, 0x06, 0x00, 0x71, 0xc8, 0x04, 0x00, 0x54, 0x57, 0xfe, 0xff, 0x97, + 0x61, 0x10, 0x00, 0xd0, 0x21, 0x80, 0x2d, 0x91, 0x3f, 0x00, 0x00, 0xeb, + 0x60, 0x04, 0x00, 0x54, 0x5c, 0xfe, 0xff, 0x97, 0x00, 0x05, 0x00, 0x35, + 0xe6, 0x03, 0x15, 0x2a, 0xe5, 0x03, 0x16, 0x2a, 0xe4, 0x03, 0x17, 0x2a, + 0xe3, 0x03, 0x18, 0x2a, 0xe2, 0x03, 0x19, 0xaa, 0xe1, 0x03, 0x1a, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x2b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc6, 0xa8, 0x75, 0x06, 0x00, 0x14, 0x04, 0xfe, 0xff, 0x97, + 0x61, 0xbb, 0x4f, 0xb9, 0x21, 0x04, 0x00, 0x51, 0x61, 0xbb, 0x0f, 0xb9, + 0xe0, 0xfd, 0xff, 0x97, 0x9b, 0x0c, 0x00, 0x94, 0xa0, 0x02, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x2b, 0x40, 0xf9, 0xfd, 0x7b, 0xc6, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xc0, 0x02, 0x80, 0x52, 0xf8, 0xff, 0xff, 0x17, + 0xe0, 0x02, 0x80, 0x52, 0xf6, 0xff, 0xff, 0x17, 0x3a, 0xfe, 0xff, 0x97, + 0x60, 0x00, 0x00, 0x35, 0x60, 0x02, 0x80, 0x52, 0xf2, 0xff, 0xff, 0x17, + 0x36, 0xfe, 0xff, 0x97, 0x60, 0x02, 0x80, 0x52, 0xef, 0xff, 0xff, 0x17, + 0x33, 0xfe, 0xff, 0x97, 0xe1, 0xcf, 0x04, 0x32, 0x1f, 0x00, 0x01, 0x6b, + 0xc2, 0xfa, 0xff, 0x54, 0xf7, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfd, 0x7b, 0xbd, 0xa9, + 0xa3, 0x29, 0x89, 0x52, 0x83, 0x2a, 0xa8, 0x72, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0xa0, 0x02, 0x80, 0x52, + 0x64, 0x02, 0x40, 0xb9, 0x9f, 0x00, 0x03, 0x6b, 0x80, 0x00, 0x00, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf4, 0x03, 0x01, 0x2a, 0xc0, 0x02, 0x80, 0x52, 0x61, 0xff, 0xff, 0x34, + 0xf5, 0x13, 0x00, 0xf9, 0xf5, 0x03, 0x02, 0x2a, 0x19, 0xfe, 0xff, 0x97, + 0xe4, 0x03, 0x00, 0x2a, 0xe3, 0xcf, 0x04, 0x32, 0x60, 0x02, 0x80, 0x52, + 0x9f, 0x00, 0x03, 0x6b, 0x42, 0x01, 0x00, 0x54, 0xe2, 0x03, 0x15, 0x2a, + 0xe1, 0x03, 0x14, 0x2a, 0xe0, 0x03, 0x13, 0xaa, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0x6d, 0x06, 0x00, 0x14, + 0xa0, 0x02, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0xf5, 0x13, 0x40, 0xf9, + 0xe8, 0xff, 0xff, 0x17, 0xc0, 0x00, 0x00, 0xb4, 0x02, 0x00, 0x40, 0xb9, + 0xa1, 0x29, 0x89, 0x52, 0x81, 0x2a, 0xa8, 0x72, 0x5f, 0x00, 0x01, 0x6b, + 0x60, 0x00, 0x00, 0x54, 0xa0, 0x02, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x78, 0x06, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xb4, 0x02, 0x00, 0x40, 0xb9, + 0x81, 0x48, 0x8a, 0x52, 0x01, 0x89, 0xaa, 0x72, 0x5f, 0x00, 0x01, 0x6b, + 0x60, 0x00, 0x00, 0x54, 0xc0, 0x01, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x8c, 0x06, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x02, 0x00, 0xb4, 0xfd, 0x7b, 0xbe, 0xa9, + 0x81, 0x48, 0x8a, 0x52, 0x01, 0x89, 0xaa, 0x72, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, 0xc0, 0x01, 0x80, 0x52, + 0x62, 0x02, 0x40, 0xb9, 0x5f, 0x00, 0x01, 0x6b, 0x80, 0x00, 0x00, 0x54, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe2, 0xfd, 0xff, 0x97, 0xe1, 0x03, 0x00, 0x2a, 0x60, 0x02, 0x80, 0x52, + 0x41, 0xff, 0xff, 0x35, 0xe0, 0x03, 0x13, 0xaa, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0x83, 0x07, 0x00, 0x14, 0xc0, 0x01, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0xc0, 0x00, 0x00, 0xb4, 0x02, 0x00, 0x40, 0xb9, + 0x81, 0x48, 0x8a, 0x52, 0x01, 0x89, 0xaa, 0x72, 0x5f, 0x00, 0x01, 0x6b, + 0x60, 0x00, 0x00, 0x54, 0xc0, 0x01, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x8c, 0x0e, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xc0, 0xfd, 0xff, 0x97, 0x60, 0x00, 0x00, 0xb4, 0xc8, 0xfd, 0xff, 0x97, + 0x60, 0x00, 0x00, 0x34, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xc1, 0xa8, 0xab, 0x0e, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, 0xbc, 0xfd, 0xff, 0x97, + 0x60, 0x01, 0x00, 0x35, 0x53, 0x02, 0x00, 0xb4, 0x62, 0x02, 0x40, 0xb9, + 0x81, 0x48, 0x8a, 0x52, 0x01, 0x89, 0xaa, 0x72, 0xc0, 0x01, 0x80, 0x52, + 0x5f, 0x00, 0x01, 0x6b, 0x00, 0x01, 0x00, 0x54, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x02, 0x80, 0x52, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0x03, 0x13, 0xaa, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xf5, 0x0f, 0x00, 0x14, 0xc0, 0x01, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xb9, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xe8, 0x83, 0x40, 0xb9, 0xf9, 0x6b, 0x04, 0xa9, + 0xf9, 0x03, 0x01, 0xaa, 0x1f, 0x81, 0x05, 0x71, 0xfb, 0x73, 0x05, 0xa9, + 0x04, 0x08, 0x40, 0xfa, 0xfb, 0x03, 0x03, 0x2a, 0xe1, 0x7b, 0x40, 0xb9, + 0xe3, 0x73, 0x40, 0xb9, 0xc1, 0x00, 0x00, 0x54, 0xc0, 0x01, 0x80, 0x52, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xc7, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xfa, 0x03, 0x02, 0xaa, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x03, 0x04, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, 0xf6, 0x03, 0x06, 0x2a, + 0xf5, 0x03, 0x07, 0x2a, 0xf7, 0x63, 0x03, 0xa9, 0xf8, 0x03, 0x05, 0x2a, + 0xf7, 0x03, 0x00, 0xaa, 0xe3, 0x07, 0x0d, 0x29, 0x41, 0xfd, 0xff, 0x97, + 0x7c, 0x10, 0x00, 0xd0, 0x82, 0xbb, 0x4f, 0xb9, 0x42, 0x04, 0x00, 0x11, + 0x82, 0xbb, 0x0f, 0xb9, 0x1c, 0xfd, 0xff, 0x97, 0x60, 0x10, 0x00, 0xd0, + 0x0b, 0x70, 0x4f, 0xb9, 0x0a, 0x07, 0x00, 0x51, 0x60, 0x10, 0x00, 0xd0, + 0x13, 0xb0, 0x47, 0xf9, 0x8a, 0x02, 0x0a, 0x8b, 0xe3, 0x07, 0x4d, 0x29, + 0x0b, 0x07, 0x00, 0x34, 0xff, 0x02, 0x13, 0xeb, 0x60, 0x0b, 0x00, 0x54, + 0x04, 0x00, 0x80, 0x52, 0x68, 0x0a, 0x40, 0xf9, 0x09, 0x00, 0x80, 0x52, + 0x1f, 0x01, 0x14, 0xeb, 0xc8, 0x00, 0x00, 0x54, 0x6c, 0x0e, 0x40, 0xf9, + 0x9f, 0x01, 0x14, 0xeb, 0x69, 0x00, 0x00, 0x54, 0x29, 0x00, 0x80, 0x52, + 0x14, 0x00, 0x80, 0xd2, 0x84, 0x04, 0x00, 0x11, 0x1f, 0x01, 0x0a, 0xeb, + 0x48, 0x04, 0x00, 0x54, 0x68, 0x0e, 0x40, 0xf9, 0x1f, 0x01, 0x0a, 0xeb, + 0xe9, 0x03, 0x00, 0x54, 0x9f, 0x00, 0x0b, 0x6b, 0x73, 0x7a, 0x40, 0xf9, + 0x20, 0x06, 0x00, 0x54, 0xff, 0x02, 0x13, 0xeb, 0xc0, 0x08, 0x00, 0x54, + 0x14, 0x00, 0x80, 0xd2, 0xe3, 0x07, 0x0d, 0x29, 0x1a, 0xfd, 0xff, 0x97, + 0x82, 0xbb, 0x4f, 0xb9, 0x42, 0x04, 0x00, 0x51, 0x82, 0xbb, 0x0f, 0xb9, + 0xf6, 0xfc, 0xff, 0x97, 0xb1, 0x0b, 0x00, 0x94, 0xe3, 0x07, 0x4d, 0x29, + 0x9f, 0x02, 0x00, 0xf1, 0x44, 0x1b, 0x40, 0xfa, 0x60, 0x05, 0x00, 0x54, + 0x1f, 0x1f, 0x03, 0x71, 0x69, 0x06, 0x00, 0x54, 0xdf, 0x7e, 0x00, 0x71, + 0x28, 0x08, 0x00, 0x54, 0xdf, 0x02, 0x15, 0x6b, 0x43, 0x05, 0x00, 0x54, + 0x3f, 0x04, 0x00, 0x71, 0x00, 0x02, 0x80, 0x52, 0x29, 0x08, 0x00, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xb5, 0xff, 0xff, 0x17, 0x9f, 0x00, 0x0b, 0x6b, 0x73, 0x7a, 0x40, 0xf9, + 0xa0, 0x00, 0x00, 0x54, 0xff, 0x02, 0x13, 0xeb, 0x00, 0x05, 0x00, 0x54, + 0xc9, 0xf9, 0xff, 0x34, 0xe2, 0xff, 0xff, 0x17, 0xe3, 0x07, 0x0d, 0x29, + 0xfb, 0xfc, 0xff, 0x97, 0x82, 0xbb, 0x4f, 0xb9, 0x42, 0x04, 0x00, 0x51, + 0x82, 0xbb, 0x0f, 0xb9, 0xd7, 0xfc, 0xff, 0x97, 0x92, 0x0b, 0x00, 0x94, + 0xe3, 0x07, 0x4d, 0x29, 0xff, 0x02, 0x13, 0xeb, 0x01, 0xfc, 0xff, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0x9f, 0xff, 0xff, 0x17, 0xee, 0xfc, 0xff, 0x97, 0x81, 0xbb, 0x4f, 0xb9, + 0x21, 0x04, 0x00, 0x51, 0x81, 0xbb, 0x0f, 0xb9, 0xca, 0xfc, 0xff, 0x97, + 0x85, 0x0b, 0x00, 0x94, 0xff, 0x02, 0x13, 0xeb, 0xa0, 0xfe, 0xff, 0x54, + 0x60, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0x93, 0xff, 0xff, 0x17, 0x00, 0x03, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0x8e, 0xff, 0xff, 0x17, 0xa0, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0x89, 0xff, 0xff, 0x17, + 0xd7, 0xfc, 0xff, 0x97, 0x81, 0xbb, 0x4f, 0xb9, 0x21, 0x04, 0x00, 0x51, + 0x81, 0xbb, 0x0f, 0xb9, 0xb3, 0xfc, 0xff, 0x97, 0x6e, 0x0b, 0x00, 0x94, + 0xc0, 0x01, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0x7e, 0xff, 0xff, 0x17, 0xe0, 0x01, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0x79, 0xff, 0xff, 0x17, 0xe3, 0x07, 0x0d, 0x29, 0x04, 0xfd, 0xff, 0x97, + 0x62, 0x10, 0x00, 0xb0, 0x42, 0x80, 0x2d, 0x91, 0xe3, 0x07, 0x4d, 0x29, + 0x5f, 0x00, 0x00, 0xeb, 0x80, 0x03, 0x00, 0x54, 0xe3, 0x07, 0x0d, 0x29, + 0x07, 0xfd, 0xff, 0x97, 0xe3, 0x07, 0x4d, 0x29, 0xe0, 0x00, 0x00, 0x34, + 0xe3, 0x07, 0x0d, 0x29, 0x03, 0xfd, 0xff, 0x97, 0xe2, 0xcf, 0x04, 0x32, + 0x1f, 0x00, 0x02, 0x6b, 0xe3, 0x07, 0x4d, 0x29, 0xa3, 0x02, 0x00, 0x54, + 0xe3, 0x73, 0x00, 0xb9, 0xe7, 0x03, 0x15, 0x2a, 0xe1, 0x7b, 0x00, 0xb9, + 0xe6, 0x03, 0x16, 0x2a, 0xe5, 0x03, 0x18, 0x2a, 0xe4, 0x03, 0x14, 0xaa, + 0xe2, 0x03, 0x1a, 0xaa, 0xe0, 0x03, 0x17, 0xaa, 0xe3, 0x03, 0x1b, 0x2a, + 0xe1, 0x03, 0x19, 0xaa, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xfd, 0x7b, 0xc7, 0xa8, 0x62, 0x0f, 0x00, 0x14, 0xed, 0xfc, 0xff, 0x97, + 0x40, 0x00, 0x00, 0x34, 0xeb, 0xfc, 0xff, 0x97, 0x60, 0x02, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0x4f, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xb4, + 0x02, 0x00, 0x40, 0xb9, 0x21, 0xa8, 0x89, 0x52, 0xa1, 0x68, 0xaa, 0x72, + 0x5f, 0x00, 0x01, 0x6b, 0x60, 0x00, 0x00, 0x54, 0x80, 0x01, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0xd0, 0x0f, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0xf4, 0x03, 0x01, 0x2a, 0x80, 0x01, 0x80, 0x52, + 0x21, 0xa8, 0x89, 0x52, 0xa1, 0x68, 0xaa, 0x72, 0x62, 0x02, 0x40, 0xb9, + 0x5f, 0x00, 0x01, 0x6b, 0x80, 0x00, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x14, 0x01, 0x00, 0x34, + 0xc8, 0xfc, 0xff, 0x97, 0x60, 0x01, 0x00, 0x35, 0xbc, 0xfc, 0xff, 0x97, + 0x61, 0x10, 0x00, 0xb0, 0x21, 0x80, 0x2d, 0x91, 0x3f, 0x00, 0x00, 0xeb, + 0xc0, 0x00, 0x00, 0x54, 0xe1, 0x03, 0x14, 0x2a, 0xe0, 0x03, 0x13, 0xaa, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xe9, 0x0f, 0x00, 0x14, + 0x80, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x80, 0x01, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x03, 0x00, 0xb4, + 0xfd, 0x7b, 0xbe, 0xa9, 0x21, 0xa8, 0x89, 0x52, 0xa1, 0x68, 0xaa, 0x72, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, + 0x80, 0x01, 0x80, 0x52, 0x62, 0x02, 0x40, 0xb9, 0x5f, 0x00, 0x01, 0x6b, + 0x80, 0x00, 0x00, 0x54, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xa6, 0xfc, 0xff, 0x97, 0xa0, 0x00, 0x00, 0x34, + 0x60, 0x02, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x96, 0xfc, 0xff, 0x97, 0x61, 0x10, 0x00, 0xb0, + 0x21, 0x80, 0x2d, 0x91, 0x3f, 0x00, 0x00, 0xeb, 0x00, 0xff, 0xff, 0x54, + 0xe0, 0x03, 0x13, 0xaa, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0x10, 0x10, 0x00, 0x14, 0x80, 0x01, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x01, 0x71, 0x04, 0x08, 0x40, 0xfa, + 0x61, 0x00, 0x00, 0x54, 0x80, 0x01, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x01, 0xaa, + 0xf6, 0x03, 0x02, 0x2a, 0xf7, 0x1b, 0x00, 0xf9, 0x3f, 0xfc, 0xff, 0x97, + 0x77, 0x10, 0x00, 0xd0, 0xe1, 0xba, 0x4f, 0xb9, 0x21, 0x04, 0x00, 0x11, + 0xe1, 0xba, 0x0f, 0xb9, 0x1a, 0xfc, 0xff, 0x97, 0x60, 0x10, 0x00, 0xf0, + 0x01, 0x74, 0x40, 0xb9, 0x60, 0x10, 0x00, 0xf0, 0x14, 0x2c, 0x40, 0xf9, + 0x61, 0x01, 0x00, 0x34, 0x7f, 0x02, 0x14, 0xeb, 0x00, 0x04, 0x00, 0x54, + 0x00, 0x00, 0x80, 0x52, 0x03, 0x00, 0x00, 0x14, 0x7f, 0x02, 0x14, 0xeb, + 0x80, 0x03, 0x00, 0x54, 0x00, 0x04, 0x00, 0x11, 0x1f, 0x00, 0x01, 0x6b, + 0x94, 0x16, 0x40, 0xf9, 0x61, 0xff, 0xff, 0x54, 0x2a, 0xfc, 0xff, 0x97, + 0xe1, 0xba, 0x4f, 0xb9, 0x21, 0x04, 0x00, 0x51, 0xe1, 0xba, 0x0f, 0xb9, + 0x06, 0xfc, 0xff, 0x97, 0xc1, 0x0a, 0x00, 0x94, 0x7f, 0x02, 0x14, 0xeb, + 0xc0, 0x02, 0x00, 0x54, 0x60, 0xfc, 0xff, 0x97, 0x61, 0x10, 0x00, 0xb0, + 0x21, 0x80, 0x2d, 0x91, 0x3f, 0x00, 0x00, 0xeb, 0x80, 0x03, 0x00, 0x54, + 0x65, 0xfc, 0xff, 0x97, 0xa0, 0x02, 0x00, 0x35, 0xe2, 0x03, 0x16, 0x2a, + 0xe1, 0x03, 0x15, 0xaa, 0xe0, 0x03, 0x13, 0xaa, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, + 0x14, 0x10, 0x00, 0x14, 0x13, 0xfc, 0xff, 0x97, 0xe1, 0xba, 0x4f, 0xb9, + 0x21, 0x04, 0x00, 0x51, 0xe1, 0xba, 0x0f, 0xb9, 0xef, 0xfb, 0xff, 0x97, + 0xaa, 0x0a, 0x00, 0x94, 0x80, 0x01, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x4f, 0xfc, 0xff, 0x97, 0xe1, 0xcf, 0x04, 0x32, + 0x1f, 0x00, 0x01, 0x6b, 0x22, 0xfd, 0xff, 0x54, 0x1f, 0x20, 0x03, 0xd5, + 0x60, 0x02, 0x80, 0x52, 0xf5, 0xff, 0xff, 0x17, 0x80, 0x04, 0x00, 0xb4, + 0xfd, 0x7b, 0xbd, 0xa9, 0xa3, 0xaa, 0x88, 0x52, 0xa3, 0x2a, 0xaa, 0x72, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, + 0x20, 0x01, 0x80, 0x52, 0x64, 0x02, 0x40, 0xb9, 0x9f, 0x00, 0x03, 0x6b, + 0x80, 0x00, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf4, 0x03, 0x01, 0xaa, 0xe1, 0x02, 0x00, 0xb4, + 0xf5, 0x13, 0x00, 0xf9, 0xf5, 0x03, 0x02, 0x2a, 0x02, 0x01, 0x00, 0x34, + 0x35, 0xfc, 0xff, 0x97, 0xa0, 0x01, 0x00, 0x35, 0x29, 0xfc, 0xff, 0x97, + 0x63, 0x10, 0x00, 0xb0, 0x63, 0x80, 0x2d, 0x91, 0x7f, 0x00, 0x00, 0xeb, + 0x00, 0x01, 0x00, 0x54, 0xe2, 0x03, 0x15, 0x2a, 0xe1, 0x03, 0x14, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0x40, 0x10, 0x00, 0x14, 0x80, 0x00, 0x80, 0x52, + 0xf5, 0x13, 0x40, 0xf9, 0xe8, 0xff, 0xff, 0x17, 0x20, 0x01, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x00, 0x80, 0x52, 0xe4, 0xff, 0xff, 0x17, + 0x80, 0x04, 0x00, 0xb4, 0xfd, 0x7b, 0xbd, 0xa9, 0xa3, 0xaa, 0x88, 0x52, + 0xa3, 0x2a, 0xaa, 0x72, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0x20, 0x01, 0x80, 0x52, 0x64, 0x02, 0x40, 0xb9, + 0x9f, 0x00, 0x03, 0x6b, 0x80, 0x00, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf4, 0x03, 0x01, 0xaa, + 0xe1, 0x02, 0x00, 0xb4, 0xf5, 0x13, 0x00, 0xf9, 0xf5, 0x03, 0x02, 0x2a, + 0x02, 0x01, 0x00, 0x34, 0x0d, 0xfc, 0xff, 0x97, 0xa0, 0x01, 0x00, 0x35, + 0x01, 0xfc, 0xff, 0x97, 0x63, 0x10, 0x00, 0xb0, 0x63, 0x80, 0x2d, 0x91, + 0x7f, 0x00, 0x00, 0xeb, 0x00, 0x01, 0x00, 0x54, 0xe2, 0x03, 0x15, 0x2a, + 0xe1, 0x03, 0x14, 0xaa, 0xe0, 0x03, 0x13, 0xaa, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xcc, 0x10, 0x00, 0x14, + 0x80, 0x00, 0x80, 0x52, 0xf5, 0x13, 0x40, 0xf9, 0xe8, 0xff, 0xff, 0x17, + 0x20, 0x01, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x00, 0x80, 0x52, + 0xe4, 0xff, 0xff, 0x17, 0x80, 0x04, 0x00, 0xb4, 0xfd, 0x7b, 0xbd, 0xa9, + 0xa3, 0xaa, 0x88, 0x52, 0xa3, 0x2a, 0xaa, 0x72, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0x20, 0x01, 0x80, 0x52, + 0x64, 0x02, 0x40, 0xb9, 0x9f, 0x00, 0x03, 0x6b, 0x80, 0x00, 0x00, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf4, 0x03, 0x01, 0xaa, 0xe1, 0x02, 0x00, 0xb4, 0xf5, 0x13, 0x00, 0xf9, + 0xf5, 0x03, 0x02, 0x2a, 0x02, 0x01, 0x00, 0x34, 0xe5, 0xfb, 0xff, 0x97, + 0xa0, 0x01, 0x00, 0x35, 0xd9, 0xfb, 0xff, 0x97, 0x63, 0x10, 0x00, 0xb0, + 0x63, 0x80, 0x2d, 0x91, 0x7f, 0x00, 0x00, 0xeb, 0x00, 0x01, 0x00, 0x54, + 0xe2, 0x03, 0x15, 0x2a, 0xe1, 0x03, 0x14, 0xaa, 0xe0, 0x03, 0x13, 0xaa, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0x90, 0x11, 0x00, 0x14, 0x80, 0x00, 0x80, 0x52, 0xf5, 0x13, 0x40, 0xf9, + 0xe8, 0xff, 0xff, 0x17, 0x20, 0x01, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x00, 0x80, 0x52, 0xe4, 0xff, 0xff, 0x17, 0xbf, 0xa0, 0x01, 0x71, + 0x04, 0x08, 0x40, 0xfa, 0x61, 0x00, 0x00, 0x54, 0x20, 0x01, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, + 0xf5, 0x03, 0x03, 0xaa, 0xf6, 0x03, 0x04, 0x2a, 0xf7, 0x63, 0x03, 0xa9, + 0xf7, 0x03, 0x01, 0xaa, 0xf8, 0x03, 0x02, 0x2a, 0xf9, 0x23, 0x00, 0xf9, + 0x78, 0xfb, 0xff, 0x97, 0x79, 0x10, 0x00, 0xd0, 0x21, 0xbb, 0x4f, 0xb9, + 0x21, 0x04, 0x00, 0x11, 0x21, 0xbb, 0x0f, 0xb9, 0x53, 0xfb, 0xff, 0x97, + 0x60, 0x10, 0x00, 0xf0, 0x00, 0x50, 0x40, 0xb9, 0x61, 0x10, 0x00, 0xf0, + 0x33, 0x44, 0x40, 0xf9, 0x60, 0x01, 0x00, 0x34, 0x9f, 0x02, 0x13, 0xeb, + 0xc0, 0x05, 0x00, 0x54, 0x05, 0x00, 0x80, 0x52, 0x03, 0x00, 0x00, 0x14, + 0x9f, 0x02, 0x13, 0xeb, 0x40, 0x05, 0x00, 0x54, 0xa5, 0x04, 0x00, 0x11, + 0xbf, 0x00, 0x00, 0x6b, 0x73, 0x2a, 0x40, 0xf9, 0x61, 0xff, 0xff, 0x54, + 0x63, 0xfb, 0xff, 0x97, 0x21, 0xbb, 0x4f, 0xb9, 0x21, 0x04, 0x00, 0x51, + 0x21, 0xbb, 0x0f, 0xb9, 0x3f, 0xfb, 0xff, 0x97, 0xfa, 0x09, 0x00, 0x94, + 0x9f, 0x02, 0x13, 0xeb, 0x80, 0x04, 0x00, 0x54, 0x55, 0x05, 0x00, 0xb4, + 0x01, 0x07, 0x00, 0x51, 0xa0, 0x00, 0x80, 0x52, 0x3f, 0x3c, 0x00, 0x71, + 0x08, 0x04, 0x00, 0x54, 0x1f, 0x0b, 0x56, 0x6b, 0xc8, 0x03, 0x00, 0x54, + 0x92, 0xfb, 0xff, 0x97, 0x61, 0x10, 0x00, 0xb0, 0x21, 0x80, 0x2d, 0x91, + 0x3f, 0x00, 0x00, 0xeb, 0x20, 0x04, 0x00, 0x54, 0x97, 0xfb, 0xff, 0x97, + 0xa0, 0x00, 0x00, 0x34, 0x95, 0xfb, 0xff, 0x97, 0xe1, 0xcf, 0x04, 0x32, + 0x1f, 0x00, 0x01, 0x6b, 0xc3, 0x03, 0x00, 0x54, 0xe4, 0x03, 0x16, 0x2a, + 0xe3, 0x03, 0x15, 0xaa, 0xe2, 0x03, 0x18, 0x2a, 0xe1, 0x03, 0x17, 0xaa, + 0xe0, 0x03, 0x14, 0xaa, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xf7, 0x11, 0x00, 0x14, 0x3e, 0xfb, 0xff, 0x97, 0x21, 0xbb, 0x4f, 0xb9, + 0x21, 0x04, 0x00, 0x51, 0x21, 0xbb, 0x0f, 0xb9, 0x1a, 0xfb, 0xff, 0x97, + 0xd5, 0x09, 0x00, 0x94, 0x20, 0x01, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x00, 0x80, 0x52, + 0xf9, 0xff, 0xff, 0x17, 0x77, 0xfb, 0xff, 0x97, 0x40, 0x00, 0x00, 0x34, + 0x75, 0xfb, 0xff, 0x97, 0x60, 0x02, 0x80, 0x52, 0xf4, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xb4, + 0xfd, 0x7b, 0xbe, 0xa9, 0xa1, 0x88, 0x8a, 0x52, 0xa1, 0xaa, 0xa9, 0x72, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, + 0x80, 0x03, 0x80, 0x52, 0x62, 0x02, 0x40, 0xb9, 0x5f, 0x00, 0x01, 0x6b, + 0x80, 0x00, 0x00, 0x54, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x62, 0xfb, 0xff, 0x97, 0xa0, 0x00, 0x00, 0x34, + 0x60, 0xfb, 0xff, 0x97, 0xe1, 0xcf, 0x04, 0x32, 0x1f, 0x00, 0x01, 0x6b, + 0xe3, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x13, 0xaa, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0x31, 0x12, 0x00, 0x14, 0x80, 0x03, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x02, 0x80, 0x52, 0xf0, 0xff, 0xff, 0x17, + 0xe0, 0x02, 0x00, 0xb4, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0xf4, 0x03, 0x01, 0x2a, + 0x80, 0x03, 0x80, 0x52, 0xa1, 0x88, 0x8a, 0x52, 0xa1, 0xaa, 0xa9, 0x72, + 0x62, 0x02, 0x40, 0xb9, 0x5f, 0x00, 0x01, 0x6b, 0x80, 0x00, 0x00, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x54, 0x01, 0x00, 0x35, 0x44, 0xfb, 0xff, 0x97, 0x60, 0x02, 0x00, 0x35, + 0xe1, 0x03, 0x14, 0x2a, 0xe0, 0x03, 0x13, 0xaa, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0x3a, 0x14, 0x00, 0x14, 0x80, 0x03, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x3b, 0xfb, 0xff, 0x97, 0x60, 0x00, 0x00, 0x34, + 0x80, 0x00, 0x80, 0x52, 0xf0, 0xff, 0xff, 0x17, 0x2d, 0xfb, 0xff, 0x97, + 0x61, 0x10, 0x00, 0xb0, 0x21, 0x80, 0x2d, 0x91, 0x3f, 0x00, 0x00, 0xeb, + 0xe1, 0xfd, 0xff, 0x54, 0x80, 0x00, 0x80, 0x52, 0xe9, 0xff, 0xff, 0x17, + 0x30, 0xfb, 0xff, 0x97, 0xe1, 0xcf, 0x04, 0x32, 0x1f, 0x00, 0x01, 0x6b, + 0x62, 0xfd, 0xff, 0x54, 0x60, 0x02, 0x80, 0x52, 0xe3, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x03, 0x00, 0xb4, + 0xfd, 0x7b, 0xbe, 0xa9, 0xa1, 0x88, 0x8a, 0x52, 0xa1, 0xaa, 0xa9, 0x72, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, + 0x80, 0x03, 0x80, 0x52, 0x62, 0x02, 0x40, 0xb9, 0x5f, 0x00, 0x01, 0x6b, + 0x80, 0x00, 0x00, 0x54, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x1a, 0xfb, 0xff, 0x97, 0xa0, 0x00, 0x00, 0x34, + 0x60, 0x02, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x0a, 0xfb, 0xff, 0x97, 0x61, 0x10, 0x00, 0xb0, + 0x21, 0x80, 0x2d, 0x91, 0x3f, 0x00, 0x00, 0xeb, 0x00, 0xff, 0xff, 0x54, + 0xe0, 0x03, 0x13, 0xaa, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0x80, 0x14, 0x00, 0x14, 0x80, 0x03, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x01, 0x71, 0x04, 0x08, 0x40, 0xfa, + 0x61, 0x00, 0x00, 0x54, 0x80, 0x03, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, 0xf6, 0x03, 0x01, 0xaa, + 0xf5, 0x03, 0x02, 0x2a, 0xf7, 0x1b, 0x00, 0xf9, 0xb3, 0xfa, 0xff, 0x97, + 0x77, 0x10, 0x00, 0xd0, 0xe1, 0xba, 0x4f, 0xb9, 0x21, 0x04, 0x00, 0x11, + 0xe1, 0xba, 0x0f, 0xb9, 0x8e, 0xfa, 0xff, 0x97, 0x60, 0x10, 0x00, 0xf0, + 0x01, 0x40, 0x40, 0xb9, 0x60, 0x10, 0x00, 0xf0, 0x14, 0x24, 0x40, 0xf9, + 0x61, 0x01, 0x00, 0x34, 0x7f, 0x02, 0x14, 0xeb, 0x40, 0x04, 0x00, 0x54, + 0x00, 0x00, 0x80, 0x52, 0x03, 0x00, 0x00, 0x14, 0x7f, 0x02, 0x14, 0xeb, + 0xc0, 0x03, 0x00, 0x54, 0x00, 0x04, 0x00, 0x11, 0x1f, 0x00, 0x01, 0x6b, + 0x94, 0x1e, 0x40, 0xf9, 0x61, 0xff, 0xff, 0x54, 0x9e, 0xfa, 0xff, 0x97, + 0xe1, 0xba, 0x4f, 0xb9, 0x21, 0x04, 0x00, 0x51, 0xe1, 0xba, 0x0f, 0xb9, + 0x7a, 0xfa, 0xff, 0x97, 0x35, 0x09, 0x00, 0x94, 0x7f, 0x02, 0x14, 0xeb, + 0x00, 0x03, 0x00, 0x54, 0xbf, 0x06, 0x00, 0x71, 0x68, 0x04, 0x00, 0x54, + 0xd2, 0xfa, 0xff, 0x97, 0x61, 0x10, 0x00, 0xb0, 0x21, 0x80, 0x2d, 0x91, + 0x3f, 0x00, 0x00, 0xeb, 0xe0, 0x02, 0x00, 0x54, 0xd7, 0xfa, 0xff, 0x97, + 0xc0, 0x03, 0x00, 0x35, 0xe2, 0x03, 0x15, 0x2a, 0xe1, 0x03, 0x16, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0x8a, 0x14, 0x00, 0x14, + 0x85, 0xfa, 0xff, 0x97, 0xe1, 0xba, 0x4f, 0xb9, 0x21, 0x04, 0x00, 0x51, + 0xe1, 0xba, 0x0f, 0xb9, 0x61, 0xfa, 0xff, 0x97, 0x1c, 0x09, 0x00, 0x94, + 0x80, 0x03, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xc1, 0xfa, 0xff, 0x97, 0x60, 0x00, 0x00, 0x35, 0x60, 0x02, 0x80, 0x52, + 0xf8, 0xff, 0xff, 0x17, 0xbd, 0xfa, 0xff, 0x97, 0x60, 0x02, 0x80, 0x52, + 0xf5, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x80, 0x52, 0xf3, 0xff, 0xff, 0x17, + 0xb8, 0xfa, 0xff, 0x97, 0xe1, 0xcf, 0x04, 0x32, 0x1f, 0x00, 0x01, 0x6b, + 0x02, 0xfc, 0xff, 0x54, 0xf5, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xb4, + 0x06, 0x00, 0x40, 0xb9, 0xc5, 0x89, 0x88, 0x52, 0xc5, 0x8a, 0xa8, 0x72, + 0xc3, 0x00, 0x80, 0x52, 0xdf, 0x00, 0x05, 0x6b, 0x60, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x03, 0x2a, 0xc0, 0x03, 0x5f, 0xd6, 0x5f, 0x78, 0x1e, 0x72, + 0xa1, 0x00, 0x00, 0x54, 0x29, 0x15, 0x00, 0x14, 0xc3, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x03, 0x2a, 0xc0, 0x03, 0x5f, 0xd6, 0x03, 0x01, 0x80, 0x52, + 0xe0, 0x03, 0x03, 0x2a, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x02, 0x00, 0xb4, 0xfd, 0x7b, 0xbc, 0xa9, + 0xc5, 0x89, 0x88, 0x52, 0xc5, 0x8a, 0xa8, 0x72, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, 0xc0, 0x00, 0x80, 0x52, + 0x66, 0x02, 0x40, 0xb9, 0xdf, 0x00, 0x05, 0x6b, 0x80, 0x00, 0x00, 0x54, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x43, 0x01, 0x00, 0xb4, 0x64, 0x01, 0x00, 0x35, 0x5f, 0x0c, 0x00, 0x71, + 0x08, 0x04, 0x00, 0x54, 0xe0, 0x03, 0x13, 0xaa, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xcf, 0x15, 0x00, 0x14, 0xc0, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x00, 0x80, 0x52, 0xf2, 0xff, 0xff, 0x17, + 0xe1, 0x2f, 0x00, 0xb9, 0xe3, 0x1b, 0x00, 0xf9, 0xe2, 0x13, 0x07, 0x29, + 0x7f, 0xfa, 0xff, 0x97, 0xe1, 0x2f, 0x40, 0xb9, 0xe2, 0x13, 0x47, 0x29, + 0xe3, 0x1b, 0x40, 0xf9, 0x60, 0x00, 0x00, 0x34, 0x80, 0x00, 0x80, 0x52, + 0xe8, 0xff, 0xff, 0x17, 0xe1, 0x2f, 0x00, 0xb9, 0xe3, 0x1b, 0x00, 0xf9, + 0xe2, 0x13, 0x07, 0x29, 0x6b, 0xfa, 0xff, 0x97, 0x65, 0x10, 0x00, 0xb0, + 0xa5, 0x80, 0x2d, 0x91, 0xe1, 0x2f, 0x40, 0xb9, 0xbf, 0x00, 0x00, 0xeb, + 0xe2, 0x13, 0x47, 0x29, 0xe3, 0x1b, 0x40, 0xf9, 0x41, 0xfc, 0xff, 0x54, + 0x80, 0x00, 0x80, 0x52, 0xdb, 0xff, 0xff, 0x17, 0x00, 0x01, 0x80, 0x52, + 0xd9, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x20, 0x01, 0x71, + 0x04, 0x08, 0x40, 0xfa, 0x61, 0x00, 0x00, 0x54, 0xc0, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, + 0xf5, 0x03, 0x01, 0xaa, 0x15, 0xfa, 0xff, 0x97, 0x76, 0x10, 0x00, 0xd0, + 0xc1, 0xba, 0x4f, 0xb9, 0x21, 0x04, 0x00, 0x11, 0xc1, 0xba, 0x0f, 0xb9, + 0xf0, 0xf9, 0xff, 0x97, 0x60, 0x10, 0x00, 0xf0, 0x00, 0x78, 0x40, 0xb9, + 0x61, 0x10, 0x00, 0xf0, 0x33, 0x1c, 0x40, 0xf9, 0x60, 0x01, 0x00, 0x34, + 0x9f, 0x02, 0x13, 0xeb, 0x20, 0x05, 0x00, 0x54, 0x02, 0x00, 0x80, 0x52, + 0x03, 0x00, 0x00, 0x14, 0x9f, 0x02, 0x13, 0xeb, 0xa0, 0x04, 0x00, 0x54, + 0x42, 0x04, 0x00, 0x11, 0x5f, 0x00, 0x00, 0x6b, 0x73, 0x16, 0x40, 0xf9, + 0x61, 0xff, 0xff, 0x54, 0x00, 0xfa, 0xff, 0x97, 0xc1, 0xba, 0x4f, 0xb9, + 0x21, 0x04, 0x00, 0x51, 0xc1, 0xba, 0x0f, 0xb9, 0xdc, 0xf9, 0xff, 0x97, + 0x97, 0x08, 0x00, 0x94, 0x7f, 0x02, 0x14, 0xeb, 0xe0, 0x03, 0x00, 0x54, + 0x36, 0xfa, 0xff, 0x97, 0x61, 0x10, 0x00, 0xb0, 0x21, 0x80, 0x2d, 0x91, + 0x3f, 0x00, 0x00, 0xeb, 0xa0, 0x01, 0x00, 0x54, 0x3b, 0xfa, 0xff, 0x97, + 0xa0, 0x00, 0x00, 0x34, 0x39, 0xfa, 0xff, 0x97, 0xe1, 0xcf, 0x04, 0x32, + 0x1f, 0x00, 0x01, 0x6b, 0x23, 0x01, 0x00, 0x54, 0xe1, 0x03, 0x15, 0xaa, + 0xe0, 0x03, 0x14, 0xaa, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xd8, 0x15, 0x00, 0x14, 0x2f, 0xfa, 0xff, 0x97, + 0x20, 0x02, 0x00, 0x35, 0x60, 0x02, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0xf9, 0xff, 0x97, 0xc1, 0xba, 0x4f, 0xb9, 0x21, 0x04, 0x00, 0x51, + 0xc1, 0xba, 0x0f, 0xb9, 0xbc, 0xf9, 0xff, 0x97, 0x77, 0x08, 0x00, 0x94, + 0xc0, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x1d, 0xfa, 0xff, 0x97, + 0x60, 0x02, 0x80, 0x52, 0xef, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x03, 0x00, 0xb4, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, + 0x09, 0xfa, 0xff, 0x97, 0x61, 0x10, 0x00, 0xb0, 0x21, 0x80, 0x2d, 0x91, + 0x3f, 0x00, 0x00, 0xeb, 0x60, 0x01, 0x00, 0x54, 0x0e, 0xfa, 0xff, 0x97, + 0xa0, 0x00, 0x00, 0x34, 0x0c, 0xfa, 0xff, 0x97, 0xe1, 0xcf, 0x04, 0x32, + 0x1f, 0x00, 0x01, 0x6b, 0xe3, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x13, 0xaa, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0x0d, 0x16, 0x00, 0x14, + 0x04, 0xfa, 0xff, 0x97, 0xe0, 0x00, 0x00, 0x35, 0x60, 0x02, 0x80, 0x52, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0xfc, 0xf9, 0xff, 0x97, + 0x60, 0x02, 0x80, 0x52, 0xf9, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x40, 0xb9, 0xa7, 0x88, 0x8a, 0x52, + 0x27, 0x4b, 0xa8, 0x72, 0x1f, 0x01, 0x07, 0x6b, 0x60, 0x00, 0x00, 0x54, + 0x40, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x0c, 0x17, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9f, 0x80, 0x01, 0x71, 0x04, 0x08, 0x40, 0xfa, 0x61, 0x00, 0x00, 0x54, + 0x40, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbc, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0xaa, + 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x02, 0xaa, 0xf6, 0x03, 0x03, 0x2a, + 0xf7, 0x63, 0x03, 0xa9, 0xf7, 0x03, 0x01, 0xaa, 0x96, 0xf9, 0xff, 0x97, + 0x78, 0x10, 0x00, 0xd0, 0x01, 0xbb, 0x4f, 0xb9, 0x21, 0x04, 0x00, 0x11, + 0x01, 0xbb, 0x0f, 0xb9, 0x71, 0xf9, 0xff, 0x97, 0x60, 0x10, 0x00, 0xf0, + 0x00, 0x90, 0x40, 0xb9, 0x61, 0x10, 0x00, 0xf0, 0x33, 0x30, 0x40, 0xf9, + 0x60, 0x01, 0x00, 0x34, 0x9f, 0x02, 0x13, 0xeb, 0x20, 0x05, 0x00, 0x54, + 0x04, 0x00, 0x80, 0x52, 0x03, 0x00, 0x00, 0x14, 0x9f, 0x02, 0x13, 0xeb, + 0xa0, 0x04, 0x00, 0x54, 0x84, 0x04, 0x00, 0x11, 0x9f, 0x00, 0x00, 0x6b, + 0x73, 0x2a, 0x40, 0xf9, 0x61, 0xff, 0xff, 0x54, 0x81, 0xf9, 0xff, 0x97, + 0x01, 0xbb, 0x4f, 0xb9, 0x21, 0x04, 0x00, 0x51, 0x01, 0xbb, 0x0f, 0xb9, + 0x5d, 0xf9, 0xff, 0x97, 0x18, 0x08, 0x00, 0x94, 0x7f, 0x02, 0x14, 0xeb, + 0xe0, 0x03, 0x00, 0x54, 0x95, 0x04, 0x00, 0xb4, 0xdf, 0x8e, 0x01, 0x71, + 0xa0, 0x00, 0x80, 0x52, 0x89, 0x03, 0x00, 0x54, 0xb3, 0xf9, 0xff, 0x97, + 0x61, 0x10, 0x00, 0xb0, 0x21, 0x80, 0x2d, 0x91, 0x3f, 0x00, 0x00, 0xeb, + 0xc0, 0x03, 0x00, 0x54, 0xb8, 0xf9, 0xff, 0x97, 0xa0, 0x00, 0x00, 0x34, + 0xb6, 0xf9, 0xff, 0x97, 0xe1, 0xcf, 0x04, 0x32, 0x1f, 0x00, 0x01, 0x6b, + 0x43, 0x03, 0x00, 0x54, 0xe3, 0x03, 0x16, 0x2a, 0xe2, 0x03, 0x15, 0xaa, + 0xe1, 0x03, 0x17, 0xaa, 0xe0, 0x03, 0x14, 0xaa, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xee, 0x16, 0x00, 0x14, 0x61, 0xf9, 0xff, 0x97, 0x01, 0xbb, 0x4f, 0xb9, + 0x21, 0x04, 0x00, 0x51, 0x01, 0xbb, 0x0f, 0xb9, 0x3d, 0xf9, 0xff, 0x97, + 0xf8, 0x07, 0x00, 0x94, 0x40, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x00, 0x80, 0x52, 0xfa, 0xff, 0xff, 0x17, + 0x9b, 0xf9, 0xff, 0x97, 0x60, 0x00, 0x00, 0x35, 0x60, 0x02, 0x80, 0x52, + 0xf6, 0xff, 0xff, 0x17, 0x97, 0xf9, 0xff, 0x97, 0x60, 0x02, 0x80, 0x52, + 0xf3, 0xff, 0xff, 0x17, 0xa0, 0x03, 0x00, 0xb4, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, + 0xf4, 0x03, 0x02, 0x2a, 0xf5, 0x5b, 0x02, 0xa9, 0x40, 0x00, 0x80, 0x52, + 0x62, 0x02, 0x40, 0xb9, 0xf5, 0x03, 0x01, 0xaa, 0xa1, 0x88, 0x8a, 0x52, + 0x21, 0x4b, 0xa8, 0x72, 0x5f, 0x00, 0x01, 0x6b, 0xa0, 0x00, 0x00, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xb5, 0x01, 0x00, 0xb4, 0xd4, 0x01, 0x00, 0x34, + 0x60, 0x32, 0x40, 0xb9, 0x1f, 0x00, 0x14, 0x6b, 0x63, 0x01, 0x00, 0x54, + 0xf6, 0x03, 0x03, 0x2a, 0xc3, 0x01, 0x00, 0x34, 0x7b, 0xf9, 0xff, 0x97, + 0x80, 0x01, 0x00, 0x34, 0x80, 0x00, 0x80, 0x52, 0xf2, 0xff, 0xff, 0x17, + 0x40, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x00, 0x80, 0x52, + 0xee, 0xff, 0xff, 0x17, 0xa0, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x64, 0xf9, 0xff, 0x97, 0x61, 0x10, 0x00, 0x90, 0x21, 0x80, 0x2d, 0x91, + 0x3f, 0x00, 0x00, 0xeb, 0x61, 0x00, 0x00, 0x54, 0x60, 0x02, 0x80, 0x52, + 0xe2, 0xff, 0xff, 0x17, 0x67, 0xf9, 0xff, 0x97, 0x20, 0x01, 0x00, 0x35, + 0xe3, 0x03, 0x16, 0x2a, 0xe2, 0x03, 0x14, 0x2a, 0xe1, 0x03, 0x15, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0x12, 0x17, 0x00, 0x14, 0x5d, 0xf9, 0xff, 0x97, + 0xe1, 0xcf, 0x04, 0x32, 0x1f, 0x00, 0x01, 0x6b, 0xa2, 0xfe, 0xff, 0x54, + 0xf0, 0xff, 0xff, 0x17, 0xa1, 0x29, 0x89, 0x52, 0x81, 0x2a, 0xa8, 0x72, + 0x1f, 0x00, 0x01, 0x6b, 0x40, 0x00, 0x00, 0x54, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xb7, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xfb, 0x73, 0x05, 0xa9, + 0x7b, 0x10, 0x00, 0x90, 0x60, 0x63, 0x2d, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x74, 0x10, 0x00, 0x90, 0x94, 0x82, 0x2d, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0x75, 0x10, 0x00, 0x90, 0xb5, 0x02, 0x33, 0x91, 0xf6, 0x03, 0x02, 0x91, + 0xf7, 0x63, 0x03, 0xa9, 0x78, 0x10, 0x00, 0x90, 0x18, 0xc3, 0x28, 0x91, + 0xf7, 0x23, 0x02, 0x91, 0xf9, 0x6b, 0x04, 0xa9, 0x79, 0x10, 0x00, 0x90, + 0x39, 0xe3, 0x2c, 0x91, 0xe0, 0x37, 0x00, 0xf9, 0x60, 0x10, 0x00, 0x90, + 0x00, 0x20, 0x33, 0x91, 0xe0, 0x3f, 0x00, 0xf9, 0x7a, 0x10, 0x00, 0xb0, + 0x40, 0xe3, 0x3e, 0x91, 0xe0, 0x3b, 0x00, 0xf9, 0x1f, 0x20, 0x03, 0xd5, + 0xf0, 0xf8, 0xff, 0x97, 0x02, 0x03, 0x40, 0xf9, 0x41, 0x00, 0x40, 0xf9, + 0xe1, 0x43, 0x00, 0xf9, 0x81, 0x0c, 0x00, 0xb4, 0x33, 0x30, 0x40, 0xb9, + 0x36, 0x14, 0x00, 0xf9, 0xe1, 0x37, 0x40, 0xf9, 0x21, 0x00, 0x40, 0xf9, + 0x5f, 0x84, 0x00, 0xf8, 0x02, 0x03, 0x00, 0xf9, 0x5f, 0x00, 0x01, 0xeb, + 0x60, 0x0c, 0x00, 0x54, 0x3f, 0x03, 0x00, 0xb9, 0xc2, 0xf8, 0xff, 0x97, + 0x80, 0x12, 0x41, 0xb9, 0x00, 0x0c, 0x00, 0x12, 0x1f, 0x00, 0x13, 0x6b, + 0xe0, 0x02, 0x00, 0x54, 0x13, 0x00, 0x00, 0x14, 0x42, 0x80, 0x00, 0x51, + 0x82, 0x03, 0x00, 0xb9, 0x9c, 0x0f, 0x00, 0xf9, 0x97, 0x17, 0x00, 0xf9, + 0xbc, 0x02, 0x00, 0xf9, 0xfc, 0x47, 0x00, 0xf9, 0xb6, 0xf8, 0xff, 0x97, + 0xd5, 0xf8, 0xff, 0x97, 0xbf, 0x02, 0x00, 0xf9, 0xe3, 0x47, 0x40, 0xf9, + 0xfb, 0x03, 0x00, 0x2a, 0x7f, 0x00, 0x1c, 0xeb, 0xa0, 0x05, 0x00, 0x54, + 0xe0, 0x03, 0x1b, 0x2a, 0xae, 0xf8, 0xff, 0x97, 0x80, 0x12, 0x41, 0xb9, + 0x1f, 0x00, 0x13, 0x6b, 0x80, 0x00, 0x00, 0x54, 0xe1, 0x03, 0x13, 0x2a, + 0xe0, 0x03, 0x14, 0xaa, 0x20, 0x09, 0x00, 0x94, 0xc7, 0xf8, 0xff, 0x97, + 0xfc, 0x43, 0x40, 0xf9, 0x7c, 0x05, 0x00, 0xb4, 0x82, 0x0f, 0x40, 0xf9, + 0xff, 0x47, 0x00, 0xf9, 0x9f, 0x03, 0x02, 0xeb, 0x40, 0x04, 0x00, 0x54, + 0x83, 0x13, 0x40, 0xf9, 0x43, 0x10, 0x00, 0xf9, 0x53, 0x30, 0x40, 0xb9, + 0xe2, 0x43, 0x00, 0xf9, 0x73, 0x0e, 0x00, 0x12, 0x62, 0x0c, 0x00, 0xf9, + 0x56, 0x14, 0x00, 0xf9, 0x82, 0x03, 0x40, 0xb9, 0x5f, 0x80, 0x00, 0x71, + 0x68, 0xfb, 0xff, 0x54, 0x83, 0x07, 0x40, 0xb9, 0x83, 0x03, 0x00, 0xb9, + 0x9a, 0x13, 0x40, 0xb9, 0x9b, 0x07, 0x40, 0xf9, 0xc3, 0x02, 0x00, 0x34, + 0x9c, 0x0f, 0x00, 0xf9, 0x97, 0x17, 0x00, 0xf9, 0xfc, 0x47, 0x00, 0xf9, + 0xbc, 0x02, 0x00, 0xf9, 0x8d, 0xf8, 0xff, 0x97, 0xfb, 0xfa, 0xff, 0xb4, + 0xe0, 0x03, 0x1a, 0x2a, 0x60, 0x03, 0x3f, 0xd6, 0xa9, 0xf8, 0xff, 0x97, + 0xbf, 0x02, 0x00, 0xf9, 0xe3, 0x47, 0x40, 0xf9, 0xfb, 0x03, 0x00, 0x2a, + 0x7f, 0x00, 0x1c, 0xeb, 0xa1, 0xfa, 0xff, 0x54, 0x9f, 0x17, 0x00, 0xf9, + 0xe0, 0x03, 0x1c, 0xaa, 0x41, 0x00, 0x00, 0x94, 0xd1, 0xff, 0xff, 0x17, + 0x93, 0x12, 0x41, 0xb9, 0xff, 0x43, 0x00, 0xf9, 0xe4, 0xff, 0xff, 0x17, + 0x9f, 0x17, 0x00, 0xf9, 0xed, 0xff, 0xff, 0x17, 0x21, 0x03, 0x40, 0xb9, + 0x81, 0x03, 0x00, 0x35, 0xe2, 0x3b, 0x40, 0xf9, 0x63, 0x00, 0x80, 0x52, + 0x83, 0x4e, 0x00, 0xb9, 0x41, 0x00, 0x40, 0xb9, 0x21, 0x04, 0x00, 0x11, + 0x41, 0x00, 0x00, 0xb9, 0x21, 0x00, 0x80, 0x52, 0x81, 0x56, 0x00, 0xb9, + 0x70, 0xf8, 0xff, 0x97, 0xe0, 0x03, 0x14, 0xaa, 0xd2, 0x02, 0x00, 0x94, + 0x8d, 0xf8, 0xff, 0x97, 0x02, 0x03, 0x40, 0xf9, 0x41, 0x00, 0x40, 0xf9, + 0xe1, 0x43, 0x00, 0xf9, 0xc1, 0xf3, 0xff, 0xb5, 0xe1, 0x37, 0x40, 0xf9, + 0x93, 0x12, 0x41, 0xb9, 0x21, 0x00, 0x40, 0xf9, 0x5f, 0x84, 0x00, 0xf8, + 0x02, 0x03, 0x00, 0xf9, 0x5f, 0x00, 0x01, 0xeb, 0xe1, 0xf3, 0xff, 0x54, + 0xe1, 0x3f, 0x40, 0xf9, 0x21, 0x00, 0x40, 0xf9, 0x01, 0x03, 0x00, 0xf9, + 0x9b, 0xff, 0xff, 0x17, 0x5d, 0xf8, 0xff, 0x97, 0x8c, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x14, 0x40, 0xf9, 0x61, 0x01, 0x00, 0xb4, 0x02, 0x0c, 0x40, 0xf9, + 0x1f, 0x00, 0x02, 0xeb, 0x20, 0x01, 0x00, 0x54, 0x03, 0x10, 0x40, 0xf9, + 0x43, 0x10, 0x00, 0xf9, 0x62, 0x0c, 0x00, 0xf9, 0x23, 0x00, 0x40, 0xf9, + 0x7f, 0x00, 0x00, 0xeb, 0x20, 0x01, 0x00, 0x54, 0x1f, 0x14, 0x00, 0xf9, + 0xc0, 0x03, 0x5f, 0xd6, 0x22, 0x00, 0x40, 0xf9, 0x5f, 0x00, 0x00, 0xeb, + 0x81, 0xff, 0xff, 0x54, 0x3f, 0x00, 0x00, 0xf9, 0x1f, 0x14, 0x00, 0xf9, + 0xfa, 0xff, 0xff, 0x17, 0x41, 0x14, 0x00, 0xf9, 0x22, 0x00, 0x00, 0xf9, + 0x1f, 0x14, 0x00, 0xf9, 0xf6, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x40, 0xb9, 0x41, 0x04, 0x00, 0x51, 0x3f, 0x0c, 0x00, 0x31, + 0x49, 0x00, 0x00, 0x54, 0xc0, 0x03, 0x5f, 0xd6, 0x03, 0x14, 0x40, 0xf9, + 0xc3, 0xff, 0xff, 0xb5, 0x63, 0x10, 0x00, 0x90, 0x63, 0x18, 0x45, 0xf9, + 0x5f, 0x84, 0x00, 0x71, 0x21, 0x7c, 0x7d, 0xd3, 0x62, 0x10, 0x00, 0x90, + 0x42, 0xac, 0x45, 0xf9, 0x04, 0x1f, 0x80, 0xd2, 0x21, 0x30, 0x84, 0x9a, + 0x61, 0x00, 0x01, 0x8b, 0x5f, 0x00, 0x01, 0xeb, 0x29, 0x01, 0x00, 0x54, + 0x22, 0x00, 0x40, 0xf9, 0xa2, 0x01, 0x00, 0xb4, 0x43, 0x10, 0x40, 0xf9, + 0x60, 0x0c, 0x00, 0xf9, 0x40, 0x10, 0x00, 0xf9, 0x02, 0x8c, 0x01, 0xa9, + 0x01, 0x14, 0x00, 0xf9, 0xc0, 0x03, 0x5f, 0xd6, 0x63, 0x10, 0x00, 0x90, + 0x63, 0x64, 0x46, 0xf9, 0x21, 0x00, 0x02, 0xcb, 0x21, 0x7c, 0x7d, 0x92, + 0x61, 0x00, 0x01, 0x8b, 0xf3, 0xff, 0xff, 0x17, 0x00, 0x80, 0x01, 0xa9, + 0x20, 0x00, 0x00, 0xf9, 0x01, 0x14, 0x00, 0xf9, 0xf6, 0xff, 0xff, 0x17, + 0xff, 0x83, 0x01, 0xd1, 0x64, 0x10, 0x00, 0x90, 0x84, 0x00, 0x2d, 0x91, + 0x63, 0x10, 0x00, 0x90, 0x63, 0xe0, 0x28, 0x91, 0x66, 0x10, 0x00, 0x90, + 0xfd, 0x7b, 0x01, 0xa9, 0xfd, 0x43, 0x00, 0x91, 0x65, 0x10, 0x00, 0x90, + 0x60, 0x10, 0x00, 0xb0, 0xf3, 0x53, 0x02, 0xa9, 0x62, 0x10, 0x00, 0xb0, + 0x61, 0x10, 0x00, 0x90, 0xf5, 0x5b, 0x03, 0xa9, 0x76, 0x10, 0x00, 0xb0, + 0x15, 0x00, 0x00, 0x90, 0xb5, 0xc2, 0x03, 0x91, 0xf7, 0x63, 0x04, 0xa9, + 0xd4, 0x01, 0x00, 0xb0, 0x94, 0xc2, 0x19, 0x91, 0xf9, 0x2b, 0x00, 0xf9, + 0x9f, 0x7c, 0x00, 0xa9, 0x73, 0x10, 0x00, 0x90, 0x73, 0x82, 0x2d, 0x91, + 0x1f, 0xf0, 0x0c, 0xb9, 0xe0, 0x03, 0x03, 0xaa, 0xdf, 0x3c, 0x0b, 0xb9, + 0xb9, 0x29, 0x89, 0x52, 0x99, 0x2a, 0xa8, 0x72, 0x5f, 0xec, 0x0c, 0xb9, + 0x3f, 0x38, 0x0b, 0xb9, 0x02, 0x20, 0x80, 0xd2, 0x01, 0x00, 0x80, 0x52, + 0xbf, 0x60, 0x06, 0xf9, 0xde, 0xd9, 0x00, 0x94, 0xe3, 0x03, 0x00, 0xaa, + 0x61, 0x10, 0x00, 0x90, 0x67, 0x10, 0x00, 0x90, 0x66, 0x10, 0x00, 0x90, + 0x62, 0x10, 0x00, 0x90, 0x69, 0x10, 0x00, 0x90, 0x60, 0x10, 0x00, 0x90, + 0x00, 0x80, 0x33, 0x91, 0x08, 0x00, 0x82, 0x52, 0x23, 0x18, 0x05, 0xf9, + 0xe4, 0x03, 0x00, 0xaa, 0x61, 0x10, 0x00, 0x90, 0x21, 0xe0, 0x2c, 0x91, + 0xd8, 0x60, 0x33, 0x91, 0xe1, 0xac, 0x05, 0xf9, 0x57, 0x40, 0x2d, 0x91, + 0xe5, 0x03, 0x08, 0x2a, 0x23, 0x65, 0x06, 0xf9, 0x07, 0x00, 0x80, 0x52, + 0xc0, 0x72, 0x06, 0xf9, 0xc8, 0xd8, 0x0c, 0xb9, 0x5f, 0x50, 0x0b, 0xb9, + 0x04, 0x00, 0x00, 0x14, 0xc4, 0x72, 0x46, 0xf9, 0xe7, 0x02, 0x40, 0xb9, + 0x05, 0x03, 0x40, 0xb9, 0xff, 0x03, 0x00, 0xb9, 0xe6, 0x03, 0x07, 0x2a, + 0xff, 0x0b, 0x00, 0xb9, 0xe3, 0x03, 0x19, 0x2a, 0xe2, 0x03, 0x15, 0xaa, + 0xe1, 0x03, 0x14, 0xaa, 0xe0, 0x03, 0x13, 0xaa, 0xb4, 0x0a, 0x00, 0x94, + 0xa0, 0xfe, 0xff, 0x35, 0x61, 0x10, 0x00, 0x90, 0x60, 0x10, 0x00, 0xb0, + 0xfd, 0x7b, 0x41, 0xa9, 0x3f, 0x68, 0x06, 0xf9, 0x1f, 0xe8, 0x0c, 0xb9, + 0xf3, 0x53, 0x42, 0xa9, 0xf5, 0x5b, 0x43, 0xa9, 0xf7, 0x63, 0x44, 0xa9, + 0xf9, 0x2b, 0x40, 0xf9, 0xff, 0x83, 0x01, 0x91, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xe6, 0xf7, 0xff, 0x97, + 0x62, 0x10, 0x00, 0xb0, 0x41, 0xb8, 0x4f, 0xb9, 0x21, 0x04, 0x00, 0x11, + 0x41, 0xb8, 0x0f, 0xb9, 0xc1, 0xf7, 0xff, 0x97, 0xfd, 0x7b, 0xc1, 0xa8, + 0x60, 0x10, 0x00, 0x90, 0x00, 0x80, 0x2d, 0x91, 0x81, 0x04, 0x00, 0x14, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0xf3, 0x03, 0x00, 0xaa, 0xd8, 0xf7, 0xff, 0x97, 0x61, 0x42, 0x00, 0x91, + 0x22, 0x14, 0x40, 0xf9, 0x82, 0x03, 0x00, 0xb4, 0x63, 0x10, 0x00, 0x90, + 0x63, 0x64, 0x46, 0xf9, 0x7f, 0x00, 0x02, 0xeb, 0xa8, 0x03, 0x00, 0x54, + 0x64, 0x10, 0x00, 0x90, 0x84, 0xac, 0x45, 0xf9, 0x9f, 0x00, 0x02, 0xeb, + 0x29, 0x03, 0x00, 0x54, 0x65, 0x10, 0x00, 0x90, 0xa5, 0x18, 0x45, 0xf9, + 0xbf, 0x00, 0x02, 0xeb, 0x28, 0x06, 0x00, 0x54, 0x43, 0x00, 0x05, 0xcb, + 0x63, 0xfc, 0x43, 0x93, 0x63, 0x04, 0x00, 0x11, 0x65, 0x12, 0x40, 0xb9, + 0xa4, 0x80, 0x00, 0x71, 0x84, 0x00, 0x03, 0x0b, 0x83, 0x80, 0x83, 0x1a, + 0x63, 0x12, 0x00, 0xb9, 0x23, 0x0c, 0x40, 0xf9, 0x3f, 0x00, 0x03, 0xeb, + 0xc1, 0x02, 0x00, 0x54, 0x43, 0x00, 0x40, 0xf9, 0x7f, 0x00, 0x01, 0xeb, + 0x00, 0x04, 0x00, 0x54, 0x3f, 0x14, 0x00, 0xf9, 0x99, 0xf7, 0xff, 0x97, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x63, 0x10, 0x00, 0x90, 0x63, 0x60, 0x46, 0xf9, + 0x7f, 0x00, 0x01, 0xeb, 0x80, 0x00, 0x00, 0x54, 0x63, 0x12, 0x40, 0xb9, + 0x7f, 0x80, 0x00, 0x71, 0x08, 0x02, 0x00, 0x54, 0x23, 0x04, 0x40, 0xb9, + 0x63, 0x12, 0x00, 0xb9, 0x23, 0x0c, 0x40, 0xf9, 0x3f, 0x00, 0x03, 0xeb, + 0x80, 0xfd, 0xff, 0x54, 0x24, 0x10, 0x40, 0xf9, 0x64, 0x10, 0x00, 0xf9, + 0x83, 0x0c, 0x00, 0xf9, 0x44, 0x00, 0x40, 0xf9, 0x9f, 0x00, 0x01, 0xeb, + 0x21, 0xfd, 0xff, 0x54, 0x62, 0x14, 0x00, 0xf9, 0x43, 0x00, 0x00, 0xf9, + 0x3f, 0x14, 0x00, 0xf9, 0xe6, 0xff, 0xff, 0x17, 0x63, 0x80, 0x00, 0x51, + 0x63, 0x12, 0x00, 0xb9, 0xf1, 0xff, 0xff, 0x17, 0x5f, 0x00, 0x00, 0xf9, + 0x3f, 0x14, 0x00, 0xf9, 0xe0, 0xff, 0xff, 0x17, 0x84, 0x00, 0x05, 0xcb, + 0x43, 0x00, 0x03, 0xcb, 0x84, 0xfc, 0x43, 0x93, 0x63, 0xfc, 0x43, 0x93, + 0x84, 0x04, 0x00, 0x11, 0x83, 0x00, 0x03, 0x0b, 0xcd, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0xf5, 0x13, 0x00, 0xf9, + 0xf5, 0x03, 0x06, 0x2a, 0x1f, 0x7c, 0x00, 0xa9, 0x1f, 0x7c, 0x02, 0xa9, + 0x01, 0x04, 0x00, 0xf9, 0x04, 0x14, 0x02, 0x29, 0x02, 0x0c, 0x00, 0xf9, + 0x03, 0x20, 0x00, 0xb9, 0x1f, 0x7c, 0x03, 0xa9, 0x1f, 0x7c, 0x04, 0xa9, + 0x1f, 0x7c, 0x05, 0xa9, 0x81, 0xf7, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0x62, 0x10, 0x00, 0xb0, 0x41, 0xe8, 0x4c, 0xb9, 0xa3, 0x29, 0x89, 0x52, + 0x83, 0x2a, 0xa8, 0x72, 0x63, 0x02, 0x00, 0xb9, 0x60, 0x10, 0x00, 0x90, + 0xc1, 0x01, 0x00, 0x35, 0x21, 0x04, 0x00, 0x11, 0x13, 0x68, 0x06, 0xf9, + 0x41, 0xe8, 0x0c, 0xb9, 0xbf, 0x06, 0x00, 0x71, 0x73, 0x4e, 0x05, 0xa9, + 0x20, 0x02, 0x00, 0x54, 0xe0, 0x03, 0x14, 0x2a, 0x51, 0xf7, 0xff, 0x97, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x68, 0x46, 0xf9, + 0x21, 0x04, 0x00, 0x11, 0x41, 0xe8, 0x0c, 0xb9, 0xbf, 0x06, 0x00, 0x71, + 0x03, 0x2c, 0x40, 0xf9, 0x13, 0x2c, 0x00, 0xf9, 0x73, 0x28, 0x00, 0xf9, + 0x60, 0x0e, 0x05, 0xa9, 0x21, 0xfe, 0xff, 0x54, 0x60, 0x42, 0x00, 0x91, + 0x01, 0xff, 0xff, 0x97, 0xe0, 0x03, 0x14, 0x2a, 0x3f, 0xf7, 0xff, 0x97, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0xf4, 0x03, 0x02, 0x2a, 0xf5, 0x13, 0x00, 0xf9, + 0xf5, 0x03, 0x01, 0x2a, 0x51, 0xf7, 0xff, 0x97, 0x61, 0x1e, 0x40, 0xf9, + 0xe1, 0x00, 0x00, 0xb4, 0x2e, 0xf7, 0xff, 0x97, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x75, 0x52, 0x02, 0x29, 0x27, 0xf7, 0xff, 0x97, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0xf5, 0x13, 0x00, 0xf9, 0x3b, 0xf7, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0xf5, 0x02, 0x80, 0x52, 0x60, 0x1e, 0x40, 0xf9, + 0x00, 0x01, 0x00, 0xb4, 0xe0, 0x03, 0x14, 0x2a, 0x15, 0xf7, 0xff, 0x97, + 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x12, 0x40, 0xb9, + 0xf5, 0x02, 0x80, 0x52, 0xe0, 0xfe, 0xff, 0x34, 0x60, 0x42, 0x00, 0x91, + 0xcb, 0xfe, 0xff, 0x97, 0xe0, 0x03, 0x14, 0x2a, 0x15, 0x00, 0x80, 0x52, + 0x08, 0xf7, 0xff, 0x97, 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, + 0x1c, 0xf7, 0xff, 0x97, 0x61, 0x4e, 0x40, 0xb9, 0x3f, 0x0c, 0x00, 0x71, + 0x29, 0x04, 0x00, 0x54, 0x3f, 0x10, 0x00, 0x71, 0x60, 0x05, 0x00, 0x54, + 0xf5, 0x5b, 0x02, 0xa9, 0x75, 0x5e, 0x40, 0xf9, 0x35, 0x04, 0x00, 0xb4, + 0x74, 0x10, 0x00, 0xb0, 0x82, 0xba, 0x4f, 0xb9, 0x63, 0x00, 0x80, 0x52, + 0x41, 0x03, 0x80, 0x52, 0x42, 0x04, 0x00, 0x11, 0x63, 0x4e, 0x00, 0xb9, + 0x61, 0xee, 0x00, 0xb9, 0x76, 0x5a, 0x41, 0xb9, 0x82, 0xba, 0x0f, 0xb9, + 0xea, 0xf6, 0xff, 0x97, 0xe1, 0x03, 0x16, 0x2a, 0xe0, 0x03, 0x13, 0xaa, + 0xa0, 0x02, 0x3f, 0xd6, 0xf5, 0x5b, 0x42, 0xa9, 0x60, 0xee, 0x40, 0xb9, + 0x1f, 0x68, 0x00, 0x71, 0xe1, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x13, 0xaa, + 0xa5, 0x03, 0x00, 0x94, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xfc, 0xf6, 0xff, 0x97, + 0x81, 0xba, 0x4f, 0xb9, 0x21, 0x04, 0x00, 0x51, 0x81, 0xba, 0x0f, 0xb9, + 0xd8, 0xf6, 0xff, 0x97, 0x60, 0x03, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x74, 0x10, 0x00, 0xb0, + 0x81, 0xba, 0x4f, 0xb9, 0x21, 0x04, 0x00, 0x11, 0x81, 0xba, 0x0f, 0xb9, + 0xcf, 0xf6, 0xff, 0x97, 0xf5, 0x5b, 0x42, 0xa9, 0xe8, 0xff, 0xff, 0x17, + 0x74, 0x10, 0x00, 0xb0, 0x81, 0xba, 0x4f, 0xb9, 0x63, 0x00, 0x80, 0x52, + 0x42, 0x03, 0x80, 0x52, 0x21, 0x04, 0x00, 0x11, 0x63, 0x4e, 0x00, 0xb9, + 0x7f, 0x5e, 0x00, 0xf9, 0x62, 0xee, 0x00, 0xb9, 0x81, 0xba, 0x0f, 0xb9, + 0xc3, 0xf6, 0xff, 0x97, 0xdd, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0x60, 0x10, 0x00, 0x90, + 0x00, 0x60, 0x46, 0xf9, 0xf3, 0x53, 0x01, 0xa9, 0x13, 0x1c, 0x40, 0xf9, + 0xda, 0xf6, 0xff, 0x97, 0x61, 0x4e, 0x40, 0xb9, 0x3f, 0x10, 0x00, 0x71, + 0xa0, 0x01, 0x00, 0x54, 0x74, 0x5e, 0x40, 0xf9, 0xf5, 0x13, 0x00, 0xf9, + 0x75, 0x5a, 0x41, 0xb9, 0xb3, 0xf6, 0xff, 0x97, 0x34, 0x02, 0x00, 0xb4, + 0xe1, 0x03, 0x15, 0x2a, 0xe0, 0x03, 0x13, 0xaa, 0xf0, 0x03, 0x14, 0xaa, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0x00, 0x02, 0x1f, 0xd6, 0x62, 0x10, 0x00, 0xb0, 0x41, 0xb8, 0x4f, 0xb9, + 0x21, 0x04, 0x00, 0x11, 0x41, 0xb8, 0x0f, 0xb9, 0xa6, 0xf6, 0xff, 0x97, + 0xe0, 0x03, 0x13, 0xaa, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0x66, 0x03, 0x00, 0x14, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xb9, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x60, 0x10, 0x00, 0x90, 0x14, 0x00, 0x2d, 0x91, 0x00, 0x40, 0x4b, 0xb9, + 0x83, 0x86, 0x40, 0x29, 0x82, 0x0e, 0x40, 0xb9, 0x00, 0x00, 0x03, 0x2a, + 0x21, 0x00, 0x02, 0x2a, 0x00, 0x00, 0x01, 0x2a, 0x80, 0x00, 0x00, 0x35, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf5, 0x5b, 0x02, 0xa9, 0x13, 0x00, 0x80, 0xd2, 0xf7, 0x63, 0x03, 0xa9, + 0x78, 0x10, 0x00, 0xb0, 0x18, 0x03, 0x3f, 0x91, 0xf9, 0x6b, 0x04, 0xa9, + 0x19, 0x00, 0x80, 0x52, 0xfb, 0x73, 0x05, 0xa9, 0xfd, 0xf6, 0xff, 0x97, + 0x61, 0x10, 0x00, 0xb0, 0x3a, 0xe0, 0x33, 0x91, 0xfb, 0x03, 0x00, 0x2a, + 0x9c, 0x48, 0x8a, 0x52, 0x1c, 0x89, 0xaa, 0x72, 0x81, 0x02, 0x40, 0xb9, + 0xf7, 0x03, 0x13, 0x2a, 0xf6, 0x03, 0x13, 0x2a, 0x81, 0x01, 0x00, 0x34, + 0x21, 0x04, 0x00, 0x51, 0x81, 0x02, 0x00, 0xb9, 0x21, 0x01, 0x00, 0x35, + 0x15, 0x7b, 0x73, 0xf8, 0x61, 0xf2, 0x7d, 0xd3, 0xd5, 0x00, 0x00, 0xb4, + 0xa0, 0x4e, 0x40, 0xb9, 0x80, 0x00, 0x00, 0x35, 0xa0, 0x26, 0x40, 0xb9, + 0xc0, 0x01, 0x00, 0x35, 0x1f, 0x20, 0x03, 0xd5, 0x73, 0x06, 0x00, 0x91, + 0x94, 0x12, 0x00, 0x91, 0x7f, 0x12, 0x00, 0xf1, 0xc1, 0xfd, 0xff, 0x54, + 0x39, 0x08, 0x00, 0x35, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xa0, 0x2a, 0x40, 0xb9, + 0xa0, 0x26, 0x00, 0xb9, 0x80, 0x02, 0x00, 0xb9, 0xe1, 0x37, 0x00, 0xf9, + 0x80, 0xf6, 0xff, 0x97, 0xa2, 0x02, 0x40, 0xb9, 0xe1, 0x37, 0x40, 0xf9, + 0x5f, 0x00, 0x1c, 0x6b, 0x20, 0x07, 0x00, 0x54, 0xe1, 0x37, 0x00, 0xf9, + 0x5a, 0xf6, 0xff, 0x97, 0xa2, 0x4a, 0x40, 0xb9, 0xa0, 0x5a, 0x40, 0xb9, + 0xe1, 0x37, 0x40, 0xf9, 0x1f, 0x00, 0x02, 0x6b, 0xa1, 0xfc, 0xff, 0x54, + 0xe0, 0x03, 0x00, 0x2a, 0x43, 0x7b, 0x60, 0xf8, 0x64, 0x1c, 0x40, 0xf9, + 0xbf, 0x02, 0x04, 0xeb, 0x00, 0xfc, 0xff, 0x54, 0xbf, 0x02, 0x03, 0xeb, + 0xa2, 0x1a, 0x40, 0xf9, 0x40, 0x09, 0x00, 0x54, 0xa0, 0x1e, 0x40, 0xf9, + 0x40, 0x1c, 0x00, 0xf9, 0x02, 0x18, 0x00, 0xf9, 0x95, 0x18, 0x00, 0xf9, + 0x75, 0x1c, 0x00, 0xf9, 0xa3, 0x12, 0x03, 0xa9, 0x60, 0x10, 0x00, 0xd0, + 0x00, 0x00, 0x00, 0x91, 0x23, 0x03, 0x00, 0x52, 0x39, 0x00, 0x80, 0x52, + 0x04, 0x68, 0x61, 0xf8, 0x9f, 0x00, 0x15, 0xeb, 0x63, 0x00, 0x9f, 0x1a, + 0xe3, 0xf9, 0xff, 0x34, 0x08, 0x00, 0x00, 0x14, 0x43, 0x00, 0x41, 0xb9, + 0x03, 0x78, 0x63, 0xf8, 0x7f, 0x00, 0x02, 0xeb, 0xe1, 0x07, 0x00, 0x54, + 0x42, 0x18, 0x40, 0xf9, 0xbf, 0x02, 0x02, 0xeb, 0x40, 0x07, 0x00, 0x54, + 0x44, 0x48, 0x40, 0xb9, 0x45, 0x58, 0x40, 0xb9, 0x43, 0x10, 0x41, 0xb9, + 0xbf, 0x00, 0x04, 0x6b, 0xe4, 0x27, 0x9f, 0x1a, 0x63, 0x24, 0xd6, 0x1a, + 0x63, 0x00, 0x00, 0x12, 0x83, 0x00, 0x03, 0x2a, 0x23, 0xfe, 0xff, 0x34, + 0x39, 0x00, 0x80, 0x52, 0xbc, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x1b, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xc7, 0xa8, + 0x90, 0x05, 0x00, 0x14, 0xa2, 0x06, 0x40, 0xf9, 0xa3, 0xa2, 0x40, 0xf9, + 0x5f, 0x00, 0x03, 0xeb, 0x42, 0x00, 0x00, 0x54, 0xa2, 0xa2, 0x00, 0xf9, + 0xa3, 0x0a, 0x40, 0xf9, 0xe4, 0xdb, 0x03, 0x32, 0x62, 0x00, 0x40, 0xb9, + 0x5f, 0x00, 0x04, 0x6b, 0xa1, 0x00, 0x00, 0x54, 0xa4, 0x0e, 0x40, 0xf9, + 0x84, 0x10, 0x40, 0xb8, 0x9f, 0x00, 0x02, 0x6b, 0xa0, 0x02, 0x00, 0x54, + 0xe1, 0x37, 0x00, 0xf9, 0x14, 0xf6, 0xff, 0x97, 0xe0, 0x03, 0x15, 0xaa, + 0x2a, 0x05, 0x00, 0x94, 0x31, 0xf6, 0xff, 0x97, 0xe1, 0x37, 0x40, 0xf9, + 0xa2, 0xa2, 0x40, 0xf9, 0x43, 0xc0, 0x5f, 0xb8, 0xe2, 0xdb, 0x03, 0x32, + 0x7f, 0x00, 0x02, 0x6b, 0x00, 0xf6, 0xff, 0x54, 0xe1, 0x37, 0x00, 0xf9, + 0x09, 0xf6, 0xff, 0x97, 0xe0, 0x03, 0x15, 0xaa, 0x2f, 0x05, 0x00, 0x94, + 0x26, 0xf6, 0xff, 0x97, 0xe1, 0x37, 0x40, 0xf9, 0xa9, 0xff, 0xff, 0x17, + 0x42, 0x7b, 0x20, 0xf8, 0xbc, 0xff, 0xff, 0x17, 0xa2, 0xa2, 0x40, 0xf9, + 0x7f, 0x00, 0x02, 0xeb, 0x29, 0xfe, 0xff, 0x54, 0xe9, 0xff, 0xff, 0x17, + 0x19, 0x00, 0x80, 0x52, 0x8c, 0xff, 0xff, 0x17, 0x02, 0x68, 0x21, 0xf8, + 0x7f, 0x03, 0x17, 0x6b, 0x56, 0x00, 0x01, 0xb9, 0x60, 0xff, 0xff, 0x54, + 0xe0, 0x03, 0x16, 0x2a, 0x19, 0x00, 0x80, 0x52, 0x67, 0xf6, 0xff, 0x97, + 0x84, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0x0c, 0xf6, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0x60, 0xe2, 0x01, 0x91, 0x91, 0xfd, 0xff, 0x97, + 0x60, 0x4e, 0x40, 0xb9, 0x1f, 0x08, 0x00, 0x71, 0x60, 0x08, 0x00, 0x54, + 0x1f, 0x04, 0x00, 0x71, 0x20, 0x08, 0x00, 0x54, 0xf5, 0x5b, 0x02, 0xa9, + 0x75, 0x10, 0x00, 0xb0, 0xa1, 0xba, 0x4f, 0xb9, 0x76, 0xa6, 0x40, 0xf9, + 0x21, 0x04, 0x00, 0x11, 0xa1, 0xba, 0x0f, 0xb9, 0xf7, 0x1b, 0x00, 0xf9, + 0x80, 0x04, 0x00, 0x35, 0xa2, 0xba, 0x4f, 0xb9, 0x37, 0x00, 0x80, 0x52, + 0x40, 0x00, 0x80, 0x52, 0x60, 0x4e, 0x00, 0xb9, 0x42, 0x00, 0x17, 0x0b, + 0x77, 0x56, 0x00, 0xb9, 0x7f, 0x7a, 0x00, 0xb9, 0xe0, 0x03, 0x14, 0x2a, + 0xa2, 0xba, 0x0f, 0xb9, 0xd2, 0xf5, 0xff, 0x97, 0x96, 0x00, 0x00, 0xb4, + 0xe1, 0x03, 0x17, 0x2a, 0xe0, 0x03, 0x13, 0xaa, 0xc0, 0x02, 0x3f, 0xd6, + 0xe0, 0x03, 0x13, 0xaa, 0x30, 0x00, 0x00, 0x94, 0xeb, 0xf5, 0xff, 0x97, + 0xca, 0xf5, 0xff, 0x97, 0x60, 0x10, 0x00, 0xb0, 0x01, 0xfc, 0x46, 0xf9, + 0x61, 0x00, 0x00, 0xb4, 0xe0, 0x03, 0x13, 0xaa, 0x20, 0x00, 0x3f, 0xd6, + 0xe4, 0xf5, 0xff, 0x97, 0xa1, 0xba, 0x4f, 0xb9, 0x21, 0x04, 0x00, 0x51, + 0xa1, 0xba, 0x0f, 0xb9, 0xc0, 0xf5, 0xff, 0x97, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0x79, 0x04, 0x00, 0x94, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x77, 0x5e, 0x40, 0xf9, 0x20, 0x00, 0x80, 0x52, 0x41, 0x00, 0x80, 0x52, + 0x61, 0x4e, 0x00, 0xb9, 0x60, 0x56, 0x00, 0xb9, 0xe0, 0x03, 0x14, 0x2a, + 0x74, 0x5a, 0x41, 0xb9, 0xb1, 0xf5, 0xff, 0x97, 0x97, 0x00, 0x00, 0xb4, + 0xe1, 0x03, 0x14, 0x2a, 0xe0, 0x03, 0x13, 0xaa, 0xe0, 0x02, 0x3f, 0xd6, + 0xcc, 0xf5, 0xff, 0x97, 0x7f, 0x56, 0x00, 0xb9, 0xaa, 0xf5, 0xff, 0x97, + 0x96, 0x00, 0x00, 0xb4, 0xe0, 0x03, 0x13, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0xc0, 0x02, 0x3f, 0xd6, 0xc5, 0xf5, 0xff, 0x97, 0xda, 0xff, 0xff, 0x17, + 0xe0, 0x03, 0x14, 0x2a, 0xa2, 0xf5, 0xff, 0x97, 0x5d, 0x04, 0x00, 0x94, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xb6, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x74, 0x10, 0x00, 0xb0, 0x94, 0x02, 0x3f, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0xf7, 0x63, 0x03, 0xa9, 0xfb, 0x73, 0x05, 0xa9, + 0xfb, 0x03, 0x00, 0xaa, 0xb3, 0xf5, 0xff, 0x97, 0xf6, 0x03, 0x00, 0x2a, + 0x09, 0xf6, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0xf5, 0x03, 0x13, 0xaa, + 0x80, 0x7a, 0x73, 0xf8, 0x1f, 0x00, 0x1b, 0xeb, 0x60, 0x0f, 0x00, 0x54, + 0xab, 0xf5, 0xff, 0x97, 0xdb, 0x00, 0x00, 0xb4, 0x62, 0x03, 0x40, 0xb9, + 0x81, 0x48, 0x8a, 0x52, 0x01, 0x89, 0xaa, 0x72, 0x5f, 0x00, 0x01, 0x6b, + 0x80, 0x04, 0x00, 0x54, 0x84, 0xf5, 0xff, 0x97, 0x77, 0x10, 0x00, 0xb0, + 0xe0, 0xba, 0x4f, 0xb9, 0x61, 0x57, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x51, + 0xe0, 0xba, 0x0f, 0xb9, 0x3f, 0x04, 0x00, 0x71, 0xe0, 0x07, 0x00, 0x54, + 0x78, 0x10, 0x00, 0xd0, 0x18, 0x03, 0x00, 0x91, 0x15, 0x7b, 0x73, 0xf8, + 0x80, 0x7a, 0x73, 0xf8, 0x1f, 0x00, 0x15, 0xeb, 0xe0, 0x01, 0x00, 0x54, + 0x15, 0x01, 0x00, 0xb4, 0x95, 0xf5, 0xff, 0x97, 0xa2, 0x02, 0x40, 0xb9, + 0x81, 0x48, 0x8a, 0x52, 0x01, 0x89, 0xaa, 0x72, 0x5f, 0x00, 0x01, 0x6b, + 0xe0, 0x10, 0x00, 0x54, 0x6f, 0xf5, 0xff, 0x97, 0x60, 0x10, 0x00, 0xb0, + 0x00, 0x00, 0x38, 0x91, 0x00, 0x78, 0x73, 0xb8, 0x60, 0x00, 0x00, 0x35, + 0xe0, 0xba, 0x4f, 0xb9, 0xa0, 0x13, 0x00, 0x34, 0xe0, 0x03, 0x16, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xca, 0xa8, 0x62, 0xf5, 0xff, 0x17, + 0x61, 0x07, 0x40, 0xf9, 0x62, 0xa3, 0x40, 0xf9, 0x3f, 0x00, 0x02, 0xeb, + 0x42, 0x00, 0x00, 0x54, 0x61, 0xa3, 0x00, 0xf9, 0x62, 0x0b, 0x40, 0xf9, + 0xe3, 0xdb, 0x03, 0x32, 0x41, 0x00, 0x40, 0xb9, 0x3f, 0x00, 0x03, 0x6b, + 0xa1, 0x00, 0x00, 0x54, 0x63, 0x0f, 0x40, 0xf9, 0x63, 0x10, 0x40, 0xb8, + 0x7f, 0x00, 0x01, 0x6b, 0x00, 0x1a, 0x00, 0x54, 0x53, 0xf5, 0xff, 0x97, + 0xe0, 0x03, 0x1b, 0xaa, 0x69, 0x04, 0x00, 0x94, 0x70, 0xf5, 0xff, 0x97, + 0x61, 0xa3, 0x40, 0xf9, 0x22, 0xc0, 0x5f, 0xb8, 0xe1, 0xdb, 0x03, 0x32, + 0x5f, 0x00, 0x01, 0x6b, 0xe0, 0xf8, 0xff, 0x54, 0x4a, 0xf5, 0xff, 0x97, + 0xe0, 0x03, 0x1b, 0xaa, 0x70, 0x04, 0x00, 0x94, 0x67, 0xf5, 0xff, 0x97, + 0x46, 0xf5, 0xff, 0x97, 0x77, 0x10, 0x00, 0xb0, 0xe0, 0xba, 0x4f, 0xb9, + 0x61, 0x57, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x51, 0xe0, 0xba, 0x0f, 0xb9, + 0x3f, 0x04, 0x00, 0x71, 0x61, 0xf8, 0xff, 0x54, 0xf9, 0x6b, 0x04, 0xa9, + 0x62, 0x4b, 0x40, 0xb9, 0x68, 0x5b, 0x40, 0xb9, 0x7f, 0x57, 0x00, 0xb9, + 0xe5, 0x03, 0x02, 0x2a, 0x1f, 0x01, 0x02, 0x6b, 0x63, 0x08, 0x00, 0x54, + 0x66, 0x10, 0x00, 0xb0, 0xc0, 0xd0, 0x47, 0xf9, 0x1f, 0x00, 0x1b, 0xeb, + 0xa0, 0x13, 0x00, 0x54, 0x60, 0x1b, 0x40, 0xf9, 0x67, 0x10, 0x00, 0xb0, + 0xe4, 0x10, 0x4e, 0xb9, 0x61, 0x10, 0x00, 0xb0, 0x21, 0xe0, 0x33, 0x91, + 0x1f, 0x00, 0x1b, 0xeb, 0x60, 0x11, 0x00, 0x54, 0x67, 0x1f, 0x40, 0xf9, + 0x23, 0x78, 0x65, 0xf8, 0x07, 0x1c, 0x00, 0xf9, 0x67, 0x1f, 0x40, 0xf9, + 0x7f, 0x03, 0x03, 0xeb, 0xe0, 0x18, 0x00, 0xf9, 0x40, 0x0f, 0x00, 0x54, + 0x65, 0x10, 0x00, 0xb0, 0xb8, 0x00, 0x00, 0x91, 0x79, 0x03, 0x41, 0xb9, + 0x04, 0x04, 0x00, 0x35, 0xe0, 0x03, 0x19, 0x2a, 0xbf, 0x02, 0x19, 0x6b, + 0x75, 0x10, 0x00, 0x90, 0xb5, 0x02, 0x38, 0x91, 0x1f, 0x7b, 0x20, 0xf8, + 0xa0, 0x00, 0x00, 0x54, 0xa0, 0x7a, 0x60, 0xb8, 0xe1, 0xcf, 0x04, 0x32, + 0x1f, 0x00, 0x01, 0x6b, 0x63, 0x1c, 0x00, 0x54, 0xa1, 0x7a, 0x73, 0xb8, + 0xe0, 0xba, 0x4f, 0xb9, 0x00, 0x00, 0x01, 0x2a, 0x60, 0x0d, 0x00, 0x34, + 0xf9, 0x6b, 0x44, 0xa9, 0x98, 0xff, 0xff, 0x17, 0x40, 0x10, 0x00, 0xf0, + 0x00, 0x00, 0x2d, 0x91, 0x61, 0x2b, 0x40, 0xb9, 0x62, 0x7b, 0x40, 0xb9, + 0x01, 0x78, 0x33, 0xb8, 0x40, 0x04, 0x00, 0x51, 0x1f, 0x0c, 0x00, 0x31, + 0x29, 0x09, 0x00, 0x54, 0x29, 0xf5, 0xff, 0x97, 0x62, 0x03, 0x40, 0xb9, + 0x81, 0x48, 0x8a, 0x52, 0x01, 0x89, 0xaa, 0x72, 0x5f, 0x00, 0x01, 0x6b, + 0x01, 0xf0, 0xff, 0x54, 0xa2, 0xff, 0xff, 0x17, 0xfa, 0x03, 0x19, 0x2a, + 0x00, 0x7b, 0x7a, 0xf8, 0x1f, 0x00, 0x1b, 0xeb, 0x81, 0xfd, 0xff, 0x54, + 0xc0, 0xd0, 0x47, 0xf9, 0x1f, 0x7b, 0x3a, 0xf8, 0x1f, 0x00, 0x00, 0xf1, + 0x00, 0x01, 0x42, 0x7a, 0xc2, 0x0f, 0x00, 0x54, 0xe0, 0x03, 0x15, 0x2a, + 0x64, 0x04, 0x00, 0x94, 0xf9, 0x6b, 0x44, 0xa9, 0x7c, 0xff, 0xff, 0x17, + 0x60, 0x10, 0x00, 0x90, 0x00, 0x60, 0x38, 0x91, 0x03, 0x78, 0x65, 0xf8, + 0x7f, 0x00, 0x1b, 0xeb, 0x41, 0xf7, 0xff, 0x54, 0x63, 0x10, 0x00, 0xb0, + 0x1f, 0x78, 0x25, 0xf8, 0x21, 0x20, 0xc2, 0x1a, 0x60, 0x30, 0x40, 0xb9, + 0x01, 0x00, 0x21, 0x0a, 0x61, 0x30, 0x00, 0xb9, 0xb3, 0xff, 0xff, 0x17, + 0xa1, 0x06, 0x40, 0xf9, 0xa2, 0xa2, 0x40, 0xf9, 0x3f, 0x00, 0x02, 0xeb, + 0x42, 0x00, 0x00, 0x54, 0xa1, 0xa2, 0x00, 0xf9, 0xa2, 0x0a, 0x40, 0xf9, + 0xe3, 0xdb, 0x03, 0x32, 0x41, 0x00, 0x40, 0xb9, 0x3f, 0x00, 0x03, 0x6b, + 0xa1, 0x00, 0x00, 0x54, 0xa3, 0x0e, 0x40, 0xf9, 0x63, 0x10, 0x40, 0xb8, + 0x7f, 0x00, 0x01, 0x6b, 0x80, 0x0b, 0x00, 0x54, 0xdb, 0xf4, 0xff, 0x97, + 0xe0, 0x03, 0x15, 0xaa, 0xf1, 0x03, 0x00, 0x94, 0xf8, 0xf4, 0xff, 0x97, + 0xa1, 0xa2, 0x40, 0xf9, 0x22, 0xc0, 0x5f, 0xb8, 0xe1, 0xdb, 0x03, 0x32, + 0x5f, 0x00, 0x01, 0x6b, 0x80, 0xec, 0xff, 0x54, 0xd2, 0xf4, 0xff, 0x97, + 0xe0, 0x03, 0x15, 0xaa, 0xf8, 0x03, 0x00, 0x94, 0xef, 0xf4, 0xff, 0x97, + 0xce, 0xf4, 0xff, 0x97, 0x5f, 0xff, 0xff, 0x17, 0xe1, 0xba, 0x4f, 0xb9, + 0xe0, 0x03, 0x16, 0x2a, 0x21, 0x04, 0x00, 0x11, 0xe1, 0xba, 0x0f, 0xb9, + 0xc8, 0xf4, 0xff, 0x97, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xca, 0xa8, + 0x60, 0xf4, 0xff, 0x17, 0x41, 0x10, 0x00, 0xf0, 0x21, 0x18, 0x45, 0xf9, + 0x5f, 0x84, 0x00, 0x71, 0x00, 0x7c, 0x7d, 0xd3, 0x42, 0x10, 0x00, 0xf0, + 0x43, 0xac, 0x45, 0xf9, 0x02, 0x1f, 0x80, 0xd2, 0x00, 0x30, 0x82, 0x9a, + 0x62, 0xe3, 0x01, 0x91, 0x20, 0x00, 0x00, 0x8b, 0x7f, 0x00, 0x00, 0xeb, + 0x89, 0x05, 0x00, 0x54, 0x01, 0x00, 0x40, 0xf9, 0x41, 0x10, 0x00, 0xb4, + 0x23, 0x10, 0x40, 0xf9, 0x62, 0x0c, 0x00, 0xf9, 0x22, 0x10, 0x00, 0xf9, + 0x41, 0x8c, 0x01, 0xa9, 0x40, 0x14, 0x00, 0xf9, 0xce, 0xf4, 0xff, 0x97, + 0xa5, 0xff, 0xff, 0x17, 0x63, 0x1b, 0x40, 0xf9, 0x23, 0x78, 0x25, 0xf8, + 0x85, 0xff, 0xff, 0x17, 0xe1, 0xba, 0x4f, 0xb9, 0xe0, 0x03, 0x16, 0x2a, + 0x21, 0x04, 0x00, 0x11, 0xe1, 0xba, 0x0f, 0xb9, 0xa5, 0xf4, 0xff, 0x97, + 0xf9, 0x6b, 0x44, 0xa9, 0xdc, 0xff, 0xff, 0x17, 0x20, 0x00, 0x80, 0x52, + 0x3f, 0x78, 0x25, 0xf8, 0x00, 0x20, 0xc2, 0x1a, 0x84, 0x00, 0x20, 0x0a, + 0xe4, 0x10, 0x0e, 0xb9, 0x65, 0x10, 0x00, 0xb0, 0xb8, 0x00, 0x00, 0x91, + 0x79, 0x03, 0x41, 0xb9, 0xe3, 0x03, 0x1b, 0xaa, 0xe4, 0xf2, 0xff, 0x35, + 0x77, 0xff, 0xff, 0x17, 0x60, 0x10, 0x00, 0x90, 0x00, 0x60, 0x38, 0x91, + 0x61, 0x10, 0x00, 0xb0, 0x21, 0x30, 0x40, 0xb9, 0xdf, 0xd0, 0x07, 0xf9, + 0x1f, 0x78, 0x25, 0xf8, 0xc1, 0xeb, 0xff, 0x34, 0x21, 0x00, 0xc0, 0x5a, + 0x21, 0x10, 0xc0, 0x5a, 0xe1, 0x03, 0x01, 0x2a, 0x00, 0x78, 0x61, 0xf8, + 0xc0, 0xd0, 0x07, 0xf9, 0x58, 0xff, 0xff, 0x17, 0x41, 0x10, 0x00, 0xf0, + 0x21, 0x64, 0x46, 0xf9, 0x00, 0x00, 0x03, 0xcb, 0x00, 0x7c, 0x7d, 0x92, + 0x20, 0x00, 0x00, 0x8b, 0xd0, 0xff, 0xff, 0x17, 0x61, 0xa3, 0x40, 0xf9, + 0x5f, 0x00, 0x01, 0xeb, 0x89, 0xe6, 0xff, 0x54, 0x2e, 0xff, 0xff, 0x17, + 0xa1, 0xa2, 0x40, 0xf9, 0x5f, 0x00, 0x01, 0xeb, 0x09, 0xf5, 0xff, 0x54, + 0xa2, 0xff, 0xff, 0x17, 0x7f, 0x00, 0x1b, 0xeb, 0xc0, 0x10, 0x00, 0x54, + 0xb0, 0x00, 0x40, 0xf9, 0x06, 0x00, 0x80, 0x52, 0x50, 0x00, 0x00, 0xb4, + 0x06, 0x16, 0x41, 0xb9, 0x11, 0x07, 0x40, 0xf9, 0x71, 0x00, 0x00, 0xb4, + 0x20, 0x16, 0x41, 0xb9, 0xc6, 0x00, 0x00, 0x2a, 0x12, 0x0b, 0x40, 0xf9, + 0x72, 0x00, 0x00, 0xb4, 0x40, 0x16, 0x41, 0xb9, 0xc6, 0x00, 0x00, 0x2a, + 0x1e, 0x0f, 0x40, 0xf9, 0x7e, 0x00, 0x00, 0xb4, 0xc0, 0x17, 0x41, 0xb9, + 0xc6, 0x00, 0x00, 0x2a, 0x5f, 0x80, 0x00, 0x71, 0xc0, 0x02, 0x00, 0x54, + 0x2d, 0x00, 0x80, 0x52, 0x7b, 0x10, 0x00, 0x90, 0x7b, 0xc3, 0x3c, 0x91, + 0xee, 0xc3, 0x01, 0x91, 0xef, 0x03, 0x02, 0x91, 0xac, 0x21, 0xd9, 0x1a, + 0x80, 0x01, 0x06, 0x0a, 0xe0, 0x67, 0x00, 0xb9, 0xe5, 0x37, 0x00, 0xf9, + 0xe3, 0x03, 0x00, 0xb4, 0x60, 0x00, 0x41, 0xb9, 0xe7, 0x03, 0x00, 0x2a, + 0x05, 0x7b, 0x67, 0xf8, 0xbf, 0x00, 0x03, 0xeb, 0x60, 0x02, 0x00, 0x54, + 0x65, 0x48, 0x40, 0xb9, 0x68, 0x58, 0x40, 0xb9, 0x1f, 0x01, 0x05, 0x6b, + 0x00, 0x05, 0x00, 0x54, 0xe0, 0x03, 0x15, 0x2a, 0xc0, 0x03, 0x00, 0x94, + 0xbf, 0x02, 0x19, 0x6b, 0xe0, 0xe7, 0xff, 0x54, 0x60, 0x10, 0x00, 0x90, + 0x00, 0x00, 0x38, 0x91, 0xe1, 0xcf, 0x04, 0x32, 0x00, 0x78, 0x7a, 0xb8, + 0x1f, 0x00, 0x01, 0x6b, 0x22, 0xe7, 0xff, 0x54, 0xe0, 0x03, 0x19, 0x2a, + 0xbc, 0xf4, 0xff, 0x97, 0xf9, 0x6b, 0x44, 0xa9, 0xce, 0xfe, 0xff, 0x17, + 0x20, 0x58, 0x62, 0xf8, 0x63, 0x18, 0x40, 0xf9, 0x1f, 0x00, 0x03, 0xeb, + 0xa1, 0xfc, 0xff, 0x54, 0x42, 0x04, 0x00, 0x11, 0x5f, 0x80, 0x00, 0x71, + 0xc0, 0xfd, 0xff, 0x54, 0x80, 0x24, 0xc2, 0x1a, 0x80, 0xfd, 0xff, 0x34, + 0x5f, 0x7c, 0x00, 0x71, 0x48, 0xfd, 0xff, 0x54, 0x00, 0x00, 0xc0, 0x5a, + 0x00, 0x10, 0xc0, 0x5a, 0x42, 0x00, 0x00, 0x0b, 0x5f, 0x80, 0x00, 0x71, + 0xa0, 0xfc, 0xff, 0x54, 0x23, 0x58, 0x62, 0xf8, 0xd8, 0xff, 0xff, 0x17, + 0xe0, 0x03, 0x19, 0x2a, 0xa6, 0xf4, 0xff, 0x97, 0x1c, 0xff, 0xff, 0x17, + 0x42, 0x88, 0x01, 0xa9, 0x02, 0x00, 0x00, 0xf9, 0x40, 0x14, 0x00, 0xf9, + 0x81, 0xff, 0xff, 0x17, 0x68, 0x14, 0x41, 0xb9, 0x05, 0x01, 0x0c, 0x6a, + 0x80, 0x00, 0x00, 0x54, 0x03, 0x7b, 0x3a, 0xf8, 0x79, 0x00, 0x01, 0xb9, + 0xd6, 0xff, 0xff, 0x17, 0xe9, 0x67, 0x40, 0xb9, 0x09, 0xfc, 0xff, 0x34, + 0x08, 0x01, 0x06, 0x6a, 0xc0, 0xfb, 0xff, 0x54, 0x70, 0x47, 0x00, 0xa9, + 0xaa, 0x21, 0xc0, 0x1a, 0xc6, 0x00, 0x28, 0x0a, 0x72, 0x7b, 0x01, 0xa9, + 0x09, 0x01, 0x0a, 0x6a, 0x00, 0x04, 0x00, 0x54, 0xe3, 0x79, 0x27, 0xf8, + 0x08, 0x01, 0x2a, 0x6a, 0xe0, 0x73, 0x00, 0xb9, 0x29, 0x00, 0x80, 0x52, + 0x61, 0x03, 0x00, 0x54, 0xea, 0x03, 0x0e, 0xaa, 0xeb, 0x03, 0x06, 0x2a, + 0x04, 0x00, 0x00, 0x14, 0x4a, 0x11, 0x00, 0x91, 0xbf, 0x00, 0x09, 0x6b, + 0xa0, 0xf9, 0xff, 0x54, 0x40, 0x01, 0x40, 0xb9, 0xa5, 0x04, 0x00, 0x11, + 0x68, 0x7b, 0x60, 0xf8, 0x48, 0xff, 0xff, 0xb4, 0x00, 0x15, 0x41, 0xb9, + 0x00, 0x00, 0x0b, 0x6a, 0xe0, 0xfe, 0xff, 0x54, 0x87, 0x01, 0x00, 0x6a, + 0x21, 0x03, 0x00, 0x54, 0x6b, 0x01, 0x20, 0x0a, 0x07, 0x00, 0xc0, 0x5a, + 0xe7, 0x10, 0xc0, 0x5a, 0xc7, 0x59, 0x29, 0xb8, 0xfc, 0x03, 0x07, 0x2a, + 0x29, 0x05, 0x00, 0x11, 0xa7, 0x21, 0xc7, 0x1a, 0x00, 0x00, 0x27, 0x6a, + 0xe8, 0x79, 0x3c, 0xf8, 0x01, 0xff, 0xff, 0x54, 0xea, 0xff, 0xff, 0x17, + 0x00, 0x01, 0xc0, 0x5a, 0x00, 0x10, 0xc0, 0x5a, 0xc0, 0x59, 0x29, 0xb8, + 0xe7, 0x03, 0x00, 0x2a, 0x29, 0x05, 0x00, 0x11, 0xa0, 0x21, 0xc0, 0x1a, + 0x08, 0x01, 0x20, 0x6a, 0xe3, 0x79, 0x27, 0xf8, 0x01, 0xff, 0xff, 0x54, + 0xdd, 0xff, 0xff, 0x17, 0x42, 0x04, 0x00, 0x11, 0x03, 0x00, 0x80, 0xd2, + 0x79, 0xff, 0xff, 0x17, 0x05, 0x01, 0x41, 0xb9, 0xe9, 0x03, 0x05, 0x2a, + 0xe0, 0x79, 0x69, 0xf8, 0x1f, 0x00, 0x03, 0xeb, 0x20, 0x01, 0x00, 0x54, + 0xea, 0x03, 0x05, 0x2a, 0x05, 0x00, 0x41, 0xb9, 0x60, 0x7b, 0x29, 0xf8, + 0xe9, 0x03, 0x05, 0x2a, 0x0a, 0x00, 0x01, 0xb9, 0xe0, 0x79, 0x69, 0xf8, + 0x1f, 0x00, 0x03, 0xeb, 0x21, 0xff, 0xff, 0x54, 0xe7, 0x00, 0xc0, 0x5a, + 0x63, 0x7b, 0x29, 0xf8, 0xe7, 0x10, 0xc0, 0x5a, 0x65, 0x00, 0x01, 0xb9, + 0xe0, 0x03, 0x07, 0x2a, 0x07, 0x01, 0x01, 0xb9, 0xff, 0x10, 0x00, 0x71, + 0x68, 0x7b, 0x20, 0xf8, 0xc0, 0xf2, 0xff, 0x54, 0xe5, 0x37, 0x40, 0xf9, + 0x62, 0x10, 0x00, 0x90, 0x42, 0x00, 0x38, 0x91, 0x1c, 0x00, 0x80, 0xd2, + 0xe4, 0xcf, 0x04, 0x32, 0x1f, 0xff, 0x00, 0xa9, 0xbf, 0x00, 0x00, 0xf9, + 0x1f, 0x0f, 0x00, 0xf9, 0x61, 0x7b, 0x7c, 0xf8, 0x01, 0x7b, 0x3c, 0xf8, + 0xbf, 0x02, 0x1c, 0x6b, 0xe0, 0x03, 0x1c, 0x2a, 0x00, 0x01, 0x00, 0x54, + 0x83, 0x7a, 0x7c, 0xf8, 0x7f, 0x00, 0x00, 0xf1, 0x24, 0x10, 0x43, 0xfa, + 0x80, 0x00, 0x00, 0x54, 0x40, 0x78, 0x60, 0xb8, 0x1f, 0x00, 0x04, 0x6b, + 0xa3, 0x00, 0x00, 0x54, 0x9c, 0x07, 0x00, 0x91, 0x9f, 0x13, 0x00, 0xf1, + 0x41, 0xfe, 0xff, 0x54, 0x72, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x1c, 0x2a, + 0x35, 0xf4, 0xff, 0x97, 0x60, 0x10, 0x00, 0x90, 0x02, 0x00, 0x38, 0x91, + 0xe4, 0xcf, 0x04, 0x32, 0xf7, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x41, 0xb9, 0x28, 0x00, 0x80, 0x52, + 0xff, 0xc3, 0x00, 0xd1, 0x04, 0x21, 0xc5, 0x1a, 0x86, 0x00, 0x02, 0x6a, + 0xc0, 0x00, 0x00, 0x54, 0xe7, 0x43, 0x00, 0x91, 0x42, 0x00, 0x24, 0x0a, + 0xe6, 0x03, 0x08, 0x2a, 0xe5, 0x03, 0x00, 0xb9, 0xe0, 0x58, 0x25, 0xf8, + 0xeb, 0x03, 0x00, 0x91, 0xa2, 0x01, 0x00, 0x34, 0xe7, 0x43, 0x00, 0x91, + 0xeb, 0x03, 0x00, 0x91, 0x28, 0x00, 0x80, 0x52, 0x44, 0x00, 0xc0, 0x5a, + 0x84, 0x10, 0xc0, 0x5a, 0x64, 0x59, 0x26, 0xb8, 0xe5, 0x03, 0x04, 0x2a, + 0xc6, 0x04, 0x00, 0x11, 0x04, 0x21, 0xc4, 0x1a, 0x42, 0x00, 0x24, 0x6a, + 0xe0, 0x78, 0x25, 0xf8, 0x01, 0xff, 0xff, 0x54, 0x69, 0x10, 0x00, 0x90, + 0x29, 0xc1, 0x3c, 0x91, 0xe8, 0x03, 0x0b, 0xaa, 0xed, 0x43, 0x00, 0x91, + 0x07, 0x00, 0x80, 0x52, 0x2c, 0x00, 0x80, 0x52, 0x04, 0x00, 0x00, 0x14, + 0x08, 0x11, 0x00, 0x91, 0xdf, 0x00, 0x07, 0x6b, 0xe0, 0x02, 0x00, 0x54, + 0x02, 0x01, 0x40, 0xb9, 0xe7, 0x04, 0x00, 0x11, 0x25, 0x79, 0x62, 0xf8, + 0x45, 0xff, 0xff, 0xb4, 0xa2, 0x14, 0x41, 0xb9, 0x62, 0x00, 0x02, 0x6a, + 0xe0, 0xfe, 0xff, 0x54, 0x4a, 0x00, 0x01, 0x6a, 0x21, 0x02, 0x00, 0x54, + 0x63, 0x00, 0x22, 0x0a, 0x44, 0x00, 0xc0, 0x5a, 0x84, 0x10, 0xc0, 0x5a, + 0x64, 0x59, 0x26, 0xb8, 0xea, 0x03, 0x04, 0x2a, 0xc6, 0x04, 0x00, 0x11, + 0x84, 0x21, 0xc4, 0x1a, 0x42, 0x00, 0x24, 0x6a, 0xa5, 0x79, 0x2a, 0xf8, + 0x01, 0xff, 0xff, 0x54, 0x08, 0x11, 0x00, 0x91, 0xdf, 0x00, 0x07, 0x6b, + 0x61, 0xfd, 0xff, 0x54, 0x80, 0x00, 0x80, 0x52, 0xff, 0xc3, 0x00, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0xa2, 0x00, 0x41, 0xb9, 0xe7, 0x43, 0x00, 0x91, + 0xe3, 0x03, 0x02, 0x2a, 0xe1, 0x78, 0x63, 0xf8, 0x1f, 0x00, 0x01, 0xeb, + 0x20, 0x01, 0x00, 0x54, 0xe4, 0x03, 0x02, 0x2a, 0x22, 0x00, 0x41, 0xb9, + 0x21, 0x79, 0x23, 0xf8, 0xe3, 0x03, 0x02, 0x2a, 0x24, 0x00, 0x01, 0xb9, + 0xe1, 0x78, 0x63, 0xf8, 0x1f, 0x00, 0x01, 0xeb, 0x21, 0xff, 0xff, 0x54, + 0x40, 0x01, 0xc0, 0x5a, 0x21, 0x79, 0x23, 0xf8, 0x00, 0x10, 0xc0, 0x5a, + 0x22, 0x00, 0x01, 0xb9, 0xe4, 0x03, 0x00, 0x2a, 0xa0, 0x00, 0x01, 0xb9, + 0x25, 0x79, 0x24, 0xf8, 0xff, 0xc3, 0x00, 0x91, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xe2, 0x03, 0x00, 0x2a, 0x61, 0x10, 0x00, 0x90, + 0x21, 0x00, 0x38, 0x91, 0xe3, 0xcf, 0x04, 0x32, 0x21, 0x78, 0x62, 0xb8, + 0x3f, 0x00, 0x03, 0x6b, 0x43, 0x00, 0x00, 0x54, 0xc0, 0x03, 0x5f, 0xd6, + 0xd2, 0xf3, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x74, 0x10, 0x00, 0xb0, 0x94, 0x02, 0x00, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0x76, 0x10, 0x00, 0x90, 0xd6, 0xc2, 0x3c, 0x91, + 0xf5, 0x03, 0x00, 0x2a, 0xf7, 0x1b, 0x00, 0xf9, 0x77, 0x10, 0x00, 0x90, + 0xf7, 0x02, 0x3f, 0x91, 0x13, 0x00, 0x80, 0xd2, 0xc1, 0x7a, 0x73, 0xf8, + 0x81, 0x7a, 0x33, 0xf8, 0xbf, 0x02, 0x13, 0x6b, 0xe0, 0x00, 0x00, 0x54, + 0xe2, 0x7a, 0x73, 0xf8, 0xe0, 0x03, 0x13, 0x2a, 0x5f, 0x00, 0x00, 0xf1, + 0x24, 0x10, 0x42, 0xfa, 0x40, 0x00, 0x00, 0x54, 0xde, 0xff, 0xff, 0x97, + 0x73, 0x06, 0x00, 0x91, 0x7f, 0x12, 0x00, 0xf1, 0x81, 0xfe, 0xff, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xb9, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, 0xf7, 0x63, 0x03, 0xa9, + 0x56, 0xf3, 0xff, 0x97, 0xf6, 0x03, 0x00, 0x2a, 0x60, 0x52, 0x40, 0xf9, + 0x20, 0x13, 0x00, 0xb4, 0x62, 0x4a, 0x40, 0xf9, 0x61, 0xe2, 0x01, 0x91, + 0x3f, 0x00, 0x02, 0xeb, 0x20, 0x09, 0x00, 0x54, 0x23, 0x10, 0x40, 0xf9, + 0x43, 0x10, 0x00, 0xf9, 0x62, 0x0c, 0x00, 0xf9, 0x03, 0x00, 0x40, 0xf9, + 0x7f, 0x00, 0x01, 0xeb, 0x40, 0x13, 0x00, 0x54, 0x3f, 0x14, 0x00, 0xf9, + 0x47, 0xf3, 0xff, 0x97, 0x62, 0x02, 0x40, 0xb9, 0x81, 0x48, 0x8a, 0x52, + 0x01, 0x89, 0xaa, 0x72, 0x5f, 0x00, 0x01, 0x6b, 0x00, 0x0d, 0x00, 0x54, + 0x21, 0xf3, 0xff, 0x97, 0x98, 0xf3, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0x61, 0x56, 0x40, 0xb9, 0x60, 0x4e, 0x40, 0xb9, 0x3f, 0x04, 0x00, 0x71, + 0x40, 0x07, 0x00, 0x54, 0x80, 0x07, 0x00, 0x34, 0x60, 0x52, 0x40, 0xb9, + 0x1f, 0x04, 0x00, 0x71, 0x00, 0x16, 0x00, 0x54, 0x64, 0x4a, 0x40, 0xb9, + 0x6e, 0x10, 0x00, 0x90, 0xce, 0xe1, 0x33, 0x91, 0xe1, 0x03, 0x04, 0x2a, + 0xc0, 0x79, 0x61, 0xf8, 0x7f, 0x4e, 0x00, 0xb9, 0x00, 0x14, 0x00, 0xb4, + 0x01, 0x1c, 0x40, 0xf9, 0x33, 0x18, 0x00, 0xf9, 0x13, 0x1c, 0x00, 0xf9, + 0x60, 0x06, 0x03, 0xa9, 0x60, 0x10, 0x00, 0x90, 0x00, 0xd0, 0x47, 0xf9, + 0x80, 0x00, 0x00, 0xb4, 0x00, 0x58, 0x40, 0xb9, 0x1f, 0x00, 0x04, 0x6b, + 0xc9, 0x1d, 0x00, 0x54, 0x60, 0x5a, 0x40, 0xb9, 0x1f, 0x00, 0x04, 0x6b, + 0x62, 0x14, 0x00, 0x54, 0x72, 0x10, 0x00, 0xb0, 0x55, 0x02, 0x00, 0x91, + 0xe0, 0x03, 0x15, 0xaa, 0xa2, 0x82, 0x00, 0x91, 0x01, 0x00, 0x40, 0xf9, + 0x00, 0x20, 0x00, 0x91, 0xc1, 0x1d, 0x00, 0xb4, 0x21, 0x58, 0x40, 0xb9, + 0x3f, 0x00, 0x04, 0x6b, 0x68, 0x1d, 0x00, 0x54, 0x5f, 0x00, 0x00, 0xeb, + 0x21, 0xff, 0xff, 0x54, 0x77, 0x10, 0x00, 0x90, 0xf7, 0x02, 0x3f, 0x91, + 0x78, 0x10, 0x00, 0x90, 0x00, 0xbb, 0x4f, 0xb9, 0xb3, 0x7a, 0x74, 0xf8, + 0x00, 0x04, 0x00, 0x51, 0xe1, 0x7a, 0x74, 0xf8, 0x00, 0xbb, 0x0f, 0xb9, + 0x3f, 0x00, 0x13, 0xeb, 0x61, 0x03, 0x00, 0x54, 0xe0, 0x03, 0x16, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc7, 0xa8, 0xe7, 0xf2, 0xff, 0x17, 0x02, 0x00, 0x40, 0xf9, + 0x5f, 0x00, 0x01, 0xeb, 0x81, 0xf7, 0xff, 0x54, 0x1f, 0x00, 0x00, 0xf9, + 0xba, 0xff, 0xff, 0x17, 0x00, 0x04, 0x00, 0x51, 0x1f, 0x04, 0x00, 0x71, + 0xe8, 0x08, 0x00, 0x54, 0x75, 0x10, 0x00, 0xb0, 0xb5, 0x02, 0x00, 0x91, + 0x77, 0x10, 0x00, 0x90, 0xf7, 0x02, 0x3f, 0x91, 0x78, 0x10, 0x00, 0x90, + 0x00, 0xbb, 0x4f, 0xb9, 0xb3, 0x7a, 0x74, 0xf8, 0x00, 0x04, 0x00, 0x51, + 0xe1, 0x7a, 0x74, 0xf8, 0x00, 0xbb, 0x0f, 0xb9, 0x3f, 0x00, 0x13, 0xeb, + 0xe0, 0xfc, 0xff, 0x54, 0x13, 0x01, 0x00, 0xb4, 0xf1, 0xf2, 0xff, 0x97, + 0x62, 0x02, 0x40, 0xb9, 0x81, 0x48, 0x8a, 0x52, 0x01, 0x89, 0xaa, 0x72, + 0x5f, 0x00, 0x01, 0x6b, 0x00, 0x08, 0x00, 0x54, 0xcb, 0xf2, 0xff, 0x97, + 0x60, 0x10, 0x00, 0x90, 0x00, 0x00, 0x38, 0x91, 0x00, 0x78, 0x74, 0xb8, + 0x60, 0xfb, 0xff, 0x35, 0x00, 0xbb, 0x4f, 0xb9, 0x20, 0xfb, 0xff, 0x35, + 0x01, 0xbb, 0x4f, 0xb9, 0xe0, 0x03, 0x16, 0x2a, 0x21, 0x04, 0x00, 0x11, + 0x01, 0xbb, 0x0f, 0xb9, 0xc0, 0xf2, 0xff, 0x97, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc7, 0xa8, + 0x59, 0xf2, 0xff, 0x17, 0x61, 0x06, 0x40, 0xf9, 0x62, 0xa2, 0x40, 0xf9, + 0x3f, 0x00, 0x02, 0xeb, 0x42, 0x00, 0x00, 0x54, 0x61, 0xa2, 0x00, 0xf9, + 0x62, 0x0a, 0x40, 0xf9, 0xe3, 0xdb, 0x03, 0x32, 0x41, 0x00, 0x40, 0xb9, + 0x3f, 0x00, 0x03, 0x6b, 0x21, 0x01, 0x00, 0x54, 0x63, 0x0e, 0x40, 0xf9, + 0x63, 0x10, 0x40, 0xb8, 0x7f, 0x00, 0x01, 0x6b, 0xa1, 0x00, 0x00, 0x54, + 0x61, 0xa2, 0x40, 0xf9, 0x5f, 0x00, 0x01, 0xeb, 0xe9, 0x00, 0x00, 0x54, + 0x1f, 0x20, 0x03, 0xd5, 0xa8, 0xf2, 0xff, 0x97, 0xe0, 0x03, 0x13, 0xaa, + 0xbe, 0x01, 0x00, 0x94, 0xc5, 0xf2, 0xff, 0x97, 0x61, 0xa2, 0x40, 0xf9, + 0x22, 0xc0, 0x5f, 0xb8, 0xe1, 0xdb, 0x03, 0x32, 0x5f, 0x00, 0x01, 0x6b, + 0xe0, 0xef, 0xff, 0x54, 0x9f, 0xf2, 0xff, 0x97, 0xe0, 0x03, 0x13, 0xaa, + 0xc5, 0x01, 0x00, 0x94, 0xbc, 0xf2, 0xff, 0x97, 0x7a, 0xff, 0xff, 0x17, + 0x7f, 0x7a, 0x00, 0xb9, 0x72, 0xff, 0xff, 0x17, 0x60, 0x52, 0x40, 0xb9, + 0x00, 0x06, 0x00, 0x35, 0x75, 0x10, 0x00, 0xb0, 0xb5, 0x02, 0x00, 0x91, + 0x77, 0x10, 0x00, 0x90, 0xf7, 0x02, 0x3f, 0x91, 0x7f, 0x4e, 0x00, 0xb9, + 0x7f, 0x56, 0x00, 0xb9, 0xb6, 0xff, 0xff, 0x17, 0x40, 0x14, 0x00, 0xf9, + 0x02, 0x00, 0x00, 0xf9, 0x65, 0xff, 0xff, 0x17, 0x61, 0x06, 0x40, 0xf9, + 0x62, 0xa2, 0x40, 0xf9, 0x3f, 0x00, 0x02, 0xeb, 0x42, 0x00, 0x00, 0x54, + 0x61, 0xa2, 0x00, 0xf9, 0x62, 0x0a, 0x40, 0xf9, 0xe3, 0xdb, 0x03, 0x32, + 0x41, 0x00, 0x40, 0xb9, 0x3f, 0x00, 0x03, 0x6b, 0xa1, 0x00, 0x00, 0x54, + 0x63, 0x0e, 0x40, 0xf9, 0x63, 0x10, 0x40, 0xb8, 0x7f, 0x00, 0x01, 0x6b, + 0xa0, 0x0d, 0x00, 0x54, 0x7e, 0xf2, 0xff, 0x97, 0xe0, 0x03, 0x13, 0xaa, + 0x94, 0x01, 0x00, 0x94, 0x9b, 0xf2, 0xff, 0x97, 0x61, 0xa2, 0x40, 0xf9, + 0x22, 0xc0, 0x5f, 0xb8, 0xe1, 0xdb, 0x03, 0x32, 0x5f, 0x00, 0x01, 0x6b, + 0x60, 0xf5, 0xff, 0x54, 0x75, 0xf2, 0xff, 0x97, 0xe0, 0x03, 0x13, 0xaa, + 0x9b, 0x01, 0x00, 0x94, 0x92, 0xf2, 0xff, 0x97, 0xa6, 0xff, 0xff, 0x17, + 0x62, 0x10, 0x00, 0x90, 0x20, 0x00, 0x80, 0x52, 0xd3, 0x79, 0x21, 0xf8, + 0x01, 0x20, 0xc4, 0x1a, 0x40, 0x10, 0x4e, 0xb9, 0x73, 0x4e, 0x03, 0xa9, + 0x00, 0x00, 0x01, 0x2a, 0x40, 0x10, 0x0e, 0xb9, 0x5d, 0xff, 0xff, 0x17, + 0x60, 0x00, 0x80, 0xd2, 0x75, 0x10, 0x00, 0xb0, 0xb5, 0x02, 0x00, 0x91, + 0x77, 0x10, 0x00, 0x90, 0xf7, 0x02, 0x3f, 0x91, 0x60, 0xc2, 0x04, 0xf8, + 0x87, 0xff, 0xff, 0x17, 0x6f, 0x16, 0x41, 0xb9, 0x2f, 0xf0, 0xff, 0x34, + 0x60, 0x02, 0x41, 0xb9, 0x72, 0x10, 0x00, 0xb0, 0x55, 0x02, 0x00, 0x91, + 0xe1, 0x03, 0x00, 0x2a, 0xa2, 0x7a, 0x61, 0xf8, 0xe2, 0x0a, 0x00, 0xb4, + 0xe3, 0x03, 0x0f, 0x4b, 0xff, 0x01, 0x23, 0x6a, 0xc0, 0x09, 0x00, 0x54, + 0xa7, 0x9a, 0x40, 0xa9, 0x42, 0x02, 0x40, 0xf9, 0xa5, 0x0e, 0x40, 0xf9, + 0x5f, 0x00, 0x00, 0xf1, 0xe1, 0x17, 0x9f, 0x1a, 0xff, 0x00, 0x00, 0xf1, + 0x20, 0x00, 0x1f, 0x32, 0x01, 0x00, 0x81, 0x1a, 0x26, 0x0a, 0x00, 0xb4, + 0x45, 0x0a, 0x00, 0xb4, 0x41, 0x0a, 0x00, 0x35, 0x00, 0x00, 0x80, 0x52, + 0x42, 0x00, 0x00, 0xb4, 0x40, 0x48, 0x40, 0xb9, 0x87, 0x00, 0x00, 0xb4, + 0xe1, 0x48, 0x40, 0xb9, 0x1f, 0x00, 0x01, 0x6b, 0x00, 0x20, 0x81, 0x1a, + 0x86, 0x00, 0x00, 0xb4, 0xc1, 0x48, 0x40, 0xb9, 0x1f, 0x00, 0x01, 0x6b, + 0x00, 0x20, 0x81, 0x1a, 0x85, 0x00, 0x00, 0xb4, 0xa1, 0x48, 0x40, 0xb9, + 0x1f, 0x00, 0x01, 0x6b, 0x00, 0x20, 0x81, 0x1a, 0x1f, 0x00, 0x04, 0x6b, + 0x89, 0xe8, 0xff, 0x54, 0xc5, 0x59, 0x60, 0xf8, 0xa0, 0x18, 0x40, 0xf9, + 0x1f, 0x00, 0x05, 0xeb, 0xe6, 0x03, 0x00, 0xaa, 0x60, 0x01, 0x00, 0x54, + 0xe6, 0x03, 0x05, 0xaa, 0x03, 0x00, 0x80, 0x52, 0x01, 0x00, 0x41, 0xb9, + 0xa1, 0x7a, 0x61, 0xf8, 0x3f, 0x00, 0x00, 0xeb, 0x80, 0x04, 0x00, 0x54, + 0x00, 0x18, 0x40, 0xf9, 0x7f, 0x0c, 0x00, 0x71, 0xa4, 0x90, 0x40, 0xfa, + 0x21, 0xff, 0xff, 0x54, 0xc0, 0x00, 0x41, 0xb9, 0x28, 0x00, 0x80, 0x52, + 0x08, 0x21, 0xc0, 0x1a, 0x08, 0x01, 0x0f, 0x6a, 0xa0, 0x0a, 0x00, 0x54, + 0xe1, 0x03, 0x00, 0x2a, 0x60, 0x02, 0x01, 0xb9, 0x77, 0x10, 0x00, 0x90, + 0xf7, 0x02, 0x3f, 0x91, 0x1f, 0x00, 0x14, 0x6b, 0xb3, 0x7a, 0x21, 0xf8, + 0xa0, 0xe8, 0xff, 0x54, 0xe1, 0x7a, 0x61, 0xf8, 0x3f, 0x00, 0x00, 0xf1, + 0x64, 0x12, 0x41, 0xfa, 0x20, 0xe8, 0xff, 0x54, 0xb2, 0xfe, 0xff, 0x97, + 0x3f, 0xff, 0xff, 0x17, 0x62, 0x10, 0x00, 0x90, 0x41, 0xb8, 0x4f, 0xb9, + 0xe0, 0x03, 0x16, 0x2a, 0x21, 0x04, 0x00, 0x51, 0x41, 0xb8, 0x0f, 0xb9, + 0x28, 0xff, 0xff, 0x17, 0x61, 0xa2, 0x40, 0xf9, 0x5f, 0x00, 0x01, 0xeb, + 0xe9, 0xf2, 0xff, 0x54, 0x91, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x14, 0x2a, + 0x79, 0x01, 0x00, 0x94, 0x16, 0xff, 0xff, 0x17, 0x63, 0x04, 0x00, 0x11, + 0xe6, 0x03, 0x00, 0xaa, 0xdb, 0xff, 0xff, 0x17, 0x43, 0x14, 0x41, 0xb9, + 0x7f, 0x00, 0x0f, 0x6b, 0x21, 0xf6, 0xff, 0x54, 0x42, 0x48, 0x40, 0xb9, + 0x5f, 0x00, 0x04, 0x6b, 0xa9, 0xe1, 0xff, 0x54, 0xb3, 0x7a, 0x21, 0xf8, + 0x77, 0x10, 0x00, 0x90, 0xf7, 0x02, 0x3f, 0x91, 0x9f, 0x02, 0x00, 0x6b, + 0x01, 0xfc, 0xff, 0x54, 0x23, 0xff, 0xff, 0x17, 0x21, 0x00, 0x1e, 0x32, + 0x45, 0x00, 0x00, 0xb5, 0x21, 0x00, 0x1d, 0x32, 0xe3, 0x01, 0x01, 0x6a, + 0x20, 0x01, 0x00, 0x54, 0x63, 0x00, 0xc0, 0x5a, 0x77, 0x10, 0x00, 0x90, + 0xf7, 0x02, 0x3f, 0x91, 0x63, 0x10, 0xc0, 0x5a, 0xe0, 0x03, 0x03, 0x2a, + 0x63, 0x02, 0x01, 0xb9, 0xb3, 0x7a, 0x20, 0xf8, 0x16, 0xff, 0xff, 0x17, + 0x42, 0x00, 0x00, 0xb4, 0x43, 0x14, 0x41, 0xb9, 0x67, 0x00, 0x00, 0xb4, + 0xe0, 0x14, 0x41, 0xb9, 0x63, 0x00, 0x00, 0x2a, 0x66, 0x00, 0x00, 0xb4, + 0xc0, 0x14, 0x41, 0xb9, 0x63, 0x00, 0x00, 0x2a, 0x65, 0x00, 0x00, 0xb4, + 0xa0, 0x14, 0x41, 0xb9, 0x63, 0x00, 0x00, 0x2a, 0x7f, 0x00, 0x01, 0x6a, + 0x20, 0xf3, 0xff, 0x54, 0xef, 0x01, 0x03, 0x0a, 0x64, 0x10, 0x00, 0x90, + 0x98, 0xc0, 0x3c, 0x91, 0x63, 0x00, 0x2f, 0x0a, 0x82, 0x98, 0x07, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0xe2, 0x03, 0x0f, 0x2a, 0x07, 0x9b, 0x00, 0xa9, + 0x05, 0x0f, 0x00, 0xf9, 0x1d, 0xfe, 0xff, 0x97, 0x1f, 0x10, 0x00, 0x71, + 0xc1, 0x10, 0x00, 0x54, 0x42, 0x02, 0x40, 0xf9, 0x64, 0x4a, 0x40, 0xb9, + 0xa7, 0x9a, 0x40, 0xa9, 0xa5, 0x0e, 0x40, 0xf9, 0x88, 0xff, 0xff, 0x17, + 0xf9, 0x6b, 0x04, 0xa9, 0xe0, 0x03, 0x15, 0xaa, 0xa6, 0x82, 0x00, 0x91, + 0xff, 0x7f, 0x05, 0xa9, 0xe5, 0x43, 0x01, 0x91, 0x00, 0x20, 0x00, 0x91, + 0xff, 0x7f, 0x06, 0xa9, 0x07, 0x00, 0x80, 0x52, 0x17, 0x00, 0x80, 0x52, + 0x02, 0x01, 0x00, 0xb4, 0x43, 0x48, 0x40, 0xb9, 0x41, 0x14, 0x41, 0xb9, + 0x7f, 0x00, 0x04, 0x6b, 0xf7, 0x02, 0x01, 0x2a, 0x69, 0x00, 0x00, 0x54, + 0xa2, 0x58, 0x27, 0xf8, 0xe7, 0x04, 0x00, 0x11, 0xdf, 0x00, 0x00, 0xeb, + 0xa0, 0x00, 0x00, 0x54, 0x02, 0x00, 0x40, 0xf9, 0x00, 0x20, 0x00, 0x91, + 0xa2, 0xfe, 0xff, 0xb5, 0xfb, 0xff, 0xff, 0x17, 0xff, 0x04, 0x00, 0x71, + 0x29, 0x05, 0x00, 0x54, 0xea, 0x04, 0x00, 0x51, 0xe9, 0x03, 0x05, 0xaa, + 0x08, 0x05, 0x00, 0x11, 0x1f, 0x01, 0x07, 0x6b, 0xe1, 0x03, 0x08, 0x2a, + 0x24, 0x01, 0x40, 0xf9, 0xe3, 0x00, 0x00, 0x54, 0x1e, 0x00, 0x00, 0x14, + 0x20, 0x01, 0x00, 0xf9, 0xa4, 0x78, 0x23, 0xf8, 0xe4, 0x03, 0x00, 0xaa, + 0x3f, 0x00, 0x07, 0x6b, 0x22, 0x03, 0x00, 0x54, 0xe3, 0x03, 0x01, 0x2a, + 0x86, 0x48, 0x40, 0xb9, 0xa0, 0x78, 0x63, 0xf8, 0x02, 0x48, 0x40, 0xb9, + 0x5f, 0x00, 0x06, 0x6b, 0xc8, 0xfe, 0xff, 0x54, 0x60, 0x00, 0x00, 0x54, + 0x21, 0x04, 0x00, 0x11, 0xf6, 0xff, 0xff, 0x17, 0xc6, 0x59, 0x62, 0xf8, + 0x82, 0x18, 0x40, 0xf9, 0x5f, 0x00, 0x06, 0xeb, 0xa1, 0x00, 0x00, 0x54, + 0xfa, 0xff, 0xff, 0x17, 0x42, 0x18, 0x40, 0xf9, 0xdf, 0x00, 0x02, 0xeb, + 0xe0, 0xfe, 0xff, 0x54, 0x1f, 0x00, 0x02, 0xeb, 0x81, 0xff, 0xff, 0x54, + 0x20, 0x01, 0x00, 0xf9, 0x21, 0x04, 0x00, 0x11, 0xa4, 0x78, 0x23, 0xf8, + 0xe4, 0x03, 0x00, 0xaa, 0xe7, 0xff, 0xff, 0x17, 0x29, 0x21, 0x00, 0x91, + 0x1f, 0x01, 0x0a, 0x6b, 0x61, 0xfb, 0xff, 0x54, 0xf9, 0x2b, 0x40, 0xf9, + 0x59, 0x07, 0x00, 0xb4, 0x32, 0x03, 0x41, 0xb9, 0x3a, 0x00, 0x80, 0x52, + 0x64, 0x10, 0x00, 0x90, 0x98, 0xc0, 0x3c, 0x91, 0xee, 0x03, 0x05, 0xaa, + 0x41, 0x23, 0xd2, 0x1a, 0xff, 0x01, 0x01, 0x6a, 0x40, 0x01, 0x00, 0x54, + 0x22, 0x00, 0x00, 0x14, 0xb9, 0x7a, 0x32, 0xf8, 0xce, 0x21, 0x00, 0x91, + 0xd9, 0x01, 0x40, 0xf9, 0xb9, 0x05, 0x00, 0xb4, 0x32, 0x03, 0x41, 0xb9, + 0x41, 0x23, 0xd2, 0x1a, 0x3f, 0x00, 0x0f, 0x6a, 0x41, 0x03, 0x00, 0x54, + 0xf2, 0x03, 0x12, 0x2a, 0xef, 0x01, 0x17, 0x0a, 0xe3, 0x02, 0x2f, 0x0a, + 0xe2, 0x03, 0x0f, 0x2a, 0xe0, 0x03, 0x13, 0xaa, 0xbf, 0x7a, 0x32, 0xf8, + 0xa4, 0x02, 0x40, 0xf9, 0x04, 0x03, 0x00, 0xf9, 0xa4, 0x06, 0x40, 0xf9, + 0x04, 0x07, 0x00, 0xf9, 0xa4, 0x0a, 0x40, 0xf9, 0x04, 0x0b, 0x00, 0xf9, + 0xa4, 0x0e, 0x40, 0xf9, 0x04, 0x0f, 0x00, 0xf9, 0xb3, 0xfd, 0xff, 0x97, + 0x1f, 0x10, 0x00, 0x71, 0x00, 0xfd, 0xff, 0x54, 0xe0, 0x03, 0x14, 0x2a, + 0x77, 0x10, 0x00, 0x90, 0xf7, 0x02, 0x3f, 0x91, 0xbf, 0x7e, 0x00, 0xa9, + 0xbf, 0x7e, 0x01, 0xa9, 0x0b, 0xfe, 0xff, 0x97, 0xf9, 0x6b, 0x44, 0xa9, + 0x8b, 0xfe, 0xff, 0x17, 0xe1, 0x03, 0x12, 0x2a, 0x72, 0x02, 0x01, 0xb9, + 0x77, 0x10, 0x00, 0x90, 0xf7, 0x02, 0x3f, 0x91, 0x9f, 0x02, 0x12, 0x6b, + 0xb3, 0x7a, 0x21, 0xf8, 0xa0, 0x02, 0x00, 0x54, 0xe1, 0x7a, 0x61, 0xf8, + 0x3f, 0x00, 0x00, 0xf1, 0x64, 0x12, 0x41, 0xfa, 0x20, 0x02, 0x00, 0x54, + 0xe0, 0x03, 0x12, 0x2a, 0xf0, 0xfd, 0xff, 0x97, 0xf9, 0x6b, 0x44, 0xa9, + 0x7c, 0xfe, 0xff, 0x17, 0x77, 0x10, 0x00, 0x90, 0xf7, 0x02, 0x3f, 0x91, + 0xf9, 0x6b, 0x44, 0xa9, 0x78, 0xfe, 0xff, 0x17, 0xe0, 0x03, 0x14, 0x2a, + 0x5f, 0x02, 0x00, 0xf9, 0x77, 0x10, 0x00, 0x90, 0xf7, 0x02, 0x3f, 0x91, + 0xbf, 0xfe, 0x00, 0xa9, 0xbf, 0x0e, 0x00, 0xf9, 0xef, 0xfd, 0xff, 0x97, + 0x70, 0xfe, 0xff, 0x17, 0xf9, 0x6b, 0x44, 0xa9, 0x6e, 0xfe, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x61, 0xf1, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0xb7, 0xf1, 0xff, 0x97, + 0xe1, 0x03, 0x00, 0x2a, 0x62, 0x10, 0x00, 0x90, 0x42, 0x00, 0x38, 0x91, + 0x42, 0x78, 0x61, 0xb8, 0xe2, 0x03, 0x00, 0x35, 0x74, 0x10, 0x00, 0x90, + 0x80, 0xba, 0x4f, 0xb9, 0x80, 0x03, 0x00, 0x35, 0x62, 0x10, 0x00, 0xb0, + 0x42, 0x00, 0x00, 0x91, 0x60, 0x10, 0x00, 0x90, 0x00, 0x00, 0x3f, 0x91, + 0x00, 0x78, 0x61, 0xf8, 0xf5, 0x13, 0x00, 0xf9, 0x55, 0x78, 0x61, 0xf8, + 0x1f, 0x00, 0x15, 0xeb, 0x40, 0x02, 0x00, 0x54, 0x15, 0x01, 0x00, 0xb4, + 0x4c, 0xf1, 0xff, 0x97, 0xa2, 0x02, 0x40, 0xb9, 0x81, 0x48, 0x8a, 0x52, + 0x01, 0x89, 0xaa, 0x72, 0x5f, 0x00, 0x01, 0x6b, 0x00, 0x02, 0x00, 0x54, + 0x26, 0xf1, 0xff, 0x97, 0x81, 0xba, 0x4f, 0xb9, 0xe0, 0x03, 0x13, 0x2a, + 0x21, 0x04, 0x00, 0x11, 0x81, 0xba, 0x0f, 0xb9, 0x21, 0xf1, 0xff, 0x97, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xbb, 0xf0, 0xff, 0x17, 0xf5, 0x13, 0x40, 0xf9, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0x18, 0xf1, 0xff, 0x17, + 0xa1, 0x06, 0x40, 0xf9, 0xa2, 0xa2, 0x40, 0xf9, 0x3f, 0x00, 0x02, 0xeb, + 0x42, 0x00, 0x00, 0x54, 0xa1, 0xa2, 0x00, 0xf9, 0xa2, 0x0a, 0x40, 0xf9, + 0xe3, 0xdb, 0x03, 0x32, 0x41, 0x00, 0x40, 0xb9, 0x3f, 0x00, 0x03, 0x6b, + 0xa1, 0x00, 0x00, 0x54, 0xa3, 0x0e, 0x40, 0xf9, 0x63, 0x10, 0x40, 0xb8, + 0x7f, 0x00, 0x01, 0x6b, 0x00, 0x02, 0x00, 0x54, 0x09, 0xf1, 0xff, 0x97, + 0xe0, 0x03, 0x15, 0xaa, 0x1f, 0x00, 0x00, 0x94, 0x26, 0xf1, 0xff, 0x97, + 0xa1, 0xa2, 0x40, 0xf9, 0x22, 0xc0, 0x5f, 0xb8, 0xe1, 0xdb, 0x03, 0x32, + 0x5f, 0x00, 0x01, 0x6b, 0x60, 0xfb, 0xff, 0x54, 0x00, 0xf1, 0xff, 0x97, + 0xe0, 0x03, 0x15, 0xaa, 0x26, 0x00, 0x00, 0x94, 0x1d, 0xf1, 0xff, 0x97, + 0xfc, 0xf0, 0xff, 0x97, 0xd6, 0xff, 0xff, 0x17, 0xa1, 0xa2, 0x40, 0xf9, + 0x5f, 0x00, 0x01, 0xeb, 0x89, 0xfe, 0xff, 0x54, 0xee, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, + 0x10, 0xf1, 0xff, 0x97, 0x61, 0x10, 0x00, 0x90, 0x33, 0x14, 0x00, 0xf9, + 0xed, 0xf0, 0xff, 0x97, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0xaa, + 0x04, 0xf1, 0xff, 0x97, 0x61, 0x10, 0x00, 0x90, 0x21, 0x14, 0x40, 0xf9, + 0xf3, 0x03, 0x00, 0x2a, 0x61, 0x00, 0x00, 0xb4, 0xe0, 0x03, 0x14, 0xaa, + 0x20, 0x00, 0x3f, 0xd6, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xda, 0xf0, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0xf4, 0xf0, 0xff, 0x97, 0xe1, 0x03, 0x00, 0x2a, + 0xd3, 0x00, 0x00, 0xb4, 0x63, 0x02, 0x40, 0xb9, 0x82, 0x48, 0x8a, 0x52, + 0x02, 0x89, 0xaa, 0x72, 0x7f, 0x00, 0x02, 0x6b, 0xa0, 0x00, 0x00, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xe0, 0x03, 0x01, 0x2a, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc9, 0xf0, 0xff, 0x17, 0x74, 0x0a, 0x40, 0xf9, 0x74, 0xff, 0xff, 0xb4, + 0xf5, 0x5b, 0x02, 0xa9, 0x76, 0xa2, 0x40, 0xf9, 0x96, 0x03, 0x00, 0xb4, + 0xc3, 0xf0, 0xff, 0x97, 0xe2, 0xdb, 0x03, 0x32, 0x1f, 0x20, 0x03, 0xd5, + 0xc0, 0x02, 0x14, 0xcb, 0x01, 0x84, 0x43, 0xd3, 0x00, 0xfc, 0x42, 0x93, + 0x95, 0x0a, 0x01, 0x8b, 0x81, 0x7a, 0x61, 0xb8, 0x3f, 0x00, 0x02, 0x6b, + 0xd6, 0x02, 0x95, 0x9a, 0xb4, 0x02, 0x94, 0x9a, 0x1f, 0x0c, 0x00, 0x71, + 0xe8, 0xfe, 0xff, 0x54, 0xe0, 0xdb, 0x03, 0x32, 0x3f, 0x00, 0x00, 0x6b, + 0xa1, 0x00, 0x00, 0x54, 0x1f, 0x20, 0x03, 0xd5, 0xa0, 0x4e, 0x40, 0xb8, + 0x1f, 0x00, 0x01, 0x6b, 0xc0, 0xff, 0xff, 0x54, 0xcf, 0xf0, 0xff, 0x97, + 0xe1, 0x03, 0x00, 0x2a, 0x62, 0x02, 0x40, 0xb9, 0x80, 0x48, 0x8a, 0x52, + 0x00, 0x89, 0xaa, 0x72, 0x5f, 0x00, 0x00, 0x6b, 0xc0, 0x00, 0x00, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xe0, 0x03, 0x01, 0x2a, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xa4, 0xf0, 0xff, 0x17, 0x60, 0x0a, 0x40, 0xf9, + 0x1f, 0x00, 0x15, 0xeb, 0x22, 0xff, 0xff, 0x54, 0x60, 0xa2, 0x40, 0xf9, + 0x1f, 0x00, 0x15, 0xeb, 0xc9, 0xfe, 0xff, 0x54, 0xa2, 0x02, 0x40, 0xb9, + 0xe0, 0xdb, 0x03, 0x32, 0x5f, 0x00, 0x00, 0x6b, 0x40, 0xfe, 0xff, 0x54, + 0x75, 0xa2, 0x00, 0xf9, 0xf5, 0x5b, 0x42, 0xa9, 0xcb, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb8, 0xa9, + 0xe8, 0x01, 0x80, 0x52, 0x4c, 0x10, 0x00, 0xf0, 0x8c, 0xe1, 0x33, 0x91, + 0xfd, 0x03, 0x00, 0x91, 0x50, 0x10, 0x00, 0xf0, 0x0f, 0xd2, 0x47, 0xf9, + 0xf3, 0x53, 0x01, 0xa9, 0x41, 0x10, 0x00, 0xf0, 0x34, 0xc0, 0x3c, 0x91, + 0x4e, 0x10, 0x00, 0xf0, 0xce, 0x41, 0x38, 0x91, 0xed, 0x03, 0x08, 0x2a, + 0xea, 0x43, 0x01, 0x91, 0xeb, 0x83, 0x01, 0x91, 0x3f, 0x98, 0x07, 0xf9, + 0x11, 0x00, 0x80, 0x52, 0x01, 0x00, 0x80, 0xd2, 0x07, 0x00, 0x80, 0x52, + 0x09, 0x00, 0x80, 0x52, 0x9f, 0xfe, 0x00, 0xa9, 0x9f, 0x0e, 0x00, 0xf9, + 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x00, 0x2a, 0x20, 0x00, 0x80, 0x52, + 0xf7, 0x63, 0x03, 0xa9, 0xf9, 0x23, 0x00, 0xf9, 0x1f, 0x20, 0x03, 0xd5, + 0x21, 0x04, 0x00, 0xb4, 0x23, 0x14, 0x41, 0xb9, 0xa2, 0x01, 0x08, 0x2a, + 0x42, 0x00, 0x03, 0x6a, 0x40, 0x08, 0x00, 0x54, 0x33, 0x58, 0x40, 0xb9, + 0x3e, 0x48, 0x40, 0xb9, 0x7f, 0x02, 0x1e, 0x6b, 0x62, 0x32, 0x51, 0x7a, + 0x24, 0x99, 0x40, 0x7a, 0x81, 0x07, 0x00, 0x54, 0x04, 0x01, 0x02, 0x6a, + 0xe0, 0x0c, 0x00, 0x54, 0x22, 0x00, 0x41, 0xb9, 0x03, 0x20, 0xc2, 0x1a, + 0x9f, 0x00, 0x03, 0x6a, 0x60, 0x0b, 0x00, 0x54, 0x81, 0x5a, 0x22, 0xf8, + 0x08, 0x01, 0x23, 0x0a, 0x29, 0x05, 0x00, 0x11, 0x7f, 0x02, 0x1e, 0x6b, + 0xa3, 0x14, 0x00, 0x54, 0x82, 0x59, 0x67, 0xf8, 0xf1, 0x03, 0x07, 0x2a, + 0x21, 0x18, 0x40, 0xf9, 0x5f, 0x00, 0x01, 0xeb, 0x01, 0x06, 0x00, 0x54, + 0xff, 0x7c, 0x00, 0x71, 0xe2, 0x04, 0x00, 0x11, 0x20, 0x01, 0x00, 0x54, + 0xe7, 0x03, 0x02, 0x2a, 0x01, 0x00, 0x80, 0xd2, 0x2a, 0x00, 0x00, 0x14, + 0xc1, 0x01, 0x40, 0xb9, 0x21, 0x24, 0xc7, 0x1a, 0x3f, 0x00, 0x00, 0x71, + 0xe2, 0x18, 0x5f, 0x7a, 0x09, 0x05, 0x00, 0x54, 0x60, 0x10, 0x00, 0x90, + 0x16, 0x00, 0x00, 0x91, 0x57, 0x10, 0x00, 0xf0, 0xf7, 0x02, 0x3f, 0x91, + 0x58, 0x10, 0x00, 0xf0, 0x18, 0x03, 0x38, 0x91, 0x1f, 0x00, 0x00, 0xf9, + 0x13, 0x00, 0x80, 0xd2, 0xf9, 0xcf, 0x04, 0x32, 0xdf, 0xfe, 0x00, 0xa9, + 0xdf, 0x0e, 0x00, 0xf9, 0x80, 0x7a, 0x73, 0xf8, 0xc0, 0x7a, 0x33, 0xf8, + 0xbf, 0x02, 0x13, 0x6b, 0xe1, 0x03, 0x13, 0x2a, 0x00, 0x01, 0x00, 0x54, + 0xe2, 0x7a, 0x73, 0xf8, 0x5f, 0x00, 0x00, 0xf1, 0x04, 0x10, 0x42, 0xfa, + 0x80, 0x00, 0x00, 0x54, 0x00, 0x7b, 0x61, 0xb8, 0x1f, 0x00, 0x19, 0x6b, + 0x83, 0x06, 0x00, 0x54, 0x73, 0x06, 0x00, 0x91, 0x7f, 0x12, 0x00, 0xf1, + 0x41, 0xfe, 0xff, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc8, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x82, 0x59, 0x67, 0xf8, 0x21, 0x18, 0x40, 0xf9, + 0x5f, 0x00, 0x01, 0xeb, 0xa0, 0x03, 0x00, 0x54, 0x3f, 0x0d, 0x00, 0x71, + 0xa9, 0xf6, 0xff, 0x54, 0xda, 0xff, 0xff, 0x17, 0x21, 0x00, 0xc0, 0x5a, + 0x21, 0x10, 0xc0, 0x5a, 0xe7, 0x00, 0x01, 0x0b, 0xff, 0x80, 0x00, 0x71, + 0xa0, 0xfa, 0xff, 0x54, 0x4f, 0x01, 0x00, 0xb4, 0xe1, 0x59, 0x40, 0xb9, + 0x3f, 0x00, 0x07, 0x6b, 0xe8, 0x00, 0x00, 0x54, 0xe1, 0x49, 0x40, 0xb9, + 0x3f, 0x00, 0x07, 0x6b, 0xc3, 0xf9, 0xff, 0x54, 0xe7, 0x03, 0x01, 0x2a, + 0xe1, 0x03, 0x0f, 0xaa, 0xef, 0xff, 0xff, 0x17, 0x81, 0x59, 0x67, 0xf8, + 0xa4, 0xff, 0xff, 0x17, 0xff, 0x01, 0x01, 0xeb, 0xe0, 0xf8, 0xff, 0x54, + 0x82, 0x59, 0x67, 0xf8, 0xed, 0x03, 0x16, 0x2a, 0x21, 0x18, 0x40, 0xf9, + 0x5f, 0x00, 0x01, 0xeb, 0xc1, 0xfc, 0xff, 0x54, 0x1f, 0x20, 0x03, 0xd5, + 0xe7, 0x04, 0x00, 0x11, 0xff, 0x80, 0x00, 0x71, 0xc0, 0xf7, 0xff, 0x54, + 0x01, 0x00, 0x80, 0xd2, 0xe0, 0xff, 0xff, 0x17, 0x82, 0x00, 0xc0, 0x5a, + 0x42, 0x10, 0xc0, 0x5a, 0x22, 0x00, 0x01, 0xb9, 0x03, 0x20, 0xc2, 0x1a, + 0xa2, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x13, 0x2a, 0x79, 0xf0, 0xff, 0x97, + 0xcb, 0xff, 0xff, 0x17, 0x25, 0x00, 0x41, 0xb9, 0xb6, 0x01, 0x22, 0x0a, + 0x03, 0x20, 0xc5, 0x1a, 0x46, 0x00, 0x03, 0x6a, 0xe0, 0x00, 0x00, 0x54, + 0xe4, 0x03, 0x05, 0x2a, 0xe5, 0x53, 0x00, 0xb9, 0x42, 0x00, 0x23, 0x6a, + 0x26, 0x00, 0x80, 0x52, 0x61, 0x79, 0x24, 0xf8, 0x60, 0x01, 0x00, 0x54, + 0x43, 0x00, 0xc0, 0x5a, 0x63, 0x10, 0xc0, 0x5a, 0x43, 0x59, 0x26, 0xb8, + 0xe4, 0x03, 0x03, 0x2a, 0xc6, 0x04, 0x00, 0x11, 0x03, 0x20, 0xc3, 0x1a, + 0x42, 0x00, 0x23, 0x6a, 0x61, 0x79, 0x24, 0xf8, 0x01, 0xff, 0xff, 0x54, + 0xe4, 0x53, 0x40, 0xb9, 0xf2, 0x03, 0x16, 0x2a, 0x03, 0x00, 0x80, 0xd2, + 0x05, 0x00, 0x00, 0x14, 0x63, 0x04, 0x00, 0x91, 0xdf, 0x00, 0x03, 0x6b, + 0x20, 0xfa, 0xff, 0x54, 0x44, 0x79, 0x63, 0xb8, 0x85, 0x7a, 0x64, 0xf8, + 0x65, 0xff, 0xff, 0xb4, 0xa2, 0x14, 0x41, 0xb9, 0x42, 0x00, 0x12, 0x6a, + 0x00, 0xff, 0xff, 0x54, 0x17, 0x01, 0x02, 0x6a, 0x81, 0x01, 0x00, 0x54, + 0x52, 0x02, 0x22, 0x0a, 0x44, 0x00, 0xc0, 0x5a, 0x84, 0x10, 0xc0, 0x5a, + 0x44, 0x59, 0x26, 0xb8, 0xf7, 0x03, 0x04, 0x2a, 0xc6, 0x04, 0x00, 0x11, + 0x04, 0x20, 0xc4, 0x1a, 0x42, 0x00, 0x24, 0x6a, 0x65, 0x79, 0x37, 0xf8, + 0x01, 0xff, 0xff, 0x54, 0xeb, 0xff, 0xff, 0x17, 0xa3, 0x00, 0x41, 0xb9, + 0xe4, 0x03, 0x03, 0x2a, 0x62, 0x79, 0x64, 0xf8, 0x5f, 0x00, 0x01, 0xeb, + 0x20, 0x01, 0x00, 0x54, 0xe6, 0x03, 0x03, 0x2a, 0x43, 0x00, 0x41, 0xb9, + 0x82, 0x7a, 0x24, 0xf8, 0xe4, 0x03, 0x03, 0x2a, 0x46, 0x00, 0x01, 0xb9, + 0x62, 0x79, 0x64, 0xf8, 0x5f, 0x00, 0x01, 0xeb, 0x21, 0xff, 0xff, 0x54, + 0xf7, 0x02, 0xc0, 0x5a, 0x81, 0x7a, 0x24, 0xf8, 0xf7, 0x12, 0xc0, 0x5a, + 0x23, 0x00, 0x01, 0xb9, 0xe2, 0x03, 0x17, 0x2a, 0xb7, 0x00, 0x01, 0xb9, + 0x04, 0x20, 0xd7, 0x1a, 0x29, 0x05, 0x00, 0x11, 0x08, 0x01, 0x24, 0x0a, + 0x7f, 0x02, 0x1e, 0x6b, 0x85, 0x7a, 0x22, 0xf8, 0xa2, 0xeb, 0xff, 0x54, + 0x64, 0x10, 0x00, 0x90, 0x40, 0x10, 0x00, 0xf0, 0x00, 0x60, 0x38, 0x91, + 0x23, 0x00, 0x80, 0x52, 0x82, 0x30, 0x40, 0xb9, 0x63, 0x20, 0xde, 0x1a, + 0x01, 0xd2, 0x07, 0xf9, 0x42, 0x00, 0x03, 0x2a, 0x82, 0x30, 0x00, 0xb9, + 0x01, 0x58, 0x3e, 0xf8, 0x62, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbf, 0xa9, + 0x61, 0x10, 0x00, 0x90, 0xe0, 0xcf, 0x04, 0x32, 0xfd, 0x03, 0x00, 0x91, + 0x3f, 0x20, 0x00, 0xb9, 0x1b, 0x00, 0x00, 0x94, 0x41, 0x10, 0x00, 0xf0, + 0x21, 0x80, 0x3f, 0x91, 0x43, 0x10, 0x00, 0xf0, 0x63, 0x60, 0x3c, 0x91, + 0x42, 0x10, 0x00, 0xf0, 0x42, 0xc0, 0x3c, 0x91, 0x3f, 0x7c, 0x00, 0xa9, + 0x04, 0x00, 0x80, 0x12, 0x06, 0x00, 0x80, 0x92, 0x07, 0x00, 0x80, 0x92, + 0x5f, 0x7c, 0x00, 0xa9, 0x45, 0x10, 0x00, 0xf0, 0x66, 0x1c, 0x00, 0xa9, + 0xa8, 0x00, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0x24, 0x04, 0x00, 0xb9, + 0x5f, 0x7c, 0x01, 0xa9, 0x3f, 0x08, 0x00, 0xf9, 0x64, 0x10, 0x00, 0xb9, + 0x3f, 0x18, 0x00, 0xb9, 0xa8, 0xfc, 0x0f, 0xb9, 0xfd, 0x7b, 0xc1, 0xa8, + 0xd0, 0xef, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x42, 0x10, 0x00, 0xf0, 0x41, 0x00, 0x38, 0x91, + 0x20, 0x0c, 0x00, 0xb9, 0x20, 0x08, 0x00, 0xb9, 0x20, 0x04, 0x00, 0xb9, + 0x40, 0x00, 0x0e, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x13, 0x00, 0xf9, + 0x80, 0x08, 0x00, 0xb4, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, + 0xf4, 0x03, 0x01, 0x2a, 0x80, 0x48, 0x8a, 0x52, 0x00, 0x89, 0xaa, 0x72, + 0x61, 0x02, 0x40, 0xb9, 0xd5, 0x01, 0x80, 0x52, 0x3f, 0x00, 0x00, 0x6b, + 0xc0, 0x00, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0xe0, 0x03, 0x15, 0x2a, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x96, 0xef, 0xff, 0x97, 0x74, 0x12, 0x01, 0xb9, 0xe1, 0x03, 0x34, 0x2a, + 0x63, 0x02, 0x41, 0xb9, 0x21, 0x0c, 0x00, 0x12, 0x61, 0x16, 0x01, 0xb9, + 0x22, 0x00, 0x80, 0x52, 0xf4, 0x03, 0x00, 0x2a, 0x42, 0x20, 0xc3, 0x1a, + 0x5f, 0x00, 0x01, 0x6a, 0xc1, 0x00, 0x00, 0x54, 0x3f, 0x00, 0x00, 0x71, + 0x21, 0x00, 0xc0, 0x5a, 0x21, 0x10, 0xc0, 0x5a, 0xe1, 0x03, 0x81, 0x1a, + 0x61, 0x02, 0x01, 0xb9, 0x60, 0x4e, 0x40, 0xb9, 0x80, 0x03, 0x00, 0x35, + 0xdc, 0xef, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0xce, 0xfe, 0xff, 0x97, + 0xe0, 0x03, 0x13, 0x2a, 0x62, 0x10, 0x00, 0x90, 0x42, 0x00, 0x00, 0x91, + 0x41, 0x10, 0x00, 0xf0, 0x21, 0x00, 0x3f, 0x91, 0x42, 0x78, 0x60, 0xf8, + 0x21, 0x78, 0x60, 0xf8, 0x5f, 0x00, 0x01, 0xeb, 0x00, 0x02, 0x00, 0x54, + 0x41, 0x10, 0x00, 0xf0, 0x21, 0x00, 0x38, 0x91, 0x20, 0x78, 0x60, 0xb8, + 0x80, 0x01, 0x00, 0x35, 0x41, 0x10, 0x00, 0xf0, 0x35, 0xb8, 0x4f, 0xb9, + 0x35, 0x01, 0x00, 0x35, 0x22, 0xb8, 0x4f, 0xb9, 0xe0, 0x03, 0x14, 0x2a, + 0x42, 0x04, 0x00, 0x11, 0x22, 0xb8, 0x0f, 0xb9, 0x4d, 0xef, 0xff, 0x97, + 0xea, 0xee, 0xff, 0x97, 0xf3, 0x53, 0x41, 0xa9, 0xd0, 0xff, 0xff, 0x17, + 0xe0, 0x03, 0x14, 0x2a, 0x15, 0x00, 0x80, 0x52, 0x47, 0xef, 0xff, 0x97, + 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xd5, 0x01, 0x80, 0x52, + 0xe0, 0x03, 0x15, 0x2a, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf5, 0x13, 0x00, 0xf9, 0xf5, 0x03, 0x00, 0x2a, + 0x57, 0xef, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0x93, 0xef, 0xff, 0x97, + 0xc0, 0x03, 0x00, 0xb4, 0xf3, 0x03, 0x00, 0xaa, 0x9a, 0xef, 0xff, 0x97, + 0x60, 0x03, 0x00, 0x35, 0x41, 0x10, 0x00, 0xd0, 0x21, 0x80, 0x2d, 0x91, + 0x7f, 0x02, 0x01, 0xeb, 0xe0, 0x02, 0x00, 0x54, 0xb5, 0x03, 0x00, 0x34, + 0x41, 0x10, 0x00, 0xf0, 0x20, 0xb8, 0x4f, 0xb9, 0x60, 0x02, 0x00, 0x35, + 0x22, 0xb8, 0x4f, 0xb9, 0x83, 0x00, 0x80, 0x52, 0x20, 0x00, 0x80, 0x52, + 0x63, 0x4e, 0x00, 0xb9, 0x42, 0x04, 0x00, 0x11, 0x60, 0x56, 0x00, 0xb9, + 0x75, 0x7a, 0x00, 0xb9, 0xe0, 0x03, 0x14, 0x2a, 0x7f, 0xee, 0x00, 0xb9, + 0x22, 0xb8, 0x0f, 0xb9, 0x1e, 0xef, 0xff, 0x97, 0xe0, 0x03, 0x13, 0xaa, + 0x80, 0xf9, 0xff, 0x97, 0x60, 0xee, 0x40, 0xb9, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0x03, 0x14, 0x2a, 0x15, 0xef, 0xff, 0x97, 0x60, 0x02, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x14, 0x2a, 0x0e, 0xef, 0xff, 0x97, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf5, 0x13, 0x00, 0xf9, + 0x62, 0xef, 0xff, 0x97, 0xf3, 0x03, 0x00, 0xaa, 0x22, 0xef, 0xff, 0x97, + 0x74, 0xa6, 0x40, 0xf9, 0x00, 0xef, 0xff, 0x97, 0x94, 0x00, 0x00, 0xb4, + 0xe0, 0x03, 0x13, 0xaa, 0x01, 0x00, 0x80, 0x52, 0x80, 0x02, 0x3f, 0xd6, + 0x60, 0x72, 0x40, 0xb9, 0x61, 0x36, 0x40, 0xf9, 0x20, 0x00, 0x3f, 0xd6, + 0x40, 0x10, 0x00, 0xf0, 0x01, 0xfc, 0x46, 0xf9, 0x61, 0x00, 0x00, 0xb4, + 0xe0, 0x03, 0x13, 0xaa, 0x20, 0x00, 0x3f, 0xd6, 0x13, 0xef, 0xff, 0x97, + 0x34, 0x00, 0x80, 0x52, 0x41, 0x10, 0x00, 0xf0, 0x22, 0xb8, 0x4f, 0xb9, + 0x75, 0xa6, 0x40, 0xf9, 0x42, 0x00, 0x14, 0x0b, 0x74, 0x4e, 0x00, 0xb9, + 0x74, 0x56, 0x00, 0xb9, 0x7f, 0x7a, 0x00, 0xb9, 0x22, 0xb8, 0x0f, 0xb9, + 0xe9, 0xee, 0xff, 0x97, 0x95, 0x00, 0x00, 0xb4, 0xe1, 0x03, 0x14, 0x2a, + 0xe0, 0x03, 0x13, 0xaa, 0xa0, 0x02, 0x3f, 0xd6, 0xe0, 0x03, 0x13, 0xaa, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0x44, 0xf9, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0xf5, 0x13, 0x00, 0xf9, + 0xf7, 0xee, 0xff, 0x97, 0x61, 0x4e, 0x40, 0xb9, 0x3f, 0x0c, 0x00, 0x71, + 0xc0, 0x01, 0x00, 0x54, 0xf4, 0x03, 0x00, 0x2a, 0x60, 0x52, 0x40, 0xb9, + 0x55, 0x02, 0x80, 0x52, 0x60, 0x00, 0x00, 0x34, 0x35, 0x03, 0x80, 0x52, + 0x7f, 0x52, 0x00, 0xb9, 0xe0, 0x03, 0x14, 0x2a, 0xcc, 0xee, 0xff, 0x97, + 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x42, 0x10, 0x00, 0xf0, + 0x41, 0xb8, 0x4f, 0xb9, 0x15, 0x00, 0x80, 0x52, 0x21, 0x04, 0x00, 0x11, + 0x41, 0xb8, 0x0f, 0xb9, 0xc1, 0xee, 0xff, 0x97, 0xe0, 0x03, 0x13, 0xaa, + 0x83, 0xfb, 0xff, 0x97, 0xde, 0xee, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0x24, 0xef, 0xff, 0x97, 0xe1, 0xcf, 0x04, 0x32, 0x1f, 0x00, 0x01, 0x6b, + 0x83, 0xfd, 0xff, 0x54, 0x61, 0x10, 0x00, 0x90, 0x40, 0x10, 0x00, 0xf0, + 0x3f, 0x30, 0x00, 0xb9, 0x1f, 0xd0, 0x07, 0xf9, 0x2c, 0xef, 0xff, 0x97, + 0x1f, 0xfe, 0xff, 0x97, 0xe5, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf5, 0x5b, 0x02, 0xa9, 0xf7, 0x63, 0x03, 0xa9, 0xf9, 0x6b, 0x04, 0xa9, + 0xca, 0xee, 0xff, 0x97, 0xf7, 0x03, 0x00, 0x2a, 0x20, 0xef, 0xff, 0x97, + 0xf8, 0x03, 0x00, 0x2a, 0x41, 0x10, 0x00, 0xf0, 0x21, 0x00, 0x3f, 0x91, + 0x40, 0x10, 0x00, 0xd0, 0x00, 0x00, 0x2d, 0x91, 0xf6, 0x03, 0x18, 0xaa, + 0x33, 0x78, 0x78, 0xf8, 0x61, 0x2a, 0x40, 0xb9, 0x01, 0x78, 0x38, 0xb8, + 0xbe, 0xee, 0xff, 0x97, 0x62, 0x02, 0x40, 0xb9, 0x81, 0x48, 0x8a, 0x52, + 0x01, 0x89, 0xaa, 0x72, 0x5f, 0x00, 0x01, 0x6b, 0x80, 0x10, 0x00, 0x54, + 0x98, 0xee, 0xff, 0x97, 0x79, 0x4a, 0x40, 0xb9, 0x40, 0x10, 0x00, 0xf0, + 0x00, 0xe0, 0x33, 0x91, 0xfa, 0x03, 0x19, 0x2a, 0x01, 0x78, 0x7a, 0xf8, + 0x22, 0x1c, 0x40, 0xf9, 0x7f, 0x02, 0x02, 0xeb, 0xa0, 0x05, 0x00, 0x54, + 0x7f, 0x02, 0x01, 0xeb, 0x74, 0x1a, 0x40, 0xf9, 0xa0, 0x08, 0x00, 0x54, + 0x60, 0x1e, 0x40, 0xf9, 0x80, 0x1e, 0x00, 0xf9, 0x75, 0x10, 0x00, 0x90, + 0xb5, 0x02, 0x00, 0x91, 0x14, 0x18, 0x00, 0xf9, 0x53, 0x18, 0x00, 0xf9, + 0x33, 0x1c, 0x00, 0xf9, 0x61, 0x0a, 0x03, 0xa9, 0x62, 0x02, 0x41, 0xb9, + 0x60, 0x5a, 0x40, 0xb9, 0xe3, 0x03, 0x02, 0x2a, 0xa1, 0x7a, 0x63, 0xf8, + 0x3f, 0x00, 0x13, 0xeb, 0x00, 0x08, 0x00, 0x54, 0x1f, 0x00, 0x19, 0x6b, + 0xa3, 0x03, 0x00, 0x54, 0xe0, 0x03, 0x16, 0x2a, 0xe7, 0xfd, 0xff, 0x97, + 0xb4, 0x7a, 0x78, 0xf8, 0x9f, 0x02, 0x13, 0xeb, 0x80, 0x12, 0x00, 0x54, + 0x97, 0xee, 0xff, 0x97, 0xd4, 0x00, 0x00, 0xb4, 0x82, 0x02, 0x40, 0xb9, + 0x81, 0x48, 0x8a, 0x52, 0x01, 0x89, 0xaa, 0x72, 0x5f, 0x00, 0x01, 0x6b, + 0x80, 0x12, 0x00, 0x54, 0x70, 0xee, 0xff, 0x97, 0x42, 0x10, 0x00, 0xf0, + 0x41, 0xb8, 0x4f, 0xb9, 0xe0, 0x03, 0x17, 0x2a, 0x21, 0x04, 0x00, 0x11, + 0x41, 0xb8, 0x0f, 0xb9, 0x6a, 0xee, 0xff, 0x97, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfd, 0x7b, 0xc5, 0xa8, 0x02, 0xee, 0xff, 0x17, 0x60, 0x5a, 0x40, 0xb9, + 0x3f, 0x03, 0x00, 0x6b, 0x09, 0x0f, 0x00, 0x54, 0x04, 0x00, 0x80, 0x52, + 0x41, 0x10, 0x00, 0xf0, 0x21, 0x60, 0x38, 0x91, 0x62, 0x10, 0x00, 0x90, + 0x46, 0x30, 0x40, 0xb9, 0x20, 0x00, 0x80, 0x52, 0x43, 0x10, 0x00, 0xf0, + 0x65, 0xd0, 0x47, 0xf9, 0x00, 0x20, 0xd9, 0x1a, 0xc0, 0x00, 0x20, 0x0a, + 0x40, 0x30, 0x00, 0xb9, 0x3f, 0x78, 0x3a, 0xf8, 0xbf, 0x00, 0x13, 0xeb, + 0x00, 0x0d, 0x00, 0x54, 0x80, 0x0b, 0x00, 0x34, 0x00, 0x00, 0xc0, 0x5a, + 0x00, 0x10, 0xc0, 0x5a, 0xe0, 0x03, 0x00, 0x2a, 0x20, 0x78, 0x60, 0xf8, + 0x60, 0xd0, 0x07, 0xf9, 0x24, 0x06, 0x00, 0x35, 0x75, 0x10, 0x00, 0x90, + 0xb5, 0x02, 0x00, 0x91, 0xcd, 0xff, 0xff, 0x17, 0x62, 0x02, 0x41, 0xb9, + 0x75, 0x10, 0x00, 0x90, 0xb5, 0x02, 0x00, 0x91, 0x14, 0x78, 0x3a, 0xf8, + 0xe3, 0x03, 0x02, 0x2a, 0x60, 0x5a, 0x40, 0xb9, 0xa1, 0x7a, 0x63, 0xf8, + 0x3f, 0x00, 0x13, 0xeb, 0x41, 0xf8, 0xff, 0x54, 0x1f, 0x00, 0x19, 0x6b, + 0x21, 0xf8, 0xff, 0x54, 0x1f, 0x20, 0x03, 0xd5, 0x81, 0x4a, 0x40, 0xb9, + 0x84, 0x5a, 0x40, 0xb9, 0x80, 0x12, 0x41, 0xb9, 0x9f, 0x00, 0x01, 0x6b, + 0xe1, 0x27, 0x9f, 0x1a, 0x00, 0x24, 0xc2, 0x1a, 0x00, 0x00, 0x00, 0x12, + 0x20, 0x00, 0x00, 0x2a, 0xc0, 0x08, 0x00, 0x35, 0x80, 0x02, 0x41, 0xb9, + 0xa0, 0x7a, 0x60, 0xf8, 0x1f, 0x00, 0x14, 0xeb, 0xc0, 0x07, 0x00, 0x54, + 0x82, 0x02, 0x01, 0xb9, 0xb4, 0x7a, 0x23, 0xf8, 0x4d, 0xee, 0xff, 0x97, + 0x82, 0x02, 0x40, 0xb9, 0x81, 0x48, 0x8a, 0x52, 0x01, 0x89, 0xaa, 0x72, + 0x5f, 0x00, 0x01, 0x6b, 0x40, 0x0d, 0x00, 0x54, 0x27, 0xee, 0xff, 0x97, + 0x42, 0x10, 0x00, 0xf0, 0x41, 0xb8, 0x4f, 0xb9, 0xe0, 0x03, 0x17, 0x2a, + 0x21, 0x04, 0x00, 0x11, 0x41, 0xb8, 0x0f, 0xb9, 0x21, 0xee, 0xff, 0x97, + 0xbe, 0xed, 0xff, 0x97, 0x60, 0x5a, 0x40, 0xb9, 0x24, 0x00, 0x80, 0x52, + 0x3f, 0x03, 0x00, 0x6b, 0xa8, 0xf7, 0xff, 0x54, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x61, 0x06, 0x40, 0xf9, + 0x62, 0xa2, 0x40, 0xf9, 0x3f, 0x00, 0x02, 0xeb, 0x42, 0x00, 0x00, 0x54, + 0x61, 0xa2, 0x00, 0xf9, 0x62, 0x0a, 0x40, 0xf9, 0xe3, 0xdb, 0x03, 0x32, + 0x41, 0x00, 0x40, 0xb9, 0x3f, 0x00, 0x03, 0x6b, 0x01, 0x01, 0x00, 0x54, + 0x63, 0x0e, 0x40, 0xf9, 0x63, 0x10, 0x40, 0xb8, 0x7f, 0x00, 0x01, 0x6b, + 0x81, 0x00, 0x00, 0x54, 0x61, 0xa2, 0x40, 0xf9, 0x5f, 0x00, 0x01, 0xeb, + 0xc9, 0x00, 0x00, 0x54, 0x04, 0xee, 0xff, 0x97, 0xe0, 0x03, 0x13, 0xaa, + 0x1a, 0xfd, 0xff, 0x97, 0x21, 0xee, 0xff, 0x97, 0x61, 0xa2, 0x40, 0xf9, + 0x22, 0xc0, 0x5f, 0xb8, 0xe1, 0xdb, 0x03, 0x32, 0x5f, 0x00, 0x01, 0x6b, + 0x80, 0xec, 0xff, 0x54, 0xfb, 0xed, 0xff, 0x97, 0xe0, 0x03, 0x13, 0xaa, + 0x21, 0xfd, 0xff, 0x97, 0x18, 0xee, 0xff, 0x97, 0x5f, 0xff, 0xff, 0x17, + 0x64, 0xfb, 0xff, 0x35, 0x75, 0x10, 0x00, 0x90, 0xb5, 0x02, 0x00, 0x91, + 0x77, 0xff, 0xff, 0x17, 0x94, 0x1a, 0x40, 0xf9, 0x7f, 0x02, 0x14, 0xeb, + 0x81, 0xf6, 0xff, 0x54, 0x1f, 0x20, 0x03, 0xd5, 0xe0, 0x03, 0x17, 0x2a, + 0xed, 0xed, 0xff, 0x97, 0xcd, 0xff, 0xff, 0x17, 0x7f, 0xd0, 0x07, 0xf9, + 0x98, 0xff, 0xff, 0x17, 0x75, 0x10, 0x00, 0x90, 0xb5, 0x02, 0x00, 0x91, + 0xb4, 0x7a, 0x78, 0xf8, 0x9f, 0x02, 0x13, 0xeb, 0xc1, 0xed, 0xff, 0x54, + 0xe0, 0x03, 0x17, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xde, 0xed, 0xff, 0x17, 0x81, 0x06, 0x40, 0xf9, 0x82, 0xa2, 0x40, 0xf9, + 0x3f, 0x00, 0x02, 0xeb, 0x42, 0x00, 0x00, 0x54, 0x81, 0xa2, 0x00, 0xf9, + 0x82, 0x0a, 0x40, 0xf9, 0xe3, 0xdb, 0x03, 0x32, 0x41, 0x00, 0x40, 0xb9, + 0x3f, 0x00, 0x03, 0x6b, 0x01, 0x01, 0x00, 0x54, 0x83, 0x0e, 0x40, 0xf9, + 0x63, 0x10, 0x40, 0xb8, 0x7f, 0x00, 0x01, 0x6b, 0x81, 0x00, 0x00, 0x54, + 0x81, 0xa2, 0x40, 0xf9, 0x5f, 0x00, 0x01, 0xeb, 0xc9, 0x00, 0x00, 0x54, + 0xcc, 0xed, 0xff, 0x97, 0xe0, 0x03, 0x14, 0xaa, 0xe2, 0xfc, 0xff, 0x97, + 0xe9, 0xed, 0xff, 0x97, 0x81, 0xa2, 0x40, 0xf9, 0x22, 0xc0, 0x5f, 0xb8, + 0xe1, 0xdb, 0x03, 0x32, 0x5f, 0x00, 0x01, 0x6b, 0x80, 0xea, 0xff, 0x54, + 0xc3, 0xed, 0xff, 0x97, 0xe0, 0x03, 0x14, 0xaa, 0xe9, 0xfc, 0xff, 0x97, + 0xe0, 0xed, 0xff, 0x97, 0x4f, 0xff, 0xff, 0x17, 0x81, 0x06, 0x40, 0xf9, + 0x82, 0xa2, 0x40, 0xf9, 0x3f, 0x00, 0x02, 0xeb, 0x42, 0x00, 0x00, 0x54, + 0x81, 0xa2, 0x00, 0xf9, 0x82, 0x0a, 0x40, 0xf9, 0xe3, 0xdb, 0x03, 0x32, + 0x41, 0x00, 0x40, 0xb9, 0x3f, 0x00, 0x03, 0x6b, 0xa1, 0x00, 0x00, 0x54, + 0x83, 0x0e, 0x40, 0xf9, 0x63, 0x10, 0x40, 0xb8, 0x7f, 0x00, 0x01, 0x6b, + 0xe0, 0x01, 0x00, 0x54, 0xb0, 0xed, 0xff, 0x97, 0xe0, 0x03, 0x14, 0xaa, + 0xc6, 0xfc, 0xff, 0x97, 0xcd, 0xed, 0xff, 0x97, 0x81, 0xa2, 0x40, 0xf9, + 0x22, 0xc0, 0x5f, 0xb8, 0xe1, 0xdb, 0x03, 0x32, 0x5f, 0x00, 0x01, 0x6b, + 0x20, 0xf0, 0xff, 0x54, 0xa7, 0xed, 0xff, 0x97, 0xe0, 0x03, 0x14, 0xaa, + 0xcd, 0xfc, 0xff, 0x97, 0xc4, 0xed, 0xff, 0x97, 0x7c, 0xff, 0xff, 0x17, + 0x81, 0xa2, 0x40, 0xf9, 0x5f, 0x00, 0x01, 0xeb, 0xa9, 0xfe, 0xff, 0x54, + 0xef, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0x44, 0x10, 0x00, 0xf0, 0x84, 0x00, 0x3f, 0x91, + 0x63, 0x10, 0x00, 0x90, 0x63, 0x00, 0x00, 0x91, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0x42, 0x10, 0x00, 0xf0, 0x61, 0x10, 0x00, 0x90, + 0x9f, 0x7c, 0x00, 0xa9, 0x13, 0x20, 0x80, 0xd2, 0x7f, 0x7c, 0x00, 0xa9, + 0x40, 0x10, 0x00, 0xf0, 0x00, 0x60, 0x38, 0x91, 0x9f, 0x7c, 0x01, 0xa9, + 0x7f, 0x7c, 0x01, 0xa9, 0x5f, 0x10, 0x0e, 0xb9, 0xe2, 0x03, 0x13, 0xaa, + 0x3f, 0x30, 0x00, 0xb9, 0x01, 0x00, 0x80, 0x52, 0x6c, 0xcf, 0x00, 0x94, + 0x41, 0x10, 0x00, 0xf0, 0xe2, 0x03, 0x13, 0xaa, 0x40, 0x10, 0x00, 0xf0, + 0x00, 0xe0, 0x33, 0x91, 0x3f, 0xd0, 0x07, 0xf9, 0x01, 0x00, 0x80, 0x52, + 0x65, 0xcf, 0x00, 0x94, 0x41, 0x10, 0x00, 0xf0, 0x20, 0x68, 0x4f, 0xb9, + 0x47, 0x10, 0x00, 0xf0, 0x45, 0x10, 0x00, 0xf0, 0x44, 0x10, 0x00, 0xf0, + 0x43, 0x10, 0x00, 0xf0, 0x62, 0x10, 0x00, 0x90, 0x06, 0x10, 0x80, 0x52, + 0x06, 0x22, 0xa0, 0x72, 0xff, 0xb0, 0x07, 0xf9, 0x00, 0x00, 0x06, 0x2a, + 0xbf, 0x70, 0x0f, 0xb9, 0x20, 0x68, 0x0f, 0xb9, 0x9f, 0xb8, 0x0f, 0xb9, + 0x7f, 0xfc, 0x06, 0xf9, 0x5f, 0x14, 0x00, 0xf9, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x89, 0xed, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0xc5, 0xed, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x14, 0x2a, 0x64, 0xed, 0xff, 0x97, + 0xe0, 0x03, 0x13, 0xaa, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0xb7, 0xed, 0xff, 0x97, 0xf3, 0x03, 0x00, 0xaa, + 0xbf, 0xed, 0xff, 0x97, 0x1f, 0x00, 0x00, 0x71, 0x64, 0x0a, 0x40, 0xfa, + 0x60, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, 0x60, 0x0e, 0x01, 0xb9, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, + 0x68, 0xed, 0xff, 0x97, 0x61, 0x4e, 0x40, 0xb9, 0x21, 0x04, 0x00, 0x51, + 0x3f, 0x04, 0x00, 0x71, 0x08, 0x03, 0x00, 0x54, 0xe2, 0x03, 0x00, 0x2a, + 0x40, 0x10, 0x00, 0xf0, 0x01, 0x70, 0x4f, 0xb9, 0x7f, 0x02, 0x00, 0xb9, + 0x21, 0x04, 0x00, 0x51, 0x01, 0x70, 0x0f, 0xb9, 0xc1, 0x01, 0x00, 0x34, + 0x60, 0x06, 0x4f, 0xa9, 0x43, 0x10, 0x00, 0xf0, 0x64, 0xb0, 0x47, 0xf9, + 0x01, 0x7c, 0x00, 0xf9, 0x9f, 0x00, 0x13, 0xeb, 0x20, 0x78, 0x00, 0xf9, + 0xe0, 0x01, 0x00, 0x54, 0xe0, 0x03, 0x02, 0x2a, 0x34, 0xed, 0xff, 0x97, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x10, 0x00, 0xf0, 0x1f, 0xb0, 0x07, 0xf9, + 0xf8, 0xff, 0xff, 0x17, 0x2c, 0xed, 0xff, 0x97, 0x20, 0x02, 0x80, 0x52, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0xb0, 0x07, 0xf9, 0xf1, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xba, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0xb4, 0x74, 0x1e, 0x12, 0xe0, 0x03, 0x04, 0xaa, + 0xf5, 0x5b, 0x02, 0xa9, 0xf6, 0x03, 0x06, 0x2a, 0xf7, 0x63, 0x03, 0xa9, + 0xf8, 0x03, 0x07, 0x2a, 0xf7, 0x63, 0x40, 0xb9, 0xf9, 0x6b, 0x04, 0xa9, + 0xfa, 0x03, 0x03, 0x2a, 0x99, 0x12, 0x00, 0x51, 0xfb, 0x73, 0x05, 0xa9, + 0xfc, 0x03, 0x01, 0xaa, 0xfb, 0x03, 0x02, 0xaa, 0xe1, 0x1d, 0x80, 0x52, + 0xe2, 0x03, 0x05, 0x2a, 0xf5, 0xce, 0x00, 0x94, 0x15, 0x0c, 0x00, 0x91, + 0xb5, 0xf6, 0x7e, 0x92, 0x94, 0x22, 0x00, 0x51, 0x1f, 0x00, 0x15, 0xeb, + 0x02, 0x2c, 0x80, 0xd2, 0x99, 0x12, 0x99, 0x1a, 0x01, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x13, 0xaa, 0xec, 0xce, 0x00, 0x94, 0x79, 0x5e, 0x04, 0x29, + 0x20, 0x07, 0x00, 0x51, 0xe4, 0xff, 0xff, 0xb0, 0x84, 0xc0, 0x26, 0x91, + 0x02, 0x04, 0x80, 0x52, 0xe3, 0x01, 0xc0, 0xd2, 0x85, 0x00, 0x80, 0x52, + 0x66, 0x00, 0x80, 0x52, 0xa0, 0x02, 0x00, 0x8b, 0x75, 0x02, 0x01, 0xa9, + 0xe1, 0xff, 0xff, 0xf0, 0x21, 0x40, 0x22, 0x91, 0x77, 0x2a, 0x00, 0xb9, + 0xe0, 0x03, 0x13, 0xaa, 0x7c, 0x22, 0x00, 0xf9, 0x76, 0x1a, 0x09, 0x29, + 0x78, 0x5a, 0x00, 0xb9, 0x7b, 0x36, 0x00, 0xf9, 0x7a, 0x72, 0x00, 0xb9, + 0x64, 0x42, 0x00, 0xf9, 0x73, 0x5a, 0x00, 0xf9, 0x65, 0x0a, 0x01, 0xb9, + 0x63, 0x8a, 0x00, 0xf9, 0x76, 0x2a, 0x01, 0xb9, 0x78, 0x2e, 0x01, 0xb9, + 0x62, 0x32, 0x01, 0xb9, 0xd1, 0xec, 0xff, 0x97, 0x60, 0x06, 0x40, 0xf9, + 0x60, 0xa2, 0x00, 0xf9, 0x0a, 0xed, 0xff, 0x97, 0x43, 0x10, 0x00, 0xd0, + 0x61, 0x70, 0x4f, 0xb9, 0x82, 0x48, 0x8a, 0x52, 0x02, 0x89, 0xaa, 0x72, + 0x62, 0x02, 0x00, 0xb9, 0x42, 0x10, 0x00, 0xd0, 0x61, 0x03, 0x00, 0x35, + 0x53, 0xb0, 0x07, 0xf9, 0x73, 0x4e, 0x0f, 0xa9, 0x54, 0x10, 0x00, 0xd0, + 0x82, 0xba, 0x4f, 0xb9, 0x21, 0x04, 0x00, 0x11, 0x61, 0x70, 0x0f, 0xb9, + 0x41, 0x04, 0x00, 0x11, 0x81, 0xba, 0x0f, 0xb9, 0xe1, 0x6b, 0x40, 0xb9, + 0x3f, 0x04, 0x00, 0x71, 0xc0, 0x02, 0x00, 0x54, 0xd7, 0xec, 0xff, 0x97, + 0xf6, 0xec, 0xff, 0x97, 0x81, 0xba, 0x4f, 0xb9, 0x21, 0x04, 0x00, 0x51, + 0x81, 0xba, 0x0f, 0xb9, 0xd2, 0xec, 0xff, 0x97, 0x8d, 0xfb, 0xff, 0x97, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x42, 0xb0, 0x47, 0xf9, + 0x44, 0x7c, 0x40, 0xf9, 0x53, 0x7c, 0x00, 0xf9, 0x93, 0x78, 0x00, 0xf9, + 0x62, 0x12, 0x0f, 0xa9, 0xe3, 0xff, 0xff, 0x17, 0xc2, 0xec, 0xff, 0x97, + 0xe0, 0x03, 0x13, 0xaa, 0x84, 0xf9, 0xff, 0x97, 0xdf, 0xec, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0x25, 0xed, 0xff, 0x97, 0xe1, 0xcf, 0x04, 0x32, + 0x1f, 0x00, 0x01, 0x6b, 0x62, 0x01, 0x00, 0x54, 0xe0, 0x03, 0x13, 0x2a, + 0xb8, 0xec, 0xff, 0x97, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x40, 0x10, 0x00, 0xd0, 0x00, 0x60, 0x38, 0x91, 0x42, 0x10, 0x00, 0xf0, + 0x41, 0x10, 0x00, 0xd0, 0x5f, 0x30, 0x00, 0xb9, 0x3f, 0xd0, 0x07, 0xf9, + 0x1f, 0x58, 0x36, 0xf8, 0x20, 0xed, 0xff, 0x97, 0x13, 0xfc, 0xff, 0x97, + 0xed, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, + 0xc0, 0xec, 0xff, 0x97, 0x61, 0x22, 0x40, 0xb9, 0x01, 0x04, 0x00, 0x34, + 0x74, 0x0e, 0x40, 0xf9, 0xf5, 0x13, 0x00, 0xf9, 0xe2, 0x03, 0x00, 0x2a, + 0x21, 0x04, 0x00, 0x71, 0x20, 0x03, 0x00, 0x54, 0x80, 0x8e, 0x4c, 0xa9, + 0x60, 0x0e, 0x00, 0xf9, 0x03, 0x68, 0x00, 0xf9, 0x60, 0x64, 0x00, 0xf9, + 0x61, 0x22, 0x00, 0xb9, 0x43, 0x10, 0x00, 0xd0, 0x61, 0xb8, 0x4f, 0xb9, + 0xe0, 0x03, 0x02, 0x2a, 0x75, 0x1e, 0x40, 0xf9, 0x21, 0x04, 0x00, 0x11, + 0x9f, 0x5e, 0x00, 0xf9, 0x9f, 0xee, 0x00, 0xb9, 0x61, 0xb8, 0x0f, 0xb9, + 0x8b, 0xec, 0xff, 0x97, 0xe0, 0x03, 0x14, 0xaa, 0x4d, 0xf9, 0xff, 0x97, + 0xd5, 0x02, 0x00, 0xb4, 0xe0, 0x03, 0x13, 0xaa, 0xa0, 0x02, 0x3f, 0xd6, + 0xf5, 0x13, 0x40, 0xf9, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x7f, 0x0e, 0x00, 0xf9, + 0xeb, 0xff, 0xff, 0x17, 0x61, 0x12, 0x40, 0xb9, 0x74, 0x1e, 0x40, 0xf9, + 0x21, 0x04, 0x00, 0x11, 0x61, 0x12, 0x00, 0xb9, 0x7a, 0xec, 0xff, 0x97, + 0xb4, 0xfe, 0xff, 0xb4, 0xe0, 0x03, 0x13, 0xaa, 0x80, 0x02, 0x3f, 0xd6, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, + 0xf5, 0x03, 0x01, 0x2a, 0x86, 0xec, 0xff, 0x97, 0x61, 0x12, 0x40, 0xb9, + 0x41, 0x05, 0x00, 0x35, 0x75, 0x07, 0x00, 0x34, 0xf7, 0x1b, 0x00, 0xf9, + 0x57, 0x10, 0x00, 0xd0, 0xe1, 0xba, 0x4f, 0xb9, 0xa1, 0x05, 0x00, 0x35, + 0xf6, 0x03, 0x00, 0x2a, 0xbb, 0xec, 0xff, 0x97, 0xf4, 0x03, 0x00, 0xaa, + 0x60, 0x22, 0x40, 0xb9, 0x02, 0x00, 0x00, 0x90, 0x42, 0x40, 0x17, 0x91, + 0x81, 0x5a, 0x41, 0xb9, 0x82, 0xce, 0x0b, 0xa9, 0x21, 0x04, 0x00, 0x11, + 0x81, 0x5a, 0x01, 0xb9, 0x20, 0x05, 0x00, 0x34, 0x61, 0x0e, 0x40, 0xf9, + 0x22, 0x68, 0x40, 0xf9, 0x81, 0x8a, 0x0c, 0xa9, 0x54, 0x64, 0x00, 0xf9, + 0x34, 0x68, 0x00, 0xf9, 0xe1, 0xba, 0x4f, 0xb9, 0x00, 0x04, 0x00, 0x11, + 0x60, 0x22, 0x00, 0xb9, 0xc2, 0x00, 0x80, 0x52, 0x21, 0x04, 0x00, 0x11, + 0x20, 0x00, 0x80, 0x52, 0x82, 0x4e, 0x00, 0xb9, 0x80, 0x56, 0x00, 0xb9, + 0xe0, 0x03, 0x16, 0x2a, 0x95, 0x7a, 0x00, 0xb9, 0xe1, 0xba, 0x0f, 0xb9, + 0x43, 0xec, 0xff, 0x97, 0xe0, 0x03, 0x14, 0xaa, 0xa5, 0xf6, 0xff, 0x97, + 0x80, 0xee, 0x40, 0xb9, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x21, 0x04, 0x00, 0x51, 0x61, 0x12, 0x00, 0xb9, 0x38, 0xec, 0xff, 0x97, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x32, 0xec, 0xff, 0x97, + 0xa0, 0x01, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x74, 0x0e, 0x00, 0xf9, 0x94, 0xd2, 0x0c, 0xa9, 0xdb, 0xff, 0xff, 0x17, + 0x28, 0xec, 0xff, 0x97, 0xa0, 0x01, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x00, 0xaa, + 0xf3, 0x53, 0x01, 0xa9, 0xf7, 0x63, 0x03, 0xa9, 0x3a, 0xec, 0xff, 0x97, + 0x42, 0x10, 0x00, 0xf0, 0x41, 0x74, 0x40, 0xb9, 0xbf, 0x02, 0x00, 0xb9, + 0x21, 0x04, 0x00, 0x51, 0x41, 0x74, 0x00, 0xb9, 0x21, 0x05, 0x00, 0x35, + 0x41, 0x10, 0x00, 0xf0, 0x3f, 0x2c, 0x00, 0xf9, 0x58, 0x10, 0x00, 0xd0, + 0x01, 0xbb, 0x4f, 0xb9, 0xb4, 0x22, 0x40, 0xb9, 0x21, 0x04, 0x00, 0x11, + 0xbf, 0x22, 0x00, 0xb9, 0xb3, 0x0e, 0x40, 0xf9, 0xbf, 0x0e, 0x00, 0xf9, + 0x01, 0xbb, 0x0f, 0xb9, 0x09, 0xec, 0xff, 0x97, 0x34, 0x02, 0x00, 0x34, + 0x15, 0xe3, 0x3e, 0x91, 0x37, 0x00, 0x80, 0x52, 0x1f, 0x20, 0x03, 0xd5, + 0x24, 0xec, 0xff, 0x97, 0x7f, 0x5e, 0x00, 0xf9, 0xa1, 0x02, 0x40, 0xb9, + 0xf6, 0x03, 0x13, 0xaa, 0x77, 0xee, 0x00, 0xb9, 0x94, 0x06, 0x00, 0x51, + 0x21, 0x04, 0x00, 0x11, 0xa1, 0x02, 0x00, 0xb9, 0x73, 0x66, 0x40, 0xf9, + 0xfb, 0xeb, 0xff, 0x97, 0xe0, 0x03, 0x16, 0xaa, 0xbd, 0xf8, 0xff, 0x97, + 0x94, 0xfe, 0xff, 0x35, 0x17, 0xec, 0xff, 0x97, 0x01, 0xbb, 0x4f, 0xb9, + 0x21, 0x04, 0x00, 0x51, 0x01, 0xbb, 0x0f, 0xb9, 0xf3, 0xeb, 0xff, 0x97, + 0xae, 0xfa, 0xff, 0x97, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xa1, 0x8a, 0x42, 0xa9, 0x43, 0x10, 0x00, 0xf0, + 0x64, 0x2c, 0x40, 0xf9, 0x22, 0x18, 0x00, 0xf9, 0x9f, 0x00, 0x15, 0xeb, + 0x41, 0x14, 0x00, 0xf9, 0x81, 0xfa, 0xff, 0x54, 0x61, 0x2c, 0x00, 0xf9, + 0xd2, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0xf3, 0x03, 0x00, 0xaa, 0x1f, 0x7c, 0x00, 0xa9, 0x1f, 0x7c, 0x01, 0xa9, + 0x01, 0x04, 0x00, 0xf9, 0x02, 0x10, 0x00, 0xb9, 0x1f, 0x7c, 0x02, 0xa9, + 0x1f, 0x7c, 0x03, 0xa9, 0xf6, 0xeb, 0xff, 0x97, 0x42, 0x10, 0x00, 0xf0, + 0x41, 0x74, 0x40, 0xb9, 0x23, 0xa8, 0x89, 0x52, 0xa3, 0x68, 0xaa, 0x72, + 0x63, 0x02, 0x00, 0xb9, 0x43, 0x10, 0x00, 0xf0, 0x41, 0x01, 0x00, 0x35, + 0x21, 0x04, 0x00, 0x11, 0x73, 0xce, 0x02, 0xa9, 0x73, 0x2c, 0x00, 0xf9, + 0x41, 0x74, 0x00, 0xb9, 0xca, 0xeb, 0xff, 0x97, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x63, 0x2c, 0x40, 0xf9, 0x21, 0x04, 0x00, 0x11, 0x41, 0x74, 0x00, 0xb9, + 0x64, 0x18, 0x40, 0xf9, 0x73, 0x18, 0x00, 0xf9, 0x93, 0x14, 0x00, 0xf9, + 0x63, 0x92, 0x02, 0xa9, 0xbe, 0xeb, 0xff, 0x97, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0xf4, 0x03, 0x01, 0x2a, + 0xd3, 0xeb, 0xff, 0x97, 0x61, 0x5e, 0x40, 0xf9, 0x02, 0x00, 0x00, 0x90, + 0x42, 0x40, 0x17, 0x91, 0x3f, 0x00, 0x02, 0xeb, 0x80, 0x00, 0x00, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xab, 0xeb, 0xff, 0x17, + 0x61, 0x5a, 0x41, 0xb9, 0x3f, 0x00, 0x14, 0x6b, 0x61, 0xff, 0xff, 0x54, + 0x61, 0x62, 0x40, 0xf9, 0x21, 0xff, 0xff, 0xb4, 0x23, 0x00, 0x40, 0xb9, + 0x22, 0xa8, 0x89, 0x52, 0xa2, 0x68, 0xaa, 0x72, 0x7f, 0x00, 0x02, 0x6b, + 0x81, 0xfe, 0xff, 0x54, 0x22, 0x20, 0x40, 0xb9, 0x42, 0xfe, 0xff, 0x34, + 0x7f, 0x5e, 0x00, 0xf9, 0x42, 0x04, 0x00, 0x51, 0x22, 0x20, 0x00, 0xb9, + 0x02, 0x02, 0x00, 0x35, 0x3f, 0x0c, 0x00, 0xf9, 0x61, 0x4e, 0x40, 0xb9, + 0x3f, 0x18, 0x00, 0x71, 0x41, 0xfd, 0xff, 0x54, 0x42, 0x10, 0x00, 0xd0, + 0x41, 0xb8, 0x4f, 0xb9, 0xa3, 0x01, 0x80, 0x52, 0x63, 0xee, 0x00, 0xb9, + 0x21, 0x04, 0x00, 0x11, 0x41, 0xb8, 0x0f, 0xb9, 0x90, 0xeb, 0xff, 0x97, + 0xe0, 0x03, 0x13, 0xaa, 0x52, 0xf8, 0xff, 0x97, 0xad, 0xeb, 0xff, 0x97, + 0xdf, 0xff, 0xff, 0x17, 0x62, 0x8e, 0x4c, 0xa9, 0x24, 0x0c, 0x40, 0xf9, + 0x43, 0x68, 0x00, 0xf9, 0x9f, 0x00, 0x13, 0xeb, 0x62, 0x64, 0x00, 0xf9, + 0xa1, 0xfd, 0xff, 0x54, 0x22, 0x0c, 0x00, 0xf9, 0xeb, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0xf4, 0x03, 0x01, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, + 0xf7, 0x63, 0x03, 0xa9, 0xf8, 0x03, 0x02, 0x2a, 0x98, 0xeb, 0xff, 0x97, + 0x63, 0x1e, 0x40, 0xb9, 0xf7, 0x03, 0x00, 0x2a, 0x75, 0x4a, 0x40, 0xb9, + 0x23, 0x05, 0x00, 0x34, 0x61, 0x12, 0x40, 0xb9, 0xd5, 0x0a, 0x00, 0x35, + 0x60, 0x1e, 0x40, 0xf9, 0x63, 0x04, 0x00, 0x51, 0x62, 0x1a, 0x40, 0xb9, + 0x3f, 0x04, 0x00, 0x71, 0xe5, 0x03, 0x00, 0xaa, 0x42, 0x04, 0x00, 0x11, + 0x62, 0x0e, 0x03, 0x29, 0x82, 0x02, 0x40, 0xb9, 0xa2, 0x44, 0x00, 0xb8, + 0xa9, 0x01, 0x00, 0x54, 0x22, 0x08, 0x00, 0x51, 0x81, 0x00, 0x80, 0xd2, + 0x44, 0x08, 0x00, 0x91, 0x84, 0xf4, 0x7e, 0xd3, 0x1f, 0x20, 0x03, 0xd5, + 0x83, 0x6a, 0x61, 0xb8, 0x03, 0x68, 0x21, 0xb8, 0x21, 0x10, 0x00, 0x91, + 0x9f, 0x00, 0x01, 0xeb, 0x81, 0xff, 0xff, 0x54, 0x41, 0x04, 0x00, 0x91, + 0xa5, 0x08, 0x01, 0x8b, 0x60, 0x16, 0x40, 0xf9, 0x1f, 0x00, 0x05, 0xeb, + 0x80, 0x0f, 0x00, 0x54, 0x74, 0x32, 0x40, 0xf9, 0x65, 0x1e, 0x00, 0xf9, + 0xe0, 0x03, 0x17, 0x2a, 0x55, 0xeb, 0xff, 0x97, 0x14, 0x0e, 0x00, 0xb4, + 0xe0, 0x03, 0x13, 0xaa, 0x80, 0x02, 0x3f, 0xd6, 0xe0, 0x03, 0x15, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf8, 0x0b, 0x00, 0x34, + 0xf9, 0x23, 0x00, 0xf9, 0x59, 0x10, 0x00, 0xd0, 0x21, 0xbb, 0x4f, 0xb9, + 0x81, 0x0d, 0x00, 0x35, 0xa4, 0xeb, 0xff, 0x97, 0xf6, 0x03, 0x00, 0xaa, + 0x00, 0x58, 0x41, 0xb9, 0x01, 0x00, 0x00, 0xb0, 0x21, 0x40, 0x03, 0x91, + 0x00, 0x04, 0x00, 0x11, 0xc1, 0xce, 0x0b, 0xa9, 0xd4, 0x72, 0x00, 0xf9, + 0xdf, 0xea, 0x00, 0xb9, 0xc0, 0x5a, 0x01, 0xb9, 0x75, 0x09, 0x00, 0x34, + 0x60, 0x22, 0x40, 0xf9, 0x01, 0x68, 0x40, 0xf9, 0xc0, 0x86, 0x0c, 0xa9, + 0x36, 0x64, 0x00, 0xf9, 0x16, 0x68, 0x00, 0xf9, 0x21, 0xbb, 0x4f, 0xb9, + 0xb5, 0x06, 0x00, 0x11, 0x75, 0x4a, 0x00, 0xb9, 0xa2, 0x00, 0x80, 0x52, + 0x21, 0x04, 0x00, 0x11, 0x20, 0x00, 0x80, 0x52, 0x74, 0x32, 0x40, 0xf9, + 0xc2, 0x4e, 0x00, 0xb9, 0xc0, 0x56, 0x00, 0xb9, 0xe0, 0x03, 0x17, 0x2a, + 0xd8, 0x7a, 0x00, 0xb9, 0x21, 0xbb, 0x0f, 0xb9, 0x2a, 0xeb, 0xff, 0x97, + 0xe0, 0x03, 0x16, 0xaa, 0x8c, 0xf5, 0xff, 0x97, 0xd5, 0xee, 0x40, 0xb9, + 0xbf, 0x02, 0x00, 0x71, 0x84, 0x0a, 0x40, 0xfa, 0x41, 0x0a, 0x00, 0x54, + 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xb5, 0x06, 0x00, 0x71, 0x76, 0x22, 0x40, 0xf9, + 0x80, 0x05, 0x00, 0x54, 0xc0, 0x8a, 0x4c, 0xa9, 0x60, 0x22, 0x00, 0xf9, + 0x02, 0x68, 0x00, 0xf9, 0x40, 0x64, 0x00, 0xf9, 0xc0, 0x72, 0x40, 0xf9, + 0x75, 0x4a, 0x00, 0xb9, 0x3f, 0x04, 0x00, 0x71, 0x82, 0x02, 0x40, 0xb9, + 0xdf, 0x5e, 0x00, 0xf9, 0x02, 0x00, 0x00, 0xb9, 0x49, 0x01, 0x00, 0x54, + 0x22, 0x08, 0x00, 0x51, 0x81, 0x00, 0x80, 0xd2, 0x42, 0x08, 0x00, 0x91, + 0x42, 0xf4, 0x7e, 0xd3, 0x83, 0x6a, 0x61, 0xb8, 0x03, 0x68, 0x21, 0xb8, + 0x21, 0x10, 0x00, 0x91, 0x3f, 0x00, 0x02, 0xeb, 0x81, 0xff, 0xff, 0x54, + 0x42, 0x10, 0x00, 0xd0, 0x41, 0xb8, 0x4f, 0xb9, 0x74, 0x32, 0x40, 0xf9, + 0x21, 0x04, 0x00, 0x11, 0xdf, 0xee, 0x00, 0xb9, 0xe0, 0x03, 0x17, 0x2a, + 0x41, 0xb8, 0x0f, 0xb9, 0xfe, 0xea, 0xff, 0x97, 0xe0, 0x03, 0x16, 0xaa, + 0xc0, 0xf7, 0xff, 0x97, 0xf4, 0x02, 0x00, 0xb4, 0xe0, 0x03, 0x13, 0xaa, + 0x15, 0x00, 0x80, 0x52, 0x80, 0x02, 0x3f, 0xd6, 0xe0, 0x03, 0x15, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x76, 0x22, 0x00, 0xf9, + 0xd6, 0xda, 0x0c, 0xa9, 0xb9, 0xff, 0xff, 0x17, 0x7f, 0x22, 0x00, 0xf9, + 0xd8, 0xff, 0xff, 0x17, 0xec, 0xea, 0xff, 0x97, 0x75, 0x01, 0x80, 0x52, + 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x15, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x65, 0x12, 0x40, 0xf9, 0x84, 0xff, 0xff, 0x17, + 0xdb, 0xea, 0xff, 0x97, 0x75, 0x01, 0x80, 0x52, 0xe0, 0x03, 0x15, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0x03, 0x13, 0xaa, 0x80, 0x02, 0x3f, 0xd6, 0xd5, 0xee, 0x40, 0xb9, + 0xf9, 0x23, 0x40, 0xf9, 0x7d, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0xf4, 0x03, 0x01, 0xaa, 0xf7, 0x63, 0x03, 0xa9, + 0xf7, 0x03, 0x02, 0x2a, 0xf9, 0x23, 0x00, 0xf9, 0xe4, 0xea, 0xff, 0x97, + 0x61, 0x1a, 0x40, 0xb9, 0xf9, 0x03, 0x00, 0x2a, 0x78, 0x4a, 0x40, 0xb9, + 0xa1, 0x04, 0x00, 0x34, 0x61, 0x12, 0x40, 0xb9, 0xd8, 0x09, 0x00, 0x35, + 0x60, 0x1a, 0x40, 0xf9, 0x3f, 0x04, 0x00, 0x71, 0xe5, 0x03, 0x00, 0xaa, + 0xa2, 0x44, 0x40, 0xb8, 0x82, 0x02, 0x00, 0xb9, 0xa9, 0x01, 0x00, 0x54, + 0x22, 0x08, 0x00, 0x51, 0x81, 0x00, 0x80, 0xd2, 0x44, 0x08, 0x00, 0x91, + 0x84, 0xf4, 0x7e, 0xd3, 0x1f, 0x20, 0x03, 0xd5, 0x03, 0x68, 0x61, 0xb8, + 0x83, 0x6a, 0x21, 0xb8, 0x21, 0x10, 0x00, 0x91, 0x3f, 0x00, 0x04, 0xeb, + 0x81, 0xff, 0xff, 0x54, 0x41, 0x04, 0x00, 0x91, 0xa5, 0x08, 0x01, 0x8b, + 0x60, 0x16, 0x40, 0xf9, 0x1f, 0x00, 0x05, 0xeb, 0x40, 0x16, 0x00, 0x54, + 0x62, 0x06, 0x43, 0x29, 0x65, 0x1a, 0x00, 0xf9, 0xe0, 0x03, 0x19, 0x2a, + 0x42, 0x04, 0x00, 0x51, 0x21, 0x04, 0x00, 0x11, 0x62, 0x06, 0x03, 0x29, + 0xa2, 0xea, 0xff, 0x97, 0xe0, 0x03, 0x18, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x77, 0x0f, 0x00, 0x34, 0xf5, 0x5b, 0x02, 0xa9, + 0x56, 0x10, 0x00, 0xd0, 0xc1, 0xba, 0x4f, 0xb9, 0x41, 0x14, 0x00, 0x35, + 0xf4, 0xea, 0xff, 0x97, 0xf5, 0x03, 0x00, 0xaa, 0x00, 0x58, 0x41, 0xb9, + 0x01, 0x00, 0x00, 0xb0, 0x21, 0x40, 0x03, 0x91, 0x00, 0x04, 0x00, 0x11, + 0xa1, 0xce, 0x0b, 0xa9, 0xb4, 0x72, 0x00, 0xf9, 0xbf, 0xea, 0x00, 0xb9, + 0xa0, 0x5a, 0x01, 0xb9, 0x38, 0x0d, 0x00, 0x34, 0x60, 0x22, 0x40, 0xf9, + 0x01, 0x68, 0x40, 0xf9, 0xa0, 0x86, 0x0c, 0xa9, 0x35, 0x64, 0x00, 0xf9, + 0x15, 0x68, 0x00, 0xf9, 0xc1, 0xba, 0x4f, 0xb9, 0x18, 0x07, 0x00, 0x11, + 0x78, 0x4a, 0x00, 0xb9, 0xa2, 0x00, 0x80, 0x52, 0x21, 0x04, 0x00, 0x11, + 0x20, 0x00, 0x80, 0x52, 0xa2, 0x4e, 0x00, 0xb9, 0xa0, 0x56, 0x00, 0xb9, + 0xe0, 0x03, 0x19, 0x2a, 0xb7, 0x7a, 0x00, 0xb9, 0xc1, 0xba, 0x0f, 0xb9, + 0x7b, 0xea, 0xff, 0x97, 0xe0, 0x03, 0x15, 0xaa, 0xdd, 0xf4, 0xff, 0x97, + 0xb8, 0xee, 0x40, 0xb9, 0xf3, 0x53, 0x41, 0xa9, 0xe0, 0x03, 0x18, 0x2a, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf5, 0x5b, 0x02, 0xa9, + 0x75, 0x22, 0x40, 0xf9, 0xa2, 0xea, 0x40, 0xb9, 0xa0, 0x72, 0x40, 0xf9, + 0x5f, 0x04, 0x00, 0x71, 0x60, 0x0a, 0x00, 0x54, 0x64, 0x1a, 0x40, 0xf9, + 0x3f, 0x04, 0x00, 0x71, 0xe6, 0x03, 0x04, 0xaa, 0xc2, 0x44, 0x40, 0xb8, + 0x82, 0x02, 0x00, 0xb9, 0x89, 0x01, 0x00, 0x54, 0x22, 0x08, 0x00, 0x51, + 0x81, 0x00, 0x80, 0xd2, 0x45, 0x08, 0x00, 0x91, 0xa5, 0xf4, 0x7e, 0xd3, + 0x83, 0x68, 0x61, 0xb8, 0x83, 0x6a, 0x21, 0xb8, 0x21, 0x10, 0x00, 0x91, + 0x3f, 0x00, 0x05, 0xeb, 0x81, 0xff, 0xff, 0x54, 0x41, 0x04, 0x00, 0x91, + 0xc6, 0x08, 0x01, 0x8b, 0x67, 0x16, 0x40, 0xf9, 0xff, 0x00, 0x06, 0xeb, + 0x80, 0x0e, 0x00, 0x54, 0x56, 0x10, 0x00, 0xd0, 0xc1, 0xba, 0x4f, 0xb9, + 0x63, 0x1e, 0x40, 0xf9, 0x21, 0x04, 0x00, 0x11, 0xc1, 0xba, 0x0f, 0xb9, + 0xe5, 0x03, 0x03, 0xaa, 0x61, 0x12, 0x40, 0xb9, 0xc2, 0xba, 0x4f, 0xb9, + 0x3f, 0x04, 0x00, 0x71, 0x42, 0x04, 0x00, 0x51, 0xc2, 0xba, 0x0f, 0xb9, + 0x02, 0x00, 0x40, 0xb9, 0x66, 0x1a, 0x00, 0xf9, 0xa2, 0x44, 0x00, 0xb8, + 0xa9, 0x01, 0x00, 0x54, 0x26, 0x08, 0x00, 0x51, 0x81, 0x00, 0x80, 0xd2, + 0xc4, 0x08, 0x00, 0x91, 0x84, 0xf4, 0x7e, 0xd3, 0x1f, 0x20, 0x03, 0xd5, + 0x02, 0x68, 0x61, 0xb8, 0x62, 0x68, 0x21, 0xb8, 0x21, 0x10, 0x00, 0x91, + 0x9f, 0x00, 0x01, 0xeb, 0x81, 0xff, 0xff, 0x54, 0xc1, 0x04, 0x00, 0x91, + 0xa5, 0x08, 0x01, 0x8b, 0xff, 0x00, 0x05, 0xeb, 0xa0, 0x0a, 0x00, 0x54, + 0x65, 0x1e, 0x00, 0xf9, 0x18, 0x07, 0x00, 0x71, 0x61, 0x09, 0x00, 0x54, + 0x7f, 0x22, 0x00, 0xf9, 0xc1, 0xba, 0x4f, 0xb9, 0xe0, 0x03, 0x19, 0x2a, + 0x78, 0x4a, 0x00, 0xb9, 0x18, 0x00, 0x80, 0x52, 0x21, 0x04, 0x00, 0x11, + 0xbf, 0x5e, 0x00, 0xf9, 0xbf, 0xee, 0x00, 0xb9, 0xc1, 0xba, 0x0f, 0xb9, + 0x2d, 0xea, 0xff, 0x97, 0xe0, 0x03, 0x15, 0xaa, 0xef, 0xf6, 0xff, 0x97, + 0xe0, 0x03, 0x18, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x75, 0x22, 0x00, 0xf9, 0xb5, 0xd6, 0x0c, 0xa9, + 0x9b, 0xff, 0xff, 0x17, 0x20, 0xea, 0xff, 0x97, 0x58, 0x01, 0x80, 0x52, + 0xe0, 0x03, 0x18, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x02, 0x00, 0x40, 0xb9, 0x3f, 0x04, 0x00, 0x71, 0x82, 0x02, 0x00, 0xb9, + 0x49, 0x01, 0x00, 0x54, 0x21, 0x08, 0x00, 0x51, 0x82, 0x00, 0x80, 0xd2, + 0x21, 0x08, 0x00, 0x91, 0x21, 0xf4, 0x7e, 0xd3, 0x03, 0x68, 0x62, 0xb8, + 0x83, 0x6a, 0x22, 0xb8, 0x42, 0x10, 0x00, 0x91, 0x3f, 0x00, 0x02, 0xeb, + 0x81, 0xff, 0xff, 0x54, 0x18, 0x07, 0x00, 0x71, 0x60, 0x04, 0x00, 0x54, + 0xa0, 0x86, 0x4c, 0xa9, 0x60, 0x22, 0x00, 0xf9, 0x01, 0x68, 0x00, 0xf9, + 0x20, 0x64, 0x00, 0xf9, 0x42, 0x10, 0x00, 0xd0, 0x41, 0xb8, 0x4f, 0xb9, + 0x78, 0x4a, 0x00, 0xb9, 0xe0, 0x03, 0x19, 0x2a, 0x21, 0x04, 0x00, 0x11, + 0xbf, 0x5e, 0x00, 0xf9, 0xbf, 0xee, 0x00, 0xb9, 0x18, 0x00, 0x80, 0x52, + 0x41, 0xb8, 0x0f, 0xb9, 0xfc, 0xe9, 0xff, 0x97, 0xe0, 0x03, 0x15, 0xaa, + 0xbe, 0xf6, 0xff, 0x97, 0xf5, 0x5b, 0x42, 0xa9, 0x57, 0xff, 0xff, 0x17, + 0x65, 0x12, 0x40, 0xf9, 0x4e, 0xff, 0xff, 0x17, 0xf5, 0xe9, 0xff, 0x97, + 0x58, 0x01, 0x80, 0x52, 0xe0, 0x03, 0x18, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xa0, 0x86, 0x4c, 0xa9, + 0x60, 0x22, 0x00, 0xf9, 0x01, 0x68, 0x00, 0xf9, 0x20, 0x64, 0x00, 0xf9, + 0xb3, 0xff, 0xff, 0x17, 0x7f, 0x22, 0x00, 0xf9, 0xe1, 0xff, 0xff, 0x17, + 0x65, 0x12, 0x40, 0xf9, 0xab, 0xff, 0xff, 0x17, 0x66, 0x12, 0x40, 0xf9, + 0x8c, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, + 0xf4, 0x03, 0x01, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, 0xf7, 0x63, 0x03, 0xa9, + 0xf8, 0x03, 0x02, 0x2a, 0xf8, 0xe9, 0xff, 0x97, 0x64, 0x1e, 0x40, 0xb9, + 0xf7, 0x03, 0x00, 0x2a, 0x75, 0x4a, 0x40, 0xb9, 0x24, 0x05, 0x00, 0x34, + 0x61, 0x12, 0x40, 0xb9, 0x15, 0x0b, 0x00, 0x35, 0x60, 0x12, 0x40, 0xf9, + 0x23, 0x7c, 0x7e, 0xd3, 0x62, 0x1a, 0x40, 0xf9, 0xe5, 0x03, 0x03, 0xcb, + 0x5f, 0x00, 0x00, 0xeb, 0x43, 0x00, 0x03, 0xcb, 0x20, 0x12, 0x00, 0x54, + 0x60, 0x1a, 0x40, 0xb9, 0x84, 0x04, 0x00, 0x51, 0x63, 0x1a, 0x00, 0xf9, + 0x3f, 0x04, 0x00, 0x71, 0x00, 0x04, 0x00, 0x11, 0x60, 0x12, 0x03, 0x29, + 0x80, 0x02, 0x40, 0xb9, 0x60, 0x00, 0x00, 0xb9, 0x69, 0x01, 0x00, 0x54, + 0x22, 0x08, 0x00, 0x51, 0x81, 0x00, 0x80, 0xd2, 0x42, 0x08, 0x00, 0x91, + 0x42, 0xf4, 0x7e, 0xd3, 0x1f, 0x20, 0x03, 0xd5, 0x84, 0x6a, 0x61, 0xb8, + 0x64, 0x68, 0x21, 0xb8, 0x21, 0x10, 0x00, 0x91, 0x5f, 0x00, 0x01, 0xeb, + 0x81, 0xff, 0xff, 0x54, 0x74, 0x32, 0x40, 0xf9, 0xe0, 0x03, 0x17, 0x2a, + 0xb5, 0xe9, 0xff, 0x97, 0x74, 0x0e, 0x00, 0xb4, 0xe0, 0x03, 0x13, 0xaa, + 0x80, 0x02, 0x3f, 0xd6, 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x58, 0x0c, 0x00, 0x34, 0xf9, 0x23, 0x00, 0xf9, + 0x59, 0x10, 0x00, 0xd0, 0x21, 0xbb, 0x4f, 0xb9, 0x01, 0x0e, 0x00, 0x35, + 0x04, 0xea, 0xff, 0x97, 0xf6, 0x03, 0x00, 0xaa, 0x00, 0x58, 0x41, 0xb9, + 0x22, 0x00, 0x80, 0x52, 0x01, 0x00, 0x00, 0xb0, 0x21, 0x40, 0x03, 0x91, + 0x00, 0x00, 0x02, 0x0b, 0xc1, 0xce, 0x0b, 0xa9, 0xd4, 0x72, 0x00, 0xf9, + 0xc2, 0xea, 0x00, 0xb9, 0xc0, 0x5a, 0x01, 0xb9, 0xb5, 0x09, 0x00, 0x34, + 0x60, 0x22, 0x40, 0xf9, 0x01, 0x68, 0x40, 0xf9, 0xc0, 0x86, 0x0c, 0xa9, + 0x36, 0x64, 0x00, 0xf9, 0x16, 0x68, 0x00, 0xf9, 0x76, 0x22, 0x00, 0xf9, + 0x21, 0xbb, 0x4f, 0xb9, 0xb5, 0x06, 0x00, 0x11, 0x75, 0x4a, 0x00, 0xb9, + 0xa2, 0x00, 0x80, 0x52, 0x21, 0x04, 0x00, 0x11, 0x20, 0x00, 0x80, 0x52, + 0x74, 0x32, 0x40, 0xf9, 0xc2, 0x4e, 0x00, 0xb9, 0xc0, 0x56, 0x00, 0xb9, + 0xe0, 0x03, 0x17, 0x2a, 0xd8, 0x7a, 0x00, 0xb9, 0x21, 0xbb, 0x0f, 0xb9, + 0x88, 0xe9, 0xff, 0x97, 0xe0, 0x03, 0x16, 0xaa, 0xea, 0xf3, 0xff, 0x97, + 0xd5, 0xee, 0x40, 0xb9, 0x9f, 0x02, 0x00, 0xf1, 0xa0, 0x1a, 0x40, 0x7a, + 0x80, 0x0a, 0x00, 0x54, 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xb5, 0x06, 0x00, 0x71, + 0x76, 0x22, 0x40, 0xf9, 0xa0, 0x05, 0x00, 0x54, 0xc0, 0x8a, 0x4c, 0xa9, + 0x60, 0x22, 0x00, 0xf9, 0x02, 0x68, 0x00, 0xf9, 0x40, 0x64, 0x00, 0xf9, + 0xc0, 0x72, 0x40, 0xf9, 0x75, 0x4a, 0x00, 0xb9, 0x78, 0x32, 0x40, 0xf9, + 0x3f, 0x04, 0x00, 0x71, 0x82, 0x02, 0x40, 0xb9, 0xdf, 0x5e, 0x00, 0xf9, + 0x02, 0x00, 0x00, 0xb9, 0x69, 0x01, 0x00, 0x54, 0x22, 0x08, 0x00, 0x51, + 0x81, 0x00, 0x80, 0xd2, 0x42, 0x08, 0x00, 0x91, 0x42, 0xf4, 0x7e, 0xd3, + 0x1f, 0x20, 0x03, 0xd5, 0x83, 0x6a, 0x61, 0xb8, 0x03, 0x68, 0x21, 0xb8, + 0x21, 0x10, 0x00, 0x91, 0x5f, 0x00, 0x01, 0xeb, 0x81, 0xff, 0xff, 0x54, + 0x42, 0x10, 0x00, 0xd0, 0x41, 0xb8, 0x4f, 0xb9, 0xdf, 0xee, 0x00, 0xb9, + 0xe0, 0x03, 0x17, 0x2a, 0x21, 0x04, 0x00, 0x11, 0x41, 0xb8, 0x0f, 0xb9, + 0x5b, 0xe9, 0xff, 0x97, 0xe0, 0x03, 0x16, 0xaa, 0x1d, 0xf6, 0xff, 0x97, + 0xf8, 0x02, 0x00, 0xb4, 0xe0, 0x03, 0x13, 0xaa, 0x15, 0x00, 0x80, 0x52, + 0x00, 0x03, 0x3f, 0xd6, 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x76, 0x22, 0x00, 0xf9, 0xd6, 0xda, 0x0c, 0xa9, + 0xb8, 0xff, 0xff, 0x17, 0x7f, 0x22, 0x00, 0xf9, 0xd7, 0xff, 0xff, 0x17, + 0x49, 0xe9, 0xff, 0x97, 0x75, 0x01, 0x80, 0x52, 0xe0, 0x03, 0x15, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x15, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x63, 0x16, 0x40, 0xf9, 0x63, 0x00, 0x05, 0x8b, 0x6e, 0xff, 0xff, 0x17, + 0x37, 0xe9, 0xff, 0x97, 0x75, 0x01, 0x80, 0x52, 0xe0, 0x03, 0x15, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0x03, 0x13, 0xaa, 0x80, 0x02, 0x3f, 0xd6, 0xd5, 0xee, 0x40, 0xb9, + 0xf9, 0x23, 0x40, 0xf9, 0x79, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0xf3, 0x03, 0x00, 0xaa, 0x40, 0x74, 0x1e, 0x53, 0x7f, 0x7e, 0x01, 0xa9, + 0x84, 0x08, 0xc0, 0x1a, 0x7f, 0x7e, 0x00, 0xa9, 0x61, 0x06, 0x00, 0xf9, + 0x63, 0x12, 0x00, 0xf9, 0x62, 0x12, 0x02, 0x29, 0x42, 0x7c, 0x04, 0x1b, + 0x64, 0x1e, 0x00, 0xb9, 0x63, 0x0e, 0x03, 0xa9, 0x62, 0x08, 0x02, 0x8b, + 0x62, 0x16, 0x00, 0xf9, 0x7f, 0x7e, 0x04, 0xa9, 0x7f, 0x7e, 0x05, 0xa9, + 0x7f, 0x32, 0x00, 0xf9, 0x35, 0xe9, 0xff, 0x97, 0x42, 0x10, 0x00, 0xd0, + 0x41, 0x50, 0x40, 0xb9, 0xa3, 0xaa, 0x88, 0x52, 0xa3, 0x2a, 0xaa, 0x72, + 0x63, 0x02, 0x00, 0xb9, 0x43, 0x10, 0x00, 0xd0, 0x41, 0x01, 0x00, 0x35, + 0x21, 0x04, 0x00, 0x11, 0x73, 0x4e, 0x05, 0xa9, 0x73, 0x44, 0x00, 0xf9, + 0x41, 0x50, 0x00, 0xb9, 0x09, 0xe9, 0xff, 0x97, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x63, 0x44, 0x40, 0xf9, 0x21, 0x04, 0x00, 0x11, 0x41, 0x50, 0x00, 0xb9, + 0x64, 0x2c, 0x40, 0xf9, 0x73, 0x2c, 0x00, 0xf9, 0x93, 0x28, 0x00, 0xf9, + 0x63, 0x12, 0x05, 0xa9, 0xfd, 0xe8, 0xff, 0x97, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0xf4, 0x03, 0x01, 0x2a, 0x13, 0xe9, 0xff, 0x97, + 0x61, 0x5e, 0x40, 0xf9, 0x02, 0x00, 0x00, 0x90, 0x42, 0x40, 0x03, 0x91, + 0x3f, 0x00, 0x02, 0xeb, 0x80, 0x00, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xeb, 0xe8, 0xff, 0x17, 0x61, 0x5a, 0x41, 0xb9, + 0x3f, 0x00, 0x14, 0x6b, 0x61, 0xff, 0xff, 0x54, 0x61, 0x62, 0x40, 0xf9, + 0x21, 0xff, 0xff, 0xb4, 0x23, 0x00, 0x40, 0xb9, 0xa2, 0xaa, 0x88, 0x52, + 0xa2, 0x2a, 0xaa, 0x72, 0x7f, 0x00, 0x02, 0x6b, 0x81, 0xfe, 0xff, 0x54, + 0x22, 0x48, 0x40, 0xb9, 0x42, 0xfe, 0xff, 0x34, 0x7f, 0x5e, 0x00, 0xf9, + 0x42, 0x04, 0x00, 0x51, 0x22, 0x48, 0x00, 0xb9, 0x62, 0x02, 0x00, 0x35, + 0x3f, 0x20, 0x00, 0xf9, 0x62, 0x4e, 0x40, 0xb9, 0x5f, 0x14, 0x00, 0x71, + 0x41, 0xfd, 0xff, 0x54, 0x22, 0x18, 0x40, 0xb9, 0x43, 0x10, 0x00, 0xb0, + 0x61, 0xb8, 0x4f, 0xb9, 0x5f, 0x00, 0x00, 0x71, 0xe2, 0x07, 0x9f, 0x1a, + 0x21, 0x04, 0x00, 0x11, 0x42, 0x28, 0x00, 0x11, 0x62, 0xee, 0x00, 0xb9, + 0x61, 0xb8, 0x0f, 0xb9, 0xcd, 0xe8, 0xff, 0x97, 0xe0, 0x03, 0x13, 0xaa, + 0x8f, 0xf5, 0xff, 0x97, 0xea, 0xe8, 0xff, 0x97, 0xdc, 0xff, 0xff, 0x17, + 0x62, 0x8e, 0x4c, 0xa9, 0x24, 0x20, 0x40, 0xf9, 0x43, 0x68, 0x00, 0xf9, + 0x9f, 0x00, 0x13, 0xeb, 0x62, 0x64, 0x00, 0xf9, 0x41, 0xfd, 0xff, 0x54, + 0x22, 0x20, 0x00, 0xf9, 0xe8, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xbb, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, + 0xdc, 0xe8, 0xff, 0x97, 0x61, 0x12, 0x40, 0xb9, 0x61, 0x0a, 0x00, 0x34, + 0xf5, 0x5b, 0x02, 0xa9, 0xf7, 0x63, 0x03, 0xa9, 0xf8, 0x03, 0x00, 0x2a, + 0x76, 0x0e, 0x40, 0xf9, 0x13, 0xe9, 0xff, 0x97, 0x61, 0x0e, 0x40, 0xf9, + 0x3f, 0x00, 0x00, 0xeb, 0x80, 0x00, 0x00, 0x54, 0x57, 0x10, 0x00, 0xb0, + 0xe0, 0xba, 0x4f, 0xb9, 0x00, 0x0a, 0x00, 0x34, 0x74, 0x12, 0x40, 0xb9, + 0x94, 0x06, 0x00, 0x51, 0x74, 0x12, 0x00, 0xb9, 0x74, 0x07, 0x00, 0x35, + 0xb6, 0x13, 0x00, 0xb4, 0xc0, 0x36, 0x41, 0xb9, 0x00, 0x04, 0x00, 0x51, + 0xc0, 0x36, 0x01, 0xb9, 0xa0, 0x08, 0x00, 0x34, 0x60, 0x06, 0x45, 0xa9, + 0xc2, 0x9e, 0x40, 0xf9, 0x01, 0x2c, 0x00, 0xf9, 0x5f, 0x00, 0x13, 0xeb, + 0x20, 0x28, 0x00, 0xf9, 0x40, 0x16, 0x00, 0x54, 0x75, 0x16, 0x40, 0xf9, + 0x60, 0x22, 0x40, 0xb9, 0x75, 0x05, 0x00, 0xb4, 0xf9, 0x23, 0x00, 0xf9, + 0x1f, 0x04, 0x00, 0x71, 0xd9, 0x2a, 0x41, 0xb9, 0x00, 0x08, 0x00, 0x54, + 0x61, 0x32, 0x40, 0xb9, 0x57, 0x10, 0x00, 0xb0, 0x3f, 0x04, 0x00, 0x71, + 0x29, 0x0d, 0x00, 0x54, 0xd5, 0x11, 0x00, 0xb4, 0x16, 0x00, 0x80, 0xd2, + 0xa0, 0x36, 0x41, 0xb9, 0xa0, 0x0e, 0x00, 0x35, 0xb3, 0x9e, 0x00, 0xf9, + 0x73, 0x4e, 0x05, 0xa9, 0x00, 0x04, 0x00, 0x11, 0xa0, 0x36, 0x01, 0xb9, + 0x21, 0x04, 0x00, 0x51, 0x20, 0x00, 0x80, 0x52, 0x60, 0x12, 0x00, 0xb9, + 0x75, 0x0e, 0x00, 0xf9, 0x61, 0x32, 0x00, 0xb9, 0xc1, 0x0c, 0x00, 0x35, + 0x7f, 0x16, 0x00, 0xf9, 0xe1, 0xba, 0x4f, 0xb9, 0xe0, 0x03, 0x18, 0x2a, + 0xbf, 0x5e, 0x00, 0xf9, 0x21, 0x04, 0x00, 0x11, 0xbf, 0xee, 0x00, 0xb9, + 0xe1, 0xba, 0x0f, 0xb9, 0x7f, 0xe8, 0xff, 0x97, 0x60, 0x22, 0x40, 0xb9, + 0x1f, 0x04, 0x00, 0x71, 0xc0, 0x0c, 0x00, 0x54, 0xe0, 0x03, 0x15, 0xaa, + 0x3e, 0xf5, 0xff, 0x97, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xc0, 0xfa, 0xff, 0x35, + 0x7f, 0x0e, 0x00, 0xf9, 0xe0, 0x03, 0x18, 0x2a, 0x6f, 0xe8, 0xff, 0x97, + 0xf5, 0x5b, 0x42, 0xa9, 0x14, 0x00, 0x80, 0x52, 0xf7, 0x63, 0x43, 0xa9, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x67, 0xe8, 0xff, 0x97, 0xd4, 0x03, 0x80, 0x52, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xdf, 0x9e, 0x00, 0xf9, 0xc1, 0xff, 0xff, 0x17, + 0xe0, 0x03, 0x18, 0x2a, 0xd4, 0x03, 0x80, 0x52, 0x5d, 0xe8, 0xff, 0x97, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xef, 0xff, 0xff, 0x17, + 0x57, 0x10, 0x00, 0xb0, 0xe1, 0xba, 0x4f, 0xb9, 0xe0, 0x03, 0x18, 0x2a, + 0x15, 0x04, 0x80, 0x52, 0x21, 0x04, 0x00, 0x11, 0xe1, 0xba, 0x0f, 0xb9, + 0x53, 0xe8, 0xff, 0x97, 0xc2, 0x9e, 0x40, 0xf9, 0xe0, 0x03, 0x02, 0xaa, + 0x40, 0x01, 0x00, 0xb4, 0x01, 0x20, 0x40, 0xb9, 0x3f, 0x04, 0x00, 0x71, + 0x81, 0x00, 0x00, 0x54, 0x01, 0x48, 0x40, 0xb9, 0xbf, 0x02, 0x01, 0x6b, + 0xb5, 0x92, 0x81, 0x1a, 0x00, 0x28, 0x40, 0xf9, 0x5f, 0x00, 0x00, 0xeb, + 0xe1, 0xfe, 0xff, 0x54, 0x66, 0xe8, 0xff, 0x97, 0xf8, 0x03, 0x00, 0x2a, + 0xe1, 0xba, 0x4f, 0xb9, 0x3f, 0x03, 0x15, 0x6b, 0x39, 0x93, 0x95, 0x1a, + 0x21, 0x04, 0x00, 0x51, 0xe1, 0xba, 0x0f, 0xb9, 0x61, 0x32, 0x40, 0xb9, + 0xd5, 0x32, 0x01, 0xb9, 0x3f, 0x04, 0x00, 0x71, 0x89, 0x06, 0x00, 0x54, + 0x62, 0x22, 0x40, 0xb9, 0x5f, 0x04, 0x00, 0x71, 0x21, 0x0b, 0x00, 0x54, + 0xe1, 0xba, 0x4f, 0xb9, 0x21, 0x04, 0x00, 0x11, 0xe1, 0xba, 0x0f, 0xb9, + 0x35, 0xe8, 0xff, 0x97, 0xe0, 0x03, 0x13, 0xaa, 0x3f, 0x01, 0x00, 0x94, + 0x52, 0xe8, 0xff, 0x97, 0xf8, 0x03, 0x00, 0x2a, 0xe1, 0xba, 0x4f, 0xb9, + 0x75, 0x16, 0x40, 0xf9, 0x21, 0x04, 0x00, 0x51, 0xe1, 0xba, 0x0f, 0xb9, + 0xd5, 0x04, 0x00, 0xb4, 0x60, 0x22, 0x40, 0xb9, 0x1f, 0x04, 0x00, 0x71, + 0xa1, 0x07, 0x00, 0x54, 0xa2, 0x4a, 0x40, 0xb9, 0x00, 0x04, 0x80, 0x52, + 0x61, 0x32, 0x40, 0xb9, 0x62, 0x26, 0x00, 0xb9, 0x60, 0x4a, 0x00, 0xb9, + 0x76, 0x0e, 0x40, 0xf9, 0x90, 0xff, 0xff, 0x17, 0xa0, 0x86, 0x4c, 0xa9, + 0x60, 0x16, 0x00, 0xf9, 0x01, 0x68, 0x00, 0xf9, 0x20, 0x64, 0x00, 0xf9, + 0x98, 0xff, 0xff, 0x17, 0xa2, 0x9e, 0x40, 0xf9, 0x43, 0x2c, 0x40, 0xf9, + 0x53, 0x2c, 0x00, 0xf9, 0x73, 0x28, 0x00, 0xf9, 0x62, 0x0e, 0x05, 0xa9, + 0x89, 0xff, 0xff, 0x17, 0x60, 0x32, 0x40, 0xb9, 0x80, 0x05, 0x00, 0x35, + 0xc0, 0x4a, 0x40, 0xb9, 0x1f, 0x00, 0x19, 0x6b, 0xe0, 0xf2, 0xff, 0x54, + 0xe1, 0x03, 0x19, 0x2a, 0xe0, 0x03, 0x16, 0xaa, 0x6b, 0x00, 0x00, 0x94, + 0x93, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x18, 0x2a, 0x0c, 0xe8, 0xff, 0x97, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0x9e, 0xff, 0xff, 0x17, + 0x75, 0x16, 0x40, 0xf9, 0xdb, 0xff, 0xff, 0x17, 0xe1, 0xba, 0x4f, 0xb9, + 0xe0, 0x03, 0x18, 0x2a, 0x21, 0x04, 0x00, 0x11, 0xe1, 0xba, 0x0f, 0xb9, + 0x02, 0xe8, 0xff, 0x97, 0x60, 0x0e, 0x40, 0xf9, 0x01, 0x04, 0x80, 0x52, + 0x61, 0x4a, 0x00, 0xb9, 0x01, 0x48, 0x40, 0xb9, 0x3f, 0x00, 0x19, 0x6b, + 0x60, 0x00, 0x00, 0x54, 0xe1, 0x03, 0x19, 0x2a, 0x56, 0x00, 0x00, 0x94, + 0x19, 0xe8, 0xff, 0x97, 0x7f, 0x0e, 0x00, 0xf9, 0xe1, 0xba, 0x4f, 0xb9, + 0x21, 0x04, 0x00, 0x51, 0xe1, 0xba, 0x0f, 0xb9, 0xf4, 0xe7, 0xff, 0x97, + 0xaf, 0xf6, 0xff, 0x97, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x23, 0x40, 0xf9, 0x84, 0xff, 0xff, 0x17, 0xc0, 0x9e, 0x00, 0xf9, + 0x4e, 0xff, 0xff, 0x17, 0x61, 0x32, 0x40, 0xb9, 0x16, 0x00, 0x80, 0xd2, + 0x58, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x13, 0xaa, 0xf4, 0x00, 0x00, 0x94, + 0x07, 0xe8, 0xff, 0x97, 0x61, 0x16, 0x40, 0xf9, 0x61, 0x00, 0x00, 0xb4, + 0x21, 0x48, 0x40, 0xb9, 0x61, 0x4a, 0x00, 0xb9, 0xe2, 0xe7, 0xff, 0x97, + 0xcd, 0xff, 0xff, 0x17, 0x75, 0x16, 0x40, 0xf9, 0x4b, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x18, 0x40, 0xf9, + 0x03, 0x48, 0x40, 0xb9, 0x9f, 0x00, 0x00, 0xeb, 0x00, 0x05, 0x00, 0x54, + 0xe3, 0x03, 0x03, 0x2a, 0x42, 0x10, 0x00, 0xb0, 0x42, 0xe0, 0x33, 0x91, + 0x05, 0x1c, 0x40, 0xf9, 0x46, 0x78, 0x63, 0xf8, 0x85, 0x1c, 0x00, 0xf9, + 0xa4, 0x18, 0x00, 0xf9, 0xdf, 0x00, 0x00, 0xeb, 0x80, 0x03, 0x00, 0x54, + 0x03, 0x30, 0x41, 0xb9, 0x7f, 0x00, 0x01, 0x6b, 0x69, 0x01, 0x00, 0x54, + 0xe4, 0x03, 0x01, 0x2a, 0x01, 0x48, 0x00, 0xb9, 0x01, 0x58, 0x00, 0xb9, + 0x43, 0x78, 0x64, 0xf8, 0x63, 0x01, 0x00, 0xb4, 0x61, 0x1c, 0x40, 0xf9, + 0x20, 0x18, 0x00, 0xf9, 0x60, 0x1c, 0x00, 0xf9, 0x03, 0x04, 0x03, 0xa9, + 0xc0, 0x03, 0x5f, 0xd6, 0xe4, 0x03, 0x01, 0x2a, 0x03, 0x48, 0x00, 0xb9, + 0x03, 0x58, 0x00, 0xb9, 0x43, 0x78, 0x64, 0xf8, 0xe3, 0xfe, 0xff, 0xb5, + 0x45, 0x10, 0x00, 0xb0, 0x40, 0x78, 0x24, 0xf8, 0x23, 0x00, 0x80, 0x52, + 0x00, 0x00, 0x03, 0xa9, 0xa2, 0x10, 0x4e, 0xb9, 0x61, 0x20, 0xc1, 0x1a, + 0x21, 0x00, 0x02, 0x2a, 0xa1, 0x10, 0x0e, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x04, 0x18, 0x40, 0xf9, 0x44, 0x78, 0x23, 0xf8, 0xe3, 0xff, 0xff, 0x17, + 0x45, 0x10, 0x00, 0xb0, 0x42, 0x10, 0x00, 0xb0, 0x42, 0xe0, 0x33, 0x91, + 0x24, 0x00, 0x80, 0x52, 0xa6, 0x10, 0x4e, 0xb9, 0x84, 0x20, 0xc3, 0x1a, + 0xc4, 0x00, 0x24, 0x0a, 0xa4, 0x10, 0x0e, 0xb9, 0x5f, 0x58, 0x23, 0xf8, + 0xd9, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xba, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0xf4, 0x03, 0x01, 0x2a, + 0xf5, 0x5b, 0x02, 0xa9, 0xf9, 0x6b, 0x04, 0xa9, 0xbd, 0xe7, 0xff, 0x97, + 0x79, 0x4a, 0x40, 0xb9, 0xf5, 0x03, 0x00, 0x2a, 0x3f, 0x03, 0x14, 0x6b, + 0x00, 0x08, 0x00, 0x54, 0x60, 0x4e, 0x40, 0xb9, 0x80, 0x01, 0x00, 0x34, + 0x61, 0x2e, 0x41, 0xb9, 0x74, 0x4a, 0x00, 0xb9, 0x3f, 0x00, 0x14, 0x6b, + 0x81, 0x22, 0x81, 0x1a, 0x61, 0x5a, 0x00, 0xb9, 0xe0, 0x03, 0x15, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfd, 0x7b, 0xc6, 0xa8, 0x8c, 0xe7, 0xff, 0x17, 0x60, 0x02, 0x41, 0xb9, + 0xfb, 0x2b, 0x00, 0xf9, 0x5b, 0x10, 0x00, 0xd0, 0x7a, 0x03, 0x00, 0x91, + 0xf7, 0x63, 0x03, 0xa9, 0x40, 0x7b, 0x60, 0xf8, 0x1f, 0x00, 0x13, 0xeb, + 0x20, 0x08, 0x00, 0x54, 0x3f, 0x03, 0x14, 0x6b, 0x43, 0x06, 0x00, 0x54, + 0x17, 0x00, 0x80, 0xd2, 0x42, 0x10, 0x00, 0xb0, 0x41, 0xb8, 0x4f, 0xb9, + 0x23, 0x00, 0x80, 0x52, 0xc0, 0x01, 0x80, 0x52, 0x21, 0x08, 0x00, 0x11, + 0x60, 0x4e, 0x00, 0xb9, 0x63, 0x56, 0x00, 0xb9, 0xe0, 0x03, 0x15, 0x2a, + 0x7f, 0x7a, 0x00, 0xb9, 0x58, 0x10, 0x00, 0xb0, 0x16, 0xd3, 0x47, 0xf9, + 0x41, 0xb8, 0x0f, 0xb9, 0x74, 0xe7, 0xff, 0x97, 0xe0, 0x03, 0x13, 0xaa, + 0xd6, 0xf1, 0xff, 0x97, 0x91, 0xe7, 0xff, 0x97, 0x62, 0x2a, 0x41, 0xb9, + 0x61, 0x2e, 0x41, 0xb9, 0x5f, 0x00, 0x14, 0x6b, 0x42, 0x90, 0x94, 0x1a, + 0x3f, 0x00, 0x14, 0x6b, 0x21, 0x90, 0x94, 0x1a, 0x62, 0x4a, 0x00, 0xb9, + 0x61, 0x5a, 0x00, 0xb9, 0x68, 0xe7, 0xff, 0x97, 0xe0, 0x03, 0x13, 0xaa, + 0x2a, 0xf4, 0xff, 0x97, 0x85, 0xe7, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, + 0xff, 0x02, 0x13, 0xeb, 0xe0, 0x04, 0x00, 0x54, 0xe0, 0x03, 0x15, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x2b, 0x40, 0xf9, 0xfd, 0x7b, 0xc6, 0xa8, + 0x5a, 0xe7, 0xff, 0x17, 0x60, 0x5a, 0x40, 0xb9, 0x1f, 0x00, 0x19, 0x6b, + 0xe1, 0xf7, 0xff, 0x54, 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, + 0x51, 0xe7, 0xff, 0x17, 0x61, 0x2a, 0x41, 0xb9, 0x17, 0x00, 0x80, 0xd2, + 0x60, 0x2e, 0x41, 0xb9, 0x3f, 0x00, 0x00, 0x6b, 0x81, 0xf9, 0xff, 0x54, + 0x3f, 0x00, 0x14, 0x6b, 0x49, 0x09, 0x00, 0x54, 0xe1, 0x03, 0x14, 0x2a, + 0xe0, 0x03, 0x13, 0xaa, 0x6b, 0xff, 0xff, 0x97, 0xf7, 0x63, 0x43, 0xa9, + 0xfb, 0x2b, 0x40, 0xf9, 0xb3, 0xff, 0xff, 0x17, 0x3f, 0x03, 0x14, 0x6b, + 0x09, 0x08, 0x00, 0x54, 0x61, 0x2a, 0x41, 0xb9, 0xf7, 0x03, 0x13, 0xaa, + 0x60, 0x2e, 0x41, 0xb9, 0x3f, 0x00, 0x00, 0x6b, 0xa1, 0xf7, 0xff, 0x54, + 0xf3, 0xff, 0xff, 0x17, 0x60, 0x4e, 0x40, 0xb9, 0xc0, 0x00, 0x00, 0x35, + 0x62, 0x4a, 0x40, 0xb9, 0x41, 0x10, 0x00, 0xb0, 0x21, 0x60, 0x38, 0x91, + 0x21, 0x78, 0x62, 0xf8, 0x41, 0x07, 0x00, 0xb4, 0x61, 0x02, 0x41, 0xb9, + 0x3f, 0x0c, 0x00, 0x71, 0x28, 0xfa, 0xff, 0x54, 0x41, 0x5b, 0x61, 0xf8, + 0x3f, 0x00, 0x13, 0xeb, 0x22, 0x13, 0x54, 0x7a, 0xa2, 0xf9, 0xff, 0x54, + 0x80, 0xf9, 0xff, 0x35, 0x61, 0x03, 0x40, 0xf9, 0x41, 0x00, 0x00, 0xb4, + 0x20, 0x48, 0x40, 0xb9, 0x41, 0x07, 0x40, 0xf9, 0x81, 0x00, 0x00, 0xb4, + 0x21, 0x48, 0x40, 0xb9, 0x1f, 0x00, 0x01, 0x6b, 0x00, 0x20, 0x81, 0x1a, + 0x41, 0x0b, 0x40, 0xf9, 0x81, 0x00, 0x00, 0xb4, 0x21, 0x48, 0x40, 0xb9, + 0x1f, 0x00, 0x01, 0x6b, 0x00, 0x20, 0x81, 0x1a, 0x41, 0x0f, 0x40, 0xf9, + 0x81, 0x00, 0x00, 0xb4, 0x21, 0x48, 0x40, 0xb9, 0x1f, 0x00, 0x01, 0x6b, + 0x00, 0x20, 0x81, 0x1a, 0x61, 0x4a, 0x40, 0xb9, 0x3f, 0x00, 0x00, 0x6b, + 0xe8, 0xf6, 0xff, 0x54, 0x00, 0xd3, 0x47, 0xf9, 0x1f, 0x00, 0x16, 0xeb, + 0x64, 0x12, 0x56, 0xfa, 0xa0, 0x01, 0x00, 0x54, 0x16, 0xd3, 0x07, 0xf9, + 0x60, 0x01, 0x00, 0xb4, 0x02, 0x48, 0x40, 0xb9, 0x43, 0x10, 0x00, 0xd0, + 0x41, 0x10, 0x00, 0xb0, 0x21, 0x60, 0x38, 0x91, 0x64, 0x30, 0x40, 0xb9, + 0x20, 0x00, 0x80, 0x52, 0x00, 0x20, 0xc2, 0x1a, 0x80, 0x00, 0x20, 0x0a, + 0x60, 0x30, 0x00, 0xb9, 0x3f, 0x58, 0x22, 0xf8, 0x7f, 0xe7, 0xff, 0x97, + 0x72, 0xf6, 0xff, 0x97, 0xf7, 0x63, 0x43, 0xa9, 0xfb, 0x2b, 0x40, 0xf9, + 0x72, 0xff, 0xff, 0x17, 0xf7, 0x03, 0x13, 0xaa, 0x81, 0xff, 0xff, 0x17, + 0xe0, 0x03, 0x13, 0xaa, 0x23, 0xff, 0xff, 0x97, 0xf7, 0x63, 0x43, 0xa9, + 0xfb, 0x2b, 0x40, 0xf9, 0x6b, 0xff, 0xff, 0x17, 0x41, 0x10, 0x00, 0xb0, + 0x21, 0xe0, 0x33, 0x91, 0x33, 0x78, 0x22, 0xf8, 0xc4, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0xf5, 0x03, 0x00, 0xaa, 0xf7, 0x63, 0x03, 0xa9, 0x0f, 0xe7, 0xff, 0x97, + 0xb7, 0x32, 0x40, 0xb9, 0xff, 0x06, 0x00, 0x71, 0x09, 0x09, 0x00, 0x54, + 0xf3, 0x53, 0x01, 0xa9, 0xe2, 0x03, 0x00, 0x2a, 0xff, 0x0a, 0x00, 0x71, + 0xb4, 0x16, 0x40, 0xf9, 0x93, 0x66, 0x40, 0xf9, 0x80, 0x4a, 0x40, 0xb9, + 0x61, 0x4a, 0x40, 0xb9, 0xa0, 0x03, 0x00, 0x54, 0x58, 0x10, 0x00, 0xb0, + 0x03, 0xbb, 0x4f, 0xb9, 0xf6, 0x03, 0x14, 0xaa, 0x63, 0x04, 0x00, 0x11, + 0x03, 0xbb, 0x0f, 0xb9, 0x09, 0x00, 0x00, 0x14, 0xb7, 0x32, 0x40, 0xb9, + 0x33, 0x64, 0x40, 0xf9, 0xf6, 0x03, 0x01, 0xaa, 0xf4, 0x03, 0x01, 0xaa, + 0x7f, 0x02, 0x16, 0xeb, 0x60, 0x03, 0x00, 0x54, 0x20, 0x48, 0x40, 0xb9, + 0x61, 0x4a, 0x40, 0xb9, 0x1f, 0x00, 0x01, 0x6b, 0xe0, 0x03, 0x02, 0x2a, + 0x94, 0x92, 0x93, 0x9a, 0xd2, 0xe6, 0xff, 0x97, 0xf1, 0xe6, 0xff, 0x97, + 0xe2, 0x03, 0x00, 0x2a, 0xa1, 0x16, 0x40, 0xf9, 0x3f, 0x00, 0x16, 0xeb, + 0x01, 0xfe, 0xff, 0x54, 0xa0, 0x32, 0x40, 0xb9, 0x1f, 0x00, 0x17, 0x6b, + 0x60, 0x04, 0x00, 0x54, 0xf7, 0x03, 0x00, 0x2a, 0xec, 0xff, 0xff, 0x17, + 0x1f, 0x00, 0x01, 0x6b, 0x08, 0x05, 0x00, 0x54, 0xe0, 0x03, 0x02, 0x2a, + 0xc4, 0xe6, 0xff, 0x97, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0xbb, 0x4f, 0xb9, 0x3f, 0x00, 0x13, 0xeb, + 0x00, 0x04, 0x00, 0x51, 0x00, 0xbb, 0x0f, 0xb9, 0x20, 0x01, 0x00, 0x54, + 0x24, 0x8c, 0x4c, 0xa9, 0x83, 0x68, 0x00, 0xf9, 0x60, 0x6a, 0x40, 0xf9, + 0x64, 0x64, 0x00, 0xf9, 0x33, 0x80, 0x0c, 0xa9, 0x01, 0x64, 0x00, 0xf9, + 0x61, 0x6a, 0x00, 0xf9, 0xa1, 0x16, 0x00, 0xf9, 0xe0, 0x03, 0x02, 0x2a, + 0xaf, 0xe6, 0xff, 0x97, 0x6a, 0xf5, 0xff, 0x97, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe1, 0x03, 0x14, 0xaa, + 0x73, 0x66, 0x40, 0xf9, 0xcb, 0xff, 0xff, 0x17, 0xa4, 0xe6, 0xff, 0x97, + 0x00, 0x00, 0x80, 0x52, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xb3, 0x16, 0x00, 0xf9, + 0xd8, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x00, 0xaa, 0xf3, 0x53, 0x01, 0xa9, + 0xf7, 0x63, 0x03, 0xa9, 0xf7, 0x03, 0x01, 0x2a, 0xb5, 0xe6, 0xff, 0x97, + 0xf6, 0x03, 0x00, 0x2a, 0xf1, 0xe6, 0xff, 0x97, 0xb4, 0x12, 0x40, 0xb9, + 0xf3, 0x03, 0x00, 0xaa, 0xb4, 0x03, 0x00, 0x35, 0x20, 0x00, 0x80, 0x52, + 0xa0, 0x12, 0x00, 0xb9, 0xb3, 0x0e, 0x00, 0xf9, 0x33, 0x02, 0x00, 0xb4, + 0xa0, 0x22, 0x40, 0xb9, 0x1f, 0x04, 0x00, 0x71, 0xa1, 0x00, 0x00, 0x54, + 0x61, 0x4a, 0x40, 0xb9, 0x00, 0x04, 0x80, 0x52, 0xa1, 0x26, 0x00, 0xb9, + 0xa0, 0x4a, 0x00, 0xb9, 0x60, 0x9e, 0x40, 0xf9, 0xa0, 0x08, 0x00, 0xb4, + 0x01, 0x2c, 0x40, 0xf9, 0x15, 0x2c, 0x00, 0xf9, 0x35, 0x28, 0x00, 0xf9, + 0xa0, 0x06, 0x05, 0xa9, 0x60, 0x36, 0x41, 0xb9, 0x00, 0x04, 0x00, 0x11, + 0x60, 0x36, 0x01, 0xb9, 0xe0, 0x03, 0x16, 0x2a, 0x7a, 0xe6, 0xff, 0x97, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xb8, 0x0e, 0x40, 0xf9, 0x1f, 0x03, 0x00, 0xeb, 0xa0, 0x05, 0x00, 0x54, + 0x97, 0x08, 0x00, 0x34, 0x41, 0x10, 0x00, 0xb0, 0x20, 0xb8, 0x4f, 0xb9, + 0x60, 0x08, 0x00, 0x35, 0x62, 0x5a, 0x41, 0xb9, 0x03, 0x00, 0x00, 0x90, + 0x63, 0x00, 0x38, 0x91, 0xa0, 0x32, 0x40, 0xb9, 0x42, 0x04, 0x00, 0x11, + 0x63, 0xd6, 0x0b, 0xa9, 0x62, 0x5a, 0x01, 0xb9, 0xc0, 0x03, 0x00, 0x34, + 0xa2, 0x16, 0x40, 0xf9, 0x43, 0x68, 0x40, 0xf9, 0x62, 0x8e, 0x0c, 0xa9, + 0x73, 0x64, 0x00, 0xf9, 0x53, 0x68, 0x00, 0xf9, 0x22, 0xb8, 0x4f, 0xb9, + 0x00, 0x04, 0x00, 0x11, 0xa0, 0x32, 0x00, 0xb9, 0xa3, 0x01, 0x80, 0x52, + 0x42, 0x04, 0x00, 0x11, 0x20, 0x00, 0x80, 0x52, 0x63, 0x4e, 0x00, 0xb9, + 0x60, 0x56, 0x00, 0xb9, 0xe0, 0x03, 0x16, 0x2a, 0x77, 0x7a, 0x00, 0xb9, + 0x22, 0xb8, 0x0f, 0xb9, 0x54, 0xe6, 0xff, 0x97, 0xa0, 0x22, 0x40, 0xb9, + 0x1f, 0x04, 0x00, 0x71, 0xc0, 0x02, 0x00, 0x54, 0xe0, 0x03, 0x13, 0xaa, + 0xb3, 0xf0, 0xff, 0x97, 0x74, 0xee, 0x40, 0xb9, 0xf5, 0x5b, 0x42, 0xa9, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xb3, 0x16, 0x00, 0xf9, + 0x73, 0xce, 0x0c, 0xa9, 0xe6, 0xff, 0xff, 0x17, 0x94, 0x06, 0x00, 0x11, + 0xb4, 0x12, 0x00, 0xb9, 0xe0, 0x03, 0x16, 0x2a, 0x14, 0x00, 0x80, 0x52, + 0x40, 0xe6, 0xff, 0x97, 0xc6, 0xff, 0xff, 0x17, 0x75, 0x9e, 0x00, 0xf9, + 0xb5, 0x56, 0x05, 0xa9, 0xbe, 0xff, 0xff, 0x17, 0x61, 0x4a, 0x40, 0xb9, + 0xa0, 0x4a, 0x40, 0xb9, 0x1f, 0x00, 0x01, 0x6b, 0x49, 0x00, 0x00, 0x54, + 0xa1, 0x4a, 0x00, 0xb9, 0x00, 0x33, 0x41, 0xb9, 0x3f, 0x00, 0x00, 0x6b, + 0x42, 0x00, 0x00, 0x54, 0x01, 0x33, 0x01, 0xb9, 0x00, 0x4b, 0x40, 0xb9, + 0x3f, 0x00, 0x00, 0x6b, 0x02, 0xfc, 0xff, 0x54, 0xe0, 0x03, 0x18, 0xaa, + 0x8a, 0xfe, 0xff, 0x97, 0xdd, 0xff, 0xff, 0x17, 0xb4, 0x03, 0x80, 0x52, + 0xb0, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x16, 0x2a, 0xb4, 0x03, 0x80, 0x52, + 0x28, 0xe6, 0xff, 0x97, 0xae, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x00, 0xaa, 0xf3, 0x53, 0x01, 0xa9, + 0xf7, 0x63, 0x03, 0xa9, 0x3e, 0xe6, 0xff, 0x97, 0x42, 0x10, 0x00, 0xd0, + 0x41, 0x40, 0x40, 0xb9, 0xbf, 0x02, 0x00, 0xb9, 0x21, 0x04, 0x00, 0x51, + 0x41, 0x40, 0x00, 0xb9, 0x21, 0x06, 0x00, 0x35, 0x41, 0x10, 0x00, 0xd0, + 0x3f, 0x24, 0x00, 0xf9, 0x58, 0x10, 0x00, 0xb0, 0x01, 0xbb, 0x4f, 0xb9, + 0xa2, 0x0e, 0x40, 0xf9, 0x21, 0x04, 0x00, 0x11, 0xb4, 0x32, 0x40, 0xb9, + 0x01, 0xbb, 0x0f, 0xb9, 0xbf, 0x32, 0x00, 0xb9, 0xb3, 0x16, 0x40, 0xf9, + 0xbf, 0x16, 0x00, 0xf9, 0xe2, 0x00, 0x00, 0xb4, 0x21, 0x00, 0x80, 0x52, + 0xa1, 0x12, 0x00, 0xb9, 0x09, 0xe6, 0xff, 0x97, 0xe0, 0x03, 0x15, 0xaa, + 0x47, 0xfd, 0xff, 0x97, 0x26, 0xe6, 0xff, 0x97, 0x05, 0xe6, 0xff, 0x97, + 0x34, 0x02, 0x00, 0x34, 0x55, 0x10, 0x00, 0xb0, 0xb5, 0xe2, 0x3e, 0x91, + 0x37, 0x00, 0x80, 0x52, 0x20, 0xe6, 0xff, 0x97, 0x7f, 0x5e, 0x00, 0xf9, + 0xa1, 0x02, 0x40, 0xb9, 0xf6, 0x03, 0x13, 0xaa, 0x77, 0xee, 0x00, 0xb9, + 0x94, 0x06, 0x00, 0x51, 0x21, 0x04, 0x00, 0x11, 0xa1, 0x02, 0x00, 0xb9, + 0x73, 0x66, 0x40, 0xf9, 0xf7, 0xe5, 0xff, 0x97, 0xe0, 0x03, 0x16, 0xaa, + 0xb9, 0xf2, 0xff, 0x97, 0x94, 0xfe, 0xff, 0x35, 0x13, 0xe6, 0xff, 0x97, + 0x01, 0xbb, 0x4f, 0xb9, 0x21, 0x04, 0x00, 0x51, 0x01, 0xbb, 0x0f, 0xb9, + 0xef, 0xe5, 0xff, 0x97, 0xaa, 0xf4, 0xff, 0x97, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xa1, 0x8a, 0x43, 0xa9, + 0x43, 0x10, 0x00, 0xd0, 0x64, 0x24, 0x40, 0xf9, 0x22, 0x20, 0x00, 0xf9, + 0x9f, 0x00, 0x15, 0xeb, 0x41, 0x1c, 0x00, 0xf9, 0x81, 0xf9, 0xff, 0x54, + 0x61, 0x24, 0x00, 0xf9, 0xca, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, 0x1f, 0x7c, 0x00, 0xa9, + 0x1f, 0x7c, 0x02, 0xa9, 0x01, 0x04, 0x00, 0xf9, 0x1f, 0x7c, 0x01, 0xa9, + 0x02, 0x20, 0x00, 0xb9, 0x1f, 0x7c, 0x03, 0xa9, 0x1f, 0x7c, 0x04, 0xa9, + 0x1f, 0x7c, 0x05, 0xa9, 0xf0, 0xe5, 0xff, 0x97, 0x44, 0x10, 0x00, 0xb0, + 0x43, 0x10, 0x00, 0xd0, 0x61, 0x40, 0x40, 0xb9, 0xa2, 0x88, 0x8a, 0x52, + 0xa2, 0xaa, 0xa9, 0x72, 0x62, 0x02, 0x00, 0xb9, 0x02, 0x00, 0x00, 0x90, + 0x42, 0x80, 0x3b, 0x91, 0x82, 0xfc, 0x06, 0xf9, 0x42, 0x10, 0x00, 0xd0, + 0x41, 0x01, 0x00, 0x35, 0x21, 0x04, 0x00, 0x11, 0x73, 0xce, 0x03, 0xa9, + 0x53, 0x24, 0x00, 0xf9, 0x61, 0x40, 0x00, 0xb9, 0xc0, 0xe5, 0xff, 0x97, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x42, 0x24, 0x40, 0xf9, 0x21, 0x04, 0x00, 0x11, + 0x61, 0x40, 0x00, 0xb9, 0x44, 0x20, 0x40, 0xf9, 0x53, 0x20, 0x00, 0xf9, + 0x93, 0x1c, 0x00, 0xf9, 0x62, 0x92, 0x03, 0xa9, 0xb4, 0xe5, 0xff, 0x97, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0xf4, 0x03, 0x01, 0x2a, + 0xc7, 0xe5, 0xff, 0x97, 0x61, 0x5e, 0x40, 0xf9, 0x02, 0x00, 0x00, 0x90, + 0x42, 0x00, 0x38, 0x91, 0x3f, 0x00, 0x02, 0xeb, 0x80, 0x00, 0x00, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0x9f, 0xe5, 0xff, 0x17, + 0x61, 0x5a, 0x41, 0xb9, 0x3f, 0x00, 0x14, 0x6b, 0x61, 0xff, 0xff, 0x54, + 0x61, 0x62, 0x40, 0xf9, 0x21, 0xff, 0xff, 0xb4, 0x23, 0x00, 0x40, 0xb9, + 0xa2, 0x88, 0x8a, 0x52, 0xa2, 0xaa, 0xa9, 0x72, 0x7f, 0x00, 0x02, 0x6b, + 0x81, 0xfe, 0xff, 0x54, 0x22, 0x30, 0x40, 0xb9, 0x42, 0xfe, 0xff, 0x34, + 0x7f, 0x5e, 0x00, 0xf9, 0x42, 0x04, 0x00, 0x51, 0x22, 0x30, 0x00, 0xb9, + 0x02, 0x02, 0x00, 0x35, 0x3f, 0x14, 0x00, 0xf9, 0x61, 0x4e, 0x40, 0xb9, + 0x3f, 0x34, 0x00, 0x71, 0x41, 0xfd, 0xff, 0x54, 0x42, 0x10, 0x00, 0xb0, + 0x41, 0xb8, 0x4f, 0xb9, 0xa3, 0x03, 0x80, 0x52, 0x63, 0xee, 0x00, 0xb9, + 0x21, 0x04, 0x00, 0x11, 0x41, 0xb8, 0x0f, 0xb9, 0x84, 0xe5, 0xff, 0x97, + 0xe0, 0x03, 0x13, 0xaa, 0x46, 0xf2, 0xff, 0x97, 0xa1, 0xe5, 0xff, 0x97, + 0xdf, 0xff, 0xff, 0x17, 0x62, 0x8e, 0x4c, 0xa9, 0x24, 0x14, 0x40, 0xf9, + 0x43, 0x68, 0x00, 0xf9, 0x9f, 0x00, 0x13, 0xeb, 0x62, 0x64, 0x00, 0xf9, + 0xa1, 0xfd, 0xff, 0x54, 0x22, 0x14, 0x00, 0xf9, 0xeb, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x03, 0x00, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, 0x8f, 0xe5, 0xff, 0x97, + 0x56, 0x10, 0x00, 0xb0, 0xc1, 0xba, 0x4f, 0xb9, 0x35, 0x00, 0x80, 0x52, + 0x93, 0x9e, 0x40, 0xf9, 0x21, 0x00, 0x15, 0x0b, 0xc1, 0xba, 0x0f, 0xb9, + 0x13, 0x01, 0x00, 0xb4, 0x75, 0x12, 0x00, 0xb9, 0x66, 0xe5, 0xff, 0x97, + 0xe0, 0x03, 0x13, 0xaa, 0xa4, 0xfc, 0xff, 0x97, 0x83, 0xe5, 0xff, 0x97, + 0x93, 0x9e, 0x40, 0xf9, 0x33, 0xff, 0xff, 0xb5, 0xc1, 0xba, 0x4f, 0xb9, + 0xf3, 0x53, 0x41, 0xa9, 0x21, 0x04, 0x00, 0x51, 0xc1, 0xba, 0x0f, 0xb9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0x5a, 0xe5, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0x20, 0x1e, 0x9e, 0x52, + 0x00, 0x1e, 0xbe, 0x72, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0x53, 0x10, 0x00, 0xb0, 0x61, 0x02, 0x4e, 0xb9, 0x3f, 0x00, 0x00, 0x6b, + 0xc0, 0x00, 0x00, 0x54, 0xe0, 0xcf, 0x04, 0x32, 0xbe, 0xf5, 0xff, 0x97, + 0x05, 0xe7, 0xff, 0x97, 0x9c, 0xf5, 0xff, 0x97, 0x17, 0x00, 0x00, 0x94, + 0x40, 0x10, 0x00, 0xd0, 0x00, 0x34, 0x40, 0xf9, 0xe1, 0xcf, 0x04, 0x32, + 0x61, 0x02, 0x0e, 0xb9, 0x3e, 0xe0, 0xff, 0x97, 0x44, 0x10, 0x00, 0xd0, + 0x84, 0xd0, 0x00, 0x91, 0x41, 0x10, 0x00, 0xb0, 0x21, 0x00, 0x38, 0x91, + 0x25, 0x00, 0x80, 0x52, 0x85, 0x00, 0x00, 0xb9, 0x20, 0x04, 0x40, 0xb9, + 0x23, 0x08, 0x40, 0xb9, 0x22, 0x0c, 0x40, 0xb9, 0x00, 0x00, 0x03, 0x0b, + 0x1f, 0x00, 0x02, 0x2b, 0x41, 0xff, 0xff, 0x54, 0xf3, 0x0b, 0x40, 0xf9, + 0x3f, 0x00, 0x00, 0xb9, 0xfd, 0x7b, 0xc2, 0xa8, 0xb2, 0xe5, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x96, 0xf7, 0xff, 0x97, 0x15, 0xed, 0xff, 0x97, 0x4b, 0x10, 0x00, 0xd0, + 0x4a, 0x10, 0x00, 0xd0, 0x49, 0x10, 0x00, 0xd0, 0x48, 0x10, 0x00, 0xd0, + 0x47, 0x10, 0x00, 0xb0, 0x46, 0x10, 0x00, 0xb0, 0x45, 0x10, 0x00, 0xb0, + 0x44, 0x10, 0x00, 0xb0, 0x43, 0x10, 0x00, 0xb0, 0x42, 0x10, 0x00, 0xb0, + 0x41, 0x10, 0x00, 0xb0, 0x40, 0x10, 0x00, 0xb0, 0xfd, 0x7b, 0xc1, 0xa8, + 0x7f, 0x2d, 0x00, 0xf9, 0x5f, 0x75, 0x00, 0xb9, 0x3f, 0x45, 0x00, 0xf9, + 0x1f, 0x51, 0x00, 0xb9, 0xff, 0x1c, 0x00, 0xf9, 0xdf, 0x78, 0x00, 0xb9, + 0xbf, 0x40, 0x00, 0xf9, 0x9f, 0x70, 0x00, 0xb9, 0x7f, 0x30, 0x00, 0xf9, + 0x5f, 0x90, 0x00, 0xb9, 0x3f, 0x24, 0x00, 0xf9, 0x1f, 0x40, 0x00, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xba, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0xf4, 0x03, 0x01, 0x2a, 0xf5, 0x5b, 0x02, 0xa9, + 0xf5, 0x03, 0x02, 0x2a, 0x2d, 0xe5, 0xff, 0x97, 0xd5, 0x01, 0x08, 0x36, + 0x61, 0x22, 0x40, 0xb9, 0x61, 0x00, 0x00, 0x34, 0x61, 0x0e, 0x40, 0xf9, + 0xa1, 0x12, 0x00, 0xb4, 0x61, 0x12, 0x40, 0xb9, 0x34, 0x00, 0x14, 0x0a, + 0x74, 0x12, 0x00, 0xb9, 0x04, 0xe5, 0xff, 0x97, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x61, 0x3a, 0x40, 0xb9, 0xf9, 0x6b, 0x04, 0xa9, + 0x7a, 0x12, 0x40, 0xb9, 0x76, 0x22, 0x40, 0xf9, 0x9a, 0x02, 0x1a, 0x2a, + 0x7a, 0x12, 0x00, 0xb9, 0x61, 0x00, 0x00, 0x34, 0x34, 0x00, 0x34, 0x0a, + 0x74, 0x3a, 0x00, 0xb9, 0x74, 0x0e, 0x40, 0xf9, 0x75, 0x22, 0x40, 0xb9, + 0xd4, 0x0d, 0x00, 0xb4, 0xbf, 0x06, 0x00, 0x71, 0x40, 0x10, 0x00, 0x54, + 0xf7, 0x63, 0x03, 0xa9, 0x57, 0x10, 0x00, 0x90, 0xe1, 0xba, 0x4f, 0xb9, + 0xfb, 0x2b, 0x00, 0xf9, 0xf9, 0x03, 0x14, 0xaa, 0x21, 0x04, 0x00, 0x11, + 0x18, 0x00, 0x80, 0xd2, 0xe1, 0xba, 0x0f, 0xb9, 0x1b, 0x00, 0x80, 0xd2, + 0x7f, 0x0e, 0x00, 0xf9, 0x15, 0x00, 0x00, 0x14, 0x5f, 0x00, 0x05, 0x6b, + 0x60, 0x04, 0x00, 0x54, 0x9f, 0x1c, 0x00, 0x71, 0xe0, 0x01, 0x00, 0x54, + 0x3f, 0x00, 0x14, 0xeb, 0x80, 0x05, 0x00, 0x54, 0x22, 0x68, 0x40, 0xf9, + 0x82, 0x6a, 0x00, 0xf9, 0x3f, 0x00, 0x19, 0xeb, 0x54, 0x64, 0x00, 0xf9, + 0x80, 0x0a, 0x00, 0x54, 0x62, 0x22, 0x40, 0xb9, 0x42, 0x04, 0x00, 0x51, + 0x62, 0x22, 0x00, 0xb9, 0x1b, 0x05, 0x00, 0xb4, 0x01, 0x67, 0x00, 0xf9, + 0xf8, 0x03, 0x01, 0xaa, 0x3f, 0x64, 0x00, 0xf9, 0xb5, 0x06, 0x00, 0x71, + 0x00, 0x05, 0x00, 0x54, 0xd1, 0xe4, 0xff, 0x97, 0xf0, 0xe4, 0xff, 0x97, + 0x62, 0x16, 0x40, 0xb9, 0xe1, 0x03, 0x14, 0xaa, 0xc2, 0x00, 0x00, 0x34, + 0x62, 0x12, 0x40, 0xb9, 0xe1, 0x03, 0x19, 0xaa, 0x75, 0x22, 0x40, 0xb9, + 0x5a, 0x03, 0x02, 0x2a, 0x7f, 0x16, 0x00, 0xb9, 0x23, 0xe8, 0x40, 0xb9, + 0x22, 0xd8, 0x40, 0xb9, 0x24, 0x4c, 0x40, 0xb9, 0x45, 0x03, 0x02, 0x0a, + 0x34, 0x64, 0x40, 0xf9, 0xa3, 0xfb, 0x0f, 0x37, 0x9f, 0x1c, 0x00, 0x71, + 0xe1, 0xfb, 0xff, 0x54, 0x85, 0xfd, 0xff, 0x34, 0x24, 0x70, 0x40, 0xf9, + 0x9a, 0x00, 0x00, 0xb9, 0x83, 0x00, 0x00, 0x36, 0x63, 0x12, 0x40, 0xb9, + 0x62, 0x00, 0x22, 0x0a, 0x62, 0x12, 0x00, 0xb9, 0x3f, 0x5c, 0x00, 0xf9, + 0x3f, 0x00, 0x14, 0xeb, 0x3f, 0xec, 0x00, 0xb9, 0xc1, 0xfa, 0xff, 0x54, + 0x62, 0x22, 0x40, 0xb9, 0x19, 0x00, 0x80, 0xd2, 0x42, 0x04, 0x00, 0x51, + 0x62, 0x22, 0x00, 0xb9, 0x5b, 0xfb, 0xff, 0xb5, 0x3f, 0x64, 0x00, 0xf9, + 0xf8, 0x03, 0x01, 0xaa, 0xfb, 0x03, 0x01, 0xaa, 0xb5, 0x06, 0x00, 0x71, + 0x41, 0xfb, 0xff, 0x54, 0x61, 0x3a, 0x40, 0xb9, 0x79, 0x0e, 0x00, 0xf9, + 0x01, 0x06, 0x00, 0x35, 0x54, 0x10, 0x00, 0x90, 0x94, 0xe2, 0x3e, 0x91, + 0xa5, 0xe4, 0xff, 0x97, 0x9b, 0x01, 0x00, 0xb4, 0x1f, 0x20, 0x03, 0xd5, + 0xf5, 0x03, 0x1b, 0xaa, 0x7b, 0x67, 0x40, 0xf9, 0xc0, 0xe4, 0xff, 0x97, + 0x81, 0x02, 0x40, 0xb9, 0x21, 0x04, 0x00, 0x11, 0x81, 0x02, 0x00, 0xb9, + 0x9c, 0xe4, 0xff, 0x97, 0xe0, 0x03, 0x15, 0xaa, 0x5e, 0xf1, 0xff, 0x97, + 0xfb, 0xfe, 0xff, 0xb5, 0xb8, 0xe4, 0xff, 0x97, 0xe1, 0xba, 0x4f, 0xb9, + 0x21, 0x04, 0x00, 0x51, 0xe1, 0xba, 0x0f, 0xb9, 0x94, 0xe4, 0xff, 0x97, + 0x76, 0x00, 0x00, 0xb4, 0xe0, 0x03, 0x13, 0xaa, 0xc0, 0x02, 0x3f, 0xd6, + 0x4c, 0xf3, 0xff, 0x97, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x2b, 0x40, 0xf9, 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x39, 0x64, 0x40, 0xf9, 0xac, 0xff, 0xff, 0x17, 0x75, 0x00, 0x00, 0x34, + 0x21, 0x00, 0x80, 0x52, 0x61, 0x16, 0x00, 0xb9, 0x82, 0xe4, 0xff, 0x97, + 0x96, 0x05, 0x00, 0xb4, 0xe0, 0x03, 0x13, 0xaa, 0xc0, 0x02, 0x3f, 0xd6, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x62, 0x12, 0x40, 0xb9, 0x7f, 0x3a, 0x00, 0xb9, 0x41, 0x00, 0x21, 0x0a, + 0x61, 0x12, 0x00, 0xb9, 0xcd, 0xff, 0xff, 0x17, 0x61, 0x3a, 0x40, 0xb9, + 0x34, 0x00, 0x34, 0x2a, 0x74, 0x3a, 0x00, 0xb9, 0x6c, 0xff, 0xff, 0x17, + 0x82, 0xea, 0x40, 0xb9, 0x81, 0xda, 0x40, 0xb9, 0x43, 0x03, 0x01, 0x0a, + 0x62, 0x00, 0x08, 0x36, 0x7f, 0x00, 0x01, 0x6b, 0x01, 0xfd, 0xff, 0x54, + 0xe3, 0xfc, 0xff, 0x34, 0x83, 0x72, 0x40, 0xf9, 0x7a, 0x00, 0x00, 0xb9, + 0x82, 0x00, 0x00, 0x36, 0x62, 0x12, 0x40, 0xb9, 0x41, 0x00, 0x21, 0x0a, + 0x61, 0x12, 0x00, 0xb9, 0x42, 0x10, 0x00, 0x90, 0x41, 0xb8, 0x4f, 0xb9, + 0x7f, 0x0e, 0x00, 0xf9, 0x21, 0x04, 0x00, 0x11, 0x7f, 0x22, 0x00, 0xb9, + 0x9f, 0x5e, 0x00, 0xf9, 0x9f, 0xee, 0x00, 0xb9, 0x41, 0xb8, 0x0f, 0xb9, + 0x5a, 0xe4, 0xff, 0x97, 0xe0, 0x03, 0x14, 0xaa, 0x1c, 0xf1, 0xff, 0x97, + 0x77, 0xe4, 0xff, 0x97, 0xd4, 0xff, 0xff, 0x17, 0xf9, 0x6b, 0x44, 0xa9, + 0x51, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0xf4, 0x03, 0x01, 0x2a, + 0xf5, 0x5b, 0x02, 0xa9, 0xf6, 0x03, 0x03, 0xaa, 0xf5, 0x03, 0x02, 0x2a, + 0xf7, 0x63, 0x03, 0xa9, 0xf7, 0x03, 0x04, 0x2a, 0xf9, 0x6b, 0x04, 0xa9, + 0x65, 0xe4, 0xff, 0x97, 0x65, 0x12, 0x40, 0xb9, 0x61, 0x3a, 0x40, 0xb9, + 0xf9, 0x03, 0x00, 0x2a, 0xa1, 0x00, 0x21, 0x0a, 0xc1, 0x02, 0x00, 0xb9, + 0x61, 0x3a, 0x40, 0xb9, 0x3f, 0x00, 0x00, 0x71, 0xa2, 0x00, 0x21, 0x0a, + 0x45, 0x10, 0x85, 0x1a, 0xa5, 0x00, 0x14, 0x0a, 0x75, 0x02, 0x08, 0x36, + 0x9f, 0x02, 0x05, 0x6b, 0x20, 0x02, 0x00, 0x54, 0xf8, 0x00, 0x80, 0x52, + 0xd7, 0x00, 0x00, 0x34, 0x5a, 0x10, 0x00, 0x90, 0x40, 0xbb, 0x4f, 0xb9, + 0x1f, 0x00, 0x00, 0x71, 0x84, 0x0a, 0x40, 0x7a, 0xc1, 0x02, 0x00, 0x54, + 0xe0, 0x03, 0x19, 0x2a, 0x2f, 0xe4, 0xff, 0x97, 0xe0, 0x03, 0x18, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x05, 0xfe, 0xff, 0x34, 0xb8, 0x02, 0x00, 0x12, 0xb5, 0xfe, 0x07, 0x36, + 0x60, 0x22, 0x40, 0xb9, 0x60, 0x00, 0x00, 0x34, 0x60, 0x0e, 0x40, 0xf9, + 0xa0, 0x05, 0x00, 0xb4, 0x61, 0x12, 0x40, 0xb9, 0x18, 0x00, 0x80, 0x52, + 0x34, 0x00, 0x34, 0x0a, 0x74, 0x12, 0x00, 0xb9, 0xec, 0xff, 0xff, 0x17, + 0x79, 0xe4, 0xff, 0x97, 0xf8, 0x03, 0x00, 0xaa, 0x60, 0x22, 0x40, 0xb9, + 0x02, 0x00, 0x00, 0x90, 0x42, 0x40, 0x16, 0x91, 0x01, 0x5b, 0x41, 0xb9, + 0x02, 0xcf, 0x0b, 0xa9, 0x21, 0x04, 0x00, 0x11, 0x14, 0xdb, 0x00, 0xb9, + 0x16, 0x73, 0x00, 0xf9, 0x15, 0xeb, 0x00, 0xb9, 0x01, 0x5b, 0x01, 0xb9, + 0xa0, 0x02, 0x00, 0x35, 0x78, 0x0e, 0x00, 0xf9, 0x18, 0xe3, 0x0c, 0xa9, + 0x41, 0xbb, 0x4f, 0xb9, 0x00, 0x04, 0x00, 0x11, 0x60, 0x22, 0x00, 0xb9, + 0x21, 0x04, 0x00, 0x11, 0xe2, 0x00, 0x80, 0x52, 0x20, 0x00, 0x80, 0x52, + 0x02, 0x4f, 0x00, 0xb9, 0x00, 0x57, 0x00, 0xb9, 0xe0, 0x03, 0x19, 0x2a, + 0x17, 0x7b, 0x00, 0xb9, 0x41, 0xbb, 0x0f, 0xb9, 0x01, 0xe4, 0xff, 0x97, + 0xe0, 0x03, 0x18, 0xaa, 0x63, 0xee, 0xff, 0x97, 0x1e, 0xe4, 0xff, 0x97, + 0x18, 0xef, 0x40, 0xb9, 0xf9, 0x03, 0x00, 0x2a, 0xcb, 0xff, 0xff, 0x17, + 0x61, 0x0e, 0x40, 0xf9, 0x22, 0x68, 0x40, 0xf9, 0x01, 0x8b, 0x0c, 0xa9, + 0x58, 0x64, 0x00, 0xf9, 0x38, 0x68, 0x00, 0xf9, 0xe9, 0xff, 0xff, 0x17, + 0x21, 0x00, 0x14, 0x2a, 0x18, 0x00, 0x80, 0x52, 0x61, 0x3a, 0x00, 0xb9, + 0xc1, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, 0x1f, 0x7c, 0x00, 0xa9, + 0x01, 0x04, 0x00, 0xf9, 0x1f, 0x7c, 0x01, 0xa9, 0x1f, 0x7c, 0x02, 0xa9, + 0x1f, 0x7c, 0x03, 0xa9, 0x1f, 0x20, 0x00, 0xf9, 0x06, 0xe4, 0xff, 0x97, + 0x42, 0x10, 0x00, 0xb0, 0x41, 0x78, 0x40, 0xb9, 0xc3, 0x89, 0x88, 0x52, + 0xc3, 0x8a, 0xa8, 0x72, 0x63, 0x02, 0x00, 0xb9, 0x43, 0x10, 0x00, 0xb0, + 0x41, 0x01, 0x00, 0x35, 0x21, 0x04, 0x00, 0x11, 0x73, 0xce, 0x02, 0xa9, + 0x73, 0x1c, 0x00, 0xf9, 0x41, 0x78, 0x00, 0xb9, 0xda, 0xe3, 0xff, 0x97, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x63, 0x1c, 0x40, 0xf9, 0x21, 0x04, 0x00, 0x11, + 0x41, 0x78, 0x00, 0xb9, 0x64, 0x18, 0x40, 0xf9, 0x73, 0x18, 0x00, 0xf9, + 0x93, 0x14, 0x00, 0xf9, 0x63, 0x92, 0x02, 0xa9, 0xce, 0xe3, 0xff, 0x97, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, + 0xf4, 0x03, 0x01, 0x2a, 0xe3, 0xe3, 0xff, 0x97, 0x61, 0x5e, 0x40, 0xf9, + 0x02, 0x00, 0x00, 0x90, 0x42, 0x40, 0x16, 0x91, 0x3f, 0x00, 0x02, 0xeb, + 0x80, 0x00, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xbb, 0xe3, 0xff, 0x17, 0x61, 0x5a, 0x41, 0xb9, 0x3f, 0x00, 0x14, 0x6b, + 0x61, 0xff, 0xff, 0x54, 0x61, 0x62, 0x40, 0xf9, 0x21, 0xff, 0xff, 0xb4, + 0x23, 0x00, 0x40, 0xb9, 0xc2, 0x89, 0x88, 0x52, 0xc2, 0x8a, 0xa8, 0x72, + 0x7f, 0x00, 0x02, 0x6b, 0x81, 0xfe, 0xff, 0x54, 0x22, 0x20, 0x40, 0xb9, + 0x42, 0xfe, 0xff, 0x34, 0x23, 0x0c, 0x40, 0xf9, 0x7f, 0x5e, 0x00, 0xf9, + 0x23, 0x03, 0x00, 0xb4, 0x42, 0x04, 0x00, 0x51, 0x22, 0x20, 0x00, 0xb9, + 0xe2, 0x01, 0x00, 0x35, 0x3f, 0x0c, 0x00, 0xf9, 0x61, 0x4e, 0x40, 0xb9, + 0x3f, 0x1c, 0x00, 0x71, 0x01, 0xfd, 0xff, 0x54, 0x43, 0x10, 0x00, 0x90, + 0x62, 0xb8, 0x4f, 0xb9, 0x61, 0xee, 0x00, 0xb9, 0x42, 0x04, 0x00, 0x11, + 0x62, 0xb8, 0x0f, 0xb9, 0x9f, 0xe3, 0xff, 0x97, 0xe0, 0x03, 0x13, 0xaa, + 0x61, 0xf0, 0xff, 0x97, 0xbc, 0xe3, 0xff, 0x97, 0xde, 0xff, 0xff, 0x17, + 0x7f, 0x02, 0x03, 0xeb, 0x62, 0x8e, 0x4c, 0xa9, 0x43, 0x68, 0x00, 0xf9, + 0x62, 0x64, 0x00, 0xf9, 0xe1, 0xfd, 0xff, 0x54, 0x22, 0x0c, 0x00, 0xf9, + 0xed, 0xff, 0xff, 0x17, 0x22, 0x00, 0x80, 0x52, 0x22, 0x14, 0x00, 0xb9, + 0xea, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, + 0xab, 0xe3, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, 0xf4, 0x01, 0x00, 0xb4, + 0x93, 0x82, 0x5f, 0xf8, 0xf7, 0x63, 0x03, 0xa9, 0x38, 0x22, 0x82, 0x92, + 0xd8, 0xdd, 0xdd, 0xf2, 0x96, 0x42, 0x00, 0xd1, 0x7f, 0x02, 0x18, 0xeb, + 0xe0, 0x00, 0x00, 0x54, 0xd3, 0x00, 0x00, 0xb4, 0x61, 0x02, 0x40, 0xb9, + 0xa0, 0x88, 0x8a, 0x52, 0x20, 0x4b, 0xa8, 0x72, 0x3f, 0x00, 0x00, 0x6b, + 0x40, 0x01, 0x00, 0x54, 0xf7, 0x63, 0x43, 0xa9, 0xe0, 0x03, 0x15, 0x2a, + 0x74, 0x00, 0x80, 0x52, 0x78, 0xe3, 0xff, 0x97, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xd0, 0xe3, 0xff, 0x97, 0xf7, 0x03, 0x00, 0xaa, + 0x81, 0x02, 0x5f, 0xf8, 0x77, 0x1e, 0x00, 0xf9, 0x60, 0x12, 0x40, 0xb9, + 0x21, 0x00, 0x16, 0xcb, 0x62, 0x12, 0x40, 0xf9, 0x98, 0x82, 0x1f, 0xf8, + 0x00, 0x00, 0x01, 0x0b, 0x60, 0x12, 0x00, 0xb9, 0x5f, 0x00, 0x16, 0xeb, + 0x49, 0x00, 0x00, 0x54, 0x76, 0x12, 0x00, 0xf9, 0x74, 0x4a, 0x40, 0xb9, + 0xb4, 0x05, 0x00, 0x34, 0x38, 0x22, 0x82, 0x92, 0xf9, 0x6b, 0x04, 0xa9, + 0x59, 0x10, 0x00, 0x90, 0x39, 0xe3, 0x3e, 0x91, 0xd8, 0xdd, 0xdd, 0xf2, + 0x76, 0x22, 0x40, 0xf9, 0xe0, 0x03, 0x15, 0x2a, 0xda, 0xda, 0x40, 0xb9, + 0x5b, 0xe3, 0xff, 0x97, 0xe0, 0x03, 0x13, 0xaa, 0xe1, 0x03, 0x1a, 0x2a, + 0x48, 0x00, 0x00, 0x94, 0xf4, 0x03, 0x00, 0xaa, 0x76, 0xe3, 0xff, 0x97, + 0x77, 0x1e, 0x00, 0xf9, 0x82, 0x42, 0x00, 0xd1, 0xf5, 0x03, 0x00, 0x2a, + 0x14, 0x02, 0x00, 0xb4, 0x60, 0x22, 0x40, 0xf9, 0x63, 0x4a, 0x40, 0xb9, + 0x1f, 0x00, 0x16, 0xeb, 0xe0, 0x03, 0x00, 0x54, 0x80, 0x02, 0x5f, 0xf8, + 0x61, 0x12, 0x40, 0xb9, 0x00, 0x00, 0x02, 0xcb, 0x64, 0x12, 0x40, 0xf9, + 0x98, 0x82, 0x1f, 0xf8, 0x21, 0x00, 0x00, 0x0b, 0x61, 0x12, 0x00, 0xb9, + 0x9f, 0x00, 0x02, 0xeb, 0x49, 0x00, 0x00, 0x54, 0x62, 0x12, 0x00, 0xf9, + 0xa3, 0xfc, 0xff, 0x35, 0xe0, 0x03, 0x15, 0x2a, 0x14, 0x00, 0x80, 0x52, + 0x40, 0xe3, 0xff, 0x97, 0xfb, 0xf1, 0xff, 0x97, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0x03, 0x15, 0x2a, 0x36, 0xe3, 0xff, 0x97, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xc0, 0xda, 0x40, 0xb9, + 0x1f, 0x00, 0x1a, 0x6b, 0x01, 0xfc, 0xff, 0x54, 0x63, 0x04, 0x00, 0x51, + 0x63, 0x4a, 0x00, 0xb9, 0xa3, 0x02, 0x00, 0x34, 0xc0, 0x86, 0x4c, 0xa9, + 0x60, 0x22, 0x00, 0xf9, 0x01, 0x68, 0x00, 0xf9, 0x20, 0x64, 0x00, 0xf9, + 0xc2, 0x72, 0x40, 0xf9, 0xdf, 0x5e, 0x00, 0xf9, 0x21, 0x03, 0x40, 0xb9, + 0xe0, 0x03, 0x15, 0x2a, 0x21, 0x04, 0x00, 0x11, 0x54, 0x00, 0x00, 0xf9, + 0xdf, 0xee, 0x00, 0xb9, 0x21, 0x03, 0x00, 0xb9, 0x1d, 0xe3, 0xff, 0x97, + 0xe0, 0x03, 0x16, 0xaa, 0xdf, 0xef, 0xff, 0x97, 0x3a, 0xe3, 0xff, 0x97, + 0xf5, 0x03, 0x00, 0x2a, 0x63, 0x4a, 0x40, 0xb9, 0x23, 0xf7, 0xff, 0x35, + 0xd4, 0xff, 0xff, 0x17, 0x7f, 0x22, 0x00, 0xf9, 0xef, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xb9, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x03, 0x00, 0xaa, 0xf7, 0x63, 0x03, 0xa9, 0xf8, 0x03, 0x01, 0x2a, + 0x2a, 0xe3, 0xff, 0x97, 0x82, 0x06, 0x42, 0x29, 0x21, 0x08, 0x00, 0x51, + 0x41, 0x10, 0x01, 0x0b, 0x3f, 0x00, 0x18, 0x6b, 0xa9, 0x0f, 0x00, 0x54, + 0xf3, 0x03, 0x00, 0x2a, 0xf5, 0x5b, 0x02, 0xa9, 0x37, 0x22, 0x82, 0x92, + 0xf9, 0x6b, 0x04, 0xa9, 0x15, 0x00, 0x80, 0x52, 0x19, 0x00, 0x80, 0x52, + 0xfb, 0x2b, 0x00, 0xf9, 0x5b, 0xe3, 0xff, 0x97, 0x9a, 0x16, 0x40, 0xb9, + 0xf6, 0x03, 0x00, 0xaa, 0x9b, 0x12, 0x40, 0xf9, 0x5a, 0x07, 0x00, 0x11, + 0xd7, 0xdd, 0xdd, 0xf2, 0x80, 0x1e, 0x00, 0xf9, 0x60, 0x07, 0x40, 0xf9, + 0x1f, 0x00, 0x17, 0xeb, 0x00, 0x05, 0x00, 0x54, 0x7b, 0x03, 0x40, 0xf9, + 0x5f, 0x03, 0x00, 0x71, 0xe0, 0x07, 0x9f, 0x1a, 0x5a, 0x03, 0x00, 0x4b, + 0xb5, 0x06, 0x00, 0x11, 0xbf, 0x4e, 0x00, 0x71, 0x08, 0x06, 0x00, 0x54, + 0x80, 0x1e, 0x40, 0xf9, 0x1f, 0x00, 0x16, 0xeb, 0x81, 0x01, 0x00, 0x54, + 0x7a, 0xfe, 0xff, 0x35, 0xe0, 0x03, 0x13, 0x2a, 0xe7, 0xe2, 0xff, 0x97, + 0x00, 0x00, 0x80, 0xd2, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x2b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xff, 0x6f, 0x00, 0xb9, + 0x1f, 0x20, 0x03, 0xd5, 0xe0, 0x03, 0x13, 0x2a, 0xdb, 0xe2, 0xff, 0x97, + 0xe2, 0x6f, 0x40, 0xb9, 0x42, 0x04, 0x00, 0x11, 0xe2, 0x6f, 0x00, 0xb9, + 0xf7, 0xe2, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0xe2, 0x6f, 0x40, 0xb9, + 0x5f, 0x08, 0x00, 0x71, 0xe9, 0xfe, 0xff, 0x54, 0x9a, 0x16, 0x40, 0xb9, + 0x96, 0x1e, 0x00, 0xf9, 0x5a, 0x07, 0x00, 0x11, 0x9b, 0x12, 0x40, 0xf9, + 0x1a, 0xfb, 0xff, 0x35, 0xe5, 0xff, 0xff, 0x17, 0x59, 0x00, 0x00, 0x35, + 0x9b, 0x12, 0x00, 0xf9, 0x61, 0x03, 0x40, 0xf9, 0x20, 0x00, 0x1b, 0xcb, + 0x00, 0x40, 0x00, 0x51, 0x1f, 0x03, 0x00, 0x6b, 0x89, 0x03, 0x00, 0x54, + 0x22, 0x00, 0x40, 0xa9, 0x1f, 0x00, 0x17, 0xeb, 0x80, 0x01, 0x00, 0x54, + 0xba, 0x02, 0x00, 0x34, 0x5a, 0x07, 0x00, 0x51, 0xfb, 0x03, 0x02, 0xaa, + 0x39, 0x00, 0x80, 0x52, 0xcc, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x13, 0x2a, + 0xbc, 0xe2, 0xff, 0x97, 0x15, 0x00, 0x80, 0x52, 0xda, 0xe2, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0xcc, 0xff, 0xff, 0x17, 0x80, 0x16, 0x40, 0xb9, + 0x39, 0x00, 0x80, 0x52, 0x62, 0x03, 0x00, 0xf9, 0x00, 0x04, 0x00, 0x51, + 0x80, 0x16, 0x00, 0xb9, 0x82, 0x12, 0x40, 0xf9, 0x5f, 0x00, 0x01, 0xeb, + 0xc1, 0xf7, 0xff, 0x54, 0x9b, 0x12, 0x00, 0xf9, 0xbc, 0xff, 0xff, 0x17, + 0xfb, 0x03, 0x02, 0xaa, 0x39, 0x00, 0x80, 0x52, 0xbc, 0xff, 0xff, 0x17, + 0x40, 0xf8, 0xff, 0x34, 0x02, 0x00, 0x18, 0x4b, 0x5f, 0x4c, 0x00, 0x71, + 0xa9, 0x01, 0x00, 0x54, 0x05, 0x43, 0x00, 0x11, 0x02, 0x43, 0x00, 0x11, + 0x62, 0x03, 0x02, 0x8b, 0x83, 0x16, 0x40, 0xb9, 0x24, 0x22, 0x82, 0x92, + 0xe0, 0x03, 0x18, 0x2a, 0x61, 0x4b, 0x25, 0xf8, 0xc4, 0xdd, 0xdd, 0xf2, + 0x44, 0x04, 0x00, 0xf9, 0x61, 0x04, 0x00, 0x11, 0x81, 0x16, 0x00, 0xb9, + 0x62, 0x03, 0x00, 0xf9, 0x81, 0x12, 0x40, 0xb9, 0x74, 0x07, 0x00, 0xf9, + 0x21, 0x40, 0x00, 0x51, 0x82, 0x12, 0x40, 0xf9, 0x20, 0x00, 0x00, 0x4b, + 0x80, 0x12, 0x00, 0xb9, 0x5f, 0x00, 0x1b, 0xeb, 0x20, 0x02, 0x00, 0x54, + 0xe0, 0x03, 0x13, 0x2a, 0x91, 0xe2, 0xff, 0x97, 0x60, 0x43, 0x00, 0x91, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x2b, 0x40, 0xf9, 0xfd, 0x7b, 0xc7, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x88, 0xe2, 0xff, 0x97, 0x00, 0x00, 0x80, 0xd2, + 0xf3, 0x53, 0x41, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc7, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x03, 0x40, 0xf9, 0x80, 0x12, 0x00, 0xf9, + 0xee, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0xf4, 0x03, 0x06, 0xaa, + 0xf5, 0x5b, 0x02, 0xa9, 0xf6, 0x03, 0x04, 0xaa, 0xf5, 0x03, 0x05, 0xaa, + 0xf7, 0x63, 0x03, 0xa9, 0xf8, 0x03, 0x02, 0xaa, 0xf7, 0x03, 0x03, 0xaa, + 0xf9, 0x23, 0x00, 0xf9, 0xf9, 0x03, 0x01, 0xaa, 0x8f, 0xe2, 0xff, 0x97, + 0x79, 0x00, 0x00, 0xb4, 0x61, 0x06, 0x40, 0xf9, 0x21, 0x03, 0x00, 0xf9, + 0x78, 0x00, 0x00, 0xb4, 0x61, 0x12, 0x40, 0xb9, 0x01, 0x03, 0x00, 0xb9, + 0x77, 0x00, 0x00, 0xb4, 0x61, 0x16, 0x40, 0xb9, 0xe1, 0x02, 0x00, 0xb9, + 0x76, 0x00, 0x00, 0xb4, 0x61, 0x22, 0x40, 0xf9, 0xc1, 0x02, 0x00, 0xf9, + 0x75, 0x00, 0x00, 0xb4, 0x61, 0x4a, 0x40, 0xb9, 0xa1, 0x02, 0x00, 0xb9, + 0x74, 0x00, 0x00, 0xb4, 0x61, 0x2a, 0x40, 0xf9, 0x81, 0x02, 0x00, 0xf9, + 0x5c, 0xe2, 0xff, 0x97, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbe, 0xa9, + 0x63, 0x70, 0x1d, 0x12, 0x67, 0x40, 0x00, 0x51, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, 0x44, 0x40, 0x23, 0x8b, + 0x1f, 0x7c, 0x00, 0xa9, 0xe0, 0x03, 0x04, 0xaa, 0x7f, 0x7e, 0x03, 0xa9, + 0x46, 0x00, 0x80, 0x52, 0x25, 0x22, 0x82, 0x92, 0x61, 0x06, 0x00, 0xf9, + 0xc5, 0xdd, 0xdd, 0xf2, 0x67, 0x1a, 0x02, 0x29, 0x62, 0x8a, 0x01, 0xa9, + 0x62, 0x16, 0x00, 0xf9, 0x63, 0x32, 0x00, 0xb9, 0x7f, 0x7e, 0x04, 0xa9, + 0x7f, 0x7e, 0x05, 0xa9, 0x93, 0x80, 0x1f, 0xf8, 0x02, 0x0c, 0x1f, 0xf8, + 0x40, 0x14, 0x00, 0xa9, 0x7f, 0x1e, 0x00, 0xf9, 0x5c, 0xe2, 0xff, 0x97, + 0x42, 0x10, 0x00, 0xb0, 0x41, 0x90, 0x40, 0xb9, 0xa3, 0x88, 0x8a, 0x52, + 0x23, 0x4b, 0xa8, 0x72, 0x63, 0x02, 0x00, 0xb9, 0x43, 0x10, 0x00, 0xb0, + 0x41, 0x01, 0x00, 0x35, 0x21, 0x04, 0x00, 0x11, 0x73, 0x4e, 0x05, 0xa9, + 0x73, 0x30, 0x00, 0xf9, 0x41, 0x90, 0x00, 0xb9, 0x30, 0xe2, 0xff, 0x97, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x63, 0x30, 0x40, 0xf9, 0x21, 0x04, 0x00, 0x11, + 0x41, 0x90, 0x00, 0xb9, 0x64, 0x2c, 0x40, 0xf9, 0x73, 0x2c, 0x00, 0xf9, + 0x93, 0x28, 0x00, 0xf9, 0x63, 0x12, 0x05, 0xa9, 0x24, 0xe2, 0xff, 0x97, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0xf4, 0x03, 0x01, 0x2a, + 0x37, 0xe2, 0xff, 0x97, 0x61, 0x5e, 0x40, 0xf9, 0x02, 0x00, 0x00, 0x90, + 0x42, 0x00, 0x31, 0x91, 0x3f, 0x00, 0x02, 0xeb, 0x80, 0x00, 0x00, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0x0f, 0xe2, 0xff, 0x17, + 0x61, 0x5a, 0x41, 0xb9, 0x3f, 0x00, 0x14, 0x6b, 0x61, 0xff, 0xff, 0x54, + 0x61, 0x62, 0x40, 0xf9, 0x21, 0xff, 0xff, 0xb4, 0x23, 0x00, 0x40, 0xb9, + 0xa2, 0x88, 0x8a, 0x52, 0x22, 0x4b, 0xa8, 0x72, 0x7f, 0x00, 0x02, 0x6b, + 0x81, 0xfe, 0xff, 0x54, 0x22, 0x48, 0x40, 0xb9, 0x42, 0xfe, 0xff, 0x34, + 0x7f, 0x5e, 0x00, 0xf9, 0x42, 0x04, 0x00, 0x51, 0x22, 0x48, 0x00, 0xb9, + 0x02, 0x02, 0x00, 0x35, 0x3f, 0x20, 0x00, 0xf9, 0x61, 0x4e, 0x40, 0xb9, + 0x3f, 0x24, 0x00, 0x71, 0x41, 0xfd, 0xff, 0x54, 0x42, 0x10, 0x00, 0x90, + 0x41, 0xb8, 0x4f, 0xb9, 0x03, 0x02, 0x80, 0x52, 0x63, 0xee, 0x00, 0xb9, + 0x21, 0x04, 0x00, 0x11, 0x41, 0xb8, 0x0f, 0xb9, 0xf4, 0xe1, 0xff, 0x97, + 0xe0, 0x03, 0x13, 0xaa, 0xb6, 0xee, 0xff, 0x97, 0x11, 0xe2, 0xff, 0x97, + 0xdf, 0xff, 0xff, 0x17, 0x62, 0x8e, 0x4c, 0xa9, 0x24, 0x20, 0x40, 0xf9, + 0x43, 0x68, 0x00, 0xf9, 0x9f, 0x00, 0x13, 0xeb, 0x62, 0x64, 0x00, 0xf9, + 0xa1, 0xfd, 0xff, 0x54, 0x22, 0x20, 0x00, 0xf9, 0xeb, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbb, 0xa9, 0x42, 0x1c, 0x00, 0x11, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x00, 0xaa, + 0xf7, 0x63, 0x03, 0xa9, 0x57, 0x70, 0x1d, 0x12, 0xf8, 0x03, 0x01, 0xaa, + 0xf9, 0x23, 0x00, 0xf9, 0xf9, 0x03, 0x03, 0x2a, 0xf9, 0xe1, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0x35, 0xe2, 0xff, 0x97, 0xf6, 0x03, 0x00, 0xaa, + 0x04, 0x00, 0x00, 0x14, 0xa1, 0x1e, 0x40, 0xf9, 0x3f, 0x00, 0x16, 0xeb, + 0x80, 0x02, 0x00, 0x54, 0xb6, 0x1e, 0x00, 0xf9, 0xe0, 0x03, 0x13, 0x2a, + 0xcf, 0xe1, 0xff, 0x97, 0xe1, 0x03, 0x17, 0x2a, 0xe0, 0x03, 0x15, 0xaa, + 0xbc, 0xfe, 0xff, 0x97, 0xf4, 0x03, 0x00, 0xaa, 0xea, 0xe1, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0x94, 0xfe, 0xff, 0xb4, 0x14, 0x03, 0x00, 0xf9, + 0xc6, 0xe1, 0xff, 0x97, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x1f, 0x03, 0x00, 0xf9, + 0x79, 0x05, 0x00, 0x34, 0x41, 0x10, 0x00, 0x90, 0x22, 0xb8, 0x4f, 0xb9, + 0x02, 0x05, 0x00, 0x35, 0xc0, 0x5a, 0x41, 0xb9, 0x02, 0x00, 0x00, 0x90, + 0x42, 0x00, 0x31, 0x91, 0xa3, 0x4a, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x11, + 0xc2, 0xd6, 0x0b, 0xa9, 0x62, 0x04, 0x00, 0x11, 0xd7, 0xda, 0x00, 0xb9, + 0xd8, 0x72, 0x00, 0xf9, 0xc0, 0x5a, 0x01, 0xb9, 0xa2, 0x4a, 0x00, 0xb9, + 0x23, 0x03, 0x00, 0x34, 0xa0, 0x22, 0x40, 0xf9, 0x02, 0x68, 0x40, 0xf9, + 0xc0, 0x8a, 0x0c, 0xa9, 0x56, 0x64, 0x00, 0xf9, 0x16, 0x68, 0x00, 0xf9, + 0x22, 0xb8, 0x4f, 0xb9, 0x23, 0x01, 0x80, 0x52, 0x20, 0x00, 0x80, 0x52, + 0xc3, 0x4e, 0x00, 0xb9, 0x42, 0x04, 0x00, 0x11, 0xc0, 0x56, 0x00, 0xb9, + 0xd9, 0x7a, 0x00, 0xb9, 0xe0, 0x03, 0x13, 0x2a, 0x22, 0xb8, 0x0f, 0xb9, + 0x9f, 0xe1, 0xff, 0x97, 0xe0, 0x03, 0x16, 0xaa, 0x01, 0xec, 0xff, 0x97, + 0xc0, 0xee, 0x40, 0xb9, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xb6, 0x22, 0x00, 0xf9, 0xd6, 0xda, 0x0c, 0xa9, + 0xeb, 0xff, 0xff, 0x17, 0x92, 0xe1, 0xff, 0x97, 0x00, 0x02, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0xf1, + 0x44, 0x18, 0x40, 0xfa, 0x00, 0x09, 0x00, 0x54, 0xfd, 0x7b, 0xba, 0xa9, + 0x7f, 0x00, 0x00, 0x71, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0xf4, 0x03, 0x03, 0x2a, 0xf9, 0x6b, 0x04, 0xa9, + 0x3a, 0x1c, 0x00, 0x12, 0x01, 0x08, 0x40, 0xb9, 0x20, 0x10, 0x43, 0x7a, + 0xa2, 0x00, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x5c, 0x40, 0x39, + 0x60, 0xff, 0xff, 0x35, 0x20, 0x00, 0x80, 0x52, 0xf5, 0x5b, 0x02, 0xa9, + 0xf5, 0x03, 0x02, 0xaa, 0xf7, 0x63, 0x03, 0xa9, 0xf8, 0x03, 0x00, 0x2a, + 0xfb, 0x73, 0x05, 0xa9, 0x1c, 0x00, 0x80, 0x52, 0x60, 0x5a, 0x00, 0x39, + 0x60, 0x0e, 0x40, 0xb9, 0x77, 0x02, 0x40, 0xf9, 0x02, 0x00, 0x14, 0x0b, + 0x5f, 0x00, 0x01, 0x6b, 0xe9, 0x04, 0x00, 0x54, 0x21, 0x00, 0x00, 0x4b, + 0x3f, 0x00, 0x14, 0x6b, 0x36, 0x90, 0x94, 0x1a, 0xf9, 0x27, 0x9f, 0x1a, + 0x9f, 0x03, 0x00, 0x71, 0x96, 0x02, 0x16, 0x4b, 0xe2, 0xc7, 0x9f, 0x1a, + 0xf4, 0x03, 0x01, 0x2a, 0x39, 0x03, 0x02, 0x0a, 0xfb, 0x03, 0x14, 0x2a, + 0xe0, 0x42, 0x20, 0x8b, 0xe2, 0x03, 0x1b, 0xaa, 0xe1, 0x03, 0x15, 0xaa, + 0xde, 0xc2, 0x00, 0x94, 0x63, 0x0e, 0x40, 0xb9, 0x60, 0x52, 0x40, 0x39, + 0x94, 0x02, 0x03, 0x0b, 0x74, 0x0e, 0x00, 0xb9, 0x00, 0x03, 0x00, 0x34, + 0x60, 0x12, 0x40, 0xb9, 0x61, 0x0a, 0x40, 0xb9, 0x9f, 0x02, 0x00, 0x6b, + 0xa9, 0x02, 0x00, 0x54, 0x9f, 0x02, 0x01, 0x6b, 0x83, 0x00, 0x00, 0x54, + 0x14, 0x00, 0x80, 0x52, 0x7f, 0x0e, 0x00, 0xb9, 0x78, 0x52, 0x00, 0x39, + 0x74, 0x12, 0x00, 0xb9, 0x78, 0x56, 0x00, 0x39, 0x59, 0x02, 0x00, 0x34, + 0x60, 0x0e, 0x40, 0xb9, 0xf4, 0x03, 0x16, 0x2a, 0x9c, 0x07, 0x00, 0x11, + 0xb5, 0x02, 0x1b, 0x8b, 0x02, 0x00, 0x14, 0x0b, 0x5f, 0x00, 0x01, 0x6b, + 0x68, 0xfb, 0xff, 0x54, 0x19, 0x00, 0x80, 0x52, 0x16, 0x00, 0x80, 0x52, + 0xe1, 0xff, 0xff, 0x17, 0xc0, 0x03, 0x5f, 0xd6, 0x61, 0x0a, 0x40, 0xb9, + 0x9f, 0x02, 0x01, 0x6b, 0x43, 0xfe, 0xff, 0x54, 0x7f, 0x0e, 0x00, 0xb9, + 0x78, 0x52, 0x00, 0x39, 0xef, 0xff, 0xff, 0x17, 0x7f, 0x5a, 0x00, 0x39, + 0xba, 0x00, 0x00, 0x35, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xb8, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x13, 0xaa, + 0x01, 0x03, 0x80, 0xd2, 0x8e, 0x76, 0x00, 0x94, 0x61, 0x0a, 0x40, 0xb9, + 0xe0, 0x03, 0x17, 0xaa, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xfd, 0x7b, 0xc6, 0xa8, 0x85, 0x76, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0xf1, 0x64, 0x18, 0x40, 0xfa, 0x04, 0x18, 0x40, 0xfa, + 0xc0, 0x08, 0x00, 0x54, 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0x00, 0x5c, 0x40, 0x39, + 0xf5, 0x5b, 0x02, 0xa9, 0xf4, 0x03, 0x03, 0xaa, 0x76, 0x0a, 0x40, 0xb9, + 0xf9, 0x23, 0x00, 0xf9, 0x79, 0x02, 0x40, 0xf9, 0x7f, 0x00, 0x00, 0xb9, + 0xa0, 0x06, 0x00, 0x35, 0xdf, 0x02, 0x02, 0x6b, 0x63, 0x12, 0x40, 0xb9, + 0xd6, 0x92, 0x82, 0x1a, 0xf7, 0x63, 0x03, 0xa9, 0xf7, 0x03, 0x01, 0xaa, + 0x18, 0x00, 0x80, 0x52, 0x75, 0x0e, 0x40, 0xb9, 0x21, 0x43, 0x23, 0x8b, + 0xe0, 0x03, 0x17, 0xaa, 0xbf, 0x02, 0x03, 0x6b, 0x00, 0x04, 0x00, 0x54, + 0x82, 0x02, 0x40, 0xb9, 0xb5, 0x02, 0x03, 0x4b, 0x5f, 0x00, 0x16, 0x6b, + 0x04, 0x3b, 0x42, 0x7a, 0x80, 0x04, 0x00, 0x54, 0x64, 0x52, 0x40, 0x39, + 0xe4, 0x03, 0x00, 0x35, 0xc3, 0x02, 0x02, 0x4b, 0x18, 0x07, 0x00, 0x11, + 0x7f, 0x00, 0x15, 0x6b, 0x62, 0x90, 0x95, 0x1a, 0x75, 0x90, 0x95, 0x1a, + 0xf7, 0x02, 0x02, 0x8b, 0x80, 0xc2, 0x00, 0x94, 0x80, 0x02, 0x40, 0xb9, + 0x00, 0x00, 0x15, 0x0b, 0x80, 0x02, 0x00, 0xb9, 0x63, 0x12, 0x40, 0xb9, + 0x60, 0x0a, 0x40, 0xb9, 0xa3, 0x02, 0x03, 0x0b, 0x63, 0x12, 0x00, 0xb9, + 0x7f, 0x00, 0x00, 0x6b, 0xa3, 0xfc, 0xff, 0x54, 0x75, 0x0e, 0x40, 0xb9, + 0x03, 0x00, 0x80, 0x52, 0x7f, 0x12, 0x00, 0xb9, 0x21, 0x43, 0x23, 0x8b, + 0x7f, 0x52, 0x00, 0x39, 0xe0, 0x03, 0x17, 0xaa, 0xbf, 0x02, 0x03, 0x6b, + 0x41, 0xfc, 0xff, 0x54, 0x62, 0x52, 0x40, 0x39, 0x1f, 0x0b, 0x00, 0x71, + 0xe2, 0x00, 0x00, 0x34, 0x82, 0x02, 0x40, 0xb9, 0xc0, 0x12, 0x42, 0x7a, + 0x89, 0x00, 0x00, 0x54, 0x75, 0x0a, 0x40, 0xb9, 0xb5, 0x02, 0x03, 0x4b, + 0xe0, 0xff, 0xff, 0x17, 0xf7, 0x63, 0x43, 0xa9, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0x13, 0x1c, 0x00, 0x12, 0x7f, 0x2a, 0x00, 0x71, + 0xe0, 0x00, 0x00, 0x54, 0xe1, 0x03, 0x13, 0x2a, 0x02, 0x00, 0x80, 0x52, + 0xf3, 0x0b, 0x40, 0xf9, 0x00, 0x00, 0x80, 0x52, 0xfd, 0x7b, 0xc2, 0xa8, + 0x29, 0x3f, 0x00, 0x14, 0x02, 0x00, 0x80, 0x52, 0xa1, 0x01, 0x80, 0x52, + 0x00, 0x00, 0x80, 0x52, 0x25, 0x3f, 0x00, 0x94, 0xc0, 0xfe, 0xff, 0x34, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x01, 0x03, 0x00, 0xf0, 0x20, 0x00, 0x07, 0x39, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xf0, 0x00, 0x00, 0x47, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x21, 0x02, 0x00, 0xf0, + 0x20, 0x5c, 0x03, 0xf9, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x21, 0x03, 0x00, 0x90, 0x20, 0xe8, 0x02, 0xf9, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xe1, 0x03, 0x00, 0x2a, 0x20, 0x00, 0x80, 0x52, + 0x3f, 0x7c, 0x00, 0x71, 0x88, 0x00, 0x00, 0x54, 0x22, 0x02, 0x00, 0xf0, + 0x00, 0x00, 0x80, 0x52, 0x41, 0xb0, 0x08, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0xff, 0x43, 0x00, 0xd1, 0xe0, 0x07, 0x00, 0xf9, 0x00, 0x01, 0x00, 0xb4, + 0xe1, 0x03, 0x00, 0xaa, 0x20, 0x02, 0x00, 0xf0, 0x02, 0xb0, 0x48, 0xb9, + 0x00, 0x00, 0x80, 0x52, 0x22, 0x00, 0x00, 0xb9, 0xff, 0x43, 0x00, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, 0xff, 0x43, 0x00, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0xff, 0x4f, 0x00, 0xb9, + 0xe0, 0x03, 0x00, 0xb4, 0xe0, 0x03, 0x13, 0xaa, 0x01, 0x00, 0x80, 0x12, + 0x44, 0xde, 0xff, 0x97, 0x1f, 0x68, 0x08, 0x71, 0x80, 0xff, 0xff, 0x54, + 0x80, 0x02, 0x00, 0x35, 0xf5, 0x5b, 0x02, 0xa9, 0x35, 0x03, 0x00, 0x90, + 0xb5, 0x22, 0x07, 0x91, 0xe1, 0x03, 0x15, 0xaa, 0xe3, 0x33, 0x01, 0x91, + 0x02, 0x80, 0x80, 0x52, 0x20, 0x02, 0x00, 0xf0, 0x00, 0x00, 0x24, 0x91, + 0xff, 0x4f, 0x00, 0xb9, 0x63, 0xff, 0xff, 0x97, 0x20, 0x02, 0x00, 0xf0, + 0x00, 0xc0, 0x1a, 0x91, 0x00, 0x44, 0x00, 0x91, 0x27, 0xde, 0xff, 0x97, + 0x00, 0x08, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x1f, 0x10, 0x08, 0x71, + 0xc0, 0x05, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf5, 0x5b, 0x02, 0xa9, 0x35, 0x03, 0x00, 0x90, + 0xb5, 0x22, 0x07, 0x91, 0x20, 0x02, 0x00, 0xf0, 0xe1, 0x03, 0x15, 0xaa, + 0xe3, 0x33, 0x01, 0x91, 0x00, 0x00, 0x24, 0x91, 0x02, 0x80, 0x80, 0x52, + 0xf7, 0x1b, 0x00, 0xf9, 0x4b, 0xff, 0xff, 0x97, 0x20, 0x03, 0x00, 0x90, + 0xe3, 0x4f, 0x40, 0xb9, 0xf6, 0x60, 0x86, 0x52, 0xe2, 0x03, 0x15, 0xaa, + 0x00, 0xe8, 0x42, 0xf9, 0xf7, 0x03, 0x16, 0x2a, 0x21, 0x00, 0x80, 0x52, + 0x14, 0x00, 0x80, 0x52, 0x13, 0x00, 0x80, 0x52, 0xdd, 0xfe, 0xff, 0x97, + 0xe0, 0x4f, 0x40, 0xb9, 0x1f, 0x00, 0x14, 0x6b, 0xe9, 0x01, 0x00, 0x54, + 0x7f, 0x02, 0x00, 0x71, 0x64, 0x12, 0x56, 0x7a, 0x81, 0xff, 0xff, 0x54, + 0xa0, 0x4a, 0x74, 0x38, 0x85, 0xff, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x60, 0x00, 0x00, 0x35, 0x94, 0x06, 0x00, 0x11, 0xf5, 0xff, 0xff, 0x17, + 0x1f, 0x00, 0x17, 0x6b, 0x61, 0xfe, 0xff, 0x54, 0x20, 0x00, 0x80, 0x52, + 0x29, 0xdd, 0xff, 0x97, 0xf0, 0xff, 0xff, 0x17, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf5, 0x5b, 0x02, 0xa9, 0x35, 0x03, 0x00, 0x90, + 0xb5, 0x22, 0x07, 0x91, 0xe1, 0x03, 0x15, 0xaa, 0xe3, 0x33, 0x01, 0x91, + 0x20, 0x02, 0x00, 0xf0, 0x02, 0x80, 0x80, 0x52, 0x00, 0x00, 0x24, 0x91, + 0xf7, 0x1b, 0x00, 0xf9, 0xff, 0x4f, 0x00, 0xb9, 0x20, 0xff, 0xff, 0x97, + 0xd5, 0xff, 0xff, 0x17, 0xf7, 0x1b, 0x00, 0xf9, 0xd3, 0xff, 0xff, 0x17, + 0xfd, 0x7b, 0xbc, 0xa9, 0x21, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x13, 0x00, 0x80, 0x52, 0xf5, 0x5b, 0x02, 0xa9, + 0xe1, 0xff, 0x00, 0x39, 0x40, 0x00, 0x00, 0xb4, 0x13, 0x00, 0x40, 0xb9, + 0x35, 0x02, 0x00, 0xf0, 0xb5, 0xc2, 0x1a, 0x91, 0x34, 0x02, 0x00, 0xf0, + 0x94, 0x02, 0x24, 0x91, 0x20, 0x00, 0x80, 0x52, 0xb6, 0x46, 0x00, 0x91, + 0xa0, 0xc6, 0x01, 0x39, 0x08, 0x00, 0x00, 0x14, 0x40, 0x06, 0x80, 0x52, + 0x02, 0xdd, 0xff, 0x97, 0x73, 0x00, 0x00, 0x34, 0x73, 0x06, 0x00, 0x71, + 0x00, 0x02, 0x00, 0x54, 0xa0, 0xc6, 0x41, 0x39, 0xc0, 0x01, 0x00, 0x34, + 0x82, 0x86, 0x41, 0x29, 0x00, 0x00, 0x80, 0x52, 0x5f, 0x00, 0x01, 0x6b, + 0x61, 0x00, 0x00, 0x54, 0x80, 0x52, 0x40, 0x39, 0x00, 0x00, 0x00, 0x52, + 0xe0, 0xff, 0x00, 0x39, 0xe0, 0xff, 0x40, 0x39, 0x1f, 0x1c, 0x00, 0x72, + 0x01, 0xfe, 0xff, 0x54, 0xe0, 0x03, 0x16, 0xaa, 0x81, 0xff, 0xff, 0x97, + 0xed, 0xff, 0xff, 0x17, 0x20, 0x00, 0x80, 0x52, 0xa0, 0xca, 0x01, 0x39, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x33, 0x02, 0x00, 0xf0, + 0x73, 0xc2, 0x1a, 0x91, 0x7f, 0xc6, 0x01, 0x39, 0x5a, 0xc8, 0xff, 0x97, + 0x61, 0xca, 0x41, 0x39, 0x61, 0x02, 0x00, 0x35, 0xf4, 0x03, 0x00, 0xaa, + 0xf5, 0x13, 0x00, 0xf9, 0xf5, 0x47, 0x88, 0xd2, 0xf5, 0x01, 0xa0, 0xf2, + 0x1f, 0x20, 0x03, 0xd5, 0x20, 0x00, 0x80, 0x52, 0xd9, 0xdc, 0xff, 0x97, + 0x50, 0xc8, 0xff, 0x97, 0xe1, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x14, 0xaa, + 0x5d, 0xc8, 0xff, 0x97, 0x61, 0xca, 0x41, 0x39, 0x1f, 0x00, 0x15, 0xeb, + 0xe2, 0x87, 0x9f, 0x1a, 0x21, 0x00, 0x00, 0x52, 0x5f, 0x00, 0x01, 0x6a, + 0xa1, 0xfe, 0xff, 0x54, 0xf5, 0x13, 0x40, 0xf9, 0x34, 0x02, 0x00, 0xf0, + 0x94, 0x02, 0x24, 0x91, 0x73, 0x46, 0x00, 0x91, 0xe0, 0x03, 0x13, 0xaa, + 0x59, 0xff, 0xff, 0x97, 0x81, 0x82, 0x41, 0x29, 0x3f, 0x00, 0x00, 0x6b, + 0x81, 0xff, 0xff, 0x54, 0x80, 0x52, 0x40, 0x39, 0x40, 0xff, 0xff, 0x35, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x34, 0x02, 0x00, 0xf0, 0x94, 0xc2, 0x1a, 0x91, 0xf5, 0x13, 0x00, 0xf9, + 0xe0, 0xff, 0x00, 0x39, 0x95, 0xc6, 0x41, 0x39, 0x15, 0x03, 0x00, 0x34, + 0x93, 0x46, 0x00, 0x91, 0xe0, 0x03, 0x13, 0xaa, 0x01, 0x00, 0x80, 0x12, + 0x90, 0xdd, 0xff, 0x97, 0x1f, 0x68, 0x08, 0x71, 0x80, 0xff, 0xff, 0x54, + 0x1f, 0x10, 0x08, 0x71, 0x60, 0x00, 0x00, 0x54, 0x1f, 0x00, 0x00, 0x71, + 0xf5, 0x17, 0x9f, 0x1a, 0xe2, 0xff, 0x00, 0x91, 0x23, 0x00, 0x80, 0x52, + 0x01, 0x00, 0x80, 0x52, 0x20, 0x02, 0x00, 0xf0, 0x00, 0x00, 0x24, 0x91, + 0x4c, 0xfe, 0xff, 0x97, 0x80, 0x46, 0x00, 0x91, 0x76, 0xdd, 0xff, 0x97, + 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf4, 0xfe, 0xff, 0x97, + 0x1f, 0x00, 0x00, 0x71, 0xf5, 0x17, 0x9f, 0x1a, 0xe0, 0x03, 0x15, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbc, 0xa9, 0x01, 0x00, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x33, 0x02, 0x00, 0xf0, + 0x73, 0xc2, 0x1a, 0x91, 0xf4, 0x03, 0x00, 0x2a, 0x60, 0x42, 0x40, 0x39, + 0xa0, 0x00, 0x00, 0x34, 0xe0, 0x03, 0x01, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x81, 0x01, 0x00, 0xf0, + 0x21, 0x20, 0x1a, 0x91, 0x60, 0x46, 0x00, 0x91, 0x3c, 0xdd, 0xff, 0x97, + 0xe1, 0x03, 0x00, 0x2a, 0xe0, 0xfe, 0xff, 0x35, 0x22, 0x00, 0x80, 0x52, + 0x01, 0x00, 0x80, 0xd2, 0x62, 0x42, 0x00, 0x39, 0x86, 0x3d, 0x00, 0x94, + 0xe1, 0x03, 0x00, 0x2a, 0x20, 0xfe, 0xff, 0x35, 0x62, 0x06, 0x40, 0xf9, + 0xe0, 0x03, 0x80, 0x52, 0xf5, 0x5b, 0x02, 0xa9, 0x60, 0x02, 0x02, 0xb9, + 0x42, 0x01, 0x00, 0xb4, 0x5f, 0x7c, 0x00, 0xa9, 0x01, 0x0c, 0x80, 0xd2, + 0x60, 0x06, 0x40, 0xf9, 0x5f, 0x7c, 0x01, 0xa9, 0x5f, 0x7c, 0x02, 0xa9, + 0x5f, 0x7c, 0x03, 0xa9, 0x5f, 0x7c, 0x04, 0xa9, 0x5f, 0x7c, 0x05, 0xa9, + 0xfd, 0x74, 0x00, 0x94, 0x36, 0x03, 0x00, 0x90, 0xd5, 0xea, 0x42, 0xf9, + 0x95, 0x01, 0x00, 0xb4, 0xf7, 0x1b, 0x00, 0xf9, 0x37, 0x03, 0x00, 0x90, + 0xd4, 0x02, 0x00, 0x35, 0xe0, 0x03, 0x15, 0xaa, 0x01, 0x03, 0x80, 0xd2, + 0xf4, 0x74, 0x00, 0x94, 0xc1, 0xea, 0x42, 0xf9, 0xe0, 0xe6, 0x42, 0xf9, + 0x21, 0x08, 0x40, 0xb9, 0xf0, 0x74, 0x00, 0x94, 0xf7, 0x1b, 0x40, 0xf9, + 0x60, 0xe2, 0x01, 0x91, 0xf3, 0x53, 0x41, 0xa9, 0x02, 0x00, 0x00, 0x90, + 0xf5, 0x5b, 0x42, 0xa9, 0x42, 0xc0, 0x0e, 0x91, 0xfd, 0x7b, 0xc4, 0xa8, + 0x81, 0x01, 0x00, 0xf0, 0x26, 0x00, 0x80, 0x52, 0x21, 0x60, 0x1a, 0x91, + 0x05, 0x03, 0x80, 0x52, 0x04, 0x00, 0x81, 0x52, 0x03, 0x00, 0x80, 0xd2, + 0xf3, 0xdb, 0xff, 0x17, 0x9f, 0x12, 0x40, 0x71, 0x00, 0x00, 0x88, 0xd2, + 0x80, 0x92, 0x80, 0x9a, 0xa0, 0x0a, 0x00, 0xb9, 0x56, 0xd0, 0xff, 0x97, + 0xe0, 0xe6, 0x02, 0xf9, 0xa0, 0x02, 0x00, 0xf9, 0xbf, 0xc2, 0x00, 0xf8, + 0xbf, 0x2a, 0x00, 0x79, 0xbf, 0x5e, 0x00, 0x39, 0xe1, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x02, 0x00, 0xf0, 0x21, 0x00, 0x80, 0x52, 0x01, 0xc0, 0x1a, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x02, 0x00, 0xf0, 0x21, 0x00, 0x80, 0x52, + 0x01, 0xc4, 0x1a, 0x39, 0xc0, 0x03, 0x5f, 0xd6, 0x22, 0x02, 0x00, 0xf0, + 0x42, 0xc0, 0x1a, 0x91, 0x40, 0x18, 0x01, 0xf9, 0x41, 0x1c, 0x01, 0xf9, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x22, 0x02, 0x00, 0xf0, 0x42, 0xc0, 0x1a, 0x91, + 0x43, 0x18, 0x41, 0xf9, 0x03, 0x00, 0x00, 0xf9, 0x40, 0x1c, 0x41, 0xf9, + 0x20, 0x00, 0x00, 0xf9, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x22, 0x02, 0x00, 0xf0, 0x42, 0xc0, 0x1a, 0x91, 0x40, 0x20, 0x01, 0xf9, + 0x41, 0x24, 0x01, 0xf9, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x02, 0x00, 0xf0, + 0x42, 0xc0, 0x1a, 0x91, 0x43, 0x20, 0x41, 0xf9, 0x03, 0x00, 0x00, 0xf9, + 0x40, 0x24, 0x41, 0xf9, 0x20, 0x00, 0x00, 0xf9, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0x21, 0x02, 0x00, 0xf0, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0x13, 0x1c, 0x00, 0x12, + 0x20, 0xc0, 0x5a, 0x39, 0x20, 0x02, 0x00, 0x34, 0x22, 0xc0, 0x1a, 0x91, + 0x7f, 0xfe, 0x00, 0x71, 0xe1, 0x03, 0x13, 0x2a, 0x40, 0x18, 0x41, 0xf9, + 0x69, 0x00, 0x00, 0x54, 0x40, 0x1c, 0x41, 0xf9, 0x61, 0x16, 0x00, 0x12, + 0xb3, 0x01, 0x38, 0x37, 0x01, 0x24, 0xc1, 0x9a, 0x00, 0x00, 0x80, 0x52, + 0xe1, 0x00, 0x00, 0x36, 0xe2, 0xd8, 0xff, 0x97, 0x60, 0x22, 0x00, 0x2a, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0x5a, 0x6d, 0x00, 0x14, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x60, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0x22, 0x02, 0x00, 0xf0, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0x13, 0x1c, 0x00, 0x12, 0x40, 0xc0, 0x5a, 0x39, + 0x80, 0x02, 0x00, 0x34, 0x43, 0xc0, 0x1a, 0x91, 0x7f, 0xfe, 0x00, 0x71, + 0xe2, 0x03, 0x13, 0x2a, 0x60, 0x18, 0x41, 0xf9, 0x69, 0x00, 0x00, 0x54, + 0x60, 0x1c, 0x41, 0xf9, 0x62, 0x16, 0x00, 0x12, 0x13, 0x02, 0x38, 0x37, + 0x02, 0x24, 0xc2, 0x9a, 0x00, 0x00, 0x80, 0x52, 0x42, 0x01, 0x00, 0x36, + 0xe1, 0x2f, 0x00, 0xb9, 0xc1, 0xd8, 0xff, 0x97, 0xe1, 0x2f, 0x40, 0xb9, + 0xe2, 0x03, 0x01, 0x2a, 0xe1, 0x03, 0x13, 0x2a, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0x3f, 0x6d, 0x00, 0x14, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x60, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0x21, 0x02, 0x00, 0xf0, 0x21, 0xc0, 0x1a, 0x91, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0x13, 0x1c, 0x00, 0x12, + 0x20, 0x04, 0x40, 0x39, 0xc0, 0x01, 0x00, 0x34, 0x22, 0x20, 0x41, 0xf9, + 0x13, 0x02, 0x30, 0x37, 0x61, 0x1a, 0x00, 0x12, 0x20, 0x60, 0x80, 0x52, + 0x53, 0x01, 0x38, 0x36, 0x42, 0x24, 0xc1, 0x9a, 0x00, 0x00, 0x80, 0x52, + 0xe2, 0x00, 0x00, 0x36, 0xa0, 0xd8, 0xff, 0x97, 0x60, 0x22, 0x00, 0x2a, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0x18, 0x6d, 0x00, 0x14, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x22, 0x24, 0x41, 0xf9, 0x61, 0x16, 0x00, 0x12, + 0xf0, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xbd, 0xa9, 0x23, 0x02, 0x00, 0xf0, + 0x63, 0xc0, 0x1a, 0x91, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0x13, 0x1c, 0x00, 0x12, 0x60, 0x04, 0x40, 0x39, 0x20, 0x02, 0x00, 0x34, + 0x62, 0x20, 0x41, 0xf9, 0x73, 0x02, 0x30, 0x37, 0x63, 0x1a, 0x00, 0x12, + 0x20, 0x60, 0x80, 0x52, 0xb3, 0x01, 0x38, 0x36, 0x42, 0x24, 0xc3, 0x9a, + 0x00, 0x00, 0x80, 0x52, 0x42, 0x01, 0x00, 0x36, 0xe1, 0x2f, 0x00, 0xb9, + 0x83, 0xd8, 0xff, 0x97, 0xe1, 0x2f, 0x40, 0xb9, 0xe2, 0x03, 0x01, 0x2a, + 0xe1, 0x03, 0x13, 0x2a, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0x01, 0x6d, 0x00, 0x14, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x62, 0x24, 0x41, 0xf9, + 0x63, 0x16, 0x00, 0x12, 0xed, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xc3, 0x0d, 0xd1, 0xfd, 0x7b, 0x00, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0x56, 0x3c, 0x00, 0x12, 0x35, 0x02, 0x00, 0xf0, + 0xb5, 0xc2, 0x1a, 0x91, 0xe2, 0x43, 0x08, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x43, 0x10, 0x91, 0xff, 0x5b, 0x14, 0x29, + 0xff, 0x57, 0x00, 0xf9, 0xa8, 0x42, 0x40, 0x39, 0x40, 0x30, 0x80, 0x3d, + 0x41, 0x34, 0x80, 0x3d, 0x42, 0x38, 0x80, 0x3d, 0x43, 0x3c, 0x80, 0x3d, + 0x04, 0x00, 0x90, 0x3c, 0x05, 0x00, 0x91, 0x3c, 0x06, 0x00, 0x92, 0x3c, + 0x07, 0x00, 0x93, 0x3c, 0xe0, 0x43, 0x0d, 0x91, 0x04, 0x14, 0x00, 0xa9, + 0x06, 0x1c, 0x01, 0xa9, 0x68, 0x01, 0x00, 0x34, 0xf7, 0x63, 0x03, 0xa9, + 0xf4, 0x03, 0x03, 0xaa, 0xf7, 0x03, 0x01, 0x2a, 0x7f, 0x42, 0x00, 0x71, + 0x00, 0x0d, 0x00, 0x54, 0xa1, 0x02, 0x42, 0xb9, 0x20, 0x00, 0x1c, 0x32, + 0x1f, 0x00, 0x13, 0x6a, 0xe1, 0x00, 0x00, 0x54, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0x40, 0xa9, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xff, 0xc3, 0x0d, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0xf9, 0x6b, 0x04, 0xa9, + 0xfb, 0x73, 0x05, 0xa9, 0x7f, 0x22, 0x00, 0x71, 0xf9, 0x17, 0x9f, 0x1a, + 0xff, 0x0e, 0x00, 0x71, 0xe0, 0x07, 0x9f, 0x1a, 0xff, 0xce, 0x00, 0x71, + 0x04, 0x18, 0x40, 0x7a, 0x81, 0x09, 0x00, 0x54, 0x61, 0x06, 0x00, 0x51, + 0x74, 0x12, 0x00, 0x51, 0x3f, 0x04, 0x00, 0x71, 0x94, 0x7a, 0x1d, 0x12, + 0xfc, 0x97, 0x9f, 0x1a, 0xfb, 0x03, 0x19, 0x2a, 0x1c, 0x00, 0x1c, 0x0a, + 0xbc, 0x01, 0x00, 0x34, 0x7f, 0x12, 0x00, 0x71, 0x60, 0x01, 0x00, 0x54, + 0xe1, 0x03, 0x16, 0x2a, 0xff, 0x7e, 0x03, 0x71, 0xa9, 0x00, 0x00, 0x54, + 0xe0, 0x0f, 0x80, 0x12, 0xa0, 0xff, 0xff, 0x97, 0xb8, 0x06, 0x40, 0xf9, + 0x06, 0x00, 0x00, 0x14, 0x00, 0x00, 0x80, 0x52, 0x5c, 0xff, 0xff, 0x97, + 0x1f, 0x20, 0x03, 0xd5, 0xb8, 0x06, 0x40, 0xf9, 0x97, 0x09, 0x00, 0x34, + 0xe0, 0x0e, 0x1c, 0x12, 0x1f, 0x00, 0x02, 0x71, 0x00, 0x19, 0x00, 0x54, + 0xc8, 0x04, 0x00, 0x54, 0x1f, 0xc0, 0x00, 0x71, 0xe0, 0x19, 0x00, 0x54, + 0x08, 0x01, 0x00, 0x54, 0x1f, 0x80, 0x00, 0x71, 0x41, 0x05, 0x00, 0x54, + 0x16, 0x4f, 0x02, 0x29, 0xc6, 0xc6, 0xff, 0x97, 0x00, 0x0f, 0x00, 0xf9, + 0xb8, 0x06, 0x40, 0xf9, 0x1f, 0x20, 0x03, 0xd5, 0xe0, 0x03, 0x18, 0xaa, + 0x01, 0x0c, 0x80, 0xd2, 0xd3, 0x73, 0x00, 0x94, 0xd4, 0x01, 0x00, 0x35, + 0xff, 0x82, 0x03, 0x71, 0xe4, 0x1a, 0x47, 0x7a, 0xe1, 0x07, 0x00, 0x54, + 0x7f, 0x42, 0x00, 0x71, 0xa0, 0x05, 0x00, 0x54, 0x5b, 0x01, 0x00, 0x34, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x00, 0x80, 0x52, 0xb2, 0x6e, 0x00, 0x94, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xbe, 0xff, 0xff, 0x17, 0x7f, 0x42, 0x00, 0x71, 0x60, 0x04, 0x00, 0x54, + 0xfd, 0x7b, 0x40, 0xa9, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xff, 0xc3, 0x0d, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0x1f, 0xc0, 0x02, 0x71, + 0xa0, 0x14, 0x00, 0x54, 0x1f, 0x80, 0x03, 0x71, 0x41, 0xfc, 0xff, 0x54, + 0x16, 0x4f, 0x0a, 0x29, 0xa2, 0xc6, 0xff, 0x97, 0x00, 0x2f, 0x00, 0xf9, + 0xb8, 0x06, 0x40, 0xf9, 0xdd, 0xff, 0xff, 0x17, 0xff, 0x0a, 0x1b, 0x72, + 0xc0, 0xfa, 0xff, 0x54, 0xda, 0xff, 0xff, 0x17, 0x7f, 0x02, 0x01, 0x6a, + 0x21, 0x04, 0x00, 0x54, 0x60, 0x06, 0x00, 0x51, 0x74, 0x12, 0x00, 0x51, + 0x1f, 0x04, 0x00, 0x71, 0x94, 0x7a, 0x1d, 0x12, 0xfc, 0x97, 0x9f, 0x1a, + 0xfb, 0x03, 0x19, 0x2a, 0xb4, 0xff, 0xff, 0x17, 0xf9, 0x6b, 0x04, 0xa9, + 0xfb, 0x73, 0x05, 0xa9, 0x30, 0xfe, 0xff, 0x97, 0xa1, 0x02, 0x42, 0xb9, + 0xa1, 0xff, 0xff, 0x17, 0x2d, 0xfe, 0xff, 0x97, 0xff, 0x4a, 0x00, 0x71, + 0x80, 0xfb, 0xff, 0x54, 0x22, 0x75, 0x00, 0x94, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0x92, 0xff, 0xff, 0x17, + 0x16, 0x4f, 0x00, 0x29, 0x84, 0xc6, 0xff, 0x97, 0xe1, 0x03, 0x00, 0xaa, + 0xa0, 0x06, 0x40, 0xf9, 0x01, 0x07, 0x00, 0xf9, 0x01, 0x0c, 0x80, 0xd2, + 0x92, 0x73, 0x00, 0x94, 0x14, 0x0c, 0x00, 0x35, 0xe1, 0x03, 0x19, 0x2a, + 0xe0, 0x83, 0x02, 0x91, 0x03, 0xda, 0xff, 0x97, 0xbf, 0xff, 0xff, 0x17, + 0x7f, 0x06, 0x00, 0x71, 0x20, 0x10, 0x00, 0x54, 0x7f, 0x0a, 0x00, 0x71, + 0x80, 0x0b, 0x00, 0x54, 0x7f, 0x12, 0x00, 0x71, 0x40, 0x00, 0x80, 0x52, + 0xe0, 0x00, 0x00, 0x54, 0x7f, 0x22, 0x00, 0x71, 0x60, 0x00, 0x80, 0x52, + 0x80, 0x00, 0x00, 0x54, 0x7f, 0x42, 0x00, 0x71, 0xe0, 0x17, 0x9f, 0x1a, + 0x00, 0x74, 0x1e, 0x53, 0x00, 0x08, 0x7d, 0xd3, 0xfa, 0x43, 0x03, 0x91, + 0xa0, 0x02, 0x00, 0x8b, 0x18, 0x04, 0x41, 0xf9, 0xc4, 0xd7, 0xff, 0x97, + 0xe5, 0x03, 0x16, 0x2a, 0xe4, 0x03, 0x00, 0x2a, 0xe2, 0x03, 0x18, 0xaa, + 0xe0, 0x03, 0x1a, 0xaa, 0xe3, 0x03, 0x17, 0x2a, 0xe1, 0x3f, 0x80, 0xd2, + 0x61, 0x07, 0x00, 0x94, 0xf8, 0x03, 0x00, 0x2a, 0x1f, 0xf8, 0x07, 0x71, + 0x6c, 0x0a, 0x00, 0x54, 0xfb, 0x3f, 0x80, 0x52, 0x7b, 0x03, 0x18, 0x4b, + 0x46, 0xc3, 0x38, 0x8b, 0x7c, 0x7f, 0x40, 0x93, 0xe2, 0xc3, 0x0d, 0x91, + 0xe2, 0x0b, 0x0b, 0xa9, 0xe3, 0x43, 0x0d, 0x91, 0xe1, 0x03, 0x80, 0x12, + 0xe0, 0x0f, 0x80, 0x12, 0xe3, 0x63, 0x00, 0xf9, 0xe2, 0x03, 0x14, 0xaa, + 0xe1, 0x03, 0x19, 0x29, 0xe3, 0xc3, 0x01, 0x91, 0xe4, 0x17, 0x4b, 0xa9, + 0xe4, 0x17, 0x07, 0xa9, 0xe0, 0x03, 0x06, 0xaa, 0xe4, 0x17, 0x4c, 0xa9, + 0xe1, 0x03, 0x1c, 0xaa, 0xe6, 0x37, 0x00, 0xf9, 0xe4, 0x17, 0x08, 0xa9, + 0x6d, 0x07, 0x00, 0x94, 0x7f, 0x03, 0x00, 0x6b, 0xe6, 0x37, 0x40, 0xf9, + 0xad, 0x00, 0x00, 0x54, 0x18, 0x03, 0x00, 0x0b, 0x7b, 0x03, 0x00, 0x4b, + 0x46, 0xc3, 0x38, 0x8b, 0x7c, 0x7f, 0x40, 0x93, 0x43, 0x01, 0x80, 0x52, + 0xe1, 0x03, 0x1c, 0xaa, 0xe0, 0x03, 0x06, 0xaa, 0xe2, 0x63, 0x02, 0x91, + 0xe3, 0x33, 0x01, 0x79, 0x3c, 0x07, 0x00, 0x94, 0x7f, 0x03, 0x00, 0x6b, + 0x00, 0x03, 0x00, 0x0b, 0xb4, 0x46, 0x00, 0x91, 0x18, 0xc0, 0x98, 0x1a, + 0x1f, 0x20, 0x03, 0xd5, 0xe0, 0x03, 0x14, 0xaa, 0x01, 0x00, 0x80, 0x12, + 0x98, 0xdb, 0xff, 0x97, 0x1f, 0x68, 0x08, 0x71, 0x80, 0xff, 0xff, 0x54, + 0x1f, 0x10, 0x08, 0x71, 0x60, 0x07, 0x00, 0x54, 0x60, 0x06, 0x00, 0x51, + 0x74, 0x12, 0x00, 0x51, 0x1f, 0x04, 0x00, 0x71, 0x94, 0x7a, 0x1d, 0x12, + 0xfc, 0x97, 0x9f, 0x1a, 0xfb, 0x03, 0x19, 0x2a, 0x1f, 0x03, 0x00, 0x71, + 0xed, 0x00, 0x00, 0x54, 0x20, 0x02, 0x00, 0xf0, 0xe3, 0x03, 0x18, 0x2a, + 0xe2, 0x03, 0x1a, 0xaa, 0x00, 0x00, 0x24, 0x91, 0x01, 0x00, 0x80, 0x52, + 0x4e, 0xfc, 0xff, 0x97, 0xa0, 0x46, 0x00, 0x91, 0x78, 0xdb, 0xff, 0x97, + 0x40, 0xff, 0xff, 0x17, 0x7f, 0x42, 0x00, 0x71, 0xc1, 0xed, 0xff, 0x54, + 0xbc, 0xfd, 0xff, 0x97, 0x91, 0xff, 0xff, 0x17, 0x20, 0x00, 0x80, 0xd2, + 0x00, 0x00, 0x01, 0x91, 0xfa, 0x43, 0x03, 0x91, 0xa0, 0x0e, 0x00, 0x8b, + 0x18, 0x04, 0x40, 0xf9, 0x71, 0xd7, 0xff, 0x97, 0xe3, 0x03, 0x17, 0x2a, + 0xe4, 0x03, 0x00, 0x2a, 0xe2, 0x03, 0x18, 0xaa, 0xe0, 0x03, 0x1a, 0xaa, + 0xe1, 0x3f, 0x80, 0xd2, 0x0f, 0x07, 0x00, 0x94, 0xf8, 0x03, 0x00, 0x2a, + 0x1f, 0xf8, 0x07, 0x71, 0xed, 0xf5, 0xff, 0x54, 0xfc, 0x3f, 0x80, 0xd2, + 0xe6, 0x03, 0x1a, 0xaa, 0xfb, 0x03, 0x1c, 0x2a, 0x18, 0x00, 0x80, 0x52, + 0xae, 0xff, 0xff, 0x17, 0x16, 0x4f, 0x06, 0x29, 0x05, 0xc6, 0xff, 0x97, + 0x00, 0x1f, 0x00, 0xf9, 0xb8, 0x06, 0x40, 0xf9, 0x40, 0xff, 0xff, 0x17, + 0x16, 0x4f, 0x08, 0x29, 0x00, 0xc6, 0xff, 0x97, 0x00, 0x27, 0x00, 0xf9, + 0xb8, 0x06, 0x40, 0xf9, 0x3b, 0xff, 0xff, 0x17, 0x16, 0x4f, 0x04, 0x29, + 0xfb, 0xc5, 0xff, 0x97, 0x00, 0x17, 0x00, 0xf9, 0xb8, 0x06, 0x40, 0xf9, + 0x36, 0xff, 0xff, 0x17, 0x00, 0x00, 0x80, 0xd2, 0xdd, 0xff, 0xff, 0x17, + 0x7f, 0x42, 0x00, 0x71, 0xe0, 0x07, 0x9f, 0x1a, 0xff, 0x4a, 0x00, 0x71, + 0x1c, 0x10, 0x9f, 0x1a, 0x5c, 0xf8, 0xff, 0x34, 0x1b, 0x00, 0x80, 0x52, + 0x14, 0x01, 0x80, 0x52, 0x13, 0x02, 0x80, 0x52, 0xc4, 0xff, 0xff, 0x17, + 0x00, 0x3c, 0x00, 0x12, 0x1f, 0x40, 0x00, 0x71, 0xe8, 0x01, 0x00, 0x54, + 0xc1, 0x22, 0x80, 0xd2, 0x21, 0x00, 0xa0, 0xf2, 0x21, 0x24, 0xc0, 0x9a, + 0x61, 0x01, 0x00, 0x36, 0xfd, 0x7b, 0xbf, 0xa9, 0x02, 0x00, 0x84, 0x52, + 0x01, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, 0x83, 0x01, 0x00, 0xf0, + 0x63, 0xc0, 0x1a, 0x91, 0xc7, 0xfe, 0xff, 0x97, 0x00, 0x00, 0x80, 0x52, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x00, 0x84, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x98, 0x6c, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x6b, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xec, 0x6b, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0xf1, + 0x00, 0x1c, 0x00, 0x12, 0x42, 0x10, 0x43, 0xfa, 0x42, 0x00, 0x00, 0x54, + 0x20, 0x68, 0x22, 0x38, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb9, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0xaa, + 0xf3, 0x03, 0x05, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, 0xf6, 0x03, 0x02, 0xaa, + 0xf5, 0x03, 0x01, 0xaa, 0xf7, 0x63, 0x03, 0xa9, 0xf7, 0x03, 0x04, 0xaa, + 0xf9, 0x6b, 0x04, 0xa9, 0xfa, 0x03, 0x07, 0x2a, 0xf9, 0x03, 0x02, 0xaa, + 0xfb, 0x73, 0x05, 0xa9, 0x5f, 0x07, 0x40, 0xf2, 0xfb, 0x03, 0x03, 0xaa, + 0xe6, 0x6f, 0x00, 0xb9, 0xe1, 0x01, 0x00, 0x54, 0xe0, 0x03, 0x06, 0x2a, + 0xf8, 0x03, 0x02, 0xaa, 0x19, 0x00, 0x05, 0xcb, 0xbf, 0x00, 0x00, 0xeb, + 0x39, 0x03, 0x02, 0x8b, 0x82, 0x06, 0x00, 0x54, 0xe2, 0x03, 0x18, 0xaa, + 0xe3, 0x03, 0x1b, 0xaa, 0x18, 0x07, 0x00, 0x91, 0xe1, 0x03, 0x15, 0xaa, + 0x00, 0x04, 0x80, 0x52, 0x80, 0x02, 0x3f, 0xd6, 0x1f, 0x03, 0x19, 0xeb, + 0x21, 0xff, 0xff, 0x54, 0x38, 0x03, 0x13, 0x8b, 0xfc, 0x03, 0x18, 0xaa, + 0x73, 0x05, 0x00, 0xb4, 0x1f, 0x20, 0x03, 0xd5, 0x02, 0x03, 0x13, 0xcb, + 0x73, 0x06, 0x00, 0xd1, 0xe3, 0x03, 0x1b, 0xaa, 0xe1, 0x03, 0x15, 0xaa, + 0xe0, 0x6a, 0x73, 0x38, 0x80, 0x02, 0x3f, 0xd6, 0x53, 0xff, 0xff, 0xb5, + 0x1a, 0x03, 0x08, 0x36, 0xe0, 0x6f, 0x40, 0xb9, 0x93, 0x03, 0x16, 0xcb, + 0xf7, 0x03, 0x00, 0x2a, 0x7f, 0x42, 0x20, 0xeb, 0x62, 0x02, 0x00, 0x54, + 0x1f, 0x20, 0x03, 0xd5, 0x62, 0x02, 0x16, 0x8b, 0xe3, 0x03, 0x1b, 0xaa, + 0xe1, 0x03, 0x15, 0xaa, 0x73, 0x06, 0x00, 0x91, 0x00, 0x04, 0x80, 0x52, + 0x80, 0x02, 0x3f, 0xd6, 0x7f, 0x02, 0x17, 0xeb, 0x23, 0xff, 0xff, 0x54, + 0x81, 0x03, 0x16, 0xcb, 0xe0, 0x06, 0x00, 0xd1, 0xd6, 0x02, 0x1c, 0xcb, + 0x21, 0x04, 0x00, 0x91, 0x3f, 0x00, 0x17, 0xeb, 0x16, 0x00, 0x16, 0x8b, + 0xd6, 0x92, 0x9f, 0x9a, 0x9c, 0x07, 0x00, 0x91, 0x9c, 0x03, 0x16, 0x8b, + 0xe0, 0x03, 0x1c, 0xaa, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf9, 0x03, 0x02, 0xaa, + 0xd4, 0xff, 0xff, 0x17, 0xfc, 0x03, 0x19, 0xaa, 0xdd, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xed, 0x13, 0x40, 0xb9, 0xce, 0x1c, 0x00, 0x12, + 0xef, 0x03, 0x40, 0xb9, 0xe6, 0x0b, 0x40, 0xb9, 0xac, 0x01, 0x1c, 0x12, + 0x0d, 0x04, 0x08, 0x37, 0xab, 0x01, 0x00, 0x12, 0xe9, 0x03, 0x0f, 0x2a, + 0x46, 0x07, 0x00, 0x35, 0xbf, 0x00, 0x09, 0xeb, 0x82, 0x01, 0x00, 0x54, + 0xbf, 0x80, 0x00, 0xf1, 0xc0, 0x10, 0x00, 0x54, 0x88, 0x04, 0x00, 0xd1, + 0x0a, 0x06, 0x80, 0x52, 0x03, 0x00, 0x00, 0x14, 0xbf, 0x80, 0x00, 0xf1, + 0xa0, 0x00, 0x00, 0x54, 0xa5, 0x04, 0x00, 0x91, 0xbf, 0x00, 0x09, 0xeb, + 0x0a, 0x69, 0x25, 0x38, 0x63, 0xff, 0xff, 0x54, 0xeb, 0x01, 0x00, 0x34, + 0xbf, 0x40, 0x26, 0xeb, 0xea, 0x03, 0x06, 0x2a, 0x82, 0x01, 0x00, 0x54, + 0xbf, 0x80, 0x00, 0xf1, 0x20, 0x0f, 0x00, 0x54, 0x88, 0x04, 0x00, 0xd1, + 0x0b, 0x06, 0x80, 0x52, 0x03, 0x00, 0x00, 0x14, 0xbf, 0x80, 0x00, 0xf1, + 0x40, 0x05, 0x00, 0x54, 0xa5, 0x04, 0x00, 0x91, 0xbf, 0x00, 0x0a, 0xeb, + 0x0b, 0x69, 0x25, 0x38, 0x61, 0xff, 0xff, 0x54, 0xec, 0x01, 0x00, 0x34, + 0x8d, 0x05, 0x50, 0x37, 0xe9, 0x03, 0x0f, 0x2a, 0xa5, 0x04, 0x00, 0xb5, + 0xff, 0x40, 0x00, 0x71, 0x20, 0x0c, 0x00, 0x54, 0xff, 0x08, 0x00, 0x71, + 0x21, 0x0c, 0x00, 0x54, 0x47, 0x0c, 0x80, 0x52, 0x25, 0x00, 0x80, 0xd2, + 0x87, 0x00, 0x00, 0x39, 0x87, 0x00, 0x05, 0x8b, 0xa5, 0x04, 0x00, 0x91, + 0x08, 0x06, 0x80, 0x52, 0xe8, 0x00, 0x00, 0x39, 0xbf, 0x80, 0x00, 0xf1, + 0xa0, 0x00, 0x00, 0x54, 0xce, 0x00, 0x00, 0x34, 0xa7, 0x05, 0x80, 0x52, + 0x87, 0x68, 0x25, 0x38, 0xa5, 0x04, 0x00, 0x91, 0xe7, 0x03, 0x0d, 0x2a, + 0x75, 0xff, 0xff, 0x17, 0xad, 0x04, 0x10, 0x37, 0xad, 0xff, 0x1f, 0x36, + 0x07, 0x04, 0x80, 0x52, 0x87, 0x68, 0x25, 0x38, 0xa5, 0x04, 0x00, 0x91, + 0xf9, 0xff, 0xff, 0x17, 0x8b, 0x04, 0x00, 0x34, 0x6e, 0x05, 0x00, 0x35, + 0xbf, 0x05, 0x1e, 0x72, 0x21, 0x05, 0x00, 0x54, 0xbf, 0x00, 0x09, 0xeb, + 0x02, 0xfa, 0xff, 0x54, 0xbf, 0x80, 0x00, 0xf1, 0x81, 0xf8, 0xff, 0x54, + 0x05, 0x04, 0x80, 0xd2, 0xec, 0xfd, 0xff, 0x34, 0x8d, 0x06, 0x50, 0x37, + 0x3f, 0x01, 0x05, 0xeb, 0x40, 0x04, 0x00, 0x54, 0xbf, 0x40, 0x26, 0xeb, + 0x00, 0x04, 0x00, 0x54, 0x1f, 0x20, 0x03, 0xd5, 0xbf, 0x7c, 0x00, 0xf1, + 0xe8, 0x87, 0x9f, 0x1a, 0xff, 0x40, 0x00, 0x71, 0x20, 0x04, 0x00, 0x54, + 0x1f, 0x01, 0x00, 0x71, 0xe0, 0x18, 0x42, 0x7a, 0xa1, 0x00, 0x00, 0x54, + 0x87, 0x00, 0x05, 0x8b, 0xa5, 0x04, 0x00, 0x91, 0x48, 0x0c, 0x80, 0x52, + 0xe8, 0x00, 0x00, 0x39, 0xbf, 0x80, 0x00, 0xf1, 0x41, 0xfa, 0xff, 0x54, + 0xe7, 0x03, 0x0d, 0x2a, 0x50, 0xff, 0xff, 0x17, 0x67, 0x05, 0x80, 0x52, + 0x87, 0x68, 0x25, 0x38, 0xa5, 0x04, 0x00, 0x91, 0xe7, 0x03, 0x0d, 0x2a, + 0x4b, 0xff, 0xff, 0x17, 0xbf, 0x00, 0x09, 0xeb, 0xc2, 0xf7, 0xff, 0x54, + 0xbf, 0x80, 0x00, 0xf1, 0x81, 0xf4, 0xff, 0x54, 0xac, 0x05, 0x00, 0x34, + 0x8d, 0x05, 0x50, 0x37, 0x05, 0x04, 0x80, 0xd2, 0xe0, 0xff, 0xff, 0x17, + 0xc6, 0x04, 0x00, 0x51, 0xd7, 0xff, 0xff, 0x17, 0xa9, 0x04, 0x00, 0xf1, + 0xe8, 0x07, 0x9f, 0x1a, 0xff, 0x40, 0x00, 0x71, 0x08, 0x01, 0x9f, 0x1a, + 0x28, 0x02, 0x00, 0x34, 0xa5, 0x08, 0x00, 0xd1, 0xa7, 0x01, 0x1b, 0x72, + 0x04, 0x09, 0x40, 0x7a, 0xe1, 0x01, 0x00, 0x54, 0xff, 0x00, 0x00, 0x71, + 0x04, 0x19, 0x40, 0x7a, 0x40, 0xfc, 0xff, 0x54, 0x07, 0x0b, 0x80, 0x52, + 0x87, 0x68, 0x25, 0x38, 0xa5, 0x04, 0x00, 0x91, 0xde, 0xff, 0xff, 0x17, + 0xff, 0x40, 0x00, 0x71, 0x21, 0xf7, 0xff, 0x54, 0xa7, 0x01, 0x1b, 0x12, + 0x08, 0x00, 0x80, 0x52, 0xf5, 0xff, 0xff, 0x17, 0xe5, 0x03, 0x09, 0xaa, + 0xcc, 0xff, 0xff, 0x17, 0x07, 0x0f, 0x80, 0x52, 0x87, 0x68, 0x25, 0x38, + 0xa5, 0x04, 0x00, 0x91, 0xd3, 0xff, 0xff, 0x17, 0x28, 0x00, 0x80, 0x52, + 0xea, 0xff, 0xff, 0x17, 0x07, 0x06, 0x80, 0x52, 0x87, 0x00, 0x00, 0x39, + 0x25, 0x00, 0x80, 0xd2, 0x8e, 0xf5, 0xff, 0x34, 0xa6, 0xff, 0xff, 0x17, + 0x0b, 0xf7, 0xff, 0x35, 0xd7, 0xff, 0xff, 0x17, 0xcc, 0xf4, 0xff, 0x34, + 0x0d, 0xf7, 0x57, 0x36, 0xa4, 0xff, 0xff, 0x17, 0x05, 0x04, 0x80, 0xd2, + 0xa2, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x43, 0x01, 0xd1, 0xeb, 0x03, 0x06, 0xaa, + 0xe9, 0x03, 0x04, 0xaa, 0xa6, 0x1c, 0x00, 0x12, 0xfd, 0x7b, 0x02, 0xa9, + 0xfd, 0x83, 0x00, 0x91, 0xf0, 0x53, 0x40, 0xb9, 0xef, 0x5b, 0x40, 0xb9, + 0xe4, 0x01, 0x00, 0xb5, 0xe4, 0x79, 0x1b, 0x12, 0x8f, 0x01, 0x50, 0x36, + 0xef, 0x03, 0x04, 0x2a, 0xe7, 0x03, 0x00, 0xb9, 0xf0, 0x0b, 0x00, 0xb9, + 0xe4, 0xc3, 0x00, 0x91, 0xef, 0x13, 0x00, 0xb9, 0xe7, 0x03, 0x0b, 0x2a, + 0x05, 0x00, 0x80, 0xd2, 0x52, 0xff, 0xff, 0x97, 0xfd, 0x7b, 0x42, 0xa9, + 0xff, 0x43, 0x01, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0xef, 0x03, 0x04, 0x2a, + 0xff, 0x01, 0x7b, 0xf2, 0x24, 0x0c, 0x80, 0x52, 0x2e, 0x08, 0x80, 0x52, + 0xce, 0x11, 0x84, 0x1a, 0xce, 0x29, 0x00, 0x51, 0xe4, 0xc3, 0x00, 0x91, + 0x05, 0x00, 0x80, 0xd2, 0x2c, 0x09, 0xcb, 0x9a, 0xa5, 0x04, 0x00, 0x91, + 0x8d, 0x00, 0x05, 0x8b, 0x8a, 0xa5, 0x0b, 0x9b, 0x48, 0x1d, 0x00, 0x12, + 0x5f, 0x25, 0x00, 0xf1, 0x0a, 0xc1, 0x00, 0x11, 0x08, 0x01, 0x0e, 0x0b, + 0x4a, 0x1d, 0x00, 0x12, 0x08, 0x1d, 0x00, 0x12, 0x08, 0x81, 0x8a, 0x1a, + 0xa8, 0xf1, 0x1f, 0x38, 0x3f, 0x01, 0x0b, 0xeb, 0xe9, 0x03, 0x0c, 0xaa, + 0xa2, 0x28, 0x5f, 0xfa, 0x29, 0xfe, 0xff, 0x54, 0xe7, 0x03, 0x00, 0xb9, + 0xe7, 0x03, 0x0b, 0x2a, 0xf0, 0x0b, 0x00, 0xb9, 0xef, 0x13, 0x00, 0xb9, + 0x32, 0xff, 0xff, 0x97, 0xfd, 0x7b, 0x42, 0xa9, 0xff, 0x43, 0x01, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x43, 0x01, 0xd1, 0xeb, 0x03, 0x06, 0xaa, 0xe9, 0x03, 0x04, 0xaa, + 0xa6, 0x1c, 0x00, 0x12, 0xfd, 0x7b, 0x02, 0xa9, 0xfd, 0x83, 0x00, 0x91, + 0xf0, 0x53, 0x40, 0xb9, 0xef, 0x5b, 0x40, 0xb9, 0xe4, 0x01, 0x00, 0xb5, + 0xe4, 0x79, 0x1b, 0x12, 0x8f, 0x01, 0x50, 0x36, 0xef, 0x03, 0x04, 0x2a, + 0xe7, 0x03, 0x00, 0xb9, 0xf0, 0x0b, 0x00, 0xb9, 0xe4, 0xc3, 0x00, 0x91, + 0xef, 0x13, 0x00, 0xb9, 0xe7, 0x03, 0x0b, 0x2a, 0x05, 0x00, 0x80, 0xd2, + 0x1a, 0xff, 0xff, 0x97, 0xfd, 0x7b, 0x42, 0xa9, 0xff, 0x43, 0x01, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0xef, 0x03, 0x04, 0x2a, 0xff, 0x01, 0x7b, 0xf2, + 0x24, 0x0c, 0x80, 0x52, 0x2e, 0x08, 0x80, 0x52, 0xce, 0x11, 0x84, 0x1a, + 0xce, 0x29, 0x00, 0x51, 0xe4, 0xc3, 0x00, 0x91, 0x05, 0x00, 0x80, 0xd2, + 0x2c, 0x09, 0xcb, 0x9a, 0xa5, 0x04, 0x00, 0x91, 0x8d, 0x00, 0x05, 0x8b, + 0x8a, 0xa5, 0x0b, 0x9b, 0x48, 0x1d, 0x00, 0x12, 0x5f, 0x25, 0x00, 0xf1, + 0x0a, 0xc1, 0x00, 0x11, 0x08, 0x01, 0x0e, 0x0b, 0x4a, 0x1d, 0x00, 0x12, + 0x08, 0x1d, 0x00, 0x12, 0x08, 0x81, 0x8a, 0x1a, 0xa8, 0xf1, 0x1f, 0x38, + 0x3f, 0x01, 0x0b, 0xeb, 0xe9, 0x03, 0x0c, 0xaa, 0xa2, 0x28, 0x5f, 0xfa, + 0x29, 0xfe, 0xff, 0x54, 0xe7, 0x03, 0x00, 0xb9, 0xe7, 0x03, 0x0b, 0x2a, + 0xf0, 0x0b, 0x00, 0xb9, 0xef, 0x13, 0x00, 0xb9, 0xfa, 0xfe, 0xff, 0x97, + 0xfd, 0x7b, 0x42, 0xa9, 0xff, 0x43, 0x01, 0x91, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0xf0, 0x92, + 0xe2, 0x00, 0x67, 0x9e, 0xff, 0x03, 0x02, 0xd1, 0x07, 0x02, 0xe0, 0x92, + 0x10, 0x20, 0x62, 0x1e, 0xe1, 0x00, 0x67, 0x9e, 0x47, 0x04, 0x00, 0xd1, + 0xfd, 0x7b, 0x01, 0xa9, 0xfd, 0x43, 0x00, 0x91, 0xe8, 0xd7, 0x9f, 0x1a, + 0x10, 0x20, 0x61, 0x1e, 0xf7, 0x63, 0x04, 0xa9, 0xe7, 0x3f, 0x00, 0xf9, + 0xe7, 0x57, 0x9f, 0x1a, 0x17, 0x01, 0x07, 0x2a, 0x57, 0x0d, 0x00, 0x35, + 0x07, 0x40, 0x60, 0x1e, 0x00, 0xc0, 0x60, 0x1e, 0xf5, 0x5b, 0x03, 0xa9, + 0xf6, 0x03, 0x00, 0xaa, 0x80, 0x01, 0x00, 0xd0, 0x17, 0x04, 0x44, 0xfd, + 0x80, 0x01, 0x00, 0xd0, 0x06, 0x08, 0x44, 0xfd, 0x80, 0x01, 0x00, 0xd0, + 0x01, 0x0c, 0x44, 0xfd, 0x80, 0x01, 0x00, 0xd0, 0x16, 0x10, 0x44, 0xfd, + 0x80, 0x01, 0x00, 0xd0, 0x15, 0x14, 0x44, 0xfd, 0x80, 0x01, 0x00, 0xd0, + 0x11, 0x18, 0x44, 0xfd, 0x04, 0x10, 0x6f, 0x1e, 0xf3, 0x53, 0x02, 0xa9, + 0xf4, 0x03, 0x02, 0xaa, 0x02, 0x00, 0x66, 0x9e, 0x02, 0x10, 0x6c, 0x1e, + 0x03, 0x10, 0x60, 0x1e, 0xf9, 0x6b, 0x05, 0xa9, 0xfa, 0x03, 0x01, 0xaa, + 0x81, 0x01, 0x00, 0xd0, 0x34, 0x1c, 0x44, 0xfd, 0x40, 0xcc, 0x40, 0x92, + 0x00, 0x24, 0x4c, 0xb2, 0x10, 0x00, 0x67, 0x9e, 0x42, 0xf8, 0x74, 0xd3, + 0x05, 0x90, 0x64, 0x1e, 0x10, 0x3a, 0x64, 0x1e, 0x42, 0xfc, 0x0f, 0x51, + 0x13, 0x10, 0x63, 0x1e, 0x12, 0x10, 0x6e, 0x1e, 0x44, 0x00, 0x62, 0x1e, + 0xc1, 0x00, 0x16, 0x72, 0xc0, 0x00, 0x80, 0x52, 0x89, 0x10, 0x80, 0x1a, + 0x06, 0x1a, 0x57, 0x1f, 0xfb, 0x73, 0x06, 0xa9, 0xf9, 0x03, 0x06, 0x2a, + 0xfb, 0x03, 0x03, 0xaa, 0xfc, 0x03, 0x05, 0x2a, 0x84, 0x18, 0x41, 0x1f, + 0x93, 0x00, 0x78, 0x1e, 0x61, 0x02, 0x62, 0x1e, 0x22, 0x08, 0x56, 0x1f, + 0x26, 0x8c, 0x51, 0x1f, 0x47, 0x00, 0x78, 0x1e, 0xe4, 0x00, 0x62, 0x1e, + 0xe7, 0xfc, 0x0f, 0x11, 0xe2, 0x00, 0x67, 0x9e, 0x42, 0x54, 0x74, 0x5f, + 0x83, 0x08, 0x75, 0x1e, 0x21, 0x8c, 0x71, 0x1f, 0x63, 0x28, 0x66, 0x1e, + 0x26, 0x08, 0x61, 0x1e, 0x21, 0x28, 0x61, 0x1e, 0xc4, 0x14, 0x54, 0x1f, + 0xc4, 0x18, 0x64, 0x1e, 0x84, 0x28, 0x73, 0x1e, 0xc4, 0x18, 0x64, 0x1e, + 0x63, 0x28, 0x64, 0x1e, 0x21, 0x18, 0x63, 0x1e, 0x21, 0x28, 0x72, 0x1e, + 0x21, 0x08, 0x62, 0x1e, 0x30, 0x20, 0x60, 0x1e, 0xad, 0x00, 0x00, 0x54, + 0x80, 0x01, 0x00, 0xd0, 0x02, 0x20, 0x44, 0xfd, 0x73, 0x06, 0x00, 0x51, + 0x21, 0x08, 0x62, 0x1e, 0x60, 0x8e, 0x01, 0x11, 0x1f, 0x18, 0x03, 0x71, + 0xf8, 0x97, 0x9f, 0x1a, 0x18, 0x13, 0x00, 0x11, 0xb9, 0x04, 0x58, 0x36, + 0x80, 0x01, 0x00, 0xd0, 0x03, 0x24, 0x44, 0xfd, 0x00, 0x90, 0xd0, 0xd2, + 0xc0, 0x25, 0xe8, 0xf2, 0x02, 0x00, 0x67, 0x9e, 0x10, 0x20, 0x63, 0x1e, + 0x10, 0xa4, 0x62, 0x1e, 0x05, 0x03, 0x00, 0x54, 0x20, 0x01, 0x13, 0x6b, + 0x09, 0x04, 0x00, 0x51, 0x20, 0x03, 0x16, 0x32, 0x29, 0xc1, 0x9f, 0x1a, + 0x1c, 0x0e, 0x00, 0x35, 0xf8, 0x20, 0x60, 0x1e, 0xc4, 0x0c, 0x00, 0x54, + 0x26, 0x7b, 0x14, 0x12, 0xe3, 0x03, 0x1b, 0xaa, 0xe2, 0x03, 0x14, 0xaa, + 0xe1, 0x03, 0x1a, 0xaa, 0xe0, 0x03, 0x16, 0xaa, 0xc6, 0x00, 0x16, 0x32, + 0xf3, 0x53, 0x42, 0xa9, 0xe4, 0x03, 0x09, 0x2a, 0xf5, 0x5b, 0x43, 0xa9, + 0x05, 0x00, 0x80, 0x52, 0xf9, 0x6b, 0x45, 0xa9, 0xfb, 0x73, 0x46, 0xa9, + 0xfd, 0x7b, 0x41, 0xa9, 0xf7, 0x63, 0x44, 0xa9, 0xff, 0x03, 0x02, 0x91, + 0x64, 0x00, 0x00, 0x14, 0xa9, 0x00, 0x00, 0x34, 0x3f, 0x00, 0x00, 0x71, + 0xe0, 0x07, 0x9f, 0x1a, 0x29, 0x01, 0x00, 0x4b, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x03, 0x1c, 0x6b, 0x85, 0x03, 0x18, 0x4b, 0xa5, 0x30, 0x9f, 0x1a, + 0x20, 0x03, 0x1f, 0x72, 0xf7, 0x07, 0x9f, 0x1a, 0x1f, 0x00, 0x00, 0x71, + 0xa5, 0x00, 0x9f, 0x1a, 0x27, 0x00, 0x80, 0x52, 0x53, 0x00, 0x00, 0x34, + 0x00, 0x18, 0x61, 0x1e, 0xf8, 0x20, 0x60, 0x1e, 0x64, 0x09, 0x00, 0x54, + 0xe4, 0x03, 0x09, 0x2a, 0x26, 0x7b, 0x14, 0x12, 0xe3, 0x03, 0x1b, 0xaa, + 0xe2, 0x03, 0x14, 0xaa, 0xe1, 0x03, 0x1a, 0xaa, 0xe0, 0x03, 0x16, 0xaa, + 0xe7, 0x77, 0x00, 0xb9, 0x4b, 0x00, 0x00, 0x94, 0xe7, 0x77, 0x40, 0xb9, + 0xf5, 0x03, 0x00, 0xaa, 0x27, 0x06, 0x00, 0x34, 0x3f, 0x03, 0x7b, 0xf2, + 0xa1, 0x08, 0x80, 0x52, 0xe2, 0x03, 0x15, 0xaa, 0xe3, 0x03, 0x1b, 0xaa, + 0xa0, 0x0c, 0x80, 0x52, 0x20, 0x10, 0x80, 0x1a, 0xe1, 0x03, 0x1a, 0xaa, + 0xc0, 0x02, 0x3f, 0xd6, 0x7f, 0x02, 0x00, 0x71, 0xe0, 0x03, 0x13, 0x4b, + 0xa1, 0x00, 0x80, 0x52, 0x18, 0x07, 0x00, 0x51, 0xf8, 0x03, 0x00, 0xb9, + 0x00, 0x7c, 0x40, 0x93, 0xe1, 0x0b, 0x00, 0xb9, 0x64, 0x7e, 0x40, 0x93, + 0xa2, 0x06, 0x00, 0x91, 0x84, 0xa0, 0x80, 0x9a, 0x65, 0x7e, 0x1f, 0x53, + 0xe3, 0x03, 0x1b, 0xaa, 0xe0, 0x03, 0x16, 0xaa, 0xe1, 0x03, 0x1a, 0xaa, + 0x07, 0x00, 0x80, 0x52, 0x46, 0x01, 0x80, 0xd2, 0xdf, 0xfe, 0xff, 0x97, + 0xf5, 0x03, 0x00, 0xaa, 0xd7, 0x02, 0x00, 0x34, 0x13, 0x00, 0x14, 0xcb, + 0xf8, 0x03, 0x1c, 0x2a, 0x7f, 0x42, 0x3c, 0xeb, 0x42, 0x02, 0x00, 0x54, + 0x62, 0x02, 0x14, 0x8b, 0xe3, 0x03, 0x1b, 0xaa, 0xe1, 0x03, 0x1a, 0xaa, + 0x73, 0x06, 0x00, 0x91, 0x00, 0x04, 0x80, 0x52, 0xc0, 0x02, 0x3f, 0xd6, + 0x7f, 0x02, 0x18, 0xeb, 0x23, 0xff, 0xff, 0x54, 0xe1, 0x3f, 0x40, 0xf9, + 0xb4, 0x02, 0x14, 0xcb, 0x00, 0x03, 0x15, 0xcb, 0x94, 0x06, 0x00, 0x91, + 0x9f, 0x02, 0x18, 0xeb, 0x17, 0x00, 0x01, 0x8b, 0xb5, 0x06, 0x00, 0x91, + 0xf7, 0x92, 0x9f, 0x9a, 0xf5, 0x02, 0x15, 0x8b, 0xe0, 0x03, 0x15, 0xaa, + 0xfd, 0x7b, 0x41, 0xa9, 0xf3, 0x53, 0x42, 0xa9, 0xf5, 0x5b, 0x43, 0xa9, + 0xf7, 0x63, 0x44, 0xa9, 0xf9, 0x6b, 0x45, 0xa9, 0xfb, 0x73, 0x46, 0xa9, + 0xff, 0x03, 0x02, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0xf9, 0x03, 0x00, 0x2a, + 0x07, 0x00, 0x80, 0x52, 0x18, 0x00, 0x80, 0x52, 0x05, 0x00, 0x80, 0x52, + 0x13, 0x00, 0x80, 0x52, 0x1f, 0x20, 0x03, 0xd5, 0x00, 0x40, 0x61, 0x1e, + 0xb5, 0xff, 0xff, 0x17, 0xf9, 0x03, 0x00, 0x2a, 0xe5, 0x03, 0x1c, 0x2a, + 0x07, 0x00, 0x80, 0x52, 0x13, 0x00, 0x80, 0x52, 0x18, 0x00, 0x80, 0x52, + 0xad, 0xff, 0xff, 0x17, 0x07, 0x02, 0xe0, 0x92, 0xe2, 0x00, 0x67, 0x9e, + 0xfd, 0x7b, 0xbd, 0xa9, 0xee, 0x03, 0x05, 0x2a, 0x10, 0x20, 0x62, 0x1e, + 0xfd, 0x03, 0x00, 0x91, 0xe7, 0x03, 0x06, 0x2a, 0x24, 0x13, 0x00, 0x54, + 0x09, 0x02, 0xf0, 0x92, 0x22, 0x01, 0x67, 0x9e, 0x01, 0x40, 0x60, 0x1e, + 0xef, 0x03, 0x00, 0xaa, 0x10, 0x20, 0x62, 0x1e, 0xf0, 0x03, 0x01, 0xaa, + 0xf1, 0x03, 0x02, 0xaa, 0xf2, 0x03, 0x03, 0xaa, 0x2c, 0x04, 0x00, 0x54, + 0xa9, 0xac, 0xd9, 0xd2, 0xa9, 0x39, 0xe8, 0xf2, 0x23, 0x01, 0x67, 0x9e, + 0xa9, 0xac, 0xd9, 0xd2, 0x10, 0x20, 0x63, 0x1e, 0xa9, 0x39, 0xf8, 0xf2, + 0x22, 0x01, 0x67, 0x9e, 0xfe, 0xd7, 0x9f, 0x1a, 0x10, 0x20, 0x62, 0x1e, + 0xe9, 0x57, 0x9f, 0x1a, 0xde, 0x03, 0x09, 0x2a, 0x5e, 0x12, 0x00, 0x35, + 0x18, 0x20, 0x60, 0x1e, 0xe8, 0x03, 0x04, 0x2a, 0x04, 0x11, 0x00, 0x54, + 0xa7, 0x03, 0x50, 0x36, 0x1f, 0x25, 0x00, 0x71, 0xe4, 0x43, 0x00, 0x91, + 0x05, 0x00, 0x80, 0xd2, 0x01, 0x06, 0x80, 0x52, 0x89, 0x16, 0x00, 0x54, + 0xa5, 0x04, 0x00, 0x91, 0x08, 0x05, 0x00, 0x51, 0x80, 0x00, 0x05, 0x8b, + 0xbf, 0x7c, 0x00, 0xf1, 0x00, 0x99, 0x49, 0x7a, 0x01, 0xf0, 0x1f, 0x38, + 0x48, 0xff, 0xff, 0x54, 0xa0, 0xac, 0xd9, 0xd2, 0xa0, 0x39, 0xe8, 0xf2, + 0x02, 0x00, 0x67, 0x9e, 0x13, 0x00, 0x00, 0x14, 0x27, 0x0f, 0x10, 0x37, + 0x84, 0x01, 0x00, 0xd0, 0x84, 0xc0, 0x1c, 0x91, 0x65, 0x00, 0x80, 0xd2, + 0xe6, 0x03, 0x0e, 0x2a, 0xe3, 0x03, 0x12, 0xaa, 0xe2, 0x03, 0x11, 0xaa, + 0xe1, 0x03, 0x10, 0xaa, 0xe0, 0x03, 0x0f, 0xaa, 0x8a, 0xfd, 0xff, 0x97, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x90, 0xd0, 0xd2, + 0xe4, 0x43, 0x00, 0x91, 0xc0, 0x25, 0xe8, 0xf2, 0x05, 0x00, 0x80, 0xd2, + 0x02, 0x00, 0x67, 0x9e, 0xc8, 0x00, 0x80, 0x52, 0x29, 0x00, 0x78, 0x1e, + 0x03, 0x10, 0x6c, 0x1e, 0x20, 0x01, 0x62, 0x1e, 0x20, 0x38, 0x60, 0x1e, + 0x00, 0x08, 0x62, 0x1e, 0x0d, 0x00, 0x79, 0x9e, 0xa4, 0x01, 0x63, 0x9e, + 0x00, 0x38, 0x64, 0x1e, 0x10, 0x20, 0x63, 0x1e, 0xed, 0x09, 0x00, 0x54, + 0xad, 0x05, 0x00, 0x91, 0xa0, 0x01, 0x63, 0x9e, 0x10, 0x20, 0x62, 0x1e, + 0x2a, 0x0c, 0x00, 0x54, 0x28, 0x04, 0x00, 0x35, 0x22, 0x01, 0x62, 0x1e, + 0x00, 0x10, 0x6c, 0x1e, 0x20, 0x01, 0x00, 0x12, 0x20, 0x01, 0x00, 0x0b, + 0x21, 0x38, 0x62, 0x1e, 0x30, 0x20, 0x60, 0x1e, 0x09, 0xa0, 0x89, 0x1a, + 0xe1, 0xcc, 0x8c, 0x52, 0xc1, 0xcc, 0xac, 0x72, 0x42, 0x01, 0x80, 0x52, + 0x28, 0x7d, 0x21, 0x9b, 0xbf, 0x80, 0x00, 0xf1, 0xc0, 0x0a, 0x00, 0x54, + 0x08, 0xfd, 0x62, 0x93, 0xa5, 0x04, 0x00, 0x91, 0x08, 0x7d, 0x89, 0x4b, + 0x80, 0x00, 0x05, 0x8b, 0x0a, 0xa5, 0x02, 0x1b, 0xe9, 0x03, 0x08, 0x2a, + 0x48, 0xc1, 0x00, 0x11, 0x08, 0xf0, 0x1f, 0x38, 0xa9, 0xfe, 0xff, 0x35, + 0xe0, 0x04, 0x00, 0x12, 0x1f, 0x04, 0x00, 0x71, 0xe0, 0x03, 0x00, 0x54, + 0xbf, 0x7c, 0x00, 0xf1, 0x28, 0xf9, 0xff, 0x54, 0xbe, 0x09, 0x00, 0x34, + 0xa0, 0x05, 0x80, 0x52, 0x80, 0x68, 0x25, 0x38, 0xa5, 0x04, 0x00, 0x91, + 0xc4, 0xff, 0xff, 0x17, 0x01, 0x81, 0x00, 0x51, 0xe2, 0xe7, 0x02, 0xb2, + 0x21, 0x00, 0x05, 0x0b, 0xa2, 0x99, 0x99, 0xf2, 0x0d, 0x00, 0x00, 0x14, + 0x6b, 0xfd, 0x43, 0xd3, 0xbf, 0x25, 0x00, 0xf1, 0x00, 0x05, 0x00, 0x51, + 0xaa, 0x04, 0x00, 0x91, 0x6c, 0x09, 0x0b, 0x8b, 0xac, 0x05, 0x0c, 0xcb, + 0xed, 0x03, 0x0b, 0xaa, 0x8b, 0xc1, 0x00, 0x11, 0x8b, 0x68, 0x25, 0x38, + 0xe9, 0x07, 0x00, 0x54, 0xe8, 0x03, 0x00, 0x2a, 0xe5, 0x03, 0x0a, 0xaa, + 0xab, 0x7d, 0xc2, 0x9b, 0x1f, 0x01, 0x01, 0x6b, 0x41, 0xfe, 0xff, 0x54, + 0xe0, 0x04, 0x00, 0x12, 0x1f, 0x04, 0x00, 0x71, 0xa1, 0xf5, 0xff, 0x54, + 0x4e, 0xfc, 0xff, 0x34, 0x9e, 0x09, 0x00, 0x34, 0xce, 0x05, 0x00, 0x51, + 0xbf, 0x40, 0x2e, 0xeb, 0xe2, 0x03, 0x0e, 0x2a, 0xa2, 0xfb, 0xff, 0x54, + 0xbf, 0x7c, 0x00, 0xf1, 0x01, 0x06, 0x80, 0x52, 0x89, 0x00, 0x00, 0x54, + 0xa3, 0xff, 0xff, 0x17, 0xbf, 0x80, 0x00, 0xf1, 0x20, 0xf4, 0xff, 0x54, + 0xa5, 0x04, 0x00, 0x91, 0x80, 0x00, 0x05, 0x8b, 0xbf, 0x00, 0x02, 0xeb, + 0x01, 0xf0, 0x1f, 0x38, 0x41, 0xff, 0xff, 0x54, 0xd1, 0xff, 0xff, 0x17, + 0xc4, 0xf6, 0xff, 0x54, 0x4d, 0x00, 0x00, 0xb4, 0x8d, 0xf6, 0x07, 0x36, + 0xad, 0x05, 0x00, 0x91, 0xb2, 0xff, 0xff, 0x17, 0xe6, 0x03, 0x05, 0x2a, + 0x84, 0x01, 0x00, 0xd0, 0x85, 0x00, 0x80, 0xd2, 0x84, 0xe0, 0x1c, 0x91, + 0x20, 0xfd, 0xff, 0x97, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x01, 0x40, 0x61, 0x1e, 0x3e, 0x00, 0x80, 0x52, 0x77, 0xff, 0xff, 0x17, + 0x84, 0x01, 0x00, 0xd0, 0x84, 0xa0, 0x1c, 0x91, 0x85, 0x00, 0x80, 0xd2, + 0x88, 0xff, 0xff, 0x17, 0x72, 0xfe, 0xff, 0x97, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x29, 0x05, 0x00, 0x11, 0x0d, 0x00, 0x80, 0xd2, + 0x9e, 0xff, 0xff, 0x17, 0xe0, 0x04, 0x00, 0x12, 0x1f, 0x04, 0x00, 0x71, + 0xe1, 0xef, 0xff, 0x54, 0xce, 0xef, 0xff, 0x34, 0x7e, 0xfa, 0xff, 0x35, + 0x1d, 0x00, 0x00, 0x14, 0xe7, 0x02, 0x10, 0x36, 0x60, 0x05, 0x80, 0x52, + 0x80, 0x68, 0x25, 0x38, 0xa5, 0x04, 0x00, 0x91, 0x77, 0xff, 0xff, 0x17, + 0x5f, 0x81, 0x00, 0xf1, 0xa0, 0x04, 0x00, 0x54, 0xa1, 0x08, 0x00, 0x91, + 0x08, 0x09, 0x00, 0x51, 0x21, 0x00, 0x08, 0x8b, 0x02, 0x06, 0x80, 0x52, + 0x00, 0x03, 0x00, 0x34, 0x4a, 0x05, 0x00, 0x91, 0x80, 0x00, 0x0a, 0x8b, + 0x5f, 0x81, 0x00, 0xf1, 0x02, 0xf0, 0x1f, 0x38, 0xa0, 0x02, 0x00, 0x54, + 0x5f, 0x01, 0x01, 0xeb, 0x41, 0xff, 0xff, 0x54, 0xc0, 0x05, 0x80, 0x52, + 0x25, 0x04, 0x00, 0x91, 0x80, 0x68, 0x21, 0x38, 0x89, 0xff, 0xff, 0x17, + 0x87, 0xec, 0x1f, 0x36, 0x00, 0x04, 0x80, 0x52, 0x80, 0x68, 0x25, 0x38, + 0xa5, 0x04, 0x00, 0x91, 0x60, 0xff, 0xff, 0x17, 0xff, 0x04, 0x1e, 0x72, + 0xa0, 0xf6, 0xff, 0x54, 0xb3, 0xff, 0xff, 0x17, 0x80, 0x01, 0x00, 0xd0, + 0x00, 0x40, 0x21, 0x91, 0x02, 0x58, 0x68, 0xfc, 0x67, 0xff, 0xff, 0x17, + 0xe1, 0x03, 0x0a, 0xaa, 0xef, 0xff, 0xff, 0x17, 0xe0, 0x04, 0x00, 0x12, + 0xe5, 0x03, 0x0a, 0xaa, 0x1f, 0x04, 0x00, 0x71, 0x61, 0xea, 0xff, 0x54, + 0xae, 0xfa, 0xff, 0x35, 0x51, 0xff, 0xff, 0x17, 0xe5, 0x03, 0x0a, 0xaa, + 0xa0, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc3, 0x02, 0xd1, + 0x3f, 0x00, 0x00, 0xf1, 0xfd, 0x7b, 0x01, 0xa9, 0xfd, 0x43, 0x00, 0x91, + 0xf3, 0x53, 0x02, 0xa9, 0xf3, 0xff, 0xff, 0xf0, 0x73, 0x42, 0x3b, 0x91, + 0x73, 0x02, 0x80, 0x9a, 0xf5, 0x5b, 0x03, 0xa9, 0x96, 0x18, 0x40, 0xb9, + 0xf9, 0x6b, 0x05, 0xa9, 0xfa, 0x03, 0x01, 0xaa, 0xfb, 0x73, 0x06, 0xa9, + 0xfc, 0x03, 0x02, 0xaa, 0x1b, 0x00, 0x80, 0xd2, 0x94, 0x00, 0x40, 0xa9, + 0xe0, 0x43, 0x00, 0xf9, 0x65, 0x00, 0x40, 0x39, 0x80, 0x08, 0x40, 0xf9, + 0xe0, 0x4b, 0x00, 0xf9, 0x80, 0x1c, 0x40, 0xb9, 0xe0, 0xab, 0x00, 0xb9, + 0xe5, 0x3a, 0x00, 0x34, 0x80, 0x01, 0x00, 0xd0, 0x00, 0x00, 0x1d, 0x91, + 0xf9, 0x03, 0x03, 0xaa, 0xf7, 0x63, 0x04, 0xa9, 0xe0, 0x4f, 0x00, 0xf9, + 0x97, 0x01, 0x00, 0xd0, 0xe0, 0x22, 0x1d, 0x91, 0xe0, 0x3f, 0x00, 0xf9, + 0x0a, 0x00, 0x00, 0x14, 0x64, 0x07, 0x00, 0x91, 0xe0, 0x03, 0x05, 0x2a, + 0xe2, 0x03, 0x1b, 0xaa, 0xe3, 0x03, 0x1c, 0xaa, 0xe1, 0x03, 0x1a, 0xaa, + 0xfb, 0x03, 0x04, 0xaa, 0x60, 0x02, 0x3f, 0xd6, 0x25, 0x03, 0x40, 0x39, + 0x85, 0x0d, 0x00, 0x34, 0x39, 0x07, 0x00, 0x91, 0xbf, 0x94, 0x00, 0x71, + 0xa1, 0xfe, 0xff, 0x54, 0xe8, 0x03, 0x19, 0xaa, 0x06, 0x00, 0x80, 0x52, + 0x00, 0x15, 0x40, 0x38, 0x1f, 0xac, 0x00, 0x71, 0xe4, 0x03, 0x08, 0xaa, + 0xa0, 0x01, 0x00, 0x54, 0xe8, 0x01, 0x00, 0x54, 0x1f, 0x80, 0x00, 0x71, + 0x80, 0x02, 0x00, 0x54, 0x1f, 0x8c, 0x00, 0x71, 0x01, 0x03, 0x00, 0x54, + 0xc6, 0x00, 0x1c, 0x32, 0xf9, 0x03, 0x04, 0xaa, 0xe8, 0x03, 0x19, 0xaa, + 0x00, 0x15, 0x40, 0x38, 0x1f, 0xac, 0x00, 0x71, 0xe4, 0x03, 0x08, 0xaa, + 0xa1, 0xfe, 0xff, 0x54, 0xc6, 0x00, 0x1e, 0x32, 0xf9, 0x03, 0x04, 0xaa, + 0xf9, 0xff, 0xff, 0x17, 0x1f, 0xb4, 0x00, 0x71, 0x20, 0x01, 0x00, 0x54, + 0x1f, 0xc0, 0x00, 0x71, 0x61, 0x61, 0x00, 0x54, 0xc6, 0x00, 0x00, 0x32, + 0xf9, 0x03, 0x04, 0xaa, 0xf2, 0xff, 0xff, 0x17, 0xc6, 0x00, 0x1d, 0x32, + 0xf9, 0x03, 0x04, 0xaa, 0xef, 0xff, 0xff, 0x17, 0xc6, 0x00, 0x1f, 0x32, + 0xf9, 0x03, 0x04, 0xaa, 0xec, 0xff, 0xff, 0x17, 0x1f, 0xa8, 0x00, 0x71, + 0x18, 0x00, 0x80, 0x52, 0xc0, 0x02, 0x00, 0x54, 0x17, 0x00, 0x80, 0x52, + 0x1f, 0xb0, 0x01, 0x71, 0xa0, 0x05, 0x00, 0x54, 0x68, 0x06, 0x00, 0x54, + 0x1f, 0xa0, 0x01, 0x71, 0x00, 0x21, 0x00, 0x54, 0x1f, 0xa8, 0x01, 0x71, + 0xa1, 0x5e, 0x00, 0x54, 0x20, 0x07, 0x40, 0x39, 0xc6, 0x00, 0x18, 0x32, + 0x19, 0x05, 0x00, 0x91, 0x02, 0x94, 0x00, 0x51, 0x5f, 0x4c, 0x01, 0x71, + 0x69, 0x00, 0x00, 0x54, 0x64, 0x07, 0x00, 0x91, 0xc2, 0xff, 0xff, 0x17, + 0xe1, 0x3f, 0x40, 0xf9, 0x21, 0x58, 0x62, 0x78, 0x62, 0x00, 0x00, 0x10, + 0x41, 0xa8, 0x21, 0x8b, 0x20, 0x00, 0x1f, 0xd6, 0xf6, 0x07, 0xf8, 0x37, + 0x82, 0x2e, 0x00, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0x54, 0xf0, 0x7d, 0x92, + 0x18, 0x00, 0x40, 0xb9, 0x78, 0x00, 0xf8, 0x36, 0xc6, 0x00, 0x1f, 0x32, + 0xf8, 0x03, 0x18, 0x4b, 0x20, 0x07, 0x40, 0x39, 0x28, 0x0b, 0x00, 0x91, + 0xf9, 0x03, 0x04, 0xaa, 0x1f, 0xb8, 0x00, 0x71, 0xe1, 0xfb, 0xff, 0x54, + 0x20, 0x07, 0x40, 0x39, 0xc6, 0x00, 0x16, 0x32, 0x02, 0xc0, 0x00, 0x51, + 0x42, 0x1c, 0x00, 0x12, 0x5f, 0x24, 0x00, 0x71, 0x89, 0x1d, 0x00, 0x54, + 0x1f, 0xa8, 0x00, 0x71, 0x40, 0x2c, 0x00, 0x54, 0xf9, 0x03, 0x08, 0xaa, + 0x1f, 0xb0, 0x01, 0x71, 0x08, 0x05, 0x00, 0x91, 0x17, 0x00, 0x80, 0x52, + 0xa1, 0xfa, 0xff, 0x54, 0x20, 0x07, 0x40, 0x39, 0x1f, 0xb0, 0x01, 0x71, + 0x01, 0xfb, 0xff, 0x54, 0x20, 0x0b, 0x40, 0x39, 0xc6, 0x04, 0x18, 0x32, + 0x39, 0x0f, 0x00, 0x91, 0xd6, 0xff, 0xff, 0x17, 0x1f, 0xd0, 0x01, 0x71, + 0x20, 0xfa, 0xff, 0x54, 0x1f, 0xe8, 0x01, 0x71, 0xe0, 0xf9, 0xff, 0x54, + 0x04, 0xbc, 0x01, 0x51, 0x9f, 0x24, 0x00, 0x71, 0xa8, 0x5a, 0x00, 0x54, + 0x82, 0x01, 0x00, 0xd0, 0x42, 0xc0, 0x1f, 0x91, 0x41, 0x58, 0x64, 0x78, + 0x62, 0x00, 0x00, 0x10, 0x41, 0xa8, 0x21, 0x8b, 0x20, 0x00, 0x1f, 0xd6, + 0xf7, 0x63, 0x44, 0xa9, 0xf4, 0x03, 0x1b, 0x2a, 0x9f, 0x03, 0x1b, 0xeb, + 0x82, 0x07, 0x00, 0xd1, 0xe1, 0x03, 0x1a, 0xaa, 0x42, 0x90, 0x9b, 0x9a, + 0xe3, 0x03, 0x1c, 0xaa, 0x00, 0x00, 0x80, 0x52, 0x60, 0x02, 0x3f, 0xd6, + 0xe0, 0x03, 0x14, 0x2a, 0xfd, 0x7b, 0x41, 0xa9, 0xf3, 0x53, 0x42, 0xa9, + 0xf5, 0x5b, 0x43, 0xa9, 0xf9, 0x6b, 0x45, 0xa9, 0xfb, 0x73, 0x46, 0xa9, + 0xff, 0xc3, 0x02, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0xc2, 0x22, 0x00, 0x11, + 0x5f, 0x00, 0x00, 0x71, 0x6d, 0x23, 0x00, 0x54, 0x85, 0x2e, 0x00, 0x91, + 0xe0, 0x03, 0x14, 0xaa, 0xf6, 0x03, 0x02, 0x2a, 0xb4, 0xf0, 0x7d, 0x92, + 0xbe, 0xff, 0xff, 0x17, 0x02, 0x78, 0x1a, 0x12, 0x5f, 0x60, 0x01, 0x71, + 0xc1, 0x18, 0x00, 0x54, 0x1f, 0x60, 0x01, 0x71, 0x81, 0x3c, 0x00, 0x54, + 0xc6, 0x00, 0x1b, 0x32, 0x08, 0x02, 0x80, 0xd2, 0xc6, 0x74, 0x1c, 0x12, + 0xdf, 0x00, 0x76, 0xf2, 0xc2, 0x78, 0x1f, 0x12, 0x46, 0x10, 0x86, 0x1a, + 0x1f, 0xa4, 0x01, 0x71, 0x82, 0x0c, 0x80, 0x52, 0xc4, 0x00, 0x17, 0x12, + 0x04, 0x10, 0x42, 0x7a, 0x60, 0x19, 0x00, 0x54, 0xe4, 0x35, 0x00, 0x35, + 0xe6, 0x3c, 0x40, 0x37, 0x86, 0x31, 0x30, 0x37, 0x46, 0x40, 0x38, 0x36, + 0xb6, 0x4c, 0xf8, 0x37, 0xe0, 0x03, 0x14, 0xaa, 0x82, 0x2e, 0x00, 0x91, + 0x54, 0xf0, 0x7d, 0x92, 0x04, 0x00, 0x40, 0x79, 0x8a, 0x01, 0x00, 0x14, + 0x02, 0x78, 0x1a, 0x12, 0x00, 0x78, 0x1e, 0x12, 0x5f, 0x1c, 0x01, 0x71, + 0xc2, 0x00, 0x15, 0x32, 0x46, 0x00, 0x86, 0x1a, 0x1f, 0x14, 0x01, 0x71, + 0xc0, 0x00, 0x1b, 0x32, 0x06, 0x00, 0x86, 0x1a, 0xe0, 0xab, 0x40, 0xb9, + 0x20, 0x1d, 0xf8, 0x37, 0x82, 0x3e, 0x00, 0x91, 0xe0, 0x03, 0x14, 0xaa, + 0x54, 0xf0, 0x7d, 0x92, 0x00, 0x00, 0x40, 0xfd, 0xe2, 0x03, 0x1b, 0xaa, + 0xe5, 0x03, 0x18, 0x2a, 0xe4, 0x03, 0x17, 0x2a, 0xe3, 0x03, 0x1c, 0xaa, + 0xe1, 0x03, 0x1a, 0xaa, 0xe0, 0x03, 0x13, 0xaa, 0x5d, 0xfd, 0xff, 0x97, + 0xfb, 0x03, 0x00, 0xaa, 0x4a, 0xff, 0xff, 0x17, 0x1f, 0x18, 0x01, 0x71, + 0xc0, 0x00, 0x1b, 0x32, 0x06, 0x00, 0x86, 0x1a, 0xe0, 0xab, 0x40, 0xb9, + 0xc0, 0x18, 0xf8, 0x37, 0x82, 0x3e, 0x00, 0x91, 0xe0, 0x03, 0x14, 0xaa, + 0x54, 0xf0, 0x7d, 0x92, 0x00, 0x00, 0x40, 0xfd, 0xe2, 0x03, 0x1b, 0xaa, + 0xe5, 0x03, 0x18, 0x2a, 0xe4, 0x03, 0x17, 0x2a, 0xe3, 0x03, 0x1c, 0xaa, + 0xe1, 0x03, 0x1a, 0xaa, 0xe0, 0x03, 0x13, 0xaa, 0x2b, 0xfe, 0xff, 0x97, + 0xfb, 0x03, 0x00, 0xaa, 0x38, 0xff, 0xff, 0x17, 0x60, 0x07, 0x00, 0x91, + 0xe2, 0x03, 0x1b, 0xaa, 0xe3, 0x03, 0x1c, 0xaa, 0xfb, 0x03, 0x00, 0xaa, + 0xe1, 0x03, 0x1a, 0xaa, 0xa0, 0x04, 0x80, 0x52, 0x60, 0x02, 0x3f, 0xd6, + 0x30, 0xff, 0xff, 0x17, 0xf9, 0x03, 0x08, 0xaa, 0x20, 0x04, 0x80, 0x52, + 0xc6, 0x00, 0x00, 0x2a, 0xd6, 0x16, 0xf8, 0x37, 0x82, 0x3e, 0x00, 0x91, + 0xe0, 0x03, 0x14, 0xaa, 0x54, 0xf0, 0x7d, 0x92, 0xe7, 0x03, 0x17, 0x2a, + 0xe2, 0x03, 0x1b, 0xaa, 0x04, 0x00, 0x40, 0xf9, 0x00, 0x02, 0x80, 0x52, + 0xe0, 0x03, 0x00, 0xb9, 0xe6, 0x0b, 0x00, 0xb9, 0x06, 0x02, 0x80, 0xd2, + 0x05, 0x00, 0x80, 0x52, 0xe3, 0x03, 0x1c, 0xaa, 0xe1, 0x03, 0x1a, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0xf6, 0xfc, 0xff, 0x97, 0xfb, 0x03, 0x00, 0xaa, + 0x1b, 0xff, 0xff, 0x17, 0xe6, 0x1e, 0x08, 0x36, 0xb6, 0x26, 0xf8, 0x37, + 0x82, 0x2e, 0x00, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0x54, 0xf0, 0x7d, 0x92, + 0x00, 0x00, 0x40, 0x39, 0xe3, 0x03, 0x1c, 0xaa, 0xe2, 0x03, 0x1b, 0xaa, + 0xe1, 0x03, 0x1a, 0xaa, 0x77, 0x07, 0x00, 0x91, 0x60, 0x02, 0x3f, 0xd6, + 0x1f, 0x07, 0x00, 0x71, 0x09, 0x3d, 0x00, 0x54, 0x18, 0x0b, 0x00, 0x51, + 0x7b, 0x0b, 0x00, 0x91, 0x75, 0x03, 0x18, 0x8b, 0x1f, 0x20, 0x03, 0xd5, + 0xe2, 0x03, 0x17, 0xaa, 0xe3, 0x03, 0x1c, 0xaa, 0xf7, 0x06, 0x00, 0x91, + 0xe1, 0x03, 0x1a, 0xaa, 0x00, 0x04, 0x80, 0x52, 0x60, 0x02, 0x3f, 0xd6, + 0xff, 0x02, 0x15, 0xeb, 0x21, 0xff, 0xff, 0x54, 0x7b, 0x03, 0x18, 0x8b, + 0x00, 0xff, 0xff, 0x17, 0xf9, 0x03, 0x08, 0xaa, 0xf6, 0x0e, 0xf8, 0x37, + 0x82, 0x3e, 0x00, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0x54, 0xf0, 0x7d, 0x92, + 0x15, 0x00, 0x40, 0xf9, 0x15, 0x19, 0x00, 0xb4, 0xa0, 0x02, 0x40, 0x39, + 0xf7, 0x17, 0x00, 0x35, 0xe0, 0x32, 0x00, 0x34, 0xa2, 0x06, 0x40, 0x39, + 0x2b, 0x00, 0x80, 0x92, 0x6b, 0x05, 0x00, 0x91, 0xe0, 0x03, 0x15, 0xaa, + 0xa8, 0x02, 0x0b, 0x8b, 0x04, 0x00, 0x00, 0x14, 0x1f, 0x01, 0x00, 0xeb, + 0x40, 0x16, 0x00, 0x54, 0x02, 0x04, 0x40, 0x39, 0x00, 0x04, 0x00, 0x91, + 0x82, 0xff, 0xff, 0x35, 0x00, 0x00, 0x15, 0x4b, 0xe0, 0x8b, 0x00, 0xb9, + 0xc0, 0x00, 0x16, 0x12, 0xe0, 0x73, 0x00, 0xb9, 0xa6, 0x00, 0x50, 0x36, + 0xe0, 0x8b, 0x40, 0xb9, 0x1f, 0x00, 0x17, 0x6b, 0x00, 0x90, 0x97, 0x1a, + 0xe0, 0x8b, 0x00, 0xb9, 0xc0, 0x00, 0x1f, 0x12, 0xe0, 0xaf, 0x00, 0xb9, + 0x06, 0x1b, 0x08, 0x36, 0xa0, 0x02, 0x40, 0x39, 0xa0, 0x0f, 0x00, 0x34, + 0xe2, 0x03, 0x1b, 0xaa, 0xbb, 0x02, 0x1b, 0xcb, 0x02, 0x00, 0x00, 0x14, + 0xe2, 0x03, 0x15, 0xaa, 0xe1, 0x73, 0x40, 0xb9, 0x81, 0x00, 0x00, 0x34, + 0xe4, 0x06, 0x00, 0x51, 0x57, 0x14, 0x00, 0x34, 0xf7, 0x03, 0x04, 0x2a, + 0x55, 0x04, 0x00, 0x91, 0xe3, 0x03, 0x1c, 0xaa, 0xe1, 0x03, 0x1a, 0xaa, + 0x60, 0x02, 0x3f, 0xd6, 0x60, 0x6b, 0x75, 0x38, 0xa0, 0xfe, 0xff, 0x35, + 0xe0, 0xaf, 0x40, 0xb9, 0x60, 0x0d, 0x00, 0x35, 0xfb, 0x03, 0x15, 0xaa, + 0xca, 0xfe, 0xff, 0x17, 0x20, 0x07, 0x40, 0x39, 0x1f, 0xa0, 0x01, 0x71, + 0xe0, 0x10, 0x00, 0x54, 0xc6, 0x00, 0x19, 0x32, 0x19, 0x05, 0x00, 0x91, + 0xf9, 0xfe, 0xff, 0x17, 0x17, 0x00, 0x80, 0x52, 0x44, 0x01, 0x80, 0x52, + 0xe7, 0x02, 0x04, 0x1b, 0xeb, 0x03, 0x08, 0xaa, 0x00, 0x1d, 0x40, 0x38, + 0xf7, 0xc0, 0x00, 0x51, 0x02, 0xc0, 0x00, 0x51, 0x42, 0x1c, 0x00, 0x12, + 0x5f, 0x24, 0x00, 0x71, 0x29, 0xff, 0xff, 0x54, 0xf9, 0x03, 0x08, 0xaa, + 0x68, 0x09, 0x00, 0x91, 0xe2, 0xfe, 0xff, 0x17, 0x02, 0x78, 0x1a, 0x12, + 0xf9, 0x03, 0x08, 0xaa, 0x5f, 0x60, 0x01, 0x71, 0x20, 0x24, 0x00, 0x54, + 0x1f, 0xbc, 0x01, 0x71, 0x20, 0x20, 0x00, 0x54, 0x1f, 0x88, 0x01, 0x71, + 0xe0, 0x26, 0x00, 0x54, 0xc6, 0x78, 0x1b, 0x12, 0x48, 0x01, 0x80, 0xd2, + 0x1f, 0xa4, 0x01, 0x71, 0x82, 0x0c, 0x80, 0x52, 0x04, 0x10, 0x42, 0x7a, + 0xc1, 0xe6, 0xff, 0x54, 0xdf, 0x00, 0x76, 0xf2, 0xc2, 0x78, 0x1f, 0x12, + 0x46, 0x10, 0x86, 0x1a, 0x1f, 0xa4, 0x01, 0x71, 0x82, 0x0c, 0x80, 0x52, + 0xc4, 0x00, 0x17, 0x12, 0x04, 0x10, 0x42, 0x7a, 0xe1, 0xe6, 0xff, 0x54, + 0x04, 0x20, 0x00, 0x35, 0xe6, 0x21, 0x40, 0x37, 0xe6, 0x19, 0x30, 0x37, + 0x06, 0x28, 0x38, 0x36, 0x16, 0x35, 0xf8, 0x37, 0x82, 0x2e, 0x00, 0x91, + 0xe0, 0x03, 0x14, 0xaa, 0x54, 0xf0, 0x7d, 0x92, 0x05, 0x00, 0xc0, 0x79, + 0xbf, 0x00, 0x00, 0x71, 0xa4, 0xa4, 0x85, 0x5a, 0x84, 0x3c, 0x00, 0x12, + 0xe7, 0x03, 0x17, 0x2a, 0xa5, 0x7c, 0x1f, 0x53, 0x84, 0x7c, 0x40, 0x93, + 0xe2, 0x03, 0x1b, 0xaa, 0xe6, 0x0b, 0x00, 0xb9, 0xe6, 0x03, 0x08, 0xaa, + 0xf8, 0x03, 0x00, 0xb9, 0xe3, 0x03, 0x1c, 0xaa, 0xe1, 0x03, 0x1a, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x2b, 0xfc, 0xff, 0x97, 0xfb, 0x03, 0x00, 0xaa, + 0x88, 0xfe, 0xff, 0x17, 0xc2, 0x22, 0x00, 0x11, 0x5f, 0x00, 0x00, 0x71, + 0x2d, 0x1c, 0x00, 0x54, 0x84, 0x3e, 0x00, 0x91, 0xe0, 0x03, 0x14, 0xaa, + 0xf6, 0x03, 0x02, 0x2a, 0x94, 0xf0, 0x7d, 0x92, 0x86, 0xff, 0xff, 0x17, + 0xe0, 0xab, 0x40, 0xb9, 0x02, 0x40, 0x00, 0x11, 0x5f, 0x00, 0x00, 0x71, + 0x6d, 0x1a, 0x00, 0x54, 0x84, 0x3e, 0x00, 0x91, 0xe0, 0x03, 0x14, 0xaa, + 0x94, 0xf0, 0x7d, 0x92, 0xe2, 0xab, 0x00, 0xb9, 0x36, 0xff, 0xff, 0x17, + 0xc2, 0x22, 0x00, 0x11, 0x5f, 0x00, 0x00, 0x71, 0xed, 0x18, 0x00, 0x54, + 0x84, 0x3e, 0x00, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0xf6, 0x03, 0x02, 0x2a, + 0x94, 0xf0, 0x7d, 0x92, 0x47, 0xff, 0xff, 0x17, 0xe0, 0xab, 0x40, 0xb9, + 0x02, 0x40, 0x00, 0x11, 0x5f, 0x00, 0x00, 0x71, 0x6d, 0x15, 0x00, 0x54, + 0x84, 0x3e, 0x00, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0x94, 0xf0, 0x7d, 0x92, + 0xe2, 0xab, 0x00, 0xb9, 0x13, 0xff, 0xff, 0x17, 0xe0, 0x43, 0x40, 0xf9, + 0x00, 0xc0, 0x36, 0x8b, 0xf6, 0x03, 0x02, 0x2a, 0xa5, 0xfe, 0xff, 0x17, + 0xfb, 0x03, 0x15, 0xaa, 0xe0, 0x8b, 0x40, 0xb9, 0x1f, 0x00, 0x18, 0x6b, + 0x22, 0x0e, 0x00, 0x54, 0x04, 0x07, 0x00, 0x51, 0x66, 0x07, 0x00, 0x91, + 0x84, 0x00, 0x00, 0x4b, 0x95, 0x00, 0x06, 0x8b, 0x02, 0x00, 0x00, 0x14, + 0xc6, 0x04, 0x00, 0x91, 0xe6, 0x3b, 0x00, 0xf9, 0xe2, 0x03, 0x1b, 0xaa, + 0xe3, 0x03, 0x1c, 0xaa, 0xe1, 0x03, 0x1a, 0xaa, 0x00, 0x04, 0x80, 0x52, + 0x60, 0x02, 0x3f, 0xd6, 0xe6, 0x3b, 0x40, 0xf9, 0xdf, 0x00, 0x15, 0xeb, + 0xfb, 0x03, 0x06, 0xaa, 0xc1, 0xfe, 0xff, 0x54, 0xfb, 0x03, 0x15, 0xaa, + 0x4c, 0xfe, 0xff, 0x17, 0x16, 0x04, 0xf8, 0x37, 0x82, 0x2e, 0x00, 0x91, + 0xe0, 0x03, 0x14, 0xaa, 0x54, 0xf0, 0x7d, 0x92, 0x07, 0x00, 0x40, 0xb9, + 0x28, 0x0f, 0x00, 0x91, 0x20, 0x0b, 0x40, 0x39, 0x39, 0x0b, 0x00, 0x91, + 0xff, 0x00, 0x00, 0x71, 0xf7, 0xa0, 0x9f, 0x1a, 0x6c, 0xfe, 0xff, 0x17, + 0x20, 0x0b, 0x40, 0x39, 0xc6, 0x04, 0x1a, 0x32, 0x39, 0x0f, 0x00, 0x91, + 0x72, 0xfe, 0xff, 0x17, 0xeb, 0x8b, 0x00, 0xb9, 0x53, 0xff, 0xff, 0x17, + 0x14, 0x00, 0x80, 0x52, 0xa8, 0xfe, 0xff, 0x17, 0xeb, 0x03, 0x17, 0x2a, + 0x00, 0x1b, 0x00, 0x34, 0xa2, 0x06, 0x40, 0x39, 0x6b, 0x05, 0x00, 0xd1, + 0x41, 0xff, 0xff, 0x17, 0xf5, 0x03, 0x02, 0xaa, 0x65, 0xff, 0xff, 0x17, + 0xf7, 0x08, 0x00, 0x34, 0xeb, 0x03, 0x17, 0x2a, 0xc2, 0x0d, 0x80, 0x52, + 0x6b, 0x05, 0x00, 0xd1, 0xf5, 0x4f, 0x40, 0xf9, 0x39, 0xff, 0xff, 0x17, + 0xc2, 0x22, 0x00, 0x11, 0x5f, 0x00, 0x00, 0x71, 0x2d, 0x08, 0x00, 0x54, + 0x84, 0x2e, 0x00, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0xf6, 0x03, 0x02, 0x2a, + 0x94, 0xf0, 0x7d, 0x92, 0xdd, 0xff, 0xff, 0x17, 0x1f, 0x07, 0x00, 0x71, + 0xa9, 0x1e, 0x00, 0x54, 0x05, 0x0b, 0x00, 0x51, 0x66, 0x07, 0x00, 0x91, + 0xd5, 0x00, 0x05, 0x8b, 0x02, 0x00, 0x00, 0x14, 0xc6, 0x04, 0x00, 0x91, + 0xe6, 0x3b, 0x00, 0xf9, 0xe2, 0x03, 0x1b, 0xaa, 0xe3, 0x03, 0x1c, 0xaa, + 0xe1, 0x03, 0x1a, 0xaa, 0x00, 0x04, 0x80, 0x52, 0x60, 0x02, 0x3f, 0xd6, + 0xe6, 0x3b, 0x40, 0xf9, 0xdf, 0x00, 0x15, 0xeb, 0xfb, 0x03, 0x06, 0xaa, + 0xc1, 0xfe, 0xff, 0x54, 0x56, 0x09, 0xf8, 0x37, 0x82, 0x2e, 0x00, 0x91, + 0xe0, 0x03, 0x14, 0xaa, 0x54, 0xf0, 0x7d, 0x92, 0x00, 0x00, 0x40, 0x39, + 0xbb, 0x06, 0x00, 0x91, 0xe2, 0x03, 0x15, 0xaa, 0xe3, 0x03, 0x1c, 0xaa, + 0xe1, 0x03, 0x1a, 0xaa, 0x60, 0x02, 0x3f, 0xd6, 0x08, 0xfe, 0xff, 0x17, + 0xe1, 0x8b, 0x40, 0xb9, 0x3f, 0x00, 0x18, 0x6b, 0x20, 0x04, 0x00, 0x11, + 0x02, 0x1c, 0x00, 0x54, 0x00, 0x07, 0x00, 0x51, 0x66, 0x07, 0x00, 0x91, + 0x00, 0x00, 0x01, 0x4b, 0x00, 0x00, 0x06, 0x8b, 0xe0, 0x53, 0x00, 0xf9, + 0x02, 0x00, 0x00, 0x14, 0xc6, 0x04, 0x00, 0x91, 0xe6, 0x47, 0x00, 0xf9, + 0xe2, 0x03, 0x1b, 0xaa, 0x00, 0x04, 0x80, 0x52, 0xe3, 0x03, 0x1c, 0xaa, + 0xe1, 0x03, 0x1a, 0xaa, 0x60, 0x02, 0x3f, 0xd6, 0xe6, 0x47, 0x40, 0xf9, + 0xe0, 0x53, 0x40, 0xf9, 0xfb, 0x03, 0x06, 0xaa, 0xdf, 0x00, 0x00, 0xeb, + 0xa1, 0xfe, 0xff, 0x54, 0x00, 0x07, 0x00, 0x11, 0xe0, 0x8b, 0x00, 0xb9, + 0xa0, 0x02, 0x40, 0x39, 0x40, 0xe2, 0xff, 0x35, 0xf5, 0x03, 0x1b, 0xaa, + 0xfb, 0x03, 0x15, 0xaa, 0xeb, 0xfd, 0xff, 0x17, 0xf5, 0x4f, 0x40, 0xf9, + 0xf4, 0xfe, 0xff, 0x17, 0xe0, 0x43, 0x40, 0xf9, 0x00, 0xc0, 0x36, 0x8b, + 0xf6, 0x03, 0x02, 0x2a, 0x9e, 0xff, 0xff, 0x17, 0xc2, 0x22, 0x00, 0x11, + 0x5f, 0x00, 0x00, 0x71, 0xad, 0x13, 0x00, 0x54, 0x84, 0x2e, 0x00, 0x91, + 0xe0, 0x03, 0x14, 0xaa, 0xf6, 0x03, 0x02, 0x2a, 0x94, 0xf0, 0x7d, 0x92, + 0xc8, 0xfe, 0xff, 0x17, 0xf6, 0x10, 0xf8, 0x37, 0x82, 0x2e, 0x00, 0x91, + 0xe0, 0x03, 0x14, 0xaa, 0x54, 0xf0, 0x7d, 0x92, 0x04, 0x00, 0x40, 0x39, + 0xe7, 0x03, 0x17, 0x2a, 0xe4, 0x03, 0x04, 0x2a, 0xe6, 0x0b, 0x00, 0xb9, + 0xe6, 0x03, 0x08, 0xaa, 0xf8, 0x03, 0x00, 0xb9, 0xe2, 0x03, 0x1b, 0xaa, + 0x05, 0x00, 0x80, 0x52, 0x43, 0xff, 0xff, 0x17, 0xd6, 0x11, 0xf8, 0x37, + 0x82, 0x2e, 0x00, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0x54, 0xf0, 0x7d, 0x92, + 0x05, 0x00, 0x40, 0x39, 0xe4, 0x03, 0x05, 0x2a, 0x35, 0xff, 0xff, 0x17, + 0xc2, 0x22, 0x00, 0x11, 0x5f, 0x00, 0x00, 0x71, 0xad, 0x11, 0x00, 0x54, + 0x84, 0x2e, 0x00, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0xf6, 0x03, 0x02, 0x2a, + 0x94, 0xf0, 0x7d, 0x92, 0xb3, 0xff, 0xff, 0x17, 0xe1, 0x4b, 0x40, 0xf9, + 0xe0, 0xab, 0x40, 0xb9, 0xe2, 0xab, 0x00, 0xb9, 0x20, 0xc0, 0x20, 0x8b, + 0x69, 0xfe, 0xff, 0x17, 0xd6, 0x09, 0xf8, 0x37, 0x82, 0x3e, 0x00, 0x91, + 0xe0, 0x03, 0x14, 0xaa, 0x54, 0xf0, 0x7d, 0x92, 0xe7, 0x03, 0x17, 0x2a, + 0xe2, 0x03, 0x1b, 0xaa, 0x04, 0x00, 0x40, 0xf9, 0xf8, 0x03, 0x00, 0xb9, + 0xe6, 0x0b, 0x00, 0xb9, 0xe6, 0x03, 0x08, 0xaa, 0x90, 0xfe, 0xff, 0x17, + 0xc6, 0x74, 0x1c, 0x12, 0x08, 0x01, 0x80, 0xd2, 0x3c, 0xfe, 0xff, 0x17, + 0xe0, 0x43, 0x40, 0xf9, 0x00, 0xc0, 0x36, 0x8b, 0xf6, 0x03, 0x02, 0x2a, + 0x82, 0xfe, 0xff, 0x17, 0xe1, 0x4b, 0x40, 0xf9, 0xe0, 0xab, 0x40, 0xb9, + 0xe2, 0xab, 0x00, 0xb9, 0x20, 0xc0, 0x20, 0x8b, 0x64, 0xfe, 0xff, 0x17, + 0xe0, 0x43, 0x40, 0xf9, 0x00, 0xc0, 0x36, 0x8b, 0xf6, 0x03, 0x02, 0x2a, + 0xa7, 0xfe, 0xff, 0x17, 0x76, 0x05, 0xf8, 0x37, 0x82, 0x3e, 0x00, 0x91, + 0xe0, 0x03, 0x14, 0xaa, 0x54, 0xf0, 0x7d, 0x92, 0x05, 0x00, 0x40, 0xf9, + 0xe7, 0x03, 0x17, 0x2a, 0xe2, 0x03, 0x1b, 0xaa, 0xf8, 0x03, 0x00, 0xb9, + 0xbf, 0x00, 0x00, 0xf1, 0xe6, 0x0b, 0x00, 0xb9, 0xa4, 0xa4, 0x85, 0xda, + 0xe6, 0x03, 0x08, 0xaa, 0xa5, 0xfc, 0x7f, 0xd3, 0x73, 0xfe, 0xff, 0x17, + 0x08, 0x02, 0x80, 0xd2, 0xe5, 0xfe, 0xff, 0x17, 0x76, 0x0b, 0xf8, 0x37, + 0x82, 0x3e, 0x00, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0x54, 0xf0, 0x7d, 0x92, + 0x05, 0x00, 0x40, 0xf9, 0xe7, 0x03, 0x17, 0x2a, 0xe2, 0x03, 0x1b, 0xaa, + 0xf8, 0x03, 0x00, 0xb9, 0xbf, 0x00, 0x00, 0xf1, 0xe6, 0x0b, 0x00, 0xb9, + 0xa4, 0xa4, 0x85, 0xda, 0xe6, 0x03, 0x08, 0xaa, 0xa5, 0xfc, 0x7f, 0xd3, + 0xf6, 0xfe, 0xff, 0x17, 0xb6, 0x06, 0xf8, 0x37, 0x82, 0x3e, 0x00, 0x91, + 0xe0, 0x03, 0x14, 0xaa, 0x54, 0xf0, 0x7d, 0x92, 0xe7, 0x03, 0x17, 0x2a, + 0x04, 0x00, 0x40, 0xf9, 0xf8, 0x03, 0x00, 0xb9, 0xe6, 0x0b, 0x00, 0xb9, + 0xe6, 0x03, 0x08, 0xaa, 0xa7, 0xff, 0xff, 0x17, 0xc6, 0x74, 0x1c, 0x12, + 0x48, 0x00, 0x80, 0xd2, 0x04, 0xfe, 0xff, 0x17, 0xc2, 0x22, 0x00, 0x11, + 0x5f, 0x00, 0x00, 0x71, 0x2d, 0x0a, 0x00, 0x54, 0x84, 0x3e, 0x00, 0x91, + 0xe0, 0x03, 0x14, 0xaa, 0xf6, 0x03, 0x02, 0x2a, 0x94, 0xf0, 0x7d, 0x92, + 0xd2, 0xff, 0xff, 0x17, 0xc2, 0x22, 0x00, 0x11, 0x5f, 0x00, 0x00, 0x71, + 0x2d, 0x08, 0x00, 0x54, 0x84, 0x3e, 0x00, 0x91, 0xe0, 0x03, 0x14, 0xaa, + 0xf6, 0x03, 0x02, 0x2a, 0x94, 0xf0, 0x7d, 0x92, 0xaf, 0xff, 0xff, 0x17, + 0x76, 0x09, 0xf8, 0x37, 0xe0, 0x03, 0x14, 0xaa, 0x82, 0x2e, 0x00, 0x91, + 0x54, 0xf0, 0x7d, 0x92, 0x04, 0x00, 0x40, 0xb9, 0x89, 0xff, 0xff, 0x17, + 0xff, 0x8b, 0x00, 0xb9, 0x76, 0xfe, 0xff, 0x17, 0x96, 0x09, 0xf8, 0x37, + 0x82, 0x2e, 0x00, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0x54, 0xf0, 0x7d, 0x92, + 0x05, 0x00, 0x40, 0xb9, 0xbf, 0x00, 0x00, 0x71, 0xa4, 0xa4, 0x85, 0x5a, + 0xc2, 0xfe, 0xff, 0x17, 0xc2, 0x22, 0x00, 0x11, 0x5f, 0x00, 0x00, 0x71, + 0xad, 0x06, 0x00, 0x54, 0x84, 0x2e, 0x00, 0x91, 0xe0, 0x03, 0x14, 0xaa, + 0xf6, 0x03, 0x02, 0x2a, 0x94, 0xf0, 0x7d, 0x92, 0x76, 0xff, 0xff, 0x17, + 0xc2, 0x22, 0x00, 0x11, 0x5f, 0x00, 0x00, 0x71, 0xcd, 0x08, 0x00, 0x54, + 0x84, 0x3e, 0x00, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0xf6, 0x03, 0x02, 0x2a, + 0x94, 0xf0, 0x7d, 0x92, 0xc8, 0xff, 0xff, 0x17, 0xe0, 0x43, 0x40, 0xf9, + 0x00, 0xc0, 0x36, 0x8b, 0xf6, 0x03, 0x02, 0x2a, 0x2d, 0xfe, 0xff, 0x17, + 0xc2, 0x22, 0x00, 0x11, 0x5f, 0x00, 0x00, 0x71, 0xed, 0x08, 0x00, 0x54, + 0x84, 0x2e, 0x00, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0xf6, 0x03, 0x02, 0x2a, + 0x94, 0xf0, 0x7d, 0x92, 0x6f, 0xff, 0xff, 0x17, 0xe0, 0x43, 0x40, 0xf9, + 0x00, 0xc0, 0x36, 0x8b, 0xf6, 0x03, 0x02, 0x2a, 0x28, 0xff, 0xff, 0x17, + 0xc2, 0x22, 0x00, 0x11, 0x5f, 0x00, 0x00, 0x71, 0x4d, 0x05, 0x00, 0x54, + 0x84, 0x3e, 0x00, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0xf6, 0x03, 0x02, 0x2a, + 0x94, 0xf0, 0x7d, 0x92, 0xa2, 0xff, 0xff, 0x17, 0xf5, 0x03, 0x1b, 0xaa, + 0x76, 0xe3, 0xff, 0x36, 0x63, 0xff, 0xff, 0x17, 0xe0, 0x43, 0x40, 0xf9, + 0x00, 0xc0, 0x36, 0x8b, 0xf6, 0x03, 0x02, 0x2a, 0x70, 0xff, 0xff, 0x17, + 0xfb, 0x03, 0x17, 0xaa, 0x25, 0xfd, 0xff, 0x17, 0xe0, 0x8b, 0x00, 0xb9, + 0x34, 0xff, 0xff, 0x17, 0xe0, 0x43, 0x40, 0xf9, 0x00, 0xc0, 0x36, 0x8b, + 0xf6, 0x03, 0x02, 0x2a, 0x83, 0xff, 0xff, 0x17, 0xe0, 0x43, 0x40, 0xf9, + 0x00, 0xc0, 0x36, 0x8b, 0xf6, 0x03, 0x02, 0x2a, 0x43, 0xff, 0xff, 0x17, + 0xc2, 0x22, 0x00, 0x11, 0x5f, 0x00, 0x00, 0x71, 0x8d, 0x05, 0x00, 0x54, + 0xe0, 0x03, 0x14, 0xaa, 0x84, 0x2e, 0x00, 0x91, 0x94, 0xf0, 0x7d, 0x92, + 0xf6, 0x03, 0x02, 0x2a, 0x04, 0x00, 0x40, 0xb9, 0x3b, 0xff, 0xff, 0x17, + 0xc2, 0x22, 0x00, 0x11, 0x5f, 0x00, 0x00, 0x71, 0x2d, 0x06, 0x00, 0x54, + 0x84, 0x2e, 0x00, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0xf6, 0x03, 0x02, 0x2a, + 0x94, 0xf0, 0x7d, 0x92, 0xb1, 0xff, 0xff, 0x17, 0xe0, 0x43, 0x40, 0xf9, + 0x00, 0xc0, 0x36, 0x8b, 0xf6, 0x03, 0x02, 0x2a, 0x7a, 0xff, 0xff, 0x17, + 0xe0, 0x43, 0x40, 0xf9, 0x00, 0xc0, 0x36, 0x8b, 0xf6, 0x03, 0x02, 0x2a, + 0x84, 0xff, 0xff, 0x17, 0xc2, 0x22, 0x00, 0x11, 0x5f, 0x00, 0x00, 0x71, + 0x0d, 0x03, 0x00, 0x54, 0xe0, 0x03, 0x14, 0xaa, 0x84, 0x2e, 0x00, 0x91, + 0x94, 0xf0, 0x7d, 0x92, 0xf6, 0x03, 0x02, 0x2a, 0x04, 0x00, 0x40, 0x79, + 0x22, 0xff, 0xff, 0x17, 0xe0, 0x43, 0x40, 0xf9, 0x00, 0xc0, 0x36, 0x8b, + 0xf6, 0x03, 0x02, 0x2a, 0x2a, 0xff, 0xff, 0x17, 0xc2, 0x22, 0x00, 0x11, + 0x5f, 0x00, 0x00, 0x71, 0x0d, 0x02, 0x00, 0x54, 0x84, 0x2e, 0x00, 0x91, + 0xe0, 0x03, 0x14, 0xaa, 0xf6, 0x03, 0x02, 0x2a, 0x94, 0xf0, 0x7d, 0x92, + 0x55, 0xfe, 0xff, 0x17, 0xe0, 0x43, 0x40, 0xf9, 0x00, 0xc0, 0x36, 0x8b, + 0xf6, 0x03, 0x02, 0x2a, 0x04, 0x00, 0x40, 0xb9, 0x11, 0xff, 0xff, 0x17, + 0xe0, 0x43, 0x40, 0xf9, 0x00, 0xc0, 0x36, 0x8b, 0xf6, 0x03, 0x02, 0x2a, + 0x04, 0x00, 0x40, 0x79, 0x0c, 0xff, 0xff, 0x17, 0xe0, 0x43, 0x40, 0xf9, + 0x00, 0xc0, 0x36, 0x8b, 0xf6, 0x03, 0x02, 0x2a, 0x47, 0xfe, 0xff, 0x17, + 0xe0, 0x43, 0x40, 0xf9, 0x00, 0xc0, 0x36, 0x8b, 0xf6, 0x03, 0x02, 0x2a, + 0x82, 0xff, 0xff, 0x17, 0xf9, 0x03, 0x08, 0xaa, 0x0e, 0xfd, 0xff, 0x17, + 0x02, 0xc0, 0x00, 0x51, 0x18, 0x00, 0x80, 0x52, 0x42, 0x1c, 0x00, 0x12, + 0x5f, 0x24, 0x00, 0x71, 0xc8, 0xa3, 0xff, 0x54, 0x42, 0x01, 0x80, 0x52, + 0x02, 0x00, 0x00, 0x14, 0x84, 0x04, 0x00, 0x91, 0x05, 0x03, 0x02, 0x1b, + 0x80, 0x00, 0x40, 0x39, 0xe8, 0x03, 0x19, 0xaa, 0xf9, 0x03, 0x04, 0xaa, + 0x07, 0xc0, 0x00, 0x51, 0xb8, 0xc0, 0x00, 0x51, 0xe7, 0x1c, 0x00, 0x12, + 0xff, 0x24, 0x00, 0x71, 0xe9, 0xfe, 0xff, 0x54, 0x08, 0x09, 0x00, 0x91, + 0x10, 0xfd, 0xff, 0x17, 0xf9, 0x03, 0x08, 0xaa, 0x64, 0x07, 0x00, 0x91, + 0xbe, 0xfc, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0x2a, 0xf8, 0xf6, 0xff, 0x97, + 0x1f, 0x1c, 0x00, 0x72, 0x60, 0x12, 0x9f, 0x5a, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x72, 0x41, 0x00, 0x00, 0x54, + 0xc0, 0x03, 0x5f, 0xd6, 0xf1, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xae, 0xa9, + 0xe9, 0x0f, 0x80, 0x12, 0xea, 0x06, 0x80, 0x12, 0xfd, 0x03, 0x00, 0x91, + 0xeb, 0x83, 0x03, 0x91, 0xe8, 0x83, 0x04, 0x91, 0xe8, 0x23, 0x04, 0xa9, + 0xe8, 0x03, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x25, 0x91, + 0xeb, 0x2b, 0x00, 0xf9, 0xea, 0x27, 0x0b, 0x29, 0xec, 0x37, 0x44, 0xa9, + 0xec, 0x37, 0x01, 0xa9, 0xea, 0x2f, 0x45, 0xa9, 0xea, 0x2f, 0x02, 0xa9, + 0xe0, 0x1b, 0x80, 0x3d, 0xe1, 0x1f, 0x80, 0x3d, 0xe2, 0x23, 0x80, 0x3d, + 0xe3, 0x27, 0x80, 0x3d, 0xe4, 0x2b, 0x80, 0x3d, 0xe5, 0x2f, 0x80, 0x3d, + 0xe6, 0x33, 0x80, 0x3d, 0xe7, 0x37, 0x80, 0x3d, 0xe1, 0x8b, 0x0e, 0xa9, + 0xe1, 0xe3, 0x00, 0x91, 0x02, 0x00, 0x80, 0x92, 0xe3, 0x93, 0x0f, 0xa9, + 0xe4, 0x43, 0x00, 0x91, 0xe3, 0x03, 0x08, 0xaa, 0xe5, 0x9b, 0x10, 0xa9, + 0xe7, 0x8f, 0x00, 0xf9, 0x68, 0xfc, 0xff, 0x97, 0xfd, 0x7b, 0xd2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb0, 0xa9, + 0xe8, 0x04, 0x80, 0x12, 0xea, 0x0f, 0x80, 0x12, 0xfd, 0x03, 0x00, 0x91, + 0xe9, 0x43, 0x03, 0x91, 0xeb, 0x03, 0x04, 0x91, 0xeb, 0x2f, 0x03, 0xa9, + 0xe9, 0x23, 0x00, 0xf9, 0xe9, 0x03, 0x01, 0xaa, 0xe8, 0x2b, 0x09, 0x29, + 0xe8, 0x03, 0x02, 0xaa, 0xec, 0x37, 0x43, 0xa9, 0xe1, 0x03, 0x00, 0xaa, + 0xea, 0x2f, 0x44, 0xa9, 0xe2, 0x03, 0x09, 0xaa, 0xe0, 0xff, 0xff, 0xd0, + 0x00, 0xc0, 0x3a, 0x91, 0xec, 0x37, 0x01, 0xa9, 0xea, 0x2f, 0x02, 0xa9, + 0xe0, 0x17, 0x80, 0x3d, 0xe1, 0x1b, 0x80, 0x3d, 0xe2, 0x1f, 0x80, 0x3d, + 0xe3, 0x23, 0x80, 0x3d, 0xe4, 0x27, 0x80, 0x3d, 0xe5, 0x2b, 0x80, 0x3d, + 0xe6, 0x2f, 0x80, 0x3d, 0xe7, 0x33, 0x80, 0x3d, 0xe3, 0x93, 0x0d, 0xa9, + 0xe4, 0x43, 0x00, 0x91, 0xe3, 0x03, 0x08, 0xaa, 0xe5, 0x9b, 0x0e, 0xa9, + 0xe7, 0x7f, 0x00, 0xf9, 0x44, 0xfc, 0xff, 0x97, 0xfd, 0x7b, 0xd0, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x03, 0x03, 0xaa, + 0xfd, 0x7b, 0xbd, 0xa9, 0xe5, 0x03, 0x01, 0xaa, 0xfd, 0x03, 0x00, 0x91, + 0x88, 0x24, 0x40, 0xa9, 0xe1, 0x03, 0x00, 0xaa, 0x86, 0x1c, 0x41, 0xa9, + 0xe3, 0x03, 0x02, 0xaa, 0xe4, 0x43, 0x00, 0x91, 0xe2, 0x03, 0x05, 0xaa, + 0xe0, 0xff, 0xff, 0xd0, 0x00, 0xc0, 0x3a, 0x91, 0xe8, 0x27, 0x01, 0xa9, + 0xe6, 0x1f, 0x02, 0xa9, 0x32, 0xfc, 0xff, 0x97, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0xd0, 0x61, 0x3b, 0x9a, 0x52, + 0x41, 0x01, 0xa0, 0x72, 0x1f, 0x00, 0x01, 0x6b, 0xe4, 0x17, 0x9f, 0x1a, + 0x22, 0x00, 0x84, 0x52, 0x64, 0xd8, 0x05, 0xb9, 0x40, 0x10, 0x9f, 0x1a, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xd0, 0x00, 0xd8, 0x45, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, 0xb9, + 0x3f, 0x0c, 0x00, 0x71, 0xa0, 0x00, 0x00, 0x54, 0x3f, 0x3c, 0x00, 0x71, + 0xa0, 0x00, 0x00, 0x54, 0x60, 0x00, 0x84, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x08, 0x40, 0x79, 0xc4, 0xf8, 0xff, 0x17, 0x00, 0x08, 0x40, 0x79, + 0x86, 0xbe, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, + 0xc0, 0x07, 0x80, 0x52, 0x0f, 0xf7, 0xff, 0x97, 0xa2, 0x12, 0x80, 0x52, + 0xe2, 0x23, 0x00, 0xb9, 0x62, 0x06, 0x40, 0xb9, 0xe0, 0x83, 0x00, 0x91, + 0x01, 0x00, 0x80, 0x52, 0xe2, 0x27, 0x00, 0xb9, 0xf3, 0x17, 0x00, 0xf9, + 0x37, 0xd2, 0xff, 0x97, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0xd0, 0x20, 0x08, 0x04, 0xf9, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbf, 0xa9, + 0x81, 0x01, 0x00, 0xb0, 0x00, 0x03, 0x00, 0xd0, 0xfd, 0x03, 0x00, 0x91, + 0x21, 0x80, 0x22, 0x91, 0x00, 0x20, 0x18, 0x91, 0xca, 0xd3, 0xff, 0x97, + 0x00, 0x02, 0x00, 0x35, 0x00, 0x03, 0x00, 0xd0, 0x04, 0x08, 0x44, 0xf9, + 0x64, 0x01, 0x00, 0xb4, 0x80, 0x40, 0x00, 0x91, 0x82, 0xb0, 0x04, 0x91, + 0x83, 0xc0, 0x04, 0x91, 0x01, 0x00, 0x80, 0x12, 0x1f, 0x20, 0x03, 0xd5, + 0x01, 0x84, 0x01, 0xb8, 0x41, 0x04, 0x02, 0xb8, 0x1f, 0x00, 0x03, 0xeb, + 0xa1, 0xff, 0xff, 0x54, 0x9f, 0x00, 0x00, 0x79, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, 0x83, 0x01, 0x00, 0xb0, + 0x63, 0xe0, 0x22, 0x91, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x60, 0xf7, 0xff, 0x97, 0xeb, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x05, 0x00, 0xb4, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x01, 0xaa, + 0xa1, 0x05, 0x00, 0xb4, 0xf5, 0x5b, 0x02, 0xa9, 0x16, 0x03, 0x00, 0xd0, + 0xd5, 0x0a, 0x44, 0xf9, 0xf5, 0x03, 0x00, 0xb4, 0xb4, 0x02, 0x40, 0x39, + 0x01, 0x03, 0x80, 0x52, 0x03, 0x08, 0x40, 0x29, 0x64, 0x02, 0x40, 0x79, + 0x80, 0x56, 0xa1, 0x9b, 0x04, 0x10, 0x00, 0x79, 0x61, 0x06, 0x40, 0x79, + 0x01, 0x14, 0x00, 0x79, 0x03, 0x88, 0x01, 0x29, 0x61, 0xbe, 0xff, 0x97, + 0xe2, 0x03, 0x00, 0xaa, 0x04, 0x03, 0x80, 0xd2, 0x65, 0x06, 0x40, 0xb9, + 0xc0, 0x0a, 0x44, 0xf9, 0x94, 0x56, 0x04, 0x9b, 0x01, 0x55, 0x80, 0xd2, + 0x82, 0x0e, 0x00, 0xf9, 0x03, 0x00, 0x40, 0x39, 0x02, 0x00, 0x40, 0x39, + 0x42, 0x04, 0x00, 0x11, 0x63, 0x00, 0x04, 0x9b, 0x42, 0x1c, 0x00, 0x12, + 0x5f, 0x2c, 0x00, 0x71, 0x42, 0x90, 0x9f, 0x1a, 0x65, 0x14, 0x00, 0xb9, + 0x02, 0x00, 0x00, 0x39, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0x60, 0x6b, 0x00, 0x14, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x83, 0x01, 0x00, 0xb0, 0x63, 0x60, 0x23, 0x91, 0x42, 0x00, 0x80, 0x52, + 0x21, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x2b, 0xf7, 0xff, 0x17, + 0xf3, 0x53, 0x41, 0xa9, 0x83, 0x01, 0x00, 0xb0, 0x63, 0xc0, 0x23, 0x91, + 0x42, 0x00, 0x80, 0x52, 0xfd, 0x7b, 0xc3, 0xa8, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x23, 0xf7, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf7, 0x63, 0x03, 0xa9, 0x17, 0x03, 0x00, 0xd0, 0xe3, 0x0a, 0x44, 0xf9, + 0x03, 0x07, 0x00, 0xb4, 0xf5, 0x5b, 0x02, 0xa9, 0x16, 0x03, 0x00, 0xd0, + 0xd6, 0x22, 0x18, 0x91, 0xf5, 0x03, 0x02, 0x2a, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x03, 0x00, 0xaa, 0xf3, 0x03, 0x01, 0xaa, 0xe0, 0x03, 0x16, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0x8d, 0xd3, 0xff, 0x97, 0x60, 0x04, 0x00, 0x35, + 0xf8, 0x0a, 0x44, 0xf9, 0x82, 0x06, 0x40, 0x29, 0x14, 0x07, 0x40, 0x39, + 0x80, 0x1e, 0x7b, 0xd3, 0x94, 0x1e, 0x7b, 0xd3, 0x00, 0x03, 0x00, 0x8b, + 0x18, 0x03, 0x14, 0x8b, 0x02, 0x28, 0x01, 0xb9, 0x01, 0x2c, 0x01, 0xb9, + 0x61, 0x02, 0x40, 0x79, 0x01, 0x68, 0x02, 0x79, 0x61, 0x06, 0x40, 0x79, + 0x01, 0x6c, 0x02, 0x79, 0x61, 0x0a, 0x40, 0x79, 0x15, 0x30, 0x01, 0xb9, + 0x01, 0x70, 0x02, 0x79, 0x17, 0xbe, 0xff, 0x97, 0x00, 0xa3, 0x00, 0xf9, + 0xe3, 0x0a, 0x44, 0xf9, 0x01, 0x55, 0x80, 0xd2, 0xe0, 0x03, 0x03, 0xaa, + 0x62, 0x04, 0x40, 0x39, 0x42, 0x04, 0x00, 0x11, 0x42, 0x1c, 0x00, 0x12, + 0x5f, 0x2c, 0x00, 0x71, 0x42, 0x90, 0x9f, 0x1a, 0x62, 0x04, 0x00, 0x39, + 0x1f, 0x6b, 0x00, 0x94, 0xe0, 0x03, 0x16, 0xaa, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0x5e, 0xd3, 0xff, 0x17, 0xf3, 0x53, 0x41, 0xa9, 0xe2, 0x03, 0x00, 0x2a, + 0xf5, 0x5b, 0x42, 0xa9, 0x83, 0x01, 0x00, 0xb0, 0x63, 0x20, 0x24, 0x91, + 0x41, 0x00, 0x80, 0x52, 0xf7, 0x63, 0x43, 0xa9, 0x00, 0x02, 0x80, 0x52, + 0xfd, 0x7b, 0xc4, 0xa8, 0xe4, 0xf6, 0xff, 0x17, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbf, 0xa9, + 0x3f, 0x00, 0x00, 0xf1, 0x44, 0x18, 0x40, 0xfa, 0xfd, 0x03, 0x00, 0x91, + 0xe5, 0x03, 0x01, 0xaa, 0xe4, 0x03, 0x00, 0xaa, 0x04, 0x18, 0x40, 0xfa, + 0x60, 0x04, 0x00, 0x54, 0x81, 0x00, 0x40, 0xb9, 0x80, 0x20, 0x80, 0x52, + 0x3f, 0x08, 0x00, 0x71, 0xa8, 0x03, 0x00, 0x54, 0x21, 0x7c, 0x7c, 0xd3, + 0x82, 0x01, 0x00, 0xb0, 0x42, 0x60, 0x31, 0x91, 0x83, 0x04, 0x40, 0xb9, + 0x44, 0x00, 0x01, 0x8b, 0x60, 0x20, 0x80, 0x52, 0x41, 0x68, 0x61, 0xf8, + 0x3f, 0x40, 0x23, 0xeb, 0x89, 0x02, 0x00, 0x54, 0x01, 0x03, 0x80, 0x52, + 0x80, 0x04, 0x40, 0xf9, 0x63, 0x7c, 0xa1, 0x9b, 0x01, 0x00, 0x03, 0x8b, + 0x22, 0x40, 0x40, 0x39, 0x42, 0x03, 0x00, 0x35, 0x02, 0x68, 0x63, 0xf8, + 0xa2, 0x00, 0x00, 0xf9, 0x02, 0x04, 0x00, 0xb4, 0x24, 0x28, 0x40, 0x79, + 0x20, 0x20, 0x80, 0x52, 0x43, 0x04, 0x40, 0x79, 0x9f, 0x00, 0x03, 0x6b, + 0xc0, 0x00, 0x00, 0x54, 0x42, 0x00, 0x40, 0xb9, 0x23, 0x00, 0x80, 0x52, + 0x00, 0x00, 0x80, 0x52, 0x23, 0x40, 0x00, 0x39, 0x22, 0x20, 0x01, 0xb8, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe6, 0x03, 0x02, 0xaa, + 0x21, 0x00, 0x80, 0x52, 0x42, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x83, 0x01, 0x00, 0xb0, 0x63, 0x60, 0x25, 0x91, 0xb0, 0xf6, 0xff, 0x97, + 0x40, 0x00, 0x80, 0x52, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x24, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0xe1, 0x03, 0x04, 0x2a, + 0x83, 0x01, 0x00, 0xb0, 0x42, 0x20, 0x80, 0x52, 0x63, 0xa0, 0x24, 0x91, + 0xa6, 0xf6, 0xff, 0x97, 0x40, 0x20, 0x80, 0x52, 0xec, 0xff, 0xff, 0x17, + 0x20, 0x21, 0x80, 0x52, 0xea, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0x00, 0x01, 0x00, 0x35, 0x13, 0x03, 0x00, 0xd0, 0x60, 0x22, 0x20, 0x91, + 0xfa, 0xd0, 0xff, 0x97, 0x60, 0x02, 0x00, 0x34, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x00, 0x2a, + 0x38, 0xc6, 0xff, 0x97, 0x01, 0x03, 0x00, 0xd0, 0x20, 0x0c, 0x04, 0xf9, + 0xa0, 0xfe, 0xff, 0xb4, 0x40, 0xc9, 0xff, 0x97, 0x13, 0x03, 0x00, 0xd0, + 0x61, 0xc2, 0x1f, 0x91, 0x20, 0x04, 0x00, 0xf9, 0x38, 0xc9, 0xff, 0x97, + 0x60, 0xfa, 0x03, 0xf9, 0x13, 0x03, 0x00, 0xd0, 0x60, 0x22, 0x20, 0x91, + 0xe8, 0xd0, 0xff, 0x97, 0xe0, 0xfd, 0xff, 0x35, 0x60, 0x06, 0x44, 0xf9, + 0xa1, 0x12, 0x80, 0x52, 0x18, 0xd1, 0xff, 0x97, 0x60, 0xfd, 0xff, 0x35, + 0xee, 0x54, 0x00, 0x94, 0x20, 0xfd, 0xff, 0x35, 0x02, 0x00, 0x00, 0xb0, + 0x81, 0x01, 0x00, 0xb0, 0x00, 0x03, 0x00, 0xd0, 0x42, 0x80, 0x25, 0x91, + 0x21, 0x80, 0x26, 0x91, 0x00, 0xa0, 0x19, 0x91, 0x26, 0x00, 0x80, 0x52, + 0x85, 0x00, 0x80, 0x52, 0x04, 0x00, 0x82, 0x52, 0x03, 0x00, 0x80, 0xd2, + 0xb2, 0xd1, 0xff, 0x97, 0xa0, 0xfb, 0xff, 0x35, 0xe0, 0x2f, 0x00, 0xb9, + 0xf7, 0xfe, 0xff, 0x97, 0xe0, 0x2f, 0x40, 0xb9, 0xd9, 0xff, 0xff, 0x17, + 0xfd, 0x7b, 0xba, 0xa9, 0x5f, 0x08, 0x00, 0x71, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x00, 0xaa, + 0xe2, 0x0f, 0x0a, 0x29, 0x48, 0x05, 0x00, 0x54, 0xf3, 0x03, 0x02, 0x2a, + 0x80, 0x01, 0x00, 0xb0, 0x00, 0x60, 0x31, 0x91, 0xf4, 0x03, 0x03, 0x2a, + 0x62, 0x7e, 0x7c, 0xd3, 0x03, 0x00, 0x02, 0x8b, 0x00, 0x68, 0x62, 0xf8, + 0x1f, 0x40, 0x34, 0xeb, 0x49, 0x06, 0x00, 0x54, 0x00, 0x03, 0x80, 0x52, + 0xf7, 0x63, 0x03, 0xa9, 0x38, 0x18, 0x00, 0x91, 0x62, 0x04, 0x40, 0xf9, + 0x80, 0x7e, 0xa0, 0x9b, 0x57, 0x00, 0x00, 0x8b, 0xe3, 0x06, 0x40, 0xf9, + 0x7f, 0x00, 0x18, 0xeb, 0x83, 0x05, 0x00, 0x54, 0x56, 0x68, 0x60, 0xf8, + 0xd6, 0x05, 0x00, 0xb4, 0xe2, 0x26, 0x40, 0x79, 0x84, 0x3c, 0x00, 0x12, + 0xe0, 0x2a, 0x40, 0x79, 0xc2, 0x02, 0x00, 0x79, 0xc0, 0x06, 0x00, 0x79, + 0xc4, 0x0a, 0x00, 0x79, 0xb5, 0x00, 0x00, 0xb4, 0xe2, 0x03, 0x01, 0xaa, + 0xc0, 0x1a, 0x00, 0x91, 0xe1, 0x03, 0x15, 0xaa, 0x9a, 0xb6, 0x00, 0x94, + 0xe1, 0x03, 0x18, 0xaa, 0xe0, 0x03, 0x16, 0xaa, 0x72, 0x6a, 0x00, 0x94, + 0xff, 0x42, 0x00, 0x39, 0xe0, 0x03, 0x13, 0x2a, 0xe1, 0x03, 0x14, 0x2a, + 0x13, 0x00, 0x80, 0x52, 0xea, 0x54, 0x00, 0x94, 0xf7, 0x63, 0x43, 0xa9, + 0x07, 0x00, 0x00, 0x14, 0x80, 0x20, 0x80, 0x52, 0xf3, 0x03, 0x00, 0x2a, + 0xf6, 0x23, 0x01, 0x91, 0xe1, 0x9f, 0x00, 0x32, 0xe1, 0x4b, 0x00, 0xb9, + 0xe0, 0x9b, 0x00, 0x79, 0xe2, 0x03, 0x13, 0x2a, 0x55, 0x00, 0x00, 0xb4, + 0xa2, 0x02, 0x40, 0xb9, 0xe1, 0x03, 0x16, 0xaa, 0xe0, 0x43, 0x01, 0x91, + 0x14, 0xff, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x20, 0x80, 0x52, 0xf3, 0x03, 0x00, 0x2a, 0xef, 0xff, 0xff, 0x17, + 0xa0, 0x20, 0x80, 0x52, 0xf3, 0x03, 0x00, 0x2a, 0xf7, 0x63, 0x43, 0xa9, + 0xeb, 0xff, 0xff, 0x17, 0x40, 0x00, 0x80, 0x52, 0xf3, 0x03, 0x00, 0x2a, + 0xf7, 0x63, 0x43, 0xa9, 0xe7, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0xe4, 0x03, 0x00, 0xaa, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0x40, 0x03, 0x00, 0xb4, 0xe0, 0x03, 0x01, 0xaa, 0x81, 0x00, 0x40, 0xb9, + 0xf3, 0x20, 0x80, 0x52, 0x3f, 0x04, 0x00, 0x71, 0xa0, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x63, 0x1c, 0x00, 0x12, 0xe1, 0x03, 0x02, 0xaa, + 0x7f, 0x00, 0x00, 0x71, 0x02, 0x00, 0x80, 0x52, 0xe4, 0x17, 0x9f, 0x1a, + 0x03, 0x00, 0x80, 0x52, 0x84, 0x34, 0x1e, 0x53, 0x9b, 0xff, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0x60, 0xfe, 0xff, 0x35, 0x80, 0x07, 0x80, 0x52, + 0x87, 0xf5, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x53, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, + 0x1f, 0x00, 0x00, 0xf1, 0x24, 0x18, 0x40, 0xfa, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x53, 0x00, 0x80, 0x52, 0xff, 0x27, 0x00, 0xf9, + 0xe0, 0x03, 0x00, 0x54, 0x04, 0x00, 0x40, 0x79, 0xf5, 0x5b, 0x02, 0xa9, + 0xf6, 0x03, 0x02, 0x2a, 0xf5, 0x03, 0x03, 0x2a, 0xf7, 0x1b, 0x00, 0xf9, + 0x9f, 0x58, 0x01, 0x71, 0x17, 0x03, 0x00, 0xb0, 0xf4, 0x0e, 0x44, 0xf9, + 0x49, 0x03, 0x00, 0x54, 0x85, 0x00, 0x80, 0xd2, 0xb3, 0x00, 0x80, 0x52, + 0x93, 0x02, 0x00, 0xb9, 0x21, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x05, 0x2a, + 0x83, 0x01, 0x00, 0x90, 0xc2, 0x20, 0x80, 0x52, 0x63, 0x20, 0x29, 0x91, + 0xe5, 0x27, 0x00, 0xf9, 0xe2, 0xf5, 0xff, 0x97, 0xf4, 0x0e, 0x44, 0xf9, + 0xe4, 0x03, 0x13, 0x2a, 0xe1, 0x27, 0x40, 0xf9, 0xe3, 0x03, 0x15, 0x2a, + 0xe2, 0x03, 0x16, 0x2a, 0xe0, 0x03, 0x14, 0xaa, 0x6b, 0xff, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x05, 0x00, 0x34, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x80, 0x01, 0x00, 0x90, + 0x00, 0x90, 0x29, 0x91, 0xf3, 0x03, 0x01, 0xaa, 0x00, 0x58, 0x64, 0x78, + 0x61, 0x00, 0x00, 0x10, 0x20, 0xa8, 0x20, 0x8b, 0x00, 0x00, 0x1f, 0xd6, + 0xe0, 0x03, 0x04, 0x2a, 0xe2, 0x03, 0x14, 0xaa, 0xe1, 0x03, 0x13, 0xaa, + 0xe4, 0x23, 0x01, 0x91, 0x03, 0x80, 0x80, 0x52, 0xde, 0x09, 0x00, 0x94, + 0xa0, 0x22, 0x00, 0x35, 0xf4, 0x0e, 0x44, 0xf9, 0x04, 0x00, 0x80, 0x52, + 0xe1, 0x27, 0x40, 0xf9, 0xe3, 0xff, 0xff, 0x17, 0x9f, 0x02, 0x00, 0xb9, + 0x80, 0x00, 0x80, 0xd2, 0x04, 0x00, 0x80, 0x52, 0xe1, 0x03, 0x00, 0xaa, + 0xe0, 0x27, 0x00, 0xf9, 0xdd, 0xff, 0xff, 0x17, 0x60, 0x02, 0x40, 0xb9, + 0x09, 0xfe, 0xff, 0x97, 0x80, 0x02, 0x00, 0xb9, 0x1f, 0x00, 0x00, 0x71, + 0x80, 0x00, 0x80, 0xd2, 0xf4, 0x0e, 0x44, 0xf9, 0xe4, 0x07, 0x9f, 0x1a, + 0xe1, 0x03, 0x00, 0xaa, 0xe3, 0x03, 0x15, 0x2a, 0x84, 0x74, 0x1e, 0x53, + 0xe2, 0x03, 0x16, 0x2a, 0xe0, 0x27, 0x00, 0xf9, 0xe0, 0x03, 0x14, 0xaa, + 0x3d, 0xff, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0x60, 0xfa, 0xff, 0x35, + 0x40, 0x07, 0x80, 0x52, 0x29, 0xf5, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xca, 0xc8, 0xff, 0x97, + 0x61, 0x02, 0x40, 0x39, 0x3f, 0x04, 0x00, 0x71, 0xa0, 0x1c, 0x00, 0x54, + 0x41, 0x00, 0x00, 0x35, 0x1f, 0x5c, 0x00, 0x39, 0x01, 0x03, 0x80, 0xd2, + 0xc6, 0x69, 0x00, 0x94, 0x9f, 0x02, 0x00, 0xb9, 0x80, 0x00, 0x80, 0xd2, + 0x04, 0x00, 0x80, 0x52, 0xf4, 0x0e, 0x44, 0xf9, 0xe1, 0x03, 0x00, 0xaa, + 0xe0, 0x27, 0x00, 0xf9, 0xb6, 0xff, 0xff, 0x17, 0x53, 0xbc, 0xff, 0x97, + 0xda, 0xff, 0xff, 0x17, 0x00, 0x01, 0x80, 0xd2, 0x9f, 0x0a, 0x00, 0x79, + 0xe0, 0x27, 0x00, 0xf9, 0xea, 0xfd, 0xff, 0x97, 0xa0, 0x19, 0x00, 0x34, + 0x60, 0x1a, 0x40, 0x79, 0x1f, 0x00, 0x04, 0x71, 0x89, 0x1d, 0x00, 0x54, + 0x40, 0x00, 0x84, 0x52, 0x04, 0x00, 0x80, 0x52, 0xe1, 0x27, 0x40, 0xf9, + 0x80, 0x02, 0x00, 0xb9, 0xf4, 0x0e, 0x44, 0xf9, 0xa6, 0xff, 0xff, 0x17, + 0x60, 0x02, 0x40, 0xb9, 0x9a, 0xf3, 0xff, 0x97, 0x80, 0x02, 0x00, 0xb9, + 0x04, 0x00, 0x80, 0x52, 0x60, 0x01, 0x00, 0x35, 0x80, 0x00, 0x80, 0xd2, + 0xe1, 0x03, 0x00, 0xaa, 0xf4, 0x0e, 0x44, 0xf9, 0xe0, 0x27, 0x00, 0xf9, + 0x9c, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x14, 0xaa, 0x98, 0xf3, 0xff, 0x97, + 0x80, 0x06, 0x00, 0xb9, 0x04, 0x00, 0x80, 0x52, 0xe0, 0xfe, 0xff, 0x34, + 0xe2, 0x03, 0x00, 0x2a, 0x83, 0x01, 0x00, 0x90, 0x63, 0xc0, 0x27, 0x91, + 0x21, 0x00, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0x6f, 0xf5, 0xff, 0x97, + 0x84, 0x00, 0x80, 0x52, 0xef, 0xff, 0xff, 0x17, 0x60, 0x02, 0x40, 0x39, + 0x81, 0x16, 0x00, 0x91, 0x80, 0x12, 0x00, 0x39, 0x4d, 0xcd, 0xff, 0x97, + 0x04, 0x00, 0x80, 0x52, 0xe0, 0x15, 0x00, 0x35, 0xc0, 0x00, 0x80, 0xd2, + 0xe1, 0x03, 0x00, 0xaa, 0xf4, 0x0e, 0x44, 0xf9, 0xe0, 0x27, 0x00, 0xf9, + 0x84, 0xff, 0xff, 0x17, 0x60, 0x02, 0x40, 0x39, 0x61, 0x06, 0x40, 0x39, + 0x7f, 0xcd, 0xff, 0x97, 0xa7, 0xff, 0xff, 0x17, 0x61, 0x0a, 0x40, 0x79, + 0x83, 0x12, 0x00, 0x91, 0x62, 0x0e, 0x40, 0x79, 0x60, 0x02, 0x40, 0xb9, + 0x2d, 0xbf, 0xff, 0x97, 0x1f, 0x00, 0x00, 0x71, 0x61, 0x0e, 0x40, 0x79, + 0xe4, 0x07, 0x9f, 0x1a, 0x80, 0x02, 0x00, 0xb9, 0x21, 0x10, 0x00, 0x91, + 0x84, 0x74, 0x1e, 0x53, 0xf4, 0x0e, 0x44, 0xf9, 0xe1, 0x27, 0x00, 0xf9, + 0x72, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x13, 0xaa, 0x46, 0xc9, 0xff, 0x97, + 0x80, 0x02, 0x00, 0xb9, 0xb3, 0xff, 0xff, 0x17, 0x62, 0x02, 0x40, 0xb9, + 0x00, 0x01, 0x80, 0xd2, 0x9f, 0x0a, 0x00, 0x29, 0xe1, 0x03, 0x00, 0xaa, + 0xe0, 0x27, 0x00, 0xf9, 0x68, 0xff, 0xff, 0x17, 0x64, 0x02, 0x40, 0xb9, + 0x40, 0x00, 0x80, 0x52, 0x83, 0x01, 0x00, 0x90, 0x02, 0x00, 0x80, 0x52, + 0x63, 0xc0, 0x26, 0x91, 0x21, 0x00, 0x80, 0x52, 0x3f, 0xf5, 0xff, 0x97, + 0x60, 0x02, 0x40, 0xb9, 0x21, 0xcc, 0xff, 0x97, 0x20, 0x0f, 0x00, 0x35, + 0x60, 0x02, 0x40, 0xb9, 0x9f, 0x02, 0x00, 0x29, 0x00, 0x01, 0x80, 0xd2, + 0x04, 0x00, 0x80, 0x52, 0xf4, 0x0e, 0x44, 0xf9, 0xe1, 0x03, 0x00, 0xaa, + 0xe0, 0x27, 0x00, 0xf9, 0x56, 0xff, 0xff, 0x17, 0x60, 0x02, 0x40, 0xb9, + 0x1a, 0xbf, 0xff, 0x97, 0x79, 0xff, 0xff, 0x17, 0x61, 0x0a, 0x40, 0x79, + 0x63, 0x22, 0x00, 0x91, 0x62, 0x0e, 0x40, 0x79, 0x60, 0x02, 0x40, 0xb9, + 0x20, 0xbf, 0xff, 0x97, 0x73, 0xff, 0xff, 0x17, 0x1a, 0xc1, 0xff, 0x97, + 0x71, 0xff, 0xff, 0x17, 0x60, 0x12, 0x40, 0x39, 0x61, 0x02, 0x40, 0xb9, + 0x56, 0xba, 0xff, 0x97, 0x6d, 0xff, 0xff, 0x17, 0x80, 0x12, 0x00, 0x91, + 0x37, 0xd3, 0xff, 0x97, 0x82, 0x02, 0x80, 0xd2, 0x1f, 0x00, 0x00, 0x71, + 0x80, 0x02, 0x00, 0xb9, 0xe4, 0x07, 0x9f, 0x1a, 0xe1, 0x03, 0x02, 0xaa, + 0xf4, 0x0e, 0x44, 0xf9, 0x84, 0x74, 0x1e, 0x53, 0xe2, 0x27, 0x00, 0xf9, + 0x3c, 0xff, 0xff, 0x17, 0x60, 0x02, 0x40, 0xb9, 0x3c, 0xd3, 0xff, 0x97, + 0x5f, 0xff, 0xff, 0x17, 0x80, 0x12, 0x00, 0x91, 0x41, 0xd3, 0xff, 0x97, + 0x02, 0x01, 0x80, 0xd2, 0xf2, 0xff, 0xff, 0x17, 0x01, 0x00, 0x90, 0x52, + 0x20, 0x10, 0x00, 0xb0, 0x00, 0x60, 0x02, 0x91, 0x80, 0x06, 0x00, 0xf9, + 0x81, 0x12, 0x00, 0xb9, 0x01, 0x00, 0x90, 0xd2, 0x46, 0x69, 0x00, 0x94, + 0x01, 0x03, 0x80, 0xd2, 0xe1, 0x27, 0x00, 0xf9, 0x04, 0x00, 0x80, 0x52, + 0x9f, 0x02, 0x00, 0xb9, 0xf4, 0x0e, 0x44, 0xf9, 0x28, 0xff, 0xff, 0x17, + 0x60, 0x06, 0x40, 0xa9, 0x64, 0xf4, 0xff, 0x97, 0x60, 0x06, 0x41, 0xa9, + 0x72, 0xf4, 0xff, 0x97, 0x9f, 0x02, 0x00, 0xb9, 0x67, 0xff, 0xff, 0x17, + 0x81, 0x22, 0x00, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0x65, 0xf4, 0xff, 0x97, + 0x81, 0x62, 0x00, 0x91, 0x80, 0x42, 0x00, 0x91, 0x72, 0xf4, 0xff, 0x97, + 0x9f, 0x22, 0x00, 0xb9, 0x00, 0x05, 0x80, 0xd2, 0x04, 0x00, 0x80, 0x52, + 0xf4, 0x0e, 0x44, 0xf9, 0xe1, 0x03, 0x00, 0xaa, 0xe0, 0x27, 0x00, 0xf9, + 0x15, 0xff, 0xff, 0x17, 0x9f, 0x02, 0x00, 0xb9, 0x81, 0xc9, 0xff, 0x97, + 0x04, 0x00, 0x80, 0x52, 0x20, 0xee, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, + 0x83, 0x01, 0x00, 0x90, 0x63, 0x40, 0x27, 0x91, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0xe9, 0xf4, 0xff, 0x97, 0x84, 0x00, 0x80, 0x52, + 0x69, 0xff, 0xff, 0x17, 0x60, 0x02, 0x40, 0xb9, 0xdd, 0xbb, 0xff, 0x97, + 0x2c, 0xff, 0xff, 0x17, 0x80, 0x12, 0x00, 0x91, 0xf2, 0xbb, 0xff, 0x97, + 0x02, 0x01, 0x80, 0xd2, 0xbf, 0xff, 0xff, 0x17, 0x60, 0x02, 0x40, 0x39, + 0x61, 0x06, 0x40, 0x39, 0x62, 0x06, 0x40, 0x79, 0x63, 0x0a, 0x40, 0x79, + 0xeb, 0xcb, 0xff, 0x97, 0x23, 0xff, 0xff, 0x17, 0x60, 0x02, 0x40, 0x39, + 0x83, 0x22, 0x00, 0x91, 0x61, 0x06, 0x40, 0x39, 0x82, 0x1a, 0x00, 0x91, + 0x2d, 0xcc, 0xff, 0x97, 0xc0, 0x05, 0x00, 0x35, 0x60, 0x02, 0x40, 0x39, + 0x04, 0x00, 0x80, 0x52, 0x80, 0x12, 0x00, 0x39, 0x60, 0x06, 0x40, 0x39, + 0x80, 0x16, 0x00, 0x39, 0x40, 0x01, 0x80, 0xd2, 0xe1, 0x03, 0x00, 0xaa, + 0xf4, 0x0e, 0x44, 0xf9, 0xe0, 0x27, 0x00, 0xf9, 0xec, 0xfe, 0xff, 0x17, + 0x60, 0x02, 0x40, 0x39, 0x61, 0x06, 0x40, 0x39, 0x73, 0xcc, 0xff, 0x97, + 0x1f, 0x00, 0x00, 0x71, 0xa0, 0x00, 0x80, 0xd2, 0x0f, 0xff, 0xff, 0x17, + 0x80, 0x00, 0x80, 0x52, 0x80, 0x02, 0x00, 0xb9, 0x88, 0xff, 0xff, 0x17, + 0x20, 0x00, 0x84, 0x52, 0x04, 0x00, 0x80, 0x52, 0xe1, 0x27, 0x40, 0xf9, + 0x80, 0x02, 0x00, 0xb9, 0xf4, 0x0e, 0x44, 0xf9, 0xdd, 0xfe, 0xff, 0x17, + 0x01, 0x5c, 0x00, 0x39, 0x1d, 0xff, 0xff, 0x17, 0x83, 0x01, 0x00, 0x90, + 0x63, 0xa0, 0x28, 0x91, 0x82, 0x00, 0x80, 0x52, 0x21, 0x00, 0x80, 0x52, + 0x80, 0x00, 0x80, 0x52, 0xb3, 0xf4, 0xff, 0x97, 0x84, 0x00, 0x80, 0x52, + 0x4b, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0x21, 0x00, 0x80, 0x52, + 0x83, 0x01, 0x00, 0x90, 0x63, 0x00, 0x27, 0x91, 0x80, 0x00, 0x80, 0x52, + 0xab, 0xf4, 0xff, 0x97, 0x84, 0x00, 0x80, 0x52, 0xf4, 0x0e, 0x44, 0xf9, + 0xe1, 0x27, 0x40, 0xf9, 0xc9, 0xfe, 0xff, 0x17, 0x83, 0x01, 0x00, 0x90, + 0x63, 0x20, 0x28, 0x91, 0x82, 0x00, 0x80, 0x52, 0x21, 0x00, 0x80, 0x52, + 0x80, 0x00, 0x80, 0x52, 0xa1, 0xf4, 0xff, 0x97, 0x84, 0x00, 0x80, 0x52, + 0xd1, 0xff, 0xff, 0x17, 0xe1, 0x03, 0x14, 0xaa, 0xe0, 0x03, 0x13, 0xaa, + 0xfc, 0xfc, 0xff, 0x97, 0x04, 0x00, 0x80, 0x52, 0xe1, 0x27, 0x40, 0xf9, + 0x80, 0x02, 0x00, 0xb9, 0xf4, 0x0e, 0x44, 0xf9, 0xb9, 0xfe, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xba, 0xa9, + 0x00, 0x03, 0x00, 0xb0, 0x02, 0x00, 0x80, 0x12, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x04, 0x44, 0xf9, 0xe1, 0x03, 0x01, 0x91, 0xff, 0x7f, 0x04, 0xa9, + 0xff, 0x7f, 0x05, 0xa9, 0x48, 0xcf, 0xff, 0x97, 0x80, 0x02, 0x00, 0x35, + 0xe4, 0x43, 0x40, 0xb9, 0x9f, 0x54, 0x02, 0x71, 0x61, 0x03, 0x00, 0x54, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x27, 0x40, 0xf9, 0xff, 0x1b, 0x00, 0xf9, + 0xb3, 0x08, 0x00, 0xb4, 0x64, 0x16, 0x40, 0x29, 0x80, 0x00, 0x05, 0x2a, + 0x80, 0x04, 0x00, 0x34, 0x82, 0x20, 0x80, 0x52, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x83, 0x01, 0x00, 0x90, 0x63, 0x20, 0x2e, 0x91, + 0x7b, 0xf4, 0xff, 0x97, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x1f, 0x18, 0x1c, 0x71, 0x20, 0x02, 0x00, 0x54, + 0xe2, 0x03, 0x00, 0x2a, 0x83, 0x01, 0x00, 0x90, 0x63, 0xa0, 0x30, 0x91, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x70, 0xf4, 0xff, 0x97, + 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x82, 0x20, 0x80, 0x52, + 0x21, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x83, 0x01, 0x00, 0x90, + 0x63, 0x80, 0x2f, 0x91, 0x68, 0xf4, 0xff, 0x97, 0xfd, 0x7b, 0xc6, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x41, 0x00, 0x80, 0x52, 0x02, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x01, 0x2a, 0x83, 0x01, 0x00, 0x90, 0x63, 0x20, 0x30, 0x91, + 0x60, 0xf4, 0xff, 0x97, 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf5, 0x13, 0x00, 0xf9, 0x14, 0x03, 0x00, 0xb0, 0x95, 0xc2, 0x1f, 0x91, + 0xff, 0x1f, 0x00, 0xf9, 0x80, 0xfa, 0x43, 0xf9, 0xa1, 0x06, 0x40, 0xf9, + 0x91, 0x68, 0x00, 0x94, 0xe2, 0x03, 0x15, 0xaa, 0xe1, 0xc3, 0x00, 0x91, + 0xe0, 0xe3, 0x00, 0x91, 0x73, 0xfd, 0xff, 0x97, 0x60, 0x03, 0x00, 0x35, + 0xe0, 0x1b, 0x40, 0xf9, 0x00, 0x00, 0x40, 0x79, 0x1f, 0xfc, 0x03, 0x71, + 0xc0, 0x03, 0x00, 0x54, 0x60, 0x07, 0x80, 0x52, 0xcc, 0xf3, 0xff, 0x97, + 0xe2, 0x0f, 0x47, 0x29, 0xe0, 0x1b, 0x40, 0xf9, 0x81, 0xfa, 0x43, 0xf9, + 0x21, 0x10, 0x00, 0x91, 0x4b, 0xfe, 0xff, 0x97, 0xc0, 0x06, 0x00, 0x35, + 0xe1, 0x1b, 0x40, 0xf9, 0xe0, 0x03, 0x13, 0xaa, 0xe7, 0xfc, 0xff, 0x97, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xd1, 0xff, 0xff, 0x17, + 0x83, 0x01, 0x00, 0x90, 0x63, 0x00, 0x2f, 0x91, 0x42, 0x00, 0x80, 0x52, + 0x01, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x3a, 0xf4, 0xff, 0x97, + 0xf3, 0x53, 0x41, 0xa9, 0xc9, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, + 0x83, 0x01, 0x00, 0x90, 0x63, 0xc0, 0x2d, 0x91, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x32, 0xf4, 0xff, 0x97, 0xec, 0xff, 0xff, 0x17, + 0xa0, 0x07, 0x80, 0x52, 0xaf, 0xf3, 0xff, 0x97, 0xe2, 0x1b, 0x40, 0xf9, + 0x35, 0x00, 0x80, 0x52, 0xe3, 0x47, 0x40, 0xb9, 0xe0, 0x43, 0x01, 0x91, + 0x42, 0x10, 0x00, 0x91, 0x01, 0x00, 0x80, 0x52, 0xf5, 0x0f, 0x0a, 0x29, + 0xe2, 0x2f, 0x00, 0xf9, 0xc6, 0xce, 0xff, 0x97, 0x00, 0xfc, 0xff, 0x34, + 0xe2, 0x03, 0x00, 0x2a, 0xe1, 0x03, 0x15, 0x2a, 0x00, 0x01, 0x80, 0x52, + 0x83, 0x01, 0x00, 0x90, 0x63, 0x60, 0x2c, 0x91, 0x1f, 0xf4, 0xff, 0x97, + 0xe2, 0x0f, 0x47, 0x29, 0xe4, 0x03, 0x15, 0x2a, 0x80, 0xfa, 0x43, 0xf9, + 0x01, 0x00, 0x80, 0xd2, 0x00, 0x10, 0x00, 0x91, 0xa9, 0xfd, 0xff, 0x97, + 0x60, 0xfa, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, 0xe1, 0x03, 0x15, 0x2a, + 0x83, 0x01, 0x00, 0x90, 0x63, 0xc0, 0x2c, 0x91, 0x00, 0x01, 0x80, 0x52, + 0x12, 0xf4, 0xff, 0x97, 0xcc, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, + 0x83, 0x01, 0x00, 0x90, 0x63, 0x40, 0x2d, 0x91, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0x0b, 0xf4, 0xff, 0x97, 0xc5, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbf, 0xa9, 0x83, 0x01, 0x00, 0x90, + 0x63, 0x20, 0x31, 0x91, 0x02, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0x41, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x01, 0x2a, 0x01, 0xf4, 0xff, 0x97, + 0xe1, 0xff, 0xff, 0xf0, 0x21, 0xc0, 0x2c, 0x91, 0x00, 0x00, 0x80, 0x52, + 0x69, 0x53, 0x00, 0x94, 0x00, 0x03, 0x00, 0xb0, 0x01, 0xc0, 0x1f, 0x91, + 0x00, 0xf8, 0x43, 0xf9, 0x21, 0x04, 0x40, 0xf9, 0x23, 0x68, 0x00, 0x94, + 0x63, 0xff, 0xff, 0x97, 0x62, 0xff, 0xff, 0x97, 0xfe, 0xff, 0xff, 0x17, + 0xe3, 0x03, 0x01, 0x2a, 0xe4, 0x03, 0x02, 0xaa, 0x81, 0x04, 0x80, 0x52, + 0xe2, 0x03, 0x00, 0x2a, 0x00, 0x03, 0x00, 0xb0, 0x00, 0x80, 0x17, 0x91, + 0x06, 0xbe, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x03, 0x01, 0x2a, + 0xe4, 0x03, 0x02, 0xaa, 0x81, 0x04, 0x80, 0x52, 0xe2, 0x03, 0x00, 0x2a, + 0x00, 0x03, 0x00, 0xb0, 0x00, 0x80, 0x17, 0x91, 0x16, 0xbe, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x1c, 0x00, 0x12, 0xf5, 0x13, 0x00, 0xf9, + 0x35, 0x1c, 0x00, 0x12, 0x4a, 0xc7, 0xff, 0x97, 0x9f, 0x1e, 0x00, 0x71, + 0x28, 0x02, 0x00, 0x54, 0xf3, 0x03, 0x00, 0xaa, 0x20, 0x00, 0x80, 0x52, + 0x14, 0x20, 0xd4, 0x1a, 0x75, 0x02, 0x00, 0x35, 0x60, 0x02, 0x40, 0xb9, + 0x15, 0x00, 0x80, 0x52, 0x14, 0x00, 0x34, 0x0a, 0x74, 0x02, 0x00, 0xb9, + 0xe0, 0x03, 0x13, 0xaa, 0x81, 0x00, 0x80, 0xd2, 0xfc, 0x67, 0x00, 0x94, + 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x35, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x41, 0x00, 0x80, 0x52, + 0xd8, 0x62, 0x00, 0x94, 0x61, 0x02, 0x40, 0xb9, 0xf5, 0x03, 0x00, 0x2a, + 0x34, 0x00, 0x14, 0x2a, 0x74, 0x02, 0x00, 0xb9, 0xec, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xff, 0x2b, 0x00, 0xb9, + 0xff, 0x7f, 0x03, 0xa9, 0x60, 0x00, 0x00, 0x36, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x01, 0x1c, 0x00, 0x12, 0xf3, 0x0b, 0x00, 0xf9, + 0x33, 0x7c, 0x01, 0x53, 0xe1, 0xa3, 0x00, 0x91, 0xe0, 0x03, 0x13, 0x2a, + 0xc8, 0x47, 0x00, 0x94, 0xe3, 0xa3, 0x40, 0x39, 0xe4, 0x06, 0x80, 0x52, + 0xe2, 0xab, 0x40, 0x39, 0xe0, 0xc3, 0x00, 0x91, 0x01, 0x00, 0x80, 0x52, + 0xe4, 0x4f, 0x06, 0x29, 0x62, 0x20, 0x02, 0x2a, 0x42, 0x7c, 0x40, 0x93, + 0xe2, 0x1f, 0x00, 0xf9, 0x42, 0xce, 0xff, 0x97, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x1c, 0x00, 0x12, 0x9f, 0x0e, 0x00, 0x71, + 0xf5, 0x5b, 0x02, 0xa9, 0xf6, 0x97, 0x9f, 0x1a, 0xf5, 0x03, 0x02, 0xaa, + 0xe0, 0x03, 0x16, 0x2a, 0xf7, 0x1b, 0x00, 0xf9, 0xf7, 0x03, 0x01, 0xaa, + 0x21, 0x1a, 0x00, 0x94, 0x60, 0x03, 0x00, 0x35, 0xe0, 0x03, 0x14, 0x2a, + 0x41, 0x00, 0x80, 0x52, 0x39, 0x1a, 0x00, 0x94, 0xc0, 0x01, 0x00, 0x35, + 0xe1, 0x03, 0x14, 0x2a, 0xe0, 0x03, 0x15, 0xaa, 0xc9, 0x1a, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0x40, 0x03, 0x00, 0x34, 0xe0, 0x03, 0x16, 0x2a, + 0x29, 0x1a, 0x00, 0x94, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x16, 0x2a, 0xb3, 0x80, 0x80, 0x52, + 0x20, 0x1a, 0x00, 0x94, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, 0xe4, 0x03, 0x14, 0x2a, + 0x83, 0x01, 0x00, 0x90, 0x81, 0x00, 0x80, 0x52, 0x63, 0x20, 0x32, 0x91, + 0x00, 0x02, 0x80, 0x52, 0x6f, 0xf3, 0xff, 0x97, 0xdf, 0xff, 0xff, 0x17, + 0xa1, 0x02, 0x40, 0xb9, 0xe2, 0x03, 0x17, 0xaa, 0xe0, 0x03, 0x14, 0x2a, + 0x03, 0x00, 0x80, 0x52, 0x89, 0x17, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0x20, 0xfc, 0xff, 0x35, 0xa1, 0x02, 0x40, 0xb9, 0xe2, 0xa2, 0x00, 0x91, + 0xe0, 0x03, 0x14, 0x2a, 0x23, 0x00, 0x80, 0x52, 0x82, 0x17, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0x40, 0xfb, 0xff, 0x35, 0xa1, 0x02, 0x40, 0xb9, + 0xe2, 0x42, 0x01, 0x91, 0x43, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x14, 0x2a, + 0x7b, 0x17, 0x00, 0x94, 0xe0, 0x03, 0x14, 0x2a, 0xdd, 0x1a, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0x20, 0xfa, 0xff, 0x35, 0xe0, 0x03, 0x16, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xf5, 0x19, 0x00, 0x14, 0xfd, 0x7b, 0xb9, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x24, 0x0c, 0x40, 0x79, 0x26, 0x10, 0x40, 0x79, + 0x25, 0xa0, 0x40, 0xb8, 0xf3, 0x53, 0x01, 0xa9, 0xf7, 0x1b, 0x00, 0xf9, + 0x17, 0x1c, 0x00, 0x12, 0xe0, 0xff, 0x83, 0x52, 0x9f, 0x00, 0x00, 0x6b, + 0x88, 0x03, 0x00, 0x54, 0xf3, 0x03, 0x01, 0xaa, 0x01, 0xe0, 0xbf, 0x12, + 0xbf, 0x00, 0x01, 0x6b, 0x08, 0x03, 0x00, 0x54, 0xdf, 0x00, 0x00, 0x6b, + 0xc8, 0x02, 0x00, 0x54, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x02, 0x2a, + 0x60, 0x16, 0x40, 0x39, 0xa0, 0x00, 0x00, 0x34, 0xbf, 0x00, 0x00, 0x71, + 0x84, 0x18, 0x40, 0x7a, 0xc4, 0x18, 0x40, 0x7a, 0x40, 0x03, 0x00, 0x54, + 0x16, 0x03, 0x00, 0xb0, 0xd6, 0x82, 0x20, 0x91, 0xe0, 0x03, 0x16, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0xaf, 0xcf, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0x00, 0x04, 0x00, 0x34, 0xf5, 0x5b, 0x42, 0xa9, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc7, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x22, 0x00, 0x87, 0x52, 0x41, 0x00, 0x80, 0x52, + 0x80, 0x00, 0x80, 0x52, 0x34, 0x00, 0x87, 0x52, 0x83, 0x01, 0x00, 0x90, + 0x63, 0xe0, 0x32, 0x91, 0x24, 0xf3, 0xff, 0x97, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc7, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x22, 0x00, 0x87, 0x52, 0x41, 0x00, 0x80, 0x52, + 0x80, 0x00, 0x80, 0x52, 0x34, 0x00, 0x87, 0x52, 0x83, 0x01, 0x00, 0x90, + 0x63, 0x80, 0x34, 0x91, 0x18, 0xf3, 0xff, 0x97, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x02, 0x40, 0x39, + 0xe2, 0x23, 0x01, 0x91, 0x64, 0x0a, 0x40, 0x39, 0xe1, 0x03, 0x15, 0x2a, + 0x63, 0x0e, 0x40, 0x39, 0x1f, 0x00, 0x00, 0x71, 0xec, 0x07, 0x9f, 0x1a, + 0x60, 0x3a, 0x40, 0x39, 0x9f, 0x00, 0x00, 0x71, 0x67, 0x12, 0x40, 0x79, + 0xea, 0x07, 0x9f, 0x1a, 0x7f, 0x00, 0x00, 0x71, 0xe9, 0x07, 0x9f, 0x1a, + 0x6b, 0x06, 0x40, 0x39, 0x1f, 0x00, 0x00, 0x71, 0x68, 0x06, 0x40, 0xb9, + 0x66, 0xa2, 0x40, 0xb8, 0xe5, 0x07, 0x9f, 0x1a, 0x64, 0xf2, 0x40, 0xb8, + 0xe0, 0x03, 0x17, 0x2a, 0x63, 0x32, 0x41, 0xf8, 0xff, 0x7f, 0x05, 0xa9, + 0xff, 0x7f, 0x06, 0xa9, 0xec, 0x23, 0x01, 0x39, 0xeb, 0x27, 0x01, 0x39, + 0xea, 0x2b, 0x01, 0x39, 0xe9, 0x2f, 0x01, 0x39, 0xe8, 0x4f, 0x00, 0xb9, + 0xe7, 0xa3, 0x00, 0x79, 0xe6, 0x57, 0x00, 0xb9, 0xe5, 0x63, 0x01, 0x39, + 0xe4, 0x93, 0x05, 0xb8, 0xe3, 0xe3, 0x05, 0xf8, 0xfc, 0x3d, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0xa0, 0x00, 0x00, 0x34, 0xe0, 0x03, 0x16, 0xaa, + 0x5c, 0xcf, 0xff, 0x97, 0xf5, 0x5b, 0x42, 0xa9, 0xbb, 0xff, 0xff, 0x17, + 0x62, 0x0e, 0x40, 0x39, 0xe1, 0x03, 0x15, 0x2a, 0x20, 0x00, 0x80, 0x52, + 0x5f, 0x00, 0x00, 0x71, 0x00, 0x20, 0xd7, 0x1a, 0xe2, 0x07, 0x9f, 0x1a, + 0x53, 0x32, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x16, 0xaa, + 0x50, 0xcf, 0xff, 0x97, 0x9f, 0x02, 0x00, 0x71, 0x14, 0x00, 0x94, 0x1a, + 0xf5, 0x5b, 0x42, 0xa9, 0xad, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb9, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0x15, 0x03, 0x00, 0xb0, + 0xb5, 0x82, 0x20, 0x91, 0xf6, 0x03, 0x02, 0x2a, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x01, 0xaa, 0x01, 0x00, 0x80, 0x12, 0xf7, 0x1b, 0x00, 0xf9, + 0x17, 0x1c, 0x00, 0x12, 0xe0, 0x03, 0x15, 0xaa, 0x48, 0xcf, 0xff, 0x97, + 0x40, 0x01, 0x00, 0x34, 0xf4, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x15, 0xaa, + 0x38, 0xcf, 0xff, 0x97, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc7, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe1, 0x03, 0x16, 0x2a, 0xe2, 0x03, 0x01, 0x91, + 0xe0, 0x03, 0x17, 0x2a, 0xff, 0x7f, 0x04, 0xa9, 0xff, 0x7f, 0x05, 0xa9, + 0xff, 0x33, 0x00, 0xf9, 0xff, 0x6b, 0x00, 0xb9, 0x4a, 0x3f, 0x00, 0x94, + 0xe1, 0x03, 0x41, 0x39, 0xf4, 0x03, 0x00, 0x2a, 0xe9, 0x93, 0x40, 0x79, + 0xe0, 0x03, 0x15, 0xaa, 0xe4, 0x7b, 0x41, 0x39, 0xec, 0x0b, 0x41, 0x39, + 0xeb, 0x0f, 0x41, 0x39, 0xe7, 0x43, 0x41, 0x39, 0xe2, 0xa3, 0x41, 0x39, + 0xea, 0x47, 0x40, 0xb9, 0xe8, 0x4f, 0x40, 0xb9, 0xe6, 0x13, 0x45, 0xb8, + 0x61, 0x02, 0x00, 0x39, 0xe3, 0x07, 0x4c, 0x29, 0x6c, 0x06, 0x00, 0x39, + 0xe5, 0x63, 0x45, 0xf8, 0x6b, 0x0a, 0x00, 0x39, 0x6a, 0x32, 0x00, 0xb8, + 0x69, 0x72, 0x00, 0x78, 0x68, 0x92, 0x00, 0xb8, 0x67, 0x36, 0x00, 0x39, + 0x66, 0xe2, 0x00, 0xb8, 0x65, 0x22, 0x01, 0xf8, 0x64, 0x6a, 0x00, 0x39, + 0x63, 0xb2, 0x01, 0xb8, 0x62, 0x7e, 0x00, 0x39, 0x61, 0x26, 0x00, 0xb9, + 0x0e, 0xcf, 0xff, 0x97, 0x9f, 0x02, 0x00, 0x71, 0x14, 0x00, 0x94, 0x1a, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb9, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0x15, 0x03, 0x00, 0xb0, 0xb5, 0x82, 0x20, 0x91, + 0xf6, 0x03, 0x02, 0x2a, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x01, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0xf7, 0x1b, 0x00, 0xf9, 0x17, 0x1c, 0x00, 0x12, + 0xe0, 0x03, 0x15, 0xaa, 0x04, 0xcf, 0xff, 0x97, 0x40, 0x01, 0x00, 0x34, + 0xf4, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x15, 0xaa, 0xf4, 0xce, 0xff, 0x97, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe1, 0x03, 0x16, 0x2a, 0xe2, 0x23, 0x01, 0x91, 0xe0, 0x03, 0x17, 0x2a, + 0xff, 0xff, 0x04, 0xa9, 0xff, 0xff, 0x05, 0xa9, 0xff, 0x37, 0x00, 0xf9, + 0x1f, 0x40, 0x00, 0x94, 0xe1, 0x23, 0x41, 0x39, 0xf4, 0x03, 0x00, 0x2a, + 0xe6, 0xa3, 0x40, 0x79, 0xe0, 0x03, 0x15, 0xaa, 0xea, 0x27, 0x41, 0x39, + 0xe9, 0x2b, 0x41, 0x39, 0xe8, 0x2f, 0x41, 0x39, 0xe4, 0x63, 0x41, 0x39, + 0xe7, 0x4f, 0x40, 0xb9, 0xe5, 0x57, 0x40, 0xb9, 0xe3, 0x93, 0x45, 0xb8, + 0x61, 0x02, 0x00, 0x39, 0xe1, 0xb3, 0x41, 0x39, 0xe2, 0xe3, 0x45, 0xf8, + 0x6a, 0x06, 0x00, 0x39, 0x69, 0x0a, 0x00, 0x39, 0x68, 0x0e, 0x00, 0x39, + 0x67, 0x06, 0x00, 0xb9, 0x66, 0x12, 0x00, 0x79, 0x65, 0xa2, 0x00, 0xb8, + 0x64, 0x3a, 0x00, 0x39, 0x63, 0xf2, 0x00, 0xb8, 0x62, 0x32, 0x01, 0xf8, + 0x61, 0x6e, 0x00, 0x39, 0xce, 0xce, 0xff, 0x97, 0x9f, 0x02, 0x00, 0x71, + 0x14, 0x00, 0x94, 0x1a, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc7, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x54, 0x44, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8c, 0x40, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0x16, 0x1c, 0x00, 0x12, 0xdf, 0x0e, 0x00, 0x71, + 0xf5, 0x03, 0x01, 0xaa, 0xf7, 0x1b, 0x00, 0xf9, 0xf7, 0x97, 0x9f, 0x1a, + 0xf3, 0x53, 0x01, 0xa9, 0x13, 0x00, 0x80, 0xd2, 0xa1, 0x6a, 0x73, 0x38, + 0x7f, 0x0a, 0x00, 0x71, 0xc0, 0x12, 0x97, 0x1a, 0xe2, 0x03, 0x13, 0x2a, + 0x74, 0x06, 0x00, 0x11, 0x73, 0x06, 0x00, 0x91, 0x3c, 0x44, 0x00, 0x94, + 0x1f, 0x00, 0x00, 0x71, 0x82, 0x0a, 0x4a, 0x7a, 0xe9, 0xfe, 0xff, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0x16, 0x1c, 0x00, 0x12, + 0xdf, 0x0e, 0x00, 0x71, 0xf5, 0x03, 0x01, 0xaa, 0xf7, 0x1b, 0x00, 0xf9, + 0xf7, 0x97, 0x9f, 0x1a, 0xf3, 0x53, 0x01, 0xa9, 0x13, 0x00, 0x80, 0xd2, + 0xa1, 0x6a, 0x73, 0x38, 0x7f, 0x0a, 0x00, 0x71, 0xc0, 0x12, 0x97, 0x1a, + 0xe2, 0x03, 0x13, 0x2a, 0x74, 0x06, 0x00, 0x11, 0x73, 0x06, 0x00, 0x91, + 0x3c, 0x47, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, 0x82, 0x0a, 0x4a, 0x7a, + 0xe9, 0xfe, 0xff, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x03, 0x01, 0xaa, 0x13, 0x00, 0x80, 0xd2, 0xf5, 0x13, 0x00, 0xf9, + 0x15, 0x1c, 0x00, 0x12, 0x1f, 0x20, 0x03, 0xd5, 0x81, 0x6a, 0x73, 0x38, + 0xe2, 0x03, 0x13, 0x2a, 0xe0, 0x03, 0x15, 0x2a, 0x45, 0x40, 0x00, 0x94, + 0x62, 0x06, 0x00, 0x11, 0x73, 0x06, 0x00, 0x91, 0x5f, 0x24, 0x00, 0x71, + 0xe2, 0x87, 0x9f, 0x1a, 0x1f, 0x00, 0x00, 0x71, 0x42, 0x00, 0x9f, 0x1a, + 0xc2, 0xfe, 0xff, 0x35, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x88, 0x43, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x40, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x03, 0x00, 0x90, + 0x94, 0x82, 0x20, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x02, 0xaa, + 0xf6, 0x03, 0x03, 0xaa, 0xf7, 0x63, 0x03, 0xa9, 0xf8, 0x03, 0x01, 0x2a, + 0xf7, 0x03, 0x04, 0xaa, 0x01, 0x00, 0x80, 0x12, 0xf9, 0x23, 0x00, 0xf9, + 0x19, 0x1c, 0x00, 0x12, 0xe0, 0x03, 0x14, 0xaa, 0x61, 0xce, 0xff, 0x97, + 0x60, 0x01, 0x00, 0x34, 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x14, 0xaa, + 0x51, 0xce, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe4, 0x03, 0x17, 0xaa, + 0xe3, 0x03, 0x16, 0xaa, 0xe2, 0x03, 0x15, 0xaa, 0xe1, 0x03, 0x18, 0x2a, + 0xe0, 0x03, 0x19, 0x2a, 0x68, 0x41, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x14, 0xaa, 0x41, 0xce, 0xff, 0x97, 0x7f, 0x02, 0x00, 0x71, + 0x13, 0x00, 0x93, 0x1a, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x03, 0x00, 0x90, + 0x94, 0x82, 0x20, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x04, 0xaa, + 0xf6, 0x03, 0x05, 0xaa, 0xf7, 0x63, 0x03, 0xa9, 0xf7, 0x03, 0x03, 0xaa, + 0x18, 0x1c, 0x00, 0x12, 0xe0, 0x03, 0x14, 0xaa, 0xf9, 0x6b, 0x04, 0xa9, + 0x39, 0x1c, 0x00, 0x12, 0x5a, 0x1c, 0x00, 0x12, 0x01, 0x00, 0x80, 0x12, + 0x30, 0xce, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0x00, 0x01, 0x00, 0x34, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe5, 0x03, 0x16, 0xaa, 0xe4, 0x03, 0x15, 0xaa, + 0xe3, 0x03, 0x17, 0xaa, 0xe2, 0x03, 0x1a, 0x2a, 0xe1, 0x03, 0x19, 0x2a, + 0xe0, 0x03, 0x18, 0x2a, 0x38, 0x44, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x14, 0xaa, 0x11, 0xce, 0xff, 0x97, 0x7f, 0x02, 0x00, 0x71, + 0x73, 0x12, 0x80, 0x1a, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x03, 0x00, 0x90, + 0x94, 0x82, 0x20, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x01, 0x2a, + 0xf6, 0x03, 0x02, 0xaa, 0x01, 0x00, 0x80, 0x12, 0xf7, 0x1b, 0x00, 0xf9, + 0x17, 0x1c, 0x00, 0x12, 0xe0, 0x03, 0x14, 0xaa, 0x04, 0xce, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0x20, 0x01, 0x00, 0x34, 0xe0, 0x03, 0x14, 0xaa, + 0xf4, 0xcd, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x16, 0xaa, 0xe1, 0x03, 0x15, 0x2a, + 0xe0, 0x03, 0x17, 0x2a, 0x1a, 0x38, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0x60, 0xfe, 0xff, 0x35, 0xe1, 0x03, 0x15, 0x2a, 0x02, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x17, 0x2a, 0xf0, 0x37, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x14, 0xaa, 0xe1, 0xcd, 0xff, 0x97, 0x7f, 0x02, 0x00, 0x71, + 0x13, 0x00, 0x93, 0x1a, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbb, 0xa9, 0x24, 0x00, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0x16, 0x1c, 0x00, 0x12, + 0xdf, 0x0e, 0x00, 0x71, 0xf7, 0x63, 0x03, 0xa9, 0xf7, 0x97, 0x9f, 0x1a, + 0x00, 0x00, 0x80, 0xd2, 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x00, 0x80, 0x52, + 0xf9, 0x6b, 0x04, 0xa9, 0x23, 0x68, 0x60, 0x38, 0x82, 0x20, 0xc0, 0x1a, + 0x00, 0x04, 0x00, 0x91, 0x7f, 0x00, 0x00, 0x71, 0x82, 0x02, 0x02, 0x2a, + 0x54, 0x10, 0x94, 0x1a, 0x1f, 0x2c, 0x00, 0xf1, 0x21, 0xff, 0xff, 0x54, + 0x19, 0x03, 0x00, 0x90, 0x39, 0x83, 0x20, 0x91, 0xe0, 0x03, 0x19, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0xcc, 0xcd, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, + 0x00, 0x05, 0x00, 0x35, 0xda, 0x1e, 0x08, 0x53, 0x09, 0x00, 0x00, 0x14, + 0xc7, 0x37, 0x00, 0x94, 0x73, 0x06, 0x00, 0x11, 0xf8, 0x03, 0x00, 0x2a, + 0x73, 0x1e, 0x00, 0x12, 0x1f, 0x03, 0x00, 0x71, 0xb5, 0x06, 0x00, 0x11, + 0x62, 0x0a, 0x4a, 0x7a, 0x68, 0x02, 0x00, 0x54, 0xb3, 0x1e, 0x00, 0x12, + 0xe1, 0x03, 0x15, 0x2a, 0xe2, 0x03, 0x14, 0x2a, 0xe0, 0x03, 0x16, 0x2a, + 0x7f, 0x0a, 0x00, 0x71, 0x61, 0xfe, 0xff, 0x54, 0x94, 0x02, 0x1a, 0x2a, + 0xe1, 0x03, 0x13, 0x2a, 0xe2, 0x03, 0x14, 0x2a, 0xe0, 0x03, 0x17, 0x2a, + 0x73, 0x06, 0x00, 0x11, 0xb4, 0x37, 0x00, 0x94, 0xf8, 0x03, 0x00, 0x2a, + 0x73, 0x1e, 0x00, 0x12, 0x1f, 0x03, 0x00, 0x71, 0xb5, 0x06, 0x00, 0x11, + 0x62, 0x0a, 0x4a, 0x7a, 0xe9, 0xfd, 0xff, 0x54, 0xe0, 0x03, 0x19, 0xaa, + 0xa0, 0xcd, 0xff, 0x97, 0x1f, 0x03, 0x00, 0x71, 0x15, 0x00, 0x98, 0x1a, + 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x19, 0xaa, 0x95, 0xcd, 0xff, 0x97, + 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0x16, 0x1c, 0x00, 0x12, + 0xdf, 0x0e, 0x00, 0x71, 0xf7, 0x63, 0x03, 0xa9, 0x17, 0x03, 0x00, 0x90, + 0xf7, 0x82, 0x20, 0x91, 0xf8, 0x97, 0x9f, 0x1a, 0xe0, 0x03, 0x17, 0xaa, + 0xf3, 0x53, 0x01, 0xa9, 0xf9, 0x23, 0x00, 0xf9, 0xf9, 0x03, 0x01, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0x8a, 0xcd, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0x40, 0x01, 0x00, 0x34, 0x24, 0x00, 0x00, 0x14, 0xaa, 0x37, 0x00, 0x94, + 0x73, 0x06, 0x00, 0x11, 0xf5, 0x03, 0x00, 0x2a, 0x73, 0x1e, 0x00, 0x12, + 0xbf, 0x02, 0x00, 0x71, 0x94, 0x06, 0x00, 0x11, 0x62, 0x0a, 0x4a, 0x7a, + 0x28, 0x02, 0x00, 0x54, 0x93, 0x1e, 0x00, 0x12, 0xe1, 0x03, 0x14, 0x2a, + 0xe2, 0x03, 0x19, 0xaa, 0xe0, 0x03, 0x16, 0x2a, 0x7f, 0x0a, 0x00, 0x71, + 0x61, 0xfe, 0xff, 0x54, 0xe1, 0x03, 0x13, 0x2a, 0xe0, 0x03, 0x18, 0x2a, + 0x73, 0x06, 0x00, 0x11, 0x99, 0x37, 0x00, 0x94, 0xf5, 0x03, 0x00, 0x2a, + 0x73, 0x1e, 0x00, 0x12, 0xbf, 0x02, 0x00, 0x71, 0x94, 0x06, 0x00, 0x11, + 0x62, 0x0a, 0x4a, 0x7a, 0x29, 0xfe, 0xff, 0x54, 0xe0, 0x03, 0x17, 0xaa, + 0x61, 0xcd, 0xff, 0x97, 0xbf, 0x02, 0x00, 0x71, 0x14, 0x00, 0x95, 0x1a, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x17, 0xaa, 0x56, 0xcd, 0xff, 0x97, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbc, 0xa9, 0x24, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x00, 0x80, 0x52, 0xf5, 0x5b, 0x02, 0xa9, + 0x16, 0x1c, 0x00, 0x12, 0x00, 0x00, 0x80, 0xd2, 0xf7, 0x1b, 0x00, 0xf9, + 0x1f, 0x20, 0x03, 0xd5, 0x22, 0x68, 0x60, 0x38, 0x83, 0x20, 0xc0, 0x1a, + 0x00, 0x04, 0x00, 0x91, 0x83, 0x02, 0x03, 0x2a, 0x5f, 0x00, 0x00, 0x71, + 0x74, 0x10, 0x94, 0x1a, 0x1f, 0x28, 0x00, 0xf1, 0x21, 0xff, 0xff, 0x54, + 0x17, 0x03, 0x00, 0x90, 0xf7, 0x82, 0x20, 0x91, 0xe0, 0x03, 0x17, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0x42, 0xcd, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x00, 0x03, 0x00, 0x35, 0x1f, 0x20, 0x03, 0xd5, 0xe1, 0x03, 0x13, 0x2a, + 0xe2, 0x03, 0x14, 0x2a, 0xe0, 0x03, 0x16, 0x2a, 0x73, 0x06, 0x00, 0x11, + 0x86, 0x37, 0x00, 0x94, 0xf5, 0x03, 0x00, 0x2a, 0x61, 0x1e, 0x00, 0x12, + 0x3f, 0x24, 0x00, 0x71, 0xe0, 0x87, 0x9f, 0x1a, 0xbf, 0x02, 0x00, 0x71, + 0x00, 0x00, 0x9f, 0x1a, 0xa0, 0xfe, 0xff, 0x35, 0xe0, 0x03, 0x17, 0xaa, + 0x25, 0xcd, 0xff, 0x97, 0xbf, 0x02, 0x00, 0x71, 0x13, 0x00, 0x95, 0x1a, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0x03, 0x17, 0xaa, 0x1b, 0xcd, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbc, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf7, 0x1b, 0x00, 0xf9, 0x17, 0x03, 0x00, 0x90, + 0xf7, 0x82, 0x20, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf5, 0x5b, 0x02, 0xa9, + 0xf5, 0x03, 0x01, 0xaa, 0x16, 0x1c, 0x00, 0x12, 0x01, 0x00, 0x80, 0x12, + 0xe0, 0x03, 0x17, 0xaa, 0x15, 0xcd, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0xe0, 0x02, 0x00, 0x35, 0xe1, 0x03, 0x13, 0x2a, 0xe2, 0x03, 0x15, 0xaa, + 0xe0, 0x03, 0x16, 0x2a, 0x73, 0x06, 0x00, 0x11, 0x6a, 0x37, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0x61, 0x1e, 0x00, 0x12, 0x3f, 0x24, 0x00, 0x71, + 0xe0, 0x87, 0x9f, 0x1a, 0x9f, 0x02, 0x00, 0x71, 0x00, 0x00, 0x9f, 0x1a, + 0xa0, 0xfe, 0xff, 0x35, 0xe0, 0x03, 0x17, 0xaa, 0xf9, 0xcc, 0xff, 0x97, + 0x9f, 0x02, 0x00, 0x71, 0x13, 0x00, 0x94, 0x1a, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x17, 0xaa, + 0xef, 0xcc, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbc, 0xa9, 0x3f, 0x1c, 0x00, 0x72, + 0x01, 0x00, 0x80, 0x12, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x03, 0x03, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, 0x16, 0x03, 0x00, 0x90, + 0xd6, 0x82, 0x20, 0x91, 0xf7, 0x63, 0x03, 0xa9, 0x15, 0x1c, 0x00, 0x12, + 0x57, 0x1c, 0x00, 0x12, 0xe0, 0x03, 0x16, 0xaa, 0x80, 0x02, 0x00, 0x54, + 0x57, 0x08, 0x00, 0x34, 0xe5, 0xcc, 0xff, 0x97, 0xf8, 0x00, 0x80, 0x52, + 0xf3, 0x03, 0x00, 0x2a, 0x20, 0x05, 0x00, 0x35, 0xe2, 0x03, 0x14, 0xaa, + 0xe0, 0x03, 0x15, 0x2a, 0x01, 0x00, 0x80, 0x52, 0x02, 0x37, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0x00, 0x03, 0x00, 0x35, 0xe2, 0x03, 0x18, 0x2a, + 0xe0, 0x03, 0x15, 0x2a, 0x01, 0x00, 0x80, 0x52, 0xd8, 0x36, 0x00, 0x94, + 0x1f, 0x00, 0x00, 0x71, 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x17, 0x9f, 0x1a, + 0x07, 0x00, 0x00, 0x14, 0xf7, 0x02, 0x00, 0x34, 0xd2, 0xcc, 0xff, 0x97, + 0x1f, 0x00, 0x00, 0x71, 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x17, 0x9f, 0x1a, + 0xd8, 0x00, 0x80, 0x52, 0xff, 0x02, 0x00, 0x71, 0x04, 0x18, 0x40, 0x7a, + 0x40, 0x02, 0x00, 0x54, 0xe2, 0x03, 0x14, 0xaa, 0xe0, 0x03, 0x15, 0x2a, + 0x21, 0x00, 0x80, 0x52, 0xeb, 0x36, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0x80, 0x05, 0x00, 0x34, 0xe0, 0x03, 0x16, 0xaa, 0xb7, 0xcc, 0xff, 0x97, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xbc, 0xcc, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0x98, 0x00, 0x80, 0x52, + 0xb3, 0xfe, 0xff, 0x35, 0xbf, 0x0e, 0x00, 0x71, 0xe2, 0x03, 0x14, 0xaa, + 0xe0, 0x97, 0x9f, 0x1a, 0x41, 0x00, 0x80, 0x52, 0xd8, 0x36, 0x00, 0x94, + 0xe2, 0x03, 0x18, 0x2a, 0x41, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x15, 0x2a, + 0xb0, 0x36, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x16, 0xaa, + 0xa1, 0xcc, 0xff, 0x97, 0x7f, 0x02, 0x00, 0x71, 0x13, 0x00, 0x93, 0x1a, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xa4, 0xcc, 0xff, 0x97, 0xb8, 0x00, 0x80, 0x52, 0xf3, 0x03, 0x00, 0x2a, + 0xa0, 0xfb, 0xff, 0x35, 0xe2, 0x03, 0x14, 0xaa, 0xe0, 0x03, 0x15, 0x2a, + 0x01, 0x00, 0x80, 0x52, 0xc1, 0x36, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0xe0, 0xfa, 0xff, 0x35, 0xbf, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x18, 0x2a, + 0xe0, 0x03, 0x15, 0x2a, 0x21, 0x00, 0x80, 0x52, 0x96, 0x36, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0xdb, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x03, 0x00, 0x90, + 0x94, 0x82, 0x20, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x01, 0x2a, + 0x16, 0x1c, 0x00, 0x12, 0x01, 0x00, 0x80, 0x12, 0xe0, 0x03, 0x14, 0xaa, + 0x86, 0xcc, 0xff, 0x97, 0x20, 0x01, 0x00, 0x34, 0xf3, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x14, 0xaa, 0x76, 0xcc, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe1, 0x03, 0x15, 0x2a, 0xe0, 0x03, 0x16, 0x2a, + 0xea, 0x36, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x14, 0xaa, + 0x6b, 0xcc, 0xff, 0x97, 0x7f, 0x02, 0x00, 0x71, 0x13, 0x00, 0x93, 0x1a, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x03, 0x00, 0x90, + 0x94, 0x82, 0x20, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0x15, 0x1c, 0x00, 0x12, + 0x56, 0x1c, 0x00, 0x12, 0xe0, 0x03, 0x14, 0xaa, 0xf7, 0x1b, 0x00, 0xf9, + 0x37, 0x1c, 0x00, 0x12, 0x01, 0x00, 0x80, 0x12, 0x60, 0xcc, 0xff, 0x97, + 0x1f, 0x00, 0x00, 0x71, 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x17, 0x9f, 0x1a, + 0x1f, 0x00, 0x00, 0x71, 0xe4, 0x1a, 0x40, 0x7a, 0x21, 0x04, 0x00, 0x54, + 0xdf, 0x02, 0x00, 0x71, 0x04, 0x18, 0x40, 0x7a, 0x21, 0x03, 0x00, 0x54, + 0x33, 0x01, 0x00, 0x34, 0xe0, 0x03, 0x14, 0xaa, 0x48, 0xcc, 0xff, 0x97, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xbf, 0x0e, 0x00, 0x71, 0x41, 0x00, 0x80, 0x52, 0xe0, 0x97, 0x9f, 0x1a, + 0xba, 0x36, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x14, 0xaa, + 0x3b, 0xcc, 0xff, 0x97, 0x7f, 0x02, 0x00, 0x71, 0x13, 0x00, 0x93, 0x1a, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0x03, 0x15, 0x2a, 0x21, 0x00, 0x80, 0x52, 0xac, 0x36, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0xe4, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x15, 0x2a, + 0x01, 0x00, 0x80, 0x52, 0xa7, 0x36, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, + 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x17, 0x9f, 0x1a, 0xda, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb9, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x24, 0x50, 0x40, 0x78, 0xf3, 0x53, 0x01, 0xa9, + 0x26, 0x70, 0x40, 0x78, 0xf7, 0x63, 0x03, 0xa9, 0x17, 0x1c, 0x00, 0x12, + 0x25, 0x90, 0x40, 0xb8, 0xe0, 0xff, 0x83, 0x52, 0x9f, 0x00, 0x00, 0x6b, + 0xa8, 0x03, 0x00, 0x54, 0x00, 0xe0, 0xbf, 0x12, 0xbf, 0x00, 0x00, 0x6b, + 0x48, 0x03, 0x00, 0x54, 0xe0, 0xff, 0x87, 0x52, 0xdf, 0x00, 0x00, 0x6b, + 0xe8, 0x02, 0x00, 0x54, 0xf5, 0x5b, 0x02, 0xa9, 0xf3, 0x03, 0x01, 0xaa, + 0xf5, 0x03, 0x02, 0x2a, 0x20, 0x10, 0x40, 0x39, 0xa0, 0x00, 0x00, 0x34, + 0x9f, 0x00, 0x00, 0x71, 0xa4, 0x18, 0x40, 0x7a, 0xc4, 0x18, 0x40, 0x7a, + 0x40, 0x03, 0x00, 0x54, 0x16, 0x03, 0x00, 0x90, 0xd6, 0x82, 0x20, 0x91, + 0xe0, 0x03, 0x16, 0xaa, 0x01, 0x00, 0x80, 0x12, 0x12, 0xcc, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0x00, 0x04, 0x00, 0x34, 0xf5, 0x5b, 0x42, 0xa9, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x22, 0x00, 0x87, 0x52, + 0x41, 0x00, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0x34, 0x00, 0x87, 0x52, + 0x63, 0x01, 0x00, 0xf0, 0x63, 0x40, 0x36, 0x91, 0x87, 0xef, 0xff, 0x97, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x22, 0x00, 0x87, 0x52, + 0x41, 0x00, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0x34, 0x00, 0x87, 0x52, + 0x63, 0x01, 0x00, 0xf0, 0x63, 0xe0, 0x37, 0x91, 0x7b, 0xef, 0xff, 0x97, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x02, 0x40, 0x39, 0xe2, 0x03, 0x01, 0x91, 0x64, 0x0a, 0x40, 0x39, + 0xe1, 0x03, 0x15, 0x2a, 0x1f, 0x00, 0x00, 0x71, 0x60, 0x36, 0x40, 0x39, + 0xe3, 0x07, 0x9f, 0x1a, 0x9f, 0x00, 0x00, 0x71, 0xff, 0x7f, 0x04, 0xa9, + 0xec, 0x07, 0x9f, 0x1a, 0x6a, 0x72, 0x40, 0x78, 0x1f, 0x00, 0x00, 0x71, + 0x65, 0x6a, 0x40, 0x39, 0x6d, 0x06, 0x40, 0x39, 0xe8, 0x07, 0x9f, 0x1a, + 0x6b, 0x32, 0x40, 0xb8, 0xe0, 0x03, 0x17, 0x2a, 0x69, 0x92, 0x40, 0xb8, + 0x67, 0xe2, 0x40, 0xb8, 0x64, 0xb2, 0x41, 0xb8, 0xe3, 0x03, 0x01, 0x39, + 0x63, 0x26, 0x40, 0xb9, 0x66, 0x22, 0x41, 0xf8, 0xff, 0x7f, 0x05, 0xa9, + 0xed, 0x0b, 0x01, 0x39, 0xec, 0x0f, 0x01, 0x39, 0xeb, 0x47, 0x00, 0xb9, + 0xea, 0x93, 0x00, 0x79, 0xe9, 0x4f, 0x00, 0xb9, 0xe8, 0x43, 0x01, 0x39, + 0xe7, 0x13, 0x05, 0xb8, 0xe6, 0x63, 0x05, 0xf8, 0xe5, 0x7b, 0x01, 0x39, + 0xe4, 0x0f, 0x0c, 0x29, 0xff, 0x6b, 0x00, 0xb9, 0xd9, 0x37, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0x60, 0x04, 0x00, 0x35, 0x60, 0x0a, 0x40, 0x39, + 0x1f, 0x00, 0x00, 0x71, 0xe2, 0x07, 0x9f, 0x1a, 0xbf, 0x0a, 0x00, 0x71, + 0x40, 0x04, 0x00, 0x54, 0x38, 0x00, 0x80, 0x52, 0xe1, 0x03, 0x15, 0x2a, + 0x00, 0x23, 0xd7, 0x1a, 0x02, 0x2f, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, + 0x00, 0x03, 0x00, 0x35, 0x55, 0x04, 0x00, 0x35, 0x02, 0x00, 0x80, 0x52, + 0x60, 0x22, 0x40, 0xb9, 0x43, 0x39, 0x9a, 0x52, 0x1f, 0x00, 0x03, 0x6b, + 0xa0, 0x06, 0x00, 0x54, 0x08, 0x04, 0x00, 0x54, 0x41, 0x19, 0x9a, 0x52, + 0x1f, 0x00, 0x01, 0x6b, 0xa0, 0x04, 0x00, 0x54, 0x41, 0x1f, 0x9a, 0x52, + 0x1f, 0x00, 0x01, 0x6b, 0x21, 0x05, 0x00, 0x54, 0xe1, 0x03, 0x15, 0x2a, + 0xe0, 0x03, 0x17, 0x2a, 0x20, 0xff, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x16, 0xaa, 0xa1, 0xcb, 0xff, 0x97, 0x9f, 0x02, 0x00, 0x71, + 0x14, 0x00, 0x94, 0x1a, 0xf5, 0x5b, 0x42, 0xa9, 0x9b, 0xff, 0xff, 0x17, + 0xe0, 0x03, 0x16, 0xaa, 0x9b, 0xcb, 0xff, 0x97, 0xf5, 0x5b, 0x42, 0xa9, + 0x97, 0xff, 0xff, 0x17, 0x23, 0x00, 0x80, 0x52, 0xe0, 0x76, 0x1e, 0x53, + 0xe1, 0x03, 0x15, 0x2a, 0x60, 0x20, 0xc0, 0x1a, 0xe0, 0x2e, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0xc0, 0xfe, 0xff, 0x35, 0xbf, 0x06, 0x00, 0x71, + 0x18, 0x00, 0x80, 0x52, 0xe2, 0x17, 0x9f, 0x1a, 0xdd, 0xff, 0xff, 0x17, + 0x43, 0x3f, 0x9a, 0x52, 0x1f, 0x00, 0x03, 0x6b, 0xa1, 0x01, 0x00, 0x54, + 0xe1, 0x03, 0x18, 0x2a, 0xe0, 0x03, 0x17, 0x2a, 0x28, 0xff, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0xe4, 0xff, 0xff, 0x17, 0xe1, 0x03, 0x15, 0x2a, + 0xe0, 0x03, 0x17, 0x2a, 0xe2, 0xff, 0xff, 0xf0, 0x42, 0x40, 0x2a, 0x91, + 0x7d, 0xfd, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0xdd, 0xff, 0xff, 0x17, + 0xe0, 0x03, 0x16, 0xaa, 0x7d, 0xcb, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0xf5, 0x5b, 0x42, 0xa9, 0x78, 0xff, 0xff, 0x17, 0xe1, 0x03, 0x18, 0x2a, + 0xe0, 0x03, 0x17, 0x2a, 0xe3, 0xff, 0xff, 0xf0, 0x63, 0x40, 0x2a, 0x91, + 0x8d, 0xfe, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0xd1, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, + 0x00, 0x1c, 0x00, 0x72, 0xfd, 0x03, 0x00, 0x91, 0xff, 0x1f, 0x00, 0xf9, + 0xc0, 0x05, 0x00, 0x54, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x01, 0xaa, + 0x13, 0x00, 0x80, 0x52, 0xf5, 0x13, 0x00, 0xf9, 0x15, 0x1c, 0x40, 0x92, + 0x05, 0x00, 0x00, 0x14, 0x73, 0x06, 0x00, 0x11, 0x3f, 0x00, 0x00, 0x71, + 0x62, 0x1a, 0x47, 0x7a, 0x08, 0x04, 0x00, 0x54, 0xa2, 0x26, 0xd3, 0x9a, + 0x21, 0x00, 0x80, 0x52, 0x00, 0x00, 0x80, 0x52, 0x22, 0xff, 0x07, 0x36, + 0x82, 0x0e, 0x40, 0x39, 0xe1, 0xe3, 0x00, 0x91, 0x83, 0x12, 0x40, 0x39, + 0xe0, 0x03, 0x13, 0x2a, 0x5f, 0x00, 0x00, 0x71, 0x82, 0x16, 0x40, 0x39, + 0xe5, 0x07, 0x9f, 0x1a, 0x7f, 0x00, 0x00, 0x71, 0xe4, 0x07, 0x9f, 0x1a, + 0x87, 0x02, 0x40, 0x39, 0x5f, 0x00, 0x00, 0x71, 0x86, 0x12, 0x40, 0x78, + 0x82, 0x1a, 0x40, 0x39, 0xe3, 0x07, 0x9f, 0x1a, 0xe7, 0xe3, 0x00, 0x39, + 0x73, 0x06, 0x00, 0x11, 0xe6, 0x77, 0x00, 0x79, 0xe5, 0xf3, 0x00, 0x39, + 0xe4, 0xf7, 0x00, 0x39, 0xe3, 0xfb, 0x00, 0x39, 0xe2, 0xff, 0x00, 0x39, + 0xac, 0x41, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, 0xe1, 0x17, 0x9f, 0x1a, + 0x3f, 0x00, 0x00, 0x71, 0x62, 0x1a, 0x47, 0x7a, 0x49, 0xfc, 0xff, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x87, 0x52, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x13, 0x1c, 0x00, 0x72, 0xff, 0x1f, 0x00, 0xf9, + 0xe0, 0x05, 0x00, 0x54, 0x60, 0x06, 0x00, 0x51, 0x1f, 0x00, 0x13, 0x6a, + 0x81, 0x05, 0x00, 0x54, 0xf5, 0x5b, 0x02, 0xa9, 0x16, 0x03, 0x00, 0x90, + 0xd6, 0x82, 0x20, 0x91, 0xf5, 0x03, 0x01, 0xaa, 0xe0, 0x03, 0x16, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0x35, 0xcb, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0x40, 0x06, 0x00, 0x35, 0x53, 0x05, 0x00, 0x37, 0x63, 0x1e, 0x40, 0x92, + 0x20, 0x00, 0x80, 0x52, 0x04, 0x00, 0x00, 0x14, 0x00, 0x04, 0x00, 0x11, + 0x1f, 0x20, 0x00, 0x71, 0xc0, 0x04, 0x00, 0x54, 0x62, 0x24, 0xc0, 0x9a, + 0x82, 0xff, 0x07, 0x36, 0x00, 0x1c, 0x00, 0x12, 0xe1, 0xe3, 0x00, 0x91, + 0xc3, 0x41, 0x00, 0x94, 0xe6, 0xe3, 0x40, 0x39, 0xf4, 0x03, 0x00, 0x2a, + 0xe5, 0x77, 0x40, 0x79, 0xe0, 0x03, 0x16, 0xaa, 0xe4, 0xf3, 0x40, 0x39, + 0xe3, 0xf7, 0x40, 0x39, 0xe2, 0xfb, 0x40, 0x39, 0xe1, 0xff, 0x40, 0x39, + 0xa6, 0x02, 0x00, 0x39, 0xa5, 0x12, 0x00, 0x78, 0xa4, 0x0e, 0x00, 0x39, + 0xa3, 0x12, 0x00, 0x39, 0xa2, 0x16, 0x00, 0x39, 0xa1, 0x1a, 0x00, 0x39, + 0x0c, 0xcb, 0xff, 0x97, 0x9f, 0x02, 0x00, 0x71, 0x14, 0x00, 0x94, 0x1a, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x03, 0x00, 0x90, + 0x00, 0x80, 0x20, 0x91, 0x34, 0x00, 0x87, 0x52, 0x01, 0xcb, 0xff, 0x97, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x80, 0x52, 0xdf, 0xff, 0xff, 0x17, + 0xe0, 0x03, 0x16, 0xaa, 0xf9, 0xca, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0xf5, 0x5b, 0x42, 0xa9, 0xf6, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x16, 0xaa, + 0xf4, 0xca, 0xff, 0x97, 0xf5, 0x5b, 0x42, 0xa9, 0xf2, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0x00, 0x1c, 0x00, 0x72, + 0xfd, 0x03, 0x00, 0x91, 0xff, 0x1f, 0x00, 0xf9, 0xc0, 0x05, 0x00, 0x54, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x01, 0xaa, 0x13, 0x00, 0x80, 0x52, + 0xf5, 0x13, 0x00, 0xf9, 0x15, 0x1c, 0x40, 0x92, 0x05, 0x00, 0x00, 0x14, + 0x73, 0x06, 0x00, 0x11, 0x3f, 0x00, 0x00, 0x71, 0x62, 0x1a, 0x47, 0x7a, + 0x08, 0x04, 0x00, 0x54, 0xa2, 0x26, 0xd3, 0x9a, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x00, 0x80, 0x52, 0x22, 0xff, 0x07, 0x36, 0x82, 0x0e, 0x40, 0x39, + 0xe1, 0xe3, 0x00, 0x91, 0x83, 0x12, 0x40, 0x39, 0xe0, 0x03, 0x13, 0x2a, + 0x5f, 0x00, 0x00, 0x71, 0x82, 0x16, 0x40, 0x39, 0xe5, 0x07, 0x9f, 0x1a, + 0x7f, 0x00, 0x00, 0x71, 0xe4, 0x07, 0x9f, 0x1a, 0x87, 0x02, 0x40, 0x39, + 0x5f, 0x00, 0x00, 0x71, 0x86, 0x12, 0x40, 0x78, 0x82, 0x1a, 0x40, 0x39, + 0xe3, 0x07, 0x9f, 0x1a, 0xe7, 0xe3, 0x00, 0x39, 0x73, 0x06, 0x00, 0x11, + 0xe6, 0x77, 0x00, 0x79, 0xe5, 0xf3, 0x00, 0x39, 0xe4, 0xf7, 0x00, 0x39, + 0xe3, 0xfb, 0x00, 0x39, 0xe2, 0xff, 0x00, 0x39, 0xac, 0x41, 0x00, 0x94, + 0x1f, 0x00, 0x00, 0x71, 0xe1, 0x17, 0x9f, 0x1a, 0x3f, 0x00, 0x00, 0x71, + 0x62, 0x1a, 0x47, 0x7a, 0x49, 0xfc, 0xff, 0x54, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x00, 0x87, 0x52, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x13, 0x1c, 0x00, 0x72, 0xff, 0x1f, 0x00, 0xf9, 0x80, 0x05, 0x00, 0x54, + 0xf4, 0x03, 0x01, 0xaa, 0x61, 0x06, 0x00, 0x51, 0x3f, 0x00, 0x13, 0x6a, + 0x20, 0x00, 0x87, 0x52, 0x81, 0x04, 0x00, 0x54, 0xf5, 0x13, 0x00, 0xf9, + 0xf5, 0x02, 0x00, 0xf0, 0xb5, 0x82, 0x20, 0x91, 0x01, 0x00, 0x80, 0x12, + 0xe0, 0x03, 0x15, 0xaa, 0xb4, 0xca, 0xff, 0x97, 0x80, 0x04, 0x00, 0x35, + 0xf3, 0x04, 0x00, 0x37, 0x63, 0x1e, 0x40, 0x92, 0x20, 0x00, 0x80, 0x52, + 0x04, 0x00, 0x00, 0x14, 0x00, 0x04, 0x00, 0x11, 0x1f, 0x20, 0x00, 0x71, + 0x60, 0x02, 0x00, 0x54, 0x62, 0x24, 0xc0, 0x9a, 0x82, 0xff, 0x07, 0x36, + 0x00, 0x1c, 0x00, 0x12, 0xe1, 0xe3, 0x00, 0x91, 0xc3, 0x41, 0x00, 0x94, + 0xe6, 0xe3, 0x40, 0x39, 0xe5, 0x77, 0x40, 0x79, 0xe4, 0xf3, 0x40, 0x39, + 0xe3, 0xf7, 0x40, 0x39, 0xe2, 0xfb, 0x40, 0x39, 0xe1, 0xff, 0x40, 0x39, + 0x86, 0x02, 0x00, 0x39, 0x85, 0x12, 0x00, 0x78, 0x84, 0x0e, 0x00, 0x39, + 0x83, 0x12, 0x00, 0x39, 0x82, 0x16, 0x00, 0x39, 0x81, 0x1a, 0x00, 0x39, + 0x60, 0x01, 0x00, 0x35, 0xe0, 0x03, 0x15, 0xaa, 0x8c, 0xca, 0xff, 0x97, + 0xf5, 0x13, 0x40, 0xf9, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x87, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x80, 0x52, 0xe2, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x72, 0xc0, 0x03, 0x00, 0x54, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x1c, 0x40, 0x92, + 0x13, 0x00, 0x80, 0x52, 0xf5, 0x13, 0x00, 0xf9, 0x35, 0x1c, 0x00, 0x12, + 0x05, 0x00, 0x00, 0x14, 0x73, 0x06, 0x00, 0x11, 0x5f, 0x00, 0x00, 0x71, + 0x62, 0x1a, 0x47, 0x7a, 0xc8, 0x01, 0x00, 0x54, 0x81, 0x26, 0xd3, 0x9a, + 0x22, 0x00, 0x80, 0x52, 0x00, 0x00, 0x80, 0x52, 0x21, 0xff, 0x07, 0x36, + 0xe0, 0x03, 0x13, 0x2a, 0xe1, 0x03, 0x15, 0x2a, 0xcc, 0x41, 0x00, 0x94, + 0x1f, 0x00, 0x00, 0x71, 0xe2, 0x17, 0x9f, 0x1a, 0x73, 0x06, 0x00, 0x11, + 0x5f, 0x00, 0x00, 0x71, 0x62, 0x1a, 0x47, 0x7a, 0x89, 0xfe, 0xff, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x87, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x72, 0xc0, 0x03, 0x00, 0x54, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x1c, 0x40, 0x92, + 0x13, 0x00, 0x80, 0x52, 0xf5, 0x13, 0x00, 0xf9, 0x35, 0x1c, 0x00, 0x12, + 0x05, 0x00, 0x00, 0x14, 0x73, 0x06, 0x00, 0x11, 0x5f, 0x00, 0x00, 0x71, + 0x62, 0x1a, 0x47, 0x7a, 0xc8, 0x01, 0x00, 0x54, 0x81, 0x26, 0xd3, 0x9a, + 0x22, 0x00, 0x80, 0x52, 0x00, 0x00, 0x80, 0x52, 0x21, 0xff, 0x07, 0x36, + 0xe0, 0x03, 0x13, 0x2a, 0xe1, 0x03, 0x15, 0x2a, 0xcc, 0x41, 0x00, 0x94, + 0x1f, 0x00, 0x00, 0x71, 0xe2, 0x17, 0x9f, 0x1a, 0x73, 0x06, 0x00, 0x11, + 0x5f, 0x00, 0x00, 0x71, 0x62, 0x1a, 0x47, 0x7a, 0x89, 0xfe, 0xff, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x87, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x13, 0x1c, 0x00, 0x72, 0xff, 0x3b, 0x00, 0xb9, 0xa0, 0x04, 0x00, 0x54, + 0x60, 0x06, 0x00, 0x51, 0x1f, 0x00, 0x13, 0x6a, 0x41, 0x04, 0x00, 0x54, + 0xf5, 0x5b, 0x02, 0xa9, 0xf6, 0x02, 0x00, 0xf0, 0xd6, 0x82, 0x20, 0x91, + 0xf5, 0x03, 0x01, 0xaa, 0xe0, 0x03, 0x16, 0xaa, 0x01, 0x00, 0x80, 0x12, + 0x31, 0xca, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0x00, 0x05, 0x00, 0x35, + 0x13, 0x04, 0x00, 0x37, 0x63, 0x1e, 0x40, 0x92, 0x20, 0x00, 0x80, 0x52, + 0x04, 0x00, 0x00, 0x14, 0x00, 0x04, 0x00, 0x11, 0x1f, 0x20, 0x00, 0x71, + 0x80, 0x03, 0x00, 0x54, 0x62, 0x24, 0xc0, 0x9a, 0x82, 0xff, 0x07, 0x36, + 0x00, 0x1c, 0x00, 0x12, 0xe1, 0xe3, 0x00, 0x91, 0xc3, 0x41, 0x00, 0x94, + 0xe1, 0x3b, 0x40, 0xb9, 0xf4, 0x03, 0x00, 0x2a, 0xa1, 0x02, 0x00, 0xb9, + 0xe0, 0x03, 0x16, 0xaa, 0x12, 0xca, 0xff, 0x97, 0x9f, 0x02, 0x00, 0x71, + 0x14, 0x00, 0x94, 0x1a, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0x02, 0x00, 0xf0, 0x00, 0x80, 0x20, 0x91, 0x34, 0x00, 0x87, 0x52, + 0x07, 0xca, 0xff, 0x97, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x80, 0x52, + 0xe9, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x16, 0xaa, 0xff, 0xc9, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0xf5, 0x5b, 0x42, 0xa9, 0xf6, 0xff, 0xff, 0x17, + 0xe0, 0x03, 0x16, 0xaa, 0xfa, 0xc9, 0xff, 0x97, 0xf5, 0x5b, 0x42, 0xa9, + 0xf2, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xba, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0x2a, 0xf5, 0x5b, 0x02, 0xa9, + 0xf6, 0x03, 0x01, 0x2a, 0xf9, 0x23, 0x00, 0xf9, 0xf9, 0x03, 0x02, 0xaa, + 0x3c, 0xbc, 0xff, 0x97, 0x7f, 0x1e, 0x00, 0x72, 0x00, 0x06, 0x00, 0x54, + 0xf5, 0x03, 0x00, 0x2a, 0xd6, 0x1e, 0x00, 0x72, 0x20, 0x00, 0x87, 0x52, + 0xa0, 0x05, 0x00, 0x54, 0xb5, 0x02, 0x13, 0x0a, 0x14, 0x00, 0x80, 0x52, + 0xf7, 0x63, 0x03, 0xa9, 0x17, 0x00, 0x80, 0x52, 0x05, 0x00, 0x00, 0x14, + 0x94, 0x06, 0x00, 0x11, 0x7f, 0x00, 0x00, 0x71, 0x82, 0x1a, 0x47, 0x7a, + 0x28, 0x05, 0x00, 0x54, 0xa1, 0x26, 0xd4, 0x9a, 0x23, 0x00, 0x80, 0x52, + 0x00, 0x00, 0x80, 0x52, 0x21, 0xff, 0x07, 0x36, 0xe0, 0x03, 0x14, 0x2a, + 0x7b, 0x42, 0x00, 0x94, 0xd8, 0x02, 0x00, 0x0a, 0x13, 0x00, 0x80, 0x52, + 0x18, 0x1f, 0x40, 0x92, 0x05, 0x00, 0x00, 0x14, 0x73, 0x06, 0x00, 0x11, + 0x7f, 0x00, 0x00, 0x71, 0x62, 0x1a, 0x47, 0x7a, 0xe8, 0xfd, 0xff, 0x54, + 0x01, 0x27, 0xd3, 0x9a, 0x23, 0x00, 0x80, 0x52, 0x00, 0x00, 0x80, 0x52, + 0x21, 0xff, 0x07, 0x36, 0x23, 0x27, 0x40, 0x39, 0xe2, 0x43, 0x01, 0x91, + 0x26, 0x03, 0x40, 0x39, 0xe1, 0x03, 0x13, 0x2a, 0x25, 0x13, 0x40, 0xb8, + 0xe0, 0x03, 0x14, 0x2a, 0x24, 0x53, 0x40, 0xb8, 0x37, 0x00, 0x80, 0x52, + 0xe6, 0x43, 0x01, 0x39, 0xe5, 0x23, 0x05, 0xb8, 0xe4, 0x5b, 0x00, 0xb9, + 0xe3, 0x73, 0x01, 0x39, 0x8a, 0x41, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, + 0xe3, 0x17, 0x9f, 0x1a, 0xe9, 0xff, 0xff, 0x17, 0x20, 0x00, 0x87, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf9, 0x23, 0x40, 0xf9, + 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf7, 0x02, 0x00, 0x52, + 0x1f, 0x00, 0x00, 0x71, 0xe0, 0x02, 0x80, 0x1a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, + 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xba, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x01, 0x2a, + 0xf5, 0x5b, 0x02, 0xa9, 0xf6, 0x03, 0x02, 0xaa, 0xf7, 0x63, 0x03, 0xa9, + 0xf8, 0x03, 0x00, 0x2a, 0xf0, 0xbb, 0xff, 0x97, 0xff, 0x7f, 0x05, 0xa9, + 0x1f, 0x1f, 0x00, 0x72, 0x00, 0x01, 0x00, 0x54, 0xf3, 0x03, 0x00, 0x2a, + 0x00, 0x1f, 0x00, 0x12, 0x01, 0x04, 0x00, 0x51, 0x3f, 0x00, 0x00, 0x6a, + 0x61, 0x00, 0x00, 0x54, 0x97, 0x1e, 0x00, 0x72, 0x81, 0x01, 0x00, 0x54, + 0xf5, 0x02, 0x00, 0xf0, 0xb5, 0x82, 0x20, 0x91, 0x34, 0x00, 0x87, 0x52, + 0xe0, 0x03, 0x15, 0xaa, 0x91, 0xc9, 0xff, 0x97, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x94, 0x1e, 0x00, 0x12, + 0xf5, 0x02, 0x00, 0xf0, 0xb5, 0x82, 0x20, 0x91, 0x80, 0x06, 0x00, 0x51, + 0x1f, 0x00, 0x14, 0x6a, 0x01, 0x02, 0x00, 0x54, 0xe0, 0x03, 0x15, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0x8e, 0xc9, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0xc0, 0xfd, 0xff, 0x35, 0x60, 0x02, 0x18, 0x0a, 0x13, 0x00, 0x80, 0x52, + 0x1f, 0x20, 0x03, 0xd5, 0x01, 0x24, 0xd3, 0x9a, 0x01, 0x01, 0x00, 0x37, + 0x73, 0x06, 0x00, 0x11, 0x7f, 0x22, 0x00, 0x71, 0x81, 0xff, 0xff, 0x54, + 0x34, 0x00, 0x80, 0x52, 0xe4, 0xff, 0xff, 0x17, 0x34, 0x00, 0x87, 0x52, + 0xe2, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x13, 0x2a, 0x16, 0x42, 0x00, 0x94, + 0xf7, 0x02, 0x00, 0x0a, 0xf7, 0x1e, 0x40, 0x92, 0x1f, 0x20, 0x03, 0xd5, + 0xe0, 0x26, 0xd4, 0x9a, 0xc0, 0x00, 0x00, 0x37, 0x94, 0x06, 0x00, 0x11, + 0x9f, 0x22, 0x00, 0x71, 0x81, 0xff, 0xff, 0x54, 0x34, 0x00, 0x80, 0x52, + 0xd6, 0xff, 0xff, 0x17, 0xe1, 0x03, 0x14, 0x2a, 0xe2, 0x43, 0x01, 0x91, + 0xe0, 0x03, 0x13, 0x2a, 0x6c, 0x41, 0x00, 0x94, 0xe1, 0x7b, 0x41, 0x39, + 0xf4, 0x03, 0x00, 0x2a, 0xe4, 0x43, 0x41, 0x39, 0xe0, 0xbb, 0x40, 0x79, + 0xe3, 0x23, 0x45, 0xb8, 0xe2, 0x5b, 0x40, 0xb9, 0xc4, 0x02, 0x00, 0x39, + 0xc3, 0x12, 0x00, 0xb8, 0xc2, 0x52, 0x00, 0xb8, 0xc0, 0x92, 0x00, 0x78, + 0xc1, 0x2e, 0x00, 0x39, 0xd4, 0xf8, 0xff, 0x35, 0xe0, 0x03, 0x15, 0xaa, + 0x56, 0xc9, 0xff, 0x97, 0xe0, 0x4f, 0x00, 0xb9, 0xf4, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0x2a, 0xf5, 0x5b, 0x02, 0xa9, + 0xf6, 0x03, 0x01, 0x2a, 0xf7, 0x63, 0x03, 0xa9, 0x58, 0x1c, 0x00, 0x12, + 0x94, 0xbb, 0xff, 0x97, 0x7f, 0x1e, 0x00, 0x72, 0x20, 0x05, 0x00, 0x54, + 0xf5, 0x03, 0x00, 0x2a, 0xd6, 0x1e, 0x00, 0x72, 0x20, 0x00, 0x87, 0x52, + 0xc0, 0x04, 0x00, 0x54, 0xb5, 0x02, 0x13, 0x0a, 0x17, 0x00, 0x80, 0x52, + 0x14, 0x00, 0x80, 0x52, 0xf9, 0x23, 0x00, 0xf9, 0x05, 0x00, 0x00, 0x14, + 0x94, 0x06, 0x00, 0x11, 0x5f, 0x00, 0x00, 0x71, 0x82, 0x1a, 0x47, 0x7a, + 0x48, 0x04, 0x00, 0x54, 0xa1, 0x26, 0xd4, 0x9a, 0x22, 0x00, 0x80, 0x52, + 0x00, 0x00, 0x80, 0x52, 0x21, 0xff, 0x07, 0x36, 0xe0, 0x03, 0x14, 0x2a, + 0xd3, 0x41, 0x00, 0x94, 0xd9, 0x02, 0x00, 0x0a, 0x13, 0x00, 0x80, 0x52, + 0x39, 0x1f, 0x40, 0x92, 0x05, 0x00, 0x00, 0x14, 0x73, 0x06, 0x00, 0x11, + 0x5f, 0x00, 0x00, 0x71, 0x62, 0x1a, 0x47, 0x7a, 0xe8, 0xfd, 0xff, 0x54, + 0x21, 0x27, 0xd3, 0x9a, 0x22, 0x00, 0x80, 0x52, 0x00, 0x00, 0x80, 0x52, + 0x21, 0xff, 0x07, 0x36, 0x1f, 0x03, 0x00, 0x71, 0xe1, 0x03, 0x13, 0x2a, + 0xe2, 0x07, 0x9f, 0x1a, 0xe0, 0x03, 0x14, 0x2a, 0x37, 0x00, 0x80, 0x52, + 0x59, 0x41, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, 0xe2, 0x17, 0x9f, 0x1a, + 0xf0, 0xff, 0xff, 0x17, 0x20, 0x00, 0x87, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf7, 0x02, 0x00, 0x52, 0x1f, 0x00, 0x00, 0x71, + 0xe0, 0x02, 0x80, 0x1a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0x2a, 0xf5, 0x5b, 0x02, 0xa9, 0xf6, 0x03, 0x01, 0x2a, + 0xf7, 0x63, 0x03, 0xa9, 0x58, 0x1c, 0x00, 0x12, 0x50, 0xbb, 0xff, 0x97, + 0x7f, 0x1e, 0x00, 0x72, 0x20, 0x05, 0x00, 0x54, 0xf5, 0x03, 0x00, 0x2a, + 0xd6, 0x1e, 0x00, 0x72, 0x20, 0x00, 0x87, 0x52, 0xc0, 0x04, 0x00, 0x54, + 0xb5, 0x02, 0x13, 0x0a, 0x17, 0x00, 0x80, 0x52, 0x14, 0x00, 0x80, 0x52, + 0xf9, 0x23, 0x00, 0xf9, 0x05, 0x00, 0x00, 0x14, 0x94, 0x06, 0x00, 0x11, + 0x5f, 0x00, 0x00, 0x71, 0x82, 0x1a, 0x47, 0x7a, 0x48, 0x04, 0x00, 0x54, + 0xa1, 0x26, 0xd4, 0x9a, 0x22, 0x00, 0x80, 0x52, 0x00, 0x00, 0x80, 0x52, + 0x21, 0xff, 0x07, 0x36, 0xe0, 0x03, 0x14, 0x2a, 0x8f, 0x41, 0x00, 0x94, + 0xd9, 0x02, 0x00, 0x0a, 0x13, 0x00, 0x80, 0x52, 0x39, 0x1f, 0x40, 0x92, + 0x05, 0x00, 0x00, 0x14, 0x73, 0x06, 0x00, 0x11, 0x5f, 0x00, 0x00, 0x71, + 0x62, 0x1a, 0x47, 0x7a, 0xe8, 0xfd, 0xff, 0x54, 0x21, 0x27, 0xd3, 0x9a, + 0x22, 0x00, 0x80, 0x52, 0x00, 0x00, 0x80, 0x52, 0x21, 0xff, 0x07, 0x36, + 0x1f, 0x03, 0x00, 0x71, 0xe1, 0x03, 0x13, 0x2a, 0xe2, 0x17, 0x9f, 0x1a, + 0xe0, 0x03, 0x14, 0x2a, 0x37, 0x00, 0x80, 0x52, 0x39, 0x41, 0x00, 0x94, + 0x1f, 0x00, 0x00, 0x71, 0xe2, 0x17, 0x9f, 0x1a, 0xf0, 0xff, 0xff, 0x17, + 0x20, 0x00, 0x87, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf7, 0x02, 0x00, 0x52, 0x1f, 0x00, 0x00, 0x71, 0xe0, 0x02, 0x80, 0x1a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xba, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0x2a, + 0xf3, 0x03, 0x01, 0x2a, 0xf5, 0x5b, 0x02, 0xa9, 0xf7, 0x63, 0x03, 0xa9, + 0xf7, 0x03, 0x02, 0xaa, 0x0c, 0xbb, 0xff, 0x97, 0xff, 0x2f, 0x00, 0xf9, + 0x9f, 0x1e, 0x00, 0x72, 0x81, 0x01, 0x00, 0x54, 0xf6, 0x02, 0x00, 0xf0, + 0xd6, 0x82, 0x20, 0x91, 0x35, 0x00, 0x87, 0x52, 0xe0, 0x03, 0x16, 0xaa, + 0xb4, 0xc8, 0xff, 0x97, 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf9, 0x6b, 0x04, 0xa9, 0xfa, 0x03, 0x00, 0x2a, + 0x80, 0x1e, 0x00, 0x12, 0x01, 0x04, 0x00, 0x51, 0xf6, 0x02, 0x00, 0xf0, + 0xd6, 0x82, 0x20, 0x91, 0x3f, 0x00, 0x00, 0x6a, 0x81, 0x06, 0x00, 0x54, + 0xe0, 0x03, 0x16, 0xaa, 0x01, 0x00, 0x80, 0x12, 0xaf, 0xc8, 0xff, 0x97, + 0xf5, 0x03, 0x00, 0x2a, 0xe0, 0x08, 0x00, 0x35, 0x78, 0x1e, 0x00, 0x72, + 0xa0, 0x05, 0x00, 0x54, 0x73, 0x1e, 0x00, 0x12, 0x60, 0x06, 0x00, 0x51, + 0x1f, 0x00, 0x13, 0x6a, 0x21, 0x05, 0x00, 0x54, 0x5a, 0x03, 0x14, 0x0a, + 0x19, 0x00, 0x80, 0x52, 0x14, 0x00, 0x80, 0x52, 0x05, 0x00, 0x00, 0x14, + 0x94, 0x06, 0x00, 0x11, 0x7f, 0x02, 0x00, 0x71, 0x82, 0x1a, 0x47, 0x7a, + 0xa8, 0x02, 0x00, 0x54, 0x41, 0x27, 0xd4, 0x9a, 0x15, 0x00, 0x80, 0x52, + 0x33, 0x00, 0x80, 0x52, 0x21, 0xff, 0x07, 0x36, 0xe0, 0x03, 0x14, 0x2a, + 0x31, 0x41, 0x00, 0x94, 0x00, 0x03, 0x00, 0x0a, 0x02, 0x1c, 0x40, 0x92, + 0x40, 0x03, 0x00, 0x37, 0x40, 0x24, 0xd3, 0x9a, 0x40, 0x03, 0x00, 0x37, + 0x73, 0x06, 0x00, 0x11, 0x7f, 0x22, 0x00, 0x71, 0x81, 0xff, 0xff, 0x54, + 0x94, 0x06, 0x00, 0x11, 0x33, 0x00, 0x80, 0x52, 0x7f, 0x02, 0x00, 0x71, + 0x15, 0x00, 0x80, 0x52, 0x82, 0x1a, 0x47, 0x7a, 0xa9, 0xfd, 0xff, 0x54, + 0x95, 0x04, 0x00, 0x35, 0xe0, 0x03, 0x16, 0xaa, 0x39, 0x03, 0x00, 0x34, + 0x7b, 0xc8, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x15, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf9, 0x6b, 0x44, 0xa9, 0xbb, 0xff, 0xff, 0x17, 0x13, 0x00, 0x80, 0x52, + 0x1f, 0x20, 0x03, 0xd5, 0xe1, 0x03, 0x13, 0x2a, 0xe2, 0x63, 0x01, 0x91, + 0xe0, 0x03, 0x14, 0x2a, 0xeb, 0x40, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, + 0xf5, 0x03, 0x00, 0x2a, 0xe0, 0x2f, 0x40, 0xf9, 0xf3, 0x17, 0x9f, 0x1a, + 0x39, 0x00, 0x80, 0x52, 0xe0, 0x02, 0x00, 0xf9, 0xce, 0xff, 0xff, 0x17, + 0x63, 0xc8, 0xff, 0x97, 0x35, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x15, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf9, 0x6b, 0x44, 0xa9, 0xa4, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xbb, 0xa9, + 0x00, 0x3c, 0x00, 0x12, 0x00, 0xc0, 0x00, 0x51, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x1f, 0x98, 0x00, 0x71, 0xf5, 0x5b, 0x02, 0xa9, + 0xf6, 0x03, 0x04, 0xaa, 0x09, 0x01, 0x00, 0x54, 0x14, 0x00, 0x80, 0xd2, + 0xc0, 0x20, 0x80, 0x52, 0xd4, 0x02, 0x00, 0xf9, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf3, 0x03, 0x01, 0xaa, 0xf5, 0x03, 0x02, 0xaa, 0x61, 0x01, 0x00, 0xd0, + 0x21, 0x50, 0x3a, 0x91, 0xf4, 0x03, 0x03, 0x2a, 0x20, 0x58, 0x60, 0x78, + 0x61, 0x00, 0x00, 0x10, 0x20, 0xa8, 0x20, 0x8b, 0x00, 0x00, 0x1f, 0xd6, + 0x60, 0x06, 0x40, 0x29, 0x42, 0x30, 0x00, 0x91, 0x79, 0xff, 0xff, 0x97, + 0x62, 0x06, 0x40, 0x29, 0x9f, 0x52, 0x00, 0xf1, 0x83, 0x02, 0x80, 0xd2, + 0x94, 0x92, 0x83, 0x9a, 0xa0, 0x0a, 0x00, 0x29, 0xa1, 0x0a, 0x00, 0xb9, + 0xe9, 0xff, 0xff, 0x17, 0x60, 0x06, 0x40, 0x29, 0x62, 0x22, 0x40, 0x39, + 0x2b, 0xff, 0xff, 0x97, 0xa0, 0x02, 0x00, 0xb9, 0x9f, 0x12, 0x00, 0xf1, + 0x81, 0x00, 0x80, 0xd2, 0x94, 0x92, 0x81, 0x9a, 0xe1, 0xff, 0xff, 0x17, + 0x60, 0x06, 0x40, 0x29, 0x62, 0x22, 0x40, 0x39, 0xdf, 0xfe, 0xff, 0x97, + 0xa0, 0x02, 0x00, 0xb9, 0x9f, 0x12, 0x00, 0xf1, 0x81, 0x00, 0x80, 0xd2, + 0x94, 0x92, 0x81, 0x9a, 0xd9, 0xff, 0xff, 0x17, 0x60, 0x06, 0x40, 0x29, + 0x42, 0x30, 0x00, 0x91, 0x7b, 0xfe, 0xff, 0x97, 0x62, 0x06, 0x40, 0x29, + 0x9f, 0x62, 0x00, 0xf1, 0x03, 0x03, 0x80, 0xd2, 0x94, 0x92, 0x83, 0x9a, + 0xa0, 0x0a, 0x00, 0x29, 0xa1, 0x0a, 0x00, 0xb9, 0xcf, 0xff, 0xff, 0x17, + 0x60, 0x06, 0x40, 0x29, 0x62, 0x22, 0x00, 0x91, 0x25, 0xfe, 0xff, 0x97, + 0xa0, 0x02, 0x00, 0xb9, 0x9f, 0x12, 0x00, 0xf1, 0x81, 0x00, 0x80, 0xd2, + 0x94, 0x92, 0x81, 0x9a, 0xc7, 0xff, 0xff, 0x17, 0x64, 0x02, 0x40, 0x39, + 0x02, 0x00, 0x80, 0x52, 0x81, 0x00, 0x80, 0x52, 0x40, 0x00, 0x80, 0x52, + 0x63, 0x01, 0x00, 0xd0, 0x63, 0xa0, 0x39, 0x91, 0x9d, 0xeb, 0xff, 0x97, + 0x60, 0x02, 0x40, 0x39, 0xa1, 0x16, 0x00, 0x91, 0xa0, 0x12, 0x00, 0x39, + 0xd5, 0xfd, 0xff, 0x97, 0xa0, 0x02, 0x00, 0xb9, 0x9f, 0x26, 0x00, 0xf1, + 0x21, 0x01, 0x80, 0xd2, 0x94, 0x92, 0x81, 0x9a, 0xb7, 0xff, 0xff, 0x17, + 0x61, 0x06, 0x40, 0x39, 0x60, 0x02, 0x40, 0x39, 0x3f, 0x00, 0x00, 0x71, + 0xe1, 0x07, 0x9f, 0x1a, 0xa7, 0xfd, 0xff, 0x97, 0xa0, 0x02, 0x00, 0xb9, + 0x9f, 0x12, 0x00, 0xf1, 0x81, 0x00, 0x80, 0xd2, 0x94, 0x92, 0x81, 0x9a, + 0xad, 0xff, 0xff, 0x17, 0x60, 0x02, 0x40, 0x39, 0x41, 0x14, 0x00, 0x91, + 0x3f, 0xfd, 0xff, 0x97, 0xa0, 0x02, 0x00, 0xb9, 0x9f, 0x32, 0x00, 0xf1, + 0x81, 0x01, 0x80, 0xd2, 0x94, 0x92, 0x81, 0x9a, 0xa5, 0xff, 0xff, 0x17, + 0x60, 0x12, 0x40, 0x39, 0x61, 0x16, 0x00, 0x91, 0xff, 0xfc, 0xff, 0x97, + 0xa0, 0x02, 0x00, 0xb9, 0x9f, 0x12, 0x00, 0xf1, 0x81, 0x00, 0x80, 0xd2, + 0x94, 0x92, 0x81, 0x9a, 0x9d, 0xff, 0xff, 0x17, 0x61, 0x06, 0x40, 0x39, + 0x60, 0x02, 0x40, 0x39, 0x3f, 0x00, 0x00, 0x71, 0xe1, 0x07, 0x9f, 0x1a, + 0x69, 0xfd, 0xff, 0x97, 0xa0, 0x02, 0x00, 0xb9, 0x9f, 0x12, 0x00, 0xf1, + 0x81, 0x00, 0x80, 0xd2, 0x94, 0x92, 0x81, 0x9a, 0x93, 0xff, 0xff, 0x17, + 0x60, 0x02, 0x40, 0x39, 0x41, 0x14, 0x00, 0x91, 0xa5, 0xfc, 0xff, 0x97, + 0xa0, 0x02, 0x00, 0xb9, 0x9f, 0x32, 0x00, 0xf1, 0x81, 0x01, 0x80, 0xd2, + 0x94, 0x92, 0x81, 0x9a, 0x8b, 0xff, 0xff, 0x17, 0x60, 0x12, 0x40, 0x39, + 0x61, 0x16, 0x00, 0x91, 0x65, 0xfc, 0xff, 0x97, 0xa0, 0x02, 0x00, 0xb9, + 0x9f, 0x12, 0x00, 0xf1, 0x81, 0x00, 0x80, 0xd2, 0x94, 0x92, 0x81, 0x9a, + 0x83, 0xff, 0xff, 0x17, 0x65, 0x02, 0x40, 0x39, 0x03, 0x00, 0x80, 0x52, + 0x45, 0x10, 0x00, 0x39, 0x61, 0x06, 0x40, 0x39, 0x62, 0x0a, 0x40, 0x39, + 0xa1, 0x16, 0x00, 0x39, 0xa2, 0x1a, 0x00, 0x39, 0xa4, 0x24, 0xc3, 0x1a, + 0x80, 0x00, 0x00, 0x12, 0x24, 0x24, 0x00, 0x37, 0x63, 0x04, 0x00, 0x11, + 0x7f, 0x20, 0x00, 0x71, 0x61, 0xff, 0xff, 0x54, 0x9f, 0x7e, 0x00, 0xf1, + 0xe1, 0x03, 0x80, 0xd2, 0x94, 0x92, 0x81, 0x9a, 0xa0, 0x02, 0x00, 0xb9, + 0x71, 0xff, 0xff, 0x17, 0x61, 0x06, 0x40, 0x39, 0x45, 0x00, 0x80, 0x52, + 0x64, 0x02, 0x40, 0x39, 0x00, 0x01, 0x80, 0x52, 0x3f, 0x00, 0x05, 0x6b, + 0x44, 0x10, 0x00, 0x39, 0x41, 0x14, 0x00, 0x39, 0xa5, 0x00, 0x80, 0x1a, + 0x04, 0x23, 0x00, 0x37, 0x22, 0x00, 0x80, 0x52, 0x1f, 0x20, 0x03, 0xd5, + 0x83, 0x24, 0xc2, 0x1a, 0x60, 0x00, 0x00, 0x12, 0x23, 0x20, 0x00, 0x37, + 0x42, 0x04, 0x00, 0x11, 0x5f, 0x00, 0x05, 0x6b, 0x61, 0xff, 0xff, 0x54, + 0x9f, 0x42, 0x00, 0xf1, 0x01, 0x02, 0x80, 0xd2, 0x94, 0x92, 0x81, 0x9a, + 0xa0, 0x02, 0x00, 0xb9, 0x5b, 0xff, 0xff, 0x17, 0xf7, 0x63, 0x03, 0xa9, + 0x58, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x61, 0x0a, 0x40, 0x39, + 0x17, 0x00, 0x80, 0x52, 0x3f, 0x00, 0x18, 0x6b, 0x18, 0x03, 0x80, 0x1a, + 0x04, 0x00, 0x00, 0x14, 0xf7, 0x06, 0x00, 0x11, 0xff, 0x02, 0x18, 0x6b, + 0x20, 0x1b, 0x00, 0x54, 0x60, 0x02, 0x40, 0x39, 0x00, 0x24, 0xd7, 0x1a, + 0x60, 0xff, 0x07, 0x36, 0x62, 0x06, 0x40, 0x39, 0xe0, 0x03, 0x17, 0x2a, + 0x61, 0x0a, 0x40, 0x39, 0x5f, 0x00, 0x00, 0x71, 0xe2, 0x07, 0x9f, 0x1a, + 0x3f, 0x00, 0x00, 0x71, 0xe1, 0x07, 0x9f, 0x1a, 0x32, 0x3a, 0x00, 0x94, + 0x40, 0xfe, 0xff, 0x34, 0x9f, 0x12, 0x00, 0xf1, 0x81, 0x00, 0x80, 0xd2, + 0xf7, 0x63, 0x43, 0xa9, 0xa0, 0x02, 0x00, 0xb9, 0x94, 0x92, 0x81, 0x9a, + 0xd4, 0x02, 0x00, 0xf9, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x62, 0x06, 0x40, 0x39, + 0x44, 0x00, 0x80, 0x52, 0x65, 0x02, 0x40, 0x39, 0x00, 0x01, 0x80, 0x52, + 0x5f, 0x00, 0x04, 0x6b, 0x84, 0x00, 0x80, 0x1a, 0xa5, 0x1c, 0x00, 0x37, + 0x21, 0x00, 0x80, 0x52, 0xa3, 0x24, 0xc1, 0x1a, 0x60, 0x00, 0x00, 0x12, + 0x63, 0x1a, 0x00, 0x37, 0x21, 0x04, 0x00, 0x11, 0x3f, 0x00, 0x04, 0x6b, + 0x61, 0xff, 0xff, 0x54, 0x9f, 0xba, 0x00, 0xf1, 0xc1, 0x05, 0x80, 0xd2, + 0x94, 0x92, 0x81, 0x9a, 0xa0, 0x02, 0x00, 0xb9, 0x27, 0xff, 0xff, 0x17, + 0xf7, 0x63, 0x03, 0xa9, 0x58, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0xf9, 0x23, 0x00, 0xf9, 0x17, 0x00, 0x80, 0x52, 0x79, 0x0e, 0x00, 0x91, + 0x61, 0x06, 0x40, 0x39, 0x3f, 0x00, 0x18, 0x6b, 0x18, 0x03, 0x80, 0x1a, + 0x04, 0x00, 0x00, 0x14, 0xf7, 0x06, 0x00, 0x11, 0xff, 0x02, 0x18, 0x6b, + 0xc0, 0x16, 0x00, 0x54, 0x60, 0x02, 0x40, 0x39, 0x00, 0x24, 0xd7, 0x1a, + 0x60, 0xff, 0x07, 0x36, 0x63, 0x0a, 0x40, 0x39, 0xe1, 0x03, 0x19, 0xaa, + 0x62, 0x06, 0x40, 0x39, 0xe0, 0x03, 0x17, 0x2a, 0x63, 0x12, 0x00, 0x39, + 0x3a, 0xfb, 0xff, 0x97, 0x80, 0xfe, 0xff, 0x34, 0x9f, 0x12, 0x00, 0xf1, + 0x81, 0x00, 0x80, 0xd2, 0x94, 0x92, 0x81, 0x9a, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x23, 0x40, 0xf9, 0xa0, 0x02, 0x00, 0xb9, 0x09, 0xff, 0xff, 0x17, + 0xf7, 0x63, 0x03, 0xa9, 0x58, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0x61, 0x0a, 0x40, 0x39, 0x17, 0x00, 0x80, 0x52, 0x3f, 0x00, 0x18, 0x6b, + 0x18, 0x03, 0x80, 0x1a, 0x04, 0x00, 0x00, 0x14, 0xf7, 0x06, 0x00, 0x11, + 0xff, 0x02, 0x18, 0x6b, 0xe0, 0x10, 0x00, 0x54, 0x60, 0x02, 0x40, 0x39, + 0x00, 0x24, 0xd7, 0x1a, 0x60, 0xff, 0x07, 0x36, 0x61, 0x06, 0x40, 0x39, + 0xe0, 0x03, 0x17, 0x2a, 0x62, 0x0a, 0x40, 0x39, 0x3f, 0x00, 0x00, 0x71, + 0xe1, 0x07, 0x9f, 0x1a, 0xd2, 0x3c, 0x00, 0x94, 0x80, 0xfe, 0xff, 0x34, + 0xb0, 0xff, 0xff, 0x17, 0xf7, 0x63, 0x03, 0xa9, 0x00, 0x00, 0x80, 0x52, + 0x58, 0x18, 0x00, 0x91, 0xf9, 0x23, 0x00, 0xf9, 0x17, 0x00, 0x80, 0x52, + 0x59, 0x1c, 0x00, 0x91, 0x66, 0x06, 0x40, 0x39, 0x65, 0x02, 0x40, 0x39, + 0x04, 0x00, 0x00, 0x14, 0xf7, 0x06, 0x00, 0x11, 0xff, 0x22, 0x00, 0x71, + 0x40, 0x0f, 0x00, 0x54, 0xc1, 0x24, 0xd7, 0x1a, 0x81, 0xff, 0x07, 0x36, + 0x01, 0x00, 0x80, 0x52, 0x04, 0x00, 0x00, 0x14, 0x21, 0x04, 0x00, 0x11, + 0x3f, 0x28, 0x00, 0x71, 0xe0, 0xfe, 0xff, 0x54, 0xa4, 0x24, 0xc1, 0x1a, + 0x84, 0xff, 0x07, 0x36, 0xe3, 0x03, 0x19, 0xaa, 0xe2, 0x03, 0x18, 0xaa, + 0xe0, 0x03, 0x17, 0x2a, 0x43, 0x3d, 0x00, 0x94, 0x65, 0x02, 0x40, 0x39, + 0x66, 0x06, 0x40, 0x39, 0xee, 0xff, 0xff, 0x17, 0xf7, 0x63, 0x03, 0xa9, + 0x00, 0x00, 0x80, 0x52, 0x58, 0x18, 0x00, 0x91, 0x65, 0x02, 0x40, 0x39, + 0x17, 0x00, 0x80, 0x52, 0x64, 0x06, 0x40, 0x39, 0x04, 0x00, 0x00, 0x14, + 0xf7, 0x06, 0x00, 0x11, 0xff, 0x22, 0x00, 0x71, 0x00, 0x0b, 0x00, 0x54, + 0x83, 0x24, 0xd7, 0x1a, 0x62, 0x00, 0x00, 0x12, 0x63, 0xff, 0x07, 0x36, + 0xe5, 0x0e, 0x00, 0x37, 0x25, 0xff, 0x0f, 0x36, 0xe1, 0x03, 0x18, 0xaa, + 0xe0, 0x03, 0x17, 0x2a, 0x0e, 0xf8, 0xff, 0x97, 0x65, 0x02, 0x40, 0x39, + 0x64, 0x06, 0x40, 0x39, 0xf3, 0xff, 0xff, 0x17, 0xf7, 0x63, 0x03, 0xa9, + 0x17, 0x00, 0x80, 0x52, 0x04, 0x00, 0x00, 0x14, 0xf7, 0x06, 0x00, 0x11, + 0xff, 0x22, 0x00, 0x71, 0xa0, 0x08, 0x00, 0x54, 0x60, 0x02, 0x40, 0x39, + 0x00, 0x24, 0xd7, 0x1a, 0x60, 0xff, 0x07, 0x36, 0x61, 0x0e, 0x40, 0x39, + 0xe0, 0x03, 0x17, 0x2a, 0x62, 0x0a, 0x40, 0x39, 0x3f, 0x00, 0x00, 0x71, + 0x61, 0x06, 0x40, 0x39, 0xe3, 0x07, 0x9f, 0x1a, 0x5f, 0x00, 0x00, 0x71, + 0xe2, 0x07, 0x9f, 0x1a, 0x3f, 0x00, 0x00, 0x71, 0xe1, 0x07, 0x9f, 0x1a, + 0x23, 0x39, 0x00, 0x94, 0xe0, 0xfd, 0xff, 0x34, 0x69, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x80, 0x52, 0xf7, 0x63, 0x03, 0xa9, 0x78, 0x0a, 0x00, 0x91, + 0x17, 0x00, 0x80, 0x52, 0x04, 0x00, 0x00, 0x14, 0xf7, 0x06, 0x00, 0x11, + 0xff, 0x22, 0x00, 0x71, 0x20, 0xec, 0xff, 0x54, 0x62, 0x06, 0x40, 0x39, + 0x42, 0x24, 0xd7, 0x1a, 0x62, 0xff, 0x07, 0x36, 0x62, 0x02, 0x40, 0x39, + 0xe2, 0x00, 0x00, 0x37, 0x02, 0xff, 0x0f, 0x36, 0xe1, 0x03, 0x18, 0xaa, + 0xe0, 0x03, 0x17, 0x2a, 0x22, 0x00, 0x80, 0x52, 0x27, 0xf7, 0xff, 0x97, + 0xf3, 0xff, 0xff, 0x17, 0xe1, 0x03, 0x18, 0xaa, 0xe0, 0x03, 0x17, 0x2a, + 0x02, 0x00, 0x80, 0x52, 0x22, 0xf7, 0xff, 0x97, 0xc0, 0xfd, 0xff, 0x35, + 0x62, 0x02, 0x40, 0x39, 0xf4, 0xff, 0xff, 0x17, 0x00, 0x00, 0x80, 0x52, + 0xf7, 0x63, 0x03, 0xa9, 0x18, 0x00, 0x80, 0x52, 0x04, 0x00, 0x00, 0x14, + 0x18, 0x07, 0x00, 0x11, 0x1f, 0x23, 0x00, 0x71, 0x00, 0xe9, 0xff, 0x54, + 0x61, 0x06, 0x40, 0x39, 0x21, 0x24, 0xd8, 0x1a, 0x61, 0xff, 0x07, 0x36, + 0x17, 0x00, 0x80, 0x52, 0x04, 0x00, 0x00, 0x14, 0xf7, 0x06, 0x00, 0x11, + 0xff, 0x2a, 0x00, 0x71, 0xc0, 0xfe, 0xff, 0x54, 0x61, 0x02, 0x40, 0x39, + 0x21, 0x24, 0xd7, 0x1a, 0x61, 0xff, 0x07, 0x36, 0x61, 0x0a, 0x40, 0x39, + 0xe2, 0x03, 0x17, 0x2a, 0xe0, 0x03, 0x18, 0x2a, 0x3f, 0x00, 0x00, 0x71, + 0xe1, 0x07, 0x9f, 0x1a, 0x93, 0x38, 0x00, 0x94, 0x80, 0xfe, 0xff, 0x34, + 0xeb, 0xff, 0xff, 0x17, 0x00, 0x00, 0x80, 0x52, 0x33, 0xff, 0xff, 0x17, + 0xa5, 0x12, 0x00, 0x39, 0x9f, 0xaa, 0x00, 0xf1, 0xa4, 0x16, 0x00, 0x39, + 0x41, 0x05, 0x80, 0xd2, 0x94, 0x92, 0x81, 0x9a, 0xf7, 0x63, 0x43, 0xa9, + 0xa0, 0x02, 0x00, 0xb9, 0x6e, 0xfe, 0xff, 0x17, 0xa5, 0x12, 0x00, 0x39, + 0x9f, 0x3e, 0x00, 0xf1, 0xa6, 0x16, 0x00, 0x39, 0xe1, 0x01, 0x80, 0xd2, + 0x94, 0x92, 0x81, 0x9a, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, + 0xa0, 0x02, 0x00, 0xb9, 0x65, 0xfe, 0xff, 0x17, 0x00, 0x00, 0x80, 0x52, + 0x54, 0xff, 0xff, 0x17, 0x40, 0x1c, 0x00, 0x12, 0xa4, 0x3e, 0x00, 0x91, + 0xa3, 0x1e, 0x00, 0x91, 0xa2, 0x1a, 0x00, 0x91, 0x47, 0xf8, 0xff, 0x97, + 0xfe, 0xfe, 0xff, 0x17, 0x20, 0x1c, 0x00, 0x12, 0xa1, 0x1a, 0x00, 0x91, + 0x5f, 0xf7, 0xff, 0x97, 0x2e, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x03, 0x2a, + 0xa5, 0x5e, 0x00, 0x91, 0xa4, 0x3e, 0x00, 0x91, 0xa3, 0x1e, 0x00, 0x91, + 0x6d, 0xf8, 0xff, 0x97, 0xde, 0xfe, 0xff, 0x17, 0x02, 0x00, 0x80, 0x52, + 0x8a, 0xff, 0xff, 0x17, 0x00, 0x00, 0x80, 0x52, 0xee, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x80, 0x52, 0xf2, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0x4a, 0x31, 0x00, 0x94, + 0x60, 0x00, 0x00, 0x34, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0xff, 0xff, 0xb0, 0x00, 0x80, 0x2a, 0x91, 0x94, 0x30, 0x00, 0x94, + 0x60, 0xff, 0xff, 0x35, 0xfd, 0x7b, 0xc1, 0xa8, 0x61, 0x01, 0x00, 0xb0, + 0xe0, 0x02, 0x00, 0xd0, 0x21, 0xa0, 0x3b, 0x91, 0x00, 0x80, 0x20, 0x91, + 0x6d, 0xc6, 0xff, 0x17, 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x1c, 0x00, 0x12, 0xe0, 0x03, 0x14, 0x2a, + 0xf5, 0x5b, 0x02, 0xa9, 0xf6, 0x03, 0x01, 0x2a, 0xf5, 0x03, 0x02, 0xaa, + 0x5f, 0x00, 0x00, 0x39, 0xe1, 0x2f, 0x01, 0x91, 0xff, 0x2f, 0x01, 0x39, + 0x5d, 0x51, 0x00, 0x94, 0x20, 0x03, 0x00, 0x35, 0x13, 0x00, 0x80, 0x52, + 0xf7, 0x1b, 0x00, 0xf9, 0x37, 0x00, 0x80, 0x52, 0x04, 0x00, 0x00, 0x14, + 0x73, 0x06, 0x00, 0x11, 0x7f, 0x22, 0x00, 0x71, 0xc0, 0x02, 0x00, 0x54, + 0xe3, 0x2f, 0x41, 0x39, 0x63, 0x24, 0xd3, 0x1a, 0x63, 0xff, 0x07, 0x36, + 0xe2, 0x33, 0x01, 0x91, 0xe1, 0x03, 0x13, 0x2a, 0xe0, 0x03, 0x14, 0x2a, + 0x9e, 0x51, 0x00, 0x94, 0x20, 0x01, 0x00, 0x35, 0xe0, 0x4f, 0x40, 0xb9, + 0x1f, 0x00, 0x16, 0x6b, 0x61, 0xfe, 0xff, 0x54, 0xa1, 0x02, 0x40, 0x39, + 0xe0, 0x22, 0xd3, 0x1a, 0x00, 0x00, 0x01, 0x2a, 0xa0, 0x02, 0x00, 0x39, + 0xee, 0xff, 0xff, 0x17, 0xf7, 0x1b, 0x40, 0xf9, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x80, 0x52, 0xf7, 0x1b, 0x40, 0xf9, 0xfa, 0xff, 0xff, 0x17, + 0xfd, 0x7b, 0xba, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x01, 0xaa, 0xf4, 0x03, 0x00, 0x2a, 0xf5, 0x5b, 0x02, 0xa9, + 0x15, 0x1c, 0x00, 0x12, 0xe1, 0x67, 0x01, 0x91, 0x7f, 0x02, 0x00, 0x39, + 0xe0, 0x03, 0x15, 0x2a, 0xff, 0x67, 0x01, 0x39, 0xff, 0x6b, 0x01, 0x39, + 0xff, 0x6f, 0x01, 0x39, 0x1f, 0x51, 0x00, 0x94, 0x60, 0x00, 0x00, 0x35, + 0xe1, 0x67, 0x41, 0x39, 0xa1, 0x00, 0x00, 0x35, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0x03, 0x15, 0x2a, 0x06, 0x51, 0x00, 0x94, 0x40, 0xff, 0xff, 0x35, + 0xe1, 0x73, 0x01, 0x91, 0xe0, 0x03, 0x15, 0x2a, 0xf2, 0x50, 0x00, 0x94, + 0xc0, 0xfe, 0xff, 0x35, 0xe1, 0x5f, 0x40, 0xb9, 0xe0, 0x03, 0x14, 0x2a, + 0xe2, 0x6b, 0x01, 0x91, 0xb5, 0xff, 0xff, 0x97, 0x20, 0xfe, 0xff, 0x35, + 0x36, 0x00, 0x80, 0xd2, 0xf7, 0x63, 0x03, 0xa9, 0xf7, 0x03, 0x16, 0x2a, + 0xf9, 0x23, 0x00, 0xf9, 0x07, 0x00, 0x00, 0x14, 0xc1, 0x1e, 0x00, 0x12, + 0xd6, 0x06, 0x00, 0x91, 0x3f, 0x1c, 0x00, 0x71, 0xe1, 0x87, 0x9f, 0x1a, + 0x7f, 0x00, 0x01, 0x6a, 0x20, 0x05, 0x00, 0x54, 0xe2, 0x6b, 0x41, 0x39, + 0xd9, 0x06, 0x00, 0x51, 0x7f, 0x6a, 0x36, 0x38, 0x23, 0x00, 0x80, 0x52, + 0x42, 0x24, 0xd9, 0x1a, 0x40, 0x00, 0x03, 0x0a, 0x82, 0xfe, 0x07, 0x36, + 0xe1, 0x03, 0x19, 0x2a, 0xe2, 0x6f, 0x01, 0x91, 0xe0, 0x03, 0x15, 0x2a, + 0x16, 0x51, 0x00, 0x94, 0xe1, 0x6f, 0x41, 0x39, 0x1f, 0x00, 0x00, 0x71, + 0xe3, 0x17, 0x9f, 0x1a, 0x3f, 0x00, 0x00, 0x71, 0x64, 0x18, 0x40, 0x7a, + 0x40, 0xfd, 0xff, 0x54, 0xd8, 0xf2, 0x7d, 0xd3, 0x14, 0x00, 0x80, 0x52, + 0x18, 0x23, 0x00, 0xd1, 0x03, 0x03, 0x34, 0x8b, 0xe2, 0x03, 0x14, 0x2a, + 0xe1, 0x03, 0x19, 0x2a, 0xe0, 0x03, 0x15, 0x2a, 0x63, 0x0a, 0x03, 0x8b, + 0x63, 0x24, 0x00, 0x91, 0x52, 0x50, 0x00, 0x94, 0x64, 0x6a, 0x76, 0x38, + 0x1f, 0x00, 0x00, 0x71, 0xe2, 0x22, 0xd4, 0x1a, 0xe1, 0x6f, 0x41, 0x39, + 0x94, 0x06, 0x00, 0x11, 0xe3, 0x17, 0x9f, 0x1a, 0x42, 0x00, 0x04, 0x2a, + 0x62, 0x6a, 0x36, 0x38, 0x7f, 0x00, 0x00, 0x71, 0x94, 0x1e, 0x00, 0x12, + 0x20, 0x10, 0x54, 0x7a, 0xc8, 0xfd, 0xff, 0x54, 0xd3, 0xff, 0xff, 0x17, + 0xc0, 0x00, 0x00, 0x35, 0x21, 0x00, 0x80, 0x52, 0x61, 0x02, 0x00, 0x39, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, 0xb8, 0xff, 0xff, 0x17, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, 0xb5, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0x1c, 0x00, 0x71, 0x69, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x34, 0x1c, 0x00, 0x12, 0xf3, 0x03, 0x00, 0x2a, + 0x43, 0xb8, 0xff, 0x97, 0x9f, 0x06, 0x00, 0x71, 0x00, 0x24, 0xd3, 0x1a, + 0xe1, 0x87, 0x9f, 0x1a, 0x1f, 0x00, 0x01, 0x6a, 0xa1, 0x00, 0x00, 0x54, + 0x20, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe1, 0x03, 0x14, 0x2a, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xdd, 0x51, 0x00, 0x14, + 0x1f, 0x1c, 0x00, 0x71, 0x08, 0x07, 0x00, 0x54, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x1c, 0x00, 0x12, + 0xf5, 0x13, 0x00, 0xf9, 0x15, 0x00, 0x80, 0x52, 0x13, 0x00, 0x80, 0x52, + 0x1f, 0x20, 0x03, 0xd5, 0xe1, 0x03, 0x13, 0x2a, 0xe2, 0x03, 0x15, 0x2a, + 0xe0, 0x03, 0x14, 0x2a, 0x03, 0x00, 0x80, 0x52, 0x82, 0x52, 0x00, 0x94, + 0x1f, 0x00, 0x00, 0x71, 0x73, 0x06, 0x00, 0x11, 0xe1, 0x17, 0x9f, 0x1a, + 0x73, 0x1e, 0x00, 0x12, 0x3f, 0x00, 0x00, 0x71, 0x62, 0x1a, 0x5f, 0x7a, + 0xa9, 0xfe, 0xff, 0x54, 0xb5, 0x06, 0x00, 0x11, 0x3f, 0x00, 0x00, 0x71, + 0xb5, 0x1e, 0x00, 0x12, 0xa2, 0x1a, 0x5f, 0x7a, 0xc9, 0xfd, 0xff, 0x54, + 0x00, 0x04, 0x00, 0x35, 0xe0, 0x03, 0x14, 0x2a, 0x15, 0x00, 0x80, 0x52, + 0x9e, 0x51, 0x00, 0x94, 0x80, 0x03, 0x00, 0x35, 0x13, 0x00, 0x80, 0x52, + 0x1f, 0x20, 0x03, 0xd5, 0xe1, 0x03, 0x13, 0x2a, 0xe2, 0x03, 0x15, 0x2a, + 0xe0, 0x03, 0x14, 0x2a, 0x03, 0x00, 0x80, 0x52, 0x6a, 0x52, 0x00, 0x94, + 0x1f, 0x00, 0x00, 0x71, 0x73, 0x06, 0x00, 0x11, 0xe1, 0x17, 0x9f, 0x1a, + 0x73, 0x1e, 0x00, 0x12, 0x3f, 0x00, 0x00, 0x71, 0x62, 0x1a, 0x5f, 0x7a, + 0xa9, 0xfe, 0xff, 0x54, 0xb5, 0x06, 0x00, 0x11, 0x3f, 0x00, 0x00, 0x71, + 0xb5, 0x1e, 0x00, 0x12, 0xa2, 0x1a, 0x5f, 0x7a, 0xc9, 0xfd, 0xff, 0x54, + 0x00, 0x01, 0x00, 0x35, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0x84, 0x51, 0x00, 0x14, + 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1c, 0x00, 0x71, 0x69, 0x00, 0x00, 0x54, + 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0x2a, + 0xec, 0xb7, 0xff, 0x97, 0x00, 0x24, 0xd3, 0x1a, 0xa0, 0x00, 0x00, 0x37, + 0x20, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x74, 0x1e, 0x00, 0x12, 0x21, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x14, 0x2a, 0xd2, 0x51, 0x00, 0x94, 0x20, 0xff, 0xff, 0x35, + 0xe0, 0x03, 0x13, 0x2a, 0x01, 0x00, 0x80, 0x52, 0x92, 0xff, 0xff, 0x97, + 0xa0, 0xfe, 0xff, 0x35, 0xe0, 0x03, 0x13, 0x2a, 0xa7, 0xff, 0xff, 0x97, + 0x40, 0xfe, 0xff, 0x35, 0xe0, 0x03, 0x14, 0x2a, 0x60, 0x52, 0x00, 0x94, + 0xe0, 0xfd, 0xff, 0x35, 0xe0, 0x03, 0x14, 0x2a, 0x21, 0x00, 0x80, 0x52, + 0xa0, 0x51, 0x00, 0x94, 0x60, 0xfd, 0xff, 0x35, 0xe0, 0x03, 0x14, 0x2a, + 0x41, 0x50, 0x00, 0x94, 0x00, 0xfd, 0xff, 0x35, 0xe0, 0x03, 0x14, 0x2a, + 0x01, 0x00, 0x80, 0x52, 0xbd, 0x51, 0x00, 0x94, 0x80, 0xfc, 0xff, 0x35, + 0x01, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x14, 0x2a, 0x95, 0x51, 0x00, 0x94, + 0x41, 0x01, 0x80, 0x52, 0xe1, 0xbf, 0x00, 0x39, 0xe1, 0xbf, 0x40, 0x39, + 0x3f, 0x1c, 0x00, 0x72, 0x80, 0xfb, 0xff, 0x54, 0x1f, 0x20, 0x03, 0xd5, + 0xe1, 0xbf, 0x40, 0x39, 0x21, 0x1c, 0x00, 0x12, 0x21, 0x04, 0x00, 0x51, + 0x21, 0x1c, 0x00, 0x12, 0xe1, 0xbf, 0x00, 0x39, 0xe1, 0xbf, 0x40, 0x39, + 0x3f, 0x1c, 0x00, 0x72, 0x21, 0xff, 0xff, 0x54, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf2, 0x4e, 0x00, 0x94, 0x00, 0x06, 0x00, 0x35, + 0xf3, 0x53, 0x01, 0xa9, 0x13, 0x00, 0x80, 0x52, 0xf5, 0x13, 0x00, 0xf9, + 0x1f, 0x20, 0x03, 0xd5, 0xac, 0xb7, 0xff, 0x97, 0xe1, 0x03, 0x00, 0x2a, + 0x74, 0x1e, 0x00, 0x12, 0xe0, 0x03, 0x13, 0x2a, 0x21, 0x24, 0xd3, 0x1a, + 0xa1, 0x03, 0x00, 0x36, 0x7a, 0xb7, 0xff, 0x97, 0x15, 0x1c, 0x00, 0x12, + 0xe0, 0x03, 0x13, 0x2a, 0x7f, 0xb7, 0xff, 0x97, 0x01, 0x00, 0x00, 0x12, + 0xe0, 0x03, 0x14, 0x2a, 0xb4, 0x51, 0x00, 0x94, 0xe2, 0x03, 0x00, 0x2a, + 0xc0, 0x00, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xe0, 0x03, 0x02, 0x2a, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xa1, 0x0e, 0x00, 0x12, 0xe0, 0x03, 0x14, 0x2a, 0xf6, 0x50, 0x00, 0x94, + 0xe2, 0x03, 0x00, 0x2a, 0x21, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x14, 0x2a, + 0xa2, 0xfe, 0xff, 0x35, 0xc9, 0x51, 0x00, 0x94, 0xe2, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x13, 0x2a, 0x22, 0xfe, 0xff, 0x35, 0x99, 0xff, 0xff, 0x97, + 0xe2, 0x03, 0x00, 0x2a, 0xc0, 0xfd, 0xff, 0x35, 0x73, 0x06, 0x00, 0x11, + 0x7f, 0x22, 0x00, 0x71, 0x81, 0xfb, 0xff, 0x54, 0x02, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x02, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, + 0xe5, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x4e, 0x10, 0x00, 0x94, 0xfd, 0x7b, 0xc1, 0xa8, 0x20, 0x02, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xb7, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x02, 0x00, 0xf0, 0x73, 0x42, 0x04, 0x91, 0x14, 0x00, 0x80, 0x52, + 0xe2, 0xb3, 0x00, 0x91, 0xe1, 0xa3, 0x00, 0x91, 0xe0, 0x03, 0x14, 0x2a, + 0x87, 0xbd, 0xff, 0x97, 0xe2, 0x07, 0x45, 0x29, 0x60, 0x26, 0x40, 0xb9, + 0x1f, 0x00, 0x01, 0x6b, 0x81, 0x00, 0x00, 0x54, 0x60, 0x2a, 0x40, 0xb9, + 0x1f, 0x00, 0x02, 0x6b, 0x00, 0x01, 0x00, 0x54, 0xe0, 0xc3, 0x00, 0x91, + 0xe1, 0x0b, 0x06, 0x29, 0xf4, 0x7f, 0x07, 0x29, 0xff, 0x23, 0x00, 0xf9, + 0x3b, 0x12, 0x00, 0x94, 0xe0, 0x03, 0x14, 0x2a, 0x1d, 0x10, 0x00, 0x94, + 0x73, 0xa2, 0x02, 0x91, 0x94, 0x00, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc9, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x34, 0x00, 0x80, 0x52, + 0xe8, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x2a, + 0xe3, 0x03, 0x01, 0x2a, 0x04, 0x02, 0x00, 0xb0, 0x84, 0x80, 0x2a, 0x91, + 0x00, 0x04, 0x00, 0x8b, 0xfd, 0x7b, 0xbe, 0xa9, 0x02, 0x00, 0x00, 0x8b, + 0x42, 0x40, 0x23, 0x8b, 0xfd, 0x03, 0x00, 0x91, 0xe0, 0x43, 0x00, 0x91, + 0x01, 0x00, 0x80, 0x52, 0xff, 0x0f, 0x00, 0xf9, 0x82, 0x78, 0x62, 0xb8, + 0xe2, 0x0f, 0x02, 0x29, 0x36, 0xc3, 0xff, 0x97, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0x00, 0x1c, 0x00, 0x12, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x01, 0xaa, + 0xf5, 0x13, 0x00, 0xf9, 0xf5, 0x03, 0x02, 0x2a, 0x89, 0x0c, 0x00, 0x94, + 0xe2, 0x03, 0x00, 0x2a, 0xe1, 0x02, 0x00, 0xf0, 0x21, 0x00, 0x04, 0x91, + 0x20, 0x48, 0x62, 0x38, 0x40, 0x05, 0x00, 0x34, 0xe0, 0x02, 0x00, 0xf0, + 0x01, 0x40, 0x04, 0x91, 0x00, 0x15, 0x80, 0xd2, 0x40, 0x04, 0x00, 0x9b, + 0x00, 0x3c, 0x40, 0xb9, 0x01, 0x1c, 0x00, 0x51, 0x3f, 0x0c, 0x00, 0x71, + 0x04, 0x88, 0x43, 0x7a, 0x21, 0x04, 0x00, 0x54, 0xe1, 0x02, 0x00, 0xf0, + 0x21, 0x00, 0x14, 0x91, 0x83, 0x0a, 0x40, 0xf9, 0xe0, 0x02, 0x00, 0xf0, + 0x00, 0x40, 0x14, 0x91, 0x23, 0x78, 0x22, 0xf8, 0xe1, 0x02, 0x00, 0xf0, + 0x21, 0x80, 0x14, 0x91, 0x83, 0x02, 0x40, 0xf9, 0x03, 0x78, 0x22, 0xf8, + 0xe4, 0x02, 0x00, 0xf0, 0x84, 0xa0, 0x11, 0x91, 0xf3, 0x03, 0x02, 0xaa, + 0x84, 0x0c, 0x02, 0x8b, 0x83, 0x62, 0x00, 0x91, 0x80, 0x62, 0x01, 0x91, + 0x85, 0x06, 0x40, 0xf9, 0x25, 0x78, 0x22, 0xf8, 0x61, 0x84, 0x40, 0xf8, + 0x81, 0x04, 0x01, 0xf8, 0x7f, 0x00, 0x00, 0xeb, 0xa1, 0xff, 0xff, 0x54, + 0xe1, 0x02, 0x00, 0xf0, 0x21, 0xc0, 0x14, 0x91, 0xe0, 0x03, 0x13, 0x2a, + 0x35, 0x78, 0x22, 0xb8, 0x3c, 0x0e, 0x00, 0x94, 0x01, 0x48, 0x40, 0xb9, + 0x01, 0x01, 0x00, 0x34, 0x00, 0x9c, 0x40, 0xb9, 0x1f, 0x04, 0x00, 0x71, + 0xa0, 0x00, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x7f, 0x06, 0x00, 0x71, + 0x68, 0xff, 0xff, 0x54, 0xe0, 0x03, 0x13, 0x2a, 0x01, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xab, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0x00, 0x1c, 0x00, 0x12, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x01, 0xaa, 0xf5, 0x13, 0x00, 0xf9, + 0xf5, 0x03, 0x02, 0x2a, 0x45, 0x0c, 0x00, 0x94, 0xe2, 0x03, 0x00, 0x2a, + 0xe1, 0x02, 0x00, 0xf0, 0x21, 0x00, 0x04, 0x91, 0x20, 0x48, 0x62, 0x38, + 0xc0, 0x04, 0x00, 0x34, 0xe0, 0x02, 0x00, 0xf0, 0x01, 0x40, 0x04, 0x91, + 0x00, 0x15, 0x80, 0xd2, 0x40, 0x04, 0x00, 0x9b, 0x00, 0x3c, 0x40, 0xb9, + 0x01, 0x1c, 0x00, 0x51, 0x3f, 0x0c, 0x00, 0x71, 0x04, 0x88, 0x43, 0x7a, + 0xa1, 0x03, 0x00, 0x54, 0xe0, 0x02, 0x00, 0xf0, 0x00, 0xe0, 0x10, 0x91, + 0x83, 0x02, 0x40, 0xf9, 0xe1, 0x02, 0x00, 0xf0, 0x21, 0x20, 0x11, 0x91, + 0x03, 0x78, 0x22, 0xf8, 0xe4, 0x02, 0x00, 0xf0, 0x84, 0x80, 0x0e, 0x91, + 0xf3, 0x03, 0x02, 0xaa, 0x84, 0x0c, 0x02, 0x8b, 0x83, 0x42, 0x00, 0x91, + 0x80, 0x42, 0x01, 0x91, 0x85, 0x06, 0x40, 0xf9, 0x25, 0x78, 0x22, 0xf8, + 0x61, 0x84, 0x40, 0xf8, 0x81, 0x04, 0x01, 0xf8, 0x7f, 0x00, 0x00, 0xeb, + 0xa1, 0xff, 0xff, 0x54, 0xe1, 0x02, 0x00, 0xf0, 0x21, 0x80, 0x11, 0x91, + 0xe0, 0x03, 0x13, 0x2a, 0x35, 0x78, 0x22, 0xb8, 0xfc, 0x0d, 0x00, 0x94, + 0x01, 0x48, 0x40, 0xb9, 0x01, 0x01, 0x00, 0x34, 0x00, 0x9c, 0x40, 0xb9, + 0x1f, 0x04, 0x00, 0x71, 0xa0, 0x00, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x7f, 0x06, 0x00, 0x71, 0x68, 0xff, 0xff, 0x54, 0xe0, 0x03, 0x13, 0x2a, + 0x01, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0x6b, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0xe1, 0x02, 0x00, 0xf0, + 0x21, 0xc0, 0x09, 0x91, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0x2a, 0x22, 0x00, 0x80, 0x52, 0xf4, 0x03, 0x02, 0x2a, + 0x1f, 0x00, 0x02, 0x6b, 0x22, 0x58, 0x33, 0xb8, 0x29, 0x02, 0x00, 0x54, + 0xe4, 0x03, 0x13, 0x2a, 0xe2, 0x03, 0x14, 0x2a, 0x81, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0x63, 0x01, 0x00, 0xb0, 0x63, 0x00, 0x3c, 0x91, + 0xeb, 0xe7, 0xff, 0x97, 0xe4, 0x03, 0x13, 0x2a, 0xe2, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0x63, 0x01, 0x00, 0xb0, 0xfd, 0x7b, 0xc2, 0xa8, + 0x63, 0x00, 0x3d, 0x91, 0x81, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xe2, 0xe7, 0xff, 0x17, 0x01, 0x00, 0x80, 0x52, 0x4c, 0xff, 0xff, 0x97, + 0x14, 0x3c, 0x00, 0x12, 0xa0, 0xfd, 0xff, 0x35, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0xe4, 0x03, 0x00, 0x2a, + 0xe3, 0x03, 0x01, 0xaa, 0xfd, 0x03, 0x00, 0x91, 0xe0, 0x43, 0x00, 0x91, + 0x01, 0x00, 0x80, 0x52, 0xe4, 0x0b, 0x02, 0x29, 0xe3, 0x0f, 0x00, 0xf9, + 0x70, 0xc2, 0xff, 0x97, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x53, 0x10, 0x00, 0xd0, 0x73, 0x62, 0x02, 0x91, + 0xf4, 0x03, 0x00, 0x2a, 0x60, 0x4e, 0x20, 0x8b, 0x25, 0xc2, 0xff, 0x97, + 0x80, 0x00, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x01, 0x03, 0x80, 0xd2, 0x02, 0x02, 0x00, 0xb0, + 0x42, 0x80, 0x2a, 0x91, 0xf5, 0x13, 0x00, 0xf9, 0x81, 0x7e, 0x01, 0x9b, + 0x60, 0x7a, 0x74, 0xf8, 0x55, 0x00, 0x01, 0x8b, 0x41, 0x68, 0x61, 0xb8, + 0x4c, 0xc2, 0xff, 0x97, 0xe0, 0x02, 0x00, 0x35, 0xa1, 0x06, 0x40, 0xb9, + 0x60, 0x7a, 0x74, 0xf8, 0x48, 0xc2, 0xff, 0x97, 0x60, 0x02, 0x00, 0x35, + 0xa1, 0x0a, 0x40, 0xb9, 0x60, 0x7a, 0x74, 0xf8, 0x44, 0xc2, 0xff, 0x97, + 0xe0, 0x01, 0x00, 0x35, 0xa1, 0x0e, 0x40, 0xb9, 0x60, 0x7a, 0x74, 0xf8, + 0x40, 0xc2, 0xff, 0x97, 0x60, 0x01, 0x00, 0x35, 0xa1, 0x12, 0x40, 0xb9, + 0x60, 0x7a, 0x74, 0xf8, 0x3c, 0xc2, 0xff, 0x97, 0xe0, 0x00, 0x00, 0x35, + 0xa1, 0x16, 0x40, 0xb9, 0x60, 0x7a, 0x74, 0xf8, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0x35, 0xc2, 0xff, 0x17, + 0xf5, 0x13, 0x40, 0xf9, 0xdc, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5f, 0x20, 0x00, 0x71, 0xe5, 0x03, 0x00, 0x2a, + 0x28, 0x02, 0x00, 0x54, 0x5f, 0x0c, 0x00, 0x71, 0x08, 0x07, 0x00, 0x54, + 0x61, 0x01, 0x00, 0x54, 0x22, 0x7c, 0x7f, 0xd3, 0x00, 0x02, 0x00, 0xb0, + 0x00, 0x60, 0x24, 0x91, 0x43, 0x40, 0x23, 0x8b, 0x02, 0x78, 0x63, 0xb8, + 0x20, 0x00, 0x80, 0x52, 0x5f, 0x50, 0x02, 0x71, 0xa2, 0x90, 0x40, 0x7a, + 0x49, 0x02, 0x00, 0x54, 0xc0, 0x03, 0x5f, 0xd6, 0x02, 0x03, 0x00, 0x35, + 0x60, 0x80, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x5f, 0x28, 0x00, 0x71, + 0xc9, 0x03, 0x00, 0x54, 0x5f, 0x2c, 0x00, 0x71, 0x61, 0xff, 0xff, 0x54, + 0x22, 0x7c, 0x7f, 0xd3, 0x00, 0x02, 0x00, 0xb0, 0x00, 0x60, 0x27, 0x91, + 0x43, 0x40, 0x23, 0x8b, 0x02, 0x78, 0x63, 0xb8, 0x20, 0x00, 0x80, 0x52, + 0x5f, 0x50, 0x02, 0x71, 0xa2, 0x90, 0x40, 0x7a, 0x08, 0xfe, 0xff, 0x54, + 0xe3, 0x02, 0x00, 0xf0, 0x63, 0x40, 0x04, 0x91, 0x06, 0x15, 0x80, 0xd2, + 0xe0, 0x03, 0x02, 0x2a, 0xe1, 0x03, 0x04, 0xaa, 0xa5, 0x0c, 0x06, 0x9b, + 0xa2, 0x10, 0x40, 0xb9, 0x9d, 0xff, 0xff, 0x17, 0x22, 0x7c, 0x7f, 0xd3, + 0x00, 0x02, 0x00, 0xb0, 0x00, 0x60, 0x28, 0x91, 0x43, 0x40, 0x23, 0x8b, + 0x02, 0x78, 0x63, 0xb8, 0x20, 0x00, 0x80, 0x52, 0x5f, 0x50, 0x02, 0x71, + 0xa2, 0x90, 0x40, 0x7a, 0xe8, 0xfb, 0xff, 0x54, 0xef, 0xff, 0xff, 0x17, + 0x22, 0x7c, 0x7f, 0xd3, 0x00, 0x02, 0x00, 0xb0, 0x00, 0x60, 0x26, 0x91, + 0x43, 0x40, 0x23, 0x8b, 0x02, 0x78, 0x63, 0xb8, 0x20, 0x00, 0x80, 0x52, + 0x5f, 0x50, 0x02, 0x71, 0xa2, 0x90, 0x40, 0x7a, 0xa8, 0xfa, 0xff, 0x54, + 0xe5, 0xff, 0xff, 0x17, 0x22, 0x7c, 0x7f, 0xd3, 0x00, 0x02, 0x00, 0xb0, + 0x00, 0x60, 0x25, 0x91, 0x43, 0x40, 0x23, 0x8b, 0x02, 0x78, 0x63, 0xb8, + 0x20, 0x00, 0x80, 0x52, 0x5f, 0x50, 0x02, 0x71, 0xa2, 0x90, 0x40, 0x7a, + 0x68, 0xf9, 0xff, 0x54, 0xdb, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x34, 0x1f, 0x04, 0x00, 0x71, + 0x69, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0xe3, 0x02, 0x00, 0xf0, 0x63, 0x40, 0x04, 0x91, 0x01, 0x00, 0x80, 0xd2, + 0x20, 0x07, 0x80, 0x52, 0x64, 0x88, 0x59, 0x29, 0x42, 0x40, 0x04, 0x2a, + 0x71, 0xff, 0xff, 0x17, 0xe3, 0x02, 0x00, 0xf0, 0x63, 0x40, 0x04, 0x91, + 0x01, 0x00, 0x80, 0xd2, 0x00, 0x07, 0x80, 0x52, 0x64, 0x88, 0x44, 0x29, + 0x42, 0x40, 0x04, 0x2a, 0x6a, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x02, 0x00, 0xf0, 0x94, 0x42, 0x04, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0xf5, 0x03, 0x00, 0x2a, 0x00, 0x15, 0x80, 0xd2, 0xf3, 0x03, 0x15, 0xaa, + 0xa0, 0x52, 0x00, 0x9b, 0x16, 0x34, 0x40, 0xb9, 0x15, 0x06, 0x00, 0x34, + 0xbf, 0x06, 0x00, 0x71, 0xc9, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x83, 0x0a, 0x5b, 0x29, 0x01, 0x00, 0x80, 0xd2, + 0x80, 0x0c, 0x80, 0x52, 0x42, 0x40, 0x03, 0x2a, 0x51, 0xff, 0xff, 0x97, + 0xe0, 0xfe, 0xff, 0x35, 0x00, 0x15, 0x80, 0xd2, 0xb4, 0x52, 0x00, 0x9b, + 0x80, 0x32, 0x40, 0xb9, 0x1f, 0x18, 0x00, 0x71, 0x28, 0x02, 0x00, 0x54, + 0x1f, 0x10, 0x00, 0x71, 0xc8, 0x04, 0x00, 0x54, 0x1f, 0x08, 0x00, 0x71, + 0x40, 0x04, 0x00, 0x54, 0xc0, 0xd6, 0x01, 0x11, 0x89, 0x02, 0x00, 0x54, + 0x60, 0xfd, 0xff, 0x34, 0x1f, 0x50, 0x02, 0x71, 0x62, 0x9a, 0x41, 0x7a, + 0xe8, 0xfc, 0xff, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0x02, 0x00, 0x80, 0x52, + 0xf5, 0x5b, 0x42, 0xa9, 0x01, 0x00, 0x80, 0xd2, 0xfd, 0x7b, 0xc3, 0xa8, + 0x3b, 0xff, 0xff, 0x17, 0x1f, 0x1c, 0x00, 0x71, 0x40, 0x02, 0x00, 0x54, + 0x1f, 0x20, 0x00, 0x71, 0x60, 0x80, 0x80, 0x52, 0xe0, 0x03, 0x80, 0x1a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xc0, 0x96, 0x01, 0x11, 0x81, 0xfd, 0xff, 0x54, + 0x60, 0x80, 0x80, 0x52, 0xd5, 0xff, 0xff, 0x17, 0x83, 0x0a, 0x46, 0x29, + 0x01, 0x00, 0x80, 0xd2, 0x60, 0x0c, 0x80, 0x52, 0x42, 0x40, 0x03, 0x2a, + 0x29, 0xff, 0xff, 0x97, 0xd8, 0xff, 0xff, 0x17, 0xc0, 0x16, 0x02, 0x11, + 0xe2, 0xff, 0xff, 0x17, 0xc0, 0xb6, 0x01, 0x11, 0xe0, 0xff, 0xff, 0x17, + 0xc0, 0xf6, 0x01, 0x11, 0xde, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xba, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0xf7, 0x63, 0x03, 0xa9, 0xf6, 0x02, 0x00, 0xf0, 0xd7, 0x42, 0x04, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x15, 0x80, 0xd2, 0xf9, 0x6b, 0x04, 0xa9, + 0xf9, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x01, 0x2a, 0xfb, 0x2b, 0x00, 0xf9, + 0xfc, 0x0a, 0x00, 0x94, 0xf6, 0x03, 0x00, 0x2a, 0xf8, 0x03, 0x00, 0x2a, + 0xd4, 0x5e, 0x14, 0x9b, 0xe1, 0x03, 0x14, 0xaa, 0xdb, 0x0c, 0x00, 0x94, + 0xe0, 0x02, 0x00, 0xf0, 0x00, 0x20, 0x04, 0x91, 0x21, 0x00, 0x80, 0x52, + 0x01, 0x48, 0x38, 0x38, 0x58, 0x07, 0x00, 0x34, 0xfb, 0x02, 0x00, 0xf0, + 0x7b, 0xc7, 0x03, 0x91, 0x7a, 0x2f, 0x80, 0x52, 0x75, 0x01, 0x80, 0x52, + 0x94, 0x32, 0x01, 0x91, 0x13, 0x00, 0x80, 0xd2, 0x1f, 0x20, 0x03, 0xd5, + 0x82, 0x7a, 0x73, 0xb8, 0xe1, 0x03, 0x13, 0x2a, 0xe0, 0x03, 0x15, 0x2a, + 0x73, 0x06, 0x00, 0x91, 0x72, 0xba, 0xff, 0x97, 0x7f, 0x42, 0x00, 0xf1, + 0x41, 0xff, 0xff, 0x54, 0x14, 0x15, 0x80, 0xd2, 0xe0, 0x03, 0x15, 0x2a, + 0xd4, 0x5e, 0x14, 0x9b, 0x81, 0x4a, 0x40, 0xf9, 0x7f, 0xba, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0x21, 0x00, 0x80, 0x52, 0x61, 0x03, 0x00, 0x39, + 0x60, 0x00, 0x00, 0x35, 0x3f, 0x1f, 0x00, 0x71, 0xc1, 0x04, 0x00, 0x54, + 0xe0, 0x03, 0x1a, 0x2a, 0x67, 0x44, 0x00, 0x94, 0x02, 0x15, 0x80, 0xd2, + 0x01, 0x18, 0x1f, 0x12, 0xc2, 0x5e, 0x02, 0x9b, 0x40, 0x24, 0x40, 0xb9, + 0x1f, 0x1c, 0x00, 0x71, 0x00, 0x01, 0x00, 0x54, 0x1f, 0x0c, 0x00, 0x71, + 0x60, 0x00, 0x00, 0x54, 0x1f, 0x10, 0x00, 0x71, 0xa1, 0x00, 0x00, 0x54, + 0xe0, 0x02, 0x00, 0xf0, 0x00, 0xe0, 0x49, 0x39, 0x40, 0x00, 0x00, 0x34, + 0x21, 0x00, 0x00, 0x32, 0xe0, 0x03, 0x1a, 0x2a, 0x63, 0x44, 0x00, 0x94, + 0x33, 0x03, 0x00, 0x34, 0x00, 0x15, 0x80, 0xd2, 0xd6, 0x5e, 0x00, 0x9b, + 0xc0, 0x2a, 0x40, 0xb9, 0x00, 0x08, 0x00, 0x11, 0x31, 0xe6, 0xff, 0x97, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x2b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xfb, 0x02, 0x00, 0xf0, + 0x7b, 0xc3, 0x03, 0x91, 0x5a, 0x2f, 0x80, 0x52, 0x55, 0x01, 0x80, 0x52, + 0xc7, 0xff, 0xff, 0x17, 0x82, 0x86, 0x44, 0x29, 0xe0, 0x03, 0x18, 0x2a, + 0x83, 0x9e, 0x40, 0xb9, 0xf8, 0xbb, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0xd6, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x18, 0x2a, 0x48, 0xff, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0xe5, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xba, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf9, 0x6b, 0x04, 0xa9, 0xfb, 0x73, 0x05, 0xa9, 0x9f, 0x0a, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0x61, 0xb5, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x00, 0x00, 0x80, 0x52, 0xc2, 0xfe, 0xff, 0x97, 0xfc, 0x03, 0x00, 0x2a, + 0xa0, 0x02, 0x00, 0x34, 0xe7, 0x02, 0x00, 0xf0, 0xfa, 0xc0, 0x0a, 0x91, + 0x41, 0x01, 0x80, 0x52, 0x20, 0x00, 0x80, 0x52, 0x08, 0x00, 0x00, 0x90, + 0x1b, 0x41, 0x26, 0x91, 0x5b, 0x33, 0x00, 0xf9, 0x41, 0x6b, 0x00, 0xb9, + 0x40, 0xb3, 0x01, 0x39, 0x20, 0x00, 0x80, 0x52, 0x41, 0x01, 0x80, 0x52, + 0x5b, 0x6b, 0x00, 0xf9, 0x41, 0xdb, 0x00, 0xb9, 0x40, 0x73, 0x03, 0x39, + 0xe0, 0x03, 0x1c, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x00, 0x80, 0x52, 0xaa, 0xfe, 0xff, 0x97, 0xfc, 0x03, 0x00, 0x2a, + 0x20, 0xfd, 0xff, 0x35, 0xdb, 0x46, 0x00, 0x94, 0xfc, 0x03, 0x00, 0x2a, + 0xc0, 0xfc, 0xff, 0x35, 0x00, 0x12, 0x00, 0x94, 0xfc, 0x03, 0x00, 0x2a, + 0x9f, 0x06, 0x00, 0x71, 0x80, 0x13, 0x00, 0x54, 0x3c, 0xfc, 0xff, 0x35, + 0x43, 0xfc, 0xff, 0x97, 0xfc, 0x03, 0x00, 0x2a, 0xc0, 0xfb, 0xff, 0x35, + 0xf5, 0x5b, 0x02, 0xa9, 0xf7, 0x63, 0x03, 0xa9, 0xe0, 0x03, 0x1c, 0x2a, + 0x9c, 0x07, 0x00, 0x11, 0x7c, 0x2d, 0x00, 0x94, 0x1f, 0x00, 0x00, 0x71, + 0x82, 0x0b, 0x4f, 0x7a, 0x69, 0xff, 0xff, 0x54, 0x00, 0x14, 0x00, 0x35, + 0xb7, 0x42, 0x00, 0x94, 0xfc, 0x03, 0x00, 0x2a, 0x80, 0x02, 0x13, 0x2a, + 0x00, 0x00, 0x1c, 0x2a, 0xc0, 0x00, 0x00, 0x35, 0xe1, 0xff, 0xff, 0xf0, + 0x21, 0xc0, 0x1a, 0x91, 0xc0, 0x00, 0x80, 0x52, 0xcb, 0x43, 0x00, 0x94, + 0xfc, 0x03, 0x00, 0x2a, 0x3c, 0x13, 0x00, 0x35, 0x00, 0x02, 0x00, 0x90, + 0x19, 0x00, 0x00, 0x90, 0x39, 0x03, 0x1d, 0x91, 0xf8, 0x02, 0x00, 0xd0, + 0x18, 0xe3, 0x14, 0x91, 0xe2, 0x03, 0x19, 0xaa, 0x01, 0x68, 0x45, 0xf9, + 0x26, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x18, 0xaa, 0x05, 0x01, 0x80, 0x52, + 0x04, 0x80, 0x82, 0x52, 0x03, 0x00, 0x80, 0xd2, 0x84, 0xc1, 0xff, 0x97, + 0xfc, 0x03, 0x00, 0x2a, 0x40, 0x11, 0x00, 0x35, 0x17, 0x00, 0x00, 0x90, + 0xf7, 0x82, 0x11, 0x91, 0xf6, 0x02, 0x00, 0xd0, 0xd6, 0x02, 0x0a, 0x91, + 0xf5, 0x02, 0x00, 0xd0, 0xb5, 0x82, 0x0a, 0x91, 0xf4, 0x02, 0x00, 0xd0, + 0x94, 0x42, 0x0a, 0x91, 0xe4, 0x03, 0x17, 0xaa, 0xe3, 0x03, 0x16, 0xaa, + 0xe2, 0x03, 0x15, 0xaa, 0xe1, 0x03, 0x14, 0xaa, 0x05, 0x00, 0x80, 0xd2, + 0x80, 0x00, 0x80, 0x52, 0x4f, 0x1e, 0x00, 0x94, 0xfc, 0x03, 0x00, 0x2a, + 0xe7, 0x02, 0x00, 0xd0, 0xfa, 0xc0, 0x0a, 0x91, 0x40, 0x01, 0x80, 0x52, + 0xe8, 0xff, 0xff, 0xf0, 0x1b, 0x41, 0x26, 0x91, 0x5b, 0x33, 0x00, 0xf9, + 0x40, 0x6b, 0x00, 0xb9, 0x20, 0x00, 0x80, 0x52, 0x40, 0xb3, 0x01, 0x39, + 0x7c, 0x0e, 0x00, 0x35, 0x13, 0x02, 0x00, 0x90, 0x73, 0x22, 0x2a, 0x91, + 0xe1, 0x03, 0x13, 0xaa, 0xe0, 0x03, 0x1a, 0xaa, 0x03, 0x00, 0x80, 0x52, + 0x02, 0x00, 0x80, 0x52, 0xad, 0xc2, 0xff, 0x97, 0xfc, 0x03, 0x00, 0x2a, + 0x40, 0x0d, 0x00, 0x35, 0x00, 0x02, 0x00, 0x90, 0x00, 0x40, 0x2b, 0x91, + 0xe2, 0x03, 0x19, 0xaa, 0x26, 0x00, 0x80, 0x52, 0x05, 0x01, 0x80, 0x52, + 0x04, 0x80, 0x82, 0x52, 0x01, 0x04, 0x40, 0xf9, 0x23, 0x00, 0x80, 0xd2, + 0x00, 0x23, 0x06, 0x91, 0x55, 0xc1, 0xff, 0x97, 0xfc, 0x03, 0x00, 0x2a, + 0xc0, 0x0b, 0x00, 0x35, 0xe4, 0x03, 0x17, 0xaa, 0xc3, 0x22, 0x00, 0x91, + 0xa2, 0x22, 0x00, 0x91, 0x81, 0x22, 0x00, 0x91, 0x25, 0x00, 0x80, 0xd2, + 0xa0, 0x00, 0x80, 0x52, 0x28, 0x1e, 0x00, 0x94, 0xfc, 0x03, 0x00, 0x2a, + 0x40, 0x01, 0x80, 0x52, 0x5b, 0x6b, 0x00, 0xf9, 0x40, 0xdb, 0x00, 0xb9, + 0x20, 0x00, 0x80, 0x52, 0x40, 0x73, 0x03, 0x39, 0x1c, 0x06, 0x00, 0x35, + 0x61, 0x2a, 0x00, 0x91, 0x40, 0xc3, 0x01, 0x91, 0x03, 0x00, 0x80, 0x52, + 0x22, 0x00, 0x80, 0x52, 0x8c, 0xc2, 0xff, 0x97, 0xfc, 0x03, 0x00, 0x2a, + 0x20, 0x05, 0x00, 0x35, 0xd5, 0x43, 0x00, 0x94, 0xfc, 0x03, 0x00, 0x2a, + 0xc0, 0x04, 0x00, 0x35, 0x01, 0x01, 0x80, 0x52, 0x60, 0x02, 0x80, 0x52, + 0xe4, 0x43, 0x00, 0x94, 0xfc, 0x03, 0x00, 0x2a, 0x20, 0x04, 0x00, 0x35, + 0x21, 0x01, 0x80, 0x52, 0x80, 0x02, 0x80, 0x52, 0xdf, 0x43, 0x00, 0x94, + 0xfc, 0x03, 0x00, 0x2a, 0x80, 0x03, 0x00, 0x35, 0xf4, 0xff, 0xff, 0xf0, + 0x94, 0x02, 0x1e, 0x91, 0x13, 0x00, 0x80, 0x52, 0x1f, 0x20, 0x03, 0xd5, + 0xe0, 0x03, 0x13, 0x2a, 0x73, 0x06, 0x00, 0x11, 0xe1, 0x03, 0x14, 0xaa, + 0x73, 0x1e, 0x00, 0x12, 0xd0, 0xf4, 0xff, 0x97, 0x1f, 0x00, 0x00, 0x71, + 0xfc, 0x03, 0x00, 0x2a, 0x62, 0x0a, 0x47, 0x7a, 0x09, 0xff, 0xff, 0x54, + 0xc0, 0x01, 0x00, 0x35, 0xf4, 0xff, 0xff, 0xf0, 0x94, 0x42, 0x22, 0x91, + 0x13, 0x00, 0x80, 0x52, 0x1f, 0x20, 0x03, 0xd5, 0xe0, 0x03, 0x13, 0x2a, + 0x73, 0x06, 0x00, 0x11, 0xe1, 0x03, 0x14, 0xaa, 0x73, 0x1e, 0x00, 0x12, + 0x3a, 0xf5, 0xff, 0x97, 0x1f, 0x00, 0x00, 0x71, 0xfc, 0x03, 0x00, 0x2a, + 0x62, 0x0a, 0x47, 0x7a, 0x09, 0xff, 0xff, 0x54, 0xe0, 0x03, 0x1c, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xc0, 0xe8, 0xff, 0x35, 0x80, 0x15, 0x80, 0x52, + 0x47, 0xba, 0xff, 0x97, 0xfc, 0x03, 0x00, 0x2a, 0x40, 0xe8, 0xff, 0x35, + 0xa0, 0x15, 0x80, 0x52, 0x43, 0xba, 0xff, 0x97, 0xfc, 0x03, 0x00, 0x2a, + 0xc0, 0xe7, 0xff, 0x35, 0xc0, 0x15, 0x80, 0x52, 0x3f, 0xba, 0xff, 0x97, + 0xfc, 0x03, 0x00, 0x2a, 0x40, 0xe7, 0xff, 0x35, 0xe0, 0x15, 0x80, 0x52, + 0x3b, 0xba, 0xff, 0x97, 0xfc, 0x03, 0x00, 0x2a, 0x55, 0xff, 0xff, 0x17, + 0xfc, 0x03, 0x00, 0x2a, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0x32, 0xff, 0xff, 0x17, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0x2f, 0xff, 0xff, 0x17, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0x35, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xbd, 0x09, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0x7f, 0xb4, 0xff, 0x97, + 0x7f, 0x06, 0x00, 0x71, 0x20, 0x04, 0x00, 0x54, 0x73, 0x02, 0x00, 0x2a, + 0x33, 0x03, 0x00, 0x34, 0x01, 0x00, 0x80, 0x52, 0x00, 0x00, 0x80, 0x52, + 0x90, 0x26, 0x00, 0x94, 0x01, 0x00, 0x80, 0x52, 0x20, 0x00, 0x80, 0x52, + 0x8d, 0x26, 0x00, 0x94, 0xe0, 0x02, 0x00, 0xd0, 0x13, 0x40, 0x0a, 0x91, + 0x01, 0x00, 0x80, 0x52, 0x00, 0x48, 0x41, 0xf9, 0x9c, 0x1e, 0x00, 0x94, + 0x00, 0x02, 0x00, 0x35, 0x60, 0x06, 0x40, 0xf9, 0x01, 0x00, 0x80, 0x52, + 0x98, 0x1e, 0x00, 0x94, 0x80, 0x01, 0x00, 0x35, 0x01, 0x01, 0x80, 0x52, + 0x60, 0x02, 0x80, 0x52, 0x90, 0x43, 0x00, 0x94, 0xf3, 0x53, 0x41, 0xa9, + 0x21, 0x01, 0x80, 0x52, 0xfd, 0x7b, 0xc2, 0xa8, 0x80, 0x02, 0x80, 0x52, + 0x8b, 0x43, 0x00, 0x14, 0xc0, 0x00, 0x80, 0x52, 0x1d, 0x43, 0x00, 0x94, + 0xc0, 0xfc, 0xff, 0x34, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x93, 0x15, 0x80, 0x52, 0xe0, 0x03, 0x13, 0x2a, + 0x73, 0x06, 0x00, 0x11, 0x0d, 0xba, 0xff, 0x97, 0x20, 0xff, 0xff, 0x35, + 0x7f, 0xbe, 0x02, 0x71, 0x61, 0xff, 0xff, 0x54, 0xf3, 0x02, 0x00, 0xd0, + 0x60, 0xc2, 0x43, 0x39, 0xc0, 0x01, 0x00, 0x35, 0xf4, 0x02, 0x00, 0xd0, + 0x80, 0xc6, 0x43, 0x39, 0xc0, 0xfa, 0xff, 0x34, 0x01, 0x00, 0x80, 0xd2, + 0x60, 0x01, 0x80, 0x52, 0x2d, 0xb9, 0xff, 0x97, 0xa0, 0xfd, 0xff, 0x35, + 0x60, 0xc2, 0x43, 0x39, 0x60, 0x00, 0x00, 0x35, 0x80, 0xc6, 0x43, 0x39, + 0xc0, 0xf9, 0xff, 0x34, 0x1f, 0xb9, 0xff, 0x97, 0xcc, 0xff, 0xff, 0x17, + 0x01, 0x00, 0x80, 0xd2, 0x40, 0x01, 0x80, 0x52, 0x23, 0xb9, 0xff, 0x97, + 0x60, 0xfc, 0xff, 0x35, 0xf4, 0x02, 0x00, 0xd0, 0x80, 0xc6, 0x43, 0x39, + 0x00, 0xfe, 0xff, 0x35, 0x60, 0xc2, 0x43, 0x39, 0x60, 0xf8, 0xff, 0x34, + 0x14, 0xb9, 0xff, 0x97, 0xc1, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0x04, 0x00, 0x71, 0x22, 0x98, 0x45, 0x7a, + 0x69, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0xcf, 0xfc, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x01, 0x00, 0x34, 0x1f, 0x04, 0x00, 0x71, 0xe0, 0x00, 0x00, 0x54, + 0x63, 0x01, 0x00, 0x90, 0x63, 0xe0, 0x3d, 0x91, 0x22, 0x00, 0x80, 0x52, + 0x81, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x58, 0xe5, 0xff, 0x17, + 0xfd, 0x7b, 0xbf, 0xa9, 0x01, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0xc0, 0xfc, 0xff, 0x97, 0x60, 0x00, 0x00, 0x35, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xc1, 0xa8, 0xe2, 0x03, 0x00, 0x2a, + 0x63, 0x01, 0x00, 0x90, 0x63, 0xa0, 0x3e, 0x91, 0x81, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0x4a, 0xe5, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xe1, 0x02, 0x00, 0xb0, 0x22, 0x00, 0x29, 0x91, + 0xfd, 0x03, 0x00, 0x91, 0xe1, 0x03, 0x00, 0x2a, 0xf3, 0x0b, 0x00, 0xf9, + 0xf3, 0x03, 0x00, 0xaa, 0x00, 0x03, 0x80, 0xd2, 0x21, 0x08, 0x00, 0x9b, + 0x20, 0x84, 0x40, 0xa9, 0x78, 0x59, 0x00, 0x94, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xda, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0x1f, 0x1c, 0x00, 0x71, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xe8, 0x02, 0x00, 0x54, + 0xf3, 0x03, 0x01, 0x2a, 0xf4, 0x03, 0x00, 0x2a, 0x41, 0x09, 0x00, 0x94, + 0xe0, 0x03, 0x00, 0x2a, 0x02, 0x02, 0x00, 0x90, 0x42, 0x80, 0x2a, 0x91, + 0x03, 0x03, 0x80, 0xd2, 0x7f, 0x02, 0x00, 0x71, 0x73, 0x12, 0x9f, 0x9a, + 0x01, 0x00, 0x80, 0x52, 0x02, 0x08, 0x03, 0x9b, 0xe0, 0x83, 0x00, 0x91, + 0xf3, 0x17, 0x00, 0xf9, 0x42, 0x14, 0x40, 0xb9, 0xe2, 0x53, 0x04, 0x29, + 0xd4, 0xbf, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0x00, 0x02, 0x00, 0x35, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x33, 0x00, 0x80, 0x52, 0x22, 0x00, 0x80, 0x52, + 0x81, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x63, 0x01, 0x00, 0x90, + 0x63, 0xe0, 0x3f, 0x91, 0x17, 0xe5, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe2, 0x03, 0x00, 0x2a, 0x81, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0x63, 0x01, 0x00, 0x90, 0x63, 0x40, 0x3f, 0x91, 0x0d, 0xe5, 0xff, 0x97, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbc, 0xa9, 0x43, 0x10, 0x00, 0xb0, + 0x63, 0x60, 0x02, 0x91, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x03, 0x00, 0x2a, 0xe1, 0xc3, 0x00, 0x91, 0x02, 0x00, 0x80, 0x12, + 0xff, 0x7f, 0x03, 0xa9, 0x60, 0x78, 0x74, 0xf8, 0xba, 0xbf, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0xa0, 0x03, 0x00, 0x35, 0x01, 0x03, 0x80, 0xd2, + 0x02, 0x02, 0x00, 0x90, 0x42, 0x80, 0x2a, 0x91, 0xe0, 0x33, 0x40, 0xb9, + 0x81, 0x7e, 0x01, 0x9b, 0x43, 0x00, 0x01, 0x8b, 0x64, 0x04, 0x40, 0xb9, + 0xf5, 0x13, 0x00, 0xf9, 0xf5, 0x03, 0x14, 0xaa, 0x1f, 0x00, 0x04, 0x6b, + 0xc0, 0x02, 0x00, 0x54, 0x64, 0x08, 0x40, 0xb9, 0x1f, 0x00, 0x04, 0x6b, + 0x80, 0x04, 0x00, 0x54, 0x41, 0x68, 0x61, 0xb8, 0x1f, 0x00, 0x01, 0x6b, + 0x40, 0x03, 0x00, 0x54, 0x61, 0x0c, 0x40, 0xb9, 0x1f, 0x00, 0x01, 0x6b, + 0xa0, 0x07, 0x00, 0x54, 0x61, 0x10, 0x40, 0xb9, 0x1f, 0x00, 0x01, 0x6b, + 0x20, 0x08, 0x00, 0x54, 0x61, 0x14, 0x40, 0xb9, 0x1f, 0x00, 0x01, 0x6b, + 0x40, 0x04, 0x00, 0x54, 0xf5, 0x13, 0x40, 0xf9, 0x13, 0x81, 0x80, 0x52, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x02, 0x00, 0x90, 0x01, 0x30, 0x45, 0xf9, + 0xe0, 0x03, 0x14, 0x2a, 0x20, 0x00, 0x3f, 0xd6, 0xf3, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x02, 0x00, 0x90, + 0x01, 0x2c, 0x45, 0xf9, 0xe0, 0x03, 0x14, 0x2a, 0x20, 0x00, 0x3f, 0xd6, + 0xf3, 0x03, 0x00, 0x2a, 0xf5, 0x13, 0x40, 0xf9, 0xec, 0xff, 0xff, 0x17, + 0x00, 0x02, 0x00, 0x90, 0x01, 0x34, 0x45, 0xf9, 0xe0, 0x03, 0x14, 0x2a, + 0x20, 0x00, 0x3f, 0xd6, 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x02, 0x00, 0xd0, 0x00, 0x00, 0x04, 0x91, + 0xe4, 0x37, 0x40, 0xb9, 0xe5, 0x1f, 0x40, 0xf9, 0x00, 0x48, 0x74, 0x38, + 0x00, 0x01, 0x00, 0x34, 0xe0, 0x02, 0x00, 0xd0, 0x00, 0x40, 0x04, 0x91, + 0x01, 0x15, 0x80, 0xd2, 0x81, 0x02, 0x01, 0x9b, 0x21, 0x40, 0x40, 0xb9, + 0x3f, 0x00, 0x04, 0x6b, 0xe0, 0x02, 0x00, 0x54, 0x63, 0x01, 0x00, 0xb0, + 0x02, 0x00, 0x80, 0x52, 0x63, 0xa0, 0x00, 0x91, 0x81, 0x00, 0x80, 0x52, + 0x40, 0x00, 0x80, 0x52, 0xae, 0xe4, 0xff, 0x97, 0xf5, 0x13, 0x40, 0xf9, + 0xcd, 0xff, 0xff, 0x17, 0x00, 0x02, 0x00, 0x90, 0x01, 0x38, 0x45, 0xf9, + 0xe0, 0x03, 0x14, 0x2a, 0x20, 0x00, 0x3f, 0xd6, 0xf3, 0x03, 0x00, 0x2a, + 0xf5, 0x13, 0x40, 0xf9, 0xc6, 0xff, 0xff, 0x17, 0x00, 0x02, 0x00, 0x90, + 0x01, 0x3c, 0x45, 0xf9, 0xe0, 0x03, 0x14, 0x2a, 0x20, 0x00, 0x3f, 0xd6, + 0xf3, 0x03, 0x00, 0x2a, 0xf5, 0x13, 0x40, 0xf9, 0xbf, 0xff, 0xff, 0x17, + 0xc5, 0x00, 0x00, 0xb4, 0x01, 0x15, 0x80, 0xd2, 0x94, 0x02, 0x01, 0x9b, + 0x80, 0x12, 0x40, 0xb9, 0xbf, 0x00, 0x00, 0xeb, 0xa1, 0xfc, 0xff, 0x54, + 0x00, 0x02, 0x00, 0x90, 0x01, 0x40, 0x45, 0xf9, 0xe0, 0x03, 0x15, 0x2a, + 0x20, 0x00, 0x3f, 0xd6, 0xf3, 0x03, 0x00, 0x2a, 0xf5, 0x13, 0x40, 0xf9, + 0xb2, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x74, 0x01, 0x00, 0xb0, 0x94, 0x02, 0x02, 0x91, + 0xf3, 0x03, 0x00, 0x2a, 0xf5, 0x13, 0x00, 0xf9, 0x75, 0x01, 0x00, 0xb0, + 0xb5, 0xe2, 0x02, 0x91, 0x1f, 0x20, 0x03, 0xd5, 0xe0, 0x03, 0x13, 0x2a, + 0x7d, 0xff, 0xff, 0x97, 0xc0, 0xff, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, + 0x1f, 0x14, 0x2c, 0x71, 0xc1, 0x00, 0x00, 0x54, 0x81, 0x00, 0x80, 0x52, + 0xe3, 0x03, 0x14, 0xaa, 0xe0, 0x03, 0x01, 0x2a, 0x7d, 0xe4, 0xff, 0x97, + 0xf6, 0xff, 0xff, 0x17, 0xe3, 0x03, 0x15, 0xaa, 0x81, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x78, 0xe4, 0xff, 0x97, 0xf1, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0xb4, + 0x03, 0x00, 0x40, 0xf9, 0xe3, 0x03, 0x00, 0xb4, 0x5f, 0x04, 0x00, 0x71, + 0x20, 0x81, 0x80, 0x52, 0x49, 0x00, 0x00, 0x54, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xbd, 0xa9, 0xe4, 0x02, 0x00, 0xb0, 0x84, 0x00, 0x29, 0x91, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x02, 0x2a, + 0x02, 0x03, 0x80, 0xd2, 0xf5, 0x13, 0x00, 0xf9, 0x60, 0x00, 0x06, 0x91, + 0x62, 0x7e, 0x02, 0x9b, 0xf4, 0x03, 0x01, 0xaa, 0x95, 0x00, 0x02, 0x8b, + 0x83, 0x68, 0x22, 0xf8, 0xa0, 0x86, 0x00, 0xa9, 0x99, 0x58, 0x00, 0x94, + 0xe0, 0x02, 0x00, 0xd0, 0x00, 0x00, 0x0a, 0x91, 0x02, 0x00, 0x80, 0x52, + 0x21, 0x00, 0x80, 0x52, 0x00, 0x78, 0x73, 0xf8, 0x49, 0x20, 0x00, 0x94, + 0xe0, 0x00, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x02, 0x00, 0xd0, 0x00, 0x40, 0x0a, 0x91, + 0xe2, 0x03, 0x14, 0xaa, 0xa1, 0x06, 0x40, 0xf9, 0x00, 0x78, 0x73, 0xf8, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xdd, 0x1e, 0x00, 0x14, 0xfd, 0x7b, 0xb8, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x01, 0x2a, 0xf4, 0x03, 0x04, 0xaa, + 0x81, 0x3e, 0x80, 0x52, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x00, 0x2a, + 0xf6, 0x03, 0x02, 0x2a, 0x80, 0x00, 0x80, 0x52, 0xe2, 0xa3, 0x01, 0x91, + 0xf7, 0x63, 0x03, 0xa9, 0xf8, 0x03, 0x05, 0xaa, 0xf7, 0x03, 0x06, 0x2a, + 0xf9, 0x6b, 0x04, 0xa9, 0xf9, 0x03, 0x07, 0xaa, 0x7a, 0x1c, 0x00, 0x12, + 0xff, 0xff, 0x06, 0xa9, 0xff, 0x3f, 0x00, 0xf9, 0xd1, 0xac, 0xff, 0x97, + 0xe0, 0x01, 0x00, 0x34, 0x77, 0x04, 0x00, 0x35, 0xe2, 0x02, 0x00, 0xd0, + 0x42, 0xc0, 0x09, 0x91, 0xe1, 0x02, 0x00, 0xd0, 0x21, 0xa0, 0x09, 0x91, + 0x23, 0x00, 0x80, 0x52, 0x43, 0x58, 0x33, 0xb8, 0x3f, 0x48, 0x33, 0x38, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfd, 0x7b, 0xc8, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xfb, 0x2b, 0x00, 0xf9, 0x7f, 0x02, 0x00, 0x71, 0xfb, 0x07, 0x9f, 0x1a, + 0xe2, 0x03, 0x1a, 0x2a, 0x83, 0x86, 0x40, 0x39, 0xe1, 0x03, 0x16, 0x2a, + 0xe0, 0x03, 0x1b, 0x2a, 0xca, 0x44, 0x00, 0x94, 0x60, 0x01, 0x00, 0x35, + 0xe0, 0x03, 0x15, 0x2a, 0x37, 0xb9, 0xff, 0x97, 0x00, 0x01, 0x00, 0x35, + 0xdf, 0x0a, 0x00, 0x71, 0xe0, 0x0d, 0x00, 0x54, 0x81, 0x0a, 0x40, 0x79, + 0xe2, 0x83, 0x01, 0x91, 0x80, 0x06, 0x40, 0x79, 0x98, 0xad, 0xff, 0x97, + 0x20, 0x02, 0x00, 0x34, 0xfb, 0x2b, 0x40, 0xf9, 0xf7, 0xfb, 0xff, 0x34, + 0xe2, 0x02, 0x00, 0xd0, 0x42, 0xc0, 0x09, 0x91, 0xe1, 0x02, 0x00, 0xd0, + 0x21, 0xa0, 0x09, 0x91, 0x44, 0x00, 0x80, 0x52, 0x23, 0x00, 0x80, 0x52, + 0x44, 0x58, 0x33, 0xb8, 0x23, 0x48, 0x33, 0x38, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfd, 0x7b, 0xc8, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe1, 0x33, 0x40, 0xf9, + 0xe0, 0xa3, 0x01, 0x91, 0xe2, 0x03, 0x13, 0x2a, 0x8b, 0xff, 0xff, 0x97, + 0x80, 0xfd, 0xff, 0x35, 0xe0, 0x03, 0x14, 0xaa, 0xf8, 0x44, 0x00, 0x94, + 0x20, 0xfd, 0xff, 0x35, 0xba, 0x1e, 0x00, 0x12, 0xe1, 0x03, 0x18, 0xaa, + 0xe0, 0x03, 0x1a, 0x2a, 0x03, 0x47, 0x00, 0x94, 0x80, 0xfc, 0xff, 0x35, + 0xe0, 0x03, 0x1a, 0x2a, 0x01, 0x00, 0x80, 0x52, 0xff, 0x47, 0x00, 0x94, + 0x1f, 0x00, 0x00, 0x71, 0xc0, 0x0a, 0x44, 0x7a, 0x01, 0x01, 0x00, 0x54, + 0x81, 0x72, 0x41, 0x39, 0xe0, 0x03, 0x1a, 0x2a, 0xb5, 0x4a, 0x00, 0x94, + 0x40, 0xfb, 0xff, 0x35, 0x81, 0x62, 0x40, 0xb9, 0xe0, 0x03, 0x1a, 0x2a, + 0xf9, 0x4a, 0x00, 0x94, 0xc0, 0xfa, 0xff, 0x35, 0xe0, 0x03, 0x1b, 0x2a, + 0x21, 0x00, 0x80, 0x52, 0x55, 0x49, 0x00, 0x94, 0x40, 0xfa, 0xff, 0x35, + 0xe0, 0x03, 0x1b, 0x2a, 0xd2, 0x48, 0x00, 0x94, 0xe0, 0xf9, 0xff, 0x35, + 0xe1, 0x83, 0x40, 0xb9, 0x3f, 0x04, 0x00, 0x71, 0x80, 0x02, 0x00, 0x54, + 0x80, 0x82, 0x40, 0x39, 0x60, 0x00, 0x00, 0x34, 0x80, 0x26, 0x40, 0xb9, + 0xc0, 0x06, 0x00, 0x35, 0xe0, 0x03, 0x15, 0x2a, 0x41, 0x08, 0x80, 0x52, + 0xeb, 0x40, 0x00, 0x94, 0x77, 0x05, 0x00, 0x34, 0xe2, 0x02, 0x00, 0xd0, + 0x42, 0xc0, 0x09, 0x91, 0xe1, 0x02, 0x00, 0xd0, 0x21, 0xa0, 0x09, 0x91, + 0x44, 0x00, 0x80, 0x52, 0x23, 0x00, 0x80, 0x52, 0x44, 0x58, 0x33, 0xb8, + 0x23, 0x48, 0x33, 0x38, 0x80, 0x01, 0x00, 0x34, 0xfb, 0x2b, 0x40, 0xf9, + 0xa0, 0xff, 0xff, 0x17, 0xf7, 0x03, 0x00, 0x34, 0xe1, 0x02, 0x00, 0xd0, + 0x21, 0xc0, 0x09, 0x91, 0xe0, 0x02, 0x00, 0xd0, 0x00, 0xa0, 0x09, 0x91, + 0x42, 0x00, 0x80, 0x52, 0x22, 0x58, 0x33, 0xb8, 0xe1, 0x03, 0x42, 0x39, + 0x01, 0x48, 0x33, 0x38, 0xe1, 0x03, 0x19, 0xaa, 0xe0, 0x03, 0x1a, 0x2a, + 0x22, 0x00, 0x80, 0x52, 0x0a, 0xf4, 0xff, 0x97, 0x20, 0xfe, 0xff, 0x35, + 0xe2, 0xff, 0xff, 0xf0, 0x42, 0x00, 0x1e, 0x91, 0xe0, 0x03, 0x1a, 0x2a, + 0x21, 0x00, 0x80, 0x52, 0x24, 0xf2, 0xff, 0x97, 0x60, 0xfd, 0xff, 0x35, + 0x22, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x1a, 0x2a, 0xe1, 0x03, 0x02, 0x2a, + 0x5f, 0xf1, 0xff, 0x97, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x2b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc8, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xfb, 0x2b, 0x40, 0xf9, + 0x78, 0xff, 0xff, 0x17, 0x80, 0xaa, 0x40, 0x79, 0xe1, 0x83, 0x01, 0x91, + 0x4f, 0xad, 0xff, 0x97, 0x80, 0xf2, 0xff, 0x35, 0xa3, 0xff, 0xff, 0x17, + 0xe0, 0x03, 0x15, 0x2a, 0x61, 0x08, 0x80, 0x52, 0xb6, 0x40, 0x00, 0x94, + 0xcb, 0xff, 0xff, 0x17, 0xff, 0xc3, 0x03, 0xd1, 0xfd, 0x7b, 0x01, 0xa9, + 0xfd, 0x43, 0x00, 0x91, 0xf3, 0x53, 0x02, 0xa9, 0xf3, 0x03, 0x01, 0x2a, + 0xf4, 0x03, 0x02, 0x2a, 0xe2, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x01, 0x2a, + 0xe1, 0x23, 0x01, 0x91, 0xf5, 0x5b, 0x03, 0xa9, 0xf5, 0x03, 0x03, 0x2a, + 0x96, 0x1c, 0x00, 0x12, 0xc4, 0x0c, 0x00, 0x94, 0xe6, 0xb7, 0x40, 0xb9, + 0xe4, 0x23, 0x01, 0x91, 0xff, 0x03, 0x00, 0xb9, 0xe2, 0x03, 0x15, 0x2a, + 0xe1, 0x03, 0x14, 0x2a, 0xe3, 0x03, 0x16, 0x2a, 0xe7, 0xe3, 0x02, 0x91, + 0xe0, 0x03, 0x13, 0x2a, 0x85, 0x90, 0x01, 0x91, 0x42, 0xff, 0xff, 0x97, + 0xfd, 0x7b, 0x41, 0xa9, 0xf3, 0x53, 0x42, 0xa9, 0xf5, 0x5b, 0x43, 0xa9, + 0xff, 0xc3, 0x03, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0xff, 0xc3, 0x05, 0xd1, + 0xfd, 0x7b, 0x01, 0xa9, 0xfd, 0x43, 0x00, 0x91, 0xf3, 0x53, 0x02, 0xa9, + 0x14, 0x2e, 0x80, 0x52, 0xf5, 0x5b, 0x03, 0xa9, 0xf7, 0x63, 0x04, 0xa9, + 0xf8, 0x03, 0x00, 0x2a, 0xf5, 0x03, 0x18, 0xaa, 0xf9, 0x6b, 0x05, 0xa9, + 0xfb, 0x73, 0x06, 0xa9, 0x65, 0x09, 0x00, 0x94, 0xe1, 0x02, 0x00, 0xd0, + 0x22, 0x40, 0x04, 0x91, 0x01, 0x15, 0x80, 0xd2, 0x1f, 0x03, 0x00, 0x71, + 0xf9, 0x03, 0x00, 0xaa, 0xe0, 0x07, 0x9f, 0x1a, 0xe0, 0x7b, 0x00, 0xb9, + 0x01, 0x0b, 0x01, 0x9b, 0xff, 0xff, 0x08, 0xa9, 0xbc, 0x1b, 0x80, 0x52, + 0xff, 0x4f, 0x00, 0xf9, 0x33, 0xd8, 0x47, 0x29, 0xd7, 0x1e, 0x00, 0x12, + 0xe0, 0x03, 0x13, 0x2a, 0xe1, 0x03, 0x17, 0x2a, 0x39, 0x0d, 0x00, 0x94, + 0x1f, 0x03, 0x00, 0x71, 0xfb, 0x03, 0x00, 0x2a, 0xe1, 0x2d, 0x80, 0x52, + 0x60, 0x1b, 0x80, 0x52, 0x94, 0x12, 0x81, 0x1a, 0x9c, 0x13, 0x80, 0x1a, + 0x7f, 0x1a, 0x00, 0x71, 0xc0, 0x22, 0x00, 0x54, 0xa8, 0x0e, 0x00, 0x54, + 0x7f, 0x12, 0x00, 0x71, 0x60, 0x21, 0x00, 0x54, 0x7f, 0x16, 0x00, 0x71, + 0x21, 0x02, 0x00, 0x54, 0xe4, 0x03, 0x1b, 0x2a, 0xe2, 0x03, 0x18, 0x2a, + 0xe1, 0x03, 0x16, 0x2a, 0xe0, 0x03, 0x13, 0x2a, 0x43, 0x00, 0x80, 0x52, + 0xb6, 0xff, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x14, 0x2a, + 0xfd, 0x7b, 0x41, 0xa9, 0xf3, 0x53, 0x42, 0xa9, 0xf5, 0x5b, 0x43, 0xa9, + 0xf7, 0x63, 0x44, 0xa9, 0xf9, 0x6b, 0x45, 0xa9, 0xfb, 0x73, 0x46, 0xa9, + 0xff, 0xc3, 0x05, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0x7f, 0x0a, 0x00, 0x71, + 0x69, 0x11, 0x00, 0x54, 0x7f, 0x0e, 0x00, 0x71, 0x41, 0x11, 0x00, 0x54, + 0x62, 0x01, 0x80, 0xd2, 0xfa, 0x02, 0x00, 0xd0, 0x5a, 0xa3, 0x13, 0x91, + 0xe3, 0x02, 0x00, 0xd0, 0x63, 0xc0, 0x09, 0x91, 0x02, 0x7f, 0x02, 0x9b, + 0x33, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x16, 0x2a, 0x41, 0x03, 0x02, 0x8b, + 0x73, 0x78, 0x38, 0xb8, 0x53, 0x6b, 0x22, 0x38, 0x33, 0x04, 0x00, 0x39, + 0x33, 0x08, 0x00, 0x39, 0x3f, 0x0c, 0x00, 0x39, 0x3f, 0x10, 0x00, 0x39, + 0x3f, 0x14, 0x00, 0x39, 0x3f, 0x18, 0x00, 0x39, 0x3f, 0x1c, 0x00, 0x39, + 0x3f, 0x20, 0x00, 0x39, 0x3f, 0x24, 0x00, 0x39, 0x3f, 0x28, 0x00, 0x39, + 0x4e, 0xb8, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0x80, 0xfb, 0xff, 0x35, + 0xe1, 0x23, 0x03, 0x91, 0xe0, 0x03, 0x16, 0x2a, 0x02, 0x00, 0x80, 0x52, + 0x44, 0x0b, 0x00, 0x94, 0xe1, 0x23, 0x03, 0x91, 0xe0, 0x03, 0x17, 0x2a, + 0x02, 0x00, 0x80, 0x52, 0x74, 0xf3, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0x40, 0xfa, 0xff, 0x35, 0xe2, 0x03, 0x13, 0x2a, 0xe1, 0x23, 0x03, 0x91, + 0xe0, 0x03, 0x16, 0x2a, 0x3a, 0x0b, 0x00, 0x94, 0xe2, 0x03, 0x13, 0x2a, + 0xe1, 0x23, 0x03, 0x91, 0xe0, 0x03, 0x17, 0x2a, 0x6a, 0xf3, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0x00, 0xf9, 0xff, 0x35, 0xe0, 0x03, 0x16, 0x2a, + 0xe1, 0x23, 0x03, 0x91, 0x42, 0x00, 0x80, 0x52, 0x30, 0x0b, 0x00, 0x94, + 0xe1, 0x23, 0x03, 0x91, 0xe0, 0x03, 0x18, 0x2a, 0x42, 0x00, 0x80, 0x52, + 0x60, 0xf3, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0xc0, 0xf7, 0xff, 0x35, + 0x61, 0x01, 0x80, 0xd2, 0xe0, 0x03, 0x17, 0x2a, 0x18, 0x6b, 0x01, 0x9b, + 0xe1, 0x03, 0x18, 0xaa, 0xa5, 0xf1, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0xe0, 0xf6, 0xff, 0x35, 0xe1, 0x03, 0x18, 0xaa, 0xe0, 0x03, 0x17, 0x2a, + 0xbc, 0xf0, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0x40, 0xf6, 0xff, 0x35, + 0x20, 0x4b, 0x40, 0xb9, 0x80, 0x00, 0x00, 0x34, 0x20, 0x9f, 0x40, 0xb9, + 0x1f, 0x00, 0x13, 0x6b, 0xa1, 0xf5, 0xff, 0x54, 0xbf, 0x02, 0x00, 0x71, + 0xa2, 0x3d, 0x80, 0x52, 0x40, 0x1c, 0x80, 0x52, 0xe1, 0x03, 0x17, 0x2a, + 0x73, 0x1c, 0x80, 0x52, 0x13, 0x00, 0x93, 0x1a, 0xc0, 0x3d, 0x80, 0x52, + 0x40, 0x00, 0x80, 0x1a, 0xa4, 0x40, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, + 0x40, 0xf4, 0xff, 0x35, 0xe0, 0x03, 0x13, 0x2a, 0x21, 0x00, 0x80, 0x52, + 0x0b, 0x40, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, 0xa0, 0xf3, 0xff, 0x35, + 0xe1, 0x03, 0x18, 0xaa, 0xe0, 0x03, 0x17, 0x2a, 0xbe, 0xf0, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0x98, 0xff, 0xff, 0x17, 0x7f, 0x2a, 0x00, 0x71, + 0xc8, 0x05, 0x00, 0x54, 0x7f, 0x22, 0x00, 0x71, 0xa8, 0x14, 0x00, 0x54, + 0xe3, 0x03, 0x08, 0x91, 0xfa, 0x23, 0x03, 0x91, 0xe0, 0x03, 0x16, 0x2a, + 0xe2, 0x03, 0x13, 0x2a, 0xe1, 0x03, 0x1a, 0xaa, 0xff, 0xff, 0x0c, 0xa9, + 0x7f, 0xfc, 0x30, 0xa9, 0xe3, 0x43, 0x08, 0x91, 0xff, 0xff, 0x0d, 0xa9, + 0x7f, 0xfc, 0x30, 0xa9, 0x7f, 0xfc, 0x31, 0xa9, 0x7f, 0xfc, 0x32, 0xa9, + 0x7f, 0xfc, 0x33, 0xa9, 0x7f, 0xfc, 0x34, 0xa9, 0xff, 0xff, 0x0e, 0xa9, + 0xff, 0xff, 0x0f, 0xa9, 0xff, 0x6b, 0x01, 0xb9, 0x06, 0x0c, 0x00, 0x94, + 0xe0, 0x63, 0x41, 0xb9, 0xe0, 0x1e, 0x00, 0x34, 0xe2, 0x67, 0x41, 0xb9, + 0xf7, 0x0a, 0x1b, 0x53, 0x1f, 0x04, 0x00, 0x71, 0xe2, 0x12, 0x02, 0x2a, + 0x42, 0x1c, 0x00, 0x12, 0x41, 0x04, 0x1e, 0x32, 0xa0, 0x1f, 0x00, 0x54, + 0x1f, 0x08, 0x00, 0x71, 0x40, 0x2f, 0x00, 0x54, 0x1f, 0x0c, 0x00, 0x71, + 0x00, 0x1f, 0x00, 0x54, 0x1f, 0x10, 0x00, 0x71, 0x60, 0x2f, 0x00, 0x54, + 0xe0, 0x03, 0x14, 0x2a, 0x71, 0x40, 0x00, 0x94, 0xe1, 0xa3, 0x45, 0x39, + 0xe0, 0x03, 0x1c, 0x2a, 0x74, 0x80, 0x80, 0x52, 0x6d, 0x40, 0x00, 0x94, + 0x6c, 0xff, 0xff, 0x17, 0xd3, 0x02, 0x00, 0x35, 0x74, 0x80, 0x80, 0x52, + 0x69, 0xff, 0xff, 0x17, 0x7f, 0x2e, 0x00, 0x71, 0xa1, 0xff, 0xff, 0x54, + 0xfa, 0x23, 0x03, 0x91, 0xe0, 0x03, 0x16, 0x2a, 0xe1, 0x03, 0x1a, 0xaa, + 0x3f, 0x0b, 0x00, 0x94, 0xe0, 0x23, 0x43, 0x39, 0x20, 0x05, 0x00, 0x35, + 0xe2, 0x23, 0x02, 0x91, 0x81, 0x3e, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, + 0x4d, 0xab, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0x60, 0x1d, 0x00, 0x34, + 0xe0, 0x02, 0x00, 0xd0, 0x00, 0xc0, 0x09, 0x91, 0x21, 0x00, 0x80, 0x52, + 0x01, 0x78, 0x38, 0xb8, 0x56, 0xff, 0xff, 0x17, 0x7f, 0x06, 0x00, 0x71, + 0x00, 0x22, 0x00, 0x54, 0xfa, 0x23, 0x03, 0x91, 0xe0, 0x03, 0x16, 0x2a, + 0xe1, 0x03, 0x1a, 0xaa, 0x13, 0x00, 0x80, 0x52, 0x9b, 0x0b, 0x00, 0x94, + 0xe0, 0x02, 0x00, 0xd0, 0x00, 0xc0, 0x09, 0x91, 0xe1, 0xcb, 0x40, 0xb9, + 0x39, 0x00, 0x80, 0x52, 0x19, 0x78, 0x38, 0xb8, 0x41, 0x21, 0x00, 0x34, + 0x3f, 0x04, 0x00, 0x71, 0x14, 0x00, 0x80, 0x52, 0xc1, 0xe8, 0xff, 0x54, + 0xff, 0x03, 0x00, 0xb9, 0x44, 0xa3, 0x00, 0x91, 0xe3, 0x03, 0x1b, 0x2a, + 0xe1, 0x03, 0x15, 0x2a, 0xe0, 0x03, 0x16, 0x2a, 0x65, 0x01, 0x00, 0xb0, + 0x07, 0x00, 0x80, 0xd2, 0xa5, 0x60, 0x08, 0x91, 0x06, 0x00, 0x80, 0x52, + 0x02, 0x00, 0x80, 0x52, 0x47, 0xfe, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0x39, 0xff, 0xff, 0x17, 0xfc, 0x23, 0x02, 0x91, 0x81, 0x3e, 0x80, 0x52, + 0xe2, 0x03, 0x1c, 0xaa, 0xc0, 0x00, 0x80, 0x52, 0x24, 0xab, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0x00, 0xfb, 0xff, 0x35, 0xe2, 0xc3, 0x41, 0x79, + 0xe1, 0x83, 0x02, 0x91, 0x5f, 0x00, 0x40, 0xf2, 0xe0, 0x17, 0x9f, 0x9a, + 0x00, 0x20, 0x22, 0x8b, 0x00, 0x04, 0x00, 0x91, 0x1b, 0xac, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0xe0, 0xf9, 0xff, 0x35, 0xe1, 0x53, 0x40, 0xf9, + 0xe2, 0x03, 0x18, 0x2a, 0xe0, 0x03, 0x1c, 0xaa, 0x05, 0xfe, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0x20, 0xf9, 0xff, 0x35, 0xe3, 0x97, 0x43, 0x39, + 0xe2, 0x03, 0x1b, 0x2a, 0xf3, 0x7b, 0x40, 0xb9, 0x21, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x13, 0x2a, 0x1d, 0x43, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, + 0x20, 0xf8, 0xff, 0x35, 0x41, 0x13, 0x00, 0x91, 0xe0, 0x03, 0x13, 0x2a, + 0x02, 0x00, 0x80, 0x52, 0x1f, 0x44, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, + 0x60, 0xf7, 0xff, 0x35, 0x82, 0x00, 0x80, 0x52, 0x41, 0x33, 0x02, 0x91, + 0xe0, 0x03, 0x17, 0x2a, 0xe2, 0x5b, 0x01, 0xb9, 0x8c, 0x44, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0x80, 0xf6, 0xff, 0x35, 0xe0, 0x03, 0x17, 0x2a, + 0x21, 0x00, 0x80, 0x52, 0x6b, 0x46, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, + 0xe0, 0xf5, 0xff, 0x35, 0xe0, 0x03, 0x13, 0x2a, 0x21, 0x00, 0x80, 0x52, + 0xca, 0x47, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, 0x40, 0xf5, 0xff, 0x35, + 0xe0, 0x03, 0x13, 0x2a, 0x46, 0x47, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, + 0xa6, 0xff, 0xff, 0x17, 0xe4, 0x03, 0x1b, 0x2a, 0xe2, 0x03, 0x18, 0x2a, + 0xe1, 0x03, 0x16, 0x2a, 0xe3, 0x03, 0x13, 0x2a, 0xe0, 0x03, 0x13, 0x2a, + 0xae, 0xfe, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0xf8, 0xfe, 0xff, 0x17, + 0xe4, 0x03, 0x1b, 0x2a, 0xe2, 0x03, 0x18, 0x2a, 0xe1, 0x03, 0x16, 0x2a, + 0xe0, 0x03, 0x13, 0x2a, 0x63, 0x00, 0x80, 0x52, 0xa6, 0xfe, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0xf0, 0xfe, 0xff, 0x17, 0xfb, 0x02, 0x00, 0xb0, + 0x60, 0xa3, 0x13, 0x91, 0x7b, 0x01, 0x80, 0xd2, 0xfa, 0x02, 0x00, 0xb0, + 0x41, 0xc3, 0x09, 0x91, 0x7f, 0x26, 0x00, 0x71, 0x1b, 0x03, 0x1b, 0x9b, + 0x15, 0x1f, 0x00, 0x12, 0xf9, 0x17, 0x9f, 0x1a, 0xfa, 0x23, 0x03, 0x91, + 0x13, 0x00, 0x80, 0xd2, 0x1c, 0x00, 0x80, 0x52, 0x14, 0x00, 0x80, 0x52, + 0x3f, 0x78, 0x38, 0xb8, 0xe1, 0x3f, 0x00, 0xf9, 0xe1, 0x03, 0x1a, 0xaa, + 0xe3, 0x03, 0x19, 0x2a, 0xe2, 0x03, 0x13, 0x2a, 0xe0, 0x03, 0x16, 0x2a, + 0x90, 0x0a, 0x00, 0x94, 0xe1, 0x9f, 0x43, 0x39, 0x3f, 0x04, 0x00, 0x71, + 0x21, 0x01, 0x00, 0x54, 0x7f, 0x0a, 0x00, 0xf1, 0xe1, 0x03, 0x1a, 0xaa, + 0xe2, 0x03, 0x13, 0x2a, 0xa0, 0x02, 0x97, 0x1a, 0x3c, 0x00, 0x80, 0x52, + 0x73, 0xf2, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0xe1, 0x9f, 0x43, 0x39, + 0x3f, 0x00, 0x00, 0x71, 0xe0, 0x07, 0x9f, 0x1a, 0x60, 0x6b, 0x33, 0x38, + 0x73, 0x06, 0x00, 0x91, 0x7f, 0x2e, 0x00, 0xf1, 0x61, 0xfd, 0xff, 0x54, + 0xbc, 0x00, 0x00, 0x34, 0xe1, 0x3f, 0x40, 0xf9, 0x20, 0x78, 0x78, 0xb8, + 0x00, 0x04, 0x00, 0x11, 0x20, 0x78, 0x38, 0xb8, 0x15, 0x0b, 0x18, 0x8b, + 0xe0, 0x02, 0x00, 0xb0, 0x00, 0x80, 0x10, 0x91, 0x13, 0x00, 0x80, 0xd2, + 0x15, 0x04, 0x15, 0x8b, 0x1c, 0x00, 0x80, 0x52, 0x07, 0x00, 0x00, 0x14, + 0x3f, 0x00, 0x00, 0x71, 0xe0, 0x07, 0x9f, 0x1a, 0xa0, 0x6a, 0x33, 0x38, + 0x73, 0x06, 0x00, 0x91, 0x7f, 0x2a, 0x00, 0xf1, 0xc0, 0x02, 0x00, 0x54, + 0xe1, 0x83, 0x02, 0x91, 0xe3, 0x03, 0x19, 0x2a, 0xe2, 0x03, 0x13, 0x2a, + 0xe0, 0x03, 0x16, 0x2a, 0x40, 0x0a, 0x00, 0x94, 0xe1, 0xef, 0x42, 0x39, + 0x3f, 0x04, 0x00, 0x71, 0x61, 0xfe, 0xff, 0x54, 0xe2, 0x03, 0x13, 0x2a, + 0xe1, 0x83, 0x02, 0x91, 0xe0, 0x03, 0x17, 0x2a, 0xb1, 0xee, 0xff, 0x97, + 0xe1, 0xef, 0x42, 0x39, 0xf4, 0x03, 0x00, 0x2a, 0x3c, 0x00, 0x80, 0x52, + 0x3f, 0x00, 0x00, 0x71, 0xe0, 0x07, 0x9f, 0x1a, 0xa0, 0x6a, 0x33, 0x38, + 0x73, 0x06, 0x00, 0x91, 0x7f, 0x2a, 0x00, 0xf1, 0x81, 0xfd, 0xff, 0x54, + 0xbc, 0x00, 0x00, 0x34, 0xe1, 0x3f, 0x40, 0xf9, 0x20, 0x78, 0x78, 0xb8, + 0x00, 0x04, 0x00, 0x11, 0x20, 0x78, 0x38, 0xb8, 0xd4, 0xd3, 0xff, 0x35, + 0xe1, 0x03, 0x1b, 0xaa, 0xe0, 0x03, 0x17, 0x2a, 0x87, 0xf0, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0x20, 0xd3, 0xff, 0x35, 0xe1, 0x03, 0x15, 0xaa, + 0xe0, 0x03, 0x17, 0x2a, 0x0e, 0xf1, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0x80, 0xd2, 0xff, 0x35, 0xe1, 0x03, 0x1b, 0xaa, 0xe0, 0x03, 0x17, 0x2a, + 0x99, 0xef, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0xe0, 0xd1, 0xff, 0x35, + 0xe1, 0x03, 0x15, 0xaa, 0xe0, 0x03, 0x17, 0x2a, 0xcc, 0xef, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0x8a, 0xfe, 0xff, 0x17, 0xe6, 0x37, 0x41, 0xb9, + 0xe3, 0x03, 0x1b, 0x2a, 0xff, 0x03, 0x00, 0xb9, 0xe1, 0x03, 0x15, 0x2a, + 0xe0, 0x03, 0x16, 0x2a, 0x47, 0xc3, 0x01, 0x91, 0x45, 0x93, 0x01, 0x91, + 0xe4, 0x03, 0x1a, 0xaa, 0x02, 0x00, 0x80, 0x52, 0x8c, 0xfd, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0x7e, 0xfe, 0xff, 0x17, 0x41, 0x08, 0x1f, 0x32, + 0xe0, 0x03, 0x14, 0x2a, 0x7b, 0x3f, 0x00, 0x94, 0xe1, 0xa3, 0x45, 0x39, + 0xe0, 0x03, 0x1c, 0x2a, 0x78, 0x3f, 0x00, 0x94, 0xe0, 0x63, 0x41, 0xb9, + 0xa0, 0xfd, 0xff, 0x34, 0x20, 0x00, 0x80, 0x52, 0xe6, 0x37, 0x41, 0xb9, + 0xe3, 0x03, 0x1b, 0x2a, 0xe0, 0x03, 0x00, 0xb9, 0xeb, 0xff, 0xff, 0x17, + 0xe3, 0x47, 0x44, 0x39, 0xe2, 0x03, 0x1b, 0x2a, 0xe0, 0x7b, 0x40, 0xb9, + 0x01, 0x00, 0x80, 0x52, 0x6c, 0x42, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, + 0x00, 0xe2, 0xff, 0x35, 0xe0, 0x03, 0x16, 0x2a, 0xd8, 0xb6, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0x80, 0xe1, 0xff, 0x35, 0xe1, 0xeb, 0x41, 0x79, + 0xe2, 0x83, 0x02, 0x91, 0xe0, 0xe7, 0x41, 0x79, 0x3a, 0xab, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0xc0, 0xe0, 0xff, 0x35, 0xe1, 0x53, 0x40, 0xf9, + 0xe2, 0x03, 0x18, 0x2a, 0xe0, 0x23, 0x02, 0x91, 0x3c, 0xfd, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0x00, 0xe0, 0xff, 0x35, 0x40, 0xa3, 0x00, 0x91, + 0xa8, 0x42, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, 0x80, 0xdf, 0xff, 0x35, + 0x41, 0x33, 0x02, 0x91, 0xe0, 0x03, 0x17, 0x2a, 0xcf, 0x43, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0xe0, 0xde, 0xff, 0x35, 0xe0, 0x03, 0x17, 0x2a, + 0x21, 0x00, 0x80, 0x52, 0xae, 0x45, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, + 0x40, 0xde, 0xff, 0x35, 0xf3, 0x7b, 0x40, 0xb9, 0x21, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x13, 0x2a, 0x0c, 0x47, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, + 0x60, 0xe8, 0xff, 0x34, 0xeb, 0xfe, 0xff, 0x17, 0xfa, 0x23, 0x03, 0x91, + 0xe0, 0x03, 0x16, 0x2a, 0xe1, 0x03, 0x1a, 0xaa, 0x55, 0x0a, 0x00, 0x94, + 0xf2, 0xfe, 0xff, 0x17, 0xfc, 0x23, 0x02, 0x91, 0x81, 0x3e, 0x80, 0x52, + 0xe2, 0x03, 0x1c, 0xaa, 0xc0, 0x00, 0x80, 0x52, 0x2b, 0xaa, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0x20, 0xc7, 0xff, 0x35, 0xe2, 0xc3, 0x41, 0x79, + 0xe1, 0x83, 0x02, 0x91, 0x5f, 0x00, 0x40, 0xf2, 0xe0, 0x17, 0x9f, 0x9a, + 0x00, 0x20, 0x22, 0x8b, 0x00, 0x04, 0x00, 0x91, 0x22, 0xab, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0x00, 0xc6, 0xff, 0x35, 0xe1, 0x53, 0x40, 0xf9, + 0xe2, 0x03, 0x15, 0x2a, 0xe0, 0x03, 0x1c, 0xaa, 0x0c, 0xfd, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0x40, 0xc5, 0xff, 0x35, 0xe3, 0x97, 0x43, 0x39, + 0xe2, 0x03, 0x1b, 0x2a, 0xe0, 0x7b, 0x40, 0xb9, 0xe1, 0x03, 0x19, 0x2a, + 0x25, 0x42, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, 0x60, 0xc4, 0xff, 0x35, + 0xf5, 0x02, 0x00, 0xb0, 0xa0, 0xe2, 0x49, 0x39, 0x40, 0x05, 0x00, 0x34, + 0xe1, 0x03, 0x13, 0x2a, 0xe0, 0x03, 0x16, 0x2a, 0xc9, 0x21, 0x00, 0x94, + 0xf3, 0x7b, 0x40, 0xb9, 0x41, 0x13, 0x00, 0x91, 0x42, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x13, 0x2a, 0x20, 0x43, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, + 0xc0, 0xc2, 0xff, 0x35, 0xe0, 0x03, 0x17, 0x2a, 0x01, 0x00, 0x80, 0x52, + 0x73, 0x45, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, 0x20, 0xc2, 0xff, 0x35, + 0xe0, 0x03, 0x13, 0x2a, 0x21, 0x00, 0x80, 0x52, 0xd2, 0x46, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0x80, 0xc1, 0xff, 0x35, 0xe0, 0x03, 0x13, 0x2a, + 0x4e, 0x46, 0x00, 0x94, 0xa1, 0xe2, 0x49, 0x39, 0xf4, 0x03, 0x00, 0x2a, + 0xa1, 0x01, 0x00, 0x35, 0xc0, 0xc0, 0xff, 0x35, 0xe1, 0xa7, 0x41, 0x79, + 0xe0, 0x03, 0x16, 0x2a, 0xcf, 0x21, 0x00, 0x94, 0xe0, 0x03, 0x16, 0x2a, + 0x41, 0x08, 0x80, 0x52, 0x68, 0x3e, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, + 0xfe, 0xfd, 0xff, 0x17, 0xa1, 0x01, 0x80, 0x52, 0x41, 0x00, 0x01, 0x2a, + 0x7f, 0xff, 0xff, 0x17, 0x00, 0xff, 0xff, 0x34, 0xf9, 0xfd, 0xff, 0x17, + 0x41, 0x0c, 0x00, 0x32, 0x7b, 0xff, 0xff, 0x17, 0xe2, 0xa7, 0x41, 0x79, + 0xe3, 0x03, 0x13, 0x2a, 0xe1, 0xab, 0x41, 0x79, 0xe0, 0x03, 0x16, 0x2a, + 0x72, 0xb6, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0x00, 0xbe, 0xff, 0x35, + 0xd3, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x02, 0x00, 0xb0, 0x94, 0x02, 0x04, 0x91, 0xf7, 0x63, 0x03, 0xa9, + 0xf7, 0x03, 0x00, 0x2a, 0xf5, 0x5b, 0x02, 0xa9, 0x24, 0x07, 0x00, 0x94, + 0xf5, 0x03, 0x00, 0xaa, 0x80, 0x4a, 0x77, 0x38, 0xa0, 0x01, 0x00, 0x35, + 0xe0, 0x02, 0x00, 0xb0, 0x00, 0x20, 0x04, 0x91, 0xf3, 0x03, 0x17, 0xaa, + 0x16, 0x00, 0x80, 0x52, 0x00, 0x48, 0x77, 0x38, 0xc0, 0x01, 0x00, 0x35, + 0xe0, 0x03, 0x16, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x16, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x16, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf8, 0x02, 0x00, 0xb0, 0x18, 0x43, 0x04, 0x91, + 0xe0, 0x03, 0x17, 0x2a, 0xf9, 0x23, 0x00, 0xf9, 0xad, 0x07, 0x00, 0x94, + 0x40, 0x07, 0x00, 0x35, 0x19, 0x15, 0x80, 0xd2, 0xe0, 0x03, 0x13, 0x2a, + 0xf9, 0x62, 0x19, 0x9b, 0xe1, 0x03, 0x19, 0xaa, 0x27, 0x07, 0x00, 0x94, + 0xf6, 0x03, 0x00, 0x2a, 0xe0, 0x05, 0x00, 0x35, 0x20, 0x17, 0x40, 0xb9, + 0x1f, 0x04, 0x00, 0x71, 0x00, 0x01, 0x00, 0x54, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, 0xaf, 0x07, 0x00, 0x14, + 0xa1, 0x4a, 0x40, 0xb9, 0x7f, 0x06, 0x00, 0x71, 0xe0, 0x17, 0x9f, 0x1a, + 0xe1, 0x05, 0x00, 0x34, 0x22, 0x9f, 0x40, 0xb9, 0x5f, 0x04, 0x00, 0x71, + 0x80, 0x05, 0x00, 0x54, 0x4b, 0x46, 0x00, 0x94, 0xe0, 0x03, 0x13, 0x2a, + 0x7d, 0xfd, 0xff, 0x97, 0x01, 0x15, 0x80, 0xd2, 0xe4, 0x03, 0x00, 0x2a, + 0xf5, 0x03, 0x04, 0xaa, 0xe0, 0x03, 0x13, 0x2a, 0xe1, 0x62, 0x01, 0x9b, + 0x03, 0x00, 0x80, 0x52, 0x22, 0x84, 0x47, 0x29, 0x5d, 0xf9, 0xff, 0x97, + 0xf6, 0x03, 0x00, 0x2a, 0x75, 0x00, 0x00, 0x35, 0x20, 0x00, 0x80, 0x52, + 0x80, 0x4a, 0x33, 0x38, 0x00, 0x15, 0x80, 0xd2, 0xdf, 0x02, 0x00, 0x71, + 0xd6, 0x12, 0x95, 0x1a, 0xf7, 0x62, 0x00, 0x9b, 0xe1, 0x3e, 0x40, 0xb9, + 0xe0, 0x02, 0x41, 0x39, 0x22, 0x24, 0x00, 0x51, 0x5f, 0x04, 0x00, 0x71, + 0x24, 0x88, 0x43, 0x7a, 0xc1, 0x02, 0x00, 0x54, 0x00, 0x88, 0x00, 0x11, + 0x69, 0xe0, 0xff, 0x97, 0xf6, 0xfa, 0xff, 0x34, 0x1f, 0x20, 0x03, 0xd5, + 0xe0, 0x03, 0x13, 0x2a, 0x89, 0x07, 0x00, 0x94, 0xf9, 0x23, 0x40, 0xf9, + 0xb5, 0xff, 0xff, 0x17, 0x04, 0x15, 0x80, 0xd2, 0xe2, 0x03, 0x00, 0x2a, + 0x63, 0x01, 0x00, 0x90, 0x81, 0x00, 0x80, 0x52, 0xe4, 0x62, 0x04, 0x9b, + 0x63, 0xa0, 0x03, 0x91, 0x00, 0x02, 0x80, 0x52, 0x84, 0x34, 0x40, 0xb9, + 0xda, 0xe0, 0xff, 0x97, 0xbe, 0xff, 0xff, 0x17, 0x01, 0x00, 0x80, 0x52, + 0x1f, 0x46, 0x00, 0x94, 0xd4, 0xff, 0xff, 0x17, 0x00, 0x68, 0x00, 0x11, + 0x54, 0xe0, 0xff, 0x97, 0xb6, 0xfd, 0xff, 0x35, 0xc1, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf7, 0x1b, 0x00, 0xf9, 0xf7, 0x03, 0x00, 0x2a, + 0xb7, 0x06, 0x00, 0x94, 0xf4, 0x03, 0x00, 0xaa, 0xe1, 0x02, 0x00, 0xb0, + 0x21, 0x60, 0x0e, 0x91, 0xf3, 0x03, 0x17, 0xaa, 0x20, 0x48, 0x77, 0x38, + 0x40, 0x01, 0x00, 0x34, 0xe2, 0x02, 0x00, 0xb0, 0x42, 0x20, 0x04, 0x91, + 0x3f, 0x48, 0x37, 0x38, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0x5f, 0x48, 0x37, 0x38, 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf5, 0x5b, 0x02, 0xa9, 0xf6, 0x02, 0x00, 0xb0, + 0xd6, 0x42, 0x0e, 0x91, 0xe0, 0x02, 0x00, 0xb0, 0x00, 0x00, 0x04, 0x91, + 0xf5, 0x02, 0x00, 0xb0, 0xb5, 0x42, 0x04, 0x91, 0xc1, 0x4a, 0x77, 0x38, + 0x03, 0x48, 0x77, 0x38, 0x01, 0x03, 0x00, 0x35, 0x00, 0x15, 0x80, 0xd2, + 0xe0, 0x56, 0x00, 0x9b, 0x01, 0x40, 0x42, 0xf8, 0x01, 0x18, 0x00, 0xf9, + 0x01, 0x2c, 0x40, 0xb9, 0x01, 0x38, 0x00, 0xb9, 0x03, 0x03, 0x00, 0x34, + 0x00, 0x9c, 0x40, 0xb9, 0x1f, 0x04, 0x00, 0x71, 0x00, 0x06, 0x00, 0x54, + 0x00, 0x15, 0x80, 0xd2, 0xf5, 0x56, 0x00, 0x9b, 0xa0, 0x02, 0x41, 0x39, + 0xfc, 0x44, 0x00, 0x94, 0xa0, 0x02, 0x00, 0x35, 0xe0, 0x4f, 0x00, 0xb9, + 0x41, 0xb4, 0xff, 0x97, 0xe0, 0x4f, 0x40, 0xb9, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x02, 0x15, 0x80, 0xd2, 0x84, 0x2e, 0x40, 0xb9, + 0x80, 0x86, 0x44, 0x29, 0xe2, 0x56, 0x02, 0x9b, 0x40, 0x04, 0x06, 0x29, + 0x44, 0x38, 0x00, 0xb9, 0x83, 0x01, 0x00, 0x35, 0xe0, 0x03, 0x13, 0x2a, + 0x52, 0xff, 0xff, 0x97, 0x60, 0x02, 0x00, 0x34, 0x1f, 0x14, 0x2c, 0x71, + 0x20, 0x02, 0x00, 0x54, 0xf5, 0x5b, 0x42, 0xa9, 0xf3, 0x53, 0x41, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x80, 0x86, 0x44, 0x29, 0x90, 0xf9, 0xff, 0x97, 0x01, 0x15, 0x80, 0xd2, + 0xdf, 0x4a, 0x33, 0x38, 0xe1, 0x56, 0x01, 0x9b, 0x21, 0x9c, 0x40, 0xb9, + 0x3f, 0x04, 0x00, 0x71, 0x20, 0x01, 0x00, 0x54, 0x40, 0xfb, 0xff, 0x34, + 0xf5, 0x5b, 0x42, 0xa9, 0xf2, 0xff, 0xff, 0x17, 0xc0, 0x4a, 0x73, 0x38, + 0x80, 0xfe, 0xff, 0x35, 0x00, 0x15, 0x80, 0xd2, 0xe0, 0x56, 0x00, 0x9b, + 0xd0, 0xff, 0xff, 0x17, 0x60, 0xfd, 0xff, 0x35, 0x01, 0x15, 0x80, 0xd2, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x56, 0x01, 0x9b, + 0xf7, 0x1b, 0x40, 0xf9, 0x23, 0x00, 0x80, 0x52, 0xa2, 0x86, 0x44, 0x29, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc7, 0xb5, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb8, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xe1, 0x02, 0x00, 0xb0, 0x21, 0xe0, 0x49, 0x39, + 0xf3, 0x53, 0x01, 0xa9, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x00, 0x2a, + 0xf6, 0x03, 0x00, 0x2a, 0xf7, 0x63, 0x03, 0xa9, 0xf7, 0x02, 0x00, 0xb0, + 0xf7, 0x42, 0x04, 0x91, 0xa1, 0x02, 0x00, 0x34, 0x18, 0x15, 0x80, 0xd2, + 0xd4, 0x5e, 0x18, 0x9b, 0x80, 0x3e, 0x40, 0xb9, 0x01, 0x24, 0x00, 0x51, + 0x3f, 0x04, 0x00, 0x71, 0x04, 0x88, 0x43, 0x7a, 0x61, 0x03, 0x00, 0x54, + 0x1f, 0x0c, 0x00, 0x71, 0xa0, 0x2b, 0x00, 0x54, 0x1f, 0x24, 0x00, 0x71, + 0x40, 0x08, 0x00, 0x54, 0x1f, 0x28, 0x00, 0x71, 0x13, 0x00, 0x80, 0x52, + 0xc0, 0x33, 0x00, 0x54, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc8, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x15, 0x80, 0xd2, 0xc0, 0x5e, 0x00, 0x9b, + 0x00, 0x40, 0x40, 0xb9, 0x65, 0xb5, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0xa0, 0xfe, 0xff, 0x35, 0x18, 0x15, 0x80, 0xd2, 0xd4, 0x5e, 0x18, 0x9b, + 0x80, 0x3e, 0x40, 0xb9, 0x01, 0x24, 0x00, 0x51, 0x3f, 0x04, 0x00, 0x71, + 0x04, 0x88, 0x43, 0x7a, 0xe0, 0xfc, 0xff, 0x54, 0x80, 0x42, 0x40, 0xb9, + 0x00, 0xa8, 0x00, 0x11, 0xbd, 0xdf, 0xff, 0x97, 0x80, 0x42, 0x40, 0xb9, + 0xe2, 0x02, 0x00, 0xb0, 0x42, 0x00, 0x04, 0x91, 0x81, 0x08, 0x80, 0x52, + 0x5f, 0x48, 0x35, 0x38, 0x4b, 0x3d, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0x60, 0xfc, 0xff, 0x35, 0x15, 0x42, 0x00, 0x35, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x11, 0x80, 0x52, 0x49, 0x3d, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0xb3, 0xfb, 0xff, 0x35, 0xbf, 0x06, 0x00, 0x71, 0x21, 0x00, 0x80, 0x52, + 0xf8, 0x17, 0x9f, 0x1a, 0xe0, 0x03, 0x18, 0x2a, 0xaa, 0x44, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0xc0, 0xfa, 0xff, 0x35, 0xe0, 0x03, 0x18, 0x2a, + 0x01, 0x00, 0x80, 0x52, 0x95, 0x45, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0x20, 0xfa, 0xff, 0x35, 0xf9, 0x6b, 0x04, 0xa9, 0x19, 0x03, 0x80, 0xd2, + 0xf4, 0x02, 0x00, 0x90, 0x94, 0x02, 0x29, 0x91, 0xd9, 0x7e, 0x19, 0x9b, + 0xe0, 0x03, 0x18, 0x2a, 0x82, 0x6a, 0x79, 0xf8, 0x41, 0xe0, 0x00, 0x91, + 0x41, 0x0c, 0x00, 0xf9, 0x29, 0x45, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0x80, 0x12, 0x00, 0x34, 0xf9, 0x6b, 0x44, 0xa9, 0xc3, 0xff, 0xff, 0x17, + 0xa1, 0x1e, 0x00, 0x12, 0x80, 0x42, 0x40, 0xb9, 0xf9, 0x6b, 0x04, 0xa9, + 0xf8, 0x03, 0x14, 0xaa, 0x00, 0xc8, 0x00, 0x11, 0xfb, 0x73, 0x05, 0xa9, + 0x13, 0x00, 0x80, 0x52, 0x14, 0x00, 0x80, 0xd2, 0xe1, 0x6f, 0x00, 0xb9, + 0x8b, 0xdf, 0xff, 0x97, 0xfa, 0x02, 0x00, 0xb0, 0x40, 0xa3, 0x13, 0x91, + 0x7a, 0x01, 0x80, 0xd2, 0xda, 0x02, 0x1a, 0x9b, 0x40, 0x6b, 0x74, 0x38, + 0xf9, 0x03, 0x14, 0x2a, 0xfc, 0x03, 0x14, 0x2a, 0x9f, 0x0a, 0x00, 0xf1, + 0x80, 0x00, 0x00, 0x34, 0x20, 0x1d, 0x00, 0x54, 0x00, 0x43, 0x40, 0xb9, + 0x53, 0x1b, 0x00, 0x34, 0x3f, 0x2b, 0x00, 0x71, 0x60, 0x00, 0x00, 0x54, + 0x94, 0x06, 0x00, 0x91, 0xf5, 0xff, 0xff, 0x17, 0x00, 0x15, 0x80, 0xd2, + 0xd8, 0x0a, 0x16, 0x8b, 0xe1, 0x02, 0x00, 0xb0, 0x21, 0x80, 0x10, 0x91, + 0xc0, 0x5e, 0x00, 0x9b, 0x38, 0x04, 0x18, 0x8b, 0x14, 0x00, 0x80, 0xd2, + 0xf9, 0x03, 0x00, 0xaa, 0x01, 0x40, 0x40, 0xb9, 0x04, 0x00, 0x00, 0x14, + 0x94, 0x06, 0x00, 0x91, 0x9f, 0x2a, 0x00, 0xf1, 0x80, 0x02, 0x00, 0x54, + 0x02, 0x6b, 0x74, 0x38, 0x82, 0xff, 0xff, 0x34, 0x73, 0xff, 0xff, 0x35, + 0xe0, 0x03, 0x01, 0x2a, 0xe2, 0x03, 0x14, 0x2a, 0x01, 0x00, 0x80, 0x52, + 0x37, 0x35, 0x00, 0x94, 0xe2, 0x03, 0x14, 0x2a, 0xf3, 0x03, 0x00, 0x2a, + 0x01, 0x00, 0x80, 0x52, 0xa0, 0x43, 0x00, 0x35, 0x20, 0x03, 0x41, 0x39, + 0x94, 0x06, 0x00, 0x91, 0x90, 0xed, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x21, 0x43, 0x40, 0xb9, 0x9f, 0x2a, 0x00, 0xf1, 0xe1, 0xfd, 0xff, 0x54, + 0x1f, 0x20, 0x03, 0xd5, 0xe9, 0x03, 0x01, 0x2a, 0xe7, 0x02, 0x00, 0x90, + 0xe7, 0xc0, 0x29, 0x91, 0x00, 0x1a, 0x80, 0xd2, 0xe2, 0x02, 0x00, 0xb0, + 0x42, 0xe0, 0x03, 0x91, 0xe3, 0x02, 0x00, 0xb0, 0x63, 0x00, 0x04, 0x91, + 0x20, 0x1d, 0x00, 0x9b, 0x44, 0x48, 0x75, 0x38, 0x7f, 0x48, 0x35, 0x38, + 0x1f, 0xc0, 0x00, 0xb9, 0x84, 0x00, 0x00, 0x34, 0x03, 0x02, 0x80, 0x52, + 0x5f, 0x48, 0x35, 0x38, 0x03, 0xc0, 0x00, 0xb9, 0x00, 0x1a, 0x80, 0xd2, + 0x06, 0x15, 0x80, 0xd2, 0xeb, 0x02, 0x00, 0xb0, 0x6b, 0x01, 0x14, 0x91, + 0x20, 0x7d, 0x00, 0x9b, 0xe2, 0x02, 0x00, 0xb0, 0x42, 0x40, 0x14, 0x91, + 0xc6, 0x5e, 0x06, 0x9b, 0xe4, 0x00, 0x00, 0x8b, 0xea, 0x02, 0x00, 0xb0, + 0x4a, 0x81, 0x14, 0x91, 0x2d, 0x01, 0x80, 0x52, 0xcc, 0xf2, 0x7d, 0xd3, + 0xe5, 0x02, 0x00, 0xb0, 0xa5, 0xa0, 0x11, 0x91, 0x88, 0xc0, 0x00, 0x91, + 0xa5, 0x00, 0x0c, 0x8b, 0x8d, 0x84, 0x00, 0x29, 0xcd, 0x10, 0x40, 0xb9, + 0xc6, 0x44, 0x40, 0xb9, 0x63, 0x79, 0x76, 0xf8, 0xed, 0x68, 0x20, 0xb8, + 0x4b, 0x78, 0x76, 0xf8, 0x02, 0x00, 0x80, 0xd2, 0x4a, 0x79, 0x76, 0xf8, + 0x86, 0x10, 0x00, 0xb9, 0x8b, 0xa8, 0x01, 0xa9, 0x83, 0x14, 0x00, 0xf9, + 0xa6, 0x04, 0x41, 0xf8, 0x06, 0x79, 0x22, 0xf8, 0x42, 0x04, 0x00, 0x91, + 0x5f, 0x20, 0x00, 0xf1, 0x81, 0xff, 0xff, 0x54, 0x00, 0x1a, 0x80, 0xd2, + 0xe2, 0x02, 0x00, 0xb0, 0x42, 0xe0, 0x10, 0x91, 0xe5, 0x02, 0x00, 0xb0, + 0xa5, 0x20, 0x11, 0x91, 0x20, 0x1d, 0x00, 0x9b, 0xe3, 0x02, 0x00, 0xb0, + 0x63, 0x80, 0x0e, 0x91, 0x63, 0x00, 0x0c, 0x8b, 0x86, 0x00, 0x02, 0x91, + 0x48, 0x78, 0x76, 0xf8, 0x02, 0x00, 0x80, 0xd2, 0xa5, 0x78, 0x76, 0xf8, + 0x01, 0x0c, 0x00, 0xb9, 0x08, 0x14, 0x07, 0xa9, 0x65, 0x04, 0x41, 0xf8, + 0xc5, 0x78, 0x22, 0xf8, 0x42, 0x04, 0x00, 0x91, 0x5f, 0x20, 0x00, 0xf1, + 0x81, 0xff, 0xff, 0x54, 0x03, 0x1a, 0x80, 0xd2, 0xe2, 0x02, 0x00, 0xb0, + 0x42, 0xc0, 0x14, 0x91, 0xe0, 0x02, 0x00, 0xb0, 0x00, 0x80, 0x11, 0x91, + 0x27, 0x1d, 0x03, 0x9b, 0x42, 0x78, 0x76, 0xb8, 0x00, 0x78, 0x76, 0xb8, + 0xe2, 0x80, 0x18, 0x29, 0xd3, 0x0f, 0x00, 0x34, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xc8, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x18, 0x2a, 0xba, 0x44, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0x40, 0xed, 0xff, 0x35, 0x18, 0x15, 0x80, 0xd2, + 0x84, 0x6a, 0x79, 0xf8, 0xd8, 0x5e, 0x18, 0x9b, 0x81, 0xd0, 0x01, 0x91, + 0x02, 0x83, 0x47, 0x29, 0x81, 0x14, 0x00, 0xf9, 0x5f, 0x10, 0x00, 0x71, + 0x40, 0x34, 0x00, 0x54, 0x18, 0x03, 0x80, 0xd2, 0x13, 0x15, 0x80, 0xd2, + 0xd8, 0x7e, 0x18, 0x9b, 0xd3, 0x5e, 0x13, 0x9b, 0x81, 0x02, 0x18, 0x8b, + 0x21, 0x04, 0x40, 0xf9, 0x63, 0x12, 0x40, 0xb9, 0x65, 0x46, 0x40, 0xb9, + 0x82, 0x00, 0x01, 0x29, 0x85, 0x10, 0x00, 0xb9, 0x83, 0x20, 0x00, 0xb9, + 0xa1, 0x29, 0x00, 0xb4, 0x81, 0x00, 0x00, 0xf9, 0x20, 0x00, 0x06, 0xd1, + 0xe2, 0xef, 0x01, 0x91, 0xe1, 0xf3, 0x01, 0x91, 0xff, 0xef, 0x01, 0x39, + 0xff, 0x7f, 0x00, 0xb9, 0x19, 0xa9, 0xff, 0x97, 0x20, 0x2d, 0x00, 0x35, + 0xe0, 0xef, 0x41, 0x39, 0x00, 0x33, 0x00, 0x34, 0xc9, 0xb2, 0xff, 0x97, + 0xe1, 0x02, 0x00, 0xb0, 0x21, 0xe0, 0x03, 0x91, 0x05, 0x03, 0x80, 0xd2, + 0x02, 0x15, 0x80, 0xd2, 0xe3, 0x7f, 0x40, 0xb9, 0xc4, 0x7e, 0x05, 0x9b, + 0x26, 0x48, 0x75, 0x38, 0xd7, 0x5e, 0x02, 0x9b, 0x87, 0x02, 0x04, 0x8b, + 0x63, 0x7c, 0xa5, 0x9b, 0x84, 0x6a, 0x64, 0xf8, 0x05, 0x00, 0x03, 0x8b, + 0xe2, 0x3e, 0x40, 0xb9, 0x66, 0x30, 0x00, 0x35, 0x81, 0x0c, 0x40, 0xb9, + 0x01, 0x68, 0x23, 0xb8, 0xe0, 0x04, 0x40, 0xf9, 0x83, 0x0c, 0x40, 0xf9, + 0xa0, 0x04, 0x00, 0xf9, 0xe0, 0x42, 0x40, 0xb9, 0xa2, 0x10, 0x00, 0xb9, + 0xe5, 0x02, 0x00, 0xb0, 0xa5, 0x80, 0x09, 0x91, 0x21, 0x00, 0x80, 0x52, + 0x81, 0xc0, 0x00, 0x39, 0xe1, 0x02, 0x00, 0xb0, 0x21, 0xa0, 0x09, 0x91, + 0xbf, 0x48, 0x35, 0x38, 0x25, 0x48, 0x75, 0x38, 0xc5, 0x26, 0x00, 0x34, + 0xe6, 0x02, 0x00, 0xb0, 0xc6, 0x40, 0x14, 0x91, 0xe7, 0x02, 0x00, 0xb0, + 0xe7, 0x00, 0x14, 0x91, 0xe5, 0x02, 0x00, 0xb0, 0xa5, 0x80, 0x14, 0x91, + 0x3f, 0x48, 0x35, 0x38, 0xc1, 0x78, 0x76, 0xf8, 0x61, 0x40, 0x02, 0xf8, + 0xe7, 0x78, 0x76, 0xf8, 0x67, 0x40, 0x03, 0xf8, 0xa1, 0x78, 0x76, 0xf8, + 0x61, 0xc0, 0x02, 0xf8, 0xe1, 0x03, 0x00, 0x2a, 0x23, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x15, 0x2a, 0x96, 0xf7, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x40, 0xe3, 0xff, 0x35, 0xe1, 0x02, 0x00, 0xb0, 0x21, 0x60, 0x11, 0x91, + 0x20, 0x48, 0x75, 0x38, 0x40, 0x23, 0x00, 0x34, 0xe0, 0x03, 0x15, 0x2a, + 0x3f, 0x48, 0x35, 0x38, 0x59, 0xfe, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0xf9, 0x6b, 0x44, 0xa9, 0xd4, 0xfe, 0xff, 0x17, 0x1b, 0x1c, 0x00, 0x12, + 0xe2, 0x03, 0x14, 0x2a, 0xe0, 0x03, 0x1b, 0x2a, 0x01, 0x00, 0x80, 0x52, + 0x3d, 0x34, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0x20, 0xe4, 0xff, 0x35, + 0xe2, 0x03, 0x1c, 0x2a, 0xe0, 0x03, 0x1b, 0x2a, 0x01, 0x00, 0x80, 0x52, + 0xc7, 0xec, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0x1b, 0xff, 0xff, 0x17, + 0x93, 0xe3, 0xff, 0x35, 0xfb, 0x6f, 0x40, 0xb9, 0xe2, 0x03, 0x14, 0x2a, + 0x01, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x1b, 0x2a, 0x2f, 0x34, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0x60, 0xfe, 0xff, 0x34, 0x94, 0x06, 0x00, 0x91, + 0x09, 0xff, 0xff, 0x17, 0x00, 0x15, 0x80, 0xd2, 0x23, 0x00, 0x80, 0x52, + 0xd6, 0x5e, 0x00, 0x9b, 0xe0, 0x03, 0x15, 0x2a, 0xc2, 0x3e, 0x40, 0xb9, + 0x6d, 0xf7, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0x80, 0xef, 0xff, 0x35, + 0xe1, 0x02, 0x00, 0xb0, 0x21, 0x60, 0x11, 0x91, 0x20, 0x48, 0x75, 0x38, + 0x40, 0x1f, 0x00, 0x34, 0xe0, 0x03, 0x15, 0x2a, 0x3f, 0x48, 0x35, 0x38, + 0x30, 0xfe, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xaa, 0xfe, 0xff, 0x17, 0x80, 0x42, 0x40, 0xb9, + 0x00, 0xc8, 0x00, 0x11, 0x79, 0xde, 0xff, 0x97, 0x80, 0x02, 0x41, 0x39, + 0x02, 0x00, 0x80, 0x52, 0x01, 0x00, 0x80, 0x52, 0x11, 0x34, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0xc0, 0x1f, 0x00, 0x34, 0x00, 0x15, 0x80, 0xd2, + 0xe2, 0x02, 0x00, 0x90, 0x42, 0x00, 0x22, 0x91, 0x03, 0x07, 0x80, 0xd2, + 0xc0, 0x5e, 0x00, 0x9b, 0xe4, 0x02, 0x00, 0xb0, 0x84, 0xe0, 0x03, 0x91, + 0xe5, 0x02, 0x00, 0xb0, 0xa5, 0x00, 0x04, 0x91, 0x01, 0x40, 0x40, 0xb9, + 0x86, 0x48, 0x75, 0x38, 0xe0, 0x03, 0x01, 0x2a, 0xbf, 0x48, 0x35, 0x38, + 0x03, 0x08, 0x03, 0x9b, 0x7f, 0x30, 0x00, 0xb9, 0x86, 0x00, 0x00, 0x34, + 0x05, 0x02, 0x80, 0x52, 0x9f, 0x48, 0x35, 0x38, 0x65, 0x30, 0x00, 0xb9, + 0x04, 0x07, 0x80, 0xd2, 0x03, 0x15, 0x80, 0xd2, 0xe7, 0x02, 0x00, 0xb0, + 0xe7, 0x00, 0x14, 0x91, 0x00, 0x7c, 0x04, 0x9b, 0xe6, 0x02, 0x00, 0xb0, + 0xc6, 0x40, 0x14, 0x91, 0xd7, 0x5e, 0x03, 0x9b, 0x44, 0x00, 0x00, 0x8b, + 0xe5, 0x02, 0x00, 0xb0, 0xa5, 0x80, 0x14, 0x91, 0xe3, 0x02, 0x00, 0xb0, + 0x63, 0xc0, 0x14, 0x91, 0x68, 0x00, 0x80, 0x52, 0xe9, 0x12, 0x40, 0xb9, + 0x88, 0x84, 0x00, 0x29, 0x63, 0x78, 0x76, 0xb8, 0xe8, 0x46, 0x40, 0xb9, + 0xe7, 0x78, 0x76, 0xf8, 0x49, 0x68, 0x20, 0xb8, 0xc6, 0x78, 0x76, 0xf8, + 0x88, 0x0c, 0x00, 0xb9, 0xa5, 0x78, 0x76, 0xf8, 0x86, 0x94, 0x01, 0xa9, + 0x87, 0x14, 0x00, 0xf9, 0x83, 0x34, 0x00, 0xb9, 0x73, 0xce, 0xff, 0x35, + 0xe2, 0x3e, 0x40, 0xb9, 0xe0, 0x03, 0x15, 0x2a, 0x23, 0x00, 0x80, 0x52, + 0x25, 0xf7, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0xa0, 0xcd, 0xff, 0x35, + 0xe1, 0x02, 0x00, 0xb0, 0x21, 0x60, 0x11, 0x91, 0x20, 0x48, 0x75, 0x38, + 0x80, 0x17, 0x00, 0x34, 0xe0, 0x03, 0x15, 0x2a, 0x3f, 0x48, 0x35, 0x38, + 0xe8, 0xfd, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0x64, 0xfe, 0xff, 0x17, + 0xa1, 0x1e, 0x00, 0x12, 0x80, 0x42, 0x40, 0xb9, 0xf9, 0x6b, 0x04, 0xa9, + 0xf8, 0x03, 0x14, 0xaa, 0x00, 0xc8, 0x00, 0x11, 0xfb, 0x73, 0x05, 0xa9, + 0x14, 0x00, 0x80, 0xd2, 0xe1, 0x6f, 0x00, 0xb9, 0x2d, 0xde, 0xff, 0x97, + 0xfa, 0x02, 0x00, 0xb0, 0x40, 0xa3, 0x13, 0x91, 0x7a, 0x01, 0x80, 0xd2, + 0xda, 0x02, 0x1a, 0x9b, 0x40, 0x6b, 0x74, 0x38, 0xf9, 0x03, 0x14, 0x2a, + 0xfc, 0x03, 0x14, 0x2a, 0x9f, 0x0a, 0x00, 0xf1, 0x80, 0x00, 0x00, 0x34, + 0x20, 0x06, 0x00, 0x54, 0x00, 0x43, 0x40, 0xb9, 0x53, 0x04, 0x00, 0x34, + 0x3f, 0x2b, 0x00, 0x71, 0x60, 0x00, 0x00, 0x54, 0x94, 0x06, 0x00, 0x91, + 0xf5, 0xff, 0xff, 0x17, 0x00, 0x15, 0x80, 0xd2, 0xd8, 0x0a, 0x16, 0x8b, + 0xe1, 0x02, 0x00, 0xb0, 0x21, 0x80, 0x10, 0x91, 0xc0, 0x5e, 0x00, 0x9b, + 0x38, 0x04, 0x18, 0x8b, 0x14, 0x00, 0x80, 0xd2, 0xf9, 0x03, 0x00, 0xaa, + 0x01, 0x40, 0x40, 0xb9, 0x04, 0x00, 0x00, 0x14, 0x94, 0x06, 0x00, 0x91, + 0x9f, 0x2a, 0x00, 0xf1, 0x00, 0x05, 0x00, 0x54, 0x02, 0x6b, 0x74, 0x38, + 0x82, 0xff, 0xff, 0x34, 0x73, 0xff, 0xff, 0x35, 0xe0, 0x03, 0x01, 0x2a, + 0xe2, 0x03, 0x14, 0x2a, 0x01, 0x00, 0x80, 0x52, 0xd9, 0x33, 0x00, 0x94, + 0xe2, 0x03, 0x14, 0x2a, 0xf3, 0x03, 0x00, 0x2a, 0x01, 0x00, 0x80, 0x52, + 0xa0, 0x17, 0x00, 0x35, 0x20, 0x03, 0x41, 0x39, 0x33, 0xec, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0x21, 0x43, 0x40, 0xb9, 0xee, 0xff, 0xff, 0x17, + 0x1b, 0x1c, 0x00, 0x12, 0xe2, 0x03, 0x14, 0x2a, 0xe0, 0x03, 0x1b, 0x2a, + 0x01, 0x00, 0x80, 0x52, 0x97, 0x33, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0x20, 0xfb, 0xff, 0x35, 0xe2, 0x03, 0x1c, 0x2a, 0xe0, 0x03, 0x1b, 0x2a, + 0x01, 0x00, 0x80, 0x52, 0x21, 0xec, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0xd3, 0xff, 0xff, 0x17, 0x93, 0xfa, 0xff, 0x35, 0xfb, 0x6f, 0x40, 0xb9, + 0xe2, 0x03, 0x14, 0x2a, 0x01, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x1b, 0x2a, + 0x89, 0x33, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0x60, 0xfe, 0xff, 0x34, + 0x94, 0x06, 0x00, 0x91, 0xc1, 0xff, 0xff, 0x17, 0xe9, 0x03, 0x01, 0x2a, + 0xe7, 0x02, 0x00, 0x90, 0xe7, 0xc0, 0x29, 0x91, 0x00, 0x1a, 0x80, 0xd2, + 0xe2, 0x02, 0x00, 0xb0, 0x42, 0xe0, 0x03, 0x91, 0xe3, 0x02, 0x00, 0xb0, + 0x63, 0x00, 0x04, 0x91, 0x20, 0x1d, 0x00, 0x9b, 0x44, 0x48, 0x75, 0x38, + 0x7f, 0x48, 0x35, 0x38, 0x1f, 0xc0, 0x00, 0xb9, 0x24, 0x0b, 0x00, 0x35, + 0x00, 0x1a, 0x80, 0xd2, 0x06, 0x15, 0x80, 0xd2, 0xeb, 0x02, 0x00, 0x90, + 0x6b, 0x01, 0x14, 0x91, 0x20, 0x7d, 0x00, 0x9b, 0xe2, 0x02, 0x00, 0x90, + 0x42, 0x40, 0x14, 0x91, 0xc6, 0x5e, 0x06, 0x9b, 0xe4, 0x00, 0x00, 0x8b, + 0xea, 0x02, 0x00, 0x90, 0x4a, 0x81, 0x14, 0x91, 0x4d, 0x01, 0x80, 0x52, + 0xcc, 0xf2, 0x7d, 0xd3, 0xe5, 0x02, 0x00, 0x90, 0xa5, 0xa0, 0x11, 0x91, + 0x88, 0xc0, 0x00, 0x91, 0xa5, 0x00, 0x0c, 0x8b, 0x8d, 0x84, 0x00, 0x29, + 0xcd, 0x10, 0x40, 0xb9, 0xc6, 0x44, 0x40, 0xb9, 0x63, 0x79, 0x76, 0xf8, + 0xed, 0x68, 0x20, 0xb8, 0x4b, 0x78, 0x76, 0xf8, 0x02, 0x00, 0x80, 0xd2, + 0x4a, 0x79, 0x76, 0xf8, 0x86, 0x10, 0x00, 0xb9, 0x8b, 0xa8, 0x01, 0xa9, + 0x83, 0x14, 0x00, 0xf9, 0x1f, 0x20, 0x03, 0xd5, 0xa6, 0x04, 0x41, 0xf8, + 0x06, 0x79, 0x22, 0xf8, 0x42, 0x04, 0x00, 0x91, 0x5f, 0x20, 0x00, 0xf1, + 0x81, 0xff, 0xff, 0x54, 0x00, 0x1a, 0x80, 0xd2, 0xe2, 0x02, 0x00, 0x90, + 0x42, 0xe0, 0x10, 0x91, 0xe5, 0x02, 0x00, 0x90, 0xa5, 0x20, 0x11, 0x91, + 0x20, 0x1d, 0x00, 0x9b, 0xe3, 0x02, 0x00, 0x90, 0x63, 0x80, 0x0e, 0x91, + 0x63, 0x00, 0x0c, 0x8b, 0x86, 0x00, 0x02, 0x91, 0x48, 0x78, 0x76, 0xf8, + 0x02, 0x00, 0x80, 0xd2, 0xa5, 0x78, 0x76, 0xf8, 0x01, 0x0c, 0x00, 0xb9, + 0x08, 0x14, 0x07, 0xa9, 0x65, 0x04, 0x41, 0xf8, 0xc5, 0x78, 0x22, 0xf8, + 0x42, 0x04, 0x00, 0x91, 0x5f, 0x20, 0x00, 0xf1, 0x81, 0xff, 0xff, 0x54, + 0x90, 0xfe, 0xff, 0x17, 0xe0, 0x03, 0x18, 0x2a, 0x21, 0x00, 0x80, 0x52, + 0x3a, 0x3b, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0xf1, 0xfd, 0xff, 0x17, + 0xe1, 0x02, 0x00, 0x90, 0x21, 0xe0, 0x03, 0x91, 0x25, 0x48, 0x75, 0x38, + 0x83, 0x0c, 0x40, 0xf9, 0x05, 0xda, 0xff, 0x34, 0xe5, 0x02, 0x00, 0x90, + 0xa5, 0x80, 0x09, 0x91, 0x06, 0x02, 0x80, 0x52, 0x3f, 0x48, 0x35, 0x38, + 0x66, 0x1c, 0x00, 0xb9, 0xa1, 0x48, 0x75, 0x38, 0x81, 0xc0, 0x00, 0x39, + 0xcc, 0xfe, 0xff, 0x17, 0xe0, 0x03, 0x15, 0x2a, 0xd1, 0xfc, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0xf9, 0x6b, 0x44, 0xa9, 0xbc, 0xfd, 0xff, 0x17, + 0x7f, 0x40, 0x02, 0xf8, 0x7f, 0xc0, 0x02, 0xf8, 0x7f, 0x40, 0x03, 0xf8, + 0xd5, 0xfe, 0xff, 0x17, 0xe0, 0x03, 0x15, 0x2a, 0xc8, 0xfc, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xb2, 0xfd, 0xff, 0x17, 0x03, 0x02, 0x80, 0x52, 0x5f, 0x48, 0x35, 0x38, + 0x03, 0xc0, 0x00, 0xb9, 0xa5, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x15, 0x2a, + 0xbe, 0xfc, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0xaa, 0xfd, 0xff, 0x17, + 0xe1, 0x02, 0x00, 0x90, 0x21, 0xe0, 0x03, 0x91, 0x62, 0x82, 0x47, 0x29, + 0x25, 0x48, 0x75, 0x38, 0x84, 0x6a, 0x78, 0xf8, 0xda, 0xff, 0xff, 0x17, + 0x80, 0x02, 0x41, 0x39, 0x22, 0x00, 0x80, 0x52, 0x01, 0x00, 0x80, 0x52, + 0x0e, 0x33, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0xc0, 0xdf, 0xff, 0x35, + 0xb8, 0x1e, 0x00, 0x12, 0x42, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x18, 0x2a, + 0x01, 0x00, 0x80, 0x52, 0x07, 0x33, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0xe0, 0xde, 0xff, 0x35, 0x80, 0x02, 0x41, 0x39, 0x02, 0x00, 0x80, 0x52, + 0x01, 0x00, 0x80, 0x52, 0x91, 0xeb, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x20, 0xde, 0xff, 0x35, 0x80, 0x02, 0x41, 0x39, 0x22, 0x00, 0x80, 0x52, + 0x01, 0x00, 0x80, 0x52, 0x8b, 0xeb, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x60, 0xdd, 0xff, 0x35, 0xe0, 0x03, 0x18, 0x2a, 0x42, 0x00, 0x80, 0x52, + 0x01, 0x00, 0x80, 0x52, 0x85, 0xeb, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0xe5, 0xfe, 0xff, 0x17, 0xea, 0xf3, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0xc0, 0xb7, 0xff, 0x35, 0x02, 0x83, 0x47, 0x29, 0x84, 0x6a, 0x79, 0xf8, + 0x5a, 0xfe, 0xff, 0x17, 0x1f, 0x68, 0x23, 0xb8, 0xe0, 0x42, 0x40, 0xb9, + 0x83, 0x0c, 0x40, 0xf9, 0xbf, 0x04, 0x00, 0xf9, 0xbf, 0x10, 0x00, 0xb9, + 0xb1, 0xff, 0xff, 0x17, 0x2e, 0xb1, 0xff, 0x97, 0x69, 0xfe, 0xff, 0x17, + 0x21, 0x43, 0x40, 0xb9, 0x35, 0xff, 0xff, 0x17, 0x21, 0x43, 0x40, 0xb9, + 0xd5, 0xfd, 0xff, 0x17, 0xe3, 0x03, 0x00, 0x2a, 0xe2, 0x02, 0x00, 0x90, + 0x42, 0xc0, 0x09, 0x91, 0x41, 0x78, 0x63, 0xb8, 0x21, 0x04, 0x00, 0x51, + 0x41, 0x78, 0x23, 0xb8, 0x41, 0x00, 0x00, 0x35, 0x51, 0xfd, 0xff, 0x17, + 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x00, 0x2a, 0xf6, 0x02, 0x00, 0x90, + 0xd6, 0x42, 0x04, 0x91, 0x00, 0x15, 0x80, 0xd2, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x03, 0x15, 0xaa, 0xa0, 0x5a, 0x00, 0x9b, 0xff, 0x3f, 0x01, 0x39, + 0x01, 0x3c, 0x40, 0xb9, 0x00, 0x00, 0x41, 0x39, 0x22, 0x24, 0x00, 0x51, + 0x5f, 0x04, 0x00, 0x71, 0x24, 0x88, 0x43, 0x7a, 0x81, 0x09, 0x00, 0x54, + 0x00, 0x48, 0x00, 0x11, 0x26, 0xdd, 0xff, 0x97, 0xe0, 0x03, 0x15, 0x2a, + 0x90, 0x03, 0x00, 0x94, 0x01, 0x48, 0x40, 0xb9, 0x3f, 0x04, 0x00, 0x71, + 0x00, 0x0a, 0x00, 0x54, 0xe1, 0x02, 0x00, 0x90, 0x21, 0xe0, 0x03, 0x91, + 0x20, 0x48, 0x74, 0x38, 0xe0, 0x08, 0x00, 0x35, 0xe2, 0x02, 0x00, 0x90, + 0x42, 0xc0, 0x09, 0x91, 0xf7, 0x63, 0x03, 0xa9, 0xf7, 0x02, 0x00, 0x90, + 0xe0, 0xa2, 0x13, 0x91, 0x43, 0x78, 0x75, 0xb8, 0x77, 0x01, 0x80, 0xd2, + 0x18, 0x15, 0x80, 0xd2, 0x24, 0x00, 0x80, 0x52, 0xb7, 0x02, 0x17, 0x9b, + 0x63, 0x04, 0x00, 0x11, 0xb8, 0x5a, 0x18, 0x9b, 0x13, 0x00, 0x80, 0xd2, + 0x00, 0x00, 0x80, 0x52, 0x43, 0x78, 0x35, 0xb8, 0x24, 0x48, 0x34, 0x38, + 0x04, 0x00, 0x00, 0x14, 0x73, 0x06, 0x00, 0x91, 0x7f, 0x2e, 0x00, 0xf1, + 0xe0, 0x01, 0x00, 0x54, 0x1f, 0x00, 0x00, 0x71, 0xe1, 0x6a, 0x73, 0x38, + 0xe2, 0x17, 0x9f, 0x1a, 0x5f, 0x00, 0x01, 0x6a, 0x20, 0xff, 0xff, 0x54, + 0x7f, 0x0a, 0x00, 0xf1, 0x00, 0x43, 0x40, 0xb9, 0xe2, 0x03, 0x13, 0x2a, + 0x01, 0x00, 0x80, 0x52, 0x00, 0x10, 0x94, 0x1a, 0x73, 0x06, 0x00, 0x91, + 0x99, 0x32, 0x00, 0x94, 0x7f, 0x2e, 0x00, 0xf1, 0x61, 0xfe, 0xff, 0x54, + 0xb4, 0x0a, 0x15, 0x8b, 0x02, 0x15, 0x80, 0xd2, 0xe1, 0x02, 0x00, 0x90, + 0x21, 0x80, 0x10, 0x91, 0xb6, 0x5a, 0x02, 0x9b, 0x34, 0x04, 0x14, 0x8b, + 0x13, 0x00, 0x80, 0xd2, 0x04, 0x00, 0x00, 0x14, 0x73, 0x06, 0x00, 0x91, + 0x7f, 0x2a, 0x00, 0xf1, 0xc0, 0x01, 0x00, 0x54, 0x1f, 0x00, 0x00, 0x71, + 0x81, 0x6a, 0x73, 0x38, 0xe2, 0x17, 0x9f, 0x1a, 0x5f, 0x00, 0x01, 0x6a, + 0x20, 0xff, 0xff, 0x54, 0xc0, 0x02, 0x41, 0x39, 0xe2, 0x03, 0x13, 0x2a, + 0x01, 0x00, 0x80, 0x52, 0x73, 0x06, 0x00, 0x91, 0xb6, 0x32, 0x00, 0x94, + 0x7f, 0x2a, 0x00, 0xf1, 0xa1, 0xfe, 0xff, 0x54, 0x1f, 0x20, 0x03, 0xd5, + 0x20, 0x05, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x28, 0x00, 0x11, 0xdb, 0xdc, 0xff, 0x97, 0xe2, 0x02, 0x00, 0x90, + 0x42, 0xe0, 0x03, 0x91, 0x40, 0x48, 0x75, 0x38, 0x20, 0x02, 0x00, 0x34, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x9c, 0x40, 0xb9, + 0x00, 0xf6, 0xff, 0x35, 0xe3, 0x02, 0x00, 0x90, 0x63, 0xe0, 0x03, 0x91, + 0xe2, 0x02, 0x00, 0x90, 0x42, 0xc0, 0x09, 0x91, 0xe0, 0x03, 0x15, 0x2a, + 0x61, 0x48, 0x35, 0x38, 0x5f, 0x78, 0x35, 0xb8, 0xdc, 0xfc, 0xff, 0x97, + 0xf2, 0xff, 0xff, 0x17, 0xbf, 0x06, 0x00, 0x71, 0x33, 0x00, 0x80, 0x52, + 0xe0, 0x17, 0x9f, 0x1a, 0xe1, 0x3f, 0x01, 0x91, 0x53, 0x48, 0x35, 0x38, + 0xe9, 0x41, 0x00, 0x94, 0x60, 0xfd, 0xff, 0x35, 0xe1, 0x3f, 0x41, 0x39, + 0xa1, 0x01, 0x00, 0x34, 0xe1, 0x02, 0x00, 0x90, 0x21, 0x80, 0x09, 0x91, + 0x33, 0x48, 0x35, 0x38, 0xe5, 0xff, 0xff, 0x17, 0xe0, 0x02, 0x00, 0x90, + 0x00, 0xc0, 0x0a, 0x91, 0x02, 0x0e, 0x80, 0xd2, 0xe1, 0x03, 0x13, 0x2a, + 0xa0, 0x02, 0x02, 0x9b, 0xe8, 0xb9, 0xff, 0x97, 0xf7, 0x63, 0x43, 0xa9, + 0xdd, 0xff, 0xff, 0x17, 0xe0, 0x02, 0x00, 0x90, 0x00, 0x40, 0x0a, 0x91, + 0xe1, 0x02, 0x00, 0x90, 0x21, 0x80, 0x09, 0x91, 0x00, 0x78, 0x75, 0xf8, + 0x3f, 0x48, 0x35, 0x38, 0x93, 0x16, 0x00, 0x94, 0xa0, 0xfa, 0xff, 0x35, + 0xe1, 0x02, 0x00, 0x90, 0x21, 0xc0, 0x09, 0x91, 0x20, 0x78, 0x75, 0xb8, + 0x00, 0x04, 0x00, 0x51, 0x20, 0x78, 0x35, 0xb8, 0xc0, 0xf9, 0xff, 0x35, + 0xe0, 0x03, 0x15, 0x2a, 0xb6, 0xfc, 0xff, 0x97, 0xcc, 0xff, 0xff, 0x17, + 0xfd, 0x7b, 0xbe, 0xa9, 0xe1, 0x02, 0x00, 0x90, 0x21, 0x20, 0x04, 0x91, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0x2a, + 0x20, 0x48, 0x60, 0x38, 0xe0, 0x02, 0x00, 0x34, 0xe0, 0x03, 0x13, 0x2a, + 0xd7, 0xf5, 0xff, 0x97, 0xa0, 0x01, 0x00, 0x35, 0xe0, 0x02, 0x00, 0x90, + 0x00, 0x00, 0x04, 0x91, 0x00, 0x48, 0x73, 0x38, 0x80, 0x01, 0x00, 0x34, + 0xe1, 0x02, 0x00, 0x90, 0x21, 0x60, 0x11, 0x91, 0x22, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x13, 0x2a, 0x22, 0x48, 0x33, 0x38, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0x52, 0xff, 0xff, 0x17, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0x33, 0xfc, 0xff, 0x17, + 0xe4, 0x03, 0x13, 0x2a, 0x43, 0x01, 0x00, 0xf0, 0x02, 0x81, 0x80, 0x52, + 0x63, 0xa0, 0x04, 0x91, 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xfc, 0xdc, 0xff, 0x97, 0xe3, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0xe1, 0x02, 0x00, 0x90, + 0x21, 0x20, 0x04, 0x91, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0x2a, 0x20, 0x48, 0x60, 0x38, 0xff, 0xff, 0x00, 0x39, + 0xa0, 0x06, 0x00, 0x34, 0xe1, 0xff, 0x00, 0x91, 0xe0, 0x03, 0x13, 0x2a, + 0x69, 0x03, 0x00, 0x94, 0xe0, 0xff, 0x40, 0x39, 0x00, 0x04, 0x00, 0x35, + 0xe0, 0x02, 0x00, 0x90, 0x00, 0x60, 0x0e, 0x91, 0xf5, 0x13, 0x00, 0xf9, + 0x21, 0x00, 0x80, 0x52, 0x01, 0x48, 0x33, 0x38, 0xe1, 0x02, 0x00, 0x90, + 0x21, 0x00, 0x04, 0x91, 0xf5, 0x03, 0x13, 0x2a, 0x00, 0x00, 0x80, 0x52, + 0x21, 0x48, 0x73, 0x38, 0x21, 0x02, 0x00, 0x34, 0xf4, 0x02, 0x00, 0x90, + 0x81, 0x42, 0x04, 0x91, 0x14, 0x15, 0x80, 0xd2, 0xb4, 0x06, 0x14, 0x9b, + 0x81, 0x3e, 0x40, 0xb9, 0x22, 0x24, 0x00, 0x51, 0x5f, 0x04, 0x00, 0x71, + 0x24, 0x88, 0x43, 0x7a, 0x01, 0x01, 0x00, 0x54, 0xe1, 0x02, 0x00, 0x90, + 0x21, 0xa0, 0x13, 0x91, 0x62, 0x01, 0x80, 0xd2, 0x80, 0xd2, 0x40, 0x39, + 0xa1, 0x06, 0x02, 0x9b, 0xd5, 0xea, 0xff, 0x97, 0xa0, 0x03, 0x00, 0x34, + 0xf5, 0x13, 0x40, 0xf9, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x13, 0x2a, 0xb6, 0x02, 0x00, 0x94, + 0xe1, 0x03, 0x00, 0xaa, 0x00, 0x24, 0x40, 0xb9, 0x02, 0x0c, 0x00, 0x51, + 0x5f, 0x04, 0x00, 0x71, 0x09, 0x04, 0x00, 0x54, 0xe1, 0x02, 0x00, 0x90, + 0x21, 0x40, 0x0e, 0x91, 0xe0, 0x02, 0x00, 0x90, 0x00, 0x60, 0x0e, 0x91, + 0xf5, 0x13, 0x00, 0xf9, 0x22, 0x00, 0x80, 0x52, 0x22, 0x48, 0x33, 0x38, + 0x1f, 0x48, 0x33, 0x38, 0xd7, 0xff, 0xff, 0x17, 0xe4, 0x03, 0x13, 0x2a, + 0x43, 0x01, 0x00, 0xf0, 0x02, 0x81, 0x80, 0x52, 0x63, 0xe0, 0x05, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0xb5, 0xdc, 0xff, 0x97, + 0xc5, 0xff, 0xff, 0x17, 0x80, 0xd2, 0x40, 0x39, 0xe2, 0x02, 0x00, 0x90, + 0x42, 0x80, 0x10, 0x91, 0xa1, 0x0a, 0x15, 0x8b, 0x41, 0x04, 0x01, 0x8b, + 0xb6, 0xea, 0xff, 0x97, 0xc0, 0xfb, 0xff, 0x35, 0xe1, 0x02, 0x00, 0x90, + 0x21, 0xc0, 0x09, 0x91, 0xe0, 0x03, 0x13, 0x2a, 0x3f, 0x78, 0x35, 0xb8, + 0x3c, 0xfc, 0xff, 0x97, 0xf5, 0x13, 0x40, 0xf9, 0xd8, 0xff, 0xff, 0x17, + 0x21, 0x28, 0x40, 0xb9, 0xac, 0xf5, 0xff, 0x97, 0xe1, 0x02, 0x00, 0x90, + 0x21, 0x60, 0x0e, 0x91, 0x3f, 0x48, 0x33, 0x38, 0x40, 0xfa, 0xff, 0x35, + 0xf5, 0x13, 0x00, 0xf9, 0xb9, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xba, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf7, 0x63, 0x03, 0xa9, + 0xe1, 0x02, 0x00, 0x90, 0x37, 0x40, 0x04, 0x91, 0xf8, 0x03, 0x00, 0x2a, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x18, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, + 0x7f, 0x02, 0x00, 0x94, 0x16, 0x15, 0x80, 0xd2, 0x15, 0x9c, 0x40, 0xb9, + 0xf4, 0x03, 0x00, 0xaa, 0x16, 0x5f, 0x16, 0x9b, 0xbf, 0x06, 0x00, 0x71, + 0x60, 0x05, 0x00, 0x54, 0x00, 0x48, 0x40, 0xb9, 0xe0, 0x01, 0x00, 0x34, + 0xe1, 0x02, 0x00, 0x90, 0x21, 0x20, 0x04, 0x91, 0x20, 0x48, 0x78, 0x38, + 0x80, 0x08, 0x00, 0x34, 0xf4, 0x02, 0x00, 0x90, 0x94, 0x62, 0x0e, 0x91, + 0x00, 0x00, 0x80, 0x52, 0x81, 0x4a, 0x78, 0x38, 0x41, 0x0b, 0x00, 0x35, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe1, 0x03, 0x16, 0xaa, + 0xe0, 0x03, 0x18, 0x2a, 0x6e, 0x02, 0x00, 0x94, 0xe1, 0x02, 0x00, 0x90, + 0x21, 0x20, 0x04, 0x91, 0xc0, 0x0a, 0x45, 0x29, 0x24, 0x00, 0x80, 0x52, + 0xc3, 0x42, 0x42, 0xf8, 0x24, 0x48, 0x38, 0x38, 0xc3, 0x1a, 0x00, 0xf9, + 0x00, 0x08, 0x00, 0x11, 0xc2, 0x3a, 0x00, 0xb9, 0xf0, 0xdb, 0xff, 0x97, + 0xe0, 0x03, 0x18, 0x2a, 0x1a, 0xf5, 0xff, 0x97, 0x80, 0xfd, 0xff, 0x35, + 0xe0, 0x02, 0x00, 0x90, 0x00, 0x00, 0x04, 0x91, 0x00, 0x48, 0x73, 0x38, + 0x60, 0x07, 0x00, 0x34, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, + 0xab, 0xfe, 0xff, 0x17, 0x00, 0x28, 0x40, 0xb9, 0x00, 0x08, 0x00, 0x11, + 0xe0, 0xdb, 0xff, 0x97, 0x82, 0x86, 0x44, 0x29, 0xc0, 0x36, 0x40, 0xb9, + 0x1f, 0x00, 0x01, 0x6b, 0x81, 0x00, 0x00, 0x54, 0xc0, 0x32, 0x40, 0xb9, + 0x1f, 0x00, 0x02, 0x6b, 0x60, 0x08, 0x00, 0x54, 0x83, 0x9e, 0x40, 0xb9, + 0xe0, 0x03, 0x13, 0x2a, 0xae, 0xb1, 0xff, 0x97, 0x80, 0xfa, 0xff, 0x35, + 0xe1, 0x03, 0x16, 0xaa, 0xe0, 0x03, 0x13, 0x2a, 0x46, 0x02, 0x00, 0x94, + 0x01, 0x15, 0x80, 0xd2, 0xe2, 0x02, 0x00, 0x90, 0x42, 0x20, 0x04, 0x91, + 0x23, 0x00, 0x80, 0x52, 0x01, 0x5f, 0x01, 0x9b, 0xe0, 0x03, 0x13, 0x2a, + 0x43, 0x48, 0x33, 0x38, 0x22, 0x40, 0x42, 0xf8, 0x22, 0x18, 0x00, 0xf9, + 0x22, 0x2c, 0x40, 0xb9, 0x22, 0x38, 0x00, 0xb9, 0xf2, 0xf4, 0xff, 0x97, + 0x20, 0xfb, 0xff, 0x34, 0xc3, 0xff, 0xff, 0x17, 0x84, 0x8e, 0x44, 0x29, + 0x25, 0x00, 0x80, 0x52, 0x82, 0x2e, 0x40, 0xb9, 0xe0, 0x03, 0x18, 0x2a, + 0xc4, 0x0e, 0x06, 0x29, 0xc2, 0x3a, 0x00, 0xb9, 0x25, 0x48, 0x38, 0x38, + 0xfc, 0xfa, 0xff, 0x97, 0x1f, 0x14, 0x2c, 0x71, 0x04, 0x18, 0x40, 0x7a, + 0x01, 0xf7, 0xff, 0x54, 0x80, 0x86, 0x44, 0x29, 0x3f, 0xf5, 0xff, 0x97, + 0xa0, 0xf6, 0xff, 0x35, 0x80, 0xa2, 0x40, 0x39, 0x8c, 0x40, 0x00, 0x94, + 0x40, 0xf6, 0xff, 0x35, 0xe0, 0x5f, 0x00, 0xb9, 0xd1, 0xaf, 0xff, 0x97, + 0xe0, 0x5f, 0x40, 0xb9, 0xae, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc6, 0xa8, 0xe9, 0xfa, 0xff, 0x17, 0xe0, 0x03, 0x18, 0x2a, + 0x13, 0x02, 0x00, 0x94, 0xe1, 0x03, 0x00, 0xaa, 0x00, 0x24, 0x40, 0xb9, + 0x02, 0x0c, 0x00, 0x51, 0x5f, 0x04, 0x00, 0x71, 0x69, 0x02, 0x00, 0x54, + 0xe0, 0x02, 0x00, 0x90, 0x00, 0x40, 0x0e, 0x91, 0x21, 0x00, 0x80, 0x52, + 0x01, 0x48, 0x38, 0x38, 0x9f, 0x4a, 0x33, 0x38, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf9, 0x23, 0x00, 0xf9, + 0xf9, 0x02, 0x00, 0x90, 0x39, 0x23, 0x04, 0x91, 0x20, 0x4b, 0x78, 0x38, + 0xe0, 0x00, 0x00, 0x35, 0xf9, 0x23, 0x40, 0xf9, 0xb8, 0xff, 0xff, 0x17, + 0x21, 0x28, 0x40, 0xb9, 0x16, 0xf5, 0xff, 0x97, 0x00, 0xfe, 0xff, 0x34, + 0x8b, 0xff, 0xff, 0x17, 0xe1, 0x03, 0x16, 0xaa, 0xe0, 0x03, 0x18, 0x2a, + 0xfd, 0x01, 0x00, 0x94, 0x35, 0x4b, 0x38, 0x38, 0xc1, 0x2e, 0x40, 0xb9, + 0xe0, 0x03, 0x18, 0x2a, 0xc2, 0x42, 0x42, 0xf8, 0xf3, 0x53, 0x41, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, 0xc2, 0x1a, 0x00, 0xf9, + 0xc1, 0x3a, 0x00, 0xb9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, + 0xa9, 0xf4, 0xff, 0x17, 0x1f, 0x10, 0x00, 0x71, 0xa8, 0x00, 0x00, 0x54, + 0x41, 0x01, 0x00, 0xf0, 0x21, 0x00, 0x08, 0x91, 0x20, 0x58, 0x60, 0xb8, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0xc8, 0xaa, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x21, 0x10, 0x00, 0xf0, 0x21, 0xe0, 0x0b, 0x91, + 0x20, 0x58, 0x60, 0xb8, 0xc0, 0x03, 0x5f, 0xd6, 0x22, 0x14, 0x00, 0x51, + 0x5f, 0x04, 0x00, 0x71, 0xe2, 0x87, 0x9f, 0x1a, 0x3f, 0x08, 0x00, 0x71, + 0x41, 0x14, 0x9f, 0x1a, 0x80, 0x00, 0x00, 0x35, 0x20, 0x00, 0x40, 0x92, + 0x00, 0x80, 0x0a, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x40, 0x92, + 0x00, 0x80, 0x0b, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0x2a, + 0xf4, 0x03, 0x02, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x03, 0x2a, + 0xf6, 0x03, 0x01, 0x2a, 0x40, 0x04, 0x40, 0x39, 0xdb, 0xff, 0xff, 0x97, + 0x1f, 0x00, 0x15, 0x6b, 0xa4, 0x1a, 0x42, 0x7a, 0x00, 0x21, 0x80, 0x52, + 0x01, 0x03, 0x00, 0x54, 0xe4, 0x03, 0x13, 0x2a, 0xe3, 0x02, 0x00, 0x90, + 0x63, 0x20, 0x21, 0x91, 0x82, 0x4c, 0x35, 0x8b, 0x80, 0x06, 0x40, 0xa9, + 0x62, 0x18, 0x02, 0x8b, 0x84, 0xe4, 0x7a, 0xd3, 0x69, 0x00, 0x80, 0x52, + 0x65, 0x00, 0x04, 0x8b, 0x40, 0x04, 0x01, 0xa9, 0x41, 0x00, 0x80, 0xd2, + 0x21, 0x00, 0xc0, 0xf2, 0x86, 0x1e, 0x41, 0xa9, 0x46, 0x1c, 0x02, 0xa9, + 0x00, 0x00, 0x80, 0x52, 0x86, 0x12, 0x40, 0xf9, 0x46, 0x18, 0x00, 0xf9, + 0x55, 0x38, 0x00, 0xb9, 0x86, 0x06, 0x40, 0x39, 0x76, 0x68, 0x24, 0xb8, + 0x46, 0x3c, 0x00, 0xb9, 0xa9, 0x04, 0x00, 0xb9, 0xa1, 0x04, 0x00, 0xf9, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe5, 0x03, 0x00, 0x2a, 0x48, 0x00, 0x40, 0xb9, + 0x06, 0x14, 0x80, 0xd2, 0x63, 0x1c, 0x00, 0x12, 0x84, 0x1c, 0x00, 0x12, + 0x1f, 0x05, 0x00, 0x71, 0xa5, 0x7c, 0x06, 0x9b, 0xe0, 0x03, 0x00, 0x54, + 0x06, 0x03, 0x00, 0xb0, 0xc6, 0xa0, 0x1a, 0x91, 0xc5, 0x00, 0x05, 0x8b, + 0x46, 0x00, 0x80, 0xd2, 0x86, 0x00, 0xc0, 0xf2, 0xa6, 0x40, 0x00, 0xf8, + 0x4d, 0x08, 0x40, 0x79, 0x2e, 0x00, 0x80, 0x52, 0x4a, 0x20, 0x40, 0x79, + 0x29, 0x00, 0x80, 0xd2, 0x4c, 0x2c, 0x41, 0x29, 0xa1, 0x00, 0x00, 0xb9, + 0x41, 0x14, 0x40, 0xb9, 0xa8, 0x14, 0x00, 0xb9, 0xae, 0x34, 0x00, 0x79, + 0xad, 0x38, 0x00, 0x79, 0xac, 0x2c, 0x04, 0x29, 0xaa, 0x50, 0x00, 0x79, + 0xa1, 0x30, 0x00, 0xb9, 0xa3, 0x70, 0x02, 0x39, 0xa4, 0x74, 0x02, 0x39, + 0x41, 0x4c, 0x40, 0x39, 0xa1, 0xb4, 0x00, 0x39, 0x41, 0x48, 0x40, 0x39, + 0xa1, 0xb0, 0x00, 0x39, 0x41, 0x18, 0x40, 0xb9, 0xa9, 0xc0, 0x00, 0xf8, + 0xa0, 0x30, 0x00, 0x79, 0xa1, 0x34, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x06, 0x03, 0x00, 0xb0, 0xc6, 0xa0, 0x06, 0x91, 0xc5, 0x00, 0x05, 0x8b, + 0x26, 0x00, 0x80, 0xd2, 0x66, 0x00, 0xc0, 0xf2, 0xa6, 0x40, 0x00, 0xf8, + 0xe2, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb8, 0xa9, 0x5f, 0x20, 0x00, 0x71, + 0xfd, 0x03, 0x00, 0x91, 0xf9, 0x6b, 0x04, 0xa9, 0xfa, 0x03, 0x00, 0x2a, + 0x80, 0x00, 0x40, 0xb9, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x03, 0xaa, + 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x02, 0x2a, 0xf7, 0x63, 0x03, 0xa9, + 0x98, 0x16, 0x80, 0xd2, 0xf7, 0x03, 0x1a, 0xaa, 0xfb, 0x73, 0x05, 0xa9, + 0x58, 0x7f, 0x18, 0x9b, 0xfb, 0x03, 0x01, 0x2a, 0xc0, 0x22, 0x00, 0x54, + 0xfc, 0x02, 0x00, 0x90, 0x9c, 0x23, 0x39, 0x91, 0x93, 0x03, 0x18, 0x8b, + 0x81, 0x04, 0x40, 0xb9, 0x5f, 0x14, 0x00, 0x71, 0x60, 0x06, 0x15, 0x29, + 0x80, 0x20, 0x40, 0x39, 0x60, 0xc2, 0x02, 0x39, 0xa0, 0x22, 0x00, 0x54, + 0x09, 0x0a, 0x00, 0x54, 0x5f, 0x18, 0x00, 0x71, 0x81, 0x18, 0x00, 0x54, + 0x68, 0x04, 0x40, 0xb9, 0x26, 0x00, 0x80, 0x52, 0x67, 0x10, 0x40, 0xb9, + 0x62, 0x00, 0x40, 0x79, 0x65, 0x18, 0x40, 0xb9, 0x64, 0x24, 0x40, 0xb9, + 0x68, 0x1e, 0x03, 0x29, 0x67, 0x14, 0x40, 0xb9, 0x7a, 0x42, 0x00, 0x39, + 0x62, 0x26, 0x00, 0x79, 0x66, 0x2e, 0x00, 0x79, 0x67, 0x16, 0x04, 0x29, + 0x64, 0x36, 0x00, 0xb9, 0x7f, 0x7e, 0x00, 0xb9, 0x64, 0x8c, 0x40, 0x39, + 0x64, 0xc6, 0x00, 0x39, 0x64, 0x88, 0x40, 0x39, 0x64, 0xc2, 0x00, 0x39, + 0x61, 0x28, 0x40, 0xb9, 0x61, 0x3a, 0x00, 0xb9, 0x60, 0xcc, 0x40, 0x39, + 0x60, 0x0e, 0x01, 0x39, 0x60, 0xc4, 0x40, 0x39, 0x60, 0x06, 0x01, 0x39, + 0x60, 0xc0, 0x40, 0x39, 0x60, 0x02, 0x01, 0x39, 0x60, 0xc8, 0x40, 0x39, + 0x60, 0x0a, 0x01, 0x39, 0x60, 0x2c, 0x40, 0xb9, 0x60, 0x3e, 0x00, 0xb9, + 0x60, 0x68, 0x40, 0x79, 0x60, 0x8a, 0x00, 0x79, 0x61, 0x04, 0x40, 0x79, + 0x60, 0x38, 0x40, 0x79, 0x61, 0x2a, 0x00, 0x79, 0x61, 0x3c, 0x40, 0x79, + 0x60, 0x52, 0x00, 0x79, 0x60, 0x40, 0x40, 0x79, 0x61, 0x56, 0x00, 0x79, + 0x61, 0xf0, 0x44, 0x78, 0x60, 0x5a, 0x00, 0x79, 0x80, 0x12, 0x45, 0xb8, + 0x69, 0x6c, 0x40, 0x79, 0x68, 0x70, 0x40, 0x79, 0x64, 0x8c, 0x40, 0x79, + 0x82, 0x96, 0x40, 0x79, 0x63, 0x90, 0x40, 0x79, 0x87, 0xa2, 0x43, 0xb8, + 0x86, 0xe2, 0x43, 0xb8, 0x85, 0x22, 0x44, 0xb8, 0x61, 0xca, 0x00, 0x79, + 0x81, 0x9a, 0x40, 0x79, 0x60, 0x6a, 0x00, 0xb9, 0x80, 0x3a, 0x41, 0x39, + 0x69, 0x92, 0x00, 0x79, 0x68, 0x96, 0x00, 0x79, 0x67, 0x9a, 0x09, 0x29, + 0x65, 0x56, 0x00, 0xb9, 0x64, 0xb2, 0x00, 0x79, 0x63, 0xb6, 0x00, 0x79, + 0x62, 0xba, 0x00, 0x79, 0x61, 0xbe, 0x00, 0x79, 0x60, 0x82, 0x01, 0x39, + 0x80, 0x06, 0x41, 0x29, 0x61, 0x82, 0x0e, 0x29, 0x7f, 0x0a, 0x00, 0xb9, + 0x21, 0x00, 0x80, 0x52, 0x00, 0x00, 0x80, 0x52, 0x7b, 0x56, 0x00, 0x29, + 0x61, 0x0e, 0x00, 0xb9, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xfd, 0x7b, 0xc8, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x5f, 0x10, 0x00, 0x71, + 0x60, 0x80, 0x80, 0x52, 0xe1, 0xfe, 0xff, 0x54, 0x61, 0x20, 0x40, 0xb9, + 0x56, 0x1f, 0x00, 0x12, 0xe0, 0x03, 0x16, 0x2a, 0xe2, 0xe3, 0x01, 0x91, + 0xff, 0xdf, 0x01, 0x39, 0xff, 0xe3, 0x01, 0x39, 0xff, 0xe7, 0x01, 0x39, + 0xff, 0xf7, 0x00, 0x79, 0xff, 0xfb, 0x00, 0x79, 0xe2, 0x42, 0x00, 0x94, + 0x80, 0xfd, 0xff, 0x35, 0xe1, 0xe3, 0x41, 0x39, 0x02, 0x5b, 0x00, 0x91, + 0x82, 0x03, 0x02, 0x8b, 0xe0, 0x03, 0x16, 0x2a, 0xfc, 0x3d, 0x00, 0x94, + 0xc0, 0xfc, 0xff, 0x35, 0xe1, 0xdf, 0x01, 0x91, 0xe0, 0x03, 0x16, 0x2a, + 0x90, 0x41, 0x00, 0x94, 0x40, 0xfc, 0xff, 0x35, 0x81, 0x22, 0x40, 0xb9, + 0xe3, 0xf3, 0x01, 0x91, 0xe2, 0xeb, 0x01, 0x91, 0xe0, 0x03, 0x1a, 0x2a, + 0xaa, 0x06, 0x00, 0x94, 0x80, 0xfb, 0xff, 0x35, 0xe1, 0xf7, 0x40, 0x79, + 0xc0, 0x82, 0x80, 0x52, 0xe2, 0xfb, 0x40, 0x79, 0x3f, 0x00, 0x02, 0x6b, + 0xe3, 0xfa, 0xff, 0x54, 0x21, 0x00, 0x02, 0x4b, 0xe0, 0x03, 0x16, 0x2a, + 0xe2, 0xfb, 0x01, 0x91, 0xff, 0xff, 0x00, 0x79, 0x67, 0x41, 0x00, 0x94, + 0x20, 0xfa, 0xff, 0x35, 0xe3, 0xdf, 0x41, 0x39, 0x99, 0x22, 0x00, 0x91, + 0xe0, 0xff, 0x40, 0x79, 0x86, 0x2a, 0x40, 0x79, 0x81, 0x0a, 0x40, 0xb9, + 0x60, 0x00, 0x00, 0x0b, 0x04, 0x3c, 0x00, 0x12, 0xe4, 0x6b, 0x00, 0xb9, + 0xc0, 0x20, 0x20, 0x0b, 0x22, 0x07, 0x40, 0xb9, 0x00, 0x3c, 0x00, 0x12, + 0x41, 0x17, 0x00, 0x34, 0x82, 0x18, 0x00, 0x34, 0x26, 0x0b, 0x40, 0xb9, + 0xdf, 0x00, 0x00, 0x71, 0x98, 0x00, 0x9f, 0x1a, 0x3f, 0x08, 0x00, 0x71, + 0xa0, 0x17, 0x00, 0x54, 0xff, 0x6b, 0x00, 0xb9, 0x5f, 0x08, 0x00, 0x71, + 0x60, 0x16, 0x00, 0x54, 0xff, 0x6f, 0x00, 0xb9, 0x26, 0x0b, 0x40, 0xb9, + 0xdf, 0x08, 0x00, 0x71, 0x18, 0x13, 0x80, 0x1a, 0x3f, 0x04, 0x00, 0x71, + 0x00, 0x16, 0x00, 0x54, 0x5f, 0x04, 0x00, 0x71, 0x00, 0x16, 0x00, 0x54, + 0x20, 0x0b, 0x40, 0xb9, 0x1f, 0x04, 0x00, 0x71, 0x18, 0x13, 0x83, 0x1a, + 0x81, 0x22, 0x40, 0xb9, 0xe0, 0x03, 0x17, 0x2a, 0xe2, 0xe7, 0x01, 0x91, + 0xb6, 0xf0, 0xff, 0x97, 0x80, 0xf5, 0xff, 0x35, 0x80, 0x16, 0x80, 0xd2, + 0x85, 0x02, 0x40, 0x79, 0x8b, 0xa2, 0x40, 0x29, 0x5c, 0x73, 0x00, 0x9b, + 0x89, 0x22, 0x40, 0xb9, 0x07, 0x20, 0xc0, 0xd2, 0xea, 0xe7, 0x41, 0x39, + 0x26, 0x00, 0x80, 0x52, 0x83, 0x1a, 0x40, 0xb9, 0x24, 0x0b, 0x40, 0xb9, + 0x96, 0x43, 0x00, 0x39, 0x85, 0x27, 0x00, 0x79, 0x25, 0x00, 0x80, 0xd2, + 0x8b, 0x1b, 0x00, 0xb9, 0x65, 0x00, 0xc0, 0xf2, 0x8a, 0xb3, 0x01, 0x39, + 0x89, 0x73, 0x00, 0xb9, 0x9f, 0x7f, 0x00, 0xb9, 0x68, 0x1e, 0x00, 0xb9, + 0x28, 0x07, 0x40, 0xb9, 0x68, 0x12, 0x04, 0x29, 0x63, 0x36, 0x00, 0xb9, + 0x83, 0x5e, 0x40, 0x39, 0x63, 0xc6, 0x00, 0x39, 0x83, 0x5a, 0x40, 0x39, + 0x63, 0xc2, 0x00, 0x39, 0x82, 0x1e, 0x40, 0xb9, 0x67, 0xc2, 0x03, 0xf8, + 0x66, 0x8a, 0x00, 0x79, 0x62, 0x3a, 0x00, 0xb9, 0x81, 0x06, 0x40, 0x79, + 0x81, 0x2b, 0x00, 0x79, 0xe1, 0xd3, 0x40, 0x79, 0x61, 0x52, 0x00, 0x79, + 0xe1, 0xdb, 0x40, 0x79, 0x61, 0x56, 0x00, 0x79, 0x78, 0x5a, 0x00, 0x79, + 0x85, 0x43, 0x07, 0xf8, 0x7f, 0x0a, 0x00, 0xb9, 0x80, 0xff, 0xff, 0x17, + 0x41, 0x1c, 0x00, 0x51, 0x60, 0x80, 0x80, 0x52, 0x3f, 0x04, 0x00, 0x71, + 0x08, 0xf0, 0xff, 0x54, 0x77, 0x42, 0x00, 0x39, 0x85, 0x72, 0x00, 0x91, + 0x64, 0xa2, 0x00, 0x91, 0xbf, 0x22, 0x00, 0x71, 0x80, 0x02, 0x40, 0x79, + 0x88, 0x06, 0x40, 0xb9, 0x86, 0x26, 0x40, 0xb9, 0x83, 0x26, 0x42, 0x29, + 0x87, 0x1a, 0x40, 0xb9, 0x60, 0x26, 0x00, 0x79, 0x80, 0xf2, 0x00, 0x91, + 0x68, 0x0e, 0x03, 0x29, 0x28, 0x00, 0x80, 0x52, 0x69, 0x1e, 0x04, 0x29, + 0x66, 0x36, 0x00, 0xb9, 0x86, 0x8e, 0x40, 0x39, 0x66, 0xc6, 0x00, 0x39, + 0x86, 0x8a, 0x40, 0x39, 0x66, 0xc2, 0x00, 0x39, 0x82, 0x2a, 0x40, 0xb9, + 0x62, 0x3a, 0x00, 0xb9, 0x81, 0xce, 0x40, 0x39, 0x61, 0x0e, 0x01, 0x39, + 0x81, 0xc6, 0x40, 0x39, 0x61, 0x06, 0x01, 0x39, 0x81, 0xc2, 0x40, 0x39, + 0x61, 0x02, 0x01, 0x39, 0x81, 0xca, 0x40, 0x39, 0x61, 0x0a, 0x01, 0x39, + 0x81, 0x2e, 0x40, 0xb9, 0x61, 0x3e, 0x00, 0xb9, 0x81, 0x6a, 0x40, 0x79, + 0x61, 0x8a, 0x00, 0x79, 0x68, 0x2e, 0x00, 0x79, 0x82, 0x06, 0x40, 0x79, + 0x81, 0x3a, 0x40, 0x79, 0x62, 0x2a, 0x00, 0x79, 0xa2, 0x04, 0x40, 0x79, + 0x61, 0x52, 0x00, 0x79, 0xa1, 0x08, 0x40, 0x79, 0x82, 0x04, 0x00, 0x79, + 0x81, 0x08, 0x00, 0x79, 0x04, 0x14, 0x40, 0xa9, 0x82, 0x1a, 0x41, 0x29, + 0x81, 0x3a, 0x40, 0xb9, 0x64, 0x16, 0x08, 0xa9, 0x04, 0x14, 0x41, 0xa9, + 0x64, 0x16, 0x09, 0xa9, 0x80, 0xc2, 0x45, 0xf8, 0x66, 0x8a, 0x0e, 0x29, + 0x61, 0x7e, 0x00, 0xb9, 0x60, 0x52, 0x00, 0xf9, 0xc1, 0xe8, 0xff, 0x54, + 0x20, 0x00, 0x80, 0x52, 0x21, 0x00, 0x80, 0x52, 0x7b, 0x56, 0x00, 0x29, + 0x60, 0x0a, 0x00, 0xb9, 0x00, 0x00, 0x80, 0x52, 0x61, 0x0e, 0x00, 0xb9, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xc8, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x02, 0x00, 0x90, 0x73, 0xa2, 0x0f, 0x91, + 0x73, 0x02, 0x18, 0x8b, 0x81, 0x04, 0x40, 0xb9, 0x60, 0x06, 0x15, 0x29, + 0x80, 0x20, 0x40, 0x39, 0x60, 0xc2, 0x02, 0x39, 0xb7, 0xff, 0xff, 0x17, + 0x62, 0x04, 0x40, 0x79, 0x24, 0x00, 0x80, 0x52, 0x65, 0x10, 0x40, 0xb9, + 0x66, 0x04, 0x40, 0xb9, 0x67, 0x00, 0x40, 0x79, 0x63, 0x18, 0x40, 0xb9, + 0x66, 0x16, 0x03, 0x29, 0x85, 0x16, 0x40, 0xb9, 0x62, 0x2a, 0x00, 0x79, + 0x82, 0xe2, 0x41, 0xb8, 0x7a, 0x42, 0x00, 0x39, 0x67, 0x26, 0x00, 0x79, + 0x64, 0x2e, 0x00, 0x79, 0x65, 0x0e, 0x04, 0x29, 0x62, 0x36, 0x00, 0xb9, + 0x7f, 0x7e, 0x00, 0xb9, 0x82, 0x76, 0x40, 0x39, 0x62, 0xc6, 0x00, 0x39, + 0x82, 0x72, 0x40, 0x39, 0x62, 0xc2, 0x00, 0x39, 0x81, 0x22, 0x42, 0xb8, + 0x61, 0x3a, 0x00, 0xb9, 0x80, 0xb6, 0x40, 0x39, 0x60, 0x0e, 0x01, 0x39, + 0x80, 0xae, 0x40, 0x39, 0x60, 0x06, 0x01, 0x39, 0x80, 0xaa, 0x40, 0x39, + 0x60, 0x02, 0x01, 0x39, 0x80, 0xb2, 0x40, 0x39, 0x60, 0x0a, 0x01, 0x39, + 0x80, 0x62, 0x42, 0xb8, 0x60, 0x3e, 0x00, 0xb9, 0x80, 0x5e, 0x40, 0x79, + 0x60, 0x8a, 0x00, 0x79, 0x83, 0x62, 0x40, 0x79, 0x80, 0x06, 0x41, 0x29, + 0x82, 0x22, 0x43, 0xb8, 0x7f, 0x0a, 0x00, 0xb9, 0x63, 0xca, 0x00, 0x79, + 0x62, 0x6a, 0x00, 0xb9, 0x61, 0x82, 0x0e, 0x29, 0x08, 0xff, 0xff, 0x17, + 0x18, 0x00, 0x80, 0x52, 0x4d, 0xff, 0xff, 0x17, 0xe0, 0x6f, 0x00, 0xb9, + 0x3f, 0x04, 0x00, 0x71, 0x81, 0xea, 0xff, 0x54, 0xe3, 0x6b, 0x00, 0xb9, + 0x55, 0xff, 0xff, 0x17, 0xe3, 0x6f, 0x00, 0xb9, 0x53, 0xff, 0xff, 0x17, + 0xe0, 0x7f, 0x0d, 0x29, 0x4c, 0xff, 0xff, 0x17, 0x3f, 0x08, 0x00, 0x71, + 0xa0, 0x00, 0x00, 0x54, 0xe4, 0x6b, 0x40, 0xb9, 0x18, 0x00, 0x80, 0x52, + 0xff, 0x13, 0x0d, 0x29, 0x41, 0xff, 0xff, 0x17, 0xe1, 0x6b, 0x40, 0xb9, + 0x18, 0x00, 0x80, 0x52, 0xe0, 0x07, 0x0d, 0x29, 0x44, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x03, 0x00, 0x2a, 0x21, 0x10, 0x00, 0xd0, 0x21, 0xa0, 0x02, 0x91, + 0x02, 0x15, 0x80, 0xd2, 0x00, 0x04, 0x02, 0x9b, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x2a, + 0x04, 0x15, 0x80, 0xd2, 0x22, 0x10, 0x00, 0xd0, 0x42, 0xa0, 0x02, 0x91, + 0x23, 0x10, 0x00, 0xd0, 0x63, 0xd0, 0x03, 0x91, 0x00, 0x7c, 0x04, 0x9b, + 0x24, 0x30, 0x01, 0x91, 0x42, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x03, 0x8b, + 0x43, 0xa4, 0x44, 0x29, 0x48, 0x2c, 0x40, 0xb9, 0x47, 0x48, 0x40, 0xb9, + 0x45, 0x98, 0x40, 0xb9, 0x46, 0x48, 0x40, 0xf9, 0x23, 0x24, 0x00, 0xb9, + 0x43, 0x9c, 0x40, 0xb9, 0x29, 0x20, 0x05, 0x29, 0x27, 0x48, 0x00, 0xb9, + 0x26, 0x48, 0x00, 0xf9, 0x25, 0x0c, 0x13, 0x29, 0x00, 0x04, 0x40, 0xa9, + 0x80, 0x04, 0x00, 0xa9, 0x5f, 0x80, 0x02, 0x39, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x22, 0x10, 0x46, 0x29, 0xe3, 0x03, 0x00, 0x2a, 0x5f, 0x10, 0x00, 0x71, + 0xe0, 0x0a, 0x00, 0x54, 0x89, 0x01, 0x00, 0x54, 0x5f, 0x1c, 0x00, 0x71, + 0x20, 0x0b, 0x00, 0x54, 0x29, 0x05, 0x00, 0x54, 0x5f, 0x20, 0x00, 0x71, + 0x01, 0x06, 0x00, 0x54, 0x3f, 0x14, 0x00, 0xb9, 0x00, 0x00, 0x80, 0x52, + 0x3f, 0x00, 0x00, 0xb9, 0x3f, 0x04, 0x00, 0xf9, 0x3f, 0x3c, 0x00, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0x5f, 0x08, 0x00, 0x71, 0x60, 0x0a, 0x00, 0x54, + 0x5f, 0x0c, 0x00, 0x71, 0xa1, 0x02, 0x00, 0x54, 0x02, 0x03, 0x00, 0x90, + 0x42, 0xa0, 0x06, 0x91, 0xe0, 0x03, 0x04, 0x2a, 0x05, 0x14, 0x80, 0xd2, + 0x00, 0x7c, 0x05, 0x9b, 0x46, 0x00, 0x00, 0x8b, 0x45, 0x68, 0x60, 0xb8, + 0xc2, 0x04, 0x40, 0xb9, 0xc0, 0x0c, 0x40, 0xb9, 0x20, 0x14, 0x00, 0xb9, + 0x1f, 0x04, 0x00, 0x71, 0x81, 0xfd, 0xff, 0x54, 0x26, 0x00, 0x80, 0x52, + 0x00, 0x00, 0x80, 0x52, 0x26, 0x00, 0x00, 0xb9, 0x3f, 0x04, 0x00, 0xf9, + 0x25, 0x10, 0x00, 0xb9, 0x22, 0x90, 0x07, 0x29, 0x23, 0x44, 0x00, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0x62, 0x02, 0x00, 0x34, 0x5f, 0x04, 0x00, 0x71, + 0xe1, 0x01, 0x00, 0x54, 0xe2, 0x02, 0x00, 0x90, 0x42, 0xa0, 0x0f, 0x91, + 0xe0, 0x03, 0x04, 0x2a, 0x85, 0x16, 0x80, 0xd2, 0xe9, 0xff, 0xff, 0x17, + 0x5f, 0x14, 0x00, 0x71, 0x80, 0x04, 0x00, 0x54, 0x5f, 0x18, 0x00, 0x71, + 0xc1, 0x00, 0x00, 0x54, 0xe2, 0x02, 0x00, 0xd0, 0x42, 0x20, 0x0c, 0x91, + 0xe0, 0x03, 0x04, 0x2a, 0x05, 0x66, 0x80, 0xd2, 0xe0, 0xff, 0xff, 0x17, + 0x60, 0x80, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x10, 0x00, 0xd0, + 0x02, 0xa0, 0x02, 0x91, 0xe0, 0x03, 0x03, 0x2a, 0x05, 0x15, 0x80, 0xd2, + 0x00, 0x08, 0x05, 0x9b, 0x02, 0x48, 0x40, 0xb9, 0xe2, 0x01, 0x00, 0x35, + 0x00, 0x9c, 0x40, 0xb9, 0xa0, 0x01, 0x00, 0x35, 0x85, 0x7c, 0x7a, 0xd3, + 0xc2, 0x02, 0x00, 0xf0, 0x42, 0x20, 0x21, 0x91, 0xe0, 0x03, 0x04, 0x2a, + 0x47, 0x00, 0x05, 0x8b, 0xe6, 0x0c, 0x40, 0xb9, 0xdf, 0x04, 0x00, 0x71, + 0xc1, 0x00, 0x00, 0x54, 0x45, 0x68, 0x65, 0xb8, 0xe2, 0x04, 0x40, 0xb9, + 0x26, 0x14, 0x00, 0xb9, 0xd1, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x04, 0x2a, + 0xc2, 0x02, 0x00, 0xf0, 0x42, 0x20, 0x39, 0x91, 0x85, 0x16, 0x80, 0xd2, + 0xc4, 0xff, 0xff, 0x17, 0xe2, 0x02, 0x00, 0x90, 0x42, 0x20, 0x26, 0x91, + 0xe0, 0x03, 0x04, 0x2a, 0x05, 0x66, 0x80, 0xd2, 0xbf, 0xff, 0xff, 0x17, + 0x02, 0x03, 0x00, 0x90, 0x42, 0xa0, 0x1a, 0x91, 0xe0, 0x03, 0x04, 0x2a, + 0x05, 0x14, 0x80, 0xd2, 0xba, 0xff, 0xff, 0x17, 0xe2, 0x02, 0x00, 0xf0, + 0x42, 0x20, 0x32, 0x91, 0xe0, 0x03, 0x04, 0x2a, 0x85, 0x14, 0x80, 0xd2, + 0xb5, 0xff, 0xff, 0x17, 0x82, 0x7c, 0x7a, 0xd3, 0xc0, 0x02, 0x00, 0xf0, + 0x00, 0x20, 0x21, 0x91, 0x06, 0x00, 0x02, 0x8b, 0x05, 0x68, 0x62, 0xb8, + 0xc2, 0x04, 0x40, 0xb9, 0xc0, 0x0c, 0x40, 0xb9, 0xb2, 0xff, 0xff, 0x17, + 0x1f, 0x04, 0x00, 0x71, 0xa9, 0x00, 0x00, 0x54, 0x3f, 0x00, 0x00, 0xf1, + 0xe0, 0x17, 0x9f, 0x1a, 0x00, 0x04, 0x00, 0x11, 0xc0, 0x03, 0x5f, 0xd6, + 0x41, 0x01, 0x00, 0xb4, 0xe2, 0x03, 0x00, 0x2a, 0x23, 0x10, 0x00, 0xd0, + 0x63, 0xa0, 0x02, 0x91, 0x04, 0x15, 0x80, 0xd2, 0x00, 0x00, 0x80, 0x52, + 0x42, 0x0c, 0x04, 0x9b, 0x42, 0x80, 0x42, 0x39, 0x22, 0x00, 0x00, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0xe0, 0x03, 0x00, 0x2a, 0x01, 0x0c, 0x80, 0xd2, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0x13, 0x03, 0x00, 0x90, 0x73, 0xa2, 0x2e, 0x91, + 0x13, 0x4c, 0x01, 0x9b, 0xe0, 0x03, 0x13, 0xaa, 0x01, 0x7d, 0x80, 0x52, + 0xe2, 0xb5, 0xff, 0x97, 0x60, 0x00, 0x00, 0x34, 0x1f, 0x68, 0x08, 0x71, + 0x60, 0xff, 0xff, 0x54, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x2a, 0x01, 0x03, 0x00, 0x90, + 0x21, 0xa0, 0x2e, 0x91, 0x02, 0x0c, 0x80, 0xd2, 0x00, 0x04, 0x02, 0x9b, + 0xc7, 0xb5, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0x10, 0x00, 0x71, 0x60, 0x05, 0x00, 0x54, 0xc8, 0x02, 0x00, 0x54, + 0x3f, 0x08, 0x00, 0x71, 0xe0, 0x05, 0x00, 0x54, 0x3f, 0x0c, 0x00, 0x71, + 0x01, 0x01, 0x00, 0x54, 0xe0, 0x03, 0x00, 0x2a, 0x01, 0x03, 0x00, 0x90, + 0x21, 0xa0, 0x06, 0x91, 0x02, 0x14, 0x80, 0xd2, 0x00, 0x04, 0x02, 0x9b, + 0x00, 0x0c, 0x40, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x61, 0x05, 0x00, 0x34, + 0x3f, 0x04, 0x00, 0x71, 0xe1, 0x06, 0x00, 0x54, 0xe0, 0x03, 0x00, 0x2a, + 0xe1, 0x02, 0x00, 0x90, 0x21, 0xa0, 0x0f, 0x91, 0x82, 0x16, 0x80, 0xd2, + 0x00, 0x04, 0x02, 0x9b, 0x00, 0x0c, 0x40, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x3f, 0x18, 0x00, 0x71, 0xe0, 0x04, 0x00, 0x54, 0x3f, 0x1c, 0x00, 0x71, + 0x01, 0x01, 0x00, 0x54, 0xe0, 0x03, 0x00, 0x2a, 0xe1, 0x02, 0x00, 0xf0, + 0x21, 0x20, 0x32, 0x91, 0x82, 0x14, 0x80, 0xd2, 0x00, 0x04, 0x02, 0x9b, + 0x00, 0x0c, 0x40, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x3f, 0x14, 0x00, 0x71, + 0x61, 0x04, 0x00, 0x54, 0xe0, 0x03, 0x00, 0x2a, 0xe1, 0x02, 0x00, 0x90, + 0x21, 0x20, 0x26, 0x91, 0x02, 0x66, 0x80, 0xd2, 0x00, 0x04, 0x02, 0x9b, + 0x00, 0x0c, 0x40, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x00, 0x2a, + 0x01, 0x03, 0x00, 0x90, 0x21, 0xa0, 0x1a, 0x91, 0x02, 0x14, 0x80, 0xd2, + 0x00, 0x04, 0x02, 0x9b, 0x00, 0x0c, 0x40, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x7c, 0x7a, 0xd3, 0xc1, 0x02, 0x00, 0xf0, 0x21, 0x20, 0x21, 0x91, + 0x20, 0x00, 0x00, 0x8b, 0x00, 0x0c, 0x40, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0x03, 0x00, 0x2a, 0xc1, 0x02, 0x00, 0xf0, 0x21, 0x20, 0x39, 0x91, + 0x82, 0x16, 0x80, 0xd2, 0x00, 0x04, 0x02, 0x9b, 0x00, 0x0c, 0x40, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x00, 0x2a, 0xe1, 0x02, 0x00, 0xd0, + 0x21, 0x20, 0x0c, 0x91, 0x02, 0x66, 0x80, 0xd2, 0x00, 0x04, 0x02, 0x9b, + 0x00, 0x0c, 0x40, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x80, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe5, 0x03, 0x00, 0x2a, 0x82, 0x16, 0x80, 0xd2, + 0xc3, 0x02, 0x00, 0xf0, 0x63, 0x20, 0x39, 0x91, 0xa2, 0x7c, 0x02, 0x9b, + 0x64, 0x00, 0x02, 0x8b, 0x63, 0x68, 0x62, 0xb8, 0x7f, 0x00, 0x01, 0x6b, + 0xc0, 0x04, 0x00, 0x54, 0xe3, 0x02, 0x00, 0x90, 0x63, 0xa0, 0x0f, 0x91, + 0x64, 0x00, 0x02, 0x8b, 0x60, 0x68, 0x62, 0xb8, 0x1f, 0x00, 0x01, 0x6b, + 0x00, 0x04, 0x00, 0x54, 0x03, 0x14, 0x80, 0xd2, 0x04, 0x03, 0x00, 0x90, + 0x84, 0xa0, 0x06, 0x91, 0xa3, 0x7c, 0x03, 0x9b, 0x82, 0x00, 0x03, 0x8b, + 0x80, 0x68, 0x63, 0xb8, 0x1f, 0x00, 0x01, 0x6b, 0xe0, 0x03, 0x00, 0x54, + 0x00, 0x03, 0x00, 0x90, 0x00, 0xa0, 0x1a, 0x91, 0x02, 0x00, 0x03, 0x8b, + 0x00, 0x68, 0x63, 0xb8, 0x1f, 0x00, 0x01, 0x6b, 0x20, 0x03, 0x00, 0x54, + 0xa2, 0xe4, 0x7a, 0xd3, 0xc0, 0x02, 0x00, 0xf0, 0x00, 0x20, 0x21, 0x91, + 0x03, 0x00, 0x02, 0x8b, 0x00, 0x68, 0x62, 0xb8, 0x1f, 0x00, 0x01, 0x6b, + 0x20, 0x03, 0x00, 0x54, 0x82, 0x14, 0x80, 0xd2, 0xe3, 0x02, 0x00, 0xf0, + 0x63, 0x20, 0x32, 0x91, 0x00, 0x00, 0x80, 0x52, 0xa2, 0x7c, 0x02, 0x9b, + 0x64, 0x00, 0x02, 0x8b, 0x62, 0x68, 0x62, 0xb8, 0x5f, 0x00, 0x01, 0x6b, + 0xe0, 0x02, 0x00, 0x54, 0xc0, 0x03, 0x5f, 0xd6, 0x81, 0x0c, 0x40, 0xb9, + 0x00, 0x00, 0x80, 0x52, 0x3f, 0x04, 0x00, 0x71, 0x81, 0xff, 0xff, 0x54, + 0xe0, 0x03, 0x01, 0x2a, 0x9f, 0x0c, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x41, 0x0c, 0x40, 0xb9, 0x00, 0x00, 0x80, 0x52, 0x3f, 0x04, 0x00, 0x71, + 0xa1, 0xfe, 0xff, 0x54, 0xe0, 0x03, 0x01, 0x2a, 0x5f, 0x0c, 0x00, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0x61, 0x0c, 0x40, 0xb9, 0x00, 0x00, 0x80, 0x52, + 0x3f, 0x04, 0x00, 0x71, 0xc1, 0xfd, 0xff, 0x54, 0xe0, 0x03, 0x01, 0x2a, + 0x7f, 0x0c, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x81, 0x0c, 0x40, 0xb9, + 0x3f, 0x04, 0x00, 0x71, 0xa0, 0xfd, 0xff, 0x54, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x03, 0x00, 0x90, 0x94, 0xa2, 0x31, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0xf6, 0x03, 0x00, 0xaa, 0xf5, 0x03, 0x01, 0x2a, + 0xe0, 0x03, 0x14, 0xaa, 0x01, 0x00, 0x80, 0x12, 0x32, 0xb5, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x00, 0x35, 0x22, 0x10, 0x00, 0xd0, + 0x42, 0xe0, 0x0b, 0x91, 0x01, 0x15, 0x80, 0xd2, 0x20, 0x10, 0x00, 0xd0, + 0x00, 0xa0, 0x02, 0x91, 0x44, 0x58, 0x75, 0xb8, 0x81, 0x7c, 0x01, 0x9b, + 0x03, 0x00, 0x01, 0x8b, 0x02, 0x68, 0x61, 0xb8, 0x5f, 0x20, 0x00, 0x71, + 0xe0, 0x03, 0x00, 0x54, 0x62, 0x10, 0x40, 0xb9, 0x1f, 0x68, 0x21, 0xb8, + 0x42, 0x04, 0x00, 0x11, 0x61, 0x08, 0x40, 0xb9, 0x42, 0x6c, 0x00, 0x72, + 0xa0, 0x02, 0x00, 0x54, 0x62, 0x10, 0x00, 0xb9, 0xbf, 0x0e, 0x00, 0x71, + 0xa9, 0x00, 0x00, 0x54, 0x03, 0x15, 0x80, 0xd2, 0x42, 0x00, 0x01, 0x32, + 0x80, 0x00, 0x03, 0x9b, 0x02, 0x10, 0x00, 0xb9, 0x80, 0x44, 0x21, 0x8b, + 0x21, 0x10, 0x00, 0xd0, 0x21, 0xe0, 0x07, 0x91, 0xc2, 0x02, 0x00, 0xb9, + 0x00, 0xec, 0x7c, 0xd3, 0x22, 0x68, 0x20, 0xb8, 0xe0, 0x03, 0x14, 0xaa, + 0x04, 0xb5, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x25, 0x00, 0x80, 0x52, 0xe2, 0x03, 0x05, 0x2a, 0x65, 0x10, 0x00, 0xb9, + 0xea, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x14, 0xaa, 0x33, 0x80, 0x80, 0x52, + 0xf8, 0xb4, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x80, 0x52, + 0x17, 0xf3, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x24, 0x10, 0x00, 0xd0, 0x84, 0xe0, 0x0b, 0x91, 0x22, 0x10, 0x00, 0xd0, + 0x43, 0xa0, 0x02, 0x91, 0x05, 0x15, 0x80, 0xd2, 0x41, 0x00, 0x80, 0x52, + 0x80, 0x58, 0x60, 0xb8, 0xe2, 0x03, 0x00, 0x2a, 0x42, 0x0c, 0x05, 0x9b, + 0x43, 0x04, 0x40, 0xb9, 0x63, 0x04, 0x00, 0x11, 0x43, 0x04, 0x00, 0xb9, + 0x08, 0xf3, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x13, 0x03, 0x00, 0x90, 0x60, 0x22, 0x73, 0x39, + 0xf5, 0x5b, 0x02, 0xa9, 0x14, 0x00, 0x80, 0x52, 0xf7, 0x63, 0x03, 0xa9, + 0x20, 0x0c, 0x00, 0x34, 0x35, 0x10, 0x00, 0xd0, 0xb5, 0xa2, 0x02, 0x91, + 0x36, 0x10, 0x00, 0xd0, 0xd6, 0xe2, 0x07, 0x91, 0xd6, 0x02, 0x04, 0x91, + 0xb8, 0x42, 0x05, 0x91, 0x37, 0x01, 0x80, 0x52, 0xbf, 0x7e, 0x00, 0x29, + 0xd3, 0x02, 0x04, 0xd1, 0xbf, 0x7e, 0x01, 0x29, 0xbf, 0x7e, 0x02, 0x29, + 0xbf, 0x0e, 0x00, 0xf9, 0xbf, 0x4a, 0x00, 0xf9, 0x26, 0xa7, 0xff, 0x97, + 0x1f, 0x00, 0x00, 0x71, 0xe0, 0x07, 0x9f, 0x1a, 0xb7, 0x26, 0x00, 0xb9, + 0xbf, 0x02, 0x13, 0x29, 0xbf, 0x82, 0x02, 0x39, 0x7f, 0x7e, 0x00, 0x29, + 0x73, 0x82, 0x00, 0x91, 0x7f, 0x02, 0x16, 0xeb, 0xa1, 0xff, 0xff, 0x54, + 0x20, 0xa7, 0xff, 0x97, 0xa0, 0x4a, 0x00, 0xb9, 0xb5, 0xa2, 0x02, 0x91, + 0x76, 0x42, 0x00, 0x91, 0xbf, 0x02, 0x18, 0xeb, 0x61, 0xfd, 0xff, 0x54, + 0x03, 0x03, 0x00, 0x90, 0x63, 0xa0, 0x06, 0x91, 0x02, 0x03, 0x00, 0x90, + 0x42, 0xa0, 0x1a, 0x91, 0xc6, 0x02, 0x00, 0xf0, 0xc6, 0x20, 0x39, 0x91, + 0xe5, 0x02, 0x00, 0x90, 0xa5, 0xa0, 0x0f, 0x91, 0xc1, 0x02, 0x00, 0xf0, + 0x21, 0x20, 0x21, 0x91, 0xe4, 0x02, 0x00, 0xf0, 0x84, 0x20, 0x32, 0x91, + 0xeb, 0x02, 0x00, 0x90, 0x6b, 0x51, 0x26, 0x91, 0xea, 0x02, 0x00, 0xd0, + 0x4a, 0x51, 0x0c, 0x91, 0x29, 0x10, 0x00, 0xd0, 0x29, 0xe1, 0x0b, 0x91, + 0x63, 0x10, 0x00, 0x91, 0x42, 0x10, 0x00, 0x91, 0xc6, 0x10, 0x00, 0x91, + 0xa5, 0x10, 0x00, 0x91, 0x21, 0x10, 0x00, 0x91, 0x84, 0x10, 0x00, 0x91, + 0x07, 0x00, 0x80, 0xd2, 0x00, 0x00, 0x80, 0xd2, 0x1f, 0x0c, 0x00, 0x71, + 0x7f, 0x69, 0x27, 0xb8, 0xe8, 0x97, 0x9f, 0x1a, 0x5f, 0x69, 0x27, 0xb8, + 0x28, 0x79, 0x20, 0xb8, 0x00, 0x04, 0x00, 0x91, 0x3f, 0x00, 0x00, 0xb9, + 0xe7, 0xc0, 0x0c, 0x91, 0x5f, 0x00, 0x00, 0xb9, 0x1f, 0x20, 0x00, 0xf1, + 0x7f, 0x00, 0x00, 0xb9, 0x21, 0x00, 0x01, 0x91, 0x3f, 0x80, 0x1c, 0xb8, + 0x42, 0x80, 0x02, 0x91, 0x5f, 0x80, 0x16, 0xb8, 0x63, 0x80, 0x02, 0x91, + 0x7f, 0x80, 0x16, 0xb8, 0x84, 0x90, 0x02, 0x91, 0x9f, 0xc0, 0x15, 0xb8, + 0xa5, 0xd0, 0x02, 0x91, 0xbf, 0xc0, 0x14, 0xb8, 0xc6, 0xd0, 0x02, 0x91, + 0xdf, 0xc0, 0x14, 0xb8, 0xbf, 0x40, 0x15, 0xb8, 0xdf, 0x40, 0x15, 0xb8, + 0x9f, 0x40, 0x16, 0xb8, 0x7f, 0x80, 0x1f, 0x38, 0x5f, 0x80, 0x1f, 0x38, + 0x7f, 0x90, 0x1f, 0x38, 0x5f, 0x90, 0x1f, 0x38, 0x3f, 0xc0, 0x01, 0xb9, + 0x3f, 0xc8, 0x01, 0xb9, 0x3f, 0xc0, 0x03, 0xb9, 0x3f, 0xc8, 0x03, 0xb9, + 0xc1, 0xfb, 0xff, 0x54, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x41, 0x01, 0x00, 0xd0, 0x00, 0x03, 0x00, 0x90, + 0x21, 0x80, 0x08, 0x91, 0x00, 0xa0, 0x31, 0x91, 0x53, 0xb4, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0x80, 0x00, 0x00, 0x34, 0x20, 0x00, 0x80, 0x52, + 0x60, 0x22, 0x33, 0x39, 0x97, 0xff, 0xff, 0x17, 0x15, 0x03, 0x00, 0x90, + 0xb5, 0xa2, 0x2e, 0x91, 0xe0, 0x03, 0x15, 0xaa, 0x41, 0x01, 0x00, 0xd0, + 0x21, 0xe0, 0x08, 0x91, 0x48, 0xb4, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0xc0, 0xfe, 0xff, 0x35, 0xa0, 0x82, 0x01, 0x91, 0x41, 0x01, 0x00, 0xd0, + 0x21, 0x60, 0x09, 0x91, 0x42, 0xb4, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0xf0, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x2a, 0x23, 0x10, 0x00, 0xd0, + 0x63, 0xe0, 0x0b, 0x91, 0x02, 0x4c, 0x22, 0x8b, 0xc5, 0x02, 0x00, 0xf0, + 0xa5, 0x20, 0x21, 0x91, 0xa2, 0x18, 0x02, 0x8b, 0x04, 0x15, 0x80, 0xd2, + 0x63, 0x78, 0x60, 0xb8, 0x46, 0x40, 0x00, 0x91, 0xa0, 0x18, 0x00, 0x8b, + 0x48, 0x24, 0x41, 0xa9, 0x28, 0x24, 0x00, 0xa9, 0x63, 0x7c, 0x04, 0x9b, + 0x24, 0x10, 0x00, 0xd0, 0x84, 0xa0, 0x02, 0x91, 0x82, 0x00, 0x03, 0x8b, + 0xc8, 0x24, 0x41, 0xa9, 0x28, 0x24, 0x01, 0xa9, 0x45, 0x04, 0x40, 0xb9, + 0xc6, 0x10, 0x40, 0xf9, 0x26, 0x10, 0x00, 0xf9, 0xa1, 0x04, 0x00, 0x51, + 0x9f, 0x68, 0x23, 0xb8, 0x41, 0x04, 0x00, 0xb9, 0x1f, 0x0c, 0x00, 0xb9, + 0x5f, 0x14, 0x00, 0xb9, 0x5f, 0x3c, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x03, 0x00, 0x2a, 0x04, 0x66, 0x80, 0xd2, 0xe5, 0x02, 0x00, 0xd0, + 0xa5, 0x20, 0x0c, 0x91, 0xe6, 0x02, 0x00, 0x90, 0xc6, 0x20, 0x26, 0x91, + 0x04, 0x7c, 0x04, 0x9b, 0x7f, 0x00, 0x00, 0x71, 0xe2, 0x03, 0x02, 0x2a, + 0x83, 0x04, 0x80, 0xd2, 0x85, 0x00, 0x05, 0x8b, 0x84, 0x00, 0x06, 0x8b, + 0x84, 0x10, 0x85, 0x9a, 0x25, 0x10, 0x00, 0xd0, 0xa5, 0xe0, 0x0b, 0x91, + 0x08, 0x15, 0x80, 0xd2, 0x42, 0x10, 0x03, 0x9b, 0xa3, 0x78, 0x60, 0xb8, + 0x25, 0x10, 0x00, 0xd0, 0xa5, 0xa0, 0x02, 0x91, 0x42, 0x20, 0x07, 0x91, + 0x46, 0x1c, 0x40, 0xa9, 0x63, 0x7c, 0x08, 0x9b, 0x26, 0x1c, 0x00, 0xa9, + 0xa0, 0x00, 0x03, 0x8b, 0x46, 0x1c, 0x41, 0xa9, 0x26, 0x1c, 0x01, 0xa9, + 0x06, 0x04, 0x40, 0xb9, 0x42, 0x20, 0x40, 0xb9, 0x22, 0x20, 0x00, 0xb9, + 0xc1, 0x04, 0x00, 0x51, 0xbf, 0x68, 0x23, 0xb8, 0x01, 0x04, 0x00, 0xb9, + 0x9f, 0x0c, 0x00, 0xb9, 0x1f, 0x14, 0x00, 0xb9, 0x1f, 0x3c, 0x00, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x2a, 0x04, 0x66, 0x80, 0xd2, + 0xe5, 0x02, 0x00, 0xd0, 0xa5, 0x20, 0x0c, 0x91, 0xe6, 0x02, 0x00, 0x90, + 0xc6, 0x20, 0x26, 0x91, 0x04, 0x7c, 0x04, 0x9b, 0x7f, 0x00, 0x00, 0x71, + 0xe2, 0x03, 0x02, 0x2a, 0x07, 0x05, 0x80, 0xd2, 0x85, 0x00, 0x05, 0x8b, + 0x84, 0x00, 0x06, 0x8b, 0x84, 0x10, 0x85, 0x9a, 0x23, 0x10, 0x00, 0xd0, + 0x63, 0xe0, 0x0b, 0x91, 0x05, 0x15, 0x80, 0xd2, 0x42, 0x10, 0x07, 0x9b, + 0x60, 0x78, 0x60, 0xb8, 0x23, 0x10, 0x00, 0xd0, 0x63, 0xa0, 0x02, 0x91, + 0x46, 0x40, 0x00, 0x91, 0x48, 0x24, 0x41, 0xa9, 0x02, 0x7c, 0x05, 0x9b, + 0x28, 0x24, 0x00, 0xa9, 0x60, 0x00, 0x02, 0x8b, 0xc8, 0x24, 0x41, 0xa9, + 0x28, 0x24, 0x01, 0xa9, 0x05, 0x04, 0x40, 0xb9, 0xc6, 0x10, 0x40, 0xf9, + 0x26, 0x10, 0x00, 0xf9, 0xa1, 0x04, 0x00, 0x51, 0x7f, 0x68, 0x22, 0xb8, + 0x01, 0x04, 0x00, 0xb9, 0x9f, 0x0c, 0x00, 0xb9, 0x1f, 0x14, 0x00, 0xb9, + 0x1f, 0x3c, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x2a, + 0xe7, 0x02, 0x00, 0xf0, 0xe7, 0x20, 0x32, 0x91, 0x82, 0x14, 0x80, 0xd2, + 0x02, 0x1c, 0x02, 0x9b, 0x43, 0x40, 0x40, 0x39, 0x23, 0x00, 0x00, 0x39, + 0x03, 0x04, 0x00, 0x34, 0x42, 0x50, 0x00, 0x91, 0x24, 0x10, 0x00, 0x91, + 0x48, 0x24, 0x40, 0xa9, 0x88, 0x24, 0x00, 0xa9, 0x48, 0x24, 0x41, 0xa9, + 0x88, 0x24, 0x01, 0xa9, 0x23, 0x30, 0x40, 0x79, 0x42, 0x20, 0x40, 0xb9, + 0x22, 0x24, 0x00, 0xb9, 0x62, 0x04, 0x00, 0x51, 0x22, 0x30, 0x00, 0x79, + 0x22, 0x10, 0x00, 0xd0, 0x42, 0xe0, 0x0b, 0x91, 0x05, 0x15, 0x80, 0xd2, + 0x86, 0x14, 0x80, 0xd2, 0x24, 0x10, 0x00, 0xd0, 0x84, 0xa0, 0x02, 0x91, + 0x43, 0x78, 0x60, 0xb8, 0x00, 0x1c, 0x06, 0x9b, 0x63, 0x7c, 0x05, 0x9b, + 0x05, 0xc0, 0x49, 0xf8, 0x82, 0x00, 0x03, 0x8b, 0x25, 0xc0, 0x08, 0xf8, + 0x9f, 0x68, 0x23, 0xb8, 0x41, 0x04, 0x40, 0xb9, 0x1f, 0x0c, 0x00, 0xb9, + 0x20, 0x04, 0x00, 0x51, 0x40, 0x04, 0x00, 0xb9, 0x5f, 0x14, 0x00, 0xb9, + 0x5f, 0x3c, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x48, 0xa4, 0x43, 0xa9, + 0x28, 0xa4, 0x02, 0xa9, 0x48, 0xa4, 0x44, 0xa9, 0x28, 0xa4, 0x03, 0xa9, + 0x48, 0xa4, 0x45, 0xa9, 0x28, 0xa4, 0x04, 0xa9, 0x48, 0xa4, 0x46, 0xa9, + 0x28, 0xa4, 0x05, 0xa9, 0x48, 0xa4, 0x47, 0xa9, 0x28, 0xa4, 0x06, 0xa9, + 0x48, 0xa4, 0x48, 0xa9, 0x28, 0xa4, 0x07, 0xa9, 0x42, 0x98, 0x40, 0xb9, + 0x22, 0x88, 0x00, 0xb9, 0xde, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x2a, 0x06, 0x03, 0x00, 0x90, + 0xc6, 0xa0, 0x06, 0x91, 0x02, 0x14, 0x80, 0xd2, 0x02, 0x18, 0x02, 0x9b, + 0x43, 0x10, 0x40, 0xb9, 0x23, 0x00, 0x00, 0xb9, 0xc3, 0x03, 0x00, 0x35, + 0x42, 0x50, 0x00, 0x91, 0x24, 0x10, 0x00, 0x91, 0x48, 0x24, 0x40, 0xa9, + 0x88, 0x24, 0x00, 0xa9, 0x48, 0x24, 0x41, 0xa9, 0x88, 0x24, 0x01, 0xa9, + 0x23, 0x30, 0x40, 0x79, 0x42, 0x20, 0x40, 0xb9, 0x22, 0x24, 0x00, 0xb9, + 0x62, 0x04, 0x00, 0x51, 0x22, 0x30, 0x00, 0x79, 0x23, 0x10, 0x00, 0xd0, + 0x63, 0xe0, 0x0b, 0x91, 0x05, 0x14, 0x80, 0xd2, 0x04, 0x15, 0x80, 0xd2, + 0x22, 0x10, 0x00, 0xd0, 0x42, 0xa0, 0x02, 0x91, 0x61, 0x78, 0x60, 0xb8, + 0x00, 0x18, 0x05, 0x9b, 0x21, 0x7c, 0x04, 0x9b, 0x1f, 0x0c, 0x00, 0xb9, + 0x40, 0x00, 0x01, 0x8b, 0x5f, 0x68, 0x21, 0xb8, 0x01, 0x04, 0x40, 0xb9, + 0x1f, 0x14, 0x00, 0xb9, 0x21, 0x04, 0x00, 0x51, 0x01, 0x04, 0x00, 0xb9, + 0x1f, 0x3c, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x7f, 0x04, 0x00, 0x71, + 0xa1, 0xfd, 0xff, 0x54, 0x48, 0xa4, 0x43, 0xa9, 0x28, 0xa4, 0x02, 0xa9, + 0x23, 0xa0, 0x00, 0x91, 0x48, 0xa4, 0x44, 0xa9, 0x28, 0xa4, 0x03, 0xa9, + 0x48, 0xa4, 0x45, 0xa9, 0x28, 0xa4, 0x04, 0xa9, 0x48, 0xa4, 0x46, 0xa9, + 0x28, 0xa4, 0x05, 0xa9, 0x48, 0xa4, 0x47, 0xa9, 0x28, 0xa4, 0x06, 0xa9, + 0x48, 0xa4, 0x48, 0xa9, 0x28, 0xa4, 0x07, 0xa9, 0x41, 0x98, 0x40, 0xb9, + 0x61, 0x60, 0x00, 0xb9, 0xdd, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x03, 0x00, 0x2a, 0x06, 0x03, 0x00, 0x90, 0xc6, 0xa0, 0x1a, 0x91, + 0x02, 0x14, 0x80, 0xd2, 0x02, 0x18, 0x02, 0x9b, 0x43, 0x10, 0x40, 0xb9, + 0x23, 0x00, 0x00, 0xb9, 0xc3, 0x03, 0x00, 0x35, 0x42, 0x50, 0x00, 0x91, + 0x24, 0x10, 0x00, 0x91, 0x48, 0x24, 0x40, 0xa9, 0x88, 0x24, 0x00, 0xa9, + 0x48, 0x24, 0x41, 0xa9, 0x88, 0x24, 0x01, 0xa9, 0x23, 0x30, 0x40, 0x79, + 0x42, 0x20, 0x40, 0xb9, 0x22, 0x24, 0x00, 0xb9, 0x62, 0x04, 0x00, 0x51, + 0x22, 0x30, 0x00, 0x79, 0x23, 0x10, 0x00, 0xd0, 0x63, 0xe0, 0x0b, 0x91, + 0x05, 0x14, 0x80, 0xd2, 0x04, 0x15, 0x80, 0xd2, 0x22, 0x10, 0x00, 0xd0, + 0x42, 0xa0, 0x02, 0x91, 0x61, 0x78, 0x60, 0xb8, 0x00, 0x18, 0x05, 0x9b, + 0x21, 0x7c, 0x04, 0x9b, 0x1f, 0x0c, 0x00, 0xb9, 0x40, 0x00, 0x01, 0x8b, + 0x5f, 0x68, 0x21, 0xb8, 0x01, 0x04, 0x40, 0xb9, 0x1f, 0x14, 0x00, 0xb9, + 0x21, 0x04, 0x00, 0x51, 0x01, 0x04, 0x00, 0xb9, 0x1f, 0x3c, 0x00, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0x7f, 0x04, 0x00, 0x71, 0xa1, 0xfd, 0xff, 0x54, + 0x48, 0xa4, 0x43, 0xa9, 0x28, 0xa4, 0x02, 0xa9, 0x23, 0xa0, 0x00, 0x91, + 0x48, 0xa4, 0x44, 0xa9, 0x28, 0xa4, 0x03, 0xa9, 0x48, 0xa4, 0x45, 0xa9, + 0x28, 0xa4, 0x04, 0xa9, 0x48, 0xa4, 0x46, 0xa9, 0x28, 0xa4, 0x05, 0xa9, + 0x48, 0xa4, 0x47, 0xa9, 0x28, 0xa4, 0x06, 0xa9, 0x48, 0xa4, 0x48, 0xa9, + 0x28, 0xa4, 0x07, 0xa9, 0x41, 0x98, 0x40, 0xb9, 0x61, 0x60, 0x00, 0xb9, + 0xdd, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x2a, + 0x85, 0x16, 0x80, 0xd2, 0xe3, 0x02, 0x00, 0x90, 0x63, 0xa0, 0x0f, 0x91, + 0xc4, 0x02, 0x00, 0xf0, 0x84, 0x20, 0x39, 0x91, 0x05, 0x7c, 0x05, 0x9b, + 0x5f, 0x20, 0x00, 0x71, 0x63, 0x00, 0x05, 0x8b, 0x82, 0x00, 0x05, 0x8b, + 0x42, 0x10, 0x83, 0x9a, 0x46, 0x1c, 0x41, 0xa9, 0x44, 0x7c, 0x40, 0xb9, + 0x45, 0x40, 0x47, 0xf8, 0x26, 0x1c, 0x00, 0xa9, 0x46, 0x1c, 0x42, 0xa9, + 0x26, 0x1c, 0x01, 0xa9, 0x46, 0x1c, 0x43, 0xa9, 0x26, 0x1c, 0x02, 0xa9, + 0x46, 0x1c, 0x44, 0xa9, 0x26, 0x1c, 0x03, 0xa9, 0x46, 0x1c, 0x45, 0xa9, + 0x26, 0x1c, 0x04, 0xa9, 0x46, 0x1c, 0x46, 0xa9, 0x26, 0x1c, 0x05, 0xa9, + 0x43, 0x70, 0x40, 0xb9, 0x23, 0x60, 0x00, 0xb9, 0x25, 0x40, 0x06, 0xf8, + 0x24, 0x6c, 0x00, 0xb9, 0xe4, 0x00, 0x00, 0x34, 0x46, 0x1c, 0x48, 0xa9, + 0x26, 0x1c, 0x07, 0xa9, 0x46, 0x1c, 0x49, 0xa9, 0x26, 0x1c, 0x08, 0xa9, + 0x44, 0x50, 0x40, 0xf9, 0x24, 0x48, 0x00, 0xf9, 0x25, 0x10, 0x00, 0xd0, + 0xa5, 0xe0, 0x0b, 0x91, 0x48, 0x1c, 0x55, 0x29, 0x06, 0x15, 0x80, 0xd2, + 0xa3, 0x78, 0x60, 0xb8, 0x24, 0x10, 0x00, 0xd0, 0x84, 0xa0, 0x02, 0x91, + 0x28, 0x1c, 0x13, 0x29, 0x40, 0xc0, 0x42, 0x39, 0x63, 0x7c, 0x06, 0x9b, + 0x20, 0x80, 0x02, 0x39, 0x5f, 0x0c, 0x00, 0xb9, 0x80, 0x00, 0x03, 0x8b, + 0x9f, 0x68, 0x23, 0xb8, 0x01, 0x04, 0x40, 0xb9, 0x1f, 0x14, 0x00, 0xb9, + 0x21, 0x04, 0x00, 0x51, 0x01, 0x04, 0x00, 0xb9, 0x1f, 0x3c, 0x00, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0x2a, 0x34, 0x10, 0x00, 0xd0, + 0x94, 0xa2, 0x02, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0xf7, 0x1b, 0x00, 0xf9, + 0x6c, 0xa5, 0xff, 0x97, 0xf7, 0x03, 0x00, 0x2a, 0x66, 0xa5, 0xff, 0x97, + 0x02, 0x15, 0x80, 0xd2, 0x62, 0x52, 0x02, 0x9b, 0x56, 0x98, 0x40, 0xb9, + 0xc2, 0x06, 0x00, 0x51, 0x5f, 0x5c, 0x09, 0x71, 0xe9, 0x00, 0x00, 0x54, + 0x20, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf5, 0x03, 0x00, 0x2a, 0x60, 0xa5, 0xff, 0x97, 0xa2, 0x99, 0x99, 0x52, + 0x82, 0x99, 0xb9, 0x72, 0x1f, 0x0c, 0x00, 0x71, 0xe1, 0x0a, 0xd5, 0x1a, + 0x21, 0x7c, 0xa2, 0x9b, 0x21, 0xfc, 0x62, 0xd3, 0x21, 0x7c, 0x16, 0x1b, + 0xa0, 0x01, 0x00, 0x54, 0xc0, 0x08, 0x80, 0x52, 0x21, 0x7c, 0x00, 0x1b, + 0x21, 0x18, 0x01, 0x51, 0x02, 0x15, 0x80, 0xd2, 0x00, 0x00, 0x80, 0x52, + 0xf5, 0x5b, 0x42, 0xa9, 0x73, 0x52, 0x02, 0x9b, 0xf7, 0x1b, 0x40, 0xf9, + 0x61, 0x4e, 0x00, 0xb9, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x80, 0x07, 0x80, 0x52, 0x21, 0x7c, 0x00, 0x1b, + 0x21, 0xf0, 0x00, 0x51, 0xf4, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0x01, 0x15, 0x80, 0xd2, 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0x03, 0x14, 0x40, 0xb9, 0x16, 0x08, 0x41, 0x29, 0xf3, 0x53, 0x01, 0xa9, + 0x34, 0x10, 0x00, 0xb0, 0x95, 0xa2, 0x02, 0x91, 0xf4, 0x03, 0x16, 0x2a, + 0x05, 0x10, 0x40, 0x29, 0x5f, 0x00, 0x00, 0x71, 0x81, 0x7e, 0x01, 0x9b, + 0xb3, 0x02, 0x01, 0x8b, 0x65, 0x92, 0x04, 0x29, 0x76, 0x2e, 0x00, 0xb9, + 0x63, 0x0a, 0x13, 0x29, 0x03, 0x00, 0x80, 0x52, 0x62, 0x4a, 0x40, 0xb9, + 0x40, 0x08, 0x41, 0x7a, 0x40, 0x01, 0x00, 0x54, 0x02, 0x15, 0x80, 0xd2, + 0x21, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x03, 0x2a, 0x94, 0x56, 0x02, 0x9b, + 0xf5, 0x5b, 0x42, 0xa9, 0x81, 0x82, 0x02, 0x39, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x02, 0x10, 0x40, 0xb9, + 0x5f, 0x04, 0x00, 0x71, 0x41, 0x01, 0x00, 0x54, 0x22, 0x10, 0x00, 0xb0, + 0x42, 0xd0, 0x03, 0x91, 0x21, 0x00, 0x02, 0x8b, 0x03, 0x00, 0x80, 0x52, + 0x04, 0x94, 0x41, 0xa9, 0x24, 0x14, 0x00, 0xa9, 0x00, 0x2c, 0x40, 0xf9, + 0x60, 0x4a, 0x00, 0xf9, 0xec, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x16, 0x2a, + 0xa1, 0xff, 0xff, 0x97, 0xe3, 0x03, 0x00, 0x2a, 0x00, 0xfd, 0xff, 0x35, + 0x61, 0x26, 0x40, 0xb9, 0xe0, 0x03, 0x16, 0x2a, 0x48, 0xfa, 0xff, 0x97, + 0x60, 0x4a, 0x00, 0xf9, 0xe3, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xe2, 0x02, 0x00, 0xf0, 0x42, 0xa0, 0x06, 0x91, 0x21, 0x1c, 0x40, 0x92, + 0x1f, 0x04, 0x00, 0x71, 0xa0, 0x02, 0x00, 0x54, 0x1f, 0x08, 0x00, 0x71, + 0x20, 0x02, 0x00, 0x54, 0x1f, 0x20, 0x00, 0x71, 0x60, 0x03, 0x00, 0x54, + 0x1f, 0x1c, 0x00, 0x71, 0xa0, 0x00, 0x00, 0x54, 0x1f, 0x14, 0x00, 0x71, + 0x60, 0x00, 0x00, 0x54, 0x1f, 0x18, 0x00, 0x71, 0xa1, 0x03, 0x00, 0x54, + 0xc0, 0x02, 0x00, 0xd0, 0x00, 0x20, 0x39, 0x91, 0x82, 0x16, 0x80, 0xd2, + 0x21, 0x00, 0x02, 0x9b, 0x20, 0x0c, 0x41, 0x39, 0x1f, 0x00, 0x00, 0x71, + 0xe0, 0x07, 0x9f, 0x1a, 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x02, 0x00, 0xf0, + 0x42, 0xa0, 0x1a, 0x91, 0x03, 0x14, 0x80, 0xd2, 0x00, 0x00, 0x80, 0x52, + 0x21, 0x08, 0x03, 0x9b, 0x22, 0x10, 0x40, 0xb9, 0x5f, 0x04, 0x00, 0x71, + 0x01, 0xff, 0xff, 0x54, 0x20, 0xac, 0x41, 0x39, 0x1f, 0x00, 0x00, 0x71, + 0xe0, 0x07, 0x9f, 0x1a, 0xc0, 0x03, 0x5f, 0xd6, 0xc0, 0x02, 0x00, 0xf0, + 0x00, 0xa0, 0x0f, 0x91, 0x82, 0x16, 0x80, 0xd2, 0x21, 0x00, 0x02, 0x9b, + 0x20, 0x0c, 0x41, 0x39, 0x1f, 0x00, 0x00, 0x71, 0xe0, 0x07, 0x9f, 0x1a, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbc, 0xa9, 0xe3, 0x03, 0x01, 0x2a, 0x02, 0x30, 0x80, 0xd2, + 0xfd, 0x03, 0x00, 0x91, 0xe3, 0x3b, 0x00, 0xb9, 0x01, 0x00, 0x80, 0x52, + 0x03, 0x00, 0x40, 0xf9, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, + 0xff, 0x1b, 0x00, 0xf9, 0x60, 0x00, 0x06, 0xd1, 0xe0, 0x17, 0x00, 0xf9, + 0xa4, 0x96, 0x00, 0x94, 0xe0, 0xa3, 0x00, 0x91, 0xfe, 0x9e, 0xff, 0x97, + 0x40, 0x00, 0x00, 0x35, 0x7f, 0x02, 0x00, 0xf9, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbb, 0xa9, + 0x1f, 0x0c, 0x00, 0x71, 0x23, 0x00, 0xc0, 0xd2, 0xfd, 0x03, 0x00, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x97, 0x9f, 0x1a, 0xf6, 0x03, 0x02, 0xaa, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x15, 0x2a, + 0xf7, 0x1b, 0x00, 0xf9, 0xf7, 0x03, 0x01, 0xaa, 0xe3, 0x23, 0x00, 0xf9, + 0xff, 0x23, 0x01, 0x39, 0x6e, 0xfc, 0xff, 0x97, 0x80, 0x02, 0x00, 0x35, + 0xe0, 0x03, 0x13, 0x2a, 0x01, 0x00, 0x80, 0x52, 0x86, 0xfc, 0xff, 0x97, + 0xc0, 0x01, 0x00, 0x35, 0xe1, 0x03, 0x13, 0x2a, 0xe0, 0x03, 0x16, 0xaa, + 0x34, 0x80, 0x80, 0x52, 0x15, 0xfd, 0xff, 0x97, 0x60, 0x02, 0x00, 0x34, + 0xe0, 0x03, 0x15, 0x2a, 0x76, 0xfc, 0xff, 0x97, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xb4, 0x80, 0x80, 0x52, + 0xf7, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0xe4, 0x03, 0x13, 0x2a, + 0x43, 0x01, 0x00, 0xb0, 0x81, 0x00, 0x80, 0x52, 0x63, 0xe0, 0x09, 0x91, + 0x00, 0x02, 0x80, 0x52, 0xc3, 0xd5, 0xff, 0x97, 0xe6, 0xff, 0xff, 0x17, + 0xc1, 0x02, 0x40, 0xb9, 0xe3, 0x03, 0x17, 0xaa, 0xe4, 0x03, 0x01, 0x91, + 0xe0, 0x03, 0x13, 0x2a, 0xe2, 0x00, 0x80, 0x52, 0x38, 0xfa, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0xe0, 0xfc, 0xff, 0x35, 0xe0, 0x03, 0x13, 0x2a, + 0x3c, 0xfd, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0x60, 0xfc, 0xff, 0x35, + 0xe0, 0x03, 0x15, 0x2a, 0x58, 0xfc, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0xe1, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, + 0x1f, 0x0c, 0x00, 0x71, 0x23, 0x00, 0xc0, 0xd2, 0xfd, 0x03, 0x00, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x97, 0x9f, 0x1a, 0xf6, 0x03, 0x02, 0xaa, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x15, 0x2a, + 0xf7, 0x1b, 0x00, 0xf9, 0xf7, 0x03, 0x01, 0xaa, 0xe3, 0x23, 0x00, 0xf9, + 0xff, 0x23, 0x01, 0x39, 0x32, 0xfc, 0xff, 0x97, 0x80, 0x02, 0x00, 0x35, + 0xe0, 0x03, 0x13, 0x2a, 0x01, 0x00, 0x80, 0x52, 0x4a, 0xfc, 0xff, 0x97, + 0xc0, 0x01, 0x00, 0x35, 0xe1, 0x03, 0x13, 0x2a, 0xe0, 0x03, 0x16, 0xaa, + 0x34, 0x80, 0x80, 0x52, 0xd9, 0xfc, 0xff, 0x97, 0x60, 0x02, 0x00, 0x34, + 0xe0, 0x03, 0x15, 0x2a, 0x3a, 0xfc, 0xff, 0x97, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xb4, 0x80, 0x80, 0x52, + 0xf7, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0xe4, 0x03, 0x13, 0x2a, + 0x43, 0x01, 0x00, 0xb0, 0x81, 0x00, 0x80, 0x52, 0x63, 0xa0, 0x0a, 0x91, + 0x00, 0x02, 0x80, 0x52, 0x87, 0xd5, 0xff, 0x97, 0xe6, 0xff, 0xff, 0x17, + 0xc1, 0x02, 0x40, 0xb9, 0xe3, 0x03, 0x17, 0xaa, 0xe4, 0x03, 0x01, 0x91, + 0xe0, 0x03, 0x13, 0x2a, 0xa2, 0x00, 0x80, 0x52, 0xfc, 0xf9, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0xe0, 0xfc, 0xff, 0x35, 0xe0, 0x03, 0x13, 0x2a, + 0x00, 0xfd, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0x60, 0xfc, 0xff, 0x35, + 0xe0, 0x03, 0x15, 0x2a, 0x1c, 0xfc, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0xe1, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, + 0x1f, 0x0c, 0x00, 0x71, 0x23, 0x00, 0xc0, 0xd2, 0xfd, 0x03, 0x00, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x97, 0x9f, 0x1a, 0xf6, 0x03, 0x02, 0xaa, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x15, 0x2a, + 0xf7, 0x1b, 0x00, 0xf9, 0xf7, 0x03, 0x01, 0xaa, 0xe3, 0x23, 0x00, 0xf9, + 0xff, 0x23, 0x01, 0x39, 0xf6, 0xfb, 0xff, 0x97, 0x80, 0x02, 0x00, 0x35, + 0xe0, 0x03, 0x13, 0x2a, 0x01, 0x00, 0x80, 0x52, 0x0e, 0xfc, 0xff, 0x97, + 0xc0, 0x01, 0x00, 0x35, 0xe1, 0x03, 0x13, 0x2a, 0xe0, 0x03, 0x16, 0xaa, + 0x34, 0x80, 0x80, 0x52, 0x9d, 0xfc, 0xff, 0x97, 0x60, 0x02, 0x00, 0x34, + 0xe0, 0x03, 0x15, 0x2a, 0xfe, 0xfb, 0xff, 0x97, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xb4, 0x80, 0x80, 0x52, + 0xf7, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0xe4, 0x03, 0x13, 0x2a, + 0x43, 0x01, 0x00, 0xb0, 0x81, 0x00, 0x80, 0x52, 0x63, 0x80, 0x0b, 0x91, + 0x00, 0x02, 0x80, 0x52, 0x4b, 0xd5, 0xff, 0x97, 0xe6, 0xff, 0xff, 0x17, + 0xc1, 0x02, 0x40, 0xb9, 0xe3, 0x03, 0x17, 0xaa, 0xe4, 0x03, 0x01, 0x91, + 0xe0, 0x03, 0x13, 0x2a, 0xc2, 0x00, 0x80, 0x52, 0xc0, 0xf9, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0xe0, 0xfc, 0xff, 0x35, 0xe0, 0x03, 0x13, 0x2a, + 0xc4, 0xfc, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0x60, 0xfc, 0xff, 0x35, + 0xe0, 0x03, 0x15, 0x2a, 0xe0, 0xfb, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0xe1, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, + 0x1f, 0x0c, 0x00, 0x71, 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0xf6, 0x97, 0x9f, 0x1a, 0xf5, 0x03, 0x01, 0xaa, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x16, 0x2a, 0xf7, 0x63, 0x03, 0xa9, + 0x77, 0x1c, 0x00, 0x12, 0x98, 0x1c, 0x00, 0x12, 0xf9, 0x23, 0x00, 0xf9, + 0xf9, 0x03, 0x02, 0xaa, 0xba, 0xfb, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0xa0, 0x05, 0x00, 0x35, 0xff, 0x02, 0x18, 0x6b, 0x80, 0x06, 0x00, 0x54, + 0xa0, 0x02, 0x40, 0xb9, 0x1f, 0x04, 0x00, 0x71, 0x60, 0x06, 0x00, 0x54, + 0x60, 0x01, 0x00, 0x34, 0x53, 0x81, 0x80, 0x52, 0xe0, 0x03, 0x16, 0x2a, + 0xc3, 0xfb, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x14, 0x2a, + 0x81, 0x00, 0x80, 0x52, 0xc1, 0xfb, 0xff, 0x97, 0x93, 0xfe, 0xff, 0x35, + 0xb3, 0x80, 0x80, 0x52, 0x40, 0xfe, 0xff, 0x35, 0xe1, 0x03, 0x14, 0x2a, + 0xe0, 0x03, 0x19, 0xaa, 0x4f, 0xfc, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0xa0, 0xfd, 0xff, 0x35, 0x21, 0x03, 0x40, 0xb9, 0xe4, 0x03, 0x18, 0x2a, + 0xe3, 0x03, 0x17, 0x2a, 0xe2, 0x03, 0x15, 0xaa, 0xe0, 0x03, 0x14, 0x2a, + 0x53, 0xf9, 0xff, 0x97, 0xe0, 0x03, 0x14, 0x2a, 0x89, 0xfc, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0x60, 0xfc, 0xff, 0x35, 0xe0, 0x03, 0x16, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, 0xa0, 0xfb, 0xff, 0x17, + 0xe2, 0x03, 0x00, 0x2a, 0xe4, 0x03, 0x14, 0x2a, 0x43, 0x01, 0x00, 0xb0, + 0x81, 0x00, 0x80, 0x52, 0x63, 0x60, 0x0c, 0x91, 0x00, 0x02, 0x80, 0x52, + 0xf5, 0xd4, 0xff, 0x97, 0xff, 0x02, 0x18, 0x6b, 0xc1, 0xf9, 0xff, 0x54, + 0x13, 0x21, 0x80, 0x52, 0xd1, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x14, 0x2a, + 0x61, 0x00, 0x80, 0x52, 0x9a, 0xfb, 0xff, 0x97, 0xb3, 0xf9, 0xff, 0x35, + 0xd9, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x80, 0x52, 0x03, 0x00, 0x80, 0x52, + 0xae, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, + 0x1f, 0x0c, 0x00, 0x71, 0xfd, 0x03, 0x00, 0x91, 0xf7, 0x1b, 0x00, 0xf9, + 0xf7, 0x97, 0x9f, 0x1a, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x17, 0x2a, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x01, 0x2a, + 0xf6, 0x03, 0x02, 0xaa, 0x69, 0xfb, 0xff, 0x97, 0xc0, 0x02, 0x00, 0x35, + 0x7f, 0x1e, 0x00, 0x71, 0x49, 0x01, 0x00, 0x54, 0xe0, 0x03, 0x17, 0x2a, + 0x34, 0x00, 0x80, 0x52, 0x77, 0xfb, 0xff, 0x97, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe1, 0x03, 0x15, 0x2a, + 0xe0, 0x03, 0x13, 0x2a, 0xc2, 0xfb, 0xff, 0x97, 0xc0, 0x02, 0x00, 0x39, + 0xe0, 0x03, 0x17, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0x67, 0xfb, 0xff, 0x17, + 0xe2, 0x03, 0x00, 0x2a, 0xf4, 0x03, 0x00, 0x2a, 0xe4, 0x03, 0x13, 0x2a, + 0x43, 0x01, 0x00, 0xb0, 0x81, 0x00, 0x80, 0x52, 0x63, 0x20, 0x0d, 0x91, + 0x00, 0x02, 0x80, 0x52, 0xbb, 0xd4, 0xff, 0x97, 0x7f, 0x1e, 0x00, 0x71, + 0x88, 0xfc, 0xff, 0x54, 0xe0, 0x03, 0x17, 0x2a, 0x5b, 0xfb, 0xff, 0x97, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xc0, 0xf8, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, 0x00, 0x0c, 0x40, 0xb9, + 0xff, 0xbf, 0x00, 0x39, 0x1f, 0x04, 0x00, 0x71, 0xc1, 0x00, 0x00, 0x54, + 0x61, 0x02, 0x40, 0xb9, 0xa0, 0x81, 0x80, 0x52, 0x21, 0x14, 0x00, 0x51, + 0x3f, 0x08, 0x00, 0x71, 0x69, 0x01, 0x00, 0x54, 0x60, 0x0a, 0x40, 0xb9, + 0xe1, 0xbf, 0x00, 0x91, 0x19, 0xfb, 0xff, 0x97, 0xe0, 0x00, 0x00, 0x35, + 0xe1, 0xbf, 0x40, 0x39, 0xa0, 0x80, 0x80, 0x52, 0x81, 0x00, 0x00, 0x35, + 0xe0, 0x03, 0x13, 0xaa, 0x33, 0xfe, 0xff, 0x97, 0x80, 0x00, 0x00, 0x34, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x0a, 0x40, 0xb9, 0x11, 0xfc, 0xff, 0x97, 0xfb, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x00, 0x00, 0xb4, 0x01, 0x00, 0x40, 0xf9, 0x61, 0x00, 0x00, 0xb4, + 0x81, 0x00, 0x80, 0x52, 0x88, 0xfe, 0xff, 0x17, 0x40, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0xb4, + 0x01, 0x00, 0x40, 0xf9, 0x61, 0x00, 0x00, 0xb4, 0xc1, 0x00, 0x80, 0x52, + 0x80, 0xfe, 0xff, 0x17, 0x40, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x0c, 0x00, 0x71, + 0xa9, 0x00, 0x00, 0x54, 0x1f, 0x1c, 0x00, 0x71, 0x20, 0x00, 0x80, 0x52, + 0x88, 0x00, 0x00, 0x54, 0xaa, 0x38, 0x00, 0x14, 0x00, 0x00, 0x80, 0x52, + 0xa8, 0x38, 0x00, 0x14, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0x41, 0x01, 0x00, 0xb0, + 0x21, 0xe0, 0x0d, 0x91, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0xf3, 0x02, 0x00, 0xf0, 0x73, 0x42, 0x33, 0x91, 0xe0, 0x03, 0x13, 0xaa, + 0xbc, 0xb0, 0xff, 0x97, 0x80, 0x00, 0x00, 0x34, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x82, 0x01, 0x91, + 0x41, 0x01, 0x00, 0xb0, 0x21, 0x60, 0x0e, 0x91, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xb2, 0xb0, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x00, 0xb4, 0xef, 0x39, 0x00, 0x14, 0x40, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x1c, 0x00, 0x12, 0x1f, 0xef, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, + 0x5f, 0x00, 0x00, 0xf1, 0x64, 0x18, 0x40, 0xfa, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x53, 0x00, 0x80, 0x52, 0xff, 0x9f, 0x00, 0x79, + 0xc0, 0x03, 0x00, 0x54, 0xf5, 0x5b, 0x02, 0xa9, 0x3f, 0x0c, 0x00, 0x71, + 0xf6, 0x03, 0x01, 0x2a, 0x33, 0x00, 0x80, 0x52, 0xa8, 0x03, 0x00, 0x54, + 0xf7, 0x63, 0x03, 0xa9, 0x18, 0x1c, 0x00, 0x12, 0xf5, 0x03, 0x02, 0xaa, + 0xf4, 0x03, 0x03, 0xaa, 0xf7, 0x03, 0x00, 0x2a, 0xe1, 0x3b, 0x01, 0x91, + 0xe0, 0x03, 0x18, 0x2a, 0x58, 0x3a, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0x00, 0x03, 0x00, 0x35, 0xe2, 0x03, 0x14, 0xaa, 0xe1, 0x03, 0x16, 0x2a, + 0xe0, 0x03, 0x18, 0x2a, 0x2e, 0x3c, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0x40, 0x02, 0x00, 0x35, 0xe0, 0x03, 0x17, 0x2a, 0xc2, 0xa2, 0xff, 0x97, + 0xe1, 0x9f, 0x40, 0x79, 0x00, 0x3c, 0x42, 0xd3, 0xf7, 0x63, 0x43, 0xa9, + 0x00, 0x00, 0x01, 0x0b, 0xa0, 0x02, 0x00, 0x79, 0xf5, 0x5b, 0x42, 0xa9, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x3f, 0x10, 0x00, 0x71, 0xfd, 0x7b, 0xbe, 0xa9, 0xe2, 0x17, 0x9f, 0x1a, + 0x42, 0x88, 0x02, 0x11, 0xfd, 0x03, 0x00, 0x91, 0xe0, 0x43, 0x00, 0x91, + 0x01, 0x00, 0x80, 0x52, 0xe2, 0x7f, 0x02, 0x29, 0xff, 0x0f, 0x00, 0xf9, + 0xc7, 0xae, 0xff, 0x97, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xbe, 0xa9, 0x82, 0x14, 0x80, 0xd2, 0x01, 0x00, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0xe0, 0x43, 0x00, 0x91, 0xe2, 0x7f, 0x01, 0xa9, + 0xbe, 0xae, 0xff, 0x97, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0x10, 0x00, 0x71, 0xfd, 0x7b, 0xbe, 0xa9, 0xe2, 0x17, 0x9f, 0x1a, + 0x42, 0x94, 0x02, 0x11, 0xfd, 0x03, 0x00, 0x91, 0xe0, 0x43, 0x00, 0x91, + 0x01, 0x00, 0x80, 0x52, 0xe2, 0x7f, 0x02, 0x29, 0xff, 0x0f, 0x00, 0xf9, + 0xaf, 0xae, 0xff, 0x97, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe3, 0x03, 0x00, 0x2a, 0x1f, 0x10, 0x00, 0x71, 0x60, 0x04, 0x00, 0x54, + 0x48, 0x02, 0x00, 0x54, 0x1f, 0x08, 0x00, 0x71, 0xa0, 0x04, 0x00, 0x54, + 0x1f, 0x0c, 0x00, 0x71, 0xc1, 0x00, 0x00, 0x54, 0x80, 0x00, 0x80, 0x52, + 0x20, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x80, 0x52, 0x43, 0x00, 0x00, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x04, 0x00, 0x34, 0x1f, 0x04, 0x00, 0x71, + 0x41, 0x05, 0x00, 0x54, 0x40, 0x00, 0x80, 0x52, 0x20, 0x00, 0x00, 0xb9, + 0x00, 0x00, 0x80, 0x52, 0x43, 0x00, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x1f, 0x18, 0x00, 0x71, 0xc0, 0x03, 0x00, 0x54, 0x1f, 0x1c, 0x00, 0x71, + 0xc1, 0x00, 0x00, 0x54, 0x00, 0x01, 0x80, 0x52, 0x20, 0x00, 0x00, 0xb9, + 0x00, 0x00, 0x80, 0x52, 0x43, 0x00, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x1f, 0x14, 0x00, 0x71, 0x41, 0x03, 0x00, 0x54, 0xc0, 0x00, 0x80, 0x52, + 0x20, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x80, 0x52, 0x43, 0x00, 0x00, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0xa0, 0x00, 0x80, 0x52, 0x20, 0x00, 0x00, 0xb9, + 0x00, 0x00, 0x80, 0x52, 0x43, 0x00, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x00, 0x80, 0x52, 0x20, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x80, 0x52, + 0x43, 0x00, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x80, 0x52, + 0x20, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x80, 0x52, 0x5f, 0x00, 0x00, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x00, 0x80, 0x52, 0x20, 0x00, 0x00, 0xb9, + 0x00, 0x00, 0x80, 0x52, 0x43, 0x00, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0xf3, 0x01, 0x00, 0x90, 0x73, 0xa2, 0x2c, 0x91, 0x62, 0x26, 0x40, 0xb9, + 0x61, 0x26, 0x40, 0xf9, 0x5f, 0x04, 0x00, 0x71, 0x40, 0x03, 0x00, 0x54, + 0xc0, 0xaa, 0x8a, 0x52, 0xa0, 0xaa, 0xaa, 0x72, 0x40, 0x7c, 0x20, 0x9b, + 0x00, 0xfc, 0x60, 0xd3, 0x00, 0x7c, 0x82, 0x4b, 0x00, 0x04, 0x00, 0x0b, + 0x40, 0x00, 0x00, 0x4b, 0x60, 0xce, 0x20, 0x8b, 0x00, 0x18, 0x40, 0xf9, + 0xd9, 0x47, 0x00, 0x94, 0x61, 0x29, 0x00, 0x94, 0x80, 0x00, 0x00, 0x34, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x03, 0x00, 0x80, 0x52, 0x02, 0x00, 0x80, 0x52, 0x01, 0x00, 0x80, 0x52, + 0xe0, 0x02, 0x80, 0x52, 0xa8, 0x31, 0x00, 0x94, 0x00, 0xff, 0xff, 0x35, + 0x7f, 0xa2, 0x00, 0x79, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x1a, 0x40, 0xf9, 0x21, 0xf8, 0x7f, 0xd3, + 0xc7, 0x47, 0x00, 0x94, 0xee, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb9, 0xa9, 0x3f, 0x00, 0x00, 0xf1, + 0x64, 0x18, 0x40, 0xfa, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x54, 0x00, 0x80, 0x52, 0xf9, 0x6b, 0x04, 0xa9, 0xd9, 0x7c, 0x04, 0x1b, + 0xff, 0x7f, 0x0c, 0x29, 0xff, 0x7f, 0x0d, 0x29, 0x60, 0x0e, 0x00, 0x54, + 0x40, 0x0e, 0x00, 0xb4, 0xf7, 0x63, 0x03, 0xa9, 0x97, 0x04, 0x00, 0x51, + 0xf3, 0x03, 0x04, 0x2a, 0xff, 0xfe, 0x03, 0x71, 0x34, 0x00, 0x80, 0x52, + 0x48, 0x0e, 0x00, 0x54, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x01, 0xaa, + 0xa1, 0x20, 0x00, 0x51, 0xf6, 0x03, 0x05, 0x2a, 0x3f, 0xe0, 0x00, 0x71, + 0x68, 0x0d, 0x00, 0x54, 0xc1, 0x04, 0x00, 0x51, 0xfa, 0x03, 0x06, 0x2a, + 0x3f, 0xfc, 0x00, 0x71, 0xe8, 0x0c, 0x00, 0x54, 0xfb, 0x2b, 0x00, 0xf9, + 0x5f, 0x04, 0x04, 0xf1, 0xfb, 0x03, 0x02, 0xaa, 0xa0, 0x80, 0x46, 0x7a, + 0x41, 0x0b, 0x00, 0x54, 0xe1, 0x03, 0x00, 0xaa, 0xf8, 0x03, 0x03, 0xaa, + 0x40, 0x01, 0x00, 0xb0, 0x00, 0xe0, 0x12, 0x91, 0x7b, 0x0f, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0x60, 0x0a, 0x00, 0x35, 0xe1, 0x83, 0x01, 0x91, + 0x40, 0x01, 0x00, 0xb0, 0x00, 0x60, 0x11, 0x91, 0x75, 0x0f, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0xa0, 0x09, 0x00, 0x35, 0xe1, 0x93, 0x01, 0x91, + 0x40, 0x01, 0x00, 0xb0, 0x00, 0xe0, 0x11, 0x91, 0x6f, 0x0f, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0xe0, 0x08, 0x00, 0x35, 0xe1, 0xa3, 0x01, 0x91, + 0x40, 0x01, 0x00, 0xb0, 0x00, 0x20, 0x12, 0x91, 0x69, 0x0f, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0x20, 0x08, 0x00, 0x35, 0xe1, 0xb3, 0x01, 0x91, + 0x40, 0x01, 0x00, 0xb0, 0x00, 0xa0, 0x11, 0x91, 0x63, 0x0f, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0x60, 0x07, 0x00, 0x35, 0xd6, 0x02, 0x1a, 0x0b, + 0x82, 0x03, 0x80, 0xd2, 0xc3, 0x06, 0x00, 0x51, 0xe4, 0x00, 0x80, 0x12, + 0x62, 0x7f, 0x02, 0x9b, 0x01, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x15, 0xaa, + 0x7a, 0x72, 0x1d, 0x53, 0x7b, 0x7c, 0x13, 0x1b, 0x7b, 0x7f, 0x04, 0x1b, + 0xfe, 0x93, 0x00, 0x94, 0xc1, 0x06, 0x16, 0x0b, 0xa7, 0xe2, 0x00, 0x91, + 0xea, 0x27, 0x4c, 0x29, 0x21, 0x7c, 0x01, 0x13, 0x21, 0x04, 0x00, 0x51, + 0x7b, 0x23, 0x00, 0x11, 0xa4, 0x72, 0x00, 0x91, 0x00, 0x13, 0x19, 0x0b, + 0xe8, 0x2f, 0x4d, 0x29, 0x61, 0xfe, 0x01, 0x1b, 0xe2, 0x03, 0x07, 0xaa, + 0xc6, 0x7e, 0x01, 0x53, 0x03, 0x00, 0x80, 0x52, 0x45, 0x00, 0x80, 0x52, + 0x21, 0x70, 0x1d, 0x53, 0xa4, 0x62, 0x00, 0x29, 0x18, 0x0f, 0x19, 0x0b, + 0xaa, 0x5a, 0x01, 0x29, 0xba, 0x4e, 0x02, 0x29, 0xbb, 0x1e, 0x03, 0x29, + 0xb8, 0x22, 0x00, 0xb9, 0xaa, 0xda, 0x04, 0x29, 0xba, 0xce, 0x05, 0x29, + 0xbb, 0x36, 0x00, 0xb9, 0x0c, 0x00, 0x00, 0x14, 0xff, 0x02, 0x03, 0x6b, + 0x80, 0x04, 0x00, 0x54, 0x42, 0x40, 0x1e, 0xb8, 0x48, 0xc0, 0x1e, 0xb8, + 0x40, 0x80, 0x1e, 0xb8, 0x63, 0x04, 0x00, 0x11, 0x46, 0x68, 0x3e, 0x29, + 0x7f, 0x02, 0x03, 0x6b, 0x45, 0x04, 0x3f, 0x29, 0x00, 0x20, 0x00, 0x11, + 0x89, 0x01, 0x00, 0x54, 0x42, 0x70, 0x00, 0x91, 0x83, 0xfe, 0xff, 0x35, + 0x42, 0x40, 0x1e, 0xb8, 0x63, 0x04, 0x00, 0x11, 0x40, 0x80, 0x1e, 0xb8, + 0x7f, 0x02, 0x03, 0x6b, 0x49, 0xc0, 0x1e, 0xb8, 0x00, 0x20, 0x00, 0x11, + 0x46, 0x68, 0x3e, 0x29, 0x45, 0x04, 0x3f, 0x29, 0xc8, 0xfe, 0xff, 0x54, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfb, 0x2b, 0x40, 0xf9, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf5, 0x5b, 0x42, 0xa9, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x55, 0x40, 0x1e, 0xb8, 0x4b, 0xc0, 0x1e, 0xb8, 0xdd, 0xff, 0xff, 0x17, + 0xfd, 0x7b, 0xba, 0xa9, 0x3f, 0x00, 0x00, 0xf1, 0x64, 0x18, 0x40, 0xfa, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x54, 0x00, 0x80, 0x52, + 0xff, 0x7f, 0x0b, 0x29, 0x00, 0x01, 0x00, 0x54, 0xf7, 0x63, 0x03, 0xa9, + 0x9f, 0x00, 0x00, 0xf1, 0xf7, 0x03, 0x04, 0xaa, 0x04, 0x18, 0x40, 0xfa, + 0x54, 0x00, 0x80, 0x52, 0xc1, 0x00, 0x00, 0x54, 0xf7, 0x63, 0x43, 0xa9, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf9, 0x6b, 0x04, 0xa9, 0xf3, 0x03, 0x01, 0xaa, + 0xa1, 0x04, 0x00, 0x51, 0xfa, 0x03, 0x05, 0x2a, 0x3f, 0xfc, 0x03, 0x71, + 0x34, 0x00, 0x80, 0x52, 0x88, 0x06, 0x00, 0x54, 0xf5, 0x5b, 0x02, 0xa9, + 0xd9, 0x04, 0x00, 0x51, 0xf6, 0x03, 0x06, 0x2a, 0x3f, 0xff, 0x00, 0x71, + 0xc8, 0x05, 0x00, 0x54, 0xf8, 0x03, 0x02, 0xaa, 0x5f, 0x08, 0x00, 0xf1, + 0x69, 0x05, 0x00, 0x54, 0xe1, 0x03, 0x00, 0xaa, 0xf5, 0x03, 0x03, 0xaa, + 0x40, 0x01, 0x00, 0xb0, 0x00, 0x20, 0x13, 0x91, 0xee, 0x0e, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0x80, 0x04, 0x00, 0x35, 0xe1, 0x63, 0x01, 0x91, + 0x40, 0x01, 0x00, 0xb0, 0x00, 0x60, 0x12, 0x91, 0xe8, 0x0e, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0xc0, 0x03, 0x00, 0x35, 0xe1, 0x73, 0x01, 0x91, + 0x40, 0x01, 0x00, 0xb0, 0x00, 0xa0, 0x12, 0x91, 0xe2, 0x0e, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0x00, 0x03, 0x00, 0x35, 0x82, 0x03, 0x80, 0xd2, + 0x39, 0x7f, 0x1a, 0x1b, 0xe3, 0x00, 0x80, 0x12, 0xe0, 0x03, 0x13, 0xaa, + 0x02, 0x7f, 0x02, 0x9b, 0x01, 0x00, 0x80, 0x52, 0x58, 0x73, 0x1d, 0x53, + 0x39, 0x7f, 0x03, 0x1b, 0x7f, 0x93, 0x00, 0x94, 0x39, 0x23, 0x00, 0x11, + 0xe3, 0x0b, 0x4b, 0x29, 0x00, 0x00, 0x80, 0x52, 0x73, 0x72, 0x00, 0x91, + 0x20, 0x02, 0x00, 0x34, 0x61, 0xe2, 0x00, 0x51, 0x1f, 0x04, 0x00, 0x71, + 0x80, 0x02, 0x00, 0x54, 0x61, 0xd6, 0x3c, 0x29, 0x1f, 0x08, 0x00, 0x71, + 0x62, 0xda, 0x3d, 0x29, 0x78, 0xea, 0x3e, 0x29, 0x79, 0xc2, 0x1f, 0xb8, + 0x81, 0x01, 0x00, 0x54, 0xf5, 0x5b, 0x42, 0xa9, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x73, 0xd6, 0x3c, 0x29, + 0x63, 0xc2, 0x1e, 0xb8, 0x76, 0x62, 0x3e, 0x29, 0x7a, 0x66, 0x3f, 0x29, + 0x00, 0x04, 0x00, 0x11, 0xe9, 0xff, 0xff, 0x17, 0x73, 0xde, 0x3c, 0x29, + 0x62, 0xc2, 0x1e, 0xb8, 0xfa, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xb6, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x05, 0x2a, + 0xa5, 0x70, 0x1d, 0x53, 0xf5, 0x5b, 0x02, 0xa9, 0xf3, 0x03, 0x01, 0xaa, + 0xf5, 0x03, 0x03, 0xaa, 0xf7, 0x63, 0x03, 0xa9, 0xbf, 0x04, 0x1d, 0x72, + 0xf7, 0x03, 0x04, 0xaa, 0xf9, 0x6b, 0x04, 0xa9, 0xfa, 0x03, 0x02, 0xaa, + 0xf9, 0x03, 0x06, 0x2a, 0xfb, 0x2b, 0x00, 0xf9, 0xe6, 0x6f, 0x00, 0xb9, + 0xc0, 0x00, 0x00, 0x54, 0x25, 0x0b, 0x18, 0x37, 0x1b, 0x02, 0x80, 0x52, + 0x83, 0x00, 0x80, 0x52, 0xf8, 0x03, 0x1b, 0x2a, 0x04, 0x00, 0x00, 0x14, + 0x1b, 0x04, 0x80, 0x52, 0xf8, 0x03, 0x1b, 0x2a, 0xa3, 0x00, 0x80, 0x52, + 0x84, 0x20, 0x80, 0xd2, 0xc4, 0x00, 0xa0, 0xf2, 0x21, 0x00, 0x80, 0x52, + 0x62, 0x00, 0x80, 0x52, 0x85, 0x20, 0x80, 0xd2, 0xc5, 0x00, 0xa0, 0xf2, + 0x24, 0x00, 0xc0, 0xf2, 0xff, 0x87, 0x0f, 0x29, 0xe2, 0x13, 0x02, 0x39, + 0x7f, 0x02, 0x00, 0xf1, 0xe3, 0x17, 0x02, 0x39, 0xa4, 0x1a, 0x40, 0xfa, + 0xe5, 0x63, 0x08, 0xf8, 0x56, 0x00, 0x80, 0x52, 0xff, 0x3b, 0x02, 0x39, + 0xe1, 0x93, 0x00, 0xb9, 0xe2, 0x53, 0x02, 0x39, 0xe3, 0x57, 0x02, 0x39, + 0xe4, 0x63, 0x09, 0xf8, 0xff, 0x7b, 0x02, 0x39, 0x80, 0x00, 0x00, 0x54, + 0xff, 0x02, 0x00, 0xf1, 0x04, 0x18, 0x40, 0xfa, 0x21, 0x01, 0x00, 0x54, + 0xe0, 0x03, 0x16, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x2b, 0x40, 0xf9, + 0xfd, 0x7b, 0xca, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x82, 0x06, 0x00, 0x51, + 0xf6, 0x03, 0x01, 0x2a, 0x5f, 0xfc, 0x03, 0x71, 0xa8, 0xfe, 0xff, 0x54, + 0x21, 0x07, 0x00, 0x51, 0x3f, 0xfc, 0x00, 0x71, 0x48, 0xfe, 0xff, 0x54, + 0x5f, 0x0b, 0x00, 0xf1, 0x09, 0xfe, 0xff, 0x54, 0xe1, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x02, 0x91, 0x74, 0x0e, 0x00, 0x94, 0xf6, 0x03, 0x00, 0x2a, + 0x60, 0xfd, 0xff, 0x35, 0xe1, 0xf3, 0x01, 0x91, 0xe0, 0x43, 0x02, 0x91, + 0x6f, 0x0e, 0x00, 0x94, 0xf6, 0x03, 0x00, 0x2a, 0xc0, 0xfc, 0xff, 0x35, + 0x82, 0x03, 0x80, 0xd2, 0x94, 0x7e, 0x19, 0x1b, 0xe0, 0x03, 0x13, 0xaa, + 0x01, 0x00, 0x80, 0x52, 0x42, 0x7f, 0x02, 0x9b, 0x73, 0x72, 0x00, 0x91, + 0x94, 0x72, 0x1d, 0x53, 0x94, 0x0a, 0xdb, 0x1a, 0x0c, 0x93, 0x00, 0x94, + 0xe1, 0x7f, 0x40, 0xb9, 0x00, 0x00, 0x80, 0x52, 0xa0, 0x01, 0x00, 0x34, + 0x62, 0xe2, 0x00, 0x51, 0x1f, 0x04, 0x00, 0x71, 0x80, 0x02, 0x00, 0x54, + 0x62, 0xd6, 0x3c, 0x29, 0x1f, 0x08, 0x00, 0x71, 0x61, 0xd2, 0x3d, 0x29, + 0x78, 0xfe, 0x3e, 0x29, 0x7f, 0xc2, 0x1f, 0xb8, 0x20, 0xfa, 0xff, 0x54, + 0x00, 0x04, 0x00, 0x11, 0x73, 0x72, 0x00, 0x91, 0xa0, 0xfe, 0xff, 0x35, + 0x73, 0xd6, 0x3c, 0x29, 0x00, 0x04, 0x00, 0x11, 0x61, 0xd2, 0x3d, 0x29, + 0x78, 0xfe, 0x3e, 0x29, 0x7f, 0xc2, 0x1f, 0xb8, 0xf9, 0xff, 0xff, 0x17, + 0x1b, 0x01, 0x80, 0x52, 0x63, 0x00, 0x80, 0x52, 0xf8, 0x03, 0x1b, 0x2a, + 0xac, 0xff, 0xff, 0x17, 0x73, 0xde, 0x3c, 0x29, 0xf6, 0xff, 0xff, 0x17, + 0xfd, 0x7b, 0xb8, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x01, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x02, 0xaa, + 0xf7, 0x63, 0x03, 0xa9, 0x77, 0x70, 0x1d, 0x53, 0xff, 0x06, 0x1d, 0x72, + 0xc0, 0x00, 0x00, 0x54, 0x37, 0x0b, 0x18, 0x37, 0x98, 0x00, 0x80, 0x52, + 0x16, 0x02, 0x80, 0x52, 0xe1, 0x03, 0x18, 0x2a, 0x04, 0x00, 0x00, 0x14, + 0xb8, 0x00, 0x80, 0x52, 0xe1, 0x03, 0x18, 0x2a, 0x16, 0x04, 0x80, 0x52, + 0x86, 0x20, 0x80, 0xd2, 0xc6, 0x00, 0xa0, 0xf2, 0x25, 0x20, 0x80, 0x52, + 0x62, 0x00, 0x80, 0x52, 0x26, 0x00, 0xc0, 0xf2, 0x87, 0x00, 0x80, 0xd2, + 0xc7, 0x00, 0xa0, 0xf2, 0xff, 0x7f, 0x09, 0x29, 0xe5, 0x53, 0x00, 0xb9, + 0x7f, 0x02, 0x00, 0xf1, 0xe2, 0x53, 0x01, 0x39, 0x04, 0x18, 0x40, 0xfa, + 0xe1, 0x57, 0x01, 0x39, 0x54, 0x00, 0x80, 0x52, 0xe7, 0x63, 0x05, 0xf8, + 0xff, 0x7b, 0x01, 0x39, 0xe5, 0x63, 0x00, 0xb9, 0xe2, 0x93, 0x01, 0x39, + 0xe1, 0x97, 0x01, 0x39, 0xe6, 0x63, 0x06, 0xf8, 0xff, 0xbb, 0x01, 0x39, + 0xe5, 0x73, 0x00, 0xb9, 0xe2, 0xd3, 0x01, 0x39, 0xe1, 0xd7, 0x01, 0x39, + 0xe6, 0x63, 0x07, 0xf8, 0xff, 0xfb, 0x01, 0x39, 0xa0, 0x00, 0x00, 0x54, + 0x63, 0x04, 0x00, 0x51, 0x34, 0x00, 0x80, 0x52, 0x7f, 0xfc, 0x03, 0x71, + 0xe9, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc8, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x84, 0x04, 0x00, 0x51, 0x9f, 0xfc, 0x00, 0x71, + 0x08, 0xff, 0xff, 0x54, 0xbf, 0x06, 0x00, 0xf1, 0xc9, 0xfe, 0xff, 0x54, + 0xe1, 0x03, 0x00, 0xaa, 0xe0, 0x43, 0x01, 0x91, 0x0a, 0x0e, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0x20, 0xfe, 0xff, 0x35, 0xe1, 0x23, 0x01, 0x91, + 0xe0, 0x83, 0x01, 0x91, 0x05, 0x0e, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, + 0x80, 0xfd, 0xff, 0x35, 0xe1, 0x33, 0x01, 0x91, 0xe0, 0xc3, 0x01, 0x91, + 0x00, 0x0e, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, 0xe0, 0xfc, 0xff, 0x35, + 0x82, 0x03, 0x80, 0xd2, 0xe0, 0x03, 0x13, 0xaa, 0x01, 0x00, 0x80, 0x52, + 0xf7, 0x26, 0xd8, 0x1a, 0xa2, 0x7e, 0x02, 0x9b, 0xa0, 0x92, 0x00, 0x94, + 0x76, 0x12, 0x00, 0xb9, 0xe2, 0x4b, 0x40, 0xb9, 0x60, 0x72, 0x00, 0x91, + 0x62, 0x5e, 0x01, 0x29, 0x01, 0x81, 0xb7, 0x52, 0xe2, 0x4f, 0x40, 0xb9, + 0x60, 0x06, 0x00, 0x29, 0x7f, 0x42, 0x01, 0xf8, 0x60, 0x86, 0x03, 0x29, + 0xe0, 0x03, 0x14, 0x2a, 0x62, 0x26, 0x00, 0xb9, 0x77, 0x5a, 0x05, 0x29, + 0x7f, 0x1a, 0x00, 0xf9, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc8, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x78, 0x00, 0x80, 0x52, 0x16, 0x01, 0x80, 0x52, 0xe1, 0x03, 0x18, 0x2a, + 0xac, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, + 0x20, 0x10, 0x00, 0x90, 0x02, 0x00, 0x80, 0x12, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x8c, 0x41, 0xf9, 0xe1, 0xc3, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xff, 0x7f, 0x03, 0xa9, 0x8c, 0xac, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0xe0, 0x01, 0x00, 0x35, 0xe0, 0x33, 0x40, 0xb9, 0x1f, 0x90, 0x02, 0x71, + 0x20, 0x10, 0x00, 0x54, 0xe8, 0x01, 0x00, 0x54, 0x1f, 0x88, 0x02, 0x71, + 0x40, 0x07, 0x00, 0x54, 0x1f, 0x8c, 0x02, 0x71, 0x82, 0x05, 0x80, 0xd2, + 0xe1, 0x03, 0x00, 0x54, 0xe0, 0x03, 0x01, 0x91, 0x21, 0x00, 0x80, 0x52, + 0xe2, 0x7f, 0x04, 0xa9, 0x61, 0xac, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x1f, 0x98, 0x02, 0x71, 0x40, 0x05, 0x00, 0x54, + 0x1f, 0x9c, 0x02, 0x71, 0x20, 0xff, 0xff, 0x54, 0x1f, 0x94, 0x02, 0x71, + 0x81, 0x0c, 0x00, 0x54, 0xf5, 0x5b, 0x02, 0xa9, 0xd6, 0x01, 0x00, 0xf0, + 0xd5, 0xa2, 0x2c, 0x91, 0xf4, 0x02, 0x00, 0xd0, 0x94, 0x62, 0x3c, 0x91, + 0x01, 0x00, 0x80, 0x12, 0xe0, 0x03, 0x14, 0xaa, 0x2a, 0xae, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0xa0, 0x0e, 0x40, 0xf9, 0x01, 0x01, 0xa0, 0xd2, + 0xe4, 0x45, 0x00, 0x94, 0x93, 0x0f, 0x00, 0x34, 0xf5, 0x5b, 0x42, 0xa9, + 0xe8, 0xff, 0xff, 0x17, 0x1f, 0xac, 0x00, 0x71, 0x61, 0x0a, 0x00, 0x54, + 0xf4, 0x02, 0x00, 0xd0, 0x94, 0x62, 0x3c, 0x91, 0xe0, 0x03, 0x14, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0x1c, 0xae, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0xe0, 0xfb, 0xff, 0x35, 0xc0, 0x01, 0x00, 0xf0, 0x00, 0xa0, 0x2c, 0x91, + 0x22, 0x00, 0x80, 0x52, 0x01, 0x44, 0x41, 0x39, 0x02, 0x40, 0x01, 0x39, + 0x81, 0x00, 0x00, 0x34, 0xd7, 0xfd, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x80, 0x11, 0x00, 0x35, 0xe0, 0x03, 0x14, 0xaa, 0x03, 0xae, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0xd2, 0xff, 0xff, 0x17, 0xc2, 0x05, 0x80, 0xd2, + 0xcb, 0xff, 0xff, 0x17, 0xf4, 0x02, 0x00, 0xd0, 0x94, 0x62, 0x3c, 0x91, + 0xe0, 0x03, 0x14, 0xaa, 0x01, 0x00, 0x80, 0x12, 0x06, 0xae, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0x20, 0xf9, 0xff, 0x35, 0xf5, 0x5b, 0x02, 0xa9, + 0xd5, 0x01, 0x00, 0xf0, 0xb5, 0xa2, 0x2c, 0x91, 0xc0, 0xaa, 0x8a, 0x52, + 0xa0, 0xaa, 0xaa, 0x72, 0x23, 0x00, 0x80, 0x52, 0xa2, 0x22, 0x40, 0xb9, + 0xa1, 0x42, 0x41, 0x39, 0x42, 0x04, 0x00, 0x11, 0xa3, 0x46, 0x01, 0x39, + 0xa2, 0x22, 0x00, 0xb9, 0x40, 0x7c, 0x20, 0x9b, 0x00, 0xfc, 0x60, 0xd3, + 0x00, 0x7c, 0x82, 0x4b, 0x00, 0x04, 0x00, 0x0b, 0x40, 0x00, 0x00, 0x4b, + 0xa0, 0xce, 0x20, 0x8b, 0x03, 0x18, 0x40, 0xf9, 0xa3, 0x16, 0x00, 0xf9, + 0xc1, 0x00, 0x00, 0x34, 0xb3, 0xfd, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x00, 0x08, 0x00, 0x35, 0xa2, 0x22, 0x40, 0xb9, 0xa3, 0x16, 0x40, 0xf9, + 0xa0, 0x42, 0x9e, 0xb9, 0x01, 0x88, 0x07, 0x91, 0x21, 0xec, 0x7c, 0xd3, + 0xa4, 0x02, 0x01, 0x8b, 0xa3, 0x6a, 0x21, 0xf8, 0xc2, 0x09, 0x00, 0x37, + 0xc1, 0x01, 0x00, 0xf0, 0x26, 0x7c, 0x45, 0xf9, 0xa3, 0x12, 0x00, 0x8b, + 0x45, 0x05, 0x80, 0x52, 0x01, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x01, 0x91, + 0xe5, 0x0b, 0x08, 0x29, 0x66, 0x14, 0x0f, 0xf9, 0xe4, 0x27, 0x00, 0xf9, + 0xff, 0xab, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0xa1, 0x42, 0x5e, 0xb9, + 0x20, 0x04, 0x00, 0x11, 0x1f, 0x04, 0x00, 0x71, 0x00, 0xd0, 0x9f, 0x1a, + 0xa0, 0x42, 0x1e, 0xb9, 0xf3, 0x04, 0x00, 0x35, 0xe0, 0x03, 0x14, 0xaa, + 0xc6, 0xad, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0xf5, 0x5b, 0x42, 0xa9, + 0x94, 0xff, 0xff, 0x17, 0x81, 0x00, 0x80, 0x52, 0x43, 0x01, 0x00, 0x90, + 0x63, 0xe0, 0x0e, 0x91, 0xe0, 0x03, 0x01, 0x2a, 0xc2, 0x80, 0x80, 0x52, + 0xd3, 0x80, 0x80, 0x52, 0x4c, 0xd1, 0xff, 0x97, 0x8c, 0xff, 0xff, 0x17, + 0xf4, 0x02, 0x00, 0xd0, 0x94, 0x62, 0x3c, 0x91, 0xe0, 0x03, 0x14, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0xff, 0x43, 0x00, 0xb9, 0xc1, 0xad, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0x80, 0xf0, 0xff, 0x35, 0xf5, 0x5b, 0x02, 0xa9, + 0xd5, 0x01, 0x00, 0xf0, 0xb5, 0xa2, 0x2c, 0x91, 0xe5, 0x03, 0x01, 0x91, + 0xe4, 0xff, 0xff, 0xf0, 0xe3, 0x01, 0x00, 0xb0, 0x63, 0x80, 0x24, 0x91, + 0xa0, 0xe2, 0x5d, 0xb9, 0x84, 0x80, 0x25, 0x91, 0xe2, 0x01, 0x00, 0xb0, + 0x42, 0x60, 0x24, 0x91, 0xe1, 0x01, 0x00, 0xb0, 0x21, 0x40, 0x24, 0x91, + 0xb6, 0x0e, 0x40, 0xf9, 0x4c, 0x09, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0x40, 0x03, 0x00, 0x34, 0xe0, 0x03, 0x14, 0xaa, 0xa0, 0xad, 0xff, 0x97, + 0xf5, 0x5b, 0x42, 0xa9, 0x6f, 0xff, 0xff, 0x17, 0xa0, 0xf6, 0x4e, 0xf9, + 0x01, 0x00, 0x80, 0x52, 0x27, 0x0a, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0x00, 0xff, 0xff, 0x35, 0xe0, 0x03, 0x14, 0xaa, 0xdf, 0x2a, 0x0b, 0xb9, + 0x96, 0xad, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0x80, 0xef, 0xff, 0x35, + 0xa2, 0x05, 0x80, 0xd2, 0xe0, 0x03, 0x01, 0x91, 0x01, 0x00, 0x80, 0x52, + 0xe2, 0x7f, 0x04, 0xa9, 0xbf, 0xab, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0xf5, 0x5b, 0x42, 0xa9, 0x5d, 0xff, 0xff, 0x17, 0xc1, 0x01, 0x00, 0xf0, + 0x26, 0x88, 0x45, 0xf9, 0xb3, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x16, 0xaa, + 0x01, 0x01, 0xa0, 0xd2, 0x50, 0x45, 0x00, 0x94, 0xa0, 0x12, 0x40, 0xb9, + 0x1f, 0x04, 0x00, 0x71, 0xa0, 0x01, 0x00, 0x54, 0xa0, 0xf6, 0x4e, 0xf9, + 0xe1, 0x03, 0x16, 0xaa, 0x24, 0x00, 0xa0, 0x52, 0x03, 0x60, 0x80, 0x52, + 0x02, 0x80, 0xb7, 0xd2, 0xa5, 0x0a, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0x93, 0xf6, 0xff, 0x34, 0xd9, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x14, 0xaa, + 0x78, 0xad, 0xff, 0x97, 0x48, 0xff, 0xff, 0x17, 0xa5, 0x0e, 0x40, 0x79, + 0xe6, 0x02, 0x00, 0xd0, 0xc2, 0xe0, 0x3d, 0x91, 0x24, 0x20, 0x80, 0x52, + 0x84, 0x00, 0x05, 0x4b, 0xe1, 0x02, 0x00, 0xd0, 0x23, 0x40, 0x3e, 0x91, + 0xd6, 0x78, 0x0f, 0xb9, 0xa8, 0x7c, 0x05, 0x1b, 0x84, 0x70, 0x1d, 0x53, + 0xa0, 0xf6, 0x4e, 0xf9, 0x06, 0x80, 0xb7, 0x52, 0x07, 0x01, 0x80, 0xd2, + 0x26, 0x90, 0x0f, 0xb9, 0x27, 0x00, 0xc0, 0xf2, 0x06, 0x01, 0x80, 0x52, + 0x47, 0x04, 0x00, 0xf9, 0x01, 0x60, 0x80, 0x52, 0x48, 0x04, 0x00, 0xb9, + 0x65, 0x98, 0x00, 0x29, 0x65, 0x90, 0x01, 0x29, 0x46, 0x10, 0x00, 0xb9, + 0x24, 0x0c, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0xf3, 0xf2, 0xff, 0x34, + 0xbc, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0x53, 0x01, 0x00, 0x90, 0x73, 0xe2, 0x0f, 0x91, + 0x1f, 0x20, 0x03, 0xd5, 0x0e, 0xff, 0xff, 0x97, 0x1f, 0x18, 0x10, 0x71, + 0x04, 0x18, 0x40, 0x7a, 0xa0, 0xff, 0xff, 0x54, 0xe2, 0x03, 0x00, 0x2a, + 0xe3, 0x03, 0x13, 0xaa, 0x81, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0xde, 0xd0, 0xff, 0x97, 0xf7, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xbe, 0xa9, + 0x41, 0x01, 0x00, 0x90, 0xe0, 0x02, 0x00, 0xd0, 0xfd, 0x03, 0x00, 0x91, + 0x21, 0xa0, 0x10, 0x91, 0x00, 0x60, 0x3c, 0x91, 0x2a, 0xad, 0xff, 0x97, + 0xa0, 0x00, 0x00, 0x34, 0xc1, 0x01, 0x00, 0xf0, 0xfd, 0x7b, 0xc2, 0xa8, + 0x3f, 0x38, 0x0b, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x54, 0x26, 0x00, 0x94, + 0x60, 0xff, 0xff, 0x35, 0xf2, 0x27, 0x00, 0x94, 0x20, 0xff, 0xff, 0x35, + 0xe0, 0xff, 0xff, 0xf0, 0x00, 0xc0, 0x24, 0x91, 0x56, 0x27, 0x00, 0x94, + 0xa0, 0xfe, 0xff, 0x35, 0x9c, 0x2e, 0x00, 0x94, 0x60, 0xfe, 0xff, 0x35, + 0xf3, 0x0b, 0x00, 0xf9, 0xd3, 0x01, 0x00, 0xf0, 0x73, 0x82, 0x2b, 0x91, + 0x01, 0x00, 0x80, 0x52, 0xe2, 0x03, 0x13, 0xaa, 0x20, 0x00, 0x80, 0x52, + 0x5c, 0x99, 0xff, 0x97, 0xa0, 0x07, 0x00, 0x35, 0x62, 0x62, 0x00, 0x91, + 0x01, 0x00, 0x80, 0x52, 0x40, 0x00, 0x80, 0x52, 0x57, 0x99, 0xff, 0x97, + 0x00, 0x07, 0x00, 0x35, 0x01, 0x00, 0x80, 0x52, 0x62, 0xc2, 0x00, 0x91, + 0x40, 0x00, 0x80, 0x52, 0x52, 0x99, 0xff, 0x97, 0xc1, 0x01, 0x00, 0xf0, + 0x3f, 0x38, 0x0b, 0xb9, 0xa0, 0x00, 0x00, 0x35, 0x33, 0x10, 0x00, 0x90, + 0x60, 0x62, 0x0c, 0x91, 0x10, 0xab, 0xff, 0x97, 0x80, 0x00, 0x00, 0x34, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x8e, 0x41, 0xf9, 0x81, 0x14, 0x80, 0x52, 0x3d, 0xab, 0xff, 0x97, + 0x40, 0xff, 0xff, 0x35, 0x60, 0x8e, 0x41, 0xf9, 0xa1, 0x14, 0x80, 0x52, + 0x39, 0xab, 0xff, 0x97, 0xc0, 0xfe, 0xff, 0x35, 0x60, 0x8e, 0x41, 0xf9, + 0xc1, 0x14, 0x80, 0x52, 0x35, 0xab, 0xff, 0x97, 0x40, 0xfe, 0xff, 0x35, + 0x60, 0x8e, 0x41, 0xf9, 0xe1, 0x14, 0x80, 0x52, 0x31, 0xab, 0xff, 0x97, + 0xc0, 0xfd, 0xff, 0x35, 0x60, 0x8e, 0x41, 0xf9, 0x61, 0x05, 0x80, 0x52, + 0x2d, 0xab, 0xff, 0x97, 0x40, 0xfd, 0xff, 0x35, 0x60, 0x8e, 0x41, 0xf9, + 0x41, 0x14, 0x80, 0x52, 0x29, 0xab, 0xff, 0x97, 0xc0, 0xfc, 0xff, 0x35, + 0x60, 0x8e, 0x41, 0xf9, 0x61, 0x14, 0x80, 0x52, 0x25, 0xab, 0xff, 0x97, + 0x40, 0xfc, 0xff, 0x35, 0xe1, 0x01, 0x00, 0xb0, 0x02, 0x00, 0x00, 0x90, + 0xf3, 0x0b, 0x40, 0xf9, 0x42, 0x40, 0x17, 0x91, 0xfd, 0x7b, 0xc2, 0xa8, + 0xe0, 0x02, 0x00, 0xd0, 0x21, 0xb8, 0x44, 0xf9, 0x00, 0x40, 0x36, 0x91, + 0x26, 0x00, 0x80, 0x52, 0x05, 0x01, 0x80, 0x52, 0x04, 0x00, 0x82, 0x52, + 0x03, 0x00, 0x80, 0xd2, 0xbf, 0xab, 0xff, 0x17, 0xf3, 0x0b, 0x40, 0xf9, + 0xad, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xbd, 0xa9, 0x01, 0x00, 0x80, 0x12, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x02, 0x00, 0xd0, + 0x94, 0x62, 0x3c, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0xf5, 0xac, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0xa0, 0x00, 0x00, 0x34, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf5, 0x5b, 0x02, 0xa9, 0xd5, 0x01, 0x00, 0xf0, 0xb6, 0xa2, 0x2c, 0x91, + 0xe0, 0x02, 0x80, 0x52, 0xc1, 0x12, 0x5e, 0xb9, 0x65, 0x2e, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0x00, 0x01, 0x00, 0x34, 0xe0, 0x03, 0x14, 0xaa, + 0xd9, 0xac, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xc0, 0x06, 0x5e, 0xb9, 0xc1, 0x1a, 0x5e, 0xb9, 0x59, 0x2e, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0xa0, 0xfe, 0xff, 0x35, 0xc0, 0x0a, 0x5e, 0xb9, + 0xc1, 0x16, 0x5e, 0xb9, 0x54, 0x2e, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0x00, 0xfe, 0xff, 0x35, 0xc0, 0x0e, 0x5e, 0xb9, 0x81, 0x01, 0x80, 0x52, + 0x4f, 0x2e, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0x60, 0xfd, 0xff, 0x35, + 0xc1, 0x1e, 0x5e, 0xb9, 0xc0, 0x02, 0x80, 0x52, 0x4a, 0x2e, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0xc0, 0xfc, 0xff, 0x35, 0xc0, 0xc6, 0x4e, 0xf9, + 0x00, 0x01, 0x00, 0xb4, 0x01, 0x00, 0x80, 0x52, 0x48, 0x09, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0x00, 0xfc, 0xff, 0x35, 0xdf, 0xc6, 0x0e, 0xf9, + 0xdf, 0xca, 0x0e, 0xf9, 0xdf, 0xce, 0x0e, 0xf9, 0xc0, 0xd6, 0x4e, 0xf9, + 0x00, 0x01, 0x00, 0xb4, 0x01, 0x00, 0x80, 0x52, 0x3f, 0x09, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0xfa, 0xff, 0x35, 0xdf, 0xd6, 0x0e, 0xf9, + 0xdf, 0xda, 0x0e, 0xf9, 0xdf, 0xde, 0x0e, 0xf9, 0xc0, 0xe6, 0x4e, 0xf9, + 0x00, 0x01, 0x00, 0xb4, 0x01, 0x00, 0x80, 0x52, 0x36, 0x09, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0xc0, 0xf9, 0xff, 0x35, 0xdf, 0xe6, 0x0e, 0xf9, + 0xdf, 0xea, 0x0e, 0xf9, 0xdf, 0xee, 0x0e, 0xf9, 0xc2, 0x01, 0x00, 0xf0, + 0x42, 0xb0, 0x2c, 0x91, 0xe1, 0x01, 0x00, 0xb0, 0x21, 0x20, 0x25, 0x91, + 0xe0, 0x03, 0x14, 0xaa, 0xbf, 0x2a, 0x0b, 0xb9, 0x5f, 0x00, 0x00, 0xf9, + 0x04, 0x00, 0x80, 0x92, 0x3f, 0x7c, 0x00, 0xa9, 0x03, 0x20, 0x80, 0x52, + 0x5f, 0x20, 0x00, 0x39, 0x3f, 0x7c, 0x01, 0xa9, 0xdf, 0x92, 0x01, 0xa9, + 0xdf, 0x16, 0x00, 0xf9, 0xc3, 0xa2, 0x00, 0x79, 0xdf, 0x42, 0x1e, 0xb9, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0x91, 0xac, 0xff, 0x17, 0xfd, 0x7b, 0xaf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x02, 0x00, 0xd0, 0x94, 0x62, 0x3c, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x03, 0xaa, 0xf7, 0x63, 0x03, 0xa9, + 0xf8, 0x03, 0x00, 0xaa, 0xe0, 0x03, 0x14, 0xaa, 0xf9, 0x6b, 0x04, 0xa9, + 0xf9, 0x03, 0x02, 0xaa, 0xfb, 0x73, 0x05, 0xa9, 0xfb, 0x03, 0x01, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0xff, 0x6b, 0x00, 0xb9, 0xff, 0x43, 0x00, 0xf9, + 0xff, 0x8b, 0x00, 0xb9, 0xff, 0x7f, 0x09, 0xa9, 0xff, 0x7f, 0x0a, 0xa9, + 0xff, 0x7f, 0x0b, 0xa9, 0xff, 0x7f, 0x0c, 0xa9, 0xff, 0x7f, 0x0d, 0xa9, + 0xff, 0x7f, 0x0e, 0xa9, 0xff, 0x7f, 0x0f, 0xa9, 0xff, 0x7f, 0x10, 0xa9, + 0x82, 0xac, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0xc0, 0x01, 0x00, 0x35, + 0xd6, 0x01, 0x00, 0xf0, 0xc0, 0x2a, 0x4b, 0xb9, 0x1f, 0x04, 0x00, 0x71, + 0xe0, 0x03, 0x14, 0xaa, 0x40, 0x2c, 0x00, 0x54, 0x6e, 0xac, 0xff, 0x97, + 0x53, 0x00, 0x80, 0x52, 0x1f, 0x03, 0x00, 0xf1, 0x64, 0x1b, 0x40, 0xfa, + 0x80, 0x00, 0x00, 0x54, 0x3f, 0x03, 0x00, 0xf1, 0xa4, 0x1a, 0x40, 0xfa, + 0x21, 0x01, 0x00, 0x54, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xd1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x03, 0x40, 0x79, 0x33, 0x00, 0x80, 0x52, 0xc0, 0xfe, 0xff, 0x34, + 0x00, 0x07, 0x40, 0x79, 0x00, 0x04, 0x00, 0x51, 0x00, 0x3c, 0x00, 0x12, + 0x1f, 0xfc, 0x03, 0x71, 0x28, 0xfe, 0xff, 0x54, 0x00, 0x13, 0x40, 0x39, + 0x1f, 0x3c, 0x00, 0x71, 0xc8, 0xfd, 0xff, 0x54, 0x00, 0x17, 0x40, 0x39, + 0x1f, 0x04, 0x00, 0x71, 0x68, 0xfd, 0xff, 0x54, 0x02, 0x1f, 0x40, 0x39, + 0x41, 0x04, 0x00, 0x51, 0x21, 0x1c, 0x00, 0x12, 0x3f, 0xfc, 0x00, 0x71, + 0xc8, 0xfc, 0xff, 0x54, 0x01, 0x23, 0x40, 0x39, 0x81, 0xfc, 0xff, 0x35, + 0x1f, 0x04, 0x00, 0x71, 0x81, 0x01, 0x00, 0x54, 0x01, 0x1b, 0x40, 0x39, + 0xf3, 0x03, 0x00, 0x2a, 0x20, 0x20, 0x00, 0x51, 0x00, 0x1c, 0x00, 0x12, + 0x1f, 0xe0, 0x00, 0x71, 0x88, 0xfb, 0xff, 0x54, 0x3f, 0x08, 0x40, 0xf2, + 0x41, 0xfb, 0xff, 0x54, 0x5f, 0x00, 0x01, 0x6b, 0x03, 0xfb, 0xff, 0x54, + 0xe1, 0xfa, 0xff, 0x54, 0x00, 0x00, 0x80, 0x52, 0x4b, 0xff, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0x60, 0xfa, 0xff, 0x35, 0xe0, 0x03, 0x14, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0x42, 0xac, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0xc0, 0xf9, 0xff, 0x35, 0xda, 0xa2, 0x2c, 0x91, 0xd7, 0x01, 0x00, 0xf0, + 0xe4, 0x72, 0x45, 0xf9, 0x20, 0x00, 0x80, 0x52, 0x01, 0x03, 0x40, 0xf9, + 0x41, 0x43, 0x00, 0xf8, 0x43, 0x0f, 0x40, 0x79, 0x42, 0x2f, 0x40, 0x39, + 0x01, 0x23, 0x40, 0x39, 0x41, 0x33, 0x00, 0x39, 0x44, 0x1b, 0x00, 0xf9, + 0x62, 0x7c, 0xa2, 0x9b, 0x59, 0x0f, 0x00, 0xf9, 0x41, 0xf0, 0x7d, 0xd3, + 0x82, 0x10, 0x02, 0x8b, 0x24, 0x00, 0x04, 0x8b, 0x44, 0x1f, 0x00, 0xf9, + 0x42, 0x07, 0x04, 0xa9, 0x49, 0x25, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0x80, 0x23, 0x00, 0x35, 0x40, 0x27, 0x40, 0x39, 0x80, 0x24, 0x00, 0x34, + 0x43, 0x2b, 0x40, 0x39, 0x42, 0x0f, 0x40, 0x79, 0xe0, 0xa3, 0x01, 0x91, + 0x41, 0x2f, 0x40, 0x39, 0xe2, 0xd3, 0x00, 0x79, 0xe3, 0xab, 0x01, 0x39, + 0xe1, 0xaf, 0x01, 0x39, 0x8d, 0x25, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0x00, 0x22, 0x00, 0x35, 0x40, 0x27, 0x40, 0x39, 0xff, 0x7f, 0x09, 0xa9, + 0xff, 0x7f, 0x0a, 0xa9, 0xff, 0x7f, 0x0b, 0xa9, 0xff, 0x7f, 0x0c, 0xa9, + 0xff, 0x7f, 0x0d, 0xa9, 0xff, 0x7f, 0x0e, 0xa9, 0xff, 0x7f, 0x0f, 0xa9, + 0xff, 0x7f, 0x10, 0xa9, 0x80, 0x22, 0x00, 0x34, 0x40, 0x2b, 0x40, 0x39, + 0xff, 0x07, 0x40, 0x6b, 0x00, 0x7c, 0x01, 0x53, 0xe0, 0x01, 0x00, 0x54, + 0x02, 0x04, 0x00, 0x51, 0xe0, 0x43, 0x02, 0x91, 0x42, 0x1c, 0x7e, 0xd3, + 0x42, 0x10, 0x00, 0x91, 0x62, 0x03, 0x02, 0x8b, 0x1f, 0x20, 0x03, 0xd5, + 0x63, 0x03, 0x40, 0x79, 0x7b, 0x13, 0x00, 0x91, 0x61, 0xe3, 0x5f, 0x78, + 0x00, 0x10, 0x00, 0x91, 0x03, 0xc0, 0x1f, 0x78, 0x5f, 0x00, 0x1b, 0xeb, + 0x01, 0xe0, 0x1f, 0x78, 0x21, 0xff, 0xff, 0x54, 0xe0, 0x43, 0x02, 0x91, + 0x01, 0x04, 0x80, 0x52, 0x94, 0x25, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0xf3, 0x1d, 0x00, 0x35, 0x00, 0x00, 0x80, 0x52, 0x4c, 0x25, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0x60, 0x1d, 0x00, 0x35, 0x41, 0x0b, 0x40, 0x79, + 0xe0, 0x03, 0x02, 0x91, 0x43, 0x0f, 0x40, 0x79, 0x42, 0x23, 0x40, 0x39, + 0xe3, 0x03, 0x01, 0x79, 0xff, 0x0b, 0x02, 0x39, 0xe2, 0x0f, 0x02, 0x39, + 0xff, 0x87, 0x00, 0xb9, 0xe1, 0x13, 0x01, 0x79, 0x08, 0x26, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x1b, 0x00, 0x35, 0xed, 0x25, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0x80, 0x1b, 0x00, 0x35, 0x40, 0x83, 0x5d, 0xb9, + 0xe4, 0xff, 0xff, 0xf0, 0xe3, 0x01, 0x00, 0xb0, 0x63, 0x00, 0x23, 0x91, + 0x84, 0x00, 0x24, 0x91, 0xe2, 0x01, 0x00, 0xb0, 0x42, 0xe0, 0x22, 0x91, + 0xe1, 0x01, 0x00, 0xb0, 0x21, 0xc0, 0x22, 0x91, 0x05, 0x00, 0x80, 0xd2, + 0x7c, 0x07, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x19, 0x00, 0x35, + 0x40, 0xa3, 0x5d, 0xb9, 0xe3, 0x01, 0x00, 0xb0, 0x63, 0x80, 0x23, 0x91, + 0xe2, 0x01, 0x00, 0xb0, 0x42, 0x60, 0x23, 0x91, 0xe1, 0x01, 0x00, 0xb0, + 0x21, 0x40, 0x23, 0x91, 0x05, 0x00, 0x80, 0xd2, 0x04, 0x00, 0x80, 0xd2, + 0x70, 0x07, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0x60, 0x18, 0x00, 0x35, + 0x40, 0xc3, 0x5d, 0xb9, 0xe3, 0x01, 0x00, 0xb0, 0x63, 0x00, 0x24, 0x91, + 0xe2, 0x01, 0x00, 0xb0, 0x42, 0xe0, 0x23, 0x91, 0xe1, 0x01, 0x00, 0xb0, + 0x21, 0xc0, 0x23, 0x91, 0x05, 0x00, 0x80, 0xd2, 0x04, 0x00, 0x80, 0xd2, + 0x64, 0x07, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x16, 0x00, 0x35, + 0x40, 0xcb, 0x4e, 0xf9, 0xe1, 0xc3, 0x01, 0x91, 0x57, 0x0b, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0x40, 0x16, 0x00, 0x35, 0x40, 0xdf, 0x4e, 0xf9, + 0xe1, 0xd3, 0x01, 0x91, 0x52, 0x0b, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0xa0, 0x15, 0x00, 0x35, 0x40, 0xeb, 0x4e, 0xf9, 0xe1, 0xe3, 0x01, 0x91, + 0x4d, 0x0b, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0x00, 0x15, 0x00, 0x35, + 0x40, 0xef, 0x4e, 0xf9, 0xe1, 0xf3, 0x01, 0x91, 0x48, 0x0b, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0x60, 0x14, 0x00, 0x35, 0xe0, 0x73, 0x40, 0xb9, + 0xe2, 0x01, 0x00, 0xb0, 0x42, 0xe0, 0x24, 0x91, 0xe1, 0x01, 0x00, 0xb0, + 0x21, 0xa0, 0x24, 0x91, 0x34, 0xfb, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x60, 0x13, 0x00, 0x35, 0xe0, 0x77, 0x40, 0xb9, 0xe2, 0x01, 0x00, 0xb0, + 0x42, 0xf0, 0x24, 0x91, 0xe1, 0x01, 0x00, 0xb0, 0x21, 0xb0, 0x24, 0x91, + 0x2c, 0xfb, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0x60, 0x12, 0x00, 0x35, + 0xe0, 0x7b, 0x40, 0xb9, 0xe2, 0x01, 0x00, 0xb0, 0x42, 0x00, 0x25, 0x91, + 0xe1, 0x01, 0x00, 0xb0, 0x21, 0xc0, 0x24, 0x91, 0x24, 0xfb, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0x60, 0x11, 0x00, 0x35, 0xe0, 0x7f, 0x40, 0xb9, + 0xe2, 0x01, 0x00, 0xb0, 0x42, 0x10, 0x25, 0x91, 0xe1, 0x01, 0x00, 0xb0, + 0x21, 0xd0, 0x24, 0x91, 0x1c, 0xfb, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x60, 0x10, 0x00, 0x35, 0x41, 0x13, 0x5e, 0xb9, 0xe0, 0x02, 0x80, 0x52, + 0xfb, 0x2c, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0xc0, 0x0f, 0x00, 0x35, + 0x40, 0x07, 0x5e, 0xb9, 0x41, 0x1b, 0x5e, 0xb9, 0xf6, 0x2c, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0x20, 0x0f, 0x00, 0x35, 0x40, 0x0b, 0x5e, 0xb9, + 0x41, 0x17, 0x5e, 0xb9, 0xf1, 0x2c, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0x80, 0x0e, 0x00, 0x35, 0x40, 0x0f, 0x5e, 0xb9, 0x81, 0x01, 0x80, 0x52, + 0xec, 0x2c, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x0d, 0x00, 0x35, + 0x41, 0x1f, 0x5e, 0xb9, 0xc0, 0x02, 0x80, 0x52, 0xe7, 0x2c, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0x40, 0x0d, 0x00, 0x35, 0x46, 0x2f, 0x40, 0x39, + 0xdc, 0x01, 0x00, 0xf0, 0x81, 0x33, 0x2e, 0x91, 0x45, 0x2b, 0x40, 0x39, + 0x44, 0x0f, 0x40, 0x79, 0xc0, 0x01, 0x00, 0xf0, 0x00, 0xf0, 0x2d, 0x91, + 0x42, 0x20, 0x80, 0xd2, 0xe3, 0x72, 0x45, 0xf9, 0xf8, 0x82, 0x2b, 0x91, + 0x5a, 0xfb, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0xa0, 0x0b, 0x00, 0x35, + 0x46, 0x2f, 0x40, 0x39, 0xfb, 0x01, 0x00, 0xb0, 0x61, 0x13, 0x1f, 0x91, + 0x45, 0x0f, 0x40, 0x79, 0x03, 0x0f, 0x40, 0xf9, 0xc0, 0x01, 0x00, 0xf0, + 0x00, 0x00, 0x2e, 0x91, 0x62, 0x00, 0x80, 0xd2, 0x04, 0x1b, 0x40, 0xf9, + 0xda, 0xfb, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0x20, 0x0a, 0x00, 0x35, + 0x46, 0x2f, 0x40, 0x39, 0xf9, 0x01, 0x00, 0xb0, 0x21, 0x63, 0x20, 0x91, + 0x45, 0x0f, 0x40, 0x79, 0x03, 0x0f, 0x40, 0xf9, 0xc0, 0x01, 0x00, 0xf0, + 0x00, 0x10, 0x2e, 0x91, 0x62, 0x00, 0x80, 0xd2, 0x04, 0x1b, 0x40, 0xf9, + 0x2a, 0xfc, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0xa0, 0x08, 0x00, 0x35, + 0x44, 0x2f, 0x40, 0x39, 0xf8, 0x01, 0x00, 0xb0, 0x01, 0xb3, 0x21, 0x91, + 0x43, 0x0f, 0x40, 0x79, 0xc0, 0x01, 0x00, 0xf0, 0x00, 0x20, 0x2e, 0x91, + 0x42, 0x00, 0x80, 0xd2, 0x90, 0xfc, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x60, 0x07, 0x00, 0x35, 0x44, 0x57, 0x40, 0xb9, 0x82, 0x33, 0x2e, 0x91, + 0x40, 0xc7, 0x4e, 0xf9, 0x46, 0x20, 0x80, 0x52, 0x05, 0x00, 0x80, 0x52, + 0x03, 0x00, 0x80, 0x52, 0x01, 0x00, 0x80, 0xd2, 0x22, 0x0a, 0x00, 0x94, + 0xf3, 0x03, 0x00, 0x2a, 0x20, 0x06, 0x00, 0x35, 0x43, 0x5b, 0x40, 0xb9, + 0x61, 0x13, 0x1f, 0x91, 0x40, 0xd7, 0x4e, 0xf9, 0x06, 0x00, 0x80, 0x52, + 0x65, 0x00, 0x80, 0x52, 0x04, 0x00, 0x80, 0x52, 0x02, 0x00, 0x80, 0xd2, + 0x18, 0x0a, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x04, 0x00, 0x35, + 0x44, 0x8f, 0x4b, 0x29, 0x22, 0x63, 0x20, 0x91, 0x40, 0xe7, 0x4e, 0xf9, + 0x01, 0xb3, 0x21, 0x91, 0x66, 0x00, 0x80, 0x52, 0x45, 0x00, 0x80, 0x52, + 0x0f, 0x0a, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0xc0, 0x03, 0x00, 0x35, + 0x20, 0x00, 0x80, 0x52, 0x7b, 0x24, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0x40, 0x03, 0x00, 0x35, 0xe0, 0x72, 0x45, 0xf9, 0x21, 0x00, 0x80, 0x52, + 0xa0, 0x02, 0x00, 0xf9, 0xe0, 0x03, 0x14, 0xaa, 0xc1, 0x2a, 0x0b, 0xb9, + 0x17, 0xab, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xd1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x0d, 0xab, 0xff, 0x97, 0xf3, 0x80, 0x80, 0x52, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xfd, 0x7b, 0xd1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x14, 0xaa, + 0x02, 0xab, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xd1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x08, 0x80, 0x52, 0x03, 0x08, 0x80, 0x52, 0x40, 0x2b, 0x00, 0x39, + 0xdb, 0xfe, 0xff, 0x17, 0x40, 0x01, 0x00, 0x90, 0x01, 0x04, 0x80, 0x52, + 0x00, 0x60, 0x13, 0x91, 0x92, 0x24, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0xfe, 0xfe, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0x01, 0x00, 0x80, 0x12, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x02, 0x00, 0xd0, + 0x94, 0x62, 0x3c, 0x91, 0xf5, 0x13, 0x00, 0xf9, 0xf5, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x14, 0xaa, 0xef, 0xaa, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x60, 0x01, 0x00, 0x35, 0xc2, 0x01, 0x00, 0xf0, 0x42, 0xa0, 0x2c, 0x91, + 0x40, 0x08, 0x40, 0x79, 0x41, 0x2c, 0x40, 0x39, 0x00, 0x08, 0xc1, 0x1a, + 0x1f, 0x00, 0x15, 0x6b, 0x2a, 0x01, 0x00, 0x54, 0x33, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x14, 0xaa, 0xd7, 0xaa, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x43, 0x24, 0x40, 0xb9, 0x63, 0x04, 0x00, 0x11, + 0x75, 0x01, 0x00, 0x35, 0xa3, 0xfe, 0xff, 0x35, 0x5f, 0x24, 0x00, 0xb9, + 0xe0, 0x03, 0x14, 0xaa, 0xcb, 0xaa, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x20, 0x40, 0xb9, + 0x01, 0x08, 0x00, 0x11, 0x3f, 0x00, 0x15, 0x6b, 0xa0, 0x00, 0x00, 0x54, + 0x00, 0x0c, 0x00, 0x11, 0x33, 0x00, 0x80, 0x52, 0x1f, 0x00, 0x15, 0x6b, + 0xa1, 0xfc, 0xff, 0x54, 0x7f, 0x00, 0x15, 0x6b, 0x41, 0xfc, 0xff, 0x54, + 0x64, 0x05, 0x80, 0x52, 0xe0, 0xc3, 0x00, 0x91, 0x01, 0x00, 0x80, 0x52, + 0x43, 0x24, 0x00, 0xb9, 0xe4, 0x0f, 0x06, 0x29, 0xff, 0x1f, 0x00, 0xf9, + 0xf4, 0xa8, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0xc0, 0xfc, 0xff, 0x34, + 0xd9, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xff, 0x3b, 0x00, 0xb9, 0x00, 0x02, 0x00, 0xb4, 0xe2, 0xa3, 0x00, 0x91, + 0x01, 0x00, 0x80, 0x12, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, + 0x00, 0x00, 0x80, 0x52, 0xd3, 0x96, 0xff, 0x97, 0x80, 0x00, 0x00, 0x34, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe1, 0x17, 0x40, 0xf9, 0x61, 0x02, 0x00, 0xf9, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0xfd, 0x7b, 0xbc, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x01, 0x00, 0x40, 0xf9, 0xf3, 0x0b, 0x00, 0xf9, + 0xf3, 0x03, 0x00, 0xaa, 0x81, 0x01, 0x00, 0xb4, 0xe0, 0xa3, 0x00, 0x91, + 0xe1, 0xff, 0x02, 0xa9, 0xff, 0x3b, 0x00, 0xb9, 0x2a, 0x97, 0xff, 0x97, + 0x40, 0x00, 0x00, 0x35, 0x7f, 0x02, 0x00, 0xf9, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0xe1, 0x00, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0xe1, 0x3b, 0x00, 0xb9, 0x00, 0x02, 0x00, 0xb4, + 0xe2, 0xa3, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x01, 0x2a, 0x01, 0x00, 0x80, 0x12, 0xa2, 0x96, 0xff, 0x97, + 0x80, 0x00, 0x00, 0x34, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe1, 0x17, 0x40, 0xf9, 0x61, 0x02, 0x00, 0xf9, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x40, 0x00, 0x80, 0x52, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0xb4, 0xfd, 0x7b, 0xbc, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x01, 0x00, 0x40, 0xf9, 0xf3, 0x0b, 0x00, 0xf9, + 0xf3, 0x03, 0x00, 0xaa, 0xa1, 0x01, 0x00, 0xb4, 0xe2, 0x00, 0x80, 0x52, + 0xe0, 0xa3, 0x00, 0x91, 0xe1, 0xff, 0x02, 0xa9, 0xe2, 0x3b, 0x00, 0xb9, + 0xf9, 0x96, 0xff, 0x97, 0x40, 0x00, 0x00, 0x35, 0x7f, 0x02, 0x00, 0xf9, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x40, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbf, 0xa9, 0x21, 0x00, 0x80, 0x52, + 0x20, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, 0xf0, 0x3c, 0x00, 0x94, + 0xfd, 0x7b, 0xc1, 0xa8, 0xe0, 0x01, 0x00, 0x90, 0x21, 0x00, 0x80, 0x52, + 0x00, 0xe0, 0x26, 0x91, 0x87, 0xa8, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0xe0, 0x3b, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x01, 0x2a, + 0x01, 0x00, 0x80, 0x52, 0x7a, 0x2b, 0x00, 0x94, 0x7f, 0x12, 0x00, 0x71, + 0xe0, 0x00, 0x00, 0x54, 0xf3, 0x0b, 0x40, 0xf9, 0xe0, 0x01, 0x00, 0x90, + 0xfd, 0x7b, 0xc2, 0xa8, 0x00, 0x60, 0x26, 0x91, 0x01, 0x00, 0x80, 0x52, + 0x76, 0xa8, 0xff, 0x17, 0xf3, 0x0b, 0x40, 0xf9, 0xe0, 0x01, 0x00, 0x90, + 0xfd, 0x7b, 0xc2, 0xa8, 0x00, 0xa0, 0x26, 0x91, 0x21, 0x00, 0x80, 0x52, + 0x70, 0xa8, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x1c, 0x00, 0x12, 0xf3, 0x03, 0x03, 0x2a, + 0xf5, 0x5b, 0x02, 0xa9, 0x35, 0x1c, 0x00, 0x12, 0x56, 0x1c, 0x00, 0x12, + 0x74, 0x9c, 0xff, 0x97, 0x00, 0x24, 0xd4, 0x1a, 0xc0, 0x00, 0x00, 0x37, + 0x20, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe3, 0x03, 0x13, 0x2a, + 0xe2, 0x03, 0x16, 0x2a, 0xe1, 0x03, 0x15, 0x2a, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xbd, 0x39, 0x00, 0x14, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x13, 0x1c, 0x00, 0x12, 0x34, 0x1c, 0x00, 0x12, + 0x5f, 0x9c, 0xff, 0x97, 0x00, 0x24, 0xd3, 0x1a, 0xa0, 0x00, 0x00, 0x37, + 0x20, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe1, 0x03, 0x14, 0x2a, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0x14, 0x38, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x13, 0x1c, 0x00, 0x12, 0x34, 0x1c, 0x00, 0x12, 0xf5, 0x13, 0x00, 0xf9, + 0x55, 0x1c, 0x00, 0x12, 0x49, 0x9c, 0xff, 0x97, 0x00, 0x24, 0xd3, 0x1a, + 0xc0, 0x00, 0x00, 0x37, 0x20, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe2, 0x03, 0x15, 0x2a, 0xe1, 0x03, 0x14, 0x2a, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0x23, 0x38, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x03, 0x01, 0xaa, 0xf3, 0x03, 0x02, 0xaa, 0xe1, 0x03, 0x01, 0x91, + 0x22, 0x00, 0x80, 0x52, 0xf5, 0x5b, 0x02, 0xa9, 0xf6, 0x03, 0x04, 0x2a, + 0xb5, 0x1c, 0x00, 0x12, 0xf7, 0x1b, 0x00, 0xf9, 0x77, 0x1c, 0x00, 0x12, + 0x28, 0xa8, 0xff, 0x97, 0x1f, 0x18, 0x1c, 0x71, 0xc0, 0x00, 0x00, 0x54, + 0xe0, 0x43, 0x40, 0xb9, 0x1f, 0xa4, 0x02, 0x71, 0x60, 0x00, 0x00, 0x54, + 0xe0, 0x07, 0x44, 0xa9, 0x80, 0x06, 0x00, 0xa9, 0x80, 0x02, 0x40, 0xb9, + 0x1f, 0xa4, 0x02, 0x71, 0xa4, 0x1a, 0x40, 0x7a, 0x41, 0x04, 0x00, 0x54, + 0x1f, 0xa4, 0x02, 0x71, 0xe0, 0x02, 0x00, 0x54, 0x1f, 0xac, 0x02, 0x71, + 0x60, 0x01, 0x00, 0x54, 0xc4, 0x0a, 0x00, 0x11, 0x64, 0x06, 0x00, 0xb9, + 0xe0, 0x03, 0x13, 0xaa, 0x21, 0x00, 0x80, 0x52, 0xf8, 0xa7, 0xff, 0x97, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xc4, 0x12, 0x00, 0x11, + 0x64, 0x06, 0x00, 0xb9, 0xe0, 0x03, 0x13, 0xaa, 0x21, 0x00, 0x80, 0x52, + 0xee, 0xa7, 0xff, 0x97, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x76, 0x06, 0x00, 0xb9, 0xe0, 0x03, 0x13, 0xaa, 0x01, 0x00, 0x80, 0x52, + 0xe5, 0xa7, 0xff, 0x97, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0x03, 0x17, 0x2a, 0x22, 0x00, 0x80, 0x52, 0x01, 0x00, 0x80, 0x12, + 0xac, 0xff, 0xff, 0x97, 0x60, 0x00, 0x00, 0x35, 0x80, 0x02, 0x40, 0xb9, + 0xd9, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0x23, 0x01, 0x00, 0xf0, + 0x63, 0x60, 0x15, 0x91, 0x00, 0x01, 0x80, 0x52, 0x41, 0x00, 0x80, 0x52, + 0x33, 0xcd, 0xff, 0x97, 0x80, 0x02, 0x40, 0xb9, 0xd1, 0xff, 0xff, 0x17, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x13, 0x1c, 0x00, 0x12, 0x34, 0x1c, 0x00, 0x12, 0xeb, 0x9b, 0xff, 0x97, + 0x00, 0x24, 0xd3, 0x1a, 0xa0, 0x00, 0x00, 0x37, 0x20, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe1, 0x03, 0x14, 0x2a, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xfc, 0x37, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x12, + 0x1f, 0x1c, 0x00, 0x71, 0x69, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x1b, 0x38, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x1c, 0x00, 0x12, 0xf3, 0x03, 0x01, 0xaa, + 0xcf, 0x9b, 0xff, 0x97, 0x00, 0x24, 0xd4, 0x1a, 0xa0, 0x01, 0x00, 0x36, + 0x40, 0x00, 0x80, 0x52, 0x13, 0x01, 0x00, 0xb4, 0xe1, 0x83, 0x00, 0x91, + 0xe0, 0x03, 0x14, 0x2a, 0x3c, 0x39, 0x00, 0x94, 0xe1, 0x2b, 0x40, 0xb9, + 0xe2, 0x13, 0x40, 0xf9, 0x62, 0x02, 0x00, 0xf9, 0x61, 0x0a, 0x00, 0xb9, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xa1, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbc, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x1c, 0x00, 0x12, + 0xf3, 0x03, 0x01, 0xaa, 0xb6, 0x9b, 0xff, 0x97, 0x00, 0x24, 0xd4, 0x1a, + 0xe0, 0x00, 0x00, 0x37, 0x20, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x62, 0x02, 0x40, 0xf9, 0xe2, 0x13, 0x00, 0xf9, + 0x65, 0x2a, 0x40, 0x39, 0xe1, 0x83, 0x00, 0x91, 0x66, 0x12, 0x40, 0x79, + 0xe0, 0x03, 0x14, 0x2a, 0x63, 0x1a, 0x40, 0xb9, 0x62, 0x3a, 0x40, 0x79, + 0x64, 0x0a, 0x40, 0xf9, 0xe6, 0x53, 0x00, 0x79, 0xe5, 0xab, 0x00, 0x39, + 0xe4, 0x1b, 0x00, 0xf9, 0xe3, 0x3b, 0x00, 0xb9, 0xe2, 0x7b, 0x00, 0x79, + 0xf7, 0x37, 0x00, 0x94, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x21, 0x02, 0x00, 0xb4, 0xfd, 0x7b, 0xbb, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x1c, 0x00, 0x12, + 0xf3, 0x03, 0x01, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, 0x55, 0x1c, 0x00, 0x12, + 0x76, 0x1c, 0x00, 0x12, 0x8f, 0x9b, 0xff, 0x97, 0x00, 0x24, 0xd4, 0x1a, + 0x00, 0x01, 0x00, 0x37, 0x20, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x67, 0x2a, 0x40, 0x39, + 0xe3, 0x03, 0x16, 0x2a, 0x68, 0x12, 0x40, 0x79, 0xe2, 0x03, 0x15, 0x2a, + 0x64, 0x3a, 0x40, 0x79, 0xe1, 0xc3, 0x00, 0x91, 0x65, 0x1a, 0x40, 0xb9, + 0xe0, 0x03, 0x14, 0x2a, 0x69, 0x02, 0x40, 0xf9, 0xe9, 0x1b, 0x00, 0xf9, + 0x66, 0x0a, 0x40, 0xf9, 0xe8, 0x73, 0x00, 0x79, 0xe7, 0xeb, 0x00, 0x39, + 0xe6, 0x23, 0x00, 0xf9, 0xe5, 0x4b, 0x00, 0xb9, 0xe4, 0x9b, 0x00, 0x79, + 0x19, 0x38, 0x00, 0x94, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xa2, 0x01, 0x00, 0xb4, + 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x14, 0x1c, 0x00, 0x12, 0xf3, 0x03, 0x02, 0xaa, 0x6a, 0x9b, 0xff, 0x97, + 0x00, 0x24, 0xd4, 0x1a, 0xe0, 0x00, 0x00, 0x37, 0x20, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x62, 0x1a, 0x40, 0xa9, + 0xe2, 0x1b, 0x02, 0xa9, 0x64, 0x4a, 0x40, 0x39, 0x65, 0x22, 0x40, 0x79, + 0xe1, 0x83, 0x00, 0x91, 0x63, 0x16, 0x40, 0xb9, 0xe0, 0x03, 0x14, 0x2a, + 0x62, 0x0e, 0x40, 0xf9, 0xe5, 0x63, 0x00, 0x79, 0xe4, 0xcb, 0x00, 0x39, + 0xe3, 0x37, 0x00, 0xb9, 0xe2, 0x1f, 0x00, 0xf9, 0x25, 0x38, 0x00, 0x94, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xe2, 0x02, 0x00, 0xb0, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x02, 0x00, 0xd0, + 0x61, 0x22, 0x46, 0x39, 0x40, 0xf0, 0x3e, 0x39, 0xff, 0x7f, 0x05, 0x29, + 0x41, 0x01, 0x00, 0x35, 0x21, 0x01, 0x00, 0xf0, 0xe0, 0x02, 0x00, 0xd0, + 0x21, 0x20, 0x16, 0x91, 0x00, 0x20, 0x05, 0x91, 0x22, 0x00, 0x80, 0x52, + 0xa6, 0xa8, 0xff, 0x97, 0xa0, 0x00, 0x00, 0x35, 0x20, 0x00, 0x80, 0x52, + 0x60, 0x22, 0x06, 0x39, 0xd6, 0x28, 0x00, 0x94, 0x80, 0x00, 0x00, 0x34, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x01, 0x00, 0x00, 0x90, 0x21, 0x00, 0x08, 0x91, 0xe0, 0x00, 0x80, 0x52, + 0xea, 0x29, 0x00, 0x94, 0x20, 0xff, 0xff, 0x35, 0xe0, 0x01, 0x00, 0x90, + 0x01, 0xe0, 0x25, 0x91, 0x23, 0x60, 0x00, 0x91, 0x22, 0x40, 0x00, 0x91, + 0x00, 0x78, 0x49, 0xb9, 0x04, 0x00, 0x00, 0x90, 0x21, 0x20, 0x00, 0x91, + 0xe5, 0xa3, 0x00, 0x91, 0x84, 0xc0, 0x08, 0x91, 0x83, 0x04, 0x00, 0x94, + 0xc0, 0xfd, 0xff, 0x35, 0x71, 0x36, 0x00, 0x94, 0x80, 0xfd, 0xff, 0x35, + 0xe0, 0xb3, 0x00, 0x91, 0x4a, 0x39, 0x00, 0x94, 0x20, 0xfd, 0xff, 0x35, + 0xf3, 0x02, 0x00, 0xb0, 0x61, 0xf6, 0x7e, 0x39, 0xc1, 0xfc, 0xff, 0x35, + 0x02, 0x00, 0x00, 0x90, 0x21, 0x01, 0x00, 0xf0, 0xe0, 0x02, 0x00, 0xb0, + 0x42, 0x00, 0x34, 0x91, 0x21, 0x80, 0x16, 0x91, 0x00, 0x00, 0x3f, 0x91, + 0x26, 0x00, 0x80, 0x52, 0x05, 0x01, 0x80, 0x52, 0x04, 0x00, 0x82, 0x52, + 0x03, 0x00, 0x80, 0xd2, 0x93, 0xa7, 0xff, 0x97, 0x40, 0xfb, 0xff, 0x35, + 0x21, 0x00, 0x80, 0x52, 0x61, 0xf6, 0x3e, 0x39, 0xd7, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0x01, 0x1c, 0x00, 0x12, 0x3f, 0x1c, 0x00, 0x71, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x33, 0x00, 0x80, 0x52, 0xa9, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x34, 0x00, 0x80, 0x52, 0xa0, 0x3b, 0x80, 0x52, + 0x81, 0x22, 0xc1, 0x1a, 0xee, 0x29, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, + 0xa0, 0x01, 0x00, 0x35, 0xe1, 0x03, 0x14, 0x2a, 0x00, 0x12, 0x80, 0x52, + 0x55, 0x29, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0x40, 0xfe, 0xff, 0x34, + 0xe2, 0x03, 0x00, 0x2a, 0x23, 0x01, 0x00, 0xf0, 0x63, 0x00, 0x18, 0x91, + 0x81, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x35, 0xcc, 0xff, 0x97, + 0xeb, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0x81, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0x23, 0x01, 0x00, 0xf0, 0x63, 0xe0, 0x16, 0x91, + 0x2e, 0xcc, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x63, 0x1c, 0x00, 0x12, 0x65, 0x40, 0x00, 0x51, 0x7f, 0x00, 0x01, 0x71, + 0xa5, 0x78, 0x1b, 0x12, 0xa5, 0x1c, 0x00, 0x12, 0xa4, 0x18, 0x40, 0x7a, + 0x41, 0x04, 0x00, 0x54, 0x42, 0x1c, 0x00, 0x12, 0xe6, 0x03, 0x00, 0xaa, + 0x5f, 0x0c, 0x00, 0x71, 0x20, 0x00, 0x80, 0x52, 0xa8, 0x00, 0x00, 0x54, + 0x21, 0x1c, 0x00, 0x12, 0xdf, 0x00, 0x00, 0xf1, 0x22, 0x18, 0x47, 0x7a, + 0x49, 0x00, 0x00, 0x54, 0xc0, 0x03, 0x5f, 0xd6, 0x65, 0x10, 0x02, 0x0b, + 0xbf, 0x00, 0x01, 0x71, 0xa8, 0xff, 0xff, 0x54, 0x84, 0x1c, 0x00, 0x12, + 0x42, 0x3c, 0x10, 0x53, 0x9f, 0x00, 0x00, 0x71, 0x63, 0x1c, 0x08, 0x53, + 0xe0, 0x07, 0x9f, 0x1a, 0x42, 0x10, 0x01, 0x0b, 0xfd, 0x7b, 0xbe, 0xa9, + 0x04, 0x15, 0x80, 0x52, 0x63, 0x20, 0x00, 0x0b, 0x42, 0x00, 0x03, 0x0b, + 0xfd, 0x03, 0x00, 0x91, 0xe0, 0x02, 0x00, 0xd0, 0x01, 0x00, 0x80, 0x12, + 0x00, 0x20, 0x05, 0x91, 0xe4, 0x0b, 0x02, 0x29, 0xe6, 0x0f, 0x00, 0xf9, + 0x4c, 0xa8, 0xff, 0x97, 0xa0, 0x00, 0x00, 0x34, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0x43, 0x00, 0x91, 0x01, 0x00, 0x80, 0x52, 0xac, 0xa6, 0xff, 0x97, + 0xf9, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbf, 0xa9, 0xe0, 0x01, 0x00, 0x90, 0x01, 0x00, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0xc0, 0x44, 0xf9, 0xef, 0x04, 0x00, 0x94, + 0x60, 0x00, 0x00, 0x34, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xc1, 0xa8, 0xe0, 0x00, 0x80, 0x52, 0x79, 0x29, 0x00, 0x14, + 0x00, 0x1c, 0x00, 0x12, 0x21, 0x1c, 0x00, 0x12, 0x1f, 0x1c, 0x00, 0x71, + 0x69, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x26, 0x36, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x12, + 0x1f, 0x1c, 0x00, 0x71, 0x69, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x4b, 0x36, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0x61, 0x00, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x54, 0x00, 0x80, 0x52, + 0xe1, 0x3b, 0x00, 0xb9, 0x00, 0x01, 0x00, 0xb4, 0xf3, 0x03, 0x00, 0xaa, + 0xe2, 0xa3, 0x00, 0x91, 0xe0, 0x03, 0x01, 0x2a, 0x01, 0x00, 0x80, 0x12, + 0x6d, 0x94, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0xa0, 0x00, 0x00, 0x34, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x8b, 0x42, 0xa9, 0x01, 0x00, 0x80, 0x52, + 0x78, 0x8c, 0x00, 0x94, 0xe0, 0x17, 0x40, 0xf9, 0x01, 0x40, 0x86, 0xd2, + 0xf0, 0x3f, 0x00, 0x94, 0xe0, 0x17, 0x40, 0xf9, 0x60, 0x02, 0x00, 0xf9, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x02, 0x00, 0xb4, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x01, 0x00, 0x40, 0xf9, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, + 0xa1, 0x01, 0x00, 0xb4, 0x62, 0x00, 0x80, 0x52, 0xe0, 0xa3, 0x00, 0x91, + 0xe1, 0xff, 0x02, 0xa9, 0xe2, 0x3b, 0x00, 0xb9, 0xbd, 0x94, 0xff, 0x97, + 0x40, 0x00, 0x00, 0x35, 0x7f, 0x02, 0x00, 0xf9, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x74, 0x1c, 0x00, 0x12, 0x03, 0x19, 0x80, 0x52, 0xf7, 0x1b, 0x00, 0xf9, + 0x37, 0x1c, 0x00, 0x12, 0x81, 0x7e, 0xa3, 0x9b, 0x53, 0x1c, 0x00, 0x12, + 0xf5, 0x5b, 0x02, 0xa9, 0xf6, 0x03, 0x00, 0xaa, 0x73, 0x1e, 0x7a, 0xd3, + 0xc3, 0x3f, 0x00, 0x94, 0x41, 0x06, 0x80, 0x52, 0xe2, 0x02, 0x00, 0xd0, + 0x55, 0x40, 0x06, 0x91, 0xe0, 0x03, 0x17, 0x2a, 0x81, 0x7e, 0x01, 0x1b, + 0x56, 0x90, 0x01, 0xb9, 0x82, 0x00, 0x80, 0xd2, 0x22, 0x00, 0xc0, 0xf2, + 0xa1, 0x06, 0x00, 0xb9, 0xa2, 0x06, 0x00, 0xf9, 0xbf, 0x12, 0x00, 0xb9, + 0xb8, 0x37, 0x00, 0x94, 0xe1, 0x02, 0x00, 0xb0, 0x22, 0xa0, 0x3e, 0x91, + 0x24, 0x08, 0x80, 0x52, 0x84, 0x00, 0x14, 0x4b, 0x85, 0x00, 0x80, 0xd2, + 0xe3, 0x03, 0x00, 0xaa, 0x84, 0x74, 0x1e, 0x53, 0x45, 0x06, 0xc0, 0xf2, + 0x54, 0x04, 0x00, 0xb9, 0x73, 0x02, 0x03, 0x8b, 0x45, 0x04, 0x00, 0xf9, + 0xe3, 0x03, 0x15, 0xaa, 0x44, 0x10, 0x00, 0xb9, 0xe0, 0x01, 0x00, 0x90, + 0x33, 0xa8, 0x0f, 0xb9, 0x01, 0x40, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, + 0x00, 0xc0, 0x44, 0xf9, 0x16, 0x06, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x53, 0x1c, 0x00, 0x12, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x00, 0xaa, + 0x36, 0x1c, 0x00, 0x12, 0x41, 0x1c, 0x79, 0xd3, 0xff, 0x1f, 0x00, 0xf9, + 0x96, 0x3f, 0x00, 0x94, 0x73, 0x6a, 0x1b, 0x53, 0xe1, 0x02, 0x00, 0xd0, + 0x34, 0x40, 0x06, 0x91, 0xe0, 0x03, 0x16, 0x2a, 0x35, 0x90, 0x01, 0xb9, + 0x95, 0x00, 0x80, 0xd2, 0x35, 0x00, 0xc0, 0xf2, 0xe1, 0xe3, 0x00, 0x91, + 0x93, 0x06, 0x00, 0xb9, 0x95, 0x06, 0x00, 0xf9, 0x9f, 0x12, 0x00, 0xb9, + 0xff, 0x31, 0x00, 0x94, 0xa0, 0x00, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0x01, 0x00, 0x90, 0xe1, 0x02, 0x00, 0xb0, 0x22, 0xa0, 0x3e, 0x91, + 0xe3, 0x03, 0x14, 0xaa, 0x00, 0xc0, 0x44, 0xf9, 0xe4, 0x1f, 0x40, 0xf9, + 0x55, 0x04, 0x00, 0xf9, 0x24, 0xa8, 0x0f, 0xb9, 0x01, 0x40, 0x80, 0x52, + 0x53, 0x04, 0x00, 0xb9, 0x5f, 0x10, 0x00, 0xb9, 0xee, 0x05, 0x00, 0x94, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0x3f, 0x1c, 0x00, 0x72, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0x40, 0x01, 0x00, 0x54, 0x00, 0x1c, 0x00, 0x12, 0x21, 0x00, 0x80, 0x52, + 0xf1, 0xfe, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0x80, 0x02, 0x00, 0x35, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x01, 0x00, 0x90, 0x00, 0xc0, 0x44, 0xf9, + 0xfc, 0x06, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0x00, 0xff, 0xff, 0x34, + 0xe2, 0x03, 0x00, 0x2a, 0x81, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0x23, 0x01, 0x00, 0xf0, 0x63, 0x40, 0x1a, 0x91, 0x30, 0xcb, 0xff, 0x97, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, 0x81, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0x23, 0x01, 0x00, 0xf0, 0x63, 0xc0, 0x19, 0x91, + 0x26, 0xcb, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xb1, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xe0, 0x03, 0x03, 0x91, + 0x7d, 0xa5, 0xff, 0x97, 0xe2, 0x03, 0x00, 0x2a, 0x40, 0x10, 0x00, 0x35, + 0xe0, 0x63, 0x40, 0xf9, 0x21, 0x15, 0x80, 0x52, 0xac, 0xa5, 0xff, 0x97, + 0xe2, 0x03, 0x00, 0x2a, 0xc0, 0x0e, 0x00, 0x35, 0xe0, 0x63, 0x40, 0xf9, + 0x41, 0x15, 0x80, 0x52, 0xa7, 0xa5, 0xff, 0x97, 0xe2, 0x03, 0x00, 0x2a, + 0x80, 0x28, 0x00, 0x35, 0xe0, 0x63, 0x40, 0xf9, 0x61, 0x15, 0x80, 0x52, + 0xa2, 0xa5, 0xff, 0x97, 0xe2, 0x03, 0x00, 0x2a, 0x40, 0x0f, 0x00, 0x35, + 0xe0, 0x23, 0x03, 0x91, 0x6a, 0xa5, 0xff, 0x97, 0xe2, 0x03, 0x00, 0x2a, + 0xe0, 0x0d, 0x00, 0x35, 0xe0, 0x67, 0x40, 0xf9, 0x01, 0x15, 0x80, 0x52, + 0x99, 0xa5, 0xff, 0x97, 0xe2, 0x03, 0x00, 0x2a, 0xa0, 0x27, 0x00, 0x35, + 0x20, 0x01, 0x00, 0xf0, 0x00, 0x60, 0x15, 0x91, 0xe0, 0x5f, 0x00, 0xf9, + 0x20, 0x01, 0x00, 0xf0, 0x00, 0x20, 0x1e, 0x91, 0xe0, 0x4b, 0x00, 0xf9, + 0x20, 0x01, 0x00, 0xf0, 0x00, 0x60, 0x1f, 0x91, 0xe0, 0x5b, 0x00, 0xf9, + 0x20, 0x01, 0x00, 0xf0, 0x00, 0x20, 0x21, 0x91, 0xe0, 0x37, 0x00, 0xf9, + 0x20, 0x01, 0x00, 0xf0, 0x00, 0xe0, 0x16, 0x91, 0xe0, 0x47, 0x00, 0xf9, + 0x20, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x18, 0x91, 0xe0, 0x57, 0x00, 0xf9, + 0x20, 0x01, 0x00, 0xf0, 0x00, 0xa0, 0x22, 0x91, 0xe0, 0x53, 0x00, 0xf9, + 0x20, 0x01, 0x00, 0xf0, 0x00, 0x80, 0x23, 0x91, 0xf7, 0x63, 0x03, 0xa9, + 0xf8, 0x02, 0x00, 0xb0, 0x18, 0xf3, 0x3e, 0x91, 0xf9, 0x6b, 0x04, 0xa9, + 0xf9, 0x01, 0x00, 0x90, 0x39, 0xe3, 0x25, 0x91, 0xfa, 0x02, 0x00, 0xd0, + 0x5a, 0x23, 0x05, 0x91, 0xfb, 0x73, 0x05, 0xa9, 0x3b, 0x01, 0x00, 0xf0, + 0x7b, 0x63, 0x20, 0x91, 0x3c, 0x01, 0x00, 0xf0, 0x9c, 0x03, 0x22, 0x91, + 0xe0, 0x3f, 0x00, 0xf9, 0x20, 0x01, 0x00, 0xf0, 0x00, 0x20, 0x24, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf5, 0x5b, 0x02, 0xa9, 0xe0, 0x3b, 0x00, 0xf9, + 0x20, 0x01, 0x00, 0xf0, 0x00, 0xc0, 0x24, 0x91, 0xe0, 0x4f, 0x00, 0xf9, + 0x1f, 0x20, 0x03, 0xd5, 0xe0, 0x67, 0x40, 0xf9, 0xe1, 0x43, 0x03, 0x91, + 0x02, 0x00, 0x80, 0x12, 0x8d, 0xa5, 0xff, 0x97, 0x40, 0x05, 0x00, 0x35, + 0xe3, 0xd7, 0x40, 0xb9, 0x00, 0x03, 0x40, 0x39, 0x61, 0x0c, 0x00, 0x72, + 0xff, 0x77, 0x00, 0xf9, 0x73, 0x7c, 0x10, 0x53, 0xf4, 0x17, 0x9f, 0x1a, + 0x62, 0x1e, 0x00, 0x12, 0x94, 0x02, 0x00, 0x6a, 0x73, 0x1e, 0x18, 0x53, + 0xf3, 0xe7, 0x00, 0xb9, 0x75, 0x1c, 0x44, 0xd3, 0x76, 0x3c, 0x48, 0xd3, + 0xe0, 0x6f, 0x40, 0xf9, 0xc1, 0x0b, 0x00, 0x54, 0xa1, 0x0a, 0x00, 0x34, + 0xa3, 0x36, 0x02, 0x11, 0xe1, 0x03, 0x15, 0x2a, 0xe3, 0xe3, 0x00, 0xb9, + 0x17, 0x00, 0x80, 0x52, 0x48, 0xff, 0xff, 0x97, 0xe2, 0x03, 0x00, 0x2a, + 0xc2, 0x05, 0x00, 0x35, 0xdf, 0x02, 0x00, 0x71, 0xe0, 0x03, 0x15, 0x2a, + 0xe1, 0x07, 0x9f, 0x1a, 0x6e, 0xff, 0xff, 0x97, 0xe4, 0x03, 0x00, 0x2a, + 0xe0, 0x05, 0x00, 0x34, 0x37, 0x12, 0x00, 0x35, 0xe4, 0x03, 0x04, 0x2a, + 0x21, 0x00, 0x80, 0x52, 0x73, 0x06, 0x00, 0x11, 0xe0, 0x83, 0x03, 0x91, + 0xf3, 0xe7, 0x00, 0xb9, 0xe4, 0x77, 0x00, 0xf9, 0x4c, 0xa5, 0xff, 0x97, + 0xe0, 0x67, 0x40, 0xf9, 0xe1, 0x43, 0x03, 0x91, 0x02, 0x00, 0x80, 0x12, + 0x64, 0xa5, 0xff, 0x97, 0x00, 0xfb, 0xff, 0x34, 0xe3, 0x37, 0x40, 0xf9, + 0xe2, 0x03, 0x00, 0x2a, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xa2, 0xca, 0xff, 0x97, 0xcd, 0xff, 0xff, 0x17, 0x23, 0x01, 0x00, 0xf0, + 0x63, 0x40, 0x1b, 0x91, 0x41, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0x9c, 0xca, 0xff, 0x97, 0xfd, 0x7b, 0xcf, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x23, 0x01, 0x00, 0xf0, + 0x63, 0xc0, 0x1a, 0x91, 0x95, 0xca, 0xff, 0x97, 0xfd, 0x7b, 0xcf, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x23, 0x01, 0x00, 0xf0, 0x63, 0x80, 0x1c, 0x91, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x8e, 0xca, 0xff, 0x97, + 0xf2, 0xff, 0xff, 0x17, 0x80, 0x20, 0x87, 0x52, 0x5f, 0x00, 0x00, 0x6b, + 0x20, 0x0b, 0x00, 0x54, 0xe3, 0x03, 0x1b, 0xaa, 0x81, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x86, 0xca, 0xff, 0x97, 0xe0, 0x63, 0x40, 0xf9, + 0xe1, 0x43, 0x03, 0x91, 0x82, 0x3e, 0x80, 0x52, 0x3e, 0xa5, 0xff, 0x97, + 0xa0, 0x04, 0x00, 0x34, 0x1f, 0x18, 0x1c, 0x71, 0xc1, 0x07, 0x00, 0x54, + 0x76, 0x0d, 0x00, 0x35, 0xe3, 0x4f, 0x40, 0xf9, 0xe2, 0x03, 0x00, 0x2a, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x79, 0xca, 0xff, 0x97, + 0x20, 0x07, 0x40, 0xf9, 0xdf, 0x03, 0x00, 0x94, 0x80, 0x02, 0x00, 0x35, + 0xe0, 0x03, 0x1a, 0xaa, 0xb0, 0xa6, 0xff, 0x97, 0xe0, 0xf3, 0xff, 0x34, + 0xe3, 0x3b, 0x40, 0xf9, 0xe2, 0x03, 0x00, 0x2a, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x6e, 0xca, 0xff, 0x97, 0x99, 0xff, 0xff, 0x17, + 0x17, 0x00, 0x80, 0x52, 0xa4, 0xbe, 0x00, 0x11, 0x63, 0x7c, 0x18, 0x53, + 0xe1, 0x03, 0x15, 0x2a, 0xe4, 0xe3, 0x00, 0xb9, 0xc3, 0xfe, 0xff, 0x97, + 0xe2, 0x03, 0x00, 0x2a, 0xab, 0xff, 0xff, 0x17, 0x37, 0x00, 0x80, 0x52, + 0xf8, 0xff, 0xff, 0x17, 0xe3, 0x3f, 0x40, 0xf9, 0xe2, 0x03, 0x00, 0x2a, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x5e, 0xca, 0xff, 0x97, + 0xe8, 0xff, 0xff, 0x17, 0xe0, 0x63, 0x40, 0xf9, 0xe5, 0x03, 0x14, 0x2a, + 0xe4, 0x03, 0x13, 0x2a, 0xe3, 0x03, 0x15, 0x2a, 0xe2, 0x83, 0x03, 0x91, + 0xe1, 0x43, 0x03, 0x91, 0xde, 0xfc, 0xff, 0x97, 0xb6, 0xfb, 0xff, 0x34, + 0x01, 0x00, 0x80, 0x52, 0xa0, 0x3b, 0x80, 0x52, 0xfe, 0x27, 0x00, 0x94, + 0xc0, 0x02, 0x00, 0x34, 0xe3, 0x47, 0x40, 0xf9, 0xe2, 0x03, 0x00, 0x2a, + 0x81, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x4c, 0xca, 0xff, 0x97, + 0x01, 0x00, 0x80, 0x52, 0xe0, 0x3b, 0x80, 0x52, 0xf5, 0x27, 0x00, 0x94, + 0x00, 0xfa, 0xff, 0x34, 0xe3, 0x53, 0x40, 0xf9, 0xe2, 0x03, 0x00, 0x2a, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x43, 0xca, 0xff, 0x97, + 0xca, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0xe3, 0x03, 0x1c, 0xaa, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x3d, 0xca, 0xff, 0x97, + 0xe7, 0xff, 0xff, 0x17, 0x21, 0x00, 0x80, 0x52, 0x00, 0x12, 0x80, 0x52, + 0x51, 0x27, 0x00, 0x94, 0xa0, 0xfd, 0xff, 0x34, 0xe3, 0x57, 0x40, 0xf9, + 0xe2, 0x03, 0x00, 0x2a, 0x81, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0x33, 0xca, 0xff, 0x97, 0xe7, 0xff, 0xff, 0x17, 0xe3, 0x4b, 0x40, 0xf9, + 0x81, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x2e, 0xca, 0xff, 0x97, + 0x20, 0x07, 0x40, 0xf9, 0x94, 0x03, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, + 0x94, 0x08, 0x00, 0x35, 0x73, 0x16, 0x00, 0x11, 0xe0, 0x83, 0x03, 0x91, + 0x21, 0x00, 0x80, 0x52, 0xf3, 0xe7, 0x00, 0xb9, 0xf4, 0x77, 0x00, 0xf9, + 0xc4, 0xa4, 0xff, 0x97, 0x4f, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x15, 0x2a, + 0x22, 0x00, 0x80, 0x52, 0x01, 0x00, 0x80, 0x12, 0xe4, 0x87, 0x00, 0xb9, + 0x8e, 0xfc, 0xff, 0x97, 0xe4, 0x87, 0x40, 0xb9, 0x40, 0xed, 0xff, 0x34, + 0xe3, 0x5f, 0x40, 0xf9, 0xe2, 0x03, 0x00, 0x2a, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0xe4, 0x87, 0x00, 0xb9, 0x16, 0xca, 0xff, 0x97, + 0xe4, 0x87, 0x40, 0xb9, 0x62, 0xff, 0xff, 0x17, 0x01, 0x00, 0x80, 0x52, + 0xa0, 0x3b, 0x80, 0x52, 0xbd, 0x27, 0x00, 0x94, 0x60, 0x02, 0x00, 0x34, + 0xe3, 0x47, 0x40, 0xf9, 0xe2, 0x03, 0x00, 0x2a, 0x81, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0x0b, 0xca, 0xff, 0x97, 0xe0, 0x63, 0x40, 0xf9, + 0xe1, 0x43, 0x03, 0x91, 0x42, 0x06, 0x80, 0x52, 0xc3, 0xa4, 0xff, 0x97, + 0x00, 0x03, 0x00, 0x34, 0x1f, 0x18, 0x1c, 0x71, 0x80, 0x04, 0x00, 0x54, + 0xe2, 0x03, 0x00, 0x2a, 0xe3, 0x03, 0x1c, 0xaa, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xff, 0xc9, 0xff, 0x97, 0xaa, 0xff, 0xff, 0x17, + 0x21, 0x00, 0x80, 0x52, 0x00, 0x12, 0x80, 0x52, 0x13, 0x27, 0x00, 0x94, + 0x00, 0xfe, 0xff, 0x34, 0xe3, 0x57, 0x40, 0xf9, 0xe2, 0x03, 0x00, 0x2a, + 0x81, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0xf5, 0xc9, 0xff, 0x97, + 0xe0, 0x63, 0x40, 0xf9, 0xe1, 0x43, 0x03, 0x91, 0x42, 0x06, 0x80, 0x52, + 0xad, 0xa4, 0xff, 0x97, 0x60, 0xfd, 0xff, 0x35, 0x1f, 0x20, 0x03, 0xd5, + 0xe0, 0x63, 0x40, 0xf9, 0xe5, 0x03, 0x14, 0x2a, 0xe4, 0x03, 0x13, 0x2a, + 0xe3, 0x03, 0x15, 0x2a, 0xe2, 0x83, 0x03, 0x91, 0xe1, 0x43, 0x03, 0x91, + 0x70, 0xfc, 0xff, 0x97, 0x93, 0xff, 0xff, 0x17, 0xe3, 0x5b, 0x40, 0xf9, + 0xe2, 0x03, 0x14, 0x2a, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xe2, 0xc9, 0xff, 0x97, 0xb8, 0xff, 0xff, 0x17, 0xc2, 0xe0, 0x80, 0xd2, + 0x73, 0x0e, 0x00, 0x11, 0xe0, 0x83, 0x03, 0x91, 0x21, 0x00, 0x80, 0x52, + 0xf3, 0xe7, 0x00, 0xb9, 0xe2, 0x77, 0x00, 0xf9, 0x7a, 0xa4, 0xff, 0x97, + 0xb7, 0xf0, 0xff, 0x34, 0xe0, 0x03, 0x15, 0x2a, 0x22, 0x00, 0x80, 0x52, + 0x01, 0x00, 0x80, 0x12, 0x45, 0xfc, 0xff, 0x97, 0x00, 0xf0, 0xff, 0x34, + 0xe3, 0x5f, 0x40, 0xf9, 0xe2, 0x03, 0x00, 0x2a, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0xcf, 0xc9, 0xff, 0x97, 0x7a, 0xff, 0xff, 0x17, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x23, 0x01, 0x00, 0xd0, + 0x63, 0xe0, 0x1b, 0x91, 0xc9, 0xc9, 0xff, 0x97, 0xfd, 0x7b, 0xcf, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x23, 0x01, 0x00, 0xd0, 0x63, 0x80, 0x1d, 0x91, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0xc2, 0xc9, 0xff, 0x97, + 0x26, 0xff, 0xff, 0x17, 0x22, 0x01, 0x00, 0xd0, 0x42, 0x80, 0x25, 0x91, + 0xff, 0x83, 0x00, 0xd1, 0x00, 0x1c, 0x00, 0x12, 0x21, 0x1c, 0x40, 0x92, + 0x1f, 0x1c, 0x00, 0x71, 0x44, 0x14, 0x40, 0xa9, 0xe4, 0x97, 0x00, 0xa9, + 0x42, 0x10, 0x40, 0xb9, 0xe2, 0x1b, 0x00, 0xb9, 0x22, 0x98, 0x44, 0x7a, + 0x89, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, 0xff, 0x83, 0x00, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x23, 0x00, 0x91, 0x41, 0x78, 0x61, 0xb8, + 0xff, 0x83, 0x00, 0x91, 0xc2, 0x26, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x43, 0x00, 0xd1, 0x22, 0x07, 0x80, 0xd2, 0x00, 0x1c, 0x00, 0x12, + 0x82, 0x06, 0xc0, 0xf2, 0x1f, 0x1c, 0x00, 0x71, 0x21, 0x1c, 0x00, 0x12, + 0xe2, 0x07, 0x00, 0xf9, 0x22, 0x98, 0x41, 0x7a, 0x89, 0x00, 0x00, 0x54, + 0x20, 0x00, 0x80, 0x52, 0xff, 0x43, 0x00, 0x91, 0xc0, 0x03, 0x5f, 0xd6, + 0xe2, 0x43, 0x00, 0x91, 0x41, 0x08, 0x21, 0x8b, 0x21, 0x80, 0x5f, 0xb8, + 0xff, 0x43, 0x00, 0x91, 0xb0, 0x26, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x12, + 0x1f, 0x1c, 0x00, 0x71, 0x69, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbf, 0xa9, 0x21, 0x1c, 0x00, 0x12, + 0xfd, 0x03, 0x00, 0x91, 0xfc, 0x35, 0x00, 0x94, 0x00, 0x00, 0x80, 0x52, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x1c, 0x00, 0x12, + 0x1f, 0x1c, 0x00, 0x71, 0x69, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbf, 0xa9, 0x21, 0x1c, 0x00, 0x12, + 0x42, 0x1c, 0x00, 0x12, 0xfd, 0x03, 0x00, 0x91, 0x17, 0x36, 0x00, 0x94, + 0x00, 0x00, 0x80, 0x52, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x04, 0x00, 0x51, 0x3f, 0xf8, 0x0f, 0x71, 0xe8, 0x02, 0x00, 0x54, + 0x20, 0x02, 0x00, 0x37, 0x24, 0x01, 0x00, 0xf0, 0x84, 0x80, 0x18, 0x91, + 0x01, 0x00, 0x80, 0xd2, 0x83, 0x00, 0x80, 0x52, 0x25, 0x00, 0x80, 0x52, + 0x1f, 0x20, 0x03, 0xd5, 0x62, 0x20, 0xc1, 0x1a, 0x5f, 0x00, 0x00, 0x6a, + 0x60, 0x00, 0x00, 0x54, 0x82, 0x78, 0x61, 0xf8, 0x45, 0x14, 0x01, 0xb9, + 0x21, 0x04, 0x00, 0x91, 0x3f, 0x20, 0x00, 0xf1, 0x21, 0xff, 0xff, 0x54, + 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x41, 0x55, 0x81, 0xd2, + 0x01, 0xe0, 0xa8, 0xf2, 0x22, 0x00, 0x80, 0x52, 0x22, 0x00, 0x00, 0x39, + 0xec, 0xff, 0xff, 0x17, 0x40, 0xe0, 0x81, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0x41, 0x55, 0x81, 0xd2, + 0x01, 0xe0, 0xa8, 0xf2, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0xf3, 0x03, 0x00, 0xaa, 0x20, 0x00, 0x40, 0x39, 0x80, 0x00, 0x10, 0x36, + 0x60, 0x02, 0x40, 0xb9, 0x00, 0x00, 0x00, 0x32, 0x60, 0x02, 0x00, 0xb9, + 0xe0, 0xa3, 0x00, 0x91, 0x4c, 0x20, 0x00, 0x94, 0xe1, 0xa3, 0x40, 0x39, + 0x81, 0x00, 0x00, 0x34, 0x61, 0x02, 0x40, 0xb9, 0x21, 0x00, 0x1f, 0x32, + 0x61, 0x02, 0x00, 0xb9, 0x24, 0x01, 0x00, 0xf0, 0x84, 0x80, 0x18, 0x91, + 0x01, 0x00, 0x80, 0xd2, 0x25, 0x00, 0x80, 0x52, 0x82, 0x78, 0x61, 0xf8, + 0x23, 0x08, 0x00, 0x11, 0x21, 0x04, 0x00, 0x91, 0xa3, 0x20, 0xc3, 0x1a, + 0x42, 0x18, 0x41, 0xb9, 0x82, 0x00, 0x00, 0x36, 0x62, 0x02, 0x40, 0xb9, + 0x43, 0x00, 0x03, 0x2a, 0x63, 0x02, 0x00, 0xb9, 0x3f, 0x20, 0x00, 0xf1, + 0xc1, 0xfe, 0xff, 0x54, 0x01, 0x02, 0x80, 0xd2, 0x01, 0x10, 0xb6, 0xf2, + 0x21, 0x00, 0x40, 0xb9, 0x3f, 0x20, 0x18, 0x72, 0x80, 0x00, 0x00, 0x54, + 0x61, 0x02, 0x40, 0xb9, 0x21, 0x00, 0x16, 0x32, 0x61, 0x02, 0x00, 0xb9, + 0x01, 0x02, 0x80, 0xd2, 0x01, 0x12, 0xb6, 0xf2, 0x21, 0x00, 0x40, 0xb9, + 0x3f, 0x20, 0x18, 0x72, 0x80, 0x00, 0x00, 0x54, 0x61, 0x02, 0x40, 0xb9, + 0x21, 0x00, 0x15, 0x32, 0x61, 0x02, 0x00, 0xb9, 0x01, 0x02, 0x80, 0xd2, + 0x01, 0x14, 0xb6, 0xf2, 0x21, 0x00, 0x40, 0xb9, 0x3f, 0x20, 0x18, 0x72, + 0x80, 0x00, 0x00, 0x54, 0x61, 0x02, 0x40, 0xb9, 0x21, 0x00, 0x14, 0x32, + 0x61, 0x02, 0x00, 0xb9, 0x01, 0x02, 0x80, 0xd2, 0x01, 0x16, 0xb6, 0xf2, + 0x21, 0x00, 0x40, 0xb9, 0x3f, 0x20, 0x18, 0x72, 0x80, 0x00, 0x00, 0x54, + 0x61, 0x02, 0x40, 0xb9, 0x21, 0x00, 0x13, 0x32, 0x61, 0x02, 0x00, 0xb9, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x42, 0x55, 0x81, 0xd2, 0x02, 0xe0, 0xa8, 0xf2, 0xff, 0x43, 0x00, 0xd1, + 0x00, 0x00, 0x80, 0x52, 0x41, 0x00, 0x40, 0x39, 0x21, 0x1c, 0x00, 0x12, + 0xe1, 0x3f, 0x00, 0x39, 0xe1, 0x3f, 0x40, 0x39, 0x21, 0x1c, 0x00, 0x12, + 0x21, 0x00, 0x1e, 0x32, 0xe1, 0x3f, 0x00, 0x39, 0xe1, 0x3f, 0x40, 0x39, + 0x21, 0x1c, 0x00, 0x12, 0x41, 0x00, 0x00, 0x39, 0xff, 0x43, 0x00, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0xe4, 0x03, 0x00, 0x2a, 0x23, 0x01, 0x00, 0xd0, + 0x22, 0xe0, 0x81, 0x52, 0x63, 0xe0, 0x25, 0x91, 0xe1, 0x01, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x06, 0xc9, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0x02, 0x18, 0x40, 0xf9, + 0xf3, 0x0b, 0x00, 0xf9, 0x13, 0x1c, 0x40, 0xf9, 0x62, 0x00, 0x00, 0xb4, + 0x20, 0x00, 0x80, 0x52, 0x40, 0x30, 0x00, 0xb9, 0x13, 0x03, 0x00, 0xb4, + 0x63, 0x06, 0x40, 0xf9, 0xa3, 0x00, 0x00, 0xb4, 0x22, 0x00, 0x40, 0xf9, + 0x61, 0x1a, 0x40, 0xb9, 0x60, 0x0a, 0x40, 0xf9, 0x60, 0x00, 0x3f, 0xd6, + 0x62, 0x42, 0x41, 0x39, 0x60, 0x12, 0x40, 0xf9, 0x61, 0x1e, 0x40, 0xf9, + 0x00, 0x18, 0x40, 0xf9, 0x21, 0x18, 0x40, 0xf9, 0xe2, 0x01, 0x00, 0x34, + 0x40, 0x00, 0x00, 0xb4, 0x1f, 0x08, 0x00, 0xb9, 0x01, 0x02, 0x00, 0xb4, + 0x3f, 0x08, 0x00, 0xb9, 0xe2, 0x00, 0x80, 0x52, 0x7f, 0x02, 0x00, 0x39, + 0x7f, 0x1a, 0x00, 0xb9, 0x22, 0x30, 0x00, 0xb9, 0x60, 0x00, 0x00, 0xb4, + 0xe1, 0x00, 0x80, 0x52, 0x01, 0x30, 0x00, 0xb9, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x41, 0xff, 0xff, 0xb4, + 0xe2, 0x00, 0x80, 0x52, 0x22, 0x30, 0x00, 0xb9, 0xf7, 0xff, 0xff, 0x17, + 0x7f, 0x02, 0x00, 0x39, 0x7f, 0x1a, 0x00, 0xb9, 0xf4, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xf0, + 0x00, 0x20, 0x27, 0x91, 0x01, 0x80, 0x00, 0x91, 0x00, 0x0c, 0x40, 0xf9, + 0xd0, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xf0, 0x00, 0x20, 0x27, 0x91, + 0x01, 0x40, 0x01, 0x91, 0x00, 0x24, 0x40, 0xf9, 0xc8, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x01, 0x00, 0xf0, 0x00, 0x20, 0x27, 0x91, 0x01, 0x00, 0x02, 0x91, + 0x00, 0x3c, 0x40, 0xf9, 0xc0, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xf0, + 0x00, 0x20, 0x27, 0x91, 0x01, 0x60, 0x02, 0x91, 0x00, 0x48, 0x40, 0xf9, + 0xb8, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xf0, 0x00, 0x20, 0x27, 0x91, + 0x01, 0x20, 0x03, 0x91, 0x00, 0x60, 0x40, 0xf9, 0xb0, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x01, 0x00, 0xf0, 0x00, 0x20, 0x27, 0x91, 0x01, 0x80, 0x03, 0x91, + 0x00, 0x6c, 0x40, 0xf9, 0xa8, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, + 0x00, 0x00, 0x40, 0xf9, 0x02, 0x18, 0x40, 0xf9, 0xa2, 0x01, 0x00, 0xb4, + 0x00, 0x1c, 0x40, 0xf9, 0x03, 0x04, 0x40, 0xf9, 0x03, 0x01, 0x00, 0xb4, + 0x00, 0x08, 0x40, 0xf9, 0x81, 0x00, 0x80, 0x52, 0x42, 0x30, 0x40, 0xb9, + 0x42, 0x08, 0x7c, 0x92, 0x60, 0x00, 0x3f, 0xd6, 0x60, 0x02, 0x40, 0xf9, + 0x02, 0x18, 0x40, 0xf9, 0x40, 0x00, 0x80, 0x52, 0x40, 0x30, 0x00, 0xb9, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xf0, + 0x00, 0x20, 0x27, 0x91, 0xe6, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x01, 0x00, 0xf0, 0x00, 0x20, 0x27, 0x91, 0x00, 0x60, 0x00, 0x91, + 0xe1, 0xff, 0xff, 0x17, 0xc0, 0x01, 0x00, 0xf0, 0x00, 0x20, 0x27, 0x91, + 0x00, 0xc0, 0x00, 0x91, 0xdd, 0xff, 0xff, 0x17, 0xc0, 0x01, 0x00, 0xf0, + 0x00, 0x20, 0x27, 0x91, 0x00, 0x20, 0x01, 0x91, 0xd9, 0xff, 0xff, 0x17, + 0xc0, 0x01, 0x00, 0xf0, 0x00, 0x20, 0x27, 0x91, 0x00, 0x80, 0x01, 0x91, + 0xd5, 0xff, 0xff, 0x17, 0xc0, 0x01, 0x00, 0xf0, 0x00, 0x20, 0x27, 0x91, + 0x00, 0xe0, 0x01, 0x91, 0xd1, 0xff, 0xff, 0x17, 0xc0, 0x01, 0x00, 0xf0, + 0x00, 0x20, 0x27, 0x91, 0x00, 0x40, 0x02, 0x91, 0xcd, 0xff, 0xff, 0x17, + 0xc0, 0x01, 0x00, 0xf0, 0x00, 0x20, 0x27, 0x91, 0x00, 0xa0, 0x02, 0x91, + 0xc9, 0xff, 0xff, 0x17, 0xc0, 0x01, 0x00, 0xf0, 0x00, 0x20, 0x27, 0x91, + 0x00, 0x00, 0x03, 0x91, 0xc5, 0xff, 0xff, 0x17, 0xc0, 0x01, 0x00, 0xf0, + 0x00, 0x20, 0x27, 0x91, 0x00, 0x60, 0x03, 0x91, 0xc1, 0xff, 0xff, 0x17, + 0xe5, 0x03, 0x00, 0xaa, 0x23, 0x01, 0x00, 0xd0, 0x63, 0x60, 0x26, 0x91, + 0xc1, 0x01, 0x00, 0xf0, 0x20, 0x40, 0x2b, 0x91, 0x61, 0x40, 0x00, 0x91, + 0x02, 0x20, 0x01, 0x91, 0x63, 0xc0, 0x01, 0x91, 0xa4, 0x10, 0x40, 0xf9, + 0xa5, 0x1c, 0x40, 0xf9, 0x07, 0x00, 0x00, 0x14, 0xbf, 0x00, 0x02, 0xeb, + 0xc0, 0x01, 0x00, 0x54, 0x3f, 0x00, 0x03, 0xeb, 0x20, 0x02, 0x00, 0x54, + 0x20, 0x08, 0x40, 0xa9, 0x21, 0x40, 0x00, 0x91, 0x9f, 0x00, 0x00, 0xeb, + 0x21, 0xff, 0xff, 0x54, 0xbf, 0x00, 0x02, 0xeb, 0x80, 0x00, 0x00, 0x54, + 0xa0, 0x40, 0x40, 0xb9, 0x1f, 0x28, 0x00, 0x71, 0xc1, 0xfe, 0xff, 0x54, + 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x80, 0x40, 0x40, 0xb9, + 0x1f, 0x28, 0x00, 0x71, 0x80, 0xff, 0xff, 0x54, 0x3f, 0x00, 0x03, 0xeb, + 0x21, 0xfe, 0xff, 0x54, 0x60, 0x21, 0x87, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x40, 0xf9, 0x60, 0x01, 0x00, 0xb4, + 0x00, 0x1c, 0x40, 0xf9, 0x20, 0x01, 0x00, 0xb4, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xd5, 0xff, 0xff, 0x97, 0x1f, 0x00, 0x00, 0x71, + 0x21, 0x20, 0x87, 0x52, 0x00, 0x00, 0x81, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x20, 0x87, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x21, 0x28, 0x48, 0xd3, 0x02, 0x00, 0x80, 0x92, + 0x43, 0x21, 0x87, 0x52, 0x42, 0x20, 0xc1, 0x9a, 0x1f, 0x00, 0x22, 0x6a, + 0x60, 0x10, 0x9f, 0x1a, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xe6, 0x03, 0x01, 0x2a, 0x40, 0x01, 0x00, 0x34, 0xa3, 0x01, 0x00, 0x34, + 0x9f, 0x00, 0x00, 0x71, 0xa4, 0x08, 0x40, 0x7a, 0x01, 0x01, 0x00, 0x54, + 0xc6, 0x18, 0x44, 0xd3, 0x42, 0x34, 0x4c, 0xd3, 0xdf, 0x00, 0x02, 0x6b, + 0x08, 0x01, 0x00, 0x54, 0xee, 0xff, 0xff, 0x17, 0x20, 0x21, 0x87, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x21, 0x87, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0x20, 0x87, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0xc0, 0x20, 0x87, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x03, 0x00, 0xaa, + 0x00, 0x00, 0x80, 0x52, 0x83, 0x04, 0x40, 0x39, 0x87, 0x08, 0x40, 0x39, + 0x85, 0x0c, 0x40, 0x39, 0x86, 0x10, 0x40, 0x39, 0x63, 0x00, 0x1f, 0x53, + 0x88, 0x14, 0x40, 0x39, 0xe7, 0x00, 0x1e, 0x53, 0x89, 0x18, 0x40, 0x39, + 0x63, 0x00, 0x07, 0x2a, 0x82, 0x1c, 0x40, 0x39, 0xc6, 0x08, 0x1c, 0x53, + 0x8c, 0x20, 0x40, 0x39, 0xa5, 0x00, 0x1d, 0x53, 0x87, 0x24, 0x40, 0x39, + 0xa5, 0x00, 0x06, 0x2a, 0x8b, 0x28, 0x40, 0x39, 0x29, 0x09, 0x14, 0x53, + 0x86, 0x2c, 0x40, 0x39, 0x08, 0x09, 0x18, 0x53, 0x8a, 0x30, 0x40, 0x39, + 0x08, 0x01, 0x09, 0x2a, 0x63, 0x00, 0x05, 0x2a, 0x89, 0x38, 0x40, 0x39, + 0x85, 0x34, 0x40, 0x39, 0x8c, 0x09, 0x10, 0x53, 0x42, 0x00, 0x11, 0x53, + 0x63, 0x00, 0x08, 0x2a, 0x42, 0x00, 0x0c, 0x2a, 0x68, 0x05, 0x0a, 0x53, + 0xe7, 0x04, 0x0c, 0x53, 0x62, 0x00, 0x02, 0x2a, 0xe7, 0x00, 0x08, 0x2a, + 0x43, 0x01, 0x07, 0x53, 0xc6, 0x00, 0x08, 0x53, 0x84, 0x00, 0x40, 0x39, + 0xc6, 0x00, 0x03, 0x2a, 0x42, 0x00, 0x07, 0x2a, 0xa3, 0x00, 0x06, 0x53, + 0x25, 0x01, 0x04, 0x53, 0x63, 0x00, 0x05, 0x2a, 0x42, 0x00, 0x06, 0x2a, + 0x42, 0x00, 0x03, 0x2a, 0x83, 0x00, 0x00, 0x12, 0x42, 0x00, 0x03, 0x2a, + 0x22, 0x00, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xba, 0xa9, + 0x1f, 0x18, 0x00, 0x71, 0xfd, 0x03, 0x00, 0x91, 0xf7, 0x63, 0x03, 0xa9, + 0xb7, 0x20, 0x87, 0x52, 0xa8, 0x05, 0x00, 0x54, 0x5f, 0x00, 0x00, 0xf1, + 0xf3, 0x53, 0x01, 0xa9, 0x64, 0x18, 0x40, 0xfa, 0xf5, 0x5b, 0x02, 0xa9, + 0xf4, 0x03, 0x01, 0xaa, 0xf5, 0x03, 0x02, 0xaa, 0xf6, 0x03, 0x03, 0xaa, + 0x24, 0x18, 0x40, 0xfa, 0x97, 0x21, 0x87, 0x52, 0xe0, 0x04, 0x00, 0x54, + 0xf3, 0x03, 0x00, 0x2a, 0x21, 0x01, 0x00, 0xd0, 0x21, 0x60, 0x26, 0x91, + 0xd8, 0x01, 0x00, 0xf0, 0x18, 0xa3, 0x37, 0x91, 0x62, 0xee, 0x7c, 0xd3, + 0x23, 0x00, 0x02, 0x8b, 0x00, 0x0b, 0x80, 0xd2, 0x21, 0x68, 0x62, 0xf8, + 0x60, 0x62, 0x00, 0x9b, 0x62, 0x04, 0x40, 0xf9, 0x23, 0x1c, 0x40, 0xf9, + 0x04, 0x94, 0x00, 0xa9, 0x1f, 0x18, 0x00, 0xb9, 0x01, 0x10, 0x00, 0xf9, + 0x02, 0x1c, 0x00, 0xf9, 0x83, 0x03, 0x00, 0xb4, 0x01, 0x0b, 0x80, 0xd2, + 0x57, 0x20, 0x87, 0x52, 0x61, 0x62, 0x01, 0x9b, 0x3f, 0x14, 0x00, 0xf9, + 0x3f, 0x30, 0x00, 0xb9, 0x3f, 0xd0, 0x00, 0x39, 0x3f, 0x20, 0x00, 0xf9, + 0x3f, 0x48, 0x00, 0xb9, 0x3f, 0x30, 0x01, 0x39, 0x00, 0x0b, 0x80, 0xd2, + 0xf5, 0x5b, 0x42, 0xa9, 0x73, 0x62, 0x00, 0x9b, 0x61, 0x12, 0x40, 0xf9, + 0x60, 0x1e, 0x40, 0xf9, 0xf3, 0x53, 0x41, 0xa9, 0x3f, 0x1c, 0x00, 0xf9, + 0x1f, 0x1c, 0x00, 0xf9, 0xe0, 0x03, 0x17, 0x2a, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x17, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x41, 0x1c, 0x40, 0xf9, + 0xf9, 0x6b, 0x04, 0xa9, 0x61, 0x00, 0x00, 0xb4, 0xf9, 0x6b, 0x44, 0xa9, + 0xe1, 0xff, 0xff, 0x17, 0xf9, 0x02, 0x00, 0xb0, 0x21, 0x93, 0x46, 0x39, + 0x1f, 0x14, 0x00, 0xf9, 0xfa, 0x02, 0x00, 0xb0, 0x5a, 0xa3, 0x06, 0x91, + 0x1f, 0x30, 0x00, 0xb9, 0x1f, 0xd0, 0x00, 0x39, 0x1f, 0x20, 0x00, 0xf9, + 0x1f, 0x48, 0x00, 0xb9, 0x1f, 0x30, 0x01, 0x39, 0x01, 0x09, 0x00, 0x34, + 0x20, 0x00, 0x80, 0x52, 0x01, 0x00, 0x80, 0x12, 0x20, 0x93, 0x06, 0x39, + 0xe0, 0x03, 0x1a, 0xaa, 0x14, 0xa4, 0xff, 0x97, 0xf7, 0x03, 0x00, 0x2a, + 0xe0, 0x08, 0x00, 0x35, 0x19, 0x0b, 0x80, 0xd2, 0xfb, 0x2b, 0x00, 0xf9, + 0x79, 0x7e, 0x19, 0x9b, 0x1b, 0x03, 0x19, 0x8b, 0x63, 0x13, 0x40, 0xf9, + 0x60, 0x40, 0x40, 0xb9, 0x1f, 0x28, 0x00, 0x71, 0x40, 0x00, 0x00, 0x54, + 0x7b, 0x1c, 0x00, 0xf9, 0x00, 0x0b, 0x80, 0xd2, 0x60, 0x62, 0x00, 0x9b, + 0x02, 0x1c, 0x40, 0xf9, 0x40, 0x40, 0x40, 0xb9, 0x1f, 0x28, 0x00, 0x71, + 0x40, 0x00, 0x00, 0x54, 0x5b, 0x1c, 0x00, 0xf9, 0x01, 0x0b, 0x80, 0xd2, + 0x60, 0x18, 0x40, 0xf9, 0x61, 0x7e, 0x01, 0x9b, 0x1f, 0x6b, 0x21, 0x38, + 0xa0, 0x01, 0x00, 0xb4, 0x1f, 0x08, 0x00, 0xb9, 0xe1, 0x00, 0x80, 0x52, + 0x1f, 0x00, 0x00, 0xb9, 0x1f, 0x04, 0x00, 0xb9, 0x1f, 0x0c, 0x00, 0xb9, + 0x1f, 0x10, 0x00, 0xb9, 0x1f, 0x14, 0x00, 0xb9, 0x1f, 0x18, 0x00, 0xb9, + 0x01, 0x30, 0x00, 0xb9, 0x1f, 0x24, 0x00, 0xb9, 0x1f, 0x40, 0x00, 0xb9, + 0x1f, 0x48, 0x00, 0xb9, 0x40, 0x18, 0x40, 0xf9, 0xa0, 0x01, 0x00, 0xb4, + 0x1f, 0x08, 0x00, 0xb9, 0xe1, 0x00, 0x80, 0x52, 0x1f, 0x00, 0x00, 0xb9, + 0x1f, 0x04, 0x00, 0xb9, 0x1f, 0x0c, 0x00, 0xb9, 0x1f, 0x10, 0x00, 0xb9, + 0x1f, 0x14, 0x00, 0xb9, 0x1f, 0x18, 0x00, 0xb9, 0x01, 0x30, 0x00, 0xb9, + 0x1f, 0x24, 0x00, 0xb9, 0x1f, 0x40, 0x00, 0xb9, 0x1f, 0x48, 0x00, 0xb9, + 0xe0, 0x03, 0x1a, 0xaa, 0xd5, 0xa3, 0xff, 0x97, 0xf7, 0x03, 0x00, 0x2a, + 0x80, 0x0b, 0x00, 0x35, 0x1a, 0x0b, 0x80, 0xd2, 0x7a, 0x62, 0x1a, 0x9b, + 0x42, 0x13, 0x40, 0xf9, 0x43, 0x08, 0x40, 0xf9, 0x23, 0x03, 0x00, 0xb4, + 0x40, 0x04, 0x40, 0x29, 0x42, 0x08, 0x40, 0xb9, 0x47, 0x38, 0x00, 0x94, + 0xa0, 0x01, 0x00, 0x34, 0xf7, 0x03, 0x00, 0x2a, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x2b, 0x40, 0xf9, 0x98, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x1a, 0xaa, + 0x21, 0x01, 0x00, 0xd0, 0x21, 0x20, 0x26, 0x91, 0xa6, 0xa3, 0xff, 0x97, + 0xf7, 0x03, 0x00, 0x2a, 0x80, 0xf6, 0xff, 0x34, 0xf9, 0x6b, 0x44, 0xa9, + 0x90, 0xff, 0xff, 0x17, 0x40, 0x13, 0x40, 0xf9, 0x00, 0x00, 0x40, 0xb9, + 0x73, 0x39, 0x00, 0x94, 0x40, 0x13, 0x40, 0xf9, 0x00, 0x00, 0x40, 0xb9, + 0xdc, 0x38, 0x00, 0x94, 0xc0, 0xfd, 0xff, 0x35, 0x42, 0x13, 0x40, 0xf9, + 0x43, 0x14, 0x40, 0xf9, 0xc3, 0x01, 0x00, 0xb4, 0x40, 0x04, 0x43, 0x29, + 0x42, 0x20, 0x40, 0xb9, 0x2d, 0x38, 0x00, 0x94, 0xe0, 0xfc, 0xff, 0x35, + 0x1a, 0x0b, 0x80, 0xd2, 0x7a, 0x62, 0x1a, 0x9b, 0x40, 0x13, 0x40, 0xf9, + 0x00, 0x18, 0x40, 0xb9, 0x63, 0x39, 0x00, 0x94, 0x40, 0x13, 0x40, 0xf9, + 0x00, 0x18, 0x40, 0xb9, 0xcc, 0x38, 0x00, 0x94, 0xc0, 0xfb, 0xff, 0x35, + 0x1a, 0x0b, 0x80, 0xd2, 0x7a, 0x62, 0x1a, 0x9b, 0x42, 0x1f, 0x40, 0xf9, + 0x43, 0x08, 0x40, 0xf9, 0xa3, 0x01, 0x00, 0xb4, 0x40, 0x04, 0x40, 0x29, + 0x42, 0x08, 0x40, 0xb9, 0x1b, 0x38, 0x00, 0x94, 0xa0, 0xfa, 0xff, 0x35, + 0x40, 0x1f, 0x40, 0xf9, 0x00, 0x00, 0x40, 0xb9, 0x53, 0x39, 0x00, 0x94, + 0x40, 0x1f, 0x40, 0xf9, 0x00, 0x00, 0x40, 0xb9, 0xbc, 0x38, 0x00, 0x94, + 0xc0, 0xf9, 0xff, 0x35, 0x42, 0x1f, 0x40, 0xf9, 0x43, 0x14, 0x40, 0xf9, + 0xc3, 0x01, 0x00, 0xb4, 0x40, 0x04, 0x43, 0x29, 0x42, 0x20, 0x40, 0xb9, + 0x0d, 0x38, 0x00, 0x94, 0xe0, 0xf8, 0xff, 0x35, 0x1a, 0x0b, 0x80, 0xd2, + 0x7a, 0x62, 0x1a, 0x9b, 0x40, 0x1f, 0x40, 0xf9, 0x00, 0x18, 0x40, 0xb9, + 0x43, 0x39, 0x00, 0x94, 0x40, 0x1f, 0x40, 0xf9, 0x00, 0x18, 0x40, 0xb9, + 0xac, 0x38, 0x00, 0x94, 0xc0, 0xf7, 0xff, 0x35, 0x20, 0x83, 0x00, 0x91, + 0x39, 0xe3, 0x00, 0x91, 0x00, 0x03, 0x00, 0x8b, 0x18, 0x03, 0x19, 0x8b, + 0xf9, 0x6b, 0x44, 0xa9, 0x9b, 0x02, 0x00, 0xf9, 0xf3, 0x53, 0x41, 0xa9, + 0xfb, 0x2b, 0x40, 0xf9, 0xa0, 0x02, 0x00, 0xf9, 0xd8, 0x02, 0x00, 0xf9, + 0xe0, 0x03, 0x17, 0x2a, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x2b, 0x40, 0xf9, 0x47, 0xff, 0xff, 0x17, 0x20, 0x0d, 0x00, 0xb4, + 0xfd, 0x7b, 0xbe, 0xa9, 0x26, 0x1c, 0x00, 0x12, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0x96, 0xfe, 0xff, 0x97, + 0x00, 0x05, 0x00, 0x35, 0xe6, 0x01, 0x00, 0x34, 0x60, 0x1e, 0x40, 0xf9, + 0x00, 0x18, 0x40, 0xf9, 0x20, 0x01, 0x00, 0xb5, 0x60, 0x12, 0x40, 0xf9, + 0x01, 0x18, 0x40, 0xf9, 0xe1, 0x0a, 0x00, 0xb5, 0x09, 0x00, 0x00, 0x14, + 0x20, 0x00, 0x80, 0x52, 0x93, 0xa2, 0xff, 0x97, 0x60, 0x1e, 0x40, 0xf9, + 0x00, 0x18, 0x40, 0xf9, 0x00, 0x30, 0x40, 0xb9, 0x1f, 0x08, 0x18, 0x72, + 0x41, 0xff, 0xff, 0x54, 0x60, 0x12, 0x40, 0xf9, 0x01, 0x08, 0x40, 0xf9, + 0xa1, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x40, 0xb9, 0xb9, 0x38, 0x00, 0x94, + 0x60, 0x02, 0x00, 0x35, 0x60, 0x12, 0x40, 0xf9, 0x01, 0x14, 0x40, 0xf9, + 0x81, 0x00, 0x00, 0xb4, 0x00, 0x18, 0x40, 0xb9, 0xb3, 0x38, 0x00, 0x94, + 0xa0, 0x01, 0x00, 0x35, 0x60, 0x1e, 0x40, 0xf9, 0x01, 0x08, 0x40, 0xf9, + 0xa1, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x40, 0xb9, 0xad, 0x38, 0x00, 0x94, + 0xe0, 0x00, 0x00, 0x35, 0x60, 0x1e, 0x40, 0xf9, 0x01, 0x14, 0x40, 0xf9, + 0xe1, 0x00, 0x00, 0xb4, 0x00, 0x18, 0x40, 0xb9, 0xa7, 0x38, 0x00, 0x94, + 0x80, 0x00, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf4, 0x02, 0x00, 0xb0, 0x94, 0xa2, 0x06, 0x91, + 0xe0, 0x03, 0x14, 0xaa, 0x01, 0x00, 0x80, 0x12, 0x4a, 0xa3, 0xff, 0x97, + 0x00, 0xff, 0xff, 0x35, 0x62, 0x12, 0x40, 0xf9, 0x40, 0x18, 0x40, 0xf9, + 0xa0, 0x01, 0x00, 0xb4, 0x1f, 0x08, 0x00, 0xb9, 0xe1, 0x00, 0x80, 0x52, + 0x1f, 0x00, 0x00, 0xb9, 0x1f, 0x04, 0x00, 0xb9, 0x1f, 0x0c, 0x00, 0xb9, + 0x1f, 0x10, 0x00, 0xb9, 0x1f, 0x14, 0x00, 0xb9, 0x1f, 0x18, 0x00, 0xb9, + 0x01, 0x30, 0x00, 0xb9, 0x1f, 0x24, 0x00, 0xb9, 0x1f, 0x40, 0x00, 0xb9, + 0x1f, 0x48, 0x00, 0xb9, 0x61, 0x1e, 0x40, 0xf9, 0x20, 0x18, 0x40, 0xf9, + 0xa0, 0x01, 0x00, 0xb4, 0x1f, 0x08, 0x00, 0xb9, 0xe3, 0x00, 0x80, 0x52, + 0x1f, 0x00, 0x00, 0xb9, 0x1f, 0x04, 0x00, 0xb9, 0x1f, 0x0c, 0x00, 0xb9, + 0x1f, 0x10, 0x00, 0xb9, 0x1f, 0x14, 0x00, 0xb9, 0x1f, 0x18, 0x00, 0xb9, + 0x03, 0x30, 0x00, 0xb9, 0x1f, 0x24, 0x00, 0xb9, 0x1f, 0x40, 0x00, 0xb9, + 0x1f, 0x48, 0x00, 0xb9, 0x5f, 0x1c, 0x00, 0xf9, 0xc0, 0x01, 0x00, 0xf0, + 0x00, 0x40, 0x2b, 0x91, 0x3f, 0x1c, 0x00, 0xf9, 0x00, 0x40, 0x0b, 0x91, + 0x60, 0x12, 0x00, 0xf9, 0x60, 0x1e, 0x00, 0xf9, 0xe0, 0x03, 0x14, 0xaa, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0x14, 0xa3, 0xff, 0x17, + 0x20, 0x00, 0x80, 0x52, 0x42, 0xa2, 0xff, 0x97, 0x60, 0x12, 0x40, 0xf9, + 0x01, 0x18, 0x40, 0xf9, 0x21, 0x30, 0x40, 0xb9, 0x3f, 0x08, 0x18, 0x72, + 0x41, 0xff, 0xff, 0x54, 0xb0, 0xff, 0xff, 0x17, 0x60, 0x21, 0x87, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, + 0x00, 0x10, 0x40, 0xf9, 0x00, 0x18, 0x40, 0xf9, 0x00, 0x04, 0x00, 0xb4, + 0xe0, 0x03, 0x13, 0xaa, 0x28, 0xfe, 0xff, 0x97, 0x80, 0x00, 0x00, 0x34, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf4, 0x02, 0x00, 0xb0, 0x94, 0xa2, 0x06, 0x91, 0xe0, 0x03, 0x14, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0x03, 0xa3, 0xff, 0x97, 0x00, 0xff, 0xff, 0x35, + 0x60, 0x12, 0x40, 0xf9, 0x00, 0x18, 0x40, 0xf9, 0x40, 0x00, 0x00, 0xb4, + 0x1f, 0x08, 0x00, 0xb9, 0x61, 0x1e, 0x40, 0xf9, 0x21, 0x18, 0x40, 0xf9, + 0x41, 0x02, 0x00, 0xb4, 0x3f, 0x08, 0x00, 0xb9, 0xe2, 0x00, 0x80, 0x52, + 0x7f, 0x02, 0x00, 0x39, 0x7f, 0x1a, 0x00, 0xb9, 0x22, 0x30, 0x00, 0xb9, + 0x60, 0x00, 0x00, 0xb4, 0xe1, 0x00, 0x80, 0x52, 0x01, 0x30, 0x00, 0xb9, + 0xe0, 0x03, 0x14, 0xaa, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xe3, 0xa2, 0xff, 0x17, 0x60, 0x1e, 0x40, 0xf9, 0x00, 0x18, 0x40, 0xf9, + 0xe0, 0xfb, 0xff, 0xb5, 0x60, 0x20, 0x87, 0x52, 0xe0, 0xff, 0xff, 0x17, + 0x7f, 0x02, 0x00, 0x39, 0x7f, 0x1a, 0x00, 0xb9, 0xf2, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0xb4, + 0xfd, 0x7b, 0xbb, 0xa9, 0xe6, 0x03, 0x03, 0x2a, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x02, 0xaa, 0xf3, 0x03, 0x00, 0xaa, + 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x01, 0xaa, 0xf6, 0x03, 0x04, 0x2a, + 0xf6, 0xfd, 0xff, 0x97, 0xe0, 0x04, 0x00, 0x35, 0x60, 0x12, 0x40, 0xf9, + 0x9f, 0x02, 0x00, 0xf1, 0x04, 0x18, 0x40, 0xf9, 0x84, 0x08, 0x40, 0xfa, + 0x01, 0x05, 0x00, 0x54, 0x60, 0x1e, 0x40, 0xf9, 0x00, 0x18, 0x40, 0xf9, + 0xe0, 0x04, 0x00, 0xb4, 0x95, 0x04, 0x00, 0xb4, 0x62, 0x02, 0x40, 0x39, + 0x01, 0x30, 0x40, 0xb9, 0x22, 0x0d, 0x00, 0x35, 0x00, 0x30, 0x40, 0xb9, + 0xb5, 0x03, 0x00, 0x34, 0x16, 0x0d, 0x00, 0x34, 0x21, 0x34, 0x4c, 0xd3, + 0xc5, 0x7c, 0x08, 0x53, 0x3f, 0x00, 0x05, 0x6b, 0xf7, 0x63, 0x03, 0xa9, + 0x21, 0x90, 0x85, 0x1a, 0x00, 0x34, 0x4c, 0xd3, 0xc3, 0x5c, 0x18, 0x12, + 0x27, 0x08, 0x40, 0x92, 0x77, 0x10, 0x01, 0x2a, 0xff, 0x00, 0x00, 0x6b, + 0xe8, 0x0b, 0x00, 0x54, 0xe1, 0x03, 0x17, 0x2a, 0xe0, 0x03, 0x15, 0x2a, + 0x0c, 0xfe, 0xff, 0x97, 0xa0, 0x0a, 0x00, 0x35, 0x38, 0x00, 0x80, 0x52, + 0x18, 0x23, 0xc5, 0x1a, 0xc4, 0x04, 0x00, 0xb4, 0x82, 0x30, 0x40, 0xb9, + 0xe0, 0x03, 0x14, 0x2a, 0xb4, 0x03, 0x00, 0x35, 0xf7, 0x63, 0x43, 0xa9, + 0x20, 0x21, 0x87, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x21, 0x87, 0x52, + 0xfb, 0xff, 0xff, 0x17, 0x80, 0x21, 0x87, 0x52, 0xf9, 0xff, 0xff, 0x17, + 0x04, 0x0a, 0x00, 0xb4, 0x60, 0x02, 0x40, 0x39, 0x81, 0x30, 0x40, 0xb9, + 0x60, 0x08, 0x00, 0x35, 0x82, 0x30, 0x40, 0xb9, 0xe0, 0x03, 0x14, 0x2a, + 0xd4, 0xfe, 0xff, 0x34, 0x36, 0x08, 0x00, 0x34, 0xc4, 0x7c, 0x08, 0x53, + 0x21, 0x34, 0x4c, 0xd3, 0x3f, 0x00, 0x04, 0x6b, 0xc3, 0x5c, 0x18, 0x12, + 0x21, 0x90, 0x84, 0x1a, 0x25, 0x00, 0x80, 0x52, 0x27, 0x08, 0x40, 0x92, + 0xf7, 0x63, 0x03, 0xa9, 0x77, 0x10, 0x01, 0x2a, 0xb8, 0x20, 0xc4, 0x1a, + 0x42, 0x34, 0x4c, 0xd3, 0xff, 0x00, 0x02, 0x6b, 0xc8, 0x06, 0x00, 0x54, + 0xe1, 0x03, 0x17, 0x2a, 0xe4, 0xfd, 0xff, 0x97, 0xa0, 0x05, 0x00, 0x35, + 0xf9, 0x23, 0x00, 0xf9, 0xf9, 0x02, 0x00, 0x90, 0x39, 0xa3, 0x06, 0x91, + 0x01, 0x00, 0x80, 0x12, 0xe0, 0x03, 0x19, 0xaa, 0x8d, 0xa2, 0xff, 0x97, + 0xe0, 0x05, 0x00, 0x35, 0x60, 0x1e, 0x40, 0xf9, 0x61, 0x12, 0x40, 0xf9, + 0x00, 0x18, 0x40, 0xf9, 0x21, 0x18, 0x40, 0xf9, 0xe0, 0x05, 0x00, 0xb4, + 0x75, 0x22, 0x00, 0xf9, 0x15, 0x04, 0x00, 0xb9, 0x16, 0x0c, 0x00, 0xb9, + 0x18, 0x10, 0x00, 0xb9, 0x21, 0x01, 0x00, 0xb4, 0x74, 0x16, 0x00, 0xf9, + 0x62, 0x32, 0x40, 0xb9, 0x34, 0x04, 0x00, 0xb9, 0x36, 0x0c, 0x00, 0xb9, + 0xe2, 0x02, 0x02, 0x2a, 0x38, 0x10, 0x00, 0xb9, 0x42, 0x00, 0x00, 0x32, + 0x22, 0x08, 0x00, 0xb9, 0x61, 0x4a, 0x40, 0xb9, 0x62, 0x00, 0x80, 0x52, + 0x02, 0x02, 0xa0, 0x72, 0xe1, 0x02, 0x01, 0x2a, 0x21, 0x00, 0x02, 0x2a, + 0x01, 0x08, 0x00, 0xb9, 0x21, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x19, 0xaa, + 0x61, 0x02, 0x00, 0x39, 0x61, 0x42, 0x01, 0x39, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, 0x7f, 0x1a, 0x00, 0xb9, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, 0x5d, 0xa2, 0xff, 0x17, + 0x60, 0x21, 0x87, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0xf7, 0x63, 0x43, 0xa9, + 0xb3, 0xff, 0xff, 0x17, 0x80, 0x20, 0x87, 0x52, 0xb1, 0xff, 0xff, 0x17, + 0xe0, 0x20, 0x87, 0x52, 0xaf, 0xff, 0xff, 0x17, 0xc0, 0x20, 0x87, 0x52, + 0xf7, 0x63, 0x43, 0xa9, 0xac, 0xff, 0xff, 0x17, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x23, 0x40, 0xf9, 0xa9, 0xff, 0xff, 0x17, 0x60, 0x20, 0x87, 0x52, + 0xa7, 0xff, 0xff, 0x17, 0xa1, 0xfc, 0xff, 0xb4, 0x74, 0x16, 0x00, 0xf9, + 0x22, 0x00, 0x80, 0x52, 0x02, 0x02, 0xa0, 0x72, 0x60, 0x32, 0x40, 0xb9, + 0x34, 0x04, 0x00, 0xb9, 0x36, 0x0c, 0x00, 0xb9, 0xe0, 0x02, 0x00, 0x2a, + 0x38, 0x10, 0x00, 0xb9, 0x00, 0x00, 0x02, 0x2a, 0x20, 0x08, 0x00, 0xb9, + 0xda, 0xff, 0xff, 0x17, 0xc0, 0x07, 0x00, 0xb4, 0xfd, 0x7b, 0xbb, 0xa9, + 0xe6, 0x03, 0x03, 0x2a, 0x47, 0x1c, 0x00, 0x12, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x01, 0xaa, 0xf3, 0x03, 0x00, 0xaa, + 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x04, 0x2a, 0x5e, 0xfd, 0xff, 0x97, + 0xc0, 0x04, 0x00, 0x35, 0x60, 0x02, 0x40, 0x39, 0x80, 0x05, 0x00, 0x35, + 0x94, 0x07, 0x00, 0xb4, 0xf7, 0x63, 0x03, 0xa9, 0xa7, 0x04, 0x00, 0x35, + 0x78, 0x12, 0x40, 0xf9, 0x36, 0x00, 0x80, 0x52, 0x16, 0x02, 0xa0, 0x72, + 0x00, 0x1b, 0x40, 0xf9, 0xe0, 0x06, 0x00, 0xb4, 0x01, 0x30, 0x40, 0xb9, + 0x00, 0x30, 0x40, 0xb9, 0x14, 0x05, 0x00, 0x34, 0x55, 0x05, 0x00, 0x34, + 0x21, 0x34, 0x4c, 0xd3, 0xf9, 0x6b, 0x04, 0xa9, 0xd9, 0x7c, 0x08, 0x53, + 0x3f, 0x00, 0x19, 0x6b, 0x00, 0x34, 0x4c, 0xd3, 0x21, 0x90, 0x99, 0x1a, + 0xc3, 0x5c, 0x18, 0x12, 0x22, 0x08, 0x40, 0x92, 0x77, 0x10, 0x01, 0x2a, + 0x5f, 0x00, 0x00, 0x6b, 0x48, 0x04, 0x00, 0x54, 0xe1, 0x03, 0x17, 0x2a, + 0xe0, 0x03, 0x14, 0x2a, 0x75, 0xfd, 0xff, 0x97, 0xe0, 0x00, 0x00, 0x35, + 0xfa, 0x02, 0x00, 0x90, 0x5a, 0xa3, 0x06, 0x91, 0xe0, 0x03, 0x1a, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0x1f, 0xa2, 0xff, 0x97, 0x20, 0x04, 0x00, 0x34, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x76, 0x00, 0x80, 0x52, 0x16, 0x02, 0xa0, 0x72, 0x78, 0x1e, 0x40, 0xf9, + 0xdc, 0xff, 0xff, 0x17, 0x80, 0x20, 0x87, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x21, 0x87, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x21, 0x87, 0x52, + 0xf7, 0x63, 0x43, 0xa9, 0xef, 0xff, 0xff, 0x17, 0xe0, 0x20, 0x87, 0x52, + 0xf7, 0x63, 0x43, 0xa9, 0xec, 0xff, 0xff, 0x17, 0xc0, 0x20, 0x87, 0x52, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xe8, 0xff, 0xff, 0x17, + 0x80, 0x21, 0x87, 0x52, 0xe6, 0xff, 0xff, 0x17, 0x60, 0x20, 0x87, 0x52, + 0xf7, 0x63, 0x43, 0xa9, 0xe3, 0xff, 0xff, 0x17, 0x61, 0x4a, 0x40, 0xb9, + 0x23, 0x00, 0x80, 0x52, 0x02, 0x1b, 0x40, 0xf9, 0xc1, 0x02, 0x01, 0x2a, + 0x21, 0x00, 0x17, 0x2a, 0x79, 0x20, 0xd9, 0x1a, 0xf7, 0x63, 0x43, 0xa9, + 0x74, 0x16, 0x00, 0xf9, 0x74, 0x22, 0x00, 0xf9, 0xe0, 0x03, 0x1a, 0xaa, + 0x54, 0x04, 0x00, 0xb9, 0x55, 0x0c, 0x00, 0xb9, 0x59, 0x10, 0x00, 0xb9, + 0x41, 0x08, 0x00, 0xb9, 0x63, 0x02, 0x00, 0x39, 0xf5, 0x5b, 0x42, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0x7f, 0x1a, 0x00, 0xb9, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xdd, 0xa1, 0xff, 0x17, 0x23, 0x00, 0x02, 0xaa, + 0x7f, 0x08, 0x40, 0xf2, 0x60, 0x00, 0x00, 0x54, 0x40, 0x21, 0x87, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x44, 0x88, 0x43, 0xd3, 0x03, 0x60, 0x80, 0x52, + 0x22, 0x00, 0x80, 0x52, 0x94, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x10, 0x00, 0xb4, + 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x03, 0x02, 0xaa, 0xf3, 0x03, 0x00, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, + 0xf6, 0x03, 0x03, 0xaa, 0xf7, 0x1b, 0x00, 0xf9, 0xf7, 0x03, 0x01, 0x2a, + 0xee, 0xfc, 0xff, 0x97, 0x20, 0x05, 0x00, 0x35, 0x60, 0x12, 0x40, 0xf9, + 0x00, 0x18, 0x40, 0xf9, 0x60, 0x05, 0x00, 0xb4, 0x15, 0x30, 0x40, 0xb9, + 0xb5, 0x36, 0x4c, 0xd3, 0xf6, 0x06, 0x00, 0xb4, 0xe0, 0x03, 0x16, 0xaa, + 0x81, 0x02, 0x80, 0xd2, 0x77, 0x39, 0x00, 0x94, 0x60, 0x02, 0x40, 0x39, + 0x40, 0x0e, 0x00, 0x35, 0x62, 0x1e, 0x40, 0xf9, 0xe0, 0x7e, 0x08, 0x53, + 0x1f, 0x00, 0x15, 0x6b, 0xe1, 0x5e, 0x18, 0x12, 0x15, 0x90, 0x95, 0x1a, + 0x40, 0x18, 0x40, 0xf9, 0x35, 0x10, 0x15, 0x2a, 0x00, 0x06, 0x00, 0xb4, + 0xf4, 0x03, 0x00, 0xb4, 0xe0, 0x03, 0x14, 0xaa, 0x81, 0x02, 0x80, 0xd2, + 0x69, 0x39, 0x00, 0x94, 0x62, 0x1e, 0x40, 0xf9, 0xe1, 0x03, 0x15, 0x2a, + 0x80, 0x0e, 0x40, 0x29, 0x42, 0x18, 0x40, 0xf9, 0x84, 0x96, 0x41, 0x29, + 0x42, 0x30, 0x40, 0xb9, 0x0b, 0xfd, 0xff, 0x97, 0x40, 0x01, 0x00, 0x35, + 0x60, 0x12, 0x40, 0xf9, 0x02, 0x18, 0x40, 0xf9, 0xa2, 0x0b, 0x00, 0xb4, + 0x42, 0x30, 0x40, 0xb9, 0xe1, 0x03, 0x15, 0x2a, 0xc0, 0x0e, 0x40, 0x29, + 0xc4, 0x96, 0x41, 0x29, 0x02, 0xfd, 0xff, 0x97, 0xc0, 0x03, 0x00, 0x34, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x1e, 0x40, 0xf9, + 0x00, 0x18, 0x40, 0xf9, 0x80, 0xfa, 0xff, 0xb5, 0x60, 0x20, 0x87, 0x52, + 0xf7, 0xff, 0xff, 0x17, 0x60, 0x12, 0x40, 0xf9, 0x02, 0x18, 0x40, 0xf9, + 0xc2, 0xfd, 0xff, 0xb5, 0xf7, 0x02, 0x00, 0x90, 0xf7, 0xa2, 0x06, 0x91, + 0xe0, 0x03, 0x17, 0xaa, 0x01, 0x00, 0x80, 0x12, 0x97, 0xa1, 0xff, 0x97, + 0xa0, 0x04, 0x00, 0x34, 0xed, 0xff, 0xff, 0x17, 0x80, 0x21, 0x87, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x12, 0x40, 0xf9, + 0x02, 0x18, 0x40, 0xf9, 0xc2, 0xfb, 0xff, 0xb5, 0xf7, 0x02, 0x00, 0x90, + 0xf7, 0xa2, 0x06, 0x91, 0xe0, 0x03, 0x17, 0xaa, 0x01, 0x00, 0x80, 0x12, + 0x87, 0xa1, 0xff, 0x97, 0xc0, 0xfb, 0xff, 0x35, 0x94, 0x02, 0x00, 0xb4, + 0x60, 0x1e, 0x40, 0xf9, 0x00, 0x18, 0x40, 0xf9, 0x20, 0x02, 0x00, 0xb4, + 0x82, 0x06, 0x40, 0x29, 0x43, 0x00, 0x80, 0x52, 0x03, 0x84, 0xa0, 0x72, + 0xe4, 0x03, 0x02, 0x2a, 0x64, 0x22, 0x00, 0xf9, 0x02, 0x04, 0x00, 0xb9, + 0x01, 0x0c, 0x00, 0xb9, 0x82, 0x06, 0x41, 0x29, 0x01, 0x14, 0x00, 0xb9, + 0x61, 0x4a, 0x40, 0xb9, 0x02, 0x10, 0x00, 0xb9, 0x82, 0x12, 0x40, 0xb9, + 0xa1, 0x02, 0x01, 0x2a, 0x02, 0x18, 0x00, 0xb9, 0x21, 0x00, 0x03, 0x2a, + 0x01, 0x08, 0x00, 0xb9, 0x60, 0x12, 0x40, 0xf9, 0x00, 0x18, 0x40, 0xf9, + 0xe0, 0x01, 0x00, 0xb4, 0xc1, 0x0a, 0x40, 0x29, 0xe3, 0x03, 0x01, 0x2a, + 0x63, 0x16, 0x00, 0xf9, 0x01, 0x04, 0x00, 0xb9, 0x02, 0x0c, 0x00, 0xb9, + 0xc2, 0x06, 0x41, 0x29, 0x01, 0x14, 0x00, 0xb9, 0x61, 0x32, 0x40, 0xb9, + 0x02, 0x10, 0x00, 0xb9, 0xc2, 0x12, 0x40, 0xb9, 0xb5, 0x02, 0x01, 0x2a, + 0x02, 0x18, 0x00, 0xb9, 0xb5, 0x02, 0x06, 0x32, 0x15, 0x08, 0x00, 0xb9, + 0x21, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x17, 0xaa, 0x61, 0x02, 0x00, 0x39, + 0x61, 0x42, 0x01, 0x39, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0x7f, 0x1a, 0x00, 0xb9, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0x4b, 0xa1, 0xff, 0x17, 0x60, 0x21, 0x87, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x80, 0x20, 0x87, 0x52, 0xab, 0xff, 0xff, 0x17, 0xf7, 0x02, 0x00, 0x90, + 0xf7, 0xa2, 0x06, 0x91, 0xe0, 0x03, 0x17, 0xaa, 0x01, 0x00, 0x80, 0x12, + 0x4e, 0xa1, 0xff, 0x97, 0x20, 0xf9, 0xff, 0x34, 0xa4, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x02, 0xaa, 0xf4, 0x03, 0x03, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, + 0xf5, 0x03, 0x00, 0xaa, 0x65, 0xff, 0xff, 0x97, 0xa0, 0x00, 0x00, 0x34, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf6, 0x02, 0x00, 0x90, 0xd6, 0xa2, 0x06, 0x91, + 0xe0, 0x03, 0x16, 0xaa, 0x01, 0x00, 0x80, 0x12, 0x37, 0xa1, 0xff, 0x97, + 0xe0, 0xfe, 0xff, 0x35, 0xf3, 0x00, 0x00, 0xb4, 0xa0, 0x1e, 0x40, 0xf9, + 0x00, 0x18, 0x40, 0xf9, 0x80, 0x00, 0x00, 0xb4, 0x01, 0x08, 0x40, 0xb9, + 0x21, 0x00, 0x00, 0x32, 0x01, 0x08, 0x00, 0xb9, 0xf4, 0x00, 0x00, 0xb4, + 0xa0, 0x12, 0x40, 0xf9, 0x00, 0x18, 0x40, 0xf9, 0x80, 0x00, 0x00, 0xb4, + 0x01, 0x08, 0x40, 0xb9, 0x21, 0x00, 0x00, 0x32, 0x01, 0x08, 0x00, 0xb9, + 0xe0, 0x03, 0x16, 0xaa, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0x17, 0xa1, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x0c, 0x00, 0xb4, 0xfd, 0x7b, 0xbb, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0xf6, 0x03, 0x02, 0xaa, + 0xf5, 0x03, 0x00, 0xaa, 0xf7, 0x63, 0x03, 0xa9, 0xf7, 0x03, 0x01, 0xaa, + 0xf8, 0x03, 0x04, 0x2a, 0xf9, 0x6b, 0x04, 0xa9, 0xf9, 0x03, 0x03, 0x2a, + 0xfa, 0x03, 0x05, 0x2a, 0x30, 0xfc, 0xff, 0x97, 0x60, 0x08, 0x00, 0x35, + 0xa0, 0x12, 0x40, 0xf9, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x06, 0x2a, + 0x00, 0x18, 0x40, 0xf9, 0x60, 0x08, 0x00, 0xb4, 0xe0, 0x02, 0x16, 0xaa, + 0x40, 0x07, 0x00, 0xb4, 0xa0, 0x02, 0x40, 0x39, 0xa0, 0x09, 0x00, 0x35, + 0x5f, 0x03, 0x00, 0x71, 0xe4, 0x1a, 0x40, 0xfa, 0x80, 0x01, 0x00, 0x54, + 0xf3, 0x03, 0x17, 0xaa, 0x1f, 0x20, 0x03, 0xd5, 0xe0, 0x03, 0x13, 0xaa, + 0x81, 0x03, 0x80, 0xd2, 0xb1, 0x38, 0x00, 0x94, 0x73, 0x02, 0x40, 0xb9, + 0x5a, 0x07, 0x00, 0x51, 0x7f, 0x02, 0x00, 0x71, 0xf3, 0x03, 0x13, 0x2a, + 0x44, 0x1b, 0x40, 0x7a, 0x01, 0xff, 0xff, 0x54, 0x9f, 0x02, 0x00, 0x71, + 0xc4, 0x1a, 0x40, 0xfa, 0x80, 0x01, 0x00, 0x54, 0xf3, 0x03, 0x16, 0xaa, + 0x1f, 0x20, 0x03, 0xd5, 0xe0, 0x03, 0x13, 0xaa, 0x81, 0x03, 0x80, 0xd2, + 0xa3, 0x38, 0x00, 0x94, 0x73, 0x02, 0x40, 0xb9, 0x94, 0x06, 0x00, 0x51, + 0x7f, 0x02, 0x00, 0x71, 0xf3, 0x03, 0x13, 0x2a, 0x84, 0x1a, 0x40, 0x7a, + 0x01, 0xff, 0xff, 0x54, 0xf3, 0x02, 0x00, 0x90, 0x73, 0xa2, 0x06, 0x91, + 0xe0, 0x03, 0x13, 0xaa, 0x01, 0x00, 0x80, 0x12, 0xe9, 0xa0, 0xff, 0x97, + 0x60, 0x04, 0x00, 0x35, 0xa0, 0x1e, 0x40, 0xf9, 0x00, 0x18, 0x40, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0x17, 0x00, 0x00, 0xb9, 0x19, 0x08, 0x00, 0xb9, + 0xa0, 0x12, 0x40, 0xf9, 0x00, 0x18, 0x40, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0x16, 0x00, 0x00, 0xb9, 0x18, 0x08, 0x00, 0xb9, 0x20, 0x00, 0x80, 0x52, + 0xa0, 0x02, 0x00, 0x39, 0xbf, 0x42, 0x01, 0x39, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xa0, 0x1a, 0x00, 0xb9, 0xe0, 0x03, 0x13, 0xaa, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc7, 0xa0, 0xff, 0x17, 0xf3, 0x53, 0x41, 0xa9, 0xa0, 0x21, 0x87, 0x52, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xa0, 0x1e, 0x40, 0xf9, + 0x00, 0x18, 0x40, 0xf9, 0x80, 0xf7, 0xff, 0xb5, 0x60, 0x20, 0x87, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf6, 0xff, 0xff, 0x17, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x21, 0x87, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x80, 0x20, 0x87, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xeb, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x04, 0x00, 0xb4, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0xcf, 0xfb, 0xff, 0x97, + 0xc0, 0x03, 0x00, 0x35, 0x60, 0x12, 0x40, 0xf9, 0x00, 0x18, 0x40, 0xf9, + 0xe0, 0x02, 0x00, 0xb4, 0xf4, 0x02, 0x00, 0x90, 0x94, 0xa2, 0x06, 0x91, + 0xe0, 0x03, 0x14, 0xaa, 0x01, 0x00, 0x80, 0x12, 0xaa, 0xa0, 0xff, 0x97, + 0xa0, 0x02, 0x00, 0x35, 0x60, 0x1e, 0x40, 0xf9, 0x62, 0x12, 0x40, 0xf9, + 0x00, 0x18, 0x40, 0xf9, 0x80, 0x00, 0x00, 0xb4, 0x01, 0x08, 0x40, 0xb9, + 0x21, 0x00, 0x00, 0x32, 0x01, 0x08, 0x00, 0xb9, 0x40, 0x18, 0x40, 0xf9, + 0x80, 0x00, 0x00, 0xb4, 0x01, 0x08, 0x40, 0xb9, 0x21, 0x00, 0x00, 0x32, + 0x01, 0x08, 0x00, 0xb9, 0xe0, 0x03, 0x14, 0xaa, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0x8d, 0xa0, 0xff, 0x17, 0x60, 0x1e, 0x40, 0xf9, + 0x00, 0x18, 0x40, 0xf9, 0x00, 0xfd, 0xff, 0xb5, 0x60, 0x20, 0x87, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x21, 0x87, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x1c, 0x00, 0x12, + 0x47, 0x1c, 0x00, 0x12, 0xe6, 0x03, 0x00, 0xaa, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xc7, 0xfb, 0xff, 0x97, 0xc0, 0x01, 0x00, 0x35, + 0xc1, 0x00, 0x40, 0xf9, 0x21, 0x1c, 0x40, 0xf9, 0xa1, 0x01, 0x00, 0xb4, + 0xc1, 0x10, 0x40, 0xb9, 0x1f, 0x01, 0x00, 0x71, 0x22, 0x00, 0x11, 0x32, + 0x21, 0x78, 0x10, 0x12, 0x21, 0x00, 0x82, 0x1a, 0xff, 0x00, 0x00, 0x71, + 0x22, 0x78, 0x07, 0x12, 0x21, 0x00, 0x08, 0x32, 0x21, 0x10, 0x82, 0x1a, + 0xc1, 0x10, 0x00, 0xb9, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x20, 0x87, 0x52, 0xfd, 0xff, 0xff, 0x17, 0x1f, 0x00, 0x00, 0xf1, + 0x24, 0x18, 0x40, 0xfa, 0x40, 0x00, 0x00, 0x54, 0xdd, 0xfb, 0xff, 0x17, + 0x40, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe6, 0x03, 0x01, 0xaa, 0xe7, 0x03, 0x00, 0xaa, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xa8, 0xfb, 0xff, 0x97, + 0xa0, 0x00, 0x00, 0x35, 0xc6, 0x00, 0x00, 0xb4, 0xe1, 0x00, 0x40, 0xf9, + 0x21, 0x40, 0x40, 0xb9, 0xc1, 0x00, 0x00, 0xb9, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, 0xfd, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x2a, + 0x22, 0x01, 0x00, 0xd0, 0x42, 0xc0, 0x1d, 0x91, 0x21, 0x01, 0x00, 0xd0, + 0x21, 0x80, 0x1d, 0x91, 0xff, 0x43, 0x00, 0xd1, 0x42, 0x78, 0x60, 0xf8, + 0x21, 0x78, 0x60, 0xf8, 0x42, 0x30, 0x00, 0x91, 0x1f, 0x20, 0x03, 0xd5, + 0x40, 0x00, 0x40, 0xb9, 0x00, 0x20, 0x00, 0x12, 0xe0, 0x0f, 0x00, 0xb9, + 0xe0, 0x0f, 0x40, 0xb9, 0x80, 0xff, 0xff, 0x35, 0x21, 0x20, 0x00, 0x91, + 0x20, 0x00, 0x40, 0xb9, 0x00, 0x1c, 0x47, 0xd3, 0xe0, 0x0f, 0x00, 0xb9, + 0xe0, 0x0f, 0x40, 0xb9, 0x1f, 0x04, 0x00, 0x71, 0x61, 0xff, 0xff, 0x54, + 0xff, 0x43, 0x00, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbc, 0xa9, + 0x21, 0x01, 0x00, 0xd0, 0x21, 0x80, 0x1d, 0x91, 0xfd, 0x03, 0x00, 0x91, + 0xf7, 0x63, 0x03, 0xa9, 0xf7, 0x03, 0x00, 0x2a, 0xf3, 0x53, 0x01, 0xa9, + 0x13, 0x01, 0x80, 0x52, 0x34, 0x78, 0x77, 0xf8, 0xf5, 0x5b, 0x02, 0xa9, + 0xd6, 0x01, 0x00, 0xf0, 0xc0, 0x42, 0x01, 0x91, 0x16, 0x19, 0x80, 0xd2, + 0x81, 0x0a, 0x40, 0xb9, 0xf5, 0x03, 0x17, 0xaa, 0x98, 0x22, 0x00, 0x91, + 0xf6, 0x02, 0x16, 0x9b, 0x1f, 0x20, 0x03, 0xd5, 0x21, 0x01, 0x00, 0x36, + 0x81, 0x22, 0x40, 0xb9, 0xe0, 0x03, 0x15, 0x2a, 0xc2, 0x06, 0x40, 0xf9, + 0x42, 0x00, 0x00, 0xb4, 0x40, 0x00, 0x3f, 0xd6, 0x01, 0x03, 0x40, 0xb9, + 0x73, 0x06, 0x00, 0x71, 0x01, 0xff, 0xff, 0x54, 0x20, 0x00, 0x1f, 0x12, + 0x01, 0x01, 0x08, 0x36, 0xe4, 0xee, 0x7c, 0xd3, 0xe2, 0x02, 0x00, 0x90, + 0x42, 0x20, 0x08, 0x91, 0x40, 0x00, 0x80, 0x52, 0x43, 0x68, 0x64, 0xb8, + 0x63, 0x04, 0x00, 0x11, 0x43, 0x68, 0x24, 0xb8, 0x01, 0x01, 0x10, 0x36, + 0xe2, 0x02, 0x00, 0x90, 0x42, 0x20, 0x08, 0x91, 0x42, 0x10, 0x17, 0x8b, + 0x00, 0x00, 0x1e, 0x32, 0x43, 0x04, 0x40, 0xb9, 0x63, 0x04, 0x00, 0x11, + 0x43, 0x04, 0x00, 0xb9, 0x01, 0x01, 0x18, 0x36, 0xe2, 0x02, 0x00, 0x90, + 0x42, 0x20, 0x08, 0x91, 0x42, 0x10, 0x17, 0x8b, 0x00, 0x00, 0x1d, 0x32, + 0x43, 0x08, 0x40, 0xb9, 0x63, 0x04, 0x00, 0x11, 0x43, 0x08, 0x00, 0xb9, + 0x01, 0x01, 0x20, 0x36, 0xe1, 0x02, 0x00, 0x90, 0x21, 0x20, 0x08, 0x91, + 0x37, 0x10, 0x17, 0x8b, 0x00, 0x00, 0x1c, 0x32, 0xe1, 0x0e, 0x40, 0xb9, + 0x21, 0x04, 0x00, 0x11, 0xe1, 0x0e, 0x00, 0xb9, 0x81, 0x0a, 0x40, 0xb9, + 0xf5, 0x5b, 0x42, 0xa9, 0x20, 0x00, 0x20, 0x0a, 0xf7, 0x63, 0x43, 0xa9, + 0x80, 0x0a, 0x00, 0xb9, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x80, 0x52, 0xbb, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x80, 0x52, + 0xb7, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0x01, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0xd3, 0x01, 0x00, 0xf0, 0x73, 0x42, 0x01, 0x91, + 0x73, 0xa2, 0x00, 0x91, 0xe0, 0x03, 0x13, 0xaa, 0xbc, 0x9f, 0xff, 0x97, + 0xe0, 0x03, 0x13, 0xaa, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xac, 0x9f, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0x01, 0x00, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0xd3, 0x01, 0x00, 0xf0, + 0x73, 0x42, 0x01, 0x91, 0x73, 0xc2, 0x03, 0x91, 0xe0, 0x03, 0x13, 0xaa, + 0xac, 0x9f, 0xff, 0x97, 0xe0, 0x03, 0x13, 0xaa, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0x9c, 0x9f, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xba, 0xa9, + 0x1f, 0x04, 0x00, 0x71, 0xfd, 0x03, 0x00, 0x91, 0xff, 0x5f, 0x00, 0xb9, + 0x89, 0x00, 0x00, 0x54, 0x20, 0x60, 0x86, 0x52, 0xfd, 0x7b, 0xc6, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0x2a, + 0xe0, 0x73, 0x01, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0xf6, 0x03, 0x01, 0xaa, + 0xf7, 0x63, 0x03, 0xa9, 0x32, 0x30, 0x00, 0x94, 0xe1, 0x03, 0x00, 0x2a, + 0x40, 0x60, 0x86, 0x52, 0x21, 0x07, 0x00, 0x35, 0xe2, 0x5f, 0x40, 0xb9, + 0xa3, 0x78, 0x96, 0x52, 0x43, 0x34, 0xb2, 0x72, 0xe1, 0x3f, 0x98, 0x52, + 0x21, 0x00, 0xa0, 0x72, 0x5f, 0x00, 0x01, 0x6b, 0x43, 0x7c, 0xa3, 0x9b, + 0x63, 0xfc, 0x70, 0xd3, 0x09, 0x06, 0x00, 0x54, 0xf8, 0x03, 0x13, 0x2a, + 0x20, 0x01, 0x00, 0xd0, 0x00, 0x80, 0x1d, 0x91, 0x15, 0x19, 0x80, 0xd2, + 0x7f, 0x02, 0x00, 0x71, 0x63, 0x00, 0x01, 0x32, 0x15, 0x7f, 0x15, 0x9b, + 0x05, 0x60, 0x80, 0x52, 0x05, 0x00, 0xa4, 0x72, 0xc2, 0x01, 0x00, 0xf0, + 0x42, 0xc0, 0x07, 0x91, 0xc1, 0x01, 0x00, 0xf0, 0x21, 0x80, 0x07, 0x91, + 0xd7, 0x01, 0x00, 0xf0, 0xf7, 0x42, 0x01, 0x91, 0x21, 0x00, 0x82, 0x9a, + 0x14, 0x78, 0x78, 0xf8, 0xa0, 0xa2, 0x00, 0x91, 0xe0, 0x02, 0x00, 0x8b, + 0x22, 0x00, 0x80, 0x52, 0x84, 0x06, 0x40, 0xb9, 0x84, 0x78, 0x1f, 0x12, + 0x84, 0x06, 0x00, 0xb9, 0x85, 0x06, 0x00, 0xb9, 0x83, 0x12, 0x00, 0xb9, + 0x4c, 0x9f, 0xff, 0x97, 0xe1, 0x03, 0x00, 0x2a, 0x60, 0x60, 0x86, 0x52, + 0x61, 0x02, 0x00, 0x35, 0xf5, 0x02, 0x15, 0x8b, 0x24, 0x01, 0x00, 0xd0, + 0x84, 0xc0, 0x1d, 0x91, 0x02, 0x10, 0x80, 0x52, 0x01, 0x00, 0x80, 0x52, + 0xa0, 0x22, 0x40, 0xb9, 0xa3, 0x0a, 0x40, 0xf9, 0xf9, 0x23, 0x00, 0xf9, + 0x99, 0x78, 0x78, 0xf8, 0x07, 0x34, 0x00, 0x94, 0xa0, 0x01, 0x00, 0x34, + 0xa0, 0x60, 0x86, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc6, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xa0, 0x26, 0x40, 0xb9, 0x02, 0x10, 0x80, 0x52, 0xa3, 0x0e, 0x40, 0xf9, + 0x01, 0x00, 0x80, 0x52, 0xf5, 0x33, 0x00, 0x94, 0xe0, 0xfd, 0xff, 0x35, + 0x20, 0x00, 0x80, 0x52, 0x20, 0x0b, 0x00, 0xb9, 0xe0, 0x30, 0x80, 0x52, + 0x80, 0x1a, 0x00, 0xb9, 0x56, 0x00, 0x00, 0xb4, 0xb6, 0x06, 0x00, 0xf9, + 0x02, 0xef, 0x7c, 0xd3, 0xe1, 0x02, 0x00, 0x90, 0x21, 0x20, 0x08, 0x91, + 0xe0, 0x03, 0x13, 0x2a, 0x23, 0x00, 0x02, 0x8b, 0x3f, 0x68, 0x22, 0xf8, + 0x7f, 0x04, 0x00, 0xf9, 0x82, 0x06, 0x40, 0xb9, 0xe1, 0x03, 0x22, 0x2a, + 0x21, 0x00, 0x00, 0x12, 0x21, 0x00, 0x02, 0x4a, 0x81, 0x06, 0x00, 0xb9, + 0x15, 0xff, 0xff, 0x97, 0x00, 0x19, 0x80, 0xd2, 0x21, 0x07, 0x40, 0xb9, + 0x18, 0x7f, 0x00, 0x9b, 0xf3, 0x02, 0x18, 0x8b, 0x60, 0x26, 0x40, 0xb9, + 0x17, 0x35, 0x00, 0x94, 0x60, 0x26, 0x40, 0xb9, 0x81, 0x34, 0x00, 0x94, + 0xe0, 0x00, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc6, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x22, 0x40, 0xb9, 0x0c, 0x35, 0x00, 0x94, + 0x60, 0x22, 0x40, 0xb9, 0x76, 0x34, 0x00, 0x94, 0xc0, 0xfe, 0xff, 0x35, + 0x21, 0x00, 0x80, 0x52, 0xe1, 0x6a, 0x38, 0x38, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, + 0x84, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x04, 0x00, 0x71, + 0x48, 0x06, 0x00, 0x54, 0xfd, 0x7b, 0xbb, 0xa9, 0xe0, 0x03, 0x00, 0x2a, + 0xc3, 0x60, 0x86, 0x52, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x14, 0x19, 0x80, 0xd2, 0x33, 0x1c, 0x00, 0x12, 0x14, 0x7c, 0x14, 0x9b, + 0xc1, 0x01, 0x00, 0xf0, 0x21, 0x40, 0x01, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0x55, 0x1c, 0x00, 0x12, 0x22, 0x68, 0x74, 0x38, 0xc2, 0x00, 0x00, 0x35, + 0xe0, 0x03, 0x03, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x22, 0x01, 0x00, 0xd0, + 0x42, 0xc0, 0x1d, 0x91, 0xf7, 0x1b, 0x00, 0xf9, 0x94, 0xa2, 0x00, 0x91, + 0x34, 0x00, 0x14, 0x8b, 0x57, 0x78, 0x60, 0xf8, 0xf6, 0x12, 0x00, 0x91, + 0x06, 0x00, 0x00, 0x14, 0x35, 0x03, 0x00, 0x34, 0x02, 0x9f, 0xff, 0x97, + 0x1f, 0x10, 0x08, 0x71, 0x04, 0x18, 0x40, 0x7a, 0x81, 0x03, 0x00, 0x54, + 0xc3, 0x02, 0x40, 0xb9, 0xe0, 0x03, 0x14, 0xaa, 0x01, 0x00, 0x80, 0x12, + 0x63, 0x0c, 0x43, 0xd3, 0xe3, 0x4f, 0x00, 0xb9, 0xe3, 0x4f, 0x40, 0xb9, + 0xa3, 0xfe, 0xff, 0x35, 0xe0, 0x02, 0x40, 0xb9, 0xf5, 0x5b, 0x42, 0xa9, + 0x00, 0x5c, 0x18, 0x12, 0x13, 0x00, 0x13, 0x2a, 0xf3, 0x02, 0x00, 0xb9, + 0xe0, 0x03, 0x03, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x23, 0x60, 0x86, 0x52, + 0xe0, 0x03, 0x03, 0x2a, 0xc0, 0x03, 0x5f, 0xd6, 0xe3, 0x60, 0x86, 0x52, + 0xe0, 0x03, 0x03, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x03, 0x61, 0x86, 0x52, 0xf7, 0x1b, 0x40, 0xf9, 0xd1, 0xff, 0xff, 0x17, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xb0, 0x01, 0x90, 0x41, 0xf9, + 0x00, 0x00, 0x80, 0x52, 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0xb0, 0x01, 0x94, 0x41, 0xf9, 0x20, 0x00, 0x80, 0x52, + 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xb0, + 0x01, 0x98, 0x41, 0xf9, 0x40, 0x00, 0x80, 0x52, 0xf0, 0x03, 0x01, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xb0, 0x01, 0x9c, 0x41, 0xf9, + 0x60, 0x00, 0x80, 0x52, 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0xb0, 0x01, 0xa0, 0x41, 0xf9, 0x80, 0x00, 0x80, 0x52, + 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xb0, + 0x01, 0xa4, 0x41, 0xf9, 0xa0, 0x00, 0x80, 0x52, 0xf0, 0x03, 0x01, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xb0, 0x01, 0xa8, 0x41, 0xf9, + 0xc0, 0x00, 0x80, 0x52, 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x90, 0x01, 0xac, 0x41, 0xf9, 0xe0, 0x00, 0x80, 0x52, + 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x90, + 0x01, 0xb0, 0x41, 0xf9, 0x00, 0x01, 0x80, 0x52, 0xf0, 0x03, 0x01, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x90, 0x01, 0xb4, 0x41, 0xf9, + 0x20, 0x01, 0x80, 0x52, 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x90, 0x01, 0xb8, 0x41, 0xf9, 0x40, 0x01, 0x80, 0x52, + 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x90, + 0x01, 0xbc, 0x41, 0xf9, 0x60, 0x01, 0x80, 0x52, 0xf0, 0x03, 0x01, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x90, 0x01, 0xc0, 0x41, 0xf9, + 0x80, 0x01, 0x80, 0x52, 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x90, 0x01, 0xc4, 0x41, 0xf9, 0xa0, 0x01, 0x80, 0x52, + 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x90, + 0x01, 0xc8, 0x41, 0xf9, 0xc0, 0x01, 0x80, 0x52, 0xf0, 0x03, 0x01, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x90, 0x01, 0xcc, 0x41, 0xf9, + 0xe0, 0x01, 0x80, 0x52, 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x90, 0x01, 0xd0, 0x41, 0xf9, 0x00, 0x02, 0x80, 0x52, + 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x90, + 0x01, 0xd4, 0x41, 0xf9, 0x20, 0x02, 0x80, 0x52, 0xf0, 0x03, 0x01, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x90, 0x01, 0xd8, 0x41, 0xf9, + 0x40, 0x02, 0x80, 0x52, 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x90, 0x01, 0xdc, 0x41, 0xf9, 0x60, 0x02, 0x80, 0x52, + 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x90, + 0x01, 0xe0, 0x41, 0xf9, 0x80, 0x02, 0x80, 0x52, 0xf0, 0x03, 0x01, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x90, 0x01, 0xe4, 0x41, 0xf9, + 0xa0, 0x02, 0x80, 0x52, 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x90, 0x01, 0xe8, 0x41, 0xf9, 0xc0, 0x02, 0x80, 0x52, + 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x90, + 0x01, 0xec, 0x41, 0xf9, 0xe0, 0x02, 0x80, 0x52, 0xf0, 0x03, 0x01, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x90, 0x01, 0xf0, 0x41, 0xf9, + 0x00, 0x03, 0x80, 0x52, 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x90, 0x01, 0xf4, 0x41, 0xf9, 0x20, 0x03, 0x80, 0x52, + 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x90, + 0x01, 0xf8, 0x41, 0xf9, 0x40, 0x03, 0x80, 0x52, 0xf0, 0x03, 0x01, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x90, 0x01, 0xfc, 0x41, 0xf9, + 0x60, 0x03, 0x80, 0x52, 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x90, 0x01, 0x00, 0x42, 0xf9, 0x80, 0x03, 0x80, 0x52, + 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x90, + 0x01, 0x04, 0x42, 0xf9, 0xa0, 0x03, 0x80, 0x52, 0xf0, 0x03, 0x01, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x90, 0x01, 0x08, 0x42, 0xf9, + 0xc0, 0x03, 0x80, 0x52, 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x90, 0x01, 0x0c, 0x42, 0xf9, 0xe0, 0x03, 0x80, 0x52, + 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x0b, + 0x03, 0x20, 0x80, 0xd2, 0x03, 0xa4, 0xa9, 0xf2, 0x62, 0x78, 0x20, 0xb8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0xa4, 0xa9, 0xd2, 0x41, 0x00, 0x40, 0xb9, + 0x01, 0x00, 0x00, 0x33, 0x41, 0x00, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0xa4, 0xa9, 0xd2, 0x41, 0x00, 0x40, 0xb9, 0x01, 0x00, 0x1c, 0x33, + 0x41, 0x00, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x03, 0x00, 0x2a, + 0x21, 0x3c, 0x00, 0x12, 0x5f, 0x3c, 0x00, 0x71, 0x20, 0x00, 0x80, 0x52, + 0xa8, 0x01, 0x00, 0x54, 0x3f, 0x0c, 0x40, 0xf2, 0x20, 0x00, 0x80, 0x52, + 0x41, 0x01, 0x00, 0x54, 0x04, 0x16, 0x80, 0xd2, 0x04, 0xa4, 0xa9, 0xf2, + 0x21, 0x2c, 0x1c, 0x12, 0x00, 0x00, 0x80, 0x52, 0x83, 0x78, 0x62, 0xb8, + 0x63, 0x4c, 0x10, 0x12, 0x21, 0x00, 0x03, 0x2a, 0x21, 0x00, 0x08, 0x32, + 0x81, 0x78, 0x22, 0xb8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0xa4, 0xa9, 0xd2, 0x41, 0x00, 0x40, 0xb9, + 0x01, 0x00, 0x08, 0x33, 0x41, 0x00, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0xb4, 0x02, 0xa6, 0xa1, 0x52, 0x02, 0x00, 0x00, 0xb9, + 0x61, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x90, 0x52, 0x20, 0x00, 0x00, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0xf1, + 0x02, 0x18, 0x5f, 0x7a, 0x69, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbe, 0xa9, 0xe2, 0x03, 0x00, 0x2a, + 0x03, 0x10, 0x00, 0x90, 0x63, 0x80, 0x0c, 0x91, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0x13, 0x40, 0x05, 0x11, 0xe0, 0x03, 0x13, 0x2a, + 0x61, 0x58, 0x22, 0xf8, 0x72, 0x33, 0x00, 0x94, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xda, 0x32, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0x7c, 0x00, 0x71, 0x69, 0x00, 0x00, 0x54, + 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0x2a, + 0x00, 0x40, 0x05, 0x11, 0x0b, 0x33, 0x00, 0x94, 0x01, 0x10, 0x00, 0x90, + 0x21, 0x80, 0x0c, 0x91, 0xe2, 0xff, 0xff, 0xf0, 0x42, 0x80, 0x3c, 0x91, + 0x22, 0x58, 0x33, 0xf8, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x09, 0x1c, 0x00, 0x72, 0x20, 0x00, 0x80, 0x52, 0x42, 0x18, 0x48, 0x7a, + 0x08, 0x05, 0x00, 0x54, 0x25, 0x01, 0x00, 0xb0, 0xa5, 0x60, 0x1c, 0x91, + 0x4c, 0x6c, 0x1c, 0x53, 0x4b, 0x5c, 0x18, 0x53, 0x4a, 0x4c, 0x14, 0x53, + 0x24, 0x00, 0x80, 0xd2, 0x09, 0x00, 0x00, 0x14, 0x67, 0x84, 0x40, 0xb9, + 0xe6, 0x00, 0x0b, 0x4a, 0xc6, 0x0c, 0x18, 0x12, 0xc6, 0x00, 0x07, 0x4a, + 0x66, 0x84, 0x00, 0xb9, 0x84, 0x04, 0x00, 0x91, 0x1f, 0x1d, 0x00, 0x71, + 0x08, 0x03, 0x00, 0x54, 0x83, 0x04, 0x00, 0x51, 0x88, 0x1c, 0x00, 0x12, + 0x23, 0x25, 0xc3, 0x1a, 0x60, 0x00, 0x00, 0x12, 0x23, 0xff, 0x07, 0x36, + 0x3f, 0x08, 0x00, 0x71, 0xa3, 0x78, 0x64, 0xf8, 0x40, 0x03, 0x00, 0x54, + 0x28, 0x02, 0x00, 0x54, 0xe1, 0xfd, 0xff, 0x35, 0x67, 0x84, 0x40, 0xb9, + 0x5f, 0x20, 0x00, 0x71, 0xe6, 0x00, 0x0a, 0x4a, 0xc6, 0x0c, 0x14, 0x12, + 0xc6, 0x00, 0x07, 0x4a, 0x66, 0x84, 0x00, 0xb9, 0x66, 0x88, 0x40, 0xb9, + 0x80, 0x02, 0x00, 0x54, 0xc6, 0x78, 0x1f, 0x12, 0x66, 0x88, 0x00, 0xb9, + 0x84, 0x04, 0x00, 0x91, 0x1f, 0x1d, 0x00, 0x71, 0x49, 0xfd, 0xff, 0x54, + 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x3f, 0x0c, 0x00, 0x71, + 0xc1, 0xff, 0xff, 0x54, 0x67, 0x84, 0x40, 0xb9, 0xe6, 0x00, 0x0c, 0x4a, + 0xc6, 0x0c, 0x1c, 0x12, 0xc6, 0x00, 0x07, 0x4a, 0x66, 0x84, 0x00, 0xb9, + 0xdd, 0xff, 0xff, 0x17, 0x66, 0x84, 0x40, 0xb9, 0x46, 0x0c, 0x00, 0x33, + 0x66, 0x84, 0x00, 0xb9, 0xd9, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x26, 0x2a, + 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x06, 0x4a, 0x60, 0x88, 0x00, 0xb9, + 0xd4, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0x21, 0x01, 0x00, 0x90, + 0xc0, 0x02, 0x00, 0xf0, 0xfd, 0x03, 0x00, 0x91, 0x21, 0x20, 0x28, 0x91, + 0x00, 0xa0, 0x08, 0x91, 0x3e, 0x9d, 0xff, 0x97, 0x20, 0x03, 0x00, 0x35, + 0xe3, 0xff, 0xff, 0xf0, 0x63, 0xc0, 0x3c, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0xff, 0xff, 0xf0, 0x94, 0x82, 0x3c, 0x91, 0x13, 0x00, 0x80, 0xd2, + 0xf5, 0x5b, 0x02, 0xa9, 0x15, 0x10, 0x00, 0x90, 0xb5, 0x82, 0x0c, 0x91, + 0x36, 0x01, 0x00, 0x90, 0xd6, 0xa2, 0x28, 0x91, 0x04, 0x00, 0x00, 0x14, + 0x7f, 0x82, 0x00, 0xf1, 0xa0, 0x01, 0x00, 0x54, 0xc3, 0x7a, 0x73, 0xf8, + 0x60, 0x42, 0x05, 0x11, 0x02, 0x04, 0x80, 0x52, 0x01, 0x00, 0x80, 0x52, + 0xb4, 0x7a, 0x33, 0xf8, 0x73, 0x06, 0x00, 0x91, 0xc0, 0x31, 0x00, 0x94, + 0xe0, 0xfe, 0xff, 0x34, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x01, 0x00, 0x80, 0x52, + 0x02, 0x01, 0x80, 0x52, 0x00, 0x00, 0x80, 0x12, 0x9b, 0xff, 0xff, 0x97, + 0x01, 0x00, 0x80, 0xd2, 0xe0, 0xfe, 0xff, 0x35, 0x25, 0x01, 0x00, 0xb0, + 0xa5, 0x80, 0x1c, 0x91, 0xe4, 0x1f, 0x80, 0x52, 0x1f, 0x20, 0x03, 0xd5, + 0x82, 0x24, 0xc1, 0x1a, 0xc2, 0x00, 0x00, 0x36, 0xa3, 0x78, 0x61, 0xf8, + 0x62, 0x84, 0x40, 0xb9, 0x42, 0x6c, 0x14, 0x12, 0x42, 0x00, 0x15, 0x32, + 0x62, 0x84, 0x00, 0xb9, 0x21, 0x04, 0x00, 0x91, 0x3f, 0x20, 0x00, 0xf1, + 0xe1, 0xfe, 0xff, 0x54, 0x25, 0x01, 0x00, 0xb0, 0xa5, 0x80, 0x1c, 0x91, + 0x01, 0x00, 0x80, 0xd2, 0xe4, 0x1f, 0x80, 0x52, 0x82, 0x24, 0xc1, 0x1a, + 0xc2, 0x00, 0x00, 0x36, 0xa3, 0x78, 0x61, 0xf8, 0x62, 0x84, 0x40, 0xb9, + 0x42, 0x6c, 0x1c, 0x12, 0x42, 0x00, 0x1d, 0x32, 0x62, 0x84, 0x00, 0xb9, + 0x21, 0x04, 0x00, 0x91, 0x3f, 0x20, 0x00, 0xf1, 0xe1, 0xfe, 0xff, 0x54, + 0x25, 0x01, 0x00, 0xb0, 0xa5, 0x80, 0x1c, 0x91, 0x01, 0x00, 0x80, 0xd2, + 0xe4, 0x1f, 0x80, 0x52, 0x82, 0x24, 0xc1, 0x1a, 0xc2, 0x00, 0x00, 0x36, + 0xa3, 0x78, 0x61, 0xf8, 0x62, 0x84, 0x40, 0xb9, 0x42, 0x6c, 0x18, 0x12, + 0x42, 0x00, 0x19, 0x32, 0x62, 0x84, 0x00, 0xb9, 0x21, 0x04, 0x00, 0x91, + 0x3f, 0x20, 0x00, 0xf1, 0xe1, 0xfe, 0xff, 0x54, 0x21, 0x01, 0x00, 0xb0, + 0x22, 0x40, 0x0d, 0x91, 0xf3, 0x53, 0x41, 0xa9, 0x23, 0xa8, 0x41, 0xf9, + 0x42, 0x04, 0x40, 0xf9, 0x61, 0x28, 0x41, 0xb9, 0xf5, 0x5b, 0x42, 0xa9, + 0x21, 0x6c, 0x1c, 0x12, 0x61, 0x28, 0x01, 0xb9, 0x41, 0x28, 0x41, 0xb9, + 0x21, 0x6c, 0x1c, 0x12, 0x41, 0x28, 0x01, 0xb9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x1c, 0x00, 0x72, 0x42, 0x1c, 0x00, 0x12, + 0x22, 0x18, 0x4a, 0x7a, 0xe8, 0x07, 0x00, 0x54, 0x85, 0x05, 0x80, 0x52, + 0x28, 0x01, 0x00, 0xb0, 0x08, 0x81, 0x0d, 0x91, 0x29, 0x01, 0x00, 0xb0, + 0x29, 0x81, 0x12, 0x91, 0x25, 0x7c, 0x05, 0x1b, 0x4a, 0x0c, 0x04, 0x53, + 0x03, 0x00, 0x80, 0xd2, 0xa5, 0x60, 0x01, 0x51, 0x0b, 0xa0, 0x9f, 0x52, + 0xac, 0x1f, 0x80, 0x52, 0x1f, 0x20, 0x03, 0xd5, 0x04, 0x24, 0xc3, 0x1a, + 0xe4, 0x01, 0x00, 0x36, 0x3f, 0x04, 0x00, 0x71, 0x49, 0x02, 0x00, 0x54, + 0x06, 0x79, 0x63, 0xf8, 0x7f, 0x0c, 0x00, 0xf1, 0xa4, 0x68, 0x66, 0xb8, + 0x84, 0x70, 0x00, 0x12, 0x49, 0x00, 0x00, 0x54, 0x84, 0x00, 0x03, 0x32, + 0xa4, 0x68, 0x26, 0xb8, 0xa7, 0x68, 0x66, 0xb8, 0xe4, 0x00, 0x0a, 0x4a, + 0x84, 0x00, 0x04, 0x12, 0x84, 0x00, 0x07, 0x4a, 0xa4, 0x68, 0x26, 0xb8, + 0x64, 0x1c, 0x00, 0x12, 0x9f, 0x1c, 0x00, 0x71, 0xc0, 0x03, 0x00, 0x54, + 0x63, 0x04, 0x00, 0x91, 0xec, 0xff, 0xff, 0x17, 0x24, 0x79, 0x63, 0xf8, + 0xa2, 0x01, 0x00, 0x34, 0x86, 0x34, 0x40, 0xb9, 0x7f, 0x0c, 0x00, 0xf1, + 0xc6, 0x5c, 0x10, 0x12, 0x48, 0x03, 0x00, 0x54, 0xc6, 0x18, 0x17, 0x32, + 0x86, 0x34, 0x00, 0xb9, 0x63, 0x04, 0x00, 0x91, 0x86, 0x34, 0x40, 0xb9, + 0xc6, 0x5c, 0x18, 0x12, 0xc6, 0x18, 0x1f, 0x32, 0x86, 0x34, 0x00, 0xb9, + 0xde, 0xff, 0xff, 0x17, 0x87, 0x34, 0x40, 0xb9, 0xe6, 0x03, 0x27, 0x2a, + 0xc6, 0x1c, 0x18, 0x12, 0xc6, 0x00, 0x07, 0x4a, 0x86, 0x34, 0x00, 0xb9, + 0x87, 0x34, 0x40, 0xb9, 0xe6, 0x03, 0x27, 0x2a, 0xc6, 0x1c, 0x00, 0x12, + 0xc6, 0x00, 0x07, 0x4a, 0x86, 0x34, 0x00, 0xb9, 0x64, 0x1c, 0x00, 0x12, + 0x9f, 0x1c, 0x00, 0x71, 0x81, 0xfc, 0xff, 0x54, 0x00, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0xc6, 0x00, 0x0b, 0x2a, 0x86, 0x34, 0x00, 0xb9, 0x86, 0x34, 0x40, 0xb9, + 0xc6, 0x5c, 0x18, 0x12, 0xc6, 0x00, 0x0c, 0x2a, 0x86, 0x34, 0x00, 0xb9, + 0xd6, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x72, + 0x42, 0x1c, 0x00, 0x12, 0x22, 0x18, 0x4b, 0x7a, 0xa8, 0x09, 0x00, 0x54, + 0x06, 0x05, 0x80, 0x52, 0x2b, 0x01, 0x00, 0xb0, 0x6b, 0x81, 0x13, 0x91, + 0x2c, 0x01, 0x00, 0xb0, 0x8c, 0x41, 0x0d, 0x91, 0x26, 0x7c, 0x06, 0x1b, + 0x29, 0x01, 0x00, 0xb0, 0x29, 0x81, 0x1c, 0x91, 0x28, 0x01, 0x00, 0xb0, + 0x08, 0x81, 0x18, 0x91, 0xc6, 0xe0, 0x01, 0x51, 0x4d, 0x0c, 0x04, 0x53, + 0x4a, 0x2c, 0x0c, 0x53, 0x03, 0x00, 0x80, 0xd2, 0x2e, 0x00, 0x80, 0x52, + 0x13, 0x00, 0x00, 0x14, 0x25, 0x79, 0x63, 0xf8, 0x67, 0xf0, 0x7d, 0xd3, + 0xa4, 0x84, 0x40, 0xb9, 0x84, 0x6c, 0x1c, 0x12, 0xc2, 0x04, 0x00, 0x34, + 0x7f, 0x0c, 0x00, 0xf1, 0xa9, 0x04, 0x00, 0x54, 0x84, 0x00, 0x00, 0x32, + 0xa4, 0x84, 0x00, 0xb9, 0x05, 0x69, 0x67, 0xf8, 0xa7, 0x24, 0x41, 0xb9, + 0xe4, 0x00, 0x0a, 0x4a, 0x84, 0x00, 0x0c, 0x12, 0x84, 0x00, 0x07, 0x4a, + 0xa4, 0x24, 0x01, 0xb9, 0x63, 0x04, 0x00, 0x91, 0x7f, 0x20, 0x00, 0xf1, + 0xe0, 0x02, 0x00, 0x54, 0x04, 0x24, 0xc3, 0x1a, 0x85, 0x00, 0x00, 0x12, + 0x64, 0xff, 0x07, 0x36, 0x61, 0xfd, 0xff, 0x34, 0x3f, 0x04, 0x00, 0x71, + 0xc0, 0x02, 0x00, 0x54, 0x3f, 0x08, 0x00, 0x71, 0xe0, 0x05, 0x00, 0x54, + 0x65, 0x79, 0x63, 0xf8, 0x7f, 0x0c, 0x00, 0xf1, 0xc4, 0x68, 0x65, 0xb8, + 0x84, 0x70, 0x00, 0x12, 0x08, 0x04, 0x00, 0x54, 0xc4, 0x68, 0x25, 0xb8, + 0xc7, 0x68, 0x65, 0xb8, 0xe4, 0x00, 0x0d, 0x4a, 0x84, 0x00, 0x04, 0x12, + 0x84, 0x00, 0x07, 0x4a, 0xc4, 0x68, 0x25, 0xb8, 0x63, 0x04, 0x00, 0x91, + 0x7f, 0x20, 0x00, 0xf1, 0x61, 0xfd, 0xff, 0x54, 0x00, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x84, 0x00, 0x1d, 0x32, 0xa4, 0x84, 0x00, 0xb9, + 0xdd, 0xff, 0xff, 0x17, 0x25, 0x79, 0x63, 0xf8, 0x67, 0xf0, 0x7d, 0xd3, + 0xa4, 0x84, 0x40, 0xb9, 0x84, 0x6c, 0x18, 0x12, 0xa2, 0x02, 0x00, 0x34, + 0x7f, 0x0c, 0x00, 0xf1, 0x28, 0x05, 0x00, 0x54, 0xa4, 0x84, 0x00, 0xb9, + 0x05, 0x69, 0x67, 0xf8, 0xa7, 0x4c, 0x41, 0xb9, 0xe4, 0x00, 0x0a, 0x4a, + 0x84, 0x00, 0x0c, 0x12, 0x84, 0x00, 0x07, 0x4a, 0xa4, 0x4c, 0x01, 0xb9, + 0xd4, 0xff, 0xff, 0x17, 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x84, 0x00, 0x03, 0x32, 0xc4, 0x68, 0x25, 0xb8, 0xc7, 0x68, 0x65, 0xb8, + 0xe4, 0x00, 0x0d, 0x4a, 0x84, 0x00, 0x04, 0x12, 0x84, 0x00, 0x07, 0x4a, + 0xc4, 0x68, 0x25, 0xb8, 0xe0, 0xff, 0xff, 0x17, 0x84, 0x00, 0x19, 0x32, + 0xed, 0xff, 0xff, 0x17, 0x7f, 0x10, 0x00, 0xf1, 0xe4, 0x33, 0x8e, 0x1a, + 0xa5, 0x20, 0x9f, 0x1a, 0x84, 0x7c, 0x40, 0x93, 0x84, 0x79, 0x64, 0xf8, + 0x62, 0x01, 0x00, 0x34, 0x87, 0x28, 0x41, 0xb9, 0xa5, 0x04, 0x00, 0x11, + 0xa7, 0x0c, 0x00, 0x33, 0x87, 0x28, 0x01, 0xb9, 0x87, 0x10, 0x41, 0xb9, + 0xe5, 0x03, 0x27, 0x2a, 0xa5, 0x00, 0x04, 0x12, 0xa5, 0x00, 0x07, 0x4a, + 0x85, 0x10, 0x01, 0xb9, 0xb8, 0xff, 0xff, 0x17, 0x85, 0x28, 0x41, 0xb9, + 0xa5, 0x6c, 0x1c, 0x12, 0x85, 0x28, 0x01, 0xb9, 0xb4, 0xff, 0xff, 0x17, + 0x84, 0x00, 0x1c, 0x32, 0xa4, 0x84, 0x00, 0xb9, 0xd7, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x02, 0x00, 0x35, 0x60, 0xc5, 0x80, 0xd2, + 0x00, 0xe0, 0xa8, 0xf2, 0x00, 0x00, 0x40, 0x39, 0x00, 0x1c, 0x00, 0x12, + 0x03, 0x08, 0x00, 0x12, 0x23, 0x00, 0x00, 0xb9, 0x01, 0x00, 0x1c, 0x12, + 0xe0, 0x00, 0x18, 0x36, 0x3f, 0x00, 0x00, 0x71, 0x60, 0x00, 0x80, 0x52, + 0x81, 0x00, 0x80, 0x52, 0x00, 0x10, 0x81, 0x1a, 0x40, 0x00, 0x00, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0x3f, 0x00, 0x00, 0x71, 0xe0, 0x17, 0x9f, 0x1a, + 0x40, 0x00, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x80, 0xc5, 0x80, 0xd2, + 0x00, 0xe0, 0xa8, 0xf2, 0x00, 0x00, 0x40, 0x39, 0x00, 0x1c, 0x00, 0x12, + 0xee, 0xff, 0xff, 0x17, 0x21, 0x01, 0x00, 0xb0, 0x21, 0x80, 0x1c, 0x91, + 0x21, 0x58, 0x60, 0xf8, 0x22, 0x0c, 0x40, 0xb9, 0xe0, 0x03, 0x22, 0x2a, + 0x00, 0x00, 0x05, 0x12, 0x00, 0x00, 0x02, 0x4a, 0x20, 0x0c, 0x00, 0xb9, + 0x22, 0x0c, 0x40, 0xb9, 0xe0, 0x03, 0x22, 0x2a, 0x00, 0x00, 0x15, 0x12, + 0x00, 0x00, 0x02, 0x4a, 0x20, 0x0c, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x01, 0x00, 0xb0, + 0x42, 0x80, 0x18, 0x91, 0x42, 0x58, 0x60, 0xf8, 0x40, 0x04, 0x40, 0xb9, + 0x20, 0x00, 0x1a, 0x33, 0x40, 0x04, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x22, 0x01, 0x00, 0xb0, 0x42, 0x80, 0x18, 0x91, + 0x42, 0x58, 0x60, 0xf8, 0x40, 0x04, 0x40, 0xb9, 0x20, 0x1c, 0x19, 0x33, + 0x40, 0x04, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x22, 0x01, 0x00, 0xb0, 0x42, 0x80, 0x18, 0x91, 0x42, 0x58, 0x60, 0xf8, + 0x40, 0x34, 0x40, 0xb9, 0x20, 0x00, 0x13, 0x33, 0x40, 0x34, 0x00, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x22, 0x01, 0x00, 0xb0, + 0x42, 0x80, 0x1c, 0x91, 0x42, 0x58, 0x60, 0xf8, 0x40, 0x88, 0x40, 0xb9, + 0x20, 0x00, 0x00, 0x33, 0x40, 0x88, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x22, 0x01, 0x00, 0xb0, 0x42, 0x80, 0x18, 0x91, + 0x42, 0x58, 0x60, 0xf8, 0x40, 0x10, 0x41, 0xb9, 0x20, 0x00, 0x00, 0x33, + 0x40, 0x10, 0x01, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xc0, 0x80, 0xd2, 0x00, 0xe0, 0xa8, 0xf2, 0x00, 0x00, 0x40, 0x39, + 0x00, 0x0c, 0x00, 0x12, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xc4, 0x80, 0xd2, + 0x00, 0xe0, 0xa8, 0xf2, 0x00, 0x00, 0x40, 0x39, 0x00, 0x0c, 0x00, 0x12, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5f, 0x0c, 0x00, 0x71, 0x60, 0x04, 0x00, 0x54, + 0x5f, 0x10, 0x00, 0x71, 0x00, 0x03, 0x00, 0x54, 0x21, 0x08, 0x00, 0x12, + 0x5f, 0x14, 0x00, 0x71, 0xa0, 0x08, 0x00, 0x54, 0x5f, 0x18, 0x00, 0x71, + 0xc0, 0x06, 0x00, 0x54, 0x5f, 0x04, 0x00, 0x71, 0x80, 0x06, 0x00, 0x54, + 0x62, 0xc5, 0x80, 0xd2, 0x40, 0x00, 0x00, 0x34, 0x82, 0xc5, 0x80, 0xd2, + 0x02, 0xe0, 0xa8, 0xf2, 0x40, 0x00, 0x40, 0x39, 0x00, 0x0c, 0x1c, 0x12, + 0x01, 0x00, 0x01, 0x2a, 0x41, 0x00, 0x00, 0x39, 0x40, 0x00, 0x40, 0x39, + 0x00, 0x1c, 0x00, 0x13, 0xe1, 0x03, 0x20, 0x2a, 0x21, 0x00, 0x1c, 0x12, + 0x00, 0x00, 0x01, 0x4a, 0x00, 0x1c, 0x00, 0x12, 0x40, 0x00, 0x00, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x21, 0x1c, 0x00, 0x13, 0x21, 0x00, 0x1d, 0x32, + 0x60, 0x03, 0x00, 0x35, 0x62, 0xc5, 0x80, 0xd2, 0x02, 0xe0, 0xa8, 0xf2, + 0xe3, 0x1d, 0x80, 0x52, 0x40, 0x00, 0x40, 0x39, 0x00, 0x00, 0x03, 0x0a, + 0x0c, 0x00, 0x00, 0x14, 0x21, 0x1c, 0x00, 0x13, 0x62, 0xc5, 0x80, 0xd2, + 0x21, 0x00, 0x1d, 0x32, 0xe0, 0x01, 0x00, 0x35, 0x02, 0xe0, 0xa8, 0xf2, + 0x40, 0x00, 0x40, 0x39, 0x00, 0x1c, 0x00, 0x13, 0xe3, 0x03, 0x20, 0x2a, + 0x63, 0x00, 0x1c, 0x12, 0x00, 0x00, 0x03, 0x4a, 0x00, 0x1c, 0x00, 0x12, + 0x40, 0x00, 0x00, 0x39, 0x40, 0x00, 0x40, 0x39, 0x00, 0x1c, 0x00, 0x13, + 0x20, 0x0c, 0x00, 0x33, 0x00, 0x1c, 0x00, 0x12, 0x40, 0x00, 0x00, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x82, 0xc5, 0x80, 0xd2, 0xf1, 0xff, 0xff, 0x17, + 0x82, 0xc5, 0x80, 0xd2, 0x02, 0xe0, 0xa8, 0xf2, 0xe3, 0x1d, 0x80, 0x52, + 0x40, 0x00, 0x40, 0x39, 0x00, 0x00, 0x03, 0x0a, 0xf2, 0xff, 0xff, 0x17, + 0x62, 0xc5, 0x80, 0xd2, 0x40, 0x00, 0x00, 0x34, 0x82, 0xc5, 0x80, 0xd2, + 0x02, 0xe0, 0xa8, 0xf2, 0xe3, 0x1d, 0x80, 0x52, 0x40, 0x00, 0x40, 0x39, + 0x00, 0x00, 0x03, 0x0a, 0x40, 0x00, 0x00, 0x39, 0x40, 0x00, 0x40, 0x39, + 0x00, 0x0c, 0x1c, 0x12, 0x01, 0x00, 0x01, 0x2a, 0x41, 0x00, 0x00, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x62, 0xc5, 0x80, 0xd2, 0x40, 0x00, 0x00, 0x34, + 0x82, 0xc5, 0x80, 0xd2, 0x02, 0xe0, 0xa8, 0xf2, 0x40, 0x00, 0x40, 0x39, + 0x00, 0x1c, 0x00, 0x13, 0xe3, 0x03, 0x20, 0x2a, 0x63, 0x00, 0x1c, 0x12, + 0x00, 0x00, 0x03, 0x4a, 0x00, 0x1c, 0x00, 0x12, 0xf0, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x1c, 0x1c, 0x53, + 0xe2, 0xc0, 0x80, 0xd2, 0x21, 0x1c, 0x00, 0x13, 0x40, 0x00, 0x00, 0x34, + 0xa2, 0xc4, 0x80, 0xd2, 0x02, 0xe0, 0xa8, 0xf2, 0x40, 0x00, 0x40, 0x39, + 0x00, 0x1c, 0x00, 0x13, 0x01, 0x00, 0x01, 0x4a, 0x21, 0x00, 0x1c, 0x12, + 0x01, 0x00, 0x01, 0x4a, 0x21, 0x1c, 0x00, 0x12, 0x41, 0x00, 0x00, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x21, 0x01, 0x00, 0xb0, 0x21, 0x80, 0x1b, 0x91, 0x21, 0x58, 0x60, 0xf8, + 0x20, 0x30, 0x40, 0xb9, 0x80, 0x01, 0x00, 0x36, 0x22, 0x48, 0x40, 0xb9, + 0x20, 0x00, 0x80, 0x52, 0xc2, 0x02, 0x00, 0x37, 0x23, 0x30, 0x40, 0xb9, + 0x22, 0x30, 0x40, 0xb9, 0x63, 0x7c, 0x02, 0x53, 0x62, 0x0c, 0x42, 0x2a, + 0x82, 0x00, 0x00, 0x36, 0x22, 0x48, 0x40, 0xb9, 0xe2, 0x01, 0x28, 0x37, + 0x1f, 0x20, 0x03, 0xd5, 0x20, 0x34, 0x40, 0xb9, 0x22, 0xd0, 0x00, 0x91, + 0x80, 0x01, 0x00, 0x36, 0x23, 0x48, 0x40, 0xb9, 0x20, 0x00, 0x80, 0x52, + 0x03, 0x01, 0x10, 0x37, 0x43, 0x00, 0x40, 0xb9, 0x42, 0x00, 0x40, 0xb9, + 0x63, 0x7c, 0x02, 0x53, 0x62, 0x14, 0x42, 0x2a, 0x82, 0x00, 0x00, 0x36, + 0x22, 0x48, 0x40, 0xb9, 0x42, 0x00, 0x28, 0x36, 0xc0, 0x03, 0x5f, 0xd6, + 0x22, 0x48, 0x40, 0xb9, 0x00, 0x00, 0x80, 0x52, 0xa2, 0xff, 0x3f, 0x36, + 0x20, 0x48, 0x40, 0xb9, 0x00, 0x10, 0x44, 0xd3, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x1c, 0x40, 0x92, 0x21, 0x01, 0x00, 0xb0, 0x21, 0x80, 0x1b, 0x91, + 0x20, 0x78, 0x60, 0xf8, 0x00, 0x00, 0x40, 0xb9, 0x00, 0x14, 0x44, 0xd3, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x21, 0x1c, 0x00, 0x12, + 0x3f, 0x10, 0x00, 0x71, 0x60, 0x15, 0x00, 0x54, 0xc8, 0x0a, 0x00, 0x54, + 0x3f, 0x08, 0x00, 0x71, 0xe0, 0x19, 0x00, 0x54, 0x3f, 0x0c, 0x00, 0x71, + 0x01, 0x05, 0x00, 0x54, 0xe1, 0x37, 0x80, 0xd2, 0x01, 0xe0, 0xa8, 0xf2, + 0x05, 0x1c, 0x00, 0x12, 0x02, 0x38, 0x80, 0xd2, 0x02, 0xe0, 0xa8, 0xf2, + 0x25, 0x00, 0x00, 0x39, 0x00, 0x24, 0x48, 0xd3, 0x66, 0x3a, 0x80, 0xd2, + 0x06, 0xe0, 0xa8, 0xf2, 0x41, 0x00, 0x40, 0x39, 0x27, 0x38, 0x80, 0xd2, + 0x07, 0xe0, 0xa8, 0xf2, 0x21, 0x14, 0x1e, 0x12, 0x44, 0x38, 0x80, 0xd2, + 0x04, 0xe0, 0xa8, 0xf2, 0x21, 0x00, 0x00, 0x2a, 0x41, 0x00, 0x00, 0x39, + 0x83, 0x3a, 0x80, 0xd2, 0x03, 0xe0, 0xa8, 0xf2, 0xc1, 0x00, 0x40, 0x39, + 0x21, 0x1c, 0x00, 0x13, 0xe2, 0x03, 0x21, 0x2a, 0x42, 0x00, 0x1d, 0x12, + 0x21, 0x00, 0x02, 0x4a, 0x21, 0x1c, 0x00, 0x12, 0xc1, 0x00, 0x00, 0x39, + 0xe5, 0x00, 0x00, 0x39, 0x81, 0x00, 0x40, 0x39, 0x21, 0x14, 0x1e, 0x12, + 0x20, 0x00, 0x00, 0x2a, 0x80, 0x00, 0x00, 0x39, 0x60, 0x00, 0x40, 0x39, + 0x00, 0x1c, 0x00, 0x13, 0xe1, 0x03, 0x20, 0x2a, 0x21, 0x00, 0x1d, 0x12, + 0x00, 0x00, 0x01, 0x4a, 0x00, 0x1c, 0x00, 0x12, 0x60, 0x00, 0x00, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x81, 0x19, 0x00, 0x34, 0x3f, 0x04, 0x00, 0x71, + 0xa1, 0xff, 0xff, 0x54, 0xe1, 0x36, 0x80, 0xd2, 0x01, 0xe0, 0xa8, 0xf2, + 0x05, 0x1c, 0x00, 0x12, 0x02, 0x37, 0x80, 0xd2, 0x02, 0xe0, 0xa8, 0xf2, + 0x25, 0x00, 0x00, 0x39, 0x00, 0x24, 0x48, 0xd3, 0x66, 0x3a, 0x80, 0xd2, + 0x06, 0xe0, 0xa8, 0xf2, 0x41, 0x00, 0x40, 0x39, 0x27, 0x37, 0x80, 0xd2, + 0x07, 0xe0, 0xa8, 0xf2, 0x21, 0x14, 0x1e, 0x12, 0x44, 0x37, 0x80, 0xd2, + 0x04, 0xe0, 0xa8, 0xf2, 0x21, 0x00, 0x00, 0x2a, 0x41, 0x00, 0x00, 0x39, + 0x83, 0x3a, 0x80, 0xd2, 0x03, 0xe0, 0xa8, 0xf2, 0xc1, 0x00, 0x40, 0x39, + 0x21, 0x1c, 0x00, 0x13, 0xe2, 0x03, 0x21, 0x2a, 0x42, 0x00, 0x1f, 0x12, + 0x21, 0x00, 0x02, 0x4a, 0x21, 0x1c, 0x00, 0x12, 0xc1, 0x00, 0x00, 0x39, + 0xe5, 0x00, 0x00, 0x39, 0x81, 0x00, 0x40, 0x39, 0x21, 0x14, 0x1e, 0x12, + 0x20, 0x00, 0x00, 0x2a, 0x80, 0x00, 0x00, 0x39, 0x60, 0x00, 0x40, 0x39, + 0x00, 0x1c, 0x00, 0x13, 0xe1, 0x03, 0x20, 0x2a, 0x21, 0x00, 0x1f, 0x12, + 0x00, 0x00, 0x01, 0x4a, 0x00, 0x1c, 0x00, 0x12, 0x60, 0x00, 0x00, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x3f, 0x18, 0x00, 0x71, 0x00, 0x19, 0x00, 0x54, + 0x3f, 0x1c, 0x00, 0x71, 0x01, 0x05, 0x00, 0x54, 0xe1, 0x39, 0x80, 0xd2, + 0x01, 0xe0, 0xa8, 0xf2, 0x05, 0x1c, 0x00, 0x12, 0x02, 0x3a, 0x80, 0xd2, + 0x02, 0xe0, 0xa8, 0xf2, 0x25, 0x00, 0x00, 0x39, 0x00, 0x24, 0x48, 0xd3, + 0x66, 0x3a, 0x80, 0xd2, 0x06, 0xe0, 0xa8, 0xf2, 0x41, 0x00, 0x40, 0x39, + 0x27, 0x3a, 0x80, 0xd2, 0x07, 0xe0, 0xa8, 0xf2, 0x21, 0x14, 0x1e, 0x12, + 0x44, 0x3a, 0x80, 0xd2, 0x04, 0xe0, 0xa8, 0xf2, 0x21, 0x00, 0x00, 0x2a, + 0x41, 0x00, 0x00, 0x39, 0x83, 0x3a, 0x80, 0xd2, 0x03, 0xe0, 0xa8, 0xf2, + 0xc1, 0x00, 0x40, 0x39, 0x21, 0x1c, 0x00, 0x13, 0xe2, 0x03, 0x21, 0x2a, + 0x42, 0x60, 0x19, 0x12, 0x21, 0x00, 0x02, 0x4a, 0x21, 0x1c, 0x00, 0x12, + 0xc1, 0x00, 0x00, 0x39, 0xe5, 0x00, 0x00, 0x39, 0x81, 0x00, 0x40, 0x39, + 0x21, 0x14, 0x1e, 0x12, 0x20, 0x00, 0x00, 0x2a, 0x80, 0x00, 0x00, 0x39, + 0x60, 0x00, 0x40, 0x39, 0x00, 0x1c, 0x00, 0x13, 0xe1, 0x03, 0x20, 0x2a, + 0x21, 0x60, 0x19, 0x12, 0x00, 0x00, 0x01, 0x4a, 0x00, 0x1c, 0x00, 0x12, + 0x60, 0x00, 0x00, 0x39, 0xc0, 0x03, 0x5f, 0xd6, 0x3f, 0x14, 0x00, 0x71, + 0x21, 0xf5, 0xff, 0x54, 0xe1, 0x38, 0x80, 0xd2, 0x01, 0xe0, 0xa8, 0xf2, + 0x05, 0x1c, 0x00, 0x12, 0x02, 0x39, 0x80, 0xd2, 0x02, 0xe0, 0xa8, 0xf2, + 0x25, 0x00, 0x00, 0x39, 0x00, 0x24, 0x48, 0xd3, 0x66, 0x3a, 0x80, 0xd2, + 0x06, 0xe0, 0xa8, 0xf2, 0x41, 0x00, 0x40, 0x39, 0x27, 0x39, 0x80, 0xd2, + 0x07, 0xe0, 0xa8, 0xf2, 0x21, 0x14, 0x1e, 0x12, 0x44, 0x39, 0x80, 0xd2, + 0x04, 0xe0, 0xa8, 0xf2, 0x21, 0x00, 0x00, 0x2a, 0x41, 0x00, 0x00, 0x39, + 0x83, 0x3a, 0x80, 0xd2, 0x03, 0xe0, 0xa8, 0xf2, 0xc1, 0x00, 0x40, 0x39, + 0x21, 0x1c, 0x00, 0x13, 0xe2, 0x03, 0x21, 0x2a, 0x42, 0x00, 0x1b, 0x12, + 0x21, 0x00, 0x02, 0x4a, 0x21, 0x1c, 0x00, 0x12, 0xc1, 0x00, 0x00, 0x39, + 0xe5, 0x00, 0x00, 0x39, 0x81, 0x00, 0x40, 0x39, 0x21, 0x14, 0x1e, 0x12, + 0x20, 0x00, 0x00, 0x2a, 0x80, 0x00, 0x00, 0x39, 0x60, 0x00, 0x40, 0x39, + 0x00, 0x1c, 0x00, 0x13, 0xe1, 0x03, 0x20, 0x2a, 0x21, 0x00, 0x1b, 0x12, + 0x00, 0x00, 0x01, 0x4a, 0x00, 0x1c, 0x00, 0x12, 0x60, 0x00, 0x00, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x61, 0x38, 0x80, 0xd2, 0x01, 0xe0, 0xa8, 0xf2, + 0x05, 0x1c, 0x00, 0x12, 0x82, 0x38, 0x80, 0xd2, 0x02, 0xe0, 0xa8, 0xf2, + 0x25, 0x00, 0x00, 0x39, 0x00, 0x24, 0x48, 0xd3, 0x66, 0x3a, 0x80, 0xd2, + 0x06, 0xe0, 0xa8, 0xf2, 0x41, 0x00, 0x40, 0x39, 0xa7, 0x38, 0x80, 0xd2, + 0x07, 0xe0, 0xa8, 0xf2, 0x21, 0x14, 0x1e, 0x12, 0xc4, 0x38, 0x80, 0xd2, + 0x04, 0xe0, 0xa8, 0xf2, 0x21, 0x00, 0x00, 0x2a, 0x41, 0x00, 0x00, 0x39, + 0x83, 0x3a, 0x80, 0xd2, 0x03, 0xe0, 0xa8, 0xf2, 0xc1, 0x00, 0x40, 0x39, + 0x21, 0x1c, 0x00, 0x13, 0xe2, 0x03, 0x21, 0x2a, 0x42, 0x00, 0x1c, 0x12, + 0x21, 0x00, 0x02, 0x4a, 0x21, 0x1c, 0x00, 0x12, 0xc1, 0x00, 0x00, 0x39, + 0xe5, 0x00, 0x00, 0x39, 0x81, 0x00, 0x40, 0x39, 0x21, 0x14, 0x1e, 0x12, + 0x20, 0x00, 0x00, 0x2a, 0x80, 0x00, 0x00, 0x39, 0x60, 0x00, 0x40, 0x39, + 0x00, 0x1c, 0x00, 0x13, 0xe1, 0x03, 0x20, 0x2a, 0x21, 0x00, 0x1c, 0x12, + 0x00, 0x00, 0x01, 0x4a, 0x00, 0x1c, 0x00, 0x12, 0x60, 0x00, 0x00, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x61, 0x37, 0x80, 0xd2, 0x01, 0xe0, 0xa8, 0xf2, + 0x05, 0x1c, 0x00, 0x12, 0x82, 0x37, 0x80, 0xd2, 0x02, 0xe0, 0xa8, 0xf2, + 0x25, 0x00, 0x00, 0x39, 0x00, 0x24, 0x48, 0xd3, 0x66, 0x3a, 0x80, 0xd2, + 0x06, 0xe0, 0xa8, 0xf2, 0x41, 0x00, 0x40, 0x39, 0xa7, 0x37, 0x80, 0xd2, + 0x07, 0xe0, 0xa8, 0xf2, 0x21, 0x14, 0x1e, 0x12, 0xc4, 0x37, 0x80, 0xd2, + 0x04, 0xe0, 0xa8, 0xf2, 0x21, 0x00, 0x00, 0x2a, 0x41, 0x00, 0x00, 0x39, + 0x83, 0x3a, 0x80, 0xd2, 0x03, 0xe0, 0xa8, 0xf2, 0xc1, 0x00, 0x40, 0x39, + 0x21, 0x1c, 0x00, 0x13, 0xe2, 0x03, 0x21, 0x2a, 0x42, 0x00, 0x1e, 0x12, + 0x21, 0x00, 0x02, 0x4a, 0x21, 0x1c, 0x00, 0x12, 0xc1, 0x00, 0x00, 0x39, + 0xe5, 0x00, 0x00, 0x39, 0x81, 0x00, 0x40, 0x39, 0x21, 0x14, 0x1e, 0x12, + 0x20, 0x00, 0x00, 0x2a, 0x80, 0x00, 0x00, 0x39, 0x60, 0x00, 0x40, 0x39, + 0x00, 0x1c, 0x00, 0x13, 0xe1, 0x03, 0x20, 0x2a, 0x21, 0x00, 0x1e, 0x12, + 0x00, 0x00, 0x01, 0x4a, 0x00, 0x1c, 0x00, 0x12, 0x60, 0x00, 0x00, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x61, 0x36, 0x80, 0xd2, 0x01, 0xe0, 0xa8, 0xf2, + 0x05, 0x1c, 0x00, 0x12, 0x82, 0x36, 0x80, 0xd2, 0x02, 0xe0, 0xa8, 0xf2, + 0x25, 0x00, 0x00, 0x39, 0x00, 0x24, 0x48, 0xd3, 0x66, 0x3a, 0x80, 0xd2, + 0x06, 0xe0, 0xa8, 0xf2, 0x41, 0x00, 0x40, 0x39, 0xa7, 0x36, 0x80, 0xd2, + 0x07, 0xe0, 0xa8, 0xf2, 0x21, 0x14, 0x1e, 0x12, 0xc4, 0x36, 0x80, 0xd2, + 0x04, 0xe0, 0xa8, 0xf2, 0x21, 0x00, 0x00, 0x2a, 0x41, 0x00, 0x00, 0x39, + 0x83, 0x3a, 0x80, 0xd2, 0x03, 0xe0, 0xa8, 0xf2, 0xc1, 0x00, 0x40, 0x39, + 0x21, 0x1c, 0x00, 0x13, 0xe2, 0x03, 0x21, 0x2a, 0x42, 0x00, 0x00, 0x12, + 0x21, 0x00, 0x02, 0x4a, 0x21, 0x1c, 0x00, 0x12, 0xc1, 0x00, 0x00, 0x39, + 0xe5, 0x00, 0x00, 0x39, 0x81, 0x00, 0x40, 0x39, 0x21, 0x14, 0x1e, 0x12, + 0x20, 0x00, 0x00, 0x2a, 0x80, 0x00, 0x00, 0x39, 0x60, 0x00, 0x40, 0x39, + 0x00, 0x1c, 0x00, 0x13, 0xe1, 0x03, 0x20, 0x2a, 0x21, 0x00, 0x00, 0x12, + 0x00, 0x00, 0x01, 0x4a, 0x00, 0x1c, 0x00, 0x12, 0x60, 0x00, 0x00, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x61, 0x39, 0x80, 0xd2, 0x01, 0xe0, 0xa8, 0xf2, + 0x05, 0x1c, 0x00, 0x12, 0x82, 0x39, 0x80, 0xd2, 0x02, 0xe0, 0xa8, 0xf2, + 0x25, 0x00, 0x00, 0x39, 0x00, 0x24, 0x48, 0xd3, 0x66, 0x3a, 0x80, 0xd2, + 0x06, 0xe0, 0xa8, 0xf2, 0x41, 0x00, 0x40, 0x39, 0xa7, 0x39, 0x80, 0xd2, + 0x07, 0xe0, 0xa8, 0xf2, 0x21, 0x14, 0x1e, 0x12, 0xc4, 0x39, 0x80, 0xd2, + 0x04, 0xe0, 0xa8, 0xf2, 0x21, 0x00, 0x00, 0x2a, 0x41, 0x00, 0x00, 0x39, + 0x83, 0x3a, 0x80, 0xd2, 0x03, 0xe0, 0xa8, 0xf2, 0xc1, 0x00, 0x40, 0x39, + 0x21, 0x1c, 0x00, 0x13, 0xe2, 0x03, 0x21, 0x2a, 0x42, 0x00, 0x1a, 0x12, + 0x21, 0x00, 0x02, 0x4a, 0x21, 0x1c, 0x00, 0x12, 0xc1, 0x00, 0x00, 0x39, + 0xe5, 0x00, 0x00, 0x39, 0x81, 0x00, 0x40, 0x39, 0x21, 0x14, 0x1e, 0x12, + 0x20, 0x00, 0x00, 0x2a, 0x80, 0x00, 0x00, 0x39, 0x60, 0x00, 0x40, 0x39, + 0x00, 0x1c, 0x00, 0x13, 0xe1, 0x03, 0x20, 0x2a, 0x21, 0x00, 0x1a, 0x12, + 0x00, 0x00, 0x01, 0x4a, 0x00, 0x1c, 0x00, 0x12, 0x60, 0x00, 0x00, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x1c, 0x40, 0x92, 0x24, 0x01, 0x00, 0x90, + 0x84, 0x80, 0x1b, 0x91, 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x10, 0x00, 0x71, + 0x84, 0x78, 0x65, 0xf8, 0x84, 0x00, 0x40, 0xb9, 0x84, 0x7c, 0x1f, 0x53, + 0x64, 0x00, 0x00, 0x39, 0x80, 0x07, 0x00, 0x54, 0xa8, 0x04, 0x00, 0x54, + 0x1f, 0x08, 0x00, 0x71, 0x20, 0x08, 0x00, 0x54, 0x1f, 0x0c, 0x00, 0x71, + 0xc1, 0x02, 0x00, 0x54, 0xe3, 0x37, 0x80, 0xd2, 0x03, 0xe0, 0xa8, 0xf2, + 0x00, 0x38, 0x80, 0xd2, 0x00, 0xe0, 0xa8, 0xf2, 0x25, 0x38, 0x80, 0xd2, + 0x05, 0xe0, 0xa8, 0xf2, 0x44, 0x38, 0x80, 0xd2, 0x63, 0x00, 0x40, 0x39, + 0x04, 0xe0, 0xa8, 0xf2, 0x00, 0x00, 0x40, 0x39, 0x63, 0x1c, 0x00, 0x12, + 0x00, 0x04, 0x18, 0x53, 0x00, 0x00, 0x03, 0x2a, 0x20, 0x00, 0x00, 0xb9, + 0xa1, 0x00, 0x40, 0x39, 0x80, 0x00, 0x40, 0x39, 0x21, 0x1c, 0x00, 0x12, + 0x00, 0x04, 0x18, 0x53, 0x00, 0x00, 0x01, 0x2a, 0x40, 0x00, 0x00, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x06, 0x00, 0x34, 0x1f, 0x04, 0x00, 0x71, + 0xa1, 0xff, 0xff, 0x54, 0xe3, 0x36, 0x80, 0xd2, 0x03, 0xe0, 0xa8, 0xf2, + 0x00, 0x37, 0x80, 0xd2, 0x00, 0xe0, 0xa8, 0xf2, 0x25, 0x37, 0x80, 0xd2, + 0x05, 0xe0, 0xa8, 0xf2, 0x44, 0x37, 0x80, 0xd2, 0xe8, 0xff, 0xff, 0x17, + 0x1f, 0x18, 0x00, 0x71, 0xa0, 0x05, 0x00, 0x54, 0x1f, 0x1c, 0x00, 0x71, + 0x21, 0x01, 0x00, 0x54, 0xe3, 0x39, 0x80, 0xd2, 0x03, 0xe0, 0xa8, 0xf2, + 0x00, 0x3a, 0x80, 0xd2, 0x00, 0xe0, 0xa8, 0xf2, 0x25, 0x3a, 0x80, 0xd2, + 0x05, 0xe0, 0xa8, 0xf2, 0x44, 0x3a, 0x80, 0xd2, 0xdc, 0xff, 0xff, 0x17, + 0x1f, 0x14, 0x00, 0x71, 0xe1, 0xfc, 0xff, 0x54, 0xe3, 0x38, 0x80, 0xd2, + 0x03, 0xe0, 0xa8, 0xf2, 0x00, 0x39, 0x80, 0xd2, 0x00, 0xe0, 0xa8, 0xf2, + 0x25, 0x39, 0x80, 0xd2, 0x05, 0xe0, 0xa8, 0xf2, 0x44, 0x39, 0x80, 0xd2, + 0xd2, 0xff, 0xff, 0x17, 0x63, 0x38, 0x80, 0xd2, 0x03, 0xe0, 0xa8, 0xf2, + 0x80, 0x38, 0x80, 0xd2, 0x00, 0xe0, 0xa8, 0xf2, 0xa5, 0x38, 0x80, 0xd2, + 0x05, 0xe0, 0xa8, 0xf2, 0xc4, 0x38, 0x80, 0xd2, 0xca, 0xff, 0xff, 0x17, + 0x63, 0x37, 0x80, 0xd2, 0x03, 0xe0, 0xa8, 0xf2, 0x80, 0x37, 0x80, 0xd2, + 0x00, 0xe0, 0xa8, 0xf2, 0xa5, 0x37, 0x80, 0xd2, 0x05, 0xe0, 0xa8, 0xf2, + 0xc4, 0x37, 0x80, 0xd2, 0xc2, 0xff, 0xff, 0x17, 0x63, 0x36, 0x80, 0xd2, + 0x03, 0xe0, 0xa8, 0xf2, 0x80, 0x36, 0x80, 0xd2, 0x00, 0xe0, 0xa8, 0xf2, + 0xa5, 0x36, 0x80, 0xd2, 0x05, 0xe0, 0xa8, 0xf2, 0xc4, 0x36, 0x80, 0xd2, + 0xba, 0xff, 0xff, 0x17, 0x63, 0x39, 0x80, 0xd2, 0x03, 0xe0, 0xa8, 0xf2, + 0x80, 0x39, 0x80, 0xd2, 0x00, 0xe0, 0xa8, 0xf2, 0xa5, 0x39, 0x80, 0xd2, + 0x05, 0xe0, 0xa8, 0xf2, 0xc4, 0x39, 0x80, 0xd2, 0xb2, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x40, 0x92, 0x22, 0x01, 0x00, 0x90, 0x42, 0x00, 0x0d, 0x91, + 0x40, 0x78, 0x60, 0xf8, 0x00, 0xc0, 0x4f, 0x39, 0x00, 0x10, 0x00, 0x12, + 0x20, 0x00, 0x00, 0x39, 0xc0, 0x03, 0x5f, 0xd6, 0xff, 0x43, 0x00, 0xd1, + 0xc0, 0x02, 0x00, 0xd0, 0x00, 0x40, 0x45, 0xf9, 0xe0, 0x07, 0x00, 0xf9, + 0xe0, 0x07, 0x40, 0xf9, 0xc0, 0x00, 0x00, 0xb4, 0xe1, 0x07, 0x40, 0xf9, + 0x00, 0x00, 0x80, 0x52, 0xff, 0x43, 0x00, 0x91, 0xf0, 0x03, 0x01, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xff, 0x43, 0x00, 0x91, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x43, 0x00, 0xd1, 0xc0, 0x02, 0x00, 0xd0, 0x00, 0x40, 0x45, 0xf9, + 0xe0, 0x07, 0x00, 0xf9, 0xe0, 0x07, 0x40, 0xf9, 0xc0, 0x00, 0x00, 0xb4, + 0xe1, 0x07, 0x40, 0xf9, 0x20, 0x00, 0x80, 0x52, 0xff, 0x43, 0x00, 0x91, + 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xff, 0x43, 0x00, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x43, 0x00, 0xd1, 0xc0, 0x02, 0x00, 0xd0, + 0x00, 0x40, 0x45, 0xf9, 0xe0, 0x07, 0x00, 0xf9, 0xe0, 0x07, 0x40, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0xe1, 0x07, 0x40, 0xf9, 0x40, 0x00, 0x80, 0x52, + 0xff, 0x43, 0x00, 0x91, 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xff, 0x43, 0x00, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x43, 0x00, 0xd1, + 0xc0, 0x02, 0x00, 0xd0, 0x00, 0x40, 0x45, 0xf9, 0xe0, 0x07, 0x00, 0xf9, + 0xe0, 0x07, 0x40, 0xf9, 0xc0, 0x00, 0x00, 0xb4, 0xe1, 0x07, 0x40, 0xf9, + 0x60, 0x00, 0x80, 0x52, 0xff, 0x43, 0x00, 0x91, 0xf0, 0x03, 0x01, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xff, 0x43, 0x00, 0x91, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x43, 0x00, 0xd1, 0xc0, 0x02, 0x00, 0xd0, 0x00, 0x40, 0x45, 0xf9, + 0xe0, 0x07, 0x00, 0xf9, 0xe0, 0x07, 0x40, 0xf9, 0xc0, 0x00, 0x00, 0xb4, + 0xe1, 0x07, 0x40, 0xf9, 0x80, 0x00, 0x80, 0x52, 0xff, 0x43, 0x00, 0x91, + 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xff, 0x43, 0x00, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x43, 0x00, 0xd1, 0xc0, 0x02, 0x00, 0xd0, + 0x00, 0x40, 0x45, 0xf9, 0xe0, 0x07, 0x00, 0xf9, 0xe0, 0x07, 0x40, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0xe1, 0x07, 0x40, 0xf9, 0xa0, 0x00, 0x80, 0x52, + 0xff, 0x43, 0x00, 0x91, 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xff, 0x43, 0x00, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x43, 0x00, 0xd1, + 0xc0, 0x02, 0x00, 0xd0, 0x00, 0x40, 0x45, 0xf9, 0xe0, 0x07, 0x00, 0xf9, + 0xe0, 0x07, 0x40, 0xf9, 0xc0, 0x00, 0x00, 0xb4, 0xe1, 0x07, 0x40, 0xf9, + 0xc0, 0x00, 0x80, 0x52, 0xff, 0x43, 0x00, 0x91, 0xf0, 0x03, 0x01, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xff, 0x43, 0x00, 0x91, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x43, 0x00, 0xd1, 0xc0, 0x02, 0x00, 0xd0, 0x00, 0x40, 0x45, 0xf9, + 0xe0, 0x07, 0x00, 0xf9, 0xe0, 0x07, 0x40, 0xf9, 0xc0, 0x00, 0x00, 0xb4, + 0xe1, 0x07, 0x40, 0xf9, 0xe0, 0x00, 0x80, 0x52, 0xff, 0x43, 0x00, 0x91, + 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xff, 0x43, 0x00, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x43, 0x00, 0xd1, 0xc0, 0x02, 0x00, 0xd0, + 0x00, 0x40, 0x45, 0xf9, 0xe0, 0x07, 0x00, 0xf9, 0xe0, 0x07, 0x40, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0xe1, 0x07, 0x40, 0xf9, 0x00, 0x01, 0x80, 0x52, + 0xff, 0x43, 0x00, 0x91, 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xff, 0x43, 0x00, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x43, 0x00, 0xd1, + 0xc0, 0x02, 0x00, 0xd0, 0x00, 0x40, 0x45, 0xf9, 0xe0, 0x07, 0x00, 0xf9, + 0xe0, 0x07, 0x40, 0xf9, 0xc0, 0x00, 0x00, 0xb4, 0xe1, 0x07, 0x40, 0xf9, + 0x20, 0x01, 0x80, 0x52, 0xff, 0x43, 0x00, 0x91, 0xf0, 0x03, 0x01, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xff, 0x43, 0x00, 0x91, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x43, 0x00, 0xd1, 0xc0, 0x02, 0x00, 0xd0, 0x00, 0x40, 0x45, 0xf9, + 0xe0, 0x07, 0x00, 0xf9, 0xe0, 0x07, 0x40, 0xf9, 0xc0, 0x00, 0x00, 0xb4, + 0xe1, 0x07, 0x40, 0xf9, 0x40, 0x01, 0x80, 0x52, 0xff, 0x43, 0x00, 0x91, + 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xff, 0x43, 0x00, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x43, 0x00, 0xd1, 0xc0, 0x02, 0x00, 0xd0, + 0x00, 0x40, 0x45, 0xf9, 0xe0, 0x07, 0x00, 0xf9, 0xe0, 0x07, 0x40, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0xe1, 0x07, 0x40, 0xf9, 0x60, 0x01, 0x80, 0x52, + 0xff, 0x43, 0x00, 0x91, 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xff, 0x43, 0x00, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x43, 0x00, 0xd1, + 0xc0, 0x02, 0x00, 0xd0, 0x00, 0x40, 0x45, 0xf9, 0xe0, 0x07, 0x00, 0xf9, + 0xe0, 0x07, 0x40, 0xf9, 0xc0, 0x00, 0x00, 0xb4, 0xe1, 0x07, 0x40, 0xf9, + 0x80, 0x01, 0x80, 0x52, 0xff, 0x43, 0x00, 0x91, 0xf0, 0x03, 0x01, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xff, 0x43, 0x00, 0x91, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x43, 0x00, 0xd1, 0xc0, 0x02, 0x00, 0xd0, 0x00, 0x40, 0x45, 0xf9, + 0xe0, 0x07, 0x00, 0xf9, 0xe0, 0x07, 0x40, 0xf9, 0xc0, 0x00, 0x00, 0xb4, + 0xe1, 0x07, 0x40, 0xf9, 0xa0, 0x01, 0x80, 0x52, 0xff, 0x43, 0x00, 0x91, + 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xff, 0x43, 0x00, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x43, 0x00, 0xd1, 0xc0, 0x02, 0x00, 0xd0, + 0x00, 0x40, 0x45, 0xf9, 0xe0, 0x07, 0x00, 0xf9, 0xe0, 0x07, 0x40, 0xf9, + 0xc0, 0x00, 0x00, 0xb4, 0xe1, 0x07, 0x40, 0xf9, 0xc0, 0x01, 0x80, 0x52, + 0xff, 0x43, 0x00, 0x91, 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xff, 0x43, 0x00, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x43, 0x00, 0xd1, + 0xc0, 0x02, 0x00, 0xd0, 0x00, 0x40, 0x45, 0xf9, 0xe0, 0x07, 0x00, 0xf9, + 0xe0, 0x07, 0x40, 0xf9, 0xc0, 0x00, 0x00, 0xb4, 0xe1, 0x07, 0x40, 0xf9, + 0xe0, 0x01, 0x80, 0x52, 0xff, 0x43, 0x00, 0x91, 0xf0, 0x03, 0x01, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xff, 0x43, 0x00, 0x91, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x8c, 0x80, 0x52, 0xe1, 0x03, 0x01, 0x2a, 0x03, 0x0e, 0x80, 0xd2, + 0xfd, 0x7b, 0xbe, 0xa9, 0x00, 0x7c, 0xa4, 0x9b, 0x21, 0x00, 0x03, 0x9b, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x02, 0x00, 0x90, + 0x73, 0xa2, 0x3d, 0x91, 0x33, 0x00, 0x13, 0x8b, 0x54, 0x1c, 0x00, 0x12, + 0xe0, 0x03, 0x13, 0xaa, 0xbb, 0x98, 0xff, 0x97, 0x1f, 0x00, 0x00, 0x71, + 0x84, 0x0a, 0x40, 0x7a, 0x81, 0x00, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x13, 0xaa, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xa5, 0x98, 0xff, 0x17, + 0xfd, 0x7b, 0xbc, 0xa9, 0x3f, 0x08, 0x00, 0x71, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x00, 0x2a, + 0x56, 0x1c, 0x00, 0x12, 0xf7, 0x1b, 0x00, 0xf9, 0xf7, 0x03, 0x01, 0x2a, + 0x40, 0x06, 0x00, 0x54, 0x14, 0x8c, 0x80, 0x52, 0x00, 0x7c, 0xb4, 0x9b, + 0x08, 0x05, 0x00, 0x54, 0xf4, 0x03, 0x01, 0x2a, 0x02, 0x0e, 0x80, 0xd2, + 0x01, 0x03, 0x00, 0xb0, 0x21, 0xa0, 0x10, 0x91, 0x94, 0x02, 0x02, 0x9b, + 0x94, 0x02, 0x01, 0x8b, 0xe0, 0x03, 0x14, 0xaa, 0x9c, 0x98, 0xff, 0x97, + 0x1f, 0x00, 0x00, 0x71, 0xf3, 0x03, 0x00, 0x2a, 0xc4, 0x0a, 0x40, 0x7a, + 0x01, 0x01, 0x00, 0x54, 0x73, 0x01, 0x00, 0x35, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x14, 0xaa, + 0x83, 0x98, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0xf3, 0xfe, 0xff, 0x34, + 0xe6, 0x03, 0x16, 0x2a, 0xe5, 0x03, 0x17, 0x2a, 0xe4, 0x03, 0x15, 0x2a, + 0xe7, 0x03, 0x13, 0x2a, 0xe2, 0x03, 0x13, 0x2a, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x03, 0x01, 0x00, 0xf0, 0x63, 0xa0, 0x2c, 0x91, + 0xdb, 0xbb, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x34, 0x04, 0x00, 0x51, 0x02, 0x0e, 0x80, 0x52, + 0x01, 0x03, 0x00, 0xb0, 0x21, 0xa0, 0x10, 0x91, 0x94, 0x02, 0xa2, 0x9b, + 0x94, 0x02, 0x01, 0x8b, 0xd9, 0xff, 0xff, 0x17, 0xd4, 0x02, 0x00, 0xf0, + 0x80, 0x22, 0x02, 0x91, 0x14, 0x0e, 0x80, 0x52, 0xb4, 0x02, 0xb4, 0x9b, + 0xd4, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xbe, 0xa9, 0x01, 0x00, 0x80, 0x12, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0x40, 0x98, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0xa0, 0x00, 0x00, 0x35, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe2, 0x03, 0x00, 0x2a, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x03, 0x01, 0x00, 0xf0, 0x63, 0x80, 0x2d, 0x91, 0xb8, 0xbb, 0xff, 0x97, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0x1d, 0x98, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0xa0, 0x00, 0x00, 0x35, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x03, 0x01, 0x00, 0xf0, + 0x63, 0x00, 0x2e, 0x91, 0xa1, 0xbb, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xbb, 0xa9, 0x04, 0x1c, 0x40, 0x92, 0x23, 0x01, 0x00, 0x90, + 0x63, 0x80, 0x18, 0x91, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x53, 0x1c, 0x00, 0x12, 0x14, 0x1c, 0x00, 0x12, 0xf5, 0x5b, 0x02, 0xa9, + 0xf7, 0x63, 0x03, 0xa9, 0xf7, 0x03, 0x01, 0x2a, 0xf9, 0x6b, 0x04, 0xa9, + 0x7a, 0x78, 0x64, 0xf8, 0xdb, 0x89, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x14, 0x2a, 0xec, 0x89, 0xff, 0x97, 0xf8, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x14, 0x2a, 0xf5, 0x89, 0xff, 0x97, 0xf6, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x14, 0x2a, 0xfa, 0x89, 0xff, 0x97, 0x19, 0x1c, 0x00, 0x12, + 0xe0, 0x03, 0x14, 0x2a, 0x07, 0x8a, 0xff, 0x97, 0x14, 0x1c, 0x00, 0x12, + 0xcd, 0x89, 0xff, 0x97, 0x7f, 0x06, 0x00, 0x71, 0x00, 0x06, 0x00, 0x54, + 0xe8, 0x02, 0x00, 0x54, 0x3f, 0x07, 0x00, 0x71, 0xc0, 0x02, 0x16, 0x0b, + 0x16, 0x00, 0x96, 0x1a, 0x76, 0x04, 0x00, 0x34, 0xa0, 0x0a, 0xd6, 0x1a, + 0xc1, 0x00, 0x80, 0x52, 0x00, 0x04, 0x00, 0x51, 0x1f, 0x7c, 0x00, 0x71, + 0x88, 0x00, 0x00, 0x54, 0x01, 0x01, 0x00, 0xf0, 0x21, 0x60, 0x3d, 0x91, + 0x21, 0x48, 0x60, 0x38, 0x40, 0x03, 0x40, 0xb9, 0x37, 0x02, 0x00, 0x35, + 0x20, 0x08, 0x06, 0x33, 0x40, 0x03, 0x00, 0xb9, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x73, 0x0a, 0x00, 0x51, + 0x73, 0x1e, 0x00, 0x12, 0x7f, 0x06, 0x00, 0x71, 0x49, 0xfd, 0xff, 0x54, + 0x9f, 0x06, 0x00, 0x71, 0x16, 0x7f, 0x01, 0x53, 0xd6, 0x02, 0x98, 0x1a, + 0xe6, 0xff, 0xff, 0x17, 0x20, 0x08, 0x03, 0x33, 0x40, 0x03, 0x00, 0xb9, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x01, 0x07, 0x80, 0x52, 0x03, 0x01, 0x00, 0xf0, 0x63, 0x80, 0x2e, 0x91, + 0x82, 0x00, 0x87, 0x52, 0x00, 0x02, 0x80, 0x52, 0x52, 0xbb, 0xff, 0x97, + 0xc1, 0x00, 0x80, 0x52, 0xdf, 0xff, 0xff, 0x17, 0x1f, 0x03, 0x00, 0x6b, + 0x16, 0x93, 0x80, 0x1a, 0xd3, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xbd, 0xa9, + 0x3f, 0x08, 0x00, 0x71, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x01, 0x2a, 0x14, 0x1c, 0x00, 0x12, 0x20, 0x07, 0x00, 0x54, + 0x80, 0x1e, 0x7e, 0xd3, 0x09, 0x06, 0x00, 0x54, 0x00, 0x00, 0x34, 0x8b, + 0xc3, 0x02, 0x00, 0xd0, 0x63, 0xa0, 0x26, 0x91, 0x21, 0x04, 0x00, 0x51, + 0x60, 0x04, 0x00, 0x8b, 0x00, 0x48, 0x61, 0x38, 0x00, 0x00, 0x00, 0x52, + 0xa0, 0x04, 0x00, 0x34, 0x40, 0x00, 0x40, 0xb9, 0x64, 0xba, 0x89, 0x52, + 0x44, 0x0c, 0xa2, 0x72, 0xf5, 0x13, 0x00, 0xf9, 0x00, 0x9c, 0x0f, 0x11, + 0x55, 0x00, 0x80, 0x52, 0x1f, 0x3c, 0x1f, 0x71, 0xe1, 0x03, 0x15, 0xaa, + 0x62, 0x1e, 0x00, 0x12, 0x83, 0x1e, 0x40, 0x92, 0x00, 0x7c, 0xa4, 0x9b, + 0x00, 0xfc, 0x66, 0xd3, 0x01, 0x80, 0x81, 0x9a, 0x5f, 0x00, 0x15, 0x6b, + 0xf5, 0x03, 0x01, 0xaa, 0x00, 0x08, 0x00, 0x54, 0x05, 0x8c, 0x80, 0xd2, + 0x61, 0x1e, 0x00, 0x12, 0x63, 0x7c, 0x05, 0x9b, 0x29, 0x04, 0x00, 0x54, + 0x20, 0x04, 0x00, 0x51, 0xe4, 0x03, 0x14, 0x2a, 0x07, 0x0e, 0x80, 0xd2, + 0x02, 0x03, 0x00, 0xb0, 0x42, 0xa0, 0x10, 0x91, 0x06, 0x7c, 0x40, 0x93, + 0x85, 0x7c, 0x05, 0x9b, 0xe1, 0x03, 0x15, 0x2a, 0x00, 0x0c, 0x27, 0x9b, + 0xc5, 0x14, 0x07, 0x9b, 0x40, 0x00, 0x00, 0x8b, 0x42, 0x00, 0x05, 0x8b, + 0x55, 0x68, 0x00, 0xb9, 0xce, 0x97, 0xff, 0x97, 0x20, 0x04, 0x00, 0x35, + 0xf5, 0x13, 0x40, 0xf9, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x34, 0x8b, 0xc1, 0x02, 0x00, 0xd0, + 0x21, 0xa0, 0x26, 0x91, 0x20, 0x04, 0x00, 0x8b, 0x00, 0x48, 0x73, 0x38, + 0x00, 0x00, 0x00, 0x52, 0xd2, 0xff, 0xff, 0x17, 0xc0, 0x02, 0x00, 0xd0, + 0x00, 0xe0, 0x0f, 0x91, 0x00, 0xc8, 0x74, 0x38, 0x00, 0x00, 0x00, 0x52, + 0x00, 0x1c, 0x00, 0x12, 0xcc, 0xff, 0xff, 0x17, 0xe7, 0x03, 0x14, 0x2a, + 0x24, 0x7c, 0x40, 0x93, 0x00, 0x0e, 0x80, 0xd2, 0xe2, 0x03, 0x01, 0x2a, + 0x06, 0x03, 0x00, 0xb0, 0xc6, 0xa0, 0x10, 0x91, 0xe5, 0x7c, 0x05, 0x9b, + 0xe1, 0x03, 0x15, 0x2a, 0x84, 0x14, 0x00, 0x9b, 0x40, 0x0c, 0x00, 0x9b, + 0xc2, 0x00, 0x04, 0x8b, 0xc0, 0x00, 0x00, 0x8b, 0x55, 0x68, 0x00, 0xb9, + 0xae, 0x97, 0xff, 0x97, 0x20, 0xfc, 0xff, 0x34, 0xe6, 0x03, 0x15, 0x2a, + 0x65, 0x1e, 0x00, 0x12, 0xe4, 0x03, 0x14, 0x2a, 0xe2, 0x03, 0x00, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0x03, 0x01, 0x00, 0xf0, 0xf5, 0x13, 0x40, 0xf9, + 0x63, 0x60, 0x2f, 0x91, 0xfd, 0x7b, 0xc3, 0xa8, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xed, 0xba, 0xff, 0x17, 0xe2, 0x03, 0x14, 0x2a, + 0xc0, 0x02, 0x00, 0xf0, 0x00, 0x20, 0x02, 0x91, 0x03, 0x0e, 0x80, 0xd2, + 0x84, 0x7e, 0xa3, 0x9b, 0x42, 0x00, 0x03, 0x9b, 0x00, 0x00, 0x04, 0x8b, + 0x41, 0x68, 0x00, 0xb9, 0x98, 0x97, 0xff, 0x97, 0xca, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1c, 0x40, 0x92, + 0xfd, 0x7b, 0xbd, 0xa9, 0x87, 0x1c, 0x40, 0x92, 0x43, 0x9c, 0x0f, 0x11, + 0x09, 0x8c, 0x80, 0xd2, 0x22, 0x1c, 0x40, 0x92, 0x08, 0x0e, 0x80, 0xd2, + 0xfd, 0x03, 0x00, 0x91, 0xe7, 0x7c, 0x09, 0x9b, 0xf3, 0x53, 0x01, 0xa9, + 0x73, 0xba, 0x89, 0x52, 0x53, 0x0c, 0xa2, 0x72, 0xf5, 0x13, 0x00, 0xf9, + 0xf5, 0x03, 0x04, 0xaa, 0x84, 0x7c, 0x09, 0x9b, 0x40, 0x1c, 0x08, 0x9b, + 0xe5, 0x02, 0x00, 0x90, 0xa5, 0xa0, 0x3d, 0x91, 0x42, 0x10, 0x08, 0x9b, + 0x73, 0x7c, 0xb3, 0x9b, 0x7f, 0x3c, 0x1f, 0x71, 0xa2, 0x00, 0x02, 0x8b, + 0x34, 0x1c, 0x00, 0x12, 0xa0, 0x00, 0x00, 0x8b, 0x66, 0xfe, 0x66, 0xd3, + 0x53, 0x00, 0x80, 0x52, 0xd3, 0x80, 0x93, 0x9a, 0x53, 0x68, 0x00, 0xb9, + 0xe1, 0x03, 0x13, 0x2a, 0x77, 0x97, 0xff, 0x97, 0xa0, 0x00, 0x00, 0x35, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe6, 0x03, 0x13, 0x2a, 0xe5, 0x03, 0x14, 0x2a, + 0xe4, 0x03, 0x15, 0x2a, 0xe2, 0x03, 0x00, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0x03, 0x01, 0x00, 0xf0, 0xf5, 0x13, 0x40, 0xf9, 0x63, 0x60, 0x30, 0x91, + 0xfd, 0x7b, 0xc3, 0xa8, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xb2, 0xba, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x04, 0x00, 0x71, + 0x00, 0x1c, 0x00, 0x12, 0x09, 0x04, 0x00, 0x54, 0x04, 0x7c, 0x40, 0x93, + 0x25, 0x01, 0x00, 0x90, 0xa5, 0x80, 0x0d, 0x91, 0x80, 0x05, 0x80, 0x52, + 0x20, 0x7c, 0x00, 0x1b, 0xa1, 0x78, 0x64, 0xf8, 0x00, 0x60, 0x01, 0x51, + 0x20, 0x40, 0x20, 0x8b, 0x22, 0x01, 0x00, 0xb4, 0x04, 0x14, 0x40, 0xb9, + 0xe1, 0x03, 0x24, 0x2a, 0x21, 0x00, 0x14, 0x12, 0x21, 0x00, 0x04, 0x4a, + 0x01, 0x14, 0x00, 0xb9, 0x01, 0x14, 0x40, 0xb9, 0x21, 0x60, 0x50, 0xd3, + 0x41, 0x00, 0x00, 0x39, 0x83, 0x01, 0x00, 0xb4, 0x02, 0x14, 0x40, 0xb9, + 0xe1, 0x03, 0x22, 0x2a, 0x21, 0x00, 0x04, 0x12, 0x21, 0x00, 0x02, 0x4a, + 0x01, 0x14, 0x00, 0xb9, 0x01, 0x1c, 0x40, 0xb9, 0x00, 0x18, 0x40, 0xb9, + 0x21, 0x0c, 0x60, 0xd3, 0xe0, 0x03, 0x00, 0x2a, 0x00, 0x00, 0x01, 0xaa, + 0x60, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x1c, 0x7f, 0xd3, 0x24, 0x01, 0x00, 0x90, 0x84, 0x80, 0x0f, 0x91, + 0x01, 0x40, 0x21, 0x8b, 0x80, 0x78, 0x61, 0xf8, 0x22, 0x01, 0x00, 0xb4, + 0x04, 0x5c, 0x40, 0xb9, 0xe1, 0x03, 0x24, 0x2a, 0x21, 0x00, 0x18, 0x12, + 0x21, 0x00, 0x04, 0x4a, 0x01, 0x5c, 0x00, 0xb9, 0x01, 0x6c, 0x40, 0xb9, + 0x21, 0x60, 0x50, 0xd3, 0x41, 0x00, 0x00, 0x39, 0x03, 0xfe, 0xff, 0xb4, + 0x02, 0x68, 0x40, 0xb9, 0xe1, 0x03, 0x22, 0x2a, 0x21, 0x00, 0x00, 0x12, + 0x21, 0x00, 0x02, 0x4a, 0x01, 0x68, 0x00, 0xb9, 0x01, 0x5c, 0x40, 0xb9, + 0x00, 0x60, 0x40, 0xb9, 0x21, 0x0c, 0x60, 0xd3, 0xe0, 0x03, 0x00, 0x2a, + 0x00, 0x00, 0x01, 0xaa, 0x60, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc2, 0x02, 0x00, 0xd0, 0x41, 0x20, 0x1a, 0x91, 0x02, 0x1c, 0x7e, 0xd3, + 0x08, 0x7c, 0x08, 0x53, 0x42, 0x00, 0x20, 0x8b, 0xfd, 0x7b, 0xb5, 0xa9, + 0x06, 0x0d, 0x00, 0x12, 0x22, 0x04, 0x02, 0x8b, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x13, 0x1c, 0x40, 0x92, 0xf5, 0x5b, 0x02, 0xa9, + 0x15, 0x1c, 0x00, 0x12, 0xf7, 0x63, 0x03, 0xa9, 0x17, 0x1c, 0x00, 0x12, + 0x40, 0x48, 0x66, 0x38, 0xff, 0x7f, 0x06, 0xa9, 0x1f, 0x00, 0x00, 0x71, + 0xff, 0x7f, 0x07, 0xa9, 0xe7, 0x17, 0x9f, 0x1a, 0xbf, 0x1e, 0x00, 0x71, + 0xff, 0x7f, 0x08, 0xa9, 0xc2, 0x98, 0x49, 0x7a, 0xff, 0x7f, 0x09, 0xa9, + 0xff, 0x7f, 0x0a, 0xa9, 0x88, 0x07, 0x00, 0x54, 0xe7, 0x04, 0x00, 0x11, + 0xc3, 0x0c, 0x7d, 0xd3, 0xf8, 0x83, 0x01, 0x91, 0xe1, 0x03, 0x06, 0x2a, + 0x03, 0x03, 0x03, 0x8b, 0xe0, 0x03, 0x15, 0x2a, 0x02, 0x00, 0x80, 0xd2, + 0xf9, 0x6b, 0x04, 0xa9, 0xfb, 0x2b, 0x00, 0xf9, 0x9d, 0xff, 0xff, 0x97, + 0x1f, 0x09, 0x1f, 0x72, 0xfa, 0x03, 0x06, 0x2a, 0x00, 0x18, 0x40, 0x7a, + 0x61, 0x05, 0x00, 0x54, 0x01, 0x01, 0x00, 0xf0, 0x21, 0x80, 0x0e, 0x91, + 0xc0, 0x08, 0x00, 0x51, 0x21, 0x78, 0x73, 0xf8, 0x21, 0xe4, 0x40, 0xb9, + 0x21, 0x1c, 0x00, 0x12, 0x20, 0x28, 0xc0, 0x1a, 0x80, 0x04, 0x00, 0x37, + 0x04, 0x00, 0x80, 0xd2, 0x1f, 0x7b, 0x3a, 0xf8, 0x60, 0x0a, 0x13, 0x8b, + 0xd9, 0x02, 0x00, 0xb0, 0x39, 0x23, 0x10, 0x91, 0x00, 0x00, 0x00, 0x8b, + 0x1b, 0x00, 0x1a, 0x8b, 0x03, 0x03, 0x00, 0xd0, 0x76, 0xe0, 0x22, 0x91, + 0x14, 0x03, 0x00, 0xd0, 0x94, 0xa2, 0x21, 0x91, 0xc3, 0x02, 0x00, 0x8b, + 0x82, 0x02, 0x00, 0x8b, 0x21, 0x7b, 0x7b, 0xf8, 0x7f, 0x48, 0x26, 0x38, + 0x5f, 0x48, 0x26, 0x38, 0x3f, 0x00, 0x04, 0xeb, 0xc1, 0x02, 0x00, 0xb0, + 0x21, 0x60, 0x1b, 0x91, 0x20, 0x00, 0x00, 0x8b, 0xc1, 0x03, 0x00, 0x54, + 0x01, 0xc8, 0x66, 0x38, 0x21, 0x04, 0x00, 0x11, 0x21, 0x1c, 0x00, 0x12, + 0x01, 0xc8, 0x26, 0x38, 0xff, 0x00, 0x01, 0x6b, 0x89, 0x0c, 0x00, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x2b, 0x40, 0xf9, 0xfd, 0x7b, 0xcb, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xc0, 0x0c, 0x00, 0x35, 0x04, 0x7b, 0x7a, 0xf8, + 0xde, 0xff, 0xff, 0x17, 0x62, 0x00, 0x87, 0x52, 0xe4, 0x03, 0x17, 0x2a, + 0xe5, 0x03, 0x06, 0x2a, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x03, 0x01, 0x00, 0xd0, 0x63, 0x60, 0x31, 0x91, 0x14, 0xba, 0xff, 0x97, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xcb, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x24, 0x00, 0x80, 0x52, + 0x1f, 0xc8, 0x26, 0x38, 0x44, 0x48, 0x26, 0x38, 0xe1, 0x03, 0x06, 0x2a, + 0xe0, 0x03, 0x17, 0x2a, 0x64, 0x48, 0x26, 0x38, 0x02, 0x00, 0x80, 0x52, + 0xe7, 0xfd, 0xff, 0x97, 0x00, 0x7b, 0x7a, 0xf8, 0x20, 0x7b, 0x3b, 0xf8, + 0x60, 0x0a, 0x13, 0x8b, 0x01, 0x03, 0x00, 0xd0, 0x21, 0x20, 0x24, 0x91, + 0x40, 0x07, 0x00, 0x8b, 0x00, 0xec, 0x7c, 0xd3, 0x22, 0x00, 0x00, 0x8b, + 0x46, 0x04, 0x40, 0xf9, 0x06, 0xfb, 0xff, 0xb4, 0x43, 0x01, 0x80, 0x52, + 0x25, 0x68, 0x60, 0xb8, 0x24, 0x00, 0x80, 0x52, 0x00, 0x00, 0x80, 0xd2, + 0xe3, 0x7e, 0xa3, 0x9b, 0x01, 0x00, 0x80, 0x52, 0x94, 0x02, 0x03, 0x8b, + 0x07, 0x00, 0x00, 0x14, 0x82, 0x6a, 0x60, 0x38, 0x00, 0x04, 0x00, 0x91, + 0x5f, 0x00, 0x00, 0x71, 0x21, 0x04, 0x81, 0x1a, 0x1f, 0x28, 0x00, 0xf1, + 0x00, 0x01, 0x00, 0x54, 0x82, 0x20, 0xc0, 0x1a, 0x5f, 0x00, 0x05, 0x6a, + 0x01, 0xff, 0xff, 0x54, 0x00, 0x04, 0x00, 0x91, 0x21, 0x04, 0x00, 0x11, + 0x1f, 0x28, 0x00, 0xf1, 0x41, 0xff, 0xff, 0x54, 0x3f, 0x28, 0x00, 0x71, + 0x21, 0xf8, 0xff, 0x54, 0x04, 0x0a, 0x80, 0x52, 0xc3, 0x02, 0x03, 0x8b, + 0x00, 0x00, 0x80, 0xd2, 0x22, 0x00, 0x80, 0x52, 0xf7, 0x66, 0xa4, 0x9b, + 0x41, 0x20, 0xc0, 0x1a, 0x3f, 0x00, 0x05, 0x6a, 0x61, 0x00, 0x00, 0x54, + 0x7f, 0x68, 0x20, 0x38, 0xff, 0x7a, 0x20, 0xf8, 0x00, 0x04, 0x00, 0x91, + 0x1f, 0x28, 0x00, 0xf1, 0x21, 0xff, 0xff, 0x54, 0xe4, 0x03, 0x18, 0xaa, + 0x00, 0x00, 0x80, 0xd2, 0x02, 0x00, 0x80, 0x52, 0x1f, 0x20, 0x03, 0xd5, + 0x61, 0x68, 0x60, 0x38, 0xe5, 0x7a, 0x60, 0xf8, 0x85, 0x84, 0x00, 0xf8, + 0x21, 0x20, 0xc0, 0x1a, 0x00, 0x04, 0x00, 0x91, 0x42, 0x00, 0x01, 0x2a, + 0x1f, 0x28, 0x00, 0xf1, 0x21, 0xff, 0xff, 0x54, 0xe1, 0x03, 0x18, 0xaa, + 0xe0, 0x03, 0x15, 0x2a, 0xc0, 0x00, 0x3f, 0xd6, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x2b, 0x40, 0xf9, 0xfd, 0x7b, 0xcb, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x1f, 0xc8, 0x26, 0x38, 0x20, 0x00, 0x80, 0x52, 0xe1, 0x03, 0x06, 0x2a, + 0x40, 0x48, 0x26, 0x38, 0xe0, 0x03, 0x17, 0x2a, 0x02, 0x00, 0x80, 0x52, + 0x9c, 0xfd, 0xff, 0x97, 0x00, 0x7b, 0x7a, 0xf8, 0x20, 0x7b, 0x3b, 0xf8, + 0xb5, 0xff, 0xff, 0x17, 0x02, 0x3c, 0x00, 0x12, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x2b, 0x40, 0xf9, 0x9b, 0xff, 0xff, 0x17, 0x02, 0x1c, 0x7e, 0xd3, + 0xc3, 0x02, 0x00, 0xb0, 0x63, 0x60, 0x1b, 0x91, 0x42, 0x00, 0x20, 0x8b, + 0xfd, 0x7b, 0xbe, 0xa9, 0x63, 0x00, 0x21, 0x8b, 0x46, 0x00, 0x02, 0x8b, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x1c, 0x00, 0x12, 0xff, 0x0f, 0x00, 0xf9, + 0x7f, 0x68, 0x26, 0x38, 0x1f, 0x1c, 0x00, 0x71, 0x22, 0x98, 0x49, 0x7a, + 0xa8, 0x02, 0x00, 0x54, 0xe7, 0x03, 0x01, 0x2a, 0xe3, 0x63, 0x00, 0x91, + 0x02, 0x00, 0x80, 0xd2, 0xf3, 0xfe, 0xff, 0x97, 0xc0, 0x01, 0x00, 0x35, + 0x03, 0x03, 0x00, 0xd0, 0x63, 0xa0, 0x21, 0x91, 0x01, 0x03, 0x00, 0xd0, + 0x21, 0xe0, 0x22, 0x91, 0x63, 0x00, 0x06, 0x8b, 0x21, 0x00, 0x06, 0x8b, + 0xc2, 0x40, 0x27, 0x8b, 0xc4, 0x02, 0x00, 0xb0, 0x84, 0x20, 0x10, 0x91, + 0xe5, 0x0f, 0x40, 0xf9, 0x7f, 0x48, 0x27, 0x38, 0x3f, 0x48, 0x27, 0x38, + 0x85, 0x78, 0x22, 0xf8, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x00, 0x87, 0x52, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe1, 0x03, 0x00, 0xaa, 0xa0, 0x00, 0x00, 0xb4, 0xc2, 0x02, 0x00, 0xb0, + 0x00, 0x00, 0x80, 0x52, 0x41, 0x40, 0x05, 0xf9, 0xc0, 0x03, 0x5f, 0xd6, + 0x40, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x3f, 0x08, 0x00, 0x71, + 0x03, 0x1c, 0x00, 0x12, 0x00, 0x02, 0x00, 0x54, 0x7f, 0x1c, 0x00, 0x71, + 0x60, 0x00, 0x87, 0x52, 0x88, 0x01, 0x00, 0x54, 0x60, 0x1c, 0x7e, 0xd3, + 0x3f, 0x08, 0x00, 0x71, 0x69, 0x02, 0x00, 0x54, 0x03, 0x00, 0x23, 0x8b, + 0x21, 0x04, 0x00, 0x51, 0x04, 0x03, 0x00, 0xd0, 0x84, 0xa0, 0x3f, 0x91, + 0x21, 0x04, 0x03, 0x8b, 0x00, 0x00, 0x80, 0x52, 0x21, 0xec, 0x7c, 0xd3, + 0x82, 0x68, 0x21, 0xb8, 0xc0, 0x03, 0x5f, 0xd6, 0x7f, 0x04, 0x00, 0x71, + 0x60, 0x00, 0x87, 0x52, 0xa8, 0xff, 0xff, 0x54, 0x63, 0x1c, 0x7c, 0xd3, + 0xc1, 0x02, 0x00, 0xb0, 0x21, 0x80, 0x29, 0x91, 0x00, 0x00, 0x80, 0x52, + 0x22, 0x68, 0x23, 0xb8, 0xc0, 0x03, 0x5f, 0xd6, 0x03, 0x00, 0x23, 0x8b, + 0x04, 0x03, 0x00, 0xd0, 0x84, 0xa0, 0x3f, 0x91, 0x63, 0x00, 0x03, 0x8b, + 0x61, 0x40, 0x21, 0x8b, 0x00, 0x00, 0x80, 0x52, 0x21, 0xec, 0x7c, 0xd3, + 0x82, 0x68, 0x21, 0xb8, 0xc0, 0x03, 0x5f, 0xd6, 0x03, 0x1c, 0x00, 0x12, + 0xa2, 0x04, 0x00, 0xb4, 0x3f, 0x08, 0x00, 0x71, 0x00, 0x02, 0x00, 0x54, + 0x7f, 0x1c, 0x00, 0x71, 0x60, 0x00, 0x87, 0x52, 0x88, 0x01, 0x00, 0x54, + 0x60, 0x1c, 0x7e, 0xd3, 0x3f, 0x08, 0x00, 0x71, 0x89, 0x02, 0x00, 0x54, + 0x03, 0x00, 0x23, 0x8b, 0x21, 0x04, 0x00, 0x51, 0x04, 0x03, 0x00, 0xd0, + 0x84, 0xa0, 0x3f, 0x91, 0x21, 0x04, 0x03, 0x8b, 0x00, 0x00, 0x80, 0x52, + 0x81, 0x10, 0x01, 0x8b, 0x22, 0x04, 0x00, 0xf9, 0xc0, 0x03, 0x5f, 0xd6, + 0x7f, 0x04, 0x00, 0x71, 0x60, 0x00, 0x87, 0x52, 0xa8, 0xff, 0xff, 0x54, + 0x63, 0x1c, 0x7c, 0xd3, 0xc1, 0x02, 0x00, 0xb0, 0x21, 0x80, 0x29, 0x91, + 0x00, 0x00, 0x80, 0x52, 0x23, 0x00, 0x03, 0x8b, 0x62, 0x04, 0x00, 0xf9, + 0xc0, 0x03, 0x5f, 0xd6, 0x03, 0x00, 0x23, 0x8b, 0x04, 0x03, 0x00, 0xd0, + 0x84, 0xa0, 0x3f, 0x91, 0x63, 0x00, 0x03, 0x8b, 0x61, 0x40, 0x21, 0x8b, + 0x00, 0x00, 0x80, 0x52, 0x81, 0x10, 0x01, 0x8b, 0x22, 0x04, 0x00, 0xf9, + 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x1c, 0x00, 0x71, 0x22, 0x98, 0x49, 0x7a, + 0x68, 0x01, 0x00, 0x54, 0x03, 0x1c, 0x7e, 0xd3, 0x04, 0x03, 0x00, 0xd0, + 0x84, 0x20, 0x24, 0x91, 0x60, 0x00, 0x20, 0x8b, 0x03, 0x00, 0x00, 0x8b, + 0x00, 0x00, 0x80, 0x52, 0x61, 0x40, 0x21, 0x8b, 0x21, 0xec, 0x7c, 0xd3, + 0x82, 0x68, 0x21, 0xb8, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x00, 0x87, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x03, 0x1c, 0x00, 0x12, 0xe2, 0x01, 0x00, 0xb4, + 0x7f, 0x1c, 0x00, 0x71, 0x60, 0x00, 0x87, 0x52, 0x22, 0x98, 0x49, 0x7a, + 0x48, 0x01, 0x00, 0x54, 0x60, 0x1c, 0x7e, 0xd3, 0x04, 0x03, 0x00, 0xd0, + 0x84, 0x20, 0x24, 0x91, 0x03, 0x00, 0x23, 0x8b, 0x63, 0x00, 0x03, 0x8b, + 0x00, 0x00, 0x80, 0x52, 0x61, 0x40, 0x21, 0x8b, 0x81, 0x10, 0x01, 0x8b, + 0x22, 0x04, 0x00, 0xf9, 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x1c, 0x00, 0x12, 0x3f, 0x08, 0x00, 0x71, 0x40, 0x02, 0x00, 0x54, + 0x5f, 0x1c, 0x00, 0x71, 0x60, 0x00, 0x87, 0x52, 0xc8, 0x01, 0x00, 0x54, + 0x40, 0x1c, 0x7e, 0xd3, 0x3f, 0x08, 0x00, 0x71, 0xe9, 0x02, 0x00, 0x54, + 0x02, 0x00, 0x22, 0x8b, 0x21, 0x04, 0x00, 0x51, 0x03, 0x03, 0x00, 0xd0, + 0x63, 0xa0, 0x3f, 0x91, 0x21, 0x04, 0x02, 0x8b, 0x00, 0x00, 0x80, 0x52, + 0x21, 0xec, 0x7c, 0xd3, 0x62, 0x00, 0x01, 0x8b, 0x7f, 0x68, 0x21, 0xb8, + 0x5f, 0x04, 0x00, 0xf9, 0xc0, 0x03, 0x5f, 0xd6, 0x5f, 0x04, 0x00, 0x71, + 0x60, 0x00, 0x87, 0x52, 0xa8, 0xff, 0xff, 0x54, 0x42, 0x1c, 0x7c, 0xd3, + 0xc1, 0x02, 0x00, 0xb0, 0x21, 0x80, 0x29, 0x91, 0x00, 0x00, 0x80, 0x52, + 0x23, 0x00, 0x02, 0x8b, 0x3f, 0x68, 0x22, 0xb8, 0x7f, 0x04, 0x00, 0xf9, + 0xc0, 0x03, 0x5f, 0xd6, 0x02, 0x00, 0x22, 0x8b, 0x03, 0x03, 0x00, 0xd0, + 0x63, 0xa0, 0x3f, 0x91, 0x42, 0x00, 0x02, 0x8b, 0x41, 0x40, 0x21, 0x8b, + 0x00, 0x00, 0x80, 0x52, 0x21, 0xec, 0x7c, 0xd3, 0x62, 0x00, 0x01, 0x8b, + 0x7f, 0x68, 0x21, 0xb8, 0x5f, 0x04, 0x00, 0xf9, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0x01, 0x01, 0x00, 0xd0, 0x21, 0xe0, 0x3f, 0x91, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0x33, 0x58, 0x60, 0xb8, 0xe0, 0x03, 0x13, 0x2a, + 0x09, 0x2b, 0x00, 0x94, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0x71, 0x2a, 0x00, 0x14, 0xfd, 0x7b, 0xb8, 0xa9, + 0x00, 0x01, 0x00, 0xd0, 0x00, 0x40, 0x3c, 0x91, 0xfd, 0x03, 0x00, 0x91, + 0xfb, 0x73, 0x05, 0xa9, 0xfb, 0x02, 0x00, 0xd0, 0x61, 0xa3, 0x0c, 0x91, + 0xf9, 0x6b, 0x04, 0xa9, 0x1c, 0x01, 0x00, 0xd0, 0x9c, 0xe3, 0x32, 0x91, + 0xe1, 0x33, 0x00, 0xf9, 0x1a, 0x03, 0x00, 0x90, 0x41, 0xa3, 0x10, 0x91, + 0xf7, 0x63, 0x03, 0xa9, 0x17, 0x01, 0x00, 0xd0, 0xf7, 0x42, 0x32, 0x91, + 0x18, 0x00, 0x00, 0xd0, 0x18, 0x03, 0x28, 0x91, 0xe1, 0x37, 0x00, 0xf9, + 0x01, 0x10, 0x40, 0x79, 0x59, 0x00, 0x80, 0x52, 0x00, 0x00, 0x40, 0xf9, + 0xf3, 0x53, 0x01, 0xa9, 0xf5, 0x5b, 0x02, 0xa9, 0x15, 0x00, 0x80, 0x52, + 0xe0, 0x3b, 0x00, 0xf9, 0xe1, 0xf3, 0x00, 0x79, 0x1f, 0x20, 0x03, 0xd5, + 0xb6, 0x1e, 0x00, 0x12, 0x1a, 0x00, 0x80, 0x52, 0xc0, 0xc2, 0x00, 0x11, + 0xe0, 0xdb, 0x01, 0x39, 0xf4, 0x6f, 0x46, 0xa9, 0x1b, 0x00, 0x00, 0x14, + 0x46, 0x1f, 0x00, 0x12, 0x76, 0x03, 0x00, 0x39, 0xc0, 0xc0, 0x00, 0x11, + 0x78, 0x33, 0x00, 0xf9, 0x79, 0x6b, 0x00, 0xb9, 0xc7, 0x04, 0x00, 0x11, + 0x7f, 0xb3, 0x01, 0x39, 0xe1, 0xc3, 0x01, 0x91, 0xe0, 0xe3, 0x01, 0x39, + 0x5f, 0x07, 0x00, 0x71, 0xe0, 0x03, 0x1b, 0xaa, 0xe2, 0x03, 0x1a, 0x2a, + 0x94, 0x82, 0x01, 0x91, 0x03, 0x00, 0x80, 0x52, 0x69, 0x00, 0x00, 0x54, + 0xe6, 0x1c, 0x00, 0x12, 0x42, 0x07, 0x00, 0x11, 0x66, 0x07, 0x00, 0x39, + 0xa2, 0x22, 0x02, 0x2a, 0x7b, 0xc3, 0x01, 0x91, 0x2e, 0x95, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0xc0, 0x01, 0x00, 0x35, 0x5a, 0x07, 0x00, 0x11, + 0x5f, 0x2b, 0x00, 0x71, 0xc0, 0x03, 0x00, 0x54, 0xe1, 0x03, 0x17, 0xaa, + 0xe0, 0x03, 0x14, 0xaa, 0xf2, 0x94, 0xff, 0x97, 0x60, 0xfc, 0xff, 0x34, + 0xe2, 0x03, 0x00, 0x2a, 0xe3, 0x03, 0x1c, 0xaa, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x98, 0xb8, 0xff, 0x97, 0xdd, 0xff, 0xff, 0x17, + 0xf4, 0x03, 0x13, 0x2a, 0xe2, 0x03, 0x00, 0x2a, 0xe5, 0x03, 0x1a, 0x2a, + 0xe4, 0x03, 0x15, 0x2a, 0x03, 0x01, 0x00, 0xd0, 0x41, 0x00, 0x80, 0x52, + 0x63, 0x80, 0x33, 0x91, 0x00, 0x02, 0x80, 0x52, 0x8e, 0xb8, 0xff, 0x97, + 0xf5, 0x03, 0x14, 0x2a, 0xf3, 0x03, 0x15, 0x2a, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xc8, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x33, 0x40, 0xf9, 0xb5, 0x06, 0x00, 0x11, + 0xbf, 0x1e, 0x00, 0x71, 0x00, 0x00, 0x0f, 0x91, 0xe0, 0x33, 0x00, 0xf9, + 0xe0, 0x37, 0x40, 0xf9, 0x00, 0x80, 0x11, 0x91, 0xe0, 0x37, 0x00, 0xf9, + 0x69, 0xf7, 0xff, 0x54, 0x16, 0x01, 0x00, 0xd0, 0xd6, 0x22, 0x34, 0x91, + 0xf5, 0x02, 0x00, 0xd0, 0xb5, 0xa2, 0x09, 0x91, 0xe1, 0x03, 0x16, 0xaa, + 0xe0, 0x03, 0x15, 0xaa, 0xc8, 0x94, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x60, 0x1c, 0x00, 0x35, 0xc1, 0x02, 0x00, 0xd0, 0x34, 0x20, 0x02, 0x91, + 0x57, 0x00, 0x80, 0x52, 0x04, 0x06, 0x80, 0x52, 0x3f, 0x10, 0x01, 0x79, + 0x7a, 0x04, 0x80, 0x52, 0x98, 0x32, 0x00, 0xf9, 0x59, 0x06, 0x80, 0x52, + 0x97, 0x6a, 0x00, 0xb9, 0xe0, 0x03, 0x14, 0xaa, 0x9f, 0xb2, 0x01, 0x39, + 0xe1, 0xc3, 0x01, 0x91, 0x03, 0x00, 0x80, 0x52, 0x02, 0x40, 0x80, 0x52, + 0xfa, 0xd3, 0x01, 0x39, 0xe4, 0xdb, 0x01, 0x39, 0xf9, 0xe3, 0x01, 0x39, + 0xe8, 0x94, 0xff, 0x97, 0x20, 0x1b, 0x00, 0x35, 0xe1, 0x03, 0x16, 0xaa, + 0xa0, 0x82, 0x01, 0x91, 0xb0, 0x94, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x60, 0x19, 0x00, 0x35, 0xe0, 0x03, 0x14, 0xaa, 0x25, 0x00, 0x80, 0x52, + 0x24, 0x06, 0x80, 0x52, 0x98, 0x6a, 0x00, 0xf9, 0x97, 0xda, 0x00, 0xb9, + 0xe1, 0xc3, 0x01, 0x91, 0x05, 0x0c, 0x07, 0x78, 0x03, 0x00, 0x80, 0x52, + 0x9f, 0x72, 0x03, 0x39, 0x22, 0x40, 0x80, 0x52, 0xfa, 0xd3, 0x01, 0x39, + 0xe4, 0xdb, 0x01, 0x39, 0xf9, 0xe3, 0x01, 0x39, 0xd4, 0x94, 0xff, 0x97, + 0x80, 0x18, 0x00, 0x35, 0xdb, 0x02, 0x00, 0xd0, 0x60, 0xa3, 0x05, 0x91, + 0x19, 0x01, 0x00, 0xd0, 0x39, 0x83, 0x35, 0x91, 0xf8, 0xff, 0xff, 0xf0, + 0x18, 0x03, 0x3f, 0x91, 0x1c, 0x01, 0x00, 0xd0, 0x9c, 0x23, 0x36, 0x91, + 0xe0, 0x33, 0x00, 0xf9, 0xda, 0x02, 0x00, 0xf0, 0x40, 0xa3, 0x3d, 0x91, + 0x15, 0x00, 0x80, 0x52, 0xe0, 0x37, 0x00, 0xf9, 0x40, 0x0a, 0x80, 0x52, + 0xe0, 0xc3, 0x01, 0x39, 0x1f, 0x20, 0x03, 0xd5, 0xb6, 0x1e, 0x00, 0x12, + 0x1a, 0x00, 0x80, 0x52, 0xc0, 0xc2, 0x00, 0x11, 0xe0, 0xdb, 0x01, 0x39, + 0xf4, 0x6f, 0x46, 0xa9, 0x15, 0x00, 0x00, 0x14, 0x46, 0x1f, 0x00, 0x12, + 0x76, 0x03, 0x00, 0x39, 0xc7, 0xc0, 0x00, 0x11, 0x66, 0x07, 0x00, 0x39, + 0x78, 0x33, 0x00, 0xf9, 0xe0, 0x03, 0x1b, 0xaa, 0x77, 0x6b, 0x00, 0xb9, + 0xa2, 0x22, 0x1a, 0x2a, 0x7f, 0xb3, 0x01, 0x39, 0xe1, 0xc3, 0x01, 0x91, + 0x03, 0x00, 0x80, 0x52, 0x94, 0x82, 0x01, 0x91, 0x7b, 0xc3, 0x01, 0x91, + 0xe7, 0xe3, 0x01, 0x39, 0xae, 0x94, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0xc0, 0x01, 0x00, 0x35, 0x5a, 0x07, 0x00, 0x11, 0x5f, 0x2b, 0x00, 0x71, + 0xa0, 0x02, 0x00, 0x54, 0xe1, 0x03, 0x19, 0xaa, 0xe0, 0x03, 0x14, 0xaa, + 0x72, 0x94, 0xff, 0x97, 0x20, 0xfd, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, + 0xe3, 0x03, 0x1c, 0xaa, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x18, 0xb8, 0xff, 0x97, 0xe3, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, + 0xe5, 0x03, 0x1a, 0x2a, 0xe4, 0x03, 0x15, 0x2a, 0x03, 0x01, 0x00, 0xd0, + 0x41, 0x00, 0x80, 0x52, 0x63, 0xc0, 0x36, 0x91, 0x00, 0x02, 0x80, 0x52, + 0xf4, 0x03, 0x13, 0x2a, 0x0e, 0xb8, 0xff, 0x97, 0x80, 0xff, 0xff, 0x17, + 0xe0, 0x33, 0x40, 0xf9, 0xb5, 0x06, 0x00, 0x11, 0xbf, 0x1e, 0x00, 0x71, + 0x00, 0x00, 0x0f, 0x91, 0xe0, 0x33, 0x00, 0xf9, 0xe0, 0x37, 0x40, 0xf9, + 0x00, 0x80, 0x11, 0x91, 0xe0, 0x37, 0x00, 0xf9, 0x49, 0xf9, 0xff, 0x54, + 0xd5, 0x02, 0x00, 0xb0, 0xb5, 0x22, 0x2a, 0x91, 0x16, 0x01, 0x00, 0xd0, + 0xd6, 0x62, 0x37, 0x91, 0x04, 0x00, 0x00, 0x14, 0xb5, 0x82, 0x01, 0x91, + 0x7f, 0x22, 0x00, 0x71, 0xe0, 0x01, 0x00, 0x54, 0xe1, 0x03, 0x16, 0xaa, + 0xe0, 0x03, 0x15, 0xaa, 0x73, 0x06, 0x00, 0x11, 0x4c, 0x94, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0x00, 0xff, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, + 0x03, 0x01, 0x00, 0xd0, 0x63, 0x00, 0x38, 0x91, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xf5, 0x03, 0x14, 0x2a, 0xef, 0xb7, 0xff, 0x97, + 0x62, 0xff, 0xff, 0x17, 0xd3, 0x02, 0x00, 0xb0, 0x73, 0x22, 0x36, 0x91, + 0x16, 0x01, 0x00, 0xd0, 0xd6, 0xa2, 0x38, 0x91, 0x04, 0x00, 0x00, 0x14, + 0x73, 0x82, 0x01, 0x91, 0x9f, 0x22, 0x00, 0x71, 0xe0, 0x01, 0x00, 0x54, + 0xe1, 0x03, 0x16, 0xaa, 0xe0, 0x03, 0x13, 0xaa, 0x94, 0x06, 0x00, 0x11, + 0x36, 0x94, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, 0x00, 0xff, 0xff, 0x34, + 0xe2, 0x03, 0x00, 0x2a, 0x03, 0x01, 0x00, 0xd0, 0x63, 0x40, 0x39, 0x91, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0xf3, 0x03, 0x15, 0x2a, + 0xd9, 0xb7, 0xff, 0x97, 0x4d, 0xff, 0xff, 0x17, 0x14, 0x03, 0x00, 0x90, + 0x94, 0xa2, 0x04, 0x91, 0x16, 0x01, 0x00, 0xd0, 0xd6, 0xe2, 0x39, 0x91, + 0x04, 0x00, 0x00, 0x14, 0x94, 0x82, 0x01, 0x91, 0xbf, 0x22, 0x00, 0x71, + 0xa0, 0x02, 0x00, 0x54, 0xe1, 0x03, 0x16, 0xaa, 0xe0, 0x03, 0x14, 0xaa, + 0xb5, 0x06, 0x00, 0x11, 0x20, 0x94, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x00, 0xff, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, 0x03, 0x01, 0x00, 0xd0, + 0x63, 0x60, 0x3a, 0x91, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xc4, 0xb7, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xc8, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x15, 0x01, 0x00, 0xd0, 0xb5, 0xe2, 0x3f, 0x91, 0x14, 0x01, 0x00, 0xd0, + 0x94, 0xe2, 0x3d, 0x91, 0xe3, 0xff, 0xff, 0xf0, 0x63, 0x00, 0x14, 0x91, + 0xb5, 0x12, 0x00, 0x91, 0x94, 0x22, 0x00, 0x91, 0x16, 0x00, 0x80, 0x52, + 0x20, 0x24, 0x80, 0x52, 0x0c, 0x00, 0x00, 0x14, 0xa0, 0x02, 0x40, 0xb9, + 0x94, 0x42, 0x00, 0x91, 0x83, 0x02, 0x5f, 0xf8, 0xb5, 0x22, 0x00, 0x91, + 0x98, 0x28, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0xa0, 0x01, 0x00, 0x35, + 0xdf, 0x1e, 0x00, 0x71, 0xa8, 0xfc, 0xff, 0x54, 0xa0, 0xc2, 0x5f, 0xb8, + 0x83, 0x82, 0x5f, 0xf8, 0x02, 0x0a, 0x80, 0x52, 0x01, 0x00, 0x80, 0x52, + 0x8f, 0x28, 0x00, 0x94, 0xd6, 0x06, 0x00, 0x11, 0xf3, 0x03, 0x00, 0x2a, + 0x02, 0x0a, 0x80, 0x52, 0x01, 0x00, 0x80, 0x52, 0xc0, 0xfd, 0xff, 0x34, + 0xe2, 0x03, 0x13, 0x2a, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x03, 0x01, 0x00, 0xd0, 0x63, 0x00, 0x3b, 0x91, 0x98, 0xb7, 0xff, 0x97, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xfd, 0x7b, 0xc8, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x13, 0x2a, + 0x03, 0x01, 0x00, 0xd0, 0x63, 0xc0, 0x34, 0x91, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xf4, 0x03, 0x13, 0x2a, 0x89, 0xb7, 0xff, 0x97, + 0xfb, 0xfe, 0xff, 0x17, 0x33, 0x00, 0x80, 0x52, 0xe4, 0x03, 0x13, 0x2a, + 0xf3, 0x03, 0x00, 0x2a, 0xe2, 0x03, 0x00, 0x2a, 0x45, 0x00, 0x80, 0x52, + 0x03, 0x01, 0x00, 0xd0, 0xe1, 0x03, 0x05, 0x2a, 0x63, 0xa0, 0x3b, 0x91, + 0x00, 0x02, 0x80, 0x52, 0xf4, 0x03, 0x13, 0x2a, 0x7d, 0xb7, 0xff, 0x97, + 0xef, 0xfe, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb9, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0x16, 0x1c, 0x00, 0x12, 0xdf, 0x1e, 0x00, 0x71, + 0x22, 0x98, 0x4a, 0x7a, 0xc8, 0x0c, 0x00, 0x54, 0xf3, 0x53, 0x01, 0xa9, + 0xdf, 0x06, 0x00, 0x71, 0xf3, 0x03, 0x01, 0x2a, 0x20, 0x88, 0x42, 0x7a, + 0x60, 0x0b, 0x00, 0x54, 0xf4, 0x03, 0x02, 0xaa, 0xa2, 0x0e, 0x00, 0xb4, + 0x61, 0x0c, 0x00, 0x34, 0x3f, 0x04, 0x00, 0x71, 0xe0, 0x0c, 0x00, 0x54, + 0x80, 0x12, 0x40, 0x39, 0x1f, 0x04, 0x00, 0x71, 0x28, 0x0d, 0x00, 0x54, + 0x81, 0x16, 0x40, 0x39, 0x3f, 0x08, 0x00, 0x71, 0xc8, 0x0c, 0x00, 0x54, + 0x81, 0x46, 0x40, 0x39, 0x3f, 0x70, 0x00, 0x71, 0x68, 0x0c, 0x00, 0x54, + 0x81, 0x4a, 0x40, 0x39, 0x3f, 0x70, 0x00, 0x71, 0x08, 0x0c, 0x00, 0x54, + 0x81, 0x4e, 0x40, 0x39, 0x3f, 0x70, 0x00, 0x71, 0xa8, 0x0b, 0x00, 0x54, + 0x81, 0x52, 0x40, 0x39, 0x3f, 0x70, 0x00, 0x71, 0x48, 0x0b, 0x00, 0x54, + 0x81, 0x2e, 0x40, 0x79, 0x82, 0x32, 0x40, 0x79, 0x83, 0x36, 0x40, 0x79, + 0x00, 0x0d, 0x00, 0x35, 0xa1, 0x00, 0x00, 0x35, 0x80, 0x1a, 0x40, 0xb9, + 0x60, 0x0a, 0x00, 0x35, 0x80, 0x3a, 0x40, 0x79, 0x20, 0x0a, 0x00, 0x35, + 0x22, 0x3c, 0x00, 0x35, 0xe3, 0x3c, 0x00, 0x35, 0x80, 0x3a, 0x40, 0x79, + 0xe0, 0x0b, 0x00, 0x34, 0x3f, 0xfc, 0x0f, 0x71, 0x35, 0x00, 0x87, 0x52, + 0x68, 0x08, 0x00, 0x54, 0xf7, 0x63, 0x03, 0xa9, 0xf9, 0x6b, 0x04, 0xa9, + 0xfb, 0x73, 0x05, 0xa9, 0x1f, 0xfc, 0x0f, 0x71, 0x28, 0x0a, 0x00, 0x54, + 0xd5, 0x04, 0x00, 0x35, 0x81, 0x0e, 0x40, 0x79, 0xe0, 0xff, 0x83, 0x52, + 0x3f, 0x00, 0x00, 0x6b, 0x88, 0x09, 0x00, 0x54, 0x81, 0x12, 0x40, 0x79, + 0xe0, 0xff, 0x87, 0x52, 0x3f, 0x00, 0x00, 0x6b, 0x08, 0x09, 0x00, 0x54, + 0x81, 0x0e, 0x40, 0xb9, 0x00, 0xe0, 0xbf, 0x12, 0x3f, 0x00, 0x00, 0x6b, + 0x88, 0x08, 0x00, 0x54, 0xb3, 0x0a, 0x00, 0x34, 0x7f, 0x06, 0x00, 0x71, + 0xa0, 0x0d, 0x00, 0x54, 0x7f, 0x0a, 0x00, 0x71, 0x60, 0x1e, 0x00, 0x54, + 0x60, 0x0e, 0x00, 0x51, 0x1f, 0x1c, 0x00, 0x71, 0x48, 0x02, 0x00, 0x54, + 0x79, 0x06, 0x00, 0x51, 0xd7, 0x1e, 0x40, 0x92, 0x00, 0x0c, 0x80, 0x52, + 0x02, 0x78, 0x80, 0xd2, 0xd8, 0x7e, 0x40, 0x93, 0x01, 0x01, 0x00, 0xf0, + 0x21, 0x80, 0x13, 0x91, 0x20, 0x7f, 0xa0, 0x9b, 0xf7, 0x02, 0x02, 0x9b, + 0xe0, 0x02, 0x00, 0xd0, 0x00, 0xa0, 0x0c, 0x91, 0xf7, 0x02, 0x00, 0x8b, + 0xe0, 0x03, 0x17, 0xaa, 0x3b, 0x78, 0x78, 0xf8, 0x55, 0xfb, 0xff, 0x97, + 0xf5, 0x03, 0x00, 0x2a, 0x80, 0x29, 0x00, 0x34, 0xe0, 0x03, 0x15, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xc7, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x53, 0x41, 0xa9, 0x75, 0x00, 0x87, 0x52, + 0xe0, 0x03, 0x15, 0x2a, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc7, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x75, 0x00, 0x87, 0x52, 0xe0, 0x03, 0x15, 0x2a, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x40, 0x08, 0x40, 0x39, 0x35, 0x00, 0x87, 0x52, 0x1f, 0x04, 0x00, 0x71, + 0xa9, 0xf3, 0xff, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0xf2, 0xff, 0xff, 0x17, + 0x40, 0x08, 0x40, 0x39, 0x00, 0x08, 0x00, 0x51, 0x00, 0x1c, 0x00, 0x12, + 0x1f, 0x08, 0x00, 0x71, 0xc9, 0xf2, 0xff, 0x54, 0x35, 0x00, 0x87, 0x52, + 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x55, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x35, 0x00, 0x87, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xdb, 0xff, 0xff, 0x17, 0x15, 0x00, 0x80, 0x52, + 0x3f, 0xfc, 0x0f, 0x71, 0x88, 0xfd, 0xff, 0x54, 0x5f, 0xfc, 0x0f, 0x71, + 0x48, 0xfd, 0xff, 0x54, 0x7f, 0xfc, 0x0f, 0x71, 0x08, 0xfd, 0xff, 0x54, + 0x80, 0x3a, 0x40, 0x79, 0xf7, 0x63, 0x03, 0xa9, 0xf9, 0x6b, 0x04, 0xa9, + 0xfb, 0x73, 0x05, 0xa9, 0x9d, 0xff, 0xff, 0x17, 0xf7, 0x02, 0x00, 0xd0, + 0xe0, 0xa2, 0x0c, 0x91, 0xd7, 0x1e, 0x40, 0x92, 0x02, 0x78, 0x80, 0xd2, + 0xd9, 0x7e, 0x40, 0x93, 0x01, 0x01, 0x00, 0xf0, 0x21, 0x80, 0x18, 0x91, + 0xf7, 0x02, 0x02, 0x9b, 0xe0, 0x03, 0x17, 0xaa, 0x38, 0x78, 0x79, 0xf8, + 0x0c, 0xfb, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, 0x80, 0xf4, 0xff, 0x35, + 0x1a, 0x23, 0x41, 0xb9, 0xe0, 0x03, 0x16, 0x2a, 0x03, 0x23, 0x41, 0xb9, + 0x02, 0x00, 0x80, 0x52, 0x01, 0x00, 0x80, 0x52, 0x63, 0x78, 0x1f, 0x12, + 0x03, 0x23, 0x01, 0xb9, 0xc2, 0xfa, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, + 0x20, 0x2d, 0x00, 0x34, 0xe0, 0x03, 0x17, 0xaa, 0x16, 0xfb, 0xff, 0x97, + 0x97, 0xff, 0xff, 0x17, 0xd7, 0x1e, 0x40, 0x92, 0x02, 0x78, 0x80, 0xd2, + 0xd9, 0x7e, 0x40, 0x93, 0x01, 0x01, 0x00, 0xf0, 0x21, 0x80, 0x18, 0x91, + 0xe0, 0x02, 0x00, 0xd0, 0x00, 0xa0, 0x0c, 0x91, 0xf7, 0x7e, 0x02, 0x9b, + 0xf7, 0x82, 0x01, 0x91, 0xf7, 0x02, 0x00, 0x8b, 0xe0, 0x03, 0x17, 0xaa, + 0x38, 0x78, 0x79, 0xf8, 0xf0, 0xfa, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, + 0x80, 0xf3, 0xff, 0x35, 0x1a, 0x4b, 0x41, 0xb9, 0xe1, 0x03, 0x13, 0x2a, + 0x03, 0x4b, 0x41, 0xb9, 0xe0, 0x03, 0x16, 0x2a, 0x02, 0x00, 0x80, 0x52, + 0x63, 0x78, 0x1f, 0x12, 0x03, 0x4b, 0x01, 0xb9, 0xa6, 0xfa, 0xff, 0x97, + 0xf5, 0x03, 0x00, 0x2a, 0x80, 0x00, 0x00, 0x34, 0xe0, 0x03, 0x17, 0xaa, + 0xfa, 0xfa, 0xff, 0x97, 0x8f, 0xff, 0xff, 0x17, 0x82, 0x0a, 0x40, 0x39, + 0xe1, 0x03, 0x13, 0x2a, 0xe0, 0x03, 0x16, 0x2a, 0x09, 0xfb, 0xff, 0x97, + 0x01, 0x4f, 0x41, 0xb9, 0x20, 0x0b, 0x19, 0x8b, 0xc3, 0x02, 0x00, 0xb0, + 0x63, 0xa0, 0x26, 0x91, 0x85, 0x0e, 0x40, 0x79, 0x60, 0x04, 0x00, 0x8b, + 0x84, 0x12, 0x40, 0x79, 0x21, 0x78, 0x03, 0x12, 0x83, 0x42, 0x40, 0x39, + 0x86, 0x0e, 0x40, 0x39, 0x01, 0x4f, 0x01, 0xb9, 0x06, 0x04, 0x00, 0x39, + 0x82, 0x0a, 0x40, 0x39, 0x01, 0x4f, 0x41, 0xb9, 0x42, 0x08, 0x00, 0x51, + 0x41, 0x04, 0x08, 0x33, 0x01, 0x4f, 0x01, 0xb9, 0x00, 0x4f, 0x41, 0xb9, + 0x81, 0x12, 0x40, 0x39, 0x20, 0x00, 0x18, 0x33, 0x00, 0x4f, 0x01, 0xb9, + 0x00, 0x4f, 0x41, 0xb9, 0x81, 0x16, 0x40, 0x39, 0x20, 0x04, 0x1c, 0x33, + 0x00, 0x4f, 0x01, 0xb9, 0x00, 0x53, 0x41, 0xb9, 0xa0, 0x30, 0x00, 0x33, + 0x00, 0x53, 0x01, 0xb9, 0x00, 0x53, 0x41, 0xb9, 0x80, 0x34, 0x10, 0x33, + 0x00, 0x53, 0x01, 0xb9, 0x00, 0x5b, 0x41, 0xb9, 0x81, 0x0e, 0x40, 0xb9, + 0x20, 0x5c, 0x00, 0x33, 0x00, 0x5b, 0x01, 0xb9, 0x00, 0x5b, 0x41, 0xb9, + 0x60, 0x00, 0x04, 0x33, 0x00, 0x5b, 0x01, 0xb9, 0x00, 0x57, 0x41, 0xb9, + 0x81, 0x46, 0x40, 0x39, 0x20, 0x10, 0x00, 0x33, 0x00, 0x57, 0x01, 0xb9, + 0x00, 0x57, 0x41, 0xb9, 0x81, 0x4a, 0x40, 0x39, 0x20, 0x10, 0x18, 0x33, + 0x00, 0x57, 0x01, 0xb9, 0x00, 0x57, 0x41, 0xb9, 0x81, 0x4e, 0x40, 0x39, + 0x84, 0x2e, 0x40, 0x79, 0x83, 0x32, 0x40, 0x79, 0x82, 0x36, 0x40, 0x79, + 0x20, 0x10, 0x10, 0x33, 0x81, 0x3a, 0x40, 0x79, 0x00, 0x57, 0x01, 0xb9, + 0x00, 0x57, 0x41, 0xb9, 0x85, 0x52, 0x40, 0x39, 0xa0, 0x10, 0x08, 0x33, + 0x00, 0x57, 0x01, 0xb9, 0x00, 0x5f, 0x41, 0xb9, 0x80, 0x24, 0x00, 0x33, + 0x00, 0x5f, 0x01, 0xb9, 0x00, 0x5f, 0x41, 0xb9, 0x60, 0x24, 0x10, 0x33, + 0x00, 0x5f, 0x01, 0xb9, 0x00, 0x63, 0x41, 0xb9, 0x40, 0x24, 0x00, 0x33, + 0x00, 0x63, 0x01, 0xb9, 0x00, 0x63, 0x41, 0xb9, 0x20, 0x24, 0x10, 0x33, + 0x00, 0x63, 0x01, 0xb9, 0x80, 0x7a, 0x40, 0x39, 0x1f, 0x04, 0x00, 0x71, + 0x61, 0x00, 0x00, 0x54, 0x80, 0x22, 0x40, 0xb9, 0x00, 0x77, 0x01, 0xb9, + 0x05, 0x7b, 0x41, 0xb9, 0xe2, 0x03, 0x14, 0xaa, 0x04, 0x03, 0x00, 0xb0, + 0x84, 0x20, 0x38, 0x91, 0xe1, 0x03, 0x25, 0x2a, 0x03, 0x05, 0x80, 0xd2, + 0x21, 0x00, 0x0c, 0x12, 0xe0, 0x03, 0x16, 0x2a, 0x21, 0x00, 0x05, 0x4a, + 0x01, 0x7b, 0x01, 0xb9, 0x39, 0x13, 0x03, 0x9b, 0x21, 0x00, 0x80, 0x52, + 0x43, 0x4c, 0x42, 0xb8, 0x23, 0x07, 0x00, 0xb9, 0xff, 0xfa, 0xff, 0x97, + 0xda, 0x00, 0x00, 0x36, 0x01, 0x4b, 0x41, 0xb9, 0xe0, 0x03, 0x21, 0x2a, + 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x01, 0x4a, 0x00, 0x4b, 0x01, 0xb9, + 0xe0, 0x03, 0x17, 0xaa, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xfd, 0x7b, 0xc7, 0xa8, 0x8d, 0xfa, 0xff, 0x17, 0xf8, 0x02, 0x00, 0xb0, + 0x00, 0xa3, 0x09, 0x91, 0x18, 0x0c, 0x80, 0x52, 0xd9, 0x7e, 0x40, 0x93, + 0x01, 0x01, 0x00, 0xd0, 0x21, 0x40, 0x0d, 0x91, 0xd8, 0x02, 0xb8, 0x9b, + 0xe0, 0x03, 0x18, 0xaa, 0x37, 0x78, 0x79, 0xf8, 0x6b, 0xfa, 0xff, 0x97, + 0xf5, 0x03, 0x00, 0x2a, 0xe0, 0xe2, 0xff, 0x35, 0xfa, 0xfe, 0x40, 0xb9, + 0xe1, 0x03, 0x13, 0x2a, 0xe3, 0xfe, 0x40, 0xb9, 0xe0, 0x03, 0x16, 0x2a, + 0x02, 0x00, 0x80, 0x52, 0x63, 0x78, 0x1f, 0x12, 0xe3, 0xfe, 0x00, 0xb9, + 0xe3, 0x0a, 0x40, 0xb9, 0x63, 0x78, 0x15, 0x12, 0xe3, 0x0a, 0x00, 0xb9, + 0x1e, 0xfa, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, 0xa1, 0x00, 0x80, 0x52, + 0x81, 0x0a, 0x00, 0x39, 0x40, 0x25, 0x00, 0x35, 0xe1, 0x02, 0x41, 0xb9, + 0xc0, 0x02, 0x00, 0x90, 0x00, 0xe0, 0x0f, 0x91, 0x82, 0x12, 0x40, 0x39, + 0x83, 0x12, 0x40, 0x79, 0x84, 0x0e, 0x40, 0x79, 0x41, 0x00, 0x18, 0x33, + 0x82, 0x0e, 0x40, 0x39, 0xe1, 0x02, 0x01, 0xb9, 0xe1, 0x02, 0x41, 0xb9, + 0x85, 0x16, 0x40, 0x39, 0xa1, 0x04, 0x1c, 0x33, 0xe1, 0x02, 0x01, 0xb9, + 0xe1, 0x06, 0x41, 0xb9, 0x81, 0x30, 0x00, 0x33, 0xe1, 0x06, 0x01, 0xb9, + 0xe1, 0x06, 0x41, 0xb9, 0x61, 0x34, 0x10, 0x33, 0xe1, 0x06, 0x01, 0xb9, + 0xe1, 0x12, 0x41, 0xb9, 0x83, 0x0e, 0x40, 0xb9, 0x61, 0x5c, 0x00, 0x33, + 0xe1, 0x12, 0x01, 0xb9, 0x02, 0xc8, 0x36, 0x38, 0xa2, 0x00, 0x00, 0x35, + 0x81, 0x42, 0x40, 0x39, 0xe0, 0x12, 0x41, 0xb9, 0x20, 0x00, 0x04, 0x33, + 0xe0, 0x12, 0x01, 0xb9, 0xe1, 0x0e, 0x41, 0xb9, 0xe2, 0x03, 0x14, 0xaa, + 0x84, 0x46, 0x40, 0x39, 0xc3, 0x02, 0x00, 0x90, 0x63, 0x20, 0x29, 0x91, + 0x88, 0x2e, 0x40, 0x79, 0x87, 0x32, 0x40, 0x79, 0xe0, 0x03, 0x16, 0x2a, + 0x86, 0x36, 0x40, 0x79, 0x81, 0x10, 0x00, 0x33, 0x85, 0x3a, 0x40, 0x79, + 0xe1, 0x0e, 0x01, 0xb9, 0x41, 0x00, 0x80, 0x52, 0xe4, 0x0e, 0x41, 0xb9, + 0x89, 0x4a, 0x40, 0x39, 0x24, 0x11, 0x18, 0x33, 0xe4, 0x0e, 0x01, 0xb9, + 0xe4, 0x0e, 0x41, 0xb9, 0x89, 0x4e, 0x40, 0x39, 0x24, 0x11, 0x10, 0x33, + 0xe4, 0x0e, 0x01, 0xb9, 0xe4, 0x0e, 0x41, 0xb9, 0x89, 0x52, 0x40, 0x39, + 0x24, 0x11, 0x08, 0x33, 0xe4, 0x0e, 0x01, 0xb9, 0xe4, 0x16, 0x41, 0xb9, + 0x04, 0x25, 0x00, 0x33, 0xe4, 0x16, 0x01, 0xb9, 0xe4, 0x16, 0x41, 0xb9, + 0xe4, 0x24, 0x10, 0x33, 0xe4, 0x16, 0x01, 0xb9, 0xe4, 0x1a, 0x41, 0xb9, + 0xc4, 0x24, 0x00, 0x33, 0xe4, 0x1a, 0x01, 0xb9, 0xe4, 0x1a, 0x41, 0xb9, + 0xa4, 0x24, 0x10, 0x33, 0xe4, 0x1a, 0x01, 0xb9, 0x44, 0x4c, 0x42, 0xb8, + 0x64, 0x78, 0x39, 0xb8, 0x91, 0xfa, 0xff, 0x97, 0x7a, 0x01, 0x00, 0x36, + 0xe1, 0xfe, 0x40, 0xb9, 0xe0, 0x03, 0x21, 0x2a, 0x00, 0x00, 0x00, 0x12, + 0x00, 0x00, 0x01, 0x4a, 0xe0, 0xfe, 0x00, 0xb9, 0xe1, 0x0a, 0x40, 0xb9, + 0xe0, 0x03, 0x21, 0x2a, 0x00, 0x00, 0x16, 0x12, 0x00, 0x00, 0x01, 0x4a, + 0xe0, 0x0a, 0x00, 0xb9, 0xe0, 0x03, 0x18, 0xaa, 0x8d, 0xff, 0xff, 0x17, + 0x03, 0x05, 0x80, 0x52, 0xe1, 0x03, 0x13, 0x2a, 0xe0, 0x03, 0x16, 0x2a, + 0x02, 0x00, 0x80, 0x52, 0x63, 0x7e, 0x03, 0x1b, 0x7c, 0xe0, 0x01, 0x51, + 0x7a, 0x43, 0x3c, 0x8b, 0x43, 0x27, 0x40, 0xb9, 0x44, 0x27, 0x40, 0xb9, + 0xe3, 0x6b, 0x00, 0xb9, 0x84, 0x78, 0x1f, 0x12, 0x44, 0x27, 0x00, 0xb9, + 0xbb, 0xf9, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, 0xc0, 0xe2, 0xff, 0x35, + 0x41, 0x17, 0x40, 0xb9, 0x06, 0x0b, 0x18, 0x8b, 0x85, 0x06, 0x40, 0x39, + 0xc0, 0x02, 0x00, 0x90, 0x00, 0xa0, 0x26, 0x91, 0x8b, 0x0e, 0x40, 0x39, + 0x89, 0x0e, 0x40, 0x79, 0x21, 0x78, 0x15, 0x12, 0x88, 0x12, 0x40, 0x79, + 0x06, 0x04, 0x06, 0x8b, 0x87, 0x42, 0x40, 0x39, 0xe2, 0x03, 0x14, 0xaa, + 0x41, 0x17, 0x00, 0xb9, 0xc4, 0x02, 0x00, 0x90, 0x84, 0x20, 0x0f, 0x91, + 0xcb, 0x48, 0x39, 0x38, 0x60, 0x4b, 0x7c, 0xb8, 0xe1, 0x03, 0x13, 0x2a, + 0xa0, 0x00, 0x0c, 0x33, 0x60, 0x4b, 0x3c, 0xb8, 0xe0, 0x03, 0x16, 0x2a, + 0x65, 0x4b, 0x7c, 0xb8, 0x8a, 0x12, 0x40, 0x39, 0x45, 0x01, 0x18, 0x33, + 0x65, 0x4b, 0x3c, 0xb8, 0x65, 0x4b, 0x7c, 0xb8, 0x86, 0x16, 0x40, 0x39, + 0xc5, 0x04, 0x1c, 0x33, 0x65, 0x4b, 0x3c, 0xb8, 0x45, 0x0f, 0x40, 0xb9, + 0x25, 0x31, 0x00, 0x33, 0x45, 0x0f, 0x00, 0xb9, 0x45, 0x0f, 0x40, 0xb9, + 0x05, 0x35, 0x10, 0x33, 0x45, 0x0f, 0x00, 0xb9, 0x45, 0x13, 0x40, 0xb9, + 0x86, 0x0e, 0x40, 0xb9, 0xc5, 0x5c, 0x00, 0x33, 0x45, 0x13, 0x00, 0xb9, + 0x65, 0x4b, 0x7c, 0xb8, 0xe5, 0x00, 0x07, 0x33, 0x65, 0x4b, 0x3c, 0xb8, + 0x43, 0x07, 0x40, 0xb9, 0x85, 0x46, 0x40, 0x39, 0xa3, 0x10, 0x16, 0x33, + 0x43, 0x07, 0x00, 0xb9, 0x43, 0x07, 0x40, 0xb9, 0x85, 0x4a, 0x40, 0x39, + 0xa3, 0x10, 0x06, 0x33, 0x43, 0x07, 0x00, 0xb9, 0x43, 0x0b, 0x40, 0xb9, + 0x85, 0x4e, 0x40, 0x39, 0x88, 0x2e, 0x40, 0x79, 0x87, 0x32, 0x40, 0x79, + 0x86, 0x36, 0x40, 0x79, 0xa3, 0x10, 0x16, 0x33, 0x85, 0x3a, 0x40, 0x79, + 0x43, 0x0b, 0x00, 0xb9, 0x43, 0x0b, 0x40, 0xb9, 0x89, 0x52, 0x40, 0x39, + 0x23, 0x11, 0x06, 0x33, 0x43, 0x0b, 0x00, 0xb9, 0x43, 0x07, 0x40, 0xb9, + 0x03, 0x25, 0x00, 0x33, 0x43, 0x07, 0x00, 0xb9, 0x43, 0x07, 0x40, 0xb9, + 0xe3, 0x24, 0x10, 0x33, 0x43, 0x07, 0x00, 0xb9, 0x43, 0x0b, 0x40, 0xb9, + 0xc3, 0x24, 0x00, 0x33, 0x43, 0x0b, 0x00, 0xb9, 0x43, 0x0b, 0x40, 0xb9, + 0xa3, 0x24, 0x10, 0x33, 0x43, 0x0b, 0x00, 0xb9, 0x43, 0x4c, 0x42, 0xb8, + 0x83, 0x78, 0x38, 0xb8, 0x28, 0xfa, 0xff, 0x97, 0xe0, 0x37, 0x40, 0xf9, + 0xc0, 0xe5, 0x07, 0x36, 0x41, 0x27, 0x40, 0xb9, 0xe0, 0x03, 0x21, 0x2a, + 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x01, 0x4a, 0x40, 0x27, 0x00, 0xb9, + 0x28, 0xff, 0xff, 0x17, 0x15, 0x00, 0x80, 0x52, 0x23, 0xd0, 0xff, 0x35, + 0x80, 0x3a, 0x40, 0x79, 0x35, 0x00, 0x87, 0x52, 0x1f, 0x00, 0x00, 0x71, + 0xf5, 0x03, 0x95, 0x1a, 0x7c, 0xfe, 0xff, 0x17, 0x3f, 0xfc, 0x0f, 0x71, + 0x35, 0x00, 0x87, 0x52, 0xa9, 0xcf, 0xff, 0x54, 0xf3, 0x53, 0x41, 0xa9, + 0x50, 0xfe, 0xff, 0x17, 0x82, 0x0a, 0x40, 0x39, 0xe0, 0x03, 0x16, 0x2a, + 0x01, 0x00, 0x80, 0x52, 0xc0, 0xf9, 0xff, 0x97, 0x01, 0x27, 0x41, 0xb9, + 0x20, 0x0b, 0x19, 0x8b, 0x85, 0x0e, 0x40, 0x79, 0x00, 0x00, 0x00, 0x8b, + 0x84, 0x12, 0x40, 0x79, 0x21, 0x78, 0x03, 0x12, 0x83, 0x42, 0x40, 0x39, + 0x86, 0x0e, 0x40, 0x39, 0x01, 0x27, 0x01, 0xb9, 0xc1, 0x02, 0x00, 0x90, + 0x21, 0xa0, 0x26, 0x91, 0x02, 0x27, 0x41, 0xb9, 0x87, 0x0a, 0x40, 0x39, + 0x26, 0x68, 0x20, 0x38, 0xe2, 0x04, 0x08, 0x33, 0x02, 0x27, 0x01, 0xb9, + 0x00, 0x27, 0x41, 0xb9, 0x81, 0x12, 0x40, 0x39, 0x20, 0x00, 0x18, 0x33, + 0x00, 0x27, 0x01, 0xb9, 0x00, 0x27, 0x41, 0xb9, 0x81, 0x16, 0x40, 0x39, + 0x20, 0x04, 0x1c, 0x33, 0x00, 0x27, 0x01, 0xb9, 0x00, 0x2b, 0x41, 0xb9, + 0xa0, 0x30, 0x00, 0x33, 0x00, 0x2b, 0x01, 0xb9, 0x00, 0x2b, 0x41, 0xb9, + 0x80, 0x34, 0x10, 0x33, 0x00, 0x2b, 0x01, 0xb9, 0x00, 0x33, 0x41, 0xb9, + 0x81, 0x0e, 0x40, 0xb9, 0x20, 0x5c, 0x00, 0x33, 0x00, 0x33, 0x01, 0xb9, + 0x00, 0x33, 0x41, 0xb9, 0x60, 0x00, 0x04, 0x33, 0x00, 0x33, 0x01, 0xb9, + 0x00, 0x2f, 0x41, 0xb9, 0x81, 0x46, 0x40, 0x39, 0x20, 0x10, 0x00, 0x33, + 0x00, 0x2f, 0x01, 0xb9, 0x00, 0x2f, 0x41, 0xb9, 0x81, 0x4a, 0x40, 0x39, + 0x20, 0x10, 0x18, 0x33, 0x00, 0x2f, 0x01, 0xb9, 0x00, 0x2f, 0x41, 0xb9, + 0x81, 0x4e, 0x40, 0x39, 0x84, 0x2e, 0x40, 0x79, 0x83, 0x32, 0x40, 0x79, + 0x82, 0x36, 0x40, 0x79, 0x20, 0x10, 0x10, 0x33, 0x81, 0x3a, 0x40, 0x79, + 0x00, 0x2f, 0x01, 0xb9, 0x00, 0x2f, 0x41, 0xb9, 0x85, 0x52, 0x40, 0x39, + 0xa0, 0x10, 0x08, 0x33, 0x00, 0x2f, 0x01, 0xb9, 0x00, 0x37, 0x41, 0xb9, + 0x80, 0x24, 0x00, 0x33, 0x00, 0x37, 0x01, 0xb9, 0x00, 0x37, 0x41, 0xb9, + 0x60, 0x24, 0x10, 0x33, 0x00, 0x37, 0x01, 0xb9, 0x00, 0x3b, 0x41, 0xb9, + 0x40, 0x24, 0x00, 0x33, 0x00, 0x3b, 0x01, 0xb9, 0x00, 0x3b, 0x41, 0xb9, + 0x20, 0x24, 0x10, 0x33, 0x00, 0x3b, 0x01, 0xb9, 0x80, 0x7a, 0x40, 0x39, + 0x1f, 0x04, 0x00, 0x71, 0x61, 0x00, 0x00, 0x54, 0x80, 0x22, 0x40, 0xb9, + 0x00, 0x73, 0x01, 0xb9, 0x04, 0x7b, 0x41, 0xb9, 0xe2, 0x03, 0x14, 0xaa, + 0x01, 0x05, 0x80, 0xd2, 0x03, 0x03, 0x00, 0xb0, 0x63, 0x20, 0x38, 0x91, + 0xe0, 0x03, 0x24, 0x2a, 0x00, 0x00, 0x10, 0x12, 0x39, 0x7f, 0x01, 0x9b, + 0x00, 0x00, 0x04, 0x4a, 0x00, 0x7b, 0x01, 0xb9, 0x01, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x16, 0x2a, 0x44, 0x4c, 0x42, 0xb8, 0x64, 0x68, 0x39, 0xb8, + 0xb7, 0xf9, 0xff, 0x97, 0xda, 0x00, 0x00, 0x36, 0x01, 0x23, 0x41, 0xb9, + 0xe0, 0x03, 0x21, 0x2a, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x01, 0x4a, + 0x00, 0x23, 0x01, 0xb9, 0xe0, 0x03, 0x17, 0xaa, 0x4b, 0xf9, 0xff, 0x97, + 0xf5, 0x03, 0x00, 0x2a, 0xcb, 0xfd, 0xff, 0x17, 0xe0, 0x03, 0x18, 0xaa, + 0x47, 0xf9, 0xff, 0x97, 0xdc, 0xfd, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xb9, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0xf7, 0x63, 0x03, 0xa9, 0x17, 0x1c, 0x00, 0x12, 0xff, 0x1e, 0x00, 0x71, + 0x22, 0x98, 0x49, 0x7a, 0x68, 0x02, 0x00, 0x54, 0xf3, 0x53, 0x01, 0xa9, + 0x3f, 0x08, 0x00, 0x71, 0xf4, 0x03, 0x01, 0x2a, 0xe0, 0x1f, 0x80, 0x52, + 0xe1, 0x7f, 0x80, 0x52, 0xf3, 0x03, 0x02, 0xaa, 0x00, 0x30, 0x81, 0x1a, + 0x22, 0x02, 0x00, 0xb4, 0x41, 0x10, 0x40, 0x39, 0x35, 0x00, 0x87, 0x52, + 0x3f, 0x04, 0x00, 0x71, 0x89, 0x02, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, + 0xe0, 0x03, 0x15, 0x2a, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x75, 0x00, 0x87, 0x52, + 0xe0, 0x03, 0x15, 0x2a, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x55, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x42, 0x14, 0x40, 0x39, 0x5f, 0x08, 0x00, 0x71, 0x68, 0xfd, 0xff, 0x54, + 0x62, 0x46, 0x40, 0x39, 0x5f, 0x7c, 0x00, 0x71, 0x08, 0xfd, 0xff, 0x54, + 0x62, 0x4a, 0x40, 0x39, 0x5f, 0x7c, 0x00, 0x71, 0xa8, 0xfc, 0xff, 0x54, + 0x62, 0x4e, 0x40, 0x39, 0x5f, 0x7c, 0x00, 0x71, 0x48, 0xfc, 0xff, 0x54, + 0x62, 0x52, 0x40, 0x39, 0x5f, 0x7c, 0x00, 0x71, 0xe8, 0xfb, 0xff, 0x54, + 0x62, 0x2e, 0x40, 0x79, 0x63, 0x32, 0x40, 0x79, 0x64, 0x36, 0x40, 0x79, + 0x21, 0x0c, 0x00, 0x35, 0xa2, 0x00, 0x00, 0x35, 0x61, 0x1a, 0x40, 0xb9, + 0xa1, 0x06, 0x00, 0x35, 0x61, 0x3a, 0x40, 0x79, 0x61, 0x06, 0x00, 0x35, + 0x83, 0x1a, 0x00, 0x35, 0x24, 0x06, 0x00, 0x35, 0x61, 0x3a, 0x40, 0x79, + 0x01, 0x0b, 0x00, 0x34, 0x1f, 0x00, 0x02, 0x6b, 0x35, 0x00, 0x87, 0x52, + 0xe3, 0xf9, 0xff, 0x54, 0xf9, 0x6b, 0x04, 0xa9, 0xfb, 0x73, 0x05, 0xa9, + 0x3f, 0x00, 0x00, 0x6b, 0xe8, 0x05, 0x00, 0x54, 0xf5, 0x03, 0x00, 0x35, + 0x61, 0x0e, 0x40, 0x79, 0xe0, 0xff, 0x83, 0x52, 0x3f, 0x00, 0x00, 0x6b, + 0x48, 0x05, 0x00, 0x54, 0x61, 0x12, 0x40, 0x79, 0x3f, 0x00, 0x00, 0x6b, + 0xe8, 0x04, 0x00, 0x54, 0x61, 0x0e, 0x40, 0xb9, 0x00, 0xe0, 0xbf, 0x12, + 0x3f, 0x00, 0x00, 0x6b, 0x68, 0x04, 0x00, 0x54, 0xe1, 0x1e, 0x40, 0x92, + 0xf8, 0x03, 0x14, 0x2a, 0x02, 0x78, 0x80, 0xd2, 0x16, 0x0c, 0x80, 0xd2, + 0xc0, 0x02, 0x00, 0xb0, 0x00, 0xa0, 0x05, 0x91, 0x21, 0x7c, 0x02, 0x9b, + 0x9f, 0x06, 0x00, 0x71, 0x16, 0x07, 0x16, 0x9b, 0xd6, 0x02, 0x00, 0x8b, + 0x29, 0x04, 0x00, 0x54, 0xf9, 0x7e, 0x40, 0x93, 0x01, 0x01, 0x00, 0xd0, + 0x21, 0x80, 0x0d, 0x91, 0xe0, 0x03, 0x16, 0xaa, 0x3a, 0x78, 0x79, 0xf8, + 0xc6, 0xf8, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, 0xa0, 0x07, 0x00, 0x34, + 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x35, 0x00, 0x87, 0x52, + 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x35, 0x00, 0x87, 0x52, 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xfa, 0x7e, 0x40, 0x93, 0x01, 0x01, 0x00, 0xd0, 0x21, 0x80, 0x0f, 0x91, + 0xe0, 0x03, 0x16, 0xaa, 0x02, 0x07, 0x1a, 0x8b, 0x39, 0x78, 0x62, 0xf8, + 0xa5, 0xf8, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, 0x00, 0xfc, 0xff, 0x35, + 0x3b, 0x5b, 0x40, 0xb9, 0xe1, 0x03, 0x14, 0x2a, 0x23, 0x5b, 0x40, 0xb9, + 0xe0, 0x03, 0x17, 0x2a, 0x02, 0x00, 0x80, 0x52, 0x63, 0x78, 0x1f, 0x12, + 0x23, 0x5b, 0x00, 0xb9, 0x43, 0xf8, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, + 0xe0, 0x10, 0x00, 0x34, 0xe0, 0x03, 0x16, 0xaa, 0xaf, 0xf8, 0xff, 0x97, + 0xf3, 0x53, 0x41, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0x7c, 0xff, 0xff, 0x17, 0x15, 0x00, 0x80, 0x52, 0x1f, 0x00, 0x02, 0x6b, + 0xa3, 0xfa, 0xff, 0x54, 0x1f, 0x00, 0x03, 0x6b, 0x63, 0xfa, 0xff, 0x54, + 0x1f, 0x00, 0x04, 0x6b, 0x23, 0xfa, 0xff, 0x54, 0x61, 0x3a, 0x40, 0x79, + 0xf9, 0x6b, 0x04, 0xa9, 0xfb, 0x73, 0x05, 0xa9, 0xa4, 0xff, 0xff, 0x17, + 0x83, 0x05, 0x80, 0x52, 0xe1, 0x03, 0x14, 0x2a, 0xe0, 0x03, 0x17, 0x2a, + 0x02, 0x00, 0x80, 0x52, 0x83, 0x7e, 0x03, 0x1b, 0x7b, 0x60, 0x01, 0x51, + 0x5c, 0x43, 0x3b, 0x8b, 0x83, 0x2b, 0x40, 0xb9, 0x84, 0x2b, 0x40, 0xb9, + 0xe3, 0x6b, 0x00, 0xb9, 0x84, 0x78, 0x1f, 0x12, 0x84, 0x2b, 0x00, 0xb9, + 0x23, 0xf8, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, 0x20, 0xfc, 0xff, 0x35, + 0x41, 0x4b, 0x7b, 0xb8, 0x39, 0x0b, 0x19, 0x8b, 0x62, 0x02, 0x40, 0x39, + 0x39, 0x03, 0x19, 0x8b, 0x64, 0x0e, 0x40, 0x39, 0xc0, 0x02, 0x00, 0x90, + 0x00, 0x20, 0x1a, 0x91, 0x68, 0x0a, 0x40, 0x39, 0x41, 0x00, 0x0c, 0x33, + 0x41, 0x4b, 0x3b, 0xb8, 0x00, 0x00, 0x19, 0x8b, 0x67, 0x0e, 0x40, 0x79, + 0x82, 0x17, 0x40, 0xb9, 0x38, 0x03, 0x18, 0x8b, 0x66, 0x12, 0x40, 0x79, + 0xc1, 0x02, 0x00, 0x90, 0x21, 0x20, 0x0a, 0x91, 0x65, 0x42, 0x40, 0x39, + 0x02, 0x01, 0x16, 0x33, 0x82, 0x17, 0x00, 0xb9, 0x04, 0x48, 0x34, 0x38, + 0x62, 0x12, 0x40, 0x39, 0x40, 0x4b, 0x7b, 0xb8, 0x40, 0x00, 0x18, 0x33, + 0x40, 0x4b, 0x3b, 0xb8, 0x40, 0x4b, 0x7b, 0xb8, 0x62, 0x16, 0x40, 0x39, + 0x40, 0x04, 0x1c, 0x33, 0x40, 0x4b, 0x3b, 0xb8, 0x80, 0x0f, 0x40, 0xb9, + 0xe0, 0x30, 0x00, 0x33, 0x80, 0x0f, 0x00, 0xb9, 0x80, 0x0f, 0x40, 0xb9, + 0xc0, 0x34, 0x10, 0x33, 0x80, 0x0f, 0x00, 0xb9, 0x80, 0x13, 0x40, 0xb9, + 0x62, 0x0e, 0x40, 0xb9, 0x40, 0x5c, 0x00, 0x33, 0x80, 0x13, 0x00, 0xb9, + 0x40, 0x4b, 0x7b, 0xb8, 0xa0, 0x00, 0x07, 0x33, 0x40, 0x4b, 0x3b, 0xb8, + 0x62, 0x46, 0x40, 0x39, 0x80, 0x07, 0x40, 0xb9, 0x40, 0x10, 0x16, 0x33, + 0x80, 0x07, 0x00, 0xb9, 0x62, 0x4a, 0x40, 0x39, 0x80, 0x07, 0x40, 0xb9, + 0x40, 0x10, 0x06, 0x33, 0x80, 0x07, 0x00, 0xb9, 0x80, 0x0b, 0x40, 0xb9, + 0x62, 0x4e, 0x40, 0x39, 0x66, 0x2e, 0x40, 0x79, 0x65, 0x32, 0x40, 0x79, + 0x63, 0x36, 0x40, 0x79, 0x40, 0x10, 0x16, 0x33, 0x62, 0x3a, 0x40, 0x79, + 0x80, 0x0b, 0x00, 0xb9, 0x80, 0x0b, 0x40, 0xb9, 0x67, 0x52, 0x40, 0x39, + 0xe0, 0x10, 0x06, 0x33, 0x80, 0x0b, 0x00, 0xb9, 0x80, 0x07, 0x40, 0xb9, + 0xc0, 0x24, 0x00, 0x33, 0x80, 0x07, 0x00, 0xb9, 0x80, 0x07, 0x40, 0xb9, + 0xa0, 0x24, 0x10, 0x33, 0x80, 0x07, 0x00, 0xb9, 0x80, 0x0b, 0x40, 0xb9, + 0x60, 0x24, 0x00, 0x33, 0x80, 0x0b, 0x00, 0xb9, 0x80, 0x0b, 0x40, 0xb9, + 0x40, 0x24, 0x10, 0x33, 0x80, 0x0b, 0x00, 0xb9, 0x62, 0x22, 0x40, 0xb9, + 0x22, 0x78, 0x38, 0xb8, 0x84, 0x00, 0x00, 0x35, 0xe1, 0x03, 0x14, 0x2a, + 0xe0, 0x03, 0x17, 0x2a, 0x11, 0xf9, 0xff, 0x97, 0xe0, 0x37, 0x40, 0xf9, + 0xc0, 0x00, 0x00, 0x36, 0x81, 0x2b, 0x40, 0xb9, 0xe0, 0x03, 0x21, 0x2a, + 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x01, 0x4a, 0x80, 0x2b, 0x00, 0xb9, + 0xe0, 0x03, 0x16, 0xaa, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xfd, 0x7b, 0xc7, 0xa8, 0x32, 0xf8, 0xff, 0x17, 0x15, 0x00, 0x80, 0x52, + 0xe4, 0xf0, 0xff, 0x35, 0x61, 0x3a, 0x40, 0x79, 0x35, 0x00, 0x87, 0x52, + 0x3f, 0x00, 0x00, 0x71, 0xf5, 0x03, 0x95, 0x1a, 0x82, 0xff, 0xff, 0x17, + 0x00, 0x01, 0x00, 0xd0, 0x00, 0x80, 0x11, 0x91, 0x00, 0x78, 0x7a, 0xf8, + 0x34, 0x0c, 0x00, 0x35, 0x02, 0x18, 0x40, 0xb9, 0x01, 0x28, 0x40, 0xb9, + 0x41, 0x08, 0x0c, 0x33, 0x01, 0x28, 0x00, 0xb9, 0x22, 0x5b, 0x40, 0xb9, + 0x40, 0x0b, 0x1a, 0x8b, 0x63, 0x06, 0x40, 0x39, 0x00, 0x00, 0x00, 0x8b, + 0x65, 0x02, 0x40, 0x39, 0xc1, 0x02, 0x00, 0x90, 0x21, 0x20, 0x1a, 0x91, + 0x68, 0x0a, 0x40, 0x39, 0x67, 0x0e, 0x40, 0x79, 0x62, 0x14, 0x08, 0x33, + 0x66, 0x12, 0x40, 0x79, 0x21, 0x00, 0x00, 0x8b, 0x64, 0x0e, 0x40, 0x39, + 0x00, 0x00, 0x18, 0x8b, 0x22, 0x5b, 0x00, 0xb9, 0x03, 0x03, 0x00, 0xb0, + 0x63, 0xa0, 0x1c, 0x91, 0x24, 0x48, 0x34, 0x38, 0x22, 0x5b, 0x40, 0xb9, + 0xa2, 0x00, 0x10, 0x33, 0x65, 0x42, 0x40, 0x39, 0x22, 0x5b, 0x00, 0xb9, + 0x22, 0x5f, 0x40, 0xb9, 0xe1, 0x03, 0x02, 0x2a, 0x01, 0x01, 0x1c, 0x33, + 0x21, 0x5f, 0x00, 0xb9, 0x21, 0x5b, 0x40, 0xb9, 0x62, 0x12, 0x40, 0x39, + 0x41, 0x00, 0x18, 0x33, 0x21, 0x5b, 0x00, 0xb9, 0x21, 0x5b, 0x40, 0xb9, + 0x62, 0x16, 0x40, 0x39, 0x41, 0x04, 0x1c, 0x33, 0x21, 0x5b, 0x00, 0xb9, + 0x21, 0x5f, 0x40, 0xb9, 0xe1, 0x30, 0x10, 0x33, 0x21, 0x5f, 0x00, 0xb9, + 0x21, 0x6f, 0x40, 0xb9, 0xc1, 0x30, 0x00, 0x33, 0x21, 0x6f, 0x00, 0xb9, + 0x21, 0x7b, 0x40, 0xb9, 0x62, 0x0e, 0x40, 0xb9, 0x41, 0x5c, 0x00, 0x33, + 0x21, 0x7b, 0x00, 0xb9, 0x21, 0x6f, 0x40, 0xb9, 0xa1, 0x00, 0x04, 0x33, + 0x21, 0x6f, 0x00, 0xb9, 0x62, 0x46, 0x40, 0x39, 0x21, 0x77, 0x40, 0xb9, + 0x41, 0x10, 0x08, 0x33, 0x21, 0x77, 0x00, 0xb9, 0x21, 0x7b, 0x40, 0xb9, + 0x62, 0x4a, 0x40, 0x39, 0x67, 0x2e, 0x40, 0x79, 0x66, 0x32, 0x40, 0x79, + 0x65, 0x36, 0x40, 0x79, 0x41, 0x10, 0x08, 0x33, 0x62, 0x3a, 0x40, 0x79, + 0x21, 0x7b, 0x00, 0xb9, 0x21, 0x6b, 0x40, 0xb9, 0x68, 0x4e, 0x40, 0x39, + 0x01, 0x11, 0x10, 0x33, 0x21, 0x6b, 0x00, 0xb9, 0x21, 0x6b, 0x40, 0xb9, + 0x68, 0x52, 0x40, 0x39, 0x01, 0x11, 0x08, 0x33, 0x21, 0x6b, 0x00, 0xb9, + 0x21, 0x67, 0x40, 0xb9, 0xe1, 0x1c, 0x00, 0x33, 0x21, 0x67, 0x00, 0xb9, + 0x21, 0x67, 0x40, 0xb9, 0xc1, 0x1c, 0x18, 0x33, 0x21, 0x67, 0x00, 0xb9, + 0x21, 0x67, 0x40, 0xb9, 0xa1, 0x1c, 0x10, 0x33, 0x21, 0x67, 0x00, 0xb9, + 0x21, 0x67, 0x40, 0xb9, 0x41, 0x1c, 0x08, 0x33, 0x21, 0x67, 0x00, 0xb9, + 0x62, 0x22, 0x40, 0xb9, 0x62, 0x78, 0x20, 0xb8, 0x84, 0x00, 0x00, 0x35, + 0xe1, 0x03, 0x14, 0x2a, 0xe0, 0x03, 0x17, 0x2a, 0x9e, 0xf8, 0xff, 0x97, + 0x9b, 0xf2, 0x07, 0x36, 0x21, 0x5b, 0x40, 0xb9, 0xe0, 0x03, 0x21, 0x2a, + 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x01, 0x4a, 0x20, 0x5b, 0x00, 0xb9, + 0x8e, 0xff, 0xff, 0x17, 0x02, 0x10, 0x40, 0xb9, 0x01, 0x28, 0x40, 0xb9, + 0x42, 0x7c, 0x14, 0x53, 0x41, 0x08, 0x08, 0x33, 0x01, 0x28, 0x00, 0xb9, + 0x9f, 0xff, 0xff, 0x17, 0x03, 0x1c, 0x40, 0x92, 0x60, 0x00, 0x87, 0x52, + 0x7f, 0x1c, 0x00, 0x71, 0x22, 0x98, 0x4a, 0x7a, 0xc8, 0x11, 0x00, 0x54, + 0x7f, 0x04, 0x00, 0x71, 0x60, 0x00, 0x87, 0x52, 0x20, 0x88, 0x42, 0x7a, + 0x40, 0x11, 0x00, 0x54, 0x41, 0x11, 0x00, 0x35, 0x64, 0x7c, 0x40, 0x93, + 0x00, 0x01, 0x00, 0xd0, 0x00, 0x80, 0x18, 0x91, 0x05, 0x05, 0x80, 0xd2, + 0x07, 0x03, 0x00, 0xb0, 0xe7, 0x20, 0x38, 0x91, 0x00, 0x78, 0x64, 0xf8, + 0x84, 0x7c, 0x05, 0x9b, 0x05, 0x20, 0x41, 0xb9, 0xa5, 0x00, 0x00, 0x12, + 0x45, 0xa0, 0x00, 0x39, 0x06, 0x24, 0x41, 0xb9, 0x05, 0x24, 0x41, 0xb9, + 0xc6, 0x70, 0x5c, 0xd3, 0x46, 0x00, 0x00, 0x39, 0xa5, 0x64, 0x58, 0xd3, + 0x45, 0x08, 0x00, 0x39, 0x06, 0x24, 0x41, 0xb9, 0x05, 0x24, 0x41, 0xb9, + 0xc6, 0x50, 0x54, 0xd3, 0x46, 0x0c, 0x00, 0x39, 0xa5, 0x20, 0x48, 0xd3, + 0x45, 0x10, 0x00, 0x39, 0x05, 0x24, 0x41, 0xb9, 0xa5, 0x14, 0x44, 0xd3, + 0x45, 0x14, 0x00, 0x39, 0x08, 0x28, 0x41, 0xb9, 0x05, 0x28, 0x41, 0xb9, + 0x06, 0x30, 0x41, 0xb9, 0x08, 0x31, 0x00, 0x12, 0x48, 0x0c, 0x00, 0x79, + 0xc6, 0x5c, 0x00, 0x12, 0x46, 0x0c, 0x00, 0xb9, 0xa5, 0x74, 0x50, 0xd3, + 0x45, 0x10, 0x00, 0x79, 0x05, 0x30, 0x41, 0xb9, 0x06, 0x2c, 0x41, 0xb9, + 0xc6, 0x10, 0x00, 0x12, 0x46, 0x44, 0x00, 0x39, 0xa5, 0x70, 0x5c, 0xd3, + 0x45, 0x40, 0x00, 0x39, 0x05, 0x2c, 0x41, 0xb9, 0xa5, 0x30, 0x48, 0xd3, + 0x45, 0x48, 0x00, 0x39, 0x05, 0x2c, 0x41, 0xb9, 0xa5, 0x50, 0x50, 0xd3, + 0x45, 0x4c, 0x00, 0x39, 0x05, 0x2c, 0x41, 0xb9, 0xa5, 0x70, 0x58, 0xd3, + 0x45, 0x50, 0x00, 0x39, 0x06, 0x34, 0x41, 0xb9, 0x05, 0x34, 0x41, 0xb9, + 0xc6, 0x24, 0x00, 0x12, 0x46, 0x2c, 0x00, 0x79, 0xa5, 0x64, 0x50, 0xd3, + 0x45, 0x30, 0x00, 0x79, 0x06, 0x38, 0x41, 0xb9, 0x05, 0x38, 0x41, 0xb9, + 0xe7, 0x68, 0x64, 0xb8, 0xc4, 0x24, 0x00, 0x12, 0x06, 0x70, 0x41, 0xb9, + 0xa0, 0x64, 0x50, 0xd3, 0x44, 0x34, 0x00, 0x79, 0x40, 0x38, 0x00, 0x79, + 0x46, 0x1c, 0x04, 0x29, 0x20, 0x0c, 0x00, 0x51, 0x1f, 0x1c, 0x00, 0x71, + 0xe8, 0x18, 0x00, 0x54, 0x04, 0x01, 0x00, 0xd0, 0x84, 0x80, 0x13, 0x91, + 0x00, 0x05, 0x80, 0x52, 0xc7, 0x02, 0x00, 0x90, 0xe7, 0x20, 0x0f, 0x91, + 0x21, 0x7c, 0x00, 0x1b, 0x00, 0x00, 0x80, 0x52, 0x85, 0x78, 0x63, 0xf8, + 0x21, 0xe0, 0x01, 0x51, 0xa4, 0x40, 0x21, 0x8b, 0x86, 0x24, 0x40, 0xb9, + 0xc6, 0x00, 0x00, 0x12, 0x46, 0xa0, 0x00, 0x39, 0x86, 0x14, 0x40, 0xb9, + 0xa8, 0x48, 0x61, 0xb8, 0x5f, 0x08, 0x00, 0x39, 0xc6, 0x28, 0x4a, 0xd3, + 0x46, 0x00, 0x00, 0x39, 0xa9, 0x48, 0x61, 0xb8, 0x08, 0x51, 0x54, 0xd3, + 0xa6, 0x48, 0x61, 0xb8, 0x48, 0x04, 0x00, 0x39, 0xff, 0x77, 0x49, 0x6b, + 0xc6, 0x20, 0x48, 0xd3, 0x46, 0x10, 0x00, 0x39, 0xe6, 0x07, 0x9f, 0x1a, + 0x46, 0x0c, 0x00, 0x39, 0xa6, 0x48, 0x61, 0xb8, 0xc6, 0x14, 0x44, 0xd3, + 0x46, 0x14, 0x00, 0x39, 0x89, 0x0c, 0x40, 0xb9, 0x86, 0x44, 0x41, 0xb9, + 0x88, 0x10, 0x40, 0xb9, 0x29, 0x31, 0x00, 0x12, 0x49, 0x0c, 0x00, 0x79, + 0x08, 0x5d, 0x00, 0x12, 0x48, 0x0c, 0x00, 0xb9, 0xc6, 0x7c, 0x08, 0x53, + 0x46, 0x10, 0x00, 0x79, 0xa5, 0x48, 0x61, 0xb8, 0x81, 0x04, 0x40, 0xb9, + 0xa5, 0x64, 0x59, 0xd3, 0x45, 0x40, 0x00, 0x39, 0x21, 0x38, 0x4a, 0xd3, + 0x41, 0x44, 0x00, 0x39, 0x81, 0x04, 0x40, 0xb9, 0x21, 0x78, 0x5a, 0xd3, + 0x41, 0x48, 0x00, 0x39, 0x81, 0x08, 0x40, 0xb9, 0x21, 0x38, 0x4a, 0xd3, + 0x41, 0x4c, 0x00, 0x39, 0x81, 0x08, 0x40, 0xb9, 0x21, 0x78, 0x5a, 0xd3, + 0x41, 0x50, 0x00, 0x39, 0x81, 0x04, 0x40, 0xb9, 0x21, 0x24, 0x00, 0x12, + 0x41, 0x2c, 0x00, 0x79, 0x86, 0x04, 0x40, 0xb9, 0x85, 0x08, 0x40, 0xb9, + 0x81, 0x08, 0x40, 0xb9, 0xe7, 0x78, 0x63, 0xb8, 0xc4, 0x64, 0x50, 0xd3, + 0xa3, 0x24, 0x00, 0x12, 0x44, 0x30, 0x00, 0x79, 0x21, 0x64, 0x50, 0xd3, + 0x43, 0x34, 0x00, 0x79, 0x41, 0x38, 0x00, 0x79, 0x5f, 0x1c, 0x04, 0x29, + 0xc0, 0x03, 0x5f, 0xd6, 0x3f, 0x04, 0x00, 0x71, 0x81, 0x08, 0x00, 0x54, + 0x01, 0x01, 0x00, 0xd0, 0x21, 0x80, 0x18, 0x91, 0x04, 0x03, 0x00, 0xb0, + 0x84, 0x20, 0x38, 0x91, 0x05, 0x05, 0x80, 0xd2, 0x00, 0x00, 0x80, 0x52, + 0x21, 0x78, 0x63, 0xf8, 0x63, 0x10, 0x05, 0x9b, 0x24, 0x48, 0x41, 0xb9, + 0x84, 0x00, 0x00, 0x12, 0x44, 0xa0, 0x00, 0x39, 0x25, 0x4c, 0x41, 0xb9, + 0x24, 0x4c, 0x41, 0xb9, 0xa5, 0x70, 0x5c, 0xd3, 0x45, 0x00, 0x00, 0x39, + 0x84, 0x64, 0x58, 0xd3, 0x84, 0x08, 0x00, 0x11, 0x44, 0x08, 0x00, 0x39, + 0x25, 0x4c, 0x41, 0xb9, 0x24, 0x4c, 0x41, 0xb9, 0xa5, 0x50, 0x54, 0xd3, + 0x45, 0x0c, 0x00, 0x39, 0x84, 0x20, 0x48, 0xd3, 0x44, 0x10, 0x00, 0x39, + 0x24, 0x4c, 0x41, 0xb9, 0x84, 0x14, 0x44, 0xd3, 0x44, 0x14, 0x00, 0x39, + 0x26, 0x50, 0x41, 0xb9, 0x24, 0x50, 0x41, 0xb9, 0x25, 0x58, 0x41, 0xb9, + 0xc6, 0x30, 0x00, 0x12, 0x46, 0x0c, 0x00, 0x79, 0xa5, 0x5c, 0x00, 0x12, + 0x45, 0x0c, 0x00, 0xb9, 0x84, 0x74, 0x50, 0xd3, 0x44, 0x10, 0x00, 0x79, + 0x24, 0x58, 0x41, 0xb9, 0x25, 0x54, 0x41, 0xb9, 0xa5, 0x10, 0x00, 0x12, + 0x45, 0x44, 0x00, 0x39, 0x84, 0x70, 0x5c, 0xd3, 0x44, 0x40, 0x00, 0x39, + 0x24, 0x54, 0x41, 0xb9, 0x84, 0x30, 0x48, 0xd3, 0x44, 0x48, 0x00, 0x39, + 0x24, 0x54, 0x41, 0xb9, 0x84, 0x50, 0x50, 0xd3, 0x44, 0x4c, 0x00, 0x39, + 0x24, 0x54, 0x41, 0xb9, 0x84, 0x70, 0x58, 0xd3, 0x44, 0x50, 0x00, 0x39, + 0x25, 0x5c, 0x41, 0xb9, 0x24, 0x5c, 0x41, 0xb9, 0xa5, 0x24, 0x00, 0x12, + 0x45, 0x2c, 0x00, 0x79, 0x84, 0x64, 0x50, 0xd3, 0x44, 0x30, 0x00, 0x79, + 0x25, 0x60, 0x41, 0xb9, 0x24, 0x60, 0x41, 0xb9, 0x66, 0x04, 0x40, 0xb9, + 0xa3, 0x24, 0x00, 0x12, 0x25, 0x74, 0x41, 0xb9, 0x81, 0x64, 0x50, 0xd3, + 0x43, 0x34, 0x00, 0x79, 0x41, 0x38, 0x00, 0x79, 0x45, 0x18, 0x04, 0x29, + 0xc0, 0x03, 0x5f, 0xd6, 0x3f, 0x08, 0x00, 0x71, 0x41, 0xee, 0xff, 0x54, + 0x01, 0x01, 0x00, 0xd0, 0x21, 0x40, 0x0d, 0x91, 0xc4, 0x02, 0x00, 0x90, + 0x84, 0x20, 0x29, 0x91, 0x00, 0x00, 0x80, 0x52, 0x21, 0x78, 0x63, 0xf8, + 0x25, 0xfc, 0x40, 0xb9, 0x5f, 0x08, 0x00, 0x39, 0xa5, 0x00, 0x00, 0x12, + 0x45, 0xa0, 0x00, 0x39, 0x26, 0x10, 0x41, 0xb9, 0x25, 0x00, 0x41, 0xb9, + 0xc6, 0x70, 0x5c, 0xd3, 0x46, 0x0c, 0x00, 0x39, 0xa5, 0x20, 0x48, 0xd3, + 0x45, 0x10, 0x00, 0x39, 0x25, 0x00, 0x41, 0xb9, 0xa5, 0x14, 0x44, 0xd3, + 0x45, 0x14, 0x00, 0x39, 0x27, 0x04, 0x41, 0xb9, 0x25, 0x04, 0x41, 0xb9, + 0x26, 0x10, 0x41, 0xb9, 0xe7, 0x30, 0x00, 0x12, 0x47, 0x0c, 0x00, 0x79, + 0xc6, 0x5c, 0x00, 0x12, 0x46, 0x0c, 0x00, 0xb9, 0xa5, 0x74, 0x50, 0xd3, + 0x45, 0x10, 0x00, 0x79, 0x25, 0x10, 0x41, 0xb9, 0x26, 0x0c, 0x41, 0xb9, + 0xc6, 0x10, 0x00, 0x12, 0x46, 0x44, 0x00, 0x39, 0xa5, 0x70, 0x5c, 0xd3, + 0x45, 0x40, 0x00, 0x39, 0x25, 0x0c, 0x41, 0xb9, 0xa5, 0x30, 0x48, 0xd3, + 0x45, 0x48, 0x00, 0x39, 0x25, 0x0c, 0x41, 0xb9, 0xa5, 0x50, 0x50, 0xd3, + 0x45, 0x4c, 0x00, 0x39, 0x25, 0x0c, 0x41, 0xb9, 0xa5, 0x70, 0x58, 0xd3, + 0x45, 0x50, 0x00, 0x39, 0x27, 0x14, 0x41, 0xb9, 0x26, 0x14, 0x41, 0xb9, + 0x25, 0x18, 0x41, 0xb9, 0xe7, 0x24, 0x00, 0x12, 0x47, 0x2c, 0x00, 0x79, + 0xc6, 0x64, 0x50, 0xd3, 0xa5, 0x24, 0x00, 0x12, 0x46, 0x30, 0x00, 0x79, + 0x45, 0x34, 0x00, 0x79, 0x21, 0x18, 0x41, 0xb9, 0x83, 0x78, 0x63, 0xb8, + 0x43, 0x24, 0x00, 0xb9, 0x21, 0x64, 0x50, 0xd3, 0x41, 0x38, 0x00, 0x79, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x40, 0x92, + 0x1f, 0x1c, 0x00, 0x71, 0x22, 0x98, 0x49, 0x7a, 0xc8, 0x11, 0x00, 0x54, + 0x3f, 0x04, 0x00, 0x71, 0x09, 0x09, 0x00, 0x54, 0x05, 0x01, 0x00, 0xb0, + 0xa5, 0x80, 0x0d, 0x91, 0x84, 0x05, 0x80, 0x52, 0x03, 0x08, 0x00, 0x8b, + 0x63, 0x00, 0x03, 0x8b, 0xa6, 0x02, 0x00, 0xf0, 0xc6, 0x20, 0x0a, 0x91, + 0x24, 0x7c, 0x04, 0x1b, 0xa5, 0x78, 0x60, 0xf8, 0x84, 0x60, 0x01, 0x51, + 0x61, 0x40, 0x21, 0x8b, 0x00, 0x00, 0x80, 0x52, 0xa3, 0x40, 0x24, 0x8b, + 0x67, 0x28, 0x40, 0xb9, 0x5f, 0x04, 0x00, 0x39, 0xe7, 0x00, 0x00, 0x12, + 0x47, 0x90, 0x00, 0x39, 0xaa, 0x48, 0x64, 0xb8, 0x69, 0x14, 0x40, 0xb9, + 0xa7, 0x48, 0x64, 0xb8, 0xa8, 0x48, 0x64, 0xb8, 0x4a, 0x51, 0x54, 0xd3, + 0x29, 0x29, 0x4a, 0xd3, 0x49, 0x08, 0x00, 0x39, 0xe7, 0x70, 0x5c, 0xd3, + 0x47, 0x0c, 0x00, 0x39, 0x08, 0x21, 0x48, 0xd3, 0x48, 0x10, 0x00, 0x39, + 0x4a, 0x00, 0x00, 0x39, 0xa7, 0x48, 0x64, 0xb8, 0xe7, 0x14, 0x44, 0xd3, + 0x47, 0x14, 0x00, 0x39, 0x69, 0x0c, 0x40, 0xb9, 0x67, 0x0c, 0x40, 0xb9, + 0x68, 0x10, 0x40, 0xb9, 0x29, 0x31, 0x00, 0x12, 0x49, 0x0c, 0x00, 0x79, + 0x08, 0x5d, 0x00, 0x12, 0x48, 0x0c, 0x00, 0xb9, 0xe7, 0x74, 0x50, 0xd3, + 0x47, 0x10, 0x00, 0x79, 0xa5, 0x48, 0x64, 0xb8, 0x64, 0x04, 0x40, 0xb9, + 0xa5, 0x64, 0x59, 0xd3, 0x45, 0x40, 0x00, 0x39, 0x84, 0x38, 0x4a, 0xd3, + 0x44, 0x44, 0x00, 0x39, 0x64, 0x04, 0x40, 0xb9, 0x84, 0x78, 0x5a, 0xd3, + 0x44, 0x48, 0x00, 0x39, 0x64, 0x08, 0x40, 0xb9, 0x84, 0x38, 0x4a, 0xd3, + 0x44, 0x4c, 0x00, 0x39, 0x64, 0x08, 0x40, 0xb9, 0x84, 0x78, 0x5a, 0xd3, + 0x44, 0x50, 0x00, 0x39, 0x64, 0x04, 0x40, 0xb9, 0x84, 0x24, 0x00, 0x12, + 0x44, 0x2c, 0x00, 0x79, 0x65, 0x04, 0x40, 0xb9, 0x64, 0x08, 0x40, 0xb9, + 0x63, 0x08, 0x40, 0xb9, 0xc6, 0x78, 0x61, 0xb8, 0xa1, 0x64, 0x50, 0xd3, + 0x84, 0x24, 0x00, 0x12, 0x41, 0x30, 0x00, 0x79, 0x61, 0x64, 0x50, 0xd3, + 0x44, 0x34, 0x00, 0x79, 0x41, 0x38, 0x00, 0x79, 0x46, 0x20, 0x00, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0xe1, 0x03, 0x01, 0x2a, 0x03, 0x01, 0x00, 0xb0, + 0x63, 0x80, 0x0f, 0x91, 0x24, 0x04, 0x00, 0x8b, 0x00, 0x08, 0x00, 0x8b, + 0x06, 0x03, 0x00, 0x90, 0xc6, 0xa0, 0x1c, 0x91, 0x63, 0x78, 0x64, 0xf8, + 0x21, 0x04, 0x00, 0x8b, 0x00, 0x00, 0x80, 0x52, 0x64, 0x58, 0x40, 0xb9, + 0x84, 0x00, 0x00, 0x12, 0x44, 0x90, 0x00, 0x39, 0x64, 0x58, 0x40, 0xb9, + 0x84, 0x74, 0x58, 0xd3, 0x44, 0x04, 0x00, 0x39, 0x67, 0x58, 0x40, 0xb9, + 0x65, 0x5c, 0x40, 0xb9, 0x64, 0x58, 0x40, 0xb9, 0xe7, 0x40, 0x50, 0xd3, + 0x47, 0x00, 0x00, 0x39, 0xa5, 0x10, 0x44, 0xd3, 0x45, 0x08, 0x00, 0x39, + 0x84, 0x20, 0x48, 0xd3, 0x44, 0x10, 0x00, 0x39, 0x5f, 0x0c, 0x00, 0x39, + 0x64, 0x58, 0x40, 0xb9, 0x84, 0x14, 0x44, 0xd3, 0x44, 0x14, 0x00, 0x39, + 0x64, 0x5c, 0x40, 0xb9, 0x67, 0x6c, 0x40, 0xb9, 0x65, 0x78, 0x40, 0xb9, + 0x84, 0x70, 0x50, 0xd3, 0x44, 0x0c, 0x00, 0x79, 0xa5, 0x5c, 0x00, 0x12, + 0x45, 0x0c, 0x00, 0xb9, 0xe7, 0x30, 0x00, 0x12, 0x65, 0x6c, 0x40, 0xb9, + 0x64, 0x74, 0x40, 0xb9, 0x47, 0x10, 0x00, 0x79, 0xa5, 0x70, 0x5c, 0xd3, + 0x45, 0x40, 0x00, 0x39, 0x84, 0x70, 0x58, 0xd3, 0x44, 0x44, 0x00, 0x39, + 0x64, 0x78, 0x40, 0xb9, 0x84, 0x70, 0x58, 0xd3, 0x44, 0x48, 0x00, 0x39, + 0x64, 0x68, 0x40, 0xb9, 0x84, 0x50, 0x50, 0xd3, 0x44, 0x4c, 0x00, 0x39, + 0x64, 0x68, 0x40, 0xb9, 0x84, 0x70, 0x58, 0xd3, 0x44, 0x50, 0x00, 0x39, + 0x64, 0x64, 0x40, 0xb9, 0x84, 0x1c, 0x00, 0x12, 0x44, 0x2c, 0x00, 0x79, + 0x65, 0x64, 0x40, 0xb9, 0x64, 0x64, 0x40, 0xb9, 0x63, 0x64, 0x40, 0xb9, + 0xc6, 0x78, 0x61, 0xb8, 0xa1, 0x3c, 0x48, 0xd3, 0x84, 0x5c, 0x50, 0xd3, + 0x41, 0x30, 0x00, 0x79, 0x61, 0x7c, 0x18, 0x53, 0x44, 0x34, 0x00, 0x79, + 0x41, 0x38, 0x00, 0x79, 0x46, 0x20, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x00, 0x87, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0x16, 0x1c, 0x00, 0x12, 0xdf, 0x1e, 0x00, 0x71, 0x42, 0x98, 0x49, 0x7a, + 0x28, 0x07, 0x00, 0x54, 0x35, 0x1c, 0x00, 0x12, 0xc1, 0x1e, 0x40, 0x92, + 0x03, 0x78, 0x80, 0xd2, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x02, 0x2a, + 0xe2, 0x03, 0x02, 0x2a, 0x14, 0x0c, 0x80, 0xd2, 0x21, 0x7c, 0x03, 0x9b, + 0xf7, 0x63, 0x03, 0xa9, 0xc0, 0x02, 0x00, 0x90, 0x00, 0xa0, 0x05, 0x91, + 0x54, 0x04, 0x14, 0x9b, 0x7f, 0x06, 0x00, 0x71, 0x94, 0x02, 0x00, 0x8b, + 0xa9, 0x01, 0x00, 0x54, 0xc2, 0x7e, 0x40, 0x93, 0x01, 0x01, 0x00, 0xb0, + 0x21, 0x80, 0x0d, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0x37, 0x78, 0x62, 0xf8, + 0xe1, 0xf5, 0xff, 0x97, 0xe0, 0x04, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xc1, 0x1e, 0x7e, 0xd3, 0xa0, 0x02, 0x00, 0xf0, + 0x00, 0x20, 0x1a, 0x91, 0x21, 0x00, 0x36, 0x8b, 0x42, 0x04, 0x36, 0x8b, + 0x03, 0x01, 0x00, 0xb0, 0x63, 0x80, 0x0f, 0x91, 0x01, 0x04, 0x01, 0x8b, + 0xe0, 0x03, 0x14, 0xaa, 0x38, 0x48, 0x73, 0x38, 0x77, 0x78, 0x62, 0xf8, + 0xcf, 0xf5, 0xff, 0x97, 0xe0, 0xfd, 0xff, 0x35, 0x38, 0x04, 0x00, 0x35, + 0xe0, 0x5a, 0x40, 0xb9, 0xa0, 0x02, 0x00, 0x33, 0xe0, 0x5a, 0x00, 0xb9, + 0xe0, 0x03, 0x14, 0xaa, 0xe0, 0xf5, 0xff, 0x97, 0x1f, 0x00, 0x00, 0x71, + 0xa4, 0x0a, 0x40, 0x7a, 0xc0, 0xfc, 0xff, 0x54, 0xe1, 0x03, 0x13, 0x2a, + 0xe0, 0x03, 0x16, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xd2, 0xf7, 0xff, 0x17, + 0x60, 0x00, 0x87, 0x52, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x81, 0x05, 0x80, 0x52, 0xe0, 0x03, 0x14, 0xaa, + 0x61, 0x7e, 0x01, 0x1b, 0x21, 0x60, 0x01, 0x51, 0xe1, 0x42, 0x21, 0x8b, + 0x22, 0x28, 0x40, 0xb9, 0xa2, 0x02, 0x00, 0x33, 0x22, 0x28, 0x00, 0xb9, + 0xc9, 0xf5, 0xff, 0x97, 0x1f, 0x00, 0x00, 0x71, 0xa4, 0x0a, 0x40, 0x7a, + 0xe0, 0xf9, 0xff, 0x54, 0xe9, 0xff, 0xff, 0x17, 0x75, 0xfc, 0xff, 0x35, + 0xe1, 0x5a, 0x40, 0xb9, 0xe0, 0x03, 0x14, 0xaa, 0xf3, 0x53, 0x41, 0xa9, + 0x21, 0x78, 0x1f, 0x12, 0xf5, 0x5b, 0x42, 0xa9, 0xe1, 0x5a, 0x00, 0xb9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xbb, 0xf5, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xba, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x33, 0x00, 0x87, 0x52, + 0xf9, 0x6b, 0x04, 0xa9, 0x79, 0x1c, 0x00, 0x12, 0xfb, 0x73, 0x05, 0xa9, + 0x5c, 0x1c, 0x00, 0x72, 0x20, 0x0b, 0x40, 0x7a, 0xc0, 0x07, 0x00, 0x54, + 0xf7, 0x63, 0x03, 0xa9, 0x17, 0x1c, 0x00, 0x12, 0xf3, 0x1e, 0x40, 0x92, + 0x00, 0x78, 0x80, 0xd2, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x02, 0x00, 0x90, + 0xb5, 0xa2, 0x0c, 0x91, 0x73, 0x7e, 0x00, 0x9b, 0x3a, 0x1c, 0x00, 0x12, + 0xf6, 0x02, 0x00, 0x90, 0xd6, 0xa2, 0x09, 0x91, 0x7b, 0x02, 0x15, 0x8b, + 0x73, 0x82, 0x01, 0x91, 0xe0, 0x03, 0x1b, 0xaa, 0x75, 0x02, 0x15, 0x8b, + 0x87, 0xf5, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x15, 0xaa, + 0x84, 0xf5, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0xff, 0x0e, 0x00, 0x71, + 0x04, 0x0c, 0x80, 0xd2, 0x84, 0x80, 0x9f, 0x9a, 0x74, 0x02, 0x14, 0x2a, + 0xd6, 0x02, 0x04, 0x8b, 0xf8, 0x97, 0x9f, 0x1a, 0xe0, 0x03, 0x16, 0xaa, + 0x7b, 0xf5, 0xff, 0x97, 0x94, 0x02, 0x00, 0x2a, 0xd4, 0x04, 0x00, 0x35, + 0xf7, 0x7e, 0x40, 0x93, 0x18, 0x7f, 0x40, 0x93, 0x01, 0x01, 0x00, 0xb0, + 0x21, 0x80, 0x18, 0x91, 0x00, 0x01, 0x00, 0xb0, 0x00, 0x40, 0x0d, 0x91, + 0x22, 0x78, 0x77, 0xf8, 0x01, 0x78, 0x78, 0xf8, 0xbc, 0x04, 0x00, 0x35, + 0x40, 0x48, 0x41, 0xb9, 0x40, 0x03, 0x00, 0x33, 0x40, 0x48, 0x01, 0xb9, + 0x22, 0xfc, 0x40, 0xb9, 0xe0, 0x03, 0x1b, 0xaa, 0x42, 0x03, 0x00, 0x33, + 0x22, 0xfc, 0x00, 0xb9, 0x22, 0x08, 0x40, 0xb9, 0x42, 0x03, 0x16, 0x33, + 0x22, 0x08, 0x00, 0xb9, 0x7d, 0xf5, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x15, 0xaa, 0x7a, 0xf5, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x16, 0xaa, 0x77, 0xf5, 0xff, 0x97, 0x14, 0x03, 0x00, 0x35, + 0xbf, 0x02, 0x00, 0x71, 0x13, 0x00, 0x95, 0x1a, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x40, 0x20, 0x41, 0xb9, 0x40, 0x03, 0x00, 0x33, 0x40, 0x20, 0x01, 0xb9, + 0x99, 0xfb, 0xff, 0x34, 0xd8, 0xff, 0xff, 0x17, 0xf3, 0x03, 0x14, 0x2a, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xea, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x01, 0xaa, + 0x13, 0x00, 0x80, 0xd2, 0xf5, 0x13, 0x00, 0xf9, 0x15, 0x1c, 0x00, 0x12, + 0x04, 0x00, 0x00, 0x14, 0x73, 0x06, 0x00, 0x91, 0x7f, 0x2a, 0x00, 0xf1, + 0x00, 0x01, 0x00, 0x54, 0x80, 0x6a, 0x73, 0x38, 0x80, 0xff, 0xff, 0x34, + 0xa0, 0x22, 0x13, 0x2a, 0x73, 0x06, 0x00, 0x91, 0x89, 0xf6, 0xff, 0x97, + 0x7f, 0x2a, 0x00, 0xf1, 0x41, 0xff, 0xff, 0x54, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1c, 0x00, 0x12, + 0x7f, 0x1c, 0x00, 0x71, 0x42, 0x98, 0x4a, 0x7a, 0x48, 0x09, 0x00, 0x54, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x02, 0x2a, 0xf5, 0x5b, 0x02, 0xa9, 0x35, 0x1c, 0x00, 0x12, + 0x42, 0x03, 0x00, 0x34, 0x5f, 0x04, 0x00, 0x71, 0xe0, 0x05, 0x00, 0x54, + 0x5f, 0x08, 0x00, 0x71, 0x21, 0x08, 0x00, 0x54, 0x7f, 0x04, 0x00, 0x71, + 0x60, 0x00, 0x87, 0x52, 0x08, 0x07, 0x00, 0x54, 0xf3, 0x02, 0x00, 0x90, + 0x73, 0xa2, 0x09, 0x91, 0x00, 0x0c, 0x80, 0x52, 0x62, 0x7c, 0x40, 0x93, + 0x01, 0x01, 0x00, 0xb0, 0x21, 0x40, 0x0d, 0x91, 0x73, 0x4c, 0xa0, 0x9b, + 0xe0, 0x03, 0x13, 0xaa, 0x34, 0x78, 0x62, 0xf8, 0x0d, 0xf5, 0xff, 0x97, + 0xa0, 0x05, 0x00, 0x35, 0x81, 0x02, 0x41, 0xb9, 0xe0, 0x03, 0x21, 0x2a, + 0x35, 0x0c, 0x00, 0x34, 0x00, 0x00, 0x14, 0x12, 0x00, 0x00, 0x01, 0x4a, + 0x80, 0x02, 0x01, 0xb9, 0x13, 0x00, 0x00, 0x14, 0xf3, 0x02, 0x00, 0x90, + 0x60, 0xa2, 0x0c, 0x91, 0x73, 0x1c, 0x40, 0x92, 0x02, 0x78, 0x80, 0xd2, + 0x63, 0x7c, 0x40, 0x93, 0x01, 0x01, 0x00, 0xb0, 0x21, 0x80, 0x18, 0x91, + 0x73, 0x02, 0x02, 0x9b, 0xe0, 0x03, 0x13, 0xaa, 0x34, 0x78, 0x63, 0xf8, + 0xfa, 0xf4, 0xff, 0x97, 0x40, 0x03, 0x00, 0x35, 0x81, 0x26, 0x41, 0xb9, + 0xe0, 0x03, 0x21, 0x2a, 0x75, 0x07, 0x00, 0x34, 0x00, 0x00, 0x14, 0x12, + 0x00, 0x00, 0x01, 0x4a, 0x80, 0x26, 0x01, 0xb9, 0xe0, 0x03, 0x13, 0xaa, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0x06, 0xf5, 0xff, 0x17, 0x60, 0x1c, 0x40, 0x92, 0x13, 0x78, 0x80, 0xd2, + 0x63, 0x7c, 0x40, 0x93, 0x01, 0x01, 0x00, 0xb0, 0x21, 0x80, 0x18, 0x91, + 0xe2, 0x02, 0x00, 0x90, 0x42, 0xa0, 0x0c, 0x91, 0x13, 0x7c, 0x13, 0x9b, + 0x73, 0x82, 0x01, 0x91, 0x73, 0x02, 0x02, 0x8b, 0xe0, 0x03, 0x13, 0xaa, + 0x34, 0x78, 0x63, 0xf8, 0xe1, 0xf4, 0xff, 0x97, 0x20, 0x05, 0x00, 0x34, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x87, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x1c, 0x40, 0x92, 0x54, 0x04, 0x00, 0x51, 0x04, 0x78, 0x80, 0xd2, + 0x02, 0x0c, 0x80, 0x52, 0x63, 0x7c, 0x40, 0x93, 0x01, 0x01, 0x00, 0xb0, + 0x21, 0x80, 0x13, 0x91, 0x00, 0x7c, 0x04, 0x9b, 0x94, 0x02, 0xa2, 0x9b, + 0xe0, 0x02, 0x00, 0x90, 0x00, 0xa0, 0x0c, 0x91, 0x94, 0x02, 0x00, 0x8b, + 0xe0, 0x03, 0x14, 0xaa, 0x36, 0x78, 0x63, 0xf8, 0xcb, 0xf4, 0xff, 0x97, + 0x60, 0xfd, 0xff, 0x35, 0x00, 0x05, 0x80, 0x52, 0x73, 0x7e, 0x00, 0x1b, + 0x73, 0xe2, 0x01, 0x51, 0xc1, 0x4a, 0x73, 0xb8, 0xe0, 0x03, 0x21, 0x2a, + 0x95, 0x02, 0x00, 0x35, 0x00, 0x00, 0x10, 0x12, 0x00, 0x00, 0x01, 0x4a, + 0xc0, 0x4a, 0x33, 0xb8, 0xe0, 0x03, 0x14, 0xaa, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xd4, 0xf4, 0xff, 0x17, + 0x00, 0x00, 0x10, 0x12, 0x00, 0x00, 0x01, 0x4a, 0x80, 0x26, 0x01, 0xb9, + 0xc6, 0xff, 0xff, 0x17, 0x81, 0x4e, 0x41, 0xb9, 0xe0, 0x03, 0x21, 0x2a, + 0x35, 0x01, 0x00, 0x34, 0x00, 0x00, 0x14, 0x12, 0x00, 0x00, 0x01, 0x4a, + 0x80, 0x4e, 0x01, 0xb9, 0xbf, 0xff, 0xff, 0x17, 0x00, 0x00, 0x14, 0x12, + 0x00, 0x00, 0x01, 0x4a, 0xc0, 0x4a, 0x33, 0xb8, 0xed, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x10, 0x12, 0x00, 0x00, 0x01, 0x4a, 0x80, 0x4e, 0x01, 0xb9, + 0xb7, 0xff, 0xff, 0x17, 0x00, 0x00, 0x10, 0x12, 0x00, 0x00, 0x01, 0x4a, + 0x80, 0x02, 0x01, 0xb9, 0xb3, 0xff, 0xff, 0x17, 0x3f, 0x28, 0x00, 0x71, + 0x05, 0x1c, 0x40, 0x92, 0xc8, 0x04, 0x00, 0x54, 0xbf, 0x04, 0x00, 0x71, + 0x60, 0x00, 0x87, 0x52, 0x20, 0x88, 0x42, 0x7a, 0x20, 0x04, 0x00, 0x54, + 0x61, 0x04, 0x00, 0x35, 0xbf, 0x1c, 0x00, 0x71, 0xc8, 0x03, 0x00, 0x54, + 0x00, 0x01, 0x00, 0xb0, 0x00, 0x80, 0x18, 0x91, 0x00, 0x78, 0x65, 0xf8, + 0x22, 0x01, 0x00, 0xb4, 0x05, 0x3c, 0x41, 0xb9, 0xe1, 0x03, 0x25, 0x2a, + 0x21, 0x00, 0x10, 0x12, 0x21, 0x00, 0x05, 0x4a, 0x01, 0x3c, 0x01, 0xb9, + 0x01, 0x3c, 0x41, 0xb9, 0x21, 0x28, 0x42, 0xd3, 0x41, 0x00, 0x00, 0x39, + 0x83, 0x01, 0x00, 0xb4, 0x02, 0x40, 0x41, 0xb9, 0xe1, 0x03, 0x22, 0x2a, + 0x21, 0x00, 0x01, 0x12, 0x21, 0x00, 0x02, 0x4a, 0x01, 0x40, 0x01, 0xb9, + 0x02, 0x40, 0x41, 0xb9, 0x01, 0x44, 0x41, 0xb9, 0x42, 0x0c, 0x60, 0xd3, + 0xe1, 0x03, 0x01, 0x2a, 0x21, 0x00, 0x02, 0xaa, 0x61, 0x00, 0x00, 0xf9, + 0x84, 0x09, 0x00, 0xb4, 0x01, 0x78, 0x41, 0xb9, 0x00, 0x00, 0x80, 0x52, + 0x21, 0x00, 0x00, 0x12, 0x81, 0x00, 0x00, 0x39, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x00, 0x87, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x3f, 0x04, 0x00, 0x71, + 0x60, 0x04, 0x00, 0x54, 0x3f, 0x08, 0x00, 0x71, 0x60, 0x08, 0x00, 0x54, + 0x06, 0x01, 0x00, 0xb0, 0xc6, 0x80, 0x13, 0x91, 0x00, 0x05, 0x80, 0x52, + 0x20, 0x7c, 0x00, 0x1b, 0xc1, 0x78, 0x65, 0xf8, 0x00, 0xe0, 0x01, 0x51, + 0x20, 0x40, 0x20, 0x8b, 0x22, 0x01, 0x00, 0xb4, 0x05, 0x14, 0x40, 0xb9, + 0xe1, 0x03, 0x25, 0x2a, 0x21, 0x00, 0x14, 0x12, 0x21, 0x00, 0x05, 0x4a, + 0x01, 0x14, 0x00, 0xb9, 0x01, 0x14, 0x40, 0xb9, 0x21, 0x60, 0x50, 0xd3, + 0x41, 0x00, 0x00, 0x39, 0x83, 0x01, 0x00, 0xb4, 0x02, 0x14, 0x40, 0xb9, + 0xe1, 0x03, 0x22, 0x2a, 0x21, 0x00, 0x04, 0x12, 0x21, 0x00, 0x02, 0x4a, + 0x01, 0x14, 0x00, 0xb9, 0x01, 0x1c, 0x40, 0xb9, 0x00, 0x18, 0x40, 0xb9, + 0x21, 0x0c, 0x60, 0xd3, 0xe0, 0x03, 0x00, 0x2a, 0x00, 0x00, 0x01, 0xaa, + 0x60, 0x00, 0x00, 0xf9, 0x84, 0x04, 0x00, 0xb4, 0x00, 0x00, 0x80, 0x52, + 0x9f, 0x00, 0x00, 0x39, 0xc0, 0x03, 0x5f, 0xd6, 0xbf, 0x1c, 0x00, 0x71, + 0x08, 0xfb, 0xff, 0x54, 0x00, 0x01, 0x00, 0xb0, 0x00, 0x80, 0x18, 0x91, + 0x00, 0x78, 0x65, 0xf8, 0x22, 0x01, 0x00, 0xb4, 0x05, 0x64, 0x41, 0xb9, + 0xe1, 0x03, 0x25, 0x2a, 0x21, 0x00, 0x10, 0x12, 0x21, 0x00, 0x05, 0x4a, + 0x01, 0x64, 0x01, 0xb9, 0x01, 0x64, 0x41, 0xb9, 0x21, 0x28, 0x42, 0xd3, + 0x41, 0x00, 0x00, 0x39, 0x83, 0x01, 0x00, 0xb4, 0x02, 0x68, 0x41, 0xb9, + 0xe1, 0x03, 0x22, 0x2a, 0x21, 0x00, 0x01, 0x12, 0x21, 0x00, 0x02, 0x4a, + 0x01, 0x68, 0x01, 0xb9, 0x02, 0x68, 0x41, 0xb9, 0x01, 0x6c, 0x41, 0xb9, + 0x42, 0x0c, 0x60, 0xd3, 0xe1, 0x03, 0x01, 0x2a, 0x21, 0x00, 0x02, 0xaa, + 0x61, 0x00, 0x00, 0xf9, 0xc4, 0x00, 0x00, 0xb4, 0x01, 0x78, 0x41, 0xb9, + 0x00, 0x00, 0x80, 0x52, 0x21, 0x10, 0x44, 0xd3, 0x81, 0x00, 0x00, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x01, 0x00, 0xb0, 0x00, 0x40, 0x0d, 0x91, 0x00, 0x78, 0x65, 0xf8, + 0x22, 0x01, 0x00, 0xb4, 0x05, 0x1c, 0x41, 0xb9, 0xe1, 0x03, 0x25, 0x2a, + 0x21, 0x00, 0x10, 0x12, 0x21, 0x00, 0x05, 0x4a, 0x01, 0x1c, 0x01, 0xb9, + 0x01, 0x1c, 0x41, 0xb9, 0x21, 0x28, 0x42, 0xd3, 0x41, 0x00, 0x00, 0x39, + 0xc3, 0xf9, 0xff, 0xb4, 0x02, 0x20, 0x41, 0xb9, 0xe1, 0x03, 0x22, 0x2a, + 0x21, 0x00, 0x01, 0x12, 0x21, 0x00, 0x02, 0x4a, 0x01, 0x20, 0x01, 0xb9, + 0x01, 0x20, 0x41, 0xb9, 0x00, 0x24, 0x41, 0xb9, 0x21, 0x0c, 0x60, 0xd3, + 0xe0, 0x03, 0x00, 0x2a, 0x00, 0x00, 0x01, 0xaa, 0x60, 0x00, 0x00, 0xf9, + 0xc2, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb5, 0xa9, 0xe7, 0x03, 0x00, 0x2a, + 0x04, 0x00, 0x80, 0xd2, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x2c, 0x48, 0xd3, 0xe1, 0x03, 0x13, 0x2a, 0x63, 0x0e, 0x7d, 0xd3, + 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x63, 0x01, 0x91, 0x16, 0x1c, 0x00, 0x12, + 0xa3, 0x02, 0x03, 0x8b, 0xe0, 0x03, 0x16, 0x2a, 0x02, 0x00, 0x80, 0xd2, + 0xf7, 0x63, 0x03, 0xa9, 0xf7, 0x03, 0x13, 0x2a, 0xf9, 0x6b, 0x04, 0xa9, + 0xff, 0xff, 0x05, 0xa9, 0xff, 0xff, 0x06, 0xa9, 0xff, 0xff, 0x07, 0xa9, + 0xff, 0xff, 0x08, 0xa9, 0xff, 0xff, 0x09, 0xa9, 0xff, 0x57, 0x00, 0xf9, + 0x5d, 0xff, 0xff, 0x97, 0x1f, 0x00, 0x00, 0x71, 0xe4, 0x1c, 0x00, 0x12, + 0xf4, 0x03, 0x00, 0x2a, 0x60, 0x0a, 0x42, 0x7a, 0x09, 0x06, 0x00, 0x54, + 0x98, 0x7c, 0x40, 0x93, 0x01, 0x01, 0x00, 0xb0, 0x21, 0x80, 0x14, 0x91, + 0x60, 0x0e, 0x00, 0x51, 0x21, 0x78, 0x78, 0xf8, 0x21, 0x04, 0x41, 0xb9, + 0x21, 0x1c, 0x00, 0x12, 0x20, 0x28, 0xc0, 0x1a, 0xa0, 0x06, 0x00, 0x36, + 0xa7, 0x7a, 0x77, 0xf8, 0x01, 0x0b, 0x18, 0x8b, 0x21, 0x00, 0x01, 0x8b, + 0xa3, 0x02, 0x00, 0xf0, 0x63, 0xa0, 0x26, 0x91, 0x69, 0x06, 0x00, 0x51, + 0x63, 0x00, 0x01, 0x8b, 0x2b, 0x00, 0x09, 0x8b, 0x05, 0x03, 0x00, 0x90, + 0xa5, 0x20, 0x3d, 0x91, 0x00, 0x03, 0x00, 0x90, 0x00, 0x60, 0x3e, 0x91, + 0xa6, 0x02, 0x00, 0xf0, 0xc6, 0xa0, 0x1c, 0x91, 0xac, 0x00, 0x01, 0x8b, + 0x42, 0x01, 0x80, 0x52, 0x01, 0x00, 0x01, 0x8b, 0x6a, 0x48, 0x69, 0x38, + 0x82, 0x24, 0xa2, 0x9b, 0xe8, 0x03, 0x09, 0xaa, 0xc3, 0x78, 0x6b, 0xf8, + 0x5f, 0x01, 0x00, 0x71, 0x3f, 0x48, 0x29, 0x38, 0xe1, 0x17, 0x9f, 0x1a, + 0x9f, 0x49, 0x29, 0x38, 0xf9, 0x03, 0x04, 0x2a, 0x21, 0x04, 0x00, 0x11, + 0xa5, 0x00, 0x02, 0x8b, 0x00, 0x00, 0x02, 0x8b, 0x7f, 0x00, 0x07, 0xeb, + 0xda, 0x0c, 0x02, 0x8b, 0x20, 0x22, 0x00, 0x54, 0x01, 0x0b, 0x18, 0x8b, + 0xa2, 0x02, 0x00, 0xf0, 0x42, 0xe0, 0x27, 0x91, 0x41, 0x04, 0x01, 0x8b, + 0x3f, 0xc8, 0x28, 0x38, 0x2e, 0x00, 0x00, 0x14, 0x20, 0x02, 0x00, 0x34, + 0xe2, 0x03, 0x00, 0x2a, 0x03, 0x01, 0x00, 0x90, 0xe5, 0x03, 0x13, 0x2a, + 0x63, 0x80, 0x3c, 0x91, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x8d, 0xaf, 0xff, 0x97, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfd, 0x7b, 0xcb, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x07, 0x00, 0x80, 0xd2, 0xbf, 0x7a, 0x37, 0xf8, + 0xcb, 0xff, 0xff, 0x17, 0x7f, 0x0a, 0x00, 0x71, 0xf9, 0x03, 0x04, 0x2a, + 0xc1, 0x10, 0x00, 0x54, 0xa1, 0x02, 0x00, 0xf0, 0x21, 0xe0, 0x0f, 0x91, + 0x98, 0x7c, 0x40, 0x93, 0xa2, 0x02, 0x00, 0xf0, 0x42, 0xa0, 0x0f, 0x91, + 0xa5, 0x02, 0x00, 0xf0, 0xa5, 0x40, 0x29, 0x91, 0xa0, 0x02, 0x00, 0xf0, + 0x00, 0x60, 0x29, 0x91, 0x21, 0xc8, 0x64, 0x38, 0x43, 0x78, 0x78, 0xf8, + 0x3f, 0x00, 0x00, 0x71, 0xe7, 0x37, 0x40, 0xf9, 0xbf, 0xc8, 0x24, 0x38, + 0x1f, 0xc8, 0x24, 0x38, 0xe1, 0x17, 0x9f, 0x1a, 0x21, 0x04, 0x00, 0x11, + 0x5a, 0x0c, 0x19, 0x8b, 0xa5, 0x00, 0x19, 0x8b, 0x00, 0x00, 0x19, 0x8b, + 0x7f, 0x00, 0x07, 0xeb, 0x00, 0x19, 0x00, 0x54, 0xa1, 0x02, 0x00, 0xf0, + 0x21, 0x00, 0x10, 0x91, 0x3f, 0xc8, 0x24, 0x38, 0x21, 0x00, 0x80, 0x52, + 0xa1, 0x00, 0x00, 0x39, 0x01, 0x00, 0x00, 0x39, 0xe0, 0x03, 0x04, 0x2a, + 0xe1, 0x03, 0x13, 0x2a, 0x02, 0x00, 0x80, 0x52, 0x59, 0xf3, 0xff, 0x97, + 0xa0, 0x7a, 0x77, 0xf8, 0x40, 0x03, 0x00, 0xf9, 0x7f, 0x0a, 0x00, 0x71, + 0x60, 0x13, 0x00, 0x54, 0x20, 0x0b, 0x19, 0x8b, 0x00, 0x00, 0x00, 0x8b, + 0xe9, 0x13, 0x00, 0x54, 0x73, 0x06, 0x00, 0x51, 0x17, 0x03, 0x00, 0x90, + 0xf7, 0xa2, 0x3f, 0x91, 0x60, 0x02, 0x00, 0x8b, 0xf7, 0x12, 0x00, 0x8b, + 0xdf, 0x0e, 0x00, 0x71, 0xe6, 0x97, 0x9f, 0x1a, 0xe7, 0x06, 0x40, 0xf9, + 0xa7, 0xf8, 0xff, 0xb4, 0xe5, 0x02, 0x40, 0xb9, 0x22, 0x00, 0x80, 0x52, + 0xe5, 0x00, 0x00, 0x36, 0xc0, 0x1e, 0x7e, 0xd3, 0x01, 0x03, 0x00, 0x90, + 0x21, 0x20, 0x3d, 0x91, 0x00, 0x00, 0x36, 0x8b, 0x00, 0x00, 0x00, 0x8b, + 0x22, 0x68, 0x60, 0x38, 0xa5, 0x0f, 0x08, 0x36, 0xc0, 0x1e, 0x7e, 0xd3, + 0x01, 0x03, 0x00, 0x90, 0x21, 0x20, 0x3d, 0x91, 0x00, 0x00, 0x36, 0x8b, + 0x20, 0x04, 0x00, 0x8b, 0x00, 0x04, 0x40, 0x39, 0x1f, 0x00, 0x00, 0x71, + 0x42, 0x04, 0x82, 0x1a, 0xc5, 0x00, 0x10, 0x36, 0xa0, 0x02, 0x00, 0xf0, + 0x00, 0x40, 0x29, 0x91, 0x00, 0xc8, 0x66, 0x38, 0x1f, 0x00, 0x00, 0x71, + 0x42, 0x04, 0x82, 0x1a, 0x94, 0xf5, 0xff, 0x35, 0x00, 0x03, 0x00, 0x90, + 0x03, 0x20, 0x3d, 0x91, 0x40, 0x01, 0x80, 0x52, 0x61, 0x00, 0x80, 0x52, + 0x24, 0x00, 0x80, 0x52, 0xc0, 0x0e, 0xa0, 0x9b, 0x08, 0x00, 0x00, 0x14, + 0x03, 0x08, 0x40, 0x39, 0x21, 0x04, 0x00, 0x11, 0x00, 0x04, 0x00, 0x91, + 0x7f, 0x00, 0x00, 0x71, 0x42, 0x04, 0x82, 0x1a, 0x3f, 0x2c, 0x00, 0x71, + 0x20, 0x01, 0x00, 0x54, 0x83, 0x20, 0xc1, 0x1a, 0x7f, 0x00, 0x05, 0x6a, + 0xe1, 0xfe, 0xff, 0x54, 0x21, 0x04, 0x00, 0x11, 0x42, 0x04, 0x00, 0x11, + 0x00, 0x04, 0x00, 0x91, 0x3f, 0x2c, 0x00, 0x71, 0x21, 0xff, 0xff, 0x54, + 0x5f, 0x2c, 0x00, 0x71, 0x81, 0xf2, 0xff, 0x54, 0xc1, 0x1e, 0x7e, 0xd3, + 0x00, 0x03, 0x00, 0x90, 0x00, 0x60, 0x3e, 0x91, 0x21, 0x00, 0x36, 0x8b, + 0x29, 0x00, 0x01, 0x8b, 0xca, 0x7c, 0x40, 0x93, 0xac, 0x02, 0x00, 0xf0, + 0x8c, 0xa1, 0x0f, 0x91, 0xa6, 0x02, 0x00, 0xf0, 0xc6, 0xa0, 0x1c, 0x91, + 0xab, 0x02, 0x00, 0xf0, 0x6b, 0x61, 0x29, 0x91, 0x00, 0x00, 0x09, 0x8b, + 0x01, 0x00, 0x80, 0x52, 0x24, 0x00, 0x80, 0x52, 0x82, 0x20, 0xc1, 0x1a, + 0x5f, 0x00, 0x05, 0x6a, 0x41, 0x07, 0x00, 0x54, 0x3f, 0x04, 0x00, 0x71, + 0x69, 0x0c, 0x00, 0x54, 0x3f, 0x08, 0x00, 0x71, 0xa0, 0x0b, 0x00, 0x54, + 0x22, 0x04, 0x00, 0x51, 0x03, 0x00, 0x80, 0xd2, 0x28, 0x41, 0x22, 0x8b, + 0x1f, 0x48, 0x22, 0x38, 0xdf, 0x78, 0x28, 0xf8, 0xa3, 0x5a, 0x21, 0xf8, + 0x21, 0x04, 0x00, 0x11, 0x3f, 0x28, 0x00, 0x71, 0x29, 0xfe, 0xff, 0x54, + 0xe2, 0x03, 0x14, 0x2a, 0xe1, 0x03, 0x15, 0xaa, 0xe0, 0x03, 0x16, 0x2a, + 0xe0, 0x00, 0x3f, 0xd6, 0x70, 0xff, 0xff, 0x17, 0x80, 0x1c, 0x7e, 0xd3, + 0xa1, 0x02, 0x00, 0xf0, 0x21, 0xa0, 0x26, 0x91, 0x00, 0x00, 0x24, 0x8b, + 0x03, 0x00, 0x00, 0x8b, 0x05, 0x03, 0x00, 0x90, 0xa5, 0x20, 0x3d, 0x91, + 0x21, 0x00, 0x03, 0x8b, 0xa8, 0x00, 0x03, 0x8b, 0x67, 0x00, 0x17, 0x8b, + 0xa6, 0x02, 0x00, 0xf0, 0xc6, 0xa0, 0x1c, 0x91, 0x00, 0x03, 0x00, 0x90, + 0x00, 0x60, 0x3e, 0x91, 0x09, 0x00, 0x03, 0x8b, 0x42, 0x01, 0x80, 0x52, + 0x21, 0x48, 0x73, 0x38, 0x98, 0x7c, 0x40, 0x93, 0x82, 0x5c, 0xa2, 0x9b, + 0x1f, 0x49, 0x33, 0x38, 0xc8, 0x78, 0x67, 0xf8, 0x3f, 0x00, 0x00, 0x71, + 0xa7, 0x7a, 0x77, 0xf8, 0x3f, 0x49, 0x33, 0x38, 0xe1, 0x17, 0x9f, 0x1a, + 0xda, 0x0c, 0x02, 0x8b, 0xa5, 0x00, 0x02, 0x8b, 0x00, 0x00, 0x02, 0x8b, + 0x21, 0x04, 0x00, 0x11, 0x1f, 0x01, 0x07, 0xeb, 0x62, 0x1e, 0x00, 0x12, + 0x60, 0x08, 0x00, 0x54, 0x5f, 0x08, 0x00, 0x71, 0x88, 0x0c, 0x00, 0x54, + 0xa1, 0x02, 0x00, 0xf0, 0x21, 0xe0, 0x27, 0x91, 0x23, 0x00, 0x03, 0x8b, + 0x7f, 0xc8, 0x33, 0x38, 0x6e, 0xff, 0xff, 0x17, 0x3f, 0x08, 0x00, 0x71, + 0x60, 0x01, 0x00, 0x54, 0x89, 0x03, 0x00, 0x54, 0x22, 0x04, 0x00, 0x51, + 0x23, 0x41, 0x22, 0x8b, 0x02, 0x48, 0x62, 0x38, 0xc3, 0x78, 0x63, 0xf8, + 0x42, 0x20, 0xc1, 0x1a, 0x94, 0x02, 0x02, 0x2a, 0xc7, 0xff, 0xff, 0x17, + 0x42, 0x04, 0x00, 0x11, 0x8b, 0xff, 0xff, 0x17, 0x61, 0x69, 0x6a, 0x38, + 0x82, 0x79, 0x6a, 0xf8, 0x94, 0x0a, 0x01, 0x2a, 0x61, 0x00, 0x80, 0x52, + 0xe2, 0x37, 0x00, 0xf9, 0xb3, 0xff, 0xff, 0x17, 0xb7, 0x02, 0x00, 0xf0, + 0xf7, 0x82, 0x29, 0x91, 0xf8, 0x12, 0x18, 0x8b, 0xe6, 0x03, 0x16, 0x2a, + 0xf7, 0x12, 0x19, 0x8b, 0x16, 0x0f, 0x40, 0x39, 0x6a, 0xff, 0xff, 0x17, + 0xf7, 0x02, 0x00, 0x8b, 0x00, 0x03, 0x00, 0x90, 0x00, 0xa0, 0x3f, 0x91, + 0x17, 0x10, 0x17, 0x8b, 0x63, 0xff, 0xff, 0x17, 0x03, 0x48, 0x61, 0x38, + 0xe2, 0x03, 0x01, 0x2a, 0x28, 0x01, 0x02, 0x8b, 0x63, 0x20, 0xc1, 0x1a, + 0x94, 0x02, 0x03, 0x2a, 0xc3, 0x78, 0x68, 0xf8, 0x21, 0x04, 0x00, 0x11, + 0xa3, 0x7a, 0x22, 0xf8, 0x9e, 0xff, 0xff, 0x17, 0x02, 0x00, 0x80, 0xd2, + 0x7f, 0x69, 0x2a, 0x38, 0x9f, 0x79, 0x2a, 0xf8, 0xe5, 0xff, 0xff, 0x17, + 0xe2, 0x03, 0x01, 0x2a, 0x1f, 0x48, 0x21, 0x38, 0x28, 0x01, 0x02, 0x8b, + 0x03, 0x00, 0x80, 0xd2, 0xdf, 0x78, 0x28, 0xf8, 0xf4, 0xff, 0xff, 0x17, + 0xa2, 0x02, 0x00, 0xf0, 0x42, 0x00, 0x10, 0x91, 0x40, 0xc8, 0x64, 0x38, + 0x00, 0x04, 0x00, 0x11, 0x03, 0x1c, 0x00, 0x12, 0x3f, 0x00, 0x20, 0x6b, + 0xe9, 0x03, 0x00, 0x54, 0x43, 0xc8, 0x24, 0x38, 0x47, 0x03, 0x00, 0xf9, + 0x0e, 0xff, 0xff, 0x17, 0x5f, 0x08, 0x00, 0x71, 0x88, 0x01, 0x00, 0x54, + 0xa0, 0x02, 0x00, 0xf0, 0x00, 0xe0, 0x27, 0x91, 0x00, 0x00, 0x03, 0x8b, + 0x02, 0xc8, 0x73, 0x38, 0x42, 0x04, 0x00, 0x11, 0x43, 0x1c, 0x00, 0x12, + 0x3f, 0x00, 0x22, 0x6b, 0x09, 0x03, 0x00, 0x54, 0x03, 0xc8, 0x33, 0x38, + 0x47, 0x03, 0x00, 0xf9, 0x01, 0xff, 0xff, 0x17, 0x68, 0x06, 0x00, 0x51, + 0x1f, 0x20, 0x03, 0xd5, 0x00, 0x0b, 0x18, 0x8b, 0xa2, 0x02, 0x00, 0xf0, + 0x42, 0xe0, 0x27, 0x91, 0x40, 0x04, 0x00, 0x8b, 0x02, 0xc8, 0x68, 0x38, + 0x42, 0x04, 0x00, 0x11, 0x43, 0x1c, 0x00, 0x12, 0x3f, 0x00, 0x22, 0x6b, + 0x09, 0x01, 0x00, 0x54, 0x03, 0xc8, 0x28, 0x38, 0x47, 0x03, 0x00, 0xf9, + 0xf3, 0xfe, 0xff, 0x17, 0x5f, 0xc8, 0x24, 0x38, 0x20, 0x00, 0x80, 0x52, + 0xa0, 0x00, 0x00, 0x39, 0x17, 0xff, 0xff, 0x17, 0x1f, 0xc8, 0x28, 0x38, + 0xfc, 0xff, 0xff, 0x17, 0x1f, 0xc8, 0x33, 0x38, 0xfa, 0xff, 0xff, 0x17, + 0x68, 0x06, 0x00, 0x51, 0xdb, 0xfe, 0xff, 0x17, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x01, 0xaa, + 0x13, 0x00, 0x80, 0xd2, 0xf5, 0x13, 0x00, 0xf9, 0x15, 0x1c, 0x00, 0x12, + 0x05, 0x00, 0x00, 0x14, 0x00, 0x20, 0x03, 0x2a, 0x8b, 0xfe, 0xff, 0x97, + 0x7f, 0x2e, 0x00, 0xf1, 0x60, 0x01, 0x00, 0x54, 0x82, 0x6a, 0x73, 0x38, + 0x7f, 0x0a, 0x00, 0xf1, 0xe3, 0x03, 0x13, 0x2a, 0xe0, 0x03, 0x15, 0x2a, + 0x73, 0x06, 0x00, 0x91, 0x22, 0xff, 0xff, 0x34, 0xc1, 0xfe, 0xff, 0x54, + 0xbf, 0x0e, 0x00, 0x71, 0xe0, 0x97, 0x9f, 0x1a, 0xf3, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0x08, 0x1c, 0x00, 0x12, 0xe7, 0x03, 0x01, 0x2a, + 0xfd, 0x03, 0x00, 0x91, 0xe0, 0x03, 0x08, 0x2a, 0xe3, 0x63, 0x00, 0x91, + 0x04, 0x00, 0x80, 0xd2, 0x02, 0x00, 0x80, 0xd2, 0xff, 0x0f, 0x00, 0xf9, + 0xe3, 0xfd, 0xff, 0x97, 0x60, 0x03, 0x00, 0x35, 0xff, 0x08, 0x00, 0x71, + 0xe5, 0x0f, 0x40, 0xf9, 0x60, 0x06, 0x00, 0x54, 0x28, 0x03, 0x00, 0x54, + 0x01, 0x1d, 0x7e, 0xd3, 0xe3, 0x02, 0x00, 0xf0, 0x63, 0x20, 0x3d, 0x91, + 0x21, 0x00, 0x28, 0x8b, 0x21, 0x00, 0x01, 0x8b, 0xe2, 0x02, 0x00, 0xf0, + 0x42, 0x60, 0x3e, 0x91, 0x2a, 0x40, 0x27, 0x8b, 0x63, 0x00, 0x01, 0x8b, + 0xa9, 0x02, 0x00, 0xd0, 0x29, 0xa1, 0x1c, 0x91, 0x41, 0x00, 0x01, 0x8b, + 0x06, 0x7d, 0x40, 0x93, 0xe4, 0x1c, 0x00, 0x12, 0x7f, 0x48, 0x27, 0x38, + 0x3f, 0x48, 0x27, 0x38, 0x25, 0x79, 0x2a, 0xf8, 0xc6, 0x08, 0x06, 0x8b, + 0xa1, 0x02, 0x00, 0xd0, 0x21, 0xe0, 0x27, 0x91, 0x26, 0x04, 0x06, 0x8b, + 0xdf, 0xc8, 0x24, 0x38, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x02, 0x1d, 0x7e, 0xd3, 0xe3, 0x04, 0x00, 0x51, 0x42, 0x00, 0x28, 0x8b, + 0xe4, 0x02, 0x00, 0xf0, 0x84, 0x20, 0x3d, 0x91, 0x42, 0x00, 0x02, 0x8b, + 0xe1, 0x02, 0x00, 0xf0, 0x21, 0x60, 0x3e, 0x91, 0x4a, 0x40, 0x23, 0x8b, + 0x84, 0x00, 0x02, 0x8b, 0x21, 0x00, 0x02, 0x8b, 0xa9, 0x02, 0x00, 0xd0, + 0x29, 0xa1, 0x1c, 0x91, 0xe6, 0x1c, 0x00, 0x12, 0x9f, 0x48, 0x23, 0x38, + 0xdf, 0x08, 0x00, 0x71, 0x3f, 0x48, 0x23, 0x38, 0x06, 0x7d, 0x40, 0x93, + 0x25, 0x79, 0x2a, 0xf8, 0xa1, 0x02, 0x00, 0x54, 0xa1, 0x02, 0x00, 0xd0, + 0x21, 0x00, 0x10, 0x91, 0x3f, 0xc8, 0x28, 0x38, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x06, 0x7d, 0x40, 0x93, 0xa4, 0x02, 0x00, 0xd0, + 0x84, 0xa0, 0x0f, 0x91, 0xa3, 0x02, 0x00, 0xd0, 0x63, 0x40, 0x29, 0x91, + 0xa2, 0x02, 0x00, 0xd0, 0x42, 0x60, 0x29, 0x91, 0xa1, 0x02, 0x00, 0xd0, + 0x21, 0x00, 0x10, 0x91, 0x85, 0x78, 0x26, 0xf8, 0x7f, 0xc8, 0x28, 0x38, + 0x5f, 0xc8, 0x28, 0x38, 0x3f, 0xc8, 0x28, 0x38, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe4, 0x1c, 0x00, 0x12, 0x09, 0xfa, 0xff, 0x54, + 0xa1, 0x02, 0x00, 0xd0, 0x21, 0xe0, 0x27, 0x91, 0x84, 0x04, 0x00, 0x51, + 0x22, 0x00, 0x02, 0x8b, 0x5f, 0xc8, 0x24, 0x38, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x1c, 0x00, 0x12, 0x9f, 0x1e, 0x00, 0x71, + 0x42, 0x98, 0x4a, 0x7a, 0x48, 0x04, 0x00, 0x54, 0x9f, 0x06, 0x00, 0x71, + 0xf3, 0x03, 0x02, 0x2a, 0x40, 0x88, 0x42, 0x7a, 0xc0, 0x03, 0x00, 0x54, + 0xf5, 0x5b, 0x02, 0xa9, 0x82, 0x1e, 0x40, 0x92, 0x36, 0x1c, 0x00, 0x12, + 0x73, 0x07, 0x00, 0x34, 0xf7, 0x1b, 0x00, 0xf9, 0x7f, 0x06, 0x00, 0x71, + 0xe0, 0x08, 0x00, 0x54, 0x7f, 0x0a, 0x00, 0x71, 0x20, 0x03, 0x00, 0x54, + 0x75, 0x06, 0x00, 0x51, 0x03, 0x78, 0x80, 0xd2, 0x00, 0x0c, 0x80, 0x52, + 0x01, 0x01, 0x00, 0x90, 0x21, 0x80, 0x13, 0x91, 0x42, 0x7c, 0x03, 0x9b, + 0xa2, 0x0a, 0xa0, 0x9b, 0x83, 0x7e, 0x40, 0x93, 0xd5, 0x02, 0x00, 0xf0, + 0xb5, 0xa2, 0x0c, 0x91, 0x55, 0x00, 0x15, 0x8b, 0xe0, 0x03, 0x15, 0xaa, + 0x37, 0x78, 0x63, 0xf8, 0x17, 0xf2, 0xff, 0x97, 0x40, 0x0b, 0x00, 0x34, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x00, 0x87, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xd5, 0x02, 0x00, 0xf0, 0xa0, 0xa2, 0x09, 0x91, 0x15, 0x0c, 0x80, 0x52, + 0x82, 0x7e, 0x40, 0x93, 0x01, 0x01, 0x00, 0x90, 0x21, 0x40, 0x0d, 0x91, + 0x95, 0x02, 0xb5, 0x9b, 0xe0, 0x03, 0x15, 0xaa, 0x37, 0x78, 0x62, 0xf8, + 0x03, 0xf2, 0xff, 0x97, 0xa0, 0xfd, 0xff, 0x35, 0xe1, 0xfe, 0x40, 0xb9, + 0xe0, 0x03, 0x15, 0xaa, 0xc1, 0x02, 0x00, 0x33, 0xe1, 0xfe, 0x00, 0xb9, + 0xe1, 0x0a, 0x40, 0xb9, 0xc1, 0x02, 0x16, 0x33, 0xe1, 0x0a, 0x00, 0xb9, + 0x12, 0xf2, 0xff, 0x97, 0x1f, 0x00, 0x00, 0x71, 0xc4, 0x0a, 0x40, 0x7a, + 0x40, 0xfc, 0xff, 0x54, 0xe1, 0x03, 0x13, 0x2a, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0x60, 0xff, 0xff, 0x17, 0xd3, 0x02, 0x00, 0xf0, + 0x73, 0xa2, 0x0c, 0x91, 0x00, 0x78, 0x80, 0xd2, 0x83, 0x7e, 0x40, 0x93, + 0x01, 0x01, 0x00, 0x90, 0x21, 0x80, 0x18, 0x91, 0x53, 0x4c, 0x00, 0x9b, + 0xe0, 0x03, 0x13, 0xaa, 0x35, 0x78, 0x63, 0xf8, 0xe6, 0xf1, 0xff, 0x97, + 0x60, 0x03, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x15, 0x78, 0x80, 0xd2, + 0x83, 0x7e, 0x40, 0x93, 0x01, 0x01, 0x00, 0x90, 0x21, 0x80, 0x18, 0x91, + 0x55, 0x7c, 0x15, 0x9b, 0xc0, 0x02, 0x00, 0xf0, 0x00, 0xa0, 0x0c, 0x91, + 0xb5, 0x82, 0x01, 0x91, 0xb5, 0x02, 0x00, 0x8b, 0xe0, 0x03, 0x15, 0xaa, + 0x37, 0x78, 0x63, 0xf8, 0xd5, 0xf1, 0xff, 0x97, 0xe0, 0xf7, 0xff, 0x35, + 0xe1, 0x4a, 0x41, 0xb9, 0xe0, 0x03, 0x15, 0xaa, 0xc1, 0x02, 0x00, 0x33, + 0xe1, 0x4a, 0x01, 0xb9, 0xe7, 0xf1, 0xff, 0x97, 0x1f, 0x00, 0x00, 0x71, + 0xc4, 0x0a, 0x40, 0x7a, 0xe0, 0xf6, 0xff, 0x54, 0xd5, 0xff, 0xff, 0x17, + 0xa1, 0x22, 0x41, 0xb9, 0xe0, 0x03, 0x13, 0xaa, 0xc1, 0x02, 0x00, 0x33, + 0xa1, 0x22, 0x01, 0xb9, 0xde, 0xf1, 0xff, 0x97, 0x1f, 0x00, 0x00, 0x71, + 0xc4, 0x0a, 0x40, 0x7a, 0xe0, 0xfb, 0xff, 0x54, 0xe0, 0x03, 0x14, 0x2a, + 0x01, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0x2d, 0xff, 0xff, 0x17, 0x01, 0x05, 0x80, 0x52, + 0xe0, 0x03, 0x15, 0xaa, 0x61, 0x7e, 0x01, 0x1b, 0x21, 0xe0, 0x01, 0x51, + 0xe1, 0x42, 0x21, 0x8b, 0x22, 0x24, 0x40, 0xb9, 0xc2, 0x02, 0x00, 0x33, + 0x22, 0x24, 0x00, 0xb9, 0xcc, 0xf1, 0xff, 0x97, 0x1f, 0x00, 0x00, 0x71, + 0xc4, 0x0a, 0x40, 0x7a, 0x80, 0xf3, 0xff, 0x54, 0xba, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x1c, 0x00, 0x71, 0x22, 0x98, 0x49, 0x7a, + 0x48, 0x00, 0x00, 0x54, 0xc0, 0xf2, 0xff, 0x17, 0x60, 0x00, 0x87, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x42, 0x1c, 0x00, 0x12, + 0x21, 0x1c, 0x00, 0x72, 0x06, 0x1c, 0x00, 0x12, 0x40, 0x08, 0x40, 0x7a, + 0x20, 0x00, 0x87, 0x52, 0x00, 0x05, 0x00, 0x54, 0x7f, 0x00, 0x00, 0xf9, + 0xdf, 0x1c, 0x00, 0x71, 0x9f, 0x00, 0x00, 0xf9, 0x60, 0x00, 0x87, 0x52, + 0x81, 0x04, 0x00, 0x35, 0x48, 0x04, 0x00, 0x54, 0xc1, 0x7c, 0x40, 0x93, + 0x00, 0x01, 0x00, 0x90, 0x00, 0x80, 0x18, 0x91, 0x00, 0x78, 0x61, 0xf8, + 0x02, 0x68, 0x41, 0xb9, 0xe1, 0x03, 0x22, 0x2a, 0x21, 0x00, 0x01, 0x12, + 0x21, 0x00, 0x02, 0x4a, 0x01, 0x68, 0x01, 0xb9, 0x01, 0x68, 0x41, 0xb9, + 0x00, 0x6c, 0x41, 0xb9, 0x21, 0x0c, 0x60, 0xd3, 0xe0, 0x03, 0x00, 0x2a, + 0x00, 0x00, 0x01, 0xaa, 0x80, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x80, 0x52, + 0x25, 0x02, 0x00, 0xb4, 0xdf, 0x0c, 0x00, 0x71, 0x01, 0x01, 0x00, 0x90, + 0x21, 0x40, 0x0d, 0x91, 0xe2, 0x97, 0x9f, 0x9a, 0x22, 0x78, 0x62, 0xf8, + 0x43, 0x20, 0x41, 0xb9, 0xe1, 0x03, 0x23, 0x2a, 0x21, 0x00, 0x01, 0x12, + 0x21, 0x00, 0x03, 0x4a, 0x41, 0x20, 0x01, 0xb9, 0x43, 0x20, 0x41, 0xb9, + 0x41, 0x24, 0x41, 0xb9, 0x62, 0x0c, 0x60, 0xd3, 0xe1, 0x03, 0x01, 0x2a, + 0x21, 0x00, 0x02, 0xaa, 0xa1, 0x00, 0x00, 0xf9, 0xc0, 0x03, 0x5f, 0xd6, + 0xe8, 0xff, 0xff, 0x54, 0xc1, 0x7c, 0x40, 0x93, 0x00, 0x01, 0x00, 0x90, + 0x00, 0x80, 0x18, 0x91, 0x00, 0x78, 0x61, 0xf8, 0x07, 0x40, 0x41, 0xb9, + 0xe1, 0x03, 0x27, 0x2a, 0x21, 0x00, 0x01, 0x12, 0x21, 0x00, 0x07, 0x4a, + 0x01, 0x40, 0x01, 0xb9, 0x07, 0x40, 0x41, 0xb9, 0x01, 0x44, 0x41, 0xb9, + 0xe7, 0x0c, 0x60, 0xd3, 0xe1, 0x03, 0x01, 0x2a, 0x21, 0x00, 0x07, 0xaa, + 0x61, 0x00, 0x00, 0xf9, 0xa2, 0xfb, 0xff, 0x34, 0xd1, 0xff, 0xff, 0x17, + 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x1c, 0x00, 0x71, 0x28, 0x03, 0x00, 0x54, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x01, 0xaa, 0x41, 0x03, 0x00, 0xb4, 0x21, 0x00, 0x40, 0x39, + 0x3f, 0x60, 0x00, 0x71, 0x68, 0x02, 0x00, 0x54, 0xb4, 0x02, 0x00, 0xd0, + 0x94, 0x22, 0x2a, 0x91, 0x03, 0x0c, 0x80, 0x52, 0x02, 0x7c, 0x40, 0x93, + 0x01, 0x01, 0x00, 0x90, 0x21, 0x80, 0x18, 0x91, 0x14, 0x50, 0xa3, 0x9b, + 0xf5, 0x13, 0x00, 0xf9, 0xe0, 0x03, 0x14, 0xaa, 0x35, 0x78, 0x62, 0xf8, + 0x4f, 0xf1, 0xff, 0x97, 0xe0, 0x01, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x00, 0x87, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x87, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x40, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xa3, 0x82, 0x40, 0xb9, 0xe0, 0x03, 0x14, 0xaa, + 0xa2, 0x82, 0x40, 0xb9, 0x61, 0x06, 0x40, 0x79, 0x65, 0x12, 0x40, 0x39, + 0x42, 0x78, 0x1f, 0x12, 0x64, 0x16, 0x40, 0x39, 0xa2, 0x82, 0x00, 0xb9, + 0xa2, 0x82, 0x40, 0xb9, 0x66, 0x02, 0x40, 0x39, 0xf3, 0x53, 0x41, 0xa9, + 0xc2, 0x10, 0x07, 0x33, 0xa2, 0x82, 0x00, 0xb9, 0xa2, 0x82, 0x40, 0xb9, + 0x41, 0x20, 0x01, 0x4a, 0x21, 0x3c, 0x18, 0x12, 0x21, 0x00, 0x02, 0x4a, + 0xa1, 0x82, 0x00, 0xb9, 0xa1, 0x82, 0x40, 0xb9, 0xa1, 0x00, 0x19, 0x33, + 0xa1, 0x82, 0x00, 0xb9, 0xa1, 0x82, 0x40, 0xb9, 0x81, 0x00, 0x1a, 0x33, + 0xa1, 0x82, 0x00, 0xb9, 0xa1, 0x82, 0x40, 0xb9, 0x61, 0x00, 0x00, 0x33, + 0xa1, 0x82, 0x00, 0xb9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0x3a, 0xf1, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x12, + 0x1f, 0x1c, 0x00, 0x71, 0x28, 0x03, 0x00, 0x54, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x01, 0xaa, + 0x41, 0x03, 0x00, 0xb4, 0x21, 0x00, 0x40, 0x39, 0x3f, 0x60, 0x00, 0x71, + 0x68, 0x02, 0x00, 0x54, 0xb4, 0x02, 0x00, 0xd0, 0x94, 0x22, 0x2a, 0x91, + 0x03, 0x0c, 0x80, 0x52, 0x02, 0x7c, 0x40, 0x93, 0x01, 0x01, 0x00, 0x90, + 0x21, 0x80, 0x18, 0x91, 0x14, 0x50, 0xa3, 0x9b, 0xf5, 0x13, 0x00, 0xf9, + 0xe0, 0x03, 0x14, 0xaa, 0x35, 0x78, 0x62, 0xf8, 0x0b, 0xf1, 0xff, 0x97, + 0xe0, 0x01, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x87, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x87, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xa1, 0x82, 0x40, 0xb9, 0xe0, 0x03, 0x14, 0xaa, 0x21, 0x74, 0x59, 0xd3, + 0x61, 0x02, 0x00, 0x39, 0xa5, 0x82, 0x40, 0xb9, 0xa4, 0x82, 0x40, 0xb9, + 0xa3, 0x82, 0x40, 0xb9, 0xa2, 0x82, 0x40, 0xb9, 0xa5, 0x7c, 0x08, 0x53, + 0xa1, 0x82, 0x40, 0xb9, 0x84, 0x1c, 0x47, 0xd3, 0x63, 0x18, 0x46, 0xd3, + 0x65, 0x06, 0x00, 0x79, 0x42, 0x14, 0x45, 0xd3, 0x21, 0x00, 0x00, 0x12, + 0x64, 0x12, 0x00, 0x39, 0x63, 0x16, 0x00, 0x39, 0x62, 0x1a, 0x00, 0x39, + 0x61, 0x1e, 0x00, 0x39, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xfd, 0xf0, 0xff, 0x17, 0x00, 0x1c, 0x00, 0x12, + 0x1f, 0x1c, 0x00, 0x71, 0x28, 0x03, 0x00, 0x54, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x01, 0xaa, + 0x41, 0x03, 0x00, 0xb4, 0x21, 0x00, 0x40, 0x39, 0x3f, 0x60, 0x00, 0x71, + 0x68, 0x02, 0x00, 0x54, 0xb4, 0x02, 0x00, 0xd0, 0x94, 0x22, 0x36, 0x91, + 0x03, 0x0c, 0x80, 0x52, 0x02, 0x7c, 0x40, 0x93, 0x01, 0x01, 0x00, 0x90, + 0x21, 0x80, 0x18, 0x91, 0x14, 0x50, 0xa3, 0x9b, 0xf5, 0x13, 0x00, 0xf9, + 0xe0, 0x03, 0x14, 0xaa, 0x35, 0x78, 0x62, 0xf8, 0xcf, 0xf0, 0xff, 0x97, + 0xe0, 0x01, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x87, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x87, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xa3, 0x02, 0x41, 0xb9, 0xe0, 0x03, 0x14, 0xaa, 0xa2, 0x02, 0x41, 0xb9, + 0x61, 0x06, 0x40, 0x79, 0x65, 0x12, 0x40, 0x39, 0x42, 0x78, 0x1f, 0x12, + 0x64, 0x16, 0x40, 0x39, 0xa2, 0x02, 0x01, 0xb9, 0xa2, 0x02, 0x41, 0xb9, + 0x66, 0x02, 0x40, 0x39, 0xf3, 0x53, 0x41, 0xa9, 0xc2, 0x10, 0x07, 0x33, + 0xa2, 0x02, 0x01, 0xb9, 0xa2, 0x02, 0x41, 0xb9, 0x41, 0x20, 0x01, 0x4a, + 0x21, 0x3c, 0x18, 0x12, 0x21, 0x00, 0x02, 0x4a, 0xa1, 0x02, 0x01, 0xb9, + 0xa1, 0x02, 0x41, 0xb9, 0xa1, 0x00, 0x19, 0x33, 0xa1, 0x02, 0x01, 0xb9, + 0xa1, 0x02, 0x41, 0xb9, 0x81, 0x00, 0x1a, 0x33, 0xa1, 0x02, 0x01, 0xb9, + 0xa1, 0x02, 0x41, 0xb9, 0x61, 0x00, 0x00, 0x33, 0xa1, 0x02, 0x01, 0xb9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xba, 0xf0, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x1c, 0x00, 0x71, + 0x28, 0x03, 0x00, 0x54, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x01, 0xaa, 0x41, 0x03, 0x00, 0xb4, + 0x21, 0x00, 0x40, 0x39, 0x3f, 0x60, 0x00, 0x71, 0x68, 0x02, 0x00, 0x54, + 0xb4, 0x02, 0x00, 0xd0, 0x94, 0x22, 0x36, 0x91, 0x03, 0x0c, 0x80, 0x52, + 0x02, 0x7c, 0x40, 0x93, 0x01, 0x01, 0x00, 0x90, 0x21, 0x80, 0x18, 0x91, + 0x14, 0x50, 0xa3, 0x9b, 0xf5, 0x13, 0x00, 0xf9, 0xe0, 0x03, 0x14, 0xaa, + 0x35, 0x78, 0x62, 0xf8, 0x8b, 0xf0, 0xff, 0x97, 0xe0, 0x01, 0x00, 0x34, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x87, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x00, 0x87, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xa1, 0x02, 0x41, 0xb9, + 0xe0, 0x03, 0x14, 0xaa, 0x21, 0x74, 0x59, 0xd3, 0x61, 0x02, 0x00, 0x39, + 0xa5, 0x02, 0x41, 0xb9, 0xa4, 0x02, 0x41, 0xb9, 0xa3, 0x02, 0x41, 0xb9, + 0xa2, 0x02, 0x41, 0xb9, 0xa5, 0x7c, 0x08, 0x53, 0xa1, 0x02, 0x41, 0xb9, + 0x84, 0x1c, 0x47, 0xd3, 0x63, 0x18, 0x46, 0xd3, 0x65, 0x06, 0x00, 0x79, + 0x42, 0x14, 0x45, 0xd3, 0x21, 0x00, 0x00, 0x12, 0x64, 0x12, 0x00, 0x39, + 0x63, 0x16, 0x00, 0x39, 0x62, 0x1a, 0x00, 0x39, 0x61, 0x1e, 0x00, 0x39, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0x7d, 0xf0, 0xff, 0x17, 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x1c, 0x00, 0x71, + 0xa8, 0x03, 0x00, 0x54, 0xfd, 0x7b, 0xbd, 0xa9, 0x03, 0x0c, 0x80, 0x52, + 0x02, 0x7c, 0x40, 0x93, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xb3, 0x02, 0x00, 0xd0, 0x73, 0x22, 0x2a, 0x91, 0x34, 0x1c, 0x00, 0x12, + 0x01, 0x01, 0x00, 0x90, 0x21, 0x80, 0x18, 0x91, 0xf5, 0x13, 0x00, 0xf9, + 0x13, 0x4c, 0xa3, 0x9b, 0xe0, 0x03, 0x13, 0xaa, 0x35, 0x78, 0x62, 0xf8, + 0x53, 0xf0, 0xff, 0x97, 0xa0, 0x00, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xa1, 0x82, 0x40, 0xb9, 0xe0, 0x03, 0x13, 0xaa, 0x81, 0x02, 0x00, 0x33, + 0xf3, 0x53, 0x41, 0xa9, 0xa1, 0x82, 0x00, 0xb9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0x5e, 0xf0, 0xff, 0x17, 0x20, 0x00, 0x87, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x1c, 0x00, 0x71, + 0xa8, 0x03, 0x00, 0x54, 0xfd, 0x7b, 0xbd, 0xa9, 0x03, 0x0c, 0x80, 0x52, + 0x02, 0x7c, 0x40, 0x93, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xb3, 0x02, 0x00, 0xd0, 0x73, 0x22, 0x36, 0x91, 0x34, 0x1c, 0x00, 0x12, + 0x01, 0x01, 0x00, 0x90, 0x21, 0x80, 0x18, 0x91, 0xf5, 0x13, 0x00, 0xf9, + 0x13, 0x4c, 0xa3, 0x9b, 0xe0, 0x03, 0x13, 0xaa, 0x35, 0x78, 0x62, 0xf8, + 0x2f, 0xf0, 0xff, 0x97, 0xa0, 0x00, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xa1, 0x02, 0x41, 0xb9, 0xe0, 0x03, 0x13, 0xaa, 0x81, 0x02, 0x00, 0x33, + 0xf3, 0x53, 0x41, 0xa9, 0xa1, 0x02, 0x01, 0xb9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0x3a, 0xf0, 0xff, 0x17, 0x20, 0x00, 0x87, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x1c, 0x00, 0x71, + 0x48, 0x03, 0x00, 0x54, 0x61, 0x03, 0x00, 0xb4, 0x02, 0x7c, 0x40, 0x93, + 0x03, 0x01, 0x00, 0x90, 0x63, 0x80, 0x18, 0x91, 0x00, 0x00, 0x80, 0x52, + 0x62, 0x78, 0x62, 0xf8, 0x44, 0x84, 0x40, 0xb9, 0xe3, 0x03, 0x24, 0x2a, + 0x63, 0x00, 0x18, 0x12, 0x63, 0x00, 0x04, 0x4a, 0x43, 0x84, 0x00, 0xb9, + 0x44, 0x04, 0x41, 0xb9, 0xe3, 0x03, 0x24, 0x2a, 0x63, 0x00, 0x18, 0x12, + 0x63, 0x00, 0x04, 0x4a, 0x43, 0x04, 0x01, 0xb9, 0x43, 0x84, 0x40, 0xb9, + 0x23, 0x00, 0x00, 0x39, 0x43, 0x88, 0x40, 0xb9, 0x23, 0x04, 0x00, 0x39, + 0x43, 0x04, 0x41, 0xb9, 0x23, 0x08, 0x00, 0x39, 0x42, 0x08, 0x41, 0xb9, + 0x22, 0x0c, 0x00, 0x39, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x87, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xbd, 0xa9, 0xe3, 0x03, 0x00, 0x2a, 0x04, 0x01, 0x00, 0x90, + 0x84, 0x80, 0x13, 0x91, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x02, 0x00, 0xb0, 0x85, 0xa2, 0x04, 0x91, 0x14, 0x0c, 0x80, 0x52, + 0xf3, 0x03, 0x02, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x01, 0x2a, + 0x14, 0x14, 0xb4, 0x9b, 0x96, 0x58, 0x63, 0xf8, 0xe0, 0x03, 0x14, 0xaa, + 0xed, 0xef, 0xff, 0x97, 0xa0, 0x00, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x81, 0x01, 0x80, 0x52, 0x62, 0x06, 0x40, 0x79, 0x65, 0x0a, 0x40, 0x79, + 0xe0, 0x03, 0x14, 0xaa, 0xa1, 0x7e, 0x01, 0x1b, 0xc1, 0x42, 0x21, 0x8b, + 0x24, 0x44, 0x41, 0xb9, 0x23, 0x44, 0x41, 0xb9, 0x63, 0x78, 0x1f, 0x12, + 0x23, 0x44, 0x01, 0xb9, 0xc3, 0x42, 0x41, 0xb9, 0x66, 0x32, 0x40, 0x39, + 0xc3, 0x00, 0x00, 0x33, 0xc3, 0x42, 0x01, 0xb9, 0xf5, 0x5b, 0x42, 0xa9, + 0x23, 0x44, 0x41, 0xb9, 0x66, 0x02, 0x40, 0x39, 0xc3, 0x10, 0x07, 0x33, + 0x23, 0x44, 0x01, 0xb9, 0x23, 0x44, 0x41, 0xb9, 0x62, 0x20, 0x02, 0x4a, + 0x42, 0x3c, 0x18, 0x12, 0x42, 0x00, 0x03, 0x4a, 0x22, 0x44, 0x01, 0xb9, + 0x22, 0x44, 0x41, 0xb9, 0xa2, 0x00, 0x1a, 0x33, 0x22, 0x44, 0x01, 0xb9, + 0x22, 0x44, 0x41, 0xb9, 0x63, 0x0a, 0x40, 0xb9, 0xf3, 0x53, 0x41, 0xa9, + 0x62, 0x0c, 0x1f, 0x33, 0x22, 0x44, 0x01, 0xb9, 0x22, 0x44, 0x41, 0xb9, + 0x82, 0x00, 0x00, 0x33, 0x22, 0x44, 0x01, 0xb9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xdb, 0xef, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xe3, 0x03, 0x00, 0x2a, 0x04, 0x01, 0x00, 0x90, + 0x84, 0x80, 0x13, 0x91, 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0xf5, 0x02, 0x00, 0xb0, 0xa5, 0xa2, 0x04, 0x91, 0x15, 0x0c, 0x80, 0x52, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x01, 0x2a, 0x15, 0x14, 0xb5, 0x9b, + 0xf4, 0x03, 0x02, 0xaa, 0x96, 0x58, 0x63, 0xf8, 0xe0, 0x03, 0x15, 0xaa, + 0xb1, 0xef, 0xff, 0x97, 0xa0, 0x00, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x81, 0x01, 0x80, 0x52, 0xc2, 0x42, 0x41, 0xb9, 0xe0, 0x03, 0x15, 0xaa, + 0x61, 0x7e, 0x01, 0x1b, 0x42, 0x00, 0x00, 0x12, 0x82, 0x32, 0x00, 0x39, + 0xc1, 0x42, 0x21, 0x8b, 0x22, 0x44, 0x41, 0xb9, 0x42, 0x74, 0x59, 0xd3, + 0x82, 0x02, 0x00, 0x39, 0x24, 0x44, 0x41, 0xb9, 0x23, 0x44, 0x41, 0xb9, + 0x22, 0x44, 0x41, 0xb9, 0x84, 0x7c, 0x08, 0x53, 0x84, 0x06, 0x00, 0x79, + 0x63, 0x18, 0x46, 0xd3, 0x83, 0x0a, 0x00, 0x79, 0x42, 0x10, 0x41, 0xd3, + 0x82, 0x0a, 0x00, 0xb9, 0x22, 0x44, 0x41, 0xb9, 0x42, 0x00, 0x00, 0x12, + 0x82, 0x36, 0x00, 0x39, 0x21, 0x44, 0x41, 0xb9, 0x21, 0x14, 0x45, 0xd3, + 0x81, 0x3a, 0x00, 0x39, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xa7, 0xef, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xe3, 0x03, 0x00, 0x2a, + 0x04, 0x01, 0x00, 0x90, 0x84, 0x80, 0x13, 0x91, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x02, 0x00, 0xb0, 0x85, 0xa2, 0x04, 0x91, + 0x14, 0x0c, 0x80, 0x52, 0xf3, 0x03, 0x01, 0x2a, 0xf5, 0x5b, 0x02, 0xa9, + 0x55, 0x1c, 0x00, 0x12, 0x14, 0x14, 0xb4, 0x9b, 0x96, 0x58, 0x63, 0xf8, + 0xe0, 0x03, 0x14, 0xaa, 0x7d, 0xef, 0xff, 0x97, 0xa0, 0x00, 0x00, 0x34, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x81, 0x01, 0x80, 0x52, 0xe0, 0x03, 0x14, 0xaa, + 0x61, 0x7e, 0x01, 0x1b, 0xf3, 0x53, 0x41, 0xa9, 0xc1, 0x42, 0x21, 0x8b, + 0x22, 0x44, 0x41, 0xb9, 0xa2, 0x02, 0x00, 0x33, 0xf5, 0x5b, 0x42, 0xa9, + 0x22, 0x44, 0x01, 0xb9, 0x22, 0x44, 0x41, 0xb9, 0x42, 0x78, 0x1a, 0x12, + 0x22, 0x44, 0x01, 0xb9, 0xfd, 0x7b, 0xc3, 0xa8, 0x82, 0xef, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xe3, 0x03, 0x00, 0x2a, + 0x04, 0x01, 0x00, 0x90, 0x84, 0x80, 0x13, 0x91, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x02, 0x00, 0xb0, 0x85, 0xa2, 0x04, 0x91, + 0x14, 0x0c, 0x80, 0x52, 0xf3, 0x03, 0x01, 0x2a, 0xf5, 0x5b, 0x02, 0xa9, + 0x55, 0x1c, 0x00, 0x12, 0x14, 0x14, 0xb4, 0x9b, 0x96, 0x58, 0x63, 0xf8, + 0xe0, 0x03, 0x14, 0xaa, 0x59, 0xef, 0xff, 0x97, 0xa0, 0x00, 0x00, 0x34, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x81, 0x01, 0x80, 0x52, 0xe0, 0x03, 0x14, 0xaa, + 0x61, 0x7e, 0x01, 0x1b, 0xf3, 0x53, 0x41, 0xa9, 0xc1, 0x42, 0x21, 0x8b, + 0x22, 0x44, 0x41, 0xb9, 0xa2, 0x02, 0x1b, 0x33, 0xf5, 0x5b, 0x42, 0xa9, + 0x22, 0x44, 0x01, 0xb9, 0xfd, 0x7b, 0xc3, 0xa8, 0x61, 0xef, 0xff, 0x17, + 0x04, 0x01, 0x00, 0x90, 0x84, 0x80, 0x13, 0x91, 0x85, 0x01, 0x80, 0x52, + 0x43, 0x8f, 0xa8, 0x52, 0x62, 0x00, 0x27, 0x1e, 0x05, 0x10, 0x2a, 0x1e, + 0x83, 0x58, 0x60, 0xf8, 0x21, 0x7c, 0x05, 0x1b, 0x00, 0x00, 0x80, 0x52, + 0x61, 0x40, 0x21, 0x8b, 0x24, 0x48, 0x41, 0xb9, 0xe3, 0x03, 0x24, 0x2a, + 0x63, 0x00, 0x18, 0x12, 0x63, 0x00, 0x04, 0x4a, 0x23, 0x48, 0x01, 0xb9, + 0x23, 0x48, 0x41, 0xb9, 0x21, 0x4c, 0x41, 0xb9, 0x65, 0x04, 0x00, 0x12, + 0x24, 0x04, 0x00, 0x12, 0x63, 0x1c, 0x42, 0xd3, 0xa4, 0x00, 0x22, 0x1e, + 0x21, 0x1c, 0x42, 0xd3, 0x83, 0x00, 0x22, 0x1e, 0x61, 0x00, 0x22, 0x1e, + 0x20, 0x00, 0x22, 0x1e, 0x81, 0x04, 0x05, 0x1f, 0x60, 0x00, 0x05, 0x1f, + 0x21, 0x08, 0x22, 0x1e, 0x00, 0x08, 0x22, 0x1e, 0x21, 0xb8, 0xa1, 0x5e, + 0x00, 0xb8, 0xa1, 0x5e, 0x41, 0x00, 0x00, 0x2d, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x90, 0x21, 0x80, 0x14, 0x91, 0x20, 0x58, 0x60, 0xf8, + 0x00, 0x00, 0x41, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1c, 0x00, 0x12, + 0xe3, 0x03, 0x02, 0x2a, 0x9f, 0x1c, 0x00, 0x71, 0x42, 0x98, 0x4a, 0x7a, + 0x22, 0x1c, 0x00, 0x12, 0xc8, 0x01, 0x00, 0x54, 0x9f, 0x04, 0x00, 0x71, + 0x60, 0x88, 0x42, 0x7a, 0x60, 0x01, 0x00, 0x54, 0x83, 0x01, 0x00, 0x35, + 0x80, 0x1c, 0x7e, 0xd3, 0xa1, 0x02, 0x00, 0xd0, 0x21, 0xa0, 0x26, 0x91, + 0x00, 0x00, 0x24, 0x8b, 0x03, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x80, 0x52, + 0x21, 0x68, 0x63, 0x38, 0x41, 0x02, 0x00, 0x34, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x00, 0x87, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x7f, 0x04, 0x00, 0x71, + 0xe0, 0x01, 0x00, 0x54, 0x7f, 0x08, 0x00, 0x71, 0xc0, 0x02, 0x00, 0x54, + 0x81, 0x1c, 0x7e, 0xd3, 0xa6, 0x02, 0x00, 0xd0, 0xc6, 0xa0, 0x26, 0x91, + 0x21, 0x00, 0x24, 0x8b, 0x65, 0x04, 0x00, 0x51, 0x00, 0x00, 0x80, 0x52, + 0xc1, 0x04, 0x01, 0x8b, 0x21, 0x48, 0x65, 0x38, 0x21, 0xfe, 0xff, 0x35, + 0xe1, 0x03, 0x03, 0x2a, 0xe0, 0x03, 0x04, 0x2a, 0xb8, 0xee, 0xff, 0x17, + 0x81, 0x1c, 0x7e, 0xd3, 0xa5, 0x02, 0x00, 0xd0, 0xa5, 0xa0, 0x26, 0x91, + 0x21, 0x00, 0x24, 0x8b, 0x00, 0x00, 0x80, 0x52, 0xa1, 0x04, 0x01, 0x8b, + 0x21, 0x04, 0x40, 0x39, 0xc1, 0xfe, 0xff, 0x34, 0xc0, 0x03, 0x5f, 0xd6, + 0xa1, 0x02, 0x00, 0xd0, 0x21, 0xe0, 0x0f, 0x91, 0x00, 0x00, 0x80, 0x52, + 0x21, 0xc8, 0x64, 0x38, 0x01, 0xfe, 0xff, 0x34, 0xc0, 0x03, 0x5f, 0xd6, + 0x05, 0x1c, 0x00, 0x12, 0xe4, 0x03, 0x02, 0x2a, 0xbf, 0x1c, 0x00, 0x71, + 0x42, 0x98, 0x49, 0x7a, 0x22, 0x1c, 0x00, 0x12, 0xa8, 0x01, 0x00, 0x54, + 0xa3, 0x1c, 0x7e, 0xd3, 0xa6, 0x02, 0x00, 0xd0, 0xc6, 0x20, 0x1a, 0x91, + 0x63, 0x00, 0x25, 0x8b, 0x00, 0x00, 0x80, 0x52, 0xc3, 0x04, 0x03, 0x8b, + 0x63, 0x48, 0x64, 0x38, 0x43, 0x00, 0x00, 0x34, 0xc0, 0x03, 0x5f, 0xd6, + 0xe1, 0x03, 0x04, 0x2a, 0xe0, 0x03, 0x05, 0x2a, 0x7f, 0xee, 0xff, 0x17, + 0x60, 0x00, 0x87, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x03, 0x00, 0x90, + 0x00, 0x74, 0x42, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe1, 0x03, 0x00, 0xaa, 0x40, 0x00, 0x80, 0x52, + 0xe1, 0x00, 0x00, 0xb4, 0x22, 0x00, 0x40, 0x79, 0x20, 0x00, 0x80, 0x52, + 0x42, 0x04, 0x00, 0x51, 0x42, 0x3c, 0x00, 0x12, 0x5f, 0xfc, 0x03, 0x71, + 0x49, 0x00, 0x00, 0x54, 0xc0, 0x03, 0x5f, 0xd6, 0x23, 0x08, 0x40, 0x39, + 0x62, 0x20, 0x00, 0x51, 0x42, 0x1c, 0x00, 0x12, 0x5f, 0xe0, 0x00, 0x71, + 0x68, 0xff, 0xff, 0x54, 0x21, 0x0c, 0x40, 0x39, 0x21, 0x04, 0x00, 0x51, + 0x21, 0x1c, 0x00, 0x12, 0x3f, 0xfc, 0x00, 0x71, 0xc8, 0xfe, 0xff, 0x54, + 0x7f, 0x08, 0x40, 0xf2, 0xe0, 0x07, 0x9f, 0x1a, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbf, 0xa9, 0x01, 0x01, 0x00, 0x90, + 0x00, 0x03, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, 0x21, 0xe0, 0x00, 0x91, + 0x00, 0xc0, 0x13, 0x91, 0xca, 0x86, 0xff, 0x97, 0x60, 0x00, 0x00, 0x34, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xc1, 0xa8, + 0x03, 0x00, 0x00, 0x90, 0x63, 0x40, 0x3c, 0x91, 0x02, 0x0c, 0x80, 0x52, + 0x01, 0x00, 0x80, 0x52, 0xe0, 0x0a, 0x80, 0x52, 0x58, 0x1b, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0x01, 0x00, 0x80, 0x12, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x13, 0x03, 0x00, 0x90, 0x73, 0xc2, 0x13, 0x91, + 0x14, 0x1c, 0x00, 0x12, 0xe0, 0x03, 0x13, 0xaa, 0xdc, 0x86, 0xff, 0x97, + 0x80, 0x00, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x22, 0x44, 0xb6, 0xd2, 0x9f, 0x02, 0x00, 0x71, + 0xe1, 0x07, 0x9f, 0x1a, 0xe0, 0x03, 0x13, 0xaa, 0x43, 0x00, 0x40, 0xb9, + 0xf3, 0x53, 0x41, 0xa9, 0x61, 0x48, 0x01, 0x4a, 0x21, 0x00, 0x0e, 0x12, + 0x21, 0x00, 0x03, 0x4a, 0x41, 0x00, 0x00, 0xb9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x86, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0x01, 0x00, 0x80, 0x12, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x02, 0x00, 0xf0, + 0x73, 0xc2, 0x13, 0x91, 0xe0, 0x03, 0x13, 0xaa, 0xc1, 0x86, 0xff, 0x97, + 0x80, 0x00, 0x00, 0x34, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x02, 0x4a, 0xb6, 0xd2, 0xe0, 0x03, 0x13, 0xaa, + 0xf3, 0x0b, 0x40, 0xf9, 0x43, 0x00, 0x40, 0xb9, 0xe1, 0x03, 0x23, 0x2a, + 0x21, 0x00, 0x00, 0x12, 0x21, 0x00, 0x03, 0x4a, 0x41, 0x00, 0x00, 0xb9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xa7, 0x86, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0x01, 0x00, 0x80, 0x12, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x02, 0x00, 0xf0, + 0x73, 0xc2, 0x13, 0x91, 0x14, 0x1c, 0x00, 0x12, 0xe0, 0x03, 0x13, 0xaa, + 0xa8, 0x86, 0xff, 0x97, 0x80, 0x00, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x02, 0x4a, 0xb6, 0xd2, + 0x9f, 0x02, 0x00, 0x71, 0xe1, 0x07, 0x9f, 0x1a, 0xe0, 0x03, 0x13, 0xaa, + 0x43, 0x00, 0x40, 0xb9, 0xf3, 0x53, 0x41, 0xa9, 0x61, 0x08, 0x01, 0x4a, + 0x21, 0x00, 0x1e, 0x12, 0x21, 0x00, 0x03, 0x4a, 0x41, 0x00, 0x00, 0xb9, + 0xfd, 0x7b, 0xc2, 0xa8, 0x8c, 0x86, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, + 0x80, 0xff, 0xff, 0x97, 0x80, 0x00, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf4, 0x02, 0x00, 0xf0, + 0x94, 0xc2, 0x13, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0x01, 0x00, 0x80, 0x12, + 0x87, 0x86, 0xff, 0x97, 0x00, 0xff, 0xff, 0x35, 0x63, 0x02, 0x40, 0x39, + 0x81, 0x10, 0x80, 0xd2, 0x01, 0x4a, 0xb6, 0xf2, 0x65, 0x0a, 0x40, 0x39, + 0x63, 0x04, 0x00, 0x51, 0x64, 0x0e, 0x40, 0x39, 0x22, 0x00, 0x40, 0xb9, + 0xe0, 0x03, 0x14, 0xaa, 0x63, 0x1c, 0x10, 0x53, 0xa5, 0x04, 0x00, 0x51, + 0x42, 0x58, 0x07, 0x12, 0x42, 0x00, 0x03, 0x2a, 0x83, 0x04, 0x00, 0x51, + 0xf3, 0x53, 0x41, 0xa9, 0x22, 0x00, 0x00, 0xb9, 0x22, 0x00, 0x40, 0xb9, + 0xa2, 0x14, 0x18, 0x33, 0x22, 0x00, 0x00, 0xb9, 0x22, 0x00, 0x40, 0xb9, + 0x62, 0x18, 0x00, 0x33, 0x22, 0x00, 0x00, 0xb9, 0xfd, 0x7b, 0xc2, 0xa8, + 0x63, 0x86, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x34, 0x1c, 0x00, 0x12, 0xa0, 0x05, 0x00, 0xb4, 0x9f, 0x82, 0x00, 0x71, + 0xe8, 0x04, 0x00, 0x54, 0xf5, 0x13, 0x00, 0xf9, 0xf5, 0x02, 0x00, 0xf0, + 0xb5, 0xc2, 0x13, 0x91, 0xf3, 0x03, 0x00, 0xaa, 0x01, 0x00, 0x80, 0x12, + 0xe0, 0x03, 0x15, 0xaa, 0x5f, 0x86, 0xff, 0x97, 0x80, 0x05, 0x00, 0x35, + 0xe2, 0x03, 0x14, 0x2a, 0xf4, 0x04, 0x00, 0x34, 0x83, 0x06, 0x00, 0x51, + 0x45, 0x00, 0x80, 0xd2, 0x85, 0x92, 0xa5, 0xf2, 0x65, 0x00, 0x05, 0x8b, + 0x81, 0x00, 0x80, 0xd2, 0x01, 0x4a, 0xb6, 0xf2, 0xa5, 0xf4, 0x7e, 0xd3, + 0x60, 0x02, 0x01, 0xcb, 0x1f, 0x20, 0x03, 0xd5, 0x24, 0x68, 0x60, 0xb8, + 0x24, 0x44, 0x00, 0xb8, 0x3f, 0x00, 0x05, 0xeb, 0xa1, 0xff, 0xff, 0x54, + 0x00, 0x01, 0x80, 0xd2, 0x00, 0x4a, 0xb6, 0xf2, 0x9f, 0x82, 0x00, 0x71, + 0x00, 0x08, 0x03, 0x8b, 0xc0, 0x00, 0x00, 0x54, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x44, 0x00, 0xb8, 0x42, 0x04, 0x00, 0x11, 0x5f, 0x80, 0x00, 0x71, + 0xa1, 0xff, 0xff, 0x54, 0xe0, 0x03, 0x15, 0xaa, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0x34, 0x86, 0xff, 0x17, + 0x20, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x9f, 0x86, 0x00, 0x71, 0xe0, 0x27, 0x9f, 0x1a, + 0x00, 0x04, 0x00, 0x11, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x80, 0x00, 0x80, 0xd2, 0x00, 0x4a, 0xb6, 0xf2, + 0xeb, 0xff, 0xff, 0x17, 0xf5, 0x13, 0x40, 0xf9, 0xf3, 0xff, 0xff, 0x17, + 0x81, 0x06, 0x82, 0xd2, 0x01, 0x81, 0xb7, 0xf2, 0x22, 0x00, 0x40, 0xb9, + 0xe0, 0x03, 0x22, 0x2a, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x02, 0x4a, + 0x20, 0x00, 0x00, 0xb9, 0xe0, 0x02, 0x00, 0xf0, 0x00, 0xa8, 0x42, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x02, 0x00, 0xf0, 0x00, 0xac, 0x42, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x02, 0x00, 0xf0, 0x00, 0xb4, 0x42, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0xe1, 0x02, 0x00, 0xf0, 0x22, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0xe0, 0x73, 0x00, 0x91, 0x22, 0x80, 0x15, 0x39, 0xff, 0x1f, 0x00, 0xb9, + 0x2d, 0xe0, 0xff, 0x97, 0xe0, 0x1f, 0x40, 0xb9, 0x60, 0x00, 0x00, 0x35, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x7c, 0xe0, 0xff, 0x97, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbf, 0xa9, 0x82, 0x06, 0x82, 0xd2, 0x02, 0x81, 0xb7, 0xf2, + 0xfd, 0x03, 0x00, 0x91, 0x43, 0x00, 0x40, 0xb9, 0x00, 0x0a, 0x80, 0x52, + 0xe1, 0x03, 0x23, 0x2a, 0x21, 0x00, 0x00, 0x12, 0x21, 0x00, 0x03, 0x4a, + 0x41, 0x00, 0x00, 0xb9, 0xa2, 0x1b, 0x00, 0x94, 0xfd, 0x7b, 0xc1, 0xa8, + 0x00, 0x0a, 0x80, 0x52, 0x0b, 0x1b, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe1, 0x03, 0x00, 0xaa, 0xa0, 0x00, 0x00, 0xb4, + 0xe2, 0x02, 0x00, 0xf0, 0x00, 0x00, 0x80, 0x52, 0x41, 0xa8, 0x02, 0xf9, + 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x07, 0x00, 0xb4, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0x00, 0x00, 0x40, 0x79, + 0x00, 0x04, 0x00, 0x51, 0x00, 0x3c, 0x00, 0x12, 0x1f, 0xfc, 0x03, 0x71, + 0xa9, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x12, 0x40, 0x79, + 0x60, 0xff, 0xff, 0x34, 0x61, 0x0a, 0x40, 0x39, 0x20, 0x00, 0x80, 0x52, + 0x3f, 0x00, 0x00, 0x6b, 0x08, 0xff, 0xff, 0x54, 0x61, 0x0e, 0x40, 0x39, + 0x3f, 0x3c, 0x00, 0x71, 0xa8, 0xfe, 0xff, 0x54, 0xf4, 0x02, 0x00, 0xf0, + 0x94, 0xc2, 0x15, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0x01, 0x00, 0x80, 0x12, + 0xcd, 0x85, 0xff, 0x97, 0xe0, 0xfd, 0xff, 0x35, 0x01, 0x07, 0x82, 0xd2, + 0x01, 0x81, 0xb7, 0xf2, 0x63, 0x02, 0x40, 0x39, 0xe0, 0x03, 0x14, 0xaa, + 0x22, 0x00, 0x40, 0xb9, 0x63, 0x04, 0x00, 0x51, 0x64, 0x12, 0x40, 0x79, + 0x62, 0x1c, 0x00, 0x33, 0x22, 0x00, 0x00, 0xb9, 0x22, 0x00, 0x40, 0xb9, + 0x63, 0x0a, 0x40, 0x39, 0x62, 0x00, 0x18, 0x33, 0x22, 0x00, 0x00, 0xb9, + 0x63, 0x0e, 0x40, 0x39, 0x22, 0x00, 0x40, 0xb9, 0x62, 0x0c, 0x17, 0x33, + 0x22, 0x00, 0x00, 0xb9, 0x22, 0x00, 0x40, 0xb9, 0x63, 0x06, 0x40, 0xb9, + 0xf3, 0x53, 0x41, 0xa9, 0x62, 0x00, 0x13, 0x33, 0x22, 0x00, 0x00, 0xb9, + 0x22, 0x00, 0x40, 0xb9, 0x82, 0x3c, 0x10, 0x33, 0x22, 0x00, 0x00, 0xb9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xa5, 0x85, 0xff, 0x17, 0x40, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0x08, 0x00, 0x71, 0x69, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbd, 0xa9, 0xe1, 0x00, 0x00, 0xf0, + 0x21, 0xe0, 0x01, 0x91, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x00, 0x00, 0xf0, 0x00, 0xc0, 0x01, 0x91, + 0xf4, 0x02, 0x00, 0xf0, 0x94, 0xc2, 0x15, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0x35, 0x48, 0x73, 0x38, 0x16, 0x48, 0x73, 0x38, 0x01, 0x00, 0x80, 0x12, + 0xe0, 0x03, 0x14, 0xaa, 0x99, 0x85, 0xff, 0x97, 0x00, 0x02, 0x00, 0x35, + 0x01, 0x08, 0x82, 0xd2, 0x01, 0x81, 0xb7, 0xf2, 0xa3, 0x01, 0x00, 0x90, + 0xe0, 0x03, 0x14, 0xaa, 0x22, 0x00, 0x40, 0xb9, 0xc2, 0x02, 0x00, 0x33, + 0x22, 0x00, 0x00, 0xb9, 0x22, 0x00, 0x40, 0xb9, 0xa2, 0x02, 0x1f, 0x33, + 0xf5, 0x5b, 0x42, 0xa9, 0x22, 0x00, 0x00, 0xb9, 0x73, 0x00, 0x02, 0xb9, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0x7d, 0x85, 0xff, 0x17, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe1, 0x03, 0x00, 0xaa, 0xa0, 0x01, 0x00, 0xb4, + 0xe0, 0x02, 0x00, 0xf0, 0x00, 0x80, 0x55, 0x39, 0x83, 0x08, 0x82, 0xd2, + 0x03, 0x81, 0xb7, 0xf2, 0x20, 0x00, 0x00, 0x39, 0x00, 0x00, 0x80, 0x52, + 0x62, 0x00, 0x40, 0xb9, 0x63, 0x00, 0x40, 0xb9, 0x23, 0x08, 0x00, 0x79, + 0x42, 0x7c, 0x10, 0x53, 0x22, 0x04, 0x00, 0x79, 0xc0, 0x03, 0x5f, 0xd6, + 0x40, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbe, 0xa9, + 0x01, 0x00, 0x80, 0x12, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0xf3, 0x02, 0x00, 0xf0, 0x73, 0xc2, 0x15, 0x91, 0xe0, 0x03, 0x13, 0xaa, + 0x6d, 0x85, 0xff, 0x97, 0x80, 0x00, 0x00, 0x34, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe1, 0x02, 0x00, 0xf0, + 0x02, 0x09, 0x82, 0xd2, 0x02, 0x81, 0xb7, 0xf2, 0xe0, 0x03, 0x13, 0xaa, + 0x3f, 0x80, 0x15, 0x39, 0xf3, 0x0b, 0x40, 0xf9, 0x43, 0x00, 0x40, 0xb9, + 0xe1, 0x03, 0x23, 0x2a, 0x21, 0x00, 0x0e, 0x12, 0x21, 0x00, 0x03, 0x4a, + 0x41, 0x00, 0x00, 0xb9, 0xfd, 0x7b, 0xc2, 0xa8, 0x50, 0x85, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xe1, 0x00, 0x00, 0xf0, 0xe0, 0x02, 0x00, 0xf0, + 0xfd, 0x03, 0x00, 0x91, 0x21, 0x60, 0x01, 0x91, 0x00, 0xc0, 0x15, 0x91, + 0x2a, 0x85, 0xff, 0x97, 0x60, 0x00, 0x00, 0x34, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x03, 0x00, 0x00, 0x90, 0x63, 0xc0, 0x0a, 0x91, + 0x02, 0x08, 0x80, 0x52, 0x01, 0x00, 0x80, 0x52, 0x00, 0x0a, 0x80, 0x52, + 0xb9, 0x19, 0x00, 0x94, 0x00, 0xff, 0xff, 0x35, 0x03, 0x00, 0x00, 0x90, + 0x63, 0xc0, 0x0b, 0x91, 0x02, 0x06, 0x80, 0x52, 0x01, 0x00, 0x80, 0x52, + 0x00, 0x0b, 0x80, 0x52, 0xb2, 0x19, 0x00, 0x94, 0x20, 0xfe, 0xff, 0x35, + 0x03, 0x00, 0x00, 0x90, 0x63, 0x40, 0x0c, 0x91, 0x02, 0x06, 0x80, 0x52, + 0x01, 0x00, 0x80, 0x52, 0x20, 0x0b, 0x80, 0x52, 0xab, 0x19, 0x00, 0x94, + 0x40, 0xfd, 0xff, 0x35, 0xf3, 0x0b, 0x00, 0xf9, 0xb3, 0x01, 0x00, 0x90, + 0x60, 0x02, 0x42, 0xb9, 0x8a, 0xff, 0xff, 0x97, 0x61, 0x02, 0x42, 0xb9, + 0x3f, 0x00, 0x00, 0x71, 0x00, 0x18, 0x40, 0x7a, 0x80, 0x00, 0x00, 0x54, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x90, 0x00, 0xc0, 0x0c, 0x91, 0xe1, 0x02, 0x00, 0xf0, + 0x20, 0xac, 0x02, 0xf9, 0xb6, 0xff, 0xff, 0x97, 0x00, 0xff, 0xff, 0x35, + 0x00, 0x0b, 0x80, 0x52, 0xd3, 0x1a, 0x00, 0x94, 0xf3, 0x0b, 0x40, 0xf9, + 0x00, 0x0b, 0x80, 0x52, 0xfd, 0x7b, 0xc2, 0xa8, 0x3b, 0x1a, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x02, 0x00, 0xf0, + 0x01, 0x09, 0x82, 0xd2, 0x01, 0x81, 0xb7, 0xf2, 0x1f, 0x80, 0x15, 0x39, + 0x22, 0x00, 0x40, 0xb9, 0xe0, 0x03, 0x22, 0x2a, 0x00, 0x00, 0x0e, 0x12, + 0x00, 0x00, 0x02, 0x4a, 0x20, 0x00, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x10, 0x41, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x20, 0x41, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x30, 0x41, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x40, 0x41, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x50, 0x41, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x60, 0x41, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x70, 0x41, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x80, 0x41, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x90, 0x42, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0xa0, 0x42, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0xb0, 0x42, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0xc0, 0x42, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0xd0, 0x42, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0xe0, 0x42, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0xf0, 0x42, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x00, 0x43, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x10, 0x43, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x20, 0x43, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x30, 0x43, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x40, 0x43, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x50, 0x43, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x60, 0x43, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x70, 0x43, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x80, 0x43, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x90, 0x43, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0xa0, 0x43, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0xb0, 0x43, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0xc0, 0x43, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0xd0, 0x43, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0xe0, 0x43, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0xf0, 0x43, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x00, 0x44, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x10, 0x44, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x20, 0x44, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x30, 0x44, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x40, 0x44, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x50, 0x44, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x60, 0x44, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x70, 0x44, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x80, 0x44, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x90, 0x44, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0xa0, 0x44, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0xb0, 0x44, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0xc0, 0x44, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0xd0, 0x44, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0xe0, 0x44, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0xf0, 0x44, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x00, 0x45, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x10, 0x45, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x20, 0x45, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x30, 0x45, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x40, 0x45, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x50, 0x45, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x60, 0x45, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x70, 0x45, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x80, 0x45, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x90, 0x45, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0xa0, 0x45, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0xb0, 0x45, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0xc0, 0x45, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0xd0, 0x45, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0xe0, 0x45, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0xf0, 0x45, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x00, 0x46, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x10, 0x46, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x20, 0x46, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x30, 0x46, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x40, 0x46, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x50, 0x46, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x60, 0x46, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x70, 0x46, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x01, 0x00, 0xf0, 0x00, 0x80, 0x46, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, + 0x00, 0x90, 0x46, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, 0x00, 0xa0, 0x46, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x01, 0x00, 0xf0, 0x00, 0xb0, 0x46, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, + 0x00, 0xc0, 0x46, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, 0x00, 0xd0, 0x46, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x01, 0x00, 0xf0, 0x00, 0xe0, 0x46, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, + 0x00, 0xf0, 0x46, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x47, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x01, 0x00, 0xf0, 0x00, 0x10, 0x47, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, + 0x00, 0x20, 0x47, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, 0x00, 0x30, 0x47, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x01, 0x00, 0xf0, 0x00, 0x40, 0x47, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, + 0x00, 0x50, 0x47, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, 0x00, 0x60, 0x47, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x01, 0x00, 0xf0, 0x00, 0x70, 0x47, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, + 0x00, 0x80, 0x47, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, 0x00, 0x90, 0x47, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x01, 0x00, 0xf0, 0x00, 0xa0, 0x47, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, + 0x00, 0xb0, 0x47, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, 0x00, 0xc0, 0x47, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x01, 0x00, 0xf0, 0x00, 0xd0, 0x47, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, + 0x00, 0xe0, 0x47, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, 0x00, 0xf0, 0x47, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x00, 0x40, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x10, 0x40, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x20, 0x40, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x30, 0x40, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x40, 0x40, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x50, 0x40, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x60, 0x40, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x70, 0x40, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x80, 0x40, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x90, 0x40, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0xa0, 0x40, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0xb0, 0x40, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0xc0, 0x40, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0xd0, 0x40, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0xe0, 0x40, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0xf0, 0x40, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x00, 0x41, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x10, 0x41, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x20, 0x41, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x30, 0x41, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x40, 0x41, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x50, 0x41, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x60, 0x41, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x70, 0x41, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x80, 0x41, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x90, 0x41, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0xa0, 0x41, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0xb0, 0x41, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0xc0, 0x41, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0xd0, 0x41, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0xe0, 0x41, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0xf0, 0x41, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x00, 0x42, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x10, 0x42, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x20, 0x42, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x30, 0x42, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x40, 0x42, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x50, 0x42, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, 0x00, 0x60, 0x42, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x00, 0x90, 0x00, 0x70, 0x42, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x90, + 0x00, 0x80, 0x42, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, 0x00, 0x90, 0x41, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x01, 0x00, 0xf0, 0x00, 0xa0, 0x41, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, + 0x00, 0xb0, 0x41, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, 0x00, 0xc0, 0x41, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x01, 0x00, 0xf0, 0x00, 0xd0, 0x41, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, + 0x00, 0xe0, 0x41, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, 0x00, 0xf0, 0x41, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x42, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, + 0x00, 0x10, 0x42, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, 0x00, 0x20, 0x42, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x01, 0x00, 0xf0, 0x00, 0x30, 0x42, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, + 0x00, 0x40, 0x42, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, 0x00, 0x50, 0x42, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x01, 0x00, 0xf0, 0x00, 0x60, 0x42, 0xf9, 0x60, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, + 0x00, 0x70, 0x42, 0xf9, 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, + 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xf0, 0x00, 0x80, 0x42, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x00, 0xaa, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0xf6, 0x03, 0x00, 0x2a, 0xf5, 0x03, 0x02, 0xaa, 0xf7, 0x63, 0x03, 0xa9, + 0xf8, 0x03, 0x01, 0xaa, 0x17, 0x00, 0x80, 0xd2, 0xf9, 0x23, 0x00, 0xf9, + 0xf9, 0x00, 0x00, 0xd0, 0x39, 0x03, 0x02, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x14, 0x03, 0x17, 0x8b, 0x13, 0x00, 0x80, 0xd2, 0x04, 0x00, 0x00, 0x14, + 0x94, 0x02, 0x04, 0x91, 0x7f, 0x02, 0x15, 0xeb, 0x60, 0x02, 0x00, 0x54, + 0xc0, 0x26, 0xd3, 0x9a, 0x73, 0x06, 0x00, 0x91, 0x60, 0xff, 0x07, 0x36, + 0x80, 0x0a, 0x40, 0xb9, 0xea, 0x15, 0x00, 0x94, 0x82, 0x82, 0x40, 0x29, + 0x21, 0x00, 0x80, 0x52, 0x83, 0x0a, 0x40, 0xf9, 0xaa, 0x14, 0x00, 0x94, + 0x80, 0xfe, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, 0xe3, 0x03, 0x19, 0xaa, + 0x41, 0x06, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0xb8, 0xa3, 0xff, 0x97, + 0x94, 0x02, 0x04, 0x91, 0x7f, 0x02, 0x15, 0xeb, 0xe1, 0xfd, 0xff, 0x54, + 0xf7, 0x82, 0x00, 0x91, 0xff, 0x02, 0x04, 0xf1, 0xc1, 0xfc, 0xff, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x02, 0x00, 0xd0, 0x80, 0x02, 0x59, 0x39, 0x13, 0x00, 0x80, 0x52, + 0xa0, 0x00, 0x00, 0x34, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe1, 0x00, 0x00, 0xd0, + 0xe0, 0x02, 0x00, 0xd0, 0x21, 0x80, 0x02, 0x91, 0x00, 0x40, 0x17, 0x91, + 0xed, 0x7f, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0x60, 0x03, 0x00, 0x35, + 0x5a, 0x72, 0xff, 0x97, 0x81, 0x01, 0x00, 0xf0, 0x21, 0x20, 0x14, 0x91, + 0x02, 0x01, 0x80, 0xd2, 0xba, 0xff, 0xff, 0x97, 0x51, 0x72, 0xff, 0x97, + 0x81, 0x01, 0x00, 0xf0, 0x21, 0x20, 0x34, 0x91, 0x02, 0x01, 0x80, 0xd2, + 0xb5, 0xff, 0xff, 0x97, 0x54, 0x72, 0xff, 0x97, 0x42, 0x00, 0x80, 0xd2, + 0x81, 0x01, 0x00, 0xf0, 0x21, 0x20, 0x0c, 0x91, 0xb0, 0xff, 0xff, 0x97, + 0x22, 0x00, 0x80, 0xd2, 0x81, 0x01, 0x00, 0xf0, 0xe0, 0x03, 0x02, 0x2a, + 0x21, 0x20, 0x08, 0x91, 0xab, 0xff, 0xff, 0x97, 0x20, 0x00, 0x80, 0x52, + 0x80, 0x02, 0x19, 0x39, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0xe3, 0x00, 0x00, 0xd0, + 0x63, 0xe0, 0x02, 0x91, 0x77, 0xa3, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x03, 0x01, 0xaa, + 0xe4, 0x03, 0x00, 0x2a, 0xe3, 0x00, 0x00, 0xd0, 0x02, 0x00, 0x80, 0x52, + 0x63, 0x80, 0x03, 0x91, 0xe1, 0x06, 0x80, 0x52, 0xe6, 0x04, 0x40, 0x39, + 0x40, 0x00, 0x80, 0x52, 0xe5, 0x00, 0x40, 0x39, 0xe7, 0x08, 0x40, 0xb9, + 0x66, 0xa3, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x04, 0x88, 0x41, 0xb9, 0x84, 0x7c, 0x1f, 0x53, + 0x24, 0x00, 0x00, 0x39, 0x04, 0x14, 0x40, 0xb9, 0x24, 0x04, 0x00, 0x39, + 0x03, 0x50, 0x40, 0xb9, 0x63, 0x1c, 0x00, 0x12, 0x23, 0x08, 0x00, 0xb9, + 0xea, 0xff, 0xff, 0x97, 0x00, 0x00, 0x80, 0x52, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xba, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0xf5, 0x02, 0x00, 0xd0, 0xb5, 0x42, 0x17, 0x91, 0xf7, 0x63, 0x03, 0xa9, + 0xf8, 0x03, 0x00, 0x2a, 0xf7, 0x03, 0x01, 0x2a, 0xf9, 0x6b, 0x04, 0xa9, + 0xfa, 0x03, 0x02, 0x2a, 0x59, 0x00, 0x02, 0x32, 0x16, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x31, 0x80, 0xd2, 0x14, 0xd6, 0xa8, 0xf2, + 0xfb, 0x2b, 0x00, 0xf9, 0xe0, 0x03, 0x15, 0xaa, 0x01, 0x00, 0x80, 0x12, + 0xbe, 0x7f, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0xc0, 0x05, 0x00, 0x35, + 0x80, 0x02, 0x40, 0xb9, 0x1b, 0x78, 0x5e, 0xd3, 0x00, 0x04, 0xf0, 0x37, + 0x80, 0x02, 0x40, 0xb9, 0x20, 0x07, 0xf8, 0x37, 0xe1, 0x03, 0x18, 0x2a, + 0x40, 0x3f, 0x80, 0x52, 0xe4, 0x00, 0x00, 0x94, 0x16, 0x31, 0x80, 0xd2, + 0x16, 0xd6, 0xa8, 0xf2, 0xe1, 0x03, 0x17, 0x2a, 0x20, 0x3f, 0x80, 0x52, + 0x13, 0x77, 0x81, 0x52, 0xde, 0x00, 0x00, 0x94, 0x99, 0x02, 0x00, 0xb9, + 0x04, 0x00, 0x00, 0x14, 0xcf, 0x7e, 0xff, 0x97, 0x73, 0x06, 0x00, 0x71, + 0x20, 0x07, 0x00, 0x54, 0xc1, 0x02, 0x40, 0xb9, 0x00, 0x00, 0x80, 0x52, + 0x61, 0xff, 0xf7, 0x37, 0xc0, 0x02, 0x40, 0xb9, 0x13, 0x7c, 0x1f, 0x53, + 0x00, 0x06, 0xf8, 0x36, 0xe1, 0x02, 0x00, 0xd0, 0x21, 0xc0, 0x18, 0x91, + 0x00, 0xd6, 0xa8, 0xd2, 0xbf, 0xff, 0xff, 0x97, 0xe0, 0x03, 0x15, 0xaa, + 0x91, 0x7f, 0xff, 0x97, 0x82, 0xe0, 0x86, 0x52, 0xf3, 0x03, 0x02, 0x2a, + 0x0d, 0x00, 0x00, 0x14, 0xe0, 0x03, 0x15, 0xaa, 0x8c, 0x7f, 0xff, 0x97, + 0xd6, 0x06, 0x00, 0x11, 0xf3, 0x03, 0x00, 0x2a, 0x00, 0x00, 0x80, 0x52, + 0xb8, 0x7e, 0xff, 0x97, 0xdf, 0xde, 0x2e, 0x71, 0xe0, 0x87, 0x9f, 0x1a, + 0x1f, 0x00, 0x1b, 0x6a, 0x20, 0x03, 0x00, 0x54, 0xf3, 0xf9, 0xff, 0x34, + 0x62, 0x3e, 0x00, 0x12, 0xe3, 0x00, 0x00, 0xd0, 0xe5, 0x03, 0x1a, 0x2a, + 0xe4, 0x03, 0x17, 0x2a, 0x63, 0x60, 0x04, 0x91, 0xe1, 0x06, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x0b, 0xa3, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x2b, 0x40, 0xf9, 0xfd, 0x7b, 0xc6, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe1, 0x02, 0x00, 0xd0, 0x21, 0xc0, 0x18, 0x91, + 0x00, 0xd6, 0xa8, 0xd2, 0x9b, 0xff, 0xff, 0x97, 0xa2, 0xe0, 0x86, 0x52, + 0xf3, 0x03, 0x02, 0x2a, 0xeb, 0xff, 0xff, 0x17, 0x33, 0xfd, 0xff, 0x35, + 0x62, 0xe0, 0x86, 0x52, 0xf3, 0x03, 0x02, 0x2a, 0xe7, 0xff, 0xff, 0x17, + 0xe0, 0x03, 0x15, 0xaa, 0x66, 0x7f, 0xff, 0x97, 0xeb, 0xff, 0xff, 0x17, + 0xc0, 0x02, 0x40, 0xb9, 0xa0, 0xf9, 0xff, 0x37, 0xe0, 0x03, 0x15, 0xaa, + 0x61, 0x7f, 0xff, 0x97, 0x42, 0xe0, 0x86, 0x52, 0xf3, 0x03, 0x02, 0x2a, + 0xdd, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x80, 0x52, + 0x82, 0x13, 0x80, 0x52, 0x60, 0x20, 0xc0, 0x1a, 0x95, 0xff, 0xff, 0x17, + 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x02, 0x00, 0xd0, 0x94, 0x42, 0x17, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0xf5, 0x03, 0x00, 0x2a, 0x16, 0x31, 0x80, 0xd2, 0x16, 0xd6, 0xa8, 0xf2, + 0xf7, 0x63, 0x03, 0xa9, 0x18, 0x00, 0x02, 0x32, 0x17, 0x00, 0x80, 0x52, + 0xf9, 0x23, 0x00, 0xf9, 0xe0, 0x03, 0x14, 0xaa, 0x01, 0x00, 0x80, 0x12, + 0x55, 0x7f, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x14, 0xaa, + 0xd3, 0x01, 0x00, 0x35, 0xc1, 0x02, 0x40, 0xb9, 0x39, 0x78, 0x5e, 0xd3, + 0x21, 0x03, 0xf0, 0x37, 0xc1, 0x02, 0x40, 0xb9, 0xc1, 0x06, 0xf8, 0x37, + 0xd8, 0x02, 0x00, 0xb9, 0x3f, 0x7f, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0xff, 0xde, 0x2e, 0x71, 0xe0, 0x87, 0x9f, 0x1a, 0x1f, 0x00, 0x19, 0x6a, + 0x20, 0x03, 0x00, 0x54, 0xd3, 0xfd, 0xff, 0x34, 0x62, 0x3e, 0x00, 0x12, + 0xe3, 0x00, 0x00, 0xd0, 0xe4, 0x03, 0x15, 0x2a, 0x63, 0x80, 0x05, 0x91, + 0xe1, 0x06, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0xc2, 0xa2, 0xff, 0x97, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x2a, 0x7f, 0xff, 0x97, 0xf7, 0x06, 0x00, 0x11, + 0xf3, 0x03, 0x00, 0x2a, 0x00, 0x00, 0x80, 0x52, 0x56, 0x7e, 0xff, 0x97, + 0xff, 0xde, 0x2e, 0x71, 0xe0, 0x87, 0x9f, 0x1a, 0x1f, 0x00, 0x19, 0x6a, + 0x21, 0xfd, 0xff, 0x54, 0x33, 0xfd, 0xff, 0x35, 0x99, 0x03, 0x00, 0x35, + 0x14, 0x31, 0x80, 0xd2, 0x14, 0xd6, 0xa8, 0xf2, 0x13, 0x77, 0x81, 0x52, + 0x04, 0x00, 0x00, 0x14, 0x4b, 0x7e, 0xff, 0x97, 0x73, 0x06, 0x00, 0x71, + 0x00, 0x03, 0x00, 0x54, 0x81, 0x02, 0x40, 0xb9, 0x00, 0x00, 0x80, 0x52, + 0x61, 0xff, 0xf7, 0x37, 0x80, 0x02, 0x40, 0xb9, 0x13, 0x7c, 0x1f, 0x53, + 0x40, 0xfc, 0xff, 0x36, 0xe1, 0x02, 0x00, 0xd0, 0x21, 0xc0, 0x18, 0x91, + 0x00, 0xd6, 0xa8, 0xd2, 0x3b, 0xff, 0xff, 0x97, 0x82, 0xe0, 0x86, 0x52, + 0xf3, 0x03, 0x02, 0x2a, 0xd5, 0xff, 0xff, 0x17, 0xe1, 0x02, 0x00, 0xd0, + 0x21, 0xc0, 0x18, 0x91, 0x00, 0xd6, 0xa8, 0xd2, 0x34, 0xff, 0xff, 0x97, + 0xa2, 0xe0, 0x86, 0x52, 0xf3, 0x03, 0x02, 0x2a, 0xce, 0xff, 0xff, 0x17, + 0x73, 0xe0, 0x86, 0x52, 0xe2, 0x03, 0x13, 0x2a, 0xcb, 0xff, 0xff, 0x17, + 0x80, 0x02, 0x40, 0xb9, 0xc0, 0xfd, 0xff, 0x37, 0x42, 0xe0, 0x86, 0x52, + 0xf3, 0x03, 0x02, 0x2a, 0xc6, 0xff, 0xff, 0x17, 0x1f, 0x1c, 0x00, 0x71, + 0x69, 0x00, 0x00, 0x54, 0x20, 0xe0, 0x86, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x13, 0x7c, 0x7b, 0xd3, 0x94, 0x01, 0x00, 0xf0, 0x94, 0x22, 0x08, 0x91, + 0xf5, 0x13, 0x00, 0xf9, 0x95, 0x02, 0x13, 0x8b, 0xa0, 0x0a, 0x40, 0xb9, + 0xa1, 0x0e, 0x00, 0xf9, 0xa6, 0x14, 0x00, 0x94, 0xa0, 0x0a, 0x40, 0xb9, + 0x21, 0x00, 0x80, 0x52, 0x81, 0x6a, 0x33, 0xb8, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0x0b, 0x14, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1c, 0x00, 0x71, + 0x69, 0x00, 0x00, 0x54, 0x20, 0xe0, 0x86, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x13, 0x7c, 0x7b, 0xd3, 0x94, 0x01, 0x00, 0xf0, 0x94, 0x22, 0x08, 0x91, + 0xf5, 0x13, 0x00, 0xf9, 0x95, 0x02, 0x13, 0x8b, 0xa0, 0x0a, 0x40, 0xb9, + 0x37, 0x14, 0x00, 0x94, 0x9f, 0x6a, 0x33, 0xb8, 0xf3, 0x53, 0x41, 0xa9, + 0xbf, 0x0e, 0x00, 0xf9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x1f, 0xfc, 0x07, 0x71, 0xc8, 0x00, 0x00, 0x54, + 0x01, 0x40, 0x80, 0xd2, 0x01, 0xe0, 0xa8, 0xf2, 0x20, 0x48, 0x60, 0x38, + 0x00, 0x1c, 0x00, 0x12, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe2, 0x03, 0x00, 0x2a, 0x21, 0x1c, 0x00, 0x12, + 0x5f, 0xfc, 0x07, 0x71, 0x20, 0x00, 0x80, 0x52, 0xa8, 0x00, 0x00, 0x54, + 0x03, 0x40, 0x80, 0xd2, 0x03, 0xe0, 0xa8, 0xf2, 0x00, 0x00, 0x80, 0x52, + 0x61, 0x48, 0x22, 0x38, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x21, 0x1c, 0x00, 0x12, 0xe3, 0x03, 0x00, 0x2a, + 0x24, 0x04, 0x00, 0x51, 0x20, 0x00, 0x80, 0x52, 0x85, 0x1c, 0x00, 0x12, + 0xbf, 0x0c, 0x00, 0x71, 0x48, 0x02, 0x00, 0x54, 0x65, 0x04, 0x00, 0x51, + 0x20, 0x00, 0x80, 0x52, 0xa5, 0x00, 0x01, 0x0b, 0xbf, 0xfc, 0x07, 0x71, + 0xa8, 0x01, 0x00, 0x54, 0xe1, 0x03, 0x04, 0x2a, 0x00, 0x40, 0x80, 0xd2, + 0x00, 0xe0, 0xa8, 0xf2, 0x21, 0x04, 0x00, 0x91, 0x00, 0x40, 0x23, 0x8b, + 0x01, 0x00, 0x01, 0x8b, 0x43, 0x1c, 0x00, 0x12, 0x03, 0x14, 0x00, 0x38, + 0x42, 0x7c, 0x08, 0x53, 0x1f, 0x00, 0x01, 0xeb, 0x81, 0xff, 0xff, 0x54, + 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x02, 0x00, 0xb0, + 0x20, 0x04, 0x59, 0x39, 0xe0, 0x01, 0x00, 0x35, 0x82, 0xfe, 0x80, 0xd2, + 0x02, 0x20, 0xb6, 0xf2, 0x24, 0x00, 0x80, 0x52, 0x43, 0x00, 0x40, 0xb9, + 0xe0, 0x03, 0x23, 0x2a, 0x00, 0x00, 0x1f, 0x12, 0x00, 0x00, 0x03, 0x4a, + 0x40, 0x00, 0x00, 0xb9, 0x43, 0x00, 0x40, 0xb9, 0xe0, 0x03, 0x23, 0x2a, + 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x03, 0x4a, 0x40, 0x00, 0x00, 0xb9, + 0x24, 0x04, 0x19, 0x39, 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xe2, 0x03, 0x00, 0x2a, 0x00, 0x04, 0x00, 0x51, + 0x1f, 0x44, 0x01, 0x71, 0x20, 0x00, 0x80, 0x52, 0x22, 0x98, 0x50, 0x7a, + 0x49, 0x00, 0x00, 0x54, 0xc0, 0x03, 0x5f, 0xd6, 0xe3, 0x00, 0x00, 0xb0, + 0x63, 0x40, 0x06, 0x91, 0x04, 0x20, 0xb6, 0xd2, 0x00, 0x00, 0x80, 0x52, + 0x61, 0x58, 0x61, 0xf8, 0x22, 0x68, 0x24, 0xb8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x40, 0x00, 0x71, + 0x20, 0x00, 0x80, 0x52, 0xe8, 0x00, 0x00, 0x54, 0xe2, 0x00, 0x00, 0xb0, + 0x42, 0x40, 0x06, 0x91, 0x03, 0x20, 0xb6, 0xd2, 0x00, 0x00, 0x80, 0x52, + 0x41, 0x58, 0x61, 0xf8, 0x3f, 0x68, 0x23, 0xb8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x34, + 0x05, 0xfc, 0x80, 0xd2, 0x05, 0x20, 0xb6, 0xf2, 0xa4, 0x00, 0x40, 0xb9, + 0x04, 0x18, 0x00, 0x33, 0xa4, 0x00, 0x00, 0xb9, 0xc1, 0x00, 0x00, 0x34, + 0x04, 0xfc, 0x80, 0xd2, 0x04, 0x20, 0xb6, 0xf2, 0x80, 0x00, 0x40, 0xb9, + 0x20, 0x18, 0x18, 0x33, 0x80, 0x00, 0x00, 0xb9, 0xc2, 0x00, 0x00, 0x34, + 0x01, 0xfc, 0x80, 0xd2, 0x01, 0x20, 0xb6, 0xf2, 0x20, 0x00, 0x40, 0xb9, + 0x40, 0x18, 0x10, 0x33, 0x20, 0x00, 0x00, 0xb9, 0xc3, 0x00, 0x00, 0x34, + 0x01, 0xfc, 0x80, 0xd2, 0x01, 0x20, 0xb6, 0xf2, 0x20, 0x00, 0x40, 0xb9, + 0x60, 0x18, 0x08, 0x33, 0x20, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0x02, 0x11, 0x80, 0xd2, 0x81, 0x01, 0x80, 0xd2, + 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x00, 0x2a, + 0x96, 0x01, 0x00, 0xf0, 0xd6, 0x22, 0x14, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xa1, 0x7e, 0x01, 0x9b, 0xf3, 0x02, 0x00, 0xb0, 0x73, 0x22, 0x19, 0x91, + 0xa2, 0x5a, 0x02, 0x9b, 0x63, 0x02, 0x01, 0x8b, 0x54, 0x04, 0x40, 0xf9, + 0x85, 0x02, 0x40, 0xb9, 0x84, 0x06, 0x40, 0xb9, 0xa2, 0x14, 0x00, 0x12, + 0x60, 0x6a, 0x21, 0xb8, 0x62, 0x90, 0x00, 0x29, 0x5f, 0xfc, 0x00, 0x71, + 0xa0, 0x01, 0x00, 0x54, 0x00, 0x11, 0x80, 0xd2, 0xb6, 0x5a, 0x00, 0x9b, + 0xc1, 0x12, 0x40, 0xf9, 0x81, 0x00, 0x00, 0xb4, 0x80, 0x01, 0x80, 0xd2, + 0xa0, 0x4e, 0x00, 0x9b, 0x20, 0x00, 0x3f, 0xd6, 0xf5, 0x5b, 0x42, 0xa9, + 0x9f, 0x02, 0x00, 0xb9, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe1, 0xd7, 0x00, 0x32, 0x9f, 0x00, 0x01, 0x6b, + 0x60, 0x01, 0x00, 0x54, 0xe6, 0x03, 0x04, 0x2a, 0xe7, 0x03, 0x14, 0xaa, + 0xe4, 0x03, 0x00, 0x2a, 0xe3, 0x00, 0x00, 0xb0, 0xc2, 0x80, 0x86, 0x52, + 0x63, 0x00, 0x09, 0x91, 0x81, 0x06, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xb3, 0xa1, 0xff, 0x97, 0xe8, 0xff, 0xff, 0x17, 0xe3, 0x00, 0x00, 0xb0, + 0x63, 0x60, 0x08, 0x91, 0xc2, 0x80, 0x86, 0x52, 0x81, 0x06, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0xac, 0xa1, 0xff, 0x97, 0x00, 0x18, 0x80, 0x52, + 0x0a, 0x14, 0x00, 0x94, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0xfe, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x52, 0xc3, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x80, 0x52, 0xbf, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x80, 0x52, + 0xbb, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0x00, 0x00, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x02, 0x00, 0xb0, + 0xa1, 0x0a, 0x59, 0x39, 0xe1, 0x03, 0x00, 0x35, 0xf6, 0x00, 0x00, 0xb0, + 0xd6, 0xc2, 0x09, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x93, 0x01, 0x00, 0xf0, + 0x73, 0xc2, 0x14, 0x91, 0x14, 0x00, 0x80, 0x52, 0xe1, 0x03, 0x16, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0xd9, 0x7d, 0xff, 0x97, 0x01, 0x00, 0x80, 0x52, + 0x00, 0x04, 0x00, 0x35, 0x60, 0x02, 0x5e, 0xf8, 0x94, 0x06, 0x00, 0x11, + 0x1f, 0x08, 0x00, 0xb9, 0x1f, 0x0c, 0x00, 0xb9, 0x1f, 0x10, 0x00, 0xb9, + 0x1f, 0x14, 0x00, 0xb9, 0x1f, 0x00, 0x00, 0xb9, 0x1f, 0x04, 0x00, 0xb9, + 0x60, 0x0a, 0x7d, 0x29, 0x63, 0x02, 0x5f, 0xf8, 0x64, 0x12, 0x00, 0x94, + 0x60, 0x01, 0x00, 0x34, 0x73, 0x22, 0x02, 0x91, 0x9f, 0x0e, 0x00, 0x71, + 0xa1, 0xfd, 0xff, 0x54, 0x80, 0x01, 0x00, 0x35, 0xf3, 0x53, 0x41, 0xa9, + 0x21, 0x00, 0x80, 0x52, 0xa1, 0x0a, 0x19, 0x39, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x82, 0x5e, 0xb8, + 0x93, 0x13, 0x00, 0x94, 0x60, 0x82, 0x5e, 0xb8, 0xfd, 0x12, 0x00, 0x94, + 0xf2, 0xff, 0xff, 0x17, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe4, 0x03, 0x14, 0x2a, + 0xe2, 0x03, 0x00, 0x2a, 0xe3, 0x00, 0x00, 0xb0, 0x00, 0x02, 0x80, 0x52, + 0x63, 0x00, 0x0a, 0x91, 0x41, 0x00, 0x80, 0x52, 0x5d, 0xa1, 0xff, 0x97, + 0x40, 0x80, 0x86, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xeb, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0x08, 0x00, 0x71, 0x69, 0x00, 0x00, 0x54, + 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbc, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0x2a, + 0x00, 0x11, 0x80, 0xd2, 0xf7, 0x1b, 0x00, 0xf9, 0xf7, 0x03, 0x13, 0x2a, + 0xf5, 0x5b, 0x02, 0xa9, 0x95, 0x01, 0x00, 0xf0, 0xb5, 0x22, 0x14, 0x91, + 0xf7, 0x7e, 0x00, 0x9b, 0xf4, 0x03, 0x01, 0x2a, 0x01, 0x00, 0x80, 0x12, + 0xf6, 0xa2, 0x00, 0x91, 0xd6, 0x02, 0x15, 0x8b, 0xe0, 0x03, 0x16, 0xaa, + 0xc0, 0x7d, 0xff, 0x97, 0x80, 0x02, 0x00, 0x35, 0xb5, 0x02, 0x17, 0x8b, + 0x81, 0x0e, 0x1f, 0x53, 0x20, 0x00, 0x80, 0x52, 0x9f, 0x3e, 0x00, 0x71, + 0x00, 0x20, 0xc1, 0x1a, 0xe0, 0x03, 0x20, 0x2a, 0xa1, 0x06, 0x40, 0xf9, + 0xa8, 0x02, 0x00, 0x54, 0x22, 0x08, 0x40, 0xb9, 0x40, 0x00, 0x00, 0x0a, + 0x20, 0x08, 0x00, 0xb9, 0xe0, 0x03, 0x16, 0xaa, 0xa6, 0x7d, 0xff, 0x97, + 0xc0, 0x00, 0x00, 0x35, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe2, 0x03, 0x00, 0x2a, 0xe4, 0x03, 0x13, 0x2a, 0x00, 0x02, 0x80, 0x52, + 0xe3, 0x00, 0x00, 0xb0, 0x41, 0x00, 0x80, 0x52, 0x63, 0xc0, 0x0a, 0x91, + 0x29, 0xa1, 0xff, 0x97, 0x60, 0x80, 0x86, 0x52, 0xf3, 0xff, 0xff, 0x17, + 0x9f, 0x7e, 0x00, 0x71, 0xe9, 0x00, 0x00, 0x54, 0x9f, 0xbe, 0x00, 0x71, + 0x28, 0x01, 0x00, 0x54, 0x22, 0x10, 0x40, 0xb9, 0x40, 0x00, 0x00, 0x0a, + 0x20, 0x10, 0x00, 0xb9, 0xe8, 0xff, 0xff, 0x17, 0x22, 0x0c, 0x40, 0xb9, + 0x40, 0x00, 0x00, 0x0a, 0x20, 0x0c, 0x00, 0xb9, 0xe4, 0xff, 0xff, 0x17, + 0x22, 0x14, 0x40, 0xb9, 0x40, 0x00, 0x00, 0x0a, 0x20, 0x14, 0x00, 0xb9, + 0xe0, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x00, 0x07, 0x00, 0xb4, 0xf3, 0x03, 0x00, 0xaa, 0x00, 0x00, 0x40, 0xb9, + 0x34, 0x00, 0x80, 0x52, 0x1f, 0x08, 0x00, 0x71, 0xa9, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x00, 0x2a, 0x14, 0x11, 0x80, 0xd2, + 0xf5, 0x13, 0x00, 0xf9, 0x95, 0x01, 0x00, 0xf0, 0xb5, 0x22, 0x14, 0x91, + 0x01, 0x00, 0x80, 0x12, 0x00, 0x7c, 0x14, 0x9b, 0x00, 0xa0, 0x00, 0x91, + 0xa0, 0x02, 0x00, 0x8b, 0x7a, 0x7d, 0xff, 0x97, 0x40, 0x03, 0x00, 0x35, + 0x60, 0x02, 0x40, 0xb9, 0x14, 0x7c, 0x14, 0x9b, 0xa3, 0x02, 0x14, 0x8b, + 0xa1, 0x6a, 0x74, 0xf8, 0x22, 0x00, 0x40, 0xb9, 0x54, 0x00, 0x19, 0x12, + 0x42, 0x04, 0x38, 0x37, 0x60, 0x04, 0x40, 0xf9, 0x22, 0x00, 0x80, 0x52, + 0x02, 0x08, 0x00, 0xb9, 0x60, 0x0a, 0x40, 0xb9, 0x20, 0x04, 0x00, 0xb9, + 0x60, 0x06, 0x40, 0xb9, 0x20, 0x00, 0x00, 0xb9, 0x60, 0x02, 0x40, 0xb9, + 0x01, 0x11, 0x80, 0xd2, 0x00, 0x54, 0x01, 0x9b, 0x00, 0xa0, 0x00, 0x91, + 0x5a, 0x7d, 0xff, 0x97, 0xc0, 0x00, 0x00, 0x35, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x64, 0x02, 0x40, 0xb9, 0xe2, 0x03, 0x00, 0x2a, + 0xe3, 0x00, 0x00, 0xb0, 0x41, 0x00, 0x80, 0x52, 0x63, 0xc0, 0x0a, 0x91, + 0x00, 0x02, 0x80, 0x52, 0xb4, 0x80, 0x86, 0x52, 0xdc, 0xa0, 0xff, 0x97, + 0xf5, 0x13, 0x40, 0xf9, 0xcf, 0xff, 0xff, 0x17, 0x54, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x34, 0x80, 0x86, 0x52, 0xe6, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x06, 0x00, 0xb4, + 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0x20, 0x00, 0x80, 0x52, 0xf5, 0x5b, 0x02, 0xa9, + 0xf5, 0x03, 0x01, 0x2a, 0x61, 0x02, 0x40, 0xb9, 0x3f, 0x08, 0x00, 0x71, + 0xa9, 0x00, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x01, 0x2a, + 0x16, 0x11, 0x80, 0xd2, 0xf7, 0x1b, 0x00, 0xf9, 0x97, 0x01, 0x00, 0xf0, + 0xf7, 0x22, 0x14, 0x91, 0x01, 0x00, 0x80, 0x12, 0x00, 0x7c, 0x16, 0x9b, + 0x00, 0xa0, 0x00, 0x91, 0xe0, 0x02, 0x00, 0x8b, 0x34, 0x7d, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0xc0, 0x01, 0x00, 0x35, 0x60, 0x02, 0x40, 0xb9, + 0x16, 0x5c, 0x16, 0x9b, 0xd6, 0x06, 0x40, 0xf9, 0xd6, 0x22, 0x00, 0x91, + 0xb5, 0x00, 0x00, 0x35, 0x13, 0x00, 0x00, 0x14, 0x4f, 0x7c, 0xff, 0x97, + 0xbf, 0x02, 0x14, 0x6b, 0x00, 0x02, 0x00, 0x54, 0xc1, 0x02, 0x40, 0xb9, + 0x94, 0x06, 0x00, 0x11, 0x20, 0x00, 0x80, 0x52, 0x41, 0xff, 0x07, 0x37, + 0x60, 0x02, 0x40, 0xb9, 0x01, 0x11, 0x80, 0xd2, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0x00, 0x5c, 0x01, 0x9b, 0xf7, 0x1b, 0x40, 0xf9, + 0x00, 0xa0, 0x00, 0x91, 0xfd, 0x7b, 0xc4, 0xa8, 0x10, 0x7d, 0xff, 0x17, + 0x40, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0xe3, 0x00, 0x00, 0xb0, + 0x63, 0x80, 0x0b, 0x91, 0x02, 0x00, 0x80, 0x52, 0x01, 0x1c, 0x80, 0x52, + 0x40, 0x00, 0x80, 0x52, 0x98, 0xa0, 0xff, 0x97, 0xef, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x08, 0x00, 0x71, + 0x69, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0x2a, 0x00, 0x11, 0x80, 0xd2, 0xf7, 0x1b, 0x00, 0xf9, + 0xf7, 0x03, 0x13, 0x2a, 0xf5, 0x5b, 0x02, 0xa9, 0x95, 0x01, 0x00, 0xf0, + 0xb5, 0x22, 0x14, 0x91, 0xf7, 0x7e, 0x00, 0x9b, 0xf4, 0x03, 0x01, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0xf6, 0xa2, 0x00, 0x91, 0xd6, 0x02, 0x15, 0x8b, + 0xe0, 0x03, 0x16, 0xaa, 0xfc, 0x7c, 0xff, 0x97, 0xc0, 0x01, 0x00, 0x34, + 0xe4, 0x03, 0x13, 0x2a, 0xe2, 0x03, 0x00, 0x2a, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xe3, 0x00, 0x00, 0xb0, 0x63, 0xc0, 0x0a, 0x91, + 0x78, 0xa0, 0xff, 0x97, 0x80, 0x80, 0x86, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xb5, 0x02, 0x17, 0x8b, 0xa0, 0x12, 0x40, 0xb9, + 0xb4, 0x12, 0x00, 0xf9, 0x96, 0x12, 0x00, 0x94, 0xa0, 0x12, 0x40, 0xb9, + 0x00, 0x12, 0x00, 0x94, 0xa0, 0xfd, 0xff, 0x35, 0xe0, 0x03, 0x16, 0xaa, + 0xd9, 0x7c, 0xff, 0x97, 0x40, 0xfd, 0xff, 0x35, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x02, 0x00, 0xb0, 0x01, 0x3c, 0x43, 0xf9, 0x81, 0x00, 0x00, 0xb4, + 0xf0, 0x03, 0x01, 0xaa, 0x00, 0x00, 0x80, 0x52, 0x00, 0x02, 0x1f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x02, 0x00, 0xb0, + 0x01, 0x3c, 0x43, 0xf9, 0x81, 0x00, 0x00, 0xb4, 0xf0, 0x03, 0x01, 0xaa, + 0x20, 0x00, 0x80, 0x52, 0x00, 0x02, 0x1f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x0c, 0x00, 0xb4, 0xfd, 0x7b, 0xbd, 0xa9, + 0xe3, 0x02, 0x00, 0xb0, 0x63, 0x00, 0x1a, 0x91, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0x2a, 0xf3, 0x03, 0x01, 0xaa, + 0xe1, 0x00, 0x00, 0xb0, 0x22, 0xc0, 0x0b, 0x91, 0xe1, 0x03, 0x02, 0xaa, + 0x1f, 0x00, 0x00, 0x71, 0x42, 0x20, 0x00, 0x91, 0x00, 0x0c, 0x80, 0xd2, + 0x42, 0x10, 0x81, 0x9a, 0x01, 0x00, 0x80, 0x12, 0x94, 0x0e, 0x00, 0x9b, + 0xf5, 0x13, 0x00, 0xf9, 0xe0, 0x03, 0x14, 0xaa, 0x55, 0x00, 0x40, 0xf9, + 0xb8, 0x7c, 0xff, 0x97, 0xe0, 0x08, 0x00, 0x35, 0xa0, 0x06, 0x40, 0xb9, + 0xa4, 0x12, 0x00, 0x91, 0xa1, 0x86, 0x40, 0xb9, 0xa2, 0x12, 0x02, 0x91, + 0x05, 0x00, 0x15, 0x32, 0x00, 0x78, 0x14, 0x12, 0x21, 0x78, 0x1f, 0x12, + 0xa1, 0x86, 0x00, 0xb9, 0x63, 0x02, 0x40, 0x39, 0x61, 0x06, 0x40, 0x39, + 0x7f, 0x00, 0x00, 0x71, 0x63, 0x0e, 0x40, 0x39, 0x00, 0x00, 0x85, 0x1a, + 0x3f, 0x00, 0x00, 0x71, 0x01, 0x00, 0x16, 0x32, 0x00, 0x78, 0x15, 0x12, + 0x00, 0x00, 0x81, 0x1a, 0x7f, 0x04, 0x00, 0x71, 0x01, 0x78, 0x16, 0x12, + 0x20, 0x06, 0x00, 0x54, 0x65, 0x0a, 0x40, 0x39, 0x01, 0x00, 0x17, 0x32, + 0x00, 0x78, 0x16, 0x12, 0xbf, 0x00, 0x00, 0x71, 0x01, 0x00, 0x81, 0x1a, + 0x20, 0x78, 0x17, 0x12, 0x43, 0x05, 0x00, 0x35, 0x65, 0x12, 0x40, 0x39, + 0x03, 0x00, 0x19, 0x32, 0x61, 0x16, 0x40, 0x39, 0x00, 0x78, 0x18, 0x12, + 0xbf, 0x00, 0x00, 0x71, 0x65, 0x1a, 0x40, 0x39, 0x00, 0x00, 0x83, 0x1a, + 0x3f, 0x00, 0x00, 0x71, 0x01, 0x00, 0x1b, 0x32, 0x00, 0x78, 0x1a, 0x12, + 0x00, 0x00, 0x81, 0x1a, 0x61, 0x1e, 0x40, 0x39, 0x03, 0x00, 0x1c, 0x32, + 0xbf, 0x00, 0x00, 0x71, 0x00, 0x78, 0x1b, 0x12, 0x66, 0x22, 0x40, 0x39, + 0x00, 0x00, 0x83, 0x1a, 0x3f, 0x00, 0x00, 0x71, 0x01, 0x00, 0x1d, 0x32, + 0x00, 0x78, 0x1c, 0x12, 0x00, 0x00, 0x81, 0x1a, 0x63, 0x26, 0x40, 0x39, + 0x05, 0x00, 0x1e, 0x32, 0xdf, 0x00, 0x00, 0x71, 0x01, 0x78, 0x1d, 0x12, + 0xe0, 0x03, 0x14, 0xaa, 0x21, 0x00, 0x85, 0x1a, 0x7f, 0x00, 0x00, 0x71, + 0x23, 0x00, 0x00, 0x32, 0x21, 0x78, 0x1f, 0x12, 0x21, 0x00, 0x83, 0x1a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0x81, 0x00, 0x00, 0xb9, + 0x43, 0x00, 0x40, 0xb9, 0xe1, 0x03, 0x23, 0x2a, 0x21, 0x00, 0x00, 0x12, + 0x21, 0x00, 0x03, 0x4a, 0x41, 0x00, 0x00, 0xb9, 0xfd, 0x7b, 0xc3, 0xa8, + 0x67, 0x7c, 0xff, 0x17, 0x20, 0x00, 0x18, 0x32, 0xd6, 0xff, 0xff, 0x17, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x03, 0x00, 0xaa, + 0x40, 0x00, 0x80, 0x52, 0xa1, 0x00, 0x00, 0xb4, 0x22, 0x00, 0x40, 0x39, + 0x20, 0x00, 0x80, 0x52, 0x5f, 0x1c, 0x00, 0x71, 0x49, 0x00, 0x00, 0x54, + 0xc0, 0x03, 0x5f, 0xd6, 0x22, 0x04, 0x40, 0x79, 0x42, 0x04, 0x00, 0x51, + 0x42, 0x3c, 0x00, 0x12, 0x5f, 0x08, 0x00, 0x71, 0x68, 0xff, 0xff, 0x54, + 0x23, 0x08, 0x40, 0x79, 0x7f, 0x00, 0x00, 0x6b, 0x09, 0xff, 0xff, 0x54, + 0x42, 0x3c, 0x40, 0x92, 0xe4, 0x00, 0x00, 0xb0, 0x84, 0x00, 0x1f, 0x91, + 0x82, 0x78, 0x62, 0xb8, 0x7f, 0x00, 0x02, 0x6b, 0x48, 0xfe, 0xff, 0x54, + 0x22, 0x0c, 0x40, 0x79, 0x42, 0x04, 0x00, 0x51, 0x42, 0x3c, 0x00, 0x12, + 0x5f, 0xfc, 0x1f, 0x71, 0xa8, 0xfd, 0xff, 0x54, 0x22, 0x80, 0x40, 0x39, + 0x5f, 0x00, 0x00, 0x6b, 0x48, 0xfd, 0xff, 0x54, 0x22, 0x84, 0x40, 0x39, + 0x5f, 0x00, 0x00, 0x6b, 0xe8, 0xfc, 0xff, 0x54, 0x24, 0x24, 0x40, 0xb9, + 0x02, 0x00, 0xbe, 0x12, 0x9f, 0x00, 0x02, 0x6b, 0x68, 0xfc, 0xff, 0x54, + 0x24, 0x28, 0x40, 0xb9, 0x9f, 0x00, 0x02, 0x6b, 0x08, 0xfc, 0xff, 0x54, + 0x20, 0xcc, 0x40, 0x39, 0x80, 0x00, 0x00, 0x34, 0x22, 0x2c, 0x40, 0xb9, + 0x7f, 0x00, 0x02, 0x6b, 0xe8, 0x00, 0x00, 0x54, 0x22, 0xc0, 0x40, 0x39, + 0x5f, 0x3c, 0x00, 0x71, 0x88, 0x00, 0x00, 0x54, 0x22, 0xc4, 0x40, 0x39, + 0x5f, 0x04, 0x00, 0x71, 0x69, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x22, 0xc8, 0x40, 0x39, 0x5f, 0x04, 0x00, 0x71, + 0x02, 0x98, 0x41, 0x7a, 0x68, 0xff, 0xff, 0x54, 0x20, 0xd0, 0x40, 0x39, + 0x1f, 0x04, 0x00, 0x71, 0x08, 0xff, 0xff, 0x54, 0x20, 0xd4, 0x40, 0x39, + 0x1f, 0x3c, 0x00, 0x71, 0xa8, 0xfe, 0xff, 0x54, 0x22, 0x44, 0x40, 0xb9, + 0xe0, 0xff, 0x8f, 0x52, 0x5f, 0x00, 0x00, 0x6b, 0x28, 0xfe, 0xff, 0x54, + 0x20, 0x98, 0xc0, 0x79, 0xe0, 0xfd, 0xff, 0x37, 0x20, 0x9c, 0xc0, 0x79, + 0xa0, 0xfd, 0xff, 0x37, 0x20, 0x90, 0xc0, 0x79, 0x60, 0xfd, 0xff, 0x37, + 0x20, 0x94, 0xc0, 0x79, 0x20, 0xfd, 0xff, 0x37, 0x20, 0xa8, 0x40, 0x79, + 0x1f, 0xfc, 0x0f, 0x71, 0xc8, 0xfc, 0xff, 0x54, 0x21, 0x58, 0x40, 0xb9, + 0x00, 0xe0, 0xbf, 0x12, 0x3f, 0x00, 0x00, 0x6b, 0xe0, 0x97, 0x9f, 0x1a, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xe1, 0x00, 0x00, 0xb0, 0x21, 0x00, 0x1e, 0x91, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x02, 0x00, 0xb0, 0x94, 0x02, 0x1a, 0x91, + 0xe0, 0x03, 0x14, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, 0xe3, 0x7b, 0xff, 0x97, + 0xe1, 0x00, 0x00, 0xb0, 0x22, 0xc0, 0x0b, 0x91, 0xf3, 0x03, 0x00, 0x2a, + 0x36, 0x78, 0x41, 0xf9, 0x55, 0x04, 0x40, 0xf9, 0x00, 0x02, 0x00, 0x34, + 0xc1, 0x02, 0x40, 0xb9, 0xe0, 0x03, 0x21, 0x2a, 0x00, 0x00, 0x1f, 0x12, + 0x00, 0x00, 0x01, 0x4a, 0xc0, 0x02, 0x00, 0xb9, 0xa1, 0x02, 0x40, 0xb9, + 0xe0, 0x03, 0x21, 0x2a, 0x00, 0x00, 0x1f, 0x12, 0x00, 0x00, 0x01, 0x4a, + 0xa0, 0x02, 0x00, 0xb9, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x80, 0x82, 0x01, 0x91, 0xe1, 0x00, 0x00, 0xb0, 0x21, 0x80, 0x1e, 0x91, + 0xca, 0x7b, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0x80, 0x03, 0x00, 0x35, + 0xc5, 0x02, 0x40, 0xb9, 0x03, 0x00, 0x00, 0x90, 0x63, 0x00, 0x20, 0x91, + 0x02, 0x0e, 0x80, 0x52, 0xe4, 0x03, 0x25, 0x2a, 0x01, 0x00, 0x80, 0x52, + 0x84, 0x00, 0x1f, 0x12, 0xc0, 0x09, 0x80, 0x52, 0x84, 0x00, 0x05, 0x4a, + 0xc4, 0x02, 0x00, 0xb9, 0xa5, 0x02, 0x40, 0xb9, 0xe4, 0x03, 0x25, 0x2a, + 0x84, 0x00, 0x1f, 0x12, 0x84, 0x00, 0x05, 0x4a, 0xa4, 0x02, 0x00, 0xb9, + 0x50, 0x10, 0x00, 0x94, 0xf3, 0x03, 0x00, 0x2a, 0x80, 0xfc, 0xff, 0x35, + 0xf3, 0x53, 0x41, 0xa9, 0x03, 0x00, 0x00, 0x90, 0x63, 0x80, 0x20, 0x91, + 0x02, 0x0e, 0x80, 0x52, 0xf5, 0x5b, 0x42, 0xa9, 0x01, 0x00, 0x80, 0x52, + 0xfd, 0x7b, 0xc3, 0xa8, 0xe0, 0x09, 0x80, 0x52, 0x45, 0x10, 0x00, 0x14, + 0xe0, 0x03, 0x14, 0xaa, 0xbb, 0x7b, 0xff, 0x97, 0xce, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0x3f, 0x08, 0x00, 0x71, + 0x42, 0x1c, 0x00, 0x12, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x63, 0x1c, 0x00, 0x12, 0xf3, 0x03, 0x01, 0x2a, 0xff, 0x73, 0x00, 0x79, + 0xf4, 0x03, 0x00, 0x2a, 0x00, 0x08, 0x00, 0x54, 0x89, 0x02, 0x00, 0x54, + 0x3f, 0x0c, 0x00, 0x71, 0x00, 0x06, 0x00, 0x54, 0x3f, 0x10, 0x00, 0x71, + 0x20, 0x00, 0x80, 0x52, 0x81, 0x01, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, + 0xe1, 0xc3, 0x00, 0x91, 0xff, 0xc3, 0x00, 0x39, 0xe3, 0xc7, 0x00, 0x39, + 0xe2, 0xcb, 0x00, 0x39, 0xff, 0xcf, 0x00, 0x39, 0xff, 0x37, 0x00, 0xb9, + 0xe0, 0x73, 0x00, 0x79, 0xe0, 0x03, 0x14, 0x2a, 0xeb, 0xfe, 0xff, 0x97, + 0x00, 0x02, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x20, 0x80, 0x52, 0x01, 0x05, 0x00, 0x34, + 0xe1, 0xc3, 0x00, 0x91, 0xff, 0xc3, 0x00, 0x39, 0xe3, 0xc7, 0x00, 0x39, + 0xe2, 0xcb, 0x00, 0x39, 0xff, 0xcf, 0x00, 0x39, 0xff, 0x37, 0x00, 0xb9, + 0xe0, 0x73, 0x00, 0x79, 0xe0, 0x03, 0x14, 0x2a, 0xdc, 0xfe, 0xff, 0x97, + 0x40, 0xfe, 0xff, 0x35, 0xf5, 0x13, 0x00, 0xf9, 0xf5, 0x02, 0x00, 0xb0, + 0xa0, 0x02, 0x1a, 0x91, 0x15, 0x0c, 0x80, 0xd2, 0x01, 0x00, 0x80, 0x12, + 0x95, 0x02, 0x15, 0x9b, 0xe0, 0x03, 0x15, 0xaa, 0x9f, 0x7b, 0xff, 0x97, + 0x20, 0x03, 0x00, 0x35, 0xe1, 0x02, 0x00, 0xb0, 0x21, 0xc0, 0x19, 0x91, + 0xe0, 0x03, 0x15, 0xaa, 0x33, 0x78, 0x34, 0xb8, 0x8d, 0x7b, 0xff, 0x97, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x20, 0xa0, 0x52, 0xe1, 0xc3, 0x00, 0x91, + 0xff, 0xc3, 0x00, 0x39, 0xe3, 0xc7, 0x00, 0x39, 0xe2, 0xcb, 0x00, 0x39, + 0xff, 0xcf, 0x00, 0x39, 0xe0, 0x37, 0x00, 0xb9, 0xe0, 0x03, 0x14, 0x2a, + 0xc0, 0xfe, 0xff, 0x97, 0xc0, 0xfa, 0xff, 0x35, 0xe4, 0xff, 0xff, 0x17, + 0x20, 0x00, 0xa0, 0x52, 0xf5, 0xff, 0xff, 0x17, 0x20, 0x00, 0x80, 0x52, + 0xf3, 0xff, 0xff, 0x17, 0xf5, 0x13, 0x40, 0xf9, 0xcf, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x03, 0x00, 0xaa, 0x14, 0xff, 0xff, 0x97, 0xa0, 0x02, 0x00, 0x35, + 0xf5, 0x13, 0x00, 0xf9, 0xe1, 0x00, 0x00, 0xb0, 0x22, 0xc0, 0x0b, 0x91, + 0x15, 0x0c, 0x80, 0xd2, 0x80, 0x02, 0x40, 0x39, 0xe3, 0x03, 0x02, 0xaa, + 0x42, 0x20, 0x00, 0x91, 0x01, 0x00, 0x80, 0x12, 0x1f, 0x10, 0x00, 0x71, + 0x42, 0x20, 0x83, 0x9a, 0x1f, 0x0c, 0x00, 0x71, 0xa0, 0x82, 0x9f, 0x9a, + 0xf5, 0x02, 0x00, 0xb0, 0xb5, 0x02, 0x1a, 0x91, 0xb5, 0x02, 0x00, 0x8b, + 0xe0, 0x03, 0x15, 0xaa, 0x53, 0x00, 0x40, 0xf9, 0x69, 0x7b, 0xff, 0x97, + 0xa0, 0x00, 0x00, 0x34, 0xf5, 0x13, 0x40, 0xf9, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x61, 0x86, 0x40, 0xb9, + 0xe0, 0x03, 0x15, 0xaa, 0x83, 0x06, 0x40, 0x79, 0x82, 0x32, 0x40, 0x79, + 0x21, 0x78, 0x1f, 0x12, 0x88, 0x36, 0x40, 0x79, 0x87, 0x3a, 0x40, 0x79, + 0x84, 0x0a, 0x40, 0x79, 0x85, 0x0e, 0x40, 0x79, 0x61, 0x86, 0x00, 0xb9, + 0x84, 0x7c, 0x01, 0x53, 0xa5, 0x04, 0x00, 0x51, 0x61, 0x16, 0x40, 0xb9, + 0x84, 0x04, 0x00, 0x51, 0x86, 0x02, 0x40, 0x39, 0xc1, 0x08, 0x00, 0x33, + 0x61, 0x16, 0x00, 0xb9, 0x61, 0x12, 0x40, 0xb9, 0x61, 0x04, 0x00, 0x33, + 0x61, 0x12, 0x00, 0xb9, 0x61, 0x1a, 0x40, 0xb9, 0x81, 0x30, 0x00, 0x33, + 0x61, 0x1a, 0x00, 0xb9, 0x64, 0x7a, 0x40, 0xb9, 0xa4, 0x28, 0x00, 0x33, + 0x64, 0x7a, 0x00, 0xb9, 0x64, 0x0a, 0x40, 0xb9, 0x81, 0x0a, 0x40, 0xb9, + 0x24, 0x04, 0x1e, 0x33, 0x64, 0x0a, 0x00, 0xb9, 0x84, 0x86, 0x41, 0x29, + 0x86, 0x16, 0x40, 0xb9, 0x65, 0x0e, 0x40, 0xb9, 0x84, 0x04, 0x00, 0x12, + 0x21, 0x04, 0x1e, 0x53, 0xa5, 0x64, 0x1a, 0x12, 0xc6, 0x04, 0x1c, 0x53, + 0x84, 0x00, 0x05, 0x2a, 0x21, 0x00, 0x06, 0x2a, 0x21, 0x00, 0x04, 0x2a, + 0x61, 0x0e, 0x00, 0xb9, 0x63, 0x1e, 0x40, 0xb9, 0x63, 0x3c, 0x10, 0x12, + 0x63, 0x00, 0x02, 0x2a, 0x63, 0x1e, 0x00, 0xb9, 0x62, 0x22, 0x40, 0xb9, + 0x42, 0x3c, 0x10, 0x12, 0x42, 0x00, 0x08, 0x2a, 0x62, 0x22, 0x00, 0xb9, + 0x61, 0x26, 0x40, 0xb9, 0x21, 0x3c, 0x10, 0x12, 0x21, 0x00, 0x07, 0x2a, + 0x61, 0x26, 0x00, 0xb9, 0x64, 0x2a, 0x40, 0xb9, 0x81, 0x82, 0x40, 0x39, + 0x85, 0x26, 0x40, 0xb9, 0x84, 0x08, 0x04, 0x12, 0x83, 0x76, 0x40, 0x79, + 0xa5, 0x6c, 0x00, 0x12, 0x82, 0x72, 0x40, 0x79, 0xa1, 0x7c, 0x01, 0x2a, + 0x21, 0x00, 0x04, 0x2a, 0x61, 0x2a, 0x00, 0xb9, 0x63, 0x38, 0x10, 0x53, + 0x41, 0x38, 0x00, 0x12, 0x63, 0x00, 0x01, 0x2a, 0x82, 0x2a, 0x40, 0xb9, + 0x61, 0x2e, 0x40, 0xb9, 0x41, 0x6c, 0x00, 0x33, 0x61, 0x2e, 0x00, 0xb9, + 0x81, 0x2e, 0x40, 0xb9, 0x61, 0x3e, 0x00, 0xb9, 0x81, 0xc2, 0x40, 0x39, + 0x86, 0xc6, 0x40, 0x39, 0x82, 0xca, 0x40, 0x39, 0x85, 0xce, 0x40, 0x39, + 0x21, 0x0c, 0x1d, 0x53, 0x64, 0x36, 0x40, 0xb9, 0xc6, 0x00, 0x1e, 0x53, + 0xa5, 0x00, 0x00, 0x12, 0x42, 0x00, 0x1f, 0x53, 0x42, 0x00, 0x05, 0x2a, + 0x21, 0x00, 0x06, 0x2a, 0x21, 0x00, 0x02, 0x2a, 0x82, 0x60, 0x19, 0x12, + 0x21, 0x00, 0x02, 0x2a, 0x61, 0x36, 0x00, 0xb9, 0x61, 0x06, 0x40, 0xb9, + 0x82, 0xce, 0x40, 0x39, 0x41, 0x00, 0x1a, 0x33, 0x61, 0x06, 0x00, 0xb9, + 0x81, 0xd2, 0x40, 0x39, 0x84, 0xd6, 0x40, 0x39, 0x62, 0x3a, 0x40, 0xb9, + 0x84, 0x0c, 0x00, 0x12, 0x21, 0x00, 0x1c, 0x53, 0x21, 0x00, 0x04, 0x2a, + 0x42, 0x68, 0x1b, 0x12, 0x21, 0x00, 0x02, 0x2a, 0x61, 0x3a, 0x00, 0xb9, + 0x61, 0x4e, 0x40, 0xb9, 0x21, 0x80, 0x01, 0x12, 0x61, 0x00, 0x01, 0x2a, + 0x61, 0x4e, 0x00, 0xb9, 0x81, 0x3e, 0x40, 0xb9, 0x61, 0x52, 0x00, 0xb9, + 0x81, 0x42, 0x40, 0xb9, 0x61, 0x56, 0x00, 0xb9, 0x82, 0x46, 0x40, 0xb9, + 0x61, 0x5a, 0x40, 0xb9, 0x41, 0x38, 0x00, 0x33, 0x61, 0x5a, 0x00, 0xb9, + 0x64, 0x5e, 0x40, 0xb9, 0x82, 0x92, 0x40, 0x79, 0x83, 0x96, 0x40, 0x79, + 0x84, 0x04, 0x02, 0x12, 0x81, 0x9e, 0x40, 0x79, 0x63, 0x38, 0x00, 0x12, + 0x42, 0x38, 0x11, 0x53, 0x42, 0x00, 0x03, 0x2a, 0x83, 0x9a, 0x40, 0x79, + 0x21, 0x38, 0x10, 0x53, 0x42, 0x00, 0x04, 0x2a, 0x63, 0x38, 0x00, 0x12, + 0x21, 0x00, 0x03, 0x2a, 0x83, 0xaa, 0x40, 0x79, 0xf5, 0x13, 0x40, 0xf9, + 0x62, 0x5e, 0x00, 0xb9, 0x62, 0x62, 0x40, 0xb9, 0x42, 0x80, 0x01, 0x12, + 0x21, 0x00, 0x02, 0x2a, 0x61, 0x62, 0x00, 0xb9, 0x61, 0x66, 0x40, 0xb9, + 0x82, 0x42, 0x41, 0x39, 0x21, 0x5c, 0x18, 0x12, 0x21, 0x00, 0x02, 0x2a, + 0x61, 0x66, 0x00, 0xb9, 0x61, 0x6a, 0x40, 0xb9, 0x61, 0x24, 0x00, 0x33, + 0x61, 0x6a, 0x00, 0xb9, 0x61, 0x6e, 0x40, 0xb9, 0x82, 0x5a, 0x40, 0xb9, + 0x41, 0x5c, 0x00, 0x33, 0x61, 0x6e, 0x00, 0xb9, 0x62, 0x86, 0x40, 0xb9, + 0xe1, 0x03, 0x22, 0x2a, 0x21, 0x00, 0x00, 0x12, 0x21, 0x00, 0x02, 0x4a, + 0x61, 0x86, 0x00, 0xb9, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x7a, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x90, 0x83, 0xc0, 0x0b, 0x91, + 0xe5, 0x03, 0x00, 0x2a, 0xe4, 0x03, 0x03, 0xaa, 0xbf, 0x00, 0x00, 0x71, + 0x63, 0x20, 0x00, 0x91, 0xfd, 0x7b, 0xbc, 0xa9, 0x63, 0x10, 0x84, 0x9a, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x73, 0x00, 0x40, 0xf9, + 0xe2, 0x3f, 0x00, 0xb9, 0x21, 0x0c, 0x00, 0xb4, 0xf4, 0x03, 0x01, 0xaa, + 0x21, 0x10, 0x40, 0xb9, 0x00, 0xf8, 0xbf, 0x12, 0x3f, 0x00, 0x00, 0x6b, + 0xa9, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x80, 0x2a, 0x40, 0x79, + 0x1f, 0xf4, 0x1f, 0x71, 0x48, 0xff, 0xff, 0x54, 0x81, 0x62, 0x40, 0x39, + 0x20, 0x00, 0x80, 0x52, 0x3f, 0x00, 0x00, 0x6b, 0xe8, 0xfe, 0xff, 0x54, + 0x81, 0x66, 0x40, 0x39, 0x3f, 0x00, 0x00, 0x6b, 0x88, 0xfe, 0xff, 0x54, + 0x83, 0x1e, 0x40, 0xb9, 0x01, 0x00, 0xbe, 0x12, 0x7f, 0x00, 0x01, 0x6b, + 0x08, 0xfe, 0xff, 0x54, 0x83, 0x22, 0x40, 0xb9, 0x7f, 0x00, 0x01, 0x6b, + 0xa8, 0xfd, 0xff, 0x54, 0xf5, 0x13, 0x00, 0xf9, 0xf5, 0x02, 0x00, 0x90, + 0xb5, 0x02, 0x1a, 0x91, 0x00, 0x0c, 0x80, 0xd2, 0x01, 0x00, 0x80, 0x12, + 0xb5, 0x54, 0x00, 0x9b, 0xe0, 0x03, 0x15, 0xaa, 0x9a, 0x7a, 0xff, 0x97, + 0x40, 0x08, 0x00, 0x35, 0x61, 0x86, 0x40, 0xb9, 0xe0, 0x03, 0x15, 0xaa, + 0x86, 0x2a, 0x40, 0x79, 0x83, 0x0a, 0x40, 0x79, 0x21, 0x78, 0x1f, 0x12, + 0x61, 0x86, 0x00, 0xb9, 0xe2, 0x3f, 0x40, 0xb9, 0x61, 0x12, 0x40, 0xb9, + 0x21, 0x74, 0x1e, 0x12, 0x21, 0x00, 0x00, 0x32, 0x61, 0x12, 0x00, 0xb9, + 0x81, 0x62, 0x40, 0x39, 0x85, 0x1e, 0x40, 0xb9, 0x64, 0x2a, 0x40, 0xb9, + 0xa5, 0x6c, 0x00, 0x12, 0x84, 0x08, 0x04, 0x12, 0xa1, 0x7c, 0x01, 0x2a, + 0x21, 0x00, 0x04, 0x2a, 0x61, 0x2a, 0x00, 0xb9, 0x61, 0x2e, 0x40, 0xb9, + 0x84, 0x22, 0x40, 0xb9, 0x81, 0x6c, 0x00, 0x33, 0x61, 0x2e, 0x00, 0xb9, + 0x61, 0x0a, 0x40, 0xb9, 0x84, 0x0e, 0x40, 0xb9, 0x81, 0x04, 0x1e, 0x33, + 0x61, 0x0a, 0x00, 0xb9, 0x61, 0x72, 0x40, 0xb9, 0x84, 0x12, 0x40, 0xb9, + 0x81, 0x54, 0x00, 0x33, 0x61, 0x72, 0x00, 0xb9, 0x61, 0x76, 0x40, 0xb9, + 0xc1, 0x28, 0x00, 0x33, 0x61, 0x76, 0x00, 0xb9, 0x61, 0x06, 0x40, 0xb9, + 0x21, 0x78, 0x19, 0x12, 0x61, 0x06, 0x00, 0xb9, 0x61, 0x0e, 0x40, 0xb9, + 0x41, 0x04, 0x00, 0x33, 0x61, 0x0e, 0x00, 0xb9, 0x61, 0x1e, 0x40, 0xb9, + 0x21, 0x3c, 0x10, 0x12, 0x61, 0x1e, 0x00, 0xb9, 0x61, 0x22, 0x40, 0xb9, + 0x21, 0x3c, 0x10, 0x12, 0x61, 0x22, 0x00, 0xb9, 0x61, 0x26, 0x40, 0xb9, + 0x21, 0x3c, 0x10, 0x12, 0x61, 0x26, 0x00, 0xb9, 0x61, 0x16, 0x40, 0xb9, + 0xf5, 0x13, 0x40, 0xf9, 0x61, 0x08, 0x00, 0x33, 0x61, 0x16, 0x00, 0xb9, + 0x62, 0x86, 0x40, 0xb9, 0xe1, 0x03, 0x22, 0x2a, 0x21, 0x00, 0x00, 0x12, + 0x21, 0x00, 0x02, 0x4a, 0x61, 0x86, 0x00, 0xb9, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0x50, 0x7a, 0xff, 0x17, 0x40, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf5, 0x13, 0x40, 0xf9, 0xa1, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x21, 0x11, 0x00, 0xb4, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x01, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, + 0x15, 0x1c, 0x00, 0x12, 0x20, 0x00, 0x40, 0xb9, 0x1f, 0x10, 0x00, 0x71, + 0xe9, 0x00, 0x00, 0x54, 0x22, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x02, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x04, 0x40, 0xb9, 0x1f, 0x10, 0x00, 0x71, + 0x08, 0xff, 0xff, 0x54, 0xf7, 0x1b, 0x00, 0xf9, 0xbf, 0x1e, 0x00, 0x71, + 0x28, 0x11, 0x00, 0x54, 0xbf, 0x0e, 0x00, 0x71, 0xb6, 0x7e, 0x40, 0x93, + 0xe2, 0x00, 0x00, 0x90, 0x42, 0x80, 0x11, 0x91, 0x00, 0x0c, 0x80, 0xd2, + 0xf4, 0x02, 0x00, 0x90, 0x94, 0x02, 0x1a, 0x91, 0x00, 0x80, 0x9f, 0x9a, + 0x94, 0x02, 0x00, 0x8b, 0x01, 0x00, 0x80, 0x12, 0xe0, 0x03, 0x14, 0xaa, + 0x57, 0x78, 0x76, 0xf8, 0x32, 0x7a, 0xff, 0x97, 0xe2, 0x03, 0x00, 0x2a, + 0x80, 0x14, 0x00, 0x35, 0xbf, 0x0e, 0x00, 0x71, 0xc9, 0x0c, 0x00, 0x54, + 0xe0, 0x00, 0x00, 0x90, 0x00, 0x7c, 0x41, 0xf9, 0xe3, 0x00, 0x00, 0x90, + 0x63, 0x80, 0x1c, 0x91, 0xe5, 0x16, 0x40, 0xb9, 0xe6, 0x26, 0x40, 0xb9, + 0xe1, 0x00, 0x00, 0x90, 0x21, 0x80, 0x18, 0x91, 0x64, 0x02, 0x40, 0xb9, + 0xa5, 0x14, 0x44, 0xd3, 0xc9, 0x34, 0x4c, 0xd3, 0x9f, 0x0c, 0x00, 0x71, + 0x63, 0x78, 0x76, 0xf8, 0x26, 0x78, 0x76, 0xf8, 0x88, 0x00, 0x00, 0x54, + 0x61, 0x06, 0x40, 0xb9, 0x3f, 0x0c, 0x00, 0x71, 0xe9, 0x0a, 0x00, 0x54, + 0x07, 0x84, 0x40, 0xb9, 0x01, 0x10, 0x02, 0x91, 0x64, 0x30, 0x00, 0x91, + 0xe7, 0x78, 0x1f, 0x12, 0x07, 0x84, 0x00, 0xb9, 0x60, 0x0c, 0x40, 0xb9, + 0x00, 0x78, 0x14, 0x12, 0x60, 0x0c, 0x00, 0xb9, 0x63, 0x02, 0x40, 0xb9, + 0x7f, 0x08, 0x00, 0x71, 0xc0, 0x0e, 0x00, 0x54, 0x00, 0x00, 0x80, 0x52, + 0x08, 0x00, 0x80, 0x52, 0x7f, 0x08, 0x00, 0x71, 0x68, 0x07, 0x00, 0x54, + 0xe3, 0x0c, 0x00, 0x34, 0x1f, 0x01, 0x00, 0x71, 0x27, 0x00, 0x40, 0xb9, + 0x0a, 0x10, 0x89, 0x1a, 0x03, 0x20, 0x80, 0x52, 0x47, 0x05, 0x1f, 0x33, + 0x27, 0x00, 0x00, 0xb9, 0x87, 0x00, 0x40, 0xb9, 0x47, 0x09, 0x18, 0x33, + 0x87, 0x00, 0x00, 0xb9, 0x67, 0x06, 0x40, 0xb9, 0xff, 0x08, 0x00, 0x71, + 0xa0, 0x0a, 0x00, 0x54, 0xa8, 0x04, 0x00, 0x54, 0xa7, 0x0b, 0x00, 0x34, + 0x1f, 0x01, 0x00, 0x71, 0x25, 0x00, 0x40, 0xb9, 0x00, 0x10, 0x89, 0x1a, + 0x02, 0x80, 0x80, 0x52, 0x05, 0x04, 0x1f, 0x33, 0x25, 0x00, 0x00, 0xb9, + 0x85, 0x00, 0x40, 0xb9, 0x05, 0x08, 0x18, 0x33, 0x85, 0x00, 0x00, 0xb9, + 0x27, 0x00, 0x40, 0xb9, 0xe0, 0x03, 0x14, 0xaa, 0xf3, 0x53, 0x41, 0xa9, + 0xe5, 0x03, 0x27, 0x2a, 0xa5, 0x00, 0x00, 0x12, 0xa5, 0x00, 0x07, 0x4a, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0x25, 0x00, 0x00, 0xb9, + 0x85, 0x00, 0x40, 0xb9, 0xe1, 0x03, 0x25, 0x2a, 0x21, 0x00, 0x15, 0x12, + 0x21, 0x00, 0x05, 0x4a, 0x81, 0x00, 0x00, 0xb9, 0xc1, 0x34, 0x40, 0xb9, + 0x23, 0x00, 0x03, 0x4a, 0x63, 0x04, 0x18, 0x12, 0x63, 0x00, 0x01, 0x4a, + 0xc3, 0x34, 0x00, 0xb9, 0xc1, 0x34, 0x40, 0xb9, 0x22, 0x00, 0x02, 0x4a, + 0x42, 0x04, 0x16, 0x12, 0x42, 0x00, 0x01, 0x4a, 0xc2, 0x34, 0x00, 0xb9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xcf, 0x79, 0xff, 0x17, 0xff, 0x0c, 0x00, 0x71, + 0xa1, 0xfc, 0xff, 0x54, 0x27, 0x00, 0x40, 0xb9, 0x1f, 0x01, 0x00, 0x71, + 0x00, 0x10, 0x85, 0x1a, 0x02, 0x80, 0x81, 0x52, 0xe5, 0x03, 0x07, 0x2a, + 0xda, 0xff, 0xff, 0x17, 0x7f, 0x0c, 0x00, 0x71, 0x41, 0x04, 0x00, 0x54, + 0x1f, 0x01, 0x00, 0x71, 0x27, 0x00, 0x40, 0xb9, 0x0a, 0x10, 0x85, 0x1a, + 0x03, 0x60, 0x80, 0x52, 0xc5, 0xff, 0xff, 0x17, 0x42, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x02, 0x2a, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x00, 0x00, 0x90, + 0x00, 0x78, 0x41, 0xf9, 0x9b, 0xff, 0xff, 0x17, 0x07, 0x84, 0x40, 0xb9, + 0x64, 0x30, 0x00, 0x91, 0x3f, 0x01, 0x05, 0x6b, 0x01, 0x10, 0x02, 0x91, + 0xe7, 0x78, 0x1f, 0x12, 0x07, 0x84, 0x00, 0xb9, 0x20, 0x91, 0x85, 0x1a, + 0x67, 0x0c, 0x40, 0xb9, 0xe7, 0x78, 0x14, 0x12, 0x67, 0x0c, 0x00, 0xb9, + 0x63, 0x02, 0x40, 0xb9, 0x7f, 0x08, 0x00, 0x71, 0x40, 0x05, 0x00, 0x54, + 0x28, 0x00, 0x80, 0x52, 0xa9, 0xff, 0xff, 0x17, 0x22, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x02, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x67, 0x06, 0x40, 0xb9, 0x03, 0x00, 0x80, 0x52, 0xff, 0x08, 0x00, 0x71, + 0xa1, 0xf5, 0xff, 0x54, 0x27, 0x00, 0x40, 0xb9, 0x1f, 0x01, 0x00, 0x71, + 0x00, 0x10, 0x85, 0x1a, 0x02, 0x00, 0x81, 0x52, 0xe5, 0x03, 0x07, 0x2a, + 0xad, 0xff, 0xff, 0x17, 0x1f, 0x01, 0x00, 0x71, 0x27, 0x00, 0x40, 0xb9, + 0x0a, 0x10, 0x85, 0x1a, 0x9b, 0xff, 0xff, 0x17, 0x27, 0x00, 0x40, 0xb9, + 0x1f, 0x01, 0x00, 0x71, 0x00, 0x10, 0x85, 0x1a, 0x02, 0x00, 0x80, 0x52, + 0xe5, 0x03, 0x07, 0x2a, 0xa3, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x05, 0x2a, + 0x0a, 0x00, 0x80, 0x52, 0x08, 0x00, 0x80, 0x52, 0x27, 0x00, 0x40, 0xb9, + 0x03, 0x40, 0x80, 0x52, 0x07, 0x04, 0x1f, 0x33, 0x27, 0x00, 0x00, 0xb9, + 0x87, 0x00, 0x40, 0xb9, 0x07, 0x08, 0x18, 0x33, 0xe0, 0x03, 0x0a, 0x2a, + 0x87, 0x00, 0x00, 0xb9, 0x8e, 0xff, 0xff, 0x17, 0xea, 0x03, 0x00, 0x2a, + 0x28, 0x00, 0x80, 0x52, 0xf5, 0xff, 0xff, 0x17, 0xf7, 0x1b, 0x40, 0xf9, + 0x42, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x40, 0x92, 0x21, 0x1c, 0x00, 0x12, 0x1f, 0x1c, 0x00, 0x71, + 0xe8, 0x01, 0x00, 0x54, 0xe3, 0x00, 0x00, 0x90, 0x63, 0x80, 0x18, 0x91, + 0x60, 0x78, 0x60, 0xf8, 0x03, 0x00, 0x40, 0xb9, 0x00, 0x00, 0x40, 0xb9, + 0x63, 0x1c, 0x45, 0xd3, 0x00, 0x24, 0x48, 0xd3, 0x7f, 0x00, 0x00, 0x6b, + 0x02, 0x01, 0x00, 0x54, 0x03, 0x00, 0x03, 0x4b, 0x00, 0x00, 0x80, 0x52, + 0x21, 0x20, 0xc3, 0x1a, 0x41, 0x00, 0x00, 0x79, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x80, 0x52, + 0x41, 0x00, 0x00, 0x79, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xba, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xc1, 0x14, 0x00, 0xb4, 0xf5, 0x5b, 0x02, 0xa9, 0x16, 0x1c, 0x00, 0x12, + 0x20, 0x00, 0x40, 0xb9, 0xf4, 0x03, 0x01, 0xaa, 0x1f, 0x10, 0x00, 0x71, + 0xe9, 0x00, 0x00, 0x54, 0xf5, 0x5b, 0x42, 0xa9, 0x33, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x04, 0x40, 0xb9, 0x1f, 0x10, 0x00, 0x71, + 0x08, 0xff, 0xff, 0x54, 0xf7, 0x63, 0x03, 0xa9, 0xdf, 0x1e, 0x00, 0x71, + 0xf9, 0x6b, 0x04, 0xa9, 0xfb, 0x73, 0x05, 0xa9, 0x08, 0x14, 0x00, 0x54, + 0xdf, 0x0e, 0x00, 0x71, 0xdb, 0x7e, 0x40, 0x93, 0xe3, 0x00, 0x00, 0x90, + 0x63, 0x80, 0x18, 0x91, 0xe2, 0x00, 0x00, 0x90, 0x42, 0x80, 0x19, 0x91, + 0x00, 0x0c, 0x80, 0xd2, 0xf8, 0x02, 0x00, 0x90, 0x18, 0x03, 0x1a, 0x91, + 0x00, 0x80, 0x9f, 0x9a, 0x18, 0x03, 0x00, 0x8b, 0x01, 0x00, 0x80, 0x12, + 0xe0, 0x03, 0x18, 0xaa, 0x77, 0x78, 0x7b, 0xf8, 0x55, 0x78, 0x7b, 0xf8, + 0x49, 0x79, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0x20, 0x1a, 0x00, 0x35, + 0xdf, 0x0e, 0x00, 0x71, 0x68, 0x10, 0x00, 0x54, 0xe0, 0x00, 0x00, 0x90, + 0x1c, 0x78, 0x41, 0xf9, 0xe1, 0x00, 0x00, 0x90, 0x21, 0x80, 0x1c, 0x91, + 0xfa, 0x02, 0x40, 0xb9, 0xf9, 0x02, 0x40, 0xb9, 0xe0, 0x03, 0x16, 0x2a, + 0xe2, 0x02, 0x40, 0xb9, 0x36, 0x78, 0x7b, 0xf8, 0x5a, 0x27, 0x48, 0xd3, + 0x5b, 0x1c, 0x45, 0xd3, 0x39, 0x07, 0x00, 0x12, 0x1c, 0x6b, 0xff, 0x97, + 0x81, 0x02, 0x40, 0xb9, 0x3f, 0x0c, 0x00, 0x71, 0x88, 0x00, 0x00, 0x54, + 0x81, 0x06, 0x40, 0xb9, 0x3f, 0x0c, 0x00, 0x71, 0x69, 0x0e, 0x00, 0x54, + 0x03, 0x00, 0x80, 0x52, 0x05, 0x00, 0x80, 0x52, 0x81, 0x87, 0x40, 0xb9, + 0x82, 0x13, 0x02, 0x91, 0x21, 0x78, 0x1f, 0x12, 0x81, 0x87, 0x00, 0xb9, + 0xc1, 0x0e, 0x40, 0xb9, 0x21, 0x78, 0x14, 0x12, 0xc1, 0x0e, 0x00, 0xb9, + 0x84, 0x02, 0x40, 0xb9, 0x9f, 0x08, 0x00, 0x71, 0x00, 0x12, 0x00, 0x54, + 0x68, 0x07, 0x00, 0x54, 0xe4, 0x13, 0x00, 0x34, 0x01, 0x48, 0x88, 0x52, + 0xe1, 0x01, 0xa0, 0x72, 0x1f, 0x00, 0x01, 0x6b, 0xc9, 0x0e, 0x00, 0x54, + 0xbf, 0x00, 0x00, 0x71, 0x41, 0x00, 0x40, 0xb9, 0x66, 0x10, 0x99, 0x1a, + 0x24, 0x00, 0x80, 0x52, 0xc1, 0x04, 0x1f, 0x33, 0x41, 0x00, 0x00, 0xb9, + 0xc1, 0x0e, 0x40, 0xb9, 0xc1, 0x08, 0x18, 0x33, 0xc1, 0x0e, 0x00, 0xb9, + 0x81, 0x06, 0x40, 0xb9, 0x3f, 0x08, 0x00, 0x71, 0x01, 0x07, 0x00, 0x54, + 0xbf, 0x00, 0x00, 0x71, 0x40, 0x00, 0x40, 0xb9, 0x63, 0x10, 0x99, 0x1a, + 0x73, 0x3e, 0x10, 0x53, 0x01, 0x06, 0x80, 0x52, 0x60, 0x04, 0x1f, 0x33, + 0x40, 0x00, 0x00, 0xb9, 0xc0, 0x0e, 0x40, 0xb9, 0x60, 0x08, 0x18, 0x33, + 0xc0, 0x0e, 0x00, 0xb9, 0x45, 0x00, 0x40, 0xb9, 0xe0, 0x03, 0x18, 0xaa, + 0xf9, 0x6b, 0x44, 0xa9, 0xe3, 0x03, 0x25, 0x2a, 0x63, 0x00, 0x00, 0x12, + 0x63, 0x00, 0x05, 0x4a, 0xfb, 0x73, 0x45, 0xa9, 0x43, 0x00, 0x00, 0xb9, + 0xc3, 0x0e, 0x40, 0xb9, 0xe2, 0x03, 0x23, 0x2a, 0x42, 0x00, 0x15, 0x12, + 0x42, 0x00, 0x03, 0x4a, 0xc2, 0x0e, 0x00, 0xb9, 0xe2, 0x36, 0x40, 0xb9, + 0x82, 0x08, 0x00, 0x33, 0xe2, 0x36, 0x00, 0xb9, 0xe2, 0x36, 0x40, 0xb9, + 0x41, 0x00, 0x01, 0x4a, 0x21, 0x08, 0x1c, 0x12, 0x21, 0x00, 0x02, 0x4a, + 0xe1, 0x36, 0x00, 0xb9, 0xf7, 0x63, 0x43, 0xa9, 0xa2, 0x12, 0x40, 0xb9, + 0x41, 0x00, 0x13, 0x4a, 0x21, 0x00, 0x10, 0x12, 0x21, 0x00, 0x02, 0x4a, + 0xf3, 0x53, 0x41, 0xa9, 0xa1, 0x12, 0x00, 0xb9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc6, 0xa8, 0xdf, 0x78, 0xff, 0x17, 0x9f, 0x0c, 0x00, 0x71, + 0x21, 0x0a, 0x00, 0x54, 0xbf, 0x00, 0x00, 0x71, 0x41, 0x00, 0x40, 0xb9, + 0x66, 0x10, 0x9b, 0x1a, 0x84, 0x00, 0x80, 0x52, 0xc1, 0x04, 0x1f, 0x33, + 0x41, 0x00, 0x00, 0xb9, 0xc1, 0x0e, 0x40, 0xb9, 0xc1, 0x08, 0x18, 0x33, + 0xc1, 0x0e, 0x00, 0xb9, 0x81, 0x06, 0x40, 0xb9, 0x3f, 0x08, 0x00, 0x71, + 0xa0, 0x0b, 0x00, 0x54, 0x3f, 0x08, 0x00, 0x71, 0x88, 0x01, 0x00, 0x54, + 0xa1, 0x09, 0x00, 0x34, 0x01, 0x48, 0x88, 0x52, 0xe1, 0x01, 0xa0, 0x72, + 0x1f, 0x00, 0x01, 0x6b, 0xc9, 0x04, 0x00, 0x54, 0xbf, 0x00, 0x00, 0x71, + 0x40, 0x00, 0x40, 0xb9, 0x63, 0x10, 0x99, 0x1a, 0x73, 0x3e, 0x10, 0x53, + 0x01, 0x02, 0x80, 0x52, 0xc2, 0xff, 0xff, 0x17, 0x3f, 0x0c, 0x00, 0x71, + 0xc1, 0x08, 0x00, 0x54, 0xbf, 0x00, 0x00, 0x71, 0x40, 0x00, 0x40, 0xb9, + 0x63, 0x10, 0x9b, 0x1a, 0x73, 0x3e, 0x10, 0x53, 0x01, 0x08, 0x80, 0x52, + 0xba, 0xff, 0xff, 0x17, 0x53, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0x00, 0x00, 0x90, 0x1c, 0x7c, 0x41, 0xf9, 0x7e, 0xff, 0xff, 0x17, + 0x7f, 0x03, 0x1a, 0x6b, 0x25, 0x00, 0x80, 0x52, 0x63, 0x93, 0x9a, 0x1a, + 0x7f, 0x00, 0x19, 0x6b, 0x63, 0x90, 0x99, 0x1a, 0x8b, 0xff, 0xff, 0x17, + 0x33, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xbf, 0x00, 0x00, 0x71, 0x40, 0x00, 0x40, 0xb9, 0x63, 0x10, 0x9b, 0x1a, + 0x73, 0x3e, 0x10, 0x53, 0x01, 0x04, 0x80, 0x52, 0x9d, 0xff, 0xff, 0x17, + 0xbf, 0x00, 0x00, 0x71, 0x41, 0x00, 0x40, 0xb9, 0x66, 0x10, 0x9b, 0x1a, + 0x44, 0x00, 0x80, 0x52, 0xc1, 0x04, 0x1f, 0x33, 0x41, 0x00, 0x00, 0xb9, + 0xc1, 0x0e, 0x40, 0xb9, 0xc1, 0x08, 0x18, 0x33, 0xc1, 0x0e, 0x00, 0xb9, + 0x81, 0x06, 0x40, 0xb9, 0x3f, 0x08, 0x00, 0x71, 0x61, 0xf8, 0xff, 0x54, + 0xbf, 0x00, 0x00, 0x71, 0x40, 0x00, 0x40, 0xb9, 0x63, 0x10, 0x9b, 0x1a, + 0x73, 0x3e, 0x10, 0x53, 0x01, 0x06, 0x80, 0x52, 0x8b, 0xff, 0xff, 0x17, + 0xe4, 0x00, 0x80, 0x52, 0xb8, 0xff, 0xff, 0x17, 0x01, 0x48, 0x88, 0x52, + 0xe1, 0x01, 0xa0, 0x72, 0x1f, 0x00, 0x01, 0x6b, 0x09, 0x03, 0x00, 0x54, + 0xbf, 0x00, 0x00, 0x71, 0x41, 0x00, 0x40, 0xb9, 0x66, 0x10, 0x99, 0x1a, + 0x64, 0x00, 0x80, 0x52, 0x73, 0xff, 0xff, 0x17, 0xbf, 0x00, 0x00, 0x71, + 0x40, 0x00, 0x40, 0xb9, 0x63, 0x10, 0x9a, 0x1a, 0x33, 0x00, 0xa0, 0x52, + 0x7b, 0xff, 0xff, 0x17, 0x73, 0x3e, 0x10, 0x53, 0x01, 0x0e, 0x80, 0x52, + 0x7d, 0xff, 0xff, 0x17, 0xbf, 0x00, 0x00, 0x71, 0x41, 0x00, 0x40, 0xb9, + 0x66, 0x10, 0x9a, 0x1a, 0x33, 0x00, 0x80, 0x52, 0x9d, 0xff, 0xff, 0x17, + 0x01, 0x48, 0x88, 0x52, 0xe1, 0x01, 0xa0, 0x72, 0x1f, 0x00, 0x01, 0x6b, + 0x48, 0xed, 0xff, 0x54, 0xde, 0xff, 0xff, 0x17, 0xbf, 0x00, 0x00, 0x71, + 0x41, 0x00, 0x40, 0xb9, 0x66, 0x10, 0x9b, 0x1a, 0x64, 0x00, 0x80, 0x52, + 0xd1, 0xff, 0xff, 0x17, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0x0e, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x34, 0x1c, 0x00, 0x12, 0x9f, 0x06, 0x00, 0x71, + 0xa9, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x1c, 0x00, 0x12, + 0x1f, 0x1c, 0x00, 0x71, 0x48, 0xff, 0xff, 0x54, 0x1f, 0x0c, 0x00, 0x71, + 0x02, 0x7c, 0x40, 0x93, 0xe3, 0x00, 0x00, 0x90, 0x63, 0x80, 0x18, 0x91, + 0x00, 0x0c, 0x80, 0xd2, 0xf3, 0x02, 0x00, 0x90, 0x73, 0x02, 0x1a, 0x91, + 0x00, 0x80, 0x9f, 0x9a, 0x73, 0x02, 0x00, 0x8b, 0x01, 0x00, 0x80, 0x12, + 0xe0, 0x03, 0x13, 0xaa, 0xf5, 0x13, 0x00, 0xf9, 0x75, 0x78, 0x62, 0xf8, + 0x56, 0x78, 0xff, 0x97, 0x20, 0x01, 0x00, 0x35, 0xa1, 0x36, 0x40, 0xb9, + 0xe0, 0x03, 0x13, 0xaa, 0x81, 0x02, 0x14, 0x33, 0xf3, 0x53, 0x41, 0xa9, + 0xa1, 0x36, 0x00, 0xb9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0x41, 0x78, 0xff, 0x17, 0xf5, 0x13, 0x40, 0xf9, 0xe2, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0xe3, 0x00, 0x00, 0x90, 0x62, 0xc0, 0x0b, 0x91, 0xfd, 0x03, 0x00, 0x91, + 0xe1, 0x02, 0x00, 0x90, 0x21, 0x00, 0x1a, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0x2a, 0x1f, 0x00, 0x00, 0x71, 0xe4, 0x03, 0x02, 0xaa, + 0x00, 0x0c, 0x80, 0xd2, 0x42, 0x20, 0x00, 0x91, 0x42, 0x10, 0x84, 0x9a, + 0x73, 0x06, 0x00, 0x9b, 0x01, 0x00, 0x80, 0x12, 0xe0, 0x03, 0x13, 0xaa, + 0x54, 0x00, 0x40, 0xf9, 0x37, 0x78, 0xff, 0x97, 0x80, 0x00, 0x00, 0x34, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x82, 0x02, 0x40, 0xb9, 0xe0, 0x03, 0x13, 0xaa, 0xe1, 0x03, 0x22, 0x2a, + 0x21, 0x00, 0x1f, 0x12, 0x21, 0x00, 0x02, 0x4a, 0x81, 0x02, 0x00, 0xb9, + 0x81, 0x02, 0x40, 0xb9, 0x21, 0x78, 0x1e, 0x12, 0x81, 0x02, 0x00, 0xb9, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0x1b, 0x78, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x13, 0x1c, 0x00, 0x12, + 0x7f, 0x1e, 0x00, 0x71, 0x68, 0x03, 0x00, 0x54, 0xe1, 0x00, 0x00, 0x90, + 0x22, 0xc0, 0x0b, 0x91, 0xe0, 0x03, 0x02, 0xaa, 0x7f, 0x12, 0x00, 0x71, + 0x42, 0x20, 0x00, 0x91, 0xf4, 0x02, 0x00, 0x90, 0x94, 0x02, 0x1a, 0x91, + 0x42, 0x20, 0x80, 0x9a, 0x7f, 0x0e, 0x00, 0x71, 0x00, 0x0c, 0x80, 0xd2, + 0x00, 0x80, 0x9f, 0x9a, 0x01, 0x00, 0x80, 0x12, 0x94, 0x02, 0x00, 0x8b, + 0xf5, 0x13, 0x00, 0xf9, 0xe0, 0x03, 0x14, 0xaa, 0x55, 0x00, 0x40, 0xf9, + 0x0e, 0x78, 0xff, 0x97, 0xa0, 0x01, 0x00, 0x35, 0xa1, 0x0a, 0x40, 0xb9, + 0xe0, 0x03, 0x14, 0xaa, 0x61, 0x0a, 0x1c, 0x33, 0xf3, 0x53, 0x41, 0xa9, + 0xa1, 0x0a, 0x00, 0xb9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xf9, 0x77, 0xff, 0x17, 0x20, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xbd, 0xa9, 0xe4, 0x00, 0x00, 0x90, 0x82, 0xc0, 0x0b, 0x91, + 0xfd, 0x03, 0x00, 0x91, 0xe3, 0x02, 0x00, 0x90, 0x63, 0x00, 0x1a, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0x2a, 0x1f, 0x00, 0x00, 0x71, + 0xe5, 0x03, 0x02, 0xaa, 0x00, 0x0c, 0x80, 0xd2, 0x42, 0x20, 0x00, 0x91, + 0x42, 0x10, 0x85, 0x9a, 0x73, 0x0e, 0x00, 0x9b, 0xe0, 0x03, 0x13, 0xaa, + 0x54, 0x00, 0x40, 0xf9, 0xf5, 0x13, 0x00, 0xf9, 0x35, 0x1c, 0x00, 0x12, + 0x01, 0x00, 0x80, 0x12, 0xe9, 0x77, 0xff, 0x97, 0xa0, 0x00, 0x00, 0x34, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x82, 0x02, 0x40, 0xb9, 0xbf, 0x02, 0x00, 0x71, + 0xe1, 0x07, 0x9f, 0x1a, 0xe0, 0x03, 0x13, 0xaa, 0xf5, 0x13, 0x40, 0xf9, + 0x41, 0x04, 0x01, 0x4a, 0x21, 0x00, 0x1f, 0x12, 0x21, 0x00, 0x02, 0x4a, + 0x81, 0x02, 0x00, 0xb9, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xcc, 0x77, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0xe3, 0x00, 0x00, 0x90, + 0x62, 0xc0, 0x0b, 0x91, 0xfd, 0x03, 0x00, 0x91, 0xe4, 0x02, 0x00, 0x90, + 0x84, 0x00, 0x1a, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0x2a, + 0x1f, 0x00, 0x00, 0x71, 0xe3, 0x03, 0x02, 0xaa, 0x00, 0x0c, 0x80, 0xd2, + 0x42, 0x20, 0x00, 0x91, 0x42, 0x10, 0x83, 0x9a, 0x94, 0x12, 0x00, 0x9b, + 0xe0, 0x03, 0x14, 0xaa, 0x53, 0x00, 0x40, 0xf9, 0xf5, 0x13, 0x00, 0xf9, + 0xf5, 0x03, 0x01, 0xaa, 0x01, 0x00, 0x80, 0x12, 0xc1, 0x77, 0xff, 0x97, + 0xe0, 0x04, 0x00, 0x35, 0x60, 0x0a, 0x40, 0xb9, 0x42, 0x01, 0x80, 0x52, + 0x00, 0x74, 0x1c, 0x12, 0x60, 0x0a, 0x00, 0xb9, 0x61, 0x02, 0x40, 0xb9, + 0xe0, 0x03, 0x21, 0x2a, 0x00, 0x00, 0x1f, 0x12, 0x00, 0x00, 0x01, 0x4a, + 0x60, 0x02, 0x00, 0xb9, 0x60, 0x02, 0x40, 0xb9, 0x00, 0x78, 0x1f, 0x12, + 0x60, 0x02, 0x00, 0xb9, 0x60, 0x0a, 0x40, 0xb9, 0x00, 0x74, 0x1e, 0x12, + 0x60, 0x0a, 0x00, 0xb9, 0xe2, 0xff, 0x00, 0x39, 0xe0, 0xff, 0x40, 0x39, + 0x1f, 0x1c, 0x00, 0x72, 0x20, 0x01, 0x00, 0x54, 0xe0, 0xff, 0x40, 0x39, + 0x00, 0x1c, 0x00, 0x12, 0x00, 0x04, 0x00, 0x51, 0x00, 0x1c, 0x00, 0x12, + 0xe0, 0xff, 0x00, 0x39, 0xe0, 0xff, 0x40, 0x39, 0x1f, 0x1c, 0x00, 0x72, + 0x21, 0xff, 0xff, 0x54, 0x61, 0x06, 0x41, 0xb9, 0x60, 0x02, 0x41, 0xb9, + 0x00, 0x00, 0x01, 0x2a, 0x80, 0x01, 0x00, 0x37, 0x00, 0x00, 0x80, 0x52, + 0xa0, 0x02, 0x00, 0x39, 0xe0, 0x03, 0x14, 0xaa, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0x8e, 0x77, 0xff, 0x17, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x3e, 0x41, 0xb9, 0x1f, 0x08, 0x1f, 0x72, + 0xe0, 0x07, 0x9f, 0x1a, 0xa0, 0x02, 0x00, 0x39, 0xe0, 0x03, 0x14, 0xaa, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, + 0x81, 0x77, 0xff, 0x17, 0xfd, 0x7b, 0xbe, 0xa9, 0xe3, 0x00, 0x00, 0x90, + 0x62, 0xc0, 0x0b, 0x91, 0xfd, 0x03, 0x00, 0x91, 0xe1, 0x02, 0x00, 0x90, + 0x21, 0x00, 0x1a, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0x2a, + 0x1f, 0x00, 0x00, 0x71, 0xe4, 0x03, 0x02, 0xaa, 0x00, 0x0c, 0x80, 0xd2, + 0x42, 0x20, 0x00, 0x91, 0x42, 0x10, 0x84, 0x9a, 0x73, 0x06, 0x00, 0x9b, + 0x01, 0x00, 0x80, 0x12, 0xe0, 0x03, 0x13, 0xaa, 0x54, 0x00, 0x40, 0xf9, + 0x7b, 0x77, 0xff, 0x97, 0x80, 0x00, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x82, 0x02, 0x41, 0xb9, + 0xe0, 0x03, 0x13, 0xaa, 0xe1, 0x03, 0x22, 0x2a, 0x21, 0x00, 0x00, 0x12, + 0x21, 0x00, 0x02, 0x4a, 0x81, 0x02, 0x01, 0xb9, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0x62, 0x77, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xa1, 0x04, 0x00, 0xb4, 0xe3, 0x00, 0x00, 0x90, 0x62, 0xc0, 0x0b, 0x91, + 0x1f, 0x00, 0x00, 0x71, 0xe3, 0x03, 0x02, 0xaa, 0x42, 0x20, 0x00, 0x91, + 0x00, 0x00, 0x80, 0x52, 0x42, 0x10, 0x83, 0x9a, 0x42, 0x00, 0x40, 0xf9, + 0x43, 0x08, 0x41, 0xb9, 0x63, 0x3c, 0x00, 0x12, 0x23, 0x00, 0x00, 0xb9, + 0x43, 0x10, 0x41, 0xb9, 0x63, 0x3c, 0x00, 0x12, 0x23, 0x04, 0x00, 0xb9, + 0x43, 0x1c, 0x41, 0xb9, 0x63, 0x3c, 0x00, 0x12, 0x23, 0x08, 0x00, 0xb9, + 0x43, 0x20, 0x41, 0xb9, 0x63, 0x3c, 0x00, 0x12, 0x23, 0x0c, 0x00, 0xb9, + 0x43, 0x24, 0x41, 0xb9, 0x63, 0x3c, 0x00, 0x12, 0x23, 0x10, 0x00, 0xb9, + 0x43, 0x28, 0x41, 0xb9, 0x63, 0x3c, 0x00, 0x12, 0x23, 0x14, 0x00, 0xb9, + 0x43, 0x2c, 0x41, 0xb9, 0x63, 0x54, 0x00, 0x12, 0x23, 0x18, 0x00, 0xb9, + 0x43, 0x34, 0x41, 0xb9, 0x63, 0x3c, 0x00, 0x12, 0x23, 0x20, 0x00, 0xb9, + 0x42, 0x30, 0x41, 0xb9, 0x42, 0x0c, 0x00, 0x12, 0x22, 0x1c, 0x00, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x90, 0x41, 0xc0, 0x0b, 0x91, + 0x1f, 0x00, 0x00, 0x71, 0xe0, 0x03, 0x01, 0xaa, 0x21, 0x20, 0x00, 0x91, + 0x21, 0x10, 0x80, 0x9a, 0x00, 0x00, 0x80, 0x52, 0x22, 0x00, 0x40, 0xf9, + 0x43, 0x30, 0x41, 0xb9, 0xe1, 0x03, 0x23, 0x2a, 0x21, 0x00, 0x1e, 0x12, + 0x21, 0x00, 0x03, 0x4a, 0x41, 0x30, 0x01, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x08, 0x00, 0x71, + 0xc8, 0x03, 0x00, 0x54, 0xfd, 0x7b, 0xbd, 0xa9, 0xe3, 0x00, 0x00, 0x90, + 0x62, 0xc0, 0x0b, 0x91, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x03, 0x00, 0x2a, 0xf3, 0x03, 0x01, 0x2a, 0xe1, 0x02, 0x00, 0x90, + 0x21, 0x00, 0x1a, 0x91, 0x1f, 0x00, 0x00, 0x71, 0xe4, 0x03, 0x02, 0xaa, + 0x00, 0x0c, 0x80, 0xd2, 0x42, 0x20, 0x00, 0x91, 0x42, 0x10, 0x84, 0x9a, + 0xf5, 0x13, 0x00, 0xf9, 0x94, 0x06, 0x00, 0x9b, 0x01, 0x00, 0x80, 0x12, + 0xe0, 0x03, 0x14, 0xaa, 0x55, 0x00, 0x40, 0xf9, 0x1f, 0x77, 0xff, 0x97, + 0x60, 0x01, 0x00, 0x35, 0xa1, 0x0a, 0x40, 0xb9, 0xe0, 0x03, 0x14, 0xaa, + 0x61, 0x06, 0x00, 0x33, 0xf3, 0x53, 0x41, 0xa9, 0xa1, 0x0a, 0x00, 0xb9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0x0a, 0x77, 0xff, 0x17, + 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xe4, 0x00, 0x00, 0x90, 0x82, 0xc0, 0x0b, 0x91, + 0xfd, 0x03, 0x00, 0x91, 0xe3, 0x02, 0x00, 0x90, 0x63, 0x00, 0x1a, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0x2a, 0x1f, 0x00, 0x00, 0x71, + 0xe5, 0x03, 0x02, 0xaa, 0x00, 0x0c, 0x80, 0xd2, 0x42, 0x20, 0x00, 0x91, + 0x42, 0x10, 0x85, 0x9a, 0x73, 0x0e, 0x00, 0x9b, 0xe0, 0x03, 0x13, 0xaa, + 0x54, 0x00, 0x40, 0xf9, 0xf5, 0x13, 0x00, 0xf9, 0x35, 0x1c, 0x00, 0x12, + 0x01, 0x00, 0x80, 0x12, 0xf9, 0x76, 0xff, 0x97, 0xa0, 0x00, 0x00, 0x34, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x81, 0x02, 0x40, 0xb9, 0xbf, 0x02, 0x00, 0x71, + 0xe2, 0x07, 0x9f, 0x1a, 0xe0, 0x03, 0x13, 0xaa, 0x21, 0x78, 0x1f, 0x12, + 0x21, 0x00, 0x02, 0x2a, 0xf5, 0x13, 0x40, 0xf9, 0x81, 0x02, 0x00, 0xb9, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xdd, 0x76, 0xff, 0x17, + 0x41, 0x07, 0x00, 0xb4, 0x04, 0x1c, 0x40, 0x92, 0x20, 0x00, 0x80, 0x52, + 0x9f, 0x1c, 0x00, 0x71, 0xc8, 0x02, 0x00, 0x54, 0xfd, 0x7b, 0xbe, 0xa9, + 0xe6, 0x00, 0x00, 0x90, 0xc6, 0x80, 0x18, 0x91, 0xfd, 0x03, 0x00, 0x91, + 0xe3, 0x03, 0x01, 0xaa, 0xe5, 0x00, 0x00, 0x90, 0xa5, 0x80, 0x1a, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xe0, 0x03, 0x03, 0xaa, 0xd4, 0x78, 0x64, 0xf8, + 0x01, 0x00, 0x80, 0x52, 0xc2, 0xff, 0x81, 0xd2, 0xb3, 0x78, 0x64, 0xf8, + 0x0a, 0x5b, 0x00, 0x94, 0x81, 0x12, 0x41, 0xb9, 0xe3, 0x03, 0x00, 0xaa, + 0x20, 0x40, 0x87, 0x52, 0xa1, 0x00, 0x00, 0x36, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xc0, 0x03, 0x5f, 0xd6, + 0x80, 0x12, 0x41, 0xb9, 0x00, 0x54, 0x4c, 0xd3, 0x60, 0xf8, 0x1f, 0x79, + 0x20, 0xff, 0xff, 0x34, 0x00, 0x00, 0x00, 0x0b, 0x85, 0x12, 0x41, 0xb9, + 0x02, 0x04, 0x00, 0x51, 0x63, 0x00, 0x13, 0xcb, 0x66, 0x12, 0x00, 0x91, + 0xe1, 0x03, 0x25, 0x2a, 0x42, 0x7c, 0x01, 0x53, 0x21, 0x00, 0x18, 0x12, + 0xe0, 0x03, 0x13, 0xaa, 0x64, 0x08, 0x00, 0x91, 0xc2, 0x48, 0x22, 0x8b, + 0x21, 0x00, 0x05, 0x4a, 0x81, 0x12, 0x01, 0xb9, 0x01, 0x00, 0x40, 0xb9, + 0x61, 0x68, 0x20, 0x78, 0x21, 0x7c, 0x10, 0x53, 0x81, 0x68, 0x20, 0x78, + 0x00, 0x10, 0x00, 0x91, 0x5f, 0x00, 0x00, 0xeb, 0x41, 0xff, 0xff, 0x54, + 0x81, 0x12, 0x41, 0xb9, 0x00, 0x00, 0x80, 0x52, 0x21, 0x78, 0x17, 0x12, + 0x81, 0x12, 0x01, 0xb9, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x1c, 0x40, 0x92, 0xc3, 0x00, 0x00, 0xf0, 0x63, 0x00, 0x0c, 0x91, + 0x3f, 0x08, 0x00, 0x71, 0x60, 0x78, 0x60, 0xf8, 0x00, 0x34, 0x43, 0xb9, + 0xc0, 0x01, 0x00, 0x54, 0x3f, 0x0c, 0x00, 0x71, 0x40, 0x01, 0x00, 0x54, + 0x3f, 0x04, 0x00, 0x71, 0x80, 0x00, 0x00, 0x54, 0x40, 0x00, 0x00, 0x39, + 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x7c, 0x08, 0x53, + 0x40, 0x00, 0x00, 0x39, 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x7c, 0x18, 0x53, 0xf8, 0xff, 0xff, 0x17, 0x00, 0x7c, 0x10, 0x53, + 0x40, 0x00, 0x00, 0x39, 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x1c, 0x40, 0x92, 0xc3, 0x00, 0x00, 0xf0, 0x63, 0x00, 0x0c, 0x91, + 0x3f, 0x08, 0x00, 0x71, 0x60, 0x78, 0x60, 0xf8, 0x00, 0x30, 0x43, 0xb9, + 0xc0, 0x01, 0x00, 0x54, 0x3f, 0x0c, 0x00, 0x71, 0x40, 0x01, 0x00, 0x54, + 0x3f, 0x04, 0x00, 0x71, 0x80, 0x00, 0x00, 0x54, 0x40, 0x00, 0x00, 0x39, + 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x7c, 0x08, 0x53, + 0x40, 0x00, 0x00, 0x39, 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x7c, 0x18, 0x53, 0xf8, 0xff, 0xff, 0x17, 0x00, 0x7c, 0x10, 0x53, + 0x40, 0x00, 0x00, 0x39, 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xbd, 0xa9, 0x00, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xd3, 0x02, 0x00, 0xf0, 0x73, 0x02, 0x1d, 0x91, + 0x74, 0x02, 0x0c, 0x91, 0xf5, 0x13, 0x00, 0xf9, 0xd5, 0x00, 0x00, 0xf0, + 0xb5, 0x42, 0x1f, 0x91, 0x00, 0x01, 0x00, 0x34, 0x73, 0x82, 0x01, 0x91, + 0x9f, 0x02, 0x13, 0xeb, 0xa1, 0xff, 0xff, 0x54, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe1, 0x03, 0x15, 0xaa, 0xe0, 0x03, 0x13, 0xaa, 0x40, 0x76, 0xff, 0x97, + 0xf6, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x79, 0x00, 0x1c, 0x40, 0x92, 0x1f, 0x1c, 0x00, 0x71, + 0x08, 0x06, 0x00, 0x54, 0xc2, 0x00, 0x00, 0xf0, 0x42, 0x80, 0x19, 0x91, + 0xc3, 0x00, 0x00, 0xf0, 0x63, 0x80, 0x18, 0x91, 0x42, 0x78, 0x60, 0xf8, + 0x65, 0x78, 0x60, 0xf8, 0x44, 0x00, 0x40, 0xb9, 0x43, 0x10, 0x40, 0xb9, + 0x80, 0x7c, 0x1f, 0x53, 0x63, 0x58, 0x55, 0xd3, 0xe4, 0x04, 0xf8, 0x37, + 0x44, 0x50, 0x40, 0xb9, 0x84, 0x78, 0x5e, 0xd3, 0x64, 0x00, 0x04, 0x2a, + 0x84, 0x00, 0x00, 0x35, 0x40, 0x50, 0x40, 0xb9, 0x00, 0x24, 0x00, 0x12, + 0x00, 0x04, 0x00, 0x11, 0x44, 0x60, 0x40, 0xb9, 0x7f, 0x04, 0x00, 0x71, + 0xe6, 0x87, 0x9f, 0x1a, 0x84, 0x78, 0x5e, 0xd3, 0x84, 0x00, 0x00, 0x52, + 0xdf, 0x00, 0x04, 0x6a, 0xa0, 0x00, 0x00, 0x54, 0x44, 0x60, 0x40, 0xb9, + 0x84, 0x24, 0x00, 0x12, 0x84, 0x04, 0x00, 0x11, 0x00, 0x00, 0x04, 0x0b, + 0x44, 0x70, 0x40, 0xb9, 0x7f, 0x08, 0x00, 0x71, 0xe6, 0x87, 0x9f, 0x1a, + 0x83, 0x78, 0x5e, 0xd3, 0x63, 0x00, 0x00, 0x52, 0xdf, 0x00, 0x03, 0x6a, + 0xa0, 0x00, 0x00, 0x54, 0x42, 0x70, 0x40, 0xb9, 0x42, 0x24, 0x00, 0x12, + 0x42, 0x04, 0x00, 0x11, 0x00, 0x00, 0x02, 0x0b, 0xa3, 0x00, 0x40, 0xb9, + 0x02, 0x08, 0x00, 0x11, 0x00, 0x00, 0x80, 0x52, 0x63, 0x24, 0x48, 0xd3, + 0x42, 0x20, 0xc3, 0x1a, 0x22, 0x00, 0x00, 0x79, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x44, 0x8c, 0x40, 0xb9, + 0x00, 0x00, 0x80, 0x52, 0x84, 0x78, 0x5e, 0xd3, 0x64, 0x00, 0x04, 0x2a, + 0x84, 0x00, 0x00, 0x35, 0x40, 0x8c, 0x40, 0xb9, 0x00, 0x24, 0x00, 0x12, + 0x00, 0x04, 0x00, 0x11, 0x44, 0x9c, 0x40, 0xb9, 0x7f, 0x04, 0x00, 0x71, + 0xe6, 0x87, 0x9f, 0x1a, 0x84, 0x78, 0x5e, 0xd3, 0x84, 0x00, 0x00, 0x52, + 0xdf, 0x00, 0x04, 0x6a, 0xa0, 0x00, 0x00, 0x54, 0x44, 0x9c, 0x40, 0xb9, + 0x84, 0x24, 0x00, 0x12, 0x84, 0x04, 0x00, 0x11, 0x00, 0x00, 0x04, 0x0b, + 0x44, 0xac, 0x40, 0xb9, 0x7f, 0x08, 0x00, 0x71, 0xe6, 0x87, 0x9f, 0x1a, + 0x83, 0x78, 0x5e, 0xd3, 0x63, 0x00, 0x00, 0x52, 0xdf, 0x00, 0x03, 0x6a, + 0xc0, 0xfb, 0xff, 0x54, 0x42, 0xac, 0x40, 0xb9, 0xa3, 0x00, 0x40, 0xb9, + 0x42, 0x24, 0x00, 0x12, 0x42, 0x04, 0x00, 0x11, 0x00, 0x00, 0x02, 0x0b, + 0x63, 0x24, 0x48, 0xd3, 0x02, 0x08, 0x00, 0x11, 0x00, 0x00, 0x80, 0x52, + 0x42, 0x20, 0xc3, 0x1a, 0x22, 0x00, 0x00, 0x79, 0xd9, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x12, + 0x21, 0x3c, 0x00, 0x12, 0x1f, 0x1c, 0x00, 0x71, 0xc8, 0x01, 0x00, 0x54, + 0x03, 0x7c, 0x40, 0x93, 0xc4, 0x00, 0x00, 0xf0, 0x84, 0x80, 0x18, 0x91, + 0x00, 0x00, 0x80, 0x12, 0x83, 0x78, 0x63, 0xf8, 0x63, 0x00, 0x40, 0xb9, + 0x63, 0x1c, 0x45, 0xd3, 0x00, 0x20, 0xc3, 0x1a, 0x20, 0x00, 0x20, 0x6a, + 0xc1, 0x00, 0x00, 0x54, 0x21, 0x28, 0xc3, 0x1a, 0x41, 0x00, 0x00, 0x79, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x40, 0x87, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x40, 0x92, + 0x1f, 0x1c, 0x00, 0x71, 0x68, 0x01, 0x00, 0x54, 0xc2, 0x00, 0x00, 0xf0, + 0x42, 0x80, 0x18, 0x91, 0x40, 0x78, 0x60, 0xf8, 0x00, 0x00, 0x40, 0xb9, + 0x00, 0x1c, 0x45, 0xd3, 0xe0, 0x00, 0x00, 0x34, 0x02, 0x01, 0x80, 0x52, + 0x00, 0x00, 0x80, 0x52, 0x22, 0x00, 0x00, 0x39, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x62, 0x01, 0x80, 0x52, + 0x22, 0x00, 0x00, 0x39, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x1c, 0x00, 0x71, + 0x08, 0x01, 0x00, 0x54, 0x02, 0x7c, 0x40, 0x93, 0xc3, 0x00, 0x00, 0xf0, + 0x63, 0x80, 0x15, 0x91, 0x00, 0x00, 0x80, 0x52, 0x62, 0x78, 0x62, 0xf8, + 0x22, 0x00, 0x00, 0xf9, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x04, 0x1c, 0x40, 0x92, 0x20, 0x00, 0x80, 0x52, + 0x9f, 0x1c, 0x00, 0x71, 0xa8, 0x00, 0x00, 0x54, 0x3f, 0x1c, 0x00, 0x71, + 0x20, 0x00, 0x80, 0x52, 0x42, 0x98, 0x47, 0x7a, 0x49, 0x00, 0x00, 0x54, + 0xc0, 0x03, 0x5f, 0xd6, 0xc5, 0x00, 0x00, 0xf0, 0xa5, 0x00, 0x0c, 0x91, + 0x20, 0x14, 0x00, 0x11, 0x3f, 0x10, 0x00, 0x71, 0x00, 0x70, 0x1d, 0x53, + 0xa4, 0x78, 0x64, 0xf8, 0xa9, 0x00, 0x00, 0x54, 0x3f, 0x14, 0x00, 0x71, + 0x42, 0x08, 0x42, 0x7a, 0x49, 0x00, 0x00, 0x54, 0x42, 0x04, 0x00, 0x11, + 0x42, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x80, 0x52, 0x42, 0x74, 0x1e, 0x53, + 0x81, 0x48, 0x62, 0xb8, 0x61, 0x00, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x13, 0x1c, 0x40, 0x92, + 0x7f, 0x1e, 0x00, 0x71, 0x20, 0x00, 0x80, 0x52, 0x89, 0x00, 0x00, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf5, 0x13, 0x00, 0xf9, 0xd5, 0x02, 0x00, 0xf0, 0xa0, 0x02, 0x1d, 0x91, + 0x15, 0x0c, 0x80, 0x52, 0x34, 0x1c, 0x00, 0x12, 0x01, 0x00, 0x80, 0x12, + 0x75, 0x02, 0xb5, 0x9b, 0xe0, 0x03, 0x15, 0xaa, 0xa2, 0x75, 0xff, 0x97, + 0xa0, 0x00, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xc1, 0x00, 0x00, 0xf0, + 0x21, 0x00, 0x0c, 0x91, 0xe0, 0x03, 0x15, 0xaa, 0xf5, 0x13, 0x40, 0xf9, + 0x22, 0x78, 0x73, 0xf8, 0x41, 0x08, 0x43, 0xb9, 0x81, 0x02, 0x00, 0x33, + 0x41, 0x08, 0x03, 0xb9, 0x43, 0x08, 0x43, 0xb9, 0x81, 0x02, 0x03, 0x4a, + 0x21, 0x00, 0x1f, 0x12, 0x21, 0x00, 0x03, 0x4a, 0x41, 0x08, 0x03, 0xb9, + 0x43, 0x08, 0x43, 0xb9, 0x81, 0x02, 0x03, 0x4a, 0x21, 0x00, 0x1e, 0x12, + 0x21, 0x00, 0x03, 0x4a, 0x41, 0x08, 0x03, 0xb9, 0x43, 0x08, 0x43, 0xb9, + 0x81, 0x02, 0x03, 0x4a, 0x21, 0x00, 0x1d, 0x12, 0x21, 0x00, 0x03, 0x4a, + 0x41, 0x08, 0x03, 0xb9, 0x43, 0x08, 0x43, 0xb9, 0x81, 0x02, 0x03, 0x4a, + 0x21, 0x00, 0x1c, 0x12, 0x21, 0x00, 0x03, 0x4a, 0x41, 0x08, 0x03, 0xb9, + 0x43, 0x08, 0x43, 0xb9, 0x81, 0x02, 0x03, 0x4a, 0x21, 0x00, 0x1b, 0x12, + 0x21, 0x00, 0x03, 0x4a, 0x41, 0x08, 0x03, 0xb9, 0x43, 0x08, 0x43, 0xb9, + 0x81, 0x02, 0x03, 0x4a, 0x21, 0x00, 0x1a, 0x12, 0x21, 0x00, 0x03, 0x4a, + 0x41, 0x08, 0x03, 0xb9, 0x43, 0x08, 0x43, 0xb9, 0x61, 0x00, 0x14, 0x4a, + 0x21, 0x00, 0x19, 0x12, 0x21, 0x00, 0x03, 0x4a, 0xf3, 0x53, 0x41, 0xa9, + 0x41, 0x08, 0x03, 0xb9, 0xfd, 0x7b, 0xc3, 0xa8, 0x63, 0x75, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x12, + 0x3f, 0x0c, 0x00, 0x71, 0x02, 0x98, 0x47, 0x7a, 0x69, 0x00, 0x00, 0x54, + 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x02, 0x7c, 0x40, 0x93, + 0xc3, 0x00, 0x00, 0xf0, 0x63, 0x00, 0x0c, 0x91, 0x00, 0x00, 0x80, 0x52, + 0x63, 0x78, 0x62, 0xf8, 0x62, 0x08, 0x43, 0xb9, 0x22, 0x04, 0x18, 0x33, + 0x62, 0x08, 0x03, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x1c, 0x00, 0x71, 0x48, 0x01, 0x00, 0x54, + 0x02, 0x7c, 0x40, 0x93, 0xc3, 0x00, 0x00, 0xf0, 0x63, 0x00, 0x0c, 0x91, + 0x00, 0x00, 0x80, 0x52, 0x62, 0x78, 0x62, 0xf8, 0x42, 0x08, 0x43, 0xb9, + 0x42, 0x24, 0x48, 0xd3, 0x22, 0x00, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x1c, 0x00, 0x71, + 0x88, 0x01, 0x00, 0x54, 0x01, 0x7c, 0x40, 0x93, 0xc2, 0x00, 0x00, 0xf0, + 0x42, 0x00, 0x0c, 0x91, 0x00, 0x00, 0x80, 0x52, 0x42, 0x78, 0x61, 0xf8, + 0x43, 0x0c, 0x43, 0xb9, 0xe1, 0x03, 0x23, 0x2a, 0x21, 0x00, 0x00, 0x12, + 0x21, 0x00, 0x03, 0x4a, 0x41, 0x0c, 0x03, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x1c, 0x00, 0x12, + 0x1f, 0x1c, 0x00, 0x71, 0x48, 0x01, 0x00, 0x54, 0x02, 0x7c, 0x40, 0x93, + 0xc3, 0x00, 0x00, 0xf0, 0x63, 0x00, 0x0c, 0x91, 0x00, 0x00, 0x80, 0x52, + 0x62, 0x78, 0x62, 0xf8, 0x42, 0x0c, 0x43, 0xb9, 0x42, 0x00, 0x00, 0x12, + 0x22, 0x00, 0x00, 0x39, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x1c, 0x00, 0x71, 0x48, 0x01, 0x00, 0x54, + 0x02, 0x7c, 0x40, 0x93, 0xc3, 0x00, 0x00, 0xf0, 0x63, 0x00, 0x0c, 0x91, + 0x00, 0x00, 0x80, 0x52, 0x62, 0x78, 0x62, 0xf8, 0x42, 0x44, 0x43, 0xb9, + 0x42, 0x7c, 0x04, 0x53, 0x22, 0x00, 0x00, 0x39, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x40, 0x92, 0x1f, 0x1c, 0x00, 0x71, + 0x22, 0x98, 0x47, 0x7a, 0x69, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0xc3, 0x00, 0x00, 0xf0, 0x63, 0x00, 0x0c, 0x91, + 0x3f, 0x10, 0x00, 0x71, 0x60, 0x78, 0x60, 0xf8, 0x20, 0x06, 0x00, 0x54, + 0x48, 0x01, 0x00, 0x54, 0x3f, 0x08, 0x00, 0x71, 0xe0, 0x03, 0x00, 0x54, + 0x3f, 0x0c, 0x00, 0x71, 0xc1, 0x02, 0x00, 0x54, 0x01, 0x04, 0x43, 0xb9, + 0x00, 0x00, 0x80, 0x52, 0x21, 0x3c, 0x4c, 0xd3, 0x41, 0x00, 0x00, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x3f, 0x18, 0x00, 0x71, 0x60, 0x03, 0x00, 0x54, + 0x3f, 0x1c, 0x00, 0x71, 0xc1, 0x00, 0x00, 0x54, 0x01, 0x04, 0x43, 0xb9, + 0x00, 0x00, 0x80, 0x52, 0x21, 0x7c, 0x1c, 0x53, 0x41, 0x00, 0x00, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x3f, 0x14, 0x00, 0x71, 0xe1, 0x02, 0x00, 0x54, + 0x01, 0x04, 0x43, 0xb9, 0x00, 0x00, 0x80, 0x52, 0x21, 0x5c, 0x54, 0xd3, + 0x41, 0x00, 0x00, 0x39, 0xc0, 0x03, 0x5f, 0xd6, 0x3f, 0x04, 0x00, 0x71, + 0x01, 0x02, 0x00, 0x54, 0x01, 0x04, 0x43, 0xb9, 0x00, 0x00, 0x80, 0x52, + 0x21, 0x1c, 0x44, 0xd3, 0x41, 0x00, 0x00, 0x39, 0xc0, 0x03, 0x5f, 0xd6, + 0x01, 0x04, 0x43, 0xb9, 0x00, 0x00, 0x80, 0x52, 0x21, 0x2c, 0x48, 0xd3, + 0x41, 0x00, 0x00, 0x39, 0xc0, 0x03, 0x5f, 0xd6, 0x01, 0x04, 0x43, 0xb9, + 0x00, 0x00, 0x80, 0x52, 0x21, 0x6c, 0x58, 0xd3, 0x41, 0x00, 0x00, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x01, 0x04, 0x43, 0xb9, 0x00, 0x00, 0x80, 0x52, + 0x21, 0x0c, 0x00, 0x12, 0x41, 0x00, 0x00, 0x39, 0xc0, 0x03, 0x5f, 0xd6, + 0x01, 0x04, 0x43, 0xb9, 0x00, 0x00, 0x80, 0x52, 0x21, 0x4c, 0x50, 0xd3, + 0x41, 0x00, 0x00, 0x39, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x1c, 0x40, 0x92, + 0x1f, 0x1c, 0x00, 0x71, 0x22, 0x98, 0x47, 0x7a, 0x69, 0x00, 0x00, 0x54, + 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0xc3, 0x00, 0x00, 0xf0, + 0x63, 0x00, 0x0c, 0x91, 0x3f, 0x10, 0x00, 0x71, 0x60, 0x78, 0x60, 0xf8, + 0xa0, 0x04, 0x00, 0x54, 0x48, 0x01, 0x00, 0x54, 0x3f, 0x08, 0x00, 0x71, + 0x20, 0x03, 0x00, 0x54, 0x3f, 0x0c, 0x00, 0x71, 0x41, 0x02, 0x00, 0x54, + 0x01, 0x0c, 0x40, 0xb9, 0x21, 0x1c, 0x46, 0xd3, 0x00, 0x00, 0x80, 0x52, + 0x41, 0x00, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x3f, 0x18, 0x00, 0x71, + 0x60, 0x02, 0x00, 0x54, 0x3f, 0x1c, 0x00, 0x71, 0x81, 0x00, 0x00, 0x54, + 0x01, 0x0c, 0x40, 0xb9, 0x21, 0x3c, 0x4e, 0xd3, 0xf7, 0xff, 0xff, 0x17, + 0x3f, 0x14, 0x00, 0x71, 0xe1, 0x01, 0x00, 0x54, 0x01, 0x0c, 0x40, 0xb9, + 0x21, 0x2c, 0x4a, 0xd3, 0xf2, 0xff, 0xff, 0x17, 0x3f, 0x04, 0x00, 0x71, + 0x41, 0x01, 0x00, 0x54, 0x01, 0x0c, 0x40, 0xb9, 0x21, 0x0c, 0x42, 0xd3, + 0xed, 0xff, 0xff, 0x17, 0x01, 0x0c, 0x40, 0xb9, 0x21, 0x14, 0x44, 0xd3, + 0xea, 0xff, 0xff, 0x17, 0x01, 0x0c, 0x40, 0xb9, 0x21, 0x34, 0x4c, 0xd3, + 0xe7, 0xff, 0xff, 0x17, 0x01, 0x0c, 0x40, 0xb9, 0x21, 0x04, 0x00, 0x12, + 0xe4, 0xff, 0xff, 0x17, 0x01, 0x0c, 0x40, 0xb9, 0x21, 0x24, 0x48, 0xd3, + 0xe1, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x40, 0x92, 0x1f, 0x1c, 0x00, 0x71, 0x22, 0x98, 0x43, 0x7a, + 0x69, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0xc3, 0x00, 0x00, 0xf0, 0x63, 0x00, 0x0c, 0x91, 0x3f, 0x08, 0x00, 0x71, + 0x60, 0x78, 0x60, 0xf8, 0x00, 0x00, 0x40, 0xb9, 0x20, 0x02, 0x00, 0x54, + 0x3f, 0x0c, 0x00, 0x71, 0x20, 0x01, 0x00, 0x54, 0x3f, 0x04, 0x00, 0x71, + 0x40, 0x01, 0x00, 0x54, 0x00, 0x1c, 0x00, 0x12, 0x40, 0x00, 0x00, 0x39, + 0x1f, 0x00, 0x00, 0x71, 0x20, 0x80, 0x87, 0x52, 0xe0, 0x13, 0x80, 0x1a, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x7c, 0x18, 0x53, 0x40, 0x00, 0x00, 0x39, + 0xfa, 0xff, 0xff, 0x17, 0x00, 0x3c, 0x48, 0xd3, 0x40, 0x00, 0x00, 0x39, + 0xf7, 0xff, 0xff, 0x17, 0x00, 0x5c, 0x50, 0xd3, 0x40, 0x00, 0x00, 0x39, + 0xf4, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0x3f, 0x0c, 0x00, 0x71, 0xfd, 0x03, 0x00, 0x91, 0x5f, 0x00, 0x00, 0x79, + 0xff, 0x77, 0x00, 0x39, 0xff, 0x7b, 0x00, 0x39, 0xff, 0x7f, 0x00, 0x39, + 0x48, 0x04, 0x00, 0x54, 0x06, 0x1c, 0x00, 0x12, 0x20, 0x00, 0x80, 0x52, + 0xdf, 0x1c, 0x00, 0x71, 0x88, 0x03, 0x00, 0x54, 0xc7, 0x7c, 0x40, 0x93, + 0xc3, 0x00, 0x00, 0xf0, 0x63, 0x80, 0x18, 0x91, 0xe5, 0x03, 0x02, 0xaa, + 0xe0, 0x03, 0x06, 0x2a, 0xe2, 0x77, 0x00, 0x91, 0x67, 0x78, 0x67, 0xf8, + 0xcd, 0xff, 0xff, 0x97, 0x60, 0x02, 0x00, 0x35, 0xe2, 0x7b, 0x00, 0x91, + 0xe0, 0x03, 0x06, 0x2a, 0xc5, 0xfd, 0xff, 0x97, 0xe0, 0x01, 0x00, 0x35, + 0xe0, 0x03, 0x06, 0x2a, 0xe2, 0x7f, 0x00, 0x91, 0xd9, 0xfd, 0xff, 0x97, + 0x60, 0x01, 0x00, 0x35, 0xe1, 0x7b, 0x40, 0x39, 0xe4, 0x77, 0x40, 0x39, + 0xe2, 0x00, 0x40, 0xb9, 0xe3, 0x7f, 0x40, 0x39, 0x21, 0x7c, 0x04, 0x1b, + 0x63, 0x58, 0x00, 0x11, 0x42, 0x24, 0x48, 0xd3, 0x61, 0x20, 0x21, 0x0b, + 0x21, 0x20, 0xc2, 0x1a, 0xa1, 0x00, 0x00, 0x79, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x80, 0x52, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x13, 0x1c, 0x40, 0x92, 0x7f, 0x1e, 0x00, 0x71, + 0x08, 0x01, 0x00, 0x54, 0x34, 0x1c, 0x00, 0x12, 0x20, 0x00, 0x80, 0x52, + 0x9f, 0x6e, 0x1c, 0x72, 0x00, 0x01, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf5, 0x13, 0x00, 0xf9, 0xd5, 0x02, 0x00, 0xf0, 0xa0, 0x02, 0x1d, 0x91, + 0x15, 0x0c, 0x80, 0x52, 0x01, 0x00, 0x80, 0x12, 0x75, 0x02, 0xb5, 0x9b, + 0xe0, 0x03, 0x15, 0xaa, 0x44, 0x74, 0xff, 0x97, 0x60, 0x00, 0x00, 0x34, + 0xf5, 0x13, 0x40, 0xf9, 0xef, 0xff, 0xff, 0x17, 0xc1, 0x00, 0x00, 0xf0, + 0x21, 0x00, 0x0c, 0x91, 0xe0, 0x03, 0x15, 0xaa, 0xf5, 0x13, 0x40, 0xf9, + 0x22, 0x78, 0x73, 0xf8, 0x41, 0x1c, 0x43, 0xb9, 0x81, 0x0e, 0x00, 0x33, + 0xf3, 0x53, 0x41, 0xa9, 0x41, 0x1c, 0x03, 0xb9, 0xfd, 0x7b, 0xc3, 0xa8, + 0x2a, 0x74, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x13, 0x1c, 0x40, 0x92, + 0x7f, 0x1e, 0x00, 0x71, 0x20, 0x00, 0x80, 0x52, 0x89, 0x00, 0x00, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xd4, 0x02, 0x00, 0xf0, 0x80, 0x02, 0x1d, 0x91, 0x14, 0x0c, 0x80, 0x52, + 0x01, 0x00, 0x80, 0x12, 0x74, 0x02, 0xb4, 0x9b, 0xe0, 0x03, 0x14, 0xaa, + 0x24, 0x74, 0xff, 0x97, 0xc0, 0xfe, 0xff, 0x35, 0xc1, 0x00, 0x00, 0xf0, + 0x21, 0x00, 0x0c, 0x91, 0xe0, 0x03, 0x14, 0xaa, 0x22, 0x78, 0x73, 0xf8, + 0xf3, 0x53, 0x41, 0xa9, 0x43, 0x10, 0x43, 0xb9, 0xe1, 0x03, 0x23, 0x2a, + 0x21, 0x00, 0x00, 0x12, 0x21, 0x00, 0x03, 0x4a, 0x41, 0x10, 0x03, 0xb9, + 0xfd, 0x7b, 0xc2, 0xa8, 0x0b, 0x74, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x34, 0x1c, 0x00, 0x12, 0x13, 0x1c, 0x40, 0x92, + 0x9f, 0x06, 0x00, 0x71, 0x20, 0x00, 0x80, 0x52, 0x62, 0x9a, 0x47, 0x7a, + 0x89, 0x00, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf5, 0x13, 0x00, 0xf9, 0xd5, 0x02, 0x00, 0xf0, + 0xa0, 0x02, 0x1d, 0x91, 0x15, 0x0c, 0x80, 0x52, 0x01, 0x00, 0x80, 0x12, + 0x75, 0x02, 0xb5, 0x9b, 0xe0, 0x03, 0x15, 0xaa, 0x01, 0x74, 0xff, 0x97, + 0x60, 0x00, 0x00, 0x34, 0xf5, 0x13, 0x40, 0xf9, 0xf3, 0xff, 0xff, 0x17, + 0xc1, 0x00, 0x00, 0xf0, 0x21, 0x00, 0x0c, 0x91, 0xe0, 0x03, 0x15, 0xaa, + 0xf5, 0x13, 0x40, 0xf9, 0x22, 0x78, 0x73, 0xf8, 0x41, 0x14, 0x43, 0xb9, + 0x81, 0x02, 0x00, 0x33, 0xf3, 0x53, 0x41, 0xa9, 0x41, 0x14, 0x03, 0xb9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xe7, 0x73, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x34, 0x1c, 0x00, 0x12, 0x13, 0x1c, 0x40, 0x92, + 0x9f, 0x06, 0x00, 0x71, 0x20, 0x00, 0x80, 0x52, 0x62, 0x9a, 0x47, 0x7a, + 0x89, 0x00, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf5, 0x13, 0x00, 0xf9, 0xd5, 0x02, 0x00, 0xf0, + 0xa0, 0x02, 0x1d, 0x91, 0x15, 0x0c, 0x80, 0x52, 0x01, 0x00, 0x80, 0x12, + 0x75, 0x02, 0xb5, 0x9b, 0xe0, 0x03, 0x15, 0xaa, 0xdd, 0x73, 0xff, 0x97, + 0x60, 0x00, 0x00, 0x34, 0xf5, 0x13, 0x40, 0xf9, 0xf3, 0xff, 0xff, 0x17, + 0xc1, 0x00, 0x00, 0xf0, 0x21, 0x00, 0x0c, 0x91, 0xe0, 0x03, 0x15, 0xaa, + 0xf5, 0x13, 0x40, 0xf9, 0x22, 0x78, 0x73, 0xf8, 0x41, 0x54, 0x43, 0xb9, + 0x81, 0x02, 0x00, 0x33, 0xf3, 0x53, 0x41, 0xa9, 0x41, 0x54, 0x03, 0xb9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc3, 0x73, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x34, 0x1c, 0x00, 0x12, 0x13, 0x1c, 0x40, 0x92, + 0x9f, 0x06, 0x00, 0x71, 0x20, 0x00, 0x80, 0x52, 0x62, 0x9a, 0x47, 0x7a, + 0x89, 0x00, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf5, 0x13, 0x00, 0xf9, 0xd5, 0x02, 0x00, 0xf0, + 0xa0, 0x02, 0x1d, 0x91, 0x15, 0x0c, 0x80, 0x52, 0x01, 0x00, 0x80, 0x12, + 0x75, 0x02, 0xb5, 0x9b, 0xe0, 0x03, 0x15, 0xaa, 0xb9, 0x73, 0xff, 0x97, + 0x60, 0x00, 0x00, 0x34, 0xf5, 0x13, 0x40, 0xf9, 0xf3, 0xff, 0xff, 0x17, + 0xc1, 0x00, 0x00, 0xf0, 0x21, 0x00, 0x0c, 0x91, 0xe0, 0x03, 0x15, 0xaa, + 0xf5, 0x13, 0x40, 0xf9, 0x22, 0x78, 0x73, 0xf8, 0x41, 0x58, 0x43, 0xb9, + 0x81, 0x02, 0x00, 0x33, 0xf3, 0x53, 0x41, 0xa9, 0x41, 0x58, 0x03, 0xb9, + 0xfd, 0x7b, 0xc3, 0xa8, 0x9f, 0x73, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x34, 0x1c, 0x00, 0x12, 0x13, 0x1c, 0x40, 0x92, + 0x9f, 0x06, 0x00, 0x71, 0x20, 0x00, 0x80, 0x52, 0x62, 0x9a, 0x47, 0x7a, + 0x89, 0x00, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf5, 0x13, 0x00, 0xf9, 0xd5, 0x02, 0x00, 0xf0, + 0xa0, 0x02, 0x1d, 0x91, 0x15, 0x0c, 0x80, 0x52, 0x01, 0x00, 0x80, 0x12, + 0x75, 0x02, 0xb5, 0x9b, 0xe0, 0x03, 0x15, 0xaa, 0x95, 0x73, 0xff, 0x97, + 0x60, 0x00, 0x00, 0x34, 0xf5, 0x13, 0x40, 0xf9, 0xf3, 0xff, 0xff, 0x17, + 0xc1, 0x00, 0x00, 0xf0, 0x21, 0x00, 0x0c, 0x91, 0xe0, 0x03, 0x15, 0xaa, + 0xf5, 0x13, 0x40, 0xf9, 0x22, 0x78, 0x73, 0xf8, 0x41, 0x40, 0x43, 0xb9, + 0x81, 0x02, 0x00, 0x33, 0xf3, 0x53, 0x41, 0xa9, 0x41, 0x40, 0x03, 0xb9, + 0xfd, 0x7b, 0xc3, 0xa8, 0x7b, 0x73, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x34, 0x1c, 0x00, 0x12, 0x13, 0x1c, 0x40, 0x92, + 0x9f, 0x06, 0x00, 0x71, 0x20, 0x00, 0x80, 0x52, 0x62, 0x9a, 0x47, 0x7a, + 0x89, 0x00, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf5, 0x13, 0x00, 0xf9, 0xd5, 0x02, 0x00, 0xf0, + 0xa0, 0x02, 0x1d, 0x91, 0x15, 0x0c, 0x80, 0x52, 0x01, 0x00, 0x80, 0x12, + 0x75, 0x02, 0xb5, 0x9b, 0xe0, 0x03, 0x15, 0xaa, 0x71, 0x73, 0xff, 0x97, + 0x60, 0x00, 0x00, 0x34, 0xf5, 0x13, 0x40, 0xf9, 0xf3, 0xff, 0xff, 0x17, + 0xc1, 0x00, 0x00, 0xf0, 0x21, 0x80, 0x19, 0x91, 0xe0, 0x03, 0x15, 0xaa, + 0xf5, 0x13, 0x40, 0xf9, 0x22, 0x78, 0x73, 0xf8, 0x41, 0x10, 0x40, 0xb9, + 0x81, 0x02, 0x0c, 0x33, 0xf3, 0x53, 0x41, 0xa9, 0x41, 0x10, 0x00, 0xb9, + 0xfd, 0x7b, 0xc3, 0xa8, 0x57, 0x73, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0x36, 0x1c, 0x00, 0x12, 0x55, 0x1c, 0x00, 0x12, + 0xdf, 0x7e, 0x00, 0x71, 0xf3, 0x53, 0x01, 0xa9, 0xa2, 0x9a, 0x5f, 0x7a, + 0x14, 0x1c, 0x40, 0x92, 0x20, 0x00, 0x80, 0x52, 0x82, 0x9a, 0x47, 0x7a, + 0xa9, 0x00, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf7, 0x1b, 0x00, 0xf9, + 0xd7, 0x02, 0x00, 0xf0, 0xe0, 0x02, 0x1d, 0x91, 0x17, 0x0c, 0x80, 0x52, + 0xf3, 0x03, 0x03, 0x2a, 0x01, 0x00, 0x80, 0x12, 0x97, 0x02, 0xb7, 0x9b, + 0xe0, 0x03, 0x17, 0xaa, 0x48, 0x73, 0xff, 0x97, 0xc0, 0x00, 0x00, 0x34, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xc1, 0x00, 0x00, 0xf0, + 0x21, 0x80, 0x15, 0x91, 0xd5, 0x16, 0x15, 0x0b, 0xe0, 0x03, 0x17, 0xaa, + 0xf7, 0x1b, 0x40, 0xf9, 0xb5, 0x76, 0x1e, 0x53, 0x21, 0x78, 0x74, 0xf8, + 0x33, 0x48, 0x35, 0xb8, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0x2a, 0x73, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x13, 0x1c, 0x40, 0x92, 0x7f, 0x1e, 0x00, 0x71, 0x20, 0x00, 0x80, 0x52, + 0x89, 0x00, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xd4, 0x02, 0x00, 0xf0, 0x80, 0x02, 0x1d, 0x91, + 0x14, 0x0c, 0x80, 0x52, 0x01, 0x00, 0x80, 0x12, 0x74, 0x02, 0xb4, 0x9b, + 0xe0, 0x03, 0x14, 0xaa, 0x24, 0x73, 0xff, 0x97, 0xc0, 0xfe, 0xff, 0x35, + 0xc0, 0x00, 0x00, 0xf0, 0x00, 0x80, 0x15, 0x91, 0xe3, 0x3f, 0x80, 0x52, + 0x42, 0x01, 0x80, 0x52, 0x01, 0x78, 0x73, 0xf8, 0x23, 0x3c, 0x03, 0xb9, + 0xe2, 0xbf, 0x00, 0x39, 0xe0, 0xbf, 0x40, 0x39, 0x1f, 0x1c, 0x00, 0x72, + 0x20, 0x01, 0x00, 0x54, 0xe0, 0xbf, 0x40, 0x39, 0x00, 0x1c, 0x00, 0x12, + 0x00, 0x04, 0x00, 0x51, 0x00, 0x1c, 0x00, 0x12, 0xe0, 0xbf, 0x00, 0x39, + 0xe0, 0xbf, 0x40, 0x39, 0x1f, 0x1c, 0x00, 0x72, 0x21, 0xff, 0xff, 0x54, + 0xe0, 0x03, 0x14, 0xaa, 0xf3, 0x53, 0x41, 0xa9, 0x3f, 0x3c, 0x03, 0xb9, + 0xfd, 0x7b, 0xc3, 0xa8, 0x00, 0x73, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0xf0, + 0x84, 0x80, 0x20, 0x91, 0xff, 0x83, 0x00, 0xd1, 0x42, 0x1c, 0x40, 0x92, + 0x25, 0x08, 0x40, 0x39, 0x80, 0xa0, 0x40, 0x4c, 0x24, 0x08, 0x40, 0xf9, + 0xe0, 0xa3, 0x00, 0x4c, 0xe2, 0x7b, 0x62, 0xf8, 0x86, 0xfc, 0x60, 0xd3, + 0x00, 0x00, 0x02, 0x8b, 0x02, 0x10, 0x40, 0xb9, 0xa2, 0x0c, 0x0c, 0x33, + 0x02, 0x10, 0x00, 0xb9, 0x02, 0x10, 0x40, 0xb9, 0x25, 0x0c, 0x40, 0x39, + 0xa2, 0x0c, 0x10, 0x33, 0x02, 0x10, 0x00, 0xb9, 0x05, 0x10, 0x40, 0xb9, + 0x22, 0x10, 0x40, 0x39, 0xa2, 0x10, 0x02, 0x4a, 0x42, 0x1c, 0x1c, 0x12, + 0x42, 0x00, 0x05, 0x4a, 0x02, 0x10, 0x00, 0xb9, 0x02, 0x10, 0x40, 0xb9, + 0x62, 0x04, 0x1e, 0x33, 0x02, 0x10, 0x00, 0xb9, 0x22, 0x1c, 0x40, 0x39, + 0x01, 0x10, 0x40, 0xb9, 0x41, 0x04, 0x00, 0x33, 0x01, 0x10, 0x00, 0xb9, + 0x04, 0x08, 0x00, 0xb9, 0x01, 0x0c, 0x40, 0xb9, 0xc1, 0x44, 0x00, 0x33, + 0x01, 0x0c, 0x00, 0xb9, 0xff, 0x83, 0x00, 0x91, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe1, 0x03, 0x00, 0xaa, 0x40, 0x00, 0x80, 0x52, 0xa1, 0x00, 0x00, 0xb4, + 0x22, 0x00, 0x40, 0x39, 0x20, 0x00, 0x80, 0x52, 0x5f, 0x20, 0x00, 0x71, + 0x49, 0x00, 0x00, 0x54, 0xc0, 0x03, 0x5f, 0xd6, 0x22, 0x04, 0x40, 0x39, + 0x5f, 0x1c, 0x00, 0x71, 0xa8, 0xff, 0xff, 0x54, 0x22, 0x08, 0x40, 0x39, + 0x5f, 0x3c, 0x00, 0x71, 0x48, 0xff, 0xff, 0x54, 0x22, 0x0c, 0x40, 0x39, + 0x5f, 0x3c, 0x00, 0x71, 0xe8, 0xfe, 0xff, 0x54, 0x22, 0x1c, 0x40, 0x39, + 0x5f, 0x08, 0x00, 0x71, 0x88, 0xfe, 0xff, 0x54, 0x23, 0x14, 0x40, 0x39, + 0x7f, 0x0c, 0x00, 0x71, 0x28, 0xfe, 0xff, 0x54, 0x23, 0x18, 0x40, 0x39, + 0x22, 0x01, 0x00, 0x34, 0x5f, 0x04, 0x00, 0x71, 0x20, 0x01, 0x00, 0x54, + 0x7f, 0x0c, 0x00, 0x71, 0x68, 0xfd, 0xff, 0x54, 0x20, 0x24, 0x40, 0x39, + 0x1f, 0x3c, 0x00, 0x71, 0xe0, 0x97, 0x9f, 0x1a, 0xc0, 0x03, 0x5f, 0xd6, + 0x83, 0xff, 0xff, 0x34, 0xc0, 0x03, 0x5f, 0xd6, 0x7f, 0x04, 0x00, 0x71, + 0x29, 0xff, 0xff, 0x54, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe1, 0x03, 0x00, 0xaa, 0x40, 0x00, 0x80, 0x52, + 0xa1, 0x00, 0x00, 0xb4, 0x22, 0x30, 0x40, 0x39, 0x20, 0x00, 0x80, 0x52, + 0x5f, 0x3c, 0x00, 0x71, 0x49, 0x00, 0x00, 0x54, 0xc0, 0x03, 0x5f, 0xd6, + 0x22, 0x34, 0xc0, 0x39, 0xc2, 0xff, 0xff, 0x37, 0x22, 0x38, 0x40, 0x39, + 0x00, 0x00, 0x80, 0x52, 0x25, 0x3c, 0x40, 0x39, 0x23, 0x40, 0x40, 0x39, + 0x5f, 0x00, 0x00, 0x71, 0xe4, 0x07, 0x9f, 0x1a, 0x22, 0x44, 0x40, 0x39, + 0xbf, 0x00, 0x00, 0x71, 0x24, 0x38, 0x00, 0x39, 0xe4, 0x07, 0x9f, 0x1a, + 0x7f, 0x00, 0x00, 0x71, 0xe3, 0x07, 0x9f, 0x1a, 0x5f, 0x00, 0x00, 0x71, + 0xe2, 0x07, 0x9f, 0x1a, 0x24, 0x3c, 0x00, 0x39, 0x23, 0x40, 0x00, 0x39, + 0x22, 0x44, 0x00, 0x39, 0xc0, 0x03, 0x5f, 0xd6, 0xe1, 0x03, 0x00, 0xaa, + 0x40, 0x00, 0x80, 0x52, 0xa1, 0x00, 0x00, 0xb4, 0x22, 0x1c, 0x40, 0x39, + 0x20, 0x00, 0x80, 0x52, 0x5f, 0x0c, 0x00, 0x71, 0x49, 0x00, 0x00, 0x54, + 0xc0, 0x03, 0x5f, 0xd6, 0x22, 0x0c, 0x40, 0x39, 0x5f, 0x0c, 0x00, 0x71, + 0xa8, 0xff, 0xff, 0x54, 0x22, 0x00, 0x40, 0x39, 0x00, 0x00, 0x80, 0x52, + 0x23, 0x04, 0x40, 0x39, 0x5f, 0x00, 0x00, 0x71, 0x22, 0x08, 0x40, 0x39, + 0x27, 0x10, 0x40, 0x39, 0xe4, 0x07, 0x9f, 0x1a, 0x7f, 0x00, 0x00, 0x71, + 0x23, 0x14, 0x40, 0x39, 0xe6, 0x07, 0x9f, 0x1a, 0x5f, 0x00, 0x00, 0x71, + 0xe5, 0x07, 0x9f, 0x1a, 0x22, 0x18, 0x40, 0x39, 0xff, 0x00, 0x00, 0x71, + 0x24, 0x00, 0x00, 0x39, 0xe4, 0x07, 0x9f, 0x1a, 0x7f, 0x00, 0x00, 0x71, + 0xe3, 0x07, 0x9f, 0x1a, 0x5f, 0x00, 0x00, 0x71, 0xe2, 0x07, 0x9f, 0x1a, + 0x26, 0x04, 0x00, 0x39, 0x25, 0x08, 0x00, 0x39, 0x24, 0x10, 0x00, 0x39, + 0x23, 0x14, 0x00, 0x39, 0x22, 0x18, 0x00, 0x39, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbc, 0xa9, 0x00, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xd3, 0x00, 0x00, 0xd0, 0x73, 0x82, 0x16, 0x91, + 0xd4, 0x02, 0x00, 0xd0, 0x94, 0x02, 0x29, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0x76, 0x02, 0x01, 0x91, 0x15, 0x05, 0x80, 0x52, 0xf7, 0x1b, 0x00, 0xf9, + 0xd7, 0x00, 0x00, 0xd0, 0xf7, 0xa2, 0x1f, 0x91, 0x04, 0x00, 0x00, 0x14, + 0x94, 0x82, 0x01, 0x91, 0x7f, 0x02, 0x16, 0xeb, 0x60, 0x02, 0x00, 0x54, + 0x63, 0x02, 0x40, 0xf9, 0x73, 0x22, 0x00, 0x91, 0x62, 0x44, 0x40, 0xb9, + 0x42, 0x3c, 0x10, 0x12, 0x42, 0x00, 0x15, 0x2a, 0x62, 0x44, 0x00, 0xb9, + 0x64, 0x04, 0x40, 0xb9, 0xe2, 0x03, 0x24, 0x2a, 0x42, 0x00, 0x02, 0x12, + 0x42, 0x00, 0x04, 0x4a, 0x62, 0x04, 0x00, 0xb9, 0x40, 0xfe, 0xff, 0x35, + 0xe0, 0x03, 0x14, 0xaa, 0xe1, 0x03, 0x17, 0xaa, 0x2c, 0x72, 0xff, 0x97, + 0x94, 0x82, 0x01, 0x91, 0x7f, 0x02, 0x16, 0xeb, 0xe1, 0xfd, 0xff, 0x54, + 0xd3, 0x02, 0x00, 0xd0, 0x73, 0x02, 0x35, 0x91, 0xd5, 0x00, 0x00, 0xd0, + 0xb5, 0x22, 0x20, 0x91, 0x74, 0x02, 0x0c, 0x91, 0x1f, 0x20, 0x03, 0xd5, + 0x20, 0x01, 0x00, 0x34, 0x73, 0x82, 0x01, 0x91, 0x9f, 0x02, 0x13, 0xeb, + 0xa1, 0xff, 0xff, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe1, 0x03, 0x15, 0xaa, 0xe0, 0x03, 0x13, 0xaa, 0x17, 0x72, 0xff, 0x97, + 0xf5, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x20, 0x00, 0x71, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x34, 0x1c, 0x00, 0x12, 0x82, 0x9a, 0x47, 0x7a, + 0xa9, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xd3, 0x02, 0x00, 0xd0, + 0x73, 0x02, 0x29, 0x91, 0x01, 0x0c, 0x80, 0x52, 0x03, 0x7c, 0x40, 0x93, + 0xc2, 0x00, 0x00, 0xd0, 0x42, 0x80, 0x16, 0x91, 0x13, 0x4c, 0xa1, 0x9b, + 0x01, 0x00, 0x80, 0x12, 0xf5, 0x13, 0x00, 0xf9, 0xe0, 0x03, 0x13, 0xaa, + 0x55, 0x78, 0x63, 0xf8, 0x25, 0x72, 0xff, 0x97, 0xa0, 0x00, 0x00, 0x34, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xa1, 0x06, 0x40, 0xb9, 0xe0, 0x03, 0x13, 0xaa, + 0x81, 0x0a, 0x00, 0x33, 0xf3, 0x53, 0x41, 0xa9, 0xa1, 0x06, 0x00, 0xb9, + 0xa2, 0x6a, 0x40, 0xb9, 0xe1, 0x03, 0x22, 0x2a, 0x21, 0x00, 0x00, 0x12, + 0x21, 0x00, 0x02, 0x4a, 0xa1, 0x6a, 0x00, 0xb9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0x07, 0x72, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x20, 0x00, 0x71, + 0x68, 0x01, 0x00, 0x54, 0x81, 0x01, 0x00, 0xb4, 0x02, 0x7c, 0x40, 0x93, + 0xc3, 0x00, 0x00, 0xd0, 0x63, 0x80, 0x16, 0x91, 0x00, 0x00, 0x80, 0x52, + 0x62, 0x78, 0x62, 0xf8, 0x42, 0x48, 0x40, 0xb9, 0x42, 0x08, 0x00, 0x12, + 0x22, 0x00, 0x00, 0x39, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x20, 0x00, 0x71, 0xc8, 0x02, 0x00, 0x54, + 0xfd, 0x7b, 0xbd, 0xa9, 0x03, 0x7c, 0x40, 0x93, 0xc2, 0x00, 0x00, 0xd0, + 0x42, 0x80, 0x16, 0x91, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xd3, 0x02, 0x00, 0xd0, 0x73, 0x02, 0x29, 0x91, 0x34, 0x1c, 0x00, 0x12, + 0x01, 0x0c, 0x80, 0x52, 0xf5, 0x13, 0x00, 0xf9, 0x13, 0x4c, 0xa1, 0x9b, + 0x01, 0x00, 0x80, 0x12, 0x55, 0x78, 0x63, 0xf8, 0xe0, 0x03, 0x13, 0xaa, + 0xea, 0x71, 0xff, 0x97, 0xe0, 0x00, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0xa1, 0x02, 0x40, 0xb9, + 0x9f, 0x02, 0x00, 0x71, 0xe2, 0x07, 0x9f, 0x1a, 0xe0, 0x03, 0x13, 0xaa, + 0x21, 0x78, 0x1f, 0x12, 0x21, 0x00, 0x02, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xa1, 0x02, 0x00, 0xb9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xcc, 0x71, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x20, 0x00, 0x71, + 0xa8, 0x01, 0x00, 0x54, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x34, 0x1c, 0x00, 0x12, 0x81, 0x42, 0x00, 0x51, + 0x21, 0x1c, 0x00, 0x12, 0x3f, 0xb8, 0x03, 0x71, 0xe8, 0x00, 0x00, 0x54, + 0x20, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0xd3, 0x02, 0x00, 0xd0, 0x73, 0x02, 0x29, 0x91, 0x01, 0x0c, 0x80, 0x52, + 0x03, 0x7c, 0x40, 0x93, 0xf5, 0x5b, 0x02, 0xa9, 0x55, 0x1c, 0x00, 0x12, + 0xc2, 0x00, 0x00, 0xd0, 0x42, 0x80, 0x16, 0x91, 0x13, 0x4c, 0xa1, 0x9b, + 0x01, 0x00, 0x80, 0x12, 0xe0, 0x03, 0x13, 0xaa, 0x56, 0x78, 0x63, 0xf8, + 0xb7, 0x71, 0xff, 0x97, 0x40, 0x02, 0x00, 0x35, 0x9f, 0xfe, 0x03, 0x71, + 0x80, 0x00, 0x00, 0x54, 0xc0, 0x02, 0x40, 0xb9, 0x80, 0x0e, 0x19, 0x33, + 0xc0, 0x02, 0x00, 0xb9, 0xc2, 0x02, 0x40, 0xb9, 0xbf, 0x02, 0x00, 0x71, + 0xe1, 0x07, 0x9f, 0x1a, 0xe0, 0x03, 0x13, 0xaa, 0xf3, 0x53, 0x41, 0xa9, + 0x41, 0x04, 0x01, 0x4a, 0x21, 0x00, 0x1f, 0x12, 0x21, 0x00, 0x02, 0x4a, + 0xc1, 0x02, 0x00, 0xb9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0x99, 0x71, 0xff, 0x17, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbd, 0xa9, + 0x00, 0x1c, 0x00, 0x12, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x34, 0x1c, 0x00, 0x12, 0x9f, 0x3e, 0x00, 0x71, 0x02, 0x98, 0x48, 0x7a, + 0xa9, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xd3, 0x02, 0x00, 0xd0, + 0x73, 0x02, 0x29, 0x91, 0x01, 0x0c, 0x80, 0x52, 0x03, 0x7c, 0x40, 0x93, + 0xc2, 0x00, 0x00, 0xd0, 0x42, 0x80, 0x16, 0x91, 0x13, 0x4c, 0xa1, 0x9b, + 0x01, 0x00, 0x80, 0x12, 0xf5, 0x13, 0x00, 0xf9, 0xe0, 0x03, 0x13, 0xaa, + 0x55, 0x78, 0x63, 0xf8, 0x89, 0x71, 0xff, 0x97, 0xa0, 0x00, 0x00, 0x34, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xa1, 0x02, 0x40, 0xb9, 0xe0, 0x03, 0x13, 0xaa, + 0x81, 0x0e, 0x19, 0x33, 0xf3, 0x53, 0x41, 0xa9, 0xa1, 0x02, 0x00, 0xb9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0x70, 0x71, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x20, 0x00, 0x71, 0x68, 0x01, 0x00, 0x54, + 0x81, 0x01, 0x00, 0xb4, 0x02, 0x7c, 0x40, 0x93, 0xc3, 0x00, 0x00, 0xd0, + 0x63, 0x80, 0x16, 0x91, 0x00, 0x00, 0x80, 0x52, 0x62, 0x78, 0x62, 0xf8, + 0x42, 0x00, 0x40, 0xb9, 0x42, 0x04, 0x41, 0xd3, 0x22, 0x00, 0x00, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x40, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1c, 0x00, 0x12, + 0x9f, 0x20, 0x00, 0x71, 0x28, 0x03, 0x00, 0x54, 0xfd, 0x7b, 0xbd, 0xa9, + 0xe0, 0x03, 0x01, 0xaa, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x01, 0xaa, 0x7c, 0xfe, 0xff, 0x97, 0xe0, 0x01, 0x00, 0x35, + 0xd4, 0x02, 0x00, 0xd0, 0x94, 0x02, 0x29, 0x91, 0x00, 0x0c, 0x80, 0x52, + 0x83, 0x7c, 0x40, 0x93, 0xc2, 0x00, 0x00, 0xd0, 0x42, 0x80, 0x16, 0x91, + 0x94, 0x50, 0xa0, 0x9b, 0x01, 0x00, 0x80, 0x12, 0xf5, 0x13, 0x00, 0xf9, + 0xe0, 0x03, 0x14, 0xaa, 0x55, 0x78, 0x63, 0xf8, 0x4f, 0x71, 0xff, 0x97, + 0xe0, 0x00, 0x00, 0x34, 0xf5, 0x13, 0x40, 0xf9, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0xa2, 0x02, 0x40, 0xb9, 0xe0, 0x03, 0x15, 0xaa, + 0x63, 0x06, 0x40, 0x39, 0xe1, 0x03, 0x13, 0xaa, 0x62, 0x08, 0x04, 0x33, + 0xa2, 0x02, 0x00, 0xb9, 0xa2, 0x02, 0x40, 0xb9, 0x63, 0x26, 0x40, 0x39, + 0x62, 0x0c, 0x1d, 0x33, 0xa2, 0x02, 0x00, 0xb9, 0xa2, 0x02, 0x40, 0xb9, + 0x63, 0x2a, 0x40, 0x39, 0x62, 0x00, 0x1e, 0x33, 0xa2, 0x02, 0x00, 0xb9, + 0xa2, 0x5a, 0x40, 0xb9, 0x63, 0x62, 0x40, 0x39, 0x62, 0x08, 0x0e, 0x33, + 0xa2, 0x5a, 0x00, 0xb9, 0xa2, 0x5a, 0x40, 0xb9, 0x63, 0x66, 0x40, 0x39, + 0x62, 0x0c, 0x12, 0x33, 0xa2, 0x5a, 0x00, 0xb9, 0xa2, 0x5a, 0x40, 0xb9, + 0x63, 0x6a, 0x40, 0x39, 0x62, 0x0c, 0x16, 0x33, 0xa2, 0x5a, 0x00, 0xb9, + 0xa2, 0x5a, 0x40, 0xb9, 0x63, 0x6e, 0x40, 0x39, 0x62, 0x0c, 0x1a, 0x33, + 0xa2, 0x5a, 0x00, 0xb9, 0x63, 0x72, 0x40, 0x39, 0xa2, 0x5a, 0x40, 0xb9, + 0x62, 0x08, 0x1d, 0x33, 0xa2, 0x5a, 0x00, 0xb9, 0x63, 0x76, 0x40, 0x39, + 0xa2, 0x5a, 0x40, 0xb9, 0x62, 0x08, 0x00, 0x33, 0xa2, 0x5a, 0x00, 0xb9, + 0x62, 0x16, 0x40, 0x39, 0x63, 0x1a, 0x40, 0x39, 0x17, 0xfe, 0xff, 0x97, + 0xe0, 0x03, 0x14, 0xaa, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0x0e, 0x71, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x1c, 0x00, 0x12, 0x9f, 0x20, 0x00, 0x71, 0xa8, 0x03, 0x00, 0x54, + 0xfd, 0x7b, 0xbc, 0xa9, 0xe0, 0x03, 0x01, 0xaa, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x01, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, + 0x55, 0x1c, 0x00, 0x12, 0x76, 0x1c, 0x00, 0x12, 0x2d, 0xfe, 0xff, 0x97, + 0xe0, 0x01, 0x00, 0x35, 0xd4, 0x02, 0x00, 0xd0, 0x94, 0x02, 0x29, 0x91, + 0x00, 0x0c, 0x80, 0x52, 0x83, 0x7c, 0x40, 0x93, 0xc2, 0x00, 0x00, 0xd0, + 0x42, 0x80, 0x16, 0x91, 0x94, 0x50, 0xa0, 0x9b, 0x01, 0x00, 0x80, 0x12, + 0xf7, 0x1b, 0x00, 0xf9, 0xe0, 0x03, 0x14, 0xaa, 0x57, 0x78, 0x63, 0xf8, + 0x00, 0x71, 0xff, 0x97, 0x00, 0x01, 0x00, 0x34, 0xf7, 0x1b, 0x40, 0xf9, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0xe3, 0x03, 0x16, 0x2a, 0xe2, 0x03, 0x15, 0x2a, 0xe1, 0x03, 0x13, 0xaa, + 0xe0, 0x03, 0x17, 0xaa, 0xeb, 0xfd, 0xff, 0x97, 0xe0, 0x03, 0x14, 0xaa, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xe1, 0x70, 0xff, 0x17, 0x08, 0x1c, 0x00, 0x12, + 0x1f, 0x21, 0x00, 0x71, 0xa8, 0x03, 0x00, 0x54, 0xfd, 0x7b, 0xbd, 0xa9, + 0xe0, 0x03, 0x01, 0xaa, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x03, 0x01, 0xaa, 0x2c, 0xfe, 0xff, 0x97, 0x60, 0x02, 0x00, 0x35, + 0xf5, 0x5b, 0x02, 0xa9, 0x96, 0x52, 0x00, 0x91, 0xe0, 0x03, 0x16, 0xaa, + 0x43, 0xfe, 0xff, 0x97, 0xa0, 0x01, 0x00, 0x35, 0xd5, 0x02, 0x00, 0xd0, + 0xb5, 0x02, 0x29, 0x91, 0x00, 0x0c, 0x80, 0x52, 0x03, 0x7d, 0x40, 0x93, + 0xc2, 0x00, 0x00, 0xd0, 0x42, 0x80, 0x16, 0x91, 0x15, 0x55, 0xa0, 0x9b, + 0x01, 0x00, 0x80, 0x12, 0xe0, 0x03, 0x15, 0xaa, 0x53, 0x78, 0x63, 0xf8, + 0xd3, 0x70, 0xff, 0x97, 0xe0, 0x00, 0x00, 0x34, 0xf5, 0x5b, 0x42, 0xa9, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x61, 0x5e, 0x40, 0xb9, + 0xe0, 0x03, 0x15, 0xaa, 0x83, 0x02, 0x40, 0x79, 0x82, 0x0a, 0x40, 0x79, + 0x86, 0x06, 0x40, 0x79, 0x85, 0x0e, 0x40, 0x79, 0x61, 0x3c, 0x10, 0x33, + 0x84, 0x16, 0x40, 0x79, 0x61, 0x5e, 0x00, 0xb9, 0x81, 0x12, 0x40, 0x79, + 0x63, 0x5e, 0x40, 0xb9, 0x63, 0x3c, 0x10, 0x12, 0x63, 0x00, 0x06, 0x2a, + 0x63, 0x5e, 0x00, 0xb9, 0x63, 0x62, 0x40, 0xb9, 0x43, 0x3c, 0x10, 0x33, + 0x63, 0x62, 0x00, 0xb9, 0x62, 0x62, 0x40, 0xb9, 0x42, 0x3c, 0x10, 0x12, + 0x42, 0x00, 0x05, 0x2a, 0x62, 0x62, 0x00, 0xb9, 0x62, 0x66, 0x40, 0xb9, + 0x22, 0x3c, 0x10, 0x33, 0x62, 0x66, 0x00, 0xb9, 0x61, 0x66, 0x40, 0xb9, + 0x21, 0x3c, 0x10, 0x12, 0x21, 0x00, 0x04, 0x2a, 0x61, 0x66, 0x00, 0xb9, + 0x61, 0x72, 0x40, 0xb9, 0x82, 0x32, 0x40, 0x39, 0x41, 0x0c, 0x0d, 0x33, + 0x61, 0x72, 0x00, 0xb9, 0x61, 0x72, 0x40, 0xb9, 0x82, 0x36, 0x40, 0x39, + 0x41, 0x18, 0x14, 0x33, 0x61, 0x72, 0x00, 0xb9, 0x61, 0x72, 0x40, 0xb9, + 0x82, 0x3a, 0x40, 0x39, 0x41, 0x00, 0x15, 0x33, 0x61, 0x72, 0x00, 0xb9, + 0x82, 0x3e, 0x40, 0x39, 0x61, 0x72, 0x40, 0xb9, 0x41, 0x00, 0x16, 0x33, + 0x61, 0x72, 0x00, 0xb9, 0x82, 0x42, 0x40, 0x39, 0x61, 0x72, 0x40, 0xb9, + 0x41, 0x00, 0x17, 0x33, 0x61, 0x72, 0x00, 0xb9, 0x82, 0x4a, 0x40, 0x39, + 0x61, 0x72, 0x40, 0xb9, 0x41, 0x00, 0x09, 0x33, 0x61, 0x72, 0x00, 0xb9, + 0x82, 0x46, 0x40, 0x39, 0x61, 0x72, 0x40, 0xb9, 0x41, 0x00, 0x18, 0x33, + 0x61, 0x72, 0x00, 0xb9, 0x87, 0x70, 0xff, 0x97, 0x20, 0xf8, 0xff, 0x35, + 0xe0, 0x03, 0x15, 0xaa, 0x01, 0x00, 0x80, 0x12, 0x8f, 0x70, 0xff, 0x97, + 0xa0, 0xf7, 0xff, 0x35, 0x61, 0x72, 0x40, 0xb9, 0xe0, 0x03, 0x15, 0xaa, + 0x82, 0x52, 0x40, 0x39, 0xf5, 0x5b, 0x42, 0xa9, 0x41, 0x00, 0x1b, 0x33, + 0x61, 0x72, 0x00, 0xb9, 0x61, 0x72, 0x40, 0xb9, 0x82, 0x56, 0x40, 0x39, + 0x41, 0x00, 0x1c, 0x33, 0x61, 0x72, 0x00, 0xb9, 0x61, 0x72, 0x40, 0xb9, + 0x82, 0x5a, 0x40, 0x39, 0x41, 0x00, 0x1d, 0x33, 0x61, 0x72, 0x00, 0xb9, + 0x61, 0x06, 0x40, 0xb9, 0x82, 0x5e, 0x40, 0x39, 0x41, 0x08, 0x1a, 0x33, + 0x61, 0x06, 0x00, 0xb9, 0x61, 0x72, 0x40, 0xb9, 0x82, 0x62, 0x40, 0x39, + 0x41, 0x00, 0x1e, 0x33, 0x61, 0x72, 0x00, 0xb9, 0x61, 0x72, 0x40, 0xb9, + 0x82, 0x66, 0x40, 0x39, 0x41, 0x00, 0x1f, 0x33, 0x61, 0x72, 0x00, 0xb9, + 0x82, 0x6a, 0x40, 0x39, 0x61, 0x72, 0x40, 0xb9, 0x41, 0x00, 0x00, 0x33, + 0x61, 0x72, 0x00, 0xb9, 0x82, 0x6e, 0x40, 0x39, 0x61, 0x06, 0x40, 0xb9, + 0x41, 0x08, 0x1d, 0x33, 0x61, 0x06, 0x00, 0xb9, 0x81, 0x1e, 0x40, 0xb9, + 0x61, 0x3a, 0x00, 0xb9, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0x5b, 0x70, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x1c, 0x40, 0x92, 0x21, 0x1c, 0x00, 0x12, 0x9f, 0x20, 0x00, 0x71, + 0x42, 0x1c, 0x00, 0x12, 0x20, 0x00, 0x80, 0x52, 0x88, 0x00, 0x00, 0x54, + 0x3f, 0xc8, 0x00, 0x71, 0x20, 0x00, 0x80, 0x52, 0x49, 0x00, 0x00, 0x54, + 0xc0, 0x03, 0x5f, 0xd6, 0x5f, 0x00, 0x01, 0x71, 0xc8, 0xff, 0xff, 0x54, + 0xc5, 0x00, 0x00, 0xd0, 0xa5, 0x80, 0x17, 0x91, 0x41, 0x18, 0x01, 0x0b, + 0x00, 0x00, 0x80, 0x52, 0xa2, 0x78, 0x64, 0xf8, 0x43, 0x58, 0x21, 0xb8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x40, 0x92, + 0xc1, 0x00, 0x00, 0xd0, 0x21, 0x80, 0x17, 0x91, 0x20, 0x78, 0x60, 0xf8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x20, 0x00, 0x71, + 0x28, 0x05, 0x00, 0x54, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x01, 0xaa, 0x41, 0x05, 0x00, 0xb4, + 0xd4, 0x02, 0x00, 0xd0, 0x94, 0x02, 0x29, 0x91, 0x01, 0x0c, 0x80, 0x52, + 0x03, 0x7c, 0x40, 0x93, 0xc2, 0x00, 0x00, 0xd0, 0x42, 0x80, 0x16, 0x91, + 0x14, 0x50, 0xa1, 0x9b, 0x01, 0x00, 0x80, 0x12, 0xf5, 0x13, 0x00, 0xf9, + 0xe0, 0x03, 0x14, 0xaa, 0x55, 0x78, 0x63, 0xf8, 0x35, 0x70, 0xff, 0x97, + 0x20, 0x03, 0x00, 0x35, 0xa0, 0x02, 0x40, 0xb9, 0x00, 0x78, 0x5c, 0xd3, + 0x60, 0x00, 0x00, 0x34, 0xa0, 0x6e, 0x40, 0xb9, 0x00, 0x00, 0x00, 0x12, + 0x60, 0x02, 0x00, 0xb9, 0xe0, 0x03, 0x14, 0xaa, 0xa1, 0x6e, 0x40, 0xb9, + 0x21, 0x04, 0x41, 0xd3, 0x61, 0x06, 0x00, 0xb9, 0xa1, 0x6e, 0x40, 0xb9, + 0x21, 0x08, 0x42, 0xd3, 0x61, 0x0a, 0x00, 0xb9, 0xf3, 0x53, 0x41, 0xa9, + 0xa2, 0x6e, 0x40, 0xb9, 0xe1, 0x03, 0x22, 0x2a, 0x21, 0x00, 0x1e, 0x12, + 0x21, 0x00, 0x02, 0x4a, 0xa1, 0x6e, 0x00, 0xb9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0x12, 0x70, 0xff, 0x17, 0x20, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0x00, 0x1c, 0x00, 0x12, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x34, 0x1c, 0x00, 0x12, 0x9f, 0x1e, 0x00, 0x71, + 0x02, 0x98, 0x48, 0x7a, 0xa9, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xd3, 0x02, 0x00, 0xd0, 0x73, 0x02, 0x29, 0x91, 0x01, 0x0c, 0x80, 0x52, + 0x03, 0x7c, 0x40, 0x93, 0xc2, 0x00, 0x00, 0xd0, 0x42, 0x80, 0x16, 0x91, + 0x13, 0x4c, 0xa1, 0x9b, 0x01, 0x00, 0x80, 0x12, 0xf5, 0x13, 0x00, 0xf9, + 0xe0, 0x03, 0x13, 0xaa, 0x55, 0x78, 0x63, 0xf8, 0xf9, 0x6f, 0xff, 0x97, + 0xa0, 0x00, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xa1, 0x06, 0x40, 0xb9, + 0xe0, 0x03, 0x13, 0xaa, 0x81, 0x0a, 0x1a, 0x33, 0xf3, 0x53, 0x41, 0xa9, + 0xa1, 0x06, 0x00, 0xb9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xe0, 0x6f, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x20, 0x00, 0x71, + 0x48, 0x03, 0x00, 0x54, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xd3, 0x02, 0x00, 0xd0, 0x73, 0x02, 0x29, 0x91, + 0xf7, 0x1b, 0x00, 0xf9, 0x37, 0x1c, 0x00, 0x12, 0x01, 0x0c, 0x80, 0x52, + 0xf4, 0x03, 0x03, 0x2a, 0xc3, 0x00, 0x00, 0xd0, 0x63, 0x80, 0x16, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0x56, 0x1c, 0x00, 0x12, 0x02, 0x7c, 0x40, 0x93, + 0x13, 0x4c, 0xa1, 0x9b, 0x01, 0x00, 0x80, 0x12, 0xe0, 0x03, 0x13, 0xaa, + 0x75, 0x78, 0x62, 0xf8, 0xd3, 0x6f, 0xff, 0x97, 0x00, 0x01, 0x00, 0x34, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0xa1, 0x72, 0x40, 0xb9, 0xe0, 0x03, 0x13, 0xaa, + 0xe1, 0x02, 0x00, 0x33, 0xf7, 0x1b, 0x40, 0xf9, 0xa1, 0x72, 0x00, 0xb9, + 0xa1, 0x72, 0x40, 0xb9, 0xc1, 0x02, 0x1d, 0x33, 0xa1, 0x72, 0x00, 0xb9, + 0xb4, 0x3a, 0x00, 0xb9, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xb2, 0x6f, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0x61, 0x3a, 0x81, 0xd2, 0x01, 0xe0, 0xa8, 0xf2, + 0xfd, 0x03, 0x00, 0x91, 0xe0, 0x02, 0x80, 0xd2, 0x00, 0xe0, 0xa8, 0xf2, + 0xf3, 0x53, 0x01, 0xa9, 0x33, 0x00, 0x40, 0x39, 0x00, 0x00, 0x40, 0x39, + 0x73, 0x1e, 0x00, 0x12, 0x14, 0x04, 0x00, 0x12, 0x81, 0x61, 0xff, 0x97, + 0x02, 0x7d, 0x80, 0x52, 0x61, 0x06, 0x00, 0x12, 0xe3, 0x7f, 0x40, 0xb2, + 0x00, 0x7c, 0xa2, 0x9b, 0x01, 0x24, 0xc1, 0x9a, 0x3f, 0x00, 0x03, 0xeb, + 0xc8, 0x01, 0x00, 0x54, 0xc5, 0x02, 0x00, 0xf0, 0xa4, 0x00, 0x01, 0x91, + 0x02, 0x24, 0xd4, 0x9a, 0x5f, 0x00, 0x03, 0xeb, 0x81, 0x04, 0x00, 0xb9, + 0x08, 0x01, 0x00, 0x54, 0x82, 0x08, 0x00, 0xb9, 0x21, 0x00, 0x80, 0x52, + 0x00, 0x00, 0x80, 0x52, 0xa1, 0x00, 0x01, 0x39, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0xc0, 0x86, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xc1, 0x02, 0x00, 0xf0, 0x23, 0x00, 0x01, 0x91, 0x22, 0x00, 0x41, 0x39, + 0xe1, 0x03, 0x00, 0xaa, 0x20, 0xc0, 0x86, 0x52, 0x82, 0x00, 0x00, 0x34, + 0x62, 0x08, 0x40, 0xb9, 0x00, 0x00, 0x80, 0x52, 0x22, 0x00, 0x00, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x06, 0x80, 0xd2, 0x02, 0xc8, 0xa8, 0xf2, 0xe1, 0x03, 0x00, 0x2a, + 0x00, 0x00, 0x80, 0x52, 0x41, 0x00, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x12, + 0x1f, 0x0c, 0x00, 0x71, 0x69, 0x00, 0x00, 0x54, 0x40, 0x60, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbe, 0xa9, 0x21, 0x1c, 0x00, 0x12, + 0x20, 0x20, 0x00, 0x2a, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x54, 0x3c, 0x10, 0x12, 0x13, 0x40, 0x02, 0x2a, 0x94, 0x02, 0x00, 0x2a, + 0x00, 0x18, 0x80, 0x52, 0x5a, 0x05, 0x00, 0x94, 0x01, 0x06, 0x80, 0xd2, + 0x01, 0xc8, 0xa8, 0xf2, 0x33, 0x00, 0x00, 0xb9, 0x34, 0x00, 0x00, 0xb9, + 0x55, 0x05, 0x00, 0x94, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x81, 0x00, 0x80, 0xd2, + 0x01, 0xc8, 0xa8, 0xf2, 0x03, 0x01, 0x80, 0xd2, 0x03, 0xc8, 0xa8, 0xf2, + 0x82, 0x01, 0x80, 0xd2, 0x02, 0xc8, 0xa8, 0xf2, 0x3f, 0x00, 0x00, 0xb9, + 0x00, 0x02, 0x80, 0xd2, 0x00, 0xc8, 0xa8, 0xf2, 0x7f, 0x00, 0x00, 0xb9, + 0x5f, 0x00, 0x00, 0xb9, 0x01, 0xc8, 0xa8, 0xd2, 0x1f, 0x00, 0x00, 0xb9, + 0x20, 0x00, 0x40, 0xb9, 0x00, 0x74, 0x1e, 0x12, 0x00, 0x00, 0x00, 0x32, + 0x20, 0x00, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xda, 0x08, 0x00, 0x94, 0x01, 0x04, 0x86, 0xd2, 0x01, 0xc0, 0xb6, 0xf2, + 0x24, 0x00, 0x80, 0x52, 0xc3, 0x02, 0x00, 0xf0, 0x22, 0x00, 0x40, 0xb9, + 0xe0, 0x03, 0x22, 0x2a, 0x00, 0x00, 0x04, 0x0a, 0x00, 0x00, 0x02, 0x4a, + 0x20, 0x00, 0x00, 0xb9, 0x64, 0x4c, 0x00, 0xb9, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x02, 0x00, 0xf0, + 0x00, 0x30, 0x01, 0x91, 0x21, 0x00, 0x80, 0x52, 0x1f, 0xfc, 0xe1, 0x88, + 0x3f, 0x04, 0x00, 0x71, 0xa1, 0x02, 0x00, 0x54, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0x0f, 0x09, 0x00, 0x94, + 0x83, 0x60, 0x86, 0xd2, 0x03, 0xc0, 0xb6, 0xf2, 0xf3, 0x03, 0x00, 0xaa, + 0xe1, 0x03, 0x00, 0x2a, 0x64, 0x00, 0x40, 0xb9, 0xa0, 0x09, 0x80, 0x52, + 0xe2, 0x03, 0x24, 0x2a, 0x42, 0x00, 0x1a, 0x12, 0x42, 0x00, 0x04, 0x4a, + 0x62, 0x00, 0x00, 0xb9, 0x58, 0x92, 0xff, 0x97, 0x61, 0xfe, 0x60, 0xd3, + 0xa0, 0x09, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0x53, 0x92, 0xff, 0x17, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xba, 0xa9, 0x00, 0x1c, 0x40, 0x92, 0x1f, 0xfc, 0x03, 0x71, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf5, 0x5b, 0x02, 0xa9, + 0xf7, 0x63, 0x03, 0xa9, 0x60, 0x0f, 0x00, 0x54, 0x15, 0x04, 0x00, 0x11, + 0xb7, 0x1e, 0x00, 0x12, 0xc1, 0x00, 0x00, 0xd0, 0x21, 0x00, 0x21, 0x91, + 0xf6, 0x03, 0x01, 0x91, 0x20, 0xa0, 0x40, 0x4c, 0xc0, 0xa2, 0x00, 0x4c, + 0x1f, 0x20, 0x03, 0xd5, 0xd3, 0x7a, 0x60, 0xf8, 0x78, 0x32, 0x00, 0x91, + 0x61, 0x02, 0x43, 0xb9, 0xe0, 0x03, 0x21, 0x2a, 0x00, 0x00, 0x00, 0x12, + 0x00, 0x00, 0x01, 0x4a, 0x60, 0x02, 0x03, 0xb9, 0x60, 0x06, 0x40, 0xb9, + 0x00, 0x78, 0x1f, 0x12, 0x60, 0x06, 0x00, 0xb9, 0x60, 0x0e, 0x40, 0xb9, + 0x60, 0x01, 0x00, 0x37, 0x14, 0x00, 0x80, 0x52, 0x80, 0x0c, 0x80, 0x52, + 0x32, 0x6e, 0xff, 0x97, 0x01, 0x03, 0x40, 0xb9, 0x94, 0x06, 0x00, 0x11, + 0x94, 0x1e, 0x00, 0x12, 0x9f, 0x0e, 0x00, 0x71, 0xe0, 0x07, 0x9f, 0x1a, + 0x1f, 0x00, 0x21, 0x6a, 0x01, 0xff, 0xff, 0x54, 0x61, 0x12, 0x40, 0xb9, + 0xff, 0x02, 0x35, 0x6b, 0xa0, 0x1e, 0x40, 0x92, 0x21, 0x78, 0x1b, 0x12, + 0x61, 0x12, 0x00, 0xb9, 0x61, 0x12, 0x40, 0xb9, 0x21, 0x78, 0x19, 0x12, + 0x61, 0x12, 0x00, 0xb9, 0x61, 0x12, 0x40, 0xb9, 0x21, 0x78, 0x18, 0x12, + 0x61, 0x12, 0x00, 0xb9, 0x61, 0x12, 0x40, 0xb9, 0x21, 0x78, 0x14, 0x12, + 0x61, 0x12, 0x00, 0xb9, 0x61, 0x12, 0x40, 0xb9, 0x21, 0x78, 0x13, 0x12, + 0x61, 0x12, 0x00, 0xb9, 0x61, 0x3a, 0x40, 0xb9, 0x21, 0x4c, 0x14, 0x12, + 0x61, 0x3a, 0x00, 0xb9, 0x61, 0x42, 0x40, 0xb9, 0x21, 0x60, 0x19, 0x12, + 0x61, 0x42, 0x00, 0xb9, 0x61, 0x32, 0x40, 0xb9, 0x21, 0x5c, 0x18, 0x12, + 0x61, 0x32, 0x00, 0xb9, 0x61, 0x82, 0x40, 0xb9, 0x21, 0x5c, 0x18, 0x12, + 0x61, 0x82, 0x00, 0xb9, 0x61, 0x26, 0x40, 0xb9, 0x21, 0x6c, 0x1c, 0x12, + 0x61, 0x26, 0x00, 0xb9, 0x61, 0x22, 0x40, 0xb9, 0x21, 0x78, 0x18, 0x12, + 0x61, 0x22, 0x00, 0xb9, 0x61, 0x22, 0x40, 0xb9, 0x21, 0x78, 0x10, 0x12, + 0x61, 0x22, 0x00, 0xb9, 0x61, 0x22, 0x40, 0xb9, 0x21, 0x78, 0x08, 0x12, + 0x61, 0x22, 0x00, 0xb9, 0x61, 0x22, 0x40, 0xb9, 0x21, 0x78, 0x00, 0x12, + 0x61, 0x22, 0x00, 0xb9, 0x61, 0x22, 0x40, 0xb9, 0x21, 0x6c, 0x1c, 0x12, + 0x61, 0x22, 0x00, 0xb9, 0x61, 0x22, 0x40, 0xb9, 0x21, 0x6c, 0x14, 0x12, + 0x61, 0x22, 0x00, 0xb9, 0x61, 0x22, 0x40, 0xb9, 0x21, 0x6c, 0x0c, 0x12, + 0x61, 0x22, 0x00, 0xb9, 0x61, 0x22, 0x40, 0xb9, 0x21, 0x6c, 0x04, 0x12, + 0x61, 0x22, 0x00, 0xb9, 0x61, 0x26, 0x40, 0xb9, 0x21, 0x78, 0x14, 0x12, + 0x61, 0x26, 0x00, 0xb9, 0x61, 0x26, 0x40, 0xb9, 0x21, 0x78, 0x13, 0x12, + 0x61, 0x26, 0x00, 0xb9, 0x61, 0x82, 0x40, 0xb9, 0x21, 0x78, 0x14, 0x12, + 0x61, 0x82, 0x00, 0xb9, 0x61, 0x82, 0x40, 0xb9, 0x21, 0x6c, 0x0c, 0x12, + 0x61, 0x82, 0x00, 0xb9, 0x61, 0x82, 0x40, 0xb9, 0x21, 0x6c, 0x08, 0x12, + 0x61, 0x82, 0x00, 0xb9, 0x61, 0x82, 0x40, 0xb9, 0x21, 0x78, 0x16, 0x12, + 0x61, 0x82, 0x00, 0xb9, 0x61, 0x86, 0x40, 0xb9, 0x21, 0x5c, 0x18, 0x12, + 0x61, 0x86, 0x00, 0xb9, 0x61, 0x8a, 0x40, 0xb9, 0x21, 0x3c, 0x10, 0x12, + 0x61, 0x8a, 0x00, 0xb9, 0x61, 0x8a, 0x40, 0xb9, 0x21, 0x3c, 0x00, 0x12, + 0x61, 0x8a, 0x00, 0xb9, 0x69, 0x00, 0x00, 0x54, 0x15, 0x04, 0x00, 0x11, + 0x95, 0xff, 0xff, 0x17, 0xdf, 0x3f, 0x03, 0xd5, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x80, 0xd2, 0x97, 0x00, 0x80, 0x52, + 0x35, 0x00, 0x80, 0x52, 0x85, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb9, 0xa9, 0x00, 0x00, 0x80, 0x12, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x00, 0x80, 0xd2, + 0xf5, 0x5b, 0x02, 0xa9, 0xf6, 0x43, 0x01, 0x91, 0xf7, 0x63, 0x03, 0xa9, + 0x70, 0xff, 0xff, 0x97, 0xc0, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x21, 0x91, + 0xe1, 0xc3, 0x00, 0x32, 0xe1, 0x4b, 0x00, 0xb9, 0x00, 0xa0, 0x40, 0x4c, + 0x20, 0x00, 0x80, 0x52, 0xc0, 0xa2, 0x00, 0x4c, 0x20, 0x01, 0x00, 0x35, + 0x1f, 0x20, 0x03, 0xd5, 0x9f, 0x0e, 0x00, 0xf1, 0xe0, 0x03, 0x00, 0x54, + 0xe0, 0x23, 0x01, 0x91, 0x80, 0x02, 0x00, 0x8b, 0x94, 0x06, 0x00, 0x91, + 0x00, 0x04, 0x40, 0x39, 0x40, 0xff, 0xff, 0x34, 0xd3, 0x7a, 0x74, 0xf8, + 0x77, 0x32, 0x00, 0x91, 0x61, 0x02, 0x43, 0xb9, 0xe0, 0x03, 0x21, 0x2a, + 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x01, 0x4a, 0x60, 0x02, 0x03, 0xb9, + 0x60, 0x06, 0x40, 0xb9, 0x00, 0x78, 0x1f, 0x12, 0x60, 0x06, 0x00, 0xb9, + 0x60, 0x0e, 0x40, 0xb9, 0xe0, 0x14, 0x00, 0x37, 0x15, 0x00, 0x80, 0x52, + 0x80, 0x0c, 0x80, 0x52, 0xa1, 0x6d, 0xff, 0x97, 0xe0, 0x02, 0x40, 0xb9, + 0xb5, 0x06, 0x00, 0x11, 0xb5, 0x1e, 0x00, 0x12, 0xc0, 0x13, 0x00, 0x37, + 0xbf, 0x0e, 0x00, 0x71, 0x21, 0xff, 0xff, 0x54, 0xe0, 0x23, 0x01, 0x91, + 0x9f, 0x0e, 0x00, 0xf1, 0x1f, 0x68, 0x34, 0x38, 0x61, 0xfc, 0xff, 0x54, + 0xdf, 0x3f, 0x03, 0xd5, 0xf3, 0x23, 0x01, 0x91, 0x14, 0x00, 0x80, 0xd2, + 0x60, 0x02, 0x40, 0x39, 0x97, 0x1e, 0x00, 0x12, 0x20, 0x0f, 0x00, 0x35, + 0x94, 0x06, 0x00, 0x91, 0x73, 0x06, 0x00, 0x91, 0x9f, 0x12, 0x00, 0xf1, + 0x41, 0xff, 0xff, 0x54, 0xe0, 0x23, 0x41, 0x39, 0x00, 0x01, 0x00, 0x34, + 0x01, 0x00, 0x84, 0xd2, 0x01, 0xc0, 0xb6, 0xf2, 0x22, 0x00, 0x40, 0xb9, + 0xe0, 0x03, 0x22, 0x2a, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x02, 0x4a, + 0x20, 0x00, 0x00, 0xb9, 0xe0, 0x27, 0x41, 0x39, 0x00, 0x01, 0x00, 0x34, + 0x01, 0x00, 0x84, 0xd2, 0x01, 0xc0, 0xb6, 0xf2, 0x22, 0x00, 0x40, 0xb9, + 0xe0, 0x03, 0x22, 0x2a, 0x00, 0x00, 0x1f, 0x12, 0x00, 0x00, 0x02, 0x4a, + 0x20, 0x00, 0x00, 0xb9, 0xe0, 0x2b, 0x41, 0x39, 0x00, 0x01, 0x00, 0x34, + 0x01, 0x00, 0x84, 0xd2, 0x01, 0xc0, 0xb6, 0xf2, 0x22, 0x00, 0x40, 0xb9, + 0xe0, 0x03, 0x22, 0x2a, 0x00, 0x00, 0x1e, 0x12, 0x00, 0x00, 0x02, 0x4a, + 0x20, 0x00, 0x00, 0xb9, 0xe0, 0x2f, 0x41, 0x39, 0x00, 0x01, 0x00, 0x34, + 0x01, 0x00, 0x84, 0xd2, 0x01, 0xc0, 0xb6, 0xf2, 0x22, 0x00, 0x40, 0xb9, + 0xe0, 0x03, 0x22, 0x2a, 0x00, 0x00, 0x1d, 0x12, 0x00, 0x00, 0x02, 0x4a, + 0x20, 0x00, 0x00, 0xb9, 0x82, 0x60, 0x86, 0xd2, 0x02, 0xc0, 0xb6, 0xf2, + 0x81, 0x01, 0x86, 0xd2, 0x01, 0xc0, 0xb6, 0xf2, 0x43, 0x00, 0x40, 0xb9, + 0xf4, 0x03, 0x01, 0xaa, 0x13, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x23, 0x2a, + 0x00, 0x00, 0x1a, 0x12, 0x00, 0x00, 0x03, 0x4a, 0x40, 0x00, 0x00, 0xb9, + 0x20, 0x00, 0x40, 0xb9, 0x40, 0x01, 0x10, 0x37, 0x80, 0x0c, 0x80, 0x52, + 0x5a, 0x6d, 0xff, 0x97, 0x81, 0x02, 0x40, 0xb9, 0x73, 0x06, 0x00, 0x11, + 0x73, 0x1e, 0x00, 0x12, 0x7f, 0x0e, 0x00, 0x71, 0xe0, 0x07, 0x9f, 0x1a, + 0x1f, 0x08, 0x61, 0x6a, 0x01, 0xff, 0xff, 0x54, 0x06, 0x04, 0x86, 0xd2, + 0x06, 0xc0, 0xb6, 0xf2, 0x05, 0x05, 0x86, 0xd2, 0x05, 0xc0, 0xb6, 0xf2, + 0xc1, 0x00, 0x40, 0xb9, 0x80, 0x60, 0x86, 0xd2, 0x00, 0xc0, 0xb6, 0xf2, + 0x84, 0x03, 0x86, 0xd2, 0x04, 0xc0, 0xb6, 0xf2, 0x21, 0x78, 0x1f, 0x12, + 0xf3, 0x53, 0x41, 0xa9, 0x03, 0x03, 0x86, 0xd2, 0x03, 0xc0, 0xb6, 0xf2, + 0x82, 0x02, 0x86, 0xd2, 0x02, 0xc0, 0xb6, 0xf2, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xc1, 0x00, 0x00, 0xb9, 0xa1, 0x00, 0x40, 0xb9, + 0x21, 0x74, 0x1e, 0x12, 0xa1, 0x00, 0x00, 0xb9, 0x05, 0x00, 0x40, 0xb9, + 0xe1, 0x03, 0x25, 0x2a, 0x21, 0x00, 0x18, 0x12, 0x21, 0x00, 0x05, 0x4a, + 0x01, 0x00, 0x00, 0xb9, 0x05, 0x00, 0x40, 0xb9, 0xe1, 0x03, 0x25, 0x2a, + 0x21, 0x00, 0x1b, 0x12, 0x21, 0x00, 0x05, 0x4a, 0x01, 0x00, 0x00, 0xb9, + 0x05, 0x00, 0x40, 0xb9, 0xe1, 0x03, 0x25, 0x2a, 0x21, 0x00, 0x14, 0x12, + 0x21, 0x00, 0x05, 0x4a, 0x01, 0x00, 0x00, 0xb9, 0x05, 0x00, 0x40, 0xb9, + 0xe1, 0x03, 0x25, 0x2a, 0x21, 0x00, 0x1f, 0x12, 0x21, 0x00, 0x05, 0x4a, + 0x01, 0x00, 0x00, 0xb9, 0x05, 0x00, 0x40, 0xb9, 0xe1, 0x03, 0x25, 0x2a, + 0x21, 0x00, 0x00, 0x12, 0x21, 0x00, 0x05, 0x4a, 0x01, 0x00, 0x00, 0xb9, + 0x80, 0x00, 0x40, 0xb9, 0x00, 0x44, 0x12, 0x12, 0x00, 0x00, 0x1d, 0x32, + 0x80, 0x00, 0x00, 0xb9, 0x60, 0x00, 0x40, 0xb9, 0x00, 0x3c, 0x10, 0x12, + 0x60, 0x00, 0x00, 0xb9, 0x40, 0x00, 0x40, 0xb9, 0x00, 0x3c, 0x10, 0x12, + 0x40, 0x00, 0x00, 0xb9, 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xc0, 0x7a, 0x74, 0xf8, 0x18, 0x30, 0x00, 0x91, 0x02, 0x04, 0x40, 0xb9, + 0xe1, 0x03, 0x22, 0x2a, 0x21, 0x00, 0x00, 0x12, 0x21, 0x00, 0x02, 0x4a, + 0x01, 0x04, 0x00, 0xb9, 0x01, 0x00, 0x43, 0xb9, 0x21, 0x78, 0x1f, 0x12, + 0x01, 0x00, 0x03, 0xb9, 0x00, 0x0c, 0x40, 0xb9, 0xa0, 0xef, 0x07, 0x36, + 0x15, 0x00, 0x80, 0x52, 0x80, 0x0c, 0x80, 0x52, 0x0a, 0x6d, 0xff, 0x97, + 0x00, 0x03, 0x40, 0xb9, 0xb5, 0x06, 0x00, 0x11, 0xb5, 0x1e, 0x00, 0x12, + 0xc0, 0x0e, 0x00, 0x36, 0xbf, 0x0e, 0x00, 0x71, 0x21, 0xff, 0xff, 0x54, + 0x7f, 0x02, 0x00, 0x39, 0xe0, 0x03, 0x17, 0x2a, 0xb1, 0xfe, 0xff, 0x97, + 0x70, 0xff, 0xff, 0x17, 0xbf, 0x0e, 0x00, 0x71, 0x80, 0xec, 0xff, 0x54, + 0x62, 0x12, 0x40, 0xb9, 0x80, 0x06, 0x00, 0x11, 0xe1, 0x03, 0x22, 0x2a, + 0x21, 0x00, 0x1c, 0x12, 0x21, 0x00, 0x02, 0x4a, 0x61, 0x12, 0x00, 0xb9, + 0x62, 0x12, 0x40, 0xb9, 0xe1, 0x03, 0x22, 0x2a, 0x21, 0x00, 0x1a, 0x12, + 0x21, 0x00, 0x02, 0x4a, 0x61, 0x12, 0x00, 0xb9, 0x62, 0x12, 0x40, 0xb9, + 0xe1, 0x03, 0x22, 0x2a, 0x21, 0x00, 0x19, 0x12, 0x21, 0x00, 0x02, 0x4a, + 0x61, 0x12, 0x00, 0xb9, 0x62, 0x12, 0x40, 0xb9, 0xe1, 0x03, 0x22, 0x2a, + 0x21, 0x00, 0x15, 0x12, 0x21, 0x00, 0x02, 0x4a, 0x61, 0x12, 0x00, 0xb9, + 0x62, 0x12, 0x40, 0xb9, 0xe1, 0x03, 0x22, 0x2a, 0x21, 0x00, 0x14, 0x12, + 0x21, 0x00, 0x02, 0x4a, 0x61, 0x12, 0x00, 0xb9, 0x61, 0x3a, 0x40, 0xb9, + 0x21, 0x4c, 0x14, 0x12, 0x21, 0x00, 0x1e, 0x32, 0x61, 0x3a, 0x00, 0xb9, + 0x61, 0x36, 0x40, 0xb9, 0x21, 0x68, 0x1b, 0x12, 0x21, 0x00, 0x1d, 0x32, + 0x61, 0x36, 0x00, 0xb9, 0x61, 0x42, 0x40, 0xb9, 0x20, 0x04, 0x00, 0x4a, + 0x00, 0x18, 0x00, 0x12, 0x00, 0x00, 0x01, 0x4a, 0x60, 0x42, 0x00, 0xb9, + 0x60, 0x32, 0x40, 0xb9, 0x00, 0x5c, 0x18, 0x12, 0x60, 0x32, 0x00, 0xb9, + 0x60, 0x26, 0x40, 0xb9, 0x00, 0x6c, 0x1c, 0x12, 0x60, 0x26, 0x00, 0xb9, + 0x60, 0x22, 0x40, 0xb9, 0x00, 0x78, 0x18, 0x12, 0x60, 0x22, 0x00, 0xb9, + 0x60, 0x22, 0x40, 0xb9, 0x00, 0x78, 0x10, 0x12, 0x60, 0x22, 0x00, 0xb9, + 0x60, 0x22, 0x40, 0xb9, 0x00, 0x78, 0x08, 0x12, 0x60, 0x22, 0x00, 0xb9, + 0x60, 0x22, 0x40, 0xb9, 0x00, 0x78, 0x00, 0x12, 0x60, 0x22, 0x00, 0xb9, + 0x60, 0x22, 0x40, 0xb9, 0x00, 0x6c, 0x1c, 0x12, 0x60, 0x22, 0x00, 0xb9, + 0x60, 0x22, 0x40, 0xb9, 0x00, 0x6c, 0x14, 0x12, 0x60, 0x22, 0x00, 0xb9, + 0x60, 0x22, 0x40, 0xb9, 0x00, 0x6c, 0x0c, 0x12, 0x60, 0x22, 0x00, 0xb9, + 0x60, 0x22, 0x40, 0xb9, 0x00, 0x6c, 0x04, 0x12, 0x60, 0x22, 0x00, 0xb9, + 0x61, 0x26, 0x40, 0xb9, 0xe0, 0x03, 0x21, 0x2a, 0x00, 0x00, 0x15, 0x12, + 0x00, 0x00, 0x01, 0x4a, 0x60, 0x26, 0x00, 0xb9, 0x61, 0x26, 0x40, 0xb9, + 0xe0, 0x03, 0x21, 0x2a, 0x00, 0x00, 0x14, 0x12, 0x00, 0x00, 0x01, 0x4a, + 0x60, 0x26, 0x00, 0xb9, 0x61, 0x82, 0x40, 0xb9, 0xe0, 0x03, 0x21, 0x2a, + 0x00, 0x00, 0x15, 0x12, 0x00, 0x00, 0x01, 0x4a, 0x60, 0x82, 0x00, 0xb9, + 0x60, 0x82, 0x40, 0xb9, 0x00, 0x6c, 0x0c, 0x12, 0x60, 0x82, 0x00, 0xb9, + 0x60, 0x82, 0x40, 0xb9, 0x00, 0x6c, 0x08, 0x12, 0x60, 0x82, 0x00, 0xb9, + 0x60, 0x86, 0x40, 0xb9, 0x00, 0x5c, 0x18, 0x12, 0x60, 0x86, 0x00, 0xb9, + 0x60, 0x8a, 0x40, 0xb9, 0x00, 0x3c, 0x10, 0x12, 0x60, 0x8a, 0x00, 0xb9, + 0x60, 0x8a, 0x40, 0xb9, 0x00, 0x3c, 0x00, 0x12, 0x60, 0x8a, 0x00, 0xb9, + 0x61, 0x82, 0x40, 0xb9, 0xe0, 0x03, 0x21, 0x2a, 0x00, 0x00, 0x17, 0x12, + 0x00, 0x00, 0x01, 0x4a, 0x60, 0x82, 0x00, 0xb9, 0x60, 0x82, 0x40, 0xb9, + 0x00, 0x5c, 0x18, 0x12, 0x00, 0x00, 0x00, 0x32, 0x60, 0x82, 0x00, 0xb9, + 0xdb, 0xfe, 0xff, 0x17, 0xbf, 0x0e, 0x00, 0x71, 0xe1, 0xdf, 0xff, 0x54, + 0x8b, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x21, 0x1c, 0x00, 0x72, + 0x80, 0x0e, 0x00, 0x54, 0x04, 0x00, 0x80, 0x52, 0x06, 0x22, 0x80, 0xd2, + 0x46, 0x44, 0xb6, 0xf2, 0x05, 0x20, 0x80, 0xd2, 0x45, 0x44, 0xb6, 0xf2, + 0x22, 0x24, 0xc4, 0x1a, 0x83, 0x1c, 0x00, 0x12, 0x42, 0x00, 0x00, 0x12, + 0xa0, 0x02, 0x00, 0x35, 0x1f, 0x20, 0x03, 0xd5, 0x02, 0x05, 0x00, 0x34, + 0x9f, 0x10, 0x00, 0x71, 0xe0, 0x0f, 0x00, 0x54, 0x7f, 0x10, 0x00, 0x71, + 0x28, 0x06, 0x00, 0x54, 0x7f, 0x08, 0x00, 0x71, 0x40, 0x10, 0x00, 0x54, + 0x7f, 0x0c, 0x00, 0x71, 0x81, 0x04, 0x00, 0x54, 0xa3, 0x00, 0x40, 0xb9, + 0xe2, 0x03, 0x23, 0x2a, 0x42, 0x00, 0x1d, 0x12, 0x42, 0x00, 0x03, 0x4a, + 0xa2, 0x00, 0x00, 0xb9, 0x84, 0x04, 0x00, 0x11, 0x22, 0x24, 0xc4, 0x1a, + 0x83, 0x1c, 0x00, 0x12, 0x42, 0x00, 0x00, 0x12, 0xc0, 0xfd, 0xff, 0x34, + 0xa2, 0x02, 0x00, 0x34, 0x9f, 0x10, 0x00, 0x71, 0x40, 0x0f, 0x00, 0x54, + 0x7f, 0x10, 0x00, 0x71, 0x88, 0x06, 0x00, 0x54, 0x7f, 0x08, 0x00, 0x71, + 0xa0, 0x0f, 0x00, 0x54, 0x7f, 0x0c, 0x00, 0x71, 0xe1, 0x04, 0x00, 0x54, + 0xc3, 0x00, 0x40, 0xb9, 0x84, 0x04, 0x00, 0x11, 0xe2, 0x03, 0x23, 0x2a, + 0x42, 0x00, 0x1d, 0x12, 0x42, 0x00, 0x03, 0x4a, 0xc2, 0x00, 0x00, 0xb9, + 0xed, 0xff, 0xff, 0x17, 0xa7, 0x00, 0x40, 0xb9, 0xe2, 0x03, 0x27, 0x2a, + 0x42, 0x00, 0x00, 0x12, 0x42, 0x00, 0x07, 0x4a, 0xa2, 0x00, 0x00, 0xb9, + 0x7f, 0x1c, 0x00, 0x71, 0xa1, 0xfc, 0xff, 0x54, 0x00, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x7f, 0x04, 0x00, 0x71, 0xc1, 0xfe, 0xff, 0x54, + 0xa3, 0x00, 0x40, 0xb9, 0x84, 0x04, 0x00, 0x11, 0xe2, 0x03, 0x23, 0x2a, + 0x42, 0x00, 0x1f, 0x12, 0x42, 0x00, 0x03, 0x4a, 0xa2, 0x00, 0x00, 0xb9, + 0xdb, 0xff, 0xff, 0x17, 0x7f, 0x18, 0x00, 0x71, 0xa0, 0x06, 0x00, 0x54, + 0x7f, 0x1c, 0x00, 0x71, 0xe1, 0x03, 0x00, 0x54, 0x01, 0x20, 0x80, 0xd2, + 0x41, 0x44, 0xb6, 0xf2, 0x22, 0x00, 0x40, 0xb9, 0xe0, 0x03, 0x22, 0x2a, + 0x00, 0x00, 0x19, 0x12, 0x00, 0x00, 0x02, 0x4a, 0x20, 0x00, 0x00, 0xb9, + 0x00, 0x00, 0x80, 0x52, 0xea, 0xff, 0xff, 0x17, 0x7f, 0x04, 0x00, 0x71, + 0xe1, 0x05, 0x00, 0x54, 0xc3, 0x00, 0x40, 0xb9, 0x84, 0x04, 0x00, 0x11, + 0xe2, 0x03, 0x23, 0x2a, 0x42, 0x00, 0x1f, 0x12, 0x42, 0x00, 0x03, 0x4a, + 0xc2, 0x00, 0x00, 0xb9, 0xc5, 0xff, 0xff, 0x17, 0x7f, 0x18, 0x00, 0x71, + 0xc0, 0x05, 0x00, 0x54, 0x7f, 0x1c, 0x00, 0x71, 0x41, 0x02, 0x00, 0x54, + 0x01, 0x22, 0x80, 0xd2, 0x41, 0x44, 0xb6, 0xf2, 0x22, 0x00, 0x40, 0xb9, + 0xe0, 0x03, 0x22, 0x2a, 0x00, 0x00, 0x19, 0x12, 0x00, 0x00, 0x02, 0x4a, + 0x20, 0x00, 0x00, 0xb9, 0xea, 0xff, 0xff, 0x17, 0x7f, 0x14, 0x00, 0x71, + 0x61, 0xf9, 0xff, 0x54, 0xa3, 0x00, 0x40, 0xb9, 0x84, 0x04, 0x00, 0x11, + 0xe2, 0x03, 0x23, 0x2a, 0x42, 0x00, 0x1b, 0x12, 0x42, 0x00, 0x03, 0x4a, + 0xa2, 0x00, 0x00, 0xb9, 0xb0, 0xff, 0xff, 0x17, 0x7f, 0x14, 0x00, 0x71, + 0x21, 0x02, 0x00, 0x54, 0xc3, 0x00, 0x40, 0xb9, 0x84, 0x04, 0x00, 0x11, + 0xe2, 0x03, 0x23, 0x2a, 0x42, 0x00, 0x1b, 0x12, 0x42, 0x00, 0x03, 0x4a, + 0xc2, 0x00, 0x00, 0xb9, 0xa7, 0xff, 0xff, 0x17, 0x20, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0xa3, 0x00, 0x40, 0xb9, 0x84, 0x04, 0x00, 0x11, + 0xe2, 0x03, 0x23, 0x2a, 0x42, 0x00, 0x1a, 0x12, 0x42, 0x00, 0x03, 0x4a, + 0xa2, 0x00, 0x00, 0xb9, 0x9e, 0xff, 0xff, 0x17, 0xc7, 0x00, 0x40, 0xb9, + 0x7f, 0x1c, 0x00, 0x71, 0xe2, 0x03, 0x27, 0x2a, 0x42, 0x00, 0x00, 0x12, + 0x42, 0x00, 0x07, 0x4a, 0xc2, 0x00, 0x00, 0xb9, 0xc1, 0xf2, 0xff, 0x54, + 0xb1, 0xff, 0xff, 0x17, 0xc3, 0x00, 0x40, 0xb9, 0x84, 0x04, 0x00, 0x11, + 0xe2, 0x03, 0x23, 0x2a, 0x42, 0x00, 0x1a, 0x12, 0x42, 0x00, 0x03, 0x4a, + 0xc2, 0x00, 0x00, 0xb9, 0x8f, 0xff, 0xff, 0x17, 0xa3, 0x00, 0x40, 0xb9, + 0x84, 0x04, 0x00, 0x11, 0xe2, 0x03, 0x23, 0x2a, 0x42, 0x00, 0x1c, 0x12, + 0x42, 0x00, 0x03, 0x4a, 0xa2, 0x00, 0x00, 0xb9, 0x88, 0xff, 0xff, 0x17, + 0xa3, 0x00, 0x40, 0xb9, 0x84, 0x04, 0x00, 0x11, 0xe2, 0x03, 0x23, 0x2a, + 0x42, 0x00, 0x1e, 0x12, 0x42, 0x00, 0x03, 0x4a, 0xa2, 0x00, 0x00, 0xb9, + 0x81, 0xff, 0xff, 0x17, 0xc3, 0x00, 0x40, 0xb9, 0x84, 0x04, 0x00, 0x11, + 0xe2, 0x03, 0x23, 0x2a, 0x42, 0x00, 0x1c, 0x12, 0x42, 0x00, 0x03, 0x4a, + 0xc2, 0x00, 0x00, 0xb9, 0x7a, 0xff, 0xff, 0x17, 0xc3, 0x00, 0x40, 0xb9, + 0x84, 0x04, 0x00, 0x11, 0xe2, 0x03, 0x23, 0x2a, 0x42, 0x00, 0x1e, 0x12, + 0x42, 0x00, 0x03, 0x4a, 0xc2, 0x00, 0x00, 0xb9, 0x73, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x02, 0x80, 0x52, 0xc3, 0x00, 0x00, 0xb0, 0x63, 0x80, 0x21, 0x91, + 0xe0, 0x03, 0x01, 0x2a, 0x42, 0x00, 0x82, 0x52, 0x3b, 0x90, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x80, 0x52, + 0xc3, 0x00, 0x00, 0xb0, 0x63, 0x60, 0x22, 0x91, 0xe0, 0x03, 0x01, 0x2a, + 0xa2, 0x00, 0x82, 0x52, 0x33, 0x90, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbf, 0xa9, 0xe0, 0x07, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0xad, 0x8f, 0xff, 0x97, 0xfd, 0x7b, 0xc1, 0xa8, + 0x01, 0x02, 0x80, 0x52, 0xc3, 0x00, 0x00, 0xb0, 0x63, 0xc0, 0x22, 0x91, + 0xe0, 0x03, 0x01, 0x2a, 0x62, 0x00, 0x82, 0x52, 0x26, 0x90, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbf, 0xa9, 0x00, 0x08, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0xa1, 0x8f, 0xff, 0x97, 0xfd, 0x7b, 0xc1, 0xa8, + 0x01, 0x02, 0x80, 0x52, 0xc3, 0x00, 0x00, 0xb0, 0x63, 0xe0, 0x23, 0x91, + 0xe0, 0x03, 0x01, 0x2a, 0x82, 0x00, 0x82, 0x52, 0x1a, 0x90, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0x0c, 0x00, 0x71, 0xe9, 0x00, 0x00, 0x54, + 0xc3, 0x00, 0x00, 0xb0, 0x63, 0x40, 0x24, 0x91, 0x01, 0x02, 0x80, 0x52, + 0x22, 0x00, 0x82, 0x52, 0xe0, 0x03, 0x01, 0x2a, 0x11, 0x90, 0xff, 0x17, + 0xe0, 0x03, 0x00, 0x2a, 0xc2, 0x00, 0x00, 0xb0, 0x42, 0xa0, 0x26, 0x91, + 0xfd, 0x7b, 0xbe, 0xa9, 0xc1, 0x00, 0x00, 0xb0, 0x21, 0x20, 0x27, 0x91, + 0xfd, 0x03, 0x00, 0x91, 0x42, 0x78, 0x60, 0xf8, 0x43, 0x04, 0x40, 0xb9, + 0xf3, 0x0b, 0x00, 0xf9, 0x33, 0x78, 0x60, 0xb8, 0xe1, 0x03, 0x23, 0x2a, + 0x21, 0x00, 0x00, 0x12, 0x21, 0x00, 0x03, 0x4a, 0x41, 0x04, 0x00, 0xb9, + 0xe0, 0x03, 0x13, 0x2a, 0x28, 0x02, 0x00, 0x94, 0xe0, 0x03, 0x13, 0x2a, + 0x92, 0x01, 0x00, 0x94, 0x80, 0x00, 0x00, 0x35, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x0b, 0x40, 0xf9, + 0xe2, 0x03, 0x00, 0x2a, 0xfd, 0x7b, 0xc2, 0xa8, 0xc3, 0x00, 0x00, 0xb0, + 0x63, 0xa0, 0x24, 0x91, 0x41, 0x06, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xf2, 0x8f, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x0c, 0x00, 0x71, + 0xe9, 0x00, 0x00, 0x54, 0xc3, 0x00, 0x00, 0xb0, 0x63, 0x40, 0x24, 0x91, + 0x01, 0x02, 0x80, 0x52, 0x22, 0x00, 0x82, 0x52, 0xe0, 0x03, 0x01, 0x2a, + 0xe9, 0x8f, 0xff, 0x17, 0xfd, 0x7b, 0xbe, 0xa9, 0xe0, 0x03, 0x00, 0x2a, + 0xc2, 0x00, 0x00, 0xb0, 0x42, 0xa0, 0x26, 0x91, 0xc1, 0x00, 0x00, 0xb0, + 0x21, 0x20, 0x27, 0x91, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0x53, 0x78, 0x60, 0xf8, 0x20, 0x78, 0x60, 0xb8, 0xae, 0x01, 0x00, 0x94, + 0x60, 0x06, 0x40, 0xb9, 0x00, 0x78, 0x1f, 0x12, 0x60, 0x06, 0x00, 0xb9, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0x0c, 0x00, 0x71, 0xe9, 0x00, 0x00, 0x54, 0xc3, 0x00, 0x00, 0xb0, + 0x63, 0x40, 0x24, 0x91, 0x01, 0x02, 0x80, 0x52, 0x22, 0x00, 0x82, 0x52, + 0xe0, 0x03, 0x01, 0x2a, 0xcd, 0x8f, 0xff, 0x17, 0xfd, 0x7b, 0xbb, 0xa9, + 0xc3, 0x00, 0x00, 0xb0, 0x63, 0x20, 0x27, 0x91, 0xfd, 0x03, 0x00, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0xf6, 0x03, 0x00, 0x2a, 0xf5, 0x03, 0x02, 0x2a, + 0xc2, 0x00, 0x00, 0xb0, 0x42, 0xa0, 0x26, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x01, 0x2a, 0xc1, 0x00, 0x00, 0xb0, 0x21, 0xe0, 0x25, 0x91, + 0xf7, 0x63, 0x03, 0xa9, 0x77, 0x78, 0x76, 0xb8, 0xf4, 0x03, 0x00, 0x2a, + 0xf9, 0x23, 0x00, 0xf9, 0x39, 0x78, 0x76, 0xb8, 0x58, 0x78, 0x76, 0xf8, + 0xc9, 0xff, 0xff, 0x97, 0xe0, 0x03, 0x17, 0x2a, 0xdf, 0x01, 0x00, 0x94, + 0x60, 0x02, 0x63, 0x1e, 0xc0, 0x00, 0x00, 0xb0, 0x02, 0xb8, 0x44, 0xfd, + 0xa1, 0x02, 0x63, 0x1e, 0xc3, 0x00, 0x00, 0xb0, 0x63, 0x20, 0x26, 0x91, + 0xe1, 0x03, 0x19, 0x2a, 0xe0, 0x03, 0x17, 0x2a, 0x00, 0x08, 0x62, 0x1e, + 0x02, 0x02, 0x80, 0x52, 0x63, 0x78, 0x76, 0xf8, 0x00, 0x08, 0x61, 0x1e, + 0x00, 0x40, 0x67, 0x1e, 0x04, 0x00, 0x78, 0x9e, 0x04, 0x03, 0x00, 0xb9, + 0x93, 0x00, 0x00, 0x94, 0x00, 0x01, 0x00, 0x35, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, 0x87, 0xff, 0xff, 0x17, + 0xf3, 0x53, 0x41, 0xa9, 0xe2, 0x03, 0x00, 0x2a, 0xf5, 0x5b, 0x42, 0xa9, + 0xc3, 0x00, 0x00, 0xb0, 0x63, 0x20, 0x25, 0x91, 0x41, 0x06, 0x80, 0x52, + 0xf7, 0x63, 0x43, 0xa9, 0x00, 0x02, 0x80, 0x52, 0xf9, 0x23, 0x40, 0xf9, + 0xfd, 0x7b, 0xc5, 0xa8, 0x94, 0x8f, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x0c, 0x00, 0x71, + 0x08, 0x02, 0x00, 0x54, 0xc1, 0x00, 0x00, 0xb0, 0x21, 0xa0, 0x26, 0x91, + 0x20, 0x58, 0x60, 0xf8, 0x01, 0x04, 0x40, 0xb9, 0x21, 0x78, 0x1e, 0x12, + 0x01, 0x04, 0x00, 0xb9, 0x02, 0x04, 0x40, 0xb9, 0xe1, 0x03, 0x22, 0x2a, + 0x21, 0x00, 0x1f, 0x12, 0x21, 0x00, 0x02, 0x4a, 0x01, 0x04, 0x00, 0xb9, + 0x01, 0x04, 0x40, 0xb9, 0x21, 0x78, 0x1e, 0x12, 0x01, 0x04, 0x00, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0x01, 0x02, 0x80, 0x52, 0xc3, 0x00, 0x00, 0xb0, + 0x63, 0x40, 0x24, 0x91, 0xe0, 0x03, 0x01, 0x2a, 0x22, 0x00, 0x82, 0x52, + 0x7a, 0x8f, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0x13, 0xcc, 0x38, 0xd5, + 0x9f, 0x3f, 0x03, 0xd5, 0xe7, 0x67, 0xff, 0x97, 0xa2, 0x40, 0x86, 0x52, + 0x21, 0x00, 0x80, 0x52, 0x68, 0xfc, 0xff, 0x97, 0xe4, 0x03, 0x13, 0xaa, + 0xc3, 0x00, 0x00, 0xd0, 0xf3, 0x0b, 0x40, 0xf9, 0x63, 0xe0, 0x0c, 0x91, + 0xfd, 0x7b, 0xc2, 0xa8, 0xa2, 0x40, 0x86, 0x52, 0x41, 0x06, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x67, 0x8f, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0x2a, 0xf4, 0x03, 0x02, 0x2a, + 0x20, 0x5c, 0x18, 0x53, 0xd6, 0x05, 0x00, 0x94, 0x1f, 0x04, 0x00, 0x31, + 0x80, 0x00, 0x00, 0x54, 0xe2, 0x03, 0x14, 0x2a, 0xe1, 0x03, 0x13, 0x2a, + 0x05, 0x06, 0x00, 0x94, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x00, 0x2a, + 0xc2, 0x00, 0x00, 0xb0, 0x42, 0x60, 0x27, 0x91, 0x00, 0x04, 0x00, 0x8b, + 0x00, 0x00, 0x00, 0x8b, 0x43, 0x68, 0x60, 0x38, 0x63, 0x04, 0x00, 0x72, + 0x80, 0x01, 0x00, 0x54, 0x40, 0x00, 0x00, 0x8b, 0x7f, 0x08, 0x00, 0x71, + 0x02, 0x46, 0xb6, 0xd2, 0x24, 0x04, 0x00, 0x12, 0x21, 0x1c, 0x00, 0x12, + 0x03, 0x0c, 0x40, 0x39, 0x21, 0x10, 0x84, 0x1a, 0x40, 0x78, 0x63, 0xb8, + 0x00, 0x4c, 0x14, 0x12, 0x01, 0x00, 0x01, 0x2a, 0x41, 0x78, 0x23, 0xb8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x00, 0x2a, 0xc1, 0x00, 0x00, 0xb0, + 0x21, 0x60, 0x27, 0x91, 0x00, 0x04, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x8b, + 0x22, 0x68, 0x60, 0x38, 0x42, 0x04, 0x00, 0x72, 0x60, 0x01, 0x00, 0x54, + 0x20, 0x00, 0x00, 0x8b, 0x03, 0x46, 0xb6, 0xd2, 0x5f, 0x08, 0x00, 0x71, + 0x61, 0x00, 0x80, 0x52, 0xe2, 0x1f, 0x80, 0x52, 0x21, 0x00, 0x82, 0x1a, + 0x00, 0x0c, 0x40, 0x39, 0x60, 0x78, 0x60, 0xb8, 0x00, 0x00, 0x01, 0x0a, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0x13, 0xc8, 0x38, 0xd5, 0x9f, 0x3f, 0x03, 0xd5, 0x60, 0xf2, 0x0f, 0xd1, + 0x1f, 0x0c, 0x00, 0xf1, 0x68, 0x00, 0x00, 0x54, 0x13, 0xcc, 0x38, 0xd5, + 0x9f, 0x3f, 0x03, 0xd5, 0x96, 0x67, 0xff, 0x97, 0xc2, 0x40, 0x86, 0x52, + 0x21, 0x00, 0x80, 0x52, 0x17, 0xfc, 0xff, 0x97, 0xe4, 0x03, 0x13, 0x2a, + 0xc3, 0x00, 0x00, 0xd0, 0xf3, 0x0b, 0x40, 0xf9, 0x63, 0x60, 0x0d, 0x91, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc2, 0x40, 0x86, 0x52, 0x41, 0x06, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x16, 0x8f, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0x1f, 0xc4, 0x05, 0x71, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xa8, 0x04, 0x00, 0x54, 0x3f, 0x0c, 0x00, 0x71, + 0xc8, 0x03, 0x00, 0x54, 0xf4, 0x03, 0x02, 0x2a, 0x5f, 0xbc, 0x03, 0x71, + 0xe8, 0x04, 0x00, 0x54, 0xc3, 0x05, 0x00, 0xb4, 0xa5, 0x0f, 0x00, 0x90, + 0xa5, 0xc0, 0x3e, 0x91, 0xf3, 0x03, 0x00, 0x2a, 0xe7, 0x03, 0x00, 0x2a, + 0xa6, 0x48, 0xe0, 0x38, 0xc6, 0x03, 0xf8, 0x37, 0xe6, 0x04, 0x07, 0x8b, + 0xf5, 0x5b, 0x02, 0xa9, 0xd5, 0x00, 0x06, 0x8b, 0xd6, 0x00, 0x00, 0xb0, + 0xd6, 0x62, 0x27, 0x91, 0xc8, 0x02, 0x15, 0x8b, 0xa6, 0x0f, 0x00, 0x90, + 0xc6, 0x80, 0x10, 0x91, 0xa1, 0x48, 0x20, 0x38, 0x05, 0x15, 0x40, 0x39, + 0xc3, 0x78, 0x27, 0xf8, 0xbf, 0x10, 0x00, 0x71, 0xa0, 0x03, 0x00, 0x54, + 0xbf, 0x0c, 0x00, 0x71, 0xf5, 0x5b, 0x42, 0xa9, 0xa8, 0x02, 0x00, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0x8d, 0xff, 0xff, 0x17, + 0x54, 0x40, 0x86, 0x52, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x34, 0x40, 0x86, 0x52, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x14, 0x41, 0x86, 0x52, 0xf6, 0xff, 0xff, 0x17, + 0x74, 0x40, 0x86, 0x52, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0x79, 0xff, 0xff, 0x17, 0x94, 0x40, 0x86, 0x52, + 0xec, 0xff, 0xff, 0x17, 0x02, 0x00, 0x80, 0x52, 0x21, 0x5c, 0x18, 0x53, + 0xd4, 0x05, 0x00, 0x94, 0xe0, 0x03, 0x13, 0x2a, 0xe1, 0x03, 0x14, 0x2a, + 0xc9, 0x05, 0x00, 0x94, 0xc0, 0x6a, 0x75, 0x38, 0x16, 0x00, 0x80, 0x52, + 0x60, 0x00, 0x20, 0x37, 0x00, 0x14, 0x45, 0xd3, 0x16, 0x78, 0x1f, 0x53, + 0xd5, 0x02, 0x00, 0xd0, 0xb5, 0x42, 0x01, 0x91, 0xe0, 0x03, 0x15, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0x47, 0x6b, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0x20, 0x01, 0x00, 0x35, 0xe1, 0x03, 0x16, 0x2a, 0xe0, 0x03, 0x13, 0x2a, + 0xca, 0x05, 0x00, 0x94, 0xe0, 0x03, 0x15, 0xaa, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0x31, 0x6b, 0xff, 0x17, + 0xe2, 0x03, 0x00, 0x2a, 0xc4, 0x00, 0x00, 0xd0, 0xc3, 0x00, 0x00, 0xd0, + 0x84, 0x80, 0x0e, 0x91, 0x63, 0xc0, 0x0d, 0x91, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0xb9, 0x8e, 0xff, 0x97, 0xf5, 0x5b, 0x42, 0xa9, + 0xc8, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xc4, 0x05, 0x71, 0xa8, 0x04, 0x00, 0x54, 0x3f, 0x0c, 0x00, 0x71, + 0x28, 0x04, 0x00, 0x54, 0xfd, 0x7b, 0xbd, 0xa9, 0x5f, 0xbc, 0x03, 0x71, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x02, 0x2a, + 0x68, 0x04, 0x00, 0x54, 0x23, 0x05, 0x00, 0xb4, 0xa5, 0x0f, 0x00, 0x90, + 0xa5, 0xc0, 0x3e, 0x91, 0xf3, 0x03, 0x00, 0x2a, 0xe7, 0x03, 0x00, 0x2a, + 0xa6, 0x48, 0xe0, 0x38, 0x06, 0x03, 0xf8, 0x37, 0xe6, 0x04, 0x07, 0x8b, + 0xf5, 0x5b, 0x02, 0xa9, 0xd5, 0x00, 0x06, 0x8b, 0xd6, 0x00, 0x00, 0xb0, + 0xd6, 0x62, 0x27, 0x91, 0xc8, 0x02, 0x15, 0x8b, 0xa6, 0x0f, 0x00, 0x90, + 0xc6, 0x80, 0x10, 0x91, 0xa1, 0x48, 0x20, 0x38, 0x05, 0x15, 0x40, 0x39, + 0xc3, 0x78, 0x27, 0xf8, 0xbf, 0x10, 0x00, 0x71, 0x00, 0x03, 0x00, 0x54, + 0xbf, 0x0c, 0x00, 0x71, 0xf5, 0x5b, 0x42, 0xa9, 0x08, 0x02, 0x00, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0x2d, 0xff, 0xff, 0x17, + 0x40, 0x40, 0x86, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x40, 0x86, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x41, 0x86, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x40, 0x86, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0x1e, 0xff, 0xff, 0x17, + 0x80, 0x40, 0x86, 0x52, 0xf5, 0xff, 0xff, 0x17, 0x02, 0x00, 0x80, 0x52, + 0x21, 0x5c, 0x18, 0x53, 0x79, 0x05, 0x00, 0x94, 0xe1, 0x03, 0x14, 0x2a, + 0xe0, 0x03, 0x13, 0x2a, 0x6e, 0x05, 0x00, 0x94, 0xc0, 0x6a, 0x75, 0x38, + 0x01, 0x00, 0x80, 0x52, 0x60, 0x00, 0x20, 0x37, 0x00, 0x14, 0x45, 0xd3, + 0x01, 0x78, 0x1f, 0x53, 0xe0, 0x03, 0x13, 0x2a, 0x77, 0x05, 0x00, 0x94, + 0x00, 0x00, 0x80, 0x52, 0xf5, 0x5b, 0x42, 0xa9, 0xe5, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xc4, 0x05, 0x71, 0x48, 0x06, 0x00, 0x54, 0xe1, 0x03, 0x00, 0x2a, + 0xa4, 0x0f, 0x00, 0x90, 0x84, 0x80, 0x10, 0x91, 0xfd, 0x7b, 0xbe, 0xa9, + 0x03, 0x00, 0x00, 0x90, 0x63, 0x80, 0x2e, 0x91, 0xfd, 0x03, 0x00, 0x91, + 0x84, 0x78, 0x61, 0xf8, 0xf3, 0x53, 0x01, 0xa9, 0xe2, 0x40, 0x86, 0x52, + 0x9f, 0x00, 0x00, 0xf1, 0xf3, 0x03, 0x00, 0x2a, 0x84, 0x10, 0x43, 0xfa, + 0x60, 0x03, 0x00, 0x54, 0x21, 0x04, 0x01, 0x8b, 0xc2, 0x00, 0x00, 0x90, + 0x42, 0x60, 0x27, 0x91, 0x41, 0x04, 0x01, 0x8b, 0x21, 0x14, 0x40, 0x39, + 0x3f, 0x10, 0x00, 0x71, 0x00, 0x04, 0x00, 0x54, 0x94, 0x0f, 0x00, 0xf0, + 0x94, 0xc2, 0x3e, 0x91, 0x42, 0x40, 0x86, 0x52, 0x81, 0x4a, 0x60, 0x38, + 0x20, 0x18, 0x00, 0x12, 0x1f, 0xfc, 0x01, 0x71, 0xa0, 0x01, 0x00, 0x54, + 0x3f, 0x10, 0x1e, 0x72, 0xe1, 0x01, 0x00, 0x54, 0x00, 0x5c, 0x18, 0x53, + 0xc3, 0x04, 0x00, 0x94, 0x1f, 0x04, 0x00, 0x31, 0x60, 0x01, 0x00, 0x54, + 0xe1, 0x03, 0x13, 0x2a, 0xdb, 0x04, 0x00, 0x94, 0x80, 0x4a, 0x73, 0x38, + 0x02, 0x00, 0x80, 0x52, 0x00, 0x60, 0x19, 0x32, 0x80, 0x4a, 0x33, 0x38, + 0xe0, 0x03, 0x02, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x22, 0x40, 0x86, 0x52, 0xe0, 0x03, 0x02, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x22, 0x40, 0x86, 0x52, 0xe0, 0x03, 0x02, 0x2a, 0xc0, 0x03, 0x5f, 0xd6, + 0x94, 0x0f, 0x00, 0xf0, 0x94, 0xc2, 0x3e, 0x91, 0x18, 0x05, 0x00, 0x94, + 0xed, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0x1f, 0xc4, 0x05, 0x71, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xc8, 0x05, 0x00, 0x54, 0xe1, 0x03, 0x00, 0x2a, + 0x83, 0x0f, 0x00, 0xf0, 0x63, 0x80, 0x10, 0x91, 0xe2, 0xff, 0xff, 0xf0, + 0x42, 0x80, 0x2e, 0x91, 0xf3, 0x03, 0x00, 0x2a, 0xf4, 0x40, 0x86, 0x52, + 0x63, 0x78, 0x61, 0xf8, 0x7f, 0x00, 0x00, 0xf1, 0x64, 0x10, 0x42, 0xfa, + 0xc0, 0x03, 0x00, 0x54, 0x21, 0x04, 0x01, 0x8b, 0xc2, 0x00, 0x00, 0x90, + 0x42, 0x60, 0x27, 0x91, 0xf5, 0x13, 0x00, 0xf9, 0x41, 0x04, 0x01, 0x8b, + 0x21, 0x14, 0x40, 0x39, 0x3f, 0x10, 0x00, 0x71, 0x00, 0x04, 0x00, 0x54, + 0x95, 0x0f, 0x00, 0xf0, 0xb5, 0xc2, 0x3e, 0x91, 0x54, 0x40, 0x86, 0x52, + 0xa1, 0x4a, 0x60, 0x38, 0x20, 0x18, 0x00, 0x12, 0x1f, 0xfc, 0x01, 0x71, + 0xf4, 0x13, 0x94, 0x1a, 0x3f, 0x10, 0x1e, 0x72, 0x21, 0x02, 0x00, 0x54, + 0x00, 0x5c, 0x18, 0x53, 0x86, 0x04, 0x00, 0x94, 0x1f, 0x04, 0x00, 0x31, + 0xa0, 0x01, 0x00, 0x54, 0xe1, 0x03, 0x13, 0x2a, 0xaa, 0x04, 0x00, 0x94, + 0x94, 0x02, 0x00, 0x35, 0xa0, 0x4a, 0x73, 0x38, 0x14, 0x00, 0x80, 0x52, + 0x00, 0x18, 0x00, 0x12, 0xa0, 0x4a, 0x33, 0x38, 0xf5, 0x13, 0x40, 0xf9, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf5, 0x13, 0x40, 0xf9, 0x34, 0x40, 0x86, 0x52, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x95, 0x0f, 0x00, 0xf0, 0xb5, 0xc2, 0x3e, 0x91, + 0xe3, 0x04, 0x00, 0x94, 0xee, 0xff, 0xff, 0x17, 0xf5, 0x13, 0x40, 0xf9, + 0xf1, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc4, 0x05, 0x71, 0x68, 0x02, 0x00, 0x54, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x03, 0x00, 0x2a, 0x13, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x13, 0x2a, + 0x73, 0x02, 0x04, 0x11, 0x5f, 0x04, 0x00, 0x94, 0x1f, 0x04, 0x00, 0x31, + 0x60, 0x00, 0x00, 0x54, 0xe1, 0x03, 0x14, 0x2a, 0x77, 0x04, 0x00, 0x94, + 0x7f, 0x02, 0x10, 0x71, 0x01, 0xff, 0xff, 0x54, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0x40, 0x86, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc4, 0x05, 0x71, 0x49, 0x00, 0x00, 0x54, + 0xc0, 0x03, 0x5f, 0xd6, 0xe1, 0x03, 0x00, 0x2a, 0xc2, 0x00, 0x00, 0x90, + 0x42, 0x60, 0x27, 0x91, 0xfd, 0x7b, 0xbe, 0xa9, 0x21, 0x04, 0x01, 0x8b, + 0xfd, 0x03, 0x00, 0x91, 0x41, 0x04, 0x01, 0x8b, 0xf3, 0x0b, 0x00, 0xf9, + 0xf3, 0x03, 0x00, 0x2a, 0x21, 0x14, 0x40, 0x39, 0x3f, 0x10, 0x00, 0x71, + 0x00, 0x02, 0x00, 0x54, 0x80, 0x0f, 0x00, 0xf0, 0x00, 0xc0, 0x3e, 0x91, + 0x01, 0x48, 0x73, 0x38, 0x20, 0x18, 0x00, 0x12, 0x1f, 0xfc, 0x01, 0x71, + 0xe0, 0x00, 0x00, 0x54, 0x3f, 0x10, 0x1e, 0x72, 0xa1, 0x00, 0x00, 0x54, + 0x00, 0x5c, 0x18, 0x53, 0x38, 0x04, 0x00, 0x94, 0x1f, 0x04, 0x00, 0x31, + 0xe1, 0x00, 0x00, 0x54, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xcc, 0x04, 0x00, 0x14, 0xe1, 0x03, 0x13, 0x2a, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0x6c, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x03, 0x00, 0x2a, + 0x21, 0x1c, 0x00, 0x12, 0x5f, 0x3c, 0x00, 0x71, 0x20, 0x40, 0x86, 0x52, + 0x68, 0x01, 0x00, 0x54, 0x3f, 0x0c, 0x00, 0x71, 0x40, 0x40, 0x86, 0x52, + 0x08, 0x01, 0x00, 0x54, 0x42, 0x7c, 0x68, 0xd3, 0x21, 0x1c, 0x70, 0xd3, + 0x21, 0x00, 0x02, 0xaa, 0x21, 0x00, 0x40, 0xb2, 0xa1, 0xcb, 0x18, 0xd5, + 0xdf, 0x3f, 0x03, 0xd5, 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0xf8, 0x6a, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x90, 0xa7, 0x60, 0x27, 0x91, + 0xe5, 0x03, 0x00, 0x2a, 0xa1, 0x04, 0x05, 0x8b, 0x21, 0x00, 0x01, 0x8b, + 0xe6, 0x68, 0x61, 0x38, 0xdf, 0xfc, 0x03, 0x71, 0x60, 0x08, 0x00, 0x54, + 0xfd, 0x7b, 0xbf, 0xa9, 0xbf, 0xc4, 0x05, 0x71, 0xc8, 0x04, 0x00, 0x12, + 0xfd, 0x03, 0x00, 0x91, 0x04, 0x99, 0x40, 0x7a, 0x81, 0x0a, 0x00, 0x54, + 0x26, 0x07, 0x20, 0x36, 0x1f, 0x05, 0x00, 0x71, 0xe0, 0x0c, 0x00, 0x54, + 0x1f, 0x09, 0x00, 0x71, 0x64, 0x00, 0x80, 0x52, 0x60, 0x00, 0x00, 0x54, + 0x24, 0x00, 0x80, 0x52, 0xe8, 0x03, 0x04, 0x2a, 0xa5, 0x04, 0x05, 0x8b, + 0x00, 0x04, 0x80, 0x52, 0xe5, 0x04, 0x05, 0x8b, 0xa1, 0x08, 0x40, 0x39, + 0xa2, 0x04, 0x40, 0x39, 0x00, 0x00, 0x01, 0x4b, 0x1f, 0x00, 0x08, 0x6b, + 0xe3, 0x05, 0x00, 0x54, 0x40, 0x1c, 0x7e, 0xd3, 0x81, 0x20, 0xc1, 0x1a, + 0x84, 0x05, 0x80, 0xd2, 0x04, 0x48, 0xb6, 0xf2, 0x03, 0x00, 0x04, 0x8b, + 0x46, 0x08, 0x28, 0x37, 0x28, 0x00, 0x80, 0x52, 0x04, 0x00, 0x80, 0x52, + 0x62, 0x00, 0x40, 0xb9, 0x42, 0x00, 0x01, 0x2a, 0x62, 0x00, 0x00, 0xb9, + 0xe4, 0x07, 0x00, 0x34, 0x02, 0x10, 0x00, 0x91, 0x85, 0x05, 0x80, 0xd2, + 0x05, 0x48, 0xb6, 0xf2, 0x43, 0x68, 0x65, 0xb8, 0x63, 0x00, 0x04, 0x2a, + 0x43, 0x68, 0x25, 0xb8, 0xc6, 0x04, 0x1e, 0x12, 0x85, 0x10, 0x80, 0xd2, + 0x05, 0x48, 0xb6, 0xf2, 0x03, 0x0b, 0x80, 0xd2, 0x03, 0x48, 0xb6, 0xf2, + 0xdf, 0x10, 0x00, 0x71, 0x07, 0x00, 0x05, 0x8b, 0x61, 0x09, 0x00, 0x54, + 0x06, 0x68, 0x63, 0xb8, 0xe8, 0x03, 0x08, 0x4b, 0xc6, 0x00, 0x21, 0x0a, + 0x06, 0x68, 0x23, 0xb8, 0x46, 0x68, 0x63, 0xb8, 0x08, 0x01, 0x06, 0x0a, + 0x48, 0x68, 0x23, 0xb8, 0x03, 0x68, 0x65, 0xb8, 0x61, 0x00, 0x01, 0x2a, + 0x01, 0x68, 0x25, 0xb8, 0x81, 0x10, 0x80, 0xd2, 0x01, 0x48, 0xb6, 0xf2, + 0x40, 0x68, 0x61, 0xb8, 0x04, 0x00, 0x04, 0x2a, 0x44, 0x68, 0x21, 0xb8, + 0x00, 0x00, 0x80, 0x52, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x80, 0x00, 0x51, + 0x23, 0x00, 0x80, 0x52, 0x08, 0x00, 0x08, 0x0b, 0x40, 0x1c, 0x7e, 0xd3, + 0x81, 0x20, 0xc1, 0x1a, 0x85, 0x05, 0x80, 0xd2, 0x05, 0x48, 0xb6, 0xf2, + 0x68, 0x20, 0xc8, 0x1a, 0x03, 0x00, 0x05, 0x8b, 0x04, 0x05, 0x00, 0x51, + 0x06, 0xfa, 0x2f, 0x36, 0xa3, 0x78, 0x62, 0xb8, 0x63, 0x00, 0x21, 0x0a, + 0xa3, 0x78, 0x22, 0xb8, 0xc4, 0x01, 0x00, 0x34, 0x02, 0x10, 0x00, 0x91, + 0xe3, 0x03, 0x08, 0x4b, 0x47, 0x68, 0x65, 0xb8, 0x63, 0x00, 0x07, 0x0a, + 0x43, 0x68, 0x25, 0xb8, 0xd0, 0xff, 0xff, 0x17, 0x01, 0x00, 0x80, 0x52, + 0xe6, 0xfd, 0xff, 0x97, 0x86, 0xfc, 0x27, 0x36, 0xab, 0xff, 0xff, 0x17, + 0x83, 0x78, 0x62, 0xb8, 0x63, 0x00, 0x21, 0x0a, 0x83, 0x78, 0x22, 0xb8, + 0xc6, 0x04, 0x1e, 0x12, 0x82, 0x10, 0x80, 0xd2, 0x02, 0x48, 0xb6, 0xf2, + 0x03, 0x0b, 0x80, 0xd2, 0x03, 0x48, 0xb6, 0xf2, 0xdf, 0x10, 0x00, 0x71, + 0x04, 0x00, 0x02, 0x8b, 0x41, 0x04, 0x00, 0x54, 0x04, 0x68, 0x63, 0xb8, + 0x84, 0x00, 0x21, 0x0a, 0x04, 0x68, 0x23, 0xb8, 0x03, 0x68, 0x62, 0xb8, + 0x61, 0x00, 0x01, 0x2a, 0x01, 0x68, 0x22, 0xb8, 0xd1, 0xff, 0xff, 0x17, + 0xa5, 0x04, 0x05, 0x8b, 0x00, 0x04, 0x80, 0x52, 0x08, 0x01, 0x80, 0x52, + 0xe4, 0x1f, 0x80, 0x52, 0xe5, 0x04, 0x05, 0x8b, 0xa1, 0x08, 0x40, 0x39, + 0xa2, 0x04, 0x40, 0x39, 0x00, 0x00, 0x01, 0x4b, 0x1f, 0x00, 0x08, 0x6b, + 0xc2, 0xf3, 0xff, 0x54, 0xcb, 0xff, 0xff, 0x17, 0x09, 0x68, 0x63, 0xb8, + 0x29, 0x01, 0x01, 0x2a, 0x09, 0x68, 0x23, 0xb8, 0x40, 0x68, 0x63, 0xb8, + 0x00, 0x00, 0x04, 0x2a, 0x40, 0x68, 0x23, 0xb8, 0x26, 0x02, 0x00, 0x35, + 0xe0, 0x00, 0x40, 0xb9, 0xe8, 0x03, 0x08, 0x4b, 0x01, 0x00, 0x21, 0x0a, + 0xe1, 0x00, 0x00, 0xb9, 0x40, 0x68, 0x65, 0xb8, 0x08, 0x01, 0x00, 0x0a, + 0x48, 0x68, 0x25, 0xb8, 0xb7, 0xff, 0xff, 0x17, 0x02, 0x68, 0x63, 0xb8, + 0x42, 0x00, 0x01, 0x2a, 0x02, 0x68, 0x23, 0xb8, 0x26, 0x01, 0x00, 0x35, + 0x80, 0x00, 0x40, 0xb9, 0x01, 0x00, 0x21, 0x0a, 0x81, 0x00, 0x00, 0xb9, + 0xaf, 0xff, 0xff, 0x17, 0xe0, 0x00, 0x40, 0xb9, 0x01, 0x00, 0x01, 0x2a, + 0xe1, 0x00, 0x00, 0xb9, 0xa6, 0xff, 0xff, 0x17, 0x80, 0x00, 0x40, 0xb9, + 0x01, 0x00, 0x01, 0x2a, 0x81, 0x00, 0x00, 0xb9, 0xa7, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0xd3, 0x02, 0x00, 0xb0, 0x60, 0xc2, 0x42, 0x39, 0x60, 0x06, 0x00, 0x34, + 0x8c, 0x0f, 0x00, 0xf0, 0x8c, 0x81, 0x10, 0x91, 0xeb, 0xff, 0xff, 0xf0, + 0x6b, 0x81, 0x2e, 0x91, 0x20, 0x00, 0x80, 0x52, 0x0a, 0x00, 0x80, 0xd2, + 0x60, 0xc2, 0x02, 0x39, 0x1f, 0x20, 0x03, 0xd5, 0xe0, 0x03, 0x0a, 0x2a, + 0x4d, 0xff, 0xff, 0x97, 0x8b, 0x79, 0x2a, 0xf8, 0x4a, 0x05, 0x00, 0x91, + 0x5f, 0xc9, 0x05, 0xf1, 0x61, 0xff, 0xff, 0x54, 0xc0, 0x00, 0x00, 0xb0, + 0x00, 0x20, 0x0a, 0x91, 0x83, 0x05, 0x80, 0xd2, 0x03, 0x48, 0xb6, 0xf2, + 0x06, 0xb8, 0x02, 0x91, 0x25, 0x00, 0x80, 0x52, 0x07, 0x00, 0x00, 0x14, + 0x64, 0x78, 0x62, 0xb8, 0x00, 0x0c, 0x00, 0x91, 0xdf, 0x00, 0x00, 0xeb, + 0x81, 0x00, 0x21, 0x0a, 0x61, 0x78, 0x22, 0xb8, 0x80, 0x01, 0x00, 0x54, + 0x04, 0x00, 0x40, 0x39, 0x01, 0x08, 0x40, 0x39, 0x02, 0x04, 0x40, 0x39, + 0xa1, 0x20, 0xc1, 0x1a, 0xc4, 0xfe, 0x2f, 0x37, 0x64, 0x78, 0x62, 0xb8, + 0x00, 0x0c, 0x00, 0x91, 0xdf, 0x00, 0x00, 0xeb, 0x21, 0x00, 0x04, 0x2a, + 0x61, 0x78, 0x22, 0xb8, 0xc1, 0xfe, 0xff, 0x54, 0x20, 0x00, 0x80, 0xd2, + 0xe0, 0xcc, 0x18, 0xd5, 0xdf, 0x3f, 0x03, 0xd5, 0x42, 0x2e, 0x80, 0xd2, + 0xe1, 0x0f, 0x80, 0x52, 0x80, 0x0f, 0x00, 0xf0, 0x00, 0xc0, 0x3e, 0x91, + 0x75, 0x4d, 0x00, 0x94, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xc1, 0x00, 0x00, 0xb0, + 0xc0, 0x02, 0x00, 0xb0, 0x21, 0x20, 0x0e, 0x91, 0x00, 0x40, 0x01, 0x91, + 0x10, 0x69, 0xff, 0x97, 0x20, 0xf9, 0xff, 0x34, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc4, 0x05, 0x71, + 0xa8, 0x06, 0x00, 0x54, 0xe4, 0x03, 0x00, 0x2a, 0xc1, 0x00, 0x00, 0x90, + 0x26, 0x60, 0x27, 0x91, 0x02, 0x00, 0x80, 0x52, 0x83, 0x04, 0x04, 0x8b, + 0x63, 0x00, 0x03, 0x8b, 0xc3, 0x68, 0x63, 0x38, 0xc3, 0x05, 0x20, 0x36, + 0xfd, 0x7b, 0xbf, 0xa9, 0x65, 0x04, 0x00, 0x12, 0xbf, 0x04, 0x00, 0x71, + 0xfd, 0x03, 0x00, 0x91, 0x60, 0x05, 0x00, 0x54, 0xbf, 0x08, 0x00, 0x71, + 0xa0, 0x06, 0x00, 0x54, 0x22, 0x00, 0x80, 0x52, 0xe3, 0x03, 0x02, 0x2a, + 0xe0, 0x03, 0x02, 0x2a, 0x81, 0x04, 0x04, 0x8b, 0x05, 0x04, 0x80, 0x52, + 0x87, 0x1b, 0x80, 0xd2, 0x07, 0x48, 0xb6, 0xf2, 0xc1, 0x04, 0x01, 0x8b, + 0x24, 0x08, 0x40, 0x39, 0x26, 0x04, 0x40, 0x39, 0xa5, 0x00, 0x04, 0x4b, + 0x7f, 0x00, 0x05, 0x6b, 0x42, 0x20, 0xc4, 0x1a, 0xc8, 0xf4, 0x7e, 0xd3, + 0x01, 0x20, 0xc4, 0x1a, 0xa9, 0x03, 0x00, 0x54, 0xea, 0x78, 0x66, 0xb8, + 0x21, 0x00, 0x02, 0x0a, 0x89, 0x80, 0x00, 0x51, 0x22, 0x00, 0x0a, 0x0a, + 0xe2, 0x78, 0x26, 0xb8, 0x29, 0x01, 0x03, 0x2b, 0x42, 0x24, 0xc4, 0x1a, + 0x60, 0x01, 0x00, 0x54, 0x01, 0x11, 0x00, 0x91, 0x00, 0x24, 0xc5, 0x1a, + 0x03, 0x00, 0x80, 0x12, 0x63, 0x20, 0xc9, 0x1a, 0x24, 0x68, 0x67, 0xb8, + 0x00, 0x00, 0x04, 0x0a, 0x00, 0x00, 0x23, 0x0a, 0x20, 0x68, 0x27, 0xb8, + 0x00, 0x20, 0xc5, 0x1a, 0x02, 0x00, 0x02, 0x2a, 0xe0, 0x03, 0x02, 0x2a, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x02, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x02, 0x2a, 0xc0, 0x03, 0x5f, 0xd6, 0x3b, 0xfd, 0xff, 0x97, + 0xe2, 0x1f, 0x80, 0x52, 0x03, 0x01, 0x80, 0x52, 0xd8, 0xff, 0xff, 0x17, + 0xe0, 0x78, 0x66, 0xb8, 0x21, 0x00, 0x02, 0x0a, 0x22, 0x00, 0x00, 0x0a, + 0xe2, 0x78, 0x26, 0xb8, 0x42, 0x24, 0xc4, 0x1a, 0xe0, 0x03, 0x02, 0x2a, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x2f, 0xfd, 0xff, 0x97, + 0xe3, 0x03, 0x05, 0x2a, 0x62, 0x00, 0x80, 0x52, 0xcc, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0x13, 0xcc, 0x38, 0xd5, 0x9f, 0x3f, 0x03, 0xd5, 0xe0, 0x03, 0x13, 0x2a, + 0xae, 0xff, 0xff, 0x97, 0x7f, 0xc6, 0x05, 0x71, 0x89, 0x00, 0x00, 0x54, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x81, 0x0f, 0x00, 0xf0, 0x21, 0x80, 0x10, 0x91, 0x21, 0x58, 0x73, 0xf8, + 0x01, 0x01, 0x00, 0xb4, 0x20, 0x00, 0x3f, 0xd6, 0x73, 0x7e, 0x40, 0x92, + 0x33, 0xcc, 0x18, 0xd5, 0xdf, 0x3f, 0x03, 0xd5, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xc5, 0x64, 0xff, 0x97, + 0xa2, 0x40, 0x86, 0x52, 0x21, 0x00, 0x80, 0x52, 0x46, 0xf9, 0xff, 0x97, + 0xe4, 0x03, 0x13, 0x2a, 0xc3, 0x00, 0x00, 0xb0, 0xf3, 0x0b, 0x40, 0xf9, + 0x63, 0xe0, 0x0c, 0x91, 0xfd, 0x7b, 0xc2, 0xa8, 0xa2, 0x40, 0x86, 0x52, + 0x41, 0x06, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x45, 0x8c, 0xff, 0x17, + 0x22, 0x0c, 0x40, 0xd3, 0xe2, 0x00, 0x00, 0xb5, 0xe3, 0x03, 0x02, 0xaa, + 0x00, 0x00, 0x01, 0x8b, 0x21, 0x40, 0x00, 0xf1, 0x02, 0x0c, 0xbf, 0xa9, + 0xc1, 0xff, 0xff, 0x54, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x80, 0xd2, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x10, 0x38, 0xd5, 0x00, 0x00, 0x74, 0xb2, + 0x00, 0x00, 0x7e, 0xb2, 0x00, 0x10, 0x18, 0xd5, 0xdf, 0x3f, 0x03, 0xd5, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x10, 0x38, 0xd5, 0x00, 0xf8, 0x73, 0x92, + 0x00, 0xf8, 0x7d, 0x92, 0x00, 0x10, 0x18, 0xd5, 0xdf, 0x3f, 0x03, 0xd5, + 0xc0, 0x03, 0x5f, 0xd6, 0xbf, 0x3b, 0x03, 0xd5, 0x20, 0x00, 0x39, 0xd5, + 0x03, 0x08, 0x08, 0x12, 0x63, 0x7c, 0x17, 0x53, 0x03, 0x04, 0x00, 0x34, + 0x0a, 0x00, 0x80, 0x52, 0x28, 0x00, 0x80, 0x52, 0x42, 0x05, 0x4a, 0x0b, + 0x01, 0x24, 0xc2, 0x1a, 0x21, 0x08, 0x00, 0x12, 0x3f, 0x08, 0x00, 0x71, + 0x8b, 0x02, 0x00, 0x54, 0x0a, 0x00, 0x1a, 0xd5, 0xdf, 0x3f, 0x03, 0xd5, + 0x01, 0x00, 0x39, 0xd5, 0x22, 0x08, 0x00, 0x12, 0x42, 0x10, 0x00, 0x11, + 0x24, 0x30, 0x03, 0x53, 0x85, 0x10, 0xc0, 0x5a, 0x89, 0x20, 0xc5, 0x1a, + 0x10, 0x21, 0xc5, 0x1a, 0x27, 0x6c, 0x0d, 0x53, 0xe7, 0x20, 0xc2, 0x1a, + 0x11, 0x21, 0xc2, 0x1a, 0x4b, 0x01, 0x09, 0x2a, 0x6b, 0x01, 0x07, 0x2a, + 0x4b, 0x76, 0x08, 0xd5, 0xe7, 0x00, 0x11, 0x6b, 0x8a, 0xff, 0xff, 0x54, + 0x29, 0x01, 0x10, 0xeb, 0xea, 0xfe, 0xff, 0x54, 0x4a, 0x09, 0x00, 0x11, + 0x7f, 0x00, 0x0a, 0x6b, 0xcc, 0xfc, 0xff, 0x54, 0x9f, 0x3f, 0x03, 0xd5, + 0xdf, 0x3f, 0x03, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x38, 0xd5, + 0xc0, 0x03, 0x5f, 0xd6, 0xa0, 0x00, 0x38, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, + 0xa0, 0x00, 0x38, 0xd5, 0x01, 0x9c, 0x60, 0xd3, 0x20, 0x1c, 0x08, 0x33, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x38, 0xd5, 0x00, 0x3c, 0x44, 0xd3, + 0x1f, 0x34, 0x34, 0xf1, 0x00, 0x01, 0x00, 0x54, 0x1f, 0x2c, 0x34, 0xf1, + 0xc0, 0x00, 0x00, 0x54, 0x1f, 0x28, 0x34, 0xf1, 0x80, 0x00, 0x00, 0x54, + 0x1f, 0x14, 0x34, 0xf1, 0x40, 0x00, 0x00, 0x54, 0x04, 0x00, 0x00, 0x14, + 0xa0, 0x00, 0x38, 0xd5, 0x00, 0x3c, 0x48, 0xd3, 0xc0, 0x03, 0x5f, 0xd6, + 0xa0, 0x00, 0x38, 0xd5, 0x01, 0x1c, 0x40, 0xd3, 0x02, 0x3c, 0x48, 0xd3, + 0x20, 0x08, 0x02, 0x8b, 0xc0, 0x03, 0x5f, 0xd6, 0x01, 0x03, 0x00, 0xb4, + 0x21, 0x00, 0x00, 0x8b, 0x22, 0x00, 0x3b, 0xd5, 0x44, 0x4c, 0x50, 0xd3, + 0x83, 0x00, 0x80, 0xd2, 0x63, 0x20, 0xc4, 0x9a, 0x64, 0x04, 0x00, 0xd1, + 0x04, 0x00, 0x24, 0x8a, 0x24, 0x7a, 0x0b, 0xd5, 0x84, 0x00, 0x03, 0x8b, + 0x9f, 0x00, 0x01, 0xeb, 0xab, 0xff, 0xff, 0x54, 0x9f, 0x3b, 0x03, 0xd5, + 0x42, 0x0c, 0x40, 0x92, 0x83, 0x00, 0x80, 0xd2, 0x63, 0x20, 0xc2, 0x9a, + 0x64, 0x04, 0x00, 0xd1, 0x04, 0x00, 0x24, 0x8a, 0x24, 0x75, 0x0b, 0xd5, + 0x84, 0x00, 0x03, 0x8b, 0x9f, 0x00, 0x01, 0xeb, 0xab, 0xff, 0xff, 0x54, + 0x9f, 0x3b, 0x03, 0xd5, 0xdf, 0x3f, 0x03, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, + 0xc1, 0x01, 0x00, 0xb4, 0x21, 0x00, 0x00, 0x8b, 0x22, 0x00, 0x3b, 0xd5, + 0x44, 0x4c, 0x50, 0xd3, 0x83, 0x00, 0x80, 0xd2, 0x63, 0x20, 0xc4, 0x9a, + 0x64, 0x04, 0x00, 0xd1, 0x04, 0x00, 0x24, 0x8a, 0x24, 0x7a, 0x0b, 0xd5, + 0x84, 0x00, 0x03, 0x8b, 0x9f, 0x00, 0x01, 0xeb, 0xab, 0xff, 0xff, 0x54, + 0x9f, 0x3b, 0x03, 0xd5, 0xdf, 0x3f, 0x03, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, + 0xc1, 0x01, 0x00, 0xb4, 0x21, 0x00, 0x00, 0x8b, 0x22, 0x00, 0x3b, 0xd5, + 0x44, 0x4c, 0x50, 0xd3, 0x83, 0x00, 0x80, 0xd2, 0x63, 0x20, 0xc4, 0x9a, + 0x64, 0x04, 0x00, 0xd1, 0x04, 0x00, 0x24, 0x8a, 0x24, 0x7e, 0x0b, 0xd5, + 0x84, 0x00, 0x03, 0x8b, 0x9f, 0x00, 0x01, 0xeb, 0xab, 0xff, 0xff, 0x54, + 0x9f, 0x3b, 0x03, 0xd5, 0xdf, 0x3f, 0x03, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xb4, 0x4b, 0x00, 0x94, + 0xc1, 0x02, 0x80, 0x52, 0x01, 0x00, 0x00, 0xb9, 0x7f, 0x20, 0x03, 0xd5, + 0x7f, 0x20, 0x03, 0xd5, 0xfe, 0xff, 0xff, 0x17, 0xc1, 0x02, 0x00, 0xb0, + 0x21, 0x60, 0x40, 0xf9, 0x3f, 0x00, 0x00, 0xf1, 0x02, 0x18, 0x43, 0x7a, + 0x48, 0x08, 0x00, 0x54, 0xe0, 0x03, 0x00, 0x2a, 0x04, 0x21, 0x80, 0xd2, + 0xfd, 0x7b, 0xbd, 0xa9, 0xe3, 0x03, 0x00, 0x91, 0x00, 0x04, 0x04, 0x9b, + 0xfd, 0x03, 0x00, 0x91, 0xe1, 0x03, 0x03, 0xaa, 0xf3, 0x53, 0x01, 0xa9, + 0x02, 0x40, 0x38, 0xd5, 0xf5, 0x13, 0x00, 0xf9, 0x2b, 0x40, 0x38, 0xd5, + 0x0a, 0x10, 0x38, 0xd5, 0x29, 0x10, 0x38, 0xd5, 0x48, 0x10, 0x38, 0xd5, + 0x07, 0x00, 0x3a, 0xd5, 0x06, 0x52, 0x38, 0xd5, 0x05, 0x20, 0x38, 0xd5, + 0x24, 0x20, 0x38, 0xd5, 0x14, 0xa3, 0x38, 0xd5, 0x53, 0x20, 0x38, 0xd5, + 0x9e, 0xd0, 0x38, 0xd5, 0x12, 0x74, 0x38, 0xd5, 0xb1, 0x00, 0x38, 0xd5, + 0x10, 0x51, 0x38, 0xd5, 0x2f, 0x51, 0x38, 0xd5, 0x2e, 0xd0, 0x38, 0xd5, + 0x0d, 0xc0, 0x38, 0xd5, 0x0c, 0xe1, 0x38, 0xd5, 0x15, 0xa2, 0x38, 0xd5, + 0x01, 0x08, 0x00, 0xf9, 0xe1, 0x03, 0x02, 0xaa, 0x01, 0x0c, 0x00, 0xf9, + 0x0b, 0x28, 0x02, 0xa9, 0x0b, 0xc1, 0x38, 0xd5, 0x0a, 0x60, 0x38, 0xd5, + 0x09, 0x20, 0x03, 0xa9, 0xa9, 0xcc, 0x38, 0xd5, 0xc8, 0xcc, 0x38, 0xd5, + 0x07, 0x18, 0x04, 0xa9, 0x03, 0x46, 0x38, 0xd5, 0x05, 0x10, 0x05, 0xa9, + 0xe7, 0xcc, 0x38, 0xd5, 0x15, 0x50, 0x06, 0xa9, 0x86, 0xcc, 0x38, 0xd5, + 0x13, 0x78, 0x07, 0xa9, 0x05, 0xc8, 0x38, 0xd5, 0x12, 0x44, 0x08, 0xa9, + 0x04, 0xcc, 0x38, 0xd5, 0x10, 0x3c, 0x09, 0xa9, 0x62, 0xc8, 0x38, 0xd5, + 0x0e, 0x34, 0x0a, 0xa9, 0x61, 0xcc, 0x38, 0xd5, 0x0c, 0x58, 0x00, 0xf9, + 0x0b, 0xa8, 0x0b, 0xa9, 0x09, 0xa0, 0x0c, 0xa9, 0x07, 0x98, 0x0d, 0xa9, + 0x05, 0x90, 0x0e, 0xa9, 0x03, 0x88, 0x0f, 0xa9, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0x01, 0x84, 0x00, 0xf9, 0x61, 0xcb, 0x38, 0xd5, + 0x01, 0x88, 0x00, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0x80, 0x04, 0x80, 0x52, 0x83, 0x3e, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0xd3, 0x02, 0x00, 0xb0, 0x61, 0x62, 0x40, 0xf9, + 0xe0, 0xbf, 0x00, 0x39, 0xe4, 0xe7, 0x00, 0x32, 0xc1, 0x02, 0x00, 0xb4, + 0x00, 0x00, 0x80, 0xd2, 0xe2, 0xe7, 0x00, 0x32, 0x21, 0x00, 0x00, 0x8b, + 0x21, 0xfc, 0xdf, 0x88, 0x00, 0x10, 0x00, 0x91, 0x42, 0x00, 0x01, 0x0a, + 0x1f, 0x40, 0x00, 0xf1, 0x00, 0x01, 0x00, 0x54, 0x61, 0x62, 0x40, 0xf9, + 0x21, 0x00, 0x00, 0x8b, 0x21, 0xfc, 0xdf, 0x88, 0x00, 0x10, 0x00, 0x91, + 0x42, 0x00, 0x01, 0x0a, 0x1f, 0x40, 0x00, 0xf1, 0x41, 0xff, 0xff, 0x54, + 0x5f, 0x00, 0x04, 0x6b, 0xa0, 0x00, 0x00, 0x54, 0x63, 0x04, 0x00, 0x71, + 0x80, 0x02, 0x00, 0x54, 0x61, 0x62, 0x40, 0xf9, 0xec, 0xff, 0xff, 0x17, + 0x55, 0xf8, 0xff, 0x97, 0x00, 0x00, 0xb8, 0xd2, 0x01, 0x10, 0xa0, 0xd2, + 0x6d, 0xff, 0xff, 0x97, 0x60, 0x62, 0x40, 0xf9, 0xc0, 0x00, 0x00, 0xb4, + 0xe0, 0xbf, 0x00, 0x91, 0xd2, 0x55, 0xff, 0x97, 0xe0, 0xbf, 0x40, 0x39, + 0x1f, 0x04, 0x00, 0x71, 0x80, 0x00, 0x00, 0x54, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x80, 0x04, 0x80, 0x52, + 0xc6, 0x55, 0xff, 0x97, 0xfb, 0xff, 0xff, 0x17, 0x44, 0xf8, 0xff, 0x97, + 0x01, 0x10, 0xa0, 0xd2, 0x00, 0x00, 0xb8, 0xd2, 0x5c, 0xff, 0xff, 0x97, + 0xf6, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf5, 0x5b, 0x02, 0xa9, 0x9c, 0x63, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0x20, 0x08, 0x80, 0x52, 0xa5, 0x8a, 0xff, 0x97, + 0xd6, 0x02, 0x00, 0xb0, 0xc0, 0x62, 0x40, 0xf9, 0x20, 0x05, 0x00, 0xb4, + 0xf4, 0x03, 0x13, 0x2a, 0x75, 0x7e, 0x7e, 0xd3, 0xf7, 0x1b, 0x00, 0xf9, + 0xe1, 0xe3, 0x00, 0x32, 0x00, 0x00, 0x15, 0x8b, 0x01, 0xfc, 0x9f, 0x88, + 0xd7, 0x62, 0x40, 0xf9, 0x32, 0x52, 0xff, 0x97, 0x81, 0x32, 0x02, 0x91, + 0xd4, 0x02, 0x03, 0x91, 0x02, 0x86, 0x80, 0xd2, 0xe0, 0x7a, 0x21, 0xf8, + 0x80, 0x02, 0x40, 0xf9, 0x00, 0x00, 0x02, 0x8b, 0x00, 0xfc, 0xdf, 0x88, + 0x42, 0x10, 0x00, 0x91, 0x60, 0x03, 0x00, 0x37, 0x5f, 0x00, 0x11, 0xf1, + 0x41, 0xff, 0xff, 0x54, 0x80, 0x02, 0x40, 0xf9, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x00, 0x15, 0x8b, 0x00, 0xc0, 0x10, 0x91, 0x00, 0x30, 0xe1, 0xb8, + 0xe0, 0x03, 0x13, 0x2a, 0x5c, 0xff, 0xff, 0x97, 0x80, 0x02, 0x40, 0xf9, + 0x80, 0x01, 0x00, 0xb4, 0x01, 0x00, 0x80, 0x52, 0x9f, 0x3b, 0x03, 0xd5, + 0xc0, 0x62, 0x40, 0xf9, 0x15, 0x00, 0x15, 0x8b, 0xe0, 0xe7, 0x00, 0x32, + 0xa0, 0xfe, 0x9f, 0x88, 0xa1, 0x00, 0x00, 0x34, 0xf7, 0x1b, 0x40, 0xf9, + 0x7f, 0x20, 0x03, 0xd5, 0x7f, 0x20, 0x03, 0xd5, 0xfe, 0xff, 0xff, 0x17, + 0xf7, 0x1b, 0x40, 0xf9, 0x93, 0xff, 0xff, 0x35, 0x94, 0xff, 0xff, 0x97, + 0xfa, 0xff, 0xff, 0x17, 0x80, 0x02, 0x40, 0xf9, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x00, 0x15, 0x8b, 0x00, 0xc0, 0x10, 0x91, 0x00, 0x30, 0xe1, 0xb8, + 0xe0, 0x03, 0x13, 0x2a, 0x44, 0xff, 0xff, 0x97, 0x80, 0x02, 0x40, 0xf9, + 0x00, 0xfe, 0xff, 0xb4, 0x21, 0x00, 0x80, 0x52, 0xe8, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0x21, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0x2a, 0x00, 0x00, 0x80, 0x52, + 0xf6, 0xf9, 0xff, 0x97, 0xc0, 0x02, 0x00, 0xb0, 0x00, 0x5c, 0x40, 0xf9, + 0x40, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x3f, 0xd6, 0x13, 0x00, 0x80, 0x52, + 0x9f, 0x02, 0x13, 0x6b, 0x80, 0x00, 0x00, 0x54, 0xe1, 0x03, 0x13, 0x2a, + 0x20, 0x00, 0x80, 0x52, 0x28, 0xfd, 0xff, 0x97, 0x73, 0x06, 0x00, 0x11, + 0x7f, 0x12, 0x00, 0x71, 0x21, 0xff, 0xff, 0x54, 0xc0, 0x02, 0x00, 0xb0, + 0x01, 0x60, 0x40, 0xf9, 0x21, 0x01, 0x00, 0xb4, 0xe0, 0x03, 0x14, 0x2a, + 0x00, 0x30, 0x04, 0x91, 0x20, 0x08, 0x00, 0x8b, 0x00, 0xfc, 0xdf, 0x88, + 0x40, 0x01, 0x00, 0x36, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xc3, 0x00, 0x00, 0xb0, 0x63, 0xe0, 0x0e, 0x91, + 0xe0, 0x03, 0x13, 0x2a, 0x42, 0x00, 0x80, 0x52, 0x41, 0x02, 0x80, 0x52, + 0xc4, 0x8a, 0xff, 0x97, 0xe1, 0x03, 0x14, 0x2a, 0x20, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0x0f, 0xfd, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x2d, 0x63, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0x40, 0x08, 0x80, 0x52, 0x36, 0x8a, 0xff, 0x97, + 0xd4, 0x02, 0x00, 0xb0, 0x80, 0x62, 0x40, 0xf9, 0x60, 0x01, 0x00, 0xb4, + 0x7f, 0x0e, 0x00, 0x71, 0x89, 0x03, 0x00, 0x54, 0xf8, 0x8b, 0xff, 0x97, + 0xe0, 0x03, 0x13, 0x2a, 0x02, 0xff, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, + 0xc4, 0xff, 0xff, 0x97, 0x47, 0xff, 0xff, 0x97, 0x7f, 0x20, 0x03, 0xd5, + 0xff, 0xff, 0xff, 0x17, 0xf0, 0x8b, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, + 0xfa, 0xfe, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, 0xbc, 0xff, 0xff, 0x97, + 0x80, 0x62, 0x40, 0xf9, 0x1f, 0x00, 0x00, 0xf1, 0x62, 0x1a, 0x43, 0x7a, + 0xa8, 0xfe, 0xff, 0x54, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x13, 0x2a, + 0x9f, 0x3b, 0x03, 0xd5, 0x80, 0x62, 0x40, 0xf9, 0xb5, 0xf6, 0x7e, 0xd3, + 0x15, 0x00, 0x15, 0x8b, 0xe0, 0xe7, 0x00, 0x32, 0xa0, 0xfe, 0x9f, 0x88, + 0xf5, 0x5b, 0x42, 0xa9, 0xeb, 0xff, 0xff, 0x17, 0xf5, 0x5b, 0x02, 0xa9, + 0xf5, 0x03, 0x13, 0x2a, 0x76, 0x7e, 0x7e, 0xd3, 0xf7, 0x1b, 0x00, 0xf9, + 0xe1, 0xe3, 0x00, 0x32, 0x00, 0x00, 0x16, 0x8b, 0x01, 0xfc, 0x9f, 0x88, + 0x97, 0x62, 0x40, 0xf9, 0xa5, 0x51, 0xff, 0x97, 0xa3, 0x22, 0x02, 0x91, + 0x22, 0x00, 0x80, 0x52, 0x81, 0x62, 0x40, 0xf9, 0xe0, 0x7a, 0x23, 0xf8, + 0x20, 0x00, 0x16, 0x8b, 0x00, 0xc0, 0x10, 0x91, 0x00, 0x30, 0xe2, 0xb8, + 0xcd, 0x8b, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, 0xd7, 0xfe, 0xff, 0x97, + 0xe0, 0x03, 0x13, 0x2a, 0x99, 0xff, 0xff, 0x97, 0x80, 0x62, 0x40, 0xf9, + 0x60, 0x00, 0x00, 0xb4, 0xf7, 0x1b, 0x40, 0xf9, 0xe0, 0xff, 0xff, 0x17, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xcf, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0x20, 0x00, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0x9c, 0xfc, 0xff, 0x97, + 0x13, 0x00, 0x00, 0x90, 0x73, 0x42, 0x33, 0x91, 0xe3, 0x03, 0x13, 0xaa, + 0x02, 0x00, 0x80, 0x52, 0x01, 0x00, 0x80, 0x52, 0x20, 0x00, 0x80, 0x52, + 0x59, 0xfb, 0xff, 0x97, 0x80, 0x00, 0x00, 0x34, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x21, 0x00, 0x80, 0x52, + 0xe3, 0x03, 0x13, 0xaa, 0xe0, 0x03, 0x01, 0x2a, 0x02, 0x00, 0x80, 0x52, + 0x50, 0xfb, 0xff, 0x97, 0x00, 0xff, 0xff, 0x35, 0xe3, 0x03, 0x13, 0xaa, + 0x02, 0x00, 0x80, 0x52, 0x41, 0x00, 0x80, 0x52, 0x20, 0x00, 0x80, 0x52, + 0x4a, 0xfb, 0xff, 0x97, 0x40, 0xfe, 0xff, 0x35, 0xe3, 0x03, 0x13, 0xaa, + 0x02, 0x00, 0x80, 0x52, 0x61, 0x00, 0x80, 0x52, 0x20, 0x00, 0x80, 0x52, + 0x44, 0xfb, 0xff, 0x97, 0x80, 0xfd, 0xff, 0x35, 0xf3, 0x0b, 0x40, 0xf9, + 0x20, 0x00, 0x80, 0x52, 0xfd, 0x7b, 0xc2, 0xa8, 0x63, 0xfc, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0x00, 0x18, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xac, 0xfc, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0x92, 0x8b, 0xff, 0x97, + 0xbd, 0x62, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0x80, 0x09, 0x80, 0x52, + 0xc6, 0x89, 0xff, 0x97, 0xc0, 0x02, 0x00, 0x90, 0x61, 0x7e, 0x7e, 0xd3, + 0x21, 0xc0, 0x10, 0x91, 0x82, 0x00, 0x80, 0x52, 0x00, 0x60, 0x40, 0xf9, + 0x00, 0x00, 0x01, 0x8b, 0x00, 0x30, 0xe2, 0xb8, 0xe0, 0x03, 0x13, 0x2a, + 0x55, 0xff, 0xff, 0x97, 0xe0, 0x03, 0x14, 0x2a, 0x9b, 0xfc, 0xff, 0x97, + 0x6e, 0x69, 0xff, 0x97, 0x60, 0x00, 0x00, 0x35, 0x7f, 0x20, 0x03, 0xd5, + 0xff, 0xff, 0xff, 0x17, 0x00, 0x00, 0x80, 0x52, 0x09, 0xff, 0xff, 0x97, + 0xc1, 0x02, 0x00, 0x90, 0x20, 0x60, 0x00, 0xf9, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xc1, 0x02, 0x00, 0x90, 0x20, 0x5c, 0x00, 0xf9, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xce, 0x55, 0xff, 0x97, 0x00, 0x00, 0x80, 0x52, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0x3d, 0x4e, 0x00, 0x94, + 0xc1, 0x02, 0x00, 0x90, 0x21, 0x68, 0x40, 0xf9, 0x00, 0x00, 0x01, 0x8b, + 0x3b, 0x4e, 0x00, 0x94, 0x20, 0x00, 0x80, 0x52, 0x41, 0x4e, 0x00, 0x94, + 0xe0, 0xb3, 0x00, 0x91, 0xff, 0x2f, 0x00, 0xb9, 0x40, 0x68, 0xff, 0x97, + 0xe0, 0x2f, 0x40, 0xb9, 0xd3, 0x02, 0x00, 0x90, 0x61, 0xca, 0x40, 0xb9, + 0x1f, 0x00, 0x01, 0x6b, 0x23, 0x01, 0x00, 0x54, 0x60, 0x01, 0x00, 0xb0, + 0x00, 0xb4, 0x46, 0xb9, 0x00, 0x00, 0x01, 0x0b, 0x60, 0xca, 0x00, 0xb9, + 0x40, 0x68, 0xff, 0x97, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x62, 0x67, 0xff, 0x97, 0x7f, 0xca, 0x00, 0xb9, + 0x3a, 0x68, 0xff, 0x97, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbd, 0xa9, 0x60, 0x01, 0x00, 0xb0, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x33, 0x00, 0x80, 0x52, + 0xd4, 0x02, 0x00, 0x90, 0x13, 0xb4, 0x06, 0xb9, 0x9d, 0x58, 0xff, 0x97, + 0x64, 0xba, 0x89, 0x52, 0x44, 0x0c, 0xa2, 0x72, 0x01, 0x00, 0x80, 0x52, + 0x03, 0x00, 0x00, 0x90, 0x63, 0x00, 0x04, 0x91, 0x04, 0x7c, 0xa4, 0x9b, + 0x02, 0x1c, 0x80, 0x52, 0xc0, 0x03, 0x80, 0x52, 0x84, 0xfc, 0x66, 0xd3, + 0x84, 0x6a, 0x00, 0xf9, 0x3a, 0xfb, 0xff, 0x97, 0xe1, 0x03, 0x00, 0x2a, + 0xa0, 0x00, 0x00, 0x34, 0xe0, 0x03, 0x01, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf5, 0x13, 0x00, 0xf9, + 0x15, 0x00, 0x00, 0x90, 0xb5, 0xc2, 0x03, 0x91, 0x02, 0x1a, 0x80, 0x52, + 0xe3, 0x03, 0x15, 0xaa, 0x2e, 0xfb, 0xff, 0x97, 0xe1, 0x03, 0x00, 0x2a, + 0x20, 0x05, 0x00, 0x35, 0xe1, 0x03, 0x13, 0x2a, 0xe3, 0x03, 0x15, 0xaa, + 0x02, 0x1a, 0x80, 0x52, 0x28, 0xfb, 0xff, 0x97, 0xe1, 0x03, 0x00, 0x2a, + 0x60, 0x04, 0x00, 0x35, 0x41, 0x00, 0x80, 0x52, 0xe3, 0x03, 0x15, 0xaa, + 0x02, 0x1a, 0x80, 0x52, 0x22, 0xfb, 0xff, 0x97, 0xe1, 0x03, 0x00, 0x2a, + 0xa0, 0x03, 0x00, 0x35, 0x61, 0x00, 0x80, 0x52, 0xe3, 0x03, 0x15, 0xaa, + 0x02, 0x1a, 0x80, 0x52, 0x1c, 0xfb, 0xff, 0x97, 0xe1, 0x03, 0x00, 0x2a, + 0xe0, 0x02, 0x00, 0x35, 0x01, 0x1e, 0xb6, 0xd2, 0x20, 0x00, 0x40, 0xb9, + 0x00, 0x00, 0x13, 0x2a, 0x20, 0x00, 0x00, 0xb9, 0xdd, 0x4d, 0x00, 0x94, + 0x81, 0x6a, 0x40, 0xf9, 0x00, 0x00, 0x01, 0x8b, 0xe8, 0x4d, 0x00, 0x94, + 0xe0, 0x03, 0x13, 0x2a, 0xee, 0x4d, 0x00, 0x94, 0xc0, 0x03, 0x80, 0x52, + 0xea, 0xfb, 0xff, 0x97, 0x00, 0x00, 0x80, 0x52, 0xe8, 0xfb, 0xff, 0x97, + 0xc0, 0x03, 0x80, 0x52, 0x52, 0xfb, 0xff, 0x97, 0xe1, 0x03, 0x00, 0x2a, + 0xf5, 0x13, 0x40, 0xf9, 0x00, 0xfa, 0xff, 0x35, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0x4c, 0xfb, 0xff, 0x17, 0xf5, 0x13, 0x40, 0xf9, + 0xcb, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x4d, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe5, 0x03, 0x00, 0xaa, 0xc3, 0x00, 0x00, 0x90, 0xc2, 0x00, 0x80, 0x52, + 0x63, 0x80, 0x0f, 0x91, 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xa4, 0x00, 0x40, 0xb9, 0xa5, 0x20, 0x40, 0xf9, 0xa8, 0x89, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbf, 0xa9, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x0b, 0x91, + 0xfd, 0x03, 0x00, 0x91, 0x78, 0x77, 0xff, 0x97, 0x1f, 0x00, 0x00, 0x71, + 0x01, 0x00, 0x17, 0x32, 0x20, 0x10, 0x80, 0x1a, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x67, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x67, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x67, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7c, 0x67, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe3, 0x03, 0x00, 0x2a, 0x64, 0x08, 0xfc, 0xb0, + 0x84, 0x00, 0x00, 0x91, 0x00, 0x00, 0x80, 0x52, 0x04, 0x00, 0x00, 0x14, + 0x21, 0x08, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x11, 0xe1, 0x00, 0x20, 0x37, + 0x01, 0x7c, 0x6f, 0xd3, 0x81, 0x00, 0x01, 0x8b, 0x22, 0x0c, 0x40, 0xb9, + 0x5f, 0x00, 0x03, 0x6b, 0x21, 0xff, 0xff, 0x54, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x80, 0x12, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x7c, 0x6f, 0xd3, + 0x61, 0x08, 0xfc, 0xb0, 0x21, 0x00, 0x00, 0x91, 0x42, 0x00, 0x80, 0x52, + 0x00, 0x00, 0x01, 0x8b, 0x02, 0x24, 0x00, 0xb9, 0x01, 0x14, 0x40, 0xb9, + 0x21, 0x78, 0x1e, 0x12, 0x01, 0x14, 0x00, 0xb9, 0x01, 0x14, 0x40, 0xb9, + 0xe1, 0xff, 0x17, 0x37, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x7c, 0x6f, 0xd3, + 0x63, 0x08, 0xfc, 0xb0, 0x63, 0x00, 0x00, 0x91, 0x22, 0x00, 0x80, 0x52, + 0x00, 0x00, 0x03, 0x8b, 0x42, 0x20, 0xc1, 0x1a, 0x00, 0x40, 0x40, 0x91, + 0x02, 0x00, 0x01, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x6f, 0xd3, + 0x63, 0x08, 0xfc, 0xb0, 0x63, 0x00, 0x00, 0x91, 0x22, 0x00, 0x80, 0x52, + 0x00, 0x00, 0x03, 0x8b, 0x42, 0x20, 0xc1, 0x1a, 0x00, 0x40, 0x40, 0x91, + 0x02, 0x80, 0x01, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x6f, 0xd3, + 0x63, 0x08, 0xfc, 0xb0, 0x63, 0x00, 0x00, 0x91, 0x21, 0x10, 0x40, 0x92, + 0x00, 0x00, 0x03, 0x8b, 0x42, 0x1c, 0x00, 0x12, 0x00, 0x40, 0x40, 0x91, + 0x00, 0x00, 0x01, 0x8b, 0x02, 0x00, 0x10, 0x39, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x6f, 0xd3, + 0x63, 0x08, 0xfc, 0xb0, 0x63, 0x00, 0x00, 0x91, 0x22, 0x00, 0x80, 0x52, + 0x00, 0x00, 0x03, 0x8b, 0x42, 0x20, 0xc1, 0x1a, 0x00, 0x40, 0x40, 0x91, + 0x02, 0x80, 0x02, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x6f, 0xd3, + 0x62, 0x08, 0xfc, 0xb0, 0x42, 0x00, 0x00, 0x91, 0x00, 0x00, 0x02, 0x8b, + 0x22, 0x00, 0x40, 0x93, 0x00, 0x40, 0x40, 0x91, 0x21, 0x04, 0x41, 0x93, + 0x02, 0x80, 0x00, 0xb9, 0x01, 0x00, 0x0d, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x06, 0xfc, 0xb0, + 0x41, 0x00, 0x40, 0xb9, 0x21, 0x00, 0x00, 0x2a, 0x41, 0x00, 0x00, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x34, 0x62, 0x06, 0xfc, 0xb0, + 0x42, 0x00, 0x00, 0x91, 0x00, 0x04, 0x1c, 0x12, 0x41, 0x00, 0x40, 0xb9, + 0x21, 0x04, 0x1c, 0x12, 0x3f, 0x00, 0x00, 0x6b, 0xa1, 0xff, 0xff, 0x54, + 0xc0, 0x03, 0x5f, 0xd6, 0x61, 0x06, 0xfc, 0xb0, 0x20, 0x00, 0x00, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0x02, 0x24, 0x45, 0xd3, 0x61, 0x06, 0xfc, 0xb0, + 0x21, 0x00, 0x00, 0x91, 0x42, 0x00, 0x01, 0x91, 0x23, 0x00, 0x80, 0x52, + 0x60, 0x20, 0xc0, 0x1a, 0x20, 0x78, 0x22, 0xb8, 0xc0, 0x03, 0x5f, 0xd6, + 0x02, 0x24, 0x45, 0xd3, 0x61, 0x06, 0xfc, 0xb0, 0x21, 0x00, 0x00, 0x91, + 0x42, 0x80, 0x01, 0x91, 0x23, 0x00, 0x80, 0x52, 0x60, 0x20, 0xc0, 0x1a, + 0x20, 0x78, 0x22, 0xb8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x24, 0x40, 0x92, + 0x62, 0x06, 0xfc, 0xb0, 0x42, 0x00, 0x00, 0x91, 0x21, 0x1c, 0x00, 0x12, + 0x40, 0x00, 0x00, 0x8b, 0x01, 0x00, 0x10, 0x39, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x40, 0x92, 0x63, 0x06, 0xfc, 0xb0, + 0x63, 0x00, 0x00, 0x91, 0x00, 0x00, 0x30, 0x91, 0x42, 0x7c, 0x40, 0x93, + 0x42, 0x00, 0x01, 0xaa, 0x62, 0x78, 0x20, 0xf8, 0xc0, 0x03, 0x5f, 0xd6, + 0x04, 0x24, 0x44, 0xd3, 0x63, 0x06, 0xfc, 0xb0, 0x63, 0x00, 0x00, 0x91, + 0x84, 0x00, 0x0c, 0x91, 0x00, 0x0c, 0x1f, 0x53, 0x62, 0x00, 0x80, 0x52, + 0x21, 0x00, 0x02, 0x0a, 0x42, 0x20, 0xc0, 0x1a, 0x21, 0x20, 0xc0, 0x1a, + 0x60, 0x78, 0x64, 0xb8, 0x02, 0x00, 0x22, 0x0a, 0x21, 0x00, 0x02, 0x2a, + 0x61, 0x78, 0x24, 0xb8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x24, 0x45, 0xd3, 0x61, 0x06, 0xfc, 0xb0, + 0x21, 0x00, 0x00, 0x91, 0x42, 0x80, 0x02, 0x91, 0x23, 0x00, 0x80, 0x52, + 0x60, 0x20, 0xc0, 0x1a, 0x20, 0x78, 0x22, 0xb8, 0xc0, 0x03, 0x5f, 0xd6, + 0x62, 0x06, 0xfc, 0xb0, 0x42, 0x00, 0x00, 0x91, 0x41, 0x04, 0x40, 0xb9, + 0x21, 0x10, 0x00, 0x72, 0x60, 0x01, 0x00, 0x54, 0x05, 0x04, 0x41, 0x93, + 0x04, 0x00, 0x40, 0x93, 0x1f, 0x20, 0x03, 0xd5, 0xe0, 0x03, 0x01, 0x2a, + 0x21, 0x04, 0x00, 0x71, 0x03, 0x80, 0x00, 0x91, 0x00, 0x00, 0x0d, 0x91, + 0x44, 0x78, 0x23, 0xb8, 0x45, 0x78, 0x20, 0xb8, 0x41, 0xff, 0xff, 0x54, + 0xc0, 0x03, 0x5f, 0xd6, 0xe1, 0x03, 0x00, 0xaa, 0x82, 0x00, 0x80, 0x52, + 0x00, 0x00, 0x80, 0x52, 0x22, 0x14, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbf, 0xa9, 0xe1, 0x00, 0x86, 0xd2, 0xe0, 0x7f, 0x46, 0xb2, + 0xfd, 0x03, 0x00, 0x91, 0x28, 0x88, 0xff, 0x97, 0x01, 0x08, 0xa0, 0x12, + 0x00, 0x00, 0x80, 0x92, 0xe1, 0x1f, 0xc0, 0xf2, 0x34, 0x88, 0xff, 0x97, + 0x1b, 0x88, 0xff, 0x97, 0x1e, 0x88, 0xff, 0x97, 0xc3, 0x00, 0x00, 0x90, + 0x63, 0x40, 0x31, 0x91, 0x02, 0x00, 0x80, 0x52, 0x01, 0x1c, 0x80, 0x52, + 0x40, 0x00, 0x80, 0x52, 0xbc, 0x88, 0xff, 0x97, 0x0f, 0x3f, 0xff, 0x97, + 0x40, 0x09, 0x00, 0x35, 0x8d, 0x57, 0xff, 0x97, 0x1f, 0x04, 0x00, 0x71, + 0xa0, 0x02, 0x00, 0x54, 0x86, 0x57, 0xff, 0x97, 0x60, 0x02, 0x00, 0x35, + 0x48, 0x20, 0x00, 0x94, 0x60, 0x03, 0x00, 0x35, 0xaa, 0x2a, 0x00, 0x94, + 0x20, 0x04, 0x00, 0x35, 0x78, 0x33, 0x00, 0x94, 0x3f, 0x45, 0xff, 0x97, + 0xe0, 0x04, 0x00, 0x35, 0x41, 0x42, 0xff, 0x97, 0x58, 0x44, 0x00, 0x94, + 0xa0, 0x05, 0x00, 0x35, 0xd6, 0x53, 0xff, 0x97, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc3, 0x00, 0x00, 0x90, 0x63, 0x20, 0x36, 0x91, 0x02, 0x00, 0x80, 0x52, + 0x01, 0x1c, 0x80, 0x52, 0x40, 0x00, 0x80, 0x52, 0xa3, 0x88, 0xff, 0x17, + 0x9e, 0x4a, 0xff, 0x97, 0xa0, 0xfd, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, + 0xc3, 0x00, 0x00, 0x90, 0x63, 0xa0, 0x32, 0x91, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x9b, 0x88, 0xff, 0x97, 0x2e, 0x20, 0x00, 0x94, + 0xe0, 0xfc, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, 0xc3, 0x00, 0x00, 0x90, + 0x63, 0x40, 0x33, 0x91, 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x93, 0x88, 0xff, 0x97, 0x8a, 0x2a, 0x00, 0x94, 0x20, 0xfc, 0xff, 0x34, + 0xe2, 0x03, 0x00, 0x2a, 0xc3, 0x00, 0x00, 0x90, 0x63, 0xe0, 0x33, 0x91, + 0x41, 0x16, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x8b, 0x88, 0xff, 0x97, + 0x52, 0x33, 0x00, 0x94, 0x19, 0x45, 0xff, 0x97, 0x60, 0xfb, 0xff, 0x34, + 0xe2, 0x03, 0x00, 0x2a, 0xc3, 0x00, 0x00, 0x90, 0x63, 0xc0, 0x34, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x82, 0x88, 0xff, 0x97, + 0x15, 0x42, 0xff, 0x97, 0x2c, 0x44, 0x00, 0x94, 0xa0, 0xfa, 0xff, 0x34, + 0xe2, 0x03, 0x00, 0x2a, 0xc3, 0x00, 0x00, 0x90, 0x63, 0x60, 0x35, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x79, 0x88, 0xff, 0x97, + 0xa4, 0x53, 0xff, 0x97, 0xfd, 0x7b, 0xc1, 0xa8, 0xc3, 0x00, 0x00, 0x90, + 0x63, 0x20, 0x36, 0x91, 0x02, 0x00, 0x80, 0x52, 0x01, 0x1c, 0x80, 0x52, + 0x40, 0x00, 0x80, 0x52, 0x71, 0x88, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, + 0xc3, 0x00, 0x00, 0x90, 0x63, 0xe0, 0x31, 0x91, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x6b, 0x88, 0xff, 0x97, 0xb1, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x40, 0xf9, 0x03, 0x00, 0x80, 0x12, + 0x21, 0x00, 0x40, 0xf9, 0x5f, 0x00, 0x01, 0xeb, 0xe0, 0x27, 0x9f, 0x1a, + 0x00, 0x90, 0x83, 0x1a, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xaf, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xff, 0xff, 0x01, 0xa9, + 0xff, 0xff, 0x02, 0xa9, 0xff, 0xff, 0x03, 0xa9, 0xff, 0x27, 0x00, 0xf9, + 0xff, 0x7f, 0x05, 0xa9, 0xff, 0x7f, 0x06, 0xa9, 0xff, 0x7f, 0x07, 0xa9, + 0xff, 0x7f, 0x08, 0xa9, 0xff, 0x7f, 0x09, 0xa9, 0xff, 0x53, 0x00, 0xf9, + 0xff, 0xff, 0x0a, 0xa9, 0xff, 0xff, 0x0b, 0xa9, 0xff, 0xff, 0x0c, 0xa9, + 0xff, 0xff, 0x0d, 0xa9, 0xff, 0xff, 0x0e, 0xa9, 0xff, 0xff, 0x0f, 0xa9, + 0xff, 0x0b, 0x01, 0xb9, 0xc1, 0x18, 0x00, 0xb4, 0x25, 0x8c, 0x42, 0xf9, + 0xe2, 0x03, 0x00, 0xaa, 0x24, 0x28, 0x41, 0xb9, 0xe3, 0x03, 0x01, 0xaa, + 0xa0, 0x10, 0x40, 0x39, 0xa0, 0x09, 0x00, 0x35, 0xa0, 0x48, 0x24, 0x8b, + 0x21, 0x20, 0x45, 0xb9, 0xe4, 0x03, 0x04, 0x2a, 0x3f, 0x14, 0x00, 0x71, + 0x01, 0x08, 0x00, 0xb9, 0xa0, 0x11, 0x00, 0x54, 0xe9, 0x10, 0x00, 0x54, + 0x3f, 0x18, 0x00, 0x71, 0x01, 0x10, 0x00, 0x54, 0x66, 0x30, 0x40, 0xf9, + 0xe1, 0x43, 0x01, 0x91, 0x60, 0x3c, 0x40, 0xf9, 0xc7, 0x0c, 0x04, 0x8b, + 0xc4, 0x78, 0x64, 0xf8, 0xe8, 0x80, 0x40, 0x79, 0x0d, 0x4c, 0x40, 0x79, + 0x84, 0x3c, 0x00, 0x12, 0x0c, 0x28, 0x40, 0xb9, 0x0b, 0x4c, 0x41, 0x39, + 0x07, 0x90, 0x44, 0xb8, 0x08, 0x5c, 0x00, 0x79, 0x10, 0xe0, 0x40, 0xf8, + 0x04, 0x60, 0x00, 0x79, 0x0f, 0x60, 0x41, 0xf8, 0x0e, 0xe0, 0x41, 0xf8, + 0x0a, 0x50, 0x45, 0xf8, 0x09, 0x00, 0x40, 0x79, 0x06, 0x04, 0x40, 0x79, + 0xf0, 0x43, 0x05, 0xf8, 0xef, 0xc3, 0x05, 0xf8, 0xee, 0x43, 0x06, 0xf8, + 0xed, 0xdb, 0x00, 0x79, 0xec, 0xe3, 0x06, 0xb8, 0xeb, 0xcb, 0x01, 0x39, + 0xea, 0x43, 0x07, 0xf8, 0xe7, 0x7f, 0x00, 0xb9, 0xe9, 0xa3, 0x00, 0x79, + 0x09, 0x28, 0x40, 0x39, 0xe9, 0x03, 0x02, 0x39, 0xe6, 0xa7, 0x00, 0x79, + 0x09, 0x2c, 0x40, 0x39, 0xe9, 0x07, 0x02, 0x39, 0x09, 0x30, 0x40, 0x39, + 0xe9, 0x0b, 0x02, 0x39, 0x09, 0x34, 0x40, 0x39, 0xe9, 0x0f, 0x02, 0x39, + 0x0f, 0x7c, 0x40, 0x79, 0x09, 0xb0, 0x40, 0x39, 0xe9, 0x13, 0x02, 0x39, + 0x0e, 0x80, 0x40, 0x79, 0x09, 0xb4, 0x40, 0x39, 0xe9, 0x17, 0x02, 0x39, + 0x0d, 0x84, 0x40, 0x79, 0x0c, 0x88, 0x40, 0x79, 0x0b, 0x20, 0x43, 0xb8, + 0x0a, 0x60, 0x43, 0xb8, 0x09, 0xa0, 0x43, 0xb8, 0xef, 0x2f, 0x01, 0x79, + 0xee, 0x33, 0x01, 0x79, 0xed, 0x37, 0x01, 0x79, 0xec, 0x3b, 0x01, 0x79, + 0xe8, 0x0f, 0x01, 0x79, 0x08, 0x18, 0x41, 0x39, 0xe8, 0x7b, 0x02, 0x39, + 0xe4, 0x13, 0x01, 0x79, 0x00, 0x70, 0x44, 0x78, 0xeb, 0xa3, 0x08, 0xb8, + 0xea, 0xe3, 0x08, 0xb8, 0xe9, 0x23, 0x09, 0xb8, 0xe0, 0xf3, 0x09, 0x78, + 0xe7, 0x13, 0x0a, 0xb8, 0xa6, 0x04, 0x00, 0x79, 0x60, 0x00, 0x40, 0x39, + 0x89, 0xb2, 0xff, 0x97, 0xfd, 0x7b, 0xd1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xa0, 0x48, 0x24, 0x8b, 0xe4, 0x03, 0x04, 0x2a, 0xe1, 0x00, 0x80, 0x52, + 0x01, 0x08, 0x00, 0xb9, 0x61, 0x3c, 0x40, 0xf9, 0x29, 0xb0, 0x45, 0x78, + 0x2c, 0xe0, 0x40, 0xf8, 0x2b, 0x60, 0x41, 0xf8, 0x28, 0xe0, 0x41, 0xf8, + 0x2a, 0x30, 0x45, 0xf8, 0x20, 0x00, 0x40, 0x79, 0x26, 0x04, 0x40, 0x79, + 0x27, 0x4c, 0x40, 0x79, 0xec, 0xc3, 0x0a, 0xf8, 0xeb, 0x43, 0x0b, 0xf8, + 0xe8, 0xc3, 0x0b, 0xf8, 0x28, 0x28, 0x40, 0xb9, 0xea, 0xa3, 0x0c, 0xf8, + 0xe9, 0xa7, 0x01, 0x79, 0xe7, 0x8b, 0x01, 0x79, 0x27, 0x60, 0x40, 0xb8, + 0xe8, 0x63, 0x0c, 0xb8, 0xe7, 0xd7, 0x00, 0xb9, 0xe0, 0x53, 0x01, 0x79, + 0x20, 0x28, 0x40, 0x39, 0xe0, 0x63, 0x03, 0x39, 0xe6, 0x57, 0x01, 0x79, + 0x20, 0x2c, 0x40, 0x39, 0xe0, 0x67, 0x03, 0x39, 0x20, 0x30, 0x40, 0x39, + 0xe0, 0x6b, 0x03, 0x39, 0x20, 0x34, 0x40, 0x39, 0xe0, 0x6f, 0x03, 0x39, + 0x20, 0xb0, 0x40, 0x39, 0xe0, 0x73, 0x03, 0x39, 0x20, 0xb4, 0x40, 0x39, + 0xe0, 0x77, 0x03, 0x39, 0x60, 0x4c, 0x40, 0xf9, 0x01, 0x68, 0x40, 0x39, + 0x61, 0x01, 0x00, 0x34, 0x04, 0x08, 0x04, 0x8b, 0xff, 0x6f, 0x03, 0x39, + 0x80, 0x60, 0x40, 0xb8, 0xe0, 0xcf, 0x00, 0xb9, 0x1f, 0x00, 0x00, 0x71, + 0x04, 0x28, 0x00, 0x11, 0xe1, 0x07, 0x9f, 0x1a, 0x80, 0x10, 0x80, 0x1a, + 0xe1, 0x2b, 0x03, 0x39, 0xe0, 0xd3, 0x00, 0xb9, 0xa6, 0x04, 0x00, 0x79, + 0xe1, 0xa3, 0x02, 0x91, 0x60, 0x00, 0x40, 0x39, 0xd9, 0xb1, 0xff, 0x97, + 0xe1, 0x03, 0x00, 0x2a, 0xe0, 0x04, 0x9c, 0x52, 0xc1, 0xf8, 0xff, 0x35, + 0x00, 0x00, 0x80, 0x52, 0xfd, 0x7b, 0xd1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x3f, 0x1c, 0x00, 0x71, 0xe0, 0x04, 0x9c, 0x52, 0xc0, 0xf8, 0xff, 0x54, + 0xfd, 0x7b, 0xd1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x3f, 0x10, 0x00, 0x71, + 0xe0, 0x04, 0x9c, 0x52, 0x00, 0x10, 0x9f, 0x1a, 0xfd, 0x7b, 0xd1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x64, 0x3c, 0x40, 0xf9, 0x20, 0x00, 0x80, 0x52, + 0x60, 0x01, 0xa0, 0x72, 0xe0, 0x1b, 0x00, 0xb9, 0x66, 0x01, 0x80, 0x52, + 0xe1, 0x63, 0x00, 0x91, 0x80, 0xe0, 0x40, 0xf8, 0xe0, 0xc3, 0x01, 0xf8, + 0x80, 0x60, 0x41, 0xf8, 0xe0, 0x43, 0x02, 0xf8, 0x80, 0xe0, 0x41, 0xf8, + 0xe0, 0xc3, 0x02, 0xf8, 0x88, 0x4c, 0x41, 0x39, 0x80, 0x90, 0x44, 0xb8, + 0x87, 0x50, 0x45, 0xf8, 0xe8, 0xd3, 0x00, 0x39, 0xe7, 0x63, 0x03, 0xf8, + 0xe0, 0xe3, 0x03, 0xb8, 0x87, 0x70, 0x44, 0x78, 0x88, 0x28, 0x40, 0x39, + 0xe8, 0x0b, 0x01, 0x39, 0x88, 0x2c, 0x40, 0x39, 0xe8, 0x0f, 0x01, 0x39, + 0x88, 0x30, 0x40, 0x39, 0xe8, 0x13, 0x01, 0x39, 0x88, 0x34, 0x40, 0x39, + 0xe8, 0x17, 0x01, 0x39, 0x88, 0xb0, 0x40, 0x39, 0xe8, 0x1b, 0x01, 0x39, + 0x84, 0xb4, 0x40, 0x39, 0xe4, 0x1f, 0x01, 0x39, 0xe7, 0x93, 0x00, 0x79, + 0xe0, 0xa3, 0x04, 0xb8, 0xa6, 0x04, 0x00, 0x79, 0x60, 0x00, 0x40, 0x39, + 0xe1, 0xb1, 0xff, 0x97, 0xe0, 0xf9, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, + 0xc3, 0x00, 0x00, 0x90, 0x63, 0x40, 0x37, 0x91, 0x00, 0x01, 0x80, 0x52, + 0x01, 0x1c, 0x80, 0x52, 0x8a, 0x87, 0xff, 0x97, 0xe0, 0x04, 0x9c, 0x52, + 0x8c, 0xff, 0xff, 0x17, 0x00, 0x02, 0x80, 0x52, 0xc3, 0x00, 0x00, 0x90, + 0x63, 0x00, 0x37, 0x91, 0xc2, 0xd4, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, + 0x82, 0x87, 0xff, 0x97, 0x20, 0x2b, 0x9c, 0x52, 0x84, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0xf3, 0x03, 0x00, 0xaa, 0x00, 0x80, 0x02, 0x91, 0x4f, 0xb9, 0xff, 0x97, + 0x00, 0x01, 0x00, 0x35, 0x60, 0xa2, 0x02, 0x91, 0x7c, 0xb9, 0xff, 0x97, + 0xe0, 0x01, 0x00, 0x35, 0x7f, 0x42, 0x14, 0x39, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x64, 0x52, 0x40, 0xf9, + 0xe2, 0x03, 0x00, 0x2a, 0xc3, 0x00, 0x00, 0x90, 0x63, 0xc0, 0x37, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x68, 0x87, 0xff, 0x97, + 0x60, 0xa2, 0x02, 0x91, 0x6e, 0xb9, 0xff, 0x97, 0x60, 0xfe, 0xff, 0x34, + 0x64, 0x56, 0x40, 0xf9, 0xe2, 0x03, 0x00, 0x2a, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xc3, 0x00, 0x00, 0x90, 0x63, 0x40, 0x39, 0x91, + 0x5e, 0x87, 0xff, 0x97, 0x7f, 0x42, 0x14, 0x39, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xe3, 0x03, 0x00, 0xaa, 0x06, 0xfc, 0x83, 0xd2, 0x05, 0x0c, 0x40, 0xf9, + 0x02, 0x14, 0x40, 0xf9, 0x00, 0xb4, 0x40, 0xf9, 0x44, 0x00, 0x40, 0x79, + 0x01, 0x18, 0x40, 0x39, 0x60, 0x8c, 0x4e, 0xa9, 0x21, 0x14, 0x06, 0x9b, + 0xe4, 0x01, 0x00, 0x34, 0x84, 0x04, 0x00, 0x51, 0x05, 0x40, 0x00, 0x91, + 0x42, 0x3c, 0x00, 0x91, 0xa4, 0x50, 0x24, 0x8b, 0x01, 0x00, 0x40, 0x6d, + 0x00, 0x40, 0x00, 0x91, 0x1f, 0x00, 0x04, 0xeb, 0x41, 0x00, 0x00, 0x6d, + 0x42, 0x54, 0x00, 0x91, 0x61, 0x00, 0x40, 0x6d, 0x63, 0x40, 0x00, 0x91, + 0x21, 0x00, 0x00, 0x6d, 0x21, 0x40, 0x00, 0x91, 0xe1, 0xfe, 0xff, 0x54, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb8, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xa2, 0x15, 0x00, 0xb4, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0xaa, + 0xf3, 0x03, 0x02, 0xaa, 0x40, 0x3c, 0x40, 0xf9, 0x00, 0x16, 0x00, 0xb4, + 0x74, 0x1f, 0x00, 0xb4, 0x80, 0x06, 0x40, 0xf9, 0xf5, 0x5b, 0x02, 0xa9, + 0x85, 0x06, 0x40, 0xb9, 0xf7, 0x1b, 0x00, 0xf9, 0x37, 0x1c, 0x00, 0x12, + 0x06, 0x20, 0x40, 0xb9, 0x16, 0x00, 0x40, 0xf9, 0xbf, 0x00, 0x06, 0x6b, + 0x15, 0x0c, 0x40, 0xf9, 0xc1, 0x08, 0x00, 0x54, 0xb6, 0x1e, 0x00, 0xb4, + 0xd5, 0x11, 0x00, 0xb4, 0x80, 0x06, 0x40, 0xf9, 0xa2, 0x0e, 0x40, 0xa9, + 0xe2, 0x0f, 0x04, 0xa9, 0xa1, 0x3a, 0x40, 0xb9, 0x00, 0x0c, 0x40, 0xf9, + 0xe1, 0x7b, 0x00, 0xb9, 0xa2, 0x0e, 0x41, 0xa9, 0xe2, 0x0f, 0x05, 0xa9, + 0xa4, 0x16, 0x40, 0xb9, 0xa2, 0x0e, 0x42, 0xa9, 0xe2, 0x0f, 0x06, 0xa9, + 0xa5, 0x1e, 0x40, 0xb9, 0xa2, 0x1a, 0x40, 0xf9, 0x1f, 0x7c, 0x00, 0xa9, + 0x1f, 0x7c, 0x01, 0xa9, 0x1f, 0x7c, 0x02, 0xa9, 0x1f, 0x18, 0x00, 0xf9, + 0x1f, 0x38, 0x00, 0xb9, 0xe2, 0x3b, 0x00, 0xf9, 0x80, 0x06, 0x40, 0xf9, + 0x1f, 0x7c, 0x00, 0xa9, 0x1f, 0x7c, 0x01, 0xa9, 0x1f, 0x7c, 0x02, 0xa9, + 0x1f, 0x18, 0x00, 0xf9, 0x65, 0x06, 0x18, 0x37, 0xe5, 0x0c, 0x20, 0x37, + 0xc5, 0x07, 0x10, 0x37, 0x05, 0x0b, 0x00, 0x35, 0x60, 0x3e, 0x40, 0xf9, + 0x60, 0x1b, 0x00, 0xb4, 0x02, 0xa0, 0x41, 0xb8, 0xe1, 0x03, 0x16, 0xaa, + 0x5f, 0x04, 0x00, 0x71, 0xe0, 0x00, 0x00, 0x54, 0x01, 0x04, 0x40, 0x79, + 0x02, 0xe0, 0x41, 0xb8, 0xc3, 0x2a, 0x21, 0x8b, 0x5f, 0x04, 0x00, 0x71, + 0xc1, 0x2e, 0x21, 0x8b, 0x21, 0x10, 0x83, 0x9a, 0x62, 0x22, 0x45, 0xb9, + 0x23, 0x04, 0xc0, 0x79, 0x5f, 0x14, 0x00, 0x71, 0xa0, 0x10, 0x00, 0x54, + 0x23, 0x10, 0x00, 0x34, 0x62, 0x8e, 0x42, 0xf9, 0x63, 0x00, 0x80, 0x92, + 0x42, 0x04, 0x40, 0x79, 0x62, 0x48, 0x22, 0x8b, 0x23, 0x00, 0x02, 0x8b, + 0x63, 0x04, 0xc0, 0x79, 0x03, 0x10, 0x00, 0x35, 0x21, 0x68, 0xe2, 0x78, + 0xc1, 0x0f, 0x00, 0x35, 0x64, 0x02, 0x40, 0x39, 0xc3, 0x00, 0x00, 0xb0, + 0x63, 0x40, 0x06, 0x91, 0xe2, 0xd5, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, + 0x80, 0x00, 0x80, 0x52, 0xeb, 0x86, 0xff, 0x97, 0x00, 0x2a, 0x9c, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc8, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x44, 0x00, 0x40, 0x39, + 0xc3, 0x00, 0x00, 0x90, 0x82, 0xdc, 0x83, 0x12, 0x63, 0x00, 0x3c, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0xde, 0x86, 0xff, 0x97, + 0xb4, 0xff, 0xff, 0x17, 0x64, 0x02, 0x40, 0x39, 0xc3, 0x00, 0x00, 0x90, + 0x63, 0xc0, 0x3e, 0x91, 0xe2, 0xd5, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, + 0x80, 0x00, 0x80, 0x52, 0xd6, 0x86, 0xff, 0x97, 0xf3, 0x53, 0x41, 0xa9, + 0x00, 0x2a, 0x9c, 0x52, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc8, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x64, 0x02, 0x40, 0x39, + 0xe2, 0xd2, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, + 0xc3, 0x00, 0x00, 0xb0, 0x63, 0x80, 0x02, 0x91, 0xc9, 0x86, 0xff, 0x97, + 0x61, 0x8e, 0x42, 0xf9, 0x62, 0x22, 0x40, 0xf9, 0x20, 0x00, 0x40, 0x79, + 0x00, 0x04, 0x00, 0x11, 0x44, 0xe0, 0x4c, 0xb8, 0x00, 0x3c, 0x00, 0x12, + 0x20, 0x00, 0x00, 0x79, 0x1f, 0x00, 0x04, 0x6b, 0x63, 0xfd, 0xff, 0x54, + 0x65, 0x32, 0x40, 0xf9, 0x20, 0x00, 0x80, 0x52, 0x20, 0x10, 0x00, 0x39, + 0xc3, 0x00, 0x00, 0xb0, 0xe2, 0xd2, 0x83, 0x12, 0x63, 0x40, 0x0a, 0x91, + 0xa0, 0xc8, 0x02, 0x39, 0x01, 0x1c, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, + 0x65, 0x02, 0x40, 0x39, 0xdf, 0xff, 0xff, 0x17, 0x64, 0x02, 0x40, 0x39, + 0x22, 0xd5, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, + 0xc3, 0x00, 0x00, 0xb0, 0x63, 0x80, 0x04, 0x91, 0xae, 0x86, 0xff, 0x97, + 0xc0, 0x2a, 0x9c, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc8, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x64, 0x02, 0x40, 0x39, 0xc2, 0xd5, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, + 0x80, 0x00, 0x80, 0x52, 0xc3, 0x00, 0x00, 0xb0, 0x63, 0xa0, 0x00, 0x91, + 0xa1, 0x86, 0xff, 0x97, 0x20, 0x2a, 0x9c, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc8, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x64, 0x02, 0x40, 0x39, 0xc3, 0x00, 0x00, 0x90, + 0x63, 0x00, 0x3e, 0x91, 0xc2, 0xd4, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x94, 0x86, 0xff, 0x97, 0x20, 0x2b, 0x9c, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc8, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x02, 0x80, 0x52, + 0xc3, 0x00, 0x00, 0x90, 0x63, 0x00, 0x37, 0x91, 0xc2, 0xd4, 0x83, 0x12, + 0x01, 0x1c, 0x80, 0x52, 0x88, 0x86, 0xff, 0x97, 0x20, 0x2b, 0x9c, 0x52, + 0xb5, 0xff, 0xff, 0x17, 0xc3, 0x00, 0x00, 0x90, 0x63, 0xe0, 0x3a, 0x91, + 0x44, 0x00, 0x40, 0x39, 0xc2, 0xd4, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x7f, 0x86, 0xff, 0x97, 0x20, 0x2b, 0x9c, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc8, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x22, 0x00, 0xc0, 0x79, 0x02, 0xf1, 0xff, 0x34, 0x7e, 0xff, 0xff, 0x17, + 0x63, 0x00, 0x00, 0x35, 0x21, 0x00, 0xc0, 0x79, 0x81, 0xf0, 0xff, 0x34, + 0x01, 0x34, 0x40, 0x39, 0x3f, 0x04, 0x00, 0x71, 0x60, 0x05, 0x00, 0x54, + 0x00, 0x04, 0x40, 0x79, 0x1f, 0x00, 0x04, 0x6b, 0x21, 0x06, 0x00, 0x54, + 0xe5, 0x06, 0x00, 0x51, 0xbf, 0x1c, 0x00, 0x71, 0x49, 0x01, 0x00, 0x54, + 0x61, 0x8e, 0x42, 0xf9, 0x40, 0x20, 0x9c, 0x52, 0xf5, 0x5b, 0x42, 0xa9, + 0x3f, 0x00, 0x00, 0x79, 0x3f, 0x10, 0x00, 0x39, 0xf3, 0x53, 0x41, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc8, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x83, 0x07, 0x80, 0x52, 0x62, 0x62, 0x09, 0x91, 0xe4, 0x57, 0x00, 0xb9, + 0x00, 0x00, 0x80, 0x52, 0xa1, 0x4c, 0xa3, 0x9b, 0xff, 0x5f, 0x00, 0xb9, + 0x56, 0x78, 0x25, 0xf8, 0x21, 0x60, 0x0a, 0x91, 0xe2, 0x7b, 0x40, 0xb9, + 0xe4, 0x17, 0x44, 0xa9, 0x24, 0x14, 0x00, 0xa9, 0xe6, 0x1f, 0x45, 0xa9, + 0x26, 0x1c, 0x01, 0xa9, 0xe4, 0x17, 0x46, 0xa9, 0x24, 0x14, 0x02, 0xa9, + 0xe3, 0x3b, 0x40, 0xf9, 0x23, 0x18, 0x00, 0xf9, 0x22, 0x38, 0x00, 0xb9, + 0x61, 0x8e, 0x42, 0xf9, 0xf5, 0x5b, 0x42, 0xa9, 0x3f, 0x00, 0x00, 0x79, + 0x3f, 0x10, 0x00, 0x39, 0x77, 0x2a, 0x01, 0xb9, 0xf3, 0x53, 0x41, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc8, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x8e, 0x42, 0xf9, 0x00, 0x04, 0x40, 0x79, 0x9f, 0x04, 0x40, 0x6b, + 0xc2, 0xfa, 0xff, 0x54, 0xc3, 0x00, 0x00, 0x90, 0x64, 0x02, 0x40, 0x39, + 0x63, 0x60, 0x07, 0x91, 0xe2, 0xd5, 0x83, 0x12, 0x52, 0xff, 0xff, 0x17, + 0xc3, 0x00, 0x00, 0x90, 0x64, 0x02, 0x40, 0x39, 0x63, 0xe0, 0x08, 0x91, + 0xe2, 0xd5, 0x83, 0x12, 0x4d, 0xff, 0xff, 0x17, 0x44, 0x00, 0x40, 0x39, + 0xa3, 0x00, 0x00, 0xf0, 0xc2, 0xd4, 0x83, 0x12, 0x63, 0x80, 0x3b, 0x91, + 0xb4, 0xff, 0xff, 0x17, 0xa3, 0x00, 0x00, 0xf0, 0x64, 0x02, 0x40, 0x39, + 0x63, 0x60, 0x3d, 0x91, 0xc2, 0xd4, 0x83, 0x12, 0x9a, 0xff, 0xff, 0x17, + 0xc3, 0x00, 0x00, 0x90, 0x63, 0xe0, 0x05, 0x91, 0x02, 0xdf, 0x83, 0x12, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x2a, 0x86, 0xff, 0x97, + 0x38, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x42, 0x03, 0x00, 0xb4, 0x41, 0x3c, 0x40, 0xf9, + 0xf3, 0x03, 0x02, 0xaa, 0x40, 0x00, 0x40, 0x39, 0x14, 0x00, 0x80, 0x52, + 0x21, 0xe0, 0x40, 0xb8, 0xa1, 0x01, 0x00, 0x34, 0x63, 0x36, 0x40, 0xf9, + 0x84, 0x02, 0x80, 0x52, 0x22, 0x00, 0x80, 0x52, 0x00, 0xbc, 0x01, 0x51, + 0x41, 0x00, 0x80, 0x52, 0x64, 0x04, 0x00, 0xb9, 0x62, 0x32, 0x01, 0xb9, + 0xf7, 0x85, 0xff, 0x97, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x96, 0xb1, 0xff, 0x97, + 0x80, 0x00, 0x00, 0x34, 0x60, 0x02, 0x40, 0x39, 0x14, 0x2b, 0x9c, 0x52, + 0xf0, 0xff, 0xff, 0x17, 0x60, 0x02, 0x40, 0x39, 0xee, 0xff, 0xff, 0x17, + 0xa3, 0x00, 0x00, 0xf0, 0x63, 0x00, 0x37, 0x91, 0xc2, 0xd4, 0x83, 0x12, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x34, 0x2b, 0x9c, 0x52, + 0x05, 0x86, 0xff, 0x97, 0xee, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x00, 0x02, 0x00, 0xb4, 0x01, 0x20, 0x40, 0xf9, + 0xff, 0x2b, 0x00, 0xb9, 0x00, 0x00, 0x40, 0x39, 0xff, 0x03, 0x03, 0x29, + 0x20, 0xd0, 0x4b, 0xb8, 0xe0, 0x27, 0x00, 0xb9, 0xc7, 0x54, 0xff, 0x97, + 0xe1, 0x03, 0x00, 0x2a, 0x3f, 0x00, 0x00, 0x71, 0xe0, 0x63, 0x00, 0x91, + 0xe1, 0x07, 0x9f, 0x1a, 0xe1, 0x83, 0x00, 0x39, 0xc1, 0x46, 0xff, 0x97, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xc2, 0xd4, 0x83, 0x12, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0xa3, 0x00, 0x00, 0xf0, + 0x63, 0x00, 0x37, 0x91, 0xe9, 0x85, 0xff, 0x97, 0x20, 0x2b, 0x9c, 0x52, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xe2, 0x03, 0x00, 0xaa, 0x21, 0x1c, 0x00, 0x12, 0x00, 0xb4, 0x40, 0xf9, + 0x23, 0x00, 0x80, 0x52, 0x3f, 0x08, 0x00, 0x71, 0x03, 0xc8, 0x21, 0x38, + 0x40, 0x00, 0x40, 0x39, 0x81, 0x00, 0x00, 0x54, 0x42, 0x1c, 0x40, 0xf9, + 0x42, 0xf4, 0x41, 0x39, 0x62, 0x00, 0x00, 0x35, 0x22, 0x00, 0x80, 0x52, + 0x6c, 0x1f, 0x00, 0x14, 0x02, 0x00, 0x80, 0x52, 0x6a, 0x1f, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0x3f, 0x04, 0x00, 0x71, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, + 0xf5, 0x5b, 0x02, 0xa9, 0xf7, 0x1b, 0x00, 0xf9, 0xf7, 0x03, 0x01, 0x2a, + 0x89, 0x05, 0x00, 0x54, 0xf5, 0x03, 0x01, 0x2a, 0xd4, 0x21, 0x9c, 0x52, + 0xa1, 0x12, 0x00, 0x91, 0x00, 0x1c, 0x40, 0xf9, 0x36, 0xf0, 0x7d, 0xd3, + 0x00, 0x00, 0x16, 0x8b, 0xe9, 0xb9, 0xff, 0x97, 0xc0, 0x03, 0x00, 0x35, + 0x62, 0x1e, 0x40, 0xf9, 0xe1, 0x03, 0x17, 0x2a, 0xe0, 0x03, 0x13, 0xaa, + 0x42, 0x0c, 0x15, 0x8b, 0x43, 0x10, 0x40, 0xf9, 0x43, 0x24, 0x00, 0xf9, + 0x7d, 0x0d, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, 0xe0, 0x06, 0x00, 0x35, + 0x60, 0xd2, 0x44, 0x39, 0xe1, 0x03, 0x17, 0x2a, 0x20, 0x04, 0x00, 0x34, + 0xe0, 0x03, 0x13, 0xaa, 0x0a, 0x0f, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, + 0x34, 0x04, 0x00, 0x34, 0xff, 0x06, 0x00, 0x71, 0x89, 0x01, 0x00, 0x54, + 0xf5, 0x03, 0x17, 0x2a, 0xa1, 0x12, 0x00, 0x91, 0x36, 0xf0, 0x7d, 0xd3, + 0x60, 0x1e, 0x40, 0xf9, 0x00, 0x00, 0x16, 0x8b, 0xf0, 0xb9, 0xff, 0x97, + 0x60, 0x05, 0x00, 0x35, 0x60, 0x1e, 0x40, 0xf9, 0x15, 0x0c, 0x15, 0x8b, + 0xa0, 0x12, 0x40, 0xf9, 0xa0, 0x26, 0x00, 0xf9, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x0d, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0x00, 0x02, 0x00, 0x34, 0x60, 0xc2, 0x40, 0xf9, + 0x00, 0x00, 0x40, 0x39, 0xa0, 0xfe, 0xff, 0x34, 0xe0, 0x03, 0x13, 0xaa, + 0x41, 0xfe, 0xff, 0x97, 0xe5, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x13, 0xaa, + 0x22, 0x0e, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, 0x34, 0xfc, 0xff, 0x35, + 0xe1, 0x03, 0x17, 0x2a, 0xe0, 0x03, 0x13, 0xaa, 0xad, 0xff, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0xdc, 0xff, 0xff, 0x17, 0x61, 0x1e, 0x40, 0xf9, + 0x20, 0x4c, 0x37, 0x8b, 0x21, 0x58, 0x77, 0xf8, 0x02, 0x10, 0x40, 0xf9, + 0x5f, 0x00, 0x01, 0xeb, 0x60, 0x02, 0x00, 0x54, 0x02, 0x08, 0x40, 0xf9, + 0x01, 0x10, 0x00, 0xf9, 0x02, 0x24, 0x00, 0xf9, 0xcb, 0xff, 0xff, 0x17, + 0x60, 0xc2, 0x40, 0xf9, 0x00, 0x00, 0x40, 0x39, 0x00, 0xfd, 0xff, 0x35, + 0xd3, 0xff, 0xff, 0x17, 0x65, 0x1e, 0x40, 0xf9, 0xa4, 0x12, 0x00, 0x91, + 0xe2, 0x03, 0x00, 0x2a, 0xc3, 0x00, 0x00, 0x90, 0x01, 0x1c, 0x80, 0x52, + 0x63, 0x60, 0x0b, 0x91, 0xa4, 0x78, 0x64, 0xf8, 0x00, 0x02, 0x80, 0x52, + 0x78, 0x85, 0xff, 0x97, 0xcd, 0xff, 0xff, 0x17, 0x01, 0x08, 0x40, 0xf9, + 0x01, 0x10, 0x00, 0xf9, 0x02, 0x24, 0x00, 0xf9, 0xb9, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0x82, 0x33, 0x80, 0xd2, 0x01, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0x14, 0xc0, 0x12, 0x91, + 0x00, 0x34, 0x40, 0xf9, 0x18, 0x46, 0x00, 0x94, 0x61, 0x36, 0x40, 0xf9, + 0x00, 0x10, 0xb0, 0x12, 0x00, 0x00, 0x27, 0x1e, 0xe0, 0x03, 0x14, 0xaa, + 0x20, 0x80, 0x01, 0xbd, 0x82, 0x27, 0x00, 0x94, 0x61, 0x82, 0x46, 0xa9, + 0x82, 0x33, 0x80, 0xd2, 0xaf, 0x45, 0x00, 0x94, 0xe0, 0x03, 0x14, 0xaa, + 0x95, 0x27, 0x00, 0x94, 0x60, 0x2a, 0x40, 0xf9, 0x61, 0x72, 0x05, 0x91, + 0x1f, 0x7c, 0x00, 0xa9, 0x1f, 0x7c, 0x01, 0xa9, 0x1f, 0x7c, 0x02, 0xa9, + 0x1f, 0x7c, 0x03, 0xa9, 0x1f, 0x7c, 0x04, 0xa9, 0x1f, 0x7c, 0x05, 0xa9, + 0x7f, 0x9e, 0x00, 0xf9, 0x3f, 0x00, 0x00, 0xf9, 0x7f, 0x66, 0x01, 0xb9, + 0x60, 0x12, 0x41, 0xf9, 0x7f, 0x86, 0x04, 0xb9, 0x1f, 0x7c, 0x00, 0xa9, + 0x1f, 0x7c, 0x01, 0xa9, 0x1f, 0x7c, 0x02, 0xa9, 0x1f, 0x7c, 0x03, 0xa9, + 0x1f, 0x20, 0x00, 0xf9, 0x60, 0x02, 0x45, 0x39, 0x80, 0x00, 0x00, 0x35, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x61, 0x06, 0x05, 0x91, 0x22, 0x00, 0x80, 0x52, 0x60, 0x36, 0x40, 0xf9, + 0x62, 0x62, 0x01, 0xb9, 0x02, 0x48, 0x88, 0x52, 0xe2, 0x01, 0xa0, 0x72, + 0x23, 0x00, 0x40, 0xf9, 0x03, 0x40, 0x01, 0xf8, 0x21, 0x08, 0x40, 0xb9, + 0x01, 0x1c, 0x00, 0xb9, 0x61, 0x36, 0x40, 0xf9, 0x63, 0x06, 0x40, 0xb9, + 0x20, 0x84, 0x42, 0x29, 0x60, 0x3a, 0x01, 0xb9, 0x7f, 0x00, 0x02, 0x6b, + 0x49, 0x00, 0x00, 0x54, 0x21, 0x00, 0x01, 0x0b, 0x00, 0x00, 0x01, 0x0b, + 0x60, 0x3e, 0x01, 0xb9, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe1, 0x03, 0x01, 0x2a, 0x02, 0x81, 0x8d, 0xd2, + 0x04, 0xa0, 0x40, 0xa9, 0x05, 0xf7, 0x81, 0xd2, 0x22, 0x7c, 0x02, 0x9b, + 0x06, 0xfc, 0x83, 0xd2, 0x00, 0x0c, 0x40, 0xf9, 0x87, 0x68, 0x62, 0x78, + 0x25, 0x20, 0x05, 0x9b, 0x83, 0x00, 0x02, 0x8b, 0x21, 0x00, 0x06, 0x9b, + 0x67, 0x02, 0x00, 0x34, 0xc6, 0x00, 0x00, 0x90, 0xc6, 0x60, 0x12, 0x91, + 0x63, 0x3c, 0x00, 0x91, 0x00, 0x00, 0x80, 0x52, 0x02, 0x34, 0x46, 0xd3, + 0x04, 0x04, 0x00, 0x11, 0xa2, 0x0c, 0x02, 0x8b, 0x42, 0xbc, 0x46, 0xf9, + 0x40, 0x24, 0xc0, 0x9a, 0x80, 0x00, 0x00, 0x36, 0xc1, 0x00, 0x40, 0x6d, + 0x61, 0x00, 0x00, 0x6d, 0x21, 0x00, 0x00, 0x6d, 0x63, 0x54, 0x00, 0x91, + 0x21, 0x40, 0x00, 0x91, 0xff, 0x20, 0x24, 0x6b, 0x80, 0x3c, 0x00, 0x12, + 0x61, 0xfe, 0xff, 0x54, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbf, 0xa9, 0xe9, 0x03, 0x00, 0xaa, 0x0a, 0x00, 0x80, 0xd2, + 0xfd, 0x03, 0x00, 0x91, 0x03, 0xb4, 0x40, 0xf9, 0x02, 0x10, 0x2e, 0x1e, + 0x2c, 0x00, 0x80, 0x52, 0x0b, 0xf7, 0x81, 0xd2, 0x7f, 0x18, 0x00, 0x39, + 0x06, 0x08, 0x40, 0xf9, 0x7f, 0x08, 0x00, 0xb9, 0x42, 0x7d, 0x40, 0x93, + 0x44, 0x19, 0x0b, 0x9b, 0x45, 0x20, 0x00, 0x91, 0x62, 0x00, 0x02, 0x8b, + 0xe1, 0x03, 0x0a, 0x2a, 0xe0, 0x03, 0x09, 0xaa, 0x4a, 0x05, 0x00, 0x91, + 0x62, 0x78, 0x25, 0xbc, 0x5f, 0x48, 0x00, 0x39, 0x5f, 0x58, 0x00, 0x39, + 0x4c, 0x68, 0x00, 0x39, 0x5f, 0xc0, 0x00, 0x39, 0x82, 0xc0, 0x74, 0x39, + 0x5f, 0x04, 0x00, 0x71, 0x89, 0x00, 0x00, 0x54, 0xc6, 0xff, 0xff, 0x97, + 0x26, 0x09, 0x40, 0xf9, 0x23, 0xb5, 0x40, 0xf9, 0x5f, 0x11, 0x00, 0xf1, + 0xa1, 0xfd, 0xff, 0x54, 0x7f, 0xd0, 0x00, 0xb8, 0x6a, 0x34, 0x00, 0x91, + 0x7f, 0x44, 0x00, 0x39, 0x67, 0x58, 0x00, 0x91, 0x65, 0x68, 0x00, 0x91, + 0x64, 0x80, 0x00, 0x91, 0x20, 0x4d, 0x40, 0xf9, 0x68, 0x48, 0x00, 0x91, + 0x22, 0x05, 0x40, 0xf9, 0x63, 0xc0, 0x00, 0x91, 0x21, 0x2d, 0x40, 0xf9, + 0x22, 0x99, 0x02, 0xa9, 0x02, 0x01, 0x80, 0x52, 0x21, 0x31, 0x00, 0xf9, + 0x01, 0x20, 0x80, 0x52, 0x2a, 0x21, 0x17, 0xa9, 0x27, 0x15, 0x18, 0xa9, + 0x24, 0x0d, 0x19, 0xa9, 0x03, 0x04, 0x40, 0x39, 0x7f, 0x00, 0x00, 0x71, + 0xe3, 0x07, 0x9f, 0x1a, 0x03, 0x68, 0x00, 0x39, 0x22, 0x31, 0x01, 0xb9, + 0x20, 0x01, 0x40, 0x39, 0xfd, 0x7b, 0xc1, 0xa8, 0x00, 0xbc, 0x01, 0x51, + 0xb3, 0x84, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xba, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x34, 0x1c, 0x00, 0x12, 0xf7, 0x63, 0x03, 0xa9, 0xf7, 0x03, 0x00, 0xaa, + 0x01, 0x00, 0x44, 0xa9, 0xf5, 0x5b, 0x02, 0xa9, 0xf9, 0x6b, 0x04, 0xa9, + 0x21, 0x60, 0x42, 0x39, 0x13, 0x50, 0x40, 0x39, 0x3f, 0x04, 0x00, 0x71, + 0x60, 0x08, 0x00, 0x54, 0x73, 0x01, 0x00, 0x34, 0x02, 0x10, 0x40, 0xb9, + 0x5f, 0x04, 0x00, 0x71, 0x60, 0x17, 0x00, 0x54, 0x03, 0x0c, 0x40, 0xb9, + 0x7f, 0x04, 0x00, 0x71, 0x80, 0x16, 0x00, 0x54, 0x3f, 0x08, 0x00, 0x71, + 0x40, 0x17, 0x00, 0x54, 0x13, 0x00, 0x80, 0x52, 0xa0, 0x00, 0x00, 0x14, + 0x3f, 0x08, 0x00, 0x71, 0x35, 0x00, 0x80, 0x52, 0xe1, 0x06, 0x00, 0x54, + 0xe0, 0x02, 0x40, 0x39, 0x82, 0x00, 0x80, 0x52, 0xc1, 0x00, 0x80, 0x52, + 0x66, 0x1f, 0x00, 0x94, 0xf9, 0x03, 0x00, 0x2a, 0x00, 0x07, 0x00, 0x35, + 0xe2, 0x86, 0x40, 0xa9, 0xda, 0x00, 0x00, 0x90, 0x5a, 0x63, 0x12, 0x91, + 0x18, 0x00, 0x80, 0xd2, 0xfb, 0x73, 0x05, 0xa9, 0x1c, 0x81, 0x8d, 0xd2, + 0x1b, 0xf7, 0x81, 0xd2, 0x00, 0x7f, 0x1c, 0x9b, 0x16, 0x1f, 0x00, 0x12, + 0x05, 0x07, 0x1b, 0x9b, 0x44, 0x00, 0x00, 0x8b, 0xe4, 0x96, 0x02, 0xa9, + 0xf4, 0x00, 0x00, 0x34, 0xbf, 0x02, 0x00, 0x71, 0xc0, 0x1a, 0x42, 0x7a, + 0xa0, 0x03, 0x00, 0x54, 0x7f, 0x02, 0x00, 0x71, 0xc0, 0x1a, 0x41, 0x7a, + 0x40, 0x03, 0x00, 0x54, 0x1f, 0x0f, 0x00, 0xf1, 0x40, 0x05, 0x00, 0x54, + 0xe2, 0x2e, 0x40, 0xf9, 0x01, 0x18, 0x80, 0xd2, 0x01, 0x0b, 0x01, 0x9b, + 0x3f, 0x7c, 0x00, 0xa9, 0x3f, 0x7c, 0x01, 0xa9, 0x3f, 0x7c, 0x02, 0xa9, + 0x3f, 0x7c, 0x03, 0xa9, 0x3f, 0x7c, 0x04, 0xa9, 0x3f, 0x7c, 0x05, 0xa9, + 0x3f, 0x7c, 0x06, 0xa9, 0x3f, 0x7c, 0x07, 0xa9, 0x3f, 0x7c, 0x08, 0xa9, + 0x3f, 0x7c, 0x09, 0xa9, 0x3f, 0x7c, 0x0a, 0xa9, 0x3f, 0x7c, 0x0b, 0xa9, + 0xe4, 0x16, 0x40, 0xf9, 0x81, 0x08, 0x40, 0x91, 0x21, 0x94, 0x67, 0x39, + 0x3f, 0x18, 0x00, 0x71, 0x21, 0x0d, 0x00, 0x54, 0xdf, 0x0e, 0x00, 0x71, + 0x00, 0x03, 0x00, 0x54, 0xe2, 0x86, 0x40, 0xa9, 0x18, 0x07, 0x00, 0x91, + 0xda, 0xff, 0xff, 0x17, 0xf3, 0x0c, 0x00, 0x35, 0xf3, 0x03, 0x01, 0x2a, + 0x15, 0x00, 0x80, 0x52, 0xe0, 0x02, 0x40, 0x39, 0x82, 0x00, 0x80, 0x52, + 0xc1, 0x00, 0x80, 0x52, 0x2f, 0x1f, 0x00, 0x94, 0xf9, 0x03, 0x00, 0x2a, + 0x40, 0xf9, 0xff, 0x34, 0xe0, 0x03, 0x19, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x80, 0x08, 0x40, 0x91, + 0x00, 0x94, 0x67, 0x39, 0x1f, 0x18, 0x00, 0x71, 0x41, 0x01, 0x00, 0x54, + 0x19, 0x08, 0x00, 0x34, 0xe0, 0x03, 0x19, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe2, 0x03, 0x04, 0xaa, 0x80, 0x00, 0x40, 0x79, 0x80, 0x01, 0x00, 0x34, + 0x00, 0x04, 0x00, 0x51, 0x86, 0x90, 0x00, 0x91, 0x00, 0x3c, 0x00, 0x12, + 0xa3, 0x02, 0x80, 0x52, 0x41, 0x03, 0x40, 0x6d, 0x81, 0x3c, 0x00, 0x91, + 0x60, 0x18, 0xa0, 0x9b, 0x21, 0x00, 0x00, 0x6d, 0x21, 0x54, 0x00, 0x91, + 0x1f, 0x00, 0x01, 0xeb, 0xa1, 0xff, 0xff, 0x54, 0xa1, 0x50, 0x5a, 0x79, + 0xa6, 0x02, 0x80, 0xd2, 0x41, 0x03, 0x41, 0x6d, 0x00, 0xfc, 0x83, 0xd2, + 0x45, 0x00, 0x40, 0x79, 0x24, 0x10, 0x06, 0x9b, 0xe1, 0x12, 0x40, 0xf9, + 0x00, 0x7f, 0x00, 0x9b, 0x81, 0xf0, 0x00, 0xfc, 0x21, 0x00, 0x00, 0x8b, + 0x80, 0x70, 0x01, 0xfc, 0x65, 0x01, 0x00, 0x34, 0xa4, 0x04, 0x00, 0x51, + 0x25, 0x40, 0x00, 0x91, 0x42, 0x3c, 0x00, 0x91, 0xa4, 0x50, 0x24, 0x8b, + 0x41, 0x00, 0x40, 0x6d, 0x42, 0x54, 0x00, 0x91, 0x21, 0x00, 0x00, 0x6d, + 0x21, 0x40, 0x00, 0x91, 0x9f, 0x00, 0x01, 0xeb, 0x61, 0xff, 0xff, 0x54, + 0xe4, 0x0e, 0x40, 0xf9, 0x02, 0xfc, 0x83, 0xd2, 0x01, 0x00, 0x80, 0x52, + 0x80, 0x00, 0x00, 0x8b, 0xec, 0x44, 0x00, 0x94, 0xe0, 0x03, 0x17, 0xaa, + 0x21, 0x00, 0x80, 0x52, 0x0d, 0x0b, 0x00, 0x94, 0xf9, 0x03, 0x00, 0x2a, + 0x20, 0xf6, 0xff, 0x35, 0xd8, 0x04, 0x00, 0xb4, 0xe0, 0xb6, 0x40, 0xf9, + 0xe1, 0x03, 0x18, 0x2a, 0x02, 0x00, 0x80, 0x52, 0x1f, 0xc8, 0x38, 0x38, + 0xe0, 0x02, 0x40, 0x39, 0xc4, 0x1d, 0x00, 0x94, 0xf9, 0x03, 0x00, 0x2a, + 0xa8, 0xff, 0xff, 0x17, 0xe0, 0x02, 0x40, 0x39, 0xc1, 0x0f, 0x80, 0x52, + 0x17, 0x1d, 0x00, 0x94, 0xf9, 0x03, 0x00, 0x2a, 0xa0, 0xf7, 0xff, 0x35, + 0xe0, 0x03, 0x17, 0xaa, 0x1b, 0xff, 0xff, 0x97, 0xe0, 0x03, 0x19, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x06, 0x40, 0xf9, 0xe5, 0x1a, 0x40, 0xf9, + 0x42, 0x00, 0x00, 0x8b, 0xb8, 0xff, 0xff, 0x17, 0x02, 0x10, 0x40, 0xb9, + 0x5f, 0x08, 0x00, 0x71, 0x35, 0x00, 0x80, 0x52, 0x40, 0xec, 0xff, 0x54, + 0x00, 0x0c, 0x40, 0xb9, 0x35, 0x00, 0x80, 0x52, 0x1f, 0x08, 0x00, 0x71, + 0xc0, 0xeb, 0xff, 0x54, 0x15, 0x00, 0x80, 0x52, 0x93, 0xff, 0xff, 0x17, + 0x01, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x17, 0xaa, 0x2a, 0xfe, 0xff, 0x97, + 0x18, 0x07, 0x00, 0x91, 0xf9, 0x03, 0x00, 0x2a, 0xe2, 0x86, 0x40, 0xa9, + 0x62, 0xff, 0xff, 0x17, 0x3f, 0x08, 0x00, 0x71, 0xf5, 0x03, 0x13, 0x2a, + 0x40, 0xea, 0xff, 0x54, 0xed, 0xff, 0xff, 0x17, 0x3f, 0x08, 0x00, 0x71, + 0xf5, 0x03, 0x13, 0x2a, 0xc0, 0xe9, 0xff, 0x54, 0xec, 0xff, 0xff, 0x17, + 0xf5, 0x03, 0x13, 0x2a, 0x13, 0x00, 0x80, 0x52, 0x4a, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb6, 0xa9, + 0x3f, 0x00, 0x00, 0x71, 0x22, 0x01, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0xf7, 0x63, 0x03, 0xa9, 0xf8, 0x03, 0x00, 0xaa, 0xf3, 0x53, 0x01, 0xa9, + 0xe1, 0x9f, 0x00, 0xb9, 0x17, 0x37, 0x40, 0xf9, 0xfb, 0x73, 0x05, 0xa9, + 0xdb, 0x00, 0x80, 0x52, 0x14, 0x0f, 0x41, 0xf9, 0xe0, 0x03, 0x9b, 0x1a, + 0x01, 0x13, 0x41, 0xf9, 0xf5, 0x5b, 0x02, 0xa9, 0xf6, 0x03, 0x00, 0x2a, + 0xe3, 0xd2, 0x40, 0x79, 0x7b, 0x03, 0x82, 0x1a, 0xe4, 0xda, 0x40, 0x79, + 0x02, 0x10, 0xa6, 0x52, 0xf5, 0x12, 0x01, 0x91, 0x3c, 0x00, 0x80, 0x52, + 0xf9, 0x6b, 0x04, 0xa9, 0x9a, 0x0e, 0x16, 0x8b, 0x19, 0x1c, 0x40, 0x92, + 0x36, 0x08, 0x16, 0x8b, 0x41, 0xe1, 0x9a, 0x52, 0x61, 0x84, 0xa7, 0x72, + 0xe8, 0x27, 0x06, 0x6d, 0xea, 0x2f, 0x07, 0x6d, 0x4a, 0x00, 0x27, 0x1e, + 0x0b, 0x90, 0x24, 0x1e, 0xec, 0x43, 0x00, 0xfd, 0x2c, 0x00, 0x27, 0x1e, + 0x30, 0x00, 0x00, 0x14, 0xe9, 0xb7, 0x9f, 0x1a, 0x10, 0x20, 0x28, 0x1e, + 0xe8, 0xb7, 0x9f, 0x1a, 0x1f, 0x1c, 0x00, 0x71, 0x80, 0x08, 0x00, 0x54, + 0x27, 0x21, 0xd3, 0x1a, 0x06, 0x21, 0xd3, 0x1a, 0xe2, 0x3c, 0x00, 0x13, + 0xc0, 0x3c, 0x00, 0x13, 0x93, 0x23, 0xd3, 0x1a, 0xf3, 0x03, 0x33, 0x2a, + 0x01, 0x00, 0x80, 0x52, 0x73, 0x3e, 0x00, 0x13, 0x63, 0x02, 0x03, 0x0a, + 0x73, 0x02, 0x04, 0x0a, 0x43, 0x00, 0x03, 0x2a, 0x13, 0x00, 0x13, 0x2a, + 0x63, 0x3c, 0x00, 0x12, 0x64, 0x3e, 0x00, 0x12, 0x69, 0x00, 0x00, 0x34, + 0xc1, 0x02, 0x40, 0xb9, 0x21, 0x04, 0x00, 0x11, 0xc1, 0x02, 0x00, 0xb9, + 0x00, 0x00, 0x80, 0x52, 0x68, 0x00, 0x00, 0x34, 0xc0, 0x26, 0x40, 0xb9, + 0x00, 0x04, 0x00, 0x11, 0x42, 0x0f, 0x40, 0x79, 0xc0, 0x26, 0x00, 0xb9, + 0x5f, 0x00, 0x01, 0x6b, 0xa8, 0x00, 0x00, 0x54, 0xe1, 0xd6, 0x40, 0x79, + 0xe7, 0x00, 0x01, 0x2a, 0xe7, 0xd6, 0x00, 0x79, 0xdf, 0x02, 0x00, 0xb9, + 0x5f, 0x00, 0x00, 0x6b, 0xa8, 0x00, 0x00, 0x54, 0xe0, 0xde, 0x40, 0x79, + 0xc6, 0x00, 0x00, 0x2a, 0xe6, 0xde, 0x00, 0x79, 0xdf, 0x26, 0x00, 0xb9, + 0x39, 0x07, 0x00, 0x91, 0x5a, 0x23, 0x00, 0x91, 0xd6, 0x12, 0x00, 0x91, + 0x20, 0x1f, 0x00, 0x12, 0x7f, 0x03, 0x39, 0x6b, 0x09, 0x05, 0x00, 0x54, + 0x42, 0x07, 0xc0, 0x79, 0x1f, 0x14, 0x00, 0x71, 0x41, 0x0b, 0xc0, 0x79, + 0xf3, 0x03, 0x19, 0x2a, 0xa0, 0x7a, 0x79, 0xbc, 0x42, 0x00, 0x22, 0x1e, + 0x21, 0x00, 0x22, 0x1e, 0x49, 0x08, 0x2c, 0x1e, 0x28, 0x08, 0x2c, 0x1e, + 0x08, 0x01, 0x00, 0x54, 0x00, 0x08, 0x2a, 0x1e, 0xe3, 0x13, 0x12, 0x29, + 0xe0, 0x9b, 0x00, 0xb9, 0xb7, 0x41, 0x00, 0x94, 0x00, 0x08, 0x2b, 0x1e, + 0xe3, 0x13, 0x52, 0x29, 0xe0, 0x9b, 0x40, 0xb9, 0x41, 0x03, 0x40, 0x79, + 0x10, 0x20, 0x29, 0x1e, 0xc1, 0xf7, 0xff, 0x35, 0xe9, 0x57, 0x9f, 0x1a, + 0x10, 0x20, 0x28, 0x1e, 0xe8, 0x57, 0x9f, 0x1a, 0x1f, 0x1c, 0x00, 0x71, + 0xc1, 0xf7, 0xff, 0x54, 0x00, 0x23, 0x40, 0xf9, 0x00, 0x60, 0x44, 0x39, + 0x1f, 0x04, 0x00, 0x71, 0x41, 0xf7, 0xff, 0x54, 0xe0, 0x46, 0x46, 0x39, + 0x1f, 0x08, 0x00, 0x71, 0xe0, 0xf6, 0xff, 0x54, 0x00, 0x00, 0x80, 0x52, + 0x06, 0x00, 0x80, 0x52, 0x02, 0x00, 0x80, 0x52, 0x07, 0x00, 0x80, 0x52, + 0x08, 0x00, 0x80, 0x52, 0x09, 0x00, 0x80, 0x52, 0xb4, 0xff, 0xff, 0x17, + 0xe0, 0x9f, 0x40, 0xb9, 0xf6, 0x07, 0x80, 0x52, 0x95, 0x22, 0x01, 0x91, + 0xfc, 0xa2, 0x01, 0x91, 0x1f, 0x00, 0x00, 0x71, 0x00, 0x38, 0x80, 0x52, + 0xd6, 0x02, 0x80, 0x1a, 0x1a, 0x00, 0x80, 0x52, 0xc0, 0x3e, 0x00, 0x12, + 0x1b, 0x00, 0x80, 0x52, 0xc7, 0x00, 0x00, 0x90, 0xf6, 0xa0, 0x14, 0x91, + 0xe3, 0xd2, 0x00, 0x79, 0xe4, 0xda, 0x00, 0x79, 0xe0, 0x93, 0x00, 0xb9, + 0x08, 0x00, 0x00, 0x14, 0x5a, 0x07, 0x00, 0x11, 0xbf, 0x00, 0x00, 0x71, + 0x5a, 0x1f, 0x00, 0x12, 0xb5, 0x12, 0x00, 0x91, 0x42, 0x1b, 0x43, 0x7a, + 0x9c, 0x0b, 0x00, 0x91, 0xe8, 0x08, 0x00, 0x54, 0xa3, 0x06, 0x40, 0x79, + 0x25, 0x00, 0x80, 0x52, 0x83, 0x13, 0x00, 0x79, 0x80, 0x03, 0x40, 0x79, + 0xa1, 0x02, 0x40, 0x79, 0x00, 0x00, 0x01, 0x0a, 0xe1, 0x93, 0x40, 0xb9, + 0x3f, 0x00, 0x00, 0x6a, 0x20, 0xfe, 0xff, 0x54, 0x19, 0x00, 0x80, 0x52, + 0x33, 0x1f, 0x00, 0x12, 0x60, 0x24, 0xd9, 0x1a, 0x40, 0x02, 0x00, 0x36, + 0x1f, 0x20, 0x03, 0xd5, 0x3f, 0x13, 0x00, 0x71, 0x20, 0x13, 0x00, 0x54, + 0x7f, 0x12, 0x00, 0x71, 0xa8, 0x09, 0x00, 0x54, 0x7f, 0x06, 0x00, 0x71, + 0x00, 0x15, 0x00, 0x54, 0x7f, 0x0a, 0x00, 0x71, 0x81, 0x07, 0x00, 0x54, + 0x00, 0xb7, 0x40, 0xf9, 0x00, 0x18, 0x40, 0x39, 0x1f, 0x0c, 0x00, 0x71, + 0xc1, 0x16, 0x00, 0x54, 0x39, 0x07, 0x00, 0x11, 0x33, 0x1f, 0x00, 0x12, + 0x60, 0x24, 0xd9, 0x1a, 0x20, 0xfe, 0x07, 0x37, 0x28, 0x00, 0x80, 0x52, + 0x09, 0x00, 0x80, 0x52, 0x73, 0x06, 0x00, 0x11, 0x1f, 0x01, 0x00, 0x71, + 0x73, 0x1e, 0x00, 0x12, 0x62, 0x1a, 0x47, 0x7a, 0xc9, 0xfe, 0xff, 0x54, + 0x08, 0x09, 0x00, 0x35, 0x60, 0x06, 0x9c, 0x52, 0x3f, 0x01, 0x00, 0x6b, + 0x01, 0x18, 0x00, 0x54, 0x05, 0x00, 0x80, 0x52, 0x84, 0x03, 0x40, 0x79, + 0x01, 0x00, 0x80, 0xd2, 0x68, 0x06, 0x9c, 0x52, 0x1f, 0x20, 0x03, 0xd5, + 0x23, 0xf0, 0x7d, 0xd3, 0x20, 0x00, 0x80, 0x52, 0x7b, 0x06, 0x9c, 0x52, + 0x82, 0x24, 0xc1, 0x1a, 0xc2, 0x00, 0x00, 0x36, 0x80, 0x6a, 0x63, 0x78, + 0x00, 0xc4, 0x21, 0x8b, 0xdb, 0x7a, 0x60, 0xb8, 0x7f, 0x03, 0x08, 0x6b, + 0xe0, 0x17, 0x9f, 0x1a, 0x22, 0x04, 0x00, 0x11, 0x21, 0x04, 0x00, 0x91, + 0x42, 0x1c, 0x00, 0x12, 0x5f, 0x14, 0x00, 0x71, 0xe2, 0x87, 0x9f, 0x1a, + 0x1f, 0x00, 0x02, 0x6a, 0x01, 0xfe, 0xff, 0x54, 0x5a, 0x07, 0x00, 0x11, + 0xbf, 0x00, 0x00, 0x71, 0x5a, 0x1f, 0x00, 0x12, 0xb5, 0x12, 0x00, 0x91, + 0x42, 0x1b, 0x43, 0x7a, 0x9c, 0x0b, 0x00, 0x91, 0x69, 0xf7, 0xff, 0x54, + 0xe0, 0x03, 0x1b, 0x2a, 0xec, 0x43, 0x40, 0xfd, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xe8, 0x27, 0x46, 0x6d, 0xea, 0x2f, 0x47, 0x6d, + 0xfd, 0x7b, 0xca, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xb3, 0xf9, 0xff, 0x35, + 0xe0, 0x9f, 0x40, 0xb9, 0x1f, 0x04, 0x00, 0x71, 0xc1, 0xf8, 0xff, 0x54, + 0x00, 0xc3, 0x40, 0xf9, 0x00, 0x00, 0x40, 0x39, 0x60, 0xf8, 0xff, 0x34, + 0xe0, 0x03, 0x18, 0xaa, 0xe3, 0x97, 0x00, 0xb9, 0xba, 0xfb, 0xff, 0x97, + 0x39, 0x07, 0x00, 0x11, 0xe3, 0x97, 0x40, 0xb9, 0xbe, 0xff, 0xff, 0x17, + 0x7f, 0x1a, 0x00, 0x71, 0x60, 0x04, 0x00, 0x54, 0x7f, 0x1e, 0x00, 0x71, + 0x61, 0x02, 0x00, 0x54, 0xe5, 0xde, 0x40, 0x79, 0x09, 0x00, 0x80, 0x52, + 0xe4, 0xd6, 0x40, 0x79, 0xc3, 0x00, 0x00, 0x90, 0x82, 0xf9, 0x83, 0x12, + 0x63, 0xa0, 0x0c, 0x91, 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xe9, 0x97, 0x00, 0xb9, 0x01, 0x83, 0xff, 0x97, 0xe9, 0x97, 0x40, 0xb9, + 0x3f, 0x01, 0x00, 0x71, 0xe5, 0x17, 0x9f, 0x1a, 0x7b, 0xf7, 0xff, 0x34, + 0x60, 0x06, 0x9c, 0x52, 0x7f, 0x03, 0x00, 0x6b, 0x00, 0xf7, 0xff, 0x54, + 0x86, 0xff, 0xff, 0x17, 0x7f, 0x16, 0x00, 0x71, 0x21, 0xf5, 0xff, 0x54, + 0x01, 0xb7, 0x40, 0xf9, 0x22, 0x00, 0x80, 0x52, 0x20, 0x34, 0x00, 0x91, + 0x21, 0x44, 0x00, 0x91, 0x1f, 0x00, 0x00, 0x39, 0x00, 0x04, 0x00, 0x91, + 0x1f, 0x10, 0x00, 0x39, 0x02, 0x30, 0x00, 0x39, 0x1f, 0x88, 0x00, 0x39, + 0x3f, 0x00, 0x00, 0xeb, 0x41, 0xff, 0xff, 0x54, 0xd1, 0xff, 0xff, 0x17, + 0x04, 0x03, 0x42, 0xa9, 0x08, 0xfc, 0x83, 0xd2, 0x01, 0xb7, 0x40, 0xf9, + 0x21, 0x18, 0x40, 0x39, 0x05, 0x00, 0x40, 0x79, 0x22, 0x1c, 0x40, 0x92, + 0x42, 0x10, 0x08, 0x9b, 0x65, 0x01, 0x00, 0x34, 0xa5, 0x04, 0x00, 0x51, + 0x00, 0x3c, 0x00, 0x91, 0x45, 0x50, 0x25, 0x8b, 0x1f, 0x20, 0x03, 0xd5, + 0x41, 0x00, 0x40, 0x6d, 0xbf, 0x00, 0x02, 0xeb, 0x42, 0x40, 0x00, 0x91, + 0x01, 0x00, 0x00, 0x6d, 0x00, 0x54, 0x00, 0x91, 0x61, 0xff, 0xff, 0x54, + 0xe0, 0x03, 0x18, 0xaa, 0xe3, 0x97, 0x00, 0xb9, 0x02, 0xfd, 0xff, 0x97, + 0xe9, 0x03, 0x00, 0x2a, 0xe1, 0x9f, 0x40, 0xb9, 0x7f, 0x03, 0x00, 0x71, + 0xe3, 0x97, 0x40, 0xb9, 0x21, 0x00, 0x00, 0x12, 0x21, 0x10, 0x9f, 0x1a, + 0x61, 0x03, 0x00, 0x34, 0x00, 0xc3, 0x40, 0xf9, 0x3f, 0x01, 0x00, 0x71, + 0xe8, 0x17, 0x9f, 0x1a, 0x00, 0x00, 0x40, 0x39, 0xc0, 0xef, 0xff, 0x34, + 0xe0, 0x03, 0x18, 0xaa, 0xe9, 0x8f, 0x12, 0x29, 0x6f, 0xfb, 0xff, 0x97, + 0xe9, 0x8f, 0x52, 0x29, 0x79, 0xff, 0xff, 0x17, 0x00, 0xb7, 0x40, 0xf9, + 0x00, 0x08, 0x40, 0x39, 0x00, 0x03, 0x00, 0x34, 0x00, 0x1f, 0x40, 0xf9, + 0x42, 0x00, 0x80, 0x52, 0x00, 0xf4, 0x41, 0x39, 0x60, 0x05, 0x00, 0x35, + 0x00, 0x03, 0x40, 0x39, 0x81, 0x00, 0x80, 0x52, 0xe3, 0x97, 0x00, 0xb9, + 0x6e, 0x1d, 0x00, 0x94, 0xe9, 0x03, 0x00, 0x2a, 0xe0, 0x9f, 0x40, 0xb9, + 0xe3, 0x97, 0x40, 0xb9, 0x1f, 0x04, 0x00, 0x71, 0xe0, 0xfc, 0xff, 0x54, + 0x3f, 0x01, 0x00, 0x71, 0xe8, 0x17, 0x9f, 0x1a, 0x66, 0xff, 0xff, 0x17, + 0xe1, 0x03, 0x13, 0x2a, 0xe0, 0x03, 0x18, 0xaa, 0xe3, 0x97, 0x00, 0xb9, + 0xde, 0xfd, 0xff, 0x97, 0xe3, 0x97, 0x40, 0xb9, 0x39, 0x07, 0x00, 0x11, + 0x5a, 0xff, 0xff, 0x17, 0xa9, 0x08, 0x9c, 0x52, 0xe0, 0x9f, 0x40, 0xb9, + 0x1f, 0x04, 0x00, 0x71, 0x21, 0xec, 0xff, 0x54, 0x00, 0xc3, 0x40, 0xf9, + 0x00, 0x00, 0x40, 0x39, 0xc0, 0xeb, 0xff, 0x34, 0x08, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x18, 0xaa, 0xe9, 0x8f, 0x12, 0x29, 0x48, 0xfb, 0xff, 0x97, + 0xe9, 0x8f, 0x52, 0x29, 0x52, 0xff, 0xff, 0x17, 0x00, 0x37, 0x40, 0xf9, + 0xe1, 0x9f, 0x40, 0xb9, 0x3f, 0x04, 0x00, 0x71, 0x01, 0x00, 0x08, 0x91, + 0x1f, 0xc0, 0x02, 0xf8, 0x3f, 0x30, 0x19, 0xf8, 0x1f, 0x40, 0x00, 0xb9, + 0xe0, 0xef, 0xff, 0x54, 0x39, 0x07, 0x00, 0x11, 0x43, 0xff, 0xff, 0x17, + 0xe1, 0x03, 0x02, 0x2a, 0xe0, 0x03, 0x18, 0xaa, 0xe3, 0x97, 0x00, 0xb9, + 0xbc, 0xfc, 0xff, 0x97, 0x04, 0xb7, 0x40, 0xf9, 0xe9, 0x03, 0x00, 0x2a, + 0x01, 0x07, 0x40, 0xf9, 0x02, 0x81, 0x8d, 0xd2, 0x80, 0x18, 0x40, 0x39, + 0xe3, 0x97, 0x40, 0xb9, 0x00, 0x04, 0x02, 0x9b, 0x00, 0x17, 0x00, 0xf9, + 0xc9, 0xfb, 0xff, 0x35, 0x02, 0x00, 0x80, 0x52, 0xc8, 0xff, 0xff, 0x17, + 0xfb, 0x03, 0x09, 0x2a, 0x5d, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0x01, 0x00, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0xaa, + 0xab, 0xfd, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x14, 0xaa, + 0x08, 0xfd, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xaf, 0xa9, + 0x21, 0x1c, 0x00, 0x72, 0xfd, 0x03, 0x00, 0x91, 0xf7, 0x63, 0x03, 0xa9, + 0xf9, 0x6b, 0x04, 0xa9, 0xfa, 0x03, 0x00, 0xaa, 0xe1, 0x7b, 0x00, 0xb9, + 0x41, 0x0a, 0x00, 0x54, 0x41, 0xb7, 0x40, 0xf9, 0xf3, 0x53, 0x01, 0xa9, + 0x60, 0x00, 0x80, 0x52, 0xf5, 0x5b, 0x02, 0xa9, 0xfb, 0x73, 0x05, 0xa9, + 0xe0, 0x6f, 0x00, 0xb9, 0x20, 0x30, 0x40, 0x39, 0x00, 0x00, 0x00, 0x32, + 0x20, 0x30, 0x00, 0x39, 0x40, 0x23, 0x40, 0xf9, 0x00, 0x84, 0x42, 0x39, + 0x20, 0x0a, 0x00, 0x35, 0x20, 0x01, 0x80, 0x52, 0xe0, 0xaf, 0x00, 0xb9, + 0xfc, 0x7b, 0x40, 0xb9, 0x02, 0x81, 0x8d, 0xd2, 0x01, 0xf7, 0x81, 0xd2, + 0x80, 0x1f, 0x40, 0x92, 0x02, 0x7c, 0x02, 0x9b, 0x00, 0x7c, 0x01, 0x9b, + 0xe2, 0x03, 0x08, 0xa9, 0x1f, 0x20, 0x03, 0xd5, 0x96, 0x1f, 0x40, 0x92, + 0x55, 0x83, 0x40, 0xa9, 0x14, 0x81, 0x8d, 0xd2, 0x01, 0xf7, 0x81, 0xd2, + 0x02, 0xc0, 0xa0, 0x52, 0xd4, 0x7e, 0x14, 0x9b, 0xc0, 0x02, 0x01, 0x9b, + 0xb3, 0x02, 0x14, 0x8b, 0x53, 0x83, 0x02, 0xa9, 0xa3, 0x1a, 0x40, 0x39, + 0x63, 0x1a, 0x00, 0x39, 0x41, 0x1f, 0x40, 0xf9, 0x22, 0x70, 0x00, 0xb9, + 0x22, 0x50, 0x07, 0xb8, 0x42, 0xd3, 0x44, 0x39, 0x82, 0x09, 0x00, 0x34, + 0xe3, 0x0f, 0x00, 0x35, 0xc4, 0x00, 0x80, 0x52, 0x22, 0x00, 0x80, 0x52, + 0x24, 0xd8, 0x01, 0x39, 0x22, 0xf4, 0x01, 0x39, 0x21, 0x00, 0x3c, 0x8b, + 0x78, 0x0a, 0x40, 0x91, 0x82, 0x7f, 0x40, 0x93, 0xe2, 0x3b, 0x00, 0xf9, + 0x37, 0xd4, 0x41, 0x39, 0x17, 0x9b, 0x27, 0x39, 0xff, 0x1a, 0x00, 0x71, + 0x40, 0x0a, 0x00, 0x54, 0xe1, 0x7b, 0x40, 0xb9, 0x9f, 0x03, 0x01, 0x6b, + 0x20, 0x18, 0x00, 0x54, 0xe0, 0x43, 0x40, 0xf9, 0x02, 0x81, 0x8d, 0xd2, + 0xa1, 0x02, 0x00, 0x8b, 0xe0, 0x03, 0x13, 0xaa, 0x7e, 0x42, 0x00, 0x94, + 0x40, 0x1b, 0x40, 0xf9, 0x02, 0xf7, 0x81, 0xd2, 0xe3, 0x47, 0x40, 0xf9, + 0x41, 0x0b, 0x40, 0xf9, 0x21, 0x00, 0x03, 0x8b, 0x78, 0x42, 0x00, 0x94, + 0x1c, 0x97, 0x27, 0x39, 0x17, 0x9b, 0x27, 0x39, 0x9c, 0x10, 0x00, 0x35, + 0xe0, 0x03, 0x1a, 0xaa, 0xe3, 0x0b, 0x00, 0x94, 0xe3, 0x03, 0x00, 0x2a, + 0xa0, 0x12, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, 0xf7, 0x03, 0x03, 0x2a, + 0xf5, 0x5b, 0x42, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0xe0, 0x03, 0x17, 0x2a, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfd, 0x7b, 0xd1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x7b, 0x40, 0xb9, 0x17, 0x02, 0x9c, 0x52, + 0x1f, 0x0c, 0x00, 0x71, 0x08, 0xff, 0xff, 0x54, 0xe0, 0x6f, 0x00, 0xb9, + 0x40, 0x23, 0x40, 0xf9, 0xf3, 0x53, 0x01, 0xa9, 0xf5, 0x5b, 0x02, 0xa9, + 0xfb, 0x73, 0x05, 0xa9, 0x00, 0x84, 0x42, 0x39, 0x20, 0xf6, 0xff, 0x34, + 0x1f, 0x04, 0x00, 0x71, 0xe2, 0x6f, 0x40, 0xb9, 0xe0, 0x07, 0x9f, 0x1a, + 0xe1, 0x7b, 0x40, 0xb9, 0x00, 0x28, 0x00, 0x11, 0xe0, 0xaf, 0x00, 0xb9, + 0x3f, 0x00, 0x02, 0x6b, 0x69, 0xf5, 0xff, 0x54, 0xe0, 0x03, 0x1a, 0xaa, + 0xf7, 0xfc, 0xff, 0x97, 0x40, 0x03, 0x40, 0x39, 0x59, 0x1b, 0x00, 0x94, + 0xf7, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x17, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xd1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x43, 0x08, 0x00, 0x34, 0x7f, 0x04, 0x00, 0x71, 0x20, 0x09, 0x00, 0x54, + 0x7f, 0x08, 0x00, 0x71, 0xc1, 0xf6, 0xff, 0x54, 0x22, 0x40, 0x80, 0x52, + 0x64, 0x60, 0x80, 0x52, 0x22, 0x10, 0x07, 0x78, 0x78, 0x0a, 0x40, 0x91, + 0x22, 0xec, 0x00, 0x79, 0x82, 0x7f, 0x40, 0x93, 0x24, 0xf4, 0x00, 0x79, + 0x3f, 0xf4, 0x01, 0x39, 0x21, 0x00, 0x3c, 0x8b, 0xe2, 0x3b, 0x00, 0xf9, + 0x37, 0xd4, 0x41, 0x39, 0x17, 0x9b, 0x27, 0x39, 0xff, 0x1a, 0x00, 0x71, + 0x01, 0xf6, 0xff, 0x54, 0xe0, 0x03, 0x13, 0xaa, 0x02, 0x81, 0x8d, 0xd2, + 0x01, 0x00, 0x80, 0x52, 0x91, 0x42, 0x00, 0x94, 0x00, 0x40, 0x85, 0xd2, + 0x73, 0x02, 0x00, 0x8b, 0x40, 0x1b, 0x40, 0xf9, 0x02, 0xf7, 0x81, 0xd2, + 0x01, 0x00, 0x80, 0x52, 0x8b, 0x42, 0x00, 0x94, 0xc0, 0xc0, 0x80, 0x52, + 0x60, 0x52, 0x1e, 0x78, 0xe1, 0x03, 0x1c, 0x2a, 0x02, 0x00, 0x80, 0x52, + 0x40, 0xb7, 0x40, 0xf9, 0x1f, 0xc8, 0x3c, 0x38, 0x40, 0x03, 0x40, 0x39, + 0x67, 0x1b, 0x00, 0x94, 0xe3, 0x03, 0x00, 0x2a, 0x7f, 0x00, 0x00, 0x71, + 0xe1, 0x6f, 0x40, 0xb9, 0x9c, 0x07, 0x00, 0x11, 0xe0, 0x17, 0x9f, 0x1a, + 0x9c, 0x1f, 0x00, 0x12, 0x1f, 0x00, 0x00, 0x71, 0x82, 0x13, 0x41, 0x7a, + 0x09, 0xef, 0xff, 0x54, 0xf7, 0x03, 0x03, 0x2a, 0x80, 0xf8, 0xff, 0x35, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xa8, 0xff, 0xff, 0x17, 0x7f, 0x04, 0x00, 0x71, 0x80, 0x03, 0x00, 0x54, + 0x7f, 0x08, 0x00, 0x71, 0x61, 0xf0, 0xff, 0x54, 0x26, 0x00, 0x80, 0x52, + 0x45, 0x60, 0x80, 0x52, 0x24, 0x40, 0x80, 0x52, 0x62, 0x00, 0x80, 0x52, + 0x26, 0xc4, 0x01, 0x39, 0x25, 0xe4, 0x00, 0x79, 0x24, 0xec, 0x00, 0x79, + 0x22, 0xe0, 0x01, 0x39, 0x3f, 0xf4, 0x01, 0x39, 0x79, 0xff, 0xff, 0x17, + 0x97, 0x06, 0x9c, 0x52, 0xe0, 0x03, 0x17, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xd1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xc4, 0x00, 0x80, 0x52, 0x42, 0x20, 0x80, 0x52, 0x24, 0xd8, 0x01, 0x39, + 0x22, 0xf4, 0x00, 0x79, 0x23, 0xf4, 0x01, 0x39, 0x6a, 0xff, 0xff, 0x17, + 0x42, 0x00, 0x80, 0x52, 0x22, 0xc4, 0x01, 0x39, 0x23, 0xd8, 0x01, 0x39, + 0x23, 0xf4, 0x01, 0x39, 0x65, 0xff, 0xff, 0x17, 0x42, 0x07, 0x40, 0xf9, + 0x00, 0xfc, 0x83, 0xd2, 0x43, 0x13, 0x40, 0xf9, 0x41, 0x00, 0x14, 0x8b, + 0x42, 0x68, 0x74, 0x78, 0xc0, 0x0e, 0x00, 0x9b, 0xe2, 0xee, 0xff, 0x34, + 0x42, 0x04, 0x00, 0x51, 0x03, 0x40, 0x00, 0x91, 0x21, 0x5c, 0x00, 0x91, + 0x62, 0x50, 0x22, 0x8b, 0x21, 0x80, 0x5f, 0xfc, 0x20, 0x54, 0x41, 0xfc, + 0x01, 0x00, 0x00, 0x6d, 0x00, 0x40, 0x00, 0x91, 0x5f, 0x00, 0x00, 0xeb, + 0x61, 0xff, 0xff, 0x54, 0xe0, 0x03, 0x1a, 0xaa, 0x4f, 0x0b, 0x00, 0x94, + 0xe3, 0x03, 0x00, 0x2a, 0xa0, 0xed, 0xff, 0x35, 0xe0, 0x03, 0x1a, 0xaa, + 0x01, 0x00, 0x80, 0x52, 0x5e, 0x08, 0x00, 0x94, 0xe3, 0x03, 0x00, 0x2a, + 0x00, 0xed, 0xff, 0x35, 0x9c, 0x34, 0x00, 0x35, 0xe0, 0x03, 0x1a, 0xaa, + 0x01, 0x00, 0x80, 0x52, 0xa0, 0xfb, 0xff, 0x97, 0xe3, 0x03, 0x00, 0x2a, + 0x40, 0xec, 0xff, 0x35, 0x40, 0x03, 0x40, 0x39, 0x01, 0xa3, 0x67, 0x39, + 0x4f, 0xb4, 0xff, 0x97, 0xe2, 0x03, 0x00, 0x2a, 0xe0, 0x35, 0x00, 0x34, + 0xa3, 0x00, 0x00, 0xf0, 0x63, 0xc0, 0x0d, 0x91, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0x77, 0x05, 0x9c, 0x52, 0x77, 0x81, 0xff, 0x97, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0x57, 0xff, 0xff, 0x17, 0xa1, 0x00, 0x00, 0xf0, 0x21, 0x60, 0x12, 0x91, + 0x04, 0x40, 0x85, 0xd2, 0x47, 0x03, 0x40, 0x39, 0x62, 0x02, 0x04, 0x8b, + 0x04, 0xe0, 0x00, 0x91, 0x26, 0x90, 0x40, 0x39, 0xf7, 0x03, 0x04, 0xaa, + 0x79, 0x1e, 0x40, 0x39, 0xc5, 0xc3, 0x83, 0x52, 0x64, 0x22, 0x40, 0x39, + 0xe6, 0x33, 0x04, 0x39, 0x3b, 0x0f, 0x00, 0x12, 0x66, 0x26, 0x40, 0x39, + 0x39, 0x7f, 0x04, 0x53, 0x07, 0x83, 0x27, 0x39, 0x21, 0x20, 0x40, 0xb9, + 0x67, 0x16, 0x40, 0x39, 0x07, 0x87, 0x27, 0x39, 0xe7, 0xaf, 0x40, 0xb9, + 0x07, 0x8b, 0x27, 0x39, 0x07, 0x8f, 0x27, 0x39, 0x87, 0x7c, 0x04, 0x53, + 0xe1, 0x0b, 0x01, 0xb9, 0x41, 0x23, 0x40, 0xf9, 0xe5, 0xa3, 0x01, 0x79, + 0x85, 0x0c, 0x00, 0x12, 0xc4, 0x0c, 0x00, 0x12, 0xe7, 0xbb, 0x00, 0xb9, + 0x21, 0x88, 0x42, 0x39, 0x01, 0x93, 0x27, 0x39, 0xff, 0xb3, 0x01, 0x79, + 0x61, 0x12, 0x40, 0x39, 0x03, 0x9f, 0x27, 0x39, 0xc3, 0x7c, 0x04, 0x53, + 0xe3, 0xbf, 0x00, 0xb9, 0xe3, 0xc7, 0x03, 0x39, 0x63, 0x2a, 0x00, 0x91, + 0x01, 0x97, 0x27, 0x39, 0x01, 0x00, 0x80, 0x52, 0x5f, 0x90, 0x1e, 0x78, + 0x02, 0xf7, 0x81, 0xd2, 0xe3, 0x5b, 0x00, 0xf9, 0xff, 0xc3, 0x01, 0x79, + 0xe5, 0xa3, 0x03, 0x39, 0xe7, 0xa7, 0x03, 0x39, 0xe4, 0xc3, 0x03, 0x39, + 0xe5, 0xe3, 0x03, 0x39, 0xff, 0xe7, 0x03, 0x39, 0xe4, 0x03, 0x04, 0x39, + 0xff, 0x07, 0x04, 0x39, 0xef, 0x41, 0x00, 0x94, 0x40, 0x1b, 0x40, 0xf9, + 0x02, 0x00, 0x80, 0x92, 0x03, 0x00, 0x80, 0x92, 0x01, 0x00, 0x80, 0x12, + 0x00, 0x04, 0x00, 0x91, 0x01, 0x60, 0x00, 0x79, 0x02, 0x0c, 0x00, 0xa9, + 0x02, 0x0c, 0x01, 0xa9, 0x02, 0x0c, 0x02, 0xa9, 0xe2, 0x1f, 0x80, 0x52, + 0x48, 0x1b, 0x40, 0xf9, 0x01, 0xa9, 0x34, 0x39, 0x02, 0x51, 0x1a, 0x79, + 0xa0, 0x6a, 0x74, 0x78, 0xe0, 0xab, 0x00, 0xb9, 0x40, 0x23, 0x00, 0x34, + 0xe0, 0xab, 0x40, 0xb9, 0x62, 0x7e, 0x00, 0x91, 0xa3, 0x02, 0x80, 0x52, + 0xf1, 0x63, 0x03, 0x91, 0x01, 0x04, 0x00, 0x51, 0x60, 0x2a, 0x00, 0x91, + 0x21, 0x3c, 0x00, 0x12, 0xf2, 0x83, 0x03, 0x91, 0xe9, 0x43, 0x03, 0x91, + 0xe5, 0x03, 0x00, 0xaa, 0x62, 0x08, 0xa1, 0x9b, 0x04, 0x00, 0x00, 0x14, + 0x00, 0x54, 0x00, 0x91, 0x5f, 0x00, 0x00, 0xeb, 0x00, 0x02, 0x00, 0x54, + 0x01, 0x30, 0x40, 0x78, 0x3f, 0x04, 0x00, 0x71, 0x68, 0xff, 0xff, 0x54, + 0x04, 0x00, 0xc0, 0x39, 0x03, 0x04, 0xc0, 0x39, 0x27, 0xc9, 0xe1, 0x38, + 0x86, 0x00, 0x03, 0x0b, 0xdf, 0x00, 0x07, 0x6b, 0xaa, 0xfe, 0xff, 0x54, + 0x26, 0xc9, 0x21, 0x38, 0x00, 0x54, 0x00, 0x91, 0x24, 0xca, 0x21, 0x38, + 0x5f, 0x00, 0x00, 0xeb, 0x43, 0xca, 0x21, 0x38, 0x41, 0xfe, 0xff, 0x54, + 0xa0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x13, 0x91, 0xe0, 0x4b, 0x00, 0xf9, + 0xa0, 0x00, 0x00, 0xf0, 0x00, 0x60, 0x13, 0x91, 0xe0, 0x4f, 0x00, 0xf9, + 0xa0, 0x00, 0x00, 0xf0, 0x00, 0x20, 0x13, 0x91, 0xf4, 0x67, 0x00, 0xf9, + 0xf4, 0x03, 0x17, 0xaa, 0x0e, 0x00, 0x80, 0x52, 0x6d, 0x00, 0x80, 0x52, + 0xec, 0x1f, 0x80, 0x52, 0xff, 0x7f, 0x00, 0xb9, 0xe0, 0x53, 0x00, 0xf9, + 0xa0, 0x00, 0x00, 0xf0, 0x00, 0x80, 0x13, 0x91, 0xe0, 0x63, 0x00, 0xf9, + 0xa2, 0x30, 0x40, 0x78, 0xab, 0x04, 0xc0, 0x39, 0xa9, 0x00, 0xc0, 0x39, + 0x5f, 0x04, 0x00, 0x71, 0x6f, 0x1d, 0x00, 0x12, 0xe1, 0x03, 0x0b, 0x2a, + 0x23, 0xca, 0x62, 0x38, 0xe6, 0x03, 0x09, 0x2a, 0x44, 0xca, 0x62, 0x38, + 0x23, 0x01, 0x03, 0x4b, 0xe4, 0x01, 0x04, 0x4b, 0x63, 0x1c, 0x00, 0x12, + 0x84, 0x1c, 0x00, 0x12, 0x28, 0x01, 0x00, 0x54, 0xe0, 0xe3, 0x03, 0x91, + 0x06, 0xc8, 0x62, 0x38, 0xe0, 0x03, 0x04, 0x91, 0x66, 0x00, 0x06, 0x0b, + 0x01, 0xc8, 0x62, 0x38, 0xc6, 0x1c, 0x00, 0x13, 0x81, 0x00, 0x01, 0x0b, + 0x21, 0x1c, 0x00, 0x13, 0x60, 0x16, 0x40, 0x39, 0x00, 0x04, 0x00, 0x51, + 0x00, 0x1c, 0x00, 0x12, 0x1f, 0x18, 0x00, 0x71, 0x48, 0x0b, 0x00, 0x54, + 0xe7, 0x2b, 0x49, 0xa9, 0x00, 0x1c, 0x40, 0x92, 0xf0, 0x53, 0x40, 0xf9, + 0xe7, 0x68, 0xe0, 0x38, 0x4a, 0x69, 0x60, 0x38, 0x00, 0x7a, 0x60, 0x78, + 0x00, 0x24, 0xc2, 0x1a, 0xe0, 0x0a, 0x00, 0x36, 0x62, 0x19, 0x00, 0x35, + 0x37, 0x1c, 0x00, 0x12, 0x3f, 0x0c, 0x00, 0x71, 0xe0, 0x06, 0x17, 0x0b, + 0x07, 0x1c, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x13, 0xcd, 0x04, 0x00, 0x54, + 0x6a, 0x00, 0x80, 0x52, 0x11, 0x00, 0x00, 0x14, 0x5f, 0x0d, 0x00, 0x71, + 0x10, 0x00, 0x80, 0x52, 0x27, 0x00, 0x80, 0x52, 0x80, 0x00, 0x00, 0x54, + 0x5f, 0x15, 0x00, 0x71, 0x90, 0x01, 0x9f, 0x1a, 0xa7, 0x01, 0x9f, 0x1a, + 0xe0, 0x00, 0x00, 0x0b, 0x4a, 0x05, 0x00, 0x11, 0x00, 0x00, 0x10, 0x4b, + 0x3f, 0x80, 0x2a, 0x6b, 0x07, 0x1c, 0x00, 0x12, 0x4a, 0x1d, 0x00, 0x13, + 0x00, 0x1c, 0x00, 0x13, 0x60, 0x02, 0x00, 0x54, 0x1f, 0x20, 0x03, 0xd5, + 0x47, 0x21, 0x00, 0x51, 0x5f, 0x1d, 0x00, 0x71, 0xe7, 0x1c, 0x00, 0x12, + 0xe0, 0x07, 0x00, 0x54, 0x8d, 0xfd, 0xff, 0x54, 0xff, 0x04, 0x00, 0x71, + 0x07, 0x00, 0x80, 0x52, 0xf0, 0x83, 0x9f, 0x5a, 0xe0, 0x00, 0x00, 0x0b, + 0x10, 0x1e, 0x00, 0x12, 0x4a, 0x05, 0x00, 0x11, 0x00, 0x00, 0x10, 0x4b, + 0x3f, 0x80, 0x2a, 0x6b, 0x07, 0x1c, 0x00, 0x12, 0x4a, 0x1d, 0x00, 0x13, + 0x00, 0x1c, 0x00, 0x13, 0x01, 0xfe, 0xff, 0x54, 0x3f, 0x20, 0x00, 0x71, + 0xe0, 0x1c, 0x00, 0x54, 0x3f, 0x20, 0x00, 0x71, 0x0c, 0x07, 0x00, 0x54, + 0x2a, 0x78, 0x1e, 0x12, 0x5f, 0x15, 0x00, 0x71, 0x80, 0x18, 0x00, 0x54, + 0x0a, 0x00, 0x80, 0x52, 0x1e, 0x00, 0x80, 0x52, 0x10, 0x00, 0x80, 0x52, + 0x21, 0x00, 0x0a, 0x0b, 0xdf, 0x00, 0x01, 0x6b, 0x00, 0x05, 0x00, 0x54, + 0xc6, 0x00, 0x17, 0x4b, 0x10, 0x02, 0x1e, 0x0b, 0xc6, 0x00, 0x10, 0x4b, + 0xe7, 0x00, 0x06, 0x0b, 0xe7, 0x1c, 0x00, 0x12, 0xff, 0xc4, 0x00, 0x71, + 0x68, 0x04, 0x00, 0x54, 0xe0, 0x1c, 0x00, 0x13, 0x01, 0x91, 0x46, 0xf9, + 0x26, 0x24, 0xc0, 0x9a, 0x46, 0x05, 0x00, 0x36, 0x06, 0xc5, 0x20, 0x8b, + 0xa1, 0x02, 0x80, 0x52, 0xea, 0x5b, 0x40, 0xf9, 0x00, 0x7c, 0x40, 0x93, + 0xc6, 0x70, 0x59, 0x79, 0xc1, 0x7c, 0xa1, 0x9b, 0x46, 0x01, 0x01, 0x8b, + 0x41, 0x69, 0xe1, 0x38, 0x3f, 0x00, 0x09, 0x6b, 0x40, 0x14, 0x00, 0x54, + 0xb7, 0x00, 0x9c, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0x6f, 0xfe, 0xff, 0x17, 0x20, 0x00, 0x80, 0x52, + 0x0a, 0x00, 0x80, 0x52, 0x07, 0x00, 0x80, 0x52, 0x00, 0x24, 0xc2, 0x1a, + 0x60, 0xf5, 0x07, 0x37, 0x97, 0x00, 0x9c, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0x65, 0xfe, 0xff, 0x17, + 0xf0, 0x1f, 0x80, 0x52, 0x07, 0x00, 0x80, 0x52, 0xb3, 0xff, 0xff, 0x17, + 0xff, 0xc4, 0x00, 0x71, 0x09, 0xfc, 0xff, 0x54, 0x57, 0x00, 0x9c, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0x5b, 0xfe, 0xff, 0x17, 0x3f, 0x24, 0x00, 0x71, 0x61, 0xf9, 0xff, 0x54, + 0x4a, 0x00, 0x80, 0x12, 0x5e, 0x00, 0x80, 0x52, 0xf0, 0x03, 0x0a, 0x2a, + 0xca, 0xff, 0xff, 0x17, 0x0a, 0x01, 0x40, 0x39, 0x26, 0x00, 0x80, 0xd2, + 0xc6, 0x20, 0xc0, 0x9a, 0xc1, 0x00, 0x01, 0xaa, 0x0a, 0x01, 0x0a, 0x8b, + 0x06, 0xc5, 0x20, 0x8b, 0x01, 0x91, 0x06, 0xf9, 0x01, 0x01, 0x40, 0x39, + 0x40, 0x05, 0x00, 0x39, 0x00, 0x7c, 0x40, 0x93, 0xce, 0x70, 0x19, 0x79, + 0x21, 0x04, 0x00, 0x11, 0x01, 0x01, 0x00, 0x39, 0x5f, 0x04, 0x00, 0x71, + 0xd0, 0x35, 0x46, 0xd3, 0xca, 0x15, 0x00, 0x12, 0x49, 0x02, 0x00, 0x54, + 0xe1, 0x01, 0x1b, 0x0b, 0x21, 0x1c, 0x00, 0x12, 0x3f, 0x34, 0x00, 0x71, + 0xe9, 0x06, 0x00, 0x54, 0xef, 0x03, 0x00, 0xaa, 0x00, 0x1e, 0x7d, 0xd3, + 0x21, 0x00, 0x80, 0xd2, 0x97, 0x05, 0x9c, 0x52, 0x00, 0x18, 0x0f, 0x8b, + 0x22, 0x20, 0xca, 0x9a, 0xf5, 0x5b, 0x42, 0xa9, 0x81, 0x6a, 0x60, 0xf8, + 0xfb, 0x73, 0x45, 0xa9, 0x21, 0x00, 0x02, 0xaa, 0x81, 0x6a, 0x20, 0xf8, + 0xf3, 0x53, 0x41, 0xa9, 0x33, 0xfe, 0xff, 0x17, 0xe1, 0x7f, 0x40, 0xb9, + 0x01, 0x05, 0x00, 0x35, 0xa1, 0x08, 0x40, 0x39, 0xc1, 0x04, 0x00, 0x35, + 0x61, 0x03, 0x19, 0x0b, 0x3f, 0x00, 0x09, 0x6b, 0xe1, 0x17, 0x9f, 0x1a, + 0x7f, 0x01, 0x1b, 0x6b, 0x21, 0x00, 0x9f, 0x1a, 0xe1, 0x7f, 0x00, 0xb9, + 0xe1, 0x03, 0x00, 0x34, 0xe6, 0xa3, 0x03, 0x91, 0xe1, 0xc3, 0x03, 0x91, + 0xc9, 0xc8, 0x62, 0x38, 0x21, 0xc8, 0x62, 0x38, 0x46, 0x17, 0x40, 0xf9, + 0x84, 0x00, 0x01, 0x0b, 0x63, 0x00, 0x09, 0x0b, 0x69, 0x1c, 0x00, 0x12, + 0xc3, 0x08, 0x40, 0x91, 0x86, 0x1c, 0x00, 0x12, 0x24, 0x01, 0x24, 0x4b, + 0xc1, 0x00, 0x09, 0x4b, 0x82, 0x1c, 0x00, 0x13, 0xe4, 0xf3, 0x42, 0x39, + 0x5f, 0x00, 0x00, 0x71, 0x21, 0x1c, 0x00, 0x12, 0x64, 0xe8, 0x27, 0x39, + 0x21, 0xb0, 0x9f, 0x1a, 0xe4, 0xe3, 0x42, 0x39, 0x42, 0xa0, 0x9f, 0x1a, + 0x7f, 0xe0, 0x27, 0x39, 0x69, 0xe4, 0x27, 0x39, 0x64, 0xec, 0x27, 0x39, + 0x62, 0xf0, 0x27, 0x39, 0x61, 0xf4, 0x27, 0x39, 0x01, 0xf3, 0x67, 0x39, + 0xc6, 0x00, 0x01, 0x0b, 0x06, 0xa3, 0x27, 0x39, 0x0e, 0x51, 0x1a, 0x79, + 0x07, 0xa9, 0x34, 0x39, 0x00, 0xe4, 0x7a, 0xd3, 0x21, 0x00, 0x80, 0xd2, + 0x10, 0x4c, 0x30, 0x8b, 0x2a, 0x20, 0xca, 0x9a, 0xe1, 0xab, 0x40, 0xb9, + 0xc0, 0x05, 0x00, 0x11, 0x0e, 0x3c, 0x00, 0x12, 0xa5, 0x54, 0x00, 0x91, + 0x3f, 0x20, 0x20, 0x6b, 0x80, 0x6a, 0x70, 0xf8, 0x00, 0x00, 0x0a, 0xaa, + 0x80, 0x6a, 0x30, 0xf8, 0x61, 0xe3, 0xff, 0x54, 0xe0, 0x7f, 0x40, 0xb9, + 0xf4, 0x67, 0x40, 0xf9, 0x20, 0x0a, 0x00, 0x35, 0x97, 0x05, 0x9c, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xf5, 0xfd, 0xff, 0x17, 0x5f, 0x04, 0x00, 0x71, 0xe0, 0x02, 0x00, 0x54, + 0x26, 0x02, 0x00, 0x35, 0x3f, 0x00, 0x00, 0x71, 0x20, 0xc0, 0x47, 0x7a, + 0xcc, 0x01, 0x00, 0x54, 0x40, 0x1c, 0x00, 0x51, 0x46, 0x02, 0x80, 0x52, + 0xe7, 0x63, 0x40, 0xf9, 0x00, 0x7c, 0x40, 0x93, 0x21, 0x04, 0x00, 0x51, + 0x00, 0x04, 0x00, 0x8b, 0xe0, 0x04, 0x00, 0x8b, 0x40, 0x01, 0xa6, 0x9b, + 0x00, 0xc8, 0xe1, 0x38, 0x07, 0x1c, 0x00, 0x12, 0xff, 0xc4, 0x00, 0x71, + 0x69, 0xec, 0xff, 0x54, 0x83, 0xff, 0xff, 0x17, 0x77, 0x00, 0x9c, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xdd, 0xfd, 0xff, 0x17, 0x21, 0x04, 0x01, 0x0b, 0x26, 0x00, 0x06, 0x0b, + 0xc7, 0x1c, 0x00, 0x12, 0xff, 0xc4, 0x00, 0x71, 0xe9, 0xea, 0xff, 0x54, + 0x57, 0x00, 0x9c, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xd3, 0xfd, 0xff, 0x17, 0xc1, 0x04, 0xc0, 0x39, + 0x3f, 0x00, 0x0b, 0x6b, 0xa1, 0xeb, 0xff, 0x54, 0xc1, 0x30, 0x40, 0x78, + 0x3f, 0x00, 0x02, 0x6b, 0x41, 0xeb, 0xff, 0x54, 0x85, 0xff, 0xff, 0x17, + 0x0a, 0x00, 0x80, 0x12, 0x1e, 0x00, 0x80, 0x52, 0xf0, 0x03, 0x0a, 0x2a, + 0x3d, 0xff, 0xff, 0x17, 0xa2, 0x6a, 0x74, 0x78, 0x40, 0x1b, 0x40, 0xf9, + 0x01, 0x50, 0x5a, 0x79, 0xe2, 0x12, 0x00, 0x34, 0x04, 0xe4, 0x00, 0x2f, + 0x73, 0x3e, 0x00, 0x91, 0x00, 0x00, 0x80, 0x52, 0x03, 0x10, 0x6e, 0x1e, + 0x61, 0x0a, 0x40, 0x6d, 0x3f, 0x00, 0x00, 0x6b, 0x73, 0x56, 0x00, 0x91, + 0x00, 0x04, 0x00, 0x11, 0x60, 0x0c, 0x64, 0x1e, 0x48, 0x20, 0x60, 0x1e, + 0x20, 0x04, 0x60, 0x1e, 0x20, 0x11, 0x00, 0x54, 0xe1, 0x03, 0x1c, 0x2a, + 0xe0, 0x03, 0x1a, 0xaa, 0xed, 0xf9, 0xff, 0x97, 0xe3, 0x03, 0x00, 0x2a, + 0xfe, 0xfd, 0xff, 0x17, 0x40, 0x03, 0x40, 0x39, 0x01, 0x03, 0x80, 0x52, + 0xb8, 0x18, 0x00, 0x94, 0xe3, 0x03, 0x00, 0x2a, 0xf9, 0xfd, 0xff, 0x17, + 0x2a, 0x00, 0x80, 0x12, 0x3e, 0x00, 0x80, 0x52, 0xf0, 0x03, 0x0a, 0x2a, + 0x1f, 0xff, 0xff, 0x17, 0x40, 0x17, 0x40, 0xf9, 0xe0, 0x4b, 0x00, 0xf9, + 0x21, 0x10, 0x90, 0x52, 0x01, 0x10, 0xb0, 0x72, 0x17, 0xc1, 0x34, 0x91, + 0x12, 0x00, 0x80, 0x52, 0x0d, 0x00, 0x40, 0x79, 0xa0, 0xf9, 0x03, 0x11, + 0x00, 0x7c, 0xa1, 0x9b, 0x00, 0xfc, 0x67, 0xd3, 0x00, 0xc1, 0x34, 0x39, + 0x00, 0x1c, 0x00, 0x12, 0x10, 0x1c, 0x00, 0x12, 0x1f, 0x0a, 0x00, 0x71, + 0x88, 0x01, 0x00, 0x54, 0xa2, 0x09, 0xc0, 0x1a, 0x41, 0xb4, 0x00, 0x1b, + 0x52, 0x3c, 0x00, 0x12, 0x00, 0x04, 0x00, 0x11, 0x21, 0x00, 0x02, 0x0b, + 0x3f, 0xfc, 0x03, 0x71, 0x0d, 0x0e, 0x00, 0x54, 0xe0, 0x02, 0x00, 0x39, + 0x10, 0x1c, 0x00, 0x12, 0x1f, 0x0a, 0x00, 0x71, 0xc9, 0xfe, 0xff, 0x54, + 0xbf, 0x01, 0x00, 0x71, 0x23, 0x2f, 0x9c, 0x52, 0xe0, 0x07, 0x9f, 0x1a, + 0x0a, 0x00, 0x80, 0x52, 0xff, 0x7f, 0x00, 0xb9, 0xff, 0x9b, 0x00, 0xb9, + 0xe0, 0xa3, 0x00, 0xb9, 0x5f, 0x01, 0x0d, 0x6b, 0x02, 0x00, 0x80, 0x52, + 0x0c, 0x00, 0x80, 0x52, 0x22, 0x07, 0x00, 0x54, 0x00, 0x06, 0x00, 0x51, + 0x7e, 0x03, 0x19, 0x0b, 0x00, 0x1c, 0x00, 0x12, 0xe3, 0xab, 0x00, 0xb9, + 0xe3, 0x03, 0x00, 0x2a, 0x31, 0x00, 0x80, 0xd2, 0xe1, 0x9b, 0x40, 0xb9, + 0xe0, 0x4b, 0x40, 0xf9, 0x04, 0x28, 0x00, 0x91, 0x00, 0x00, 0x80, 0x52, + 0x01, 0x01, 0x00, 0x35, 0x28, 0x00, 0x00, 0x14, 0xff, 0x00, 0x06, 0x6b, + 0x80, 0x02, 0x00, 0x54, 0xbf, 0x21, 0x20, 0x6b, 0x84, 0x54, 0x00, 0x91, + 0x00, 0x3c, 0x00, 0x12, 0x40, 0x04, 0x00, 0x54, 0x87, 0x04, 0xc0, 0x39, + 0x01, 0x34, 0x46, 0xd3, 0x8f, 0x00, 0xc0, 0x39, 0x21, 0x0c, 0x22, 0x8b, + 0xe5, 0x00, 0x19, 0x0b, 0x29, 0x22, 0xc0, 0x9a, 0xe6, 0x01, 0x19, 0x4b, + 0xa5, 0x00, 0x0c, 0x0b, 0x4b, 0x05, 0x00, 0x11, 0xee, 0x02, 0x22, 0x8b, + 0xe1, 0x0e, 0x01, 0x8b, 0x00, 0x04, 0x00, 0x11, 0xc6, 0x00, 0x0c, 0x0b, + 0xff, 0x01, 0x05, 0x6b, 0x81, 0xfd, 0xff, 0x54, 0xdf, 0x03, 0x0f, 0x6b, + 0x60, 0x03, 0x47, 0x7a, 0x60, 0xfd, 0xff, 0x54, 0x25, 0x04, 0x40, 0xf9, + 0x6a, 0x3d, 0x00, 0x12, 0x84, 0x54, 0x00, 0x91, 0x29, 0x01, 0x05, 0xaa, + 0x29, 0x04, 0x00, 0xf9, 0x42, 0x09, 0xd2, 0x1a, 0xc1, 0x05, 0x40, 0x39, + 0x21, 0x04, 0x00, 0x11, 0xc1, 0x05, 0x00, 0x39, 0x1f, 0x02, 0x22, 0x6b, + 0x42, 0x1c, 0x00, 0x12, 0x62, 0x90, 0x82, 0x1a, 0xbf, 0x21, 0x20, 0x6b, + 0x00, 0x3c, 0x00, 0x12, 0x01, 0xfc, 0xff, 0x54, 0x8c, 0x05, 0x00, 0x11, + 0xbf, 0x01, 0x0a, 0x6b, 0x8c, 0x1d, 0x00, 0x13, 0x08, 0xfa, 0xff, 0x54, + 0xe3, 0xab, 0x40, 0xb9, 0xe0, 0xa3, 0x40, 0xb9, 0xc0, 0x02, 0x00, 0x34, + 0x06, 0xe5, 0x36, 0x91, 0x00, 0x00, 0x80, 0xd2, 0x05, 0x00, 0x80, 0x52, + 0x02, 0x00, 0x80, 0x52, 0x04, 0x00, 0x80, 0x52, 0x81, 0x34, 0x46, 0xd3, + 0xa7, 0x04, 0x00, 0x11, 0x49, 0x04, 0x00, 0x11, 0xe1, 0x0e, 0x01, 0x8b, + 0x21, 0x04, 0x40, 0xf9, 0x21, 0x24, 0xc0, 0x9a, 0x61, 0x19, 0x00, 0x36, + 0xc2, 0x68, 0x20, 0x38, 0x01, 0x51, 0x5a, 0x79, 0x3f, 0x00, 0x04, 0x6b, + 0xa0, 0x18, 0x00, 0x54, 0x22, 0x1d, 0x00, 0x12, 0x00, 0x04, 0x00, 0x91, + 0x04, 0x3c, 0x00, 0x12, 0xbf, 0x21, 0x20, 0x6b, 0x28, 0xfe, 0xff, 0x54, + 0xe0, 0x7f, 0x40, 0xb9, 0xe0, 0x05, 0x00, 0x35, 0x7f, 0x00, 0x00, 0x71, + 0xf7, 0x03, 0x03, 0x2a, 0xe0, 0x17, 0x9f, 0x1a, 0x84, 0xfd, 0xff, 0x17, + 0x5f, 0x00, 0x00, 0x6b, 0xe1, 0xed, 0xff, 0x54, 0xe3, 0x3b, 0x40, 0xf9, + 0xe1, 0x03, 0x1c, 0x2a, 0x40, 0xb7, 0x40, 0xf9, 0x02, 0x00, 0x80, 0x52, + 0x1f, 0x68, 0x23, 0x38, 0x40, 0x03, 0x40, 0x39, 0xd7, 0x18, 0x00, 0x94, + 0xe3, 0x03, 0x00, 0x2a, 0x70, 0xfd, 0xff, 0x17, 0xed, 0x03, 0x00, 0x34, + 0xe0, 0x4b, 0x40, 0xf9, 0x25, 0x03, 0x1b, 0x0b, 0x0a, 0x00, 0x80, 0x52, + 0x24, 0x00, 0x80, 0xd2, 0x01, 0x28, 0x00, 0x91, 0x00, 0x00, 0x80, 0x52, + 0x05, 0x00, 0x00, 0x14, 0x21, 0x54, 0x00, 0x91, 0xbf, 0x21, 0x26, 0x6b, + 0xc0, 0x3c, 0x00, 0x12, 0x00, 0x15, 0x00, 0x54, 0x22, 0x00, 0xc0, 0x39, + 0x06, 0x04, 0x00, 0x11, 0x5f, 0x00, 0x05, 0x6b, 0x21, 0xff, 0xff, 0x54, + 0x22, 0x04, 0xc0, 0x39, 0x5f, 0x00, 0x1b, 0x6b, 0xc1, 0xfe, 0xff, 0x54, + 0x02, 0x34, 0x46, 0xd3, 0x80, 0x20, 0xc0, 0x9a, 0x4a, 0x05, 0x00, 0x11, + 0x02, 0x0d, 0x02, 0x8b, 0x4a, 0x3d, 0x00, 0x12, 0x43, 0x9c, 0x46, 0xf9, + 0x60, 0x00, 0x00, 0xaa, 0x40, 0x9c, 0x06, 0xf9, 0xe0, 0x06, 0x40, 0x39, + 0x00, 0x04, 0x00, 0x11, 0xe0, 0x06, 0x00, 0x39, 0xea, 0xff, 0xff, 0x17, + 0x00, 0x91, 0x46, 0xf9, 0x60, 0xfa, 0x14, 0xf9, 0x70, 0x9f, 0xff, 0x34, + 0x00, 0xfc, 0x83, 0xd2, 0x03, 0x00, 0x80, 0x52, 0xfb, 0x03, 0x03, 0x2a, + 0x19, 0x00, 0x80, 0x52, 0xd6, 0x7e, 0x00, 0x9b, 0x20, 0x1f, 0x40, 0x92, + 0x42, 0x20, 0x84, 0xd2, 0x03, 0x40, 0x85, 0xd2, 0x01, 0x00, 0x80, 0x52, + 0x00, 0x4c, 0x02, 0x9b, 0x00, 0x00, 0x03, 0x8b, 0xc3, 0x3f, 0x00, 0x94, + 0x2e, 0x7f, 0x40, 0x93, 0x41, 0x20, 0x84, 0xd2, 0x20, 0x10, 0x82, 0xd2, + 0xe8, 0x23, 0x04, 0x91, 0xc7, 0xf1, 0x7d, 0xd3, 0x10, 0x15, 0x00, 0x91, + 0xc3, 0x7d, 0x01, 0x9b, 0x8c, 0x10, 0x80, 0xd2, 0xce, 0x7d, 0x00, 0x9b, + 0x0f, 0xa0, 0x82, 0xd2, 0x6b, 0x02, 0x03, 0x8b, 0x6b, 0x09, 0x40, 0x91, + 0x0a, 0x00, 0x80, 0x52, 0x1f, 0x20, 0x03, 0xd5, 0x60, 0x01, 0x68, 0x39, + 0x4d, 0x1d, 0x00, 0x12, 0x1f, 0xfc, 0x00, 0x71, 0xa8, 0x0c, 0x00, 0x54, + 0x06, 0x7c, 0x40, 0x93, 0x65, 0x02, 0x40, 0x79, 0xc6, 0x0c, 0x0c, 0x9b, + 0x66, 0x02, 0x06, 0x8b, 0xc6, 0x08, 0x40, 0x91, 0xc9, 0x08, 0x54, 0x79, + 0x45, 0x06, 0x00, 0x34, 0x64, 0x2e, 0x00, 0x91, 0x01, 0x00, 0x80, 0x52, + 0x05, 0x00, 0x00, 0x14, 0x84, 0x54, 0x00, 0x91, 0xbf, 0x20, 0x22, 0x6b, + 0x41, 0x3c, 0x00, 0x12, 0x60, 0x05, 0x00, 0x54, 0x20, 0x34, 0x46, 0xd3, + 0x22, 0x04, 0x00, 0x11, 0xe0, 0x00, 0x00, 0x8b, 0xe0, 0x0e, 0x00, 0x8b, + 0x00, 0x04, 0x40, 0xf9, 0x00, 0x24, 0xc1, 0x9a, 0xc0, 0xfe, 0x07, 0x36, + 0x00, 0x01, 0x40, 0x39, 0x91, 0x04, 0x40, 0x79, 0x3f, 0x02, 0x00, 0x6b, + 0x41, 0xfe, 0xff, 0x54, 0x91, 0x00, 0xc0, 0x39, 0x3f, 0x02, 0x0a, 0x6b, + 0xe1, 0xfd, 0xff, 0x54, 0x3f, 0xfd, 0x00, 0x71, 0x28, 0x08, 0x00, 0x54, + 0x69, 0x01, 0x68, 0x39, 0x84, 0x54, 0x00, 0x91, 0xbf, 0x20, 0x22, 0x6b, + 0x29, 0x0d, 0x0c, 0x9b, 0x69, 0x02, 0x09, 0x8b, 0x29, 0x09, 0x40, 0x91, + 0x2d, 0x0d, 0x28, 0x39, 0x69, 0x01, 0x68, 0x39, 0x29, 0x0d, 0x0c, 0x9b, + 0x69, 0x02, 0x09, 0x8b, 0x29, 0x09, 0x40, 0x91, 0x20, 0x09, 0x28, 0x39, + 0x60, 0x01, 0x68, 0x39, 0xc9, 0x08, 0x54, 0x79, 0x00, 0x14, 0x00, 0x8b, + 0xc0, 0x05, 0x00, 0x8b, 0x00, 0x00, 0x09, 0x8b, 0x00, 0x00, 0x0f, 0x8b, + 0x60, 0x06, 0x00, 0x8b, 0x01, 0x0c, 0x00, 0x79, 0x41, 0x3c, 0x00, 0x12, + 0xc9, 0x08, 0x54, 0x79, 0x29, 0x05, 0x00, 0x11, 0x29, 0x3d, 0x00, 0x12, + 0xc9, 0x08, 0x14, 0x79, 0xe1, 0xfa, 0xff, 0x54, 0x09, 0x05, 0x00, 0x35, + 0x4a, 0x05, 0x00, 0x11, 0x5f, 0x39, 0x00, 0x71, 0x21, 0xf8, 0xff, 0x54, + 0x08, 0x05, 0x00, 0x91, 0x1f, 0x02, 0x08, 0xeb, 0x81, 0xf7, 0xff, 0x54, + 0x43, 0x07, 0x40, 0xf9, 0x40, 0x13, 0x40, 0xf9, 0x61, 0x00, 0x14, 0x8b, + 0x62, 0x68, 0x74, 0x78, 0x00, 0x00, 0x16, 0x8b, 0x82, 0x01, 0x00, 0x34, + 0x42, 0x04, 0x00, 0x51, 0x04, 0x40, 0x00, 0x91, 0x21, 0x5c, 0x00, 0x91, + 0x82, 0x50, 0x22, 0x8b, 0x1f, 0x20, 0x03, 0xd5, 0x21, 0x80, 0x5f, 0xfc, + 0x20, 0x54, 0x41, 0xfc, 0x01, 0x00, 0x00, 0x6d, 0x00, 0x40, 0x00, 0x91, + 0x5f, 0x00, 0x00, 0xeb, 0x61, 0xff, 0xff, 0x54, 0xe0, 0x7b, 0x40, 0xb9, + 0xa0, 0x02, 0x00, 0x34, 0x63, 0x08, 0x40, 0x91, 0x01, 0xa3, 0x67, 0x39, + 0x60, 0xa0, 0x67, 0x39, 0x3f, 0x00, 0x00, 0x6b, 0x00, 0x02, 0x00, 0x54, + 0xe1, 0x02, 0x40, 0x39, 0x20, 0x07, 0x00, 0x11, 0x19, 0x1c, 0x00, 0x12, + 0x3f, 0x00, 0x20, 0x6b, 0xa9, 0x03, 0x00, 0x54, 0x9b, 0x23, 0x9c, 0x52, + 0x8a, 0xff, 0xff, 0x17, 0x5b, 0x08, 0x9c, 0x52, 0x1f, 0x20, 0x03, 0xd5, + 0x60, 0x01, 0x68, 0x39, 0x00, 0x04, 0x00, 0x11, 0x60, 0x01, 0x28, 0x39, + 0xd6, 0xff, 0xff, 0x17, 0x7b, 0x08, 0x9c, 0x52, 0xd7, 0xff, 0xff, 0x17, + 0xe1, 0x02, 0x40, 0x39, 0x20, 0x07, 0x00, 0x11, 0x19, 0x1c, 0x00, 0x12, + 0x3f, 0x00, 0x20, 0x6b, 0xa8, 0xef, 0xff, 0x54, 0xe3, 0x03, 0x1b, 0x2a, + 0x9b, 0x8e, 0xff, 0x35, 0x6f, 0xfc, 0xff, 0x17, 0xe2, 0x22, 0x02, 0x39, + 0x3b, 0xff, 0xff, 0x17, 0xc5, 0x68, 0x20, 0x38, 0xe5, 0x1c, 0x00, 0x12, + 0x39, 0xff, 0xff, 0x17, 0xe0, 0x7f, 0x40, 0xb9, 0x03, 0x00, 0x80, 0x52, + 0xe0, 0x9b, 0x00, 0xb9, 0xe0, 0xa3, 0x00, 0xb9, 0xe5, 0xfe, 0xff, 0x17, + 0x97, 0x23, 0x9c, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0x68, 0xfc, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0xaa, + 0xf5, 0x5b, 0x02, 0xa9, 0x15, 0x60, 0x09, 0x91, 0x00, 0x28, 0x41, 0xb9, + 0x00, 0x03, 0x00, 0x34, 0xb6, 0x00, 0x00, 0xf0, 0xd6, 0xa2, 0x0e, 0x91, + 0x13, 0x00, 0x80, 0x52, 0x06, 0x00, 0x00, 0x14, 0x82, 0x2a, 0x41, 0xb9, + 0x61, 0x06, 0x00, 0x11, 0x33, 0x3c, 0x00, 0x12, 0x5f, 0x20, 0x21, 0x6b, + 0xe9, 0x01, 0x00, 0x54, 0xa0, 0x2e, 0x33, 0x8b, 0xe2, 0xa9, 0xff, 0x97, + 0x20, 0xff, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, 0xe4, 0x03, 0x13, 0x2a, + 0x01, 0x1c, 0x80, 0x52, 0xe3, 0x03, 0x16, 0xaa, 0x00, 0x02, 0x80, 0x52, + 0x67, 0x7e, 0xff, 0x97, 0x82, 0x2a, 0x41, 0xb9, 0x61, 0x06, 0x00, 0x11, + 0x33, 0x3c, 0x00, 0x12, 0x5f, 0x20, 0x21, 0x6b, 0x68, 0xfe, 0xff, 0x54, + 0xf5, 0x5b, 0x42, 0xa9, 0x9f, 0x2a, 0x01, 0xb9, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xad, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0x01, 0x20, 0x40, 0xf9, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0x02, 0x4c, 0x40, 0xf9, + 0xf5, 0x5b, 0x02, 0xa9, 0x15, 0x60, 0x09, 0x91, 0x20, 0x90, 0x49, 0x78, + 0x65, 0x16, 0x40, 0xf9, 0xf7, 0x63, 0x03, 0xa9, 0x43, 0x68, 0x40, 0x39, + 0x64, 0x3e, 0x40, 0xf9, 0x00, 0x7c, 0x00, 0x1b, 0xb6, 0x08, 0x40, 0x39, + 0x7f, 0xa2, 0x01, 0xb9, 0x7f, 0xfe, 0x1a, 0xa9, 0x7f, 0xfe, 0x1b, 0xa9, + 0x7f, 0xca, 0x01, 0xb9, 0x7f, 0x7e, 0x1d, 0xa9, 0x60, 0xe2, 0x01, 0xb9, + 0x7f, 0x16, 0x02, 0xb9, 0x7f, 0x22, 0x12, 0x39, 0x80, 0x04, 0x40, 0x79, + 0x03, 0x0f, 0x00, 0x34, 0x05, 0x34, 0x1e, 0x53, 0x22, 0xf0, 0x49, 0x78, + 0x63, 0x12, 0x04, 0x91, 0xa4, 0x08, 0xc0, 0x1a, 0x00, 0x60, 0x00, 0x51, + 0x25, 0x00, 0x00, 0x79, 0x21, 0x00, 0x80, 0x52, 0x7f, 0x02, 0x01, 0xb9, + 0x7f, 0x2a, 0x01, 0xb9, 0x42, 0x08, 0xc4, 0x1a, 0x64, 0x5a, 0x02, 0x79, + 0x00, 0x00, 0x02, 0x4b, 0x42, 0x40, 0x00, 0x11, 0x62, 0x0a, 0x02, 0xb9, + 0x00, 0x7c, 0x01, 0x53, 0x00, 0x40, 0x00, 0x51, 0x60, 0x0e, 0x02, 0xb9, + 0x40, 0x00, 0x00, 0x0b, 0x60, 0x12, 0x02, 0xb9, 0x7f, 0x7c, 0x00, 0xa9, + 0x7f, 0x7c, 0x01, 0xa9, 0x60, 0x36, 0x40, 0xf9, 0x7f, 0xbe, 0x04, 0x39, + 0x1f, 0x04, 0x00, 0xb9, 0x7f, 0x32, 0x01, 0xb9, 0x60, 0x02, 0x40, 0x39, + 0x00, 0xbc, 0x01, 0x51, 0x04, 0x7e, 0xff, 0x97, 0x60, 0x22, 0x40, 0xf9, + 0xe2, 0xc3, 0x03, 0x91, 0x64, 0x5e, 0x41, 0xb9, 0x61, 0x00, 0x80, 0x52, + 0x65, 0xb6, 0x40, 0xf9, 0x03, 0x90, 0x4a, 0xb8, 0x80, 0x08, 0xc3, 0x1a, + 0x00, 0x90, 0x03, 0x1b, 0x60, 0x5e, 0x01, 0xb9, 0xbf, 0x08, 0x00, 0x79, + 0x63, 0x36, 0x40, 0xf9, 0x60, 0x8e, 0x42, 0xf9, 0x7f, 0xd4, 0x00, 0x79, + 0x7f, 0xdc, 0x00, 0x79, 0x7f, 0x5a, 0x01, 0xb9, 0x1f, 0x7c, 0x00, 0xa9, + 0x1f, 0x7c, 0x01, 0xa9, 0x1f, 0x10, 0x00, 0xf9, 0x60, 0x02, 0x40, 0x39, + 0x40, 0x17, 0x00, 0x94, 0xa0, 0x04, 0x00, 0x35, 0xe0, 0xf3, 0x40, 0xb9, + 0x1f, 0x18, 0x00, 0x71, 0xe0, 0x20, 0x00, 0x54, 0x60, 0x02, 0x52, 0x39, + 0x00, 0x04, 0x00, 0x35, 0x63, 0xb6, 0x40, 0xf9, 0x0a, 0x00, 0x80, 0xd2, + 0x09, 0x00, 0x80, 0x52, 0x02, 0x10, 0x2e, 0x1e, 0x2b, 0x00, 0x80, 0x52, + 0x22, 0x7d, 0x40, 0x93, 0xe1, 0x03, 0x09, 0x2a, 0x44, 0x20, 0x00, 0x91, + 0x62, 0x00, 0x02, 0x8b, 0xe0, 0x03, 0x13, 0xaa, 0x29, 0x05, 0x00, 0x11, + 0x62, 0x78, 0x24, 0xbc, 0x5f, 0x48, 0x00, 0x39, 0x5f, 0x58, 0x00, 0x39, + 0x5f, 0xc0, 0x00, 0x39, 0x4b, 0x68, 0x00, 0x39, 0x62, 0x0a, 0x40, 0xf9, + 0x42, 0x00, 0x0a, 0x8b, 0x4a, 0xe1, 0x3e, 0x91, 0x42, 0xc0, 0x74, 0x39, + 0x5f, 0x04, 0x00, 0x71, 0x69, 0x00, 0x00, 0x54, 0xc7, 0xf8, 0xff, 0x97, + 0x63, 0xb6, 0x40, 0xf9, 0x3f, 0x11, 0x00, 0x71, 0x81, 0xfd, 0xff, 0x54, + 0x7f, 0xd0, 0x00, 0xb8, 0x20, 0x00, 0x80, 0x52, 0x7f, 0x44, 0x00, 0x39, + 0x60, 0x02, 0x12, 0x39, 0x1f, 0x20, 0x03, 0xd5, 0xf4, 0x03, 0x13, 0xaa, + 0x01, 0x00, 0x80, 0x52, 0x02, 0x44, 0x80, 0xd2, 0xe0, 0x03, 0x15, 0xaa, + 0x96, 0x3e, 0x00, 0x94, 0x80, 0x06, 0x4a, 0x38, 0x00, 0xdc, 0x01, 0x51, + 0xa7, 0x7d, 0xff, 0x97, 0xe0, 0x03, 0x14, 0xaa, 0xa1, 0xaf, 0xff, 0x97, + 0x21, 0x00, 0x80, 0x52, 0x61, 0x42, 0x14, 0x39, 0xf8, 0x03, 0x00, 0x2a, + 0xe0, 0x02, 0x00, 0x34, 0x61, 0x42, 0x40, 0xf9, 0x7f, 0x42, 0x14, 0x39, + 0x02, 0x20, 0xa0, 0x52, 0x17, 0x21, 0x9c, 0x52, 0x20, 0x00, 0x40, 0xb9, + 0x00, 0x9c, 0x08, 0x12, 0x1f, 0x00, 0x02, 0x6b, 0xc0, 0x16, 0x00, 0x54, + 0x60, 0x02, 0x40, 0x39, 0x01, 0x01, 0x80, 0x52, 0x61, 0x32, 0x01, 0xb9, + 0x01, 0x20, 0x80, 0x52, 0x00, 0xbc, 0x01, 0x51, 0xaf, 0x7d, 0xff, 0x97, + 0xe0, 0x03, 0x17, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xd3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x45, 0x30, 0x40, 0x79, 0x89, 0xff, 0xff, 0x17, 0x60, 0x16, 0x40, 0xf9, + 0xf9, 0x6b, 0x04, 0xa9, 0xdf, 0x06, 0x00, 0x71, 0x7f, 0x46, 0x14, 0x39, + 0xf9, 0x17, 0x9f, 0x1a, 0x17, 0x00, 0x80, 0x52, 0x00, 0x08, 0x40, 0x39, + 0x1f, 0x04, 0x00, 0x71, 0xc1, 0x07, 0x00, 0x54, 0x61, 0x32, 0x40, 0xf9, + 0x22, 0xc0, 0x42, 0x39, 0x62, 0x00, 0x00, 0x34, 0x22, 0xc8, 0x42, 0x39, + 0x02, 0x2f, 0x00, 0x34, 0x60, 0x46, 0x14, 0x39, 0x60, 0x22, 0x40, 0xf9, + 0xff, 0xff, 0x0d, 0xa9, 0x61, 0x02, 0x40, 0x39, 0x62, 0x3e, 0x40, 0xf9, + 0xff, 0x77, 0x00, 0xf9, 0xff, 0xef, 0x03, 0x39, 0xa8, 0x00, 0x80, 0xd2, + 0x4a, 0x01, 0x80, 0x52, 0xe7, 0xff, 0xff, 0xd0, 0xe7, 0x00, 0x06, 0x91, + 0x42, 0x70, 0x44, 0x78, 0x09, 0x10, 0x4c, 0xb8, 0xe6, 0xff, 0xff, 0xb0, + 0xc6, 0x00, 0x20, 0x91, 0x42, 0x04, 0x00, 0x51, 0xe8, 0x7b, 0x00, 0xf9, + 0xe5, 0xff, 0xff, 0xb0, 0xa5, 0x40, 0x32, 0x91, 0xe1, 0xe3, 0x03, 0x39, + 0x23, 0x09, 0xc2, 0x1a, 0xff, 0xeb, 0x03, 0x39, 0xea, 0xff, 0x00, 0xb9, + 0xe4, 0xff, 0xff, 0xd0, 0x84, 0x80, 0x03, 0x91, 0xe7, 0x1b, 0x10, 0xa9, + 0xe1, 0x63, 0x03, 0x91, 0x62, 0xa4, 0x02, 0x1b, 0xe5, 0x13, 0x11, 0xa9, + 0xe0, 0x43, 0x02, 0x91, 0x5f, 0x00, 0x00, 0x71, 0x68, 0x22, 0x05, 0xb9, + 0x63, 0x04, 0x83, 0x1a, 0xe3, 0xe7, 0x03, 0x39, 0xf3, 0x63, 0x00, 0xf9, + 0xe2, 0x0f, 0x4f, 0xa9, 0xe2, 0x0f, 0x09, 0xa9, 0xe2, 0x0f, 0x50, 0xa9, + 0xe2, 0x0f, 0x0a, 0xa9, 0xe2, 0x0f, 0x51, 0xa9, 0xe2, 0x0f, 0x0b, 0xa9, + 0xf3, 0x93, 0x00, 0xf9, 0x6a, 0x3a, 0xff, 0x97, 0xf7, 0x03, 0x00, 0x2a, + 0x20, 0x20, 0x00, 0x34, 0xe2, 0x03, 0x00, 0x2a, 0x01, 0x1c, 0x80, 0x52, + 0x20, 0x00, 0x80, 0x52, 0xa3, 0x00, 0x00, 0xd0, 0x63, 0x40, 0x11, 0x91, + 0x86, 0x7d, 0xff, 0x97, 0x60, 0x32, 0x40, 0xf9, 0x21, 0x00, 0x80, 0x52, + 0x17, 0x00, 0x80, 0x52, 0x01, 0xc4, 0x02, 0x39, 0x7f, 0x2a, 0x01, 0xb9, + 0xd9, 0x14, 0x00, 0x35, 0x61, 0x32, 0x40, 0xf9, 0x20, 0xc4, 0x42, 0x39, + 0x80, 0x00, 0x00, 0x35, 0x60, 0x4e, 0x40, 0xf9, 0x00, 0x68, 0x40, 0x39, + 0x60, 0x26, 0x00, 0x34, 0xd7, 0x09, 0x00, 0x35, 0xff, 0xff, 0x0d, 0xa9, + 0xff, 0x77, 0x00, 0xf9, 0xff, 0xef, 0x03, 0x39, 0x61, 0x42, 0x40, 0xf9, + 0xe0, 0x00, 0x80, 0xd2, 0xe0, 0x7b, 0x00, 0xf9, 0xe5, 0xff, 0xff, 0xd0, + 0xa5, 0x00, 0x06, 0x91, 0x68, 0x02, 0x40, 0x39, 0x21, 0x0c, 0x40, 0x39, + 0xe4, 0xff, 0xff, 0xb0, 0x84, 0x00, 0x20, 0x91, 0x67, 0x5a, 0x42, 0x79, + 0x3f, 0x00, 0x00, 0x71, 0xe3, 0xff, 0xff, 0xb0, 0x63, 0x40, 0x32, 0x91, + 0xe2, 0xff, 0xff, 0xd0, 0x42, 0x80, 0x03, 0x91, 0xe6, 0x07, 0x9f, 0x1a, + 0x41, 0x01, 0x80, 0x52, 0xe8, 0xe3, 0x03, 0x39, 0xe7, 0xe7, 0x03, 0x39, + 0xe6, 0xeb, 0x03, 0x39, 0xe1, 0xff, 0x00, 0xb9, 0xe1, 0x63, 0x03, 0x91, + 0xe5, 0x13, 0x10, 0xa9, 0xe3, 0x0b, 0x11, 0xa9, 0x60, 0x22, 0x05, 0xb9, + 0xe0, 0x43, 0x02, 0x91, 0xe4, 0x17, 0x4f, 0xa9, 0xe4, 0x17, 0x09, 0xa9, + 0xf3, 0x93, 0x00, 0xf9, 0xe2, 0x0f, 0x50, 0xa9, 0xe2, 0x0f, 0x0a, 0xa9, + 0xe4, 0x17, 0x51, 0xa9, 0xe4, 0x17, 0x0b, 0xa9, 0xe2, 0x93, 0x40, 0xf9, + 0xe2, 0x63, 0x00, 0xf9, 0x2e, 0x3a, 0xff, 0x97, 0xf7, 0x03, 0x00, 0x2a, + 0x61, 0x36, 0x40, 0xf9, 0xe0, 0x77, 0x43, 0x39, 0x60, 0x22, 0x12, 0x39, + 0x20, 0x0c, 0x4f, 0x29, 0xe2, 0x63, 0x43, 0x39, 0x00, 0x00, 0x02, 0x0b, + 0x20, 0x78, 0x00, 0xb9, 0x60, 0x42, 0x40, 0xf9, 0xe4, 0x6b, 0x43, 0x39, + 0x22, 0x80, 0x40, 0xb9, 0x63, 0x00, 0x04, 0x0b, 0x23, 0x7c, 0x00, 0xb9, + 0xe3, 0x67, 0x43, 0x39, 0x42, 0x00, 0x03, 0x0b, 0x22, 0x80, 0x00, 0xb9, + 0x02, 0x0c, 0x40, 0x39, 0x42, 0x01, 0x00, 0x34, 0x62, 0x2a, 0x41, 0xb9, + 0xe3, 0xa3, 0x43, 0x39, 0x44, 0x04, 0x00, 0x11, 0x7f, 0x00, 0x04, 0x6b, + 0xa1, 0x00, 0x00, 0x54, 0x62, 0x4e, 0x22, 0x8b, 0xe4, 0x73, 0x40, 0xf9, + 0x44, 0x2c, 0x01, 0xf9, 0x63, 0x2a, 0x01, 0xb9, 0x02, 0x2a, 0x9c, 0x52, + 0xff, 0x02, 0x02, 0x6b, 0xa0, 0x14, 0x00, 0x54, 0x22, 0x2a, 0x9c, 0x52, + 0xff, 0x02, 0x02, 0x6b, 0x80, 0x14, 0x00, 0x54, 0xb7, 0x00, 0x00, 0x35, + 0x02, 0x00, 0x40, 0x39, 0x62, 0x05, 0x00, 0x34, 0x21, 0x00, 0x80, 0x52, + 0x01, 0x04, 0x00, 0x39, 0x60, 0x42, 0x54, 0x39, 0x80, 0x00, 0x00, 0x34, + 0xe0, 0x03, 0x14, 0xaa, 0x00, 0xaf, 0xff, 0x97, 0xa0, 0x08, 0x00, 0x35, + 0x61, 0x42, 0x40, 0xf9, 0x02, 0x20, 0xa0, 0x52, 0xf9, 0x6b, 0x44, 0xa9, + 0x20, 0x00, 0x40, 0xb9, 0x00, 0x9c, 0x08, 0x12, 0x1f, 0x00, 0x02, 0x6b, + 0xe1, 0x01, 0x00, 0x54, 0xff, 0x02, 0x00, 0x71, 0x20, 0x00, 0x80, 0xd2, + 0xe3, 0x07, 0x9f, 0x1a, 0x22, 0x78, 0x60, 0xb8, 0x7f, 0x00, 0x00, 0x71, + 0x00, 0x04, 0x00, 0x91, 0x40, 0x10, 0x57, 0x7a, 0x00, 0x4b, 0x00, 0x54, + 0x1f, 0x14, 0x00, 0xf1, 0x41, 0xff, 0xff, 0x54, 0x20, 0x04, 0x40, 0x39, + 0x00, 0xe8, 0xff, 0x35, 0xe0, 0x03, 0x13, 0xaa, 0x92, 0xfe, 0xff, 0x97, + 0xb7, 0xe7, 0xff, 0x35, 0x60, 0x42, 0x40, 0xf9, 0x00, 0x04, 0x40, 0x39, + 0x40, 0xe7, 0xff, 0x35, 0x60, 0x5e, 0x41, 0xb9, 0x61, 0x62, 0x41, 0xb9, + 0x00, 0x04, 0x00, 0x11, 0x60, 0x5e, 0x01, 0xb9, 0xa1, 0xe6, 0xff, 0x35, + 0x20, 0x00, 0x80, 0x52, 0x60, 0x62, 0x01, 0xb9, 0x32, 0xff, 0xff, 0x17, + 0x7f, 0x02, 0x12, 0x39, 0x1a, 0xff, 0xff, 0x17, 0xff, 0x7f, 0x0f, 0xa9, + 0xf6, 0x03, 0x13, 0xaa, 0xc0, 0x03, 0x80, 0x52, 0x20, 0x04, 0x00, 0xb9, + 0x40, 0x00, 0x80, 0x52, 0x60, 0x32, 0x01, 0xb9, 0x81, 0x00, 0x80, 0x52, + 0xc0, 0x86, 0x4a, 0x38, 0x00, 0xbc, 0x01, 0x51, 0xda, 0x7c, 0xff, 0x97, + 0xe0, 0x03, 0x16, 0xaa, 0xe8, 0xae, 0xff, 0x97, 0x20, 0x18, 0x00, 0x34, + 0x60, 0x42, 0x40, 0xf9, 0x00, 0x0c, 0x40, 0x39, 0xe0, 0x45, 0x00, 0x34, + 0x60, 0x36, 0x40, 0xf9, 0x17, 0x21, 0x9c, 0x52, 0x01, 0x05, 0x80, 0x52, + 0x01, 0x04, 0x00, 0xb9, 0x60, 0x00, 0x80, 0x52, 0x60, 0x32, 0x01, 0xb9, + 0x60, 0x02, 0x40, 0x39, 0x01, 0x01, 0x80, 0x52, 0x00, 0xbc, 0x01, 0x51, + 0xca, 0x7c, 0xff, 0x97, 0x75, 0x30, 0xff, 0x97, 0x00, 0x21, 0x9c, 0x52, + 0xff, 0x02, 0x00, 0x6b, 0x60, 0xf7, 0xff, 0x54, 0xe0, 0x03, 0x13, 0xaa, + 0x68, 0xf5, 0xff, 0x97, 0xb8, 0xff, 0xff, 0x17, 0x64, 0x52, 0x40, 0xf9, + 0xe2, 0x03, 0x00, 0x2a, 0xa3, 0x00, 0x00, 0xb0, 0x01, 0x1c, 0x80, 0x52, + 0x63, 0xc0, 0x37, 0x91, 0x00, 0x02, 0x80, 0x52, 0xdc, 0x7c, 0xff, 0x97, + 0xb5, 0xff, 0xff, 0x17, 0x61, 0x36, 0x40, 0xf9, 0x20, 0xa0, 0x03, 0x91, + 0x3f, 0xfc, 0x0e, 0xa9, 0x3f, 0xfc, 0x0f, 0xa9, 0x1f, 0x7c, 0x02, 0xa9, + 0x1f, 0x7c, 0x03, 0xa9, 0x60, 0x36, 0x40, 0xf9, 0x00, 0xa0, 0x04, 0x91, + 0x1f, 0x7c, 0x00, 0xa9, 0x1f, 0x7c, 0x01, 0xa9, 0x1f, 0x7c, 0x02, 0xa9, + 0x1f, 0x7c, 0x03, 0xa9, 0x60, 0x06, 0x46, 0xa9, 0x02, 0xc4, 0x42, 0x39, + 0x3f, 0xfc, 0x16, 0xa9, 0x62, 0xea, 0xff, 0x35, 0x02, 0xc0, 0x42, 0x39, + 0x57, 0x2d, 0x9c, 0x52, 0xa2, 0xf3, 0xff, 0x34, 0x04, 0x14, 0x40, 0xa9, + 0x24, 0x94, 0x0e, 0xa9, 0x22, 0xa0, 0x03, 0x91, 0x04, 0x14, 0x41, 0xa9, + 0x24, 0x94, 0x0f, 0xa9, 0x04, 0x14, 0x42, 0xa9, 0x44, 0x14, 0x02, 0xa9, + 0x00, 0x04, 0x43, 0xa9, 0x40, 0x04, 0x03, 0xa9, 0x62, 0x02, 0x46, 0xa9, + 0x00, 0xa0, 0x04, 0x91, 0x41, 0x00, 0x01, 0x91, 0x42, 0x0c, 0x44, 0xa9, + 0x02, 0x0c, 0x00, 0xa9, 0x22, 0x0c, 0x41, 0xa9, 0x02, 0x0c, 0x01, 0xa9, + 0x22, 0x0c, 0x42, 0xa9, 0x02, 0x0c, 0x02, 0xa9, 0x22, 0x0c, 0x43, 0xa9, + 0x02, 0x0c, 0x03, 0xa9, 0x61, 0x02, 0x46, 0xa9, 0x22, 0xc4, 0x42, 0x39, + 0x23, 0x50, 0x40, 0xf9, 0x03, 0xb4, 0x00, 0xf9, 0x23, 0x54, 0x40, 0xf9, + 0x03, 0xb8, 0x00, 0xf9, 0xa2, 0xe6, 0xff, 0x35, 0x60, 0x4e, 0x40, 0xf9, + 0x00, 0x68, 0x40, 0x39, 0x40, 0xe6, 0xff, 0x35, 0xff, 0xff, 0x0d, 0xa9, + 0xff, 0x77, 0x00, 0xf9, 0xff, 0xef, 0x03, 0x39, 0x62, 0x42, 0x40, 0xf9, + 0xc0, 0x00, 0x80, 0xd2, 0xe0, 0x7b, 0x00, 0xf9, 0xe5, 0xff, 0xff, 0xd0, + 0xa5, 0x00, 0x06, 0x91, 0x63, 0x02, 0x40, 0x39, 0x42, 0x0c, 0x40, 0x39, + 0xe4, 0xff, 0xff, 0xb0, 0x84, 0x00, 0x20, 0x91, 0xe3, 0xe3, 0x03, 0x39, + 0x67, 0x22, 0x40, 0xf9, 0x5f, 0x00, 0x00, 0x71, 0x21, 0x70, 0x41, 0x79, + 0xe6, 0x07, 0x9f, 0x1a, 0xe1, 0xe7, 0x03, 0x39, 0xe3, 0xff, 0xff, 0xb0, + 0x63, 0x40, 0x32, 0x91, 0xe2, 0xff, 0xff, 0xd0, 0x42, 0x80, 0x03, 0x91, + 0xe1, 0xe0, 0x4c, 0xb8, 0xe6, 0xeb, 0x03, 0x39, 0x21, 0x28, 0x00, 0x11, + 0x2f, 0xff, 0xff, 0x17, 0x77, 0x04, 0x9c, 0x52, 0x63, 0xff, 0xff, 0x17, + 0xb7, 0x05, 0x9c, 0x52, 0x61, 0xff, 0xff, 0x17, 0x66, 0x22, 0x40, 0xf9, + 0xc0, 0x48, 0x43, 0x39, 0xc4, 0x10, 0x4c, 0xb8, 0x60, 0x39, 0x00, 0x34, + 0xa4, 0x57, 0x00, 0x34, 0x60, 0x3e, 0x40, 0xf9, 0x01, 0x00, 0x80, 0x52, + 0x08, 0x00, 0x80, 0x92, 0x07, 0x00, 0x80, 0xd2, 0xc5, 0x00, 0x80, 0x52, + 0x02, 0x70, 0x44, 0x78, 0x42, 0x04, 0x00, 0x51, 0x1f, 0x20, 0x03, 0xd5, + 0x20, 0x08, 0xc2, 0x1a, 0x63, 0x4e, 0x20, 0x8b, 0x1f, 0x1c, 0x00, 0x71, + 0x48, 0x01, 0x00, 0x54, 0x00, 0x84, 0x02, 0x1b, 0x63, 0x2c, 0x41, 0xf9, + 0x00, 0x14, 0x05, 0x1b, 0xc3, 0x00, 0x00, 0xb4, 0x60, 0x78, 0x60, 0xf8, + 0xff, 0x00, 0x00, 0xeb, 0xe7, 0x20, 0x80, 0x9a, 0x1f, 0x01, 0x00, 0xeb, + 0x08, 0x91, 0x80, 0x9a, 0x21, 0x04, 0x00, 0x11, 0x3f, 0x00, 0x04, 0x6b, + 0x21, 0xfe, 0xff, 0x54, 0xe3, 0x00, 0x63, 0x9e, 0xa0, 0x00, 0x00, 0xd0, + 0x00, 0x44, 0x42, 0xfd, 0x63, 0x08, 0x60, 0x1e, 0x62, 0x32, 0x40, 0xf9, + 0x05, 0xe4, 0x00, 0x2f, 0xc5, 0x50, 0x03, 0x91, 0xc9, 0x5c, 0x03, 0x91, + 0x20, 0x0b, 0xe8, 0xd2, 0x04, 0x00, 0x67, 0x9e, 0x47, 0x20, 0x0a, 0xa9, + 0xa0, 0x0c, 0x40, 0x39, 0x04, 0x00, 0x18, 0x0b, 0x20, 0x52, 0x00, 0x34, + 0x40, 0x4c, 0x38, 0x8b, 0x1f, 0x1f, 0x00, 0x71, 0xe8, 0x01, 0x00, 0x54, + 0xa3, 0x00, 0x40, 0x39, 0xc1, 0x4c, 0x43, 0x39, 0x60, 0x00, 0x63, 0x1e, + 0x22, 0x00, 0x63, 0x1e, 0x01, 0x38, 0x62, 0x1e, 0x00, 0x28, 0x62, 0x1e, + 0x21, 0x68, 0x65, 0x1e, 0x00, 0x78, 0x64, 0x1e, 0x21, 0x08, 0x63, 0x1e, + 0x00, 0x08, 0x63, 0x1e, 0x21, 0xb8, 0xe1, 0x7e, 0x00, 0xb8, 0xe1, 0x7e, + 0x01, 0x20, 0x00, 0xfd, 0x40, 0x58, 0x38, 0xfc, 0x18, 0x07, 0x00, 0x11, + 0x1f, 0x03, 0x04, 0x6b, 0xa1, 0xfd, 0xff, 0x54, 0xa5, 0x04, 0x00, 0x91, + 0x3f, 0x01, 0x05, 0xeb, 0x60, 0x43, 0x00, 0x54, 0xf8, 0x03, 0x04, 0x2a, + 0xe5, 0xff, 0xff, 0x17, 0x97, 0xe3, 0xff, 0x35, 0xff, 0xff, 0x0d, 0xa9, + 0xff, 0x77, 0x00, 0xf9, 0xff, 0xef, 0x03, 0x39, 0xb6, 0xf3, 0xff, 0x35, + 0xcd, 0xfe, 0xff, 0x17, 0x60, 0x22, 0x40, 0xf9, 0x62, 0x36, 0x40, 0xf9, + 0x23, 0xb4, 0x40, 0xb9, 0x01, 0xa0, 0x4c, 0xb8, 0x42, 0x0c, 0x40, 0xb9, + 0x21, 0x00, 0x03, 0x0b, 0x5f, 0x00, 0x01, 0x6b, 0xe3, 0x37, 0x9f, 0x1a, + 0x63, 0x46, 0x14, 0x39, 0x42, 0xd0, 0xff, 0x54, 0xb7, 0xfe, 0xff, 0x17, + 0xe0, 0x03, 0x13, 0xaa, 0xe8, 0x33, 0x00, 0xfd, 0x90, 0x0e, 0x00, 0x94, + 0x60, 0x2a, 0x41, 0xb9, 0xe0, 0x7f, 0x00, 0xb9, 0x20, 0x0e, 0x00, 0x34, + 0x60, 0x3e, 0x40, 0xf9, 0xc1, 0x00, 0x80, 0xd2, 0x68, 0x1e, 0x4b, 0xa9, + 0xfb, 0x73, 0x05, 0xa9, 0x18, 0x04, 0x40, 0x79, 0x7e, 0x62, 0x40, 0xf9, + 0x12, 0x07, 0x00, 0x51, 0x79, 0x16, 0x42, 0xb9, 0x17, 0x00, 0x80, 0x52, + 0x32, 0x28, 0x32, 0x8b, 0x01, 0x3f, 0x7e, 0xd3, 0x1b, 0xe0, 0x41, 0xb8, + 0x19, 0x03, 0x19, 0x0b, 0x1a, 0x20, 0x42, 0xb8, 0x0b, 0x21, 0x00, 0x91, + 0xe1, 0x53, 0x08, 0xa9, 0x01, 0x3f, 0x7d, 0xd3, 0xea, 0x20, 0x00, 0x91, + 0xd6, 0x23, 0x00, 0x91, 0xf4, 0x03, 0x01, 0xaa, 0xf1, 0x7e, 0x40, 0x93, + 0xe0, 0x7e, 0x18, 0x1b, 0x7f, 0x07, 0x00, 0x71, 0xa1, 0x7a, 0x71, 0xf8, + 0x60, 0x10, 0x00, 0x54, 0x7f, 0x0b, 0x00, 0x71, 0xe0, 0x11, 0x00, 0x54, + 0x3b, 0x11, 0x00, 0x34, 0xec, 0x03, 0x01, 0xaa, 0xed, 0x03, 0x01, 0xaa, + 0xe9, 0x03, 0x01, 0xaa, 0x5f, 0x07, 0x00, 0x71, 0x40, 0x10, 0x00, 0x54, + 0x5f, 0x0b, 0x00, 0x71, 0xc0, 0x0f, 0x00, 0x54, 0x21, 0x00, 0x14, 0x8b, + 0x5f, 0x03, 0x00, 0x71, 0x29, 0x00, 0x89, 0x9a, 0x58, 0x07, 0x00, 0x34, + 0x66, 0x96, 0x5a, 0xa9, 0x00, 0x7c, 0x7c, 0x93, 0x64, 0xde, 0x40, 0xf9, + 0xb0, 0x09, 0x00, 0xd1, 0x2f, 0x09, 0x00, 0xd1, 0x8e, 0x09, 0x00, 0xd1, + 0x41, 0x00, 0x80, 0xd2, 0x23, 0x69, 0xe1, 0x78, 0xe2, 0x69, 0xe1, 0x78, + 0xbc, 0x69, 0xe1, 0x78, 0x60, 0x00, 0x62, 0x1e, 0x03, 0x6a, 0xe1, 0x78, + 0x41, 0x00, 0x62, 0x1e, 0x82, 0x69, 0xe1, 0x78, 0x85, 0x03, 0x62, 0x1e, + 0xdc, 0x69, 0xe1, 0x78, 0x64, 0x00, 0x62, 0x1e, 0x21, 0x10, 0x00, 0x91, + 0x02, 0x28, 0x60, 0x1e, 0x40, 0x00, 0x62, 0x1e, 0x21, 0x28, 0x61, 0x1e, + 0x83, 0x03, 0x62, 0x1e, 0x05, 0x69, 0x20, 0xfc, 0x64, 0x69, 0x20, 0xfc, + 0xe2, 0x68, 0x20, 0xfc, 0x41, 0x69, 0x20, 0xfc, 0x61, 0x08, 0x63, 0x1e, + 0xc0, 0x6b, 0x20, 0xfc, 0x00, 0x04, 0x40, 0x1f, 0xc3, 0x6a, 0x20, 0xfc, + 0x64, 0x69, 0x60, 0xfc, 0x02, 0x69, 0x60, 0xfc, 0x43, 0x69, 0x60, 0xfc, + 0x84, 0x08, 0x64, 0x1e, 0xe1, 0x68, 0x60, 0xfc, 0x42, 0x10, 0x42, 0x1f, + 0x00, 0x40, 0x00, 0x91, 0x63, 0x08, 0x63, 0x1e, 0x21, 0x0c, 0x41, 0x1f, + 0x02, 0x00, 0x79, 0x1e, 0xc6, 0x40, 0x22, 0x8b, 0x5c, 0x00, 0x79, 0x1e, + 0x23, 0x00, 0x79, 0x1e, 0x84, 0x00, 0x1c, 0x8b, 0x7c, 0xc6, 0x41, 0xb9, + 0xa5, 0x40, 0x23, 0x8b, 0x7f, 0x00, 0x1c, 0x6b, 0x49, 0x00, 0x00, 0x54, + 0x63, 0xc6, 0x01, 0xb9, 0x63, 0xc2, 0x41, 0xb9, 0x5f, 0x00, 0x03, 0x6b, + 0x49, 0x00, 0x00, 0x54, 0x62, 0xc2, 0x01, 0xb9, 0x5f, 0x02, 0x01, 0xeb, + 0x21, 0xfa, 0xff, 0x54, 0x66, 0x96, 0x1a, 0xa9, 0x64, 0xde, 0x00, 0xf9, + 0x80, 0x07, 0x80, 0xd2, 0x61, 0xca, 0x41, 0xb9, 0x31, 0x56, 0x00, 0x9b, + 0x20, 0x42, 0x40, 0xb9, 0x1f, 0x00, 0x01, 0x6b, 0x49, 0x00, 0x00, 0x54, + 0x60, 0xca, 0x01, 0xb9, 0xe1, 0x7f, 0x40, 0xb9, 0xe0, 0x06, 0x00, 0x11, + 0x79, 0x16, 0x02, 0xb9, 0x17, 0x3c, 0x00, 0x12, 0x39, 0x03, 0x18, 0x0b, + 0x3f, 0x20, 0x20, 0x6b, 0xe8, 0xf4, 0xff, 0x54, 0xfb, 0x73, 0x45, 0xa9, + 0xf4, 0x47, 0x40, 0xf9, 0x60, 0x42, 0x40, 0xf9, 0x00, 0x0c, 0x40, 0x39, + 0x40, 0x33, 0x00, 0x34, 0x60, 0x16, 0x42, 0xbd, 0x08, 0x10, 0x2e, 0x1e, + 0x60, 0xde, 0x40, 0xf9, 0x01, 0x00, 0x80, 0x52, 0x00, 0xd8, 0x21, 0x7e, + 0x66, 0xc2, 0x41, 0xbd, 0x01, 0x00, 0x23, 0x9e, 0x60, 0xca, 0x41, 0xb9, + 0x02, 0x00, 0x27, 0x1e, 0x65, 0xc6, 0x41, 0xbd, 0x62, 0x8e, 0x5a, 0xa9, + 0x42, 0x54, 0x2f, 0x0f, 0x00, 0x19, 0x20, 0x1e, 0xc6, 0xd8, 0x21, 0x7e, + 0xa5, 0xd8, 0x21, 0x7e, 0xe0, 0x03, 0x13, 0xaa, 0x62, 0xca, 0x01, 0xbd, + 0x42, 0xd8, 0x21, 0x7e, 0x43, 0x00, 0x23, 0x9e, 0x64, 0x00, 0x23, 0x9e, + 0x62, 0x36, 0x40, 0xf9, 0x45, 0x50, 0x00, 0xbd, 0x46, 0x58, 0x00, 0xbd, + 0x21, 0x08, 0x20, 0x1e, 0x41, 0x88, 0x08, 0x2d, 0x82, 0x08, 0x20, 0x1e, + 0x60, 0x08, 0x20, 0x1e, 0x23, 0xb8, 0xa1, 0x7e, 0x42, 0x4c, 0x00, 0xbd, + 0x40, 0x54, 0x00, 0xbd, 0x43, 0x34, 0x00, 0xbd, 0xa2, 0xf7, 0xff, 0x97, + 0xf7, 0x03, 0x00, 0x2a, 0x40, 0x03, 0x00, 0x34, 0x60, 0x36, 0x40, 0xf9, + 0xe1, 0x1b, 0x09, 0xb2, 0x01, 0xc0, 0x05, 0xf8, 0x08, 0x64, 0x00, 0xbd, + 0xe8, 0x33, 0x40, 0xfd, 0xa5, 0xfe, 0xff, 0x17, 0xe2, 0x43, 0x40, 0xf9, + 0xec, 0x03, 0x01, 0xaa, 0xe9, 0x03, 0x01, 0xaa, 0x2d, 0x00, 0x02, 0x8b, + 0x80, 0xff, 0xff, 0x17, 0x2c, 0x00, 0x14, 0x8b, 0x85, 0xff, 0xff, 0x17, + 0x2d, 0x00, 0x14, 0x8b, 0x83, 0xff, 0xff, 0x17, 0xe2, 0x43, 0x40, 0xf9, + 0xec, 0x03, 0x01, 0xaa, 0xed, 0x03, 0x01, 0xaa, 0x29, 0x00, 0x02, 0x8b, + 0x77, 0xff, 0xff, 0x17, 0xe2, 0x43, 0x40, 0xf9, 0xed, 0x03, 0x01, 0xaa, + 0xe9, 0x03, 0x01, 0xaa, 0x2c, 0x00, 0x02, 0x8b, 0x72, 0xff, 0xff, 0x17, + 0xe0, 0x03, 0x13, 0xaa, 0x81, 0x0b, 0x00, 0x94, 0x63, 0x36, 0x40, 0xf9, + 0x04, 0x05, 0x80, 0x52, 0xf7, 0x03, 0x00, 0x2a, 0x62, 0x00, 0x80, 0x52, + 0x01, 0x01, 0x80, 0x52, 0x64, 0x04, 0x00, 0xb9, 0x62, 0x32, 0x01, 0xb9, + 0x60, 0x02, 0x40, 0x39, 0x00, 0xbc, 0x01, 0x51, 0x57, 0x7b, 0xff, 0x97, + 0x97, 0x3a, 0x00, 0x35, 0x60, 0x5e, 0x41, 0xb9, 0x60, 0x00, 0x00, 0x35, + 0x60, 0x92, 0x45, 0x39, 0xa0, 0x2f, 0x00, 0x34, 0x60, 0x62, 0x41, 0xb9, + 0x1f, 0x04, 0x00, 0x71, 0xc0, 0x29, 0x00, 0x54, 0xfa, 0x2e, 0xff, 0x97, + 0x1f, 0x1c, 0x00, 0x72, 0xc0, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x13, 0xaa, + 0xee, 0xf3, 0xff, 0x97, 0x17, 0x00, 0xb0, 0x52, 0xe8, 0x33, 0x40, 0xfd, + 0x3c, 0xfe, 0xff, 0x17, 0x75, 0x62, 0x41, 0xb9, 0xbf, 0x06, 0x00, 0x71, + 0x80, 0x2b, 0x00, 0x54, 0xe0, 0x03, 0x13, 0xaa, 0xe6, 0xf3, 0xff, 0x97, + 0x60, 0x32, 0x41, 0xb9, 0x1f, 0x14, 0x00, 0x71, 0x60, 0x00, 0x00, 0x54, + 0xe8, 0x33, 0x40, 0xfd, 0x32, 0xfe, 0xff, 0x17, 0x16, 0x00, 0xa8, 0x52, + 0x1f, 0x20, 0x03, 0xd5, 0x60, 0x46, 0x40, 0xf9, 0xe1, 0x63, 0x03, 0x91, + 0x82, 0x3e, 0x80, 0x52, 0xff, 0xff, 0x0d, 0xa9, 0x12, 0x56, 0xff, 0x97, + 0xf5, 0x03, 0x00, 0x2a, 0xe0, 0x2e, 0xff, 0x97, 0x00, 0x1c, 0x00, 0x12, + 0xbf, 0x6a, 0x08, 0x71, 0x04, 0x08, 0x40, 0x7a, 0xc1, 0xfe, 0xff, 0x54, + 0xdb, 0x2e, 0xff, 0x97, 0xbf, 0x1a, 0x1c, 0x71, 0x60, 0xfe, 0xff, 0x54, + 0xf5, 0x2b, 0x00, 0x35, 0x60, 0x02, 0x40, 0x39, 0xe1, 0xdb, 0x40, 0xb9, + 0x00, 0x00, 0x16, 0x0b, 0x3f, 0x00, 0x00, 0x6b, 0xa1, 0xfd, 0xff, 0x54, + 0xe0, 0xdf, 0x40, 0xb9, 0x1f, 0x08, 0x00, 0x71, 0x41, 0xfd, 0xff, 0x54, + 0xcf, 0x2e, 0xff, 0x97, 0x1f, 0x1c, 0x00, 0x72, 0xc1, 0xfa, 0xff, 0x54, + 0x61, 0x36, 0x40, 0xf9, 0x02, 0x0a, 0x80, 0x52, 0x75, 0x52, 0x40, 0xf9, + 0xc0, 0x00, 0x80, 0x52, 0x22, 0x04, 0x00, 0xb9, 0x01, 0x08, 0x80, 0x52, + 0x60, 0x32, 0x01, 0xb9, 0x60, 0x02, 0x40, 0x39, 0x00, 0xbc, 0x01, 0x51, + 0x17, 0x7b, 0xff, 0x97, 0x60, 0xb6, 0x40, 0xf9, 0x04, 0xfc, 0x83, 0xd2, + 0x61, 0x16, 0x40, 0xf9, 0x09, 0x18, 0x40, 0x39, 0x62, 0x0e, 0x40, 0xf9, + 0x23, 0x1d, 0x40, 0x92, 0x20, 0x00, 0x40, 0x79, 0x65, 0x76, 0x40, 0xf9, + 0x63, 0x08, 0x04, 0x9b, 0x64, 0x7a, 0x40, 0xf9, 0xa0, 0x02, 0x00, 0x34, + 0x02, 0x04, 0x00, 0x51, 0x21, 0x3c, 0x00, 0x91, 0x42, 0x04, 0x00, 0x91, + 0xa8, 0x20, 0x00, 0x91, 0x67, 0x20, 0x00, 0x91, 0x86, 0x20, 0x00, 0x91, + 0x42, 0xec, 0x7c, 0xd3, 0x00, 0x00, 0x80, 0xd2, 0x1f, 0x20, 0x03, 0xd5, + 0x21, 0x00, 0x40, 0x6d, 0x21, 0x54, 0x00, 0x91, 0xa1, 0x68, 0x20, 0xfc, + 0x00, 0x69, 0x20, 0xfc, 0x61, 0x68, 0x60, 0xfc, 0xe0, 0x68, 0x60, 0xfc, + 0x81, 0x68, 0x20, 0xfc, 0xc0, 0x68, 0x20, 0xfc, 0x00, 0x40, 0x00, 0x91, + 0x5f, 0x00, 0x00, 0xeb, 0xc1, 0xfe, 0xff, 0x54, 0x60, 0xce, 0x40, 0xf9, + 0xff, 0x7f, 0x0f, 0xa9, 0xff, 0x7f, 0x10, 0xa9, 0xff, 0x7f, 0x11, 0xa9, + 0xff, 0x7f, 0x12, 0xa9, 0x01, 0x00, 0x40, 0x39, 0x62, 0x1a, 0x40, 0xf9, + 0x01, 0x01, 0x00, 0x35, 0x43, 0xe0, 0x76, 0x39, 0x21, 0x00, 0x80, 0xd2, + 0x21, 0x20, 0xc3, 0x9a, 0x64, 0x1c, 0x46, 0xd3, 0xe3, 0xc3, 0x03, 0x91, + 0x61, 0x78, 0x24, 0xf8, 0x01, 0x00, 0x40, 0x39, 0x63, 0xc2, 0x40, 0xf9, + 0x60, 0x22, 0x40, 0xf9, 0x63, 0x00, 0x40, 0x39, 0xe3, 0x27, 0x00, 0x34, + 0x03, 0x58, 0x42, 0x39, 0x20, 0x00, 0x80, 0xd2, 0x00, 0x20, 0xc3, 0x9a, + 0x42, 0x00, 0x21, 0x8b, 0xe3, 0xc3, 0x03, 0x91, 0x61, 0x52, 0x40, 0xf9, + 0x04, 0x01, 0x80, 0xd2, 0x42, 0xc4, 0x74, 0x39, 0xc4, 0x36, 0x00, 0x94, + 0xf7, 0x03, 0x00, 0x2a, 0x20, 0x27, 0x00, 0x34, 0x62, 0x36, 0x40, 0xf9, + 0x43, 0x0b, 0x80, 0x52, 0xe0, 0x00, 0x80, 0x52, 0x01, 0x10, 0x80, 0x52, + 0x43, 0x04, 0x00, 0xb9, 0x60, 0x32, 0x01, 0xb9, 0x60, 0x02, 0x40, 0x39, + 0x00, 0xbc, 0x01, 0x51, 0xd1, 0x7a, 0xff, 0x97, 0x66, 0x36, 0x40, 0xf9, + 0x61, 0xca, 0x40, 0xf9, 0xc0, 0x5c, 0x40, 0xbd, 0x21, 0x00, 0x40, 0xbd, + 0x10, 0x20, 0x21, 0x1e, 0xe5, 0x02, 0x00, 0x54, 0x64, 0x02, 0x42, 0xa9, + 0x05, 0xfc, 0x83, 0xd2, 0x62, 0xb6, 0x40, 0xf9, 0x63, 0x76, 0x40, 0xf9, + 0x42, 0x18, 0x40, 0x39, 0x00, 0x00, 0x40, 0x79, 0x20, 0x00, 0x00, 0xbd, + 0x42, 0x10, 0x05, 0x9b, 0xc0, 0x01, 0x00, 0x34, 0x01, 0x04, 0x00, 0x51, + 0x65, 0x20, 0x00, 0x91, 0x21, 0x04, 0x00, 0x91, 0x44, 0x20, 0x00, 0x91, + 0x00, 0x00, 0x80, 0xd2, 0x21, 0xec, 0x7c, 0xd3, 0x61, 0x68, 0x60, 0xfc, + 0xa0, 0x68, 0x60, 0xfc, 0x41, 0x68, 0x20, 0xfc, 0x80, 0x68, 0x20, 0xfc, + 0x00, 0x40, 0x00, 0x91, 0x3f, 0x00, 0x00, 0xeb, 0x41, 0xff, 0xff, 0x54, + 0x57, 0x24, 0x00, 0x34, 0x00, 0x10, 0x2e, 0x1e, 0xc0, 0x64, 0x00, 0xbd, + 0x5d, 0x2e, 0xff, 0x97, 0x1f, 0x1c, 0x00, 0x72, 0xc0, 0x00, 0x00, 0x54, + 0x60, 0xc2, 0x40, 0xf9, 0x00, 0x00, 0x40, 0x39, 0x60, 0x00, 0x00, 0x34, + 0xe0, 0x03, 0x13, 0xaa, 0x72, 0xf3, 0xff, 0x97, 0xe0, 0x03, 0x13, 0xaa, + 0x4c, 0xf3, 0xff, 0x97, 0xe8, 0x33, 0x40, 0xfd, 0x9b, 0xfd, 0xff, 0x17, + 0xe0, 0x03, 0x13, 0xaa, 0x44, 0xfc, 0xff, 0x97, 0x17, 0x21, 0x9c, 0x52, + 0x60, 0x36, 0x40, 0xf9, 0xd0, 0xfd, 0xff, 0x17, 0x20, 0x00, 0x80, 0x52, + 0x20, 0x04, 0x00, 0x39, 0xea, 0xfc, 0xff, 0x17, 0x78, 0x52, 0x40, 0xf9, + 0xc4, 0x1d, 0x00, 0x34, 0x61, 0x3e, 0x40, 0xf9, 0x09, 0x00, 0x80, 0x52, + 0x03, 0x00, 0x80, 0x52, 0x07, 0x00, 0x80, 0x92, 0x08, 0x00, 0x80, 0xd2, + 0x00, 0x00, 0x80, 0xd2, 0x25, 0x70, 0x44, 0x78, 0xca, 0x00, 0x80, 0x52, + 0xa5, 0x04, 0x00, 0x51, 0x62, 0x08, 0xc5, 0x1a, 0xe1, 0x03, 0x00, 0xaa, + 0x66, 0x4e, 0x22, 0x8b, 0x5f, 0x1c, 0x00, 0x71, 0xc8, 0x01, 0x00, 0x54, + 0x42, 0x8c, 0x05, 0x1b, 0xc6, 0x2c, 0x41, 0xf9, 0x42, 0x28, 0x0a, 0x1b, + 0x46, 0x01, 0x00, 0xb4, 0xc2, 0x78, 0x62, 0xf8, 0x29, 0x05, 0x00, 0x11, + 0x02, 0x7b, 0x20, 0xf8, 0xe0, 0x03, 0x09, 0x2a, 0x1f, 0x01, 0x02, 0xeb, + 0xe1, 0x03, 0x00, 0xaa, 0x08, 0x21, 0x82, 0x9a, 0xff, 0x00, 0x02, 0xeb, + 0xe7, 0x90, 0x82, 0x9a, 0x63, 0x04, 0x00, 0x11, 0x7f, 0x00, 0x04, 0x6b, + 0x81, 0xfd, 0xff, 0x54, 0x64, 0x32, 0x40, 0xf9, 0xe0, 0x03, 0x18, 0xaa, + 0x02, 0x01, 0x80, 0xd2, 0xe3, 0xff, 0xff, 0xb0, 0x63, 0x80, 0x1f, 0x91, + 0x88, 0x1c, 0x0a, 0xa9, 0xbf, 0x3b, 0x00, 0x94, 0x6a, 0x22, 0x40, 0xf9, + 0x41, 0x11, 0x4c, 0xb8, 0x40, 0x51, 0x4c, 0xb8, 0x42, 0x69, 0x43, 0x39, + 0x1f, 0x00, 0x01, 0x6b, 0x00, 0x90, 0x81, 0x1a, 0x00, 0x04, 0x00, 0x51, + 0xc2, 0x15, 0x00, 0x34, 0x01, 0x00, 0x63, 0x1e, 0x00, 0x10, 0x6c, 0x1e, + 0x4b, 0x5d, 0x03, 0x91, 0x09, 0x00, 0x80, 0xd2, 0x08, 0x00, 0x80, 0x52, + 0x02, 0x00, 0x80, 0x52, 0x21, 0x08, 0x60, 0x1e, 0x65, 0x69, 0x69, 0x38, + 0xc5, 0x02, 0x00, 0x34, 0x20, 0x01, 0x62, 0x1e, 0xe0, 0x03, 0x08, 0x2a, + 0x01, 0x00, 0x80, 0x52, 0x00, 0x08, 0x61, 0x1e, 0x07, 0x00, 0x79, 0x1e, + 0x44, 0x04, 0x00, 0x11, 0x03, 0x04, 0x00, 0x11, 0x21, 0x04, 0x00, 0x11, + 0x1f, 0x1c, 0x00, 0x71, 0xa8, 0x00, 0x00, 0x54, 0x66, 0x32, 0x40, 0xf9, + 0x82, 0x3c, 0x00, 0x12, 0xc0, 0xc8, 0x20, 0x8b, 0x07, 0x80, 0x00, 0xb9, + 0x60, 0x3c, 0x00, 0x12, 0x3f, 0x00, 0x05, 0x6b, 0xa1, 0xfe, 0xff, 0x54, + 0x08, 0x05, 0x00, 0x11, 0x21, 0x04, 0x00, 0x51, 0x21, 0x20, 0x28, 0x0b, + 0x28, 0x3c, 0x00, 0x12, 0x29, 0x05, 0x00, 0x91, 0x3f, 0x0d, 0x00, 0xf1, + 0xe1, 0xfc, 0xff, 0x54, 0x1f, 0x21, 0x00, 0x71, 0x08, 0x11, 0x00, 0x54, + 0x64, 0x32, 0x40, 0xf9, 0x80, 0x00, 0x02, 0x91, 0x22, 0x03, 0x00, 0x34, + 0x43, 0x25, 0x43, 0x39, 0xa1, 0x00, 0x00, 0xd0, 0x23, 0x44, 0x42, 0xfd, + 0x01, 0x10, 0x6e, 0x1e, 0x85, 0x00, 0x01, 0x91, 0x01, 0x00, 0x80, 0xd2, + 0x60, 0x00, 0x63, 0x1e, 0x02, 0x84, 0x43, 0x1f, 0x01, 0x04, 0x43, 0x1f, + 0x1f, 0x20, 0x03, 0xd5, 0x03, 0x78, 0x61, 0xb8, 0x00, 0x7b, 0x63, 0xfc, + 0x00, 0xd8, 0x61, 0x7e, 0x00, 0x08, 0x62, 0x1e, 0x00, 0xb8, 0xe1, 0x7e, + 0xa0, 0x78, 0x21, 0xfc, 0x00, 0x7b, 0x63, 0xfc, 0x00, 0xd8, 0x61, 0x7e, + 0x00, 0x08, 0x61, 0x1e, 0x00, 0xb8, 0xe1, 0x7e, 0x80, 0x78, 0x21, 0xfc, + 0x21, 0x04, 0x00, 0x91, 0x5f, 0x20, 0x21, 0x6b, 0x68, 0xfe, 0xff, 0x54, + 0x60, 0x36, 0x40, 0xf9, 0x21, 0x00, 0x80, 0x52, 0x81, 0xc0, 0x02, 0x39, + 0x9f, 0xc8, 0x02, 0x39, 0x00, 0x0c, 0x40, 0xb9, 0x82, 0x70, 0x01, 0x79, + 0x00, 0x04, 0x00, 0x11, 0x80, 0xb4, 0x00, 0xb9, 0x60, 0x2a, 0x41, 0xb9, + 0xba, 0x00, 0x00, 0xb0, 0x5a, 0x03, 0x10, 0x91, 0x18, 0x00, 0x80, 0x52, + 0xe0, 0x00, 0x00, 0x35, 0x10, 0x00, 0x00, 0x14, 0x61, 0x2a, 0x41, 0xb9, + 0x00, 0x07, 0x00, 0x11, 0x18, 0x3c, 0x00, 0x12, 0x3f, 0x20, 0x20, 0x6b, + 0x69, 0x01, 0x00, 0x54, 0xa0, 0x2e, 0x38, 0x8b, 0xb0, 0xa5, 0xff, 0x97, + 0x20, 0xff, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, 0xe4, 0x03, 0x18, 0x2a, + 0xe3, 0x03, 0x1a, 0xaa, 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x35, 0x7a, 0xff, 0x97, 0xf2, 0xff, 0xff, 0x17, 0x60, 0x32, 0x40, 0xf9, + 0x1f, 0xc4, 0x02, 0x39, 0x7f, 0x2a, 0x01, 0xb9, 0xb0, 0xfc, 0xff, 0x17, + 0x9f, 0x20, 0x00, 0x71, 0x48, 0x09, 0x00, 0x54, 0x60, 0x36, 0x40, 0xf9, + 0x21, 0x00, 0x80, 0x52, 0x41, 0xc0, 0x02, 0x39, 0x5f, 0xc8, 0x02, 0x39, + 0x00, 0x0c, 0x40, 0xb9, 0x44, 0x70, 0x01, 0x79, 0x00, 0x04, 0x00, 0x11, + 0x40, 0xb4, 0x00, 0xb9, 0xdd, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x13, 0xaa, + 0xa3, 0xfb, 0xff, 0x97, 0x65, 0xfe, 0xff, 0x17, 0x62, 0x36, 0x40, 0xf9, + 0x43, 0x06, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0x01, 0x02, 0x80, 0x52, + 0x43, 0x04, 0x00, 0xb9, 0x60, 0x32, 0x01, 0xb9, 0x60, 0x02, 0x40, 0x39, + 0x00, 0xbc, 0x01, 0x51, 0xf9, 0x79, 0xff, 0x97, 0xe0, 0x03, 0x13, 0xaa, + 0xbb, 0x0a, 0x00, 0x94, 0x60, 0x22, 0x40, 0xf9, 0x00, 0x6c, 0x43, 0x39, + 0x40, 0x08, 0x00, 0x34, 0x61, 0xc2, 0x40, 0xf9, 0x60, 0x5a, 0x42, 0x79, + 0x22, 0x00, 0x40, 0x39, 0x01, 0x04, 0x00, 0x11, 0x21, 0x3c, 0x00, 0x12, + 0x5f, 0x00, 0x00, 0x71, 0x20, 0x00, 0x80, 0x1a, 0x60, 0x62, 0x04, 0x79, + 0xe0, 0x03, 0x13, 0xaa, 0x42, 0x08, 0x00, 0x94, 0x9b, 0xfe, 0xff, 0x17, + 0x60, 0xb6, 0x40, 0xf9, 0x00, 0x10, 0x40, 0x39, 0x60, 0xd4, 0xff, 0x34, + 0x62, 0x36, 0x40, 0xf9, 0x83, 0x07, 0x80, 0x52, 0xa0, 0x00, 0x80, 0x52, + 0x01, 0x04, 0x80, 0x52, 0x43, 0x04, 0x00, 0xb9, 0x60, 0x32, 0x01, 0xb9, + 0x60, 0x02, 0x40, 0x39, 0x00, 0xbc, 0x01, 0x51, 0xdd, 0x79, 0xff, 0x97, + 0xe2, 0x77, 0x40, 0xb2, 0xe1, 0x03, 0x15, 0x2a, 0x42, 0x00, 0xc0, 0xf2, + 0xe0, 0xc3, 0x03, 0x91, 0xe2, 0x4f, 0x0f, 0xa9, 0x97, 0x54, 0xff, 0x97, + 0x95, 0xfe, 0xff, 0x17, 0x61, 0x0a, 0x4b, 0xa9, 0xe0, 0x03, 0x13, 0xaa, + 0x63, 0x62, 0x40, 0xf9, 0x42, 0x04, 0x00, 0x94, 0x00, 0xd0, 0xff, 0x34, + 0xf7, 0x03, 0x00, 0x2a, 0xe8, 0x33, 0x40, 0xfd, 0x05, 0xfd, 0xff, 0x17, + 0xe2, 0x03, 0x15, 0x2a, 0xa3, 0x00, 0x00, 0xb0, 0x63, 0xc0, 0x11, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0xe8, 0x79, 0xff, 0x97, + 0x17, 0x05, 0x9c, 0x52, 0xe8, 0x33, 0x40, 0xfd, 0xba, 0xfc, 0xff, 0x17, + 0x19, 0x00, 0x80, 0x52, 0x77, 0x2d, 0x9c, 0x52, 0x9a, 0xff, 0xff, 0x17, + 0x01, 0x00, 0x63, 0x1e, 0xa1, 0x00, 0x00, 0xb0, 0x20, 0x48, 0x42, 0xfd, + 0x02, 0x00, 0x80, 0xd2, 0x64, 0x32, 0x40, 0xf9, 0x21, 0x08, 0x60, 0x1e, + 0x80, 0x00, 0x02, 0x91, 0x40, 0x00, 0x62, 0x1e, 0x00, 0x08, 0x61, 0x1e, + 0x01, 0x00, 0x79, 0x1e, 0x01, 0x78, 0x22, 0xb8, 0x42, 0x04, 0x00, 0x91, + 0x5f, 0x20, 0x00, 0xf1, 0x41, 0xff, 0xff, 0x54, 0x6b, 0xff, 0xff, 0x17, + 0x60, 0x5a, 0x42, 0x79, 0xc5, 0xff, 0xff, 0x17, 0xe4, 0x03, 0x18, 0x2a, + 0x83, 0xfd, 0xff, 0x17, 0x01, 0x00, 0x80, 0xd2, 0x07, 0x00, 0x80, 0x92, + 0x08, 0x00, 0x80, 0xd2, 0x2e, 0xff, 0xff, 0x17, 0x03, 0xe4, 0x00, 0x2f, + 0x08, 0x00, 0x80, 0x92, 0x07, 0x00, 0x80, 0xd2, 0x5d, 0xfd, 0xff, 0x17, + 0x09, 0x00, 0x29, 0x8b, 0x20, 0x00, 0x80, 0xd2, 0x23, 0x49, 0x42, 0x39, + 0x00, 0x20, 0xc3, 0x9a, 0xc1, 0xfe, 0xff, 0x17, 0x61, 0xce, 0x40, 0xf9, + 0xa3, 0x02, 0x42, 0x91, 0x60, 0x1a, 0x40, 0xf9, 0x21, 0x00, 0x40, 0x39, + 0x62, 0x52, 0x40, 0xf9, 0x00, 0x00, 0x01, 0x8b, 0x61, 0x72, 0x40, 0xf9, + 0x00, 0xc4, 0x74, 0x39, 0x99, 0x35, 0x00, 0x94, 0xf7, 0x03, 0x00, 0x2a, + 0xc0, 0xd7, 0xff, 0x35, 0xe0, 0x03, 0x13, 0xaa, 0xd1, 0x0b, 0x00, 0x94, + 0xf7, 0x03, 0x00, 0x2a, 0xba, 0xfe, 0xff, 0x17, 0xe0, 0x03, 0x13, 0xaa, + 0x2d, 0x0c, 0x00, 0x94, 0x00, 0x40, 0x62, 0x1e, 0x21, 0x00, 0x80, 0x52, + 0x62, 0x36, 0x40, 0xf9, 0xe0, 0x03, 0x13, 0xaa, 0x40, 0x64, 0x00, 0xbd, + 0xaf, 0xf5, 0xff, 0x97, 0xf7, 0x03, 0x00, 0x2a, 0x35, 0x2d, 0xff, 0x97, + 0x1f, 0x1c, 0x00, 0x72, 0xe0, 0x00, 0x00, 0x54, 0xff, 0x02, 0x00, 0x71, + 0x00, 0x00, 0xb0, 0x52, 0xf7, 0x12, 0x80, 0x1a, 0xd5, 0xfe, 0xff, 0x17, + 0xe8, 0x33, 0x40, 0xfd, 0xb8, 0xfc, 0xff, 0x17, 0xe0, 0x03, 0x13, 0xaa, + 0xfb, 0x73, 0x05, 0xa9, 0x22, 0xf2, 0xff, 0x97, 0x97, 0x0a, 0x00, 0x35, + 0xb6, 0x00, 0x00, 0xb0, 0xd6, 0x62, 0x12, 0x91, 0x15, 0x00, 0x80, 0xd2, + 0x18, 0x81, 0x8d, 0xd2, 0x1a, 0xfc, 0x83, 0xd2, 0xb9, 0x02, 0x80, 0x52, + 0x0d, 0x00, 0x00, 0x14, 0x60, 0x10, 0x40, 0x39, 0x00, 0x24, 0xdb, 0x1a, + 0xa0, 0x05, 0x00, 0x37, 0x17, 0x00, 0x80, 0x52, 0x29, 0x00, 0x80, 0x52, + 0xa0, 0x06, 0x00, 0x11, 0xb5, 0x06, 0x00, 0x91, 0x00, 0x1c, 0x00, 0x12, + 0x1f, 0x0c, 0x00, 0x71, 0xe0, 0x87, 0x9f, 0x1a, 0x3f, 0x01, 0x00, 0x6a, + 0x80, 0x08, 0x00, 0x54, 0x63, 0xb6, 0x40, 0xf9, 0xfc, 0x03, 0x15, 0x2a, + 0xfb, 0x03, 0x15, 0x2a, 0x60, 0x14, 0x40, 0x39, 0x00, 0x24, 0xd5, 0x1a, + 0xe0, 0xfd, 0x07, 0x36, 0xa0, 0x7e, 0x18, 0x9b, 0x62, 0x06, 0x40, 0xf9, + 0x65, 0x16, 0x40, 0xf9, 0x41, 0x00, 0x00, 0x8b, 0x42, 0x68, 0x60, 0x78, + 0xa0, 0x00, 0x40, 0x79, 0x1f, 0x00, 0x02, 0x6b, 0xe1, 0xfc, 0xff, 0x54, + 0xc0, 0xfc, 0xff, 0x34, 0x04, 0x04, 0x00, 0x51, 0x88, 0x04, 0x80, 0xd2, + 0x62, 0x0e, 0x40, 0xf9, 0x84, 0x3c, 0x00, 0x12, 0xc3, 0x0a, 0x40, 0x6d, + 0xa7, 0x20, 0x00, 0x91, 0x24, 0x23, 0xa4, 0x9b, 0x26, 0x20, 0x00, 0x91, + 0xa2, 0x0a, 0x1a, 0x9b, 0xe0, 0x01, 0x80, 0xd2, 0xa1, 0x68, 0x60, 0xfc, + 0xe0, 0x68, 0x60, 0xfc, 0x21, 0x68, 0x20, 0xfc, 0xc0, 0x68, 0x20, 0xfc, + 0x00, 0x54, 0x00, 0x91, 0x43, 0x08, 0x00, 0x6d, 0x1f, 0x00, 0x04, 0xeb, + 0x42, 0x40, 0x00, 0x91, 0x01, 0xff, 0xff, 0x54, 0xd2, 0xff, 0xff, 0x17, + 0xe1, 0x03, 0x1c, 0x2a, 0xe0, 0x03, 0x13, 0xaa, 0x90, 0xf3, 0xff, 0x97, + 0x1f, 0x00, 0x00, 0x71, 0x61, 0xb6, 0x40, 0xf9, 0xf7, 0x03, 0x00, 0x2a, + 0x64, 0x06, 0x40, 0xf9, 0xa2, 0x1e, 0x00, 0x12, 0x23, 0x18, 0x40, 0x39, + 0x60, 0x1c, 0x40, 0x92, 0x40, 0x10, 0x43, 0x7a, 0x00, 0x10, 0x18, 0x9b, + 0x60, 0x16, 0x00, 0xf9, 0x60, 0x03, 0x00, 0x54, 0x20, 0x14, 0x40, 0x39, + 0xff, 0x02, 0x00, 0x71, 0xe9, 0x17, 0x9f, 0x1a, 0x1b, 0x24, 0xdb, 0x1a, + 0x9b, 0xf8, 0x07, 0x36, 0x61, 0x0a, 0x40, 0xf9, 0x00, 0xf7, 0x81, 0xd2, + 0xa0, 0x06, 0x00, 0x9b, 0x00, 0xc0, 0x74, 0x39, 0x1f, 0x04, 0x00, 0x71, + 0xc9, 0xf7, 0xff, 0x54, 0xe1, 0x03, 0x1c, 0x2a, 0xe0, 0x03, 0x13, 0xaa, + 0x1f, 0xf4, 0xff, 0x97, 0xba, 0xff, 0xff, 0x17, 0xfb, 0x73, 0x45, 0xa9, + 0xe8, 0x33, 0x40, 0xfd, 0x1c, 0xfc, 0xff, 0x17, 0xb7, 0xff, 0xff, 0x35, + 0x60, 0x02, 0x40, 0x39, 0x01, 0x03, 0x80, 0x52, 0x2f, 0x12, 0x00, 0x94, + 0xf7, 0x03, 0x00, 0x2a, 0xfb, 0x73, 0x45, 0xa9, 0xe8, 0x33, 0x40, 0xfd, + 0x14, 0xfc, 0xff, 0x17, 0x60, 0xc2, 0x40, 0xf9, 0x00, 0x00, 0x40, 0x39, + 0x80, 0x00, 0x00, 0x34, 0xe0, 0x03, 0x13, 0xaa, 0xe2, 0xf1, 0xff, 0x97, + 0x61, 0xb6, 0x40, 0xf9, 0x20, 0x14, 0x40, 0x39, 0x1b, 0x24, 0xdb, 0x1a, + 0xbb, 0xfd, 0x07, 0x36, 0x61, 0x0a, 0x40, 0xf9, 0x00, 0xf7, 0x81, 0xd2, + 0xa0, 0x06, 0x00, 0x9b, 0x00, 0xc0, 0x74, 0x39, 0x1f, 0x04, 0x00, 0x71, + 0xe9, 0xfc, 0xff, 0x54, 0x09, 0x00, 0x80, 0x52, 0xe1, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x83, 0x03, 0xd1, 0x02, 0x00, 0x84, 0x52, + 0xfd, 0x7b, 0x01, 0xa9, 0xfd, 0x43, 0x00, 0x91, 0xfb, 0x73, 0x06, 0xa9, + 0xfb, 0x03, 0x00, 0xaa, 0x00, 0xb4, 0x40, 0xf9, 0xf5, 0x5b, 0x03, 0xa9, + 0xf9, 0x6b, 0x05, 0xa9, 0x1a, 0x08, 0x80, 0x52, 0xe1, 0xc3, 0x00, 0xb9, + 0x61, 0x37, 0x40, 0xf9, 0x03, 0x18, 0x40, 0x39, 0x75, 0x17, 0x40, 0xf9, + 0x60, 0x23, 0x40, 0xf9, 0x23, 0x0c, 0x03, 0x8b, 0xbc, 0x0a, 0x40, 0x91, + 0xe3, 0x6f, 0x00, 0xf9, 0x00, 0x84, 0x42, 0x39, 0x81, 0x9b, 0x67, 0x39, + 0x7f, 0x40, 0x0b, 0xf8, 0x40, 0x24, 0xc0, 0x1a, 0xe0, 0xd7, 0x00, 0xb9, + 0x80, 0x9f, 0x67, 0x39, 0xe0, 0x00, 0x00, 0x34, 0x1f, 0x04, 0x00, 0x71, + 0x1a, 0x04, 0x80, 0x52, 0x80, 0x00, 0x00, 0x54, 0x1f, 0x08, 0x00, 0x71, + 0xfa, 0x17, 0x9f, 0x1a, 0x5a, 0x6f, 0x1c, 0x53, 0x60, 0x1b, 0x40, 0xf9, + 0x02, 0x00, 0x40, 0x39, 0x02, 0x18, 0x00, 0x34, 0x41, 0x7f, 0x01, 0x1b, + 0xe2, 0xd7, 0x40, 0xb9, 0x40, 0x03, 0x62, 0x1e, 0xf3, 0x53, 0x02, 0xa9, + 0x21, 0x1c, 0x00, 0x12, 0x14, 0x00, 0x80, 0x52, 0xe1, 0xd3, 0x00, 0xb9, + 0x01, 0x00, 0x34, 0x8b, 0xf7, 0x63, 0x04, 0xa9, 0xec, 0x37, 0x09, 0x6d, + 0x4d, 0x00, 0x63, 0x1e, 0x02, 0xf8, 0xdf, 0xd2, 0xee, 0x53, 0x00, 0xfd, + 0x0e, 0x10, 0x6e, 0x1e, 0xe2, 0x1b, 0xe8, 0xf2, 0xe8, 0x27, 0x07, 0x6d, + 0x4c, 0x00, 0x67, 0x9e, 0xea, 0x2f, 0x08, 0x6d, 0x02, 0xe0, 0x00, 0x91, + 0x37, 0x04, 0x40, 0x39, 0xce, 0x19, 0x60, 0x1e, 0x1a, 0x0d, 0x00, 0x34, + 0xf8, 0x1e, 0x7a, 0xd3, 0xbc, 0x0a, 0x40, 0x91, 0x40, 0x00, 0x18, 0x8b, + 0x19, 0x00, 0x80, 0x52, 0x13, 0x00, 0x80, 0x52, 0x36, 0x00, 0x80, 0x52, + 0xe0, 0x67, 0x00, 0xf9, 0x00, 0x1c, 0xf8, 0xd2, 0x0b, 0x00, 0x67, 0x9e, + 0x1f, 0x20, 0x03, 0xd5, 0xe0, 0xc3, 0x40, 0xb9, 0x1f, 0x04, 0x00, 0x71, + 0xc0, 0x0b, 0x00, 0x54, 0xa0, 0x02, 0x40, 0x79, 0xe1, 0xc3, 0x40, 0xb9, + 0x1f, 0x00, 0x00, 0x71, 0x20, 0x18, 0x40, 0x7a, 0x01, 0x14, 0x00, 0x54, + 0x6a, 0x02, 0x62, 0x1e, 0x09, 0xe4, 0x00, 0x2f, 0x01, 0x00, 0x80, 0x52, + 0xb8, 0x02, 0x80, 0x52, 0x4a, 0x09, 0x6e, 0x1e, 0x28, 0x41, 0x60, 0x1e, + 0x05, 0x00, 0x00, 0x14, 0x22, 0x04, 0x00, 0x11, 0x41, 0x3c, 0x00, 0x12, + 0x1f, 0x20, 0x22, 0x6b, 0x29, 0x03, 0x00, 0x54, 0xe3, 0x67, 0x40, 0xf9, + 0x22, 0x34, 0x46, 0xd3, 0x62, 0x78, 0x62, 0xf8, 0x42, 0x24, 0xc1, 0x9a, + 0x02, 0xff, 0x07, 0x36, 0x22, 0x54, 0xb8, 0x9b, 0x40, 0x41, 0x60, 0x1e, + 0xe2, 0x5f, 0x00, 0xf9, 0xe1, 0xc7, 0x00, 0xb9, 0x40, 0x30, 0x40, 0x39, + 0xe1, 0x1d, 0x00, 0x94, 0xe2, 0x5f, 0x40, 0xf9, 0xe1, 0xc7, 0x40, 0xb9, + 0xa0, 0x02, 0x40, 0x79, 0x42, 0xf0, 0x40, 0xfc, 0x41, 0x70, 0x41, 0xfc, + 0x22, 0x04, 0x00, 0x11, 0x41, 0x3c, 0x00, 0x12, 0xa2, 0x09, 0x62, 0x1e, + 0x1f, 0x20, 0x22, 0x6b, 0xa1, 0x09, 0x61, 0x1e, 0x48, 0x20, 0x40, 0x1f, + 0x09, 0x24, 0x41, 0x1f, 0x28, 0xfd, 0xff, 0x54, 0x10, 0x21, 0x6c, 0x1e, + 0xed, 0x09, 0x00, 0x54, 0x30, 0x21, 0x6c, 0x1e, 0x76, 0xbf, 0x04, 0x39, + 0xe1, 0xff, 0x8f, 0x52, 0x4c, 0x07, 0x00, 0x54, 0x30, 0x21, 0x6b, 0x1e, + 0xc4, 0x08, 0x00, 0x54, 0x23, 0x01, 0x64, 0x9e, 0x80, 0x83, 0x67, 0x39, + 0xe2, 0xd3, 0x40, 0xb9, 0x42, 0x00, 0x13, 0x0b, 0x63, 0x3c, 0x10, 0x53, + 0x23, 0x00, 0x03, 0x2a, 0xe1, 0x03, 0x17, 0x2a, 0xf4, 0xaa, 0xff, 0x97, + 0xe2, 0x03, 0x00, 0x2a, 0x00, 0x07, 0x00, 0x34, 0x73, 0x06, 0x00, 0x11, + 0xa3, 0x00, 0x00, 0xb0, 0x63, 0x60, 0x15, 0x91, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0xa8, 0x78, 0xff, 0x97, 0x7f, 0x02, 0x1a, 0x6b, + 0xf9, 0x03, 0x9c, 0x52, 0x61, 0xf7, 0xff, 0x54, 0x3f, 0x03, 0x00, 0x71, + 0x60, 0x1b, 0x40, 0xf9, 0xe2, 0x17, 0x9f, 0x1a, 0x61, 0xbf, 0x44, 0x39, + 0x01, 0x01, 0x00, 0x34, 0xe4, 0x6f, 0x40, 0xf9, 0x23, 0x00, 0x80, 0xd2, + 0x77, 0x20, 0xd7, 0x9a, 0x81, 0x40, 0x4b, 0xf8, 0x37, 0x00, 0x17, 0xaa, + 0x97, 0x40, 0x0b, 0xf8, 0x7f, 0xbf, 0x04, 0x39, 0x01, 0x00, 0x40, 0x39, + 0x94, 0x06, 0x00, 0x11, 0x94, 0x1e, 0x00, 0x12, 0x5f, 0x00, 0x00, 0x71, + 0x20, 0x10, 0x54, 0x7a, 0x89, 0x05, 0x00, 0x54, 0x01, 0x00, 0x34, 0x8b, + 0x02, 0xe0, 0x00, 0x91, 0x75, 0x17, 0x40, 0xf9, 0x37, 0x04, 0x40, 0x39, + 0x5a, 0xf3, 0xff, 0x35, 0x22, 0x00, 0x80, 0x52, 0x19, 0x00, 0x80, 0x52, + 0xea, 0xff, 0xff, 0x17, 0x60, 0x1b, 0x40, 0xf9, 0x08, 0xe4, 0x00, 0x2f, + 0x00, 0xa8, 0x74, 0x39, 0x09, 0x41, 0x60, 0x1e, 0x1f, 0x00, 0x17, 0x6b, + 0x60, 0x03, 0x00, 0x54, 0x01, 0x01, 0x64, 0x9e, 0x21, 0x3c, 0x00, 0x12, + 0x30, 0x21, 0x6c, 0x1e, 0x0d, 0xf9, 0xff, 0x54, 0xe3, 0xff, 0xaf, 0x52, + 0x76, 0xbf, 0x04, 0x39, 0x80, 0x83, 0x67, 0x39, 0x23, 0x00, 0x03, 0x2a, + 0xe2, 0xd3, 0x40, 0xb9, 0xe1, 0x03, 0x17, 0x2a, 0x42, 0x00, 0x13, 0x0b, + 0xbd, 0xaa, 0xff, 0x97, 0xe2, 0x03, 0x00, 0x2a, 0x40, 0xf9, 0xff, 0x35, + 0x73, 0x06, 0x00, 0x11, 0x7f, 0x02, 0x1a, 0x6b, 0x41, 0xf1, 0xff, 0x54, + 0xcf, 0xff, 0xff, 0x17, 0x03, 0x00, 0xb0, 0x52, 0x76, 0xbf, 0x04, 0x39, + 0xf2, 0xff, 0xff, 0x17, 0x10, 0x21, 0x6b, 0x1e, 0x45, 0xfd, 0xff, 0x54, + 0x01, 0x00, 0x90, 0x52, 0x76, 0xbf, 0x04, 0x39, 0xe9, 0xff, 0xff, 0x17, + 0xe0, 0xd7, 0x40, 0xb9, 0x08, 0x00, 0x63, 0x1e, 0xa9, 0xff, 0xff, 0x17, + 0xe0, 0x6f, 0x40, 0xf9, 0x00, 0x40, 0x4b, 0xf8, 0xa0, 0x01, 0x00, 0xb4, + 0x67, 0x37, 0x40, 0xf9, 0xa3, 0x00, 0x00, 0xb0, 0x68, 0x03, 0x40, 0x39, + 0x63, 0xa0, 0x15, 0x91, 0xe9, 0xd0, 0x02, 0x91, 0xe2, 0xfe, 0x83, 0x12, + 0x01, 0x1c, 0x80, 0x52, 0x40, 0x00, 0x80, 0x52, 0x24, 0x15, 0x40, 0xa9, + 0x26, 0x1d, 0x41, 0xa9, 0xe8, 0x03, 0x00, 0xb9, 0x59, 0x78, 0xff, 0x97, + 0xe0, 0x03, 0x19, 0x2a, 0xee, 0x53, 0x40, 0xfd, 0xfd, 0x7b, 0x41, 0xa9, + 0xf3, 0x53, 0x42, 0xa9, 0xf5, 0x5b, 0x43, 0xa9, 0xf7, 0x63, 0x44, 0xa9, + 0xf9, 0x6b, 0x45, 0xa9, 0xfb, 0x73, 0x46, 0xa9, 0xe8, 0x27, 0x47, 0x6d, + 0xea, 0x2f, 0x48, 0x6d, 0xec, 0x37, 0x49, 0x6d, 0xff, 0x83, 0x03, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x19, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x19, 0x2a, + 0xfd, 0x7b, 0x41, 0xa9, 0xf5, 0x5b, 0x43, 0xa9, 0xf9, 0x6b, 0x45, 0xa9, + 0xfb, 0x73, 0x46, 0xa9, 0xff, 0x83, 0x03, 0x91, 0xc0, 0x03, 0x5f, 0xd6, + 0x08, 0xe4, 0x00, 0x2f, 0x09, 0x41, 0x60, 0x1e, 0xbd, 0xff, 0xff, 0x17, + 0xff, 0x43, 0x03, 0xd1, 0x03, 0x08, 0x80, 0x52, 0xe1, 0x03, 0x01, 0x2a, + 0x02, 0x81, 0x8d, 0xd2, 0x07, 0xf7, 0x81, 0xd2, 0x26, 0x10, 0x00, 0x91, + 0xfd, 0x7b, 0x01, 0xa9, 0xfd, 0x43, 0x00, 0x91, 0x04, 0x00, 0x84, 0x52, + 0xf9, 0x6b, 0x05, 0xa9, 0xf9, 0x03, 0x00, 0xaa, 0x00, 0xb4, 0x40, 0xf9, + 0xf3, 0x53, 0x02, 0xa9, 0xf5, 0x5b, 0x03, 0xa9, 0xe3, 0xc3, 0x00, 0xb9, + 0x23, 0x07, 0x40, 0xf9, 0x25, 0x37, 0x40, 0xf9, 0x16, 0x18, 0x40, 0x39, + 0x22, 0x0c, 0x02, 0x9b, 0x20, 0x0b, 0x40, 0xf9, 0xa8, 0x0c, 0x16, 0x8b, + 0xe8, 0x67, 0x00, 0xf9, 0x25, 0x1f, 0x40, 0xf9, 0x21, 0x00, 0x07, 0x9b, + 0x23, 0x23, 0x40, 0xf9, 0x20, 0x17, 0x40, 0xf9, 0x63, 0x84, 0x42, 0x39, + 0x00, 0x08, 0x40, 0x91, 0xa5, 0x78, 0x66, 0xf8, 0x1f, 0x41, 0x0b, 0xf8, + 0x22, 0x87, 0x02, 0xa9, 0x94, 0x24, 0xc3, 0x1a, 0x00, 0x9c, 0x67, 0x39, + 0xe5, 0x5f, 0x00, 0xf9, 0xc0, 0x00, 0x00, 0x34, 0x1f, 0x04, 0x00, 0x71, + 0x15, 0x04, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0xa0, 0x02, 0x80, 0x1a, + 0xe0, 0xc3, 0x00, 0xb9, 0xe0, 0x5f, 0x40, 0xf9, 0x02, 0x40, 0x86, 0xd2, + 0x01, 0x00, 0x80, 0x52, 0xc5, 0x38, 0x00, 0x94, 0x33, 0x1b, 0x40, 0xf9, + 0x60, 0x02, 0x40, 0x39, 0xc0, 0x0c, 0x00, 0x34, 0xe0, 0xc3, 0x40, 0xb9, + 0x01, 0xf8, 0xdf, 0xd2, 0xea, 0x2f, 0x08, 0x6d, 0x0b, 0x10, 0x6e, 0x1e, + 0xe1, 0x1b, 0xe8, 0xf2, 0x00, 0x00, 0x62, 0x1e, 0xec, 0x37, 0x09, 0x6d, + 0x8c, 0x02, 0x63, 0x1e, 0x00, 0x3c, 0x00, 0x12, 0xf7, 0x63, 0x04, 0xa9, + 0x18, 0x00, 0x80, 0x52, 0x6b, 0x19, 0x60, 0x1e, 0xfb, 0x73, 0x06, 0xa9, + 0xee, 0x53, 0x00, 0xfd, 0x2e, 0x00, 0x67, 0x9e, 0xe0, 0xc7, 0x00, 0xb9, + 0x00, 0x1c, 0xf8, 0xd2, 0x0d, 0x00, 0x67, 0x9e, 0xe8, 0x27, 0x07, 0x6d, + 0x60, 0x02, 0x38, 0x8b, 0xe1, 0xc7, 0x40, 0xb9, 0x73, 0xe2, 0x00, 0x91, + 0x35, 0x17, 0x40, 0xf9, 0x1c, 0x00, 0x80, 0xd2, 0x17, 0x04, 0x40, 0x39, + 0xa3, 0x02, 0x40, 0x79, 0xe0, 0x1e, 0x7a, 0xd3, 0x73, 0x02, 0x00, 0x8b, + 0x34, 0x7c, 0x17, 0x1b, 0xe0, 0x5f, 0x40, 0xf9, 0x14, 0x08, 0x14, 0x8b, + 0x09, 0xe4, 0x00, 0x2f, 0x01, 0x00, 0x80, 0x52, 0xc3, 0x09, 0x00, 0x34, + 0x8a, 0x03, 0x62, 0x1e, 0x09, 0xe4, 0x00, 0x2f, 0x1a, 0x00, 0x80, 0x52, + 0xb6, 0x02, 0x80, 0x52, 0x4a, 0x09, 0x6b, 0x1e, 0x28, 0x41, 0x60, 0x1e, + 0x05, 0x00, 0x00, 0x14, 0x40, 0x07, 0x00, 0x11, 0x1a, 0x3c, 0x00, 0x12, + 0x7f, 0x20, 0x20, 0x6b, 0x89, 0x02, 0x00, 0x54, 0x40, 0x37, 0x46, 0xd3, + 0x60, 0x7a, 0x60, 0xf8, 0x00, 0x24, 0xda, 0x9a, 0x20, 0xff, 0x07, 0x36, + 0x5b, 0x57, 0xb6, 0x9b, 0x40, 0x41, 0x60, 0x1e, 0x60, 0x33, 0x40, 0x39, + 0xf1, 0x1c, 0x00, 0x94, 0x62, 0xf3, 0x40, 0xfc, 0x40, 0x07, 0x00, 0x11, + 0x61, 0x73, 0x41, 0xfc, 0x1a, 0x3c, 0x00, 0x12, 0xa3, 0x02, 0x40, 0x79, + 0x82, 0x09, 0x62, 0x1e, 0x81, 0x09, 0x61, 0x1e, 0x7f, 0x20, 0x20, 0x6b, + 0x48, 0x20, 0x40, 0x1f, 0x09, 0x24, 0x41, 0x1f, 0xc8, 0xfd, 0xff, 0x54, + 0x10, 0x21, 0x6e, 0x1e, 0xed, 0x06, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, + 0xe1, 0xff, 0x8f, 0x52, 0x20, 0xbf, 0x04, 0x39, 0x30, 0x21, 0x6e, 0x1e, + 0x2d, 0x07, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, 0x20, 0xbf, 0x04, 0x39, + 0xe2, 0xff, 0xaf, 0x52, 0xe0, 0xc3, 0x40, 0xb9, 0x21, 0x00, 0x02, 0x2a, + 0x81, 0x7a, 0x3c, 0xb8, 0x9c, 0x07, 0x00, 0x91, 0x1f, 0x00, 0x1c, 0x6b, + 0x0c, 0xfa, 0xff, 0x54, 0x20, 0xbf, 0x44, 0x39, 0x00, 0x01, 0x00, 0x34, + 0xe2, 0x67, 0x40, 0xf9, 0x21, 0x00, 0x80, 0xd2, 0x25, 0x20, 0xd7, 0x9a, + 0x40, 0x40, 0x4b, 0xf8, 0x05, 0x00, 0x05, 0xaa, 0x45, 0x40, 0x0b, 0xf8, + 0x3f, 0xbf, 0x04, 0x39, 0x33, 0x1b, 0x40, 0xf9, 0x00, 0x07, 0x00, 0x11, + 0x18, 0x1c, 0x00, 0x12, 0x61, 0x02, 0x40, 0x39, 0x3f, 0x00, 0x20, 0x6b, + 0xa8, 0xf6, 0xff, 0x54, 0xf7, 0x63, 0x44, 0xa9, 0xfb, 0x73, 0x46, 0xa9, + 0xe8, 0x27, 0x47, 0x6d, 0xea, 0x2f, 0x48, 0x6d, 0xec, 0x37, 0x49, 0x6d, + 0xee, 0x53, 0x40, 0xfd, 0xe0, 0x67, 0x40, 0xf9, 0x00, 0x40, 0x4b, 0xf8, + 0x20, 0x04, 0x00, 0xb5, 0x00, 0x00, 0x80, 0x52, 0xfd, 0x7b, 0x41, 0xa9, + 0xf3, 0x53, 0x42, 0xa9, 0xf5, 0x5b, 0x43, 0xa9, 0xf9, 0x6b, 0x45, 0xa9, + 0xff, 0x43, 0x03, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0x22, 0x01, 0x64, 0x9e, + 0x42, 0x3c, 0x10, 0x53, 0xe0, 0xc3, 0x40, 0xb9, 0x21, 0x00, 0x02, 0x2a, + 0x81, 0x7a, 0x3c, 0xb8, 0x9c, 0x07, 0x00, 0x91, 0x1f, 0x00, 0x1c, 0x6b, + 0x2c, 0xf5, 0xff, 0x54, 0xd9, 0xff, 0xff, 0x17, 0x10, 0x21, 0x6d, 0x1e, + 0x85, 0x01, 0x00, 0x54, 0x30, 0x21, 0x6e, 0x1e, 0x20, 0x00, 0x80, 0x52, + 0x20, 0xbf, 0x04, 0x39, 0x01, 0x00, 0x90, 0x52, 0x2c, 0xf9, 0xff, 0x54, + 0x30, 0x21, 0x6d, 0x1e, 0xe5, 0xfd, 0xff, 0x54, 0x20, 0x00, 0x80, 0x52, + 0x02, 0x00, 0xb0, 0x52, 0x20, 0xbf, 0x04, 0x39, 0xed, 0xff, 0xff, 0x17, + 0x01, 0x01, 0x64, 0x9e, 0x21, 0x3c, 0x00, 0x12, 0xbe, 0xff, 0xff, 0x17, + 0x27, 0x37, 0x40, 0xf9, 0xe2, 0xfe, 0x83, 0x12, 0x28, 0x03, 0x40, 0x39, + 0x01, 0x1c, 0x80, 0x52, 0xe9, 0xd0, 0x02, 0x91, 0x40, 0x00, 0x80, 0x52, + 0xa3, 0x00, 0x00, 0xb0, 0x63, 0xa0, 0x15, 0x91, 0x24, 0x15, 0x40, 0xa9, + 0x26, 0x1d, 0x41, 0xa9, 0xe8, 0x03, 0x00, 0xb9, 0x7e, 0x77, 0xff, 0x97, + 0x00, 0x00, 0x80, 0x52, 0xfd, 0x7b, 0x41, 0xa9, 0xf3, 0x53, 0x42, 0xa9, + 0xf5, 0x5b, 0x43, 0xa9, 0xf9, 0x6b, 0x45, 0xa9, 0xff, 0x43, 0x03, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xba, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0x16, 0x1c, 0x40, 0xf9, 0xf7, 0x63, 0x03, 0xa9, 0xf8, 0x03, 0x01, 0x2a, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0xc1, 0x0e, 0x18, 0x8b, + 0xff, 0x7f, 0x05, 0xa9, 0x37, 0x24, 0x40, 0xf9, 0xf9, 0x23, 0x00, 0xf9, + 0x19, 0x00, 0x40, 0x39, 0x00, 0x14, 0x40, 0xf9, 0x77, 0x13, 0x00, 0xb4, + 0x00, 0x08, 0x40, 0x91, 0xf4, 0x03, 0x18, 0xaa, 0x15, 0x08, 0x80, 0x52, + 0x00, 0x9c, 0x67, 0x39, 0x60, 0x05, 0x00, 0x35, 0xc2, 0xea, 0x41, 0x39, + 0xe3, 0x03, 0x15, 0x2a, 0xe1, 0x03, 0x19, 0x2a, 0xe0, 0x03, 0x17, 0xaa, + 0x04, 0x00, 0x80, 0x52, 0x33, 0xab, 0xff, 0x97, 0xe0, 0x05, 0x00, 0x35, + 0x1f, 0x20, 0x03, 0xd5, 0x60, 0x4a, 0x40, 0xf9, 0xe1, 0x43, 0x01, 0x91, + 0x02, 0x71, 0x82, 0x52, 0x11, 0x52, 0xff, 0x97, 0x1f, 0x68, 0x08, 0x71, + 0x60, 0xff, 0xff, 0x54, 0xa0, 0x06, 0x00, 0x35, 0xe4, 0x57, 0x40, 0xb9, + 0x9f, 0x1c, 0x00, 0x72, 0x81, 0x08, 0x00, 0x54, 0x63, 0x1e, 0x40, 0xf9, + 0x04, 0x3c, 0x85, 0xd2, 0x60, 0x02, 0x40, 0x39, 0x62, 0x00, 0x80, 0x52, + 0x61, 0x16, 0x40, 0xf9, 0x63, 0xec, 0x41, 0x39, 0x21, 0x00, 0x04, 0x8b, + 0x6f, 0xaa, 0xff, 0x97, 0x60, 0x02, 0x40, 0x39, 0x22, 0x00, 0x80, 0x52, + 0x61, 0x00, 0x80, 0x52, 0xd7, 0x10, 0x00, 0x94, 0xc0, 0x00, 0x00, 0x35, + 0x60, 0x02, 0x40, 0x39, 0x62, 0x00, 0x80, 0x52, 0x41, 0x00, 0x80, 0x52, + 0xf2, 0x11, 0x00, 0x94, 0xe0, 0x07, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, + 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xc2, 0xea, 0x41, 0x39, + 0x1f, 0x08, 0x00, 0x71, 0x15, 0x04, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xb5, 0x12, 0x80, 0x1a, 0xe1, 0x03, 0x19, 0x2a, 0xe3, 0x03, 0x15, 0x2a, + 0xe0, 0x03, 0x17, 0xaa, 0x04, 0x00, 0x80, 0x52, 0x05, 0xab, 0xff, 0x97, + 0x80, 0xfa, 0xff, 0x34, 0xe4, 0x03, 0x00, 0x2a, 0x02, 0xde, 0x83, 0x12, + 0x01, 0x1c, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0xa3, 0x00, 0x00, 0xb0, + 0x63, 0x00, 0x18, 0x91, 0x25, 0x77, 0xff, 0x97, 0xe0, 0x21, 0x9c, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xa3, 0x00, 0x00, 0xb0, 0x63, 0x20, 0x19, 0x91, 0x1f, 0x18, 0x1c, 0x71, + 0x80, 0x08, 0x00, 0x54, 0xe4, 0x03, 0x00, 0x2a, 0xc2, 0xdd, 0x83, 0x12, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0xa3, 0x00, 0x00, 0xb0, + 0x63, 0x40, 0x1a, 0x91, 0x13, 0x77, 0xff, 0x97, 0x20, 0x22, 0x9c, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xa2, 0xdd, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, + 0xa3, 0x00, 0x00, 0xb0, 0x63, 0x40, 0x1f, 0x91, 0x06, 0x77, 0xff, 0x97, + 0x40, 0x22, 0x9c, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc6, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0x02, 0x40, 0x39, 0xe1, 0x03, 0x14, 0x2a, + 0x02, 0x00, 0x80, 0x52, 0x8f, 0x10, 0x00, 0x94, 0xc0, 0xf7, 0xff, 0x35, + 0xd6, 0x02, 0x18, 0x8b, 0xe3, 0x03, 0x15, 0x2a, 0xe1, 0x03, 0x19, 0x2a, + 0xe0, 0x03, 0x17, 0xaa, 0x04, 0x00, 0x80, 0x52, 0xc2, 0xc2, 0x41, 0x39, + 0xcb, 0xaa, 0xff, 0x97, 0xe0, 0x05, 0x00, 0x35, 0x1f, 0x20, 0x03, 0xd5, + 0x60, 0x4a, 0x40, 0xf9, 0xe1, 0x43, 0x01, 0x91, 0x02, 0x71, 0x82, 0x52, + 0xa9, 0x51, 0xff, 0x97, 0x1f, 0x68, 0x08, 0x71, 0x60, 0xff, 0xff, 0x54, + 0x00, 0x06, 0x00, 0x35, 0xe4, 0x57, 0x40, 0xb9, 0x9f, 0x1c, 0x00, 0x72, + 0x81, 0xfb, 0xff, 0x54, 0x60, 0x02, 0x40, 0x39, 0xe1, 0x03, 0x14, 0x2a, + 0x22, 0x00, 0x80, 0x52, 0x77, 0x10, 0x00, 0x94, 0xc0, 0xf4, 0xff, 0x35, + 0x60, 0x02, 0x40, 0x39, 0x81, 0x00, 0x80, 0x52, 0xcb, 0x0f, 0x00, 0x94, + 0x40, 0xf4, 0xff, 0x35, 0x60, 0x02, 0x40, 0x39, 0x02, 0x00, 0x80, 0x52, + 0x61, 0x00, 0x80, 0x52, 0x6e, 0x10, 0x00, 0x94, 0x9d, 0xff, 0xff, 0x17, + 0xa3, 0x00, 0x00, 0xb0, 0x63, 0xc0, 0x1c, 0x91, 0xe2, 0xdd, 0x83, 0x12, + 0x01, 0x1c, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0xd3, 0x76, 0xff, 0x97, + 0x00, 0x22, 0x9c, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc6, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x02, 0x80, 0x52, 0xa3, 0x00, 0x00, 0xb0, + 0x63, 0x80, 0x17, 0x91, 0xa2, 0xf9, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, + 0xc6, 0x76, 0xff, 0x97, 0x40, 0x06, 0x9c, 0x52, 0x88, 0xff, 0xff, 0x17, + 0xe4, 0x03, 0x00, 0x2a, 0xa3, 0x00, 0x00, 0xb0, 0x80, 0x00, 0x80, 0x52, + 0x63, 0xa0, 0x1b, 0x91, 0x02, 0xde, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, + 0xbd, 0x76, 0xff, 0x97, 0xe0, 0x21, 0x9c, 0x52, 0x7f, 0xff, 0xff, 0x17, + 0x1f, 0x18, 0x1c, 0x71, 0x20, 0xfc, 0xff, 0x54, 0xe4, 0x03, 0x00, 0x2a, + 0xa3, 0x00, 0x00, 0xb0, 0x00, 0x02, 0x80, 0x52, 0x63, 0xc0, 0x1d, 0x91, + 0xc2, 0xdd, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, 0xb2, 0x76, 0xff, 0x97, + 0x20, 0x22, 0x9c, 0x52, 0x74, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xe2, 0x03, 0x01, 0x2a, 0xfd, 0x03, 0x00, 0x91, 0x03, 0x1c, 0x40, 0xf9, + 0xff, 0x7f, 0x02, 0xa9, 0x04, 0x14, 0x40, 0xf9, 0xf3, 0x0b, 0x00, 0xf9, + 0xf3, 0x03, 0x00, 0xaa, 0x01, 0x00, 0x40, 0x39, 0x60, 0x0c, 0x02, 0x8b, + 0x00, 0x24, 0x40, 0xf9, 0xc0, 0x0a, 0x00, 0xb4, 0x84, 0x08, 0x40, 0x91, + 0x62, 0x00, 0x02, 0x8b, 0x03, 0x08, 0x80, 0x52, 0x84, 0x9c, 0x67, 0x39, + 0x42, 0xc0, 0x41, 0x39, 0x84, 0x02, 0x00, 0x35, 0x24, 0x00, 0x80, 0x52, + 0x71, 0xaa, 0xff, 0x97, 0x00, 0x03, 0x00, 0x35, 0x1f, 0x20, 0x03, 0xd5, + 0x60, 0x4a, 0x40, 0xf9, 0xe1, 0x83, 0x00, 0x91, 0x02, 0x00, 0x80, 0x12, + 0x4f, 0x51, 0xff, 0x97, 0x1f, 0x68, 0x08, 0x71, 0x60, 0xff, 0xff, 0x54, + 0x80, 0x03, 0x00, 0x35, 0xe4, 0x27, 0x40, 0xb9, 0x13, 0x00, 0x80, 0x52, + 0x80, 0x1c, 0x00, 0x72, 0xc1, 0x04, 0x00, 0x54, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x9f, 0x08, 0x00, 0x71, 0x04, 0x02, 0x80, 0x52, 0x03, 0x04, 0x80, 0x52, + 0x63, 0x10, 0x84, 0x1a, 0x24, 0x00, 0x80, 0x52, 0x5a, 0xaa, 0xff, 0x97, + 0x60, 0xfd, 0xff, 0x34, 0xe4, 0x03, 0x00, 0x2a, 0x82, 0xdd, 0x83, 0x12, + 0x01, 0x1c, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0x73, 0x22, 0x9c, 0x52, + 0xa3, 0x00, 0x00, 0xb0, 0x63, 0x00, 0x20, 0x91, 0x79, 0x76, 0xff, 0x97, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x1f, 0x18, 0x1c, 0x71, 0x80, 0x03, 0x00, 0x54, + 0xe4, 0x03, 0x00, 0x2a, 0x42, 0xdd, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xb3, 0x22, 0x9c, 0x52, 0xa3, 0x00, 0x00, 0xb0, + 0x63, 0x80, 0x22, 0x91, 0x6b, 0x76, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x1f, 0x10, 0x00, 0x71, 0xe0, 0x02, 0x00, 0x54, 0x1f, 0x0c, 0x00, 0x71, + 0x00, 0x04, 0x00, 0x54, 0xc2, 0x22, 0x9c, 0x52, 0xf3, 0x03, 0x02, 0x2a, + 0x01, 0x1c, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0xa3, 0x00, 0x00, 0x90, + 0x63, 0x40, 0x1f, 0x91, 0x5c, 0x76, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xa3, 0x00, 0x00, 0x90, 0x04, 0x71, 0x82, 0x52, 0x63, 0x20, 0x21, 0x91, + 0x62, 0xdd, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, + 0x93, 0x22, 0x9c, 0x52, 0x50, 0x76, 0xff, 0x97, 0xc4, 0xff, 0xff, 0x17, + 0xe2, 0x22, 0x9c, 0x52, 0xf3, 0x03, 0x02, 0x2a, 0xec, 0xff, 0xff, 0x17, + 0xa3, 0x00, 0x00, 0x90, 0x63, 0x80, 0x17, 0x91, 0xa2, 0xf9, 0x83, 0x12, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x53, 0x06, 0x9c, 0x52, + 0x45, 0x76, 0xff, 0x97, 0xb9, 0xff, 0xff, 0x17, 0x82, 0x2e, 0x9c, 0x52, + 0xf3, 0x03, 0x02, 0x2a, 0xe1, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xbf, 0xa9, + 0x02, 0x3c, 0x85, 0xd2, 0xfd, 0x03, 0x00, 0x91, 0x01, 0x14, 0x40, 0xf9, + 0x20, 0x08, 0x40, 0x91, 0x21, 0x00, 0x02, 0x8b, 0x00, 0x80, 0x67, 0x39, + 0x3d, 0xa9, 0xff, 0x97, 0x80, 0x00, 0x00, 0x35, 0x00, 0x00, 0x80, 0x52, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0xa3, 0x00, 0x00, 0x90, + 0x63, 0xe0, 0x23, 0x91, 0x2f, 0x76, 0xff, 0x97, 0x80, 0x04, 0x9c, 0x52, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x80, 0x00, 0x91, + 0x13, 0xa9, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x28, 0x21, 0x8b, 0x0e, 0x00, 0x41, 0xb9, 0x10, 0x58, 0x42, 0x79, + 0x0f, 0x05, 0x41, 0xb9, 0xff, 0x01, 0x0e, 0x6b, 0xe2, 0x06, 0x00, 0x54, + 0xfd, 0x7b, 0xbe, 0xa9, 0x21, 0x3c, 0x00, 0x12, 0xce, 0x01, 0x0f, 0x4b, + 0xfd, 0x03, 0x00, 0x91, 0xbe, 0x20, 0x00, 0x91, 0x72, 0x20, 0x00, 0x91, + 0x0a, 0x00, 0x80, 0xd2, 0x09, 0x00, 0x80, 0x52, 0x11, 0xc0, 0x40, 0xf9, + 0x00, 0xe0, 0xe7, 0xd2, 0x02, 0x00, 0x67, 0x9e, 0xf3, 0x0b, 0x00, 0xf9, + 0x93, 0x20, 0x00, 0x91, 0x18, 0x00, 0x00, 0x14, 0xc0, 0x6b, 0x6a, 0xfc, + 0x45, 0x6a, 0x6a, 0xfc, 0x63, 0x68, 0x6a, 0xfc, 0xa1, 0x68, 0x6a, 0xfc, + 0x00, 0x38, 0x65, 0x1e, 0x64, 0x68, 0x68, 0xfc, 0x21, 0x38, 0x63, 0x1e, + 0xa3, 0x05, 0x40, 0xfd, 0x21, 0x08, 0x62, 0x1e, 0x00, 0x7c, 0x7c, 0xd3, + 0x00, 0x08, 0x62, 0x1e, 0x84, 0x08, 0x62, 0x1e, 0xeb, 0x00, 0x00, 0x8b, + 0x63, 0x08, 0x62, 0x1e, 0xc8, 0x00, 0x00, 0x8b, 0x29, 0x05, 0x00, 0x11, + 0xe1, 0x68, 0x20, 0xfc, 0xdf, 0x01, 0x09, 0x6b, 0x60, 0x05, 0x00, 0xfd, + 0x4a, 0x41, 0x00, 0x91, 0xc4, 0x68, 0x20, 0xfc, 0x03, 0x05, 0x00, 0xfd, + 0xe0, 0x01, 0x00, 0x54, 0x2b, 0x02, 0x40, 0x39, 0x48, 0x00, 0x09, 0x0b, + 0x1f, 0x02, 0x01, 0x6b, 0xe0, 0x01, 0x09, 0x0b, 0x08, 0xed, 0x7c, 0xd3, + 0x00, 0x10, 0x89, 0x1a, 0xac, 0x00, 0x08, 0x8b, 0x6d, 0x00, 0x08, 0x8b, + 0x2b, 0xfc, 0xff, 0x35, 0x81, 0x68, 0x6a, 0xfc, 0x60, 0x6a, 0x6a, 0xfc, + 0xa4, 0x68, 0x68, 0xfc, 0x83, 0x05, 0x40, 0xfd, 0xe4, 0xff, 0xff, 0x17, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x90, 0xc7, 0xc0, 0x25, 0x91, + 0xfd, 0x7b, 0xba, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xc1, 0xb8, 0x44, 0xfd, + 0xe0, 0x04, 0x40, 0xfd, 0xf5, 0x5b, 0x02, 0xa9, 0x56, 0x40, 0x00, 0x51, + 0xf7, 0x63, 0x03, 0xa9, 0xf8, 0x03, 0x04, 0x2a, 0xf9, 0x6b, 0x04, 0xa9, + 0xf9, 0x03, 0x05, 0xaa, 0xe1, 0x03, 0x05, 0x6d, 0x43, 0x04, 0x00, 0x34, + 0xfa, 0x03, 0x03, 0x2a, 0xd7, 0x7e, 0x7c, 0x93, 0xf3, 0x53, 0x01, 0xa9, + 0x14, 0x00, 0x02, 0x91, 0x33, 0x00, 0x02, 0x91, 0x15, 0x00, 0x80, 0x52, + 0xe1, 0x03, 0x13, 0xaa, 0xe0, 0x03, 0x14, 0xaa, 0xb5, 0x06, 0x00, 0x11, + 0xe5, 0x43, 0x01, 0x91, 0xe4, 0x03, 0x18, 0x2a, 0xe3, 0x03, 0x16, 0x2a, + 0xe2, 0x03, 0x16, 0x2a, 0x06, 0x00, 0x80, 0x52, 0x2c, 0x2d, 0x00, 0x94, + 0x73, 0x02, 0x17, 0x8b, 0xbf, 0x02, 0x1a, 0x6b, 0x94, 0x02, 0x17, 0x8b, + 0x81, 0xfe, 0xff, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0xe2, 0x0f, 0x45, 0x6d, + 0xd6, 0x02, 0x18, 0x4b, 0x01, 0x10, 0x6e, 0x1e, 0xc0, 0x02, 0x62, 0x1e, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0x20, 0x18, 0x60, 0x1e, + 0x02, 0x08, 0x62, 0x1e, 0x00, 0x08, 0x63, 0x1e, 0x22, 0x03, 0x00, 0x6d, + 0xf9, 0x6b, 0x44, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x02, 0xe4, 0x00, 0x2f, 0x43, 0x40, 0x60, 0x1e, 0xf2, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0b, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xa9, 0xa9, 0xe4, 0x03, 0x00, 0xaa, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x02, 0xaa, 0x22, 0x14, 0x40, 0xb9, + 0xe0, 0x9b, 0x00, 0xf9, 0x13, 0x64, 0x40, 0xf9, 0xe2, 0x2b, 0x01, 0xb9, + 0x20, 0x2c, 0x40, 0xb9, 0x82, 0x68, 0x40, 0xf9, 0xf5, 0x5b, 0x02, 0xa9, + 0xfb, 0x73, 0x05, 0xa9, 0xfb, 0x03, 0x03, 0xaa, 0xe2, 0xa3, 0x00, 0xf9, + 0x60, 0x50, 0x00, 0x35, 0x20, 0x04, 0x40, 0xb9, 0xe0, 0x2f, 0x01, 0xb9, + 0xe3, 0x9b, 0x40, 0xf9, 0xe0, 0x2f, 0x41, 0xb9, 0xe6, 0x2b, 0x41, 0xb9, + 0x65, 0x14, 0x40, 0xf9, 0x1f, 0x00, 0x06, 0x6b, 0x60, 0xcc, 0x40, 0xf9, + 0xe5, 0xab, 0x00, 0xf9, 0x24, 0xc0, 0x40, 0x39, 0xb5, 0x28, 0x00, 0x91, + 0x3c, 0x10, 0x40, 0xb9, 0x34, 0x10, 0x40, 0xfd, 0x61, 0x7c, 0x40, 0xf9, + 0xe1, 0x67, 0x00, 0xf9, 0xa2, 0x1c, 0x40, 0x39, 0x00, 0x00, 0x40, 0x39, + 0x42, 0x0c, 0x00, 0x12, 0xe9, 0x12, 0x00, 0x54, 0x03, 0x1c, 0x40, 0x92, + 0x00, 0x7c, 0x40, 0x93, 0x41, 0x20, 0x84, 0xd2, 0xec, 0x37, 0x08, 0x6d, + 0x0c, 0xe4, 0x00, 0x2f, 0xc2, 0x00, 0x02, 0x4b, 0x00, 0x14, 0x01, 0x9b, + 0xe2, 0xd7, 0x00, 0xb9, 0x62, 0x7c, 0x01, 0x9b, 0x81, 0x77, 0x1e, 0x53, + 0x00, 0x08, 0x40, 0x91, 0x4d, 0x40, 0x85, 0xd2, 0x8d, 0x41, 0x60, 0x1e, + 0xe8, 0x27, 0x06, 0x6d, 0x89, 0x41, 0x60, 0x1e, 0x88, 0x41, 0x60, 0x1e, + 0xea, 0x2f, 0x07, 0x6d, 0x8b, 0x41, 0x60, 0x1e, 0x8a, 0x41, 0x60, 0x1e, + 0xee, 0x3f, 0x09, 0x6d, 0x8e, 0x41, 0x60, 0x1e, 0x8f, 0x41, 0x60, 0x1e, + 0xe1, 0x3f, 0x01, 0xb9, 0xe1, 0x03, 0x02, 0xaa, 0xe2, 0xb3, 0x00, 0xf9, + 0x42, 0x00, 0x0d, 0x8b, 0x9f, 0x00, 0x00, 0x71, 0xce, 0x40, 0x85, 0xd2, + 0xf6, 0x03, 0x06, 0x2a, 0x21, 0x00, 0x0e, 0x8b, 0xf9, 0x6b, 0x04, 0xa9, + 0xfa, 0x03, 0x14, 0xaa, 0xf4, 0x03, 0x1c, 0x2a, 0xe0, 0xa7, 0x00, 0xf9, + 0xa0, 0x00, 0x02, 0x8b, 0xe3, 0x07, 0x9f, 0x1a, 0xf7, 0x63, 0x03, 0xa9, + 0xe3, 0x3b, 0x01, 0xb9, 0xe0, 0xb7, 0x00, 0xf9, 0xa0, 0x00, 0x01, 0x8b, + 0xe0, 0xaf, 0x00, 0xf9, 0xc3, 0x06, 0x00, 0x11, 0xc2, 0x0a, 0x00, 0x11, + 0xc0, 0x0e, 0x00, 0x11, 0xc1, 0x7e, 0x7c, 0xd3, 0x65, 0xec, 0x7c, 0xd3, + 0x46, 0xec, 0x7c, 0xd3, 0x07, 0xec, 0x7c, 0xd3, 0x64, 0x02, 0x05, 0x8b, + 0x60, 0x02, 0x01, 0x8b, 0x63, 0x02, 0x06, 0x8b, 0x62, 0x02, 0x07, 0x8b, + 0x67, 0x6a, 0x65, 0xfc, 0x83, 0x04, 0x40, 0xfd, 0xc8, 0x0a, 0x00, 0x11, + 0x00, 0x04, 0x40, 0xfd, 0xa0, 0x99, 0x99, 0x52, 0x80, 0x99, 0xb9, 0x72, + 0x41, 0x04, 0x40, 0xfd, 0x62, 0x04, 0x40, 0xfd, 0x63, 0x08, 0x63, 0x1e, + 0x64, 0x6a, 0x61, 0xfc, 0x00, 0x08, 0x60, 0x1e, 0x66, 0x6a, 0x66, 0xfc, + 0x21, 0x08, 0x61, 0x1e, 0x65, 0x6a, 0x67, 0xfc, 0x42, 0x08, 0x62, 0x1e, + 0x80, 0x00, 0x44, 0x1f, 0xe3, 0x0c, 0x47, 0x1f, 0xc2, 0x08, 0x46, 0x1f, + 0xc2, 0x0e, 0x00, 0x11, 0xa1, 0x04, 0x45, 0x1f, 0xe1, 0x17, 0x10, 0xa9, + 0xc5, 0x06, 0x00, 0x11, 0xd9, 0x7e, 0xa0, 0x9b, 0x84, 0x02, 0x80, 0x52, + 0x18, 0x7d, 0xa0, 0x9b, 0x03, 0x0f, 0x80, 0x52, 0xbc, 0x7c, 0xa0, 0x9b, + 0x17, 0x00, 0x80, 0xd2, 0x40, 0x7c, 0xa0, 0x9b, 0x39, 0xff, 0x64, 0xd3, + 0x00, 0xc0, 0x61, 0x1e, 0x18, 0xff, 0x64, 0xd3, 0x42, 0xc0, 0x61, 0x1e, + 0x9c, 0xff, 0x64, 0xd3, 0x00, 0xfc, 0x64, 0xd3, 0x39, 0xdb, 0x04, 0x1b, + 0x21, 0xc0, 0x61, 0x1e, 0x18, 0xa3, 0x04, 0x1b, 0x63, 0xc0, 0x61, 0x1e, + 0x9c, 0x97, 0x04, 0x1b, 0x00, 0x88, 0x04, 0x1b, 0xf3, 0x6f, 0x00, 0xf9, + 0xe1, 0x67, 0x40, 0xf9, 0xf3, 0x03, 0x17, 0xaa, 0xe8, 0xc7, 0x00, 0xb9, + 0xe5, 0xd3, 0x00, 0xb9, 0x00, 0x04, 0xa3, 0x9b, 0xe6, 0x1f, 0x11, 0xa9, + 0x9c, 0x07, 0xa3, 0x9b, 0x39, 0x07, 0xa3, 0x9b, 0xf7, 0x03, 0x00, 0xaa, + 0x18, 0x07, 0xa3, 0x9b, 0xe2, 0x27, 0x01, 0xb9, 0xf4, 0x73, 0x00, 0xfd, + 0xe1, 0x0b, 0x0a, 0x6d, 0xe0, 0x0f, 0x0b, 0x6d, 0x1f, 0x20, 0x03, 0xd5, + 0xe0, 0x5b, 0x40, 0xfd, 0xe0, 0x03, 0x13, 0x2a, 0x2e, 0x1a, 0x00, 0x94, + 0x20, 0x7b, 0x33, 0xfc, 0xe0, 0x5f, 0x40, 0xfd, 0xe0, 0x03, 0x13, 0x2a, + 0x2a, 0x1a, 0x00, 0x94, 0x80, 0x7b, 0x33, 0xfc, 0xe0, 0x57, 0x40, 0xfd, + 0xe0, 0x03, 0x13, 0x2a, 0x26, 0x1a, 0x00, 0x94, 0x00, 0x7b, 0x33, 0xfc, + 0xe0, 0x53, 0x40, 0xfd, 0xe0, 0x03, 0x13, 0x2a, 0x22, 0x1a, 0x00, 0x94, + 0xe0, 0x7a, 0x33, 0xfc, 0x73, 0x06, 0x00, 0x91, 0x7f, 0x3e, 0x00, 0xf1, + 0xc1, 0xfd, 0xff, 0x54, 0xe0, 0x2b, 0x41, 0xb9, 0xe1, 0x3b, 0x41, 0xb9, + 0xc0, 0x02, 0x00, 0x4b, 0xf4, 0x73, 0x40, 0xfd, 0x3f, 0x00, 0x00, 0x71, + 0x00, 0x10, 0x00, 0x11, 0x02, 0x18, 0x50, 0x7a, 0xf3, 0x6f, 0x40, 0xf9, + 0x68, 0x02, 0x00, 0x54, 0xe0, 0xd7, 0x40, 0xb9, 0xd6, 0x12, 0x00, 0x11, + 0x00, 0x10, 0x00, 0x11, 0xe0, 0xd7, 0x00, 0xb9, 0xe0, 0x2f, 0x41, 0xb9, + 0x1f, 0x00, 0x16, 0x6b, 0x48, 0xf3, 0xff, 0x54, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xe8, 0x27, 0x46, 0x6d, 0xea, 0x2f, 0x47, 0x6d, + 0xec, 0x37, 0x48, 0x6d, 0xee, 0x3f, 0x49, 0x6d, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xd7, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0xa7, 0x40, 0xf9, 0xe1, 0x9b, 0x40, 0xf9, + 0x00, 0x00, 0x68, 0x39, 0x38, 0x18, 0x40, 0xf9, 0x20, 0x18, 0x00, 0x34, + 0xe1, 0xd7, 0x40, 0xb9, 0xab, 0x99, 0x99, 0x52, 0x8b, 0x99, 0xb9, 0x72, + 0x00, 0x04, 0x00, 0x51, 0x23, 0x04, 0x00, 0x11, 0x2c, 0x08, 0x00, 0x11, + 0x2d, 0x0c, 0x00, 0x11, 0x82, 0x10, 0x80, 0x52, 0xe4, 0x73, 0x56, 0xa9, + 0x7e, 0x7c, 0xab, 0x9b, 0x28, 0x7c, 0xab, 0x9b, 0x8a, 0x02, 0x80, 0x52, + 0x87, 0x7d, 0xab, 0x9b, 0x25, 0x04, 0x00, 0x11, 0xa6, 0x7d, 0xab, 0x9b, + 0xde, 0xff, 0x64, 0xd3, 0x08, 0xfd, 0x64, 0xd3, 0xe3, 0x33, 0x1f, 0x29, + 0x00, 0x10, 0xa2, 0x9b, 0xe7, 0xfc, 0x64, 0xd3, 0xc6, 0xfc, 0x64, 0xd3, + 0xde, 0x8f, 0x0a, 0x1b, 0xe2, 0xab, 0x40, 0xf9, 0x08, 0x85, 0x0a, 0x1b, + 0xe7, 0xb0, 0x0a, 0x1b, 0x24, 0x08, 0x00, 0x11, 0x23, 0x0c, 0x00, 0x11, + 0xc6, 0xb4, 0x0a, 0x1b, 0xcc, 0x50, 0x85, 0xd2, 0x4c, 0x00, 0x0c, 0x8b, + 0x22, 0x7c, 0x7c, 0xd3, 0x00, 0x00, 0x0c, 0x8b, 0xe1, 0x67, 0x40, 0xf9, + 0x09, 0x0f, 0x80, 0x52, 0xe0, 0x5f, 0x00, 0xf9, 0x60, 0x12, 0x05, 0x8b, + 0xf7, 0x27, 0x41, 0xb9, 0xb9, 0x02, 0x80, 0x52, 0xe0, 0x73, 0x00, 0xf9, + 0x60, 0x12, 0x04, 0x8b, 0xde, 0x07, 0xa9, 0x9b, 0xe0, 0x77, 0x00, 0xf9, + 0x0f, 0x05, 0xa9, 0x9b, 0x60, 0x12, 0x03, 0x8b, 0xee, 0x04, 0xa9, 0x9b, + 0xed, 0x23, 0x01, 0xb9, 0xcd, 0x04, 0xa9, 0x9b, 0xe0, 0x7b, 0x00, 0xf9, + 0xe1, 0xaf, 0x40, 0xf9, 0x60, 0x02, 0x02, 0x8b, 0xe1, 0x53, 0x00, 0xf9, + 0xe0, 0x6f, 0x00, 0xf9, 0x1f, 0x20, 0x03, 0xd5, 0x8c, 0x03, 0x40, 0x39, + 0x80, 0x07, 0x40, 0x39, 0x9f, 0x21, 0x00, 0x71, 0x80, 0x2a, 0x00, 0x54, + 0xc8, 0x21, 0x00, 0x54, 0x9f, 0x05, 0x00, 0x71, 0xe8, 0x18, 0x00, 0x54, + 0xe1, 0xd3, 0x40, 0xb9, 0xc3, 0x02, 0x00, 0x4b, 0x22, 0x00, 0x00, 0x4b, + 0xe1, 0xc7, 0x40, 0xb9, 0x63, 0xec, 0x7c, 0xd3, 0x21, 0x00, 0x00, 0x4b, + 0xe0, 0x02, 0x00, 0x4b, 0x42, 0xec, 0x7c, 0xd3, 0x66, 0x02, 0x03, 0x8b, + 0x21, 0xec, 0x7c, 0xd3, 0x00, 0xec, 0x7c, 0xd3, 0x65, 0x02, 0x02, 0x8b, + 0x64, 0x02, 0x01, 0x8b, 0x68, 0x6a, 0x63, 0xfc, 0x63, 0x02, 0x00, 0x8b, + 0x69, 0x6a, 0x62, 0xfc, 0x6a, 0x6a, 0x61, 0xfc, 0x6b, 0x6a, 0x60, 0xfc, + 0x6c, 0x04, 0x40, 0xfd, 0x8d, 0x04, 0x40, 0xfd, 0xae, 0x04, 0x40, 0xfd, + 0xcf, 0x04, 0x40, 0xfd, 0x1f, 0x20, 0x03, 0xd5, 0x88, 0x07, 0x40, 0x79, + 0x08, 0x09, 0x74, 0x1e, 0xef, 0x09, 0x74, 0x1e, 0x29, 0x09, 0x74, 0x1e, + 0xce, 0x09, 0x74, 0x1e, 0x4a, 0x09, 0x74, 0x1e, 0xad, 0x09, 0x74, 0x1e, + 0x6b, 0x09, 0x74, 0x1e, 0x8c, 0x09, 0x74, 0x1e, 0xa8, 0x0b, 0x00, 0x34, + 0xe1, 0x53, 0x40, 0xf9, 0x00, 0x05, 0x00, 0x51, 0xf3, 0xf3, 0x0a, 0xa9, + 0x28, 0x08, 0x00, 0x91, 0xfc, 0xd3, 0x40, 0xb9, 0x08, 0x45, 0x20, 0x8b, + 0xf3, 0x67, 0x40, 0xf9, 0x47, 0x00, 0x00, 0x14, 0xa7, 0x6a, 0xe3, 0x38, + 0x62, 0x0e, 0x22, 0x8b, 0xe3, 0xc7, 0x40, 0xb9, 0xd2, 0x02, 0x07, 0x4b, + 0x91, 0x03, 0x07, 0x4b, 0x70, 0x00, 0x07, 0x4b, 0xe7, 0x02, 0x07, 0x4b, + 0x46, 0x7e, 0xab, 0x9b, 0x25, 0x7e, 0xab, 0x9b, 0x04, 0x7e, 0xab, 0x9b, + 0xe3, 0x7c, 0xab, 0x9b, 0xc6, 0xfc, 0x64, 0xd3, 0xa5, 0xfc, 0x64, 0xd3, + 0x84, 0xfc, 0x64, 0xd3, 0x63, 0xfc, 0x64, 0xd3, 0xc6, 0xc8, 0x0a, 0x1b, + 0xa5, 0xc4, 0x0a, 0x1b, 0x84, 0xc0, 0x0a, 0x1b, 0x63, 0x9c, 0x0a, 0x1b, + 0xc6, 0x7c, 0xa9, 0x9b, 0xa5, 0x7c, 0xa9, 0x9b, 0x84, 0x7c, 0xa9, 0x9b, + 0x63, 0x7c, 0xa9, 0x9b, 0x43, 0x68, 0x66, 0xfc, 0x42, 0x68, 0x65, 0xfc, + 0x41, 0x68, 0x64, 0xfc, 0x40, 0x68, 0x63, 0xfc, 0x67, 0x08, 0x68, 0x1e, + 0x43, 0x03, 0x40, 0xb9, 0x63, 0x08, 0x6f, 0x1e, 0x46, 0x08, 0x69, 0x1e, + 0x04, 0x00, 0x03, 0x0b, 0x42, 0x08, 0x6e, 0x1e, 0x00, 0x00, 0x03, 0x0b, + 0x25, 0x08, 0x6a, 0x1e, 0xe2, 0x00, 0x64, 0x9e, 0x84, 0xf0, 0x7d, 0xd3, + 0x66, 0x00, 0x64, 0x9e, 0x83, 0x02, 0x00, 0x0b, 0xc7, 0x00, 0x64, 0x9e, + 0x45, 0x00, 0x64, 0x9e, 0x63, 0xf0, 0x7d, 0xd3, 0x80, 0x02, 0x00, 0x0b, + 0x21, 0x08, 0x6d, 0x1e, 0x04, 0x08, 0x6b, 0x1e, 0x62, 0x6b, 0x24, 0xb8, + 0x64, 0x03, 0x04, 0x8b, 0x82, 0x02, 0x00, 0x0b, 0x00, 0x08, 0x6c, 0x1e, + 0x80, 0x02, 0x00, 0x0b, 0x21, 0x08, 0x00, 0x91, 0x86, 0x04, 0x00, 0xb9, + 0xa4, 0x00, 0x64, 0x9e, 0x67, 0x6b, 0x23, 0xb8, 0x63, 0x03, 0x03, 0x8b, + 0x42, 0xf0, 0x7d, 0xd3, 0x26, 0x00, 0x64, 0x9e, 0x80, 0x02, 0x00, 0x0b, + 0x1f, 0x01, 0x01, 0xeb, 0x65, 0x04, 0x00, 0xb9, 0x85, 0x00, 0x64, 0x9e, + 0x03, 0x00, 0x64, 0x9e, 0x64, 0x6b, 0x22, 0xb8, 0x62, 0x03, 0x02, 0x8b, + 0x00, 0xf0, 0x7d, 0xd3, 0x64, 0x03, 0x00, 0x8b, 0x46, 0x04, 0x00, 0xb9, + 0x65, 0x6b, 0x20, 0xb8, 0x83, 0x04, 0x00, 0xb9, 0xc0, 0x01, 0x00, 0x54, + 0x20, 0x00, 0x40, 0x79, 0x9f, 0x19, 0x00, 0x71, 0x04, 0x23, 0x20, 0x8b, + 0x03, 0x7c, 0xb9, 0x9b, 0xa2, 0x02, 0x03, 0x8b, 0x80, 0xe4, 0x76, 0x39, + 0x42, 0x08, 0x40, 0x39, 0x69, 0xf6, 0xff, 0x54, 0xe3, 0x79, 0x62, 0xfc, + 0xc2, 0x7b, 0x62, 0xfc, 0xc1, 0x79, 0x62, 0xfc, 0xa0, 0x79, 0x62, 0xfc, + 0xc9, 0xff, 0xff, 0x17, 0xf3, 0xf3, 0x4a, 0xa9, 0x9c, 0x13, 0x02, 0x91, + 0xe0, 0x53, 0x40, 0xf9, 0x00, 0x10, 0x02, 0x91, 0xe0, 0x53, 0x00, 0xf9, + 0xe0, 0x5f, 0x40, 0xf9, 0x1f, 0x00, 0x1c, 0xeb, 0xc1, 0xee, 0xff, 0x54, + 0xe3, 0x1b, 0x50, 0xa9, 0xe0, 0x9b, 0x40, 0xf9, 0xe1, 0xa3, 0x40, 0xf9, + 0x02, 0xcc, 0x40, 0xf9, 0x25, 0x00, 0x03, 0x8b, 0xe7, 0x8b, 0x40, 0xf9, + 0x20, 0x00, 0x06, 0x8b, 0x42, 0x00, 0x40, 0x39, 0x20, 0x68, 0x63, 0xfc, + 0x24, 0x00, 0x07, 0x8b, 0x25, 0x68, 0x66, 0xfc, 0x18, 0x03, 0x02, 0x8b, + 0xa6, 0x04, 0x40, 0xfd, 0xe6, 0x8f, 0x40, 0xf9, 0x80, 0x0a, 0x60, 0x1e, + 0x04, 0x04, 0x40, 0xfd, 0x86, 0x0a, 0x66, 0x1e, 0x23, 0x00, 0x06, 0x8b, + 0x23, 0x68, 0x67, 0xfc, 0x42, 0x03, 0x40, 0xb9, 0x85, 0x0a, 0x65, 0x1e, + 0x00, 0xc7, 0x74, 0x39, 0x84, 0x0a, 0x64, 0x1e, 0x82, 0x04, 0x40, 0xfd, + 0x05, 0x00, 0x64, 0x9e, 0x21, 0x68, 0x66, 0xfc, 0x04, 0x00, 0x02, 0x0b, + 0x83, 0x0a, 0x63, 0x1e, 0x60, 0x04, 0x40, 0xfd, 0x00, 0x00, 0x02, 0x0b, + 0xc9, 0x00, 0x64, 0x9e, 0x82, 0x0a, 0x62, 0x1e, 0x84, 0xf0, 0x7d, 0xd3, + 0xa8, 0x00, 0x64, 0x9e, 0x83, 0x02, 0x00, 0x0b, 0x81, 0x0a, 0x61, 0x1e, + 0x87, 0x00, 0x64, 0x9e, 0x6b, 0x03, 0x04, 0x8b, 0x80, 0x02, 0x00, 0x0b, + 0x80, 0x0a, 0x60, 0x1e, 0x63, 0xf0, 0x7d, 0xd3, 0x82, 0x02, 0x00, 0x0b, + 0x66, 0x00, 0x64, 0x9e, 0x6a, 0x03, 0x03, 0x8b, 0x80, 0x02, 0x00, 0x0b, + 0x65, 0x6b, 0x24, 0xb8, 0x45, 0x00, 0x64, 0x9e, 0x42, 0xf0, 0x7d, 0xd3, + 0x24, 0x00, 0x64, 0x9e, 0x80, 0x02, 0x00, 0x0b, 0x69, 0x05, 0x00, 0xb9, + 0x68, 0x6b, 0x23, 0xb8, 0x03, 0x00, 0x64, 0x9e, 0x68, 0x03, 0x02, 0x8b, + 0x00, 0xf0, 0x7d, 0xd3, 0x47, 0x05, 0x00, 0xb9, 0x67, 0x03, 0x00, 0x8b, + 0x66, 0x6b, 0x22, 0xb8, 0x05, 0x05, 0x00, 0xb9, 0x64, 0x6b, 0x20, 0xb8, + 0xe3, 0x04, 0x00, 0xb9, 0xe1, 0x3f, 0x41, 0xb9, 0x40, 0x03, 0x40, 0xb9, + 0x00, 0x00, 0x01, 0x0b, 0x40, 0x03, 0x00, 0xb9, 0xe8, 0xfe, 0xff, 0x17, + 0x9f, 0x1d, 0x00, 0x71, 0x01, 0xea, 0xff, 0x54, 0xe1, 0x97, 0x4d, 0xa9, + 0xe6, 0x9f, 0x4e, 0xa9, 0xe2, 0xd7, 0x40, 0xb9, 0x43, 0x00, 0x00, 0x4b, + 0xe2, 0xfb, 0x40, 0xb9, 0x28, 0x08, 0x40, 0x6d, 0x42, 0x00, 0x00, 0x4b, + 0xe1, 0xff, 0x40, 0xb9, 0x63, 0xec, 0x7c, 0xd3, 0xa9, 0x04, 0x40, 0x6d, + 0x21, 0x00, 0x00, 0x4b, 0xca, 0x00, 0x40, 0x6d, 0x42, 0xec, 0x7c, 0xd3, + 0xeb, 0x10, 0x40, 0x6d, 0x21, 0xec, 0x7c, 0xd3, 0xe5, 0x23, 0x41, 0xb9, + 0x47, 0x08, 0x62, 0x1e, 0x26, 0x08, 0x61, 0x1e, 0x05, 0x08, 0x60, 0x1e, + 0xa0, 0x00, 0x00, 0x4b, 0x03, 0x09, 0x62, 0x1e, 0x22, 0x09, 0x61, 0x1e, + 0x41, 0x09, 0x60, 0x1e, 0x60, 0x09, 0x64, 0x1e, 0x84, 0x08, 0x64, 0x1e, + 0x0f, 0x9d, 0x48, 0x1f, 0x2e, 0x99, 0x49, 0x1f, 0x4d, 0x95, 0x4a, 0x1f, + 0x6c, 0x91, 0x4b, 0x1f, 0x08, 0x9d, 0x68, 0x1f, 0x29, 0x99, 0x69, 0x1f, + 0x4a, 0x95, 0x6a, 0x1f, 0x6b, 0x91, 0x6b, 0x1f, 0x00, 0xec, 0x7c, 0xd3, + 0x64, 0x02, 0x03, 0x8b, 0x77, 0x6a, 0x63, 0xfc, 0x63, 0x02, 0x02, 0x8b, + 0x76, 0x6a, 0x62, 0xfc, 0x62, 0x02, 0x01, 0x8b, 0x75, 0x6a, 0x61, 0xfc, + 0x61, 0x02, 0x00, 0x8b, 0x63, 0x28, 0x63, 0x1e, 0x42, 0x28, 0x62, 0x1e, + 0x21, 0x28, 0x61, 0x1e, 0x00, 0x28, 0x60, 0x1e, 0x66, 0x6a, 0x60, 0xfc, + 0x53, 0x04, 0x40, 0xfd, 0x27, 0x04, 0x40, 0xfd, 0x71, 0x08, 0x77, 0x1e, + 0x85, 0x04, 0x40, 0xfd, 0x52, 0x08, 0x76, 0x1e, 0x64, 0x04, 0x40, 0xfd, + 0x38, 0x08, 0x75, 0x1e, 0x10, 0x08, 0x66, 0x1e, 0x21, 0x08, 0x73, 0x1e, + 0x63, 0x08, 0x65, 0x1e, 0x00, 0x08, 0x67, 0x1e, 0x42, 0x08, 0x64, 0x1e, + 0xad, 0x61, 0x53, 0x1f, 0x4a, 0x05, 0x55, 0x1f, 0xef, 0x45, 0x45, 0x1f, + 0x08, 0x0d, 0x57, 0x1f, 0x8c, 0x41, 0x47, 0x1f, 0x6b, 0x01, 0x46, 0x1f, + 0xce, 0x49, 0x44, 0x1f, 0x29, 0x09, 0x56, 0x1f, 0x0d, 0xff, 0xff, 0x17, + 0x9f, 0x25, 0x00, 0x71, 0x61, 0xe1, 0xff, 0x54, 0xe1, 0xd7, 0x40, 0xb9, + 0xe4, 0x23, 0x41, 0xb9, 0x23, 0x00, 0x00, 0x4b, 0xe1, 0xfb, 0x40, 0xb9, + 0x22, 0x00, 0x00, 0x4b, 0xe1, 0xff, 0x40, 0xb9, 0x63, 0xec, 0x7c, 0xd3, + 0x42, 0xec, 0x7c, 0xd3, 0x21, 0x00, 0x00, 0x4b, 0x80, 0x00, 0x00, 0x4b, + 0x65, 0x02, 0x03, 0x8b, 0x21, 0xec, 0x7c, 0xd3, 0x64, 0x02, 0x02, 0x8b, + 0x00, 0xec, 0x7c, 0xd3, 0x71, 0x6a, 0x63, 0xfc, 0x63, 0x02, 0x01, 0x8b, + 0x72, 0x6a, 0x62, 0xfc, 0x62, 0x02, 0x00, 0x8b, 0x73, 0x6a, 0x61, 0xfc, + 0x70, 0x6a, 0x60, 0xfc, 0x60, 0x04, 0x40, 0xfd, 0x44, 0x04, 0x40, 0xfd, + 0x81, 0x04, 0x40, 0xfd, 0xa2, 0x04, 0x40, 0xfd, 0x05, 0x08, 0x60, 0x1e, + 0xe0, 0x87, 0x4d, 0xa9, 0x26, 0x08, 0x61, 0x1e, 0xe2, 0x8f, 0x4e, 0xa9, + 0x47, 0x08, 0x62, 0x1e, 0x23, 0x0a, 0x62, 0x1e, 0x42, 0x0a, 0x61, 0x1e, + 0x61, 0x0a, 0x60, 0x1e, 0x00, 0x0a, 0x64, 0x1e, 0x84, 0x08, 0x64, 0x1e, + 0x2c, 0x9e, 0x71, 0x1f, 0x6a, 0x96, 0x73, 0x1f, 0x49, 0x9a, 0x72, 0x1f, + 0x0b, 0x92, 0x70, 0x1f, 0x31, 0x9e, 0x51, 0x1f, 0x52, 0x9a, 0x52, 0x1f, + 0x73, 0x96, 0x53, 0x1f, 0x04, 0x92, 0x50, 0x1f, 0x63, 0x28, 0x63, 0x1e, + 0x08, 0x18, 0x40, 0x6d, 0x35, 0x14, 0x40, 0x6d, 0x42, 0x28, 0x62, 0x1e, + 0x21, 0x28, 0x61, 0x1e, 0x00, 0x28, 0x60, 0x1e, 0x5a, 0x34, 0x40, 0x6d, + 0x78, 0x08, 0x68, 0x1e, 0x79, 0x1c, 0x40, 0x6d, 0x57, 0x08, 0x75, 0x1e, + 0x36, 0x08, 0x7a, 0x1e, 0x63, 0x08, 0x66, 0x1e, 0x21, 0x08, 0x6d, 0x1e, + 0x42, 0x08, 0x65, 0x1e, 0x10, 0x08, 0x79, 0x1e, 0x00, 0x08, 0x67, 0x1e, + 0x88, 0x0d, 0x48, 0x1f, 0x2f, 0x62, 0x46, 0x1f, 0x29, 0x09, 0x55, 0x1f, + 0x4e, 0x5e, 0x45, 0x1f, 0x4a, 0x05, 0x5a, 0x1f, 0x6d, 0x5a, 0x4d, 0x1f, + 0x6b, 0x01, 0x59, 0x1f, 0x8c, 0x40, 0x47, 0x1f, 0xc8, 0xfe, 0xff, 0x17, + 0xe1, 0xd7, 0x40, 0xb9, 0xe4, 0x23, 0x41, 0xb9, 0x23, 0x00, 0x00, 0x4b, + 0xe1, 0xfb, 0x40, 0xb9, 0xe6, 0x9f, 0x4e, 0xa9, 0x22, 0x00, 0x00, 0x4b, + 0xe1, 0xff, 0x40, 0xb9, 0x63, 0xec, 0x7c, 0xd3, 0x42, 0xec, 0x7c, 0xd3, + 0x21, 0x00, 0x00, 0x4b, 0x80, 0x00, 0x00, 0x4b, 0x64, 0x02, 0x03, 0x8b, + 0x68, 0x6a, 0x63, 0xfc, 0x21, 0xec, 0x7c, 0xd3, 0x00, 0xec, 0x7c, 0xd3, + 0x63, 0x02, 0x02, 0x8b, 0x69, 0x6a, 0x62, 0xfc, 0x62, 0x02, 0x01, 0x8b, + 0x8f, 0x04, 0x40, 0xfd, 0x6a, 0x6a, 0x61, 0xfc, 0x61, 0x02, 0x00, 0x8b, + 0x6b, 0x6a, 0x60, 0xfc, 0xe5, 0x83, 0x4d, 0xa9, 0xd0, 0x10, 0x40, 0x6d, + 0xf5, 0x0c, 0x40, 0x6d, 0x13, 0x14, 0x40, 0x6d, 0x80, 0x08, 0x6a, 0x1e, + 0xb2, 0x18, 0x40, 0x6d, 0x67, 0x08, 0x6b, 0x1e, 0x2c, 0x04, 0x40, 0xfd, + 0xa1, 0x08, 0x69, 0x1e, 0x4d, 0x04, 0x40, 0xfd, 0x6e, 0x04, 0x40, 0xfd, + 0xc2, 0x08, 0x68, 0x1e, 0x42, 0x0a, 0x4f, 0x1f, 0xa7, 0x1e, 0x4c, 0x1f, + 0x00, 0x02, 0x4d, 0x1f, 0xc6, 0x08, 0x6f, 0x1e, 0x61, 0x06, 0x4e, 0x1f, + 0xa5, 0x08, 0x6e, 0x1e, 0x84, 0x08, 0x6d, 0x1e, 0x63, 0x08, 0x6c, 0x1e, + 0x51, 0x9a, 0x48, 0x1f, 0x46, 0x9a, 0x68, 0x1f, 0x72, 0x96, 0x49, 0x1f, + 0x65, 0x96, 0x69, 0x1f, 0x13, 0x92, 0x4a, 0x1f, 0x04, 0x92, 0x6a, 0x1f, + 0xb0, 0x8e, 0x4b, 0x1f, 0xa3, 0x8e, 0x6b, 0x1f, 0x18, 0x09, 0x62, 0x1e, + 0x75, 0x09, 0x67, 0x1e, 0x56, 0x09, 0x60, 0x1e, 0xe2, 0x09, 0x62, 0x1e, + 0x37, 0x09, 0x61, 0x1e, 0xa0, 0x09, 0x60, 0x1e, 0xc1, 0x09, 0x61, 0x1e, + 0x87, 0x09, 0x67, 0x1e, 0x2f, 0x62, 0x4f, 0x1f, 0x08, 0x09, 0x46, 0x1f, + 0x4e, 0x5e, 0x4e, 0x1f, 0x29, 0x05, 0x45, 0x1f, 0x6d, 0x5a, 0x4d, 0x1f, + 0x4a, 0x01, 0x44, 0x1f, 0x0c, 0x56, 0x4c, 0x1f, 0x6b, 0x1d, 0x43, 0x1f, + 0x85, 0xfe, 0xff, 0x17, 0x20, 0x08, 0x40, 0xb9, 0xe3, 0x2b, 0x41, 0xb9, + 0x22, 0x28, 0x40, 0xb9, 0x60, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x02, 0x0b, + 0xe0, 0x2f, 0x01, 0xb9, 0x7a, 0xfd, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x71, + 0x2d, 0x04, 0x00, 0x54, 0x01, 0xe4, 0x00, 0x2f, 0x24, 0x04, 0x00, 0x51, + 0x03, 0x40, 0x00, 0x91, 0xe2, 0x03, 0x00, 0xaa, 0x63, 0x50, 0x24, 0x8b, + 0x22, 0x40, 0x60, 0x1e, 0x43, 0x00, 0x40, 0x6d, 0x42, 0x40, 0x00, 0x91, + 0x7f, 0x00, 0x02, 0xeb, 0x42, 0x28, 0x63, 0x1e, 0x21, 0x28, 0x60, 0x1e, + 0x61, 0xff, 0xff, 0x54, 0x26, 0x00, 0x62, 0x1e, 0x04, 0x10, 0x6e, 0x1e, + 0x00, 0xe4, 0x00, 0x2f, 0x84, 0x18, 0x66, 0x1e, 0x45, 0x08, 0x64, 0x1e, + 0x24, 0x08, 0x64, 0x1e, 0x02, 0x0c, 0x40, 0x6d, 0x00, 0x40, 0x00, 0x91, + 0x7f, 0x00, 0x00, 0xeb, 0x63, 0x38, 0x64, 0x1e, 0x41, 0x38, 0x65, 0x1e, + 0x63, 0x08, 0x63, 0x1e, 0x21, 0x0c, 0x41, 0x1f, 0x00, 0x28, 0x61, 0x1e, + 0x01, 0xff, 0xff, 0x54, 0x81, 0x00, 0x62, 0x1e, 0x3f, 0x04, 0x00, 0x71, + 0x26, 0xcc, 0x66, 0x1e, 0x00, 0x18, 0x66, 0x1e, 0xc0, 0x03, 0x5f, 0xd6, + 0x26, 0x00, 0x62, 0x1e, 0x00, 0xe4, 0x00, 0x2f, 0x00, 0x18, 0x66, 0x1e, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbf, 0xa9, 0xe9, 0x03, 0x04, 0x2a, 0x9f, 0x00, 0x00, 0x71, + 0xfd, 0x03, 0x00, 0x91, 0x04, 0x20, 0x40, 0xf9, 0x05, 0x28, 0x40, 0xf9, + 0x8a, 0x5c, 0x44, 0x39, 0xb2, 0x40, 0x40, 0x6d, 0xb1, 0x1c, 0x42, 0x6d, + 0xad, 0x0d, 0x00, 0x54, 0xe7, 0x03, 0x01, 0xaa, 0xe6, 0x03, 0x03, 0xaa, + 0xe8, 0x03, 0x02, 0xaa, 0xe0, 0x03, 0x02, 0xaa, 0xe1, 0x03, 0x09, 0x2a, + 0xc9, 0xff, 0xff, 0x97, 0x14, 0x40, 0x60, 0x1e, 0xe0, 0x03, 0x07, 0xaa, + 0xc6, 0xff, 0xff, 0x97, 0x13, 0x40, 0x60, 0x1e, 0xe0, 0x03, 0x06, 0xaa, + 0xc3, 0xff, 0xff, 0x97, 0x18, 0x20, 0x60, 0x1e, 0x05, 0x10, 0x6e, 0x1e, + 0xa6, 0x40, 0x60, 0x1e, 0xcd, 0x00, 0x00, 0x54, 0xa0, 0x18, 0x60, 0x1e, + 0x86, 0x0a, 0x60, 0x1e, 0x60, 0x0a, 0x60, 0x1e, 0xc6, 0xc0, 0x61, 0x1e, + 0x05, 0xc0, 0x61, 0x1e, 0x21, 0x05, 0x00, 0x51, 0x02, 0x03, 0x80, 0xd2, + 0x00, 0x01, 0x80, 0xd2, 0x04, 0x00, 0x80, 0xd2, 0x41, 0x50, 0x21, 0x8b, + 0xe4, 0x68, 0x64, 0xfc, 0x5f, 0x05, 0x00, 0x71, 0xe3, 0x68, 0x60, 0xfc, + 0xc0, 0x68, 0x60, 0xfc, 0xc2, 0x68, 0x64, 0xfc, 0x81, 0x08, 0x60, 0x1e, + 0x60, 0x88, 0x60, 0x1e, 0x80, 0x80, 0x62, 0x1f, 0x61, 0x84, 0x42, 0x1f, + 0x31, 0x2a, 0x60, 0x1e, 0xe7, 0x28, 0x61, 0x1e, 0xb1, 0x1c, 0x02, 0x6d, + 0xc0, 0x68, 0x60, 0xfc, 0x04, 0x69, 0x64, 0xfc, 0x03, 0x69, 0x60, 0xfc, + 0xc2, 0x68, 0x64, 0xfc, 0x01, 0x08, 0x64, 0x1e, 0x60, 0x88, 0x60, 0x1e, + 0x40, 0x80, 0x64, 0x1f, 0x61, 0x84, 0x42, 0x1f, 0x52, 0x2a, 0x60, 0x1e, + 0x10, 0x2a, 0x61, 0x1e, 0xb2, 0x40, 0x00, 0x6d, 0xe1, 0x01, 0x00, 0x54, + 0xe0, 0x68, 0x60, 0xfc, 0xe1, 0x68, 0x64, 0xfc, 0xa3, 0x18, 0x40, 0xfd, + 0x00, 0x08, 0x60, 0x1e, 0xa2, 0x08, 0x40, 0xfd, 0x21, 0x00, 0x41, 0x1f, + 0x61, 0x28, 0x61, 0x1e, 0xa1, 0x18, 0x00, 0xfd, 0x01, 0x69, 0x60, 0xfc, + 0x00, 0x69, 0x64, 0xfc, 0x21, 0x08, 0x61, 0x1e, 0x00, 0x04, 0x40, 0x1f, + 0x40, 0x28, 0x60, 0x1e, 0xa0, 0x08, 0x00, 0xfd, 0x00, 0x40, 0x00, 0x91, + 0x84, 0x40, 0x00, 0x91, 0x3f, 0x00, 0x00, 0xeb, 0xe1, 0xfa, 0xff, 0x54, + 0x00, 0x0a, 0x70, 0x1e, 0xe1, 0x08, 0x67, 0x1e, 0x40, 0x02, 0x52, 0x1f, + 0x21, 0x06, 0x51, 0x1f, 0xd4, 0x08, 0x72, 0x1e, 0xb3, 0x08, 0x71, 0x1e, + 0x5f, 0x05, 0x00, 0x71, 0x60, 0x05, 0x00, 0x54, 0x04, 0xc0, 0x61, 0x1e, + 0x18, 0x20, 0x60, 0x1e, 0x23, 0xc0, 0x61, 0x1e, 0xad, 0x02, 0x00, 0x54, + 0x02, 0x10, 0x6e, 0x1e, 0x90, 0x08, 0x70, 0x1e, 0x38, 0x20, 0x60, 0x1e, + 0x40, 0x18, 0x60, 0x1e, 0x06, 0x08, 0x66, 0x1e, 0x00, 0x08, 0x64, 0x1e, + 0xd0, 0x88, 0x70, 0x1e, 0x00, 0x08, 0x74, 0x1e, 0xa0, 0x40, 0x05, 0x6d, + 0xed, 0x01, 0x00, 0x54, 0x00, 0x10, 0x6e, 0x1e, 0x67, 0x08, 0x67, 0x1e, + 0x01, 0x18, 0x61, 0x1e, 0x25, 0x08, 0x65, 0x1e, 0x21, 0x08, 0x63, 0x1e, + 0xa7, 0x88, 0x67, 0x1e, 0x21, 0x08, 0x73, 0x1e, 0xa1, 0x1c, 0x04, 0x6d, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x38, 0x20, 0x60, 0x1e, + 0xbf, 0x2c, 0x00, 0xf9, 0xa6, 0x28, 0x00, 0xfd, 0x6c, 0xfe, 0xff, 0x54, + 0xbf, 0x24, 0x00, 0xf9, 0xa5, 0x20, 0x00, 0xfd, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x05, 0x10, 0x6e, 0x1e, 0x00, 0x0a, 0x70, 0x1e, + 0xe1, 0x08, 0x67, 0x1e, 0x40, 0x02, 0x52, 0x1f, 0xa6, 0x40, 0x60, 0x1e, + 0x21, 0x06, 0x51, 0x1f, 0xb3, 0x08, 0x71, 0x1e, 0x5f, 0x05, 0x00, 0x71, + 0xd4, 0x08, 0x72, 0x1e, 0xe1, 0xfa, 0xff, 0x54, 0x02, 0x10, 0x6e, 0x1e, + 0xb5, 0x50, 0x41, 0x6d, 0x40, 0x18, 0x60, 0x1e, 0x41, 0x18, 0x61, 0x1e, + 0xb3, 0x18, 0x43, 0x6d, 0xa5, 0x0a, 0x70, 0x1e, 0x83, 0x0a, 0x70, 0x1e, + 0xa3, 0x0e, 0x52, 0x1f, 0x92, 0x96, 0x72, 0x1f, 0x64, 0x0a, 0x67, 0x1e, + 0xc2, 0x08, 0x67, 0x1e, 0x62, 0x0a, 0x51, 0x1f, 0xd1, 0x90, 0x71, 0x1f, + 0x03, 0x08, 0x63, 0x1e, 0x00, 0x08, 0x72, 0x1e, 0x22, 0x08, 0x62, 0x1e, + 0x21, 0x08, 0x71, 0x1e, 0xa3, 0x00, 0x05, 0x6d, 0xa2, 0x04, 0x04, 0x6d, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb6, 0xa9, + 0x46, 0x38, 0x00, 0x11, 0xfd, 0x03, 0x00, 0x91, 0xf7, 0x63, 0x03, 0xa9, + 0x37, 0x00, 0x00, 0x12, 0xf7, 0x06, 0x41, 0x0b, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0xc6, 0x04, 0x57, 0x0b, 0xc7, 0x00, 0x17, 0x4b, + 0xe1, 0x03, 0x06, 0x2a, 0xe7, 0x70, 0x00, 0x51, 0xf5, 0x5b, 0x02, 0xa9, + 0x76, 0x04, 0x00, 0x51, 0xf9, 0x6b, 0x04, 0xa9, 0xf9, 0x03, 0x03, 0x2a, + 0xe4, 0x17, 0x06, 0xa9, 0x1f, 0x20, 0x03, 0xd5, 0x22, 0x7c, 0x7c, 0xd3, + 0x20, 0x00, 0x06, 0x4b, 0x63, 0x02, 0x02, 0x8b, 0x00, 0x00, 0x16, 0x0b, + 0x21, 0x04, 0x00, 0x51, 0x61, 0x6a, 0x62, 0xfc, 0x3f, 0x00, 0x07, 0x6b, + 0x00, 0xec, 0x7c, 0xd3, 0x60, 0x04, 0x40, 0xfd, 0x62, 0x02, 0x00, 0x8b, + 0x61, 0x6a, 0x20, 0xfc, 0x40, 0x04, 0x00, 0xfd, 0x81, 0xfe, 0xff, 0x54, + 0x37, 0x03, 0x17, 0x4b, 0xe4, 0x06, 0x80, 0x52, 0xe0, 0xe3, 0x01, 0x91, + 0xe3, 0x03, 0x04, 0x2a, 0xe2, 0x83, 0x01, 0x91, 0xfa, 0x72, 0x00, 0x51, + 0xc1, 0x00, 0x00, 0xf0, 0x21, 0xa0, 0x00, 0x91, 0x35, 0x28, 0x00, 0x94, + 0x3f, 0x03, 0x1a, 0x6b, 0x49, 0x0b, 0x00, 0x54, 0xfb, 0x73, 0x05, 0xa9, + 0x5c, 0x7f, 0x7c, 0xd3, 0x95, 0x00, 0x00, 0xf0, 0xb5, 0xc2, 0x25, 0x91, + 0x7c, 0x02, 0x1c, 0x8b, 0x1b, 0x00, 0x80, 0x52, 0x14, 0x00, 0x80, 0x52, + 0xf8, 0x06, 0x80, 0x52, 0x1f, 0x00, 0x00, 0x14, 0xa4, 0xfc, 0x61, 0x93, + 0x5a, 0x07, 0x00, 0x11, 0x84, 0x7c, 0x83, 0x4b, 0x9c, 0x43, 0x00, 0x91, + 0xe8, 0x37, 0x40, 0xf9, 0x84, 0x8c, 0x18, 0x1b, 0xa0, 0x06, 0x40, 0x6d, + 0x84, 0x7c, 0x7c, 0x93, 0x03, 0x01, 0x04, 0x8b, 0x03, 0x69, 0x64, 0xfc, + 0x62, 0x04, 0x40, 0xfd, 0x63, 0x6a, 0x27, 0xfc, 0x22, 0x05, 0x00, 0xfd, + 0xb0, 0x27, 0x00, 0x94, 0x60, 0x0b, 0xd8, 0x1a, 0x81, 0x06, 0x00, 0x11, + 0xe2, 0x37, 0x40, 0xf9, 0x21, 0xec, 0x7c, 0xd3, 0x63, 0x02, 0x01, 0x8b, + 0x94, 0x0a, 0x00, 0x11, 0x00, 0xec, 0x18, 0x1b, 0x3f, 0x03, 0x1a, 0x6b, + 0x7b, 0x0b, 0x00, 0x11, 0x00, 0x7c, 0x7c, 0x93, 0x44, 0x00, 0x00, 0x8b, + 0x41, 0x68, 0x60, 0xfc, 0x80, 0x04, 0x40, 0xfd, 0x61, 0x6a, 0x21, 0xfc, + 0x60, 0x04, 0x00, 0xfd, 0x60, 0x03, 0x00, 0x54, 0x80, 0x07, 0x40, 0x6d, + 0xe1, 0x03, 0x1b, 0x2a, 0xe0, 0xe3, 0x01, 0x91, 0x22, 0x00, 0x80, 0x52, + 0x9b, 0x27, 0x00, 0x94, 0x63, 0x07, 0x00, 0x51, 0xa2, 0x12, 0x84, 0x52, + 0xe2, 0x29, 0xa1, 0x72, 0x87, 0x7e, 0x7c, 0xd3, 0x61, 0x07, 0x00, 0x11, + 0x69, 0x02, 0x07, 0x8b, 0x65, 0x7c, 0x22, 0x9b, 0xe0, 0xe3, 0x01, 0x91, + 0xff, 0x02, 0x1a, 0x6b, 0x02, 0x00, 0x80, 0x52, 0x69, 0xfa, 0xff, 0x54, + 0xa0, 0x06, 0x40, 0x6d, 0x61, 0x07, 0x00, 0x11, 0xe0, 0xe3, 0x01, 0x91, + 0x5a, 0x07, 0x00, 0x11, 0x02, 0x00, 0x80, 0x52, 0x7b, 0x0b, 0x00, 0x11, + 0x89, 0x27, 0x00, 0x94, 0x9c, 0x43, 0x00, 0x91, 0x3f, 0x03, 0x1a, 0x6b, + 0xe1, 0xfc, 0xff, 0x54, 0xfb, 0x73, 0x45, 0xa9, 0x3f, 0x03, 0x14, 0x6b, + 0xe9, 0x01, 0x00, 0x54, 0x95, 0x00, 0x00, 0xf0, 0xb5, 0xc2, 0x25, 0x91, + 0xc0, 0x02, 0x14, 0x4b, 0x62, 0x42, 0x00, 0x91, 0x00, 0x40, 0x34, 0x8b, + 0x81, 0x7e, 0x7c, 0xd3, 0xa1, 0x02, 0x40, 0x6d, 0x40, 0x10, 0x00, 0x8b, + 0x73, 0x02, 0x01, 0x8b, 0x1f, 0x20, 0x03, 0xd5, 0x61, 0x02, 0x00, 0x6d, + 0x73, 0x42, 0x00, 0x91, 0x1f, 0x00, 0x13, 0xeb, 0xa1, 0xff, 0xff, 0x54, + 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfd, 0x7b, 0xca, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x14, 0x00, 0x80, 0x52, 0xe8, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xb3, 0xa9, 0xe1, 0x07, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0xfb, 0x73, 0x05, 0xa9, 0xfc, 0x03, 0x00, 0xaa, 0xc0, 0x00, 0x00, 0x90, + 0x00, 0xa0, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0x82, 0x5b, 0x42, 0x79, + 0x95, 0x37, 0x40, 0xf9, 0xf3, 0x53, 0x01, 0xa9, 0x83, 0x17, 0x40, 0xf9, + 0xf7, 0x63, 0x03, 0xa9, 0xa5, 0x1e, 0x40, 0xb9, 0xf9, 0x6b, 0x04, 0xa9, + 0x18, 0x18, 0x80, 0x52, 0x21, 0x00, 0x05, 0x4b, 0x84, 0x3f, 0x40, 0xf9, + 0xff, 0xff, 0x08, 0xa9, 0x79, 0x1c, 0x40, 0x39, 0x20, 0x00, 0x38, 0x9b, + 0xff, 0xff, 0x09, 0xa9, 0x94, 0x04, 0x40, 0x79, 0x87, 0x9b, 0x4b, 0xa9, + 0xe0, 0x3b, 0x00, 0xf9, 0x20, 0x0f, 0x00, 0x12, 0xe0, 0x6f, 0x00, 0xb9, + 0x87, 0x9b, 0x0c, 0xa9, 0xb5, 0x52, 0x00, 0x91, 0x22, 0x35, 0x00, 0x34, + 0x80, 0x43, 0x12, 0x91, 0x16, 0x00, 0x80, 0x52, 0xe0, 0x3f, 0x00, 0xf9, + 0x1f, 0x20, 0x03, 0xd5, 0xe1, 0x0b, 0x47, 0xa9, 0xc0, 0x7e, 0x14, 0x1b, + 0x93, 0x5b, 0x40, 0xf9, 0x04, 0x03, 0x80, 0x52, 0x00, 0x7c, 0x7c, 0x93, + 0xe3, 0x03, 0x04, 0x2a, 0xf9, 0x00, 0x00, 0x8b, 0xda, 0x00, 0x00, 0x8b, + 0x73, 0x02, 0x00, 0x8b, 0xe0, 0xa3, 0x02, 0x91, 0xa8, 0x27, 0x00, 0x94, + 0x1b, 0x00, 0x80, 0x52, 0xa0, 0x06, 0x40, 0xb9, 0x81, 0x02, 0x00, 0x0b, + 0x3f, 0x2c, 0x00, 0x31, 0x0b, 0x05, 0x00, 0x54, 0x61, 0x01, 0x80, 0x12, + 0x24, 0x00, 0x00, 0x4b, 0x37, 0x83, 0x05, 0xd1, 0xe0, 0xa3, 0x02, 0x91, + 0x84, 0x7c, 0x7c, 0x93, 0xf8, 0x03, 0x01, 0x2a, 0x45, 0x03, 0x04, 0x8b, + 0x22, 0x00, 0x80, 0x52, 0x1b, 0x00, 0x80, 0x52, 0x40, 0x6b, 0x64, 0xfc, + 0xa1, 0x04, 0x40, 0xfd, 0x67, 0x27, 0x00, 0x94, 0xa4, 0x06, 0x40, 0xb9, + 0x18, 0x07, 0x00, 0x11, 0xe0, 0xa3, 0x02, 0x91, 0xe1, 0x03, 0x18, 0x2a, + 0x05, 0x03, 0x04, 0x4b, 0x84, 0x00, 0x14, 0x0b, 0x9f, 0x00, 0x18, 0x6b, + 0x22, 0x00, 0x80, 0x52, 0x6d, 0x02, 0x00, 0x54, 0xa4, 0x7c, 0x7c, 0x93, + 0x45, 0x03, 0x04, 0x8b, 0x40, 0x6b, 0x64, 0xfc, 0xa1, 0x04, 0x40, 0xfd, + 0x59, 0x27, 0x00, 0x94, 0x60, 0x7f, 0x7c, 0x93, 0x1f, 0x2b, 0x00, 0x71, + 0x22, 0x03, 0x00, 0x8b, 0x41, 0x03, 0x00, 0x8b, 0xed, 0x00, 0x00, 0x54, + 0xe3, 0x0a, 0x40, 0x6d, 0x7b, 0x07, 0x00, 0x11, 0x23, 0x6b, 0x20, 0xfc, + 0x42, 0x04, 0x00, 0xfd, 0x40, 0x6b, 0x20, 0xfc, 0x21, 0x04, 0x00, 0xfd, + 0xf7, 0x42, 0x00, 0x91, 0xe6, 0xff, 0xff, 0x17, 0x80, 0x07, 0x40, 0xb9, + 0x01, 0x48, 0x88, 0x52, 0xe1, 0x01, 0xa0, 0x72, 0x1f, 0x00, 0x01, 0x6b, + 0xc8, 0x05, 0x00, 0x54, 0x81, 0x3b, 0x41, 0xb9, 0x69, 0x03, 0x01, 0x0b, + 0x3f, 0x01, 0x00, 0x71, 0x6d, 0x04, 0x00, 0x54, 0xe1, 0x03, 0x01, 0x4b, + 0x00, 0x01, 0x80, 0xd2, 0xce, 0x7e, 0x40, 0x93, 0x2d, 0x23, 0x00, 0xd1, + 0x6a, 0xd2, 0x21, 0xcb, 0x01, 0xd0, 0x21, 0x8b, 0xe0, 0x23, 0x02, 0x91, + 0x4c, 0x21, 0x00, 0xd1, 0x4b, 0x23, 0x00, 0xd1, 0x02, 0x78, 0x6e, 0xb8, + 0x29, 0x01, 0x02, 0x0b, 0x1f, 0x20, 0x03, 0xd5, 0x40, 0x7c, 0x7c, 0xd3, + 0x81, 0x69, 0x61, 0xfc, 0x65, 0x02, 0x00, 0x8b, 0x40, 0x69, 0x61, 0xfc, + 0x24, 0x03, 0x00, 0x8b, 0x43, 0x03, 0x00, 0x8b, 0x61, 0x6a, 0x20, 0xfc, + 0x42, 0x04, 0x00, 0x11, 0xa0, 0x04, 0x00, 0xfd, 0x5f, 0x00, 0x09, 0x6b, + 0xa1, 0x69, 0x61, 0xfc, 0x20, 0x6b, 0x61, 0xfc, 0x21, 0x6b, 0x20, 0xfc, + 0x80, 0x04, 0x00, 0xfd, 0x61, 0x69, 0x61, 0xfc, 0x40, 0x6b, 0x61, 0xfc, + 0x21, 0x40, 0x00, 0x91, 0x41, 0x6b, 0x20, 0xfc, 0x60, 0x04, 0x00, 0xfd, + 0xa1, 0xfd, 0xff, 0x54, 0xe0, 0x23, 0x02, 0x91, 0x02, 0x78, 0x2e, 0xb8, + 0x81, 0x5b, 0x42, 0x79, 0xc0, 0x06, 0x00, 0x11, 0x16, 0x3c, 0x00, 0x12, + 0x3f, 0x20, 0x20, 0x6b, 0xa9, 0x03, 0x00, 0x54, 0x87, 0x9b, 0x4b, 0xa9, + 0x98, 0xff, 0xff, 0x17, 0x8a, 0x03, 0x10, 0x91, 0xe0, 0x03, 0x13, 0xaa, + 0x81, 0x3f, 0x40, 0xf9, 0xf7, 0x03, 0x0a, 0xaa, 0x44, 0x15, 0x4a, 0xa9, + 0xfb, 0x03, 0x14, 0x2a, 0x23, 0x04, 0x40, 0x79, 0xe1, 0x03, 0x03, 0x2a, + 0x78, 0x7c, 0x01, 0x53, 0xe2, 0x03, 0x18, 0x2a, 0xe3, 0xfe, 0xff, 0x97, + 0x81, 0x3f, 0x40, 0xf9, 0xe2, 0x03, 0x18, 0x2a, 0xe4, 0x16, 0x4a, 0xa9, + 0xe0, 0x03, 0x19, 0xaa, 0x23, 0x04, 0x40, 0x79, 0xe1, 0x03, 0x03, 0x2a, + 0xdc, 0xfe, 0xff, 0x97, 0x81, 0x3f, 0x40, 0xf9, 0xe2, 0x03, 0x18, 0x2a, + 0xe4, 0x16, 0x4a, 0xa9, 0xe0, 0x03, 0x1a, 0xaa, 0x23, 0x04, 0x40, 0x79, + 0xe1, 0x03, 0x03, 0x2a, 0xd5, 0xfe, 0xff, 0x97, 0xba, 0xff, 0xff, 0x17, + 0x82, 0x17, 0x40, 0xf9, 0x80, 0x3f, 0x40, 0xf9, 0x56, 0x1c, 0x40, 0x39, + 0x0d, 0x04, 0x40, 0x79, 0xd6, 0x0e, 0x00, 0x12, 0x81, 0x23, 0x00, 0x34, + 0x80, 0x00, 0x00, 0xf0, 0x00, 0xc0, 0x25, 0x91, 0xf3, 0x23, 0x02, 0x91, + 0x01, 0xe0, 0xe7, 0xd2, 0x0e, 0x00, 0x80, 0xd2, 0x15, 0x00, 0x80, 0x52, + 0x18, 0x5c, 0x40, 0x6d, 0x36, 0x00, 0x67, 0x9e, 0x0f, 0x00, 0x80, 0xd2, + 0x17, 0x00, 0x80, 0x52, 0x1f, 0x20, 0x03, 0xd5, 0xeb, 0x7e, 0x0d, 0x1b, + 0xe1, 0x03, 0x17, 0x2a, 0x92, 0x33, 0x4b, 0xa9, 0xe0, 0x03, 0x1c, 0xaa, + 0x63, 0x7d, 0x7c, 0x93, 0x78, 0x7a, 0x61, 0xb8, 0x8b, 0x63, 0x40, 0xf9, + 0xe4, 0x03, 0x18, 0x2a, 0x85, 0x2b, 0x40, 0xf9, 0x52, 0x02, 0x03, 0x8b, + 0x8c, 0x01, 0x03, 0x8b, 0x6b, 0x01, 0x03, 0x8b, 0xe1, 0x03, 0x12, 0xaa, + 0xe2, 0x03, 0x0c, 0xaa, 0xe3, 0x03, 0x0b, 0xaa, 0xb8, 0x5c, 0x00, 0x6d, + 0xb8, 0x5c, 0x01, 0x6d, 0xb8, 0x5c, 0x02, 0x6d, 0xb8, 0x5c, 0x03, 0x6d, + 0x17, 0xfe, 0xff, 0x97, 0x38, 0x0b, 0x00, 0x34, 0x80, 0xe3, 0x41, 0xb9, + 0x63, 0x21, 0x00, 0x91, 0x8a, 0x0f, 0x42, 0xb9, 0x50, 0x22, 0x00, 0x91, + 0x84, 0x21, 0x00, 0x91, 0x05, 0x00, 0x80, 0xd2, 0x12, 0x00, 0x63, 0x1e, + 0x01, 0x00, 0x80, 0x52, 0x82, 0x2b, 0x40, 0xf9, 0x89, 0xc3, 0x40, 0xf9, + 0x91, 0x43, 0x5d, 0x6d, 0x3c, 0x00, 0x00, 0x14, 0x23, 0x40, 0x60, 0x1e, + 0x04, 0x40, 0x60, 0x1e, 0x64, 0x69, 0x25, 0xfc, 0x5f, 0x01, 0x01, 0x6b, + 0x63, 0x68, 0x25, 0xfc, 0xc8, 0x02, 0x00, 0x54, 0x20, 0x00, 0x16, 0x4b, + 0x87, 0x13, 0x42, 0xb9, 0xa6, 0x7e, 0x7c, 0xd3, 0x00, 0xec, 0x7c, 0xd3, + 0xff, 0x00, 0x01, 0x6b, 0x91, 0x01, 0x00, 0x8b, 0xe9, 0x01, 0x00, 0x54, + 0x87, 0x69, 0x60, 0xfc, 0x04, 0x08, 0x76, 0x1e, 0x87, 0x83, 0x5f, 0xa9, + 0x23, 0x08, 0x76, 0x1e, 0x26, 0x06, 0x40, 0xfd, 0xe7, 0x08, 0x76, 0x1e, + 0xb5, 0x06, 0x00, 0x11, 0xc6, 0x08, 0x76, 0x1e, 0xfa, 0x00, 0x06, 0x8b, + 0x11, 0x00, 0x06, 0x8b, 0xe7, 0x68, 0x26, 0xfc, 0x46, 0x07, 0x00, 0xfd, + 0x04, 0x68, 0x26, 0xfc, 0x23, 0x06, 0x00, 0xfd, 0x07, 0x6a, 0x65, 0xfc, + 0x21, 0x04, 0x00, 0x11, 0x86, 0x68, 0x65, 0xfc, 0x44, 0x6a, 0x65, 0xfc, + 0x83, 0x69, 0x65, 0xfc, 0x42, 0x38, 0x67, 0x1e, 0x21, 0x38, 0x66, 0x1e, + 0xf4, 0x08, 0x67, 0x1e, 0xa5, 0x38, 0x64, 0x1e, 0xd3, 0x08, 0x66, 0x1e, + 0x00, 0x38, 0x63, 0x1e, 0x84, 0x50, 0x44, 0x1f, 0x42, 0x08, 0x62, 0x1e, + 0x63, 0x4c, 0x43, 0x1f, 0x21, 0x08, 0x61, 0x1e, 0xa5, 0x40, 0x00, 0x91, + 0xa2, 0x08, 0x45, 0x1f, 0x00, 0x04, 0x40, 0x1f, 0x87, 0x00, 0x79, 0x1e, + 0x66, 0x00, 0x79, 0x1e, 0x31, 0x2a, 0x62, 0x1e, 0x10, 0x2a, 0x60, 0x1e, + 0x10, 0x20, 0x72, 0x1e, 0xef, 0x01, 0x07, 0x8b, 0xce, 0x01, 0x06, 0x8b, + 0x91, 0x43, 0x1d, 0x6d, 0x8d, 0x00, 0x00, 0x54, 0x80, 0xa3, 0x41, 0xb9, + 0x00, 0x04, 0x00, 0x11, 0x80, 0xa3, 0x01, 0xb9, 0x1f, 0x03, 0x01, 0x6b, + 0x40, 0x02, 0x00, 0x54, 0x45, 0x1c, 0x44, 0x6d, 0x46, 0x10, 0x45, 0x6d, + 0x20, 0x01, 0x40, 0x39, 0x60, 0x68, 0x65, 0xfc, 0x63, 0x69, 0x65, 0xfc, + 0x02, 0x08, 0x65, 0x1e, 0x13, 0x08, 0x67, 0x1e, 0xc1, 0x08, 0x60, 0x1e, + 0x80, 0x08, 0x60, 0x1e, 0xa5, 0xcc, 0x63, 0x1f, 0xe2, 0x08, 0x43, 0x1f, + 0xc0, 0x80, 0x63, 0x1f, 0x81, 0x04, 0x43, 0x1f, 0x00, 0xf7, 0xff, 0x34, + 0x43, 0x40, 0x60, 0x1e, 0xa4, 0x40, 0x60, 0x1e, 0xb7, 0xff, 0xff, 0x17, + 0x98, 0x5b, 0x42, 0x79, 0xe0, 0x06, 0x00, 0x11, 0x17, 0x3c, 0x00, 0x12, + 0x1f, 0x23, 0x20, 0x6b, 0xe8, 0xf1, 0xff, 0x54, 0x0f, 0x01, 0x00, 0xb4, + 0xe0, 0x01, 0x63, 0x9e, 0x81, 0xeb, 0x40, 0xfd, 0x80, 0x37, 0x40, 0xf9, + 0x20, 0x18, 0x60, 0x1e, 0x00, 0xc0, 0x61, 0x1e, 0x00, 0x40, 0x62, 0x1e, + 0x00, 0x5c, 0x00, 0xbd, 0x0e, 0x01, 0x00, 0xb4, 0xc0, 0x01, 0x63, 0x9e, + 0x81, 0xef, 0x40, 0xfd, 0x80, 0x37, 0x40, 0xf9, 0x20, 0x18, 0x60, 0x1e, + 0x00, 0xc0, 0x61, 0x1e, 0x00, 0x40, 0x62, 0x1e, 0x00, 0x60, 0x00, 0xbd, + 0x18, 0x05, 0x00, 0x34, 0xe0, 0x6f, 0x40, 0xb9, 0xf5, 0x01, 0x80, 0x12, + 0x18, 0x00, 0x80, 0x52, 0xb5, 0x02, 0x00, 0x4b, 0x1f, 0x20, 0x03, 0xd5, + 0x83, 0x13, 0x4b, 0xa9, 0x06, 0x7f, 0x40, 0x93, 0x05, 0x7f, 0x14, 0x1b, + 0x89, 0x03, 0x41, 0xb9, 0x8a, 0x0b, 0x06, 0x8b, 0xe2, 0x6f, 0x40, 0xb9, + 0x87, 0x63, 0x40, 0xf9, 0xa5, 0x7c, 0x7c, 0x93, 0x63, 0x00, 0x05, 0x8b, + 0x84, 0x00, 0x05, 0x8b, 0xe5, 0x00, 0x05, 0x8b, 0x66, 0x7a, 0x66, 0xb8, + 0x87, 0x23, 0x40, 0xf9, 0x49, 0x05, 0x01, 0xb9, 0xe1, 0x03, 0x18, 0x2a, + 0xe0, 0x03, 0x1c, 0xaa, 0x2a, 0x41, 0x00, 0x11, 0x0b, 0x00, 0x80, 0x52, + 0x78, 0x00, 0x00, 0x35, 0xeb, 0x10, 0x40, 0x39, 0xc6, 0x00, 0x0b, 0x4b, + 0xec, 0x14, 0x40, 0x39, 0xa9, 0x02, 0x06, 0x0b, 0x86, 0x9f, 0x4c, 0xa9, + 0x29, 0x09, 0xcc, 0x1a, 0x29, 0x2d, 0x0c, 0x1b, 0x29, 0x01, 0x0a, 0x0b, + 0x89, 0x03, 0x01, 0xb9, 0x4a, 0xfa, 0xff, 0x97, 0x81, 0x5b, 0x42, 0x79, + 0x00, 0x07, 0x00, 0x11, 0x18, 0x3c, 0x00, 0x12, 0x3f, 0x20, 0x20, 0x6b, + 0xe8, 0xfb, 0xff, 0x54, 0x80, 0x63, 0x44, 0x79, 0x1f, 0x00, 0x18, 0x6b, + 0xe9, 0x08, 0x00, 0x54, 0x87, 0x67, 0x44, 0x79, 0x94, 0x5b, 0x40, 0xf9, + 0x94, 0x23, 0x01, 0xf9, 0x8c, 0x23, 0x40, 0xf9, 0xf3, 0x3c, 0x7c, 0xd3, + 0x93, 0x02, 0x13, 0x8b, 0x93, 0x27, 0x01, 0xf9, 0xe5, 0x03, 0x07, 0xaa, + 0x80, 0x71, 0x43, 0x39, 0x81, 0x17, 0x41, 0xf9, 0xa0, 0x00, 0x00, 0x34, + 0x82, 0x03, 0x40, 0x39, 0x20, 0x10, 0x40, 0x91, 0xff, 0x0b, 0x42, 0x6b, + 0x01, 0x10, 0x81, 0x9a, 0x45, 0x03, 0x00, 0x34, 0xa6, 0x04, 0x00, 0x51, + 0xe7, 0xf4, 0x7e, 0xd3, 0xeb, 0x08, 0x00, 0x91, 0x8a, 0x22, 0x00, 0xd1, + 0xc6, 0x3c, 0x7c, 0xd3, 0x69, 0x22, 0x00, 0xd1, 0xc6, 0x60, 0x00, 0x91, + 0x00, 0x01, 0x80, 0xd2, 0x1f, 0x20, 0x03, 0xd5, 0x22, 0x00, 0xc0, 0x79, + 0x24, 0x04, 0xc0, 0x79, 0x23, 0x68, 0xe7, 0x78, 0x43, 0x00, 0x62, 0x1e, + 0x22, 0x68, 0xeb, 0x78, 0x82, 0x00, 0x62, 0x1e, 0x21, 0x10, 0x00, 0x91, + 0x61, 0x00, 0x62, 0x1e, 0x40, 0x00, 0x62, 0x1e, 0x43, 0x69, 0x20, 0xfc, + 0x82, 0x6a, 0x20, 0xfc, 0x21, 0x69, 0x20, 0xfc, 0x60, 0x6a, 0x20, 0xfc, + 0x00, 0x40, 0x00, 0x91, 0xdf, 0x00, 0x00, 0xeb, 0x21, 0xfe, 0xff, 0x54, + 0x81, 0x07, 0x40, 0xb9, 0x00, 0x48, 0x88, 0x52, 0xe0, 0x01, 0xa0, 0x72, + 0x3f, 0x00, 0x00, 0x6b, 0x68, 0x04, 0x00, 0x54, 0xe7, 0x03, 0x13, 0xaa, + 0xe6, 0x03, 0x14, 0xaa, 0x81, 0x2b, 0x38, 0x8b, 0x80, 0x03, 0x41, 0xb9, + 0xa5, 0x40, 0x00, 0x51, 0x0a, 0x40, 0x00, 0x11, 0x20, 0x04, 0x01, 0xb9, + 0x18, 0x03, 0x00, 0x35, 0x8d, 0x11, 0x40, 0x39, 0xe0, 0x6f, 0x40, 0xb9, + 0x09, 0x00, 0x0d, 0x0b, 0x8b, 0x15, 0x40, 0x39, 0xa9, 0x00, 0x09, 0x4b, + 0xe2, 0x6f, 0x40, 0xb9, 0xe5, 0x03, 0x13, 0xaa, 0xe1, 0x03, 0x18, 0x2a, + 0xe0, 0x03, 0x1c, 0xaa, 0xe4, 0x03, 0x14, 0xaa, 0xe3, 0x03, 0x14, 0xaa, + 0x29, 0x09, 0xcb, 0x1a, 0x29, 0x35, 0x0b, 0x1b, 0x29, 0x01, 0x0a, 0x0b, + 0x89, 0x03, 0x01, 0xb9, 0xfc, 0xf9, 0xff, 0x97, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xcd, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe9, 0x6f, 0x40, 0xb9, 0x0d, 0x00, 0x80, 0x52, 0xea, 0xff, 0xff, 0x17, + 0x95, 0x03, 0x10, 0x91, 0xb6, 0x7c, 0x01, 0x53, 0xe3, 0x03, 0x05, 0x2a, + 0xe1, 0x03, 0x05, 0x2a, 0xe2, 0x03, 0x16, 0x2a, 0xe0, 0x03, 0x14, 0xaa, + 0xa4, 0x16, 0x4a, 0xa9, 0xbe, 0xfd, 0xff, 0x97, 0xa4, 0x16, 0x4a, 0xa9, + 0xe2, 0x03, 0x16, 0x2a, 0x83, 0x67, 0x44, 0x79, 0xe0, 0x03, 0x13, 0xaa, + 0xe1, 0x03, 0x03, 0x2a, 0xb8, 0xfd, 0xff, 0x97, 0x85, 0x67, 0x44, 0x79, + 0x8c, 0x23, 0x40, 0xf9, 0x86, 0x23, 0x41, 0xf9, 0x87, 0x27, 0x41, 0xf9, + 0xce, 0xff, 0xff, 0x17, 0x18, 0x00, 0x80, 0x52, 0x99, 0xff, 0xff, 0x17, + 0xfd, 0x7b, 0xb8, 0xa9, 0xe6, 0x03, 0x00, 0xaa, 0x04, 0x00, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0xf9, 0x6b, 0x04, 0xa9, 0xe5, 0xc3, 0x01, 0x91, + 0x19, 0x20, 0x40, 0xf9, 0xf5, 0x5b, 0x02, 0xa9, 0x16, 0x58, 0x42, 0x79, + 0x00, 0x3c, 0x40, 0xf9, 0x39, 0x63, 0x04, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xe3, 0x03, 0x16, 0x2a, 0x15, 0x04, 0x40, 0x79, 0x34, 0x13, 0x40, 0x78, + 0xa0, 0x42, 0x00, 0x51, 0xe2, 0x03, 0x15, 0x2a, 0x1f, 0x00, 0x14, 0x6b, + 0xa0, 0x46, 0x00, 0x51, 0xda, 0x34, 0x40, 0xf9, 0xfb, 0x2b, 0x00, 0xf9, + 0xdb, 0x58, 0x40, 0xf9, 0x14, 0xd0, 0x94, 0x1a, 0xe8, 0x27, 0x06, 0x6d, + 0xe1, 0x03, 0x1b, 0xaa, 0xe0, 0x03, 0x1b, 0xaa, 0x02, 0xfa, 0xff, 0x97, + 0xe8, 0x07, 0x47, 0x6d, 0x9f, 0x02, 0x00, 0x71, 0x21, 0x08, 0x61, 0x1e, + 0x09, 0x05, 0x48, 0x1f, 0xed, 0x0a, 0x00, 0x54, 0x28, 0x41, 0x60, 0x1e, + 0x33, 0x00, 0x80, 0x52, 0xf7, 0x63, 0x03, 0xa9, 0x37, 0x85, 0x8b, 0x52, + 0xf7, 0x51, 0xb8, 0x72, 0x18, 0x85, 0x8b, 0x52, 0xf8, 0x51, 0xa0, 0x72, + 0x1f, 0x20, 0x03, 0xd5, 0xe4, 0x03, 0x13, 0x2a, 0xe0, 0x03, 0x1b, 0xaa, + 0xe5, 0xc3, 0x01, 0x91, 0xe3, 0x03, 0x16, 0x2a, 0xe2, 0x03, 0x15, 0x2a, + 0xe1, 0x03, 0x1b, 0xaa, 0xee, 0xf9, 0xff, 0x97, 0x73, 0x06, 0x00, 0x11, + 0xe0, 0x07, 0x47, 0x6d, 0x9f, 0x02, 0x13, 0x6b, 0x60, 0x7e, 0x17, 0x1b, + 0x21, 0x08, 0x61, 0x1e, 0x00, 0x04, 0x40, 0x1f, 0x00, 0x08, 0x80, 0x13, + 0x08, 0x29, 0x60, 0x1e, 0xcb, 0x02, 0x00, 0x54, 0x1f, 0x00, 0x18, 0x6b, + 0xe8, 0xfd, 0xff, 0x54, 0x52, 0x23, 0xff, 0x97, 0x1f, 0x1c, 0x00, 0x72, + 0x80, 0xfd, 0xff, 0x54, 0xe4, 0x03, 0x13, 0x2a, 0x02, 0x00, 0x80, 0x52, + 0x01, 0x1c, 0x80, 0x52, 0x20, 0x00, 0x80, 0x52, 0x83, 0x00, 0x00, 0xf0, + 0x63, 0x60, 0x24, 0x91, 0xbd, 0x6f, 0xff, 0x97, 0x00, 0x00, 0xb0, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x2b, 0x40, 0xf9, 0xe8, 0x27, 0x46, 0x6d, + 0xfd, 0x7b, 0xc8, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xf7, 0x63, 0x43, 0xa9, + 0x94, 0x06, 0x00, 0x11, 0x41, 0xe3, 0x05, 0x91, 0x23, 0x33, 0x40, 0xbc, + 0x80, 0x02, 0x62, 0x1e, 0x21, 0x08, 0x41, 0x2d, 0x00, 0x08, 0x69, 0x1e, + 0x21, 0x04, 0x00, 0xbd, 0x08, 0x19, 0x60, 0x1e, 0x08, 0x41, 0x62, 0x1e, + 0x40, 0x68, 0x28, 0x1e, 0x21, 0x78, 0x28, 0x1e, 0x70, 0x20, 0x28, 0x1e, + 0x48, 0x7b, 0x01, 0xbd, 0x21, 0x00, 0x01, 0x2d, 0xe5, 0x01, 0x00, 0x54, + 0x03, 0x00, 0x80, 0x52, 0x3f, 0x60, 0x00, 0x39, 0x22, 0x64, 0x40, 0x39, + 0x00, 0x00, 0x80, 0x52, 0x5f, 0x00, 0x03, 0x6b, 0x42, 0x20, 0x83, 0x1a, + 0x22, 0x64, 0x00, 0x39, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x2b, 0x40, 0xf9, 0xe8, 0x27, 0x46, 0x6d, + 0xfd, 0x7b, 0xc8, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x73, 0x40, 0xbc, + 0x10, 0x20, 0x28, 0x1e, 0xa8, 0x00, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, + 0x23, 0x00, 0x80, 0x52, 0x20, 0x60, 0x00, 0x39, 0xee, 0xff, 0xff, 0x17, + 0x40, 0x00, 0x80, 0x52, 0x43, 0x00, 0x80, 0x52, 0x20, 0x60, 0x00, 0x39, + 0xea, 0xff, 0xff, 0x17, 0x28, 0x41, 0x60, 0x1e, 0xd7, 0xff, 0xff, 0x17, + 0xe4, 0x03, 0x00, 0xaa, 0xfd, 0x7b, 0xbe, 0xa9, 0x21, 0x7c, 0x02, 0x1b, + 0xfd, 0x03, 0x00, 0x91, 0x85, 0xcc, 0x40, 0xf9, 0xe1, 0x23, 0x00, 0x79, + 0xff, 0x23, 0x01, 0xb8, 0xe0, 0x43, 0x00, 0x91, 0xff, 0x2f, 0x00, 0x79, + 0xff, 0x63, 0x00, 0x39, 0x86, 0x18, 0x40, 0xf9, 0xa1, 0x00, 0x40, 0x39, + 0x85, 0x20, 0x40, 0xf9, 0xc6, 0x00, 0x01, 0x8b, 0x82, 0x50, 0x40, 0xf9, + 0xa1, 0x1c, 0x00, 0x91, 0xc4, 0xc4, 0x74, 0x39, 0xa6, 0x18, 0x40, 0x39, + 0x84, 0x04, 0x00, 0x11, 0xe4, 0x27, 0x00, 0x79, 0xe6, 0x53, 0x00, 0x39, + 0xa4, 0x08, 0x40, 0x39, 0xe4, 0x57, 0x00, 0x39, 0xa4, 0x10, 0x40, 0x39, + 0xe4, 0x5b, 0x00, 0x39, 0xa4, 0x14, 0x40, 0x39, 0xe4, 0x5f, 0x00, 0x39, + 0x4d, 0x9f, 0xff, 0x97, 0x80, 0x00, 0x00, 0x35, 0x00, 0x00, 0x80, 0x52, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x83, 0x00, 0x00, 0xf0, + 0x63, 0x00, 0x25, 0x91, 0x63, 0x6f, 0xff, 0x97, 0x40, 0x05, 0x9c, 0x52, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb7, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, + 0xf7, 0x63, 0x03, 0xa9, 0x17, 0xf0, 0x41, 0xb9, 0x00, 0x4c, 0x40, 0xf9, + 0xf5, 0x5b, 0x02, 0xa9, 0x76, 0x36, 0x40, 0xf9, 0x00, 0x68, 0x40, 0x39, + 0x74, 0xb6, 0x40, 0xf9, 0xd5, 0x36, 0x40, 0xb9, 0x60, 0x04, 0x00, 0x34, + 0x09, 0x01, 0x80, 0x52, 0x68, 0x00, 0x80, 0x52, 0x0a, 0x83, 0x88, 0xd2, + 0x2a, 0x00, 0xa0, 0xf2, 0x25, 0x03, 0x80, 0xd2, 0x07, 0x02, 0x80, 0xd2, + 0x83, 0x05, 0x80, 0xd2, 0x62, 0x06, 0x80, 0xd2, 0xa4, 0x03, 0x80, 0xd2, + 0xa6, 0x02, 0x80, 0xd2, 0x0b, 0xe5, 0x85, 0xd2, 0x89, 0x12, 0x00, 0x39, + 0x88, 0x1a, 0x00, 0x39, 0x61, 0x82, 0x40, 0xa9, 0x82, 0x02, 0x02, 0x8b, + 0x84, 0x02, 0x04, 0x8b, 0x85, 0x02, 0x05, 0x8b, 0x87, 0x02, 0x07, 0x8b, + 0x83, 0x02, 0x03, 0x8b, 0x86, 0x02, 0x06, 0x8b, 0x67, 0x1a, 0x17, 0xa9, + 0xbf, 0x02, 0x17, 0x6b, 0x21, 0x00, 0x0a, 0x8b, 0x00, 0x00, 0x0b, 0x8b, + 0x61, 0x82, 0x02, 0xa9, 0x65, 0x12, 0x18, 0xa9, 0x63, 0x0a, 0x19, 0xa9, + 0x42, 0x00, 0x00, 0x54, 0x9f, 0x12, 0x00, 0x39, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc9, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x78, 0x22, 0x40, 0xf9, 0xf9, 0x6b, 0x04, 0xa9, + 0x19, 0x2b, 0x42, 0x39, 0x59, 0x02, 0x00, 0x35, 0x28, 0x00, 0x80, 0x52, + 0x46, 0x02, 0x80, 0xd2, 0x0b, 0x00, 0x80, 0xd2, 0x0a, 0x00, 0x80, 0xd2, + 0x03, 0x04, 0x80, 0xd2, 0xa7, 0x01, 0x80, 0xd2, 0xc5, 0x02, 0x80, 0xd2, + 0x44, 0x03, 0x80, 0xd2, 0x02, 0x06, 0x80, 0xd2, 0x09, 0x00, 0x80, 0xd2, + 0x88, 0x12, 0x00, 0x39, 0x9f, 0x1a, 0x00, 0x39, 0x68, 0x2e, 0x40, 0xf9, + 0xf9, 0x6b, 0x44, 0xa9, 0x08, 0x01, 0x09, 0x8b, 0x68, 0x32, 0x00, 0xf9, + 0xd7, 0xff, 0xff, 0x17, 0xe8, 0x27, 0x06, 0x6d, 0x41, 0xe1, 0x9a, 0x52, + 0x61, 0x84, 0xa7, 0x72, 0x00, 0x2f, 0xc2, 0x39, 0x28, 0x00, 0x27, 0x1e, + 0x01, 0x00, 0x27, 0x1e, 0x00, 0x90, 0x24, 0x1e, 0x21, 0xb8, 0xa0, 0x2e, + 0x21, 0xd8, 0x21, 0x5e, 0x21, 0x08, 0x28, 0x1e, 0x60, 0x2c, 0x00, 0x94, + 0x09, 0x40, 0x20, 0x1e, 0x00, 0x33, 0xc2, 0x39, 0x00, 0x90, 0x24, 0x1e, + 0x01, 0x00, 0x27, 0x1e, 0x21, 0xb8, 0xa0, 0x2e, 0x21, 0xd8, 0x21, 0x5e, + 0x21, 0x08, 0x28, 0x1e, 0x58, 0x2c, 0x00, 0x94, 0x08, 0x40, 0x20, 0x1e, + 0x20, 0x07, 0x00, 0x51, 0x81, 0xc2, 0x40, 0x39, 0x00, 0x1c, 0x00, 0x12, + 0x1f, 0x04, 0x00, 0x71, 0x89, 0x02, 0x00, 0x54, 0x3f, 0x0f, 0x00, 0x71, + 0x20, 0x06, 0x00, 0x54, 0x88, 0x1a, 0x40, 0x39, 0x09, 0x18, 0x80, 0x52, + 0x01, 0x81, 0x8d, 0xd2, 0x00, 0xf7, 0x81, 0xd2, 0x06, 0x1d, 0x40, 0x92, + 0xc3, 0x20, 0x00, 0x91, 0xc2, 0xc0, 0x00, 0x91, 0xc4, 0x68, 0x00, 0x91, + 0xc5, 0x58, 0x00, 0x91, 0xca, 0x7c, 0x01, 0x9b, 0xc7, 0x34, 0x00, 0x91, + 0xcb, 0x7c, 0x00, 0x9b, 0x63, 0xf4, 0x7e, 0xd3, 0x09, 0x7d, 0xa9, 0x9b, + 0xc6, 0x48, 0x00, 0x91, 0xe8, 0x27, 0x46, 0x6d, 0xd0, 0xff, 0xff, 0x17, + 0xd6, 0x0a, 0x21, 0x8b, 0xa0, 0x02, 0x23, 0x1e, 0xc1, 0x2e, 0x40, 0xbd, + 0x21, 0xd8, 0x21, 0x7e, 0x22, 0x08, 0x29, 0x1e, 0x10, 0x20, 0x22, 0x1e, + 0xad, 0x00, 0x00, 0x54, 0x01, 0x40, 0x20, 0x1e, 0x20, 0x00, 0x80, 0x52, + 0x80, 0x12, 0x00, 0x39, 0x9f, 0x1a, 0x00, 0x39, 0x00, 0x09, 0x21, 0x1e, + 0x3f, 0x0b, 0x00, 0x71, 0x00, 0xb8, 0xa1, 0x7e, 0xc0, 0x2e, 0x00, 0xbd, + 0x01, 0xfc, 0xff, 0x54, 0x60, 0xe6, 0x41, 0xb9, 0x1f, 0x00, 0x15, 0x6b, + 0x02, 0x13, 0x00, 0x54, 0x9f, 0x1a, 0x00, 0x39, 0x46, 0x02, 0x80, 0xd2, + 0x0b, 0x00, 0x80, 0xd2, 0x0a, 0x00, 0x80, 0xd2, 0x03, 0x04, 0x80, 0xd2, + 0xa7, 0x01, 0x80, 0xd2, 0xc5, 0x02, 0x80, 0xd2, 0x44, 0x03, 0x80, 0xd2, + 0x02, 0x06, 0x80, 0xd2, 0x09, 0x00, 0x80, 0xd2, 0xe8, 0x27, 0x46, 0x6d, + 0xb1, 0xff, 0xff, 0x17, 0xda, 0x0a, 0x21, 0x8b, 0xea, 0x2f, 0x07, 0x6d, + 0x03, 0x03, 0x08, 0x91, 0xec, 0x37, 0x08, 0x6d, 0xac, 0x02, 0x23, 0x1e, + 0x80, 0xc6, 0x40, 0x39, 0x4a, 0x2f, 0x40, 0xbd, 0x64, 0xe6, 0x41, 0xb9, + 0xd6, 0x0a, 0x00, 0x8b, 0x02, 0xd3, 0x48, 0xb8, 0xd6, 0x02, 0x08, 0x91, + 0x4a, 0xd9, 0x21, 0x7e, 0x78, 0xb0, 0x52, 0x78, 0x9f, 0x00, 0x15, 0x6b, + 0xc0, 0x32, 0x59, 0xbc, 0x4d, 0x09, 0x29, 0x1e, 0x0b, 0xd8, 0x21, 0x7e, + 0x83, 0x09, 0x00, 0x54, 0x60, 0xea, 0x41, 0xb9, 0x69, 0x09, 0x29, 0x1e, + 0xfb, 0x73, 0x05, 0xa9, 0x1f, 0x00, 0x15, 0x6b, 0x7b, 0x70, 0x52, 0xb8, + 0x82, 0x10, 0x00, 0x54, 0x90, 0x21, 0x29, 0x1e, 0x3c, 0x00, 0x80, 0x52, + 0x9c, 0x1a, 0x00, 0x39, 0x8d, 0x12, 0x00, 0x54, 0x42, 0x00, 0x18, 0x4b, + 0x80, 0x00, 0x00, 0xf0, 0x01, 0xb4, 0x44, 0xfd, 0x40, 0x00, 0x80, 0x52, + 0x40, 0x00, 0x62, 0x1e, 0x80, 0x12, 0x00, 0x39, 0xd5, 0x32, 0x19, 0xb8, + 0x00, 0x08, 0x61, 0x1e, 0x4f, 0x2b, 0x00, 0x94, 0x00, 0x88, 0x59, 0x1e, + 0xbf, 0x02, 0x00, 0x6b, 0x94, 0x85, 0x2d, 0x1e, 0x4d, 0x01, 0x00, 0x54, + 0x80, 0x16, 0x40, 0x39, 0x99, 0x12, 0x00, 0x39, 0x00, 0x00, 0x00, 0x32, + 0x80, 0x16, 0x00, 0x39, 0x9f, 0x36, 0x00, 0x39, 0x9f, 0x4a, 0x00, 0x39, + 0x9f, 0x5a, 0x00, 0x39, 0x9c, 0x6a, 0x00, 0x39, 0x9f, 0xc2, 0x00, 0x39, + 0x02, 0x03, 0x1b, 0x0b, 0x80, 0x00, 0x00, 0xf0, 0x01, 0xb4, 0x44, 0xfd, + 0x40, 0x00, 0x62, 0x1e, 0x4a, 0x2f, 0x40, 0xbd, 0x4a, 0xd9, 0x21, 0x7e, + 0x00, 0x08, 0x61, 0x1e, 0x3a, 0x2b, 0x00, 0x94, 0x00, 0x88, 0x59, 0x1e, + 0xbf, 0x02, 0x00, 0x6b, 0x42, 0x0e, 0x00, 0x54, 0x80, 0x0a, 0x40, 0x79, + 0x82, 0x80, 0x80, 0x52, 0x9f, 0x3e, 0x00, 0x39, 0x8b, 0x41, 0x20, 0x1e, + 0x00, 0x00, 0x02, 0x2a, 0x80, 0x0a, 0x00, 0x79, 0x9f, 0x52, 0x00, 0x39, + 0x21, 0x00, 0x80, 0x52, 0x9f, 0x62, 0x00, 0x39, 0x66, 0x02, 0x80, 0xd2, + 0x9f, 0xca, 0x00, 0x39, 0x0b, 0xf7, 0x81, 0xd2, 0x0a, 0x81, 0x8d, 0xd2, + 0x83, 0x04, 0x80, 0xd2, 0xfb, 0x73, 0x45, 0xa9, 0xc7, 0x01, 0x80, 0xd2, + 0xe5, 0x02, 0x80, 0xd2, 0x64, 0x03, 0x80, 0xd2, 0x22, 0x06, 0x80, 0xd2, + 0x09, 0x18, 0x80, 0xd2, 0x81, 0x72, 0x00, 0x39, 0x1f, 0x20, 0x03, 0xd5, + 0x0a, 0x09, 0x2a, 0x1e, 0x00, 0x09, 0x2b, 0x1e, 0xe8, 0x27, 0x46, 0x6d, + 0xec, 0x37, 0x48, 0x6d, 0x4a, 0xb9, 0xa1, 0x7e, 0x00, 0xb8, 0xa1, 0x7e, + 0x4a, 0x2f, 0x00, 0xbd, 0xea, 0x2f, 0x47, 0x6d, 0xc0, 0x32, 0x19, 0xbc, + 0x54, 0xff, 0xff, 0x17, 0x90, 0x21, 0x2d, 0x1e, 0x9f, 0x1a, 0x00, 0x39, + 0x4d, 0x04, 0x00, 0x54, 0x42, 0x00, 0x18, 0x0b, 0x80, 0x00, 0x00, 0xf0, + 0x01, 0xb4, 0x44, 0xfd, 0x38, 0x00, 0x80, 0x52, 0x40, 0x00, 0x62, 0x1e, + 0x98, 0x12, 0x00, 0x39, 0x55, 0x2f, 0x00, 0xb9, 0x00, 0x08, 0x61, 0x1e, + 0x0b, 0x2b, 0x00, 0x94, 0x00, 0x88, 0x59, 0x1e, 0xbf, 0x02, 0x00, 0x6b, + 0xa2, 0x02, 0x00, 0x54, 0x80, 0x16, 0x40, 0x39, 0x8a, 0x41, 0x20, 0x1e, + 0x46, 0x02, 0x80, 0xd2, 0x0b, 0x00, 0x80, 0xd2, 0x00, 0x00, 0x1f, 0x32, + 0x0a, 0x00, 0x80, 0xd2, 0x03, 0x04, 0x80, 0xd2, 0xa7, 0x01, 0x80, 0xd2, + 0xc5, 0x02, 0x80, 0xd2, 0x44, 0x03, 0x80, 0xd2, 0x02, 0x06, 0x80, 0xd2, + 0x09, 0x00, 0x80, 0xd2, 0x99, 0x12, 0x00, 0x39, 0x80, 0x16, 0x00, 0x39, + 0x9f, 0x3a, 0x00, 0x39, 0x9f, 0x4e, 0x00, 0x39, 0x9f, 0x5e, 0x00, 0x39, + 0x98, 0x6e, 0x00, 0x39, 0x9f, 0xc6, 0x00, 0x39, 0xd4, 0xff, 0xff, 0x17, + 0x8a, 0x41, 0x20, 0x1e, 0x46, 0x02, 0x80, 0xd2, 0x0b, 0x00, 0x80, 0xd2, + 0x0a, 0x00, 0x80, 0xd2, 0x03, 0x04, 0x80, 0xd2, 0xa7, 0x01, 0x80, 0xd2, + 0xc5, 0x02, 0x80, 0xd2, 0x44, 0x03, 0x80, 0xd2, 0x02, 0x06, 0x80, 0xd2, + 0x09, 0x00, 0x80, 0xd2, 0xc9, 0xff, 0xff, 0x17, 0xbf, 0x02, 0x17, 0x6b, + 0x89, 0xe8, 0xff, 0x54, 0x20, 0x00, 0x80, 0x52, 0x99, 0x12, 0x00, 0x39, + 0x80, 0x1a, 0x00, 0x39, 0x66, 0x02, 0x80, 0xd2, 0x0b, 0xf7, 0x81, 0xd2, + 0x0a, 0x81, 0x8d, 0xd2, 0x83, 0x04, 0x80, 0xd2, 0xc7, 0x01, 0x80, 0xd2, + 0xe5, 0x02, 0x80, 0xd2, 0x64, 0x03, 0x80, 0xd2, 0x22, 0x06, 0x80, 0xd2, + 0x09, 0x18, 0x80, 0xd2, 0xe8, 0x27, 0x46, 0x6d, 0x16, 0xff, 0xff, 0x17, + 0xbf, 0x02, 0x17, 0x6b, 0xc2, 0x03, 0x00, 0x54, 0x88, 0x1a, 0x40, 0x39, + 0x09, 0x18, 0x80, 0x52, 0x01, 0x81, 0x8d, 0xd2, 0x00, 0xf7, 0x81, 0xd2, + 0x06, 0x1d, 0x40, 0x92, 0xc3, 0x20, 0x00, 0x91, 0xc2, 0xc0, 0x00, 0x91, + 0xc4, 0x68, 0x00, 0x91, 0xc5, 0x58, 0x00, 0x91, 0xca, 0x7c, 0x01, 0x9b, + 0xc7, 0x34, 0x00, 0x91, 0xcb, 0x7c, 0x00, 0x9b, 0x63, 0xf4, 0x7e, 0xd3, + 0x09, 0x7d, 0xa9, 0x9b, 0xc6, 0x48, 0x00, 0x91, 0xfb, 0x73, 0x45, 0xa9, + 0xa6, 0xff, 0xff, 0x17, 0x8b, 0x41, 0x20, 0x1e, 0x66, 0x02, 0x80, 0xd2, + 0x0b, 0xf7, 0x81, 0xd2, 0x0a, 0x81, 0x8d, 0xd2, 0x83, 0x04, 0x80, 0xd2, + 0xc7, 0x01, 0x80, 0xd2, 0xe5, 0x02, 0x80, 0xd2, 0x64, 0x03, 0x80, 0xd2, + 0x22, 0x06, 0x80, 0xd2, 0x09, 0x18, 0x80, 0xd2, 0xfb, 0x73, 0x45, 0xa9, + 0x9a, 0xff, 0xff, 0x17, 0x62, 0x03, 0x18, 0x4b, 0x80, 0x00, 0x00, 0xd0, + 0x01, 0xb4, 0x44, 0xfd, 0x81, 0x00, 0x80, 0x52, 0x40, 0x00, 0x62, 0x1e, + 0x40, 0x00, 0x80, 0x52, 0x81, 0x12, 0x00, 0x39, 0x80, 0x1a, 0x00, 0x39, + 0x00, 0x08, 0x61, 0x1e, 0xb0, 0x2a, 0x00, 0x94, 0x00, 0x88, 0x59, 0x1e, + 0xbf, 0x02, 0x00, 0x6b, 0x94, 0x85, 0x29, 0x1e, 0xed, 0x02, 0x00, 0x54, + 0x80, 0x16, 0x40, 0x39, 0xc8, 0x00, 0x80, 0x52, 0x88, 0x12, 0x00, 0x39, + 0x21, 0x00, 0x80, 0x52, 0x00, 0x00, 0x1f, 0x32, 0x80, 0x16, 0x00, 0x39, + 0x9f, 0x3a, 0x00, 0x39, 0x86, 0x02, 0x80, 0xd2, 0x9f, 0x4e, 0x00, 0x39, + 0x0b, 0xee, 0x83, 0xd2, 0x9f, 0x5e, 0x00, 0x39, 0x0a, 0x02, 0x9b, 0xd2, + 0x9f, 0xc6, 0x00, 0x39, 0x03, 0x05, 0x80, 0xd2, 0xe7, 0x01, 0x80, 0xd2, + 0x05, 0x03, 0x80, 0xd2, 0x84, 0x03, 0x80, 0xd2, 0x42, 0x06, 0x80, 0xd2, + 0x09, 0x30, 0x80, 0xd2, 0x81, 0x6e, 0x00, 0x39, 0xfb, 0x73, 0x45, 0xa9, + 0x76, 0xff, 0xff, 0x17, 0x86, 0x02, 0x80, 0xd2, 0x0b, 0xee, 0x83, 0xd2, + 0x0a, 0x02, 0x9b, 0xd2, 0x03, 0x05, 0x80, 0xd2, 0xe7, 0x01, 0x80, 0xd2, + 0x05, 0x03, 0x80, 0xd2, 0x84, 0x03, 0x80, 0xd2, 0x42, 0x06, 0x80, 0xd2, + 0x09, 0x30, 0x80, 0xd2, 0xfb, 0x73, 0x45, 0xa9, 0x6b, 0xff, 0xff, 0x17, + 0x81, 0x00, 0x00, 0xd0, 0x20, 0x44, 0x42, 0xfd, 0x01, 0x20, 0x40, 0xf9, + 0x06, 0xfc, 0x83, 0xd2, 0x04, 0xb4, 0x40, 0xf9, 0x07, 0x00, 0x80, 0x52, + 0x21, 0x5c, 0x42, 0x39, 0x03, 0x00, 0x80, 0x52, 0x02, 0x0c, 0x40, 0xf9, + 0x85, 0x18, 0x40, 0x39, 0x26, 0x00, 0x62, 0x1e, 0x04, 0x14, 0x40, 0xf9, + 0x0b, 0x18, 0x40, 0xf9, 0xc6, 0x08, 0x60, 0x1e, 0xa5, 0x08, 0x06, 0x9b, + 0x84, 0x3c, 0x00, 0x91, 0x08, 0x70, 0x40, 0xf9, 0x0a, 0xcc, 0x40, 0xf9, + 0x61, 0x3c, 0x46, 0xd3, 0x42, 0x01, 0x40, 0x39, 0xe6, 0x7c, 0x7c, 0x93, + 0x09, 0x01, 0x06, 0x8b, 0x21, 0x0c, 0x02, 0x8b, 0x61, 0x0d, 0x01, 0x8b, + 0x21, 0x9c, 0x46, 0xf9, 0x21, 0x24, 0xc3, 0x9a, 0x41, 0x03, 0x00, 0x36, + 0x01, 0xc0, 0x40, 0xf9, 0x01, 0x69, 0x66, 0xfc, 0x20, 0x05, 0x40, 0xfd, + 0x21, 0x00, 0x40, 0x39, 0x81, 0x03, 0x00, 0x34, 0xa2, 0x14, 0x40, 0x6d, + 0x84, 0x0c, 0x40, 0x6d, 0xa5, 0x38, 0x60, 0x1e, 0x41, 0x38, 0x61, 0x1e, + 0x00, 0x50, 0x42, 0xbd, 0x02, 0x54, 0x42, 0xbd, 0xc1, 0x10, 0x41, 0x1f, + 0xc3, 0x0c, 0x45, 0x1f, 0x00, 0xc0, 0x22, 0x1e, 0x42, 0xc0, 0x22, 0x1e, + 0x81, 0x0c, 0x00, 0x6d, 0x04, 0x69, 0x66, 0xfc, 0xa1, 0x14, 0x40, 0x6d, + 0x23, 0x05, 0x40, 0xfd, 0x01, 0x08, 0x61, 0x1e, 0x00, 0x08, 0x65, 0x1e, + 0x41, 0x04, 0x44, 0x1f, 0x40, 0x00, 0x43, 0x1f, 0xa1, 0x00, 0x00, 0x6d, + 0xe7, 0x04, 0x00, 0x11, 0x63, 0x04, 0x00, 0x11, 0x84, 0x54, 0x00, 0x91, + 0x7f, 0xf8, 0x07, 0x71, 0xa5, 0x40, 0x00, 0x91, 0x41, 0xfb, 0xff, 0x54, + 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x81, 0x00, 0x00, 0x6d, + 0xf7, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x40, 0xf9, 0x07, 0x1c, 0x84, 0xd2, + 0x02, 0x50, 0x40, 0xf9, 0x23, 0x00, 0x40, 0x79, 0x01, 0x54, 0x40, 0xf9, + 0x49, 0x04, 0x44, 0x91, 0x63, 0xec, 0x7c, 0xd3, 0x4a, 0x00, 0x44, 0x91, + 0x28, 0x80, 0x25, 0x91, 0x27, 0x00, 0x07, 0x8b, 0x08, 0x9c, 0x1f, 0xa9, + 0x08, 0x40, 0x12, 0x91, 0x44, 0x00, 0x03, 0x8b, 0x29, 0x81, 0x3f, 0x91, + 0x83, 0x00, 0x03, 0x8b, 0x2b, 0x00, 0x0c, 0x91, 0x02, 0x10, 0x0b, 0xa9, + 0x25, 0xc0, 0x0d, 0x91, 0x03, 0x60, 0x00, 0xf9, 0x26, 0x00, 0x06, 0x91, + 0x0b, 0x6c, 0x00, 0xf9, 0x42, 0x0c, 0x44, 0x91, 0x0a, 0xa4, 0x0e, 0xa9, + 0x42, 0x00, 0x3f, 0x91, 0x01, 0x7c, 0x00, 0xf9, 0x01, 0x19, 0x00, 0xa9, + 0x01, 0x15, 0x01, 0xa9, 0x02, 0x70, 0x00, 0xf9, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xa8, 0xa9, 0xe1, 0x03, 0x00, 0xaa, 0xfd, 0x03, 0x00, 0x91, + 0x02, 0x58, 0x42, 0x79, 0xfb, 0x73, 0x05, 0xa9, 0xe0, 0x87, 0x00, 0xf9, + 0x1b, 0x7c, 0x40, 0xf9, 0x00, 0x14, 0x40, 0xf9, 0xe0, 0xb3, 0x00, 0xf9, + 0x1c, 0x28, 0x00, 0x91, 0x00, 0x1c, 0x40, 0x39, 0x00, 0x0c, 0x00, 0x12, + 0xe0, 0x6f, 0x01, 0xb9, 0xe2, 0x4f, 0x00, 0x34, 0xe8, 0x27, 0x06, 0x6d, + 0x08, 0xe4, 0x00, 0x2f, 0x20, 0x08, 0x42, 0xb9, 0xea, 0x2f, 0x07, 0x6d, + 0x1e, 0x41, 0x60, 0x1e, 0x0b, 0x41, 0x60, 0x1e, 0x1d, 0x41, 0x60, 0x1e, + 0x0a, 0x41, 0x60, 0x1e, 0x1c, 0x41, 0x60, 0x1e, 0x09, 0x41, 0x60, 0x1e, + 0xec, 0x37, 0x08, 0x6d, 0x0c, 0x41, 0x60, 0x1e, 0xf3, 0x53, 0x01, 0xa9, + 0xf5, 0x5b, 0x02, 0xa9, 0xf7, 0x63, 0x03, 0xa9, 0xf9, 0x6b, 0x04, 0xa9, + 0xba, 0x99, 0x99, 0x52, 0x9a, 0x99, 0xb9, 0x72, 0xff, 0x6b, 0x01, 0xb9, + 0xfb, 0xbf, 0x00, 0xf9, 0xee, 0x3f, 0x09, 0x6d, 0xe8, 0x8b, 0x00, 0xfd, + 0xe8, 0x9f, 0x00, 0xfd, 0xe8, 0xaf, 0x00, 0xfd, 0xe3, 0x87, 0x40, 0xf9, + 0xe1, 0x6b, 0x41, 0xb9, 0x64, 0x8c, 0x5f, 0xa9, 0x01, 0x7c, 0x01, 0x1b, + 0x21, 0xec, 0x7c, 0xd3, 0x84, 0x00, 0x01, 0x8b, 0xe4, 0xbb, 0x00, 0xf9, + 0x73, 0x00, 0x01, 0x8b, 0x80, 0x2e, 0x00, 0x34, 0xe1, 0x6f, 0x41, 0xb9, + 0x88, 0x41, 0x60, 0x1e, 0xef, 0xbf, 0x40, 0xf9, 0x20, 0x00, 0x80, 0x52, + 0x18, 0x00, 0x80, 0x52, 0x00, 0x00, 0x01, 0x4b, 0x99, 0x02, 0x80, 0x52, + 0xe0, 0xb7, 0x00, 0xb9, 0xfd, 0x73, 0x14, 0x6d, 0xfe, 0xab, 0x00, 0xfd, + 0x02, 0x07, 0x00, 0x11, 0x01, 0x0b, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x11, + 0x04, 0x7f, 0x7c, 0xd3, 0x45, 0xec, 0x7c, 0xd3, 0x26, 0xec, 0x7c, 0xd3, + 0x07, 0xec, 0x7c, 0xd3, 0x63, 0x02, 0x05, 0x8b, 0x61, 0x02, 0x07, 0x8b, + 0x60, 0x02, 0x04, 0x8b, 0x62, 0x02, 0x06, 0x8b, 0x6c, 0x6a, 0x65, 0xfc, + 0x63, 0x04, 0x40, 0xfd, 0x0d, 0x0b, 0x00, 0x11, 0x00, 0x04, 0x40, 0xfd, + 0x0e, 0x0f, 0x00, 0x11, 0x21, 0x04, 0x40, 0xfd, 0x14, 0x07, 0x00, 0x11, + 0x42, 0x04, 0x40, 0xfd, 0x63, 0x08, 0x63, 0x1e, 0x6f, 0x6a, 0x66, 0xfc, + 0x00, 0x08, 0x60, 0x1e, 0x6e, 0x6a, 0x67, 0xfc, 0x21, 0x08, 0x61, 0x1e, + 0x6d, 0x6a, 0x64, 0xfc, 0x42, 0x08, 0x62, 0x1e, 0xef, 0x09, 0x4f, 0x1f, + 0x8c, 0x0d, 0x4c, 0x1f, 0xce, 0x05, 0x4e, 0x1f, 0xb7, 0x7d, 0xba, 0x9b, + 0xad, 0x01, 0x4d, 0x1f, 0xd6, 0x7d, 0xba, 0x9b, 0x9b, 0x7e, 0xba, 0x9b, + 0x00, 0x0f, 0x80, 0x52, 0x15, 0x7f, 0xba, 0x9b, 0xe1, 0xfe, 0x64, 0xd3, + 0xd6, 0xfe, 0x64, 0xd3, 0x17, 0x00, 0x80, 0xd2, 0x7b, 0xff, 0x64, 0xd3, + 0xf3, 0x5f, 0x00, 0xf9, 0xb5, 0xfe, 0x64, 0xd3, 0x21, 0xb4, 0x19, 0x1b, + 0xef, 0xc1, 0x61, 0x1e, 0xd6, 0xba, 0x19, 0x1b, 0xce, 0xc1, 0x61, 0x1e, + 0x7b, 0xd3, 0x19, 0x1b, 0xb5, 0xe2, 0x19, 0x1b, 0xf3, 0x03, 0x17, 0xaa, + 0xad, 0xc1, 0x61, 0x1e, 0x21, 0x3c, 0xa0, 0x9b, 0x8c, 0xc1, 0x61, 0x1e, + 0xd6, 0x3e, 0xa0, 0x9b, 0x7b, 0x3f, 0xa0, 0x9b, 0xef, 0x57, 0x00, 0xf9, + 0xb5, 0x3e, 0xa0, 0x9b, 0xf7, 0x03, 0x16, 0xaa, 0xf6, 0x03, 0x01, 0xaa, + 0xed, 0xc3, 0x00, 0xb9, 0xee, 0xcb, 0x00, 0xb9, 0xe4, 0x97, 0x11, 0xa9, + 0xe6, 0x9f, 0x12, 0xa9, 0xa0, 0x41, 0x60, 0x1e, 0xe0, 0x03, 0x13, 0x2a, + 0x20, 0x12, 0x00, 0x94, 0x01, 0x40, 0x60, 0x1e, 0x80, 0x41, 0x60, 0x1e, + 0xe0, 0x03, 0x13, 0x2a, 0xa1, 0x7a, 0x33, 0xfc, 0x1b, 0x12, 0x00, 0x94, + 0x01, 0x40, 0x60, 0x1e, 0xe0, 0x41, 0x60, 0x1e, 0xe0, 0x03, 0x13, 0x2a, + 0x61, 0x7b, 0x33, 0xfc, 0x16, 0x12, 0x00, 0x94, 0x01, 0x40, 0x60, 0x1e, + 0xc0, 0x41, 0x60, 0x1e, 0xe0, 0x03, 0x13, 0x2a, 0xc1, 0x7a, 0x33, 0xfc, + 0x11, 0x12, 0x00, 0x94, 0xe0, 0x7a, 0x33, 0xfc, 0x73, 0x06, 0x00, 0x91, + 0x7f, 0x3e, 0x00, 0xf1, 0x61, 0xfd, 0xff, 0x54, 0x00, 0x13, 0x00, 0x11, + 0xe0, 0x07, 0x01, 0xb9, 0xed, 0xc3, 0x40, 0xb9, 0x1f, 0x40, 0x00, 0x71, + 0xee, 0xcb, 0x40, 0xb9, 0xef, 0x57, 0x40, 0xf9, 0xf3, 0x5f, 0x40, 0xf9, + 0x68, 0x01, 0x00, 0x54, 0xe0, 0x87, 0x40, 0xf9, 0xe1, 0xb7, 0x40, 0xb9, + 0x21, 0x10, 0x00, 0x11, 0x00, 0x08, 0x42, 0xb9, 0xe1, 0xb7, 0x00, 0xb9, + 0xe1, 0x07, 0x41, 0xb9, 0x1f, 0x00, 0x01, 0x6b, 0x49, 0x20, 0x00, 0x54, + 0xf8, 0x07, 0x41, 0xb9, 0x9c, 0xff, 0xff, 0x17, 0xe0, 0x87, 0x40, 0xf9, + 0x00, 0x18, 0x40, 0xf9, 0x00, 0xc0, 0x74, 0x39, 0xe0, 0x03, 0x01, 0xb9, + 0x20, 0x3c, 0x00, 0x34, 0xe2, 0xb7, 0x40, 0xb9, 0x14, 0xe4, 0x00, 0x2f, + 0x00, 0x0f, 0x80, 0x52, 0xb2, 0x02, 0x80, 0x52, 0x45, 0x04, 0x00, 0x51, + 0x47, 0x04, 0x00, 0x11, 0x49, 0x08, 0x00, 0x11, 0xe6, 0x03, 0x05, 0x2a, + 0x56, 0x7c, 0xba, 0x9b, 0x44, 0x04, 0x00, 0x11, 0xbb, 0x7c, 0xba, 0x9b, + 0xe5, 0x03, 0x06, 0xaa, 0xf7, 0x7c, 0xba, 0x9b, 0x43, 0x08, 0x00, 0x11, + 0x21, 0x7d, 0xba, 0x9b, 0xd6, 0xfe, 0x64, 0xd3, 0x7b, 0xff, 0x64, 0xd3, + 0xa5, 0x7c, 0x7c, 0xd3, 0xf7, 0xfe, 0x64, 0xd3, 0x65, 0x02, 0x05, 0x8b, + 0x21, 0xfc, 0x64, 0xd3, 0xd6, 0x8a, 0x19, 0x1b, 0x42, 0x7c, 0x7c, 0xd3, + 0x7b, 0x9b, 0x19, 0x1b, 0x62, 0x02, 0x02, 0x8b, 0xf7, 0x9e, 0x19, 0x1b, + 0x21, 0xa4, 0x19, 0x1b, 0xe5, 0x8b, 0x0b, 0xa9, 0x96, 0x42, 0x60, 0x1e, + 0xe2, 0xb3, 0x40, 0xf9, 0x8c, 0x42, 0x60, 0x1e, 0x99, 0x42, 0x60, 0x1e, + 0x9a, 0x42, 0x60, 0x1e, 0x9b, 0x42, 0x60, 0x1e, 0x9f, 0x42, 0x60, 0x1e, + 0x95, 0x42, 0x60, 0x1e, 0x64, 0x12, 0x04, 0x8b, 0xfd, 0x73, 0x54, 0x6d, + 0x63, 0x12, 0x03, 0x8b, 0xfe, 0x5f, 0x55, 0x6d, 0xd6, 0x3e, 0xa0, 0x9b, + 0x7b, 0x3f, 0xa0, 0x9b, 0xe8, 0x03, 0x00, 0x2a, 0xf7, 0x3e, 0xa0, 0x9b, + 0x45, 0x51, 0x85, 0xd2, 0x3e, 0x3c, 0xa0, 0x9b, 0x40, 0x00, 0x05, 0x8b, + 0xe4, 0x8f, 0x0c, 0xa9, 0x44, 0x40, 0x85, 0xd2, 0x43, 0x00, 0x04, 0x8b, + 0xe6, 0x1f, 0x1b, 0x29, 0xe3, 0x73, 0x00, 0xf9, 0xff, 0x77, 0x00, 0xf9, + 0xe9, 0x7f, 0x1e, 0x29, 0xe0, 0x7f, 0x00, 0xf9, 0xe1, 0x73, 0x40, 0xf9, + 0x20, 0xe0, 0x5f, 0x38, 0x20, 0x0f, 0x00, 0x34, 0xe2, 0x77, 0x40, 0xf9, + 0x00, 0x04, 0x00, 0x51, 0x30, 0x10, 0x00, 0x91, 0xf5, 0x03, 0x01, 0xaa, + 0x81, 0x10, 0x80, 0x52, 0x00, 0x08, 0xa1, 0x9b, 0xe1, 0x7f, 0x40, 0xf9, + 0x00, 0x00, 0x01, 0x8b, 0xe0, 0x57, 0x00, 0xf9, 0xa9, 0x02, 0x40, 0x39, + 0xa0, 0x06, 0x40, 0x39, 0x3f, 0x21, 0x00, 0x71, 0xe0, 0x2a, 0x00, 0x54, + 0x88, 0x19, 0x00, 0x54, 0x3f, 0x05, 0x00, 0x71, 0xe8, 0x21, 0x00, 0x54, + 0x03, 0x03, 0x00, 0x4b, 0x82, 0x02, 0x00, 0x4b, 0xa1, 0x01, 0x00, 0x4b, + 0xc0, 0x01, 0x00, 0x4b, 0x63, 0xec, 0x7c, 0xd3, 0x42, 0xec, 0x7c, 0xd3, + 0x21, 0xec, 0x7c, 0xd3, 0x00, 0xec, 0x7c, 0xd3, 0x66, 0x02, 0x03, 0x8b, + 0x65, 0x02, 0x02, 0x8b, 0x64, 0x02, 0x01, 0x8b, 0x69, 0x6a, 0x63, 0xfc, + 0x63, 0x02, 0x00, 0x8b, 0x6a, 0x6a, 0x62, 0xfc, 0x6b, 0x6a, 0x61, 0xfc, + 0x68, 0x6a, 0x60, 0xfc, 0x77, 0x04, 0x40, 0xfd, 0x9e, 0x04, 0x40, 0xfd, + 0xbd, 0x04, 0x40, 0xfd, 0xdc, 0x04, 0x40, 0xfd, 0x1f, 0x20, 0x03, 0xd5, + 0xb1, 0x06, 0x40, 0x79, 0xb1, 0x09, 0x00, 0x34, 0x01, 0x00, 0x80, 0xd2, + 0x40, 0x00, 0x00, 0x14, 0x82, 0x6b, 0xe2, 0x38, 0xe0, 0x0d, 0x20, 0x8b, + 0x0c, 0x03, 0x02, 0x4b, 0x8b, 0x02, 0x02, 0x4b, 0xaa, 0x01, 0x02, 0x4b, + 0xc7, 0x01, 0x02, 0x4b, 0x86, 0x7d, 0xba, 0x9b, 0x65, 0x7d, 0xba, 0x9b, + 0x44, 0x7d, 0xba, 0x9b, 0xe2, 0x7c, 0xba, 0x9b, 0xc6, 0xfc, 0x64, 0xd3, + 0xa5, 0xfc, 0x64, 0xd3, 0x84, 0xfc, 0x64, 0xd3, 0x42, 0xfc, 0x64, 0xd3, + 0xc6, 0xb0, 0x19, 0x1b, 0xa5, 0xac, 0x19, 0x1b, 0x84, 0xa8, 0x19, 0x1b, + 0x42, 0x9c, 0x19, 0x1b, 0xc6, 0x7c, 0xa8, 0x9b, 0xa5, 0x7c, 0xa8, 0x9b, + 0x84, 0x7c, 0xa8, 0x9b, 0x42, 0x7c, 0xa8, 0x9b, 0x01, 0x68, 0x66, 0xfc, + 0x05, 0x68, 0x65, 0xfc, 0x04, 0x68, 0x64, 0xfc, 0x03, 0x68, 0x62, 0xfc, + 0x26, 0x08, 0x69, 0x1e, 0x21, 0x08, 0x7c, 0x1e, 0xb2, 0x08, 0x6a, 0x1e, + 0x91, 0x08, 0x6b, 0x1e, 0x70, 0x08, 0x68, 0x1e, 0xa5, 0x08, 0x7d, 0x1e, + 0x84, 0x08, 0x7e, 0x1e, 0x63, 0x08, 0x77, 0x1e, 0x60, 0xd0, 0x40, 0xfc, + 0x21, 0x04, 0x00, 0x91, 0x62, 0x50, 0x40, 0xfc, 0x3f, 0x02, 0x01, 0x6b, + 0xd3, 0x08, 0x60, 0x1e, 0x2f, 0x08, 0x60, 0x1e, 0xad, 0x08, 0x60, 0x1e, + 0x27, 0x0a, 0x60, 0x1e, 0x21, 0x4c, 0x42, 0x1f, 0xcf, 0xbc, 0x62, 0x1f, + 0x93, 0x08, 0x60, 0x1e, 0x4e, 0x0a, 0x60, 0x1e, 0x06, 0x0a, 0x60, 0x1e, + 0x60, 0x08, 0x60, 0x1e, 0xa5, 0x38, 0x42, 0x1f, 0x4d, 0xb6, 0x62, 0x1f, + 0x84, 0x1c, 0x42, 0x1f, 0x31, 0xce, 0x62, 0x1f, 0x63, 0x18, 0x42, 0x1f, + 0x00, 0x82, 0x62, 0x1f, 0xff, 0x2b, 0x61, 0x1e, 0xb5, 0x2a, 0x6f, 0x1e, + 0x5a, 0x2b, 0x65, 0x1e, 0x7b, 0x2b, 0x6d, 0x1e, 0x8c, 0x29, 0x64, 0x1e, + 0x39, 0x2b, 0x71, 0x1e, 0x94, 0x2a, 0x63, 0x1e, 0xd6, 0x2a, 0x60, 0x1e, + 0x89, 0x01, 0x00, 0x54, 0x02, 0x7a, 0x61, 0x78, 0x3f, 0x19, 0x00, 0x71, + 0x42, 0x7c, 0xb2, 0x9b, 0x83, 0x03, 0x02, 0x8b, 0x60, 0x08, 0x40, 0x39, + 0x89, 0xf7, 0xff, 0x54, 0x61, 0x7b, 0x60, 0xfc, 0xc5, 0x7a, 0x60, 0xfc, + 0xe4, 0x7a, 0x60, 0xfc, 0xc3, 0x7b, 0x60, 0xfc, 0xd1, 0xff, 0xff, 0x17, + 0xe0, 0x57, 0x40, 0xf9, 0x10, 0x12, 0x02, 0x91, 0xb5, 0x12, 0x02, 0x91, + 0x1f, 0x00, 0x10, 0xeb, 0x41, 0xf2, 0xff, 0x54, 0xe1, 0x77, 0x40, 0xf9, + 0x42, 0x20, 0x84, 0xd2, 0xe0, 0xf7, 0x40, 0xb9, 0x43, 0x20, 0x84, 0xd2, + 0x21, 0x00, 0x02, 0x8b, 0xe1, 0x77, 0x00, 0xf9, 0xe1, 0x73, 0x40, 0xf9, + 0x00, 0x04, 0x00, 0x11, 0x21, 0x00, 0x03, 0x8b, 0xe1, 0x73, 0x00, 0xf9, + 0x01, 0x1c, 0x00, 0x12, 0xe1, 0xf7, 0x00, 0xb9, 0xe1, 0x03, 0x41, 0xb9, + 0x3f, 0x00, 0x20, 0x6b, 0xe1, 0xee, 0xff, 0x54, 0xfd, 0x73, 0x14, 0x6d, + 0xfe, 0x5f, 0x15, 0x6d, 0xe7, 0x9f, 0x40, 0xfd, 0xe0, 0x8f, 0x40, 0xf9, + 0xe3, 0xbb, 0x40, 0xf9, 0x62, 0x00, 0x00, 0x8b, 0x60, 0x68, 0x60, 0xfc, + 0xe0, 0x93, 0x40, 0xf9, 0x41, 0x04, 0x40, 0xfd, 0x15, 0x38, 0x75, 0x1e, + 0x61, 0x00, 0x00, 0x8b, 0x65, 0x68, 0x60, 0xfc, 0x3f, 0x38, 0x7f, 0x1e, + 0x21, 0x08, 0x61, 0x1e, 0x00, 0x04, 0x40, 0x1f, 0x24, 0x04, 0x40, 0xfd, + 0xe0, 0x97, 0x40, 0xf9, 0xbb, 0x38, 0x7b, 0x1e, 0xff, 0x0b, 0x7f, 0x1e, + 0x9a, 0x38, 0x7a, 0x1e, 0xb5, 0x7e, 0x55, 0x1f, 0xe1, 0xb7, 0x40, 0xb9, + 0x63, 0x68, 0x60, 0xfc, 0x60, 0x00, 0x00, 0x8b, 0x21, 0x10, 0x00, 0x11, + 0xe1, 0xb7, 0x00, 0xb9, 0xe1, 0x07, 0x41, 0xb9, 0x00, 0x28, 0x67, 0x1e, + 0x02, 0x04, 0x40, 0xfd, 0xa0, 0x00, 0x45, 0x1f, 0xe5, 0x8b, 0x40, 0xfd, + 0x79, 0x38, 0x79, 0x1e, 0xe0, 0x9b, 0x40, 0xf9, 0xb5, 0x28, 0x75, 0x1e, + 0x84, 0x00, 0x44, 0x1f, 0x7b, 0x57, 0x5b, 0x1f, 0x4c, 0x38, 0x6c, 0x1e, + 0x61, 0x68, 0x60, 0xfc, 0x60, 0x00, 0x00, 0x8b, 0x63, 0x10, 0x43, 0x1f, + 0x5a, 0x6f, 0x5a, 0x1f, 0x36, 0x38, 0x76, 0x1e, 0x06, 0x04, 0x40, 0xfd, + 0xe0, 0x87, 0x40, 0xf9, 0x42, 0x0c, 0x42, 0x1f, 0x39, 0x6b, 0x59, 0x1f, + 0xd4, 0x38, 0x74, 0x1e, 0x00, 0x08, 0x42, 0xb9, 0x21, 0x08, 0x41, 0x1f, + 0x8c, 0x65, 0x4c, 0x1f, 0x1f, 0x00, 0x01, 0x6b, 0xc0, 0x04, 0x46, 0x1f, + 0xd6, 0x32, 0x56, 0x1f, 0xe0, 0x9f, 0x00, 0xfd, 0x80, 0x5a, 0x54, 0x1f, + 0xe0, 0x8b, 0x00, 0xfd, 0x08, 0xe0, 0xff, 0x54, 0xe1, 0x87, 0x40, 0xf9, + 0x0c, 0x41, 0x60, 0x1e, 0xfd, 0x73, 0x54, 0x6d, 0x22, 0x58, 0x42, 0x79, + 0xfe, 0xab, 0x40, 0xfd, 0xe1, 0x6b, 0x41, 0xb9, 0x21, 0x04, 0x00, 0x11, + 0xe1, 0x6b, 0x01, 0xb9, 0x5f, 0x00, 0x01, 0x6b, 0x08, 0xd0, 0xff, 0x54, + 0xe0, 0x8b, 0x40, 0xfd, 0xe1, 0x9f, 0x40, 0xfd, 0xf3, 0x53, 0x41, 0xa9, + 0x00, 0x18, 0x61, 0x1e, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0xe8, 0x27, 0x46, 0x6d, + 0xea, 0x2f, 0x47, 0x6d, 0xec, 0x37, 0x48, 0x6d, 0xee, 0x3f, 0x49, 0x6d, + 0xfd, 0x7b, 0xd8, 0xa8, 0x00, 0xc0, 0x61, 0x1e, 0xc0, 0x03, 0x5f, 0xd6, + 0x3f, 0x25, 0x00, 0x71, 0x61, 0xe9, 0xff, 0x54, 0xe1, 0xdb, 0x40, 0xb9, + 0xe4, 0xf3, 0x40, 0xb9, 0x23, 0x00, 0x00, 0x4b, 0xe1, 0xb7, 0x40, 0xb9, + 0x22, 0x00, 0x00, 0x4b, 0xe1, 0xdf, 0x40, 0xb9, 0x63, 0xec, 0x7c, 0xd3, + 0x42, 0xec, 0x7c, 0xd3, 0x21, 0x00, 0x00, 0x4b, 0x80, 0x00, 0x00, 0x4b, + 0x65, 0x02, 0x03, 0x8b, 0x21, 0xec, 0x7c, 0xd3, 0x64, 0x02, 0x02, 0x8b, + 0x00, 0xec, 0x7c, 0xd3, 0x7c, 0x6a, 0x63, 0xfc, 0x63, 0x02, 0x01, 0x8b, + 0x7d, 0x6a, 0x62, 0xfc, 0x62, 0x02, 0x00, 0x8b, 0xa7, 0x04, 0x40, 0xfd, + 0x7e, 0x6a, 0x61, 0xfc, 0x60, 0x6a, 0x60, 0xfc, 0x44, 0x04, 0x40, 0xfd, + 0x89, 0x0b, 0x67, 0x1e, 0x65, 0x04, 0x40, 0xfd, 0xe7, 0x08, 0x67, 0x1e, + 0x86, 0x04, 0x40, 0xfd, 0x88, 0x9f, 0x7c, 0x1f, 0xe0, 0x87, 0x4b, 0xa9, + 0x17, 0x08, 0x64, 0x1e, 0xe2, 0x8f, 0x4c, 0xa9, 0x84, 0x08, 0x64, 0x1e, + 0xcb, 0x0b, 0x65, 0x1e, 0xaa, 0x0b, 0x66, 0x1e, 0xa5, 0x08, 0x65, 0x1e, + 0xc6, 0x08, 0x66, 0x1e, 0x0f, 0x90, 0x60, 0x1f, 0xd0, 0x97, 0x7e, 0x1f, + 0xc1, 0x97, 0x5e, 0x1f, 0xb1, 0x9b, 0x7d, 0x1f, 0xa2, 0x9b, 0x5d, 0x1f, + 0x83, 0x9f, 0x5c, 0x1f, 0x00, 0x90, 0x40, 0x1f, 0x29, 0x29, 0x69, 0x1e, + 0x13, 0x48, 0x40, 0x6d, 0x2e, 0x34, 0x40, 0x6d, 0xf7, 0x2a, 0x77, 0x1e, + 0x6b, 0x29, 0x6b, 0x1e, 0x4a, 0x29, 0x6a, 0x1e, 0x47, 0x18, 0x40, 0x6d, + 0x3c, 0x09, 0x73, 0x1e, 0x65, 0x10, 0x40, 0x6d, 0x29, 0x09, 0x72, 0x1e, + 0x5d, 0x09, 0x6e, 0x1e, 0x7e, 0x09, 0x67, 0x1e, 0x09, 0x25, 0x53, 0x1f, + 0x4a, 0x09, 0x6d, 0x1e, 0xe8, 0x0a, 0x64, 0x1e, 0x6b, 0x09, 0x66, 0x1e, + 0xf7, 0x0a, 0x65, 0x1e, 0x7c, 0x70, 0x52, 0x1f, 0x2a, 0x2a, 0x4e, 0x1f, + 0x5d, 0x74, 0x4d, 0x1f, 0x0b, 0x2e, 0x47, 0x1f, 0x3e, 0x78, 0x46, 0x1f, + 0xe8, 0x21, 0x45, 0x1f, 0x17, 0x5c, 0x44, 0x1f, 0x08, 0xff, 0xff, 0x17, + 0x3f, 0x1d, 0x00, 0x71, 0xc1, 0xe0, 0xff, 0x54, 0xe1, 0x97, 0x4b, 0xa9, + 0xe6, 0x9f, 0x4c, 0xa9, 0xe2, 0xdb, 0x40, 0xb9, 0x43, 0x00, 0x00, 0x4b, + 0xe2, 0xb7, 0x40, 0xb9, 0x21, 0x14, 0x40, 0x6d, 0x42, 0x00, 0x00, 0x4b, + 0xe1, 0xdf, 0x40, 0xb9, 0x63, 0xec, 0x7c, 0xd3, 0xa0, 0x10, 0x40, 0x6d, + 0x21, 0x00, 0x00, 0x4b, 0xc6, 0x0c, 0x40, 0x6d, 0x29, 0x08, 0x65, 0x1e, + 0xe8, 0x08, 0x40, 0x6d, 0xa5, 0x08, 0x65, 0x1e, 0xe5, 0xf3, 0x40, 0xb9, + 0x42, 0xec, 0x7c, 0xd3, 0x21, 0xec, 0x7c, 0xd3, 0x33, 0x94, 0x41, 0x1f, + 0xa0, 0x00, 0x00, 0x4b, 0x07, 0x09, 0x62, 0x1e, 0x0a, 0x08, 0x64, 0x1e, + 0xcb, 0x08, 0x63, 0x1e, 0x84, 0x08, 0x64, 0x1e, 0x63, 0x08, 0x63, 0x1e, + 0x42, 0x08, 0x62, 0x1e, 0x11, 0x90, 0x40, 0x1f, 0xd0, 0x8c, 0x46, 0x1f, + 0x0f, 0x89, 0x48, 0x1f, 0x21, 0x94, 0x61, 0x1f, 0x00, 0x90, 0x60, 0x1f, + 0xc3, 0x8c, 0x66, 0x1f, 0x02, 0x89, 0x68, 0x1f, 0x00, 0xec, 0x7c, 0xd3, + 0x64, 0x02, 0x03, 0x8b, 0x72, 0x6a, 0x63, 0xfc, 0x63, 0x02, 0x02, 0x8b, + 0x6d, 0x6a, 0x62, 0xfc, 0x62, 0x02, 0x01, 0x8b, 0x66, 0x6a, 0x61, 0xfc, + 0x61, 0x02, 0x00, 0x8b, 0x29, 0x29, 0x69, 0x1e, 0xe4, 0x28, 0x67, 0x1e, + 0x4a, 0x29, 0x6a, 0x1e, 0x6b, 0x29, 0x6b, 0x1e, 0x68, 0x6a, 0x60, 0xfc, + 0x97, 0x04, 0x40, 0xfd, 0x6e, 0x04, 0x40, 0xfd, 0x3c, 0x09, 0x72, 0x1e, + 0x25, 0x04, 0x40, 0xfd, 0x5d, 0x09, 0x6d, 0x1e, 0x47, 0x04, 0x40, 0xfd, + 0x29, 0x09, 0x77, 0x1e, 0x7e, 0x09, 0x66, 0x1e, 0x7c, 0x72, 0x57, 0x1f, + 0x4a, 0x09, 0x6e, 0x1e, 0x97, 0x08, 0x68, 0x1e, 0x6b, 0x09, 0x67, 0x1e, + 0x84, 0x08, 0x65, 0x1e, 0x29, 0x24, 0x52, 0x1f, 0x3d, 0x76, 0x4e, 0x1f, + 0x0a, 0x28, 0x4d, 0x1f, 0xf7, 0x5d, 0x45, 0x1f, 0x48, 0x10, 0x48, 0x1f, + 0x1e, 0x7a, 0x47, 0x1f, 0x6b, 0x2c, 0x46, 0x1f, 0xc3, 0xfe, 0xff, 0x17, + 0xe1, 0xdb, 0x40, 0xb9, 0xe4, 0xf3, 0x40, 0xb9, 0x23, 0x00, 0x00, 0x4b, + 0xe1, 0xb7, 0x40, 0xb9, 0xe6, 0x9f, 0x4c, 0xa9, 0x22, 0x00, 0x00, 0x4b, + 0xe1, 0xdf, 0x40, 0xb9, 0x63, 0xec, 0x7c, 0xd3, 0x42, 0xec, 0x7c, 0xd3, + 0x21, 0x00, 0x00, 0x4b, 0x80, 0x00, 0x00, 0x4b, 0x64, 0x02, 0x03, 0x8b, + 0x63, 0x6a, 0x63, 0xfc, 0x21, 0xec, 0x7c, 0xd3, 0x00, 0xec, 0x7c, 0xd3, + 0x63, 0x02, 0x02, 0x8b, 0x62, 0x6a, 0x62, 0xfc, 0x62, 0x02, 0x01, 0x8b, + 0x93, 0x04, 0x40, 0xfd, 0x67, 0x6a, 0x61, 0xfc, 0x61, 0x02, 0x00, 0x8b, + 0x66, 0x6a, 0x60, 0xfc, 0xe5, 0x83, 0x4b, 0xa9, 0xd0, 0x14, 0x40, 0x6d, + 0xf8, 0x10, 0x40, 0x6d, 0xb2, 0x04, 0x40, 0x6d, 0xab, 0x08, 0x67, 0x1e, + 0x11, 0x00, 0x40, 0x6d, 0x88, 0x08, 0x66, 0x1e, 0x2d, 0x04, 0x40, 0xfd, + 0x29, 0x08, 0x63, 0x1e, 0x4e, 0x04, 0x40, 0xfd, 0x49, 0x26, 0x53, 0x1f, + 0x6f, 0x04, 0x40, 0xfd, 0x0a, 0x08, 0x62, 0x1e, 0x21, 0x08, 0x73, 0x1e, + 0x08, 0x23, 0x4d, 0x1f, 0x57, 0x86, 0x43, 0x1f, 0x0b, 0x2e, 0x4e, 0x1f, + 0x2a, 0x2a, 0x4f, 0x1f, 0x00, 0x08, 0x6f, 0x1e, 0xa5, 0x08, 0x6e, 0x1e, + 0x84, 0x08, 0x6d, 0x1e, 0x41, 0x86, 0x63, 0x1f, 0x32, 0x82, 0x42, 0x1f, + 0x20, 0x82, 0x62, 0x1f, 0x11, 0x96, 0x47, 0x1f, 0x05, 0x96, 0x67, 0x1f, + 0x10, 0x93, 0x46, 0x1f, 0x04, 0x93, 0x66, 0x1f, 0x7c, 0x08, 0x69, 0x1e, + 0x69, 0x0a, 0x69, 0x1e, 0xfe, 0x08, 0x6b, 0x1e, 0xfc, 0x72, 0x53, 0x1f, + 0x5d, 0x08, 0x6a, 0x1e, 0xd7, 0x08, 0x68, 0x1e, 0xea, 0x09, 0x6a, 0x1e, + 0xcb, 0x09, 0x6b, 0x1e, 0xa8, 0x09, 0x68, 0x1e, 0x69, 0x24, 0x41, 0x1f, + 0x5d, 0x76, 0x4f, 0x1f, 0x4a, 0x28, 0x40, 0x1f, 0x3e, 0x7a, 0x4e, 0x1f, + 0xeb, 0x2c, 0x45, 0x1f, 0x17, 0x5e, 0x4d, 0x1f, 0xc8, 0x20, 0x44, 0x1f, + 0x80, 0xfe, 0xff, 0x17, 0x14, 0xe4, 0x00, 0x2f, 0x96, 0x42, 0x60, 0x1e, + 0x8c, 0x42, 0x60, 0x1e, 0x99, 0x42, 0x60, 0x1e, 0x9a, 0x42, 0x60, 0x1e, + 0x9b, 0x42, 0x60, 0x1e, 0x9f, 0x42, 0x60, 0x1e, 0x95, 0x42, 0x60, 0x1e, + 0xdb, 0xfe, 0xff, 0x17, 0x00, 0xff, 0xef, 0xd2, 0x00, 0x00, 0x67, 0x9e, + 0xfb, 0x73, 0x45, 0xa9, 0x00, 0xc0, 0x61, 0x1e, 0xfd, 0x7b, 0xd8, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x40, 0x39, 0x28, 0x00, 0x80, 0x52, 0x22, 0x00, 0x00, 0x39, + 0x04, 0x20, 0x40, 0xf9, 0x05, 0x60, 0x44, 0x79, 0x02, 0x00, 0x41, 0xb9, + 0x83, 0x10, 0x40, 0x39, 0x86, 0x14, 0x40, 0x39, 0x07, 0xcc, 0x40, 0xf9, + 0x65, 0x10, 0x05, 0x0b, 0x42, 0x00, 0x05, 0x4b, 0x63, 0x40, 0x00, 0x11, + 0x23, 0x98, 0x00, 0x29, 0x28, 0x18, 0x00, 0xb9, 0x42, 0x08, 0xc6, 0x1a, + 0x03, 0x18, 0x40, 0xf9, 0x22, 0x0c, 0x00, 0xb9, 0xe2, 0x00, 0x40, 0x39, + 0x62, 0x00, 0x02, 0x8b, 0x42, 0xc4, 0x74, 0x39, 0x42, 0x00, 0x08, 0x0b, + 0x22, 0x10, 0x00, 0xb9, 0x82, 0x6c, 0x43, 0x39, 0x82, 0x00, 0x00, 0x34, + 0x02, 0xc0, 0x40, 0xf9, 0x42, 0x00, 0x40, 0x39, 0x22, 0x01, 0x00, 0x34, + 0x00, 0x1c, 0xe8, 0xd2, 0x00, 0x00, 0x67, 0x9e, 0x20, 0x00, 0x80, 0x52, + 0x3f, 0x14, 0x00, 0xb9, 0x20, 0x10, 0x00, 0xfd, 0x3f, 0x14, 0x00, 0xf9, + 0x20, 0xc0, 0x00, 0x39, 0xc0, 0x03, 0x5f, 0xd6, 0x82, 0x44, 0x42, 0x39, + 0x00, 0xe4, 0x00, 0x2f, 0x02, 0xff, 0xff, 0x35, 0x00, 0x34, 0x42, 0xbd, + 0x00, 0x1c, 0xe8, 0xd2, 0x01, 0x00, 0x67, 0x9e, 0x20, 0x00, 0x80, 0x52, + 0x3f, 0x14, 0x00, 0xb9, 0x00, 0xc0, 0x22, 0x1e, 0x3f, 0x14, 0x00, 0xf9, + 0x20, 0xc0, 0x00, 0x39, 0x00, 0x08, 0x61, 0x1e, 0x20, 0x10, 0x00, 0xfd, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x22, 0x94, 0x42, 0x29, 0x23, 0x2c, 0x40, 0xb9, + 0x27, 0x90, 0x40, 0x29, 0x06, 0x48, 0x25, 0x8b, 0x7f, 0x00, 0x00, 0x71, + 0x63, 0x04, 0x00, 0x11, 0x84, 0x10, 0x87, 0x1a, 0x23, 0x2c, 0x00, 0xb9, + 0x42, 0x00, 0x04, 0x0b, 0xc3, 0x04, 0x41, 0xb9, 0x22, 0x14, 0x00, 0xb9, + 0x5f, 0x00, 0x03, 0x6b, 0x80, 0x00, 0x00, 0x54, 0x3f, 0x28, 0x00, 0xb9, + 0x3f, 0xc0, 0x00, 0x39, 0xc0, 0x03, 0x5f, 0xd6, 0x02, 0x58, 0x42, 0x79, + 0xa3, 0x04, 0x00, 0x11, 0x23, 0x18, 0x00, 0xb9, 0xbf, 0x00, 0x02, 0x6b, + 0xc0, 0x00, 0x00, 0x54, 0x02, 0x02, 0x80, 0x52, 0x20, 0x00, 0x80, 0x52, + 0x22, 0x28, 0x00, 0xb9, 0x20, 0xc0, 0x00, 0x39, 0xc0, 0x03, 0x5f, 0xd6, + 0x02, 0x20, 0x40, 0xf9, 0x42, 0x44, 0x42, 0x39, 0xa2, 0x01, 0x00, 0x35, + 0x00, 0x38, 0x42, 0xbd, 0x02, 0x1c, 0xe8, 0xd2, 0x41, 0x00, 0x67, 0x9e, + 0x00, 0xc0, 0x22, 0x1e, 0x00, 0x08, 0x61, 0x1e, 0x02, 0x20, 0x41, 0xf9, + 0x3f, 0x14, 0x00, 0xb9, 0x20, 0x10, 0x00, 0xfd, 0x02, 0x64, 0x00, 0xf9, + 0x02, 0x24, 0x41, 0xf9, 0x02, 0x68, 0x00, 0xf9, 0xed, 0xff, 0xff, 0x17, + 0x02, 0x1c, 0xe8, 0xd2, 0x40, 0x00, 0x67, 0x9e, 0xf7, 0xff, 0xff, 0x17, + 0xff, 0xc3, 0x03, 0xd1, 0xfd, 0x7b, 0x03, 0xa9, 0xfd, 0xc3, 0x00, 0x91, + 0x05, 0x3c, 0x40, 0xf9, 0xf3, 0x53, 0x04, 0xa9, 0xf3, 0x03, 0x00, 0xaa, + 0x14, 0x00, 0x08, 0x91, 0x04, 0x60, 0x41, 0xb9, 0x00, 0x00, 0x45, 0x39, + 0xf5, 0x5b, 0x05, 0xa9, 0x88, 0x12, 0x54, 0xb8, 0x87, 0x52, 0x54, 0xf8, + 0xf7, 0x63, 0x06, 0xa9, 0xb5, 0x04, 0x40, 0x79, 0x86, 0xd2, 0x54, 0xf8, + 0xf9, 0x6b, 0x07, 0xa9, 0xf8, 0x03, 0x02, 0xaa, 0x76, 0x22, 0x40, 0xf9, + 0xff, 0xff, 0x13, 0x29, 0xff, 0xa7, 0x00, 0xb9, 0xf9, 0x03, 0x03, 0xaa, + 0xe0, 0xa3, 0x02, 0x39, 0xd6, 0xa6, 0x02, 0x91, 0xe8, 0xaf, 0x00, 0xb9, + 0xe5, 0x03, 0x15, 0x2a, 0xe7, 0x1b, 0x0b, 0xa9, 0x66, 0x5a, 0x42, 0x79, + 0x77, 0x36, 0x40, 0xf9, 0x62, 0x6e, 0x40, 0xf9, 0x64, 0x0f, 0x00, 0x34, + 0xf7, 0x52, 0x00, 0x91, 0xe1, 0x06, 0x40, 0xb9, 0x80, 0x05, 0x00, 0x34, + 0xe0, 0x93, 0x02, 0x91, 0xe3, 0x83, 0x02, 0x91, 0xe4, 0x03, 0x03, 0x91, + 0xe4, 0x03, 0x00, 0xf9, 0xf5, 0x0b, 0x00, 0xb9, 0xe7, 0x03, 0x06, 0x2a, + 0xf5, 0x13, 0x00, 0xb9, 0xe6, 0x03, 0x05, 0x2a, 0xe1, 0x1b, 0x00, 0xb9, + 0xe5, 0xa3, 0x02, 0x91, 0xe3, 0x03, 0x02, 0xa9, 0x64, 0x42, 0x12, 0x91, + 0xe3, 0x03, 0x16, 0xaa, 0xe1, 0x03, 0x19, 0xaa, 0xe0, 0x03, 0x18, 0xaa, + 0xc8, 0x22, 0x00, 0x94, 0xe0, 0x9f, 0x00, 0xb9, 0xe0, 0x0b, 0x00, 0x35, + 0x60, 0x02, 0x45, 0x39, 0x20, 0x08, 0x00, 0x34, 0x80, 0xd2, 0x54, 0xb8, + 0xe0, 0x07, 0x00, 0x35, 0xe2, 0x07, 0x54, 0x29, 0x23, 0x18, 0x02, 0x0b, + 0x80, 0x52, 0x54, 0xb8, 0x81, 0x92, 0x54, 0xb8, 0x84, 0x12, 0x55, 0xb8, + 0x22, 0x18, 0x00, 0x0b, 0x65, 0x00, 0x02, 0x4b, 0x42, 0x00, 0x03, 0x6b, + 0xa2, 0x40, 0x82, 0x1a, 0xc4, 0x14, 0x00, 0x35, 0x5f, 0x0c, 0x00, 0x71, + 0x8d, 0x00, 0x00, 0x54, 0x82, 0x08, 0x9c, 0x52, 0xe0, 0x07, 0x14, 0x29, + 0x62, 0x5a, 0x01, 0xb9, 0x62, 0x22, 0x40, 0xf9, 0x43, 0x60, 0x44, 0x39, + 0x7f, 0x04, 0x00, 0x71, 0x00, 0x14, 0x00, 0x54, 0xe0, 0x07, 0x54, 0x29, + 0x3b, 0x00, 0x00, 0x14, 0x60, 0x22, 0x40, 0xf9, 0xe3, 0x73, 0x02, 0x91, + 0xe3, 0x13, 0x00, 0xf9, 0xe7, 0x03, 0x03, 0x91, 0x64, 0x72, 0x05, 0x91, + 0xe3, 0x03, 0x16, 0xaa, 0x00, 0xd4, 0x42, 0x39, 0xf5, 0x03, 0x00, 0xb9, + 0xf5, 0x0b, 0x00, 0xb9, 0xe1, 0x13, 0x00, 0xb9, 0xe1, 0x03, 0x19, 0xaa, + 0xe0, 0x1b, 0x00, 0xb9, 0xe0, 0x03, 0x18, 0xaa, 0xdf, 0x21, 0x00, 0x94, + 0xe8, 0x03, 0x00, 0x2a, 0xe0, 0x9f, 0x40, 0xb9, 0xe8, 0xa3, 0x00, 0xb9, + 0x80, 0x06, 0x00, 0x35, 0x60, 0x62, 0x41, 0xb9, 0x80, 0xfa, 0xff, 0x35, + 0x60, 0x3e, 0x40, 0xf9, 0xe9, 0x93, 0x02, 0x91, 0x67, 0x5a, 0x42, 0x79, + 0xea, 0x83, 0x02, 0x91, 0x62, 0x6e, 0x40, 0xf9, 0xe5, 0xa3, 0x02, 0x91, + 0x06, 0x04, 0x40, 0x79, 0xe0, 0x03, 0x03, 0x91, 0xe0, 0x03, 0x00, 0xf9, + 0x64, 0x42, 0x12, 0x91, 0xf5, 0x0b, 0x00, 0xb9, 0xe3, 0x03, 0x16, 0xaa, + 0xf5, 0x13, 0x00, 0xb9, 0xe1, 0x03, 0x19, 0xaa, 0xe8, 0x1b, 0x00, 0xb9, + 0xe0, 0x03, 0x18, 0xaa, 0xea, 0x27, 0x02, 0xa9, 0x87, 0x22, 0x00, 0x94, + 0xe0, 0x9f, 0x00, 0xb9, 0x00, 0xf8, 0xff, 0x34, 0x1d, 0x00, 0x00, 0x14, + 0x60, 0x3e, 0x40, 0xf9, 0xe3, 0x93, 0x02, 0x91, 0x65, 0x5a, 0x42, 0x79, + 0xe6, 0x03, 0x03, 0x91, 0xe2, 0x03, 0x16, 0xaa, 0xe1, 0x03, 0x19, 0xaa, + 0x04, 0x04, 0x40, 0x79, 0xe7, 0x83, 0x02, 0x91, 0xe3, 0x03, 0x00, 0xf9, + 0xe0, 0x03, 0x18, 0xaa, 0x63, 0x42, 0x12, 0x91, 0x18, 0x24, 0x00, 0x94, + 0xe0, 0x9f, 0x00, 0xb9, 0xe0, 0x01, 0x00, 0x35, 0x62, 0x02, 0x45, 0x39, + 0xe0, 0x07, 0x54, 0x29, 0x02, 0x12, 0x00, 0x35, 0x65, 0x06, 0x40, 0xb9, + 0x03, 0x00, 0x00, 0x0b, 0x62, 0x3a, 0x41, 0xb9, 0x04, 0x48, 0x88, 0x52, + 0xe4, 0x01, 0xa0, 0x72, 0xbf, 0x00, 0x04, 0x6b, 0xe0, 0x86, 0x00, 0x29, + 0x60, 0x80, 0x80, 0x1a, 0x40, 0x00, 0x00, 0x0b, 0x60, 0x3e, 0x01, 0xb9, + 0xe0, 0x9f, 0x40, 0xb9, 0xfd, 0x7b, 0x43, 0xa9, 0xf3, 0x53, 0x44, 0xa9, + 0xf5, 0x5b, 0x45, 0xa9, 0xf7, 0x63, 0x46, 0xa9, 0xf9, 0x6b, 0x47, 0xa9, + 0xff, 0xc3, 0x03, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x73, 0x02, 0x91, + 0xf5, 0x03, 0x00, 0xb9, 0xf5, 0x0b, 0x00, 0xb9, 0xfa, 0x03, 0x01, 0xaa, + 0xff, 0x13, 0x00, 0xb9, 0xe1, 0x03, 0x18, 0xaa, 0xff, 0x1b, 0x00, 0xb9, + 0xe7, 0x03, 0x03, 0x91, 0xe0, 0x13, 0x00, 0xf9, 0x64, 0x72, 0x05, 0x91, + 0xe3, 0x03, 0x16, 0xaa, 0xe0, 0x03, 0x1a, 0xaa, 0x94, 0x21, 0x00, 0x94, + 0xe1, 0x03, 0x00, 0x2a, 0xe0, 0x9f, 0x40, 0xb9, 0xe1, 0xa3, 0x00, 0xb9, + 0x20, 0xfd, 0xff, 0x35, 0x60, 0x3e, 0x40, 0xf9, 0xe8, 0x83, 0x02, 0x91, + 0x67, 0x5a, 0x42, 0x79, 0xe5, 0xa3, 0x02, 0x91, 0x62, 0x6e, 0x40, 0xf9, + 0xfb, 0x73, 0x08, 0xa9, 0x06, 0x04, 0x40, 0x79, 0xfb, 0x93, 0x02, 0x91, + 0xe0, 0x03, 0x03, 0x91, 0xe0, 0x03, 0x00, 0xf9, 0x7c, 0x42, 0x12, 0x91, + 0xf5, 0x0b, 0x00, 0xb9, 0xe4, 0x03, 0x1c, 0xaa, 0xf5, 0x13, 0x00, 0xb9, + 0xe3, 0x03, 0x16, 0xaa, 0xe1, 0x1b, 0x00, 0xb9, 0xe0, 0x03, 0x1a, 0xaa, + 0xe8, 0x6f, 0x02, 0xa9, 0xe1, 0x03, 0x18, 0xaa, 0x3c, 0x22, 0x00, 0x94, + 0xe0, 0x9f, 0x00, 0xb9, 0xc0, 0x04, 0x00, 0x35, 0x61, 0x3e, 0x40, 0xf9, + 0xe8, 0x83, 0x02, 0x91, 0x65, 0x5a, 0x42, 0x79, 0xe7, 0x03, 0x08, 0xaa, + 0xe3, 0x03, 0x1c, 0xaa, 0xe0, 0x03, 0x1a, 0xaa, 0x24, 0x04, 0x40, 0x79, + 0xe6, 0x03, 0x03, 0x91, 0xfb, 0x03, 0x00, 0xf9, 0xe2, 0x03, 0x16, 0xaa, + 0xe1, 0x03, 0x18, 0xaa, 0xce, 0x23, 0x00, 0x94, 0xe0, 0x9f, 0x00, 0xb9, + 0x00, 0x03, 0x00, 0x35, 0xe0, 0xa3, 0x40, 0xb9, 0x01, 0x48, 0x88, 0x52, + 0xe1, 0x01, 0xa0, 0x72, 0x62, 0x06, 0x40, 0xb9, 0x60, 0x3a, 0x01, 0xb9, + 0x5f, 0x00, 0x01, 0x6b, 0x29, 0x01, 0x00, 0x54, 0xe1, 0xa7, 0x40, 0xb9, + 0x00, 0x00, 0x00, 0x0b, 0x60, 0x3a, 0x01, 0xb9, 0x21, 0x44, 0x00, 0x51, + 0x3f, 0x78, 0x00, 0x71, 0x68, 0x00, 0x00, 0x54, 0x00, 0x04, 0x00, 0x11, + 0x60, 0x3a, 0x01, 0xb9, 0x61, 0x3e, 0x40, 0xf9, 0x66, 0x5a, 0x42, 0x79, + 0xfb, 0x73, 0x48, 0xa9, 0x25, 0x04, 0x40, 0x79, 0x62, 0x6e, 0x40, 0xf9, + 0xe0, 0x16, 0x00, 0xb9, 0x60, 0x02, 0x45, 0x39, 0x3b, 0xff, 0xff, 0x17, + 0xfb, 0x73, 0x48, 0xa9, 0xac, 0xff, 0xff, 0x17, 0x5f, 0x18, 0x04, 0x6b, + 0xed, 0xeb, 0xff, 0x54, 0x5b, 0xff, 0xff, 0x17, 0x64, 0x36, 0x40, 0xf9, + 0x83, 0x40, 0x46, 0x39, 0x7f, 0x08, 0x00, 0x71, 0x00, 0x02, 0x00, 0x54, + 0x7f, 0x04, 0x00, 0x71, 0x01, 0xf3, 0xff, 0x54, 0x82, 0x44, 0x46, 0x39, + 0x5f, 0x08, 0x00, 0x71, 0xa0, 0xf2, 0xff, 0x54, 0x81, 0x78, 0x41, 0xbd, + 0x80, 0x7c, 0x41, 0xbd, 0x30, 0x20, 0x20, 0x1e, 0x25, 0xf2, 0xff, 0x54, + 0x62, 0x5a, 0x41, 0xb9, 0xe2, 0xf1, 0xff, 0x35, 0xe0, 0x07, 0x54, 0x29, + 0x80, 0x52, 0x14, 0xb8, 0x81, 0x92, 0x14, 0xb8, 0x8b, 0xff, 0xff, 0x17, + 0x63, 0x5a, 0x41, 0xb9, 0x23, 0xf1, 0xff, 0x35, 0x83, 0xc4, 0x40, 0xfd, + 0xe0, 0x07, 0x54, 0x29, 0x78, 0x20, 0x60, 0x1e, 0x20, 0x18, 0x00, 0x0b, + 0x00, 0x00, 0x62, 0x1e, 0x0d, 0x01, 0x00, 0x54, 0x42, 0x00, 0x08, 0x91, + 0x02, 0x10, 0x6e, 0x1e, 0x41, 0x30, 0x52, 0xbc, 0x21, 0xc0, 0x22, 0x1e, + 0x42, 0x38, 0x61, 0x1e, 0x20, 0x08, 0x60, 0x1e, 0x60, 0x00, 0x42, 0x1f, + 0x00, 0x00, 0x64, 0x9e, 0x01, 0x08, 0x80, 0x52, 0xe3, 0x93, 0x02, 0x91, + 0xe2, 0x83, 0x02, 0x91, 0x80, 0xc4, 0x00, 0xfd, 0x34, 0x20, 0x00, 0x94, + 0xe0, 0x07, 0x54, 0x29, 0x80, 0x52, 0x14, 0xb8, 0x81, 0x92, 0x14, 0xb8, + 0x72, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0x22, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0x02, 0x26, 0x80, 0xd2, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x93, 0x02, 0x00, 0xd0, + 0x61, 0x82, 0x13, 0x91, 0x13, 0x1c, 0x40, 0x92, 0x14, 0x1c, 0x00, 0x12, + 0x73, 0x06, 0x02, 0x9b, 0x73, 0x42, 0x03, 0x91, 0xe0, 0x03, 0x13, 0xaa, + 0x01, 0x00, 0x80, 0x12, 0xe8, 0x45, 0xff, 0x97, 0x1f, 0x68, 0x08, 0x71, + 0x80, 0xff, 0xff, 0x54, 0x01, 0x00, 0x80, 0x52, 0xa0, 0x00, 0x00, 0x35, + 0xe0, 0x03, 0x01, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe4, 0x03, 0x14, 0x2a, 0xe2, 0x03, 0x00, 0x2a, + 0x41, 0x16, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x83, 0x00, 0x00, 0xb0, + 0x63, 0x00, 0x26, 0x91, 0x5d, 0x69, 0xff, 0x97, 0x21, 0x28, 0x9c, 0x52, + 0xe0, 0x03, 0x01, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0x01, 0x1c, 0x40, 0x92, + 0x82, 0x02, 0x00, 0xd0, 0x42, 0x80, 0x13, 0x91, 0x03, 0x26, 0x80, 0xd2, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0x13, 0x1c, 0x00, 0x12, + 0x20, 0x08, 0x03, 0x9b, 0x00, 0x40, 0x03, 0x91, 0xba, 0x45, 0xff, 0x97, + 0x80, 0x00, 0x00, 0x35, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe4, 0x03, 0x13, 0x2a, 0xe2, 0x03, 0x00, 0x2a, + 0xf3, 0x0b, 0x40, 0xf9, 0x83, 0x00, 0x00, 0xb0, 0xfd, 0x7b, 0xc2, 0xa8, + 0x63, 0xc0, 0x26, 0x91, 0x41, 0x16, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x3d, 0x69, 0xff, 0x17, 0xfd, 0x7b, 0xbd, 0xa9, 0x04, 0x26, 0x80, 0xd2, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0x93, 0x02, 0x00, 0xd0, + 0x63, 0x82, 0x13, 0x91, 0x13, 0x1c, 0x40, 0x92, 0xf5, 0x13, 0x00, 0xf9, + 0x15, 0x1c, 0x00, 0x12, 0xf4, 0x03, 0x02, 0x2a, 0x73, 0x0e, 0x04, 0x9b, + 0x60, 0x62, 0x40, 0x79, 0x1f, 0x00, 0x00, 0x71, 0x20, 0x18, 0x41, 0x7a, + 0x8d, 0x02, 0x00, 0x54, 0x60, 0x92, 0x41, 0x39, 0xa0, 0x00, 0x00, 0x35, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe1, 0x03, 0x14, 0x2a, 0xe0, 0x03, 0x15, 0x2a, + 0x65, 0x9f, 0xff, 0x97, 0xe0, 0x02, 0x00, 0x34, 0xe2, 0x03, 0x00, 0x2a, + 0xe4, 0x03, 0x15, 0x2a, 0x00, 0x01, 0x80, 0x52, 0x83, 0x00, 0x00, 0xb0, + 0x41, 0x16, 0x80, 0x52, 0x63, 0x40, 0x28, 0x91, 0x1d, 0x69, 0xff, 0x97, + 0x60, 0x28, 0x9c, 0x52, 0xf0, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x15, 0x2a, + 0x01, 0x00, 0x80, 0x52, 0x6c, 0x9f, 0xff, 0x97, 0x20, 0x03, 0x00, 0x34, + 0xe2, 0x03, 0x00, 0x2a, 0xe4, 0x03, 0x15, 0x2a, 0x00, 0x01, 0x80, 0x52, + 0x83, 0x00, 0x00, 0xb0, 0x41, 0x16, 0x80, 0x52, 0x63, 0x80, 0x27, 0x91, + 0x10, 0x69, 0xff, 0x97, 0x60, 0x28, 0x9c, 0x52, 0xe3, 0xff, 0xff, 0x17, + 0xe0, 0x03, 0x15, 0x2a, 0x21, 0x00, 0x80, 0x52, 0x5f, 0x9f, 0xff, 0x97, + 0xe0, 0xfc, 0xff, 0x35, 0xe0, 0x03, 0x15, 0x2a, 0x03, 0x00, 0x80, 0x52, + 0x02, 0x00, 0x80, 0x52, 0x01, 0x00, 0x80, 0x52, 0x79, 0x9f, 0xff, 0x97, + 0x20, 0xfc, 0xff, 0x35, 0x7f, 0x92, 0x01, 0x39, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe1, 0x03, 0x14, 0x2a, 0xe0, 0x03, 0x15, 0x2a, 0x64, 0x9f, 0xff, 0x97, + 0xa0, 0xfc, 0xff, 0x35, 0x62, 0xc2, 0x40, 0x39, 0xe0, 0x03, 0x15, 0x2a, + 0x61, 0xc6, 0x40, 0x39, 0x63, 0x36, 0x40, 0xb9, 0x6a, 0x9f, 0xff, 0x97, + 0xe0, 0xfb, 0xff, 0x35, 0x21, 0x00, 0x80, 0x52, 0x61, 0x92, 0x01, 0x39, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x43, 0x01, 0xd1, 0x01, 0x1c, 0x40, 0x92, 0x02, 0x26, 0x80, 0xd2, + 0xfd, 0x7b, 0x01, 0xa9, 0xfd, 0x43, 0x00, 0x91, 0xf5, 0x5b, 0x03, 0xa9, + 0x95, 0x02, 0x00, 0xd0, 0xb5, 0x82, 0x13, 0x91, 0xf6, 0x03, 0x01, 0xaa, + 0xf3, 0x53, 0x02, 0xa9, 0x21, 0x54, 0x02, 0x9b, 0xf7, 0x63, 0x04, 0xa9, + 0x17, 0x1c, 0x00, 0x12, 0xe2, 0x03, 0x01, 0xaa, 0x21, 0x00, 0x01, 0x91, + 0xc0, 0x00, 0x80, 0xd2, 0x33, 0x78, 0x60, 0xb8, 0xf4, 0x03, 0x00, 0x2a, + 0x00, 0x04, 0x00, 0xd1, 0x7f, 0x1a, 0x00, 0x71, 0x80, 0x00, 0x00, 0x54, + 0x43, 0x40, 0x33, 0x8b, 0x63, 0xe4, 0x40, 0x39, 0x43, 0x01, 0x00, 0x35, + 0x1f, 0x04, 0x00, 0xb1, 0xe1, 0xfe, 0xff, 0x54, 0x00, 0x00, 0x80, 0x52, + 0xfd, 0x7b, 0x41, 0xa9, 0xf3, 0x53, 0x42, 0xa9, 0xf5, 0x5b, 0x43, 0xa9, + 0xf7, 0x63, 0x44, 0xa9, 0xff, 0x43, 0x01, 0x91, 0xc0, 0x03, 0x5f, 0xd6, + 0x40, 0x5c, 0x40, 0xb9, 0x1f, 0x00, 0x14, 0x6b, 0x40, 0x03, 0x00, 0x54, + 0x40, 0xe0, 0x40, 0x39, 0x40, 0x04, 0x00, 0x35, 0x40, 0x60, 0x40, 0xb9, + 0x1f, 0x00, 0x13, 0x6b, 0x41, 0x03, 0x00, 0x54, 0x02, 0x26, 0x80, 0xd2, + 0xc1, 0x04, 0x80, 0xd2, 0x00, 0x00, 0x80, 0x52, 0xc2, 0x56, 0x02, 0x9b, + 0xc1, 0x7e, 0x01, 0x9b, 0xfd, 0x7b, 0x41, 0xa9, 0x43, 0xc4, 0x40, 0xb9, + 0x44, 0xc0, 0x45, 0xf8, 0x7f, 0x1c, 0x00, 0x71, 0x21, 0x40, 0x23, 0x8b, + 0xe3, 0x07, 0x83, 0x1a, 0x54, 0xcc, 0x0b, 0x29, 0xb5, 0x0e, 0x01, 0x8b, + 0x43, 0xc4, 0x00, 0xb9, 0xf3, 0x53, 0x42, 0xa9, 0xa4, 0x42, 0x08, 0xf8, + 0xf5, 0x5b, 0x43, 0xa9, 0xf7, 0x63, 0x44, 0xa9, 0xff, 0x43, 0x01, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x60, 0x40, 0xb9, 0x1f, 0x00, 0x13, 0x6b, + 0x60, 0xfb, 0xff, 0x54, 0x40, 0xe0, 0x40, 0x39, 0xc0, 0x00, 0x00, 0x35, + 0xe1, 0x03, 0x13, 0x2a, 0xe0, 0x03, 0x17, 0x2a, 0xbc, 0x9c, 0xff, 0x97, + 0x80, 0xfc, 0xff, 0x34, 0x06, 0x00, 0x00, 0x14, 0xe2, 0x03, 0x13, 0x2a, + 0xe1, 0x03, 0x14, 0x2a, 0xe0, 0x03, 0x17, 0x2a, 0x66, 0xff, 0xff, 0x97, + 0xe0, 0x01, 0x00, 0x34, 0x01, 0x26, 0x80, 0xd2, 0xf7, 0x03, 0x00, 0xb9, + 0xe2, 0x03, 0x00, 0x2a, 0xe5, 0x03, 0x14, 0x2a, 0xd5, 0x56, 0x01, 0x9b, + 0x00, 0x01, 0x80, 0x52, 0xe4, 0x03, 0x13, 0x2a, 0x83, 0x00, 0x00, 0xb0, + 0x41, 0x16, 0x80, 0x52, 0x63, 0x00, 0x29, 0x91, 0xa7, 0x9a, 0x4b, 0x29, + 0x95, 0x68, 0xff, 0x97, 0x60, 0x28, 0x9c, 0x52, 0xc2, 0xff, 0xff, 0x17, + 0x9f, 0x1a, 0x00, 0x71, 0x40, 0x02, 0x00, 0x54, 0x00, 0x26, 0x80, 0xd2, + 0xc0, 0x56, 0x00, 0x9b, 0x01, 0x5c, 0x40, 0xb9, 0x3f, 0x14, 0x00, 0x71, + 0xac, 0x01, 0x00, 0x54, 0x01, 0x60, 0x40, 0xb9, 0x3f, 0x18, 0x00, 0x71, + 0x40, 0x01, 0x00, 0x54, 0x3f, 0x00, 0x13, 0x6b, 0x80, 0xf8, 0xff, 0x54, + 0x00, 0x90, 0x41, 0x39, 0x61, 0x1e, 0x00, 0x12, 0xe0, 0x01, 0x00, 0x34, + 0xe0, 0x03, 0x17, 0x2a, 0xea, 0x9e, 0xff, 0x97, 0xc0, 0xf7, 0xff, 0x34, + 0xe0, 0xff, 0xff, 0x17, 0x78, 0x1e, 0x00, 0x12, 0xe0, 0x03, 0x17, 0x2a, + 0xe1, 0x03, 0x18, 0x2a, 0xbc, 0x9e, 0xff, 0x97, 0x60, 0xfb, 0xff, 0x35, + 0xe1, 0x03, 0x18, 0x2a, 0xe0, 0x03, 0x17, 0x2a, 0x8c, 0x9c, 0xff, 0x97, + 0x80, 0xf6, 0xff, 0x34, 0xd6, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x17, 0x2a, + 0xb4, 0x9e, 0xff, 0x97, 0x60, 0xfa, 0xff, 0x35, 0xe0, 0x03, 0x17, 0x2a, + 0x21, 0x00, 0x80, 0x52, 0xc4, 0x9e, 0xff, 0x97, 0x80, 0xf5, 0xff, 0x34, + 0xce, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf9, 0x23, 0x00, 0xf9, 0x99, 0x02, 0x00, 0xd0, + 0xf3, 0x53, 0x01, 0xa9, 0x94, 0x02, 0x00, 0xd0, 0x94, 0x82, 0x13, 0x91, + 0x94, 0xe2, 0x00, 0x91, 0x13, 0x00, 0x80, 0x52, 0xf5, 0x5b, 0x02, 0xa9, + 0x96, 0x00, 0x00, 0xb0, 0xd6, 0x62, 0x2a, 0x91, 0xf7, 0x63, 0x03, 0xa9, + 0x37, 0x01, 0x00, 0xb0, 0xf7, 0x22, 0x37, 0x91, 0x1d, 0x37, 0xff, 0x97, + 0x20, 0xdb, 0x04, 0xb9, 0x06, 0x00, 0x00, 0x14, 0x73, 0x06, 0x00, 0x11, + 0x94, 0xc2, 0x04, 0x91, 0x7f, 0x22, 0x00, 0x71, 0x60, 0x04, 0x00, 0x54, + 0x20, 0xdb, 0x44, 0xb9, 0x78, 0x1e, 0x00, 0x12, 0x00, 0x24, 0xd3, 0x1a, + 0x20, 0xff, 0x07, 0x36, 0xe1, 0x03, 0x16, 0xaa, 0x80, 0x62, 0x02, 0x91, + 0xa4, 0x44, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, 0xe2, 0x03, 0x17, 0xaa, + 0xe0, 0x03, 0x18, 0x2a, 0x21, 0x00, 0x80, 0x52, 0x15, 0x07, 0x00, 0x35, + 0x9a, 0x9b, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x13, 0x2a, + 0x95, 0x07, 0x00, 0x35, 0x9e, 0x36, 0xff, 0x97, 0x1f, 0x00, 0x00, 0x71, + 0xe3, 0x17, 0x9f, 0x1a, 0xc0, 0x00, 0x80, 0x52, 0x22, 0x00, 0x80, 0x52, + 0x01, 0x00, 0x80, 0x12, 0x83, 0x02, 0x00, 0x39, 0x73, 0x06, 0x00, 0x11, + 0x82, 0x16, 0x00, 0x39, 0x7f, 0x22, 0x00, 0x71, 0x9f, 0x02, 0x01, 0x29, + 0x80, 0x02, 0x02, 0x29, 0x80, 0x02, 0x03, 0x29, 0x80, 0x06, 0x04, 0x29, + 0x80, 0x2a, 0x00, 0xb9, 0x94, 0xc2, 0x04, 0x91, 0x01, 0xfc, 0xff, 0x54, + 0x1f, 0x20, 0x03, 0xd5, 0x02, 0x00, 0x00, 0xb0, 0x81, 0x00, 0x00, 0xb0, + 0x42, 0x40, 0x05, 0x91, 0x21, 0xc0, 0x2c, 0x91, 0x80, 0x02, 0x00, 0xd0, + 0x26, 0x00, 0x80, 0x52, 0x00, 0x80, 0x39, 0x91, 0x05, 0x02, 0x80, 0x52, + 0x04, 0x00, 0x82, 0x52, 0x03, 0x00, 0x80, 0xd2, 0xbe, 0x43, 0xff, 0x97, + 0xf5, 0x03, 0x00, 0x2a, 0x00, 0x01, 0x00, 0x35, 0xe0, 0x03, 0x15, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0x03, 0x13, 0x2a, 0xe2, 0x03, 0x15, 0x2a, 0x41, 0x16, 0x80, 0x52, + 0x83, 0x00, 0x00, 0xb0, 0x63, 0x20, 0x2c, 0x91, 0x1b, 0x68, 0xff, 0x97, + 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe4, 0x03, 0x13, 0x2a, 0xe2, 0x03, 0x15, 0x2a, + 0x83, 0x00, 0x00, 0xb0, 0x41, 0x16, 0x80, 0x52, 0x63, 0xc0, 0x2a, 0x91, + 0x00, 0x01, 0x80, 0x52, 0x0d, 0x68, 0xff, 0x97, 0xe5, 0xff, 0xff, 0x17, + 0xe4, 0x03, 0x13, 0x2a, 0xe2, 0x03, 0x15, 0x2a, 0x83, 0x00, 0x00, 0xb0, + 0x41, 0x16, 0x80, 0x52, 0x63, 0x80, 0x2b, 0x91, 0x00, 0x01, 0x80, 0x52, + 0x05, 0x68, 0xff, 0x97, 0xdd, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0x3f, 0x00, 0x00, 0xf1, 0xfd, 0x03, 0x00, 0x91, 0x82, 0x02, 0x00, 0xd0, + 0x42, 0xd8, 0x44, 0xb9, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x01, 0xaa, + 0xf5, 0x13, 0x00, 0xf9, 0x15, 0x1c, 0x00, 0x12, 0x40, 0x24, 0xc0, 0x1a, + 0xe0, 0x03, 0x20, 0x2a, 0x00, 0x00, 0x00, 0x12, 0x00, 0x14, 0x9f, 0x1a, + 0x60, 0x01, 0x00, 0x34, 0xe6, 0x03, 0x01, 0xaa, 0x84, 0x00, 0x00, 0xb0, + 0x83, 0x00, 0x00, 0xb0, 0x84, 0x80, 0x36, 0x91, 0x63, 0x20, 0x2d, 0x91, + 0xe5, 0x03, 0x15, 0x2a, 0xa2, 0xd7, 0x83, 0x12, 0x41, 0x16, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xe9, 0x67, 0xff, 0x97, 0xe0, 0x03, 0x15, 0x2a, + 0x6f, 0xfe, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0xc0, 0x01, 0x00, 0x35, + 0x80, 0x02, 0x00, 0xd0, 0x01, 0x80, 0x13, 0x91, 0xa0, 0x7e, 0x40, 0x93, + 0x04, 0x26, 0x80, 0xd2, 0x62, 0x0e, 0x40, 0xa9, 0x00, 0x04, 0x04, 0x9b, + 0x02, 0x0c, 0x00, 0xa9, 0x61, 0x0a, 0x40, 0xf9, 0x01, 0x08, 0x00, 0xf9, + 0x61, 0x52, 0x40, 0x39, 0x01, 0x01, 0x00, 0x34, 0xe0, 0x03, 0x15, 0x2a, + 0x84, 0xfe, 0xff, 0x97, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x01, 0x4c, 0x40, 0xb9, 0x3f, 0x18, 0x00, 0x71, 0xe0, 0xfe, 0xff, 0x54, + 0xc1, 0x00, 0x80, 0x52, 0x01, 0x4c, 0x00, 0xb9, 0x00, 0x5c, 0x40, 0xb9, + 0x1f, 0x0c, 0x00, 0x71, 0x4c, 0xfe, 0xff, 0x54, 0xe0, 0x03, 0x15, 0x2a, + 0xdd, 0xfe, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0xee, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x82, 0x02, 0x00, 0xd0, 0x42, 0xd8, 0x44, 0xb9, + 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x1c, 0x00, 0x12, 0xf5, 0x13, 0x00, 0xf9, + 0x40, 0x24, 0xc0, 0x1a, 0xf5, 0x03, 0x01, 0x2a, 0x40, 0x01, 0x00, 0x36, + 0xe0, 0x03, 0x14, 0x2a, 0x41, 0xfe, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x60, 0x02, 0x00, 0x34, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe5, 0x03, 0x14, 0x2a, 0x84, 0x00, 0x00, 0xb0, 0x83, 0x00, 0x00, 0xb0, + 0x84, 0x00, 0x37, 0x91, 0x63, 0xc0, 0x2d, 0x91, 0xa2, 0xd7, 0x83, 0x12, + 0x41, 0x16, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0xa9, 0x67, 0xff, 0x97, + 0xe0, 0x03, 0x14, 0x2a, 0x2f, 0xfe, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0xe0, 0xfd, 0xff, 0x35, 0x81, 0x02, 0x00, 0xd0, 0x22, 0x80, 0x13, 0x91, + 0x81, 0x7e, 0x40, 0x93, 0x03, 0x26, 0x80, 0xd2, 0xe0, 0x03, 0x14, 0x2a, + 0x21, 0x08, 0x03, 0x9b, 0x35, 0x18, 0x00, 0xb9, 0x49, 0xfe, 0xff, 0x97, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x86, 0x02, 0x00, 0xd0, 0xc6, 0xd8, 0x44, 0xb9, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x04, 0x2a, 0xf5, 0x5b, 0x02, 0xa9, + 0xc6, 0x24, 0xc0, 0x1a, 0xf6, 0x03, 0x02, 0x2a, 0xf7, 0x63, 0x03, 0xa9, + 0xf5, 0x03, 0x05, 0x2a, 0xf7, 0x03, 0x01, 0x2a, 0xf9, 0x23, 0x00, 0xf9, + 0xf8, 0x03, 0x03, 0x2a, 0x19, 0x1c, 0x00, 0x12, 0x66, 0x04, 0x00, 0x36, + 0xe0, 0x03, 0x19, 0x2a, 0x0b, 0xfe, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x00, 0x03, 0x00, 0x35, 0x86, 0x02, 0x00, 0xd0, 0xc0, 0x80, 0x13, 0x91, + 0x26, 0x7f, 0x40, 0x93, 0x01, 0x26, 0x80, 0xd2, 0x9f, 0x0e, 0x00, 0x71, + 0xc6, 0x00, 0x01, 0x9b, 0xd5, 0x1c, 0x00, 0xb9, 0xd7, 0xd8, 0x04, 0x29, + 0x00, 0x04, 0x00, 0x54, 0xd4, 0x20, 0x00, 0xb9, 0x9f, 0x06, 0x00, 0x71, + 0xdf, 0x2c, 0x00, 0xb9, 0x28, 0x01, 0x00, 0x54, 0xc0, 0x44, 0x40, 0xb9, + 0x1f, 0x18, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x54, 0xc0, 0x00, 0x80, 0x52, + 0xc0, 0x44, 0x00, 0xb9, 0xc0, 0x5c, 0x40, 0xb9, 0x1f, 0x04, 0x00, 0x71, + 0x2d, 0x03, 0x00, 0x54, 0xe0, 0x03, 0x19, 0x2a, 0x16, 0xfe, 0xff, 0x97, + 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x23, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe5, 0x03, 0x19, 0x2a, 0x84, 0x00, 0x00, 0xb0, + 0x83, 0x00, 0x00, 0xb0, 0x84, 0x80, 0x37, 0x91, 0x63, 0xc0, 0x2d, 0x91, + 0xa2, 0xd7, 0x83, 0x12, 0x41, 0x16, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x5a, 0x67, 0xff, 0x97, 0xd5, 0xff, 0xff, 0x17, 0xd4, 0x20, 0x00, 0xb9, + 0xe0, 0x03, 0x19, 0x2a, 0xd8, 0x2c, 0x00, 0xb9, 0x01, 0xfe, 0xff, 0x97, + 0xeb, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x19, 0x2a, 0x66, 0xfe, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0xe5, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x84, 0x02, 0x00, 0xd0, 0x84, 0xd8, 0x44, 0xb9, + 0xf3, 0x53, 0x01, 0xa9, 0x14, 0x1c, 0x00, 0x12, 0xf5, 0x5b, 0x02, 0xa9, + 0x84, 0x24, 0xc0, 0x1a, 0x36, 0x1c, 0x00, 0x12, 0xf7, 0x1b, 0x00, 0xf9, + 0xf5, 0x03, 0x03, 0x2a, 0x57, 0x1c, 0x00, 0x12, 0x64, 0x01, 0x00, 0x36, + 0xe0, 0x03, 0x14, 0x2a, 0xc6, 0xfd, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x80, 0x02, 0x00, 0x34, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe5, 0x03, 0x14, 0x2a, 0x84, 0x00, 0x00, 0xb0, + 0x83, 0x00, 0x00, 0xb0, 0x84, 0x00, 0x38, 0x91, 0x63, 0xc0, 0x2d, 0x91, + 0xa2, 0xd7, 0x83, 0x12, 0x41, 0x16, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x2d, 0x67, 0xff, 0x97, 0xe0, 0x03, 0x14, 0x2a, 0xb3, 0xfd, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0xc0, 0xfd, 0xff, 0x35, 0x84, 0x02, 0x00, 0xd0, + 0x81, 0x80, 0x13, 0x91, 0x84, 0x7e, 0x40, 0x93, 0x02, 0x26, 0x80, 0xd2, + 0xe0, 0x03, 0x14, 0x2a, 0x84, 0x04, 0x02, 0x9b, 0x81, 0x88, 0x4b, 0x29, + 0x97, 0xc0, 0x00, 0x39, 0x96, 0xc4, 0x00, 0x39, 0x95, 0x34, 0x00, 0xb9, + 0xe2, 0xfd, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x14, 0x2a, + 0xc7, 0xfd, 0xff, 0x97, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x82, 0x02, 0x00, 0xd0, 0x42, 0xd8, 0x44, 0xb9, 0xf5, 0x5b, 0x02, 0xa9, + 0xf6, 0x03, 0x01, 0x2a, 0xf7, 0x63, 0x03, 0xa9, 0x18, 0x1c, 0x00, 0x12, + 0x40, 0x24, 0xc0, 0x1a, 0x60, 0x00, 0x00, 0x36, 0x3f, 0x64, 0x19, 0x72, + 0x60, 0x01, 0x00, 0x54, 0x84, 0x00, 0x00, 0xb0, 0x83, 0x00, 0x00, 0xb0, + 0x84, 0xe0, 0x38, 0x91, 0x63, 0x40, 0x2e, 0x91, 0xe6, 0x03, 0x16, 0x2a, + 0xe5, 0x03, 0x18, 0x2a, 0xa2, 0xd7, 0x83, 0x12, 0x41, 0x16, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xff, 0x66, 0xff, 0x97, 0xe0, 0x03, 0x18, 0x2a, + 0x85, 0xfd, 0xff, 0x97, 0x20, 0x04, 0x00, 0x35, 0x97, 0x02, 0x00, 0xd0, + 0xe0, 0x82, 0x13, 0x91, 0x17, 0x7f, 0x40, 0x93, 0xf3, 0x53, 0x01, 0xa9, + 0x14, 0x1f, 0x40, 0x92, 0x01, 0x26, 0x80, 0xd2, 0x33, 0x00, 0x80, 0x52, + 0xf9, 0x23, 0x00, 0xf9, 0xd9, 0x00, 0x80, 0x52, 0x94, 0x02, 0x01, 0x9b, + 0xf7, 0x02, 0x01, 0x9b, 0xc0, 0x26, 0xd3, 0x1a, 0x00, 0x01, 0x00, 0x36, + 0x80, 0x46, 0x40, 0xb9, 0x1f, 0x18, 0x00, 0x71, 0xa0, 0x00, 0x00, 0x54, + 0xe0, 0x5e, 0x40, 0xb9, 0x99, 0x46, 0x00, 0xb9, 0x1f, 0x00, 0x13, 0x6b, + 0x2d, 0x02, 0x00, 0x54, 0x15, 0x00, 0x80, 0x52, 0x20, 0x00, 0x80, 0x52, + 0x73, 0x06, 0x00, 0x11, 0x1f, 0x00, 0x00, 0x71, 0x60, 0x1a, 0x46, 0x7a, + 0x94, 0x12, 0x00, 0x91, 0x2d, 0xfe, 0xff, 0x54, 0xe0, 0x03, 0x18, 0x2a, + 0x8b, 0xfd, 0xff, 0x97, 0xf3, 0x53, 0x41, 0xa9, 0xe0, 0x03, 0x15, 0x2a, + 0xf9, 0x23, 0x40, 0xf9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x18, 0x2a, + 0xea, 0xfd, 0xff, 0x97, 0x1f, 0x00, 0x00, 0x71, 0xf5, 0x03, 0x00, 0x2a, + 0xe0, 0x17, 0x9f, 0x1a, 0xed, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0x83, 0x02, 0x00, 0xd0, + 0x63, 0xd8, 0x44, 0xb9, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x01, 0x2a, + 0x14, 0x1c, 0x40, 0x92, 0xf5, 0x13, 0x00, 0xf9, 0x63, 0x24, 0xc0, 0x1a, + 0xf5, 0x03, 0x02, 0xaa, 0x83, 0x00, 0x00, 0x36, 0x5f, 0x00, 0x00, 0xf1, + 0x22, 0x18, 0x46, 0x7a, 0x89, 0x01, 0x00, 0x54, 0x84, 0x00, 0x00, 0xb0, + 0x83, 0x00, 0x00, 0xb0, 0x84, 0x60, 0x39, 0x91, 0x63, 0x00, 0x2f, 0x91, + 0xe7, 0x03, 0x15, 0xaa, 0xe6, 0x03, 0x13, 0x2a, 0xe5, 0x03, 0x14, 0x2a, + 0xa2, 0xd7, 0x83, 0x12, 0x41, 0x16, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xb8, 0x66, 0xff, 0x97, 0x86, 0x09, 0x80, 0xd2, 0x81, 0x02, 0x00, 0xd0, + 0x21, 0x80, 0x13, 0x91, 0x00, 0x00, 0x80, 0x52, 0x86, 0x7e, 0x06, 0x9b, + 0xd3, 0xc0, 0x33, 0x8b, 0x73, 0x42, 0x00, 0x91, 0x21, 0x78, 0x73, 0xb8, + 0xf3, 0x53, 0x41, 0xa9, 0xa1, 0x02, 0x00, 0xb9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x81, 0x02, 0x00, 0xd0, 0x21, 0xd8, 0x44, 0xb9, 0xf3, 0x53, 0x01, 0xa9, + 0x14, 0x1c, 0x00, 0x12, 0x20, 0x24, 0xc0, 0x1a, 0x20, 0x01, 0x00, 0x36, + 0xe0, 0x03, 0x14, 0x2a, 0x27, 0xfd, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x40, 0x02, 0x00, 0x34, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe5, 0x03, 0x14, 0x2a, + 0x84, 0x00, 0x00, 0xb0, 0x83, 0x00, 0x00, 0xb0, 0x84, 0xc0, 0x39, 0x91, + 0x63, 0xc0, 0x2d, 0x91, 0xa2, 0xd7, 0x83, 0x12, 0x41, 0x16, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x90, 0x66, 0xff, 0x97, 0xe0, 0x03, 0x14, 0x2a, + 0x16, 0xfd, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, 0x00, 0xfe, 0xff, 0x35, + 0x81, 0x02, 0x00, 0xd0, 0x22, 0x80, 0x13, 0x91, 0x81, 0x7e, 0x40, 0x93, + 0x03, 0x26, 0x80, 0xd2, 0xf5, 0x5b, 0x02, 0xa9, 0xe0, 0x03, 0x14, 0x2a, + 0x21, 0x08, 0x03, 0x9b, 0x36, 0x60, 0x40, 0xb9, 0xe1, 0x03, 0x16, 0x2a, + 0x96, 0x9a, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x14, 0x2a, + 0x2b, 0xfd, 0xff, 0x97, 0xd5, 0x00, 0x00, 0x35, 0xe0, 0x03, 0x13, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe4, 0x03, 0x16, 0x2a, 0xe2, 0x03, 0x15, 0x2a, + 0xe5, 0x03, 0x14, 0x2a, 0x83, 0x00, 0x00, 0xb0, 0x41, 0x16, 0x80, 0x52, + 0x63, 0xe0, 0x2f, 0x91, 0x00, 0x01, 0x80, 0x52, 0x73, 0x28, 0x9c, 0x52, + 0x70, 0x66, 0xff, 0x97, 0xf5, 0x5b, 0x42, 0xa9, 0xd2, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0x3f, 0x18, 0x00, 0x71, + 0xfd, 0x03, 0x00, 0x91, 0x83, 0x02, 0x00, 0xd0, 0x63, 0xd8, 0x44, 0xb9, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x01, 0x2a, 0xf5, 0x5b, 0x02, 0xa9, + 0xf7, 0x63, 0x03, 0xa9, 0x17, 0x1c, 0x00, 0x12, 0x60, 0x24, 0xc0, 0x1a, + 0xe0, 0x03, 0x20, 0x2a, 0xe3, 0x97, 0x9f, 0x1a, 0x00, 0x00, 0x00, 0x12, + 0x58, 0x1c, 0x00, 0x12, 0x60, 0x00, 0x00, 0x2a, 0x60, 0x01, 0x00, 0x34, + 0xe6, 0x03, 0x01, 0x2a, 0x84, 0x00, 0x00, 0x90, 0x83, 0x00, 0x00, 0x90, + 0x84, 0x20, 0x3a, 0x91, 0x63, 0x80, 0x30, 0x91, 0xe5, 0x03, 0x17, 0x2a, + 0xa2, 0xd7, 0x83, 0x12, 0x41, 0x16, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x52, 0x66, 0xff, 0x97, 0x93, 0x02, 0x00, 0xb0, 0x60, 0x82, 0x13, 0x91, + 0xf3, 0x7e, 0x40, 0x93, 0x01, 0x26, 0x80, 0xd2, 0x15, 0x00, 0x80, 0x52, + 0x73, 0x02, 0x01, 0x9b, 0x76, 0x42, 0x34, 0x8b, 0xc0, 0xe6, 0x40, 0x39, + 0x1f, 0x00, 0x18, 0x6b, 0xe1, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x15, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x17, 0x2a, + 0xc8, 0xfc, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, 0xe0, 0xfe, 0xff, 0x35, + 0x60, 0x62, 0x40, 0xb9, 0x1f, 0x03, 0x00, 0x71, 0xd8, 0xe6, 0x00, 0x39, + 0x04, 0x00, 0x54, 0x7a, 0x81, 0x00, 0x00, 0x54, 0xe0, 0x03, 0x17, 0x2a, + 0x4b, 0xfd, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x17, 0x2a, + 0xe0, 0xfc, 0xff, 0x97, 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x05, 0x1c, 0x40, 0x92, + 0x26, 0x7c, 0x40, 0x93, 0x83, 0x09, 0x80, 0xd2, 0x84, 0x02, 0x00, 0xb0, + 0x84, 0x80, 0x13, 0x91, 0x00, 0x1c, 0x00, 0x12, 0xa3, 0x18, 0x03, 0x9b, + 0x67, 0x40, 0x00, 0x91, 0x87, 0x78, 0x67, 0xb8, 0xff, 0x00, 0x02, 0x6b, + 0x20, 0x02, 0x00, 0x54, 0x5f, 0x18, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x54, + 0x63, 0x50, 0x00, 0x91, 0x83, 0x08, 0x03, 0x8b, 0x67, 0x18, 0x40, 0xb9, + 0xe7, 0x04, 0x00, 0x11, 0x67, 0x18, 0x00, 0xb9, 0x83, 0x09, 0x80, 0xd2, + 0x07, 0x26, 0x80, 0xd2, 0xa3, 0x18, 0x03, 0x9b, 0xa5, 0x10, 0x07, 0x9b, + 0x63, 0x40, 0x00, 0x91, 0x82, 0x78, 0x23, 0xb8, 0xa2, 0x5c, 0x40, 0xb9, + 0x5f, 0x00, 0x01, 0x6b, 0x6d, 0x00, 0x00, 0x54, 0x00, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x23, 0xfd, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb7, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xe0, 0xe3, 0x01, 0x91, 0x69, 0x40, 0xff, 0x97, 0xe0, 0x10, 0x00, 0x35, + 0xe0, 0x3f, 0x40, 0xf9, 0xe1, 0x06, 0x80, 0x52, 0xf5, 0x5b, 0x02, 0xa9, + 0x88, 0x40, 0xff, 0x97, 0xf6, 0x03, 0x00, 0x2a, 0xe0, 0x14, 0x00, 0x35, + 0xf3, 0x53, 0x01, 0xa9, 0xf7, 0x63, 0x03, 0xa9, 0x98, 0x02, 0x00, 0xb0, + 0x18, 0x83, 0x13, 0x91, 0xf9, 0x6b, 0x04, 0xa9, 0x99, 0x00, 0x00, 0x90, + 0x20, 0x03, 0x34, 0x91, 0xfb, 0x73, 0x05, 0xa9, 0xe0, 0x37, 0x00, 0xf9, + 0x03, 0x00, 0x00, 0x14, 0xdf, 0x8e, 0x01, 0x71, 0x48, 0x08, 0x00, 0x54, + 0xe0, 0x3f, 0x40, 0xf9, 0xe1, 0x03, 0x02, 0x91, 0x02, 0x00, 0x80, 0x12, + 0xff, 0x77, 0x00, 0xb9, 0xad, 0x40, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0xc0, 0x0f, 0x00, 0x35, 0xf5, 0x87, 0x40, 0xb9, 0xe2, 0xd3, 0x01, 0x91, + 0x40, 0x00, 0x80, 0x52, 0xb4, 0x1e, 0x00, 0x12, 0xe1, 0x03, 0x14, 0x2a, + 0x49, 0x21, 0xff, 0x97, 0xa0, 0x10, 0x00, 0x35, 0xe0, 0x77, 0x40, 0xb9, + 0x1f, 0x04, 0x00, 0x71, 0xc1, 0xfd, 0xff, 0x54, 0xe0, 0x47, 0x40, 0xf9, + 0x99, 0x7e, 0x40, 0x93, 0x17, 0x26, 0x80, 0xd2, 0x21, 0x03, 0x80, 0x52, + 0x1b, 0x1c, 0x00, 0x12, 0xb5, 0x1e, 0x00, 0x12, 0x1a, 0x3c, 0x08, 0x53, + 0x37, 0x63, 0x17, 0x9b, 0xe0, 0x03, 0x15, 0x2a, 0x7b, 0x7f, 0x01, 0x1b, + 0x5a, 0x7f, 0x01, 0x1b, 0xfc, 0x03, 0x1b, 0x4b, 0xe1, 0x03, 0x1a, 0x4b, + 0xfc, 0x06, 0x19, 0x29, 0x5e, 0xfc, 0xff, 0x97, 0x80, 0x0b, 0x00, 0x35, + 0xe4, 0x2e, 0x40, 0xb9, 0xc2, 0x00, 0x80, 0x52, 0xe0, 0x1a, 0x40, 0xb9, + 0x84, 0x00, 0x1b, 0x4b, 0x1f, 0x00, 0x04, 0x6b, 0x4d, 0x00, 0x00, 0x54, + 0xe2, 0x1e, 0x40, 0xb9, 0xa1, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x15, 0x2a, + 0xe4, 0x67, 0x00, 0xb9, 0x9e, 0xff, 0xff, 0x97, 0x01, 0x26, 0x80, 0xd2, + 0x1f, 0x00, 0x00, 0x71, 0xe4, 0x67, 0x40, 0xb9, 0xd6, 0x06, 0x96, 0x1a, + 0x20, 0x7f, 0x01, 0x9b, 0x01, 0x03, 0x00, 0x8b, 0x22, 0x50, 0x40, 0x39, + 0x82, 0x00, 0x00, 0x34, 0x22, 0x4c, 0x40, 0xb9, 0x5f, 0x18, 0x00, 0x71, + 0x00, 0x03, 0x00, 0x54, 0x00, 0x26, 0x80, 0xd2, 0x22, 0x63, 0x00, 0x9b, + 0x41, 0x20, 0x40, 0xb9, 0x25, 0x08, 0x00, 0x51, 0xbf, 0x04, 0x00, 0x71, + 0x09, 0x05, 0x00, 0x54, 0xe0, 0x03, 0x15, 0x2a, 0x63, 0xfc, 0xff, 0x97, + 0xdf, 0x8e, 0x01, 0x71, 0x09, 0xf8, 0xff, 0x54, 0x83, 0x00, 0x00, 0x90, + 0x63, 0xe0, 0x34, 0x91, 0x62, 0xd7, 0x83, 0x12, 0x41, 0x16, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xaf, 0x65, 0xff, 0x97, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xc9, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x6b, 0x60, 0xb8, 0x1f, 0x00, 0x1c, 0x6b, 0xea, 0xfc, 0xff, 0x54, + 0x20, 0x08, 0x40, 0xb9, 0x7a, 0x03, 0x1a, 0x4b, 0x1f, 0x00, 0x1a, 0x6b, + 0xea, 0x09, 0x00, 0x54, 0x22, 0x10, 0x40, 0xb9, 0x5f, 0x18, 0x00, 0x71, + 0x00, 0xfc, 0xff, 0x54, 0x61, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x15, 0x2a, + 0xe4, 0x67, 0x00, 0xb9, 0x6e, 0xff, 0xff, 0x97, 0x1f, 0x00, 0x00, 0x71, + 0x21, 0x00, 0x80, 0x52, 0xd6, 0x06, 0x96, 0x1a, 0x21, 0x20, 0xd4, 0x1a, + 0x40, 0x16, 0x80, 0x52, 0x6c, 0x21, 0xff, 0x97, 0xe4, 0x67, 0x40, 0xb9, + 0xd4, 0xff, 0xff, 0x17, 0x25, 0x07, 0x80, 0xd2, 0x42, 0x24, 0x40, 0xb9, + 0x94, 0x16, 0xa0, 0x9b, 0x5f, 0x00, 0x04, 0x6b, 0x14, 0x03, 0x14, 0x8b, + 0x4d, 0x00, 0x00, 0x54, 0x93, 0x06, 0x40, 0x39, 0x3f, 0x0c, 0x00, 0x71, + 0x80, 0x03, 0x00, 0x54, 0xe2, 0x03, 0x13, 0x2a, 0xe0, 0x03, 0x15, 0x2a, + 0x21, 0x00, 0x80, 0x52, 0x59, 0xff, 0xff, 0x97, 0x1f, 0x00, 0x00, 0x71, + 0xd6, 0x06, 0x96, 0x1a, 0xca, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, + 0x41, 0x16, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x83, 0x00, 0x00, 0x90, + 0x63, 0x40, 0x31, 0x91, 0x7c, 0x65, 0xff, 0x97, 0xfd, 0x7b, 0xc9, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe3, 0x37, 0x40, 0xf9, 0xe2, 0x03, 0x00, 0x2a, + 0xe4, 0x03, 0x14, 0x2a, 0xd6, 0x06, 0x00, 0x11, 0x41, 0x16, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0x73, 0x65, 0xff, 0x97, 0x7b, 0xff, 0xff, 0x17, + 0x83, 0x00, 0x00, 0x90, 0x63, 0xa0, 0x32, 0x91, 0xe2, 0x03, 0x00, 0x2a, + 0xbd, 0xff, 0xff, 0x17, 0x00, 0x26, 0x80, 0xd2, 0x23, 0x63, 0x00, 0x9b, + 0x60, 0x28, 0x40, 0xb9, 0x1f, 0x00, 0x04, 0x6b, 0x2d, 0xfc, 0xff, 0x54, + 0x81, 0x0a, 0x40, 0x39, 0x40, 0x00, 0x80, 0x52, 0x3f, 0x00, 0x00, 0x71, + 0x73, 0x02, 0x80, 0x1a, 0xdc, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, + 0xe4, 0x03, 0x14, 0x2a, 0x83, 0x00, 0x00, 0x90, 0x41, 0x16, 0x80, 0x52, + 0x63, 0x40, 0x33, 0x91, 0x00, 0x02, 0x80, 0x52, 0x5d, 0x65, 0xff, 0x97, + 0xae, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0x41, 0x16, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x83, 0x00, 0x00, 0x90, 0x63, 0x00, 0x32, 0x91, + 0x56, 0x65, 0xff, 0x97, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc9, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x04, 0x40, 0xb9, 0x1f, 0x00, 0x1a, 0x6b, + 0x4d, 0xf2, 0xff, 0x54, 0x22, 0x0c, 0x40, 0xb9, 0xaf, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x83, 0x02, 0x00, 0xb0, 0x63, 0xd8, 0x44, 0xb9, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x01, 0x2a, 0xf4, 0x03, 0x02, 0x2a, 0xf5, 0x5b, 0x02, 0xa9, + 0x63, 0x24, 0xc0, 0x1a, 0x16, 0x1c, 0x00, 0x12, 0x83, 0x02, 0x00, 0x36, + 0x3f, 0x18, 0x00, 0x71, 0x42, 0x98, 0x46, 0x7a, 0x28, 0x02, 0x00, 0x54, + 0xc3, 0x7e, 0x40, 0x93, 0x80, 0x09, 0x80, 0xd2, 0x81, 0x02, 0x00, 0xb0, + 0x21, 0x80, 0x13, 0x91, 0x15, 0x00, 0x80, 0x52, 0x63, 0x7c, 0x00, 0x9b, + 0x63, 0xc0, 0x33, 0x8b, 0x63, 0x40, 0x00, 0x91, 0x20, 0x78, 0x63, 0xb8, + 0x1f, 0x00, 0x14, 0x6b, 0x41, 0x02, 0x00, 0x54, 0xe0, 0x03, 0x15, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe7, 0x03, 0x14, 0x2a, 0xe6, 0x03, 0x13, 0x2a, + 0xe5, 0x03, 0x16, 0x2a, 0x84, 0x00, 0x00, 0x90, 0x83, 0x00, 0x00, 0x90, + 0x84, 0x80, 0x38, 0x91, 0x63, 0xa0, 0x35, 0x91, 0xa2, 0xd7, 0x83, 0x12, + 0x41, 0x16, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x24, 0x65, 0xff, 0x97, + 0xe5, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x16, 0x2a, 0xa9, 0xfb, 0xff, 0x97, + 0xf5, 0x03, 0x00, 0x2a, 0x80, 0xfd, 0xff, 0x35, 0xe2, 0x03, 0x14, 0x2a, + 0xe1, 0x03, 0x13, 0x2a, 0xe0, 0x03, 0x16, 0x2a, 0xef, 0xfe, 0xff, 0x97, + 0xe0, 0x03, 0x16, 0x2a, 0xc5, 0xfb, 0xff, 0x97, 0xe0, 0x03, 0x15, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0x00, 0x0c, 0x41, 0xf9, + 0x01, 0x00, 0x40, 0x79, 0x41, 0x03, 0x00, 0x35, 0x02, 0x90, 0x40, 0x79, + 0xe1, 0xc3, 0x89, 0x12, 0x42, 0x00, 0x00, 0x36, 0x01, 0x04, 0xc0, 0x79, + 0x02, 0xa0, 0x40, 0x79, 0xf4, 0xc3, 0x89, 0x12, 0x82, 0x03, 0x00, 0x37, + 0x9f, 0x02, 0x01, 0x6b, 0xe0, 0x4d, 0x82, 0x52, 0x60, 0x50, 0xa7, 0x72, + 0x94, 0xc2, 0x81, 0x1a, 0x01, 0x00, 0x27, 0x1e, 0x00, 0x90, 0x24, 0x1e, + 0x94, 0x3e, 0x00, 0x13, 0x82, 0x02, 0x22, 0x1e, 0x41, 0x08, 0x21, 0x1e, + 0x4b, 0x22, 0x00, 0x94, 0x02, 0x88, 0x19, 0x1e, 0x74, 0xee, 0x01, 0xb9, + 0xe1, 0x03, 0x14, 0x2a, 0x60, 0x02, 0x40, 0x39, 0x62, 0xf2, 0x01, 0xb9, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0x2d, 0xfd, 0xff, 0x17, + 0xf4, 0xc3, 0x89, 0x12, 0x02, 0x00, 0x80, 0x52, 0x74, 0xee, 0x01, 0xb9, + 0xe1, 0x03, 0x14, 0x2a, 0x62, 0xf2, 0x01, 0xb9, 0x60, 0x02, 0x40, 0x39, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0x24, 0xfd, 0xff, 0x17, + 0x14, 0x08, 0xc0, 0x79, 0xe4, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x20, 0x40, 0xf9, 0x03, 0x00, 0x82, 0x52, 0x01, 0x00, 0x81, 0x52, + 0x41, 0xd0, 0x4d, 0xbc, 0x40, 0x10, 0x4e, 0xbc, 0x21, 0xc0, 0x21, 0x1e, + 0x00, 0xc0, 0x21, 0x1e, 0x01, 0x34, 0x02, 0xbd, 0x00, 0x38, 0x02, 0xbd, + 0x42, 0x70, 0x43, 0x39, 0x5f, 0x00, 0x00, 0x71, 0x21, 0x10, 0x83, 0x1a, + 0x01, 0x64, 0x04, 0x79, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0x42, 0x1c, 0x00, 0x12, + 0x5f, 0x04, 0x00, 0x71, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xa5, 0x1c, 0x00, 0x12, 0xf4, 0x03, 0x03, 0x2a, 0xf5, 0x5b, 0x02, 0xa9, + 0xc6, 0x1c, 0x00, 0x12, 0x36, 0x1c, 0x00, 0x12, 0xf7, 0x63, 0x03, 0xa9, + 0x81, 0x50, 0x40, 0x39, 0x00, 0x08, 0x00, 0x54, 0x81, 0x03, 0x00, 0x34, + 0x81, 0x10, 0x40, 0xb9, 0x3f, 0x04, 0x00, 0x71, 0x40, 0x12, 0x00, 0x54, + 0x93, 0x0c, 0x40, 0xb9, 0x7f, 0x06, 0x00, 0x71, 0x80, 0x0c, 0x00, 0x54, + 0x5f, 0x08, 0x00, 0x71, 0x13, 0x00, 0x80, 0x52, 0x21, 0x07, 0x00, 0x54, + 0x13, 0x00, 0x80, 0x52, 0x37, 0x00, 0x80, 0x52, 0x9f, 0x0e, 0x00, 0x71, + 0xd5, 0x00, 0x05, 0x2a, 0xf8, 0x17, 0x9f, 0x1a, 0xa0, 0x02, 0x00, 0x35, + 0xb6, 0x0b, 0x00, 0x34, 0x94, 0x0a, 0x00, 0x51, 0x9f, 0x06, 0x00, 0x71, + 0x89, 0x0c, 0x00, 0x54, 0xe2, 0x02, 0x13, 0x2a, 0x62, 0x0d, 0x00, 0x35, + 0xb5, 0x0e, 0x00, 0x35, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x5f, 0x08, 0x00, 0x71, 0x13, 0x00, 0x80, 0x52, 0x80, 0xfd, 0xff, 0x54, + 0x17, 0x00, 0x80, 0x52, 0x9f, 0x0e, 0x00, 0x71, 0xd5, 0x00, 0x05, 0x2a, + 0xf8, 0x17, 0x9f, 0x1a, 0xa0, 0xfd, 0xff, 0x34, 0x1f, 0x04, 0x00, 0x71, + 0x21, 0x12, 0x00, 0x54, 0x9f, 0x0e, 0x00, 0x71, 0x60, 0x0e, 0x00, 0x54, + 0x76, 0x04, 0x00, 0x35, 0x9f, 0x0a, 0x00, 0x71, 0x00, 0x00, 0x80, 0x52, + 0x60, 0x10, 0x00, 0x54, 0xe2, 0x02, 0x13, 0x2a, 0xe2, 0x0e, 0x00, 0x35, + 0xbf, 0x02, 0x00, 0x71, 0xd6, 0x02, 0x00, 0x52, 0xe1, 0x07, 0x9f, 0x1a, + 0x3f, 0x00, 0x16, 0x6a, 0xa0, 0xfc, 0xff, 0x54, 0xa2, 0xd3, 0x83, 0x12, + 0x01, 0x1c, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0x83, 0x00, 0x00, 0xb0, + 0x63, 0x80, 0x04, 0x91, 0x8f, 0x64, 0xff, 0x97, 0x40, 0x2c, 0x9c, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x01, 0x04, 0x00, 0x34, + 0x81, 0x10, 0x40, 0xb9, 0xf3, 0x03, 0x02, 0x2a, 0x3f, 0x08, 0x00, 0x71, + 0x37, 0x00, 0x80, 0x52, 0x00, 0xf9, 0xff, 0x54, 0x81, 0x0c, 0x40, 0xb9, + 0x37, 0x00, 0x80, 0x52, 0x3f, 0x08, 0x00, 0x71, 0x80, 0xf8, 0xff, 0x54, + 0x17, 0x00, 0x80, 0x52, 0xd6, 0xff, 0xff, 0x17, 0x00, 0x00, 0x80, 0x52, + 0xd5, 0x02, 0x00, 0x35, 0x57, 0xf9, 0xff, 0x34, 0x80, 0x00, 0x80, 0x52, + 0x83, 0x00, 0x00, 0xb0, 0x63, 0x60, 0x02, 0x91, 0xe2, 0xd3, 0x83, 0x12, + 0x01, 0x1c, 0x80, 0x52, 0x74, 0x64, 0xff, 0x97, 0x9f, 0x0e, 0x00, 0x71, + 0x00, 0x2c, 0x9c, 0x52, 0x21, 0xf8, 0xff, 0x54, 0x80, 0x00, 0x80, 0x52, + 0x83, 0x00, 0x00, 0xb0, 0x63, 0x40, 0x03, 0x91, 0xe2, 0xd0, 0x83, 0x12, + 0x01, 0x1c, 0x80, 0x52, 0x6b, 0x64, 0xff, 0x97, 0x00, 0x2f, 0x9c, 0x52, + 0xd0, 0xff, 0xff, 0x17, 0xf3, 0x03, 0x02, 0x2a, 0x17, 0x00, 0x80, 0x52, + 0xbf, 0xff, 0xff, 0x17, 0x80, 0x00, 0x80, 0x52, 0x83, 0x00, 0x00, 0xb0, + 0x63, 0xa0, 0x01, 0x91, 0x42, 0xd4, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, + 0x60, 0x64, 0xff, 0x97, 0xa0, 0x2b, 0x9c, 0x52, 0xe4, 0xff, 0xff, 0x17, + 0x5f, 0x08, 0x00, 0x71, 0x00, 0xf4, 0xff, 0x54, 0xd6, 0xff, 0xff, 0x17, + 0x80, 0x00, 0x80, 0x52, 0x94, 0x0a, 0x00, 0x51, 0x83, 0x00, 0x00, 0x90, + 0x63, 0xa0, 0x3a, 0x91, 0xa2, 0xd4, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, + 0x54, 0x64, 0xff, 0x97, 0x9f, 0x06, 0x00, 0x71, 0x40, 0x2b, 0x9c, 0x52, + 0xc8, 0xf3, 0xff, 0x54, 0x82, 0xd4, 0x83, 0x12, 0x80, 0x00, 0x80, 0x52, + 0x83, 0x00, 0x00, 0x90, 0x63, 0x40, 0x3b, 0x91, 0x01, 0x1c, 0x80, 0x52, + 0x4b, 0x64, 0xff, 0x97, 0xe2, 0x02, 0x13, 0x2a, 0x60, 0x2b, 0x9c, 0x52, + 0xe2, 0xf2, 0xff, 0x34, 0x83, 0x00, 0x00, 0x90, 0x63, 0x00, 0x3c, 0x91, + 0x17, 0x03, 0x17, 0x0a, 0x62, 0xd4, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, + 0x80, 0x00, 0x80, 0x52, 0x41, 0x64, 0xff, 0x97, 0xb5, 0x00, 0x00, 0x35, + 0x80, 0x2b, 0x9c, 0x52, 0xd7, 0xf1, 0xff, 0x34, 0xcd, 0xff, 0xff, 0x17, + 0x17, 0x00, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0x83, 0x00, 0x00, 0x90, + 0x63, 0x80, 0x3d, 0x91, 0x42, 0xd4, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, + 0x36, 0x64, 0xff, 0x97, 0xa0, 0x2b, 0x9c, 0x52, 0x77, 0xf3, 0xff, 0x34, + 0xc3, 0xff, 0xff, 0x17, 0xf3, 0x03, 0x01, 0x2a, 0xf7, 0x03, 0x01, 0x2a, + 0x5f, 0x08, 0x00, 0x71, 0x80, 0xee, 0xff, 0x54, 0xac, 0xff, 0xff, 0x17, + 0x80, 0x00, 0x80, 0x52, 0x83, 0x00, 0x00, 0x90, 0x63, 0x40, 0x3e, 0x91, + 0xe2, 0xd0, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, 0x28, 0x64, 0xff, 0x97, + 0x00, 0x2f, 0x9c, 0x52, 0x76, 0xf1, 0xff, 0x34, 0x75, 0xf5, 0xff, 0x34, + 0xbf, 0xff, 0xff, 0x17, 0x80, 0x00, 0x80, 0x52, 0x83, 0x00, 0x00, 0xb0, + 0x63, 0x00, 0x00, 0x91, 0x02, 0xd4, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, + 0x1e, 0x64, 0xff, 0x97, 0x17, 0x03, 0x17, 0x0a, 0xe0, 0x2b, 0x9c, 0x52, + 0x57, 0xf0, 0xff, 0x34, 0xaa, 0xff, 0xff, 0x17, 0x80, 0x00, 0x80, 0x52, + 0x83, 0x00, 0x00, 0x90, 0x63, 0x00, 0x3f, 0x91, 0x22, 0xd4, 0x83, 0x12, + 0x01, 0x1c, 0x80, 0x52, 0x14, 0x64, 0xff, 0x97, 0xc0, 0x2b, 0x9c, 0x52, + 0x77, 0xff, 0xff, 0x17, 0x17, 0x03, 0x17, 0x0a, 0x00, 0x00, 0x80, 0x52, + 0xd7, 0xee, 0xff, 0x34, 0x9e, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xba, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0xf5, 0x03, 0x00, 0x2a, 0xf6, 0x03, 0x01, 0xaa, 0x4f, 0x1a, 0xff, 0x97, + 0x95, 0x00, 0x00, 0x34, 0xa1, 0x06, 0x00, 0x51, 0x3f, 0x00, 0x15, 0x6a, + 0x80, 0x01, 0x00, 0x54, 0x83, 0x00, 0x00, 0xb0, 0x63, 0x80, 0x08, 0x91, + 0xc2, 0xfe, 0x83, 0x12, 0x41, 0x16, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xfd, 0x63, 0xff, 0x97, 0xe1, 0x03, 0x16, 0xaa, 0xe0, 0x03, 0x15, 0x2a, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, 0x44, 0x15, 0x00, 0x14, + 0xf9, 0x6b, 0x04, 0xa9, 0xf9, 0x03, 0x00, 0x2a, 0x04, 0xa5, 0x80, 0xd2, + 0xe1, 0x04, 0x00, 0xd0, 0x2d, 0x40, 0x10, 0x91, 0x24, 0x7f, 0x04, 0x9b, + 0xe7, 0x02, 0x00, 0xd0, 0xe2, 0x20, 0x06, 0x91, 0xc9, 0x0e, 0x00, 0xd0, + 0x29, 0xc1, 0x17, 0x91, 0xa8, 0x0e, 0x00, 0xb0, 0x08, 0x21, 0x31, 0x91, + 0xfa, 0x07, 0x00, 0xb0, 0x4c, 0x43, 0x1c, 0x91, 0x0f, 0x0c, 0x80, 0x52, + 0x0e, 0x48, 0x80, 0x52, 0x07, 0xdc, 0x87, 0x52, 0xf7, 0x63, 0x03, 0xa9, + 0xb7, 0x0e, 0x00, 0xf0, 0xf7, 0xc2, 0x32, 0x91, 0x85, 0x33, 0x80, 0x52, + 0xab, 0x0e, 0x00, 0xf0, 0x6b, 0x21, 0x0d, 0x91, 0xea, 0x02, 0x00, 0xd0, + 0x4a, 0xc1, 0x16, 0x91, 0xe6, 0x04, 0x00, 0xd0, 0xc6, 0xc0, 0x09, 0x91, + 0x83, 0x00, 0x00, 0xf0, 0x63, 0xa0, 0x3d, 0x91, 0x1a, 0x04, 0x96, 0x52, + 0x3a, 0x00, 0xa0, 0x72, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x02, 0x04, 0x8b, + 0x01, 0x34, 0xa7, 0x9b, 0xb0, 0x25, 0x80, 0x52, 0x09, 0x24, 0xaf, 0x9b, + 0xa7, 0x0b, 0x80, 0x52, 0x08, 0x20, 0xae, 0x9b, 0x0f, 0x03, 0x80, 0x52, + 0x8e, 0x06, 0x80, 0x52, 0x05, 0x7c, 0xa5, 0x9b, 0x1a, 0x30, 0xba, 0x9b, + 0xfb, 0x73, 0x05, 0xa9, 0x0b, 0x2c, 0xb0, 0x9b, 0x0a, 0x28, 0xaf, 0x9b, + 0x9a, 0x86, 0x00, 0xa9, 0x06, 0x18, 0xae, 0x9b, 0x07, 0x08, 0xa7, 0x9b, + 0xc1, 0x0e, 0x00, 0xf0, 0x21, 0x40, 0x17, 0x91, 0xc2, 0x0e, 0x00, 0xd0, + 0x42, 0xc0, 0x23, 0x91, 0x21, 0x00, 0x05, 0x8b, 0x6c, 0x78, 0x79, 0xf8, + 0xa3, 0x0e, 0x00, 0xb0, 0x63, 0x40, 0x20, 0x91, 0x42, 0x00, 0x05, 0x8b, + 0x63, 0x1c, 0x19, 0x8b, 0x18, 0xa5, 0x80, 0x52, 0x83, 0xae, 0x03, 0xa9, + 0xf3, 0x03, 0x00, 0x2a, 0x18, 0x7c, 0xb8, 0x9b, 0x8a, 0xa6, 0x04, 0xa9, + 0x1c, 0x1c, 0x00, 0x12, 0xfb, 0x02, 0x18, 0x8b, 0x88, 0x2e, 0x00, 0xf9, + 0x82, 0x36, 0x00, 0xf9, 0x81, 0x3a, 0x00, 0xf9, 0x87, 0x3e, 0x00, 0xf9, + 0x8c, 0x46, 0x00, 0xf9, 0x86, 0xb6, 0x00, 0xf9, 0xfc, 0x6a, 0x24, 0x38, + 0x13, 0x32, 0xff, 0x97, 0xea, 0x03, 0x00, 0x2a, 0xe4, 0x02, 0x00, 0xd0, + 0x83, 0xc0, 0x11, 0x91, 0xe9, 0x02, 0x00, 0xd0, 0x29, 0xa1, 0x03, 0x91, + 0x84, 0x02, 0x80, 0x52, 0xa6, 0x0e, 0x00, 0xf0, 0xc2, 0x20, 0x04, 0x91, + 0xe8, 0x02, 0x00, 0xd0, 0x05, 0x21, 0x00, 0x91, 0xa7, 0x0e, 0x00, 0xd0, + 0xe7, 0x20, 0x39, 0x91, 0x01, 0xf0, 0x8f, 0x52, 0x69, 0x26, 0xa4, 0x9b, + 0x0b, 0x0b, 0x80, 0x52, 0x06, 0x09, 0x80, 0x52, 0x88, 0x03, 0x80, 0x52, + 0x04, 0x05, 0x80, 0x52, 0x61, 0x7e, 0xa1, 0x9b, 0x67, 0x1e, 0xab, 0x9b, + 0x8a, 0x06, 0x00, 0xb9, 0x66, 0x0a, 0xa6, 0x9b, 0xe2, 0x02, 0x00, 0xd0, + 0x42, 0xc0, 0x19, 0x91, 0x68, 0x16, 0xa8, 0x9b, 0x64, 0x0e, 0xa4, 0x9b, + 0xe3, 0x05, 0x00, 0xb0, 0x63, 0x40, 0x2c, 0x91, 0x05, 0x0f, 0x00, 0xb0, + 0xa5, 0x60, 0x02, 0x91, 0x23, 0x00, 0x03, 0x8b, 0x80, 0x22, 0x40, 0xf9, + 0x22, 0x00, 0x02, 0x8b, 0x82, 0x8e, 0x01, 0xa9, 0x81, 0x00, 0x00, 0xf0, + 0x21, 0xe0, 0x38, 0x91, 0x89, 0x42, 0x00, 0xf9, 0xa2, 0x25, 0x80, 0xd2, + 0x88, 0x4e, 0x00, 0xf9, 0x87, 0x0e, 0x01, 0xf9, 0x86, 0x12, 0x01, 0xf9, + 0x85, 0x16, 0x01, 0xf9, 0x84, 0x8e, 0x02, 0xf9, 0xd3, 0x23, 0x00, 0x94, + 0x86, 0x00, 0x00, 0xb0, 0xc6, 0xe0, 0x0f, 0x91, 0x87, 0x3e, 0x40, 0xf9, + 0x21, 0x01, 0x00, 0x90, 0x21, 0x20, 0x38, 0x91, 0x24, 0x01, 0x00, 0x90, + 0x84, 0xa0, 0x37, 0x91, 0xc5, 0x00, 0x80, 0x52, 0xc2, 0x0c, 0x40, 0xa9, + 0xe2, 0x0c, 0x00, 0xa9, 0xc2, 0x0c, 0x41, 0xa9, 0xe2, 0x0c, 0x01, 0xa9, + 0xc2, 0x0c, 0x42, 0xa9, 0xe2, 0x0c, 0x02, 0xa9, 0xc2, 0x0c, 0x43, 0xa9, + 0xe2, 0x0c, 0x03, 0xa9, 0xc2, 0x0c, 0x44, 0xa9, 0xe2, 0x0c, 0x04, 0xa9, + 0xc0, 0x28, 0x40, 0xf9, 0xe0, 0x28, 0x00, 0xf9, 0xc2, 0x50, 0x45, 0xf8, + 0xe2, 0x50, 0x05, 0xf8, 0xe0, 0x03, 0x13, 0x2a, 0x86, 0x0e, 0x41, 0xf9, + 0x22, 0x0c, 0x40, 0xa9, 0xc2, 0x0c, 0x00, 0xa9, 0x22, 0x0c, 0x41, 0xa9, + 0xc2, 0x0c, 0x01, 0xa9, 0x22, 0x0c, 0x42, 0xa9, 0xc2, 0x0c, 0x02, 0xa9, + 0x22, 0x0c, 0x43, 0xa9, 0xc2, 0x0c, 0x03, 0xa9, 0x22, 0x0c, 0x44, 0xa9, + 0xc2, 0x0c, 0x04, 0xa9, 0x21, 0x28, 0x40, 0xf9, 0xc1, 0x28, 0x00, 0xf9, + 0x82, 0x0c, 0x40, 0xa9, 0x81, 0x4e, 0x40, 0xf9, 0x22, 0x0c, 0x00, 0xa9, + 0x82, 0x08, 0x40, 0xf9, 0x22, 0x08, 0x00, 0xf9, 0x82, 0x18, 0x40, 0xb9, + 0x22, 0x18, 0x00, 0xb9, 0x83, 0x22, 0x40, 0xf9, 0x82, 0x4e, 0x40, 0xf9, + 0x81, 0x36, 0x40, 0xf9, 0x63, 0x00, 0x40, 0x79, 0x43, 0x30, 0x00, 0x79, + 0x25, 0x3c, 0x00, 0xb9, 0xa9, 0x31, 0xff, 0x97, 0x1f, 0x00, 0x00, 0x71, + 0xe2, 0x17, 0x9f, 0x1a, 0x82, 0xd2, 0x04, 0x39, 0x00, 0xc3, 0x12, 0x91, + 0x81, 0x00, 0x00, 0xb0, 0x21, 0x40, 0x05, 0x91, 0xe0, 0x02, 0x00, 0x8b, + 0x9d, 0x3f, 0xff, 0x97, 0x00, 0x0e, 0x00, 0x35, 0x00, 0x23, 0x02, 0x91, + 0x18, 0x43, 0x02, 0x91, 0xe0, 0x02, 0x00, 0x8b, 0xf8, 0x02, 0x18, 0x8b, + 0xa3, 0x3d, 0xff, 0x97, 0x00, 0x0a, 0x00, 0x34, 0x13, 0x3c, 0x00, 0x12, + 0x94, 0x00, 0x00, 0xb0, 0x94, 0x62, 0x06, 0x91, 0xe2, 0x03, 0x13, 0x2a, + 0xe3, 0x03, 0x14, 0xaa, 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0x3a, 0x63, 0xff, 0x97, 0xe0, 0x03, 0x18, 0xaa, 0x98, 0x3d, 0xff, 0x97, + 0xa0, 0x0f, 0x00, 0x35, 0x13, 0xa5, 0x80, 0xd2, 0x33, 0x5f, 0x13, 0x9b, + 0x60, 0x1e, 0x40, 0xf9, 0x57, 0x97, 0xff, 0x97, 0x80, 0x11, 0x00, 0x35, + 0x60, 0x1e, 0x40, 0xf9, 0x00, 0x40, 0x00, 0x91, 0x53, 0x97, 0xff, 0x97, + 0x61, 0x1e, 0x40, 0xf9, 0x22, 0x00, 0x40, 0xf9, 0x22, 0x10, 0x00, 0xf9, + 0x3f, 0x24, 0x00, 0xf9, 0xc0, 0x0e, 0x00, 0x34, 0x22, 0x04, 0x40, 0xf9, + 0x22, 0x14, 0x00, 0xf9, 0x3f, 0x28, 0x00, 0xf9, 0xe2, 0x03, 0x00, 0x2a, + 0x83, 0x00, 0x00, 0xb0, 0x63, 0x00, 0x07, 0x91, 0x61, 0x01, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x21, 0x63, 0xff, 0x97, 0x02, 0x3c, 0x85, 0xd2, + 0xe0, 0x03, 0x1a, 0xaa, 0x81, 0x00, 0x00, 0xb0, 0x21, 0x60, 0x11, 0x91, + 0x6c, 0x23, 0x00, 0x94, 0x01, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x1b, 0xaa, + 0xa9, 0xe0, 0xff, 0x97, 0x00, 0xa5, 0x80, 0xd2, 0x02, 0x00, 0x80, 0x52, + 0x01, 0x00, 0x80, 0x12, 0x39, 0x7f, 0x00, 0x9b, 0xf3, 0x02, 0x19, 0x8b, + 0xe0, 0x6a, 0x79, 0x38, 0x82, 0x95, 0xff, 0x97, 0xe0, 0x03, 0x1b, 0xaa, + 0xa0, 0xdd, 0xff, 0x97, 0xe0, 0x03, 0x1b, 0xaa, 0xfe, 0xfd, 0xff, 0x97, + 0xe0, 0x03, 0x1b, 0xaa, 0x28, 0xfe, 0xff, 0x97, 0x60, 0x22, 0x40, 0xf9, + 0x00, 0x50, 0x4e, 0x78, 0x00, 0x07, 0x00, 0x34, 0x00, 0x00, 0x23, 0x1e, + 0x02, 0x10, 0x2c, 0x1e, 0x01, 0x10, 0x2e, 0x1e, 0x00, 0x08, 0x22, 0x1e, + 0x02, 0x38, 0x21, 0x1e, 0x40, 0x18, 0x20, 0x1e, 0x21, 0x38, 0x20, 0x1e, + 0x60, 0x52, 0x02, 0xbd, 0x61, 0x56, 0x02, 0xbd, 0xe0, 0x03, 0x1c, 0x2a, + 0x21, 0x00, 0x80, 0x52, 0x59, 0x95, 0xff, 0x97, 0xe0, 0x05, 0x00, 0x35, + 0xe1, 0x03, 0x16, 0xaa, 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, 0x3f, 0x14, 0x00, 0x14, + 0x00, 0xa5, 0x80, 0xd2, 0x01, 0x00, 0xa8, 0x52, 0x61, 0x02, 0x01, 0x0b, + 0x20, 0x5f, 0x00, 0x9b, 0x00, 0x44, 0x40, 0xf9, 0x71, 0x3d, 0xff, 0x97, + 0x61, 0x7e, 0x02, 0x53, 0xe0, 0x0e, 0x00, 0x90, 0x00, 0xe0, 0x0a, 0x91, + 0x02, 0x48, 0x61, 0x38, 0x62, 0x00, 0x00, 0x35, 0x22, 0x00, 0x80, 0x52, + 0x02, 0x48, 0x21, 0x38, 0xe1, 0x0e, 0x00, 0x90, 0x21, 0xc0, 0x0a, 0x91, + 0x20, 0x48, 0x73, 0x38, 0x00, 0x04, 0x00, 0x34, 0xe0, 0x03, 0x18, 0xaa, + 0x40, 0x3d, 0xff, 0x97, 0x40, 0x04, 0x00, 0x35, 0x00, 0xa5, 0x80, 0xd2, + 0x61, 0xbe, 0x00, 0x11, 0x20, 0x5f, 0x00, 0x9b, 0x00, 0x48, 0x40, 0xf9, + 0x5e, 0x3d, 0xff, 0x97, 0xa3, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, + 0x83, 0x00, 0x00, 0xb0, 0x63, 0xa0, 0x05, 0x91, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xd3, 0x62, 0xff, 0x97, 0x8b, 0xff, 0xff, 0x17, + 0xa0, 0x0e, 0x00, 0xf0, 0x00, 0x00, 0x3c, 0x91, 0x3f, 0x6b, 0x20, 0xf8, + 0xcf, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0x83, 0x00, 0x00, 0xb0, + 0x63, 0x00, 0x08, 0x91, 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xc8, 0x62, 0xff, 0x97, 0xf3, 0x53, 0x41, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0xc7, 0xfe, 0xff, 0x17, + 0x22, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x18, 0xaa, 0x22, 0x48, 0x33, 0x38, + 0x1f, 0x3d, 0xff, 0x97, 0x00, 0xfc, 0xff, 0x34, 0x94, 0x00, 0x00, 0xb0, + 0x94, 0x62, 0x06, 0x91, 0x13, 0x00, 0x80, 0x52, 0xe3, 0x03, 0x14, 0xaa, + 0xe2, 0x03, 0x13, 0x2a, 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0xb6, 0x62, 0xff, 0x97, 0x7f, 0xff, 0xff, 0x17, 0x20, 0x20, 0x00, 0x91, + 0xd7, 0x96, 0xff, 0x97, 0x40, 0x01, 0x00, 0x35, 0x60, 0x1e, 0x40, 0xf9, + 0x00, 0x60, 0x00, 0x91, 0xd3, 0x96, 0xff, 0x97, 0x61, 0x1e, 0x40, 0xf9, + 0x22, 0x04, 0x40, 0xf9, 0x22, 0x14, 0x00, 0xf9, 0x3f, 0x28, 0x00, 0xf9, + 0x40, 0xf1, 0xff, 0x34, 0x83, 0xff, 0xff, 0x17, 0x61, 0x1e, 0x40, 0xf9, + 0x7e, 0xff, 0xff, 0x17, 0x61, 0x1e, 0x40, 0xf9, 0x22, 0x00, 0x40, 0xf9, + 0x22, 0x10, 0x00, 0xf9, 0x3f, 0x24, 0x00, 0xf9, 0x79, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb7, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x01, 0x2a, 0xf7, 0x63, 0x03, 0xa9, + 0xd4, 0x05, 0x38, 0x37, 0xf5, 0x5b, 0x02, 0xa9, 0xc1, 0x00, 0x80, 0x52, + 0xf6, 0x03, 0x00, 0x2a, 0x81, 0x00, 0x00, 0xb9, 0xf3, 0x03, 0x02, 0xaa, + 0xf5, 0x03, 0x04, 0xaa, 0x38, 0x01, 0x9c, 0x52, 0x40, 0x01, 0x00, 0x35, + 0x78, 0x02, 0x00, 0xb9, 0xa0, 0x02, 0x40, 0xb9, 0x60, 0x0a, 0x00, 0x79, + 0xe0, 0x03, 0x18, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc9, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x01, 0x04, 0x00, 0x51, 0x3f, 0x00, 0x00, 0x6a, 0xa1, 0xfe, 0xff, 0x54, + 0xf7, 0x03, 0x05, 0x2a, 0xf9, 0x6b, 0x04, 0xa9, 0xf9, 0x03, 0x03, 0x2a, + 0xcb, 0x18, 0xff, 0x97, 0xfa, 0x03, 0x00, 0x2a, 0x81, 0x0e, 0x00, 0x12, + 0x94, 0x02, 0x1c, 0x12, 0x3f, 0x14, 0x00, 0x71, 0xc0, 0x35, 0x00, 0x54, + 0xe8, 0x02, 0x00, 0x54, 0x3f, 0x08, 0x00, 0x71, 0x80, 0x30, 0x00, 0x54, + 0xe9, 0x03, 0x00, 0x54, 0x3f, 0x0c, 0x00, 0x71, 0x20, 0x28, 0x00, 0x54, + 0x3f, 0x10, 0x00, 0x71, 0x21, 0x27, 0x00, 0x54, 0xa0, 0x0e, 0x00, 0xf0, + 0x00, 0xc0, 0x32, 0x91, 0x01, 0xa5, 0x80, 0x52, 0x40, 0x03, 0xa1, 0x9b, + 0xf1, 0xdf, 0xff, 0x97, 0xf8, 0x03, 0x00, 0x2a, 0xf9, 0x6b, 0x44, 0xa9, + 0xdc, 0xff, 0xff, 0x17, 0x4d, 0x14, 0x00, 0x94, 0xf8, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x18, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc9, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x3f, 0x24, 0x00, 0x71, + 0xa0, 0x39, 0x00, 0x54, 0x49, 0x0e, 0x00, 0x54, 0x3f, 0x28, 0x00, 0x71, + 0xa1, 0x24, 0x00, 0x54, 0x14, 0x1e, 0x00, 0x34, 0x3f, 0x4f, 0x00, 0x71, + 0x98, 0x01, 0x9c, 0x52, 0x68, 0x1f, 0x00, 0x54, 0xf9, 0x6b, 0x44, 0xa9, + 0xca, 0xff, 0xff, 0x17, 0xe1, 0x25, 0x00, 0x34, 0x3f, 0x04, 0x00, 0x71, + 0x81, 0x23, 0x00, 0x54, 0x94, 0x16, 0x00, 0x35, 0x40, 0x19, 0x80, 0x52, + 0xa0, 0x02, 0x00, 0xb9, 0xff, 0x02, 0x00, 0x6b, 0x49, 0x23, 0x00, 0x54, + 0xf4, 0x03, 0x1a, 0x2a, 0xa6, 0x25, 0x80, 0xd2, 0xa5, 0x0e, 0x00, 0xd0, + 0xa5, 0x20, 0x0d, 0x91, 0x42, 0x7f, 0xa6, 0x9b, 0x64, 0x1a, 0x00, 0x91, + 0x86, 0x7e, 0x06, 0x9b, 0x63, 0x2a, 0x00, 0x91, 0x42, 0x1c, 0x00, 0x91, + 0x00, 0x00, 0x80, 0xd2, 0xa1, 0x00, 0x06, 0x8b, 0xa2, 0x00, 0x02, 0x8b, + 0x27, 0x08, 0x40, 0x39, 0x87, 0x08, 0x00, 0x39, 0xa6, 0x68, 0x66, 0x78, + 0x66, 0x0e, 0x00, 0x79, 0x26, 0x0c, 0x40, 0x39, 0x86, 0x0c, 0x00, 0x39, + 0x26, 0x10, 0x4c, 0xb8, 0x86, 0x60, 0x09, 0xb8, 0x26, 0x4c, 0x43, 0x39, + 0x86, 0x6c, 0x02, 0x39, 0x26, 0x48, 0x43, 0x39, 0x86, 0x68, 0x02, 0x39, + 0x26, 0x50, 0x43, 0x39, 0x86, 0x70, 0x02, 0x39, 0x26, 0x5c, 0x43, 0x39, + 0x86, 0x7c, 0x02, 0x39, 0x26, 0x54, 0x43, 0x39, 0x86, 0x74, 0x02, 0x39, + 0x26, 0x60, 0x43, 0x39, 0x86, 0x80, 0x02, 0x39, 0x26, 0x58, 0x43, 0x39, + 0x86, 0x78, 0x02, 0x39, 0x21, 0x64, 0x43, 0x39, 0x81, 0x84, 0x02, 0x39, + 0x1f, 0x20, 0x03, 0xd5, 0x41, 0x68, 0xe0, 0x78, 0x61, 0x68, 0x20, 0x78, + 0x00, 0x08, 0x00, 0x91, 0x1f, 0x00, 0x02, 0xf1, 0x81, 0xff, 0xff, 0x54, + 0xa0, 0x25, 0x80, 0xd2, 0x18, 0x00, 0x80, 0x52, 0x94, 0x16, 0x00, 0x9b, + 0x80, 0x02, 0x08, 0x91, 0x81, 0x2a, 0x42, 0x39, 0x81, 0x10, 0x02, 0x39, + 0x81, 0xd2, 0x48, 0xb8, 0x81, 0x50, 0x08, 0xb8, 0x81, 0x46, 0x42, 0x39, + 0x81, 0x24, 0x02, 0x39, 0x81, 0x4a, 0x42, 0x39, 0x81, 0x28, 0x02, 0x39, + 0x81, 0x4e, 0x42, 0x39, 0x81, 0x2c, 0x02, 0x39, 0x81, 0x52, 0x42, 0x39, + 0x81, 0x30, 0x02, 0x39, 0x81, 0x56, 0x42, 0x39, 0x81, 0x34, 0x02, 0x39, + 0x81, 0x5a, 0x42, 0x39, 0x81, 0x38, 0x02, 0x39, 0x81, 0x5e, 0x42, 0x39, + 0x81, 0x3c, 0x02, 0x39, 0x81, 0x62, 0x42, 0x39, 0x81, 0x40, 0x02, 0x39, + 0x81, 0x86, 0x42, 0x39, 0x81, 0x44, 0x02, 0x39, 0x81, 0xd2, 0x4b, 0xb8, + 0x81, 0x20, 0x09, 0xb8, 0x81, 0x6e, 0x43, 0x39, 0x81, 0x88, 0x02, 0x39, + 0x81, 0x72, 0x43, 0x39, 0x81, 0x8c, 0x02, 0x39, 0x81, 0xd2, 0x4d, 0xbc, + 0x80, 0x12, 0x4e, 0xbc, 0x81, 0x80, 0x14, 0x2d, 0x81, 0x52, 0x4e, 0x78, + 0x81, 0x58, 0x01, 0x79, 0x81, 0x5e, 0x44, 0x39, 0x81, 0xb8, 0x02, 0x39, + 0x81, 0x62, 0x44, 0x39, 0x81, 0xbc, 0x02, 0x39, 0x02, 0xb0, 0x51, 0xbc, + 0x01, 0xf0, 0x51, 0xbc, 0x00, 0x30, 0x52, 0xbc, 0x02, 0x90, 0x51, 0x78, + 0x01, 0x70, 0x52, 0xb8, 0x00, 0xb0, 0x52, 0x78, 0xf9, 0x6b, 0x44, 0xa9, + 0x82, 0x60, 0x01, 0x79, 0x82, 0x20, 0x0b, 0xbc, 0x81, 0x60, 0x0b, 0xbc, + 0x80, 0xa0, 0x0b, 0xbc, 0x81, 0xe0, 0x0b, 0xb8, 0x80, 0x84, 0x01, 0x79, + 0x61, 0xff, 0xff, 0x17, 0x3f, 0x18, 0x00, 0x71, 0x20, 0x29, 0x00, 0x54, + 0x3f, 0x20, 0x00, 0x71, 0x41, 0x16, 0x00, 0x54, 0xf4, 0x01, 0x00, 0x35, + 0xe0, 0x03, 0x1a, 0x2a, 0xe2, 0x02, 0x00, 0xb0, 0x42, 0x20, 0x00, 0x91, + 0x84, 0x03, 0x80, 0xd2, 0x61, 0x1a, 0x00, 0x91, 0x18, 0x00, 0x80, 0x52, + 0xf9, 0x6b, 0x44, 0xa9, 0x00, 0x08, 0x04, 0x9b, 0x02, 0x0c, 0x40, 0xa9, + 0x22, 0x0c, 0x00, 0xa9, 0x00, 0xe0, 0x40, 0xf8, 0x60, 0x42, 0x01, 0xf8, + 0xa4, 0x02, 0x00, 0xb9, 0x4e, 0xff, 0xff, 0x17, 0xf4, 0x03, 0x1a, 0x2a, + 0xe0, 0x07, 0x00, 0x90, 0x02, 0x40, 0x1c, 0x91, 0xa1, 0x0e, 0x00, 0xd0, + 0x24, 0x20, 0x0d, 0x91, 0x00, 0x04, 0x96, 0xd2, 0x20, 0x00, 0xa0, 0xf2, + 0xa3, 0x0e, 0x00, 0xd0, 0x63, 0xc0, 0x32, 0x91, 0xa1, 0x25, 0x80, 0xd2, + 0x07, 0xa5, 0x80, 0xd2, 0x80, 0x0a, 0x00, 0x9b, 0x81, 0x12, 0x01, 0x9b, + 0xe2, 0x02, 0x00, 0xb0, 0x42, 0xc0, 0x16, 0x91, 0x87, 0x0e, 0x07, 0x9b, + 0x00, 0x08, 0x40, 0x91, 0x04, 0x03, 0x80, 0x52, 0x65, 0x02, 0x40, 0x39, + 0x44, 0x0b, 0xa4, 0x9b, 0x23, 0x28, 0x42, 0x39, 0x22, 0x60, 0x42, 0x39, + 0x66, 0x06, 0x40, 0x39, 0x00, 0x9c, 0x67, 0x39, 0xe1, 0xd0, 0x44, 0x39, + 0xf2, 0xfc, 0xff, 0x97, 0xf8, 0x03, 0x00, 0x2a, 0xe0, 0xec, 0xff, 0x35, + 0xf9, 0x02, 0x00, 0xb0, 0x39, 0x23, 0x00, 0x91, 0x80, 0x03, 0x80, 0xd2, + 0x62, 0x0e, 0x40, 0xa9, 0x80, 0x66, 0x00, 0x9b, 0x02, 0x0c, 0x00, 0xa9, + 0x61, 0xe2, 0x40, 0xf8, 0x01, 0xe0, 0x00, 0xf8, 0x61, 0x06, 0x40, 0x39, + 0x3f, 0x00, 0x00, 0x71, 0xe2, 0x07, 0x9f, 0x1a, 0x02, 0x68, 0x00, 0x39, + 0x81, 0x00, 0x00, 0x34, 0x60, 0x02, 0x40, 0x39, 0x1f, 0x00, 0x00, 0x71, + 0xe1, 0x07, 0x9f, 0x1a, 0x82, 0x03, 0x80, 0xd2, 0xe0, 0x03, 0x1a, 0x2a, + 0x94, 0x66, 0x02, 0x9b, 0x81, 0x5a, 0x00, 0x39, 0x62, 0x02, 0x40, 0x39, + 0x61, 0x06, 0x40, 0x39, 0x5f, 0x00, 0x00, 0x71, 0x63, 0x22, 0x40, 0xb8, + 0xe2, 0x07, 0x9f, 0x1a, 0x3f, 0x00, 0x00, 0x71, 0xe1, 0x07, 0x9f, 0x1a, + 0x5c, 0xfa, 0xff, 0x97, 0xf8, 0x03, 0x00, 0x2a, 0xf9, 0x6b, 0x44, 0xa9, + 0x13, 0xff, 0xff, 0x17, 0xf4, 0x03, 0x1a, 0x2a, 0xfb, 0x73, 0x05, 0xa9, + 0xe1, 0x07, 0x00, 0x90, 0x3b, 0x40, 0x1c, 0x91, 0x16, 0x04, 0x96, 0xd2, + 0x36, 0x00, 0xa0, 0xf2, 0x81, 0x03, 0x80, 0x52, 0xb7, 0x0e, 0x00, 0xd0, + 0xf7, 0xc2, 0x32, 0x91, 0x07, 0xa5, 0x80, 0xd2, 0x41, 0x7f, 0xa1, 0x9b, + 0x80, 0x6e, 0x16, 0x9b, 0xf9, 0x02, 0x00, 0xb0, 0x39, 0x23, 0x00, 0x91, + 0x87, 0x5e, 0x07, 0x9b, 0x26, 0x03, 0x01, 0x8b, 0x00, 0x08, 0x40, 0x91, + 0xe2, 0x02, 0x00, 0xb0, 0x42, 0xc0, 0x16, 0x91, 0x04, 0x03, 0x80, 0x52, + 0x25, 0x6b, 0x61, 0x38, 0x00, 0x9c, 0x67, 0x39, 0x44, 0x0b, 0xa4, 0x9b, + 0x63, 0x12, 0x42, 0x39, 0xc6, 0x04, 0x40, 0x39, 0x62, 0x42, 0x42, 0x39, + 0xe1, 0xd0, 0x44, 0x39, 0xb5, 0xfc, 0xff, 0x97, 0xf8, 0x03, 0x00, 0x2a, + 0x80, 0x50, 0x00, 0x35, 0x78, 0x26, 0x42, 0x39, 0x41, 0x7f, 0xb6, 0x9b, + 0x00, 0x00, 0x80, 0x52, 0x04, 0x81, 0x8d, 0xd2, 0x1f, 0x03, 0x00, 0x71, + 0x21, 0x00, 0x1b, 0x8b, 0xe3, 0x17, 0x9f, 0x1a, 0x03, 0x00, 0x00, 0x14, + 0x1f, 0x10, 0x00, 0x71, 0xe0, 0x56, 0x00, 0x54, 0x22, 0x00, 0x40, 0x79, + 0x00, 0x04, 0x00, 0x11, 0x00, 0x1c, 0x00, 0x12, 0x21, 0x00, 0x04, 0x8b, + 0x5f, 0xfc, 0x03, 0x71, 0x64, 0x88, 0x40, 0x7a, 0x00, 0xff, 0xff, 0x54, + 0x98, 0x2f, 0x9c, 0x52, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xe0, 0xfe, 0xff, 0x17, 0xe2, 0x03, 0x1a, 0x2a, 0xa0, 0x0e, 0x00, 0xd0, + 0x01, 0xc0, 0x32, 0x91, 0x23, 0x28, 0x80, 0xd2, 0x00, 0xa5, 0x80, 0xd2, + 0x18, 0x00, 0x80, 0x52, 0x42, 0x04, 0x00, 0x9b, 0x40, 0x0f, 0xa0, 0x9b, + 0x00, 0x00, 0x01, 0x8b, 0x5f, 0x00, 0x05, 0x39, 0x1f, 0x7c, 0x00, 0xa9, + 0x1f, 0x10, 0x00, 0xb9, 0xf9, 0x6b, 0x44, 0xa9, 0xd2, 0xfe, 0xff, 0x17, + 0xf4, 0x03, 0x1a, 0x2a, 0xb7, 0x0e, 0x00, 0xd0, 0xf7, 0xc2, 0x32, 0x91, + 0x01, 0xa5, 0x80, 0xd2, 0x22, 0x28, 0x80, 0xd2, 0x04, 0x48, 0x88, 0x52, + 0xe4, 0x01, 0xa0, 0x72, 0x80, 0x5e, 0x01, 0x9b, 0x5a, 0x0b, 0xa1, 0x9b, + 0xe1, 0x02, 0x1a, 0x8b, 0x1f, 0x90, 0x05, 0x39, 0x62, 0x0e, 0x40, 0xa9, + 0x22, 0x0c, 0x00, 0xa9, 0x62, 0x12, 0x40, 0xb9, 0x22, 0x10, 0x00, 0xb9, + 0x02, 0x34, 0x40, 0xf9, 0xe3, 0x6a, 0x7a, 0xf8, 0x43, 0x40, 0x01, 0xf8, + 0x21, 0x08, 0x40, 0xb9, 0x41, 0x1c, 0x00, 0xb9, 0x02, 0x34, 0x40, 0xf9, + 0x03, 0x04, 0x40, 0xb9, 0x41, 0x88, 0x42, 0x29, 0x01, 0x38, 0x01, 0xb9, + 0x7f, 0x00, 0x04, 0x6b, 0x49, 0x00, 0x00, 0x54, 0x42, 0x00, 0x02, 0x0b, + 0x00, 0xa5, 0x80, 0xd2, 0x21, 0x00, 0x02, 0x0b, 0x23, 0x00, 0x80, 0x52, + 0x22, 0x00, 0x80, 0x52, 0x94, 0x5e, 0x00, 0x9b, 0x18, 0x00, 0x80, 0x52, + 0xf9, 0x6b, 0x44, 0xa9, 0x81, 0x3e, 0x01, 0xb9, 0x83, 0x02, 0x05, 0x39, + 0x82, 0x62, 0x01, 0xb9, 0xac, 0xfe, 0xff, 0x17, 0xf8, 0x01, 0x9c, 0x52, + 0xf9, 0x6b, 0x44, 0xa9, 0xa9, 0xfe, 0xff, 0x17, 0xd8, 0x01, 0x9c, 0x52, + 0xf9, 0x6b, 0x44, 0xa9, 0xa6, 0xfe, 0xff, 0x17, 0x54, 0x2a, 0x00, 0x34, + 0xe0, 0x03, 0x1a, 0x2a, 0xe1, 0x02, 0x00, 0xb0, 0x21, 0x20, 0x06, 0x91, + 0xa3, 0x0b, 0x80, 0xd2, 0x62, 0x02, 0x40, 0xb9, 0x18, 0x00, 0x80, 0x52, + 0xf9, 0x6b, 0x44, 0xa9, 0x00, 0x04, 0x03, 0x9b, 0x02, 0x60, 0x00, 0xb8, + 0x9b, 0xfe, 0xff, 0x17, 0x76, 0x02, 0x40, 0x39, 0xdf, 0x0e, 0x00, 0x71, + 0x14, 0x21, 0x00, 0x34, 0x09, 0x1c, 0x00, 0x54, 0xdf, 0x22, 0x00, 0x71, + 0x48, 0x20, 0x00, 0x54, 0x67, 0x06, 0x40, 0x39, 0x07, 0x20, 0x00, 0x34, + 0xe6, 0x03, 0x1a, 0x2a, 0x80, 0x00, 0x83, 0xd2, 0x85, 0x02, 0x00, 0x90, + 0xa5, 0xa0, 0x3f, 0x91, 0x41, 0x7f, 0xa0, 0x9b, 0xe3, 0x04, 0x00, 0x51, + 0xc6, 0x7c, 0x00, 0x9b, 0x68, 0x96, 0x00, 0x91, 0x21, 0x00, 0x05, 0x8b, + 0x09, 0x03, 0x80, 0x52, 0xa2, 0x00, 0x06, 0x8b, 0x60, 0x36, 0x00, 0x91, + 0x63, 0x20, 0xa9, 0x9b, 0xa7, 0x68, 0x26, 0x38, 0x65, 0x0a, 0x40, 0x39, + 0x45, 0x04, 0x00, 0x39, 0x65, 0x0e, 0x40, 0x39, 0x45, 0x08, 0x00, 0x39, + 0x65, 0x12, 0x40, 0x39, 0x45, 0x0c, 0x00, 0x39, 0x61, 0x52, 0x40, 0xbc, + 0x60, 0x92, 0x40, 0xbc, 0x41, 0x80, 0x00, 0x2d, 0x02, 0x00, 0x40, 0x39, + 0x22, 0x30, 0x00, 0x39, 0x21, 0x60, 0x00, 0x91, 0x02, 0x10, 0xc0, 0x78, + 0x22, 0x50, 0x1f, 0x78, 0x02, 0x30, 0xc0, 0x78, 0x22, 0x70, 0x1f, 0x78, + 0x02, 0x14, 0x40, 0x39, 0x22, 0x90, 0x1f, 0x38, 0x02, 0x18, 0x40, 0x39, + 0x22, 0xa0, 0x1f, 0x38, 0x02, 0x1c, 0x40, 0x39, 0x22, 0xb0, 0x1f, 0x38, + 0x01, 0x80, 0x40, 0x6d, 0x00, 0x60, 0x00, 0x91, 0x7f, 0x00, 0x00, 0xeb, + 0x21, 0xc0, 0x1f, 0xfc, 0x20, 0x40, 0x00, 0xfc, 0xc1, 0xfd, 0xff, 0x54, + 0x18, 0x00, 0x80, 0x52, 0xf9, 0x6b, 0x44, 0xa9, 0x66, 0xfe, 0xff, 0x17, + 0x34, 0x2b, 0x00, 0x35, 0x60, 0x03, 0x80, 0x52, 0xa0, 0x02, 0x00, 0xb9, + 0xff, 0x02, 0x00, 0x6b, 0x29, 0xf7, 0xff, 0x54, 0x05, 0x03, 0x80, 0xd2, + 0xe6, 0x02, 0x00, 0xb0, 0xc6, 0xc0, 0x16, 0x91, 0x43, 0xf3, 0x7d, 0xd3, + 0x45, 0x7f, 0x05, 0x9b, 0x63, 0x00, 0x1a, 0xcb, 0xa4, 0x0e, 0x00, 0x90, + 0x84, 0x40, 0x30, 0x91, 0xc1, 0x00, 0x05, 0x8b, 0x82, 0x00, 0x03, 0x8b, + 0x18, 0x00, 0x80, 0x52, 0x27, 0x50, 0x40, 0x39, 0x67, 0x1a, 0x00, 0x39, + 0x28, 0x0c, 0x40, 0xb9, 0xc7, 0x68, 0x65, 0xb8, 0x26, 0x94, 0x40, 0x29, + 0x68, 0x4e, 0x00, 0x39, 0x21, 0x10, 0x40, 0xb9, 0x61, 0x52, 0x00, 0x39, + 0x81, 0x68, 0x63, 0x38, 0x61, 0x56, 0x00, 0x39, 0x43, 0x18, 0x40, 0x39, + 0x41, 0x10, 0x40, 0x78, 0x63, 0x62, 0x00, 0x39, 0x61, 0x2e, 0x00, 0x79, + 0x41, 0x14, 0x40, 0x39, 0x61, 0x66, 0x00, 0x39, 0x41, 0x0c, 0x40, 0x39, + 0x61, 0x6a, 0x00, 0x39, 0xf9, 0x6b, 0x44, 0xa9, 0x67, 0x72, 0x00, 0xb8, + 0x66, 0xb2, 0x00, 0xb8, 0x65, 0xf2, 0x00, 0xb8, 0x3f, 0xfe, 0xff, 0x17, + 0xf4, 0x0b, 0x00, 0x34, 0xf4, 0x03, 0x1a, 0x2a, 0x81, 0x02, 0x80, 0xd2, + 0xe3, 0x02, 0x00, 0xb0, 0x63, 0xa0, 0x03, 0x91, 0x66, 0x46, 0x40, 0x39, + 0xe4, 0x03, 0x13, 0xaa, 0x87, 0x7e, 0x01, 0x9b, 0x20, 0x00, 0x80, 0xd2, + 0x41, 0x7f, 0xa1, 0x9b, 0xe9, 0x03, 0x00, 0x2a, 0x65, 0x00, 0x07, 0x8b, + 0x62, 0x00, 0x01, 0x8b, 0xe8, 0x03, 0x05, 0xaa, 0xa6, 0x08, 0x00, 0x39, + 0x81, 0xd4, 0x5f, 0x38, 0x61, 0x68, 0x27, 0x38, 0xbf, 0x0c, 0x00, 0x39, + 0x81, 0x78, 0x60, 0xb8, 0x41, 0x78, 0x20, 0xb8, 0x00, 0x04, 0x00, 0x91, + 0x1f, 0x14, 0x00, 0xf1, 0x41, 0x00, 0x00, 0x34, 0x09, 0x0d, 0x00, 0x39, + 0x41, 0xff, 0xff, 0x54, 0x80, 0x02, 0x80, 0xd2, 0x94, 0x0e, 0x00, 0x9b, + 0x80, 0x06, 0x40, 0x39, 0x1f, 0x00, 0x00, 0x71, 0xc0, 0x18, 0x41, 0x7a, + 0x01, 0xf7, 0xff, 0x54, 0xa0, 0x0e, 0x00, 0xd0, 0x00, 0xc0, 0x32, 0x91, + 0x01, 0xa5, 0x80, 0x52, 0x18, 0x00, 0x80, 0x52, 0x40, 0x03, 0xa1, 0x9b, + 0x2c, 0xe2, 0xff, 0x97, 0x9f, 0x12, 0x00, 0x78, 0xf9, 0x6b, 0x44, 0xa9, + 0x17, 0xfe, 0xff, 0x17, 0x34, 0x1a, 0x00, 0x35, 0xff, 0x76, 0x01, 0x71, + 0x89, 0xed, 0xff, 0x54, 0xa0, 0x0e, 0x00, 0xb0, 0x00, 0x20, 0x39, 0x91, + 0x01, 0x0b, 0x80, 0x52, 0xc2, 0x0b, 0x80, 0x52, 0xa2, 0x02, 0x00, 0xb9, + 0xe3, 0x03, 0x01, 0x2a, 0x40, 0x03, 0xa1, 0x9b, 0x64, 0x1a, 0x00, 0x91, + 0x02, 0x00, 0x80, 0x52, 0xfc, 0x1c, 0xff, 0x97, 0xf8, 0x03, 0x00, 0x2a, + 0xf9, 0x6b, 0x44, 0xa9, 0x07, 0xfe, 0xff, 0x17, 0x3f, 0x2f, 0x00, 0x71, + 0x98, 0x01, 0x9c, 0x52, 0x29, 0xc7, 0xff, 0x54, 0xf4, 0x03, 0x1a, 0x2a, + 0xb7, 0x0e, 0x00, 0xd0, 0xf7, 0xc2, 0x32, 0x91, 0x00, 0xa5, 0x80, 0xd2, + 0x21, 0x28, 0x80, 0xd2, 0x03, 0x48, 0x88, 0x52, 0xe3, 0x01, 0xa0, 0x72, + 0x82, 0x5e, 0x00, 0x9b, 0x40, 0x07, 0xa0, 0x9b, 0xe0, 0x02, 0x00, 0x8b, + 0x5f, 0x00, 0x05, 0x39, 0x1f, 0x7c, 0x00, 0xa9, 0x1f, 0x10, 0x00, 0xb9, + 0x40, 0x34, 0x40, 0xf9, 0x61, 0x02, 0x40, 0xf9, 0x01, 0x40, 0x01, 0xf8, + 0x61, 0x0a, 0x40, 0xb9, 0x01, 0x1c, 0x00, 0xb9, 0x61, 0x02, 0x40, 0xb9, + 0x40, 0x04, 0x40, 0xb9, 0x41, 0x38, 0x01, 0xb9, 0x1f, 0x00, 0x03, 0x6b, + 0x62, 0x06, 0x40, 0xb9, 0x49, 0x00, 0x00, 0x54, 0x42, 0x00, 0x02, 0x0b, + 0x00, 0xa5, 0x80, 0xd2, 0x21, 0x00, 0x02, 0x0b, 0x23, 0x00, 0x80, 0x52, + 0x22, 0x00, 0x80, 0x52, 0x94, 0x5e, 0x00, 0x9b, 0x18, 0x00, 0x80, 0x52, + 0xf9, 0x6b, 0x44, 0xa9, 0x81, 0x3e, 0x01, 0xb9, 0x83, 0x62, 0x01, 0xb9, + 0x82, 0x92, 0x05, 0x39, 0xe0, 0xfd, 0xff, 0x17, 0x00, 0x09, 0x80, 0x52, + 0xa0, 0x02, 0x00, 0xb9, 0xff, 0x1e, 0x01, 0x71, 0x18, 0x25, 0x9c, 0x52, + 0x09, 0xc2, 0xff, 0x54, 0xe1, 0x02, 0x00, 0xb0, 0x22, 0xa0, 0x03, 0x91, + 0xf4, 0x03, 0x1a, 0x2a, 0x81, 0x02, 0x80, 0xd2, 0x64, 0x1a, 0x00, 0x91, + 0x81, 0x0a, 0x01, 0x9b, 0x21, 0x04, 0x40, 0x39, 0x61, 0x1a, 0x00, 0x39, + 0x9f, 0x04, 0x00, 0x39, 0x3f, 0x04, 0x00, 0x71, 0x7f, 0xfe, 0x00, 0xa9, + 0x7f, 0xfe, 0x01, 0xa9, 0x7f, 0xfe, 0x02, 0xa9, 0x7f, 0xfe, 0x03, 0xa9, + 0x81, 0xec, 0xff, 0x54, 0xb7, 0x0e, 0x00, 0xd0, 0xf7, 0xc2, 0x32, 0x91, + 0x00, 0xa5, 0x80, 0xd2, 0x80, 0x5e, 0x00, 0x9b, 0x05, 0x28, 0x41, 0xb9, + 0x85, 0x04, 0x00, 0x39, 0xa5, 0xeb, 0xff, 0x34, 0xa1, 0x14, 0x80, 0xd2, + 0x00, 0x00, 0x80, 0x52, 0x94, 0x7e, 0x01, 0x9b, 0x81, 0x22, 0x20, 0x8b, + 0x83, 0x2c, 0x20, 0x8b, 0x02, 0x04, 0x00, 0x11, 0xe1, 0x0e, 0x01, 0x8b, + 0x40, 0x3c, 0x00, 0x12, 0xbf, 0x20, 0x22, 0x6b, 0x21, 0x2c, 0x41, 0xf9, + 0x61, 0x20, 0x00, 0xf8, 0x08, 0xff, 0xff, 0x54, 0x50, 0xff, 0xff, 0x17, + 0xf9, 0x03, 0x1a, 0x2a, 0x81, 0x03, 0x80, 0x52, 0xa0, 0x0e, 0x00, 0xd0, + 0x00, 0x20, 0x0d, 0x91, 0xb7, 0x0e, 0x00, 0xd0, 0xf7, 0xc2, 0x32, 0x91, + 0x07, 0xa5, 0x80, 0xd2, 0xfb, 0x73, 0x05, 0xa9, 0xbb, 0x25, 0x80, 0xd2, + 0x41, 0x7f, 0xa1, 0x9b, 0xe2, 0x02, 0x00, 0xb0, 0x42, 0x20, 0x00, 0x91, + 0x3b, 0x03, 0x1b, 0x9b, 0x27, 0x5f, 0x07, 0x9b, 0x46, 0x00, 0x01, 0x8b, + 0xe4, 0x02, 0x00, 0xb0, 0x84, 0xc0, 0x16, 0x91, 0x05, 0x03, 0x80, 0x52, + 0x60, 0x1e, 0x40, 0x39, 0x63, 0x2b, 0x42, 0x39, 0x74, 0x06, 0x00, 0x91, + 0x44, 0x13, 0xa5, 0x9b, 0xc6, 0x04, 0x40, 0x39, 0x45, 0x68, 0x61, 0x38, + 0x62, 0x63, 0x42, 0x39, 0xe1, 0xd0, 0x44, 0x39, 0x5b, 0xfb, 0xff, 0x97, + 0xf8, 0x03, 0x00, 0x2a, 0x40, 0x25, 0x00, 0x35, 0x65, 0x12, 0x40, 0x78, + 0x60, 0x47, 0x42, 0x39, 0xbf, 0xfc, 0x03, 0x71, 0x00, 0x88, 0x40, 0x7a, + 0x60, 0xd6, 0xff, 0x54, 0xe5, 0x24, 0x00, 0x35, 0xfb, 0x73, 0x45, 0xa9, + 0x18, 0x02, 0x9c, 0x52, 0xf9, 0x6b, 0x44, 0xa9, 0x91, 0xfd, 0xff, 0x17, + 0x48, 0x1d, 0x00, 0x54, 0xe0, 0x3b, 0x85, 0x52, 0xff, 0x02, 0x00, 0x6b, + 0xa9, 0xdc, 0xff, 0x54, 0xe2, 0x03, 0x1a, 0x2a, 0xc1, 0x7e, 0x40, 0x93, + 0x00, 0x04, 0x96, 0xd2, 0x20, 0x00, 0xa0, 0xf2, 0x07, 0x81, 0x8d, 0xd2, + 0xe5, 0x07, 0x00, 0x90, 0xa5, 0x40, 0x1c, 0x91, 0x42, 0x7c, 0x00, 0x9b, + 0x21, 0x08, 0x07, 0x9b, 0xc3, 0x3c, 0x85, 0x52, 0xa4, 0x00, 0x01, 0x8b, + 0xa1, 0x68, 0x61, 0x78, 0xa3, 0x02, 0x00, 0xb9, 0x81, 0xfd, 0xff, 0x34, + 0x61, 0x0e, 0x00, 0x79, 0x22, 0x04, 0x00, 0x51, 0xc6, 0x1e, 0x40, 0x92, + 0x68, 0x96, 0x00, 0x91, 0x81, 0x08, 0x40, 0x39, 0xa9, 0x02, 0x80, 0x52, + 0x61, 0x22, 0x00, 0x39, 0x61, 0x42, 0x00, 0x91, 0xc6, 0x7c, 0x07, 0x9b, + 0x87, 0x0c, 0x40, 0x39, 0x40, 0x1b, 0xa0, 0x9b, 0x67, 0x26, 0x00, 0x39, + 0x42, 0x20, 0xa9, 0x9b, 0x00, 0x00, 0x05, 0x8b, 0x85, 0x10, 0x40, 0x39, + 0x65, 0x2a, 0x00, 0x39, 0x85, 0x14, 0x40, 0x39, 0x65, 0x2e, 0x00, 0x39, + 0x85, 0x18, 0x40, 0x39, 0x65, 0x32, 0x00, 0x39, 0x85, 0x1c, 0x40, 0x39, + 0x65, 0x36, 0x00, 0x39, 0x85, 0x20, 0x40, 0x39, 0x65, 0x3a, 0x00, 0x39, + 0x84, 0x24, 0x40, 0x39, 0x64, 0x3e, 0x00, 0x39, 0x03, 0x28, 0xc0, 0x39, + 0x21, 0x54, 0x00, 0x91, 0x23, 0xb0, 0x1e, 0x38, 0x00, 0x54, 0x00, 0x91, + 0x03, 0x60, 0xdf, 0x38, 0x23, 0xc0, 0x1e, 0x38, 0x03, 0x70, 0x5f, 0x38, + 0x23, 0xd0, 0x1e, 0x38, 0x00, 0xa0, 0x5f, 0xfc, 0x03, 0x80, 0x5f, 0x78, + 0x23, 0xe0, 0x1e, 0x78, 0x20, 0x00, 0x1f, 0xfc, 0x00, 0x20, 0x40, 0xfc, + 0x20, 0x80, 0x1f, 0xfc, 0x3f, 0x00, 0x02, 0xeb, 0x21, 0xfe, 0xff, 0x54, + 0xec, 0xfe, 0xff, 0x17, 0xff, 0x0e, 0x00, 0x71, 0x49, 0xd5, 0xff, 0x54, + 0xe0, 0x03, 0x1a, 0x2a, 0xe1, 0x02, 0x00, 0xb0, 0x21, 0x20, 0x06, 0x91, + 0xa2, 0x0b, 0x80, 0xd2, 0x43, 0x01, 0x80, 0x52, 0x18, 0x00, 0x80, 0x52, + 0xf9, 0x6b, 0x44, 0xa9, 0x00, 0x04, 0x02, 0x9b, 0xa3, 0x02, 0x00, 0xb9, + 0x00, 0x60, 0x40, 0xb8, 0x60, 0x62, 0x00, 0xb8, 0x46, 0xfd, 0xff, 0x17, + 0xe0, 0x03, 0x1a, 0x2a, 0xe2, 0x07, 0x00, 0x90, 0x43, 0x40, 0x1c, 0x91, + 0xa1, 0x0e, 0x00, 0xd0, 0x21, 0x20, 0x0d, 0x91, 0x02, 0x04, 0x96, 0xd2, + 0x22, 0x00, 0xa0, 0xf2, 0xb7, 0x0e, 0x00, 0xd0, 0xf7, 0xc2, 0x32, 0x91, + 0x85, 0x03, 0x80, 0x52, 0x04, 0xa5, 0x80, 0xd2, 0xa7, 0x25, 0x80, 0xd2, + 0x02, 0x0c, 0x02, 0x9b, 0xe6, 0x02, 0x00, 0xb0, 0xc6, 0x20, 0x00, 0x91, + 0x45, 0x7f, 0xa5, 0x9b, 0x07, 0x04, 0x07, 0x9b, 0x01, 0x5c, 0x04, 0x9b, + 0xc8, 0x00, 0x05, 0x8b, 0x40, 0x08, 0x40, 0x91, 0xe2, 0x02, 0x00, 0xb0, + 0x42, 0xc0, 0x16, 0x91, 0x04, 0x03, 0x80, 0x52, 0xc5, 0x68, 0x65, 0x38, + 0x00, 0x9c, 0x67, 0x39, 0x44, 0x0b, 0xa4, 0x9b, 0xe3, 0x28, 0x42, 0x39, + 0x06, 0x05, 0x40, 0x39, 0xe2, 0x60, 0x42, 0x39, 0x21, 0xd0, 0x44, 0x39, + 0xe5, 0xfa, 0xff, 0x97, 0xf8, 0x03, 0x00, 0x2a, 0x40, 0xab, 0xff, 0x35, + 0xa0, 0x0e, 0x00, 0xb0, 0x00, 0x20, 0x39, 0x91, 0x01, 0x0b, 0x80, 0x52, + 0xe3, 0x03, 0x19, 0x2a, 0xe4, 0x03, 0x13, 0xaa, 0x02, 0x00, 0x80, 0x52, + 0x40, 0x03, 0xa1, 0x9b, 0x27, 0x1c, 0xff, 0x97, 0xf8, 0x03, 0x00, 0x2a, + 0x00, 0xaa, 0xff, 0x35, 0x00, 0xa5, 0x80, 0x52, 0x40, 0x5f, 0xa0, 0x9b, + 0x9a, 0xfa, 0xff, 0x97, 0xa1, 0x0e, 0x00, 0xd0, 0x21, 0x20, 0x04, 0x91, + 0x00, 0x09, 0x80, 0x52, 0x5a, 0x07, 0xa0, 0x9b, 0x5f, 0x7f, 0x00, 0xa9, + 0x5f, 0x7f, 0x01, 0xa9, 0x5f, 0x7f, 0x02, 0xa9, 0x5f, 0x7f, 0x03, 0xa9, + 0x5f, 0x23, 0x00, 0xf9, 0xf9, 0x6b, 0x44, 0xa9, 0x0d, 0xfd, 0xff, 0x17, + 0xf4, 0x03, 0x1a, 0x2a, 0xe0, 0x07, 0x00, 0x90, 0x03, 0x40, 0x1c, 0x91, + 0xa1, 0x0e, 0x00, 0xd0, 0x25, 0x20, 0x0d, 0x91, 0x00, 0x04, 0x96, 0xd2, + 0x20, 0x00, 0xa0, 0xf2, 0xa4, 0x0e, 0x00, 0xd0, 0x84, 0xc0, 0x32, 0x91, + 0x82, 0x03, 0x80, 0x52, 0xa1, 0x25, 0x80, 0xd2, 0x07, 0xa5, 0x80, 0xd2, + 0x42, 0x7f, 0xa2, 0x9b, 0x68, 0x02, 0x40, 0x39, 0x80, 0x0e, 0x00, 0x9b, + 0xe3, 0x02, 0x00, 0xb0, 0x63, 0x20, 0x00, 0x91, 0x81, 0x16, 0x01, 0x9b, + 0x87, 0x12, 0x07, 0x9b, 0x66, 0x00, 0x02, 0x8b, 0x00, 0x08, 0x40, 0x91, + 0x69, 0x36, 0x40, 0x39, 0x6a, 0x12, 0x40, 0xf8, 0x1f, 0x01, 0x00, 0x71, + 0x65, 0x68, 0x62, 0x38, 0xe8, 0x07, 0x9f, 0x1a, 0x23, 0x28, 0x42, 0x39, + 0xe4, 0xe3, 0x01, 0x91, 0x22, 0x60, 0x42, 0x39, 0x00, 0x9c, 0x67, 0x39, + 0xe1, 0xd0, 0x44, 0x39, 0xc6, 0x04, 0x40, 0x39, 0x67, 0x3a, 0x40, 0x39, + 0xea, 0x3f, 0x00, 0xf9, 0x6a, 0x92, 0x40, 0xb8, 0xea, 0x83, 0x00, 0xb9, + 0xe9, 0x9f, 0x10, 0x29, 0xe8, 0x33, 0x02, 0x39, 0xa4, 0xfa, 0xff, 0x97, + 0xf8, 0x03, 0x00, 0x2a, 0x20, 0xa3, 0xff, 0x35, 0xf9, 0x02, 0x00, 0xb0, + 0x39, 0xc3, 0x16, 0x91, 0x03, 0x03, 0x80, 0xd2, 0x82, 0xf2, 0x7d, 0xd3, + 0xe0, 0x87, 0x47, 0xa9, 0x83, 0x66, 0x03, 0x9b, 0x42, 0x00, 0x14, 0xcb, + 0xb7, 0x0e, 0x00, 0x90, 0xf7, 0x42, 0x30, 0x91, 0xfb, 0x73, 0x05, 0xa9, + 0xfb, 0x02, 0x02, 0x8b, 0xe4, 0x47, 0x40, 0xf9, 0x60, 0x04, 0x00, 0xa9, + 0x61, 0x22, 0x40, 0x79, 0x64, 0x08, 0x00, 0xf9, 0xfc, 0x00, 0x80, 0x52, + 0xd6, 0x1e, 0x00, 0x12, 0x60, 0x3e, 0x40, 0x39, 0x5c, 0x5f, 0xbc, 0x9b, + 0xe0, 0x6a, 0x22, 0x38, 0xe0, 0x03, 0x16, 0x2a, 0x61, 0x13, 0x00, 0x78, + 0xe1, 0x03, 0x1c, 0xaa, 0x62, 0x4a, 0x40, 0x39, 0x62, 0x1b, 0x00, 0x39, + 0x62, 0x4e, 0x40, 0x39, 0x62, 0x17, 0x00, 0x39, 0x62, 0x52, 0x40, 0x39, + 0x62, 0x0f, 0x00, 0x39, 0x58, 0x70, 0xff, 0x97, 0xf8, 0x03, 0x00, 0x2a, + 0x60, 0x0a, 0x00, 0x35, 0x61, 0x1b, 0x40, 0x39, 0xe0, 0x03, 0x16, 0x2a, + 0x3f, 0x00, 0x00, 0x71, 0xe1, 0x07, 0x9f, 0x1a, 0x45, 0x71, 0xff, 0x97, + 0xf8, 0x03, 0x00, 0x2a, 0x80, 0x09, 0x00, 0x35, 0xe1, 0x03, 0x1c, 0xaa, + 0xe0, 0x03, 0x16, 0x2a, 0xcc, 0x70, 0xff, 0x97, 0xf8, 0x03, 0x00, 0x2a, + 0xe0, 0x08, 0x00, 0x35, 0xf7, 0x0e, 0x14, 0x8b, 0xe0, 0x03, 0x16, 0x2a, + 0xf4, 0x02, 0x14, 0xcb, 0x81, 0x1a, 0x40, 0x39, 0x3f, 0x00, 0x00, 0x71, + 0xe1, 0x07, 0x9f, 0x1a, 0x5b, 0x71, 0xff, 0x97, 0xf8, 0x03, 0x00, 0x2a, + 0xc0, 0x07, 0x00, 0x35, 0x01, 0x03, 0x80, 0x52, 0xe0, 0x03, 0x1a, 0x2a, + 0x41, 0x67, 0xa1, 0x9b, 0x3d, 0xf7, 0xff, 0x97, 0xf8, 0x03, 0x00, 0x2a, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0xa7, 0xfc, 0xff, 0x17, + 0xdf, 0x22, 0x00, 0x71, 0x48, 0xe2, 0xff, 0x54, 0x60, 0xfe, 0x82, 0x52, + 0xff, 0x02, 0x00, 0x6b, 0x49, 0xbf, 0xff, 0x54, 0xe1, 0x03, 0x1a, 0x2a, + 0x80, 0x00, 0x83, 0xd2, 0x85, 0x02, 0x00, 0x90, 0xa5, 0xa0, 0x3f, 0x91, + 0x42, 0xff, 0x82, 0x52, 0xa2, 0x02, 0x00, 0xb9, 0x21, 0x7c, 0x00, 0x9b, + 0xa4, 0x00, 0x01, 0x8b, 0xa1, 0x68, 0x61, 0x38, 0xa1, 0xe0, 0xff, 0x34, + 0x61, 0x1a, 0x00, 0x39, 0x62, 0xaa, 0x00, 0x91, 0x21, 0x04, 0x00, 0x51, + 0x06, 0x03, 0x80, 0x52, 0x87, 0x04, 0x40, 0x39, 0x40, 0x7f, 0xa0, 0x9b, + 0x67, 0x1e, 0x00, 0x39, 0x22, 0x08, 0xa6, 0x9b, 0x00, 0x00, 0x05, 0x8b, + 0x86, 0x08, 0x40, 0x39, 0x61, 0x4a, 0x00, 0x91, 0x66, 0x22, 0x00, 0x39, + 0x85, 0x0c, 0x40, 0x39, 0x65, 0x26, 0x00, 0x39, 0x81, 0x80, 0x40, 0x2d, + 0x61, 0xa2, 0x00, 0xbc, 0x60, 0xe2, 0x00, 0xbc, 0x03, 0x30, 0x40, 0x39, + 0x21, 0x60, 0x00, 0x91, 0x23, 0x80, 0x1e, 0x38, 0x00, 0x60, 0x00, 0x91, + 0x03, 0x50, 0xdf, 0x78, 0x23, 0x90, 0x1e, 0x78, 0x03, 0x70, 0xdf, 0x78, + 0x23, 0xb0, 0x1e, 0x78, 0x03, 0x90, 0x5f, 0x38, 0x23, 0xd0, 0x1e, 0x38, + 0x03, 0xa0, 0x5f, 0x38, 0x23, 0xe0, 0x1e, 0x38, 0x03, 0xb0, 0x5f, 0x38, + 0x23, 0xf0, 0x1e, 0x38, 0x00, 0xc0, 0x5f, 0xfc, 0x20, 0x00, 0x1f, 0xfc, + 0x00, 0x40, 0x40, 0xfc, 0x20, 0x80, 0x1f, 0xfc, 0x3f, 0x00, 0x02, 0xeb, + 0xa1, 0xfd, 0xff, 0x54, 0x0a, 0xfe, 0xff, 0x17, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0x6f, 0xfc, 0xff, 0x17, 0xc2, 0x7e, 0x40, 0x93, + 0x00, 0x04, 0x96, 0xd2, 0x20, 0x00, 0xa0, 0xf2, 0x07, 0x81, 0x8d, 0xd2, + 0xe1, 0x07, 0x00, 0x90, 0x21, 0x40, 0x1c, 0x91, 0x39, 0x7f, 0x00, 0x9b, + 0xc6, 0x1e, 0x40, 0x92, 0x59, 0x64, 0x07, 0x9b, 0xa4, 0x04, 0x00, 0x51, + 0x68, 0x82, 0x00, 0x91, 0xa9, 0x02, 0x80, 0x52, 0x23, 0x00, 0x19, 0x8b, + 0xc6, 0x7c, 0x07, 0x9b, 0x40, 0x1b, 0xa0, 0x9b, 0x62, 0x2e, 0x00, 0x91, + 0x25, 0x68, 0x39, 0x78, 0x84, 0x20, 0xa9, 0x9b, 0x00, 0x00, 0x01, 0x8b, + 0x85, 0x0a, 0x40, 0x39, 0x65, 0x08, 0x00, 0x39, 0x81, 0x0e, 0x40, 0x39, + 0x61, 0x0c, 0x00, 0x39, 0x81, 0x12, 0x40, 0x39, 0x61, 0x10, 0x00, 0x39, + 0x85, 0x16, 0x40, 0x39, 0x65, 0x14, 0x00, 0x39, 0x85, 0x1a, 0x40, 0x39, + 0x65, 0x18, 0x00, 0x39, 0x85, 0x1e, 0x40, 0x39, 0x65, 0x1c, 0x00, 0x39, + 0x85, 0x22, 0x40, 0x39, 0x65, 0x20, 0x00, 0x39, 0x85, 0x26, 0x40, 0x39, + 0x65, 0x24, 0x00, 0x39, 0x43, 0x00, 0xc0, 0x39, 0x42, 0x54, 0x00, 0x91, + 0x03, 0x28, 0x00, 0x39, 0x00, 0x54, 0x00, 0x91, 0x43, 0xc0, 0xde, 0x38, + 0x03, 0x60, 0x1f, 0x38, 0x43, 0xd0, 0x5e, 0x38, 0x03, 0x70, 0x1f, 0x38, + 0x41, 0x00, 0x5f, 0xfc, 0x40, 0x80, 0x5f, 0xfc, 0x43, 0xe0, 0x5e, 0x78, + 0x9f, 0x00, 0x02, 0xeb, 0x03, 0x80, 0x1f, 0x78, 0x01, 0xa0, 0x1f, 0xfc, + 0x00, 0x20, 0x00, 0xfc, 0x21, 0xfe, 0xff, 0x54, 0x00, 0xa5, 0x80, 0x52, + 0x40, 0x5f, 0xa0, 0x9b, 0x5b, 0xdc, 0xff, 0x97, 0xf8, 0x03, 0x00, 0x2a, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0x35, 0xfc, 0xff, 0x17, + 0xa0, 0x25, 0x80, 0xd2, 0xa5, 0x0e, 0x00, 0xd0, 0xa5, 0x20, 0x0d, 0x91, + 0xe8, 0x27, 0x06, 0x6d, 0x86, 0x7e, 0x00, 0x9b, 0x64, 0x0a, 0x40, 0x39, + 0x83, 0x03, 0x80, 0xd2, 0xa1, 0x00, 0x06, 0x8b, 0x42, 0x7f, 0xa0, 0x9b, + 0x99, 0x66, 0x03, 0x9b, 0x63, 0x12, 0x00, 0x91, 0x42, 0x1c, 0x00, 0x91, + 0x00, 0x00, 0x80, 0xd2, 0x24, 0x08, 0x00, 0x39, 0xa2, 0x00, 0x02, 0x8b, + 0x64, 0x02, 0x40, 0x79, 0xa4, 0x68, 0x26, 0x78, 0x66, 0x0e, 0x40, 0x39, + 0x26, 0x0c, 0x00, 0x39, 0x24, 0x33, 0x00, 0x79, 0x64, 0x62, 0x49, 0xb8, + 0x24, 0x10, 0x0c, 0xb8, 0x64, 0x6e, 0x42, 0x39, 0x24, 0x4c, 0x03, 0x39, + 0x64, 0x6a, 0x42, 0x39, 0x24, 0x48, 0x03, 0x39, 0x64, 0x72, 0x42, 0x39, + 0x24, 0x50, 0x03, 0x39, 0x64, 0x7e, 0x42, 0x39, 0x24, 0x5c, 0x03, 0x39, + 0x64, 0x76, 0x42, 0x39, 0x24, 0x54, 0x03, 0x39, 0x64, 0x82, 0x42, 0x39, + 0x24, 0x60, 0x03, 0x39, 0x64, 0x7a, 0x42, 0x39, 0x24, 0x58, 0x03, 0x39, + 0x64, 0x86, 0x42, 0x39, 0x24, 0x64, 0x03, 0x39, 0x61, 0x68, 0xe0, 0x78, + 0x41, 0x68, 0x20, 0x78, 0x00, 0x08, 0x00, 0x91, 0x1f, 0x00, 0x02, 0xf1, + 0x81, 0xff, 0xff, 0x54, 0xb6, 0x25, 0x80, 0xd2, 0x60, 0x12, 0x42, 0x39, + 0x81, 0x00, 0x00, 0x90, 0x29, 0xf8, 0x41, 0xfd, 0x96, 0x16, 0x16, 0x9b, + 0x41, 0x00, 0x00, 0xf0, 0x28, 0x18, 0x44, 0xfd, 0x1c, 0xa5, 0x80, 0xd2, + 0xd9, 0x02, 0x08, 0x91, 0x94, 0x7e, 0x1c, 0x9b, 0xc0, 0x2a, 0x02, 0x39, + 0xfb, 0x02, 0x14, 0x8b, 0x60, 0x52, 0x48, 0xb8, 0xc0, 0xd2, 0x08, 0xb8, + 0x00, 0x00, 0x62, 0x1e, 0x00, 0x08, 0x69, 0x1e, 0x00, 0x08, 0x68, 0x1e, + 0x30, 0x1b, 0x00, 0x94, 0x60, 0xe2, 0x4b, 0xb8, 0x20, 0x73, 0x12, 0xb8, + 0x01, 0x00, 0x62, 0x1e, 0x00, 0x88, 0x59, 0x1e, 0x20, 0x08, 0x69, 0x1e, + 0x60, 0xe7, 0x01, 0xb9, 0x00, 0x08, 0x68, 0x1e, 0x28, 0x1b, 0x00, 0x94, + 0x61, 0x86, 0x41, 0x79, 0x40, 0x7f, 0xbc, 0x9b, 0x21, 0xb3, 0x12, 0x78, + 0x01, 0x88, 0x59, 0x1e, 0xd8, 0x46, 0x02, 0x39, 0xe0, 0x02, 0x00, 0x8b, + 0x61, 0xeb, 0x01, 0xb9, 0x61, 0x2a, 0x42, 0x39, 0xc1, 0x4a, 0x02, 0x39, + 0x61, 0x2e, 0x42, 0x39, 0xc1, 0x4e, 0x02, 0x39, 0x61, 0x32, 0x42, 0x39, + 0xc1, 0x52, 0x02, 0x39, 0x61, 0x36, 0x42, 0x39, 0xc1, 0x56, 0x02, 0x39, + 0x61, 0x3a, 0x42, 0x39, 0xc1, 0x5a, 0x02, 0x39, 0x61, 0x3e, 0x42, 0x39, + 0xc1, 0x5e, 0x02, 0x39, 0x61, 0x42, 0x42, 0x39, 0xc1, 0x62, 0x02, 0x39, + 0x61, 0x46, 0x42, 0x39, 0xc1, 0x86, 0x02, 0x39, 0x61, 0x22, 0x49, 0xb8, + 0xc1, 0xd2, 0x0b, 0xb8, 0x61, 0x8a, 0x42, 0x39, 0xc1, 0x6e, 0x03, 0x39, + 0x61, 0x8e, 0x42, 0x39, 0xc1, 0x72, 0x03, 0x39, 0x60, 0xa6, 0x40, 0xbd, + 0x61, 0x5a, 0x41, 0x79, 0xc0, 0xd2, 0x0d, 0xbc, 0x60, 0xaa, 0x40, 0xbd, + 0xc1, 0x52, 0x0e, 0x78, 0xc0, 0x12, 0x0e, 0xbc, 0x61, 0xba, 0x42, 0x39, + 0xc1, 0x5e, 0x04, 0x39, 0x61, 0xbe, 0x42, 0x39, 0xc1, 0x62, 0x04, 0x39, + 0x61, 0x62, 0x41, 0x79, 0x62, 0x22, 0x4b, 0xbc, 0x61, 0x62, 0x4b, 0xbc, + 0x60, 0xa2, 0x4b, 0xbc, 0x21, 0x93, 0x11, 0x78, 0x22, 0xb3, 0x11, 0xbc, + 0x21, 0xf3, 0x11, 0xbc, 0x20, 0x33, 0x12, 0xbc, 0x6e, 0xf9, 0xff, 0x97, + 0x60, 0x23, 0x40, 0xf9, 0x00, 0x50, 0x4e, 0x78, 0xc0, 0x02, 0x00, 0x34, + 0x00, 0x00, 0x23, 0x1e, 0x02, 0x10, 0x2c, 0x1e, 0x01, 0x10, 0x2e, 0x1e, + 0x00, 0x08, 0x22, 0x1e, 0x02, 0x38, 0x21, 0x1e, 0x40, 0x18, 0x20, 0x1e, + 0x21, 0x38, 0x20, 0x1e, 0x60, 0x53, 0x02, 0xbd, 0x61, 0x57, 0x02, 0xbd, + 0x65, 0x42, 0x42, 0x39, 0xe0, 0x03, 0x1a, 0x2a, 0x64, 0x12, 0x42, 0x39, + 0x63, 0x86, 0x41, 0x79, 0x61, 0x52, 0x48, 0xb8, 0x62, 0xe2, 0x4b, 0xb8, + 0xab, 0xf6, 0xff, 0x97, 0xf8, 0x03, 0x00, 0x2a, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xe8, 0x27, 0x46, 0x6d, 0xa8, 0xfb, 0xff, 0x17, + 0xa0, 0x0e, 0x00, 0xb0, 0x00, 0x00, 0x3c, 0x91, 0x9f, 0x6a, 0x20, 0xf8, + 0xf1, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x2a, + 0xa2, 0x0e, 0x00, 0xb0, 0x42, 0xc0, 0x32, 0x91, 0x03, 0xa5, 0x80, 0xd2, + 0x00, 0x08, 0x03, 0x9b, 0x02, 0x60, 0x41, 0xb9, 0x62, 0x00, 0x00, 0x34, + 0x02, 0x3c, 0x41, 0xb9, 0xe2, 0x03, 0x02, 0x4b, 0x00, 0x00, 0x80, 0x52, + 0x22, 0x00, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0xa2, 0x0e, 0x00, 0xb0, + 0x43, 0xc0, 0x32, 0x91, 0xe2, 0x03, 0x00, 0x2a, 0x04, 0xa5, 0x80, 0xd2, + 0x00, 0x00, 0x80, 0x52, 0x42, 0x0c, 0x04, 0x9b, 0x42, 0x44, 0x40, 0xf9, + 0x22, 0x00, 0x00, 0xf9, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xc3, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, 0xe2, 0xb3, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x01, 0xaa, 0x61, 0x00, 0x80, 0x52, + 0xe3, 0x2f, 0x00, 0xb9, 0x44, 0xf7, 0xff, 0x97, 0xa0, 0x00, 0x00, 0x35, + 0xe1, 0x2f, 0x40, 0xb9, 0x3f, 0x18, 0x00, 0x71, 0xe1, 0x07, 0x9f, 0x1a, + 0x61, 0x02, 0x00, 0x39, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, 0x61, 0x00, 0x00, 0xf0, + 0x22, 0x00, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0xd3, 0x0e, 0x00, 0xd0, 0x73, 0x02, 0x0b, 0x91, 0x21, 0x80, 0x09, 0x91, + 0xe0, 0x03, 0x13, 0xaa, 0x23, 0x3a, 0xff, 0x97, 0x40, 0x01, 0x00, 0x35, + 0x61, 0x00, 0x00, 0xf0, 0x60, 0x02, 0x01, 0x91, 0x21, 0xc0, 0x0b, 0x91, + 0x22, 0x00, 0x80, 0x52, 0x1d, 0x3a, 0xff, 0x97, 0xc0, 0x01, 0x00, 0x35, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe2, 0x03, 0x00, 0x2a, 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0x63, 0x00, 0x00, 0xf0, 0x63, 0x00, 0x0a, 0x91, 0xef, 0x5d, 0xff, 0x97, + 0x40, 0x05, 0x9c, 0x52, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, 0x63, 0x00, 0x00, 0xf0, + 0x63, 0xe0, 0x0a, 0x91, 0x00, 0x01, 0x80, 0x52, 0x01, 0x1c, 0x80, 0x52, + 0xe5, 0x5d, 0xff, 0x97, 0x40, 0x05, 0x9c, 0x52, 0xec, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x01, 0x00, 0x80, 0x12, 0x56, 0x3a, 0xff, 0x97, + 0x1f, 0x68, 0x08, 0x71, 0x80, 0xff, 0xff, 0x54, 0x80, 0x00, 0x00, 0x35, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf3, 0x0b, 0x40, 0xf9, 0xe2, 0x03, 0x00, 0x2a, 0xfd, 0x7b, 0xc2, 0xa8, + 0x63, 0x00, 0x00, 0xf0, 0x63, 0x40, 0x0c, 0x91, 0x41, 0x00, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xcc, 0x5d, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x36, 0x3a, 0xff, 0x97, 0x60, 0x00, 0x00, 0x35, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xc1, 0xa8, + 0xe2, 0x03, 0x00, 0x2a, 0x63, 0x00, 0x00, 0xf0, 0x63, 0xe0, 0x0c, 0x91, + 0x41, 0x00, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0xbc, 0x5d, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbb, 0xa9, 0x7f, 0x0c, 0x00, 0x71, 0xfd, 0x03, 0x00, 0x91, + 0x60, 0x05, 0x00, 0x54, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x03, 0x2a, + 0x23, 0x01, 0x9c, 0x52, 0x60, 0x04, 0x00, 0x34, 0xf5, 0x5b, 0x02, 0xa9, + 0xf5, 0x03, 0x01, 0xaa, 0x01, 0x04, 0x00, 0x51, 0x3f, 0x00, 0x00, 0x6a, + 0xc0, 0x00, 0x00, 0x54, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xe0, 0x03, 0x03, 0x2a, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf4, 0x03, 0x02, 0xaa, 0xf7, 0x1b, 0x00, 0xf9, 0xec, 0x13, 0xff, 0x97, + 0x17, 0x1c, 0x00, 0x12, 0xe1, 0x3b, 0x01, 0x91, 0xf6, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x17, 0x2a, 0xff, 0x3b, 0x01, 0x39, 0x82, 0x90, 0xff, 0x97, + 0x1f, 0x00, 0x00, 0x71, 0xe1, 0x3b, 0x41, 0x39, 0x20, 0x08, 0x41, 0x7a, + 0xa0, 0x02, 0x00, 0x54, 0xe0, 0x03, 0x17, 0x2a, 0xe1, 0x3f, 0x01, 0x91, + 0xb3, 0x91, 0xff, 0x97, 0xe3, 0x03, 0x00, 0x2a, 0xc0, 0x05, 0x00, 0x34, + 0xe0, 0x03, 0x03, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe0, 0x03, 0x03, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x3a, 0x0f, 0x00, 0x94, 0xe3, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x03, 0x2a, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x80, 0x00, 0x80, 0x52, 0x83, 0x00, 0x80, 0x52, 0xe0, 0x3f, 0x01, 0x39, + 0xc0, 0x7e, 0x40, 0x93, 0x84, 0x33, 0x80, 0xd2, 0xc1, 0x0e, 0x00, 0x90, + 0x21, 0xc0, 0x23, 0x91, 0xc2, 0x0e, 0x00, 0xb0, 0x42, 0x40, 0x17, 0x91, + 0x00, 0x7c, 0x04, 0x9b, 0x7f, 0x06, 0x00, 0x71, 0x25, 0x00, 0x00, 0x8b, + 0x40, 0x00, 0x00, 0x8b, 0xa3, 0x38, 0x00, 0xb9, 0x03, 0x38, 0x00, 0xb9, + 0x20, 0x05, 0x00, 0x54, 0x7f, 0x0a, 0x00, 0x71, 0x80, 0x04, 0x00, 0x54, + 0x43, 0x01, 0x9c, 0x52, 0xd3, 0xfb, 0xff, 0x35, 0xc4, 0x7e, 0x24, 0x9b, + 0x53, 0x00, 0x04, 0x8b, 0x80, 0x02, 0x40, 0xf9, 0x1f, 0x6c, 0x06, 0xf1, + 0x08, 0x01, 0x00, 0x54, 0x63, 0x01, 0x9c, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, 0xbf, 0xff, 0xff, 0x17, + 0xe3, 0x3f, 0x41, 0x39, 0xe4, 0xff, 0xff, 0x17, 0x02, 0x96, 0x80, 0xd2, + 0x00, 0xa5, 0x80, 0x52, 0xa1, 0x0e, 0x00, 0xb0, 0x21, 0xc0, 0x32, 0x91, + 0xd6, 0x0a, 0x20, 0x9b, 0x97, 0x33, 0x80, 0xd2, 0xd6, 0x02, 0x01, 0x8b, + 0xe0, 0x03, 0x16, 0xaa, 0x7d, 0xff, 0xff, 0x97, 0xe1, 0x03, 0x13, 0xaa, + 0xe2, 0x03, 0x17, 0xaa, 0xe0, 0x03, 0x15, 0xaa, 0xa9, 0x1d, 0x00, 0x94, + 0x97, 0x02, 0x00, 0xf9, 0xe0, 0x03, 0x16, 0xaa, 0x8e, 0xff, 0xff, 0x97, + 0x03, 0x00, 0x80, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xa8, 0xff, 0xff, 0x17, 0xc2, 0x7e, 0x24, 0x9b, + 0x33, 0x00, 0x02, 0x8b, 0xdf, 0xff, 0xff, 0x17, 0xc4, 0x7e, 0x24, 0x9b, + 0xd7, 0x1e, 0x00, 0x12, 0xe0, 0x03, 0x17, 0x2a, 0x21, 0x00, 0x04, 0x8b, + 0x53, 0x00, 0x04, 0x8b, 0x20, 0xe7, 0xff, 0x97, 0xe0, 0x03, 0x17, 0x2a, + 0xe1, 0x03, 0x13, 0xaa, 0x1d, 0xe7, 0xff, 0x97, 0xd5, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xb9, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xb3, 0x0e, 0x00, 0xb0, 0x73, 0xc2, 0x32, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0xf6, 0x03, 0x00, 0x2a, 0xf7, 0x63, 0x03, 0xa9, 0xf7, 0x03, 0x01, 0xaa, + 0x7f, 0x13, 0xff, 0x97, 0x14, 0x1c, 0x00, 0x12, 0xe1, 0xa3, 0x01, 0x91, + 0xff, 0x37, 0x00, 0xf9, 0xcf, 0x0e, 0x00, 0x94, 0x95, 0x7e, 0x40, 0x93, + 0x02, 0xa5, 0x80, 0xd2, 0xa2, 0x7e, 0x02, 0x9b, 0x78, 0x02, 0x02, 0x8b, + 0x60, 0x6a, 0x62, 0x38, 0x00, 0xdc, 0x00, 0x51, 0xf0, 0x5c, 0xff, 0x97, + 0x00, 0x43, 0x40, 0xf9, 0x00, 0x04, 0x40, 0x39, 0x60, 0x01, 0x00, 0x34, + 0xe0, 0x37, 0x40, 0xf9, 0x00, 0x04, 0x40, 0x39, 0x00, 0x01, 0x00, 0x34, + 0x16, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x16, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc7, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x01, 0xa5, 0x80, 0x52, 0xf9, 0x6b, 0x04, 0xa9, + 0x00, 0xa5, 0x80, 0xd2, 0x94, 0x7e, 0xa1, 0x9b, 0xfb, 0x73, 0x05, 0xa9, + 0xa0, 0x7e, 0x00, 0x9b, 0x79, 0x02, 0x14, 0x8b, 0x7a, 0x02, 0x00, 0x8b, + 0x21, 0x37, 0x40, 0xf9, 0x22, 0x87, 0x44, 0xb9, 0x7b, 0x6a, 0x60, 0x38, + 0x22, 0x7c, 0x00, 0x29, 0x9e, 0x10, 0xff, 0x97, 0x1f, 0x1c, 0x00, 0x72, + 0xa1, 0x30, 0x00, 0x54, 0x60, 0x3f, 0x01, 0x51, 0xd2, 0x5c, 0xff, 0x97, + 0x7f, 0x0f, 0x00, 0x71, 0x00, 0x08, 0x80, 0xd2, 0xd8, 0x0e, 0x00, 0xd0, + 0x18, 0x03, 0x0b, 0x91, 0x00, 0x80, 0x9f, 0x9a, 0xfc, 0x97, 0x9f, 0x1a, + 0x00, 0x03, 0x00, 0x8b, 0x01, 0x00, 0x80, 0x12, 0x4d, 0x39, 0xff, 0x97, + 0xa0, 0x02, 0x00, 0x34, 0x1f, 0x68, 0x08, 0x71, 0xe0, 0x2e, 0x00, 0x54, + 0xe5, 0x03, 0x1b, 0x2a, 0xe4, 0x03, 0x1c, 0x2a, 0xe2, 0x03, 0x00, 0x2a, + 0x63, 0x00, 0x00, 0xf0, 0x63, 0xa0, 0x0d, 0x91, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0xfa, 0x5c, 0xff, 0x97, 0xf6, 0x04, 0x9c, 0x52, + 0x84, 0x10, 0xff, 0x97, 0xe0, 0x03, 0x16, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0x1f, 0x01, 0x51, 0xb2, 0x5c, 0xff, 0x97, 0x40, 0x23, 0x40, 0xf9, + 0x00, 0x0c, 0x40, 0x39, 0xe0, 0x15, 0x00, 0x35, 0x00, 0xa5, 0x80, 0xd2, + 0x16, 0x00, 0x80, 0x52, 0xa0, 0x4e, 0x00, 0x9b, 0x01, 0x40, 0x40, 0xf9, + 0x21, 0x04, 0x40, 0x39, 0x41, 0x12, 0x00, 0x35, 0xf7, 0x03, 0x00, 0xaa, + 0x1f, 0xb8, 0x04, 0x39, 0xe0, 0x03, 0x19, 0xaa, 0x89, 0xde, 0xff, 0x97, + 0xe1, 0x42, 0x40, 0xf9, 0xf6, 0x03, 0x00, 0x2a, 0x21, 0x04, 0x40, 0x39, + 0x01, 0x01, 0x00, 0x35, 0xe5, 0xb6, 0x40, 0xf9, 0xa0, 0x08, 0x40, 0xb9, + 0xe0, 0x14, 0x00, 0x34, 0x1f, 0x04, 0x00, 0x71, 0x20, 0x23, 0x00, 0x54, + 0xe9, 0xba, 0x44, 0x39, 0x89, 0xfe, 0xff, 0x34, 0x00, 0xa5, 0x80, 0xd2, + 0x01, 0x00, 0xb0, 0x52, 0xdf, 0x02, 0x01, 0x6b, 0xa0, 0x4e, 0x00, 0x9b, + 0x17, 0x34, 0x40, 0xf9, 0xe1, 0x0e, 0x40, 0xb9, 0x21, 0x04, 0x00, 0x11, + 0x60, 0x2b, 0x00, 0x54, 0xf6, 0x02, 0x00, 0xb9, 0xe2, 0x03, 0x16, 0x2a, + 0xd6, 0x29, 0x00, 0x34, 0xc3, 0x3a, 0x40, 0x51, 0x7f, 0xfc, 0x05, 0x71, + 0x48, 0x3a, 0x00, 0x54, 0x05, 0x20, 0x40, 0xf9, 0x64, 0x7c, 0x05, 0x53, + 0x20, 0x00, 0x80, 0x52, 0x03, 0x20, 0xc3, 0x1a, 0xa0, 0x08, 0x04, 0x8b, + 0x00, 0x70, 0x4e, 0xb8, 0xe1, 0x0e, 0x00, 0xb9, 0x7f, 0x00, 0x00, 0x6a, + 0x61, 0x28, 0x00, 0x54, 0x0e, 0x00, 0x9c, 0x12, 0x00, 0x01, 0x9c, 0x52, + 0xc1, 0x02, 0x0e, 0x0b, 0xdf, 0x02, 0x00, 0x6b, 0xea, 0x17, 0x9f, 0x1a, + 0x3f, 0xc8, 0x00, 0x71, 0x28, 0x32, 0x00, 0x54, 0x60, 0x06, 0x9c, 0x52, + 0xdf, 0x02, 0x00, 0x6b, 0x20, 0x18, 0x80, 0xd2, 0xa2, 0x05, 0x9c, 0x52, + 0xeb, 0x17, 0x9f, 0x1a, 0x80, 0x00, 0xc6, 0xf2, 0x80, 0x00, 0xe0, 0xf2, + 0xdf, 0x02, 0x02, 0x6b, 0x00, 0x24, 0xc1, 0x9a, 0xe2, 0x17, 0x9f, 0x1a, + 0x00, 0x00, 0x00, 0x12, 0x01, 0x00, 0x80, 0x52, 0x23, 0x27, 0x9c, 0x52, + 0xdf, 0x02, 0x03, 0x6b, 0xe6, 0x17, 0x9f, 0x1a, 0xc3, 0x05, 0x9c, 0x52, + 0xdf, 0x02, 0x03, 0x6b, 0x63, 0x04, 0x9c, 0x52, 0xe9, 0x17, 0x9f, 0x1a, + 0xdf, 0x02, 0x03, 0x6b, 0xe7, 0x17, 0x9f, 0x1a, 0x03, 0x29, 0x9c, 0x52, + 0xdf, 0x02, 0x03, 0x6b, 0xe3, 0x29, 0x9c, 0x52, 0xe8, 0x17, 0x9f, 0x1a, + 0xdf, 0x02, 0x03, 0x6b, 0x84, 0x2e, 0x9c, 0x52, 0xe3, 0x17, 0x9f, 0x1a, + 0xdf, 0x02, 0x04, 0x6b, 0x85, 0x2a, 0x9c, 0x52, 0xe4, 0x17, 0x9f, 0x1a, + 0xdf, 0x02, 0x05, 0x6b, 0xe5, 0x17, 0x9f, 0x1a, 0x1f, 0x00, 0x00, 0x71, + 0x20, 0x08, 0x40, 0x7a, 0x60, 0x06, 0x00, 0x54, 0xe0, 0x00, 0x9c, 0x52, + 0xdf, 0x02, 0x00, 0x6b, 0x01, 0x32, 0x00, 0x54, 0xe0, 0x86, 0x40, 0xb9, + 0x06, 0x00, 0x80, 0x52, 0x08, 0x00, 0x80, 0x52, 0x03, 0x00, 0x80, 0x52, + 0x00, 0x04, 0x00, 0x11, 0x05, 0x00, 0x80, 0x52, 0x09, 0x00, 0x80, 0x52, + 0x07, 0x00, 0x80, 0x52, 0x04, 0x00, 0x80, 0x52, 0x02, 0x00, 0x80, 0x52, + 0xe0, 0x86, 0x00, 0xb9, 0xab, 0x06, 0x9c, 0x12, 0xc0, 0x02, 0x0b, 0x0b, + 0x1f, 0x08, 0x00, 0x71, 0x08, 0x24, 0x00, 0x54, 0xe0, 0x9a, 0x40, 0xb9, + 0x00, 0x04, 0x00, 0x11, 0xe0, 0x9a, 0x00, 0xb9, 0x60, 0x07, 0x9c, 0x12, + 0xc0, 0x02, 0x00, 0x0b, 0x1f, 0x08, 0x00, 0x71, 0x08, 0x24, 0x00, 0x54, + 0xe0, 0xa6, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x11, 0xe0, 0xa6, 0x00, 0xb9, + 0x62, 0x24, 0x00, 0x34, 0xe0, 0xaa, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x11, + 0xe0, 0xaa, 0x00, 0xb9, 0xe2, 0x02, 0x40, 0xb9, 0xa3, 0x24, 0x00, 0x35, + 0xe5, 0x24, 0x00, 0x34, 0xe0, 0xe2, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x11, + 0xe0, 0xe2, 0x00, 0xb9, 0x1f, 0x20, 0x03, 0xd5, 0xe2, 0x00, 0x00, 0x35, + 0x00, 0xa5, 0x80, 0xd2, 0xa0, 0x4e, 0x00, 0x9b, 0x01, 0x20, 0x52, 0x39, + 0xe1, 0x1c, 0x00, 0x34, 0xa0, 0x27, 0x9c, 0x52, 0xe0, 0x02, 0x00, 0xb9, + 0x00, 0x00, 0xb0, 0x52, 0xdf, 0x02, 0x00, 0x6b, 0xa0, 0x19, 0x00, 0x54, + 0x16, 0x00, 0x80, 0x52, 0x17, 0xa5, 0x80, 0xd2, 0x94, 0xc2, 0x12, 0x91, + 0x74, 0x02, 0x14, 0x8b, 0xb7, 0x4e, 0x17, 0x9b, 0xe0, 0x03, 0x14, 0xaa, + 0xe1, 0x36, 0x40, 0xf9, 0x21, 0x00, 0x40, 0xb9, 0xe1, 0x86, 0x04, 0xb9, + 0x79, 0xfe, 0xff, 0x97, 0xe1, 0x82, 0x46, 0xa9, 0x82, 0x33, 0x80, 0xd2, + 0xa6, 0x1c, 0x00, 0x94, 0xe0, 0x03, 0x14, 0xaa, 0x8c, 0xfe, 0xff, 0x97, + 0x01, 0xa5, 0x80, 0xd2, 0x00, 0x08, 0x80, 0xd2, 0xb5, 0x7e, 0x01, 0x9b, + 0x73, 0x6a, 0x75, 0x38, 0x7f, 0x0e, 0x00, 0x71, 0x00, 0x80, 0x9f, 0x9a, + 0xf4, 0x97, 0x9f, 0x1a, 0x00, 0x03, 0x00, 0x8b, 0x87, 0x38, 0xff, 0x97, + 0x60, 0x12, 0x00, 0x35, 0x60, 0xfe, 0x00, 0x51, 0x0c, 0x5c, 0xff, 0x97, + 0x00, 0x00, 0x80, 0x52, 0xdf, 0x02, 0x00, 0x71, 0xd6, 0x12, 0x80, 0x1a, + 0xe0, 0x03, 0x16, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xfd, 0x7b, 0xc7, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x37, 0x40, 0xf9, + 0x00, 0x04, 0x40, 0x39, 0x00, 0xea, 0xff, 0x35, 0xe0, 0x03, 0x16, 0x2a, + 0xe1, 0x03, 0x17, 0xaa, 0xdb, 0x0d, 0x00, 0x94, 0xf6, 0x03, 0x00, 0x2a, + 0x60, 0xe9, 0xff, 0x34, 0xe1, 0xff, 0xff, 0x17, 0xd6, 0x10, 0x00, 0x35, + 0xa0, 0x10, 0x40, 0x39, 0x00, 0x12, 0x00, 0x34, 0xe1, 0xbe, 0x40, 0xf9, + 0x20, 0x00, 0x40, 0x39, 0x00, 0x04, 0x00, 0x11, 0x20, 0x00, 0x00, 0x39, + 0xe0, 0xc6, 0x40, 0xf9, 0x01, 0x00, 0x40, 0x39, 0x01, 0x01, 0x00, 0x34, + 0xe2, 0x22, 0x40, 0xf9, 0xe3, 0xbe, 0x40, 0xf9, 0x41, 0x70, 0x48, 0x78, + 0x63, 0x00, 0x40, 0x39, 0x7f, 0x00, 0x01, 0x6b, 0x63, 0x05, 0x00, 0x54, + 0x1f, 0x00, 0x00, 0x39, 0xe1, 0x1a, 0x40, 0xf9, 0xe0, 0xbe, 0x40, 0xf9, + 0x21, 0xc0, 0x74, 0x39, 0x3f, 0x04, 0x00, 0x71, 0x49, 0x25, 0x00, 0x54, + 0xe1, 0x22, 0x40, 0xf9, 0x03, 0x00, 0x40, 0x39, 0x22, 0x24, 0x42, 0x39, + 0x7f, 0x00, 0x02, 0x6b, 0xc3, 0x01, 0x00, 0x54, 0x1f, 0x00, 0x00, 0x39, + 0xe1, 0xce, 0x40, 0xf9, 0x20, 0x00, 0x40, 0x39, 0x00, 0x04, 0x00, 0x11, + 0x20, 0x00, 0x00, 0x39, 0xe0, 0x1a, 0x40, 0xf9, 0xe1, 0xce, 0x40, 0xf9, + 0x02, 0xc0, 0x74, 0x39, 0x23, 0x00, 0x40, 0x39, 0x60, 0x08, 0xc2, 0x1a, + 0x00, 0x8c, 0x02, 0x1b, 0x20, 0x00, 0x00, 0x39, 0xe1, 0x22, 0x40, 0xf9, + 0xe0, 0x4e, 0x40, 0xf9, 0x02, 0x58, 0x40, 0x39, 0x82, 0x00, 0x00, 0x34, + 0x02, 0x68, 0x40, 0x39, 0x42, 0x00, 0x00, 0x52, 0x02, 0x68, 0x00, 0x39, + 0xe0, 0xc2, 0x40, 0xf9, 0x22, 0x00, 0x80, 0x52, 0x21, 0x44, 0x42, 0x39, + 0x3f, 0x00, 0x00, 0x71, 0xe1, 0x07, 0x9f, 0x1a, 0x01, 0x00, 0x00, 0x39, + 0xe1, 0xba, 0x40, 0xf9, 0x20, 0x00, 0x40, 0x39, 0x00, 0x04, 0x00, 0x11, + 0x20, 0x00, 0x00, 0x39, 0xe2, 0xba, 0x04, 0x39, 0xe2, 0x22, 0x40, 0xf9, + 0xe1, 0xb6, 0x40, 0xf9, 0xe0, 0x36, 0x40, 0xf9, 0x23, 0x18, 0x40, 0x39, + 0x03, 0x3c, 0x00, 0xb9, 0x21, 0x14, 0x40, 0x39, 0x01, 0x6c, 0x06, 0x39, + 0x42, 0x60, 0x44, 0x39, 0xe1, 0xc2, 0x40, 0xf9, 0x5f, 0x04, 0x00, 0x71, + 0xc0, 0x16, 0x00, 0x54, 0x21, 0x00, 0x40, 0x39, 0x01, 0x48, 0x06, 0x39, + 0xe9, 0xba, 0x44, 0x39, 0x49, 0xe1, 0xff, 0x34, 0x1f, 0x20, 0x03, 0xd5, + 0xe5, 0xb6, 0x40, 0xf9, 0xa1, 0x08, 0x40, 0xb9, 0x27, 0x1c, 0x00, 0x12, + 0x21, 0x1c, 0x00, 0x12, 0xe7, 0x04, 0x00, 0x11, 0xa8, 0x30, 0x40, 0x39, + 0xa6, 0x64, 0x00, 0x91, 0x04, 0x00, 0x00, 0x14, 0xff, 0x00, 0x21, 0x6b, + 0x21, 0x1c, 0x00, 0x12, 0x8b, 0x0b, 0x00, 0x54, 0x21, 0x04, 0x00, 0x11, + 0x20, 0x00, 0x00, 0x12, 0x02, 0x25, 0xc0, 0x1a, 0x42, 0xff, 0x07, 0x36, + 0xc0, 0x12, 0x00, 0x34, 0x00, 0x00, 0x80, 0x52, 0x22, 0x00, 0x80, 0xd2, + 0xc3, 0x68, 0x62, 0x38, 0x44, 0x1c, 0x00, 0x12, 0x5f, 0x10, 0x00, 0xf1, + 0x42, 0x04, 0x00, 0x91, 0x60, 0x00, 0x00, 0x2a, 0x00, 0x01, 0x00, 0x54, + 0xe3, 0x4e, 0x40, 0xf9, 0x63, 0x04, 0x40, 0x39, 0x7f, 0x00, 0x00, 0x71, + 0xe3, 0x17, 0x9f, 0x1a, 0x9f, 0x0c, 0x00, 0x71, 0x63, 0x00, 0x9f, 0x1a, + 0x83, 0xfe, 0xff, 0x34, 0x20, 0xfd, 0xff, 0x35, 0xe0, 0x22, 0x40, 0xf9, + 0x00, 0x60, 0x44, 0x39, 0xc0, 0xfc, 0xff, 0x34, 0xe0, 0x36, 0x40, 0xf9, + 0x00, 0x44, 0x46, 0x39, 0x1f, 0x08, 0x00, 0x71, 0x41, 0xfc, 0xff, 0x54, + 0x20, 0x00, 0x80, 0x52, 0xa0, 0x08, 0x00, 0xb9, 0xe9, 0xdb, 0xff, 0x34, + 0xeb, 0xfe, 0xff, 0x17, 0x20, 0xbb, 0x04, 0x39, 0x20, 0x37, 0x40, 0xf9, + 0xe9, 0xba, 0x44, 0x39, 0x56, 0xfa, 0xff, 0x34, 0x01, 0xd8, 0x40, 0xb9, + 0x21, 0x04, 0x00, 0x11, 0x01, 0xd8, 0x00, 0xb9, 0xce, 0xff, 0xff, 0x17, + 0xe2, 0x03, 0x00, 0x2a, 0xe5, 0x03, 0x13, 0x2a, 0x00, 0x01, 0x80, 0x52, + 0xe4, 0x03, 0x14, 0x2a, 0x63, 0x00, 0x00, 0xf0, 0x01, 0x1c, 0x80, 0x52, + 0x63, 0xc0, 0x0e, 0x91, 0xb0, 0x5b, 0xff, 0x97, 0xe0, 0x04, 0x9c, 0x52, + 0x68, 0xff, 0xff, 0x17, 0xe0, 0x36, 0x40, 0xf9, 0x22, 0x00, 0x80, 0x52, + 0xe2, 0xba, 0x04, 0x39, 0x29, 0x00, 0x80, 0x52, 0xc3, 0x00, 0x80, 0x52, + 0xe7, 0x03, 0x09, 0x2a, 0x02, 0xd4, 0x40, 0xb9, 0x03, 0x3c, 0x00, 0xb9, + 0x42, 0x00, 0x09, 0x0b, 0x02, 0xd4, 0x00, 0xb9, 0x1f, 0x6c, 0x06, 0x39, + 0xbd, 0xff, 0xff, 0x17, 0xe0, 0x36, 0x40, 0xf9, 0x21, 0x00, 0x80, 0x52, + 0xe1, 0xba, 0x04, 0x39, 0xc2, 0x00, 0x80, 0x52, 0x29, 0x00, 0x80, 0x52, + 0x01, 0xd4, 0x40, 0xb9, 0x02, 0x3c, 0x00, 0xb9, 0x21, 0x00, 0x09, 0x0b, + 0x01, 0xd4, 0x00, 0xb9, 0x1f, 0x6c, 0x06, 0x39, 0xad, 0xff, 0xff, 0x17, + 0x00, 0xa5, 0x80, 0xd2, 0xe1, 0x9f, 0x01, 0x91, 0xff, 0x9f, 0x01, 0x39, + 0xa0, 0x7e, 0x00, 0x9b, 0x60, 0x6a, 0x60, 0x38, 0x75, 0xfd, 0xff, 0x97, + 0xe0, 0x9f, 0x41, 0x39, 0xa0, 0xe5, 0xff, 0x34, 0x20, 0x29, 0x9c, 0x52, + 0xe0, 0x02, 0x00, 0xb9, 0x2a, 0xff, 0xff, 0x17, 0x17, 0x0f, 0xff, 0x97, + 0x1f, 0x1c, 0x00, 0x72, 0x61, 0x02, 0x00, 0x54, 0x16, 0x00, 0xb0, 0x52, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0x61, 0xfe, 0xff, 0x17, + 0x76, 0x2f, 0x9c, 0x52, 0x29, 0xd4, 0xff, 0x34, 0xad, 0xfe, 0xff, 0x17, + 0x00, 0x58, 0x41, 0xb9, 0x60, 0xe3, 0xff, 0x34, 0xe0, 0x02, 0x00, 0xb9, + 0x19, 0xff, 0xff, 0x17, 0xe1, 0x0e, 0x00, 0xb9, 0xe0, 0x12, 0x40, 0xb9, + 0x81, 0x0c, 0x80, 0x52, 0xe1, 0x06, 0x00, 0xb9, 0x00, 0x04, 0x00, 0x11, + 0xe0, 0x12, 0x00, 0xb9, 0x0b, 0xff, 0xff, 0x17, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0x4f, 0xfe, 0xff, 0x17, 0xe0, 0x8e, 0x40, 0xb9, + 0x06, 0x00, 0x80, 0x52, 0x08, 0x00, 0x80, 0x52, 0x03, 0x00, 0x80, 0x52, + 0x00, 0x04, 0x00, 0x11, 0x05, 0x00, 0x80, 0x52, 0x09, 0x00, 0x80, 0x52, + 0x07, 0x00, 0x80, 0x52, 0x04, 0x00, 0x80, 0x52, 0x02, 0x00, 0x80, 0x52, + 0xe1, 0x0e, 0x00, 0xb9, 0xe0, 0x8e, 0x00, 0xb9, 0xe2, 0xfe, 0xff, 0x17, + 0x2b, 0xdc, 0xff, 0x34, 0xe0, 0x96, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x11, + 0xe0, 0x96, 0x00, 0xb9, 0x0a, 0x07, 0x9c, 0x12, 0xc0, 0x02, 0x0a, 0x0b, + 0x1f, 0x08, 0x00, 0x71, 0xa8, 0x03, 0x00, 0x54, 0xe0, 0x9e, 0x40, 0xb9, + 0x00, 0x04, 0x00, 0x11, 0xe0, 0x9e, 0x00, 0xb9, 0xa2, 0xdc, 0xff, 0x35, + 0x3f, 0x01, 0x00, 0x71, 0x00, 0x09, 0x40, 0x7a, 0x80, 0x00, 0x00, 0x54, + 0xe0, 0xae, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x11, 0xe0, 0xae, 0x00, 0xb9, + 0xff, 0x00, 0x00, 0x71, 0xc0, 0x08, 0x40, 0x7a, 0xe0, 0xdb, 0xff, 0x54, + 0xe0, 0xb2, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x11, 0xe0, 0xb2, 0x00, 0xb9, + 0xdb, 0xfe, 0xff, 0x17, 0xe0, 0xde, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x11, + 0xe0, 0xde, 0x00, 0xb9, 0xc4, 0xdb, 0xff, 0x34, 0xe0, 0xe6, 0x40, 0xb9, + 0x00, 0x04, 0x00, 0x11, 0xe0, 0xe6, 0x00, 0xb9, 0xda, 0xfe, 0xff, 0x17, + 0xbf, 0x08, 0x00, 0xb9, 0x49, 0xcc, 0xff, 0x34, 0x6e, 0xfe, 0xff, 0x17, + 0xc1, 0x07, 0x9c, 0x12, 0xc0, 0x02, 0x01, 0x0b, 0x1f, 0x08, 0x00, 0x71, + 0x28, 0xd8, 0xff, 0x54, 0xe0, 0xa2, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x11, + 0xe0, 0xa2, 0x00, 0xb9, 0xe0, 0xff, 0xff, 0x17, 0x02, 0x44, 0x46, 0x39, + 0x5f, 0x08, 0x00, 0x71, 0x20, 0xe9, 0xff, 0x54, 0x3f, 0x00, 0x00, 0x39, + 0xe0, 0x1a, 0x40, 0xf9, 0x00, 0xc0, 0x74, 0x39, 0x1f, 0x04, 0x00, 0x71, + 0x29, 0x01, 0x00, 0x54, 0xe0, 0xce, 0x40, 0xf9, 0x01, 0x00, 0x40, 0x39, + 0x41, 0x00, 0x00, 0x34, 0x1f, 0x00, 0x00, 0x39, 0xe1, 0x36, 0x40, 0xf9, + 0xe0, 0x03, 0x19, 0xaa, 0x21, 0x3c, 0x40, 0xb9, 0xff, 0xd5, 0xff, 0x97, + 0xe0, 0x36, 0x40, 0xf9, 0xe1, 0xc2, 0x40, 0xf9, 0x39, 0xff, 0xff, 0x17, + 0x61, 0x06, 0x9c, 0x52, 0xac, 0x06, 0x9c, 0x12, 0xdf, 0x02, 0x01, 0x6b, + 0xc0, 0x02, 0x0c, 0x0b, 0xeb, 0x17, 0x9f, 0x1a, 0x1f, 0x2c, 0x00, 0x71, + 0xe1, 0x87, 0x9f, 0x1a, 0xa0, 0x05, 0x9c, 0x52, 0x0d, 0x27, 0x9c, 0x12, + 0xdf, 0x02, 0x00, 0x6b, 0xc5, 0x02, 0x0d, 0x0b, 0xe2, 0x17, 0x9f, 0x1a, + 0xbf, 0xec, 0x00, 0x71, 0x28, 0x05, 0x00, 0x54, 0x20, 0x27, 0x9c, 0x52, + 0xdf, 0x02, 0x00, 0x6b, 0x00, 0x29, 0x9c, 0x52, 0xe6, 0x17, 0x9f, 0x1a, + 0xdf, 0x02, 0x00, 0x6b, 0xe0, 0x29, 0x9c, 0x52, 0xe8, 0x17, 0x9f, 0x1a, + 0xdf, 0x02, 0x00, 0x6b, 0x20, 0x00, 0x90, 0xd2, 0x00, 0x08, 0xa1, 0xf2, + 0x84, 0x2e, 0x9c, 0x52, 0xe3, 0x17, 0x9f, 0x1a, 0x00, 0x00, 0xe1, 0xf2, + 0xdf, 0x02, 0x04, 0x6b, 0x00, 0x24, 0xc5, 0x9a, 0xe4, 0x17, 0x9f, 0x1a, + 0x85, 0x2a, 0x9c, 0x52, 0x00, 0x00, 0x00, 0x12, 0xdf, 0x02, 0x05, 0x6b, + 0x20, 0x00, 0x00, 0x2a, 0xe5, 0x17, 0x9f, 0x1a, 0x60, 0xd4, 0xff, 0x34, + 0x09, 0x00, 0x80, 0x52, 0x07, 0x00, 0x80, 0x52, 0x20, 0x00, 0x9c, 0x52, + 0xdf, 0x02, 0x00, 0x6b, 0x81, 0x00, 0x00, 0x54, 0xe0, 0x8a, 0x40, 0xb9, + 0x00, 0x04, 0x00, 0x11, 0xe0, 0x8a, 0x00, 0xb9, 0xaa, 0xf2, 0xff, 0x34, + 0xe0, 0x92, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x11, 0xe0, 0x92, 0x00, 0xb9, + 0x72, 0xfe, 0xff, 0x17, 0xe1, 0x0e, 0x00, 0xb9, 0x37, 0xfe, 0xff, 0x17, + 0x1f, 0x00, 0x00, 0x39, 0xe1, 0x22, 0x40, 0xf9, 0xe7, 0xfe, 0xff, 0x17, + 0x00, 0x00, 0x80, 0x52, 0x45, 0xfe, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x03, 0x00, 0x2a, + 0x03, 0x0f, 0x80, 0xd2, 0x81, 0x00, 0x00, 0xb0, 0x21, 0xa0, 0x3e, 0x91, + 0x02, 0x04, 0x00, 0x11, 0x02, 0x40, 0x60, 0x1e, 0x84, 0x7c, 0x03, 0x9b, + 0x5f, 0x04, 0x00, 0x71, 0x20, 0x68, 0x64, 0xfc, 0x49, 0x01, 0x00, 0x54, + 0x03, 0x7c, 0xa3, 0x9b, 0x20, 0x00, 0x80, 0xd2, 0x21, 0x00, 0x03, 0x8b, + 0x1f, 0x20, 0x03, 0xd5, 0x21, 0x78, 0x60, 0xfc, 0x00, 0x04, 0x00, 0x91, + 0x40, 0x04, 0x40, 0x1f, 0x5f, 0x00, 0x00, 0x6b, 0x88, 0xff, 0xff, 0x54, + 0xc0, 0x03, 0x5f, 0xd6, 0x23, 0xc0, 0x22, 0x1e, 0x02, 0xc0, 0x22, 0x1e, + 0x24, 0x08, 0x40, 0xb9, 0x28, 0x11, 0x91, 0x52, 0x08, 0x11, 0xb1, 0x72, + 0xe5, 0x01, 0x80, 0x52, 0x26, 0x00, 0x40, 0xf9, 0x63, 0x08, 0x63, 0x1e, + 0x42, 0x0c, 0x42, 0x1f, 0x82, 0x7c, 0xa8, 0x9b, 0x24, 0x10, 0x40, 0xfd, + 0x89, 0x04, 0x00, 0x11, 0x29, 0x08, 0x00, 0xb9, 0x42, 0xfc, 0x63, 0xd3, + 0x42, 0x90, 0x05, 0x1b, 0x42, 0xc0, 0x61, 0x1e, 0x42, 0xf0, 0x7d, 0xd3, + 0xc3, 0x00, 0x02, 0x8b, 0xc0, 0x68, 0x22, 0xbc, 0x61, 0x04, 0x00, 0xbd, + 0x90, 0x20, 0x62, 0x1e, 0x65, 0x04, 0x00, 0x54, 0x23, 0x18, 0x40, 0xf9, + 0x22, 0x00, 0x80, 0x52, 0x22, 0xa0, 0x00, 0x39, 0xca, 0x01, 0x80, 0x52, + 0x22, 0x10, 0x00, 0xfd, 0xe2, 0x03, 0x05, 0x2a, 0x60, 0x00, 0x00, 0x79, + 0xeb, 0x03, 0x05, 0x2a, 0x62, 0x04, 0x00, 0xfd, 0x4a, 0x01, 0x04, 0x4b, + 0x03, 0x0e, 0x80, 0xd2, 0x25, 0x2c, 0x00, 0xb9, 0x0f, 0x00, 0x00, 0x14, + 0x80, 0x7c, 0xa8, 0x9b, 0x25, 0x08, 0x40, 0xf9, 0x00, 0xfc, 0x63, 0xd3, + 0xa7, 0x00, 0x03, 0x8b, 0x00, 0x90, 0x0b, 0x1b, 0x00, 0xf0, 0x7d, 0xd3, + 0xc4, 0x00, 0x00, 0x8b, 0xc1, 0x68, 0x60, 0xbc, 0x80, 0x04, 0x40, 0xbd, + 0x22, 0x2c, 0x00, 0xb9, 0xa1, 0x68, 0x23, 0xbc, 0x63, 0x20, 0x00, 0xd1, + 0xe0, 0x04, 0x00, 0xbd, 0xa2, 0x00, 0x00, 0x34, 0x5f, 0x01, 0x02, 0x6b, + 0x42, 0x04, 0x00, 0x51, 0x24, 0x01, 0x02, 0x0b, 0xe1, 0xfd, 0xff, 0x54, + 0xe0, 0x01, 0x80, 0x52, 0x20, 0x18, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0xa0, 0x40, 0x39, 0xc0, 0xff, 0xff, 0x34, 0x20, 0x18, 0x40, 0xb9, + 0x22, 0x08, 0x40, 0xf9, 0x03, 0x04, 0x00, 0x11, 0x00, 0x7c, 0x7d, 0xd3, + 0x23, 0x18, 0x00, 0xb9, 0x44, 0x00, 0x00, 0x8b, 0x7f, 0x70, 0x00, 0x71, + 0x40, 0x68, 0x20, 0xbc, 0x81, 0x04, 0x00, 0xbd, 0x89, 0xfe, 0xff, 0x54, + 0x3f, 0xa0, 0x00, 0x39, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb6, 0xa9, 0xec, 0x03, 0x01, 0xaa, + 0x52, 0x3c, 0x00, 0x12, 0xfd, 0x03, 0x00, 0x91, 0x2f, 0x20, 0x40, 0x79, + 0xa1, 0xa0, 0x03, 0x91, 0xe1, 0x37, 0x00, 0xf9, 0x6e, 0x3c, 0x00, 0x12, + 0xe1, 0x05, 0x00, 0x51, 0xff, 0x01, 0x12, 0x6b, 0x21, 0x3c, 0x00, 0x12, + 0xf3, 0x53, 0x01, 0xa9, 0x32, 0x90, 0x92, 0x1a, 0xff, 0x01, 0x0e, 0x6b, + 0xf5, 0x5b, 0x02, 0xa9, 0x2e, 0x90, 0x8e, 0x1a, 0xff, 0x73, 0x00, 0xb9, + 0xd4, 0x11, 0x00, 0x51, 0xe5, 0x3f, 0x00, 0xf9, 0xed, 0x03, 0x00, 0xaa, + 0xff, 0x83, 0x00, 0xb9, 0x5f, 0x02, 0x14, 0x6b, 0xff, 0x47, 0x00, 0xf9, + 0xff, 0x43, 0x02, 0x39, 0xff, 0x97, 0x00, 0xb9, 0xe4, 0x4f, 0x00, 0xf9, + 0x68, 0x1f, 0x00, 0x54, 0xf7, 0x1b, 0x00, 0xf9, 0xe3, 0x03, 0x0f, 0x2a, + 0xff, 0xff, 0x04, 0xa9, 0x53, 0x12, 0x00, 0x11, 0xf5, 0x03, 0x12, 0x2a, + 0xff, 0xff, 0x05, 0xa9, 0xe1, 0xa3, 0x01, 0x91, 0x83, 0x0b, 0x00, 0x34, + 0x1f, 0x20, 0x03, 0xd5, 0x18, 0x04, 0x00, 0x0f, 0x6b, 0x00, 0x15, 0x0b, + 0x64, 0x6d, 0x00, 0x51, 0xe0, 0x03, 0x0b, 0x2a, 0x89, 0x1d, 0x40, 0xa9, + 0x6b, 0x6c, 0x00, 0x51, 0x82, 0x08, 0xc3, 0x1a, 0x19, 0x43, 0x20, 0x1e, + 0x1a, 0x43, 0x20, 0x1e, 0x1b, 0x43, 0x20, 0x1e, 0x1c, 0x43, 0x20, 0x1e, + 0x1d, 0x43, 0x20, 0x1e, 0x01, 0x43, 0x20, 0x1e, 0x00, 0x43, 0x20, 0x1e, + 0x6b, 0x01, 0x00, 0x0b, 0xe8, 0x03, 0x0d, 0xaa, 0x42, 0x90, 0x03, 0x1b, + 0x8a, 0x08, 0x00, 0x11, 0xe5, 0x03, 0x04, 0x2a, 0x84, 0x04, 0x00, 0x11, + 0xa5, 0x0c, 0x00, 0x11, 0x7f, 0x01, 0x04, 0x6b, 0x46, 0x09, 0xc3, 0x1a, + 0x25, 0x79, 0x62, 0xbc, 0xa0, 0x08, 0xc3, 0x1a, 0xe4, 0x78, 0x62, 0xbc, + 0x03, 0x09, 0x40, 0x2d, 0xc6, 0xa8, 0x03, 0x1b, 0x82, 0x08, 0xc3, 0x1a, + 0x08, 0x21, 0x00, 0x91, 0x05, 0x94, 0x03, 0x1b, 0x51, 0x08, 0x25, 0x1e, + 0x92, 0x88, 0x22, 0x1e, 0xf7, 0x78, 0x66, 0xbc, 0x91, 0xc4, 0x03, 0x1f, + 0x40, 0x90, 0x03, 0x1b, 0x24, 0x79, 0x66, 0xbc, 0x35, 0x79, 0x65, 0xbc, + 0x72, 0xc8, 0x25, 0x1f, 0xf6, 0x78, 0x65, 0xbc, 0xf0, 0x8a, 0x22, 0x1e, + 0x47, 0x08, 0x24, 0x1e, 0x70, 0xc0, 0x24, 0x1f, 0x33, 0x79, 0x60, 0xbc, + 0x46, 0x08, 0x35, 0x1e, 0xf4, 0x78, 0x60, 0xbc, 0xc5, 0x8a, 0x22, 0x1e, + 0xe7, 0x9e, 0x03, 0x1f, 0xc6, 0x9a, 0x03, 0x1f, 0x44, 0x08, 0x33, 0x1e, + 0x65, 0x94, 0x35, 0x1f, 0x82, 0x8a, 0x22, 0x1e, 0x84, 0x92, 0x03, 0x1f, + 0x62, 0x88, 0x33, 0x1f, 0x00, 0x28, 0x32, 0x1e, 0x21, 0x28, 0x31, 0x1e, + 0x7b, 0x2b, 0x30, 0x1e, 0x5a, 0x2b, 0x27, 0x1e, 0x18, 0x2b, 0x26, 0x1e, + 0x39, 0x2b, 0x25, 0x1e, 0x9c, 0x2b, 0x24, 0x1e, 0xbd, 0x2b, 0x22, 0x1e, + 0x41, 0xfa, 0xff, 0x54, 0xe0, 0x07, 0x09, 0x2d, 0xfd, 0x73, 0x0a, 0x2d, + 0xfb, 0x6b, 0x0b, 0x2d, 0xf9, 0x63, 0x0c, 0x2d, 0xf6, 0x03, 0x15, 0x2a, + 0xe0, 0x03, 0x16, 0x2a, 0xf7, 0x23, 0x01, 0x91, 0xd6, 0x06, 0x00, 0x11, + 0x4d, 0xff, 0xff, 0x97, 0xf7, 0x22, 0x00, 0x91, 0x7f, 0x02, 0x16, 0x6b, + 0x00, 0x01, 0x00, 0x54, 0xe0, 0x06, 0x40, 0x2d, 0xe0, 0x03, 0x16, 0x2a, + 0xd6, 0x06, 0x00, 0x11, 0xf7, 0x22, 0x00, 0x91, 0x45, 0xff, 0xff, 0x97, + 0x7f, 0x02, 0x16, 0x6b, 0x41, 0xff, 0xff, 0x54, 0xb5, 0x12, 0x00, 0x11, + 0x73, 0x12, 0x00, 0x11, 0xbf, 0x02, 0x14, 0x6b, 0x08, 0x01, 0x00, 0x54, + 0x83, 0x21, 0x40, 0x79, 0xff, 0xff, 0x04, 0xa9, 0xff, 0xff, 0x05, 0xa9, + 0xe3, 0xf4, 0xff, 0x35, 0x01, 0x04, 0x00, 0x0f, 0x20, 0x40, 0x20, 0x1e, + 0xe7, 0xff, 0xff, 0x17, 0xbf, 0x02, 0x0e, 0x6b, 0x88, 0x04, 0x00, 0x54, + 0x84, 0x21, 0x40, 0x79, 0xf7, 0x1b, 0x40, 0xf9, 0x1f, 0x20, 0x03, 0xd5, + 0x00, 0x04, 0x00, 0x0f, 0x01, 0x40, 0x20, 0x1e, 0xe4, 0x02, 0x00, 0x34, + 0x01, 0x04, 0x00, 0x0f, 0xa5, 0x6e, 0x00, 0x51, 0x87, 0x19, 0x40, 0xa9, + 0xa2, 0x00, 0x04, 0x0b, 0xa0, 0x11, 0x00, 0x91, 0xa5, 0x04, 0x04, 0x0b, + 0x20, 0x40, 0x20, 0x1e, 0x43, 0x08, 0xc4, 0x1a, 0x04, 0xc0, 0x5f, 0xbc, + 0x02, 0x84, 0x40, 0xbc, 0x63, 0x88, 0x04, 0x1b, 0x42, 0x04, 0x00, 0x11, + 0xbf, 0x00, 0x02, 0x6b, 0xe5, 0x78, 0x63, 0xbc, 0xc6, 0x78, 0x63, 0xbc, + 0xa3, 0x08, 0x22, 0x1e, 0xc2, 0x88, 0x22, 0x1e, 0xc3, 0x8c, 0x04, 0x1f, + 0xa2, 0x88, 0x24, 0x1f, 0x21, 0x28, 0x23, 0x1e, 0x00, 0x28, 0x22, 0x1e, + 0x41, 0xfe, 0xff, 0x54, 0xe0, 0x03, 0x15, 0x2a, 0xb5, 0x06, 0x00, 0x11, + 0x17, 0xff, 0xff, 0x97, 0xbf, 0x02, 0x0e, 0x6b, 0xa8, 0x00, 0x00, 0x54, + 0x84, 0x21, 0x40, 0x79, 0xe1, 0xff, 0xff, 0x17, 0xf7, 0x1b, 0x40, 0xf9, + 0x1f, 0x20, 0x03, 0xd5, 0xe0, 0x43, 0x42, 0x39, 0xea, 0x97, 0x40, 0xb9, + 0xe7, 0x47, 0x40, 0xfd, 0xe0, 0x05, 0x00, 0x34, 0xc9, 0x05, 0x00, 0x11, + 0xc0, 0x39, 0x00, 0x11, 0x3f, 0x01, 0x00, 0x6b, 0x68, 0x05, 0x00, 0x54, + 0x83, 0x21, 0x40, 0x79, 0xd0, 0x3d, 0x00, 0x11, 0xe8, 0x83, 0x40, 0xb9, + 0xeb, 0x3f, 0x40, 0xf9, 0xc4, 0x05, 0x03, 0x0b, 0x71, 0x6c, 0x00, 0x51, + 0x84, 0x68, 0x00, 0x51, 0x1f, 0x20, 0x03, 0xd5, 0xe7, 0x03, 0x08, 0x2a, + 0x05, 0x04, 0x00, 0x0f, 0x08, 0x05, 0x00, 0x11, 0xe7, 0x7c, 0x7d, 0xd3, + 0x6e, 0x01, 0x07, 0x8b, 0xc3, 0x0a, 0x00, 0x34, 0x86, 0x15, 0x40, 0xa9, + 0xa6, 0x40, 0x20, 0x1e, 0x20, 0x02, 0x09, 0x0b, 0xa2, 0x11, 0x00, 0x91, + 0x01, 0x08, 0xc3, 0x1a, 0x42, 0xc0, 0x5f, 0xbc, 0x40, 0x84, 0x40, 0xbc, + 0x21, 0x80, 0x03, 0x1b, 0x00, 0x04, 0x00, 0x11, 0x9f, 0x00, 0x00, 0x6b, + 0xc3, 0x78, 0x61, 0xbc, 0xa4, 0x78, 0x61, 0xbc, 0x61, 0x08, 0x20, 0x1e, + 0x80, 0x88, 0x20, 0x1e, 0x81, 0x84, 0x02, 0x1f, 0x60, 0x80, 0x22, 0x1f, + 0xa5, 0x28, 0x21, 0x1e, 0xc6, 0x28, 0x20, 0x1e, 0x41, 0xfe, 0xff, 0x54, + 0x66, 0x69, 0x27, 0xbc, 0x1f, 0x71, 0x00, 0x71, 0xc5, 0x05, 0x00, 0xbd, + 0xa8, 0x00, 0x00, 0x54, 0x29, 0x05, 0x00, 0x11, 0x84, 0x04, 0x00, 0x11, + 0x3f, 0x01, 0x10, 0x6b, 0x01, 0xfc, 0xff, 0x54, 0xe8, 0x83, 0x00, 0xb9, + 0x4a, 0x06, 0x00, 0x34, 0x81, 0x21, 0x40, 0x79, 0x49, 0x05, 0x00, 0x51, + 0xe8, 0x3f, 0x40, 0xf9, 0xe0, 0xa5, 0x00, 0x51, 0x44, 0x06, 0x01, 0x0b, + 0xef, 0x39, 0x00, 0x51, 0x07, 0x21, 0x00, 0x91, 0x05, 0x04, 0x00, 0x0f, + 0x84, 0x00, 0x00, 0x0b, 0xf2, 0x01, 0x12, 0x0b, 0x2a, 0x6c, 0x00, 0x51, + 0xe9, 0x4c, 0x29, 0x8b, 0xa1, 0x03, 0x00, 0x34, 0x86, 0x15, 0x40, 0xa9, + 0xa6, 0x40, 0x20, 0x1e, 0x42, 0x01, 0x12, 0x0b, 0xa0, 0x11, 0x00, 0x91, + 0x43, 0x08, 0xc1, 0x1a, 0x02, 0xc0, 0x5f, 0xbc, 0x00, 0x84, 0x40, 0xbc, + 0x63, 0x88, 0x01, 0x1b, 0x42, 0x04, 0x00, 0x11, 0x9f, 0x00, 0x02, 0x6b, + 0xc3, 0x78, 0x63, 0xbc, 0xa4, 0x78, 0x63, 0xbc, 0x61, 0x08, 0x20, 0x1e, + 0x80, 0x88, 0x20, 0x1e, 0x81, 0x84, 0x02, 0x1f, 0x60, 0x80, 0x22, 0x1f, + 0xa5, 0x28, 0x21, 0x1e, 0xc6, 0x28, 0x20, 0x1e, 0x41, 0xfe, 0xff, 0x54, + 0x06, 0x15, 0x00, 0x2d, 0x52, 0x06, 0x00, 0x11, 0x84, 0x04, 0x00, 0x11, + 0x3f, 0x01, 0x07, 0xeb, 0xe8, 0x03, 0x07, 0xaa, 0x80, 0x01, 0x00, 0x54, + 0x05, 0x04, 0x00, 0x0f, 0xe7, 0x20, 0x00, 0x91, 0xa1, 0xfc, 0xff, 0x35, + 0xa6, 0x40, 0x20, 0x1e, 0x52, 0x06, 0x00, 0x11, 0x84, 0x04, 0x00, 0x11, + 0x3f, 0x01, 0x07, 0xeb, 0x06, 0x15, 0x00, 0x2d, 0xe8, 0x03, 0x07, 0xaa, + 0xe1, 0xfe, 0xff, 0x54, 0x1f, 0x20, 0x03, 0xd5, 0xf8, 0x20, 0x60, 0x1e, + 0x20, 0x09, 0x9c, 0x52, 0x00, 0x90, 0x9f, 0x1a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xca, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xa6, 0x40, 0x20, 0x1e, 0xbd, 0xff, 0xff, 0x17, 0xe4, 0x03, 0x0f, 0x2a, + 0xf5, 0x03, 0x12, 0x2a, 0xe1, 0xa3, 0x01, 0x91, 0x5f, 0x02, 0x0e, 0x6b, + 0xa9, 0xed, 0xff, 0x54, 0x20, 0x09, 0x9c, 0x52, 0xf4, 0xff, 0xff, 0x17, + 0xfd, 0x7b, 0xb6, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xe8, 0x2b, 0x00, 0xfd, + 0x08, 0xe4, 0x00, 0x2f, 0xf9, 0x6b, 0x04, 0xa9, 0x99, 0x00, 0x00, 0xd0, + 0x39, 0xa3, 0x00, 0x91, 0x5a, 0x3c, 0x00, 0x12, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x03, 0x00, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x01, 0xaa, + 0x16, 0x00, 0x80, 0xd2, 0x01, 0xa0, 0x03, 0x91, 0x00, 0xa0, 0x06, 0x91, + 0xf7, 0x63, 0x03, 0xa9, 0x18, 0x00, 0x80, 0x52, 0xe1, 0x83, 0x06, 0xa9, + 0x04, 0x03, 0x80, 0x52, 0xe2, 0xa3, 0x01, 0x91, 0xe3, 0x03, 0x04, 0x2a, + 0xe1, 0x03, 0x19, 0xaa, 0xe0, 0xe3, 0x01, 0x91, 0xfd, 0x0f, 0x00, 0x94, + 0xd7, 0x06, 0x00, 0x11, 0x80, 0x06, 0x40, 0x2d, 0xe0, 0xe3, 0x01, 0x91, + 0x22, 0x00, 0x80, 0x52, 0x01, 0x00, 0x80, 0x52, 0x33, 0x00, 0x80, 0xd2, + 0xb6, 0x0f, 0x00, 0x94, 0xc0, 0x1e, 0x00, 0x12, 0x1f, 0xfc, 0x00, 0x71, + 0xf7, 0x12, 0x9f, 0x1a, 0xf7, 0x1e, 0x00, 0x12, 0x1f, 0x20, 0x03, 0xd5, + 0x63, 0xf2, 0x7d, 0xd3, 0xe0, 0xe3, 0x01, 0x91, 0x84, 0x02, 0x03, 0x8b, + 0xe1, 0x03, 0x13, 0x2a, 0x22, 0x00, 0x80, 0x52, 0x80, 0x6a, 0x63, 0xbc, + 0x81, 0x04, 0x40, 0xbd, 0xa9, 0x0f, 0x00, 0x94, 0x21, 0x08, 0x61, 0x1e, + 0x00, 0x04, 0x40, 0x1f, 0x60, 0x3e, 0x00, 0x12, 0x1f, 0x58, 0x00, 0x71, + 0x00, 0xc0, 0x61, 0x1e, 0x10, 0x85, 0x60, 0x1e, 0xc5, 0x00, 0x00, 0x54, + 0xdf, 0xfe, 0x00, 0xf1, 0x08, 0x40, 0x60, 0x1e, 0x78, 0x16, 0x93, 0x1a, + 0xb7, 0x0a, 0x00, 0x39, 0xa0, 0x06, 0x00, 0xfd, 0x73, 0x06, 0x00, 0x91, + 0x7f, 0x76, 0x00, 0xf1, 0x41, 0xfd, 0xff, 0x54, 0xd6, 0x06, 0x00, 0x91, + 0x39, 0x03, 0x03, 0x91, 0xdf, 0x02, 0x01, 0xf1, 0x81, 0xfa, 0xff, 0x54, + 0x18, 0x21, 0x60, 0x1e, 0x20, 0x09, 0x9c, 0x52, 0x4d, 0x01, 0x00, 0x54, + 0xa2, 0x02, 0x40, 0x79, 0x41, 0x6b, 0x00, 0x51, 0x21, 0x00, 0x18, 0x0b, + 0x00, 0x00, 0x80, 0x52, 0x21, 0x00, 0x02, 0x0b, 0x21, 0x3c, 0x00, 0x12, + 0x22, 0x08, 0xda, 0x1a, 0x41, 0x84, 0x1a, 0x1b, 0xa1, 0x02, 0x00, 0x79, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xe8, 0x2b, 0x40, 0xfd, 0xfd, 0x7b, 0xca, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xb4, 0xa9, 0x02, 0x70, 0x00, 0x91, 0x06, 0xc4, 0x00, 0x91, + 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0x16, 0x40, 0x03, 0x91, + 0x03, 0x10, 0x43, 0x78, 0xf3, 0x53, 0x01, 0xa9, 0x04, 0x80, 0x04, 0x91, + 0xf5, 0x03, 0x00, 0xaa, 0xf7, 0x63, 0x03, 0xa9, 0x17, 0x20, 0x04, 0x91, + 0xf3, 0x03, 0x00, 0xaa, 0x1f, 0x7c, 0x0d, 0xa9, 0x41, 0x00, 0x80, 0x52, + 0x1f, 0x10, 0x04, 0x39, 0x03, 0x30, 0x02, 0x79, 0xdf, 0x7e, 0x01, 0xa9, + 0xdf, 0x7e, 0x02, 0xa9, 0x1f, 0x80, 0x01, 0x79, 0x1f, 0xc4, 0x00, 0xb9, + 0x1f, 0x7c, 0x13, 0xa9, 0x5f, 0x7c, 0x00, 0xa9, 0x1f, 0x2c, 0x00, 0xb9, + 0x1f, 0xc0, 0x00, 0x39, 0x1f, 0x54, 0x01, 0x39, 0xdf, 0x7c, 0x00, 0xa9, + 0xdf, 0x7c, 0x01, 0xa9, 0x1f, 0x10, 0x05, 0xb8, 0xff, 0x7e, 0x00, 0xa9, + 0x1f, 0x7c, 0x12, 0xa9, 0xe4, 0x3b, 0x00, 0xf9, 0xb8, 0x03, 0x00, 0x94, + 0xa0, 0x06, 0x4b, 0x38, 0xe1, 0x03, 0x15, 0xaa, 0x3d, 0x03, 0x00, 0x94, + 0xf4, 0x03, 0x00, 0x2a, 0x20, 0x01, 0x00, 0x34, 0xe0, 0x03, 0x16, 0xaa, + 0x15, 0x03, 0x00, 0x94, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xcc, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x7e, 0x0c, 0xff, 0x97, 0x1f, 0x1c, 0x00, 0x72, + 0x40, 0x01, 0x00, 0x54, 0x14, 0x00, 0xb0, 0x52, 0xe0, 0x03, 0x16, 0xaa, + 0x09, 0x03, 0x00, 0x94, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xcc, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x13, 0xaa, 0x61, 0x00, 0x80, 0x52, + 0xf9, 0x6b, 0x04, 0xa9, 0xe8, 0x27, 0x06, 0x6d, 0x9a, 0x03, 0x00, 0x94, + 0x60, 0x0a, 0x43, 0x39, 0xc0, 0x0c, 0x00, 0x34, 0x65, 0x66, 0x40, 0xf9, + 0xe0, 0x63, 0x02, 0x91, 0x74, 0x82, 0x41, 0x79, 0xe4, 0x06, 0x80, 0x52, + 0xa6, 0xe0, 0x06, 0x91, 0xe2, 0x23, 0x02, 0x91, 0xe3, 0x03, 0x04, 0x2a, + 0xa1, 0x00, 0x00, 0xb0, 0x21, 0xa0, 0x00, 0x91, 0xe5, 0x9b, 0x08, 0xa9, + 0x75, 0x0f, 0x00, 0x94, 0xa5, 0x22, 0x40, 0x79, 0xa0, 0xfc, 0x9f, 0x52, + 0x94, 0x3a, 0x1f, 0x53, 0xbf, 0x00, 0x00, 0x6b, 0x80, 0x2e, 0x00, 0x54, + 0x1a, 0x00, 0x80, 0x52, 0x18, 0x00, 0x80, 0x52, 0x19, 0x00, 0x80, 0x52, + 0xfb, 0x73, 0x05, 0xa9, 0x9b, 0x00, 0x00, 0xb0, 0x7b, 0xc3, 0x1a, 0x91, + 0xfc, 0x06, 0x80, 0x52, 0x32, 0x00, 0x00, 0x14, 0x03, 0x0b, 0xdc, 0x1a, + 0xa3, 0x16, 0x40, 0xbd, 0xe7, 0x4b, 0x40, 0xf9, 0xe1, 0x7f, 0x00, 0xb9, + 0xa6, 0x02, 0x40, 0xf9, 0x63, 0xe0, 0x1c, 0x1b, 0x60, 0x07, 0x40, 0x2d, + 0xc8, 0x00, 0x05, 0x8b, 0x63, 0x3c, 0x7d, 0xd3, 0xe9, 0x00, 0x03, 0x8b, + 0xe2, 0x68, 0x63, 0xbc, 0x24, 0x05, 0x40, 0xbd, 0xc2, 0x68, 0x25, 0xbc, + 0x85, 0x08, 0x24, 0x1e, 0x04, 0x05, 0x00, 0xbd, 0x42, 0x14, 0x02, 0x1f, + 0x62, 0x28, 0x22, 0x1e, 0xa2, 0x16, 0x00, 0xbd, 0xd5, 0x0e, 0x00, 0x94, + 0xe1, 0x7f, 0x40, 0xb9, 0x42, 0x07, 0x00, 0x11, 0xe5, 0x4b, 0x40, 0xf9, + 0x42, 0x3c, 0x7d, 0xd3, 0xa3, 0x02, 0x40, 0xf9, 0x5a, 0x0b, 0x00, 0x11, + 0x20, 0x08, 0xdc, 0x1a, 0xa1, 0x16, 0x40, 0xbd, 0x5a, 0x3f, 0x00, 0x12, + 0x01, 0x84, 0x1c, 0x1b, 0x60, 0x00, 0x02, 0x8b, 0x21, 0x3c, 0x7d, 0xd3, + 0xa6, 0x00, 0x01, 0x8b, 0xa0, 0x68, 0x61, 0xbc, 0xc2, 0x04, 0x40, 0xbd, + 0x60, 0x68, 0x22, 0xbc, 0x43, 0x08, 0x22, 0x1e, 0x02, 0x04, 0x00, 0xbd, + 0x00, 0x0c, 0x00, 0x1f, 0x20, 0x28, 0x20, 0x1e, 0xa0, 0x16, 0x00, 0xbd, + 0xa5, 0x22, 0x40, 0x79, 0x21, 0x07, 0x00, 0x11, 0x04, 0x0b, 0x00, 0x11, + 0x39, 0x3c, 0x00, 0x12, 0xa0, 0x6c, 0x00, 0x11, 0x98, 0x3c, 0x00, 0x12, + 0x00, 0x3c, 0x00, 0x12, 0x1f, 0x20, 0x21, 0x6b, 0x49, 0x27, 0x00, 0x54, + 0x23, 0x03, 0x05, 0x0b, 0xe1, 0x03, 0x18, 0x2a, 0x66, 0x6c, 0x00, 0x51, + 0xe0, 0x63, 0x02, 0x91, 0xa7, 0x06, 0x40, 0xf9, 0x22, 0x00, 0x80, 0x52, + 0xc3, 0x0c, 0xc5, 0x1a, 0x63, 0x98, 0x05, 0x1b, 0x63, 0x3c, 0x1f, 0x53, + 0x65, 0x04, 0x00, 0x11, 0xe3, 0x03, 0x03, 0x2a, 0xe6, 0x78, 0xe3, 0x78, + 0xe3, 0x78, 0xe5, 0x78, 0xc0, 0x00, 0x22, 0x1e, 0x61, 0x00, 0x22, 0x1e, + 0xa7, 0x0e, 0x00, 0x94, 0x01, 0x07, 0x00, 0x11, 0x45, 0x3f, 0x7d, 0xd3, + 0xe0, 0x63, 0x02, 0x91, 0x3f, 0x6b, 0x00, 0x71, 0x21, 0x3c, 0x00, 0x12, + 0x02, 0x00, 0x80, 0x52, 0x28, 0xf7, 0xff, 0x54, 0x60, 0x07, 0x40, 0x2d, + 0xe0, 0x63, 0x02, 0x91, 0x02, 0x00, 0x80, 0x52, 0x9c, 0x0e, 0x00, 0x94, + 0xdc, 0xff, 0xff, 0x17, 0x74, 0x82, 0x41, 0x79, 0xa0, 0x16, 0x40, 0xbd, + 0x34, 0x25, 0x00, 0x34, 0x64, 0x5a, 0x40, 0xf9, 0x86, 0x06, 0x00, 0x51, + 0xa5, 0x06, 0x40, 0xf9, 0x82, 0x20, 0x00, 0x91, 0x83, 0x6e, 0x00, 0x51, + 0x46, 0x2c, 0x26, 0x8b, 0x1f, 0x20, 0x03, 0xd5, 0x60, 0x0c, 0xd4, 0x1a, + 0xdf, 0x00, 0x02, 0xeb, 0x00, 0x8c, 0x14, 0x1b, 0x63, 0x04, 0x00, 0x11, + 0x00, 0x3c, 0x1f, 0x53, 0x01, 0x04, 0x00, 0x11, 0xe0, 0x03, 0x00, 0x2a, + 0xa1, 0x78, 0xe1, 0x78, 0xa0, 0x78, 0xe0, 0x78, 0x22, 0x00, 0x22, 0x1e, + 0x01, 0x00, 0x22, 0x1e, 0x43, 0x08, 0x22, 0x1e, 0x81, 0x08, 0x00, 0x2d, + 0x21, 0x0c, 0x01, 0x1f, 0xe4, 0x03, 0x02, 0xaa, 0x42, 0x20, 0x00, 0x91, + 0x00, 0x28, 0x21, 0x1e, 0xe1, 0xfd, 0xff, 0x54, 0x88, 0x02, 0x62, 0x1e, + 0x00, 0x3a, 0xe8, 0xd2, 0x01, 0x00, 0x67, 0x9e, 0xa0, 0x16, 0x00, 0xbd, + 0x08, 0x09, 0x61, 0x1e, 0x00, 0xc0, 0x22, 0x1e, 0x74, 0xaa, 0x00, 0x79, + 0x74, 0x42, 0x01, 0x79, 0x00, 0x18, 0x68, 0x1e, 0xb9, 0x16, 0x00, 0x94, + 0x00, 0x00, 0xd1, 0xd2, 0x60, 0x18, 0xe8, 0xf2, 0x01, 0x00, 0x67, 0x9e, + 0xe0, 0x03, 0x13, 0xaa, 0x00, 0x08, 0x61, 0x1e, 0x01, 0x00, 0x64, 0x9e, + 0x61, 0x52, 0x00, 0xb9, 0xdd, 0x01, 0x00, 0x94, 0xf4, 0x03, 0x00, 0x2a, + 0x40, 0x07, 0x00, 0x35, 0xc1, 0x00, 0x80, 0x52, 0xe0, 0x03, 0x13, 0xaa, + 0x00, 0x03, 0x00, 0x94, 0xe1, 0x03, 0x16, 0xaa, 0x65, 0x02, 0x04, 0x91, + 0x24, 0x20, 0x40, 0x79, 0x00, 0x00, 0x80, 0xd2, 0x23, 0x00, 0x40, 0xf9, + 0x82, 0x04, 0x00, 0x11, 0x42, 0x3c, 0x7f, 0x92, 0x62, 0x08, 0x02, 0x8b, + 0x22, 0x04, 0x00, 0xf9, 0x04, 0x02, 0x00, 0x34, 0x1f, 0x20, 0x03, 0xd5, + 0x40, 0x78, 0x60, 0xbc, 0x61, 0x78, 0x60, 0xbc, 0x00, 0xd8, 0x21, 0x5e, + 0x21, 0xd8, 0x21, 0x5e, 0x02, 0x08, 0x20, 0x1e, 0x22, 0x08, 0x01, 0x1f, + 0x61, 0x78, 0x20, 0xbc, 0x40, 0x78, 0x20, 0xbc, 0x00, 0x04, 0x00, 0x91, + 0x20, 0x14, 0x40, 0xbd, 0x9f, 0x00, 0x00, 0x6b, 0x00, 0x28, 0x22, 0x1e, + 0x20, 0x14, 0x00, 0xbd, 0x68, 0xfe, 0xff, 0x54, 0x21, 0x60, 0x00, 0x91, + 0xbf, 0x00, 0x01, 0xeb, 0xe1, 0xfc, 0xff, 0x54, 0x01, 0x10, 0x6e, 0x1e, + 0x60, 0xfe, 0x40, 0xbd, 0x28, 0x18, 0x68, 0x1e, 0x00, 0xc0, 0x22, 0x1e, + 0x00, 0x08, 0x68, 0x1e, 0x8a, 0x16, 0x00, 0x94, 0x00, 0x00, 0xd1, 0xd2, + 0x62, 0xe6, 0x40, 0xbd, 0x60, 0x18, 0xe8, 0xf2, 0x09, 0x00, 0x67, 0x9e, + 0x01, 0x08, 0x69, 0x1e, 0x40, 0xc0, 0x22, 0x1e, 0x20, 0x00, 0x64, 0x9e, + 0x00, 0x08, 0x68, 0x1e, 0x60, 0x4a, 0x00, 0xb9, 0x80, 0x16, 0x00, 0x94, + 0x00, 0x08, 0x69, 0x1e, 0x00, 0x00, 0x64, 0x9e, 0x60, 0x4e, 0x00, 0xb9, + 0xa4, 0x0b, 0xff, 0x97, 0x1f, 0x1c, 0x00, 0x72, 0xe0, 0x01, 0x00, 0x54, + 0x14, 0x00, 0xb0, 0x52, 0xf9, 0x6b, 0x44, 0xa9, 0xe8, 0x27, 0x46, 0x6d, + 0x24, 0xff, 0xff, 0x17, 0xe8, 0x27, 0x46, 0x6d, 0xe0, 0x03, 0x16, 0xaa, + 0xf9, 0x6b, 0x44, 0xa9, 0x2a, 0x02, 0x00, 0x94, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xcc, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x65, 0xe2, 0x04, 0x91, + 0x64, 0x3e, 0x80, 0x52, 0x14, 0x09, 0x9c, 0x52, 0xa1, 0x08, 0x7f, 0x29, + 0xa3, 0x00, 0x40, 0x29, 0x3f, 0x00, 0x03, 0x6b, 0x65, 0x00, 0x01, 0x4b, + 0x21, 0x00, 0x03, 0x4b, 0x21, 0x80, 0x85, 0x1a, 0x43, 0x00, 0x00, 0x6b, + 0x00, 0x00, 0x02, 0x4b, 0x00, 0x90, 0x83, 0x1a, 0x3f, 0x00, 0x04, 0x6b, + 0x02, 0x90, 0x44, 0x7a, 0x08, 0xfd, 0xff, 0x54, 0xe0, 0x03, 0x13, 0xaa, + 0xe1, 0x00, 0x80, 0x52, 0xae, 0x02, 0x00, 0x94, 0x60, 0x5a, 0x40, 0xf9, + 0xe4, 0x03, 0x17, 0xaa, 0x65, 0x66, 0x40, 0xf9, 0x61, 0xa2, 0x03, 0x91, + 0x83, 0x25, 0x80, 0x52, 0x02, 0x00, 0x80, 0x52, 0x5f, 0xfd, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0x80, 0xfb, 0xff, 0x35, 0x78, 0x0b, 0xff, 0x97, + 0x1f, 0x1c, 0x00, 0x72, 0xa1, 0xfa, 0xff, 0x54, 0xe0, 0x03, 0x13, 0xaa, + 0x01, 0x01, 0x80, 0x52, 0x9f, 0x02, 0x00, 0x94, 0x62, 0xf2, 0x41, 0x79, + 0xe1, 0x03, 0x17, 0xaa, 0x60, 0x66, 0x40, 0xf9, 0x6f, 0xfe, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0x00, 0xfa, 0xff, 0x35, 0x60, 0x9e, 0x40, 0xb9, + 0x61, 0xc6, 0x40, 0xbd, 0x62, 0x8a, 0x40, 0xfd, 0x00, 0x00, 0x63, 0x1e, + 0x74, 0x32, 0x42, 0x79, 0x21, 0xc0, 0x22, 0x1e, 0x75, 0x12, 0x42, 0x79, + 0x79, 0x2a, 0x44, 0x39, 0x9f, 0x02, 0x15, 0x6b, 0x80, 0x02, 0x15, 0x4b, + 0xb7, 0x02, 0x14, 0x4b, 0x20, 0x08, 0x60, 0x1e, 0xf7, 0x92, 0x80, 0x1a, + 0x40, 0x18, 0x60, 0x1e, 0x36, 0x16, 0x00, 0x94, 0x00, 0x00, 0xd1, 0xd2, + 0x9f, 0x02, 0x00, 0x71, 0x60, 0x1a, 0xe8, 0xf2, 0x01, 0x00, 0x67, 0x9e, + 0xe0, 0x1a, 0x43, 0x7a, 0x00, 0x08, 0x61, 0x1e, 0x00, 0x00, 0x64, 0x9e, + 0x88, 0x0e, 0x00, 0x54, 0xa1, 0x06, 0x00, 0x51, 0x75, 0x12, 0x03, 0x78, + 0x21, 0x3c, 0x00, 0x12, 0x79, 0xce, 0x00, 0x39, 0x3f, 0xf0, 0x0a, 0x71, + 0x60, 0x36, 0x00, 0xb9, 0xb5, 0x32, 0x9f, 0x1a, 0xe0, 0x03, 0x13, 0xaa, + 0x21, 0x01, 0x80, 0x52, 0x78, 0x02, 0x00, 0x94, 0xe4, 0x3b, 0x40, 0xf9, + 0xe2, 0x03, 0x15, 0x2a, 0x60, 0x5a, 0x40, 0xf9, 0xe1, 0x03, 0x16, 0xaa, + 0x65, 0x66, 0x40, 0xf9, 0x83, 0x57, 0x80, 0x52, 0x29, 0xfd, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0xc0, 0xf4, 0xff, 0x35, 0x42, 0x0b, 0xff, 0x97, + 0x1f, 0x1c, 0x00, 0x72, 0xe1, 0xf3, 0xff, 0x54, 0xe0, 0x03, 0x13, 0xaa, + 0x41, 0x01, 0x80, 0x52, 0x69, 0x02, 0x00, 0x94, 0x62, 0xc2, 0x41, 0x79, + 0xe1, 0x3b, 0x40, 0xf9, 0x60, 0x66, 0x40, 0xf9, 0x39, 0xfe, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0x40, 0xf3, 0xff, 0x35, 0x61, 0x8a, 0x40, 0xfd, + 0x60, 0x96, 0x40, 0xfd, 0x20, 0x18, 0x60, 0x1e, 0x0b, 0x16, 0x00, 0x94, + 0x00, 0x00, 0xd1, 0xd2, 0x60, 0x1a, 0xe8, 0xf2, 0x01, 0x00, 0x67, 0x9e, + 0x61, 0x46, 0x40, 0xf9, 0x00, 0x08, 0x61, 0x1e, 0x22, 0x8c, 0x40, 0x29, + 0x00, 0x00, 0x64, 0x9e, 0x00, 0x00, 0x03, 0x4b, 0x1f, 0x00, 0x02, 0x6b, + 0xcc, 0x00, 0x00, 0x54, 0x63, 0x42, 0x42, 0x79, 0x62, 0x8a, 0x44, 0x39, + 0x60, 0x1e, 0x00, 0xb9, 0x63, 0x42, 0x00, 0x79, 0x62, 0x8a, 0x00, 0x39, + 0x24, 0x40, 0x40, 0x39, 0xe4, 0x02, 0x00, 0x34, 0x62, 0xa2, 0x40, 0xf9, + 0x03, 0x00, 0x80, 0x92, 0x26, 0x0c, 0x40, 0xb9, 0x63, 0x20, 0xc4, 0x9a, + 0xe3, 0x03, 0x23, 0xaa, 0x1f, 0x00, 0x06, 0x6b, 0x62, 0x04, 0x02, 0x8a, + 0xe3, 0xc7, 0x9f, 0x9a, 0x42, 0x00, 0x03, 0xaa, 0x40, 0x00, 0x67, 0x9e, + 0x62, 0xa2, 0x00, 0xf9, 0x00, 0x58, 0x20, 0x0e, 0x23, 0x44, 0x40, 0x39, + 0x00, 0xb8, 0x31, 0x0e, 0x02, 0x3c, 0x01, 0x0e, 0x5f, 0x00, 0x03, 0xeb, + 0xc3, 0x00, 0x00, 0x54, 0x62, 0xe2, 0x47, 0xb8, 0x74, 0x09, 0x9c, 0x52, + 0x7f, 0xa2, 0x00, 0xf9, 0x42, 0x04, 0x00, 0x11, 0x62, 0xe2, 0x07, 0xb8, + 0x24, 0x58, 0x40, 0x39, 0x25, 0x48, 0x00, 0x91, 0x84, 0xed, 0xff, 0x34, + 0x62, 0xa6, 0x40, 0xf9, 0x03, 0x00, 0x80, 0x92, 0x26, 0x20, 0x41, 0xb8, + 0x61, 0x20, 0xc4, 0x9a, 0xe1, 0x03, 0x21, 0xaa, 0x1f, 0x00, 0x06, 0x6b, + 0x20, 0x04, 0x02, 0x8a, 0xe1, 0xc7, 0x9f, 0x9a, 0x00, 0x00, 0x01, 0xaa, + 0x00, 0x00, 0x67, 0x9e, 0x60, 0xa6, 0x00, 0xf9, 0x00, 0x58, 0x20, 0x0e, + 0xa1, 0x14, 0x40, 0x39, 0x00, 0xb8, 0x31, 0x0e, 0x00, 0x3c, 0x01, 0x0e, + 0x1f, 0x00, 0x01, 0xeb, 0x63, 0xeb, 0xff, 0x54, 0x62, 0x22, 0x48, 0xb8, + 0x21, 0x00, 0x80, 0x52, 0x60, 0x02, 0x40, 0x39, 0x42, 0x04, 0x00, 0x11, + 0x62, 0x22, 0x08, 0xb8, 0x7f, 0xa6, 0x00, 0xf9, 0x81, 0x63, 0xff, 0x97, + 0xf4, 0x03, 0x00, 0x2a, 0x9f, 0x02, 0x00, 0x71, 0x80, 0x09, 0x9c, 0x52, + 0x94, 0x12, 0x80, 0x1a, 0xf9, 0x6b, 0x44, 0xa9, 0xe8, 0x27, 0x46, 0x6d, + 0x64, 0xfe, 0xff, 0x17, 0xfb, 0x73, 0x45, 0xa9, 0x88, 0x02, 0x62, 0x1e, + 0x00, 0x3a, 0xe8, 0xd2, 0x01, 0x00, 0x67, 0x9e, 0x60, 0xc6, 0x40, 0xbd, + 0x08, 0x09, 0x61, 0x1e, 0xfe, 0xfe, 0xff, 0x17, 0x79, 0xce, 0x00, 0x39, + 0x54, 0x09, 0x9c, 0x52, 0x75, 0x12, 0x03, 0x78, 0xf9, 0x6b, 0x44, 0xa9, + 0xe8, 0x27, 0x46, 0x6d, 0x60, 0x36, 0x00, 0xb9, 0x56, 0xfe, 0xff, 0x17, + 0x08, 0xe4, 0x00, 0x2f, 0xf5, 0xfe, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xe2, 0x03, 0x00, 0xaa, 0x00, 0x00, 0x40, 0x39, 0x01, 0x00, 0x80, 0x52, + 0x5f, 0x30, 0x02, 0x79, 0x5f, 0x7c, 0x14, 0xa9, 0x63, 0x63, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0x62, 0x08, 0x00, 0xb4, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0xf4, 0x03, 0x02, 0xaa, 0xe0, 0x08, 0x00, 0xb4, + 0xf5, 0x13, 0x00, 0xf9, 0x25, 0x1c, 0x00, 0x12, 0xbf, 0x04, 0x00, 0x71, + 0xc1, 0x05, 0x00, 0x54, 0x75, 0x06, 0x40, 0xf9, 0x64, 0x06, 0x40, 0xb9, + 0xa5, 0x22, 0x40, 0xb9, 0x9f, 0x00, 0x05, 0x6b, 0x41, 0x04, 0x00, 0x54, + 0xa3, 0x02, 0x40, 0xf9, 0xc3, 0x08, 0x00, 0xb4, 0xa2, 0x0e, 0x40, 0xf9, + 0xe2, 0x09, 0x00, 0xb4, 0x41, 0x1c, 0x40, 0xb9, 0x00, 0x2a, 0x9c, 0x52, + 0xe1, 0x02, 0x18, 0x37, 0x20, 0x2a, 0x9c, 0x52, 0xa1, 0x02, 0x20, 0x37, + 0x3f, 0x04, 0x40, 0xf2, 0x60, 0x27, 0x9c, 0x52, 0x41, 0x02, 0x00, 0x54, + 0xc0, 0x2a, 0x9c, 0x52, 0x01, 0x02, 0x00, 0x35, 0x42, 0x18, 0x40, 0xb9, + 0x00, 0x2a, 0x9c, 0x52, 0x81, 0x9e, 0x40, 0xb9, 0x5f, 0x00, 0x01, 0x6b, + 0x61, 0x01, 0x00, 0x54, 0x81, 0x02, 0x41, 0xb9, 0x02, 0x03, 0x80, 0xd2, + 0xf5, 0x13, 0x40, 0xf9, 0x00, 0x00, 0x80, 0x52, 0x21, 0x50, 0x02, 0x9b, + 0x23, 0x68, 0x00, 0xf9, 0x82, 0x42, 0x41, 0x79, 0x22, 0xc0, 0x01, 0x79, + 0xf3, 0x53, 0x41, 0xa9, 0x03, 0x00, 0x00, 0x14, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x83, 0x00, 0x00, 0xb0, 0x82, 0xdc, 0x83, 0x12, 0x63, 0xa0, 0x1c, 0x91, + 0x01, 0x16, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x0e, 0x57, 0xff, 0x97, + 0xd9, 0xff, 0xff, 0x17, 0x44, 0x00, 0x40, 0x39, 0x83, 0x00, 0x00, 0xb0, + 0x82, 0xdc, 0x83, 0x12, 0x63, 0x00, 0x1c, 0x91, 0x01, 0x16, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x06, 0x57, 0xff, 0x97, 0x75, 0x06, 0x40, 0xf9, + 0x64, 0x06, 0x40, 0xb9, 0xa5, 0x22, 0x40, 0xb9, 0x9f, 0x00, 0x05, 0x6b, + 0xa0, 0xf9, 0xff, 0x54, 0xed, 0xff, 0xff, 0x17, 0x00, 0x02, 0x80, 0x52, + 0x83, 0x00, 0x00, 0xb0, 0x63, 0xe0, 0x1a, 0x91, 0xc2, 0xd4, 0x83, 0x12, + 0x01, 0x16, 0x80, 0x52, 0xfa, 0x56, 0xff, 0x97, 0x20, 0x2b, 0x9c, 0x52, + 0xe3, 0xff, 0xff, 0x17, 0x44, 0x00, 0x40, 0x39, 0x00, 0x02, 0x80, 0x52, + 0x83, 0x00, 0x00, 0xb0, 0xc2, 0xd4, 0x83, 0x12, 0x63, 0x60, 0x1b, 0x91, + 0x01, 0x16, 0x80, 0x52, 0xf1, 0x56, 0xff, 0x97, 0x20, 0x2b, 0x9c, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xd9, 0xff, 0xff, 0x17, 0x84, 0x02, 0x40, 0x39, + 0x83, 0x00, 0x00, 0xb0, 0x63, 0x40, 0x1d, 0x91, 0xc2, 0xd4, 0x83, 0x12, + 0x00, 0x02, 0x80, 0x52, 0x01, 0x16, 0x80, 0x52, 0xe7, 0x56, 0xff, 0x97, + 0x20, 0x2b, 0x9c, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xce, 0xff, 0xff, 0x17, 0x83, 0x00, 0x00, 0xb0, 0x84, 0x02, 0x40, 0x39, + 0x63, 0xc0, 0x1d, 0x91, 0xc2, 0xd4, 0x83, 0x12, 0xf5, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0x22, 0x10, 0x00, 0x91, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0x13, 0x1c, 0x00, 0x12, + 0xe3, 0xbf, 0x00, 0x91, 0xe0, 0x03, 0x13, 0x2a, 0xa5, 0x2c, 0xff, 0x97, + 0xa0, 0x00, 0x00, 0x35, 0x00, 0x00, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe4, 0x03, 0x13, 0x2a, + 0xe2, 0x03, 0x00, 0x2a, 0x01, 0x16, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0x83, 0x00, 0x00, 0xb0, 0x63, 0x40, 0x1e, 0x91, 0xc9, 0x56, 0xff, 0x97, + 0xe0, 0x08, 0x9c, 0x52, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x82, 0x01, 0x00, 0xb4, 0x40, 0x98, 0x40, 0xb9, 0x80, 0x00, 0x00, 0x34, + 0x00, 0x00, 0x80, 0x52, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x40, 0x00, 0x40, 0x39, 0x3f, 0x82, 0xff, 0x97, 0x60, 0xff, 0xff, 0x34, + 0x00, 0x2b, 0x9c, 0x52, 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x02, 0x80, 0x52, 0x83, 0x00, 0x00, 0xb0, 0x63, 0xc0, 0x1e, 0x91, + 0xc2, 0xd4, 0x83, 0x12, 0x01, 0x16, 0x80, 0x52, 0xb1, 0x56, 0xff, 0x97, + 0x20, 0x2b, 0x9c, 0x52, 0xf1, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbf, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x61, 0x02, 0x00, 0xb4, 0xe2, 0x03, 0x00, 0xaa, 0x20, 0x00, 0x41, 0xb9, + 0x20, 0x90, 0x00, 0xb9, 0x20, 0x04, 0x49, 0x38, 0xbd, 0x81, 0xff, 0x97, + 0xe2, 0x03, 0x00, 0x2a, 0x00, 0x00, 0x80, 0x52, 0x62, 0x00, 0x00, 0x35, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x01, 0x16, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0x83, 0x00, 0x00, 0xb0, 0x63, 0x20, 0x20, 0x91, + 0x9b, 0x56, 0xff, 0x97, 0x60, 0x21, 0x9c, 0x52, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xc2, 0xd4, 0x83, 0x12, 0x01, 0x16, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x83, 0x00, 0x00, 0xb0, 0x63, 0x60, 0x1f, 0x91, + 0x92, 0x56, 0xff, 0x97, 0x20, 0x2b, 0x9c, 0x52, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0x40, 0x02, 0x00, 0xb4, + 0x02, 0x00, 0x41, 0xb9, 0x21, 0x00, 0x80, 0xd2, 0x00, 0x00, 0x40, 0x39, + 0x5f, 0x04, 0x00, 0x71, 0xe0, 0x1f, 0x00, 0xb9, 0xe0, 0x07, 0x9f, 0x1a, + 0xe1, 0x43, 0x02, 0xf8, 0x00, 0x0c, 0x00, 0x11, 0xe0, 0x1b, 0x00, 0xb9, + 0x50, 0x25, 0xff, 0x97, 0x1f, 0x00, 0x00, 0x71, 0xe1, 0x07, 0x9f, 0x1a, + 0xe0, 0x63, 0x00, 0x91, 0xe1, 0x83, 0x00, 0x39, 0x4b, 0x17, 0xff, 0x97, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x02, 0x80, 0x52, + 0x83, 0x00, 0x00, 0xb0, 0x63, 0x60, 0x1f, 0x91, 0xc2, 0xd4, 0x83, 0x12, + 0x01, 0x16, 0x80, 0x52, 0x73, 0x56, 0xff, 0x97, 0x20, 0x2b, 0x9c, 0x52, + 0xf7, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xb4, 0xa9, 0x05, 0x00, 0x00, 0x90, + 0xa5, 0x40, 0x3d, 0x91, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x04, 0x00, 0x00, 0x90, 0x84, 0x40, 0x3b, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0x03, 0x00, 0x00, 0x90, 0x63, 0xc0, 0x31, 0x91, 0x08, 0x00, 0x40, 0x39, + 0x02, 0x00, 0x00, 0x90, 0x42, 0xc0, 0x39, 0x91, 0xf3, 0x03, 0x00, 0xaa, + 0x27, 0x00, 0x80, 0x52, 0x46, 0x01, 0x80, 0x52, 0xe9, 0x03, 0x00, 0xb2, + 0x21, 0x00, 0x80, 0x52, 0x01, 0x00, 0x01, 0xb9, 0x81, 0x00, 0x80, 0x52, + 0xe9, 0x47, 0x00, 0xf9, 0x15, 0x00, 0x80, 0x52, 0xe8, 0x43, 0x02, 0x39, + 0xe7, 0x47, 0x02, 0x39, 0xff, 0x27, 0x01, 0x79, 0xe6, 0x97, 0x00, 0xb9, + 0xe5, 0x93, 0x09, 0xa9, 0xe3, 0x8b, 0x0a, 0xa9, 0xe0, 0x5f, 0x00, 0xf9, + 0x0b, 0x01, 0x00, 0x94, 0x60, 0x02, 0x40, 0x39, 0x61, 0xc2, 0x04, 0x91, + 0x74, 0xff, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0xc0, 0x01, 0x00, 0x34, + 0x01, 0x2a, 0x9c, 0x52, 0x9f, 0x02, 0x01, 0x6b, 0xa0, 0x0a, 0x00, 0x54, + 0x20, 0x2a, 0x9c, 0x52, 0x9f, 0x02, 0x00, 0x6b, 0x00, 0x0b, 0x00, 0x54, + 0x9f, 0x02, 0x00, 0x71, 0x94, 0x12, 0x95, 0x1a, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xcc, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x8f, 0x48, 0xa9, 0xe2, 0x0f, 0x03, 0xa9, + 0xe1, 0xc3, 0x01, 0x91, 0xe2, 0x8f, 0x49, 0xa9, 0xe2, 0x0f, 0x04, 0xa9, + 0xe0, 0xc3, 0x00, 0x91, 0xe2, 0x8f, 0x4a, 0xa9, 0xe2, 0x0f, 0x05, 0xa9, + 0xe2, 0x5f, 0x40, 0xf9, 0xe2, 0x33, 0x00, 0xf9, 0x12, 0x13, 0xff, 0x97, + 0xf6, 0x03, 0x00, 0x2a, 0x4c, 0x1d, 0xff, 0x97, 0x60, 0x1e, 0x00, 0xf9, + 0xe1, 0xc3, 0x41, 0x39, 0x64, 0xa2, 0x45, 0xb8, 0x63, 0xe2, 0x45, 0xb8, + 0x62, 0x22, 0x46, 0xb8, 0x84, 0x00, 0x01, 0x0b, 0xe7, 0xcb, 0x41, 0x39, + 0x61, 0x12, 0x44, 0x39, 0xe6, 0xc7, 0x41, 0x39, 0x63, 0x00, 0x07, 0x0b, + 0xe5, 0xd7, 0x41, 0x39, 0x42, 0x00, 0x06, 0x0b, 0x64, 0xa2, 0x05, 0xb8, + 0x21, 0x00, 0x05, 0x2a, 0x63, 0xe2, 0x05, 0xb8, 0x62, 0x22, 0x06, 0xb8, + 0x61, 0x12, 0x04, 0x39, 0x16, 0x07, 0x00, 0x35, 0x42, 0x00, 0x80, 0x52, + 0x7f, 0x02, 0x01, 0xb9, 0xe0, 0x03, 0x13, 0xaa, 0xa1, 0x00, 0x80, 0x52, + 0xe2, 0x8b, 0x00, 0xb9, 0xd4, 0x00, 0x00, 0x94, 0xe2, 0x8f, 0x48, 0xa9, + 0xe2, 0x0f, 0x03, 0xa9, 0xe1, 0xc3, 0x01, 0x91, 0xe6, 0x9f, 0x49, 0xa9, + 0xe0, 0xc3, 0x00, 0x91, 0xe4, 0x97, 0x4a, 0xa9, 0xe6, 0x1f, 0x04, 0xa9, + 0xe2, 0x5f, 0x40, 0xf9, 0xe4, 0x17, 0x05, 0xa9, 0xe2, 0x33, 0x00, 0xf9, + 0xed, 0x12, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, 0x60, 0x02, 0x40, 0x39, + 0x61, 0xe2, 0x04, 0x91, 0x31, 0xff, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, + 0x23, 0x1d, 0xff, 0x97, 0x60, 0x22, 0x00, 0xf9, 0xe1, 0xc3, 0x41, 0x39, + 0x64, 0xa2, 0x45, 0xb8, 0x63, 0xe2, 0x45, 0xb8, 0x62, 0x22, 0x46, 0xb8, + 0x84, 0x00, 0x01, 0x0b, 0xe7, 0xcb, 0x41, 0x39, 0x61, 0x12, 0x44, 0x39, + 0xe6, 0xc7, 0x41, 0x39, 0x63, 0x00, 0x07, 0x0b, 0xe5, 0xd7, 0x41, 0x39, + 0x42, 0x00, 0x06, 0x0b, 0x64, 0xa2, 0x05, 0xb8, 0x21, 0x00, 0x05, 0x2a, + 0x63, 0xe2, 0x05, 0xb8, 0x62, 0x22, 0x06, 0xb8, 0x61, 0x12, 0x04, 0x39, + 0x01, 0x2a, 0x9c, 0x52, 0x9f, 0x02, 0x01, 0x6b, 0xa1, 0xf5, 0xff, 0x54, + 0x54, 0x21, 0x9c, 0x52, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xcc, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xb4, 0x21, 0x9c, 0x52, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xcc, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf5, 0x03, 0x14, 0x2a, 0xf4, 0x03, 0x16, 0x2a, 0x9b, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0x01, 0x00, 0x40, 0xf9, + 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, 0x61, 0x00, 0x00, 0xb4, + 0x5a, 0x81, 0xff, 0x97, 0x40, 0x02, 0x00, 0x35, 0x60, 0x0e, 0x40, 0xf9, + 0x80, 0x00, 0x00, 0xb4, 0x60, 0x62, 0x00, 0x91, 0x55, 0x81, 0xff, 0x97, + 0x80, 0x00, 0x00, 0x35, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x0b, 0x40, 0xf9, 0xe2, 0x03, 0x00, 0x2a, + 0xfd, 0x7b, 0xc2, 0xa8, 0x83, 0x00, 0x00, 0x90, 0x24, 0x00, 0x80, 0x52, + 0x63, 0xa0, 0x20, 0x91, 0x01, 0x16, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0xcc, 0x55, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0x83, 0x00, 0x00, 0x90, + 0x04, 0x00, 0x80, 0x52, 0x63, 0xa0, 0x20, 0x91, 0x01, 0x16, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xc5, 0x55, 0xff, 0x97, 0xe8, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbd, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x01, 0xaa, 0x14, 0x1c, 0x00, 0x12, 0x21, 0x04, 0x40, 0xf9, + 0xe0, 0x03, 0x14, 0x2a, 0xf5, 0x13, 0x00, 0xf9, 0x5c, 0x81, 0xff, 0x97, + 0x40, 0x02, 0x00, 0x35, 0x60, 0x06, 0x40, 0xf9, 0x00, 0xf8, 0x5f, 0x79, + 0xe0, 0x04, 0x00, 0x34, 0x15, 0x00, 0x80, 0x52, 0x60, 0x22, 0x00, 0x79, + 0xe0, 0x03, 0x14, 0x2a, 0x2c, 0x24, 0xff, 0x97, 0x00, 0x1c, 0x00, 0x12, + 0x01, 0x00, 0x80, 0x52, 0x1f, 0x04, 0x00, 0x71, 0xa0, 0x02, 0x00, 0x54, + 0x61, 0x4a, 0x00, 0x39, 0xe0, 0x03, 0x15, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe2, 0x03, 0x00, 0x2a, 0xe4, 0x03, 0x14, 0x2a, 0x83, 0x00, 0x00, 0x90, + 0x63, 0x60, 0x21, 0x91, 0x01, 0x16, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0x9f, 0x55, 0xff, 0x97, 0xd5, 0x2c, 0x9c, 0x52, 0xe0, 0x03, 0x14, 0x2a, + 0x18, 0x24, 0xff, 0x97, 0x00, 0x1c, 0x00, 0x12, 0x01, 0x00, 0x80, 0x52, + 0x1f, 0x04, 0x00, 0x71, 0xa1, 0xfd, 0xff, 0x54, 0xe0, 0x03, 0x14, 0x2a, + 0x1a, 0x24, 0xff, 0x97, 0x1f, 0x1c, 0x00, 0x72, 0xe0, 0x03, 0x15, 0x2a, + 0xe1, 0x17, 0x9f, 0x1a, 0x61, 0x4a, 0x00, 0x39, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe4, 0x03, 0x14, 0x2a, 0x83, 0x00, 0x00, 0x90, 0x02, 0x00, 0x80, 0x52, + 0x63, 0x00, 0x22, 0x91, 0x01, 0x16, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0xf5, 0x2c, 0x9c, 0x52, 0x86, 0x55, 0xff, 0x97, 0xd4, 0xff, 0xff, 0x17, + 0xfd, 0x7b, 0xbe, 0xa9, 0x01, 0x1c, 0x40, 0x92, 0xc2, 0x0e, 0x00, 0x90, + 0x42, 0xc0, 0x0f, 0x91, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x13, 0x49, 0x80, 0xd2, 0x14, 0x1c, 0x00, 0x12, 0x33, 0x7c, 0x13, 0x9b, + 0x73, 0x9a, 0x07, 0x91, 0x73, 0x02, 0x02, 0x8b, 0x1f, 0x20, 0x03, 0xd5, + 0xe0, 0x03, 0x13, 0xaa, 0x01, 0x00, 0x80, 0x12, 0xf2, 0x31, 0xff, 0x97, + 0x1f, 0x68, 0x08, 0x71, 0x80, 0xff, 0xff, 0x54, 0x80, 0x00, 0x00, 0x35, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe5, 0x03, 0x14, 0x2a, 0xe4, 0x03, 0x00, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xe2, 0x03, 0x00, 0x2a, 0xfd, 0x7b, 0xc2, 0xa8, 0x83, 0x00, 0x00, 0x90, + 0x01, 0x16, 0x80, 0x52, 0x63, 0x80, 0x22, 0x91, 0x00, 0x02, 0x80, 0x52, + 0x66, 0x55, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0x01, 0x1c, 0x40, 0x92, 0x03, 0x49, 0x80, 0xd2, 0xfd, 0x03, 0x00, 0x91, + 0xc2, 0x0e, 0x00, 0x90, 0x42, 0xc0, 0x0f, 0x91, 0xf3, 0x0b, 0x00, 0xf9, + 0x13, 0x1c, 0x00, 0x12, 0x20, 0x7c, 0x03, 0x9b, 0x00, 0x98, 0x07, 0x91, + 0x40, 0x00, 0x00, 0x8b, 0xc9, 0x31, 0xff, 0x97, 0x80, 0x00, 0x00, 0x35, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe5, 0x03, 0x13, 0x2a, 0xe4, 0x03, 0x00, 0x2a, 0xf3, 0x0b, 0x40, 0xf9, + 0xe2, 0x03, 0x00, 0x2a, 0xfd, 0x7b, 0xc2, 0xa8, 0x83, 0x00, 0x00, 0x90, + 0x01, 0x16, 0x80, 0x52, 0x63, 0x40, 0x23, 0x91, 0x00, 0x02, 0x80, 0x52, + 0x4b, 0x55, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe4, 0x03, 0x01, 0x2a, 0x82, 0x0c, 0x80, 0x52, 0x65, 0x74, 0x91, 0x52, + 0xc5, 0x45, 0xb7, 0x72, 0xe3, 0x03, 0x00, 0xaa, 0x00, 0x00, 0x40, 0x39, + 0x82, 0x7c, 0x02, 0x1b, 0x21, 0x00, 0x80, 0x52, 0x00, 0x80, 0x00, 0x51, + 0x21, 0x20, 0xc4, 0x1a, 0x64, 0x04, 0x00, 0xb9, 0x42, 0x7c, 0xa5, 0x9b, + 0x42, 0xfc, 0x63, 0xd3, 0x62, 0x0c, 0x00, 0xb9, 0x1a, 0x55, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, 0x22, 0x00, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xd3, 0x0e, 0x00, 0x90, + 0x73, 0x02, 0x0d, 0x91, 0x73, 0x62, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, + 0x95, 0x00, 0x00, 0x90, 0xb5, 0x02, 0x24, 0x91, 0xe0, 0x03, 0x13, 0xaa, + 0xe1, 0x03, 0x15, 0xaa, 0x16, 0x00, 0x80, 0x52, 0xf7, 0x63, 0x03, 0xa9, + 0x97, 0x00, 0x00, 0x90, 0xf7, 0x62, 0x24, 0x91, 0x98, 0x00, 0x00, 0x90, + 0x18, 0x03, 0x25, 0x91, 0x4a, 0x31, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0x20, 0x03, 0x00, 0x35, 0x00, 0xfe, 0x87, 0xd2, 0xc6, 0x24, 0xff, 0x97, + 0x60, 0x02, 0x1f, 0xf8, 0x80, 0x03, 0x00, 0xb4, 0x00, 0x6e, 0x80, 0xd2, + 0xc2, 0x24, 0xff, 0x97, 0x60, 0x82, 0x1f, 0xf8, 0xe0, 0x03, 0x00, 0xb4, + 0x00, 0x00, 0x80, 0x12, 0x60, 0x82, 0x1e, 0x38, 0x73, 0x62, 0x01, 0x91, + 0xd6, 0x00, 0x00, 0x34, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe1, 0x03, 0x15, 0xaa, 0xe0, 0x03, 0x13, 0xaa, 0x22, 0x00, 0x80, 0x52, + 0x36, 0x00, 0x80, 0x52, 0x32, 0x31, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0x20, 0xfd, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, 0xe4, 0x03, 0x16, 0x2a, + 0xe3, 0x03, 0x17, 0xaa, 0x01, 0x16, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x06, 0x55, 0xff, 0x97, 0xe2, 0xff, 0xff, 0x17, 0xe4, 0x03, 0x16, 0x2a, + 0xe3, 0x03, 0x18, 0xaa, 0xe2, 0x03, 0x14, 0x2a, 0x01, 0x16, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xff, 0x54, 0xff, 0x97, 0xdf, 0xff, 0xff, 0x17, + 0xe2, 0x03, 0x14, 0x2a, 0xe4, 0x03, 0x16, 0x2a, 0x83, 0x00, 0x00, 0x90, + 0x01, 0x16, 0x80, 0x52, 0x63, 0x80, 0x25, 0x91, 0x00, 0x02, 0x80, 0x52, + 0xf7, 0x54, 0xff, 0x97, 0xdb, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf4, 0x03, 0x00, 0x2a, 0xf5, 0x5b, 0x02, 0xa9, 0xf7, 0x1b, 0x00, 0xf9, + 0x36, 0x0b, 0xff, 0x97, 0x16, 0x1c, 0x00, 0x12, 0xf3, 0x03, 0x00, 0x2a, + 0xdf, 0x0e, 0x00, 0x71, 0xf7, 0x97, 0x9f, 0x1a, 0xf4, 0x06, 0x00, 0x34, + 0x80, 0x06, 0x00, 0x51, 0x1f, 0x00, 0x14, 0x6a, 0x81, 0x06, 0x00, 0x54, + 0x73, 0x1e, 0x00, 0x12, 0x14, 0x49, 0x80, 0x52, 0xd5, 0x0e, 0x00, 0x90, + 0xb5, 0xc2, 0x0f, 0x91, 0x81, 0x00, 0x00, 0x90, 0x21, 0x00, 0x27, 0x91, + 0x74, 0x7e, 0xb4, 0x9b, 0x80, 0x9a, 0x07, 0x91, 0xa0, 0x02, 0x00, 0x8b, + 0x30, 0x31, 0xff, 0x97, 0x00, 0x06, 0x00, 0x35, 0xf7, 0x7e, 0x40, 0x93, + 0xc1, 0x0e, 0x00, 0x90, 0x21, 0x00, 0x0d, 0x91, 0x03, 0x0b, 0x80, 0xd2, + 0x64, 0x7e, 0x40, 0x93, 0x00, 0x49, 0x80, 0xd2, 0x08, 0xd4, 0x90, 0xd2, + 0x28, 0x00, 0xa0, 0xf2, 0xe1, 0x06, 0x03, 0x9b, 0xc2, 0x0e, 0x00, 0x90, + 0x42, 0x40, 0x12, 0x91, 0x84, 0x7c, 0x00, 0x9b, 0x43, 0xfe, 0x85, 0xd2, + 0x08, 0xc4, 0xc9, 0xf2, 0xa0, 0x02, 0x04, 0x8b, 0x82, 0x00, 0x02, 0x8b, + 0x25, 0x84, 0x40, 0xa9, 0xb4, 0x02, 0x14, 0x8b, 0x1f, 0x7c, 0x00, 0xa9, + 0x27, 0x00, 0x80, 0x52, 0x66, 0x00, 0x80, 0xd2, 0x1f, 0x08, 0x00, 0xf9, + 0x06, 0xd4, 0xd0, 0xf2, 0x26, 0x00, 0xe0, 0xf2, 0x16, 0x60, 0x00, 0x39, + 0xa9, 0x00, 0x03, 0x8b, 0x05, 0xa4, 0x0c, 0xa9, 0x01, 0x70, 0x00, 0xf9, + 0xa8, 0x6a, 0x24, 0xf8, 0x1f, 0xfc, 0x0a, 0xa9, 0x14, 0x50, 0x00, 0xf9, + 0x07, 0x58, 0x01, 0x79, 0x1f, 0x5c, 0x00, 0xf9, 0x1f, 0xc0, 0x00, 0xb9, + 0x46, 0x08, 0x00, 0xf9, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x83, 0x00, 0x00, 0x90, 0x63, 0x00, 0x26, 0x91, 0xc2, 0xfe, 0x83, 0x12, + 0x01, 0x16, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0xad, 0x54, 0xff, 0x97, + 0xc7, 0xff, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0xe4, 0x03, 0x13, 0x2a, + 0x83, 0x00, 0x00, 0x90, 0x01, 0x16, 0x80, 0x52, 0x63, 0x40, 0x27, 0x91, + 0x00, 0x02, 0x80, 0x52, 0xa5, 0x54, 0xff, 0x97, 0xca, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xba, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x14, 0x49, 0x80, 0xd2, 0xf5, 0x5b, 0x02, 0xa9, 0xd6, 0x0e, 0x00, 0x90, + 0xd6, 0xc2, 0x0f, 0x91, 0xf7, 0x63, 0x03, 0xa9, 0xe0, 0x0a, 0xff, 0x97, + 0x17, 0x1c, 0x00, 0x12, 0x02, 0x03, 0x80, 0xd2, 0x15, 0x49, 0x80, 0x52, + 0xf8, 0x7e, 0x40, 0x93, 0x13, 0x1c, 0x00, 0x12, 0xf5, 0x0a, 0xb5, 0x9b, + 0x21, 0x00, 0x80, 0x52, 0x14, 0x5b, 0x14, 0x9b, 0xd5, 0x02, 0x15, 0x8b, + 0x80, 0x62, 0x40, 0x39, 0x9f, 0x1e, 0x00, 0xb9, 0x9f, 0x26, 0x00, 0xb9, + 0x00, 0x80, 0x00, 0x51, 0x6a, 0x54, 0xff, 0x97, 0x15, 0x08, 0xff, 0x97, + 0x1f, 0x1c, 0x00, 0x72, 0xa1, 0x14, 0x00, 0x54, 0xf9, 0x6b, 0x04, 0xa9, + 0x22, 0x01, 0x80, 0x52, 0x80, 0x62, 0x40, 0x39, 0xfb, 0x73, 0x05, 0xa9, + 0x23, 0x00, 0x80, 0x52, 0x41, 0x00, 0x80, 0x52, 0x83, 0x1e, 0x00, 0xb9, + 0x00, 0x80, 0x00, 0x51, 0x82, 0x26, 0x00, 0xb9, 0x1b, 0x0b, 0x80, 0xd2, + 0xd9, 0x0e, 0x00, 0x90, 0x39, 0x03, 0x0d, 0x91, 0x5a, 0x54, 0xff, 0x97, + 0x7f, 0x0e, 0x00, 0x71, 0x01, 0x00, 0x80, 0x12, 0x74, 0x83, 0x9f, 0x9a, + 0xfa, 0x97, 0x9f, 0x1a, 0x94, 0x62, 0x00, 0x91, 0x34, 0x03, 0x14, 0x8b, + 0xe0, 0x03, 0x14, 0xaa, 0xba, 0x30, 0xff, 0x97, 0x1f, 0x68, 0x08, 0x71, + 0x60, 0x12, 0x00, 0x54, 0x80, 0x0e, 0x00, 0x35, 0x5c, 0x7f, 0x40, 0x93, + 0xe0, 0x03, 0x15, 0xaa, 0x9b, 0x7f, 0x1b, 0x9b, 0x33, 0x6b, 0x3b, 0x38, + 0x4a, 0xfb, 0xff, 0x97, 0xe1, 0x03, 0x00, 0x2a, 0xe0, 0x03, 0x14, 0xaa, + 0xf4, 0x03, 0x01, 0x2a, 0xa2, 0x30, 0xff, 0x97, 0x40, 0x0f, 0x00, 0x35, + 0x01, 0x0b, 0x80, 0xd2, 0x00, 0x00, 0x80, 0x12, 0x9c, 0x7f, 0x01, 0x9b, + 0x20, 0x6b, 0x3c, 0x38, 0xd4, 0x03, 0x00, 0x34, 0xa0, 0x22, 0x00, 0x91, + 0x01, 0x00, 0xb0, 0x52, 0x9f, 0x02, 0x01, 0x6b, 0x01, 0x0c, 0x40, 0xb9, + 0x21, 0x04, 0x00, 0x11, 0x01, 0x0c, 0x00, 0xb9, 0x61, 0x09, 0x00, 0x54, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0x01, 0xe0, 0x44, 0xb8, + 0x21, 0x04, 0x00, 0x11, 0x01, 0xe0, 0x04, 0xb8, 0xe0, 0x03, 0x13, 0x2a, + 0xce, 0xfe, 0xff, 0x97, 0x00, 0x49, 0x80, 0xd2, 0xc2, 0x0f, 0x80, 0xd2, + 0x14, 0x00, 0x80, 0x52, 0x00, 0x5b, 0x00, 0x9b, 0x01, 0x80, 0x00, 0x91, + 0x00, 0xa0, 0x05, 0x91, 0x9b, 0x14, 0x00, 0x94, 0xe0, 0x03, 0x13, 0x2a, + 0xe5, 0xfe, 0xff, 0x97, 0xe0, 0x03, 0x14, 0x2a, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x19, 0x49, 0x80, 0xd2, 0x82, 0x0c, 0x80, 0x52, + 0x63, 0x01, 0x80, 0x52, 0x01, 0x00, 0x81, 0x52, 0x19, 0x5b, 0x19, 0x9b, + 0x20, 0x63, 0x40, 0x39, 0x23, 0x1f, 0x00, 0xb9, 0x22, 0x27, 0x00, 0xb9, + 0x00, 0x80, 0x00, 0x51, 0x19, 0x54, 0xff, 0x97, 0xa2, 0x86, 0x42, 0x29, + 0x42, 0x04, 0x00, 0x11, 0x21, 0x04, 0x00, 0x11, 0xa2, 0x86, 0x02, 0x29, + 0x20, 0x73, 0x44, 0x39, 0x80, 0x03, 0x00, 0x35, 0xbf, 0x0a, 0x00, 0xb9, + 0xe0, 0x03, 0x13, 0x2a, 0xac, 0xfe, 0xff, 0x97, 0x00, 0x49, 0x80, 0xd2, + 0xc2, 0x0f, 0x80, 0xd2, 0x00, 0x5b, 0x00, 0x9b, 0x01, 0x80, 0x00, 0x91, + 0x00, 0xa0, 0x05, 0x91, 0x7a, 0x14, 0x00, 0x94, 0xe0, 0x03, 0x13, 0x2a, + 0xc4, 0xfe, 0xff, 0x97, 0x34, 0x0a, 0x00, 0x34, 0xe4, 0x03, 0x17, 0x2a, + 0xe2, 0x03, 0x14, 0x2a, 0x83, 0x00, 0x00, 0x90, 0x01, 0x16, 0x80, 0x52, + 0x63, 0x40, 0x29, 0x91, 0x80, 0x00, 0x80, 0x52, 0x20, 0x54, 0xff, 0x97, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0xe0, 0x03, 0x14, 0x2a, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xc0, 0x08, 0x9c, 0x52, + 0xa0, 0x0a, 0x00, 0xb9, 0x40, 0x09, 0x9c, 0x12, 0x80, 0x02, 0x00, 0x0b, + 0x1f, 0x04, 0x00, 0x71, 0x28, 0xfc, 0xff, 0x54, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xbc, 0xff, 0xff, 0x17, 0xb4, 0x0a, 0x00, 0xb9, + 0xa1, 0x21, 0x9c, 0x52, 0x9f, 0x02, 0x01, 0x6b, 0xe1, 0x00, 0x00, 0x54, + 0x01, 0xe0, 0x45, 0xb8, 0xf9, 0x6b, 0x44, 0xa9, 0x21, 0x04, 0x00, 0x11, + 0xfb, 0x73, 0x45, 0xa9, 0x01, 0xe0, 0x05, 0xb8, 0xb2, 0xff, 0xff, 0x17, + 0x41, 0x21, 0x9c, 0x52, 0x9f, 0x02, 0x01, 0x6b, 0xe1, 0x05, 0x00, 0x54, + 0x01, 0x20, 0x46, 0xb8, 0xf9, 0x6b, 0x44, 0xa9, 0x21, 0x04, 0x00, 0x11, + 0xfb, 0x73, 0x45, 0xa9, 0x01, 0x20, 0x06, 0xb8, 0xa9, 0xff, 0xff, 0x17, + 0xe2, 0x03, 0x00, 0x2a, 0xe5, 0x03, 0x17, 0x2a, 0xe4, 0x03, 0x1a, 0x2a, + 0x83, 0x00, 0x00, 0x90, 0x63, 0xe0, 0x27, 0x91, 0x01, 0x16, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0xf4, 0x53, 0xff, 0x97, 0xe0, 0x03, 0x15, 0xaa, + 0x5c, 0x7f, 0x40, 0x93, 0xd1, 0xfa, 0xff, 0x97, 0xe1, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x14, 0xaa, 0xf4, 0x03, 0x01, 0x2a, 0x29, 0x30, 0xff, 0x97, + 0x00, 0xf1, 0xff, 0x34, 0xe2, 0x03, 0x00, 0x2a, 0xe4, 0x03, 0x1a, 0x2a, + 0xe5, 0x03, 0x17, 0x2a, 0x83, 0x00, 0x00, 0x90, 0x01, 0x16, 0x80, 0x52, + 0x63, 0xa0, 0x28, 0x91, 0x00, 0x02, 0x80, 0x52, 0xe4, 0x53, 0xff, 0x97, + 0x7f, 0xff, 0xff, 0x17, 0xa1, 0x16, 0x40, 0xb9, 0xa0, 0x22, 0x00, 0x91, + 0x21, 0x04, 0x00, 0x11, 0x01, 0x0c, 0x00, 0xb9, 0x88, 0xff, 0xff, 0x17, + 0xa1, 0x16, 0x40, 0xb9, 0xa0, 0x22, 0x00, 0x91, 0xf9, 0x6b, 0x44, 0xa9, + 0x21, 0x04, 0x00, 0x11, 0xfb, 0x73, 0x45, 0xa9, 0x01, 0x0c, 0x00, 0xb9, + 0x81, 0xff, 0xff, 0x17, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xb7, 0xff, 0xff, 0x17, 0xe1, 0x29, 0x9c, 0x52, 0x9f, 0x02, 0x01, 0x6b, + 0xe1, 0x00, 0x00, 0x54, 0x01, 0x60, 0x46, 0xb8, 0xf9, 0x6b, 0x44, 0xa9, + 0x21, 0x04, 0x00, 0x11, 0xfb, 0x73, 0x45, 0xa9, 0x01, 0x60, 0x06, 0xb8, + 0x78, 0xff, 0xff, 0x17, 0x81, 0x2a, 0x9c, 0x52, 0x9f, 0x02, 0x01, 0x6b, + 0xe1, 0x00, 0x00, 0x54, 0x01, 0xa0, 0x46, 0xb8, 0xf9, 0x6b, 0x44, 0xa9, + 0x21, 0x04, 0x00, 0x11, 0xfb, 0x73, 0x45, 0xa9, 0x01, 0xa0, 0x06, 0xb8, + 0x6f, 0xff, 0xff, 0x17, 0xc1, 0x08, 0x9c, 0x52, 0x9f, 0x02, 0x01, 0x6b, + 0xc0, 0xf7, 0xff, 0x54, 0x01, 0x09, 0x9c, 0x52, 0x9f, 0x02, 0x01, 0x6b, + 0xe1, 0x00, 0x00, 0x54, 0x01, 0xe0, 0x46, 0xb8, 0xf9, 0x6b, 0x44, 0xa9, + 0x21, 0x04, 0x00, 0x11, 0xfb, 0x73, 0x45, 0xa9, 0x01, 0xe0, 0x06, 0xb8, + 0x63, 0xff, 0xff, 0x17, 0x41, 0x09, 0x9c, 0x52, 0x9f, 0x02, 0x01, 0x6b, + 0xc1, 0xf3, 0xff, 0x54, 0x01, 0x20, 0x47, 0xb8, 0xf9, 0x6b, 0x44, 0xa9, + 0x21, 0x04, 0x00, 0x11, 0xfb, 0x73, 0x45, 0xa9, 0x01, 0x20, 0x07, 0xb8, + 0x5a, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x03, 0x2a, 0xf5, 0x5b, 0x02, 0xa9, + 0xf6, 0x03, 0x01, 0xaa, 0xf5, 0x03, 0x02, 0xaa, 0xf7, 0x1b, 0x00, 0xf9, + 0xec, 0x09, 0xff, 0x97, 0x05, 0x1c, 0x00, 0x12, 0x73, 0x03, 0x00, 0x35, + 0x14, 0x49, 0x80, 0x52, 0x02, 0x2d, 0x80, 0xd2, 0xa4, 0x02, 0x40, 0xf9, + 0xb4, 0x08, 0xb4, 0x9b, 0xc1, 0x0e, 0x00, 0x90, 0x21, 0xc0, 0x0f, 0x91, + 0x97, 0x02, 0x80, 0xd2, 0x94, 0x02, 0x01, 0x8b, 0x9f, 0x00, 0x17, 0xeb, + 0xa3, 0x03, 0x00, 0x54, 0x13, 0x1c, 0x00, 0x12, 0xe0, 0x03, 0x13, 0x2a, + 0x11, 0xfe, 0xff, 0x97, 0xe2, 0x03, 0x17, 0xaa, 0xe1, 0x03, 0x14, 0xaa, + 0xe0, 0x03, 0x16, 0xaa, 0xe1, 0x13, 0x00, 0x94, 0xe0, 0x03, 0x13, 0x2a, + 0x2b, 0xfe, 0xff, 0x97, 0xb7, 0x02, 0x00, 0xf9, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x7f, 0x06, 0x00, 0x71, + 0x41, 0x03, 0x00, 0x54, 0x14, 0x49, 0x80, 0x52, 0x02, 0x2d, 0x80, 0xd2, + 0xa4, 0x02, 0x40, 0xf9, 0xb4, 0x08, 0xb4, 0x9b, 0xc1, 0x0e, 0x00, 0x90, + 0x21, 0xc0, 0x0f, 0x91, 0xd7, 0x0f, 0x80, 0xd2, 0x94, 0x02, 0x01, 0x8b, + 0x9f, 0x00, 0x17, 0xeb, 0xa2, 0xfc, 0xff, 0x54, 0xe7, 0x03, 0x05, 0x2a, + 0xe6, 0x03, 0x13, 0x2a, 0xe5, 0x03, 0x17, 0xaa, 0x42, 0xd3, 0x83, 0x12, + 0x01, 0x16, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0x83, 0x00, 0x00, 0x90, + 0x63, 0x40, 0x2a, 0x91, 0x73, 0x53, 0xff, 0x97, 0xa0, 0x2c, 0x9c, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe4, 0x03, 0x13, 0x2a, + 0xc2, 0xde, 0x83, 0x12, 0x01, 0x16, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, + 0x83, 0x00, 0x00, 0x90, 0x63, 0xa0, 0x29, 0x91, 0x66, 0x53, 0xff, 0x97, + 0x20, 0x21, 0x9c, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x01, 0x2a, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x02, 0xaa, + 0xf6, 0x03, 0x04, 0xaa, 0xf7, 0x63, 0x03, 0xa9, 0xf8, 0x03, 0x03, 0x2a, + 0xf7, 0x03, 0x05, 0x2a, 0xf9, 0x6b, 0x04, 0xa9, 0x99, 0x09, 0xff, 0x97, + 0x7f, 0x6a, 0x1b, 0x72, 0xf4, 0x03, 0x00, 0x2a, 0x7a, 0x0e, 0x00, 0x12, + 0x19, 0x1c, 0x00, 0x12, 0x41, 0x0c, 0x00, 0x54, 0x00, 0x00, 0x80, 0x52, + 0xc1, 0x00, 0x80, 0x52, 0xc1, 0x02, 0x00, 0xb9, 0xfa, 0x02, 0x00, 0x34, + 0x5f, 0x07, 0x00, 0x71, 0xe0, 0x06, 0x00, 0x54, 0x80, 0x00, 0x80, 0x52, + 0xe5, 0x03, 0x19, 0x2a, 0xe4, 0x03, 0x13, 0x2a, 0x83, 0x00, 0x00, 0x90, + 0xc2, 0xde, 0x83, 0x12, 0x63, 0xe0, 0x2d, 0x91, 0x01, 0x16, 0x80, 0x52, + 0x3e, 0x53, 0xff, 0x97, 0x20, 0x21, 0x9c, 0x52, 0xff, 0x16, 0x00, 0x71, + 0x69, 0x03, 0x00, 0x54, 0xa0, 0x02, 0x00, 0xb9, 0xf3, 0x53, 0x41, 0xa9, + 0xc1, 0x02, 0x40, 0xb9, 0xa1, 0x0a, 0x00, 0x79, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x33, 0x0a, 0x20, 0x36, 0x1f, 0x5f, 0x00, 0x71, + 0x49, 0x0d, 0x00, 0x54, 0x21, 0x7f, 0x40, 0x93, 0x05, 0x49, 0x80, 0xd2, + 0xc4, 0x0e, 0x00, 0x90, 0x84, 0xc0, 0x0f, 0x91, 0xa2, 0x0e, 0x40, 0xa9, + 0x21, 0x7c, 0x05, 0x9b, 0xff, 0x16, 0x00, 0x71, 0x85, 0x00, 0x01, 0x8b, + 0xa2, 0x0c, 0x00, 0xa9, 0xa2, 0x0a, 0x40, 0xf9, 0xa2, 0x08, 0x00, 0xf9, + 0x81, 0x68, 0x61, 0xb8, 0xa1, 0xb4, 0x00, 0xb9, 0xe8, 0xfc, 0xff, 0x54, + 0xe7, 0x03, 0x19, 0x2a, 0xe6, 0x03, 0x13, 0x2a, 0xe4, 0x03, 0x17, 0x2a, + 0xc5, 0x00, 0x80, 0xd2, 0x42, 0xd3, 0x83, 0x12, 0x01, 0x16, 0x80, 0x52, + 0x80, 0x00, 0x80, 0x52, 0x83, 0x00, 0x00, 0x90, 0x63, 0xa0, 0x2e, 0x91, + 0x17, 0x53, 0xff, 0x97, 0xa0, 0x2c, 0x9c, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x94, 0x1e, 0x00, 0x12, + 0xd8, 0x0e, 0x00, 0x90, 0x18, 0xc3, 0x0f, 0x91, 0xe0, 0x03, 0x14, 0x2a, + 0x87, 0xfd, 0xff, 0x97, 0x01, 0x49, 0x80, 0x52, 0xe0, 0x03, 0x14, 0x2a, + 0x34, 0x7f, 0xa1, 0x9b, 0x81, 0xa2, 0x05, 0x91, 0x21, 0x00, 0x18, 0x8b, + 0x3f, 0x7c, 0x00, 0xa9, 0x3f, 0x7c, 0x01, 0xa9, 0x3f, 0x7c, 0x02, 0xa9, + 0x3f, 0x7c, 0x03, 0xa9, 0x3f, 0x7c, 0x04, 0xa9, 0x3f, 0x7c, 0x05, 0xa9, + 0x3f, 0x7c, 0x06, 0xa9, 0x3f, 0x38, 0x00, 0xf9, 0x3f, 0x78, 0x00, 0xb9, + 0x3f, 0xf8, 0x00, 0x79, 0x97, 0xfd, 0xff, 0x97, 0x81, 0x82, 0x00, 0x91, + 0x80, 0x62, 0x00, 0x91, 0x21, 0x00, 0x18, 0x8b, 0x00, 0x03, 0x00, 0x8b, + 0x3f, 0x7c, 0x00, 0xa9, 0x3f, 0x7c, 0x01, 0xa9, 0x3f, 0x7c, 0x02, 0xa9, + 0x3f, 0x7c, 0x03, 0xa9, 0x3f, 0x7c, 0x04, 0xa9, 0x3f, 0x7c, 0x05, 0xa9, + 0x3f, 0x7c, 0x06, 0xa9, 0x3f, 0x38, 0x00, 0xf9, 0x3f, 0x78, 0x00, 0xb9, + 0x3f, 0xf8, 0x00, 0x79, 0xa0, 0xfb, 0xff, 0x97, 0xaf, 0xff, 0xff, 0x17, + 0x80, 0x00, 0x80, 0x52, 0xe5, 0x03, 0x19, 0x2a, 0xe4, 0x03, 0x13, 0x2a, + 0x83, 0x00, 0x00, 0x90, 0xc2, 0xde, 0x83, 0x12, 0x63, 0x40, 0x2b, 0x91, + 0x01, 0x16, 0x80, 0x52, 0xe3, 0x52, 0xff, 0x97, 0x20, 0x21, 0x9c, 0x52, + 0x97, 0xff, 0xff, 0x17, 0xff, 0x76, 0x00, 0x71, 0xc9, 0x01, 0x00, 0x54, + 0x39, 0x7f, 0x40, 0x93, 0xc1, 0x0e, 0x00, 0x90, 0x21, 0xc0, 0x0f, 0x91, + 0x04, 0x49, 0x80, 0xd2, 0xa2, 0x1a, 0x00, 0x91, 0xc3, 0x03, 0x80, 0x52, + 0x39, 0x07, 0x04, 0x9b, 0x24, 0x17, 0x40, 0xa9, 0x44, 0x14, 0x00, 0xa9, + 0x21, 0x0b, 0x40, 0xf9, 0xa1, 0x62, 0x01, 0xf8, 0xc3, 0x02, 0x00, 0xb9, + 0x98, 0xff, 0xff, 0x17, 0x80, 0x00, 0x80, 0x52, 0xe7, 0x03, 0x19, 0x2a, + 0xe6, 0x03, 0x13, 0x2a, 0xe4, 0x03, 0x17, 0x2a, 0x83, 0x00, 0x00, 0x90, + 0xc5, 0x03, 0x80, 0x52, 0x63, 0xe0, 0x2c, 0x91, 0x42, 0xd3, 0x83, 0x12, + 0x01, 0x16, 0x80, 0x52, 0xc8, 0x52, 0xff, 0x97, 0xa0, 0x2c, 0x9c, 0x52, + 0x8a, 0xff, 0xff, 0x17, 0x80, 0x00, 0x80, 0x52, 0xe4, 0x03, 0x18, 0x2a, + 0xe7, 0x03, 0x19, 0x2a, 0xe6, 0x03, 0x13, 0x2a, 0x83, 0x00, 0x00, 0x90, + 0x05, 0x03, 0x80, 0xd2, 0x63, 0xe0, 0x2b, 0x91, 0x42, 0xd3, 0x83, 0x12, + 0x01, 0x16, 0x80, 0x52, 0xbc, 0x52, 0xff, 0x97, 0xa0, 0x2c, 0x9c, 0x52, + 0x7e, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x40, 0xb9, + 0x7f, 0x00, 0x00, 0x71, 0x24, 0x18, 0x40, 0x7a, 0xa0, 0x01, 0x00, 0x54, + 0x60, 0x00, 0x23, 0x1e, 0x03, 0x90, 0xa8, 0x52, 0x62, 0x00, 0x27, 0x1e, + 0x21, 0x00, 0x23, 0x1e, 0x00, 0x08, 0x22, 0x1e, 0x00, 0x18, 0x21, 0x1e, + 0x01, 0x00, 0x24, 0x9e, 0x3f, 0xfc, 0x0f, 0x71, 0xe9, 0x00, 0x00, 0x54, + 0xe0, 0x7f, 0x80, 0x52, 0x40, 0x00, 0x00, 0x79, 0xc0, 0x03, 0x5f, 0xd6, + 0x5f, 0x00, 0x00, 0x79, 0x1f, 0x00, 0x00, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, + 0x41, 0x00, 0x00, 0x79, 0x61, 0xff, 0xff, 0x35, 0x1f, 0x00, 0x00, 0xb9, + 0xfc, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbc, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x01, 0xaa, + 0x16, 0x00, 0x40, 0xb9, 0xf3, 0x53, 0x01, 0xa9, 0x01, 0x00, 0x80, 0x52, + 0xf3, 0x03, 0x00, 0xaa, 0xff, 0x3f, 0x00, 0xb9, 0xf4, 0x03, 0x02, 0xaa, + 0x00, 0x00, 0x80, 0x52, 0x16, 0x01, 0x00, 0x35, 0x76, 0x02, 0x00, 0xb9, + 0xa0, 0x02, 0x00, 0x39, 0xf5, 0x5b, 0x42, 0xa9, 0x81, 0x02, 0x00, 0xb9, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xc0, 0x02, 0x23, 0x1e, 0xe0, 0xf3, 0x00, 0x91, 0xc7, 0x0f, 0x00, 0x94, + 0xe0, 0xf3, 0x40, 0x39, 0x1f, 0x04, 0x00, 0x71, 0x20, 0x02, 0x00, 0x54, + 0x00, 0x04, 0x00, 0x51, 0x62, 0x03, 0x80, 0x52, 0x03, 0x1c, 0x00, 0x12, + 0x21, 0x00, 0x80, 0x52, 0x7f, 0x6c, 0x00, 0x71, 0x02, 0x90, 0x82, 0x1a, + 0x40, 0x1c, 0x00, 0x12, 0x21, 0x20, 0xc2, 0x1a, 0xd6, 0x02, 0x01, 0x4b, + 0x76, 0x02, 0x00, 0xb9, 0xa0, 0x02, 0x00, 0x39, 0xf5, 0x5b, 0x42, 0xa9, + 0x81, 0x02, 0x00, 0xb9, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x16, 0x00, 0x80, 0x52, 0x76, 0x02, 0x00, 0xb9, + 0xa0, 0x02, 0x00, 0x39, 0x41, 0x00, 0x80, 0x52, 0xf5, 0x5b, 0x42, 0xa9, + 0x81, 0x02, 0x00, 0xb9, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0xa2, 0x52, 0x1f, 0x00, 0x02, 0x6b, 0x00, 0x90, 0x82, 0x1a, + 0xfd, 0x7b, 0xbc, 0xa9, 0x1f, 0x40, 0x00, 0x71, 0x03, 0x02, 0x80, 0x52, + 0x03, 0x20, 0x83, 0x1a, 0xfd, 0x03, 0x00, 0x91, 0xe2, 0xc3, 0x00, 0x91, + 0xe0, 0xb3, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x01, 0xaa, + 0x21, 0x38, 0x00, 0x91, 0xe3, 0x2f, 0x00, 0xb9, 0xbe, 0xff, 0xff, 0x97, + 0x61, 0x3e, 0x00, 0x91, 0xe0, 0xb3, 0x00, 0x91, 0xe2, 0xd3, 0x00, 0x91, + 0xba, 0xff, 0xff, 0x97, 0x61, 0x42, 0x00, 0x91, 0xe0, 0xb3, 0x00, 0x91, + 0xe2, 0xe3, 0x00, 0x91, 0xb6, 0xff, 0xff, 0x97, 0xe0, 0xb3, 0x00, 0x91, + 0x61, 0x46, 0x00, 0x91, 0xe2, 0xf3, 0x00, 0x91, 0xb2, 0xff, 0xff, 0x97, + 0xe0, 0x2f, 0x40, 0xb9, 0xe0, 0x03, 0x00, 0x35, 0xe3, 0x3f, 0x40, 0xb9, + 0xe4, 0x3b, 0x40, 0xb9, 0xe0, 0xc3, 0x00, 0x91, 0xe1, 0x17, 0x46, 0x29, + 0x63, 0x00, 0x04, 0x0b, 0x62, 0x4a, 0x00, 0x91, 0x21, 0x00, 0x05, 0x0b, + 0x21, 0x00, 0x03, 0x0b, 0xe1, 0x2f, 0x00, 0xb9, 0x8e, 0xff, 0xff, 0x97, + 0xe1, 0x2f, 0x40, 0xb9, 0xe0, 0xd3, 0x00, 0x91, 0x62, 0x52, 0x00, 0x91, + 0x8a, 0xff, 0xff, 0x97, 0xe1, 0x2f, 0x40, 0xb9, 0xe0, 0xe3, 0x00, 0x91, + 0x62, 0x5a, 0x00, 0x91, 0x86, 0xff, 0xff, 0x97, 0xe1, 0x2f, 0x40, 0xb9, + 0x62, 0x62, 0x00, 0x91, 0xe0, 0xf3, 0x00, 0x91, 0x82, 0xff, 0xff, 0x97, + 0xe1, 0x0f, 0x46, 0x29, 0xe0, 0x0b, 0x47, 0x29, 0x21, 0x00, 0x03, 0x0b, + 0xf3, 0x0b, 0x40, 0xf9, 0x00, 0x00, 0x02, 0x0b, 0x00, 0x00, 0x01, 0x0b, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x61, 0x46, 0x40, 0x39, + 0x23, 0x00, 0x80, 0x52, 0x21, 0x00, 0x03, 0x0b, 0x21, 0x1c, 0x00, 0x12, + 0x61, 0x46, 0x00, 0x39, 0x63, 0x20, 0xc1, 0x1a, 0xe3, 0x3f, 0x00, 0xb9, + 0xdc, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbf, 0xa9, + 0xc2, 0xd4, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, 0xfd, 0x03, 0x00, 0x91, + 0x00, 0x02, 0x80, 0x52, 0x43, 0x00, 0x00, 0xd0, 0x63, 0x00, 0x37, 0x91, + 0x21, 0x52, 0xff, 0x97, 0x20, 0x2b, 0x9c, 0x52, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0xb4, + 0x41, 0x10, 0x40, 0xf9, 0x00, 0x00, 0x80, 0x52, 0x22, 0x00, 0x80, 0x52, + 0x22, 0x28, 0x01, 0xb9, 0xc0, 0x03, 0x5f, 0xd6, 0xee, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0x22, 0x0d, 0x00, 0xb4, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, + 0xf4, 0x03, 0x02, 0xaa, 0xa0, 0x0d, 0x00, 0xb4, 0xf5, 0x5b, 0x02, 0xa9, + 0x36, 0x1c, 0x00, 0x12, 0x05, 0x04, 0x40, 0xb9, 0x01, 0x04, 0x40, 0xf9, + 0xf7, 0x63, 0x03, 0xa9, 0xf9, 0x6b, 0x04, 0xa9, 0x26, 0x00, 0x40, 0xb9, + 0x3a, 0x5c, 0x46, 0x29, 0xbf, 0x00, 0x06, 0x6b, 0x39, 0xe0, 0x41, 0xa9, + 0x35, 0x14, 0x40, 0xf9, 0xc1, 0x01, 0x00, 0x54, 0x3f, 0x7c, 0x00, 0xa9, + 0xdf, 0x06, 0x00, 0x71, 0x40, 0x20, 0x9c, 0x52, 0x3f, 0x7c, 0x01, 0xa9, + 0x3f, 0x7c, 0x02, 0xa9, 0x3f, 0x18, 0x00, 0xf9, 0xc0, 0x02, 0x00, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x44, 0x00, 0x40, 0x39, 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x43, 0x00, 0x00, 0xd0, 0x82, 0xdc, 0x83, 0x12, 0x63, 0x00, 0x3c, 0x91, + 0xee, 0x51, 0xff, 0x97, 0x61, 0x06, 0x40, 0xf9, 0xdf, 0x06, 0x00, 0x71, + 0x40, 0x20, 0x9c, 0x52, 0x3f, 0x7c, 0x00, 0xa9, 0x3f, 0x7c, 0x01, 0xa9, + 0x3f, 0x7c, 0x02, 0xa9, 0x3f, 0x18, 0x00, 0xf9, 0x81, 0xfd, 0xff, 0x54, + 0x1a, 0x02, 0x00, 0x34, 0x85, 0x02, 0x40, 0x39, 0xe4, 0x03, 0x1a, 0x2a, + 0x7a, 0x09, 0x20, 0x36, 0x80, 0x00, 0x80, 0x52, 0x63, 0x00, 0x00, 0xf0, + 0xc2, 0xd5, 0x83, 0x12, 0x63, 0xa0, 0x2f, 0x91, 0x01, 0x1c, 0x80, 0x52, + 0xdc, 0x51, 0xff, 0x97, 0x20, 0x2a, 0x9c, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xe0, 0xff, 0xff, 0x17, 0x93, 0x12, 0x40, 0xf9, 0x60, 0x72, 0x40, 0x39, + 0xe0, 0x02, 0x00, 0x34, 0x77, 0x0a, 0x00, 0x36, 0x20, 0x03, 0x23, 0x9e, + 0x00, 0xb0, 0xa5, 0x52, 0x01, 0x00, 0x27, 0x1e, 0x00, 0x08, 0x21, 0x1e, + 0x60, 0x36, 0x01, 0xbd, 0xf7, 0x02, 0x10, 0x36, 0xa0, 0x02, 0x23, 0x9e, + 0x00, 0xb0, 0xa5, 0x52, 0x01, 0x00, 0x27, 0x1e, 0x42, 0x00, 0x80, 0x52, + 0x81, 0x12, 0x40, 0xf9, 0x00, 0x00, 0x80, 0x52, 0x00, 0x08, 0x21, 0x1e, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0x60, 0x3a, 0x01, 0xbd, 0xf3, 0x53, 0x41, 0xa9, 0x22, 0x28, 0x01, 0xb9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x37, 0x06, 0x08, 0x36, + 0x00, 0x03, 0x23, 0x9e, 0x00, 0xb0, 0xa5, 0x52, 0x01, 0x00, 0x27, 0x1e, + 0x00, 0x08, 0x21, 0x1e, 0x60, 0x36, 0x01, 0xbd, 0xea, 0xff, 0xff, 0x17, + 0x84, 0x06, 0x40, 0x39, 0x40, 0x00, 0x80, 0x52, 0xe5, 0x03, 0x17, 0x2a, + 0x63, 0x00, 0x00, 0xf0, 0xa2, 0xd6, 0x83, 0x12, 0x63, 0xe0, 0x32, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0xae, 0x51, 0xff, 0x97, 0x60, 0x32, 0x41, 0xb9, + 0x00, 0x04, 0x00, 0x11, 0x60, 0x32, 0x01, 0xb9, 0xdf, 0xff, 0xff, 0x17, + 0x00, 0x02, 0x80, 0x52, 0x43, 0x00, 0x00, 0xd0, 0x63, 0x00, 0x37, 0x91, + 0xc2, 0xd4, 0x83, 0x12, 0x01, 0x1c, 0x80, 0x52, 0xa4, 0x51, 0xff, 0x97, + 0x20, 0x2b, 0x9c, 0x52, 0xac, 0xff, 0xff, 0x17, 0x44, 0x00, 0x40, 0x39, + 0x00, 0x02, 0x80, 0x52, 0x43, 0x00, 0x00, 0xd0, 0xc2, 0xd4, 0x83, 0x12, + 0x63, 0x80, 0x3b, 0x91, 0x01, 0x1c, 0x80, 0x52, 0x9b, 0x51, 0xff, 0x97, + 0x20, 0x2b, 0x9c, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xa2, 0xff, 0xff, 0x17, + 0x00, 0x01, 0x80, 0x52, 0x63, 0x00, 0x00, 0xf0, 0x22, 0xd5, 0x83, 0x12, + 0x63, 0x80, 0x30, 0x91, 0x01, 0x1c, 0x80, 0x52, 0x92, 0x51, 0xff, 0x97, + 0xc0, 0x2a, 0x9c, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0x96, 0xff, 0xff, 0x17, + 0x84, 0x02, 0x40, 0x39, 0x40, 0x00, 0x80, 0x52, 0xe5, 0x03, 0x17, 0x2a, + 0x63, 0x00, 0x00, 0xf0, 0x62, 0xd6, 0x83, 0x12, 0x63, 0x20, 0x32, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0x84, 0x51, 0xff, 0x97, 0x60, 0x2e, 0x41, 0xb9, + 0x00, 0x04, 0x00, 0x11, 0x60, 0x2e, 0x01, 0xb9, 0xc5, 0xff, 0xff, 0x17, + 0x84, 0x02, 0x40, 0x39, 0x40, 0x00, 0x80, 0x52, 0xe5, 0x03, 0x17, 0x2a, + 0x63, 0x00, 0x00, 0xf0, 0x82, 0xd6, 0x83, 0x12, 0x63, 0x60, 0x31, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0x78, 0x51, 0xff, 0x97, 0x60, 0x2e, 0x41, 0xb9, + 0x00, 0x04, 0x00, 0x11, 0x60, 0x2e, 0x01, 0xb9, 0xa3, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x03, 0x00, 0xb4, 0xfd, 0x7b, 0xbe, 0xa9, 0xe2, 0x03, 0x00, 0xaa, + 0xfd, 0x03, 0x00, 0x91, 0x23, 0x08, 0x40, 0xf9, 0xf3, 0x0b, 0x00, 0xf9, + 0xf3, 0x03, 0x01, 0xaa, 0x20, 0x00, 0x40, 0x39, 0x63, 0x00, 0x40, 0xb9, + 0x21, 0x10, 0x40, 0xf9, 0x83, 0x01, 0x00, 0x34, 0x21, 0xc0, 0x02, 0x91, + 0x78, 0x7b, 0xff, 0x97, 0xe1, 0x03, 0x00, 0x2a, 0x40, 0x24, 0x9c, 0x52, + 0x81, 0x00, 0x00, 0x35, 0x61, 0x12, 0x40, 0xf9, 0x00, 0x00, 0x80, 0x52, + 0x3f, 0x28, 0x01, 0xb9, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x21, 0xe0, 0x00, 0x91, 0xbd, 0x5d, 0xff, 0x97, + 0xe1, 0x03, 0x00, 0x2a, 0xf5, 0xff, 0xff, 0x17, 0x2e, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xb4, 0x00, 0x10, 0x40, 0xf9, + 0x00, 0x50, 0x04, 0x91, 0x21, 0x12, 0xff, 0x17, 0x28, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0x02, 0x2b, 0x80, 0xd2, 0x01, 0x00, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x00, 0xaa, + 0x13, 0x10, 0x40, 0xf9, 0xe0, 0x03, 0x13, 0xaa, 0xf4, 0x11, 0x00, 0x94, + 0x80, 0x02, 0x40, 0x39, 0x9a, 0x1f, 0xff, 0x97, 0x60, 0x22, 0x00, 0xb9, + 0x14, 0x20, 0xff, 0x97, 0x60, 0x26, 0x00, 0xb9, 0x0e, 0x20, 0xff, 0x97, + 0x60, 0x2a, 0x00, 0xb9, 0x80, 0x06, 0x40, 0x39, 0x8b, 0x1f, 0xff, 0x97, + 0x60, 0x0a, 0x00, 0xb9, 0x80, 0x02, 0x40, 0x39, 0x9c, 0x1f, 0xff, 0x97, + 0x60, 0x0e, 0x00, 0xb9, 0x80, 0x02, 0x40, 0x39, 0xa1, 0x1f, 0xff, 0x97, + 0x60, 0x12, 0x00, 0xb9, 0x0b, 0x20, 0xff, 0x97, 0x60, 0x16, 0x00, 0xb9, + 0x63, 0x00, 0x80, 0x52, 0x41, 0x00, 0x80, 0x52, 0x22, 0x00, 0x80, 0xd2, + 0x63, 0x2e, 0x00, 0xb9, 0x61, 0x16, 0x01, 0xb9, 0x00, 0x48, 0x88, 0x52, + 0xe0, 0x01, 0xa0, 0x72, 0x7f, 0x72, 0x04, 0x39, 0x62, 0x92, 0x00, 0xf9, + 0x61, 0x0e, 0x40, 0xb9, 0x83, 0x02, 0x40, 0x39, 0x63, 0x1a, 0x01, 0xb9, + 0x3f, 0x00, 0x00, 0x6b, 0x69, 0x07, 0x00, 0x54, 0x40, 0x00, 0x80, 0x52, + 0x21, 0x7c, 0x01, 0x53, 0x61, 0x06, 0x00, 0xb9, 0x7f, 0xe6, 0x00, 0x39, + 0x60, 0x86, 0x01, 0x39, 0x60, 0x26, 0x02, 0x39, 0x60, 0x26, 0x40, 0xb9, + 0x1f, 0x04, 0x00, 0x71, 0x40, 0x07, 0x00, 0x54, 0x7f, 0xea, 0x00, 0x39, + 0x7f, 0x8a, 0x01, 0x39, 0x7f, 0x2a, 0x02, 0x39, 0x60, 0x12, 0x40, 0xb9, + 0x21, 0x08, 0x01, 0x0b, 0x64, 0xba, 0x89, 0x52, 0x44, 0x0c, 0xa2, 0x72, + 0x65, 0x22, 0x40, 0xb9, 0x49, 0x00, 0x80, 0xd2, 0x09, 0x00, 0xa3, 0xf2, + 0x00, 0x08, 0x00, 0x0b, 0x21, 0x7c, 0xa4, 0x9b, 0x27, 0x00, 0x80, 0xd2, + 0x22, 0x00, 0x80, 0x52, 0x23, 0x00, 0x80, 0x52, 0x00, 0x7c, 0xa4, 0x9b, + 0x04, 0x00, 0x88, 0xd2, 0x21, 0xd4, 0x66, 0xd3, 0x69, 0x00, 0xc0, 0xf2, + 0xe8, 0x03, 0x00, 0xb2, 0x47, 0x00, 0xc0, 0xf2, 0x00, 0xd4, 0x66, 0xd3, + 0x46, 0x00, 0x80, 0x52, 0x04, 0x20, 0xc0, 0xf2, 0x04, 0x20, 0xe0, 0xf2, + 0x63, 0xf2, 0x00, 0x39, 0x61, 0xd2, 0x03, 0x78, 0x61, 0xf2, 0x03, 0x78, + 0x62, 0x12, 0x04, 0xb8, 0x63, 0x92, 0x01, 0x39, 0x60, 0x52, 0x06, 0x78, + 0x60, 0x72, 0x06, 0x78, 0x62, 0x92, 0x06, 0xb8, 0x63, 0x32, 0x02, 0x39, + 0x62, 0x12, 0x09, 0xb8, 0x69, 0x22, 0x0b, 0xa9, 0x67, 0x62, 0x00, 0xf9, + 0x66, 0xca, 0x00, 0xb9, 0x64, 0xc2, 0x0d, 0xf8, 0x62, 0xca, 0x01, 0x79, + 0xe5, 0x02, 0x00, 0x35, 0x80, 0x38, 0x81, 0xd2, 0x62, 0x4a, 0x03, 0x39, + 0xa0, 0x38, 0xc1, 0xf2, 0x60, 0x42, 0x0d, 0xf8, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x40, 0x00, 0x80, 0x52, 0x61, 0x06, 0x00, 0xb9, 0x62, 0xe6, 0x00, 0x39, + 0x60, 0x86, 0x01, 0x39, 0x60, 0x26, 0x02, 0x39, 0x60, 0x26, 0x40, 0xb9, + 0x1f, 0x04, 0x00, 0x71, 0x01, 0xf9, 0xff, 0x54, 0x62, 0x2a, 0x40, 0xb9, + 0xc2, 0xf8, 0xff, 0x35, 0x60, 0xea, 0x00, 0x39, 0x60, 0x8a, 0x01, 0x39, + 0x60, 0x2a, 0x02, 0x39, 0xc5, 0xff, 0xff, 0x17, 0x7f, 0x4a, 0x03, 0x39, + 0x00, 0x00, 0x80, 0x52, 0x7f, 0x42, 0x0d, 0xf8, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf7, 0x63, 0x03, 0xa9, + 0x17, 0x08, 0x40, 0xf9, 0xf3, 0x53, 0x01, 0xa9, 0xf5, 0x5b, 0x02, 0xa9, + 0xf5, 0x03, 0x00, 0xaa, 0x13, 0x10, 0x40, 0xf9, 0xe0, 0x06, 0x40, 0xb9, + 0x1f, 0x04, 0x00, 0x71, 0x80, 0x10, 0x00, 0x54, 0x74, 0x12, 0x40, 0xb9, + 0x00, 0x20, 0x80, 0x52, 0x74, 0x02, 0x00, 0xb9, 0x60, 0x3a, 0x00, 0x79, + 0x65, 0x0a, 0x40, 0xb9, 0xa0, 0x02, 0x40, 0x39, 0xbf, 0x00, 0x14, 0x6b, + 0x60, 0x01, 0x00, 0x54, 0xe6, 0x03, 0x00, 0x2a, 0xe4, 0x03, 0x14, 0x2a, + 0x80, 0x00, 0x80, 0x52, 0x63, 0x00, 0x00, 0xf0, 0x02, 0x00, 0x80, 0x52, + 0x63, 0xa0, 0x33, 0x91, 0x01, 0x1c, 0x80, 0x52, 0xba, 0x50, 0xff, 0x97, + 0xa0, 0x02, 0x40, 0x39, 0x74, 0x0a, 0x40, 0xb9, 0xe1, 0x33, 0x01, 0x91, + 0x82, 0xf2, 0xff, 0x97, 0xe1, 0x0e, 0x40, 0xbd, 0xe1, 0x4d, 0x82, 0x52, + 0x61, 0x50, 0xa7, 0x72, 0x60, 0x02, 0x40, 0xbd, 0x60, 0x1a, 0x41, 0x29, + 0x23, 0xd8, 0x21, 0x7e, 0x00, 0xd8, 0x21, 0x7e, 0xe3, 0x4f, 0x40, 0xb9, + 0x22, 0x00, 0x27, 0x1e, 0x01, 0x00, 0x23, 0x1e, 0x82, 0x0a, 0x14, 0x0b, + 0x74, 0xba, 0x89, 0x52, 0x54, 0x0c, 0xa2, 0x72, 0x61, 0x72, 0x40, 0x39, + 0x00, 0x08, 0x23, 0x1e, 0x03, 0x7c, 0x03, 0x1b, 0x21, 0x08, 0x23, 0x1e, + 0x42, 0x7c, 0xb4, 0x9b, 0x65, 0x76, 0x40, 0x39, 0x3f, 0x00, 0x00, 0x71, + 0x04, 0x02, 0x80, 0x52, 0x61, 0xe2, 0x00, 0x91, 0x00, 0x08, 0x22, 0x1e, + 0x42, 0xfc, 0x66, 0xd3, 0x63, 0x08, 0xc6, 0x1a, 0x21, 0x08, 0x22, 0x1e, + 0x15, 0x00, 0x24, 0x9e, 0x42, 0x00, 0x03, 0x0b, 0x63, 0x1a, 0x00, 0xb9, + 0x42, 0x3c, 0x00, 0x12, 0x62, 0xd2, 0x08, 0x78, 0x62, 0xf2, 0x08, 0x78, + 0x36, 0x00, 0x24, 0x9e, 0xa0, 0x12, 0x84, 0x1a, 0xbf, 0x00, 0x00, 0x71, + 0xb8, 0x12, 0x84, 0x1a, 0x25, 0xfe, 0xff, 0x97, 0xf4, 0x03, 0x00, 0x2a, + 0x61, 0x82, 0x01, 0x91, 0xe0, 0x03, 0x18, 0x2a, 0x21, 0xfe, 0xff, 0x97, + 0xe2, 0x03, 0x00, 0x2a, 0x61, 0x22, 0x02, 0x91, 0xe0, 0x03, 0x16, 0x2a, + 0xf6, 0x03, 0x02, 0x2a, 0x1c, 0xfe, 0xff, 0x97, 0x60, 0x72, 0x40, 0x39, + 0x41, 0x8f, 0xa8, 0x52, 0x61, 0x02, 0x40, 0xbd, 0x24, 0x00, 0x27, 0x1e, + 0x1f, 0x00, 0x00, 0x71, 0xe2, 0x12, 0x40, 0xbd, 0x94, 0x12, 0x96, 0x1a, + 0xe0, 0x4d, 0x82, 0x52, 0x60, 0x40, 0xa7, 0x72, 0x23, 0xd8, 0x21, 0x7e, + 0x80, 0x02, 0x23, 0x1e, 0x41, 0xd8, 0x21, 0x7e, 0x05, 0x00, 0x27, 0x1e, + 0xe1, 0x02, 0x40, 0xb9, 0x62, 0x36, 0x00, 0xbd, 0x62, 0x5e, 0x00, 0xbd, + 0x00, 0x18, 0x23, 0x1e, 0x21, 0x08, 0x23, 0x1e, 0x62, 0x86, 0x00, 0xbd, + 0x62, 0xae, 0x00, 0xbd, 0x21, 0x08, 0x25, 0x1e, 0x20, 0x00, 0x24, 0x9e, + 0x60, 0xde, 0x00, 0xb9, 0x00, 0x08, 0x24, 0x1e, 0x05, 0x00, 0x24, 0x9e, + 0x65, 0x32, 0x00, 0xb9, 0xa1, 0x00, 0x00, 0x35, 0xb5, 0x42, 0x00, 0x51, + 0xe0, 0x5f, 0x1c, 0x32, 0xbf, 0x02, 0x00, 0x6b, 0xe8, 0x04, 0x00, 0x54, + 0x60, 0x26, 0x40, 0xb9, 0x1f, 0x04, 0x00, 0x71, 0x60, 0x00, 0x00, 0x54, + 0x60, 0x2a, 0x40, 0xb9, 0xe0, 0x02, 0x00, 0x34, 0x3f, 0x1f, 0xff, 0x97, + 0x03, 0x7d, 0x80, 0x52, 0x61, 0x16, 0x40, 0xb9, 0x62, 0x36, 0x40, 0xb9, + 0x25, 0x00, 0x80, 0x52, 0x00, 0x7c, 0xa3, 0x9b, 0xe4, 0x02, 0x40, 0xb9, + 0x63, 0x2a, 0x40, 0xb9, 0x65, 0x2e, 0x00, 0xb9, 0x00, 0x08, 0xc1, 0x9a, + 0x41, 0x08, 0xc0, 0x1a, 0x20, 0x88, 0x00, 0x1b, 0x1f, 0x00, 0x00, 0x71, + 0x21, 0x04, 0x81, 0x1a, 0x9f, 0x00, 0x00, 0x71, 0xe0, 0x17, 0x9f, 0x1a, + 0x7f, 0x00, 0x00, 0x71, 0xe2, 0x07, 0x9f, 0x1a, 0x62, 0x72, 0x04, 0x39, + 0x00, 0x78, 0x1f, 0x53, 0x60, 0x16, 0x01, 0xb9, 0x61, 0x22, 0x01, 0xb9, + 0xf5, 0x5b, 0x42, 0xa9, 0x00, 0x00, 0x80, 0x52, 0xf7, 0x63, 0x43, 0xa9, + 0x7f, 0xaa, 0x00, 0xf9, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x74, 0x06, 0x40, 0xb9, 0x74, 0x02, 0x00, 0xb9, + 0x60, 0x3a, 0x00, 0x79, 0x7e, 0xff, 0xff, 0x17, 0xe4, 0x0e, 0x40, 0xb9, + 0x63, 0x00, 0x00, 0xf0, 0x02, 0x00, 0x80, 0x52, 0x63, 0x60, 0x34, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0x3c, 0x50, 0xff, 0x97, + 0xd3, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0x01, 0x10, 0x40, 0xf9, + 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, 0x20, 0xa8, 0x40, 0xf9, + 0xa0, 0x00, 0x00, 0xb4, 0x20, 0x40, 0x05, 0x91, 0xa4, 0x7b, 0xff, 0x97, + 0xe0, 0x00, 0x00, 0x35, 0x61, 0x12, 0x40, 0xf9, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x0b, 0x40, 0xf9, 0x3f, 0xa8, 0x00, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, 0x63, 0x00, 0x00, 0xf0, + 0x63, 0x60, 0x35, 0x91, 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x23, 0x50, 0xff, 0x97, 0xf4, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0x22, 0x13, 0x00, 0xb4, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, 0xf4, 0x03, 0x02, 0xaa, + 0xa0, 0x13, 0x00, 0xb4, 0x05, 0x04, 0x40, 0xb9, 0x00, 0x04, 0x40, 0xf9, + 0xf5, 0x5b, 0x02, 0xa9, 0xf7, 0x1b, 0x00, 0xf9, 0x37, 0x1c, 0x00, 0x12, + 0x06, 0x20, 0x40, 0xb9, 0x16, 0x00, 0x40, 0xf9, 0xbf, 0x00, 0x06, 0x6b, + 0x15, 0x0c, 0x40, 0xf9, 0x21, 0x03, 0x00, 0x54, 0x56, 0x15, 0x00, 0xb4, + 0x35, 0x0e, 0x00, 0xb4, 0x61, 0x06, 0x40, 0xf9, 0xff, 0x06, 0x00, 0x71, + 0xa2, 0x16, 0x40, 0xb9, 0x40, 0x20, 0x9c, 0x52, 0xa4, 0x1e, 0x40, 0xb9, + 0x21, 0x0c, 0x40, 0xf9, 0x3f, 0x7c, 0x00, 0xa9, 0x3f, 0x7c, 0x01, 0xa9, + 0x3f, 0x7c, 0x02, 0xa9, 0x3f, 0x18, 0x00, 0xf9, 0x3f, 0x38, 0x00, 0xb9, + 0x61, 0x06, 0x40, 0xf9, 0x3f, 0x7c, 0x00, 0xa9, 0x3f, 0x7c, 0x01, 0xa9, + 0x3f, 0x7c, 0x02, 0xa9, 0x3f, 0x18, 0x00, 0xf9, 0xc0, 0x01, 0x00, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x44, 0x00, 0x40, 0x39, + 0x43, 0x00, 0x00, 0xd0, 0x82, 0xdc, 0x83, 0x12, 0x63, 0x00, 0x3c, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0xf1, 0x4f, 0xff, 0x97, + 0xe1, 0xff, 0xff, 0x17, 0x85, 0x02, 0x40, 0x39, 0xc4, 0x0b, 0x20, 0x37, + 0x04, 0x13, 0x18, 0x37, 0x84, 0x0f, 0x00, 0x35, 0x89, 0x12, 0x40, 0xf9, + 0x27, 0x65, 0x41, 0x79, 0x5f, 0x04, 0x47, 0x6b, 0xc3, 0x13, 0x00, 0x54, + 0xc1, 0x06, 0xc0, 0x79, 0xe1, 0x01, 0x00, 0x35, 0xc0, 0x02, 0xc0, 0x79, + 0xa0, 0x01, 0x00, 0x35, 0x80, 0x00, 0x80, 0x52, 0xe4, 0x03, 0x05, 0x2a, + 0x63, 0x00, 0x00, 0xf0, 0xe2, 0xd5, 0x83, 0x12, 0x63, 0xa0, 0x3b, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0xdd, 0x4f, 0xff, 0x97, 0x00, 0x2a, 0x9c, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xdf, 0xff, 0xff, 0x17, 0xe0, 0x04, 0x00, 0x51, 0x00, 0xf4, 0x7e, 0xd3, + 0xc2, 0x02, 0x00, 0x8b, 0x42, 0x04, 0xc0, 0x79, 0x02, 0x0c, 0x00, 0x34, + 0x22, 0x19, 0x40, 0xb9, 0xe8, 0x00, 0x02, 0x4b, 0xe7, 0x00, 0x02, 0x0b, + 0x1f, 0x05, 0x00, 0x71, 0x03, 0x01, 0x22, 0x1e, 0xe7, 0xf4, 0x7e, 0xd3, + 0x8d, 0x0d, 0x00, 0x54, 0x08, 0x05, 0x00, 0x51, 0xe0, 0x03, 0x16, 0xaa, + 0xea, 0x08, 0x00, 0x91, 0x05, 0x00, 0x80, 0xd2, 0xc8, 0x4a, 0x28, 0x8b, + 0x06, 0x00, 0x80, 0xd2, 0x03, 0x00, 0x00, 0x14, 0x01, 0x0c, 0xc0, 0x79, + 0x00, 0x10, 0x00, 0x91, 0x04, 0x00, 0x80, 0x79, 0x1f, 0x01, 0x00, 0xeb, + 0x03, 0x68, 0xa7, 0x78, 0x02, 0x68, 0xea, 0x78, 0x84, 0x7c, 0x04, 0x9b, + 0x63, 0x7c, 0x03, 0x9b, 0x21, 0x10, 0x21, 0x9b, 0x42, 0x0c, 0x22, 0x9b, + 0xc6, 0x00, 0x01, 0x8b, 0xa5, 0x00, 0x02, 0x8b, 0x81, 0xfe, 0xff, 0x54, + 0x00, 0x10, 0xa6, 0x52, 0x02, 0x00, 0x27, 0x1e, 0xc1, 0x00, 0x23, 0x9e, + 0xa0, 0x00, 0x23, 0x9e, 0x42, 0x18, 0x23, 0x1e, 0x80, 0x1e, 0x40, 0xf9, + 0x21, 0x08, 0x22, 0x1e, 0x00, 0x08, 0x22, 0x1e, 0x21, 0x35, 0x01, 0xbd, + 0x20, 0x39, 0x01, 0xbd, 0x00, 0x00, 0x40, 0xb9, 0x1f, 0x3c, 0x08, 0x72, + 0x20, 0x01, 0x00, 0x54, 0x41, 0x00, 0x80, 0x52, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0x21, 0x29, 0x01, 0xb9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x36, 0xa9, 0x00, 0xf9, 0xe0, 0x03, 0x14, 0xaa, 0x68, 0xff, 0xff, 0x97, + 0x89, 0x12, 0x40, 0xf9, 0xf4, 0xff, 0xff, 0x17, 0x84, 0x02, 0x40, 0x39, + 0x43, 0x00, 0x00, 0xd0, 0x63, 0x00, 0x3e, 0x91, 0xc2, 0xd4, 0x83, 0x12, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, 0x97, 0x4f, 0xff, 0x97, + 0x20, 0x2b, 0x9c, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x80, 0x00, 0x80, 0x52, 0x63, 0x00, 0x00, 0xf0, 0xc2, 0xd5, 0x83, 0x12, + 0x63, 0x80, 0x36, 0x91, 0x01, 0x1c, 0x80, 0x52, 0x8b, 0x4f, 0xff, 0x97, + 0x20, 0x2a, 0x9c, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0x8d, 0xff, 0xff, 0x17, 0x00, 0x02, 0x80, 0x52, + 0x43, 0x00, 0x00, 0xd0, 0x63, 0x00, 0x37, 0x91, 0xc2, 0xd4, 0x83, 0x12, + 0x01, 0x1c, 0x80, 0x52, 0x80, 0x4f, 0xff, 0x97, 0x20, 0x2b, 0x9c, 0x52, + 0x85, 0xff, 0xff, 0x17, 0x44, 0x00, 0x40, 0x39, 0x00, 0x02, 0x80, 0x52, + 0x43, 0x00, 0x00, 0xd0, 0xc2, 0xd4, 0x83, 0x12, 0x63, 0x80, 0x3b, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0x77, 0x4f, 0xff, 0x97, 0x20, 0x2b, 0x9c, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0x7b, 0xff, 0xff, 0x17, 0xc0, 0x6a, 0xe0, 0x78, + 0xe0, 0xf1, 0xff, 0x34, 0x9f, 0xff, 0xff, 0x17, 0x00, 0x01, 0x80, 0x52, + 0x63, 0x00, 0x00, 0xf0, 0x22, 0xd5, 0x83, 0x12, 0x63, 0x80, 0x38, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0x6b, 0x4f, 0xff, 0x97, 0xc0, 0x2a, 0x9c, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0x6d, 0xff, 0xff, 0x17, 0x43, 0x00, 0x00, 0xd0, 0x84, 0x02, 0x40, 0x39, + 0x63, 0x60, 0x3d, 0x91, 0xc2, 0xd4, 0x83, 0x12, 0xc8, 0xff, 0xff, 0x17, + 0x00, 0x01, 0x80, 0x52, 0xe4, 0x03, 0x05, 0x2a, 0x63, 0x00, 0x00, 0xf0, + 0x01, 0x1c, 0x80, 0x52, 0x63, 0xa0, 0x3a, 0x91, 0x5b, 0x4f, 0xff, 0x97, + 0x60, 0x24, 0x9c, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x1b, 0x40, 0xf9, 0x5d, 0xff, 0xff, 0x17, 0x63, 0x00, 0x00, 0xf0, + 0x63, 0x80, 0x37, 0x91, 0xe2, 0xd5, 0x83, 0x12, 0x80, 0x00, 0x80, 0x52, + 0x01, 0x1c, 0x80, 0x52, 0x50, 0x4f, 0xff, 0x97, 0x00, 0x2a, 0x9c, 0x52, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0x52, 0xff, 0xff, 0x17, 0xe4, 0x03, 0x02, 0x2a, 0x63, 0x00, 0x00, 0xf0, + 0xe2, 0xd5, 0x83, 0x12, 0x63, 0x80, 0x39, 0x91, 0xf4, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb5, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0xaa, 0x00, 0x10, 0x40, 0xf9, + 0x1f, 0xf0, 0x04, 0x39, 0x60, 0x02, 0x40, 0x39, 0x00, 0xfc, 0x01, 0x51, + 0x00, 0x4f, 0xff, 0x97, 0x60, 0x0a, 0x40, 0xf9, 0xff, 0x7f, 0x06, 0xa9, + 0xff, 0x3b, 0x00, 0xf9, 0xff, 0xff, 0x07, 0xa9, 0x00, 0x00, 0x40, 0xb9, + 0xff, 0xff, 0x08, 0xa9, 0xff, 0xff, 0x09, 0xa9, 0xff, 0x57, 0x00, 0xf9, + 0x60, 0x07, 0x00, 0x35, 0x60, 0x02, 0x40, 0x39, 0x61, 0x00, 0x80, 0xd2, + 0x41, 0x00, 0xc0, 0xf2, 0x27, 0x00, 0x80, 0x52, 0x46, 0x01, 0x80, 0x52, + 0xe1, 0x3f, 0x00, 0xf9, 0xe0, 0x03, 0x02, 0x39, 0x05, 0x00, 0x00, 0x90, + 0xa5, 0xc0, 0x10, 0x91, 0xe7, 0x13, 0x08, 0x78, 0xe6, 0x87, 0x00, 0xb9, + 0x04, 0x00, 0x00, 0x90, 0x84, 0x00, 0x0f, 0x91, 0x03, 0x00, 0x00, 0x90, + 0x63, 0xc0, 0x04, 0x91, 0x02, 0x00, 0x00, 0x90, 0x42, 0x40, 0x04, 0x91, + 0xe5, 0x93, 0x08, 0xa9, 0xe0, 0x83, 0x00, 0x91, 0xe3, 0x8b, 0x09, 0xa9, + 0xe1, 0x83, 0x01, 0x91, 0xe2, 0x8f, 0x47, 0xa9, 0xe2, 0x0f, 0x02, 0xa9, + 0xe2, 0x8f, 0x48, 0xa9, 0xe2, 0x0f, 0x03, 0xa9, 0xe2, 0x8f, 0x49, 0xa9, + 0xe2, 0x0f, 0x04, 0xa9, 0xf3, 0x2b, 0x00, 0xf9, 0xf3, 0x57, 0x00, 0xf9, + 0xf1, 0x0b, 0xff, 0x97, 0x65, 0x12, 0x40, 0xf9, 0xbf, 0xa8, 0x00, 0xf9, + 0x61, 0x16, 0x40, 0xf9, 0x02, 0x2a, 0x9c, 0x52, 0xe9, 0x83, 0x41, 0x39, + 0x1f, 0x00, 0x02, 0x6b, 0xe7, 0x8b, 0x41, 0x39, 0x24, 0x8c, 0x45, 0x29, + 0x22, 0x34, 0x40, 0xb9, 0xe6, 0x87, 0x41, 0x39, 0x84, 0x00, 0x09, 0x0b, + 0xe8, 0x97, 0x41, 0x39, 0x63, 0x00, 0x07, 0x0b, 0xa8, 0xf0, 0x04, 0x39, + 0x42, 0x00, 0x06, 0x0b, 0x24, 0x8c, 0x05, 0x29, 0x22, 0x34, 0x00, 0xb9, + 0xa0, 0x07, 0x00, 0x54, 0x21, 0x2a, 0x9c, 0x52, 0x1f, 0x00, 0x01, 0x6b, + 0x80, 0x06, 0x00, 0x54, 0x01, 0x00, 0xb0, 0x52, 0x1f, 0x00, 0x01, 0x6b, + 0x20, 0x07, 0x00, 0x54, 0x20, 0x06, 0x00, 0x35, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xcb, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x62, 0x1e, 0x40, 0xf9, + 0xe1, 0x00, 0x80, 0xd2, 0x60, 0x02, 0x40, 0x39, 0x28, 0x00, 0x80, 0x52, + 0x46, 0x01, 0x80, 0x52, 0xe1, 0x3f, 0x00, 0xf9, 0x42, 0x0c, 0x40, 0x39, + 0x05, 0x00, 0x00, 0x90, 0xa5, 0xc0, 0x10, 0x91, 0xe0, 0x03, 0x02, 0x39, + 0x5f, 0x00, 0x00, 0x71, 0xe8, 0x07, 0x02, 0x39, 0xe7, 0x07, 0x9f, 0x1a, + 0xe7, 0x0b, 0x02, 0x39, 0xe6, 0x87, 0x00, 0xb9, 0x04, 0x00, 0x00, 0x90, + 0x84, 0x00, 0x0f, 0x91, 0x03, 0x00, 0x00, 0x90, 0x63, 0x00, 0x24, 0x91, + 0x02, 0x00, 0x00, 0x90, 0x42, 0x40, 0x04, 0x91, 0xe5, 0x93, 0x08, 0xa9, + 0xe1, 0x83, 0x01, 0x91, 0xe3, 0x8b, 0x09, 0xa9, 0xe0, 0x83, 0x00, 0x91, + 0xe2, 0x8f, 0x47, 0xa9, 0xe2, 0x0f, 0x02, 0xa9, 0xe2, 0x8f, 0x48, 0xa9, + 0xe2, 0x0f, 0x03, 0xa9, 0xe2, 0x8f, 0x49, 0xa9, 0xe2, 0x0f, 0x04, 0xa9, + 0xf3, 0x2b, 0x00, 0xf9, 0xf3, 0x57, 0x00, 0xf9, 0xb3, 0x0b, 0xff, 0x97, + 0x61, 0x1e, 0x40, 0xf9, 0x65, 0x12, 0x40, 0xf9, 0x21, 0x00, 0x40, 0xb9, + 0x3f, 0x3c, 0x08, 0x72, 0x80, 0x00, 0x00, 0x54, 0xe1, 0x37, 0x40, 0xf9, + 0xa1, 0xa8, 0x00, 0xf9, 0xbd, 0xff, 0xff, 0x17, 0xbf, 0xa8, 0x00, 0xf9, + 0xbb, 0xff, 0xff, 0x17, 0x80, 0x26, 0x9c, 0x52, 0x81, 0x00, 0x80, 0x52, + 0xa1, 0x28, 0x01, 0xb9, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xcb, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xa0, 0x26, 0x9c, 0x52, 0xfa, 0xff, 0xff, 0x17, + 0x61, 0x00, 0x80, 0x52, 0xa1, 0x28, 0x01, 0xb9, 0xc7, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x40, 0xf9, 0x01, 0x10, 0x40, 0xf9, + 0x00, 0x00, 0x80, 0x52, 0x40, 0x14, 0x40, 0xbd, 0x21, 0x34, 0x41, 0xbd, + 0x30, 0x20, 0x20, 0x1e, 0xad, 0x00, 0x00, 0x54, 0x40, 0x18, 0x40, 0xbd, + 0x21, 0x38, 0x41, 0xbd, 0x30, 0x20, 0x20, 0x1e, 0xe0, 0xd7, 0x9f, 0x1a, + 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbc, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf5, 0x5b, 0x02, 0xa9, 0xd6, 0x0e, 0x00, 0xb0, + 0xd6, 0x02, 0x0d, 0x91, 0xf7, 0x1b, 0x00, 0xf9, 0xf5, 0x04, 0xff, 0x97, + 0xf7, 0x03, 0x00, 0x2a, 0xf3, 0x03, 0x17, 0xaa, 0xf5, 0x7e, 0x7a, 0xd3, + 0xd4, 0x02, 0x15, 0x8b, 0xd7, 0x6a, 0x35, 0x38, 0xf7, 0x79, 0xff, 0x97, + 0xc6, 0x0e, 0x00, 0xb0, 0xca, 0xc0, 0x09, 0x91, 0xe9, 0x03, 0x00, 0x2a, + 0xc4, 0x0e, 0x00, 0x90, 0x88, 0xc0, 0x1e, 0x91, 0xc5, 0x0e, 0x00, 0x90, + 0xa0, 0x40, 0x1b, 0x91, 0xc3, 0x0e, 0x00, 0xb0, 0x61, 0x00, 0x19, 0x91, + 0xc2, 0x0e, 0x00, 0x90, 0x47, 0xc0, 0x18, 0x91, 0x46, 0x03, 0x80, 0x52, + 0x85, 0x03, 0x80, 0x52, 0x04, 0x2b, 0x80, 0x52, 0x03, 0x0d, 0x80, 0x52, + 0x82, 0x02, 0x80, 0x52, 0xe5, 0x02, 0xa5, 0x9b, 0xc0, 0x0e, 0x00, 0xb0, + 0x00, 0x00, 0x15, 0x91, 0xe3, 0x06, 0xa3, 0x9b, 0xe2, 0x1e, 0xa2, 0x9b, + 0x89, 0x06, 0x00, 0x39, 0xe6, 0x2a, 0xa6, 0x9b, 0x83, 0x16, 0x00, 0xf9, + 0xe4, 0x22, 0xa4, 0x9b, 0x17, 0x14, 0x17, 0x8b, 0x86, 0x96, 0x00, 0xa9, + 0xb5, 0xc2, 0x00, 0x91, 0xc1, 0x02, 0x15, 0x8b, 0x97, 0x92, 0x01, 0xa9, + 0xe0, 0x03, 0x13, 0x2a, 0x82, 0x1e, 0x00, 0xf9, 0x5e, 0xf0, 0xff, 0x97, + 0x60, 0x00, 0x00, 0xf0, 0x00, 0xa0, 0x3e, 0x91, 0x82, 0x06, 0x40, 0xf9, + 0x61, 0x00, 0x00, 0xf0, 0x21, 0x20, 0x3e, 0x91, 0x04, 0x30, 0x40, 0x79, + 0x06, 0x1c, 0x40, 0xa9, 0x46, 0x1c, 0x00, 0xa9, 0x23, 0x18, 0x40, 0xb9, + 0x00, 0x08, 0x40, 0xf9, 0x40, 0x08, 0x00, 0xf9, 0x44, 0x30, 0x00, 0x79, + 0xe0, 0x03, 0x14, 0xaa, 0x24, 0x14, 0x40, 0xa9, 0x82, 0x0a, 0x40, 0xf9, + 0x21, 0x08, 0x40, 0xf9, 0x44, 0x14, 0x00, 0xa9, 0x41, 0x08, 0x00, 0xf9, + 0x43, 0x18, 0x00, 0xb9, 0x26, 0xfd, 0xff, 0x97, 0xc0, 0x00, 0x00, 0x34, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x03, 0x14, 0xaa, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x1b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc4, 0xa8, 0xde, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x7a, 0xd3, 0xc2, 0x0e, 0x00, 0xb0, 0x42, 0x00, 0x0d, 0x91, + 0x42, 0x00, 0x00, 0x8b, 0x40, 0x1c, 0x40, 0xf9, 0x20, 0x00, 0x00, 0xf9, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbf, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xa2, 0x04, 0xff, 0x97, 0x00, 0x7c, 0x7a, 0xd3, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc1, 0x0e, 0x00, 0x90, 0x21, 0x00, 0x0d, 0x91, + 0x20, 0x00, 0x00, 0x8b, 0xe0, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x03, 0x2a, + 0xf3, 0x03, 0x01, 0xaa, 0xf5, 0x13, 0x00, 0xf9, 0xf5, 0x03, 0x02, 0xaa, + 0x91, 0x04, 0xff, 0x97, 0x9f, 0x0e, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x54, + 0xa0, 0x24, 0x9c, 0x52, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xa1, 0x02, 0x40, 0xf9, + 0xe3, 0x03, 0x00, 0x2a, 0xc0, 0x24, 0x9c, 0x52, 0x3f, 0x9c, 0x01, 0xf1, + 0x09, 0xff, 0xff, 0x54, 0xc1, 0x0e, 0x00, 0x90, 0x21, 0x00, 0x19, 0x91, + 0x04, 0x0d, 0x80, 0x52, 0x02, 0x0d, 0x80, 0xd2, 0x00, 0x00, 0x80, 0x52, + 0x63, 0x04, 0xa4, 0x9b, 0x64, 0x14, 0x40, 0xa9, 0x64, 0x16, 0x00, 0xa9, + 0x64, 0x14, 0x41, 0xa9, 0x64, 0x16, 0x01, 0xa9, 0x64, 0x14, 0x42, 0xa9, + 0x64, 0x16, 0x02, 0xa9, 0x64, 0x14, 0x43, 0xa9, 0x64, 0x16, 0x03, 0xa9, + 0x64, 0x14, 0x44, 0xa9, 0x64, 0x16, 0x04, 0xa9, 0x64, 0x14, 0x45, 0xa9, + 0x64, 0x16, 0x05, 0xa9, 0x61, 0x30, 0x40, 0xf9, 0x61, 0x32, 0x00, 0xf9, + 0xa2, 0x02, 0x00, 0xf9, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, + 0xfd, 0x7b, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xba, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf5, 0x5b, 0x02, 0xa9, 0xf5, 0x03, 0x04, 0xaa, + 0xf6, 0x03, 0x05, 0x2a, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x01, 0x2a, + 0xf4, 0x03, 0x02, 0xaa, 0xf7, 0x1b, 0x00, 0xf9, 0xf7, 0x03, 0x00, 0x2a, + 0x5e, 0x04, 0xff, 0x97, 0xc1, 0x00, 0x80, 0x52, 0xa1, 0x02, 0x00, 0xb9, + 0x63, 0x0e, 0x00, 0x12, 0x7f, 0x0c, 0x00, 0x71, 0x40, 0x1d, 0x00, 0x54, + 0x61, 0x1e, 0x00, 0x12, 0x73, 0x02, 0x1c, 0x12, 0x3f, 0x04, 0x1e, 0x72, + 0x81, 0x02, 0x00, 0x54, 0x7f, 0x04, 0x00, 0x71, 0xc0, 0x1d, 0x00, 0x54, + 0x7f, 0x08, 0x00, 0x71, 0xa1, 0x05, 0x00, 0x54, 0x01, 0x7c, 0x7a, 0xd3, + 0xd3, 0x0e, 0x00, 0x90, 0x73, 0x02, 0x0d, 0x91, 0x62, 0x02, 0x01, 0x8b, + 0x64, 0x6a, 0x61, 0x38, 0x40, 0x10, 0x40, 0xf9, 0x01, 0x24, 0x40, 0xb9, + 0x61, 0x14, 0x00, 0x34, 0xe4, 0x7f, 0x01, 0x39, 0xe0, 0x03, 0x17, 0x2a, + 0x46, 0x04, 0xff, 0x97, 0x00, 0x7c, 0x7a, 0xd3, 0x60, 0x02, 0x00, 0x8b, + 0x87, 0x01, 0x00, 0x94, 0x5b, 0x00, 0x00, 0x14, 0x7f, 0x20, 0x00, 0x71, + 0x60, 0x16, 0x00, 0x54, 0x7f, 0x24, 0x00, 0x71, 0x61, 0x06, 0x00, 0x54, + 0xd3, 0x0b, 0x00, 0x34, 0xe1, 0x03, 0x00, 0x2a, 0x82, 0x03, 0x80, 0xd2, + 0xa3, 0x0e, 0x00, 0xf0, 0x63, 0x40, 0x1b, 0x91, 0x88, 0x1e, 0x40, 0x29, + 0x21, 0x7c, 0x02, 0x9b, 0x86, 0x16, 0x41, 0x29, 0x62, 0x00, 0x01, 0x8b, + 0x84, 0x12, 0x40, 0xb9, 0x00, 0x00, 0x80, 0x52, 0x81, 0x82, 0x42, 0x2d, + 0x68, 0x68, 0x21, 0xb8, 0x47, 0x04, 0x00, 0xb9, 0x46, 0x14, 0x01, 0x29, + 0x44, 0x10, 0x00, 0xb9, 0x41, 0x80, 0x02, 0x2d, 0xf7, 0x1b, 0x40, 0xf9, + 0x80, 0x02, 0x00, 0xb9, 0xa1, 0x02, 0x40, 0xb9, 0x81, 0x0a, 0x00, 0x79, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x83, 0x07, 0x00, 0x35, 0x73, 0x0b, 0x00, 0x34, + 0xe0, 0x03, 0x00, 0x2a, 0x43, 0x03, 0x80, 0xd2, 0xc4, 0x0e, 0x00, 0x90, + 0x84, 0xc0, 0x09, 0x91, 0x86, 0x02, 0x40, 0x39, 0x8a, 0x2a, 0x00, 0x91, + 0x03, 0x7c, 0x03, 0x9b, 0xc1, 0x0e, 0x00, 0x90, 0x21, 0x00, 0x15, 0x91, + 0x25, 0x00, 0x80, 0x52, 0x82, 0x00, 0x03, 0x8b, 0x21, 0x14, 0x00, 0x8b, + 0x4b, 0x28, 0x00, 0x91, 0x00, 0x00, 0x80, 0x52, 0x86, 0x68, 0x23, 0x38, + 0x83, 0x06, 0x40, 0x39, 0x43, 0x04, 0x00, 0x39, 0x43, 0x09, 0x7f, 0x2d, + 0x41, 0x01, 0x40, 0x2d, 0x25, 0x0c, 0x00, 0x39, 0x63, 0x09, 0x3f, 0x2d, + 0x61, 0x01, 0x00, 0x2d, 0x25, 0x00, 0x00, 0x14, 0x7f, 0x10, 0x00, 0x71, + 0x41, 0x04, 0x00, 0x54, 0xd3, 0x0a, 0x00, 0x34, 0xe5, 0x03, 0x00, 0x2a, + 0x82, 0x02, 0x80, 0xd2, 0xa4, 0x0e, 0x00, 0xf0, 0x84, 0xc0, 0x18, 0x91, + 0x00, 0x7c, 0xa2, 0x9b, 0x88, 0x46, 0x40, 0x39, 0xa9, 0x7c, 0x02, 0x9b, + 0xe3, 0x03, 0x14, 0xaa, 0x21, 0x00, 0x80, 0xd2, 0x80, 0x00, 0x00, 0x8b, + 0x82, 0x00, 0x09, 0x8b, 0xe7, 0x03, 0x01, 0x2a, 0xe6, 0x03, 0x02, 0xaa, + 0x48, 0x08, 0x00, 0x39, 0x6a, 0xd4, 0x5f, 0x38, 0x8a, 0x68, 0x29, 0x38, + 0x5f, 0x0c, 0x00, 0x39, 0x62, 0x78, 0x61, 0xb8, 0x02, 0x78, 0x21, 0xb8, + 0x21, 0x04, 0x00, 0x91, 0x3f, 0x14, 0x00, 0xf1, 0x42, 0x00, 0x00, 0x34, + 0xc7, 0x0c, 0x00, 0x39, 0x41, 0xff, 0xff, 0x54, 0x93, 0x02, 0x80, 0xd2, + 0xb3, 0x10, 0x13, 0x9b, 0x60, 0x06, 0x40, 0x39, 0x1f, 0x00, 0x00, 0x71, + 0x00, 0x19, 0x41, 0x7a, 0xc0, 0x1b, 0x00, 0x54, 0x00, 0x00, 0x80, 0x52, + 0x02, 0x00, 0x00, 0x14, 0xe0, 0x24, 0x9c, 0x52, 0xf7, 0x1b, 0x40, 0xf9, + 0x80, 0x02, 0x00, 0xb9, 0xa1, 0x02, 0x40, 0xb9, 0x81, 0x0a, 0x00, 0x79, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x41, 0x04, 0x80, 0x52, 0xa1, 0x02, 0x00, 0xb9, + 0xdf, 0x86, 0x00, 0x71, 0xa9, 0x05, 0x00, 0x54, 0xe1, 0x03, 0x00, 0x2a, + 0x83, 0x03, 0x80, 0xd2, 0xa4, 0x0e, 0x00, 0xf0, 0x84, 0x40, 0x1b, 0x91, + 0x82, 0x4a, 0x00, 0x91, 0x00, 0x00, 0x80, 0x52, 0x21, 0x7c, 0x03, 0x9b, + 0x83, 0x00, 0x01, 0x8b, 0x81, 0x68, 0x61, 0xb8, 0x61, 0x80, 0x42, 0x2d, + 0x66, 0x94, 0x40, 0x29, 0x64, 0x0c, 0x40, 0xb9, 0x81, 0x62, 0x00, 0xb8, + 0x61, 0x10, 0x40, 0xb9, 0x46, 0x14, 0x3f, 0x29, 0x44, 0x04, 0x00, 0x29, + 0x81, 0xa2, 0x01, 0xbc, 0x80, 0xe2, 0x01, 0xbc, 0xe2, 0xff, 0xff, 0x17, + 0x01, 0x03, 0x80, 0x52, 0xa1, 0x02, 0x00, 0xb9, 0xdf, 0x5e, 0x00, 0x71, + 0xc9, 0x02, 0x00, 0x54, 0xe1, 0x03, 0x00, 0x2a, 0x43, 0x03, 0x80, 0xd2, + 0xc4, 0x0e, 0x00, 0x90, 0x84, 0xc0, 0x09, 0x91, 0x00, 0x00, 0x80, 0x52, + 0x21, 0x7c, 0x03, 0x9b, 0x83, 0x00, 0x01, 0x8b, 0x69, 0x28, 0x00, 0x91, + 0x81, 0x68, 0x61, 0x38, 0x81, 0x1a, 0x00, 0x39, 0x61, 0x04, 0x40, 0x39, + 0x81, 0x1e, 0x00, 0x39, 0x23, 0x09, 0x7f, 0x2d, 0x21, 0x01, 0x40, 0x2d, + 0x83, 0x0a, 0x01, 0x2d, 0x81, 0x02, 0x02, 0x2d, 0xcd, 0xff, 0xff, 0x17, + 0x01, 0x09, 0x80, 0x52, 0xa1, 0x02, 0x00, 0xb9, 0xdf, 0x1e, 0x01, 0x71, + 0x88, 0x11, 0x00, 0x54, 0x00, 0x25, 0x9c, 0x52, 0xf7, 0x1b, 0x40, 0xf9, + 0x80, 0x02, 0x00, 0xb9, 0xa1, 0x02, 0x40, 0xb9, 0x81, 0x0a, 0x00, 0x79, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xfd, 0x7b, 0xc6, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x28, 0x40, 0xb9, 0xa0, 0xeb, 0xff, 0x35, + 0x45, 0x04, 0x40, 0x39, 0xe1, 0x7f, 0x01, 0x91, 0xe5, 0x13, 0x09, 0x29, + 0xe0, 0x03, 0x05, 0x2a, 0x88, 0x23, 0xff, 0x97, 0xe5, 0x13, 0x49, 0x29, + 0x00, 0x13, 0x00, 0x34, 0xe6, 0x7f, 0x41, 0x39, 0x02, 0x3c, 0x00, 0x12, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x63, 0x00, 0x00, 0xd0, + 0x63, 0xa0, 0x3c, 0x91, 0x4f, 0x4d, 0xff, 0x97, 0xc0, 0x26, 0x9c, 0x52, + 0xf7, 0x1b, 0x40, 0xf9, 0x80, 0x02, 0x00, 0xb9, 0xa1, 0x02, 0x40, 0xb9, + 0x81, 0x0a, 0x00, 0x79, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xb3, 0x06, 0x00, 0x34, + 0xe0, 0x03, 0x00, 0x2a, 0x43, 0x03, 0x80, 0xd2, 0xc4, 0x0e, 0x00, 0x90, + 0x84, 0xc0, 0x09, 0x91, 0x86, 0x02, 0x40, 0x39, 0x87, 0x2a, 0x00, 0x91, + 0x03, 0x7c, 0x03, 0x9b, 0xc1, 0x0e, 0x00, 0x90, 0x21, 0x00, 0x15, 0x91, + 0x25, 0x00, 0x80, 0x52, 0x82, 0x00, 0x03, 0x8b, 0x21, 0x14, 0x00, 0x8b, + 0x48, 0x28, 0x00, 0x91, 0x00, 0x00, 0x80, 0x52, 0x86, 0x68, 0x23, 0x38, + 0x83, 0x06, 0x40, 0x39, 0x43, 0x04, 0x00, 0x39, 0xe4, 0x0c, 0x7f, 0x2d, + 0xe2, 0x04, 0x40, 0x2d, 0x80, 0x22, 0x41, 0xbc, 0x84, 0x2e, 0x40, 0x79, + 0x83, 0x32, 0x40, 0x79, 0x04, 0x0d, 0x3f, 0x2d, 0x02, 0x05, 0x00, 0x2d, + 0x25, 0x0c, 0x00, 0x39, 0x40, 0x20, 0x01, 0xbc, 0x44, 0x2c, 0x00, 0x79, + 0x43, 0x30, 0x00, 0x79, 0x89, 0xff, 0xff, 0x17, 0x00, 0x7c, 0x7a, 0xd3, + 0xd3, 0x0e, 0x00, 0x90, 0x73, 0x02, 0x0d, 0x91, 0x73, 0x02, 0x00, 0x8b, + 0xe0, 0x03, 0x13, 0xaa, 0xd6, 0xfb, 0xff, 0x97, 0x40, 0xf0, 0xff, 0x35, + 0xe0, 0x03, 0x13, 0xaa, 0x97, 0x00, 0x00, 0x94, 0x7f, 0xff, 0xff, 0x17, + 0x73, 0x05, 0x00, 0x34, 0xe1, 0x03, 0x00, 0x2a, 0x82, 0x03, 0x80, 0xd2, + 0xa3, 0x0e, 0x00, 0xf0, 0x63, 0x40, 0x1b, 0x91, 0x87, 0x1a, 0x40, 0x29, + 0x21, 0x7c, 0x02, 0x9b, 0x85, 0x12, 0x41, 0x29, 0x62, 0x00, 0x01, 0x8b, + 0x00, 0x00, 0x80, 0x52, 0x81, 0x02, 0x42, 0x2d, 0x67, 0x68, 0x21, 0xb8, + 0x2a, 0xff, 0xff, 0x17, 0x01, 0x04, 0x80, 0x52, 0xa1, 0x02, 0x00, 0xb9, + 0xdf, 0x7e, 0x00, 0x71, 0xc9, 0xf4, 0xff, 0x54, 0xe1, 0x03, 0x00, 0x2a, + 0x43, 0x03, 0x80, 0xd2, 0xc4, 0x0e, 0x00, 0x90, 0x84, 0xc0, 0x09, 0x91, + 0x82, 0x1a, 0x00, 0x91, 0x00, 0x00, 0x80, 0x52, 0x21, 0x7c, 0x03, 0x9b, + 0x83, 0x00, 0x01, 0x8b, 0x65, 0x28, 0x00, 0x91, 0x81, 0x68, 0x61, 0x38, + 0x81, 0x1a, 0x00, 0x39, 0xe1, 0x03, 0x02, 0xaa, 0x26, 0x28, 0x00, 0x91, + 0x64, 0x04, 0x40, 0x39, 0x44, 0x04, 0x00, 0x39, 0xa4, 0x0c, 0x7f, 0x2d, + 0xa2, 0x04, 0x40, 0x2d, 0x64, 0x2c, 0x40, 0x79, 0x62, 0x30, 0x40, 0x79, + 0x60, 0x20, 0x41, 0xbc, 0x24, 0x2c, 0x00, 0x79, 0x22, 0x30, 0x00, 0x79, + 0xc4, 0x0c, 0x3f, 0x2d, 0xc2, 0x04, 0x00, 0x2d, 0x20, 0x20, 0x01, 0xbc, + 0x54, 0xff, 0xff, 0x17, 0xc1, 0x03, 0x80, 0x52, 0xa1, 0x02, 0x00, 0xb9, + 0xdf, 0x76, 0x00, 0x71, 0x09, 0xf1, 0xff, 0x54, 0xe1, 0x03, 0x00, 0x2a, + 0x83, 0x03, 0x80, 0xd2, 0xa4, 0x0e, 0x00, 0xf0, 0x84, 0x40, 0x1b, 0x91, + 0x00, 0x00, 0x80, 0x52, 0x21, 0x7c, 0x03, 0x9b, 0x83, 0x00, 0x01, 0x8b, + 0x81, 0x68, 0x61, 0xb8, 0x61, 0x80, 0x42, 0x2d, 0x65, 0x10, 0x41, 0x29, + 0x81, 0x62, 0x00, 0xb8, 0x61, 0x10, 0x40, 0xb9, 0x85, 0xa2, 0x00, 0xb8, + 0x84, 0xe2, 0x00, 0xb8, 0x81, 0x22, 0x01, 0xb8, 0x81, 0x62, 0x01, 0xbc, + 0x80, 0xa2, 0x01, 0xbc, 0x3e, 0xff, 0xff, 0x17, 0xa2, 0x0e, 0x00, 0xf0, + 0x43, 0xc0, 0x18, 0x91, 0xe0, 0x03, 0x00, 0x2a, 0x82, 0x02, 0x80, 0xd2, + 0x02, 0x0c, 0x02, 0x9b, 0x42, 0x04, 0x40, 0x39, 0x82, 0x1a, 0x00, 0x39, + 0x9f, 0x1e, 0x00, 0x39, 0x5f, 0x04, 0x00, 0x71, 0x9f, 0xfe, 0x00, 0xa9, + 0x9f, 0xfe, 0x01, 0xa9, 0x9f, 0xfe, 0x02, 0xa9, 0x9f, 0xfe, 0x03, 0xa9, + 0xa1, 0xe5, 0xff, 0x54, 0xc1, 0x0e, 0x00, 0x90, 0x21, 0x00, 0x0d, 0x91, + 0x21, 0x18, 0x00, 0x8b, 0x82, 0x1e, 0x00, 0x39, 0x00, 0x00, 0x80, 0x52, + 0x21, 0x10, 0x40, 0xf9, 0x21, 0xa8, 0x40, 0xf9, 0x81, 0x06, 0x00, 0xf9, + 0x27, 0xff, 0xff, 0x17, 0xc0, 0x0e, 0x00, 0x90, 0x00, 0x00, 0x0d, 0x91, + 0x00, 0x18, 0x05, 0x8b, 0x8a, 0xfc, 0xff, 0x97, 0x00, 0x00, 0x80, 0x52, + 0x7f, 0x12, 0x00, 0x78, 0x20, 0xff, 0xff, 0x17, 0xe6, 0x7f, 0x41, 0x39, + 0x02, 0x00, 0x80, 0x52, 0xdf, 0x00, 0x04, 0x6b, 0x01, 0xed, 0xff, 0x54, + 0xbb, 0xfe, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0x23, 0x20, 0x00, 0x91, 0x22, 0x10, 0x00, 0x91, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0x13, 0x1c, 0x00, 0x12, 0xe0, 0x03, 0x13, 0x2a, + 0x81, 0x22, 0xff, 0x97, 0xa0, 0x00, 0x00, 0x35, 0x00, 0x00, 0x80, 0x52, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe4, 0x03, 0x13, 0x2a, 0xe2, 0x03, 0x00, 0x2a, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0x63, 0x00, 0x00, 0xd0, 0x63, 0x20, 0x3f, 0x91, + 0xa5, 0x4c, 0xff, 0x97, 0xc0, 0x25, 0x9c, 0x52, 0xf3, 0x0b, 0x40, 0xf9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x0b, 0x00, 0xf9, 0x13, 0x1c, 0x00, 0x12, + 0xe0, 0x03, 0x13, 0x2a, 0xa3, 0x22, 0xff, 0x97, 0xa0, 0x00, 0x00, 0x35, + 0x00, 0x00, 0x80, 0x52, 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe4, 0x03, 0x13, 0x2a, 0xe2, 0x03, 0x00, 0x2a, + 0x01, 0x1c, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x63, 0x00, 0x00, 0xd0, + 0x63, 0xa0, 0x3f, 0x91, 0x8f, 0x4c, 0xff, 0x97, 0xe0, 0x25, 0x9c, 0x52, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x03, 0x00, 0xaa, + 0x23, 0x00, 0x80, 0x52, 0x00, 0x00, 0x80, 0x52, 0x41, 0x14, 0x40, 0xf9, + 0x3f, 0x7c, 0x00, 0xa9, 0x3f, 0x7c, 0x01, 0xa9, 0x3f, 0x7c, 0x02, 0xa9, + 0x3f, 0x7c, 0x03, 0xa9, 0x3f, 0x7c, 0x04, 0xa9, 0x3f, 0x7c, 0x05, 0xa9, + 0x3f, 0x30, 0x00, 0xf9, 0x41, 0x0c, 0x40, 0xf9, 0x3f, 0x7c, 0x00, 0xa9, + 0x3f, 0x7c, 0x01, 0xa9, 0x41, 0x0c, 0x40, 0xf9, 0x23, 0x0c, 0x00, 0x39, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xb6, 0xa9, 0xfd, 0x03, 0x00, 0x91, + 0xfb, 0x73, 0x05, 0xa9, 0xfc, 0x03, 0x00, 0xaa, 0x00, 0x14, 0x40, 0xf9, + 0xf5, 0x5b, 0x02, 0xa9, 0x95, 0x0f, 0x40, 0xf9, 0xf3, 0x53, 0x01, 0xa9, + 0x1f, 0x04, 0x00, 0xb9, 0xa1, 0x12, 0x00, 0x91, 0xbf, 0x02, 0x00, 0x79, + 0xbf, 0x0a, 0x00, 0x39, 0x80, 0x03, 0x40, 0x39, 0xaf, 0xff, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0x20, 0x0f, 0x00, 0x34, 0x82, 0x1f, 0x40, 0xf9, + 0x7f, 0x02, 0x00, 0x71, 0xf5, 0x07, 0x9f, 0x1a, 0x01, 0x20, 0xa0, 0x52, + 0x40, 0x00, 0x40, 0xb9, 0x00, 0x9c, 0x08, 0x12, 0x1f, 0x00, 0x01, 0x6b, + 0x60, 0x0a, 0x00, 0x54, 0x00, 0x00, 0xb0, 0x52, 0x7f, 0x02, 0x00, 0x6b, + 0x94, 0x17, 0x40, 0xf9, 0x21, 0x01, 0x00, 0x54, 0x80, 0x5e, 0x40, 0xb9, + 0x81, 0x02, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x11, 0x96, 0x0f, 0x40, 0xf9, + 0x80, 0x5e, 0x00, 0xb9, 0xe0, 0x03, 0x13, 0x2a, 0xf3, 0x03, 0x01, 0x2a, + 0x12, 0x00, 0x00, 0x14, 0x40, 0x27, 0x9c, 0x52, 0x7f, 0x02, 0x00, 0x6b, + 0x80, 0x24, 0x9c, 0x52, 0x64, 0x12, 0x40, 0x7a, 0x41, 0x1a, 0x00, 0x54, + 0x96, 0x0f, 0x40, 0xf9, 0xe0, 0x03, 0x13, 0x2a, 0xe1, 0x29, 0x9c, 0x52, + 0x7f, 0x02, 0x01, 0x6b, 0xc0, 0x09, 0x00, 0x54, 0x81, 0x26, 0x9c, 0x52, + 0x7f, 0x02, 0x01, 0x6b, 0xc1, 0x04, 0x00, 0x54, 0x81, 0x52, 0x40, 0xb9, + 0x00, 0x00, 0x80, 0x52, 0x21, 0x04, 0x00, 0x11, 0x81, 0x52, 0x00, 0xb9, + 0x81, 0x13, 0x40, 0xf9, 0xb3, 0x00, 0x00, 0x35, 0x22, 0xf0, 0x44, 0x39, + 0xd3, 0x27, 0x9c, 0x52, 0x5f, 0x00, 0x00, 0x71, 0xf3, 0x03, 0x93, 0x1a, + 0x82, 0x0e, 0x40, 0xb9, 0x93, 0x02, 0x00, 0xb9, 0x42, 0x04, 0x00, 0x11, + 0x82, 0x0e, 0x00, 0xb9, 0x22, 0x28, 0x41, 0xb9, 0x5f, 0x08, 0x00, 0x71, + 0xe1, 0x00, 0x00, 0x54, 0xc3, 0x16, 0x40, 0xbd, 0xc0, 0x1e, 0x40, 0xbd, + 0x22, 0x34, 0x41, 0xbd, 0x21, 0x38, 0x41, 0xbd, 0x83, 0x82, 0x03, 0x2d, + 0x82, 0x86, 0x02, 0x2d, 0xc2, 0x0a, 0x40, 0x39, 0x21, 0x30, 0x40, 0xb9, + 0x81, 0x2a, 0x00, 0xb9, 0xc2, 0x00, 0x00, 0x34, 0x81, 0x12, 0x40, 0xb9, + 0x82, 0x0c, 0x80, 0x52, 0x82, 0x06, 0x00, 0xb9, 0x21, 0x04, 0x00, 0x11, + 0x81, 0x12, 0x00, 0xb9, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xca, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xa1, 0x26, 0x9c, 0x52, 0x7f, 0x02, 0x01, 0x6b, 0x61, 0x24, 0x9c, 0x52, + 0x64, 0x12, 0x41, 0x7a, 0x81, 0x00, 0x00, 0x54, 0x81, 0x56, 0x40, 0xb9, + 0x21, 0x04, 0x00, 0x11, 0x81, 0x56, 0x00, 0xb9, 0xa1, 0x28, 0x9c, 0x52, + 0x1f, 0x00, 0x01, 0x6b, 0x01, 0x04, 0x00, 0x54, 0x81, 0x62, 0x40, 0xb9, + 0x00, 0x00, 0x80, 0x52, 0x21, 0x04, 0x00, 0x11, 0x81, 0x62, 0x00, 0xb9, + 0xd0, 0xff, 0xff, 0x17, 0xf7, 0x63, 0x43, 0xa9, 0xd3, 0x28, 0x9c, 0x52, + 0xf9, 0x6b, 0x44, 0xa9, 0xe8, 0x27, 0x46, 0x6d, 0x21, 0x00, 0x80, 0xd2, + 0x40, 0x78, 0x61, 0xb8, 0xbf, 0x02, 0x00, 0x71, 0x21, 0x04, 0x00, 0x91, + 0x00, 0x10, 0x53, 0x7a, 0x80, 0x28, 0x00, 0x54, 0x3f, 0x14, 0x00, 0xf1, + 0x41, 0xff, 0xff, 0x54, 0x40, 0x04, 0x40, 0x39, 0xa0, 0xf4, 0xff, 0x35, + 0xe0, 0x03, 0x1c, 0xaa, 0xc7, 0xfb, 0xff, 0x97, 0x00, 0x00, 0xb0, 0x52, + 0x7f, 0x02, 0x00, 0x6b, 0x94, 0x17, 0x40, 0xf9, 0x60, 0xf4, 0xff, 0x54, + 0xaa, 0xff, 0xff, 0x17, 0x81, 0x5a, 0x40, 0xb9, 0x00, 0x00, 0x80, 0x52, + 0x21, 0x04, 0x00, 0x11, 0x81, 0x5a, 0x00, 0xb9, 0xb6, 0xff, 0xff, 0x17, + 0x81, 0x2a, 0x9c, 0x52, 0x1f, 0x00, 0x01, 0x6b, 0xc1, 0x31, 0x00, 0x54, + 0x81, 0x66, 0x40, 0xb9, 0x00, 0x00, 0x80, 0x52, 0x21, 0x04, 0x00, 0x11, + 0x81, 0x66, 0x00, 0xb9, 0xae, 0xff, 0xff, 0x17, 0x80, 0x07, 0x40, 0x39, + 0xa1, 0x42, 0x00, 0x91, 0x4a, 0xff, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x80, 0xf0, 0xff, 0x35, 0x94, 0x0b, 0x40, 0xf9, 0xe0, 0x03, 0x1c, 0xaa, + 0xf7, 0x63, 0x03, 0xa9, 0x37, 0x00, 0x80, 0x52, 0x96, 0x0a, 0x40, 0xb9, + 0xf7, 0x7f, 0x00, 0xb9, 0x9b, 0x13, 0x40, 0xf9, 0x0c, 0xfb, 0xff, 0x97, + 0x81, 0x02, 0x40, 0xb9, 0xf3, 0x03, 0x00, 0x2a, 0x61, 0x0b, 0x00, 0x34, + 0x33, 0x23, 0x00, 0x35, 0xe8, 0x27, 0x06, 0x6d, 0x08, 0x04, 0x00, 0x0f, + 0x16, 0x00, 0x80, 0x52, 0xf9, 0x6b, 0x04, 0xa9, 0x3a, 0x00, 0x80, 0x52, + 0x09, 0x41, 0x20, 0x1e, 0x0c, 0x00, 0x00, 0x14, 0x20, 0x2b, 0x41, 0xb9, + 0x1f, 0x08, 0x00, 0x71, 0x80, 0x02, 0x00, 0x54, 0x61, 0x03, 0x08, 0x91, + 0xe0, 0x7f, 0x40, 0xb9, 0xd6, 0x06, 0x00, 0x11, 0xdf, 0x02, 0x00, 0x6b, + 0x21, 0x80, 0x66, 0x2d, 0x29, 0x29, 0x21, 0x1e, 0x08, 0x29, 0x20, 0x1e, + 0xc0, 0x05, 0x00, 0x54, 0x98, 0xe7, 0x41, 0xa9, 0x14, 0x00, 0x80, 0x52, + 0x97, 0x07, 0x40, 0xf9, 0xe0, 0x03, 0x1c, 0xaa, 0x81, 0xfc, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0xe0, 0xfd, 0xff, 0x34, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xe8, 0x27, 0x46, 0x6d, 0x5b, 0xff, 0xff, 0x17, + 0x80, 0x1f, 0x40, 0xf9, 0x01, 0x00, 0x40, 0x39, 0x01, 0x07, 0x00, 0x35, + 0xe0, 0x02, 0x40, 0x39, 0x60, 0x00, 0x00, 0x35, 0x1a, 0x03, 0x00, 0x39, + 0xe7, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x1c, 0xaa, 0x94, 0x06, 0x00, 0x11, + 0xf5, 0xfc, 0xff, 0x97, 0x1f, 0x1c, 0x00, 0x72, 0x41, 0xff, 0xff, 0x54, + 0x81, 0x17, 0x40, 0xf9, 0xe0, 0x2e, 0x40, 0x79, 0x22, 0x38, 0x40, 0xb9, + 0x9f, 0x02, 0x00, 0x6b, 0x42, 0x04, 0x00, 0x11, 0x22, 0x38, 0x00, 0xb9, + 0x29, 0x01, 0x00, 0x54, 0x20, 0x4c, 0x40, 0xb9, 0x93, 0x24, 0x9c, 0x52, + 0xf7, 0x63, 0x43, 0xa9, 0x00, 0x04, 0x00, 0x11, 0xf9, 0x6b, 0x44, 0xa9, + 0xe8, 0x27, 0x46, 0x6d, 0x20, 0x4c, 0x00, 0xb9, 0x40, 0xff, 0xff, 0x17, + 0x80, 0x1f, 0x40, 0xf9, 0x00, 0x0c, 0x40, 0x39, 0x40, 0x06, 0x00, 0x35, + 0xe0, 0x32, 0x40, 0x79, 0x20, 0xfb, 0xff, 0x34, 0x3e, 0x27, 0xff, 0x97, + 0xd7, 0xff, 0xff, 0x17, 0xc0, 0x02, 0x23, 0x1e, 0x01, 0x10, 0x2e, 0x1e, + 0x94, 0x17, 0x40, 0xf9, 0xa0, 0x02, 0x40, 0x39, 0x20, 0x18, 0x20, 0x1e, + 0x29, 0x09, 0x20, 0x1e, 0x08, 0x09, 0x20, 0x1e, 0x29, 0xa0, 0x26, 0x2d, + 0x96, 0x26, 0x00, 0xb9, 0xa0, 0x10, 0x00, 0x35, 0xb5, 0x06, 0x40, 0x39, + 0xb5, 0x04, 0x00, 0x35, 0x82, 0x1f, 0x40, 0xf9, 0x01, 0x20, 0xa0, 0x52, + 0x40, 0x00, 0x40, 0xb9, 0x00, 0x9c, 0x08, 0x12, 0x1f, 0x00, 0x01, 0x6b, + 0xe0, 0x12, 0x00, 0x54, 0x01, 0x00, 0x80, 0x52, 0x96, 0x0f, 0x40, 0xf9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xe8, 0x27, 0x46, 0x6d, + 0x32, 0xff, 0xff, 0x17, 0x1a, 0x04, 0x00, 0x39, 0xb2, 0xff, 0xff, 0x17, + 0x60, 0x27, 0x40, 0xb9, 0xa0, 0xf4, 0xff, 0x35, 0x60, 0x2b, 0x40, 0xb9, + 0x60, 0xf4, 0xff, 0x35, 0xdf, 0x02, 0x00, 0x71, 0xc0, 0x12, 0x97, 0x1a, + 0xe0, 0x7f, 0x00, 0xb9, 0x9f, 0xff, 0xff, 0x17, 0x23, 0x25, 0x9c, 0x12, + 0x60, 0x02, 0x03, 0x0b, 0x1f, 0x04, 0x00, 0x71, 0x89, 0xe5, 0xff, 0x54, + 0x62, 0x26, 0x9c, 0x12, 0x60, 0x02, 0x02, 0x0b, 0x1f, 0x04, 0x00, 0x71, + 0xe0, 0x03, 0x13, 0x2a, 0x96, 0x0f, 0x40, 0xf9, 0xe8, 0x12, 0x00, 0x54, + 0x27, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x1c, 0xaa, 0x36, 0xfb, 0xff, 0x97, + 0xcd, 0xff, 0xff, 0x17, 0x94, 0x07, 0x40, 0xf9, 0x96, 0x0f, 0x40, 0xf9, + 0x80, 0x06, 0x40, 0x39, 0x20, 0x0f, 0x00, 0x35, 0x80, 0x03, 0x40, 0x39, + 0xe1, 0x43, 0x02, 0x91, 0xff, 0x43, 0x02, 0x39, 0x49, 0xed, 0xff, 0x97, + 0x20, 0x17, 0x00, 0x35, 0xe0, 0x43, 0x42, 0x39, 0xa0, 0x12, 0x00, 0x35, + 0x81, 0x62, 0x40, 0xbc, 0xe1, 0x43, 0x02, 0x91, 0xc8, 0x1a, 0x40, 0xbd, + 0x20, 0x40, 0x21, 0x1e, 0x08, 0x79, 0x21, 0x1e, 0x08, 0x68, 0x28, 0x1e, + 0xc8, 0x1e, 0x00, 0xbd, 0x80, 0x03, 0x40, 0x39, 0xa1, 0xfe, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0xa0, 0xf2, 0xff, 0x35, 0x80, 0x07, 0x40, 0x39, + 0xe1, 0x3f, 0x02, 0x91, 0xb4, 0xfe, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x00, 0xf2, 0xff, 0x35, 0xe0, 0x93, 0x40, 0xbd, 0x80, 0x0f, 0x40, 0xf9, + 0x02, 0x00, 0x26, 0x1e, 0xe3, 0x3f, 0x42, 0x39, 0x01, 0x04, 0x40, 0xb9, + 0x5f, 0x00, 0x01, 0x6b, 0xa1, 0x00, 0x00, 0x54, 0x01, 0x08, 0x40, 0xb9, + 0xe2, 0x97, 0x40, 0xb9, 0x5f, 0x00, 0x01, 0x6b, 0x00, 0x01, 0x00, 0x54, + 0x82, 0x17, 0x40, 0xf9, 0x24, 0x00, 0x80, 0x52, 0x53, 0x27, 0x9c, 0x52, + 0x41, 0x3c, 0x40, 0xb9, 0x21, 0x04, 0x00, 0x11, 0x41, 0x3c, 0x00, 0xb9, + 0x04, 0x0c, 0x00, 0x39, 0x00, 0x40, 0x40, 0x39, 0x1f, 0x00, 0x03, 0x6b, + 0xa0, 0x00, 0x00, 0x54, 0x81, 0x17, 0x40, 0xf9, 0x20, 0x40, 0x40, 0xb9, + 0x00, 0x04, 0x00, 0x11, 0x20, 0x40, 0x00, 0xb9, 0x80, 0x02, 0x40, 0x39, + 0xa0, 0xee, 0xff, 0x34, 0x93, 0xee, 0xff, 0x35, 0x01, 0xd8, 0x21, 0x7e, + 0xe0, 0x4d, 0x82, 0x52, 0x60, 0x50, 0xa7, 0x72, 0x00, 0x00, 0x27, 0x1e, + 0x82, 0xe2, 0x40, 0xbc, 0x83, 0xa2, 0x40, 0xbc, 0x20, 0x20, 0x00, 0x1f, + 0x10, 0x20, 0x22, 0x1e, 0xec, 0x0d, 0x00, 0x54, 0x10, 0x20, 0x23, 0x1e, + 0x44, 0x11, 0x00, 0x54, 0x40, 0x8f, 0xa8, 0x52, 0x01, 0x00, 0x27, 0x1e, + 0x93, 0x03, 0x40, 0x39, 0x00, 0x08, 0x21, 0x1e, 0xe0, 0x03, 0x13, 0x2a, + 0x01, 0x00, 0x24, 0x9e, 0xbc, 0x20, 0xff, 0x97, 0x80, 0x14, 0x00, 0x35, + 0x80, 0x03, 0x40, 0x39, 0xc1, 0x12, 0x00, 0x91, 0x68, 0xfe, 0xff, 0x97, + 0xf3, 0x03, 0x00, 0x2a, 0x80, 0xeb, 0xff, 0x35, 0x82, 0x1f, 0x40, 0xf9, + 0x20, 0x00, 0x80, 0x52, 0xc0, 0x0a, 0x00, 0x39, 0x01, 0x20, 0xa0, 0x52, + 0x40, 0x00, 0x40, 0xb9, 0x00, 0x9c, 0x08, 0x12, 0x1f, 0x00, 0x01, 0x6b, + 0x00, 0x15, 0x00, 0x54, 0x00, 0x00, 0x80, 0x52, 0x96, 0x87, 0x41, 0xa9, + 0x94, 0x17, 0x40, 0xf9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xe8, 0x27, 0x46, 0x6d, 0xd2, 0xfe, 0xff, 0x17, 0x80, 0x13, 0x40, 0xf9, + 0x00, 0x00, 0x08, 0x91, 0x02, 0x40, 0x53, 0xbc, 0x58, 0x20, 0x20, 0x1e, + 0x0d, 0xef, 0xff, 0x54, 0x96, 0x0f, 0x40, 0xf9, 0x00, 0x80, 0x53, 0xbc, + 0x80, 0x07, 0x40, 0xf9, 0x00, 0x18, 0x22, 0x1e, 0xc1, 0x0e, 0x40, 0x39, + 0x81, 0x06, 0x00, 0x35, 0x02, 0x20, 0x41, 0xbc, 0xc3, 0x16, 0x40, 0xbd, + 0x21, 0x38, 0x22, 0x1e, 0x21, 0x08, 0x20, 0x1e, 0x40, 0x04, 0x03, 0x1f, + 0xc0, 0x16, 0x00, 0xbd, 0x01, 0x20, 0x40, 0xbc, 0x00, 0x18, 0x21, 0x1e, + 0x15, 0x09, 0x00, 0x94, 0x01, 0x90, 0x24, 0x1e, 0x20, 0x00, 0x80, 0x52, + 0xc0, 0x06, 0x00, 0x39, 0x00, 0x08, 0x21, 0x1e, 0xc0, 0x1a, 0x00, 0xbd, + 0x63, 0xff, 0xff, 0x17, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xe8, 0x27, 0x46, 0x6d, 0xe7, 0xfe, 0xff, 0x17, 0x80, 0x03, 0x40, 0x39, + 0x83, 0x20, 0xff, 0x97, 0x00, 0x1c, 0x00, 0x72, 0xa0, 0xf0, 0xff, 0x54, + 0x94, 0x17, 0x40, 0xf9, 0x24, 0x00, 0x80, 0x52, 0x96, 0x0f, 0x40, 0xf9, + 0x03, 0x20, 0xa0, 0x52, 0x81, 0x4a, 0x40, 0xb9, 0x33, 0x25, 0x9c, 0x52, + 0x82, 0x1f, 0x40, 0xf9, 0x21, 0x04, 0x00, 0x11, 0x81, 0x4a, 0x00, 0xb9, + 0xc4, 0x0e, 0x00, 0x39, 0x41, 0x00, 0x40, 0xb9, 0x21, 0x9c, 0x08, 0x12, + 0x3f, 0x00, 0x03, 0x6b, 0xe0, 0x09, 0x00, 0x54, 0xf7, 0x63, 0x43, 0xa9, + 0xe0, 0x03, 0x13, 0x2a, 0xf9, 0x6b, 0x44, 0xa9, 0xe8, 0x27, 0x46, 0x6d, + 0x41, 0x24, 0x9c, 0x12, 0x62, 0x02, 0x01, 0x0b, 0x5f, 0xc4, 0x00, 0x71, + 0xa8, 0x0e, 0x00, 0x54, 0x21, 0x08, 0x80, 0xd2, 0x81, 0x00, 0xc2, 0xf2, + 0x41, 0x00, 0xe0, 0xf2, 0x21, 0x24, 0xc2, 0x9a, 0x21, 0xd1, 0x07, 0x37, + 0x92, 0xfe, 0xff, 0x17, 0xdf, 0x0e, 0x00, 0x39, 0xc0, 0x16, 0x00, 0xbd, + 0xd1, 0xff, 0xff, 0x17, 0x82, 0x1f, 0x40, 0xf9, 0x03, 0x20, 0xa0, 0x52, + 0x41, 0x00, 0x40, 0xb9, 0x21, 0x9c, 0x08, 0x12, 0x3f, 0x00, 0x03, 0x6b, + 0x60, 0x08, 0x00, 0x54, 0xb3, 0x28, 0x9c, 0x52, 0x96, 0x0f, 0x40, 0xf9, + 0x94, 0x17, 0x40, 0xf9, 0xe6, 0xff, 0xff, 0x17, 0xf7, 0x63, 0x43, 0xa9, + 0x5e, 0xfe, 0xff, 0x17, 0x20, 0x00, 0x80, 0x52, 0x40, 0x04, 0x00, 0x39, + 0x63, 0xfe, 0xff, 0x17, 0x94, 0x17, 0x40, 0xf9, 0x50, 0x20, 0x23, 0x1e, + 0x82, 0x1f, 0x40, 0xf9, 0x80, 0x46, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x11, + 0x80, 0x46, 0x00, 0xb9, 0x44, 0x03, 0x00, 0x54, 0x40, 0x00, 0x40, 0xb9, + 0x01, 0x20, 0xa0, 0x52, 0x53, 0x25, 0x9c, 0x52, 0x00, 0x9c, 0x08, 0x12, + 0x1f, 0x00, 0x01, 0x6b, 0xc0, 0xf7, 0xff, 0x54, 0xe0, 0x03, 0x13, 0x2a, + 0x96, 0x0f, 0x40, 0xf9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xe8, 0x27, 0x46, 0x6d, 0x96, 0xfe, 0xff, 0x17, 0x82, 0x1f, 0x40, 0xf9, + 0x01, 0x20, 0xa0, 0x52, 0x40, 0x00, 0x40, 0xb9, 0x00, 0x9c, 0x08, 0x12, + 0x1f, 0x00, 0x01, 0x6b, 0x00, 0xd3, 0xff, 0x54, 0xd3, 0x28, 0x9c, 0x52, + 0x96, 0x0f, 0x40, 0xf9, 0x94, 0x17, 0x40, 0xf9, 0xc4, 0xff, 0xff, 0x17, + 0x94, 0x17, 0x40, 0xf9, 0x82, 0x1f, 0x40, 0xf9, 0x80, 0x46, 0x40, 0xb9, + 0x00, 0x04, 0x00, 0x11, 0x80, 0x46, 0x00, 0xb9, 0x01, 0x20, 0xa0, 0x52, + 0x40, 0x00, 0x40, 0xb9, 0x00, 0x9c, 0x08, 0x12, 0x1f, 0x00, 0x01, 0x6b, + 0xc0, 0x01, 0x00, 0x54, 0x60, 0x25, 0x9c, 0x52, 0xf3, 0x03, 0x00, 0x2a, + 0x96, 0x0f, 0x40, 0xf9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xe8, 0x27, 0x46, 0x6d, 0x7b, 0xfe, 0xff, 0x17, 0xf5, 0x03, 0x00, 0x2a, + 0x33, 0x25, 0x9c, 0x52, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xe8, 0x27, 0x46, 0x6d, 0x81, 0xfe, 0xff, 0x17, 0x73, 0x25, 0x9c, 0x52, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xe8, 0x27, 0x46, 0x6d, + 0x7c, 0xfe, 0xff, 0x17, 0xf5, 0x03, 0x00, 0x2a, 0xb3, 0x28, 0x9c, 0x52, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xe8, 0x27, 0x46, 0x6d, + 0x76, 0xfe, 0xff, 0x17, 0xe2, 0x03, 0x00, 0x2a, 0x01, 0x1c, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0xe4, 0x03, 0x13, 0x2a, 0x63, 0x00, 0x00, 0xf0, + 0x63, 0x20, 0x00, 0x91, 0x79, 0x4a, 0xff, 0x97, 0x82, 0x1f, 0x40, 0xf9, + 0x01, 0x20, 0xa0, 0x52, 0x40, 0x00, 0x40, 0xb9, 0x00, 0x9c, 0x08, 0x12, + 0x1f, 0x00, 0x01, 0x6b, 0x40, 0x01, 0x00, 0x54, 0xb3, 0x25, 0x9c, 0x52, + 0x96, 0x0f, 0x40, 0xf9, 0x94, 0x17, 0x40, 0xf9, 0x91, 0xff, 0xff, 0x17, + 0x15, 0x00, 0x80, 0x52, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xe8, 0x27, 0x46, 0x6d, 0x60, 0xfe, 0xff, 0x17, 0xb3, 0x25, 0x9c, 0x52, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xe8, 0x27, 0x46, 0x6d, + 0x5b, 0xfe, 0xff, 0x17, 0x00, 0x00, 0x80, 0x52, 0x24, 0xfe, 0xff, 0x17, + 0xe1, 0x03, 0x13, 0x2a, 0x0e, 0xfe, 0xff, 0x17, 0x03, 0x10, 0x40, 0x29, + 0x09, 0x08, 0x40, 0xb9, 0x7f, 0x00, 0x00, 0x71, 0x85, 0x04, 0x00, 0x51, + 0x63, 0x04, 0x00, 0x51, 0x63, 0x10, 0x85, 0x1a, 0x03, 0x00, 0x00, 0xb9, + 0x05, 0x20, 0x41, 0xa9, 0x66, 0x7c, 0x7c, 0xd3, 0x07, 0x10, 0x40, 0xf9, + 0x5f, 0x1c, 0x00, 0x72, 0xaa, 0x00, 0x06, 0x8b, 0xa0, 0x68, 0x26, 0xfc, + 0x41, 0x05, 0x00, 0xfd, 0x80, 0x02, 0x00, 0x54, 0x02, 0xe4, 0x00, 0x2f, + 0xc4, 0x04, 0x00, 0x34, 0x43, 0x40, 0x60, 0x1e, 0x02, 0x00, 0x80, 0x52, + 0x1f, 0x20, 0x03, 0xd5, 0x60, 0x08, 0xc4, 0x1a, 0xe0, 0x58, 0x62, 0xfc, + 0x42, 0x08, 0x00, 0x11, 0x9f, 0x00, 0x02, 0x6b, 0x00, 0x8c, 0x04, 0x1b, + 0x03, 0x08, 0x00, 0x11, 0x00, 0x7c, 0x7c, 0xd3, 0xa6, 0x00, 0x00, 0x8b, + 0xa4, 0x68, 0x60, 0xfc, 0xc1, 0x04, 0x40, 0xfd, 0x03, 0x0c, 0x44, 0x1f, + 0x02, 0x08, 0x41, 0x1f, 0x88, 0xfe, 0xff, 0x54, 0x0c, 0x00, 0x00, 0x14, + 0x80, 0x7c, 0x01, 0x53, 0x63, 0x00, 0x00, 0x0b, 0xe2, 0x78, 0x60, 0xfc, + 0x62, 0x08, 0xc4, 0x1a, 0x43, 0x8c, 0x04, 0x1b, 0x63, 0xec, 0x7c, 0xd3, + 0xa0, 0x00, 0x03, 0x8b, 0xa3, 0x68, 0x63, 0xfc, 0x00, 0x04, 0x40, 0xfd, + 0x43, 0x08, 0x63, 0x1e, 0x42, 0x08, 0x60, 0x1e, 0x60, 0x40, 0x60, 0x1e, + 0x41, 0x40, 0x60, 0x1e, 0x20, 0x08, 0xc9, 0x1a, 0x00, 0x84, 0x09, 0x1b, + 0x00, 0xec, 0x7c, 0xd3, 0x01, 0x01, 0x00, 0x8b, 0x03, 0x69, 0x20, 0xfc, + 0x22, 0x04, 0x00, 0xfd, 0xc0, 0x03, 0x5f, 0xd6, 0x43, 0x40, 0x60, 0x1e, + 0x40, 0x40, 0x60, 0x1e, 0x41, 0x40, 0x60, 0x1e, 0xf6, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x40, 0x60, 0x1e, + 0x22, 0x40, 0x60, 0x1e, 0x09, 0x08, 0x40, 0xb9, 0x5f, 0x1c, 0x00, 0x72, + 0x08, 0x0c, 0x40, 0xf9, 0x00, 0x04, 0x00, 0x54, 0x03, 0x10, 0x40, 0x29, + 0x02, 0xe4, 0x00, 0x2f, 0x05, 0x08, 0x40, 0xf9, 0x7f, 0x00, 0x00, 0x71, + 0x82, 0x04, 0x00, 0x51, 0x63, 0x04, 0x00, 0x51, 0x63, 0x10, 0x82, 0x1a, + 0x03, 0x00, 0x00, 0xb9, 0x07, 0x10, 0x40, 0xf9, 0x62, 0x7c, 0x7c, 0xd3, + 0xa0, 0x00, 0x02, 0x8b, 0xa0, 0x68, 0x22, 0xfc, 0x01, 0x04, 0x00, 0xfd, + 0x24, 0x03, 0x00, 0x34, 0x43, 0x40, 0x60, 0x1e, 0x02, 0x00, 0x80, 0xd2, + 0x60, 0x08, 0xc4, 0x1a, 0xe0, 0x78, 0x62, 0xfc, 0x42, 0x04, 0x00, 0x91, + 0x9f, 0x00, 0x02, 0x6b, 0x00, 0x8c, 0x04, 0x1b, 0x03, 0x04, 0x00, 0x11, + 0x00, 0x7c, 0x7c, 0xd3, 0xa6, 0x00, 0x00, 0x8b, 0xa4, 0x68, 0x60, 0xfc, + 0xc1, 0x04, 0x40, 0xfd, 0x03, 0x0c, 0x44, 0x1f, 0x02, 0x08, 0x41, 0x1f, + 0x88, 0xfe, 0xff, 0x54, 0x60, 0x40, 0x60, 0x1e, 0x41, 0x40, 0x60, 0x1e, + 0x20, 0x08, 0xc9, 0x1a, 0x00, 0x84, 0x09, 0x1b, 0x00, 0xec, 0x7c, 0xd3, + 0x01, 0x01, 0x00, 0x8b, 0x03, 0x69, 0x20, 0xfc, 0x22, 0x04, 0x00, 0xfd, + 0xc0, 0x03, 0x5f, 0xd6, 0x43, 0x40, 0x60, 0x1e, 0x40, 0x40, 0x60, 0x1e, + 0x41, 0x40, 0x60, 0x1e, 0xf6, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0x03, 0x00, 0xaa, + 0xf4, 0x03, 0x04, 0x2a, 0x40, 0x14, 0x40, 0xa9, 0xe4, 0x03, 0x01, 0xaa, + 0x7f, 0x0e, 0x00, 0x29, 0x62, 0x7c, 0x7c, 0xd3, 0x74, 0x0a, 0x00, 0xb9, + 0x01, 0x00, 0x80, 0x52, 0x60, 0x16, 0x01, 0xa9, 0x64, 0x12, 0x00, 0xf9, + 0x97, 0x0a, 0x00, 0x94, 0x82, 0x7e, 0x7c, 0xd3, 0x01, 0x00, 0x80, 0x52, + 0x60, 0x0e, 0x40, 0xf9, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, + 0x91, 0x0a, 0x00, 0x14, 0x03, 0x10, 0x40, 0x29, 0x09, 0x08, 0x40, 0xb9, + 0x7f, 0x00, 0x00, 0x71, 0x85, 0x04, 0x00, 0x51, 0x63, 0x04, 0x00, 0x51, + 0x63, 0x10, 0x85, 0x1a, 0x03, 0x00, 0x00, 0xb9, 0x05, 0x20, 0x41, 0xa9, + 0x66, 0x7c, 0x7d, 0xd3, 0x07, 0x10, 0x40, 0xf9, 0x5f, 0x1c, 0x00, 0x72, + 0xaa, 0x00, 0x06, 0x8b, 0xa0, 0x68, 0x26, 0xbc, 0x41, 0x05, 0x00, 0xbd, + 0xc0, 0x02, 0x00, 0x54, 0x64, 0x05, 0x00, 0x34, 0x02, 0xe4, 0x00, 0x2f, + 0x02, 0x00, 0x80, 0x52, 0x43, 0x40, 0x60, 0x1e, 0x1f, 0x20, 0x03, 0xd5, + 0x60, 0x08, 0xc4, 0x1a, 0xe4, 0x58, 0x62, 0xfc, 0x42, 0x08, 0x00, 0x11, + 0x9f, 0x00, 0x02, 0x6b, 0x00, 0x8c, 0x04, 0x1b, 0x03, 0x08, 0x00, 0x11, + 0x00, 0x7c, 0x7d, 0xd3, 0xa6, 0x00, 0x00, 0x8b, 0xa1, 0x68, 0x60, 0xbc, + 0xc0, 0x04, 0x40, 0xbd, 0x21, 0xc0, 0x22, 0x1e, 0x00, 0xc0, 0x22, 0x1e, + 0x83, 0x0c, 0x41, 0x1f, 0x82, 0x08, 0x40, 0x1f, 0x48, 0xfe, 0xff, 0x54, + 0x0e, 0x00, 0x00, 0x14, 0x80, 0x7c, 0x01, 0x53, 0x63, 0x00, 0x00, 0x0b, + 0xe0, 0x78, 0x60, 0xfc, 0x62, 0x08, 0xc4, 0x1a, 0x43, 0x8c, 0x04, 0x1b, + 0x63, 0xf0, 0x7d, 0xd3, 0xa0, 0x00, 0x03, 0x8b, 0xa3, 0x68, 0x63, 0xbc, + 0x02, 0x04, 0x40, 0xbd, 0x63, 0xc0, 0x22, 0x1e, 0x42, 0xc0, 0x22, 0x1e, + 0x63, 0x08, 0x60, 0x1e, 0x42, 0x08, 0x60, 0x1e, 0x63, 0x40, 0x62, 0x1e, + 0x42, 0x40, 0x62, 0x1e, 0x20, 0x08, 0xc9, 0x1a, 0x00, 0x84, 0x09, 0x1b, + 0x00, 0xf0, 0x7d, 0xd3, 0x01, 0x01, 0x00, 0x8b, 0x03, 0x69, 0x20, 0xbc, + 0x22, 0x04, 0x00, 0xbd, 0xc0, 0x03, 0x5f, 0xd6, 0x02, 0x04, 0x00, 0x0f, + 0x43, 0x40, 0x20, 0x1e, 0xf7, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x40, 0x20, 0x1e, + 0x22, 0x40, 0x20, 0x1e, 0x09, 0x08, 0x40, 0xb9, 0x5f, 0x1c, 0x00, 0x72, + 0x08, 0x0c, 0x40, 0xf9, 0x41, 0x01, 0x00, 0x54, 0x00, 0xc0, 0x22, 0x1e, + 0x21, 0xc0, 0x22, 0x1e, 0x20, 0x08, 0xc9, 0x1a, 0x00, 0x84, 0x09, 0x1b, + 0x00, 0xf0, 0x7d, 0xd3, 0x01, 0x01, 0x00, 0x8b, 0x03, 0x69, 0x20, 0xbc, + 0x22, 0x04, 0x00, 0xbd, 0xc0, 0x03, 0x5f, 0xd6, 0x03, 0x10, 0x40, 0x29, + 0x05, 0x08, 0x40, 0xf9, 0x7f, 0x00, 0x00, 0x71, 0x82, 0x04, 0x00, 0x51, + 0x63, 0x04, 0x00, 0x51, 0x63, 0x10, 0x82, 0x1a, 0x03, 0x00, 0x00, 0xb9, + 0x07, 0x10, 0x40, 0xf9, 0x62, 0x7c, 0x7d, 0xd3, 0xa0, 0x00, 0x02, 0x8b, + 0xa0, 0x68, 0x22, 0xbc, 0x01, 0x04, 0x00, 0xbd, 0xa4, 0x03, 0x00, 0x34, + 0x01, 0xe4, 0x00, 0x2f, 0x02, 0x00, 0x80, 0xd2, 0x20, 0x40, 0x60, 0x1e, + 0x1f, 0x20, 0x03, 0xd5, 0x60, 0x08, 0xc4, 0x1a, 0xe4, 0x78, 0x62, 0xfc, + 0x42, 0x04, 0x00, 0x91, 0x9f, 0x00, 0x02, 0x6b, 0x00, 0x8c, 0x04, 0x1b, + 0x03, 0x04, 0x00, 0x11, 0x00, 0x7c, 0x7d, 0xd3, 0xa6, 0x00, 0x00, 0x8b, + 0xa3, 0x68, 0x60, 0xbc, 0xc2, 0x04, 0x40, 0xbd, 0x63, 0xc0, 0x22, 0x1e, + 0x42, 0xc0, 0x22, 0x1e, 0x80, 0x00, 0x43, 0x1f, 0x81, 0x04, 0x42, 0x1f, + 0x48, 0xfe, 0xff, 0x54, 0x20, 0x08, 0xc9, 0x1a, 0x03, 0x40, 0x62, 0x1e, + 0x22, 0x40, 0x62, 0x1e, 0x00, 0x84, 0x09, 0x1b, 0x00, 0xf0, 0x7d, 0xd3, + 0x01, 0x01, 0x00, 0x8b, 0x03, 0x69, 0x20, 0xbc, 0x22, 0x04, 0x00, 0xbd, + 0xc0, 0x03, 0x5f, 0xd6, 0x02, 0x04, 0x00, 0x0f, 0x00, 0xe4, 0x00, 0x2f, + 0x43, 0x40, 0x20, 0x1e, 0x01, 0x40, 0x60, 0x1e, 0xcc, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0xf4, 0x03, 0x04, 0x2a, 0x40, 0x14, 0x40, 0xa9, + 0xe4, 0x03, 0x01, 0xaa, 0x7f, 0x0e, 0x00, 0x29, 0x62, 0x7c, 0x7d, 0xd3, + 0x74, 0x0a, 0x00, 0xb9, 0x01, 0x00, 0x80, 0x52, 0x60, 0x16, 0x01, 0xa9, + 0x64, 0x12, 0x00, 0xf9, 0x03, 0x0a, 0x00, 0x94, 0x82, 0x7e, 0x7d, 0xd3, + 0x01, 0x00, 0x80, 0x52, 0x60, 0x0e, 0x40, 0xf9, 0xf3, 0x53, 0x41, 0xa9, + 0xfd, 0x7b, 0xc2, 0xa8, 0xfd, 0x09, 0x00, 0x14, 0x04, 0x0c, 0xc1, 0x1a, + 0x84, 0x80, 0x01, 0x1b, 0x64, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x04, 0x4b, + 0x00, 0x0c, 0xc1, 0x1a, 0x40, 0x00, 0x00, 0xb9, 0x60, 0x00, 0x40, 0xb9, + 0x00, 0x01, 0xf8, 0x36, 0x20, 0x00, 0x00, 0x0b, 0x60, 0x00, 0x00, 0xb9, + 0x40, 0x00, 0x40, 0xb9, 0x00, 0x04, 0x00, 0x51, 0x40, 0x00, 0x00, 0xb9, + 0x60, 0x00, 0x40, 0xb9, 0x40, 0xff, 0xff, 0x37, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xb2, 0xa9, 0x69, 0x00, 0x00, 0xd0, 0x29, 0xa1, 0x00, 0x91, + 0xfd, 0x03, 0x00, 0x91, 0xe8, 0xf3, 0x40, 0xb9, 0x0a, 0x18, 0x80, 0x52, + 0xe0, 0x07, 0x09, 0xa9, 0x80, 0x3c, 0x00, 0x12, 0xe0, 0x8f, 0x00, 0xb9, + 0xa0, 0x3c, 0x00, 0x12, 0xe0, 0x8b, 0x00, 0xb9, 0x00, 0x25, 0x2a, 0x9b, + 0xfb, 0x73, 0x05, 0xa9, 0xfb, 0xeb, 0x40, 0xb9, 0xe0, 0x3f, 0x00, 0xf9, + 0xe0, 0xe3, 0x40, 0xb9, 0xeb, 0x03, 0x1b, 0x4b, 0xf3, 0x53, 0x01, 0xa9, + 0x7f, 0x03, 0x0b, 0x6b, 0x00, 0x2c, 0x00, 0x51, 0xf9, 0x6b, 0x04, 0xa9, + 0xf3, 0x03, 0x07, 0x2a, 0xfa, 0x03, 0x06, 0x2a, 0xeb, 0x6b, 0x00, 0xb9, + 0xe2, 0x3b, 0x00, 0xf9, 0xe3, 0x43, 0x00, 0xf9, 0xe0, 0xa3, 0x00, 0xb9, + 0xf4, 0x7f, 0x40, 0xf9, 0x0b, 0x02, 0x00, 0x54, 0x60, 0x7d, 0x40, 0x93, + 0x83, 0x00, 0x00, 0xb0, 0x63, 0xa0, 0x08, 0x91, 0x61, 0x7b, 0x1f, 0x53, + 0x00, 0xc0, 0x3b, 0x8b, 0x22, 0x00, 0x00, 0x8b, 0x81, 0x42, 0x00, 0x91, + 0x61, 0x00, 0x40, 0x6d, 0x80, 0x12, 0x00, 0x8b, 0x21, 0x10, 0x02, 0x8b, + 0x1f, 0x20, 0x03, 0xd5, 0x01, 0x00, 0x00, 0x6d, 0x00, 0x40, 0x00, 0x91, + 0x1f, 0x00, 0x01, 0xeb, 0xa1, 0xff, 0xff, 0x54, 0xe0, 0x8b, 0x40, 0xb9, + 0x60, 0x0d, 0x00, 0x34, 0xe0, 0xe3, 0x80, 0xb9, 0x1c, 0x00, 0x80, 0x52, + 0xe1, 0x6b, 0x40, 0xb9, 0xf5, 0x5b, 0x02, 0xa9, 0x00, 0xc0, 0x21, 0x8b, + 0xf7, 0x63, 0x03, 0xa9, 0xe0, 0x57, 0x00, 0xf9, 0x60, 0x2b, 0x00, 0x51, + 0xe0, 0xa7, 0x00, 0xb9, 0x06, 0x00, 0x00, 0x14, 0xe1, 0x8b, 0x40, 0xb9, + 0x80, 0x07, 0x00, 0x11, 0x1c, 0x3c, 0x00, 0x12, 0x3f, 0x20, 0x20, 0x6b, + 0x49, 0x0b, 0x00, 0x54, 0xe0, 0x3b, 0x40, 0xf9, 0x00, 0x10, 0x40, 0x39, + 0x00, 0x24, 0xdc, 0x1a, 0x00, 0xff, 0x07, 0x36, 0xe0, 0x8f, 0x40, 0xb9, + 0x04, 0x03, 0x80, 0x52, 0xe1, 0x8b, 0x47, 0xa9, 0xe3, 0x03, 0x04, 0x2a, + 0x05, 0x7c, 0x1c, 0x1b, 0xe0, 0xe3, 0x02, 0x91, 0xb8, 0x7c, 0x40, 0x93, + 0x00, 0xff, 0xff, 0x97, 0x7f, 0x02, 0x00, 0x71, 0xcd, 0xfd, 0xff, 0x54, + 0xe0, 0x57, 0x40, 0xf9, 0x6c, 0x01, 0x80, 0x52, 0xe1, 0xe3, 0x40, 0xb9, + 0x17, 0x00, 0x80, 0x52, 0x0b, 0x00, 0x18, 0x8b, 0xf9, 0xa3, 0x40, 0xb9, + 0xe0, 0x4f, 0x40, 0xf9, 0x05, 0x10, 0x18, 0x8b, 0xe0, 0xa7, 0x40, 0xb9, + 0x98, 0x01, 0x01, 0x4b, 0x16, 0x00, 0x01, 0x0b, 0xe0, 0x4b, 0x40, 0xf9, + 0x15, 0x10, 0x0b, 0x8b, 0x60, 0x03, 0x0c, 0x0b, 0xe0, 0x6f, 0x00, 0xb9, + 0xa0, 0x04, 0x40, 0x6d, 0xe0, 0xe3, 0x02, 0x91, 0xe1, 0x03, 0x17, 0x2a, + 0x22, 0x00, 0x80, 0x52, 0xe5, 0x33, 0x00, 0xf9, 0xb9, 0xfe, 0xff, 0x97, + 0xe0, 0x6b, 0x40, 0xb9, 0xe5, 0x33, 0x40, 0xf9, 0x7f, 0x03, 0x00, 0x6b, + 0xeb, 0x04, 0x00, 0x54, 0xe0, 0xe3, 0x40, 0xb9, 0x26, 0x40, 0x61, 0x1e, + 0xe2, 0x03, 0x15, 0xaa, 0x07, 0x00, 0x17, 0x0b, 0xe0, 0x6f, 0x40, 0xb9, + 0x07, 0x00, 0x07, 0x4b, 0x20, 0x03, 0x1b, 0x4b, 0x05, 0x00, 0x00, 0x14, + 0x00, 0x04, 0x00, 0x11, 0x42, 0x40, 0x00, 0x91, 0x1f, 0x00, 0x16, 0x6b, + 0x60, 0x03, 0x00, 0x54, 0x1f, 0x2c, 0x00, 0x71, 0x44, 0xc3, 0x40, 0x7a, + 0x4d, 0xff, 0xff, 0x54, 0x0d, 0x03, 0x00, 0x0b, 0x3f, 0x2f, 0x00, 0x71, + 0xed, 0xfe, 0xff, 0x54, 0xe9, 0x00, 0x00, 0x0b, 0x7f, 0x02, 0x0d, 0x6b, + 0x8d, 0xfe, 0xff, 0x54, 0x45, 0x08, 0x75, 0x6d, 0x29, 0x7d, 0x7c, 0x93, + 0x8d, 0x02, 0x09, 0x8b, 0x00, 0x04, 0x00, 0x11, 0x42, 0x40, 0x00, 0x91, + 0x1f, 0x00, 0x16, 0x6b, 0xc3, 0x08, 0x62, 0x1e, 0x02, 0x08, 0x62, 0x1e, + 0xa4, 0x8c, 0x60, 0x1f, 0x22, 0x88, 0x45, 0x1f, 0x83, 0x6a, 0x69, 0xfc, + 0xa5, 0x05, 0x40, 0xfd, 0x63, 0x28, 0x64, 0x1e, 0x42, 0x28, 0x65, 0x1e, + 0x83, 0x6a, 0x29, 0xfc, 0xa2, 0x05, 0x00, 0xfd, 0xe1, 0xfc, 0xff, 0x54, + 0xf7, 0x06, 0x00, 0x11, 0xa5, 0x40, 0x00, 0x91, 0x7f, 0x02, 0x17, 0x6b, + 0xd6, 0x06, 0x00, 0x11, 0xb5, 0x42, 0x00, 0x91, 0x39, 0x07, 0x00, 0x11, + 0x41, 0xf9, 0xff, 0x54, 0xe1, 0x8b, 0x40, 0xb9, 0x80, 0x07, 0x00, 0x11, + 0x1c, 0x3c, 0x00, 0x12, 0x3f, 0x20, 0x20, 0x6b, 0x08, 0xf5, 0xff, 0x54, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf3, 0x53, 0x41, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xce, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x06, 0x2b, 0xe0, 0x50, 0x42, 0x7a, + 0xea, 0x03, 0x00, 0x54, 0xe7, 0x7c, 0x40, 0x93, 0x0d, 0x20, 0x00, 0x91, + 0x2c, 0x20, 0x00, 0x91, 0x08, 0x00, 0x80, 0xd2, 0x1f, 0x20, 0x03, 0xd5, + 0x7f, 0x00, 0x08, 0x6b, 0x6d, 0x02, 0x00, 0x54, 0x89, 0x00, 0x08, 0x0b, + 0xdf, 0x00, 0x08, 0x2b, 0x04, 0x02, 0x00, 0x54, 0xeb, 0xec, 0x7c, 0xd3, + 0x0a, 0xed, 0x7c, 0xd3, 0x5f, 0x00, 0x09, 0x6b, 0x8d, 0x01, 0x00, 0x54, + 0xa1, 0x00, 0x40, 0x6d, 0x02, 0x68, 0x6b, 0xfc, 0x25, 0x68, 0x6a, 0xfc, + 0xa4, 0x69, 0x6b, 0xfc, 0x83, 0x69, 0x6a, 0xfc, 0xa1, 0x04, 0x42, 0x1f, + 0x80, 0x00, 0x45, 0x1f, 0x61, 0x04, 0x44, 0x1f, 0x60, 0x80, 0x42, 0x1f, + 0xa1, 0x00, 0x00, 0x6d, 0x1f, 0x20, 0x03, 0xd5, 0xe7, 0x04, 0x00, 0x91, + 0x08, 0x05, 0x00, 0x91, 0x5f, 0x00, 0x07, 0x6b, 0x2c, 0xfd, 0xff, 0x54, + 0xc0, 0x03, 0x5f, 0xd6, 0xe7, 0xff, 0xff, 0x36, 0xe8, 0x03, 0x07, 0x4b, + 0x1f, 0x01, 0x03, 0x6b, 0x8a, 0xff, 0xff, 0x54, 0xe9, 0x7c, 0x40, 0x93, + 0x21, 0xd0, 0x28, 0x8b, 0x29, 0xc1, 0x28, 0x8b, 0x21, 0x20, 0x00, 0x91, + 0xe7, 0x00, 0x03, 0x0b, 0x08, 0x00, 0x80, 0x52, 0x00, 0x10, 0x09, 0x8b, + 0x00, 0x20, 0x00, 0x91, 0x1f, 0x20, 0x03, 0xd5, 0x5f, 0x00, 0x08, 0x6b, + 0xed, 0x01, 0x00, 0x54, 0x09, 0x01, 0x04, 0x4b, 0x1f, 0x01, 0x06, 0x6b, + 0x84, 0x01, 0x00, 0x54, 0x7f, 0x00, 0x09, 0x6b, 0x4d, 0x01, 0x00, 0x54, + 0x02, 0x90, 0x7f, 0x6d, 0xa1, 0x00, 0x40, 0x6d, 0x23, 0x80, 0x5f, 0xfc, + 0x61, 0x04, 0x42, 0x1f, 0x80, 0x00, 0x43, 0x1f, 0x23, 0x00, 0x40, 0xfd, + 0x61, 0x04, 0x44, 0x1f, 0x60, 0x80, 0x42, 0x1f, 0xa1, 0x00, 0x00, 0x6d, + 0x08, 0x05, 0x00, 0x11, 0x00, 0x40, 0x00, 0x91, 0x1f, 0x01, 0x07, 0x6b, + 0x21, 0x40, 0x00, 0x91, 0x81, 0xfd, 0xff, 0x54, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xb6, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xe8, 0x63, 0x40, 0xf9, + 0xf3, 0x53, 0x01, 0xa9, 0xf3, 0xab, 0x40, 0xb9, 0xf5, 0x5b, 0x02, 0xa9, + 0xf4, 0x03, 0x00, 0xaa, 0xf5, 0x03, 0x01, 0xaa, 0xf7, 0x63, 0x03, 0xa9, + 0x73, 0x5e, 0x00, 0x51, 0xe1, 0xbb, 0x40, 0xb9, 0xf9, 0x6b, 0x04, 0xa9, + 0xfa, 0x03, 0x04, 0xaa, 0xe4, 0xa3, 0x40, 0xb9, 0xfb, 0x73, 0x05, 0xa9, + 0xb7, 0x3c, 0x00, 0x12, 0xf9, 0xb3, 0x40, 0xb9, 0x1f, 0x01, 0x00, 0xb9, + 0xfc, 0x03, 0x03, 0xaa, 0xe7, 0x0b, 0x08, 0xa9, 0xdb, 0x3c, 0x00, 0x12, + 0x49, 0x07, 0x40, 0xb9, 0x96, 0x5c, 0x00, 0x51, 0x89, 0x12, 0x00, 0x35, + 0x60, 0x0c, 0x40, 0x79, 0x21, 0x00, 0x80, 0x52, 0x19, 0x00, 0x80, 0x52, + 0x20, 0x00, 0x00, 0x4b, 0xe0, 0x7f, 0x00, 0xb9, 0xf8, 0x7f, 0x40, 0xb9, + 0x1f, 0x03, 0x19, 0x6b, 0x4c, 0x13, 0x00, 0x54, 0xe8, 0x33, 0x00, 0xfd, + 0x08, 0xe4, 0x00, 0x2f, 0xff, 0x7b, 0x00, 0xb9, 0x1f, 0x20, 0x03, 0xd5, + 0x20, 0x85, 0x8b, 0x52, 0xe0, 0x51, 0xb8, 0x72, 0x01, 0x0a, 0x97, 0x52, + 0xc1, 0xa3, 0xa0, 0x72, 0x00, 0x07, 0x00, 0x1b, 0x01, 0x85, 0x8b, 0x52, + 0xe1, 0x51, 0xa0, 0x72, 0x00, 0x08, 0x80, 0x13, 0x1f, 0x00, 0x01, 0x6b, + 0x89, 0x0c, 0x00, 0x54, 0x80, 0x00, 0x00, 0xb0, 0x0e, 0xa0, 0x08, 0x91, + 0x01, 0x14, 0x41, 0xfd, 0xc0, 0x05, 0x40, 0xfd, 0xe1, 0x03, 0x09, 0x6d, + 0x9b, 0x0e, 0x00, 0x34, 0x0f, 0x00, 0x80, 0x52, 0x05, 0x00, 0x00, 0x14, + 0xe0, 0x05, 0x00, 0x11, 0x0f, 0x3c, 0x00, 0x12, 0x7f, 0x23, 0x20, 0x6b, + 0x69, 0x02, 0x00, 0x54, 0x80, 0x13, 0x40, 0x39, 0x00, 0x24, 0xcf, 0x1a, + 0x40, 0xff, 0x07, 0x36, 0xe0, 0x7e, 0x0f, 0x1b, 0xe5, 0x43, 0x02, 0x91, + 0xe4, 0x03, 0x18, 0x2a, 0xe3, 0x03, 0x13, 0x2a, 0x00, 0x30, 0x00, 0x11, + 0xe2, 0x03, 0x16, 0x2a, 0x06, 0x00, 0x80, 0x52, 0x00, 0x7c, 0x7c, 0x93, + 0xa1, 0x02, 0x00, 0x8b, 0x80, 0x02, 0x00, 0x8b, 0x75, 0xff, 0xff, 0x97, + 0xe0, 0x05, 0x00, 0x11, 0x0f, 0x3c, 0x00, 0x12, 0x7f, 0x23, 0x20, 0x6b, + 0xe8, 0xfd, 0xff, 0x54, 0xe2, 0x07, 0x49, 0x6d, 0x20, 0x08, 0x61, 0x1e, + 0x40, 0x00, 0x42, 0x1f, 0x00, 0xc0, 0x61, 0x1e, 0x40, 0x07, 0x40, 0xb9, + 0x20, 0x01, 0x00, 0x35, 0xe0, 0x7f, 0x40, 0xb9, 0x01, 0x18, 0x80, 0xd2, + 0xe2, 0x47, 0x40, 0xf9, 0x00, 0x03, 0x00, 0x4b, 0x20, 0xd0, 0x20, 0x8b, + 0x41, 0x00, 0x00, 0x8b, 0x42, 0x68, 0x20, 0xfc, 0x21, 0x04, 0x00, 0xfd, + 0x10, 0x21, 0x60, 0x1e, 0xa5, 0x00, 0x00, 0x54, 0x08, 0x40, 0x60, 0x1e, + 0xf8, 0x7b, 0x00, 0xb9, 0xe0, 0x43, 0x40, 0xf9, 0x02, 0x04, 0x01, 0x6d, + 0x18, 0x07, 0x00, 0x11, 0x3f, 0x03, 0x18, 0x6b, 0x4a, 0xf8, 0xff, 0x54, + 0xe0, 0x63, 0x40, 0xf9, 0xe8, 0x33, 0x40, 0xfd, 0x00, 0x00, 0x40, 0xb9, + 0x60, 0x04, 0x00, 0x35, 0xc7, 0x19, 0x40, 0x6d, 0x06, 0x00, 0x80, 0x12, + 0xf8, 0x43, 0x40, 0xf9, 0xe7, 0x1b, 0x09, 0x6d, 0x7b, 0x09, 0x00, 0x34, + 0x0e, 0x00, 0x80, 0x52, 0x05, 0x00, 0x00, 0x14, 0xc0, 0x05, 0x00, 0x11, + 0x0e, 0x3c, 0x00, 0x12, 0x7f, 0x23, 0x20, 0x6b, 0x49, 0x02, 0x00, 0x54, + 0x80, 0x13, 0x40, 0x39, 0x00, 0x24, 0xce, 0x1a, 0x40, 0xff, 0x07, 0x36, + 0xe0, 0x7e, 0x0e, 0x1b, 0xe4, 0x7b, 0x40, 0xb9, 0xe5, 0x43, 0x02, 0x91, + 0xe3, 0x03, 0x13, 0x2a, 0x00, 0x30, 0x00, 0x11, 0xe2, 0x03, 0x16, 0x2a, + 0x00, 0x7c, 0x7c, 0x93, 0xa1, 0x02, 0x00, 0x8b, 0x80, 0x02, 0x00, 0x8b, + 0x3e, 0xff, 0xff, 0x97, 0xc0, 0x05, 0x00, 0x11, 0x0e, 0x3c, 0x00, 0x12, + 0x7f, 0x23, 0x20, 0x6b, 0x08, 0xfe, 0xff, 0x54, 0xe0, 0x07, 0x49, 0x6d, + 0xc6, 0x08, 0x00, 0x11, 0x00, 0x07, 0x00, 0x6d, 0xdf, 0x0c, 0x00, 0x71, + 0x18, 0x83, 0x00, 0x91, 0x41, 0xfc, 0xff, 0x54, 0xe0, 0x7b, 0x40, 0xb9, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xca, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x53, 0xfb, 0xfe, 0x97, 0x1f, 0x1c, 0x00, 0x72, + 0x60, 0xf3, 0xff, 0x54, 0xe4, 0x03, 0x18, 0x2a, 0x02, 0x00, 0x80, 0x52, + 0x01, 0x1c, 0x80, 0x52, 0x20, 0x00, 0x80, 0x52, 0x83, 0x00, 0x00, 0xb0, + 0x63, 0x80, 0x07, 0x91, 0xbe, 0x47, 0xff, 0x97, 0xe1, 0x63, 0x40, 0xf9, + 0x00, 0x00, 0xb0, 0x52, 0xe8, 0x33, 0x40, 0xfd, 0xf3, 0x53, 0x41, 0xa9, + 0x20, 0x00, 0x00, 0xb9, 0xe0, 0x7b, 0x40, 0xb9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xfd, 0x7b, 0xca, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0xe4, 0x00, 0x2f, + 0x02, 0x40, 0x60, 0x1e, 0x01, 0x40, 0x60, 0x1e, 0xa6, 0xff, 0xff, 0x17, + 0x22, 0x03, 0x01, 0x4b, 0x20, 0x00, 0x80, 0x52, 0x00, 0x00, 0x13, 0x4b, + 0x39, 0x03, 0x01, 0x0b, 0x5f, 0x00, 0x00, 0x6b, 0x84, 0x60, 0x00, 0x51, + 0x40, 0xa0, 0x80, 0x1a, 0x3f, 0x03, 0x16, 0x6b, 0x99, 0xa0, 0x99, 0x1a, + 0xe0, 0x7f, 0x00, 0xb9, 0x68, 0xff, 0xff, 0x17, 0x00, 0xe4, 0x00, 0x2f, + 0x01, 0x40, 0x60, 0x1e, 0xcc, 0xff, 0xff, 0x17, 0x80, 0x00, 0x00, 0xb0, + 0x0e, 0xa0, 0x08, 0x91, 0xff, 0x7b, 0x00, 0xb9, 0xab, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xaf, 0xa9, 0xe9, 0x03, 0x05, 0xaa, 0xea, 0x03, 0x02, 0xaa, + 0xfd, 0x03, 0x00, 0x91, 0xe0, 0x07, 0x0b, 0xa9, 0x08, 0x08, 0x80, 0x52, + 0xe1, 0x9b, 0x40, 0xf9, 0xf3, 0x53, 0x01, 0xa9, 0xf5, 0x5b, 0x02, 0xa9, + 0xf5, 0x3c, 0x00, 0x12, 0xf7, 0x63, 0x03, 0xa9, 0xf7, 0x03, 0x03, 0xaa, + 0xf9, 0x6b, 0x04, 0xa9, 0xe0, 0x16, 0x40, 0x79, 0xfb, 0x73, 0x05, 0xa9, + 0xfa, 0x1b, 0x41, 0xb9, 0xe2, 0x93, 0x09, 0xa9, 0x82, 0x00, 0x00, 0xb0, + 0x41, 0x14, 0x41, 0xfd, 0x42, 0xa0, 0x08, 0x91, 0xe5, 0x67, 0x00, 0xf9, + 0x65, 0x20, 0x40, 0x39, 0x23, 0x01, 0x40, 0x39, 0x40, 0x04, 0x40, 0xfd, + 0xe2, 0x0e, 0x40, 0x79, 0x05, 0x09, 0xc5, 0x1a, 0x3f, 0x00, 0x00, 0xb9, + 0xe1, 0x9f, 0x40, 0xf9, 0xe1, 0x6f, 0x00, 0xfd, 0xfb, 0x23, 0x41, 0xb9, + 0x3f, 0x00, 0x00, 0xb9, 0xc1, 0x3c, 0x00, 0x12, 0xe1, 0x8f, 0x00, 0xb9, + 0x21, 0x00, 0x80, 0x52, 0x24, 0x00, 0x02, 0x4b, 0xe4, 0xab, 0x00, 0xb9, + 0x44, 0x01, 0x03, 0x91, 0xe5, 0x77, 0x00, 0xb9, 0xe4, 0x4b, 0x00, 0xf9, + 0x44, 0x5f, 0x00, 0x51, 0xe4, 0xaf, 0x00, 0xb9, 0x7b, 0x5f, 0x00, 0x51, + 0xe0, 0x73, 0x00, 0xfd, 0xc3, 0x00, 0x00, 0x34, 0x24, 0x01, 0x42, 0x29, + 0x9f, 0x00, 0x00, 0x71, 0x00, 0x38, 0x1f, 0x53, 0xa1, 0x10, 0x81, 0x1a, + 0xe1, 0x77, 0x00, 0xb9, 0xe4, 0xab, 0x40, 0xb9, 0x00, 0x30, 0x00, 0x11, + 0xe1, 0x2b, 0x41, 0xb9, 0x21, 0x00, 0x04, 0x4b, 0x34, 0x00, 0x00, 0x0b, + 0x21, 0x00, 0x00, 0x4b, 0xe1, 0x7b, 0x00, 0xb9, 0x5f, 0x00, 0x14, 0x6b, + 0x6c, 0x01, 0x00, 0x54, 0x41, 0x2c, 0x00, 0x11, 0x3f, 0x00, 0x14, 0x6b, + 0x6a, 0x10, 0x00, 0x54, 0x20, 0x04, 0x00, 0x4b, 0xe0, 0x7b, 0x00, 0xb9, + 0x96, 0x01, 0x80, 0x52, 0x43, 0x29, 0x00, 0x35, 0xf4, 0x03, 0x01, 0x2a, + 0x38, 0x00, 0x80, 0x52, 0x85, 0x00, 0x00, 0x14, 0xe1, 0x7b, 0x40, 0xb9, + 0x21, 0x19, 0xf8, 0x37, 0x83, 0x0f, 0x00, 0x35, 0xe8, 0x33, 0x00, 0xfd, + 0xe2, 0x7b, 0x40, 0xb9, 0x08, 0xe4, 0x00, 0x2f, 0xe3, 0x4b, 0x40, 0xf9, + 0xf7, 0x63, 0x00, 0xf9, 0x40, 0x7c, 0x7c, 0x93, 0xf7, 0x03, 0x02, 0x2a, + 0x01, 0x40, 0x03, 0x91, 0x60, 0x00, 0x00, 0x8b, 0xe0, 0x43, 0x00, 0xf9, + 0xf8, 0x07, 0x80, 0x52, 0xe0, 0x4f, 0x40, 0xf9, 0xfb, 0x9b, 0x00, 0xb9, + 0xfb, 0x53, 0x40, 0xf9, 0x00, 0x00, 0x01, 0x8b, 0xe1, 0x77, 0x40, 0xb9, + 0x13, 0x00, 0x80, 0x52, 0xe0, 0x3f, 0x00, 0xf9, 0x99, 0x00, 0x00, 0x90, + 0x20, 0xa3, 0x3d, 0x91, 0xf5, 0xa3, 0x00, 0xb9, 0xf5, 0x03, 0x00, 0xaa, + 0xe1, 0x03, 0x01, 0x4b, 0x16, 0x00, 0x80, 0x52, 0xe1, 0x8b, 0x00, 0xb9, + 0x04, 0x03, 0x80, 0x52, 0xe2, 0x03, 0x1b, 0xaa, 0xe3, 0x03, 0x04, 0x2a, + 0xe1, 0x03, 0x15, 0xaa, 0xe0, 0xa3, 0x03, 0x91, 0x3f, 0xfd, 0xff, 0x97, + 0xbe, 0xfa, 0xfe, 0x97, 0x1f, 0x1c, 0x00, 0x72, 0x81, 0x18, 0x00, 0x54, + 0xff, 0x02, 0x14, 0x6b, 0x8a, 0x04, 0x00, 0x54, 0xfa, 0x83, 0x47, 0xa9, + 0xfc, 0x03, 0x17, 0x2a, 0x39, 0x00, 0x80, 0x52, 0xe1, 0x03, 0x17, 0x2a, + 0x22, 0x00, 0x80, 0x52, 0x00, 0x04, 0x40, 0x6d, 0xe0, 0xa3, 0x03, 0x91, + 0x02, 0xfd, 0xff, 0x97, 0xe0, 0x87, 0x0d, 0x6d, 0x9c, 0x07, 0x00, 0x11, + 0xe0, 0xa3, 0x03, 0x91, 0xe1, 0x03, 0x1c, 0x2a, 0x9f, 0x03, 0x14, 0x6b, + 0x22, 0x00, 0x80, 0x52, 0xa0, 0x02, 0x00, 0x54, 0x40, 0x07, 0x40, 0x6d, + 0x5a, 0x43, 0x00, 0x91, 0xf8, 0xfc, 0xff, 0x97, 0x22, 0x08, 0x61, 0x1e, + 0xe0, 0x87, 0x0d, 0x6d, 0x3f, 0x5b, 0x00, 0x71, 0x00, 0x08, 0x40, 0x1f, + 0x39, 0x07, 0x00, 0x11, 0x4d, 0xfe, 0xff, 0x54, 0x00, 0xc0, 0x61, 0x1e, + 0xe0, 0xa3, 0x03, 0x91, 0x22, 0x00, 0x80, 0x52, 0x10, 0x21, 0x60, 0x1e, + 0x08, 0x69, 0x60, 0x1e, 0x93, 0x43, 0x93, 0x1a, 0x9c, 0x07, 0x00, 0x11, + 0x16, 0x43, 0x96, 0x1a, 0xe1, 0x03, 0x1c, 0x2a, 0x9f, 0x03, 0x14, 0x6b, + 0xa1, 0xfd, 0xff, 0x54, 0xe0, 0x8b, 0x40, 0xb9, 0x01, 0x18, 0x80, 0x52, + 0x15, 0x54, 0x21, 0x9b, 0xe0, 0x77, 0x40, 0xb9, 0x18, 0x03, 0x00, 0x6b, + 0xa5, 0xf9, 0xff, 0x54, 0x61, 0x2e, 0x00, 0x51, 0xfb, 0x9b, 0x40, 0xb9, + 0xe6, 0x4b, 0x40, 0xf9, 0x20, 0x7c, 0x7c, 0x93, 0x02, 0x40, 0x00, 0xd1, + 0xf5, 0xa3, 0x40, 0xb9, 0xc5, 0x00, 0x00, 0x8b, 0xc4, 0x00, 0x02, 0x8b, + 0xc1, 0x68, 0x60, 0xfc, 0x23, 0x7c, 0x40, 0x93, 0xc0, 0x68, 0x62, 0xfc, + 0x82, 0x04, 0x40, 0xfd, 0xa3, 0x04, 0x40, 0xfd, 0xf7, 0x63, 0x40, 0xf9, + 0x42, 0x08, 0x62, 0x1e, 0x63, 0x08, 0x63, 0x1e, 0x00, 0x08, 0x40, 0x1f, + 0x21, 0x0c, 0x41, 0x1f, 0x30, 0x20, 0x60, 0x1e, 0xa4, 0x12, 0x00, 0x54, + 0xe2, 0x67, 0x40, 0xf9, 0x40, 0x00, 0x40, 0x39, 0xc0, 0x1a, 0x00, 0x34, + 0x40, 0x10, 0x40, 0xb9, 0xc0, 0x1c, 0x00, 0x35, 0xe2, 0xab, 0x40, 0xb9, + 0x61, 0x32, 0x00, 0x51, 0x00, 0x29, 0x9c, 0x52, 0x24, 0x00, 0x02, 0x2b, + 0x84, 0x40, 0x42, 0x7a, 0x6c, 0x1a, 0x00, 0x54, 0xe1, 0x9b, 0x40, 0xf9, + 0xe8, 0x33, 0x40, 0xfd, 0x24, 0x00, 0x00, 0xb9, 0xe1, 0x9f, 0x40, 0xf9, + 0x36, 0x00, 0x00, 0xb9, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, + 0xfd, 0x7b, 0xd1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x56, 0x04, 0x00, 0x51, + 0x96, 0x02, 0x16, 0x4b, 0x43, 0x17, 0x00, 0x34, 0xe0, 0xab, 0x40, 0xb9, + 0xe1, 0x7b, 0x40, 0xb9, 0x16, 0x00, 0x14, 0x0b, 0x18, 0x00, 0x01, 0x0b, + 0x1f, 0x03, 0x16, 0x6b, 0x0c, 0xf0, 0xff, 0x54, 0xe0, 0x73, 0x55, 0x29, + 0x93, 0x01, 0x80, 0xd2, 0xf4, 0x83, 0x00, 0xb9, 0xf4, 0x03, 0x15, 0x2a, + 0xf5, 0x03, 0x17, 0xaa, 0xf7, 0x03, 0x18, 0x2a, 0x73, 0xc2, 0x20, 0xcb, + 0xf6, 0x8b, 0x00, 0xb9, 0xe0, 0x4f, 0x40, 0xf9, 0x73, 0xc2, 0x38, 0x8b, + 0xf6, 0x63, 0x4b, 0xa9, 0x3a, 0x85, 0x8b, 0x52, 0xfa, 0x51, 0xb8, 0x72, + 0x13, 0x10, 0x13, 0x8b, 0x19, 0x0a, 0x97, 0x52, 0xd9, 0xa3, 0xa0, 0x72, + 0xe0, 0x66, 0x1a, 0x1b, 0x01, 0x85, 0x8b, 0x52, 0xe1, 0x51, 0xa0, 0x72, + 0x00, 0x08, 0x80, 0x13, 0x1f, 0x00, 0x01, 0x6b, 0x49, 0x07, 0x00, 0x54, + 0x80, 0x00, 0x00, 0xb0, 0x00, 0xa0, 0x08, 0x91, 0x01, 0x00, 0x40, 0xfd, + 0x80, 0x00, 0x00, 0xb0, 0x00, 0xa0, 0x08, 0x91, 0x00, 0x04, 0x40, 0xfd, + 0xe1, 0x83, 0x0d, 0x6d, 0x94, 0x08, 0x00, 0x34, 0xef, 0x8f, 0x40, 0xb9, + 0xe2, 0x03, 0x1c, 0x2a, 0xe3, 0x03, 0x1b, 0x2a, 0xe4, 0x03, 0x17, 0x2a, + 0x0e, 0x00, 0x80, 0x52, 0x05, 0x00, 0x00, 0x14, 0xc0, 0x05, 0x00, 0x11, + 0x0e, 0x3c, 0x00, 0x12, 0x9f, 0x22, 0x20, 0x6b, 0x09, 0x02, 0x00, 0x54, + 0xa0, 0x12, 0x40, 0x39, 0x00, 0x24, 0xce, 0x1a, 0x40, 0xff, 0x07, 0x36, + 0xe0, 0x7d, 0x0e, 0x1b, 0xe5, 0x63, 0x03, 0x91, 0x06, 0x00, 0x80, 0x52, + 0x00, 0x30, 0x00, 0x11, 0x00, 0x7c, 0x7c, 0x93, 0x01, 0x03, 0x00, 0x8b, + 0xc0, 0x02, 0x00, 0x8b, 0x02, 0xfe, 0xff, 0x97, 0xc0, 0x05, 0x00, 0x11, + 0x0e, 0x3c, 0x00, 0x12, 0x9f, 0x22, 0x20, 0x6b, 0x48, 0xfe, 0xff, 0x54, + 0xe0, 0x87, 0x4d, 0x6d, 0xfc, 0x03, 0x02, 0x2a, 0xfb, 0x03, 0x03, 0x2a, + 0xf7, 0x03, 0x04, 0x2a, 0xe0, 0x8b, 0x40, 0xb9, 0xf7, 0x06, 0x00, 0x11, + 0x60, 0x06, 0x00, 0x6d, 0x73, 0x42, 0x00, 0x91, 0xff, 0x02, 0x00, 0x6b, + 0x0d, 0xfa, 0xff, 0x54, 0xf7, 0x03, 0x15, 0xaa, 0xf5, 0x03, 0x14, 0x2a, + 0xf4, 0x83, 0x40, 0xb9, 0xe8, 0x33, 0x00, 0xfd, 0x3b, 0xff, 0xff, 0x17, + 0xe1, 0x7b, 0x40, 0xb9, 0x3f, 0x30, 0x00, 0x31, 0x8b, 0x0f, 0x00, 0x54, + 0x23, 0xf6, 0xff, 0x35, 0xf6, 0x7b, 0x40, 0xb9, 0xe0, 0xab, 0x40, 0xb9, + 0x18, 0x00, 0x16, 0x0b, 0xf6, 0x03, 0x02, 0x4b, 0xb0, 0xff, 0xff, 0x17, + 0x0d, 0xfa, 0xfe, 0x97, 0x1f, 0x1c, 0x00, 0x72, 0xa0, 0xf8, 0xff, 0x54, + 0xe4, 0x03, 0x17, 0x2a, 0x02, 0x00, 0x80, 0x52, 0x01, 0x1c, 0x80, 0x52, + 0x20, 0x00, 0x80, 0x52, 0x83, 0x00, 0x00, 0xb0, 0x63, 0x80, 0x07, 0x91, + 0x78, 0x46, 0xff, 0x97, 0x00, 0x00, 0xb0, 0x52, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xd1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0xe4, 0x00, 0x2f, 0x01, 0x40, 0x60, 0x1e, 0xd8, 0xff, 0xff, 0x17, + 0xe4, 0x03, 0x18, 0x2a, 0x02, 0x00, 0x80, 0x52, 0x01, 0x1c, 0x80, 0x52, + 0x20, 0x00, 0x80, 0x52, 0x83, 0x00, 0x00, 0xb0, 0x63, 0x00, 0x08, 0x91, + 0x66, 0x46, 0xff, 0x97, 0x00, 0x00, 0xb0, 0x52, 0xe8, 0x33, 0x40, 0xfd, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, + 0xf9, 0x6b, 0x44, 0xa9, 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xd1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0xab, 0x40, 0xb9, 0x61, 0x32, 0x00, 0x51, + 0x00, 0x29, 0x9c, 0x52, 0x44, 0x00, 0x01, 0x2b, 0x40, 0x40, 0x44, 0x7a, + 0x4a, 0xee, 0xff, 0x54, 0xe2, 0x67, 0x40, 0xf9, 0x40, 0x00, 0x40, 0x39, + 0x20, 0x08, 0x00, 0x34, 0x40, 0x10, 0x40, 0xb9, 0xe0, 0x07, 0x00, 0x34, + 0x23, 0x7c, 0x40, 0x93, 0xe1, 0x4b, 0x40, 0xf9, 0x63, 0xec, 0x7c, 0xd3, + 0x80, 0x00, 0x00, 0x90, 0x03, 0x14, 0x41, 0xfd, 0x20, 0x00, 0x03, 0x8b, + 0x82, 0x00, 0x00, 0x90, 0x42, 0xa0, 0x08, 0x91, 0x21, 0x68, 0x63, 0xfc, + 0xe1, 0x8b, 0x40, 0xf9, 0x00, 0x04, 0x40, 0xfd, 0x42, 0x04, 0x40, 0xfd, + 0x21, 0x00, 0x01, 0x6d, 0x01, 0x00, 0x7f, 0x6d, 0xe3, 0x8b, 0x0d, 0x6d, + 0x21, 0x00, 0x00, 0x6d, 0x95, 0x08, 0x00, 0x34, 0xf3, 0x8f, 0x40, 0xb9, + 0xe3, 0x03, 0x1b, 0x2a, 0xe2, 0xaf, 0x40, 0xb9, 0x0e, 0x00, 0x80, 0x52, + 0xef, 0x4b, 0x4b, 0xa9, 0x05, 0x00, 0x00, 0x14, 0xc0, 0x05, 0x00, 0x11, + 0x0e, 0x3c, 0x00, 0x12, 0xbf, 0x22, 0x20, 0x6b, 0x09, 0x02, 0x00, 0x54, + 0xe0, 0x12, 0x40, 0x39, 0x00, 0x24, 0xce, 0x1a, 0x40, 0xff, 0x07, 0x36, + 0x60, 0x7e, 0x0e, 0x1b, 0xe5, 0x63, 0x03, 0x91, 0x26, 0x00, 0x80, 0x52, + 0x00, 0x30, 0x00, 0x11, 0x00, 0x7c, 0x7c, 0x93, 0x41, 0x02, 0x00, 0x8b, + 0xe0, 0x01, 0x00, 0x8b, 0x90, 0xfd, 0xff, 0x97, 0xc0, 0x05, 0x00, 0x11, + 0x0e, 0x3c, 0x00, 0x12, 0xbf, 0x22, 0x20, 0x6b, 0x48, 0xfe, 0xff, 0x54, + 0xe0, 0x87, 0x4d, 0x6d, 0x00, 0x00, 0x80, 0x52, 0xe1, 0x8b, 0x40, 0xf9, + 0xe8, 0x33, 0x40, 0xfd, 0x20, 0x04, 0x02, 0x6d, 0xe1, 0x9b, 0x40, 0xf9, + 0x24, 0x00, 0x00, 0xb9, 0xe1, 0x9f, 0x40, 0xf9, 0x36, 0x00, 0x00, 0xb9, + 0x3e, 0xff, 0xff, 0x17, 0xdf, 0x02, 0x00, 0x71, 0x76, 0xd9, 0xff, 0x34, + 0xe1, 0x03, 0x14, 0x2a, 0x6c, 0xd8, 0xff, 0x54, 0x94, 0xff, 0xff, 0x17, + 0xe2, 0xab, 0x40, 0xb9, 0x00, 0x29, 0x9c, 0x52, 0x44, 0x00, 0x01, 0x2b, + 0x84, 0x40, 0x42, 0x7a, 0xed, 0xe5, 0xff, 0x54, 0xe0, 0x2b, 0x41, 0xb9, + 0x1f, 0x00, 0x04, 0x6b, 0x00, 0x00, 0x80, 0x52, 0xe1, 0xf7, 0xff, 0x54, + 0x2a, 0xff, 0xff, 0x17, 0xf4, 0x03, 0x01, 0x2a, 0x37, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x0b, 0x14, 0x30, 0x00, 0x51, 0x43, 0x01, 0x00, 0x34, + 0x60, 0x01, 0x80, 0x12, 0xe0, 0x7b, 0x00, 0xb9, 0x31, 0xff, 0xff, 0x17, + 0xe2, 0xab, 0x40, 0xb9, 0x00, 0x29, 0x9c, 0x52, 0x44, 0x00, 0x01, 0x2b, + 0x84, 0x40, 0x42, 0x7a, 0xad, 0xe3, 0xff, 0x54, 0xb1, 0xff, 0xff, 0x17, + 0x76, 0x01, 0x80, 0x12, 0xf6, 0x7b, 0x00, 0xb9, 0x79, 0xff, 0xff, 0x17, + 0x00, 0xe4, 0x00, 0x2f, 0x01, 0x40, 0x60, 0x1e, 0xd5, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x83, 0x03, 0xd1, + 0xfd, 0x7b, 0x02, 0xa9, 0xfd, 0x83, 0x00, 0x91, 0xf3, 0x53, 0x03, 0xa9, + 0xf3, 0x03, 0x07, 0xaa, 0xf5, 0x5b, 0x04, 0xa9, 0x96, 0x3c, 0x00, 0x12, + 0x15, 0x00, 0x80, 0x52, 0xf7, 0x63, 0x05, 0xa9, 0xf7, 0x03, 0x02, 0xaa, + 0x18, 0x00, 0x80, 0x52, 0xf9, 0x6b, 0x06, 0xa9, 0xfa, 0x03, 0x01, 0xaa, + 0xf9, 0x03, 0x03, 0xaa, 0xfb, 0x73, 0x07, 0xa9, 0xfb, 0x03, 0x00, 0xaa, + 0xa0, 0x3c, 0x00, 0x12, 0xf4, 0x73, 0x40, 0xf9, 0xe8, 0x27, 0x08, 0x6d, + 0xfc, 0x03, 0x06, 0xaa, 0xea, 0x2f, 0x09, 0x6d, 0x09, 0xe4, 0x00, 0x2f, + 0x0b, 0x10, 0x6c, 0x1e, 0xec, 0x37, 0x0a, 0x6d, 0x0c, 0x10, 0x7a, 0x1e, + 0xee, 0x5b, 0x00, 0xfd, 0x42, 0x34, 0x40, 0x39, 0x9f, 0x02, 0x00, 0xb9, + 0xff, 0x03, 0x19, 0x29, 0x00, 0x0a, 0xe8, 0xd2, 0x4d, 0x00, 0x63, 0x1e, + 0x0a, 0x00, 0x67, 0x9e, 0x26, 0x00, 0x00, 0x14, 0x29, 0x29, 0x6b, 0x1e, + 0x29, 0x41, 0x65, 0x1e, 0x20, 0x01, 0x78, 0x1e, 0x1f, 0x00, 0x18, 0x6b, + 0x00, 0x09, 0x00, 0x54, 0xe3, 0x63, 0x03, 0x91, 0xe2, 0x73, 0x03, 0x91, + 0x01, 0x08, 0x80, 0x52, 0x83, 0xfc, 0xff, 0x97, 0xe0, 0xdb, 0x40, 0xb9, + 0x23, 0x00, 0x80, 0x52, 0x80, 0x02, 0x00, 0xb9, 0xe2, 0x07, 0x80, 0x52, + 0xe0, 0xdf, 0x40, 0xb9, 0xb5, 0x02, 0x03, 0x0b, 0x61, 0x02, 0x40, 0xb9, + 0xe7, 0x03, 0x16, 0x2a, 0xe3, 0x0b, 0x00, 0xb9, 0xe6, 0x03, 0x16, 0x2a, + 0x00, 0x00, 0x62, 0x1e, 0x01, 0x00, 0x01, 0x0b, 0x61, 0x02, 0x00, 0xb9, + 0xe4, 0x03, 0x16, 0x2a, 0xe1, 0x03, 0x00, 0xb9, 0xe3, 0x03, 0x19, 0xaa, + 0xe5, 0x9b, 0x41, 0x79, 0xe1, 0x03, 0x1a, 0xaa, 0x09, 0xa4, 0x4a, 0x1f, + 0x80, 0x02, 0x40, 0xb9, 0xfc, 0x0f, 0x00, 0xf9, 0x40, 0x00, 0x00, 0x4b, + 0xe0, 0x13, 0x00, 0xb9, 0xe2, 0x03, 0x17, 0xaa, 0xe0, 0x03, 0x1b, 0xaa, + 0x79, 0xfc, 0xff, 0x97, 0xbf, 0xd2, 0x07, 0x71, 0x80, 0x09, 0x00, 0x54, + 0x88, 0x0b, 0x40, 0x6d, 0xae, 0x41, 0x60, 0x1e, 0x80, 0x07, 0x42, 0x6d, + 0x44, 0x08, 0x62, 0x1e, 0xe0, 0x36, 0x40, 0x39, 0x08, 0x11, 0x48, 0x1f, + 0x23, 0x08, 0x61, 0x1e, 0x81, 0x0b, 0x41, 0x6d, 0x00, 0x0c, 0x40, 0x1f, + 0x42, 0x08, 0x62, 0x1e, 0x21, 0x08, 0x41, 0x1f, 0x02, 0x00, 0x62, 0x1e, + 0x08, 0xc1, 0x61, 0x1e, 0x00, 0xc0, 0x61, 0x1e, 0x21, 0xc0, 0x61, 0x1e, + 0x03, 0x29, 0x60, 0x1e, 0x08, 0x38, 0x68, 0x1e, 0x61, 0x84, 0x6b, 0x1f, + 0x08, 0x09, 0x6c, 0x1e, 0x08, 0x19, 0x61, 0x1e, 0x0d, 0xc1, 0x60, 0x1e, + 0x50, 0x20, 0x6d, 0x1e, 0x44, 0x03, 0x00, 0x54, 0x27, 0xf9, 0xfe, 0x97, + 0x1f, 0x1c, 0x00, 0x72, 0x81, 0x04, 0x00, 0x54, 0xb0, 0x21, 0x6e, 0x1e, + 0x65, 0x05, 0x00, 0x54, 0x09, 0x25, 0x4a, 0x1f, 0x60, 0x02, 0x40, 0xb9, + 0xe0, 0xcb, 0x00, 0xb9, 0x98, 0x02, 0x40, 0xb9, 0x38, 0x21, 0x60, 0x1e, + 0x4c, 0xf7, 0xff, 0x54, 0x29, 0x39, 0x6b, 0x1e, 0x29, 0xc1, 0x64, 0x1e, + 0x20, 0x01, 0x78, 0x1e, 0x1f, 0x00, 0x18, 0x6b, 0x41, 0xf7, 0xff, 0x54, + 0x18, 0x21, 0x60, 0x1e, 0x00, 0x10, 0x6e, 0x1e, 0x8d, 0x00, 0x00, 0x54, + 0x29, 0x29, 0x60, 0x1e, 0x20, 0x01, 0x78, 0x1e, 0xb4, 0xff, 0xff, 0x17, + 0x29, 0x39, 0x60, 0x1e, 0x20, 0x01, 0x78, 0x1e, 0xb1, 0xff, 0xff, 0x17, + 0xc0, 0x05, 0x9c, 0x52, 0xfd, 0x7b, 0x42, 0xa9, 0xf3, 0x53, 0x43, 0xa9, + 0xf5, 0x5b, 0x44, 0xa9, 0xf7, 0x63, 0x45, 0xa9, 0xf9, 0x6b, 0x46, 0xa9, + 0xfb, 0x73, 0x47, 0xa9, 0xe8, 0x27, 0x48, 0x6d, 0xea, 0x2f, 0x49, 0x6d, + 0xec, 0x37, 0x4a, 0x6d, 0xee, 0x5b, 0x40, 0xfd, 0xff, 0x83, 0x03, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0x00, 0x80, 0x52, 0xe4, 0x03, 0x15, 0x2a, + 0x83, 0x00, 0x00, 0x90, 0x02, 0x00, 0x80, 0x52, 0x63, 0xe0, 0x08, 0x91, + 0x01, 0x1c, 0x80, 0x52, 0x6f, 0x45, 0xff, 0x97, 0x00, 0x00, 0xb0, 0x52, + 0xec, 0xff, 0xff, 0x17, 0xe0, 0xcb, 0x40, 0xb9, 0x60, 0x02, 0x00, 0xb9, + 0x00, 0x00, 0x80, 0x52, 0x98, 0x02, 0x00, 0xb9, 0xe7, 0xff, 0xff, 0x17, + 0xe0, 0x00, 0x9c, 0x52, 0xe5, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xaa, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xe0, 0xe3, 0x02, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0xff, 0xb7, 0x00, 0xb9, 0xbf, 0x1f, 0xff, 0x97, + 0xf5, 0x03, 0x00, 0x2a, 0x40, 0x01, 0x00, 0x34, 0xe2, 0x03, 0x00, 0x2a, + 0x41, 0x16, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x83, 0x00, 0x00, 0x90, + 0x63, 0x80, 0x09, 0x91, 0x57, 0x45, 0xff, 0x97, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xd6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x5f, 0x40, 0xf9, + 0x41, 0x05, 0x80, 0x52, 0xf3, 0x53, 0x01, 0xa9, 0x56, 0x00, 0x80, 0x52, + 0x14, 0x00, 0x80, 0x52, 0xf7, 0x63, 0x03, 0xa9, 0xb8, 0x0e, 0x00, 0xd0, + 0x18, 0x03, 0x2d, 0x91, 0xf9, 0x6b, 0x04, 0xa9, 0xb7, 0x0e, 0x00, 0xd0, + 0xf7, 0x02, 0x26, 0x91, 0xfb, 0x73, 0x05, 0xa9, 0x1b, 0x00, 0xb8, 0x12, + 0x99, 0x00, 0x00, 0x90, 0x39, 0x23, 0x10, 0x91, 0xff, 0x8f, 0x00, 0xb9, + 0xc7, 0x1f, 0xff, 0x97, 0x9a, 0x00, 0x00, 0x90, 0x5a, 0x03, 0x0c, 0x91, + 0xa1, 0x05, 0x80, 0x52, 0xe0, 0x5f, 0x40, 0xf9, 0x13, 0x00, 0x80, 0x52, + 0xc1, 0x1f, 0xff, 0x97, 0xe0, 0x5f, 0x40, 0xf9, 0xe1, 0x03, 0x1b, 0x2a, + 0xbe, 0x1f, 0xff, 0x97, 0xe0, 0x5f, 0x40, 0xf9, 0x01, 0x01, 0x80, 0x52, + 0x01, 0x00, 0xa8, 0x72, 0xba, 0x1f, 0xff, 0x97, 0x80, 0x00, 0x00, 0x90, + 0x00, 0x20, 0x0a, 0x91, 0xe0, 0x43, 0x00, 0xf9, 0x9c, 0x00, 0x00, 0x90, + 0x80, 0x23, 0x0b, 0x91, 0xe0, 0x3b, 0x00, 0xf9, 0xa0, 0x0e, 0x00, 0xd0, + 0x00, 0x20, 0x2d, 0x91, 0xe0, 0x37, 0x00, 0xf9, 0x80, 0x00, 0x00, 0x90, + 0x00, 0x80, 0x0c, 0x91, 0xe0, 0x53, 0x00, 0xf9, 0x80, 0x00, 0x00, 0x90, + 0x00, 0xc0, 0x0d, 0x91, 0xe0, 0x57, 0x00, 0xf9, 0x80, 0x00, 0x00, 0x90, + 0x00, 0x40, 0x0e, 0x91, 0xe0, 0x3f, 0x00, 0xf9, 0x1f, 0x20, 0x03, 0xd5, + 0xe0, 0x5f, 0x40, 0xf9, 0xe1, 0x03, 0x03, 0x91, 0x02, 0x00, 0x80, 0x12, + 0xdb, 0x1f, 0xff, 0x97, 0xc0, 0x09, 0x00, 0x34, 0xe2, 0x03, 0x00, 0x2a, + 0xe3, 0x03, 0x1a, 0xaa, 0x41, 0x16, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, + 0x19, 0x45, 0xff, 0x97, 0xa4, 0x02, 0x00, 0x52, 0x9c, 0x00, 0x00, 0x12, + 0x9f, 0x02, 0x00, 0x71, 0x84, 0xcb, 0x40, 0x7a, 0x40, 0xfe, 0xff, 0x54, + 0x61, 0x0a, 0x7c, 0xd3, 0xe0, 0x83, 0x03, 0x91, 0x01, 0x00, 0x01, 0x8b, + 0x73, 0x06, 0x00, 0x11, 0x94, 0x06, 0x00, 0x51, 0x73, 0x0a, 0x00, 0x12, + 0x20, 0x04, 0x40, 0xf9, 0x00, 0x03, 0x00, 0xf9, 0x36, 0x04, 0x40, 0xb9, + 0xdf, 0x0e, 0x00, 0x71, 0x68, 0x0a, 0x00, 0x54, 0xc2, 0x7e, 0x7b, 0xd3, + 0x21, 0x03, 0x02, 0x8b, 0x23, 0x08, 0x40, 0xf9, 0x03, 0x09, 0x00, 0xb4, + 0x24, 0x0c, 0x40, 0xf9, 0xc4, 0x08, 0x00, 0xb4, 0x26, 0x6b, 0x62, 0xf8, + 0x86, 0x08, 0x00, 0xb4, 0x3c, 0x04, 0x40, 0xf9, 0x9f, 0x03, 0x00, 0xf1, + 0x04, 0x18, 0x40, 0xfa, 0x00, 0x08, 0x00, 0x54, 0xe1, 0x03, 0x17, 0xaa, + 0xe4, 0x1b, 0x09, 0xa9, 0x60, 0x00, 0x3f, 0xd6, 0xe2, 0x06, 0x41, 0x29, + 0x35, 0x00, 0x80, 0x52, 0x00, 0x03, 0x40, 0xf9, 0xe3, 0x37, 0x40, 0xf9, + 0xe6, 0x4f, 0x40, 0xf9, 0xc0, 0x00, 0x3f, 0xd6, 0xe0, 0x37, 0x40, 0xf9, + 0xe2, 0xd3, 0x02, 0x91, 0xe1, 0x03, 0x17, 0xaa, 0x03, 0x00, 0x40, 0xf9, + 0x00, 0x03, 0x40, 0xf9, 0x80, 0x03, 0x3f, 0xd6, 0xe0, 0x2e, 0x40, 0xb9, + 0x70, 0x76, 0xff, 0x97, 0x00, 0x03, 0x40, 0xf9, 0xe1, 0x03, 0x17, 0xaa, + 0xe4, 0x4b, 0x40, 0xf9, 0x80, 0x00, 0x3f, 0xd6, 0xe0, 0x37, 0x40, 0xf9, + 0xe2, 0xd3, 0x02, 0x91, 0xe1, 0x03, 0x17, 0xaa, 0x03, 0x00, 0x40, 0xf9, + 0x00, 0x03, 0x40, 0xf9, 0x80, 0x03, 0x3f, 0xd6, 0xe0, 0x2e, 0x40, 0xb9, + 0x64, 0x76, 0xff, 0x97, 0x00, 0x03, 0x40, 0xf9, 0xe1, 0x03, 0x17, 0xaa, + 0xe4, 0x4b, 0x40, 0xf9, 0x80, 0x00, 0x3f, 0xd6, 0xe0, 0x37, 0x40, 0xf9, + 0xe2, 0xd3, 0x02, 0x91, 0xe1, 0x03, 0x17, 0xaa, 0x03, 0x00, 0x40, 0xf9, + 0x00, 0x03, 0x40, 0xf9, 0x80, 0x03, 0x3f, 0xd6, 0xe0, 0x5f, 0x40, 0xf9, + 0xe1, 0x03, 0x03, 0x91, 0x02, 0x00, 0x80, 0x12, 0x8e, 0x1f, 0xff, 0x97, + 0x80, 0xf6, 0xff, 0x35, 0xe0, 0xc3, 0x40, 0xb9, 0x1f, 0x00, 0x1b, 0x6b, + 0x00, 0x04, 0x00, 0x54, 0x1f, 0xa8, 0x00, 0x71, 0x60, 0x07, 0x00, 0x54, + 0x1f, 0xb4, 0x00, 0x71, 0x40, 0x0c, 0x00, 0x54, 0x01, 0x01, 0x80, 0x52, + 0x01, 0x00, 0xa8, 0x72, 0x1f, 0x00, 0x01, 0x6b, 0x20, 0x05, 0x00, 0x54, + 0xe3, 0x3f, 0x40, 0xf9, 0x22, 0xd1, 0x83, 0x12, 0x41, 0x16, 0x80, 0x52, + 0x80, 0x00, 0x80, 0x52, 0xc1, 0x44, 0xff, 0x97, 0xa4, 0x02, 0x00, 0x52, + 0x9c, 0x00, 0x00, 0x12, 0xa8, 0xff, 0xff, 0x17, 0xe3, 0x3b, 0x40, 0xf9, + 0x02, 0xd1, 0x83, 0x12, 0x41, 0x16, 0x80, 0x52, 0x00, 0x02, 0x80, 0x52, + 0x35, 0x00, 0x80, 0x52, 0xb8, 0x44, 0xff, 0x97, 0x95, 0xff, 0xff, 0x17, + 0xe3, 0x43, 0x40, 0xf9, 0xe4, 0x03, 0x16, 0x2a, 0x42, 0xd1, 0x83, 0x12, + 0x41, 0x16, 0x80, 0x52, 0x00, 0x01, 0x80, 0x52, 0x35, 0x00, 0x80, 0x52, + 0xb0, 0x44, 0xff, 0x97, 0x8d, 0xff, 0xff, 0x17, 0x40, 0x05, 0x80, 0x12, + 0x71, 0x44, 0xff, 0x97, 0xa4, 0x02, 0x00, 0x52, 0x9f, 0x1e, 0x00, 0x71, + 0x9c, 0x00, 0x00, 0x12, 0xcc, 0x09, 0x00, 0x54, 0xe1, 0x8f, 0x40, 0xb9, + 0xe2, 0x83, 0x03, 0x91, 0x94, 0x06, 0x00, 0x11, 0x20, 0x08, 0x7c, 0xd3, + 0x21, 0x04, 0x00, 0x11, 0x40, 0x00, 0x00, 0x8b, 0x21, 0x08, 0x00, 0x12, + 0xe2, 0x0f, 0x4c, 0xa9, 0xe1, 0x8f, 0x00, 0xb9, 0x02, 0x0c, 0x00, 0xa9, + 0x88, 0xff, 0xff, 0x17, 0xe0, 0x02, 0x40, 0x39, 0x3c, 0x00, 0x80, 0x52, + 0x1b, 0x74, 0xff, 0x97, 0xf5, 0x03, 0x00, 0x2a, 0x60, 0xf0, 0xff, 0x34, + 0xe3, 0x57, 0x40, 0xf9, 0xe2, 0x03, 0x00, 0x2a, 0x41, 0x16, 0x80, 0x52, + 0x00, 0x01, 0x80, 0x52, 0x15, 0x00, 0x80, 0x52, 0x93, 0x44, 0xff, 0x97, + 0x7c, 0xff, 0xff, 0x17, 0x20, 0x05, 0x80, 0x12, 0x54, 0x44, 0xff, 0x97, + 0xe0, 0xc7, 0x40, 0xb9, 0xa4, 0x02, 0x00, 0x52, 0xe1, 0x0e, 0x40, 0xb9, + 0x9c, 0x00, 0x00, 0x12, 0x00, 0x04, 0x00, 0x11, 0x1f, 0x00, 0x01, 0x6b, + 0x62, 0xee, 0xff, 0x54, 0xe0, 0x2e, 0x40, 0xb9, 0x0b, 0x76, 0xff, 0x97, + 0xe0, 0xc7, 0x40, 0xb9, 0xe1, 0x0e, 0x40, 0xb9, 0x00, 0x08, 0x00, 0x11, + 0x1f, 0x00, 0x01, 0x6b, 0x82, 0xed, 0xff, 0x54, 0xc5, 0x7e, 0x7b, 0xd3, + 0xe1, 0x03, 0x17, 0xaa, 0xe3, 0x67, 0x40, 0xf9, 0x25, 0x03, 0x05, 0x8b, + 0xe4, 0x37, 0x40, 0xf9, 0xe5, 0x4b, 0x00, 0xf9, 0x63, 0x00, 0x40, 0xf9, + 0xff, 0xb7, 0x00, 0xb9, 0x00, 0x03, 0x40, 0xf9, 0x83, 0x00, 0x00, 0xf9, + 0xa2, 0x0c, 0x40, 0xf9, 0x40, 0x00, 0x3f, 0xd6, 0xe4, 0x37, 0x40, 0xf9, + 0xe1, 0x03, 0x17, 0xaa, 0xe5, 0x4b, 0x40, 0xf9, 0xe2, 0xd3, 0x02, 0x91, + 0x00, 0x03, 0x40, 0xf9, 0x83, 0x00, 0x40, 0xf9, 0xa5, 0x04, 0x40, 0xf9, + 0xa0, 0x00, 0x3f, 0xd6, 0xe0, 0x16, 0x40, 0xb9, 0xe1, 0x2a, 0x40, 0xb9, + 0x00, 0x00, 0x01, 0x0b, 0xe0, 0x16, 0x00, 0xb9, 0x53, 0xff, 0xff, 0x17, + 0x00, 0x05, 0x80, 0x12, 0x2b, 0x44, 0xff, 0x97, 0xe2, 0x02, 0x40, 0x39, + 0x03, 0x00, 0xa8, 0x52, 0xe0, 0x43, 0x03, 0x91, 0x01, 0x00, 0x80, 0x52, + 0x42, 0x00, 0x03, 0x0b, 0x15, 0x00, 0x80, 0x52, 0x3c, 0x00, 0x80, 0x52, + 0xe2, 0x5b, 0x1a, 0x29, 0xff, 0x6f, 0x00, 0xf9, 0xfd, 0x1e, 0xff, 0x97, + 0x46, 0xff, 0xff, 0x17, 0xe3, 0x53, 0x40, 0xf9, 0x22, 0xff, 0x83, 0x12, + 0x41, 0x16, 0x80, 0x52, 0x80, 0x00, 0x80, 0x52, 0x57, 0x44, 0xff, 0x97, + 0x40, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbf, 0xa9, + 0xe1, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0x21, 0x30, 0x47, 0xf9, 0x42, 0xc0, 0x0f, 0x91, 0xa0, 0x0e, 0x00, 0xd0, + 0x26, 0x00, 0x80, 0x52, 0x00, 0xe0, 0x26, 0x91, 0x05, 0x03, 0x80, 0x52, + 0x04, 0x00, 0x82, 0x52, 0x03, 0x00, 0x80, 0xd2, 0xdc, 0x1f, 0xff, 0x97, + 0xe2, 0x03, 0x00, 0x2a, 0x00, 0x00, 0x80, 0x52, 0x62, 0x00, 0x00, 0x35, + 0xfd, 0x7b, 0xc1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x41, 0x16, 0x80, 0x52, + 0x00, 0x02, 0x80, 0x52, 0x83, 0x00, 0x00, 0x90, 0x63, 0xe0, 0x0e, 0x91, + 0x3e, 0x44, 0xff, 0x97, 0xc0, 0x04, 0x9c, 0x52, 0xfd, 0x7b, 0xc1, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x1c, 0x00, 0x12, 0x45, 0x04, 0x00, 0x51, 0xa5, 0x34, 0x46, 0xd3, + 0xbf, 0x00, 0x04, 0xeb, 0x22, 0x02, 0x00, 0x54, 0x04, 0x00, 0x80, 0x52, + 0xa2, 0x01, 0x00, 0x34, 0x1f, 0x20, 0x03, 0xd5, 0x85, 0x3c, 0x46, 0xd3, + 0x65, 0x78, 0x65, 0xf8, 0xa5, 0x24, 0xc4, 0x9a, 0x84, 0x04, 0x00, 0x11, + 0x85, 0x00, 0x00, 0x37, 0x25, 0x00, 0x40, 0xf9, 0xa5, 0x00, 0x00, 0x8b, + 0x25, 0x00, 0x00, 0xf9, 0x21, 0x20, 0x20, 0x91, 0x5f, 0x00, 0x24, 0x6b, + 0xc8, 0xfe, 0xff, 0x54, 0x00, 0x00, 0x80, 0x52, 0xc0, 0x03, 0x5f, 0xd6, + 0x40, 0x2f, 0x9c, 0x52, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbc, 0xa9, 0x10, 0x1c, 0x00, 0x12, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0xf4, 0x03, 0x01, 0xaa, 0xe1, 0x03, 0x10, 0x2a, + 0xb0, 0x0b, 0x00, 0x34, 0x00, 0x1c, 0x40, 0x92, 0xf5, 0x5b, 0x02, 0xa9, + 0x15, 0x04, 0x00, 0x91, 0x16, 0x06, 0x00, 0x51, 0x2c, 0x00, 0x80, 0xd2, + 0xad, 0xf2, 0x7d, 0xd3, 0xfe, 0x03, 0x02, 0xaa, 0xf2, 0x03, 0x03, 0xaa, + 0xf3, 0x03, 0x16, 0xaa, 0xa6, 0x21, 0x00, 0xd1, 0xf1, 0x03, 0x03, 0xaa, + 0xee, 0x03, 0x03, 0xaa, 0xe7, 0x03, 0x03, 0xaa, 0xf7, 0x63, 0x03, 0xa9, + 0xf8, 0x03, 0x0c, 0xaa, 0xf7, 0x03, 0x03, 0xaa, 0x0b, 0x00, 0x80, 0xd2, + 0xcf, 0x2f, 0x0b, 0x8b, 0xca, 0x0f, 0x0b, 0x8b, 0x04, 0x03, 0x0c, 0xcb, + 0xe3, 0x03, 0x12, 0xaa, 0xe9, 0x03, 0x12, 0xaa, 0x08, 0x00, 0x80, 0xd2, + 0x41, 0x01, 0x40, 0xfd, 0x1f, 0x01, 0x0b, 0x6b, 0xe5, 0x03, 0x08, 0x2a, + 0x21, 0xd8, 0x61, 0x5e, 0x60, 0x05, 0x00, 0x54, 0xe6, 0x79, 0x68, 0xfc, + 0x1f, 0x01, 0x00, 0x71, 0xc6, 0xd8, 0x61, 0x5e, 0x4d, 0x02, 0x00, 0x54, + 0xe2, 0x03, 0x0e, 0xaa, 0x01, 0x00, 0x80, 0xd2, 0x1f, 0x20, 0x03, 0xd5, + 0x45, 0x78, 0x64, 0xfc, 0xe0, 0x78, 0x61, 0xfc, 0x63, 0x78, 0x61, 0xfc, + 0x21, 0x04, 0x00, 0x91, 0x44, 0x00, 0x40, 0xfd, 0xbf, 0x00, 0x01, 0x6b, + 0xa2, 0x08, 0x60, 0x1e, 0x42, 0x00, 0x06, 0x8b, 0x00, 0x08, 0x63, 0x1e, + 0x80, 0x00, 0x45, 0x1f, 0x82, 0x88, 0x63, 0x1f, 0x21, 0x38, 0x60, 0x1e, + 0xc6, 0x28, 0x62, 0x1e, 0x6c, 0xfe, 0xff, 0x54, 0x20, 0x01, 0x40, 0xfd, + 0x21, 0x18, 0x60, 0x1e, 0x61, 0x78, 0x2b, 0xfc, 0x20, 0x01, 0x40, 0xfd, + 0xc6, 0x18, 0x60, 0x1e, 0xe6, 0x78, 0x28, 0xfc, 0x08, 0x05, 0x00, 0x91, + 0x4a, 0x01, 0x20, 0x91, 0x1f, 0x01, 0x0c, 0xeb, 0x29, 0x01, 0x0d, 0x8b, + 0x84, 0x04, 0x00, 0x91, 0x63, 0x00, 0x06, 0x8b, 0x41, 0xfb, 0xff, 0x54, + 0x7f, 0x01, 0x16, 0xeb, 0x20, 0x04, 0x00, 0x54, 0x6b, 0x05, 0x00, 0x91, + 0x8c, 0x05, 0x00, 0x91, 0xf7, 0x02, 0x0d, 0x8b, 0xe7, 0x00, 0x06, 0x8b, + 0xce, 0x21, 0x00, 0x91, 0xcc, 0xff, 0xff, 0x17, 0xc8, 0x01, 0x00, 0x34, + 0xe2, 0x03, 0x0e, 0xaa, 0x01, 0x00, 0x80, 0xd2, 0xe0, 0x78, 0x61, 0xfc, + 0x64, 0x78, 0x61, 0xfc, 0x21, 0x04, 0x00, 0x91, 0x42, 0x78, 0x64, 0xfc, + 0xbf, 0x00, 0x01, 0x6b, 0x43, 0x00, 0x40, 0xfd, 0x42, 0x00, 0x06, 0x8b, + 0x00, 0x08, 0x64, 0x1e, 0x60, 0x00, 0x42, 0x1f, 0x21, 0x38, 0x60, 0x1e, + 0xcc, 0xfe, 0xff, 0x54, 0x38, 0x20, 0x60, 0x1e, 0x84, 0x00, 0x00, 0x54, + 0x21, 0xc0, 0x61, 0x1e, 0xe1, 0x02, 0x00, 0xfd, 0xdf, 0xff, 0xff, 0x17, + 0xf5, 0x5b, 0x42, 0xa9, 0x21, 0x00, 0x9c, 0x52, 0xf7, 0x63, 0x43, 0xa9, + 0xe0, 0x03, 0x01, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xca, 0x2f, 0x00, 0x8b, 0xe4, 0x0f, 0x00, 0xcb, + 0x49, 0x02, 0x04, 0x8b, 0x4a, 0x21, 0x00, 0x91, 0xde, 0x0f, 0x30, 0x8b, + 0xe5, 0x03, 0x10, 0x2a, 0x88, 0x42, 0x00, 0xd1, 0x07, 0x00, 0x80, 0x92, + 0x07, 0x10, 0x6e, 0x1e, 0x45, 0x79, 0x67, 0xfc, 0xff, 0x04, 0x00, 0x31, + 0xc6, 0x03, 0x40, 0xfd, 0xa5, 0xd8, 0x61, 0x5e, 0xc6, 0xd8, 0x61, 0x5e, + 0x60, 0x02, 0x00, 0x54, 0xe2, 0x03, 0x08, 0xaa, 0xe3, 0x03, 0x09, 0xaa, + 0xe1, 0x03, 0x07, 0xaa, 0x1f, 0x20, 0x03, 0xd5, 0x43, 0x00, 0x40, 0x6d, + 0x42, 0x40, 0x00, 0xd1, 0x22, 0x7a, 0x61, 0xfc, 0x21, 0x04, 0x00, 0xd1, + 0x64, 0x00, 0x40, 0xfd, 0x3f, 0x04, 0x00, 0x31, 0x63, 0x00, 0x04, 0x8b, + 0x81, 0x08, 0x60, 0x1e, 0x40, 0x08, 0x60, 0x1e, 0x80, 0x00, 0x43, 0x1f, + 0x61, 0x84, 0x62, 0x1f, 0xc6, 0x38, 0x60, 0x1e, 0xa5, 0x28, 0x61, 0x1e, + 0x61, 0xfe, 0xff, 0x54, 0x20, 0x79, 0x60, 0xfc, 0xe7, 0x04, 0x00, 0x91, + 0xff, 0x00, 0x16, 0xeb, 0xde, 0x03, 0x20, 0x91, 0x31, 0x02, 0x06, 0x8b, + 0x29, 0x01, 0x0d, 0x8b, 0xe0, 0x18, 0x60, 0x1e, 0xc6, 0x08, 0x60, 0x1e, + 0xa5, 0x08, 0x60, 0x1e, 0x06, 0x15, 0x01, 0x6d, 0x08, 0x41, 0x00, 0x91, + 0xa1, 0xfb, 0xff, 0x54, 0x73, 0x7e, 0x40, 0x93, 0xa4, 0xf0, 0x7d, 0xd3, + 0xf5, 0x0f, 0x15, 0xcb, 0x94, 0x12, 0x05, 0x8b, 0xa7, 0x22, 0x00, 0x91, + 0xe5, 0x03, 0x10, 0x2a, 0x60, 0x02, 0x00, 0x9b, 0x07, 0x10, 0x6e, 0x1e, + 0x63, 0x4a, 0x04, 0x9b, 0x46, 0x0e, 0x00, 0x8b, 0xc6, 0x20, 0x00, 0xd1, + 0xbf, 0x00, 0x10, 0x6b, 0x86, 0x16, 0x7f, 0x6d, 0x6a, 0x02, 0x00, 0x54, + 0xa2, 0x4c, 0x30, 0x9b, 0xa1, 0x7c, 0x40, 0x93, 0xe0, 0x03, 0x14, 0xaa, + 0x42, 0x0e, 0x02, 0x8b, 0x03, 0x00, 0x40, 0x6d, 0x00, 0x40, 0x00, 0x91, + 0x64, 0x78, 0x61, 0xfc, 0x21, 0x04, 0x00, 0x91, 0x42, 0x00, 0x40, 0xfd, + 0x1f, 0x02, 0x01, 0x6b, 0x42, 0x00, 0x04, 0x8b, 0x81, 0x08, 0x60, 0x1e, + 0x40, 0x08, 0x60, 0x1e, 0x61, 0x04, 0x42, 0x1f, 0x80, 0x80, 0x43, 0x1f, + 0xa5, 0x38, 0x61, 0x1e, 0xc6, 0x28, 0x60, 0x1e, 0x6c, 0xfe, 0xff, 0x54, + 0xc0, 0x00, 0x40, 0xfd, 0x73, 0x06, 0x00, 0xd1, 0x63, 0x00, 0x07, 0x8b, + 0xa5, 0x04, 0x00, 0x71, 0xc6, 0x00, 0x15, 0x8b, 0xe0, 0x18, 0x60, 0x1e, + 0xc6, 0x08, 0x60, 0x1e, 0xa5, 0x08, 0x60, 0x1e, 0x86, 0x16, 0x3f, 0x6d, + 0x94, 0x42, 0x00, 0xd1, 0x21, 0xfc, 0xff, 0x54, 0x01, 0x00, 0x80, 0x52, + 0xe0, 0x03, 0x01, 0x2a, 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xfd, 0x7b, 0xc4, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x01, 0x00, 0x66, 0x9e, 0x23, 0xf8, 0x74, 0xd3, 0x60, 0x24, 0x0f, 0x51, + 0x1f, 0xf8, 0x00, 0x71, 0xa8, 0x03, 0x00, 0x54, 0x81, 0x00, 0x00, 0x90, + 0x20, 0x00, 0x13, 0x91, 0x22, 0x60, 0x42, 0xfd, 0x10, 0x1c, 0x41, 0x6d, + 0x02, 0x08, 0x62, 0x1e, 0x03, 0x18, 0x42, 0x6d, 0x01, 0x14, 0x43, 0x6d, + 0x44, 0x40, 0x66, 0x1e, 0x41, 0x00, 0x64, 0x9e, 0x00, 0x02, 0x44, 0x1f, + 0x22, 0x18, 0x7f, 0xd3, 0x44, 0x38, 0x00, 0x91, 0x42, 0x3c, 0x00, 0x91, + 0xe0, 0x00, 0x44, 0x1f, 0x04, 0x78, 0x64, 0xfc, 0x00, 0x78, 0x62, 0xf8, + 0xc3, 0x0c, 0x40, 0x1f, 0x02, 0x08, 0x60, 0x1e, 0xa1, 0x04, 0x40, 0x1f, + 0x00, 0x28, 0x64, 0x1e, 0x00, 0xb4, 0x01, 0x8b, 0x44, 0x08, 0x62, 0x1e, + 0x60, 0x00, 0x42, 0x1f, 0x81, 0x00, 0x41, 0x1f, 0xe3, 0x01, 0x00, 0x34, + 0x00, 0x00, 0x67, 0x9e, 0x20, 0x00, 0x40, 0x1f, 0xc0, 0x03, 0x5f, 0xd6, + 0xa0, 0x05, 0xf8, 0x37, 0x7f, 0x20, 0x10, 0x71, 0xc9, 0x02, 0x00, 0x54, + 0x00, 0xfe, 0xff, 0xd2, 0x3f, 0x00, 0x00, 0xeb, 0x80, 0x06, 0x00, 0x54, + 0x7f, 0xfc, 0x1f, 0x71, 0xc0, 0x04, 0x00, 0x54, 0x00, 0x00, 0x80, 0x52, + 0xe1, 0x05, 0xf8, 0xb7, 0x49, 0x00, 0x00, 0x14, 0xa1, 0x04, 0xf8, 0x36, + 0x01, 0xfc, 0xe7, 0xd2, 0x00, 0x00, 0x01, 0x8b, 0x00, 0x00, 0x67, 0x9e, + 0x05, 0x10, 0x6e, 0x1e, 0x21, 0x08, 0x60, 0x1e, 0x04, 0x28, 0x61, 0x1e, + 0x90, 0x20, 0x65, 0x1e, 0xe4, 0x00, 0x00, 0x54, 0x00, 0x02, 0xe0, 0xd2, + 0x00, 0x00, 0x67, 0x9e, 0x80, 0x08, 0x60, 0x1e, 0x50, 0x00, 0x00, 0x14, + 0x03, 0x00, 0x80, 0x52, 0xcb, 0xff, 0xff, 0x17, 0x86, 0x28, 0x65, 0x1e, + 0x02, 0x38, 0x64, 0x1e, 0x00, 0xe4, 0x00, 0x2f, 0xa3, 0x38, 0x66, 0x1e, + 0x41, 0x28, 0x61, 0x1e, 0x62, 0x28, 0x64, 0x1e, 0x41, 0x28, 0x61, 0x1e, + 0x21, 0x28, 0x66, 0x1e, 0x21, 0x38, 0x65, 0x1e, 0x20, 0x20, 0x60, 0x1e, + 0x80, 0x00, 0x00, 0x54, 0x00, 0x02, 0xe0, 0xd2, 0x00, 0x00, 0x67, 0x9e, + 0x20, 0x08, 0x60, 0x1e, 0x00, 0x02, 0xe0, 0xd2, 0x02, 0x00, 0x67, 0x9e, + 0x01, 0x00, 0x67, 0x9e, 0x21, 0x08, 0x62, 0x1e, 0x3b, 0x00, 0x00, 0x14, + 0x01, 0x10, 0x6e, 0x1e, 0x00, 0x28, 0x61, 0x1e, 0xc0, 0x03, 0x5f, 0xd6, + 0x01, 0x1e, 0xf8, 0xd2, 0x00, 0x00, 0x01, 0x8b, 0x02, 0x00, 0x67, 0x9e, + 0x00, 0xe0, 0xef, 0xd2, 0x22, 0x08, 0x42, 0x1f, 0x00, 0x00, 0x67, 0x9e, + 0x40, 0x08, 0x60, 0x1e, 0x36, 0x00, 0x00, 0x14, 0x17, 0x00, 0x00, 0x14, + 0x00, 0xe4, 0x00, 0x2f, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xe8, 0x0f, 0x00, 0xfd, 0x08, 0x40, 0x60, 0x1e, + 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0x2a, 0xfa, 0x02, 0x00, 0x94, + 0x00, 0x41, 0x60, 0x1e, 0xe8, 0x0f, 0x40, 0xfd, 0x13, 0x00, 0x00, 0xb9, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x61, 0x1e, 0x1f, 0x00, 0x00, 0x71, + 0x21, 0x1c, 0x60, 0x1e, 0x00, 0x08, 0x61, 0x1e, 0x40, 0x04, 0x80, 0x52, + 0xed, 0xff, 0xff, 0x17, 0x01, 0x00, 0xe2, 0xd2, 0x20, 0x00, 0x67, 0x9e, + 0xf8, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xee, 0xd2, + 0x20, 0x00, 0x67, 0x9e, 0xf4, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0x00, 0x00, 0x71, 0x01, 0x10, 0x6e, 0x1e, 0x00, 0x10, 0x7e, 0x1e, + 0x00, 0x1c, 0x61, 0x1e, 0x01, 0xe4, 0x00, 0x2f, 0x40, 0x04, 0x80, 0x52, + 0x00, 0x18, 0x61, 0x1e, 0xdd, 0xff, 0xff, 0x17, 0x00, 0x20, 0x60, 0x1e, + 0x00, 0x38, 0x60, 0x1e, 0x00, 0x18, 0x60, 0x1e, 0x66, 0x00, 0x00, 0x54, + 0x20, 0x04, 0x80, 0x52, 0xd7, 0xff, 0xff, 0x17, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x60, 0x1e, 0x40, 0x00, 0x00, 0x54, + 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x04, 0x80, 0x52, 0xd0, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x02, 0xc0, 0x60, 0x1e, 0x00, 0x02, 0xf0, 0x92, + 0x01, 0x00, 0x67, 0x9e, 0x40, 0x20, 0x61, 0x1e, 0x4c, 0x00, 0x00, 0x54, + 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x04, 0x80, 0x52, 0xc7, 0xff, 0xff, 0x17, + 0x01, 0x00, 0x26, 0x1e, 0x1f, 0x00, 0x00, 0xb9, 0x03, 0x10, 0xb0, 0x12, + 0x22, 0x78, 0x00, 0x72, 0x40, 0x10, 0x43, 0x7a, 0x0c, 0x02, 0x00, 0x54, + 0x3f, 0x1c, 0x09, 0x72, 0x03, 0x00, 0x80, 0x52, 0xc1, 0x00, 0x00, 0x54, + 0x81, 0x65, 0x02, 0x0f, 0x03, 0x03, 0x80, 0x12, 0x00, 0x08, 0x21, 0x1e, + 0x01, 0x00, 0x26, 0x1e, 0x22, 0x78, 0x00, 0x12, 0x42, 0x7c, 0x17, 0x13, + 0x21, 0x5c, 0x01, 0x12, 0x42, 0xf8, 0x01, 0x51, 0x21, 0x14, 0x08, 0x32, + 0x42, 0x00, 0x03, 0x0b, 0x20, 0x00, 0x27, 0x1e, 0x02, 0x00, 0x00, 0xb9, + 0xc0, 0x03, 0x5f, 0xd6, 0x22, 0x00, 0x26, 0x1e, 0x04, 0x00, 0x26, 0x1e, + 0x00, 0x20, 0xb0, 0x12, 0x02, 0x40, 0x20, 0x1e, 0x83, 0x00, 0x60, 0x51, + 0x41, 0x78, 0x1f, 0x53, 0x7f, 0x00, 0x00, 0x6b, 0x20, 0x04, 0x00, 0x51, + 0x03, 0x20, 0xa0, 0x12, 0x68, 0x07, 0x00, 0x54, 0x1f, 0x00, 0x03, 0x6b, + 0x82, 0x0f, 0x00, 0x54, 0x00, 0x00, 0x80, 0x52, 0xa3, 0x19, 0xb8, 0x52, + 0x83, 0x00, 0x03, 0x0b, 0x61, 0x20, 0x09, 0x12, 0x82, 0x00, 0x00, 0x90, + 0x63, 0x58, 0x53, 0xd3, 0x42, 0xe0, 0x39, 0x91, 0x84, 0x00, 0x01, 0x4b, + 0x80, 0x00, 0x27, 0x1e, 0x63, 0xec, 0x7c, 0xd3, 0x03, 0x10, 0x7e, 0x1e, + 0x02, 0xc0, 0x22, 0x1e, 0x21, 0x7c, 0x12, 0x13, 0x47, 0x10, 0x51, 0x6d, + 0x44, 0x00, 0x03, 0x8b, 0x45, 0x68, 0x63, 0xfc, 0x20, 0x00, 0x62, 0x1e, + 0x21, 0xc0, 0x22, 0x1e, 0xc1, 0x2b, 0x90, 0xd2, 0x90, 0x04, 0x40, 0xfd, + 0xa2, 0x0c, 0x42, 0x1f, 0x45, 0x90, 0x40, 0xfd, 0x46, 0x0c, 0x50, 0x6d, + 0x00, 0x28, 0x70, 0x1e, 0x44, 0x10, 0x47, 0x1f, 0x40, 0x00, 0x45, 0x1f, + 0x45, 0x08, 0x62, 0x1e, 0x42, 0x0c, 0x46, 0x1f, 0xa3, 0x08, 0x65, 0x1e, + 0xa0, 0x00, 0x44, 0x1f, 0x40, 0x00, 0x43, 0x1f, 0x21, 0x08, 0x60, 0x1e, + 0x22, 0x00, 0x66, 0x9e, 0x42, 0xf8, 0x6f, 0xd3, 0x5f, 0x00, 0x01, 0xeb, + 0xe8, 0x04, 0x00, 0x54, 0x20, 0x40, 0x66, 0x1e, 0x82, 0x00, 0x00, 0x90, + 0x42, 0xc0, 0x34, 0x91, 0x21, 0x00, 0x64, 0x9e, 0x02, 0x10, 0x6e, 0x1e, + 0x21, 0x38, 0x60, 0x1e, 0x44, 0xa0, 0x40, 0xfd, 0x43, 0x00, 0x53, 0x6d, + 0x23, 0x10, 0x40, 0x92, 0x21, 0x00, 0x00, 0x8b, 0x20, 0x00, 0x43, 0x1f, + 0x23, 0x08, 0x61, 0x1e, 0x21, 0x08, 0x44, 0x1f, 0x40, 0x78, 0x63, 0xf8, + 0x01, 0xbc, 0x01, 0x8b, 0x00, 0x04, 0x43, 0x1f, 0x21, 0x00, 0x67, 0x9e, + 0x00, 0x08, 0x61, 0x1e, 0x00, 0x40, 0x62, 0x1e, 0xc0, 0x03, 0x5f, 0xd6, + 0x1f, 0x00, 0x03, 0x6b, 0x22, 0x0e, 0x00, 0x54, 0x81, 0x78, 0x1f, 0x53, + 0x20, 0x04, 0x00, 0x51, 0x1f, 0x00, 0x03, 0x6b, 0xc2, 0x0a, 0x00, 0x54, + 0x00, 0x00, 0x80, 0x52, 0x84, 0x04, 0xf8, 0x37, 0x01, 0xf0, 0xbf, 0x12, + 0x9f, 0x00, 0x01, 0x6b, 0xe8, 0xf7, 0xff, 0x54, 0x60, 0x65, 0x02, 0x0f, + 0x04, 0x90, 0xbe, 0x52, 0x42, 0x08, 0x20, 0x1e, 0x41, 0x00, 0x26, 0x1e, + 0x22, 0x78, 0x00, 0x12, 0x44, 0x00, 0x04, 0x0b, 0xb8, 0xff, 0xff, 0x17, + 0x61, 0x00, 0x00, 0xf0, 0x20, 0x44, 0x42, 0xfd, 0x30, 0x20, 0x60, 0x1e, + 0xac, 0x05, 0x00, 0x54, 0x61, 0x00, 0x00, 0xf0, 0x20, 0x48, 0x42, 0xfd, + 0x30, 0x20, 0x60, 0x1e, 0xed, 0x00, 0x00, 0x54, 0x60, 0x66, 0x01, 0x0f, + 0x60, 0x04, 0x00, 0x34, 0x02, 0x10, 0x3e, 0x1e, 0x40, 0x38, 0x20, 0x1e, + 0x00, 0x20, 0x22, 0x1e, 0x61, 0x04, 0x00, 0x54, 0x01, 0x00, 0xd8, 0xd2, + 0x41, 0x16, 0xf8, 0xf2, 0x20, 0x00, 0x67, 0x9e, 0x30, 0x20, 0x60, 0x1e, + 0xa9, 0x09, 0x00, 0x54, 0x01, 0x00, 0xd4, 0xd2, 0x41, 0x16, 0xf8, 0xf2, + 0x20, 0x00, 0x67, 0x9e, 0x30, 0x20, 0x60, 0x1e, 0x65, 0xf8, 0xff, 0x54, + 0xe6, 0x01, 0x00, 0x14, 0x41, 0x78, 0x57, 0xd3, 0x3f, 0xf8, 0x01, 0x71, + 0xed, 0x01, 0x00, 0x54, 0x3f, 0x58, 0x02, 0x71, 0x6c, 0x01, 0x00, 0x54, + 0xc0, 0x12, 0x80, 0x52, 0x01, 0x00, 0x01, 0x4b, 0x20, 0x00, 0x80, 0x52, + 0x00, 0x20, 0xc1, 0x1a, 0x01, 0x04, 0x00, 0x51, 0x3f, 0x00, 0x02, 0x6a, + 0xc1, 0x00, 0x00, 0x54, 0x00, 0x00, 0x02, 0x6a, 0x21, 0x00, 0xa0, 0x52, + 0x00, 0x00, 0x81, 0x1a, 0x84, 0x78, 0x00, 0x12, 0xcd, 0xff, 0xff, 0x17, + 0x40, 0x40, 0x20, 0x1e, 0xe1, 0x01, 0x00, 0x14, 0x02, 0x10, 0x2e, 0x1e, + 0x00, 0x28, 0x22, 0x1e, 0x00, 0x20, 0x22, 0x1e, 0xe0, 0xfb, 0xff, 0x54, + 0xd2, 0x01, 0x00, 0x14, 0x01, 0x06, 0x00, 0x34, 0x00, 0xf0, 0xa7, 0x52, + 0x9f, 0x00, 0x00, 0x6b, 0x00, 0x07, 0x00, 0x54, 0x00, 0xe0, 0xbf, 0x52, + 0x84, 0x78, 0x1f, 0x53, 0x3f, 0x00, 0x00, 0x6b, 0x82, 0x00, 0x40, 0x7a, + 0x69, 0x00, 0x00, 0x54, 0x40, 0x28, 0x21, 0x1e, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0xe0, 0xaf, 0x52, 0x00, 0x10, 0x2e, 0x1e, 0x9f, 0x00, 0x00, 0x6b, + 0xc0, 0xf5, 0xff, 0x54, 0x00, 0x20, 0xb0, 0x12, 0xe2, 0x03, 0x22, 0x2a, + 0x9f, 0x00, 0x00, 0x6b, 0x00, 0x04, 0x00, 0x0f, 0xe0, 0x97, 0x9f, 0x1a, + 0x1f, 0x7c, 0x42, 0x6b, 0xe1, 0xf4, 0xff, 0x54, 0x20, 0x08, 0x21, 0x1e, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x08, 0x20, 0x1e, 0x00, 0x00, 0x80, 0x52, + 0x84, 0x00, 0xf8, 0x37, 0x81, 0x03, 0x00, 0x35, 0x02, 0xf4, 0xff, 0x36, + 0xb6, 0x01, 0x00, 0x14, 0x44, 0x78, 0x57, 0xd3, 0x83, 0xfc, 0x01, 0x51, + 0x7f, 0x5c, 0x00, 0x71, 0x48, 0xff, 0xff, 0x54, 0xc3, 0x12, 0x80, 0x52, + 0x63, 0x00, 0x04, 0x4b, 0x24, 0x00, 0x80, 0x52, 0x83, 0x20, 0xc3, 0x1a, + 0x65, 0x04, 0x00, 0x51, 0xbf, 0x00, 0x02, 0x6a, 0x61, 0xfe, 0xff, 0x54, + 0x60, 0x00, 0x02, 0x6a, 0x20, 0xfe, 0xff, 0x54, 0x00, 0x40, 0x21, 0x1e, + 0xe0, 0x03, 0x04, 0x2a, 0xee, 0xff, 0xff, 0x17, 0x9d, 0x01, 0x00, 0x14, + 0xa1, 0xfa, 0xff, 0x35, 0x80, 0x00, 0x0a, 0x52, 0x00, 0x10, 0x2e, 0x1e, + 0x00, 0x78, 0x1f, 0x53, 0x1f, 0x00, 0x60, 0x31, 0x09, 0xf1, 0xff, 0x54, + 0x40, 0x28, 0x21, 0x1e, 0xd4, 0xff, 0xff, 0x17, 0xa2, 0xf0, 0xff, 0x36, + 0x01, 0x10, 0x2e, 0x1e, 0x20, 0x18, 0x20, 0x1e, 0xc0, 0x03, 0x5f, 0xd6, + 0x40, 0x00, 0x0a, 0x52, 0x00, 0x10, 0x2e, 0x1e, 0x00, 0x78, 0x1f, 0x53, + 0x1f, 0x00, 0x60, 0x31, 0x48, 0xf9, 0xff, 0x54, 0xc0, 0x03, 0x5f, 0xd6, + 0xfd, 0x7b, 0xbb, 0xa9, 0xfd, 0x03, 0x00, 0x91, 0xe8, 0x0b, 0x00, 0xfd, + 0x08, 0x40, 0x20, 0x1e, 0x8e, 0x00, 0x00, 0x94, 0x00, 0x21, 0x28, 0x1e, + 0xc0, 0x00, 0x00, 0xf0, 0x00, 0x68, 0x4e, 0xb9, 0x04, 0x78, 0x41, 0x3a, + 0x60, 0x00, 0x00, 0x54, 0x18, 0x21, 0x20, 0x1e, 0x89, 0x00, 0x00, 0x54, + 0xe8, 0x0b, 0x40, 0xfd, 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0xc1, 0x22, 0x1e, 0x61, 0x00, 0x00, 0xf0, 0x21, 0x60, 0x12, 0x91, + 0xe1, 0x17, 0x00, 0xf9, 0xff, 0x4b, 0x00, 0xb9, 0x08, 0x21, 0x20, 0x1e, + 0xe0, 0x03, 0x03, 0x6d, 0x40, 0x02, 0x00, 0x34, 0x01, 0xfe, 0xff, 0xd2, + 0xe1, 0x23, 0x00, 0xf9, 0x01, 0x05, 0x00, 0x54, 0x41, 0x00, 0x80, 0x52, + 0xe1, 0x23, 0x00, 0xb9, 0x1f, 0x00, 0x01, 0x6b, 0x01, 0x04, 0x00, 0x54, + 0xca, 0x01, 0x00, 0x94, 0x41, 0x04, 0x80, 0x52, 0x01, 0x00, 0x00, 0xb9, + 0xe0, 0x4b, 0x40, 0xb9, 0xa0, 0x02, 0x00, 0x35, 0xe0, 0x23, 0x40, 0xfd, + 0xe8, 0x0b, 0x40, 0xfd, 0xfd, 0x7b, 0xc5, 0xa8, 0x00, 0x40, 0x62, 0x1e, + 0xc0, 0x03, 0x5f, 0xd6, 0xe0, 0x4b, 0x63, 0xb2, 0xe0, 0xfd, 0xf8, 0xf2, + 0xe0, 0x23, 0x00, 0xf9, 0x00, 0x02, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, + 0xe0, 0x23, 0x00, 0xb9, 0xe0, 0x83, 0x00, 0x91, 0xad, 0x01, 0x00, 0x94, + 0xa0, 0x02, 0x00, 0x34, 0x00, 0x00, 0x00, 0xd0, 0x00, 0xa0, 0x10, 0x91, + 0xab, 0x01, 0x00, 0x94, 0xe0, 0x23, 0x00, 0xfd, 0xe0, 0x4b, 0x40, 0xb9, + 0xa0, 0xfd, 0xff, 0x34, 0xb1, 0x01, 0x00, 0x94, 0xe1, 0x4b, 0x40, 0xb9, + 0x01, 0x00, 0x00, 0xb9, 0xe9, 0xff, 0xff, 0x17, 0x40, 0x00, 0x80, 0x52, + 0xe0, 0x23, 0x00, 0xb9, 0xe0, 0x83, 0x00, 0x91, 0x9e, 0x01, 0x00, 0x94, + 0x40, 0xfc, 0xff, 0x35, 0xde, 0xff, 0xff, 0x17, 0x21, 0x00, 0x80, 0x52, + 0xe1, 0x23, 0x00, 0xb9, 0x1f, 0x08, 0x00, 0x71, 0x41, 0xfd, 0xff, 0x54, + 0xa3, 0x01, 0x00, 0x94, 0x21, 0x04, 0x80, 0x52, 0x01, 0x00, 0x00, 0xb9, + 0xe9, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbb, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xe8, 0x0b, 0x00, 0xfd, 0x08, 0x40, 0x60, 0x1e, + 0x7a, 0x00, 0x00, 0x94, 0x00, 0x21, 0x68, 0x1e, 0xc0, 0x00, 0x00, 0xf0, + 0x00, 0x68, 0x4e, 0xb9, 0x04, 0x78, 0x41, 0x3a, 0x60, 0x00, 0x00, 0x54, + 0x18, 0x21, 0x60, 0x1e, 0x89, 0x00, 0x00, 0x54, 0xe8, 0x0b, 0x40, 0xfd, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x61, 0x00, 0x00, 0xf0, + 0x21, 0x80, 0x12, 0x91, 0xe1, 0x17, 0x00, 0xf9, 0x08, 0x21, 0x60, 0x1e, + 0xff, 0x4b, 0x00, 0xb9, 0xe8, 0x23, 0x03, 0x6d, 0x80, 0x02, 0x00, 0x35, + 0xe0, 0x4b, 0x63, 0xb2, 0xe0, 0xfd, 0xf8, 0xf2, 0xe0, 0x23, 0x00, 0xf9, + 0x20, 0x04, 0x00, 0x54, 0x20, 0x00, 0x80, 0x52, 0xe0, 0x23, 0x00, 0xb9, + 0xe0, 0x83, 0x00, 0x91, 0x75, 0x01, 0x00, 0x94, 0xc0, 0x04, 0x00, 0x34, + 0x00, 0x00, 0x00, 0xd0, 0x00, 0xa0, 0x10, 0x91, 0x73, 0x01, 0x00, 0x94, + 0xe0, 0x23, 0x00, 0xfd, 0xe0, 0x4b, 0x40, 0xb9, 0x20, 0x02, 0x00, 0x35, + 0xe0, 0x23, 0x40, 0xfd, 0xe8, 0x0b, 0x40, 0xfd, 0xfd, 0x7b, 0xc5, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x01, 0xfe, 0xff, 0xd2, 0xe1, 0x23, 0x00, 0xf9, + 0xa1, 0x02, 0x00, 0x54, 0x41, 0x00, 0x80, 0x52, 0xe1, 0x23, 0x00, 0xb9, + 0x1f, 0x00, 0x01, 0x6b, 0xa1, 0x01, 0x00, 0x54, 0x6e, 0x01, 0x00, 0x94, + 0x41, 0x04, 0x80, 0x52, 0x01, 0x00, 0x00, 0xb9, 0xe0, 0x4b, 0x40, 0xb9, + 0x20, 0xfe, 0xff, 0x34, 0x69, 0x01, 0x00, 0x94, 0xe1, 0x4b, 0x40, 0xb9, + 0x01, 0x00, 0x00, 0xb9, 0xe0, 0x23, 0x40, 0xfd, 0xed, 0xff, 0xff, 0x17, + 0x40, 0x00, 0x80, 0x52, 0xe0, 0x23, 0x00, 0xb9, 0xe0, 0x83, 0x00, 0x91, + 0x55, 0x01, 0x00, 0x94, 0xa0, 0xfe, 0xff, 0x35, 0xf1, 0xff, 0xff, 0x17, + 0x21, 0x00, 0x80, 0x52, 0xe1, 0x23, 0x00, 0xb9, 0x1f, 0x08, 0x00, 0x71, + 0x21, 0xfb, 0xff, 0x54, 0x5a, 0x01, 0x00, 0x94, 0x21, 0x04, 0x80, 0x52, + 0x01, 0x00, 0x00, 0xb9, 0xd8, 0xff, 0xff, 0x17, 0x00, 0x00, 0x26, 0x1e, + 0x1f, 0x78, 0x40, 0xf2, 0x40, 0x05, 0x00, 0x54, 0xa0, 0x05, 0xf8, 0x37, + 0x01, 0x10, 0xb0, 0x12, 0x1f, 0x00, 0x01, 0x6b, 0xcc, 0x05, 0x00, 0x54, + 0xfd, 0x7b, 0xbe, 0xa9, 0x01, 0xf0, 0xbf, 0x12, 0x03, 0x00, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0xe8, 0x0b, 0x00, 0xfd, 0x1f, 0x00, 0x01, 0x6b, + 0xac, 0x00, 0x00, 0x54, 0x81, 0x65, 0x02, 0x0f, 0x03, 0x03, 0x80, 0x12, + 0x00, 0x08, 0x21, 0x1e, 0x00, 0x00, 0x26, 0x1e, 0x01, 0x7c, 0x17, 0x13, + 0xe2, 0x0f, 0x80, 0x52, 0x21, 0xfc, 0x01, 0x51, 0x21, 0x00, 0x03, 0x0b, + 0x23, 0x7c, 0x1f, 0x53, 0x21, 0x00, 0x03, 0x0b, 0x42, 0x00, 0x03, 0x4b, + 0x28, 0x00, 0x22, 0x1e, 0x40, 0x20, 0x09, 0x33, 0x00, 0x00, 0x27, 0x1e, + 0xf4, 0x00, 0x00, 0x94, 0x20, 0x7b, 0x8b, 0x52, 0xc0, 0xdb, 0xa7, 0x72, + 0x03, 0x00, 0x27, 0x1e, 0x60, 0xfb, 0x84, 0x52, 0x80, 0xaa, 0xa6, 0x72, + 0x02, 0x00, 0x27, 0x1e, 0x00, 0x08, 0x23, 0x1e, 0x00, 0x10, 0x84, 0x52, + 0x00, 0x01, 0x02, 0x1f, 0x40, 0xd3, 0xa7, 0x72, 0x01, 0x00, 0x27, 0x1e, + 0x00, 0x01, 0x01, 0x1f, 0xe8, 0x0b, 0x40, 0xfd, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x01, 0x04, 0x00, 0x0f, 0x80, 0x65, 0x06, 0x0f, + 0x00, 0x18, 0x21, 0x1e, 0xc0, 0x03, 0x5f, 0xd6, 0x01, 0x04, 0x00, 0x0f, + 0x00, 0x38, 0x20, 0x1e, 0x00, 0x18, 0x21, 0x1e, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x28, 0x20, 0x1e, 0xc0, 0x03, 0x5f, 0xd6, 0x01, 0x00, 0x66, 0x9e, + 0x02, 0xfe, 0xbf, 0x12, 0x20, 0xfc, 0x60, 0xd3, 0x1f, 0x00, 0x02, 0x6b, + 0x0c, 0x02, 0x00, 0x54, 0x02, 0x78, 0x00, 0x12, 0x41, 0x00, 0x01, 0x2a, + 0xc1, 0x05, 0x00, 0x34, 0x40, 0x06, 0xf8, 0x37, 0x00, 0x6a, 0xe8, 0xd2, + 0x01, 0x00, 0x67, 0x9e, 0xa4, 0x06, 0x80, 0x12, 0x00, 0x02, 0xb0, 0x12, + 0x00, 0x08, 0x61, 0x1e, 0x02, 0x00, 0x66, 0x9e, 0x42, 0xfc, 0x60, 0xd3, + 0x5f, 0x00, 0x00, 0x6b, 0x0d, 0x01, 0x00, 0x54, 0x00, 0x28, 0x60, 0x1e, + 0xc0, 0x03, 0x5f, 0xd6, 0xe2, 0x03, 0x00, 0x2a, 0x04, 0x00, 0x80, 0x52, + 0x00, 0x02, 0xb0, 0x12, 0x5f, 0x00, 0x00, 0x6b, 0x4c, 0xff, 0xff, 0x54, + 0x41, 0x7c, 0x14, 0x13, 0xfd, 0x7b, 0xbe, 0xa9, 0x21, 0xfc, 0x0f, 0x51, + 0x21, 0x00, 0x04, 0x0b, 0x00, 0x00, 0x66, 0x9e, 0xe3, 0x7f, 0x80, 0x52, + 0xfd, 0x03, 0x00, 0x91, 0x24, 0x7c, 0x1f, 0x53, 0x63, 0x00, 0x04, 0x4b, + 0x21, 0x00, 0x04, 0x0b, 0xe8, 0x0b, 0x00, 0xfd, 0x62, 0x2c, 0x0c, 0x33, + 0x28, 0x00, 0x62, 0x1e, 0x40, 0x7c, 0x60, 0xb3, 0x00, 0x00, 0x67, 0x9e, + 0x16, 0x00, 0x00, 0x94, 0x60, 0x00, 0x00, 0xf0, 0x03, 0x54, 0x42, 0xfd, + 0x60, 0x00, 0x00, 0xf0, 0x02, 0x58, 0x42, 0xfd, 0x60, 0x00, 0x00, 0xf0, + 0x00, 0x08, 0x63, 0x1e, 0x01, 0x5c, 0x42, 0xfd, 0x00, 0x01, 0x42, 0x1f, + 0x00, 0x01, 0x41, 0x1f, 0xe8, 0x0b, 0x40, 0xfd, 0xfd, 0x7b, 0xc2, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x01, 0xe4, 0x00, 0x2f, 0x00, 0x6a, 0xf8, 0xd2, + 0x00, 0x00, 0x67, 0x9e, 0x00, 0x18, 0x61, 0x1e, 0xc0, 0x03, 0x5f, 0xd6, + 0x01, 0xe4, 0x00, 0x2f, 0x00, 0x38, 0x60, 0x1e, 0x00, 0x18, 0x61, 0x1e, + 0xc0, 0x03, 0x5f, 0xd6, 0x02, 0x00, 0x66, 0x9e, 0x40, 0x02, 0xf8, 0xd2, + 0x01, 0xe0, 0xde, 0x92, 0x61, 0x00, 0xe0, 0xf2, 0x40, 0x00, 0x00, 0x8b, + 0x1f, 0x00, 0x01, 0xeb, 0x40, 0xfc, 0x70, 0xd3, 0x29, 0x05, 0x00, 0x54, + 0x03, 0x40, 0x00, 0x51, 0xe1, 0xfb, 0x8f, 0x52, 0x7f, 0x00, 0x01, 0x6b, + 0xc8, 0x09, 0x00, 0x54, 0x41, 0x03, 0xf8, 0xd2, 0x41, 0x00, 0x01, 0x8b, + 0x65, 0x00, 0x00, 0xf0, 0xa0, 0x80, 0x3e, 0x91, 0x23, 0xcc, 0x6d, 0xd3, + 0x24, 0xfc, 0x74, 0x93, 0x63, 0x24, 0x00, 0x91, 0x21, 0x2c, 0x4c, 0x92, + 0x41, 0x00, 0x01, 0xcb, 0x84, 0x00, 0x62, 0x1e, 0x62, 0xec, 0x7c, 0xd3, + 0xa1, 0xd0, 0x47, 0xfd, 0x03, 0x00, 0x02, 0x8b, 0x03, 0x10, 0x7e, 0x1e, + 0x05, 0x18, 0x42, 0x6d, 0x00, 0x68, 0x62, 0xfc, 0x62, 0x04, 0x40, 0xfd, + 0x21, 0x08, 0x44, 0x1f, 0x22, 0x00, 0x67, 0x9e, 0x10, 0x18, 0x40, 0xfd, + 0x42, 0x0c, 0x40, 0x1f, 0x11, 0x04, 0x40, 0xfd, 0x00, 0x0c, 0x41, 0x6d, + 0x47, 0x28, 0x61, 0x1e, 0x06, 0x1a, 0x42, 0x1f, 0xa3, 0x0c, 0x42, 0x1f, + 0x45, 0x08, 0x62, 0x1e, 0x21, 0x38, 0x67, 0x1e, 0x50, 0x08, 0x65, 0x1e, + 0x21, 0x28, 0x62, 0x1e, 0xc2, 0x0c, 0x45, 0x1f, 0x21, 0x06, 0x44, 0x1f, + 0x00, 0x04, 0x45, 0x1f, 0x00, 0x02, 0x42, 0x1f, 0x00, 0x28, 0x67, 0x1e, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0xfe, 0xe7, 0xd2, 0x5f, 0x00, 0x00, 0xeb, + 0x80, 0x07, 0x00, 0x54, 0x60, 0x00, 0x00, 0xf0, 0x00, 0x80, 0x3e, 0x91, + 0x01, 0x10, 0x6e, 0x1e, 0x01, 0x34, 0xe8, 0xd2, 0x00, 0x38, 0x61, 0x1e, + 0x21, 0x00, 0x67, 0x9e, 0x05, 0x10, 0x47, 0x6d, 0x02, 0x00, 0x41, 0x1f, + 0x03, 0x44, 0x48, 0x6d, 0x07, 0x08, 0x60, 0x1e, 0x85, 0x14, 0x40, 0x1f, + 0x10, 0x30, 0x40, 0xfd, 0x02, 0x88, 0x41, 0x1f, 0x04, 0x2c, 0x40, 0xfd, + 0x01, 0x1c, 0x40, 0xfd, 0x06, 0x08, 0x67, 0x1e, 0x04, 0x12, 0x40, 0x1f, + 0x65, 0x14, 0x47, 0x1f, 0x03, 0x34, 0x40, 0xfd, 0x13, 0x28, 0x40, 0xfd, + 0x64, 0x10, 0x47, 0x1f, 0x25, 0x16, 0x46, 0x1f, 0x52, 0x08, 0x62, 0x1e, + 0x03, 0x40, 0x44, 0x6d, 0x51, 0x02, 0x41, 0x1f, 0x03, 0x0e, 0x40, 0x1f, + 0x10, 0x38, 0x62, 0x1e, 0x02, 0x28, 0x62, 0x1e, 0xa4, 0x10, 0x46, 0x1f, + 0x63, 0x0e, 0x47, 0x1f, 0x27, 0x08, 0x70, 0x1e, 0x00, 0x38, 0x71, 0x1e, + 0x41, 0x02, 0x41, 0x1f, 0x83, 0x0c, 0x46, 0x1f, 0xe0, 0x04, 0x42, 0x1f, + 0x60, 0x00, 0x46, 0x1f, 0x20, 0x2a, 0x60, 0x1e, 0xc0, 0x03, 0x5f, 0xd6, + 0xff, 0x07, 0x02, 0xeb, 0x40, 0x02, 0x00, 0x54, 0x01, 0xfe, 0xef, 0xd2, + 0x5f, 0x00, 0x01, 0xeb, 0x40, 0xfa, 0xff, 0x54, 0x1f, 0x00, 0x71, 0xf2, + 0x81, 0x01, 0x00, 0x54, 0x00, 0x28, 0x1c, 0x12, 0x01, 0xfe, 0x8f, 0x52, + 0x1f, 0x00, 0x01, 0x6b, 0x00, 0x01, 0x00, 0x54, 0x00, 0x66, 0xe8, 0xd2, + 0x01, 0x00, 0x67, 0x9e, 0x02, 0x98, 0xff, 0xd2, 0x00, 0x08, 0x61, 0x1e, + 0x00, 0x00, 0x66, 0x9e, 0x02, 0x00, 0x02, 0x8b, 0xa2, 0xff, 0xff, 0x17, + 0x9b, 0xfd, 0xff, 0x17, 0x20, 0x00, 0x80, 0x52, 0x91, 0xfd, 0xff, 0x17, + 0x00, 0xe4, 0x00, 0x2f, 0xc0, 0x03, 0x5f, 0xd6, 0xfd, 0x7b, 0xbe, 0xa9, + 0xfd, 0x03, 0x00, 0x91, 0xe8, 0x0f, 0x00, 0xfd, 0x08, 0x40, 0x20, 0x1e, + 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0x2a, 0x6c, 0x00, 0x00, 0x94, + 0x00, 0x41, 0x20, 0x1e, 0xe8, 0x0f, 0x40, 0xfd, 0x13, 0x00, 0x00, 0xb9, + 0xf3, 0x0b, 0x40, 0xf9, 0xfd, 0x7b, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x21, 0x1e, 0x1f, 0x00, 0x00, 0x71, + 0x40, 0x04, 0x80, 0x52, 0x21, 0x1c, 0x20, 0x1e, 0x20, 0x08, 0x20, 0x1e, + 0xed, 0xff, 0xff, 0x17, 0x00, 0x66, 0x00, 0x0f, 0xf9, 0xff, 0xff, 0x17, + 0x01, 0x44, 0xa3, 0x52, 0x20, 0x00, 0x27, 0x1e, 0xf6, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x03, 0x0f, 0xf3, 0xff, 0xff, 0x17, + 0x1f, 0x00, 0x00, 0x71, 0x01, 0x10, 0x3e, 0x1e, 0x00, 0x10, 0x2e, 0x1e, + 0x02, 0x04, 0x00, 0x0f, 0x40, 0x04, 0x80, 0x52, 0x20, 0x1c, 0x20, 0x1e, + 0x00, 0x18, 0x22, 0x1e, 0xdd, 0xff, 0xff, 0x17, 0x00, 0x20, 0x20, 0x1e, + 0x00, 0x38, 0x20, 0x1e, 0x00, 0x18, 0x20, 0x1e, 0x66, 0x00, 0x00, 0x54, + 0x20, 0x04, 0x80, 0x52, 0xd7, 0xff, 0xff, 0x17, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x26, 0x1e, 0x00, 0xf0, 0xa7, 0x52, + 0x01, 0x40, 0x20, 0x1e, 0x3f, 0x00, 0x00, 0x6b, 0x00, 0x04, 0x00, 0x54, + 0x22, 0x00, 0x60, 0x51, 0x00, 0x20, 0xb0, 0x12, 0x5f, 0x00, 0x00, 0x6b, + 0xc8, 0x03, 0x00, 0x54, 0xa0, 0x19, 0xb8, 0x52, 0x20, 0x00, 0x00, 0x0b, + 0x04, 0x20, 0x09, 0x12, 0x82, 0x00, 0x00, 0x90, 0x03, 0x58, 0x53, 0xd3, + 0x42, 0xc0, 0x20, 0x91, 0x21, 0x00, 0x04, 0x4b, 0x20, 0x00, 0x27, 0x1e, + 0x63, 0xec, 0x7c, 0xd3, 0x02, 0x10, 0x7e, 0x1e, 0x00, 0xc0, 0x22, 0x1e, + 0x00, 0x7c, 0x17, 0x13, 0x41, 0x00, 0x03, 0x8b, 0x44, 0x68, 0x63, 0xfc, + 0x03, 0x00, 0x62, 0x1e, 0x45, 0x04, 0x51, 0x6d, 0x80, 0x08, 0x40, 0x1f, + 0x22, 0x04, 0x40, 0xfd, 0x46, 0x10, 0x50, 0x6d, 0x63, 0x08, 0x46, 0x1f, + 0xa1, 0x04, 0x40, 0x1f, 0x02, 0x08, 0x60, 0x1e, 0x81, 0x04, 0x42, 0x1f, + 0x00, 0x28, 0x63, 0x1e, 0x40, 0x00, 0x41, 0x1f, 0x00, 0x40, 0x62, 0x1e, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x04, 0x00, 0x0f, 0xc0, 0x03, 0x5f, 0xd6, + 0xff, 0x07, 0x01, 0x6b, 0x20, 0x78, 0x1f, 0x53, 0xe0, 0x01, 0x00, 0x54, + 0x02, 0xf0, 0xaf, 0x52, 0x3f, 0x00, 0x02, 0x6b, 0x00, 0xff, 0xff, 0x54, + 0x3f, 0x00, 0x00, 0x71, 0x01, 0x20, 0xa0, 0x12, 0x02, 0xa0, 0x41, 0x7a, + 0xe8, 0x00, 0x00, 0x54, 0x60, 0x65, 0x02, 0x0f, 0x01, 0x90, 0xbe, 0x52, + 0x21, 0x08, 0x20, 0x1e, 0x20, 0x00, 0x26, 0x1e, 0x01, 0x00, 0x01, 0x0b, + 0xd4, 0xff, 0xff, 0x17, 0xc2, 0xff, 0xff, 0x17, 0x20, 0x00, 0x80, 0x52, + 0xb8, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0xff, 0xef, 0xd2, 0x00, 0x00, 0x67, 0x9e, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x03, 0x00, 0xaa, + 0x03, 0x00, 0x80, 0xd2, 0x02, 0x00, 0x80, 0xd2, 0x00, 0x00, 0x80, 0x52, + 0x7e, 0x03, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xf0, + 0x00, 0x38, 0x47, 0xf9, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbe, 0xa9, 0x01, 0x00, 0x80, 0xd2, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x0b, 0x00, 0xf9, 0xf3, 0x03, 0x00, 0x2a, 0x97, 0x03, 0x00, 0x94, + 0x80, 0x00, 0x00, 0x90, 0x00, 0xb0, 0x44, 0xf9, 0x01, 0x2c, 0x40, 0xf9, + 0x41, 0x00, 0x00, 0xb4, 0x20, 0x00, 0x3f, 0xd6, 0xe0, 0x03, 0x13, 0x2a, + 0x3a, 0xb4, 0xff, 0x97, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbe, 0xa9, + 0x81, 0x00, 0x00, 0x90, 0x80, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, + 0xf3, 0x53, 0x01, 0xa9, 0x33, 0xa8, 0x44, 0xf9, 0x14, 0xac, 0x44, 0xf9, + 0x73, 0x02, 0x14, 0xcb, 0xff, 0x0f, 0x93, 0xeb, 0xe0, 0x00, 0x00, 0x54, + 0x73, 0xfe, 0x43, 0x93, 0x1f, 0x20, 0x03, 0xd5, 0x73, 0x06, 0x00, 0xd1, + 0x80, 0x7a, 0x73, 0xf8, 0x00, 0x00, 0x3f, 0xd6, 0xb3, 0xff, 0xff, 0xb5, + 0xf3, 0x53, 0x41, 0xa9, 0xfd, 0x7b, 0xc2, 0xa8, 0xbf, 0x03, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xbd, 0xa9, 0x81, 0x00, 0x00, 0x90, + 0x80, 0x00, 0x00, 0x90, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0x34, 0xb4, 0x44, 0xf9, 0xf5, 0x13, 0x00, 0xf9, 0x15, 0xb8, 0x44, 0xf9, + 0x94, 0x02, 0x15, 0xcb, 0xff, 0x0f, 0x94, 0xeb, 0x20, 0x01, 0x00, 0x54, + 0x94, 0xfe, 0x43, 0x93, 0x13, 0x00, 0x80, 0xd2, 0x1f, 0x20, 0x03, 0xd5, + 0xa0, 0x7a, 0x73, 0xf8, 0x73, 0x06, 0x00, 0x91, 0x00, 0x00, 0x3f, 0xd6, + 0x9f, 0x02, 0x13, 0xeb, 0x81, 0xff, 0xff, 0x54, 0x46, 0xf1, 0xfe, 0x97, + 0x81, 0x00, 0x00, 0x90, 0x80, 0x00, 0x00, 0x90, 0x34, 0xbc, 0x44, 0xf9, + 0x15, 0xc0, 0x44, 0xf9, 0x94, 0x02, 0x15, 0xcb, 0xff, 0x0f, 0x94, 0xeb, + 0x94, 0xfe, 0x43, 0x93, 0x00, 0x01, 0x00, 0x54, 0x13, 0x00, 0x80, 0xd2, + 0x1f, 0x20, 0x03, 0xd5, 0xa0, 0x7a, 0x73, 0xf8, 0x73, 0x06, 0x00, 0x91, + 0x00, 0x00, 0x3f, 0xd6, 0x9f, 0x02, 0x13, 0xeb, 0x81, 0xff, 0xff, 0x54, + 0xf3, 0x53, 0x41, 0xa9, 0xf5, 0x13, 0x40, 0xf9, 0xfd, 0x7b, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x80, 0xf9, + 0x24, 0x00, 0x02, 0x8b, 0x05, 0x00, 0x02, 0x8b, 0x5f, 0x40, 0x00, 0xf1, + 0x09, 0x02, 0x00, 0x54, 0x5f, 0x80, 0x01, 0xf1, 0x48, 0x06, 0x00, 0x54, + 0x49, 0x04, 0x00, 0xd1, 0x26, 0x1c, 0x40, 0xa9, 0x69, 0x04, 0x30, 0x37, + 0x8c, 0x34, 0x7f, 0xa9, 0xa9, 0x00, 0x28, 0x36, 0x28, 0x24, 0x41, 0xa9, + 0x8a, 0x2c, 0x7e, 0xa9, 0x08, 0x24, 0x01, 0xa9, 0xaa, 0x2c, 0x3e, 0xa9, + 0x06, 0x1c, 0x00, 0xa9, 0xac, 0x34, 0x3f, 0xa9, 0xc0, 0x03, 0x5f, 0xd6, + 0x1f, 0x20, 0x03, 0xd5, 0x5f, 0x20, 0x00, 0xf1, 0xe3, 0x00, 0x00, 0x54, + 0x26, 0x00, 0x40, 0xf9, 0x87, 0x80, 0x5f, 0xf8, 0x06, 0x00, 0x00, 0xf9, + 0xa7, 0x80, 0x1f, 0xf8, 0xc0, 0x03, 0x5f, 0xd6, 0x1f, 0x20, 0x03, 0xd5, + 0xc2, 0x00, 0x10, 0x36, 0x26, 0x00, 0x40, 0xb9, 0x87, 0xc0, 0x5f, 0xb8, + 0x06, 0x00, 0x00, 0xb9, 0xa7, 0xc0, 0x1f, 0xb8, 0xc0, 0x03, 0x5f, 0xd6, + 0x02, 0x01, 0x00, 0xb4, 0x49, 0xfc, 0x41, 0xd3, 0x26, 0x00, 0x40, 0x39, + 0x87, 0xf0, 0x5f, 0x38, 0x28, 0x68, 0x69, 0x38, 0x06, 0x00, 0x00, 0x39, + 0x08, 0x68, 0x29, 0x38, 0xa7, 0xf0, 0x1f, 0x38, 0xc0, 0x03, 0x5f, 0xd6, + 0x1f, 0x20, 0x03, 0xd5, 0x28, 0x24, 0x41, 0xa9, 0x2a, 0x2c, 0x42, 0xa9, + 0x2c, 0x34, 0x43, 0xa9, 0x81, 0x08, 0x7e, 0xa9, 0x84, 0x0c, 0x7f, 0xa9, + 0x06, 0x1c, 0x00, 0xa9, 0x08, 0x24, 0x01, 0xa9, 0x0a, 0x2c, 0x02, 0xa9, + 0x0c, 0x34, 0x03, 0xa9, 0xa1, 0x08, 0x3e, 0xa9, 0xa4, 0x0c, 0x3f, 0xa9, + 0xc0, 0x03, 0x5f, 0xd6, 0x09, 0x0c, 0x40, 0x92, 0x03, 0xec, 0x7c, 0x92, + 0x2c, 0x34, 0x40, 0xa9, 0x21, 0x00, 0x09, 0xcb, 0x42, 0x00, 0x09, 0x8b, + 0x26, 0x1c, 0x41, 0xa9, 0x0c, 0x34, 0x00, 0xa9, 0x28, 0x24, 0x42, 0xa9, + 0x2a, 0x2c, 0x43, 0xa9, 0x2c, 0x34, 0xc4, 0xa9, 0x42, 0x40, 0x02, 0xf1, + 0x69, 0x01, 0x00, 0x54, 0x66, 0x1c, 0x01, 0xa9, 0x26, 0x1c, 0x41, 0xa9, + 0x68, 0x24, 0x02, 0xa9, 0x28, 0x24, 0x42, 0xa9, 0x6a, 0x2c, 0x03, 0xa9, + 0x2a, 0x2c, 0x43, 0xa9, 0x6c, 0x34, 0x84, 0xa9, 0x2c, 0x34, 0xc4, 0xa9, + 0x42, 0x00, 0x01, 0xf1, 0xe8, 0xfe, 0xff, 0x54, 0x81, 0x08, 0x7c, 0xa9, + 0x66, 0x1c, 0x01, 0xa9, 0x86, 0x1c, 0x7d, 0xa9, 0x68, 0x24, 0x02, 0xa9, + 0x88, 0x24, 0x7e, 0xa9, 0x6a, 0x2c, 0x03, 0xa9, 0x8a, 0x2c, 0x7f, 0xa9, + 0x6c, 0x34, 0x04, 0xa9, 0xa1, 0x08, 0x3c, 0xa9, 0xa6, 0x1c, 0x3d, 0xa9, + 0xa8, 0x24, 0x3e, 0xa9, 0xaa, 0x2c, 0x3f, 0xa9, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0c, 0x01, 0x4e, + 0x04, 0x00, 0x02, 0x8b, 0x5f, 0x80, 0x01, 0xf1, 0xc8, 0x03, 0x00, 0x54, + 0x5f, 0x40, 0x00, 0xf1, 0x02, 0x02, 0x00, 0x54, 0x01, 0x3c, 0x08, 0x4e, + 0xa2, 0x00, 0x18, 0x36, 0x01, 0x00, 0x00, 0xf9, 0x81, 0x80, 0x1f, 0xf8, + 0xc0, 0x03, 0x5f, 0xd6, 0x1f, 0x20, 0x03, 0xd5, 0x82, 0x00, 0x10, 0x36, + 0x01, 0x00, 0x00, 0xb9, 0x81, 0xc0, 0x1f, 0xb8, 0xc0, 0x03, 0x5f, 0xd6, + 0x82, 0x00, 0x00, 0xb4, 0x01, 0x00, 0x00, 0x39, 0x42, 0x00, 0x08, 0x36, + 0x81, 0xe0, 0x1f, 0x78, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x80, 0x3d, + 0xc2, 0x00, 0x30, 0x37, 0x80, 0x00, 0x9f, 0x3c, 0x62, 0x00, 0x28, 0x36, + 0x00, 0x04, 0x80, 0x3d, 0x80, 0x00, 0x9e, 0x3c, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x04, 0x80, 0x3d, 0x00, 0x00, 0x01, 0xad, 0x80, 0x00, 0x3f, 0xad, + 0xc0, 0x03, 0x5f, 0xd6, 0x1f, 0x20, 0x03, 0xd5, 0x21, 0x1c, 0x00, 0x12, + 0x03, 0xec, 0x7c, 0x92, 0x00, 0x00, 0x80, 0x3d, 0x5f, 0x00, 0x04, 0xf1, + 0x20, 0x28, 0x40, 0x7a, 0x80, 0x01, 0x00, 0x54, 0x82, 0x00, 0x03, 0xcb, + 0x63, 0x40, 0x00, 0xd1, 0x42, 0x40, 0x01, 0xd1, 0x60, 0x00, 0x01, 0xad, + 0x60, 0x00, 0x82, 0xad, 0x42, 0x00, 0x01, 0xf1, 0xa8, 0xff, 0xff, 0x54, + 0x80, 0x00, 0x3e, 0xad, 0x80, 0x00, 0x3f, 0xad, 0xc0, 0x03, 0x5f, 0xd6, + 0x1f, 0x20, 0x03, 0xd5, 0xe5, 0x00, 0x3b, 0xd5, 0x85, 0xfe, 0x27, 0x37, + 0xa5, 0x0c, 0x00, 0x12, 0xbf, 0x10, 0x00, 0x71, 0x81, 0x02, 0x00, 0x54, + 0x60, 0x04, 0x80, 0x3d, 0x60, 0x00, 0x01, 0xad, 0x63, 0xe4, 0x7a, 0x92, + 0x60, 0x00, 0x02, 0xad, 0x60, 0x00, 0x03, 0xad, 0x82, 0x00, 0x03, 0xcb, + 0x42, 0x00, 0x04, 0xd1, 0x63, 0x00, 0x02, 0x91, 0x1f, 0x20, 0x03, 0xd5, + 0x23, 0x74, 0x0b, 0xd5, 0x63, 0x00, 0x01, 0x91, 0x42, 0x00, 0x01, 0xf1, + 0xa8, 0xff, 0xff, 0x54, 0x60, 0x00, 0x00, 0xad, 0x60, 0x00, 0x01, 0xad, + 0x80, 0x00, 0x3e, 0xad, 0x80, 0x00, 0x3f, 0xad, 0xc0, 0x03, 0x5f, 0xd6, + 0x1f, 0x20, 0x03, 0xd5, 0xbf, 0x14, 0x00, 0x71, 0x41, 0x02, 0x00, 0x54, + 0x60, 0x04, 0x80, 0x3d, 0x60, 0x00, 0x01, 0xad, 0x60, 0x00, 0x02, 0xad, + 0x60, 0x00, 0x03, 0xad, 0x63, 0xe0, 0x79, 0x92, 0x82, 0x00, 0x03, 0xcb, + 0x42, 0x00, 0x04, 0xd1, 0x63, 0x00, 0x02, 0x91, 0x23, 0x74, 0x0b, 0xd5, + 0x63, 0x00, 0x02, 0x91, 0x42, 0x00, 0x02, 0xf1, 0xa8, 0xff, 0xff, 0x54, + 0x80, 0x00, 0x3c, 0xad, 0x80, 0x00, 0x3d, 0xad, 0x80, 0x00, 0x3e, 0xad, + 0x80, 0x00, 0x3f, 0xad, 0xc0, 0x03, 0x5f, 0xd6, 0x86, 0x00, 0x80, 0x52, + 0xc7, 0x20, 0xc5, 0x1a, 0xe5, 0x00, 0x01, 0x91, 0x5f, 0x00, 0x05, 0xeb, + 0xc3, 0xf8, 0xff, 0x54, 0xe6, 0x04, 0x00, 0xd1, 0x65, 0x00, 0x07, 0x8b, + 0x63, 0x40, 0x00, 0x91, 0xa2, 0x00, 0x03, 0xeb, 0xa5, 0x00, 0x26, 0x8a, + 0xa0, 0x00, 0x00, 0x54, 0x60, 0x00, 0x82, 0xac, 0x60, 0x00, 0x3f, 0xad, + 0x42, 0x00, 0x01, 0xf1, 0xa8, 0xff, 0xff, 0x54, 0xe3, 0x03, 0x05, 0xaa, + 0x82, 0x00, 0x05, 0xcb, 0x42, 0x00, 0x07, 0xeb, 0xa3, 0x00, 0x00, 0x54, + 0x23, 0x74, 0x0b, 0xd5, 0x63, 0x00, 0x07, 0x8b, 0x42, 0x00, 0x07, 0xeb, + 0xa2, 0xff, 0xff, 0x54, 0x42, 0x00, 0x07, 0x8b, 0x63, 0x80, 0x00, 0xd1, + 0xb6, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x7b, 0xaf, 0xa9, + 0x5f, 0x20, 0x00, 0xf1, 0xfd, 0x03, 0x00, 0x91, 0xf3, 0x53, 0x01, 0xa9, + 0xf3, 0x03, 0x00, 0xaa, 0x00, 0x00, 0x02, 0xaa, 0xf5, 0x5b, 0x02, 0xa9, + 0xf4, 0x03, 0x03, 0xaa, 0xf5, 0x07, 0x9f, 0x1a, 0xf7, 0x63, 0x03, 0xa9, + 0x1f, 0x08, 0x40, 0xf2, 0xf8, 0x03, 0x02, 0xaa, 0xf9, 0x6b, 0x04, 0xa9, + 0xfb, 0x73, 0x05, 0xa9, 0x40, 0x00, 0x00, 0x54, 0x55, 0x00, 0x80, 0x52, + 0x17, 0x7f, 0x40, 0x93, 0xf8, 0x67, 0x00, 0xb9, 0xff, 0x47, 0x00, 0xf9, + 0xf7, 0xfe, 0x43, 0xd3, 0x60, 0x02, 0x18, 0x8b, 0xe0, 0x3b, 0x00, 0xf9, + 0x20, 0x4c, 0x18, 0x9b, 0x3f, 0x18, 0x00, 0xf1, 0xe0, 0x3f, 0x00, 0xf9, + 0x09, 0x11, 0x00, 0x54, 0x23, 0xfc, 0x41, 0xd3, 0x22, 0x04, 0x00, 0xd1, + 0x3f, 0x1c, 0x00, 0xf1, 0x7a, 0x4c, 0x18, 0x9b, 0x5c, 0x4c, 0x18, 0x9b, + 0xc0, 0x01, 0x00, 0x54, 0x3f, 0xa0, 0x00, 0xf1, 0xf9, 0x03, 0x1c, 0xaa, + 0xf6, 0x03, 0x13, 0xaa, 0x48, 0x35, 0x00, 0x54, 0xe1, 0x03, 0x1a, 0xaa, + 0xe0, 0x03, 0x16, 0xaa, 0x80, 0x02, 0x3f, 0xd6, 0xe1, 0x03, 0x19, 0xaa, + 0x80, 0x33, 0xf8, 0x37, 0xe0, 0x03, 0x1a, 0xaa, 0x80, 0x02, 0x3f, 0xd6, + 0x1f, 0x00, 0x00, 0x71, 0xad, 0x04, 0x00, 0x54, 0x55, 0x05, 0x00, 0x35, + 0x41, 0x03, 0x40, 0xf9, 0x60, 0x02, 0x40, 0xf9, 0x61, 0x02, 0x00, 0xf9, + 0x40, 0x03, 0x00, 0xf9, 0xe0, 0x3b, 0x40, 0xf9, 0x1f, 0x00, 0x1c, 0xeb, + 0x68, 0x06, 0x00, 0x54, 0xfa, 0x03, 0x00, 0xaa, 0xfb, 0x03, 0x1c, 0xaa, + 0xf6, 0x03, 0x18, 0xcb, 0x19, 0x00, 0x80, 0x52, 0xe0, 0x43, 0x00, 0xf9, + 0xe1, 0x03, 0x13, 0xaa, 0xe0, 0x03, 0x1a, 0xaa, 0x80, 0x02, 0x3f, 0xd6, + 0xfa, 0x37, 0x00, 0xf9, 0x1f, 0x00, 0x00, 0x71, 0x2d, 0x21, 0x00, 0x54, + 0x5f, 0x03, 0x1c, 0xeb, 0xe8, 0x17, 0x00, 0x54, 0xe1, 0x03, 0x13, 0xaa, + 0xe0, 0x03, 0x1c, 0xaa, 0x80, 0x02, 0x3f, 0xd6, 0x1f, 0x00, 0x00, 0x71, + 0xcb, 0x15, 0x00, 0x54, 0x01, 0x01, 0x00, 0x54, 0xd5, 0x11, 0x00, 0x35, + 0x61, 0x03, 0x40, 0xf9, 0x80, 0x03, 0x40, 0xf9, 0x81, 0x03, 0x00, 0xf9, + 0x60, 0x03, 0x00, 0xf9, 0x7b, 0x03, 0x16, 0x8b, 0x39, 0x00, 0x80, 0x52, + 0x9c, 0x03, 0x16, 0x8b, 0xf0, 0xff, 0xff, 0x17, 0xe1, 0x03, 0x19, 0xaa, + 0xe0, 0x03, 0x16, 0xaa, 0x80, 0x02, 0x3f, 0xd6, 0x1f, 0x00, 0x00, 0x71, + 0xda, 0xb2, 0x99, 0x9a, 0x15, 0xfb, 0xff, 0x34, 0xe1, 0x67, 0x80, 0xb9, + 0xbf, 0x06, 0x00, 0x71, 0x00, 0x00, 0x80, 0xd2, 0x40, 0x27, 0x00, 0x54, + 0x1f, 0x20, 0x03, 0xd5, 0x45, 0x6b, 0x60, 0x38, 0x21, 0x04, 0x00, 0xd1, + 0x64, 0x6a, 0x60, 0x38, 0x3f, 0x00, 0x00, 0xf1, 0x65, 0x6a, 0x20, 0x38, + 0x44, 0x6b, 0x20, 0x38, 0x00, 0x04, 0x00, 0x91, 0x2c, 0xff, 0xff, 0x54, + 0xe0, 0x3b, 0x40, 0xf9, 0x1f, 0x00, 0x1c, 0xeb, 0xe9, 0xf9, 0xff, 0x54, + 0xe1, 0x03, 0x47, 0xa9, 0xf6, 0x03, 0x18, 0xcb, 0x1f, 0x00, 0x01, 0xeb, + 0xe9, 0x04, 0x00, 0x54, 0xe0, 0x3b, 0x40, 0xf9, 0x7f, 0x02, 0x00, 0xeb, + 0xe2, 0x03, 0x00, 0x54, 0xf9, 0x03, 0x00, 0xaa, 0x07, 0x00, 0x00, 0x14, + 0x21, 0x03, 0x40, 0xf9, 0x20, 0x6b, 0x78, 0xf8, 0x21, 0x6b, 0x38, 0xf8, + 0x20, 0x03, 0x00, 0xf9, 0x3f, 0x03, 0x13, 0xeb, 0xe9, 0x02, 0x00, 0x54, + 0xfc, 0x03, 0x19, 0xaa, 0x39, 0x03, 0x16, 0x8b, 0xe1, 0x03, 0x1c, 0xaa, + 0xe0, 0x03, 0x19, 0xaa, 0x80, 0x02, 0x3f, 0xd6, 0x1f, 0x00, 0x00, 0x71, + 0x0d, 0x02, 0x00, 0x54, 0x75, 0xfe, 0xff, 0x34, 0xe1, 0x67, 0x80, 0xb9, + 0xbf, 0x06, 0x00, 0x71, 0x00, 0x00, 0x80, 0xd2, 0xa0, 0x1a, 0x00, 0x54, + 0x23, 0x6b, 0x60, 0x38, 0x21, 0x04, 0x00, 0xd1, 0x82, 0x6b, 0x60, 0x38, + 0x3f, 0x00, 0x00, 0xf1, 0x83, 0x6b, 0x20, 0x38, 0x22, 0x6b, 0x20, 0x38, + 0x00, 0x04, 0x00, 0x91, 0x2c, 0xff, 0xff, 0x54, 0x3f, 0x03, 0x13, 0xeb, + 0x68, 0xfd, 0xff, 0x54, 0xe0, 0x07, 0x47, 0xa9, 0x00, 0x00, 0x18, 0x8b, + 0xe0, 0x3b, 0x00, 0xf9, 0x3f, 0x00, 0x00, 0xeb, 0x68, 0xfb, 0xff, 0x54, + 0xe0, 0x47, 0x40, 0xf9, 0xa0, 0x07, 0x00, 0xb4, 0xe0, 0x47, 0x40, 0xf9, + 0xe1, 0x43, 0x02, 0x91, 0x00, 0x04, 0x00, 0xd1, 0xe0, 0x47, 0x00, 0xf9, + 0x00, 0xec, 0x7c, 0xd3, 0x33, 0x68, 0x60, 0xf8, 0xe1, 0x63, 0x02, 0x91, + 0x21, 0x68, 0x60, 0xf8, 0x60, 0x02, 0x18, 0x8b, 0xe0, 0x3b, 0x00, 0xf9, + 0x3f, 0x18, 0x00, 0xf1, 0x20, 0x4c, 0x18, 0x9b, 0xe0, 0x3f, 0x00, 0xf9, + 0x48, 0xef, 0xff, 0x54, 0x61, 0x02, 0x18, 0x8b, 0xf6, 0x03, 0x18, 0xcb, + 0x1f, 0x00, 0x01, 0xeb, 0xa9, 0xfd, 0xff, 0x54, 0x1f, 0x20, 0x03, 0xd5, + 0xe0, 0x3b, 0x40, 0xf9, 0x7f, 0x02, 0x00, 0xeb, 0x02, 0x04, 0x00, 0x54, + 0xf9, 0x03, 0x00, 0xaa, 0x07, 0x00, 0x00, 0x14, 0x21, 0x03, 0x40, 0xf9, + 0x20, 0x6b, 0x78, 0xf8, 0x21, 0x6b, 0x38, 0xf8, 0x20, 0x03, 0x00, 0xf9, + 0x3f, 0x03, 0x13, 0xeb, 0x09, 0x03, 0x00, 0x54, 0xfc, 0x03, 0x19, 0xaa, + 0x39, 0x03, 0x16, 0x8b, 0xe1, 0x03, 0x1c, 0xaa, 0xe0, 0x03, 0x19, 0xaa, + 0x80, 0x02, 0x3f, 0xd6, 0x1f, 0x00, 0x00, 0x71, 0x2d, 0x02, 0x00, 0x54, + 0x75, 0xfe, 0xff, 0x34, 0xe1, 0x67, 0x80, 0xb9, 0xbf, 0x06, 0x00, 0x71, + 0x00, 0x00, 0x80, 0xd2, 0x60, 0x15, 0x00, 0x54, 0x1f, 0x20, 0x03, 0xd5, + 0x23, 0x6b, 0x60, 0x38, 0x21, 0x04, 0x00, 0xd1, 0x82, 0x6b, 0x60, 0x38, + 0x3f, 0x00, 0x00, 0xf1, 0x83, 0x6b, 0x20, 0x38, 0x22, 0x6b, 0x20, 0x38, + 0x00, 0x04, 0x00, 0x91, 0x2c, 0xff, 0xff, 0x54, 0x3f, 0x03, 0x13, 0xeb, + 0x48, 0xfd, 0xff, 0x54, 0xe0, 0x07, 0x47, 0xa9, 0x00, 0x00, 0x18, 0x8b, + 0xe0, 0x3b, 0x00, 0xf9, 0x3f, 0x00, 0x00, 0xeb, 0x48, 0xfb, 0xff, 0x54, + 0xe0, 0x47, 0x40, 0xf9, 0xa0, 0xf8, 0xff, 0xb5, 0xf3, 0x53, 0x41, 0xa9, + 0xf5, 0x5b, 0x42, 0xa9, 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, + 0xfb, 0x73, 0x45, 0xa9, 0xfd, 0x7b, 0xd1, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xe1, 0x67, 0x80, 0xb9, 0xbf, 0x06, 0x00, 0x71, 0x00, 0x00, 0x80, 0xd2, + 0x40, 0x01, 0x00, 0x54, 0x66, 0x6b, 0x60, 0x38, 0x21, 0x04, 0x00, 0xd1, + 0x85, 0x6b, 0x60, 0x38, 0x3f, 0x00, 0x00, 0xf1, 0x86, 0x6b, 0x20, 0x38, + 0x65, 0x6b, 0x20, 0x38, 0x00, 0x04, 0x00, 0x91, 0x2c, 0xff, 0xff, 0x54, + 0x6b, 0xff, 0xff, 0x17, 0x65, 0x7b, 0x60, 0xf8, 0x81, 0x7b, 0x60, 0xf8, + 0x85, 0x7b, 0x20, 0xf8, 0x61, 0x7b, 0x20, 0xf8, 0x00, 0x04, 0x00, 0x91, + 0xe1, 0x02, 0x00, 0xcb, 0x3f, 0x00, 0x00, 0xf1, 0x6d, 0xec, 0xff, 0x54, + 0x65, 0x7b, 0x60, 0xf8, 0x81, 0x7b, 0x60, 0xf8, 0x85, 0x7b, 0x20, 0xf8, + 0x61, 0x7b, 0x20, 0xf8, 0x00, 0x04, 0x00, 0x91, 0xe1, 0x02, 0x00, 0xcb, + 0x3f, 0x00, 0x00, 0xf1, 0x2c, 0xfe, 0xff, 0x54, 0x5a, 0xff, 0xff, 0x17, + 0xb5, 0x06, 0x00, 0x35, 0x81, 0x03, 0x40, 0xf9, 0x40, 0x03, 0x40, 0xf9, + 0x41, 0x03, 0x00, 0xf9, 0x80, 0x03, 0x00, 0xf9, 0x9c, 0x03, 0x16, 0x8b, + 0x44, 0x03, 0x18, 0x8b, 0x39, 0x00, 0x80, 0x52, 0xe4, 0x37, 0x00, 0xf9, + 0xfa, 0x03, 0x04, 0xaa, 0x9f, 0x03, 0x04, 0xeb, 0x62, 0xe7, 0xff, 0x54, + 0xf9, 0xec, 0xff, 0x34, 0xe0, 0x3f, 0x40, 0xf9, 0xe1, 0x37, 0x40, 0xf9, + 0x04, 0x00, 0x1b, 0xcb, 0xe0, 0x43, 0x40, 0xf9, 0x82, 0x00, 0x18, 0xcb, + 0x26, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x13, 0xcb, 0x61, 0x03, 0x1c, 0xcb, + 0x1f, 0x00, 0x06, 0xeb, 0x00, 0xd0, 0x86, 0x9a, 0x5f, 0x00, 0x01, 0xeb, + 0x42, 0x90, 0x81, 0x9a, 0x00, 0x13, 0x00, 0xb5, 0x62, 0x1e, 0x00, 0xb5, + 0xe0, 0x3f, 0x40, 0xf9, 0xf6, 0x03, 0x06, 0xaa, 0xdf, 0x00, 0x01, 0xeb, + 0x00, 0x00, 0x01, 0xcb, 0xc2, 0x00, 0x00, 0x54, 0xe2, 0x03, 0x13, 0xaa, + 0xf6, 0x03, 0x01, 0xaa, 0xf3, 0x03, 0x00, 0xaa, 0xe1, 0x03, 0x06, 0xaa, + 0xe0, 0x03, 0x02, 0xaa, 0x3f, 0x00, 0x18, 0xeb, 0xc9, 0x0b, 0x00, 0x54, + 0xe3, 0x47, 0x40, 0xf9, 0x7f, 0x1c, 0x00, 0xf1, 0x88, 0x1b, 0x00, 0x54, + 0x62, 0xec, 0x7c, 0xd3, 0xe4, 0x43, 0x02, 0x91, 0xd6, 0x0a, 0xd8, 0x9a, + 0x63, 0x04, 0x00, 0x91, 0xe3, 0x47, 0x00, 0xf9, 0x21, 0x08, 0xd8, 0x9a, + 0x93, 0x68, 0x22, 0xf8, 0xf3, 0x03, 0x00, 0xaa, 0xe0, 0x63, 0x02, 0x91, + 0x16, 0x68, 0x22, 0xf8, 0xec, 0xfe, 0xff, 0x17, 0xe1, 0x67, 0x80, 0xb9, + 0xbf, 0x06, 0x00, 0x71, 0x00, 0x00, 0x80, 0xd2, 0x60, 0x01, 0x00, 0x54, + 0x1f, 0x20, 0x03, 0xd5, 0x86, 0x6b, 0x60, 0x38, 0x21, 0x04, 0x00, 0xd1, + 0x45, 0x6b, 0x60, 0x38, 0x3f, 0x00, 0x00, 0xf1, 0x46, 0x6b, 0x20, 0x38, + 0x85, 0x6b, 0x20, 0x38, 0x00, 0x04, 0x00, 0x91, 0x2c, 0xff, 0xff, 0x54, + 0xc3, 0xff, 0xff, 0x17, 0x85, 0x7b, 0x60, 0xf8, 0x41, 0x7b, 0x60, 0xf8, + 0x45, 0x7b, 0x20, 0xf8, 0x81, 0x7b, 0x20, 0xf8, 0x00, 0x04, 0x00, 0x91, + 0xe1, 0x02, 0x00, 0xcb, 0x3f, 0x00, 0x00, 0xf1, 0x6d, 0xf7, 0xff, 0x54, + 0x85, 0x7b, 0x60, 0xf8, 0x41, 0x7b, 0x60, 0xf8, 0x45, 0x7b, 0x20, 0xf8, + 0x81, 0x7b, 0x20, 0xf8, 0x00, 0x04, 0x00, 0x91, 0xe1, 0x02, 0x00, 0xcb, + 0x3f, 0x00, 0x00, 0xf1, 0x2c, 0xfe, 0xff, 0x54, 0xb2, 0xff, 0xff, 0x17, + 0x61, 0x01, 0x00, 0x54, 0x75, 0x06, 0x00, 0x35, 0xe2, 0x43, 0x40, 0xf9, + 0x41, 0x03, 0x40, 0xf9, 0x40, 0x00, 0x40, 0xf9, 0x41, 0x00, 0x00, 0xf9, + 0x40, 0x03, 0x00, 0xf9, 0xe0, 0x43, 0x40, 0xf9, 0x39, 0x00, 0x80, 0x52, + 0x00, 0x00, 0x18, 0x8b, 0xe0, 0x43, 0x00, 0xf9, 0x44, 0x03, 0x18, 0x8b, + 0xe4, 0x37, 0x00, 0xf9, 0xa8, 0xff, 0xff, 0x17, 0x22, 0x7b, 0x60, 0xf8, + 0x81, 0x7b, 0x60, 0xf8, 0x82, 0x7b, 0x20, 0xf8, 0x21, 0x7b, 0x20, 0xf8, + 0x00, 0x04, 0x00, 0x91, 0xe1, 0x02, 0x00, 0xcb, 0x3f, 0x00, 0x00, 0xf1, + 0xed, 0xe2, 0xff, 0x54, 0x22, 0x7b, 0x60, 0xf8, 0x81, 0x7b, 0x60, 0xf8, + 0x82, 0x7b, 0x20, 0xf8, 0x21, 0x7b, 0x20, 0xf8, 0x00, 0x04, 0x00, 0x91, + 0xe1, 0x02, 0x00, 0xcb, 0x3f, 0x00, 0x00, 0xf1, 0x2c, 0xfe, 0xff, 0x54, + 0x0e, 0xff, 0xff, 0x17, 0x22, 0x7b, 0x60, 0xf8, 0x81, 0x7b, 0x60, 0xf8, + 0x82, 0x7b, 0x20, 0xf8, 0x21, 0x7b, 0x20, 0xf8, 0x00, 0x04, 0x00, 0x91, + 0xe1, 0x02, 0x00, 0xcb, 0x3f, 0x00, 0x00, 0xf1, 0x2d, 0xe8, 0xff, 0x54, + 0x22, 0x7b, 0x60, 0xf8, 0x81, 0x7b, 0x60, 0xf8, 0x82, 0x7b, 0x20, 0xf8, + 0x21, 0x7b, 0x20, 0xf8, 0x00, 0x04, 0x00, 0x91, 0xe1, 0x02, 0x00, 0xcb, + 0x3f, 0x00, 0x00, 0xf1, 0x2c, 0xfe, 0xff, 0x54, 0x38, 0xff, 0xff, 0x17, + 0xdf, 0x02, 0x18, 0xeb, 0x09, 0xe3, 0xff, 0x54, 0xc1, 0x0a, 0xd8, 0x9a, + 0x99, 0xfe, 0xff, 0x17, 0xe1, 0x67, 0x80, 0xb9, 0xbf, 0x06, 0x00, 0x71, + 0x00, 0x00, 0x80, 0xd2, 0x60, 0x01, 0x00, 0x54, 0xe2, 0x43, 0x40, 0xf9, + 0x21, 0x04, 0x00, 0xd1, 0x46, 0x6b, 0x60, 0x38, 0x3f, 0x00, 0x00, 0xf1, + 0x45, 0x68, 0x60, 0x38, 0x46, 0x68, 0x20, 0x38, 0x45, 0x6b, 0x20, 0x38, + 0x00, 0x04, 0x00, 0x91, 0x0c, 0xff, 0xff, 0x54, 0xc6, 0xff, 0xff, 0x17, + 0xe2, 0x43, 0x40, 0xf9, 0x45, 0x7b, 0x60, 0xf8, 0x41, 0x78, 0x60, 0xf8, + 0x45, 0x78, 0x20, 0xf8, 0x41, 0x7b, 0x20, 0xf8, 0x00, 0x04, 0x00, 0x91, + 0xe1, 0x02, 0x00, 0xcb, 0x3f, 0x00, 0x00, 0xf1, 0x0c, 0xff, 0xff, 0x54, + 0xbc, 0xff, 0xff, 0x17, 0x44, 0x7b, 0x60, 0xf8, 0x61, 0x7a, 0x60, 0xf8, + 0x64, 0x7a, 0x20, 0xf8, 0x41, 0x7b, 0x20, 0xf8, 0x00, 0x04, 0x00, 0x91, + 0xe1, 0x02, 0x00, 0xcb, 0x3f, 0x00, 0x00, 0xf1, 0xed, 0xd2, 0xff, 0x54, + 0x44, 0x7b, 0x60, 0xf8, 0x61, 0x7a, 0x60, 0xf8, 0x64, 0x7a, 0x20, 0xf8, + 0x41, 0x7b, 0x20, 0xf8, 0x00, 0x04, 0x00, 0x91, 0xe1, 0x02, 0x00, 0xcb, + 0x3f, 0x00, 0x00, 0xf1, 0x2c, 0xfe, 0xff, 0x54, 0x8e, 0xfe, 0xff, 0x17, + 0xe3, 0x37, 0x40, 0xf9, 0xbf, 0x0a, 0x00, 0x71, 0x04, 0x00, 0x80, 0xd2, + 0x65, 0x00, 0x00, 0xcb, 0x00, 0x7c, 0x40, 0x93, 0xa1, 0x12, 0x00, 0x54, + 0x1f, 0x20, 0x03, 0xd5, 0xa7, 0x68, 0x64, 0x38, 0x00, 0x04, 0x00, 0xd1, + 0x63, 0x6a, 0x64, 0x38, 0x1f, 0x00, 0x00, 0xf1, 0x67, 0x6a, 0x24, 0x38, + 0xa3, 0x68, 0x24, 0x38, 0x84, 0x04, 0x00, 0x91, 0x2c, 0xff, 0xff, 0x54, + 0x62, 0xeb, 0xff, 0xb4, 0xe0, 0x3f, 0x40, 0xf9, 0x05, 0x00, 0x02, 0xcb, + 0x40, 0x7c, 0x40, 0x93, 0x02, 0x00, 0x80, 0xd2, 0x1f, 0x20, 0x03, 0xd5, + 0xe7, 0x37, 0x40, 0xf9, 0x00, 0x04, 0x00, 0xd1, 0xa4, 0x68, 0x62, 0x38, + 0x1f, 0x00, 0x00, 0xf1, 0xe3, 0x68, 0x62, 0x38, 0xe4, 0x68, 0x22, 0x38, + 0xa3, 0x68, 0x22, 0x38, 0x42, 0x04, 0x00, 0x91, 0x0c, 0xff, 0xff, 0x54, + 0x4c, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x1a, 0xaa, 0x80, 0x02, 0x3f, 0xd6, + 0xe0, 0xcc, 0xff, 0x37, 0xe1, 0x03, 0x19, 0xaa, 0xe0, 0x03, 0x16, 0xaa, + 0x80, 0x02, 0x3f, 0xd6, 0x1f, 0x00, 0x00, 0x71, 0x3a, 0xb3, 0x96, 0x9a, + 0x61, 0xfe, 0xff, 0x17, 0x39, 0xfc, 0x43, 0xd3, 0xe0, 0x03, 0x13, 0xaa, + 0x39, 0x7f, 0x18, 0x9b, 0x76, 0x02, 0x19, 0x8b, 0xe1, 0x03, 0x16, 0xaa, + 0x80, 0x02, 0x3f, 0xd6, 0x21, 0xfb, 0x7f, 0xd3, 0xe1, 0x37, 0x00, 0xf9, + 0xdb, 0x02, 0x19, 0x8b, 0xe1, 0x03, 0x1b, 0xaa, 0xa0, 0x0e, 0xf8, 0x37, + 0xe0, 0x03, 0x16, 0xaa, 0x80, 0x02, 0x3f, 0xd6, 0x1f, 0x00, 0x00, 0x71, + 0xcd, 0x09, 0x00, 0x54, 0x40, 0x03, 0x19, 0xcb, 0xe1, 0x03, 0x1a, 0xaa, + 0x5b, 0x03, 0x19, 0x8b, 0xe0, 0x37, 0x00, 0xf9, 0x80, 0x02, 0x3f, 0xd6, + 0xe1, 0x03, 0x1b, 0xaa, 0x60, 0x0a, 0xf8, 0x37, 0xe0, 0x03, 0x1a, 0xaa, + 0x80, 0x02, 0x3f, 0xd6, 0x1f, 0x00, 0x00, 0x71, 0x8d, 0x05, 0x00, 0x54, + 0x20, 0xfb, 0x7f, 0xd3, 0x9b, 0x03, 0x00, 0xcb, 0x79, 0x03, 0x19, 0x8b, + 0xe0, 0x03, 0x1b, 0xaa, 0xe1, 0x03, 0x19, 0xaa, 0x80, 0x02, 0x3f, 0xd6, + 0xe1, 0x03, 0x1c, 0xaa, 0x40, 0x06, 0xf8, 0x37, 0xe0, 0x03, 0x19, 0xaa, + 0x80, 0x02, 0x3f, 0xd6, 0x1f, 0x00, 0x00, 0x71, 0x4c, 0xc6, 0xff, 0x54, + 0xe1, 0x03, 0x1c, 0xaa, 0xe0, 0x03, 0x1b, 0xaa, 0x80, 0x02, 0x3f, 0xd6, + 0x1f, 0x00, 0x00, 0x71, 0x79, 0xb3, 0x9c, 0x9a, 0x2c, 0xfe, 0xff, 0x17, + 0x21, 0x08, 0xd8, 0x9a, 0xe3, 0x03, 0x14, 0xaa, 0xe2, 0x03, 0x18, 0xaa, + 0x04, 0xfe, 0xff, 0x97, 0xdf, 0x02, 0x18, 0xeb, 0xa9, 0xd2, 0xff, 0x54, + 0xc1, 0x0a, 0xd8, 0x9a, 0x14, 0xfe, 0xff, 0x17, 0xe0, 0x3f, 0x40, 0xf9, + 0xbf, 0x0a, 0x00, 0x71, 0x05, 0x00, 0x02, 0xcb, 0x60, 0xf6, 0xff, 0x54, + 0x42, 0x7c, 0x40, 0x93, 0x04, 0x00, 0x80, 0xd2, 0x40, 0xfc, 0x43, 0xd3, + 0xe7, 0x37, 0x40, 0xf9, 0xa3, 0x78, 0x64, 0xf8, 0xe2, 0x78, 0x64, 0xf8, + 0xe3, 0x78, 0x24, 0xf8, 0xa2, 0x78, 0x24, 0xf8, 0x84, 0x04, 0x00, 0x91, + 0x02, 0x00, 0x04, 0xcb, 0x5f, 0x00, 0x00, 0xf1, 0x0c, 0xff, 0xff, 0x54, + 0xfe, 0xfe, 0xff, 0x17, 0xfa, 0x37, 0x40, 0xf9, 0xe1, 0x03, 0x1b, 0xaa, + 0xe0, 0x03, 0x1a, 0xaa, 0x80, 0x02, 0x3f, 0xd6, 0x1f, 0x00, 0x00, 0x71, + 0x20, 0xfb, 0x7f, 0xd3, 0x5a, 0xb3, 0x9b, 0x9a, 0x9b, 0x03, 0x00, 0xcb, + 0x79, 0x03, 0x19, 0x8b, 0xe0, 0x03, 0x1b, 0xaa, 0xe1, 0x03, 0x19, 0xaa, + 0x80, 0x02, 0x3f, 0xd6, 0xe1, 0x03, 0x1c, 0xaa, 0x00, 0xfa, 0xff, 0x36, + 0xe0, 0x03, 0x19, 0xaa, 0x80, 0x02, 0x3f, 0xd6, 0x40, 0xc0, 0xff, 0x37, + 0xe1, 0x03, 0x1c, 0xaa, 0xe0, 0x03, 0x1b, 0xaa, 0x80, 0x02, 0x3f, 0xd6, + 0x1f, 0x00, 0x00, 0x71, 0x99, 0xb3, 0x9b, 0x9a, 0xfc, 0xfd, 0xff, 0x17, + 0xe1, 0x03, 0x1b, 0xaa, 0xe0, 0x03, 0x13, 0xaa, 0x80, 0x02, 0x3f, 0xd6, + 0x1f, 0x00, 0x00, 0x71, 0x76, 0xb2, 0x9b, 0x9a, 0x40, 0x03, 0x19, 0xcb, + 0xe1, 0x03, 0x1a, 0xaa, 0x5b, 0x03, 0x19, 0x8b, 0xe0, 0x37, 0x00, 0xf9, + 0x80, 0x02, 0x3f, 0xd6, 0xe1, 0x03, 0x1b, 0xaa, 0xe0, 0xf5, 0xff, 0x36, + 0xe0, 0x03, 0x1a, 0xaa, 0x80, 0x02, 0x3f, 0xd6, 0x00, 0xf6, 0xff, 0x37, + 0xfa, 0x37, 0x40, 0xf9, 0xe1, 0x03, 0x1b, 0xaa, 0xe0, 0x03, 0x1a, 0xaa, + 0x80, 0x02, 0x3f, 0xd6, 0x1f, 0x00, 0x00, 0x71, 0x7a, 0xb3, 0x9a, 0x9a, + 0xa9, 0xff, 0xff, 0x17, 0x00, 0xfc, 0x43, 0xd3, 0xa7, 0x78, 0x64, 0xf8, + 0x63, 0x7a, 0x64, 0xf8, 0x67, 0x7a, 0x24, 0xf8, 0xa3, 0x78, 0x24, 0xf8, + 0x84, 0x04, 0x00, 0x91, 0x03, 0x00, 0x04, 0xcb, 0x7f, 0x00, 0x00, 0xf1, + 0x2c, 0xff, 0xff, 0x54, 0xe2, 0xd8, 0xff, 0xb4, 0xe0, 0x3f, 0x40, 0xf9, + 0x05, 0x00, 0x02, 0xcb, 0xba, 0xff, 0xff, 0x17, 0xe0, 0x03, 0x16, 0xaa, + 0x80, 0x02, 0x3f, 0xd6, 0xc0, 0xf1, 0xff, 0x37, 0xe1, 0x03, 0x1b, 0xaa, + 0xe0, 0x03, 0x13, 0xaa, 0x80, 0x02, 0x3f, 0xd6, 0x1f, 0x00, 0x00, 0x71, + 0x76, 0xb3, 0x93, 0x9a, 0x88, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, + 0x64, 0x00, 0x00, 0xf0, 0x84, 0xb0, 0x44, 0xf9, 0x85, 0xfc, 0x40, 0xf9, + 0x65, 0x03, 0x00, 0xb4, 0xa4, 0x08, 0x40, 0xb9, 0x9f, 0x7c, 0x00, 0x71, + 0x6c, 0x03, 0x00, 0x54, 0x00, 0x01, 0x00, 0x35, 0x80, 0x7c, 0x40, 0x93, + 0x02, 0x08, 0x00, 0x91, 0x84, 0x04, 0x00, 0x11, 0xa4, 0x08, 0x00, 0xb9, + 0x00, 0x00, 0x80, 0x52, 0xa1, 0x78, 0x22, 0xf8, 0xc0, 0x03, 0x5f, 0xd6, + 0xa6, 0xcc, 0x24, 0x8b, 0x27, 0x00, 0x80, 0x52, 0xe7, 0x20, 0xc4, 0x1a, + 0x1f, 0x08, 0x00, 0x71, 0x80, 0x7c, 0x40, 0x93, 0xc2, 0x88, 0x00, 0xf9, + 0xa2, 0x10, 0x43, 0xb9, 0x42, 0x00, 0x07, 0x2a, 0xa2, 0x10, 0x03, 0xb9, + 0xc3, 0x08, 0x01, 0xf9, 0x01, 0xfe, 0xff, 0x54, 0xa2, 0x14, 0x43, 0xb9, + 0x47, 0x00, 0x07, 0x2a, 0xa7, 0x14, 0x03, 0xb9, 0xec, 0xff, 0xff, 0x17, + 0x85, 0x00, 0x08, 0x91, 0x85, 0xfc, 0x00, 0xf9, 0xe4, 0xff, 0xff, 0x17, + 0x00, 0x00, 0x80, 0x12, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfd, 0x7b, 0xbb, 0xa9, 0x62, 0x00, 0x00, 0xf0, 0xfd, 0x03, 0x00, 0x91, + 0xf5, 0x5b, 0x02, 0xa9, 0x56, 0xb0, 0x44, 0xf9, 0xd5, 0xfe, 0x40, 0xf9, + 0xf5, 0x02, 0x00, 0xb4, 0xf7, 0x63, 0x03, 0xa9, 0xf8, 0x03, 0x00, 0x2a, + 0x37, 0x00, 0x80, 0x52, 0xf9, 0x6b, 0x04, 0xa9, 0xf9, 0x03, 0x01, 0xaa, + 0xf3, 0x53, 0x01, 0xa9, 0xb3, 0x0a, 0x40, 0xb9, 0x74, 0x06, 0x00, 0x71, + 0x64, 0x01, 0x00, 0x54, 0xb3, 0xce, 0x33, 0x8b, 0x73, 0x22, 0x00, 0x91, + 0xd9, 0x01, 0x00, 0xb4, 0x60, 0x02, 0x41, 0xf9, 0x1f, 0x00, 0x19, 0xeb, + 0x60, 0x01, 0x00, 0x54, 0x94, 0x06, 0x00, 0x51, 0x73, 0x22, 0x00, 0xd1, + 0x9f, 0x06, 0x00, 0x31, 0x21, 0xff, 0xff, 0x54, 0xf3, 0x53, 0x41, 0xa9, + 0xf7, 0x63, 0x43, 0xa9, 0xf9, 0x6b, 0x44, 0xa9, 0xf5, 0x5b, 0x42, 0xa9, + 0xfd, 0x7b, 0xc5, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0xa2, 0x0a, 0x40, 0xb9, + 0x63, 0x02, 0x40, 0xf9, 0x42, 0x04, 0x00, 0x51, 0x5f, 0x00, 0x14, 0x6b, + 0x60, 0x03, 0x00, 0x54, 0x7f, 0x02, 0x00, 0xf9, 0x03, 0xfe, 0xff, 0xb4, + 0xa1, 0x12, 0x43, 0xb9, 0xa0, 0x42, 0x04, 0x91, 0xe2, 0x22, 0xd4, 0x1a, + 0xba, 0x0a, 0x40, 0xb9, 0x5f, 0x00, 0x01, 0x6a, 0x61, 0x01, 0x00, 0x54, + 0x60, 0x00, 0x3f, 0xd6, 0xa1, 0x0a, 0x40, 0xb9, 0xc0, 0xfe, 0x40, 0xf9, + 0x3f, 0x00, 0x1a, 0x6b, 0x61, 0x00, 0x00, 0x54, 0xbf, 0x02, 0x00, 0xeb, + 0x60, 0xfc, 0xff, 0x54, 0xc0, 0xfc, 0xff, 0xb4, 0xf5, 0x03, 0x00, 0xaa, + 0xd7, 0xff, 0xff, 0x17, 0x01, 0x04, 0x42, 0xb9, 0x60, 0x82, 0x40, 0xf9, + 0x5f, 0x00, 0x01, 0x6a, 0xe1, 0x00, 0x00, 0x54, 0xe1, 0x03, 0x00, 0xaa, + 0xe0, 0x03, 0x18, 0x2a, 0x60, 0x00, 0x3f, 0xd6, 0xf0, 0xff, 0xff, 0x17, + 0xb4, 0x0a, 0x00, 0xb9, 0xe6, 0xff, 0xff, 0x17, 0x60, 0x00, 0x3f, 0xd6, + 0xec, 0xff, 0xff, 0x17, 0xfd, 0x7b, 0xbf, 0xa9, 0xfb, 0x73, 0xbf, 0xa9, + 0xf9, 0x6b, 0xbf, 0xa9, 0xf7, 0x63, 0xbf, 0xa9, 0xf5, 0x5b, 0xbf, 0xa9, + 0xf3, 0x53, 0xbf, 0xa9, 0xbf, 0x40, 0x00, 0xd5, 0xfd, 0x7b, 0xbf, 0xa9, + 0xd9, 0x1b, 0xff, 0x97, 0xaa, 0xaf, 0xff, 0x97, 0x17, 0x1c, 0xff, 0x17, + 0xbf, 0x40, 0x00, 0xd5, 0xfd, 0x7b, 0xbf, 0xa9, 0xd4, 0x1b, 0xff, 0x97, + 0xe1, 0xac, 0xff, 0x97, 0x12, 0x1c, 0xff, 0x17, 0xbf, 0x40, 0x00, 0xd5, + 0xfd, 0x7b, 0xbf, 0xa9, 0xfc, 0x77, 0xbf, 0xa9, 0xfa, 0x6f, 0xbf, 0xa9, + 0xf8, 0x67, 0xbf, 0xa9, 0xf6, 0x5f, 0xbf, 0xa9, 0xf4, 0x57, 0xbf, 0xa9, + 0xfe, 0x7f, 0xbf, 0xad, 0xfc, 0x77, 0xbf, 0xad, 0xfa, 0x6f, 0xbf, 0xad, + 0xf8, 0x67, 0xbf, 0xad, 0xf6, 0x5f, 0xbf, 0xad, 0xf4, 0x57, 0xbf, 0xad, + 0xf2, 0x4f, 0xbf, 0xad, 0xf0, 0x47, 0xbf, 0xad, 0xee, 0x3f, 0xbf, 0xad, + 0xec, 0x37, 0xbf, 0xad, 0xea, 0x2f, 0xbf, 0xad, 0xe8, 0x27, 0xbf, 0xad, + 0xe6, 0x1f, 0xbf, 0xad, 0xe4, 0x17, 0xbf, 0xad, 0xe2, 0x0f, 0xbf, 0xad, + 0xe0, 0x07, 0xbf, 0xad, 0xba, 0x1b, 0xff, 0x97, 0x37, 0xb1, 0xff, 0x97, + 0xf8, 0x1b, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3b, 0xd5, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0xe0, 0x1b, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0xe0, 0x3b, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0xe0, 0x3b, 0xd5, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0xe1, 0x38, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0xe1, 0x18, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0xe1, 0x3c, 0xd5, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0xe1, 0x1c, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, + 0x40, 0xe2, 0x3b, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0xe2, 0x1b, 0xd5, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0xe2, 0x3b, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0xe2, 0x1b, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0xe2, 0x3b, 0xd5, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0xe2, 0x1b, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, + 0x40, 0xe2, 0x3f, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0xe2, 0x1f, 0xd5, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0xe2, 0x3f, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0xe2, 0x1f, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0xe2, 0x3f, 0xd5, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0xe2, 0x1f, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, + 0x01, 0x11, 0x3e, 0xd5, 0x01, 0x00, 0x75, 0xb3, 0x01, 0x11, 0x1e, 0xd5, + 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0xe3, 0x3b, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, + 0x40, 0xe3, 0x1b, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0xe3, 0x3b, 0xd5, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0xe3, 0x1b, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0xe3, 0x3b, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0xe3, 0x1b, 0xd5, + 0xc0, 0x03, 0x5f, 0xd6, 0x60, 0xe0, 0x3c, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, + 0x60, 0xe0, 0x1c, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0xe2, 0x3c, 0xd5, + 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0xe2, 0x1c, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0xe2, 0x3c, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0xe2, 0x1c, 0xd5, + 0xc0, 0x03, 0x5f, 0xd6, 0x20, 0xe2, 0x3c, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, + 0x20, 0xe2, 0x1c, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, 0x43, 0x61, 0x6c, 0x20, + 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x67, 0x65, + 0x74, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x61, 0x6c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, + 0x6b, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, + 0x73, 0x20, 0x73, 0x65, 0x74, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x61, 0x6c, 0x20, 0x66, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, + 0x20, 0x77, 0x61, 0x69, 0x74, 0x20, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x43, 0x61, 0x6c, 0x20, + 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x6d, 0x75, + 0x74, 0x65, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x61, 0x6c, 0x20, + 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x6d, 0x75, + 0x74, 0x65, 0x78, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x61, 0x6c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, + 0x6b, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x75, + 0x6c, 0x6c, 0x00, 0x00, 0x43, 0x61, 0x6c, 0x20, 0x66, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, + 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x54, 0x69, 0x6d, 0x65, + 0x72, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, + 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x43, 0x61, 0x6c, 0x20, + 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x74, 0x69, + 0x6d, 0x65, 0x72, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x20, 0x61, 0x20, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x69, + 0x6e, 0x67, 0x20, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x61, 0x6c, 0x20, 0x66, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x43, 0x61, 0x6c, 0x20, + 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x77, 0x61, + 0x69, 0x74, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x61, 0x6c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, + 0x6b, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x73, 0x74, 0x6f, 0x70, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x67, 0x43, 0x61, 0x6c, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x75, 0x74, + 0x65, 0x78, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, + 0x20, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x67, 0x43, 0x61, 0x6c, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, + 0x6b, 0x4d, 0x75, 0x74, 0x65, 0x78, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x20, 0x62, 0x65, 0x20, 0x75, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x65, + 0x64, 0x00, 0x00, 0x00, 0x43, 0x61, 0x6c, 0x20, 0x66, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x20, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x43, 0x61, 0x6c, 0x20, + 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x63, 0x6c, + 0x65, 0x61, 0x72, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, + 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x6d, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00, 0x00, 0x00, + 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x6f, 0x70, 0x63, 0x6f, + 0x64, 0x65, 0x00, 0x00, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x49, 0x44, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00, 0x00, 0x00, 0x00, + 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x69, 0x6e, + 0x20, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x68, 0x61, 0x6e, + 0x64, 0x6c, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x61, 0x70, 0x70, 0x20, + 0x63, 0x6d, 0x64, 0x20, 0x74, 0x64, 0x20, 0x72, 0x63, 0x76, 0x20, 0x45, + 0x72, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x69, 0x6d, 0x65, 0x64, 0x20, 0x6f, 0x75, + 0x74, 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x61, 0x70, 0x70, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x65, 0x74, 0x20, 0x61, 0x70, + 0x70, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, + 0x20, 0x43, 0x61, 0x6c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x69, + 0x6e, 0x20, 0x61, 0x64, 0x69, 0x5f, 0x61, 0x70, 0x70, 0x5f, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x72, 0x61, 0x63, 0x6b, + 0x69, 0x6e, 0x67, 0x43, 0x61, 0x6c, 0x4d, 0x61, 0x69, 0x6e, 0x00, 0x00, + 0xe0, 0x3c, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3b, 0x00, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xb0, 0x3d, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x3a, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x39, 0x00, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x54, 0x68, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x73, 0x20, 0x61, 0x20, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x6c, 0x61, 0x79, 0x65, + 0x72, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x63, + 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x66, 0x6c, 0x6f, 0x77, 0x2c, + 0x20, 0x74, 0x78, 0x43, 0x68, 0x3a, 0x25, 0x75, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x55, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x64, 0x75, 0x72, + 0x69, 0x6e, 0x67, 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, + 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x20, 0x54, 0x78, 0x20, 0x43, 0x68, 0x61, + 0x6e, 0x25, 0x75, 0x00, 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x72, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x20, 0x63, 0x61, + 0x70, 0x74, 0x75, 0x72, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, + 0x20, 0x25, 0x64, 0x2c, 0x20, 0x54, 0x78, 0x20, 0x43, 0x68, 0x61, 0x6e, + 0x25, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x6e, 0x75, + 0x61, 0x6c, 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x70, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, + 0x62, 0x65, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x74, 0x78, 0x3a, + 0x25, 0x75, 0x00, 0x00, 0x67, 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, + 0x74, 0x65, 0x78, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, + 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, + 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x61, 0x20, 0x70, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, + 0x72, 0x65, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x3a, 0x25, 0x75, 0x0a, 0x00, 0x00, 0x00, + 0x67, 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x50, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x74, 0x65, 0x78, 0x20, + 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x75, 0x6e, + 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x65, 0x72, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, + 0x20, 0x77, 0x61, 0x69, 0x74, 0x20, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x65, 0x72, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x65, 0x72, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x70, 0x70, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x6d, 0x61, 0x6e, 0x75, + 0x61, 0x6c, 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x70, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x00, 0x00, + 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x65, 0x72, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x70, 0x70, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x63, 0x61, 0x70, 0x74, + 0x75, 0x72, 0x65, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x20, 0x4f, 0x72, 0x78, 0x30, 0x00, + 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x65, 0x72, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x70, 0x70, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x63, 0x61, 0x70, 0x74, + 0x75, 0x72, 0x65, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x20, 0x4f, 0x72, 0x78, 0x31, 0x00, + 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x00, + 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x20, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x75, 0x6d, 0x6d, 0x79, 0x63, 0x61, 0x70, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x75, 0x6d, 0x6d, + 0x79, 0x63, 0x61, 0x70, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x65, 0x72, 0x20, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x20, + 0x74, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x65, 0x72, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, + 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x00, 0x00, 0x00, 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x72, 0x20, 0x70, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x20, 0x67, 0x65, 0x74, 0x20, 0x6e, 0x65, 0x78, + 0x74, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x73, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, + 0x63, 0x61, 0x70, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x2c, 0x20, + 0x6f, 0x72, 0x78, 0x3a, 0x25, 0x75, 0x2e, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x65, 0x72, 0x20, 0x75, 0x6e, 0x65, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x20, + 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x64, 0x6f, 0x6e, 0x65, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2d, 0x4f, 0x72, 0x78, 0x30, 0x2e, + 0x0a, 0x00, 0x00, 0x00, 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x72, 0x20, 0x75, 0x6e, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x61, 0x6e, + 0x75, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, + 0x64, 0x6f, 0x6e, 0x65, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2d, 0x4f, + 0x72, 0x78, 0x31, 0x2e, 0x0a, 0x00, 0x00, 0x00, 0x43, 0x61, 0x70, 0x74, + 0x75, 0x72, 0x65, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x72, 0x20, 0x75, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x64, 0x6f, 0x6e, + 0x65, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x72, 0x20, 0x75, 0x6e, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x63, 0x61, 0x70, + 0x74, 0x75, 0x72, 0x65, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x2d, 0x4f, 0x72, 0x78, 0x30, 0x2e, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x72, 0x20, 0x75, 0x6e, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x63, 0x61, 0x70, + 0x74, 0x75, 0x72, 0x65, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x2d, 0x4f, 0x72, 0x78, 0x31, 0x2e, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x72, 0x20, 0x75, 0x6e, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x2e, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x43, 0x61, 0x70, 0x74, + 0x75, 0x72, 0x65, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x72, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, 0x6c, + 0x65, 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x64, 0x6f, + 0x6e, 0x65, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x0a, 0x00, 0x00, + 0x55, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x63, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x77, 0x61, 0x74, 0x63, 0x68, 0x64, + 0x6f, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x77, 0x64, 0x3a, 0x20, 0x25, 0x64, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x55, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, + 0x6f, 0x20, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x77, 0x61, + 0x74, 0x63, 0x68, 0x64, 0x6f, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x75, 0x74, + 0x65, 0x78, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x77, 0x64, 0x3a, 0x20, 0x25, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x20, 0x77, 0x61, 0x74, 0x63, 0x68, 0x64, 0x6f, 0x67, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x65, 0x20, 0x77, 0x64, 0x3a, 0x20, 0x25, 0x64, + 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, 0x74, 0x63, 0x68, 0x64, 0x6f, 0x67, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x75, 0x73, + 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, + 0x74, 0x68, 0x61, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x25, 0x64, 0x20, + 0x6d, 0x73, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, 0x74, 0x63, + 0x68, 0x64, 0x6f, 0x67, 0x20, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x75, 0x74, 0x65, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x4c, + 0x6f, 0x63, 0x6b, 0x75, 0x70, 0x20, 0x57, 0x61, 0x74, 0x63, 0x68, 0x64, + 0x6f, 0x67, 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x00, 0x00, 0x00, + 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x4f, 0x76, 0x65, 0x72, 0x6c, + 0x6f, 0x61, 0x64, 0x20, 0x57, 0x61, 0x74, 0x63, 0x68, 0x64, 0x6f, 0x67, + 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x00, 0x45, 0x43, 0x43, 0x20, + 0x53, 0x63, 0x72, 0x75, 0x62, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x00, + 0x45, 0x43, 0x43, 0x20, 0x50, 0x6f, 0x6c, 0x6c, 0x20, 0x54, 0x69, 0x6d, + 0x65, 0x72, 0x00, 0x00, 0x6d, 0x65, 0x6d, 0x20, 0x62, 0x75, 0x66, 0x20, + 0x6d, 0x67, 0x6d, 0x74, 0x20, 0x73, 0x76, 0x63, 0x20, 0x64, 0x70, 0x64, + 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x65, 0x6d, 0x20, + 0x62, 0x75, 0x66, 0x20, 0x6d, 0x67, 0x6d, 0x74, 0x20, 0x73, 0x76, 0x63, + 0x20, 0x63, 0x74, 0x63, 0x20, 0x66, 0x6c, 0x75, 0x74, 0x20, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, + 0x6d, 0x65, 0x6d, 0x20, 0x62, 0x75, 0x66, 0x20, 0x6d, 0x67, 0x6d, 0x74, + 0x20, 0x73, 0x76, 0x63, 0x20, 0x73, 0x65, 0x6d, 0x20, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6d, 0x65, 0x6d, 0x20, 0x62, 0x75, 0x66, 0x20, + 0x6d, 0x67, 0x6d, 0x74, 0x20, 0x73, 0x76, 0x63, 0x20, 0x6d, 0x75, 0x74, + 0x65, 0x78, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x65, 0x6d, 0x20, + 0x62, 0x75, 0x66, 0x20, 0x6d, 0x67, 0x6d, 0x74, 0x20, 0x73, 0x76, 0x63, + 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x61, 0x64, 0x69, 0x5f, 0x73, 0x76, 0x63, 0x5f, 0x4d, 0x65, 0x6d, 0x42, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x41, 0x63, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x20, 0x53, 0x65, 0x6d, 0x57, 0x61, 0x69, 0x74, 0x20, 0x66, 0x61, 0x69, + 0x6c, 0x75, 0x72, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6d, 0x65, 0x6d, 0x20, 0x62, 0x75, 0x66, 0x20, 0x6d, 0x67, 0x6d, 0x74, + 0x20, 0x73, 0x76, 0x63, 0x20, 0x61, 0x63, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x00, 0x61, 0x64, 0x69, 0x5f, + 0x73, 0x76, 0x63, 0x5f, 0x4d, 0x65, 0x6d, 0x42, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x41, 0x63, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, + 0x65, 0x78, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x00, 0x00, + 0x54, 0x72, 0x69, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, + 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x61, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x21, 0x20, 0x54, 0x79, 0x70, 0x65, 0x20, + 0x3d, 0x20, 0x25, 0x64, 0x2e, 0x20, 0x41, 0x64, 0x64, 0x72, 0x20, 0x3d, + 0x20, 0x30, 0x78, 0x25, 0x6c, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x61, 0x64, 0x69, 0x5f, 0x73, 0x76, 0x63, 0x5f, 0x4d, 0x65, 0x6d, 0x42, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x75, + 0x72, 0x65, 0x00, 0x00, 0x61, 0x64, 0x69, 0x5f, 0x73, 0x76, 0x63, 0x5f, + 0x4d, 0x65, 0x6d, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x20, 0x53, 0x65, 0x6d, 0x50, 0x6f, 0x73, 0x74, + 0x20, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x65, 0x6d, 0x20, 0x42, 0x75, 0x66, 0x20, + 0x53, 0x76, 0x63, 0x20, 0x41, 0x64, 0x61, 0x70, 0x74, 0x20, 0x53, 0x65, + 0x6d, 0x00, 0x00, 0x00, 0x4d, 0x65, 0x6d, 0x20, 0x42, 0x75, 0x66, 0x20, + 0x53, 0x76, 0x63, 0x20, 0x41, 0x64, 0x61, 0x70, 0x74, 0x20, 0x4d, 0x74, + 0x78, 0x00, 0x00, 0x00, 0x4d, 0x65, 0x6d, 0x20, 0x42, 0x75, 0x66, 0x20, + 0x53, 0x76, 0x63, 0x20, 0x46, 0x69, 0x6c, 0x74, 0x20, 0x49, 0x6e, 0x20, + 0x53, 0x65, 0x6d, 0x00, 0x4d, 0x65, 0x6d, 0x20, 0x42, 0x75, 0x66, 0x20, + 0x53, 0x76, 0x63, 0x20, 0x46, 0x69, 0x6c, 0x74, 0x20, 0x49, 0x6e, 0x20, + 0x4d, 0x74, 0x78, 0x00, 0x4d, 0x65, 0x6d, 0x20, 0x42, 0x75, 0x66, 0x20, + 0x53, 0x76, 0x63, 0x20, 0x46, 0x69, 0x6c, 0x74, 0x20, 0x4f, 0x75, 0x74, + 0x20, 0x53, 0x65, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x65, 0x6d, 0x20, 0x42, 0x75, 0x66, 0x20, 0x53, 0x76, 0x63, 0x20, + 0x46, 0x69, 0x6c, 0x74, 0x20, 0x4f, 0x75, 0x74, 0x20, 0x4d, 0x74, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x65, 0x6d, 0x20, + 0x42, 0x75, 0x66, 0x20, 0x53, 0x76, 0x63, 0x20, 0x4c, 0x55, 0x54, 0x20, + 0x53, 0x65, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x65, 0x6d, 0x20, + 0x42, 0x75, 0x66, 0x20, 0x53, 0x76, 0x63, 0x20, 0x4c, 0x55, 0x54, 0x20, + 0x4d, 0x74, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x65, 0x6d, 0x20, + 0x42, 0x75, 0x66, 0x20, 0x53, 0x76, 0x63, 0x20, 0x43, 0x61, 0x70, 0x74, + 0x75, 0x72, 0x65, 0x20, 0x53, 0x65, 0x6d, 0x00, 0x4d, 0x65, 0x6d, 0x20, + 0x42, 0x75, 0x66, 0x20, 0x53, 0x76, 0x63, 0x20, 0x43, 0x61, 0x70, 0x74, + 0x75, 0x72, 0x65, 0x20, 0x4d, 0x74, 0x78, 0x00, 0x4d, 0x65, 0x6d, 0x20, + 0x42, 0x75, 0x66, 0x20, 0x53, 0x76, 0x63, 0x20, 0x53, 0x70, 0x65, 0x63, + 0x74, 0x72, 0x75, 0x6d, 0x20, 0x53, 0x65, 0x6d, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x65, 0x6d, 0x20, 0x42, 0x75, 0x66, 0x20, + 0x53, 0x76, 0x63, 0x20, 0x53, 0x70, 0x65, 0x63, 0x74, 0x72, 0x75, 0x6d, + 0x20, 0x4d, 0x74, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x65, 0x6d, 0x20, 0x42, 0x75, 0x66, 0x20, 0x53, 0x76, 0x63, 0x20, + 0x56, 0x53, 0x57, 0x52, 0x20, 0x53, 0x65, 0x6d, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x65, 0x6d, 0x20, 0x42, 0x75, 0x66, 0x20, 0x53, 0x76, 0x63, 0x20, + 0x56, 0x53, 0x57, 0x52, 0x20, 0x4d, 0x74, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x65, 0x6d, 0x20, 0x42, 0x75, 0x66, 0x20, 0x53, 0x76, 0x63, 0x20, + 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x63, 0x20, + 0x53, 0x65, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x65, 0x6d, 0x20, + 0x42, 0x75, 0x66, 0x20, 0x53, 0x76, 0x63, 0x20, 0x53, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x63, 0x20, 0x4d, 0x74, 0x78, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x65, 0x6d, 0x20, 0x42, 0x75, 0x66, 0x20, + 0x53, 0x76, 0x63, 0x20, 0x43, 0x54, 0x43, 0x20, 0x46, 0x4c, 0x55, 0x54, + 0x20, 0x53, 0x65, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x65, 0x6d, 0x20, 0x42, 0x75, 0x66, 0x20, 0x53, 0x76, 0x63, 0x20, + 0x43, 0x54, 0x43, 0x20, 0x46, 0x4c, 0x55, 0x54, 0x20, 0x4d, 0x74, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0x89, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x89, 0x01, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x75, 0x00, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x74, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x44, 0x52, 0x56, 0x39, 0x30, 0x34, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x25, 0x73, 0x20, 0x44, 0x46, 0x45, 0x20, 0x46, + 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x20, 0x76, 0x25, 0x64, 0x2e, + 0x25, 0x64, 0x2e, 0x25, 0x64, 0x2e, 0x25, 0x64, 0x20, 0x28, 0x30, 0x78, + 0x25, 0x58, 0x29, 0x20, 0x28, 0x25, 0x73, 0x29, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x6e, 0x69, 0x74, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x20, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x20, + 0x74, 0x6f, 0x20, 0x25, 0x64, 0x00, 0x00, 0x00, 0x41, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x6e, 0x69, 0x74, + 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x00, 0x41, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x75, 0x70, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, + 0x64, 0x00, 0x00, 0x00, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x42, 0x6f, 0x6f, 0x74, 0x20, 0x4d, 0x6f, 0x64, + 0x65, 0x20, 0x3d, 0x20, 0x25, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x20, 0x66, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x30, 0x78, 0x25, 0x58, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x62, 0x6f, 0x6f, 0x74, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x20, 0x30, 0x78, 0x25, 0x58, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x73, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x20, 0x53, + 0x44, 0x4b, 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x00, 0x00, 0x46, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x68, 0x75, 0x74, 0x64, 0x6f, + 0x77, 0x6e, 0x2f, 0x72, 0x65, 0x73, 0x65, 0x74, 0x20, 0x53, 0x44, 0x4b, + 0x20, 0x61, 0x64, 0x61, 0x70, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x00, 0x46, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x79, 0x70, 0x61, 0x73, 0x73, + 0x20, 0x61, 0x63, 0x74, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x78, 0x43, 0x68, 0x20, 0x3d, 0x20, 0x25, 0x64, 0x00, 0x00, + 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, + 0x6f, 0x73, 0x65, 0x20, 0x53, 0x44, 0x4b, 0x20, 0x61, 0x63, 0x74, 0x75, + 0x61, 0x74, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x2e, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4b, 0x20, 0x69, 0x73, 0x20, 0x70, + 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x41, 0x35, 0x35, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x52, 0x65, + 0x6c, 0x6f, 0x61, 0x64, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0f, 0x00, + 0x00, 0x35, 0x0c, 0x00, 0x00, 0x35, 0x0c, 0x00, 0x00, 0x35, 0x0c, 0x00, + 0x00, 0x35, 0x0c, 0x00, 0x00, 0x35, 0x0c, 0x00, 0x00, 0x35, 0x0c, 0x00, + 0x00, 0x35, 0x0c, 0x00, 0x00, 0x35, 0x0c, 0x00, 0x00, 0x35, 0x0c, 0x00, + 0x00, 0x35, 0x0c, 0x00, 0x00, 0x35, 0x0c, 0x00, 0x00, 0x35, 0x0c, 0x00, + 0x00, 0x35, 0x0c, 0x00, 0x00, 0x35, 0x0c, 0x00, 0x00, 0x35, 0x0c, 0x00, + 0x00, 0x35, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, + 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x67, 0x35, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x73, + 0x76, 0x63, 0x20, 0x75, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6d, 0x75, + 0x74, 0x65, 0x78, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x00, 0x00, + 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x73, 0x76, 0x63, 0x20, 0x6c, + 0x6f, 0x63, 0x6b, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x20, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x65, 0x6d, 0x20, + 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x73, 0x76, 0x63, 0x20, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x20, + 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x00, 0x00, 0x55, 0x6e, 0x6c, 0x6f, + 0x63, 0x6b, 0x20, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x6d, 0x75, + 0x74, 0x65, 0x78, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x6d, 0x61, 0x6c, + 0x6c, 0x6f, 0x63, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x20, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x68, 0x65, 0x61, 0x70, + 0x20, 0x62, 0x79, 0x74, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x00, 0x00, + 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x73, 0x76, 0x63, 0x20, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x20, + 0x68, 0x65, 0x61, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x73, 0x76, 0x63, 0x20, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x73, 0x76, 0x63, 0x20, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x67, + 0x75, 0x6f, 0x75, 0x73, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x73, + 0x76, 0x63, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x4c, 0x34, + 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x20, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x6c, 0x6c, + 0x6f, 0x63, 0x20, 0x73, 0x76, 0x63, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x70, + 0x6f, 0x6f, 0x6c, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x61, 0x76, + 0x61, 0x69, 0x6c, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, + 0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x73, + 0x69, 0x7a, 0x65, 0x00, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x73, + 0x76, 0x63, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, + 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x00, + 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x73, 0x76, 0x63, 0x20, 0x67, + 0x65, 0x74, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, + 0x64, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x20, 0x70, 0x74, 0x72, 0x00, 0x00, + 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x73, 0x76, 0x63, 0x20, 0x67, + 0x65, 0x74, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x73, + 0x76, 0x63, 0x20, 0x67, 0x65, 0x74, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x68, 0x65, 0x61, 0x70, 0x20, 0x69, + 0x6e, 0x66, 0x6f, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5f, 0x41, 0x44, 0x49, 0x5f, 0x53, 0x56, 0x43, + 0x5f, 0x4d, 0x41, 0x4c, 0x4c, 0x4f, 0x43, 0x5f, 0x4d, 0x45, 0x4d, 0x5f, + 0x49, 0x44, 0x5f, 0x47, 0x50, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x6c, 0x6c, + 0x6f, 0x63, 0x20, 0x73, 0x76, 0x63, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x70, + 0x6f, 0x6f, 0x6c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x63, 0x6f, 0x72, 0x72, 0x20, 0x68, 0x65, 0x61, 0x70, 0x20, 0x62, + 0x79, 0x74, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x73, 0x76, 0x63, 0x20, 0x6d, + 0x65, 0x6d, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x6c, 0x6c, + 0x6f, 0x63, 0x20, 0x73, 0x76, 0x63, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x66, + 0x72, 0x65, 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x52, 0x53, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x2e, 0x20, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x71, 0x75, 0x65, 0x75, 0x65, 0x20, 0x66, 0x75, + 0x6c, 0x6c, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x6e, 0x65, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x52, 0x53, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x00, 0x00, + 0x55, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x52, + 0x53, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x20, + 0x72, 0x78, 0x64, 0x3a, 0x20, 0x25, 0x64, 0x00, 0x52, 0x53, 0x20, 0x53, + 0x53, 0x42, 0x20, 0x53, 0x79, 0x6e, 0x63, 0x20, 0x53, 0x65, 0x6d, 0x00, + 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x73, 0x62, 0x53, 0x79, + 0x6e, 0x63, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x65, + 0x72, 0x72, 0x3a, 0x30, 0x78, 0x25, 0x78, 0x2c, 0x20, 0x53, 0x65, 0x6d, + 0x45, 0x72, 0x72, 0x3a, 0x30, 0x78, 0x25, 0x78, 0x2c, 0x20, 0x73, 0x76, + 0x63, 0x45, 0x72, 0x72, 0x3a, 0x30, 0x78, 0x25, 0x78, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0x1d, 0xc1, 0x04, + 0x6e, 0x3b, 0x82, 0x09, 0xd9, 0x26, 0x43, 0x0d, 0xdc, 0x76, 0x04, 0x13, + 0x6b, 0x6b, 0xc5, 0x17, 0xb2, 0x4d, 0x86, 0x1a, 0x05, 0x50, 0x47, 0x1e, + 0xb8, 0xed, 0x08, 0x26, 0x0f, 0xf0, 0xc9, 0x22, 0xd6, 0xd6, 0x8a, 0x2f, + 0x61, 0xcb, 0x4b, 0x2b, 0x64, 0x9b, 0x0c, 0x35, 0xd3, 0x86, 0xcd, 0x31, + 0x0a, 0xa0, 0x8e, 0x3c, 0xbd, 0xbd, 0x4f, 0x38, 0x54, 0x69, 0x6d, 0x65, + 0x64, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, + 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x20, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x00, 0x00, 0x00, 0x00, + 0x4f, 0x53, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x20, 0x67, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x61, 0x64, 0x69, 0x6f, + 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x20, + 0x73, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x61, 0x64, 0x69, 0x6f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x41, 0x44, 0x49, + 0x4f, 0x20, 0x50, 0x49, 0x4e, 0x47, 0x3a, 0x20, 0x6f, 0x6b, 0x00, 0x00, + 0x52, 0x61, 0x64, 0x69, 0x6f, 0x53, 0x65, 0x74, 0x4c, 0x6f, 0x6c, 0x4f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x3a, 0x20, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x61, 0x64, 0x69, + 0x6f, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x6c, 0x4f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x73, 0x3a, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x52, 0x61, 0x64, 0x69, 0x6f, 0x53, 0x65, 0x74, + 0x4c, 0x6f, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x73, 0x3a, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, + 0x61, 0x64, 0x69, 0x5f, 0x73, 0x76, 0x63, 0x5f, 0x52, 0x61, 0x64, 0x69, + 0x6f, 0x53, 0x65, 0x74, 0x43, 0x74, 0x63, 0x32, 0x46, 0x72, 0x61, 0x63, + 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4e, 0x65, 0x77, 0x3a, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x00, 0xf1, 0x68, 0xe3, 0x88, 0xb5, 0xf8, 0xe4, 0x3e, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xc6, 0x05, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0xc6, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x75, 0x74, 0x65, + 0x78, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x4f, 0x73, 0x61, 0x6c, 0x4c, 0x6f, + 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x44, 0x49, 0x20, + 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x54, 0x68, 0x72, 0x65, + 0x61, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0x73, 0x61, 0x6c, + 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x52, 0x65, 0x61, 0x70, 0x65, 0x72, 0x20, 0x53, 0x65, 0x6d, 0x61, 0x70, + 0x68, 0x6f, 0x72, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x61, 0x64, 0x69, 0x5f, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x53, 0x65, 0x6d, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x64, 0x69, 0x5f, + 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x53, 0x65, 0x6d, 0x57, 0x61, 0x69, 0x74, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x74, 0x78, 0x5f, 0x74, + 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x54, 0x68, 0x72, 0x65, + 0x61, 0x64, 0x20, 0x52, 0x65, 0x61, 0x70, 0x65, 0x72, 0x20, 0x54, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x00, 0x00, 0x00, 0x00, 0x53, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x54, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x4c, 0x6f, 0x67, + 0x4d, 0x75, 0x74, 0x65, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x72, 0x69, 0x6e, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, + 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x6f, 0x67, 0x54, 0x72, 0x61, 0x63, 0x65, 0x20, 0x44, 0x65, 0x62, + 0x75, 0x67, 0x00, 0x00, 0x5b, 0x44, 0x20, 0x20, 0x25, 0x30, 0x32, 0x58, + 0x20, 0x25, 0x58, 0x5d, 0x20, 0x00, 0x00, 0x00, 0x5b, 0x49, 0x20, 0x20, + 0x25, 0x30, 0x32, 0x58, 0x20, 0x25, 0x58, 0x5d, 0x20, 0x00, 0x00, 0x00, + 0x5b, 0x57, 0x20, 0x20, 0x25, 0x30, 0x32, 0x58, 0x20, 0x25, 0x58, 0x20, + 0x25, 0x58, 0x5d, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5b, 0x43, 0x20, 0x20, 0x25, 0x30, 0x32, 0x58, 0x20, 0x25, 0x58, 0x20, + 0x25, 0x58, 0x5d, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5b, 0x46, 0x20, 0x20, 0x25, 0x30, 0x32, 0x58, 0x20, 0x25, 0x58, 0x20, + 0x25, 0x58, 0x5d, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x6e, 0x69, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x66, 0x6e, 0x69, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x6e, 0x69, 0x2d, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x00, 0x00, 0x8a, 0x00, 0xf9, 0xff, + 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, + 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, + 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, + 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, + 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, + 0x61, 0x00, 0x78, 0x00, 0x61, 0x00, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, + 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, + 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, + 0xf9, 0xff, 0x47, 0x00, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, + 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0x47, 0x00, + 0xa7, 0x00, 0x47, 0x00, 0x61, 0x00, 0x78, 0x00, 0x61, 0x00, 0xf9, 0xff, + 0x47, 0x00, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, + 0x47, 0x00, 0x93, 0x00, 0xf9, 0xff, 0xf9, 0xff, 0xc3, 0x00, 0xf9, 0xff, + 0x47, 0x00, 0xf9, 0xff, 0xf9, 0xff, 0x47, 0x00, 0xdd, 0x00, 0x64, 0x00, + 0xce, 0x02, 0xce, 0x02, 0x94, 0x00, 0xce, 0x02, 0xdd, 0x00, 0xce, 0x02, + 0xce, 0x02, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x43, 0x6f, 0x63, + 0xa7, 0x87, 0xd2, 0x3f, 0xb3, 0xc8, 0x60, 0x8b, 0x28, 0x8a, 0xc6, 0x3f, + 0xfb, 0x79, 0x9f, 0x50, 0x13, 0x44, 0xd3, 0x3f, 0x71, 0xa3, 0x79, 0x09, + 0x4f, 0x93, 0x0a, 0x40, 0xef, 0x39, 0xfa, 0xfe, 0x42, 0x2e, 0xe6, 0x3f, + 0x16, 0x55, 0xb5, 0xbb, 0xb1, 0x6b, 0x02, 0x40, 0x92, 0x24, 0x49, 0x92, + 0x24, 0x49, 0xb2, 0x3f, 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0xb9, 0x3f, + 0x2d, 0x43, 0x1c, 0xeb, 0xe2, 0x36, 0x1a, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x8f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0xc3, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0xf8, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x84, 0x2e, 0x41, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x12, 0x63, 0x41, + 0x00, 0x00, 0x00, 0x00, 0x84, 0xd7, 0x97, 0x41, 0x00, 0x00, 0x00, 0x00, + 0x65, 0xcd, 0xcd, 0x41, 0x4d, 0x75, 0x74, 0x65, 0x78, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6d, 0x64, 0x20, 0x6c, 0x6f, + 0x67, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, + 0x6c, 0x6f, 0x67, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x20, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x00, + 0x6d, 0x61, 0x69, 0x6c, 0x62, 0x6f, 0x78, 0x44, 0x61, 0x74, 0x61, 0x20, + 0x3d, 0x3d, 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x43, 0x6d, 0x64, 0x44, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x3d, 0x20, + 0x4e, 0x55, 0x4c, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x6d, 0x64, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x67, 0x65, 0x74, 0x20, + 0x4d, 0x75, 0x74, 0x65, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x70, 0x43, 0x75, 0x72, + 0x4d, 0x62, 0x6f, 0x78, 0x4c, 0x69, 0x6e, 0x6b, 0x2d, 0x3e, 0x63, 0x6d, + 0x64, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x20, + 0x3d, 0x20, 0x25, 0x64, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x61, 0x64, 0x69, + 0x5f, 0x73, 0x76, 0x63, 0x5f, 0x43, 0x6d, 0x64, 0x52, 0x78, 0x3a, 0x20, + 0x70, 0x43, 0x6d, 0x64, 0x44, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x30, + 0x78, 0x25, 0x70, 0x2c, 0x20, 0x70, 0x70, 0x43, 0x6d, 0x64, 0x20, 0x3d, + 0x20, 0x30, 0x78, 0x25, 0x70, 0x2c, 0x20, 0x70, 0x43, 0x75, 0x72, 0x4d, + 0x62, 0x6f, 0x78, 0x4c, 0x69, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x30, 0x78, + 0x25, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00, 0x00, + 0x50, 0x49, 0x4e, 0x47, 0x3a, 0x20, 0x25, 0x58, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x66, 0x65, 0x50, 0x77, 0x72, 0x4d, 0x74, + 0x72, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x57, 0x61, 0x69, 0x74, + 0x46, 0x6f, 0x72, 0x53, 0x73, 0x62, 0x53, 0x79, 0x6e, 0x63, 0x48, 0x61, + 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x66, 0x65, 0x20, 0x6c, 0x6f, 0x67, 0x20, + 0x6d, 0x61, 0x73, 0x6b, 0x20, 0x73, 0x65, 0x74, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x00, 0x00, 0x54, 0x78, 0x6c, 0x6f, 0x6c, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x47, 0x65, 0x74, 0x20, 0x73, 0x65, 0x74, 0x20, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x54, 0x78, 0x6c, 0x6f, 0x6c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, + 0x47, 0x65, 0x74, 0x20, 0x73, 0x65, 0x74, 0x20, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, + 0x49, 0x44, 0x3a, 0x20, 0x30, 0x78, 0x25, 0x58, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x86, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0xe0, 0xff, 0xe0, 0xff, + 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, + 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xa1, 0x00, 0xe0, 0xff, + 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, + 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, + 0xe0, 0xff, 0xe0, 0xff, 0x98, 0x00, 0x9b, 0x00, 0x6e, 0x00, 0xe0, 0xff, + 0x7c, 0x00, 0x11, 0x00, 0x29, 0x00, 0x38, 0x00, 0x3a, 0x00, 0xa3, 0x00, + 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x00, 0x52, 0x00, 0xa7, 0x00, 0xb2, 0x00, 0xb5, 0x00, + 0xb9, 0x00, 0xc6, 0x00, 0xcc, 0x00, 0xd9, 0x00, 0xe5, 0x00, 0xe8, 0x00, + 0xec, 0x00, 0xf2, 0x00, 0x02, 0x01, 0x5f, 0x00, 0x6a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x50, 0x6f, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4b, 0x20, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x00, 0x00, 0x00, 0x42, 0x61, 0x64, 0x20, 0x4d, 0x61, 0x69, 0x6c, + 0x62, 0x6f, 0x78, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, + 0x6c, 0x62, 0x6f, 0x78, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2f, + 0x6c, 0x69, 0x6e, 0x6b, 0x3a, 0x20, 0x25, 0x64, 0x2c, 0x20, 0x6d, 0x62, + 0x6f, 0x78, 0x4c, 0x69, 0x6e, 0x6b, 0x3a, 0x20, 0x25, 0x64, 0x00, 0x00, + 0x4e, 0x75, 0x6c, 0x6c, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x20, 0x69, 0x6e, 0x20, 0x6d, 0x61, 0x69, 0x6c, 0x62, 0x6f, 0x78, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x00, 0x00, 0x52, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x20, 0x6d, 0x61, 0x69, 0x6c, 0x62, 0x6f, 0x78, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x3a, 0x20, 0x25, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x54, 0x69, 0x6d, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x77, 0x61, + 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x00, 0x00, 0x00, 0x4f, 0x53, 0x20, 0x66, + 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x20, 0x67, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x53, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x63, 0x6d, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x97, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x61, 0x70, 0x20, + 0x62, 0x75, 0x66, 0x20, 0x6d, 0x74, 0x78, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x63, 0x6c, 0x67, 0x63, 0x20, 0x72, 0x65, 0x71, 0x2c, 0x20, 0x74, 0x78, + 0x43, 0x68, 0x3a, 0x25, 0x64, 0x00, 0x00, 0x00, 0x52, 0x53, 0x53, 0x49, + 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2f, 0x77, 0x61, 0x69, 0x74, 0x2f, + 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x20, 0x64, 0x65, 0x6c, + 0x61, 0x79, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x75, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x20, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x20, 0x30, 0x78, + 0x25, 0x58, 0x2c, 0x20, 0x77, 0x61, 0x69, 0x74, 0x44, 0x65, 0x6c, 0x61, + 0x79, 0x20, 0x30, 0x78, 0x25, 0x58, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x44, 0x65, 0x6c, 0x61, 0x79, 0x20, 0x30, 0x78, 0x25, 0x58, 0x2e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x52, 0x53, 0x53, 0x49, 0x20, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x2f, 0x77, 0x61, 0x69, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x74, + 0x69, 0x6e, 0x75, 0x65, 0x20, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x20, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x46, 0x44, 0x44, 0x2e, 0x20, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x20, 0x30, + 0x78, 0x25, 0x58, 0x2c, 0x20, 0x77, 0x61, 0x69, 0x74, 0x44, 0x65, 0x6c, + 0x61, 0x79, 0x20, 0x30, 0x78, 0x25, 0x58, 0x2c, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x20, 0x30, 0x78, 0x25, 0x58, 0x2e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x53, 0x53, 0x49, + 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2f, 0x77, 0x61, 0x69, 0x74, 0x2f, + 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x20, 0x64, 0x65, 0x6c, + 0x61, 0x79, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x75, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x20, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x20, 0x30, 0x78, + 0x25, 0x58, 0x2c, 0x20, 0x77, 0x61, 0x69, 0x74, 0x44, 0x65, 0x6c, 0x61, + 0x79, 0x20, 0x30, 0x78, 0x25, 0x58, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x44, 0x65, 0x6c, 0x61, 0x79, 0x20, 0x30, 0x78, 0x25, 0x58, 0x2e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x53, 0x53, 0x49, 0x20, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x2f, 0x77, 0x61, 0x69, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x74, + 0x69, 0x6e, 0x75, 0x65, 0x20, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x20, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x46, 0x44, 0x44, 0x2e, 0x20, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x20, 0x30, + 0x78, 0x25, 0x58, 0x2c, 0x20, 0x77, 0x61, 0x69, 0x74, 0x44, 0x65, 0x6c, + 0x61, 0x79, 0x20, 0x30, 0x78, 0x25, 0x58, 0x2c, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x20, 0x30, 0x78, 0x25, 0x58, 0x2e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x57, 0x52, 0x5f, + 0x4d, 0x54, 0x52, 0x5f, 0x44, 0x50, 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x4f, + 0x55, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x42, 0x41, 0x43, 0x4b, 0x3a, + 0x20, 0x63, 0x68, 0x61, 0x6e, 0x4d, 0x61, 0x73, 0x6b, 0x20, 0x25, 0x58, + 0x00, 0x00, 0x00, 0x00, 0xcc, 0x00, 0xb9, 0x00, 0xea, 0x00, 0x31, 0x01, + 0x98, 0x00, 0x82, 0x00, 0x70, 0x00, 0x68, 0x00, 0x60, 0x00, 0x56, 0x00, + 0x4e, 0x00, 0x46, 0x00, 0x3c, 0x00, 0x2c, 0x00, 0x24, 0x00, 0x1a, 0x00, + 0x12, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xf0, 0xff, 0xf0, 0xff, + 0xf0, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xf0, 0xff, + 0xf0, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xf0, 0xff, + 0xf0, 0xff, 0x47, 0x01, 0x1c, 0x01, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x47, 0x65, 0x74, 0x20, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4f, 0x72, 0x78, 0x3a, 0x25, 0x75, 0x20, 0x43, + 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x44, 0x6f, 0x6e, 0x65, 0x20, + 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x61, 0x66, 0x74, 0x65, + 0x72, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x61, 0x62, 0x6f, 0x72, + 0x74, 0x20, 0x68, 0x61, 0x73, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x72, 0x78, 0x3a, + 0x25, 0x75, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, + 0x70, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, + 0x61, 0x62, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x20, + 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x55, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x5f, 0x61, 0x64, 0x69, 0x5f, 0x64, 0x72, 0x76, 0x5f, + 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x5f, 0x65, 0x20, 0x62, 0x75, 0x66, 0x2e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5f, 0x61, 0x64, 0x69, 0x5f, 0x73, 0x76, 0x63, + 0x5f, 0x44, 0x66, 0x65, 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x4e, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x28, 0x29, 0x20, 0x66, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x61, 0x64, 0x69, + 0x5f, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4e, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x53, 0x64, 0x6b, 0x28, 0x29, 0x20, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x55, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x54, + 0x78, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x61, 0x62, + 0x6f, 0x72, 0x74, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x62, 0x6f, 0x72, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x70, 0x70, 0x20, 0x6c, + 0x61, 0x79, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x73, 0x63, + 0x61, 0x72, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6e, 0x6f, 0x20, 0x6f, 0x6e, + 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, + 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x78, 0x43, 0x68, 0x25, 0x64, + 0x2c, 0x20, 0x72, 0x65, 0x71, 0x49, 0x64, 0x3a, 0x25, 0x6c, 0x75, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5f, 0x61, 0x64, 0x69, 0x5f, 0x73, 0x76, 0x63, + 0x5f, 0x44, 0x66, 0x65, 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x50, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x28, 0x29, + 0x20, 0x6c, 0x61, 0x63, 0x6b, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2e, 0x00, + 0x5f, 0x61, 0x64, 0x69, 0x5f, 0x73, 0x76, 0x63, 0x5f, 0x44, 0x66, 0x65, + 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0x20, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x6b, 0x20, + 0x63, 0x61, 0x70, 0x20, 0x62, 0x75, 0x66, 0x20, 0x6d, 0x74, 0x78, 0x20, + 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6e, + 0x65, 0x78, 0x74, 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x2c, + 0x20, 0x74, 0x78, 0x43, 0x68, 0x3a, 0x25, 0x64, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4f, 0x72, 0x78, 0x20, 0x25, 0x75, 0x20, 0x2d, + 0x20, 0x55, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, + 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x45, 0x6e, 0x64, 0x20, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, + 0x20, 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x50, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x49, 0x6e, 0x20, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4f, 0x72, 0x78, 0x20, 0x25, 0x75, 0x20, 0x2d, 0x20, 0x55, 0x6e, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x43, 0x61, 0x70, 0x74, + 0x75, 0x72, 0x65, 0x20, 0x45, 0x61, 0x72, 0x6c, 0x79, 0x20, 0x45, 0x6e, + 0x64, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x20, 0x77, 0x68, 0x69, + 0x6c, 0x65, 0x20, 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x50, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x49, 0x6e, 0x20, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x4f, 0x52, 0x58, 0x31, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x4f, 0x52, 0x58, 0x32, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x42, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x20, 0x49, 0x44, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x00, + 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x42, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x20, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x2d, 0x20, 0x4f, 0x72, + 0x78, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x61, 0x70, 0x74, + 0x75, 0x72, 0x65, 0x20, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x4c, + 0x6f, 0x63, 0x6b, 0x20, 0x2d, 0x20, 0x4f, 0x72, 0x78, 0x31, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x6c, + 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x61, 0x70, 0x20, 0x62, 0x75, 0x66, 0x20, + 0x6d, 0x74, 0x78, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x64, 0x70, 0x64, 0x20, + 0x72, 0x65, 0x71, 0x2c, 0x20, 0x74, 0x78, 0x43, 0x68, 0x3a, 0x25, 0x64, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x6c, + 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x61, 0x70, 0x20, 0x62, 0x75, 0x66, 0x20, + 0x6d, 0x74, 0x78, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x69, 0x67, 0x20, + 0x73, 0x74, 0x61, 0x74, 0x20, 0x72, 0x65, 0x71, 0x2c, 0x20, 0x74, 0x78, + 0x43, 0x68, 0x3a, 0x25, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x6b, 0x20, + 0x63, 0x61, 0x70, 0x20, 0x62, 0x75, 0x66, 0x20, 0x6d, 0x74, 0x78, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x6f, 0x70, 0x20, 0x6f, 0x6e, 0x20, + 0x70, 0x61, 0x73, 0x73, 0x20, 0x72, 0x65, 0x71, 0x2c, 0x20, 0x74, 0x78, + 0x43, 0x68, 0x3a, 0x25, 0x64, 0x00, 0x00, 0x00, 0x43, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x61, 0x70, 0x20, + 0x62, 0x75, 0x66, 0x20, 0x6d, 0x74, 0x78, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x76, 0x73, 0x77, 0x72, 0x20, 0x72, 0x65, 0x71, 0x2c, 0x20, 0x63, 0x68, + 0x3a, 0x25, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x61, 0x70, 0x20, + 0x62, 0x75, 0x66, 0x20, 0x6d, 0x74, 0x78, 0x20, 0x74, 0x6f, 0x20, 0x64, + 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x2c, 0x20, 0x63, 0x68, 0x3a, 0x25, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x65, 0x74, 0x20, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, + 0x2c, 0x20, 0x4f, 0x72, 0x78, 0x20, 0x43, 0x68, 0x20, 0x31, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x47, 0x65, 0x74, 0x20, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x4f, 0x72, + 0x78, 0x20, 0x43, 0x68, 0x20, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5f, 0x61, 0x64, 0x69, 0x5f, 0x73, 0x76, 0x63, 0x5f, 0x44, 0x66, 0x65, + 0x41, 0x64, 0x61, 0x70, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0x20, + 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x75, 0x6e, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x2e, 0x00, 0x00, 0x5f, 0x61, 0x64, 0x69, 0x5f, 0x73, 0x76, 0x63, + 0x5f, 0x44, 0x66, 0x65, 0x41, 0x64, 0x61, 0x70, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x57, 0x6f, 0x72, + 0x6b, 0x28, 0x29, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x2e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x61, 0x64, 0x61, 0x70, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x73, 0x76, 0x63, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x64, 0x61, 0x70, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x53, 0x76, 0x63, 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, + 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x03, 0x04, 0x01, + 0x06, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x03, 0x03, 0x04, 0x01, 0x06, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x03, 0x03, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x03, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x03, 0x03, 0x04, 0x00, 0x06, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x03, 0x03, 0x04, 0x01, 0x06, 0x00, 0x02, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x03, 0x04, 0x01, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x03, 0x03, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xfa, 0xff, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0xf7, 0xff, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xe4, 0xff, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0xc3, 0xff, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, + 0x94, 0xff, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0x59, 0xff, 0x00, 0x00, + 0xc6, 0x00, 0x00, 0x00, 0x1c, 0xff, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, + 0xef, 0xfe, 0x00, 0x00, 0x1a, 0x01, 0x00, 0x00, 0xe9, 0xfe, 0x00, 0x00, + 0x03, 0x01, 0x00, 0x00, 0x25, 0xff, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, + 0xc4, 0xff, 0x00, 0x00, 0xba, 0xff, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, + 0x2d, 0xfe, 0x00, 0x00, 0xf8, 0x02, 0x00, 0x00, 0x83, 0xfb, 0x00, 0x00, + 0x93, 0x06, 0x00, 0x00, 0x59, 0xf6, 0x00, 0x00, 0xd9, 0x0e, 0x00, 0x00, + 0xb8, 0xe5, 0x00, 0x00, 0x36, 0x51, 0x00, 0x00, 0x42, 0x6f, 0x74, 0x68, + 0x20, 0x6c, 0x75, 0x74, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x62, 0x79, 0x70, 0x61, 0x73, 0x73, 0x20, 0x61, + 0x63, 0x74, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x66, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x66, 0x65, 0x53, + 0x76, 0x63, 0x4c, 0x75, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x65, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x75, 0x74, 0x43, + 0x6f, 0x70, 0x79, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x69, 0x6e, 0x67, 0x54, + 0x68, 0x72, 0x65, 0x61, 0x64, 0x00, 0x00, 0x00, 0x46, 0x61, 0x69, 0x6c, + 0x75, 0x72, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x74, 0x20, 0x54, + 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, 0x20, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x20, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x20, 0x46, 0x6c, 0x61, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x54, 0x44, + 0x44, 0x20, 0x4c, 0x55, 0x54, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x20, 0x44, + 0x4d, 0x41, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x61, 0x69, 0x6c, + 0x75, 0x72, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x43, 0x6f, 0x72, 0x65, + 0x20, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x74, 0x6f, 0x20, 0x63, + 0x6f, 0x70, 0x79, 0x20, 0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, + 0x79, 0x20, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x20, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x46, 0x6c, 0x61, 0x67, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x54, 0x44, 0x44, 0x20, 0x4c, 0x55, 0x54, 0x20, 0x43, + 0x6f, 0x70, 0x79, 0x20, 0x44, 0x4d, 0x41, 0x20, 0x69, 0x6e, 0x74, 0x6f, + 0x20, 0x4c, 0x69, 0x76, 0x65, 0x20, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x20, 0x46, 0x6c, 0x61, 0x67, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x20, 0x44, 0x4d, 0x41, 0x20, + 0x61, 0x74, 0x20, 0x54, 0x78, 0x4f, 0x66, 0x66, 0x20, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x4d, 0x41, 0x20, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x45, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x69, 0x6e, 0x20, 0x46, 0x44, 0x44, 0x20, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x00, 0x4c, 0x75, 0x74, 0x20, 0x63, 0x6f, 0x70, 0x79, + 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x69, 0x74, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x75, 0x74, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x64, 0x6f, 0x6e, + 0x65, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x70, 0x70, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x00, 0x00, 0x4c, 0x75, 0x74, 0x20, 0x63, 0x6f, 0x70, 0x79, + 0x20, 0x48, 0x57, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x72, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x70, 0x70, 0x20, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x75, 0x74, 0x20, + 0x63, 0x6f, 0x70, 0x79, 0x20, 0x22, 0x49, 0x6e, 0x20, 0x50, 0x72, 0x6f, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x20, 0x54, 0x58, 0x4f, 0x4e, 0x22, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x70, 0x70, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x75, 0x74, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, + 0x61, 0x70, 0x70, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5f, 0x61, 0x64, 0x69, 0x5f, 0x73, 0x76, 0x63, + 0x5f, 0x44, 0x66, 0x65, 0x41, 0x63, 0x74, 0x75, 0x61, 0x74, 0x6f, 0x72, + 0x43, 0x6f, 0x70, 0x79, 0x54, 0x6f, 0x4c, 0x75, 0x74, 0x44, 0x4d, 0x41, + 0x53, 0x65, 0x74, 0x75, 0x70, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x44, 0x4d, 0x41, 0x20, + 0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, 0x59, 0x20, 0x52, 0x55, 0x4e, 0x4e, + 0x49, 0x4e, 0x47, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, + 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x44, 0x46, 0x45, 0x20, 0x41, 0x63, + 0x74, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x44, 0x4d, 0x41, 0x20, 0x61, + 0x66, 0x74, 0x65, 0x72, 0x20, 0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, 0x59, + 0x20, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x00, 0x00, 0x5f, 0x61, 0x64, 0x69, 0x5f, 0x73, 0x76, 0x63, + 0x5f, 0x44, 0x66, 0x65, 0x41, 0x63, 0x74, 0x75, 0x61, 0x74, 0x6f, 0x72, + 0x43, 0x6f, 0x70, 0x79, 0x54, 0x6f, 0x4c, 0x75, 0x74, 0x44, 0x4d, 0x41, + 0x53, 0x65, 0x74, 0x75, 0x70, 0x28, 0x29, 0x20, 0x66, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x00, 0x00, 0x4c, 0x75, 0x74, 0x20, 0x63, 0x6f, 0x70, 0x79, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, + 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x4c, 0x75, 0x74, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x65, + 0x74, 0x20, 0x44, 0x4d, 0x41, 0x20, 0x44, 0x6f, 0x6e, 0x65, 0x2f, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x20, 0x44, 0x46, 0x45, 0x20, + 0x41, 0x63, 0x74, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x44, 0x4d, 0x41, + 0x20, 0x49, 0x4e, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x20, + 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x00, 0x00, 0x00, 0x00, + 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x44, 0x46, 0x45, 0x20, 0x41, 0x63, + 0x74, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x44, 0x4d, 0x41, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x20, 0x4c, 0x55, 0x54, 0x20, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x53, 0x65, 0x6d, 0x61, 0x70, 0x68, + 0x6f, 0x72, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x69, 0x6d, 0x65, + 0x64, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, + 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x44, 0x4d, 0x41, 0x20, 0x44, 0x6f, + 0x6e, 0x65, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0x43, 0x20, + 0x46, 0x61, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x25, 0x64, 0x00, 0x00, 0x00, + 0x44, 0x6d, 0x61, 0x44, 0x72, 0x76, 0x4d, 0x75, 0x74, 0x65, 0x78, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd0, 0xea, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x18, 0xeb, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x60, 0xeb, 0x05, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xa8, 0xeb, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xec, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xed, 0x05, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0xed, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xc8, 0xec, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xed, 0x05, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xed, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xed, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x58, 0xed, 0x05, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0xeb, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x38, 0xec, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x61, 0x64, 0x69, + 0x6f, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x72, 0x20, + 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x4f, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x50, 0x4f, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x70, 0x4f, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x90, 0x4f, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0x4f, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x4f, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x4f, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x50, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x50, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x50, 0x50, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x50, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x90, 0x50, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xb0, 0x50, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xd0, 0x50, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x50, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x51, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x51, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x51, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x51, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x51, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x51, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xd0, 0x51, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x51, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x52, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x52, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x50, 0x52, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x70, 0x52, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0x52, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x52, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x52, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x53, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x54, 0x73, 0x73, 0x69, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x3a, + 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x3a, 0x20, 0x63, 0x68, 0x25, + 0x64, 0x2c, 0x20, 0x6d, 0x25, 0x64, 0x2c, 0x20, 0x65, 0x25, 0x64, 0x2c, + 0x20, 0x65, 0x72, 0x72, 0x3a, 0x20, 0x25, 0x58, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x20, 0x6c, 0x6f, + 0x63, 0x6b, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x00, 0x00, 0x00, + 0x70, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, + 0x6d, 0x75, 0x74, 0x65, 0x78, 0x20, 0x75, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x00, 0x53, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x20, 0x72, 0x61, 0x74, 0x65, 0x20, 0x69, 0x73, 0x20, 0x30, + 0x2c, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x61, 0x6c, + 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x54, 0x53, 0x53, 0x49, 0x20, + 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x64, 0x69, 0x76, 0x20, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x00, 0x54, 0x53, 0x53, 0x49, 0x20, 0x74, 0x69, 0x6d, + 0x65, 0x72, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, 0x63, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x64, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x6d, + 0x25, 0x64, 0x2c, 0x20, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x20, 0x25, 0x64, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x53, 0x53, 0x49, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x3a, 0x20, 0x63, 0x68, 0x25, + 0x64, 0x2c, 0x20, 0x6d, 0x25, 0x64, 0x2c, 0x20, 0x74, 0x69, 0x63, 0x6b, + 0x73, 0x20, 0x25, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5f, 0x61, 0x64, 0x69, 0x5f, 0x64, 0x72, 0x76, 0x5f, 0x52, 0x73, 0x73, + 0x69, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, + 0x63, 0x6b, 0x5f, 0x46, 0x75, 0x6e, 0x63, 0x3a, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x2c, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x6d, 0x25, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x78, 0x20, 0x54, + 0x73, 0x73, 0x69, 0x20, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x20, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x20, 0x6d, + 0x75, 0x74, 0x65, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x78, 0x20, 0x74, 0x73, 0x73, 0x69, 0x20, 0x70, 0x6f, 0x77, 0x65, + 0x72, 0x20, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x74, 0x65, + 0x78, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x00, 0x74, 0x73, 0x73, 0x69, 0x20, 0x74, 0x69, 0x6d, + 0x65, 0x72, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, + 0x6d, 0x25, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0x72, 0x78, 0x20, + 0x54, 0x73, 0x73, 0x69, 0x20, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x20, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x20, + 0x6d, 0x75, 0x74, 0x65, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6f, 0x72, 0x78, 0x20, 0x74, 0x73, 0x73, 0x69, 0x20, 0x70, 0x6f, 0x77, + 0x65, 0x72, 0x20, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x74, + 0x65, 0x78, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x52, 0x78, 0x20, 0x52, 0x53, 0x53, 0x49, 0x20, 0x70, 0x6f, 0x77, 0x65, + 0x72, 0x20, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x64, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x52, 0x78, 0x20, 0x52, 0x53, 0x53, 0x49, 0x20, + 0x70, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, + 0x6d, 0x75, 0x74, 0x65, 0x78, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x00, 0x52, 0x53, 0x53, 0x49, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x3a, 0x20, 0x63, 0x68, + 0x25, 0x64, 0x2c, 0x20, 0x6d, 0x25, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x78, 0x20, 0x64, 0x70, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x6f, + 0x77, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x64, 0x72, + 0x69, 0x76, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x64, 0x70, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x70, + 0x6f, 0x77, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x6d, + 0x75, 0x74, 0x65, 0x78, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, + 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x00, 0x00, 0x74, 0x78, 0x20, 0x64, + 0x70, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x70, 0x6f, 0x77, 0x65, 0x72, + 0x20, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x64, 0x72, 0x69, 0x76, 0x65, + 0x72, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x64, 0x70, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x70, 0x6f, 0x77, 0x65, + 0x72, 0x20, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x74, 0x65, + 0x78, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x00, 0x74, 0x78, 0x20, 0x63, 0x61, 0x72, 0x72, 0x69, + 0x65, 0x72, 0x20, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x64, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x00, 0x00, 0x00, + 0x74, 0x78, 0x20, 0x63, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x20, 0x70, + 0x6f, 0x77, 0x65, 0x72, 0x20, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x20, + 0x6d, 0x75, 0x74, 0x65, 0x78, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x00, 0x00, 0x00, 0x00, 0x64, 0x70, 0x64, 0x20, 0x70, 0x6f, 0x77, 0x65, + 0x72, 0x20, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x72, 0x75, 0x70, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x00, 0x6f, 0x72, 0x78, 0x20, + 0x74, 0x73, 0x73, 0x69, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x6d, 0x25, 0x64, 0x00, + 0x54, 0x73, 0x73, 0x69, 0x2a, 0x43, 0x78, 0x4d, 0x79, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5f, 0x61, 0x64, 0x69, 0x5f, 0x64, 0x72, 0x76, + 0x5f, 0x54, 0x73, 0x73, 0x69, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x43, 0x61, + 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x46, 0x75, 0x6e, 0x63, 0x3a, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x63, 0x68, 0x25, 0x64, + 0x2c, 0x20, 0x6d, 0x25, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x06, 0x02, 0x06, 0x06, 0x06, 0x03, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x00, 0x65, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x65, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x66, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x80, 0x66, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x66, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x67, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x67, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x67, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x67, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x68, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x68, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x68, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0x22, 0x01, 0x00, 0x00, + 0x27, 0x01, 0x00, 0x00, 0x28, 0x01, 0x00, 0x00, 0x2d, 0x01, 0x00, 0x00, + 0x2e, 0x01, 0x00, 0x00, 0x33, 0x01, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, + 0x39, 0x01, 0x00, 0x00, 0x3a, 0x01, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, + 0x40, 0x01, 0x00, 0x00, 0x45, 0x01, 0x00, 0x00, 0x46, 0x01, 0x00, 0x00, + 0x4b, 0x01, 0x00, 0x00, 0x4c, 0x01, 0x00, 0x00, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x20, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x64, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x58, 0x61, 0x63, 0x63, 0x20, 0x64, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x72, 0x75, 0x70, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x0a, 0x00, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x64, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x64, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x20, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x3a, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x25, 0x58, 0x2c, + 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, + 0x20, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x25, 0x78, 0x2c, 0x20, + 0x6c, 0x61, 0x73, 0x74, 0x3a, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4e, + 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x25, 0x64, 0x2c, 0x20, 0x63, 0x6f, 0x72, + 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4e, 0x75, 0x6d, 0x20, 0x3d, + 0x20, 0x25, 0x64, 0x2c, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x0a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x74, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4e, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x25, + 0x64, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x69, 0x6c, + 0x62, 0x6f, 0x78, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x2c, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x30, 0x78, + 0x25, 0x30, 0x38, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x61, 0x69, 0x6c, 0x62, 0x6f, 0x78, 0x20, 0x65, 0x78, 0x63, 0x65, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x25, 0x64, 0x2c, 0x20, 0x25, + 0x78, 0x2c, 0x20, 0x25, 0x78, 0x2c, 0x20, 0x61, 0x64, 0x64, 0x72, 0x3a, + 0x20, 0x25, 0x6c, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x61, 0x69, 0x6c, 0x62, 0x6f, 0x78, 0x20, 0x6d, 0x75, 0x74, 0x65, + 0x78, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x69, 0x6c, 0x62, 0x6f, 0x78, 0x20, + 0x6d, 0x75, 0x74, 0x65, 0x78, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x2c, 0x20, 0x68, 0x61, 0x6e, + 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x58, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x69, 0x6c, 0x62, 0x6f, 0x78, 0x20, + 0x6d, 0x75, 0x74, 0x65, 0x78, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x2c, 0x20, + 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, + 0x58, 0x00, 0x00, 0x00, 0x41, 0x43, 0x4b, 0x20, 0x74, 0x69, 0x6d, 0x65, + 0x64, 0x20, 0x6f, 0x75, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x8e, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x9e, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xae, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xbe, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xce, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xde, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xee, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xfe, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x06, 0x61, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa4, 0x16, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x61, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x61, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x0e, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1e, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x2e, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x3e, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x4e, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x5e, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x6e, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x7e, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0e, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0c, 0x1e, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x2e, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x3e, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0c, 0x4e, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x5e, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x6e, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0c, 0x7e, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x16, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x27, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x46, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x57, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x76, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x14, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x44, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x74, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x02, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x12, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x22, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x32, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x42, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x52, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x62, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x72, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x8b, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x9b, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xab, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0xbb, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xcb, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xdb, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0xeb, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xfb, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x8b, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0c, 0x9b, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xab, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xbb, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0c, 0xcb, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xdb, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xeb, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0c, 0xfb, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x8e, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x9e, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xae, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbe, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xce, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xa0, 0xde, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xee, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xfe, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x8e, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xbe, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xce, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xee, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x8e, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x9e, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xae, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbe, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0xce, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xde, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xee, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0xfe, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xac, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xdc, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x8d, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9d, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xbd, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcd, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xed, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x8f, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x90, 0x9f, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xaf, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xbf, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x90, 0xcf, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xdf, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xef, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x90, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xa4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xd4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x83, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xb3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf3, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xb1, 0x00, 0x00, 0x00, 0x00, + 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x20, 0x30, 0x5f, 0x33, 0x20, 0x64, 0x72, 0x69, 0x76, 0x65, + 0x72, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x00, 0x63, 0x61, 0x70, 0x74, + 0x75, 0x72, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x34, + 0x5f, 0x37, 0x20, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x20, 0x6d, 0x75, + 0x74, 0x65, 0x78, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x50, 0x44, 0x2d, + 0x43, 0x54, 0x20, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x20, 0x6d, 0x75, + 0x74, 0x65, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x70, 0x64, 0x20, + 0x61, 0x63, 0x74, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x64, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x64, 0x70, 0x64, 0x20, 0x6c, 0x75, 0x74, 0x20, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x84, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xb7, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xb7, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xb4, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, 0x74, 0x63, + 0x68, 0x64, 0x6f, 0x67, 0x20, 0x30, 0x20, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x65, 0x64, 0x2e, 0x20, 0x50, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x6c, 0x6f, 0x63, 0x6b, + 0x75, 0x70, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x2e, + 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, 0x74, 0x63, 0x68, 0x64, 0x6f, 0x67, + 0x20, 0x33, 0x20, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, 0x74, 0x63, 0x68, 0x64, 0x6f, 0x67, + 0x20, 0x31, 0x20, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x2e, 0x20, + 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x6c, + 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x65, + 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x6d, 0x61, + 0x79, 0x20, 0x62, 0x65, 0x20, 0x64, 0x65, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x64, 0x2e, 0x00, 0x00, 0x57, 0x61, 0x74, 0x63, 0x68, 0x64, 0x6f, 0x67, + 0x20, 0x32, 0x20, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, + 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, + 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x00, 0x00, + 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x20, 0x77, 0x61, 0x74, 0x63, + 0x68, 0x64, 0x6f, 0x67, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, + 0x70, 0x74, 0x0a, 0x00, 0xfc, 0xa9, 0xf1, 0xd2, 0x4d, 0x62, 0x00, 0x3f, + 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x18, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x18, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x18, 0x03, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x18, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xa0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, + 0x45, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, + 0x60, 0xff, 0xff, 0xff, 0xff, 0x05, 0x60, 0xff, 0xff, 0xff, 0xff, 0x05, + 0x60, 0xff, 0xff, 0xff, 0xff, 0x05, 0x60, 0xff, 0xff, 0xff, 0xff, 0x05, + 0x60, 0xff, 0xff, 0xff, 0xff, 0x05, 0x60, 0xff, 0xff, 0xff, 0xff, 0x05, + 0x60, 0xff, 0xff, 0xff, 0xff, 0x05, 0x60, 0xff, 0xff, 0xff, 0xff, 0x05, + 0x60, 0xff, 0xff, 0xff, 0xff, 0x05, 0x60, 0xff, 0xff, 0xff, 0xff, 0x05, + 0x60, 0xff, 0xff, 0xff, 0xff, 0x05, 0x60, 0xff, 0xff, 0xff, 0xff, 0x05, + 0x60, 0xff, 0xff, 0xff, 0xff, 0x05, 0x60, 0xff, 0xff, 0xff, 0xff, 0x05, + 0x60, 0xff, 0xff, 0xff, 0xff, 0x05, 0x60, 0xff, 0xff, 0xff, 0xff, 0x05, + 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x44, 0xff, 0xff, 0xff, 0xff, 0x00, 0x44, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x60, 0xff, 0xff, 0xff, 0xff, 0x00, 0x44, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x44, 0xff, 0xff, 0xff, 0xff, 0x00, 0x44, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x44, 0xff, 0xff, 0xff, 0xff, 0x00, 0x44, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x44, 0xff, 0xff, 0xff, 0xff, 0x00, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xff, 0xff, 0x05, 0x00, 0x04, 0x40, 0xff, 0xff, 0x00, 0x01, 0x04, + 0x40, 0xff, 0xff, 0x00, 0x00, 0x04, 0x40, 0xff, 0xff, 0x05, 0x01, 0x04, + 0x40, 0xff, 0xff, 0x00, 0x03, 0x04, 0x40, 0xff, 0xff, 0x00, 0x02, 0x04, + 0x40, 0xff, 0xff, 0x05, 0x02, 0x04, 0x40, 0xff, 0xff, 0x00, 0x05, 0x04, + 0x40, 0xff, 0xff, 0x00, 0x04, 0x04, 0x40, 0xff, 0xff, 0x05, 0x03, 0x04, + 0x40, 0xff, 0xff, 0x00, 0x07, 0x04, 0x40, 0xff, 0xff, 0x00, 0x06, 0x04, + 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, 0x44, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x40, 0xff, 0xff, 0x00, 0x08, 0x04, 0x40, 0xff, 0xff, 0x00, 0x09, 0x04, + 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x00, 0x00, 0xff, 0xff, 0x04, 0x70, 0x00, 0x01, 0xff, 0xff, 0x04, + 0x70, 0x00, 0x02, 0xff, 0xff, 0x04, 0x70, 0x00, 0x03, 0xff, 0xff, 0x04, + 0x70, 0x00, 0x04, 0xff, 0xff, 0x04, 0x50, 0x00, 0x05, 0xff, 0xff, 0x04, + 0x50, 0x00, 0x06, 0xff, 0xff, 0x04, 0x50, 0x00, 0x07, 0xff, 0xff, 0x04, + 0x50, 0x00, 0x08, 0xff, 0xff, 0x04, 0x50, 0x00, 0x09, 0xff, 0xff, 0x04, + 0x50, 0x00, 0x0a, 0xff, 0xff, 0x04, 0x50, 0x00, 0x0b, 0xff, 0xff, 0x04, + 0x50, 0x00, 0x0c, 0xff, 0xff, 0x04, 0x70, 0x00, 0x0d, 0xff, 0xff, 0x04, + 0x70, 0x00, 0x0e, 0xff, 0xff, 0x04, 0x70, 0x00, 0x0f, 0xff, 0xff, 0x04, + 0x70, 0x00, 0x10, 0xff, 0xff, 0x04, 0x70, 0x00, 0x11, 0xff, 0xff, 0x04, + 0x70, 0x00, 0x12, 0xff, 0xff, 0x04, 0x70, 0x00, 0x13, 0xff, 0xff, 0x04, + 0x70, 0x00, 0x14, 0xff, 0xff, 0x04, 0x70, 0x00, 0x15, 0xff, 0xff, 0x04, + 0x70, 0x00, 0x16, 0xff, 0xff, 0x04, 0x70, 0x00, 0x17, 0xff, 0xff, 0x04, + 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x40, 0xff, 0xff, 0xff, 0xff, 0x04, 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, 0x60, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x70, 0x00, 0x18, 0xff, 0xff, 0x04, 0x70, 0x00, 0x19, 0xff, 0xff, 0x04, + 0x70, 0x00, 0x1a, 0xff, 0xff, 0x04, 0x70, 0x00, 0x1b, 0xff, 0xff, 0x04, + 0x70, 0x00, 0x1c, 0xff, 0xff, 0x04, 0x70, 0x00, 0x1d, 0xff, 0xff, 0x04, + 0x70, 0x00, 0x1e, 0xff, 0xff, 0x04, 0x70, 0x00, 0x1f, 0xff, 0xff, 0x04, + 0x70, 0x01, 0x00, 0xff, 0xff, 0x04, 0x70, 0x01, 0x01, 0xff, 0xff, 0x04, + 0x70, 0x01, 0x02, 0xff, 0xff, 0x04, 0x70, 0x01, 0x03, 0xff, 0xff, 0x04, + 0x70, 0x01, 0x04, 0xff, 0xff, 0x04, 0x70, 0x01, 0x05, 0xff, 0xff, 0x04, + 0x70, 0x01, 0x06, 0xff, 0xff, 0x04, 0x70, 0x01, 0x07, 0xff, 0xff, 0x04, + 0x70, 0x01, 0x08, 0xff, 0xff, 0x04, 0x70, 0x01, 0x09, 0xff, 0xff, 0x04, + 0x70, 0x01, 0x0a, 0xff, 0xff, 0x04, 0x70, 0x01, 0x0b, 0xff, 0xff, 0x04, + 0x70, 0x01, 0x0c, 0xff, 0xff, 0x04, 0x70, 0x01, 0x0d, 0xff, 0xff, 0x04, + 0x70, 0x01, 0x0e, 0xff, 0xff, 0x04, 0x70, 0x01, 0x0f, 0xff, 0xff, 0x04, + 0x70, 0x01, 0x10, 0xff, 0xff, 0x04, 0x70, 0x01, 0x11, 0xff, 0xff, 0x04, + 0x70, 0x01, 0x12, 0xff, 0xff, 0x04, 0x70, 0x01, 0x13, 0xff, 0xff, 0x04, + 0x70, 0x01, 0x14, 0xff, 0xff, 0x04, 0x70, 0x01, 0x15, 0xff, 0xff, 0x04, + 0x70, 0x01, 0x16, 0xff, 0xff, 0x04, 0x70, 0x01, 0x17, 0xff, 0xff, 0x04, + 0x70, 0x01, 0x18, 0xff, 0xff, 0x04, 0x70, 0x01, 0x19, 0xff, 0xff, 0x04, + 0x70, 0x01, 0x1a, 0xff, 0xff, 0x04, 0x70, 0x01, 0x1b, 0xff, 0xff, 0x04, + 0x70, 0x01, 0x1c, 0xff, 0xff, 0x04, 0x70, 0x01, 0x1d, 0xff, 0xff, 0x04, + 0x70, 0x01, 0x1e, 0xff, 0xff, 0x04, 0x70, 0x01, 0x1f, 0xff, 0xff, 0x04, + 0x70, 0x02, 0x00, 0xff, 0xff, 0x04, 0x70, 0x02, 0x01, 0xff, 0xff, 0x04, + 0x70, 0x02, 0x02, 0xff, 0xff, 0x04, 0x70, 0x02, 0x03, 0xff, 0xff, 0x04, + 0x70, 0x02, 0x04, 0xff, 0xff, 0x04, 0x70, 0x02, 0x05, 0xff, 0xff, 0x04, + 0x70, 0x02, 0x06, 0xff, 0xff, 0x04, 0x70, 0x02, 0x07, 0xff, 0xff, 0x04, + 0x70, 0x02, 0x08, 0xff, 0xff, 0x04, 0x70, 0x02, 0x09, 0xff, 0xff, 0x04, + 0x70, 0x02, 0x0a, 0xff, 0xff, 0x04, 0x70, 0x02, 0x0b, 0xff, 0xff, 0x04, + 0x70, 0x02, 0x0c, 0xff, 0xff, 0x04, 0x70, 0x02, 0x0d, 0xff, 0xff, 0x04, + 0x70, 0x02, 0x0e, 0xff, 0xff, 0x04, 0x70, 0x02, 0x0f, 0xff, 0xff, 0x04, + 0x70, 0x02, 0x10, 0xff, 0xff, 0x04, 0x70, 0x02, 0x11, 0xff, 0xff, 0x04, + 0x70, 0x02, 0x12, 0xff, 0xff, 0x04, 0x70, 0x02, 0x13, 0xff, 0xff, 0x04, + 0x70, 0x02, 0x14, 0xff, 0xff, 0x04, 0x70, 0x02, 0x15, 0xff, 0xff, 0x04, + 0x70, 0x02, 0x16, 0xff, 0xff, 0x04, 0x70, 0x02, 0x17, 0xff, 0xff, 0x04, + 0x70, 0x02, 0x18, 0xff, 0xff, 0x04, 0x70, 0x02, 0x19, 0xff, 0xff, 0x04, + 0x70, 0x02, 0x1a, 0xff, 0xff, 0x04, 0x70, 0x02, 0x1b, 0xff, 0xff, 0x04, + 0x70, 0x02, 0x1c, 0xff, 0xff, 0x04, 0x70, 0x02, 0x1d, 0xff, 0xff, 0x04, + 0x70, 0x02, 0x1e, 0xff, 0xff, 0x04, 0x70, 0x02, 0x1f, 0xff, 0xff, 0x04, + 0x70, 0x03, 0x00, 0xff, 0xff, 0x04, 0x70, 0x03, 0x01, 0xff, 0xff, 0x04, + 0x70, 0x03, 0x02, 0xff, 0xff, 0x04, 0x70, 0x03, 0x03, 0xff, 0xff, 0x04, + 0x70, 0x03, 0x04, 0xff, 0xff, 0x04, 0x70, 0x03, 0x05, 0xff, 0xff, 0x04, + 0x70, 0x03, 0x06, 0xff, 0xff, 0x04, 0x70, 0x03, 0x07, 0xff, 0xff, 0x04, + 0x70, 0x03, 0x08, 0xff, 0xff, 0x04, 0x70, 0x03, 0x09, 0xff, 0xff, 0x04, + 0x70, 0x03, 0x0a, 0xff, 0xff, 0x04, 0x70, 0x03, 0x0b, 0xff, 0xff, 0x04, + 0x70, 0x03, 0x0c, 0xff, 0xff, 0x04, 0x70, 0x03, 0x0d, 0xff, 0xff, 0x04, + 0x70, 0x03, 0x0e, 0xff, 0xff, 0x04, 0x70, 0x03, 0x0f, 0xff, 0xff, 0x04, + 0x70, 0x03, 0x10, 0xff, 0xff, 0x04, 0x70, 0x03, 0x11, 0xff, 0xff, 0x04, + 0x70, 0x03, 0x12, 0xff, 0xff, 0x04, 0x70, 0x03, 0x13, 0xff, 0xff, 0x04, + 0x70, 0x03, 0x14, 0xff, 0xff, 0x04, 0x70, 0x03, 0x15, 0xff, 0xff, 0x04, + 0x70, 0x03, 0x16, 0xff, 0xff, 0x04, 0x70, 0x03, 0x17, 0xff, 0xff, 0x04, + 0x70, 0x03, 0x18, 0xff, 0xff, 0x04, 0x70, 0x03, 0x19, 0xff, 0xff, 0x04, + 0x70, 0x03, 0x1a, 0xff, 0xff, 0x04, 0x70, 0x03, 0x1b, 0xff, 0xff, 0x04, + 0x70, 0x03, 0x1c, 0xff, 0xff, 0x04, 0x70, 0x03, 0x1d, 0xff, 0xff, 0x04, + 0x70, 0x03, 0x1e, 0xff, 0xff, 0x04, 0x70, 0x03, 0x1f, 0xff, 0xff, 0x04, + 0x70, 0x04, 0x00, 0xff, 0xff, 0x04, 0x70, 0x04, 0x01, 0xff, 0xff, 0x04, + 0x70, 0x04, 0x02, 0xff, 0xff, 0x04, 0x70, 0x04, 0x03, 0xff, 0xff, 0x04, + 0x70, 0x04, 0x04, 0xff, 0xff, 0x04, 0x70, 0x04, 0x05, 0xff, 0xff, 0x04, + 0x70, 0x04, 0x06, 0xff, 0xff, 0x04, 0x70, 0x04, 0x07, 0xff, 0xff, 0x04, + 0x70, 0x04, 0x08, 0xff, 0xff, 0x04, 0x70, 0x04, 0x09, 0xff, 0xff, 0x04, + 0x70, 0x04, 0x0a, 0xff, 0xff, 0x04, 0x70, 0x04, 0x0b, 0xff, 0xff, 0x04, + 0x70, 0x04, 0x0c, 0xff, 0xff, 0x04, 0x70, 0x04, 0x0d, 0xff, 0xff, 0x04, + 0x70, 0x04, 0x0e, 0xff, 0xff, 0x04, 0x70, 0x04, 0x0f, 0xff, 0xff, 0x04, + 0x70, 0x04, 0x10, 0xff, 0xff, 0x04, 0x70, 0x04, 0x11, 0xff, 0xff, 0x04, + 0x70, 0x04, 0x12, 0xff, 0xff, 0x04, 0x70, 0x04, 0x13, 0xff, 0xff, 0x04, + 0x70, 0x04, 0x14, 0xff, 0xff, 0x04, 0x70, 0x04, 0x15, 0xff, 0xff, 0x04, + 0x70, 0x04, 0x16, 0xff, 0xff, 0x04, 0x70, 0x04, 0x17, 0xff, 0xff, 0x04, + 0x70, 0x04, 0x18, 0xff, 0xff, 0x04, 0x70, 0x04, 0x19, 0xff, 0xff, 0x04, + 0x70, 0x04, 0x1a, 0xff, 0xff, 0x04, 0x70, 0x04, 0x1b, 0xff, 0xff, 0x04, + 0x70, 0x04, 0x1c, 0xff, 0xff, 0x04, 0x70, 0x04, 0x1d, 0xff, 0xff, 0x04, + 0x70, 0x04, 0x1e, 0xff, 0xff, 0x04, 0x70, 0x04, 0x1f, 0xff, 0xff, 0x04, + 0x70, 0x05, 0x00, 0xff, 0xff, 0x04, 0x70, 0x05, 0x01, 0xff, 0xff, 0x04, + 0x70, 0x05, 0x02, 0xff, 0xff, 0x04, 0x70, 0x05, 0x03, 0xff, 0xff, 0x04, + 0x70, 0x05, 0x04, 0xff, 0xff, 0x04, 0x70, 0x05, 0x05, 0xff, 0xff, 0x04, + 0x70, 0x05, 0x06, 0xff, 0xff, 0x04, 0x70, 0x05, 0x07, 0xff, 0xff, 0x04, + 0x70, 0x05, 0x08, 0xff, 0xff, 0x04, 0x70, 0x05, 0x09, 0xff, 0xff, 0x04, + 0x70, 0x05, 0x0a, 0xff, 0xff, 0x04, 0x70, 0x05, 0x0b, 0xff, 0xff, 0x04, + 0x70, 0x05, 0x0c, 0xff, 0xff, 0x04, 0x70, 0x05, 0x0d, 0xff, 0xff, 0x04, + 0x70, 0x05, 0x0e, 0xff, 0xff, 0x04, 0x70, 0x05, 0x0f, 0xff, 0xff, 0x04, + 0x50, 0x05, 0x10, 0xff, 0xff, 0x04, 0x50, 0x05, 0x11, 0xff, 0xff, 0x04, + 0x50, 0x05, 0x12, 0xff, 0xff, 0x04, 0x50, 0x05, 0x13, 0xff, 0xff, 0x04, + 0x50, 0x05, 0x14, 0xff, 0xff, 0x04, 0x50, 0x05, 0x15, 0xff, 0xff, 0x04, + 0x50, 0x05, 0x16, 0xff, 0xff, 0x04, 0x50, 0x05, 0x17, 0xff, 0xff, 0x04, + 0x70, 0x05, 0x18, 0xff, 0xff, 0x04, 0x70, 0x05, 0x19, 0xff, 0xff, 0x04, + 0x70, 0x05, 0x1a, 0xff, 0xff, 0x04, 0x50, 0x05, 0x1b, 0xff, 0xff, 0x04, + 0x50, 0x05, 0x1c, 0xff, 0xff, 0x04, 0x50, 0x05, 0x1d, 0xff, 0xff, 0x04, + 0x70, 0x05, 0x1e, 0xff, 0xff, 0x04, 0x70, 0x05, 0x1f, 0xff, 0xff, 0x04, + 0x70, 0x06, 0x00, 0xff, 0xff, 0x04, 0x50, 0x06, 0x01, 0xff, 0xff, 0x04, + 0x50, 0x06, 0x02, 0xff, 0xff, 0x04, 0x50, 0x06, 0x03, 0xff, 0xff, 0x04, + 0x70, 0x06, 0x04, 0xff, 0xff, 0x04, 0x70, 0x06, 0x05, 0xff, 0xff, 0x04, + 0x70, 0x06, 0x06, 0xff, 0xff, 0x04, 0x50, 0x06, 0x07, 0xff, 0xff, 0x04, + 0x50, 0x06, 0x08, 0xff, 0xff, 0x04, 0x50, 0x06, 0x09, 0xff, 0xff, 0x04, + 0x70, 0x06, 0x0a, 0xff, 0xff, 0x04, 0x70, 0x06, 0x0b, 0xff, 0xff, 0x04, + 0x70, 0x06, 0x0c, 0xff, 0xff, 0x04, 0x50, 0x06, 0x0d, 0xff, 0xff, 0x04, + 0x50, 0x06, 0x0e, 0xff, 0xff, 0x04, 0x50, 0x06, 0x0f, 0xff, 0xff, 0x04, + 0x70, 0x06, 0x10, 0xff, 0xff, 0x04, 0x70, 0x06, 0x11, 0xff, 0xff, 0x04, + 0x70, 0x06, 0x12, 0xff, 0xff, 0x04, 0x50, 0x06, 0x13, 0xff, 0xff, 0x04, + 0x50, 0x06, 0x14, 0xff, 0xff, 0x04, 0x50, 0x06, 0x15, 0xff, 0xff, 0x04, + 0x70, 0x06, 0x16, 0xff, 0xff, 0x04, 0x70, 0x06, 0x17, 0xff, 0xff, 0x04, + 0x70, 0x06, 0x18, 0xff, 0xff, 0x04, 0x50, 0x06, 0x19, 0xff, 0xff, 0x04, + 0x50, 0x06, 0x1a, 0xff, 0xff, 0x04, 0x50, 0x06, 0x1b, 0xff, 0xff, 0x04, + 0x70, 0x06, 0x1c, 0xff, 0xff, 0x04, 0x70, 0x06, 0x1d, 0xff, 0xff, 0x04, + 0x70, 0x06, 0x1e, 0xff, 0xff, 0x04, 0x50, 0x06, 0x1f, 0xff, 0xff, 0x04, + 0x50, 0x07, 0x00, 0xff, 0xff, 0x04, 0x50, 0x07, 0x01, 0xff, 0xff, 0x04, + 0x70, 0x07, 0x02, 0xff, 0xff, 0x04, 0x70, 0x07, 0x03, 0xff, 0xff, 0x04, + 0x70, 0x07, 0x04, 0xff, 0xff, 0x04, 0x50, 0x07, 0x05, 0xff, 0xff, 0x04, + 0x50, 0x07, 0x06, 0xff, 0xff, 0x04, 0x50, 0x07, 0x07, 0xff, 0xff, 0x04, + 0x70, 0x07, 0x08, 0xff, 0xff, 0x04, 0x70, 0x07, 0x09, 0xff, 0xff, 0x04, + 0x70, 0x07, 0x0a, 0xff, 0xff, 0x04, 0x70, 0x07, 0x0b, 0xff, 0xff, 0x04, + 0x70, 0x07, 0x0c, 0xff, 0xff, 0x04, 0x70, 0x07, 0x0d, 0xff, 0xff, 0x04, + 0x70, 0x07, 0x0e, 0xff, 0xff, 0x04, 0x70, 0x07, 0x0f, 0xff, 0xff, 0x04, + 0x70, 0x07, 0x10, 0xff, 0xff, 0x04, 0x70, 0x07, 0x11, 0xff, 0xff, 0x04, + 0x70, 0x07, 0x12, 0xff, 0xff, 0x04, 0x70, 0x07, 0x13, 0xff, 0xff, 0x04, + 0x70, 0x07, 0x14, 0xff, 0xff, 0x04, 0x70, 0x07, 0x15, 0xff, 0xff, 0x04, + 0x70, 0x07, 0x16, 0xff, 0xff, 0x04, 0x70, 0x07, 0x17, 0xff, 0xff, 0x04, + 0x70, 0x07, 0x18, 0xff, 0xff, 0x04, 0x70, 0x07, 0x19, 0xff, 0xff, 0x04, + 0x70, 0x07, 0x1a, 0xff, 0xff, 0x04, 0x70, 0x07, 0x1b, 0xff, 0xff, 0x04, + 0x70, 0x07, 0x1c, 0xff, 0xff, 0x04, 0x70, 0x07, 0x1d, 0xff, 0xff, 0x04, + 0x70, 0x07, 0x1e, 0xff, 0xff, 0x04, 0x70, 0x07, 0x1f, 0xff, 0xff, 0x04, + 0x70, 0x08, 0x00, 0xff, 0xff, 0x04, 0x70, 0x08, 0x01, 0xff, 0xff, 0x04, + 0x70, 0x08, 0x02, 0xff, 0xff, 0x04, 0x70, 0x08, 0x03, 0xff, 0xff, 0x04, + 0x70, 0x08, 0x04, 0xff, 0xff, 0x04, 0x70, 0x08, 0x05, 0xff, 0xff, 0x04, + 0x70, 0x08, 0x06, 0xff, 0xff, 0x04, 0x70, 0x08, 0x07, 0xff, 0xff, 0x04, + 0x50, 0x08, 0x08, 0xff, 0xff, 0x04, 0x50, 0x08, 0x09, 0xff, 0xff, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0a, 0x00, 0x08, 0x0b, 0x00, 0x08, + 0x0c, 0x00, 0x08, 0x0d, 0x00, 0x08, 0x0e, 0x00, 0x08, 0x0f, 0x00, 0x08, + 0x10, 0x00, 0x08, 0x11, 0x00, 0x08, 0x12, 0x00, 0x08, 0x13, 0x00, 0x08, + 0x14, 0x00, 0x08, 0x15, 0x00, 0x08, 0x16, 0x00, 0x08, 0x17, 0x00, 0x08, + 0x18, 0x00, 0x08, 0x19, 0x00, 0x08, 0x1a, 0x00, 0x08, 0x1b, 0x00, 0x08, + 0x1c, 0x00, 0x08, 0x1d, 0x00, 0x08, 0x1e, 0x00, 0x08, 0x1f, 0x00, 0x09, + 0x00, 0x00, 0x09, 0x01, 0x00, 0x09, 0x02, 0x00, 0x09, 0x03, 0x00, 0x09, + 0x04, 0x00, 0x09, 0x05, 0x00, 0x09, 0x06, 0x00, 0x09, 0x07, 0x00, 0x09, + 0x08, 0x00, 0x09, 0x09, 0x00, 0x09, 0x0a, 0x00, 0x09, 0x0b, 0x00, 0x09, + 0x0c, 0x00, 0x09, 0x0d, 0x00, 0x09, 0x0e, 0x00, 0x09, 0x0f, 0x00, 0x09, + 0x10, 0x00, 0x09, 0x11, 0x00, 0x09, 0x12, 0x00, 0x09, 0x13, 0x00, 0x09, + 0x14, 0x00, 0x09, 0x15, 0x00, 0x09, 0x16, 0x00, 0x09, 0x17, 0x00, 0x09, + 0x18, 0x00, 0x09, 0x19, 0x00, 0x09, 0x1a, 0x00, 0x09, 0x1b, 0x00, 0x09, + 0x1c, 0x00, 0x09, 0x1d, 0x00, 0x09, 0x1e, 0x00, 0x09, 0x1f, 0x00, 0x0a, + 0x00, 0x00, 0x0a, 0x01, 0x00, 0x0a, 0x01, 0x00, 0x0a, 0x01, 0x00, 0x00, + 0x55, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x2c, 0x20, 0x25, 0x75, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x6e, 0x65, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x46, 0x49, 0x51, 0x2c, 0x20, + 0x25, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x75, 0x74, 0x65, + 0x78, 0x20, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x25, 0x73, + 0x28, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x61, 0x64, 0x69, + 0x5f, 0x64, 0x72, 0x76, 0x5f, 0x49, 0x6e, 0x74, 0x4d, 0x75, 0x74, 0x65, + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x61, 0x64, 0x69, + 0x5f, 0x64, 0x72, 0x76, 0x5f, 0x49, 0x6e, 0x74, 0x43, 0x66, 0x67, 0x53, + 0x50, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x68, 0x65, 0x20, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x65, + 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x21, 0x00, 0x00, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, + 0x6f, 0x77, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x21, 0x20, 0x54, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x20, 0x49, 0x44, 0x20, 0x30, 0x78, 0x25, 0x58, + 0x3a, 0x20, 0x22, 0x25, 0x73, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x56, 0x53, 0x57, 0x52, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, + 0x78, 0x30, 0x00, 0x00, 0x56, 0x53, 0x57, 0x52, 0x20, 0x54, 0x69, 0x6d, + 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x30, 0x00, 0x56, 0x53, 0x57, 0x52, + 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x31, 0x00, 0x00, + 0x56, 0x53, 0x57, 0x52, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, + 0x64, 0x78, 0x31, 0x00, 0x56, 0x53, 0x57, 0x52, 0x20, 0x54, 0x61, 0x73, + 0x6b, 0x20, 0x49, 0x64, 0x78, 0x32, 0x00, 0x00, 0x56, 0x53, 0x57, 0x52, + 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x32, 0x00, + 0x56, 0x53, 0x57, 0x52, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, + 0x78, 0x33, 0x00, 0x00, 0x56, 0x53, 0x57, 0x52, 0x20, 0x54, 0x69, 0x6d, + 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x33, 0x00, 0x56, 0x53, 0x57, 0x52, + 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x34, 0x00, 0x00, + 0x56, 0x53, 0x57, 0x52, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, + 0x64, 0x78, 0x34, 0x00, 0x56, 0x53, 0x57, 0x52, 0x20, 0x54, 0x61, 0x73, + 0x6b, 0x20, 0x49, 0x64, 0x78, 0x35, 0x00, 0x00, 0x56, 0x53, 0x57, 0x52, + 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x35, 0x00, + 0x56, 0x53, 0x57, 0x52, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, + 0x78, 0x36, 0x00, 0x00, 0x56, 0x53, 0x57, 0x52, 0x20, 0x54, 0x69, 0x6d, + 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x36, 0x00, 0x56, 0x53, 0x57, 0x52, + 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x37, 0x00, 0x00, + 0x56, 0x53, 0x57, 0x52, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, + 0x64, 0x78, 0x37, 0x00, 0x44, 0x50, 0x44, 0x20, 0x54, 0x61, 0x73, 0x6b, + 0x20, 0x49, 0x64, 0x78, 0x30, 0x00, 0x00, 0x00, 0x44, 0x50, 0x44, 0x20, + 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x30, 0x00, 0x00, + 0x44, 0x50, 0x44, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, + 0x31, 0x00, 0x00, 0x00, 0x44, 0x50, 0x44, 0x20, 0x54, 0x69, 0x6d, 0x65, + 0x72, 0x20, 0x49, 0x64, 0x78, 0x31, 0x00, 0x00, 0x44, 0x50, 0x44, 0x20, + 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x32, 0x00, 0x00, 0x00, + 0x44, 0x50, 0x44, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, + 0x78, 0x32, 0x00, 0x00, 0x44, 0x50, 0x44, 0x20, 0x54, 0x61, 0x73, 0x6b, + 0x20, 0x49, 0x64, 0x78, 0x33, 0x00, 0x00, 0x00, 0x44, 0x50, 0x44, 0x20, + 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x33, 0x00, 0x00, + 0x44, 0x50, 0x44, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, + 0x34, 0x00, 0x00, 0x00, 0x44, 0x50, 0x44, 0x20, 0x54, 0x69, 0x6d, 0x65, + 0x72, 0x20, 0x49, 0x64, 0x78, 0x34, 0x00, 0x00, 0x44, 0x50, 0x44, 0x20, + 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x35, 0x00, 0x00, 0x00, + 0x44, 0x50, 0x44, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, + 0x78, 0x35, 0x00, 0x00, 0x44, 0x50, 0x44, 0x20, 0x54, 0x61, 0x73, 0x6b, + 0x20, 0x49, 0x64, 0x78, 0x36, 0x00, 0x00, 0x00, 0x44, 0x50, 0x44, 0x20, + 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x36, 0x00, 0x00, + 0x44, 0x50, 0x44, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, + 0x37, 0x00, 0x00, 0x00, 0x44, 0x50, 0x44, 0x20, 0x54, 0x69, 0x6d, 0x65, + 0x72, 0x20, 0x49, 0x64, 0x78, 0x37, 0x00, 0x00, 0xb0, 0x05, 0x04, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd0, 0x0a, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x0c, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x50, 0xc9, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe4, 0x03, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xe2, 0x03, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xb4, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0xb4, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0xb4, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xb4, 0x04, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, + 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xb4, 0x04, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xb4, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0xb0, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0xb4, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb4, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x90, 0xb4, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0x04, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xb4, 0x04, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xb4, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0xb0, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xd0, 0xb4, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0xb4, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb4, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x04, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xb5, 0x04, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xb5, 0x04, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xb5, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xb2, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x50, 0xb5, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb5, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb5, 0x04, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xb5, 0x04, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xb5, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xb2, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0xb5, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xb5, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd0, 0xb5, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xb5, 0x04, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x04, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xb6, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0xb2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x46, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x53, 0x20, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x69, + 0x74, 0x28, 0x29, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x72, 0x00, 0x00, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x73, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x65, 0x72, 0x00, 0x00, 0x44, 0x50, 0x44, 0x20, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x6e, 0x27, 0x74, 0x20, 0x62, 0x65, + 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, + 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x54, 0x78, 0x2d, 0x74, 0x6f, 0x2d, 0x4f, 0x52, 0x78, 0x20, 0x6d, + 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x65, 0x6d, 0x61, 0x70, + 0x68, 0x6f, 0x72, 0x65, 0x00, 0x00, 0x00, 0x00, 0x43, 0x61, 0x70, 0x74, + 0x75, 0x72, 0x65, 0x20, 0x66, 0x6c, 0x6f, 0x77, 0x20, 0x69, 0x6e, 0x69, + 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x68, 0x61, 0x73, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x00, 0x00, + 0x44, 0x50, 0x44, 0x20, 0x41, 0x64, 0x61, 0x70, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, 0x20, 0x63, + 0x6f, 0x75, 0x6c, 0x64, 0x6e, 0x27, 0x74, 0x20, 0x62, 0x65, 0x20, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x44, 0x52, 0x56, 0x39, 0x30, 0x34, 0x30, 0x5f, 0x44, 0x46, 0x45, + 0x5f, 0x43, 0x41, 0x4c, 0x53, 0x5f, 0x46, 0x57, 0x20, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x69, + 0x74, 0x28, 0x29, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x44, 0x61, 0x74, + 0x61, 0x20, 0x3d, 0x3d, 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0x00, 0x00, 0x00, + 0x53, 0x69, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x20, 0x63, 0x61, 0x70, + 0x74, 0x75, 0x72, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x00, 0x64, 0x70, 0x64, 0x5f, + 0x41, 0x64, 0x61, 0x70, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x44, 0x29, 0x20, 0x61, 0x64, 0x69, 0x5f, 0x73, 0x76, 0x63, 0x5f, 0x44, + 0x66, 0x65, 0x41, 0x64, 0x61, 0x70, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x28, 0x29, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x20, 0x70, + 0x44, 0x61, 0x74, 0x61, 0x2d, 0x3e, 0x70, 0x41, 0x64, 0x61, 0x70, 0x74, + 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x42, 0x61, 0x73, 0x65, 0x20, 0x3d, + 0x20, 0x30, 0x78, 0x25, 0x6c, 0x78, 0x00, 0x00, 0x64, 0x70, 0x64, 0x5f, + 0x41, 0x64, 0x61, 0x70, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, + 0x44, 0x29, 0x20, 0x61, 0x64, 0x69, 0x5f, 0x73, 0x76, 0x63, 0x5f, 0x44, + 0x66, 0x65, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x63, + 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x28, 0x29, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x20, 0x70, + 0x44, 0x61, 0x74, 0x61, 0x2d, 0x3e, 0x70, 0x53, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x50, 0x72, 0x6f, 0x63, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x42, + 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x6c, 0x78, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x74, 0x78, 0x43, 0x68, 0x20, 0x3d, 0x20, 0x25, + 0x64, 0x20, 0x3a, 0x3a, 0x20, 0x70, 0x44, 0x61, 0x74, 0x61, 0x2d, 0x3e, + 0x70, 0x43, 0x61, 0x70, 0x43, 0x66, 0x67, 0x20, 0x3d, 0x3d, 0x20, 0x4e, + 0x55, 0x4c, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x78, 0x43, 0x68, + 0x20, 0x3d, 0x20, 0x25, 0x64, 0x20, 0x3a, 0x3a, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x74, 0x78, 0x43, 0x68, 0x20, 0x3d, 0x20, 0x25, + 0x64, 0x2c, 0x20, 0x53, 0x44, 0x4b, 0x20, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x4e, 0x75, 0x6d, 0x3d, 0x25, 0x75, 0x2c, 0x20, 0x4c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x4e, 0x75, 0x6d, + 0x3d, 0x25, 0x75, 0x20, 0x3a, 0x3a, 0x20, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, + 0x6e, 0x2e, 0x70, 0x43, 0x61, 0x70, 0x42, 0x75, 0x66, 0x20, 0x3d, 0x3d, + 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0x00, 0x00, 0x00, 0x74, 0x78, 0x43, 0x68, + 0x20, 0x3d, 0x20, 0x25, 0x64, 0x20, 0x3a, 0x3a, 0x20, 0x6c, 0x63, 0x6c, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x43, 0x61, 0x70, 0x42, + 0x75, 0x66, 0x20, 0x3d, 0x3d, 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0x00, 0x00, + 0x74, 0x78, 0x43, 0x68, 0x20, 0x3d, 0x20, 0x25, 0x64, 0x20, 0x3a, 0x3a, + 0x20, 0x6c, 0x63, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x70, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x75, 0x66, 0x20, 0x3d, 0x3d, 0x20, + 0x4e, 0x55, 0x4c, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x64, 0x70, 0x64, 0x5f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x61, 0x70, + 0x74, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x20, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x2e, 0x74, 0x78, 0x43, 0x68, 0x20, 0x3d, 0x20, + 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x20, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x20, 0x41, 0x44, 0x49, 0x5f, + 0x53, 0x56, 0x43, 0x5f, 0x44, 0x46, 0x45, 0x5f, 0x43, 0x41, 0x50, 0x54, + 0x55, 0x52, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x42, 0x49, + 0x54, 0x4d, 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, + 0x45, 0x5f, 0x43, 0x41, 0x50, 0x54, 0x55, 0x52, 0x45, 0x00, 0x00, 0x00, + 0x64, 0x70, 0x64, 0x5f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x61, 0x70, + 0x74, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x20, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x2e, 0x74, 0x78, 0x43, 0x68, 0x20, 0x3d, 0x20, + 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x20, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x20, 0x41, 0x44, 0x49, 0x5f, + 0x53, 0x56, 0x43, 0x5f, 0x44, 0x46, 0x45, 0x5f, 0x43, 0x41, 0x50, 0x54, + 0x55, 0x52, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x42, 0x49, + 0x54, 0x4d, 0x5f, 0x41, 0x42, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x5f, 0x43, + 0x41, 0x50, 0x54, 0x55, 0x52, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x64, 0x70, 0x64, 0x5f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x61, 0x70, + 0x74, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x20, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x2e, 0x74, 0x78, 0x43, 0x68, 0x20, 0x3d, 0x20, + 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x20, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x20, 0x41, 0x44, 0x49, 0x5f, + 0x53, 0x56, 0x43, 0x5f, 0x44, 0x46, 0x45, 0x5f, 0x43, 0x41, 0x50, 0x54, + 0x55, 0x52, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x42, 0x49, + 0x54, 0x4d, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x43, 0x52, 0x49, 0x54, + 0x45, 0x52, 0x49, 0x41, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x4d, 0x45, 0x54, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x70, 0x64, 0x5f, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x2e, 0x74, 0x78, 0x43, 0x68, 0x20, 0x3d, 0x20, 0x25, 0x64, 0x2c, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, + 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x73, 0x20, 0x75, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x44, 0x61, 0x74, 0x61, 0x2d, 0x3e, 0x70, 0x43, 0x61, 0x70, 0x43, + 0x66, 0x67, 0x20, 0x3d, 0x3d, 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0x00, 0x00, + 0x64, 0x70, 0x64, 0x5f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x61, 0x70, + 0x74, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x20, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x2e, 0x74, 0x78, 0x43, 0x68, 0x20, 0x3d, 0x20, + 0x25, 0x64, 0x2c, 0x20, 0x64, 0x70, 0x64, 0x5f, 0x42, 0x61, 0x64, 0x43, + 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x28, 0x29, 0x20, 0x69, 0x73, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x64, 0x70, 0x64, 0x5f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x61, 0x70, + 0x74, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x20, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x2e, 0x74, 0x78, 0x43, 0x68, 0x20, 0x3d, 0x20, + 0x25, 0x64, 0x2c, 0x20, 0x70, 0x65, 0x61, 0x6b, 0x44, 0x65, 0x74, 0x45, + 0x6e, 0x20, 0x3d, 0x20, 0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x20, 0x3c, 0x20, 0x28, 0x63, 0x61, 0x70, 0x44, 0x65, 0x70, 0x74, 0x68, + 0x20, 0x2f, 0x20, 0x32, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x64, 0x70, 0x64, 0x5f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x61, 0x70, + 0x74, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x20, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x2e, 0x74, 0x78, 0x43, 0x68, 0x20, 0x3d, 0x20, + 0x25, 0x64, 0x2c, 0x20, 0x70, 0x65, 0x61, 0x6b, 0x44, 0x65, 0x74, 0x45, + 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x20, 0x3c, 0x20, 0x63, 0x61, 0x70, 0x44, 0x65, 0x70, 0x74, 0x68, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x65, 0x74, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x73, 0x74, 0x6f, 0x70, 0x20, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x73, + 0x73, 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x20, 0x25, 0x64, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x73, 0x2e, 0x20, 0x74, 0x78, 0x43, 0x68, 0x20, 0x3d, 0x20, 0x25, + 0x64, 0x00, 0x00, 0x00, 0x64, 0x70, 0x64, 0x5f, 0x41, 0x64, 0x61, 0x70, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x20, 0x6f, 0x6e, 0x20, 0x41, 0x63, 0x74, 0x75, 0x61, 0x74, 0x6f, 0x72, + 0x20, 0x56, 0x62, 0x61, 0x6e, 0x6b, 0x20, 0x42, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x20, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2e, 0x20, 0x70, + 0x56, 0x42, 0x61, 0x6e, 0x6b, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x42, + 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x6c, 0x78, 0x00, + 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x73, 0x20, + 0x6f, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x57, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x25, 0x64, 0x2e, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x57, 0x6f, 0x72, + 0x64, 0x31, 0x20, 0x3d, 0x20, 0x25, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x44, 0x50, 0x44, 0x20, + 0x61, 0x63, 0x74, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x73, + 0x73, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x61, + 0x72, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x70, 0x64, 0x5f, + 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x43, 0x61, 0x70, 0x74, 0x75, + 0x72, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x20, 0x61, 0x64, 0x69, 0x5f, 0x73, 0x76, 0x63, 0x5f, + 0x44, 0x66, 0x65, 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x44, 0x70, + 0x64, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x2e, 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x25, 0x64, 0x00, 0x00, 0x00, + 0x64, 0x70, 0x64, 0x5f, 0x41, 0x64, 0x61, 0x70, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x49, 0x29, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x20, 0x61, 0x64, 0x69, 0x5f, 0x73, 0x76, 0x63, 0x5f, 0x44, 0x66, 0x65, + 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x44, 0x70, 0x64, 0x42, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2e, + 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x3d, 0x20, 0x25, 0x64, 0x00, 0x00, 0x53, 0x69, 0x67, 0x20, + 0x53, 0x74, 0x61, 0x73, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x64, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x68, 0x61, + 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x67, 0x65, 0x74, 0x20, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x00, 0x7b, 0x14, 0xae, 0x47, 0xe1, 0x7a, 0x84, 0x3f, + 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0xc2, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x08, 0x09, 0x00, 0x00, 0x00, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x03, 0x03, 0x00, 0x81, 0x03, 0x81, 0x02, + 0x81, 0x03, 0x81, 0x00, 0x01, 0x02, 0x81, 0x02, 0x83, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x03, 0x00, 0x31, 0x30, 0x2f, 0x2e, + 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x06, 0x07, 0x08, 0x00, 0x01, 0x02, 0x03, + 0x04, 0x05, 0x31, 0x30, 0x2f, 0x2e, 0xff, 0xff, 0x04, 0x05, 0x2d, 0x2c, + 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 0xff, 0xff, 0x31, 0x30, 0x2f, 0x00, + 0x01, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x31, + 0x30, 0x2f, 0x31, 0x30, 0x2f, 0xff, 0xff, 0xff, 0x2b, 0x2a, 0x29, 0xff, + 0xff, 0xff, 0x2e, 0x2d, 0x2c, 0xff, 0xff, 0xff, 0x37, 0xe0, 0x00, 0x00, + 0x3a, 0xe0, 0x00, 0x00, 0x3d, 0xe0, 0x00, 0x00, 0x40, 0xe0, 0x00, 0x00, + 0x38, 0xe0, 0x00, 0x00, 0x3b, 0xe0, 0x00, 0x00, 0x3e, 0xe0, 0x00, 0x00, + 0x41, 0xe0, 0x00, 0x00, 0x36, 0xe0, 0x00, 0x00, 0x39, 0xe0, 0x00, 0x00, + 0x3c, 0xe0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 0x43, 0x61, 0x6e, 0x27, + 0x74, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x4c, 0x55, 0x54, 0x00, + 0x6c, 0x75, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x61, + 0x74, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x69, 0x6e, + 0x20, 0x4d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x25, + 0x23, 0x6c, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x43, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x25, 0x23, 0x6c, 0x78, 0x2c, 0x20, + 0x69, 0x6e, 0x20, 0x52, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, + 0x20, 0x25, 0x23, 0x6c, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x78, + 0x5f, 0x6f, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, + 0x25, 0x23, 0x6c, 0x78, 0x2c, 0x20, 0x6f, 0x6e, 0x20, 0x63, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x25, 0x64, 0x00, 0x00, 0x00, + 0x56, 0x42, 0x61, 0x6e, 0x6b, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, + 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x79, 0x65, + 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, + 0x46, 0x44, 0x44, 0x20, 0x41, 0x63, 0x74, 0x75, 0x61, 0x74, 0x6f, 0x72, + 0x20, 0x43, 0x6f, 0x70, 0x79, 0x20, 0x4c, 0x55, 0x54, 0x2e, 0x20, 0x53, + 0x44, 0x4b, 0x20, 0x53, 0x76, 0x63, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x65, 0x64, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, + 0x30, 0x78, 0x25, 0x78, 0x00, 0x00, 0x00, 0x00, 0x54, 0x69, 0x6d, 0x65, + 0x64, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, + 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x20, 0x69, + 0x6e, 0x74, 0x6f, 0x20, 0x53, 0x77, 0x61, 0x70, 0x20, 0x62, 0x61, 0x6e, + 0x6b, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x20, 0x69, 0x6e, 0x20, 0x46, 0x44, 0x44, 0x20, 0x6d, 0x6f, 0x64, 0x65, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x65, 0x74, 0x20, 0x43, 0x6f, + 0x70, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x53, 0x77, 0x61, 0x70, + 0x20, 0x62, 0x61, 0x6e, 0x6b, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x46, 0x44, 0x44, 0x20, + 0x6d, 0x6f, 0x64, 0x65, 0x2e, 0x20, 0x53, 0x44, 0x4b, 0x20, 0x73, 0x76, + 0x63, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x00, + 0x55, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x20, 0x32, 0x6e, 0x64, 0x20, 0x41, 0x63, 0x74, 0x75, + 0x61, 0x74, 0x6f, 0x72, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x20, 0x4c, 0x55, + 0x54, 0x2e, 0x20, 0x53, 0x44, 0x4b, 0x20, 0x53, 0x76, 0x63, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x00, 0x00, 0x00, 0x00, + 0x54, 0x69, 0x6d, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x77, 0x61, + 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x32, 0x6e, + 0x64, 0x20, 0x6c, 0x75, 0x74, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x64, + 0x6f, 0x6e, 0x65, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, + 0x20, 0x46, 0x44, 0x44, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x67, 0x65, 0x74, 0x20, 0x32, 0x6e, 0x64, 0x20, 0x43, 0x6f, + 0x70, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x53, 0x77, 0x61, 0x70, + 0x20, 0x62, 0x61, 0x6e, 0x6b, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x46, 0x44, 0x44, 0x20, + 0x6d, 0x6f, 0x64, 0x65, 0x2e, 0x20, 0x53, 0x44, 0x4b, 0x20, 0x73, 0x76, + 0x63, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4b, 0x20, 0x6e, 0x6f, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x20, 0x41, 0x70, 0x70, 0x20, 0x6f, 0x66, 0x20, + 0x4c, 0x75, 0x74, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x55, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, + 0x6f, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x54, 0x44, 0x44, 0x20, + 0x41, 0x63, 0x74, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x43, 0x6f, 0x70, + 0x79, 0x20, 0x4c, 0x55, 0x54, 0x2e, 0x20, 0x53, 0x44, 0x4b, 0x20, 0x53, + 0x76, 0x63, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x69, 0x6d, 0x65, 0x64, 0x20, 0x6f, 0x75, + 0x74, 0x20, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, + 0x6c, 0x75, 0x74, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x54, 0x44, 0x44, 0x20, 0x6d, 0x6f, + 0x64, 0x65, 0x2e, 0x20, 0x45, 0x78, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, + 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x25, 0x64, + 0x20, 0x6d, 0x73, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x46, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x65, 0x74, 0x20, 0x43, 0x6f, + 0x70, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x6c, 0x75, 0x74, 0x20, + 0x64, 0x6f, 0x6e, 0x65, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x69, + 0x6e, 0x20, 0x54, 0x44, 0x44, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x2e, 0x20, + 0x53, 0x44, 0x4b, 0x20, 0x73, 0x76, 0x63, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x65, 0x64, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, + 0x20, 0x30, 0x78, 0x25, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x70, 0x64, 0x5f, + 0x41, 0x64, 0x70, 0x42, 0x77, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x3a, + 0x20, 0x45, 0x78, 0x69, 0x74, 0x20, 0x72, 0x65, 0x71, 0x20, 0x61, 0x74, + 0x20, 0x6c, 0x61, 0x67, 0x20, 0x25, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x50, 0x44, 0x20, 0x61, 0x64, 0x61, 0x70, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb0, 0x19, 0x76, 0xf5, 0xde, 0xdc, 0x62, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x50, 0x44, 0x20, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x20, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, 0x6d, 0x75, 0x74, + 0x65, 0x78, 0x20, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x20, 0x28, 0x63, 0x68, 0x4e, 0x75, 0x6d, 0x3d, 0x25, 0x75, 0x29, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x50, 0x44, 0x20, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x20, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, 0x6d, 0x75, 0x74, + 0x65, 0x78, 0x20, 0x75, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x68, 0x4e, 0x75, 0x6d, 0x3d, 0x25, + 0x75, 0x29, 0x00, 0x00, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x54, 0x44, 0x44, + 0x20, 0x4c, 0x55, 0x54, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x69, + 0x6e, 0x67, 0x20, 0x28, 0x63, 0x68, 0x4e, 0x75, 0x6d, 0x3d, 0x25, 0x75, + 0x29, 0x00, 0x00, 0x00, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x54, 0x44, + 0x44, 0x20, 0x4c, 0x55, 0x54, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x69, 0x6e, 0x67, 0x20, 0x28, 0x63, 0x68, 0x4e, 0x75, 0x6d, 0x3d, 0x25, + 0x75, 0x29, 0x00, 0x00, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x44, 0x50, 0x44, 0x20, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x25, 0x69, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x20, 0x25, 0x69, 0x2c, 0x20, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x69, 0x73, 0x20, 0x25, 0x69, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x20, 0x25, + 0x69, 0x20, 0x28, 0x63, 0x68, 0x4e, 0x75, 0x6d, 0x3d, 0x25, 0x75, 0x29, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x70, 0x64, 0x20, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x00, 0x00, 0x44, 0x70, 0x64, 0x20, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x20, 0x6d, 0x75, 0x74, 0x65, 0x78, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x68, 0x4e, + 0x75, 0x6d, 0x3d, 0x25, 0x75, 0x29, 0x00, 0x00, 0x54, 0x44, 0x44, 0x20, + 0x4c, 0x55, 0x54, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, + 0x28, 0x63, 0x68, 0x4e, 0x75, 0x6d, 0x3d, 0x25, 0x75, 0x29, 0x00, 0x00, + 0x44, 0x50, 0x44, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x73, 0x77, + 0x69, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x00, 0x00, 0x00, 0x00, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x77, 0x69, + 0x74, 0x63, 0x68, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x69, 0x6e, 0x20, 0x25, 0x73, 0x28, + 0x29, 0x3a, 0x20, 0x63, 0x68, 0x4e, 0x75, 0x6d, 0x3d, 0x25, 0x75, 0x2c, + 0x20, 0x63, 0x66, 0x67, 0x3d, 0x25, 0x70, 0x00, 0x49, 0x6e, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x69, 0x6e, + 0x20, 0x25, 0x73, 0x28, 0x29, 0x3a, 0x20, 0x63, 0x68, 0x4e, 0x75, 0x6d, + 0x3d, 0x25, 0x75, 0x00, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x69, 0x6e, 0x20, 0x25, 0x73, 0x28, + 0x29, 0x3a, 0x20, 0x63, 0x68, 0x4e, 0x75, 0x6d, 0x3d, 0x25, 0x75, 0x2c, + 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x4d, 0x61, 0x73, 0x6b, 0x3d, + 0x25, 0x75, 0x00, 0x00, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x69, 0x6e, 0x20, 0x25, 0x73, 0x28, + 0x29, 0x3a, 0x20, 0x63, 0x68, 0x4e, 0x75, 0x6d, 0x3d, 0x25, 0x75, 0x2c, + 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x3d, 0x25, 0x69, 0x2c, 0x20, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x3d, 0x25, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x52, 0x65, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x25, 0x69, 0x20, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x20, 0x28, 0x63, 0x68, 0x4e, 0x75, 0x6d, 0x3d, 0x25, + 0x75, 0x29, 0x00, 0x00, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x69, 0x6e, 0x20, 0x25, 0x73, 0x28, + 0x29, 0x3a, 0x20, 0x63, 0x68, 0x4e, 0x75, 0x6d, 0x3d, 0x25, 0x75, 0x2c, + 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x3d, 0x25, 0x69, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x50, 0x44, 0x20, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x69, 0x6e, + 0x69, 0x74, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x50, 0x44, 0x20, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x44, 0x50, 0x44, 0x20, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x65, + 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x20, 0x44, 0x50, 0x44, 0x20, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x28, 0x63, + 0x68, 0x4e, 0x75, 0x6d, 0x3d, 0x25, 0x75, 0x29, 0x00, 0x00, 0x00, 0x00, + 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, + 0x63, 0x6b, 0x20, 0x44, 0x50, 0x44, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x20, 0x28, 0x63, 0x68, 0x4e, 0x75, 0x6d, 0x3d, 0x25, 0x75, + 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x61, 0x69, 0x6c, + 0x75, 0x72, 0x65, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x69, 0x6e, 0x67, + 0x20, 0x44, 0x50, 0x44, 0x20, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x69, 0x6e, + 0x20, 0x25, 0x73, 0x28, 0x29, 0x3a, 0x20, 0x63, 0x68, 0x4e, 0x75, 0x6d, + 0x3d, 0x25, 0x75, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x3d, + 0x25, 0x69, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x3d, 0x25, 0x69, + 0x00, 0x00, 0x00, 0x00, 0x64, 0x70, 0x64, 0x5f, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x47, 0x61, 0x69, 0x6e, 0x4d, + 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x66, 0x67, 0x00, 0x00, 0x00, + 0x64, 0x70, 0x64, 0x5f, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x77, 0x69, + 0x74, 0x63, 0x68, 0x54, 0x78, 0x4d, 0x69, 0x6e, 0x50, 0x6f, 0x77, 0x65, + 0x72, 0x43, 0x66, 0x67, 0x00, 0x00, 0x00, 0x00, 0x64, 0x70, 0x64, 0x5f, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x43, 0x66, 0x67, + 0x00, 0x00, 0x00, 0x00, 0x64, 0x70, 0x64, 0x5f, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x64, 0x64, 0x4c, 0x75, + 0x74, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x66, 0x67, 0x00, 0x00, + 0x64, 0x70, 0x64, 0x5f, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x77, 0x69, + 0x74, 0x63, 0x68, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x65, 0x74, 0x00, + 0x64, 0x70, 0x64, 0x5f, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x77, 0x69, + 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x4d, + 0x61, 0x73, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x70, 0x64, 0x5f, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x4d, + 0x6f, 0x64, 0x65, 0x6c, 0x47, 0x65, 0x74, 0x00, 0x64, 0x70, 0x64, 0x5f, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x52, + 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x00, 0x00, 0x00, 0x64, 0x70, 0x64, 0x5f, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x4d, + 0x6f, 0x64, 0x65, 0x6c, 0x45, 0x78, 0x69, 0x73, 0x74, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x44, 0x20, 0x6d, 0x6f, 0x64, 0x65, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x20, 0x61, 0x74, 0x20, 0x4c, 0x55, 0x54, 0x20, 0x64, 0x65, + 0x70, 0x74, 0x68, 0x20, 0x36, 0x34, 0x00, 0x00, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x32, 0x2f, 0x33, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x64, 0x20, 0x61, 0x74, 0x20, 0x4c, 0x55, 0x54, 0x20, 0x64, 0x65, 0x70, + 0x74, 0x68, 0x20, 0x36, 0x34, 0x00, 0x00, 0x00, 0x4f, 0x6e, 0x6c, 0x79, + 0x20, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x20, 0x28, 0x34, 0x29, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, + 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6c, 0x6f, 0x77, + 0x2d, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x76, 0x69, 0x6f, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x67, 0x61, 0x69, 0x6e, + 0x20, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x20, 0x61, 0x74, 0x20, + 0x4c, 0x55, 0x54, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x36, 0x34, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x44, 0x44, 0x20, + 0x4c, 0x55, 0x54, 0x20, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x69, 0x6e, + 0x67, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x64, 0x20, 0x61, 0x74, 0x20, 0x4c, 0x55, 0x54, 0x20, 0x64, + 0x65, 0x70, 0x74, 0x68, 0x20, 0x36, 0x34, 0x00, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x33, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, + 0x61, 0x74, 0x20, 0x4c, 0x55, 0x54, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, + 0x20, 0x33, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x32, 0x2f, 0x33, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x64, 0x20, 0x69, 0x6e, 0x20, 0x46, 0x44, 0x44, 0x20, 0x6d, 0x6f, 0x64, + 0x65, 0x20, 0x61, 0x74, 0x20, 0x4c, 0x55, 0x54, 0x20, 0x64, 0x65, 0x70, + 0x74, 0x68, 0x20, 0x33, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x20, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x28, 0x34, 0x29, 0x20, 0x63, 0x61, 0x6e, + 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x6c, 0x6f, 0x77, 0x2d, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x76, + 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x72, 0x20, + 0x67, 0x61, 0x69, 0x6e, 0x20, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, + 0x20, 0x69, 0x6e, 0x20, 0x46, 0x44, 0x44, 0x20, 0x6d, 0x6f, 0x64, 0x65, + 0x20, 0x61, 0x74, 0x20, 0x4c, 0x55, 0x54, 0x20, 0x64, 0x65, 0x70, 0x74, + 0x68, 0x20, 0x33, 0x32, 0x00, 0x00, 0x00, 0x00, 0x54, 0x44, 0x44, 0x20, + 0x4c, 0x55, 0x54, 0x20, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x69, 0x6e, + 0x67, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x61, 0x74, 0x20, 0x4c, 0x55, 0x54, 0x20, 0x64, + 0x65, 0x70, 0x74, 0x68, 0x20, 0x33, 0x32, 0x00, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x20, 0x32, 0x20, 0x63, 0x61, 0x6e, 0x27, 0x74, 0x20, 0x62, 0x65, + 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x72, 0x65, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x20, 0x61, 0x74, 0x20, 0x4c, 0x55, + 0x54, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x33, 0x32, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x6d, + 0x6f, 0x64, 0x65, 0x20, 0x33, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, + 0x6e, 0x20, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x32, 0x20, 0x69, 0x73, + 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, + 0x61, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x79, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x54, 0x44, 0x44, 0x20, 0x4c, 0x55, 0x54, 0x20, 0x53, 0x77, 0x69, 0x74, + 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x46, + 0x44, 0x44, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x4d, 0x75, 0x74, 0x65, 0x78, 0x00, 0x00, 0x00, + 0x54, 0x72, 0x61, 0x63, 0x6b, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x63, 0x61, 0x6c, 0x20, 0x6d, + 0x75, 0x74, 0x65, 0x78, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x69, + 0x74, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x63, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x64, 0x65, 0x64, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x6f, + 0x6e, 0x67, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x4d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x43, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x00, 0x00, 0x00, 0x44, 0x50, 0x44, 0x20, + 0x61, 0x63, 0x74, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, + 0x6e, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x20, 0x69, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x50, 0x44, 0x20, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x2d, 0x75, 0x70, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x78, 0x2d, 0x74, + 0x6f, 0x2d, 0x4f, 0x52, 0x78, 0x20, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x20, 0x53, 0x65, 0x6d, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x4f, 0x52, + 0x78, 0x30, 0x00, 0x00, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x20, 0x54, 0x78, 0x2d, 0x74, 0x6f, 0x2d, 0x4f, 0x52, 0x78, 0x20, 0x4d, + 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x65, 0x6d, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x4f, 0x52, 0x78, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x54, 0x78, 0x2d, + 0x74, 0x6f, 0x2d, 0x4f, 0x52, 0x78, 0x20, 0x4d, 0x61, 0x70, 0x70, 0x69, + 0x6e, 0x67, 0x20, 0x53, 0x65, 0x6d, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x4f, + 0x52, 0x78, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x78, 0x2d, 0x74, + 0x6f, 0x2d, 0x4f, 0x52, 0x78, 0x20, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x20, 0x53, 0x65, 0x6d, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x4f, 0x52, + 0x78, 0x31, 0x00, 0x00, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x4d, 0x75, 0x74, 0x65, + 0x78, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, + 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x00, 0x00, 0x74, 0x72, 0x61, 0x63, + 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x4d, 0x75, 0x74, 0x65, 0x78, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x20, 0x62, 0x65, 0x20, 0x75, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x54, 0x78, 0x2d, 0x74, 0x6f, 0x2d, 0x4f, 0x72, 0x78, + 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x65, 0x6d, + 0x61, 0x70, 0x68, 0x6f, 0x72, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x4f, + 0x72, 0x78, 0x3a, 0x25, 0x75, 0x2c, 0x20, 0x54, 0x78, 0x3a, 0x25, 0x75, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x6f, 0x73, 0x74, 0x20, 0x54, + 0x78, 0x2d, 0x74, 0x6f, 0x2d, 0x4f, 0x72, 0x78, 0x20, 0x6d, 0x61, 0x70, + 0x70, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x65, 0x6d, 0x61, 0x70, 0x68, 0x6f, + 0x72, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x4f, 0x72, 0x78, 0x3a, 0x25, + 0x75, 0x20, 0x28, 0x54, 0x78, 0x3a, 0x25, 0x75, 0x29, 0x00, 0x00, 0x00, + 0xfc, 0xa9, 0xf1, 0xd2, 0x4d, 0x62, 0x50, 0x3f, 0x03, 0x00, 0x00, 0x10, + 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x03, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x8c, 0x00, 0x4a, 0x12, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x01, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x02, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x0b, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0b, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x03, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x03, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x03, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x04, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x04, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x04, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x04, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x04, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x04, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x04, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x04, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x05, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x05, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x01, 0x00, 0x40, 0x40, 0x00, 0xfa, 0xff, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0x11, + 0x00, 0x00, 0x00, 0xe4, 0xff, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0xc3, + 0xff, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x94, 0xff, 0x00, 0x00, 0x89, + 0x00, 0x00, 0x00, 0x59, 0xff, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x1c, + 0xff, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0xef, 0xfe, 0x00, 0x00, 0x1a, + 0x01, 0x00, 0x00, 0xe9, 0xfe, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x25, + 0xff, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0xc4, 0xff, 0x00, 0x00, 0xba, + 0xff, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x2d, 0xfe, 0x00, 0x00, 0xf8, + 0x02, 0x00, 0x00, 0x83, 0xfb, 0x00, 0x00, 0x93, 0x06, 0x00, 0x00, 0x59, + 0xf6, 0x00, 0x00, 0xd9, 0x0e, 0x00, 0x00, 0xb8, 0xe5, 0x00, 0x00, 0x36, + 0x51, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x02, 0xcc, 0xf7, 0xff, + 0xff, 0x00, 0x14, 0x14, 0x14, 0x14, 0x23, 0x32, 0x04, 0x00, 0x80, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0x01, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x01, 0x10, 0x00, 0x40, + 0x00, 0x01, 0x03, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x18, 0x01, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00, 0x05, 0x02, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x5a, 0x32, 0x1e, 0x02, + 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x0a, 0xd7, 0x23, + 0x3c, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xcd, 0xcc, 0xcc, 0x3d, 0x8f, + 0xc2, 0xf5, 0x3c, 0x6f, 0x12, 0x83, 0x3a, 0xa0, 0xf6, 0xff, 0xff, 0x19, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x34, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x51, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x61, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x56, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x34, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x6f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x83, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x81, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x6a, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x8c, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0xa5, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0xa8, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x9a, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7a, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd0, 0xaa, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xc7, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xd0, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x8f, 0xc6, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0xb0, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x87, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x23, 0xc9, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0xe9, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x87, 0xf4, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x98, 0xf1, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x40, 0xeb, 0xe0, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xc2, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xb0, 0x93, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xbd, 0xe7, 0x40, 0x00, 0x00, 0x00, 0x00, 0x30, 0xb5, 0x0a, 0xc1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xa9, 0x19, 0xc1, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xca, 0x0e, 0x41, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0xfe, 0xf5, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0c, 0xd2, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x9e, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x56, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x8d, 0x06, 0x41, 0x00, 0x00, 0x00, 0x00, 0x08, 0x31, 0x2c, 0xc1, + 0x00, 0x00, 0x00, 0x00, 0xd6, 0x0b, 0x3e, 0x41, 0x00, 0x00, 0x00, 0x00, + 0x20, 0xce, 0x41, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x10, 0xa9, 0x39, 0x41, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x18, 0x27, 0xc1, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xa9, 0x09, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0xe0, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0xa7, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x5b, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x87, 0x25, 0x41, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x99, 0x4d, 0xc1, + 0x00, 0x00, 0x00, 0x00, 0xa5, 0x9e, 0x61, 0x41, 0x00, 0x00, 0x00, 0xc0, + 0x5e, 0xc9, 0x67, 0xc1, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x07, 0x64, 0x41, + 0x00, 0x00, 0x00, 0x00, 0xb4, 0xcf, 0x55, 0xc1, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xca, 0x3e, 0x41, 0x00, 0x00, 0x00, 0x00, 0x48, 0x7e, 0x1b, 0xc1, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x53, 0xed, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc2, 0xb0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8e, 0xa1, 0x44, 0x41, 0x00, 0x00, 0x00, 0x00, 0x55, 0xf2, 0x6e, 0xc1, + 0x00, 0x00, 0x00, 0x60, 0xcb, 0x59, 0x84, 0x41, 0x00, 0x00, 0x00, 0xc0, + 0xa0, 0xd5, 0x8e, 0xc1, 0x00, 0x00, 0x00, 0x70, 0xb6, 0xbb, 0x8d, 0x41, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0x07, 0x83, 0xc1, 0x00, 0x00, 0x00, 0x00, + 0xc7, 0x5b, 0x70, 0x41, 0x00, 0x00, 0x00, 0x00, 0x08, 0xb2, 0x52, 0xc1, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x7e, 0x2b, 0x41, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x70, 0xf8, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xb7, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x63, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6b, 0xd6, 0x63, 0x41, 0x00, 0x00, 0x00, 0xf0, 0x36, 0x1e, 0x90, 0xc1, + 0x00, 0x00, 0x00, 0xc0, 0xbf, 0x35, 0xa7, 0x41, 0x00, 0x00, 0x00, 0x3c, + 0xb8, 0x80, 0xb3, 0xc1, 0x00, 0x00, 0x00, 0x84, 0xde, 0x32, 0xb5, 0x41, + 0x00, 0x00, 0x00, 0x5c, 0x4c, 0x38, 0xaf, 0xc1, 0x00, 0x00, 0x00, 0x00, + 0x29, 0xb7, 0x9f, 0x41, 0x00, 0x00, 0x00, 0x80, 0x69, 0x33, 0x86, 0xc1, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x08, 0x65, 0x41, 0x00, 0x00, 0x00, 0x00, + 0x44, 0xf7, 0x39, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8d, 0x03, 0x41, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xbf, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x66, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x0b, 0x21, 0x83, 0x41, 0x00, 0x00, 0x00, 0x48, 0xea, 0xbc, 0xb0, 0xc1, + 0x00, 0x00, 0x00, 0x46, 0x19, 0x31, 0xca, 0x41, 0x00, 0x00, 0x00, 0x68, + 0x52, 0x2d, 0xd8, 0xc1, 0x00, 0x00, 0x00, 0x5a, 0x14, 0x41, 0xdd, 0x41, + 0x00, 0x00, 0x00, 0x4b, 0xe6, 0x60, 0xd8, 0xc1, 0x00, 0x00, 0x00, 0xff, + 0x45, 0x9e, 0xcc, 0x41, 0x00, 0x00, 0x00, 0xc0, 0x5e, 0xc9, 0xb7, 0xc1, + 0x00, 0x00, 0x00, 0xe0, 0x43, 0xc0, 0x9b, 0x41, 0x00, 0x00, 0x00, 0x80, + 0x69, 0x33, 0x76, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x5e, 0x47, 0x41, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x0e, 0xc1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x54, 0xc5, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6a, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x56, 0x53, 0x57, 0x52, 0x20, 0x63, 0x61, 0x70, + 0x74, 0x75, 0x72, 0x65, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x20, 0x70, 0x44, + 0x61, 0x74, 0x61, 0x20, 0x3d, 0x3d, 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0x00, + 0x5b, 0x63, 0x68, 0x3d, 0x25, 0x75, 0x5d, 0x20, 0x56, 0x53, 0x57, 0x52, + 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x64, 0x6f, 0x6e, + 0x65, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x4e, + 0x55, 0x4c, 0x4c, 0x00, 0x5b, 0x63, 0x68, 0x3d, 0x25, 0x75, 0x5d, 0x20, + 0x56, 0x53, 0x57, 0x52, 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x28, 0x25, 0x75, 0x29, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x31, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4b, 0x20, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x4e, 0x75, 0x6d, 0x3d, 0x25, 0x75, + 0x2c, 0x20, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x4e, 0x75, 0x6d, 0x3d, 0x25, 0x75, 0x00, 0x00, 0x00, + 0x5b, 0x63, 0x68, 0x3d, 0x25, 0x75, 0x5d, 0x20, 0x56, 0x53, 0x57, 0x52, + 0x20, 0x70, 0x43, 0x61, 0x70, 0x42, 0x75, 0x66, 0x20, 0x3d, 0x3d, 0x20, + 0x4e, 0x55, 0x4c, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x63, 0x68, 0x3d, + 0x25, 0x75, 0x5d, 0x20, 0x56, 0x53, 0x57, 0x52, 0x20, 0x70, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x42, 0x75, 0x66, 0x20, 0x3d, 0x3d, 0x20, 0x4e, 0x55, + 0x4c, 0x4c, 0x00, 0x00, 0x56, 0x53, 0x57, 0x52, 0x20, 0x54, 0x78, 0x20, + 0x61, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x20, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x3a, 0x25, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x56, 0x53, 0x57, 0x52, 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, + 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x3a, 0x20, 0x70, 0x44, + 0x61, 0x74, 0x61, 0x20, 0x3d, 0x3d, 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x56, 0x53, 0x57, 0x52, 0x20, 0x63, 0x61, 0x70, + 0x74, 0x75, 0x72, 0x65, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x3a, 0x20, 0x70, 0x44, 0x61, + 0x74, 0x61, 0x20, 0x3d, 0x3d, 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x56, 0x53, 0x57, 0x52, 0x20, 0x63, 0x61, 0x70, + 0x74, 0x75, 0x72, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x61, 0x64, 0x69, 0x5f, 0x73, 0x76, 0x63, 0x5f, 0x44, 0x66, 0x65, 0x43, + 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x56, 0x73, 0x77, 0x72, 0x42, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x28, 0x25, 0x75, 0x29, 0x00, 0x00, + 0x56, 0x53, 0x57, 0x52, 0x20, 0x77, 0x61, 0x76, 0x65, 0x66, 0x6f, 0x72, + 0x6d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x2c, 0x20, 0x54, 0x78, 0x3a, 0x25, 0x75, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x56, 0x53, 0x57, 0x52, 0x20, 0x77, 0x61, 0x76, + 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, + 0x61, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x54, 0x78, 0x3a, 0x25, 0x75, 0x00, + 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, + 0x63, 0x6b, 0x20, 0x56, 0x53, 0x57, 0x52, 0x20, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x3a, 0x20, 0x25, 0x69, 0x20, 0x28, 0x74, 0x78, 0x43, 0x68, + 0x3d, 0x25, 0x69, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x6e, + 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x56, 0x53, 0x57, 0x52, 0x20, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x3a, 0x20, 0x25, 0x69, 0x20, 0x28, 0x74, 0x78, + 0x43, 0x68, 0x3d, 0x25, 0x69, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x76, 0x73, 0x77, 0x72, 0x4f, 0x72, 0x78, 0x53, 0x65, 0x6d, 0x61, 0x70, + 0x68, 0x6f, 0x72, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x76, 0x73, 0x77, 0x72, 0x4f, 0x72, 0x78, 0x53, 0x65, 0x6d, 0x61, 0x70, + 0x68, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x28, 0x25, 0x75, 0x29, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x56, 0x53, 0x57, 0x52, 0x20, 0x74, 0x78, 0x42, + 0x75, 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x20, 0x28, 0x25, 0x75, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x56, 0x53, 0x57, 0x52, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x42, 0x75, 0x66, + 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x20, 0x28, 0x25, 0x75, 0x29, 0x00, 0x00, 0x00, 0x6d, 0x6f, 0x72, 0x65, + 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x69, 0x73, 0x20, 0x73, 0x65, 0x6e, + 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x56, 0x53, 0x57, + 0x52, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2d, 0x75, 0x70, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x76, 0x73, 0x77, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4c, 0x6f, + 0x63, 0x6b, 0x00, 0x00, 0x76, 0x73, 0x77, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x4c, 0x6f, 0x63, 0x6b, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x28, 0x25, 0x75, 0x29, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x53, 0x57, 0x52, + 0x20, 0x4f, 0x72, 0x78, 0x20, 0x53, 0x65, 0x6d, 0x61, 0x70, 0x68, 0x6f, + 0x72, 0x65, 0x20, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, 0x61, 0x69, 0x6c, + 0x75, 0x72, 0x65, 0x20, 0x28, 0x4f, 0x52, 0x78, 0x3a, 0x25, 0x75, 0x2c, + 0x20, 0x54, 0x78, 0x3a, 0x25, 0x75, 0x29, 0x00, 0x56, 0x53, 0x57, 0x52, + 0x20, 0x4f, 0x72, 0x78, 0x20, 0x53, 0x65, 0x6d, 0x61, 0x70, 0x68, 0x6f, + 0x72, 0x65, 0x20, 0x70, 0x6f, 0x73, 0x74, 0x20, 0x28, 0x4f, 0x52, 0x78, + 0x3a, 0x25, 0x75, 0x2c, 0x20, 0x54, 0x78, 0x3a, 0x25, 0x75, 0x29, 0x00, + 0x56, 0x53, 0x57, 0x52, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6f, + 0x6e, 0x20, 0x63, 0x68, 0x25, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x55, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x56, + 0x53, 0x57, 0x52, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, + 0x70, 0x65, 0x3a, 0x20, 0x25, 0x69, 0x20, 0x28, 0x63, 0x68, 0x3d, 0x25, + 0x75, 0x29, 0x00, 0x00, 0x56, 0x53, 0x57, 0x52, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x74, + 0x6f, 0x6f, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x20, 0x25, 0x6c, 0x75, + 0x20, 0x3c, 0x20, 0x25, 0x6c, 0x75, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x25, 0x69, 0x2c, + 0x20, 0x63, 0x68, 0x3d, 0x25, 0x75, 0x29, 0x00, 0x49, 0x6e, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x20, 0x56, 0x53, 0x57, 0x52, 0x20, 0x43, 0x74, 0x72, + 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, + 0x25, 0x69, 0x20, 0x28, 0x63, 0x68, 0x3d, 0x25, 0x75, 0x29, 0x00, 0x00, + 0x56, 0x53, 0x57, 0x52, 0x20, 0x43, 0x74, 0x72, 0x6c, 0x20, 0x72, 0x65, + 0x61, 0x64, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x74, 0x6f, + 0x6f, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x20, 0x25, 0x75, 0x20, 0x3c, + 0x20, 0x25, 0x6c, 0x75, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x20, 0x3d, 0x20, 0x25, 0x69, 0x2c, 0x20, 0x63, 0x68, 0x3d, 0x25, + 0x75, 0x29, 0x00, 0x00, 0x56, 0x53, 0x57, 0x52, 0x20, 0x43, 0x74, 0x72, + 0x6c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x20, 0x74, 0x6f, 0x6f, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, + 0x20, 0x25, 0x75, 0x20, 0x3c, 0x20, 0x25, 0x75, 0x20, 0x28, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x25, 0x69, 0x2c, 0x20, + 0x63, 0x68, 0x3d, 0x25, 0x75, 0x29, 0x00, 0x00, 0x55, 0x6e, 0x65, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x56, 0x53, 0x57, 0x52, 0x20, + 0x43, 0x74, 0x72, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x20, 0x3d, 0x20, 0x25, 0x69, 0x20, 0x28, 0x63, 0x68, 0x3d, 0x25, 0x75, + 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x53, 0x57, 0x52, + 0x20, 0x43, 0x74, 0x72, 0x6c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x6f, 0x20, 0x73, + 0x6d, 0x61, 0x6c, 0x6c, 0x20, 0x25, 0x75, 0x20, 0x3c, 0x20, 0x25, 0x6c, + 0x75, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, + 0x20, 0x25, 0x69, 0x2c, 0x20, 0x63, 0x68, 0x3d, 0x25, 0x75, 0x29, 0x00, + 0x43, 0x4c, 0x47, 0x43, 0x20, 0x54, 0x53, 0x53, 0x49, 0x3a, 0x20, 0x63, + 0x61, 0x70, 0x20, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x64, + 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x3d, 0x25, 0x75, 0x20, 0x61, 0x74, 0x20, + 0x74, 0x78, 0x43, 0x68, 0x20, 0x25, 0x64, 0x00, 0x43, 0x4c, 0x47, 0x43, + 0x20, 0x54, 0x53, 0x53, 0x49, 0x3a, 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, + 0x72, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x3d, 0x25, 0x75, 0x20, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x65, + 0x64, 0x20, 0x61, 0x74, 0x20, 0x74, 0x78, 0x43, 0x68, 0x20, 0x25, 0x64, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x4c, 0x47, 0x43, 0x3a, 0x20, 0x54, 0x78, + 0x20, 0x54, 0x53, 0x53, 0x49, 0x31, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x74, 0x20, 0x74, 0x78, + 0x43, 0x68, 0x20, 0x25, 0x64, 0x2c, 0x20, 0x25, 0x75, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x4c, 0x47, 0x43, 0x3a, 0x20, 0x54, 0x78, + 0x20, 0x54, 0x53, 0x53, 0x49, 0x32, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x74, 0x20, 0x74, 0x78, + 0x43, 0x68, 0x20, 0x25, 0x64, 0x2c, 0x20, 0x25, 0x75, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x4c, 0x47, 0x43, 0x3a, 0x20, 0x4f, 0x52, + 0x78, 0x20, 0x54, 0x53, 0x53, 0x49, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x74, 0x20, 0x6f, 0x72, + 0x78, 0x43, 0x68, 0x20, 0x25, 0x64, 0x2c, 0x20, 0x25, 0x75, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x4c, 0x47, 0x43, 0x3a, 0x20, 0x54, 0x78, + 0x20, 0x72, 0x61, 0x74, 0x65, 0x28, 0x25, 0x75, 0x29, 0x20, 0x21, 0x3d, + 0x20, 0x4f, 0x52, 0x78, 0x20, 0x72, 0x61, 0x74, 0x65, 0x28, 0x25, 0x75, + 0x29, 0x20, 0x61, 0x74, 0x20, 0x74, 0x78, 0x43, 0x68, 0x20, 0x25, 0x75, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x4c, 0x47, 0x43, 0x20, 0x54, 0x53, 0x53, + 0x49, 0x20, 0x63, 0x61, 0x70, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x55, 0x73, 0x20, 0x25, 0x75, 0x20, 0x69, 0x73, 0x20, 0x6f, 0x75, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x25, 0x75, 0x00, 0x00, 0x00, 0x00, 0x63, 0x6c, 0x67, 0x63, + 0x5f, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x43, 0x61, 0x70, 0x74, + 0x75, 0x72, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x20, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x20, 0x61, 0x64, 0x69, 0x5f, 0x73, 0x76, 0x63, + 0x5f, 0x44, 0x66, 0x65, 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x44, + 0x70, 0x64, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x52, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x4c, 0x47, 0x43, + 0x20, 0x70, 0x65, 0x61, 0x6b, 0x44, 0x65, 0x74, 0x3a, 0x20, 0x63, 0x61, + 0x70, 0x20, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x64, 0x75, + 0x65, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x3d, 0x25, 0x75, 0x20, 0x61, 0x74, 0x20, 0x74, + 0x78, 0x43, 0x68, 0x20, 0x25, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x4c, 0x47, 0x43, 0x20, 0x70, 0x65, 0x61, 0x6b, 0x44, 0x65, 0x74, + 0x3a, 0x20, 0x63, 0x61, 0x70, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x20, 0x64, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3d, + 0x25, 0x75, 0x20, 0x61, 0x74, 0x20, 0x74, 0x78, 0x43, 0x68, 0x20, 0x25, + 0x64, 0x00, 0x00, 0x00, 0x43, 0x4c, 0x47, 0x43, 0x20, 0x70, 0x65, 0x61, + 0x6b, 0x44, 0x65, 0x74, 0x3a, 0x20, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, + 0x6e, 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x3d, 0x25, 0x75, 0x20, 0x61, 0x74, 0x20, 0x74, 0x78, + 0x43, 0x68, 0x20, 0x25, 0x64, 0x00, 0x00, 0x00, 0x43, 0x4c, 0x47, 0x43, + 0x20, 0x70, 0x65, 0x61, 0x6b, 0x44, 0x65, 0x74, 0x3a, 0x20, 0x63, 0x61, + 0x70, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x20, 0x64, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3d, 0x25, + 0x75, 0x20, 0x61, 0x74, 0x20, 0x74, 0x78, 0x43, 0x68, 0x20, 0x25, 0x64, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x4c, 0x47, 0x43, + 0x20, 0x70, 0x65, 0x61, 0x6b, 0x44, 0x65, 0x74, 0x3a, 0x20, 0x63, 0x61, + 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, + 0x64, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, + 0x20, 0x70, 0x61, 0x74, 0x68, 0x65, 0x6c, 0x61, 0x79, 0x20, 0x61, 0x74, + 0x20, 0x74, 0x78, 0x43, 0x68, 0x20, 0x25, 0x64, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x4c, 0x47, 0x43, 0x20, 0x70, 0x65, 0x61, 0x6b, 0x44, 0x65, 0x74, + 0x3a, 0x20, 0x63, 0x61, 0x70, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x20, 0x64, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, + 0x62, 0x61, 0x64, 0x43, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x20, 0x61, + 0x74, 0x20, 0x74, 0x78, 0x43, 0x68, 0x20, 0x25, 0x64, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x4c, 0x47, 0x43, 0x20, 0x43, 0x54, 0x52, + 0x4c, 0x2d, 0x43, 0x4d, 0x44, 0x3a, 0x20, 0x75, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x43, 0x4c, 0x47, + 0x43, 0x20, 0x64, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x20, 0x54, 0x78, 0x2d, 0x4f, 0x52, 0x78, 0x20, + 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x74, 0x78, 0x43, + 0x68, 0x3d, 0x25, 0x75, 0x2c, 0x20, 0x6f, 0x72, 0x78, 0x43, 0x68, 0x3d, + 0x25, 0x75, 0x2c, 0x20, 0x74, 0x78, 0x43, 0x68, 0x4d, 0x61, 0x70, 0x3d, + 0x25, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x20, 0x4e, 0x00, 0x00, + 0xac, 0xc5, 0x27, 0x37, 0xac, 0xc5, 0x27, 0x37, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0xd7, 0x23, 0x3c, 0x00, 0x00, 0xc0, 0x40, 0x00, 0x00, + 0x00, 0x00, 0xcd, 0xcc, 0x27, 0x42, 0x0a, 0xd7, 0x23, 0x3c, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x4c, 0x47, 0x43, + 0x20, 0x54, 0x78, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x67, 0x65, + 0x74, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x3a, 0x25, 0x75, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x4c, 0x47, 0x43, 0x20, 0x4f, 0x52, 0x78, + 0x20, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x20, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x3a, 0x25, 0x75, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x4c, 0x47, 0x43, 0x20, 0x54, 0x78, 0x20, 0x61, 0x74, 0x74, 0x65, + 0x6e, 0x20, 0x73, 0x65, 0x74, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x3a, 0x25, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xdc, 0x76, 0x6d, + 0x65, 0x08, 0xe8, 0xbe, 0x6e, 0xce, 0x85, 0xae, 0x4d, 0x7e, 0x05, 0x3f, + 0x52, 0xc8, 0x3d, 0xb6, 0x41, 0x50, 0x1b, 0xbf, 0x0f, 0x95, 0x3b, 0x12, + 0x4f, 0x00, 0x2d, 0x3f, 0x49, 0x5c, 0x9d, 0x0a, 0xea, 0x67, 0x3b, 0xbf, + 0x0d, 0x38, 0xd4, 0x74, 0x1b, 0xd9, 0x47, 0x3f, 0xb8, 0x08, 0x3e, 0x82, + 0xf9, 0x8c, 0x53, 0xbf, 0xb1, 0x50, 0x0c, 0x3b, 0x34, 0xc7, 0x5e, 0x3f, + 0xed, 0xef, 0x4f, 0x6a, 0x0d, 0xbd, 0x67, 0xbf, 0xfb, 0x26, 0xf4, 0x0f, + 0x12, 0x78, 0x72, 0x3f, 0xed, 0xe7, 0x8f, 0x8e, 0xc8, 0xb3, 0x7e, 0xbf, + 0xa4, 0x6e, 0xa2, 0x2c, 0xe1, 0x40, 0x90, 0x3f, 0xee, 0x34, 0xb6, 0xe9, + 0x79, 0xf9, 0xef, 0x3f, 0xf8, 0x39, 0x06, 0x03, 0xc5, 0xec, 0x8d, 0xbf, + 0xaf, 0xa1, 0xc7, 0x3c, 0x86, 0x3d, 0x7b, 0x3f, 0xe2, 0xf7, 0x0d, 0x87, + 0x94, 0x31, 0x6f, 0xbf, 0xec, 0x02, 0x88, 0x15, 0x59, 0xf7, 0x62, 0x3f, + 0x6e, 0x01, 0x3f, 0xf0, 0x01, 0x1f, 0x57, 0xbf, 0x96, 0xb7, 0x91, 0x41, + 0xb0, 0x64, 0x4b, 0x3f, 0xb5, 0xa4, 0xe3, 0xad, 0x8c, 0xcb, 0x3e, 0xbf, + 0x7c, 0xbb, 0x42, 0x31, 0xc2, 0x02, 0x30, 0x3f, 0xd9, 0xcb, 0xab, 0xb3, + 0xf0, 0xb7, 0x1d, 0xbf, 0x85, 0xc3, 0x98, 0x0e, 0x2b, 0x15, 0x07, 0x3f, + 0xa7, 0x2b, 0x61, 0xa2, 0x61, 0x7a, 0xe9, 0xbe, 0xf4, 0xc4, 0x20, 0x54, + 0x0b, 0x04, 0xf8, 0xbe, 0xa0, 0xd2, 0x01, 0x71, 0x7d, 0x7b, 0x15, 0x3f, + 0x91, 0x19, 0xcf, 0xaf, 0x0b, 0x4e, 0x2b, 0xbf, 0xec, 0x23, 0x1e, 0x98, + 0x91, 0xff, 0x3c, 0x3f, 0x6c, 0x17, 0x0d, 0xed, 0xff, 0x68, 0x4b, 0xbf, + 0xc7, 0x6c, 0x4b, 0xda, 0xf6, 0xdb, 0x57, 0x3f, 0x39, 0xe4, 0x66, 0xbc, + 0x57, 0x91, 0x63, 0xbf, 0x7a, 0x8d, 0xd9, 0xdd, 0x71, 0xd2, 0x6e, 0x3f, + 0x24, 0x46, 0x6b, 0xe9, 0xb0, 0xca, 0x77, 0xbf, 0x38, 0x14, 0x8e, 0x26, + 0x10, 0x89, 0x82, 0x3f, 0x84, 0xac, 0x35, 0xe2, 0x34, 0xe5, 0x8e, 0xbf, + 0xdf, 0xa1, 0x42, 0x30, 0x2e, 0x7d, 0xa0, 0x3f, 0xbc, 0xfe, 0xd8, 0x40, + 0x7e, 0xec, 0xef, 0x3f, 0x16, 0x6e, 0xf7, 0xe2, 0xea, 0x6c, 0x9d, 0xbf, + 0x85, 0x65, 0x28, 0x7c, 0x40, 0xfd, 0x8a, 0x3f, 0xe2, 0xa7, 0xae, 0x4a, + 0x6b, 0xfc, 0x7e, 0xbf, 0xc0, 0x35, 0x42, 0xb5, 0x5a, 0xdd, 0x72, 0x3f, + 0xe8, 0x50, 0xe3, 0x28, 0x0a, 0x04, 0x67, 0xbf, 0xa6, 0xc5, 0x93, 0x26, + 0x8e, 0x48, 0x5b, 0x3f, 0x78, 0x5b, 0x3e, 0x5d, 0x15, 0xaf, 0x4e, 0xbf, + 0xce, 0xd4, 0x62, 0x7b, 0x7c, 0xea, 0x3f, 0x3f, 0xf3, 0xd5, 0x82, 0xe1, + 0xd1, 0xa0, 0x2d, 0xbf, 0x02, 0x03, 0x8d, 0xae, 0x8c, 0x04, 0x17, 0x3f, + 0x2d, 0x49, 0xd8, 0x0c, 0x7c, 0x69, 0xf9, 0xbe, 0x39, 0x43, 0x4c, 0x98, + 0x21, 0xfc, 0x01, 0xbf, 0x6f, 0x22, 0xa4, 0xcf, 0x40, 0x17, 0x20, 0x3f, + 0x74, 0xba, 0xa1, 0x8e, 0xbd, 0x74, 0x34, 0xbf, 0x44, 0x49, 0xc6, 0x39, + 0xbb, 0xba, 0x45, 0x3f, 0x2e, 0xeb, 0xf0, 0xe8, 0x6a, 0x8b, 0x54, 0xbf, + 0x9c, 0x6f, 0xda, 0x16, 0x83, 0xe3, 0x61, 0x3f, 0x98, 0x0e, 0x8b, 0x9a, + 0xab, 0x5a, 0x6d, 0xbf, 0xdd, 0xb4, 0x65, 0xcb, 0xa4, 0x21, 0x77, 0x3f, + 0x9b, 0xdc, 0x20, 0x9a, 0xb7, 0xde, 0x81, 0xbf, 0xc9, 0x41, 0x44, 0xf4, + 0xb7, 0xe1, 0x8b, 0x3f, 0x7f, 0xad, 0x41, 0x2f, 0xdb, 0x4c, 0x97, 0xbf, + 0x40, 0x55, 0x5b, 0x4f, 0x1e, 0x14, 0xa9, 0x3f, 0x08, 0xbd, 0xe6, 0x75, + 0x12, 0xd9, 0xef, 0x3f, 0x5a, 0x38, 0xad, 0xd6, 0x46, 0xb0, 0xa5, 0xbf, + 0xe8, 0x3a, 0x20, 0x23, 0x6b, 0x0a, 0x94, 0x3f, 0x58, 0x5f, 0x3d, 0x24, + 0x30, 0x11, 0x87, 0xbf, 0x82, 0x2c, 0x4b, 0x94, 0xa7, 0x1f, 0x7c, 0x3f, + 0x96, 0x51, 0xd7, 0xd8, 0x74, 0x2b, 0x71, 0xbf, 0x9e, 0x05, 0xa6, 0x68, + 0x4e, 0x5d, 0x64, 0x3f, 0x90, 0x43, 0x21, 0x2b, 0x6c, 0xe9, 0x56, 0xbf, + 0x27, 0x34, 0xee, 0xc4, 0xd8, 0xd6, 0x47, 0x3f, 0x40, 0x47, 0xbf, 0xd3, + 0xda, 0x22, 0x36, 0xbf, 0x91, 0x85, 0xfd, 0x52, 0x81, 0x33, 0x21, 0x3f, + 0x36, 0x9b, 0x60, 0x72, 0xa1, 0xfe, 0x02, 0xbf, 0x22, 0x25, 0x58, 0x6b, + 0xcc, 0xec, 0x07, 0xbf, 0xf5, 0x88, 0xd2, 0x42, 0xda, 0x68, 0x25, 0x3f, + 0xe0, 0xad, 0x0e, 0x27, 0x16, 0x39, 0x3b, 0xbf, 0x2f, 0x8d, 0x87, 0x8f, + 0x87, 0xec, 0x4c, 0x3f, 0x8d, 0x97, 0x97, 0x2a, 0x95, 0x5a, 0x5b, 0xbf, + 0x2f, 0xe3, 0xc4, 0x74, 0x41, 0xd3, 0x67, 0x3f, 0xe1, 0x25, 0xb3, 0xd0, + 0x46, 0x8e, 0x73, 0xbf, 0x0a, 0x05, 0xfa, 0xf9, 0x6a, 0xd6, 0x7e, 0x3f, + 0x3e, 0xf4, 0x2d, 0xef, 0xd0, 0xd7, 0x87, 0xbf, 0x1e, 0x14, 0x9f, 0xaa, + 0x47, 0xa0, 0x92, 0x3f, 0xcb, 0x21, 0x36, 0x80, 0x7c, 0x37, 0x9f, 0xbf, + 0x10, 0x6e, 0x5d, 0x78, 0x85, 0xf1, 0xb0, 0x3f, 0x57, 0xb9, 0xa9, 0x42, + 0x3e, 0xbf, 0xef, 0x3f, 0xbb, 0xd3, 0xde, 0x6d, 0x3d, 0x67, 0xac, 0xbf, + 0xdd, 0x9c, 0x21, 0x46, 0x91, 0x6f, 0x9a, 0x3f, 0x8d, 0x4f, 0x6f, 0x7f, + 0x30, 0x81, 0x8e, 0xbf, 0xb3, 0x7f, 0xf5, 0xf1, 0xa6, 0x9e, 0x82, 0x3f, + 0xba, 0x2f, 0x6c, 0x7a, 0xc6, 0xc0, 0x76, 0xbf, 0xa8, 0xfd, 0x51, 0xe2, + 0x4f, 0x00, 0x6b, 0x3f, 0xe3, 0xd8, 0xe1, 0xfa, 0x0d, 0x64, 0x5e, 0xbf, + 0x3f, 0xaa, 0xaf, 0xef, 0x81, 0xa1, 0x4f, 0x3f, 0x8c, 0x29, 0x24, 0x01, + 0xf4, 0x60, 0x3d, 0xbf, 0x2c, 0x10, 0x4c, 0x1d, 0x94, 0xd5, 0x26, 0x3f, + 0x53, 0x23, 0xf4, 0x3b, 0x7d, 0x38, 0x09, 0xbf, 0x5b, 0x14, 0xbe, 0x17, + 0x6a, 0xd0, 0x0d, 0xbf, 0xe9, 0x7d, 0xa5, 0x2c, 0x4f, 0xaf, 0x2a, 0x3f, + 0xcc, 0x91, 0xfe, 0xef, 0xf8, 0xf7, 0x40, 0xbf, 0xe3, 0x72, 0x12, 0x9c, + 0x66, 0x08, 0x52, 0x3f, 0xbd, 0x13, 0x01, 0x1b, 0xed, 0x0e, 0x61, 0xbf, + 0xc0, 0xa3, 0xfc, 0x69, 0x9a, 0xb9, 0x6d, 0x3f, 0xc9, 0xee, 0x1f, 0x8c, + 0x88, 0x68, 0x78, 0xbf, 0x92, 0xf6, 0x46, 0xce, 0x70, 0x41, 0x83, 0x3f, + 0x1e, 0x42, 0xe3, 0x66, 0x0e, 0xcd, 0x8d, 0xbf, 0x51, 0x63, 0x62, 0x23, + 0x0a, 0x50, 0x97, 0x3f, 0x97, 0xfc, 0x90, 0x0f, 0x17, 0x97, 0xa3, 0xbf, + 0xd8, 0x52, 0xf1, 0xa5, 0xd1, 0x73, 0xb5, 0x3f, 0x23, 0xe9, 0xc0, 0xa6, + 0x0b, 0x9f, 0xef, 0x3f, 0xfc, 0x7a, 0x74, 0xa4, 0x07, 0x6d, 0xb1, 0xbf, + 0xc3, 0xd7, 0x3f, 0x64, 0x81, 0x55, 0xa0, 0x3f, 0xaa, 0x29, 0x88, 0xee, + 0x18, 0xe5, 0x92, 0xbf, 0x9d, 0x63, 0xc7, 0x67, 0x94, 0x18, 0x87, 0x3f, + 0x83, 0x30, 0xf5, 0x1b, 0xc2, 0x3e, 0x7c, 0xbf, 0xa7, 0x91, 0xe1, 0xff, + 0xb5, 0xc4, 0x70, 0x3f, 0x8c, 0x72, 0xba, 0xe1, 0x84, 0xe1, 0x62, 0xbf, + 0x32, 0xdc, 0xd8, 0xd2, 0x4e, 0xa8, 0x53, 0x3f, 0xd5, 0x43, 0xcd, 0x6c, + 0x33, 0x43, 0x42, 0xbf, 0xcb, 0x2e, 0x66, 0xf1, 0x22, 0x65, 0x2c, 0x3f, + 0xea, 0x10, 0x9e, 0x2d, 0x98, 0x5e, 0x0f, 0xbf, 0x97, 0x6b, 0x21, 0xb0, + 0xb2, 0xd1, 0x11, 0xbf, 0x0d, 0x8e, 0x94, 0x17, 0x69, 0xe7, 0x2f, 0x3f, + 0xd3, 0x8b, 0xda, 0x86, 0x9c, 0x4a, 0x44, 0xbf, 0x11, 0x08, 0x1a, 0x8d, + 0x98, 0x91, 0x55, 0x3f, 0xcd, 0x40, 0xe4, 0xce, 0x8c, 0x68, 0x64, 0xbf, + 0x2f, 0x64, 0x30, 0x1f, 0x7a, 0xc9, 0x71, 0x3f, 0x9e, 0xe5, 0x0d, 0x5c, + 0x25, 0x39, 0x7d, 0xbf, 0xe2, 0x1c, 0x76, 0xa6, 0x2e, 0x11, 0x87, 0x3f, + 0xf8, 0x8c, 0x53, 0xe1, 0x6a, 0xdd, 0x91, 0xbf, 0x59, 0x7e, 0x93, 0x5f, + 0x5b, 0xfd, 0x9b, 0x3f, 0x3b, 0x21, 0x81, 0x97, 0x44, 0x96, 0xa7, 0xbf, + 0xc8, 0xdc, 0x67, 0x4f, 0xbe, 0x0f, 0xba, 0x3f, 0xa5, 0x7c, 0x28, 0xe3, + 0x86, 0x78, 0xef, 0x3f, 0xe7, 0xa5, 0x65, 0x6d, 0xc8, 0x83, 0xb4, 0xbf, + 0x66, 0xa4, 0xa1, 0xfc, 0xe8, 0x5c, 0xa3, 0x3f, 0xd0, 0xf0, 0xd1, 0x46, + 0x28, 0x74, 0x96, 0xbf, 0x69, 0x7f, 0xce, 0x4e, 0x1b, 0x7b, 0x8b, 0x3f, + 0x14, 0xea, 0x90, 0x88, 0x21, 0xd1, 0x80, 0xbf, 0x64, 0xf2, 0x13, 0x0b, + 0x6c, 0xfa, 0x73, 0x3f, 0x99, 0x15, 0xbd, 0x79, 0x07, 0x81, 0x66, 0xbf, + 0x66, 0xd0, 0x2a, 0x8c, 0xd2, 0x6f, 0x57, 0x3f, 0xba, 0xc2, 0x6f, 0x37, + 0x7c, 0xc7, 0x45, 0xbf, 0x8e, 0x03, 0x5a, 0xe9, 0x6f, 0xef, 0x30, 0x3f, + 0xed, 0xed, 0x0e, 0xbd, 0xa3, 0xb6, 0x12, 0xbf, 0xa7, 0x6a, 0x9a, 0xfb, + 0x18, 0xb1, 0x14, 0xbf, 0x3d, 0x42, 0x5b, 0x73, 0xfc, 0x86, 0x32, 0x3f, + 0x86, 0xcb, 0x04, 0x44, 0x6e, 0x92, 0x47, 0xbf, 0x00, 0x5e, 0x9b, 0x16, + 0xb0, 0x0f, 0x59, 0x3f, 0x51, 0x74, 0xb9, 0xbe, 0x1c, 0xb8, 0x67, 0xbf, + 0x58, 0x7f, 0xcd, 0xde, 0xdc, 0xad, 0x74, 0x3f, 0x57, 0x85, 0x8d, 0x08, + 0x95, 0xfe, 0x80, 0xbf, 0xe9, 0x60, 0x90, 0xe7, 0x19, 0xd8, 0x8a, 0x3f, + 0x7e, 0x81, 0x75, 0x4c, 0xc5, 0xce, 0x94, 0xbf, 0x3e, 0x82, 0x29, 0xe7, + 0xb6, 0x52, 0xa0, 0x3f, 0x1e, 0x8c, 0x4c, 0x0c, 0x09, 0x97, 0xab, 0xbf, + 0x79, 0x8c, 0x42, 0x83, 0x09, 0xc4, 0xbe, 0x3f, 0xee, 0x6e, 0xcd, 0x74, + 0xbe, 0x4b, 0xef, 0x3f, 0x0d, 0xa6, 0x48, 0x9b, 0x5a, 0x77, 0xb7, 0xbf, + 0xb6, 0xb5, 0xbe, 0x2a, 0x9a, 0x4c, 0xa6, 0x3f, 0x77, 0x77, 0xe2, 0xec, + 0xe5, 0xeb, 0x99, 0xbf, 0xf6, 0x88, 0x17, 0xa0, 0xcd, 0xc3, 0x8f, 0x3f, + 0xb8, 0xa2, 0x3e, 0xc7, 0x1c, 0x74, 0x83, 0xbf, 0x77, 0xcd, 0x98, 0x33, + 0x70, 0x1f, 0x77, 0x3f, 0x7d, 0xec, 0x96, 0x96, 0x72, 0x0e, 0x6a, 0xbf, + 0x68, 0xad, 0x64, 0xa9, 0x14, 0x25, 0x5b, 0x3f, 0xa3, 0x9e, 0xed, 0x76, + 0x41, 0x3b, 0x49, 0xbf, 0x67, 0xbd, 0x4d, 0x39, 0xc6, 0x9f, 0x33, 0x3f, + 0x61, 0x16, 0x1f, 0x6d, 0x78, 0xb0, 0x15, 0xbf, 0x7e, 0xe4, 0x17, 0x4d, + 0xa7, 0x84, 0x17, 0xbf, 0xe0, 0xbc, 0x10, 0x5d, 0xec, 0x0f, 0x35, 0x3f, + 0x89, 0x0d, 0xd1, 0x09, 0x6c, 0xcd, 0x4a, 0xbf, 0xb9, 0xd9, 0x4f, 0x05, + 0x89, 0x80, 0x5c, 0x3f, 0x47, 0xba, 0xbd, 0x73, 0x94, 0xfb, 0x6a, 0xbf, + 0x9a, 0x0d, 0x5e, 0x2a, 0x2e, 0x88, 0x77, 0x3f, 0x3e, 0x31, 0x9d, 0xd5, + 0xd3, 0x58, 0x83, 0xbf, 0x7e, 0xda, 0x0f, 0x63, 0xdf, 0x93, 0x8e, 0x3f, + 0xf2, 0xa7, 0x06, 0x30, 0xc8, 0xb8, 0x97, 0xbf, 0x52, 0x80, 0x03, 0xe8, + 0xb7, 0xa2, 0xa2, 0x3f, 0x83, 0x53, 0xd3, 0x3a, 0x1d, 0x97, 0xaf, 0xbf, + 0x17, 0x40, 0xc7, 0x98, 0xb2, 0xc7, 0xc1, 0x3f, 0x4c, 0xf0, 0x37, 0x0e, + 0xc3, 0x18, 0xef, 0x3f, 0x12, 0xd3, 0x63, 0x20, 0x47, 0x47, 0xba, 0xbf, + 0x83, 0x49, 0xe0, 0xba, 0x41, 0x23, 0xa9, 0x3f, 0xe6, 0xd4, 0xb4, 0xdc, + 0x83, 0x4a, 0x9d, 0xbf, 0x41, 0x48, 0x2b, 0xb3, 0x28, 0xf8, 0x91, 0x3f, + 0xb1, 0x9f, 0xbb, 0x25, 0xd6, 0x06, 0x86, 0xbf, 0x59, 0xbd, 0x6d, 0x14, + 0xf5, 0x31, 0x7a, 0x3f, 0x50, 0x6a, 0xc5, 0x50, 0xb7, 0x87, 0x6d, 0xbf, + 0x78, 0x63, 0xc0, 0xdd, 0xea, 0xc5, 0x5e, 0x3f, 0xc6, 0x09, 0x29, 0xfe, + 0x7b, 0x9c, 0x4c, 0xbf, 0x60, 0xf7, 0xd4, 0x06, 0xfe, 0x41, 0x36, 0x3f, + 0xc6, 0x2e, 0x3a, 0x51, 0x06, 0x9b, 0x18, 0xbf, 0x1c, 0xc4, 0x65, 0x94, + 0xa3, 0x4a, 0x1a, 0xbf, 0x55, 0x14, 0xa7, 0xe7, 0xf6, 0x8c, 0x37, 0x3f, + 0xc1, 0x61, 0x70, 0x63, 0x9a, 0xf9, 0x4d, 0xbf, 0xb2, 0xf4, 0x7c, 0xbd, + 0x05, 0xe2, 0x5f, 0x3f, 0x96, 0xdf, 0x45, 0x28, 0xf1, 0x30, 0x6e, 0xbf, + 0xc4, 0x6c, 0x33, 0x17, 0xab, 0x56, 0x7a, 0x3f, 0x6c, 0xbb, 0x61, 0x8a, + 0xda, 0xa9, 0x85, 0xbf, 0xe1, 0x08, 0x96, 0x9a, 0x17, 0x21, 0x91, 0x3f, + 0x1b, 0xab, 0x87, 0x3e, 0xa6, 0x99, 0x9a, 0xbf, 0xa8, 0x7b, 0x97, 0x9c, + 0x46, 0xed, 0xa4, 0x3f, 0x91, 0xaa, 0x43, 0xc2, 0x18, 0xca, 0xb1, 0xbf, + 0xf0, 0x85, 0xd1, 0xd1, 0x3b, 0x38, 0xc4, 0x3f, 0xe4, 0x7a, 0x4b, 0x90, + 0xa7, 0xdf, 0xee, 0x3f, 0x1c, 0x70, 0x9e, 0x69, 0x26, 0xf3, 0xbc, 0xbf, + 0x27, 0x7c, 0xf4, 0xf3, 0x9e, 0xdf, 0xab, 0x3f, 0x4d, 0x29, 0xcb, 0x9c, + 0x23, 0x47, 0xa0, 0xbf, 0xef, 0x58, 0xef, 0xf5, 0x30, 0xff, 0x93, 0x3f, + 0x2d, 0x4f, 0x4a, 0x0a, 0xdd, 0x87, 0x88, 0xbf, 0xf6, 0x20, 0xb9, 0xbd, + 0x3a, 0x30, 0x7d, 0x3f, 0xc1, 0x9f, 0x19, 0x96, 0x6a, 0x75, 0x70, 0xbf, + 0xce, 0x39, 0xaa, 0xa0, 0x1c, 0x28, 0x61, 0x3f, 0xa4, 0x46, 0xbd, 0x82, + 0x31, 0xe9, 0x4f, 0xbf, 0xcb, 0x48, 0xe1, 0x9d, 0x8a, 0xd4, 0x38, 0x3f, + 0x82, 0x14, 0x30, 0xe5, 0x93, 0x74, 0x1b, 0xbf, 0xad, 0x06, 0xdd, 0x58, + 0x5b, 0x01, 0x1d, 0xbf, 0xe9, 0x5e, 0x02, 0x2d, 0x95, 0xfc, 0x39, 0x3f, + 0x90, 0x07, 0x9c, 0xd9, 0x82, 0x8a, 0x50, 0xbf, 0x81, 0x57, 0xd9, 0x3e, + 0x08, 0x99, 0x61, 0x3f, 0x98, 0xcc, 0x2c, 0x7d, 0x1b, 0xab, 0x70, 0xbf, + 0x49, 0xee, 0x79, 0x25, 0x96, 0x17, 0x7d, 0x3f, 0x41, 0xd6, 0xb6, 0x6d, + 0x38, 0xf0, 0x87, 0xbf, 0x7e, 0x76, 0xdf, 0x0f, 0x5f, 0xf0, 0x92, 0x3f, + 0x3e, 0x4d, 0x27, 0x2a, 0x94, 0x6f, 0x9d, 0xbf, 0xd0, 0x7b, 0xcc, 0x6c, + 0xf8, 0x30, 0xa7, 0x3f, 0x04, 0x08, 0xa7, 0x70, 0xf7, 0xc5, 0xb3, 0xbf, + 0x7e, 0xca, 0xa3, 0xfc, 0xed, 0xb2, 0xc6, 0x3f, 0x28, 0xac, 0x23, 0x02, + 0x81, 0xa0, 0xee, 0x3f, 0x24, 0x9c, 0xa3, 0x69, 0xa0, 0x7a, 0xbf, 0xbf, + 0xee, 0x9a, 0xac, 0xfa, 0x83, 0x80, 0xae, 0x3f, 0x11, 0xfe, 0xe9, 0x88, + 0xc4, 0xda, 0xa1, 0xbf, 0x8d, 0x19, 0x64, 0x6d, 0xe8, 0xf5, 0x95, 0x3f, + 0xae, 0x23, 0xee, 0xa6, 0xcd, 0xf5, 0x8a, 0xbf, 0x65, 0x50, 0x85, 0xd3, + 0x47, 0x0c, 0x80, 0x3f, 0xb0, 0x32, 0x7d, 0x99, 0xed, 0x1a, 0x72, 0xbf, + 0x9f, 0x0a, 0x91, 0xbf, 0xf9, 0xe0, 0x62, 0x3f, 0xa1, 0xe8, 0x96, 0xdd, + 0xba, 0x8f, 0x51, 0xbf, 0x37, 0xc5, 0x21, 0xda, 0xe9, 0x55, 0x3b, 0x3f, + 0x27, 0xdf, 0xc7, 0xf3, 0x72, 0x3b, 0x1e, 0xbf, 0xb3, 0x85, 0x72, 0xc1, + 0x24, 0xa7, 0x1f, 0xbf, 0xfb, 0x67, 0x33, 0xaf, 0x47, 0x5d, 0x3c, 0x3f, + 0x76, 0x0f, 0x8e, 0xb0, 0xe1, 0x0e, 0x52, 0xbf, 0xd7, 0x97, 0xbc, 0x50, + 0x4e, 0x37, 0x63, 0x3f, 0x33, 0xd0, 0x15, 0x0f, 0xb9, 0x34, 0x72, 0xbf, + 0x68, 0x5b, 0x45, 0x4c, 0x38, 0xc9, 0x7f, 0x3f, 0xb9, 0xe6, 0xde, 0x74, + 0x81, 0x2a, 0x8a, 0xbf, 0x4d, 0x79, 0x1e, 0x73, 0xa3, 0xb6, 0x94, 0x3f, + 0x6e, 0x05, 0x74, 0xd7, 0x64, 0x1c, 0xa0, 0xbf, 0x27, 0xf3, 0x5d, 0x04, + 0x63, 0x6c, 0xa9, 0x3f, 0x60, 0xa7, 0xc9, 0xf3, 0xfb, 0xbd, 0xb5, 0xbf, + 0xaf, 0x0d, 0xbd, 0x55, 0x11, 0x37, 0xc9, 0x3f, 0x6c, 0x4a, 0x04, 0x88, + 0x66, 0x5b, 0xee, 0x3f, 0xde, 0xa5, 0x73, 0x4e, 0xb6, 0xee, 0xc0, 0xbf, + 0x18, 0x37, 0x03, 0x15, 0x6b, 0x82, 0xb0, 0x3f, 0x1e, 0x38, 0x7a, 0x8a, + 0x5b, 0x5f, 0xa3, 0xbf, 0x0a, 0xc4, 0x6a, 0xa6, 0x43, 0xdb, 0x97, 0x3f, + 0xca, 0x25, 0xea, 0xb0, 0x51, 0x4f, 0x8d, 0xbf, 0x6a, 0x86, 0x22, 0xcb, + 0xa8, 0x74, 0x81, 0x3f, 0xdf, 0x54, 0xc1, 0x81, 0x74, 0xb3, 0x73, 0xbf, + 0x62, 0xf1, 0x01, 0xfb, 0x8e, 0x8c, 0x64, 0x3f, 0x5b, 0x8b, 0x6b, 0xb8, + 0xb5, 0x1e, 0x53, 0xbf, 0x25, 0x77, 0x74, 0xff, 0xa4, 0xc4, 0x3d, 0x3f, + 0xde, 0xfa, 0x9f, 0xc4, 0x00, 0x77, 0x20, 0xbf, 0xf1, 0xbb, 0x9f, 0xc5, + 0x2f, 0x1d, 0x21, 0xbf, 0x49, 0x8e, 0x58, 0x38, 0x97, 0xad, 0x3e, 0x3f, + 0x98, 0x53, 0x5a, 0x7d, 0xf9, 0x88, 0x53, 0xbf, 0x5a, 0xb4, 0x51, 0xeb, + 0xd3, 0xca, 0x64, 0x3f, 0x3f, 0x0d, 0xd7, 0x02, 0x5c, 0xb4, 0x73, 0xbf, + 0x7b, 0x12, 0xcf, 0xfe, 0xf0, 0x34, 0x81, 0x3f, 0x1b, 0x4a, 0xef, 0x1a, + 0x4f, 0x57, 0x8c, 0xbf, 0x03, 0x10, 0xc9, 0xd1, 0xc5, 0x72, 0x96, 0x3f, + 0x62, 0x28, 0x0f, 0x4d, 0xc1, 0x79, 0xa1, 0xbf, 0x0c, 0x29, 0x00, 0x19, + 0x1d, 0x9e, 0xab, 0x3f, 0x42, 0x84, 0xd5, 0xeb, 0xf4, 0xb0, 0xb7, 0xbf, + 0xea, 0x89, 0xae, 0x09, 0xe9, 0xc3, 0xcb, 0x3f, 0x02, 0xcf, 0x88, 0x59, + 0x71, 0x10, 0xee, 0x3f, 0x63, 0x82, 0xe2, 0x03, 0xa9, 0x0d, 0xc2, 0xbf, + 0x55, 0x8a, 0xa8, 0x31, 0xc7, 0xb5, 0xb1, 0x3f, 0x00, 0x0f, 0xf7, 0x1f, + 0x2a, 0xd4, 0xa4, 0xbf, 0x62, 0x7f, 0x54, 0x68, 0x43, 0xae, 0x99, 0x3f, + 0x0d, 0xe5, 0xd5, 0x12, 0x21, 0x93, 0x8f, 0xbf, 0xc8, 0x2e, 0xba, 0x40, + 0x77, 0xd0, 0x82, 0x3f, 0x0f, 0x0c, 0x38, 0xed, 0x17, 0x3e, 0x75, 0xbf, + 0x45, 0x08, 0x73, 0x6b, 0xe7, 0x29, 0x66, 0x3f, 0xd4, 0xe2, 0x80, 0xc8, + 0xa2, 0xa0, 0x54, 0xbf, 0x49, 0xbf, 0x94, 0xc9, 0xa8, 0x0f, 0x40, 0x3f, + 0x04, 0x26, 0x7c, 0x74, 0x55, 0xc5, 0x21, 0xbf, 0xdc, 0x5c, 0x65, 0x00, + 0xbb, 0x5c, 0x22, 0xbf, 0x7e, 0x0c, 0x2c, 0xdd, 0x0a, 0x76, 0x40, 0x3f, + 0x8a, 0x00, 0x42, 0xa9, 0xdf, 0xf7, 0x54, 0xbf, 0x18, 0x8e, 0xc1, 0xa8, + 0x9d, 0x52, 0x66, 0x3f, 0x90, 0xcb, 0x7c, 0x43, 0x14, 0x29, 0x75, 0xbf, + 0xaa, 0x20, 0xcc, 0x14, 0xf6, 0x7b, 0x82, 0x3f, 0x94, 0x23, 0xaa, 0x37, + 0x41, 0x75, 0x8e, 0xbf, 0xfe, 0x27, 0xe6, 0x8f, 0xab, 0x23, 0x98, 0x3f, + 0xa1, 0x40, 0x60, 0xe9, 0xff, 0xce, 0xa2, 0xbf, 0xdb, 0x21, 0x6a, 0x32, + 0xbf, 0xc4, 0xad, 0x3f, 0xf0, 0x24, 0x4a, 0xd6, 0xae, 0x9d, 0xb9, 0xbf, + 0x78, 0x45, 0x33, 0x7b, 0xb3, 0x58, 0xce, 0x3f, 0x7e, 0xf6, 0xed, 0xb6, + 0xbc, 0xbf, 0xed, 0x3f, 0xf8, 0x94, 0xc1, 0x96, 0x13, 0x1a, 0xc3, 0xbf, + 0x7e, 0x24, 0xad, 0xa9, 0xdc, 0xd9, 0xb2, 0x3f, 0x97, 0x21, 0x9d, 0xbd, + 0x7c, 0x38, 0xa6, 0xbf, 0x51, 0xcf, 0xc0, 0x2e, 0xf5, 0x6d, 0x9b, 0x3f, + 0x84, 0xb8, 0x07, 0x4a, 0x01, 0xe0, 0x90, 0xbf, 0xf6, 0x55, 0x05, 0xb2, + 0xf2, 0x1e, 0x84, 0x3f, 0xae, 0x6b, 0x2b, 0xc7, 0xf9, 0xb9, 0x76, 0xbf, + 0xaa, 0xfe, 0x04, 0x9a, 0x17, 0xb8, 0x67, 0x3f, 0xba, 0xdf, 0xea, 0x17, + 0xa4, 0x14, 0x56, 0xbf, 0x90, 0xd5, 0x01, 0x15, 0x49, 0x32, 0x41, 0x3f, + 0xe3, 0xbd, 0x11, 0x3b, 0xf4, 0x07, 0x23, 0xbf, 0x04, 0xaa, 0xb9, 0xff, + 0x6e, 0x91, 0x23, 0xbf, 0xc1, 0x42, 0x25, 0x9c, 0xaf, 0x8b, 0x41, 0x3f, + 0x65, 0x97, 0x8d, 0xd4, 0xaf, 0x5a, 0x56, 0xbf, 0x75, 0xa6, 0xcf, 0x84, + 0xb6, 0xcd, 0x67, 0x3f, 0xed, 0x0a, 0xa3, 0x84, 0xf7, 0x91, 0x76, 0xbf, + 0x35, 0x82, 0x10, 0xa3, 0xdc, 0xb8, 0x83, 0x3f, 0xb9, 0xd7, 0xce, 0x6c, + 0x7f, 0x41, 0x90, 0xbf, 0x7e, 0x88, 0x36, 0x15, 0x3f, 0xc8, 0x99, 0x3f, + 0x6c, 0x5a, 0xb3, 0x32, 0x44, 0x1b, 0xa4, 0xbf, 0xed, 0x7b, 0xde, 0x75, + 0xe4, 0xde, 0xaf, 0x3f, 0x1d, 0x4f, 0xeb, 0x99, 0xf4, 0x82, 0xbb, 0xbf, + 0xbb, 0xa0, 0x2f, 0x46, 0x55, 0x7a, 0xd0, 0x3f, 0xea, 0x05, 0x55, 0xdd, + 0x65, 0x69, 0xed, 0x3f, 0x79, 0x1e, 0x95, 0xff, 0xe8, 0x13, 0xc4, 0xbf, + 0xc9, 0xaf, 0x56, 0xd5, 0x3b, 0xee, 0xb3, 0x3f, 0x85, 0x08, 0x81, 0x13, + 0xab, 0x8b, 0xa7, 0xbf, 0xa8, 0x6b, 0x9d, 0x97, 0x73, 0x19, 0x9d, 0x3f, + 0x8b, 0x33, 0x54, 0x38, 0x66, 0xea, 0x91, 0xbf, 0x58, 0x13, 0x33, 0x80, + 0x63, 0x5f, 0x85, 0x3f, 0x2e, 0x38, 0xc9, 0xb9, 0x45, 0x26, 0x78, 0xbf, + 0x80, 0xbd, 0xb3, 0xfa, 0x3d, 0x36, 0x69, 0x3f, 0x52, 0x88, 0x01, 0xb8, + 0xe4, 0x79, 0x57, 0xbf, 0x30, 0x00, 0x55, 0x8f, 0x8b, 0x49, 0x42, 0x3f, + 0xed, 0x78, 0x3c, 0x3f, 0x21, 0x3e, 0x24, 0xbf, 0xf1, 0x10, 0xf1, 0xe5, + 0x8c, 0xba, 0x24, 0xbf, 0xc4, 0x33, 0xa7, 0x45, 0x0d, 0x97, 0x42, 0x3f, + 0x3b, 0x35, 0x09, 0x57, 0x8c, 0xb0, 0x57, 0xbf, 0x0b, 0x9d, 0xa1, 0x68, + 0x30, 0x3b, 0x69, 0x3f, 0x87, 0x29, 0xb0, 0xc9, 0x21, 0xee, 0x77, 0xbf, + 0x3a, 0x62, 0xfc, 0x1f, 0xdb, 0xea, 0x84, 0x3f, 0xbb, 0xc4, 0x42, 0x88, + 0x9b, 0x3f, 0x91, 0xbf, 0x80, 0x33, 0x5d, 0x70, 0x70, 0x5f, 0x9b, 0x3f, + 0xc6, 0x11, 0x6d, 0x42, 0xb5, 0x5d, 0xa5, 0xbf, 0xca, 0xe5, 0x31, 0xb6, + 0x95, 0xf5, 0xb0, 0x3f, 0xf7, 0x09, 0x5e, 0x11, 0x90, 0x5f, 0xbd, 0xbf, + 0x48, 0x3c, 0x2d, 0xf4, 0x81, 0xcb, 0xd1, 0x3f, 0xfa, 0x99, 0xa1, 0xfa, + 0x8b, 0x0d, 0xed, 0x3f, 0xfe, 0x8b, 0x72, 0xe3, 0x23, 0xfb, 0xc4, 0xbf, + 0x8e, 0x94, 0xa9, 0x28, 0x7f, 0xf2, 0xb4, 0x3f, 0xa0, 0x98, 0xf2, 0x51, + 0x18, 0xcd, 0xa8, 0xbf, 0x7d, 0xfb, 0x2c, 0xd1, 0xe6, 0xaf, 0x9e, 0x3f, + 0xb1, 0xa4, 0x26, 0x7a, 0x32, 0xe8, 0x92, 0xbf, 0x9b, 0x64, 0x51, 0x54, + 0x1b, 0x91, 0x86, 0x3f, 0xfe, 0x4f, 0x73, 0xa6, 0x31, 0x82, 0x79, 0xbf, + 0xf3, 0xc7, 0xd1, 0x6f, 0x83, 0xa3, 0x6a, 0x3f, 0x1d, 0xeb, 0xaa, 0x40, + 0x99, 0xcf, 0x58, 0xbf, 0xbd, 0x36, 0xaf, 0xaf, 0xcf, 0x54, 0x43, 0x3f, + 0x50, 0x96, 0xbb, 0x93, 0x28, 0x67, 0x25, 0xbf, 0xe9, 0xae, 0xc9, 0x86, + 0x5c, 0xd7, 0x25, 0xbf, 0xdf, 0x16, 0x84, 0x21, 0x7d, 0x97, 0x43, 0x3f, + 0x87, 0x62, 0x01, 0xcf, 0x9e, 0xf8, 0x58, 0xbf, 0x05, 0xce, 0x5d, 0xc3, + 0x24, 0x9a, 0x6a, 0x3f, 0x35, 0x51, 0x2f, 0xf7, 0xb5, 0x3c, 0x79, 0xbf, + 0x23, 0xfa, 0x27, 0xbd, 0x2d, 0x11, 0x86, 0x3f, 0xc0, 0x15, 0xcc, 0xe0, + 0x50, 0x34, 0x92, 0xbf, 0x53, 0x84, 0x81, 0x00, 0x36, 0xe8, 0x9c, 0x3f, + 0xc3, 0xda, 0x94, 0x49, 0x7e, 0x95, 0xa6, 0xbf, 0x28, 0x20, 0x91, 0x67, + 0x1b, 0xf4, 0xb1, 0x3f, 0x5c, 0x2a, 0xba, 0x9a, 0x4a, 0x32, 0xbf, 0xbf, + 0x0e, 0xd1, 0x79, 0xa8, 0x78, 0x1f, 0xd3, 0x3f, 0x51, 0x9d, 0x1c, 0x20, + 0x50, 0xac, 0xec, 0x3f, 0x4a, 0xd0, 0xb9, 0x84, 0xc6, 0xcf, 0xc5, 0xbf, + 0xb0, 0x13, 0x14, 0x45, 0x4b, 0xe6, 0xb5, 0x3f, 0x06, 0x24, 0xc7, 0x61, + 0x33, 0xfc, 0xa9, 0xbf, 0x1a, 0x30, 0x78, 0x7b, 0x42, 0x18, 0xa0, 0x3f, + 0xe7, 0x5e, 0xc1, 0x7e, 0xe1, 0xd8, 0x93, 0xbf, 0xe1, 0x74, 0xf2, 0x73, + 0x75, 0xb3, 0x87, 0x3f, 0x00, 0xec, 0x2f, 0x0a, 0xfe, 0xcc, 0x7a, 0xbf, + 0x4b, 0x95, 0x4e, 0xb6, 0x1b, 0xff, 0x6b, 0x3f, 0x2c, 0x68, 0x52, 0x37, + 0x00, 0x15, 0x5a, 0xbf, 0xf4, 0xb5, 0x38, 0x88, 0x7c, 0x53, 0x44, 0x3f, + 0xa4, 0x77, 0x6a, 0x91, 0x5e, 0x82, 0x26, 0xbf, 0x70, 0x7a, 0xf8, 0xcd, + 0x2c, 0xe7, 0x26, 0xbf, 0x7a, 0x1e, 0xa0, 0xb1, 0x5e, 0x8c, 0x44, 0x3f, + 0x59, 0x00, 0xff, 0x9c, 0x18, 0x32, 0x5a, 0xbf, 0x8a, 0x91, 0xdf, 0x10, + 0xb5, 0xe9, 0x6b, 0x3f, 0x11, 0x27, 0x5a, 0x55, 0xde, 0x7c, 0x7a, 0xbf, + 0x9e, 0x62, 0x05, 0xdc, 0x16, 0x2b, 0x87, 0x3f, 0xc8, 0x6d, 0x21, 0x36, + 0x00, 0x1f, 0x93, 0xbf, 0x59, 0x5d, 0xeb, 0x14, 0x8d, 0x61, 0x9e, 0x3f, + 0xf5, 0x60, 0x88, 0x0f, 0xcf, 0xc1, 0xa7, 0xbf, 0xc8, 0x2d, 0x14, 0x27, + 0x57, 0xea, 0xb2, 0x3f, 0xe2, 0xf7, 0xc9, 0xd2, 0xf6, 0x7c, 0xc0, 0xbf, + 0x13, 0xc6, 0x52, 0x76, 0xd0, 0x75, 0xd4, 0x3f, 0x61, 0xb6, 0xb3, 0x34, + 0xd5, 0x45, 0xec, 0x3f, 0x35, 0x88, 0x02, 0xb2, 0xda, 0x91, 0xc6, 0xbf, + 0xae, 0x1c, 0x96, 0x08, 0x4f, 0xc9, 0xb6, 0x3f, 0x9d, 0x1e, 0x57, 0x1a, + 0x77, 0x18, 0xab, 0xbf, 0x47, 0xd4, 0xc2, 0x36, 0x49, 0xcd, 0xa0, 0x3f, + 0xc3, 0xf4, 0x17, 0x41, 0xf7, 0xbb, 0x94, 0xbf, 0xd5, 0xd9, 0x42, 0x18, + 0xd7, 0xc5, 0x88, 0x3f, 0x4c, 0xe0, 0xe4, 0x66, 0xf6, 0x05, 0x7c, 0xbf, + 0xea, 0xd3, 0x57, 0xd9, 0x45, 0x48, 0x6d, 0x3f, 0xfd, 0xb3, 0x3f, 0x7f, + 0x62, 0x49, 0x5b, 0xbf, 0x2e, 0xd2, 0x17, 0x21, 0x01, 0x45, 0x45, 0x3f, + 0xba, 0x52, 0x37, 0x40, 0x20, 0x8f, 0x27, 0xbf, 0xa3, 0x8c, 0xb3, 0x2d, + 0x54, 0xe9, 0x27, 0xbf, 0xfd, 0x02, 0x08, 0x16, 0x18, 0x75, 0x45, 0x3f, + 0xa6, 0x20, 0xad, 0x64, 0x33, 0x5c, 0x5b, 0xbf, 0xa3, 0x20, 0xa7, 0x64, + 0x0b, 0x29, 0x6d, 0x3f, 0x6a, 0xbc, 0xaf, 0x15, 0xcd, 0xad, 0x7b, 0xbf, + 0x33, 0x48, 0x80, 0x84, 0xdf, 0x37, 0x88, 0x3f, 0x79, 0x93, 0xaa, 0x78, + 0x0f, 0xff, 0x93, 0xbf, 0x62, 0x9a, 0x21, 0x8e, 0x7a, 0xca, 0x9f, 0x3f, + 0xc2, 0x66, 0xce, 0x71, 0xdc, 0xe1, 0xa8, 0xbf, 0xb5, 0xd9, 0xc6, 0xac, + 0x9f, 0xd7, 0xb3, 0x3f, 0x25, 0x05, 0xeb, 0xa1, 0xa1, 0x5a, 0xc1, 0xbf, + 0x91, 0x76, 0xab, 0xcb, 0x1e, 0xce, 0xd5, 0x3f, 0xa1, 0x1c, 0x41, 0xe6, + 0x3f, 0xda, 0xeb, 0x3f, 0x0d, 0xb9, 0xfb, 0xb0, 0x71, 0x41, 0xc7, 0xbf, + 0x2f, 0x25, 0x38, 0x96, 0x43, 0x9b, 0xb7, 0x3f, 0x38, 0x91, 0xde, 0x6d, + 0x6a, 0x21, 0xac, 0xbf, 0xfc, 0xaa, 0xb4, 0x18, 0xb1, 0x76, 0xa1, 0x3f, + 0x32, 0xfb, 0x57, 0x81, 0x00, 0x91, 0x95, 0xbf, 0xa6, 0xaf, 0xe3, 0xb9, + 0xaf, 0xc7, 0x89, 0x3f, 0xa1, 0xd6, 0xdd, 0x9e, 0x71, 0x2c, 0x7d, 0xbf, + 0xc1, 0xa5, 0x75, 0x96, 0x4c, 0x7e, 0x6e, 0x3f, 0xb5, 0x5c, 0x22, 0xba, + 0x13, 0x6c, 0x5c, 0xbf, 0xda, 0xb4, 0xc3, 0xc5, 0xd4, 0x28, 0x46, 0x3f, + 0xff, 0x21, 0xc2, 0xae, 0xd3, 0x8c, 0x28, 0xbf, 0xc7, 0x64, 0x80, 0x0b, + 0x31, 0xdd, 0x28, 0xbf, 0xd7, 0xff, 0x34, 0x6f, 0x16, 0x51, 0x46, 0x3f, + 0x05, 0x04, 0x3d, 0x8b, 0x31, 0x76, 0x5c, 0xbf, 0x93, 0xcb, 0x02, 0xf2, + 0x5a, 0x57, 0x6e, 0x3f, 0x98, 0x89, 0xe3, 0xd5, 0xbc, 0xce, 0x7c, 0xbf, + 0x92, 0x2b, 0x59, 0xd9, 0xd7, 0x36, 0x89, 0x3f, 0x04, 0xda, 0x57, 0x2b, + 0xea, 0xd3, 0x94, 0xbf, 0x31, 0x92, 0x54, 0xbe, 0x05, 0x91, 0xa0, 0x3f, + 0x14, 0x61, 0x9e, 0xe2, 0xe0, 0xf4, 0xa9, 0xbf, 0xf2, 0x9a, 0x0a, 0xf5, + 0x4e, 0xbb, 0xb4, 0x3f, 0x7c, 0xce, 0xe7, 0x5d, 0x8b, 0x31, 0xc2, 0xbf, + 0x9e, 0x8b, 0x7e, 0x9a, 0xf7, 0x27, 0xd7, 0x3f, 0x5c, 0xc6, 0x0f, 0x9a, + 0xb6, 0x69, 0xeb, 0x3f, 0x22, 0xce, 0xf8, 0x25, 0xa4, 0xde, 0xc7, 0xbf, + 0x19, 0xac, 0x11, 0x59, 0xec, 0x5b, 0xb8, 0x3f, 0x4c, 0x38, 0x58, 0x8e, + 0xa0, 0x16, 0xad, 0xbf, 0x1e, 0xad, 0xfe, 0x0d, 0x2b, 0x14, 0xa2, 0x3f, + 0xb6, 0xc5, 0x53, 0xf8, 0x92, 0x57, 0x96, 0xbf, 0xbf, 0x1e, 0x59, 0x55, + 0x79, 0xb8, 0x8a, 0x3f, 0xd4, 0x39, 0xc9, 0x47, 0xd2, 0x3f, 0x7e, 0xbf, + 0x25, 0x12, 0x8b, 0xb8, 0x86, 0xa0, 0x6f, 0x3f, 0x2c, 0x61, 0xe5, 0x9f, + 0x72, 0x7c, 0x5d, 0xbf, 0xcb, 0x74, 0x4b, 0x4b, 0x77, 0xfe, 0x46, 0x3f, + 0xe8, 0xf3, 0xbc, 0x41, 0xe8, 0x7a, 0x29, 0xbf, 0xec, 0xd3, 0x76, 0x19, + 0x2a, 0xc2, 0x29, 0xbf, 0x77, 0x6c, 0x65, 0x31, 0xce, 0x1f, 0x47, 0x3f, + 0x51, 0x72, 0x16, 0xa5, 0x5e, 0x7f, 0x5d, 0xbf, 0x0c, 0x59, 0x76, 0x84, + 0xe0, 0x73, 0x6f, 0x3f, 0xa6, 0x3e, 0x93, 0x15, 0xf1, 0xde, 0x7d, 0xbf, + 0x5c, 0x68, 0x5d, 0x82, 0x57, 0x27, 0x8a, 0x3f, 0x42, 0x6a, 0x47, 0xbe, + 0x01, 0x9d, 0x95, 0xbf, 0x12, 0xf4, 0x24, 0xdb, 0xaa, 0x33, 0xa1, 0x3f, + 0xd4, 0xcb, 0xb9, 0xe1, 0x1c, 0xfa, 0xaa, 0xbf, 0x10, 0xb2, 0x13, 0xa2, + 0xc2, 0x94, 0xb5, 0x3f, 0x88, 0x47, 0x4b, 0x8c, 0x1a, 0x01, 0xc3, 0xbf, + 0x08, 0xce, 0x4f, 0x82, 0xed, 0x82, 0xd8, 0x3f, 0x65, 0xb4, 0xfa, 0x5c, + 0x61, 0xf4, 0xea, 0x3f, 0x1c, 0xa4, 0x8a, 0xf9, 0x91, 0x69, 0xc8, 0xbf, + 0x6c, 0xb2, 0x4b, 0x04, 0x17, 0x0b, 0xb9, 0x3f, 0x61, 0x20, 0xf3, 0x0e, + 0xb9, 0xf7, 0xad, 0xbf, 0x79, 0xa4, 0xc8, 0x92, 0x6f, 0xa5, 0xa2, 0x3f, + 0x81, 0x52, 0x07, 0x8a, 0x4d, 0x0f, 0x97, 0xbf, 0x89, 0xd6, 0xa9, 0xaf, + 0xb8, 0x97, 0x8b, 0x3f, 0x72, 0x68, 0x7d, 0xff, 0x86, 0x3f, 0x7f, 0xbf, + 0xb4, 0x22, 0x43, 0xbb, 0x2b, 0x57, 0x70, 0x3f, 0x9f, 0x09, 0xea, 0x5b, + 0xe9, 0x79, 0x5e, 0xbf, 0x9e, 0x18, 0xbb, 0x5c, 0x71, 0xc5, 0x47, 0x3f, + 0xfc, 0x4d, 0x2b, 0x0d, 0xd7, 0x58, 0x2a, 0xbf, 0x59, 0xb5, 0xfb, 0xb7, + 0xae, 0x97, 0x2a, 0xbf, 0xcc, 0xca, 0x78, 0x7d, 0xbb, 0xe0, 0x47, 0x3f, + 0x91, 0xf9, 0xd0, 0xe8, 0x0f, 0x77, 0x5e, 0xbf, 0x58, 0x14, 0x2b, 0x7e, + 0xf1, 0x3e, 0x70, 0x3f, 0xfa, 0xd7, 0xdf, 0xae, 0xb6, 0xdd, 0x7e, 0xbf, + 0x92, 0x7d, 0x5c, 0x18, 0xbe, 0x08, 0x8b, 0x3f, 0x03, 0x93, 0x57, 0xea, + 0xcd, 0x59, 0x96, 0xbf, 0x07, 0x45, 0x20, 0x36, 0xbc, 0xcc, 0xa1, 0x3f, + 0xb9, 0x9f, 0xdd, 0x75, 0xd7, 0xf0, 0xab, 0xbf, 0xa3, 0x83, 0x27, 0x5e, + 0x5c, 0x63, 0xb6, 0x3f, 0x9f, 0x50, 0x52, 0xde, 0xb6, 0xc8, 0xc3, 0xbf, + 0xe2, 0xf6, 0xe3, 0xfa, 0x91, 0xde, 0xd9, 0x3f, 0xaf, 0xc2, 0xa2, 0xd2, + 0x69, 0x7a, 0xea, 0x3f, 0xbc, 0xd5, 0x1e, 0x3a, 0x62, 0xe2, 0xc8, 0xbf, + 0x16, 0xeb, 0x5c, 0x8c, 0x9b, 0xa8, 0xb9, 0x3f, 0xd8, 0x06, 0x8a, 0xfb, + 0x5f, 0xc4, 0xae, 0xbf, 0xf3, 0x2f, 0xc1, 0xcc, 0x3e, 0x2a, 0xa3, 0x3f, + 0x3e, 0xd5, 0xb8, 0x6e, 0xd8, 0xb7, 0x97, 0xbf, 0xa9, 0x71, 0xcb, 0x8e, + 0xfd, 0x64, 0x8c, 0x3f, 0x18, 0x9f, 0xdf, 0x58, 0x85, 0x15, 0x80, 0xbf, + 0x40, 0xa4, 0x7e, 0x60, 0x97, 0xd3, 0x70, 0x3f, 0x4a, 0x9a, 0xcc, 0xd8, + 0xed, 0x63, 0x5f, 0xbf, 0xac, 0xfb, 0x5b, 0xb8, 0x54, 0x7d, 0x48, 0x3f, + 0xf3, 0x40, 0x4e, 0x1a, 0x23, 0x26, 0x2b, 0xbf, 0x2f, 0x1e, 0x0d, 0x52, + 0x37, 0x5d, 0x2b, 0xbf, 0x8f, 0x5a, 0x1f, 0x75, 0x62, 0x93, 0x48, 0x3f, + 0x84, 0xd1, 0x6f, 0x9c, 0xa4, 0x5c, 0x5f, 0xbf, 0x48, 0x05, 0xc1, 0xe2, + 0x59, 0xba, 0x70, 0x3f, 0xdb, 0x45, 0xb5, 0x49, 0x64, 0xca, 0x7f, 0xbf, + 0x06, 0xe8, 0xbc, 0x8c, 0x73, 0xda, 0x8b, 0x3f, 0xba, 0xcf, 0x67, 0x09, + 0xcd, 0x09, 0x97, 0xbf, 0xbb, 0xe4, 0x68, 0x5e, 0xce, 0x5b, 0xa2, 0x3f, + 0x98, 0x40, 0x5c, 0xa3, 0x5e, 0xd8, 0xac, 0xbf, 0xe2, 0x8d, 0x94, 0x3c, + 0x82, 0x26, 0xb7, 0x3f, 0x07, 0x48, 0x34, 0x7a, 0xc9, 0x87, 0xc4, 0xbf, + 0x53, 0x2e, 0x95, 0x7f, 0x75, 0x3a, 0xdb, 0x3f, 0x3c, 0x1d, 0x06, 0x24, + 0xfb, 0xfb, 0xe9, 0x3f, 0x2d, 0x77, 0xb9, 0xfa, 0x42, 0x49, 0xc9, 0xbf, + 0x0d, 0xe6, 0x63, 0x1b, 0x5c, 0x34, 0xba, 0x3f, 0x0f, 0x8f, 0x4f, 0xe9, + 0x4d, 0x7c, 0xaf, 0xbf, 0x46, 0xd3, 0xd3, 0xa0, 0x60, 0xa2, 0xa3, 0x3f, + 0xd8, 0x0b, 0xbc, 0x56, 0xe5, 0x50, 0x98, 0xbf, 0x81, 0xa5, 0xba, 0xeb, + 0xe2, 0x1f, 0x8d, 0x3f, 0xa1, 0xd9, 0x7f, 0x6b, 0xf2, 0x80, 0x80, 0xbf, + 0xeb, 0xbe, 0x4b, 0xc4, 0x44, 0x45, 0x71, 0x3f, 0x66, 0x4d, 0xce, 0x02, + 0x01, 0x1d, 0x60, 0xbf, 0x8f, 0x3c, 0x01, 0x68, 0xbc, 0x25, 0x49, 0x3f, + 0x8a, 0xc5, 0x53, 0xa8, 0x59, 0xe2, 0x2b, 0xbf, 0xe6, 0x76, 0xda, 0xa7, + 0x45, 0x12, 0x2c, 0xbf, 0xfa, 0x36, 0x5d, 0x81, 0x4f, 0x37, 0x49, 0x3f, + 0x7e, 0x1d, 0x92, 0x39, 0xc3, 0x17, 0x60, 0xbf, 0x57, 0xd9, 0xad, 0x9f, + 0xd7, 0x2b, 0x71, 0x3f, 0x45, 0xa1, 0x42, 0x61, 0x2d, 0x52, 0x80, 0xbf, + 0x0c, 0x97, 0x4d, 0x87, 0xe8, 0x9b, 0x8c, 0x3f, 0x17, 0x40, 0x8c, 0x67, + 0x84, 0xac, 0x97, 0xbf, 0xed, 0x35, 0xaf, 0x1d, 0x7b, 0xe0, 0xa2, 0x3f, + 0xa1, 0xe7, 0xd8, 0xdc, 0x07, 0xb0, 0xad, 0xbf, 0x9d, 0x5a, 0x99, 0x17, + 0x9f, 0xdd, 0xb7, 0x3f, 0x01, 0xfd, 0x63, 0x43, 0xbd, 0x3d, 0xc5, 0xbf, + 0x48, 0xa2, 0xbc, 0xba, 0x27, 0x96, 0xdc, 0x3f, 0x32, 0x95, 0xbb, 0xed, + 0x41, 0x79, 0xe9, 0x3f, 0xb8, 0x18, 0xbb, 0x2f, 0x69, 0x9e, 0xc9, 0xbf, + 0x99, 0xd9, 0x43, 0x02, 0x45, 0xae, 0xba, 0x3f, 0xc9, 0xc5, 0xb8, 0x01, + 0xa4, 0x0f, 0xb0, 0xbf, 0x54, 0x12, 0xc0, 0xc6, 0xa4, 0x0d, 0xa4, 0x3f, + 0x08, 0xf1, 0x47, 0x8c, 0x2f, 0xda, 0x98, 0xbf, 0x72, 0x18, 0x3b, 0x23, + 0x0f, 0xc8, 0x8d, 0x3f, 0x7f, 0xf6, 0x64, 0xd9, 0xd4, 0xe1, 0x80, 0xbf, + 0xb5, 0xf3, 0xc7, 0x02, 0xf9, 0xab, 0x71, 0x3f, 0x89, 0xf8, 0xd1, 0x0e, + 0xda, 0x7d, 0x60, 0xbf, 0xa3, 0x3a, 0xce, 0xfc, 0x4c, 0xbe, 0x49, 0x3f, + 0xde, 0x70, 0x42, 0x73, 0x12, 0x8d, 0x2c, 0xbf, 0xa2, 0xa8, 0x03, 0x2a, + 0x65, 0xb6, 0x2c, 0xbf, 0xd1, 0xbb, 0x68, 0xa4, 0x17, 0xcc, 0x49, 0x3f, + 0x82, 0x72, 0x3f, 0xfb, 0x94, 0x77, 0x60, 0xbf, 0x54, 0xc4, 0x30, 0x97, + 0x1e, 0x93, 0x71, 0x3f, 0x2a, 0x36, 0x13, 0xcc, 0x82, 0xb5, 0x80, 0xbf, + 0xba, 0xf3, 0xd6, 0xc8, 0x96, 0x4c, 0x8d, 0x3f, 0xf8, 0x8e, 0x1f, 0x97, + 0x80, 0x41, 0x98, 0xbf, 0x53, 0x89, 0xd6, 0xbd, 0x61, 0x5a, 0xa3, 0x3f, + 0xcb, 0xdd, 0xcf, 0x75, 0x30, 0x77, 0xae, 0xbf, 0x2e, 0xc7, 0x9b, 0xef, + 0x22, 0x88, 0xb8, 0x3f, 0x2b, 0xd5, 0x2a, 0x24, 0xff, 0xe9, 0xc5, 0xbf, + 0x0d, 0xa5, 0x6f, 0xb2, 0x37, 0xf1, 0xdd, 0x3f, 0x2b, 0x44, 0x31, 0x2d, + 0x6c, 0xf2, 0xe8, 0x3f, 0x71, 0xda, 0x43, 0x87, 0x10, 0xe2, 0xc9, 0xbf, + 0x6a, 0x36, 0x03, 0xa2, 0x4c, 0x16, 0xbb, 0x3f, 0x99, 0xaf, 0xe8, 0x05, + 0x90, 0x56, 0xb0, 0xbf, 0x26, 0xe1, 0x0e, 0xd4, 0xe2, 0x6b, 0xa4, 0x3f, + 0x83, 0x53, 0x3e, 0x09, 0x7c, 0x53, 0x99, 0xbf, 0x72, 0x26, 0x7d, 0x16, + 0x34, 0x5d, 0x8e, 0x3f, 0xbb, 0x88, 0xf6, 0x3e, 0xfd, 0x37, 0x81, 0xbf, + 0x53, 0xe0, 0xd3, 0xf3, 0x7f, 0x07, 0x72, 0x3f, 0xc8, 0xc3, 0xd1, 0x6b, + 0x4f, 0xd4, 0x60, 0xbf, 0xa7, 0xb4, 0x56, 0xb5, 0xb4, 0x46, 0x4a, 0x3f, + 0x27, 0xe1, 0xcb, 0xde, 0xef, 0x25, 0x2d, 0xbf, 0x27, 0x32, 0xba, 0x37, + 0x2b, 0x49, 0x2d, 0xbf, 0x4d, 0x47, 0x74, 0xb5, 0x58, 0x51, 0x4a, 0x3f, + 0xe3, 0xa6, 0x81, 0x6b, 0x87, 0xcd, 0x60, 0xbf, 0xf1, 0xba, 0x4e, 0x8b, + 0xe8, 0xef, 0x71, 0x3f, 0x38, 0x3f, 0x21, 0xa3, 0xed, 0x0e, 0x81, 0xbf, + 0x17, 0xfc, 0xb9, 0x7e, 0x01, 0xec, 0x8d, 0x3f, 0xe4, 0xeb, 0x23, 0xba, + 0x55, 0xc8, 0x98, 0xbf, 0x3b, 0xe8, 0x6f, 0x47, 0x27, 0xc9, 0xa3, 0x3f, + 0x64, 0xbd, 0x2f, 0x0c, 0x3e, 0x2d, 0xaf, 0xbf, 0x9e, 0x2e, 0x72, 0x45, + 0x83, 0x25, 0xb9, 0x3f, 0x00, 0x60, 0x29, 0x55, 0xfe, 0x8b, 0xc6, 0xbf, + 0xf1, 0x99, 0xbf, 0xf4, 0x33, 0x4b, 0xdf, 0x3f, 0x95, 0x94, 0xd5, 0x2d, + 0xa9, 0x67, 0xe8, 0x3f, 0x34, 0x7c, 0x9b, 0x40, 0x7b, 0x14, 0xca, 0xbf, + 0xc7, 0xeb, 0x8b, 0x53, 0x73, 0x6c, 0xbb, 0x3f, 0xa4, 0x84, 0x2b, 0x2d, + 0xda, 0x92, 0xb0, 0xbf, 0x79, 0x7b, 0x02, 0x47, 0xfa, 0xbc, 0xa4, 0x3f, + 0xfa, 0x3b, 0x3c, 0x8e, 0x99, 0xbc, 0x99, 0xbf, 0x71, 0xee, 0x12, 0x4f, + 0x0f, 0xdf, 0x8e, 0x3f, 0x36, 0xa2, 0x50, 0xcb, 0x42, 0x83, 0x81, 0xbf, + 0xf2, 0x66, 0x7e, 0x47, 0xac, 0x57, 0x72, 0x3f, 0x97, 0x5b, 0x1c, 0xd0, + 0x34, 0x20, 0x61, 0xbf, 0xd4, 0x4c, 0x3f, 0xaf, 0xab, 0xbe, 0x4a, 0x3f, + 0xb0, 0x83, 0x6f, 0x32, 0x9f, 0xac, 0x2d, 0xbf, 0xdf, 0xb4, 0x89, 0x67, + 0x37, 0xca, 0x2d, 0xbf, 0x95, 0xb0, 0x61, 0xa3, 0xb9, 0xc6, 0x4a, 0x3f, + 0x61, 0xd6, 0xa6, 0x21, 0x60, 0x19, 0x61, 0xbf, 0xda, 0xf9, 0x9b, 0x4d, + 0xf5, 0x41, 0x72, 0x3f, 0xcf, 0xf2, 0x97, 0xd1, 0x2e, 0x5e, 0x81, 0xbf, + 0xf2, 0xde, 0x79, 0x98, 0xb5, 0x79, 0x8e, 0x3f, 0x08, 0x4b, 0x7d, 0xcc, + 0x9f, 0x40, 0x99, 0xbf, 0x43, 0xfe, 0x70, 0xc0, 0x76, 0x2c, 0xa4, 0x3f, + 0xf1, 0x3d, 0xf5, 0xf1, 0x9e, 0xd1, 0xaf, 0xbf, 0xdf, 0x16, 0xdc, 0x74, + 0x3b, 0xb5, 0xb9, 0x3f, 0x5a, 0x45, 0x86, 0xa5, 0x2c, 0x23, 0xc7, 0xbf, + 0x25, 0x6b, 0x78, 0x62, 0xd5, 0x51, 0xe0, 0x3f, 0x60, 0x69, 0x6f, 0x75, + 0x29, 0xd9, 0xe7, 0x3f, 0xaf, 0x7e, 0xc9, 0xff, 0xf1, 0x35, 0xca, 0xbf, + 0xde, 0x03, 0x93, 0x48, 0xc3, 0xb0, 0xbb, 0x3f, 0xf0, 0xd7, 0xdc, 0xe8, + 0x77, 0xc4, 0xb0, 0xbf, 0x80, 0x81, 0xf2, 0x89, 0xd2, 0x00, 0xa5, 0x3f, + 0x8c, 0xa2, 0x30, 0xaf, 0x60, 0x15, 0x9a, 0xbf, 0x77, 0xde, 0x0d, 0x15, + 0x6a, 0x4d, 0x8f, 0x3f, 0x02, 0xe7, 0xb7, 0x4f, 0x83, 0xc3, 0x81, 0xbf, + 0x7d, 0x1e, 0x85, 0x98, 0x57, 0x9c, 0x72, 0x3f, 0x51, 0x93, 0xe7, 0x5f, + 0x64, 0x61, 0x61, 0xbf, 0x17, 0xb7, 0x01, 0x07, 0xf4, 0x25, 0x4b, 0x3f, + 0x83, 0x65, 0xae, 0xbe, 0xd8, 0x20, 0x2e, 0xbf, 0xdb, 0x26, 0xf9, 0xc1, + 0x33, 0x39, 0x2e, 0xbf, 0x6a, 0xa2, 0x36, 0xac, 0xea, 0x2b, 0x4b, 0x3f, + 0xe1, 0x7c, 0x17, 0x99, 0xea, 0x5a, 0x61, 0xbf, 0x25, 0x1a, 0xa7, 0xe8, + 0x0a, 0x89, 0x72, 0x3f, 0x95, 0xf8, 0x59, 0x19, 0x0d, 0xa3, 0x81, 0xbf, + 0xd6, 0x36, 0x6a, 0x14, 0x4a, 0xf5, 0x8e, 0x3f, 0x27, 0xcf, 0x94, 0xe7, + 0x02, 0xaa, 0x99, 0xbf, 0xd4, 0x1a, 0x53, 0x66, 0x01, 0x84, 0xa4, 0x3f, + 0xfc, 0x64, 0x6c, 0x48, 0xe5, 0x31, 0xb0, 0xbf, 0x84, 0x73, 0xaf, 0x0b, + 0xcd, 0x36, 0xba, 0x3f, 0x16, 0xc1, 0xda, 0xc1, 0xfe, 0xae, 0xc7, 0xbf, + 0x86, 0x34, 0x51, 0x24, 0x15, 0xfd, 0xe0, 0x3f, 0x5b, 0x70, 0x27, 0xb0, + 0x1e, 0x47, 0xe7, 0x3f, 0xe9, 0x57, 0x44, 0x9f, 0xc3, 0x46, 0xca, 0xbf, + 0xa9, 0xa3, 0x0b, 0x69, 0x50, 0xe3, 0xbb, 0x3f, 0x3c, 0x9b, 0xc3, 0xe7, + 0x64, 0xeb, 0xb0, 0xbf, 0xeb, 0x56, 0xcc, 0xf3, 0x5a, 0x37, 0xa5, 0x3f, + 0x41, 0x14, 0xc6, 0xdc, 0xb3, 0x5d, 0x9a, 0xbf, 0xe8, 0x84, 0xe2, 0x81, + 0x19, 0xa8, 0x8f, 0x3f, 0xf9, 0xef, 0x9c, 0x4d, 0xa3, 0xf8, 0x81, 0xbf, + 0x3f, 0x52, 0xcb, 0x7d, 0x62, 0xd5, 0x72, 0x3f, 0x81, 0xdf, 0xd6, 0xbf, + 0xbe, 0x97, 0x61, 0xbf, 0x21, 0x96, 0x04, 0xf8, 0x59, 0x7c, 0x4b, 0x3f, + 0x60, 0x5c, 0x4e, 0x04, 0x60, 0x82, 0x2e, 0xbf, 0x16, 0xaf, 0x93, 0xfa, + 0xd4, 0x95, 0x2e, 0xbf, 0x64, 0x96, 0x81, 0x92, 0xa5, 0x80, 0x4b, 0x3f, + 0x31, 0xcd, 0xd1, 0x54, 0xf8, 0x91, 0x61, 0xbf, 0xd2, 0xed, 0x82, 0xc7, + 0xf5, 0xc4, 0x72, 0x3f, 0xf0, 0x5c, 0x75, 0x3a, 0x55, 0xdd, 0x81, 0xbf, + 0x75, 0xaf, 0xd4, 0x48, 0x60, 0x5e, 0x8f, 0x3f, 0x7e, 0x4e, 0x05, 0x83, + 0x2b, 0x04, 0x9a, 0xbf, 0x28, 0x42, 0xe8, 0xe5, 0x7e, 0xcf, 0xa4, 0x3f, + 0x55, 0x83, 0x66, 0xe5, 0xa0, 0x71, 0xb0, 0xbf, 0x53, 0x53, 0x44, 0x1f, + 0xc0, 0xa9, 0xba, 0x3f, 0x1d, 0x13, 0xae, 0x7a, 0xec, 0x2e, 0xc8, 0xbf, + 0xa0, 0x67, 0xa9, 0x5a, 0x20, 0xa7, 0xe1, 0x3f, 0x99, 0x96, 0x0b, 0x9c, + 0xbb, 0xb1, 0xe6, 0x3f, 0xd7, 0xf6, 0xdb, 0xfe, 0x44, 0x47, 0xca, 0xbf, + 0x87, 0x3d, 0x82, 0x2b, 0x38, 0x04, 0xbc, 0x3f, 0x5c, 0x3f, 0x3e, 0x0a, + 0xa3, 0x07, 0xb1, 0xbf, 0x63, 0x84, 0x43, 0xc3, 0x8a, 0x60, 0xa5, 0x3f, + 0xc8, 0xd9, 0xc5, 0x66, 0x7f, 0x95, 0x9a, 0xbf, 0xdb, 0x51, 0x6e, 0x8a, + 0xfe, 0xee, 0x8f, 0x3f, 0x3b, 0xb3, 0x59, 0xff, 0x8d, 0x22, 0x82, 0xbf, + 0xfc, 0xe3, 0x05, 0x96, 0xb4, 0x02, 0x73, 0x3f, 0xfb, 0x27, 0xcf, 0x21, + 0x2b, 0xc3, 0x61, 0xbf, 0x29, 0x06, 0x3d, 0xf3, 0xb3, 0xc1, 0x4b, 0x3f, + 0x1e, 0x7c, 0x2a, 0xd0, 0x03, 0xd1, 0x2e, 0xbf, 0xb0, 0xfd, 0x97, 0xa1, + 0xda, 0xdf, 0x2e, 0xbf, 0xe1, 0xb9, 0x5e, 0xcc, 0xad, 0xc4, 0x4b, 0x3f, + 0xed, 0xd5, 0xf3, 0xfe, 0x60, 0xbe, 0x61, 0xbf, 0xbd, 0xf5, 0x3d, 0xd9, + 0x88, 0xf5, 0x72, 0x3f, 0x80, 0x32, 0xdc, 0x16, 0xda, 0x0c, 0x82, 0xbf, + 0xf6, 0x9e, 0xdc, 0x26, 0xa4, 0xb4, 0x8f, 0x3f, 0x5a, 0x1c, 0x66, 0xb0, + 0xce, 0x4e, 0x9a, 0xbf, 0x7f, 0xcb, 0x9f, 0x8f, 0xad, 0x0e, 0xa5, 0x3f, + 0xc8, 0x91, 0xd7, 0xaa, 0xc7, 0xa7, 0xb0, 0xbf, 0xf8, 0x4c, 0x21, 0x9f, + 0xa3, 0x0d, 0xbb, 0x3f, 0x77, 0x59, 0xec, 0x09, 0x71, 0xa2, 0xc8, 0xbf, + 0x38, 0xf3, 0xf8, 0x3e, 0xbe, 0x4f, 0xe2, 0x3f, 0x08, 0xcd, 0x33, 0xf4, + 0x33, 0x19, 0xe6, 0x3f, 0x9c, 0xa6, 0x6c, 0xd0, 0xd0, 0x37, 0xca, 0xbf, + 0xa8, 0x4f, 0x4f, 0x69, 0xa1, 0x13, 0xbc, 0x3f, 0xb9, 0xab, 0x5b, 0x53, + 0x3a, 0x19, 0xb1, 0xbf, 0xfb, 0x9e, 0xeb, 0x15, 0x61, 0x7c, 0xa5, 0x3f, + 0x03, 0xd6, 0x54, 0x79, 0xb9, 0xbc, 0x9a, 0xbf, 0xc5, 0xac, 0x6b, 0x01, + 0x03, 0x11, 0x90, 0x3f, 0x6a, 0xf1, 0x7f, 0x5d, 0x35, 0x41, 0x82, 0xbf, + 0x08, 0x77, 0xe4, 0x8f, 0x3c, 0x24, 0x73, 0x3f, 0xe3, 0xe5, 0x9e, 0x4e, + 0x97, 0xe3, 0x61, 0xbf, 0x87, 0x95, 0x16, 0xb1, 0xe2, 0xf5, 0x4b, 0x3f, + 0x6e, 0xb1, 0x2d, 0x52, 0x9e, 0x0c, 0x2f, 0xbf, 0xd6, 0xa4, 0xbf, 0x4c, + 0x0f, 0x17, 0x2f, 0xbf, 0x54, 0x28, 0x0b, 0xab, 0xd0, 0xf7, 0x4b, 0x3f, + 0xa4, 0x06, 0xc5, 0x83, 0x02, 0xe0, 0x61, 0xbf, 0x23, 0x39, 0xc6, 0xaf, + 0x9d, 0x1a, 0x73, 0x3f, 0x28, 0x7b, 0xf8, 0xd1, 0x74, 0x31, 0x82, 0xbf, + 0x89, 0x6f, 0x80, 0x76, 0xcc, 0xf7, 0x8f, 0x3f, 0x37, 0x37, 0xc0, 0x51, + 0xaa, 0x89, 0x9a, 0xbf, 0x56, 0x2b, 0xe9, 0x87, 0x52, 0x41, 0xa5, 0x3f, + 0x13, 0x0c, 0xdc, 0x08, 0x24, 0xd4, 0xb0, 0xbf, 0xee, 0x8c, 0x9b, 0xa4, + 0x0d, 0x62, 0xbb, 0x3f, 0x18, 0x36, 0x27, 0x57, 0x0b, 0x09, 0xc9, 0xbf, + 0x7f, 0x0d, 0x32, 0x40, 0xb6, 0xf6, 0xe2, 0x3f, 0x3e, 0x44, 0x95, 0x5b, + 0xbc, 0x7d, 0xe5, 0x3f, 0x93, 0x3e, 0x83, 0x62, 0xc7, 0x18, 0xca, 0xbf, + 0x1f, 0xd7, 0xd8, 0x2e, 0xbc, 0x11, 0xbc, 0x3f, 0xa6, 0x15, 0x04, 0xd7, + 0x38, 0x20, 0xb1, 0xbf, 0xf2, 0x5c, 0x68, 0xdb, 0xe4, 0x8a, 0xa5, 0x3f, + 0x46, 0x2d, 0x43, 0x15, 0x62, 0xd3, 0x9a, 0xbf, 0xcd, 0x99, 0x46, 0x4e, + 0x94, 0x20, 0x90, 0x3f, 0x7c, 0x6f, 0xe2, 0x20, 0x92, 0x54, 0x82, 0xbf, + 0x87, 0xda, 0xe4, 0x2e, 0xf0, 0x39, 0x73, 0x3f, 0xee, 0xa8, 0xa4, 0xac, + 0xf7, 0xf8, 0x61, 0xbf, 0x92, 0x71, 0xe0, 0x3e, 0xd1, 0x18, 0x4c, 0x3f, + 0xf7, 0x8a, 0xab, 0x2f, 0x15, 0x35, 0x2f, 0xbf, 0x35, 0x57, 0x9b, 0xbf, + 0x48, 0x3b, 0x2f, 0xbf, 0xe0, 0xe6, 0x1e, 0x81, 0xe5, 0x19, 0x4c, 0x3f, + 0x30, 0x25, 0x7d, 0x2b, 0xc1, 0xf6, 0x61, 0xbf, 0x9a, 0xfc, 0x22, 0x9d, + 0x14, 0x34, 0x73, 0x3f, 0x23, 0x91, 0x6e, 0xee, 0x04, 0x4b, 0x82, 0xbf, + 0xf5, 0xc9, 0x8d, 0x87, 0xcd, 0x13, 0x90, 0x3f, 0x17, 0x69, 0xf5, 0x4c, + 0x85, 0xb4, 0x9a, 0xbf, 0xd8, 0xb6, 0x22, 0xf5, 0x39, 0x67, 0xa5, 0x3f, + 0xe5, 0x0e, 0x2d, 0xae, 0x85, 0xf6, 0xb0, 0xbf, 0xd6, 0xde, 0x52, 0xc0, + 0x9b, 0xa6, 0xbb, 0x3f, 0x40, 0x33, 0x17, 0x3b, 0x3e, 0x62, 0xc9, 0xbf, + 0x79, 0x26, 0x99, 0x19, 0xd0, 0x9b, 0xe3, 0x3f, 0x27, 0xfc, 0x65, 0x47, + 0x8a, 0xdf, 0xe4, 0x3f, 0xd4, 0xca, 0x77, 0x68, 0x8e, 0xea, 0xc9, 0xbf, + 0x6f, 0x10, 0xf2, 0x86, 0xc1, 0xfe, 0xbb, 0x3f, 0xd5, 0xaf, 0x56, 0xa4, + 0xb2, 0x1c, 0xb1, 0xbf, 0xac, 0xf9, 0x41, 0xc3, 0x24, 0x8c, 0xa5, 0x3f, + 0x7f, 0x58, 0x29, 0x01, 0x83, 0xd9, 0x9a, 0xbf, 0x34, 0x16, 0x8c, 0x6d, + 0x35, 0x26, 0x90, 0x3f, 0x62, 0x60, 0x19, 0xbf, 0xa3, 0x5c, 0x82, 0xbf, + 0x0c, 0xcf, 0x0a, 0x4a, 0xcc, 0x43, 0x73, 0x3f, 0x51, 0x27, 0x6b, 0x40, + 0x47, 0x03, 0x62, 0xbf, 0x20, 0xe2, 0x28, 0x02, 0x75, 0x2a, 0x4c, 0x3f, + 0x31, 0x32, 0x8b, 0x89, 0x59, 0x4a, 0x2f, 0xbf, 0x93, 0xcb, 0x79, 0x04, + 0x68, 0x4c, 0x2f, 0xbf, 0x67, 0xf7, 0x76, 0xbc, 0xcd, 0x2a, 0x4c, 0x3f, + 0x11, 0xfc, 0xe0, 0xac, 0x87, 0x02, 0x62, 0xbf, 0xfc, 0xe1, 0xa4, 0xc9, + 0xd4, 0x41, 0x73, 0x3f, 0xba, 0x4e, 0xb3, 0x65, 0x70, 0x59, 0x82, 0xbf, + 0xb5, 0x6a, 0xf9, 0x82, 0xee, 0x21, 0x90, 0x3f, 0xdb, 0xd6, 0xa2, 0xb7, + 0x2f, 0xcf, 0x9a, 0xbf, 0xa6, 0x32, 0x2d, 0x28, 0x37, 0x80, 0xa5, 0x3f, + 0x0a, 0xc3, 0xf9, 0xad, 0xc1, 0x0e, 0xb1, 0xbf, 0xf3, 0x7e, 0x6a, 0x43, + 0xf3, 0xda, 0xbb, 0x3f, 0x6a, 0x79, 0x2b, 0xc1, 0x90, 0xad, 0xc9, 0xbf, + 0xbe, 0xa7, 0x61, 0xe9, 0xd3, 0x3e, 0xe4, 0x3f, 0xbe, 0xa7, 0x61, 0xe9, + 0xd3, 0x3e, 0xe4, 0x3f, 0x6a, 0x79, 0x2b, 0xc1, 0x90, 0xad, 0xc9, 0xbf, + 0xf3, 0x7e, 0x6a, 0x43, 0xf3, 0xda, 0xbb, 0x3f, 0x0a, 0xc3, 0xf9, 0xad, + 0xc1, 0x0e, 0xb1, 0xbf, 0xa6, 0x32, 0x2d, 0x28, 0x37, 0x80, 0xa5, 0x3f, + 0xdb, 0xd6, 0xa2, 0xb7, 0x2f, 0xcf, 0x9a, 0xbf, 0xb5, 0x6a, 0xf9, 0x82, + 0xee, 0x21, 0x90, 0x3f, 0xba, 0x4e, 0xb3, 0x65, 0x70, 0x59, 0x82, 0xbf, + 0xfc, 0xe1, 0xa4, 0xc9, 0xd4, 0x41, 0x73, 0x3f, 0x11, 0xfc, 0xe0, 0xac, + 0x87, 0x02, 0x62, 0xbf, 0x67, 0xf7, 0x76, 0xbc, 0xcd, 0x2a, 0x4c, 0x3f, + 0x93, 0xcb, 0x79, 0x04, 0x68, 0x4c, 0x2f, 0xbf, 0x31, 0x32, 0x8b, 0x89, + 0x59, 0x4a, 0x2f, 0xbf, 0x20, 0xe2, 0x28, 0x02, 0x75, 0x2a, 0x4c, 0x3f, + 0x51, 0x27, 0x6b, 0x40, 0x47, 0x03, 0x62, 0xbf, 0x0c, 0xcf, 0x0a, 0x4a, + 0xcc, 0x43, 0x73, 0x3f, 0x62, 0x60, 0x19, 0xbf, 0xa3, 0x5c, 0x82, 0xbf, + 0x34, 0x16, 0x8c, 0x6d, 0x35, 0x26, 0x90, 0x3f, 0x7f, 0x58, 0x29, 0x01, + 0x83, 0xd9, 0x9a, 0xbf, 0xac, 0xf9, 0x41, 0xc3, 0x24, 0x8c, 0xa5, 0x3f, + 0xd5, 0xaf, 0x56, 0xa4, 0xb2, 0x1c, 0xb1, 0xbf, 0x6f, 0x10, 0xf2, 0x86, + 0xc1, 0xfe, 0xbb, 0x3f, 0xd4, 0xca, 0x77, 0x68, 0x8e, 0xea, 0xc9, 0xbf, + 0x27, 0xfc, 0x65, 0x47, 0x8a, 0xdf, 0xe4, 0x3f, 0x79, 0x26, 0x99, 0x19, + 0xd0, 0x9b, 0xe3, 0x3f, 0x40, 0x33, 0x17, 0x3b, 0x3e, 0x62, 0xc9, 0xbf, + 0xd6, 0xde, 0x52, 0xc0, 0x9b, 0xa6, 0xbb, 0x3f, 0xe5, 0x0e, 0x2d, 0xae, + 0x85, 0xf6, 0xb0, 0xbf, 0xd8, 0xb6, 0x22, 0xf5, 0x39, 0x67, 0xa5, 0x3f, + 0x17, 0x69, 0xf5, 0x4c, 0x85, 0xb4, 0x9a, 0xbf, 0xf5, 0xc9, 0x8d, 0x87, + 0xcd, 0x13, 0x90, 0x3f, 0x23, 0x91, 0x6e, 0xee, 0x04, 0x4b, 0x82, 0xbf, + 0x9a, 0xfc, 0x22, 0x9d, 0x14, 0x34, 0x73, 0x3f, 0x30, 0x25, 0x7d, 0x2b, + 0xc1, 0xf6, 0x61, 0xbf, 0xe0, 0xe6, 0x1e, 0x81, 0xe5, 0x19, 0x4c, 0x3f, + 0x35, 0x57, 0x9b, 0xbf, 0x48, 0x3b, 0x2f, 0xbf, 0xf7, 0x8a, 0xab, 0x2f, + 0x15, 0x35, 0x2f, 0xbf, 0x92, 0x71, 0xe0, 0x3e, 0xd1, 0x18, 0x4c, 0x3f, + 0xee, 0xa8, 0xa4, 0xac, 0xf7, 0xf8, 0x61, 0xbf, 0x87, 0xda, 0xe4, 0x2e, + 0xf0, 0x39, 0x73, 0x3f, 0x7c, 0x6f, 0xe2, 0x20, 0x92, 0x54, 0x82, 0xbf, + 0xcd, 0x99, 0x46, 0x4e, 0x94, 0x20, 0x90, 0x3f, 0x46, 0x2d, 0x43, 0x15, + 0x62, 0xd3, 0x9a, 0xbf, 0xf2, 0x5c, 0x68, 0xdb, 0xe4, 0x8a, 0xa5, 0x3f, + 0xa6, 0x15, 0x04, 0xd7, 0x38, 0x20, 0xb1, 0xbf, 0x1f, 0xd7, 0xd8, 0x2e, + 0xbc, 0x11, 0xbc, 0x3f, 0x93, 0x3e, 0x83, 0x62, 0xc7, 0x18, 0xca, 0xbf, + 0x3e, 0x44, 0x95, 0x5b, 0xbc, 0x7d, 0xe5, 0x3f, 0x7f, 0x0d, 0x32, 0x40, + 0xb6, 0xf6, 0xe2, 0x3f, 0x18, 0x36, 0x27, 0x57, 0x0b, 0x09, 0xc9, 0xbf, + 0xee, 0x8c, 0x9b, 0xa4, 0x0d, 0x62, 0xbb, 0x3f, 0x13, 0x0c, 0xdc, 0x08, + 0x24, 0xd4, 0xb0, 0xbf, 0x56, 0x2b, 0xe9, 0x87, 0x52, 0x41, 0xa5, 0x3f, + 0x37, 0x37, 0xc0, 0x51, 0xaa, 0x89, 0x9a, 0xbf, 0x89, 0x6f, 0x80, 0x76, + 0xcc, 0xf7, 0x8f, 0x3f, 0x28, 0x7b, 0xf8, 0xd1, 0x74, 0x31, 0x82, 0xbf, + 0x23, 0x39, 0xc6, 0xaf, 0x9d, 0x1a, 0x73, 0x3f, 0xa4, 0x06, 0xc5, 0x83, + 0x02, 0xe0, 0x61, 0xbf, 0x54, 0x28, 0x0b, 0xab, 0xd0, 0xf7, 0x4b, 0x3f, + 0xd6, 0xa4, 0xbf, 0x4c, 0x0f, 0x17, 0x2f, 0xbf, 0x6e, 0xb1, 0x2d, 0x52, + 0x9e, 0x0c, 0x2f, 0xbf, 0x87, 0x95, 0x16, 0xb1, 0xe2, 0xf5, 0x4b, 0x3f, + 0xe3, 0xe5, 0x9e, 0x4e, 0x97, 0xe3, 0x61, 0xbf, 0x08, 0x77, 0xe4, 0x8f, + 0x3c, 0x24, 0x73, 0x3f, 0x6a, 0xf1, 0x7f, 0x5d, 0x35, 0x41, 0x82, 0xbf, + 0xc5, 0xac, 0x6b, 0x01, 0x03, 0x11, 0x90, 0x3f, 0x03, 0xd6, 0x54, 0x79, + 0xb9, 0xbc, 0x9a, 0xbf, 0xfb, 0x9e, 0xeb, 0x15, 0x61, 0x7c, 0xa5, 0x3f, + 0xb9, 0xab, 0x5b, 0x53, 0x3a, 0x19, 0xb1, 0xbf, 0xa8, 0x4f, 0x4f, 0x69, + 0xa1, 0x13, 0xbc, 0x3f, 0x9c, 0xa6, 0x6c, 0xd0, 0xd0, 0x37, 0xca, 0xbf, + 0x08, 0xcd, 0x33, 0xf4, 0x33, 0x19, 0xe6, 0x3f, 0x38, 0xf3, 0xf8, 0x3e, + 0xbe, 0x4f, 0xe2, 0x3f, 0x77, 0x59, 0xec, 0x09, 0x71, 0xa2, 0xc8, 0xbf, + 0xf8, 0x4c, 0x21, 0x9f, 0xa3, 0x0d, 0xbb, 0x3f, 0xc8, 0x91, 0xd7, 0xaa, + 0xc7, 0xa7, 0xb0, 0xbf, 0x7f, 0xcb, 0x9f, 0x8f, 0xad, 0x0e, 0xa5, 0x3f, + 0x5a, 0x1c, 0x66, 0xb0, 0xce, 0x4e, 0x9a, 0xbf, 0xf6, 0x9e, 0xdc, 0x26, + 0xa4, 0xb4, 0x8f, 0x3f, 0x80, 0x32, 0xdc, 0x16, 0xda, 0x0c, 0x82, 0xbf, + 0xbd, 0xf5, 0x3d, 0xd9, 0x88, 0xf5, 0x72, 0x3f, 0xed, 0xd5, 0xf3, 0xfe, + 0x60, 0xbe, 0x61, 0xbf, 0xe1, 0xb9, 0x5e, 0xcc, 0xad, 0xc4, 0x4b, 0x3f, + 0xb0, 0xfd, 0x97, 0xa1, 0xda, 0xdf, 0x2e, 0xbf, 0x1e, 0x7c, 0x2a, 0xd0, + 0x03, 0xd1, 0x2e, 0xbf, 0x29, 0x06, 0x3d, 0xf3, 0xb3, 0xc1, 0x4b, 0x3f, + 0xfb, 0x27, 0xcf, 0x21, 0x2b, 0xc3, 0x61, 0xbf, 0xfc, 0xe3, 0x05, 0x96, + 0xb4, 0x02, 0x73, 0x3f, 0x3b, 0xb3, 0x59, 0xff, 0x8d, 0x22, 0x82, 0xbf, + 0xdb, 0x51, 0x6e, 0x8a, 0xfe, 0xee, 0x8f, 0x3f, 0xc8, 0xd9, 0xc5, 0x66, + 0x7f, 0x95, 0x9a, 0xbf, 0x63, 0x84, 0x43, 0xc3, 0x8a, 0x60, 0xa5, 0x3f, + 0x5c, 0x3f, 0x3e, 0x0a, 0xa3, 0x07, 0xb1, 0xbf, 0x87, 0x3d, 0x82, 0x2b, + 0x38, 0x04, 0xbc, 0x3f, 0xd7, 0xf6, 0xdb, 0xfe, 0x44, 0x47, 0xca, 0xbf, + 0x99, 0x96, 0x0b, 0x9c, 0xbb, 0xb1, 0xe6, 0x3f, 0xa0, 0x67, 0xa9, 0x5a, + 0x20, 0xa7, 0xe1, 0x3f, 0x1d, 0x13, 0xae, 0x7a, 0xec, 0x2e, 0xc8, 0xbf, + 0x53, 0x53, 0x44, 0x1f, 0xc0, 0xa9, 0xba, 0x3f, 0x55, 0x83, 0x66, 0xe5, + 0xa0, 0x71, 0xb0, 0xbf, 0x28, 0x42, 0xe8, 0xe5, 0x7e, 0xcf, 0xa4, 0x3f, + 0x7e, 0x4e, 0x05, 0x83, 0x2b, 0x04, 0x9a, 0xbf, 0x75, 0xaf, 0xd4, 0x48, + 0x60, 0x5e, 0x8f, 0x3f, 0xf0, 0x5c, 0x75, 0x3a, 0x55, 0xdd, 0x81, 0xbf, + 0xd2, 0xed, 0x82, 0xc7, 0xf5, 0xc4, 0x72, 0x3f, 0x31, 0xcd, 0xd1, 0x54, + 0xf8, 0x91, 0x61, 0xbf, 0x64, 0x96, 0x81, 0x92, 0xa5, 0x80, 0x4b, 0x3f, + 0x16, 0xaf, 0x93, 0xfa, 0xd4, 0x95, 0x2e, 0xbf, 0x60, 0x5c, 0x4e, 0x04, + 0x60, 0x82, 0x2e, 0xbf, 0x21, 0x96, 0x04, 0xf8, 0x59, 0x7c, 0x4b, 0x3f, + 0x81, 0xdf, 0xd6, 0xbf, 0xbe, 0x97, 0x61, 0xbf, 0x3f, 0x52, 0xcb, 0x7d, + 0x62, 0xd5, 0x72, 0x3f, 0xf9, 0xef, 0x9c, 0x4d, 0xa3, 0xf8, 0x81, 0xbf, + 0xe8, 0x84, 0xe2, 0x81, 0x19, 0xa8, 0x8f, 0x3f, 0x41, 0x14, 0xc6, 0xdc, + 0xb3, 0x5d, 0x9a, 0xbf, 0xeb, 0x56, 0xcc, 0xf3, 0x5a, 0x37, 0xa5, 0x3f, + 0x3c, 0x9b, 0xc3, 0xe7, 0x64, 0xeb, 0xb0, 0xbf, 0xa9, 0xa3, 0x0b, 0x69, + 0x50, 0xe3, 0xbb, 0x3f, 0xe9, 0x57, 0x44, 0x9f, 0xc3, 0x46, 0xca, 0xbf, + 0x5b, 0x70, 0x27, 0xb0, 0x1e, 0x47, 0xe7, 0x3f, 0x86, 0x34, 0x51, 0x24, + 0x15, 0xfd, 0xe0, 0x3f, 0x16, 0xc1, 0xda, 0xc1, 0xfe, 0xae, 0xc7, 0xbf, + 0x84, 0x73, 0xaf, 0x0b, 0xcd, 0x36, 0xba, 0x3f, 0xfc, 0x64, 0x6c, 0x48, + 0xe5, 0x31, 0xb0, 0xbf, 0xd4, 0x1a, 0x53, 0x66, 0x01, 0x84, 0xa4, 0x3f, + 0x27, 0xcf, 0x94, 0xe7, 0x02, 0xaa, 0x99, 0xbf, 0xd6, 0x36, 0x6a, 0x14, + 0x4a, 0xf5, 0x8e, 0x3f, 0x95, 0xf8, 0x59, 0x19, 0x0d, 0xa3, 0x81, 0xbf, + 0x25, 0x1a, 0xa7, 0xe8, 0x0a, 0x89, 0x72, 0x3f, 0xe1, 0x7c, 0x17, 0x99, + 0xea, 0x5a, 0x61, 0xbf, 0x6a, 0xa2, 0x36, 0xac, 0xea, 0x2b, 0x4b, 0x3f, + 0xdb, 0x26, 0xf9, 0xc1, 0x33, 0x39, 0x2e, 0xbf, 0x83, 0x65, 0xae, 0xbe, + 0xd8, 0x20, 0x2e, 0xbf, 0x17, 0xb7, 0x01, 0x07, 0xf4, 0x25, 0x4b, 0x3f, + 0x51, 0x93, 0xe7, 0x5f, 0x64, 0x61, 0x61, 0xbf, 0x7d, 0x1e, 0x85, 0x98, + 0x57, 0x9c, 0x72, 0x3f, 0x02, 0xe7, 0xb7, 0x4f, 0x83, 0xc3, 0x81, 0xbf, + 0x77, 0xde, 0x0d, 0x15, 0x6a, 0x4d, 0x8f, 0x3f, 0x8c, 0xa2, 0x30, 0xaf, + 0x60, 0x15, 0x9a, 0xbf, 0x80, 0x81, 0xf2, 0x89, 0xd2, 0x00, 0xa5, 0x3f, + 0xf0, 0xd7, 0xdc, 0xe8, 0x77, 0xc4, 0xb0, 0xbf, 0xde, 0x03, 0x93, 0x48, + 0xc3, 0xb0, 0xbb, 0x3f, 0xaf, 0x7e, 0xc9, 0xff, 0xf1, 0x35, 0xca, 0xbf, + 0x60, 0x69, 0x6f, 0x75, 0x29, 0xd9, 0xe7, 0x3f, 0x25, 0x6b, 0x78, 0x62, + 0xd5, 0x51, 0xe0, 0x3f, 0x5a, 0x45, 0x86, 0xa5, 0x2c, 0x23, 0xc7, 0xbf, + 0xdf, 0x16, 0xdc, 0x74, 0x3b, 0xb5, 0xb9, 0x3f, 0xf1, 0x3d, 0xf5, 0xf1, + 0x9e, 0xd1, 0xaf, 0xbf, 0x43, 0xfe, 0x70, 0xc0, 0x76, 0x2c, 0xa4, 0x3f, + 0x08, 0x4b, 0x7d, 0xcc, 0x9f, 0x40, 0x99, 0xbf, 0xf2, 0xde, 0x79, 0x98, + 0xb5, 0x79, 0x8e, 0x3f, 0xcf, 0xf2, 0x97, 0xd1, 0x2e, 0x5e, 0x81, 0xbf, + 0xda, 0xf9, 0x9b, 0x4d, 0xf5, 0x41, 0x72, 0x3f, 0x61, 0xd6, 0xa6, 0x21, + 0x60, 0x19, 0x61, 0xbf, 0x95, 0xb0, 0x61, 0xa3, 0xb9, 0xc6, 0x4a, 0x3f, + 0xdf, 0xb4, 0x89, 0x67, 0x37, 0xca, 0x2d, 0xbf, 0xb0, 0x83, 0x6f, 0x32, + 0x9f, 0xac, 0x2d, 0xbf, 0xd4, 0x4c, 0x3f, 0xaf, 0xab, 0xbe, 0x4a, 0x3f, + 0x97, 0x5b, 0x1c, 0xd0, 0x34, 0x20, 0x61, 0xbf, 0xf2, 0x66, 0x7e, 0x47, + 0xac, 0x57, 0x72, 0x3f, 0x36, 0xa2, 0x50, 0xcb, 0x42, 0x83, 0x81, 0xbf, + 0x71, 0xee, 0x12, 0x4f, 0x0f, 0xdf, 0x8e, 0x3f, 0xfa, 0x3b, 0x3c, 0x8e, + 0x99, 0xbc, 0x99, 0xbf, 0x79, 0x7b, 0x02, 0x47, 0xfa, 0xbc, 0xa4, 0x3f, + 0xa4, 0x84, 0x2b, 0x2d, 0xda, 0x92, 0xb0, 0xbf, 0xc7, 0xeb, 0x8b, 0x53, + 0x73, 0x6c, 0xbb, 0x3f, 0x34, 0x7c, 0x9b, 0x40, 0x7b, 0x14, 0xca, 0xbf, + 0x95, 0x94, 0xd5, 0x2d, 0xa9, 0x67, 0xe8, 0x3f, 0xf1, 0x99, 0xbf, 0xf4, + 0x33, 0x4b, 0xdf, 0x3f, 0x00, 0x60, 0x29, 0x55, 0xfe, 0x8b, 0xc6, 0xbf, + 0x9e, 0x2e, 0x72, 0x45, 0x83, 0x25, 0xb9, 0x3f, 0x64, 0xbd, 0x2f, 0x0c, + 0x3e, 0x2d, 0xaf, 0xbf, 0x3b, 0xe8, 0x6f, 0x47, 0x27, 0xc9, 0xa3, 0x3f, + 0xe4, 0xeb, 0x23, 0xba, 0x55, 0xc8, 0x98, 0xbf, 0x17, 0xfc, 0xb9, 0x7e, + 0x01, 0xec, 0x8d, 0x3f, 0x38, 0x3f, 0x21, 0xa3, 0xed, 0x0e, 0x81, 0xbf, + 0xf1, 0xba, 0x4e, 0x8b, 0xe8, 0xef, 0x71, 0x3f, 0xe3, 0xa6, 0x81, 0x6b, + 0x87, 0xcd, 0x60, 0xbf, 0x4d, 0x47, 0x74, 0xb5, 0x58, 0x51, 0x4a, 0x3f, + 0x27, 0x32, 0xba, 0x37, 0x2b, 0x49, 0x2d, 0xbf, 0x27, 0xe1, 0xcb, 0xde, + 0xef, 0x25, 0x2d, 0xbf, 0xa7, 0xb4, 0x56, 0xb5, 0xb4, 0x46, 0x4a, 0x3f, + 0xc8, 0xc3, 0xd1, 0x6b, 0x4f, 0xd4, 0x60, 0xbf, 0x53, 0xe0, 0xd3, 0xf3, + 0x7f, 0x07, 0x72, 0x3f, 0xbb, 0x88, 0xf6, 0x3e, 0xfd, 0x37, 0x81, 0xbf, + 0x72, 0x26, 0x7d, 0x16, 0x34, 0x5d, 0x8e, 0x3f, 0x83, 0x53, 0x3e, 0x09, + 0x7c, 0x53, 0x99, 0xbf, 0x26, 0xe1, 0x0e, 0xd4, 0xe2, 0x6b, 0xa4, 0x3f, + 0x99, 0xaf, 0xe8, 0x05, 0x90, 0x56, 0xb0, 0xbf, 0x6a, 0x36, 0x03, 0xa2, + 0x4c, 0x16, 0xbb, 0x3f, 0x71, 0xda, 0x43, 0x87, 0x10, 0xe2, 0xc9, 0xbf, + 0x2b, 0x44, 0x31, 0x2d, 0x6c, 0xf2, 0xe8, 0x3f, 0x0d, 0xa5, 0x6f, 0xb2, + 0x37, 0xf1, 0xdd, 0x3f, 0x2b, 0xd5, 0x2a, 0x24, 0xff, 0xe9, 0xc5, 0xbf, + 0x2e, 0xc7, 0x9b, 0xef, 0x22, 0x88, 0xb8, 0x3f, 0xcb, 0xdd, 0xcf, 0x75, + 0x30, 0x77, 0xae, 0xbf, 0x53, 0x89, 0xd6, 0xbd, 0x61, 0x5a, 0xa3, 0x3f, + 0xf8, 0x8e, 0x1f, 0x97, 0x80, 0x41, 0x98, 0xbf, 0xba, 0xf3, 0xd6, 0xc8, + 0x96, 0x4c, 0x8d, 0x3f, 0x2a, 0x36, 0x13, 0xcc, 0x82, 0xb5, 0x80, 0xbf, + 0x54, 0xc4, 0x30, 0x97, 0x1e, 0x93, 0x71, 0x3f, 0x82, 0x72, 0x3f, 0xfb, + 0x94, 0x77, 0x60, 0xbf, 0xd1, 0xbb, 0x68, 0xa4, 0x17, 0xcc, 0x49, 0x3f, + 0xa2, 0xa8, 0x03, 0x2a, 0x65, 0xb6, 0x2c, 0xbf, 0xde, 0x70, 0x42, 0x73, + 0x12, 0x8d, 0x2c, 0xbf, 0xa3, 0x3a, 0xce, 0xfc, 0x4c, 0xbe, 0x49, 0x3f, + 0x89, 0xf8, 0xd1, 0x0e, 0xda, 0x7d, 0x60, 0xbf, 0xb5, 0xf3, 0xc7, 0x02, + 0xf9, 0xab, 0x71, 0x3f, 0x7f, 0xf6, 0x64, 0xd9, 0xd4, 0xe1, 0x80, 0xbf, + 0x72, 0x18, 0x3b, 0x23, 0x0f, 0xc8, 0x8d, 0x3f, 0x08, 0xf1, 0x47, 0x8c, + 0x2f, 0xda, 0x98, 0xbf, 0x54, 0x12, 0xc0, 0xc6, 0xa4, 0x0d, 0xa4, 0x3f, + 0xc9, 0xc5, 0xb8, 0x01, 0xa4, 0x0f, 0xb0, 0xbf, 0x99, 0xd9, 0x43, 0x02, + 0x45, 0xae, 0xba, 0x3f, 0xb8, 0x18, 0xbb, 0x2f, 0x69, 0x9e, 0xc9, 0xbf, + 0x32, 0x95, 0xbb, 0xed, 0x41, 0x79, 0xe9, 0x3f, 0x48, 0xa2, 0xbc, 0xba, + 0x27, 0x96, 0xdc, 0x3f, 0x01, 0xfd, 0x63, 0x43, 0xbd, 0x3d, 0xc5, 0xbf, + 0x9d, 0x5a, 0x99, 0x17, 0x9f, 0xdd, 0xb7, 0x3f, 0xa1, 0xe7, 0xd8, 0xdc, + 0x07, 0xb0, 0xad, 0xbf, 0xed, 0x35, 0xaf, 0x1d, 0x7b, 0xe0, 0xa2, 0x3f, + 0x17, 0x40, 0x8c, 0x67, 0x84, 0xac, 0x97, 0xbf, 0x0c, 0x97, 0x4d, 0x87, + 0xe8, 0x9b, 0x8c, 0x3f, 0x45, 0xa1, 0x42, 0x61, 0x2d, 0x52, 0x80, 0xbf, + 0x57, 0xd9, 0xad, 0x9f, 0xd7, 0x2b, 0x71, 0x3f, 0x7e, 0x1d, 0x92, 0x39, + 0xc3, 0x17, 0x60, 0xbf, 0xfa, 0x36, 0x5d, 0x81, 0x4f, 0x37, 0x49, 0x3f, + 0xe6, 0x76, 0xda, 0xa7, 0x45, 0x12, 0x2c, 0xbf, 0x8a, 0xc5, 0x53, 0xa8, + 0x59, 0xe2, 0x2b, 0xbf, 0x8f, 0x3c, 0x01, 0x68, 0xbc, 0x25, 0x49, 0x3f, + 0x66, 0x4d, 0xce, 0x02, 0x01, 0x1d, 0x60, 0xbf, 0xeb, 0xbe, 0x4b, 0xc4, + 0x44, 0x45, 0x71, 0x3f, 0xa1, 0xd9, 0x7f, 0x6b, 0xf2, 0x80, 0x80, 0xbf, + 0x81, 0xa5, 0xba, 0xeb, 0xe2, 0x1f, 0x8d, 0x3f, 0xd8, 0x0b, 0xbc, 0x56, + 0xe5, 0x50, 0x98, 0xbf, 0x46, 0xd3, 0xd3, 0xa0, 0x60, 0xa2, 0xa3, 0x3f, + 0x0f, 0x8f, 0x4f, 0xe9, 0x4d, 0x7c, 0xaf, 0xbf, 0x0d, 0xe6, 0x63, 0x1b, + 0x5c, 0x34, 0xba, 0x3f, 0x2d, 0x77, 0xb9, 0xfa, 0x42, 0x49, 0xc9, 0xbf, + 0x3c, 0x1d, 0x06, 0x24, 0xfb, 0xfb, 0xe9, 0x3f, 0x53, 0x2e, 0x95, 0x7f, + 0x75, 0x3a, 0xdb, 0x3f, 0x07, 0x48, 0x34, 0x7a, 0xc9, 0x87, 0xc4, 0xbf, + 0xe2, 0x8d, 0x94, 0x3c, 0x82, 0x26, 0xb7, 0x3f, 0x98, 0x40, 0x5c, 0xa3, + 0x5e, 0xd8, 0xac, 0xbf, 0xbb, 0xe4, 0x68, 0x5e, 0xce, 0x5b, 0xa2, 0x3f, + 0xba, 0xcf, 0x67, 0x09, 0xcd, 0x09, 0x97, 0xbf, 0x06, 0xe8, 0xbc, 0x8c, + 0x73, 0xda, 0x8b, 0x3f, 0xdb, 0x45, 0xb5, 0x49, 0x64, 0xca, 0x7f, 0xbf, + 0x48, 0x05, 0xc1, 0xe2, 0x59, 0xba, 0x70, 0x3f, 0x84, 0xd1, 0x6f, 0x9c, + 0xa4, 0x5c, 0x5f, 0xbf, 0x8f, 0x5a, 0x1f, 0x75, 0x62, 0x93, 0x48, 0x3f, + 0x2f, 0x1e, 0x0d, 0x52, 0x37, 0x5d, 0x2b, 0xbf, 0xf3, 0x40, 0x4e, 0x1a, + 0x23, 0x26, 0x2b, 0xbf, 0xac, 0xfb, 0x5b, 0xb8, 0x54, 0x7d, 0x48, 0x3f, + 0x4a, 0x9a, 0xcc, 0xd8, 0xed, 0x63, 0x5f, 0xbf, 0x40, 0xa4, 0x7e, 0x60, + 0x97, 0xd3, 0x70, 0x3f, 0x18, 0x9f, 0xdf, 0x58, 0x85, 0x15, 0x80, 0xbf, + 0xa9, 0x71, 0xcb, 0x8e, 0xfd, 0x64, 0x8c, 0x3f, 0x3e, 0xd5, 0xb8, 0x6e, + 0xd8, 0xb7, 0x97, 0xbf, 0xf3, 0x2f, 0xc1, 0xcc, 0x3e, 0x2a, 0xa3, 0x3f, + 0xd8, 0x06, 0x8a, 0xfb, 0x5f, 0xc4, 0xae, 0xbf, 0x16, 0xeb, 0x5c, 0x8c, + 0x9b, 0xa8, 0xb9, 0x3f, 0xbc, 0xd5, 0x1e, 0x3a, 0x62, 0xe2, 0xc8, 0xbf, + 0xaf, 0xc2, 0xa2, 0xd2, 0x69, 0x7a, 0xea, 0x3f, 0xe2, 0xf6, 0xe3, 0xfa, + 0x91, 0xde, 0xd9, 0x3f, 0x9f, 0x50, 0x52, 0xde, 0xb6, 0xc8, 0xc3, 0xbf, + 0xa3, 0x83, 0x27, 0x5e, 0x5c, 0x63, 0xb6, 0x3f, 0xb9, 0x9f, 0xdd, 0x75, + 0xd7, 0xf0, 0xab, 0xbf, 0x07, 0x45, 0x20, 0x36, 0xbc, 0xcc, 0xa1, 0x3f, + 0x03, 0x93, 0x57, 0xea, 0xcd, 0x59, 0x96, 0xbf, 0x92, 0x7d, 0x5c, 0x18, + 0xbe, 0x08, 0x8b, 0x3f, 0xfa, 0xd7, 0xdf, 0xae, 0xb6, 0xdd, 0x7e, 0xbf, + 0x58, 0x14, 0x2b, 0x7e, 0xf1, 0x3e, 0x70, 0x3f, 0x91, 0xf9, 0xd0, 0xe8, + 0x0f, 0x77, 0x5e, 0xbf, 0xcc, 0xca, 0x78, 0x7d, 0xbb, 0xe0, 0x47, 0x3f, + 0x59, 0xb5, 0xfb, 0xb7, 0xae, 0x97, 0x2a, 0xbf, 0xfc, 0x4d, 0x2b, 0x0d, + 0xd7, 0x58, 0x2a, 0xbf, 0x9e, 0x18, 0xbb, 0x5c, 0x71, 0xc5, 0x47, 0x3f, + 0x9f, 0x09, 0xea, 0x5b, 0xe9, 0x79, 0x5e, 0xbf, 0xb4, 0x22, 0x43, 0xbb, + 0x2b, 0x57, 0x70, 0x3f, 0x72, 0x68, 0x7d, 0xff, 0x86, 0x3f, 0x7f, 0xbf, + 0x89, 0xd6, 0xa9, 0xaf, 0xb8, 0x97, 0x8b, 0x3f, 0x81, 0x52, 0x07, 0x8a, + 0x4d, 0x0f, 0x97, 0xbf, 0x79, 0xa4, 0xc8, 0x92, 0x6f, 0xa5, 0xa2, 0x3f, + 0x61, 0x20, 0xf3, 0x0e, 0xb9, 0xf7, 0xad, 0xbf, 0x6c, 0xb2, 0x4b, 0x04, + 0x17, 0x0b, 0xb9, 0x3f, 0x1c, 0xa4, 0x8a, 0xf9, 0x91, 0x69, 0xc8, 0xbf, + 0x65, 0xb4, 0xfa, 0x5c, 0x61, 0xf4, 0xea, 0x3f, 0x08, 0xce, 0x4f, 0x82, + 0xed, 0x82, 0xd8, 0x3f, 0x88, 0x47, 0x4b, 0x8c, 0x1a, 0x01, 0xc3, 0xbf, + 0x10, 0xb2, 0x13, 0xa2, 0xc2, 0x94, 0xb5, 0x3f, 0xd4, 0xcb, 0xb9, 0xe1, + 0x1c, 0xfa, 0xaa, 0xbf, 0x12, 0xf4, 0x24, 0xdb, 0xaa, 0x33, 0xa1, 0x3f, + 0x42, 0x6a, 0x47, 0xbe, 0x01, 0x9d, 0x95, 0xbf, 0x5c, 0x68, 0x5d, 0x82, + 0x57, 0x27, 0x8a, 0x3f, 0xa6, 0x3e, 0x93, 0x15, 0xf1, 0xde, 0x7d, 0xbf, + 0x0c, 0x59, 0x76, 0x84, 0xe0, 0x73, 0x6f, 0x3f, 0x51, 0x72, 0x16, 0xa5, + 0x5e, 0x7f, 0x5d, 0xbf, 0x77, 0x6c, 0x65, 0x31, 0xce, 0x1f, 0x47, 0x3f, + 0xec, 0xd3, 0x76, 0x19, 0x2a, 0xc2, 0x29, 0xbf, 0xe8, 0xf3, 0xbc, 0x41, + 0xe8, 0x7a, 0x29, 0xbf, 0xcb, 0x74, 0x4b, 0x4b, 0x77, 0xfe, 0x46, 0x3f, + 0x2c, 0x61, 0xe5, 0x9f, 0x72, 0x7c, 0x5d, 0xbf, 0x25, 0x12, 0x8b, 0xb8, + 0x86, 0xa0, 0x6f, 0x3f, 0xd4, 0x39, 0xc9, 0x47, 0xd2, 0x3f, 0x7e, 0xbf, + 0xbf, 0x1e, 0x59, 0x55, 0x79, 0xb8, 0x8a, 0x3f, 0xb6, 0xc5, 0x53, 0xf8, + 0x92, 0x57, 0x96, 0xbf, 0x1e, 0xad, 0xfe, 0x0d, 0x2b, 0x14, 0xa2, 0x3f, + 0x4c, 0x38, 0x58, 0x8e, 0xa0, 0x16, 0xad, 0xbf, 0x19, 0xac, 0x11, 0x59, + 0xec, 0x5b, 0xb8, 0x3f, 0x22, 0xce, 0xf8, 0x25, 0xa4, 0xde, 0xc7, 0xbf, + 0x5c, 0xc6, 0x0f, 0x9a, 0xb6, 0x69, 0xeb, 0x3f, 0x9e, 0x8b, 0x7e, 0x9a, + 0xf7, 0x27, 0xd7, 0x3f, 0x7c, 0xce, 0xe7, 0x5d, 0x8b, 0x31, 0xc2, 0xbf, + 0xf2, 0x9a, 0x0a, 0xf5, 0x4e, 0xbb, 0xb4, 0x3f, 0x14, 0x61, 0x9e, 0xe2, + 0xe0, 0xf4, 0xa9, 0xbf, 0x31, 0x92, 0x54, 0xbe, 0x05, 0x91, 0xa0, 0x3f, + 0x04, 0xda, 0x57, 0x2b, 0xea, 0xd3, 0x94, 0xbf, 0x92, 0x2b, 0x59, 0xd9, + 0xd7, 0x36, 0x89, 0x3f, 0x98, 0x89, 0xe3, 0xd5, 0xbc, 0xce, 0x7c, 0xbf, + 0x93, 0xcb, 0x02, 0xf2, 0x5a, 0x57, 0x6e, 0x3f, 0x05, 0x04, 0x3d, 0x8b, + 0x31, 0x76, 0x5c, 0xbf, 0xd7, 0xff, 0x34, 0x6f, 0x16, 0x51, 0x46, 0x3f, + 0xc7, 0x64, 0x80, 0x0b, 0x31, 0xdd, 0x28, 0xbf, 0xff, 0x21, 0xc2, 0xae, + 0xd3, 0x8c, 0x28, 0xbf, 0xda, 0xb4, 0xc3, 0xc5, 0xd4, 0x28, 0x46, 0x3f, + 0xb5, 0x5c, 0x22, 0xba, 0x13, 0x6c, 0x5c, 0xbf, 0xc1, 0xa5, 0x75, 0x96, + 0x4c, 0x7e, 0x6e, 0x3f, 0xa1, 0xd6, 0xdd, 0x9e, 0x71, 0x2c, 0x7d, 0xbf, + 0xa6, 0xaf, 0xe3, 0xb9, 0xaf, 0xc7, 0x89, 0x3f, 0x32, 0xfb, 0x57, 0x81, + 0x00, 0x91, 0x95, 0xbf, 0xfc, 0xaa, 0xb4, 0x18, 0xb1, 0x76, 0xa1, 0x3f, + 0x38, 0x91, 0xde, 0x6d, 0x6a, 0x21, 0xac, 0xbf, 0x2f, 0x25, 0x38, 0x96, + 0x43, 0x9b, 0xb7, 0x3f, 0x0d, 0xb9, 0xfb, 0xb0, 0x71, 0x41, 0xc7, 0xbf, + 0xa1, 0x1c, 0x41, 0xe6, 0x3f, 0xda, 0xeb, 0x3f, 0x91, 0x76, 0xab, 0xcb, + 0x1e, 0xce, 0xd5, 0x3f, 0x25, 0x05, 0xeb, 0xa1, 0xa1, 0x5a, 0xc1, 0xbf, + 0xb5, 0xd9, 0xc6, 0xac, 0x9f, 0xd7, 0xb3, 0x3f, 0xc2, 0x66, 0xce, 0x71, + 0xdc, 0xe1, 0xa8, 0xbf, 0x62, 0x9a, 0x21, 0x8e, 0x7a, 0xca, 0x9f, 0x3f, + 0x79, 0x93, 0xaa, 0x78, 0x0f, 0xff, 0x93, 0xbf, 0x33, 0x48, 0x80, 0x84, + 0xdf, 0x37, 0x88, 0x3f, 0x6a, 0xbc, 0xaf, 0x15, 0xcd, 0xad, 0x7b, 0xbf, + 0xa3, 0x20, 0xa7, 0x64, 0x0b, 0x29, 0x6d, 0x3f, 0xa6, 0x20, 0xad, 0x64, + 0x33, 0x5c, 0x5b, 0xbf, 0xfd, 0x02, 0x08, 0x16, 0x18, 0x75, 0x45, 0x3f, + 0xa3, 0x8c, 0xb3, 0x2d, 0x54, 0xe9, 0x27, 0xbf, 0xba, 0x52, 0x37, 0x40, + 0x20, 0x8f, 0x27, 0xbf, 0x2e, 0xd2, 0x17, 0x21, 0x01, 0x45, 0x45, 0x3f, + 0xfd, 0xb3, 0x3f, 0x7f, 0x62, 0x49, 0x5b, 0xbf, 0xea, 0xd3, 0x57, 0xd9, + 0x45, 0x48, 0x6d, 0x3f, 0x4c, 0xe0, 0xe4, 0x66, 0xf6, 0x05, 0x7c, 0xbf, + 0xd5, 0xd9, 0x42, 0x18, 0xd7, 0xc5, 0x88, 0x3f, 0xc3, 0xf4, 0x17, 0x41, + 0xf7, 0xbb, 0x94, 0xbf, 0x47, 0xd4, 0xc2, 0x36, 0x49, 0xcd, 0xa0, 0x3f, + 0x9d, 0x1e, 0x57, 0x1a, 0x77, 0x18, 0xab, 0xbf, 0xae, 0x1c, 0x96, 0x08, + 0x4f, 0xc9, 0xb6, 0x3f, 0x35, 0x88, 0x02, 0xb2, 0xda, 0x91, 0xc6, 0xbf, + 0x61, 0xb6, 0xb3, 0x34, 0xd5, 0x45, 0xec, 0x3f, 0x13, 0xc6, 0x52, 0x76, + 0xd0, 0x75, 0xd4, 0x3f, 0xe2, 0xf7, 0xc9, 0xd2, 0xf6, 0x7c, 0xc0, 0xbf, + 0xc8, 0x2d, 0x14, 0x27, 0x57, 0xea, 0xb2, 0x3f, 0xf5, 0x60, 0x88, 0x0f, + 0xcf, 0xc1, 0xa7, 0xbf, 0x59, 0x5d, 0xeb, 0x14, 0x8d, 0x61, 0x9e, 0x3f, + 0xc8, 0x6d, 0x21, 0x36, 0x00, 0x1f, 0x93, 0xbf, 0x9e, 0x62, 0x05, 0xdc, + 0x16, 0x2b, 0x87, 0x3f, 0x11, 0x27, 0x5a, 0x55, 0xde, 0x7c, 0x7a, 0xbf, + 0x8a, 0x91, 0xdf, 0x10, 0xb5, 0xe9, 0x6b, 0x3f, 0x59, 0x00, 0xff, 0x9c, + 0x18, 0x32, 0x5a, 0xbf, 0x7a, 0x1e, 0xa0, 0xb1, 0x5e, 0x8c, 0x44, 0x3f, + 0x70, 0x7a, 0xf8, 0xcd, 0x2c, 0xe7, 0x26, 0xbf, 0xa4, 0x77, 0x6a, 0x91, + 0x5e, 0x82, 0x26, 0xbf, 0xf4, 0xb5, 0x38, 0x88, 0x7c, 0x53, 0x44, 0x3f, + 0x2c, 0x68, 0x52, 0x37, 0x00, 0x15, 0x5a, 0xbf, 0x4b, 0x95, 0x4e, 0xb6, + 0x1b, 0xff, 0x6b, 0x3f, 0x00, 0xec, 0x2f, 0x0a, 0xfe, 0xcc, 0x7a, 0xbf, + 0xe1, 0x74, 0xf2, 0x73, 0x75, 0xb3, 0x87, 0x3f, 0xe7, 0x5e, 0xc1, 0x7e, + 0xe1, 0xd8, 0x93, 0xbf, 0x1a, 0x30, 0x78, 0x7b, 0x42, 0x18, 0xa0, 0x3f, + 0x06, 0x24, 0xc7, 0x61, 0x33, 0xfc, 0xa9, 0xbf, 0xb0, 0x13, 0x14, 0x45, + 0x4b, 0xe6, 0xb5, 0x3f, 0x4a, 0xd0, 0xb9, 0x84, 0xc6, 0xcf, 0xc5, 0xbf, + 0x51, 0x9d, 0x1c, 0x20, 0x50, 0xac, 0xec, 0x3f, 0x0e, 0xd1, 0x79, 0xa8, + 0x78, 0x1f, 0xd3, 0x3f, 0x5c, 0x2a, 0xba, 0x9a, 0x4a, 0x32, 0xbf, 0xbf, + 0x28, 0x20, 0x91, 0x67, 0x1b, 0xf4, 0xb1, 0x3f, 0xc3, 0xda, 0x94, 0x49, + 0x7e, 0x95, 0xa6, 0xbf, 0x53, 0x84, 0x81, 0x00, 0x36, 0xe8, 0x9c, 0x3f, + 0xc0, 0x15, 0xcc, 0xe0, 0x50, 0x34, 0x92, 0xbf, 0x23, 0xfa, 0x27, 0xbd, + 0x2d, 0x11, 0x86, 0x3f, 0x35, 0x51, 0x2f, 0xf7, 0xb5, 0x3c, 0x79, 0xbf, + 0x05, 0xce, 0x5d, 0xc3, 0x24, 0x9a, 0x6a, 0x3f, 0x87, 0x62, 0x01, 0xcf, + 0x9e, 0xf8, 0x58, 0xbf, 0xdf, 0x16, 0x84, 0x21, 0x7d, 0x97, 0x43, 0x3f, + 0xe9, 0xae, 0xc9, 0x86, 0x5c, 0xd7, 0x25, 0xbf, 0x50, 0x96, 0xbb, 0x93, + 0x28, 0x67, 0x25, 0xbf, 0xbd, 0x36, 0xaf, 0xaf, 0xcf, 0x54, 0x43, 0x3f, + 0x1d, 0xeb, 0xaa, 0x40, 0x99, 0xcf, 0x58, 0xbf, 0xf3, 0xc7, 0xd1, 0x6f, + 0x83, 0xa3, 0x6a, 0x3f, 0xfe, 0x4f, 0x73, 0xa6, 0x31, 0x82, 0x79, 0xbf, + 0x9b, 0x64, 0x51, 0x54, 0x1b, 0x91, 0x86, 0x3f, 0xb1, 0xa4, 0x26, 0x7a, + 0x32, 0xe8, 0x92, 0xbf, 0x7d, 0xfb, 0x2c, 0xd1, 0xe6, 0xaf, 0x9e, 0x3f, + 0xa0, 0x98, 0xf2, 0x51, 0x18, 0xcd, 0xa8, 0xbf, 0x8e, 0x94, 0xa9, 0x28, + 0x7f, 0xf2, 0xb4, 0x3f, 0xfe, 0x8b, 0x72, 0xe3, 0x23, 0xfb, 0xc4, 0xbf, + 0xfa, 0x99, 0xa1, 0xfa, 0x8b, 0x0d, 0xed, 0x3f, 0x48, 0x3c, 0x2d, 0xf4, + 0x81, 0xcb, 0xd1, 0x3f, 0xf7, 0x09, 0x5e, 0x11, 0x90, 0x5f, 0xbd, 0xbf, + 0xca, 0xe5, 0x31, 0xb6, 0x95, 0xf5, 0xb0, 0x3f, 0xc6, 0x11, 0x6d, 0x42, + 0xb5, 0x5d, 0xa5, 0xbf, 0x80, 0x33, 0x5d, 0x70, 0x70, 0x5f, 0x9b, 0x3f, + 0xbb, 0xc4, 0x42, 0x88, 0x9b, 0x3f, 0x91, 0xbf, 0x3a, 0x62, 0xfc, 0x1f, + 0xdb, 0xea, 0x84, 0x3f, 0x87, 0x29, 0xb0, 0xc9, 0x21, 0xee, 0x77, 0xbf, + 0x0b, 0x9d, 0xa1, 0x68, 0x30, 0x3b, 0x69, 0x3f, 0x3b, 0x35, 0x09, 0x57, + 0x8c, 0xb0, 0x57, 0xbf, 0xc4, 0x33, 0xa7, 0x45, 0x0d, 0x97, 0x42, 0x3f, + 0xf1, 0x10, 0xf1, 0xe5, 0x8c, 0xba, 0x24, 0xbf, 0xed, 0x78, 0x3c, 0x3f, + 0x21, 0x3e, 0x24, 0xbf, 0x30, 0x00, 0x55, 0x8f, 0x8b, 0x49, 0x42, 0x3f, + 0x52, 0x88, 0x01, 0xb8, 0xe4, 0x79, 0x57, 0xbf, 0x80, 0xbd, 0xb3, 0xfa, + 0x3d, 0x36, 0x69, 0x3f, 0x2e, 0x38, 0xc9, 0xb9, 0x45, 0x26, 0x78, 0xbf, + 0x58, 0x13, 0x33, 0x80, 0x63, 0x5f, 0x85, 0x3f, 0x8b, 0x33, 0x54, 0x38, + 0x66, 0xea, 0x91, 0xbf, 0xa8, 0x6b, 0x9d, 0x97, 0x73, 0x19, 0x9d, 0x3f, + 0x85, 0x08, 0x81, 0x13, 0xab, 0x8b, 0xa7, 0xbf, 0xc9, 0xaf, 0x56, 0xd5, + 0x3b, 0xee, 0xb3, 0x3f, 0x79, 0x1e, 0x95, 0xff, 0xe8, 0x13, 0xc4, 0xbf, + 0xea, 0x05, 0x55, 0xdd, 0x65, 0x69, 0xed, 0x3f, 0xbb, 0xa0, 0x2f, 0x46, + 0x55, 0x7a, 0xd0, 0x3f, 0x1d, 0x4f, 0xeb, 0x99, 0xf4, 0x82, 0xbb, 0xbf, + 0xed, 0x7b, 0xde, 0x75, 0xe4, 0xde, 0xaf, 0x3f, 0x6c, 0x5a, 0xb3, 0x32, + 0x44, 0x1b, 0xa4, 0xbf, 0x7e, 0x88, 0x36, 0x15, 0x3f, 0xc8, 0x99, 0x3f, + 0xb9, 0xd7, 0xce, 0x6c, 0x7f, 0x41, 0x90, 0xbf, 0x35, 0x82, 0x10, 0xa3, + 0xdc, 0xb8, 0x83, 0x3f, 0xed, 0x0a, 0xa3, 0x84, 0xf7, 0x91, 0x76, 0xbf, + 0x75, 0xa6, 0xcf, 0x84, 0xb6, 0xcd, 0x67, 0x3f, 0x65, 0x97, 0x8d, 0xd4, + 0xaf, 0x5a, 0x56, 0xbf, 0xc1, 0x42, 0x25, 0x9c, 0xaf, 0x8b, 0x41, 0x3f, + 0x04, 0xaa, 0xb9, 0xff, 0x6e, 0x91, 0x23, 0xbf, 0xe3, 0xbd, 0x11, 0x3b, + 0xf4, 0x07, 0x23, 0xbf, 0x90, 0xd5, 0x01, 0x15, 0x49, 0x32, 0x41, 0x3f, + 0xba, 0xdf, 0xea, 0x17, 0xa4, 0x14, 0x56, 0xbf, 0xaa, 0xfe, 0x04, 0x9a, + 0x17, 0xb8, 0x67, 0x3f, 0xae, 0x6b, 0x2b, 0xc7, 0xf9, 0xb9, 0x76, 0xbf, + 0xf6, 0x55, 0x05, 0xb2, 0xf2, 0x1e, 0x84, 0x3f, 0x84, 0xb8, 0x07, 0x4a, + 0x01, 0xe0, 0x90, 0xbf, 0x51, 0xcf, 0xc0, 0x2e, 0xf5, 0x6d, 0x9b, 0x3f, + 0x97, 0x21, 0x9d, 0xbd, 0x7c, 0x38, 0xa6, 0xbf, 0x7e, 0x24, 0xad, 0xa9, + 0xdc, 0xd9, 0xb2, 0x3f, 0xf8, 0x94, 0xc1, 0x96, 0x13, 0x1a, 0xc3, 0xbf, + 0x7e, 0xf6, 0xed, 0xb6, 0xbc, 0xbf, 0xed, 0x3f, 0x78, 0x45, 0x33, 0x7b, + 0xb3, 0x58, 0xce, 0x3f, 0xf0, 0x24, 0x4a, 0xd6, 0xae, 0x9d, 0xb9, 0xbf, + 0xdb, 0x21, 0x6a, 0x32, 0xbf, 0xc4, 0xad, 0x3f, 0xa1, 0x40, 0x60, 0xe9, + 0xff, 0xce, 0xa2, 0xbf, 0xfe, 0x27, 0xe6, 0x8f, 0xab, 0x23, 0x98, 0x3f, + 0x94, 0x23, 0xaa, 0x37, 0x41, 0x75, 0x8e, 0xbf, 0xaa, 0x20, 0xcc, 0x14, + 0xf6, 0x7b, 0x82, 0x3f, 0x90, 0xcb, 0x7c, 0x43, 0x14, 0x29, 0x75, 0xbf, + 0x18, 0x8e, 0xc1, 0xa8, 0x9d, 0x52, 0x66, 0x3f, 0x8a, 0x00, 0x42, 0xa9, + 0xdf, 0xf7, 0x54, 0xbf, 0x7e, 0x0c, 0x2c, 0xdd, 0x0a, 0x76, 0x40, 0x3f, + 0xdc, 0x5c, 0x65, 0x00, 0xbb, 0x5c, 0x22, 0xbf, 0x04, 0x26, 0x7c, 0x74, + 0x55, 0xc5, 0x21, 0xbf, 0x49, 0xbf, 0x94, 0xc9, 0xa8, 0x0f, 0x40, 0x3f, + 0xd4, 0xe2, 0x80, 0xc8, 0xa2, 0xa0, 0x54, 0xbf, 0x45, 0x08, 0x73, 0x6b, + 0xe7, 0x29, 0x66, 0x3f, 0x0f, 0x0c, 0x38, 0xed, 0x17, 0x3e, 0x75, 0xbf, + 0xc8, 0x2e, 0xba, 0x40, 0x77, 0xd0, 0x82, 0x3f, 0x0d, 0xe5, 0xd5, 0x12, + 0x21, 0x93, 0x8f, 0xbf, 0x62, 0x7f, 0x54, 0x68, 0x43, 0xae, 0x99, 0x3f, + 0x00, 0x0f, 0xf7, 0x1f, 0x2a, 0xd4, 0xa4, 0xbf, 0x55, 0x8a, 0xa8, 0x31, + 0xc7, 0xb5, 0xb1, 0x3f, 0x63, 0x82, 0xe2, 0x03, 0xa9, 0x0d, 0xc2, 0xbf, + 0x02, 0xcf, 0x88, 0x59, 0x71, 0x10, 0xee, 0x3f, 0xea, 0x89, 0xae, 0x09, + 0xe9, 0xc3, 0xcb, 0x3f, 0x42, 0x84, 0xd5, 0xeb, 0xf4, 0xb0, 0xb7, 0xbf, + 0x0c, 0x29, 0x00, 0x19, 0x1d, 0x9e, 0xab, 0x3f, 0x62, 0x28, 0x0f, 0x4d, + 0xc1, 0x79, 0xa1, 0xbf, 0x03, 0x10, 0xc9, 0xd1, 0xc5, 0x72, 0x96, 0x3f, + 0x1b, 0x4a, 0xef, 0x1a, 0x4f, 0x57, 0x8c, 0xbf, 0x7b, 0x12, 0xcf, 0xfe, + 0xf0, 0x34, 0x81, 0x3f, 0x3f, 0x0d, 0xd7, 0x02, 0x5c, 0xb4, 0x73, 0xbf, + 0x5a, 0xb4, 0x51, 0xeb, 0xd3, 0xca, 0x64, 0x3f, 0x98, 0x53, 0x5a, 0x7d, + 0xf9, 0x88, 0x53, 0xbf, 0x49, 0x8e, 0x58, 0x38, 0x97, 0xad, 0x3e, 0x3f, + 0xf1, 0xbb, 0x9f, 0xc5, 0x2f, 0x1d, 0x21, 0xbf, 0xde, 0xfa, 0x9f, 0xc4, + 0x00, 0x77, 0x20, 0xbf, 0x25, 0x77, 0x74, 0xff, 0xa4, 0xc4, 0x3d, 0x3f, + 0x5b, 0x8b, 0x6b, 0xb8, 0xb5, 0x1e, 0x53, 0xbf, 0x62, 0xf1, 0x01, 0xfb, + 0x8e, 0x8c, 0x64, 0x3f, 0xdf, 0x54, 0xc1, 0x81, 0x74, 0xb3, 0x73, 0xbf, + 0x6a, 0x86, 0x22, 0xcb, 0xa8, 0x74, 0x81, 0x3f, 0xca, 0x25, 0xea, 0xb0, + 0x51, 0x4f, 0x8d, 0xbf, 0x0a, 0xc4, 0x6a, 0xa6, 0x43, 0xdb, 0x97, 0x3f, + 0x1e, 0x38, 0x7a, 0x8a, 0x5b, 0x5f, 0xa3, 0xbf, 0x18, 0x37, 0x03, 0x15, + 0x6b, 0x82, 0xb0, 0x3f, 0xde, 0xa5, 0x73, 0x4e, 0xb6, 0xee, 0xc0, 0xbf, + 0x6c, 0x4a, 0x04, 0x88, 0x66, 0x5b, 0xee, 0x3f, 0xaf, 0x0d, 0xbd, 0x55, + 0x11, 0x37, 0xc9, 0x3f, 0x60, 0xa7, 0xc9, 0xf3, 0xfb, 0xbd, 0xb5, 0xbf, + 0x27, 0xf3, 0x5d, 0x04, 0x63, 0x6c, 0xa9, 0x3f, 0x6e, 0x05, 0x74, 0xd7, + 0x64, 0x1c, 0xa0, 0xbf, 0x4d, 0x79, 0x1e, 0x73, 0xa3, 0xb6, 0x94, 0x3f, + 0xb9, 0xe6, 0xde, 0x74, 0x81, 0x2a, 0x8a, 0xbf, 0x68, 0x5b, 0x45, 0x4c, + 0x38, 0xc9, 0x7f, 0x3f, 0x33, 0xd0, 0x15, 0x0f, 0xb9, 0x34, 0x72, 0xbf, + 0xd7, 0x97, 0xbc, 0x50, 0x4e, 0x37, 0x63, 0x3f, 0x76, 0x0f, 0x8e, 0xb0, + 0xe1, 0x0e, 0x52, 0xbf, 0xfb, 0x67, 0x33, 0xaf, 0x47, 0x5d, 0x3c, 0x3f, + 0xb3, 0x85, 0x72, 0xc1, 0x24, 0xa7, 0x1f, 0xbf, 0x27, 0xdf, 0xc7, 0xf3, + 0x72, 0x3b, 0x1e, 0xbf, 0x37, 0xc5, 0x21, 0xda, 0xe9, 0x55, 0x3b, 0x3f, + 0xa1, 0xe8, 0x96, 0xdd, 0xba, 0x8f, 0x51, 0xbf, 0x9f, 0x0a, 0x91, 0xbf, + 0xf9, 0xe0, 0x62, 0x3f, 0xb0, 0x32, 0x7d, 0x99, 0xed, 0x1a, 0x72, 0xbf, + 0x65, 0x50, 0x85, 0xd3, 0x47, 0x0c, 0x80, 0x3f, 0xae, 0x23, 0xee, 0xa6, + 0xcd, 0xf5, 0x8a, 0xbf, 0x8d, 0x19, 0x64, 0x6d, 0xe8, 0xf5, 0x95, 0x3f, + 0x11, 0xfe, 0xe9, 0x88, 0xc4, 0xda, 0xa1, 0xbf, 0xee, 0x9a, 0xac, 0xfa, + 0x83, 0x80, 0xae, 0x3f, 0x24, 0x9c, 0xa3, 0x69, 0xa0, 0x7a, 0xbf, 0xbf, + 0x28, 0xac, 0x23, 0x02, 0x81, 0xa0, 0xee, 0x3f, 0x7e, 0xca, 0xa3, 0xfc, + 0xed, 0xb2, 0xc6, 0x3f, 0x04, 0x08, 0xa7, 0x70, 0xf7, 0xc5, 0xb3, 0xbf, + 0xd0, 0x7b, 0xcc, 0x6c, 0xf8, 0x30, 0xa7, 0x3f, 0x3e, 0x4d, 0x27, 0x2a, + 0x94, 0x6f, 0x9d, 0xbf, 0x7e, 0x76, 0xdf, 0x0f, 0x5f, 0xf0, 0x92, 0x3f, + 0x41, 0xd6, 0xb6, 0x6d, 0x38, 0xf0, 0x87, 0xbf, 0x49, 0xee, 0x79, 0x25, + 0x96, 0x17, 0x7d, 0x3f, 0x98, 0xcc, 0x2c, 0x7d, 0x1b, 0xab, 0x70, 0xbf, + 0x81, 0x57, 0xd9, 0x3e, 0x08, 0x99, 0x61, 0x3f, 0x90, 0x07, 0x9c, 0xd9, + 0x82, 0x8a, 0x50, 0xbf, 0xe9, 0x5e, 0x02, 0x2d, 0x95, 0xfc, 0x39, 0x3f, + 0xad, 0x06, 0xdd, 0x58, 0x5b, 0x01, 0x1d, 0xbf, 0x82, 0x14, 0x30, 0xe5, + 0x93, 0x74, 0x1b, 0xbf, 0xcb, 0x48, 0xe1, 0x9d, 0x8a, 0xd4, 0x38, 0x3f, + 0xa4, 0x46, 0xbd, 0x82, 0x31, 0xe9, 0x4f, 0xbf, 0xce, 0x39, 0xaa, 0xa0, + 0x1c, 0x28, 0x61, 0x3f, 0xc1, 0x9f, 0x19, 0x96, 0x6a, 0x75, 0x70, 0xbf, + 0xf6, 0x20, 0xb9, 0xbd, 0x3a, 0x30, 0x7d, 0x3f, 0x2d, 0x4f, 0x4a, 0x0a, + 0xdd, 0x87, 0x88, 0xbf, 0xef, 0x58, 0xef, 0xf5, 0x30, 0xff, 0x93, 0x3f, + 0x4d, 0x29, 0xcb, 0x9c, 0x23, 0x47, 0xa0, 0xbf, 0x27, 0x7c, 0xf4, 0xf3, + 0x9e, 0xdf, 0xab, 0x3f, 0x1c, 0x70, 0x9e, 0x69, 0x26, 0xf3, 0xbc, 0xbf, + 0xe4, 0x7a, 0x4b, 0x90, 0xa7, 0xdf, 0xee, 0x3f, 0xf0, 0x85, 0xd1, 0xd1, + 0x3b, 0x38, 0xc4, 0x3f, 0x91, 0xaa, 0x43, 0xc2, 0x18, 0xca, 0xb1, 0xbf, + 0xa8, 0x7b, 0x97, 0x9c, 0x46, 0xed, 0xa4, 0x3f, 0x1b, 0xab, 0x87, 0x3e, + 0xa6, 0x99, 0x9a, 0xbf, 0xe1, 0x08, 0x96, 0x9a, 0x17, 0x21, 0x91, 0x3f, + 0x6c, 0xbb, 0x61, 0x8a, 0xda, 0xa9, 0x85, 0xbf, 0xc4, 0x6c, 0x33, 0x17, + 0xab, 0x56, 0x7a, 0x3f, 0x96, 0xdf, 0x45, 0x28, 0xf1, 0x30, 0x6e, 0xbf, + 0xb2, 0xf4, 0x7c, 0xbd, 0x05, 0xe2, 0x5f, 0x3f, 0xc1, 0x61, 0x70, 0x63, + 0x9a, 0xf9, 0x4d, 0xbf, 0x55, 0x14, 0xa7, 0xe7, 0xf6, 0x8c, 0x37, 0x3f, + 0x1c, 0xc4, 0x65, 0x94, 0xa3, 0x4a, 0x1a, 0xbf, 0xc6, 0x2e, 0x3a, 0x51, + 0x06, 0x9b, 0x18, 0xbf, 0x60, 0xf7, 0xd4, 0x06, 0xfe, 0x41, 0x36, 0x3f, + 0xc6, 0x09, 0x29, 0xfe, 0x7b, 0x9c, 0x4c, 0xbf, 0x78, 0x63, 0xc0, 0xdd, + 0xea, 0xc5, 0x5e, 0x3f, 0x50, 0x6a, 0xc5, 0x50, 0xb7, 0x87, 0x6d, 0xbf, + 0x59, 0xbd, 0x6d, 0x14, 0xf5, 0x31, 0x7a, 0x3f, 0xb1, 0x9f, 0xbb, 0x25, + 0xd6, 0x06, 0x86, 0xbf, 0x41, 0x48, 0x2b, 0xb3, 0x28, 0xf8, 0x91, 0x3f, + 0xe6, 0xd4, 0xb4, 0xdc, 0x83, 0x4a, 0x9d, 0xbf, 0x83, 0x49, 0xe0, 0xba, + 0x41, 0x23, 0xa9, 0x3f, 0x12, 0xd3, 0x63, 0x20, 0x47, 0x47, 0xba, 0xbf, + 0x4c, 0xf0, 0x37, 0x0e, 0xc3, 0x18, 0xef, 0x3f, 0x17, 0x40, 0xc7, 0x98, + 0xb2, 0xc7, 0xc1, 0x3f, 0x83, 0x53, 0xd3, 0x3a, 0x1d, 0x97, 0xaf, 0xbf, + 0x52, 0x80, 0x03, 0xe8, 0xb7, 0xa2, 0xa2, 0x3f, 0xf2, 0xa7, 0x06, 0x30, + 0xc8, 0xb8, 0x97, 0xbf, 0x7e, 0xda, 0x0f, 0x63, 0xdf, 0x93, 0x8e, 0x3f, + 0x3e, 0x31, 0x9d, 0xd5, 0xd3, 0x58, 0x83, 0xbf, 0x9a, 0x0d, 0x5e, 0x2a, + 0x2e, 0x88, 0x77, 0x3f, 0x47, 0xba, 0xbd, 0x73, 0x94, 0xfb, 0x6a, 0xbf, + 0xb9, 0xd9, 0x4f, 0x05, 0x89, 0x80, 0x5c, 0x3f, 0x89, 0x0d, 0xd1, 0x09, + 0x6c, 0xcd, 0x4a, 0xbf, 0xe0, 0xbc, 0x10, 0x5d, 0xec, 0x0f, 0x35, 0x3f, + 0x7e, 0xe4, 0x17, 0x4d, 0xa7, 0x84, 0x17, 0xbf, 0x61, 0x16, 0x1f, 0x6d, + 0x78, 0xb0, 0x15, 0xbf, 0x67, 0xbd, 0x4d, 0x39, 0xc6, 0x9f, 0x33, 0x3f, + 0xa3, 0x9e, 0xed, 0x76, 0x41, 0x3b, 0x49, 0xbf, 0x68, 0xad, 0x64, 0xa9, + 0x14, 0x25, 0x5b, 0x3f, 0x7d, 0xec, 0x96, 0x96, 0x72, 0x0e, 0x6a, 0xbf, + 0x77, 0xcd, 0x98, 0x33, 0x70, 0x1f, 0x77, 0x3f, 0xb8, 0xa2, 0x3e, 0xc7, + 0x1c, 0x74, 0x83, 0xbf, 0xf6, 0x88, 0x17, 0xa0, 0xcd, 0xc3, 0x8f, 0x3f, + 0x77, 0x77, 0xe2, 0xec, 0xe5, 0xeb, 0x99, 0xbf, 0xb6, 0xb5, 0xbe, 0x2a, + 0x9a, 0x4c, 0xa6, 0x3f, 0x0d, 0xa6, 0x48, 0x9b, 0x5a, 0x77, 0xb7, 0xbf, + 0xee, 0x6e, 0xcd, 0x74, 0xbe, 0x4b, 0xef, 0x3f, 0x79, 0x8c, 0x42, 0x83, + 0x09, 0xc4, 0xbe, 0x3f, 0x1e, 0x8c, 0x4c, 0x0c, 0x09, 0x97, 0xab, 0xbf, + 0x3e, 0x82, 0x29, 0xe7, 0xb6, 0x52, 0xa0, 0x3f, 0x7e, 0x81, 0x75, 0x4c, + 0xc5, 0xce, 0x94, 0xbf, 0xe9, 0x60, 0x90, 0xe7, 0x19, 0xd8, 0x8a, 0x3f, + 0x57, 0x85, 0x8d, 0x08, 0x95, 0xfe, 0x80, 0xbf, 0x58, 0x7f, 0xcd, 0xde, + 0xdc, 0xad, 0x74, 0x3f, 0x51, 0x74, 0xb9, 0xbe, 0x1c, 0xb8, 0x67, 0xbf, + 0x00, 0x5e, 0x9b, 0x16, 0xb0, 0x0f, 0x59, 0x3f, 0x86, 0xcb, 0x04, 0x44, + 0x6e, 0x92, 0x47, 0xbf, 0x3d, 0x42, 0x5b, 0x73, 0xfc, 0x86, 0x32, 0x3f, + 0xa7, 0x6a, 0x9a, 0xfb, 0x18, 0xb1, 0x14, 0xbf, 0xed, 0xed, 0x0e, 0xbd, + 0xa3, 0xb6, 0x12, 0xbf, 0x8e, 0x03, 0x5a, 0xe9, 0x6f, 0xef, 0x30, 0x3f, + 0xba, 0xc2, 0x6f, 0x37, 0x7c, 0xc7, 0x45, 0xbf, 0x66, 0xd0, 0x2a, 0x8c, + 0xd2, 0x6f, 0x57, 0x3f, 0x99, 0x15, 0xbd, 0x79, 0x07, 0x81, 0x66, 0xbf, + 0x64, 0xf2, 0x13, 0x0b, 0x6c, 0xfa, 0x73, 0x3f, 0x14, 0xea, 0x90, 0x88, + 0x21, 0xd1, 0x80, 0xbf, 0x69, 0x7f, 0xce, 0x4e, 0x1b, 0x7b, 0x8b, 0x3f, + 0xd0, 0xf0, 0xd1, 0x46, 0x28, 0x74, 0x96, 0xbf, 0x66, 0xa4, 0xa1, 0xfc, + 0xe8, 0x5c, 0xa3, 0x3f, 0xe7, 0xa5, 0x65, 0x6d, 0xc8, 0x83, 0xb4, 0xbf, + 0xa5, 0x7c, 0x28, 0xe3, 0x86, 0x78, 0xef, 0x3f, 0xc8, 0xdc, 0x67, 0x4f, + 0xbe, 0x0f, 0xba, 0x3f, 0x3b, 0x21, 0x81, 0x97, 0x44, 0x96, 0xa7, 0xbf, + 0x59, 0x7e, 0x93, 0x5f, 0x5b, 0xfd, 0x9b, 0x3f, 0xf8, 0x8c, 0x53, 0xe1, + 0x6a, 0xdd, 0x91, 0xbf, 0xe2, 0x1c, 0x76, 0xa6, 0x2e, 0x11, 0x87, 0x3f, + 0x9e, 0xe5, 0x0d, 0x5c, 0x25, 0x39, 0x7d, 0xbf, 0x2f, 0x64, 0x30, 0x1f, + 0x7a, 0xc9, 0x71, 0x3f, 0xcd, 0x40, 0xe4, 0xce, 0x8c, 0x68, 0x64, 0xbf, + 0x11, 0x08, 0x1a, 0x8d, 0x98, 0x91, 0x55, 0x3f, 0xd3, 0x8b, 0xda, 0x86, + 0x9c, 0x4a, 0x44, 0xbf, 0x0d, 0x8e, 0x94, 0x17, 0x69, 0xe7, 0x2f, 0x3f, + 0x97, 0x6b, 0x21, 0xb0, 0xb2, 0xd1, 0x11, 0xbf, 0xea, 0x10, 0x9e, 0x2d, + 0x98, 0x5e, 0x0f, 0xbf, 0xcb, 0x2e, 0x66, 0xf1, 0x22, 0x65, 0x2c, 0x3f, + 0xd5, 0x43, 0xcd, 0x6c, 0x33, 0x43, 0x42, 0xbf, 0x32, 0xdc, 0xd8, 0xd2, + 0x4e, 0xa8, 0x53, 0x3f, 0x8c, 0x72, 0xba, 0xe1, 0x84, 0xe1, 0x62, 0xbf, + 0xa7, 0x91, 0xe1, 0xff, 0xb5, 0xc4, 0x70, 0x3f, 0x83, 0x30, 0xf5, 0x1b, + 0xc2, 0x3e, 0x7c, 0xbf, 0x9d, 0x63, 0xc7, 0x67, 0x94, 0x18, 0x87, 0x3f, + 0xaa, 0x29, 0x88, 0xee, 0x18, 0xe5, 0x92, 0xbf, 0xc3, 0xd7, 0x3f, 0x64, + 0x81, 0x55, 0xa0, 0x3f, 0xfc, 0x7a, 0x74, 0xa4, 0x07, 0x6d, 0xb1, 0xbf, + 0x23, 0xe9, 0xc0, 0xa6, 0x0b, 0x9f, 0xef, 0x3f, 0xd8, 0x52, 0xf1, 0xa5, + 0xd1, 0x73, 0xb5, 0x3f, 0x97, 0xfc, 0x90, 0x0f, 0x17, 0x97, 0xa3, 0xbf, + 0x51, 0x63, 0x62, 0x23, 0x0a, 0x50, 0x97, 0x3f, 0x1e, 0x42, 0xe3, 0x66, + 0x0e, 0xcd, 0x8d, 0xbf, 0x92, 0xf6, 0x46, 0xce, 0x70, 0x41, 0x83, 0x3f, + 0xc9, 0xee, 0x1f, 0x8c, 0x88, 0x68, 0x78, 0xbf, 0xc0, 0xa3, 0xfc, 0x69, + 0x9a, 0xb9, 0x6d, 0x3f, 0xbd, 0x13, 0x01, 0x1b, 0xed, 0x0e, 0x61, 0xbf, + 0xe3, 0x72, 0x12, 0x9c, 0x66, 0x08, 0x52, 0x3f, 0xcc, 0x91, 0xfe, 0xef, + 0xf8, 0xf7, 0x40, 0xbf, 0xe9, 0x7d, 0xa5, 0x2c, 0x4f, 0xaf, 0x2a, 0x3f, + 0x5b, 0x14, 0xbe, 0x17, 0x6a, 0xd0, 0x0d, 0xbf, 0x53, 0x23, 0xf4, 0x3b, + 0x7d, 0x38, 0x09, 0xbf, 0x2c, 0x10, 0x4c, 0x1d, 0x94, 0xd5, 0x26, 0x3f, + 0x8c, 0x29, 0x24, 0x01, 0xf4, 0x60, 0x3d, 0xbf, 0x3f, 0xaa, 0xaf, 0xef, + 0x81, 0xa1, 0x4f, 0x3f, 0xe3, 0xd8, 0xe1, 0xfa, 0x0d, 0x64, 0x5e, 0xbf, + 0xa8, 0xfd, 0x51, 0xe2, 0x4f, 0x00, 0x6b, 0x3f, 0xba, 0x2f, 0x6c, 0x7a, + 0xc6, 0xc0, 0x76, 0xbf, 0xb3, 0x7f, 0xf5, 0xf1, 0xa6, 0x9e, 0x82, 0x3f, + 0x8d, 0x4f, 0x6f, 0x7f, 0x30, 0x81, 0x8e, 0xbf, 0xdd, 0x9c, 0x21, 0x46, + 0x91, 0x6f, 0x9a, 0x3f, 0xbb, 0xd3, 0xde, 0x6d, 0x3d, 0x67, 0xac, 0xbf, + 0x57, 0xb9, 0xa9, 0x42, 0x3e, 0xbf, 0xef, 0x3f, 0x10, 0x6e, 0x5d, 0x78, + 0x85, 0xf1, 0xb0, 0x3f, 0xcb, 0x21, 0x36, 0x80, 0x7c, 0x37, 0x9f, 0xbf, + 0x1e, 0x14, 0x9f, 0xaa, 0x47, 0xa0, 0x92, 0x3f, 0x3e, 0xf4, 0x2d, 0xef, + 0xd0, 0xd7, 0x87, 0xbf, 0x0a, 0x05, 0xfa, 0xf9, 0x6a, 0xd6, 0x7e, 0x3f, + 0xe1, 0x25, 0xb3, 0xd0, 0x46, 0x8e, 0x73, 0xbf, 0x2f, 0xe3, 0xc4, 0x74, + 0x41, 0xd3, 0x67, 0x3f, 0x8d, 0x97, 0x97, 0x2a, 0x95, 0x5a, 0x5b, 0xbf, + 0x2f, 0x8d, 0x87, 0x8f, 0x87, 0xec, 0x4c, 0x3f, 0xe0, 0xad, 0x0e, 0x27, + 0x16, 0x39, 0x3b, 0xbf, 0xf5, 0x88, 0xd2, 0x42, 0xda, 0x68, 0x25, 0x3f, + 0x22, 0x25, 0x58, 0x6b, 0xcc, 0xec, 0x07, 0xbf, 0x36, 0x9b, 0x60, 0x72, + 0xa1, 0xfe, 0x02, 0xbf, 0x91, 0x85, 0xfd, 0x52, 0x81, 0x33, 0x21, 0x3f, + 0x40, 0x47, 0xbf, 0xd3, 0xda, 0x22, 0x36, 0xbf, 0x27, 0x34, 0xee, 0xc4, + 0xd8, 0xd6, 0x47, 0x3f, 0x90, 0x43, 0x21, 0x2b, 0x6c, 0xe9, 0x56, 0xbf, + 0x9e, 0x05, 0xa6, 0x68, 0x4e, 0x5d, 0x64, 0x3f, 0x96, 0x51, 0xd7, 0xd8, + 0x74, 0x2b, 0x71, 0xbf, 0x82, 0x2c, 0x4b, 0x94, 0xa7, 0x1f, 0x7c, 0x3f, + 0x58, 0x5f, 0x3d, 0x24, 0x30, 0x11, 0x87, 0xbf, 0xe8, 0x3a, 0x20, 0x23, + 0x6b, 0x0a, 0x94, 0x3f, 0x5a, 0x38, 0xad, 0xd6, 0x46, 0xb0, 0xa5, 0xbf, + 0x08, 0xbd, 0xe6, 0x75, 0x12, 0xd9, 0xef, 0x3f, 0x40, 0x55, 0x5b, 0x4f, + 0x1e, 0x14, 0xa9, 0x3f, 0x7f, 0xad, 0x41, 0x2f, 0xdb, 0x4c, 0x97, 0xbf, + 0xc9, 0x41, 0x44, 0xf4, 0xb7, 0xe1, 0x8b, 0x3f, 0x9b, 0xdc, 0x20, 0x9a, + 0xb7, 0xde, 0x81, 0xbf, 0xdd, 0xb4, 0x65, 0xcb, 0xa4, 0x21, 0x77, 0x3f, + 0x98, 0x0e, 0x8b, 0x9a, 0xab, 0x5a, 0x6d, 0xbf, 0x9c, 0x6f, 0xda, 0x16, + 0x83, 0xe3, 0x61, 0x3f, 0x2e, 0xeb, 0xf0, 0xe8, 0x6a, 0x8b, 0x54, 0xbf, + 0x44, 0x49, 0xc6, 0x39, 0xbb, 0xba, 0x45, 0x3f, 0x74, 0xba, 0xa1, 0x8e, + 0xbd, 0x74, 0x34, 0xbf, 0x6f, 0x22, 0xa4, 0xcf, 0x40, 0x17, 0x20, 0x3f, + 0x39, 0x43, 0x4c, 0x98, 0x21, 0xfc, 0x01, 0xbf, 0x2d, 0x49, 0xd8, 0x0c, + 0x7c, 0x69, 0xf9, 0xbe, 0x02, 0x03, 0x8d, 0xae, 0x8c, 0x04, 0x17, 0x3f, + 0xf3, 0xd5, 0x82, 0xe1, 0xd1, 0xa0, 0x2d, 0xbf, 0xce, 0xd4, 0x62, 0x7b, + 0x7c, 0xea, 0x3f, 0x3f, 0x78, 0x5b, 0x3e, 0x5d, 0x15, 0xaf, 0x4e, 0xbf, + 0xa6, 0xc5, 0x93, 0x26, 0x8e, 0x48, 0x5b, 0x3f, 0xe8, 0x50, 0xe3, 0x28, + 0x0a, 0x04, 0x67, 0xbf, 0xc0, 0x35, 0x42, 0xb5, 0x5a, 0xdd, 0x72, 0x3f, + 0xe2, 0xa7, 0xae, 0x4a, 0x6b, 0xfc, 0x7e, 0xbf, 0x85, 0x65, 0x28, 0x7c, + 0x40, 0xfd, 0x8a, 0x3f, 0x16, 0x6e, 0xf7, 0xe2, 0xea, 0x6c, 0x9d, 0xbf, + 0xbc, 0xfe, 0xd8, 0x40, 0x7e, 0xec, 0xef, 0x3f, 0xdf, 0xa1, 0x42, 0x30, + 0x2e, 0x7d, 0xa0, 0x3f, 0x84, 0xac, 0x35, 0xe2, 0x34, 0xe5, 0x8e, 0xbf, + 0x38, 0x14, 0x8e, 0x26, 0x10, 0x89, 0x82, 0x3f, 0x24, 0x46, 0x6b, 0xe9, + 0xb0, 0xca, 0x77, 0xbf, 0x7a, 0x8d, 0xd9, 0xdd, 0x71, 0xd2, 0x6e, 0x3f, + 0x39, 0xe4, 0x66, 0xbc, 0x57, 0x91, 0x63, 0xbf, 0xc7, 0x6c, 0x4b, 0xda, + 0xf6, 0xdb, 0x57, 0x3f, 0x6c, 0x17, 0x0d, 0xed, 0xff, 0x68, 0x4b, 0xbf, + 0xec, 0x23, 0x1e, 0x98, 0x91, 0xff, 0x3c, 0x3f, 0x91, 0x19, 0xcf, 0xaf, + 0x0b, 0x4e, 0x2b, 0xbf, 0xa0, 0xd2, 0x01, 0x71, 0x7d, 0x7b, 0x15, 0x3f, + 0xf4, 0xc4, 0x20, 0x54, 0x0b, 0x04, 0xf8, 0xbe, 0xa7, 0x2b, 0x61, 0xa2, + 0x61, 0x7a, 0xe9, 0xbe, 0x85, 0xc3, 0x98, 0x0e, 0x2b, 0x15, 0x07, 0x3f, + 0xd9, 0xcb, 0xab, 0xb3, 0xf0, 0xb7, 0x1d, 0xbf, 0x7c, 0xbb, 0x42, 0x31, + 0xc2, 0x02, 0x30, 0x3f, 0xb5, 0xa4, 0xe3, 0xad, 0x8c, 0xcb, 0x3e, 0xbf, + 0x96, 0xb7, 0x91, 0x41, 0xb0, 0x64, 0x4b, 0x3f, 0x6e, 0x01, 0x3f, 0xf0, + 0x01, 0x1f, 0x57, 0xbf, 0xec, 0x02, 0x88, 0x15, 0x59, 0xf7, 0x62, 0x3f, + 0xe2, 0xf7, 0x0d, 0x87, 0x94, 0x31, 0x6f, 0xbf, 0xaf, 0xa1, 0xc7, 0x3c, + 0x86, 0x3d, 0x7b, 0x3f, 0xf8, 0x39, 0x06, 0x03, 0xc5, 0xec, 0x8d, 0xbf, + 0xee, 0x34, 0xb6, 0xe9, 0x79, 0xf9, 0xef, 0x3f, 0xa4, 0x6e, 0xa2, 0x2c, + 0xe1, 0x40, 0x90, 0x3f, 0xed, 0xe7, 0x8f, 0x8e, 0xc8, 0xb3, 0x7e, 0xbf, + 0xfb, 0x26, 0xf4, 0x0f, 0x12, 0x78, 0x72, 0x3f, 0xed, 0xef, 0x4f, 0x6a, + 0x0d, 0xbd, 0x67, 0xbf, 0xb1, 0x50, 0x0c, 0x3b, 0x34, 0xc7, 0x5e, 0x3f, + 0xb8, 0x08, 0x3e, 0x82, 0xf9, 0x8c, 0x53, 0xbf, 0x0d, 0x38, 0xd4, 0x74, + 0x1b, 0xd9, 0x47, 0x3f, 0x49, 0x5c, 0x9d, 0x0a, 0xea, 0x67, 0x3b, 0xbf, + 0x0f, 0x95, 0x3b, 0x12, 0x4f, 0x00, 0x2d, 0x3f, 0x52, 0xc8, 0x3d, 0xb6, + 0x41, 0x50, 0x1b, 0xbf, 0x6e, 0xce, 0x85, 0xae, 0x4d, 0x7e, 0x05, 0x3f, + 0x1e, 0xdc, 0x76, 0x6d, 0x65, 0x08, 0xe8, 0xbe, 0xbf, 0xfd, 0x9c, 0x14, + 0x65, 0xdd, 0x70, 0xbd, 0x96, 0xa3, 0x86, 0xff, 0x2d, 0xf3, 0x87, 0x3d, + 0xfb, 0x6c, 0xb0, 0x0b, 0xc3, 0x51, 0x99, 0xbd, 0x29, 0xb9, 0x89, 0x53, + 0x06, 0x9a, 0xa6, 0x3d, 0x4e, 0xdb, 0x03, 0x18, 0x8e, 0xf5, 0xb1, 0xbd, + 0xd8, 0x76, 0xd2, 0x8f, 0xd8, 0x15, 0xba, 0x3d, 0xe7, 0x4e, 0x99, 0x51, + 0x7c, 0x98, 0xc1, 0xbd, 0x99, 0x9b, 0x71, 0x10, 0x7c, 0x42, 0xc6, 0x3d, + 0x68, 0x19, 0x12, 0xa4, 0x15, 0x95, 0xca, 0xbd, 0x44, 0x08, 0xa5, 0xb6, + 0x70, 0x17, 0xce, 0x3d, 0xca, 0x61, 0x2e, 0x1b, 0x03, 0x31, 0xd0, 0xbd, + 0xdd, 0x25, 0x04, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0xca, 0x61, 0x2e, 0x1b, + 0x03, 0x31, 0xd0, 0xbd, 0x44, 0x08, 0xa5, 0xb6, 0x70, 0x17, 0xce, 0x3d, + 0x68, 0x19, 0x12, 0xa4, 0x15, 0x95, 0xca, 0xbd, 0x99, 0x9b, 0x71, 0x10, + 0x7c, 0x42, 0xc6, 0x3d, 0xe7, 0x4e, 0x99, 0x51, 0x7c, 0x98, 0xc1, 0xbd, + 0xd8, 0x76, 0xd2, 0x8f, 0xd8, 0x15, 0xba, 0x3d, 0x4e, 0xdb, 0x03, 0x18, + 0x8e, 0xf5, 0xb1, 0xbd, 0x29, 0xb9, 0x89, 0x53, 0x06, 0x9a, 0xa6, 0x3d, + 0xfb, 0x6c, 0xb0, 0x0b, 0xc3, 0x51, 0x99, 0xbd, 0x96, 0xa3, 0x86, 0xff, + 0x2d, 0xf3, 0x87, 0x3d, 0xbf, 0xfd, 0x9c, 0x14, 0x65, 0xdd, 0x70, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0xfd, 0x7f, 0x01, + 0x60, 0x00, 0x28, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6a, 0xf2, 0xff, 0x00, 0x40, 0x00, 0x40, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x22, 0x04, 0x30, 0x01, 0x4c, 0x00, 0x53, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x40, 0x01, + 0x50, 0x00, 0x64, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa8, 0x02, 0x2c, 0x01, 0x4b, 0xc0, 0x72, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa7, 0x03, 0x04, 0x01, 0x41, 0x40, 0x80, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x07, 0xac, 0x01, + 0x6b, 0xc0, 0x8a, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xd0, 0x05, 0x50, 0x01, 0x54, 0x00, 0x95, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x04, 0x01, 0x41, 0x40, 0x10, 0xa0, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x85, 0x82, 0xa1, + 0x60, 0x28, 0xa8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x94, 0x44, 0x24, 0x11, 0x49, 0x44, 0xb2, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4b, 0x47, 0xcd, 0x51, 0x73, 0xd4, 0xbc, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xe6, 0x9f, 0xf9, + 0x67, 0xfe, 0xc9, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x13, 0x65, 0x44, 0x19, 0x51, 0x46, 0xe4, 0x3f, 0x01, 0x04, 0x00, 0x01, + 0x40, 0x00, 0xf0, 0x3f, 0x13, 0x65, 0x44, 0x19, 0x51, 0x46, 0xe4, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xe6, 0x9f, 0xf9, + 0x67, 0xfe, 0xc9, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4b, 0x47, 0xcd, 0x51, 0x73, 0xd4, 0xbc, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x94, 0x44, 0x24, 0x11, 0x49, 0x44, 0xb2, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x85, 0x82, 0xa1, + 0x60, 0x28, 0xa8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x04, 0x01, 0x41, 0x40, 0x10, 0xa0, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd0, 0x05, 0x50, 0x01, 0x54, 0x00, 0x95, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x07, 0xac, 0x01, + 0x6b, 0xc0, 0x8a, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa7, 0x03, 0x04, 0x01, 0x41, 0x40, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa8, 0x02, 0x2c, 0x01, 0x4b, 0xc0, 0x72, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x40, 0x01, + 0x50, 0x00, 0x64, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x22, 0x04, 0x30, 0x01, 0x4c, 0x00, 0x53, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6a, 0xf2, 0xff, 0x00, 0x40, 0x00, 0x40, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0xfd, 0x7f, 0x01, + 0x60, 0x00, 0x28, 0xbf, 0x41, 0x64, 0x70, 0x58, 0x63, 0x6f, 0x72, 0x72, + 0x3a, 0x20, 0x45, 0x78, 0x69, 0x74, 0x20, 0x72, 0x65, 0x71, 0x2c, 0x20, + 0x6c, 0x61, 0x67, 0x3a, 0x25, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x64, 0x70, 0x58, 0x63, 0x6f, 0x72, 0x72, 0x4f, 0x70, 0x74, 0x3a, + 0x20, 0x45, 0x78, 0x69, 0x74, 0x20, 0x72, 0x65, 0x71, 0x2c, 0x20, 0x66, + 0x72, 0x61, 0x63, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x3a, 0x25, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x70, 0x64, 0x5f, + 0x56, 0x65, 0x72, 0x74, 0x78, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, + 0x20, 0x45, 0x78, 0x69, 0x74, 0x20, 0x72, 0x65, 0x71, 0x2c, 0x20, 0x69, + 0x74, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x25, 0x64, 0x00, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x69, + 0x74, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x2e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x63, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x20, + 0x69, 0x73, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x46, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, + 0x65, 0x2e, 0x20, 0x28, 0x63, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x3d, + 0x25, 0x75, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x20, 0x66, 0x65, 0x61, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x63, + 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x2e, 0x00, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x68, 0x61, + 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x67, 0x65, 0x74, 0x20, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x66, + 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x73, 0x20, 0x65, 0x78, 0x63, 0x65, + 0x65, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x71, 0x75, 0x65, 0x75, 0x65, 0x20, + 0x73, 0x69, 0x7a, 0x65, 0x2e, 0x00, 0x00, 0x00, 0x43, 0x61, 0x6e, 0x27, + 0x74, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x20, 0x61, 0x64, 0x61, 0x70, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x73, 0x2e, 0x00, 0x00, 0x55, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, + 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x2e, 0x00, 0x00, 0x00, 0x41, 0x64, 0x61, 0x70, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x46, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x9b, 0x03, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xd0, 0x82, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xad, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x90, 0xae, 0x03, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x71, 0xd5, 0xd1, 0xff, 0xff, 0xff, 0xaf, 0x40, 0xe2, 0xaa, 0xa3, 0xff, + 0xff, 0xff, 0xaf, 0x40, 0x6c, 0x6f, 0x67, 0x31, 0x30, 0x66, 0x00, 0x00, + 0x6c, 0x6f, 0x67, 0x31, 0x30, 0x00, 0x00, 0x00, 0x0e, 0xe5, 0x26, 0x15, + 0x7b, 0xcb, 0xdb, 0x3f, 0x36, 0x2b, 0xf1, 0x11, 0xf3, 0xfe, 0x59, 0x3d, + 0x00, 0x60, 0x9f, 0x50, 0x13, 0x44, 0xd3, 0x3f, 0xfe, 0x82, 0x2b, 0x65, + 0x47, 0x15, 0x67, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x43, + 0x00, 0x00, 0xfa, 0xfe, 0x42, 0x2e, 0x76, 0xbf, 0x3a, 0x3b, 0x9e, 0xbc, + 0x9a, 0xf7, 0x0c, 0xbd, 0xbd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x3f, + 0x3c, 0x54, 0x55, 0x55, 0x55, 0x55, 0xc5, 0x3f, 0x91, 0x2b, 0x17, 0xcf, + 0x55, 0x55, 0xa5, 0x3f, 0x17, 0xd0, 0xa4, 0x67, 0x11, 0x11, 0x81, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x42, 0xef, 0x39, 0xfa, 0xfe, + 0x42, 0x2e, 0xe6, 0x3f, 0x24, 0xc4, 0x82, 0xff, 0xbd, 0xbf, 0xce, 0x3f, + 0xb5, 0xf4, 0x0c, 0xd7, 0x08, 0x6b, 0xac, 0x3f, 0xcc, 0x50, 0x46, 0xd2, + 0xab, 0xb2, 0x83, 0x3f, 0x84, 0x3a, 0x4e, 0x9b, 0xe0, 0xd7, 0x55, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x3f, 0x6e, 0xbf, 0x88, 0x1a, 0x4f, 0x3b, 0x9b, 0x3c, + 0x35, 0x33, 0xfb, 0xa9, 0x3d, 0xf6, 0xef, 0x3f, 0x5d, 0xdc, 0xd8, 0x9c, + 0x13, 0x60, 0x71, 0xbc, 0x61, 0x80, 0x77, 0x3e, 0x9a, 0xec, 0xef, 0x3f, + 0xd1, 0x66, 0x87, 0x10, 0x7a, 0x5e, 0x90, 0xbc, 0x85, 0x7f, 0x6e, 0xe8, + 0x15, 0xe3, 0xef, 0x3f, 0x13, 0xf6, 0x67, 0x35, 0x52, 0xd2, 0x8c, 0x3c, + 0x74, 0x85, 0x15, 0xd3, 0xb0, 0xd9, 0xef, 0x3f, 0xfa, 0x8e, 0xf9, 0x23, + 0x80, 0xce, 0x8b, 0xbc, 0xde, 0xf6, 0xdd, 0x29, 0x6b, 0xd0, 0xef, 0x3f, + 0x61, 0xc8, 0xe6, 0x61, 0x4e, 0xf7, 0x60, 0x3c, 0xc8, 0x9b, 0x75, 0x18, + 0x45, 0xc7, 0xef, 0x3f, 0x99, 0xd3, 0x33, 0x5b, 0xe4, 0xa3, 0x90, 0x3c, + 0x83, 0xf3, 0xc6, 0xca, 0x3e, 0xbe, 0xef, 0x3f, 0x6d, 0x7b, 0x83, 0x5d, + 0xa6, 0x9a, 0x97, 0x3c, 0x0f, 0x89, 0xf9, 0x6c, 0x58, 0xb5, 0xef, 0x3f, + 0xfc, 0xef, 0xfd, 0x92, 0x1a, 0xb5, 0x8e, 0x3c, 0xf7, 0x47, 0x72, 0x2b, + 0x92, 0xac, 0xef, 0x3f, 0xd1, 0x9c, 0x2f, 0x70, 0x3d, 0xbe, 0x3e, 0x3c, + 0xa2, 0xd1, 0xd3, 0x32, 0xec, 0xa3, 0xef, 0x3f, 0x0b, 0x6e, 0x90, 0x89, + 0x34, 0x03, 0x6a, 0xbc, 0x1b, 0xd3, 0xfe, 0xaf, 0x66, 0x9b, 0xef, 0x3f, + 0x0e, 0xbd, 0x2f, 0x2a, 0x52, 0x56, 0x95, 0xbc, 0x51, 0x5b, 0x12, 0xd0, + 0x01, 0x93, 0xef, 0x3f, 0x55, 0xea, 0x4e, 0x8c, 0xef, 0x80, 0x50, 0xbc, + 0xcc, 0x31, 0x6c, 0xc0, 0xbd, 0x8a, 0xef, 0x3f, 0x16, 0xf4, 0xd5, 0xb9, + 0x23, 0xc9, 0x91, 0xbc, 0xe0, 0x2d, 0xa9, 0xae, 0x9a, 0x82, 0xef, 0x3f, + 0xaf, 0x55, 0x5c, 0xe9, 0xe3, 0xd3, 0x80, 0x3c, 0x51, 0x8e, 0xa5, 0xc8, + 0x98, 0x7a, 0xef, 0x3f, 0x48, 0x93, 0xa5, 0xea, 0x15, 0x1b, 0x80, 0xbc, + 0x7b, 0x51, 0x7d, 0x3c, 0xb8, 0x72, 0xef, 0x3f, 0x3d, 0x32, 0xde, 0x55, + 0xf0, 0x1f, 0x8f, 0xbc, 0xea, 0x8d, 0x8c, 0x38, 0xf9, 0x6a, 0xef, 0x3f, + 0xbf, 0x53, 0x13, 0x3f, 0x8c, 0x89, 0x8b, 0x3c, 0x75, 0xcb, 0x6f, 0xeb, + 0x5b, 0x63, 0xef, 0x3f, 0x26, 0xeb, 0x11, 0x76, 0x9c, 0xd9, 0x96, 0xbc, + 0xd4, 0x5c, 0x04, 0x84, 0xe0, 0x5b, 0xef, 0x3f, 0x60, 0x2f, 0x3a, 0x3e, + 0xf7, 0xec, 0x9a, 0x3c, 0xaa, 0xb9, 0x68, 0x31, 0x87, 0x54, 0xef, 0x3f, + 0x9d, 0x38, 0x86, 0xcb, 0x82, 0xe7, 0x8f, 0xbc, 0x1d, 0xd9, 0xfc, 0x22, + 0x50, 0x4d, 0xef, 0x3f, 0x8d, 0xc3, 0xa6, 0x44, 0x41, 0x6f, 0x8a, 0x3c, + 0xd6, 0x8c, 0x62, 0x88, 0x3b, 0x46, 0xef, 0x3f, 0x7d, 0x04, 0xe4, 0xb0, + 0x05, 0x7a, 0x80, 0x3c, 0x96, 0xdc, 0x7d, 0x91, 0x49, 0x3f, 0xef, 0x3f, + 0x94, 0xa8, 0xa8, 0xe3, 0xfd, 0x8e, 0x96, 0x3c, 0x38, 0x62, 0x75, 0x6e, + 0x7a, 0x38, 0xef, 0x3f, 0x7d, 0x48, 0x74, 0xf2, 0x18, 0x5e, 0x87, 0x3c, + 0x3f, 0xa6, 0xb2, 0x4f, 0xce, 0x31, 0xef, 0x3f, 0xf2, 0xe7, 0x1f, 0x98, + 0x2b, 0x47, 0x80, 0x3c, 0xdd, 0x7c, 0xe2, 0x65, 0x45, 0x2b, 0xef, 0x3f, + 0x5e, 0x08, 0x71, 0x3f, 0x7b, 0xb8, 0x96, 0xbc, 0x81, 0x63, 0xf5, 0xe1, + 0xdf, 0x24, 0xef, 0x3f, 0x31, 0xab, 0x09, 0x6d, 0xe1, 0xf7, 0x82, 0x3c, + 0xe1, 0xde, 0x1f, 0xf5, 0x9d, 0x1e, 0xef, 0x3f, 0xfa, 0xbf, 0x6f, 0x1a, + 0x9b, 0x21, 0x3d, 0xbc, 0x90, 0xd9, 0xda, 0xd0, 0x7f, 0x18, 0xef, 0x3f, + 0xb4, 0x0a, 0x0c, 0x72, 0x82, 0x37, 0x8b, 0x3c, 0x0b, 0x03, 0xe4, 0xa6, + 0x85, 0x12, 0xef, 0x3f, 0x8f, 0xcb, 0xce, 0x89, 0x92, 0x14, 0x6e, 0x3c, + 0x56, 0x2f, 0x3e, 0xa9, 0xaf, 0x0c, 0xef, 0x3f, 0xb6, 0xab, 0xb0, 0x4d, + 0x75, 0x4d, 0x83, 0x3c, 0x15, 0xb7, 0x31, 0x0a, 0xfe, 0x06, 0xef, 0x3f, + 0x4c, 0x74, 0xac, 0xe2, 0x01, 0x42, 0x86, 0x3c, 0x31, 0xd8, 0x4c, 0xfc, + 0x70, 0x01, 0xef, 0x3f, 0x4a, 0xf8, 0xd3, 0x5d, 0x39, 0xdd, 0x8f, 0x3c, + 0xff, 0x16, 0x64, 0xb2, 0x08, 0xfc, 0xee, 0x3f, 0x04, 0x5b, 0x8e, 0x3b, + 0x80, 0xa3, 0x86, 0xbc, 0xf1, 0x9f, 0x92, 0x5f, 0xc5, 0xf6, 0xee, 0x3f, + 0x68, 0x50, 0x4b, 0xcc, 0xed, 0x4a, 0x92, 0xbc, 0xcb, 0xa9, 0x3a, 0x37, + 0xa7, 0xf1, 0xee, 0x3f, 0x8e, 0x2d, 0x51, 0x1b, 0xf8, 0x07, 0x99, 0xbc, + 0x66, 0xd8, 0x05, 0x6d, 0xae, 0xec, 0xee, 0x3f, 0xd2, 0x36, 0x94, 0x3e, + 0xe8, 0xd1, 0x71, 0xbc, 0xf7, 0x9f, 0xe5, 0x34, 0xdb, 0xe7, 0xee, 0x3f, + 0x15, 0x1b, 0xce, 0xb3, 0x19, 0x19, 0x99, 0xbc, 0xe5, 0xa8, 0x13, 0xc3, + 0x2d, 0xe3, 0xee, 0x3f, 0x6d, 0x4c, 0x2a, 0xa7, 0x48, 0x9f, 0x85, 0x3c, + 0x22, 0x34, 0x12, 0x4c, 0xa6, 0xde, 0xee, 0x3f, 0x8a, 0x69, 0x28, 0x7a, + 0x60, 0x12, 0x93, 0xbc, 0x1c, 0x80, 0xac, 0x04, 0x45, 0xda, 0xee, 0x3f, + 0x5b, 0x89, 0x17, 0x48, 0x8f, 0xa7, 0x58, 0xbc, 0x2a, 0x2e, 0xf7, 0x21, + 0x0a, 0xd6, 0xee, 0x3f, 0x1b, 0x9a, 0x49, 0x67, 0x9b, 0x2c, 0x7c, 0xbc, + 0x97, 0xa8, 0x50, 0xd9, 0xf5, 0xd1, 0xee, 0x3f, 0x11, 0xac, 0xc2, 0x60, + 0xed, 0x63, 0x43, 0x3c, 0x2d, 0x89, 0x61, 0x60, 0x08, 0xce, 0xee, 0x3f, + 0xef, 0x64, 0x06, 0x3b, 0x09, 0x66, 0x96, 0x3c, 0x57, 0x00, 0x1d, 0xed, + 0x41, 0xca, 0xee, 0x3f, 0x79, 0x03, 0xa1, 0xda, 0xe1, 0xcc, 0x6e, 0x3c, + 0xd0, 0x3c, 0xc1, 0xb5, 0xa2, 0xc6, 0xee, 0x3f, 0x30, 0x12, 0x0f, 0x3f, + 0x8e, 0xff, 0x93, 0x3c, 0xde, 0xd3, 0xd7, 0xf0, 0x2a, 0xc3, 0xee, 0x3f, + 0xb0, 0xaf, 0x7a, 0xbb, 0xce, 0x90, 0x76, 0x3c, 0x27, 0x2a, 0x36, 0xd5, + 0xda, 0xbf, 0xee, 0x3f, 0x77, 0xe0, 0x54, 0xeb, 0xbd, 0x1d, 0x93, 0x3c, + 0x0d, 0xdd, 0xfd, 0x99, 0xb2, 0xbc, 0xee, 0x3f, 0x8e, 0xa3, 0x71, 0x00, + 0x34, 0x94, 0x8f, 0xbc, 0xa7, 0x2c, 0x9d, 0x76, 0xb2, 0xb9, 0xee, 0x3f, + 0x49, 0xa3, 0x93, 0xdc, 0xcc, 0xde, 0x87, 0xbc, 0x42, 0x66, 0xcf, 0xa2, + 0xda, 0xb6, 0xee, 0x3f, 0x5f, 0x38, 0x0f, 0xbd, 0xc6, 0xde, 0x78, 0xbc, + 0x82, 0x4f, 0x9d, 0x56, 0x2b, 0xb4, 0xee, 0x3f, 0xf6, 0x5c, 0x7b, 0xec, + 0x46, 0x12, 0x86, 0xbc, 0x0f, 0x92, 0x5d, 0xca, 0xa4, 0xb1, 0xee, 0x3f, + 0x8e, 0xd7, 0xfd, 0x18, 0x05, 0x35, 0x93, 0x3c, 0xda, 0x27, 0xb5, 0x36, + 0x47, 0xaf, 0xee, 0x3f, 0x05, 0x9b, 0x8a, 0x2f, 0xb7, 0x98, 0x7b, 0x3c, + 0xfd, 0xc7, 0x97, 0xd4, 0x12, 0xad, 0xee, 0x3f, 0x09, 0x54, 0x1c, 0xe2, + 0xe1, 0x63, 0x90, 0x3c, 0x29, 0x54, 0x48, 0xdd, 0x07, 0xab, 0xee, 0x3f, + 0xea, 0xc6, 0x19, 0x50, 0x85, 0xc7, 0x34, 0x3c, 0xb7, 0x46, 0x59, 0x8a, + 0x26, 0xa9, 0xee, 0x3f, 0x35, 0xc0, 0x64, 0x2b, 0xe6, 0x32, 0x94, 0x3c, + 0x48, 0x21, 0xad, 0x15, 0x6f, 0xa7, 0xee, 0x3f, 0x9f, 0x76, 0x99, 0x61, + 0x4a, 0xe4, 0x8c, 0xbc, 0x09, 0xdc, 0x76, 0xb9, 0xe1, 0xa5, 0xee, 0x3f, + 0xa8, 0x4d, 0xef, 0x3b, 0xc5, 0x33, 0x8c, 0xbc, 0x85, 0x55, 0x3a, 0xb0, + 0x7e, 0xa4, 0xee, 0x3f, 0xae, 0xe9, 0x2b, 0x89, 0x78, 0x53, 0x84, 0xbc, + 0x20, 0xc3, 0xcc, 0x34, 0x46, 0xa3, 0xee, 0x3f, 0x58, 0x58, 0x56, 0x78, + 0xdd, 0xce, 0x93, 0xbc, 0x25, 0x22, 0x55, 0x82, 0x38, 0xa2, 0xee, 0x3f, + 0x64, 0x19, 0x7e, 0x80, 0xaa, 0x10, 0x57, 0x3c, 0x73, 0xa9, 0x4c, 0xd4, + 0x55, 0xa1, 0xee, 0x3f, 0x28, 0x22, 0x5e, 0xbf, 0xef, 0xb3, 0x93, 0xbc, + 0xcd, 0x3b, 0x7f, 0x66, 0x9e, 0xa0, 0xee, 0x3f, 0x82, 0xb9, 0x34, 0x87, + 0xad, 0x12, 0x6a, 0xbc, 0xbf, 0xda, 0x0b, 0x75, 0x12, 0xa0, 0xee, 0x3f, + 0xee, 0xa9, 0x6d, 0xb8, 0xef, 0x67, 0x63, 0xbc, 0x2f, 0x1a, 0x65, 0x3c, + 0xb2, 0x9f, 0xee, 0x3f, 0x51, 0x88, 0xe0, 0x54, 0x3d, 0xdc, 0x80, 0xbc, + 0x84, 0x94, 0x51, 0xf9, 0x7d, 0x9f, 0xee, 0x3f, 0xcf, 0x3e, 0x5a, 0x7e, + 0x64, 0x1f, 0x78, 0xbc, 0x74, 0x5f, 0xec, 0xe8, 0x75, 0x9f, 0xee, 0x3f, + 0xb0, 0x7d, 0x8b, 0xc0, 0x4a, 0xee, 0x86, 0xbc, 0x74, 0x81, 0xa5, 0x48, + 0x9a, 0x9f, 0xee, 0x3f, 0x8a, 0xe6, 0x55, 0x1e, 0x32, 0x19, 0x86, 0xbc, + 0xc9, 0x67, 0x42, 0x56, 0xeb, 0x9f, 0xee, 0x3f, 0xd3, 0xd4, 0x09, 0x5e, + 0xcb, 0x9c, 0x90, 0x3c, 0x3f, 0x5d, 0xde, 0x4f, 0x69, 0xa0, 0xee, 0x3f, + 0x1d, 0xa5, 0x4d, 0xb9, 0xdc, 0x32, 0x7b, 0xbc, 0x87, 0x01, 0xeb, 0x73, + 0x14, 0xa1, 0xee, 0x3f, 0x6b, 0xc0, 0x67, 0x54, 0xfd, 0xec, 0x94, 0x3c, + 0x32, 0xc1, 0x30, 0x01, 0xed, 0xa1, 0xee, 0x3f, 0x55, 0x6c, 0xd6, 0xab, + 0xe1, 0xeb, 0x65, 0x3c, 0x62, 0x4e, 0xcf, 0x36, 0xf3, 0xa2, 0xee, 0x3f, + 0x42, 0xcf, 0xb3, 0x2f, 0xc5, 0xa1, 0x88, 0xbc, 0x12, 0x1a, 0x3e, 0x54, + 0x27, 0xa4, 0xee, 0x3f, 0x34, 0x37, 0x3b, 0xf1, 0xb6, 0x69, 0x93, 0xbc, + 0x13, 0xce, 0x4c, 0x99, 0x89, 0xa5, 0xee, 0x3f, 0x1e, 0xff, 0x19, 0x3a, + 0x84, 0x5e, 0x80, 0xbc, 0xad, 0xc7, 0x23, 0x46, 0x1a, 0xa7, 0xee, 0x3f, + 0x6e, 0x57, 0x72, 0xd8, 0x50, 0xd4, 0x94, 0xbc, 0xed, 0x92, 0x44, 0x9b, + 0xd9, 0xa8, 0xee, 0x3f, 0x00, 0x8a, 0x0e, 0x5b, 0x67, 0xad, 0x90, 0x3c, + 0x99, 0x66, 0x8a, 0xd9, 0xc7, 0xaa, 0xee, 0x3f, 0xb4, 0xea, 0xf0, 0xc1, + 0x2f, 0xb7, 0x8d, 0x3c, 0xdb, 0xa0, 0x2a, 0x42, 0xe5, 0xac, 0xee, 0x3f, + 0xff, 0xe7, 0xc5, 0x9c, 0x60, 0xb6, 0x65, 0xbc, 0x8c, 0x44, 0xb5, 0x16, + 0x32, 0xaf, 0xee, 0x3f, 0x44, 0x5f, 0xf3, 0x59, 0x83, 0xf6, 0x7b, 0x3c, + 0x36, 0x77, 0x15, 0x99, 0xae, 0xb1, 0xee, 0x3f, 0x83, 0x3d, 0x1e, 0xa7, + 0x1f, 0x09, 0x93, 0xbc, 0xc6, 0xff, 0x91, 0x0b, 0x5b, 0xb4, 0xee, 0x3f, + 0x29, 0x1e, 0x6c, 0x8b, 0xb8, 0xa9, 0x5d, 0xbc, 0xe5, 0xc5, 0xcd, 0xb0, + 0x37, 0xb7, 0xee, 0x3f, 0x59, 0xb9, 0x90, 0x7c, 0xf9, 0x23, 0x6c, 0xbc, + 0x0f, 0x52, 0xc8, 0xcb, 0x44, 0xba, 0xee, 0x3f, 0xaa, 0xf9, 0xf4, 0x22, + 0x43, 0x43, 0x92, 0xbc, 0x50, 0x4e, 0xde, 0x9f, 0x82, 0xbd, 0xee, 0x3f, + 0x4b, 0x8e, 0x66, 0xd7, 0x6c, 0xca, 0x85, 0xbc, 0xba, 0x07, 0xca, 0x70, + 0xf1, 0xc0, 0xee, 0x3f, 0x27, 0xce, 0x91, 0x2b, 0xfc, 0xaf, 0x71, 0x3c, + 0x90, 0xf0, 0xa3, 0x82, 0x91, 0xc4, 0xee, 0x3f, 0xbb, 0x73, 0x0a, 0xe1, + 0x35, 0xd2, 0x6d, 0x3c, 0x23, 0x23, 0xe3, 0x19, 0x63, 0xc8, 0xee, 0x3f, + 0x63, 0x22, 0x62, 0x22, 0x04, 0xc5, 0x87, 0xbc, 0x65, 0xe5, 0x5d, 0x7b, + 0x66, 0xcc, 0xee, 0x3f, 0xd5, 0x31, 0xe2, 0xe3, 0x86, 0x1c, 0x8b, 0x3c, + 0x33, 0x2d, 0x4a, 0xec, 0x9b, 0xd0, 0xee, 0x3f, 0x15, 0xbb, 0xbc, 0xd3, + 0xd1, 0xbb, 0x91, 0xbc, 0x5d, 0x25, 0x3e, 0xb2, 0x03, 0xd5, 0xee, 0x3f, + 0xd2, 0x31, 0xee, 0x9c, 0x31, 0xcc, 0x90, 0x3c, 0x58, 0xb3, 0x30, 0x13, + 0x9e, 0xd9, 0xee, 0x3f, 0xb3, 0x5a, 0x73, 0x6e, 0x84, 0x69, 0x84, 0x3c, + 0xbf, 0xfd, 0x79, 0x55, 0x6b, 0xde, 0xee, 0x3f, 0xb4, 0x9d, 0x8e, 0x97, + 0xcd, 0xdf, 0x82, 0xbc, 0x7a, 0xf3, 0xd3, 0xbf, 0x6b, 0xe3, 0xee, 0x3f, + 0x87, 0x33, 0xcb, 0x92, 0x77, 0x1a, 0x8c, 0x3c, 0xad, 0xd3, 0x5a, 0x99, + 0x9f, 0xe8, 0xee, 0x3f, 0xfa, 0xd9, 0xd1, 0x4a, 0x8f, 0x7b, 0x90, 0xbc, + 0x66, 0xb6, 0x8d, 0x29, 0x07, 0xee, 0xee, 0x3f, 0xba, 0xae, 0xdc, 0x56, + 0xd9, 0xc3, 0x55, 0xbc, 0xfb, 0x15, 0x4f, 0xb8, 0xa2, 0xf3, 0xee, 0x3f, + 0x40, 0xf6, 0xa6, 0x3d, 0x0e, 0xa4, 0x90, 0xbc, 0x3a, 0x59, 0xe5, 0x8d, + 0x72, 0xf9, 0xee, 0x3f, 0x34, 0x93, 0xad, 0x38, 0xf4, 0xd6, 0x68, 0xbc, + 0x47, 0x5e, 0xfb, 0xf2, 0x76, 0xff, 0xee, 0x3f, 0x35, 0x8a, 0x58, 0x6b, + 0xe2, 0xee, 0x91, 0xbc, 0x4a, 0x06, 0xa1, 0x30, 0xb0, 0x05, 0xef, 0x3f, + 0xcd, 0xdd, 0x5f, 0x0a, 0xd7, 0xff, 0x74, 0x3c, 0xd2, 0xc1, 0x4b, 0x90, + 0x1e, 0x0c, 0xef, 0x3f, 0xac, 0x98, 0x92, 0xfa, 0xfb, 0xbd, 0x91, 0xbc, + 0x09, 0x1e, 0xd7, 0x5b, 0xc2, 0x12, 0xef, 0x3f, 0xb3, 0x0c, 0xaf, 0x30, + 0xae, 0x6e, 0x73, 0x3c, 0x9c, 0x52, 0x85, 0xdd, 0x9b, 0x19, 0xef, 0x3f, + 0x94, 0xfd, 0x9f, 0x5c, 0x32, 0xe3, 0x8e, 0x3c, 0x7a, 0xd0, 0xff, 0x5f, + 0xab, 0x20, 0xef, 0x3f, 0xac, 0x59, 0x09, 0xd1, 0x8f, 0xe0, 0x84, 0x3c, + 0x4b, 0xd1, 0x57, 0x2e, 0xf1, 0x27, 0xef, 0x3f, 0x67, 0x1a, 0x4e, 0x38, + 0xaf, 0xcd, 0x63, 0x3c, 0xb5, 0xe7, 0x06, 0x94, 0x6d, 0x2f, 0xef, 0x3f, + 0x68, 0x19, 0x92, 0x6c, 0x2c, 0x6b, 0x67, 0x3c, 0x69, 0x90, 0xef, 0xdc, + 0x20, 0x37, 0xef, 0x3f, 0xd2, 0xb5, 0xcc, 0x83, 0x18, 0x8a, 0x80, 0xbc, + 0xfa, 0xc3, 0x5d, 0x55, 0x0b, 0x3f, 0xef, 0x3f, 0x6f, 0xfa, 0xff, 0x3f, + 0x5d, 0xad, 0x8f, 0xbc, 0x7c, 0x89, 0x07, 0x4a, 0x2d, 0x47, 0xef, 0x3f, + 0x49, 0xa9, 0x75, 0x38, 0xae, 0x0d, 0x90, 0xbc, 0xf2, 0x89, 0x0d, 0x08, + 0x87, 0x4f, 0xef, 0x3f, 0xa7, 0x07, 0x3d, 0xa6, 0x85, 0xa3, 0x74, 0x3c, + 0x87, 0xa4, 0xfb, 0xdc, 0x18, 0x58, 0xef, 0x3f, 0x0f, 0x22, 0x40, 0x20, + 0x9e, 0x91, 0x82, 0xbc, 0x98, 0x83, 0xc9, 0x16, 0xe3, 0x60, 0xef, 0x3f, + 0xac, 0x92, 0xc1, 0xd5, 0x50, 0x5a, 0x8e, 0x3c, 0x85, 0x32, 0xdb, 0x03, + 0xe6, 0x69, 0xef, 0x3f, 0x4b, 0x6b, 0x01, 0xac, 0x59, 0x3a, 0x84, 0x3c, + 0x60, 0xb4, 0x01, 0xf3, 0x21, 0x73, 0xef, 0x3f, 0x1f, 0x3e, 0xb4, 0x07, + 0x21, 0xd5, 0x82, 0xbc, 0x5f, 0x9b, 0x7b, 0x33, 0x97, 0x7c, 0xef, 0x3f, + 0xc9, 0x0d, 0x47, 0x3b, 0xb9, 0x2a, 0x89, 0xbc, 0x29, 0xa1, 0xf5, 0x14, + 0x46, 0x86, 0xef, 0x3f, 0xd3, 0x88, 0x3a, 0x60, 0x04, 0xb6, 0x74, 0x3c, + 0xf6, 0x3f, 0x8b, 0xe7, 0x2e, 0x90, 0xef, 0x3f, 0x71, 0x72, 0x9d, 0x51, + 0xec, 0xc5, 0x83, 0x3c, 0x83, 0x4c, 0xc7, 0xfb, 0x51, 0x9a, 0xef, 0x3f, + 0xf0, 0x91, 0xd3, 0x8f, 0x12, 0xf7, 0x8f, 0xbc, 0xda, 0x90, 0xa4, 0xa2, + 0xaf, 0xa4, 0xef, 0x3f, 0x7d, 0x74, 0x23, 0xe2, 0x98, 0xae, 0x8d, 0xbc, + 0xf1, 0x67, 0x8e, 0x2d, 0x48, 0xaf, 0xef, 0x3f, 0x08, 0x20, 0xaa, 0x41, + 0xbc, 0xc3, 0x8e, 0x3c, 0x27, 0x5a, 0x61, 0xee, 0x1b, 0xba, 0xef, 0x3f, + 0x32, 0xeb, 0xa9, 0xc3, 0x94, 0x2b, 0x84, 0x3c, 0x97, 0xba, 0x6b, 0x37, + 0x2b, 0xc5, 0xef, 0x3f, 0xee, 0x85, 0xd1, 0x31, 0xa9, 0x64, 0x8a, 0x3c, + 0x40, 0x45, 0x6e, 0x5b, 0x76, 0xd0, 0xef, 0x3f, 0xed, 0xe3, 0x3b, 0xe4, + 0xba, 0x37, 0x8e, 0xbc, 0x14, 0xbe, 0x9c, 0xad, 0xfd, 0xdb, 0xef, 0x3f, + 0x9d, 0xcd, 0x91, 0x4d, 0x3b, 0x89, 0x77, 0x3c, 0xd8, 0x90, 0x9e, 0x81, + 0xc1, 0xe7, 0xef, 0x3f, 0x89, 0xcc, 0x60, 0x41, 0xc1, 0x05, 0x53, 0x3c, + 0xf1, 0x71, 0x8f, 0x2b, 0xc2, 0xf3, 0xef, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x3f, 0x74, 0x85, 0x15, 0xd3, 0xb0, 0xd9, 0xef, 0x3f, + 0x0f, 0x89, 0xf9, 0x6c, 0x58, 0xb5, 0xef, 0x3f, 0x51, 0x5b, 0x12, 0xd0, + 0x01, 0x93, 0xef, 0x3f, 0x7b, 0x51, 0x7d, 0x3c, 0xb8, 0x72, 0xef, 0x3f, + 0xaa, 0xb9, 0x68, 0x31, 0x87, 0x54, 0xef, 0x3f, 0x38, 0x62, 0x75, 0x6e, + 0x7a, 0x38, 0xef, 0x3f, 0xe1, 0xde, 0x1f, 0xf5, 0x9d, 0x1e, 0xef, 0x3f, + 0x15, 0xb7, 0x31, 0x0a, 0xfe, 0x06, 0xef, 0x3f, 0xcb, 0xa9, 0x3a, 0x37, + 0xa7, 0xf1, 0xee, 0x3f, 0x22, 0x34, 0x12, 0x4c, 0xa6, 0xde, 0xee, 0x3f, + 0x2d, 0x89, 0x61, 0x60, 0x08, 0xce, 0xee, 0x3f, 0x27, 0x2a, 0x36, 0xd5, + 0xda, 0xbf, 0xee, 0x3f, 0x82, 0x4f, 0x9d, 0x56, 0x2b, 0xb4, 0xee, 0x3f, + 0x29, 0x54, 0x48, 0xdd, 0x07, 0xab, 0xee, 0x3f, 0x85, 0x55, 0x3a, 0xb0, + 0x7e, 0xa4, 0xee, 0x3f, 0xcd, 0x3b, 0x7f, 0x66, 0x9e, 0xa0, 0xee, 0x3f, + 0x74, 0x5f, 0xec, 0xe8, 0x75, 0x9f, 0xee, 0x3f, 0x87, 0x01, 0xeb, 0x73, + 0x14, 0xa1, 0xee, 0x3f, 0x13, 0xce, 0x4c, 0x99, 0x89, 0xa5, 0xee, 0x3f, + 0xdb, 0xa0, 0x2a, 0x42, 0xe5, 0xac, 0xee, 0x3f, 0xe5, 0xc5, 0xcd, 0xb0, + 0x37, 0xb7, 0xee, 0x3f, 0x90, 0xf0, 0xa3, 0x82, 0x91, 0xc4, 0xee, 0x3f, + 0x5d, 0x25, 0x3e, 0xb2, 0x03, 0xd5, 0xee, 0x3f, 0xad, 0xd3, 0x5a, 0x99, + 0x9f, 0xe8, 0xee, 0x3f, 0x47, 0x5e, 0xfb, 0xf2, 0x76, 0xff, 0xee, 0x3f, + 0x9c, 0x52, 0x85, 0xdd, 0x9b, 0x19, 0xef, 0x3f, 0x69, 0x90, 0xef, 0xdc, + 0x20, 0x37, 0xef, 0x3f, 0x87, 0xa4, 0xfb, 0xdc, 0x18, 0x58, 0xef, 0x3f, + 0x5f, 0x9b, 0x7b, 0x33, 0x97, 0x7c, 0xef, 0x3f, 0xda, 0x90, 0xa4, 0xa2, + 0xaf, 0xa4, 0xef, 0x3f, 0x40, 0x45, 0x6e, 0x5b, 0x76, 0xd0, 0xef, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x42, 0x94, 0x23, 0x91, 0x4b, + 0xf8, 0x6a, 0xac, 0x3f, 0xf3, 0xc4, 0xfa, 0x50, 0xce, 0xbf, 0xce, 0x3f, + 0xd6, 0x52, 0x0c, 0xff, 0x42, 0x2e, 0xe6, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x43, 0xfe, 0x82, 0x2b, 0x65, 0x47, 0x15, 0x47, 0x40, + 0x94, 0x23, 0x91, 0x4b, 0xf8, 0x6a, 0xbc, 0x3e, 0xf3, 0xc4, 0xfa, 0x50, + 0xce, 0xbf, 0x2e, 0x3f, 0xd6, 0x52, 0x0c, 0xff, 0x42, 0x2e, 0x96, 0x3f, + 0xbe, 0xf3, 0xf8, 0x79, 0xec, 0x61, 0xf6, 0x3f, 0x19, 0x30, 0x96, 0x5b, + 0xc6, 0xfe, 0x2e, 0xc0, 0x3d, 0x88, 0xaf, 0x4a, 0xed, 0x71, 0xf5, 0x3f, + 0xa4, 0xfc, 0xd4, 0x32, 0x68, 0x0b, 0x2b, 0xc0, 0xb0, 0x10, 0xf0, 0xf0, + 0x39, 0x95, 0xf4, 0x3f, 0x7b, 0xb7, 0x1f, 0x0a, 0x8b, 0x41, 0x27, 0xc0, + 0x85, 0x03, 0xb8, 0xb0, 0x95, 0xc9, 0xf3, 0x3f, 0x7b, 0xcf, 0x6d, 0x1a, + 0xe9, 0x9d, 0x23, 0xc0, 0xa5, 0x64, 0x88, 0x0c, 0x19, 0x0d, 0xf3, 0x3f, + 0x31, 0xb6, 0xf2, 0xf3, 0x9b, 0x1d, 0x20, 0xc0, 0xa0, 0x8e, 0x0b, 0x7b, + 0x22, 0x5e, 0xf2, 0x3f, 0xf0, 0x7a, 0x3b, 0x1b, 0x1d, 0x7c, 0x19, 0xc0, + 0x3f, 0x34, 0x1a, 0x4a, 0x4a, 0xbb, 0xf1, 0x3f, 0x9f, 0x3c, 0xaf, 0x93, + 0xe3, 0xf9, 0x12, 0xc0, 0xba, 0xe5, 0x8a, 0xf0, 0x58, 0x23, 0xf1, 0x3f, + 0x5c, 0x8d, 0x78, 0xbf, 0xcb, 0x60, 0x09, 0xc0, 0xa7, 0x00, 0x99, 0x41, + 0x3f, 0x95, 0xf0, 0x3f, 0xce, 0x5f, 0x47, 0xb6, 0x9d, 0x6f, 0xfa, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xac, 0x47, 0x9a, 0xfd, 0x8c, 0x60, 0xee, 0x3f, + 0x3d, 0xf5, 0x24, 0x9f, 0xca, 0x38, 0x03, 0x40, 0xa0, 0x6a, 0x02, 0x1f, + 0xb3, 0xa4, 0xec, 0x3f, 0xba, 0x91, 0x38, 0x54, 0xa9, 0x76, 0x14, 0x40, + 0xe6, 0xfc, 0x6a, 0x57, 0x36, 0x20, 0xeb, 0x3f, 0xd2, 0xe4, 0xc4, 0x4a, + 0x0b, 0x84, 0x1e, 0x40, 0x2d, 0xaa, 0xa1, 0x63, 0xd1, 0xc2, 0xe9, 0x3f, + 0x1c, 0x65, 0xc6, 0xf0, 0x45, 0x06, 0x24, 0x40, 0xed, 0x41, 0x78, 0x03, + 0xe6, 0x86, 0xe8, 0x3f, 0xf8, 0x9f, 0x1b, 0x2c, 0x9c, 0x8e, 0x28, 0x40, + 0x62, 0x48, 0x53, 0xf5, 0xdc, 0x67, 0xe7, 0x3f, 0xcc, 0x7b, 0xb1, 0x4e, + 0xa4, 0xe0, 0x2c, 0x40, 0x0b, 0x6e, 0x49, 0xc9, 0x16, 0x76, 0x22, 0x40, + 0x7a, 0xc6, 0x75, 0xa0, 0x69, 0x19, 0x27, 0xc0, 0xdd, 0xba, 0xa7, 0x6c, + 0x0a, 0xc7, 0x2e, 0x40, 0xc8, 0xf6, 0xbe, 0x48, 0x47, 0x15, 0x37, 0xc0, + 0x2b, 0xb8, 0x2a, 0x65, 0x47, 0x15, 0x47, 0x40, 0x00, 0x38, 0xfa, 0xfe, + 0x42, 0x2e, 0xe6, 0x3f, 0x30, 0x67, 0xc7, 0x93, 0x57, 0xf3, 0x2e, 0x3d, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xbf, 0x5b, 0x30, 0x51, 0x55, + 0x55, 0x55, 0xd5, 0x3f, 0x90, 0x45, 0xeb, 0xff, 0xff, 0xff, 0xcf, 0xbf, + 0x11, 0x01, 0xf1, 0x24, 0xb3, 0x99, 0xc9, 0x3f, 0x9f, 0xc8, 0x06, 0xe5, + 0x75, 0x55, 0xc5, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xbf, + 0x77, 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0x3f, 0xcb, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xbf, 0x0c, 0xdd, 0x95, 0x99, 0x99, 0x99, 0xc9, 0x3f, + 0xa7, 0x45, 0x67, 0x55, 0x55, 0x55, 0xc5, 0xbf, 0x30, 0xde, 0x44, 0xa3, + 0x24, 0x49, 0xc2, 0x3f, 0x65, 0x3d, 0x42, 0xa4, 0xff, 0xff, 0xbf, 0xbf, + 0xca, 0xd6, 0x2a, 0x28, 0x84, 0x71, 0xbc, 0x3f, 0xff, 0x68, 0xb0, 0x43, + 0xeb, 0x99, 0xb9, 0xbf, 0x85, 0xd0, 0xaf, 0xf7, 0x82, 0x81, 0xb7, 0x3f, + 0xcd, 0x45, 0xd1, 0x75, 0x13, 0x52, 0xb5, 0xbf, 0x9f, 0xde, 0xe0, 0xc3, + 0xf0, 0x34, 0xf7, 0x3f, 0x00, 0x90, 0xe6, 0x79, 0x7f, 0xcc, 0xd7, 0xbf, + 0x1f, 0xe9, 0x2c, 0x6a, 0x78, 0x13, 0xf7, 0x3f, 0x00, 0x00, 0x0d, 0xc2, + 0xee, 0x6f, 0xd7, 0xbf, 0xa0, 0xb5, 0xfa, 0x08, 0x60, 0xf2, 0xf6, 0x3f, + 0x00, 0xe0, 0x51, 0x13, 0xe3, 0x13, 0xd7, 0xbf, 0x7d, 0x8c, 0x13, 0x1f, + 0xa6, 0xd1, 0xf6, 0x3f, 0x00, 0x78, 0x28, 0x38, 0x5b, 0xb8, 0xd6, 0xbf, + 0xd1, 0xb4, 0xc5, 0x0b, 0x49, 0xb1, 0xf6, 0x3f, 0x00, 0x78, 0x80, 0x90, + 0x55, 0x5d, 0xd6, 0xbf, 0xba, 0x0c, 0x2f, 0x33, 0x47, 0x91, 0xf6, 0x3f, + 0x00, 0x00, 0x18, 0x76, 0xd0, 0x02, 0xd6, 0xbf, 0x23, 0x42, 0x22, 0x18, + 0x9f, 0x71, 0xf6, 0x3f, 0x00, 0x90, 0x90, 0x86, 0xca, 0xa8, 0xd5, 0xbf, + 0xd9, 0x1e, 0xa5, 0x99, 0x4f, 0x52, 0xf6, 0x3f, 0x00, 0x50, 0x03, 0x56, + 0x43, 0x4f, 0xd5, 0xbf, 0xc4, 0x24, 0x8f, 0xaa, 0x56, 0x33, 0xf6, 0x3f, + 0x00, 0x40, 0x6b, 0xc3, 0x37, 0xf6, 0xd4, 0xbf, 0x14, 0xdc, 0x9d, 0x6b, + 0xb3, 0x14, 0xf6, 0x3f, 0x00, 0x50, 0xa8, 0xfd, 0xa7, 0x9d, 0xd4, 0xbf, + 0x4c, 0x5c, 0xc6, 0x52, 0x64, 0xf6, 0xf5, 0x3f, 0x00, 0xa8, 0x89, 0x39, + 0x92, 0x45, 0xd4, 0xbf, 0x4f, 0x2c, 0x91, 0xb5, 0x67, 0xd8, 0xf5, 0x3f, + 0x00, 0xb8, 0xb0, 0x39, 0xf4, 0xed, 0xd3, 0xbf, 0xde, 0x90, 0x5b, 0xcb, + 0xbc, 0xba, 0xf5, 0x3f, 0x00, 0x70, 0x8f, 0x44, 0xce, 0x96, 0xd3, 0xbf, + 0x78, 0x1a, 0xd9, 0xf2, 0x61, 0x9d, 0xf5, 0x3f, 0x00, 0xa0, 0xbd, 0x17, + 0x1e, 0x40, 0xd3, 0xbf, 0x87, 0x56, 0x46, 0x12, 0x56, 0x80, 0xf5, 0x3f, + 0x00, 0x80, 0x46, 0xef, 0xe2, 0xe9, 0xd2, 0xbf, 0xd3, 0x6b, 0xe7, 0xce, + 0x97, 0x63, 0xf5, 0x3f, 0x00, 0xe0, 0x30, 0x38, 0x1b, 0x94, 0xd2, 0xbf, + 0x93, 0x7f, 0xa7, 0xe2, 0x25, 0x47, 0xf5, 0x3f, 0x00, 0x88, 0xda, 0x8c, + 0xc5, 0x3e, 0xd2, 0xbf, 0x83, 0x45, 0x06, 0x42, 0xff, 0x2a, 0xf5, 0x3f, + 0x00, 0x90, 0x27, 0x29, 0xe1, 0xe9, 0xd1, 0xbf, 0xdf, 0xbd, 0xb2, 0xdb, + 0x22, 0x0f, 0xf5, 0x3f, 0x00, 0xf8, 0x48, 0x2b, 0x6d, 0x95, 0xd1, 0xbf, + 0xd7, 0xde, 0x34, 0x47, 0x8f, 0xf3, 0xf4, 0x3f, 0x00, 0xf8, 0xb9, 0x9a, + 0x67, 0x41, 0xd1, 0xbf, 0x40, 0x28, 0xde, 0xcf, 0x43, 0xd8, 0xf4, 0x3f, + 0x00, 0x98, 0xef, 0x94, 0xd0, 0xed, 0xd0, 0xbf, 0xc8, 0xa3, 0x78, 0xc0, + 0x3e, 0xbd, 0xf4, 0x3f, 0x00, 0x10, 0xdb, 0x18, 0xa5, 0x9a, 0xd0, 0xbf, + 0x8a, 0x25, 0xe0, 0xc3, 0x7f, 0xa2, 0xf4, 0x3f, 0x00, 0xb8, 0x63, 0x52, + 0xe6, 0x47, 0xd0, 0xbf, 0x34, 0x84, 0xd4, 0x24, 0x05, 0x88, 0xf4, 0x3f, + 0x00, 0xf0, 0x86, 0x45, 0x22, 0xeb, 0xcf, 0xbf, 0x0b, 0x2d, 0x19, 0x1b, + 0xce, 0x6d, 0xf4, 0x3f, 0x00, 0xb0, 0x17, 0x75, 0x4a, 0x47, 0xcf, 0xbf, + 0x54, 0x18, 0x39, 0xd3, 0xd9, 0x53, 0xf4, 0x3f, 0x00, 0x30, 0x10, 0x3d, + 0x44, 0xa4, 0xce, 0xbf, 0x5a, 0x84, 0xb4, 0x44, 0x27, 0x3a, 0xf4, 0x3f, + 0x00, 0xb0, 0xe9, 0x44, 0x0d, 0x02, 0xce, 0xbf, 0xfb, 0xf8, 0x15, 0x41, + 0xb5, 0x20, 0xf4, 0x3f, 0x00, 0xf0, 0x77, 0x29, 0xa2, 0x60, 0xcd, 0xbf, + 0xb1, 0xf4, 0x3e, 0xda, 0x82, 0x07, 0xf4, 0x3f, 0x00, 0x90, 0x95, 0x04, + 0x01, 0xc0, 0xcc, 0xbf, 0x8f, 0xfe, 0x57, 0x5d, 0x8f, 0xee, 0xf3, 0x3f, + 0x00, 0x10, 0x89, 0x56, 0x29, 0x20, 0xcc, 0xbf, 0xe9, 0x4c, 0x0b, 0xa0, + 0xd9, 0xd5, 0xf3, 0x3f, 0x00, 0x10, 0x81, 0x8d, 0x17, 0x81, 0xcb, 0xbf, + 0x2b, 0xc1, 0x10, 0xc0, 0x60, 0xbd, 0xf3, 0x3f, 0x00, 0xd0, 0xd3, 0xcc, + 0xc9, 0xe2, 0xca, 0xbf, 0xb8, 0xda, 0x75, 0x2b, 0x24, 0xa5, 0xf3, 0x3f, + 0x00, 0x90, 0x12, 0x2e, 0x40, 0x45, 0xca, 0xbf, 0x02, 0xd0, 0x9f, 0xcd, + 0x22, 0x8d, 0xf3, 0x3f, 0x00, 0xf0, 0x1d, 0x68, 0x77, 0xa8, 0xc9, 0xbf, + 0x1c, 0x7a, 0x84, 0xc5, 0x5b, 0x75, 0xf3, 0x3f, 0x00, 0x30, 0x48, 0x69, + 0x6d, 0x0c, 0xc9, 0xbf, 0xe2, 0x36, 0xad, 0x49, 0xce, 0x5d, 0xf3, 0x3f, + 0x00, 0xc0, 0x45, 0xa6, 0x20, 0x71, 0xc8, 0xbf, 0x40, 0xd4, 0x4d, 0x98, + 0x79, 0x46, 0xf3, 0x3f, 0x00, 0x30, 0x14, 0xb4, 0x8f, 0xd6, 0xc7, 0xbf, + 0x24, 0xcb, 0xff, 0xce, 0x5c, 0x2f, 0xf3, 0x3f, 0x00, 0x70, 0x62, 0x3c, + 0xb8, 0x3c, 0xc7, 0xbf, 0x49, 0x0d, 0xa1, 0x75, 0x77, 0x18, 0xf3, 0x3f, + 0x00, 0x60, 0x37, 0x9b, 0x9a, 0xa3, 0xc6, 0xbf, 0x90, 0x39, 0x3e, 0x37, + 0xc8, 0x01, 0xf3, 0x3f, 0x00, 0xa0, 0xb7, 0x54, 0x31, 0x0b, 0xc6, 0xbf, + 0x41, 0xf8, 0x95, 0xbb, 0x4e, 0xeb, 0xf2, 0x3f, 0x00, 0x30, 0x24, 0x76, + 0x7d, 0x73, 0xc5, 0xbf, 0xd1, 0xa9, 0x19, 0x02, 0x0a, 0xd5, 0xf2, 0x3f, + 0x00, 0x30, 0xc2, 0x8f, 0x7b, 0xdc, 0xc4, 0xbf, 0x2a, 0xfd, 0xb7, 0xa8, + 0xf9, 0xbe, 0xf2, 0x3f, 0x00, 0x00, 0xd2, 0x51, 0x2c, 0x46, 0xc4, 0xbf, + 0xab, 0x1b, 0x0c, 0x7a, 0x1c, 0xa9, 0xf2, 0x3f, 0x00, 0x00, 0x83, 0xbc, + 0x8a, 0xb0, 0xc3, 0xbf, 0x30, 0xb5, 0x14, 0x60, 0x72, 0x93, 0xf2, 0x3f, + 0x00, 0x00, 0x49, 0x6b, 0x99, 0x1b, 0xc3, 0xbf, 0xf5, 0xa1, 0x57, 0x57, + 0xfa, 0x7d, 0xf2, 0x3f, 0x00, 0x40, 0xa4, 0x90, 0x54, 0x87, 0xc2, 0xbf, + 0xbf, 0x3b, 0x1d, 0x9b, 0xb3, 0x68, 0xf2, 0x3f, 0x00, 0xa0, 0x79, 0xf8, + 0xb9, 0xf3, 0xc1, 0xbf, 0xbd, 0xf5, 0x8f, 0x83, 0x9d, 0x53, 0xf2, 0x3f, + 0x00, 0xa0, 0x2c, 0x25, 0xc8, 0x60, 0xc1, 0xbf, 0x3b, 0x08, 0xc9, 0xaa, + 0xb7, 0x3e, 0xf2, 0x3f, 0x00, 0x20, 0xf7, 0x57, 0x7f, 0xce, 0xc0, 0xbf, + 0xb6, 0x40, 0xa9, 0x2b, 0x01, 0x2a, 0xf2, 0x3f, 0x00, 0xa0, 0xfe, 0x49, + 0xdc, 0x3c, 0xc0, 0xbf, 0x32, 0x41, 0xcc, 0x96, 0x79, 0x15, 0xf2, 0x3f, + 0x00, 0x80, 0x4b, 0xbc, 0xbd, 0x57, 0xbf, 0xbf, 0x9b, 0xfc, 0xd2, 0x1d, + 0x20, 0x01, 0xf2, 0x3f, 0x00, 0x40, 0x40, 0x96, 0x08, 0x37, 0xbe, 0xbf, + 0x0b, 0x48, 0x4d, 0x49, 0xf4, 0xec, 0xf1, 0x3f, 0x00, 0x40, 0xf9, 0x3e, + 0x98, 0x17, 0xbd, 0xbf, 0x69, 0x65, 0x8f, 0x52, 0xf5, 0xd8, 0xf1, 0x3f, + 0x00, 0xa0, 0xd8, 0x4e, 0x67, 0xf9, 0xbb, 0xbf, 0x7c, 0x7e, 0x57, 0x11, + 0x23, 0xc5, 0xf1, 0x3f, 0x00, 0x60, 0x2f, 0x20, 0x79, 0xdc, 0xba, 0xbf, + 0xe9, 0x26, 0xcb, 0x74, 0x7c, 0xb1, 0xf1, 0x3f, 0x00, 0x80, 0x28, 0xe7, + 0xc3, 0xc0, 0xb9, 0xbf, 0xb6, 0x1a, 0x2c, 0x0c, 0x01, 0x9e, 0xf1, 0x3f, + 0x00, 0xc0, 0x72, 0xb3, 0x46, 0xa6, 0xb8, 0xbf, 0xbd, 0x70, 0xb6, 0x7b, + 0xb0, 0x8a, 0xf1, 0x3f, 0x00, 0x00, 0xac, 0xb3, 0x01, 0x8d, 0xb7, 0xbf, + 0xb6, 0xbc, 0xef, 0x25, 0x8a, 0x77, 0xf1, 0x3f, 0x00, 0x00, 0x38, 0x45, + 0xf1, 0x74, 0xb6, 0xbf, 0xda, 0x31, 0x4c, 0x35, 0x8d, 0x64, 0xf1, 0x3f, + 0x00, 0x80, 0x87, 0x6d, 0x0e, 0x5e, 0xb5, 0xbf, 0xdd, 0x5f, 0x27, 0x90, + 0xb9, 0x51, 0xf1, 0x3f, 0x00, 0xe0, 0xa1, 0xde, 0x5c, 0x48, 0xb4, 0xbf, + 0x4c, 0xd2, 0x32, 0xa4, 0x0e, 0x3f, 0xf1, 0x3f, 0x00, 0xa0, 0x6a, 0x4d, + 0xd9, 0x33, 0xb3, 0xbf, 0xda, 0xf9, 0x10, 0x72, 0x8b, 0x2c, 0xf1, 0x3f, + 0x00, 0x60, 0xc5, 0xf8, 0x79, 0x20, 0xb2, 0xbf, 0x31, 0xb5, 0xec, 0x28, + 0x30, 0x1a, 0xf1, 0x3f, 0x00, 0x20, 0x62, 0x98, 0x46, 0x0e, 0xb1, 0xbf, + 0xaf, 0x34, 0x84, 0xda, 0xfb, 0x07, 0xf1, 0x3f, 0x00, 0x00, 0xd2, 0x6a, + 0x6c, 0xfa, 0xaf, 0xbf, 0xb3, 0x6b, 0x4e, 0x0f, 0xee, 0xf5, 0xf0, 0x3f, + 0x00, 0x40, 0x77, 0x4a, 0x8d, 0xda, 0xad, 0xbf, 0xce, 0x9f, 0x2a, 0x5d, + 0x06, 0xe4, 0xf0, 0x3f, 0x00, 0x00, 0x85, 0xe4, 0xec, 0xbc, 0xab, 0xbf, + 0x21, 0xa5, 0x2c, 0x63, 0x44, 0xd2, 0xf0, 0x3f, 0x00, 0xc0, 0x12, 0x40, + 0x89, 0xa1, 0xa9, 0xbf, 0x1a, 0x98, 0xe2, 0x7c, 0xa7, 0xc0, 0xf0, 0x3f, + 0x00, 0xc0, 0x02, 0x33, 0x58, 0x88, 0xa7, 0xbf, 0xd1, 0x36, 0xc6, 0x83, + 0x2f, 0xaf, 0xf0, 0x3f, 0x00, 0x80, 0xd6, 0x67, 0x5e, 0x71, 0xa5, 0xbf, + 0x39, 0x13, 0xa0, 0x98, 0xdb, 0x9d, 0xf0, 0x3f, 0x00, 0x80, 0x65, 0x49, + 0x8a, 0x5c, 0xa3, 0xbf, 0xdf, 0xe7, 0x52, 0xaf, 0xab, 0x8c, 0xf0, 0x3f, + 0x00, 0x40, 0x15, 0x64, 0xe3, 0x49, 0xa1, 0xbf, 0xfb, 0x28, 0x4e, 0x2f, + 0x9f, 0x7b, 0xf0, 0x3f, 0x00, 0x80, 0xeb, 0x82, 0xc0, 0x72, 0x9e, 0xbf, + 0x19, 0x8f, 0x35, 0x8c, 0xb5, 0x6a, 0xf0, 0x3f, 0x00, 0x80, 0x52, 0x52, + 0xf1, 0x55, 0x9a, 0xbf, 0x2c, 0xf9, 0xec, 0xa5, 0xee, 0x59, 0xf0, 0x3f, + 0x00, 0x80, 0x81, 0xcf, 0x62, 0x3d, 0x96, 0xbf, 0x90, 0x2c, 0xd1, 0xcd, + 0x49, 0x49, 0xf0, 0x3f, 0x00, 0x00, 0xaa, 0x8c, 0xfb, 0x28, 0x92, 0xbf, + 0xa9, 0xad, 0xf0, 0xc6, 0xc6, 0x38, 0xf0, 0x3f, 0x00, 0x00, 0xf9, 0x20, + 0x7b, 0x31, 0x8c, 0xbf, 0xa9, 0x32, 0x79, 0x13, 0x65, 0x28, 0xf0, 0x3f, + 0x00, 0x00, 0xaa, 0x5d, 0x35, 0x19, 0x84, 0xbf, 0x48, 0x73, 0xea, 0x27, + 0x24, 0x18, 0xf0, 0x3f, 0x00, 0x00, 0xec, 0xc2, 0x03, 0x12, 0x78, 0xbf, + 0x95, 0xb1, 0x14, 0x06, 0x04, 0x08, 0xf0, 0x3f, 0x00, 0x00, 0x24, 0x79, + 0x09, 0x04, 0x60, 0xbf, 0x1a, 0xfa, 0x26, 0xf7, 0x1f, 0xe0, 0xef, 0x3f, + 0x00, 0x00, 0x90, 0x84, 0xf3, 0xef, 0x6f, 0x3f, 0x74, 0xea, 0x61, 0xc2, + 0x1c, 0xa1, 0xef, 0x3f, 0x00, 0x00, 0x3d, 0x35, 0x41, 0xdc, 0x87, 0x3f, + 0x2e, 0x99, 0x81, 0xb0, 0x10, 0x63, 0xef, 0x3f, 0x00, 0x80, 0xc2, 0xc4, + 0xa3, 0xce, 0x93, 0x3f, 0xcd, 0xad, 0xee, 0x3c, 0xf6, 0x25, 0xef, 0x3f, + 0x00, 0x00, 0x89, 0x14, 0xc1, 0x9f, 0x9b, 0x3f, 0xe7, 0x13, 0x91, 0x03, + 0xc8, 0xe9, 0xee, 0x3f, 0x00, 0x00, 0x11, 0xce, 0xd8, 0xb0, 0xa1, 0x3f, + 0xab, 0xb1, 0xcb, 0x78, 0x80, 0xae, 0xee, 0x3f, 0x00, 0xc0, 0x01, 0xd0, + 0x5b, 0x8a, 0xa5, 0x3f, 0x9b, 0x0c, 0x9d, 0xa2, 0x1a, 0x74, 0xee, 0x3f, + 0x00, 0x80, 0xd8, 0x40, 0x83, 0x5c, 0xa9, 0x3f, 0xb5, 0x99, 0x0a, 0x83, + 0x91, 0x3a, 0xee, 0x3f, 0x00, 0x80, 0x57, 0xef, 0x6a, 0x27, 0xad, 0x3f, + 0x56, 0x9a, 0x60, 0x09, 0xe0, 0x01, 0xee, 0x3f, 0x00, 0xc0, 0x98, 0xe5, + 0x98, 0x75, 0xb0, 0x3f, 0x98, 0xbb, 0x77, 0xe5, 0x01, 0xca, 0xed, 0x3f, + 0x00, 0x20, 0x0d, 0xe3, 0xf5, 0x53, 0xb2, 0x3f, 0x03, 0x91, 0x7c, 0x0b, + 0xf2, 0x92, 0xed, 0x3f, 0x00, 0x00, 0x38, 0x8b, 0xdd, 0x2e, 0xb4, 0x3f, + 0xce, 0x5c, 0xfb, 0x66, 0xac, 0x5c, 0xed, 0x3f, 0x00, 0xc0, 0x57, 0x87, + 0x59, 0x06, 0xb6, 0x3f, 0x9d, 0xde, 0x5e, 0xaa, 0x2c, 0x27, 0xed, 0x3f, + 0x00, 0x00, 0x6a, 0x35, 0x76, 0xda, 0xb7, 0x3f, 0xcd, 0x2c, 0x6b, 0x3e, + 0x6e, 0xf2, 0xec, 0x3f, 0x00, 0x60, 0x1c, 0x4e, 0x43, 0xab, 0xb9, 0x3f, + 0x02, 0x79, 0xa7, 0xa2, 0x6d, 0xbe, 0xec, 0x3f, 0x00, 0x60, 0x0d, 0xbb, + 0xc7, 0x78, 0xbb, 0x3f, 0x6d, 0x08, 0x37, 0x6d, 0x26, 0x8b, 0xec, 0x3f, + 0x00, 0x20, 0xe7, 0x32, 0x13, 0x43, 0xbd, 0x3f, 0x04, 0x58, 0x5d, 0xbd, + 0x94, 0x58, 0xec, 0x3f, 0x00, 0x60, 0xde, 0x71, 0x31, 0x0a, 0xbf, 0x3f, + 0x8c, 0x9f, 0xbb, 0x33, 0xb5, 0x26, 0xec, 0x3f, 0x00, 0x40, 0x91, 0x2b, + 0x15, 0x67, 0xc0, 0x3f, 0x3f, 0xe7, 0xec, 0xee, 0x83, 0xf5, 0xeb, 0x3f, + 0x00, 0xb0, 0x92, 0x82, 0x85, 0x47, 0xc1, 0x3f, 0xc1, 0x96, 0xdb, 0x75, + 0xfd, 0xc4, 0xeb, 0x3f, 0x00, 0x30, 0xca, 0xcd, 0x6e, 0x26, 0xc2, 0x3f, + 0x28, 0x4a, 0x86, 0x0c, 0x1e, 0x95, 0xeb, 0x3f, 0x00, 0x50, 0xc5, 0xa6, + 0xd7, 0x03, 0xc3, 0x3f, 0x2c, 0x3e, 0xef, 0xc5, 0xe2, 0x65, 0xeb, 0x3f, + 0x00, 0x10, 0x33, 0x3c, 0xc3, 0xdf, 0xc3, 0x3f, 0x8b, 0x88, 0xc9, 0x67, + 0x48, 0x37, 0xeb, 0x3f, 0x00, 0x80, 0x7a, 0x6b, 0x36, 0xba, 0xc4, 0x3f, + 0x4a, 0x30, 0x1d, 0x21, 0x4b, 0x09, 0xeb, 0x3f, 0x00, 0xf0, 0xd1, 0x28, + 0x39, 0x93, 0xc5, 0x3f, 0x7e, 0xef, 0xf2, 0x85, 0xe8, 0xdb, 0xea, 0x3f, + 0x00, 0xf0, 0x18, 0x24, 0xcd, 0x6a, 0xc6, 0x3f, 0xa2, 0x3d, 0x60, 0x31, + 0x1d, 0xaf, 0xea, 0x3f, 0x00, 0x90, 0x66, 0xec, 0xf8, 0x40, 0xc7, 0x3f, + 0xa7, 0x58, 0xd3, 0x3f, 0xe6, 0x82, 0xea, 0x3f, 0x00, 0xf0, 0x1a, 0xf5, + 0xc0, 0x15, 0xc8, 0x3f, 0x8b, 0x73, 0x09, 0xef, 0x40, 0x57, 0xea, 0x3f, + 0x00, 0x80, 0xf6, 0x54, 0x29, 0xe9, 0xc8, 0x3f, 0x27, 0x4b, 0xab, 0x90, + 0x2a, 0x2c, 0xea, 0x3f, 0x00, 0x40, 0xf8, 0x02, 0x36, 0xbb, 0xc9, 0x3f, + 0xd1, 0xf2, 0x93, 0x13, 0xa0, 0x01, 0xea, 0x3f, 0x00, 0x00, 0x2c, 0x1c, + 0xed, 0x8b, 0xca, 0x3f, 0x1b, 0x3c, 0xdb, 0x24, 0x9f, 0xd7, 0xe9, 0x3f, + 0x00, 0xd0, 0x01, 0x5c, 0x51, 0x5b, 0xcb, 0x3f, 0x90, 0xb1, 0xc7, 0x05, + 0x25, 0xae, 0xe9, 0x3f, 0x00, 0xc0, 0xbc, 0xcc, 0x67, 0x29, 0xcc, 0x3f, + 0x2f, 0xce, 0x97, 0xf2, 0x2e, 0x85, 0xe9, 0x3f, 0x00, 0x60, 0x48, 0xd5, + 0x35, 0xf6, 0xcc, 0x3f, 0x75, 0x4b, 0xa4, 0xee, 0xba, 0x5c, 0xe9, 0x3f, + 0x00, 0xc0, 0x46, 0x34, 0xbd, 0xc1, 0xcd, 0x3f, 0x38, 0x48, 0xe7, 0x9d, + 0xc6, 0x34, 0xe9, 0x3f, 0x00, 0xe0, 0xcf, 0xb8, 0x01, 0x8c, 0xce, 0x3f, + 0xe6, 0x52, 0x67, 0x2f, 0x4f, 0x0d, 0xe9, 0x3f, 0x00, 0x90, 0x17, 0xc0, + 0x09, 0x55, 0xcf, 0x3f, 0x9d, 0xd7, 0xff, 0x8e, 0x52, 0xe6, 0xe8, 0x3f, + 0x00, 0xb8, 0x1f, 0x12, 0x6c, 0x0e, 0xd0, 0x3f, 0x7c, 0x00, 0xcc, 0x9f, + 0xce, 0xbf, 0xe8, 0x3f, 0x00, 0xd0, 0x93, 0x0e, 0xb8, 0x71, 0xd0, 0x3f, + 0x0e, 0xc3, 0xbe, 0xda, 0xc0, 0x99, 0xe8, 0x3f, 0x00, 0x70, 0x86, 0x9e, + 0x6b, 0xd4, 0xd0, 0x3f, 0xfb, 0x17, 0x23, 0xaa, 0x27, 0x74, 0xe8, 0x3f, + 0x00, 0xd0, 0x4b, 0x33, 0x87, 0x36, 0xd1, 0x3f, 0x08, 0x9a, 0xb3, 0xac, + 0x00, 0x4f, 0xe8, 0x3f, 0x00, 0x48, 0x23, 0x67, 0x0d, 0x98, 0xd1, 0x3f, + 0x55, 0x3e, 0x65, 0xe8, 0x49, 0x2a, 0xe8, 0x3f, 0x00, 0x80, 0xcc, 0xe0, + 0xff, 0xf8, 0xd1, 0x3f, 0x60, 0x02, 0xf4, 0x95, 0x01, 0x06, 0xe8, 0x3f, + 0x00, 0x68, 0x63, 0xd7, 0x5f, 0x59, 0xd2, 0x3f, 0x29, 0xa3, 0xe0, 0x63, + 0x25, 0xe2, 0xe7, 0x3f, 0x00, 0xa8, 0x14, 0x09, 0x30, 0xb9, 0xd2, 0x3f, + 0xad, 0xb5, 0xdc, 0x77, 0xb3, 0xbe, 0xe7, 0x3f, 0x00, 0x60, 0x43, 0x10, + 0x72, 0x18, 0xd3, 0x3f, 0xc2, 0x25, 0x97, 0x67, 0xaa, 0x9b, 0xe7, 0x3f, + 0x00, 0x18, 0xec, 0x6d, 0x26, 0x77, 0xd3, 0x3f, 0x57, 0x06, 0x17, 0xf2, + 0x07, 0x79, 0xe7, 0x3f, 0x00, 0x30, 0xaf, 0xfb, 0x4f, 0xd5, 0xd3, 0x3f, + 0x0c, 0x13, 0xd6, 0xdb, 0xca, 0x56, 0xe7, 0x3f, 0x00, 0xe0, 0x2f, 0xe3, + 0xee, 0x32, 0xd4, 0x3f, 0xbe, 0xf3, 0xf8, 0x79, 0xec, 0x61, 0xf6, 0x3f, + 0xde, 0xaa, 0x8c, 0x80, 0xf7, 0x7b, 0xd5, 0xbf, 0x3d, 0x88, 0xaf, 0x4a, + 0xed, 0x71, 0xf5, 0x3f, 0xdb, 0x6d, 0xc0, 0xa7, 0xf0, 0xbe, 0xd2, 0xbf, + 0xb0, 0x10, 0xf0, 0xf0, 0x39, 0x95, 0xf4, 0x3f, 0x67, 0x3a, 0x51, 0x7f, + 0xae, 0x1e, 0xd0, 0xbf, 0x85, 0x03, 0xb8, 0xb0, 0x95, 0xc9, 0xf3, 0x3f, + 0xe9, 0x24, 0x82, 0xa6, 0xd8, 0x31, 0xcb, 0xbf, 0xa5, 0x64, 0x88, 0x0c, + 0x19, 0x0d, 0xf3, 0x3f, 0x58, 0x77, 0xc0, 0x0a, 0x4f, 0x57, 0xc6, 0xbf, + 0xa0, 0x8e, 0x0b, 0x7b, 0x22, 0x5e, 0xf2, 0x3f, 0x00, 0x81, 0x9c, 0xc7, + 0x2b, 0xaa, 0xc1, 0xbf, 0x3f, 0x34, 0x1a, 0x4a, 0x4a, 0xbb, 0xf1, 0x3f, + 0x5e, 0x0e, 0x8c, 0xce, 0x76, 0x4e, 0xba, 0xbf, 0xba, 0xe5, 0x8a, 0xf0, + 0x58, 0x23, 0xf1, 0x3f, 0xcc, 0x1c, 0x61, 0x5a, 0x3c, 0x97, 0xb1, 0xbf, + 0xa7, 0x00, 0x99, 0x41, 0x3f, 0x95, 0xf0, 0x3f, 0x1e, 0x0c, 0xe1, 0x38, + 0xf4, 0x52, 0xa2, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x47, 0x9a, 0xfd, + 0x8c, 0x60, 0xee, 0x3f, 0x84, 0x59, 0xf2, 0x5d, 0xaa, 0xa5, 0xaa, 0x3f, + 0xa0, 0x6a, 0x02, 0x1f, 0xb3, 0xa4, 0xec, 0x3f, 0xb4, 0x2e, 0x36, 0xaa, + 0x53, 0x5e, 0xbc, 0x3f, 0xe6, 0xfc, 0x6a, 0x57, 0x36, 0x20, 0xeb, 0x3f, + 0x08, 0xdb, 0x20, 0x77, 0xe5, 0x26, 0xc5, 0x3f, 0x2d, 0xaa, 0xa1, 0x63, + 0xd1, 0xc2, 0xe9, 0x3f, 0x70, 0x47, 0x22, 0x0d, 0x86, 0xc2, 0xcb, 0x3f, + 0xed, 0x41, 0x78, 0x03, 0xe6, 0x86, 0xe8, 0x3f, 0xe1, 0x7e, 0xa0, 0xc8, + 0x8b, 0x05, 0xd1, 0x3f, 0x62, 0x48, 0x53, 0xf5, 0xdc, 0x67, 0xe7, 0x3f, + 0x09, 0xee, 0xb6, 0x57, 0x30, 0x04, 0xd4, 0x3f, 0xef, 0x39, 0xfa, 0xfe, + 0x42, 0x2e, 0xe6, 0x3f, 0x34, 0x83, 0xb8, 0x48, 0xa3, 0x0e, 0xd0, 0xbf, + 0x6a, 0x0b, 0xe0, 0x0b, 0x5b, 0x57, 0xd5, 0x3f, 0x23, 0x41, 0x0a, 0xf2, + 0xfe, 0xff, 0xdf, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0e, 0x06, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x0a, 0xe8, 0x03, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x4d, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7f, 0x30, 0x4d, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x07, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x8f, 0x60, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x9f, 0x8f, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x90, 0x9f, 0x60, 0x00, 0x00, 0x00, 0x00, 0xff, 0x9f, 0x9f, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xaf, 0x60, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x9f, 0xaf, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xbf, 0x60, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x9f, 0xbf, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x90, 0xcf, 0x60, 0x00, 0x00, 0x00, 0x00, 0xff, 0x9f, 0xcf, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xdf, 0x60, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x9f, 0xdf, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xef, 0x60, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x9f, 0xef, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x90, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0xff, 0x9f, 0xff, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x5e, 0x01, 0x00, 0x00, 0x30, 0x75, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x78, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x50, 0x78, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x68, 0x78, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x78, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x98, 0x78, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb8, 0x78, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd8, 0x78, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x78, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x79, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x79, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x79, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x79, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x79, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x79, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa8, 0x79, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc8, 0x79, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe8, 0x79, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x7a, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x7c, 0x04, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x36, 0x61, 0x32, 0x35, + 0x62, 0x38, 0x61, 0x33, 0x31, 0x39, 0x38, 0x32, 0x39, 0x36, 0x61, 0x64, + 0x34, 0x34, 0x34, 0x62, 0x36, 0x35, 0x38, 0x35, 0x34, 0x37, 0x34, 0x61, + 0x36, 0x38, 0x30, 0x62, 0x33, 0x31, 0x64, 0x31, 0x66, 0x62, 0x61, 0x61, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x45, 0x41, 0x44, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, + 0xad, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x86, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x86, 0x04, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x86, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xf8, 0x86, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x87, 0x04, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc8, 0x81, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x45, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, + 0x54, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, + 0x1d, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x57, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, + 0x4a, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, + 0x13, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x4d, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, + 0x16, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, + 0x5e, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, + 0x27, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x61, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x70, 0xe2, 0x01, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xe7, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xd4, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xe5, 0x01, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe5, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xe2, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x61, 0x70, 0x61, + 0x62, 0x6f, 0x72, 0x74, 0x30, 0x00, 0x43, 0x61, 0x70, 0x61, 0x62, 0x6f, + 0x72, 0x74, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, + 0x99, 0x00, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, + 0xad, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, + 0x9a, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, + 0xaf, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0xd0, 0x91, 0x04, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xe8, 0x91, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x94, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xab, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd0, 0xea, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0xeb, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xeb, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa8, 0xeb, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0xeb, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0xec, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xec, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc8, 0xec, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xed, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x58, 0xed, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0xed, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x37, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x36, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x37, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x37, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x36, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x37, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0xb0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x37, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xb0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x36, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x37, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0xb0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x36, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x37, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xb0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x37, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x30, 0xb0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x36, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x37, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xb0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x36, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x37, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xb0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x72, 0x01, 0x00, 0x00, 0x72, 0x01, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x72, 0x01, 0x00, 0x00, 0x72, 0x01, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x4b, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x90, 0x4b, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x4b, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xd0, 0x4b, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x7a, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x55, 0x61, 0x72, 0x74, 0x30, 0x20, 0x54, 0x78, 0x20, 0x53, 0x65, 0x6d, + 0x00, 0x00, 0x00, 0x00, 0x55, 0x61, 0x72, 0x74, 0x31, 0x20, 0x54, 0x78, + 0x20, 0x53, 0x65, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xb7, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xb7, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x12, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xb7, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x13, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb7, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x14, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb7, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x15, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xb7, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x16, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xb7, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x17, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0xc8, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xc8, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xc8, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xc8, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xc8, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc8, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xc8, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc9, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0xc9, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xc9, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x0a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc9, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x0b, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xc9, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xc9, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x0d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc9, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0xc9, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xca, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xb8, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xb8, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xb8, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb8, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb8, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xb8, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xb8, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0xb9, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xc9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xb9, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb9, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb9, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb9, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xcd, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xb9, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xb9, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0xba, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xba, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xba, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xd3, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xba, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xba, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xd5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xba, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0xba, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbb, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xbb, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xd9, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xbb, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xbb, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xbb, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbb, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xbb, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xbb, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0xbc, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbc, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xbc, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xbc, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbc, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xe5, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xbc, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xbc, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbd, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0xbd, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xbd, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xbd, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xeb, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xbd, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xbd, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xbd, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0xbd, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbe, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xbe, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xbe, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xbe, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xbe, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbe, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xbe, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xbe, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xf7, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0xbf, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbf, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xbf, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xbf, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xbf, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xbf, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xbf, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0xc0, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xc0, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc0, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xc0, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0xc0, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc1, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xc1, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xc1, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xc1, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc1, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0xc1, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xc1, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xc1, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0xc2, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xc2, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xc2, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xc2, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xc2, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc2, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xc2, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0xc3, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xc3, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc3, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xc3, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xc3, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x9d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc3, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0xc3, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc4, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xc4, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xc4, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xc4, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc4, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0xc4, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xc4, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xa6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xc4, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0xc5, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xc5, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xc5, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xc5, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xc5, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc5, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xc5, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0xc6, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xc6, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xb2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc6, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xb3, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xc6, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xc6, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc6, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0xc6, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc7, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xc7, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xc7, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xc7, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc7, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0xc7, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xc7, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xc7, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x4d, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x4d, 0x00, 0x00, 0x00, 0x00, + 0x51, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xf0, 0xd2, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x20, 0xd3, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xa4, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0xd3, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x20, 0xd3, 0x02, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xa4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x10, 0xd3, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x20, 0xd3, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x06, 0x06, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xa0, 0x0f, 0x00, 0x00, + 0x88, 0x13, 0x00, 0x00, 0x84, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0xc5, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xd8, 0xc2, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x58, 0xd1, 0x08, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xc6, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x20, 0xc3, 0x08, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xc8, 0xd1, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0xc8, 0x08, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x68, 0xc3, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x38, 0xd2, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb0, 0xc9, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0xc3, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xa8, 0xd2, 0x08, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0xcb, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xc3, 0x08, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x18, 0xd3, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xcc, 0x08, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xc4, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x88, 0xd3, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x48, 0xce, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x88, 0xc4, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xd3, 0x08, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xd0, 0xcf, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xc4, 0x08, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x68, 0xd4, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0xb3, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xd8, 0xb0, 0x08, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x58, 0xbf, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0x08, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x20, 0xb1, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0xc8, 0xbf, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0xb6, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x68, 0xb1, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xc0, 0x08, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0xb7, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xb1, 0x08, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xa8, 0xc0, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xb9, 0x08, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xf8, 0xb1, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x18, 0xc1, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xba, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xb2, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x88, 0xc1, 0x08, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0xbc, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x88, 0xb2, 0x08, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xf8, 0xc1, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xbd, 0x08, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xd0, 0xb2, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x68, 0xc2, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x64, 0x00, + 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf1, + 0x08, 0xee, 0x0a, 0x00, 0x01, 0x00, 0xad, 0x00, 0xc8, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0xf0, 0xf1, 0x08, 0xee, 0x0a, 0x00, 0x01, 0x00, 0xad, 0x00, + 0xc8, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xf0, 0xf1, 0x08, 0xee, 0x0a, 0x00, + 0x01, 0x00, 0xad, 0x00, 0xc8, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x03, 0x00, + 0x0c, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x0f, 0x00, 0x0a, 0x00, + 0x01, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe8, 0x43, 0x05, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x0e, 0x06, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x13, 0x06, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x14, 0x06, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x15, 0x06, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x33, 0xcd, 0xab, 0x34, 0x12, 0x6d, 0xe6, 0xec, 0xde, 0x05, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 +}; +unsigned int ADRV9040_DFE_CALS_FW_bin_len = 398800; + +#endif + diff --git a/projects/adrv904x/src/common/firmware/ADRV9040_FW.h b/projects/adrv904x/src/common/firmware/ADRV9040_FW.h new file mode 100644 index 00000000000..ee27b26fe32 --- /dev/null +++ b/projects/adrv904x/src/common/firmware/ADRV9040_FW.h @@ -0,0 +1,54662 @@ +/***************************************************************************//** + * @file ADRV9040_FW.h + * @brief Koror firmware binary. + * @author George Mois (george.mois@analog.com) +******************************************************************************** + * Copyright 2023(c) Analog Devices, Inc. + * + * 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 Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights + * of one or more patent holders. This license does not release you + * from the requirement that you obtain separate licenses from these + * patent holders to use this software. + * - Use of the software either in source or binary form, must be run + * on or directly connected to an Analog Devices Inc. component. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, 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 ADRV9040_FW_H +#define ADRV9040_FW_H + +unsigned char ADRV9040_FW_bin[] = { + 0x01, 0x00, 0x10, 0xad, 0x01, 0x00, 0x00, 0x00, 0x40, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x04, 0x20, 0x6d, 0x02, 0x00, 0x01, 0x2d, 0xbd, 0x02, 0x01, + 0x2d, 0xbd, 0x02, 0x01, 0x2d, 0xbd, 0x02, 0x01, 0x2d, 0xbd, 0x02, 0x01, + 0x2d, 0xbd, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x41, 0x03, 0x01, + 0xc5, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xcd, 0x40, 0x03, 0x01, + 0x3d, 0xe6, 0x02, 0x01, 0x89, 0x8f, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0x9b, 0x8f, 0x04, 0x01, 0x6f, 0xaa, 0x01, 0x01, 0x83, 0xaa, 0x01, 0x01, + 0x9d, 0xaa, 0x01, 0x01, 0xb1, 0xaa, 0x01, 0x01, 0xc5, 0xaa, 0x01, 0x01, + 0xd9, 0xaa, 0x01, 0x01, 0xeb, 0xaa, 0x01, 0x01, 0xfd, 0xaa, 0x01, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xdf, 0x95, 0x01, 0x01, 0xe3, 0x95, 0x01, 0x01, + 0xe7, 0x95, 0x01, 0x01, 0xeb, 0x95, 0x01, 0x01, 0xef, 0x95, 0x01, 0x01, + 0xf3, 0x95, 0x01, 0x01, 0xf7, 0x95, 0x01, 0x01, 0xfb, 0x95, 0x01, 0x01, + 0xff, 0x95, 0x01, 0x01, 0x03, 0x96, 0x01, 0x01, 0x07, 0x96, 0x01, 0x01, + 0x0b, 0x96, 0x01, 0x01, 0x0f, 0x96, 0x01, 0x01, 0x13, 0x96, 0x01, 0x01, + 0x17, 0x96, 0x01, 0x01, 0x1b, 0x96, 0x01, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0x9b, 0x6e, 0x01, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0x01, 0x6f, 0x01, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xa7, 0x15, 0x03, 0x01, 0x25, 0x19, 0x03, 0x01, + 0x29, 0x19, 0x03, 0x01, 0x2d, 0x19, 0x03, 0x01, 0x31, 0x19, 0x03, 0x01, + 0x35, 0x19, 0x03, 0x01, 0x39, 0x19, 0x03, 0x01, 0x3d, 0x19, 0x03, 0x01, + 0x41, 0x19, 0x03, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0x2d, 0x99, 0x01, 0x01, + 0x3f, 0x99, 0x01, 0x01, 0x55, 0x99, 0x01, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0x65, 0x1c, 0x00, 0x01, 0x69, 0x1c, 0x00, 0x01, 0xa9, 0x89, 0x03, 0x01, + 0xad, 0x89, 0x03, 0x01, 0xb1, 0x89, 0x03, 0x01, 0xb5, 0x89, 0x03, 0x01, + 0xc1, 0xe4, 0x02, 0x01, 0xe5, 0xe4, 0x02, 0x01, 0xf5, 0x04, 0x00, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0xe9, 0x1c, 0x00, 0x01, + 0xed, 0x1c, 0x00, 0x01, 0xf1, 0x1c, 0x00, 0x01, 0xf5, 0x1c, 0x00, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0x0f, 0xab, 0x01, 0x01, 0x45, 0xab, 0x01, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0x21, 0xab, 0x01, 0x01, + 0x57, 0xab, 0x01, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0x33, 0xab, 0x01, 0x01, 0x69, 0xab, 0x01, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xcd, 0xca, 0x03, 0x01, 0xef, 0xca, 0x03, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x9d, 0x04, 0x01, + 0xb1, 0x9d, 0x04, 0x01, 0xb1, 0x8f, 0x04, 0x01, 0x80, 0xb5, 0x0d, 0xf0, + 0x01, 0xff, 0x0e, 0xf0, 0xf4, 0xf8, 0x2c, 0xf0, 0xeb, 0xfb, 0x2c, 0xf0, + 0xf3, 0xfb, 0x0e, 0x48, 0x41, 0x68, 0x00, 0x68, 0x81, 0x42, 0x10, 0xd1, + 0x0c, 0x48, 0x0d, 0x49, 0x01, 0x60, 0xc2, 0x69, 0x42, 0xf4, 0xe0, 0x22, + 0xc2, 0x61, 0xaf, 0xf3, 0x00, 0x80, 0x49, 0xf0, 0x5f, 0xf8, 0x31, 0xf0, + 0xd4, 0xf9, 0xbd, 0xe8, 0x01, 0x40, 0x49, 0xf0, 0x4f, 0xbb, 0x0d, 0xf0, + 0xea, 0xfe, 0x04, 0x21, 0x1c, 0xf0, 0x55, 0xfb, 0x30, 0xbf, 0xfd, 0xe7, + 0xd0, 0x65, 0x03, 0x20, 0x08, 0xed, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x01, + 0xfe, 0xe7, 0x00, 0x00, 0x62, 0xf3, 0x0f, 0x22, 0x62, 0xf3, 0x1f, 0x42, + 0x00, 0xb5, 0x00, 0xbf, 0x13, 0x00, 0x96, 0x46, 0x94, 0x46, 0x10, 0x39, + 0x28, 0xbf, 0xa0, 0xe8, 0x0c, 0x50, 0xfa, 0xd8, 0x5f, 0xea, 0x41, 0x7c, + 0x28, 0xbf, 0x0c, 0xc0, 0x48, 0xbf, 0x40, 0xf8, 0x04, 0x2b, 0xc9, 0x07, + 0x28, 0xbf, 0x20, 0xf8, 0x02, 0x2b, 0x48, 0xbf, 0x00, 0xf8, 0x01, 0x2b, + 0x00, 0xbd, 0x01, 0x20, 0x38, 0xf0, 0x90, 0xbb, 0xdf, 0xf8, 0x00, 0xf0, + 0x13, 0x28, 0x00, 0x02, 0xdf, 0xf8, 0x00, 0xf0, 0x9b, 0x28, 0x00, 0x02, + 0x20, 0x30, 0x01, 0x75, 0x42, 0x75, 0x00, 0x68, 0xff, 0xf7, 0xf2, 0xbf, + 0x10, 0xb5, 0x00, 0xf1, 0x20, 0x04, 0x20, 0x68, 0xff, 0xf7, 0xf0, 0xff, + 0xa0, 0x75, 0x10, 0xbd, 0x49, 0xf0, 0x18, 0xbb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0xf4, 0x40, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x4e, 0x03, 0x20, + 0x02, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x61, 0x32, 0x35, + 0x62, 0x38, 0x61, 0x33, 0x31, 0x39, 0x38, 0x32, 0x39, 0x36, 0x61, 0x64, + 0x34, 0x34, 0x34, 0x62, 0x36, 0x35, 0x38, 0x35, 0x34, 0x37, 0x34, 0x61, + 0x36, 0x38, 0x30, 0x62, 0x33, 0x31, 0x64, 0x31, 0x66, 0x62, 0x61, 0x61, + 0x00, 0x48, 0x45, 0x41, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xd0, 0x65, 0x03, 0x20, 0x70, 0x52, 0x03, 0x20, 0xbc, 0x67, 0x03, 0x20, + 0x80, 0x4e, 0x03, 0x20, 0x4c, 0x74, 0x02, 0x20, 0x6c, 0x74, 0x02, 0x20, + 0x8c, 0x74, 0x02, 0x20, 0xac, 0x74, 0x02, 0x20, 0xcc, 0x74, 0x02, 0x20, + 0xfc, 0x8a, 0x00, 0x20, 0x8c, 0x77, 0x02, 0x20, 0x98, 0x33, 0x02, 0x20, + 0x6c, 0x70, 0x04, 0x01, 0x08, 0x44, 0x00, 0x20, 0x8c, 0x76, 0x02, 0x20, + 0x5c, 0x71, 0x02, 0x20, 0xc0, 0x77, 0x02, 0x20, 0xec, 0x28, 0x02, 0x20, + 0x94, 0x8b, 0x04, 0x01, 0x68, 0x66, 0x02, 0x20, 0xfc, 0x64, 0x03, 0x20, + 0x20, 0x4f, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x98, 0x1c, 0x03, 0x20, + 0xe4, 0x3e, 0x00, 0x20, 0x3c, 0x3e, 0x00, 0x20, 0x78, 0x49, 0x03, 0x20, + 0x24, 0x3e, 0x00, 0x20, 0xc4, 0x3d, 0x00, 0x20, 0x48, 0x40, 0x03, 0x20, + 0x00, 0x40, 0x00, 0x20, 0xc4, 0x3d, 0x00, 0x20, 0xec, 0x74, 0x02, 0x20, + 0x04, 0x41, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0xff, 0xff, + 0x0c, 0x75, 0x02, 0x20, 0x14, 0x77, 0x02, 0x20, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xea, 0x03, 0x20, 0x1c, 0x77, 0x02, 0x20, 0x10, 0xb5, 0x04, 0x46, + 0x10, 0x46, 0x0a, 0x46, 0x01, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x1c, 0xfd, + 0x20, 0x46, 0x10, 0xbd, 0x01, 0x46, 0x6f, 0xf0, 0x7f, 0x03, 0x99, 0x42, + 0x08, 0xbf, 0x7f, 0x20, 0x03, 0xd0, 0x00, 0x29, 0x44, 0xbf, 0x49, 0x42, + 0x08, 0x46, 0xc0, 0xb2, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0xf0, 0xee, + 0xc0, 0x0a, 0x9f, 0xed, 0xb4, 0x1a, 0xf4, 0xee, 0x41, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x2d, 0xed, 0x02, 0x8b, 0x48, 0xbf, 0xb7, 0xee, 0x00, 0x0a, + 0x09, 0xd4, 0xdf, 0xed, 0xb3, 0x0a, 0x20, 0xee, 0x20, 0x8a, 0xb0, 0xee, + 0x48, 0x0a, 0x00, 0xf0, 0xed, 0xfd, 0x80, 0xee, 0x08, 0x0a, 0xbd, 0xec, + 0x02, 0x8b, 0x01, 0xbd, 0xf8, 0xb5, 0x0d, 0x46, 0x04, 0x46, 0x16, 0x46, + 0x1f, 0x46, 0x01, 0x21, 0x0c, 0xf0, 0x1b, 0xff, 0x01, 0x21, 0x20, 0x46, + 0x0c, 0xf0, 0xc5, 0xfd, 0x2a, 0x46, 0x31, 0x46, 0x20, 0x46, 0x0c, 0xf0, + 0xc2, 0xfd, 0x20, 0x46, 0x0c, 0xf0, 0xca, 0xfd, 0x01, 0x2f, 0x20, 0x46, + 0x02, 0xd1, 0x0c, 0xf0, 0xe2, 0xfd, 0x01, 0xe0, 0x0c, 0xf0, 0xd0, 0xfd, + 0x20, 0x46, 0x0c, 0xf0, 0xeb, 0xfd, 0x05, 0x46, 0x00, 0x21, 0x20, 0x46, + 0x0c, 0xf0, 0xad, 0xfd, 0x00, 0x21, 0x20, 0x46, 0x0c, 0xf0, 0xfb, 0xfe, + 0x28, 0x46, 0xf2, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, 0x2d, 0xed, 0x02, 0x8b, + 0x04, 0x46, 0x9d, 0xf9, 0x28, 0x80, 0x0d, 0x46, 0x16, 0x46, 0x99, 0x46, + 0x9f, 0xed, 0xa0, 0x8a, 0x00, 0x27, 0x0f, 0xe0, 0x4b, 0x46, 0x32, 0x46, + 0x29, 0x46, 0x20, 0x46, 0xff, 0xf7, 0xc2, 0xff, 0x00, 0xee, 0x10, 0x0a, + 0xb8, 0xee, 0x40, 0x0a, 0x30, 0xee, 0x08, 0x8a, 0x20, 0x46, 0x0c, 0xf0, + 0xd8, 0xfe, 0x7f, 0x1c, 0x78, 0xb2, 0x40, 0x45, 0xec, 0xdb, 0x00, 0xee, + 0x10, 0x8a, 0xb8, 0xee, 0xc0, 0x0a, 0x88, 0xee, 0x00, 0x0a, 0xf6, 0xee, + 0x00, 0x0a, 0x00, 0xf0, 0x98, 0xf9, 0xbd, 0xec, 0x02, 0x8b, 0x80, 0xb2, + 0xbd, 0xe8, 0xf2, 0x83, 0xdf, 0xf8, 0x38, 0x24, 0x51, 0x60, 0x10, 0x60, + 0x70, 0x47, 0xdf, 0xf8, 0x34, 0x24, 0x07, 0xe0, 0xdf, 0xf8, 0x30, 0x34, + 0x18, 0x60, 0x59, 0x60, 0x9a, 0x60, 0x70, 0x47, 0xdf, 0xf8, 0x28, 0x24, + 0x10, 0x60, 0x51, 0x60, 0x70, 0x47, 0xdf, 0xf8, 0x14, 0x14, 0x49, 0x68, + 0x00, 0x29, 0x18, 0xbf, 0x08, 0x47, 0x70, 0x47, 0xdf, 0xf8, 0x04, 0x14, + 0x09, 0x68, 0x00, 0x29, 0x18, 0xbf, 0x08, 0x47, 0x70, 0x47, 0xdf, 0xf8, + 0xfc, 0x23, 0x11, 0x68, 0x00, 0x20, 0x00, 0x29, 0x1c, 0xbf, 0x52, 0x68, + 0x00, 0x2a, 0x03, 0xd0, 0x12, 0x78, 0x00, 0x2a, 0x18, 0xbf, 0x08, 0x47, + 0x70, 0x47, 0x00, 0x00, 0xf8, 0xb5, 0x0e, 0x46, 0x15, 0x46, 0x06, 0x99, + 0x07, 0x9c, 0x9d, 0xf9, 0x28, 0x20, 0x00, 0x92, 0x1f, 0x46, 0x01, 0x23, + 0x3a, 0x46, 0xff, 0xf7, 0x93, 0xff, 0x01, 0x2c, 0x0c, 0xbf, 0x45, 0x1b, + 0x2d, 0x1a, 0x00, 0xee, 0x10, 0x5a, 0x00, 0xee, 0x90, 0x7a, 0xb8, 0xee, + 0xc0, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x08, 0x99, 0x09, 0x98, 0x02, 0x2e, + 0x80, 0xee, 0x20, 0x0a, 0x07, 0xd1, 0xdf, 0xed, 0x67, 0x0a, 0x00, 0xf0, + 0x18, 0xf8, 0xa0, 0xb1, 0xdf, 0xed, 0x65, 0x0a, 0x08, 0xe0, 0x01, 0x2e, + 0x0f, 0xd1, 0xdf, 0xed, 0x64, 0x0a, 0x00, 0xf0, 0x0e, 0xf8, 0x50, 0xb1, + 0xdf, 0xed, 0x62, 0x0a, 0xb6, 0xee, 0x00, 0x1a, 0x00, 0xee, 0x20, 0x1a, + 0xbd, 0xee, 0xc1, 0x0a, 0x10, 0xee, 0x10, 0x1a, 0x01, 0x80, 0x28, 0x46, + 0xf2, 0xbd, 0xb6, 0xee, 0x00, 0x1a, 0x00, 0xee, 0x20, 0x1a, 0xbd, 0xee, + 0xc1, 0x1a, 0x11, 0xee, 0x10, 0x2a, 0x0a, 0x70, 0x70, 0x47, 0x30, 0xb5, + 0x49, 0x1c, 0xc9, 0xb2, 0x00, 0x22, 0x00, 0x23, 0x02, 0xe0, 0x04, 0x57, + 0x12, 0x19, 0x5b, 0x1c, 0xdc, 0xb2, 0x8c, 0x42, 0xf9, 0xdb, 0x4d, 0x08, + 0x92, 0xfb, 0xf1, 0xf3, 0x01, 0xfb, 0x13, 0x21, 0x18, 0x46, 0x8d, 0x42, + 0xb8, 0xbf, 0x40, 0x1c, 0xc0, 0xb2, 0x30, 0xbd, 0x38, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x00, 0x22, 0x0c, 0xf0, 0x7c, 0xfc, 0x01, 0x22, 0x29, 0x46, + 0x20, 0x46, 0x0c, 0xf0, 0x77, 0xfc, 0x00, 0x22, 0x29, 0x46, 0x20, 0x46, + 0x0c, 0xf0, 0xa3, 0xfc, 0x29, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0x38, 0x40, + 0x01, 0x22, 0x0c, 0xf0, 0x9c, 0xbc, 0x0b, 0x46, 0x11, 0x46, 0x01, 0x28, + 0x08, 0xbf, 0xff, 0x21, 0x18, 0x46, 0x0c, 0xf0, 0x7f, 0xbd, 0x00, 0x00, + 0xba, 0x49, 0x89, 0x68, 0x41, 0x60, 0x71, 0xb1, 0x00, 0xee, 0x90, 0x1a, + 0x90, 0xed, 0x00, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x9f, 0xed, 0xb1, 0x1a, + 0xb8, 0xee, 0x40, 0x0a, 0x80, 0xee, 0x81, 0x1a, 0x80, 0xee, 0x01, 0x0a, + 0x01, 0xe0, 0x9f, 0xed, 0x2e, 0x0a, 0x80, 0xed, 0x03, 0x0a, 0x70, 0x47, + 0x1f, 0xb5, 0x00, 0xf0, 0x19, 0xf8, 0x09, 0x68, 0x29, 0xb1, 0x02, 0xa8, + 0x88, 0x47, 0xdd, 0xe9, 0x02, 0x23, 0xcd, 0xe9, 0x00, 0x23, 0x0a, 0xe0, + 0x1f, 0xb5, 0x00, 0xf0, 0x0d, 0xf8, 0x49, 0x68, 0x29, 0xb1, 0x02, 0xa8, + 0x88, 0x47, 0xdd, 0xe9, 0x02, 0x23, 0xcd, 0xe9, 0x00, 0x23, 0xdd, 0xe9, + 0x00, 0x01, 0xc4, 0xe9, 0x00, 0x01, 0x1f, 0xbd, 0x00, 0x21, 0xcd, 0xe9, + 0x00, 0x11, 0x04, 0x46, 0x9e, 0x49, 0x70, 0x47, 0x9e, 0x49, 0x0a, 0x68, + 0x49, 0x68, 0x12, 0xb1, 0x00, 0x23, 0x42, 0xf8, 0x20, 0x30, 0x11, 0xb1, + 0x00, 0x22, 0x41, 0xf8, 0x20, 0x20, 0x70, 0x47, 0x02, 0x46, 0x98, 0x48, + 0x01, 0x68, 0x04, 0xe0, 0x0a, 0xd7, 0x23, 0x3c, 0x02, 0x46, 0x95, 0x48, + 0x41, 0x68, 0x00, 0x20, 0x09, 0xb1, 0x51, 0xf8, 0x22, 0x00, 0x70, 0x47, + 0xdb, 0x0f, 0x49, 0x40, 0x30, 0xb5, 0x90, 0x4b, 0x1c, 0x68, 0x5b, 0x68, + 0x24, 0xb1, 0x54, 0xf8, 0x20, 0x50, 0x49, 0x19, 0x44, 0xf8, 0x20, 0x10, + 0x63, 0xb1, 0x00, 0x2a, 0x03, 0xdd, 0x53, 0xf8, 0x20, 0x10, 0x52, 0x18, + 0x04, 0xe0, 0x05, 0xd5, 0x53, 0xf8, 0x20, 0x10, 0x52, 0x42, 0x8a, 0x1a, + 0x43, 0xf8, 0x20, 0x20, 0x30, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x42, 0x00, 0x00, 0x20, 0x44, 0x00, 0x00, 0x00, 0x42, + 0x00, 0x00, 0xa0, 0x43, 0x10, 0xb5, 0x0a, 0x70, 0x01, 0x2a, 0x0c, 0xbf, + 0x4c, 0x1d, 0x4c, 0x1c, 0x01, 0x22, 0xe2, 0x70, 0x00, 0xf0, 0x03, 0xf8, + 0x00, 0x22, 0xe2, 0x70, 0x10, 0xbd, 0xfe, 0xb5, 0x0f, 0x46, 0x69, 0x46, + 0x0c, 0xf0, 0x66, 0xfe, 0x3a, 0x78, 0xff, 0x25, 0x00, 0x26, 0x01, 0x2a, + 0x0c, 0xbf, 0x79, 0x1d, 0x79, 0x1c, 0xc8, 0x78, 0x9d, 0xf8, 0x07, 0x30, + 0x00, 0x28, 0x14, 0xbf, 0x18, 0x46, 0x08, 0x78, 0x8d, 0xf8, 0x08, 0x00, + 0xc8, 0x78, 0x00, 0xb9, 0x4b, 0x78, 0x8d, 0xf8, 0x09, 0x30, 0x00, 0x20, + 0xc3, 0xb2, 0x1d, 0xf8, 0x03, 0x30, 0x60, 0x2b, 0x0e, 0xd2, 0xb3, 0x42, + 0x28, 0xbf, 0x1e, 0x46, 0xab, 0x42, 0x98, 0xbf, 0x1d, 0x46, 0x40, 0x1c, + 0xc3, 0xb2, 0x0a, 0x2b, 0xf0, 0xd3, 0x0d, 0x70, 0x4e, 0x70, 0x75, 0x1b, + 0x8d, 0x70, 0xf7, 0xbd, 0x00, 0x26, 0x00, 0x23, 0xff, 0x25, 0xd8, 0xb2, + 0x1d, 0xf8, 0x00, 0x00, 0x20, 0x28, 0x38, 0xbf, 0x80, 0x38, 0xc4, 0xb2, + 0xc0, 0xb2, 0xb4, 0x42, 0x38, 0xbf, 0x34, 0x46, 0xa8, 0x42, 0x88, 0xbf, + 0x28, 0x46, 0x05, 0x46, 0x5b, 0x1c, 0xd8, 0xb2, 0x0a, 0x28, 0x26, 0x46, + 0xeb, 0xd3, 0xe2, 0xe7, 0x10, 0xb5, 0x0c, 0x46, 0x00, 0x21, 0x21, 0x60, + 0x0c, 0xf0, 0x6f, 0xfd, 0xb5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0xcc, 0xbf, 0xf6, 0xee, 0x00, 0x0a, 0xfe, 0xee, 0x00, 0x0a, 0x00, 0xf0, + 0x08, 0xf8, 0x01, 0xb2, 0x37, 0x31, 0xc9, 0x29, 0x24, 0xbf, 0x08, 0x21, + 0x21, 0x60, 0x00, 0xb2, 0x10, 0xbd, 0x30, 0xee, 0x20, 0x0a, 0xbd, 0xee, + 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x70, 0x47, 0x3e, 0xb5, 0x92, 0x6b, + 0x02, 0xf2, 0x7f, 0x12, 0x93, 0x78, 0x02, 0x93, 0x92, 0xf9, 0x04, 0x40, + 0x01, 0x94, 0x92, 0xf9, 0x03, 0x50, 0x00, 0x95, 0x53, 0x78, 0x12, 0x78, + 0x00, 0xf0, 0x02, 0xf8, 0x3e, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x47, + 0x2d, 0xed, 0x02, 0x8b, 0x80, 0x46, 0x9d, 0xf9, 0x28, 0x90, 0x16, 0x46, + 0x1c, 0x46, 0x9d, 0xf9, 0x2c, 0xa0, 0x0c, 0x9d, 0x00, 0xee, 0x90, 0x0a, + 0x48, 0x46, 0x01, 0xee, 0x10, 0x0a, 0x0f, 0x46, 0xf8, 0xee, 0xe0, 0x0a, + 0xb8, 0xee, 0xc1, 0x1a, 0x70, 0xee, 0xc1, 0x0a, 0xaa, 0xeb, 0x00, 0x01, + 0x20, 0x46, 0x01, 0xee, 0x90, 0x0a, 0x30, 0x46, 0x02, 0xee, 0x10, 0x0a, + 0xf8, 0xee, 0x61, 0x1a, 0xb8, 0xee, 0x42, 0x2a, 0x01, 0xee, 0x10, 0x1a, + 0x71, 0xee, 0xc2, 0x1a, 0xb7, 0xee, 0x00, 0x0a, 0xb8, 0xee, 0xc1, 0x1a, + 0x31, 0xee, 0x80, 0x0a, 0x81, 0xee, 0x00, 0x0a, 0x80, 0xee, 0x80, 0x8a, + 0xb0, 0xee, 0x48, 0x0a, 0x00, 0xf0, 0xae, 0xfb, 0xf0, 0xee, 0x40, 0x8a, + 0xb0, 0xee, 0x48, 0x0a, 0x00, 0xf0, 0xc6, 0xfb, 0xfd, 0xee, 0xe8, 0x0a, + 0x02, 0x2d, 0x10, 0xee, 0x90, 0x0a, 0x04, 0xd1, 0xb4, 0x42, 0x04, 0xd3, + 0xc8, 0x45, 0x08, 0xda, 0x0c, 0xe0, 0x00, 0x2d, 0xfa, 0xd0, 0xc8, 0x45, + 0x05, 0xdb, 0xd0, 0x45, 0x06, 0xda, 0x26, 0x1a, 0x04, 0xe0, 0xd0, 0x45, + 0x01, 0xdb, 0x66, 0xb2, 0x00, 0xe0, 0x36, 0x18, 0x67, 0xb9, 0x30, 0xee, + 0x48, 0x0a, 0xb0, 0xee, 0xc0, 0x0a, 0xdf, 0xed, 0x0b, 0x0a, 0xb4, 0xee, + 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, 0x4f, 0xf0, 0xff, 0x36, + 0xbd, 0xec, 0x02, 0x8b, 0x70, 0xb2, 0xbd, 0xe8, 0xf0, 0x87, 0x09, 0x49, + 0x08, 0x70, 0x70, 0x47, 0x07, 0x48, 0x00, 0x78, 0x70, 0x47, 0x00, 0x00, + 0x00, 0x24, 0x74, 0x49, 0xce, 0xcc, 0x4c, 0x3e, 0x2c, 0x77, 0x02, 0x20, + 0x24, 0x77, 0x02, 0x20, 0x00, 0x77, 0x02, 0x20, 0x34, 0x77, 0x02, 0x20, + 0xb0, 0x77, 0x02, 0x20, 0x80, 0xb5, 0x00, 0xee, 0x10, 0x2a, 0xf8, 0xee, + 0x40, 0x0a, 0x00, 0xee, 0x10, 0x1a, 0xb0, 0xf9, 0x00, 0x10, 0xb0, 0xf9, + 0x02, 0x20, 0xb0, 0xf9, 0x04, 0x00, 0xb8, 0xee, 0xc0, 0x1a, 0x00, 0xee, + 0x10, 0x1a, 0x01, 0xee, 0x90, 0x2a, 0x02, 0xee, 0x10, 0x0a, 0xb8, 0xee, + 0xc0, 0x0a, 0xf8, 0xee, 0xe1, 0x1a, 0xb8, 0xee, 0xc2, 0x2a, 0x80, 0xee, + 0x20, 0x0a, 0xc1, 0xee, 0xa0, 0x1a, 0xc2, 0xee, 0x20, 0x0a, 0x01, 0xee, + 0x81, 0x0a, 0x60, 0xee, 0x81, 0x0a, 0x00, 0xee, 0x81, 0x0a, 0x00, 0xf0, + 0x3f, 0xfb, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x00, 0xb2, + 0x02, 0xbd, 0x00, 0x20, 0x70, 0x47, 0x02, 0x78, 0x52, 0x1c, 0xd3, 0xb2, + 0x99, 0x42, 0x38, 0xbf, 0x00, 0x22, 0x02, 0x70, 0x70, 0x47, 0xf0, 0xb5, + 0x00, 0x22, 0xd4, 0x00, 0x00, 0x23, 0xe4, 0xb2, 0x00, 0x25, 0x54, 0xfa, + 0x85, 0xf6, 0x6d, 0x1c, 0x86, 0x5d, 0x9b, 0x19, 0xef, 0xb2, 0x08, 0x2f, + 0xf7, 0xd3, 0x1b, 0x1d, 0xdb, 0x08, 0x8b, 0x54, 0x52, 0x1c, 0x02, 0x2a, + 0xed, 0xd3, 0xf0, 0xbd, 0x70, 0xb5, 0x15, 0x46, 0x0c, 0x46, 0x00, 0x22, + 0x00, 0x26, 0xf1, 0xb2, 0x35, 0xf9, 0x11, 0x10, 0x01, 0xb1, 0x52, 0x1c, + 0x76, 0x1c, 0xf1, 0xb2, 0x03, 0x29, 0xf6, 0xd3, 0x04, 0x9e, 0x32, 0xb1, + 0x01, 0x46, 0x22, 0x46, 0x28, 0x46, 0xff, 0xf7, 0x9d, 0xff, 0x30, 0x80, + 0x70, 0xbd, 0x33, 0x80, 0x70, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, 0x09, 0x9d, + 0x0e, 0x46, 0x14, 0x46, 0x81, 0x46, 0x1f, 0x46, 0x00, 0x22, 0x29, 0x46, + 0x0c, 0xf0, 0xf6, 0xfe, 0x80, 0x46, 0x00, 0x2c, 0x12, 0xbf, 0x0f, 0x26, + 0x05, 0x20, 0x00, 0xfa, 0x06, 0xf6, 0x08, 0x9c, 0xf1, 0xb2, 0x48, 0x46, + 0x0c, 0xf0, 0x2f, 0xfa, 0x0a, 0x20, 0xff, 0xf7, 0x71, 0xfd, 0x00, 0x22, + 0x29, 0x46, 0x48, 0x46, 0x0c, 0xf0, 0xe2, 0xfe, 0x40, 0xea, 0x08, 0x05, + 0x04, 0xb1, 0x26, 0x70, 0x17, 0xb1, 0x0a, 0x20, 0xff, 0xf7, 0x64, 0xfd, + 0x28, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0x41, 0x78, 0x00, 0x29, 0x0c, 0xbf, + 0x0a, 0x21, 0x05, 0x21, 0x81, 0x70, 0x41, 0x78, 0xc1, 0xf1, 0x01, 0x01, + 0x01, 0x71, 0x41, 0x78, 0x01, 0xb1, 0x01, 0x21, 0x81, 0x71, 0x41, 0x78, + 0x49, 0x1e, 0x89, 0x41, 0xc9, 0x0f, 0xc1, 0x71, 0x70, 0x47, 0x30, 0xb4, + 0x00, 0x25, 0x13, 0xe0, 0x50, 0xf8, 0x04, 0x2b, 0xd3, 0x07, 0x44, 0xbf, + 0xa9, 0xf1, 0x01, 0x03, 0x9a, 0x18, 0x09, 0x1f, 0x04, 0x29, 0x42, 0xf8, + 0x04, 0x5b, 0xfa, 0xd2, 0x13, 0x46, 0x8c, 0x07, 0x44, 0xbf, 0x15, 0x80, + 0x9b, 0x1c, 0xc9, 0x07, 0x48, 0xbf, 0x1d, 0x70, 0x50, 0xf8, 0x04, 0x1b, + 0x00, 0x29, 0xe7, 0xd1, 0x30, 0xbc, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x43, + 0x04, 0x46, 0x0d, 0xf0, 0x3e, 0xfa, 0x07, 0x46, 0x20, 0x46, 0x0d, 0xf0, + 0xdb, 0xfc, 0x00, 0x25, 0x00, 0x26, 0x5f, 0xea, 0x00, 0x08, 0x3b, 0xd1, + 0x00, 0xf0, 0xbd, 0xf8, 0x01, 0x28, 0x0b, 0xd1, 0xe8, 0xb2, 0x0e, 0xf0, + 0xef, 0xf9, 0xff, 0x28, 0x06, 0xd0, 0x00, 0x21, 0xe8, 0xb2, 0x0d, 0xf0, + 0xc4, 0xff, 0xe8, 0xb2, 0x0d, 0xf0, 0x7a, 0xfe, 0x6d, 0x1c, 0xe8, 0xb2, + 0x08, 0x28, 0xeb, 0xdb, 0x00, 0x25, 0xdf, 0xf8, 0x20, 0x91, 0x00, 0xf0, + 0xa6, 0xf8, 0x01, 0x28, 0x19, 0xd1, 0xe8, 0xb2, 0x0e, 0xf0, 0xd8, 0xf9, + 0xff, 0x28, 0x14, 0xd0, 0xe8, 0xb2, 0x0d, 0xf0, 0x41, 0xfe, 0x04, 0x00, + 0x04, 0xd1, 0xe8, 0xb2, 0x0d, 0xf0, 0xe9, 0xfd, 0x76, 0x1c, 0x07, 0xe0, + 0x00, 0x97, 0x23, 0x46, 0x4a, 0x46, 0xb6, 0x21, 0x01, 0x20, 0x0e, 0xf0, + 0xbe, 0xfa, 0xa0, 0x46, 0xe8, 0xb2, 0x0d, 0xf0, 0x72, 0xfe, 0xb0, 0xb2, + 0x04, 0x28, 0x03, 0xd2, 0x6d, 0x1c, 0xe8, 0xb2, 0x08, 0x28, 0xda, 0xdb, + 0x36, 0xe0, 0x2d, 0xe9, 0xf8, 0x43, 0x07, 0x46, 0x0e, 0x46, 0x0d, 0xf0, + 0xca, 0xf9, 0x00, 0x24, 0x00, 0x28, 0x14, 0xbf, 0x0b, 0x25, 0x07, 0x25, + 0x0e, 0xf0, 0x88, 0xf9, 0x40, 0xf4, 0x70, 0x60, 0x00, 0xea, 0x07, 0x09, + 0x4f, 0xf0, 0x00, 0x08, 0x34, 0x80, 0x00, 0x27, 0x01, 0x21, 0xb9, 0x40, + 0x19, 0xea, 0x01, 0x0f, 0x0e, 0xd0, 0xf8, 0xb2, 0x0d, 0xf0, 0xd0, 0xfe, + 0x01, 0x28, 0x09, 0xd1, 0xf8, 0xb2, 0x0d, 0xf0, 0xf3, 0xfd, 0x31, 0x88, + 0x0a, 0x22, 0x90, 0xfb, 0xf2, 0xf0, 0x41, 0x18, 0x31, 0x80, 0x64, 0x1c, + 0x7f, 0x1c, 0xbd, 0x42, 0xe8, 0xd2, 0x24, 0xb2, 0x01, 0x2c, 0xa7, 0xbf, + 0xb6, 0xf9, 0x00, 0x00, 0x90, 0xfb, 0xf4, 0xf0, 0x4b, 0xf2, 0x01, 0x68, + 0x1a, 0x48, 0x30, 0x80, 0x40, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0xf8, 0xb5, + 0x04, 0x46, 0x0d, 0xf0, 0x92, 0xf9, 0x00, 0x28, 0x14, 0xbf, 0x0b, 0x26, + 0x07, 0x26, 0x00, 0x20, 0x14, 0x4d, 0x13, 0x49, 0x25, 0xf8, 0x10, 0x10, + 0x40, 0x1c, 0x0b, 0x28, 0xfa, 0xd9, 0x00, 0x27, 0x38, 0x46, 0x0e, 0xf0, + 0x6b, 0xf9, 0x07, 0x2f, 0x01, 0xd8, 0xff, 0x28, 0x0c, 0xd0, 0xf8, 0xb2, + 0x0d, 0xf0, 0x98, 0xfe, 0x01, 0x28, 0x07, 0xd1, 0xf8, 0xb2, 0x0d, 0xf0, + 0xbb, 0xfd, 0x0a, 0x21, 0x90, 0xfb, 0xf1, 0xf0, 0x25, 0xf8, 0x17, 0x00, + 0x7f, 0x1c, 0xbe, 0x42, 0xe8, 0xd2, 0x18, 0x22, 0x29, 0x46, 0x20, 0x46, + 0x00, 0xf0, 0xa6, 0xf8, 0x00, 0x20, 0xf2, 0xbd, 0xc8, 0x8f, 0x04, 0x01, + 0xee, 0xfe, 0xff, 0xff, 0x74, 0x76, 0x02, 0x20, 0x38, 0xb5, 0x04, 0x46, + 0x00, 0x20, 0x20, 0x80, 0x00, 0x25, 0x00, 0xf0, 0x0c, 0xf8, 0x01, 0x28, + 0x04, 0xd1, 0x20, 0x88, 0x01, 0x21, 0xa9, 0x40, 0x08, 0x43, 0x20, 0x80, + 0x6d, 0x1c, 0x0c, 0x2d, 0xf3, 0xdb, 0x00, 0x20, 0x32, 0xbd, 0xe8, 0xb2, + 0x0d, 0xf0, 0x68, 0xbe, 0x2d, 0xe9, 0xf8, 0x43, 0x80, 0x46, 0x00, 0x24, + 0x0e, 0xf0, 0x0a, 0xf9, 0x40, 0xf4, 0x70, 0x66, 0x0d, 0xf0, 0x41, 0xf9, + 0x00, 0x28, 0x14, 0xbf, 0x4f, 0xf0, 0x0b, 0x09, 0x4f, 0xf0, 0x07, 0x09, + 0xb8, 0xf5, 0x80, 0x5f, 0xb6, 0xb2, 0xa8, 0xbf, 0x4b, 0xf2, 0x0e, 0x64, + 0x3b, 0xda, 0x00, 0x25, 0x01, 0x27, 0xaf, 0x40, 0xbf, 0xb2, 0x3e, 0x42, + 0x32, 0xd0, 0xff, 0xf7, 0xde, 0xff, 0x18, 0xea, 0x07, 0x0f, 0x25, 0xd0, + 0x60, 0xbb, 0x0d, 0xf0, 0x12, 0xfd, 0xe8, 0xb2, 0x0d, 0xf0, 0xcd, 0xfd, + 0xe8, 0xb2, 0x0d, 0xf0, 0x7e, 0xfe, 0xe8, 0xb2, 0x0d, 0xf0, 0xac, 0xfe, + 0xe8, 0xb2, 0x0d, 0xf0, 0xa7, 0xfc, 0x04, 0x46, 0x00, 0x21, 0xe8, 0xb2, + 0x0d, 0xf0, 0xd9, 0xfe, 0xe8, 0xb2, 0x0d, 0xf0, 0x8f, 0xfd, 0x3c, 0xb9, + 0xe8, 0xb2, 0x0d, 0xf0, 0x65, 0xfd, 0x04, 0x46, 0x14, 0xb9, 0xe8, 0xb2, + 0x0d, 0xf0, 0x0d, 0xfd, 0xe8, 0xb2, 0x0d, 0xf0, 0xa0, 0xfd, 0x0d, 0xf0, + 0xfa, 0xfc, 0x07, 0xe0, 0x0b, 0x2d, 0x05, 0xd0, 0xe8, 0xb2, 0x0d, 0xf0, + 0x27, 0xfe, 0xe8, 0xb2, 0x0d, 0xf0, 0x9f, 0xfe, 0x6d, 0x1c, 0xa9, 0x45, + 0xc4, 0xd2, 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0x2d, 0xe9, 0xfc, 0x41, + 0x00, 0x24, 0x88, 0x46, 0xad, 0xf8, 0x00, 0x40, 0x05, 0x46, 0x68, 0x46, + 0xff, 0xf7, 0x8a, 0xff, 0x01, 0x26, 0xbd, 0xf8, 0x00, 0x00, 0x00, 0x27, + 0xae, 0x40, 0x30, 0x42, 0x06, 0xd1, 0x06, 0x43, 0xb0, 0xb2, 0xff, 0xf7, + 0x95, 0xff, 0x01, 0x27, 0x04, 0x00, 0x15, 0xd1, 0xe8, 0xb2, 0x0d, 0xf0, + 0x1f, 0xfd, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0xc0, 0x0a, 0xf2, 0xee, + 0x04, 0x0a, 0x00, 0x2f, 0x80, 0xee, 0x20, 0x0a, 0x18, 0xbf, 0x0b, 0x2d, + 0x88, 0xed, 0x00, 0x0a, 0x04, 0xd0, 0xbd, 0xf8, 0x00, 0x00, 0xff, 0xf7, + 0x7d, 0xff, 0x04, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0xf6, 0x81, 0x00, 0x00, + 0x62, 0xb3, 0x8b, 0x07, 0x08, 0xd0, 0x52, 0x1e, 0x11, 0xf8, 0x01, 0x3b, + 0x00, 0xf8, 0x01, 0x3b, 0x00, 0xf0, 0x24, 0x80, 0x8b, 0x07, 0xf6, 0xd1, + 0x83, 0x07, 0x40, 0xf0, 0x20, 0x80, 0x00, 0xbf, 0x10, 0x3a, 0x07, 0xd3, + 0x30, 0xb4, 0xb1, 0xe8, 0x38, 0x10, 0x10, 0x3a, 0xa0, 0xe8, 0x38, 0x10, + 0xf9, 0xd2, 0x30, 0xbc, 0x53, 0x07, 0x24, 0xbf, 0xb1, 0xe8, 0x08, 0x10, + 0xa0, 0xe8, 0x08, 0x10, 0x44, 0xbf, 0x51, 0xf8, 0x04, 0x3b, 0x40, 0xf8, + 0x04, 0x3b, 0xd2, 0x07, 0x24, 0xbf, 0x31, 0xf8, 0x02, 0x2b, 0x20, 0xf8, + 0x02, 0x2b, 0x44, 0xbf, 0x0b, 0x78, 0x03, 0x70, 0x70, 0x47, 0x12, 0x1f, + 0x17, 0xd3, 0x5b, 0x00, 0x09, 0xd1, 0x51, 0xf8, 0x04, 0x3b, 0x20, 0xf8, + 0x02, 0x3b, 0x1b, 0x0c, 0x12, 0x1f, 0x20, 0xf8, 0x02, 0x3b, 0xf6, 0xd2, + 0x0b, 0xe0, 0x51, 0xf8, 0x04, 0x3b, 0x00, 0xf8, 0x01, 0x3b, 0x1b, 0x0a, + 0x20, 0xf8, 0x02, 0x3b, 0x1b, 0x0c, 0x12, 0x1f, 0x00, 0xf8, 0x01, 0x3b, + 0xf3, 0xd2, 0x38, 0xbf, 0x12, 0x1d, 0x52, 0x1e, 0x24, 0xbf, 0x11, 0xf8, + 0x01, 0x3b, 0x00, 0xf8, 0x01, 0x3b, 0xf8, 0xd8, 0x70, 0x47, 0x00, 0x00, + 0x40, 0x18, 0x49, 0x1c, 0x1c, 0xbf, 0xb1, 0xf1, 0x01, 0x01, 0x00, 0xf8, + 0x01, 0x2d, 0xf9, 0xd1, 0x70, 0x47, 0x00, 0x00, 0xdf, 0xed, 0x65, 0x0a, + 0x60, 0xee, 0x20, 0x0a, 0x10, 0xee, 0x90, 0x1a, 0x21, 0xf0, 0x00, 0x41, + 0x01, 0xee, 0x10, 0x1a, 0xdf, 0xed, 0x61, 0x1a, 0xb4, 0xee, 0x61, 0x1a, + 0xf1, 0xee, 0x10, 0xfa, 0x27, 0xd5, 0x10, 0xee, 0x90, 0x2a, 0x4f, 0xf0, + 0x7c, 0x51, 0x02, 0xf0, 0x00, 0x42, 0x11, 0x43, 0x01, 0xee, 0x10, 0x1a, + 0x70, 0xee, 0x81, 0x0a, 0xfd, 0xee, 0xe0, 0x0a, 0x10, 0xee, 0x90, 0x1a, + 0x00, 0x29, 0x6e, 0xd0, 0xfa, 0xee, 0xc9, 0x0a, 0x9f, 0xed, 0x55, 0x1a, + 0x00, 0xee, 0xc1, 0x0a, 0xdf, 0xed, 0x54, 0x1a, 0x00, 0xee, 0xe1, 0x0a, + 0x9f, 0xed, 0x53, 0x2a, 0x00, 0xee, 0xc2, 0x0a, 0xdf, 0xed, 0x52, 0x2a, + 0x00, 0xee, 0xe2, 0x0a, 0x9f, 0xed, 0x51, 0x1a, 0x00, 0xee, 0xc1, 0x0a, + 0x57, 0xe0, 0x10, 0xee, 0x10, 0x1a, 0x49, 0x00, 0x09, 0x16, 0x49, 0x1c, + 0x10, 0xee, 0x10, 0x1a, 0x09, 0xd1, 0x49, 0x00, 0x08, 0x16, 0x40, 0x1c, + 0x02, 0xd1, 0x09, 0x02, 0x40, 0xf0, 0x83, 0x80, 0x9f, 0xed, 0x48, 0x0a, + 0x70, 0x47, 0x49, 0x00, 0x04, 0xd1, 0x00, 0x28, 0x7b, 0xd0, 0xb7, 0xee, + 0x00, 0x0a, 0x70, 0x47, 0x10, 0xee, 0x90, 0x2a, 0x4f, 0xf0, 0x7c, 0x51, + 0x02, 0xf0, 0x00, 0x42, 0x11, 0x43, 0x01, 0xee, 0x10, 0x1a, 0x70, 0xee, + 0x81, 0x0a, 0x10, 0xee, 0x90, 0x2a, 0x51, 0x00, 0x0f, 0xd0, 0x09, 0x0e, + 0xc1, 0xf1, 0x96, 0x01, 0x18, 0x29, 0xa8, 0xbf, 0x02, 0xf0, 0x00, 0x42, + 0x05, 0xda, 0x00, 0x29, 0xc4, 0xbf, 0x22, 0xfa, 0x01, 0xf3, 0x03, 0xfa, + 0x01, 0xf2, 0x00, 0xee, 0x90, 0x2a, 0x10, 0xee, 0x90, 0x1a, 0x49, 0x00, + 0x17, 0xd0, 0x9f, 0xed, 0x33, 0x1a, 0x20, 0xee, 0x81, 0x1a, 0xdf, 0xed, + 0x2b, 0x1a, 0x01, 0xee, 0x61, 0x0a, 0x9f, 0xed, 0x2a, 0x2a, 0x01, 0xee, + 0x42, 0x0a, 0xdf, 0xed, 0x29, 0x2a, 0x01, 0xee, 0x62, 0x0a, 0x9f, 0xed, + 0x28, 0x3a, 0x01, 0xee, 0x43, 0x0a, 0xdf, 0xed, 0x27, 0x1a, 0x01, 0xee, + 0x61, 0x0a, 0xfd, 0xee, 0xe0, 0x0a, 0x10, 0xee, 0x90, 0x1a, 0x10, 0xee, + 0x10, 0x2a, 0x22, 0xf0, 0x00, 0x42, 0x00, 0xee, 0x90, 0x2a, 0x9f, 0xed, + 0x23, 0x1a, 0x01, 0xf0, 0x03, 0x01, 0xf4, 0xee, 0x41, 0x0a, 0x08, 0x18, + 0xf1, 0xee, 0x10, 0xfa, 0x00, 0xf0, 0x01, 0x01, 0x03, 0xd5, 0x11, 0xb3, + 0xb7, 0xee, 0x00, 0x0a, 0x1f, 0xe0, 0x60, 0xee, 0x00, 0x0a, 0x71, 0xb1, + 0x9f, 0xed, 0x1a, 0x0a, 0x9f, 0xed, 0x1a, 0x1a, 0x00, 0xee, 0x80, 0x1a, + 0xdf, 0xed, 0x19, 0x1a, 0x41, 0xee, 0x20, 0x1a, 0xb7, 0xee, 0x00, 0x0a, + 0x01, 0xee, 0xa0, 0x0a, 0x0d, 0xe0, 0x9f, 0xed, 0x16, 0x2a, 0xdf, 0xed, + 0x16, 0x1a, 0x40, 0xee, 0x82, 0x1a, 0xdf, 0xed, 0x15, 0x2a, 0x20, 0xee, + 0x20, 0x1a, 0x41, 0xee, 0xa0, 0x2a, 0x01, 0xee, 0x22, 0x0a, 0x80, 0x07, + 0x48, 0xbf, 0xb1, 0xee, 0x40, 0x0a, 0x70, 0x47, 0x83, 0xf9, 0x22, 0x3f, + 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0xc9, 0x46, 0x00, 0xa0, 0xfd, 0x40, + 0x00, 0x20, 0xa2, 0x3a, 0x00, 0x00, 0x34, 0x33, 0x00, 0x30, 0xc2, 0x2e, + 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x80, 0x38, 0x00, 0x00, 0x80, 0x39, + 0x93, 0x49, 0xb2, 0xba, 0x36, 0xa0, 0x2a, 0x3d, 0xdf, 0xff, 0xff, 0xbe, + 0x6e, 0x8c, 0x4c, 0xb9, 0x42, 0x83, 0x08, 0x3c, 0xa1, 0xaa, 0x2a, 0xbe, + 0x01, 0x20, 0x11, 0xe7, 0x00, 0x20, 0x0f, 0xe7, 0x10, 0xee, 0x10, 0x0a, + 0xf4, 0x46, 0x00, 0xf0, 0x03, 0xf8, 0x00, 0xee, 0x10, 0x0a, 0x60, 0x47, + 0xc0, 0xf3, 0xc7, 0x52, 0x7e, 0x3a, 0x09, 0xdd, 0x18, 0x2a, 0x0e, 0xda, + 0x6f, 0xf0, 0x7f, 0x41, 0xd1, 0x40, 0x00, 0x42, 0x48, 0xbf, 0x40, 0x18, + 0x88, 0x43, 0x70, 0x47, 0xc0, 0x42, 0x1c, 0xbf, 0x00, 0x20, 0xcb, 0xf6, + 0x80, 0x70, 0x38, 0xbf, 0x00, 0x20, 0x70, 0x47, 0x10, 0xee, 0x10, 0x0a, + 0xf4, 0x46, 0x00, 0xf0, 0x03, 0xf8, 0x00, 0xee, 0x10, 0x0a, 0x60, 0x47, + 0xc0, 0xf3, 0xc7, 0x52, 0x7e, 0x3a, 0x09, 0xdd, 0x18, 0x2a, 0x0c, 0xda, + 0x6f, 0xf0, 0x7f, 0x41, 0xd1, 0x40, 0x20, 0xea, 0x51, 0x00, 0x40, 0x18, + 0x88, 0x43, 0x70, 0x47, 0x00, 0xf0, 0x00, 0x40, 0x08, 0xbf, 0x40, 0xf0, + 0x7e, 0x50, 0x70, 0x47, 0xfe, 0xb5, 0x0d, 0x46, 0x16, 0x46, 0x05, 0xf1, + 0x08, 0x07, 0x00, 0x22, 0x3a, 0x70, 0x04, 0x46, 0x00, 0x21, 0x0c, 0xf0, + 0x5b, 0xf8, 0x01, 0x90, 0x01, 0x22, 0x00, 0x20, 0x02, 0x92, 0x00, 0xf0, + 0x20, 0xf8, 0x39, 0x78, 0x20, 0x46, 0x0c, 0xf0, 0x6d, 0xf8, 0x01, 0x21, + 0x02, 0x91, 0x01, 0x90, 0x00, 0x91, 0x00, 0xf0, 0x17, 0xf8, 0x39, 0x78, + 0x20, 0x46, 0x0c, 0xf0, 0x7f, 0xf8, 0x01, 0x90, 0x01, 0x21, 0x02, 0x20, + 0x02, 0x91, 0x00, 0xf0, 0x0c, 0xf8, 0xfb, 0x7e, 0x39, 0x78, 0xdb, 0x08, + 0x03, 0xf0, 0x01, 0x03, 0x06, 0xf5, 0xd0, 0x72, 0x20, 0x46, 0x12, 0xf0, + 0x89, 0xf9, 0x00, 0x20, 0xfe, 0xbd, 0x00, 0x90, 0x33, 0x46, 0x00, 0x22, + 0x29, 0x46, 0x20, 0x46, 0x0f, 0xf0, 0xec, 0xb8, 0x38, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x0c, 0xf0, 0x71, 0xf8, 0x29, 0x46, 0x20, 0x46, 0xbd, 0xe8, + 0x34, 0x40, 0x0c, 0xf0, 0x69, 0xb8, 0x2d, 0xe9, 0xf8, 0x43, 0x81, 0x46, + 0x0d, 0x46, 0x08, 0x9e, 0x00, 0x20, 0x28, 0x70, 0x90, 0x46, 0x1c, 0x46, + 0x22, 0x46, 0x31, 0x46, 0x48, 0x46, 0xff, 0xf7, 0x0b, 0xfb, 0x00, 0x27, + 0x20, 0x00, 0x04, 0xd0, 0x01, 0x21, 0x48, 0x46, 0x0c, 0xf0, 0x0a, 0xf8, + 0x03, 0xe0, 0x01, 0x21, 0x48, 0x46, 0x0c, 0xf0, 0x07, 0xf8, 0x48, 0x46, + 0x0c, 0xf0, 0x9b, 0xf8, 0x48, 0x46, 0x0c, 0xf0, 0x4d, 0xf8, 0x40, 0x46, + 0xff, 0xf7, 0xea, 0xf9, 0x48, 0x46, 0x0c, 0xf0, 0x49, 0xf8, 0x50, 0xb9, + 0x31, 0x46, 0x48, 0x46, 0xff, 0xf7, 0xfb, 0xfa, 0x7f, 0x1c, 0x78, 0xb2, + 0x7f, 0x28, 0x2f, 0x70, 0xde, 0xd1, 0xbd, 0xe8, 0xf1, 0x83, 0x24, 0xb1, + 0x00, 0x21, 0x48, 0x46, 0x0b, 0xf0, 0xe8, 0xff, 0x03, 0xe0, 0x00, 0x21, + 0x48, 0x46, 0x0b, 0xf0, 0xe5, 0xff, 0x48, 0x46, 0xbd, 0xe8, 0xf2, 0x43, + 0x0c, 0xf0, 0x77, 0xb8, 0x80, 0xb5, 0x00, 0x93, 0x01, 0x23, 0x02, 0xe0, + 0x80, 0xb5, 0x00, 0x93, 0x00, 0x23, 0xff, 0xf7, 0xb6, 0xff, 0x01, 0xbd, + 0x2d, 0xe9, 0xf0, 0x4f, 0x85, 0xb0, 0x0f, 0x9c, 0x9d, 0xf9, 0x40, 0x60, + 0x80, 0x46, 0x89, 0x46, 0x17, 0x46, 0x1d, 0x46, 0x0b, 0xf0, 0x72, 0xff, + 0x01, 0x2c, 0x4f, 0xf0, 0x00, 0x0a, 0x43, 0xf6, 0xff, 0x7b, 0x07, 0xd1, + 0x00, 0x96, 0x01, 0x23, 0x5a, 0x46, 0x06, 0x21, 0x40, 0x46, 0xff, 0xf7, + 0x5f, 0xf9, 0x82, 0x46, 0x00, 0x20, 0x28, 0x70, 0x11, 0x9b, 0x0e, 0x9a, + 0x29, 0x46, 0x40, 0x46, 0xff, 0xf7, 0xd4, 0xff, 0x01, 0x2c, 0x09, 0xd1, + 0x04, 0x96, 0x00, 0x20, 0x03, 0x90, 0x02, 0x95, 0x01, 0x21, 0x06, 0x22, + 0x01, 0x91, 0x00, 0x92, 0x00, 0xf0, 0x1c, 0xf8, 0x40, 0x46, 0x0b, 0xf0, + 0x4d, 0xff, 0x00, 0x20, 0x38, 0x70, 0x11, 0x9b, 0x0e, 0x9a, 0x39, 0x46, + 0x40, 0x46, 0xff, 0xf7, 0xc1, 0xff, 0x01, 0x2c, 0x08, 0xd1, 0x04, 0x96, + 0x00, 0x20, 0x06, 0x22, 0x03, 0x90, 0x01, 0x90, 0x00, 0x92, 0x02, 0x97, + 0x00, 0xf0, 0x06, 0xf8, 0x40, 0x46, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, + 0x0b, 0xf0, 0x34, 0xbf, 0x5b, 0x46, 0x52, 0x46, 0x49, 0x46, 0x40, 0x46, + 0xff, 0xf7, 0x88, 0xb9, 0x2d, 0xe9, 0xf8, 0x4f, 0x84, 0xb0, 0x0e, 0x46, + 0x0e, 0x9f, 0x0f, 0x9c, 0x02, 0x2e, 0x80, 0x46, 0x93, 0x46, 0x9a, 0x46, + 0x05, 0xd1, 0x01, 0x2c, 0x14, 0xbf, 0x39, 0x7a, 0xaa, 0x21, 0x0b, 0xf0, + 0x71, 0xff, 0x16, 0x49, 0x13, 0x9d, 0xdd, 0xf8, 0x48, 0x90, 0x40, 0x46, + 0x51, 0xf8, 0x20, 0x20, 0x52, 0x1c, 0x41, 0xf8, 0x20, 0x20, 0x0c, 0xf0, + 0x10, 0xf8, 0x68, 0x72, 0x59, 0x46, 0x40, 0x46, 0xff, 0xf7, 0x38, 0xff, + 0x03, 0x95, 0x04, 0x20, 0x9d, 0xf8, 0x40, 0x10, 0x02, 0x90, 0x01, 0x91, + 0xcd, 0xf8, 0x00, 0xa0, 0x4b, 0x46, 0x11, 0x9a, 0x31, 0x46, 0x40, 0x46, + 0xff, 0xf7, 0x80, 0xff, 0x02, 0x2e, 0x04, 0xd1, 0x7a, 0x7a, 0x41, 0x46, + 0x20, 0x46, 0xff, 0xf7, 0xc4, 0xf9, 0x40, 0x46, 0x05, 0xb0, 0xbd, 0xe8, + 0xf0, 0x4f, 0x0b, 0xf0, 0x95, 0xbf, 0x00, 0x00, 0x6c, 0x75, 0x02, 0x20, + 0x10, 0xee, 0x10, 0x0a, 0xb5, 0xee, 0x40, 0x0a, 0x4f, 0xf0, 0x80, 0x71, + 0x11, 0xeb, 0x40, 0x0f, 0xaf, 0xf0, 0x04, 0x87, 0xf1, 0xee, 0x10, 0xfa, + 0x21, 0x49, 0xf1, 0xec, 0x07, 0x0a, 0x6f, 0xf3, 0x07, 0x87, 0xc2, 0x0d, + 0x01, 0xf1, 0x0c, 0x01, 0x91, 0xec, 0x05, 0x4a, 0x2d, 0xd0, 0x7e, 0x3a, + 0xa0, 0xeb, 0xc2, 0x50, 0x00, 0xee, 0x10, 0x0a, 0xb4, 0xee, 0x60, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xbf, 0x52, 0x1e, 0x20, 0xee, 0x21, 0x0a, + 0x00, 0xee, 0x90, 0x2a, 0xf8, 0xee, 0xe0, 0x0a, 0x70, 0xee, 0x41, 0x6a, + 0x30, 0xee, 0x01, 0x7a, 0x86, 0xee, 0x87, 0x7a, 0x67, 0xee, 0x07, 0x7a, + 0x02, 0xee, 0xa7, 0x3a, 0x43, 0xee, 0x27, 0x3a, 0xb0, 0xee, 0x66, 0x0a, + 0x03, 0xee, 0xe7, 0x0a, 0x20, 0xee, 0x07, 0x7a, 0x20, 0xee, 0x85, 0x0a, + 0x05, 0xee, 0xc7, 0x0a, 0x04, 0xee, 0xa6, 0x0a, 0x04, 0xee, 0x26, 0x0a, + 0x06, 0xee, 0x20, 0x0a, 0x70, 0x47, 0x20, 0xee, 0x02, 0x0a, 0x10, 0xee, + 0x10, 0x0a, 0xc2, 0x0d, 0x7e, 0x3a, 0xa0, 0xeb, 0xc2, 0x50, 0x17, 0x3a, + 0xca, 0xe7, 0x00, 0x00, 0x7c, 0x8d, 0x04, 0x01, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, + 0x11, 0x40, 0x29, 0x43, 0x01, 0x70, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0x2d, 0xe9, 0xf0, 0x41, 0x2d, 0xed, 0x04, 0x8b, 0x5b, 0x49, 0x82, 0xb0, + 0x05, 0x46, 0x51, 0xf8, 0x25, 0x60, 0x03, 0x28, 0x20, 0xd8, 0xdf, 0xe8, + 0x00, 0xf0, 0x19, 0x1b, 0x02, 0x1d, 0x08, 0x20, 0xdf, 0xf8, 0x58, 0x81, + 0x56, 0x4f, 0x58, 0xf8, 0x25, 0x30, 0x93, 0xf8, 0x84, 0x40, 0x07, 0xeb, + 0x05, 0x11, 0x01, 0x2c, 0x01, 0xf5, 0xb0, 0x72, 0x11, 0xd1, 0x92, 0xed, + 0x02, 0x8a, 0xd2, 0xed, 0x03, 0x8a, 0x91, 0xed, 0x6a, 0x9a, 0xd1, 0xed, + 0x6b, 0x9a, 0x10, 0xe0, 0x09, 0x20, 0xe7, 0xe7, 0x0a, 0x20, 0xe5, 0xe7, + 0x0b, 0x20, 0xe3, 0xe7, 0x4b, 0xf2, 0x03, 0x74, 0x84, 0xe0, 0x92, 0xed, + 0x00, 0x8a, 0xd2, 0xed, 0x01, 0x8a, 0x91, 0xed, 0x68, 0x9a, 0xd1, 0xed, + 0x69, 0x9a, 0x69, 0x46, 0xff, 0xf7, 0x8e, 0xfc, 0x04, 0x00, 0x77, 0xd1, + 0x58, 0xf8, 0x25, 0x10, 0x48, 0x31, 0x08, 0x6a, 0x30, 0xb9, 0x9d, 0xed, + 0x00, 0x0a, 0x09, 0xee, 0x80, 0x9a, 0x81, 0xed, 0x06, 0x9a, 0x01, 0xe0, + 0xc8, 0x69, 0x88, 0x61, 0x00, 0x20, 0x07, 0xeb, 0xc0, 0x02, 0x91, 0xed, + 0x06, 0x0a, 0xd2, 0xed, 0x00, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x05, 0xda, 0x40, 0x1c, 0x2c, 0x28, 0xf1, 0xd3, 0x4b, 0xf2, + 0x0e, 0x64, 0x57, 0xe0, 0x50, 0x79, 0x08, 0x70, 0x06, 0xf1, 0x97, 0x07, + 0x58, 0xf8, 0x25, 0x00, 0x11, 0x79, 0x80, 0xf8, 0x49, 0x10, 0x58, 0xf8, + 0x25, 0x00, 0x91, 0x79, 0x80, 0xf8, 0x4a, 0x10, 0xf0, 0x22, 0x58, 0xf8, + 0x25, 0x10, 0x91, 0xf8, 0x49, 0x30, 0x04, 0x21, 0x06, 0xf1, 0x96, 0x00, + 0xff, 0xf7, 0x7e, 0xff, 0x58, 0xf8, 0x25, 0x00, 0x90, 0xf8, 0x48, 0x30, + 0x0f, 0x22, 0x00, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x75, 0xff, 0x58, 0xf8, + 0x25, 0x00, 0x90, 0xf8, 0x4a, 0x30, 0x20, 0x22, 0x05, 0x21, 0x38, 0x46, + 0xff, 0xf7, 0x6c, 0xff, 0x9d, 0xed, 0x00, 0x0a, 0x40, 0xee, 0x08, 0x8a, + 0xf5, 0xee, 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x98, 0xbf, 0x00, 0x25, + 0x0c, 0xd9, 0x9f, 0xed, 0x14, 0x0a, 0xf4, 0xee, 0x40, 0x8a, 0xf1, 0xee, + 0x10, 0xfa, 0xae, 0xbf, 0x40, 0xf6, 0xff, 0x75, 0xbd, 0xee, 0xe8, 0x0a, + 0x10, 0xee, 0x10, 0x5a, 0xeb, 0xb2, 0xff, 0x22, 0x00, 0x21, 0x06, 0xf1, + 0x66, 0x00, 0xff, 0xf7, 0x4d, 0xff, 0x2d, 0x04, 0x2b, 0x0e, 0x0f, 0x22, + 0x00, 0x21, 0x06, 0xf1, 0x67, 0x00, 0xff, 0xf7, 0x45, 0xff, 0x01, 0x23, + 0x02, 0x22, 0x01, 0x21, 0x06, 0xf1, 0x65, 0x00, 0xff, 0xf7, 0x3e, 0xff, + 0x02, 0xb0, 0x20, 0x46, 0xbd, 0xec, 0x04, 0x8b, 0xbd, 0xe8, 0xf0, 0x81, + 0x00, 0xf0, 0x7f, 0x45, 0x30, 0x9c, 0x04, 0x01, 0x20, 0x76, 0x02, 0x20, + 0x80, 0x7d, 0x04, 0x01, 0x10, 0xee, 0x10, 0x0a, 0xb5, 0xee, 0x40, 0x0a, + 0x4f, 0xf0, 0x80, 0x71, 0x11, 0xeb, 0x40, 0x0f, 0xaf, 0xf0, 0xe2, 0x85, + 0xf1, 0xee, 0x10, 0xfa, 0x20, 0x49, 0xf1, 0xec, 0x07, 0x0a, 0x6f, 0xf3, + 0xe5, 0x85, 0xc2, 0x0d, 0x01, 0xf1, 0x20, 0x01, 0x91, 0xec, 0x02, 0x4a, + 0x2b, 0xd0, 0x7e, 0x3a, 0xa0, 0xeb, 0xc2, 0x50, 0x00, 0xee, 0x10, 0x0a, + 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xbf, 0x52, 0x1e, + 0x20, 0xee, 0x21, 0x0a, 0x00, 0xee, 0x90, 0x2a, 0xf8, 0xee, 0xe0, 0x0a, + 0x70, 0xee, 0x41, 0x5a, 0x30, 0xee, 0x01, 0x6a, 0x85, 0xee, 0x86, 0x6a, + 0x66, 0xee, 0x06, 0x6a, 0x02, 0xee, 0xa6, 0x3a, 0x43, 0xee, 0x26, 0x3a, + 0xb0, 0xee, 0x65, 0x0a, 0x03, 0xee, 0xe6, 0x0a, 0x20, 0xee, 0x06, 0x6a, + 0x24, 0xee, 0xa5, 0x0a, 0x04, 0xee, 0x46, 0x0a, 0x04, 0xee, 0x25, 0x0a, + 0x30, 0xee, 0x20, 0x0a, 0x70, 0x47, 0x20, 0xee, 0x02, 0x0a, 0x10, 0xee, + 0x10, 0x0a, 0xc2, 0x0d, 0x7e, 0x3a, 0xa0, 0xeb, 0xc2, 0x50, 0x17, 0x3a, + 0xcc, 0xe7, 0x00, 0x00, 0x7c, 0x8d, 0x04, 0x01, 0xb5, 0xee, 0xc0, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x02, 0xd4, 0xb1, 0xee, 0xc0, 0x0a, 0x70, 0x47, + 0x6f, 0xf0, 0x00, 0x4c, 0x00, 0xee, 0x10, 0xca, 0xaf, 0xf3, 0x00, 0x80, + 0x70, 0x47, 0x00, 0x00, 0xa9, 0xb1, 0xb1, 0xfa, 0x81, 0xf2, 0x41, 0x40, + 0x90, 0x40, 0xc2, 0xf1, 0x20, 0x02, 0x61, 0xfa, 0x02, 0xf1, 0x81, 0xea, + 0x00, 0x00, 0x18, 0xbf, 0x40, 0xf0, 0x01, 0x00, 0x02, 0xf1, 0x9d, 0x01, + 0xc9, 0x05, 0x02, 0x06, 0x72, 0xf1, 0x00, 0x42, 0x41, 0xeb, 0x10, 0x20, + 0x70, 0x47, 0x50, 0xb1, 0xb0, 0xfa, 0x80, 0xf2, 0x90, 0x40, 0xc2, 0xf1, + 0x9d, 0x02, 0xd2, 0x05, 0x01, 0x06, 0x71, 0xf1, 0x00, 0x41, 0x42, 0xeb, + 0x10, 0x20, 0x70, 0x47, 0xdf, 0xed, 0x5f, 0x0a, 0x60, 0xee, 0x20, 0x0a, + 0x10, 0xee, 0x90, 0x0a, 0x20, 0xf0, 0x00, 0x40, 0x01, 0xee, 0x10, 0x0a, + 0xdf, 0xed, 0x5b, 0x1a, 0xb4, 0xee, 0x61, 0x1a, 0xf1, 0xee, 0x10, 0xfa, + 0x27, 0xd5, 0x10, 0xee, 0x90, 0x1a, 0x4f, 0xf0, 0x7c, 0x50, 0x01, 0xf0, + 0x00, 0x41, 0x08, 0x43, 0x01, 0xee, 0x10, 0x0a, 0x70, 0xee, 0x81, 0x0a, + 0xfd, 0xee, 0xe0, 0x0a, 0x10, 0xee, 0x90, 0x0a, 0x00, 0x28, 0x6a, 0xd0, + 0xfa, 0xee, 0xc9, 0x0a, 0x9f, 0xed, 0x4f, 0x1a, 0x00, 0xee, 0xc1, 0x0a, + 0xdf, 0xed, 0x4e, 0x1a, 0x00, 0xee, 0xe1, 0x0a, 0x9f, 0xed, 0x4d, 0x2a, + 0x00, 0xee, 0xc2, 0x0a, 0xdf, 0xed, 0x4c, 0x2a, 0x00, 0xee, 0xe2, 0x0a, + 0x9f, 0xed, 0x4b, 0x1a, 0x00, 0xee, 0xc1, 0x0a, 0x53, 0xe0, 0x10, 0xee, + 0x10, 0x0a, 0x40, 0x00, 0x00, 0x16, 0x40, 0x1c, 0x0a, 0xd1, 0x10, 0xee, + 0x10, 0x1a, 0x49, 0x00, 0x08, 0x16, 0x40, 0x1c, 0x01, 0xd1, 0x09, 0x02, + 0x76, 0xd1, 0x9f, 0xed, 0x43, 0x0a, 0x70, 0x47, 0x10, 0xee, 0x10, 0x0a, + 0x40, 0x00, 0x6f, 0xd0, 0x10, 0xee, 0x90, 0x1a, 0x4f, 0xf0, 0x7c, 0x50, + 0x01, 0xf0, 0x00, 0x41, 0x08, 0x43, 0x01, 0xee, 0x10, 0x0a, 0x70, 0xee, + 0x81, 0x0a, 0x10, 0xee, 0x90, 0x1a, 0x48, 0x00, 0x0f, 0xd0, 0x00, 0x0e, + 0xc0, 0xf1, 0x96, 0x00, 0x18, 0x28, 0xa8, 0xbf, 0x01, 0xf0, 0x00, 0x41, + 0x05, 0xda, 0x00, 0x28, 0xc4, 0xbf, 0x21, 0xfa, 0x00, 0xf2, 0x02, 0xfa, + 0x00, 0xf1, 0x00, 0xee, 0x90, 0x1a, 0x10, 0xee, 0x90, 0x0a, 0x40, 0x00, + 0x17, 0xd0, 0x9f, 0xed, 0x2f, 0x1a, 0x20, 0xee, 0x81, 0x1a, 0xdf, 0xed, + 0x27, 0x1a, 0x01, 0xee, 0x61, 0x0a, 0x9f, 0xed, 0x26, 0x2a, 0x01, 0xee, + 0x42, 0x0a, 0xdf, 0xed, 0x25, 0x2a, 0x01, 0xee, 0x62, 0x0a, 0x9f, 0xed, + 0x24, 0x3a, 0x01, 0xee, 0x43, 0x0a, 0xdf, 0xed, 0x23, 0x1a, 0x01, 0xee, + 0x61, 0x0a, 0xfd, 0xee, 0xe0, 0x0a, 0x10, 0xee, 0x90, 0x0a, 0x10, 0xee, + 0x10, 0x1a, 0x21, 0xf0, 0x00, 0x41, 0x00, 0xee, 0x90, 0x1a, 0x9f, 0xed, + 0x1f, 0x1a, 0xf4, 0xee, 0x41, 0x0a, 0x00, 0xf0, 0x03, 0x00, 0xf1, 0xee, + 0x10, 0xfa, 0x00, 0xf0, 0x01, 0x00, 0x05, 0xd5, 0xf0, 0xb1, 0xff, 0xee, + 0x00, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0x70, 0x47, 0x20, 0xee, 0x00, 0x1a, + 0xdf, 0xed, 0x16, 0x1a, 0x9f, 0xed, 0x16, 0x2a, 0x01, 0xee, 0x21, 0x2a, + 0xf7, 0xee, 0x00, 0x0a, 0x42, 0xee, 0x01, 0x0a, 0x20, 0xee, 0x01, 0x1a, + 0xdf, 0xed, 0x12, 0x2a, 0x01, 0xee, 0x22, 0x0a, 0x20, 0xb1, 0x80, 0xee, + 0x80, 0x0a, 0xb1, 0xee, 0x40, 0x0a, 0x70, 0x47, 0x80, 0xee, 0x20, 0x0a, + 0x70, 0x47, 0x00, 0xbf, 0x83, 0xf9, 0x22, 0x3f, 0x00, 0x00, 0x00, 0x4f, + 0x00, 0x00, 0xc9, 0x46, 0x00, 0xa0, 0xfd, 0x40, 0x00, 0x20, 0xa2, 0x3a, + 0x00, 0x00, 0x34, 0x33, 0x00, 0x30, 0xc2, 0x2e, 0xff, 0xff, 0xff, 0x7f, + 0x00, 0x00, 0x80, 0x38, 0x00, 0x00, 0x80, 0x39, 0x6d, 0x16, 0x1f, 0x3c, + 0x1e, 0xb5, 0xdb, 0xbe, 0x83, 0x29, 0xc4, 0xbd, 0x03, 0x46, 0x10, 0xee, + 0x10, 0x0a, 0xf4, 0x46, 0x00, 0xf0, 0x04, 0xf8, 0x19, 0x60, 0x00, 0xee, + 0x10, 0x0a, 0x60, 0x47, 0xc0, 0xf3, 0xc7, 0x51, 0x29, 0xb1, 0xff, 0x29, + 0x12, 0xd0, 0x7e, 0x39, 0xa0, 0xeb, 0xc1, 0x50, 0x70, 0x47, 0xc0, 0x42, + 0x0d, 0xd0, 0x00, 0xf0, 0x00, 0x42, 0x40, 0x02, 0xb0, 0xfa, 0x80, 0xf1, + 0x88, 0x40, 0x7e, 0x31, 0x49, 0x42, 0x42, 0xea, 0x10, 0x20, 0x00, 0xf1, + 0x7a, 0x50, 0x70, 0x47, 0x00, 0x21, 0x70, 0x47, 0x70, 0xb4, 0x4f, 0xf0, + 0x00, 0x45, 0x91, 0xea, 0x03, 0x0f, 0x72, 0xf1, 0xbd, 0x85, 0x6b, 0x40, + 0x84, 0x1a, 0x71, 0xeb, 0x03, 0x06, 0x04, 0xd2, 0x6e, 0x40, 0x00, 0x1b, + 0xb1, 0x41, 0x12, 0x19, 0x73, 0x41, 0x4f, 0xf4, 0x00, 0x1c, 0x1c, 0xeb, + 0x41, 0x0f, 0x34, 0xbf, 0x7c, 0xeb, 0x43, 0x06, 0x83, 0xe0, 0x0c, 0x0d, + 0xa4, 0xeb, 0x13, 0x56, 0x36, 0x2e, 0x00, 0xf3, 0x7c, 0x80, 0x01, 0x2e, + 0x45, 0xea, 0xc3, 0x23, 0x41, 0xdc, 0x43, 0xea, 0x52, 0x53, 0x12, 0xbf, + 0xd2, 0x02, 0x92, 0x02, 0x5b, 0x08, 0x24, 0x05, 0x45, 0xea, 0xc1, 0x21, + 0x41, 0xea, 0x50, 0x51, 0xd2, 0xeb, 0xc0, 0x20, 0x99, 0x41, 0x25, 0xd4, + 0x07, 0xd1, 0xb0, 0xfa, 0x80, 0xf6, 0x10, 0xfa, 0x06, 0xf1, 0x62, 0xd0, + 0x00, 0x20, 0x20, 0x36, 0x08, 0xe0, 0xb1, 0xfa, 0x81, 0xf6, 0xb1, 0x40, + 0xc6, 0xf1, 0x20, 0x02, 0x20, 0xfa, 0x02, 0xf2, 0x11, 0x43, 0xb0, 0x40, + 0x4f, 0xea, 0xf4, 0x74, 0xb4, 0xeb, 0x46, 0x54, 0x34, 0xf0, 0x01, 0x06, + 0x4f, 0xea, 0x74, 0x04, 0x0a, 0xd8, 0xd6, 0xf5, 0x00, 0x16, 0x76, 0x0d, + 0x04, 0xf0, 0x00, 0x44, 0xf0, 0x40, 0x61, 0xfa, 0x06, 0xf2, 0x50, 0x40, + 0xf1, 0x40, 0x48, 0x40, 0xc0, 0x0a, 0x40, 0xea, 0x41, 0x50, 0x21, 0xf0, + 0x00, 0x41, 0x28, 0xbf, 0x5f, 0xea, 0x50, 0x05, 0x50, 0xf1, 0x00, 0x00, + 0x44, 0xeb, 0xd1, 0x21, 0x35, 0xe0, 0xdb, 0x0a, 0x45, 0xea, 0xc1, 0x21, + 0xc9, 0x0a, 0xb6, 0xf1, 0x20, 0x05, 0x0e, 0xdd, 0x42, 0xea, 0x02, 0x42, + 0x12, 0x0c, 0xc5, 0xf1, 0x20, 0x06, 0x03, 0xfa, 0x06, 0xf6, 0xeb, 0x40, + 0x42, 0xea, 0x06, 0x05, 0x6d, 0x42, 0x98, 0x41, 0x61, 0xf1, 0x00, 0x01, + 0x0d, 0xe0, 0x62, 0xfa, 0x06, 0xf5, 0xf2, 0x40, 0x55, 0x40, 0x63, 0xfa, + 0x06, 0xfc, 0x82, 0xea, 0x0c, 0x02, 0xf3, 0x40, 0x5a, 0x40, 0x6d, 0x42, + 0x90, 0x41, 0x61, 0xeb, 0x03, 0x01, 0x11, 0xf4, 0x80, 0x1f, 0x05, 0xd1, + 0x64, 0x1e, 0x62, 0x05, 0x02, 0xd0, 0x6d, 0x00, 0x40, 0x41, 0x49, 0x41, + 0x21, 0xf4, 0x80, 0x11, 0x43, 0x08, 0x75, 0xf1, 0x00, 0x43, 0x50, 0xf1, + 0x00, 0x00, 0x41, 0xeb, 0x04, 0x51, 0x70, 0xbc, 0x70, 0x47, 0x1c, 0xeb, + 0x41, 0x0f, 0x15, 0xd2, 0x23, 0xf0, 0x00, 0x43, 0x52, 0xea, 0x43, 0x06, + 0x0b, 0xd0, 0x4f, 0xea, 0x4c, 0x0c, 0xbc, 0xeb, 0x41, 0x0f, 0x04, 0xd8, + 0x0c, 0x0d, 0x66, 0x1e, 0x34, 0x2e, 0xb7, 0xdd, 0xeb, 0xe7, 0x80, 0x1a, + 0x99, 0x41, 0x50, 0xea, 0x41, 0x06, 0x08, 0xbf, 0x00, 0x21, 0xe4, 0xe7, + 0x08, 0xbf, 0x1c, 0xeb, 0x43, 0x0f, 0x28, 0xbf, 0x6f, 0xf0, 0x00, 0x01, + 0xdd, 0xe7, 0x00, 0x00, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x38, 0xb5, 0x35, 0x49, + 0x51, 0xf8, 0x20, 0x40, 0x04, 0xf2, 0x14, 0x75, 0x00, 0x23, 0x02, 0x22, + 0x01, 0x21, 0x28, 0x46, 0xff, 0xf7, 0xe6, 0xff, 0x04, 0xf2, 0x1c, 0x74, + 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x28, 0x46, 0xff, 0xf7, 0xde, 0xff, + 0x20, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x00, 0x23, 0x01, 0x22, + 0x00, 0x21, 0xd5, 0xe7, 0x10, 0xb5, 0x27, 0x4c, 0x54, 0xf8, 0x20, 0x00, + 0xbd, 0xe8, 0x10, 0x40, 0x81, 0xf0, 0x01, 0x03, 0x01, 0x22, 0x00, 0x21, + 0x00, 0xf5, 0xe2, 0x60, 0xc8, 0xe7, 0x00, 0x00, 0x2d, 0xe9, 0xff, 0x47, + 0x00, 0x25, 0x00, 0x29, 0x37, 0xd0, 0x1f, 0x49, 0x0f, 0xf2, 0x8c, 0x0a, + 0x0f, 0xf2, 0xc4, 0x04, 0x28, 0xa6, 0x01, 0xeb, 0x00, 0x59, 0x1c, 0x49, + 0x01, 0xeb, 0x00, 0x58, 0x00, 0x27, 0x56, 0xf8, 0x27, 0x00, 0x48, 0x44, + 0x01, 0x78, 0xe2, 0x5d, 0x91, 0x42, 0x08, 0xd0, 0x02, 0x92, 0x01, 0x91, + 0x00, 0x90, 0x3b, 0x46, 0x00, 0xf0, 0x2a, 0xf8, 0x0d, 0xf0, 0x2e, 0xfb, + 0x6d, 0x1c, 0x7f, 0x1c, 0x08, 0x2f, 0xec, 0xd3, 0x5f, 0xf0, 0x00, 0x06, + 0x0f, 0xf2, 0x9c, 0x07, 0x23, 0xa4, 0x54, 0xf8, 0x26, 0x00, 0x40, 0x44, + 0x01, 0x68, 0x57, 0xf8, 0x26, 0x20, 0x91, 0x42, 0x08, 0xd0, 0x02, 0x92, + 0x01, 0x91, 0x00, 0x90, 0x33, 0x46, 0x00, 0xf0, 0x11, 0xf8, 0x0d, 0xf0, + 0x15, 0xfb, 0x6d, 0x1c, 0x76, 0x1c, 0x03, 0x2e, 0xeb, 0xd3, 0xe8, 0xb2, + 0x04, 0xb0, 0xbd, 0xe8, 0xf0, 0x87, 0x00, 0x00, 0x08, 0x94, 0x04, 0x01, + 0x00, 0x00, 0x0c, 0x60, 0x00, 0x00, 0x0d, 0x60, 0x52, 0x46, 0x02, 0x21, + 0x01, 0x20, 0x0d, 0xf0, 0x18, 0xbb, 0x00, 0x00, 0x76, 0x65, 0x72, 0x5b, + 0x25, 0x64, 0x5d, 0x3a, 0x20, 0x30, 0x78, 0x25, 0x58, 0x3a, 0x20, 0x25, + 0x58, 0x20, 0x21, 0x3d, 0x20, 0x25, 0x58, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, + 0x52, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, + 0x95, 0x00, 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x12, + 0x80, 0x80, 0x40, 0x39, 0x3c, 0x0d, 0x00, 0x00, 0x70, 0x0d, 0x00, 0x00, + 0x80, 0x0f, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, + 0x90, 0xf8, 0x00, 0x00, 0xf8, 0xb5, 0x0d, 0x46, 0x1b, 0xa6, 0x06, 0xeb, + 0xc5, 0x01, 0x04, 0x46, 0x4f, 0x68, 0x38, 0x46, 0x17, 0xf0, 0x2c, 0xfb, + 0x01, 0x21, 0x01, 0xfa, 0x04, 0xf4, 0x44, 0xea, 0x00, 0x01, 0x38, 0x46, + 0x17, 0xf0, 0xf9, 0xfa, 0x38, 0x46, 0x17, 0xf0, 0x65, 0xfa, 0x56, 0xf8, + 0x35, 0x10, 0x38, 0x46, 0x17, 0xf0, 0xcb, 0xfa, 0x38, 0x46, 0xbd, 0xe8, + 0xf2, 0x40, 0x17, 0xf0, 0xac, 0xba, 0x00, 0x00, 0x00, 0x20, 0x01, 0xe0, + 0x01, 0x20, 0x00, 0xbf, 0x70, 0xb5, 0x04, 0x46, 0x09, 0xa1, 0x01, 0xeb, + 0xc4, 0x03, 0x00, 0x26, 0x58, 0x68, 0x17, 0xf0, 0x58, 0xfa, 0x05, 0x46, + 0x25, 0xfa, 0x06, 0xf0, 0xc0, 0x07, 0x03, 0xd5, 0x21, 0x46, 0x30, 0x46, + 0x30, 0xf0, 0x8a, 0xfe, 0x76, 0x1c, 0x08, 0x2e, 0xf4, 0xd3, 0x70, 0xbd, + 0x06, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0xf8, 0xb5, 0x0d, 0x46, 0x26, 0xa6, 0x06, 0xeb, + 0xc5, 0x01, 0x04, 0x46, 0x4f, 0x68, 0x38, 0x46, 0x17, 0xf0, 0xea, 0xfa, + 0x01, 0x21, 0x01, 0xfa, 0x04, 0xf4, 0x44, 0xea, 0x00, 0x01, 0x38, 0x46, + 0x17, 0xf0, 0xb7, 0xfa, 0x38, 0x46, 0x17, 0xf0, 0x23, 0xfa, 0x56, 0xf8, + 0x35, 0x10, 0x38, 0x46, 0x17, 0xf0, 0x89, 0xfa, 0x38, 0x46, 0xbd, 0xe8, + 0xf2, 0x40, 0x17, 0xf0, 0x6a, 0xba, 0x00, 0x00, 0x00, 0x20, 0x05, 0xe0, + 0x01, 0x20, 0x03, 0xe0, 0x02, 0x20, 0x01, 0xe0, 0x03, 0x20, 0x00, 0xbf, + 0x70, 0xb5, 0x04, 0x46, 0x12, 0xa1, 0x01, 0xeb, 0xc4, 0x03, 0x00, 0x26, + 0x58, 0x68, 0x17, 0xf0, 0x12, 0xfa, 0x05, 0x46, 0x25, 0xfa, 0x06, 0xf0, + 0xc0, 0x07, 0x03, 0xd5, 0x21, 0x46, 0x30, 0x46, 0x31, 0xf0, 0x33, 0xf9, + 0x76, 0x1c, 0x01, 0x2e, 0xf4, 0xd9, 0x70, 0xbd, 0x70, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x00, 0x26, 0x25, 0xfa, 0x06, 0xf0, 0xc0, 0x07, 0x03, 0xd5, + 0xf1, 0xb2, 0x20, 0x46, 0x31, 0xf0, 0x40, 0xf9, 0x76, 0x1c, 0xf0, 0xb2, + 0x04, 0x28, 0xf3, 0xd3, 0x70, 0xbd, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x52, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x55, 0x00, 0x00, 0x00, 0x00, 0x42, 0x48, 0xbf, 0xb1, 0xee, 0x41, 0x1a, + 0x00, 0xee, 0x21, 0x1a, 0xbd, 0xee, 0xc1, 0x1a, 0x11, 0xee, 0x10, 0xca, + 0xb8, 0xee, 0xc1, 0x1a, 0x01, 0xee, 0x62, 0x0a, 0x01, 0xee, 0x43, 0x0a, + 0xb0, 0xee, 0xc0, 0x1a, 0xb4, 0xee, 0x63, 0x1a, 0xf1, 0xee, 0x10, 0xfa, + 0x61, 0x44, 0x01, 0xf1, 0x7f, 0x01, 0x13, 0xd4, 0x20, 0xee, 0x00, 0x1a, + 0x61, 0xee, 0x04, 0x2a, 0xb0, 0xee, 0x62, 0x3a, 0x01, 0xee, 0x24, 0x5a, + 0x40, 0xee, 0x05, 0x2a, 0x72, 0xee, 0xa5, 0x2a, 0x00, 0xee, 0x45, 0x3a, + 0x33, 0xee, 0x25, 0x3a, 0xc2, 0xee, 0x83, 0x2a, 0x60, 0xee, 0xa2, 0x0a, + 0x19, 0xb3, 0xff, 0x29, 0x4f, 0xea, 0xc1, 0x5c, 0x00, 0xee, 0x10, 0xca, + 0x0f, 0xd2, 0x20, 0xee, 0x20, 0x0a, 0xb5, 0xee, 0x40, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x10, 0xee, 0x10, 0x0a, 0x4f, 0xf0, 0x80, 0x7c, 0x18, 0xbf, + 0x1c, 0xeb, 0x40, 0x0f, 0xaf, 0xf3, 0x00, 0x80, 0x70, 0x47, 0x01, 0x29, + 0x0b, 0xdb, 0x7f, 0x39, 0xff, 0x29, 0x4f, 0xea, 0xc1, 0x5c, 0x36, 0xbf, + 0x00, 0xee, 0x10, 0xca, 0xb0, 0xee, 0x42, 0x0a, 0x60, 0xee, 0x86, 0x0a, + 0xe1, 0xe7, 0x7e, 0x31, 0x01, 0x29, 0x4f, 0xea, 0xc1, 0x5c, 0xaa, 0xbf, + 0x00, 0xee, 0x10, 0xca, 0x30, 0xee, 0xe0, 0x0a, 0x60, 0xee, 0xa6, 0x0a, + 0xd5, 0xe7, 0x10, 0xee, 0x90, 0xca, 0x1c, 0xeb, 0x0c, 0x0f, 0x00, 0x42, + 0x54, 0xbf, 0xb0, 0xee, 0x42, 0x0a, 0x31, 0xee, 0x41, 0x0a, 0x28, 0xbf, + 0xb1, 0xee, 0x40, 0x0a, 0xaf, 0xf3, 0x00, 0x80, 0x70, 0x47, 0x38, 0xb5, + 0x0d, 0x46, 0x04, 0x46, 0x69, 0x46, 0x19, 0xf0, 0x76, 0xfd, 0x05, 0xf1, + 0x08, 0x01, 0x20, 0x46, 0x0c, 0xf0, 0x9e, 0xf8, 0x2c, 0x60, 0x00, 0x98, + 0x68, 0x60, 0x20, 0x46, 0x0d, 0xf0, 0x25, 0xf8, 0xe8, 0x60, 0x00, 0x98, + 0x0d, 0xf0, 0x3e, 0xf8, 0x28, 0x61, 0x20, 0x46, 0x0c, 0xf0, 0x0e, 0xff, + 0x68, 0x61, 0x20, 0x46, 0x0c, 0xf0, 0x14, 0xff, 0xa8, 0x61, 0x00, 0x20, + 0xe8, 0x61, 0x28, 0x62, 0x31, 0xbd, 0xf8, 0xb5, 0x05, 0x46, 0x14, 0x46, + 0x2a, 0x6a, 0x50, 0x20, 0x42, 0x43, 0xa8, 0x18, 0x1e, 0x46, 0x00, 0xf1, + 0x24, 0x07, 0x19, 0xb1, 0x24, 0x22, 0x38, 0x46, 0xff, 0xf7, 0x12, 0xf8, + 0x2c, 0xb1, 0x20, 0x22, 0x21, 0x46, 0x07, 0xf1, 0x24, 0x00, 0xff, 0xf7, + 0x0b, 0xf8, 0x0a, 0x9c, 0xbd, 0xf9, 0x24, 0x30, 0xbd, 0xf9, 0x20, 0x20, + 0x07, 0x98, 0x06, 0x99, 0x07, 0xf8, 0x44, 0x6f, 0xb8, 0x70, 0x79, 0x70, + 0xba, 0x80, 0xfb, 0x80, 0xbc, 0x60, 0x28, 0x6a, 0x40, 0x1c, 0x00, 0xf0, + 0x0f, 0x00, 0x28, 0x62, 0xe8, 0x69, 0x0f, 0x28, 0x9c, 0xbf, 0x40, 0x1c, + 0xe8, 0x61, 0xf1, 0xbd, 0x08, 0x31, 0x0c, 0xf0, 0x55, 0xb8, 0x00, 0x00, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x70, 0xb5, 0x26, 0x49, 0x51, 0xf8, 0x20, 0x40, + 0x04, 0xf1, 0x74, 0x05, 0x00, 0x23, 0x2e, 0x68, 0x00, 0xf0, 0x09, 0xf8, + 0x78, 0x34, 0x06, 0xf0, 0x01, 0x03, 0x24, 0x68, 0x00, 0xf0, 0x03, 0xf8, + 0x24, 0x02, 0x20, 0x0e, 0x70, 0xbd, 0x01, 0x22, 0x00, 0x21, 0x28, 0x46, + 0xda, 0xe7, 0x1c, 0x4a, 0x52, 0xf8, 0x20, 0x00, 0x50, 0xf8, 0x31, 0x00, + 0x40, 0x03, 0x00, 0x0e, 0x70, 0x47, 0x18, 0x4b, 0x53, 0xf8, 0x20, 0x00, + 0x00, 0xeb, 0xc1, 0x00, 0x12, 0x05, 0x41, 0x68, 0x21, 0xf0, 0x7c, 0x71, + 0x02, 0xf0, 0x7c, 0x72, 0x0a, 0x43, 0x42, 0x60, 0x70, 0x47, 0x11, 0x4a, + 0x52, 0xf8, 0x20, 0x00, 0x00, 0xeb, 0xc1, 0x01, 0x48, 0x68, 0x00, 0x0d, + 0x00, 0xf0, 0x3f, 0x00, 0x70, 0x47, 0x38, 0xb5, 0x0c, 0x46, 0x0a, 0x49, + 0x51, 0xf8, 0x20, 0x50, 0x23, 0x46, 0x4f, 0xf0, 0x7f, 0x42, 0x18, 0x21, + 0x05, 0xf1, 0x80, 0x00, 0xff, 0xf7, 0xae, 0xff, 0x23, 0x46, 0x05, 0xf1, + 0x7c, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x4f, 0xf4, 0x7f, 0x42, + 0x08, 0x21, 0xa3, 0xe7, 0xa8, 0x94, 0x04, 0x01, 0x68, 0x95, 0x04, 0x01, + 0x00, 0x00, 0x21, 0x15, 0x11, 0x0e, 0x0d, 0x0c, 0x0b, 0x0b, 0x0a, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x00, 0x00, 0x00, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, + 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, + 0x77, 0x78, 0x79, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x06, 0x21, 0x11, 0x4a, + 0x01, 0xe0, 0x06, 0x21, 0x10, 0x4a, 0x48, 0x43, 0x10, 0x44, 0x27, 0xe0, + 0x0f, 0x49, 0x00, 0xeb, 0x40, 0x00, 0x08, 0x44, 0x22, 0xe0, 0x0e, 0x49, + 0x01, 0xeb, 0x40, 0x01, 0x08, 0x78, 0x70, 0x47, 0x0c, 0x48, 0x00, 0x78, + 0xff, 0xe7, 0x00, 0xf0, 0x01, 0x00, 0x70, 0x47, 0x0a, 0x49, 0x08, 0x70, + 0x70, 0x47, 0x09, 0x4a, 0x10, 0x70, 0x51, 0x70, 0x08, 0x0a, 0x90, 0x70, + 0x09, 0x0c, 0xd1, 0x70, 0x70, 0x47, 0x00, 0x00, 0x2a, 0x02, 0x00, 0x47, + 0x2d, 0x02, 0x00, 0x47, 0xaa, 0x02, 0x00, 0x47, 0x8a, 0x02, 0x00, 0x47, + 0xc2, 0x02, 0x00, 0x47, 0x23, 0x02, 0x00, 0x47, 0x01, 0x46, 0x08, 0x78, + 0x4a, 0x78, 0x89, 0x78, 0x40, 0xea, 0x02, 0x20, 0x40, 0xea, 0x01, 0x40, + 0x02, 0x02, 0x48, 0xbf, 0x40, 0xf0, 0x7f, 0x40, 0x70, 0x47, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb7, 0x1d, 0xc1, 0x04, 0x6e, 0x3b, 0x82, 0x09, + 0xd9, 0x26, 0x43, 0x0d, 0xdc, 0x76, 0x04, 0x13, 0x6b, 0x6b, 0xc5, 0x17, + 0xb2, 0x4d, 0x86, 0x1a, 0x05, 0x50, 0x47, 0x1e, 0xb8, 0xed, 0x08, 0x26, + 0x0f, 0xf0, 0xc9, 0x22, 0xd6, 0xd6, 0x8a, 0x2f, 0x61, 0xcb, 0x4b, 0x2b, + 0x64, 0x9b, 0x0c, 0x35, 0xd3, 0x86, 0xcd, 0x31, 0x0a, 0xa0, 0x8e, 0x3c, + 0xbd, 0xbd, 0x4f, 0x38, 0x01, 0x23, 0x00, 0x22, 0xf0, 0xb5, 0x00, 0x25, + 0x12, 0x4e, 0x10, 0xe0, 0x47, 0x5d, 0x3c, 0x09, 0x44, 0xea, 0x02, 0x14, + 0x12, 0x0f, 0x56, 0xf8, 0x22, 0x20, 0x54, 0x40, 0x07, 0xf0, 0x0f, 0x02, + 0x42, 0xea, 0x04, 0x12, 0x24, 0x0f, 0x56, 0xf8, 0x24, 0x40, 0x62, 0x40, + 0x6d, 0x1c, 0x8d, 0x42, 0xec, 0xd3, 0x63, 0xb1, 0x04, 0x20, 0x11, 0x0f, + 0x56, 0xf8, 0x21, 0x10, 0x81, 0xea, 0x02, 0x11, 0x0a, 0x0f, 0x56, 0xf8, + 0x22, 0x20, 0x40, 0x1e, 0x82, 0xea, 0x01, 0x12, 0xf3, 0xd1, 0x10, 0x46, + 0xf0, 0xbd, 0x00, 0x00, 0x7c, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfa, 0xfa, 0xfa, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, + 0xf9, 0xfc, 0xfb, 0xfb, 0xfa, 0xfa, 0xfa, 0xf9, 0xf9, 0xf9, 0xfe, 0xfd, + 0xfc, 0xfb, 0xfb, 0xfb, 0xfa, 0xfa, 0xf9, 0x00, 0xff, 0xfe, 0xfd, 0xfc, + 0xfc, 0xfb, 0xfb, 0xfa, 0x01, 0x00, 0xff, 0xfe, 0xfd, 0xfc, 0xfc, 0xfb, + 0xfb, 0x02, 0x01, 0x00, 0xff, 0xfe, 0xfd, 0xfc, 0xfc, 0xfb, 0x03, 0x02, + 0x01, 0x00, 0xff, 0xfe, 0xfd, 0xfc, 0xfc, 0x04, 0x03, 0x02, 0x01, 0x00, + 0xff, 0xfe, 0xfd, 0xfc, 0x04, 0x04, 0x03, 0x02, 0x01, 0x00, 0xff, 0xfe, + 0xfd, 0x05, 0x04, 0x04, 0x03, 0x02, 0x01, 0x00, 0xff, 0xfe, 0x05, 0x05, + 0x04, 0x04, 0x03, 0x02, 0x01, 0x00, 0xff, 0x06, 0x05, 0x05, 0x04, 0x04, + 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x06, 0x05, 0x05, 0x05, 0x04, 0x03, + 0x02, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x05, 0x05, 0x04, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0xb8, 0x41, + 0xb8, 0x1e, 0x45, 0x40, 0x7b, 0x14, 0x71, 0x42, 0x85, 0xeb, 0xd5, 0x41, + 0x00, 0x00, 0x30, 0x42, 0xae, 0x47, 0x97, 0x41, 0x00, 0x00, 0x50, 0x41, + 0x71, 0xbd, 0xa8, 0x42, 0xa4, 0x70, 0x1e, 0x42, 0xb5, 0x37, 0xb8, 0x3e, + 0xe6, 0x3f, 0xdc, 0xbf, 0xee, 0x7c, 0x23, 0x40, 0x34, 0x80, 0xc7, 0x3f, + 0x1a, 0xc0, 0x3f, 0xc0, 0xd6, 0xc5, 0x9d, 0x3f, 0x00, 0x00, 0x20, 0x41, + 0x66, 0x66, 0xae, 0x40, 0x7b, 0x14, 0x71, 0x42, 0x85, 0xeb, 0xd5, 0x41, + 0x00, 0x00, 0x30, 0x42, 0xc3, 0xf5, 0x4c, 0x41, 0x48, 0xe1, 0x0e, 0x41, + 0xec, 0x51, 0x5a, 0x42, 0x48, 0xe1, 0x9c, 0x41, 0x5f, 0x98, 0x4c, 0x3e, + 0xb5, 0xa6, 0x35, 0xc0, 0x6a, 0xbc, 0x94, 0x40, 0xd1, 0x22, 0x0b, 0x40, + 0xbb, 0x27, 0x7f, 0xc0, 0xa5, 0x4e, 0x50, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0xb5, 0x06, 0x46, 0x0c, 0x46, 0x00, 0x20, 0x06, 0xf1, 0xa8, 0x05, + 0x1c, 0xb3, 0xa1, 0x68, 0x29, 0x60, 0x02, 0x22, 0xe1, 0x68, 0x69, 0x60, + 0x0a, 0x76, 0x21, 0x68, 0x71, 0x60, 0x62, 0x68, 0x32, 0x60, 0x61, 0x68, + 0xb1, 0x60, 0x22, 0x68, 0x06, 0xeb, 0x80, 0x01, 0x02, 0xeb, 0xc0, 0x12, + 0x40, 0x1c, 0x01, 0x28, 0xca, 0x60, 0xf6, 0xd9, 0x20, 0x6a, 0xe8, 0x60, + 0x30, 0x46, 0x21, 0x69, 0xa9, 0x60, 0x22, 0x6b, 0x2a, 0x61, 0x00, 0xf0, + 0x5d, 0xf8, 0x30, 0x46, 0x00, 0xf0, 0x6e, 0xf8, 0x69, 0x68, 0x03, 0x20, + 0x08, 0x76, 0x00, 0x20, 0x69, 0x68, 0x08, 0x60, 0x00, 0x22, 0x68, 0x68, + 0x42, 0x60, 0x01, 0x21, 0x68, 0x68, 0x82, 0x60, 0x68, 0x68, 0xc2, 0x60, + 0x68, 0x68, 0x02, 0x61, 0x68, 0x68, 0x41, 0x75, 0x0a, 0x21, 0x68, 0x68, + 0x01, 0x75, 0x03, 0x21, 0x68, 0x68, 0x81, 0x75, 0xb1, 0x68, 0x01, 0xf2, + 0x04, 0x71, 0x08, 0x68, 0x69, 0x68, 0xc8, 0x75, 0x30, 0x46, 0x69, 0x68, + 0x81, 0xf8, 0x24, 0x20, 0x69, 0x68, 0x81, 0xf8, 0x25, 0x20, 0x69, 0x68, + 0x4a, 0x76, 0x69, 0x68, 0xca, 0x76, 0x69, 0x68, 0x8a, 0x76, 0x69, 0x68, + 0xca, 0x61, 0x69, 0x68, 0x0a, 0x62, 0x21, 0x46, 0x00, 0xf0, 0x04, 0xf9, + 0x04, 0x46, 0x30, 0x46, 0x00, 0xf0, 0x9a, 0xfb, 0x30, 0x46, 0x00, 0xf0, + 0x78, 0xfc, 0x30, 0x46, 0x00, 0xf0, 0x2e, 0xfb, 0x30, 0x46, 0x00, 0xf0, + 0x5d, 0xfb, 0xe8, 0x68, 0x00, 0x21, 0xca, 0xb2, 0x00, 0xeb, 0x82, 0x02, + 0x49, 0x1c, 0xd2, 0x6b, 0x02, 0xf5, 0x44, 0x72, 0x13, 0x68, 0x43, 0xf0, + 0x01, 0x03, 0x13, 0x60, 0xca, 0xb2, 0x01, 0x2a, 0xf1, 0xd9, 0x00, 0x21, + 0x30, 0x46, 0x00, 0xf0, 0x8d, 0xf8, 0x6a, 0x68, 0x01, 0x21, 0x11, 0x76, + 0x20, 0x43, 0x70, 0xbd, 0x41, 0x6b, 0x08, 0x47, 0x0f, 0xf2, 0x29, 0x51, + 0x0f, 0xf2, 0xe1, 0x22, 0x81, 0x61, 0xc2, 0x61, 0x0f, 0xf2, 0x09, 0x31, + 0x01, 0x62, 0x41, 0x62, 0x0f, 0xf2, 0x1d, 0x52, 0x0f, 0xf2, 0xb5, 0x41, + 0xc1, 0x62, 0x82, 0x62, 0x0f, 0xf2, 0x21, 0x51, 0x01, 0x63, 0x70, 0x47, + 0x10, 0xb5, 0x00, 0xf1, 0x84, 0x01, 0x1c, 0x4a, 0x1c, 0x4b, 0x0a, 0x60, + 0x4b, 0x60, 0x1c, 0x4a, 0x1c, 0x4b, 0xca, 0x60, 0x0b, 0x61, 0x1c, 0x4a, + 0x1c, 0x4b, 0x4a, 0x61, 0xcb, 0x61, 0x1c, 0x4c, 0x1c, 0x4a, 0x1d, 0x4b, + 0x8c, 0x60, 0x0a, 0x62, 0x8b, 0x61, 0x1c, 0x49, 0x1c, 0x4a, 0xc1, 0x63, + 0x02, 0x64, 0x1c, 0x49, 0x1c, 0x4a, 0x41, 0x64, 0x82, 0x64, 0x1c, 0x49, + 0x1c, 0x4a, 0xc1, 0x64, 0x02, 0x65, 0x1c, 0x49, 0x1c, 0x4a, 0x81, 0x65, + 0xc2, 0x65, 0x1c, 0x49, 0x1c, 0x4a, 0x41, 0x65, 0x02, 0x66, 0x1c, 0x49, + 0x1c, 0x4a, 0x41, 0x66, 0x82, 0x66, 0x1c, 0x49, 0x1c, 0x4a, 0xc1, 0x66, + 0x02, 0x67, 0x1c, 0x49, 0x1c, 0x4a, 0x41, 0x67, 0xc2, 0x67, 0x1c, 0x49, + 0x1c, 0x4a, 0xc0, 0xf8, 0x80, 0x10, 0x82, 0x67, 0x10, 0xbd, 0x00, 0x00, + 0xe5, 0x3a, 0x00, 0x01, 0xf1, 0x3a, 0x00, 0x01, 0x19, 0x3b, 0x00, 0x01, + 0x2f, 0x3b, 0x00, 0x01, 0x3b, 0x3b, 0x00, 0x01, 0x47, 0x3b, 0x00, 0x01, + 0x0d, 0x3b, 0x00, 0x01, 0x4f, 0x3b, 0x00, 0x01, 0x57, 0x3b, 0x00, 0x01, + 0xd9, 0x3b, 0x00, 0x01, 0xe5, 0x3b, 0x00, 0x01, 0x01, 0x3c, 0x00, 0x01, + 0x0d, 0x3c, 0x00, 0x01, 0x23, 0x3c, 0x00, 0x01, 0x2f, 0x3c, 0x00, 0x01, + 0x3b, 0x3c, 0x00, 0x01, 0x43, 0x3c, 0x00, 0x01, 0x4b, 0x3c, 0x00, 0x01, + 0x5f, 0x3b, 0x00, 0x01, 0x6b, 0x3b, 0x00, 0x01, 0x87, 0x3b, 0x00, 0x01, + 0x93, 0x3b, 0x00, 0x01, 0xa9, 0x3b, 0x00, 0x01, 0xb5, 0x3b, 0x00, 0x01, + 0xc1, 0x3b, 0x00, 0x01, 0xc9, 0x3b, 0x00, 0x01, 0xd1, 0x3b, 0x00, 0x01, + 0x30, 0xb5, 0x02, 0x46, 0x00, 0x20, 0x07, 0x29, 0x09, 0xda, 0x02, 0xf1, + 0x34, 0x04, 0xa5, 0x6f, 0x85, 0xf8, 0x24, 0x10, 0x02, 0xeb, 0x81, 0x01, + 0x8a, 0x69, 0x22, 0x60, 0x30, 0xbd, 0x01, 0x20, 0x30, 0xbd, 0xd0, 0xf8, + 0xac, 0x00, 0x00, 0x7e, 0x70, 0x47, 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, + 0xa1, 0x6b, 0x88, 0x47, 0x62, 0x19, 0x01, 0x20, 0x10, 0x75, 0x31, 0xbd, + 0x70, 0xb5, 0x00, 0xf1, 0xac, 0x05, 0x0c, 0x46, 0x28, 0x68, 0x01, 0x68, + 0x21, 0x60, 0x00, 0x26, 0xa8, 0x68, 0xf1, 0xb2, 0x01, 0xf0, 0x90, 0xfb, + 0xf1, 0xb2, 0x04, 0xeb, 0x81, 0x01, 0x76, 0x1c, 0x48, 0x60, 0xf0, 0xb2, + 0x02, 0x28, 0xf3, 0xd3, 0x68, 0x68, 0x00, 0x21, 0x01, 0xf0, 0xdb, 0xfe, + 0xe0, 0x60, 0x00, 0x26, 0xe8, 0x68, 0xf1, 0xb2, 0x02, 0xf0, 0xb8, 0xfb, + 0xf1, 0xb2, 0x04, 0xeb, 0x81, 0x01, 0x76, 0x1c, 0x08, 0x61, 0xf0, 0xb2, + 0x02, 0x28, 0xf3, 0xd3, 0x70, 0xbd, 0x10, 0xb5, 0x00, 0xf1, 0xac, 0x04, + 0x00, 0x21, 0x22, 0x68, 0x11, 0x60, 0xa0, 0x68, 0x01, 0xf0, 0x71, 0xfb, + 0x60, 0x68, 0x01, 0xf0, 0xc4, 0xfe, 0xe0, 0x68, 0xbd, 0xe8, 0x10, 0x40, + 0x02, 0xf0, 0xa2, 0xbb, 0x78, 0xb5, 0x0c, 0x46, 0xa1, 0xb0, 0x00, 0x25, + 0x00, 0x21, 0x1c, 0xb9, 0x01, 0x21, 0x8d, 0xf8, 0x55, 0x10, 0x27, 0xe0, + 0x8d, 0xf8, 0x55, 0x10, 0x15, 0xab, 0x62, 0x68, 0x16, 0x92, 0x22, 0x68, + 0x03, 0xeb, 0x81, 0x06, 0x02, 0xeb, 0xc1, 0x12, 0x49, 0x1c, 0x01, 0x29, + 0x32, 0x61, 0xf6, 0xd9, 0x21, 0x68, 0xc0, 0x31, 0x1b, 0x91, 0x00, 0x21, + 0x15, 0xaa, 0x63, 0x68, 0x02, 0xeb, 0x81, 0x02, 0x03, 0xeb, 0xc1, 0x23, + 0x93, 0x60, 0x4f, 0xf4, 0x7a, 0x76, 0x63, 0x6a, 0x1c, 0x93, 0x4e, 0x43, + 0xe3, 0x6a, 0x1e, 0x44, 0x16, 0x62, 0xa3, 0x6a, 0x03, 0xeb, 0xc1, 0x16, + 0x49, 0x1c, 0x01, 0x29, 0x96, 0x62, 0xe9, 0xd9, 0x00, 0xf1, 0xa8, 0x06, + 0x15, 0xa9, 0xf0, 0x68, 0x00, 0xf0, 0x9c, 0xfc, 0x00, 0xb1, 0x01, 0x25, + 0x30, 0x68, 0x41, 0x68, 0x11, 0x91, 0x1c, 0xb9, 0x01, 0x20, 0x8d, 0xf8, + 0x40, 0x00, 0x24, 0xe0, 0x00, 0x20, 0x8d, 0xf8, 0x40, 0x00, 0x09, 0xaa, + 0x60, 0x69, 0x12, 0x90, 0xa0, 0x69, 0x14, 0x90, 0x60, 0x68, 0x0a, 0x90, + 0x00, 0x20, 0x21, 0x68, 0x02, 0xeb, 0x80, 0x03, 0x01, 0xeb, 0xc0, 0x11, + 0x40, 0x1c, 0x01, 0x28, 0x99, 0x60, 0xf6, 0xd9, 0x60, 0x68, 0x09, 0x90, + 0x00, 0x20, 0x61, 0x68, 0x02, 0xeb, 0x80, 0x03, 0x01, 0xeb, 0xc0, 0x21, + 0x40, 0x1c, 0x01, 0x28, 0x59, 0x61, 0xf6, 0xd9, 0x20, 0x68, 0x50, 0x30, + 0x0d, 0x90, 0xe0, 0x69, 0x13, 0x90, 0x09, 0xa9, 0xb0, 0x68, 0x01, 0xf0, + 0x05, 0xfb, 0x00, 0xb1, 0x01, 0x25, 0x30, 0x68, 0x81, 0x68, 0x01, 0x91, + 0x1c, 0xb9, 0x01, 0x21, 0x8d, 0xf8, 0x00, 0x10, 0x18, 0xe0, 0x00, 0x22, + 0x8d, 0xf8, 0x00, 0x20, 0x60, 0x6b, 0x05, 0x90, 0xa0, 0x6b, 0x08, 0x90, + 0x60, 0x68, 0x04, 0x90, 0x00, 0x20, 0x69, 0x46, 0x62, 0x68, 0x01, 0xeb, + 0x80, 0x01, 0x02, 0xeb, 0xc0, 0x22, 0x8a, 0x60, 0x3c, 0x23, 0xe2, 0x6b, + 0x43, 0x43, 0x40, 0x1c, 0x13, 0x44, 0x01, 0x28, 0x8b, 0x61, 0xf0, 0xd9, + 0x30, 0x69, 0x69, 0x46, 0x01, 0xf0, 0x32, 0xfe, 0x00, 0xb1, 0x01, 0x25, + 0x28, 0x46, 0x22, 0xb0, 0x70, 0xbd, 0x00, 0x00, 0x38, 0xb5, 0x04, 0x46, + 0x02, 0x20, 0xd4, 0xf8, 0xac, 0x20, 0x10, 0x76, 0x00, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0x00, 0xfe, 0x05, 0x46, 0xd4, 0xf8, 0xac, 0x00, 0x03, 0x22, + 0x02, 0x76, 0x00, 0xf0, 0xdf, 0xf8, 0xd4, 0xf8, 0xac, 0x20, 0x01, 0x21, + 0x11, 0x76, 0x28, 0x43, 0x32, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x04, 0x46, + 0x04, 0xf1, 0xa8, 0x06, 0x00, 0x25, 0x70, 0x68, 0xc1, 0x68, 0x49, 0x1c, + 0xc1, 0x60, 0x24, 0x27, 0x71, 0x68, 0x08, 0x7e, 0x01, 0x28, 0x11, 0xd0, + 0x08, 0x28, 0x27, 0xd0, 0x09, 0x28, 0x00, 0xf0, 0xab, 0x80, 0x0a, 0x28, + 0x6b, 0xd0, 0x0b, 0x28, 0x00, 0xf0, 0x97, 0x80, 0x0d, 0x28, 0x77, 0xd0, + 0x0e, 0x28, 0x31, 0xd0, 0x0f, 0x28, 0x18, 0xbf, 0x10, 0x28, 0x36, 0xd1, + 0x4d, 0x76, 0x70, 0x68, 0x10, 0xf8, 0x24, 0x1f, 0x02, 0x29, 0x03, 0xd1, + 0x45, 0x70, 0x71, 0x68, 0xcd, 0x76, 0x05, 0xe0, 0x03, 0x29, 0x03, 0xd1, + 0x01, 0x21, 0x41, 0x70, 0x71, 0x68, 0x8d, 0x76, 0x25, 0x75, 0x65, 0x75, + 0x20, 0x46, 0x00, 0xf0, 0xb5, 0xf9, 0x70, 0x68, 0x08, 0x21, 0x83, 0xe0, + 0x48, 0x7e, 0x78, 0x43, 0x20, 0x44, 0x41, 0x6d, 0xa1, 0x63, 0x70, 0x68, + 0x00, 0xf1, 0x19, 0x01, 0x08, 0x7b, 0x20, 0xb9, 0x00, 0xf0, 0x88, 0xf8, + 0xca, 0x6b, 0x90, 0x47, 0x7e, 0xe0, 0x01, 0x28, 0x7d, 0xd1, 0x00, 0xf0, + 0x81, 0xf8, 0x0a, 0x6c, 0x90, 0x47, 0x77, 0xe0, 0x49, 0x7e, 0x00, 0xf0, + 0x7c, 0xf8, 0x8a, 0x6d, 0x90, 0x47, 0x18, 0xb1, 0x02, 0x28, 0xde, 0xd0, + 0x02, 0xd3, 0x71, 0xe0, 0x0a, 0x20, 0x6d, 0xe0, 0x70, 0x68, 0x41, 0x7e, + 0x49, 0x1c, 0x41, 0x76, 0x71, 0x68, 0x48, 0x7e, 0x03, 0x28, 0xd2, 0xdb, + 0x91, 0xf8, 0x25, 0x00, 0x48, 0xb9, 0x01, 0x20, 0xc8, 0x76, 0x70, 0x68, + 0xc1, 0x69, 0x49, 0x1c, 0xc1, 0x61, 0x0f, 0x20, 0x71, 0x68, 0x08, 0x76, + 0x0d, 0xe0, 0x01, 0x28, 0x58, 0xd1, 0x88, 0x76, 0x70, 0x68, 0x01, 0x6a, + 0x49, 0x1c, 0x01, 0x62, 0x10, 0x20, 0x71, 0x68, 0x08, 0x76, 0x30, 0x68, + 0x41, 0x78, 0x01, 0x29, 0x4c, 0xd1, 0x00, 0xf0, 0x59, 0xf8, 0x05, 0x46, + 0x48, 0xe0, 0x49, 0x7e, 0x79, 0x43, 0x21, 0x44, 0x20, 0x46, 0x4a, 0x6c, + 0x90, 0x47, 0x00, 0xf0, 0x49, 0xf8, 0x05, 0x46, 0xd1, 0x6d, 0x20, 0x46, + 0x88, 0x47, 0x00, 0x28, 0x14, 0xbf, 0x0b, 0x20, 0x0d, 0x20, 0x35, 0xe0, + 0x49, 0x7e, 0x00, 0x20, 0x00, 0x29, 0x18, 0xbf, 0x02, 0x29, 0x05, 0xd0, + 0x09, 0xd2, 0x62, 0x7d, 0x01, 0x2a, 0x04, 0xbf, 0x01, 0x20, 0x65, 0x75, + 0x21, 0x7d, 0x01, 0x29, 0x08, 0xbf, 0x25, 0x75, 0x00, 0xd0, 0x08, 0xb1, + 0x09, 0x20, 0x21, 0xe0, 0x00, 0xf0, 0x2a, 0xf8, 0x20, 0x46, 0x11, 0x6d, + 0x88, 0x47, 0x01, 0x28, 0x05, 0x46, 0x1b, 0xd1, 0x17, 0xe0, 0x49, 0x7e, + 0x00, 0xf0, 0x1b, 0xf8, 0xca, 0x6c, 0x90, 0x47, 0x05, 0x46, 0x70, 0x68, + 0x01, 0x2d, 0x02, 0xd1, 0x0e, 0x22, 0x02, 0x76, 0x0e, 0xe0, 0x09, 0x21, + 0x01, 0x76, 0x0b, 0xe0, 0x08, 0x69, 0x40, 0x1c, 0x08, 0x61, 0x20, 0x46, + 0x00, 0xf0, 0x0e, 0xf8, 0x91, 0x6c, 0x88, 0x47, 0x05, 0x46, 0x0e, 0x20, + 0x71, 0x68, 0x08, 0x76, 0x28, 0x46, 0xf2, 0xbd, 0x09, 0x78, 0x17, 0xfb, + 0x01, 0xf7, 0xe1, 0x19, 0x20, 0x46, 0x70, 0x47, 0x71, 0x68, 0x4a, 0x7e, + 0x17, 0xfb, 0x02, 0xf7, 0xe2, 0x19, 0x70, 0x47, 0x00, 0x21, 0x20, 0x46, + 0x1e, 0xe6, 0x00, 0x00, 0xf8, 0xb5, 0x05, 0x46, 0x05, 0xf1, 0xac, 0x04, + 0x06, 0x20, 0x21, 0x68, 0x08, 0x76, 0x00, 0x21, 0xa8, 0x68, 0x00, 0xf2, + 0x24, 0x72, 0x00, 0xf5, 0xe5, 0x60, 0x11, 0x60, 0x01, 0x23, 0x03, 0x60, + 0xa0, 0x68, 0x01, 0xf0, 0x60, 0xf9, 0x07, 0x46, 0x60, 0x68, 0x01, 0xf0, + 0x27, 0xfa, 0x07, 0x43, 0xe0, 0x68, 0x01, 0xf0, 0x74, 0xfd, 0xa9, 0x68, + 0x06, 0x46, 0x01, 0xf5, 0xe5, 0x61, 0x00, 0x20, 0x08, 0x60, 0x07, 0x20, + 0x22, 0x68, 0x10, 0x76, 0x00, 0x21, 0x28, 0x46, 0xff, 0xf7, 0xf6, 0xfd, + 0x22, 0x68, 0x01, 0x21, 0x11, 0x76, 0x37, 0x43, 0x38, 0x43, 0xf2, 0xbd, + 0xd0, 0xf8, 0xac, 0x00, 0x01, 0x21, 0x03, 0xe0, 0xd0, 0xf8, 0xac, 0x00, + 0x04, 0x21, 0x00, 0xbf, 0x01, 0x76, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, + 0x70, 0xb5, 0x04, 0x46, 0x04, 0xf1, 0xac, 0x05, 0x04, 0x21, 0x2a, 0x68, + 0x11, 0x76, 0x00, 0xf0, 0xcb, 0xf8, 0xa8, 0x68, 0x01, 0xf0, 0x46, 0xf9, + 0x06, 0x46, 0x68, 0x68, 0x01, 0xf0, 0x07, 0xfa, 0x06, 0x43, 0xe8, 0x68, + 0x01, 0xf0, 0x4b, 0xfd, 0x2a, 0x68, 0x05, 0x21, 0x11, 0x76, 0x06, 0x43, + 0xff, 0xf7, 0xa8, 0xff, 0x30, 0x43, 0x70, 0xbd, 0x80, 0xb5, 0x8d, 0xf8, + 0x00, 0x10, 0x8d, 0xf8, 0x01, 0x10, 0x69, 0x46, 0xd0, 0xf8, 0xb4, 0x00, + 0x02, 0xf0, 0x25, 0xfd, 0x01, 0xbd, 0x10, 0xb5, 0xd0, 0xf8, 0xb4, 0x00, + 0x00, 0x22, 0xd3, 0xb2, 0x00, 0xeb, 0x83, 0x03, 0x52, 0x1c, 0xdb, 0x6b, + 0x03, 0xf5, 0x44, 0x73, 0x1c, 0x68, 0x61, 0xf3, 0x41, 0x04, 0x1c, 0x60, + 0xd3, 0xb2, 0x02, 0x2b, 0xf1, 0xd3, 0x10, 0xbd, 0xd0, 0xf8, 0xb8, 0x00, + 0xc2, 0x68, 0x82, 0xf8, 0x34, 0x10, 0x70, 0x47, 0xd0, 0xf8, 0xb8, 0x00, + 0xc2, 0x68, 0x82, 0xf8, 0x35, 0x10, 0x70, 0x47, 0xd0, 0xf8, 0xb8, 0x00, + 0x02, 0xf0, 0xf5, 0xb9, 0xd0, 0xf8, 0xb8, 0x00, 0x02, 0xf0, 0xeb, 0xba, + 0xd0, 0xf8, 0xb4, 0x00, 0x02, 0xf0, 0x06, 0xbd, 0xd0, 0xf8, 0xb4, 0x00, + 0x02, 0xf0, 0x76, 0xbd, 0x10, 0x29, 0x00, 0xd3, 0x70, 0x47, 0x30, 0xb5, + 0xd0, 0xf8, 0xb4, 0x00, 0x00, 0x22, 0x01, 0xf0, 0x0f, 0x05, 0xd3, 0xb2, + 0x00, 0xeb, 0x83, 0x03, 0x52, 0x1c, 0x5b, 0x6c, 0x13, 0xf8, 0x29, 0x4f, + 0x04, 0xf0, 0xf0, 0x04, 0x2c, 0x43, 0x1c, 0x70, 0xd3, 0xb2, 0x02, 0x2b, + 0xf1, 0xd3, 0x30, 0xbd, 0x38, 0xb5, 0xd0, 0xb0, 0x04, 0x46, 0x4f, 0xf4, + 0xa0, 0x71, 0x68, 0x46, 0x0f, 0xf0, 0x96, 0xf8, 0xd4, 0xf8, 0xb0, 0x00, + 0x40, 0x49, 0x02, 0x6a, 0x51, 0x60, 0x00, 0x21, 0x02, 0x6a, 0x91, 0x60, + 0x02, 0x6a, 0xd1, 0x60, 0x69, 0x46, 0x02, 0xf0, 0x30, 0xff, 0xd4, 0xf8, + 0xb0, 0x00, 0x00, 0x21, 0x40, 0xf6, 0x9f, 0x62, 0x40, 0xf2, 0x4e, 0x34, + 0x02, 0xf2, 0xad, 0x22, 0x4c, 0x43, 0x40, 0xf2, 0x4d, 0x35, 0x14, 0x44, + 0x4d, 0x43, 0x03, 0x68, 0x2a, 0x44, 0xa4, 0x1a, 0x03, 0xeb, 0x84, 0x03, + 0x03, 0xf6, 0x38, 0x53, 0x3d, 0xf9, 0x11, 0x20, 0x1a, 0x60, 0x49, 0x1c, + 0xa0, 0x29, 0xe7, 0xd3, 0x51, 0xb0, 0x30, 0xbd, 0xf8, 0xb5, 0x00, 0x23, + 0x9c, 0x46, 0x00, 0x24, 0xd0, 0xf8, 0xb8, 0x10, 0x01, 0xeb, 0x83, 0x02, + 0xe7, 0xb2, 0x16, 0x69, 0x64, 0x1c, 0xe5, 0xb2, 0x46, 0xf8, 0x27, 0xc0, + 0x08, 0x2d, 0xf3, 0xd3, 0x00, 0x24, 0x00, 0xf0, 0x1a, 0xf8, 0x03, 0x2d, + 0xc7, 0xf8, 0x20, 0xc0, 0xf9, 0xd9, 0x00, 0x24, 0x00, 0xf0, 0x13, 0xf8, + 0x02, 0x2d, 0xc7, 0xf8, 0x30, 0xc0, 0xf9, 0xd9, 0x15, 0x69, 0x40, 0xf2, + 0xff, 0x74, 0x2c, 0x60, 0x5b, 0x1c, 0x12, 0x69, 0x40, 0x26, 0x02, 0x2b, + 0x96, 0x63, 0xda, 0xd3, 0x08, 0x46, 0xbd, 0xe8, 0xf2, 0x40, 0x01, 0xf0, + 0xa8, 0xbf, 0x15, 0x69, 0xe6, 0xb2, 0x64, 0x1c, 0x05, 0xeb, 0x86, 0x07, + 0xe5, 0xb2, 0x70, 0x47, 0x70, 0xb5, 0x50, 0xf8, 0xa8, 0x4f, 0x02, 0x69, + 0x93, 0x69, 0xa1, 0x68, 0xc3, 0xf8, 0xd4, 0x10, 0x81, 0x68, 0x4b, 0x6a, + 0x62, 0x68, 0x9a, 0x62, 0x49, 0x6a, 0x62, 0x69, 0x0a, 0x63, 0xc5, 0x68, + 0xe9, 0x6d, 0xa0, 0x68, 0x88, 0x67, 0x0a, 0x49, 0x60, 0x68, 0x46, 0xf0, + 0x75, 0xf8, 0x46, 0xf0, 0x4f, 0xf9, 0xee, 0x6d, 0xa6, 0xf8, 0x7c, 0x00, + 0xe9, 0x6d, 0xe0, 0x68, 0xc8, 0x66, 0xe9, 0x6d, 0x20, 0x69, 0x08, 0x67, + 0xe9, 0x6d, 0x60, 0x69, 0x48, 0x67, 0x70, 0xbd, 0x00, 0x00, 0x08, 0x43, + 0x00, 0x24, 0x74, 0x49, 0x38, 0xb5, 0x00, 0xf0, 0x1d, 0xf8, 0xc1, 0x69, + 0x88, 0x47, 0x04, 0xe0, 0x38, 0xb5, 0x00, 0xf0, 0x17, 0xf8, 0x01, 0x6a, + 0x88, 0x47, 0x28, 0xb1, 0x28, 0x68, 0x01, 0x68, 0x41, 0xf0, 0x04, 0x01, + 0x01, 0x24, 0x01, 0x60, 0x20, 0x46, 0x32, 0xbd, 0x38, 0xb5, 0x00, 0xf0, + 0x09, 0xf8, 0x41, 0x6a, 0x88, 0x47, 0xf0, 0xe7, 0x38, 0xb5, 0x00, 0xf0, + 0x03, 0xf8, 0x81, 0x6a, 0x88, 0x47, 0xea, 0xe7, 0x00, 0xf1, 0xac, 0x05, + 0x00, 0x24, 0xe8, 0x68, 0x70, 0x47, 0x38, 0xb5, 0xff, 0xf7, 0xf8, 0xff, + 0xc1, 0x6a, 0x88, 0x47, 0xdf, 0xe7, 0x38, 0xb5, 0xff, 0xf7, 0xf2, 0xff, + 0x01, 0x6b, 0x88, 0x47, 0xd9, 0xe7, 0xd0, 0xf8, 0xb8, 0x00, 0x41, 0x6b, + 0x08, 0x47, 0xd0, 0xf8, 0xb8, 0x00, 0x81, 0x6b, 0x08, 0x47, 0xd0, 0xf8, + 0xb8, 0x00, 0xc1, 0x6b, 0x08, 0x47, 0x38, 0xb5, 0x00, 0xf0, 0x1d, 0xf8, + 0x41, 0x69, 0x88, 0x47, 0x04, 0xe0, 0x38, 0xb5, 0x00, 0xf0, 0x17, 0xf8, + 0x81, 0x69, 0x88, 0x47, 0x28, 0xb1, 0x28, 0x68, 0x01, 0x68, 0x41, 0xf0, + 0x01, 0x01, 0x01, 0x24, 0x01, 0x60, 0x20, 0x46, 0x32, 0xbd, 0x38, 0xb5, + 0x00, 0xf0, 0x09, 0xf8, 0xc1, 0x69, 0x88, 0x47, 0xf0, 0xe7, 0x38, 0xb5, + 0x00, 0xf0, 0x03, 0xf8, 0x01, 0x6a, 0x88, 0x47, 0xea, 0xe7, 0x00, 0xf1, + 0xac, 0x05, 0x00, 0x24, 0xa8, 0x68, 0x70, 0x47, 0x38, 0xb5, 0xff, 0xf7, + 0xf8, 0xff, 0x41, 0x6a, 0x88, 0x47, 0xdf, 0xe7, 0x38, 0xb5, 0xff, 0xf7, + 0xf2, 0xff, 0x81, 0x6a, 0x88, 0x47, 0xd9, 0xe7, 0xd0, 0xf8, 0xb4, 0x00, + 0xc1, 0x6a, 0x08, 0x47, 0xd0, 0xf8, 0xb4, 0x00, 0x01, 0x6b, 0x08, 0x47, + 0xd0, 0xf8, 0xb4, 0x00, 0x41, 0x6b, 0x08, 0x47, 0x38, 0xb5, 0x00, 0xf0, + 0x1d, 0xf8, 0x81, 0x6a, 0x88, 0x47, 0x04, 0xe0, 0x38, 0xb5, 0x00, 0xf0, + 0x17, 0xf8, 0xc1, 0x6a, 0x88, 0x47, 0x28, 0xb1, 0x28, 0x68, 0x01, 0x68, + 0x41, 0xf0, 0x02, 0x01, 0x01, 0x24, 0x01, 0x60, 0x20, 0x46, 0x32, 0xbd, + 0x38, 0xb5, 0x00, 0xf0, 0x09, 0xf8, 0x01, 0x6b, 0x88, 0x47, 0xf0, 0xe7, + 0x38, 0xb5, 0x00, 0xf0, 0x03, 0xf8, 0x41, 0x6b, 0x88, 0x47, 0xea, 0xe7, + 0x00, 0xf1, 0xac, 0x05, 0x00, 0x24, 0x68, 0x68, 0x70, 0x47, 0x38, 0xb5, + 0xff, 0xf7, 0xf8, 0xff, 0x81, 0x6b, 0x88, 0x47, 0xdf, 0xe7, 0x38, 0xb5, + 0xff, 0xf7, 0xf2, 0xff, 0xc1, 0x6b, 0x88, 0x47, 0xd9, 0xe7, 0xd0, 0xf8, + 0xb0, 0x00, 0x01, 0x6c, 0x08, 0x47, 0xd0, 0xf8, 0xb0, 0x00, 0x41, 0x6c, + 0x08, 0x47, 0xd0, 0xf8, 0xb0, 0x00, 0x81, 0x6c, 0x08, 0x47, 0x2d, 0xe9, + 0xf0, 0x41, 0x04, 0x46, 0x00, 0x27, 0x04, 0xf1, 0xb0, 0x05, 0x04, 0xeb, + 0x87, 0x06, 0x00, 0x20, 0xf1, 0x68, 0x01, 0xf8, 0x0f, 0x0f, 0x80, 0x46, + 0x68, 0x68, 0xfb, 0xb2, 0x80, 0x22, 0x5f, 0xfa, 0x88, 0xf1, 0x02, 0xf0, + 0x9f, 0xfa, 0x08, 0xf1, 0x01, 0x08, 0x5f, 0xfa, 0x88, 0xf1, 0x10, 0x29, + 0xf2, 0xd3, 0x68, 0x68, 0xfb, 0xb2, 0x40, 0x22, 0x10, 0x21, 0x02, 0xf0, + 0x93, 0xfa, 0x68, 0x68, 0xfb, 0xb2, 0x80, 0x22, 0x11, 0x21, 0x02, 0xf0, + 0x8d, 0xfa, 0xf1, 0x68, 0x15, 0x20, 0x01, 0xf8, 0x0b, 0x0f, 0x03, 0x20, + 0xf1, 0x68, 0x01, 0xf8, 0x1b, 0x0f, 0x08, 0x20, 0xf1, 0x68, 0x01, 0xf8, + 0x1a, 0x0f, 0x05, 0x20, 0xf1, 0x68, 0x01, 0xf8, 0x19, 0x0f, 0x02, 0x20, + 0xf1, 0x68, 0x01, 0xf8, 0x2a, 0x0f, 0x0e, 0x20, 0xf1, 0x68, 0x01, 0xf8, + 0x0d, 0x0f, 0x01, 0x20, 0xf1, 0x68, 0x01, 0xf8, 0x0e, 0x0f, 0x00, 0x20, + 0xf1, 0x68, 0x01, 0xf8, 0x0e, 0x0f, 0x01, 0x22, 0x68, 0x68, 0xf9, 0xb2, + 0x02, 0xf0, 0x43, 0xfb, 0xf0, 0x68, 0x10, 0xf8, 0x20, 0x1f, 0x01, 0xf0, + 0xfc, 0x01, 0x41, 0xf0, 0x02, 0x01, 0x01, 0x70, 0xe7, 0x20, 0xf1, 0x68, + 0x01, 0xf8, 0x21, 0x0f, 0x07, 0x20, 0xf1, 0x68, 0x01, 0xf8, 0x22, 0x0f, + 0x02, 0x20, 0xf1, 0x68, 0x01, 0xf8, 0x24, 0x0f, 0x0a, 0x20, 0xf1, 0x68, + 0x01, 0xf8, 0x25, 0x0f, 0x58, 0x20, 0xf1, 0x68, 0x01, 0xf8, 0x29, 0x0f, + 0x00, 0x20, 0xf1, 0x68, 0x01, 0xf8, 0x2b, 0x0f, 0x01, 0x20, 0xf1, 0x68, + 0x01, 0xf8, 0x2b, 0x0f, 0x7f, 0x1c, 0xf0, 0x68, 0x10, 0xf8, 0x2c, 0x1f, + 0x01, 0xf0, 0xe0, 0x01, 0x41, 0xf0, 0x03, 0x01, 0x01, 0x70, 0x0a, 0x20, + 0xf1, 0x68, 0x01, 0xf8, 0x2d, 0x0f, 0xf0, 0x68, 0x10, 0xf8, 0x2c, 0x1f, + 0x41, 0xf0, 0x60, 0x01, 0x01, 0x70, 0xf0, 0x68, 0x10, 0xf8, 0x2f, 0x1f, + 0x41, 0xf0, 0x40, 0x01, 0x01, 0x70, 0x0f, 0x20, 0xf1, 0x68, 0x01, 0x2f, + 0x01, 0xf8, 0x3f, 0x0f, 0x7f, 0xf6, 0x77, 0xaf, 0x69, 0x68, 0xca, 0x6c, + 0x3b, 0x20, 0x02, 0xf8, 0x04, 0x0f, 0x1b, 0x21, 0x68, 0x68, 0x02, 0xf0, + 0x9f, 0xfa, 0x69, 0x68, 0xca, 0x6c, 0x36, 0x20, 0x02, 0xf8, 0x06, 0x0f, + 0x0e, 0x20, 0x69, 0x68, 0xca, 0x6c, 0x02, 0xf8, 0x07, 0x0f, 0x09, 0x20, + 0x69, 0x68, 0xca, 0x6c, 0x02, 0xf8, 0x08, 0x0f, 0x39, 0x20, 0x69, 0x68, + 0xca, 0x6c, 0x02, 0xf8, 0x09, 0x0f, 0x17, 0x20, 0x69, 0x68, 0xca, 0x6c, + 0x02, 0xf8, 0x0a, 0x0f, 0x01, 0x20, 0x69, 0x68, 0xca, 0x6c, 0x02, 0xf8, + 0x0b, 0x0f, 0x68, 0x68, 0xc0, 0x6c, 0x10, 0xf8, 0x0f, 0x1f, 0x01, 0xf0, + 0x0f, 0x01, 0x41, 0xf0, 0xd0, 0x01, 0x01, 0x70, 0x28, 0x68, 0x00, 0x69, + 0x01, 0x78, 0x41, 0xf0, 0x0c, 0x01, 0x01, 0x70, 0x24, 0x20, 0x2a, 0x68, + 0x11, 0x6a, 0x08, 0x70, 0x28, 0x68, 0x02, 0x6a, 0x00, 0x69, 0x11, 0x78, + 0x01, 0xf0, 0x3f, 0x01, 0x00, 0xf8, 0x01, 0x1f, 0x28, 0x68, 0x01, 0x6a, + 0x00, 0x69, 0x0a, 0x78, 0x02, 0xf0, 0x3f, 0x02, 0x00, 0xf8, 0x09, 0x2f, + 0x12, 0x21, 0x2a, 0x68, 0x10, 0x6a, 0x41, 0x70, 0xff, 0x20, 0x29, 0x68, + 0x0a, 0x6a, 0x92, 0xf9, 0x01, 0x30, 0x1a, 0x00, 0xda, 0xb2, 0x4c, 0xbf, + 0xff, 0x23, 0x00, 0x23, 0x9e, 0x18, 0x73, 0x40, 0x02, 0xf0, 0x80, 0x02, + 0x1a, 0x43, 0x0b, 0x69, 0x03, 0xf8, 0x02, 0x2f, 0x00, 0x22, 0x0b, 0x69, + 0x03, 0xf8, 0x08, 0x2f, 0x01, 0x22, 0x0b, 0x69, 0x03, 0xf8, 0x08, 0x2f, + 0x00, 0x22, 0x09, 0x69, 0x01, 0xf8, 0x08, 0x2f, 0x29, 0x68, 0x0a, 0x6a, + 0x92, 0xf9, 0x01, 0x30, 0x09, 0x69, 0x1a, 0x00, 0xda, 0xb2, 0x58, 0xbf, + 0x00, 0x20, 0x83, 0x18, 0x58, 0x40, 0x02, 0xf0, 0x80, 0x02, 0x10, 0x43, + 0x01, 0xf8, 0x0a, 0x0f, 0x03, 0x20, 0x2a, 0x68, 0x11, 0x69, 0x01, 0xf8, + 0x03, 0x0f, 0x28, 0x68, 0x00, 0x69, 0x10, 0xf8, 0x04, 0x1f, 0x01, 0xf0, + 0xf0, 0x01, 0x41, 0xf0, 0x08, 0x01, 0x01, 0x70, 0x28, 0x68, 0x00, 0x69, + 0x10, 0xf8, 0x05, 0x1f, 0x41, 0xf0, 0x01, 0x01, 0x01, 0x70, 0x28, 0x68, + 0x00, 0x69, 0x10, 0xf8, 0x06, 0x1f, 0x41, 0xf0, 0x01, 0x01, 0x01, 0x70, + 0x6a, 0x20, 0x2a, 0x68, 0x11, 0x69, 0x01, 0xf8, 0x07, 0x0f, 0x01, 0x20, + 0x2a, 0x68, 0x11, 0x69, 0x01, 0xf8, 0x08, 0x0f, 0x11, 0x20, 0x2a, 0x68, + 0x11, 0x69, 0x01, 0xf8, 0x0f, 0x0f, 0x69, 0x68, 0xca, 0x6c, 0x02, 0xf8, + 0x01, 0x0f, 0x01, 0x20, 0xe1, 0x68, 0x01, 0xf8, 0x0f, 0x0f, 0x08, 0x20, + 0xe1, 0x68, 0x01, 0xf8, 0x30, 0x0f, 0x01, 0x20, 0x21, 0x69, 0x01, 0xf8, + 0x0f, 0x0f, 0x08, 0x20, 0x21, 0x69, 0x01, 0xf8, 0x30, 0x0f, 0x00, 0x20, + 0x04, 0xf1, 0x0c, 0x01, 0x51, 0xf8, 0x20, 0x10, 0x11, 0xf8, 0x0c, 0x2f, + 0x40, 0x1c, 0x02, 0xf0, 0xdf, 0x02, 0x01, 0x28, 0x0a, 0x70, 0xf3, 0xd9, + 0xbd, 0xe8, 0xf0, 0x81, 0x70, 0xb5, 0x01, 0x23, 0x03, 0x70, 0x4a, 0x78, + 0xc2, 0xbb, 0xca, 0x69, 0x02, 0x65, 0x00, 0x22, 0x4b, 0x68, 0x83, 0x63, + 0x01, 0xeb, 0x82, 0x03, 0x00, 0xeb, 0x82, 0x05, 0x1c, 0x69, 0x6c, 0x64, + 0x52, 0x1c, 0x02, 0x2a, 0xf6, 0xd3, 0x8a, 0x69, 0xc2, 0x64, 0x00, 0x22, + 0x01, 0xeb, 0x82, 0x04, 0x00, 0xeb, 0x82, 0x03, 0xa5, 0x68, 0xdd, 0x63, + 0x52, 0x1c, 0x26, 0x6a, 0x5e, 0x65, 0x02, 0x2a, 0xa4, 0x6a, 0xdc, 0x65, + 0xf2, 0xd3, 0x0f, 0xf2, 0x01, 0x41, 0x0f, 0xf2, 0x05, 0x42, 0x41, 0x61, + 0x82, 0x61, 0x0f, 0xf2, 0x29, 0x61, 0x0f, 0xf2, 0xed, 0x62, 0xc1, 0x61, + 0x02, 0x62, 0x0f, 0xf2, 0x55, 0x01, 0x0f, 0xf2, 0x7d, 0x12, 0x41, 0x62, + 0x82, 0x62, 0x0f, 0xf2, 0x2d, 0x21, 0x0f, 0xf2, 0x7d, 0x22, 0x41, 0x63, + 0xc2, 0x62, 0x0f, 0xf2, 0x91, 0x21, 0x01, 0x63, 0x00, 0x22, 0xc1, 0x6d, + 0x0a, 0x73, 0x00, 0x21, 0x00, 0xf1, 0x5c, 0x03, 0x00, 0x22, 0x53, 0xf8, + 0x21, 0x40, 0x22, 0x60, 0x00, 0xeb, 0xc1, 0x03, 0x02, 0x6d, 0x12, 0x69, + 0x00, 0x24, 0x49, 0x1c, 0x43, 0xf8, 0x04, 0x4f, 0x02, 0x29, 0x5a, 0x60, + 0xee, 0xd3, 0xc2, 0x6d, 0x82, 0xf8, 0x2b, 0x40, 0x02, 0x21, 0x01, 0x70, + 0x00, 0x20, 0x70, 0xbd, 0x7c, 0xb5, 0x00, 0x21, 0x00, 0x22, 0xcd, 0xe9, + 0x00, 0x21, 0x04, 0x46, 0x00, 0x25, 0x00, 0xe0, 0x49, 0x1c, 0x20, 0x6d, + 0x43, 0x69, 0x99, 0x42, 0x21, 0xd2, 0xe0, 0x6d, 0x03, 0x7b, 0x5b, 0x1e, + 0x06, 0xd0, 0x9b, 0x1e, 0x01, 0x2b, 0x03, 0xd9, 0x9b, 0x1e, 0x04, 0x2b, + 0x36, 0xd9, 0x09, 0xe0, 0x00, 0x20, 0x04, 0xf1, 0x3c, 0x03, 0x53, 0xf8, + 0x20, 0x60, 0x06, 0xf5, 0x42, 0x76, 0x00, 0xf0, 0x6d, 0xf8, 0xf6, 0xd9, + 0x01, 0x23, 0x00, 0x26, 0xf0, 0xb2, 0x5d, 0xf8, 0x20, 0x00, 0x00, 0xb9, + 0x00, 0x23, 0x76, 0x1c, 0xf0, 0xb2, 0x01, 0x28, 0xf6, 0xd9, 0x00, 0x2b, + 0xd8, 0xd0, 0x20, 0x6d, 0x42, 0x69, 0x91, 0x42, 0x55, 0xd1, 0x00, 0x20, + 0xc1, 0xb2, 0x04, 0xeb, 0x81, 0x01, 0x40, 0x1c, 0xc9, 0x6d, 0x0a, 0x68, + 0x42, 0xf0, 0x02, 0x02, 0x0a, 0x60, 0xc1, 0xb2, 0x01, 0x29, 0xf3, 0xd9, + 0xe0, 0x6d, 0x01, 0x7b, 0xc9, 0x1e, 0x05, 0x29, 0x3f, 0xd8, 0xdf, 0xe8, + 0x01, 0xf0, 0x03, 0x12, 0x24, 0x36, 0x24, 0x27, 0x20, 0x46, 0x00, 0xf0, + 0x2a, 0xfd, 0x36, 0xe0, 0x00, 0x20, 0x04, 0xf1, 0x3c, 0x03, 0x53, 0xf8, + 0x20, 0x60, 0x06, 0xf5, 0x47, 0x76, 0x00, 0xf0, 0x37, 0xf8, 0xf6, 0xd9, + 0xc8, 0xe7, 0x61, 0x6c, 0x01, 0xf8, 0x27, 0x5f, 0x20, 0x46, 0xa1, 0x6c, + 0x01, 0xf8, 0x27, 0x5f, 0x00, 0xf0, 0x50, 0xfd, 0xe1, 0x6b, 0x01, 0xf5, + 0x41, 0x71, 0x0d, 0x60, 0x21, 0x6c, 0x01, 0xf5, 0x41, 0x71, 0x0d, 0x60, + 0x19, 0xe0, 0x00, 0xf0, 0x7c, 0xf8, 0x03, 0xe0, 0x00, 0xf0, 0x79, 0xf8, + 0x00, 0xf0, 0x7a, 0xf8, 0x20, 0x46, 0x02, 0xf0, 0x12, 0xfe, 0x00, 0xf0, + 0x6f, 0xf8, 0x20, 0x46, 0x02, 0xf0, 0x00, 0xfd, 0x00, 0xf0, 0x67, 0xf8, + 0x07, 0xe0, 0x00, 0xf0, 0x67, 0xf8, 0x00, 0xf0, 0x62, 0xf8, 0x08, 0x21, + 0x20, 0x46, 0x02, 0xf0, 0x4d, 0xf9, 0x02, 0x20, 0x20, 0x70, 0x01, 0x25, + 0x02, 0xe0, 0x20, 0x46, 0x00, 0xf0, 0x66, 0xf8, 0x28, 0x46, 0x76, 0xbd, + 0x33, 0x68, 0x03, 0xf0, 0x01, 0x03, 0x4d, 0xf8, 0x20, 0x30, 0x40, 0x1c, + 0x01, 0x28, 0x70, 0x47, 0x38, 0xb5, 0x04, 0x46, 0x00, 0x21, 0x00, 0x25, + 0x04, 0xeb, 0xc5, 0x00, 0x02, 0x1d, 0x10, 0x68, 0x10, 0xb1, 0x40, 0x1e, + 0x10, 0x60, 0x3b, 0xe0, 0x04, 0xeb, 0x85, 0x00, 0xc0, 0x6d, 0x01, 0x68, + 0x41, 0xf0, 0x01, 0x01, 0x01, 0x60, 0xe0, 0x6d, 0x01, 0x7b, 0xc9, 0x1e, + 0x05, 0x29, 0x2c, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, 0x03, 0x07, 0x11, 0x23, + 0x11, 0x14, 0x20, 0x46, 0x00, 0xf0, 0xc1, 0xfc, 0x23, 0xe0, 0x61, 0x6c, + 0x00, 0x20, 0x00, 0xf0, 0x22, 0xfa, 0x20, 0x46, 0x00, 0xf0, 0xf4, 0xfc, + 0x00, 0xf0, 0x9a, 0xfc, 0x19, 0xe0, 0x00, 0xf0, 0x26, 0xf8, 0x03, 0xe0, + 0x00, 0xf0, 0x23, 0xf8, 0x00, 0xf0, 0x24, 0xf8, 0x20, 0x46, 0x02, 0xf0, + 0xbc, 0xfd, 0x00, 0xf0, 0x19, 0xf8, 0x20, 0x46, 0x02, 0xf0, 0xaa, 0xfc, + 0x00, 0xf0, 0x11, 0xf8, 0x07, 0xe0, 0x00, 0xf0, 0x11, 0xf8, 0x00, 0xf0, + 0x0c, 0xf8, 0x08, 0x21, 0x20, 0x46, 0x02, 0xf0, 0xf7, 0xf8, 0x02, 0x20, + 0x20, 0x70, 0x01, 0x21, 0x6d, 0x1c, 0x01, 0x2d, 0xb8, 0xd9, 0x08, 0x46, + 0x32, 0xbd, 0x20, 0x46, 0x02, 0xf0, 0x6c, 0xbc, 0x20, 0x46, 0x02, 0xf0, + 0x5b, 0xbd, 0x20, 0x46, 0x02, 0xf0, 0x2d, 0xbd, 0x00, 0x22, 0x12, 0x21, + 0x20, 0x46, 0x03, 0xf0, 0xd2, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x46, + 0xe0, 0x6d, 0x01, 0x7b, 0x49, 0x1e, 0x06, 0xd0, 0x89, 0x1e, 0x01, 0x29, + 0x03, 0xd9, 0x89, 0x1e, 0x04, 0x29, 0x0d, 0xd9, 0x15, 0xe0, 0xe1, 0x6b, + 0x01, 0xf5, 0x43, 0x71, 0x01, 0x20, 0x08, 0x60, 0x21, 0x6c, 0x01, 0xf5, + 0x43, 0x71, 0x08, 0x60, 0x20, 0x46, 0x01, 0xf0, 0xfa, 0xfe, 0x08, 0xe0, + 0xe0, 0x6b, 0x00, 0xf5, 0x48, 0x70, 0x01, 0x21, 0x01, 0x60, 0x20, 0x6c, + 0x00, 0xf5, 0x48, 0x70, 0x01, 0x60, 0x00, 0x21, 0xa0, 0x6b, 0x00, 0xf2, + 0x24, 0x70, 0x01, 0x60, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x78, 0x00, 0x28, + 0x1c, 0xbf, 0x01, 0x28, 0x02, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x70, 0x47, + 0x05, 0x28, 0x01, 0xd1, 0x02, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, + 0x00, 0x6d, 0x80, 0x7b, 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, 0x01, 0x46, + 0xc8, 0x6d, 0x00, 0xf1, 0x0c, 0x02, 0x13, 0x78, 0x0f, 0xe0, 0xd0, 0x7f, + 0x00, 0x28, 0x02, 0xbf, 0x08, 0x6d, 0x04, 0x78, 0x01, 0x2c, 0x08, 0xd1, + 0x44, 0x78, 0x01, 0x2c, 0x04, 0xbf, 0x44, 0x79, 0x01, 0x2c, 0x02, 0xd1, + 0x00, 0x7b, 0x00, 0x28, 0x72, 0xd1, 0x5b, 0x1c, 0xd8, 0xb2, 0x09, 0x28, + 0x70, 0xdc, 0x40, 0x1e, 0x08, 0x28, 0xf8, 0xd8, 0xdf, 0xe8, 0x00, 0xf0, + 0x37, 0x5d, 0x06, 0x07, 0x18, 0x43, 0x18, 0x27, 0x4f, 0x00, 0xf0, 0xe7, + 0xdf, 0xe7, 0xd0, 0x7f, 0x00, 0x28, 0x02, 0xbf, 0x08, 0x6d, 0x04, 0x78, + 0x01, 0x2c, 0xe8, 0xd1, 0x44, 0x78, 0x01, 0x2c, 0x04, 0xbf, 0x84, 0x79, + 0x01, 0x2c, 0xe2, 0xd1, 0xc0, 0x7e, 0x00, 0x28, 0xdf, 0xd0, 0x51, 0xe0, + 0xd0, 0x7f, 0x00, 0x28, 0x02, 0xbf, 0x08, 0x6d, 0x04, 0x78, 0x01, 0x2c, + 0xd7, 0xd1, 0x44, 0x78, 0x01, 0x2c, 0x04, 0xbf, 0x04, 0x79, 0x01, 0x2c, + 0xd1, 0xd1, 0x00, 0x7e, 0xed, 0xe7, 0xd0, 0x7f, 0x00, 0x28, 0x02, 0xbf, + 0x08, 0x6d, 0x04, 0x78, 0x01, 0x2c, 0xc8, 0xd1, 0x44, 0x78, 0x01, 0x2c, + 0x04, 0xbf, 0xc4, 0x79, 0x01, 0x2c, 0xc2, 0xd1, 0x90, 0xf8, 0x24, 0x00, + 0xdd, 0xe7, 0xd0, 0x7f, 0x01, 0x28, 0x02, 0xbf, 0x08, 0x6d, 0x04, 0x78, + 0x01, 0x2c, 0x04, 0xbf, 0x84, 0x78, 0x01, 0x2c, 0xb5, 0xd1, 0x00, 0x7a, + 0x16, 0xe0, 0xd0, 0x7f, 0x00, 0x28, 0x02, 0xbf, 0x08, 0x6d, 0x04, 0x78, + 0x01, 0x2c, 0x04, 0xbf, 0x44, 0x78, 0x01, 0x2c, 0xa9, 0xd1, 0x40, 0x7a, + 0x0a, 0xe0, 0xd0, 0x7f, 0x00, 0x28, 0x02, 0xbf, 0x08, 0x6d, 0x04, 0x78, + 0x01, 0x2c, 0x04, 0xbf, 0x44, 0x78, 0x01, 0x2c, 0x9d, 0xd1, 0x80, 0x7a, + 0x01, 0x28, 0x9a, 0xd1, 0x0c, 0xe0, 0xd0, 0x7f, 0x00, 0x28, 0x02, 0xbf, + 0x08, 0x6d, 0x04, 0x78, 0x01, 0x2c, 0x92, 0xd1, 0x44, 0x78, 0x01, 0x2c, + 0x04, 0xbf, 0xc0, 0x7a, 0x01, 0x28, 0x8c, 0xd1, 0x13, 0x70, 0x10, 0xbd, + 0x00, 0x21, 0x11, 0x70, 0x10, 0xbd, 0x10, 0xb5, 0x04, 0x46, 0xff, 0xf7, + 0x6d, 0xff, 0xe1, 0x6d, 0x08, 0x7b, 0x00, 0x28, 0x0c, 0xbf, 0x02, 0x20, + 0x05, 0x20, 0x20, 0x70, 0x10, 0xbd, 0x00, 0x00, 0xc2, 0x6d, 0x00, 0x21, + 0x02, 0xe0, 0x00, 0x00, 0xc2, 0x6d, 0x01, 0x21, 0x82, 0xf8, 0x2b, 0x10, + 0x38, 0xb5, 0x04, 0x46, 0x00, 0x25, 0xe1, 0x6d, 0x08, 0x7b, 0x10, 0xb9, + 0x20, 0x46, 0xff, 0xf7, 0x53, 0xff, 0xe1, 0x6d, 0x08, 0x7b, 0x00, 0x28, + 0x38, 0xd0, 0x00, 0x20, 0xc1, 0xb2, 0x04, 0xeb, 0xc1, 0x01, 0x09, 0x1d, + 0x40, 0x1c, 0x4a, 0x68, 0x0a, 0x60, 0xc1, 0xb2, 0x02, 0x29, 0xf5, 0xd3, + 0xe0, 0x6d, 0x01, 0x7b, 0x49, 0x1e, 0x08, 0x29, 0x27, 0xd8, 0xdf, 0xe8, + 0x01, 0xf0, 0x15, 0x21, 0x05, 0x09, 0x0d, 0x19, 0x0d, 0x11, 0x1d, 0x00, + 0x20, 0x46, 0x00, 0xf0, 0x21, 0xf8, 0x1a, 0xe0, 0x20, 0x46, 0x00, 0xf0, + 0x7a, 0xf8, 0x16, 0xe0, 0x20, 0x46, 0x02, 0xf0, 0xe9, 0xfc, 0x12, 0xe0, + 0x20, 0x46, 0x03, 0xf0, 0x32, 0xf9, 0x0e, 0xe0, 0x20, 0x46, 0x04, 0xf0, + 0x53, 0xf8, 0x0a, 0xe0, 0x20, 0x46, 0x03, 0xf0, 0xc2, 0xfc, 0x06, 0xe0, + 0x20, 0x46, 0x04, 0xf0, 0x25, 0xfa, 0x02, 0xe0, 0x20, 0x46, 0x04, 0xf0, + 0x15, 0xfb, 0x05, 0x46, 0x00, 0xe0, 0x01, 0x25, 0x28, 0x46, 0x32, 0xbd, + 0x7c, 0xb5, 0x04, 0x46, 0x00, 0x21, 0x00, 0x91, 0x00, 0x25, 0xe0, 0x6d, + 0x01, 0x71, 0xe0, 0x6d, 0x41, 0x71, 0xe0, 0x6d, 0x81, 0x71, 0x00, 0xf0, + 0x2b, 0xfa, 0x00, 0x20, 0x04, 0xf1, 0x54, 0x02, 0x00, 0x21, 0x52, 0xf8, + 0x20, 0x30, 0x5d, 0x54, 0x49, 0x1c, 0x0f, 0x29, 0xf9, 0xd9, 0x40, 0x1c, + 0x02, 0x28, 0xf5, 0xd3, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x04, 0xf1, + 0x54, 0x03, 0xc1, 0xeb, 0x01, 0x16, 0x53, 0xf8, 0x20, 0x50, 0x56, 0xfa, + 0x82, 0xf6, 0x52, 0x1c, 0x05, 0xeb, 0x86, 0x03, 0xd6, 0xb2, 0x00, 0x25, + 0x0f, 0x2e, 0x5d, 0x61, 0xef, 0xd3, 0x49, 0x1c, 0x0f, 0x29, 0xeb, 0xd9, + 0x40, 0x1c, 0x02, 0x28, 0xe7, 0xd3, 0x20, 0x46, 0x00, 0xf0, 0x14, 0xfb, + 0x00, 0x20, 0x0d, 0xf1, 0x02, 0x01, 0x22, 0x6d, 0x53, 0x7b, 0x0b, 0x54, + 0x40, 0x1c, 0x02, 0x28, 0xf9, 0xd3, 0x00, 0x20, 0x04, 0xeb, 0x80, 0x02, + 0x52, 0x6c, 0x12, 0xf8, 0x20, 0x3f, 0x0d, 0x5c, 0x03, 0xf0, 0xfc, 0x03, + 0x05, 0xf0, 0x03, 0x05, 0x40, 0x1c, 0x2b, 0x43, 0x02, 0x28, 0x13, 0x70, + 0xf0, 0xd3, 0x20, 0x6d, 0xc1, 0x7b, 0x20, 0x46, 0x01, 0xf0, 0xa1, 0xfd, + 0x00, 0x25, 0x6a, 0x46, 0xe9, 0xb2, 0x00, 0xf0, 0xa8, 0xf8, 0x6d, 0x1c, + 0x0f, 0x2d, 0xf8, 0xd9, 0x61, 0xe0, 0x7c, 0xb5, 0x04, 0x46, 0x00, 0x20, + 0xe1, 0x6d, 0x08, 0x71, 0x00, 0x26, 0x10, 0x22, 0x04, 0xeb, 0x80, 0x01, + 0x4d, 0x6d, 0xae, 0x54, 0xcb, 0x6d, 0x13, 0x44, 0x1e, 0x76, 0xcd, 0x6d, + 0x05, 0xeb, 0x42, 0x03, 0x23, 0xf8, 0x10, 0x6c, 0xcb, 0x6d, 0x03, 0xeb, + 0x82, 0x05, 0x52, 0x1c, 0x12, 0x2a, 0x45, 0xf8, 0x24, 0x6c, 0xed, 0xd3, + 0x40, 0x1c, 0x01, 0x28, 0xe7, 0xd9, 0x20, 0x46, 0x00, 0xf0, 0xf6, 0xfa, + 0x61, 0x6c, 0x01, 0x20, 0x00, 0xf0, 0x41, 0xf8, 0x8d, 0xf8, 0x00, 0x00, + 0x8d, 0xf8, 0x01, 0x00, 0x00, 0x21, 0x04, 0xf1, 0x44, 0x02, 0x52, 0xf8, + 0x21, 0x20, 0x12, 0xf8, 0x20, 0x3f, 0x1d, 0xf8, 0x01, 0x50, 0x03, 0xf0, + 0x7f, 0x03, 0x49, 0x1c, 0x43, 0xea, 0xc5, 0x13, 0x01, 0x29, 0x13, 0x70, + 0xef, 0xd9, 0xe1, 0x6b, 0x01, 0xf5, 0x41, 0x71, 0x08, 0x60, 0x21, 0x6c, + 0x01, 0xf5, 0x41, 0x71, 0x08, 0x60, 0x20, 0x6d, 0x81, 0x7e, 0x20, 0x46, + 0x01, 0xf0, 0x51, 0xfd, 0x25, 0x6d, 0xa8, 0x7e, 0x01, 0x21, 0x01, 0xfa, + 0x00, 0xf0, 0x45, 0xf0, 0x16, 0xfc, 0x06, 0x46, 0xe8, 0x69, 0x31, 0x46, + 0x45, 0xf0, 0x40, 0xfb, 0xe1, 0x6d, 0x48, 0x61, 0x30, 0x46, 0xe5, 0x6d, + 0x69, 0x69, 0x45, 0xf0, 0x42, 0xfb, 0xa8, 0x61, 0x31, 0x46, 0x4f, 0xf0, + 0x7c, 0x50, 0x45, 0xf0, 0x33, 0xfb, 0xe1, 0x6d, 0x48, 0x62, 0x03, 0x20, + 0x20, 0x70, 0x00, 0x20, 0x76, 0xbd, 0x01, 0xf8, 0x27, 0x0f, 0xa1, 0x6c, + 0x01, 0xf8, 0x27, 0x0f, 0x70, 0x47, 0x00, 0x00, 0xc1, 0x6d, 0x0a, 0x7b, + 0x52, 0x1e, 0x0b, 0xd0, 0x92, 0x1e, 0x05, 0xd0, 0x52, 0x1e, 0x04, 0xd0, + 0x52, 0x1e, 0x04, 0x2a, 0x02, 0xd9, 0x05, 0xe0, 0x06, 0xe0, 0x2b, 0xe0, + 0x02, 0xf0, 0x65, 0xbc, 0x03, 0xf0, 0x81, 0xbf, 0x01, 0x20, 0x70, 0x47, + 0x7c, 0xb5, 0x04, 0x46, 0x00, 0x21, 0xad, 0xf8, 0x00, 0x10, 0x00, 0x20, + 0xe1, 0x6d, 0x8a, 0x79, 0xc5, 0xb2, 0x40, 0x1c, 0xd3, 0x1f, 0xc6, 0xb2, + 0x0d, 0xf8, 0x05, 0x30, 0x02, 0x2e, 0xf5, 0xd3, 0xe3, 0x6d, 0x59, 0x79, + 0x00, 0xf0, 0x0e, 0xf8, 0xa0, 0x6b, 0x00, 0xf2, 0x24, 0x70, 0x00, 0x22, + 0x02, 0x60, 0x20, 0x46, 0x01, 0xf0, 0xe0, 0xfc, 0xa1, 0x6b, 0x01, 0xf2, + 0x24, 0x71, 0x04, 0x20, 0x08, 0x60, 0xbf, 0xe7, 0x6a, 0x46, 0x20, 0x46, + 0x01, 0xf0, 0x3b, 0xbd, 0xf8, 0xb5, 0x05, 0x46, 0x00, 0x26, 0x10, 0x27, + 0x05, 0xeb, 0x86, 0x04, 0xe2, 0x6d, 0xf9, 0xb2, 0x02, 0xeb, 0x41, 0x03, + 0x33, 0xf8, 0x10, 0x0c, 0x28, 0xb9, 0x60, 0x6d, 0x42, 0x56, 0xf3, 0xb2, + 0x28, 0x46, 0x01, 0xf0, 0xf9, 0xfc, 0x7f, 0x1c, 0xfb, 0xb2, 0x12, 0x2b, + 0xee, 0xd3, 0x76, 0x1c, 0x02, 0x2e, 0xe8, 0xd3, 0xa9, 0x6b, 0x01, 0xf2, + 0x24, 0x71, 0x00, 0x20, 0x08, 0x60, 0x28, 0x46, 0x01, 0xf0, 0xb4, 0xfc, + 0xa9, 0x6b, 0x01, 0xf2, 0x24, 0x71, 0x04, 0x20, 0x08, 0x60, 0x28, 0x70, + 0x00, 0x20, 0xf2, 0xbd, 0xc1, 0x6d, 0x0a, 0x7b, 0x52, 0x1e, 0x08, 0x2a, + 0x12, 0xd8, 0xdf, 0xe8, 0x02, 0xf0, 0x0b, 0x11, 0x05, 0x06, 0x07, 0x0d, + 0x07, 0x09, 0x0f, 0x00, 0x0c, 0xe0, 0x02, 0xe1, 0x02, 0xf0, 0x20, 0xbc, + 0x03, 0xf0, 0x64, 0xb8, 0x03, 0xf0, 0x2c, 0xbf, 0x03, 0xf0, 0xf3, 0xbb, + 0x04, 0xf0, 0x1e, 0xb9, 0x01, 0x20, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x43, + 0x89, 0xb0, 0x04, 0x46, 0x05, 0xa8, 0x00, 0x21, 0x00, 0x22, 0xc0, 0xe9, + 0x00, 0x12, 0x01, 0xa8, 0x0d, 0xf1, 0x0c, 0x08, 0xc0, 0xe9, 0x00, 0x12, + 0x03, 0xa8, 0xc0, 0xe9, 0x00, 0x12, 0xe1, 0x6d, 0x48, 0x79, 0x4e, 0xf6, + 0xb4, 0x02, 0x00, 0x21, 0x02, 0xf2, 0x0f, 0x12, 0x4f, 0xf4, 0x90, 0x73, + 0x40, 0xf2, 0x1f, 0x19, 0x04, 0xeb, 0x81, 0x07, 0x13, 0xfb, 0x00, 0xf3, + 0x19, 0xfb, 0x00, 0xf9, 0x13, 0x44, 0x91, 0x44, 0xfd, 0x6b, 0xa3, 0xeb, + 0x09, 0x03, 0x05, 0xeb, 0x83, 0x03, 0x03, 0xf5, 0x2f, 0x75, 0x2b, 0x68, + 0x23, 0xf0, 0x7f, 0x43, 0x48, 0xf8, 0x21, 0x30, 0x49, 0x1c, 0x01, 0x29, + 0xe4, 0xd9, 0x01, 0xa9, 0x20, 0x46, 0x01, 0xf0, 0x83, 0xfc, 0x00, 0x25, + 0x4f, 0xf0, 0x7c, 0x59, 0x05, 0xaf, 0x01, 0xa9, 0x01, 0x20, 0x51, 0xf8, + 0x25, 0x20, 0x90, 0x40, 0x45, 0xf0, 0x37, 0xfb, 0x01, 0x46, 0x48, 0x46, + 0x45, 0xf0, 0x62, 0xfa, 0x47, 0xf8, 0x25, 0x00, 0x04, 0xf1, 0x54, 0x01, + 0xe0, 0x6d, 0x51, 0xf8, 0x25, 0x20, 0x41, 0x79, 0x90, 0xf9, 0x06, 0x00, + 0xc1, 0xeb, 0x01, 0x11, 0x51, 0xfa, 0x80, 0xf0, 0x02, 0xeb, 0x80, 0x06, + 0x58, 0xf8, 0x25, 0x00, 0x45, 0xf0, 0x1f, 0xfb, 0x6d, 0x1c, 0x01, 0x2d, + 0x70, 0x61, 0xdc, 0xd9, 0x00, 0x26, 0x07, 0xad, 0x58, 0xf8, 0x26, 0x00, + 0x45, 0xf0, 0x15, 0xfb, 0x57, 0xf8, 0x26, 0x10, 0x45, 0xf0, 0x49, 0xfa, + 0x20, 0xf0, 0x00, 0x40, 0x45, 0xf8, 0x26, 0x00, 0x04, 0xeb, 0x86, 0x01, + 0xca, 0x6d, 0x91, 0x68, 0x44, 0xf0, 0xda, 0xfd, 0x09, 0xd2, 0x90, 0x60, + 0x04, 0xf1, 0x54, 0x01, 0xe0, 0x6d, 0x51, 0xf8, 0x26, 0x20, 0x41, 0x79, + 0x80, 0x79, 0xc3, 0x1f, 0x53, 0x54, 0x76, 0x1c, 0x01, 0x2e, 0xdf, 0xd9, + 0xe0, 0x6d, 0x81, 0x79, 0x49, 0x1c, 0x81, 0x71, 0xe0, 0x6d, 0x90, 0xf9, + 0x06, 0x10, 0xc9, 0xb2, 0x0f, 0x29, 0x28, 0xd1, 0x00, 0x20, 0x04, 0xf1, + 0x54, 0x01, 0x51, 0xf8, 0x20, 0x20, 0xe1, 0x6d, 0x4b, 0x79, 0xd2, 0x5c, + 0x0d, 0xf8, 0x00, 0x20, 0x40, 0x1c, 0x01, 0x28, 0xf3, 0xd9, 0xe0, 0x6d, + 0x41, 0x79, 0xff, 0xf7, 0x1d, 0xff, 0xe1, 0x6d, 0x00, 0x20, 0x88, 0x71, + 0x00, 0xf0, 0x50, 0xf8, 0xe0, 0x6d, 0x41, 0x79, 0x49, 0x1c, 0x41, 0x71, + 0xe0, 0x6d, 0x41, 0x79, 0x10, 0x29, 0x0a, 0xd1, 0x00, 0x22, 0x42, 0x71, + 0x00, 0xf0, 0x3f, 0xf9, 0x22, 0x6d, 0x01, 0x79, 0x13, 0x7b, 0x99, 0x42, + 0x04, 0xbf, 0x00, 0x21, 0x01, 0x71, 0xe1, 0x6d, 0x91, 0xf9, 0x06, 0x00, + 0x00, 0x28, 0x04, 0xbf, 0x48, 0x79, 0x00, 0x28, 0x2e, 0xd1, 0x08, 0x79, + 0x60, 0xbb, 0x00, 0x27, 0x00, 0x25, 0x00, 0x26, 0x04, 0xf1, 0x54, 0x00, + 0xc5, 0xeb, 0x05, 0x18, 0x50, 0xf8, 0x27, 0x10, 0xb0, 0x44, 0x01, 0xeb, + 0x88, 0x01, 0x76, 0x1c, 0x88, 0x69, 0x49, 0x69, 0x45, 0xf0, 0xe3, 0xf9, + 0x01, 0x46, 0x48, 0x46, 0x45, 0xf0, 0xd6, 0xf9, 0x04, 0xf1, 0x54, 0x01, + 0x20, 0xf0, 0x00, 0x40, 0x51, 0xf8, 0x27, 0x20, 0x02, 0xeb, 0x88, 0x03, + 0x0e, 0x2e, 0x58, 0x61, 0xe2, 0xd3, 0x6d, 0x1c, 0x0f, 0x2d, 0xde, 0xd9, + 0x7f, 0x1c, 0x01, 0x2f, 0xda, 0xd9, 0x20, 0x46, 0x00, 0xf0, 0x2f, 0xf9, + 0x20, 0x46, 0xff, 0xf7, 0x72, 0xfd, 0x01, 0xe0, 0x03, 0x20, 0x20, 0x70, + 0x00, 0x20, 0x09, 0xb0, 0xbd, 0xe8, 0xf0, 0x83, 0x4f, 0xf0, 0x97, 0x40, + 0xe1, 0x6d, 0x88, 0x60, 0x22, 0x6e, 0x90, 0x60, 0x70, 0x47, 0x2d, 0xe9, + 0xfe, 0x4f, 0x04, 0x46, 0x00, 0x21, 0x04, 0xeb, 0x81, 0x02, 0x10, 0x25, + 0x00, 0x92, 0x01, 0x91, 0x00, 0x98, 0xd0, 0xf8, 0x5c, 0x90, 0x09, 0xeb, + 0x45, 0x01, 0x31, 0xf8, 0x10, 0x0c, 0x00, 0x28, 0x40, 0xf0, 0x82, 0x80, + 0x00, 0x9a, 0xd3, 0x6b, 0xa5, 0xf1, 0x10, 0x00, 0xc0, 0xb2, 0x4e, 0xf6, + 0xb4, 0x01, 0x4f, 0xf4, 0x90, 0x7a, 0x40, 0xf2, 0x1f, 0x12, 0x01, 0xf2, + 0x0f, 0x11, 0x1a, 0xfb, 0x00, 0xfa, 0x50, 0x43, 0x8a, 0x44, 0x08, 0x44, + 0xaa, 0xeb, 0x00, 0x00, 0x03, 0xeb, 0x80, 0x03, 0x03, 0xf5, 0x2f, 0x73, + 0x09, 0xf1, 0x18, 0x01, 0x18, 0x68, 0x00, 0x9a, 0xd2, 0xf8, 0x54, 0x80, + 0x11, 0xf9, 0x05, 0xa0, 0x18, 0xf9, 0x05, 0x60, 0xe7, 0x6d, 0x20, 0xf0, + 0x7f, 0x40, 0x45, 0xf0, 0x48, 0xfa, 0xb2, 0x45, 0x83, 0x46, 0x0f, 0xd1, + 0x79, 0x69, 0x44, 0xf0, 0x15, 0xfd, 0x02, 0xd2, 0x07, 0x2e, 0x12, 0xd1, + 0x43, 0xe0, 0xb8, 0x69, 0x59, 0x46, 0x44, 0xf0, 0x0d, 0xfd, 0x3e, 0xd2, + 0x16, 0xf1, 0x07, 0x0f, 0x24, 0xd1, 0x3a, 0xe0, 0x18, 0xda, 0x79, 0x69, + 0x44, 0xf0, 0x04, 0xfd, 0x07, 0xd2, 0x70, 0x1c, 0x40, 0xb2, 0x08, 0x28, + 0x31, 0xda, 0x76, 0x1c, 0x08, 0xf8, 0x05, 0x60, 0x34, 0xe0, 0x00, 0xf0, + 0x91, 0xf8, 0x00, 0xf0, 0x9c, 0xf8, 0x00, 0xf0, 0x88, 0xf8, 0x26, 0xd2, + 0x00, 0x98, 0x40, 0x6d, 0x41, 0x5d, 0x4a, 0x1e, 0x42, 0x55, 0x19, 0xe0, + 0xb8, 0x69, 0x59, 0x46, 0x44, 0xf0, 0xea, 0xfc, 0x08, 0xd2, 0x70, 0x1e, + 0x40, 0xb2, 0x10, 0xf1, 0x07, 0x0f, 0x16, 0xdb, 0x71, 0x1e, 0x08, 0xf8, + 0x05, 0x10, 0x19, 0xe0, 0x00, 0xf0, 0x76, 0xf8, 0x00, 0xf0, 0x81, 0xf8, + 0x00, 0xf0, 0x6d, 0xf8, 0x0b, 0xd2, 0x00, 0x98, 0x40, 0x6d, 0x41, 0x5d, + 0x49, 0x1c, 0x41, 0x55, 0x01, 0x98, 0x00, 0x99, 0xc3, 0xb2, 0x48, 0x6d, + 0x42, 0x57, 0x00, 0xf0, 0x05, 0xf9, 0x00, 0x98, 0xc1, 0x6d, 0x01, 0xeb, + 0x45, 0x02, 0x01, 0x20, 0x22, 0xf8, 0x10, 0x0c, 0x00, 0x99, 0xc8, 0x6d, + 0xa0, 0xf1, 0x24, 0x02, 0x42, 0xf8, 0x25, 0xb0, 0x6d, 0x1c, 0x12, 0x2d, + 0xff, 0xf4, 0x70, 0xaf, 0x01, 0x99, 0x49, 0x1c, 0x02, 0x29, 0xff, 0xf4, + 0x66, 0xaf, 0x00, 0x21, 0x10, 0x22, 0x04, 0xf1, 0x5c, 0x00, 0x50, 0xf8, + 0x21, 0x30, 0x03, 0xeb, 0x42, 0x05, 0x35, 0xf8, 0x10, 0x0c, 0x38, 0xb3, + 0x52, 0x1c, 0x12, 0x2a, 0xf3, 0xd3, 0x49, 0x1c, 0x02, 0x29, 0xef, 0xd3, + 0x00, 0xf0, 0x43, 0xf8, 0x01, 0x79, 0x20, 0x6d, 0xc2, 0x7e, 0x91, 0x42, + 0x1d, 0xd0, 0x00, 0x20, 0x10, 0x21, 0x04, 0xeb, 0x80, 0x02, 0xd3, 0x6d, + 0x03, 0xeb, 0x41, 0x05, 0x00, 0x23, 0x25, 0xf8, 0x10, 0x3c, 0x53, 0x6d, + 0xd6, 0x6d, 0x5d, 0x5c, 0x06, 0xf1, 0x18, 0x03, 0x5d, 0x54, 0x00, 0x23, + 0xd5, 0x6d, 0x24, 0x3d, 0x45, 0xf8, 0x21, 0x30, 0x49, 0x1c, 0x12, 0x29, + 0xeb, 0xd3, 0x40, 0x1c, 0x02, 0x28, 0xe5, 0xd3, 0x03, 0x20, 0x20, 0x70, + 0x10, 0xe0, 0x60, 0x6c, 0x00, 0x21, 0x00, 0xf8, 0x27, 0x1f, 0xa0, 0x6c, + 0x00, 0xf8, 0x27, 0x1f, 0x20, 0x46, 0x00, 0xf0, 0x7b, 0xf8, 0x00, 0xf0, + 0x21, 0xf8, 0xe1, 0x6d, 0x08, 0x71, 0x20, 0x46, 0xff, 0xf7, 0x7f, 0xfc, + 0x00, 0x20, 0xbd, 0xe8, 0xfe, 0x8f, 0x20, 0xf0, 0x00, 0x41, 0x30, 0x46, + 0x44, 0xf0, 0x68, 0xbc, 0xa9, 0xf1, 0x24, 0x01, 0x78, 0x6a, 0x51, 0xf8, + 0x25, 0x10, 0x45, 0xf0, 0xc6, 0xb8, 0xe0, 0x6d, 0x01, 0x79, 0x49, 0x1c, + 0x01, 0x71, 0xe0, 0x6d, 0x70, 0x47, 0x20, 0xf0, 0x00, 0x46, 0xe0, 0x6d, + 0x40, 0x6a, 0x59, 0x46, 0x45, 0xf0, 0xb9, 0xb8, 0xe1, 0x6b, 0x01, 0xf5, + 0x41, 0x71, 0x00, 0x20, 0x08, 0x60, 0x21, 0x6c, 0x01, 0xf5, 0x41, 0x71, + 0x08, 0x60, 0x70, 0x47, 0x18, 0xb5, 0x00, 0xf0, 0x46, 0xf8, 0x00, 0xf0, + 0x39, 0xf8, 0x03, 0xf0, 0x03, 0x03, 0x00, 0xf0, 0x3b, 0xf8, 0xf8, 0xd3, + 0xc3, 0x6d, 0x9d, 0xf8, 0x00, 0x10, 0xd9, 0x71, 0x00, 0x6e, 0x9d, 0xf8, + 0x01, 0x10, 0xc1, 0x71, 0x11, 0xbd, 0x38, 0xb5, 0x00, 0xf0, 0x33, 0xf8, + 0x00, 0xeb, 0x81, 0x03, 0xdc, 0x6d, 0xe3, 0x79, 0x00, 0xf0, 0x28, 0xf8, + 0xf8, 0xd3, 0x00, 0x21, 0x00, 0xf0, 0x45, 0xf8, 0x04, 0xf0, 0xfc, 0x04, + 0x05, 0xf0, 0x03, 0x05, 0x49, 0x1c, 0x2c, 0x43, 0x02, 0x29, 0x1c, 0x70, + 0xf4, 0xd3, 0x31, 0xbd, 0x18, 0xb5, 0x00, 0xf0, 0x1c, 0xf8, 0x00, 0xf0, + 0x0f, 0xf8, 0xdb, 0x09, 0x00, 0xf0, 0x12, 0xf8, 0xf9, 0xd3, 0xc3, 0x6d, + 0x9d, 0xf8, 0x00, 0x10, 0x83, 0xf8, 0x7e, 0x10, 0x00, 0x6e, 0x9d, 0xf8, + 0x01, 0x10, 0x80, 0xf8, 0x7e, 0x10, 0x11, 0xbd, 0x00, 0xeb, 0x81, 0x03, + 0x5c, 0x6c, 0x14, 0xf8, 0x20, 0x3f, 0x70, 0x47, 0x0d, 0xf8, 0x01, 0x30, + 0x49, 0x1c, 0x02, 0x29, 0x70, 0x47, 0x00, 0x22, 0xad, 0xf8, 0x00, 0x20, + 0x00, 0x21, 0x70, 0x47, 0x38, 0xb5, 0xff, 0xf7, 0xf8, 0xff, 0x00, 0xeb, + 0x81, 0x03, 0xdc, 0x6d, 0x94, 0xf8, 0x7e, 0x30, 0xff, 0xf7, 0xec, 0xff, + 0xf7, 0xd3, 0x00, 0x21, 0x00, 0xf0, 0x09, 0xf8, 0x04, 0xf0, 0x7f, 0x04, + 0x49, 0x1c, 0x44, 0xea, 0xc5, 0x14, 0x02, 0x29, 0x1c, 0x70, 0xf5, 0xd3, + 0x31, 0xbd, 0x00, 0xeb, 0x81, 0x03, 0x5b, 0x6c, 0x13, 0xf8, 0x20, 0x4f, + 0x1d, 0xf8, 0x01, 0x50, 0x70, 0x47, 0x70, 0xb5, 0x04, 0x46, 0x01, 0xf0, + 0x30, 0xfa, 0x00, 0x25, 0x60, 0x6d, 0xee, 0xb2, 0x00, 0x23, 0x82, 0x57, + 0x00, 0xf0, 0x0a, 0xf8, 0xa0, 0x6d, 0x82, 0x57, 0x00, 0xf0, 0x51, 0xf8, + 0x6d, 0x1c, 0xe8, 0xb2, 0x12, 0x28, 0xf1, 0xd3, 0x00, 0x20, 0x70, 0xbd, + 0xe9, 0xb2, 0x20, 0x46, 0x01, 0xf0, 0x40, 0xba, 0xf8, 0xb5, 0x04, 0x46, + 0x00, 0x20, 0xe2, 0x6d, 0x00, 0x25, 0x10, 0x73, 0x00, 0x23, 0x04, 0xf1, + 0x5c, 0x02, 0xc1, 0xb2, 0x52, 0xf8, 0x21, 0x60, 0x33, 0x60, 0x04, 0xeb, + 0xc1, 0x01, 0x22, 0x6d, 0x12, 0x69, 0x41, 0xf8, 0x04, 0x3f, 0x4a, 0x60, + 0x40, 0x1c, 0xc1, 0xb2, 0x02, 0x29, 0xee, 0xd3, 0xe1, 0x6d, 0x81, 0xf8, + 0x2b, 0x30, 0x02, 0x20, 0x20, 0x70, 0x20, 0x46, 0x03, 0xf0, 0x20, 0xff, + 0x06, 0x46, 0x60, 0x6d, 0xef, 0xb2, 0x00, 0x23, 0xc2, 0x57, 0xff, 0xf7, + 0xd5, 0xff, 0xa0, 0x6d, 0xc2, 0x57, 0x00, 0xf0, 0x1c, 0xf8, 0x6d, 0x1c, + 0xe8, 0xb2, 0x12, 0x28, 0xf1, 0xd3, 0x00, 0x25, 0x60, 0x6d, 0xef, 0xb2, + 0x38, 0x44, 0x00, 0x23, 0x00, 0xf0, 0x0b, 0xf8, 0xa0, 0x6d, 0x38, 0x44, + 0x01, 0x23, 0x00, 0xf0, 0x06, 0xf8, 0x6d, 0x1c, 0xe8, 0xb2, 0x12, 0x28, + 0xf0, 0xd3, 0x30, 0x46, 0xf2, 0xbd, 0x90, 0xf8, 0xd4, 0x23, 0xe9, 0xb2, + 0x20, 0x46, 0x01, 0xf0, 0xcf, 0xba, 0x01, 0x23, 0xe9, 0xb2, 0x20, 0x46, + 0x01, 0xf0, 0xf4, 0xb9, 0x00, 0xeb, 0x81, 0x00, 0xc1, 0x6d, 0x08, 0x68, + 0x70, 0x47, 0xc2, 0x6d, 0x00, 0x21, 0x11, 0x60, 0x00, 0x6e, 0x01, 0x60, + 0x70, 0x47, 0x00, 0x00, 0x30, 0xb5, 0x0a, 0x7f, 0x00, 0x2a, 0x39, 0xd1, + 0x4a, 0x6a, 0xc2, 0x61, 0xcb, 0x6a, 0x43, 0x62, 0x4a, 0x68, 0x42, 0x60, + 0x00, 0x22, 0x01, 0xeb, 0x82, 0x03, 0x00, 0xeb, 0x82, 0x05, 0x9c, 0x68, + 0xac, 0x60, 0x52, 0x1c, 0x02, 0x2a, 0xf6, 0xd3, 0x0a, 0x69, 0x02, 0x61, + 0x00, 0x22, 0x01, 0xeb, 0x82, 0x03, 0x00, 0xeb, 0x82, 0x05, 0x5c, 0x69, + 0x6c, 0x61, 0x52, 0x1c, 0x02, 0x2a, 0xf6, 0xd3, 0x0a, 0x68, 0x02, 0x60, + 0x8b, 0x6a, 0x0f, 0xf2, 0x55, 0x12, 0x03, 0x62, 0x82, 0x62, 0x0f, 0xf2, + 0x19, 0x43, 0x0f, 0xf2, 0x21, 0x22, 0xc3, 0x62, 0x02, 0x63, 0x0f, 0xf2, + 0x45, 0x23, 0x0f, 0xf2, 0xb1, 0x32, 0x43, 0x63, 0x82, 0x63, 0x0f, 0xf2, + 0xcd, 0x33, 0x11, 0x4a, 0xc3, 0x63, 0x82, 0x64, 0x0f, 0xf2, 0xe5, 0x33, + 0x0f, 0xf2, 0xe9, 0x32, 0x03, 0x64, 0x42, 0x64, 0x01, 0x23, 0x42, 0x6a, + 0x13, 0x71, 0x00, 0x23, 0x42, 0x6a, 0x09, 0x6a, 0x91, 0x62, 0x00, 0x22, + 0xc1, 0x69, 0xc9, 0x69, 0x01, 0x65, 0xc2, 0x64, 0xc1, 0x69, 0x09, 0x6c, + 0x42, 0x65, 0x81, 0x65, 0x00, 0x21, 0x42, 0x6a, 0x11, 0x60, 0x02, 0x22, + 0x41, 0x6a, 0x4b, 0x71, 0x40, 0x6a, 0x02, 0x71, 0x00, 0x20, 0x30, 0xbd, + 0x59, 0x90, 0x00, 0x01, 0x02, 0x68, 0x02, 0xf6, 0x04, 0x52, 0x00, 0x21, + 0x11, 0x60, 0x00, 0x23, 0x01, 0x68, 0x01, 0xf6, 0x08, 0x51, 0x0b, 0x60, + 0x01, 0x69, 0x0a, 0x78, 0x42, 0xf0, 0x0c, 0x02, 0x0a, 0x70, 0x40, 0x6a, + 0x43, 0x71, 0x00, 0x20, 0x70, 0x47, 0x38, 0xb5, 0xd0, 0xb0, 0x04, 0x46, + 0x4f, 0xf4, 0xa0, 0x71, 0x68, 0x46, 0x0d, 0xf0, 0xed, 0xfe, 0xe0, 0x69, + 0xc1, 0x69, 0x21, 0x65, 0x00, 0x22, 0xe2, 0x64, 0x00, 0x6c, 0xa0, 0x65, + 0x62, 0x65, 0x60, 0x6a, 0x02, 0x60, 0x42, 0x71, 0x00, 0xf0, 0x7c, 0xf9, + 0x00, 0xf0, 0x7d, 0xf9, 0x4c, 0xbf, 0xff, 0x21, 0x00, 0x21, 0x00, 0xf0, + 0x6a, 0xfa, 0x01, 0xf8, 0x02, 0x0f, 0x00, 0x20, 0x21, 0x69, 0x01, 0xf8, + 0x08, 0x0f, 0x01, 0x20, 0x21, 0x69, 0x01, 0xf8, 0x08, 0x0f, 0x00, 0x20, + 0x21, 0x69, 0x01, 0xf8, 0x08, 0x0f, 0x20, 0x46, 0x04, 0xf0, 0x7c, 0xf8, + 0x00, 0xf0, 0x5c, 0xf9, 0x00, 0xf8, 0x01, 0x1f, 0x20, 0x46, 0x69, 0x46, + 0x01, 0xf0, 0x67, 0xfd, 0x00, 0x20, 0x40, 0xf6, 0x9f, 0x61, 0x40, 0xf2, + 0x4e, 0x33, 0x01, 0xf2, 0xad, 0x21, 0x43, 0x43, 0x40, 0xf2, 0x4d, 0x35, + 0x0b, 0x44, 0x45, 0x43, 0x22, 0x68, 0x29, 0x44, 0x5b, 0x1a, 0x02, 0xeb, + 0x83, 0x02, 0x02, 0xf6, 0x38, 0x52, 0x3d, 0xf9, 0x10, 0x10, 0x11, 0x60, + 0x40, 0x1c, 0xa0, 0x28, 0xe7, 0xd3, 0x20, 0x68, 0x00, 0xf6, 0x34, 0x50, + 0x01, 0x68, 0x41, 0xf0, 0x0f, 0x01, 0x01, 0x60, 0x20, 0x68, 0x00, 0xf6, + 0x34, 0x50, 0x01, 0x68, 0x41, 0xf0, 0x10, 0x01, 0x01, 0x60, 0x01, 0xf0, + 0x3b, 0xfe, 0x00, 0x20, 0x51, 0xb0, 0x30, 0xbd, 0x10, 0xb5, 0x00, 0xf0, + 0xc1, 0xf9, 0x04, 0xbf, 0x40, 0x78, 0x01, 0x28, 0x4d, 0xd1, 0x00, 0xf0, + 0xab, 0xf9, 0x78, 0xb9, 0x0f, 0xf2, 0xc1, 0x01, 0x0f, 0xf2, 0xe9, 0x00, + 0x21, 0x63, 0x60, 0x63, 0x0f, 0xf2, 0x51, 0x21, 0x0f, 0xf2, 0x71, 0x20, + 0xa1, 0x63, 0xe0, 0x63, 0x0f, 0xf2, 0x95, 0x21, 0x00, 0xf0, 0x93, 0xf9, + 0x60, 0x6a, 0x41, 0x79, 0x03, 0x29, 0x39, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, + 0x02, 0x12, 0x12, 0x2e, 0xe2, 0x69, 0x11, 0x79, 0x01, 0x29, 0x31, 0xd1, + 0x00, 0xf0, 0x97, 0xf9, 0x20, 0x46, 0x04, 0xf0, 0x85, 0xf9, 0xe1, 0x69, + 0x88, 0x7d, 0x48, 0xbb, 0x20, 0x46, 0x03, 0xf0, 0xc3, 0xff, 0x25, 0xe0, + 0xe1, 0x69, 0x4a, 0x79, 0x01, 0x2a, 0x08, 0xd1, 0x00, 0x21, 0x81, 0x71, + 0x20, 0x46, 0x04, 0xf0, 0xd9, 0xf8, 0x60, 0x6a, 0x00, 0x21, 0x01, 0x84, + 0x41, 0x84, 0xe0, 0x69, 0x81, 0x79, 0x01, 0x29, 0x14, 0xd1, 0x61, 0x6a, + 0x00, 0x20, 0x88, 0x71, 0x20, 0x46, 0x04, 0xf0, 0x12, 0xf8, 0x60, 0x6a, + 0x00, 0x21, 0x81, 0x84, 0xc1, 0x84, 0x09, 0xe0, 0xe1, 0x69, 0xca, 0x79, + 0x01, 0x2a, 0x05, 0xd1, 0x00, 0xf0, 0x66, 0xf9, 0x02, 0xe0, 0x61, 0x6a, + 0x04, 0x20, 0x48, 0x71, 0x60, 0x6a, 0x81, 0x79, 0x02, 0x29, 0x0a, 0xd1, + 0x41, 0x79, 0x04, 0x29, 0x07, 0xda, 0x49, 0x1c, 0x41, 0x71, 0x60, 0x6a, + 0x41, 0x79, 0x01, 0x29, 0x04, 0xbf, 0x02, 0x21, 0x41, 0x71, 0x60, 0x6a, + 0x41, 0x79, 0x04, 0x29, 0x3c, 0xe1, 0x00, 0x00, 0x80, 0xb5, 0x42, 0x6a, + 0x04, 0x21, 0x11, 0x71, 0x41, 0x6a, 0x4a, 0x79, 0x03, 0x2a, 0x0b, 0xd8, + 0xdf, 0xe8, 0x02, 0xf0, 0x02, 0x05, 0x08, 0x08, 0x04, 0xf0, 0x48, 0xf9, + 0x04, 0xe0, 0x04, 0xf0, 0x41, 0xf9, 0x01, 0xe0, 0x01, 0xf0, 0xaa, 0xfb, + 0x00, 0x20, 0x02, 0xbd, 0xf8, 0xb5, 0x00, 0xf0, 0xc8, 0xf9, 0x61, 0x6a, + 0x0a, 0x68, 0x00, 0x92, 0xff, 0x26, 0x4a, 0x79, 0x03, 0x2a, 0x09, 0xd8, + 0xdf, 0xe8, 0x02, 0xf0, 0x02, 0x0c, 0x42, 0x88, 0xc8, 0x79, 0x01, 0x28, + 0x20, 0x46, 0x02, 0xd1, 0x04, 0xf0, 0x58, 0xf9, 0x88, 0xe0, 0x04, 0xf0, + 0x80, 0xf9, 0x7e, 0xe0, 0x20, 0x46, 0x04, 0xf0, 0xca, 0xf9, 0x60, 0x6a, + 0x42, 0x8c, 0x52, 0x1c, 0x42, 0x84, 0x92, 0xb2, 0xe1, 0x69, 0x8b, 0x7c, + 0x9a, 0x42, 0x79, 0xd3, 0x02, 0x8c, 0x45, 0x84, 0x52, 0x1c, 0x02, 0x84, + 0x8b, 0x79, 0x01, 0x2b, 0x04, 0xd1, 0x87, 0x8c, 0x91, 0xf8, 0x11, 0xc0, + 0x67, 0x45, 0x6a, 0xd3, 0x0f, 0x7c, 0x92, 0xb2, 0xba, 0x42, 0x69, 0xd3, + 0x01, 0x2b, 0x03, 0xd1, 0x80, 0x8c, 0x49, 0x7c, 0x88, 0x42, 0x63, 0xd3, + 0x00, 0xf0, 0x72, 0xf8, 0x00, 0xf0, 0x73, 0xf8, 0x58, 0xbf, 0x00, 0x26, + 0x31, 0x18, 0x4e, 0x40, 0x21, 0x69, 0x00, 0xf0, 0x80, 0x00, 0x30, 0x43, + 0x00, 0xf0, 0x69, 0xf9, 0x00, 0xf0, 0x76, 0xf9, 0x60, 0x6a, 0x41, 0x79, + 0x89, 0x1c, 0x4e, 0xe0, 0x20, 0x46, 0x03, 0xf0, 0xbf, 0xff, 0x60, 0x6a, + 0xc1, 0x8c, 0x49, 0x1c, 0xc1, 0x84, 0x89, 0xb2, 0xe2, 0x69, 0xd3, 0x7c, + 0x99, 0x42, 0x43, 0xd3, 0x82, 0x8c, 0xc5, 0x84, 0x52, 0x1c, 0x82, 0x84, + 0x21, 0x6a, 0x90, 0xf8, 0x34, 0x00, 0x08, 0x70, 0x20, 0x46, 0x03, 0xf0, + 0x61, 0xff, 0x00, 0xf0, 0x41, 0xf8, 0x00, 0xf8, 0x09, 0x1f, 0xe1, 0x69, + 0x4a, 0x79, 0x60, 0x6a, 0x01, 0x2a, 0x03, 0xd1, 0x41, 0x79, 0x4a, 0x1e, + 0x42, 0x71, 0x2b, 0xe0, 0x80, 0x8c, 0x49, 0x7c, 0x88, 0x42, 0x27, 0xd3, + 0x00, 0xf0, 0x36, 0xf8, 0x00, 0xf0, 0x37, 0xf8, 0x58, 0xbf, 0x00, 0x26, + 0x31, 0x18, 0x4e, 0x40, 0x00, 0xf0, 0x80, 0x00, 0x06, 0x43, 0x20, 0x69, + 0x00, 0xf8, 0x02, 0x6f, 0x01, 0x21, 0x20, 0x69, 0x00, 0xf8, 0x08, 0x5f, + 0x20, 0x69, 0x00, 0xf8, 0x08, 0x1f, 0x20, 0x69, 0x00, 0xf8, 0x08, 0x5f, + 0x20, 0x46, 0x03, 0xf0, 0x35, 0xff, 0x00, 0xf0, 0x2d, 0xf9, 0x05, 0xe0, + 0x20, 0x46, 0x01, 0xf0, 0x4f, 0xfb, 0x61, 0x6a, 0x02, 0x20, 0x88, 0x71, + 0x60, 0x6a, 0x41, 0x79, 0x49, 0x1c, 0x41, 0x71, 0x00, 0xf0, 0x0a, 0xf9, + 0x18, 0xbf, 0x01, 0x25, 0x04, 0x28, 0x01, 0xdb, 0x00, 0xf0, 0xa4, 0xf8, + 0x28, 0x46, 0xf2, 0xbd, 0x20, 0x6a, 0x01, 0x78, 0x20, 0x69, 0x01, 0xf0, + 0x3f, 0x01, 0x70, 0x47, 0x20, 0x46, 0x04, 0xf0, 0x3d, 0xb8, 0x20, 0x6a, + 0x90, 0xf9, 0x01, 0x10, 0x08, 0x00, 0xc8, 0xb2, 0x70, 0x47, 0x00, 0x00, + 0x80, 0xb5, 0x00, 0xf0, 0x2a, 0xf9, 0x01, 0x2b, 0x03, 0xd9, 0x9b, 0x1e, + 0x01, 0x2b, 0x03, 0xd9, 0x05, 0xe0, 0x04, 0xf0, 0x51, 0xf8, 0x01, 0xe0, + 0x01, 0xf0, 0x00, 0xfb, 0x01, 0x46, 0x08, 0x46, 0x02, 0xbd, 0x00, 0x00, + 0x80, 0xb5, 0x00, 0xf0, 0x18, 0xf9, 0x01, 0x2b, 0x03, 0xd9, 0x9b, 0x1e, + 0x01, 0x2b, 0x03, 0xd9, 0x05, 0xe0, 0x04, 0xf0, 0x31, 0xf8, 0x01, 0xe0, + 0x01, 0xf0, 0xe0, 0xfa, 0x01, 0x46, 0x08, 0x46, 0x02, 0xbd, 0x00, 0x00, + 0x40, 0x6a, 0x80, 0x79, 0x70, 0x47, 0x00, 0x00, 0xc0, 0x69, 0x00, 0x7b, + 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, 0x00, 0xf0, 0x5b, 0xf8, 0x04, 0xbf, + 0x80, 0x78, 0x01, 0x28, 0x2a, 0xd1, 0x00, 0xf0, 0x45, 0xf8, 0x78, 0xb9, + 0x0f, 0xf2, 0xd5, 0x01, 0x0f, 0xf2, 0xf1, 0x00, 0x21, 0x63, 0x60, 0x63, + 0x0f, 0xf2, 0xc1, 0x11, 0x0f, 0xf2, 0xe9, 0x10, 0xa1, 0x63, 0xe0, 0x63, + 0x0f, 0xf2, 0xad, 0x11, 0x00, 0xf0, 0x2d, 0xf8, 0x60, 0x6a, 0x41, 0x79, + 0x11, 0xb1, 0x01, 0x29, 0x0b, 0xd0, 0x14, 0xe0, 0xe2, 0x69, 0x11, 0x7a, + 0x01, 0x29, 0x10, 0xd1, 0x00, 0xf0, 0x33, 0xf8, 0x60, 0x6a, 0x00, 0x21, + 0x01, 0x84, 0x41, 0x84, 0x09, 0xe0, 0xe1, 0x69, 0x4a, 0x7a, 0x01, 0x2a, + 0x05, 0xd1, 0x00, 0xf0, 0x23, 0xf8, 0x02, 0xe0, 0x61, 0x6a, 0x02, 0x20, + 0x48, 0x71, 0x60, 0x6a, 0x81, 0x79, 0x02, 0x29, 0x04, 0xd1, 0x41, 0x79, + 0x02, 0x29, 0xbc, 0xbf, 0x49, 0x1c, 0x41, 0x71, 0x60, 0x6a, 0x41, 0x79, + 0x02, 0x29, 0x00, 0xbf, 0x01, 0xdb, 0x00, 0xf0, 0x21, 0xf8, 0x00, 0x20, + 0x10, 0xbd, 0x20, 0x69, 0x61, 0x64, 0x01, 0x78, 0x01, 0xf0, 0xf3, 0x01, + 0x01, 0x70, 0x70, 0x47, 0x60, 0x6a, 0x03, 0x21, 0x01, 0x71, 0x61, 0x6a, + 0x48, 0x79, 0x70, 0x47, 0x00, 0x21, 0x81, 0x71, 0x20, 0x46, 0x01, 0xf0, + 0x33, 0xba, 0x00, 0x22, 0x82, 0x71, 0x20, 0x46, 0x03, 0xf0, 0x50, 0xbf, + 0x04, 0x46, 0x02, 0x20, 0x61, 0x6a, 0x88, 0x71, 0xe0, 0x69, 0x01, 0x78, + 0x01, 0x29, 0x70, 0x47, 0x20, 0x69, 0x01, 0x78, 0x41, 0xf0, 0x0c, 0x01, + 0x01, 0x70, 0x01, 0x20, 0x61, 0x6a, 0x88, 0x71, 0x00, 0x20, 0x61, 0x6a, + 0x48, 0x71, 0x07, 0x20, 0x61, 0x6a, 0x08, 0x71, 0x70, 0x47, 0x00, 0x00, + 0x80, 0xb5, 0x42, 0x6a, 0x04, 0x21, 0x11, 0x71, 0x41, 0x6a, 0x4a, 0x79, + 0x22, 0xb1, 0x01, 0x2a, 0x08, 0xbf, 0x01, 0xf0, 0x43, 0xfa, 0x01, 0xe0, + 0x03, 0xf0, 0xd4, 0xff, 0x00, 0x20, 0x02, 0xbd, 0x38, 0xb5, 0x00, 0xf0, + 0x5e, 0xf8, 0x60, 0x6a, 0x01, 0x68, 0x00, 0x91, 0x40, 0x79, 0x10, 0xb1, + 0x01, 0x28, 0x1a, 0xd0, 0x23, 0xe0, 0x20, 0x46, 0x04, 0xf0, 0x6d, 0xf8, + 0x60, 0x6a, 0x01, 0x8c, 0x49, 0x1c, 0x01, 0x84, 0x89, 0xb2, 0xe0, 0x69, + 0x82, 0x7b, 0x91, 0x42, 0x17, 0xd3, 0xff, 0xf7, 0x2b, 0xff, 0xff, 0xf7, + 0x2c, 0xff, 0x4c, 0xbf, 0xff, 0x21, 0x00, 0x21, 0x00, 0xf0, 0x19, 0xf8, + 0x00, 0xf0, 0x25, 0xf8, 0x00, 0xf0, 0x32, 0xf8, 0x05, 0xe0, 0x20, 0x46, + 0x01, 0xf0, 0x54, 0xfa, 0x61, 0x6a, 0x02, 0x20, 0x88, 0x71, 0x60, 0x6a, + 0x41, 0x79, 0x49, 0x1c, 0x41, 0x71, 0x00, 0xf0, 0x0f, 0xf8, 0x18, 0xbf, + 0x01, 0x25, 0x01, 0x28, 0x01, 0xdd, 0xff, 0xf7, 0xa9, 0xff, 0x28, 0x46, + 0x32, 0xbd, 0x0a, 0x18, 0x51, 0x40, 0x00, 0xf0, 0x80, 0x00, 0x08, 0x43, + 0x21, 0x69, 0x70, 0x47, 0x60, 0x6a, 0x00, 0x99, 0x02, 0x68, 0x40, 0x79, + 0x92, 0xea, 0x01, 0x0f, 0x70, 0x47, 0x01, 0xf8, 0x02, 0x0f, 0x01, 0x20, + 0x21, 0x69, 0x01, 0xf8, 0x08, 0x5f, 0x21, 0x69, 0x01, 0xf8, 0x08, 0x0f, + 0x20, 0x46, 0x21, 0x69, 0x01, 0xf8, 0x08, 0x5f, 0x03, 0xf0, 0x06, 0xbe, + 0x20, 0x6a, 0x01, 0x78, 0x20, 0x69, 0x01, 0xf0, 0x3f, 0x01, 0x00, 0xf8, + 0x01, 0x1f, 0x02, 0x21, 0x60, 0x6a, 0x81, 0x71, 0x70, 0x47, 0x04, 0x46, + 0x06, 0x20, 0x61, 0x6a, 0x08, 0x71, 0x00, 0x25, 0x70, 0x47, 0x00, 0x00, + 0xc0, 0x69, 0x40, 0x7b, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, + 0x0c, 0xf8, 0x13, 0xb1, 0x01, 0x2b, 0x03, 0xd0, 0x05, 0xe0, 0x03, 0xf0, + 0x35, 0xff, 0x01, 0xe0, 0x01, 0xf0, 0xe4, 0xf9, 0x01, 0x46, 0x08, 0x46, + 0x02, 0xbd, 0x43, 0x6a, 0x05, 0x22, 0x1a, 0x71, 0x00, 0x21, 0x42, 0x6a, + 0x53, 0x79, 0x70, 0x47, 0x80, 0xb5, 0xff, 0xf7, 0xf6, 0xff, 0x13, 0xb1, + 0x01, 0x2b, 0x03, 0xd0, 0x05, 0xe0, 0x03, 0xf0, 0x11, 0xff, 0x01, 0xe0, + 0x01, 0xf0, 0xc0, 0xf9, 0x01, 0x46, 0x08, 0x46, 0x02, 0xbd, 0x40, 0x6a, + 0x50, 0xf8, 0x21, 0x00, 0x70, 0x47, 0x40, 0x6a, 0x00, 0x21, 0x01, 0x60, + 0x70, 0x47, 0x00, 0x00, 0x30, 0xb5, 0x0a, 0x78, 0x82, 0xbb, 0x4a, 0x69, + 0xc2, 0x60, 0x0b, 0x6a, 0x83, 0x61, 0x0a, 0x69, 0x82, 0x60, 0x00, 0x22, + 0x01, 0xeb, 0x82, 0x03, 0x00, 0xeb, 0x82, 0x05, 0x9c, 0x68, 0x40, 0xf8, + 0x22, 0x40, 0x01, 0xf1, 0x18, 0x03, 0x53, 0xf8, 0x22, 0x40, 0x2c, 0x61, + 0x52, 0x1c, 0x02, 0x2a, 0xf0, 0xd3, 0x0f, 0xf2, 0xc5, 0x02, 0x0f, 0xf2, + 0x89, 0x13, 0xc2, 0x61, 0x03, 0x62, 0x0f, 0xf2, 0xb9, 0x22, 0x0f, 0xf2, + 0x39, 0x33, 0x42, 0x62, 0x83, 0x62, 0x0f, 0xf2, 0x99, 0x52, 0x0f, 0xf2, + 0x15, 0x63, 0xc2, 0x62, 0x03, 0x63, 0x0f, 0xf6, 0x99, 0x02, 0x0f, 0xf6, + 0x49, 0x13, 0xc2, 0x63, 0x43, 0x63, 0x0f, 0xf6, 0x49, 0x12, 0x82, 0x63, + 0x01, 0x23, 0x82, 0x69, 0x53, 0x72, 0x82, 0x69, 0x49, 0x68, 0xc2, 0xf8, + 0xd4, 0x10, 0x00, 0x22, 0x00, 0x21, 0x83, 0x69, 0x43, 0xf8, 0x21, 0x20, + 0x83, 0x69, 0x0b, 0x44, 0x83, 0xf8, 0xcc, 0x20, 0x83, 0x69, 0x0b, 0x44, + 0x49, 0x1c, 0x02, 0x29, 0x83, 0xf8, 0xce, 0x20, 0xf1, 0xd3, 0xc1, 0x68, + 0xc9, 0x69, 0x02, 0x64, 0x41, 0x64, 0x00, 0x21, 0x82, 0x69, 0x11, 0x72, + 0x02, 0x21, 0x80, 0x69, 0x41, 0x72, 0x00, 0x20, 0x30, 0xbd, 0x02, 0x68, + 0x00, 0x21, 0x11, 0x60, 0x00, 0x23, 0x41, 0x68, 0x0b, 0x60, 0x80, 0x69, + 0x03, 0x72, 0x00, 0x20, 0x70, 0x47, 0x10, 0xb5, 0x00, 0x21, 0x00, 0x24, + 0x00, 0x23, 0x82, 0x69, 0x42, 0xf8, 0x21, 0x30, 0x0a, 0x44, 0x82, 0xf8, + 0xcc, 0x40, 0x82, 0x69, 0x0a, 0x44, 0x49, 0x1c, 0x02, 0x29, 0x82, 0xf8, + 0xce, 0x30, 0xf2, 0xd3, 0xc1, 0x68, 0x82, 0x69, 0xc9, 0x69, 0x03, 0x64, + 0x41, 0x64, 0x13, 0x72, 0x00, 0xf0, 0xfd, 0xfa, 0x00, 0x20, 0x10, 0xbd, + 0x70, 0xb5, 0x00, 0xf0, 0xd8, 0xf8, 0x04, 0xbf, 0x40, 0x78, 0x01, 0x28, + 0x3f, 0xd1, 0x00, 0xf0, 0xbe, 0xf8, 0x28, 0xb9, 0x0f, 0xf2, 0xe9, 0x12, + 0x0f, 0xf2, 0x69, 0x20, 0x62, 0x62, 0xa0, 0x62, 0x01, 0xf1, 0xd0, 0x00, + 0xe2, 0x68, 0x93, 0x6b, 0x83, 0x66, 0x0e, 0x7a, 0x00, 0x2e, 0x23, 0xd0, + 0x01, 0x2e, 0x2f, 0xd1, 0x60, 0x6c, 0x20, 0x64, 0x92, 0x79, 0x01, 0x2a, + 0x04, 0xd1, 0x8d, 0x72, 0x20, 0x46, 0x00, 0xf0, 0xc9, 0xf9, 0x05, 0x46, + 0xe0, 0x68, 0x41, 0x79, 0x01, 0x29, 0x06, 0xd1, 0xa1, 0x69, 0x00, 0x20, + 0x88, 0x72, 0x20, 0x46, 0x00, 0xf0, 0xf7, 0xf9, 0x05, 0x43, 0xe0, 0x68, + 0x81, 0x79, 0x01, 0x29, 0x04, 0xbf, 0x40, 0x79, 0x01, 0x28, 0x02, 0xd1, + 0x00, 0xf0, 0xac, 0xf8, 0x10, 0xe0, 0x00, 0xf0, 0xb7, 0xf8, 0x0d, 0xe0, + 0x61, 0x6c, 0x21, 0x64, 0x12, 0x79, 0x01, 0x2a, 0x08, 0xd1, 0x02, 0x21, + 0x01, 0x70, 0x00, 0xf0, 0x88, 0xf8, 0x05, 0x46, 0x02, 0xe0, 0xa1, 0x69, + 0x02, 0x20, 0x08, 0x72, 0xa0, 0x69, 0x81, 0x7a, 0x02, 0x29, 0x04, 0xd1, + 0x01, 0x7a, 0x01, 0x29, 0xdc, 0xbf, 0x49, 0x1c, 0x01, 0x72, 0xa0, 0x69, + 0x01, 0x7a, 0x01, 0x29, 0x01, 0xdd, 0x00, 0xf0, 0x02, 0xf8, 0x28, 0x46, + 0x70, 0xbd, 0x01, 0x22, 0x82, 0x72, 0x00, 0x20, 0xa1, 0x69, 0x08, 0x72, + 0x07, 0x20, 0xa1, 0x69, 0x48, 0x72, 0x70, 0x47, 0x70, 0xb5, 0x00, 0xf0, + 0x74, 0xf8, 0x04, 0xbf, 0x80, 0x78, 0x01, 0x28, 0x47, 0xd1, 0x00, 0xf0, + 0x5a, 0xf8, 0x28, 0xb9, 0x0f, 0xf2, 0x59, 0x12, 0x0f, 0xf2, 0x21, 0x20, + 0x62, 0x62, 0xa0, 0x62, 0x01, 0xf1, 0xd0, 0x02, 0xe0, 0x68, 0x83, 0x6b, + 0x93, 0x66, 0x0e, 0x7a, 0x00, 0x2e, 0x29, 0xd0, 0x01, 0x2e, 0x37, 0xd1, + 0x62, 0x6c, 0x22, 0x64, 0x80, 0x7a, 0x01, 0x28, 0x04, 0xd1, 0x8d, 0x72, + 0x20, 0x46, 0x00, 0xf0, 0x65, 0xf9, 0x05, 0x46, 0xe1, 0x68, 0x48, 0x7a, + 0x01, 0x28, 0x0c, 0xd1, 0x08, 0x7a, 0x00, 0x28, 0x1c, 0xbf, 0x48, 0x7b, + 0x00, 0x28, 0x06, 0xd1, 0xa0, 0x69, 0x00, 0x21, 0x81, 0x72, 0x20, 0x46, + 0x00, 0xf0, 0x8d, 0xf9, 0x05, 0x43, 0xe0, 0x68, 0x81, 0x7a, 0x01, 0x29, + 0x04, 0xbf, 0x40, 0x7a, 0x01, 0x28, 0x02, 0xd1, 0x00, 0xf0, 0x42, 0xf8, + 0x12, 0xe0, 0x00, 0xf0, 0x4d, 0xf8, 0x0f, 0xe0, 0x61, 0x6c, 0x21, 0x64, + 0x03, 0x7a, 0x01, 0x2b, 0x0a, 0xd1, 0x40, 0x7b, 0x40, 0xb1, 0x02, 0x21, + 0x11, 0x70, 0x00, 0xf0, 0x1c, 0xf8, 0x05, 0x46, 0x02, 0xe0, 0xa1, 0x69, + 0x02, 0x20, 0x08, 0x72, 0xa0, 0x69, 0x81, 0x7a, 0x02, 0x29, 0x04, 0xd1, + 0x01, 0x7a, 0x02, 0x29, 0xbc, 0xbf, 0x49, 0x1c, 0x01, 0x72, 0xa0, 0x69, + 0x01, 0x7a, 0x02, 0x29, 0x01, 0xdb, 0xff, 0xf7, 0x96, 0xff, 0x28, 0x46, + 0x70, 0xbd, 0xa0, 0x69, 0x03, 0x21, 0x41, 0x72, 0xa1, 0x69, 0x08, 0x7a, + 0x70, 0x47, 0xa0, 0x69, 0xa2, 0x68, 0x90, 0xf8, 0xd0, 0x10, 0x02, 0xf5, + 0xe4, 0x62, 0x01, 0xf0, 0x03, 0x01, 0x11, 0x60, 0x85, 0x72, 0x20, 0x46, + 0xa1, 0x69, 0xcd, 0x72, 0x49, 0xe1, 0x04, 0x46, 0x02, 0x20, 0xa1, 0x69, + 0x88, 0x72, 0x00, 0x25, 0xe0, 0x68, 0x01, 0x78, 0x01, 0x29, 0x70, 0x47, + 0xa0, 0x69, 0x03, 0x21, 0x80, 0xf8, 0xd0, 0x10, 0xa1, 0x69, 0x91, 0xf8, + 0xd0, 0x00, 0xa1, 0x68, 0x01, 0xf5, 0xe4, 0x61, 0x00, 0xf0, 0x03, 0x00, + 0x08, 0x60, 0x70, 0x47, 0xa1, 0x69, 0x00, 0x20, 0x81, 0xf8, 0xd0, 0x00, + 0xa0, 0x69, 0x90, 0xf8, 0xd0, 0x10, 0xa0, 0x68, 0x00, 0xf5, 0xe4, 0x60, + 0x01, 0xf0, 0x03, 0x01, 0x01, 0x60, 0x70, 0x47, 0x38, 0xb5, 0x00, 0xf0, + 0x36, 0xf8, 0x89, 0xb1, 0x01, 0x29, 0x12, 0xd1, 0xe0, 0x68, 0x81, 0x79, + 0x01, 0x29, 0x03, 0xd1, 0x20, 0x46, 0x00, 0xf0, 0xc6, 0xf9, 0x05, 0x46, + 0xe0, 0x68, 0x41, 0x79, 0x01, 0x29, 0x06, 0xd1, 0x00, 0xf0, 0x23, 0xf8, + 0x05, 0x43, 0x02, 0xe0, 0x00, 0xf0, 0x1f, 0xf8, 0x05, 0x46, 0x28, 0x46, + 0x32, 0xbd, 0x00, 0x00, 0x38, 0xb5, 0x00, 0xf0, 0x1a, 0xf8, 0x89, 0xb1, + 0x01, 0x29, 0x12, 0xd1, 0xe0, 0x68, 0x81, 0x7a, 0x01, 0x29, 0x03, 0xd1, + 0x20, 0x46, 0x00, 0xf0, 0xaa, 0xf9, 0x05, 0x46, 0xe0, 0x68, 0x41, 0x7a, + 0x01, 0x29, 0x06, 0xd1, 0x00, 0xf0, 0x07, 0xf8, 0x05, 0x43, 0x02, 0xe0, + 0x00, 0xf0, 0x03, 0xf8, 0x05, 0x46, 0x28, 0x46, 0x32, 0xbd, 0x20, 0x46, + 0xaa, 0xe1, 0x04, 0x46, 0x04, 0x20, 0xa1, 0x69, 0x48, 0x72, 0x00, 0x25, + 0xa0, 0x69, 0x01, 0x7a, 0x70, 0x47, 0x00, 0x00, 0x3e, 0xb5, 0x00, 0xf0, + 0x90, 0xf8, 0xd8, 0xb1, 0x01, 0x28, 0x2e, 0xd1, 0x00, 0xf0, 0x89, 0xf8, + 0xa0, 0xb9, 0xe0, 0x68, 0x41, 0x79, 0x01, 0x29, 0x06, 0xd1, 0x00, 0xf0, + 0x80, 0xf8, 0x05, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x43, 0xfa, 0x05, 0x43, + 0xe0, 0x68, 0x81, 0x79, 0x01, 0x29, 0x17, 0xd1, 0x41, 0x79, 0x20, 0x46, + 0x00, 0xf0, 0x29, 0xfa, 0x05, 0x43, 0x11, 0xe0, 0x01, 0x25, 0x0f, 0xe0, + 0x00, 0xf0, 0x6f, 0xf8, 0x01, 0x28, 0x06, 0xd1, 0xa0, 0x69, 0x01, 0x7a, + 0x89, 0x1c, 0x00, 0xf0, 0x61, 0xf8, 0x01, 0x25, 0x09, 0xe0, 0x00, 0xf0, + 0x62, 0xf8, 0x00, 0xf0, 0x70, 0xf8, 0x04, 0xd3, 0xa0, 0x69, 0x01, 0x7a, + 0x49, 0x1c, 0x00, 0xf0, 0x55, 0xf8, 0x00, 0x20, 0xa1, 0x69, 0x00, 0xf0, + 0x4a, 0xf8, 0x18, 0xbf, 0x45, 0xf0, 0x01, 0x05, 0x40, 0x1c, 0x02, 0x28, + 0xf7, 0xd3, 0x39, 0xe0, 0x3e, 0xb5, 0x00, 0xf0, 0x50, 0xf8, 0xc8, 0xb1, + 0x01, 0x28, 0x29, 0xd1, 0x00, 0xf0, 0x49, 0xf8, 0x08, 0xbb, 0xe0, 0x68, + 0x41, 0x7a, 0x01, 0x29, 0x06, 0xd1, 0x00, 0xf0, 0x40, 0xf8, 0x05, 0x46, + 0x20, 0x46, 0x00, 0xf0, 0x03, 0xfa, 0x05, 0x43, 0xe0, 0x68, 0x81, 0x7a, + 0x01, 0x29, 0x12, 0xd1, 0x41, 0x7a, 0x20, 0x46, 0x00, 0xf0, 0xe9, 0xf9, + 0x05, 0x43, 0x0c, 0xe0, 0x00, 0xf0, 0x31, 0xf8, 0x01, 0x28, 0x03, 0xd1, + 0xa0, 0x69, 0x01, 0x7a, 0x89, 0x1c, 0x07, 0xe0, 0x00, 0xf0, 0x27, 0xf8, + 0x00, 0xf0, 0x35, 0xf8, 0x04, 0xd3, 0xa0, 0x69, 0x01, 0x7a, 0x49, 0x1c, + 0x00, 0xf0, 0x1a, 0xf8, 0x00, 0x20, 0xa1, 0x69, 0x00, 0xf0, 0x0f, 0xf8, + 0x18, 0xbf, 0x45, 0xf0, 0x01, 0x05, 0x40, 0x1c, 0x02, 0x28, 0xf7, 0xd3, + 0x08, 0x7a, 0x01, 0x28, 0x03, 0xdd, 0x01, 0x22, 0x8a, 0x72, 0xff, 0xf7, + 0x9a, 0xfe, 0xe8, 0xb2, 0x3e, 0xbd, 0x5d, 0xf8, 0x20, 0x20, 0x51, 0xf8, + 0x20, 0x30, 0x93, 0xea, 0x02, 0x0f, 0x70, 0x47, 0x01, 0x72, 0x02, 0x20, + 0xa1, 0x69, 0x88, 0x72, 0x70, 0x47, 0x20, 0x46, 0xfa, 0xe1, 0x20, 0x46, + 0x61, 0xe2, 0x04, 0x46, 0x06, 0x20, 0xa1, 0x69, 0x48, 0x72, 0x00, 0x25, + 0xa0, 0x69, 0x01, 0x68, 0x00, 0x91, 0x41, 0x68, 0x01, 0x91, 0x00, 0x7a, + 0x70, 0x47, 0x05, 0x46, 0xa0, 0x69, 0xc1, 0x7a, 0x49, 0x1c, 0xc1, 0x72, + 0xa0, 0x69, 0xc1, 0x7a, 0xe0, 0x68, 0x42, 0x7b, 0x91, 0x42, 0x70, 0x47, + 0x30, 0xb5, 0xc1, 0x68, 0x09, 0x7b, 0x01, 0x22, 0x02, 0xfa, 0x01, 0xf1, + 0x49, 0x1e, 0x00, 0x22, 0x21, 0xf0, 0x7f, 0x45, 0xd3, 0xb2, 0x50, 0xf8, + 0x23, 0x30, 0x53, 0xf8, 0x10, 0x4f, 0x04, 0xf0, 0x7f, 0x44, 0x2c, 0x43, + 0x1c, 0x60, 0x52, 0x1c, 0xd3, 0xb2, 0x02, 0x2b, 0xf2, 0xd3, 0x00, 0x21, + 0xc2, 0x68, 0x13, 0x69, 0xcc, 0xb2, 0x50, 0xf8, 0x24, 0x20, 0x23, 0xf0, + 0x40, 0x43, 0x42, 0xf8, 0x14, 0x3f, 0x49, 0x1c, 0xcb, 0xb2, 0x02, 0x2b, + 0xf2, 0xd3, 0x00, 0x21, 0xc2, 0x68, 0x12, 0x7e, 0xcb, 0xb2, 0x50, 0xf8, + 0x23, 0x30, 0x53, 0xf8, 0x04, 0x4f, 0xa4, 0x08, 0x02, 0xf0, 0x03, 0x02, + 0x42, 0xea, 0x84, 0x02, 0x1a, 0x60, 0x49, 0x1c, 0xca, 0xb2, 0x02, 0x2a, + 0xee, 0xd3, 0x00, 0x20, 0x30, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x00, 0x20, + 0x00, 0x21, 0xa2, 0x69, 0x18, 0x25, 0x02, 0xf1, 0x0c, 0x03, 0x45, 0x43, + 0x55, 0xfa, 0x81, 0xf5, 0x00, 0x22, 0x43, 0xf8, 0x25, 0x20, 0x49, 0x1c, + 0xcb, 0xb2, 0x18, 0x2b, 0xf1, 0xd3, 0x40, 0x1c, 0x02, 0x28, 0xed, 0xd3, + 0xe6, 0x68, 0x30, 0x7b, 0x44, 0xf0, 0x8b, 0xfa, 0x4f, 0xf0, 0x7a, 0x51, + 0x44, 0xf0, 0xb6, 0xf9, 0x18, 0xf0, 0xd2, 0xfc, 0x44, 0xf0, 0x7c, 0xfa, + 0x01, 0x25, 0x05, 0xfa, 0x00, 0xf0, 0x40, 0x1e, 0x00, 0x21, 0xca, 0xb2, + 0x54, 0xf8, 0x22, 0x20, 0x52, 0xf8, 0x10, 0x3f, 0x60, 0xf3, 0x1d, 0x63, + 0x13, 0x60, 0x49, 0x1c, 0xca, 0xb2, 0x02, 0x2a, 0xf3, 0xd3, 0x00, 0x20, + 0xe1, 0x68, 0x4a, 0x69, 0xc3, 0xb2, 0x54, 0xf8, 0x23, 0x10, 0x22, 0xf0, + 0x40, 0x42, 0x41, 0xf8, 0x18, 0x2f, 0x40, 0x1c, 0xc2, 0xb2, 0x02, 0x2a, + 0xf2, 0xd3, 0x00, 0x20, 0xe1, 0x68, 0x09, 0x7e, 0xc2, 0xb2, 0x54, 0xf8, + 0x22, 0x20, 0x52, 0xf8, 0x04, 0x3f, 0x40, 0x1c, 0x61, 0xf3, 0x83, 0x03, + 0xc1, 0xb2, 0x02, 0x29, 0x13, 0x60, 0xf1, 0xd3, 0x00, 0x20, 0x70, 0xbd, + 0x7c, 0xb5, 0x01, 0x46, 0x05, 0x20, 0x8c, 0x69, 0x00, 0x22, 0x60, 0x72, + 0xcd, 0xe9, 0x00, 0x22, 0x00, 0x23, 0x00, 0xf0, 0x27, 0xf8, 0x00, 0x98, + 0x00, 0x28, 0x1c, 0xbf, 0x01, 0x98, 0x00, 0x28, 0x07, 0xd1, 0xc8, 0x68, + 0x05, 0x6a, 0xab, 0x42, 0x03, 0xd2, 0x5b, 0x1c, 0x00, 0xf0, 0x1a, 0xf8, + 0xf1, 0xe7, 0xc8, 0x68, 0x04, 0x6a, 0xa3, 0x42, 0x12, 0xd1, 0x00, 0x20, + 0x8a, 0x69, 0x52, 0xf8, 0x20, 0x30, 0x43, 0xf0, 0x02, 0x03, 0x42, 0xf8, + 0x20, 0x30, 0x40, 0x1c, 0x01, 0x28, 0xf5, 0xd9, 0x8b, 0x69, 0x02, 0x20, + 0x98, 0x72, 0x01, 0x22, 0x88, 0x69, 0x01, 0x7a, 0x49, 0x1c, 0x01, 0x72, + 0x10, 0x46, 0x76, 0xbd, 0x00, 0x20, 0x51, 0xf8, 0x20, 0x50, 0x55, 0xf8, + 0x08, 0x6f, 0x06, 0xf0, 0x01, 0x06, 0x4d, 0xf8, 0x20, 0x60, 0x40, 0x1c, + 0x01, 0x28, 0xf4, 0xd9, 0x70, 0x47, 0x00, 0x00, 0x30, 0xb5, 0x05, 0x21, + 0x02, 0x46, 0x00, 0x20, 0x93, 0x69, 0x59, 0x72, 0x11, 0x6c, 0x11, 0xb1, + 0x49, 0x1e, 0x11, 0x64, 0x30, 0xbd, 0x01, 0x20, 0x02, 0x25, 0x93, 0x69, + 0x53, 0xf8, 0x21, 0x40, 0x44, 0xf0, 0x01, 0x04, 0x43, 0xf8, 0x21, 0x40, + 0x9d, 0x72, 0x49, 0x1c, 0x93, 0x69, 0x1c, 0x7a, 0x64, 0x1c, 0x01, 0x29, + 0x1c, 0x72, 0xf0, 0xd9, 0x30, 0xbd, 0x82, 0x68, 0x02, 0xf2, 0x24, 0x72, + 0x00, 0x21, 0x11, 0x60, 0xca, 0xb2, 0x50, 0xf8, 0x22, 0x20, 0x13, 0x68, + 0x43, 0xf0, 0x01, 0x03, 0x13, 0x60, 0x49, 0x1c, 0xca, 0xb2, 0x01, 0x2a, + 0xf4, 0xd9, 0x0f, 0xe0, 0x82, 0x68, 0x02, 0xf2, 0x24, 0x72, 0x00, 0x21, + 0x11, 0x60, 0xca, 0xb2, 0x50, 0xf8, 0x22, 0x20, 0x13, 0x68, 0x43, 0xf0, + 0x02, 0x03, 0x13, 0x60, 0x49, 0x1c, 0xca, 0xb2, 0x02, 0x2a, 0xf4, 0xd3, + 0x08, 0x21, 0x80, 0x68, 0x00, 0xf2, 0x24, 0x70, 0x01, 0x60, 0x00, 0x20, + 0x70, 0x47, 0xf8, 0xb5, 0x88, 0xb0, 0x04, 0x46, 0x68, 0x46, 0x0f, 0xf2, + 0xa4, 0x51, 0x20, 0x22, 0xfb, 0xf7, 0x74, 0xfa, 0x00, 0x20, 0x00, 0x21, + 0x00, 0x22, 0x46, 0xf6, 0xcc, 0x75, 0x02, 0xeb, 0xc1, 0x06, 0x4f, 0xf4, + 0xe5, 0x77, 0x05, 0xf2, 0x89, 0x15, 0x7e, 0x43, 0xaf, 0x19, 0x02, 0xeb, + 0xc1, 0x06, 0x40, 0xf2, 0xc9, 0x1e, 0x0e, 0xfb, 0x06, 0xf6, 0x54, 0xf8, + 0x20, 0x30, 0x35, 0x44, 0x04, 0xf1, 0x10, 0x06, 0x7f, 0x1b, 0x56, 0xf8, + 0x20, 0x50, 0x55, 0xf8, 0x21, 0x60, 0x5d, 0xf8, 0x22, 0x50, 0x03, 0xeb, + 0x87, 0x03, 0x03, 0xf5, 0xce, 0x73, 0x6e, 0x43, 0x52, 0x1c, 0xb6, 0xb2, + 0x08, 0x2a, 0x1e, 0x60, 0xd9, 0xd3, 0x49, 0x1c, 0x08, 0x29, 0xd5, 0xd3, + 0x40, 0x1c, 0x01, 0x28, 0xd1, 0xd9, 0x00, 0x20, 0x00, 0x21, 0x4e, 0xf2, + 0x0c, 0x22, 0xd4, 0x25, 0xcf, 0x32, 0x4d, 0x43, 0xd3, 0x26, 0x00, 0xf0, + 0x3f, 0xf8, 0x03, 0xf5, 0x27, 0x73, 0x00, 0xf0, 0x35, 0xf8, 0x35, 0x6a, + 0xc5, 0xf3, 0x0b, 0x05, 0x03, 0x29, 0x1d, 0x60, 0xed, 0xd9, 0x40, 0x1c, + 0x01, 0x28, 0xe9, 0xd9, 0xe0, 0x68, 0x90, 0xf8, 0x34, 0x10, 0x01, 0x29, + 0x16, 0xd1, 0x00, 0x20, 0x00, 0x21, 0x4e, 0xf2, 0x58, 0x52, 0xce, 0x25, + 0xca, 0x32, 0x4d, 0x43, 0xcd, 0x26, 0x00, 0xf0, 0x23, 0xf8, 0x03, 0xf5, + 0x2b, 0x73, 0x00, 0xf0, 0x19, 0xf8, 0x35, 0x6b, 0xc5, 0xf3, 0x09, 0x05, + 0x02, 0x29, 0x1d, 0x60, 0xed, 0xd9, 0x40, 0x1c, 0x01, 0x28, 0xe9, 0xd9, + 0x00, 0x20, 0xc1, 0xb2, 0x54, 0xf8, 0x21, 0x10, 0x01, 0xf5, 0x2e, 0x71, + 0x40, 0x1c, 0x0a, 0x68, 0x42, 0xf0, 0x01, 0x02, 0x0a, 0x60, 0xc1, 0xb2, + 0x01, 0x29, 0xf2, 0xd9, 0x09, 0xb0, 0xf0, 0xbd, 0x55, 0xf8, 0x20, 0x20, + 0x02, 0xeb, 0x81, 0x06, 0x49, 0x1c, 0x70, 0x47, 0x15, 0x44, 0x4e, 0x43, + 0x54, 0xf8, 0x20, 0x30, 0x32, 0x44, 0xad, 0x1a, 0x03, 0xeb, 0x85, 0x03, + 0x04, 0xf1, 0x10, 0x05, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46, 0x03, 0xf0, + 0xd1, 0xfc, 0xe0, 0x68, 0x90, 0xf8, 0x35, 0x10, 0x01, 0x29, 0x05, 0xd1, + 0x20, 0x46, 0x00, 0xf0, 0xd4, 0xf8, 0x20, 0x46, 0xff, 0xf7, 0x65, 0xff, + 0x00, 0x20, 0x10, 0xbd, 0x2d, 0xe9, 0xf0, 0x47, 0x81, 0x46, 0x00, 0x25, + 0x18, 0x26, 0x00, 0x24, 0x06, 0xfb, 0x05, 0xfa, 0xd9, 0xf8, 0x18, 0x80, + 0xd9, 0xf8, 0x0c, 0x10, 0x04, 0xeb, 0x0a, 0x00, 0x08, 0xeb, 0x80, 0x07, + 0x48, 0x7b, 0x44, 0xf0, 0x1e, 0xf9, 0x4f, 0xf0, 0x7e, 0x51, 0x44, 0xf0, + 0x40, 0xf8, 0x01, 0x46, 0xf8, 0x68, 0x44, 0xf0, 0x33, 0xf8, 0xf8, 0x60, + 0x64, 0xb9, 0x08, 0xf1, 0x0c, 0x01, 0x4f, 0xf0, 0x7e, 0x50, 0x51, 0xf8, + 0x2a, 0x10, 0x44, 0xf0, 0x44, 0xf8, 0x08, 0xf1, 0x0c, 0x02, 0x42, 0xf8, + 0x2a, 0x00, 0x02, 0xe0, 0x80, 0xf0, 0x00, 0x40, 0xf8, 0x60, 0x64, 0x1c, + 0x18, 0x2c, 0xd7, 0xd3, 0x6d, 0x1c, 0x02, 0x2d, 0xd1, 0xd3, 0x00, 0x20, + 0xbd, 0xe8, 0xf0, 0x87, 0xf8, 0xb5, 0xb0, 0xb0, 0x04, 0x46, 0x68, 0x46, + 0xc0, 0x21, 0x0c, 0xf0, 0xbd, 0xff, 0x00, 0x20, 0xc1, 0xb2, 0x54, 0xf8, + 0x21, 0x10, 0x0a, 0x68, 0x22, 0xf0, 0x02, 0x02, 0x0a, 0x60, 0x40, 0x1c, + 0xc1, 0xb2, 0x02, 0x29, 0xf4, 0xd3, 0x69, 0x46, 0x20, 0x46, 0x04, 0xf0, + 0xaf, 0xf8, 0x00, 0x25, 0x00, 0x26, 0x18, 0x21, 0xa0, 0x69, 0x01, 0xfb, + 0x05, 0x61, 0x00, 0xeb, 0x81, 0x07, 0x5d, 0xf8, 0x21, 0x10, 0xf8, 0x68, + 0x43, 0xf0, 0xfd, 0xff, 0x76, 0x1c, 0x18, 0x2e, 0xf8, 0x60, 0xf0, 0xd3, + 0x6d, 0x1c, 0x02, 0x2d, 0xec, 0xd3, 0x00, 0x20, 0x31, 0xb0, 0xf0, 0xbd, + 0x3f, 0xb5, 0x02, 0xa9, 0x00, 0x22, 0xc1, 0xe9, 0x00, 0x22, 0xcd, 0xe9, + 0x00, 0x22, 0x03, 0x68, 0x1a, 0x60, 0x00, 0x21, 0x42, 0x68, 0x11, 0x60, + 0x00, 0x23, 0x02, 0xaa, 0x50, 0xf8, 0x23, 0x40, 0x08, 0x34, 0x24, 0x68, + 0xc4, 0xf3, 0x80, 0x05, 0x42, 0xf8, 0x23, 0x50, 0xc4, 0xf3, 0xc0, 0x04, + 0x4d, 0xf8, 0x23, 0x40, 0x5b, 0x1c, 0x02, 0x2b, 0xf0, 0xd3, 0x00, 0x23, + 0x85, 0x69, 0x52, 0xf8, 0x23, 0x40, 0x1d, 0x44, 0x85, 0xf8, 0xcc, 0x40, + 0x85, 0x69, 0x5d, 0xf8, 0x23, 0x40, 0x1d, 0x44, 0x5b, 0x1c, 0x02, 0x2b, + 0x85, 0xf8, 0xce, 0x40, 0xf0, 0xd3, 0x02, 0x68, 0x03, 0x21, 0x42, 0xf8, + 0x0c, 0x1f, 0x03, 0x23, 0x41, 0x68, 0x41, 0xf8, 0x0c, 0x3f, 0x00, 0x22, + 0x80, 0x68, 0x00, 0xf2, 0x24, 0x70, 0x02, 0x60, 0x3f, 0xbd, 0x30, 0xb5, + 0x01, 0x46, 0x00, 0x20, 0x00, 0x22, 0x8b, 0x69, 0x9c, 0x18, 0x14, 0xf8, + 0xcc, 0x5f, 0x01, 0x2d, 0x06, 0xd1, 0x53, 0xf8, 0x22, 0x00, 0x40, 0xf4, + 0x80, 0x70, 0x43, 0xf8, 0x22, 0x00, 0x01, 0x20, 0xa4, 0x78, 0x01, 0x2c, + 0x06, 0xd1, 0x53, 0xf8, 0x22, 0x00, 0x40, 0xf4, 0x00, 0x70, 0x43, 0xf8, + 0x22, 0x00, 0x01, 0x20, 0x52, 0x1c, 0x02, 0x2a, 0xe5, 0xd3, 0x30, 0xbd, + 0x80, 0x69, 0x80, 0x7a, 0x70, 0x47, 0x00, 0x00, 0xc0, 0x68, 0x90, 0xf8, + 0x24, 0x00, 0x70, 0x47, 0x80, 0x69, 0x50, 0xf8, 0x21, 0x00, 0x70, 0x47, + 0x80, 0x69, 0x00, 0x21, 0x01, 0x60, 0x41, 0x60, 0x70, 0x47, 0xf0, 0xb5, + 0x00, 0x22, 0x00, 0x23, 0x00, 0xeb, 0x82, 0x01, 0x84, 0x69, 0x04, 0xeb, + 0x42, 0x15, 0x05, 0xeb, 0x83, 0x06, 0x0d, 0x69, 0xd6, 0xf8, 0xd8, 0x40, + 0x45, 0xf8, 0x23, 0x40, 0x5b, 0x1c, 0x08, 0x2b, 0xf2, 0xd3, 0x00, 0x23, + 0x0c, 0x69, 0x04, 0xeb, 0x83, 0x05, 0x84, 0x69, 0x04, 0xeb, 0x02, 0x16, + 0x06, 0xeb, 0x83, 0x07, 0x5b, 0x1c, 0xd7, 0xf8, 0x18, 0x41, 0x2c, 0x62, + 0x04, 0x2b, 0xf1, 0xd3, 0x52, 0x1c, 0x02, 0x2a, 0xdd, 0xd3, 0xf0, 0xbd, + 0x70, 0xb5, 0x01, 0x46, 0x00, 0x20, 0x00, 0x22, 0x00, 0x23, 0x8c, 0x69, + 0x04, 0xeb, 0x42, 0x15, 0x05, 0xeb, 0x83, 0x06, 0x01, 0xeb, 0x82, 0x05, + 0xd6, 0xf8, 0xd8, 0x40, 0x2e, 0x69, 0x56, 0xf8, 0x23, 0x50, 0xac, 0x42, + 0x06, 0xd1, 0x5b, 0x1c, 0x08, 0x2b, 0xee, 0xd3, 0x52, 0x1c, 0x02, 0x2a, + 0xea, 0xd3, 0x70, 0xbd, 0x01, 0x20, 0x70, 0xbd, 0xf0, 0xb5, 0x01, 0x46, + 0x00, 0x20, 0x00, 0x22, 0x00, 0x23, 0x8c, 0x69, 0x04, 0xeb, 0x02, 0x15, + 0x05, 0xeb, 0x83, 0x06, 0x01, 0xeb, 0x82, 0x05, 0xd6, 0xf8, 0x18, 0x41, + 0x2e, 0x69, 0x06, 0xeb, 0x83, 0x07, 0x3d, 0x6a, 0xac, 0x42, 0x06, 0xd1, + 0x5b, 0x1c, 0x04, 0x2b, 0xed, 0xd3, 0x52, 0x1c, 0x02, 0x2a, 0xe9, 0xd3, + 0xf0, 0xbd, 0x01, 0x20, 0xf0, 0xbd, 0x38, 0xb5, 0x04, 0x46, 0xff, 0xf7, + 0xc3, 0xff, 0x00, 0x25, 0x01, 0x28, 0x04, 0xd0, 0x20, 0x46, 0xff, 0xf7, + 0xd9, 0xff, 0x01, 0x28, 0x00, 0xd1, 0x01, 0x25, 0x28, 0x46, 0x32, 0xbd, + 0xf0, 0xb5, 0xb1, 0xb0, 0x04, 0x46, 0xff, 0xf7, 0xcf, 0xff, 0x00, 0x25, + 0x01, 0x28, 0x6a, 0xd1, 0x00, 0x20, 0x01, 0xa9, 0x11, 0xab, 0x21, 0xaf, + 0x00, 0x22, 0x01, 0xeb, 0x40, 0x11, 0x03, 0xeb, 0x40, 0x13, 0x07, 0xeb, + 0x40, 0x16, 0xd4, 0xf8, 0x18, 0xc0, 0x0c, 0xeb, 0x00, 0x17, 0x07, 0xeb, + 0x82, 0x07, 0xd7, 0xf8, 0x18, 0x71, 0x46, 0xf8, 0x22, 0x70, 0x04, 0xf1, + 0x10, 0x07, 0x57, 0xf8, 0x20, 0x70, 0x07, 0xeb, 0x82, 0x0e, 0xde, 0xf8, + 0x20, 0x70, 0x43, 0xf8, 0x22, 0x70, 0x41, 0xf8, 0x22, 0x50, 0x52, 0x1c, + 0x04, 0x2a, 0xe6, 0xd3, 0x04, 0x22, 0x46, 0xf8, 0x22, 0x50, 0x43, 0xf8, + 0x22, 0x50, 0x41, 0xf8, 0x22, 0x50, 0x52, 0x1c, 0x08, 0x2a, 0xf6, 0xd3, + 0x40, 0x1c, 0x02, 0x28, 0xcf, 0xd3, 0x00, 0xf0, 0x3b, 0xf8, 0x04, 0xf0, + 0x87, 0xf8, 0x00, 0xf0, 0x37, 0xf8, 0x04, 0xf0, 0xd6, 0xf8, 0x00, 0x20, + 0x00, 0x21, 0x04, 0xf1, 0x10, 0x02, 0x52, 0xf8, 0x20, 0x30, 0x03, 0xeb, + 0x81, 0x06, 0x11, 0xaa, 0x02, 0xeb, 0x40, 0x13, 0x53, 0xf8, 0x21, 0x70, + 0x37, 0x62, 0x49, 0x1c, 0x04, 0x29, 0xf0, 0xd3, 0x40, 0x1c, 0x02, 0x28, + 0xec, 0xd3, 0x20, 0x46, 0xff, 0xf7, 0x7c, 0xff, 0x01, 0x28, 0x18, 0xd1, + 0x00, 0xf0, 0x1a, 0xf8, 0x04, 0xf0, 0xfa, 0xf8, 0x00, 0x20, 0x00, 0x21, + 0x04, 0xf1, 0x10, 0x02, 0x52, 0xf8, 0x20, 0x30, 0x03, 0xeb, 0x81, 0x05, + 0x11, 0xaa, 0x02, 0xeb, 0x40, 0x13, 0x53, 0xf8, 0x21, 0x60, 0x2e, 0x62, + 0x49, 0x1c, 0x04, 0x29, 0xf0, 0xd3, 0x40, 0x1c, 0x02, 0x28, 0xec, 0xd3, + 0x01, 0x25, 0x28, 0x46, 0x31, 0xb0, 0xf0, 0xbd, 0x04, 0x20, 0x00, 0x90, + 0x02, 0x23, 0x01, 0xaa, 0x11, 0xa9, 0x21, 0xa8, 0x70, 0x47, 0xf0, 0xb5, + 0xb1, 0xb0, 0x04, 0x46, 0x0d, 0x46, 0xff, 0xf7, 0x35, 0xff, 0x01, 0x28, + 0x56, 0xd1, 0x00, 0x21, 0x00, 0x22, 0xa3, 0x69, 0x03, 0xeb, 0x41, 0x13, + 0x03, 0xeb, 0x82, 0x06, 0x21, 0xab, 0xd6, 0xf8, 0xd8, 0x70, 0x03, 0xeb, + 0x41, 0x13, 0x04, 0xf1, 0x10, 0x06, 0x43, 0xf8, 0x22, 0x70, 0x11, 0xaf, + 0x56, 0xf8, 0x21, 0x30, 0x53, 0xf8, 0x22, 0x60, 0x07, 0xeb, 0x41, 0x17, + 0x00, 0x23, 0x47, 0xf8, 0x22, 0x60, 0x01, 0xae, 0x06, 0xeb, 0x41, 0x16, + 0x46, 0xf8, 0x22, 0x30, 0x52, 0x1c, 0x08, 0x2a, 0xdf, 0xd3, 0x49, 0x1c, + 0x02, 0x29, 0xdb, 0xd3, 0x00, 0xf0, 0x38, 0xf8, 0x04, 0xf0, 0x16, 0xf8, + 0x00, 0xf0, 0x34, 0xf8, 0x04, 0xf0, 0x65, 0xf8, 0x00, 0x20, 0x00, 0x21, + 0x00, 0xf0, 0x28, 0xf8, 0x02, 0xeb, 0x40, 0x16, 0x56, 0xf8, 0x21, 0x70, + 0x43, 0xf8, 0x21, 0x70, 0x49, 0x1c, 0x08, 0x29, 0xf4, 0xd3, 0x40, 0x1c, + 0x02, 0x28, 0xf0, 0xd3, 0xc5, 0xb9, 0x20, 0x46, 0xff, 0xf7, 0xf2, 0xfe, + 0x01, 0x28, 0x13, 0xd1, 0x00, 0xf0, 0x1a, 0xf8, 0x04, 0xf0, 0x8c, 0xf8, + 0x00, 0x20, 0x00, 0x21, 0x00, 0xf0, 0x0e, 0xf8, 0x02, 0xeb, 0x40, 0x15, + 0x55, 0xf8, 0x21, 0x60, 0x43, 0xf8, 0x21, 0x60, 0x49, 0x1c, 0x08, 0x29, + 0xf4, 0xd3, 0x40, 0x1c, 0x02, 0x28, 0xf0, 0xd3, 0x31, 0xb0, 0xf0, 0xbd, + 0x04, 0xf1, 0x10, 0x02, 0x52, 0xf8, 0x20, 0x30, 0x11, 0xaa, 0x70, 0x47, + 0x08, 0x20, 0x00, 0x90, 0x02, 0x23, 0x01, 0xaa, 0x11, 0xa9, 0x21, 0xa8, + 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46, 0xff, 0xf7, 0x02, 0xff, 0x01, 0x28, + 0x0a, 0xd1, 0x20, 0x46, 0xff, 0xf7, 0x0c, 0xff, 0x01, 0x46, 0x20, 0x46, + 0xff, 0xf7, 0x85, 0xff, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x2a, 0xe5, + 0x10, 0xbd, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xf9, 0xff, 0xff, 0xff, + 0xfb, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x6b, 0x02, 0xf5, 0x3f, 0x72, 0x00, 0x21, 0x11, 0x60, 0x01, 0x21, + 0xc2, 0x6b, 0x02, 0xf5, 0x3f, 0x72, 0x11, 0x60, 0x00, 0x21, 0x02, 0x6c, + 0x02, 0xf5, 0x3f, 0x72, 0x11, 0x60, 0x01, 0x21, 0x04, 0xe0, 0xc2, 0x6b, + 0x02, 0xf5, 0x3f, 0x72, 0x00, 0x21, 0x11, 0x60, 0x00, 0x6c, 0x00, 0xf5, + 0x3f, 0x70, 0x01, 0x60, 0x70, 0x47, 0x30, 0xb5, 0x00, 0x22, 0x00, 0xf0, + 0x95, 0xf9, 0x04, 0xf5, 0x40, 0x74, 0xd3, 0xb2, 0x01, 0xf0, 0x1f, 0x05, + 0x02, 0x2b, 0x25, 0x60, 0xf5, 0xd3, 0x30, 0xbd, 0x10, 0xb5, 0x00, 0x22, + 0x00, 0xeb, 0x82, 0x03, 0xdc, 0x6b, 0x04, 0xf5, 0x40, 0x74, 0x23, 0x68, + 0x03, 0xf0, 0x1f, 0x03, 0x00, 0xf0, 0x92, 0xf9, 0xf4, 0xd3, 0x10, 0xbd, + 0x30, 0xb5, 0x00, 0xeb, 0x83, 0x00, 0x4b, 0x08, 0xc9, 0x07, 0x02, 0xf0, + 0x0f, 0x02, 0x0f, 0xd5, 0x43, 0xf2, 0xe6, 0x44, 0x43, 0x21, 0x39, 0x34, + 0x45, 0x6c, 0x11, 0xfb, 0x03, 0xf1, 0x42, 0x20, 0x00, 0xf0, 0x15, 0xf8, + 0x03, 0xf0, 0x0f, 0x03, 0x43, 0xea, 0x02, 0x13, 0x03, 0x70, 0x30, 0xbd, + 0x43, 0xf2, 0x38, 0x71, 0x01, 0xf1, 0x35, 0x04, 0x45, 0x6c, 0xc3, 0xeb, + 0x83, 0x11, 0x3e, 0x20, 0x00, 0xf0, 0x05, 0xf8, 0x03, 0xf0, 0xf0, 0x03, + 0x1a, 0x43, 0x02, 0x70, 0x30, 0xbd, 0x21, 0x44, 0x43, 0x43, 0x4d, 0x19, + 0xe0, 0x18, 0x28, 0x1a, 0x10, 0xf8, 0x31, 0x3f, 0x70, 0x47, 0x70, 0xb5, + 0x16, 0x46, 0x00, 0x23, 0x04, 0x46, 0xf2, 0x56, 0x0d, 0x46, 0xff, 0xf7, + 0xc9, 0xff, 0x01, 0x23, 0x29, 0x46, 0xf2, 0x56, 0x20, 0x46, 0xbd, 0xe8, + 0x70, 0x40, 0xc1, 0xe7, 0x30, 0xb5, 0x00, 0xeb, 0x83, 0x00, 0x4c, 0x08, + 0x43, 0x6c, 0xc8, 0x07, 0x0a, 0xd5, 0x43, 0xf2, 0xe6, 0x45, 0x43, 0x21, + 0x39, 0x35, 0x11, 0xfb, 0x04, 0xf1, 0x42, 0x20, 0x00, 0xf0, 0x12, 0xf8, + 0x00, 0x09, 0x09, 0xe0, 0x43, 0xf2, 0x38, 0x75, 0x35, 0x35, 0xc4, 0xeb, + 0x84, 0x11, 0x3e, 0x20, 0x00, 0xf0, 0x08, 0xf8, 0x00, 0xf0, 0x0f, 0x00, + 0x01, 0x07, 0x48, 0xbf, 0x40, 0xf0, 0xf0, 0x00, 0x10, 0x70, 0x30, 0xbd, + 0x29, 0x44, 0x44, 0x43, 0xcb, 0x18, 0x28, 0x19, 0x1b, 0x1a, 0x13, 0xf8, + 0x31, 0x0f, 0x70, 0x47, 0x30, 0xb5, 0x0c, 0x46, 0x04, 0xf0, 0x03, 0x01, + 0x00, 0xeb, 0x83, 0x00, 0xa4, 0x08, 0x89, 0xb9, 0x43, 0xf6, 0x53, 0x51, + 0x43, 0x6c, 0x3a, 0x31, 0x01, 0xeb, 0x84, 0x10, 0xc3, 0x18, 0xc4, 0xeb, + 0x84, 0x14, 0x08, 0x19, 0x18, 0x1a, 0x02, 0xf0, 0x03, 0x02, 0x10, 0xf8, + 0x3a, 0x1f, 0x01, 0xf0, 0xfc, 0x01, 0x15, 0xe0, 0x01, 0x29, 0x15, 0xd1, + 0x43, 0x6c, 0x43, 0xf6, 0x0e, 0x41, 0x42, 0x20, 0x3c, 0x31, 0x10, 0xfb, + 0x04, 0xf0, 0x08, 0x44, 0xc3, 0x18, 0x04, 0xeb, 0x84, 0x14, 0x08, 0x19, + 0x18, 0x1a, 0x92, 0x00, 0x10, 0xf8, 0x3a, 0x1f, 0x01, 0xf0, 0xf3, 0x01, + 0x02, 0xf0, 0x0c, 0x02, 0x0a, 0x43, 0x14, 0xe0, 0x02, 0x29, 0x14, 0xd1, + 0x43, 0xf6, 0xbf, 0x21, 0x01, 0xf1, 0x3e, 0x03, 0x44, 0x21, 0x45, 0x6c, + 0x11, 0xfb, 0x04, 0xf1, 0x43, 0x20, 0x00, 0xf0, 0x1d, 0xf8, 0x12, 0x01, + 0x10, 0xf8, 0x3a, 0x3f, 0x03, 0xf0, 0xcf, 0x03, 0x02, 0xf0, 0x30, 0x02, + 0x1a, 0x43, 0x02, 0x70, 0x30, 0xbd, 0x43, 0xf6, 0x66, 0x11, 0x01, 0xf1, + 0x40, 0x03, 0x46, 0x21, 0x45, 0x6c, 0x11, 0xfb, 0x04, 0xf1, 0x45, 0x20, + 0x00, 0xf0, 0x08, 0xf8, 0x10, 0xf8, 0x3a, 0x3f, 0x03, 0xf0, 0x3f, 0x03, + 0x43, 0xea, 0x82, 0x13, 0x03, 0x70, 0x30, 0xbd, 0x19, 0x44, 0x44, 0x43, + 0x4d, 0x19, 0x18, 0x19, 0x28, 0x1a, 0x70, 0x47, 0x70, 0xb5, 0x00, 0xf0, + 0x1a, 0xf8, 0xff, 0xf7, 0x99, 0xff, 0x72, 0x78, 0x29, 0x46, 0x20, 0x46, + 0xbd, 0xe8, 0x70, 0x40, 0x01, 0x23, 0x91, 0xe7, 0x70, 0xb5, 0x00, 0xf0, + 0x1a, 0xf8, 0x22, 0x70, 0x70, 0xbd, 0x70, 0xb5, 0x00, 0xf0, 0x09, 0xf8, + 0xff, 0xf7, 0xf6, 0xff, 0x72, 0x78, 0x29, 0x46, 0x20, 0x46, 0xbd, 0xe8, + 0x70, 0x40, 0x01, 0x23, 0xee, 0xe7, 0x16, 0x46, 0x04, 0x46, 0x32, 0x78, + 0x0d, 0x46, 0x00, 0x23, 0x70, 0x47, 0x70, 0xb5, 0x00, 0xf0, 0x03, 0xf8, + 0x20, 0x78, 0x10, 0x70, 0x70, 0xbd, 0x00, 0xeb, 0x83, 0x00, 0x0b, 0x29, + 0x44, 0x6c, 0x08, 0x46, 0x0c, 0xd2, 0x42, 0xf2, 0x85, 0x53, 0x42, 0x21, + 0x36, 0x33, 0x11, 0xfb, 0x00, 0xf1, 0x19, 0x44, 0x00, 0xeb, 0x80, 0x10, + 0x0c, 0x19, 0x18, 0x44, 0x24, 0x1a, 0x70, 0x47, 0x3b, 0x26, 0x42, 0xf6, + 0x63, 0x35, 0x16, 0xfb, 0x00, 0xf6, 0x3a, 0x21, 0x2e, 0x44, 0x48, 0x43, + 0xa6, 0xf2, 0x56, 0x23, 0x29, 0x18, 0x1c, 0x19, 0xa1, 0xf2, 0x4b, 0x20, + 0x24, 0x1a, 0x10, 0x34, 0x70, 0x47, 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, + 0x16, 0x46, 0x00, 0x23, 0xff, 0xf7, 0xcf, 0xff, 0x72, 0x1c, 0x29, 0x46, + 0x20, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x01, 0x23, 0xc7, 0xe7, 0x30, 0xb5, + 0x00, 0x22, 0x00, 0xf0, 0x1a, 0xf8, 0x13, 0xf8, 0x24, 0x4f, 0x00, 0xf0, + 0x02, 0xf8, 0xf8, 0xd3, 0x30, 0xbd, 0x04, 0xf0, 0xfd, 0x04, 0x05, 0xf0, + 0x02, 0x05, 0x2c, 0x43, 0x1c, 0x70, 0x52, 0x1c, 0xd3, 0xb2, 0x02, 0x2b, + 0x70, 0x47, 0x30, 0xb5, 0x00, 0x22, 0x00, 0xf0, 0x06, 0xf8, 0x13, 0xf8, + 0x0c, 0x4f, 0xff, 0xf7, 0xee, 0xff, 0xf8, 0xd3, 0x30, 0xbd, 0xd3, 0xb2, + 0x00, 0xeb, 0x83, 0x03, 0x4d, 0x00, 0x5b, 0x6c, 0x70, 0x47, 0x30, 0xb5, + 0x00, 0x22, 0xd3, 0xb2, 0x00, 0xeb, 0x83, 0x03, 0xcd, 0x00, 0x5b, 0x6c, + 0x13, 0xf8, 0x20, 0x4f, 0x04, 0xf0, 0xf7, 0x04, 0x05, 0xf0, 0x08, 0x05, + 0xff, 0xf7, 0xdb, 0xff, 0xf1, 0xd3, 0x30, 0xbd, 0xc0, 0x6c, 0x01, 0xf0, + 0x3f, 0x01, 0x00, 0xf8, 0x05, 0x1f, 0x70, 0x47, 0x30, 0xb5, 0x00, 0x22, + 0xd3, 0xb2, 0x00, 0xeb, 0x83, 0x03, 0x4d, 0x01, 0x5b, 0x6c, 0x13, 0xf8, + 0x0c, 0x4f, 0x04, 0xf0, 0xdf, 0x04, 0x05, 0xf0, 0x20, 0x05, 0xff, 0xf7, + 0xc4, 0xff, 0xf1, 0xd3, 0x30, 0xbd, 0x30, 0xb5, 0x00, 0x22, 0x00, 0xf0, + 0x09, 0xf8, 0x04, 0xf5, 0x49, 0x74, 0xd3, 0xb2, 0x01, 0xf0, 0x03, 0x05, + 0x02, 0x2b, 0x25, 0x60, 0xf5, 0xd3, 0x30, 0xbd, 0xd3, 0xb2, 0x00, 0xeb, + 0x83, 0x03, 0x52, 0x1c, 0xdc, 0x6b, 0x70, 0x47, 0x10, 0xb5, 0x00, 0x22, + 0x00, 0xeb, 0x82, 0x03, 0xdc, 0x6b, 0x04, 0xf5, 0x45, 0x74, 0x00, 0xf0, + 0x02, 0xf8, 0xf7, 0xd3, 0x10, 0xbd, 0x23, 0x68, 0x41, 0xf8, 0x22, 0x30, + 0x52, 0x1c, 0x02, 0x2a, 0x70, 0x47, 0x10, 0xb5, 0x00, 0x22, 0x00, 0xeb, + 0x82, 0x03, 0xdc, 0x6b, 0x04, 0xf5, 0x46, 0x74, 0xff, 0xf7, 0xf1, 0xff, + 0xf7, 0xd3, 0x10, 0xbd, 0x00, 0xeb, 0x81, 0x00, 0x02, 0xf0, 0x0f, 0x02, + 0x41, 0x6c, 0x01, 0xf8, 0x30, 0x2f, 0x70, 0x47, 0x42, 0x6c, 0x01, 0xf0, + 0x0f, 0x01, 0x02, 0xf8, 0x30, 0x1f, 0x80, 0x6c, 0x00, 0xf8, 0x30, 0x1f, + 0x70, 0x47, 0x00, 0xeb, 0x81, 0x00, 0x02, 0xf0, 0x03, 0x02, 0x41, 0x6c, + 0x01, 0xf8, 0x17, 0x2f, 0x70, 0x47, 0x0a, 0x78, 0x43, 0x6c, 0x02, 0xf0, + 0x01, 0x02, 0x03, 0xf8, 0x0f, 0x2f, 0x80, 0x6c, 0x4a, 0x78, 0x02, 0xf0, + 0x01, 0x02, 0x00, 0xf8, 0x0f, 0x2f, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x41, + 0x04, 0x46, 0x86, 0xb0, 0x04, 0xa8, 0x00, 0x26, 0xc0, 0xe9, 0x00, 0x66, + 0x02, 0xa8, 0xcd, 0xe9, 0x00, 0x66, 0xc0, 0xe9, 0x00, 0x66, 0xa0, 0x6b, + 0x00, 0xf2, 0x24, 0x70, 0x0d, 0x46, 0x06, 0x60, 0x20, 0x46, 0x22, 0x6d, + 0x92, 0xf8, 0x3c, 0x10, 0xff, 0xf7, 0x93, 0xff, 0xe0, 0x6b, 0x00, 0xf5, + 0x4a, 0x70, 0x01, 0x21, 0x06, 0x60, 0xe0, 0x6b, 0x00, 0xf5, 0x4a, 0x70, + 0x01, 0x60, 0x20, 0x6c, 0x00, 0xf5, 0x4a, 0x70, 0x06, 0x60, 0x20, 0x6c, + 0x00, 0xf5, 0x4a, 0x70, 0x01, 0x60, 0x00, 0xe0, 0x76, 0x1c, 0x20, 0x6d, + 0x42, 0x69, 0x96, 0x42, 0x0c, 0xd2, 0x00, 0x20, 0x04, 0xf1, 0x3c, 0x02, + 0x52, 0xf8, 0x20, 0x30, 0x03, 0xf5, 0x47, 0x73, 0x00, 0xf0, 0xbe, 0xf8, + 0xf6, 0xd9, 0x00, 0xf0, 0xc3, 0xf8, 0xed, 0xd0, 0x20, 0x6d, 0x41, 0x69, + 0x8e, 0x42, 0x03, 0xd1, 0x00, 0x20, 0x28, 0x60, 0x68, 0x60, 0x23, 0xe0, + 0x5f, 0xf0, 0x00, 0x07, 0x61, 0xa6, 0x04, 0xa9, 0x20, 0x46, 0xff, 0xf7, + 0x73, 0xff, 0x02, 0xa9, 0x20, 0x46, 0xff, 0xf7, 0x80, 0xff, 0x02, 0xa8, + 0x04, 0xaa, 0x50, 0xf8, 0x27, 0x10, 0x52, 0xf8, 0x27, 0x00, 0x2d, 0xf0, + 0xed, 0xfa, 0x22, 0x6d, 0x80, 0x46, 0x92, 0xf8, 0x3c, 0x00, 0x56, 0xf8, + 0x20, 0x00, 0x43, 0xf0, 0x8c, 0xfc, 0x01, 0x46, 0x40, 0x46, 0x43, 0xf0, + 0xa5, 0xfb, 0x45, 0xf8, 0x27, 0x00, 0x7f, 0x1c, 0x01, 0x2f, 0xde, 0xd9, + 0xe1, 0x6b, 0x01, 0xf5, 0x48, 0x71, 0x01, 0x20, 0x08, 0x60, 0x21, 0x6c, + 0x01, 0xf5, 0x48, 0x71, 0x08, 0x60, 0x06, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, + 0x2d, 0xe9, 0xff, 0x47, 0x07, 0x46, 0x89, 0x46, 0x02, 0xa8, 0x00, 0x21, + 0xc0, 0xe9, 0x00, 0x11, 0xcd, 0xe9, 0x00, 0x11, 0xb8, 0x6b, 0x00, 0xf2, + 0x24, 0x70, 0x00, 0x26, 0x01, 0x60, 0x38, 0x46, 0x3a, 0x6d, 0xd1, 0x7b, + 0xff, 0xf7, 0x97, 0xfd, 0x3a, 0x6d, 0xd1, 0x7b, 0x01, 0x20, 0x88, 0x40, + 0x43, 0xf0, 0x5d, 0xfc, 0x80, 0x46, 0x38, 0x46, 0xff, 0xf7, 0x72, 0xfd, + 0x00, 0xe0, 0x76, 0x1c, 0x38, 0x6d, 0x42, 0x69, 0x96, 0x42, 0x0c, 0xd2, + 0x00, 0x20, 0x07, 0xf1, 0x3c, 0x02, 0x52, 0xf8, 0x20, 0x30, 0x03, 0xf5, + 0x42, 0x73, 0x00, 0xf0, 0x55, 0xf8, 0xf6, 0xd9, 0x00, 0xf0, 0x5a, 0xf8, + 0xed, 0xd0, 0x38, 0x6d, 0x41, 0x69, 0x8e, 0x42, 0x0b, 0xd1, 0x00, 0x20, + 0x00, 0x21, 0x00, 0x22, 0x49, 0xf8, 0x20, 0x10, 0x09, 0xeb, 0x80, 0x03, + 0x40, 0x1c, 0x10, 0x28, 0x1a, 0x64, 0xf7, 0xd3, 0x35, 0xe0, 0x00, 0x26, + 0x02, 0xac, 0x4e, 0xf6, 0xb4, 0x02, 0x00, 0x21, 0xf0, 0xb2, 0x02, 0xf2, + 0x0f, 0x12, 0x4f, 0xf4, 0x90, 0x73, 0x40, 0xf2, 0x1f, 0x1c, 0x07, 0xf1, + 0x3c, 0x05, 0x13, 0xfb, 0x00, 0xf3, 0x1c, 0xfb, 0x00, 0xfc, 0x13, 0x44, + 0x94, 0x44, 0x55, 0xf8, 0x21, 0x50, 0xa3, 0xeb, 0x0c, 0x03, 0x05, 0xeb, + 0x83, 0x03, 0x03, 0xf5, 0x2f, 0x75, 0x2b, 0x68, 0x23, 0xf0, 0x7f, 0x43, + 0x44, 0xf8, 0x21, 0x30, 0x49, 0x1c, 0x01, 0x29, 0xe3, 0xd9, 0x00, 0x25, + 0x54, 0xf8, 0x25, 0x00, 0x43, 0xf0, 0x0d, 0xfc, 0x41, 0x46, 0x43, 0xf0, + 0x27, 0xfb, 0x06, 0xeb, 0x05, 0x1a, 0x6d, 0x1c, 0x49, 0xf8, 0x2a, 0x00, + 0x01, 0x2d, 0xf1, 0xd9, 0x76, 0x1c, 0x10, 0x2e, 0xcb, 0xd3, 0xf9, 0x6b, + 0x01, 0xf5, 0x43, 0x71, 0x01, 0x20, 0x08, 0x60, 0x39, 0x6c, 0x01, 0xf5, + 0x43, 0x71, 0x08, 0x60, 0xbd, 0xe8, 0xff, 0x87, 0x1a, 0x68, 0x02, 0xf0, + 0x01, 0x02, 0x4d, 0xf8, 0x20, 0x20, 0x40, 0x1c, 0x01, 0x28, 0x70, 0x47, + 0x01, 0x22, 0x00, 0x23, 0x5d, 0xf8, 0x23, 0x00, 0x00, 0xb9, 0x00, 0x22, + 0x5b, 0x1c, 0x01, 0x2b, 0xf8, 0xd9, 0x00, 0x2a, 0x70, 0x47, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x10, 0xb5, 0x0f, 0xf2, 0x59, 0x41, 0x81, 0x64, + 0x01, 0x68, 0x01, 0xf5, 0x50, 0x61, 0x0a, 0x68, 0x42, 0xf0, 0x01, 0x02, + 0x0a, 0x60, 0xc1, 0x69, 0x03, 0x68, 0x11, 0xf8, 0x3c, 0x2f, 0x03, 0xf6, + 0x0c, 0x53, 0x02, 0xf0, 0x01, 0x02, 0x1a, 0x60, 0x03, 0x68, 0x4a, 0x78, + 0x03, 0xf5, 0x50, 0x63, 0x1c, 0x68, 0x62, 0xf3, 0xd5, 0x44, 0x1c, 0x60, + 0x03, 0x68, 0x8a, 0x78, 0x03, 0xf5, 0x50, 0x63, 0x1c, 0x68, 0xc4, 0xf3, + 0x15, 0x04, 0x44, 0xea, 0x82, 0x54, 0x1c, 0x60, 0x02, 0x68, 0xc9, 0x78, + 0x02, 0xf5, 0x50, 0x62, 0x13, 0x68, 0x61, 0xf3, 0x52, 0x33, 0x13, 0x60, + 0x01, 0x68, 0x01, 0xf5, 0x50, 0x61, 0x0a, 0x68, 0x52, 0x08, 0x52, 0x00, + 0x0a, 0x60, 0x81, 0x6d, 0x41, 0x65, 0x10, 0xbd, 0x0f, 0xf2, 0xe9, 0x31, + 0x81, 0x64, 0x00, 0x22, 0x41, 0x68, 0x01, 0xf2, 0x24, 0x71, 0x01, 0x23, + 0x0a, 0x60, 0x02, 0x22, 0x00, 0x68, 0x00, 0xf6, 0x08, 0x50, 0x03, 0x60, + 0x0a, 0x60, 0x70, 0x47, 0x02, 0x46, 0x00, 0x20, 0x51, 0x6d, 0x11, 0xb1, + 0x49, 0x1e, 0x51, 0x65, 0x70, 0x47, 0x50, 0x6a, 0x01, 0x68, 0x41, 0xf0, + 0x80, 0x01, 0x01, 0x60, 0x01, 0x20, 0x70, 0x47, 0x38, 0xb5, 0x02, 0x46, + 0x00, 0x20, 0x14, 0x68, 0x04, 0xf5, 0x51, 0x64, 0x00, 0x23, 0x21, 0x68, + 0xc1, 0xf3, 0x40, 0x01, 0x00, 0x91, 0x04, 0xe0, 0x21, 0x68, 0xc1, 0xf3, + 0x40, 0x01, 0x00, 0x91, 0x5b, 0x1c, 0xd1, 0x69, 0x4d, 0x6c, 0x00, 0x99, + 0x09, 0xb9, 0x9d, 0x42, 0xf4, 0xd2, 0xab, 0x42, 0x05, 0xd1, 0x50, 0x6a, + 0x01, 0x68, 0x41, 0xf4, 0x80, 0x71, 0x01, 0x60, 0x01, 0x20, 0x32, 0xbd, + 0x30, 0xb5, 0xd3, 0xb0, 0x04, 0x46, 0x4f, 0xf4, 0xa0, 0x71, 0x03, 0xa8, + 0x0c, 0xf0, 0x24, 0xfa, 0x6a, 0x46, 0x00, 0x21, 0x00, 0x23, 0x00, 0x25, + 0x82, 0xe8, 0x2a, 0x00, 0x69, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x39, 0xf8, + 0x69, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x76, 0xf8, 0x03, 0xa9, 0x20, 0x46, + 0x00, 0xf0, 0xb9, 0xf8, 0x03, 0xaa, 0x69, 0x46, 0x20, 0x46, 0x00, 0xf0, + 0x06, 0xf9, 0x00, 0x20, 0x40, 0xf6, 0x9f, 0x61, 0x40, 0xf2, 0x4e, 0x33, + 0x01, 0xf2, 0xad, 0x21, 0x43, 0x43, 0x40, 0xf2, 0x4d, 0x35, 0x0b, 0x44, + 0x45, 0x43, 0x22, 0x68, 0x29, 0x44, 0x5b, 0x1a, 0x02, 0xeb, 0x83, 0x02, + 0x03, 0xab, 0x02, 0xf6, 0x38, 0x52, 0x33, 0xf9, 0x10, 0x10, 0x11, 0x60, + 0x40, 0x1c, 0xa0, 0x28, 0xe6, 0xd3, 0x20, 0x68, 0x00, 0xf6, 0x34, 0x50, + 0x01, 0x68, 0x41, 0xf0, 0x0f, 0x01, 0x01, 0x60, 0x20, 0x68, 0x00, 0xf6, + 0x34, 0x50, 0x01, 0x68, 0x41, 0xf0, 0x10, 0x01, 0x01, 0x60, 0x00, 0xf0, + 0x87, 0xf9, 0x53, 0xb0, 0x30, 0xbd, 0x70, 0xb5, 0x86, 0xb0, 0x05, 0x46, + 0x0c, 0x46, 0x04, 0xa8, 0x00, 0x21, 0xc0, 0xe9, 0x00, 0x11, 0x02, 0xa8, + 0xcd, 0xe9, 0x00, 0x11, 0xc0, 0xe9, 0x00, 0x11, 0xe9, 0x69, 0x01, 0xf1, + 0x3c, 0x00, 0x04, 0xa9, 0x86, 0x78, 0x00, 0x78, 0x76, 0x1c, 0x01, 0x28, + 0x0c, 0xbf, 0x36, 0x03, 0x36, 0x05, 0x28, 0x46, 0x00, 0xf0, 0x31, 0xf9, + 0x02, 0xa9, 0x28, 0x46, 0x00, 0xf0, 0x34, 0xf9, 0x69, 0x46, 0x28, 0x46, + 0x00, 0xf0, 0x43, 0xf9, 0x30, 0x46, 0x43, 0xf0, 0xf2, 0xfa, 0x05, 0x46, + 0xdd, 0xe9, 0x04, 0x01, 0x2d, 0xf0, 0x46, 0xf9, 0x29, 0x46, 0x43, 0xf0, + 0x07, 0xfa, 0x20, 0x60, 0xdd, 0xe9, 0x02, 0x01, 0x2d, 0xf0, 0x3e, 0xf9, + 0x29, 0x46, 0x43, 0xf0, 0xff, 0xf9, 0x60, 0x60, 0xdd, 0xe9, 0x00, 0x01, + 0x2d, 0xf0, 0x36, 0xf9, 0x29, 0x46, 0x43, 0xf0, 0xf7, 0xf9, 0xa0, 0x60, + 0x06, 0xb0, 0x70, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x26, 0x69, + 0x16, 0xf8, 0x04, 0x0f, 0x00, 0xf0, 0x0f, 0x00, 0x43, 0xf0, 0xcd, 0xfa, + 0x4f, 0xf0, 0x78, 0x51, 0x43, 0xf0, 0xf8, 0xf9, 0x72, 0x49, 0x43, 0xf0, + 0xf5, 0xf9, 0x72, 0x49, 0x43, 0xf0, 0xf2, 0xf9, 0x4f, 0xf0, 0x8d, 0x41, + 0x43, 0xf0, 0xee, 0xf9, 0x4f, 0xf0, 0x7c, 0x51, 0x43, 0xf0, 0xea, 0xf9, + 0xe1, 0x69, 0x89, 0x6c, 0x43, 0xf0, 0xe6, 0xf9, 0x29, 0x68, 0x43, 0xf0, + 0xd1, 0xf9, 0x6a, 0x49, 0x43, 0xf0, 0xe0, 0xf9, 0x21, 0x6a, 0x48, 0x60, + 0x4f, 0xf0, 0x80, 0x40, 0x2e, 0x68, 0x00, 0xf0, 0x17, 0xf8, 0x00, 0xf0, + 0x15, 0xf8, 0x01, 0x46, 0x68, 0x68, 0x43, 0xf0, 0xc1, 0xf9, 0x21, 0x6a, + 0x88, 0x60, 0x2e, 0x68, 0x61, 0x48, 0x00, 0xf0, 0x0b, 0xf8, 0x00, 0xf0, + 0x09, 0xf8, 0x00, 0xf0, 0x07, 0xf8, 0x01, 0x46, 0xa8, 0x68, 0x43, 0xf0, + 0xb3, 0xf9, 0x21, 0x6a, 0xc8, 0x60, 0x70, 0xbd, 0x31, 0x46, 0x43, 0xf0, + 0xbf, 0xb9, 0x2d, 0xe9, 0xf0, 0x47, 0x07, 0x46, 0x88, 0x46, 0x47, 0xf6, + 0xff, 0x79, 0x00, 0x26, 0x30, 0xb2, 0x04, 0xe0, 0x50, 0x2e, 0xfb, 0xd3, + 0xa6, 0xf1, 0xa0, 0x00, 0x00, 0xb2, 0x3c, 0x6a, 0xa5, 0x68, 0x43, 0xf0, + 0x85, 0xfa, 0x82, 0x46, 0x00, 0xf0, 0xac, 0xf8, 0x00, 0xf0, 0x38, 0xf8, + 0x01, 0x46, 0x50, 0x46, 0x43, 0xf0, 0xad, 0xf9, 0x82, 0x46, 0x4f, 0xf0, + 0x80, 0x40, 0x00, 0xf0, 0xa1, 0xf8, 0x00, 0xf0, 0x9f, 0xf8, 0x01, 0x46, + 0xe0, 0x68, 0x43, 0xf0, 0xa2, 0xf9, 0x00, 0xf0, 0x27, 0xf8, 0x00, 0xf0, + 0x25, 0xf8, 0x00, 0xf0, 0x23, 0xf8, 0x01, 0x46, 0x50, 0x46, 0x43, 0xf0, + 0x98, 0xf9, 0x61, 0x68, 0x43, 0xf0, 0x8c, 0xf9, 0xfa, 0xf7, 0x6e, 0xfc, + 0x43, 0xf0, 0x52, 0xfa, 0x48, 0x45, 0x05, 0xdb, 0x79, 0x6a, 0x0a, 0x68, + 0x48, 0x46, 0x42, 0xf4, 0x00, 0x72, 0x07, 0xe0, 0x3a, 0x49, 0x88, 0x42, + 0x05, 0xda, 0x79, 0x6a, 0x39, 0x48, 0x0a, 0x68, 0x42, 0xf4, 0x80, 0x62, + 0x0a, 0x60, 0x28, 0xf8, 0x16, 0x00, 0x76, 0x1c, 0xa0, 0x2e, 0xbb, 0xd3, + 0xbd, 0xe8, 0xf0, 0x87, 0x51, 0x46, 0x43, 0xf0, 0x6d, 0xb9, 0x7c, 0xb5, + 0x0e, 0x68, 0x04, 0x46, 0x15, 0x46, 0x26, 0xf0, 0x00, 0x41, 0x30, 0x48, + 0x43, 0xf0, 0x64, 0xf9, 0xfa, 0xf7, 0x46, 0xfc, 0x43, 0xf0, 0x2a, 0xfa, + 0xc1, 0xb2, 0x51, 0x29, 0x43, 0xd3, 0x50, 0x20, 0xc1, 0xb2, 0x35, 0xf9, + 0x11, 0x60, 0xc0, 0xb2, 0xc0, 0xf1, 0xa1, 0x00, 0x00, 0x2e, 0x35, 0xf9, + 0x10, 0x00, 0x48, 0xbf, 0x76, 0x42, 0x00, 0x28, 0x48, 0xbf, 0x40, 0x42, + 0x86, 0x19, 0xe0, 0x69, 0x23, 0x49, 0xc0, 0x6c, 0x43, 0xf0, 0x36, 0xf9, + 0x01, 0x46, 0x22, 0x48, 0x43, 0xf0, 0x1a, 0xf8, 0x05, 0x46, 0x30, 0x46, + 0x43, 0xf0, 0x18, 0xfa, 0x00, 0xf0, 0x40, 0xf8, 0xfa, 0xf7, 0x20, 0xfc, + 0x43, 0xf0, 0x04, 0xfa, 0xad, 0xf8, 0x00, 0x00, 0xbd, 0xf8, 0x00, 0x00, + 0xb0, 0xf5, 0x00, 0x4f, 0x24, 0xbf, 0x47, 0xf6, 0xff, 0x71, 0xad, 0xf8, + 0x00, 0x10, 0x00, 0x20, 0xc1, 0xb2, 0x04, 0xeb, 0x81, 0x01, 0x15, 0x4d, + 0x49, 0x69, 0x01, 0xf5, 0x4d, 0x71, 0x40, 0x1c, 0x0a, 0x68, 0xbd, 0xf8, + 0x00, 0x30, 0x6f, 0xf3, 0x53, 0x12, 0x05, 0xea, 0x43, 0x15, 0x2a, 0x43, + 0x0a, 0x60, 0xc1, 0xb2, 0x02, 0x29, 0xeb, 0xd3, 0x73, 0xbd, 0x00, 0x29, + 0xba, 0xd1, 0x68, 0x5e, 0x46, 0x00, 0xc6, 0xd5, 0x76, 0x42, 0xc4, 0xe7, + 0x92, 0x24, 0x89, 0x3f, 0xab, 0xaa, 0xaa, 0x3e, 0x00, 0x00, 0x80, 0xbf, + 0x00, 0x00, 0xc0, 0x40, 0x01, 0x80, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, + 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0xa0, 0x41, 0x00, 0x00, 0x20, 0x41, + 0xe0, 0xff, 0x0f, 0x00, 0x29, 0x46, 0x43, 0xf0, 0xfb, 0xb8, 0x30, 0xb5, + 0x00, 0x68, 0x00, 0xf6, 0x18, 0x52, 0x00, 0xf6, 0x1c, 0x50, 0x05, 0xe0, + 0x30, 0xb5, 0x00, 0x68, 0x00, 0xf5, 0x52, 0x62, 0x00, 0xf6, 0x24, 0x50, + 0x12, 0x68, 0x04, 0x68, 0x84, 0xf0, 0x20, 0x04, 0xa4, 0xf1, 0x20, 0x05, + 0x00, 0x24, 0x00, 0x23, 0xa2, 0x18, 0x6b, 0x41, 0xc1, 0xe9, 0x00, 0x23, + 0x30, 0xbd, 0x30, 0xb5, 0x00, 0x68, 0x00, 0xf6, 0x28, 0x52, 0x00, 0xf6, + 0x2c, 0x50, 0xeb, 0xe7, 0x01, 0x68, 0x01, 0xf6, 0x14, 0x51, 0x0a, 0x68, + 0x52, 0x08, 0x52, 0x00, 0x0a, 0x60, 0x01, 0x68, 0x01, 0xf6, 0x14, 0x51, + 0x0a, 0x68, 0x42, 0xf0, 0x01, 0x02, 0x0a, 0x60, 0x00, 0x21, 0x03, 0x68, + 0x03, 0xf6, 0x08, 0x53, 0x19, 0x60, 0x40, 0x68, 0x00, 0xf2, 0x24, 0x70, + 0x01, 0x60, 0x70, 0x47, 0x00, 0x21, 0x00, 0x20, 0x02, 0x00, 0xd2, 0xb2, + 0xc8, 0x2a, 0x02, 0xd2, 0x49, 0x1c, 0x40, 0x1c, 0xf8, 0xe7, 0x70, 0x47, + 0x38, 0xb5, 0x00, 0xf0, 0x2d, 0xf9, 0x00, 0xeb, 0x81, 0x03, 0xdc, 0x6d, + 0x94, 0xf8, 0x34, 0x30, 0x00, 0xf0, 0x21, 0xf9, 0xf7, 0xd3, 0x00, 0x21, + 0x00, 0xf0, 0x68, 0xf9, 0x00, 0xf0, 0x69, 0xf8, 0x00, 0xf0, 0xfb, 0xf8, + 0xf8, 0xd3, 0x31, 0xbd, 0x18, 0xb5, 0x00, 0xf0, 0x19, 0xf9, 0x00, 0xf0, + 0x79, 0xf9, 0xc3, 0xf3, 0x40, 0x03, 0x00, 0xf0, 0x0e, 0xf9, 0xf8, 0xd3, + 0xc3, 0x6d, 0x9d, 0xf8, 0x00, 0x10, 0x83, 0xf8, 0x34, 0x10, 0x00, 0xf0, + 0x02, 0xf9, 0x80, 0xf8, 0x34, 0x10, 0x11, 0xbd, 0x38, 0xb5, 0x00, 0x22, + 0xad, 0xf8, 0x00, 0x20, 0x00, 0xf0, 0x3d, 0xf8, 0x94, 0xf8, 0x35, 0x30, + 0x00, 0xf0, 0x90, 0xf8, 0xf8, 0xd3, 0x00, 0x22, 0x00, 0xf1, 0x44, 0x03, + 0x53, 0xf8, 0x22, 0x30, 0x13, 0xf8, 0x24, 0x4f, 0x1d, 0xf8, 0x02, 0x50, + 0x00, 0xf0, 0x3b, 0xf8, 0x52, 0x1c, 0x2c, 0x43, 0x02, 0x2a, 0x1c, 0x70, + 0xf0, 0xd3, 0x00, 0x22, 0x00, 0xf0, 0x25, 0xf8, 0x94, 0xf8, 0x4c, 0x30, + 0x00, 0xf0, 0x78, 0xf8, 0xf8, 0xd3, 0x00, 0x22, 0x00, 0xf0, 0x22, 0xf8, + 0x04, 0xf0, 0xe0, 0x04, 0x05, 0xf0, 0x1f, 0x05, 0x52, 0x1c, 0x2c, 0x43, + 0x02, 0x2a, 0x1c, 0x70, 0xf4, 0xd3, 0x00, 0x22, 0x00, 0xf0, 0x11, 0xf8, + 0x94, 0xf8, 0x4e, 0x30, 0x00, 0xf0, 0x64, 0xf8, 0xf8, 0xd3, 0x00, 0x22, + 0x00, 0xf0, 0x0e, 0xf8, 0x04, 0xf0, 0x7f, 0x04, 0x52, 0x1c, 0x44, 0xea, + 0xc5, 0x14, 0x02, 0x2a, 0x1c, 0x70, 0xf5, 0xd3, 0x31, 0xbd, 0x00, 0xf1, + 0x5c, 0x03, 0x53, 0xf8, 0x22, 0x40, 0x70, 0x47, 0x00, 0xf1, 0x44, 0x03, + 0x53, 0xf8, 0x22, 0x30, 0x13, 0xf8, 0x2c, 0x4f, 0x1d, 0xf8, 0x02, 0x50, + 0x70, 0x47, 0x6d, 0x00, 0x04, 0xf0, 0xfd, 0x04, 0x05, 0xf0, 0x02, 0x05, + 0x70, 0x47, 0x18, 0xb5, 0x00, 0x22, 0xad, 0xf8, 0x00, 0x20, 0x00, 0xf1, + 0x44, 0x03, 0x53, 0xf8, 0x22, 0x40, 0x14, 0xf8, 0x24, 0x3f, 0xc3, 0xf3, + 0x40, 0x03, 0x00, 0xf0, 0x35, 0xf8, 0xf4, 0xd3, 0xc3, 0x6d, 0x9d, 0xf8, + 0x00, 0x20, 0x83, 0xf8, 0x35, 0x20, 0x03, 0x6e, 0x9d, 0xf8, 0x01, 0x20, + 0x83, 0xf8, 0x35, 0x20, 0x00, 0x22, 0x00, 0xf0, 0x20, 0xf8, 0x03, 0xf0, + 0x1f, 0x03, 0x00, 0xf0, 0x23, 0xf8, 0xf8, 0xd3, 0xc3, 0x6d, 0x9d, 0xf8, + 0x00, 0x20, 0x83, 0xf8, 0x4c, 0x20, 0x03, 0x6e, 0x9d, 0xf8, 0x01, 0x20, + 0x83, 0xf8, 0x4c, 0x20, 0x00, 0x22, 0x00, 0xf0, 0x0e, 0xf8, 0xdb, 0x09, + 0x00, 0xf0, 0x12, 0xf8, 0xf9, 0xd3, 0xc3, 0x6d, 0x9d, 0xf8, 0x00, 0x20, + 0x83, 0xf8, 0x4e, 0x20, 0x00, 0xf0, 0x6f, 0xf8, 0x80, 0xf8, 0x4e, 0x10, + 0x11, 0xbd, 0x00, 0xf1, 0x44, 0x03, 0x53, 0xf8, 0x22, 0x40, 0x14, 0xf8, + 0x2c, 0x3f, 0x70, 0x47, 0x0d, 0xf8, 0x02, 0x30, 0x52, 0x1c, 0x02, 0x2a, + 0x70, 0x47, 0x38, 0xb5, 0x00, 0x25, 0x04, 0x46, 0xad, 0xf8, 0x00, 0x50, + 0x00, 0xf0, 0x1f, 0xf8, 0x6d, 0x1c, 0xeb, 0xb2, 0x10, 0x2b, 0xf9, 0xd3, + 0x31, 0xbd, 0x38, 0xb5, 0x00, 0x25, 0xad, 0xf8, 0x00, 0x50, 0x02, 0x21, + 0x04, 0x46, 0x8d, 0xf8, 0x00, 0x10, 0x8d, 0xf8, 0x01, 0x10, 0x00, 0xf0, + 0x0e, 0xf8, 0x6d, 0x1c, 0xeb, 0xb2, 0x08, 0x2b, 0xf9, 0xd3, 0x00, 0xf0, + 0x84, 0xfa, 0x08, 0x25, 0x00, 0xf0, 0x05, 0xf8, 0x6d, 0x1c, 0xe8, 0xb2, + 0x10, 0x28, 0xf9, 0xd3, 0x31, 0xbd, 0x6a, 0x46, 0xe9, 0xb2, 0x20, 0x46, + 0xff, 0xf7, 0xb0, 0xba, 0x38, 0xb5, 0x00, 0xf0, 0x3b, 0xf8, 0x00, 0xeb, + 0x81, 0x03, 0xdc, 0x6d, 0xa3, 0x7b, 0x00, 0xf0, 0x30, 0xf8, 0xf8, 0xd3, + 0x00, 0x21, 0x00, 0xeb, 0x81, 0x03, 0x5b, 0x6c, 0x13, 0xf8, 0x20, 0x4f, + 0x1d, 0xf8, 0x01, 0x50, 0xed, 0x00, 0x04, 0xf0, 0xf7, 0x04, 0x05, 0xf0, + 0x08, 0x05, 0x00, 0xf0, 0x02, 0xf8, 0xf0, 0xd3, 0x31, 0xbd, 0x49, 0x1c, + 0x2c, 0x43, 0x02, 0x29, 0x1c, 0x70, 0x70, 0x47, 0x18, 0xb5, 0x00, 0xf0, + 0x1b, 0xf8, 0x00, 0xeb, 0x81, 0x03, 0x5c, 0x6c, 0x14, 0xf8, 0x20, 0x3f, + 0xc3, 0xf3, 0xc0, 0x03, 0x00, 0xf0, 0x0d, 0xf8, 0xf5, 0xd3, 0xc3, 0x6d, + 0x9d, 0xf8, 0x00, 0x10, 0x99, 0x73, 0x00, 0xf0, 0x02, 0xf8, 0x81, 0x73, + 0x11, 0xbd, 0x00, 0x6e, 0x9d, 0xf8, 0x01, 0x10, 0x70, 0x47, 0x0d, 0xf8, + 0x01, 0x30, 0x49, 0x1c, 0x02, 0x29, 0x70, 0x47, 0x00, 0x22, 0xad, 0xf8, + 0x00, 0x20, 0x00, 0x21, 0x70, 0x47, 0x81, 0xb0, 0x00, 0x22, 0xad, 0xf8, + 0x00, 0x20, 0x00, 0x21, 0x00, 0xeb, 0x81, 0x02, 0xd3, 0x6d, 0xda, 0x7b, + 0x0d, 0xf8, 0x01, 0x20, 0x49, 0x1c, 0x02, 0x29, 0xf6, 0xd3, 0x9d, 0xf8, + 0x00, 0x10, 0xc0, 0x6c, 0x01, 0xf0, 0x3f, 0x01, 0x00, 0xf8, 0x05, 0x1f, + 0x01, 0xb0, 0x70, 0x47, 0x81, 0xb0, 0x00, 0x22, 0xad, 0xf8, 0x00, 0x20, + 0xc2, 0x6c, 0x12, 0xf8, 0x05, 0x1f, 0x01, 0xf0, 0x3f, 0x01, 0x8d, 0xf8, + 0x00, 0x10, 0xc2, 0x6d, 0xd1, 0x73, 0x00, 0x6e, 0x9d, 0xf8, 0x01, 0x10, + 0xc1, 0x73, 0x01, 0xb0, 0x70, 0x47, 0x38, 0xb5, 0xff, 0xf7, 0xce, 0xff, + 0x00, 0xeb, 0x81, 0x03, 0xdc, 0x6d, 0x94, 0xf8, 0x7f, 0x30, 0xff, 0xf7, + 0xc2, 0xff, 0xf7, 0xd3, 0x00, 0x21, 0x00, 0xf0, 0x09, 0xf8, 0x6d, 0x01, + 0x04, 0xf0, 0xdf, 0x04, 0x05, 0xf0, 0x20, 0x05, 0xff, 0xf7, 0x99, 0xff, + 0xf5, 0xd3, 0x31, 0xbd, 0x00, 0xeb, 0x81, 0x03, 0x5b, 0x6c, 0x13, 0xf8, + 0x0c, 0x4f, 0x1d, 0xf8, 0x01, 0x50, 0x70, 0x47, 0x18, 0xb5, 0xff, 0xf7, + 0xaf, 0xff, 0x00, 0xf0, 0x0f, 0xf8, 0xc3, 0xf3, 0x40, 0x13, 0xff, 0xf7, + 0xa4, 0xff, 0xf8, 0xd3, 0xc3, 0x6d, 0x9d, 0xf8, 0x00, 0x10, 0x83, 0xf8, + 0x7f, 0x10, 0xff, 0xf7, 0x98, 0xff, 0x80, 0xf8, 0x7f, 0x10, 0x11, 0xbd, + 0x00, 0xeb, 0x81, 0x03, 0x5c, 0x6c, 0x14, 0xf8, 0x0c, 0x3f, 0x70, 0x47, + 0x70, 0xb5, 0x00, 0xf0, 0xae, 0xfc, 0x00, 0x22, 0xe1, 0x6d, 0x48, 0x71, + 0xe1, 0x6d, 0x81, 0xf8, 0x36, 0x00, 0xe1, 0x6d, 0x81, 0xf8, 0x37, 0x00, + 0x01, 0xf0, 0x2a, 0xf8, 0x04, 0xeb, 0x81, 0x00, 0x49, 0x1c, 0xc3, 0x6d, + 0x1a, 0x66, 0x02, 0x29, 0xc3, 0x6d, 0x9a, 0x66, 0xc3, 0x6d, 0xda, 0x63, + 0xc3, 0x6d, 0x1a, 0x64, 0xc3, 0x6d, 0x5a, 0x64, 0xc3, 0x6d, 0x9a, 0x64, + 0x01, 0xf0, 0x2e, 0xf8, 0xc0, 0x6d, 0x42, 0x73, 0xea, 0xd3, 0x00, 0x20, + 0x00, 0x21, 0x04, 0xeb, 0x80, 0x02, 0xcd, 0xb2, 0x53, 0x6d, 0x49, 0x1c, + 0x2b, 0x44, 0xce, 0xb2, 0x80, 0x22, 0x10, 0x2e, 0x83, 0xf8, 0xd4, 0x23, + 0xf3, 0xd3, 0x40, 0x1c, 0x02, 0x28, 0xef, 0xd3, 0x00, 0x25, 0x00, 0x26, + 0xeb, 0xb2, 0x80, 0x22, 0xf1, 0xb2, 0x01, 0xf0, 0x10, 0xf8, 0x76, 0x1c, + 0xf3, 0xb2, 0x10, 0x2b, 0xf6, 0xd3, 0x6d, 0x1c, 0x02, 0x2d, 0xf2, 0xd3, + 0x20, 0x46, 0xff, 0xf7, 0x37, 0xfe, 0x20, 0x46, 0xff, 0xf7, 0x9f, 0xfe, + 0x20, 0x46, 0xff, 0xf7, 0x2f, 0xff, 0x20, 0x46, 0xff, 0xf7, 0x66, 0xff, + 0x01, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x13, 0xfa, 0x00, 0x20, 0x00, 0xf0, + 0x61, 0xfc, 0x01, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x20, 0xfa, 0x01, 0x21, + 0x20, 0x46, 0xff, 0xf7, 0x2c, 0xfa, 0x20, 0x6d, 0x90, 0xf8, 0x23, 0x10, + 0x20, 0x46, 0xff, 0xf7, 0x37, 0xfa, 0x20, 0x6d, 0x41, 0x7e, 0x20, 0x46, + 0xff, 0xf7, 0x49, 0xfa, 0x20, 0x46, 0xff, 0xf7, 0xd0, 0xfe, 0x03, 0x20, + 0x20, 0x70, 0x00, 0x20, 0x70, 0xbd, 0x10, 0xb5, 0x81, 0x6b, 0x01, 0xf2, + 0x24, 0x71, 0x00, 0x22, 0x0a, 0x60, 0xc4, 0x6b, 0x04, 0xf5, 0x4a, 0x74, + 0x22, 0x60, 0x01, 0x22, 0xc3, 0x6b, 0x03, 0xf5, 0x4a, 0x73, 0x1a, 0x60, + 0x00, 0x22, 0x03, 0x6c, 0x03, 0xf5, 0x4a, 0x73, 0x1a, 0x60, 0x01, 0x22, + 0x03, 0x6c, 0x03, 0xf5, 0x4a, 0x73, 0x1a, 0x60, 0x10, 0x22, 0x0a, 0x60, + 0x04, 0x21, 0x01, 0x70, 0x00, 0x20, 0x10, 0xbd, 0x2d, 0xe9, 0xf0, 0x4f, + 0x85, 0xb0, 0x07, 0x46, 0x03, 0xa8, 0x00, 0x21, 0xc0, 0xe9, 0x00, 0x11, + 0x01, 0xa8, 0x4f, 0xf0, 0x7c, 0x59, 0xc0, 0xe9, 0x00, 0x11, 0x00, 0x91, + 0x38, 0x46, 0x03, 0xa9, 0xff, 0xf7, 0x24, 0xfa, 0x01, 0xa9, 0x38, 0x46, + 0xff, 0xf7, 0x31, 0xfa, 0xd7, 0xf8, 0x5c, 0x00, 0x6b, 0xa4, 0x90, 0xf8, + 0x36, 0x10, 0x05, 0x29, 0x0d, 0xf1, 0x02, 0x05, 0x0d, 0xf1, 0x0c, 0x0a, + 0x43, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, 0x03, 0x1f, 0x43, 0x57, 0x7b, 0x92, + 0x00, 0x26, 0x00, 0xf0, 0xfa, 0xf8, 0x3a, 0x6d, 0x83, 0x46, 0x50, 0x7e, + 0x54, 0xf8, 0x20, 0x00, 0x42, 0xf0, 0x33, 0xff, 0x00, 0xf0, 0xde, 0xf8, + 0x76, 0x1c, 0x02, 0x2e, 0xc9, 0xf8, 0x68, 0x00, 0xef, 0xd3, 0x02, 0x20, + 0x00, 0xf0, 0x19, 0xf9, 0xf9, 0x6d, 0x00, 0x20, 0x00, 0xf0, 0xfd, 0xf8, + 0x00, 0xf0, 0xbd, 0xf8, 0x01, 0x20, 0x4e, 0xe0, 0xb8, 0x46, 0x00, 0x27, + 0x00, 0xf0, 0xbf, 0xf8, 0x00, 0xf0, 0xcc, 0xf8, 0x00, 0xf0, 0xc6, 0xf8, + 0x01, 0x46, 0xb0, 0x6e, 0x42, 0xf0, 0x3b, 0xfe, 0x01, 0x46, 0x48, 0x46, + 0x42, 0xf0, 0x40, 0xfe, 0x7f, 0x1c, 0x02, 0x2f, 0x30, 0x66, 0xed, 0xd3, + 0x00, 0xf0, 0xf1, 0xf8, 0xf8, 0x6d, 0x41, 0x79, 0x0d, 0xf1, 0x02, 0x02, + 0x38, 0x46, 0xff, 0xf7, 0x2e, 0xf9, 0x00, 0xf0, 0xbb, 0xf8, 0x00, 0x20, + 0xf9, 0x6d, 0x81, 0xf8, 0x37, 0x00, 0x83, 0xe0, 0x00, 0xf0, 0x90, 0xf8, + 0x01, 0x28, 0xfa, 0xd1, 0x00, 0x24, 0x00, 0x25, 0x00, 0xf0, 0xc0, 0xf8, + 0x6d, 0x1c, 0xe8, 0xb2, 0x08, 0x28, 0xf9, 0xd3, 0x64, 0x1c, 0x02, 0x2c, + 0xf5, 0xd3, 0x00, 0xf0, 0xcc, 0xf8, 0x6a, 0x46, 0x07, 0x21, 0x1d, 0xe0, + 0x00, 0x26, 0x00, 0xf0, 0xa6, 0xf8, 0x39, 0x6d, 0x00, 0xf0, 0x96, 0xf8, + 0x00, 0xf0, 0x8e, 0xf8, 0x76, 0x1c, 0x02, 0x2e, 0xc9, 0xf8, 0x68, 0x00, + 0xf3, 0xd3, 0x01, 0x20, 0x00, 0xf0, 0xc9, 0xf8, 0xf9, 0x6d, 0x09, 0x20, + 0x00, 0xf0, 0xad, 0xf8, 0x00, 0xf0, 0x6d, 0xf8, 0x02, 0x20, 0x8d, 0xf8, + 0x00, 0x00, 0x8d, 0xf8, 0x01, 0x00, 0x6a, 0x46, 0xf8, 0x6d, 0x41, 0x79, + 0x38, 0x46, 0xff, 0xf7, 0xe1, 0xf8, 0x00, 0xf0, 0x7f, 0xf8, 0x4b, 0xe0, + 0xb8, 0x46, 0x00, 0x27, 0x00, 0xf0, 0x63, 0xf8, 0x00, 0xf0, 0x70, 0xf8, + 0x00, 0xf0, 0x6a, 0xf8, 0x01, 0x46, 0xb0, 0x6e, 0x42, 0xf0, 0xdf, 0xfd, + 0x01, 0x46, 0x48, 0x46, 0x42, 0xf0, 0xe4, 0xfd, 0x7f, 0x1c, 0x02, 0x2f, + 0x30, 0x66, 0xed, 0xd3, 0x00, 0xf0, 0x95, 0xf8, 0xa2, 0xe7, 0x00, 0xf0, + 0x41, 0xf8, 0x01, 0x28, 0x30, 0xd1, 0x00, 0x24, 0x09, 0x25, 0x00, 0xf0, + 0x71, 0xf8, 0x6d, 0x1c, 0xe8, 0xb2, 0x10, 0x28, 0xf9, 0xd3, 0x64, 0x1c, + 0x02, 0x2c, 0xf5, 0xd3, 0xf9, 0x6d, 0x00, 0x20, 0x81, 0xf8, 0x36, 0x00, + 0xf8, 0x6d, 0x01, 0x79, 0x49, 0x1c, 0x01, 0x71, 0xf8, 0x6d, 0x3a, 0x6d, + 0x01, 0x79, 0x13, 0x7e, 0x99, 0x42, 0x14, 0xd1, 0x00, 0x21, 0x01, 0x71, + 0x38, 0x46, 0xff, 0xf7, 0xca, 0xfd, 0x38, 0x46, 0xff, 0xf7, 0x35, 0xfe, + 0x38, 0x46, 0xff, 0xf7, 0xef, 0xfd, 0x38, 0x46, 0xff, 0xf7, 0x22, 0xfd, + 0x38, 0x46, 0xff, 0xf7, 0xf7, 0xfc, 0x38, 0x46, 0xfd, 0xf7, 0x5f, 0xf9, + 0x04, 0xe0, 0x38, 0x46, 0xff, 0xf7, 0xc3, 0xfd, 0x03, 0x20, 0x38, 0x70, + 0x00, 0x20, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x23, 0x46, 0x01, 0xaa, 0x03, 0xa9, 0x38, 0x46, 0x5e, 0xe0, 0xf9, 0x6d, + 0x9d, 0xf8, 0x02, 0x00, 0x48, 0x73, 0x39, 0x6e, 0x68, 0x78, 0x48, 0x73, + 0x70, 0x47, 0x08, 0xf1, 0x5c, 0x00, 0x01, 0xaa, 0x50, 0xf8, 0x27, 0x60, + 0x52, 0xf8, 0x27, 0x10, 0x5a, 0xf8, 0x27, 0x00, 0x2c, 0xf0, 0xac, 0xbc, + 0x01, 0x46, 0x58, 0x46, 0x42, 0xf0, 0x6c, 0xbd, 0xd8, 0xf8, 0x50, 0x10, + 0x83, 0x46, 0x48, 0x7e, 0x54, 0xf8, 0x20, 0x00, 0x42, 0xf0, 0x47, 0xbe, + 0xf8, 0x6d, 0x90, 0xf8, 0x36, 0x10, 0x49, 0x1c, 0x80, 0xf8, 0x36, 0x10, + 0x70, 0x47, 0x07, 0xf1, 0x5c, 0x00, 0x50, 0xf8, 0x26, 0x90, 0x01, 0xa8, + 0x50, 0xf8, 0x26, 0x10, 0x5a, 0xf8, 0x26, 0x00, 0x2c, 0xf0, 0x8e, 0xbc, + 0x07, 0xf1, 0x54, 0x00, 0xea, 0xb2, 0x50, 0xf8, 0x24, 0x10, 0x11, 0x44, + 0xe3, 0xb2, 0x91, 0xf8, 0xd4, 0x23, 0xe9, 0xb2, 0x38, 0x46, 0xff, 0xf7, + 0x4d, 0xb8, 0x48, 0x71, 0x0d, 0xf1, 0x02, 0x02, 0xf8, 0x6d, 0x41, 0x79, + 0x38, 0x46, 0xff, 0xf7, 0x86, 0xb8, 0x01, 0x20, 0x8d, 0xf8, 0x00, 0x00, + 0x8d, 0xf8, 0x01, 0x00, 0x70, 0x47, 0x47, 0x46, 0x00, 0x20, 0x39, 0x6d, + 0x91, 0xf8, 0x21, 0x20, 0x2a, 0x54, 0x40, 0x1c, 0x02, 0x28, 0xf8, 0xd3, + 0x70, 0x47, 0x8d, 0xf8, 0x00, 0x00, 0x8d, 0xf8, 0x01, 0x00, 0x6a, 0x46, + 0x08, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x20, 0xb8, 0x2d, 0xe9, 0xf0, 0x4f, + 0x89, 0xb0, 0x0f, 0x46, 0x00, 0x21, 0x00, 0x91, 0x04, 0x46, 0x90, 0x46, + 0x9b, 0x46, 0xad, 0xf8, 0x04, 0x10, 0x06, 0xe0, 0xe1, 0x6d, 0x03, 0x20, + 0x81, 0xf8, 0x37, 0x00, 0x01, 0x20, 0x8d, 0xf8, 0x04, 0x00, 0xe2, 0x6d, + 0xcd, 0xf8, 0x08, 0xd0, 0x02, 0xf1, 0x37, 0x01, 0x0e, 0x78, 0x04, 0x2e, + 0x00, 0xf2, 0x15, 0x82, 0xdf, 0xe8, 0x16, 0xf0, 0x05, 0x00, 0x20, 0x00, + 0xb9, 0x00, 0xe8, 0x00, 0xe3, 0x01, 0x38, 0x68, 0xd0, 0x63, 0xe1, 0x6d, + 0xd8, 0xf8, 0x00, 0x00, 0x08, 0x64, 0x21, 0x6e, 0x78, 0x68, 0xc8, 0x63, + 0x21, 0x6e, 0xd8, 0xf8, 0x04, 0x00, 0x08, 0x64, 0x00, 0x20, 0x21, 0x6d, + 0x91, 0xf8, 0x22, 0x20, 0x02, 0x99, 0x0a, 0x54, 0x40, 0x1c, 0x01, 0x28, + 0xf7, 0xd9, 0xe3, 0x6d, 0x59, 0x79, 0x00, 0xf0, 0x22, 0xfa, 0x8e, 0xe1, + 0x03, 0x94, 0x08, 0x97, 0x00, 0x25, 0xcd, 0xf8, 0x1c, 0x80, 0xcd, 0xf8, + 0x18, 0xb0, 0x03, 0x98, 0x00, 0xeb, 0x85, 0x09, 0x07, 0x98, 0x50, 0xf8, + 0x25, 0xa0, 0x08, 0x98, 0x50, 0xf8, 0x25, 0x60, 0x03, 0x98, 0x01, 0x6d, + 0xd9, 0xf8, 0x5c, 0xb0, 0x06, 0x98, 0xdb, 0xf8, 0x40, 0x80, 0xdb, 0xf8, + 0x3c, 0x40, 0x01, 0xf1, 0x19, 0x07, 0x39, 0x78, 0x50, 0xf8, 0x21, 0x00, + 0x42, 0xf0, 0xa9, 0xfd, 0x04, 0x90, 0x20, 0x46, 0xdb, 0xf8, 0x60, 0xb0, + 0x41, 0x46, 0x2c, 0xf0, 0xfb, 0xfb, 0x04, 0x99, 0x42, 0xf0, 0xbc, 0xfc, + 0x59, 0x46, 0x42, 0xf0, 0xd4, 0xfc, 0x05, 0x90, 0x51, 0x46, 0x30, 0x46, + 0x2c, 0xf0, 0xf0, 0xfb, 0x04, 0x99, 0x42, 0xf0, 0xb1, 0xfc, 0x59, 0x46, + 0x42, 0xf0, 0xc9, 0xfc, 0x83, 0x46, 0xd0, 0x45, 0x0f, 0xbf, 0xb4, 0x42, + 0x38, 0x7a, 0x7c, 0x7a, 0x84, 0x42, 0x27, 0xd0, 0x42, 0xf0, 0x87, 0xfd, + 0x07, 0x46, 0x05, 0x99, 0x58, 0x46, 0x42, 0xf0, 0xba, 0xfc, 0x06, 0x46, + 0x20, 0x46, 0x42, 0xf0, 0x7e, 0xfd, 0x39, 0x46, 0x42, 0xf0, 0xb3, 0xfc, + 0x01, 0x46, 0x30, 0x46, 0x42, 0xf0, 0x94, 0xfc, 0x04, 0x46, 0x38, 0x46, + 0x21, 0x46, 0x42, 0xf0, 0xa1, 0xfc, 0x05, 0x99, 0x42, 0xf0, 0xa7, 0xfc, + 0x21, 0x46, 0x42, 0xf0, 0x89, 0xfc, 0xf9, 0xf7, 0x7d, 0xff, 0x00, 0x21, + 0x42, 0xf0, 0x3a, 0xf8, 0x07, 0xd2, 0xd9, 0xf8, 0x5c, 0x00, 0x00, 0xf0, + 0x82, 0xfb, 0x09, 0xe0, 0x4f, 0xf0, 0x86, 0x40, 0x06, 0xe0, 0x00, 0xf0, + 0x89, 0xfb, 0x03, 0xd8, 0xd9, 0xf8, 0x5c, 0x00, 0x00, 0xf0, 0x7d, 0xfb, + 0x2c, 0xf0, 0x74, 0xfb, 0xd9, 0xf8, 0x5c, 0x10, 0x81, 0xf8, 0x3a, 0x00, + 0x6d, 0x1c, 0xd9, 0xf8, 0x5c, 0x00, 0x10, 0xf8, 0x3a, 0x1f, 0x41, 0x70, + 0x01, 0x2d, 0x86, 0xd9, 0x03, 0x9c, 0x21, 0x6d, 0x91, 0xf8, 0x20, 0x00, + 0x08, 0x9f, 0xdd, 0xf8, 0x1c, 0x80, 0xdd, 0xf8, 0x18, 0xb0, 0x00, 0x28, + 0x3f, 0xf4, 0x42, 0xaf, 0x00, 0x20, 0x04, 0xf1, 0x5c, 0x01, 0x51, 0xf8, + 0x20, 0x20, 0x92, 0xf8, 0x3a, 0x10, 0x02, 0x9a, 0x11, 0x54, 0x40, 0x1c, + 0x01, 0x28, 0xf4, 0xd9, 0x61, 0xe7, 0x00, 0x21, 0x04, 0xf1, 0x5c, 0x00, + 0x50, 0xf8, 0x21, 0x20, 0x57, 0xf8, 0x21, 0x00, 0x50, 0x64, 0x04, 0xf1, + 0x5c, 0x02, 0x52, 0xf8, 0x21, 0x30, 0x58, 0xf8, 0x21, 0x00, 0x98, 0x64, + 0x52, 0xf8, 0x21, 0x20, 0x92, 0xf8, 0x3a, 0x00, 0x28, 0xb9, 0x00, 0xf0, + 0xc8, 0xfc, 0x00, 0x22, 0x0d, 0xf8, 0x01, 0x20, 0x02, 0xe0, 0x40, 0x1e, + 0x0d, 0xf8, 0x01, 0x00, 0x04, 0xf1, 0x5c, 0x02, 0x52, 0xf8, 0x21, 0x00, + 0x1d, 0xf8, 0x01, 0x20, 0x80, 0xf8, 0x4d, 0x20, 0x49, 0x1c, 0x01, 0x29, + 0xd8, 0xd9, 0x00, 0xf0, 0x5c, 0xf9, 0xe1, 0x6d, 0x00, 0x20, 0x00, 0xf0, + 0xb8, 0xf9, 0xc6, 0xe0, 0x22, 0x6d, 0x92, 0xf8, 0x20, 0x00, 0x00, 0x28, + 0x41, 0xd0, 0x00, 0x26, 0x20, 0x6d, 0x41, 0x7e, 0x5b, 0xf8, 0x21, 0x00, + 0x42, 0xf0, 0xf5, 0xfc, 0x82, 0x46, 0x04, 0xf1, 0x5c, 0x00, 0x50, 0xf8, + 0x26, 0x50, 0xa9, 0x6c, 0x68, 0x6c, 0x2c, 0xf0, 0x45, 0xfb, 0x51, 0x46, + 0x42, 0xf0, 0x06, 0xfc, 0x81, 0x46, 0x00, 0xf0, 0x2f, 0xf9, 0x51, 0x46, + 0x42, 0xf0, 0x00, 0xfc, 0x29, 0x6e, 0x42, 0xf0, 0x18, 0xfc, 0x04, 0xf1, + 0x5c, 0x01, 0x20, 0xf0, 0x00, 0x45, 0x51, 0xf8, 0x26, 0x20, 0x11, 0x6e, + 0x48, 0x46, 0x42, 0xf0, 0x0e, 0xfc, 0x20, 0xf0, 0x00, 0x41, 0x28, 0x46, + 0x41, 0xf0, 0xa4, 0xff, 0x11, 0xd2, 0x00, 0xf0, 0x14, 0xfe, 0x01, 0xf1, + 0x3b, 0x00, 0x82, 0x7c, 0x02, 0x70, 0x00, 0xf0, 0x0e, 0xfe, 0x58, 0xf8, + 0x26, 0x00, 0x88, 0x64, 0x04, 0xf1, 0x5c, 0x01, 0x51, 0xf8, 0x26, 0x20, + 0x57, 0xf8, 0x26, 0x00, 0x50, 0x64, 0x76, 0x1c, 0x01, 0x2e, 0xbf, 0xd9, + 0x07, 0xe0, 0x8d, 0xf8, 0x04, 0x00, 0x00, 0x22, 0x8a, 0x70, 0x01, 0x20, + 0xe1, 0x6d, 0x81, 0xf8, 0x38, 0x00, 0x00, 0xf0, 0x8d, 0xfc, 0x92, 0xf8, + 0x20, 0x30, 0x99, 0x42, 0x08, 0xd3, 0x00, 0x21, 0x80, 0xf8, 0x39, 0x10, + 0x00, 0xf0, 0x79, 0xfc, 0x04, 0xbf, 0x00, 0x22, 0x80, 0xf8, 0x38, 0x20, + 0xe0, 0x6d, 0x00, 0xf1, 0x38, 0x01, 0x08, 0x78, 0x49, 0x78, 0x00, 0x29, + 0x08, 0xbf, 0x00, 0x28, 0x62, 0xd1, 0x04, 0xeb, 0x80, 0x01, 0x4a, 0x6d, + 0xe1, 0x6d, 0x4b, 0x79, 0x04, 0xf1, 0x5c, 0x01, 0x1a, 0x44, 0x51, 0xf8, + 0x20, 0x30, 0x93, 0xf8, 0x3b, 0x10, 0x82, 0xf8, 0xd4, 0x13, 0x40, 0x1c, + 0x01, 0x28, 0xee, 0xd9, 0x00, 0x20, 0x04, 0xf1, 0x5c, 0x01, 0x51, 0xf8, + 0x20, 0x20, 0x51, 0x7b, 0x0d, 0xf8, 0x00, 0x10, 0x40, 0x1c, 0x01, 0x28, + 0xf5, 0xd9, 0x00, 0xf0, 0xd2, 0xf8, 0xe0, 0x6d, 0x90, 0xf8, 0x36, 0x10, + 0x02, 0x29, 0x07, 0xd1, 0x02, 0x22, 0x4f, 0xf0, 0x08, 0x0a, 0x8d, 0xf8, + 0x02, 0x10, 0x8d, 0xf8, 0x03, 0x20, 0x06, 0xe0, 0x01, 0x21, 0x4f, 0xf0, + 0x10, 0x0a, 0x8d, 0xf8, 0x02, 0x10, 0x8d, 0xf8, 0x03, 0x10, 0x00, 0xf0, + 0xb5, 0xf8, 0xe0, 0x6d, 0x41, 0x79, 0x49, 0x1c, 0x41, 0x71, 0xe0, 0x6d, + 0x41, 0x79, 0x51, 0x45, 0x09, 0xd1, 0x00, 0x21, 0x41, 0x71, 0x00, 0x20, + 0xe1, 0x6d, 0x81, 0xf8, 0x37, 0x00, 0x01, 0x20, 0x8d, 0xf8, 0x05, 0x00, + 0x7d, 0xe0, 0x6a, 0x46, 0x20, 0x46, 0xfe, 0xf7, 0xb6, 0xfe, 0xe1, 0x6d, + 0x9d, 0xf8, 0x00, 0x00, 0x48, 0x73, 0x21, 0x6e, 0x9d, 0xf8, 0x01, 0x00, + 0x48, 0x73, 0x0d, 0xf1, 0x02, 0x00, 0xe1, 0x6d, 0x91, 0xf8, 0x36, 0x20, + 0x02, 0x2a, 0x0c, 0xbf, 0x01, 0x21, 0x02, 0x21, 0x8d, 0xf8, 0x02, 0x10, + 0x41, 0x70, 0x00, 0xf0, 0x89, 0xf8, 0x00, 0xf0, 0xb3, 0xfe, 0x60, 0xe0, + 0xb8, 0xb9, 0x00, 0x21, 0x00, 0xf0, 0x67, 0xf8, 0x70, 0x1c, 0x83, 0x42, + 0x07, 0xd2, 0x13, 0x68, 0x43, 0xf0, 0x04, 0x03, 0x13, 0x60, 0x00, 0x22, + 0x0d, 0xf8, 0x01, 0x20, 0x03, 0xe0, 0x9b, 0x1b, 0x5b, 0x1e, 0x0d, 0xf8, + 0x01, 0x30, 0x00, 0xf0, 0x60, 0xf8, 0xeb, 0xd9, 0x00, 0xf0, 0x75, 0xf8, + 0x47, 0xe0, 0x00, 0x21, 0x00, 0xf0, 0x4f, 0xf8, 0xb2, 0x46, 0xca, 0xf1, + 0xfe, 0x0a, 0x9a, 0x45, 0x07, 0xd2, 0x13, 0x68, 0x43, 0xf0, 0x08, 0x03, + 0x13, 0x60, 0xff, 0x22, 0x0d, 0xf8, 0x01, 0x20, 0x03, 0xe0, 0xf3, 0x18, + 0x5b, 0x1c, 0x0d, 0xf8, 0x01, 0x30, 0x00, 0xf0, 0x46, 0xf8, 0xe9, 0xd9, + 0xe4, 0xe7, 0x00, 0x26, 0x04, 0xf1, 0x5c, 0x00, 0x50, 0xf8, 0x26, 0xa0, + 0x00, 0xf0, 0x48, 0xf8, 0x21, 0x6d, 0x05, 0x46, 0x48, 0x7e, 0x5b, 0xf8, + 0x20, 0x00, 0x42, 0xf0, 0xf8, 0xfb, 0x01, 0x46, 0x28, 0x46, 0x42, 0xf0, + 0x11, 0xfb, 0x01, 0x46, 0xda, 0xf8, 0x68, 0x00, 0x42, 0xf0, 0x15, 0xfb, + 0x01, 0x46, 0x4f, 0xf0, 0x7c, 0x50, 0x42, 0xf0, 0x19, 0xfb, 0x76, 0x1c, + 0x01, 0x2e, 0xca, 0xf8, 0x60, 0x00, 0xdf, 0xd9, 0x00, 0x20, 0x21, 0x6d, + 0x91, 0xf8, 0x21, 0x20, 0x02, 0x99, 0x0a, 0x54, 0x40, 0x1c, 0x01, 0x28, + 0xf7, 0xd9, 0x00, 0xf0, 0x30, 0xf8, 0xe1, 0x6d, 0x00, 0x20, 0x81, 0xf8, + 0x37, 0x00, 0x9d, 0xf8, 0x04, 0x00, 0x00, 0x28, 0x7f, 0xf4, 0xdd, 0xad, + 0x9d, 0xf8, 0x05, 0x00, 0x09, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x04, 0xf1, + 0x5c, 0x02, 0xe6, 0x6d, 0x52, 0xf8, 0x21, 0x20, 0x96, 0xf8, 0x39, 0x60, + 0x92, 0xf8, 0x3a, 0x30, 0x70, 0x47, 0x04, 0xf1, 0x5c, 0x02, 0x52, 0xf8, + 0x21, 0x30, 0x1d, 0xf8, 0x01, 0x20, 0x83, 0xf8, 0x4d, 0x20, 0x49, 0x1c, + 0x01, 0x29, 0x70, 0x47, 0x58, 0xf8, 0x26, 0x10, 0x57, 0xf8, 0x26, 0x00, + 0x2c, 0xf0, 0x0a, 0xba, 0x0d, 0xf1, 0x02, 0x02, 0xe0, 0x6d, 0x41, 0x79, + 0x20, 0x46, 0xfe, 0xf7, 0xc3, 0xbd, 0xe0, 0x6d, 0x41, 0x79, 0x6a, 0x46, + 0x20, 0x46, 0xfe, 0xf7, 0xce, 0xbd, 0x10, 0xb5, 0x00, 0xf0, 0x61, 0xf8, + 0x10, 0x20, 0x00, 0xf0, 0x05, 0xfc, 0x00, 0xf0, 0x52, 0xf8, 0x04, 0xeb, + 0x80, 0x01, 0x40, 0x1c, 0xcb, 0x6d, 0x83, 0xf8, 0x3a, 0x20, 0x02, 0x28, + 0xcb, 0x6d, 0x83, 0xf8, 0x3b, 0x20, 0xcb, 0x6d, 0x83, 0xf8, 0x4d, 0x20, + 0xcb, 0x6d, 0x5a, 0x73, 0xcb, 0x6d, 0x1a, 0x65, 0xc9, 0x6d, 0x4a, 0x65, + 0xeb, 0xd3, 0x20, 0x46, 0xff, 0xf7, 0x10, 0xfa, 0x20, 0x46, 0xff, 0xf7, + 0x78, 0xfa, 0x20, 0x46, 0xff, 0xf7, 0x08, 0xfb, 0x20, 0x46, 0xff, 0xf7, + 0x3f, 0xfb, 0x01, 0x21, 0x20, 0x46, 0xfe, 0xf7, 0xec, 0xfd, 0x00, 0x20, + 0x00, 0xf0, 0x3a, 0xf8, 0x00, 0x21, 0x20, 0x46, 0xfe, 0xf7, 0xf9, 0xfd, + 0x00, 0x21, 0x20, 0x46, 0xfe, 0xf7, 0x05, 0xfe, 0x20, 0x6d, 0x90, 0xf8, + 0x28, 0x10, 0x20, 0x46, 0xfe, 0xf7, 0x10, 0xfe, 0x20, 0x6d, 0x90, 0xf8, + 0x29, 0x10, 0x20, 0x46, 0xfe, 0xf7, 0x21, 0xfe, 0x20, 0x6d, 0x90, 0xf8, + 0x25, 0x20, 0x00, 0x23, 0x10, 0x21, 0x00, 0xf0, 0xb4, 0xfb, 0x20, 0x6d, + 0x90, 0xf8, 0x25, 0x20, 0x01, 0x23, 0x10, 0x21, 0x00, 0xf0, 0xad, 0xfb, + 0x00, 0xf0, 0x0d, 0xf8, 0x20, 0x46, 0xff, 0xf7, 0x98, 0xfa, 0x03, 0x20, + 0x20, 0x70, 0x00, 0x20, 0x10, 0xbd, 0x81, 0xf8, 0x38, 0x00, 0xe1, 0x6d, + 0x81, 0xf8, 0x39, 0x00, 0x70, 0x47, 0x01, 0x22, 0x12, 0x21, 0x20, 0x46, + 0x27, 0xe3, 0x04, 0x46, 0x00, 0x20, 0xe1, 0x6d, 0x08, 0x71, 0x70, 0x47, + 0x04, 0xf1, 0x44, 0x01, 0xc2, 0xb2, 0x51, 0xf8, 0x22, 0x10, 0x11, 0xf8, + 0x2c, 0x2f, 0x02, 0xf0, 0xe0, 0x02, 0x0a, 0x70, 0x40, 0x1c, 0xc1, 0xb2, + 0x02, 0x29, 0xf1, 0xd3, 0x00, 0x20, 0x04, 0xf1, 0x44, 0x01, 0xc2, 0xb2, + 0x51, 0xf8, 0x22, 0x10, 0x11, 0xf8, 0x2c, 0x2f, 0x42, 0xf0, 0x80, 0x02, + 0x0a, 0x70, 0x40, 0x1c, 0xc1, 0xb2, 0x02, 0x29, 0xf1, 0xd3, 0x70, 0x47, + 0x2d, 0xe9, 0xf0, 0x47, 0x88, 0xb0, 0x05, 0x46, 0x06, 0xa8, 0x00, 0x21, + 0x00, 0x22, 0xc0, 0xe9, 0x00, 0x12, 0x04, 0xa8, 0x01, 0xac, 0xc0, 0xe9, + 0x00, 0x12, 0x22, 0x80, 0x02, 0xa9, 0x28, 0x46, 0xc1, 0xe9, 0x00, 0x22, + 0x06, 0xa9, 0xfe, 0xf7, 0xdb, 0xfd, 0x04, 0xa9, 0x28, 0x46, 0xfe, 0xf7, + 0xe8, 0xfd, 0xe9, 0x6d, 0x0f, 0xf6, 0xe4, 0x43, 0x91, 0xf8, 0x36, 0x20, + 0x02, 0xa8, 0x22, 0xb1, 0x02, 0x2a, 0x00, 0xf0, 0xb5, 0x80, 0x1f, 0xd3, + 0x0b, 0xe1, 0x00, 0x21, 0x05, 0xf1, 0x5c, 0x02, 0x52, 0xf8, 0x21, 0x40, + 0x04, 0xf1, 0x50, 0x06, 0x40, 0xf8, 0x21, 0x60, 0x49, 0x1c, 0x02, 0x29, + 0xf6, 0xd3, 0x00, 0xf0, 0x04, 0xf9, 0x01, 0x28, 0xee, 0xd1, 0x28, 0x6d, + 0x90, 0xf8, 0x26, 0x20, 0x00, 0xf0, 0x18, 0xf9, 0x28, 0x6d, 0x90, 0xf8, + 0x26, 0x20, 0x01, 0x23, 0x00, 0xf0, 0x13, 0xf9, 0x00, 0xf0, 0x0c, 0xf9, + 0x00, 0x20, 0x8c, 0xe0, 0x00, 0x21, 0x05, 0xf1, 0x5c, 0x02, 0x52, 0xf8, + 0x21, 0x40, 0x04, 0xf1, 0x54, 0x06, 0x40, 0xf8, 0x21, 0x60, 0x49, 0x1c, + 0x02, 0x29, 0xf6, 0xd3, 0x00, 0xf0, 0xe5, 0xf8, 0x01, 0x28, 0xcf, 0xd1, + 0x00, 0x26, 0x05, 0xeb, 0x86, 0x04, 0xe1, 0x6d, 0x48, 0x6d, 0x09, 0x6d, + 0x42, 0xf0, 0xf9, 0xf9, 0x20, 0xf0, 0x00, 0x40, 0xdf, 0xf8, 0x60, 0x1a, + 0x41, 0xf0, 0xa0, 0xfd, 0x2f, 0xd8, 0x28, 0x6d, 0x25, 0x30, 0x90, 0xf8, + 0x01, 0xa0, 0x00, 0x78, 0x82, 0x45, 0x28, 0xd0, 0xe7, 0x6d, 0xd7, 0xf8, + 0x50, 0x80, 0x42, 0xf0, 0xae, 0xfa, 0x81, 0x46, 0x78, 0x6d, 0x41, 0x46, + 0x42, 0xf0, 0xe1, 0xf9, 0x07, 0x46, 0x50, 0x46, 0x42, 0xf0, 0xa5, 0xfa, + 0x49, 0x46, 0x42, 0xf0, 0xda, 0xf9, 0x01, 0x46, 0x38, 0x46, 0x42, 0xf0, + 0xbb, 0xf9, 0x07, 0x46, 0x48, 0x46, 0x00, 0xf0, 0x20, 0xfd, 0x41, 0x46, + 0x42, 0xf0, 0xcf, 0xf9, 0x39, 0x46, 0x42, 0xf0, 0xb1, 0xf9, 0xf9, 0xf7, + 0xa5, 0xfc, 0x00, 0x21, 0x41, 0xf0, 0x62, 0xfd, 0x06, 0xd2, 0xe0, 0x6d, + 0x00, 0xf0, 0xab, 0xf8, 0x08, 0xe0, 0x4f, 0xf0, 0x85, 0x40, 0x05, 0xe0, + 0x00, 0xf0, 0xb2, 0xf8, 0x02, 0xd8, 0xe0, 0x6d, 0x00, 0xf0, 0xa7, 0xf8, + 0x2c, 0xf0, 0x9e, 0xf8, 0xe1, 0x6d, 0x81, 0xf8, 0x3a, 0x00, 0x76, 0x1c, + 0xe0, 0x6d, 0x10, 0xf8, 0x3a, 0x1f, 0x41, 0x70, 0x02, 0x2e, 0xac, 0xd3, + 0x29, 0x6d, 0x91, 0xf8, 0x27, 0x00, 0x90, 0xb3, 0x00, 0x20, 0x01, 0xab, + 0x05, 0xf1, 0x5c, 0x01, 0x51, 0xf8, 0x20, 0x20, 0x92, 0xf8, 0x3a, 0x10, + 0x19, 0x54, 0x40, 0x1c, 0x02, 0x28, 0xf5, 0xd3, 0x01, 0xaa, 0x10, 0x21, + 0x28, 0x46, 0xfe, 0xf7, 0x8a, 0xfc, 0x00, 0xf0, 0x8f, 0xf8, 0xe9, 0x6d, + 0x00, 0x20, 0x81, 0xf8, 0x39, 0x00, 0xe9, 0x6d, 0x81, 0xf8, 0x38, 0x00, + 0xe9, 0x6d, 0x08, 0x65, 0xe9, 0x6d, 0x48, 0x65, 0x29, 0x6e, 0x08, 0x65, + 0x29, 0x6e, 0x48, 0x65, 0xe9, 0x6d, 0x81, 0xf8, 0x2a, 0x00, 0xe9, 0x6d, + 0x81, 0xf8, 0x37, 0x00, 0xe8, 0x6d, 0xff, 0xf7, 0x00, 0xfc, 0x58, 0xe0, + 0x04, 0xaa, 0x06, 0xa9, 0x28, 0x46, 0x00, 0xf0, 0x27, 0xf9, 0x01, 0x28, + 0x51, 0xd1, 0xe9, 0x6d, 0x00, 0x20, 0x81, 0xf8, 0x36, 0x00, 0x05, 0xf1, + 0x54, 0x01, 0x51, 0xf8, 0x20, 0x20, 0x05, 0xf1, 0x5c, 0x01, 0x51, 0xf8, + 0x20, 0x30, 0x93, 0xf8, 0x3b, 0x10, 0x82, 0xf8, 0xe4, 0x13, 0x40, 0x1c, + 0x02, 0x28, 0xf0, 0xd3, 0xe8, 0x6d, 0x01, 0x79, 0x49, 0x1c, 0x01, 0x71, + 0xe9, 0x6d, 0x28, 0x6d, 0x0a, 0x79, 0x21, 0x30, 0xc1, 0x78, 0x8a, 0x42, + 0x25, 0xd1, 0x68, 0x6d, 0x90, 0xf8, 0xe4, 0x23, 0x00, 0xf0, 0x50, 0xf8, + 0xa8, 0x6d, 0x90, 0xf8, 0xe4, 0x23, 0x01, 0x23, 0x00, 0xf0, 0x4b, 0xf8, + 0xe9, 0x6d, 0x00, 0x20, 0x08, 0x71, 0x28, 0x46, 0xff, 0xf7, 0x4d, 0xf9, + 0x00, 0x22, 0x12, 0x21, 0x28, 0x46, 0x00, 0xf0, 0xf2, 0xf9, 0x28, 0x46, + 0xff, 0xf7, 0xb3, 0xf9, 0x28, 0x46, 0xff, 0xf7, 0x6d, 0xf9, 0x28, 0x46, + 0xff, 0xf7, 0xa0, 0xf8, 0x28, 0x46, 0xff, 0xf7, 0x75, 0xf8, 0x28, 0x46, + 0xfc, 0xf7, 0xdd, 0xfc, 0x0f, 0xe0, 0x02, 0x78, 0x00, 0xf0, 0x2c, 0xf8, + 0x28, 0x6d, 0x90, 0xf8, 0x21, 0x20, 0x01, 0x23, 0x00, 0xf0, 0x27, 0xf8, + 0x00, 0xf0, 0x20, 0xf8, 0x28, 0x46, 0xff, 0xf7, 0x36, 0xf9, 0x03, 0x20, + 0x28, 0x70, 0x00, 0x20, 0x08, 0xb0, 0xbd, 0xe8, 0xf0, 0x87, 0x00, 0x93, + 0x06, 0xaa, 0x04, 0xab, 0x02, 0xa9, 0x28, 0x46, 0x1a, 0xe0, 0x01, 0x68, + 0x41, 0xf0, 0x04, 0x01, 0x01, 0x60, 0x00, 0x20, 0x70, 0x47, 0x01, 0x68, + 0x41, 0xf0, 0x08, 0x01, 0x01, 0x60, 0xdf, 0xf8, 0x94, 0x08, 0x70, 0x47, + 0xdf, 0xf8, 0x90, 0x18, 0x41, 0xf0, 0xb4, 0xbc, 0x01, 0x22, 0x12, 0x21, + 0x28, 0x46, 0xb2, 0xe1, 0x00, 0x23, 0x10, 0x21, 0x28, 0x46, 0xfe, 0xf7, + 0xeb, 0xbb, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0x8c, 0xb0, 0x81, 0x46, + 0x8a, 0x46, 0x08, 0xa8, 0x00, 0x21, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, + 0x80, 0xe8, 0x72, 0x00, 0x04, 0xa8, 0x80, 0xe8, 0x72, 0x00, 0xcd, 0xe9, + 0x00, 0x45, 0x8d, 0xf8, 0x08, 0x10, 0x88, 0x46, 0x0d, 0xf1, 0x10, 0x0b, + 0x16, 0x46, 0x1f, 0x46, 0x08, 0xaa, 0x57, 0xf8, 0x28, 0x10, 0x56, 0xf8, + 0x28, 0x00, 0x02, 0xeb, 0xc8, 0x02, 0xc2, 0xe9, 0x00, 0x01, 0x0b, 0xeb, + 0xc8, 0x02, 0xc2, 0xe9, 0x00, 0x01, 0x0b, 0xeb, 0xc8, 0x00, 0xd0, 0xe9, + 0x00, 0x01, 0x2b, 0xf0, 0xf3, 0xff, 0x4d, 0xf8, 0x28, 0x00, 0x08, 0xf1, + 0x01, 0x08, 0xb8, 0xf1, 0x02, 0x0f, 0xe5, 0xd3, 0xd9, 0xf8, 0x5c, 0x00, + 0xdf, 0xf8, 0x10, 0x78, 0x90, 0xf8, 0x37, 0x10, 0x03, 0x29, 0x56, 0x46, + 0x63, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, 0x02, 0x0d, 0x1b, 0x3a, 0xa0, 0x46, + 0x00, 0xf0, 0x05, 0xfc, 0x01, 0x46, 0x28, 0x68, 0x42, 0xf0, 0xb7, 0xf8, + 0x00, 0xf0, 0x5b, 0xf8, 0xf6, 0xd3, 0x20, 0xe0, 0xa0, 0x46, 0x00, 0xf0, + 0xfa, 0xfb, 0x29, 0x68, 0x42, 0xf0, 0x9b, 0xf8, 0x00, 0xf0, 0x51, 0xf8, + 0xf7, 0xd3, 0x02, 0x22, 0x00, 0xf0, 0x53, 0xf8, 0x01, 0x22, 0x13, 0xe0, + 0x00, 0x27, 0x56, 0xf8, 0x27, 0x50, 0x5d, 0xf8, 0x27, 0x10, 0x28, 0x68, + 0x42, 0xf0, 0x9d, 0xf8, 0x7f, 0x1c, 0x02, 0x2f, 0x28, 0x60, 0xf4, 0xd3, + 0x01, 0x22, 0x00, 0xf0, 0x42, 0xf8, 0x01, 0x22, 0x07, 0x21, 0x00, 0xf0, + 0x3f, 0xf8, 0x02, 0x22, 0x12, 0x21, 0x00, 0xf0, 0x3b, 0xf8, 0xd9, 0xf8, + 0x5c, 0x00, 0x90, 0xf8, 0x37, 0x10, 0x49, 0x1c, 0x80, 0xf8, 0x37, 0x10, + 0x27, 0xe0, 0x00, 0x20, 0xdd, 0xf8, 0x58, 0xa0, 0x4c, 0x46, 0x81, 0x46, + 0x56, 0xf8, 0x29, 0x70, 0x5d, 0xf8, 0x29, 0x10, 0x38, 0x68, 0x42, 0xf0, + 0x68, 0xf8, 0x80, 0x46, 0xc7, 0xf8, 0x00, 0x80, 0x09, 0xf1, 0x01, 0x09, + 0x20, 0x6d, 0x90, 0xf8, 0x29, 0x10, 0x5a, 0xf8, 0x21, 0x00, 0x42, 0xf0, + 0x36, 0xf9, 0x01, 0x46, 0x40, 0x46, 0x42, 0xf0, 0x4f, 0xf8, 0xb9, 0xf1, + 0x02, 0x0f, 0x38, 0x60, 0xe4, 0xd3, 0x02, 0x22, 0x07, 0x21, 0xff, 0xf7, + 0xe8, 0xfd, 0xe1, 0x6d, 0x81, 0xf8, 0x37, 0x50, 0x01, 0x24, 0x20, 0x46, + 0x0d, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x08, 0xf1, 0x01, 0x08, 0xb8, 0xf1, + 0x02, 0x0f, 0x28, 0x60, 0x70, 0x47, 0x08, 0x21, 0x48, 0x46, 0x00, 0xe1, + 0x2d, 0xe9, 0xff, 0x41, 0x04, 0x46, 0x02, 0xa8, 0x00, 0x25, 0xc0, 0xe9, + 0x00, 0x55, 0x01, 0xa8, 0x01, 0xae, 0x05, 0x80, 0x02, 0xaf, 0xd4, 0xf8, + 0x5c, 0xc0, 0x9c, 0xf8, 0x2a, 0x00, 0x00, 0x28, 0x32, 0xd1, 0x04, 0xf1, + 0x5c, 0x0c, 0x5c, 0xf8, 0x20, 0xe0, 0x0e, 0xf1, 0x50, 0x08, 0x47, 0xf8, + 0x20, 0x80, 0x40, 0x1c, 0x01, 0x28, 0xf6, 0xd9, 0x00, 0xf0, 0xc7, 0xf8, + 0x01, 0x28, 0x22, 0xd1, 0x00, 0x21, 0x04, 0xf1, 0x5c, 0x00, 0x50, 0xf8, + 0x21, 0x20, 0x92, 0xf8, 0x3a, 0x00, 0x18, 0xb9, 0x00, 0xf0, 0x9d, 0xf8, + 0x75, 0x54, 0x01, 0xe0, 0x40, 0x1e, 0x70, 0x54, 0x04, 0xf1, 0x5c, 0x02, + 0x52, 0xf8, 0x21, 0x00, 0x72, 0x5c, 0x80, 0xf8, 0x4d, 0x20, 0x49, 0x1c, + 0x01, 0x29, 0xe8, 0xd9, 0x00, 0xf0, 0xa6, 0xf8, 0xff, 0xf7, 0x99, 0xfd, + 0xe1, 0x6d, 0x81, 0xf8, 0x37, 0x50, 0x01, 0x20, 0xe1, 0x6d, 0x81, 0xf8, + 0x2a, 0x00, 0x6d, 0xe0, 0x00, 0x20, 0x04, 0xf1, 0x5c, 0x0c, 0x5c, 0xf8, + 0x20, 0xe0, 0x0e, 0xf1, 0x54, 0x08, 0x47, 0xf8, 0x20, 0x80, 0x40, 0x1c, + 0x01, 0x28, 0xf6, 0xd9, 0x00, 0xf0, 0x93, 0xf8, 0x01, 0x28, 0x5d, 0xd1, + 0x00, 0x22, 0x04, 0xf1, 0x5c, 0x00, 0x50, 0xf8, 0x22, 0x10, 0x48, 0x6d, + 0x04, 0xf1, 0x5c, 0x01, 0x20, 0xf0, 0x00, 0x40, 0x51, 0xf8, 0x22, 0x30, + 0x19, 0x6d, 0x21, 0xf0, 0x00, 0x41, 0x41, 0xf0, 0x87, 0xfb, 0x09, 0xd2, + 0x59, 0x6d, 0x19, 0x65, 0x04, 0xf1, 0x5c, 0x00, 0x50, 0xf8, 0x22, 0x10, + 0x01, 0xf1, 0x3b, 0x00, 0x83, 0x7c, 0x03, 0x70, 0x52, 0x1c, 0x01, 0x2a, + 0xe1, 0xd9, 0x00, 0xf0, 0x81, 0xf8, 0x92, 0xf8, 0x27, 0x30, 0x99, 0x42, + 0x06, 0xd1, 0x80, 0xf8, 0x39, 0x50, 0x00, 0xf0, 0x6e, 0xf8, 0x08, 0xbf, + 0x80, 0xf8, 0x38, 0x50, 0xe0, 0x6d, 0x00, 0xf1, 0x38, 0x02, 0x51, 0x78, + 0x10, 0x78, 0x00, 0x29, 0x08, 0xbf, 0x00, 0x28, 0x0b, 0xd1, 0x90, 0x61, + 0x01, 0x25, 0xe0, 0x6d, 0x41, 0x65, 0x20, 0x6e, 0x01, 0x65, 0x20, 0x6e, + 0x41, 0x65, 0xe0, 0x6d, 0x80, 0xf8, 0x2a, 0x10, 0x1c, 0xe0, 0xe8, 0xb9, + 0x00, 0xf0, 0x3e, 0xf8, 0x5f, 0x1c, 0xba, 0x42, 0x05, 0xd2, 0x0a, 0x68, + 0x42, 0xf0, 0x04, 0x02, 0x0a, 0x60, 0x35, 0x54, 0x02, 0xe0, 0xd2, 0x1a, + 0x52, 0x1e, 0x32, 0x54, 0x00, 0xf0, 0x26, 0xf8, 0xee, 0xd9, 0x00, 0xf0, + 0x37, 0xf8, 0xff, 0xf7, 0x2a, 0xfd, 0xe1, 0x6d, 0x4d, 0x65, 0x21, 0x6e, + 0x4d, 0x65, 0xe1, 0x6d, 0x81, 0xf8, 0x37, 0x50, 0x28, 0x46, 0xd1, 0xe3, + 0x00, 0x20, 0x00, 0xf0, 0x1f, 0xf8, 0x1f, 0x46, 0xc7, 0xf1, 0xfe, 0x07, + 0x97, 0x42, 0x03, 0xd2, 0x00, 0xf0, 0xb1, 0xfb, 0x31, 0x54, 0x02, 0xe0, + 0x9a, 0x18, 0x52, 0x1c, 0x32, 0x54, 0x00, 0xf0, 0x07, 0xf8, 0xee, 0xd9, + 0xdf, 0xe7, 0x10, 0x68, 0x40, 0xf0, 0x04, 0x00, 0x10, 0x60, 0x70, 0x47, + 0x04, 0xf1, 0x5c, 0x01, 0x51, 0xf8, 0x20, 0x20, 0x31, 0x5c, 0x82, 0xf8, + 0x4d, 0x10, 0x40, 0x1c, 0x01, 0x28, 0x70, 0x47, 0x04, 0xf1, 0x5c, 0x01, + 0xe3, 0x6d, 0x51, 0xf8, 0x20, 0x10, 0x93, 0xf8, 0x39, 0x30, 0x91, 0xf8, + 0x3a, 0x20, 0x70, 0x47, 0x01, 0xaa, 0x10, 0x21, 0x20, 0x46, 0xfe, 0xf7, + 0x5e, 0xba, 0x00, 0x93, 0x20, 0x46, 0x13, 0x46, 0x0a, 0x46, 0x02, 0xa9, + 0x68, 0xe6, 0xe0, 0x6d, 0x90, 0xf8, 0x38, 0x10, 0x49, 0x1c, 0x80, 0xf8, + 0x38, 0x10, 0xe0, 0x6d, 0x90, 0xf8, 0x38, 0x10, 0x02, 0x29, 0x70, 0x47, + 0xe0, 0x6d, 0x90, 0xf8, 0x39, 0x10, 0x49, 0x1c, 0x80, 0xf8, 0x39, 0x10, + 0xe0, 0x6d, 0x22, 0x6d, 0x90, 0xf8, 0x39, 0x10, 0x70, 0x47, 0x80, 0xb5, + 0x00, 0x23, 0xad, 0xf8, 0x00, 0x30, 0x8d, 0xf8, 0x00, 0x20, 0x8d, 0xf8, + 0x01, 0x20, 0x6a, 0x46, 0xfe, 0xf7, 0x26, 0xfa, 0x01, 0xbd, 0x38, 0xb5, + 0xff, 0xf7, 0xc9, 0xfc, 0x11, 0x20, 0x00, 0xf0, 0x6d, 0xf8, 0x81, 0xf8, + 0x5d, 0x00, 0x00, 0xf0, 0x49, 0xf8, 0x04, 0xeb, 0x81, 0x00, 0x49, 0x1c, + 0xc3, 0x6d, 0xda, 0x62, 0x02, 0x29, 0xc3, 0x6d, 0x1a, 0x63, 0x00, 0xf0, + 0x55, 0xf8, 0xc3, 0x6d, 0x1a, 0x65, 0xc0, 0x6d, 0x80, 0xf8, 0x5c, 0x20, + 0xef, 0xd3, 0x20, 0x46, 0xfe, 0xf7, 0x7a, 0xfe, 0x20, 0x46, 0xfe, 0xf7, + 0x75, 0xff, 0x20, 0x46, 0xfe, 0xf7, 0xde, 0xff, 0x20, 0x6d, 0x90, 0xf8, + 0x2b, 0x10, 0x20, 0x46, 0xfe, 0xf7, 0x6b, 0xfa, 0x20, 0x6d, 0x90, 0xf8, + 0x2b, 0x10, 0x20, 0x46, 0xfe, 0xf7, 0x75, 0xfa, 0x20, 0x6d, 0x90, 0xf8, + 0x4d, 0x10, 0x20, 0x46, 0xfe, 0xf7, 0x86, 0xfa, 0x20, 0x6d, 0x90, 0xf8, + 0x2a, 0x10, 0x20, 0x46, 0xfe, 0xf7, 0x91, 0xfa, 0x00, 0x25, 0x01, 0x22, + 0xe9, 0xb2, 0x20, 0x46, 0xfe, 0xf7, 0xcb, 0xfa, 0x00, 0xf0, 0x26, 0xf9, + 0xeb, 0xb2, 0x00, 0xf0, 0x20, 0xf8, 0x20, 0x6d, 0x90, 0xf8, 0x39, 0x20, + 0xe9, 0xb2, 0x00, 0xf0, 0x27, 0xf9, 0x6d, 0x1c, 0x02, 0x2d, 0xec, 0xd3, + 0x03, 0x20, 0x20, 0x70, 0x00, 0x20, 0x32, 0xbd, 0xe1, 0x6d, 0x81, 0xf8, + 0x38, 0x00, 0xe1, 0x6d, 0x81, 0xf8, 0x39, 0x00, 0x00, 0x21, 0x70, 0x47, + 0x04, 0xf1, 0x5c, 0x01, 0xf3, 0xb2, 0x51, 0xf8, 0x26, 0x00, 0xa9, 0x5d, + 0x80, 0xf8, 0x3a, 0x10, 0xe0, 0x6d, 0x41, 0x79, 0xaa, 0x5d, 0x20, 0x46, + 0xfe, 0xf7, 0xc8, 0xb9, 0xc3, 0x6d, 0x83, 0xf8, 0x3a, 0x20, 0xc3, 0x6d, + 0x83, 0xf8, 0x3b, 0x20, 0xc3, 0x6d, 0x83, 0xf8, 0x4d, 0x20, 0x70, 0x47, + 0xe1, 0x6d, 0x48, 0x71, 0x00, 0x20, 0xe1, 0x6d, 0x81, 0xf8, 0x36, 0x00, + 0x00, 0x22, 0xe1, 0x6d, 0x81, 0xf8, 0x37, 0x00, 0xe1, 0x6d, 0x81, 0xf8, + 0x2a, 0x00, 0xe1, 0x6d, 0x70, 0x47, 0x70, 0xb5, 0x86, 0xb0, 0x04, 0x46, + 0x01, 0xa8, 0x00, 0x21, 0x01, 0x80, 0x04, 0xa8, 0x02, 0xaa, 0xc0, 0xe9, + 0x00, 0x11, 0xc2, 0xe9, 0x00, 0x11, 0x20, 0x46, 0x04, 0xa9, 0xfe, 0xf7, + 0x4d, 0xfa, 0x02, 0xa9, 0x20, 0x46, 0xfe, 0xf7, 0x5a, 0xfa, 0xe0, 0x6d, + 0x0f, 0xf2, 0xd8, 0x53, 0x90, 0xf8, 0x36, 0x10, 0x01, 0xad, 0x19, 0xb1, + 0x02, 0x29, 0x79, 0xd0, 0x59, 0xd3, 0x46, 0xe0, 0x00, 0xf0, 0xc0, 0xf8, + 0x01, 0x28, 0x42, 0xd1, 0x00, 0x26, 0x20, 0x6d, 0xa9, 0x5d, 0x10, 0xf8, + 0x35, 0x2f, 0x8a, 0x42, 0x28, 0xbf, 0x03, 0x22, 0x03, 0xd2, 0x40, 0x78, + 0x81, 0x42, 0x0c, 0xd3, 0x00, 0x22, 0xf1, 0xb2, 0x20, 0x46, 0xfe, 0xf7, + 0x56, 0xfa, 0x00, 0xf0, 0xb1, 0xf8, 0xf3, 0xb2, 0xff, 0xf7, 0xab, 0xff, + 0x00, 0xf0, 0xb2, 0xf8, 0x0e, 0xe0, 0x04, 0xf1, 0x5c, 0x00, 0x50, 0xf8, + 0x26, 0x20, 0x82, 0xf8, 0x3b, 0x10, 0x00, 0xf0, 0x91, 0xf8, 0x18, 0xb1, + 0xff, 0xf7, 0x92, 0xff, 0x00, 0xf0, 0xa4, 0xf8, 0x00, 0xf0, 0x8e, 0xf8, + 0x76, 0x1c, 0x02, 0x2e, 0xd5, 0xd3, 0x01, 0x22, 0x00, 0x21, 0x04, 0xf1, + 0x5c, 0x00, 0x50, 0xf8, 0x21, 0x30, 0x93, 0xf8, 0x5c, 0x00, 0x00, 0xb9, + 0x00, 0x22, 0x49, 0x1c, 0x02, 0x29, 0xf4, 0xd3, 0x72, 0xb1, 0x00, 0xf0, + 0x77, 0xf8, 0x00, 0x28, 0x3d, 0xd0, 0x00, 0xf0, 0x92, 0xf8, 0x02, 0x21, + 0xe0, 0x6d, 0x80, 0xf8, 0x36, 0x10, 0x03, 0x21, 0x21, 0x70, 0x00, 0x20, + 0x06, 0xb0, 0x70, 0xbd, 0xe1, 0x6d, 0x01, 0xf1, 0x2a, 0x02, 0x00, 0x20, + 0x50, 0x73, 0xe1, 0x6d, 0x81, 0xf8, 0x5d, 0x00, 0xe0, 0x6d, 0x90, 0xf8, + 0x36, 0x10, 0x49, 0x1c, 0xeb, 0xe7, 0x00, 0xf0, 0x67, 0xf8, 0x01, 0x28, + 0xe9, 0xd1, 0x00, 0x26, 0x00, 0xf0, 0x51, 0xf8, 0x91, 0xf8, 0x5c, 0x00, + 0x58, 0xb9, 0xaa, 0x5d, 0x81, 0xf8, 0x3b, 0x20, 0x00, 0xf0, 0x4e, 0xf8, + 0x18, 0xb1, 0xff, 0xf7, 0x4f, 0xff, 0x00, 0xf0, 0x61, 0xf8, 0x00, 0xf0, + 0x4b, 0xf8, 0x76, 0x1c, 0x02, 0x2e, 0xeb, 0xd3, 0x00, 0xf0, 0x42, 0xf8, + 0x48, 0xb1, 0x00, 0xf0, 0x5e, 0xf8, 0xdb, 0xe7, 0x02, 0xaa, 0x04, 0xa9, + 0x20, 0x46, 0x00, 0xf0, 0x7b, 0xf9, 0x01, 0x28, 0xc7, 0xd1, 0x00, 0x25, + 0x04, 0xf1, 0x5c, 0x00, 0xeb, 0xb2, 0x50, 0xf8, 0x25, 0x10, 0xe0, 0x6d, + 0x91, 0xf8, 0x3b, 0x20, 0x41, 0x79, 0xff, 0xf7, 0x3a, 0xff, 0x04, 0xeb, + 0x85, 0x00, 0x41, 0x6d, 0xe0, 0x6d, 0x42, 0x79, 0x04, 0xf1, 0x5c, 0x00, + 0x11, 0x44, 0x50, 0xf8, 0x25, 0x20, 0x92, 0xf8, 0x3b, 0x00, 0x81, 0xf8, + 0xd4, 0x03, 0x6d, 0x1c, 0x02, 0x2d, 0xe3, 0xd3, 0xe1, 0x6d, 0x00, 0x20, + 0x81, 0xf8, 0x36, 0x00, 0x20, 0x46, 0xfe, 0xf7, 0x31, 0xfe, 0x20, 0x46, + 0xfe, 0xf7, 0x3c, 0xfd, 0x20, 0x46, 0xfe, 0xf7, 0x98, 0xfe, 0x08, 0x21, + 0x20, 0x46, 0xfe, 0xf7, 0xb5, 0xf9, 0x20, 0x46, 0xfc, 0xf7, 0x9d, 0xf9, + 0x97, 0xe7, 0x04, 0xf1, 0x5c, 0x00, 0x50, 0xf8, 0x26, 0x10, 0x70, 0x47, + 0x21, 0x6d, 0x91, 0xf8, 0x34, 0x00, 0x70, 0x47, 0x04, 0xf1, 0x5c, 0x00, + 0x50, 0xf8, 0x26, 0x10, 0x01, 0x20, 0x81, 0xf8, 0x5c, 0x00, 0x70, 0x47, + 0x01, 0xa8, 0x00, 0x90, 0x02, 0xaa, 0x04, 0xa9, 0x20, 0x46, 0x7a, 0xe0, + 0x20, 0x6d, 0x90, 0xf8, 0x37, 0x20, 0xe0, 0x6d, 0x41, 0x79, 0x70, 0x47, + 0x20, 0x6d, 0x90, 0xf8, 0x39, 0x20, 0xf1, 0xb2, 0x20, 0x46, 0xfe, 0xf7, + 0x85, 0xb9, 0xe0, 0x6d, 0x00, 0x21, 0x80, 0xf8, 0x2a, 0x10, 0xe0, 0x6d, + 0x80, 0xf8, 0x5d, 0x10, 0xe0, 0x6d, 0x01, 0x65, 0x20, 0x6e, 0x01, 0x65, + 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x47, 0x08, 0x9f, 0x00, 0x26, 0x3e, 0x60, + 0x7e, 0x60, 0xc4, 0x6d, 0x94, 0xf8, 0x5d, 0x50, 0x15, 0xb1, 0x01, 0x2d, + 0x22, 0xd0, 0x51, 0xe0, 0x00, 0x27, 0x04, 0x46, 0x0d, 0x46, 0x90, 0x46, + 0x04, 0xf1, 0x5c, 0x00, 0x50, 0xf8, 0x27, 0x10, 0x55, 0xf8, 0x27, 0x00, + 0xc8, 0x62, 0x04, 0xf1, 0x5c, 0x01, 0x51, 0xf8, 0x27, 0x20, 0x58, 0xf8, + 0x27, 0x00, 0x10, 0x63, 0xf9, 0xb2, 0x23, 0x6d, 0x93, 0xf8, 0x3a, 0x20, + 0xff, 0xf7, 0xcc, 0xff, 0x7f, 0x1c, 0x02, 0x2f, 0xe8, 0xd3, 0xe0, 0x6d, + 0x90, 0xf8, 0x5d, 0x10, 0x49, 0x1c, 0x80, 0xf8, 0x5d, 0x10, 0x2f, 0xe0, + 0xb1, 0x46, 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0x98, 0x46, 0x04, 0xf1, + 0x5c, 0x00, 0x50, 0xf8, 0x29, 0x00, 0x01, 0x6b, 0xc0, 0x6a, 0x2b, 0xf0, + 0xa7, 0xfc, 0x82, 0x46, 0x56, 0xf8, 0x29, 0x10, 0x55, 0xf8, 0x29, 0x00, + 0x2b, 0xf0, 0xa0, 0xfc, 0x01, 0x46, 0x50, 0x46, 0x41, 0xf0, 0x7b, 0xfd, + 0x21, 0x6d, 0x82, 0x46, 0x91, 0xf8, 0x2a, 0x00, 0x58, 0xf8, 0x20, 0x00, + 0x41, 0xf0, 0x3b, 0xfe, 0x01, 0x46, 0x50, 0x46, 0x41, 0xf0, 0x54, 0xfd, + 0x47, 0xf8, 0x29, 0x00, 0x09, 0xf1, 0x01, 0x09, 0xb9, 0xf1, 0x02, 0x0f, + 0xd9, 0xd3, 0xe1, 0x6d, 0x00, 0x20, 0x81, 0xf8, 0x5d, 0x00, 0x01, 0x26, + 0x30, 0x46, 0xbd, 0xe8, 0xf0, 0x87, 0x2d, 0xe9, 0xfe, 0x4f, 0x04, 0x46, + 0x01, 0xa8, 0x00, 0x25, 0x0c, 0x9e, 0xc0, 0xe9, 0x00, 0x55, 0x35, 0x70, + 0x75, 0x70, 0xe0, 0x6d, 0x90, 0xf8, 0x37, 0x70, 0x17, 0xb1, 0x01, 0x2f, + 0x20, 0xd0, 0x86, 0xe0, 0x00, 0xf0, 0x9e, 0xf8, 0x01, 0x28, 0xfa, 0xd1, + 0x00, 0x26, 0x04, 0xf1, 0x5c, 0x00, 0xf3, 0xb2, 0x50, 0xf8, 0x26, 0x10, + 0x01, 0xa8, 0x50, 0xf8, 0x26, 0x20, 0x0a, 0x65, 0x20, 0x6d, 0x90, 0xf8, + 0x38, 0x20, 0xe0, 0x6d, 0x41, 0x79, 0xff, 0xf7, 0x5c, 0xfe, 0xff, 0xf7, + 0x63, 0xff, 0x76, 0x1c, 0x02, 0x2e, 0xea, 0xd3, 0xe1, 0x6d, 0x81, 0xf8, + 0x5d, 0x50, 0x00, 0xf0, 0x73, 0xf8, 0x66, 0xe0, 0x00, 0xf0, 0x7e, 0xf8, + 0x01, 0x28, 0x62, 0xd1, 0x0c, 0x96, 0x20, 0x6d, 0x10, 0xf8, 0x37, 0x1f, + 0x40, 0x78, 0x81, 0x42, 0x0f, 0xd0, 0x04, 0xeb, 0x85, 0x06, 0x01, 0xa9, + 0xf0, 0x6d, 0x51, 0xf8, 0x25, 0x70, 0x00, 0x6d, 0x39, 0x46, 0x41, 0xf0, + 0x1a, 0xfd, 0x20, 0xf0, 0x00, 0x40, 0x29, 0x49, 0x41, 0xf0, 0xb0, 0xf8, + 0x01, 0xd2, 0x80, 0x20, 0x3f, 0xe0, 0xd4, 0xf8, 0x50, 0x90, 0xf6, 0x6d, + 0xd6, 0xf8, 0x50, 0x80, 0x09, 0xf1, 0x37, 0x0b, 0x9b, 0xf8, 0x00, 0x00, + 0x41, 0xf0, 0xcf, 0xfd, 0x82, 0x46, 0x40, 0x46, 0x39, 0x46, 0x41, 0xf0, + 0x02, 0xfd, 0x07, 0x46, 0x9b, 0xf8, 0x01, 0x00, 0x41, 0xf0, 0xc5, 0xfd, + 0x01, 0x46, 0x50, 0x46, 0x41, 0xf0, 0xf9, 0xfc, 0x01, 0x46, 0x38, 0x46, + 0x41, 0xf0, 0xda, 0xfc, 0x07, 0x46, 0x50, 0x46, 0x00, 0xf0, 0x3f, 0xf8, + 0x41, 0x46, 0x41, 0xf0, 0xee, 0xfc, 0x01, 0x46, 0xd9, 0xf8, 0x40, 0x00, + 0x41, 0xf0, 0xd7, 0xfc, 0x39, 0x46, 0x41, 0xf0, 0xcb, 0xfc, 0x00, 0x21, + 0x41, 0xf0, 0x7e, 0xf8, 0x05, 0xd2, 0x30, 0x68, 0x40, 0xf0, 0x04, 0x00, + 0x30, 0x60, 0x00, 0x20, 0x07, 0xe0, 0xff, 0xf7, 0xcf, 0xfb, 0x04, 0xd8, + 0x30, 0x68, 0x40, 0xf0, 0x08, 0x00, 0x30, 0x60, 0x08, 0x48, 0x41, 0xf0, + 0x93, 0xfd, 0x0c, 0x99, 0x48, 0x55, 0x6d, 0x1c, 0x02, 0x2d, 0xa2, 0xd3, + 0xe1, 0x6d, 0x00, 0x20, 0x81, 0xf8, 0x37, 0x00, 0x01, 0x25, 0x28, 0x46, + 0xbd, 0xe8, 0xfe, 0x8f, 0x18, 0xb7, 0xd1, 0x38, 0x00, 0x00, 0x7f, 0x43, + 0x01, 0x00, 0x7f, 0x43, 0x00, 0x00, 0x40, 0x40, 0xe0, 0x6d, 0x90, 0xf8, + 0x37, 0x10, 0x49, 0x1c, 0x80, 0xf8, 0x37, 0x10, 0x70, 0x47, 0x56, 0xf8, + 0x28, 0x50, 0x5d, 0xf8, 0x28, 0x00, 0x39, 0x46, 0x41, 0xf0, 0xa6, 0xbc, + 0x01, 0xa8, 0x00, 0x90, 0x20, 0x46, 0xe8, 0xe6, 0x2d, 0xe9, 0xff, 0x41, + 0x06, 0x46, 0x02, 0xa8, 0x4f, 0xf0, 0x00, 0x08, 0xc0, 0xe9, 0x00, 0x88, + 0x01, 0xa8, 0x01, 0xad, 0xa0, 0xf8, 0x00, 0x80, 0x02, 0xaf, 0xf0, 0x6d, + 0x90, 0xf8, 0x2a, 0x00, 0x00, 0x28, 0x02, 0xa8, 0x00, 0x90, 0x30, 0x46, + 0x2d, 0xd1, 0xff, 0xf7, 0xd2, 0xfe, 0x01, 0x28, 0x28, 0xd1, 0x00, 0x24, + 0x06, 0xeb, 0x84, 0x01, 0xca, 0x6d, 0x57, 0xf8, 0x24, 0x00, 0x10, 0x65, + 0xca, 0x6d, 0x92, 0xf8, 0x3a, 0x00, 0x20, 0xb9, 0xff, 0xf7, 0xfb, 0xfc, + 0x05, 0xf8, 0x04, 0x80, 0x01, 0xe0, 0x40, 0x1e, 0x28, 0x55, 0xc8, 0x6d, + 0x2a, 0x5d, 0x80, 0xf8, 0x4d, 0x20, 0x30, 0x46, 0x31, 0x6d, 0x91, 0xf8, + 0x39, 0x20, 0xe1, 0xb2, 0xfe, 0xf7, 0x2c, 0xf8, 0x64, 0x1c, 0x01, 0x2c, + 0xe0, 0xd9, 0x00, 0xf0, 0x94, 0xf8, 0xf1, 0x6d, 0x81, 0xf8, 0x5d, 0x80, + 0x01, 0x20, 0xf1, 0x6d, 0x81, 0xf8, 0x2a, 0x00, 0x66, 0xe0, 0xff, 0xf7, + 0xa4, 0xfe, 0x01, 0x28, 0x62, 0xd1, 0x00, 0x23, 0x06, 0xf1, 0x5c, 0x01, + 0x51, 0xf8, 0x23, 0x40, 0x57, 0xf8, 0x23, 0x20, 0x21, 0x6d, 0x22, 0xf0, + 0x00, 0x40, 0x21, 0xf0, 0x00, 0x41, 0x40, 0xf0, 0xf1, 0xff, 0x0a, 0xd2, + 0x06, 0xf1, 0x5c, 0x00, 0x50, 0xf8, 0x23, 0x10, 0x0a, 0x65, 0x50, 0xf8, + 0x23, 0x10, 0x01, 0xf1, 0x3b, 0x00, 0x82, 0x7c, 0x02, 0x70, 0x5b, 0x1c, + 0x01, 0x2b, 0xe3, 0xd9, 0xf0, 0x6d, 0x90, 0xf8, 0x39, 0x10, 0x49, 0x1c, + 0x80, 0xf8, 0x39, 0x10, 0xf0, 0x6d, 0x32, 0x6d, 0x90, 0xf8, 0x39, 0x10, + 0x92, 0xf8, 0x34, 0x30, 0x99, 0x42, 0x0e, 0xd1, 0x80, 0xf8, 0x39, 0x80, + 0xf0, 0x6d, 0x90, 0xf8, 0x38, 0x10, 0x49, 0x1c, 0x80, 0xf8, 0x38, 0x10, + 0xf0, 0x6d, 0x90, 0xf8, 0x38, 0x10, 0x02, 0x29, 0x08, 0xbf, 0x80, 0xf8, + 0x38, 0x80, 0xf0, 0x6d, 0x00, 0xf1, 0x2a, 0x02, 0xd1, 0x7b, 0x90, 0x7b, + 0x00, 0x29, 0x08, 0xbf, 0x00, 0x28, 0x03, 0xd1, 0x10, 0x70, 0x4f, 0xf0, + 0x01, 0x08, 0x1b, 0xe0, 0x00, 0x28, 0x47, 0x46, 0x1a, 0xd1, 0x00, 0xf0, + 0x2d, 0xf8, 0x5c, 0x1c, 0xa2, 0x42, 0x06, 0xd2, 0x0a, 0x68, 0x42, 0xf0, + 0x04, 0x02, 0x0a, 0x60, 0x05, 0xf8, 0x07, 0x80, 0x02, 0xe0, 0xd2, 0x1a, + 0x52, 0x1e, 0xea, 0x55, 0x00, 0xf0, 0x33, 0xf8, 0x7f, 0x1c, 0x01, 0x2f, + 0xeb, 0xd9, 0x00, 0xf0, 0x28, 0xf8, 0xf1, 0x6d, 0x81, 0xf8, 0x5d, 0x80, + 0x40, 0x46, 0x33, 0xe0, 0x00, 0xf0, 0x12, 0xf8, 0x9c, 0x46, 0xcc, 0xf1, + 0xfe, 0x0c, 0x94, 0x45, 0x03, 0xd2, 0x00, 0xf0, 0x14, 0xf8, 0xe9, 0x55, + 0x02, 0xe0, 0x9a, 0x18, 0x52, 0x1c, 0xea, 0x55, 0x00, 0xf0, 0x19, 0xf8, + 0x7f, 0x1c, 0x01, 0x2f, 0xec, 0xd9, 0xe4, 0xe7, 0x06, 0xeb, 0x87, 0x00, + 0xf3, 0x6d, 0xc1, 0x6d, 0x93, 0xf8, 0x39, 0x30, 0x91, 0xf8, 0x3a, 0x20, + 0x70, 0x47, 0x0a, 0x68, 0x42, 0xf0, 0x08, 0x02, 0x0a, 0x60, 0xff, 0x21, + 0x70, 0x47, 0xf0, 0x6d, 0x41, 0x79, 0x01, 0xaa, 0x30, 0x46, 0xfd, 0xf7, + 0xc8, 0xbe, 0xc0, 0x6d, 0xe9, 0x5d, 0x80, 0xf8, 0x4d, 0x10, 0x30, 0x46, + 0x31, 0x6d, 0x91, 0xf8, 0x39, 0x20, 0xf9, 0xb2, 0xfd, 0xf7, 0x82, 0xbf, + 0x04, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x10, 0xb5, 0x04, 0x46, 0x00, 0x20, 0xe1, 0x6d, + 0x48, 0x71, 0xe1, 0x6d, 0x81, 0xf8, 0x36, 0x00, 0xe1, 0x6d, 0x88, 0x65, + 0xe1, 0x6d, 0x81, 0xf8, 0x4f, 0x00, 0x21, 0x6e, 0x88, 0x65, 0x21, 0x6e, + 0x81, 0xf8, 0x4f, 0x00, 0x20, 0x46, 0x22, 0x6d, 0xd1, 0x7b, 0xfd, 0xf7, + 0x9c, 0xfd, 0x03, 0x22, 0x22, 0x70, 0x00, 0x20, 0x10, 0xbd, 0x10, 0xb5, + 0x04, 0x46, 0x00, 0x21, 0xa2, 0x6b, 0x02, 0xf2, 0x24, 0x72, 0x11, 0x60, + 0xfd, 0xf7, 0x74, 0xfd, 0xa0, 0x6b, 0x00, 0xf2, 0x24, 0x70, 0x04, 0x21, + 0x01, 0x60, 0x21, 0x70, 0x00, 0x20, 0x10, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, + 0x04, 0x46, 0x8e, 0xb0, 0x07, 0xa8, 0x09, 0xaa, 0x00, 0x21, 0xc0, 0xe9, + 0x00, 0x11, 0x03, 0xa8, 0xc2, 0xe9, 0x00, 0x11, 0xc0, 0xe9, 0x00, 0x11, + 0x0c, 0xaa, 0x05, 0xa8, 0xc2, 0xe9, 0x00, 0x11, 0xc0, 0xe9, 0x00, 0x11, + 0x8d, 0xf8, 0x04, 0x10, 0x8d, 0xf8, 0x01, 0x10, 0x03, 0xaa, 0x07, 0xad, + 0x40, 0xf2, 0x1f, 0x17, 0x4f, 0xf4, 0x90, 0x7c, 0x4e, 0xf6, 0xb4, 0x03, + 0x00, 0x20, 0x03, 0xf2, 0x0f, 0x13, 0xce, 0xb2, 0x1c, 0xfb, 0x06, 0xfe, + 0x17, 0xfb, 0x06, 0xf8, 0x9e, 0x44, 0x98, 0x44, 0xae, 0xeb, 0x08, 0x0e, + 0x04, 0xf1, 0x3c, 0x08, 0x58, 0xf8, 0x20, 0x90, 0x09, 0xeb, 0x8e, 0x09, + 0x09, 0xf5, 0x2f, 0x79, 0xd9, 0xf8, 0x00, 0xe0, 0x2e, 0xf0, 0x7f, 0x4e, + 0x42, 0xf8, 0x20, 0xe0, 0x40, 0x1c, 0x02, 0x28, 0xe6, 0xd3, 0x07, 0x9b, + 0x03, 0x98, 0xc3, 0x18, 0x07, 0x93, 0x49, 0x1c, 0x6b, 0x68, 0x50, 0x68, + 0xc3, 0x18, 0x6b, 0x60, 0xcb, 0xb2, 0x0f, 0x2b, 0xd4, 0xd9, 0x00, 0x26, + 0x09, 0xaf, 0x55, 0xf8, 0x26, 0x00, 0x41, 0xf0, 0x04, 0xfc, 0x4f, 0xf0, + 0x76, 0x51, 0x41, 0xf0, 0x2f, 0xfb, 0x47, 0xf8, 0x26, 0x00, 0x76, 0x1c, + 0x02, 0x2e, 0xf2, 0xd3, 0xe1, 0x6d, 0x4f, 0xf4, 0x90, 0x70, 0x0b, 0x90, + 0x91, 0xf8, 0x36, 0x20, 0x1a, 0xb1, 0x01, 0x2a, 0x00, 0xf0, 0xd2, 0x80, + 0x0b, 0xe0, 0x9d, 0xf8, 0x01, 0x00, 0x08, 0xb1, 0x8d, 0xf8, 0x01, 0x20, + 0x48, 0x79, 0x10, 0x28, 0x10, 0xd1, 0x4a, 0x71, 0x01, 0x20, 0x8d, 0xf8, + 0x04, 0x00, 0x9d, 0xf8, 0x01, 0x00, 0x00, 0x28, 0xe4, 0xd1, 0x9d, 0xf8, + 0x04, 0x00, 0x00, 0x28, 0x00, 0xf0, 0x30, 0x81, 0x20, 0x46, 0xfb, 0xf7, + 0xba, 0xfe, 0x2d, 0xe1, 0x02, 0x94, 0x00, 0x21, 0x00, 0x24, 0x8d, 0xf8, + 0x03, 0x10, 0x02, 0x99, 0xc8, 0x6d, 0x0b, 0x9e, 0x40, 0x79, 0x01, 0xeb, + 0x84, 0x05, 0x4e, 0xf6, 0xb4, 0x01, 0x40, 0xf2, 0x1f, 0x17, 0x01, 0xf2, + 0x0f, 0x13, 0x46, 0x43, 0x78, 0x43, 0xea, 0x6b, 0x1e, 0x44, 0x18, 0x44, + 0x36, 0x1a, 0x02, 0xeb, 0x86, 0x02, 0x02, 0xf5, 0x2f, 0x72, 0x10, 0x68, + 0xe9, 0x6d, 0x20, 0xf0, 0x7f, 0x40, 0x88, 0x65, 0xe8, 0x6d, 0x80, 0x6d, + 0x41, 0xf0, 0xb3, 0xfb, 0x09, 0xa9, 0x51, 0xf8, 0x24, 0x10, 0x41, 0xf0, + 0xe6, 0xfa, 0x06, 0x46, 0x0c, 0xa8, 0x40, 0xf8, 0x24, 0x60, 0x02, 0x99, + 0xc8, 0x6d, 0x41, 0x79, 0x02, 0x98, 0x8d, 0xf8, 0x02, 0x10, 0x88, 0x46, + 0xd5, 0xf8, 0x54, 0x90, 0x19, 0xf9, 0x08, 0x70, 0x8d, 0xf8, 0x00, 0x70, + 0x01, 0x6d, 0xc8, 0x6a, 0x4f, 0xf0, 0x7e, 0x51, 0x41, 0xf0, 0xbd, 0xfa, + 0x17, 0xf1, 0x06, 0x0f, 0x82, 0x46, 0x0f, 0xda, 0x3c, 0x21, 0x09, 0xf1, + 0x14, 0x00, 0x11, 0xfb, 0x08, 0xf8, 0x51, 0x46, 0x50, 0xf8, 0x08, 0x00, + 0x41, 0xf0, 0xb8, 0xfa, 0x86, 0xf0, 0x00, 0x41, 0x40, 0xf0, 0x58, 0xfe, + 0x38, 0xd2, 0x34, 0xe0, 0x07, 0x2f, 0x0d, 0xdb, 0x3c, 0x20, 0x10, 0xfb, + 0x08, 0xf8, 0x09, 0xeb, 0x08, 0x00, 0x51, 0x46, 0x80, 0x6c, 0x41, 0xf0, + 0xa7, 0xfa, 0x31, 0x46, 0x40, 0xf0, 0x48, 0xfe, 0x28, 0xd2, 0x11, 0xe0, + 0x9d, 0xf8, 0x02, 0x80, 0xc8, 0xeb, 0x08, 0x18, 0x09, 0xf1, 0x14, 0x00, + 0xb9, 0x1d, 0x58, 0xfa, 0x81, 0xf1, 0x50, 0xf8, 0x21, 0x00, 0x51, 0x46, + 0x41, 0xf0, 0x94, 0xfa, 0x31, 0x46, 0x40, 0xf0, 0x35, 0xfe, 0x03, 0xd2, + 0x78, 0x1e, 0x8d, 0xf8, 0x00, 0x00, 0x11, 0xe0, 0x09, 0xf1, 0x14, 0x01, + 0xf8, 0x1d, 0x58, 0xfa, 0x80, 0xf0, 0x51, 0xf8, 0x20, 0x00, 0x51, 0x46, + 0x41, 0xf0, 0x82, 0xfa, 0x86, 0xf0, 0x00, 0x41, 0x40, 0xf0, 0x22, 0xfe, + 0x02, 0xd2, 0x7f, 0x1c, 0x8d, 0xf8, 0x00, 0x70, 0xe9, 0x6d, 0x9d, 0xf8, + 0x00, 0x00, 0x81, 0xf8, 0x4f, 0x00, 0x02, 0x98, 0xc1, 0x6d, 0x6a, 0x6d, + 0x49, 0x79, 0x9d, 0xf9, 0x00, 0x00, 0x55, 0x56, 0xa8, 0x42, 0x07, 0xd0, + 0x02, 0x46, 0x02, 0x98, 0xe3, 0xb2, 0xfd, 0xf7, 0x87, 0xfc, 0x01, 0x20, + 0x8d, 0xf8, 0x03, 0x00, 0x64, 0x1c, 0x02, 0x2c, 0xff, 0xf4, 0x5f, 0xaf, + 0x02, 0x9c, 0x9d, 0xf8, 0x03, 0x00, 0xe1, 0x6d, 0x28, 0xb1, 0x91, 0xf8, + 0x36, 0x00, 0x40, 0x1c, 0x81, 0xf8, 0x36, 0x00, 0x41, 0xe7, 0x48, 0x79, + 0x40, 0x1c, 0x48, 0x71, 0x01, 0x21, 0x8d, 0xf8, 0x01, 0x10, 0x23, 0xe7, + 0x00, 0x26, 0xe0, 0x6d, 0x42, 0x79, 0x04, 0xeb, 0x86, 0x07, 0x78, 0x6d, + 0xf9, 0x6d, 0x85, 0x56, 0x91, 0xf9, 0x4f, 0x00, 0xa8, 0x42, 0x58, 0xd0, + 0xdd, 0xf8, 0x2c, 0xe0, 0x4e, 0xf6, 0xb4, 0x03, 0x40, 0xf2, 0x1f, 0x18, + 0x03, 0xf2, 0x0f, 0x13, 0x0e, 0xfb, 0x02, 0xfe, 0x18, 0xfb, 0x02, 0xf2, + 0xd7, 0xf8, 0x3c, 0xc0, 0x9e, 0x44, 0x1a, 0x44, 0xae, 0xeb, 0x02, 0x02, + 0x0c, 0xeb, 0x82, 0x02, 0x02, 0xf5, 0x2f, 0x72, 0xb4, 0xbf, 0xc5, 0x1d, + 0xed, 0x1d, 0x12, 0x68, 0x22, 0xf0, 0x7f, 0x48, 0x05, 0xaa, 0x42, 0xf8, + 0x26, 0x80, 0x88, 0x6d, 0x41, 0xf0, 0xf1, 0xfa, 0x81, 0x46, 0x40, 0x46, + 0x41, 0xf0, 0xed, 0xfa, 0x01, 0x46, 0x48, 0x46, 0x41, 0xf0, 0x21, 0xfa, + 0x4f, 0xf0, 0x7c, 0x51, 0x41, 0xf0, 0x14, 0xfa, 0x20, 0xf0, 0x00, 0x48, + 0xe0, 0x6d, 0x41, 0x79, 0x20, 0x6d, 0xd7, 0xf8, 0x54, 0x90, 0xd0, 0xf8, + 0x30, 0xa0, 0xc1, 0xeb, 0x01, 0x11, 0x51, 0xfa, 0x85, 0xf5, 0x09, 0xf1, + 0x14, 0x01, 0x51, 0xf8, 0x25, 0x00, 0x51, 0x46, 0x41, 0xf0, 0x00, 0xfa, + 0x83, 0x46, 0x4f, 0xf0, 0x7e, 0x50, 0x51, 0x46, 0x41, 0xf0, 0x03, 0xfa, + 0x41, 0x46, 0x41, 0xf0, 0xf7, 0xf9, 0x59, 0x46, 0x41, 0xf0, 0xeb, 0xf9, + 0x09, 0xf1, 0x14, 0x01, 0x41, 0xf8, 0x25, 0x00, 0xe1, 0x6d, 0x4a, 0x79, + 0xf9, 0x6d, 0x78, 0x6d, 0x91, 0xf8, 0x4f, 0x30, 0x83, 0x54, 0x76, 0x1c, + 0x02, 0x2e, 0x98, 0xd3, 0xe1, 0x6d, 0x00, 0x20, 0x81, 0xf8, 0x36, 0x00, + 0xe0, 0x6d, 0x41, 0x79, 0x49, 0x1c, 0x41, 0x71, 0x01, 0x20, 0x8d, 0xf8, + 0x01, 0x00, 0xaf, 0xe6, 0x03, 0x21, 0x21, 0x70, 0x00, 0x20, 0x0f, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x70, 0xb5, 0x04, 0x46, 0x00, 0x25, 0xe1, 0x6d, + 0x0d, 0x71, 0x60, 0x6d, 0xee, 0xb2, 0x82, 0x19, 0x00, 0x23, 0xe9, 0xb2, + 0x20, 0x46, 0xfd, 0xf7, 0x25, 0xfc, 0xa0, 0x6d, 0x82, 0x19, 0x01, 0x23, + 0xe9, 0xb2, 0x20, 0x46, 0xfd, 0xf7, 0x1e, 0xfc, 0x6d, 0x1c, 0xe9, 0xb2, + 0x10, 0x29, 0xec, 0xd3, 0x00, 0x22, 0xe1, 0x6d, 0x66, 0x48, 0x08, 0x65, + 0x00, 0x25, 0xe1, 0x6d, 0x81, 0xf8, 0x65, 0x20, 0x22, 0x6e, 0x10, 0x65, + 0x00, 0x20, 0x21, 0x6e, 0x81, 0xf8, 0x65, 0x00, 0xe1, 0x6d, 0x81, 0xf8, + 0x64, 0x00, 0x00, 0x26, 0xea, 0xb2, 0xf1, 0xb2, 0x20, 0x46, 0x00, 0xf0, + 0xa8, 0xf8, 0x02, 0x46, 0xf3, 0xb2, 0xe9, 0xb2, 0x20, 0x46, 0xfd, 0xf7, + 0xbf, 0xfb, 0x76, 0x1c, 0xf0, 0xb2, 0x02, 0x28, 0xf0, 0xd3, 0x6d, 0x1c, + 0xe9, 0xb2, 0x10, 0x29, 0xeb, 0xd3, 0x20, 0x6d, 0x90, 0xf8, 0x3c, 0x10, + 0x20, 0x46, 0xfd, 0xf7, 0x22, 0xfd, 0x03, 0x20, 0x20, 0x70, 0x00, 0x20, + 0x70, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x43, 0x84, 0xb0, 0x07, 0x46, + 0x02, 0xa8, 0x00, 0x21, 0xc0, 0xe9, 0x00, 0x11, 0xcd, 0xe9, 0x00, 0x11, + 0x38, 0x46, 0x02, 0xa9, 0xfd, 0xf7, 0x22, 0xfd, 0x69, 0x46, 0x38, 0x46, + 0xfd, 0xf7, 0x2f, 0xfd, 0x00, 0x24, 0x00, 0x26, 0x47, 0xa5, 0x02, 0xaa, + 0x5f, 0xfa, 0x86, 0xf8, 0x5d, 0xf8, 0x28, 0x10, 0x52, 0xf8, 0x28, 0x00, + 0x2b, 0xf0, 0x98, 0xf8, 0x3a, 0x6d, 0x81, 0x46, 0x92, 0xf8, 0x3c, 0x00, + 0x55, 0xf8, 0x20, 0x00, 0x41, 0xf0, 0x37, 0xfa, 0x01, 0x46, 0x48, 0x46, + 0x41, 0xf0, 0x50, 0xf9, 0x07, 0xeb, 0x88, 0x02, 0x20, 0xf0, 0x00, 0x40, + 0xd1, 0x6d, 0x01, 0xf1, 0x50, 0x03, 0x19, 0x68, 0x40, 0xf0, 0xfc, 0xfc, + 0x05, 0xd2, 0xf9, 0x6d, 0x91, 0xf8, 0x64, 0x10, 0x59, 0x75, 0xd1, 0x6d, + 0x08, 0x65, 0x76, 0x1c, 0xf0, 0xb2, 0x02, 0x28, 0xd5, 0xd3, 0xf8, 0x6d, + 0x90, 0xf8, 0x64, 0x10, 0x49, 0x1c, 0x80, 0xf8, 0x64, 0x10, 0xf8, 0x6d, + 0x90, 0xf8, 0x64, 0x10, 0x09, 0x29, 0x29, 0xd1, 0x00, 0x25, 0x07, 0xf1, + 0x5c, 0x00, 0x5f, 0xfa, 0x85, 0xf8, 0x50, 0xf8, 0x28, 0x10, 0x91, 0xf8, + 0x65, 0x00, 0xf9, 0x6d, 0x81, 0xf8, 0x64, 0x00, 0x00, 0xf0, 0x33, 0xf8, + 0x06, 0x46, 0xeb, 0xb2, 0x32, 0x46, 0xe1, 0xb2, 0x38, 0x46, 0xfd, 0xf7, + 0x4d, 0xfb, 0x07, 0xeb, 0x88, 0x00, 0xe2, 0xb2, 0x41, 0x6d, 0x6d, 0x1c, + 0xeb, 0xb2, 0x8e, 0x54, 0x02, 0x2b, 0xe2, 0xd3, 0x64, 0x1c, 0xe0, 0xb2, + 0x10, 0x28, 0xdd, 0xd3, 0xf8, 0x6d, 0x00, 0x21, 0x80, 0xf8, 0x64, 0x10, + 0x38, 0x46, 0xfb, 0xf7, 0xcc, 0xfc, 0x12, 0xe0, 0x00, 0x25, 0x00, 0xf0, + 0x14, 0xf8, 0x02, 0x46, 0xeb, 0xb2, 0xe1, 0xb2, 0x38, 0x46, 0xfd, 0xf7, + 0x2f, 0xfb, 0x6d, 0x1c, 0xe8, 0xb2, 0x02, 0x28, 0xf3, 0xd3, 0x64, 0x1c, + 0xe1, 0xb2, 0x10, 0x29, 0xee, 0xd3, 0x03, 0x20, 0x38, 0x70, 0x00, 0x20, + 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x83, 0xe2, 0xb2, 0xe9, 0xb2, 0x38, 0x46, + 0xff, 0xe7, 0x10, 0xb5, 0x00, 0xeb, 0x81, 0x01, 0x4c, 0x6d, 0xa2, 0x56, + 0xc0, 0x6d, 0x06, 0x4b, 0xd2, 0x1d, 0xd2, 0xb2, 0x02, 0xeb, 0xc2, 0x02, + 0x99, 0x18, 0x90, 0xf8, 0x64, 0x20, 0x88, 0x56, 0x10, 0xbd, 0x00, 0x00, + 0x80, 0x96, 0x18, 0x4b, 0x10, 0x2a, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x2d, 0xe9, 0xf8, 0x4f, 0x8c, 0xb0, 0x07, 0x46, 0x00, 0x20, 0x8d, 0xf8, + 0x01, 0x00, 0x00, 0x25, 0xfc, 0x6d, 0x78, 0x34, 0xa0, 0x88, 0x41, 0xf0, + 0xa4, 0xf9, 0xd4, 0xf8, 0x00, 0x10, 0x41, 0xf0, 0xbd, 0xf8, 0x41, 0xf0, + 0x97, 0xf9, 0x80, 0xb2, 0xe0, 0xa1, 0x01, 0xeb, 0x85, 0x03, 0xfa, 0x6d, + 0x5c, 0x88, 0xb2, 0xf8, 0x7c, 0x30, 0x9c, 0x42, 0x03, 0xd3, 0x31, 0xf8, + 0x25, 0x40, 0x84, 0x42, 0x11, 0xda, 0x6d, 0x1c, 0x02, 0x2d, 0xf0, 0xd3, + 0x00, 0x20, 0x07, 0xeb, 0x80, 0x01, 0x40, 0x1c, 0xc9, 0x6d, 0x0a, 0x68, + 0x42, 0xf0, 0x10, 0x02, 0x02, 0x28, 0x0a, 0x60, 0xf5, 0xd3, 0x01, 0x20, + 0x8d, 0xf8, 0x01, 0x00, 0x7b, 0xe1, 0xed, 0xb2, 0x02, 0x2d, 0xed, 0xd2, + 0xd0, 0x6e, 0x11, 0x6f, 0x41, 0xf0, 0x94, 0xf8, 0x04, 0x46, 0x3c, 0x20, + 0xbd, 0x49, 0x45, 0x43, 0x0d, 0x44, 0xa8, 0x68, 0xf8, 0xf7, 0x82, 0xfb, + 0x0b, 0x90, 0xe8, 0x68, 0xf8, 0xf7, 0x7e, 0xfb, 0x0a, 0x90, 0x28, 0x69, + 0xf8, 0xf7, 0x7a, 0xfb, 0x09, 0x90, 0xf9, 0x6d, 0x08, 0x6f, 0xc9, 0x6e, + 0x41, 0xf0, 0x7e, 0xf8, 0x06, 0x46, 0x69, 0x68, 0x4f, 0xf0, 0x81, 0x40, + 0x41, 0xf0, 0x81, 0xf8, 0x00, 0xf0, 0x77, 0xf9, 0xb0, 0x49, 0x41, 0xf0, + 0x7c, 0xf8, 0xf8, 0xf7, 0x67, 0xfb, 0x08, 0x90, 0x69, 0x69, 0xae, 0x48, + 0x41, 0xf0, 0x75, 0xf8, 0x00, 0xf0, 0x6e, 0xf9, 0xac, 0x49, 0x41, 0xf0, + 0x70, 0xf8, 0xf8, 0xf7, 0x5b, 0xfb, 0x07, 0x90, 0xa9, 0x69, 0xaa, 0x48, + 0x41, 0xf0, 0x69, 0xf8, 0x00, 0xf0, 0x62, 0xf9, 0xa8, 0x49, 0x41, 0xf0, + 0x64, 0xf8, 0xf8, 0xf7, 0x4f, 0xfb, 0x06, 0x90, 0xe9, 0x69, 0xa6, 0x48, + 0x41, 0xf0, 0x5d, 0xf8, 0x00, 0xf0, 0x56, 0xf9, 0xa4, 0x49, 0x41, 0xf0, + 0x58, 0xf8, 0xf8, 0xf7, 0x43, 0xfb, 0x05, 0x90, 0x29, 0x6a, 0xa2, 0x48, + 0x41, 0xf0, 0x51, 0xf8, 0x00, 0xf0, 0x4a, 0xf9, 0xa0, 0x49, 0x41, 0xf0, + 0x4c, 0xf8, 0xf8, 0xf7, 0x37, 0xfb, 0x04, 0x90, 0xf8, 0x6d, 0x04, 0x6f, + 0xc6, 0x6e, 0xa8, 0x6a, 0x00, 0xf0, 0x3b, 0xf9, 0x69, 0x6a, 0x41, 0xf0, + 0x40, 0xf8, 0x83, 0x46, 0xe8, 0x6a, 0x00, 0xf0, 0x34, 0xf9, 0x00, 0xf0, + 0x32, 0xf9, 0x59, 0x46, 0x41, 0xf0, 0x37, 0xf8, 0x80, 0x46, 0x28, 0x6b, + 0x00, 0xf0, 0x2e, 0xf9, 0x41, 0x46, 0x41, 0xf0, 0x30, 0xf8, 0x83, 0x46, + 0x68, 0x6b, 0x00, 0xf0, 0x24, 0xf9, 0x00, 0xf0, 0x25, 0xf9, 0x59, 0x46, + 0x41, 0xf0, 0x27, 0xf8, 0x06, 0x46, 0xa8, 0x6b, 0x00, 0xf0, 0x1e, 0xf9, + 0x00, 0xf0, 0x1c, 0xf9, 0x31, 0x46, 0x41, 0xf0, 0x1e, 0xf8, 0x29, 0x68, + 0x41, 0xf0, 0x24, 0xf8, 0xf8, 0xf7, 0x06, 0xfb, 0x03, 0x90, 0x38, 0x6d, + 0x00, 0xf1, 0x44, 0x06, 0x30, 0x78, 0x41, 0xf0, 0xec, 0xf8, 0x02, 0x90, + 0x70, 0x78, 0x41, 0xf0, 0xe8, 0xf8, 0x01, 0x90, 0xb0, 0x78, 0x41, 0xf0, + 0xe4, 0xf8, 0x04, 0x46, 0xf0, 0x78, 0x41, 0xf0, 0xe0, 0xf8, 0x05, 0x46, + 0x30, 0x79, 0x41, 0xf0, 0xdc, 0xf8, 0x82, 0x46, 0x70, 0x79, 0x41, 0xf0, + 0xd8, 0xf8, 0x83, 0x46, 0xb0, 0x79, 0x41, 0xf0, 0xd4, 0xf8, 0x80, 0x46, + 0xf0, 0x79, 0x41, 0xf0, 0xd0, 0xf8, 0x81, 0x46, 0x30, 0x7a, 0x41, 0xf0, + 0xcc, 0xf8, 0x02, 0x46, 0x03, 0x98, 0x02, 0x99, 0x40, 0xf0, 0xac, 0xfb, + 0x94, 0xbf, 0x0b, 0x46, 0x03, 0x46, 0x08, 0x98, 0x01, 0x99, 0x40, 0xf0, + 0xa5, 0xfb, 0x94, 0xbf, 0x0e, 0x46, 0x06, 0x46, 0x0b, 0x98, 0x21, 0x46, + 0x40, 0xf0, 0x9e, 0xfb, 0x88, 0xbf, 0x04, 0x46, 0x0a, 0x98, 0x29, 0x46, + 0x40, 0xf0, 0x98, 0xfb, 0x88, 0xbf, 0x05, 0x46, 0x09, 0x98, 0x51, 0x46, + 0x40, 0xf0, 0x92, 0xfb, 0x88, 0xbf, 0x82, 0x46, 0x07, 0x98, 0x59, 0x46, + 0x40, 0xf0, 0x8c, 0xfb, 0x88, 0xbf, 0x83, 0x46, 0x06, 0x98, 0x41, 0x46, + 0x40, 0xf0, 0x86, 0xfb, 0x88, 0xbf, 0x80, 0x46, 0x05, 0x98, 0x49, 0x46, + 0x40, 0xf0, 0x80, 0xfb, 0x88, 0xbf, 0x81, 0x46, 0x04, 0x98, 0x11, 0x46, + 0x40, 0xf0, 0x7a, 0xfb, 0x94, 0xbf, 0x01, 0x92, 0x01, 0x90, 0x18, 0x46, + 0x00, 0xf0, 0xaa, 0xf8, 0x98, 0xbf, 0x8d, 0xf8, 0x00, 0x10, 0x03, 0xd9, + 0x41, 0xf0, 0x82, 0xf8, 0x8d, 0xf8, 0x00, 0x00, 0x30, 0x46, 0x00, 0xf0, + 0x9f, 0xf8, 0x98, 0xbf, 0x00, 0x26, 0x02, 0xd9, 0x41, 0xf0, 0x78, 0xf8, + 0x06, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x96, 0xf8, 0x98, 0xbf, 0x00, 0x24, + 0x02, 0xd9, 0x41, 0xf0, 0x6f, 0xf8, 0x04, 0x46, 0x28, 0x46, 0x00, 0xf0, + 0x8d, 0xf8, 0x98, 0xbf, 0x00, 0x25, 0x02, 0xd9, 0x41, 0xf0, 0x66, 0xf8, + 0x05, 0x46, 0x50, 0x46, 0x00, 0xf0, 0x84, 0xf8, 0x98, 0xbf, 0x8a, 0x46, + 0x02, 0xd9, 0x41, 0xf0, 0x5d, 0xf8, 0x82, 0x46, 0x58, 0x46, 0x00, 0xf0, + 0x7b, 0xf8, 0x98, 0xbf, 0x8b, 0x46, 0x02, 0xd9, 0x41, 0xf0, 0x54, 0xf8, + 0x83, 0x46, 0x40, 0x46, 0x00, 0xf0, 0x72, 0xf8, 0x98, 0xbf, 0x88, 0x46, + 0x02, 0xd9, 0x41, 0xf0, 0x4b, 0xf8, 0x80, 0x46, 0x48, 0x46, 0x00, 0xf0, + 0x69, 0xf8, 0x98, 0xbf, 0x89, 0x46, 0x02, 0xd9, 0x41, 0xf0, 0x42, 0xf8, + 0x81, 0x46, 0x01, 0x98, 0x00, 0xf0, 0x60, 0xf8, 0x94, 0xbf, 0x00, 0x20, + 0x41, 0xf0, 0x3a, 0xf8, 0x9d, 0xf9, 0x00, 0x10, 0x7a, 0x6c, 0x01, 0xf0, + 0x3f, 0x01, 0x02, 0xf8, 0x25, 0x1f, 0x4f, 0xfa, 0x89, 0xf9, 0xbb, 0x6c, + 0x03, 0xf8, 0x25, 0x1f, 0xf6, 0xb2, 0x00, 0x21, 0x07, 0xf1, 0x44, 0x02, + 0xcb, 0xb2, 0x52, 0xf8, 0x23, 0x20, 0x12, 0xf8, 0x29, 0x3f, 0x03, 0xf0, + 0x0f, 0x03, 0x43, 0xea, 0x06, 0x13, 0x13, 0x70, 0x49, 0x1c, 0xca, 0xb2, + 0x02, 0x2a, 0xef, 0xd3, 0xf9, 0x6c, 0x04, 0xf0, 0x7f, 0x04, 0x01, 0xf8, + 0x04, 0x4f, 0x05, 0xf0, 0x3f, 0x05, 0xf9, 0x6c, 0x01, 0xf8, 0x05, 0x5f, + 0x0a, 0xf0, 0x7f, 0x02, 0xf9, 0x6c, 0x01, 0xf8, 0x06, 0x2f, 0x0b, 0xf0, + 0x7f, 0x02, 0xf9, 0x6c, 0x01, 0xf8, 0x07, 0x2f, 0x08, 0xf0, 0x7f, 0x02, + 0xf9, 0x6c, 0x01, 0xf8, 0x08, 0x2f, 0x00, 0xf0, 0x7f, 0x00, 0xfa, 0x6c, + 0x02, 0xf8, 0x09, 0x9f, 0xf9, 0x6c, 0x01, 0xf8, 0x0a, 0x0f, 0x38, 0x46, + 0xfb, 0xf7, 0xe1, 0xfa, 0x9d, 0xf8, 0x01, 0x00, 0x0d, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0x00, 0x00, 0x98, 0x2a, 0x00, 0x01, 0x00, 0x00, 0x80, 0xc0, + 0x85, 0xeb, 0xf1, 0x40, 0x85, 0xeb, 0xf1, 0xc0, 0x29, 0x5c, 0xe7, 0x40, + 0x29, 0x5c, 0xe7, 0xc0, 0x71, 0x3d, 0x0a, 0x42, 0x71, 0x3d, 0x0a, 0xc2, + 0x9a, 0x99, 0xa3, 0x41, 0x9a, 0x99, 0xa3, 0xc1, 0x00, 0x21, 0x40, 0xf0, + 0xb5, 0xba, 0x31, 0x46, 0x40, 0xf0, 0x0e, 0xbf, 0x21, 0x46, 0x40, 0xf0, + 0x0b, 0xbf, 0x00, 0x00, 0x7d, 0x02, 0xb8, 0x0b, 0x52, 0x03, 0xa0, 0x0f, + 0x10, 0xb5, 0x04, 0x46, 0x79, 0x49, 0x62, 0x6a, 0x90, 0x6a, 0x40, 0xf0, + 0xa3, 0xfa, 0x38, 0xbf, 0x05, 0x20, 0x41, 0xd3, 0x76, 0x49, 0x40, 0xf0, + 0x9d, 0xfa, 0x38, 0xbf, 0x07, 0x20, 0x3b, 0xd3, 0x74, 0x49, 0x40, 0xf0, + 0x97, 0xfa, 0x38, 0xbf, 0x0a, 0x20, 0x35, 0xd3, 0x72, 0x49, 0x40, 0xf0, + 0x91, 0xfa, 0x38, 0xbf, 0x0c, 0x20, 0x2f, 0xd3, 0x70, 0x49, 0x40, 0xf0, + 0x8b, 0xfa, 0x38, 0xbf, 0x0e, 0x20, 0x29, 0xd3, 0x6e, 0x49, 0x40, 0xf0, + 0x85, 0xfa, 0x38, 0xbf, 0x10, 0x20, 0x23, 0xd3, 0x6c, 0x49, 0x40, 0xf0, + 0x7f, 0xfa, 0x38, 0xbf, 0x12, 0x20, 0x1d, 0xd3, 0x6a, 0x49, 0x40, 0xf0, + 0x79, 0xfa, 0x38, 0xbf, 0x15, 0x20, 0x17, 0xd3, 0x68, 0x49, 0x40, 0xf0, + 0x73, 0xfa, 0x38, 0xbf, 0x19, 0x20, 0x11, 0xd3, 0x66, 0x49, 0x40, 0xf0, + 0x6d, 0xfa, 0x38, 0xbf, 0x1d, 0x20, 0x0b, 0xd3, 0x64, 0x49, 0x40, 0xf0, + 0x67, 0xfa, 0x38, 0xbf, 0x22, 0x20, 0x05, 0xd3, 0x62, 0x49, 0x40, 0xf0, + 0x61, 0xfa, 0x34, 0xbf, 0x26, 0x20, 0x27, 0x20, 0x21, 0x6a, 0x08, 0x70, + 0x20, 0x46, 0x00, 0xf0, 0x03, 0xf8, 0x00, 0xf0, 0xc5, 0xf8, 0x10, 0xbd, + 0x02, 0x6a, 0x11, 0x78, 0x28, 0x29, 0x06, 0xd3, 0x27, 0x21, 0x11, 0x70, + 0x40, 0x6a, 0x02, 0x68, 0x42, 0xf0, 0x20, 0x02, 0x05, 0xe0, 0x29, 0xb9, + 0x11, 0x70, 0x40, 0x6a, 0x02, 0x68, 0x42, 0xf0, 0x40, 0x02, 0x02, 0x60, + 0x70, 0x47, 0x70, 0xb5, 0x05, 0x46, 0x52, 0x48, 0x6c, 0x6a, 0x21, 0x6b, + 0x40, 0xf0, 0x8f, 0xfe, 0x06, 0x46, 0x28, 0x46, 0xfd, 0xf7, 0x8c, 0xfb, + 0x6c, 0x6a, 0x42, 0x49, 0xa0, 0x6a, 0xed, 0x69, 0x40, 0xf0, 0x32, 0xfa, + 0x38, 0xbf, 0xe9, 0x6a, 0x0b, 0xd3, 0x42, 0x49, 0x40, 0xf0, 0x2c, 0xfa, + 0x38, 0xbf, 0x29, 0x6b, 0x05, 0xd3, 0x43, 0x49, 0x40, 0xf0, 0x26, 0xfa, + 0x34, 0xbf, 0x69, 0x6b, 0xa9, 0x6b, 0x30, 0x46, 0x40, 0xf0, 0x7c, 0xfe, + 0x69, 0x6a, 0x40, 0xf0, 0x70, 0xfe, 0x41, 0x49, 0xe0, 0x62, 0x40, 0xf0, + 0x2b, 0xfa, 0x02, 0xd8, 0x3f, 0x48, 0xe0, 0x62, 0x04, 0xe0, 0x3f, 0x49, + 0x40, 0xf0, 0x12, 0xfa, 0x38, 0xbf, 0xe1, 0x62, 0x4f, 0xf0, 0x86, 0x40, + 0xe0, 0x61, 0x70, 0xbd, 0x2d, 0xe9, 0xfe, 0x43, 0x04, 0x46, 0x00, 0x20, + 0xcd, 0xe9, 0x00, 0x00, 0x69, 0x46, 0x20, 0x46, 0xfd, 0xf7, 0x63, 0xfd, + 0xe1, 0x69, 0x66, 0x6a, 0xdf, 0xf8, 0xd4, 0x80, 0x01, 0xf1, 0x3c, 0x07, + 0x38, 0x78, 0x00, 0x28, 0xdd, 0xe9, 0x00, 0x01, 0x0c, 0xbf, 0x4f, 0xf4, + 0x80, 0x25, 0x4f, 0xf4, 0x80, 0x65, 0x2a, 0xf0, 0x77, 0xfd, 0x01, 0x46, + 0x40, 0x46, 0x40, 0xf0, 0x49, 0xfe, 0xba, 0x78, 0x52, 0x1c, 0x81, 0x46, + 0x55, 0x43, 0xa8, 0x00, 0x40, 0xf0, 0x13, 0xff, 0x01, 0x46, 0x48, 0x46, + 0x40, 0xf0, 0x2c, 0xfe, 0xf1, 0x6a, 0x40, 0xf0, 0x44, 0xfe, 0x07, 0x46, + 0xf1, 0x69, 0x27, 0xf0, 0x00, 0x40, 0x40, 0xf0, 0xd9, 0xf9, 0x04, 0xd2, + 0xf0, 0x61, 0x20, 0x6a, 0x01, 0x78, 0x86, 0xf8, 0x34, 0x10, 0x39, 0x46, + 0xe0, 0x69, 0x80, 0x6a, 0x40, 0xf0, 0xce, 0xf9, 0x04, 0xd2, 0x20, 0x6a, + 0x01, 0x78, 0x4a, 0x1e, 0x02, 0x70, 0x0b, 0xe0, 0x41, 0x46, 0x40, 0xf0, + 0x21, 0xfe, 0x01, 0x46, 0x38, 0x46, 0x40, 0xf0, 0xc1, 0xf9, 0x03, 0xd2, + 0x20, 0x6a, 0x01, 0x78, 0x49, 0x1c, 0x01, 0x70, 0x20, 0x46, 0xff, 0xf7, + 0x63, 0xff, 0x00, 0xf0, 0x25, 0xf8, 0xbd, 0xe8, 0xf7, 0x83, 0x00, 0x00, + 0xfa, 0x02, 0x15, 0x4f, 0x5f, 0xd0, 0x32, 0x4f, 0x11, 0xb7, 0x41, 0x4f, + 0xc4, 0x9d, 0x50, 0x4f, 0x77, 0x84, 0x5f, 0x4f, 0x29, 0x6b, 0x6e, 0x4f, + 0xdb, 0x51, 0x7d, 0x4f, 0x47, 0x1c, 0x86, 0x4f, 0xa1, 0x8f, 0x8d, 0x4f, + 0xfa, 0x02, 0x95, 0x4f, 0x53, 0x76, 0x9c, 0x4f, 0xad, 0xe9, 0xa3, 0x4f, + 0x00, 0x00, 0x0c, 0xc2, 0x01, 0x00, 0xc8, 0x41, 0x00, 0x00, 0xc8, 0x41, + 0x00, 0x00, 0x70, 0x41, 0x00, 0x00, 0x80, 0xbf, 0x20, 0x6a, 0x01, 0x78, + 0x20, 0x69, 0x01, 0xf0, 0x3f, 0x01, 0x00, 0xf8, 0x09, 0x1f, 0x70, 0x47, + 0x10, 0xb5, 0x0f, 0xf2, 0x55, 0x01, 0x81, 0x64, 0x01, 0x68, 0x01, 0xf5, + 0x50, 0x61, 0x0a, 0x68, 0x42, 0xf0, 0x01, 0x02, 0x0a, 0x60, 0xc1, 0x69, + 0x03, 0x68, 0x0a, 0x7d, 0x03, 0xf5, 0x50, 0x63, 0x1c, 0x68, 0x24, 0xf4, + 0xff, 0x54, 0x44, 0xea, 0x42, 0x14, 0x1c, 0x60, 0x02, 0x68, 0x49, 0x7d, + 0x02, 0xf5, 0x50, 0x62, 0x13, 0x68, 0x61, 0xf3, 0x44, 0x03, 0x13, 0x60, + 0x01, 0x68, 0x01, 0xf5, 0x50, 0x61, 0x0a, 0x68, 0x52, 0x08, 0x52, 0x00, + 0x0a, 0x60, 0x00, 0x22, 0x01, 0x6d, 0xc1, 0x64, 0x40, 0x6a, 0x82, 0x61, + 0x10, 0xbd, 0x00, 0x00, 0x01, 0x68, 0x01, 0xf6, 0x14, 0x51, 0x0a, 0x68, + 0x22, 0xf0, 0x02, 0x02, 0x0a, 0x60, 0x01, 0x68, 0x01, 0xf6, 0x14, 0x51, + 0x0a, 0x68, 0x42, 0xf0, 0x02, 0x02, 0x0a, 0x60, 0x00, 0x21, 0x03, 0x68, + 0x03, 0xf6, 0x04, 0x53, 0x19, 0x60, 0x40, 0x68, 0x00, 0xf2, 0x24, 0x70, + 0x01, 0x60, 0x70, 0x47, 0x38, 0xb5, 0x04, 0x46, 0x08, 0x46, 0x40, 0xf0, + 0x75, 0xfe, 0x05, 0x46, 0xe0, 0x69, 0x00, 0x7d, 0x40, 0xf0, 0x69, 0xfe, + 0x4f, 0xf0, 0x7e, 0x51, 0x40, 0xf0, 0x8b, 0xfd, 0x4f, 0xf0, 0x81, 0x41, + 0x40, 0xf0, 0x90, 0xfd, 0x01, 0x46, 0x28, 0x46, 0xbd, 0xe8, 0x34, 0x40, + 0x40, 0xf0, 0x78, 0xbd, 0x01, 0x6a, 0x91, 0xf9, 0x01, 0x20, 0x40, 0x2a, + 0x06, 0xdb, 0x3f, 0x22, 0x4a, 0x70, 0x40, 0x6a, 0x01, 0x68, 0x41, 0xf0, + 0x08, 0x01, 0x09, 0xe0, 0x12, 0xf1, 0x0f, 0x0f, 0x07, 0xda, 0x6f, 0xf0, + 0x0e, 0x02, 0x4a, 0x70, 0x40, 0x6a, 0x01, 0x68, 0x41, 0xf0, 0x10, 0x01, + 0x01, 0x60, 0x70, 0x47, 0x02, 0x46, 0x00, 0x20, 0xd1, 0x6c, 0x11, 0xb1, + 0x49, 0x1e, 0xd1, 0x64, 0x70, 0x47, 0x50, 0x6a, 0x01, 0x68, 0x41, 0xf0, + 0x01, 0x01, 0x01, 0x60, 0x01, 0x20, 0x70, 0x47, 0x18, 0xb5, 0x03, 0x68, + 0x00, 0x22, 0x03, 0xf5, 0x51, 0x63, 0x00, 0xe0, 0x52, 0x1c, 0x19, 0x68, + 0x01, 0xf0, 0x01, 0x01, 0x00, 0x91, 0xc1, 0x69, 0x8c, 0x69, 0x00, 0x99, + 0x09, 0xb9, 0xa2, 0x42, 0xf4, 0xd3, 0xa2, 0x42, 0x04, 0xd1, 0x40, 0x6a, + 0x01, 0x68, 0x41, 0xf0, 0x02, 0x01, 0x01, 0x60, 0x00, 0x20, 0x12, 0xbd, + 0x42, 0x6a, 0x01, 0x21, 0xd1, 0x71, 0x23, 0x21, 0x42, 0x6a, 0x11, 0x72, + 0xc1, 0x69, 0x0a, 0x7d, 0x40, 0x6a, 0x51, 0x49, 0x52, 0x1c, 0x4a, 0x43, + 0xc2, 0x60, 0x70, 0x47, 0x10, 0xb5, 0x4f, 0x49, 0x81, 0x64, 0x1b, 0xe0, + 0x10, 0xb5, 0x41, 0x6a, 0x91, 0xf9, 0x08, 0x20, 0xc9, 0x79, 0x03, 0x6a, + 0x01, 0x29, 0x0e, 0xbf, 0x5a, 0x70, 0xa2, 0xf1, 0x0a, 0x01, 0x59, 0x70, + 0x01, 0x6a, 0x91, 0xf9, 0x01, 0x20, 0x11, 0x00, 0xd1, 0xb2, 0x4c, 0xbf, + 0xff, 0x22, 0x00, 0x22, 0x53, 0x18, 0x5a, 0x40, 0x01, 0xf0, 0x80, 0x01, + 0x11, 0x43, 0x02, 0x69, 0x02, 0xf8, 0x0a, 0x1f, 0x00, 0x22, 0x41, 0x68, + 0x01, 0xf2, 0x24, 0x71, 0x0a, 0x60, 0x04, 0x68, 0x04, 0xf6, 0x04, 0x54, + 0x22, 0x60, 0x01, 0x22, 0x00, 0x68, 0x00, 0xf6, 0x04, 0x50, 0x02, 0x60, + 0x0a, 0x60, 0x10, 0xbd, 0x1c, 0xb5, 0x00, 0xf0, 0x71, 0xf8, 0x00, 0x68, + 0xc0, 0xf3, 0x11, 0x00, 0x80, 0xf4, 0x00, 0x30, 0xa0, 0xf5, 0x00, 0x30, + 0x00, 0x90, 0x61, 0x6a, 0x00, 0x98, 0xca, 0x68, 0x90, 0x42, 0x11, 0xda, + 0x91, 0xf9, 0x08, 0x20, 0x6f, 0xf0, 0x04, 0x00, 0x82, 0x42, 0x0b, 0xdb, + 0x0a, 0x3a, 0x0a, 0x72, 0x61, 0x6a, 0x91, 0xf9, 0x08, 0x20, 0x82, 0x42, + 0x0c, 0xda, 0x08, 0x68, 0x40, 0xf0, 0x04, 0x00, 0x08, 0x60, 0x13, 0xbd, + 0x00, 0x22, 0xca, 0x71, 0x20, 0x46, 0x00, 0x99, 0xff, 0xf7, 0x42, 0xff, + 0x61, 0x6a, 0x08, 0x61, 0x13, 0xbd, 0xf8, 0xb5, 0x00, 0xf0, 0x46, 0xf8, + 0x01, 0x68, 0xc1, 0xf3, 0x11, 0x01, 0x81, 0xf4, 0x00, 0x31, 0xa1, 0xf5, + 0x00, 0x31, 0x20, 0x46, 0xff, 0xf7, 0x32, 0xff, 0x65, 0x6a, 0x2e, 0x69, + 0x01, 0x46, 0x30, 0x46, 0x40, 0xf0, 0x72, 0xf8, 0x69, 0x61, 0x21, 0xd2, + 0x40, 0xf0, 0xd3, 0xfc, 0x17, 0x49, 0x40, 0xf0, 0xb5, 0xfc, 0x00, 0x90, + 0xe0, 0x69, 0xc0, 0x7d, 0x40, 0xf0, 0x93, 0xfd, 0x07, 0x46, 0x95, 0xf9, + 0x08, 0x00, 0x40, 0xf0, 0x95, 0xfd, 0x00, 0x99, 0x40, 0xf0, 0xba, 0xfc, + 0x31, 0x46, 0x40, 0xf0, 0xc0, 0xfc, 0x01, 0x46, 0x38, 0x46, 0x40, 0xf0, + 0xaa, 0xfc, 0x00, 0x99, 0x40, 0xf0, 0x9e, 0xfc, 0xf7, 0xf7, 0x92, 0xff, + 0x40, 0xf0, 0x76, 0xfd, 0x21, 0x6a, 0x48, 0x70, 0x20, 0x46, 0xff, 0xf7, + 0x1d, 0xff, 0x00, 0xf0, 0x48, 0xf8, 0x4c, 0xbf, 0xff, 0x21, 0x00, 0x21, + 0x00, 0xf0, 0x3a, 0xf8, 0xf1, 0xbd, 0x00, 0x00, 0xd4, 0xfe, 0xff, 0xff, + 0x59, 0x90, 0x00, 0x01, 0x00, 0x00, 0x20, 0x41, 0x04, 0x46, 0x20, 0x68, + 0x00, 0xf5, 0x53, 0x60, 0x70, 0x47, 0x10, 0xb5, 0xff, 0xf7, 0xf8, 0xff, + 0x03, 0x68, 0x61, 0x6a, 0xe0, 0x69, 0x8a, 0x69, 0xc3, 0xf3, 0x11, 0x03, + 0x83, 0xf4, 0x00, 0x33, 0x9b, 0x18, 0xc2, 0x7d, 0xa3, 0xf5, 0x00, 0x33, + 0x9a, 0x1a, 0x8a, 0x61, 0x00, 0x6a, 0x90, 0x42, 0x04, 0xda, 0x20, 0x6a, + 0x41, 0x78, 0x49, 0x1c, 0x41, 0x70, 0x05, 0xe0, 0xc2, 0x42, 0x06, 0xda, + 0x20, 0x6a, 0x41, 0x78, 0x4a, 0x1e, 0x42, 0x70, 0x00, 0x20, 0x61, 0x6a, + 0x88, 0x61, 0x20, 0x46, 0xff, 0xf7, 0xe4, 0xfe, 0x00, 0xf0, 0x0f, 0xf8, + 0x4c, 0xbf, 0xff, 0x21, 0x00, 0x21, 0x00, 0xf0, 0x01, 0xf8, 0x10, 0xbd, + 0x0a, 0x18, 0x51, 0x40, 0x00, 0xf0, 0x80, 0x00, 0x08, 0x43, 0x21, 0x69, + 0x01, 0xf8, 0x0a, 0x0f, 0x70, 0x47, 0x20, 0x6a, 0x90, 0xf9, 0x01, 0x10, + 0x08, 0x00, 0xc8, 0xb2, 0x70, 0x47, 0x00, 0x00, 0xf8, 0xb5, 0x04, 0x46, + 0x24, 0xf0, 0x00, 0x40, 0xdf, 0xf8, 0x80, 0x19, 0x40, 0xf0, 0x04, 0xf8, + 0x06, 0xd8, 0xdf, 0xf8, 0x7c, 0x19, 0x3f, 0xf0, 0xed, 0xff, 0x01, 0xd2, + 0x00, 0x20, 0xf2, 0xbd, 0x00, 0xf0, 0x7c, 0xf8, 0x05, 0x46, 0x00, 0xf0, + 0x7a, 0xf8, 0x04, 0x46, 0x00, 0xf0, 0x72, 0xf8, 0x06, 0x46, 0x00, 0xf0, + 0x70, 0xf8, 0xdf, 0xf8, 0x5c, 0x19, 0x40, 0xf0, 0x25, 0xfc, 0x07, 0x46, + 0x28, 0x46, 0xdf, 0xf8, 0x54, 0x19, 0x40, 0xf0, 0x1f, 0xfc, 0x01, 0x46, + 0x4f, 0xf0, 0x7c, 0x50, 0x40, 0xf0, 0x35, 0xfc, 0x01, 0x46, 0x38, 0x46, + 0x40, 0xf0, 0x31, 0xfc, 0x00, 0xf0, 0x5b, 0xf8, 0x00, 0xf0, 0xc4, 0xfa, + 0x05, 0x46, 0x00, 0xf0, 0x59, 0xf8, 0x04, 0x46, 0x30, 0x46, 0xdf, 0xf8, + 0x2c, 0x19, 0x40, 0xf0, 0x09, 0xfc, 0xdf, 0xf8, 0x28, 0x19, 0x40, 0xf0, + 0x0e, 0xfc, 0x00, 0xf0, 0x4e, 0xf8, 0x01, 0x46, 0x28, 0x46, 0xbd, 0xe8, + 0xf4, 0x40, 0x40, 0xf0, 0x18, 0xbc, 0xf8, 0xb5, 0x04, 0x46, 0x24, 0xf0, + 0x00, 0x40, 0xdf, 0xf8, 0x0c, 0x19, 0x3f, 0xf0, 0xbd, 0xff, 0x01, 0xd8, + 0x00, 0x20, 0xf2, 0xbd, 0x00, 0xf0, 0x3a, 0xf8, 0x05, 0x46, 0x00, 0xf0, + 0x38, 0xf8, 0x06, 0x46, 0x28, 0x46, 0xdf, 0xf8, 0xf4, 0x18, 0x40, 0xf0, + 0xe7, 0xfb, 0x01, 0x46, 0xdf, 0xf8, 0xec, 0x08, 0x40, 0xf0, 0xfd, 0xfb, + 0x07, 0x46, 0x00, 0xf0, 0x25, 0xf8, 0xdf, 0xf8, 0xe4, 0x18, 0x40, 0xf0, + 0xdb, 0xfb, 0x39, 0x46, 0x40, 0xf0, 0xe1, 0xfb, 0x00, 0xf0, 0xb5, 0xfb, + 0x01, 0x46, 0x20, 0x46, 0x40, 0xf0, 0xed, 0xfb, 0x04, 0x46, 0x30, 0x46, + 0x00, 0xf0, 0xad, 0xfb, 0x00, 0xf0, 0xab, 0xfb, 0x06, 0x46, 0x28, 0x46, + 0xdf, 0xf8, 0xbc, 0x18, 0x40, 0xf0, 0xc6, 0xfb, 0x01, 0x46, 0xdf, 0xf8, + 0xb8, 0x08, 0x40, 0xf0, 0xdc, 0xfb, 0x00, 0xf0, 0x9e, 0xfb, 0x21, 0x46, + 0xbd, 0xe8, 0xf4, 0x40, 0x40, 0xf0, 0xc3, 0xbb, 0x28, 0x46, 0x29, 0x46, + 0x40, 0xf0, 0xc8, 0xbb, 0x20, 0x46, 0x21, 0x46, 0x40, 0xf0, 0xc4, 0xbb, + 0x38, 0xb5, 0x00, 0x21, 0x3f, 0xf0, 0x64, 0xff, 0x04, 0x46, 0x4f, 0xf0, + 0x7e, 0x55, 0x0d, 0xd2, 0x00, 0x25, 0x1b, 0xe0, 0x20, 0x46, 0x29, 0x46, + 0x40, 0xf0, 0xa4, 0xfb, 0x29, 0x46, 0x40, 0xf0, 0xaa, 0xfb, 0x4f, 0xf0, + 0x7c, 0x51, 0x40, 0xf0, 0xaf, 0xfb, 0x05, 0x46, 0xff, 0xf7, 0xe0, 0xff, + 0x21, 0x46, 0x40, 0xf0, 0x97, 0xfb, 0xdf, 0xf8, 0x60, 0x18, 0x40, 0xf0, + 0x9c, 0xfb, 0x20, 0xf0, 0x00, 0x40, 0xdf, 0xf8, 0x58, 0x18, 0x3f, 0xf0, + 0x55, 0xff, 0xe3, 0xd9, 0x28, 0x46, 0x32, 0xbd, 0x2d, 0xe9, 0xf8, 0x41, + 0xef, 0xb0, 0x04, 0x46, 0x0d, 0x46, 0xdf, 0xf8, 0x44, 0x68, 0x3f, 0xa8, + 0x31, 0x46, 0xc0, 0x22, 0xf7, 0xf7, 0x10, 0xfd, 0x0f, 0xa8, 0x06, 0xf1, + 0xc0, 0x01, 0xc0, 0x22, 0xf7, 0xf7, 0x0a, 0xfd, 0x01, 0x2d, 0x09, 0xd1, + 0x3f, 0xa9, 0x20, 0x46, 0x00, 0xf0, 0x32, 0xf9, 0x0f, 0xaa, 0x3f, 0xa9, + 0x20, 0x46, 0x00, 0xf0, 0xa6, 0xfc, 0x03, 0xe0, 0x0f, 0xa9, 0x20, 0x46, + 0x00, 0xf0, 0x28, 0xf9, 0x00, 0x27, 0x0f, 0xf6, 0xdc, 0x35, 0x0f, 0xf6, + 0xc8, 0x36, 0x0f, 0xf6, 0xa4, 0x38, 0x07, 0xa8, 0x41, 0x46, 0x20, 0x22, + 0xf7, 0xf7, 0xee, 0xfc, 0x03, 0xa8, 0x31, 0x46, 0x10, 0x22, 0xf7, 0xf7, + 0xe9, 0xfc, 0x95, 0xe8, 0x0e, 0x00, 0x68, 0x46, 0x5f, 0xfa, 0x87, 0xfe, + 0x80, 0xe8, 0x0e, 0x00, 0x60, 0x20, 0x0d, 0xf1, 0x3c, 0x0c, 0x10, 0xfb, + 0x0e, 0xfe, 0x03, 0xab, 0x07, 0xaa, 0x0c, 0xeb, 0x0e, 0x01, 0x20, 0x46, + 0x00, 0xf0, 0x1b, 0xf8, 0x6a, 0x46, 0x07, 0xa9, 0x20, 0x46, 0x00, 0xf0, + 0x05, 0xfa, 0x07, 0xaa, 0xf9, 0xb2, 0x20, 0x46, 0x00, 0xf0, 0x1c, 0xfb, + 0x03, 0xaa, 0xf9, 0xb2, 0x20, 0x46, 0x00, 0xf0, 0x43, 0xfb, 0x6a, 0x46, + 0xf9, 0xb2, 0x20, 0x46, 0x00, 0xf0, 0x7c, 0xfb, 0x7f, 0x1c, 0xf8, 0xb2, + 0x02, 0x28, 0xca, 0xd3, 0x70, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, 0x2d, 0xe9, + 0xf3, 0x4f, 0xad, 0xf5, 0xe0, 0x6d, 0xb7, 0xb0, 0xc0, 0x68, 0xdf, 0xf8, + 0x84, 0x47, 0x00, 0xf1, 0x0c, 0x07, 0x92, 0x46, 0x39, 0x7f, 0x03, 0x91, + 0x9b, 0x46, 0x78, 0x7f, 0x02, 0x90, 0x40, 0xf2, 0x7c, 0x70, 0x3e, 0x78, + 0x68, 0x44, 0x21, 0x46, 0x60, 0x22, 0xf7, 0xf7, 0xa3, 0xfc, 0x1b, 0xa8, + 0x20, 0x21, 0x09, 0xf0, 0xb9, 0xfa, 0x04, 0xa8, 0x10, 0x21, 0x09, 0xf0, + 0xb5, 0xfa, 0xd7, 0xa8, 0x04, 0xf1, 0x60, 0x01, 0x4f, 0xf4, 0x84, 0x62, + 0xf7, 0xf7, 0x94, 0xfc, 0x5e, 0xa8, 0x04, 0xf5, 0x90, 0x61, 0x4f, 0xf4, + 0xf2, 0x72, 0xf7, 0xf7, 0x8d, 0xfc, 0x13, 0xa8, 0x20, 0x21, 0x09, 0xf0, + 0xa3, 0xfa, 0x46, 0xa8, 0x04, 0xf2, 0x64, 0x61, 0x60, 0x22, 0xf7, 0xf7, + 0x83, 0xfc, 0x2e, 0xa8, 0x04, 0xf2, 0xc4, 0x61, 0x60, 0x22, 0xf7, 0xf7, + 0x7d, 0xfc, 0x23, 0xa8, 0x04, 0xf2, 0x24, 0x71, 0x2c, 0x22, 0xf7, 0xf7, + 0x77, 0xfc, 0x08, 0xa8, 0x04, 0xf5, 0xea, 0x61, 0x2c, 0x22, 0xf7, 0xf7, + 0x71, 0xfc, 0xbd, 0x7f, 0x40, 0xf2, 0x7c, 0x71, 0x69, 0x44, 0x30, 0x46, + 0x01, 0xf0, 0x69, 0xf8, 0xdd, 0xf8, 0xe0, 0x07, 0x01, 0x68, 0x02, 0x98, + 0x04, 0x91, 0x01, 0x24, 0x03, 0x99, 0x41, 0x18, 0x4f, 0x1e, 0x0d, 0xf1, + 0x10, 0x08, 0x0d, 0xf1, 0x6c, 0x09, 0x0c, 0xe0, 0x00, 0xeb, 0x01, 0x0c, + 0x53, 0xf8, 0x2c, 0x40, 0x49, 0xf8, 0x20, 0x40, 0x40, 0x1c, 0x90, 0x42, + 0xf6, 0xdb, 0x03, 0x92, 0x02, 0x91, 0x0c, 0x46, 0x6d, 0x1e, 0xe8, 0xb2, + 0x00, 0x28, 0x5c, 0xd0, 0x13, 0xa9, 0xe0, 0xb2, 0x01, 0xf0, 0x47, 0xf8, + 0x46, 0xa8, 0x01, 0x90, 0x00, 0x96, 0xe2, 0xb2, 0xdd, 0xf8, 0xe0, 0x37, + 0x04, 0xa9, 0x13, 0xa8, 0x00, 0xf0, 0x67, 0xff, 0x2e, 0xa9, 0x01, 0x91, + 0x40, 0xf2, 0x7c, 0x73, 0x00, 0x96, 0x6b, 0x44, 0xe2, 0xb2, 0x04, 0xa9, + 0x13, 0xa8, 0x00, 0xf0, 0x5c, 0xff, 0xd7, 0xa8, 0x01, 0x90, 0x2e, 0xa9, + 0x02, 0x9a, 0x03, 0x98, 0x00, 0x91, 0x53, 0x1e, 0x42, 0x1e, 0xdb, 0xb2, + 0xd2, 0xb2, 0x31, 0x46, 0x46, 0xa8, 0x00, 0xf0, 0xfd, 0xff, 0x5e, 0xa8, + 0x01, 0x90, 0x33, 0x46, 0xf8, 0xb2, 0x00, 0x90, 0xfa, 0xb2, 0xd7, 0xa9, + 0xd7, 0xa8, 0x00, 0xf0, 0x5c, 0xfd, 0x5e, 0xaa, 0xf9, 0xb2, 0x5e, 0xa8, + 0x00, 0xf0, 0x48, 0xfe, 0x23, 0xa8, 0x01, 0x21, 0x01, 0x90, 0x00, 0x91, + 0x33, 0x46, 0xfa, 0xb2, 0x46, 0xa9, 0xd7, 0xa8, 0x00, 0xf0, 0x1c, 0xfd, + 0x08, 0xa8, 0x01, 0x21, 0x01, 0x90, 0x00, 0x91, 0xfb, 0xb2, 0xfa, 0xb2, + 0x23, 0xa9, 0x5e, 0xa8, 0x00, 0xf0, 0x12, 0xfd, 0x4f, 0xf0, 0x7e, 0x50, + 0x04, 0x90, 0x01, 0x20, 0x02, 0x99, 0x07, 0xab, 0x06, 0xe0, 0x53, 0xf8, + 0x20, 0x20, 0x82, 0xf0, 0x00, 0x42, 0x48, 0xf8, 0x20, 0x20, 0x40, 0x1c, + 0x88, 0x42, 0xf6, 0xdb, 0x03, 0x9a, 0x00, 0x20, 0x99, 0xe7, 0x03, 0x98, + 0x00, 0x21, 0x81, 0x42, 0xb4, 0xbf, 0x59, 0xf8, 0x21, 0x20, 0x00, 0x22, + 0x4a, 0xf8, 0x21, 0x20, 0x49, 0x1c, 0x08, 0x29, 0xf5, 0xd3, 0x02, 0x98, + 0x00, 0x21, 0x81, 0x42, 0xb4, 0xbf, 0x58, 0xf8, 0x21, 0x20, 0x00, 0x22, + 0x4b, 0xf8, 0x21, 0x20, 0x49, 0x1c, 0x04, 0x29, 0xf5, 0xd3, 0x0d, 0xf5, + 0xe0, 0x6d, 0x39, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x2d, 0xe9, 0xf8, 0x4f, + 0x8e, 0xb0, 0x81, 0x46, 0x8a, 0x46, 0x05, 0xa8, 0x00, 0x21, 0x00, 0x22, + 0xc0, 0xe9, 0x00, 0x12, 0x03, 0xa8, 0x00, 0x23, 0xc0, 0xe9, 0x00, 0x12, + 0x0a, 0xa8, 0x00, 0x24, 0x80, 0xe8, 0x1e, 0x00, 0xcd, 0xe9, 0x00, 0x12, + 0x07, 0xa9, 0xc1, 0xe9, 0x00, 0x23, 0xd9, 0xf8, 0x18, 0x00, 0xd0, 0xf8, + 0x38, 0x11, 0x02, 0x91, 0x4f, 0xf0, 0x7e, 0x50, 0x40, 0xf0, 0x3b, 0xfa, + 0x04, 0x46, 0x00, 0x20, 0x59, 0xf8, 0x20, 0x10, 0x14, 0x31, 0x09, 0x68, + 0x21, 0xf0, 0x40, 0x41, 0x4d, 0xf8, 0x20, 0x10, 0x40, 0x1c, 0x02, 0x28, + 0xf4, 0xd3, 0x00, 0x27, 0x07, 0xad, 0x5d, 0xf8, 0x27, 0x00, 0x40, 0xf0, + 0xf0, 0xfa, 0x00, 0xf0, 0xbd, 0xf8, 0x4f, 0xf0, 0x8a, 0x41, 0x40, 0xf0, + 0x19, 0xfa, 0x45, 0xf8, 0x27, 0x00, 0x7f, 0x1c, 0x02, 0x2f, 0xf0, 0xd3, + 0x00, 0x26, 0x03, 0xaf, 0x0d, 0xf1, 0x14, 0x08, 0xcd, 0xf8, 0x04, 0xa0, + 0x42, 0xf2, 0xd4, 0x22, 0x00, 0x21, 0xf0, 0xb2, 0xf6, 0x32, 0x40, 0xf2, + 0x0f, 0x13, 0x4f, 0xf4, 0x87, 0x7c, 0x00, 0xf0, 0x9c, 0xf8, 0x59, 0xf8, + 0x21, 0xe0, 0xa3, 0xeb, 0x0c, 0x03, 0x0e, 0xeb, 0x83, 0x03, 0x03, 0xf1, + 0x7c, 0x0e, 0xde, 0xf8, 0x00, 0x30, 0x47, 0xf8, 0x21, 0x30, 0x49, 0x1c, + 0x02, 0x29, 0xea, 0xd3, 0x40, 0xf6, 0x24, 0x12, 0x00, 0x21, 0xfa, 0x32, + 0x40, 0xf2, 0x13, 0x13, 0x4f, 0xf4, 0x89, 0x7c, 0x00, 0xf0, 0x83, 0xf8, + 0x59, 0xf8, 0x21, 0xe0, 0xa3, 0xeb, 0x0c, 0x03, 0x0e, 0xeb, 0x83, 0x03, + 0x03, 0xf1, 0x1c, 0x0e, 0xde, 0xf8, 0x00, 0x30, 0x48, 0xf8, 0x21, 0x30, + 0x49, 0x1c, 0x02, 0x29, 0xea, 0xd3, 0x03, 0x99, 0x05, 0x98, 0x10, 0x22, + 0x00, 0xf0, 0x7e, 0xf8, 0xcd, 0xe9, 0x0a, 0x01, 0x2a, 0xf0, 0xfc, 0xf8, + 0x07, 0x99, 0x40, 0xf0, 0xbd, 0xf9, 0x82, 0x46, 0xd9, 0xf8, 0x0c, 0x00, + 0x90, 0xf8, 0x35, 0x10, 0x01, 0x29, 0x09, 0xd1, 0x01, 0x98, 0x40, 0xf8, + 0x26, 0xa0, 0xd9, 0xf8, 0x18, 0x10, 0x01, 0xeb, 0x86, 0x00, 0xc0, 0xf8, + 0x3c, 0xa1, 0x15, 0xe0, 0x00, 0xf0, 0x4f, 0xf8, 0xd2, 0xf8, 0x3c, 0x11, + 0x40, 0xf0, 0xb8, 0xf9, 0x83, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x7a, 0xf9, + 0x59, 0x46, 0x40, 0xf0, 0xa8, 0xf9, 0x01, 0x99, 0x41, 0xf8, 0x26, 0x00, + 0xd9, 0xf8, 0x18, 0x20, 0x02, 0xeb, 0x86, 0x01, 0xc1, 0xf8, 0x3c, 0x01, + 0x79, 0x68, 0xd8, 0xf8, 0x04, 0x00, 0x10, 0x22, 0x00, 0xf0, 0x4a, 0xf8, + 0xcd, 0xe9, 0x0c, 0x01, 0x2a, 0xf0, 0xc8, 0xf8, 0x69, 0x68, 0x40, 0xf0, + 0x89, 0xf9, 0x82, 0x46, 0x01, 0x98, 0xd9, 0xf8, 0x0c, 0x10, 0x00, 0xeb, + 0x86, 0x0b, 0x91, 0xf8, 0x35, 0x00, 0x01, 0x28, 0x08, 0xd1, 0xcb, 0xf8, + 0x60, 0xa0, 0xd9, 0xf8, 0x18, 0x00, 0x00, 0xeb, 0x86, 0x01, 0xc1, 0xf8, + 0x9c, 0xa1, 0x13, 0xe0, 0x00, 0xf0, 0x19, 0xf8, 0xd2, 0xf8, 0x9c, 0x11, + 0x40, 0xf0, 0x82, 0xf9, 0x00, 0x90, 0x00, 0xf0, 0x23, 0xf8, 0x00, 0x99, + 0x40, 0xf0, 0x73, 0xf9, 0xcb, 0xf8, 0x60, 0x00, 0xd9, 0xf8, 0x18, 0x10, + 0x01, 0xeb, 0x86, 0x02, 0xc2, 0xf8, 0x9c, 0x01, 0x76, 0x1c, 0x18, 0x2e, + 0xff, 0xf4, 0x62, 0xaf, 0x0f, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0xd9, 0xf8, + 0x18, 0x10, 0x02, 0x98, 0x01, 0xeb, 0x86, 0x02, 0x70, 0x47, 0x13, 0xfb, + 0x00, 0xf3, 0x1c, 0xfb, 0x00, 0xfc, 0x13, 0x44, 0x94, 0x44, 0x70, 0x47, + 0x4f, 0xf0, 0x7e, 0x51, 0x40, 0xf0, 0x53, 0xb9, 0x51, 0x46, 0x20, 0x46, + 0x40, 0xf0, 0x58, 0xb9, 0x10, 0xb5, 0x01, 0x24, 0x52, 0x1e, 0x04, 0xfa, + 0x02, 0xf2, 0x51, 0x40, 0x8b, 0x1a, 0x00, 0x22, 0x00, 0x21, 0x10, 0x18, + 0x59, 0x41, 0x10, 0xbd, 0x2d, 0xe9, 0xf4, 0x4f, 0xa4, 0xb0, 0x04, 0x46, + 0x0d, 0x46, 0x0d, 0xf1, 0x08, 0x0b, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, + 0x8b, 0xe8, 0x07, 0x00, 0x13, 0xa8, 0x24, 0x21, 0x09, 0xf0, 0xd6, 0xf8, + 0xa0, 0x69, 0xd0, 0xf8, 0xd4, 0x10, 0x4f, 0xf0, 0x80, 0x40, 0x40, 0xf0, + 0x35, 0xf9, 0x01, 0x46, 0x4f, 0xf0, 0x7e, 0x50, 0x40, 0xf0, 0x1e, 0xf9, + 0x00, 0x26, 0x00, 0x96, 0x09, 0x94, 0x4f, 0xf0, 0x00, 0x0a, 0x00, 0x9c, + 0x08, 0x95, 0xb0, 0x46, 0x00, 0x27, 0xb1, 0x46, 0x01, 0x90, 0x44, 0xe0, + 0x08, 0x98, 0x50, 0xf8, 0x24, 0x10, 0x00, 0x91, 0x08, 0x46, 0x1c, 0xa9, + 0x41, 0xf8, 0x24, 0x00, 0x51, 0x46, 0x00, 0x98, 0x40, 0xf0, 0x0f, 0xf9, + 0x82, 0x46, 0xe0, 0xb2, 0x40, 0xf0, 0xe5, 0xf9, 0x05, 0x46, 0x01, 0x98, + 0xd0, 0x49, 0x40, 0xf0, 0x0f, 0xf9, 0xff, 0xf7, 0x42, 0xfd, 0x83, 0x46, + 0xff, 0xf7, 0xb4, 0xfc, 0x00, 0xf0, 0xd1, 0xf8, 0x31, 0x46, 0x40, 0xf0, + 0xfc, 0xf8, 0x06, 0x46, 0x58, 0x46, 0xff, 0xf7, 0xf2, 0xfc, 0x00, 0xf0, + 0xc8, 0xf8, 0x01, 0x46, 0x40, 0x46, 0x40, 0xf0, 0x04, 0xf9, 0x80, 0x46, + 0x01, 0x98, 0xc5, 0x49, 0x40, 0xf0, 0xf6, 0xf8, 0xff, 0xf7, 0x29, 0xfd, + 0x05, 0x46, 0xff, 0xf7, 0x9b, 0xfc, 0x00, 0xf0, 0xb8, 0xf8, 0x39, 0x46, + 0x40, 0xf0, 0xe3, 0xf8, 0x07, 0x46, 0x28, 0x46, 0xff, 0xf7, 0xd9, 0xfc, + 0x00, 0xf0, 0xaf, 0xf8, 0x01, 0x46, 0x48, 0x46, 0x40, 0xf0, 0xeb, 0xf8, + 0x64, 0x1c, 0x81, 0x46, 0xe4, 0xb2, 0x09, 0x98, 0xc1, 0x68, 0x91, 0xf8, + 0x28, 0x00, 0x84, 0x42, 0xb4, 0xdb, 0x31, 0x46, 0x01, 0x9c, 0x24, 0x9d, + 0xcd, 0xf8, 0x20, 0xa0, 0x08, 0x46, 0x40, 0xf0, 0xd1, 0xf8, 0x06, 0x46, + 0x40, 0x46, 0x41, 0x46, 0x40, 0xf0, 0xcc, 0xf8, 0x31, 0x46, 0x40, 0xf0, + 0xc0, 0xf8, 0xff, 0xf7, 0x03, 0xfd, 0x01, 0x90, 0x39, 0x46, 0x38, 0x46, + 0x40, 0xf0, 0xc2, 0xf8, 0x06, 0x46, 0x48, 0x46, 0x49, 0x46, 0x40, 0xf0, + 0xbd, 0xf8, 0x31, 0x46, 0x40, 0xf0, 0xb1, 0xf8, 0xff, 0xf7, 0xf4, 0xfc, + 0x0a, 0xaf, 0x4f, 0xf0, 0x80, 0x46, 0x4f, 0xf0, 0x40, 0x48, 0x00, 0x90, + 0x0a, 0x96, 0xc7, 0xf8, 0x04, 0x80, 0xbe, 0x60, 0x4f, 0xf0, 0x7c, 0x50, + 0xff, 0xf7, 0xe3, 0xfc, 0x81, 0x46, 0x9e, 0x48, 0xdf, 0xf8, 0x70, 0xa2, + 0xdf, 0xf8, 0x74, 0xb2, 0x49, 0x46, 0x40, 0xf0, 0xa1, 0xf8, 0x00, 0xf0, + 0x65, 0xf8, 0xff, 0xf7, 0x47, 0xfc, 0x00, 0xf0, 0x68, 0xf8, 0xf8, 0x60, + 0x59, 0x46, 0x48, 0x46, 0x40, 0xf0, 0x96, 0xf8, 0x00, 0xf0, 0x5a, 0xf8, + 0xff, 0xf7, 0x3c, 0xfc, 0x41, 0x46, 0x40, 0xf0, 0x8f, 0xf8, 0x0e, 0x90, + 0x51, 0x46, 0x48, 0x46, 0x40, 0xf0, 0x8a, 0xf8, 0xff, 0xf7, 0x32, 0xfc, + 0x00, 0xf0, 0x53, 0xf8, 0x0f, 0x90, 0x21, 0x46, 0x8b, 0x48, 0x40, 0xf0, + 0x81, 0xf8, 0x00, 0xf0, 0x45, 0xf8, 0xff, 0xf7, 0x27, 0xfc, 0x00, 0xf0, + 0x48, 0xf8, 0xb8, 0x61, 0x59, 0x46, 0xff, 0xf7, 0x1c, 0xff, 0x00, 0xf0, + 0x3b, 0xf8, 0xff, 0xf7, 0x1d, 0xfc, 0x41, 0x46, 0x40, 0xf0, 0x70, 0xf8, + 0x11, 0x90, 0xff, 0xf7, 0x11, 0xff, 0xff, 0xf7, 0x15, 0xfc, 0x00, 0xf0, + 0x36, 0xf8, 0x12, 0x90, 0x13, 0xaa, 0x03, 0x21, 0x0a, 0xa8, 0x00, 0xf0, + 0x15, 0xfc, 0x08, 0x99, 0x4f, 0xf0, 0x7e, 0x50, 0x40, 0xf0, 0x4c, 0xf8, + 0x05, 0x90, 0x4f, 0xf0, 0x7e, 0x50, 0x00, 0x99, 0x05, 0xac, 0x40, 0xf0, + 0x45, 0xf8, 0x60, 0x60, 0x4f, 0xf0, 0x7e, 0x50, 0x01, 0x99, 0x40, 0xf0, + 0x3f, 0xf8, 0xa0, 0x60, 0x01, 0x21, 0x02, 0xa8, 0x01, 0x90, 0x00, 0x91, + 0x03, 0x23, 0x03, 0x22, 0x05, 0xa9, 0x13, 0xa8, 0x00, 0xf0, 0xd6, 0xfa, + 0x02, 0x98, 0x28, 0x60, 0x02, 0xa8, 0x41, 0x68, 0x81, 0xf0, 0x00, 0x41, + 0x69, 0x60, 0x80, 0x68, 0xa8, 0x60, 0x25, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x51, 0x46, 0x40, 0xf0, 0x37, 0xb8, 0x01, 0x46, 0x00, 0x98, 0x40, 0xf0, + 0x33, 0xb8, 0x31, 0x46, 0x40, 0xf0, 0x30, 0xb8, 0x2d, 0xe9, 0xf8, 0x43, + 0x00, 0xf0, 0x60, 0xf8, 0x00, 0xf0, 0x58, 0xf8, 0xef, 0x68, 0x39, 0x6b, + 0x40, 0xf0, 0x26, 0xf8, 0xf7, 0xf7, 0x08, 0xfb, 0x40, 0xf0, 0xec, 0xf8, + 0xb0, 0xf5, 0x00, 0x6f, 0x04, 0xdb, 0x00, 0xf0, 0x45, 0xf8, 0x42, 0xf0, + 0x04, 0x02, 0x07, 0xe0, 0xa0, 0x42, 0x07, 0xdc, 0xa9, 0x69, 0x51, 0xf8, + 0x28, 0x20, 0x20, 0x46, 0x42, 0xf0, 0x08, 0x02, 0x41, 0xf8, 0x28, 0x20, + 0xa9, 0x69, 0x01, 0xeb, 0x48, 0x12, 0x02, 0xeb, 0x86, 0x03, 0x76, 0x1c, + 0x08, 0x2e, 0xc3, 0xf8, 0xd8, 0x00, 0xd9, 0xd3, 0xbd, 0xe8, 0xf1, 0x83, + 0x2d, 0xe9, 0xf8, 0x43, 0x00, 0xf0, 0x34, 0xf8, 0x00, 0xf0, 0x2c, 0xf8, + 0xef, 0x68, 0x39, 0x6b, 0x3f, 0xf0, 0xfa, 0xff, 0xf7, 0xf7, 0xdc, 0xfa, + 0x40, 0xf0, 0xc0, 0xf8, 0xb0, 0xf5, 0x00, 0x6f, 0x04, 0xdb, 0x00, 0xf0, + 0x19, 0xf8, 0x42, 0xf0, 0x10, 0x02, 0x07, 0xe0, 0xa0, 0x42, 0x07, 0xdc, + 0xa9, 0x69, 0x51, 0xf8, 0x28, 0x20, 0x20, 0x46, 0x42, 0xf0, 0x20, 0x02, + 0x41, 0xf8, 0x28, 0x20, 0xa9, 0x69, 0x01, 0xeb, 0x08, 0x12, 0x02, 0xeb, + 0x86, 0x03, 0x76, 0x1c, 0x04, 0x2e, 0xc3, 0xf8, 0x18, 0x01, 0xd9, 0xd3, + 0xbd, 0xe8, 0xf1, 0x83, 0xa9, 0x69, 0x51, 0xf8, 0x28, 0x20, 0x4f, 0xf4, + 0x00, 0x60, 0x70, 0x47, 0x59, 0xf8, 0x26, 0x10, 0x4f, 0xf0, 0x89, 0x40, + 0x3f, 0xf0, 0xcc, 0xbf, 0x05, 0x46, 0x88, 0x46, 0x91, 0x46, 0x00, 0x26, + 0x2f, 0x4c, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x47, 0x06, 0x46, 0x8a, 0x46, + 0x90, 0x46, 0x00, 0x25, 0x2c, 0x4c, 0x40, 0xf2, 0xff, 0x19, 0x58, 0xf8, + 0x25, 0x10, 0x4f, 0xf0, 0x87, 0x40, 0x3f, 0xf0, 0xb7, 0xff, 0xf7, 0x68, + 0xf9, 0x6a, 0x3f, 0xf0, 0xb3, 0xff, 0xf7, 0xf7, 0x95, 0xfa, 0x40, 0xf0, + 0x79, 0xf8, 0x48, 0x45, 0x06, 0xdb, 0xb1, 0x69, 0x51, 0xf8, 0x2a, 0x20, + 0x48, 0x46, 0x42, 0xf0, 0x40, 0x02, 0x07, 0xe0, 0xa0, 0x42, 0x07, 0xdc, + 0xb1, 0x69, 0x51, 0xf8, 0x2a, 0x20, 0x20, 0x46, 0x42, 0xf0, 0x80, 0x02, + 0x41, 0xf8, 0x2a, 0x20, 0x06, 0xeb, 0x8a, 0x01, 0x0a, 0x69, 0x02, 0xeb, + 0x85, 0x03, 0x6d, 0x1c, 0x03, 0x2d, 0x18, 0x63, 0xd5, 0xd3, 0xbd, 0xe8, + 0xf0, 0x87, 0x00, 0x00, 0x95, 0x0c, 0xc9, 0x3f, 0x22, 0x13, 0xc9, 0x3f, + 0x00, 0x80, 0x1d, 0x47, 0x00, 0x00, 0xc0, 0x41, 0x00, 0x7c, 0x5d, 0x4a, + 0x61, 0x0b, 0xb6, 0x3a, 0x39, 0x0e, 0x49, 0x40, 0x00, 0x00, 0xf0, 0x42, + 0xab, 0xaa, 0x2a, 0x3e, 0x00, 0x80, 0x9d, 0x45, 0x40, 0x45, 0x18, 0x4c, + 0x1d, 0xef, 0x38, 0x36, 0x00, 0x00, 0x80, 0xbf, 0x17, 0xb7, 0xd1, 0x38, + 0x14, 0x21, 0x00, 0x01, 0x94, 0x22, 0x00, 0x01, 0xdb, 0x0f, 0xc9, 0x40, + 0xdb, 0x0f, 0x49, 0x40, 0x00, 0x00, 0xa0, 0x40, 0x00, 0x00, 0x40, 0x40, + 0x01, 0xf8, 0xff, 0xff, 0x00, 0xfe, 0xff, 0xff, 0x2d, 0xe9, 0xf8, 0x4f, + 0x8c, 0xb0, 0x8b, 0x46, 0x04, 0xa9, 0x00, 0x22, 0x00, 0x23, 0xc1, 0xe9, + 0x00, 0x23, 0x02, 0xa9, 0x00, 0x24, 0xc1, 0xe9, 0x00, 0x23, 0x08, 0xa9, + 0x00, 0x25, 0x81, 0xe8, 0x3c, 0x00, 0xcd, 0xe9, 0x00, 0x23, 0x00, 0x21, + 0x06, 0xaa, 0x81, 0x46, 0xc2, 0xe9, 0x00, 0x34, 0x59, 0xf8, 0x21, 0x00, + 0x18, 0x30, 0x00, 0x68, 0x20, 0xf0, 0x40, 0x40, 0x4d, 0xf8, 0x21, 0x00, + 0x49, 0x1c, 0x02, 0x29, 0xf4, 0xd3, 0x00, 0x26, 0x06, 0xac, 0xf7, 0xb2, + 0x5d, 0xf8, 0x27, 0x00, 0x40, 0xf0, 0x0b, 0xf8, 0xff, 0xf7, 0xd8, 0xfd, + 0x44, 0xf8, 0x27, 0x00, 0x76, 0x1c, 0xf7, 0xb2, 0x02, 0x2f, 0xf2, 0xd3, + 0x0d, 0xf1, 0x20, 0x0a, 0x02, 0xae, 0x04, 0xaf, 0x45, 0xf6, 0x14, 0x01, + 0x00, 0x20, 0xe5, 0x31, 0x5f, 0xfa, 0x85, 0xf8, 0xfe, 0x22, 0xfd, 0x23, + 0x00, 0xf0, 0x3f, 0xf8, 0x02, 0xf5, 0x9e, 0x73, 0x1a, 0x68, 0x46, 0xf8, + 0x20, 0x20, 0x40, 0x1c, 0x02, 0x28, 0xf3, 0xd3, 0x43, 0xf6, 0x24, 0x41, + 0x00, 0x20, 0x01, 0xf5, 0x89, 0x71, 0x40, 0xf2, 0x2b, 0x12, 0x4f, 0xf4, + 0x95, 0x73, 0x00, 0xf0, 0x2c, 0xf8, 0x02, 0xf1, 0xdc, 0x03, 0x1a, 0x68, + 0x47, 0xf8, 0x20, 0x20, 0x40, 0x1c, 0x02, 0x28, 0xf1, 0xd3, 0x02, 0x99, + 0x04, 0x98, 0x05, 0x22, 0xff, 0xf7, 0xac, 0xfd, 0xcd, 0xe9, 0x08, 0x01, + 0x6d, 0x1c, 0x29, 0xf0, 0x29, 0xfe, 0x06, 0x99, 0x3f, 0xf0, 0xea, 0xfe, + 0x4b, 0xf8, 0x28, 0x00, 0x05, 0x22, 0x71, 0x68, 0x78, 0x68, 0xff, 0xf7, + 0x9d, 0xfd, 0xca, 0xe9, 0x02, 0x01, 0x29, 0xf0, 0x1b, 0xfe, 0x61, 0x68, + 0x3f, 0xf0, 0xdc, 0xfe, 0x0b, 0xeb, 0x88, 0x01, 0x08, 0x66, 0xe8, 0xb2, + 0x18, 0x28, 0xb9, 0xd3, 0x0d, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x12, 0xfb, + 0x08, 0xf2, 0x13, 0xfb, 0x08, 0xf3, 0x0a, 0x44, 0x0b, 0x44, 0xd2, 0x1a, + 0x59, 0xf8, 0x20, 0x30, 0x03, 0xeb, 0x82, 0x02, 0x70, 0x47, 0xf8, 0xb5, + 0x04, 0x46, 0x0d, 0x46, 0xa7, 0x69, 0x16, 0x46, 0x2b, 0x46, 0x18, 0x22, + 0x07, 0xf1, 0x0c, 0x01, 0x30, 0x46, 0x00, 0xf0, 0x5b, 0xfc, 0xa0, 0x69, + 0x00, 0xf1, 0x6c, 0x01, 0x05, 0xf1, 0x60, 0x03, 0x06, 0xf1, 0x60, 0x00, + 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x40, 0x18, 0x22, 0x00, 0xf0, 0x4e, 0xbc, + 0x2d, 0xe9, 0xf0, 0x41, 0x06, 0x9c, 0x00, 0x25, 0x11, 0xe0, 0x00, 0xeb, + 0x45, 0x16, 0x01, 0xeb, 0x45, 0x1e, 0x56, 0xf8, 0x27, 0x60, 0x5e, 0xf8, + 0x27, 0x80, 0xa6, 0xeb, 0x08, 0x06, 0x04, 0xeb, 0x45, 0x18, 0x48, 0xf8, + 0x27, 0x60, 0x7f, 0x1c, 0x9f, 0x42, 0xee, 0xdb, 0x6d, 0x1c, 0x95, 0x42, + 0xb8, 0xbf, 0x00, 0x27, 0xf8, 0xdb, 0xbd, 0xe8, 0xf0, 0x81, 0x70, 0xb5, + 0x04, 0x9c, 0x00, 0x25, 0x1d, 0x60, 0x25, 0x60, 0x00, 0xeb, 0x41, 0x10, + 0x0b, 0xe0, 0x1e, 0x68, 0x89, 0x19, 0x19, 0x60, 0x06, 0xe0, 0x50, 0xf8, + 0x25, 0x10, 0x00, 0x29, 0xf7, 0xd5, 0x26, 0x68, 0x89, 0x19, 0x21, 0x60, + 0x6d, 0x1c, 0x95, 0x42, 0xf5, 0xdb, 0x70, 0xbd, 0xf0, 0xb5, 0x04, 0x46, + 0x00, 0x20, 0x07, 0xe0, 0x2e, 0x46, 0x03, 0xe0, 0x00, 0x2e, 0x20, 0xd4, + 0xae, 0x42, 0xf9, 0xda, 0x1e, 0x60, 0x40, 0x1c, 0x88, 0x42, 0x19, 0xda, + 0x00, 0x25, 0x00, 0x26, 0x07, 0xe0, 0x04, 0xeb, 0x40, 0x17, 0x5f, 0xfa, + 0x86, 0xfc, 0x57, 0xf8, 0x2c, 0x70, 0x3d, 0x44, 0x76, 0x1c, 0xf7, 0xb2, + 0x97, 0x42, 0xf4, 0xd3, 0x00, 0x28, 0xe5, 0xd0, 0x1e, 0x68, 0xf7, 0x43, + 0xff, 0x0f, 0x6f, 0xea, 0x05, 0x0c, 0xb7, 0xeb, 0xdc, 0x7f, 0xdf, 0xd0, + 0x00, 0x20, 0x18, 0x60, 0xf0, 0xbd, 0xb5, 0x42, 0xd8, 0xda, 0xdd, 0xe7, + 0x2d, 0xe9, 0xff, 0x47, 0x0c, 0x9d, 0x14, 0x46, 0x99, 0x46, 0x00, 0xf0, + 0x88, 0xf8, 0x00, 0x26, 0x06, 0xe0, 0x60, 0x44, 0x42, 0xf8, 0x23, 0x00, + 0x4f, 0xf0, 0x00, 0x0c, 0x21, 0xe0, 0x76, 0x1c, 0x4e, 0x45, 0x3e, 0xda, + 0x01, 0xa8, 0x00, 0x90, 0x02, 0xab, 0x2a, 0x46, 0xf1, 0xb2, 0x20, 0x46, + 0xff, 0xf7, 0xa3, 0xff, 0x02, 0x98, 0x00, 0x28, 0xf1, 0xdd, 0x01, 0x98, + 0x00, 0x28, 0xee, 0xd5, 0xdd, 0xf8, 0x08, 0xc0, 0x40, 0x42, 0x84, 0x45, + 0x88, 0xbf, 0x84, 0x46, 0xe6, 0x46, 0x00, 0x23, 0x08, 0xeb, 0x46, 0x12, + 0x09, 0xe0, 0xa0, 0xeb, 0x0e, 0x00, 0x42, 0xf8, 0x23, 0x00, 0x4f, 0xf0, + 0x00, 0x0e, 0x5c, 0xea, 0x0e, 0x00, 0xda, 0xd0, 0x5b, 0x1c, 0xab, 0x42, + 0xd7, 0xda, 0x04, 0xeb, 0x46, 0x10, 0x50, 0xf8, 0x23, 0x70, 0x52, 0xf8, + 0x23, 0x00, 0x00, 0x2f, 0x09, 0xd5, 0xc7, 0xf1, 0x00, 0x0a, 0xd6, 0x45, + 0xe7, 0xd3, 0x38, 0x18, 0x42, 0xf8, 0x23, 0x00, 0xae, 0xeb, 0x0a, 0x0e, + 0xe7, 0xe7, 0xbc, 0x45, 0xbd, 0xd3, 0x38, 0x18, 0x42, 0xf8, 0x23, 0x00, + 0xac, 0xeb, 0x07, 0x0c, 0xdf, 0xe7, 0xbd, 0xe8, 0xff, 0x87, 0x2d, 0xe9, + 0xfe, 0x43, 0x14, 0x46, 0x0a, 0x9d, 0x00, 0x22, 0x99, 0x46, 0x01, 0x92, + 0x00, 0xf0, 0x33, 0xf8, 0x01, 0xab, 0x2a, 0x46, 0x49, 0x46, 0x20, 0x46, + 0xff, 0xf7, 0x72, 0xff, 0x01, 0x98, 0x40, 0xb3, 0x00, 0x21, 0x05, 0xe0, + 0x52, 0xf8, 0x23, 0x00, 0x60, 0x44, 0x42, 0xf8, 0x23, 0x00, 0x49, 0x1c, + 0x49, 0x45, 0x1e, 0xda, 0xdd, 0xf8, 0x04, 0xc0, 0x00, 0x23, 0x08, 0xeb, + 0x41, 0x12, 0xab, 0x42, 0xf5, 0xda, 0x04, 0xeb, 0x41, 0x10, 0x50, 0xf8, + 0x23, 0x00, 0x80, 0xb1, 0x66, 0x46, 0x00, 0x2e, 0x48, 0xbf, 0x76, 0x42, + 0x07, 0x46, 0x00, 0x2f, 0x48, 0xbf, 0x7f, 0x42, 0xbe, 0x42, 0xe1, 0xdb, + 0x52, 0xf8, 0x23, 0x60, 0x86, 0x19, 0x42, 0xf8, 0x23, 0x60, 0xac, 0xeb, + 0x00, 0x0c, 0x5b, 0x1c, 0xe5, 0xe7, 0xbd, 0xe8, 0xf7, 0x83, 0x88, 0x46, + 0x00, 0x94, 0x2b, 0x46, 0x4a, 0x46, 0x0b, 0xe7, 0xf8, 0xb5, 0x06, 0x9c, + 0x15, 0x46, 0x1e, 0x46, 0x0f, 0x46, 0x00, 0x95, 0x23, 0x46, 0x32, 0x46, + 0xff, 0xf7, 0x02, 0xff, 0x00, 0x20, 0x00, 0xe0, 0x40, 0x1c, 0xb0, 0x42, + 0x12, 0xda, 0x00, 0x21, 0x05, 0xeb, 0x40, 0x13, 0x01, 0xe0, 0x0e, 0xd4, + 0x49, 0x1c, 0xa1, 0x42, 0xf4, 0xda, 0x53, 0xf8, 0x21, 0x20, 0x00, 0x2a, + 0xf7, 0xdd, 0x07, 0xeb, 0x40, 0x10, 0x50, 0xf8, 0x21, 0x20, 0x52, 0x1c, + 0x40, 0xf8, 0x21, 0x20, 0xf1, 0xbd, 0x07, 0xeb, 0x40, 0x10, 0x50, 0xf8, + 0x21, 0x20, 0x52, 0x1e, 0xf6, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x00, 0x24, + 0x0b, 0xe0, 0x03, 0xfb, 0x05, 0x47, 0x50, 0xf8, 0x27, 0x70, 0x02, 0xfb, + 0x04, 0x56, 0x41, 0xf8, 0x26, 0x70, 0x6d, 0x1c, 0x95, 0x42, 0xf4, 0xdb, + 0x64, 0x1c, 0x9c, 0x42, 0xb8, 0xbf, 0x00, 0x25, 0xf8, 0xdb, 0xf0, 0xbd, + 0x2d, 0xe9, 0xf7, 0x4f, 0x0c, 0x9f, 0x0d, 0x9e, 0x00, 0x93, 0x81, 0x46, + 0x8a, 0x46, 0x00, 0x25, 0x00, 0xe0, 0x6d, 0x1c, 0x9d, 0xf8, 0x08, 0x00, + 0x85, 0x42, 0x20, 0xda, 0x00, 0x24, 0x15, 0xe0, 0x00, 0xfb, 0x05, 0xb0, + 0x59, 0xf8, 0x20, 0x10, 0x07, 0xfb, 0x0b, 0x40, 0x5a, 0xf8, 0x20, 0x00, + 0x3f, 0xf0, 0x56, 0xfd, 0x56, 0xf8, 0x28, 0x10, 0x3f, 0xf0, 0x49, 0xfd, + 0x46, 0xf8, 0x28, 0x00, 0x0b, 0xf1, 0x01, 0x0b, 0x00, 0x98, 0x83, 0x45, + 0xea, 0xdb, 0x64, 0x1c, 0xbc, 0x42, 0xe0, 0xda, 0x07, 0xfb, 0x05, 0x48, + 0x00, 0x20, 0x46, 0xf8, 0x28, 0x00, 0x83, 0x46, 0xf2, 0xe7, 0xbd, 0xe8, + 0xf7, 0x8f, 0x2d, 0xe9, 0xf7, 0x4f, 0x83, 0x46, 0x0c, 0x98, 0x0d, 0x9e, + 0x00, 0x90, 0x8a, 0x46, 0x00, 0x25, 0x99, 0x46, 0x00, 0xe0, 0x6d, 0x1c, + 0x9d, 0xf8, 0x08, 0x00, 0x85, 0x42, 0x20, 0xda, 0x00, 0x24, 0x13, 0xe0, + 0x09, 0xfb, 0x05, 0x70, 0x5b, 0xf8, 0x20, 0x10, 0x09, 0xfb, 0x04, 0x70, + 0x5a, 0xf8, 0x20, 0x00, 0x3f, 0xf0, 0x24, 0xfd, 0x56, 0xf8, 0x28, 0x10, + 0x3f, 0xf0, 0x17, 0xfd, 0x46, 0xf8, 0x28, 0x00, 0x7f, 0x1c, 0x4f, 0x45, + 0xec, 0xdb, 0x64, 0x1c, 0x00, 0x98, 0x84, 0x42, 0xe1, 0xda, 0x80, 0x46, + 0x08, 0xfb, 0x05, 0x48, 0x00, 0x20, 0x46, 0xf8, 0x28, 0x00, 0x00, 0x27, + 0xf1, 0xe7, 0xbd, 0xe8, 0xf7, 0x8f, 0xf8, 0xb5, 0x03, 0x46, 0x0c, 0x46, + 0x16, 0x46, 0x14, 0xfb, 0x06, 0x60, 0x53, 0xf8, 0x20, 0x00, 0x20, 0xf0, + 0x00, 0x40, 0x57, 0x1c, 0x0c, 0xe0, 0x14, 0xfb, 0x01, 0x61, 0x53, 0xf8, + 0x21, 0x50, 0x25, 0xf0, 0x00, 0x41, 0x3f, 0xf0, 0x9d, 0xf8, 0x3c, 0xbf, + 0x25, 0xf0, 0x00, 0x40, 0x3a, 0x46, 0x7f, 0x1c, 0xf9, 0xb2, 0xa1, 0x42, + 0xef, 0xd3, 0xd0, 0xb2, 0xf2, 0xbd, 0xf0, 0xb5, 0x8b, 0xb0, 0x00, 0x24, + 0x10, 0xe0, 0x16, 0x46, 0x11, 0xfb, 0x06, 0x46, 0x50, 0xf8, 0x26, 0x70, + 0x4d, 0xf8, 0x24, 0x70, 0x9c, 0x46, 0x11, 0xfb, 0x0c, 0x4c, 0x50, 0xf8, + 0x2c, 0x50, 0x40, 0xf8, 0x26, 0x50, 0x40, 0xf8, 0x2c, 0x70, 0x64, 0x1c, + 0x8c, 0x42, 0xec, 0xdb, 0x0b, 0xb0, 0xf0, 0xbd, 0x2d, 0xe9, 0xf3, 0x4f, + 0x91, 0x46, 0x98, 0x46, 0x8d, 0xb0, 0x00, 0x23, 0x8a, 0x46, 0x4f, 0xf0, + 0x7e, 0x52, 0x01, 0xe0, 0x18, 0x91, 0x5b, 0x1c, 0x53, 0x45, 0x16, 0xda, + 0x18, 0x99, 0x00, 0x26, 0x56, 0x45, 0xf7, 0xda, 0x0a, 0xfb, 0x03, 0x64, + 0x50, 0xf8, 0x24, 0x50, 0x48, 0xf8, 0x24, 0x50, 0xb3, 0x42, 0x19, 0xbf, + 0x4f, 0xf0, 0x00, 0x0c, 0xe6, 0x46, 0x94, 0x46, 0x96, 0x46, 0x49, 0xf8, + 0x24, 0xc0, 0x41, 0xf8, 0x24, 0xe0, 0x76, 0x1c, 0xea, 0xe7, 0x00, 0x26, + 0x00, 0xe0, 0x76, 0x1c, 0x56, 0x45, 0x5a, 0xda, 0x9d, 0xf8, 0x38, 0x10, + 0xf2, 0xb2, 0x40, 0x46, 0xff, 0xf7, 0x99, 0xff, 0x04, 0x46, 0xb4, 0x42, + 0x25, 0xd0, 0x9d, 0xf8, 0x38, 0x10, 0xf3, 0xb2, 0x22, 0x46, 0x40, 0x46, + 0xff, 0xf7, 0xad, 0xff, 0x9d, 0xf8, 0x38, 0x10, 0x18, 0x98, 0xf3, 0xb2, + 0x22, 0x46, 0xff, 0xf7, 0xa6, 0xff, 0xb6, 0xb1, 0x0a, 0xfb, 0x06, 0xf1, + 0x00, 0x91, 0x00, 0x20, 0x02, 0xa9, 0x0e, 0xe0, 0x00, 0x9a, 0x82, 0x18, + 0x59, 0xf8, 0x22, 0x30, 0x41, 0xf8, 0x20, 0x30, 0x1a, 0xfb, 0x04, 0x0c, + 0x59, 0xf8, 0x2c, 0x50, 0x49, 0xf8, 0x22, 0x50, 0x49, 0xf8, 0x2c, 0x30, + 0x40, 0x1c, 0xb0, 0x42, 0xee, 0xdb, 0x74, 0x1c, 0x15, 0xe0, 0x00, 0x98, + 0x59, 0xf8, 0x25, 0x10, 0xdd, 0xf8, 0x04, 0xb0, 0x38, 0x18, 0x58, 0xf8, + 0x20, 0x00, 0x3f, 0xf0, 0x71, 0xfc, 0xbb, 0x44, 0x01, 0x46, 0x58, 0xf8, + 0x2b, 0x00, 0x3f, 0xf0, 0x74, 0xfc, 0x48, 0xf8, 0x2b, 0x00, 0x7f, 0x1c, + 0x57, 0x45, 0xea, 0xdb, 0x64, 0x1c, 0x54, 0x45, 0xb3, 0xda, 0x0a, 0xfb, + 0x04, 0xf1, 0x01, 0x91, 0x75, 0x18, 0x0a, 0xfb, 0x06, 0xf1, 0x00, 0x91, + 0x71, 0x18, 0x58, 0xf8, 0x25, 0x00, 0x58, 0xf8, 0x21, 0x10, 0x3f, 0xf0, + 0x43, 0xfc, 0x49, 0xf8, 0x25, 0x00, 0x00, 0x27, 0xe8, 0xe7, 0x0f, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0xf0, 0xb5, 0xad, 0xf5, 0xe0, 0x6d, 0xa5, 0xb0, + 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0x17, 0x4f, 0x0d, 0xf5, 0xb6, 0x60, + 0x39, 0x46, 0x00, 0xf0, 0x2b, 0xf8, 0xf3, 0xa8, 0x07, 0xf5, 0xf2, 0x71, + 0x00, 0xf0, 0x26, 0xf8, 0x7a, 0xa8, 0x07, 0xf5, 0x72, 0x71, 0x00, 0xf0, + 0x21, 0xf8, 0x01, 0xa8, 0x07, 0xf2, 0xac, 0x51, 0x00, 0xf0, 0x1c, 0xf8, + 0x01, 0xa8, 0x00, 0x90, 0xf3, 0xab, 0x0d, 0xf5, 0xb6, 0x62, 0x29, 0x46, + 0x20, 0x46, 0xff, 0xf7, 0x53, 0xff, 0x7a, 0xab, 0x2a, 0x46, 0x01, 0xa9, + 0x0d, 0xf5, 0xb6, 0x60, 0x00, 0xf0, 0x10, 0xf8, 0x33, 0x46, 0x2a, 0x46, + 0x7a, 0xa9, 0xf3, 0xa8, 0x00, 0xf0, 0x5b, 0xf8, 0x0d, 0xf5, 0xe0, 0x6d, + 0x25, 0xb0, 0xf0, 0xbd, 0x10, 0x2b, 0x00, 0x01, 0x4f, 0xf4, 0xf2, 0x72, + 0xf6, 0xf7, 0x92, 0xbd, 0x2d, 0xe9, 0xf7, 0x4f, 0x9a, 0x46, 0x00, 0x22, + 0x00, 0x27, 0x07, 0xe0, 0x04, 0xfb, 0x03, 0x26, 0x4a, 0xf8, 0x26, 0x70, + 0x5b, 0x1c, 0xa3, 0x42, 0xf8, 0xdb, 0x52, 0x1c, 0x9d, 0xf8, 0x08, 0x30, + 0x00, 0x93, 0x1c, 0x46, 0xa2, 0x42, 0xb8, 0xbf, 0x00, 0x23, 0xf4, 0xdb, + 0x00, 0x24, 0x83, 0x46, 0x01, 0x91, 0x00, 0xe0, 0x64, 0x1c, 0x00, 0x98, + 0x84, 0x42, 0x30, 0xda, 0x00, 0x26, 0x1d, 0xe0, 0x00, 0x99, 0xe8, 0x19, + 0x01, 0xfb, 0x05, 0x41, 0x5b, 0xf8, 0x20, 0x00, 0x5a, 0xf8, 0x21, 0x10, + 0x3f, 0xf0, 0xe8, 0xfb, 0x01, 0x46, 0x48, 0x46, 0x3f, 0xf0, 0xed, 0xfb, + 0x4a, 0xf8, 0x28, 0x00, 0x6d, 0x1c, 0x5a, 0xf8, 0x28, 0x90, 0xb5, 0x42, + 0xea, 0xdb, 0xf7, 0x19, 0x5b, 0xf8, 0x27, 0x10, 0x48, 0x46, 0x3f, 0xf0, + 0xc5, 0xfb, 0x4a, 0xf8, 0x28, 0x00, 0x76, 0x1c, 0x00, 0x98, 0x86, 0x42, + 0xd8, 0xda, 0x9d, 0xf8, 0x08, 0x10, 0x01, 0x98, 0x00, 0x91, 0x01, 0xfb, + 0x06, 0xf7, 0x04, 0xeb, 0x07, 0x08, 0x50, 0xf8, 0x28, 0x10, 0x4a, 0xf8, + 0x28, 0x10, 0x00, 0x25, 0xe1, 0xe7, 0xbd, 0xe8, 0xf7, 0x8f, 0x2d, 0xe9, + 0xf4, 0x4f, 0x9b, 0x46, 0x84, 0xb0, 0x00, 0x23, 0x0b, 0xe0, 0x12, 0xfb, + 0x06, 0x36, 0x00, 0x27, 0x4b, 0xf8, 0x26, 0x70, 0x6d, 0x1c, 0xee, 0xb2, + 0x96, 0x42, 0xf6, 0xd3, 0x8d, 0xf8, 0x10, 0x20, 0x5b, 0x1c, 0x9d, 0xf8, + 0x10, 0x20, 0x93, 0x42, 0xb8, 0xbf, 0x00, 0x25, 0xf3, 0xdb, 0x4f, 0xf0, + 0x00, 0x0a, 0x02, 0x92, 0x05, 0x46, 0x03, 0x91, 0x01, 0xe0, 0x0a, 0xf1, + 0x01, 0x0a, 0x02, 0x98, 0x82, 0x45, 0x43, 0xda, 0x00, 0x21, 0x8d, 0xf8, + 0x00, 0x10, 0x24, 0xe0, 0x49, 0x46, 0xa0, 0x19, 0x01, 0xfb, 0x04, 0xa1, + 0x55, 0xf8, 0x20, 0x00, 0x5b, 0xf8, 0x21, 0x10, 0x3f, 0xf0, 0x90, 0xfb, + 0x01, 0x46, 0x01, 0x98, 0x3f, 0xf0, 0x95, 0xfb, 0x4b, 0xf8, 0x28, 0x00, + 0x64, 0x1c, 0x5b, 0xf8, 0x28, 0x10, 0x01, 0x91, 0x4c, 0x45, 0xe9, 0xdb, + 0x8d, 0xf8, 0x10, 0x90, 0xbe, 0x19, 0x01, 0x98, 0x55, 0xf8, 0x26, 0x10, + 0x3f, 0xf0, 0x6a, 0xfb, 0x4b, 0xf8, 0x28, 0x00, 0x9d, 0xf8, 0x00, 0x00, + 0x40, 0x1c, 0x8d, 0xf8, 0x00, 0x00, 0x9d, 0xf8, 0x00, 0x00, 0x9d, 0xf8, + 0x10, 0x10, 0x88, 0x42, 0xcb, 0xd2, 0x08, 0x46, 0x9d, 0xf8, 0x00, 0x70, + 0x41, 0x1e, 0xcf, 0x1b, 0xff, 0xb2, 0x06, 0x46, 0x03, 0x98, 0x16, 0xfb, + 0x07, 0xf6, 0x0a, 0xeb, 0x06, 0x08, 0x50, 0xf8, 0x28, 0x10, 0x4b, 0xf8, + 0x28, 0x10, 0x7c, 0x1c, 0x9d, 0xf8, 0x10, 0x90, 0xe4, 0xb2, 0xd0, 0xe7, + 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x2d, 0xe9, 0xf8, 0x4f, 0x98, 0xb0, + 0x05, 0x46, 0x0e, 0x46, 0x14, 0x46, 0x98, 0x46, 0x10, 0xa8, 0x20, 0x21, + 0x08, 0xf0, 0xe6, 0xfa, 0x08, 0xa8, 0x20, 0x21, 0x08, 0xf0, 0xe2, 0xfa, + 0x68, 0x46, 0x20, 0x21, 0x08, 0xf0, 0xde, 0xfa, 0x00, 0x20, 0x0d, 0xf1, + 0x20, 0x09, 0x00, 0x23, 0x0d, 0xf1, 0x40, 0x0a, 0x0a, 0xe0, 0x55, 0xf8, + 0x20, 0x10, 0x49, 0xf8, 0x20, 0x10, 0x56, 0xf8, 0x20, 0x20, 0x4d, 0xf8, + 0x20, 0x20, 0x4a, 0xf8, 0x20, 0x30, 0x40, 0x1c, 0xa0, 0x42, 0xf2, 0xdb, + 0x00, 0x26, 0x10, 0xe0, 0x59, 0xf8, 0x26, 0x00, 0x00, 0x99, 0x3f, 0xf0, + 0x17, 0xfb, 0x49, 0xf8, 0x26, 0x00, 0x6d, 0x1e, 0xad, 0x1b, 0x5d, 0xf8, + 0x25, 0x00, 0x00, 0x99, 0x3f, 0xf0, 0x0e, 0xfb, 0x4d, 0xf8, 0x25, 0x00, + 0x76, 0x1c, 0x25, 0x46, 0xae, 0x42, 0xeb, 0xdb, 0x00, 0x24, 0x1c, 0xe0, + 0x59, 0xf8, 0x27, 0x00, 0x58, 0xf8, 0x24, 0x10, 0x3f, 0xf0, 0x12, 0xfb, + 0x5a, 0xf8, 0x27, 0x10, 0x3f, 0xf0, 0x05, 0xfb, 0x83, 0x46, 0x5d, 0xf8, + 0x27, 0x00, 0x31, 0x46, 0x3f, 0xf0, 0x08, 0xfb, 0x01, 0x46, 0x58, 0x46, + 0x3f, 0xf0, 0x0d, 0xfb, 0x10, 0xa9, 0x01, 0xeb, 0x87, 0x02, 0x7f, 0x1c, + 0x42, 0xf8, 0x04, 0x0c, 0xaf, 0x42, 0xe3, 0xdb, 0x64, 0x1c, 0x9d, 0xf8, + 0x88, 0x00, 0x84, 0x42, 0x0d, 0xda, 0x08, 0x98, 0x58, 0xf8, 0x24, 0x10, + 0x3f, 0xf0, 0xf2, 0xfa, 0x10, 0x99, 0x3f, 0xf0, 0xe6, 0xfa, 0x06, 0x46, + 0x23, 0x98, 0x40, 0xf8, 0x24, 0x60, 0x01, 0x27, 0xea, 0xe7, 0x19, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x2d, 0xe9, 0xf0, 0x41, 0x07, 0x9c, 0x9a, 0x18, + 0x00, 0x26, 0x55, 0x1c, 0x00, 0xe0, 0x76, 0x1c, 0x9e, 0x42, 0x12, 0xda, + 0x00, 0x27, 0x8f, 0x42, 0xf9, 0xda, 0xbe, 0x42, 0xbd, 0xbf, 0xa7, 0xeb, + 0x06, 0x0c, 0x00, 0xeb, 0x8c, 0x0c, 0x5c, 0xf8, 0x04, 0xcc, 0x4f, 0xf0, + 0x00, 0x0c, 0x07, 0xfb, 0x05, 0x6e, 0x44, 0xf8, 0x2e, 0xc0, 0x7f, 0x1c, + 0xed, 0xe7, 0x06, 0x98, 0x1e, 0x46, 0x4f, 0xf0, 0x00, 0x08, 0x00, 0xe0, + 0x76, 0x1c, 0x57, 0x1c, 0xbe, 0x42, 0x15, 0xd2, 0x00, 0x27, 0x8f, 0x42, + 0xf8, 0xda, 0xa6, 0xeb, 0x03, 0x0e, 0x77, 0x45, 0x07, 0xfb, 0x05, 0x6c, + 0x08, 0xdb, 0x03, 0xeb, 0x07, 0x0e, 0xae, 0xeb, 0x06, 0x0e, 0x50, 0xf8, + 0x2e, 0xe0, 0x44, 0xf8, 0x2c, 0xe0, 0x01, 0xe0, 0x44, 0xf8, 0x2c, 0x80, + 0x7f, 0x1c, 0xea, 0xe7, 0xbd, 0xe8, 0xf0, 0x81, 0x2d, 0xe9, 0xf8, 0x43, + 0xad, 0xf5, 0x85, 0x6d, 0x04, 0x46, 0x0d, 0x46, 0xdd, 0xf8, 0x4c, 0x84, + 0x16, 0x46, 0x99, 0x46, 0x02, 0xa8, 0x4f, 0xf4, 0x84, 0x61, 0x08, 0xf0, + 0x33, 0xfa, 0x02, 0xaf, 0x01, 0x97, 0x4b, 0x46, 0xdd, 0xf8, 0x48, 0x04, + 0x00, 0x90, 0x32, 0x46, 0x29, 0x46, 0x20, 0x46, 0xff, 0xf7, 0xa8, 0xff, + 0x4e, 0x44, 0x76, 0x1c, 0xf3, 0xb2, 0x2a, 0x46, 0x41, 0x46, 0x02, 0xa8, + 0xff, 0xf7, 0x02, 0xfd, 0x0d, 0xf5, 0x80, 0x6d, 0x0b, 0xb0, 0xbd, 0xe8, + 0xf0, 0x83, 0x10, 0xb5, 0x4f, 0xf0, 0x7e, 0x52, 0x0a, 0x60, 0x01, 0x22, + 0x04, 0xe0, 0x00, 0x23, 0xd4, 0xb2, 0x41, 0xf8, 0x24, 0x30, 0x52, 0x1c, + 0xd3, 0xb2, 0x83, 0x42, 0xf7, 0xd3, 0x10, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, + 0x0e, 0x46, 0x80, 0x46, 0x31, 0x68, 0x91, 0x46, 0x9a, 0x46, 0x4f, 0xf0, + 0x7e, 0x50, 0x3f, 0xf0, 0x55, 0xfa, 0x83, 0x46, 0x00, 0x24, 0x19, 0xe0, + 0xe1, 0x1b, 0x56, 0xf8, 0x27, 0x00, 0x58, 0xf8, 0x21, 0x10, 0x3f, 0xf0, + 0x5d, 0xfa, 0x29, 0x46, 0x3f, 0xf0, 0x51, 0xfa, 0x7f, 0x1c, 0x05, 0x46, + 0xff, 0xb2, 0xbc, 0x42, 0xf0, 0xda, 0x5a, 0xf8, 0x24, 0x00, 0x29, 0x46, + 0x3f, 0xf0, 0x59, 0xfa, 0x59, 0x46, 0x3f, 0xf0, 0x4d, 0xfa, 0x48, 0xf8, + 0x24, 0x00, 0x64, 0x1c, 0x4c, 0x45, 0x04, 0xda, 0x00, 0x25, 0x48, 0xf8, + 0x24, 0x50, 0x01, 0x27, 0xeb, 0xe7, 0xbd, 0xe8, 0xf1, 0x8f, 0x00, 0x00, + 0x70, 0xb5, 0x04, 0x9c, 0x05, 0x9d, 0x06, 0x9e, 0x05, 0x60, 0x02, 0x62, + 0x81, 0x60, 0x02, 0xf1, 0x64, 0x05, 0xc0, 0x32, 0x02, 0x63, 0x05, 0x61, + 0x01, 0xf1, 0x68, 0x02, 0x42, 0x61, 0x01, 0xf1, 0x18, 0x05, 0xb8, 0x31, + 0x03, 0xf5, 0xfa, 0x62, 0x41, 0x63, 0xc2, 0x61, 0x03, 0xf5, 0xfc, 0x61, + 0x04, 0xf1, 0x28, 0x02, 0xc1, 0x63, 0x82, 0x62, 0x46, 0x60, 0x45, 0x62, + 0xc4, 0x60, 0x04, 0xf5, 0x94, 0x71, 0x04, 0xf5, 0xb0, 0x72, 0xc3, 0x62, + 0x81, 0x61, 0x82, 0x63, 0x70, 0xbd, 0x70, 0xb5, 0xfa, 0x25, 0x04, 0x46, + 0x00, 0xf0, 0xd0, 0xf8, 0x01, 0x20, 0xa0, 0x76, 0x20, 0x76, 0xa0, 0x77, + 0x20, 0x77, 0x01, 0x21, 0x04, 0xf1, 0x21, 0x00, 0x61, 0x76, 0xe1, 0x77, + 0x61, 0x77, 0x00, 0x22, 0x81, 0x70, 0x42, 0x70, 0x01, 0x70, 0x01, 0x23, + 0x84, 0xf8, 0x20, 0x30, 0x17, 0x22, 0x82, 0x71, 0x00, 0x21, 0x41, 0x71, + 0x02, 0x22, 0x02, 0x71, 0xc3, 0x70, 0x03, 0x22, 0x04, 0xf1, 0x28, 0x01, + 0x4f, 0xf0, 0xff, 0x30, 0x8d, 0x74, 0xcb, 0x72, 0x04, 0x25, 0x0d, 0x74, + 0xcd, 0x75, 0x14, 0x23, 0xfa, 0x25, 0x8b, 0x72, 0x8d, 0x75, 0x01, 0x23, + 0x01, 0x25, 0x4a, 0x72, 0x0b, 0x72, 0x0d, 0x75, 0xcd, 0x76, 0x4f, 0xf0, + 0x7c, 0x52, 0x3f, 0x23, 0x03, 0x25, 0xca, 0x60, 0xcb, 0x74, 0x8d, 0x76, + 0x4d, 0x76, 0xca, 0x61, 0x0a, 0x23, 0x3f, 0x25, 0x53, 0x4a, 0x08, 0x60, + 0x48, 0x60, 0x4b, 0x74, 0x4b, 0x75, 0x0d, 0x76, 0x0a, 0x62, 0x04, 0xf1, + 0x4c, 0x01, 0xf0, 0x23, 0xcb, 0x70, 0xf5, 0x22, 0x0a, 0x23, 0x8a, 0x70, + 0x4b, 0x70, 0x04, 0x22, 0x06, 0x23, 0x0a, 0x70, 0x4b, 0x71, 0x19, 0x22, + 0x03, 0x23, 0x0a, 0x71, 0x0b, 0x72, 0x00, 0x22, 0x3f, 0x23, 0xca, 0x60, + 0xcb, 0x74, 0x7f, 0x22, 0x0f, 0x23, 0x8a, 0x74, 0x4b, 0x74, 0x0e, 0x25, + 0x3f, 0x22, 0x7f, 0x23, 0x8d, 0x71, 0x0a, 0x74, 0x8b, 0x75, 0x0b, 0x75, + 0x0b, 0x76, 0xff, 0x22, 0x3f, 0x25, 0x01, 0x23, 0xca, 0x75, 0x4d, 0x75, + 0x4b, 0x76, 0x8b, 0x77, 0x4b, 0x77, 0x0b, 0x77, 0x04, 0xf1, 0x6c, 0x01, + 0xcb, 0x70, 0x8b, 0x70, 0x4b, 0x70, 0x0b, 0x70, 0x0b, 0x71, 0x08, 0x25, + 0x00, 0x23, 0x4b, 0x72, 0x0b, 0x72, 0x8d, 0x72, 0x03, 0x23, 0xcb, 0x73, + 0x8d, 0x73, 0x02, 0x23, 0x4b, 0x73, 0x01, 0x26, 0x00, 0x23, 0xcb, 0x74, + 0x8b, 0x74, 0x03, 0x25, 0x0f, 0x23, 0x4e, 0x71, 0x0d, 0x73, 0x4b, 0x74, + 0x0a, 0x74, 0x41, 0xf2, 0x88, 0x33, 0xcb, 0x61, 0x6f, 0xf0, 0x01, 0x02, + 0x00, 0x23, 0x4b, 0x62, 0x4a, 0x61, 0x2b, 0x4d, 0x2b, 0x4b, 0x8a, 0x61, + 0x0d, 0x62, 0x8b, 0x62, 0xcb, 0x62, 0x0b, 0x63, 0x4b, 0x63, 0x04, 0xf1, + 0xa4, 0x01, 0x17, 0x23, 0x0f, 0x25, 0xcb, 0x70, 0x8d, 0x70, 0x4a, 0x60, + 0x8a, 0x60, 0x07, 0x23, 0x00, 0x25, 0x24, 0x4a, 0x4b, 0x70, 0x0d, 0x70, + 0xca, 0x60, 0x0d, 0x61, 0x6f, 0xf0, 0x40, 0x42, 0x8e, 0x75, 0x4e, 0x75, + 0x0e, 0x75, 0x8d, 0x76, 0x4d, 0x76, 0x0d, 0x76, 0x8e, 0x77, 0x4d, 0x77, + 0x0d, 0x77, 0x04, 0xf1, 0xc4, 0x01, 0x08, 0x61, 0x48, 0x61, 0x8a, 0x60, + 0x00, 0x20, 0x08, 0x76, 0x03, 0x22, 0x03, 0x20, 0x0a, 0x73, 0x48, 0x77, + 0x06, 0x23, 0x05, 0x22, 0x4f, 0xf0, 0x7e, 0x50, 0x8b, 0x70, 0x4d, 0x70, + 0x8a, 0x77, 0x08, 0x62, 0x48, 0x62, 0x18, 0x23, 0x6f, 0xf0, 0x78, 0x45, + 0x06, 0x22, 0x04, 0xf1, 0xec, 0x00, 0x0b, 0x70, 0x4d, 0x60, 0xce, 0x73, + 0x0a, 0x77, 0x06, 0x70, 0x46, 0x70, 0x00, 0x23, 0x43, 0x60, 0x70, 0xbd, + 0x00, 0x21, 0x41, 0x70, 0x10, 0x22, 0x0a, 0x49, 0x0a, 0x4b, 0x02, 0x70, + 0x81, 0x60, 0x43, 0x60, 0x4f, 0xf0, 0x7e, 0x51, 0xc1, 0x60, 0x01, 0x61, + 0x07, 0x49, 0x41, 0x61, 0x70, 0x47, 0x00, 0x00, 0xa4, 0x70, 0x7d, 0x3f, + 0x00, 0x00, 0xa0, 0x41, 0x50, 0x57, 0xd5, 0xbc, 0x1f, 0x85, 0x6b, 0x3f, + 0x52, 0xb8, 0x96, 0x40, 0x00, 0xc8, 0x2f, 0x4f, 0x00, 0x00, 0x0c, 0x42, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x70, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x01, 0x22, 0x40, 0x1e, 0x82, 0x40, 0x50, 0x1e, + 0x40, 0xb2, 0xc1, 0x42, 0xbc, 0xbf, 0x01, 0x46, 0x49, 0x42, 0x4a, 0xb2, + 0x90, 0x42, 0xb8, 0xbf, 0x01, 0x46, 0x48, 0xb2, 0x70, 0x47, 0xdf, 0xf8, + 0x84, 0x1a, 0x08, 0x56, 0x70, 0x47, 0xdf, 0xf8, 0x7c, 0x2a, 0x11, 0x54, + 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, 0x3a, 0xf8, 0x00, 0xf0, 0x62, 0xf9, + 0xbd, 0xe8, 0x10, 0x40, 0x7f, 0x22, 0x00, 0x21, 0xca, 0x30, 0xcf, 0xe7, + 0x10, 0xb5, 0x00, 0xf0, 0x2f, 0xf8, 0x00, 0xf0, 0x57, 0xf9, 0xbd, 0xe8, + 0x10, 0x40, 0x7f, 0x22, 0x00, 0x21, 0xcd, 0x30, 0xc4, 0xe7, 0xdf, 0xf8, + 0x4c, 0x1a, 0x51, 0xf8, 0x20, 0x00, 0xca, 0x30, 0x00, 0x78, 0x00, 0xf0, + 0x7f, 0x00, 0x42, 0x06, 0x48, 0xbf, 0x60, 0xf0, 0x7f, 0x00, 0x40, 0xb2, + 0x70, 0x47, 0xdf, 0xf8, 0x30, 0x1a, 0x51, 0xf8, 0x20, 0x00, 0xcd, 0x30, + 0x00, 0x78, 0x00, 0xf0, 0x7f, 0x00, 0x42, 0x06, 0x48, 0xbf, 0x60, 0xf0, + 0x7f, 0x00, 0x40, 0xb2, 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, 0x08, 0xf8, + 0x00, 0xf0, 0x30, 0xf9, 0xbd, 0xe8, 0x10, 0x40, 0x7f, 0x22, 0x00, 0x21, + 0xcc, 0x30, 0x9d, 0xe7, 0x04, 0x46, 0x07, 0x20, 0xa8, 0xe7, 0x10, 0xb5, + 0xff, 0xf7, 0xfa, 0xff, 0x00, 0xf0, 0x22, 0xf9, 0xbd, 0xe8, 0x10, 0x40, + 0x7f, 0x22, 0x00, 0x21, 0xcf, 0x30, 0x8f, 0xe7, 0xdf, 0xf8, 0xe0, 0x19, + 0x51, 0xf8, 0x20, 0x00, 0xcc, 0x30, 0x00, 0x78, 0x00, 0xf0, 0x7f, 0x00, + 0x42, 0x06, 0x48, 0xbf, 0x60, 0xf0, 0x7f, 0x00, 0x40, 0xb2, 0x70, 0x47, + 0xdf, 0xf8, 0xc4, 0x19, 0x51, 0xf8, 0x20, 0x00, 0xcf, 0x30, 0x00, 0x78, + 0x00, 0xf0, 0x7f, 0x00, 0x42, 0x06, 0x48, 0xbf, 0x60, 0xf0, 0x7f, 0x00, + 0x40, 0xb2, 0x70, 0x47, 0x10, 0xb5, 0xff, 0xf7, 0xd3, 0xff, 0x00, 0xf0, + 0xfb, 0xf8, 0xbd, 0xe8, 0x10, 0x40, 0x7f, 0x22, 0x00, 0x21, 0xcb, 0x30, + 0x68, 0xe7, 0x10, 0xb5, 0xff, 0xf7, 0xc8, 0xff, 0x00, 0xf0, 0xf0, 0xf8, + 0xbd, 0xe8, 0x10, 0x40, 0x7f, 0x22, 0x00, 0x21, 0xce, 0x30, 0x5d, 0xe7, + 0xdf, 0xf8, 0x7c, 0x19, 0x51, 0xf8, 0x20, 0x00, 0xcb, 0x30, 0x00, 0x78, + 0x00, 0xf0, 0x7f, 0x00, 0x42, 0x06, 0x48, 0xbf, 0x60, 0xf0, 0x7f, 0x00, + 0x40, 0xb2, 0x70, 0x47, 0xdf, 0xf8, 0x60, 0x19, 0x51, 0xf8, 0x20, 0x00, + 0xce, 0x30, 0x00, 0x78, 0x00, 0xf0, 0x7f, 0x00, 0x42, 0x06, 0x48, 0xbf, + 0x60, 0xf0, 0x7f, 0x00, 0x40, 0xb2, 0x70, 0x47, 0xdf, 0xf8, 0x44, 0x19, + 0x51, 0xf8, 0x20, 0x00, 0xc3, 0x30, 0x00, 0x78, 0x00, 0xf0, 0x3f, 0x00, + 0x82, 0x06, 0x48, 0xbf, 0x60, 0xf0, 0x3f, 0x00, 0x40, 0xb2, 0x70, 0x47, + 0xdf, 0xf8, 0x28, 0x19, 0x51, 0xf8, 0x20, 0x00, 0xc5, 0x30, 0x00, 0x78, + 0x00, 0xf0, 0x3f, 0x00, 0x82, 0x06, 0x48, 0xbf, 0x60, 0xf0, 0x3f, 0x00, + 0x40, 0xb2, 0x70, 0x47, 0xdf, 0xf8, 0x0c, 0x19, 0x51, 0xf8, 0x20, 0x00, + 0xc4, 0x30, 0x00, 0x78, 0x00, 0xf0, 0x3f, 0x00, 0x82, 0x06, 0x48, 0xbf, + 0x60, 0xf0, 0x3f, 0x00, 0x40, 0xb2, 0x70, 0x47, 0xdf, 0xf8, 0xf0, 0x18, + 0x51, 0xf8, 0x20, 0x00, 0xc6, 0x30, 0x00, 0x78, 0x00, 0xf0, 0x3f, 0x00, + 0x82, 0x06, 0x48, 0xbf, 0x60, 0xf0, 0x3f, 0x00, 0x40, 0xb2, 0x70, 0x47, + 0x70, 0xb5, 0x00, 0xf0, 0x30, 0xf8, 0x00, 0xf0, 0x0e, 0xf8, 0x00, 0xf0, + 0x23, 0xf8, 0x04, 0xf1, 0xc5, 0x00, 0xff, 0xf7, 0xff, 0xfe, 0xeb, 0xb2, + 0x04, 0xf1, 0xc6, 0x00, 0xbd, 0xe8, 0x70, 0x40, 0x3f, 0x22, 0x00, 0xf0, + 0xb1, 0xbf, 0x06, 0x46, 0x29, 0x46, 0x06, 0x20, 0x00, 0xe7, 0x70, 0xb5, + 0x00, 0xf0, 0x19, 0xf8, 0xff, 0xf7, 0xf7, 0xff, 0x00, 0xf0, 0x0c, 0xf8, + 0x04, 0xf1, 0xc3, 0x00, 0xff, 0xf7, 0xe8, 0xfe, 0xeb, 0xb2, 0x04, 0xf1, + 0xc4, 0x00, 0xbd, 0xe8, 0x70, 0x40, 0x3f, 0x22, 0x00, 0xf0, 0x9a, 0xbf, + 0x05, 0x46, 0xdf, 0xf8, 0x80, 0x08, 0x50, 0xf8, 0x24, 0x40, 0xf3, 0xb2, + 0x3f, 0x22, 0x00, 0x21, 0x70, 0x47, 0x04, 0x46, 0x15, 0x46, 0x06, 0x20, + 0xe0, 0xe6, 0xdf, 0xf8, 0x68, 0x18, 0x51, 0xf8, 0x20, 0x00, 0xef, 0x30, + 0x00, 0x78, 0x00, 0xf0, 0x1f, 0x00, 0xc2, 0x06, 0x48, 0xbf, 0x60, 0xf0, + 0x1f, 0x00, 0x40, 0xb2, 0x70, 0x47, 0xdf, 0xf8, 0x4c, 0x18, 0x51, 0xf8, + 0x20, 0x00, 0xf2, 0x30, 0x00, 0x78, 0x00, 0xf0, 0x1f, 0x00, 0xc2, 0x06, + 0x48, 0xbf, 0x60, 0xf0, 0x1f, 0x00, 0x40, 0xb2, 0x70, 0x47, 0xdf, 0xf8, + 0x30, 0x18, 0x51, 0xf8, 0x20, 0x00, 0xf0, 0x30, 0x00, 0x78, 0x00, 0xf0, + 0x1f, 0x00, 0xc2, 0x06, 0x48, 0xbf, 0x60, 0xf0, 0x1f, 0x00, 0x40, 0xb2, + 0x70, 0x47, 0xdf, 0xf8, 0x14, 0x18, 0x51, 0xf8, 0x20, 0x00, 0xf3, 0x30, + 0x00, 0x78, 0x00, 0xf0, 0x1f, 0x00, 0xc2, 0x06, 0x48, 0xbf, 0x60, 0xf0, + 0x1f, 0x00, 0x40, 0xb2, 0x70, 0x47, 0xdf, 0xf8, 0xf8, 0x17, 0x51, 0xf8, + 0x20, 0x00, 0xf1, 0x30, 0x00, 0x78, 0x00, 0xf0, 0x1f, 0x00, 0xc2, 0x06, + 0x48, 0xbf, 0x60, 0xf0, 0x1f, 0x00, 0x40, 0xb2, 0x70, 0x47, 0xdf, 0xf8, + 0xdc, 0x17, 0x51, 0xf8, 0x20, 0x00, 0xf4, 0x30, 0x00, 0x78, 0x00, 0xf0, + 0x1f, 0x00, 0xc2, 0x06, 0x48, 0xbf, 0x60, 0xf0, 0x1f, 0x00, 0x40, 0xb2, + 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, 0x2f, 0xf8, 0x00, 0xf0, 0x06, 0xf8, + 0xbd, 0xe8, 0x10, 0x40, 0x1f, 0x22, 0x00, 0x21, 0x01, 0xf0, 0xa6, 0xb8, + 0xc3, 0xb2, 0xdf, 0xf8, 0xa8, 0x07, 0x50, 0xf8, 0x24, 0x00, 0x70, 0x47, + 0x10, 0xb5, 0x00, 0xf0, 0x1e, 0xf8, 0xff, 0xf7, 0xf5, 0xff, 0xbd, 0xe8, + 0x10, 0x40, 0x1f, 0x22, 0x00, 0x21, 0xf3, 0x30, 0x62, 0xe6, 0x10, 0xb5, + 0x00, 0xf0, 0x13, 0xf8, 0xff, 0xf7, 0xea, 0xff, 0xbd, 0xe8, 0x10, 0x40, + 0x1f, 0x22, 0x00, 0x21, 0xf4, 0x30, 0x57, 0xe6, 0x10, 0xb5, 0x00, 0xf0, + 0x08, 0xf8, 0xff, 0xf7, 0xdf, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x1f, 0x22, + 0x00, 0x21, 0x01, 0xf0, 0x74, 0xb8, 0x04, 0x46, 0x05, 0x20, 0x57, 0xe6, + 0x10, 0xb5, 0xff, 0xf7, 0xfa, 0xff, 0xff, 0xf7, 0xd1, 0xff, 0xbd, 0xe8, + 0x10, 0x40, 0x1f, 0x22, 0x00, 0x21, 0xf0, 0x30, 0x3e, 0xe6, 0x10, 0xb5, + 0xff, 0xf7, 0xef, 0xff, 0xff, 0xf7, 0xc6, 0xff, 0xbd, 0xe8, 0x10, 0x40, + 0x1f, 0x22, 0x00, 0x21, 0xf1, 0x30, 0x33, 0xe6, 0x70, 0xb5, 0x04, 0x46, + 0x15, 0x46, 0x1e, 0x46, 0xff, 0xf7, 0xaf, 0xff, 0x29, 0x46, 0x20, 0x46, + 0xff, 0xf7, 0xbc, 0xff, 0x31, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0x70, 0x40, + 0xc1, 0xe7, 0x70, 0xb5, 0x04, 0x46, 0x15, 0x46, 0x1e, 0x46, 0xff, 0xf7, + 0xc7, 0xff, 0x29, 0x46, 0x20, 0x46, 0xff, 0xf7, 0xd1, 0xff, 0x31, 0x46, + 0x20, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0xd6, 0xe7, 0x38, 0xb5, 0x00, 0xf0, + 0x0e, 0xf8, 0xfa, 0x35, 0x23, 0x09, 0xf0, 0x22, 0x04, 0x21, 0x00, 0xf0, + 0xe8, 0xfe, 0x23, 0x46, 0x28, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, + 0x0f, 0x22, 0x00, 0xf0, 0xbf, 0xbe, 0x0c, 0x46, 0xdf, 0xf8, 0xc8, 0x16, + 0x51, 0xf8, 0x20, 0x50, 0x70, 0x47, 0xdf, 0xf8, 0xc0, 0x16, 0x51, 0xf8, + 0x20, 0x10, 0x11, 0xf8, 0xfa, 0x0f, 0x09, 0x78, 0x00, 0xf0, 0xf0, 0x00, + 0x01, 0xf0, 0x0f, 0x01, 0x08, 0x43, 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, + 0xdc, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x14, 0xe0, 0x10, 0xb5, + 0xc9, 0x00, 0x92, 0x00, 0x02, 0x9c, 0x01, 0xf0, 0x08, 0x01, 0x02, 0xf0, + 0x04, 0x02, 0x5b, 0x00, 0x11, 0x43, 0x03, 0xf0, 0x02, 0x03, 0x19, 0x43, + 0x04, 0xf0, 0x01, 0x04, 0x44, 0xea, 0x01, 0x03, 0x00, 0xf0, 0xc5, 0xff, + 0xbd, 0xe8, 0x10, 0x40, 0xf0, 0x22, 0x04, 0x21, 0xfa, 0x30, 0xd1, 0xe5, + 0x13, 0x46, 0xdf, 0xf8, 0x64, 0x26, 0x52, 0xf8, 0x20, 0x00, 0x11, 0xb1, + 0x01, 0x29, 0x03, 0xd0, 0x70, 0x47, 0x01, 0x22, 0xdd, 0x30, 0x02, 0xe0, + 0x01, 0x22, 0x00, 0x21, 0xed, 0x30, 0xc1, 0xe5, 0xdf, 0xf8, 0x44, 0x36, + 0x02, 0x46, 0x53, 0xf8, 0x22, 0x20, 0x00, 0x20, 0x11, 0xb1, 0x01, 0x29, + 0x02, 0xd0, 0x70, 0x47, 0xdd, 0x32, 0x00, 0xe0, 0xed, 0x32, 0x10, 0x78, + 0x00, 0xf0, 0xc8, 0xbe, 0x18, 0xb5, 0xdf, 0xf8, 0x24, 0x16, 0x51, 0xf8, + 0x20, 0x00, 0x00, 0xf1, 0x73, 0x02, 0x11, 0x78, 0x8d, 0xf8, 0x00, 0x10, + 0x0d, 0xf1, 0x02, 0x02, 0x00, 0xf1, 0x74, 0x01, 0x09, 0x78, 0x8d, 0xf8, + 0x01, 0x10, 0x00, 0xf1, 0x75, 0x01, 0x76, 0x30, 0x09, 0x78, 0x8d, 0xf8, + 0x02, 0x10, 0x00, 0x21, 0x00, 0x78, 0x8d, 0xf8, 0x03, 0x00, 0x4b, 0x42, + 0x49, 0x1c, 0xd4, 0x5c, 0x03, 0x29, 0x44, 0xea, 0x00, 0x20, 0xf8, 0xd3, + 0x12, 0xbd, 0x38, 0xb5, 0xff, 0xf7, 0x88, 0xff, 0x05, 0xf1, 0x70, 0x04, + 0x00, 0xf0, 0x1f, 0xf8, 0x00, 0xf0, 0x95, 0xfe, 0x00, 0xf0, 0x8c, 0xfb, + 0x00, 0xf0, 0x94, 0xfe, 0x05, 0xf1, 0x73, 0x00, 0x05, 0xf1, 0x74, 0x02, + 0x01, 0x78, 0x13, 0x78, 0x05, 0xf1, 0x75, 0x00, 0x01, 0x23, 0x01, 0x78, + 0x15, 0xf8, 0x76, 0x2f, 0x00, 0xf0, 0x84, 0xfe, 0x01, 0x23, 0x00, 0xf0, + 0x09, 0xf8, 0x20, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x00, 0x23, + 0x10, 0x22, 0x04, 0x21, 0x68, 0xe5, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, + 0x20, 0x46, 0x63, 0xe5, 0x38, 0xb5, 0xff, 0xf7, 0x5c, 0xff, 0x70, 0x35, + 0x01, 0xf0, 0xae, 0xff, 0x00, 0xf0, 0x34, 0xfe, 0x23, 0x46, 0x28, 0x46, + 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x0c, 0x22, 0x02, 0x21, 0x53, 0xe5, + 0x10, 0xb5, 0x00, 0xf0, 0x3e, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x23, + 0x20, 0x22, 0x05, 0x21, 0x70, 0x30, 0x49, 0xe5, 0x10, 0xb5, 0x00, 0xf0, + 0x34, 0xff, 0x11, 0xb1, 0x01, 0x29, 0x04, 0xd0, 0x10, 0xbd, 0xc1, 0x30, + 0x1a, 0xb9, 0x0f, 0x22, 0x09, 0xe0, 0xc2, 0x30, 0x12, 0xb1, 0x01, 0x2a, + 0x03, 0xd0, 0x10, 0xbd, 0x0f, 0x22, 0x00, 0x21, 0x01, 0xe0, 0xf0, 0x22, + 0x04, 0x21, 0xbd, 0xe8, 0x10, 0x40, 0x31, 0xe5, 0x38, 0xb5, 0x01, 0x29, + 0x04, 0x46, 0x15, 0x46, 0x06, 0xd1, 0xff, 0xf7, 0xdb, 0xfd, 0x28, 0x70, + 0x20, 0x46, 0xff, 0xf7, 0xa5, 0xfd, 0x05, 0xe0, 0xff, 0xf7, 0xc6, 0xfd, + 0x28, 0x70, 0x20, 0x46, 0xff, 0xf7, 0x90, 0xfd, 0x68, 0x70, 0x20, 0x46, + 0xff, 0xf7, 0x1d, 0xff, 0xa8, 0x70, 0x31, 0xbd, 0x38, 0xb5, 0x15, 0x46, + 0x04, 0x46, 0x95, 0xf9, 0x00, 0x00, 0x01, 0x29, 0x01, 0x46, 0x20, 0x46, + 0x07, 0xd1, 0xff, 0xf7, 0xa6, 0xfd, 0x95, 0xf9, 0x01, 0x10, 0x20, 0x46, + 0xff, 0xf7, 0x6f, 0xfd, 0x06, 0xe0, 0xff, 0xf7, 0x93, 0xfd, 0x95, 0xf9, + 0x01, 0x10, 0x20, 0x46, 0xff, 0xf7, 0x59, 0xfd, 0xa9, 0x78, 0x20, 0x46, + 0xbd, 0xe8, 0x34, 0x40, 0xe6, 0xe6, 0xdf, 0xf8, 0xbc, 0x24, 0x52, 0xf8, + 0x20, 0x00, 0x04, 0x21, 0x00, 0xf8, 0x80, 0x1f, 0x70, 0x47, 0x00, 0x00, + 0x38, 0xb5, 0x00, 0xf0, 0x5b, 0xf8, 0x00, 0xf0, 0x53, 0xf8, 0x14, 0xd8, + 0xdf, 0xe8, 0x05, 0xf0, 0x02, 0x06, 0x0a, 0x0e, 0x01, 0xf1, 0x90, 0x02, + 0x91, 0x31, 0x0a, 0xe0, 0x01, 0xf1, 0x92, 0x02, 0x93, 0x31, 0x06, 0xe0, + 0x01, 0xf1, 0x94, 0x02, 0x95, 0x31, 0x02, 0xe0, 0x01, 0xf1, 0x96, 0x02, + 0x97, 0x31, 0x00, 0xf0, 0x36, 0xf8, 0x2c, 0xe0, 0x38, 0xb5, 0x0d, 0x46, + 0x04, 0x46, 0x00, 0x21, 0xff, 0xf7, 0xde, 0xff, 0x00, 0xf0, 0x84, 0xf8, + 0x68, 0x80, 0x02, 0x21, 0x00, 0xf0, 0x82, 0xf8, 0xa8, 0x80, 0x03, 0x21, + 0x00, 0xf0, 0x7e, 0xf8, 0xe8, 0x80, 0x31, 0xbd, 0x38, 0xb5, 0x00, 0xf0, + 0x2d, 0xf8, 0x00, 0xf0, 0x25, 0xf8, 0x14, 0xd8, 0xdf, 0xe8, 0x05, 0xf0, + 0x02, 0x06, 0x0a, 0x0e, 0x01, 0xf1, 0x98, 0x02, 0x99, 0x31, 0x0a, 0xe0, + 0x01, 0xf1, 0x9a, 0x02, 0x9b, 0x31, 0x06, 0xe0, 0x01, 0xf1, 0x9c, 0x02, + 0x9d, 0x31, 0x02, 0xe0, 0x01, 0xf1, 0x9e, 0x02, 0x9f, 0x31, 0x00, 0xf0, + 0x08, 0xf8, 0x9d, 0xf8, 0x01, 0x00, 0x9d, 0xf8, 0x00, 0x10, 0x01, 0xeb, + 0x00, 0x20, 0x80, 0xb2, 0x32, 0xbd, 0x12, 0x78, 0x8d, 0xf8, 0x00, 0x20, + 0x09, 0x78, 0x8d, 0xf8, 0x01, 0x10, 0x70, 0x47, 0xdf, 0xf8, 0xf8, 0x13, + 0x51, 0xf8, 0x24, 0x10, 0x03, 0x2d, 0x70, 0x47, 0x04, 0x46, 0x0d, 0x46, + 0x02, 0x22, 0x00, 0x21, 0x68, 0x46, 0xf5, 0xf7, 0x55, 0xba, 0x7c, 0xb5, + 0x04, 0x46, 0x0d, 0x46, 0x12, 0xb1, 0x01, 0x2a, 0x0d, 0xd0, 0x73, 0xbd, + 0x00, 0x21, 0xff, 0xf7, 0x91, 0xff, 0x00, 0xf0, 0x37, 0xf8, 0xa8, 0x80, + 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, 0xb8, 0xff, 0x68, 0x80, 0x01, 0x21, + 0x29, 0xe0, 0x02, 0x22, 0x00, 0x21, 0x68, 0x46, 0xf5, 0xf7, 0x3c, 0xfa, + 0x01, 0xf0, 0x43, 0xfd, 0x06, 0xf1, 0x94, 0x02, 0x10, 0x78, 0x8d, 0xf8, + 0x00, 0x00, 0x02, 0x22, 0x06, 0xf1, 0x95, 0x00, 0x00, 0xf0, 0xc9, 0xf8, + 0x28, 0x80, 0x00, 0x21, 0x68, 0x46, 0xf5, 0xf7, 0x2b, 0xfa, 0x06, 0xf1, + 0x96, 0x00, 0x00, 0x78, 0x8d, 0xf8, 0x00, 0x00, 0x16, 0xf8, 0x97, 0x0f, + 0x9d, 0xf8, 0x00, 0x10, 0x8d, 0xf8, 0x01, 0x00, 0x01, 0xeb, 0x00, 0x20, + 0xa8, 0x80, 0x02, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x8d, 0xff, 0x68, 0x80, + 0x03, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x88, 0xff, 0xe8, 0x80, 0x73, 0xbd, + 0x28, 0x80, 0x01, 0x21, 0x20, 0x46, 0x53, 0xe7, 0x10, 0xb5, 0x00, 0xf0, + 0xfc, 0xfe, 0x04, 0xf1, 0x89, 0x00, 0x8a, 0x34, 0x03, 0x2a, 0x10, 0xd8, + 0xdf, 0xe8, 0x02, 0xf0, 0x02, 0x05, 0x08, 0x0b, 0x0f, 0x22, 0x00, 0x21, + 0x08, 0xe0, 0xf0, 0x22, 0x04, 0x21, 0x05, 0xe0, 0x0f, 0x22, 0x00, 0x21, + 0x01, 0xe0, 0xf0, 0x22, 0x04, 0x21, 0x20, 0x46, 0xf9, 0xe6, 0x10, 0xbd, + 0x38, 0xb5, 0x15, 0x46, 0x04, 0x46, 0x00, 0x22, 0xff, 0xf7, 0xe0, 0xff, + 0x29, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0x38, 0x40, 0x01, 0x22, 0xd9, 0xe7, + 0x38, 0xb5, 0x15, 0x46, 0x04, 0x46, 0x02, 0x22, 0xff, 0xf7, 0xd4, 0xff, + 0x29, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0x38, 0x40, 0x03, 0x22, 0xcd, 0xe7, + 0x0b, 0x46, 0xbb, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x03, 0x2a, 0x14, 0xd8, + 0xdf, 0xe8, 0x02, 0xf0, 0x02, 0x06, 0x0a, 0x0e, 0xff, 0x22, 0x00, 0x21, + 0x85, 0x30, 0x0a, 0xe0, 0xff, 0x22, 0x00, 0x21, 0x86, 0x30, 0x06, 0xe0, + 0xff, 0x22, 0x00, 0x21, 0x87, 0x30, 0x02, 0xe0, 0xff, 0x22, 0x00, 0x21, + 0x88, 0x30, 0xff, 0xf7, 0xfb, 0xbb, 0x70, 0x47, 0x38, 0xb5, 0x14, 0x46, + 0xac, 0x4a, 0x52, 0xf8, 0x20, 0x50, 0x03, 0x2b, 0x0f, 0xd8, 0xdf, 0xe8, + 0x03, 0xf0, 0x02, 0x04, 0x06, 0x08, 0x81, 0x35, 0x04, 0xe0, 0x82, 0x35, + 0x02, 0xe0, 0x83, 0x35, 0x00, 0xe0, 0x84, 0x35, 0x0b, 0x46, 0x70, 0x22, + 0x04, 0x21, 0x00, 0xf0, 0x95, 0xbc, 0x31, 0xbd, 0x70, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x16, 0x46, 0x00, 0x23, 0xff, 0xf7, 0xe1, 0xff, 0x01, 0x23, + 0x00, 0xf0, 0x0a, 0xf8, 0x02, 0x23, 0x00, 0xf0, 0x07, 0xf8, 0x32, 0x46, + 0x29, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x03, 0x23, 0xd3, 0xe7, + 0x32, 0x46, 0x29, 0x46, 0x20, 0x46, 0xcf, 0xe7, 0x38, 0xb5, 0x00, 0xf0, + 0x1d, 0xf8, 0x05, 0xf1, 0x8b, 0x00, 0xff, 0xf7, 0xc3, 0xfb, 0x23, 0x0a, + 0x05, 0xf1, 0x8c, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0xff, 0x22, + 0x00, 0xf0, 0x74, 0xbc, 0x38, 0xb5, 0x00, 0xf0, 0x0d, 0xf8, 0x05, 0xf1, + 0x8d, 0x00, 0xff, 0xf7, 0xb3, 0xfb, 0x23, 0x0a, 0x05, 0xf1, 0x8e, 0x00, + 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0xff, 0x22, 0x00, 0xf0, 0x64, 0xbc, + 0x0c, 0x46, 0xdf, 0xf8, 0xf4, 0x1a, 0x51, 0xf8, 0x20, 0x50, 0xe3, 0xb2, + 0xff, 0x22, 0x00, 0x21, 0x70, 0x47, 0x00, 0x78, 0x9d, 0xf8, 0x00, 0x10, + 0x8d, 0xf8, 0x01, 0x00, 0x01, 0xeb, 0x00, 0x20, 0x70, 0x47, 0xdf, 0xf8, + 0xd4, 0x2a, 0x52, 0xf8, 0x20, 0x00, 0x00, 0xf1, 0x81, 0x03, 0x1a, 0x78, + 0x0a, 0x70, 0x00, 0xf1, 0x85, 0x03, 0x00, 0xf1, 0x82, 0x02, 0x12, 0x78, + 0x4a, 0x70, 0x1a, 0x78, 0x8a, 0x70, 0x00, 0xf1, 0x89, 0x03, 0x00, 0xf1, + 0x86, 0x02, 0x12, 0x78, 0xca, 0x70, 0x1a, 0x78, 0x0a, 0x71, 0x00, 0xf1, + 0x8c, 0x03, 0x00, 0xf1, 0x8b, 0x02, 0x12, 0x78, 0x4a, 0x71, 0x1a, 0x78, + 0x8a, 0x71, 0x00, 0xf1, 0x8d, 0x02, 0x8e, 0x30, 0x12, 0x78, 0xca, 0x71, + 0x00, 0x78, 0x08, 0x72, 0x70, 0x47, 0x10, 0xb5, 0xdf, 0xf8, 0x80, 0x2a, + 0x52, 0xf8, 0x20, 0x00, 0x0a, 0x78, 0x00, 0xf1, 0x81, 0x03, 0x00, 0xf1, + 0x82, 0x04, 0x1a, 0x70, 0x00, 0xf1, 0x85, 0x03, 0x4a, 0x78, 0x22, 0x70, + 0x00, 0xf1, 0x86, 0x04, 0x8a, 0x78, 0x1a, 0x70, 0x00, 0xf1, 0x89, 0x03, + 0xca, 0x78, 0x22, 0x70, 0x00, 0xf1, 0x8b, 0x04, 0x0a, 0x79, 0x1a, 0x70, + 0x00, 0xf1, 0x8c, 0x03, 0x4a, 0x79, 0x22, 0x70, 0x00, 0xf1, 0x8d, 0x04, + 0x8a, 0x79, 0x1a, 0x70, 0xca, 0x79, 0x22, 0x70, 0x09, 0x7a, 0x00, 0xf8, + 0x8e, 0x1f, 0x10, 0xbd, 0x38, 0xb5, 0x01, 0x2a, 0x0c, 0x46, 0x34, 0xd1, + 0xff, 0xf7, 0x3e, 0xfd, 0x13, 0xb1, 0x01, 0x2b, 0x17, 0xd0, 0x31, 0xbd, + 0x00, 0xf0, 0x2e, 0xf8, 0x05, 0xf1, 0xe4, 0x00, 0xff, 0xf7, 0x38, 0xfb, + 0x00, 0xf0, 0x28, 0xf8, 0x05, 0xf1, 0xe5, 0x00, 0xff, 0xf7, 0x32, 0xfb, + 0x00, 0xf0, 0x22, 0xf8, 0x05, 0xf1, 0xe8, 0x00, 0xff, 0xf7, 0x2c, 0xfb, + 0x00, 0xf0, 0x1c, 0xf8, 0x05, 0xf1, 0xe9, 0x00, 0x15, 0xe0, 0x00, 0xf0, + 0x17, 0xf8, 0x05, 0xf1, 0xd4, 0x00, 0xff, 0xf7, 0x21, 0xfb, 0x00, 0xf0, + 0x11, 0xf8, 0x05, 0xf1, 0xd5, 0x00, 0xff, 0xf7, 0x1b, 0xfb, 0x00, 0xf0, + 0x0b, 0xf8, 0x05, 0xf1, 0xd8, 0x00, 0xff, 0xf7, 0x15, 0xfb, 0x00, 0xf0, + 0x05, 0xf8, 0x05, 0xf1, 0xd9, 0x00, 0x01, 0xf0, 0x79, 0xbd, 0x31, 0xbd, + 0x23, 0x46, 0x1f, 0x22, 0x00, 0x21, 0x70, 0x47, 0x10, 0xb5, 0xdf, 0xf8, + 0xb4, 0x39, 0x53, 0xf8, 0x20, 0x40, 0x01, 0xeb, 0x42, 0x00, 0x03, 0x28, + 0x5f, 0xd8, 0xdf, 0xe8, 0x00, 0xf0, 0x02, 0x19, 0x30, 0x47, 0x00, 0xf0, + 0x5f, 0xf8, 0x04, 0xf1, 0xd5, 0x00, 0xff, 0xf7, 0xf7, 0xfa, 0x00, 0xf0, + 0x59, 0xf8, 0x04, 0xf1, 0xd6, 0x00, 0xff, 0xf7, 0xf1, 0xfa, 0x00, 0xf0, + 0x53, 0xf8, 0x04, 0xf1, 0xd9, 0x00, 0xff, 0xf7, 0xeb, 0xfa, 0x00, 0xf0, + 0x4d, 0xf8, 0x04, 0xf1, 0xda, 0x00, 0x43, 0xe0, 0x00, 0xf0, 0x48, 0xf8, + 0x04, 0xf1, 0xd4, 0x00, 0xff, 0xf7, 0xe0, 0xfa, 0x00, 0xf0, 0x42, 0xf8, + 0x04, 0xf1, 0xd7, 0x00, 0xff, 0xf7, 0xda, 0xfa, 0x00, 0xf0, 0x3c, 0xf8, + 0x04, 0xf1, 0xd8, 0x00, 0xff, 0xf7, 0xd4, 0xfa, 0x00, 0xf0, 0x36, 0xf8, + 0x04, 0xf1, 0xdb, 0x00, 0x2c, 0xe0, 0x00, 0xf0, 0x31, 0xf8, 0x04, 0xf1, + 0xe5, 0x00, 0xff, 0xf7, 0xc9, 0xfa, 0x00, 0xf0, 0x2b, 0xf8, 0x04, 0xf1, + 0xe6, 0x00, 0xff, 0xf7, 0xc3, 0xfa, 0x00, 0xf0, 0x25, 0xf8, 0x04, 0xf1, + 0xe9, 0x00, 0xff, 0xf7, 0xbd, 0xfa, 0x00, 0xf0, 0x1f, 0xf8, 0x04, 0xf1, + 0xea, 0x00, 0x15, 0xe0, 0x00, 0xf0, 0x1a, 0xf8, 0x04, 0xf1, 0xe4, 0x00, + 0xff, 0xf7, 0xb2, 0xfa, 0x00, 0xf0, 0x14, 0xf8, 0x04, 0xf1, 0xe7, 0x00, + 0xff, 0xf7, 0xac, 0xfa, 0x00, 0xf0, 0x0e, 0xf8, 0x04, 0xf1, 0xe8, 0x00, + 0xff, 0xf7, 0xa6, 0xfa, 0x00, 0xf0, 0x08, 0xf8, 0x04, 0xf1, 0xeb, 0x00, + 0x6b, 0xe5, 0x10, 0xbd, 0x3c, 0x77, 0x02, 0x20, 0xa8, 0x98, 0x04, 0x01, + 0x00, 0x23, 0x1f, 0x22, 0x00, 0x21, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, + 0x81, 0x46, 0x0e, 0x46, 0xdf, 0xf8, 0xc8, 0x08, 0x49, 0x46, 0x50, 0xf8, + 0x21, 0x80, 0x30, 0x78, 0x17, 0x46, 0x08, 0xf1, 0x08, 0x05, 0x08, 0xb9, + 0x28, 0x78, 0x30, 0x70, 0x08, 0xf1, 0xfc, 0x01, 0x1c, 0x46, 0x08, 0x78, + 0x70, 0x71, 0x08, 0xf1, 0xef, 0x0a, 0x48, 0x46, 0xff, 0xf7, 0x3c, 0xfb, + 0x70, 0x70, 0x08, 0xf1, 0xf2, 0x0b, 0x48, 0x46, 0xff, 0xf7, 0x52, 0xfb, + 0xb0, 0x70, 0x48, 0x46, 0xff, 0xf7, 0x40, 0xfb, 0xf0, 0x70, 0x48, 0x46, + 0xff, 0xf7, 0x3c, 0xfb, 0x30, 0x71, 0x08, 0xf1, 0x29, 0x01, 0x9a, 0xf8, + 0x00, 0x00, 0xb0, 0x71, 0x00, 0x23, 0x9b, 0xf8, 0x00, 0x00, 0xf0, 0x71, + 0x03, 0x22, 0x08, 0xf1, 0x28, 0x00, 0x00, 0x78, 0x30, 0x72, 0x08, 0x78, + 0x70, 0x72, 0x08, 0xf1, 0x2b, 0x01, 0x08, 0xf1, 0x2a, 0x00, 0x00, 0x78, + 0xb0, 0x72, 0x08, 0x78, 0xf0, 0x72, 0x00, 0x21, 0x08, 0xf1, 0x2c, 0x00, + 0x00, 0x78, 0x30, 0x73, 0x00, 0xf0, 0x2b, 0xfb, 0x01, 0x2c, 0x0c, 0xbf, + 0x01, 0x23, 0x00, 0x23, 0x08, 0xf1, 0x20, 0x00, 0x80, 0x22, 0x07, 0x21, + 0xff, 0xf7, 0x46, 0xfa, 0x00, 0x21, 0x48, 0x46, 0x00, 0xf0, 0xf5, 0xf9, + 0x01, 0x2f, 0x21, 0xd1, 0x00, 0xf0, 0x46, 0xf8, 0x08, 0xf1, 0x24, 0x00, + 0xff, 0xf7, 0x3a, 0xfa, 0x00, 0x21, 0x48, 0x46, 0x00, 0xf0, 0x7e, 0xfa, + 0x0a, 0x21, 0x48, 0x46, 0x00, 0xf0, 0x3e, 0xf9, 0x01, 0x23, 0x80, 0x22, + 0x07, 0x21, 0x01, 0xf0, 0x4e, 0xfc, 0x01, 0x23, 0x80, 0x22, 0x07, 0x21, + 0x01, 0xf0, 0x2d, 0xf9, 0x00, 0x22, 0x00, 0x21, 0x48, 0x46, 0xff, 0xf7, + 0x30, 0xfb, 0x00, 0x22, 0x00, 0x21, 0x48, 0x46, 0xff, 0xf7, 0x14, 0xfb, + 0x00, 0xf0, 0x28, 0xf8, 0x08, 0xf1, 0xca, 0x00, 0xff, 0xf7, 0x18, 0xfa, + 0x00, 0xf0, 0x22, 0xf8, 0x08, 0xf1, 0xcb, 0x00, 0xff, 0xf7, 0x12, 0xfa, + 0x00, 0xf0, 0x1c, 0xf8, 0x08, 0xf1, 0xcc, 0x00, 0xff, 0xf7, 0x0c, 0xfa, + 0x00, 0xf0, 0x16, 0xf8, 0x08, 0xf1, 0xcd, 0x00, 0xff, 0xf7, 0x06, 0xfa, + 0x00, 0xf0, 0x10, 0xf8, 0x08, 0xf1, 0xce, 0x00, 0xff, 0xf7, 0x00, 0xfa, + 0x08, 0xf1, 0xcf, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, 0x00, 0x23, + 0x7f, 0x22, 0xb1, 0xe2, 0x01, 0x23, 0x10, 0x22, 0x04, 0x21, 0x70, 0x47, + 0x00, 0x23, 0x7f, 0x22, 0x00, 0x21, 0x70, 0x47, 0x70, 0xb5, 0x00, 0xf0, + 0xaa, 0xfe, 0x01, 0x2a, 0x1b, 0xd1, 0x01, 0xf0, 0xbd, 0xfa, 0x95, 0xf9, + 0x02, 0x20, 0x95, 0xf9, 0x01, 0x10, 0x20, 0x46, 0xff, 0xf7, 0xef, 0xfa, + 0x95, 0xf9, 0x04, 0x20, 0x95, 0xf9, 0x03, 0x10, 0x20, 0x46, 0xff, 0xf7, + 0xd1, 0xfa, 0x68, 0x79, 0x06, 0xf1, 0xfc, 0x01, 0x06, 0xf1, 0xef, 0x02, + 0x08, 0x70, 0x06, 0xf1, 0xf2, 0x01, 0xa8, 0x79, 0x10, 0x70, 0xe8, 0x79, + 0x08, 0x70, 0x06, 0xf1, 0x28, 0x01, 0x28, 0x7a, 0x08, 0x70, 0x06, 0xf1, + 0x29, 0x02, 0x68, 0x7a, 0x10, 0x70, 0x06, 0xf1, 0x2a, 0x01, 0xa8, 0x7a, + 0x08, 0x70, 0x06, 0xf1, 0x2b, 0x02, 0xe8, 0x7a, 0x10, 0x70, 0x06, 0xf1, + 0x2c, 0x01, 0x28, 0x7b, 0x08, 0x70, 0x01, 0x21, 0x20, 0x46, 0x00, 0xf0, + 0x6a, 0xf9, 0x00, 0x23, 0x80, 0x22, 0x07, 0x21, 0x06, 0xf1, 0x20, 0x00, + 0xff, 0xf7, 0xb0, 0xf9, 0x28, 0x78, 0x06, 0xf8, 0x08, 0x0f, 0x70, 0xbd, + 0xdf, 0xf8, 0xf8, 0x36, 0x53, 0xf8, 0x20, 0x00, 0x17, 0x29, 0x5e, 0xd8, + 0xdf, 0xe8, 0x01, 0xf0, 0x0c, 0x11, 0x16, 0x1b, 0x20, 0x25, 0x2a, 0x2f, + 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x34, 0x39, 0x3e, 0x43, + 0x48, 0x4d, 0x52, 0x57, 0x13, 0x78, 0x1f, 0x22, 0x00, 0x21, 0xd4, 0x30, + 0x49, 0xe0, 0x13, 0x78, 0x1f, 0x22, 0x00, 0x21, 0xd5, 0x30, 0x44, 0xe0, + 0x13, 0x78, 0x1f, 0x22, 0x00, 0x21, 0xd6, 0x30, 0x3f, 0xe0, 0x13, 0x78, + 0x1f, 0x22, 0x00, 0x21, 0xd7, 0x30, 0x3a, 0xe0, 0x13, 0x78, 0x1f, 0x22, + 0x00, 0x21, 0xd8, 0x30, 0x35, 0xe0, 0x13, 0x78, 0x1f, 0x22, 0x00, 0x21, + 0xd9, 0x30, 0x30, 0xe0, 0x13, 0x78, 0x1f, 0x22, 0x00, 0x21, 0xda, 0x30, + 0x2b, 0xe0, 0x13, 0x78, 0x1f, 0x22, 0x00, 0x21, 0xdb, 0x30, 0x26, 0xe0, + 0x13, 0x78, 0x1f, 0x22, 0x00, 0x21, 0xe4, 0x30, 0x21, 0xe0, 0x13, 0x78, + 0x1f, 0x22, 0x00, 0x21, 0xe5, 0x30, 0x1c, 0xe0, 0x13, 0x78, 0x1f, 0x22, + 0x00, 0x21, 0xe6, 0x30, 0x17, 0xe0, 0x13, 0x78, 0x1f, 0x22, 0x00, 0x21, + 0xe7, 0x30, 0x12, 0xe0, 0x13, 0x78, 0x1f, 0x22, 0x00, 0x21, 0xe8, 0x30, + 0x0d, 0xe0, 0x13, 0x78, 0x1f, 0x22, 0x00, 0x21, 0xe9, 0x30, 0x08, 0xe0, + 0x13, 0x78, 0x1f, 0x22, 0x00, 0x21, 0xea, 0x30, 0x03, 0xe0, 0x13, 0x78, + 0x1f, 0x22, 0x00, 0x21, 0xeb, 0x30, 0xff, 0xf7, 0x47, 0xb9, 0x70, 0x47, + 0xdf, 0xf8, 0x2c, 0x26, 0x52, 0xf8, 0x20, 0x20, 0x00, 0x20, 0x17, 0x29, + 0x2f, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, + 0x18, 0x1a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x1c, 0x1e, + 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0xd4, 0x32, 0x1c, 0xe0, 0xd5, 0x32, + 0x1a, 0xe0, 0xd6, 0x32, 0x18, 0xe0, 0xd7, 0x32, 0x16, 0xe0, 0xd8, 0x32, + 0x14, 0xe0, 0xd9, 0x32, 0x12, 0xe0, 0xda, 0x32, 0x10, 0xe0, 0xdb, 0x32, + 0x0e, 0xe0, 0xe4, 0x32, 0x0c, 0xe0, 0xe5, 0x32, 0x0a, 0xe0, 0xe6, 0x32, + 0x08, 0xe0, 0xe7, 0x32, 0x06, 0xe0, 0xe8, 0x32, 0x04, 0xe0, 0xe9, 0x32, + 0x02, 0xe0, 0xea, 0x32, 0x00, 0xe0, 0xeb, 0x32, 0x10, 0x78, 0x00, 0xf0, + 0x1f, 0x00, 0x70, 0x47, 0x5e, 0xb5, 0x14, 0x46, 0x9d, 0xf8, 0x18, 0x20, + 0x8d, 0xf8, 0x00, 0x20, 0x80, 0x2a, 0x24, 0xbf, 0x7f, 0x26, 0x8d, 0xf8, + 0x00, 0x60, 0xa4, 0x00, 0x04, 0xeb, 0x01, 0x14, 0x1c, 0x19, 0x6a, 0x46, + 0xe1, 0xb2, 0xff, 0xf7, 0x4f, 0xff, 0x57, 0xbd, 0x92, 0x00, 0x02, 0xeb, + 0x01, 0x12, 0x9a, 0x18, 0xd1, 0xb2, 0xad, 0xe7, 0xdf, 0xf8, 0x88, 0x25, + 0x52, 0xf8, 0x20, 0x00, 0x00, 0xf8, 0xfc, 0x1f, 0x70, 0x47, 0x38, 0xb5, + 0x00, 0xf0, 0x23, 0xf8, 0x69, 0xb9, 0x13, 0x46, 0x1f, 0x22, 0x05, 0xf1, + 0xe0, 0x00, 0xff, 0xf7, 0xe3, 0xf8, 0x23, 0x46, 0x05, 0xf1, 0xe1, 0x00, + 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x1f, 0x22, 0x94, 0xe1, 0x31, 0xbd, + 0x38, 0xb5, 0x00, 0xf0, 0x10, 0xf8, 0x69, 0xb9, 0x13, 0x46, 0x1f, 0x22, + 0x05, 0xf1, 0xd0, 0x00, 0xff, 0xf7, 0xd0, 0xf8, 0x23, 0x46, 0x05, 0xf1, + 0xd1, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x1f, 0x22, 0x81, 0xe1, + 0x31, 0xbd, 0x1c, 0x46, 0xdf, 0xf8, 0x2c, 0x35, 0x53, 0xf8, 0x20, 0x50, + 0x70, 0x47, 0x13, 0x46, 0x0a, 0x46, 0x00, 0x21, 0xe2, 0xe7, 0x13, 0x46, + 0x0a, 0x46, 0x00, 0xf0, 0x34, 0xbb, 0xdf, 0xf8, 0x14, 0x15, 0x51, 0xf8, + 0x20, 0x00, 0xd0, 0x30, 0x04, 0xe0, 0xdf, 0xf8, 0x08, 0x15, 0x51, 0xf8, + 0x20, 0x00, 0xd1, 0x30, 0x00, 0x78, 0x00, 0xf0, 0x1f, 0x00, 0x70, 0x47, + 0xdf, 0xf8, 0xf4, 0x14, 0x51, 0xf8, 0x20, 0x00, 0xe0, 0x30, 0xf5, 0xe7, + 0xdf, 0xf8, 0xe8, 0x14, 0x51, 0xf8, 0x20, 0x00, 0xe1, 0x30, 0xef, 0xe7, + 0xdf, 0xf8, 0xdc, 0x14, 0x51, 0xf8, 0x20, 0x00, 0x00, 0xf1, 0x0b, 0x02, + 0x0c, 0x30, 0x11, 0x78, 0x00, 0x78, 0x01, 0xf0, 0x7f, 0x01, 0x00, 0xf0, + 0x7f, 0x00, 0x00, 0xeb, 0x01, 0x20, 0x80, 0xb2, 0x70, 0x47, 0x10, 0xb5, + 0x00, 0xf0, 0x77, 0xfa, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x08, 0x22, + 0x03, 0x21, 0x09, 0x30, 0xff, 0xf7, 0x82, 0xb8, 0xf8, 0xb5, 0x04, 0x46, + 0xdf, 0xf8, 0xa0, 0x04, 0x21, 0x46, 0x50, 0xf8, 0x21, 0x50, 0x00, 0x22, + 0x8d, 0xf8, 0x00, 0x20, 0x20, 0x46, 0x00, 0xf0, 0x3b, 0xfa, 0x05, 0xf1, + 0x80, 0x06, 0x00, 0x01, 0x40, 0xf0, 0x06, 0x00, 0x30, 0x70, 0x8f, 0x35, + 0x00, 0xf0, 0x19, 0xf8, 0x00, 0xf0, 0x17, 0xf8, 0x01, 0x20, 0xf4, 0xf7, + 0xce, 0xfe, 0x28, 0x78, 0x29, 0x78, 0xc0, 0x07, 0xc1, 0xf3, 0x40, 0x07, + 0x01, 0xd4, 0x01, 0x2f, 0xf7, 0xd1, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, + 0x00, 0xf0, 0xfd, 0xfb, 0x3a, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0xf8, 0x40, + 0x01, 0x21, 0xf4, 0xf7, 0xa9, 0xbf, 0x9d, 0xf8, 0x00, 0x00, 0x40, 0x1c, + 0x8d, 0xf8, 0x00, 0x00, 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, 0x37, 0xfa, + 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x08, 0x22, 0x03, 0x21, 0x0b, 0xe0, + 0x10, 0xb5, 0x01, 0x24, 0x04, 0xfa, 0x01, 0xf1, 0x00, 0xf0, 0x2b, 0xfa, + 0xbd, 0xe8, 0x10, 0x40, 0x4b, 0x1e, 0xdb, 0xb2, 0x03, 0x22, 0x00, 0x21, + 0x2a, 0x30, 0xff, 0xf7, 0x35, 0xb8, 0x10, 0xb5, 0x00, 0xf0, 0x1f, 0xfa, + 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x04, 0x22, 0x02, 0x21, 0xf3, 0xe7, + 0x38, 0xb5, 0x01, 0x25, 0xdf, 0xf8, 0xf4, 0x23, 0x52, 0xf8, 0x20, 0x40, + 0x8d, 0x40, 0x6d, 0x1e, 0x10, 0x29, 0x10, 0xd2, 0xeb, 0xb2, 0xff, 0x22, + 0x00, 0x21, 0x04, 0xf1, 0x2b, 0x00, 0xff, 0xf7, 0x1b, 0xf8, 0x2d, 0x0a, + 0x05, 0xf0, 0x7f, 0x03, 0x04, 0xf1, 0x2c, 0x00, 0x01, 0xb0, 0xbd, 0xe8, + 0x30, 0x40, 0x7f, 0x22, 0xca, 0xe0, 0x31, 0xbd, 0xdf, 0xf8, 0xc0, 0x13, + 0x51, 0xf8, 0x20, 0x20, 0x02, 0xf1, 0x2b, 0x01, 0x2c, 0x32, 0x09, 0x78, + 0x12, 0x78, 0x00, 0x20, 0x02, 0xf0, 0x7f, 0x02, 0x6c, 0xe0, 0x10, 0xb5, + 0x00, 0xf0, 0xed, 0xf9, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x1f, 0x22, + 0x00, 0x21, 0x23, 0x30, 0xfe, 0xf7, 0xf8, 0xbf, 0x10, 0xb5, 0x00, 0xf0, + 0xe2, 0xf9, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x0f, 0x22, 0x00, 0x21, + 0x84, 0xe0, 0x10, 0xb5, 0x00, 0xf0, 0xd9, 0xf9, 0xbd, 0xe8, 0x10, 0x40, + 0x0b, 0x46, 0x0f, 0x22, 0x00, 0x21, 0x07, 0xe0, 0x10, 0xb5, 0x00, 0xf0, + 0xd0, 0xf9, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0xf0, 0x22, 0x04, 0x21, + 0x25, 0x30, 0xfe, 0xf7, 0xdb, 0xbf, 0x10, 0xb5, 0x00, 0xf0, 0xc5, 0xf9, + 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x07, 0x22, 0x00, 0x21, 0x07, 0xe0, + 0x10, 0xb5, 0x00, 0xf0, 0xbc, 0xf9, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, + 0x70, 0x22, 0x04, 0x21, 0x26, 0x30, 0xfe, 0xf7, 0xc7, 0xbf, 0xdf, 0xf8, + 0x30, 0x13, 0x51, 0xf8, 0x20, 0x00, 0x26, 0x30, 0x19, 0xe1, 0xdf, 0xf8, + 0x24, 0x13, 0x51, 0xf8, 0x20, 0x00, 0x26, 0x30, 0x00, 0x78, 0xc0, 0xf3, + 0x02, 0x10, 0x70, 0x47, 0x38, 0xb5, 0xff, 0xf7, 0xb0, 0xf9, 0x01, 0x20, + 0x00, 0xfa, 0x04, 0xf4, 0xa4, 0xb2, 0x64, 0x1e, 0xe3, 0xb2, 0xff, 0x22, + 0x00, 0x21, 0x05, 0xf1, 0x28, 0x00, 0xfe, 0xf7, 0xa9, 0xff, 0x24, 0x04, + 0x23, 0x0e, 0x05, 0xf1, 0x29, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, + 0xff, 0x22, 0x59, 0xe0, 0xdf, 0xf8, 0xe0, 0x12, 0x51, 0xf8, 0x20, 0x20, + 0x02, 0xf1, 0x28, 0x01, 0x29, 0x32, 0x09, 0x78, 0x12, 0x78, 0x00, 0x20, + 0x51, 0xea, 0x02, 0x21, 0x01, 0xe0, 0x40, 0x1c, 0x49, 0x08, 0xfc, 0xd1, + 0xc0, 0xb2, 0x70, 0x47, 0x09, 0x29, 0x00, 0xd3, 0x70, 0x47, 0x10, 0xb5, + 0x01, 0x24, 0x04, 0xfa, 0x01, 0xf3, 0x00, 0xf0, 0x72, 0xf9, 0xbd, 0xe8, + 0x10, 0x40, 0x5b, 0x1e, 0xdb, 0xb2, 0xff, 0x22, 0x00, 0x21, 0x27, 0x30, + 0xfe, 0xf7, 0x7c, 0xbf, 0xdf, 0xf8, 0x98, 0x22, 0x01, 0x46, 0x52, 0xf8, + 0x21, 0x10, 0x27, 0x31, 0x00, 0x20, 0x09, 0x78, 0x00, 0x29, 0xdd, 0xe7, + 0x10, 0xb5, 0x00, 0xf0, 0x5c, 0xf9, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, + 0x10, 0x22, 0x04, 0x21, 0x24, 0x30, 0xfe, 0xf7, 0x67, 0xbf, 0x38, 0xb5, + 0xff, 0xf7, 0x5f, 0xf9, 0x00, 0x23, 0x03, 0x22, 0x00, 0x21, 0x05, 0xf1, + 0x08, 0x00, 0xfe, 0xf7, 0x5d, 0xff, 0x23, 0x46, 0x05, 0xf1, 0x11, 0x00, + 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x7f, 0x22, 0x0e, 0xe0, 0x38, 0xb5, + 0xff, 0xf7, 0x4d, 0xf9, 0xf6, 0x35, 0x01, 0x23, 0x08, 0x22, 0x03, 0x21, + 0x00, 0xf0, 0x27, 0xf8, 0x23, 0x46, 0x28, 0x46, 0x01, 0xb0, 0xbd, 0xe8, + 0x30, 0x40, 0x07, 0x22, 0x00, 0x21, 0xfe, 0xf7, 0x43, 0xbf, 0x38, 0xb5, + 0xff, 0xf7, 0x3c, 0xf9, 0x14, 0x35, 0x01, 0xf0, 0x8d, 0xf9, 0x00, 0xf0, + 0x13, 0xf8, 0x00, 0x23, 0x04, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x11, 0xf8, + 0x20, 0x24, 0x01, 0x23, 0x01, 0xf0, 0x83, 0xf9, 0x01, 0x23, 0x00, 0xf0, + 0x08, 0xf8, 0x01, 0xf0, 0x7d, 0xf9, 0x00, 0xf0, 0x03, 0xf8, 0x64, 0x1e, + 0xf3, 0xd1, 0x31, 0xbd, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, 0x28, 0x46, + 0xfe, 0xf7, 0x22, 0xbf, 0x10, 0xb5, 0x00, 0xf0, 0x29, 0xf8, 0x18, 0xbf, + 0x01, 0x23, 0x14, 0x34, 0x04, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x2a, 0xf8, + 0xff, 0xf7, 0xad, 0xf9, 0x01, 0x23, 0xff, 0xf7, 0xab, 0xf9, 0x20, 0x46, + 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x23, 0x01, 0x22, 0xc6, 0xe7, 0x10, 0xb5, + 0x00, 0xf0, 0x14, 0xf8, 0x18, 0xbf, 0x01, 0x23, 0x14, 0x34, 0x04, 0x22, + 0x02, 0x21, 0x00, 0xf0, 0x15, 0xf8, 0x00, 0xf0, 0x10, 0xf8, 0x01, 0x23, + 0x00, 0xf0, 0x0e, 0xf8, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x23, + 0x02, 0x22, 0x01, 0x21, 0xfe, 0xf7, 0xf6, 0xbe, 0x63, 0x4a, 0x52, 0xf8, + 0x20, 0x40, 0x0b, 0x00, 0x70, 0x47, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, + 0x20, 0x46, 0xfe, 0xf7, 0xeb, 0xbe, 0x00, 0x78, 0x00, 0xf0, 0x01, 0x00, + 0x70, 0x47, 0x10, 0xb5, 0x5b, 0x4a, 0x52, 0xf8, 0x20, 0x00, 0x00, 0x23, + 0xff, 0x29, 0x19, 0xd0, 0x40, 0xf2, 0xff, 0x34, 0xa1, 0x42, 0x17, 0xd0, + 0x40, 0xf6, 0xff, 0x74, 0xa1, 0x42, 0x15, 0xd0, 0x41, 0xf6, 0xff, 0x74, + 0xa1, 0x42, 0x13, 0xd0, 0x43, 0xf6, 0xff, 0x74, 0xa1, 0x42, 0x11, 0xd0, + 0x47, 0xf6, 0xff, 0x74, 0xa1, 0x42, 0x0f, 0xd0, 0x4f, 0xf6, 0xff, 0x74, + 0xa1, 0x42, 0x08, 0xbf, 0x07, 0x23, 0x0a, 0xe0, 0x01, 0x23, 0x08, 0xe0, + 0x02, 0x23, 0x06, 0xe0, 0x03, 0x23, 0x04, 0xe0, 0x04, 0x23, 0x02, 0xe0, + 0x05, 0x23, 0x00, 0xe0, 0x06, 0x23, 0xbd, 0xe8, 0x10, 0x40, 0x0e, 0x22, + 0x01, 0x21, 0x15, 0x30, 0xfe, 0xf7, 0xb4, 0xbe, 0x10, 0xb5, 0x00, 0xf0, + 0x9e, 0xf8, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x07, 0x22, 0x00, 0x21, + 0x07, 0xe0, 0x3e, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x16, 0x30, 0x00, 0x78, + 0x00, 0xf0, 0x07, 0x00, 0x70, 0x47, 0x16, 0x30, 0xfe, 0xf7, 0xa0, 0xbe, + 0x38, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x16, 0x30, 0x00, 0x78, 0xc0, 0xf3, + 0xc1, 0x00, 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, 0x82, 0xf8, 0xbd, 0xe8, + 0x10, 0x40, 0x0b, 0x46, 0x80, 0x22, 0x07, 0x21, 0xeb, 0xe7, 0x30, 0x49, + 0x51, 0xf8, 0x20, 0x00, 0x16, 0x30, 0x1f, 0xe0, 0x2d, 0x49, 0x51, 0xf8, + 0x20, 0x00, 0x16, 0x30, 0x0f, 0xe0, 0x10, 0xb5, 0x00, 0xf0, 0x6f, 0xf8, + 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x40, 0x22, 0x06, 0x21, 0x03, 0xe0, + 0x00, 0x78, 0xc0, 0xf3, 0x80, 0x10, 0x70, 0x47, 0x58, 0x30, 0xfe, 0xf7, + 0x75, 0xbe, 0x00, 0x78, 0xc0, 0xf3, 0x40, 0x10, 0x70, 0x47, 0x21, 0x49, + 0x51, 0xf8, 0x20, 0x00, 0x00, 0xf1, 0x1a, 0x02, 0x19, 0x30, 0x3d, 0xe0, + 0x00, 0x78, 0xc0, 0x09, 0x70, 0x47, 0x1c, 0x49, 0x51, 0xf8, 0x20, 0x00, + 0x18, 0x30, 0xe5, 0xe7, 0x1c, 0xb5, 0x00, 0x21, 0x8d, 0xf8, 0x00, 0x10, + 0x04, 0x46, 0xff, 0xf7, 0xcc, 0xff, 0x00, 0xf0, 0x10, 0xf8, 0xff, 0xf7, + 0xac, 0xff, 0x00, 0xf0, 0x0c, 0xf8, 0xff, 0xf7, 0xb3, 0xff, 0x00, 0xf0, + 0x08, 0xf8, 0xff, 0xf7, 0xc5, 0xff, 0x00, 0xf0, 0x04, 0xf8, 0xff, 0xf7, + 0xe4, 0xff, 0x00, 0xf0, 0xd7, 0xba, 0x8d, 0xf8, 0x00, 0x00, 0x20, 0x46, + 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, 0x2f, 0xf8, 0xbd, 0xe8, 0x10, 0x40, + 0x0b, 0x46, 0x30, 0x22, 0x04, 0x21, 0x80, 0x30, 0xfe, 0xf7, 0x3a, 0xbe, + 0x05, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x80, 0x30, 0x00, 0x78, 0xc0, 0xf3, + 0x01, 0x10, 0x70, 0x47, 0x00, 0x78, 0xc0, 0xf3, 0x00, 0x10, 0x70, 0x47, + 0xa8, 0x98, 0x04, 0x01, 0x11, 0x78, 0x00, 0x78, 0x40, 0xea, 0x01, 0x20, + 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, 0x11, 0xf8, 0xbd, 0xe8, 0x10, 0x40, + 0x0b, 0x46, 0x0f, 0x22, 0x00, 0x21, 0x07, 0xe0, 0x10, 0xb5, 0x00, 0xf0, + 0x08, 0xf8, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0xf0, 0x22, 0x04, 0x21, + 0xdc, 0x30, 0xfe, 0xf7, 0x13, 0xbe, 0xdf, 0xf8, 0x70, 0x46, 0x54, 0xf8, + 0x20, 0x00, 0x70, 0x47, 0x10, 0xb5, 0xff, 0xf7, 0xf8, 0xff, 0xbd, 0xe8, + 0x10, 0x40, 0x0b, 0x46, 0x38, 0x22, 0x03, 0x21, 0xd2, 0x30, 0xfe, 0xf7, + 0x03, 0xbe, 0xe2, 0x30, 0xfe, 0xf7, 0x00, 0xbe, 0x10, 0xb5, 0xff, 0xf7, + 0xea, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0xff, 0x22, 0x00, 0x21, + 0xd3, 0x30, 0xfe, 0xf7, 0xf5, 0xbd, 0x10, 0xb5, 0xff, 0xf7, 0xdf, 0xff, + 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x01, 0x22, 0x00, 0x21, 0x07, 0xe0, + 0x10, 0xb5, 0xff, 0xf7, 0xd6, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, + 0x04, 0x22, 0x02, 0x21, 0xc0, 0x30, 0xfe, 0xf7, 0xe1, 0xbd, 0x10, 0xb5, + 0xff, 0xf7, 0xcb, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x80, 0x22, + 0x07, 0x21, 0xef, 0x30, 0xfe, 0xf7, 0xd6, 0xbd, 0x10, 0xb5, 0xff, 0xf7, + 0xc0, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x80, 0x22, 0x07, 0x21, + 0xf2, 0x30, 0xfe, 0xf7, 0xcb, 0xbd, 0x10, 0xb5, 0xff, 0xf7, 0xb5, 0xff, + 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0xc0, 0x22, 0x06, 0x21, 0xbb, 0xe7, + 0x10, 0xb5, 0xff, 0xf7, 0xac, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, + 0xc0, 0x22, 0x06, 0x21, 0xb5, 0xe7, 0x10, 0xb5, 0xff, 0xf7, 0xa3, 0xff, + 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x02, 0x22, 0x01, 0x21, 0xc0, 0x1c, + 0xfe, 0xf7, 0xae, 0xbd, 0x10, 0xb5, 0xff, 0xf7, 0x98, 0xff, 0xbd, 0xe8, + 0x10, 0x40, 0x0b, 0x46, 0x01, 0x22, 0x00, 0x21, 0xf3, 0xe7, 0x10, 0xb5, + 0xff, 0xf7, 0x8f, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x10, 0x22, + 0x04, 0x21, 0x40, 0x1c, 0xfe, 0xf7, 0x9a, 0xbd, 0xdf, 0xf8, 0x7c, 0x15, + 0x51, 0xf8, 0x20, 0x00, 0x40, 0x1c, 0x61, 0xe7, 0x10, 0xb5, 0xff, 0xf7, + 0x7e, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x1f, 0x22, 0x00, 0x21, + 0x0e, 0x30, 0xfe, 0xf7, 0x89, 0xbd, 0x00, 0x29, 0x08, 0xbf, 0xff, 0xf7, + 0xab, 0xbc, 0x00, 0x21, 0xff, 0xf7, 0x95, 0xbc, 0xdf, 0xf8, 0x4c, 0x15, + 0x51, 0xf8, 0x20, 0x00, 0xf6, 0x30, 0xff, 0xf7, 0xd4, 0xbe, 0xc0, 0x43, + 0xc3, 0xb2, 0xff, 0x22, 0x00, 0x21, 0xdf, 0xf8, 0x6c, 0x0b, 0xfe, 0xf7, + 0x73, 0xbd, 0x01, 0x46, 0x00, 0x20, 0x08, 0x29, 0x00, 0xd3, 0x70, 0x47, + 0x10, 0xb5, 0xdf, 0xf8, 0x58, 0x3b, 0x1a, 0x78, 0x01, 0x24, 0x04, 0xfa, + 0x01, 0xf1, 0x0a, 0x42, 0x08, 0xbf, 0x01, 0x20, 0x10, 0xbd, 0x10, 0xb5, + 0x04, 0x00, 0x20, 0x00, 0xc0, 0xb2, 0xff, 0xf7, 0xce, 0xfe, 0x20, 0x00, + 0xc0, 0xb2, 0xff, 0xf7, 0xae, 0xfe, 0x10, 0xbd, 0x10, 0xb5, 0x00, 0xf0, + 0x0c, 0xf8, 0x12, 0x34, 0x1f, 0x22, 0xfe, 0xf7, 0xea, 0xff, 0x20, 0x46, + 0xbd, 0xe8, 0x10, 0x40, 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, 0xfe, 0xf7, + 0x49, 0xbd, 0x0b, 0x46, 0xdf, 0xf8, 0xd8, 0x14, 0x51, 0xf8, 0x20, 0x40, + 0x70, 0x47, 0x10, 0xb5, 0xff, 0xf7, 0x2d, 0xff, 0xbd, 0xe8, 0x10, 0x40, + 0x0b, 0x46, 0x08, 0x22, 0x03, 0x21, 0x10, 0x30, 0xfe, 0xf7, 0x38, 0xbd, + 0x10, 0xb5, 0xff, 0xf7, 0x22, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, + 0x0c, 0x22, 0x02, 0x21, 0xfb, 0x30, 0xfe, 0xf7, 0x2d, 0xbd, 0x38, 0xb5, + 0x00, 0xf0, 0x2d, 0xf8, 0xff, 0xf7, 0x01, 0xfe, 0x01, 0x23, 0xff, 0xf7, + 0xfe, 0xfd, 0x20, 0x46, 0xff, 0xf7, 0xbf, 0xff, 0x00, 0x23, 0x02, 0x22, + 0x01, 0x21, 0x1a, 0xe0, 0x10, 0xb5, 0x04, 0x46, 0xff, 0xf7, 0xed, 0xff, + 0xdf, 0xf8, 0x7c, 0x04, 0x50, 0xf8, 0x24, 0x10, 0x11, 0xf8, 0x21, 0x0f, + 0xc0, 0xf3, 0x80, 0x10, 0x10, 0xbd, 0x38, 0xb5, 0x00, 0xf0, 0x11, 0xf8, + 0x00, 0xf0, 0x5d, 0xff, 0x01, 0x23, 0x00, 0xf0, 0x5a, 0xff, 0x20, 0x46, + 0xff, 0xf7, 0xa3, 0xff, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0xff, 0xf7, + 0xdc, 0xfd, 0x20, 0x46, 0xbd, 0xe8, 0x32, 0x40, 0x99, 0xe7, 0x04, 0x46, + 0xdf, 0xf8, 0x40, 0x04, 0x21, 0x46, 0x50, 0xf8, 0x21, 0x50, 0x20, 0x35, + 0x00, 0x23, 0x70, 0x47, 0xf8, 0xb5, 0x00, 0xf0, 0x2f, 0xf8, 0x00, 0xf0, + 0x06, 0xf8, 0x2b, 0x46, 0x1f, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x2e, 0x00, + 0x20, 0xe0, 0x01, 0x23, 0x40, 0x22, 0x06, 0x21, 0x38, 0x46, 0xfe, 0xf7, + 0xe3, 0xbc, 0xdf, 0xf8, 0x10, 0x24, 0x52, 0xf8, 0x20, 0x00, 0x08, 0x29, + 0x09, 0xda, 0x10, 0xf8, 0x04, 0x3f, 0x03, 0xf0, 0xc7, 0x03, 0x03, 0xeb, + 0xc1, 0x03, 0xdb, 0xb2, 0xff, 0x22, 0xff, 0xf7, 0x8d, 0xbd, 0x70, 0x47, + 0xf8, 0xb5, 0x00, 0xf0, 0x0d, 0xf8, 0xff, 0xf7, 0xe4, 0xff, 0x2b, 0x46, + 0x1f, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x22, 0x00, 0xfe, 0xf7, 0xc6, 0xfc, + 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x40, 0xb0, 0xe7, 0x04, 0x46, 0x0d, 0x46, + 0xdf, 0xf8, 0xc8, 0x03, 0x21, 0x46, 0x50, 0xf8, 0x21, 0x60, 0x06, 0xf1, + 0x20, 0x07, 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, 0x38, 0x46, 0xfe, 0xf7, + 0xb3, 0xbc, 0x70, 0xb5, 0x0d, 0x46, 0x04, 0x46, 0x16, 0x46, 0x00, 0x21, + 0xff, 0xf7, 0xfe, 0xfe, 0x20, 0x46, 0xff, 0xf7, 0x0f, 0xff, 0x30, 0x70, + 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, 0xff, 0xfe, 0x29, 0x46, 0x20, 0x46, + 0xbd, 0xe8, 0x70, 0x40, 0xcc, 0xe7, 0x01, 0x21, 0xee, 0xe6, 0x00, 0x00, + 0xf8, 0xb5, 0x05, 0x46, 0x0c, 0x46, 0xdf, 0x48, 0x2d, 0xed, 0x02, 0x8b, + 0x29, 0x46, 0x50, 0xf8, 0x21, 0x60, 0x20, 0x36, 0x00, 0x23, 0x00, 0xf0, + 0x30, 0xf8, 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x2d, 0xf8, + 0x9f, 0xed, 0xbe, 0x8a, 0x00, 0x26, 0x16, 0xe0, 0x7f, 0x1c, 0xf9, 0xb2, + 0x28, 0x46, 0xff, 0xf7, 0x8d, 0xff, 0x28, 0x46, 0xff, 0xf7, 0x60, 0xff, + 0x10, 0xb9, 0xf8, 0xb2, 0x1f, 0x28, 0xf3, 0xd3, 0xff, 0xb2, 0x00, 0xee, + 0x10, 0x7a, 0xb8, 0xee, 0x40, 0x0a, 0x30, 0xee, 0x08, 0x8a, 0x28, 0x46, + 0xff, 0xf7, 0x0d, 0xff, 0x76, 0x1c, 0xf0, 0xb2, 0xa0, 0x42, 0x02, 0xd2, + 0x00, 0x27, 0x00, 0x21, 0xe4, 0xe7, 0x00, 0xee, 0x10, 0x4a, 0x00, 0xf0, + 0xbb, 0xf8, 0x10, 0xee, 0x10, 0x0a, 0xbd, 0xec, 0x02, 0x8b, 0xc0, 0xb2, + 0xf2, 0xbd, 0x04, 0x22, 0x02, 0x21, 0x30, 0x46, 0xfe, 0xf7, 0x5a, 0xbc, + 0x2d, 0xe9, 0xf8, 0x43, 0x80, 0x46, 0x89, 0x46, 0xbd, 0x48, 0x41, 0x46, + 0x50, 0xf8, 0x21, 0x40, 0x04, 0xf1, 0x22, 0x06, 0x17, 0x46, 0x31, 0x78, + 0x1d, 0x46, 0x6a, 0x46, 0x01, 0xf0, 0x1f, 0x01, 0x40, 0x46, 0xff, 0xf7, + 0x94, 0xff, 0x40, 0x46, 0xff, 0xf7, 0xe1, 0xfe, 0x49, 0x46, 0x40, 0x46, + 0xff, 0xf7, 0xa4, 0xff, 0x38, 0x70, 0x20, 0x34, 0x01, 0x23, 0x04, 0x22, + 0x02, 0x21, 0xff, 0xf7, 0x4b, 0xfd, 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, + 0xff, 0xf7, 0x46, 0xfd, 0x30, 0x78, 0x00, 0xf0, 0x1f, 0x00, 0x28, 0x70, + 0x00, 0x27, 0x00, 0x24, 0x07, 0xe0, 0x40, 0x46, 0xff, 0xf7, 0x0c, 0xff, + 0x3f, 0x18, 0x40, 0x46, 0xff, 0xf7, 0xc3, 0xfe, 0x64, 0x1c, 0xe0, 0xb2, + 0x48, 0x45, 0xf4, 0xd3, 0x78, 0xb2, 0x38, 0xb9, 0x28, 0x78, 0x40, 0x1c, + 0x28, 0x70, 0xc0, 0xb2, 0x20, 0x28, 0x0a, 0xd3, 0x1f, 0x20, 0x07, 0xe0, + 0x7f, 0xb2, 0x4f, 0xfa, 0x89, 0xf0, 0x87, 0x42, 0x03, 0xd1, 0x28, 0x78, + 0x08, 0xb1, 0x40, 0x1e, 0x28, 0x70, 0x29, 0x78, 0x40, 0x46, 0xff, 0xf7, + 0x39, 0xff, 0x01, 0x21, 0x40, 0x46, 0xff, 0xf7, 0x59, 0xfe, 0xbd, 0xe8, + 0xf1, 0x83, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x43, 0x80, 0x46, 0x89, 0x46, + 0x92, 0x48, 0x2d, 0xed, 0x02, 0x8b, 0x41, 0x46, 0x50, 0xf8, 0x21, 0x70, + 0x16, 0x46, 0x1c, 0x46, 0x31, 0x46, 0x40, 0x46, 0xff, 0xf7, 0x58, 0xff, + 0x20, 0x70, 0x20, 0x37, 0x01, 0x23, 0x04, 0x22, 0x02, 0x21, 0xff, 0xf7, + 0x07, 0xff, 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, 0xff, 0xf7, 0x02, 0xff, + 0x49, 0x46, 0x40, 0x46, 0xff, 0xf7, 0x01, 0xff, 0x9f, 0xed, 0x6b, 0x8a, + 0x00, 0x25, 0x06, 0xf0, 0x7f, 0x09, 0x00, 0x24, 0x1b, 0xe0, 0x7f, 0x1e, + 0xf9, 0xb2, 0x40, 0x46, 0xff, 0xf7, 0x06, 0xff, 0x40, 0x46, 0xff, 0xf7, + 0xb7, 0xfe, 0x01, 0x28, 0x02, 0xd1, 0xf8, 0xb2, 0x00, 0x28, 0xf2, 0xd1, + 0xf8, 0xb2, 0x00, 0xee, 0x10, 0x0a, 0xff, 0xb2, 0xb8, 0xee, 0x40, 0x0a, + 0xaf, 0x42, 0x30, 0xee, 0x08, 0x8a, 0x28, 0xbf, 0x3d, 0x46, 0x40, 0x46, + 0xff, 0xf7, 0x5f, 0xfe, 0x64, 0x1c, 0xe0, 0xb2, 0x48, 0x45, 0x02, 0xda, + 0x1f, 0x27, 0x1f, 0x21, 0xdf, 0xe7, 0x30, 0x06, 0x05, 0xd4, 0x00, 0xee, + 0x10, 0x6a, 0x00, 0xf0, 0x0b, 0xf8, 0x10, 0xee, 0x10, 0x5a, 0xe9, 0xb2, + 0x40, 0x46, 0xff, 0xf7, 0xdd, 0xfe, 0xbd, 0xec, 0x02, 0x8b, 0xe8, 0xb2, + 0xbd, 0xe8, 0xf2, 0x83, 0xb8, 0xee, 0x40, 0x0a, 0x88, 0xee, 0x00, 0x0a, + 0xf6, 0xee, 0x00, 0x0a, 0x30, 0xee, 0x20, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, + 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46, 0xf4, 0xf7, 0x05, 0xfc, 0x78, 0xb9, + 0x06, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x6f, 0xfd, 0x06, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0x74, 0xfd, 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x80, 0xfd, + 0x66, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x8a, 0xfd, 0x00, 0x20, 0x10, 0xbd, + 0x1c, 0xb5, 0x04, 0x46, 0xf4, 0xf7, 0xee, 0xfb, 0x78, 0xb9, 0x0e, 0x21, + 0x20, 0x46, 0xff, 0xf7, 0x58, 0xfd, 0x0e, 0x21, 0x20, 0x46, 0xff, 0xf7, + 0x5d, 0xfd, 0x06, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x69, 0xfd, 0xee, 0x21, + 0x20, 0x46, 0xff, 0xf7, 0x73, 0xfd, 0x00, 0x20, 0x8d, 0xf8, 0x00, 0x00, + 0x9d, 0xf8, 0x00, 0x00, 0x16, 0xbd, 0xdf, 0xf8, 0xb8, 0x1b, 0x51, 0xf8, + 0x20, 0x00, 0x08, 0x30, 0x00, 0x78, 0x70, 0x47, 0x10, 0xb5, 0xff, 0xf7, + 0x50, 0xfd, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x03, 0x22, 0x00, 0x21, + 0x08, 0x30, 0xfe, 0xf7, 0x5b, 0xbb, 0x7c, 0xb5, 0x00, 0xf0, 0x15, 0xf8, + 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x06, 0xf1, 0xa8, 0x00, 0xfe, 0xf7, + 0x51, 0xfb, 0x2d, 0x36, 0x2b, 0x46, 0x1f, 0x22, 0x00, 0xf0, 0x3e, 0xf9, + 0x20, 0x46, 0xff, 0xf7, 0x38, 0xfe, 0x30, 0x78, 0x00, 0xf0, 0x1f, 0x00, + 0x8d, 0xf8, 0x00, 0x00, 0x73, 0xbd, 0x04, 0x46, 0x0d, 0x46, 0xdf, 0xf8, + 0x60, 0x0b, 0x21, 0x46, 0x50, 0xf8, 0x21, 0x60, 0x70, 0x47, 0x70, 0xb5, + 0x01, 0x29, 0x04, 0x46, 0x07, 0xbf, 0x02, 0x25, 0x00, 0x26, 0x01, 0x25, + 0x03, 0x26, 0xf4, 0xf7, 0x9b, 0xfb, 0x01, 0x28, 0x03, 0xd0, 0x29, 0x46, + 0x20, 0x46, 0x00, 0xf0, 0x78, 0xf9, 0x31, 0x46, 0x20, 0x46, 0xff, 0xf7, + 0x5c, 0xfd, 0x31, 0x46, 0x20, 0x46, 0xff, 0xf7, 0x61, 0xfd, 0x00, 0x22, + 0x00, 0x21, 0x20, 0x46, 0xfe, 0xf7, 0x4c, 0xfd, 0x00, 0x22, 0x01, 0x21, + 0x20, 0x46, 0xfe, 0xf7, 0x47, 0xfd, 0x2b, 0x46, 0x03, 0x22, 0x00, 0x21, + 0xdf, 0xf8, 0xac, 0x06, 0xfe, 0xf7, 0x12, 0xfb, 0xbd, 0xe8, 0x70, 0x40, + 0x64, 0x20, 0xf4, 0xf7, 0x74, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2d, 0xe9, 0xf8, 0x4f, 0x47, 0xf6, 0xff, 0x79, 0x83, 0x46, 0x0c, 0x46, + 0x15, 0x46, 0x98, 0x46, 0xdf, 0xf8, 0xe4, 0xaa, 0x4f, 0x46, 0x00, 0x26, + 0xf1, 0xb2, 0x58, 0x46, 0xff, 0xf7, 0x93, 0xfb, 0x0a, 0x20, 0xf4, 0xf7, + 0x5e, 0xf9, 0x08, 0x20, 0x00, 0x90, 0x01, 0x23, 0x4a, 0x46, 0x06, 0x21, + 0x58, 0x46, 0xf4, 0xf7, 0x13, 0xf9, 0xdf, 0xf8, 0xc4, 0x1a, 0x08, 0x18, + 0x82, 0x45, 0xbc, 0xbf, 0x82, 0x46, 0x26, 0x70, 0xb8, 0x42, 0xbc, 0xbf, + 0x07, 0x46, 0x2e, 0x70, 0x76, 0x1c, 0xf0, 0xb2, 0x80, 0x28, 0xe1, 0xd3, + 0x0a, 0x98, 0xc8, 0xf8, 0x00, 0xa0, 0x07, 0x60, 0xbd, 0xe8, 0xf1, 0x8f, + 0xa8, 0x98, 0x04, 0x01, 0x2d, 0xe9, 0xf8, 0x4f, 0x84, 0xb0, 0x00, 0x21, + 0xad, 0xf8, 0x04, 0x10, 0x82, 0x46, 0xdf, 0xf8, 0x80, 0x1a, 0x53, 0x46, + 0x51, 0xf8, 0x23, 0x90, 0x09, 0xf1, 0x08, 0x01, 0x08, 0x78, 0x8d, 0xf8, + 0x06, 0x00, 0x50, 0x46, 0xff, 0xf7, 0x81, 0xfb, 0x00, 0x23, 0x00, 0xf0, + 0x66, 0xf8, 0x02, 0xa8, 0x00, 0x90, 0x03, 0xab, 0x0d, 0xf1, 0x05, 0x02, + 0x01, 0xa9, 0x50, 0x46, 0xff, 0xf7, 0xae, 0xff, 0x03, 0x98, 0x02, 0x99, + 0x00, 0x28, 0x48, 0xbf, 0x40, 0x42, 0x00, 0x29, 0x48, 0xbf, 0x49, 0x42, + 0x01, 0x24, 0x88, 0x42, 0x07, 0xda, 0x9d, 0xf8, 0x05, 0x00, 0x8d, 0xf8, + 0x04, 0x00, 0x00, 0x24, 0x02, 0x98, 0x03, 0x9e, 0x01, 0xe0, 0x03, 0x98, + 0x02, 0x9e, 0x9d, 0xf8, 0x04, 0x10, 0x86, 0x1b, 0x50, 0x46, 0x06, 0xeb, + 0xd6, 0x76, 0xff, 0xf7, 0x34, 0xfb, 0x76, 0x10, 0x00, 0x25, 0x6e, 0xb3, + 0x31, 0x46, 0x50, 0x46, 0x00, 0xf0, 0x3f, 0xf8, 0x00, 0x27, 0xb0, 0xf5, + 0x80, 0x7f, 0x25, 0xdb, 0x83, 0x46, 0x2c, 0xb1, 0x01, 0x21, 0x50, 0x46, + 0xff, 0xf7, 0x68, 0xfb, 0x6d, 0x1c, 0x04, 0xe0, 0x01, 0x21, 0x50, 0x46, + 0xff, 0xf7, 0x77, 0xfb, 0x6d, 0x1e, 0x50, 0x46, 0xff, 0xf7, 0x1d, 0xfd, + 0x31, 0x46, 0x50, 0x46, 0x00, 0xf0, 0x27, 0xf8, 0xd8, 0x46, 0x83, 0x46, + 0x7f, 0x1c, 0xbb, 0xf5, 0x80, 0x7f, 0x05, 0xdb, 0xc3, 0x45, 0x03, 0xda, + 0x78, 0xb2, 0x7f, 0x28, 0xe1, 0xd1, 0x05, 0xe0, 0xd8, 0x45, 0x03, 0xda, + 0x00, 0x2c, 0x14, 0xbf, 0x6d, 0x1e, 0x6d, 0x1c, 0x9d, 0xf8, 0x06, 0x30, + 0x00, 0xf0, 0x0b, 0xf8, 0x50, 0x46, 0xff, 0xf7, 0x20, 0xfb, 0x6d, 0xb2, + 0x00, 0xee, 0x10, 0x5a, 0xb8, 0xee, 0xc0, 0x0a, 0x05, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0x03, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x08, 0x00, 0xfe, 0xf7, + 0x55, 0xba, 0x38, 0xb5, 0x0c, 0x46, 0x08, 0x25, 0x00, 0x95, 0x01, 0x23, + 0x47, 0xf6, 0xff, 0x72, 0x06, 0x21, 0xf4, 0xf7, 0x6f, 0xf8, 0xdf, 0xf8, + 0x7c, 0x19, 0x08, 0x18, 0x00, 0x1b, 0x48, 0xbf, 0x40, 0x42, 0x32, 0xbd, + 0xdf, 0xf8, 0x70, 0x19, 0x09, 0x56, 0xf8, 0xb5, 0x0d, 0x46, 0x2e, 0x00, + 0x44, 0xbf, 0x49, 0x42, 0x4e, 0xb2, 0x04, 0x46, 0x00, 0x27, 0x0f, 0xe0, + 0x0a, 0xdd, 0x01, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x11, 0xfb, 0x05, 0xe0, + 0x00, 0x2d, 0xf7, 0xd5, 0x01, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x1f, 0xfb, + 0x20, 0x46, 0xff, 0xf7, 0xc6, 0xfc, 0x7f, 0x1c, 0x78, 0xb2, 0xb0, 0x42, + 0xf2, 0xdb, 0xf1, 0xbd, 0xf8, 0xb5, 0xff, 0xf7, 0xde, 0xfe, 0x16, 0xf8, + 0x08, 0x7f, 0x00, 0x23, 0x03, 0x22, 0x00, 0xf0, 0x0d, 0xf8, 0x29, 0x46, + 0x20, 0x46, 0xff, 0xf7, 0xb0, 0xfa, 0x3b, 0x46, 0x30, 0x46, 0x01, 0xb0, + 0xbd, 0xe8, 0xf0, 0x40, 0x03, 0x22, 0xff, 0xf7, 0xc9, 0xba, 0x0f, 0x22, + 0x00, 0x21, 0x30, 0x46, 0xfe, 0xf7, 0x0a, 0xba, 0xf8, 0xb5, 0x86, 0xb0, + 0x07, 0x46, 0x00, 0x21, 0xff, 0xf7, 0x77, 0xf9, 0x01, 0x21, 0x38, 0x46, + 0xff, 0xf7, 0x73, 0xf9, 0x00, 0x26, 0x00, 0x24, 0x03, 0xad, 0x38, 0x46, + 0xff, 0xf7, 0x5c, 0xf9, 0x00, 0xf0, 0x7f, 0x01, 0x29, 0x55, 0x00, 0x0a, + 0x00, 0xf0, 0x7f, 0x00, 0x0d, 0xf8, 0x04, 0x00, 0x64, 0x1c, 0x0a, 0x2c, + 0xf1, 0xd3, 0x00, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x5e, 0xf9, 0x00, 0x20, + 0x00, 0x21, 0x00, 0x22, 0xab, 0x5c, 0x14, 0x2b, 0x86, 0xbf, 0x1d, 0xf8, + 0x02, 0x70, 0x14, 0x2f, 0x01, 0x20, 0x6e, 0x2b, 0x3a, 0xbf, 0x1d, 0xf8, + 0x02, 0x30, 0x6e, 0x2b, 0x01, 0x21, 0x52, 0x1c, 0x0a, 0x2a, 0xef, 0xd3, + 0x08, 0x42, 0x0f, 0xd0, 0x00, 0x20, 0x29, 0x5c, 0x14, 0x29, 0x9c, 0xbf, + 0x80, 0x39, 0x29, 0x54, 0x1d, 0xf8, 0x00, 0x10, 0x14, 0x29, 0x9c, 0xbf, + 0x80, 0x39, 0x0d, 0xf8, 0x00, 0x10, 0x40, 0x1c, 0x0a, 0x28, 0xf0, 0xd3, + 0x00, 0x21, 0x68, 0x5c, 0x1d, 0xf8, 0x01, 0x20, 0x30, 0x18, 0x86, 0x18, + 0x49, 0x1c, 0x0a, 0x29, 0xf7, 0xd3, 0x14, 0x20, 0xb6, 0xfb, 0xf0, 0xf0, + 0xc1, 0xb2, 0x80, 0x29, 0x28, 0xbf, 0x80, 0x38, 0xc0, 0xb2, 0x07, 0xb0, + 0xf0, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x0f, 0x46, 0xdf, 0xf8, 0x3c, 0x18, + 0xdf, 0xf8, 0x48, 0xa8, 0x51, 0xf8, 0x20, 0x40, 0xf4, 0xf7, 0x12, 0xfa, + 0x3d, 0x46, 0x01, 0x28, 0x04, 0xbf, 0x01, 0x2f, 0x02, 0x27, 0x57, 0x44, + 0x04, 0xf1, 0xdc, 0x06, 0x3b, 0x78, 0xff, 0xf7, 0x8e, 0xff, 0xfb, 0x78, + 0xf0, 0x22, 0x04, 0x21, 0xff, 0xf7, 0x3b, 0xfd, 0x04, 0xf1, 0xec, 0x06, + 0xbb, 0x79, 0xff, 0xf7, 0x84, 0xff, 0x7b, 0x7a, 0xf0, 0x22, 0x04, 0x21, + 0xff, 0xf7, 0x31, 0xfd, 0x04, 0xf1, 0xfc, 0x06, 0x3b, 0x7b, 0x01, 0x22, + 0xff, 0xf7, 0x7a, 0xff, 0xfb, 0x7b, 0xff, 0xf7, 0x26, 0xfd, 0x04, 0xf1, + 0xd2, 0x08, 0xbb, 0x7c, 0x01, 0x22, 0x00, 0xf0, 0xc0, 0xfb, 0x04, 0xf1, + 0xe2, 0x09, 0x7b, 0x7d, 0x01, 0x22, 0x00, 0xf0, 0xbf, 0xfb, 0x3b, 0x7e, + 0x38, 0x22, 0x03, 0x21, 0x40, 0x46, 0xfe, 0xf7, 0x73, 0xf9, 0xfb, 0x7e, + 0x38, 0x22, 0x03, 0x21, 0x48, 0x46, 0xfe, 0xf7, 0x6d, 0xf9, 0xbb, 0x7f, + 0xff, 0x22, 0x00, 0x21, 0x04, 0xf1, 0xd3, 0x00, 0xfe, 0xf7, 0x66, 0xf9, + 0x07, 0xf1, 0x21, 0x06, 0xff, 0x22, 0x33, 0x78, 0x00, 0x21, 0x04, 0xf1, + 0xe3, 0x00, 0xfe, 0xf7, 0x5d, 0xf9, 0x04, 0xf1, 0xc0, 0x0b, 0xf3, 0x78, + 0x00, 0xf0, 0x60, 0xf8, 0xb3, 0x79, 0x04, 0x22, 0x02, 0x21, 0x00, 0xf0, + 0x58, 0xf8, 0x73, 0x7a, 0x00, 0xf0, 0x53, 0xf8, 0x33, 0x7b, 0x08, 0x22, + 0x03, 0x21, 0x00, 0xf0, 0x50, 0xf8, 0xf3, 0x7b, 0x80, 0x22, 0x07, 0x21, + 0x04, 0xf1, 0xef, 0x00, 0xfe, 0xf7, 0x44, 0xf9, 0xb3, 0x7c, 0x80, 0x22, + 0x07, 0x21, 0x04, 0xf1, 0xf2, 0x00, 0xfe, 0xf7, 0x3d, 0xf9, 0x04, 0xf1, + 0x02, 0x0b, 0x73, 0x7d, 0x00, 0xf0, 0x3b, 0xf8, 0x33, 0x7e, 0x10, 0x22, + 0x04, 0x21, 0x00, 0xf0, 0x38, 0xf8, 0xf3, 0x7e, 0x20, 0x22, 0x05, 0x21, + 0x00, 0xf0, 0x33, 0xf8, 0xb3, 0x7f, 0x00, 0xf0, 0x33, 0xf8, 0x17, 0xf8, + 0x42, 0x3f, 0x04, 0x22, 0x02, 0x21, 0x04, 0xf1, 0xf7, 0x00, 0xfe, 0xf7, + 0x23, 0xf9, 0x0a, 0xeb, 0x05, 0x00, 0x00, 0xf1, 0x45, 0x05, 0xc0, 0x22, + 0x2b, 0x78, 0x06, 0x21, 0x40, 0x46, 0xfe, 0xf7, 0x19, 0xf9, 0xeb, 0x78, + 0xc0, 0x22, 0x06, 0x21, 0x48, 0x46, 0xfe, 0xf7, 0x13, 0xf9, 0x7b, 0x7a, + 0x08, 0x22, 0x03, 0x21, 0x00, 0xf0, 0x13, 0xf8, 0xe4, 0x1c, 0x3b, 0x7b, + 0x04, 0x22, 0x02, 0x21, 0xff, 0xf7, 0x1a, 0xfa, 0xfb, 0x7b, 0xff, 0xf7, + 0x15, 0xfa, 0xbb, 0x7c, 0x20, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, + 0x01, 0x22, 0xff, 0xf7, 0xb7, 0xb9, 0x02, 0x22, 0x01, 0x21, 0x58, 0x46, + 0xfe, 0xf7, 0xf8, 0xb8, 0x01, 0x22, 0x00, 0x21, 0x58, 0x46, 0xfe, 0xf7, + 0xf3, 0xb8, 0xfe, 0xf7, 0xf1, 0xb8, 0x00, 0x78, 0x02, 0x40, 0xca, 0x40, + 0xd0, 0xb2, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x38, 0xb5, 0x2d, 0xed, + 0x02, 0x8b, 0x82, 0xb0, 0x04, 0x46, 0x00, 0x20, 0x00, 0x90, 0x9f, 0xed, + 0xbe, 0x8a, 0x00, 0x25, 0x08, 0xe0, 0x69, 0x46, 0x0b, 0x20, 0xf4, 0xf7, + 0x3f, 0xfb, 0x9d, 0xed, 0x00, 0x0a, 0x38, 0xee, 0x00, 0x8a, 0x6d, 0x1c, + 0xe8, 0xb2, 0xa0, 0x42, 0xf3, 0xd3, 0x00, 0xee, 0x10, 0x4a, 0xb8, 0xee, + 0x40, 0x0a, 0x02, 0xb0, 0x88, 0xee, 0x00, 0x0a, 0xbd, 0xec, 0x02, 0x8b, + 0x31, 0xbd, 0xdf, 0xf8, 0x70, 0x16, 0x51, 0xf8, 0x20, 0x00, 0x2d, 0x30, + 0xff, 0xf7, 0x14, 0xb8, 0x10, 0xb5, 0xc0, 0xf3, 0x03, 0x22, 0xdf, 0xf8, + 0x70, 0x46, 0x42, 0xf0, 0x40, 0x03, 0x23, 0x70, 0x22, 0x70, 0x22, 0x70, + 0x60, 0x70, 0xa1, 0x70, 0x42, 0xf0, 0x60, 0x02, 0x09, 0x0a, 0xe1, 0x70, + 0x23, 0x70, 0x22, 0x70, 0x10, 0xbd, 0x30, 0xb5, 0xdf, 0xf8, 0x50, 0x26, + 0x51, 0x7e, 0x01, 0x23, 0x03, 0xfa, 0x00, 0xf0, 0x08, 0x43, 0xdf, 0xf8, + 0x48, 0x36, 0x50, 0x76, 0x1c, 0x78, 0x51, 0x7e, 0x0c, 0x19, 0x1c, 0x70, + 0x15, 0x78, 0x65, 0x19, 0x15, 0x70, 0x10, 0x78, 0x04, 0x19, 0x1c, 0x70, + 0x30, 0xbd, 0xf0, 0xb5, 0xdf, 0xf8, 0x2c, 0x36, 0x88, 0xb0, 0x1f, 0x78, + 0x07, 0xea, 0x00, 0x06, 0x81, 0xea, 0x07, 0x02, 0x87, 0x43, 0x16, 0x40, + 0x08, 0x40, 0x00, 0x25, 0x00, 0x24, 0x38, 0x43, 0xdf, 0xf8, 0xf0, 0x25, + 0x0b, 0xe0, 0xf7, 0x07, 0x07, 0xd5, 0xef, 0xb2, 0x52, 0xf8, 0x27, 0x10, + 0x0e, 0x31, 0xe7, 0xb2, 0x4d, 0xf8, 0x27, 0x10, 0x64, 0x1c, 0x6d, 0x1c, + 0x76, 0x08, 0x37, 0x00, 0xf1, 0xd1, 0xef, 0xf3, 0x10, 0x82, 0x72, 0xb6, + 0xc5, 0x43, 0x9d, 0x70, 0x18, 0x70, 0xdf, 0xf8, 0xe8, 0x55, 0x2e, 0x78, + 0x18, 0x78, 0x86, 0x19, 0x2e, 0x70, 0x00, 0x20, 0x0a, 0xe0, 0x5d, 0xf8, + 0x26, 0x60, 0x1e, 0x27, 0x37, 0x70, 0x40, 0x1c, 0x95, 0xf8, 0x00, 0xc0, + 0x36, 0x78, 0xb4, 0x44, 0x85, 0xf8, 0x00, 0xc0, 0xc6, 0xb2, 0xe7, 0xb2, + 0xbe, 0x42, 0xf0, 0xd3, 0x82, 0xf3, 0x10, 0x88, 0x00, 0x20, 0x98, 0x70, + 0x29, 0x78, 0x98, 0x78, 0x41, 0x18, 0x29, 0x70, 0x08, 0xb0, 0xf0, 0xbd, + 0x10, 0xb5, 0xdf, 0xf8, 0x98, 0x15, 0xdf, 0xf8, 0xa4, 0x25, 0x48, 0x7e, + 0x13, 0x78, 0x0c, 0x78, 0x1c, 0x19, 0x0c, 0x70, 0x09, 0x78, 0xcb, 0x18, + 0x13, 0x70, 0x10, 0xbd, 0x38, 0xb5, 0x0d, 0x00, 0x04, 0x46, 0x18, 0xbf, + 0x01, 0x21, 0xff, 0xf7, 0x84, 0xfa, 0x20, 0x46, 0x00, 0x2d, 0xbd, 0xe8, + 0x34, 0x40, 0x14, 0xbf, 0x1e, 0x21, 0x00, 0x21, 0xff, 0xf7, 0xa0, 0xba, + 0xf8, 0xb5, 0x8e, 0xb0, 0x04, 0x46, 0x03, 0xa8, 0x0f, 0xf2, 0xa4, 0x51, + 0x10, 0x22, 0xf4, 0xf7, 0xd1, 0xfa, 0x07, 0xa8, 0x0f, 0xf2, 0xa8, 0x51, + 0x1c, 0x22, 0xf4, 0xf7, 0xcb, 0xfa, 0x0f, 0xf2, 0xbc, 0x51, 0x0a, 0x68, + 0x00, 0x92, 0x03, 0xad, 0x02, 0x95, 0x07, 0xab, 0xdf, 0xf8, 0x2c, 0x55, + 0x01, 0x93, 0x40, 0x20, 0x28, 0x70, 0x60, 0x21, 0x29, 0x70, 0x28, 0x70, + 0x50, 0x23, 0x2b, 0x70, 0x00, 0x27, 0x0b, 0xe0, 0x01, 0xa8, 0x00, 0xeb, + 0x84, 0x01, 0xbb, 0xb2, 0x51, 0xf8, 0x04, 0x2c, 0x32, 0xf8, 0x13, 0x10, + 0xb8, 0xb2, 0xff, 0xf7, 0x45, 0xff, 0x7f, 0x1c, 0x69, 0x46, 0x01, 0xeb, + 0x44, 0x02, 0xb8, 0xb2, 0x32, 0xf8, 0x02, 0x3c, 0x98, 0x42, 0xeb, 0xd3, + 0x40, 0x20, 0x28, 0x70, 0x00, 0x21, 0x29, 0x70, 0x01, 0x22, 0xaa, 0x71, + 0xa9, 0x71, 0x10, 0x21, 0x29, 0x72, 0xdf, 0xf8, 0xf4, 0x14, 0x0a, 0x78, + 0x28, 0x7a, 0x82, 0x18, 0x01, 0x2c, 0x16, 0xd1, 0x0f, 0xf2, 0x50, 0x50, + 0xdf, 0xf8, 0xb4, 0x34, 0xd0, 0xe9, 0x00, 0x45, 0xcd, 0xe9, 0x00, 0x45, + 0x00, 0x20, 0x53, 0xf8, 0x20, 0x50, 0x1d, 0xf8, 0x00, 0x60, 0x05, 0xf1, + 0x3a, 0x07, 0x40, 0x1c, 0x3e, 0x70, 0x05, 0xf8, 0x41, 0x6f, 0x2d, 0x78, + 0xaa, 0x18, 0x08, 0x28, 0xf1, 0xd3, 0x0a, 0x70, 0x0f, 0xb0, 0xf0, 0xbd, + 0x10, 0xb5, 0x00, 0x23, 0x0b, 0x70, 0xdf, 0xf8, 0xa0, 0x44, 0x23, 0x78, + 0x13, 0x70, 0x01, 0x22, 0x02, 0xfa, 0x00, 0xf0, 0x03, 0x42, 0x04, 0xd0, + 0x0a, 0x70, 0x00, 0x21, 0xc0, 0xb2, 0xff, 0xf7, 0x2a, 0xff, 0x20, 0x78, + 0x10, 0xbd, 0x00, 0x00, 0x00, 0x80, 0x08, 0x48, 0x05, 0x80, 0x08, 0x48, + 0x01, 0x29, 0x05, 0xd1, 0x11, 0x46, 0x01, 0x22, 0x02, 0xfa, 0x00, 0xf0, + 0xc0, 0xb2, 0x1a, 0xe7, 0x70, 0x47, 0xf8, 0xb5, 0x06, 0x46, 0x0c, 0x46, + 0xdf, 0xf8, 0x3c, 0x04, 0x31, 0x46, 0x50, 0xf8, 0x21, 0x50, 0x05, 0xf1, + 0x77, 0x07, 0x00, 0xf0, 0xf1, 0xf9, 0x01, 0x23, 0x00, 0xf0, 0xef, 0xf9, + 0x30, 0x46, 0xff, 0xf7, 0x3e, 0xfa, 0x05, 0xf1, 0x7b, 0x00, 0x05, 0xf1, + 0x7a, 0x01, 0x00, 0x78, 0x09, 0x78, 0x05, 0xf1, 0x79, 0x02, 0x41, 0xea, + 0x00, 0x21, 0x12, 0x78, 0x15, 0xf8, 0x78, 0x3f, 0x42, 0xea, 0x01, 0x22, + 0x43, 0xea, 0x02, 0x23, 0x23, 0x60, 0xf1, 0xbd, 0xdf, 0xf8, 0x28, 0x14, + 0x01, 0xeb, 0x80, 0x01, 0x08, 0x68, 0x70, 0x47, 0xdf, 0xf8, 0x20, 0x24, + 0x02, 0xeb, 0x80, 0x02, 0x07, 0x21, 0x11, 0x70, 0x70, 0x47, 0x10, 0xb5, + 0x84, 0x00, 0x04, 0xf1, 0x90, 0x44, 0x04, 0xf5, 0x52, 0x74, 0x77, 0x21, + 0x21, 0x70, 0xff, 0xf7, 0x14, 0xfa, 0x07, 0x22, 0x22, 0x70, 0x10, 0xbd, + 0xdf, 0xf8, 0xfc, 0x03, 0x01, 0x78, 0x41, 0xf0, 0x10, 0x01, 0x01, 0x70, + 0x01, 0xf0, 0xef, 0x01, 0x01, 0x70, 0x70, 0x47, 0xdf, 0xf8, 0xec, 0x03, + 0x00, 0x78, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0xa4, 0x13, + 0x51, 0xf8, 0x20, 0x10, 0x11, 0xf8, 0x70, 0x2f, 0x09, 0x78, 0x01, 0xea, + 0x52, 0x01, 0x00, 0x20, 0x01, 0xf0, 0x01, 0x01, 0x01, 0x29, 0x08, 0xbf, + 0x01, 0x20, 0x70, 0x47, 0xdf, 0xf8, 0xc4, 0x13, 0x09, 0x68, 0x00, 0x20, + 0x09, 0x0c, 0x11, 0xf0, 0x07, 0x01, 0x02, 0xd0, 0x05, 0x29, 0x38, 0xbf, + 0x01, 0x20, 0x70, 0x47, 0x70, 0xb5, 0x04, 0x46, 0x00, 0xf0, 0x13, 0xf8, + 0x15, 0x46, 0x00, 0xf0, 0x15, 0xf8, 0x00, 0x21, 0x20, 0x46, 0xfe, 0xf7, + 0x49, 0xfe, 0x00, 0x21, 0x20, 0x46, 0xfe, 0xf7, 0x0d, 0xff, 0x29, 0x46, + 0x20, 0x46, 0xfe, 0xf7, 0x7d, 0xff, 0x07, 0x20, 0x06, 0xf8, 0x2a, 0x0f, + 0x70, 0xbd, 0xd0, 0x48, 0x21, 0x46, 0x50, 0xf8, 0x21, 0x60, 0x70, 0x47, + 0x00, 0x23, 0x10, 0x22, 0x04, 0x21, 0x06, 0xf1, 0x24, 0x00, 0xfd, 0xf7, + 0x25, 0xbf, 0x10, 0xb5, 0xff, 0xf7, 0x0f, 0xf9, 0xbd, 0xe8, 0x10, 0x40, + 0x0b, 0x46, 0x80, 0x22, 0x07, 0x21, 0x20, 0x30, 0xfd, 0xf7, 0x1a, 0xbf, + 0x01, 0x46, 0x01, 0x20, 0x07, 0x29, 0xd4, 0x4a, 0x17, 0xd8, 0xdf, 0xe8, + 0x01, 0xf0, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x10, 0x68, + 0x0c, 0xe0, 0x50, 0x68, 0x0a, 0xe0, 0x90, 0x68, 0x08, 0xe0, 0xd0, 0x68, + 0x06, 0xe0, 0x10, 0x69, 0x04, 0xe0, 0x50, 0x69, 0x02, 0xe0, 0x90, 0x69, + 0x00, 0xe0, 0xd0, 0x69, 0xc0, 0x0e, 0x00, 0xf0, 0x01, 0x00, 0x70, 0x47, + 0x10, 0xb5, 0xc7, 0x4a, 0x52, 0xf8, 0x20, 0x40, 0x60, 0x1c, 0x19, 0xb1, + 0x00, 0xf0, 0x2f, 0xf9, 0x00, 0x23, 0x04, 0xe0, 0x00, 0x23, 0x01, 0x22, + 0xfd, 0xf7, 0xee, 0xfe, 0x01, 0x23, 0xfe, 0xf7, 0x83, 0xf9, 0x14, 0xf8, + 0x20, 0x0f, 0xbf, 0x49, 0x00, 0xf0, 0xff, 0xf8, 0x10, 0xbd, 0x70, 0xb5, + 0xbb, 0x4b, 0x53, 0xf8, 0x20, 0x30, 0x03, 0xf1, 0x20, 0x04, 0x10, 0x44, + 0x24, 0x78, 0x04, 0xf0, 0x01, 0x04, 0x04, 0x70, 0x03, 0xf1, 0x11, 0x05, + 0x03, 0xf1, 0x18, 0x06, 0x2c, 0x78, 0x04, 0x72, 0x03, 0xf1, 0x13, 0x05, + 0x03, 0xf1, 0x12, 0x04, 0x24, 0x78, 0x04, 0x74, 0x2c, 0x78, 0x04, 0x76, + 0x03, 0xf1, 0x15, 0x05, 0x03, 0xf1, 0x14, 0x04, 0x24, 0x78, 0x80, 0xf8, + 0x20, 0x40, 0x2c, 0x78, 0x00, 0xf1, 0x28, 0x05, 0x2c, 0x70, 0x03, 0xf1, + 0x16, 0x04, 0x24, 0x78, 0x04, 0xf0, 0x0f, 0x04, 0x2c, 0x72, 0x03, 0xf1, + 0x17, 0x04, 0x24, 0x78, 0x2c, 0x74, 0x34, 0x78, 0x04, 0xf0, 0x0f, 0x04, + 0x2c, 0x76, 0x03, 0xf1, 0x19, 0x04, 0x1a, 0x33, 0x24, 0x78, 0x00, 0xf8, + 0x48, 0x4f, 0x01, 0x29, 0x1b, 0x78, 0x03, 0x72, 0x0b, 0xd1, 0xa0, 0x48, + 0x00, 0x78, 0x02, 0xf1, 0x58, 0x01, 0x00, 0xf0, 0x03, 0x00, 0x08, 0x70, + 0x9d, 0x48, 0x00, 0x78, 0x00, 0xf0, 0x03, 0x00, 0x48, 0x70, 0x70, 0xbd, + 0xf8, 0xb5, 0x05, 0x46, 0x01, 0x2a, 0x0e, 0x46, 0x97, 0x4c, 0x99, 0x4f, + 0x99, 0x48, 0x21, 0xd1, 0x00, 0x23, 0x00, 0xf0, 0xce, 0xf8, 0x00, 0xf0, + 0xd9, 0xf8, 0x94, 0x4f, 0x6d, 0xb1, 0x00, 0x23, 0x10, 0x22, 0x04, 0x21, + 0xff, 0xf7, 0xa2, 0xf9, 0x06, 0xf1, 0x58, 0x05, 0x03, 0x22, 0x2b, 0x78, + 0xfe, 0xf7, 0x1b, 0xf9, 0x6b, 0x78, 0x03, 0x22, 0x13, 0xe0, 0xfe, 0xf7, + 0x85, 0xfc, 0xff, 0xf7, 0x95, 0xf9, 0x00, 0x23, 0x03, 0x22, 0x00, 0xf0, + 0xc3, 0xf8, 0x02, 0x23, 0x03, 0x22, 0x00, 0x21, 0x20, 0x46, 0x08, 0xe0, + 0x6e, 0x1e, 0xb6, 0x41, 0xf3, 0x0f, 0x00, 0xf0, 0xa9, 0xf8, 0xf3, 0x0f, + 0x01, 0x22, 0x00, 0x21, 0x38, 0x46, 0xfd, 0xf7, 0x67, 0xfe, 0x20, 0x78, + 0x82, 0x49, 0x0a, 0x78, 0x00, 0xf0, 0x03, 0x00, 0x80, 0x18, 0x08, 0x70, + 0xf1, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x06, 0x46, 0x77, 0x48, 0x50, 0xf8, + 0x26, 0x50, 0x0c, 0x46, 0x17, 0x46, 0x00, 0xf0, 0xa5, 0xf8, 0x01, 0x23, + 0x01, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x20, 0x00, 0xfd, 0xf7, 0x4e, 0xfe, + 0x68, 0x1c, 0x3e, 0x44, 0x00, 0x2c, 0x05, 0xf1, 0x15, 0x07, 0x05, 0xf1, + 0x14, 0x08, 0x05, 0xf1, 0x13, 0x09, 0x05, 0xf1, 0x12, 0x0a, 0x05, 0xf1, + 0x11, 0x0b, 0x22, 0xd1, 0x00, 0x23, 0x00, 0xf0, 0x79, 0xf8, 0x00, 0x23, + 0xff, 0x22, 0xff, 0xf7, 0x42, 0xfd, 0x00, 0x23, 0x00, 0xf0, 0x55, 0xf8, + 0x00, 0x23, 0x00, 0xf0, 0x78, 0xf8, 0x00, 0x23, 0x00, 0xf0, 0x70, 0xf8, + 0x00, 0x23, 0xff, 0x22, 0x00, 0xf0, 0x78, 0xf8, 0x00, 0x23, 0x00, 0xf0, + 0x5e, 0xf8, 0x00, 0x23, 0x00, 0xf0, 0x55, 0xf8, 0x00, 0x23, 0x00, 0xf0, + 0x4c, 0xf8, 0x00, 0x23, 0xff, 0x22, 0x00, 0xf0, 0x43, 0xf8, 0x00, 0x23, + 0x25, 0xe0, 0x00, 0xf0, 0x56, 0xf8, 0x33, 0x7a, 0xff, 0x22, 0xff, 0xf7, + 0x20, 0xfd, 0x33, 0x7c, 0x00, 0xf0, 0x33, 0xf8, 0x33, 0x7e, 0x00, 0xf0, + 0x56, 0xf8, 0x96, 0xf8, 0x20, 0x30, 0x00, 0xf0, 0x4d, 0xf8, 0x06, 0xf1, + 0x28, 0x04, 0xff, 0x22, 0x23, 0x78, 0x00, 0xf0, 0x53, 0xf8, 0x23, 0x7a, + 0x00, 0xf0, 0x39, 0xf8, 0x23, 0x7c, 0x00, 0xf0, 0x30, 0xf8, 0x23, 0x7e, + 0x00, 0xf0, 0x27, 0xf8, 0x06, 0xf1, 0x48, 0x04, 0xff, 0x22, 0x23, 0x78, + 0x00, 0xf0, 0x1c, 0xf8, 0x23, 0x7a, 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, + 0x1a, 0x00, 0xfd, 0xf7, 0xf1, 0xfd, 0x20, 0x35, 0x33, 0x78, 0x00, 0xf0, + 0x3e, 0xf8, 0x28, 0x78, 0x46, 0x49, 0x00, 0xf0, 0x02, 0xf8, 0xbd, 0xe8, + 0xf1, 0x8f, 0x0a, 0x78, 0x00, 0xf0, 0x01, 0x00, 0x80, 0x18, 0x08, 0x70, + 0x70, 0x47, 0xff, 0x22, 0x00, 0x21, 0x50, 0x46, 0xfd, 0xf7, 0xdc, 0xbd, + 0x00, 0x21, 0x05, 0xf1, 0x19, 0x00, 0xfd, 0xf7, 0xd7, 0xbd, 0x0f, 0x22, + 0x00, 0x21, 0x05, 0xf1, 0x18, 0x00, 0xfd, 0xf7, 0xd1, 0xbd, 0xff, 0x22, + 0x00, 0x21, 0x05, 0xf1, 0x17, 0x00, 0xfd, 0xf7, 0xcb, 0xbd, 0x0f, 0x22, + 0x00, 0x21, 0x05, 0xf1, 0x16, 0x00, 0xfd, 0xf7, 0xc5, 0xbd, 0x01, 0x23, + 0x01, 0x22, 0x00, 0x21, 0xfd, 0xf7, 0xc0, 0xbd, 0xff, 0x22, 0x00, 0x21, + 0x40, 0x46, 0xfd, 0xf7, 0xbb, 0xbd, 0xff, 0x22, 0x00, 0x21, 0x48, 0x46, + 0xfd, 0xf7, 0xb6, 0xbd, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x38, 0x46, + 0xfd, 0xf7, 0xb0, 0xbd, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x28, 0x46, + 0xfd, 0xf7, 0xaa, 0xbd, 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x11, 0x46, + 0xfd, 0xf7, 0xaf, 0xfe, 0x09, 0x4a, 0x01, 0x46, 0x52, 0xf8, 0x24, 0x00, + 0x00, 0x2d, 0xcb, 0xb2, 0x03, 0xd1, 0x3f, 0x22, 0x00, 0x21, 0xc3, 0x30, + 0x02, 0xe0, 0x3f, 0x22, 0x00, 0x21, 0xc5, 0x30, 0x01, 0xb0, 0xbd, 0xe8, + 0x30, 0x40, 0xfd, 0xf7, 0x91, 0xbd, 0x00, 0x00, 0xa8, 0x98, 0x04, 0x01, + 0x01, 0x80, 0xff, 0xff, 0x01, 0xc0, 0xff, 0xff, 0x3c, 0x77, 0x02, 0x20, + 0xd0, 0x8c, 0x04, 0x01, 0x32, 0x40, 0x08, 0x48, 0x07, 0x80, 0x08, 0x48, + 0xb1, 0x77, 0x02, 0x20, 0x20, 0x80, 0x08, 0x48, 0xb2, 0x77, 0x02, 0x20, + 0xb3, 0x77, 0x02, 0x20, 0xb4, 0x77, 0x02, 0x20, 0xc8, 0x03, 0x00, 0x48, + 0x49, 0x03, 0x00, 0x48, 0x00, 0x00, 0x01, 0x48, 0x24, 0x03, 0x01, 0x48, + 0x30, 0x00, 0x00, 0x48, 0x48, 0x04, 0x00, 0x48, 0x88, 0x98, 0x04, 0x01, + 0xb5, 0x77, 0x02, 0x20, 0x00, 0x80, 0x07, 0x48, 0x26, 0x00, 0x06, 0x48, + 0x02, 0x80, 0x07, 0x48, 0x01, 0x80, 0x07, 0x48, 0xb6, 0x77, 0x02, 0x20, + 0xb7, 0x77, 0x02, 0x20, 0x00, 0x00, 0x1d, 0x10, 0x0e, 0x01, 0x00, 0x00, + 0x1e, 0x10, 0x0e, 0x01, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x10, + 0x0e, 0x01, 0x02, 0x11, 0x07, 0x90, 0x01, 0x23, 0x04, 0x80, 0x1e, 0x10, + 0x0e, 0x01, 0x05, 0x11, 0x01, 0x90, 0x01, 0x23, 0x0a, 0x80, 0x00, 0x00, + 0x0d, 0x00, 0x07, 0x00, 0x1d, 0x25, 0x1f, 0x2b, 0x29, 0x35, 0x2f, 0x3d, + 0xfe, 0xf7, 0xa6, 0xba, 0xfe, 0xf7, 0x4c, 0xbb, 0xfd, 0xf7, 0x68, 0xbf, + 0xfd, 0xf7, 0x76, 0xbf, 0x10, 0xb5, 0x04, 0x46, 0x21, 0x88, 0x20, 0x79, + 0xfe, 0xf7, 0x68, 0xf9, 0x61, 0x88, 0x20, 0x79, 0xbd, 0xe8, 0x10, 0x40, + 0xfe, 0xf7, 0x72, 0xb9, 0x10, 0xb5, 0x04, 0x46, 0x22, 0x78, 0x61, 0x78, + 0x60, 0x79, 0xfe, 0xf7, 0xdd, 0xf8, 0x23, 0x78, 0xa2, 0x78, 0xe1, 0x78, + 0x60, 0x79, 0xfe, 0xf7, 0x25, 0xf9, 0x22, 0x78, 0x21, 0x79, 0x60, 0x79, + 0xbd, 0xe8, 0x10, 0x40, 0xfe, 0xf7, 0x02, 0xb9, 0xf8, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x16, 0x46, 0x1f, 0x46, 0xfe, 0xf7, 0x1d, 0xf8, 0x30, 0x60, + 0x29, 0x46, 0x20, 0x46, 0xfe, 0xf7, 0x46, 0xf8, 0x38, 0x60, 0xf1, 0xbd, + 0x83, 0x78, 0x42, 0x78, 0x01, 0x78, 0xc0, 0x78, 0xfe, 0xf7, 0x0a, 0xbc, + 0xfe, 0xf7, 0xbc, 0xbb, 0x1c, 0xb5, 0x9d, 0xf8, 0x10, 0x40, 0x00, 0x94, + 0xfe, 0xf7, 0xee, 0xfb, 0x13, 0xbd, 0xfe, 0xf7, 0xb1, 0xb9, 0xfe, 0xf7, + 0xed, 0xb9, 0xfe, 0xf7, 0xfb, 0xbb, 0xfe, 0xf7, 0xff, 0xbb, 0xfe, 0xf7, + 0x30, 0xbc, 0xfe, 0xf7, 0x32, 0xbc, 0xfe, 0xf7, 0x34, 0xbc, 0xfe, 0xf7, + 0x38, 0xbc, 0xfe, 0xf7, 0x3f, 0xbc, 0xfe, 0xf7, 0x43, 0xbc, 0xfe, 0xf7, + 0x63, 0xbc, 0x70, 0x47, 0x80, 0xb5, 0x00, 0x91, 0x83, 0x78, 0x42, 0x78, + 0x01, 0x78, 0xc0, 0x78, 0xfe, 0xf7, 0xce, 0xfb, 0x01, 0xbd, 0xfe, 0xf7, + 0x2d, 0xbb, 0xfe, 0xf7, 0x4e, 0xbf, 0xfd, 0xf7, 0xe3, 0xbe, 0x10, 0xb5, + 0x04, 0x46, 0xa0, 0x79, 0x30, 0xb9, 0x94, 0xf9, 0x02, 0x20, 0x94, 0xf9, + 0x01, 0x10, 0xe0, 0x79, 0xfd, 0xf7, 0xd7, 0xfd, 0xa0, 0x79, 0x01, 0x28, + 0x07, 0xd1, 0x21, 0x56, 0x94, 0xf9, 0x02, 0x20, 0xe0, 0x79, 0xbd, 0xe8, + 0x10, 0x40, 0xfd, 0xf7, 0xb5, 0xbd, 0x10, 0xbd, 0x10, 0xb5, 0x04, 0x46, + 0xa0, 0x79, 0x18, 0xb9, 0x00, 0xf0, 0x0c, 0xf8, 0xfd, 0xf7, 0x91, 0xfe, + 0xa0, 0x79, 0x01, 0x28, 0x05, 0xd1, 0x00, 0xf0, 0x05, 0xf8, 0xbd, 0xe8, + 0x10, 0x40, 0xfd, 0xf7, 0x79, 0xbe, 0x10, 0xbd, 0x94, 0xf9, 0x05, 0x30, + 0x94, 0xf9, 0x04, 0x20, 0x94, 0xf9, 0x03, 0x10, 0xe0, 0x79, 0x70, 0x47, + 0x83, 0x78, 0x42, 0x78, 0x01, 0x78, 0xc0, 0x78, 0xfd, 0xf7, 0x54, 0xbf, + 0x13, 0x00, 0x08, 0xbf, 0xfd, 0xf7, 0x26, 0xbd, 0x01, 0x2a, 0x08, 0xbf, + 0xfd, 0xf7, 0x2d, 0xbd, 0x70, 0x47, 0x38, 0xb5, 0x04, 0x46, 0x10, 0x00, + 0x0d, 0x46, 0x08, 0xd1, 0x20, 0x46, 0xfd, 0xf7, 0x19, 0xfd, 0x29, 0x46, + 0x20, 0x46, 0xbd, 0xe8, 0x34, 0x40, 0xfd, 0xf7, 0xde, 0xbc, 0x01, 0x2a, + 0x08, 0xd1, 0x20, 0x46, 0xfd, 0xf7, 0x19, 0xfd, 0x29, 0x46, 0x20, 0x46, + 0xbd, 0xe8, 0x34, 0x40, 0xfd, 0xf7, 0xe1, 0xbc, 0x31, 0xbd, 0x80, 0xb5, + 0x00, 0x22, 0x0b, 0x00, 0x02, 0xd1, 0xfd, 0xf7, 0x17, 0xfd, 0x03, 0xe0, + 0x01, 0x29, 0x02, 0xd1, 0xfd, 0xf7, 0x20, 0xfd, 0x02, 0x46, 0x10, 0x46, + 0x02, 0xbd, 0x13, 0x00, 0x08, 0xbf, 0xfd, 0xf7, 0xc0, 0xbc, 0x01, 0x2a, + 0x08, 0xbf, 0xfd, 0xf7, 0xca, 0xbc, 0x70, 0x47, 0x80, 0xb5, 0x00, 0x22, + 0x0b, 0x00, 0x02, 0xd1, 0xfd, 0xf7, 0xce, 0xfc, 0x03, 0xe0, 0x01, 0x29, + 0x02, 0xd1, 0xfd, 0xf7, 0xd7, 0xfc, 0x02, 0x46, 0x10, 0x46, 0x02, 0xbd, + 0x10, 0xb5, 0x04, 0x46, 0xa0, 0x79, 0x18, 0xb9, 0x21, 0x56, 0xe0, 0x79, + 0xfd, 0xf7, 0x73, 0xfc, 0xa0, 0x79, 0x01, 0x28, 0x06, 0xd1, 0x94, 0xf9, + 0x00, 0x10, 0xe0, 0x79, 0xbd, 0xe8, 0x10, 0x40, 0xfd, 0xf7, 0x74, 0xbc, + 0x10, 0xbd, 0x80, 0xb5, 0x00, 0x22, 0x0b, 0x00, 0x02, 0xd1, 0xfd, 0xf7, + 0x78, 0xfc, 0x03, 0xe0, 0x01, 0x29, 0x02, 0xd1, 0xfd, 0xf7, 0x81, 0xfc, + 0x02, 0x46, 0x10, 0x46, 0x02, 0xbd, 0xfe, 0xf7, 0xae, 0xbd, 0x38, 0xb5, + 0x04, 0x46, 0x15, 0x46, 0xfe, 0xf7, 0x47, 0xfd, 0x29, 0x46, 0x20, 0x46, + 0xbd, 0xe8, 0x34, 0x40, 0xfe, 0xf7, 0x74, 0xbd, 0x10, 0xb5, 0x04, 0x46, + 0x00, 0x21, 0xfe, 0xf7, 0x8b, 0xfd, 0x20, 0x46, 0xfe, 0xf7, 0xbd, 0xfe, + 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x01, 0x21, 0xfe, 0xf7, 0x82, 0xbd, + 0x70, 0xb5, 0x05, 0x46, 0x0c, 0x4c, 0x28, 0x46, 0xfe, 0xf7, 0xb2, 0xfd, + 0x06, 0x46, 0x01, 0x20, 0xf3, 0xf7, 0x7e, 0xfa, 0x64, 0x1e, 0x0e, 0xb9, + 0x00, 0x2c, 0xf4, 0xd1, 0x70, 0xbd, 0x38, 0xb5, 0x05, 0x46, 0x05, 0x4c, + 0x28, 0x46, 0xfe, 0xf7, 0xa3, 0xfd, 0x64, 0x1e, 0x08, 0xb9, 0x00, 0x2c, + 0xf8, 0xd1, 0x31, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x40, 0x42, 0x0f, 0x00, + 0xfe, 0xf7, 0x89, 0xbd, 0x82, 0xb0, 0x02, 0x9b, 0x02, 0xb0, 0xf3, 0xf7, + 0xef, 0xb9, 0xf8, 0xb5, 0x00, 0xf0, 0x17, 0xf8, 0x04, 0xe0, 0x29, 0x46, + 0x20, 0x46, 0xfe, 0xf7, 0xcb, 0xfc, 0x7f, 0x1c, 0xf8, 0xb2, 0xb0, 0x42, + 0xf7, 0xd3, 0xf1, 0xbd, 0xf8, 0xb5, 0x00, 0xf0, 0x0a, 0xf8, 0x04, 0xe0, + 0x29, 0x46, 0x20, 0x46, 0xfe, 0xf7, 0xd3, 0xfc, 0x7f, 0x1c, 0xf8, 0xb2, + 0xb0, 0x42, 0xf7, 0xd3, 0xf1, 0xbd, 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, + 0x00, 0x27, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46, 0xfe, 0xf7, 0x8f, 0xfc, + 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0xff, 0xf7, 0x89, 0xb9, 0xfd, 0xf7, + 0xe8, 0xbb, 0xff, 0xf7, 0xf1, 0xb8, 0xfd, 0xf7, 0xe8, 0xbb, 0xff, 0xf7, + 0xbb, 0xb9, 0xff, 0xf7, 0x9f, 0xb9, 0x09, 0x78, 0xfe, 0xf7, 0x94, 0xbb, + 0xfe, 0xf7, 0xae, 0xbb, 0x89, 0x79, 0xfe, 0xf7, 0x03, 0xbc, 0xfe, 0xf7, + 0x19, 0xbc, 0xc9, 0x79, 0xfe, 0xf7, 0x28, 0xbc, 0xfe, 0xf7, 0x38, 0xbc, + 0x09, 0x79, 0xfe, 0xf7, 0xd6, 0xbb, 0x49, 0x79, 0xfe, 0xf7, 0xdc, 0xbb, + 0xfe, 0xf7, 0xe5, 0xbb, 0xfe, 0xf7, 0xe9, 0xbb, 0x49, 0x78, 0xfe, 0xf7, + 0x5a, 0xbb, 0x89, 0x78, 0xfe, 0xf7, 0x60, 0xbb, 0xc9, 0x78, 0xfe, 0xf7, + 0x6c, 0xbb, 0xfe, 0xf7, 0x9c, 0xbb, 0xfe, 0xf7, 0xae, 0xbb, 0xfe, 0xf7, + 0xa3, 0xbb, 0xfe, 0xf7, 0xb3, 0xbb, 0xfe, 0xf7, 0x86, 0xbe, 0x01, 0x23, + 0x02, 0xf0, 0x0a, 0xbe, 0x38, 0xb5, 0x84, 0xb0, 0x9d, 0xf8, 0x2c, 0x40, + 0x9d, 0xf8, 0x28, 0x50, 0x03, 0x94, 0x02, 0x95, 0x9d, 0xf8, 0x24, 0x40, + 0x9d, 0xf8, 0x20, 0x50, 0x01, 0x94, 0x00, 0x95, 0x02, 0xf0, 0x5a, 0xfd, + 0x05, 0xb0, 0x30, 0xbd, 0xfd, 0xf7, 0x6a, 0xbd, 0xfe, 0xf7, 0x71, 0xbc, + 0xfe, 0xf7, 0x5a, 0xbc, 0x80, 0xb5, 0x00, 0x22, 0x0b, 0x00, 0x02, 0xd1, + 0xfd, 0xf7, 0x34, 0xfc, 0x03, 0xe0, 0x01, 0x29, 0x02, 0xd1, 0xfd, 0xf7, + 0x3d, 0xfc, 0x02, 0x46, 0x10, 0x46, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0x22, + 0x0b, 0x00, 0x02, 0xd1, 0xfd, 0xf7, 0x42, 0xfc, 0x03, 0xe0, 0x01, 0x29, + 0x02, 0xd1, 0xfd, 0xf7, 0x4b, 0xfc, 0x02, 0x46, 0x10, 0x46, 0x02, 0xbd, + 0x80, 0xb5, 0x00, 0x22, 0x0b, 0x00, 0x02, 0xd1, 0xfd, 0xf7, 0x87, 0xfc, + 0x03, 0xe0, 0x01, 0x29, 0x02, 0xd1, 0xfd, 0xf7, 0x90, 0xfc, 0x02, 0x46, + 0x10, 0x46, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0x22, 0x0b, 0x00, 0x02, 0xd1, + 0xfd, 0xf7, 0x95, 0xfc, 0x03, 0xe0, 0x01, 0x29, 0x02, 0xd1, 0xfd, 0xf7, + 0x9e, 0xfc, 0x02, 0x46, 0x10, 0x46, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0x22, + 0x0b, 0x00, 0x02, 0xd1, 0xfd, 0xf7, 0xa3, 0xfc, 0x03, 0xe0, 0x01, 0x29, + 0x02, 0xd1, 0xfd, 0xf7, 0xac, 0xfc, 0x02, 0x46, 0x10, 0x46, 0x02, 0xbd, + 0xfd, 0xf7, 0xd0, 0xbd, 0xfd, 0xf7, 0xde, 0xbd, 0xfd, 0xf7, 0xa1, 0xbd, + 0xfd, 0xf7, 0x7c, 0xbd, 0xfe, 0xf7, 0x8e, 0xba, 0xfe, 0xf7, 0x9d, 0xba, + 0xfe, 0xf7, 0xb5, 0xbd, 0x0b, 0x00, 0x04, 0xbf, 0x11, 0x46, 0xfe, 0xf7, + 0x42, 0xbd, 0x01, 0x29, 0x04, 0xbf, 0x11, 0x46, 0xfe, 0xf7, 0x48, 0xbd, + 0x70, 0x47, 0x1c, 0xb5, 0x9d, 0xf8, 0x10, 0x40, 0x00, 0x94, 0xfd, 0xf7, + 0x2c, 0xfd, 0x13, 0xbd, 0xfd, 0xf7, 0x7b, 0xbf, 0xfd, 0xf7, 0xa1, 0xbf, + 0xfd, 0xf7, 0xde, 0xbd, 0xfd, 0xf7, 0xf4, 0xbd, 0xfd, 0xf7, 0x0f, 0xbe, + 0xfd, 0xf7, 0x16, 0xbe, 0xfd, 0xf7, 0x30, 0xbe, 0xfd, 0xf7, 0x77, 0xbe, + 0xfd, 0xf7, 0xbc, 0xbe, 0xfd, 0xf7, 0xd4, 0xbe, 0xfd, 0xf7, 0xde, 0xbe, + 0xf8, 0xb5, 0xff, 0xf7, 0x22, 0xff, 0x26, 0xfa, 0x07, 0xf0, 0xc0, 0x07, + 0x04, 0xd5, 0xfa, 0xb2, 0x29, 0x46, 0x20, 0x46, 0xfd, 0xf7, 0xde, 0xfe, + 0x7f, 0x1c, 0xf8, 0xb2, 0x04, 0x28, 0xf2, 0xd3, 0xf1, 0xbd, 0xfd, 0xf7, + 0xf3, 0xbe, 0xfd, 0xf7, 0x09, 0xbf, 0xfd, 0xf7, 0x1f, 0xbf, 0xfd, 0xf7, + 0x2d, 0xbf, 0xfe, 0xf7, 0x82, 0xbd, 0xfe, 0xf7, 0x8b, 0xbd, 0xfe, 0xf7, + 0x9e, 0xbd, 0xfe, 0xf7, 0xa7, 0xbd, 0xfe, 0xf7, 0x2a, 0xbe, 0xfe, 0xf7, + 0x3c, 0xbe, 0xfe, 0xf7, 0xd5, 0xbe, 0xfe, 0xf7, 0x7d, 0xbe, 0xfd, 0xf7, + 0xd6, 0xbc, 0xfe, 0xf7, 0x34, 0xbf, 0xfe, 0xf7, 0x49, 0xbf, 0xfe, 0xf7, + 0x8a, 0xbc, 0xfe, 0xf7, 0x60, 0xbf, 0xfe, 0xf7, 0x65, 0xbf, 0xfe, 0xf7, + 0x6e, 0xbf, 0xfe, 0xf7, 0x8c, 0xbf, 0x03, 0xf0, 0xc4, 0xb9, 0xfe, 0xf7, + 0x6e, 0xbb, 0xfe, 0xf7, 0x3f, 0xbd, 0xff, 0xf7, 0xcc, 0xb9, 0xff, 0xf7, + 0xcc, 0xb9, 0xff, 0xf7, 0xd1, 0xb9, 0xff, 0xf7, 0xf0, 0xb9, 0xff, 0xf7, + 0xe3, 0xba, 0xff, 0xf7, 0xf9, 0xba, 0xff, 0xf7, 0x1a, 0xba, 0xff, 0xf7, + 0x5f, 0xba, 0xff, 0xf7, 0x7b, 0xba, 0xff, 0xf7, 0x69, 0xba, 0xff, 0xf7, + 0x63, 0xbb, 0xff, 0xf7, 0x84, 0xbb, 0x00, 0x29, 0x11, 0x46, 0x08, 0xbf, + 0xfe, 0xf7, 0xaf, 0xbc, 0xfe, 0xf7, 0xb6, 0xbc, 0x02, 0xf0, 0x83, 0xbf, + 0x00, 0x29, 0x11, 0x46, 0x08, 0xbf, 0xfd, 0xf7, 0x43, 0xbc, 0xfd, 0xf7, + 0x1a, 0xbc, 0xff, 0xf7, 0xed, 0xbc, 0x00, 0x29, 0x11, 0x46, 0x08, 0xbf, + 0xfd, 0xf7, 0x53, 0xbc, 0xfd, 0xf7, 0x2d, 0xbc, 0xff, 0xf7, 0xdb, 0xba, + 0xff, 0xf7, 0x72, 0xbb, 0x2d, 0xe9, 0xf8, 0x43, 0x90, 0x46, 0x00, 0x24, + 0x08, 0xf1, 0x42, 0x06, 0x07, 0x46, 0x88, 0xf8, 0x89, 0x40, 0x01, 0x25, + 0x96, 0xf9, 0x04, 0x00, 0x90, 0xbb, 0x38, 0x46, 0xff, 0xf7, 0x18, 0xfb, + 0x01, 0x28, 0xa1, 0x46, 0x06, 0xd1, 0x98, 0xf8, 0x89, 0x00, 0x40, 0xf0, + 0x01, 0x00, 0xa9, 0x46, 0x88, 0xf8, 0x89, 0x00, 0xff, 0xf7, 0x1c, 0xfb, + 0x01, 0x28, 0x06, 0xd1, 0x98, 0xf8, 0x89, 0x00, 0x40, 0xf0, 0x02, 0x00, + 0x88, 0xf8, 0x89, 0x00, 0x1a, 0xe0, 0xb9, 0xf1, 0x00, 0x0f, 0x17, 0xd1, + 0x38, 0x46, 0x03, 0xf0, 0x4a, 0xfc, 0x80, 0x46, 0x00, 0x27, 0x98, 0xf8, + 0x0b, 0x00, 0x01, 0x21, 0xb9, 0x40, 0x08, 0x42, 0x03, 0xd0, 0xf8, 0xb2, + 0xff, 0xf7, 0x3c, 0xfb, 0x05, 0x40, 0x7f, 0x1c, 0xf8, 0xb2, 0x08, 0x28, + 0xf1, 0xd3, 0x1d, 0xb9, 0x30, 0x88, 0x40, 0x1c, 0x01, 0x24, 0x30, 0x80, + 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0x02, 0x46, 0x01, 0x21, 0x00, 0x20, + 0x04, 0xf0, 0x88, 0xb9, 0x10, 0xb5, 0x04, 0x46, 0x08, 0x46, 0xff, 0xf7, + 0xb1, 0xfa, 0xc4, 0xf8, 0x80, 0x00, 0x10, 0xbd, 0xff, 0xf7, 0xb2, 0xba, + 0xff, 0xf7, 0xb7, 0xba, 0xff, 0xf7, 0xc2, 0xba, 0xff, 0xf7, 0xca, 0xba, + 0xf8, 0xb5, 0x04, 0x46, 0x0e, 0x46, 0x03, 0xf0, 0x18, 0xfc, 0x00, 0x25, + 0x00, 0x21, 0x00, 0x22, 0xc3, 0x7a, 0x01, 0x27, 0x97, 0x40, 0x3b, 0x42, + 0x02, 0xd0, 0x01, 0x2e, 0x11, 0x46, 0x03, 0xd0, 0x52, 0x1c, 0xd3, 0xb2, + 0x08, 0x2b, 0xf3, 0xd3, 0xc9, 0xb2, 0x8c, 0x42, 0x08, 0xbf, 0x01, 0x25, + 0x28, 0x46, 0xf2, 0xbd, 0x10, 0xb5, 0x04, 0x46, 0xff, 0xf7, 0xc0, 0xfd, + 0x20, 0x46, 0xff, 0xf7, 0x3e, 0xfd, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, + 0x50, 0xe5, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x00, 0x26, + 0x01, 0x21, 0x20, 0x46, 0xff, 0xf7, 0xda, 0xfe, 0x20, 0x46, 0xff, 0xf7, + 0xd5, 0xfe, 0xf1, 0xb2, 0x76, 0x1c, 0x68, 0x54, 0x00, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0xd0, 0xfe, 0xf0, 0xb2, 0x08, 0x28, 0xee, 0xd3, 0x70, 0xbd, + 0x10, 0xb5, 0x05, 0xf0, 0x1a, 0xf8, 0x04, 0x46, 0xdf, 0xf8, 0xa4, 0x13, + 0x00, 0x20, 0x08, 0x70, 0x42, 0xf6, 0xd0, 0x71, 0x60, 0x6c, 0x05, 0xf0, + 0xab, 0xfa, 0xe0, 0x6b, 0x20, 0x21, 0x00, 0xf2, 0x7c, 0x50, 0x05, 0xf0, + 0xa5, 0xfa, 0xe0, 0x6b, 0x20, 0x21, 0x00, 0xf2, 0x9c, 0x50, 0x05, 0xf0, + 0x9f, 0xfa, 0xe0, 0x6b, 0x20, 0x21, 0x00, 0xf2, 0xbc, 0x50, 0x05, 0xf0, + 0x99, 0xfa, 0xe0, 0x6b, 0x20, 0x21, 0x00, 0xf2, 0x1c, 0x60, 0x05, 0xf0, + 0x93, 0xfa, 0xe0, 0x6b, 0x20, 0x21, 0x00, 0xf2, 0xfc, 0x50, 0x05, 0xf0, + 0x8d, 0xfa, 0xe0, 0x6b, 0xbd, 0xe8, 0x10, 0x40, 0x20, 0x21, 0x00, 0xf2, + 0xdc, 0x50, 0x05, 0xf0, 0x85, 0xba, 0x2d, 0xe9, 0xff, 0x47, 0x0d, 0x46, + 0x00, 0x21, 0x02, 0x91, 0x81, 0x46, 0x04, 0xf0, 0xe2, 0xff, 0x06, 0x46, + 0x05, 0xf1, 0x88, 0x0a, 0xf0, 0x6b, 0x00, 0xf5, 0x3e, 0x78, 0x08, 0xf5, + 0xa9, 0x77, 0x48, 0x46, 0x3c, 0x78, 0x85, 0xf8, 0x00, 0x90, 0x21, 0x46, + 0xff, 0xf7, 0x33, 0xfd, 0x28, 0x75, 0x22, 0x46, 0x49, 0x46, 0x68, 0x46, + 0x05, 0xf0, 0x0c, 0xfe, 0x9d, 0xf8, 0x01, 0x10, 0x69, 0x75, 0x05, 0xf1, + 0xac, 0x04, 0x9d, 0xf8, 0x02, 0x20, 0xaa, 0x75, 0x40, 0x22, 0x9d, 0xf8, + 0x03, 0x10, 0xe9, 0x75, 0x08, 0xf1, 0x10, 0x01, 0x9d, 0xf8, 0x04, 0x00, + 0x28, 0x76, 0x9d, 0xf8, 0x05, 0x00, 0x68, 0x76, 0x9d, 0xf8, 0x06, 0x00, + 0xa8, 0x76, 0x05, 0xf1, 0x48, 0x00, 0xf3, 0xf7, 0x33, 0xfc, 0x08, 0xf1, + 0x04, 0x00, 0x05, 0xf1, 0x40, 0x01, 0xd0, 0xe9, 0x00, 0x23, 0xc1, 0xe9, + 0x00, 0x23, 0x08, 0xf5, 0x94, 0x71, 0x24, 0x22, 0x05, 0xf1, 0x1c, 0x00, + 0xf3, 0xf7, 0x24, 0xfc, 0x78, 0x79, 0x8a, 0xf8, 0x00, 0x00, 0x08, 0xf5, + 0xee, 0x78, 0xb9, 0x79, 0x8a, 0xf8, 0x01, 0x10, 0xf8, 0x79, 0x8a, 0xf8, + 0x02, 0x00, 0x39, 0x7a, 0x8a, 0xf8, 0x03, 0x10, 0x02, 0xa9, 0x98, 0xf8, + 0x04, 0x00, 0x20, 0x77, 0xb0, 0x6b, 0x90, 0xf8, 0x7c, 0x01, 0xf3, 0xf7, + 0x35, 0xf9, 0xaa, 0xf8, 0x04, 0x00, 0xf0, 0x6b, 0x90, 0xf8, 0x58, 0x15, + 0x21, 0x70, 0xf0, 0x6b, 0x90, 0xf8, 0x59, 0x15, 0x61, 0x70, 0xf0, 0x6b, + 0xd0, 0xf8, 0x5c, 0x15, 0x61, 0x60, 0x00, 0xf2, 0x41, 0x50, 0x02, 0x78, + 0x40, 0x78, 0x79, 0x7a, 0x02, 0xeb, 0x40, 0x02, 0x02, 0xeb, 0x81, 0x02, + 0xea, 0x76, 0xf0, 0x6b, 0x90, 0xf8, 0x3a, 0x15, 0x21, 0x76, 0xf0, 0x6b, + 0x90, 0xf8, 0x40, 0x15, 0x61, 0x76, 0xf0, 0x6b, 0x90, 0xf8, 0x2e, 0x15, + 0xa1, 0x76, 0xf0, 0x6b, 0x90, 0xf8, 0x2f, 0x15, 0xe1, 0x76, 0x48, 0x46, + 0xf3, 0xf7, 0x82, 0xf8, 0xa0, 0x60, 0x48, 0x46, 0xf3, 0xf7, 0x84, 0xf8, + 0xe0, 0x60, 0xd8, 0xf8, 0x00, 0x00, 0x20, 0x61, 0x02, 0x98, 0x0c, 0xe1, + 0x00, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf1, 0x4f, 0x2d, 0xed, 0x02, 0x8b, + 0x0e, 0x46, 0x00, 0xf0, 0x4f, 0xf9, 0x80, 0x46, 0x00, 0x27, 0xd8, 0xf8, + 0x44, 0x10, 0xd8, 0xf8, 0x38, 0x00, 0xd0, 0xf8, 0x00, 0x41, 0x80, 0x48, + 0x90, 0xf8, 0x00, 0xb0, 0x5a, 0x46, 0xcc, 0x20, 0x42, 0x43, 0x01, 0xeb, + 0x02, 0x09, 0x08, 0x21, 0x09, 0xf1, 0x8e, 0x00, 0x05, 0xf0, 0x16, 0xff, + 0x08, 0x21, 0x09, 0xf1, 0x96, 0x00, 0x05, 0xf0, 0x11, 0xff, 0x24, 0x0d, + 0x05, 0x2e, 0x04, 0xf0, 0x01, 0x04, 0x9f, 0xed, 0x74, 0x8a, 0x00, 0xf2, + 0x8d, 0x80, 0xdf, 0xe8, 0x06, 0xf0, 0x68, 0x03, 0x74, 0x79, 0x6f, 0x86, + 0xd8, 0xf8, 0x3c, 0x00, 0x00, 0xf2, 0x1c, 0x6a, 0xd0, 0xf8, 0x5c, 0x04, + 0x08, 0xee, 0x10, 0x0a, 0xda, 0xf8, 0x08, 0x00, 0xda, 0xf8, 0x04, 0x10, + 0x81, 0x42, 0x07, 0xd3, 0x03, 0x2e, 0x02, 0xbf, 0xd8, 0xf8, 0x3c, 0x20, + 0x92, 0xf9, 0x28, 0x35, 0x01, 0x2b, 0x49, 0xd1, 0x14, 0xb1, 0xbb, 0xf1, + 0x1e, 0x0f, 0x45, 0xd2, 0xa0, 0xeb, 0x01, 0x0b, 0x9d, 0xf8, 0x08, 0x00, + 0x49, 0x46, 0xff, 0xf7, 0x1c, 0xff, 0x07, 0x46, 0xd8, 0xf8, 0x3c, 0x00, + 0xc1, 0x68, 0xd0, 0xf8, 0x64, 0x02, 0xc9, 0xf8, 0x04, 0x50, 0xc9, 0xf8, + 0x10, 0xb0, 0x09, 0xf1, 0xb4, 0x05, 0x89, 0xf8, 0x01, 0x60, 0xc9, 0xf8, + 0x08, 0x10, 0xc9, 0xf8, 0x0c, 0x00, 0x85, 0xed, 0x03, 0x8a, 0x0a, 0xf1, + 0x18, 0x02, 0x0a, 0xf1, 0x10, 0x01, 0x48, 0x46, 0x00, 0xf0, 0x2d, 0xf9, + 0x03, 0x2e, 0x01, 0xbf, 0xd8, 0xf8, 0x3c, 0x00, 0x00, 0xf2, 0xdd, 0x41, + 0x91, 0xf9, 0x4b, 0x20, 0x01, 0x2a, 0x0f, 0xd1, 0x09, 0x78, 0xc9, 0xf8, + 0x08, 0x10, 0x00, 0xf2, 0xfc, 0x40, 0x90, 0xe8, 0x4c, 0x00, 0x09, 0xf1, + 0xa0, 0x01, 0x81, 0xe8, 0x4c, 0x00, 0xd8, 0xf8, 0x3c, 0x00, 0xd0, 0xf8, + 0x18, 0x15, 0x29, 0x60, 0x45, 0x49, 0x08, 0x78, 0x40, 0x1c, 0x08, 0x70, + 0xc0, 0xb2, 0x1e, 0x28, 0x02, 0xd3, 0x0c, 0xb9, 0x00, 0x20, 0x08, 0x70, + 0x38, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, 0xd8, 0xf8, + 0x3c, 0x00, 0x90, 0xed, 0xbd, 0x8a, 0x00, 0xf2, 0xbc, 0x5a, 0x9b, 0xe7, + 0xd8, 0xf8, 0x3c, 0x00, 0x00, 0xf2, 0xdc, 0x5a, 0x96, 0xe7, 0xd8, 0xf8, + 0x3c, 0x00, 0x00, 0xf2, 0xfc, 0x5a, 0x91, 0xe7, 0xd8, 0xf8, 0x3c, 0x00, + 0x90, 0xed, 0xbd, 0x0a, 0x00, 0xf2, 0x7c, 0x5a, 0xd0, 0xf8, 0x5c, 0x04, + 0x00, 0xee, 0x90, 0x0a, 0x30, 0xee, 0x20, 0x8a, 0x84, 0xe7, 0xd8, 0xf8, + 0x3c, 0x10, 0x01, 0xf2, 0x9c, 0x5a, 0x7f, 0xe7, 0x4f, 0xf4, 0x00, 0x47, + 0xd4, 0xe7, 0x2d, 0xe9, 0xff, 0x47, 0x80, 0x46, 0x8a, 0x46, 0x04, 0xf0, + 0x96, 0xfe, 0x06, 0x46, 0x28, 0x4c, 0xf0, 0x6b, 0x22, 0x78, 0x71, 0x6c, + 0x00, 0xf2, 0x1c, 0x69, 0xcc, 0x20, 0x42, 0x43, 0x88, 0x18, 0x41, 0xf2, + 0xe8, 0x73, 0xc7, 0x18, 0x6e, 0x22, 0x6f, 0xf0, 0x27, 0x00, 0x01, 0x92, + 0x00, 0x90, 0x00, 0x25, 0x02, 0x95, 0x06, 0x23, 0x00, 0x22, 0x01, 0x21, + 0x50, 0x46, 0xf3, 0xf7, 0x57, 0xf8, 0x01, 0x00, 0x2e, 0xd4, 0xd9, 0xf8, + 0x0c, 0x20, 0x22, 0xfa, 0x01, 0xf0, 0xc3, 0x07, 0x28, 0xd4, 0xf0, 0x6b, + 0x00, 0x7d, 0x08, 0xb1, 0xc0, 0x06, 0x23, 0xd5, 0x01, 0x23, 0x03, 0xfa, + 0x01, 0xf1, 0x11, 0x43, 0xc9, 0xf8, 0x0c, 0x10, 0x09, 0xf1, 0x18, 0x02, + 0x09, 0xf1, 0x10, 0x01, 0x38, 0x46, 0x00, 0xf0, 0xa4, 0xf8, 0x39, 0x46, + 0x40, 0x46, 0xff, 0xf7, 0x74, 0xfe, 0x05, 0x46, 0x00, 0x20, 0x38, 0x61, + 0x78, 0x70, 0x78, 0x60, 0xf0, 0x6b, 0xc1, 0x68, 0xb9, 0x60, 0xd0, 0xf8, + 0x64, 0x02, 0xf8, 0x60, 0x20, 0x78, 0x40, 0x1c, 0x20, 0x70, 0xc0, 0xb2, + 0x1e, 0x28, 0x24, 0xbf, 0x00, 0x20, 0x20, 0x70, 0x28, 0x46, 0x04, 0xb0, + 0xbd, 0xe8, 0xf0, 0x87, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x77, 0x02, 0x20, + 0xb9, 0x77, 0x02, 0x20, 0x2d, 0xe9, 0xf0, 0x41, 0x80, 0x46, 0x00, 0xf0, + 0x3c, 0xf8, 0x00, 0x26, 0x01, 0x2f, 0x08, 0xbf, 0xc0, 0x6b, 0x11, 0xd0, + 0x39, 0x00, 0x03, 0xd1, 0xc0, 0x6b, 0x00, 0xf2, 0xbc, 0x54, 0x0d, 0xe0, + 0x02, 0x2f, 0x03, 0xd1, 0xc0, 0x6b, 0x00, 0xf2, 0xfc, 0x54, 0x07, 0xe0, + 0xc0, 0x6b, 0x04, 0x2f, 0x08, 0xbf, 0x00, 0xf2, 0xdc, 0x54, 0x01, 0xd0, + 0x00, 0xf2, 0x1c, 0x64, 0x04, 0xf1, 0x18, 0x01, 0x40, 0x46, 0xff, 0xf7, + 0xeb, 0xfd, 0x2d, 0xb1, 0x26, 0x60, 0x40, 0x46, 0xff, 0xf7, 0xc4, 0xfc, + 0x60, 0x60, 0x13, 0xe0, 0x40, 0x46, 0xff, 0xf7, 0xbf, 0xfc, 0xa0, 0x60, + 0x39, 0x46, 0x22, 0x68, 0x40, 0x46, 0xff, 0xf7, 0xb9, 0xfe, 0x06, 0x46, + 0xa0, 0x68, 0x60, 0x60, 0x04, 0xf1, 0x10, 0x01, 0x40, 0x46, 0xff, 0xf7, + 0xd3, 0xfd, 0x20, 0x68, 0x40, 0x1c, 0x20, 0x60, 0x30, 0x46, 0xbd, 0xe8, + 0xf0, 0x81, 0x0f, 0x46, 0x15, 0x46, 0x04, 0xf0, 0xfc, 0xbd, 0xf8, 0xb5, + 0x04, 0x46, 0xff, 0xf7, 0xf8, 0xff, 0x00, 0x26, 0x03, 0x2f, 0x14, 0xd1, + 0xc0, 0x6b, 0x00, 0xf2, 0x7c, 0x57, 0x00, 0x2d, 0x20, 0x46, 0x0a, 0xd0, + 0xff, 0xf7, 0x98, 0xfc, 0x00, 0xf0, 0x28, 0xf8, 0x00, 0x22, 0x03, 0x21, + 0x20, 0x46, 0xff, 0xf7, 0x91, 0xfe, 0x06, 0x46, 0x0e, 0xe0, 0xff, 0xf7, + 0x8d, 0xfc, 0x78, 0x60, 0x1a, 0xe0, 0x05, 0x2f, 0x18, 0xd1, 0xc0, 0x6b, + 0x00, 0xf2, 0x9c, 0x57, 0x00, 0x2d, 0x20, 0x46, 0x08, 0xd0, 0xff, 0xf7, + 0x81, 0xfc, 0x78, 0x60, 0x07, 0xf1, 0x10, 0x01, 0x20, 0x46, 0xff, 0xf7, + 0x9d, 0xfd, 0x09, 0xe0, 0xff, 0xf7, 0x78, 0xfc, 0x00, 0xf0, 0x08, 0xf8, + 0x00, 0x22, 0x05, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x71, 0xfe, 0x06, 0x46, + 0x30, 0x46, 0xf2, 0xbd, 0xb8, 0x60, 0x07, 0xf1, 0x18, 0x01, 0x20, 0x46, + 0x8a, 0xe5, 0x70, 0xb5, 0x00, 0x23, 0xc4, 0x18, 0xcd, 0x5c, 0x04, 0xf8, + 0x8e, 0x5f, 0xd6, 0x5c, 0x26, 0x72, 0x5b, 0x1c, 0x08, 0x2b, 0xf6, 0xd3, + 0x70, 0xbd, 0x00, 0x00, 0x00, 0x78, 0x02, 0x40, 0xca, 0x40, 0xd0, 0xb2, + 0x70, 0x47, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, + 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x70, + 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0xd0, 0xb5, 0xdf, 0xf8, 0x4c, 0x6a, + 0x37, 0x68, 0x04, 0x46, 0x10, 0x46, 0x19, 0x46, 0x4f, 0xf4, 0x7a, 0x72, + 0x00, 0x23, 0x07, 0xeb, 0x04, 0x17, 0x05, 0xf0, 0x93, 0xfd, 0x47, 0xf8, + 0xe4, 0x0f, 0xdf, 0xf8, 0x38, 0x0a, 0x50, 0xf8, 0x24, 0x10, 0x0a, 0x6a, + 0x7a, 0x60, 0x4b, 0x6a, 0xbb, 0x60, 0x91, 0xf8, 0x38, 0x10, 0x39, 0x73, + 0x50, 0xf8, 0x24, 0x00, 0x32, 0x68, 0x90, 0xf8, 0x39, 0x10, 0x02, 0xeb, + 0x04, 0x12, 0x82, 0xf8, 0xf1, 0x10, 0xd0, 0xbd, 0xdf, 0xf8, 0x04, 0x1a, + 0x0b, 0x68, 0x02, 0x78, 0x83, 0xf8, 0x50, 0x24, 0x0b, 0x68, 0x42, 0x78, + 0x83, 0xf8, 0x51, 0x24, 0x0b, 0x68, 0x82, 0x78, 0x83, 0xf8, 0x52, 0x24, + 0x09, 0x68, 0xc0, 0x78, 0x81, 0xf8, 0x53, 0x04, 0x70, 0x47, 0x10, 0xb5, + 0xdf, 0xf8, 0xdc, 0x19, 0x0a, 0x68, 0x92, 0xf8, 0x50, 0x34, 0x03, 0x70, + 0x0c, 0x68, 0x94, 0xf8, 0x51, 0x24, 0x42, 0x70, 0x0b, 0x68, 0x93, 0xf8, + 0x52, 0x24, 0x82, 0x70, 0x09, 0x68, 0x91, 0xf8, 0x53, 0x24, 0xc2, 0x70, + 0x10, 0xbd, 0x38, 0xb5, 0x05, 0x46, 0x00, 0x24, 0x29, 0x00, 0x30, 0xd0, + 0x00, 0x20, 0x06, 0xf0, 0xe3, 0xf9, 0x01, 0x20, 0x06, 0xf0, 0xe0, 0xf9, + 0x07, 0xf0, 0xad, 0xfa, 0x28, 0x46, 0x07, 0xf0, 0xad, 0xfd, 0x04, 0x00, + 0x23, 0xd1, 0x00, 0x20, 0x05, 0xf0, 0x0e, 0xfe, 0x04, 0x00, 0x1e, 0xd1, + 0xdf, 0xf8, 0x8c, 0x59, 0x28, 0x68, 0xd0, 0xf8, 0x5e, 0x20, 0xd0, 0xf8, + 0x62, 0x30, 0x00, 0x20, 0xff, 0xf7, 0x93, 0xff, 0x00, 0x21, 0x00, 0x20, + 0x05, 0xf0, 0x18, 0xff, 0x01, 0x20, 0x05, 0xf0, 0xfb, 0xfd, 0x04, 0x00, + 0x0b, 0xd1, 0x28, 0x68, 0xd0, 0xf8, 0x89, 0x20, 0xd0, 0xf8, 0x8d, 0x30, + 0x01, 0x20, 0xff, 0xf7, 0x82, 0xff, 0x00, 0x21, 0x01, 0x20, 0x05, 0xf0, + 0x07, 0xff, 0x20, 0x46, 0x32, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, 0x00, 0x28, + 0x4f, 0xf0, 0x00, 0x08, 0x64, 0xd0, 0x00, 0x20, 0x07, 0xf0, 0xd0, 0xfa, + 0x01, 0x20, 0x07, 0xf0, 0xcd, 0xfa, 0xdf, 0xf8, 0x38, 0x79, 0xdf, 0xf8, + 0x38, 0x59, 0x39, 0x68, 0xdf, 0xf8, 0x28, 0x69, 0x91, 0xf8, 0x85, 0x00, + 0x08, 0xb3, 0x31, 0x68, 0xd1, 0xf8, 0x5e, 0x20, 0xd1, 0xf8, 0x62, 0x30, + 0x00, 0x20, 0x07, 0xf0, 0xef, 0xf8, 0x5f, 0xea, 0x00, 0x08, 0x1c, 0xd1, + 0x00, 0xf0, 0x9b, 0xf8, 0x00, 0x22, 0x00, 0xf0, 0xc3, 0xf8, 0x5f, 0xea, + 0x00, 0x08, 0x02, 0xbf, 0x2c, 0x68, 0xe0, 0x78, 0x01, 0x28, 0x10, 0xd1, + 0x39, 0x68, 0x33, 0x68, 0x93, 0xf8, 0x79, 0x20, 0xd1, 0xe9, 0x00, 0x01, + 0x00, 0xf0, 0x4c, 0xf9, 0xc4, 0xe9, 0x02, 0x01, 0x05, 0xe0, 0x07, 0xf0, + 0xed, 0xfd, 0x01, 0x21, 0x00, 0x20, 0x05, 0xf0, 0xc7, 0xfe, 0x79, 0x68, + 0x91, 0xf8, 0x85, 0x00, 0x08, 0xb3, 0x31, 0x68, 0xd1, 0xf8, 0x89, 0x20, + 0xd1, 0xf8, 0x8d, 0x30, 0x01, 0x20, 0x07, 0xf0, 0xc3, 0xf8, 0x5f, 0xea, + 0x00, 0x08, 0x1d, 0xd1, 0x00, 0xf0, 0x69, 0xf8, 0x01, 0x22, 0x00, 0xf0, + 0x97, 0xf8, 0x5f, 0xea, 0x00, 0x08, 0x02, 0xbf, 0x2d, 0x68, 0x28, 0x79, + 0x01, 0x28, 0x11, 0xd1, 0x78, 0x68, 0x33, 0x68, 0x93, 0xf8, 0xa4, 0x20, + 0xd0, 0xe9, 0x00, 0x01, 0x00, 0xf0, 0x20, 0xf9, 0xc5, 0xe9, 0x04, 0x01, + 0x06, 0xe0, 0x01, 0x20, 0x07, 0xf0, 0xc0, 0xfd, 0x01, 0x21, 0x01, 0x20, + 0x05, 0xf0, 0x9a, 0xfe, 0x40, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x2d, 0xe9, + 0xf0, 0x41, 0xdf, 0xf8, 0x6c, 0x68, 0x05, 0x46, 0x30, 0x68, 0x90, 0xf8, + 0xa5, 0x70, 0x90, 0xf8, 0x7a, 0x80, 0x00, 0x24, 0x29, 0x00, 0x07, 0xf0, + 0x01, 0x07, 0x23, 0xd0, 0x02, 0x20, 0x07, 0xf0, 0xde, 0xfd, 0x04, 0x00, + 0x1e, 0xd1, 0x00, 0xf0, 0x3a, 0xf8, 0x00, 0x29, 0x08, 0xbf, 0x00, 0x28, + 0x07, 0xd0, 0x5f, 0xea, 0xc8, 0x70, 0x04, 0xd5, 0x00, 0x20, 0x07, 0xf0, + 0xd0, 0xfd, 0x04, 0x00, 0x0b, 0xd1, 0x00, 0xf0, 0x26, 0xf8, 0x00, 0x29, + 0x08, 0xbf, 0x00, 0x28, 0x06, 0xd0, 0x01, 0x2f, 0x04, 0xd1, 0x01, 0x20, + 0x07, 0xf0, 0xc3, 0xfd, 0x04, 0x46, 0x1c, 0xb9, 0x03, 0x20, 0x07, 0xf0, + 0xbe, 0xfd, 0x04, 0x46, 0x30, 0x68, 0x90, 0xf8, 0xa5, 0x60, 0x06, 0xf0, + 0x02, 0x06, 0x6d, 0xb1, 0x90, 0xf8, 0x7a, 0x00, 0x81, 0x07, 0x03, 0xd5, + 0x01, 0x21, 0x00, 0x20, 0x07, 0xf0, 0x88, 0xf9, 0x02, 0x2e, 0x03, 0xd1, + 0x01, 0x21, 0x01, 0x20, 0x07, 0xf0, 0x82, 0xf9, 0x20, 0x46, 0xbd, 0xe8, + 0xf0, 0x81, 0x32, 0x68, 0xd2, 0xf8, 0x89, 0x00, 0xd2, 0xf8, 0x8d, 0x10, + 0x70, 0x47, 0x32, 0x68, 0xd2, 0xf8, 0x5e, 0x00, 0xd2, 0xf8, 0x62, 0x10, + 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46, 0x07, 0xf0, 0x52, 0xff, 0xf0, 0xb9, + 0x20, 0x46, 0x08, 0xf0, 0x87, 0xfc, 0x20, 0x46, 0x08, 0xf0, 0xd4, 0xfc, + 0xb8, 0xb9, 0x20, 0x00, 0x06, 0xd0, 0x02, 0x20, 0x05, 0xf0, 0xfd, 0xfc, + 0x88, 0xb9, 0x06, 0xf0, 0x91, 0xf8, 0x70, 0xb9, 0x20, 0x46, 0x07, 0xf0, + 0x4d, 0xff, 0x50, 0xb9, 0x01, 0xf0, 0x3a, 0xfa, 0x20, 0x46, 0x07, 0xf0, + 0x26, 0xff, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x21, 0x09, 0xf0, + 0x2f, 0xb8, 0x10, 0xbd, 0x2d, 0xe9, 0xf0, 0x47, 0x17, 0x00, 0x16, 0x46, + 0x18, 0xbf, 0x01, 0x27, 0x02, 0x2e, 0x86, 0xb0, 0x29, 0xda, 0x81, 0x46, + 0x8a, 0x46, 0x00, 0xf0, 0xbb, 0xfb, 0x04, 0xac, 0x80, 0x46, 0x01, 0x94, + 0x02, 0xad, 0x00, 0x95, 0x4a, 0x46, 0x53, 0x46, 0x38, 0x46, 0x07, 0xf0, + 0x07, 0xfa, 0x4a, 0x46, 0x53, 0x46, 0x30, 0x46, 0xff, 0xf7, 0x77, 0xfe, + 0x41, 0x46, 0x38, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0x41, 0x46, 0x38, 0x46, + 0xc0, 0x46, 0xc0, 0x46, 0x00, 0xf0, 0x68, 0xf8, 0x5f, 0xea, 0x00, 0x09, + 0x03, 0xd1, 0x38, 0x46, 0x09, 0xf0, 0x62, 0xfb, 0x07, 0xe0, 0x00, 0x22, + 0x00, 0x23, 0x30, 0x46, 0xff, 0xf7, 0x61, 0xfe, 0x01, 0xe0, 0x4f, 0xf6, + 0x53, 0x79, 0x48, 0x46, 0x53, 0xe0, 0x2d, 0xe9, 0xf0, 0x47, 0x88, 0x46, + 0x5f, 0xea, 0x08, 0x07, 0x18, 0xbf, 0x01, 0x27, 0x45, 0x46, 0x02, 0x2d, + 0x86, 0xb0, 0x04, 0x46, 0x44, 0xda, 0x21, 0x46, 0x38, 0x46, 0x06, 0xf0, + 0x7a, 0xff, 0x06, 0x00, 0x33, 0xd1, 0xdf, 0xf8, 0xec, 0x06, 0x50, 0xf8, + 0x25, 0x20, 0x92, 0xf8, 0x39, 0x50, 0xa5, 0xfb, 0x04, 0x69, 0x4f, 0xf4, + 0x7a, 0x7a, 0xaa, 0xfb, 0x06, 0x45, 0x1a, 0xfb, 0x09, 0x55, 0x20, 0x46, + 0x29, 0x46, 0x52, 0x46, 0x00, 0xf0, 0x3c, 0xf8, 0x06, 0x46, 0x04, 0xa8, + 0x01, 0x90, 0x22, 0x46, 0x02, 0xa8, 0x00, 0x90, 0x2b, 0x46, 0x38, 0x46, + 0x07, 0xf0, 0xb8, 0xf9, 0x22, 0x46, 0x2b, 0x46, 0x40, 0x46, 0xff, 0xf7, + 0x28, 0xfe, 0x31, 0x46, 0x38, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0x31, 0x46, + 0x38, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0x00, 0xf0, 0x19, 0xf8, 0x06, 0x00, + 0x05, 0xd1, 0x22, 0x46, 0x2b, 0x46, 0x38, 0x46, 0x06, 0xf0, 0xa8, 0xff, + 0x06, 0x46, 0x1e, 0xb9, 0x38, 0x46, 0x09, 0xf0, 0x0d, 0xfb, 0x07, 0xe0, + 0x00, 0x22, 0x00, 0x23, 0x40, 0x46, 0xff, 0xf7, 0x0c, 0xfe, 0x01, 0xe0, + 0x4f, 0xf6, 0x53, 0x76, 0x30, 0x46, 0x06, 0xb0, 0xbd, 0xe8, 0xf0, 0x87, + 0x01, 0x20, 0x9d, 0xf8, 0x08, 0x10, 0x01, 0x90, 0xdd, 0xe9, 0x04, 0x23, + 0x00, 0x91, 0x38, 0x46, 0x06, 0xf0, 0x98, 0xbd, 0x00, 0x23, 0x05, 0xf0, + 0x99, 0xbb, 0x30, 0xb5, 0x03, 0x46, 0x00, 0x20, 0xdf, 0xf8, 0x5c, 0x46, + 0x1d, 0x00, 0x08, 0xbf, 0x23, 0x68, 0x02, 0xd0, 0x01, 0x2b, 0x0a, 0xd1, + 0x63, 0x68, 0x58, 0x33, 0x1c, 0x6d, 0x0c, 0x60, 0x93, 0xed, 0x00, 0x0a, + 0xbc, 0xee, 0xc0, 0x0a, 0x82, 0xed, 0x00, 0x0a, 0x30, 0xbd, 0x4f, 0xf6, + 0x53, 0x70, 0x30, 0xbd, 0xf8, 0xb5, 0x05, 0x46, 0x0e, 0x46, 0x17, 0x46, + 0x09, 0xf0, 0x5e, 0xfd, 0x04, 0x00, 0x04, 0xd1, 0x3a, 0x46, 0x31, 0x46, + 0x28, 0x46, 0x06, 0xf0, 0xd1, 0xfe, 0x20, 0x46, 0xf2, 0xbd, 0x30, 0xb5, + 0xdf, 0xf8, 0xec, 0x35, 0x1c, 0x68, 0x00, 0x22, 0x0d, 0x00, 0x04, 0xf1, + 0xe4, 0x03, 0x02, 0xd1, 0x19, 0x68, 0x5b, 0x7b, 0x03, 0xe0, 0x01, 0x29, + 0x05, 0xd1, 0x19, 0x69, 0x5b, 0x7f, 0xb1, 0xfb, 0xf3, 0xf3, 0x03, 0x60, + 0x01, 0xe0, 0x4f, 0xf6, 0x53, 0x72, 0x10, 0x46, 0x30, 0xbd, 0x70, 0xb5, + 0x04, 0x46, 0x0d, 0x46, 0x00, 0xf0, 0xa6, 0xfe, 0x06, 0x46, 0xe0, 0xb2, + 0x0a, 0xf0, 0xd9, 0xf8, 0x00, 0xee, 0x10, 0x0a, 0xf8, 0xee, 0x40, 0x0a, + 0xb0, 0xee, 0x00, 0x0a, 0x0a, 0xf0, 0xf0, 0xf8, 0xbc, 0xee, 0xc0, 0x0a, + 0x10, 0xee, 0x10, 0x0a, 0xb6, 0xfb, 0xf0, 0xf0, 0x28, 0x60, 0x00, 0x20, + 0x70, 0xbd, 0x10, 0xb5, 0x0c, 0x46, 0x00, 0xf0, 0x01, 0xf8, 0x06, 0xe0, + 0xc0, 0xb2, 0x07, 0xf0, 0xf9, 0xb9, 0x10, 0xb5, 0x0c, 0x46, 0x00, 0xf0, + 0x0a, 0xf8, 0xdf, 0xf8, 0x74, 0x15, 0x0a, 0x68, 0x02, 0xeb, 0x00, 0x10, + 0xd0, 0xf8, 0xe4, 0x10, 0x21, 0x60, 0x00, 0x20, 0x10, 0xbd, 0xc0, 0xb2, + 0x07, 0xf0, 0xff, 0xb9, 0x80, 0xb5, 0x00, 0x21, 0x20, 0xb1, 0x01, 0xf0, + 0x1d, 0xf9, 0x08, 0xf0, 0x52, 0xfe, 0x01, 0x46, 0x08, 0x46, 0x02, 0xbd, + 0x7c, 0xb5, 0x04, 0x46, 0x08, 0x2c, 0x0d, 0x46, 0x09, 0xd2, 0x69, 0x46, + 0xff, 0xf7, 0xd5, 0xff, 0x06, 0x46, 0x00, 0x99, 0xe0, 0xb2, 0x0a, 0xf0, + 0xcf, 0xfc, 0x28, 0x60, 0x01, 0xe0, 0x4f, 0xf6, 0x52, 0x76, 0x30, 0x46, + 0x76, 0xbd, 0x7c, 0xb5, 0x0d, 0x46, 0x04, 0x46, 0x69, 0x46, 0xff, 0xf7, + 0xcc, 0xff, 0x06, 0x46, 0x00, 0x99, 0xe0, 0xb2, 0x09, 0xf0, 0x1b, 0xfc, + 0x28, 0x60, 0x30, 0x46, 0x76, 0xbd, 0x80, 0xb5, 0xff, 0xf7, 0xbe, 0xff, + 0x02, 0xe0, 0x80, 0xb5, 0xff, 0xf7, 0xcb, 0xff, 0xbd, 0xe8, 0x02, 0x40, + 0x07, 0xf0, 0xbe, 0xbb, 0x10, 0xb5, 0x04, 0x46, 0x01, 0xf0, 0xe8, 0xf8, + 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x08, 0xf0, 0x75, 0xbe, 0x80, 0xb5, + 0x01, 0xf0, 0xe0, 0xf8, 0xbd, 0xe8, 0x01, 0x40, 0x08, 0xf0, 0x71, 0xbe, + 0x10, 0xb5, 0x04, 0x46, 0x0a, 0xf0, 0xdd, 0xfd, 0x03, 0xe0, 0x10, 0xb5, + 0x04, 0x46, 0x0a, 0xf0, 0xda, 0xfd, 0x00, 0xee, 0x10, 0x0a, 0xbb, 0xee, + 0x62, 0x0a, 0x84, 0xed, 0x00, 0x0a, 0x00, 0x20, 0x10, 0xbd, 0x10, 0xb5, + 0xdf, 0xf8, 0xd0, 0x44, 0x20, 0x78, 0x20, 0xb1, 0x00, 0xf0, 0x05, 0xf8, + 0x60, 0x70, 0x00, 0x20, 0x20, 0x70, 0x60, 0x78, 0x10, 0xbd, 0x10, 0xb5, + 0x00, 0xf0, 0x1d, 0xf8, 0x00, 0x24, 0x20, 0xb9, 0xff, 0x22, 0x00, 0x21, + 0xdf, 0xf8, 0xb0, 0x04, 0x03, 0xe0, 0xff, 0x22, 0x00, 0x21, 0xdf, 0xf8, + 0xac, 0x04, 0xff, 0xf7, 0xff, 0xfc, 0x01, 0x28, 0x08, 0xbf, 0x01, 0x24, + 0x20, 0x46, 0x10, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x08, 0xf8, 0xdf, 0xf8, + 0x98, 0x14, 0x08, 0x60, 0x01, 0xbd, 0xdf, 0xf8, 0x90, 0x04, 0x00, 0x68, + 0x70, 0x47, 0x04, 0x21, 0x00, 0x20, 0x0a, 0x68, 0x12, 0x0e, 0x01, 0x2a, + 0x18, 0xbf, 0x01, 0x20, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, 0x07, 0x46, + 0xdf, 0xf8, 0x70, 0x04, 0xd0, 0xf8, 0x00, 0xb0, 0x01, 0x25, 0x88, 0x46, + 0x92, 0x46, 0x0a, 0xf0, 0xf7, 0xfe, 0x47, 0xf8, 0x2b, 0x50, 0xcb, 0xf1, + 0x00, 0x0b, 0x81, 0x46, 0x00, 0x26, 0x00, 0x24, 0x07, 0xeb, 0x8b, 0x07, + 0x78, 0x68, 0x01, 0x28, 0x0e, 0xd0, 0x6c, 0xb9, 0x49, 0x46, 0x50, 0x46, + 0x0a, 0xf0, 0x35, 0xff, 0x08, 0xb1, 0x01, 0x24, 0x00, 0x25, 0xb8, 0xf1, + 0x00, 0x0f, 0x01, 0xd0, 0xc0, 0x47, 0x06, 0x46, 0x00, 0x2e, 0xed, 0xd0, + 0x00, 0x20, 0x78, 0x60, 0x28, 0x46, 0xbd, 0xe8, 0xf2, 0x8f, 0xfe, 0xb5, + 0xff, 0xf7, 0x9d, 0xff, 0x04, 0x46, 0xdf, 0xf8, 0x18, 0x04, 0xdf, 0xf8, + 0xe0, 0x63, 0x05, 0x68, 0xdf, 0xf8, 0x10, 0x04, 0x70, 0x60, 0x21, 0x00, + 0x04, 0xd0, 0x00, 0x68, 0x4f, 0xf4, 0x00, 0x71, 0x05, 0xf0, 0x36, 0xfa, + 0xdf, 0xf8, 0x00, 0x04, 0xdf, 0xf8, 0xcc, 0x23, 0x00, 0x68, 0x30, 0x60, + 0x00, 0xf5, 0x72, 0x71, 0x11, 0x60, 0x00, 0x21, 0xdf, 0xf8, 0xb8, 0x23, + 0xb0, 0x23, 0x4b, 0x43, 0x03, 0x44, 0x03, 0xf5, 0x84, 0x77, 0x42, 0xf8, + 0x21, 0x70, 0x49, 0x1c, 0x04, 0x29, 0xf5, 0xd3, 0x21, 0x00, 0x1c, 0xbf, + 0x4f, 0xf4, 0x8b, 0x61, 0x04, 0xf0, 0xd8, 0xfc, 0x29, 0x46, 0x20, 0x46, + 0x00, 0xf0, 0x8c, 0xfd, 0x03, 0x22, 0x06, 0x21, 0x0a, 0xf0, 0x44, 0xff, + 0x20, 0x46, 0x07, 0xf0, 0xda, 0xfc, 0x20, 0x46, 0x0a, 0xf0, 0x62, 0xff, + 0x20, 0x46, 0x00, 0xf0, 0x9c, 0xff, 0x03, 0x22, 0x11, 0x21, 0x0a, 0xf0, + 0x37, 0xff, 0x0f, 0xf2, 0xe0, 0x32, 0xff, 0x21, 0x03, 0x20, 0x01, 0xf0, + 0x38, 0xf8, 0x0b, 0xf0, 0xd3, 0xf8, 0x0b, 0xf0, 0xa9, 0xf9, 0x20, 0x46, + 0x0b, 0xf0, 0xba, 0xfa, 0x20, 0x46, 0x0b, 0xf0, 0xec, 0xfa, 0x20, 0x46, + 0x0b, 0xf0, 0xe4, 0xfb, 0x03, 0x22, 0x09, 0x21, 0x0a, 0xf0, 0x20, 0xff, + 0x20, 0x46, 0xff, 0xf7, 0x62, 0xfd, 0x03, 0x22, 0x09, 0x21, 0x0a, 0xf0, + 0x19, 0xff, 0x20, 0x46, 0xf2, 0xf7, 0x20, 0xfd, 0x03, 0x22, 0x12, 0x21, + 0x0a, 0xf0, 0x12, 0xff, 0x20, 0x46, 0xff, 0xf7, 0xaa, 0xfd, 0x03, 0x22, + 0x07, 0x21, 0x0a, 0xf0, 0x0b, 0xff, 0x0b, 0xf0, 0x9e, 0xfc, 0x03, 0x22, + 0x1a, 0x21, 0x0a, 0xf0, 0x05, 0xff, 0x0b, 0xf0, 0xfd, 0xfe, 0x03, 0x22, + 0x13, 0x21, 0x0a, 0xf0, 0xff, 0xfe, 0x0b, 0xf0, 0x1c, 0xff, 0x03, 0x22, + 0x13, 0x21, 0x0a, 0xf0, 0xf9, 0xfe, 0x0b, 0xf0, 0xc7, 0xff, 0x03, 0x22, + 0x15, 0x21, 0x0a, 0xf0, 0xf3, 0xfe, 0x01, 0x21, 0x7c, 0x20, 0x0c, 0xf0, + 0x95, 0xfb, 0x0b, 0xf0, 0x53, 0xff, 0x03, 0x22, 0x14, 0x21, 0x0a, 0xf0, + 0xe9, 0xfe, 0x06, 0xf1, 0x08, 0x01, 0x00, 0x20, 0x0a, 0xf0, 0x1e, 0xfc, + 0x03, 0x00, 0x05, 0xd0, 0x0f, 0xf2, 0x4c, 0x32, 0x00, 0x21, 0x02, 0x20, + 0x00, 0xf0, 0xe3, 0xff, 0x0c, 0xf0, 0xda, 0xfe, 0x03, 0x22, 0x16, 0x21, + 0x0a, 0xf0, 0xd6, 0xfe, 0x0d, 0xf0, 0x33, 0xf9, 0x20, 0x46, 0x0d, 0xf0, + 0x4b, 0xfa, 0x4b, 0xf2, 0x04, 0x13, 0x98, 0x42, 0x03, 0xd1, 0x03, 0x22, + 0x05, 0x21, 0x18, 0x46, 0x01, 0xe0, 0x03, 0x22, 0x0e, 0x21, 0x0a, 0xf0, + 0xc5, 0xfe, 0xc0, 0x46, 0xc0, 0x46, 0x0d, 0xf0, 0x35, 0xfd, 0x0d, 0xf0, + 0x77, 0xff, 0x20, 0x46, 0xff, 0xf7, 0x5b, 0xfc, 0x03, 0x22, 0x17, 0x21, + 0x0a, 0xf0, 0xb8, 0xfe, 0x20, 0x46, 0x02, 0xf0, 0xbd, 0xfb, 0x03, 0x22, + 0x08, 0x21, 0x0a, 0xf0, 0xb1, 0xfe, 0x20, 0x00, 0x31, 0xd0, 0x6e, 0x1e, + 0xb6, 0x41, 0xf6, 0x0f, 0x00, 0x96, 0x2b, 0x46, 0x0f, 0xf2, 0xac, 0x22, + 0xff, 0x21, 0x00, 0xf0, 0x2a, 0xf9, 0xff, 0xf7, 0xc8, 0xfe, 0x08, 0xb1, + 0x0d, 0xf0, 0xee, 0xff, 0x02, 0x21, 0x28, 0x46, 0x0e, 0xf0, 0x57, 0xfb, + 0x00, 0x21, 0x30, 0x46, 0x0e, 0xf0, 0x53, 0xfb, 0x01, 0x23, 0xff, 0x22, + 0x00, 0x21, 0xdf, 0xf8, 0x60, 0x02, 0xff, 0xf7, 0xd6, 0xfb, 0x06, 0xe0, + 0x28, 0xb1, 0x01, 0x46, 0x03, 0x22, 0x4f, 0xf6, 0x58, 0x70, 0x0a, 0xf0, + 0x89, 0xfe, 0x01, 0xa9, 0x30, 0x46, 0x0e, 0xf0, 0x55, 0xfb, 0x03, 0x22, + 0x03, 0x21, 0x0a, 0xf0, 0x81, 0xfe, 0x9d, 0xf8, 0x04, 0x00, 0x01, 0x28, + 0xec, 0xd1, 0x0f, 0xf2, 0xa0, 0x22, 0xff, 0x21, 0x03, 0x20, 0x00, 0xf0, + 0x7e, 0xff, 0x20, 0x46, 0x0c, 0xf0, 0x38, 0xff, 0x20, 0x46, 0xff, 0xf7, + 0x3f, 0xfe, 0x03, 0x22, 0x0f, 0x21, 0x0a, 0xf0, 0x6d, 0xfe, 0x0b, 0xf0, + 0x71, 0xff, 0x03, 0x22, 0x1e, 0x21, 0x0a, 0xf0, 0x67, 0xfe, 0x0e, 0xf0, + 0x8d, 0xfb, 0x04, 0x46, 0x03, 0x22, 0x10, 0x21, 0x0a, 0xf0, 0x60, 0xfe, + 0x20, 0x46, 0xfe, 0xbd, 0x1c, 0xb5, 0x0a, 0xf0, 0xe7, 0xff, 0x1c, 0x24, + 0x18, 0xb9, 0x00, 0x21, 0x0f, 0xf0, 0xf6, 0xf9, 0x04, 0x46, 0xdf, 0xf8, + 0xd4, 0x11, 0x08, 0x68, 0x8d, 0xf8, 0x00, 0x40, 0x00, 0x28, 0x0c, 0xbf, + 0xc0, 0x20, 0xc1, 0x20, 0x8d, 0xf8, 0x03, 0x00, 0x00, 0x21, 0x8d, 0xf8, + 0x01, 0x10, 0x8d, 0xf8, 0x02, 0x10, 0x00, 0x98, 0x16, 0xbd, 0x01, 0x46, + 0x02, 0x29, 0xdf, 0xf8, 0xbc, 0x01, 0x04, 0xd0, 0x0b, 0xd3, 0x04, 0x29, + 0x07, 0xd0, 0x03, 0xd3, 0x70, 0x47, 0xdf, 0xf8, 0xb0, 0x01, 0x70, 0x47, + 0xdf, 0xf8, 0xac, 0x01, 0x70, 0x47, 0xdf, 0xf8, 0xac, 0x01, 0x70, 0x47, + 0x2d, 0xe9, 0xf0, 0x47, 0x88, 0x46, 0x17, 0x46, 0xff, 0xf7, 0xe7, 0xff, + 0x00, 0x24, 0xb9, 0x46, 0x4f, 0xf6, 0x63, 0x7a, 0x05, 0x46, 0xdf, 0xf8, + 0x94, 0x61, 0xb9, 0xf1, 0x04, 0x0f, 0x03, 0xda, 0x72, 0xb6, 0x30, 0x68, + 0x40, 0x1c, 0x30, 0x60, 0x14, 0xb9, 0xff, 0xf7, 0xbb, 0xff, 0x04, 0x46, + 0x29, 0x68, 0xa9, 0xb1, 0xb9, 0xf1, 0x04, 0x0f, 0x04, 0xda, 0x30, 0x68, + 0x40, 0x1e, 0x30, 0x60, 0x00, 0xd1, 0x62, 0xb6, 0xa1, 0x42, 0x18, 0xd0, + 0x5f, 0xea, 0x08, 0x00, 0x0b, 0xd0, 0xb7, 0xf5, 0x7a, 0x7f, 0x0b, 0xdb, + 0x01, 0x20, 0x0f, 0xf0, 0xe5, 0xfa, 0xa7, 0xf5, 0x7a, 0x77, 0x12, 0xe0, + 0x2c, 0x60, 0x4f, 0xf0, 0x00, 0x0a, 0x50, 0x46, 0xbd, 0xe8, 0xf0, 0x87, + 0x00, 0x2f, 0x0a, 0xd4, 0x01, 0x20, 0x0f, 0xf0, 0xd5, 0xfa, 0x7f, 0x1e, + 0x05, 0xe0, 0x03, 0x22, 0x4f, 0xf6, 0x65, 0x71, 0x01, 0x20, 0x0e, 0xf0, + 0x6b, 0xfa, 0x00, 0x2f, 0xc7, 0xd5, 0xec, 0xe7, 0x70, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0xff, 0xf7, 0x87, 0xff, 0x06, 0x46, 0x20, 0x46, 0xff, 0xf7, + 0x9e, 0xff, 0xdf, 0xf8, 0x0c, 0x41, 0x01, 0x68, 0xb1, 0x42, 0x08, 0xd0, + 0x00, 0xf0, 0x0d, 0xf8, 0x03, 0x22, 0x4f, 0xf6, 0x66, 0x71, 0x01, 0x20, + 0x0e, 0xf0, 0x52, 0xfa, 0x01, 0xe0, 0x00, 0x21, 0x01, 0x60, 0x00, 0xf0, + 0x02, 0xf8, 0x00, 0x20, 0x70, 0xbd, 0x04, 0x2d, 0x04, 0xda, 0x20, 0x68, + 0x40, 0x1e, 0x20, 0x60, 0x00, 0xd1, 0x62, 0xb6, 0x70, 0x47, 0x7c, 0xb5, + 0xff, 0xf7, 0xf3, 0xfd, 0x06, 0x46, 0xff, 0xf7, 0x10, 0xfe, 0x04, 0x46, + 0x01, 0x2e, 0xdf, 0xf8, 0xc8, 0x50, 0xdf, 0xf8, 0xac, 0x00, 0x21, 0xd1, + 0x00, 0x23, 0xff, 0x22, 0x00, 0x21, 0xff, 0xf7, 0xf8, 0xfa, 0x28, 0x68, + 0x00, 0x2c, 0x0c, 0xbf, 0xdf, 0xf8, 0xb0, 0x60, 0xdf, 0xf8, 0xb0, 0x60, + 0xb0, 0xf1, 0x55, 0x3f, 0x05, 0xd1, 0x01, 0x23, 0x80, 0x22, 0x07, 0x21, + 0x30, 0x46, 0xff, 0xf7, 0xe8, 0xfa, 0x00, 0x23, 0x08, 0x22, 0x03, 0x21, + 0x30, 0x46, 0xff, 0xf7, 0xe2, 0xfa, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, + 0x30, 0x46, 0xff, 0xf7, 0xdc, 0xfa, 0x04, 0xe0, 0x01, 0x78, 0x00, 0x91, + 0x00, 0x99, 0x00, 0x29, 0xfa, 0xd0, 0x28, 0x68, 0xb0, 0xf1, 0x55, 0x3f, + 0x07, 0xd1, 0x00, 0x21, 0x29, 0x60, 0x20, 0x46, 0x0a, 0x21, 0x0e, 0xf0, + 0x42, 0xfa, 0x30, 0xbf, 0xfd, 0xe7, 0x73, 0xbd, 0x9c, 0x65, 0x02, 0x20, + 0xb4, 0x76, 0x02, 0x20, 0x20, 0x76, 0x02, 0x20, 0x80, 0x77, 0x02, 0x20, + 0xb7, 0x21, 0x03, 0x20, 0x00, 0xf0, 0x7f, 0xbe, 0x4f, 0xf4, 0x7a, 0x72, + 0x00, 0x23, 0x05, 0xf0, 0x67, 0xb8, 0x00, 0x00, 0x20, 0x76, 0x02, 0x20, + 0x98, 0x90, 0x00, 0x20, 0x10, 0x02, 0x00, 0x47, 0x11, 0x02, 0x00, 0x47, + 0xc0, 0x67, 0x03, 0x20, 0x04, 0x05, 0x00, 0x01, 0x74, 0x04, 0x00, 0x01, + 0x12, 0x02, 0x00, 0x47, 0x00, 0x00, 0x50, 0x46, 0x00, 0x00, 0x51, 0x46, + 0x00, 0x00, 0x52, 0x46, 0x00, 0x00, 0x53, 0x46, 0x7c, 0x77, 0x02, 0x20, + 0x7c, 0x4e, 0x03, 0x20, 0xc6, 0x00, 0x00, 0x47, 0x22, 0x00, 0x00, 0x47, + 0x43, 0x50, 0x55, 0x25, 0x64, 0x3a, 0x20, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x69, 0x6e, 0x67, 0x20, 0x43, 0x50, 0x55, 0x25, 0x64, 0x0a, 0x00, 0x00, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x48, 0x61, 0x6c, + 0x53, 0x79, 0x73, 0x5f, 0x49, 0x6e, 0x69, 0x74, 0x28, 0x29, 0x0a, 0x00, + 0x52, 0x43, 0x20, 0x54, 0x75, 0x6e, 0x65, 0x72, 0x20, 0x43, 0x61, 0x6c, + 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, + 0x78, 0x0a, 0x00, 0x00, 0x4c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x54, 0x58, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x0a, 0x00, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x78, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x70, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0xfe, 0xb5, 0xdf, 0xf8, + 0x0c, 0x16, 0xdf, 0xf8, 0x0c, 0x56, 0x0a, 0x68, 0x02, 0xf5, 0x7c, 0x71, + 0x00, 0x24, 0x69, 0x60, 0x88, 0xb1, 0x00, 0x20, 0x00, 0x27, 0x00, 0x26, + 0x01, 0xeb, 0x40, 0x02, 0xdf, 0xf8, 0xf4, 0x35, 0x13, 0x80, 0x16, 0x83, + 0x0b, 0x18, 0x40, 0x1c, 0x83, 0xf8, 0x30, 0x70, 0x96, 0x87, 0x0c, 0x28, + 0x83, 0xf8, 0x54, 0x40, 0xf0, 0xd3, 0x00, 0x26, 0x30, 0x46, 0x00, 0xf0, + 0xff, 0xfc, 0xff, 0x28, 0x0f, 0xd0, 0xf0, 0xb2, 0x00, 0xf0, 0xbb, 0xf9, + 0xf0, 0xb2, 0x00, 0xf0, 0x6c, 0xfa, 0xf0, 0xb2, 0x00, 0xf0, 0x9a, 0xfa, + 0xf0, 0xb2, 0x00, 0xf0, 0x95, 0xf8, 0x04, 0x46, 0xf0, 0xb2, 0x00, 0xf0, + 0x81, 0xf9, 0x76, 0x1c, 0x08, 0x2e, 0xe7, 0xd3, 0x05, 0xf1, 0x08, 0x00, + 0x0f, 0xf2, 0x65, 0x11, 0x01, 0x90, 0x00, 0x91, 0x00, 0x23, 0x01, 0x22, + 0x4f, 0xf4, 0x7a, 0x71, 0x0f, 0xf2, 0xa0, 0x50, 0x0f, 0xf0, 0xf2, 0xf9, + 0x28, 0x60, 0x00, 0xf0, 0xe6, 0xf8, 0x20, 0x46, 0xfe, 0xbd, 0x70, 0xb5, + 0xdf, 0xf8, 0x84, 0x15, 0x51, 0xf8, 0x20, 0x40, 0xdf, 0xf8, 0x74, 0x15, + 0x49, 0x68, 0x00, 0x25, 0x00, 0x29, 0x2f, 0xd0, 0x01, 0xeb, 0x40, 0x01, + 0x08, 0x28, 0x0d, 0x83, 0x2b, 0x46, 0x0f, 0xdb, 0x7f, 0x22, 0x00, 0x21, + 0x04, 0xf1, 0xb7, 0x00, 0xff, 0xf7, 0x92, 0xff, 0x04, 0xf1, 0xb4, 0x06, + 0x00, 0xf0, 0x24, 0xf8, 0x03, 0x23, 0x07, 0x22, 0x00, 0x21, 0x04, 0xf1, + 0xc1, 0x00, 0x0e, 0xe0, 0x7f, 0x22, 0x00, 0x21, 0x04, 0xf1, 0x43, 0x00, + 0xff, 0xf7, 0x82, 0xff, 0x04, 0xf1, 0x40, 0x06, 0x00, 0xf0, 0x14, 0xf8, + 0x03, 0x23, 0x07, 0x22, 0x00, 0x21, 0x04, 0xf1, 0x4d, 0x00, 0xff, 0xf7, + 0x77, 0xff, 0x00, 0x23, 0x00, 0xf0, 0x0b, 0xf8, 0x00, 0xf0, 0x4d, 0xf9, + 0x30, 0x46, 0xff, 0xf7, 0x6f, 0xff, 0x01, 0xe0, 0x4f, 0xf6, 0x0a, 0x75, + 0x28, 0x46, 0x70, 0xbd, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x30, 0x46, + 0x64, 0xe7, 0x70, 0xb5, 0x04, 0x46, 0xdf, 0xf8, 0xfc, 0x04, 0x25, 0x46, + 0x50, 0xf8, 0x25, 0x60, 0x11, 0xb9, 0x20, 0x46, 0x00, 0xf0, 0xa3, 0xf8, + 0x20, 0x46, 0x00, 0xf0, 0x36, 0xf9, 0x08, 0x2d, 0x10, 0xdb, 0x00, 0x23, + 0x7f, 0x22, 0x00, 0x21, 0x06, 0xf1, 0xb7, 0x00, 0xff, 0xf7, 0x4e, 0xff, + 0x06, 0xf1, 0xb4, 0x04, 0x00, 0xf0, 0x19, 0xfa, 0x00, 0x23, 0x07, 0x22, + 0x00, 0x21, 0x06, 0xf1, 0xc1, 0x00, 0x0f, 0xe0, 0x00, 0x23, 0x7f, 0x22, + 0x00, 0x21, 0x06, 0xf1, 0x43, 0x00, 0xff, 0xf7, 0x3d, 0xff, 0x06, 0xf1, + 0x40, 0x04, 0x00, 0xf0, 0x08, 0xfa, 0x00, 0x23, 0x07, 0x22, 0x00, 0x21, + 0x06, 0xf1, 0x4d, 0x00, 0xff, 0xf7, 0x32, 0xff, 0x20, 0x46, 0xbd, 0xe8, + 0x70, 0x40, 0xe9, 0xe1, 0xf8, 0xb5, 0xdf, 0xf8, 0x88, 0x54, 0x04, 0x46, + 0x68, 0x68, 0x00, 0xf1, 0x54, 0x01, 0x54, 0x30, 0x0f, 0x5d, 0x01, 0x22, + 0x02, 0x55, 0x20, 0x46, 0xff, 0xf7, 0x77, 0xff, 0x20, 0x46, 0x00, 0xf0, + 0xb9, 0xf8, 0x06, 0x46, 0x31, 0x46, 0x20, 0x46, 0xff, 0xf7, 0xb3, 0xff, + 0x68, 0x68, 0x00, 0xf1, 0x54, 0x01, 0x30, 0x46, 0x0f, 0x55, 0xf2, 0xbd, + 0x10, 0xb5, 0x04, 0x46, 0x00, 0xf0, 0x1d, 0xfa, 0x01, 0x28, 0x20, 0x46, + 0xbd, 0xe8, 0x10, 0x40, 0x0c, 0xbf, 0x00, 0x21, 0x01, 0x21, 0x0e, 0xe2, + 0x38, 0xb5, 0xff, 0xf7, 0x48, 0xfc, 0x04, 0x46, 0x00, 0x25, 0xe8, 0xb2, + 0x00, 0xf0, 0x60, 0xf9, 0x01, 0x28, 0x16, 0xd1, 0x08, 0x2d, 0x18, 0xd3, + 0xbc, 0xb1, 0xe8, 0xb2, 0x00, 0xf0, 0x05, 0xfa, 0x01, 0x28, 0x1c, 0xd0, + 0xe8, 0xb2, 0x00, 0xf0, 0x3a, 0xf8, 0xe8, 0xb2, 0x00, 0xf0, 0x91, 0xf9, + 0xe8, 0xb2, 0x00, 0xf0, 0xbf, 0xf9, 0xe8, 0xb2, 0xff, 0xf7, 0x3f, 0xff, + 0xe8, 0xb2, 0xff, 0xf7, 0xd3, 0xff, 0x6d, 0x1c, 0x0c, 0x2d, 0xe0, 0xd3, + 0x31, 0xbd, 0x28, 0x46, 0x00, 0xf0, 0x0c, 0xfc, 0xff, 0x28, 0xf6, 0xd0, + 0xe8, 0xb2, 0x00, 0xf0, 0xe8, 0xf9, 0x01, 0x28, 0xe2, 0xd1, 0x00, 0x21, + 0xe8, 0xb2, 0xff, 0xf7, 0x6e, 0xff, 0xe8, 0xb2, 0x00, 0xf0, 0x92, 0xf8, + 0xe6, 0xe7, 0x80, 0xb5, 0x00, 0x20, 0x00, 0x90, 0x00, 0x23, 0xdf, 0xf8, + 0xc4, 0x03, 0x00, 0x68, 0x00, 0x22, 0x03, 0x21, 0x0a, 0xe0, 0x80, 0xb5, + 0x0e, 0xf0, 0x69, 0xfd, 0x02, 0x46, 0x00, 0x21, 0xdf, 0xf8, 0xac, 0x03, + 0x00, 0x68, 0x00, 0x91, 0x00, 0x23, 0x01, 0x21, 0x0f, 0xf0, 0x14, 0xf9, + 0x01, 0xbd, 0x38, 0xb5, 0xdf, 0xf8, 0xa0, 0x13, 0xdf, 0xf8, 0x94, 0x43, + 0x51, 0xf8, 0x20, 0x30, 0x00, 0x21, 0xad, 0xf8, 0x00, 0x10, 0x62, 0x68, + 0x00, 0x2a, 0x2f, 0xd0, 0x08, 0x28, 0xac, 0xbf, 0x03, 0xf1, 0xb4, 0x04, + 0x03, 0xf1, 0x40, 0x04, 0x24, 0x78, 0xc4, 0xf3, 0x00, 0x14, 0x3c, 0xb3, + 0x08, 0x28, 0x03, 0xdb, 0x03, 0xf1, 0xb5, 0x04, 0xb6, 0x33, 0x02, 0xe0, + 0x03, 0xf1, 0x41, 0x04, 0x42, 0x33, 0x25, 0x78, 0x1c, 0x78, 0x04, 0xf0, + 0x0f, 0x04, 0x44, 0xea, 0x05, 0x14, 0x02, 0xeb, 0x40, 0x05, 0x23, 0x05, + 0xac, 0x87, 0x48, 0xbf, 0x44, 0xf4, 0x70, 0x44, 0x2b, 0x8b, 0xe4, 0x1a, + 0x02, 0x44, 0xad, 0xf8, 0x00, 0x40, 0x92, 0xf8, 0x54, 0x00, 0x00, 0x28, + 0x19, 0xbf, 0xbd, 0xf8, 0x00, 0x20, 0x2a, 0x83, 0xbd, 0xf8, 0x00, 0x00, + 0x28, 0x80, 0x01, 0xe0, 0x4f, 0xf6, 0x0a, 0x71, 0x08, 0x46, 0x32, 0xbd, + 0xc6, 0x49, 0x49, 0x68, 0x02, 0x46, 0x31, 0xf9, 0x12, 0x20, 0x49, 0xb1, + 0x46, 0xf2, 0xf4, 0x51, 0x89, 0x1a, 0xc5, 0x48, 0x01, 0xfb, 0x02, 0x02, + 0x42, 0xf2, 0x10, 0x73, 0x92, 0xfb, 0xf3, 0xf0, 0x00, 0xb2, 0x70, 0x47, + 0x2d, 0xe9, 0xf8, 0x43, 0x05, 0x46, 0xbe, 0x48, 0x2e, 0x46, 0x50, 0xf8, + 0x26, 0x80, 0x00, 0x27, 0x01, 0x24, 0xb9, 0x46, 0x01, 0x20, 0x0a, 0xf0, + 0x4b, 0xfe, 0x08, 0x2e, 0xac, 0xbf, 0x08, 0xf1, 0xb4, 0x00, 0x08, 0xf1, + 0x40, 0x00, 0x00, 0x78, 0xc0, 0xf3, 0x00, 0x10, 0x00, 0xb1, 0x00, 0x24, + 0x09, 0xf1, 0x01, 0x09, 0xb9, 0xf5, 0x7a, 0x7f, 0x04, 0xd2, 0x00, 0x2c, + 0xea, 0xd1, 0x38, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0x05, 0xf5, 0x36, 0x45, + 0xaf, 0x1c, 0xf8, 0xe7, 0x70, 0xb5, 0x04, 0x46, 0xab, 0x49, 0x26, 0x46, + 0x51, 0xf8, 0x26, 0x50, 0x00, 0xf0, 0x15, 0xf8, 0x20, 0x46, 0x00, 0xf0, + 0xd6, 0xf8, 0x08, 0x2e, 0x04, 0xdb, 0x00, 0xf0, 0x0a, 0xf8, 0x05, 0xf1, + 0xb4, 0x00, 0x03, 0xe0, 0x00, 0xf0, 0x05, 0xf8, 0x05, 0xf1, 0x40, 0x00, + 0xbd, 0xe8, 0x70, 0x40, 0x24, 0xe6, 0x01, 0x23, 0x02, 0x22, 0x01, 0x21, + 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, 0xe3, 0xf8, 0x05, 0xdb, 0x00, 0x23, + 0x02, 0x22, 0x01, 0x21, 0x04, 0xf1, 0xb4, 0x00, 0x04, 0xe0, 0x00, 0x23, + 0x02, 0x22, 0x01, 0x21, 0x04, 0xf1, 0x40, 0x00, 0x16, 0xe1, 0x2d, 0xe9, + 0xf0, 0x41, 0x00, 0xf0, 0xa7, 0xf8, 0x4f, 0xd0, 0x08, 0x2c, 0x1c, 0xdb, + 0x05, 0xf1, 0xb9, 0x08, 0x00, 0xf0, 0x63, 0xf8, 0x00, 0xf0, 0x5c, 0xf8, + 0x00, 0xf0, 0x55, 0xf8, 0x00, 0xf0, 0x4e, 0xf8, 0x00, 0xf0, 0x47, 0xf8, + 0x0f, 0x23, 0x0f, 0x22, 0x00, 0x21, 0x05, 0xf1, 0xc0, 0x00, 0xff, 0xf7, + 0xf7, 0xfd, 0x05, 0xf1, 0xc7, 0x01, 0x40, 0x20, 0x05, 0xf1, 0xc8, 0x03, + 0x08, 0x70, 0x0b, 0x22, 0x1a, 0x70, 0xc3, 0x35, 0x21, 0xe0, 0x05, 0xf1, + 0x45, 0x08, 0x00, 0xf0, 0x46, 0xf8, 0x00, 0xf0, 0x3f, 0xf8, 0x00, 0xf0, + 0x38, 0xf8, 0x00, 0xf0, 0x31, 0xf8, 0x00, 0xf0, 0x2a, 0xf8, 0x0f, 0x23, + 0x0f, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x4c, 0x00, 0xff, 0xf7, 0xda, 0xfd, + 0x40, 0x23, 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x53, 0x00, 0xff, 0xf7, + 0xd3, 0xfd, 0x0b, 0x23, 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x54, 0x00, + 0xff, 0xf7, 0xcc, 0xfd, 0x4f, 0x35, 0x03, 0x23, 0x1c, 0x22, 0x00, 0xf0, + 0x5e, 0xf8, 0x02, 0x23, 0xe0, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x5a, 0xf8, + 0x79, 0x68, 0x21, 0x44, 0x01, 0x20, 0x81, 0xf8, 0x30, 0x00, 0x01, 0xe0, + 0x4f, 0xf6, 0x0a, 0x76, 0x30, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x01, 0x23, + 0x02, 0x22, 0x01, 0x21, 0x40, 0x46, 0xb1, 0xe5, 0x00, 0x23, 0x10, 0x22, + 0x04, 0x21, 0x40, 0x46, 0xac, 0xe5, 0x00, 0x23, 0x08, 0x22, 0x03, 0x21, + 0x40, 0x46, 0xa7, 0xe5, 0x00, 0x23, 0x04, 0x22, 0x02, 0x21, 0x40, 0x46, + 0xa2, 0xe5, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x40, 0x46, 0x9d, 0xe5, + 0x5a, 0x49, 0x49, 0x68, 0x02, 0x46, 0x00, 0x20, 0x00, 0x29, 0x1f, 0xbf, + 0x89, 0x18, 0x91, 0xf8, 0x30, 0x10, 0x00, 0x29, 0x01, 0x20, 0x70, 0x47, + 0xf8, 0xb5, 0x00, 0xf0, 0x29, 0xf8, 0x20, 0xd0, 0x08, 0x2c, 0xac, 0xbf, + 0xb9, 0x35, 0x45, 0x35, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, + 0x1d, 0xf8, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x18, 0xf8, + 0x01, 0x23, 0x10, 0x22, 0x04, 0x21, 0x00, 0xf0, 0x13, 0xf8, 0x01, 0x23, + 0x04, 0x22, 0x00, 0xf0, 0x0e, 0xf8, 0x01, 0x23, 0x08, 0x22, 0x03, 0x21, + 0x00, 0xf0, 0x0a, 0xf8, 0x79, 0x68, 0x21, 0x44, 0x81, 0xf8, 0x30, 0x60, + 0x01, 0xe0, 0x4f, 0xf6, 0x0a, 0x76, 0x30, 0x46, 0xf2, 0xbd, 0x02, 0x21, + 0x28, 0x46, 0x65, 0xe5, 0x04, 0x46, 0x40, 0x48, 0x3d, 0x4f, 0x50, 0xf8, + 0x24, 0x50, 0x78, 0x68, 0x00, 0x26, 0x00, 0x28, 0x70, 0x47, 0x38, 0xb5, + 0x00, 0xf0, 0x1f, 0xf8, 0x07, 0xdb, 0x04, 0xf1, 0xb9, 0x05, 0x00, 0xf0, + 0x15, 0xf8, 0x00, 0xf0, 0x1d, 0xf8, 0xb4, 0x34, 0x06, 0xe0, 0x04, 0xf1, + 0x45, 0x05, 0x00, 0xf0, 0x0d, 0xf8, 0x00, 0xf0, 0x15, 0xf8, 0x40, 0x34, + 0x00, 0xf0, 0x17, 0xf8, 0x20, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, + 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x3f, 0xe5, 0x01, 0x23, 0x80, 0x22, + 0x07, 0x21, 0x28, 0x46, 0x3a, 0xe5, 0x2b, 0x49, 0x51, 0xf8, 0x20, 0x40, + 0x08, 0x28, 0x70, 0x47, 0x00, 0x23, 0x80, 0x22, 0x07, 0x21, 0x28, 0x46, + 0x30, 0xe5, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x20, 0x46, 0x2b, 0xe5, + 0x10, 0xb5, 0x04, 0x46, 0x22, 0x48, 0x21, 0x46, 0x50, 0xf8, 0x21, 0x00, + 0x08, 0x29, 0x03, 0xdb, 0xff, 0xf7, 0xfd, 0xfe, 0xb4, 0x30, 0x02, 0xe0, + 0xff, 0xf7, 0xf9, 0xfe, 0x40, 0x30, 0xff, 0xf7, 0x1b, 0xfd, 0x20, 0x46, + 0xbd, 0xe8, 0x10, 0x40, 0xf5, 0xe6, 0x10, 0xb5, 0xff, 0xf7, 0xd9, 0xff, + 0x0c, 0xdb, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x04, 0xf1, 0xb4, 0x00, + 0xff, 0xf7, 0x0c, 0xfd, 0x01, 0x23, 0x80, 0x22, 0x07, 0x21, 0x04, 0xf1, + 0xb9, 0x00, 0x0b, 0xe0, 0x01, 0x23, 0x80, 0x22, 0x07, 0x21, 0x04, 0xf1, + 0x45, 0x00, 0xff, 0xf7, 0xff, 0xfc, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, + 0x04, 0xf1, 0x40, 0x00, 0xbd, 0xe8, 0x10, 0x40, 0xf6, 0xe4, 0x07, 0x4a, + 0x53, 0x68, 0x18, 0x44, 0x80, 0xf8, 0x54, 0x10, 0x70, 0x47, 0x04, 0x49, + 0x4a, 0x68, 0x10, 0x44, 0x90, 0xf8, 0x54, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x9c, 0x65, 0x02, 0x20, 0xe8, 0x72, 0x02, 0x20, 0xae, 0xd6, 0xff, 0xff, + 0xe4, 0x90, 0x04, 0x01, 0xa8, 0x27, 0x5d, 0x00, 0x54, 0x65, 0x6d, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, + 0x00, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x64, 0x04, 0xdf, 0xf8, 0x64, 0x24, + 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, 0x11, 0x68, 0x08, 0x40, 0xcb, 0xe1, + 0xdf, 0xf8, 0x50, 0x04, 0xdf, 0xf8, 0x50, 0x24, 0x01, 0x68, 0xd1, 0xf8, + 0xb8, 0x00, 0x11, 0x68, 0x08, 0x40, 0x00, 0x04, 0x00, 0x0e, 0x70, 0x47, + 0xdf, 0xf8, 0x38, 0x04, 0xdf, 0xf8, 0x38, 0x24, 0x01, 0x68, 0xd1, 0xf8, + 0xb8, 0x00, 0x11, 0x68, 0x08, 0x40, 0x00, 0x0c, 0x00, 0xf0, 0x03, 0x00, + 0x70, 0x47, 0xdf, 0xf8, 0x20, 0x14, 0x09, 0x68, 0x0a, 0x18, 0xe0, 0x20, + 0x92, 0xf8, 0xbc, 0x30, 0x43, 0x43, 0xc8, 0x18, 0xc4, 0x30, 0x70, 0x47, + 0xdf, 0xf8, 0x08, 0x14, 0x09, 0x68, 0x0a, 0x18, 0xed, 0x20, 0x92, 0xf8, + 0xbc, 0x30, 0x43, 0x43, 0xc8, 0x18, 0x00, 0xf2, 0x44, 0x40, 0x70, 0x47, + 0x0d, 0xf0, 0x0d, 0xbb, 0xdf, 0xf8, 0xec, 0x03, 0x01, 0x68, 0x08, 0x69, + 0x70, 0x47, 0x80, 0xb5, 0x00, 0xe0, 0x80, 0xb5, 0xc0, 0xb2, 0xff, 0xf7, + 0xe7, 0xff, 0xd0, 0xf8, 0x7d, 0x00, 0x02, 0xbd, 0x80, 0xb5, 0xf7, 0xe7, + 0x80, 0xb5, 0x00, 0x21, 0x08, 0x28, 0x03, 0xd2, 0x00, 0xf0, 0x66, 0xf8, + 0xd0, 0xf8, 0x7d, 0x10, 0x08, 0x46, 0x02, 0xbd, 0x1c, 0xb5, 0x69, 0x46, + 0x0c, 0xf0, 0x47, 0xfe, 0x00, 0x24, 0x48, 0xb9, 0x00, 0x98, 0xff, 0x28, + 0x06, 0xd0, 0x0f, 0xf0, 0xbb, 0xf9, 0x01, 0x46, 0x00, 0x98, 0x0f, 0xf0, + 0x92, 0xfa, 0x04, 0x46, 0x20, 0x46, 0x16, 0xbd, 0xc0, 0xb2, 0xf3, 0xf7, + 0x9f, 0xb9, 0x38, 0xb5, 0x04, 0x46, 0x69, 0x46, 0x0c, 0xf0, 0x31, 0xfe, + 0x00, 0x25, 0xd0, 0xb9, 0x00, 0x98, 0xff, 0x28, 0x17, 0xd0, 0xdf, 0xf8, + 0x7c, 0x13, 0x0a, 0x68, 0xe4, 0xb2, 0x10, 0x19, 0x90, 0xf8, 0xbc, 0x10, + 0x9d, 0xf8, 0x00, 0x40, 0x70, 0x20, 0x44, 0x43, 0x10, 0x19, 0x00, 0xf5, + 0x32, 0x60, 0x01, 0x44, 0x00, 0x98, 0x01, 0xf1, 0x57, 0x04, 0x0f, 0xf0, + 0x93, 0xf9, 0x00, 0x28, 0x0c, 0xbf, 0x25, 0x79, 0x25, 0x78, 0x28, 0x46, + 0x32, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x26, 0xf8, 0xd0, 0xf8, 0x89, 0x00, + 0x02, 0xbd, 0x7c, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x00, 0xf0, 0x1e, 0xf8, + 0x06, 0x46, 0x01, 0x20, 0x28, 0x60, 0x69, 0x46, 0x20, 0x46, 0xff, 0xf7, + 0x2d, 0xf9, 0x00, 0x98, 0x68, 0x60, 0x00, 0x99, 0xe9, 0x60, 0xd6, 0xf8, + 0xe1, 0x00, 0xa8, 0x60, 0xd6, 0xf8, 0xdd, 0x00, 0x28, 0x61, 0x73, 0xbd, + 0x80, 0xb5, 0x00, 0xf0, 0x09, 0xf8, 0xd0, 0xf8, 0xdd, 0x00, 0x02, 0xbd, + 0x80, 0xb5, 0x00, 0xf0, 0x03, 0xf8, 0xd0, 0xf8, 0xe5, 0x00, 0x02, 0xbd, + 0xc0, 0xb2, 0x73, 0xe7, 0x2d, 0xe9, 0xf8, 0x4f, 0x82, 0x46, 0x8c, 0xb0, + 0x0c, 0x46, 0xc0, 0xb2, 0xff, 0xf7, 0x61, 0xff, 0x80, 0x46, 0x00, 0x20, + 0x20, 0x60, 0x69, 0x46, 0x50, 0x46, 0xff, 0xf7, 0x18, 0xf9, 0xd8, 0xf8, + 0x1c, 0x00, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xdf, 0xed, + 0xa5, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0x0f, 0xf0, 0x29, 0xfa, 0xbc, 0xee, + 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x9a, 0xaf, 0x48, 0x81, 0x45, 0x2c, 0xbf, + 0xdf, 0xf8, 0xb8, 0x92, 0x4f, 0xea, 0x59, 0x09, 0x00, 0x27, 0x03, 0xad, + 0x01, 0xae, 0x32, 0x21, 0x79, 0x43, 0x08, 0xeb, 0x01, 0x0b, 0x9b, 0xf8, + 0x44, 0x00, 0x40, 0xb3, 0x8d, 0xf8, 0x16, 0x70, 0x05, 0xa9, 0x5f, 0xfa, + 0x8a, 0xf0, 0x0f, 0xf0, 0xbc, 0xfa, 0xdb, 0xf8, 0x4a, 0x10, 0x00, 0x9b, + 0x06, 0x9a, 0x00, 0x98, 0x9a, 0x1a, 0x01, 0xeb, 0xd1, 0x71, 0x48, 0x44, + 0x02, 0xeb, 0x61, 0x02, 0x90, 0x42, 0x88, 0xbf, 0x10, 0x46, 0x46, 0xf8, + 0x27, 0x00, 0xdb, 0xf8, 0x4a, 0x20, 0x00, 0x9b, 0x06, 0x99, 0x00, 0x98, + 0x59, 0x1a, 0x02, 0xeb, 0xd2, 0x72, 0xa0, 0xeb, 0x09, 0x00, 0xa1, 0xeb, + 0x62, 0x01, 0x88, 0x42, 0x38, 0xbf, 0x08, 0x46, 0x45, 0xf8, 0x27, 0x00, + 0x01, 0xe0, 0x46, 0xf8, 0x27, 0x00, 0x7f, 0x1c, 0x01, 0x2f, 0xca, 0xd9, + 0x01, 0x98, 0x00, 0x28, 0x1c, 0xbf, 0x70, 0x68, 0x00, 0x28, 0x19, 0xd0, + 0x69, 0x68, 0x01, 0x9a, 0x91, 0x42, 0x3c, 0xbf, 0x03, 0x9b, 0x83, 0x42, + 0x12, 0xd2, 0x8b, 0x42, 0x04, 0xd3, 0x03, 0x91, 0x6b, 0x60, 0x01, 0x99, + 0x01, 0x90, 0x71, 0x60, 0x01, 0x98, 0x69, 0x68, 0x88, 0x42, 0x07, 0xd3, + 0x70, 0x68, 0x01, 0x99, 0x88, 0x42, 0x38, 0xbf, 0x08, 0x46, 0x01, 0x90, + 0x00, 0x20, 0x70, 0x60, 0x00, 0x21, 0x56, 0xf8, 0x21, 0x00, 0x78, 0xb1, + 0x27, 0x68, 0x55, 0xf8, 0x21, 0x20, 0x04, 0xeb, 0x87, 0x07, 0x83, 0x1a, + 0xfb, 0x60, 0x10, 0x18, 0x22, 0x1d, 0x23, 0x68, 0x40, 0x08, 0x42, 0xf8, + 0x23, 0x00, 0x20, 0x68, 0x40, 0x1c, 0x20, 0x60, 0x49, 0x1c, 0x01, 0x29, + 0xe9, 0xd9, 0x0d, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x80, 0xb5, 0x00, 0xe0, + 0x80, 0xb5, 0xc0, 0xb2, 0xff, 0xf7, 0xcb, 0xfe, 0xd0, 0xf8, 0x93, 0x00, + 0x02, 0xbd, 0x80, 0xb5, 0xff, 0xf7, 0x5a, 0xff, 0xd0, 0xf8, 0xa7, 0x00, + 0x02, 0xbd, 0x80, 0xb5, 0xff, 0xf7, 0x54, 0xff, 0x00, 0x68, 0x02, 0xbd, + 0x6a, 0x4a, 0x01, 0xe0, 0x69, 0x4a, 0x00, 0x21, 0x42, 0xf8, 0x20, 0x10, + 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46, 0xff, 0xf7, 0x47, 0xff, 0x01, 0x46, + 0x64, 0x48, 0x50, 0xf8, 0x24, 0x00, 0x00, 0xb9, 0x88, 0x68, 0x10, 0xbd, + 0x01, 0x46, 0x00, 0x20, 0x02, 0x29, 0x07, 0xd2, 0x5b, 0x4a, 0xc9, 0xb2, + 0x13, 0x68, 0x70, 0x20, 0x41, 0x43, 0x19, 0x44, 0xd1, 0xf8, 0x28, 0x0b, + 0x70, 0x47, 0x00, 0x22, 0x80, 0xb5, 0x08, 0x29, 0x38, 0xbf, 0x02, 0x28, + 0x03, 0xd2, 0xc8, 0xb2, 0xf3, 0xf7, 0x74, 0xf8, 0x02, 0x46, 0x10, 0x46, + 0x02, 0xbd, 0x01, 0x46, 0x00, 0x20, 0x02, 0x29, 0x07, 0xd2, 0x4f, 0x4a, + 0xc9, 0xb2, 0x13, 0x68, 0x70, 0x20, 0x41, 0x43, 0x19, 0x44, 0xd1, 0xf8, + 0x38, 0x0b, 0x70, 0x47, 0x01, 0x46, 0x00, 0x20, 0x02, 0x29, 0x07, 0xd2, + 0x48, 0x4a, 0xc9, 0xb2, 0x13, 0x68, 0x70, 0x20, 0x41, 0x43, 0x19, 0x44, + 0xd1, 0xf8, 0x3c, 0x0b, 0x70, 0x47, 0x1c, 0xb5, 0x04, 0x46, 0x00, 0x20, + 0x8d, 0xf8, 0x00, 0x00, 0xf3, 0xf7, 0x62, 0xf8, 0x01, 0x28, 0x05, 0xd1, + 0xe0, 0xb2, 0xf3, 0xf7, 0x58, 0xf8, 0x8d, 0xf8, 0x00, 0x00, 0x14, 0xe0, + 0xff, 0x21, 0x01, 0x91, 0x20, 0x46, 0x01, 0xa9, 0x0c, 0xf0, 0xe1, 0xfc, + 0x01, 0x98, 0xff, 0x28, 0x0b, 0xd0, 0x00, 0x21, 0x8d, 0xf8, 0x02, 0x10, + 0x8d, 0xf8, 0x01, 0x10, 0x0d, 0xf1, 0x01, 0x03, 0x0d, 0xf1, 0x02, 0x02, + 0x69, 0x46, 0x0f, 0xf0, 0x52, 0xfa, 0x9d, 0xf8, 0x00, 0x00, 0x16, 0xbd, + 0x30, 0x48, 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, 0x00, 0xf0, 0xff, 0x00, + 0x70, 0x47, 0x2d, 0x48, 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, 0xc0, 0xf3, + 0x07, 0x20, 0x70, 0x47, 0x1e, 0xe6, 0x27, 0xe6, 0x32, 0xe6, 0x10, 0xb5, + 0xff, 0xf7, 0x1a, 0xfe, 0x04, 0x46, 0xff, 0xf7, 0x21, 0xfe, 0x04, 0x43, + 0xff, 0xf7, 0x2a, 0xfe, 0x20, 0x43, 0x10, 0xbd, 0x38, 0xb5, 0x00, 0x24, + 0x00, 0x25, 0x28, 0x46, 0x00, 0xf0, 0x1f, 0xf8, 0xff, 0x28, 0x02, 0xd0, + 0x01, 0x20, 0xa8, 0x40, 0x04, 0x43, 0x6d, 0x1c, 0x08, 0x2d, 0xf4, 0xd3, + 0x20, 0x46, 0x32, 0xbd, 0x08, 0x28, 0x01, 0xd2, 0x1e, 0x49, 0x07, 0xe0, + 0xff, 0x20, 0x70, 0x47, 0x08, 0x28, 0x01, 0xd2, 0x1c, 0x49, 0x01, 0xe0, + 0xff, 0x20, 0x70, 0x47, 0x51, 0xf8, 0x20, 0x00, 0x70, 0x47, 0x02, 0x28, + 0x01, 0xd2, 0x19, 0x49, 0xf8, 0xe7, 0xff, 0x20, 0x70, 0x47, 0x08, 0x28, + 0x01, 0xd2, 0x17, 0x49, 0xf2, 0xe7, 0xff, 0x20, 0x70, 0x47, 0x00, 0x00, + 0xae, 0x47, 0x61, 0x3f, 0x04, 0x28, 0x01, 0xd2, 0x13, 0x49, 0xe9, 0xe7, + 0xff, 0x20, 0x70, 0x47, 0x04, 0x28, 0x01, 0xd2, 0x11, 0x49, 0xe3, 0xe7, + 0xff, 0x20, 0x70, 0x47, 0x10, 0xb9, 0x10, 0x48, 0x00, 0x68, 0x70, 0x47, + 0xff, 0x20, 0x70, 0x47, 0x04, 0x28, 0x01, 0xd2, 0x0d, 0x49, 0xd7, 0xe7, + 0xff, 0x20, 0x70, 0x47, 0xb4, 0x76, 0x02, 0x20, 0xb0, 0x76, 0x02, 0x20, + 0x21, 0x12, 0x0a, 0x00, 0x10, 0x09, 0x05, 0x00, 0x2c, 0x75, 0x02, 0x20, + 0x88, 0x66, 0x03, 0x20, 0xa8, 0x66, 0x03, 0x20, 0x80, 0x66, 0x03, 0x20, + 0xc8, 0x66, 0x03, 0x20, 0xe8, 0x66, 0x03, 0x20, 0xf8, 0x66, 0x03, 0x20, + 0x08, 0x67, 0x03, 0x20, 0x0c, 0x67, 0x03, 0x20, 0x01, 0xf0, 0x2e, 0xbb, + 0x01, 0xf0, 0x41, 0xbb, 0xdf, 0xf8, 0x24, 0x16, 0xdb, 0x20, 0x08, 0x60, + 0x70, 0x47, 0x7f, 0xb5, 0x06, 0x46, 0xdf, 0xf8, 0x1c, 0x56, 0xdf, 0xf8, + 0x1c, 0x16, 0xdf, 0xf8, 0x1c, 0x26, 0x00, 0x20, 0x68, 0x70, 0xa8, 0x70, + 0x68, 0x63, 0x01, 0x2e, 0x08, 0x68, 0xa8, 0x62, 0xea, 0x62, 0x07, 0xd1, + 0x03, 0x22, 0x02, 0x70, 0x00, 0x21, 0x81, 0x70, 0xc1, 0x70, 0x42, 0x70, + 0x01, 0x20, 0x00, 0xe0, 0x02, 0x20, 0x28, 0x70, 0x30, 0x46, 0x0f, 0xf2, + 0xb1, 0x51, 0x07, 0xf0, 0x6d, 0xfe, 0x04, 0x00, 0x63, 0xd1, 0x76, 0xb1, + 0xe8, 0x6a, 0xc1, 0x68, 0x86, 0x68, 0x43, 0x68, 0x50, 0xf8, 0x14, 0x2b, + 0x02, 0x90, 0x01, 0x91, 0x00, 0x96, 0x0f, 0xf2, 0x14, 0x61, 0x0f, 0xf2, + 0xf0, 0x50, 0x0f, 0xf0, 0xa1, 0xfa, 0x00, 0x20, 0x00, 0x90, 0x01, 0x21, + 0xdf, 0xf8, 0xc0, 0x65, 0x06, 0xf5, 0x14, 0x63, 0x06, 0xf5, 0xa0, 0x72, + 0x4f, 0xf4, 0x00, 0x60, 0x0f, 0xf0, 0xa8, 0xfa, 0xe8, 0x60, 0x06, 0xf1, + 0xf0, 0x03, 0x00, 0x20, 0x00, 0x90, 0x32, 0x46, 0x01, 0x21, 0x80, 0x20, + 0x0f, 0xf0, 0x9e, 0xfa, 0x68, 0x60, 0x05, 0x22, 0x06, 0xf5, 0x19, 0x60, + 0xdf, 0xf8, 0x94, 0x15, 0x02, 0x90, 0x01, 0x91, 0x00, 0x92, 0x00, 0x23, + 0xc8, 0x22, 0x0f, 0xf2, 0xd0, 0x51, 0x0f, 0xf2, 0x95, 0x40, 0x0d, 0xf0, + 0x35, 0xfe, 0x28, 0x61, 0x05, 0x22, 0x06, 0xf1, 0x80, 0x00, 0xdf, 0xf8, + 0x78, 0x15, 0x02, 0x90, 0x01, 0x91, 0x00, 0x92, 0x00, 0x23, 0x4f, 0xf4, + 0x18, 0x72, 0x49, 0xa1, 0x0f, 0xf2, 0x25, 0x10, 0x0d, 0xf0, 0x24, 0xfe, + 0xa8, 0x60, 0x05, 0xf1, 0x38, 0x01, 0x01, 0x20, 0x0f, 0xf0, 0xa6, 0xfa, + 0x28, 0x63, 0x1b, 0x22, 0x28, 0x69, 0x00, 0x21, 0x0e, 0xf0, 0xbb, 0xfa, + 0xa8, 0x68, 0x1a, 0x22, 0x00, 0x21, 0x0e, 0xf0, 0xb6, 0xfa, 0x28, 0x69, + 0x00, 0x28, 0x1c, 0xbf, 0xa8, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x28, 0x6b, + 0x08, 0xb9, 0x4f, 0xf6, 0x0b, 0x74, 0x20, 0x46, 0x04, 0xb0, 0x70, 0xbd, + 0xdf, 0xf8, 0x0c, 0x15, 0x08, 0x6b, 0x00, 0xb1, 0x01, 0x20, 0x70, 0x47, + 0x10, 0xb5, 0x0a, 0xf0, 0x99, 0xf8, 0xdf, 0xf8, 0xfc, 0x44, 0x61, 0x78, + 0x01, 0x29, 0x08, 0xbf, 0x00, 0x28, 0x08, 0xd1, 0x02, 0xe0, 0x01, 0x20, + 0x0d, 0xf0, 0xc5, 0xfe, 0xe0, 0x68, 0x0f, 0xf0, 0xcd, 0xfc, 0x00, 0x28, + 0xf7, 0xd1, 0xbd, 0xe8, 0x10, 0x40, 0x07, 0xf0, 0xd5, 0xbe, 0x08, 0xb4, + 0x2d, 0xe9, 0xf8, 0x41, 0xdf, 0xf8, 0xcc, 0x54, 0x88, 0x46, 0xa9, 0x6a, + 0x06, 0x46, 0x14, 0x46, 0x48, 0x78, 0x2a, 0x78, 0x10, 0x42, 0x30, 0xd0, + 0x08, 0x78, 0xb0, 0x42, 0x2d, 0xd3, 0xc8, 0x78, 0x00, 0x28, 0x1c, 0xbf, + 0x88, 0x78, 0x40, 0x45, 0x27, 0xd1, 0x0a, 0xf0, 0x6d, 0xf8, 0x08, 0xb1, + 0x00, 0x27, 0x0a, 0xe0, 0x68, 0x78, 0x01, 0x28, 0xfa, 0xd1, 0x28, 0x6b, + 0x4f, 0xf0, 0xff, 0x31, 0x0f, 0xf0, 0xd4, 0xfb, 0x01, 0x27, 0x01, 0x28, + 0x14, 0xd1, 0xfe, 0xf7, 0x1e, 0xff, 0x02, 0x46, 0x05, 0xeb, 0x86, 0x00, + 0x41, 0x46, 0x40, 0x69, 0x0f, 0xf0, 0xfe, 0xf9, 0x07, 0xa9, 0x20, 0x46, + 0x0f, 0xf0, 0x54, 0xfd, 0x4f, 0xb1, 0x28, 0x6b, 0x00, 0x23, 0x00, 0x22, + 0x00, 0x21, 0x0f, 0xf0, 0x70, 0xfa, 0x02, 0xe0, 0x68, 0x6b, 0x40, 0x1c, + 0x68, 0x63, 0xbd, 0xe8, 0xf1, 0x01, 0x5d, 0xf8, 0x08, 0xfb, 0xdf, 0xf8, + 0x50, 0x14, 0x8a, 0x6a, 0x10, 0x70, 0x70, 0x47, 0xdf, 0xf8, 0x44, 0x24, + 0x92, 0x6a, 0xd0, 0x70, 0x91, 0x70, 0x70, 0x47, 0xdf, 0xf8, 0x38, 0x14, + 0x8a, 0x6a, 0x50, 0x70, 0x70, 0x47, 0x00, 0x00, 0x43, 0x4c, 0x49, 0x00, + 0x2d, 0xe9, 0xf0, 0x4f, 0xdf, 0xf8, 0x24, 0x54, 0xdf, 0xf8, 0x38, 0xa4, + 0x0f, 0xf2, 0xb8, 0x4b, 0x0f, 0xf2, 0x78, 0x49, 0x01, 0x20, 0xa8, 0x70, + 0x8f, 0xb0, 0x50, 0x21, 0x50, 0x46, 0x03, 0xf0, 0x1f, 0xfc, 0x00, 0x24, + 0x00, 0x26, 0x0d, 0xf1, 0x14, 0x08, 0x1a, 0xe0, 0x0f, 0xf2, 0xdc, 0x40, + 0x0f, 0xf0, 0xbe, 0xf9, 0x00, 0xf0, 0x40, 0xf9, 0x64, 0xb9, 0x06, 0xe0, + 0x05, 0xaa, 0x51, 0x46, 0x00, 0xf0, 0x41, 0xf9, 0xa9, 0x6a, 0x05, 0x98, + 0x08, 0x70, 0x48, 0x46, 0x29, 0x78, 0x49, 0x1e, 0x0f, 0xf0, 0xae, 0xf9, + 0x50, 0x21, 0x50, 0x46, 0x03, 0xf0, 0x02, 0xfc, 0x00, 0x24, 0x9d, 0xf8, + 0x08, 0x60, 0x68, 0x68, 0x4f, 0xf0, 0xff, 0x32, 0x02, 0xa9, 0x0f, 0xf0, + 0xfc, 0xfa, 0xdf, 0xf8, 0xb8, 0x13, 0x0a, 0x68, 0xdb, 0x2a, 0xf4, 0xd1, + 0x01, 0x28, 0xf2, 0xd1, 0x9d, 0xf8, 0x08, 0x00, 0x10, 0xb9, 0x00, 0xf0, + 0x19, 0xf9, 0xea, 0xe7, 0x08, 0x28, 0x18, 0xbf, 0x7f, 0x28, 0x06, 0xd1, + 0xa1, 0xb2, 0x00, 0x29, 0xe3, 0xd0, 0x0f, 0xf0, 0xf5, 0xfc, 0x64, 0x1e, + 0xdf, 0xe7, 0x0f, 0xf0, 0xf1, 0xfc, 0xa0, 0xb2, 0x50, 0x28, 0x05, 0xd2, + 0x9d, 0xf8, 0x08, 0x00, 0xa1, 0xb2, 0x64, 0x1c, 0x0a, 0xf8, 0x01, 0x00, + 0x9d, 0xf8, 0x08, 0x00, 0x0a, 0x28, 0x04, 0xd0, 0x0d, 0x28, 0xce, 0xd1, + 0x0a, 0x20, 0x0f, 0xf0, 0xdf, 0xfc, 0xa4, 0xb2, 0x01, 0x2c, 0x09, 0xd1, + 0x9d, 0xf8, 0x08, 0x00, 0x0a, 0x28, 0x08, 0xbf, 0x0d, 0x2e, 0xbd, 0xd0, + 0x29, 0x78, 0x0f, 0xf2, 0xbc, 0x30, 0xb6, 0xe7, 0x00, 0xf0, 0xe4, 0xf8, + 0x20, 0xb9, 0xdf, 0xf8, 0x60, 0x03, 0x0f, 0xf0, 0x61, 0xf9, 0xac, 0xe7, + 0x3d, 0x21, 0x50, 0x46, 0x0f, 0xf0, 0xd6, 0xfc, 0x04, 0x00, 0x04, 0xd1, + 0x50, 0x46, 0x0f, 0xf0, 0xdd, 0xfc, 0x44, 0x1e, 0x01, 0xe0, 0xa0, 0xeb, + 0x0a, 0x04, 0x00, 0x26, 0x06, 0xe0, 0x1a, 0xf8, 0x06, 0x00, 0x0f, 0xf0, + 0xdd, 0xfc, 0x0a, 0xf8, 0x06, 0x00, 0x76, 0x1c, 0xa6, 0x42, 0xf6, 0xd1, + 0x00, 0x26, 0x00, 0xe0, 0x76, 0x1c, 0x0b, 0x20, 0x70, 0x43, 0x50, 0x44, + 0x90, 0xf8, 0x50, 0x70, 0xff, 0x2f, 0x07, 0xd0, 0x00, 0xf1, 0x51, 0x01, + 0x22, 0x46, 0x50, 0x46, 0x0f, 0xf0, 0xce, 0xfc, 0x00, 0x28, 0xef, 0xd1, + 0xaa, 0xa1, 0x50, 0x46, 0x0f, 0xf0, 0xdc, 0xfc, 0x06, 0x46, 0x00, 0xf0, + 0xad, 0xf8, 0x00, 0x24, 0x06, 0xb9, 0x00, 0xb9, 0x01, 0x24, 0x00, 0x2f, + 0x00, 0xf0, 0x9e, 0x80, 0x01, 0x2f, 0x00, 0xf0, 0x92, 0x80, 0x02, 0x2f, + 0x00, 0xf0, 0x7d, 0x80, 0x0c, 0x2f, 0x64, 0xd0, 0x0d, 0x2f, 0x57, 0xd0, + 0x0e, 0x2f, 0x50, 0xd0, 0x0f, 0x2f, 0x49, 0xd0, 0x10, 0x2f, 0x3b, 0xd0, + 0x1b, 0x2f, 0x35, 0xd0, 0x27, 0x2f, 0x23, 0xd0, 0x41, 0x2f, 0x7f, 0xf4, + 0x4f, 0xaf, 0x00, 0x2c, 0x6a, 0xd1, 0x00, 0x20, 0x00, 0x90, 0x6a, 0x46, + 0x00, 0xf0, 0x98, 0xf8, 0x00, 0x98, 0x02, 0x28, 0x09, 0xd1, 0xaa, 0x49, + 0x0b, 0x68, 0xd3, 0xf8, 0x3b, 0x00, 0xd3, 0xf8, 0x3f, 0x10, 0x00, 0x22, + 0x04, 0xf0, 0x8a, 0xfc, 0x49, 0xe7, 0xc0, 0xb2, 0x0f, 0xf0, 0x5b, 0xfd, + 0x00, 0x98, 0x00, 0x21, 0xc0, 0xb2, 0x0f, 0xf0, 0x19, 0xfd, 0x00, 0x98, + 0xc0, 0xb2, 0x0f, 0xf0, 0x74, 0xfd, 0x3c, 0xe7, 0x00, 0x2c, 0x49, 0xd1, + 0x00, 0xf0, 0x79, 0xf8, 0x00, 0xf0, 0x73, 0xf8, 0xd8, 0xf8, 0x04, 0x10, + 0x05, 0x98, 0x0f, 0xf2, 0x1c, 0x32, 0xc9, 0xb2, 0xc0, 0xb2, 0xff, 0xf7, + 0xb4, 0xfe, 0x2c, 0xe7, 0x00, 0x2c, 0x39, 0xd1, 0xba, 0xa0, 0x78, 0xe7, + 0x00, 0x2c, 0x35, 0xd1, 0x01, 0xaa, 0x00, 0xf0, 0x65, 0xf8, 0x01, 0x46, + 0x6a, 0x46, 0x0a, 0x20, 0x00, 0xf0, 0x64, 0xf8, 0x58, 0x46, 0x6c, 0xe7, + 0x00, 0x2c, 0x29, 0xd1, 0x6a, 0x46, 0x51, 0x46, 0xf5, 0xe7, 0x00, 0x2c, + 0x24, 0xd1, 0x6a, 0x46, 0x51, 0x46, 0xf0, 0xe7, 0x00, 0x2c, 0x1f, 0xd1, + 0x01, 0xaa, 0x00, 0xf0, 0x4f, 0xf8, 0x01, 0x46, 0x6a, 0x46, 0x0a, 0x20, + 0x00, 0xf0, 0x4e, 0xf8, 0x07, 0xe7, 0x00, 0x2c, 0x14, 0xd1, 0x04, 0xaa, + 0x51, 0x46, 0x00, 0xf0, 0x40, 0xf8, 0x01, 0x46, 0x03, 0xaa, 0x00, 0xf0, + 0x3c, 0xf8, 0x04, 0x98, 0x03, 0x9a, 0x00, 0x21, 0xcd, 0xe9, 0x00, 0x01, + 0x02, 0xf0, 0x03, 0x02, 0x03, 0x99, 0x08, 0x46, 0x10, 0xf0, 0xba, 0xf8, + 0xf1, 0xe6, 0x00, 0x2c, 0x7f, 0xf4, 0xe6, 0xae, 0x00, 0xf0, 0x2d, 0xf8, + 0x00, 0xf0, 0x27, 0xf8, 0x05, 0x98, 0xd8, 0xf8, 0x04, 0x10, 0x01, 0x28, + 0xc9, 0xb2, 0x02, 0xd1, 0xff, 0xf7, 0xb0, 0xfe, 0xe1, 0xe6, 0x00, 0x20, + 0xfa, 0xe7, 0x00, 0x2c, 0xec, 0xd1, 0x00, 0xf0, 0x1c, 0xf8, 0x05, 0x98, + 0xc0, 0xb2, 0xff, 0xf7, 0xab, 0xfe, 0xd6, 0xe6, 0x00, 0x2c, 0x3f, 0xf4, + 0xcd, 0xae, 0x6b, 0x48, 0x0f, 0xf0, 0x84, 0xf8, 0xd4, 0xe6, 0x00, 0x00, + 0x5f, 0xf0, 0x04, 0x02, 0x7b, 0xa1, 0x50, 0x46, 0x0f, 0xf0, 0x12, 0xbc, + 0x29, 0x78, 0x49, 0x1e, 0x48, 0x46, 0x0f, 0xf0, 0x77, 0xb8, 0x01, 0x46, + 0x06, 0xaa, 0x10, 0x20, 0x04, 0xe0, 0x05, 0xaa, 0x51, 0x46, 0x0a, 0x20, + 0x00, 0xe0, 0x00, 0x00, 0xf8, 0xb5, 0x06, 0x46, 0x08, 0x00, 0x15, 0x46, + 0x72, 0xa7, 0x04, 0xd1, 0x38, 0x46, 0x0f, 0xf0, 0x65, 0xf8, 0x00, 0x24, + 0x2d, 0xe0, 0x00, 0xbf, 0x74, 0xa1, 0x0f, 0xf0, 0x09, 0xfc, 0x04, 0x00, + 0x27, 0xd0, 0x64, 0x1c, 0x0a, 0x2e, 0x04, 0xd1, 0x20, 0x46, 0x10, 0xf0, + 0x75, 0xfc, 0x28, 0x60, 0x1f, 0xe0, 0x10, 0x2e, 0x1a, 0xd1, 0x21, 0x46, + 0x00, 0x22, 0x02, 0xe0, 0x37, 0x38, 0x00, 0xeb, 0x02, 0x12, 0x11, 0xf8, + 0x01, 0x0b, 0x78, 0xb1, 0xa0, 0xf1, 0x30, 0x03, 0x0a, 0x2b, 0x38, 0xbf, + 0x18, 0x46, 0xf4, 0xd3, 0xa0, 0xf1, 0x61, 0x03, 0x06, 0x2b, 0x38, 0xbf, + 0x57, 0x38, 0xee, 0xd3, 0xa0, 0xf1, 0x41, 0x03, 0x06, 0x2b, 0xe9, 0xd3, + 0x2a, 0x60, 0x02, 0xe0, 0x38, 0x46, 0x0f, 0xf0, 0x35, 0xf8, 0x20, 0x46, + 0xf2, 0xbd, 0x00, 0x00, 0x1c, 0xb5, 0x37, 0x4c, 0x01, 0x20, 0x60, 0x70, + 0xe0, 0x68, 0x4f, 0xf0, 0xff, 0x32, 0x69, 0x46, 0x0f, 0xf0, 0x83, 0xf9, + 0x01, 0x28, 0xf7, 0xd1, 0x9d, 0xf8, 0x00, 0x00, 0x0a, 0x28, 0x03, 0xd1, + 0x01, 0x21, 0x0d, 0x20, 0x07, 0xf0, 0x9a, 0xfc, 0x9d, 0xf8, 0x00, 0x00, + 0x01, 0x21, 0x07, 0xf0, 0x95, 0xfc, 0xe9, 0xe7, 0x2d, 0xe9, 0xf0, 0x41, + 0x0d, 0x46, 0x90, 0x46, 0x09, 0xf0, 0x6a, 0xfe, 0x27, 0x4f, 0x04, 0x46, + 0x78, 0x78, 0x01, 0x28, 0x17, 0xd1, 0x00, 0x26, 0x46, 0x45, 0x25, 0xd2, + 0xf8, 0x68, 0x3c, 0xb1, 0x00, 0x23, 0x00, 0x22, 0x29, 0x46, 0x0f, 0xf0, + 0x02, 0xf9, 0x01, 0x28, 0x08, 0xd0, 0x1b, 0xe0, 0x00, 0x23, 0x4f, 0xf0, + 0xff, 0x32, 0x29, 0x46, 0x0f, 0xf0, 0x77, 0xf8, 0x01, 0x28, 0x13, 0xd1, + 0x6d, 0x1c, 0x76, 0x1c, 0xe8, 0xe7, 0x00, 0x26, 0x0c, 0xe0, 0x28, 0x78, + 0x0a, 0x28, 0x03, 0xd1, 0x01, 0x21, 0x0d, 0x20, 0x07, 0xf0, 0x68, 0xfc, + 0x15, 0xf8, 0x01, 0x0b, 0x01, 0x21, 0x07, 0xf0, 0x63, 0xfc, 0x76, 0x1c, + 0x46, 0x45, 0xf0, 0xd3, 0x30, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x00, 0x01, 0xb5, 0x82, 0xb0, 0x00, 0x20, 0x00, 0x90, + 0x0b, 0x48, 0x81, 0x78, 0x01, 0x29, 0x0f, 0xd1, 0x40, 0x68, 0x00, 0x23, + 0x6a, 0x46, 0x02, 0xa9, 0x0f, 0xf0, 0xcf, 0xf8, 0x00, 0x98, 0x38, 0xb1, + 0x0f, 0x48, 0x4f, 0xf0, 0x80, 0x51, 0x01, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, + 0xbf, 0xf3, 0x6f, 0x8f, 0x07, 0xbd, 0x00, 0x00, 0xc0, 0x04, 0x00, 0x01, + 0xf0, 0x42, 0x00, 0x20, 0x70, 0x04, 0x00, 0x01, 0xa8, 0x03, 0x00, 0x01, + 0x48, 0x36, 0x03, 0x20, 0x50, 0xd5, 0x01, 0x20, 0x60, 0xc3, 0x01, 0x20, + 0x1c, 0x42, 0x00, 0x20, 0x7c, 0x86, 0x04, 0x01, 0xb4, 0x76, 0x02, 0x20, + 0xd8, 0x86, 0x04, 0x01, 0x04, 0xed, 0x00, 0xe0, 0x25, 0x73, 0x20, 0x46, + 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x20, 0x76, 0x25, 0x64, 0x2e, + 0x25, 0x64, 0x2e, 0x25, 0x64, 0x2e, 0x25, 0x64, 0x20, 0x25, 0x73, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x44, 0x52, 0x56, 0x39, 0x30, 0x34, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x50, 0x52, 0x49, 0x4e, 0x54, 0x46, 0x00, 0x00, + 0x0a, 0x4f, 0x4b, 0x0a, 0x25, 0x64, 0x3e, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x0a, 0x25, 0x64, 0x3e, 0x20, 0x00, 0x00, 0x00, 0x68, 0x65, 0x6c, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x2c, 0x3a, 0x2e, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x20, 0x4e, 0x4f, 0x54, 0x20, + 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x0a, 0x00, 0x00, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x64, 0x65, 0x62, + 0x75, 0x67, 0x20, 0x68, 0x65, 0x6c, 0x70, 0x20, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x47, 0x20, + 0x54, 0x45, 0x53, 0x54, 0x0a, 0x00, 0x00, 0x00, 0x55, 0x6e, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x21, + 0x0a, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x43, 0x80, 0x46, 0x0d, 0x46, + 0x98, 0xf9, 0x0c, 0x00, 0xf0, 0xf7, 0xa8, 0xfe, 0x81, 0x46, 0x98, 0xf9, + 0x0d, 0x00, 0xf0, 0xf7, 0xa3, 0xfe, 0x81, 0x44, 0x98, 0xf9, 0x13, 0x00, + 0xf0, 0xf7, 0x9e, 0xfe, 0x07, 0x46, 0x98, 0xf9, 0x0e, 0x00, 0xf0, 0xf7, + 0x99, 0xfe, 0x04, 0x46, 0x98, 0xf9, 0x0f, 0x00, 0xf0, 0xf7, 0x94, 0xfe, + 0x04, 0x19, 0x98, 0xf9, 0x10, 0x00, 0xf0, 0xf7, 0x8f, 0xfe, 0x06, 0x46, + 0x98, 0xf9, 0x11, 0x00, 0xf0, 0xf7, 0x8a, 0xfe, 0xb9, 0x44, 0xa1, 0x19, + 0x0f, 0x18, 0x98, 0xf9, 0x12, 0x00, 0xf0, 0xf7, 0x83, 0xfe, 0x38, 0x18, + 0x40, 0x00, 0x00, 0xeb, 0x89, 0x00, 0xe8, 0x80, 0x98, 0xf9, 0x0d, 0x10, + 0x98, 0xf9, 0x0c, 0x00, 0x98, 0xf9, 0x0f, 0x20, 0x09, 0x18, 0x98, 0xf9, + 0x13, 0x00, 0x08, 0x18, 0x98, 0xf9, 0x0e, 0x10, 0x52, 0x18, 0x98, 0xf9, + 0x10, 0x10, 0x51, 0x18, 0x98, 0xf9, 0x11, 0x20, 0x8a, 0x18, 0x98, 0xf9, + 0x12, 0x10, 0x51, 0x18, 0x49, 0x00, 0x01, 0xeb, 0x80, 0x01, 0x29, 0x81, + 0x98, 0xf9, 0x0c, 0x20, 0x98, 0xf9, 0x13, 0x10, 0x98, 0xf9, 0x0d, 0x00, + 0x98, 0xf9, 0x10, 0x30, 0x52, 0x1a, 0x12, 0x1a, 0x98, 0xf9, 0x0e, 0x10, + 0x98, 0xf9, 0x0f, 0x00, 0x09, 0x1a, 0x98, 0xf9, 0x11, 0x00, 0xc9, 0x18, + 0x98, 0xf9, 0x12, 0x30, 0x09, 0x1a, 0xc9, 0x18, 0x49, 0x00, 0x01, 0xeb, + 0x82, 0x01, 0x69, 0x81, 0xbd, 0xe8, 0xf1, 0x83, 0x2d, 0xe9, 0xf8, 0x4b, + 0x0d, 0x46, 0xd7, 0xb0, 0x90, 0x46, 0x69, 0x79, 0x8d, 0xf8, 0x0d, 0x10, + 0x00, 0x24, 0x98, 0xf8, 0x05, 0x10, 0x6e, 0x6a, 0x00, 0x27, 0x00, 0x29, + 0xc6, 0xf3, 0x03, 0x29, 0x66, 0xd0, 0x04, 0x46, 0x46, 0xf4, 0x00, 0x40, + 0x40, 0xf0, 0x01, 0x00, 0x68, 0x62, 0x08, 0xf1, 0x24, 0x03, 0x34, 0xa8, + 0x00, 0x90, 0x2a, 0x46, 0x00, 0x21, 0x20, 0x46, 0x03, 0xf0, 0x35, 0xf9, + 0xc0, 0x22, 0x41, 0x46, 0x04, 0xa8, 0xf1, 0xf7, 0xf9, 0xfa, 0x29, 0x7e, + 0x00, 0xf0, 0xee, 0xfa, 0x5f, 0xea, 0x09, 0x70, 0x48, 0xbf, 0x01, 0x27, + 0x00, 0xf0, 0x7e, 0xf8, 0x09, 0xf0, 0xf7, 0x0b, 0x3b, 0x46, 0x01, 0x22, + 0x59, 0x46, 0x20, 0x46, 0x10, 0xf0, 0x9b, 0xfd, 0x00, 0xf0, 0x7b, 0xf8, + 0x28, 0x79, 0x9d, 0xf8, 0x0d, 0x10, 0x00, 0x28, 0x0c, 0xbf, 0x9d, 0xf9, + 0x34, 0x90, 0x9d, 0xf9, 0x37, 0x90, 0x01, 0x20, 0x00, 0x90, 0x34, 0xab, + 0x08, 0xf1, 0x24, 0x02, 0x20, 0x46, 0x03, 0xf0, 0x3c, 0xf9, 0x00, 0xf0, + 0x61, 0xf8, 0x3b, 0x46, 0x00, 0x22, 0x59, 0x46, 0x20, 0x46, 0x10, 0xf0, + 0x80, 0xfd, 0x00, 0xf0, 0x60, 0xf8, 0x28, 0x79, 0x00, 0x28, 0x0c, 0xbf, + 0x9d, 0xf9, 0x34, 0x70, 0x9d, 0xf9, 0x37, 0x70, 0x34, 0xaa, 0x08, 0xf1, + 0x24, 0x01, 0x20, 0x46, 0x03, 0xf0, 0x5c, 0xf9, 0x20, 0x46, 0xfd, 0xf7, + 0x3f, 0xfc, 0x00, 0xf0, 0xb0, 0xfa, 0x31, 0x06, 0x6e, 0x62, 0x0d, 0xd4, + 0x28, 0x79, 0x00, 0x28, 0x0c, 0xbf, 0x9d, 0xf9, 0xd0, 0x00, 0x9d, 0xf9, + 0xd3, 0x00, 0xa9, 0xeb, 0x00, 0x04, 0xc7, 0x1b, 0xbc, 0x42, 0x03, 0xdd, + 0x3c, 0x46, 0x01, 0xe0, 0xa9, 0xeb, 0x07, 0x04, 0x28, 0x79, 0x00, 0xb1, + 0x64, 0x42, 0x20, 0xb2, 0x00, 0x28, 0x95, 0xf8, 0x24, 0x00, 0x48, 0xbf, + 0x00, 0x24, 0x41, 0x06, 0x21, 0xd4, 0x98, 0xf9, 0x14, 0x00, 0xf0, 0xf7, + 0xc1, 0xfd, 0x01, 0x46, 0x98, 0xf9, 0x14, 0x00, 0x20, 0xb1, 0x95, 0xf9, + 0x1f, 0x20, 0x49, 0xb2, 0x91, 0x42, 0x01, 0xdb, 0x00, 0x24, 0x12, 0xe0, + 0x24, 0xb2, 0x00, 0xee, 0x10, 0x4a, 0xb8, 0xee, 0xc0, 0x0a, 0xdf, 0xed, + 0x09, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0x00, 0xee, 0x90, 0x0a, 0xf8, 0xee, + 0xe0, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, + 0x10, 0x4a, 0x20, 0xb2, 0x58, 0xb0, 0xbd, 0xe8, 0xf0, 0x8b, 0x00, 0x00, + 0x00, 0x00, 0xc8, 0x42, 0x04, 0x20, 0x02, 0x21, 0x03, 0xaa, 0x02, 0x90, + 0x01, 0x91, 0x00, 0x92, 0x70, 0x47, 0x00, 0x23, 0x04, 0xaa, 0x29, 0x46, + 0x20, 0x46, 0x60, 0xe2, 0x2d, 0xe9, 0xfe, 0x43, 0x15, 0x46, 0x0a, 0x46, + 0x01, 0x46, 0x68, 0x46, 0x03, 0xf0, 0x1c, 0xfc, 0x00, 0x24, 0x55, 0xb1, + 0x9d, 0xf9, 0x01, 0x00, 0xf0, 0xf7, 0x82, 0xfd, 0x04, 0x46, 0x9d, 0xf9, + 0x01, 0x00, 0xf0, 0xf7, 0x7d, 0xfd, 0x44, 0x43, 0xa4, 0x00, 0x9d, 0xf9, + 0x02, 0x00, 0xf0, 0xf7, 0x77, 0xfd, 0x05, 0x46, 0x9d, 0xf9, 0x02, 0x00, + 0xf0, 0xf7, 0x72, 0xfd, 0x45, 0x43, 0x9d, 0xf9, 0x03, 0x00, 0xf0, 0xf7, + 0x6d, 0xfd, 0x07, 0x46, 0x9d, 0xf9, 0x03, 0x00, 0xf0, 0xf7, 0x68, 0xfd, + 0x47, 0x43, 0x9d, 0xf9, 0x04, 0x00, 0xf0, 0xf7, 0x63, 0xfd, 0x80, 0x46, + 0x9d, 0xf9, 0x04, 0x00, 0xf0, 0xf7, 0x5e, 0xfd, 0x10, 0xfb, 0x08, 0xf8, + 0x9d, 0xf9, 0x05, 0x00, 0xf0, 0xf7, 0x58, 0xfd, 0x81, 0x46, 0x9d, 0xf9, + 0x05, 0x00, 0xf0, 0xf7, 0x53, 0xfd, 0x10, 0xfb, 0x09, 0xf9, 0x9d, 0xf9, + 0x06, 0x00, 0xf0, 0xf7, 0x4d, 0xfd, 0x06, 0x46, 0x2c, 0x19, 0x9d, 0xf9, + 0x06, 0x00, 0x3c, 0x19, 0x44, 0x44, 0xf0, 0xf7, 0x45, 0xfd, 0x4c, 0x44, + 0x10, 0xfb, 0x06, 0x44, 0xa0, 0x00, 0xbd, 0xe8, 0xfe, 0x83, 0x00, 0x00, + 0x02, 0x46, 0x00, 0x20, 0x12, 0x79, 0x4a, 0xb9, 0x03, 0x29, 0x10, 0xd8, + 0xdf, 0xe8, 0x01, 0xf0, 0x02, 0x04, 0x02, 0x04, 0x08, 0x20, 0x70, 0x47, + 0x02, 0x20, 0x70, 0x47, 0x03, 0x29, 0x06, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, + 0x02, 0x04, 0x02, 0x04, 0x04, 0x20, 0x70, 0x47, 0x01, 0x20, 0x70, 0x47, + 0x2d, 0xe9, 0xff, 0x47, 0x04, 0x46, 0x89, 0x46, 0x90, 0x46, 0x9a, 0x46, + 0x00, 0x25, 0x5f, 0xea, 0x09, 0x00, 0x36, 0xd1, 0x15, 0xb1, 0x01, 0x2d, + 0x07, 0xd0, 0x10, 0xe0, 0x98, 0xf9, 0x00, 0x10, 0x00, 0xf0, 0x7e, 0xf8, + 0x98, 0xf9, 0x02, 0x10, 0x05, 0xe0, 0x98, 0xf9, 0x01, 0x10, 0x00, 0xf0, + 0x77, 0xf8, 0x98, 0xf9, 0x03, 0x10, 0x52, 0x46, 0x20, 0x46, 0xfd, 0xf7, + 0xca, 0xfa, 0x00, 0xf0, 0x11, 0xfb, 0x00, 0xf0, 0x0c, 0xfb, 0x00, 0x27, + 0x01, 0x2d, 0x08, 0xbf, 0x02, 0x27, 0x00, 0x26, 0xf1, 0x19, 0x6b, 0x46, + 0x01, 0xaa, 0xc9, 0xb2, 0x00, 0xf0, 0x0a, 0xfb, 0x01, 0x98, 0x08, 0xf1, + 0x24, 0x02, 0x40, 0x00, 0xf1, 0x19, 0x22, 0xf8, 0x11, 0x00, 0x76, 0x1c, + 0x00, 0x9b, 0xc0, 0x1a, 0x22, 0xf8, 0x11, 0x00, 0x02, 0x2e, 0xeb, 0xd3, + 0x6d, 0x1c, 0x02, 0x2d, 0xc7, 0xd3, 0xbd, 0xe8, 0xff, 0x87, 0x8d, 0xf8, + 0x0e, 0xa0, 0x15, 0xb1, 0x01, 0x2d, 0x14, 0xd0, 0xf4, 0xe7, 0x00, 0x26, + 0x0e, 0xe0, 0x98, 0xf9, 0x02, 0x00, 0x00, 0xf0, 0x3e, 0xf8, 0x00, 0xf0, + 0xe3, 0xfa, 0x00, 0xf0, 0xde, 0xfa, 0x00, 0xf0, 0xe2, 0xfa, 0x00, 0xf0, + 0x3f, 0xf8, 0xe5, 0xd2, 0x00, 0x2e, 0xf0, 0xd1, 0x98, 0xf9, 0x00, 0x00, + 0xef, 0xe7, 0x02, 0x26, 0x98, 0xf9, 0x01, 0x00, 0x02, 0xe0, 0xfb, 0xd0, + 0x98, 0xf9, 0x03, 0x00, 0x00, 0xf0, 0x27, 0xf8, 0x00, 0xf0, 0xcc, 0xfa, + 0x00, 0xf0, 0xc7, 0xfa, 0x00, 0xf0, 0xcb, 0xfa, 0x00, 0xf0, 0x28, 0xf8, + 0xf1, 0xd9, 0x03, 0x26, 0x98, 0xf9, 0x03, 0x00, 0x00, 0xf0, 0x19, 0xf8, + 0x00, 0xf0, 0xbe, 0xfa, 0x00, 0xf0, 0xb9, 0xfa, 0x00, 0xf0, 0xbd, 0xfa, + 0x01, 0x98, 0x08, 0xf1, 0x24, 0x01, 0x40, 0x00, 0x21, 0xf8, 0x16, 0x00, + 0x00, 0x9a, 0x80, 0x1a, 0x21, 0xf8, 0x16, 0x00, 0x76, 0x1c, 0x03, 0x2e, + 0xb6, 0xd8, 0x02, 0x2e, 0x08, 0xbf, 0x98, 0xf9, 0x01, 0x00, 0xe5, 0xd0, + 0xe2, 0xe7, 0x8d, 0xf8, 0x08, 0x00, 0x02, 0xa8, 0xfd, 0xf7, 0x70, 0xba, + 0x52, 0x46, 0x20, 0x46, 0xfd, 0xf7, 0x24, 0xba, 0x01, 0x98, 0x08, 0xf1, + 0x24, 0x01, 0x40, 0x00, 0x21, 0xf8, 0x16, 0x00, 0x00, 0x9a, 0x80, 0x1a, + 0x21, 0xf8, 0x16, 0x00, 0x76, 0x1c, 0x02, 0x2e, 0x70, 0x47, 0x1c, 0xb5, + 0x14, 0x46, 0x06, 0x22, 0x8d, 0xf8, 0x03, 0x20, 0x8d, 0xf8, 0x02, 0x10, + 0x8d, 0xf8, 0x05, 0x00, 0x00, 0x21, 0x94, 0x22, 0x00, 0xf0, 0x1a, 0xf8, + 0x00, 0xf0, 0x13, 0xf8, 0x01, 0x21, 0x95, 0x22, 0x00, 0xf0, 0x14, 0xf8, + 0x00, 0xf0, 0x0d, 0xf8, 0x02, 0x21, 0x84, 0x22, 0x00, 0xf0, 0x0e, 0xf8, + 0x00, 0xf0, 0x07, 0xf8, 0x03, 0x21, 0x85, 0x22, 0x00, 0xf0, 0x08, 0xf8, + 0x00, 0xf0, 0x01, 0xf8, 0x13, 0xbd, 0x8d, 0xf8, 0x01, 0x00, 0x68, 0x46, + 0xfd, 0xf7, 0x62, 0xb9, 0x8d, 0xf8, 0x00, 0x10, 0x8d, 0xf8, 0x04, 0x20, + 0x20, 0x46, 0x19, 0xe7, 0xfe, 0xb5, 0x0d, 0x46, 0x16, 0x46, 0x04, 0x46, + 0x1f, 0x46, 0x2a, 0x46, 0x00, 0x21, 0xff, 0xf7, 0xca, 0xff, 0x00, 0x22, + 0x00, 0x20, 0x01, 0x92, 0x00, 0x90, 0x2b, 0x46, 0x32, 0x46, 0x00, 0x21, + 0x20, 0x46, 0x02, 0xf0, 0xfd, 0xff, 0x32, 0x46, 0x39, 0x46, 0x20, 0x46, + 0x03, 0xb0, 0xbd, 0xe8, 0xf0, 0x40, 0x03, 0xf0, 0xe2, 0xb9, 0xf8, 0xb5, + 0x16, 0x46, 0x04, 0x46, 0x0d, 0x46, 0x1f, 0x46, 0x32, 0x1d, 0xff, 0xf7, + 0xb0, 0xff, 0x33, 0x7a, 0x07, 0xf1, 0x24, 0x02, 0x00, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0x08, 0xff, 0x72, 0x6a, 0x51, 0x0e, 0x01, 0xf0, 0x01, 0x01, + 0x81, 0xf0, 0x01, 0x0c, 0x07, 0xf1, 0x48, 0x01, 0x13, 0x0e, 0xb1, 0xf8, + 0x00, 0xe0, 0x03, 0xf0, 0x01, 0x03, 0x90, 0x0e, 0xd2, 0x0d, 0x02, 0xf0, + 0x01, 0x02, 0x82, 0xf0, 0x01, 0x02, 0x1e, 0xfb, 0x02, 0xf2, 0x0a, 0x80, + 0x83, 0xf0, 0x01, 0x03, 0x00, 0xf0, 0x01, 0x00, 0x4a, 0x88, 0x80, 0xf0, + 0x01, 0x00, 0x12, 0xfb, 0x0c, 0xfc, 0x8a, 0x88, 0xa1, 0xf8, 0x02, 0xc0, + 0x12, 0xfb, 0x03, 0xf2, 0xcb, 0x88, 0x8a, 0x80, 0x13, 0xfb, 0x00, 0xf0, + 0xc8, 0x80, 0x07, 0xf1, 0x24, 0x03, 0xb6, 0xf9, 0x16, 0x20, 0x29, 0x46, + 0x20, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x40, 0x03, 0xf0, 0x33, 0xb9, + 0x2d, 0xe9, 0xf0, 0x47, 0x88, 0xb0, 0x00, 0x27, 0x10, 0x9d, 0x02, 0x2d, + 0x81, 0x46, 0x0c, 0x46, 0x90, 0x46, 0x9a, 0x46, 0x11, 0xd1, 0x04, 0xf1, + 0x24, 0x00, 0xff, 0xf7, 0x3b, 0xfd, 0x94, 0xf8, 0x37, 0x00, 0x84, 0xf8, + 0x50, 0x00, 0x00, 0x20, 0x21, 0x18, 0x22, 0x18, 0x91, 0xf8, 0x30, 0x10, + 0x82, 0xf8, 0x51, 0x10, 0x40, 0x1c, 0x07, 0x28, 0xf6, 0xd3, 0x12, 0x9e, + 0x0e, 0x21, 0x04, 0xa8, 0x02, 0xf0, 0xc8, 0xfe, 0x61, 0x78, 0x8d, 0xf8, + 0x11, 0x10, 0x31, 0x00, 0x22, 0x78, 0x8d, 0xf8, 0x10, 0x20, 0x08, 0xd1, + 0xe0, 0x78, 0x8d, 0xf8, 0x13, 0x00, 0xe0, 0x7d, 0x8d, 0xf8, 0x1a, 0x00, + 0x20, 0x7e, 0x8d, 0xf8, 0x1b, 0x00, 0x98, 0xf8, 0x24, 0x00, 0x81, 0x07, + 0x51, 0xd4, 0x9d, 0xf8, 0x4c, 0x00, 0x03, 0x90, 0x02, 0x96, 0x01, 0x95, + 0xcd, 0xf8, 0x00, 0xa0, 0x04, 0xab, 0x98, 0xf8, 0x08, 0x10, 0x08, 0xf1, + 0x28, 0x02, 0x48, 0x46, 0x10, 0xf0, 0xb6, 0xfb, 0x01, 0x2d, 0x01, 0x46, + 0x14, 0xd1, 0x9d, 0xf8, 0x14, 0x00, 0x00, 0x28, 0x1c, 0xbf, 0x9d, 0xf8, + 0x12, 0x00, 0x00, 0x28, 0x02, 0xd0, 0x11, 0xf0, 0x03, 0x0f, 0x09, 0xd0, + 0x60, 0x78, 0x01, 0x27, 0x01, 0x28, 0x1f, 0xbf, 0x98, 0xf8, 0x35, 0x20, + 0x90, 0x42, 0x11, 0x98, 0x01, 0x28, 0x20, 0xd1, 0x9d, 0xf8, 0x12, 0x00, + 0xa0, 0x70, 0x01, 0x2e, 0x04, 0xbf, 0x9d, 0xf8, 0x13, 0x00, 0xe0, 0x70, + 0x9d, 0xf8, 0x14, 0x00, 0x20, 0x71, 0xbd, 0xf8, 0x16, 0x00, 0xe0, 0x81, + 0x9d, 0xf8, 0x18, 0x00, 0x60, 0x75, 0x9d, 0xf8, 0x19, 0x00, 0xa0, 0x75, + 0x05, 0xd1, 0x9d, 0xf8, 0x1a, 0x00, 0xe0, 0x75, 0x9d, 0xf8, 0x1b, 0x00, + 0x20, 0x76, 0x9d, 0xf8, 0x1c, 0x00, 0x60, 0x76, 0x9d, 0xf8, 0x1d, 0x00, + 0xa0, 0x76, 0xc8, 0x07, 0x02, 0xd5, 0x7f, 0x22, 0x62, 0x75, 0xa2, 0x75, + 0x88, 0x07, 0x02, 0xd5, 0x7f, 0x21, 0x61, 0x76, 0xa1, 0x76, 0x02, 0x2d, + 0x10, 0xd1, 0x98, 0xf8, 0x08, 0x10, 0x00, 0x22, 0x48, 0x46, 0xff, 0xf7, + 0xd9, 0xfd, 0x20, 0x61, 0x98, 0xf8, 0x24, 0x00, 0xc1, 0x06, 0x05, 0xd4, + 0x22, 0x46, 0x41, 0x46, 0x48, 0x46, 0xff, 0xf7, 0x17, 0xfd, 0xa0, 0x81, + 0x38, 0x46, 0x08, 0xb0, 0xbd, 0xe8, 0xf0, 0x87, 0x2d, 0xe9, 0xff, 0x41, + 0x0d, 0x46, 0x04, 0x46, 0x29, 0x7e, 0x16, 0x46, 0x1f, 0x46, 0xfd, 0xf7, + 0xff, 0xf9, 0x3b, 0x46, 0x32, 0x46, 0x29, 0x46, 0x20, 0x46, 0x00, 0xf0, + 0x1c, 0xf8, 0x80, 0x46, 0x00, 0x20, 0x01, 0x21, 0x02, 0x23, 0x03, 0x90, + 0x02, 0x91, 0x01, 0x91, 0x00, 0x93, 0x2a, 0x46, 0x3b, 0x46, 0x31, 0x46, + 0x20, 0x46, 0xff, 0xf7, 0x43, 0xff, 0x96, 0xf9, 0x14, 0x10, 0x20, 0x46, + 0xf0, 0xf7, 0x48, 0xfc, 0x00, 0xf0, 0x03, 0xf8, 0x40, 0x46, 0x00, 0xf0, + 0x96, 0xba, 0x69, 0x7e, 0x20, 0x46, 0xfd, 0xf7, 0xdd, 0xb9, 0x2d, 0xe9, + 0xf0, 0x4f, 0x0d, 0x46, 0xcf, 0xb0, 0x0d, 0xa9, 0x16, 0x46, 0x00, 0x22, + 0xc1, 0xe9, 0x00, 0x22, 0x0b, 0xa9, 0xad, 0xf8, 0x24, 0x20, 0xc1, 0xe9, + 0x00, 0x22, 0x8d, 0xf8, 0x1d, 0x20, 0x08, 0x92, 0x86, 0xf8, 0xbc, 0x20, + 0x98, 0x46, 0x69, 0x6a, 0xc1, 0xf3, 0x01, 0x71, 0x01, 0xf1, 0x01, 0x0a, + 0x95, 0xf8, 0x21, 0x10, 0x0a, 0x06, 0x03, 0xd5, 0x01, 0x21, 0x08, 0x91, + 0x86, 0xf8, 0xbc, 0x10, 0x81, 0x46, 0xf0, 0xf7, 0x75, 0xfc, 0x38, 0x22, + 0x29, 0x46, 0x0f, 0xa8, 0xf0, 0xf7, 0xdc, 0xff, 0xc8, 0x21, 0x1d, 0xa8, + 0x02, 0xf0, 0xf2, 0xfd, 0x00, 0x20, 0x0a, 0x90, 0x95, 0xf8, 0x24, 0x00, + 0x00, 0xf0, 0x01, 0x00, 0x80, 0xf0, 0x01, 0x0b, 0x01, 0x20, 0xbb, 0xf1, + 0x00, 0x0f, 0x8d, 0xf8, 0x1c, 0x00, 0x0f, 0xd0, 0x28, 0x79, 0x00, 0x28, + 0x0c, 0xbf, 0x96, 0xf9, 0x24, 0x00, 0x96, 0xf9, 0x27, 0x00, 0x30, 0x75, + 0x31, 0x46, 0x6a, 0x79, 0x48, 0x46, 0x10, 0xf0, 0x0f, 0xfc, 0x00, 0xf0, + 0xe8, 0xf8, 0x04, 0xe0, 0x69, 0x79, 0x48, 0x46, 0xfd, 0xf7, 0x95, 0xf8, + 0x30, 0x75, 0x06, 0xf1, 0x24, 0x02, 0x29, 0x1d, 0x48, 0x46, 0x02, 0xf0, + 0xcd, 0xfd, 0x95, 0xf8, 0x24, 0x00, 0x41, 0x07, 0x48, 0xbf, 0x4f, 0xf0, + 0x00, 0x08, 0x00, 0x20, 0x8d, 0xf8, 0x1e, 0x00, 0x00, 0x24, 0x96, 0xe0, + 0xb5, 0xf9, 0x16, 0x30, 0x06, 0xf1, 0x24, 0x02, 0x29, 0x1d, 0x48, 0x46, + 0xff, 0xf7, 0x6e, 0xfe, 0x27, 0xe0, 0x08, 0x99, 0x81, 0xf0, 0x01, 0x01, + 0x1b, 0xea, 0x01, 0x0f, 0x21, 0xd0, 0x07, 0xab, 0x2a, 0x46, 0x0d, 0xa9, + 0x0b, 0xa8, 0x00, 0xf0, 0xa4, 0xf9, 0x20, 0x46, 0xb0, 0xfb, 0xfa, 0xf1, + 0x0a, 0xfb, 0x11, 0x00, 0xa8, 0xb9, 0x01, 0x20, 0x06, 0x90, 0x72, 0x1d, + 0x69, 0x79, 0x05, 0x91, 0xcd, 0xf8, 0x10, 0x80, 0x03, 0x92, 0x0b, 0xa9, + 0x28, 0x79, 0x02, 0x90, 0x0d, 0xaa, 0x01, 0x91, 0x00, 0x92, 0x0d, 0xf1, + 0x1d, 0x03, 0x32, 0x46, 0x05, 0xf1, 0x10, 0x01, 0x48, 0x46, 0x10, 0xf0, + 0x85, 0xfd, 0x7f, 0x1c, 0x08, 0x2f, 0x19, 0xd2, 0x01, 0x2f, 0xc9, 0xd0, + 0xb8, 0x1e, 0x05, 0x28, 0xcf, 0xd2, 0x33, 0x46, 0x2a, 0x46, 0xf9, 0xb2, + 0x48, 0x46, 0xff, 0xf7, 0x52, 0xfe, 0x02, 0x2f, 0x04, 0xbf, 0x70, 0x79, + 0x00, 0x28, 0xec, 0xd1, 0x96, 0xf9, 0x32, 0x00, 0x00, 0xf1, 0x1e, 0x01, + 0x3d, 0x29, 0xe6, 0xd3, 0x40, 0x42, 0x86, 0xf8, 0x32, 0x00, 0xe2, 0xe7, + 0x08, 0x98, 0x08, 0xb9, 0x00, 0xf0, 0x7f, 0xf8, 0x06, 0xf1, 0x32, 0x02, + 0x54, 0x85, 0x29, 0x7b, 0x00, 0x29, 0x3c, 0xd0, 0x00, 0x20, 0x8d, 0xf8, + 0x1e, 0x00, 0x73, 0x79, 0x01, 0x2b, 0x42, 0xd1, 0xad, 0xf8, 0x24, 0x00, + 0x14, 0x2c, 0x96, 0xf9, 0x14, 0x10, 0x8d, 0xf8, 0x0c, 0x10, 0xa8, 0xbf, + 0x01, 0x20, 0x96, 0xf8, 0x24, 0x30, 0x8d, 0xf8, 0x0d, 0x30, 0x96, 0xf8, + 0x25, 0x10, 0x8d, 0xf8, 0x0e, 0x10, 0x96, 0xf8, 0x26, 0x10, 0x8d, 0xf8, + 0x0f, 0x10, 0x96, 0xf8, 0x27, 0x30, 0x8d, 0xf8, 0x10, 0x30, 0x0a, 0x23, + 0x11, 0x78, 0x8d, 0xf8, 0x11, 0x10, 0x51, 0x78, 0x8d, 0xf8, 0x12, 0x10, + 0x91, 0x78, 0x8d, 0xf8, 0x13, 0x10, 0xd1, 0x78, 0x8d, 0xf8, 0x14, 0x10, + 0x11, 0x79, 0x8d, 0xf8, 0x15, 0x10, 0x01, 0x22, 0x03, 0xa9, 0x02, 0x92, + 0x01, 0x91, 0x00, 0x93, 0x0a, 0xaa, 0x14, 0x23, 0x1d, 0xa9, 0x03, 0xf0, + 0x69, 0xf8, 0x01, 0x28, 0x8d, 0xf8, 0x1e, 0x00, 0x16, 0xd0, 0x64, 0x1c, + 0xa4, 0xb2, 0x28, 0x8a, 0x84, 0x42, 0x11, 0xda, 0x05, 0xf1, 0x10, 0x01, + 0x48, 0x46, 0x10, 0xf0, 0x7e, 0xfc, 0x01, 0x27, 0x5e, 0xe7, 0xa1, 0x42, + 0x04, 0xda, 0xbd, 0xf8, 0x24, 0x00, 0x40, 0x1c, 0xad, 0xf8, 0x24, 0x00, + 0xbd, 0xf8, 0x24, 0x00, 0x05, 0x28, 0xe8, 0xd3, 0x08, 0x98, 0x58, 0xb9, + 0x95, 0xf8, 0x20, 0x10, 0x0b, 0xa8, 0xf0, 0xf7, 0x14, 0xfb, 0x70, 0x70, + 0x0d, 0xa8, 0x95, 0xf8, 0x20, 0x10, 0xf0, 0xf7, 0x0e, 0xfb, 0x30, 0x70, + 0x38, 0x22, 0x0f, 0xa9, 0x28, 0x46, 0xf0, 0xf7, 0xe5, 0xfe, 0x9d, 0xf8, + 0x1e, 0x00, 0x01, 0x28, 0x09, 0xd1, 0x68, 0x6a, 0x81, 0x02, 0x06, 0xd5, + 0x43, 0x46, 0x32, 0x46, 0x05, 0xf1, 0x10, 0x01, 0x48, 0x46, 0x00, 0xf0, + 0x87, 0xf8, 0x00, 0x20, 0x4f, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x06, 0xf1, + 0x24, 0x02, 0x29, 0x1d, 0x48, 0x46, 0x02, 0xf0, 0x82, 0xbf, 0x20, 0x46, + 0xfc, 0xf7, 0x3d, 0xbf, 0x20, 0x46, 0xfd, 0xf7, 0x3a, 0xb9, 0x6b, 0x46, + 0x01, 0xaa, 0xf1, 0xb2, 0x20, 0x46, 0xfc, 0xf7, 0x03, 0xbf, 0x2d, 0xe9, + 0xf0, 0x4f, 0x87, 0xb0, 0x4f, 0xf0, 0x01, 0x0a, 0x13, 0x9f, 0x12, 0x9c, + 0xd3, 0x46, 0x03, 0xf1, 0x24, 0x08, 0x01, 0x2f, 0xd8, 0xf8, 0x00, 0x60, + 0x04, 0xbf, 0x4f, 0xf0, 0x00, 0x0b, 0x98, 0xf8, 0x11, 0xa0, 0xb1, 0x46, + 0x02, 0x2c, 0x04, 0xbf, 0x46, 0xf0, 0x10, 0x06, 0xc8, 0xf8, 0x00, 0x60, + 0x05, 0x97, 0x01, 0x26, 0x55, 0x46, 0x8d, 0xf8, 0x11, 0x00, 0x8d, 0xf8, + 0x10, 0x10, 0x17, 0x46, 0x06, 0x93, 0x01, 0xe0, 0x6d, 0x1c, 0xed, 0xb2, + 0x9d, 0xf8, 0x10, 0x00, 0xa8, 0x42, 0x3c, 0xdb, 0x7d, 0x70, 0x3d, 0x70, + 0x05, 0x98, 0x01, 0x28, 0x03, 0xd1, 0x55, 0x45, 0x0c, 0xbf, 0x01, 0x26, + 0x00, 0x26, 0x01, 0x20, 0x03, 0x90, 0x02, 0x96, 0xcd, 0xf8, 0x04, 0xb0, + 0x00, 0x94, 0x9d, 0xf8, 0x44, 0x30, 0x06, 0x9a, 0x9d, 0xf8, 0x11, 0x00, + 0x39, 0x46, 0xff, 0xf7, 0xb1, 0xfd, 0x6a, 0x1e, 0xd1, 0xb2, 0x10, 0x9b, + 0x4f, 0xf0, 0x06, 0x0c, 0x1c, 0xfb, 0x01, 0xf1, 0x19, 0x44, 0x97, 0xf9, + 0x15, 0x30, 0x0b, 0x70, 0x97, 0xf9, 0x16, 0x30, 0x5b, 0x42, 0x4b, 0x70, + 0x97, 0xf9, 0x17, 0x30, 0x8b, 0x70, 0x97, 0xf9, 0x18, 0x30, 0x5b, 0x42, + 0xcb, 0x70, 0x97, 0xf9, 0x19, 0x30, 0x0b, 0x71, 0x97, 0xf9, 0x1a, 0x30, + 0x5b, 0x42, 0x4b, 0x71, 0x05, 0x99, 0x01, 0x29, 0x08, 0xbf, 0x01, 0x28, + 0xc0, 0xd1, 0x02, 0x2d, 0x24, 0xbf, 0x7a, 0x70, 0x3a, 0x70, 0x78, 0x78, + 0x02, 0x28, 0x80, 0x41, 0xc0, 0x43, 0xc0, 0x0f, 0x78, 0x71, 0xc8, 0xf8, + 0x00, 0x90, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x2d, 0xe9, 0xf8, 0x4f, + 0x15, 0x46, 0x84, 0xb0, 0x83, 0x46, 0x95, 0xf9, 0x01, 0x80, 0x95, 0xf9, + 0x00, 0x00, 0x80, 0x44, 0x0c, 0x46, 0x1e, 0x46, 0x58, 0x46, 0xfc, 0xf7, + 0xd4, 0xff, 0x81, 0x46, 0x60, 0x69, 0x09, 0xf1, 0x20, 0x01, 0x42, 0x00, + 0x01, 0xf0, 0x7f, 0x01, 0x4c, 0xbf, 0x02, 0x27, 0x01, 0x27, 0x58, 0x46, + 0xfc, 0xf7, 0xc9, 0xff, 0x8d, 0xf8, 0x0e, 0x60, 0x4f, 0xf0, 0x00, 0x0a, + 0x03, 0x24, 0x00, 0x26, 0x02, 0x97, 0x05, 0xf1, 0xb0, 0x00, 0x02, 0x21, + 0x01, 0x90, 0x00, 0x91, 0x03, 0xaa, 0x9d, 0xf8, 0x0e, 0x30, 0x0d, 0xf1, + 0x0d, 0x01, 0x58, 0x46, 0x10, 0xf0, 0xce, 0xfb, 0x9d, 0xf9, 0x0d, 0x00, + 0x9d, 0xf9, 0x0c, 0x10, 0x36, 0x18, 0x64, 0x1e, 0x8a, 0x44, 0xe9, 0xd1, + 0x76, 0xb2, 0x76, 0x1c, 0x03, 0x21, 0x96, 0xfb, 0xf1, 0xf1, 0x8d, 0xf8, + 0x0d, 0x10, 0x03, 0x22, 0x4f, 0xfa, 0x8a, 0xf1, 0x49, 0x1c, 0x91, 0xfb, + 0xf2, 0xf2, 0x8d, 0xf8, 0x0c, 0x20, 0x01, 0x23, 0x9d, 0xf8, 0x0d, 0x20, + 0x9d, 0xf8, 0x0c, 0x10, 0x85, 0xf8, 0xbb, 0x30, 0x8a, 0x18, 0x52, 0xb2, + 0x4f, 0xfa, 0x88, 0xf1, 0x8a, 0x42, 0x58, 0x46, 0x06, 0xda, 0x49, 0x46, + 0xfc, 0xf7, 0x8d, 0xff, 0x00, 0x20, 0x85, 0xf8, 0xbb, 0x00, 0x05, 0xe0, + 0x9d, 0xf8, 0x0c, 0x00, 0x68, 0x70, 0x9d, 0xf8, 0x0d, 0x10, 0x29, 0x70, + 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0xf8, 0xb5, 0x14, 0x46, 0x0e, 0x46, + 0x94, 0xf8, 0x20, 0x10, 0x1d, 0x46, 0xf0, 0xf7, 0x06, 0xfa, 0x07, 0x46, + 0x94, 0xf8, 0x20, 0x10, 0x30, 0x46, 0xf0, 0xf7, 0x00, 0xfa, 0x01, 0x46, + 0x60, 0x6a, 0x42, 0x03, 0x14, 0xd5, 0x28, 0x78, 0x90, 0xb1, 0xc8, 0x19, + 0x94, 0xf8, 0x21, 0x10, 0xc1, 0xf3, 0x02, 0x11, 0x88, 0x42, 0x0b, 0xd3, + 0x00, 0x20, 0x28, 0x70, 0x94, 0xf8, 0x21, 0x00, 0x21, 0x7f, 0x62, 0x7f, + 0x00, 0xf0, 0x0f, 0x00, 0x41, 0x18, 0x80, 0x18, 0x21, 0x77, 0x60, 0x77, + 0xf1, 0xbd, 0x2d, 0xe9, 0xff, 0x41, 0x0d, 0x46, 0x05, 0xf1, 0x08, 0x06, + 0x00, 0x23, 0x80, 0x46, 0x14, 0x46, 0x33, 0x70, 0x00, 0x27, 0x00, 0xf0, + 0x47, 0xf8, 0xfd, 0xf7, 0x66, 0xf8, 0x00, 0xf0, 0x43, 0xf8, 0xfc, 0xf7, + 0xe3, 0xff, 0x00, 0xf0, 0x3f, 0xf8, 0xfd, 0xf7, 0x70, 0xf8, 0x00, 0xf0, + 0x3b, 0xf8, 0xfd, 0xf7, 0x63, 0xf8, 0x00, 0xf0, 0x37, 0xf8, 0xfd, 0xf7, + 0x66, 0xf8, 0x7f, 0x1c, 0xf8, 0xb2, 0x02, 0x28, 0xe7, 0xd3, 0x1f, 0x21, + 0x00, 0x20, 0x02, 0x91, 0x01, 0x90, 0x00, 0x90, 0x00, 0xf0, 0x31, 0xf8, + 0x0f, 0x20, 0x00, 0x21, 0x01, 0x22, 0x00, 0xf0, 0x29, 0xf8, 0x0f, 0x20, + 0x00, 0x21, 0x02, 0x22, 0x00, 0xf0, 0x24, 0xf8, 0xf0, 0x7e, 0xc1, 0x06, + 0x09, 0xd5, 0x02, 0x23, 0xc0, 0xf3, 0x41, 0x00, 0x83, 0x40, 0x5b, 0xb2, + 0x22, 0x46, 0x29, 0x46, 0x40, 0x46, 0x00, 0xf0, 0x9c, 0xf8, 0xf3, 0x7e, + 0x31, 0x78, 0xdb, 0x08, 0x03, 0xf0, 0x01, 0x03, 0x04, 0xf1, 0x24, 0x02, + 0x40, 0x46, 0x03, 0xf0, 0xa9, 0xf8, 0xe0, 0x78, 0xe0, 0x81, 0x08, 0xb1, + 0x01, 0x20, 0x60, 0x71, 0x00, 0x20, 0x04, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, + 0x00, 0x22, 0xf9, 0xb2, 0x40, 0x46, 0x70, 0x47, 0x02, 0x90, 0x01, 0x91, + 0x00, 0x92, 0x00, 0x23, 0x22, 0x46, 0x29, 0x46, 0x40, 0x46, 0xff, 0xe7, + 0x2d, 0xe9, 0xf8, 0x4f, 0x88, 0xb0, 0x14, 0x00, 0x9d, 0xf9, 0x4c, 0xa0, + 0x9d, 0xf9, 0x50, 0x20, 0x4f, 0xf0, 0x00, 0x09, 0xaa, 0xeb, 0x02, 0x06, + 0x52, 0x44, 0xc8, 0x46, 0x4f, 0xfa, 0x82, 0xfa, 0x18, 0xbf, 0x04, 0xf1, + 0x24, 0x08, 0x06, 0x93, 0x0b, 0xb1, 0x03, 0xf5, 0xd0, 0x78, 0x12, 0x9d, + 0x83, 0x46, 0x0f, 0x46, 0x19, 0xe0, 0x39, 0x7a, 0x72, 0xb2, 0x58, 0x46, + 0xfd, 0xf7, 0x07, 0xf8, 0x03, 0xa9, 0x01, 0x20, 0x01, 0x91, 0x04, 0xaa, + 0x02, 0x90, 0x00, 0x92, 0x05, 0xab, 0x39, 0x7a, 0x07, 0xf1, 0x28, 0x02, + 0x58, 0x46, 0x10, 0xf0, 0xfa, 0xf8, 0x9d, 0xf8, 0x0c, 0x10, 0x89, 0x45, + 0x02, 0xd2, 0x07, 0x98, 0x89, 0x46, 0x46, 0x73, 0x76, 0x1c, 0x68, 0xb2, + 0x40, 0x44, 0x07, 0x90, 0x70, 0xb2, 0x82, 0x45, 0x0f, 0xdb, 0x45, 0xb1, + 0x02, 0x2d, 0xdc, 0xd0, 0x3f, 0xbf, 0x72, 0xb2, 0x39, 0x7a, 0x58, 0x46, + 0xfc, 0xf7, 0xda, 0xff, 0xda, 0xe7, 0x39, 0x7a, 0x72, 0xb2, 0x58, 0x46, + 0xfc, 0xf7, 0xdb, 0xff, 0xd4, 0xe7, 0x58, 0x46, 0x39, 0x46, 0x2a, 0x46, + 0x00, 0x23, 0x04, 0xb1, 0xe3, 0x1c, 0x06, 0x9c, 0x14, 0xb1, 0x23, 0x46, + 0x03, 0xf2, 0x2a, 0x23, 0x0b, 0xb1, 0x83, 0xf8, 0x00, 0x90, 0xb8, 0xf1, + 0x00, 0x0f, 0x04, 0xd0, 0x07, 0x9b, 0x93, 0xf9, 0x0d, 0x30, 0x00, 0xf0, + 0x03, 0xf8, 0x09, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x10, 0xb5, 0x14, 0x46, + 0x1a, 0x46, 0x23, 0x00, 0x03, 0xd0, 0x02, 0x2c, 0x06, 0xd0, 0x05, 0xd3, + 0x10, 0xbd, 0x09, 0x7a, 0xbd, 0xe8, 0x10, 0x40, 0xfc, 0xf7, 0xb3, 0xbf, + 0x09, 0x7a, 0x01, 0x2c, 0x03, 0xd1, 0xbd, 0xe8, 0x10, 0x40, 0xfc, 0xf7, + 0xa5, 0xbf, 0xbd, 0xe8, 0x10, 0x40, 0xfc, 0xf7, 0xaa, 0xbf, 0x2d, 0xe9, + 0xf8, 0x4f, 0x0f, 0x46, 0x8a, 0xb0, 0x39, 0x7a, 0x82, 0x46, 0x14, 0x46, + 0x99, 0x46, 0xfc, 0xf7, 0xbb, 0xfe, 0x05, 0x46, 0x39, 0x7a, 0x50, 0x46, + 0xfc, 0xf7, 0xd2, 0xfe, 0x06, 0x46, 0x39, 0x7a, 0x50, 0x46, 0xfc, 0xf7, + 0xe9, 0xfe, 0xa5, 0xeb, 0x09, 0x01, 0x4a, 0xb2, 0x12, 0xf1, 0x1f, 0x0f, + 0x4d, 0x44, 0xb8, 0xbf, 0x6f, 0xf0, 0x1e, 0x01, 0x6d, 0xb2, 0x08, 0x95, + 0x1f, 0x2d, 0xc4, 0xbf, 0x1f, 0x23, 0x08, 0x93, 0x09, 0xeb, 0xd9, 0x73, + 0xa6, 0xeb, 0x63, 0x02, 0x8d, 0xf8, 0x0d, 0x20, 0x6f, 0xf0, 0x0e, 0x05, + 0x9d, 0xf9, 0x0d, 0x20, 0xaa, 0x42, 0x06, 0xeb, 0x63, 0x06, 0xb8, 0xbf, + 0x8d, 0xf8, 0x0d, 0x50, 0x76, 0xb2, 0x07, 0x96, 0x0f, 0x2e, 0xc4, 0xbf, + 0x0f, 0x26, 0x07, 0x96, 0xa0, 0xeb, 0x63, 0x02, 0x8d, 0xf8, 0x0c, 0x20, + 0x00, 0xeb, 0x63, 0x00, 0x9d, 0xf9, 0x0c, 0x20, 0xaa, 0x42, 0xb8, 0xbf, + 0x8d, 0xf8, 0x0c, 0x50, 0x45, 0xb2, 0x09, 0x94, 0x0f, 0x2d, 0x09, 0x98, + 0x4f, 0xf0, 0x00, 0x08, 0xc8, 0xbf, 0x0f, 0x25, 0x0c, 0x46, 0x00, 0xf1, + 0x31, 0x09, 0x00, 0xe0, 0x64, 0x1c, 0x08, 0x98, 0x61, 0xb2, 0x88, 0x42, + 0x38, 0xdb, 0x39, 0x7a, 0x62, 0xb2, 0x50, 0x46, 0xfc, 0xf7, 0x4d, 0xff, + 0x9d, 0xf9, 0x0d, 0x60, 0x24, 0xe0, 0x39, 0x7a, 0x4f, 0xfa, 0x8b, 0xf2, + 0x50, 0x46, 0xfc, 0xf7, 0x46, 0xff, 0x04, 0xa9, 0x01, 0x20, 0x01, 0x91, + 0x05, 0xaa, 0x02, 0x90, 0x00, 0x92, 0x06, 0xab, 0x39, 0x7a, 0x07, 0xf1, + 0x28, 0x02, 0x50, 0x46, 0x10, 0xf0, 0x39, 0xf8, 0x9d, 0xf8, 0x10, 0x10, + 0x88, 0x45, 0x06, 0xd2, 0x88, 0x46, 0x89, 0xf8, 0x00, 0x40, 0x89, 0xf8, + 0x01, 0x60, 0x89, 0xf8, 0x02, 0xb0, 0x0b, 0xf1, 0x01, 0x0b, 0x4f, 0xfa, + 0x8b, 0xf0, 0x85, 0x42, 0xdb, 0xda, 0x76, 0x1c, 0x07, 0x98, 0x71, 0xb2, + 0x88, 0x42, 0xc9, 0xdb, 0x39, 0x7a, 0x72, 0xb2, 0x50, 0x46, 0xfc, 0xf7, + 0x15, 0xff, 0x9d, 0xf9, 0x0c, 0xb0, 0xee, 0xe7, 0x09, 0x98, 0x80, 0xf8, + 0x03, 0x80, 0x0b, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, 0x0d, 0xf8, 0x01, 0x70, + 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, + 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x70, 0x47, + 0x01, 0x46, 0x00, 0x20, 0x02, 0xe0, 0x4a, 0x1e, 0x40, 0x1c, 0x11, 0x40, + 0xca, 0xb2, 0x00, 0x2a, 0xf9, 0xd1, 0xc0, 0xb2, 0x70, 0x47, 0x2d, 0xe9, + 0xf0, 0x41, 0x00, 0xf0, 0x39, 0xf8, 0x00, 0x26, 0x00, 0x27, 0x6c, 0x20, + 0x78, 0x43, 0x08, 0xeb, 0x00, 0x05, 0x28, 0x46, 0x10, 0xf0, 0x66, 0xfe, + 0x08, 0xb1, 0xe8, 0x7a, 0x06, 0x43, 0x7f, 0x1c, 0x03, 0x2f, 0xf2, 0xdb, + 0x01, 0x20, 0x00, 0xfa, 0x04, 0xf4, 0x34, 0x40, 0xe0, 0xb2, 0x00, 0xb1, + 0x01, 0x20, 0xbd, 0xe8, 0xf0, 0x81, 0x2d, 0xe9, 0xf8, 0x43, 0x00, 0xf0, + 0x1d, 0xf8, 0x00, 0x27, 0x00, 0x26, 0x6c, 0x25, 0x75, 0x43, 0x08, 0xeb, + 0x05, 0x09, 0x48, 0x46, 0x10, 0xf0, 0x4a, 0xfe, 0x00, 0x28, 0x1f, 0xbf, + 0x99, 0xf8, 0x0b, 0x00, 0x01, 0x21, 0xa1, 0x40, 0x08, 0x42, 0x03, 0xd0, + 0x18, 0xf8, 0x05, 0x00, 0x01, 0x28, 0x03, 0xd0, 0x76, 0x1c, 0x03, 0x2e, + 0xe9, 0xdb, 0x00, 0xe0, 0x01, 0x27, 0x38, 0x46, 0xbd, 0xe8, 0xf2, 0x83, + 0x04, 0x46, 0xb1, 0x48, 0x01, 0x68, 0x01, 0xf6, 0x2d, 0x48, 0x70, 0x47, + 0xf8, 0xb5, 0x00, 0xf0, 0x39, 0xf8, 0x00, 0xf0, 0x4f, 0xf8, 0x10, 0xb1, + 0x97, 0xf8, 0x4f, 0x01, 0x05, 0x43, 0x76, 0x1c, 0x01, 0x2e, 0xf6, 0xdd, + 0xe8, 0xb2, 0xf2, 0xbd, 0xa7, 0x48, 0x01, 0x68, 0x01, 0xf6, 0x0a, 0x42, + 0x10, 0x68, 0x51, 0x68, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46, 0xff, 0xf7, + 0xe7, 0xff, 0x01, 0x21, 0x01, 0xfa, 0x04, 0xf4, 0x20, 0x40, 0x18, 0xbf, + 0x01, 0x20, 0x10, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x28, + 0x18, 0xbf, 0x00, 0x20, 0x02, 0xbd, 0xf8, 0xb5, 0x00, 0xf0, 0x12, 0xf8, + 0xf0, 0xb2, 0x48, 0x21, 0x48, 0x43, 0x27, 0x18, 0x07, 0xf5, 0xa2, 0x70, + 0x11, 0xf0, 0xe6, 0xf9, 0x20, 0xb9, 0x76, 0x1c, 0xf0, 0xb2, 0x02, 0x28, + 0xf2, 0xdb, 0x01, 0xe0, 0x97, 0xf8, 0x44, 0x51, 0x28, 0x46, 0xf2, 0xbd, + 0x90, 0x48, 0x01, 0x68, 0x01, 0xf6, 0x2d, 0x44, 0x00, 0x25, 0x00, 0x26, + 0x70, 0x47, 0xf8, 0xb5, 0xff, 0xf7, 0xf6, 0xff, 0x00, 0xf0, 0x0c, 0xf8, + 0x28, 0xb1, 0x07, 0xf5, 0xc2, 0x70, 0x01, 0x68, 0x8d, 0x42, 0x38, 0xbf, + 0x0d, 0x46, 0x76, 0x1c, 0x01, 0x2e, 0xf3, 0xdd, 0x28, 0x46, 0xf2, 0xbd, + 0x48, 0x21, 0x71, 0x43, 0x67, 0x18, 0x07, 0xf5, 0xa2, 0x70, 0x11, 0xf0, + 0xbd, 0xb9, 0x00, 0x00, 0x38, 0xb5, 0x1d, 0x46, 0x00, 0x24, 0x2c, 0x60, + 0x09, 0xb1, 0x88, 0x42, 0x02, 0xd2, 0x4b, 0xf6, 0x13, 0x04, 0x28, 0xe0, + 0x13, 0x00, 0x04, 0xd1, 0xac, 0x60, 0x6c, 0x60, 0xb0, 0xfb, 0xf1, 0xf0, + 0x1e, 0xe0, 0x00, 0xee, 0x10, 0x0a, 0x00, 0xee, 0x90, 0x1a, 0xb8, 0xee, + 0x40, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x01, 0x2a, 0x80, 0xee, 0x20, 0x0a, + 0x05, 0xd1, 0x01, 0x21, 0xac, 0x60, 0x69, 0x60, 0xf7, 0xee, 0x08, 0x0a, + 0x04, 0xe0, 0x01, 0x20, 0xa8, 0x60, 0x6c, 0x60, 0xdf, 0xed, 0x6c, 0x0a, + 0x80, 0xee, 0x20, 0x0a, 0xf0, 0xf7, 0xbe, 0xfc, 0xbc, 0xee, 0xc0, 0x0a, + 0x10, 0xee, 0x10, 0x0a, 0x11, 0xf0, 0xd2, 0xf9, 0x28, 0x60, 0x20, 0x46, + 0x32, 0xbd, 0x2d, 0xe9, 0xf0, 0x47, 0x65, 0x4b, 0x1c, 0x68, 0x00, 0x25, + 0x04, 0xf6, 0x2d, 0x43, 0x05, 0x70, 0x0d, 0x70, 0x00, 0x24, 0x14, 0x70, + 0x01, 0x25, 0x2b, 0x26, 0x66, 0x43, 0x1e, 0x44, 0x06, 0xf5, 0x5d, 0x77, + 0x97, 0xf8, 0x00, 0xc0, 0xbc, 0xf1, 0x01, 0x0f, 0x56, 0xd1, 0x4f, 0xf0, + 0x00, 0x0c, 0x05, 0xfa, 0x04, 0xfa, 0x1f, 0xe0, 0x06, 0xeb, 0x0c, 0x0e, + 0x9e, 0xf8, 0x7a, 0xe3, 0xae, 0xf1, 0x20, 0x08, 0xb8, 0xf1, 0x10, 0x0f, + 0x05, 0xd2, 0x90, 0xf8, 0x00, 0x90, 0x4a, 0xea, 0x09, 0x09, 0x80, 0xf8, + 0x00, 0x90, 0xae, 0xf1, 0x30, 0x0e, 0xbe, 0xf1, 0x10, 0x0f, 0x09, 0xd2, + 0x90, 0xf8, 0x00, 0xe0, 0x04, 0xf1, 0x02, 0x08, 0x05, 0xfa, 0x08, 0xf8, + 0x48, 0xea, 0x0e, 0x0e, 0x80, 0xf8, 0x00, 0xe0, 0x0c, 0xf1, 0x01, 0x0c, + 0x97, 0xf8, 0x01, 0xe0, 0xf4, 0x45, 0xdb, 0xd3, 0x6c, 0x27, 0x67, 0x43, + 0x00, 0x26, 0x1f, 0x44, 0x24, 0xe0, 0x07, 0xeb, 0x06, 0x0c, 0x9c, 0xf8, + 0x1b, 0xc0, 0xbc, 0xf1, 0x10, 0x0f, 0x0b, 0xd2, 0x4f, 0xea, 0x9c, 0x08, + 0x91, 0xf8, 0x00, 0xe0, 0x04, 0xeb, 0x48, 0x09, 0x05, 0xfa, 0x09, 0xf9, + 0x49, 0xea, 0x0e, 0x0e, 0x81, 0xf8, 0x00, 0xe0, 0xac, 0xf1, 0x10, 0x0c, + 0xbc, 0xf1, 0x10, 0x0f, 0x0b, 0xd2, 0x4f, 0xea, 0x9c, 0x0c, 0x92, 0xf8, + 0x00, 0xe0, 0x04, 0xeb, 0x4c, 0x0c, 0x05, 0xfa, 0x0c, 0xfc, 0x4c, 0xea, + 0x0e, 0x0e, 0x82, 0xf8, 0x00, 0xe0, 0x76, 0x1c, 0x97, 0xf8, 0x05, 0xc0, + 0x66, 0x45, 0xd6, 0xd3, 0x64, 0x1c, 0x01, 0x2c, 0x9b, 0xd9, 0xbd, 0xe8, + 0xf0, 0x87, 0x2d, 0xe9, 0xf0, 0x41, 0x2c, 0x4d, 0x2c, 0x4c, 0x28, 0x68, + 0xd0, 0xf8, 0xb8, 0x60, 0x36, 0x0c, 0xf1, 0x07, 0x19, 0xd5, 0x00, 0xf5, + 0x32, 0x67, 0x38, 0x69, 0xf9, 0x68, 0xb0, 0xfb, 0xf1, 0xf0, 0x11, 0xf0, + 0x50, 0xf9, 0x80, 0x46, 0x97, 0xf8, 0x2e, 0x30, 0x07, 0x22, 0x00, 0x21, + 0x00, 0xf0, 0x2e, 0xf8, 0x43, 0x46, 0x30, 0x22, 0x04, 0x21, 0x00, 0xf0, + 0x29, 0xf8, 0x01, 0x23, 0x4f, 0xf4, 0x80, 0x72, 0x08, 0x21, 0x00, 0xf0, + 0x23, 0xf8, 0xb0, 0x07, 0x1e, 0xd5, 0x29, 0x68, 0x01, 0xf5, 0x39, 0x65, + 0x28, 0x69, 0xe9, 0x68, 0xb0, 0xfb, 0xf1, 0xf0, 0x11, 0xf0, 0x33, 0xf9, + 0x06, 0x46, 0x95, 0xf8, 0x2e, 0x30, 0x4f, 0xf4, 0xe0, 0x42, 0x0c, 0x21, + 0x00, 0xf0, 0x10, 0xf8, 0x33, 0x46, 0x4f, 0xf4, 0x40, 0x32, 0x10, 0x21, + 0x00, 0xf0, 0x0a, 0xf8, 0x20, 0x46, 0xbd, 0xe8, 0xf0, 0x41, 0x01, 0x23, + 0x4f, 0xf4, 0x80, 0x12, 0x14, 0x21, 0x58, 0xe6, 0xbd, 0xe8, 0xf0, 0x81, + 0x20, 0x46, 0x54, 0xe6, 0x10, 0xb5, 0x04, 0x46, 0xe3, 0xb2, 0xff, 0x22, + 0x00, 0x21, 0x08, 0x48, 0xff, 0xf7, 0x44, 0xfe, 0x23, 0x0a, 0xbd, 0xe8, + 0x10, 0x40, 0xff, 0x22, 0x00, 0x21, 0x05, 0x48, 0x3c, 0xe6, 0x00, 0x00, + 0xab, 0xaa, 0xaa, 0x3f, 0xb4, 0x76, 0x02, 0x20, 0x28, 0x00, 0x00, 0x48, + 0x8f, 0x08, 0x00, 0x47, 0x90, 0x08, 0x00, 0x47, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, 0x0d, 0xf8, 0x01, 0x70, + 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, + 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x70, 0x47, + 0x2d, 0xe9, 0xf8, 0x4f, 0x84, 0xb0, 0x05, 0x46, 0x4f, 0xf0, 0x00, 0x08, + 0x8d, 0xf8, 0x06, 0x80, 0xad, 0xf8, 0x04, 0x80, 0x01, 0x20, 0x11, 0xf0, + 0x09, 0xf9, 0x47, 0x1e, 0xbf, 0x41, 0xff, 0x0f, 0x38, 0x46, 0xf0, 0xf7, + 0x18, 0xf8, 0x00, 0x2d, 0x0a, 0xd0, 0xdf, 0xf8, 0x64, 0x43, 0x20, 0x68, + 0x00, 0xf6, 0x2d, 0x49, 0x0b, 0xf0, 0x32, 0xff, 0x05, 0x00, 0x08, 0xbf, + 0x4f, 0xf6, 0x77, 0x78, 0x00, 0xf0, 0x50, 0x81, 0x8d, 0xf8, 0x07, 0x80, + 0x00, 0x26, 0xdf, 0xf8, 0x48, 0x83, 0xf0, 0xb2, 0x58, 0xf8, 0x20, 0xa0, + 0x01, 0x23, 0x4f, 0xf4, 0x80, 0x42, 0x0e, 0x21, 0x0a, 0xf5, 0x86, 0x60, + 0xff, 0xf7, 0xbd, 0xff, 0x0a, 0xf2, 0xac, 0x4a, 0x01, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x50, 0x46, 0xff, 0xf7, 0xb5, 0xff, 0x76, 0x1c, 0xf0, 0xb2, + 0x03, 0x28, 0xe8, 0xdb, 0x03, 0x20, 0x02, 0xf0, 0x60, 0xfe, 0x03, 0xf0, + 0x0e, 0xf9, 0x5f, 0xea, 0x00, 0x08, 0x5e, 0xd1, 0x48, 0x46, 0x10, 0xf0, + 0xc3, 0xf8, 0x5f, 0xea, 0x00, 0x08, 0x58, 0xd1, 0x48, 0x46, 0x10, 0xf0, + 0xd7, 0xf8, 0x5f, 0xea, 0x00, 0x08, 0x52, 0xd1, 0x09, 0xf5, 0xa2, 0x76, + 0x30, 0x46, 0x10, 0xf0, 0xb1, 0xfc, 0x5f, 0xea, 0x00, 0x08, 0x4a, 0xd1, + 0x30, 0x46, 0x10, 0xf0, 0xc5, 0xfc, 0x5f, 0xea, 0x00, 0x08, 0x44, 0xd1, + 0x10, 0xf0, 0xe8, 0xf8, 0x10, 0xf0, 0xe2, 0xfc, 0x21, 0x68, 0x08, 0x69, + 0x09, 0xf5, 0x5d, 0x7a, 0x09, 0xf5, 0xea, 0x7b, 0xcd, 0xf8, 0x00, 0xb0, + 0x2b, 0x46, 0x52, 0x46, 0x49, 0x46, 0x10, 0xf0, 0xdf, 0xf8, 0x5f, 0xea, + 0x00, 0x08, 0x30, 0xd1, 0x48, 0x46, 0x10, 0xf0, 0x42, 0xfc, 0x5f, 0xea, + 0x00, 0x08, 0x2a, 0xd1, 0x58, 0x46, 0x10, 0xf0, 0x22, 0xfc, 0x21, 0x68, + 0x08, 0x69, 0x2a, 0x46, 0x31, 0x46, 0x10, 0xf0, 0xc9, 0xfc, 0x5f, 0xea, + 0x00, 0x08, 0x1e, 0xd1, 0x48, 0x46, 0x11, 0xf0, 0x18, 0xf8, 0x5f, 0xea, + 0x00, 0x08, 0x18, 0xd1, 0x09, 0xf5, 0x05, 0x75, 0x28, 0x46, 0x10, 0xf0, + 0xf5, 0xff, 0x28, 0x46, 0x10, 0xf0, 0xd5, 0xff, 0x21, 0x68, 0x08, 0x69, + 0x51, 0x46, 0x11, 0xf0, 0xa1, 0xf8, 0x5f, 0xea, 0x00, 0x08, 0x08, 0xd1, + 0x09, 0xf5, 0x75, 0x70, 0x4a, 0x46, 0x40, 0x78, 0x59, 0x46, 0x00, 0xf0, + 0x50, 0xf9, 0x5f, 0xea, 0x00, 0x08, 0x40, 0xf0, 0xab, 0x80, 0x09, 0xf5, + 0x75, 0x74, 0x29, 0x46, 0x20, 0x78, 0x11, 0xf0, 0x3e, 0xf9, 0x00, 0x2f, + 0x80, 0x46, 0x00, 0xf0, 0x91, 0x80, 0xb8, 0xf1, 0x00, 0x0f, 0x03, 0xd1, + 0x20, 0x78, 0x02, 0x28, 0x18, 0xbf, 0x01, 0x28, 0x40, 0xf0, 0x88, 0x80, + 0x00, 0x25, 0x00, 0x26, 0x87, 0x4f, 0x02, 0xac, 0xf0, 0xb2, 0xff, 0xf7, + 0xd4, 0xfd, 0x98, 0xb1, 0xf0, 0xb2, 0x57, 0xf8, 0x20, 0xa0, 0x07, 0x23, + 0x38, 0x22, 0x03, 0x21, 0x0a, 0xf1, 0xd2, 0x00, 0xff, 0xf7, 0x1a, 0xff, + 0x07, 0x23, 0x38, 0x22, 0x03, 0x21, 0x0a, 0xf1, 0xe2, 0x00, 0xff, 0xf7, + 0x13, 0xff, 0xe8, 0xb2, 0x6d, 0x1c, 0x26, 0x54, 0x76, 0x1c, 0xf0, 0xb2, + 0x08, 0x28, 0xe3, 0xd3, 0xe8, 0xb2, 0x01, 0x28, 0x62, 0xd9, 0x00, 0x21, + 0x00, 0x22, 0x0c, 0xe0, 0xa1, 0x54, 0x09, 0xe0, 0x43, 0x1e, 0x9a, 0x42, + 0xfa, 0xd2, 0x0d, 0xf1, 0x08, 0x0c, 0x94, 0x44, 0xa1, 0x5c, 0x9c, 0xf8, + 0x01, 0x30, 0xa3, 0x54, 0x52, 0x1c, 0xeb, 0xb2, 0x9a, 0x42, 0xf1, 0xdb, + 0x4f, 0xf4, 0xfa, 0x70, 0x08, 0xf0, 0xd8, 0xfc, 0x00, 0x26, 0xb2, 0x46, + 0x5f, 0xfa, 0x8a, 0xf0, 0xff, 0xf7, 0x9b, 0xfd, 0xf8, 0xb1, 0x5f, 0xfa, + 0x8a, 0xf0, 0x57, 0xf8, 0x20, 0x50, 0xf0, 0xb2, 0x0e, 0x35, 0x21, 0x5c, + 0x57, 0xf8, 0x21, 0xb0, 0x05, 0x23, 0x00, 0xf0, 0x73, 0xf8, 0x4f, 0xf4, + 0x7a, 0x70, 0x08, 0xf0, 0xc1, 0xfc, 0x0b, 0xf1, 0x0e, 0x0b, 0x04, 0x23, + 0x00, 0xf0, 0x66, 0xf8, 0x4f, 0xf4, 0x7a, 0x70, 0x08, 0xf0, 0xb8, 0xfc, + 0x00, 0x23, 0x00, 0xf0, 0x63, 0xf8, 0x00, 0x23, 0x00, 0xf0, 0x5c, 0xf8, + 0x76, 0x1c, 0x0a, 0xf1, 0x01, 0x0a, 0x5f, 0xfa, 0x8a, 0xf0, 0x08, 0x28, + 0xd4, 0xd3, 0x4f, 0xf4, 0xfa, 0x70, 0x08, 0xf0, 0xa7, 0xfc, 0x00, 0x24, + 0xe0, 0xb2, 0xff, 0xf7, 0x6c, 0xfd, 0x80, 0xb1, 0xe0, 0xb2, 0x57, 0xf8, + 0x20, 0x50, 0x00, 0x23, 0x38, 0x22, 0x03, 0x21, 0x05, 0xf1, 0xd2, 0x00, + 0xff, 0xf7, 0xb2, 0xfe, 0x00, 0x23, 0x38, 0x22, 0x03, 0x21, 0x05, 0xf1, + 0xe2, 0x00, 0xff, 0xf7, 0xab, 0xfe, 0x64, 0x1c, 0xe0, 0xb2, 0x08, 0x28, + 0xe6, 0xd3, 0x01, 0xe0, 0x40, 0xf6, 0x11, 0x48, 0x9d, 0xf8, 0x07, 0x50, + 0x00, 0x27, 0xf8, 0xb2, 0xff, 0xf7, 0x4d, 0xfd, 0x00, 0xb1, 0x6d, 0x1c, + 0x7f, 0x1c, 0xf8, 0xb2, 0x08, 0x28, 0xf6, 0xd3, 0xe9, 0xb2, 0x48, 0x46, + 0x00, 0xf0, 0x2f, 0xf8, 0xb8, 0xf1, 0x00, 0x0f, 0x1c, 0xd1, 0x01, 0xaa, + 0x0d, 0xf1, 0x05, 0x01, 0x0d, 0xf1, 0x06, 0x00, 0xff, 0xf7, 0xb5, 0xfd, + 0x9d, 0xf8, 0x06, 0x30, 0x37, 0x48, 0x00, 0xf0, 0x1d, 0xf8, 0x9d, 0xf8, + 0x05, 0x30, 0x36, 0x48, 0x00, 0xf0, 0x18, 0xf8, 0x9d, 0xf8, 0x04, 0x30, + 0x34, 0x48, 0x00, 0xf0, 0x13, 0xf8, 0xff, 0xf7, 0x16, 0xfe, 0x09, 0xf5, + 0x75, 0x70, 0x40, 0x88, 0xff, 0xf7, 0x5a, 0xfe, 0x40, 0x46, 0x05, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x1f, 0x22, 0x00, 0x21, 0x58, 0x46, 0x6b, 0xe6, + 0x1f, 0x22, 0x00, 0x21, 0x28, 0x46, 0x67, 0xe6, 0xff, 0x22, 0x00, 0x21, + 0x64, 0xe6, 0xf8, 0xb5, 0x00, 0xf5, 0x5c, 0x72, 0x10, 0x68, 0x05, 0x0e, + 0x06, 0x02, 0x00, 0x0a, 0x00, 0xf0, 0x01, 0x04, 0xc0, 0xf3, 0x41, 0x00, + 0x36, 0x0e, 0x84, 0xf0, 0x01, 0x04, 0x40, 0x1c, 0xd5, 0xb1, 0x08, 0x29, + 0x18, 0xd1, 0xc0, 0xb2, 0xfb, 0xf7, 0xfa, 0xfd, 0x00, 0x27, 0x26, 0xfa, + 0x07, 0xf0, 0xc0, 0x07, 0x04, 0xd4, 0x1c, 0xb1, 0x01, 0x21, 0xf8, 0xb2, + 0xfb, 0xf7, 0xe0, 0xfd, 0x01, 0x21, 0xb9, 0x40, 0x0d, 0x42, 0x1e, 0xbf, + 0x00, 0x2c, 0xf8, 0xb2, 0xfb, 0xf7, 0x6d, 0xfd, 0x7f, 0x1c, 0xf8, 0xb2, + 0x08, 0x28, 0xea, 0xd3, 0xf1, 0xbd, 0xf8, 0xb5, 0x05, 0x46, 0x00, 0x26, + 0x0b, 0x4c, 0x21, 0x68, 0xf2, 0xb2, 0x48, 0x23, 0x5a, 0x43, 0x8b, 0x18, + 0x03, 0xf6, 0x71, 0x57, 0x38, 0x46, 0x10, 0xf0, 0xdd, 0xfe, 0x00, 0x28, + 0x1f, 0xbf, 0xf8, 0x7a, 0x01, 0x21, 0xa9, 0x40, 0x08, 0x42, 0x03, 0xd1, + 0x76, 0x1c, 0xf0, 0xb2, 0x02, 0x28, 0xea, 0xdb, 0x38, 0x46, 0xf2, 0xbd, + 0xb4, 0x76, 0x02, 0x20, 0x8c, 0x9d, 0x04, 0x01, 0xa8, 0x98, 0x04, 0x01, + 0x07, 0x02, 0x00, 0x47, 0x08, 0x02, 0x00, 0x47, 0x09, 0x02, 0x00, 0x47, + 0x00, 0x78, 0x02, 0x40, 0xca, 0x40, 0xd0, 0xb2, 0x70, 0x47, 0x30, 0xb5, + 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, 0x0d, 0xf8, + 0x01, 0x70, 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x68, 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, + 0x30, 0xbd, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, 0x04, 0x46, 0x8b, 0x46, 0xdf, 0xf8, + 0x08, 0x6b, 0x07, 0x20, 0x00, 0x21, 0x70, 0x70, 0x31, 0x70, 0x00, 0x23, + 0xdf, 0xf8, 0xfc, 0x7a, 0x00, 0xf0, 0xa6, 0xf8, 0x01, 0x20, 0x08, 0xf0, + 0xc7, 0xfb, 0x01, 0x23, 0x00, 0xf0, 0xa0, 0xf8, 0xdf, 0xf8, 0xec, 0x7a, + 0x23, 0x46, 0x03, 0x22, 0x00, 0xf0, 0xca, 0xfb, 0x38, 0x78, 0xdf, 0xf8, + 0xe4, 0x7a, 0xdf, 0xf8, 0xe4, 0x8a, 0x39, 0x78, 0xdf, 0xf8, 0xe0, 0x5a, + 0x00, 0xf0, 0x03, 0x00, 0x40, 0x18, 0x38, 0x70, 0x00, 0x23, 0xd8, 0xf8, + 0x1c, 0x40, 0x20, 0x78, 0x00, 0xf0, 0x8c, 0xf8, 0x20, 0x78, 0x79, 0x78, + 0xdf, 0xf8, 0xc8, 0x4a, 0x00, 0xf0, 0x01, 0x00, 0x40, 0x18, 0x78, 0x70, + 0x08, 0xf0, 0xd5, 0xfd, 0xc3, 0xb2, 0x3f, 0x22, 0x00, 0xf0, 0x7f, 0xf8, + 0x20, 0x78, 0x79, 0x78, 0x00, 0xf0, 0x3f, 0x00, 0x40, 0x18, 0x78, 0x70, + 0x06, 0x23, 0x0f, 0x22, 0x00, 0xf0, 0xf7, 0xf9, 0x28, 0x78, 0x79, 0x78, + 0x00, 0xf0, 0x0f, 0x00, 0x40, 0x18, 0x78, 0x70, 0x00, 0x23, 0x80, 0x22, + 0x07, 0x21, 0x00, 0xf0, 0x5f, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0x5a, 0xf8, + 0x02, 0x20, 0x08, 0xf0, 0x83, 0xfb, 0x00, 0x23, 0x00, 0xf0, 0x54, 0xf8, + 0x20, 0x78, 0x79, 0x78, 0xc0, 0xf3, 0x80, 0x10, 0x41, 0x18, 0x79, 0x70, + 0x4f, 0xf4, 0x7a, 0x70, 0x08, 0xf0, 0x76, 0xfb, 0x00, 0x25, 0x58, 0xf8, + 0x25, 0x40, 0xe8, 0xb2, 0xff, 0xf7, 0xe1, 0xfb, 0x00, 0x28, 0x3a, 0xd0, + 0x00, 0x23, 0x00, 0xf0, 0x4b, 0xf8, 0x01, 0x23, 0x40, 0x22, 0x06, 0x21, + 0xe0, 0x1d, 0xff, 0xf7, 0x72, 0xff, 0xe8, 0xb2, 0xff, 0xf7, 0xef, 0xfb, + 0x04, 0xf1, 0x04, 0x09, 0x18, 0xb1, 0x01, 0x23, 0x00, 0xf0, 0x34, 0xf8, + 0x04, 0xe0, 0x02, 0x23, 0x00, 0xf0, 0x30, 0xf8, 0x01, 0x20, 0x30, 0x70, + 0x0b, 0xeb, 0xc5, 0x0a, 0x04, 0xf1, 0x02, 0x09, 0x9a, 0xf8, 0x00, 0x30, + 0x07, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x26, 0xf8, 0x0b, 0xf1, 0x01, 0x00, + 0xff, 0x22, 0x10, 0xf8, 0x35, 0x30, 0x00, 0x21, 0xe0, 0x1c, 0xff, 0xf7, + 0x50, 0xff, 0x9a, 0xf8, 0x02, 0x30, 0x70, 0x22, 0x00, 0xf0, 0x17, 0xf8, + 0x99, 0xf8, 0x00, 0x00, 0x39, 0x78, 0xc0, 0xf3, 0x02, 0x10, 0x41, 0x18, + 0x39, 0x70, 0x20, 0x46, 0x00, 0xf0, 0x44, 0xfb, 0x00, 0xe0, 0x75, 0x70, + 0x6d, 0x1c, 0x07, 0x2d, 0xb9, 0xd9, 0x00, 0x20, 0xbd, 0xe8, 0xf2, 0x8f, + 0x40, 0x22, 0x06, 0x21, 0x20, 0x46, 0x34, 0xe7, 0x30, 0x22, 0x04, 0x21, + 0x48, 0x46, 0x30, 0xe7, 0x04, 0x22, 0x02, 0x21, 0x38, 0x46, 0x2c, 0xe7, + 0x01, 0x22, 0x00, 0x21, 0x20, 0x46, 0x28, 0xe7, 0xf8, 0xb5, 0xdf, 0xf8, + 0x94, 0x69, 0x04, 0x46, 0x30, 0x78, 0x00, 0x25, 0x00, 0x28, 0x5e, 0xd0, + 0x01, 0x21, 0x31, 0x72, 0x00, 0x20, 0xdf, 0xf8, 0x90, 0x79, 0x00, 0xf0, + 0x5a, 0xf8, 0x70, 0x78, 0x57, 0xf8, 0x20, 0x00, 0x00, 0x23, 0x40, 0x22, + 0x06, 0x21, 0xc0, 0x1d, 0xff, 0xf7, 0x11, 0xff, 0x70, 0x78, 0x57, 0xf8, + 0x20, 0x00, 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, 0xc0, 0x1d, 0xff, 0xf7, + 0x08, 0xff, 0x70, 0x78, 0x57, 0xf8, 0x20, 0x00, 0x01, 0x23, 0x10, 0x22, + 0x04, 0x21, 0xc0, 0x1d, 0xff, 0xf7, 0xff, 0xfe, 0xdf, 0xf8, 0x5c, 0x79, + 0x73, 0x78, 0x4f, 0xf4, 0xe0, 0x62, 0x00, 0xf0, 0xd0, 0xf8, 0x01, 0x23, + 0x4f, 0xf4, 0x00, 0x52, 0x0d, 0x21, 0x00, 0xf0, 0xcb, 0xf8, 0x01, 0x23, + 0x4f, 0xf4, 0x80, 0x42, 0x0e, 0x21, 0x00, 0xf0, 0xc5, 0xf8, 0x00, 0x20, + 0x00, 0x21, 0xc2, 0xb2, 0x40, 0x1c, 0x32, 0x44, 0xc3, 0xb2, 0x07, 0x2b, + 0x91, 0x77, 0xf8, 0xd9, 0x00, 0x27, 0xf8, 0xb2, 0x30, 0x44, 0xc0, 0x7a, + 0x01, 0x00, 0x13, 0xd0, 0x70, 0x72, 0xb7, 0x72, 0x21, 0x46, 0x00, 0xf0, + 0x41, 0xf8, 0x21, 0x46, 0x01, 0x20, 0x00, 0xf0, 0xb4, 0xf8, 0x00, 0xf0, + 0x2b, 0xf9, 0x05, 0x46, 0x21, 0x46, 0x00, 0x20, 0x00, 0xf0, 0x36, 0xf8, + 0x21, 0x46, 0x00, 0x20, 0x00, 0xf0, 0xa9, 0xf8, 0x7f, 0x1c, 0xf8, 0xb2, + 0x03, 0x28, 0xe2, 0xd3, 0x01, 0x20, 0x00, 0xf0, 0x02, 0xf8, 0x28, 0x46, + 0xf2, 0xbd, 0x38, 0xb5, 0x04, 0x00, 0x0c, 0xbf, 0x00, 0x21, 0x01, 0x21, + 0x08, 0x46, 0x00, 0x22, 0x00, 0xf0, 0xe6, 0xfb, 0x4f, 0xf4, 0x7a, 0x70, + 0x08, 0xf0, 0xa6, 0xfa, 0xc4, 0xb1, 0x00, 0x24, 0xdf, 0xf8, 0xa4, 0x58, + 0x69, 0x78, 0xe0, 0xb2, 0x88, 0x42, 0x05, 0xd1, 0x28, 0x78, 0x00, 0x28, + 0x1c, 0xbf, 0x28, 0x7a, 0x00, 0x28, 0x07, 0xd1, 0xe0, 0xb2, 0xff, 0xf7, + 0x06, 0xfb, 0x18, 0xb9, 0x00, 0x21, 0xe0, 0xb2, 0x00, 0xf0, 0xac, 0xfb, + 0x64, 0x1c, 0xe0, 0xb2, 0x08, 0x28, 0xe9, 0xd3, 0x00, 0x20, 0x32, 0xbd, + 0x2d, 0xe9, 0xf8, 0x4f, 0x00, 0x28, 0x81, 0x46, 0x8a, 0x46, 0xdf, 0xf8, + 0x84, 0x58, 0xdf, 0xf8, 0x84, 0x68, 0xdf, 0xf8, 0x84, 0x88, 0x4f, 0xf0, + 0x6c, 0x0b, 0x3d, 0xd0, 0x00, 0x27, 0x58, 0xf8, 0x27, 0x40, 0x0b, 0xfb, + 0x07, 0xf0, 0x50, 0x44, 0x10, 0xf0, 0x58, 0xf9, 0x10, 0xb3, 0x04, 0xf5, + 0x40, 0x74, 0x06, 0xf1, 0x08, 0x01, 0x20, 0x68, 0xc0, 0xf3, 0x03, 0x20, + 0x41, 0xf8, 0x27, 0x00, 0x06, 0xf1, 0x14, 0x01, 0x20, 0x68, 0xc0, 0xf3, + 0x01, 0x30, 0x41, 0xf8, 0x27, 0x00, 0x4b, 0x46, 0x4f, 0xf4, 0x70, 0x62, + 0x08, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x72, 0xfe, 0x01, 0x23, 0x4f, 0xf4, + 0x40, 0x52, 0x0c, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x6b, 0xfe, 0x30, 0x68, + 0x01, 0x21, 0xb9, 0x40, 0x08, 0x43, 0x30, 0x60, 0x00, 0x23, 0x28, 0x68, + 0x00, 0xf0, 0x07, 0x00, 0x70, 0x60, 0x00, 0xf0, 0x32, 0xf8, 0x00, 0xf0, + 0x2f, 0xf8, 0x00, 0x23, 0x00, 0xf0, 0x2d, 0xf8, 0x00, 0xf0, 0x2a, 0xf8, + 0x7f, 0x1c, 0x03, 0x2f, 0xc3, 0xdb, 0x0e, 0xe7, 0x00, 0x24, 0x58, 0xf8, + 0x24, 0x70, 0x73, 0x68, 0x00, 0xf0, 0x21, 0xf8, 0x0b, 0xfb, 0x04, 0xf0, + 0x50, 0x44, 0x10, 0xf0, 0x17, 0xf9, 0x90, 0xb1, 0x06, 0xf1, 0x08, 0x00, + 0x07, 0xf5, 0x40, 0x77, 0x50, 0xf8, 0x24, 0x30, 0x4f, 0xf4, 0x70, 0x62, + 0x00, 0xf0, 0x0d, 0xf8, 0x06, 0xf1, 0x14, 0x00, 0x4f, 0xf4, 0x40, 0x52, + 0x50, 0xf8, 0x24, 0x30, 0x0c, 0x21, 0x00, 0xf0, 0x05, 0xf8, 0x64, 0x1c, + 0x03, 0x2c, 0xde, 0xdb, 0xdb, 0xe7, 0x08, 0x21, 0x38, 0x46, 0x2d, 0xe6, + 0x33, 0x68, 0x07, 0x22, 0x00, 0x21, 0x28, 0x46, 0x28, 0xe6, 0x2d, 0xe9, + 0xf8, 0x43, 0x02, 0x46, 0x88, 0x46, 0x6c, 0x26, 0xdf, 0xf8, 0x9c, 0x97, + 0xdf, 0xf8, 0x9c, 0x47, 0xdf, 0xf8, 0x8c, 0x07, 0x52, 0xb3, 0x01, 0x68, + 0xc1, 0xf3, 0xc0, 0x01, 0x21, 0x60, 0x00, 0x23, 0x08, 0x22, 0x03, 0x21, + 0xff, 0xf7, 0x14, 0xfe, 0x00, 0x27, 0x00, 0xf0, 0x3c, 0xf8, 0xb8, 0xb1, + 0x05, 0xf5, 0x8e, 0x65, 0x21, 0x1d, 0x28, 0x68, 0xc0, 0xf3, 0x40, 0x60, + 0x41, 0xf8, 0x27, 0x00, 0x01, 0x23, 0x00, 0xf0, 0x37, 0xf8, 0x28, 0x68, + 0x04, 0xf1, 0x10, 0x01, 0xc0, 0xf3, 0x00, 0x60, 0x41, 0xf8, 0x27, 0x00, + 0x01, 0x23, 0x4f, 0xf0, 0x80, 0x72, 0x18, 0x21, 0x00, 0xf0, 0x2d, 0xf8, + 0x7f, 0x1c, 0x03, 0x2f, 0xe1, 0xdb, 0x00, 0x20, 0xbd, 0xe8, 0xf2, 0x83, + 0x23, 0x68, 0x08, 0x22, 0x03, 0x21, 0xff, 0xf7, 0xed, 0xfd, 0x00, 0x27, + 0x00, 0xf0, 0x15, 0xf8, 0x78, 0xb1, 0x20, 0x1d, 0x05, 0xf5, 0x8e, 0x65, + 0x50, 0xf8, 0x27, 0x30, 0x00, 0xf0, 0x14, 0xf8, 0x04, 0xf1, 0x10, 0x00, + 0x4f, 0xf0, 0x80, 0x72, 0x50, 0xf8, 0x27, 0x30, 0x18, 0x21, 0x00, 0xf0, + 0x0e, 0xf8, 0x7f, 0x1c, 0x03, 0x2f, 0xe9, 0xdb, 0xdf, 0xe7, 0x59, 0xf8, + 0x27, 0x50, 0x06, 0xfb, 0x07, 0xf0, 0x40, 0x44, 0x10, 0xf0, 0x9c, 0xb8, + 0x4f, 0xf0, 0x00, 0x72, 0x19, 0x21, 0x28, 0x46, 0xc8, 0xe5, 0x38, 0xb5, + 0xdf, 0xf8, 0xd0, 0x26, 0x52, 0xf8, 0x20, 0x50, 0x00, 0x24, 0x39, 0xb1, + 0xad, 0x1d, 0x00, 0x23, 0x00, 0xf0, 0x0a, 0xf8, 0x01, 0x23, 0x00, 0xf0, + 0x07, 0xf8, 0x03, 0xe0, 0x15, 0xf8, 0x05, 0x4f, 0x04, 0xf0, 0x01, 0x04, + 0x20, 0x46, 0x32, 0xbd, 0x01, 0x22, 0x00, 0x21, 0x28, 0x46, 0xa6, 0xe5, + 0x2d, 0xe9, 0xf8, 0x43, 0x0f, 0xf2, 0x90, 0x71, 0xdf, 0xf8, 0x88, 0x56, + 0x84, 0xb0, 0xd1, 0xe9, 0x00, 0x23, 0x6e, 0x78, 0xdf, 0xf8, 0x8c, 0x96, + 0x02, 0xa8, 0x4f, 0xf0, 0x00, 0x08, 0xc0, 0xe9, 0x00, 0x23, 0x00, 0x27, + 0x07, 0xeb, 0x47, 0x00, 0xa9, 0x7a, 0x28, 0x44, 0x01, 0x44, 0xf8, 0xb2, + 0x81, 0xf8, 0x26, 0x80, 0x59, 0xf8, 0x27, 0x40, 0xff, 0xf7, 0xed, 0xf9, + 0x08, 0xb9, 0xb7, 0x42, 0x0e, 0xd1, 0x05, 0xf1, 0x0e, 0x00, 0xc3, 0x5d, + 0xff, 0x2b, 0x08, 0xbf, 0x01, 0x20, 0x07, 0xd0, 0x00, 0x21, 0x0d, 0xf8, + 0x07, 0x10, 0x07, 0x22, 0xe0, 0x1d, 0xff, 0xf7, 0x78, 0xfd, 0x01, 0xe0, + 0x0d, 0xf8, 0x07, 0x00, 0x7f, 0x1c, 0x08, 0x2f, 0xdc, 0xd3, 0x0d, 0xf8, + 0x06, 0x80, 0x05, 0xf1, 0x0e, 0x01, 0x8a, 0x5d, 0xff, 0x2a, 0x04, 0xd1, + 0x59, 0xf8, 0x26, 0x00, 0x00, 0x23, 0x00, 0xf0, 0xce, 0xf8, 0x00, 0x24, + 0x00, 0x26, 0x1d, 0xf8, 0x06, 0x00, 0x20, 0xb1, 0x59, 0xf8, 0x26, 0x00, + 0xe3, 0xb2, 0x00, 0xf0, 0xc4, 0xf8, 0x76, 0x1c, 0x08, 0x2e, 0xf4, 0xd3, + 0x01, 0x20, 0xff, 0xf7, 0x96, 0xfe, 0x00, 0x26, 0xf0, 0xb2, 0x1d, 0xf8, + 0x00, 0x00, 0x18, 0xb1, 0x01, 0x21, 0xf0, 0xb2, 0xff, 0xf7, 0x8d, 0xff, + 0x76, 0x1c, 0xf0, 0xb2, 0x08, 0x28, 0xf3, 0xd3, 0x68, 0x68, 0x08, 0xf0, + 0x39, 0xf9, 0x00, 0x26, 0x1d, 0xf8, 0x06, 0x00, 0xb8, 0xb1, 0x00, 0x21, + 0xf0, 0xb2, 0xff, 0xf7, 0x7e, 0xff, 0x06, 0xeb, 0x46, 0x01, 0xaa, 0x7a, + 0x29, 0x44, 0x11, 0x44, 0x00, 0xf0, 0x01, 0x00, 0x91, 0xf8, 0x26, 0x30, + 0xa0, 0x40, 0x03, 0x43, 0x81, 0xf8, 0x26, 0x30, 0x05, 0xf1, 0x1e, 0x01, + 0x05, 0xf1, 0x1e, 0x03, 0x8a, 0x5d, 0x10, 0x43, 0x98, 0x55, 0x76, 0x1c, + 0x08, 0x2e, 0xe1, 0xd3, 0x00, 0x20, 0xff, 0xf7, 0x64, 0xfe, 0x64, 0x1c, + 0xe0, 0xb2, 0x05, 0x28, 0xba, 0xd3, 0x00, 0x21, 0xdf, 0xf8, 0xac, 0x45, + 0x1d, 0xf8, 0x01, 0x00, 0x38, 0xb1, 0x05, 0xf1, 0x1e, 0x02, 0x50, 0x5c, + 0x14, 0xf8, 0x10, 0x30, 0x05, 0xf1, 0x16, 0x02, 0x53, 0x54, 0x49, 0x1c, + 0x08, 0x29, 0xf1, 0xd3, 0x00, 0x27, 0x1d, 0xf8, 0x07, 0x00, 0x00, 0x28, + 0x6a, 0xd0, 0x05, 0xf1, 0x1e, 0x01, 0xc8, 0x5d, 0x00, 0x28, 0x18, 0xbf, + 0x1f, 0x28, 0x56, 0xd1, 0x00, 0x21, 0x4f, 0xf0, 0x7f, 0x0c, 0xff, 0x22, + 0xff, 0x23, 0x78, 0x1c, 0x0e, 0xe0, 0x05, 0xf1, 0x1e, 0x00, 0x10, 0xf8, + 0x0e, 0x00, 0x00, 0x28, 0x18, 0xbf, 0x1f, 0x28, 0x04, 0xd0, 0xae, 0xeb, + 0x07, 0x02, 0x71, 0x46, 0x4f, 0xf0, 0x08, 0x0e, 0x0e, 0xf1, 0x01, 0x00, + 0x4f, 0xfa, 0x80, 0xfe, 0xbe, 0xf1, 0x08, 0x0f, 0xeb, 0xdb, 0x78, 0x1e, + 0x0e, 0xe0, 0x05, 0xf1, 0x1e, 0x00, 0x10, 0xf8, 0x0e, 0x00, 0x00, 0x28, + 0x18, 0xbf, 0x1f, 0x28, 0x04, 0xd0, 0xa7, 0xeb, 0x0e, 0x03, 0xf4, 0x46, + 0x4f, 0xf0, 0xff, 0x3e, 0xae, 0xf1, 0x01, 0x00, 0x4f, 0xfa, 0x80, 0xfe, + 0xbe, 0xf1, 0x00, 0x0f, 0xeb, 0xd5, 0xd8, 0xb2, 0xff, 0x28, 0x0e, 0xd0, + 0xd0, 0xb2, 0xde, 0xb2, 0xb0, 0x42, 0x0a, 0xd1, 0x05, 0xf1, 0x1e, 0x02, + 0x05, 0xf1, 0x1e, 0x03, 0x51, 0x5c, 0x13, 0xf8, 0x0c, 0x00, 0x01, 0x43, + 0x14, 0xf8, 0x11, 0x00, 0x10, 0xe0, 0xd8, 0xb2, 0xd6, 0xb2, 0xb0, 0x42, + 0x04, 0xd2, 0x05, 0xf1, 0x16, 0x00, 0x10, 0xf8, 0x0c, 0x00, 0x07, 0xe0, + 0xd2, 0xb2, 0xdb, 0xb2, 0x9a, 0x42, 0x3a, 0xbf, 0x05, 0xf1, 0x16, 0x02, + 0x50, 0x5c, 0xff, 0x20, 0x05, 0xf1, 0x16, 0x01, 0xc8, 0x55, 0x05, 0xf1, + 0x16, 0x00, 0xc3, 0x5d, 0xff, 0x2b, 0x03, 0xd1, 0x02, 0xa8, 0x4b, 0xf6, + 0x17, 0x08, 0xc3, 0x5d, 0x59, 0xf8, 0x27, 0x00, 0x00, 0xf0, 0x07, 0xf8, + 0x7f, 0x1c, 0x08, 0x2f, 0x8d, 0xd3, 0x40, 0x46, 0x05, 0xb0, 0xbd, 0xe8, + 0xf0, 0x83, 0x07, 0x22, 0x00, 0x21, 0xc0, 0x1d, 0x93, 0xe4, 0x7c, 0xb5, + 0x04, 0x46, 0xdf, 0xf8, 0x84, 0x04, 0xdf, 0xf8, 0x94, 0x24, 0x05, 0x68, + 0x45, 0xf4, 0x00, 0x46, 0x25, 0xf4, 0x00, 0x45, 0x01, 0x95, 0x00, 0x96, + 0x23, 0x46, 0xff, 0x21, 0x03, 0x20, 0xfd, 0xf7, 0xa8, 0xfe, 0x00, 0x23, + 0x32, 0x46, 0x29, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x02, 0xf8, 0x00, 0x20, + 0x76, 0xbd, 0x30, 0xb4, 0x00, 0x28, 0x09, 0xd1, 0xef, 0xf3, 0x10, 0x84, + 0x72, 0xb6, 0xdf, 0xf8, 0x48, 0x54, 0x2a, 0x60, 0x29, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x1a, 0xe0, 0x01, 0x28, 0x0a, 0xd1, 0xef, 0xf3, 0x10, 0x84, + 0x72, 0xb6, 0xdf, 0xf8, 0x30, 0x54, 0x2a, 0x60, 0x00, 0xbf, 0x29, 0x60, + 0x84, 0xf3, 0x10, 0x88, 0x0d, 0xe0, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0xdf, 0xf8, 0x18, 0x54, 0x2a, 0x60, 0x00, 0x28, 0x02, 0xd0, 0x40, 0x1e, + 0x00, 0xbf, 0xfa, 0xe7, 0x29, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbc, + 0x70, 0x47, 0xdf, 0xf8, 0xe4, 0x03, 0x70, 0x47, 0x38, 0xb5, 0x00, 0xf0, + 0x44, 0xf8, 0x10, 0xb9, 0x4b, 0xf6, 0x15, 0x04, 0x10, 0xe0, 0xdf, 0xf8, + 0xe0, 0x03, 0x29, 0x78, 0x50, 0xf8, 0x21, 0x00, 0x81, 0x1c, 0xc0, 0x1c, + 0x0a, 0x78, 0x02, 0xf0, 0x07, 0x02, 0x6a, 0x70, 0x00, 0x78, 0xa8, 0x70, + 0x08, 0x78, 0xc0, 0xf3, 0x02, 0x10, 0xe8, 0x70, 0x20, 0x46, 0x32, 0xbd, + 0xf8, 0xb5, 0x00, 0xf0, 0x2a, 0xf8, 0x10, 0xb9, 0x4b, 0xf6, 0x15, 0x04, + 0x23, 0xe0, 0x6b, 0x78, 0x03, 0x2b, 0x05, 0xdc, 0xa8, 0x78, 0x03, 0x28, + 0x02, 0xda, 0xe8, 0x78, 0x04, 0x28, 0x02, 0xdd, 0x4b, 0xf6, 0x16, 0x04, + 0x17, 0xe0, 0xdf, 0xf8, 0x94, 0x03, 0x29, 0x78, 0x50, 0xf8, 0x21, 0x60, + 0xb7, 0x1c, 0x07, 0x22, 0x00, 0xf0, 0x16, 0xf8, 0xab, 0x78, 0xff, 0x22, + 0x00, 0x21, 0xf0, 0x1c, 0xff, 0xf7, 0x11, 0xfc, 0xeb, 0x78, 0x70, 0x22, + 0x04, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x0b, 0xfc, 0x30, 0x46, 0x00, 0xf0, + 0x0b, 0xf8, 0x20, 0x46, 0xf2, 0xbd, 0x05, 0x46, 0x00, 0x24, 0x28, 0x78, + 0xff, 0xf7, 0x65, 0xb8, 0x00, 0x21, 0x38, 0x46, 0xff, 0xf7, 0xfd, 0xbb, + 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, 0x82, 0xb0, 0x81, 0x46, + 0x08, 0xf0, 0x1b, 0xfa, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, + 0xdf, 0xed, 0xc8, 0x0a, 0xb3, 0xee, 0x09, 0x1a, 0x00, 0xee, 0x20, 0x1a, + 0xb6, 0xee, 0x00, 0x0a, 0x31, 0xee, 0x00, 0x0a, 0x09, 0xf1, 0x20, 0x0a, + 0xbc, 0xee, 0xc0, 0x8a, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x50, 0x46, + 0xff, 0xf7, 0xdd, 0xfb, 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x32, 0x00, + 0xff, 0xf7, 0xd2, 0xfb, 0x06, 0x46, 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, + 0x31, 0x00, 0xff, 0xf7, 0xcb, 0xfb, 0x0f, 0x22, 0x00, 0x21, 0x40, 0xea, + 0x06, 0x20, 0xb0, 0xfa, 0x80, 0xf5, 0x09, 0xf1, 0x36, 0x00, 0xff, 0xf7, + 0xc1, 0xfb, 0x06, 0x46, 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x35, 0x00, + 0xff, 0xf7, 0xba, 0xfb, 0xff, 0x22, 0x00, 0x21, 0x40, 0xea, 0x06, 0x20, + 0xb0, 0xfa, 0x80, 0xf7, 0x09, 0xf1, 0x39, 0x00, 0xff, 0xf7, 0xb0, 0xfb, + 0xff, 0x22, 0x00, 0x21, 0xc5, 0xf1, 0x20, 0x05, 0xc7, 0xf1, 0x20, 0x07, + 0xb0, 0xfa, 0x80, 0xf6, 0x09, 0xf1, 0x34, 0x00, 0xff, 0xf7, 0xa4, 0xfb, + 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x33, 0x00, 0xff, 0xf7, 0x9e, 0xfb, + 0x83, 0x46, 0x0f, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x38, 0x00, 0xff, 0xf7, + 0x97, 0xfb, 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x37, 0x00, 0xff, 0xf7, + 0x91, 0xfb, 0x80, 0x46, 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x3a, 0x00, + 0xff, 0xf7, 0x8a, 0xfb, 0xc6, 0xf1, 0x20, 0x06, 0x04, 0x46, 0x79, 0x19, + 0x71, 0x18, 0x18, 0xee, 0x10, 0x0a, 0x02, 0xe0, 0x76, 0x1c, 0x79, 0x19, + 0x71, 0x18, 0x81, 0x42, 0x09, 0xd2, 0x10, 0x2d, 0x38, 0xbf, 0x6d, 0x1c, + 0xf7, 0xd3, 0x08, 0x2f, 0x38, 0xbf, 0x7f, 0x1c, 0xf3, 0xd3, 0x06, 0x2e, + 0xf0, 0xd3, 0x58, 0x46, 0x00, 0xf0, 0x69, 0xf8, 0x8d, 0xf8, 0x00, 0x00, + 0x40, 0x46, 0x00, 0xf0, 0x64, 0xf8, 0x83, 0x46, 0x20, 0x46, 0x00, 0xf0, + 0x60, 0xf8, 0x80, 0x46, 0x01, 0x24, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, + 0x50, 0x46, 0x04, 0xfa, 0x05, 0xf5, 0xff, 0xf7, 0x62, 0xfb, 0x6d, 0x1e, + 0x2b, 0x04, 0x1b, 0x0e, 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x12, 0x00, + 0xff, 0xf7, 0x59, 0xfb, 0xeb, 0xb2, 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, + 0x11, 0x00, 0x04, 0xfa, 0x07, 0xf7, 0xff, 0xf7, 0x50, 0xfb, 0x7f, 0x1e, + 0x3b, 0x04, 0x1b, 0x0e, 0x0f, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x16, 0x00, + 0xff, 0xf7, 0x47, 0xfb, 0xfb, 0xb2, 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, + 0x15, 0x00, 0xff, 0xf7, 0x40, 0xfb, 0x04, 0xfa, 0x06, 0xf6, 0x76, 0x1e, + 0xf3, 0xb2, 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x19, 0x00, 0xff, 0xf7, + 0x36, 0xfb, 0x00, 0x23, 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x14, 0x00, + 0xff, 0xf7, 0x2f, 0xfb, 0x9d, 0xf8, 0x00, 0x30, 0xff, 0x22, 0x00, 0x21, + 0x09, 0xf1, 0x13, 0x00, 0xff, 0xf7, 0x27, 0xfb, 0x00, 0x23, 0x0f, 0x22, + 0x00, 0x21, 0x09, 0xf1, 0x18, 0x00, 0xff, 0xf7, 0x20, 0xfb, 0x5b, 0x46, + 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x17, 0x00, 0xff, 0xf7, 0x19, 0xfb, + 0x02, 0xb0, 0x43, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0x09, 0xf1, 0x1a, 0x00, + 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, 0xff, 0x22, 0x00, 0x21, 0xff, 0xf7, + 0x0c, 0xbb, 0x70, 0xb5, 0x01, 0x46, 0x00, 0x20, 0x00, 0x22, 0x54, 0x00, + 0x01, 0x23, 0x64, 0x1c, 0x03, 0xfa, 0x04, 0xf4, 0x55, 0x00, 0xab, 0x40, + 0x21, 0xfa, 0x02, 0xf5, 0xee, 0x07, 0x02, 0xd5, 0x23, 0x43, 0x18, 0x43, + 0x03, 0xe0, 0xe4, 0x43, 0x24, 0xea, 0x03, 0x03, 0x18, 0x40, 0x52, 0x1c, + 0x04, 0x2a, 0xea, 0xd3, 0xc0, 0xb2, 0x70, 0xbd, 0x70, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x11, 0xf0, 0x29, 0xf8, 0x06, 0x68, 0x17, 0x20, 0x10, 0xf0, + 0x25, 0xfa, 0x36, 0x0c, 0x01, 0x28, 0x06, 0xf0, 0x01, 0x06, 0x0b, 0xd1, + 0x20, 0x46, 0xfe, 0xf7, 0x44, 0xff, 0x06, 0x43, 0x06, 0xd0, 0x29, 0x46, + 0x20, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x4b, 0x4a, 0xfb, 0xf7, 0x63, 0xba, + 0x29, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0xfb, 0xf7, 0xc0, 0xb9, + 0x2d, 0xe9, 0xf0, 0x41, 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0xfc, 0xf7, + 0x0e, 0xfc, 0x01, 0x28, 0x26, 0xd1, 0x00, 0x27, 0xdf, 0xf8, 0xd0, 0x80, + 0x01, 0x2e, 0x05, 0xd1, 0x08, 0xf1, 0x3e, 0x02, 0x01, 0x21, 0xf8, 0xb2, + 0xfb, 0xf7, 0xc3, 0xf9, 0xf8, 0xb2, 0xfe, 0xf7, 0x1e, 0xff, 0x00, 0x28, + 0x0c, 0xbf, 0x21, 0x46, 0x29, 0x46, 0xf8, 0xb2, 0xff, 0xf7, 0xc2, 0xff, + 0x7f, 0x1c, 0xf8, 0xb2, 0x08, 0x28, 0xe9, 0xd3, 0x17, 0x20, 0x10, 0xf0, + 0xe9, 0xf9, 0x02, 0x46, 0x08, 0xf1, 0x3e, 0x01, 0x28, 0x46, 0xfb, 0xf7, + 0xf5, 0xf9, 0x01, 0x2d, 0x02, 0xd1, 0xbd, 0xe8, 0xf0, 0x41, 0x01, 0xe0, + 0xbd, 0xe8, 0xf0, 0x81, 0x2d, 0xe9, 0xf0, 0x41, 0x17, 0x20, 0x10, 0xf0, + 0xd7, 0xf9, 0x04, 0x46, 0x00, 0x27, 0x2b, 0x4d, 0xdf, 0xf8, 0x80, 0x80, + 0xf8, 0xb2, 0xfe, 0xf7, 0xf6, 0xfe, 0x01, 0x28, 0x06, 0xd1, 0x00, 0xf0, + 0x5f, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0x57, 0xf8, 0x00, 0xf0, 0x4e, 0xf8, + 0x7f, 0x1c, 0x08, 0x2f, 0xf0, 0xd3, 0x23, 0x4f, 0x01, 0x20, 0x07, 0xf0, + 0x75, 0xfe, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x20, 0x48, 0xff, 0xf7, + 0x7c, 0xfa, 0x00, 0x23, 0x01, 0x22, 0xff, 0xf7, 0x77, 0xfe, 0x38, 0x78, + 0x00, 0xf0, 0x3b, 0xf8, 0x00, 0x27, 0xf8, 0xb2, 0xfe, 0xf7, 0xd5, 0xfe, + 0x01, 0x28, 0x09, 0xd0, 0x00, 0xf0, 0x3e, 0xf8, 0x0c, 0xb1, 0x00, 0x23, + 0x00, 0xe0, 0x01, 0x23, 0x00, 0xf0, 0x33, 0xf8, 0x00, 0xf0, 0x2a, 0xf8, + 0x7f, 0x1c, 0x08, 0x2f, 0xed, 0xd3, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x00, + 0xcd, 0xcc, 0xcc, 0x3d, 0xe0, 0x46, 0x00, 0x20, 0x3d, 0x09, 0x00, 0x47, + 0x00, 0x80, 0x07, 0x48, 0xa4, 0x77, 0x02, 0x20, 0x88, 0x98, 0x04, 0x01, + 0x25, 0x40, 0x07, 0x48, 0x03, 0x80, 0x07, 0x48, 0x10, 0x06, 0x00, 0x48, + 0x4c, 0x75, 0x02, 0x20, 0x8c, 0x9d, 0x04, 0x01, 0x04, 0x76, 0x02, 0x20, + 0x78, 0x47, 0x00, 0x20, 0x7c, 0x90, 0x04, 0x01, 0x1e, 0x47, 0x00, 0x20, + 0xad, 0x77, 0x02, 0x20, 0x00, 0x40, 0x07, 0x48, 0x01, 0x40, 0x07, 0x48, + 0x30, 0x78, 0x29, 0x78, 0x00, 0xf0, 0x01, 0x00, 0x40, 0x18, 0x28, 0x70, + 0x70, 0x47, 0x01, 0x22, 0x00, 0x21, 0x30, 0x46, 0xff, 0xf7, 0x2f, 0xba, + 0x58, 0xf8, 0x27, 0x60, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x70, 0x1c, + 0xff, 0xf7, 0x27, 0xba, 0x2d, 0xe9, 0xf8, 0x43, 0x07, 0x46, 0x0e, 0x46, + 0xfc, 0xf7, 0x65, 0xfb, 0x00, 0x25, 0x01, 0x28, 0x3d, 0xd1, 0xa8, 0x46, + 0x00, 0x24, 0x4f, 0xf0, 0x01, 0x09, 0xe0, 0xb2, 0xfe, 0xf7, 0x7b, 0xfe, + 0x01, 0x28, 0x05, 0xd1, 0x09, 0xfa, 0x04, 0xf0, 0x40, 0xea, 0x08, 0x00, + 0x5f, 0xfa, 0x80, 0xf8, 0x64, 0x1c, 0xe0, 0xb2, 0x08, 0x28, 0xf0, 0xd3, + 0xff, 0x2f, 0x18, 0xbf, 0x47, 0x45, 0x0c, 0xd1, 0x30, 0x00, 0x02, 0xd1, + 0x00, 0x22, 0x00, 0x21, 0x03, 0xe0, 0x01, 0x2e, 0x1f, 0xd1, 0x00, 0x22, + 0x01, 0x21, 0x00, 0x20, 0xff, 0xf7, 0x2a, 0xff, 0x1a, 0xe0, 0x00, 0x24, + 0x28, 0xfa, 0x04, 0xf0, 0xc0, 0x07, 0x0f, 0xd5, 0x09, 0xfa, 0x04, 0xf0, + 0x07, 0x42, 0x0b, 0xd0, 0x30, 0x00, 0x03, 0xd0, 0x01, 0x2e, 0x06, 0xd1, + 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0xe0, 0xb2, 0xff, 0xf7, 0xf6, 0xfe, + 0x00, 0xe0, 0x01, 0x25, 0x64, 0x1c, 0xe0, 0xb2, 0x08, 0x28, 0xe7, 0xd3, + 0x00, 0xe0, 0x01, 0x25, 0x28, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x80, 0xb5, 0x11, 0xf0, + 0x75, 0xfd, 0x00, 0x20, 0x02, 0xbd, 0x38, 0xb5, 0x04, 0x46, 0x04, 0xf1, + 0x34, 0x05, 0x01, 0x20, 0xa8, 0x70, 0x39, 0xb1, 0x08, 0x68, 0x20, 0x60, + 0x8a, 0x68, 0xea, 0x60, 0x48, 0x68, 0x68, 0x60, 0xc9, 0x68, 0xa9, 0x60, + 0x00, 0x20, 0x28, 0x70, 0x00, 0x21, 0xe8, 0x68, 0x69, 0x70, 0x00, 0x22, + 0x02, 0x60, 0x00, 0x20, 0xea, 0x68, 0x51, 0x60, 0xe9, 0x68, 0x88, 0x60, + 0xe9, 0x68, 0xc8, 0x60, 0xe9, 0x68, 0x08, 0x61, 0xdf, 0xf8, 0xa8, 0x0b, + 0xa2, 0x68, 0x40, 0xf8, 0x22, 0x40, 0xe1, 0x68, 0x20, 0x69, 0xee, 0xf7, + 0xe9, 0xfd, 0xe9, 0x69, 0x60, 0x69, 0xee, 0xf7, 0xea, 0xfd, 0x22, 0x6a, + 0xe1, 0x69, 0xa0, 0x69, 0xee, 0xf7, 0xe8, 0xfd, 0xa1, 0x6a, 0x60, 0x6a, + 0xee, 0xf7, 0xea, 0xfd, 0x02, 0x20, 0xa8, 0x70, 0x00, 0x20, 0x32, 0xbd, + 0x2d, 0xe9, 0xf0, 0x4f, 0xcd, 0xb0, 0x04, 0x46, 0x00, 0x20, 0x94, 0xf8, + 0x34, 0x10, 0x01, 0x29, 0x04, 0xd1, 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, + 0xba, 0xff, 0x73, 0xe2, 0x02, 0x29, 0x04, 0xf1, 0x34, 0x06, 0x40, 0xf0, + 0x60, 0x82, 0x02, 0x90, 0x62, 0x68, 0x8d, 0xf8, 0x04, 0x20, 0x71, 0x68, + 0x03, 0x91, 0x01, 0xf5, 0x80, 0x71, 0x04, 0x91, 0xd6, 0xf8, 0x08, 0xb0, + 0x9b, 0xf8, 0x15, 0x00, 0x77, 0x78, 0x00, 0x28, 0x0b, 0xf5, 0x16, 0x78, + 0x00, 0xf0, 0x49, 0x82, 0x03, 0x98, 0x05, 0x68, 0x04, 0x21, 0xb1, 0x70, + 0x03, 0x98, 0x00, 0xf1, 0x77, 0x01, 0x06, 0x91, 0x02, 0xa9, 0x06, 0x98, + 0x40, 0x78, 0xee, 0xf7, 0x1f, 0xff, 0x0b, 0xf2, 0x42, 0x21, 0x01, 0x2f, + 0x18, 0xbf, 0x02, 0x2f, 0x48, 0x82, 0x34, 0xd1, 0x70, 0x68, 0x00, 0xf1, + 0xb8, 0x09, 0x4f, 0xf0, 0x00, 0x0a, 0x09, 0xeb, 0x0a, 0x00, 0x01, 0x78, + 0x00, 0x29, 0x1e, 0xbf, 0x09, 0xeb, 0x0a, 0x01, 0x8a, 0x7a, 0x00, 0x2a, + 0x17, 0xd0, 0x00, 0x21, 0x01, 0xe0, 0x52, 0x08, 0x49, 0x1c, 0xd3, 0x07, + 0xfb, 0xd5, 0x09, 0xf1, 0x14, 0x02, 0x09, 0xeb, 0x0a, 0x0e, 0x12, 0xf8, + 0x0a, 0x30, 0xd4, 0xf8, 0x00, 0xc0, 0x00, 0x78, 0x9e, 0xf8, 0x0a, 0x20, + 0xc9, 0xb2, 0x60, 0x44, 0xfb, 0xf7, 0x65, 0xfc, 0x01, 0x20, 0xee, 0xf7, + 0x91, 0xfd, 0x0a, 0xf1, 0x01, 0x0a, 0xba, 0xf1, 0x0a, 0x0f, 0xd8, 0xd3, + 0x68, 0x06, 0x04, 0xd5, 0x9d, 0xf8, 0x04, 0x00, 0x10, 0x21, 0xfb, 0xf7, + 0x32, 0xfc, 0x01, 0x2f, 0x01, 0xd0, 0x03, 0x2f, 0x32, 0xd1, 0x9d, 0xf8, + 0x04, 0x00, 0xfb, 0xf7, 0x17, 0xfd, 0xfc, 0x21, 0x0b, 0xf5, 0xac, 0x70, + 0x00, 0xf0, 0xca, 0xff, 0xb0, 0x68, 0x90, 0xf9, 0xde, 0x94, 0x4f, 0xf4, + 0x79, 0x71, 0x00, 0xf5, 0x16, 0x70, 0x00, 0xf0, 0xc1, 0xff, 0xb0, 0x68, + 0x80, 0xf8, 0xde, 0x94, 0x00, 0x20, 0x04, 0x99, 0x01, 0xf1, 0x2f, 0x02, + 0x00, 0x92, 0x08, 0xeb, 0x00, 0x01, 0x01, 0xf2, 0x13, 0x21, 0x3f, 0x22, + 0xca, 0x71, 0x00, 0x23, 0x4b, 0x72, 0x40, 0x1c, 0x00, 0x9a, 0x13, 0x7d, + 0x0b, 0x70, 0x01, 0x28, 0x00, 0x9a, 0xd3, 0x7c, 0x0b, 0x71, 0xee, 0xd9, + 0x6f, 0xf0, 0xc7, 0x00, 0xa8, 0xf8, 0xe6, 0x02, 0x00, 0x21, 0xb0, 0x68, + 0x80, 0xf8, 0xdc, 0x14, 0xe9, 0x06, 0x03, 0x98, 0x00, 0xf1, 0x56, 0x09, + 0x2a, 0xd4, 0x01, 0x2f, 0x1c, 0xbf, 0x17, 0x2f, 0x06, 0x2f, 0x25, 0xd1, + 0x28, 0x06, 0x0f, 0xd5, 0x9b, 0xf8, 0x15, 0x10, 0x02, 0x29, 0x0c, 0xbf, + 0x01, 0x21, 0x00, 0x21, 0x01, 0x22, 0x20, 0x46, 0x10, 0xf0, 0xbb, 0xff, + 0x20, 0x46, 0x11, 0xf0, 0xbb, 0xf8, 0x01, 0x20, 0xee, 0xf7, 0x32, 0xfd, + 0x06, 0x99, 0x0d, 0xf1, 0x06, 0x00, 0x00, 0x90, 0x05, 0xab, 0x0a, 0x78, + 0x99, 0xf9, 0x20, 0x10, 0x9d, 0xf8, 0x04, 0x00, 0x11, 0xf0, 0xf8, 0xff, + 0x9d, 0xf8, 0x07, 0x00, 0x0b, 0xf5, 0xa9, 0x71, 0x08, 0x72, 0x9d, 0xf8, + 0x15, 0x00, 0x48, 0x72, 0x00, 0xf0, 0x54, 0xfc, 0x02, 0xd1, 0xe9, 0x07, + 0x28, 0xd4, 0x03, 0xe0, 0x01, 0x28, 0x25, 0xd1, 0xe9, 0x05, 0x23, 0xd4, + 0x01, 0x2f, 0x18, 0xbf, 0x04, 0x2f, 0x1f, 0xd1, 0x02, 0x28, 0x0b, 0xf1, + 0x18, 0x00, 0x00, 0x90, 0x0c, 0xbf, 0x01, 0x21, 0x00, 0x21, 0x03, 0x9a, + 0x9d, 0xf8, 0x04, 0x00, 0x00, 0x23, 0x10, 0x32, 0x12, 0xf0, 0x8e, 0xfa, + 0x00, 0xf0, 0x3e, 0xfe, 0x08, 0xf1, 0x78, 0x01, 0x0b, 0xf1, 0x64, 0x00, + 0xee, 0xf7, 0x41, 0xff, 0x0b, 0xf1, 0x60, 0x00, 0x08, 0xf1, 0x81, 0x03, + 0x81, 0x78, 0x00, 0x78, 0x08, 0xf1, 0x80, 0x02, 0x10, 0x70, 0x19, 0x70, + 0x05, 0xf0, 0x0a, 0x00, 0x02, 0x28, 0x00, 0xf0, 0x8f, 0x80, 0x17, 0x2f, + 0x1c, 0xbf, 0x01, 0x2f, 0x05, 0x2f, 0x1e, 0xd1, 0x00, 0xf0, 0x1c, 0xfc, + 0x10, 0xd1, 0x28, 0x07, 0x0e, 0xd5, 0x03, 0x99, 0x9d, 0xf8, 0x04, 0x00, + 0x01, 0xf1, 0x31, 0x0a, 0x9a, 0xf9, 0x06, 0x10, 0xee, 0xf7, 0x4a, 0xfd, + 0x9a, 0xf8, 0x00, 0x10, 0x9d, 0xf8, 0x04, 0x00, 0xfb, 0xf7, 0xe2, 0xfa, + 0xa8, 0x07, 0x03, 0xd4, 0x9b, 0xf8, 0x15, 0x10, 0x02, 0x29, 0x05, 0xd0, + 0xa8, 0x05, 0x6d, 0xd4, 0x9b, 0xf8, 0x15, 0x10, 0x01, 0x29, 0x69, 0xd1, + 0x0b, 0xf2, 0x42, 0x20, 0xb0, 0xf9, 0x12, 0xa0, 0xa0, 0xf8, 0x00, 0xa0, + 0x0b, 0xf5, 0x11, 0x70, 0x03, 0x99, 0x00, 0x90, 0x01, 0xf1, 0xdc, 0x02, + 0xb9, 0xf9, 0x00, 0x30, 0x00, 0xf0, 0xe5, 0xfb, 0x0b, 0xf2, 0x46, 0x20, + 0x00, 0x90, 0x64, 0x21, 0x03, 0x98, 0xb9, 0xf9, 0x02, 0x30, 0x00, 0xf1, + 0xe2, 0x02, 0x00, 0xf0, 0xdb, 0xfb, 0x0b, 0xf5, 0x12, 0x70, 0x00, 0x90, + 0x64, 0x21, 0x03, 0x98, 0x99, 0xf9, 0x04, 0x30, 0x00, 0xf1, 0xe8, 0x02, + 0x00, 0xf0, 0xd0, 0xfb, 0x0b, 0xf2, 0x4a, 0x20, 0x00, 0x90, 0x64, 0x21, + 0x03, 0x98, 0x99, 0xf8, 0x05, 0x30, 0x00, 0xf1, 0xee, 0x02, 0x00, 0xf0, + 0xc5, 0xfb, 0x06, 0x99, 0x0b, 0xf5, 0x13, 0x70, 0x00, 0x90, 0x50, 0x46, + 0xcb, 0x7a, 0x03, 0x99, 0x01, 0xf1, 0xf4, 0x02, 0x64, 0x21, 0xee, 0xf7, + 0xe5, 0xfe, 0x0b, 0xf2, 0x4e, 0x20, 0x03, 0x99, 0x00, 0x90, 0x01, 0xf1, + 0xfa, 0x02, 0x32, 0x23, 0x00, 0xf0, 0xaf, 0xfb, 0x0b, 0xf5, 0x14, 0x70, + 0x03, 0x99, 0x00, 0x90, 0x01, 0xf1, 0x88, 0x02, 0x0a, 0x23, 0x0a, 0x21, + 0x00, 0xf0, 0xa6, 0xfb, 0x0b, 0xf2, 0x52, 0x20, 0x03, 0x99, 0x00, 0x90, + 0x01, 0xf1, 0x8e, 0x02, 0x4f, 0xf4, 0xfa, 0x43, 0x0a, 0x21, 0x00, 0xf0, + 0x9b, 0xfb, 0x03, 0x98, 0xc1, 0x68, 0x8b, 0xf8, 0x52, 0x11, 0x17, 0x2f, + 0xb3, 0x69, 0x72, 0x69, 0x0c, 0xbf, 0x01, 0x21, 0x00, 0x21, 0x20, 0x46, + 0x11, 0xf0, 0xba, 0xfb, 0x00, 0xf0, 0x9a, 0xfd, 0x00, 0xf0, 0x92, 0xfb, + 0x18, 0xd1, 0x04, 0x98, 0x01, 0x68, 0x0a, 0x05, 0x17, 0xd4, 0x00, 0x21, + 0x00, 0xf8, 0x8c, 0x1f, 0x41, 0x70, 0x9d, 0xf8, 0x04, 0x00, 0xfb, 0xf7, + 0x12, 0xfa, 0x00, 0x21, 0x00, 0x22, 0x00, 0x28, 0x02, 0xd5, 0x40, 0x42, + 0x02, 0x46, 0x01, 0xe0, 0xc8, 0xbf, 0x01, 0x46, 0x08, 0xf5, 0x46, 0x70, + 0x01, 0x70, 0x42, 0x70, 0x00, 0xf0, 0x76, 0xfb, 0x05, 0xd1, 0x68, 0x07, + 0x00, 0xf1, 0xac, 0x80, 0x01, 0x2f, 0x18, 0xbf, 0x07, 0x2f, 0x40, 0xf0, + 0xa7, 0x80, 0x01, 0x20, 0x8b, 0xf8, 0x14, 0x00, 0x01, 0x22, 0x00, 0xf0, + 0x62, 0xfb, 0x00, 0xf0, 0x6b, 0xfd, 0x03, 0x98, 0x41, 0x68, 0x04, 0x98, + 0x02, 0x68, 0x06, 0x92, 0x0d, 0x0c, 0xb2, 0x68, 0x92, 0xf9, 0xde, 0x04, + 0x01, 0xf0, 0x0f, 0x07, 0x05, 0xf0, 0x0f, 0x05, 0x00, 0x28, 0x02, 0xbf, + 0x0a, 0x2f, 0x03, 0x27, 0x02, 0x25, 0x08, 0x0a, 0x00, 0xf0, 0x0f, 0x09, + 0x48, 0x09, 0x09, 0x09, 0x00, 0xf0, 0x01, 0x08, 0x01, 0xf0, 0x01, 0x01, + 0x05, 0x91, 0x36, 0x22, 0x04, 0x98, 0x00, 0xf1, 0x28, 0x01, 0x08, 0xa8, + 0xef, 0xf7, 0x42, 0xf8, 0x70, 0x68, 0x90, 0xf8, 0x5c, 0x11, 0x01, 0xf0, + 0xdf, 0x01, 0x80, 0xf8, 0x5c, 0x11, 0x01, 0x22, 0x04, 0x98, 0x00, 0xf1, + 0x2f, 0x01, 0x00, 0x91, 0x4a, 0x74, 0x00, 0x99, 0x08, 0x78, 0x40, 0xf0, + 0x02, 0x00, 0x08, 0x70, 0x9d, 0xf8, 0x39, 0x10, 0xdd, 0xf8, 0x10, 0xa0, + 0x07, 0x94, 0x04, 0x95, 0x8d, 0xf8, 0x05, 0x90, 0x44, 0x46, 0xdd, 0xf8, + 0x14, 0x80, 0x0d, 0x46, 0x91, 0x46, 0x17, 0xe0, 0x28, 0x46, 0x01, 0xe0, + 0x9d, 0xf8, 0x05, 0x00, 0x00, 0x99, 0x88, 0x74, 0x4f, 0x45, 0xbc, 0xbf, + 0x40, 0xf6, 0x06, 0x60, 0xca, 0xf8, 0x00, 0x00, 0x07, 0x98, 0x00, 0xf0, + 0xa9, 0xfb, 0x02, 0x90, 0x10, 0x28, 0x04, 0xbf, 0x00, 0x21, 0x02, 0x91, + 0x09, 0xf1, 0x01, 0x00, 0x5f, 0xfa, 0x80, 0xf9, 0x04, 0x99, 0xc9, 0x19, + 0x49, 0x45, 0x1a, 0xdb, 0x02, 0x98, 0x00, 0x28, 0xf4, 0xd1, 0xb8, 0xf1, + 0x00, 0x0f, 0x8b, 0xf8, 0x14, 0x90, 0x0b, 0xd0, 0x09, 0xf1, 0x01, 0x01, + 0x64, 0x22, 0x51, 0x43, 0x28, 0x46, 0xb1, 0xfb, 0xf7, 0xf2, 0x50, 0x43, + 0x64, 0x23, 0xb0, 0xfb, 0xf3, 0xf0, 0xd3, 0xe7, 0x00, 0x2c, 0xcd, 0xd0, + 0xb9, 0x45, 0xcd, 0xd1, 0x00, 0x98, 0x85, 0x74, 0xd4, 0xe7, 0x70, 0x68, + 0x90, 0xf8, 0x5c, 0x11, 0x41, 0xf0, 0x20, 0x01, 0x80, 0xf8, 0x5c, 0x11, + 0x00, 0x22, 0x00, 0xf0, 0xdc, 0xfa, 0x00, 0xf0, 0xe5, 0xfc, 0x36, 0x22, + 0x9b, 0xf8, 0x14, 0x00, 0x40, 0xf0, 0x10, 0x00, 0x8b, 0xf8, 0x14, 0x00, + 0x08, 0xa9, 0x06, 0x98, 0xca, 0xf8, 0x00, 0x00, 0x0a, 0xf1, 0x28, 0x00, + 0xee, 0xf7, 0xd0, 0xff, 0xb1, 0x68, 0x00, 0x20, 0xc1, 0xf8, 0xe8, 0x04, + 0xb1, 0x68, 0x81, 0xf8, 0xe3, 0x04, 0xb1, 0x68, 0x81, 0xf8, 0xe4, 0x04, + 0x03, 0x9a, 0x02, 0x98, 0xd2, 0xf8, 0xd8, 0x10, 0x88, 0x43, 0x02, 0x90, + 0x02, 0x98, 0x10, 0xb1, 0x11, 0x78, 0x8a, 0x06, 0x01, 0xd5, 0x06, 0x20, + 0xb0, 0x70, 0x02, 0x98, 0x04, 0xe0, 0x03, 0x29, 0x04, 0xd1, 0x20, 0x46, + 0x00, 0xf0, 0x48, 0xfb, 0xf1, 0x68, 0x41, 0xe2, 0x05, 0x29, 0x06, 0xd1, + 0x0a, 0x21, 0xb1, 0x70, 0x0b, 0x22, 0xb2, 0x70, 0x30, 0x70, 0x70, 0x70, + 0x3b, 0xe2, 0x06, 0x29, 0x07, 0xd1, 0x0c, 0x21, 0xb1, 0x70, 0x0d, 0x22, + 0xf1, 0x68, 0xb2, 0x70, 0x30, 0x70, 0x70, 0x70, 0x2e, 0xe2, 0x07, 0x29, + 0xf2, 0xd1, 0x04, 0x90, 0x0e, 0x20, 0xd4, 0xf8, 0x04, 0x80, 0xb0, 0x70, + 0x01, 0x22, 0x00, 0xf0, 0x85, 0xfa, 0x04, 0x99, 0x08, 0x43, 0x04, 0x90, + 0x70, 0x78, 0x04, 0x99, 0x19, 0x28, 0x41, 0xf0, 0x04, 0x01, 0x24, 0xd1, + 0xe6, 0x6a, 0x37, 0x78, 0x0a, 0x2f, 0x1d, 0xd8, 0x20, 0x6b, 0x07, 0x70, + 0x00, 0x25, 0x0d, 0xe0, 0x52, 0x08, 0x49, 0x1c, 0xd3, 0x07, 0xfb, 0xd5, + 0xb2, 0x1c, 0xc9, 0xb2, 0x12, 0xf8, 0x15, 0x20, 0xfb, 0xf7, 0x13, 0xfa, + 0x21, 0x6b, 0x4a, 0x1c, 0x50, 0x55, 0x6d, 0x1c, 0xbd, 0x42, 0x14, 0xda, + 0xb0, 0x1c, 0x73, 0x1c, 0x10, 0xf8, 0x15, 0x20, 0x20, 0x68, 0x13, 0xf8, + 0x15, 0x30, 0x00, 0x21, 0x18, 0x44, 0xe7, 0xe7, 0x04, 0x91, 0x00, 0x20, + 0x93, 0xe1, 0x1a, 0x28, 0x06, 0xd1, 0x5f, 0xfa, 0x88, 0xf0, 0xfb, 0xf7, + 0x89, 0xf9, 0x21, 0x6b, 0x08, 0x60, 0xd8, 0xe1, 0x18, 0x28, 0x24, 0xd1, + 0xe6, 0x6a, 0x37, 0x78, 0x0a, 0x2f, 0x00, 0xf2, 0x56, 0x81, 0x00, 0x25, + 0x0e, 0xe0, 0x4f, 0xea, 0x5c, 0x0c, 0x49, 0x1c, 0x5f, 0xea, 0xcc, 0x7e, + 0xf9, 0xd5, 0x06, 0xf1, 0x02, 0x0c, 0xd2, 0x78, 0x1c, 0xf8, 0x03, 0x30, + 0xc9, 0xb2, 0xfb, 0xf7, 0xde, 0xf9, 0x6d, 0x1c, 0xbd, 0x42, 0xe4, 0xda, + 0x05, 0xeb, 0x45, 0x03, 0x06, 0xf1, 0x01, 0x0e, 0xf2, 0x18, 0x20, 0x68, + 0x1e, 0xf8, 0x03, 0x90, 0x92, 0xf8, 0x03, 0xc0, 0x00, 0x21, 0x48, 0x44, + 0xe4, 0xe7, 0x0d, 0x28, 0x40, 0xf0, 0x9b, 0x80, 0xb0, 0x68, 0x40, 0x7d, + 0x00, 0x25, 0x00, 0x28, 0x00, 0xf0, 0x90, 0x80, 0xd4, 0xf8, 0x04, 0x90, + 0x02, 0x28, 0x4f, 0xf0, 0x01, 0x0a, 0x08, 0xd1, 0x70, 0x68, 0x90, 0xf8, + 0x30, 0x10, 0x5f, 0xfa, 0x89, 0xf0, 0xfb, 0xf7, 0xf7, 0xf8, 0x4f, 0xf0, + 0x02, 0x0a, 0x60, 0x21, 0x05, 0xa8, 0x00, 0xf0, 0x33, 0xfd, 0xc0, 0x21, + 0x1d, 0xa8, 0x00, 0xf0, 0x2f, 0xfd, 0x70, 0x68, 0x90, 0xf8, 0x68, 0x11, + 0x27, 0x6b, 0x03, 0x95, 0x01, 0x29, 0x18, 0xbf, 0x00, 0x21, 0x01, 0x91, + 0xcd, 0xf8, 0x08, 0xa0, 0x05, 0xa9, 0x00, 0x91, 0x00, 0xf1, 0x18, 0x03, + 0xe0, 0x6a, 0x01, 0x78, 0x1d, 0xaa, 0x5f, 0xfa, 0x89, 0xf0, 0xfe, 0xf7, + 0x3e, 0xf8, 0xb0, 0x68, 0x41, 0x7d, 0x02, 0x29, 0x12, 0xd1, 0x70, 0x68, + 0x90, 0xf8, 0x31, 0x10, 0x5f, 0xfa, 0x89, 0xf0, 0xfb, 0xf7, 0xcc, 0xf8, + 0x70, 0x68, 0xd0, 0xf8, 0x00, 0x11, 0x0a, 0x05, 0x06, 0xd4, 0x00, 0xf0, + 0xf1, 0xf9, 0x71, 0x68, 0x05, 0x46, 0x00, 0x20, 0x81, 0xf8, 0x8d, 0x01, + 0x5f, 0xfa, 0x89, 0xf0, 0xfb, 0xf7, 0x0c, 0xf9, 0x00, 0x23, 0x00, 0x26, + 0x9c, 0x46, 0x3a, 0x46, 0x06, 0x20, 0x00, 0xfb, 0x0c, 0xf0, 0xc0, 0xf1, + 0x5a, 0x07, 0x7f, 0xb2, 0x05, 0xa9, 0x02, 0xf1, 0x01, 0x0e, 0xc9, 0x5d, + 0x02, 0xf8, 0x1c, 0x10, 0x00, 0x1d, 0x0d, 0xf1, 0x15, 0x01, 0x40, 0xb2, + 0xcf, 0x5d, 0x0e, 0xf8, 0x1c, 0x70, 0x0d, 0xf1, 0x14, 0x0e, 0x02, 0xeb, + 0x4c, 0x09, 0x09, 0xf1, 0x22, 0x07, 0x1e, 0xf8, 0x00, 0xa0, 0x87, 0xf8, + 0x00, 0xa0, 0x0c, 0xf1, 0x01, 0x0c, 0x09, 0x5c, 0x79, 0x70, 0x05, 0xaf, + 0x38, 0x44, 0x10, 0xf9, 0x02, 0x1d, 0x90, 0xf9, 0x01, 0x00, 0x76, 0x18, + 0x1b, 0x18, 0xbc, 0xf1, 0x10, 0x0f, 0xd3, 0xdb, 0x0a, 0x20, 0x16, 0xfb, + 0x00, 0xf1, 0xce, 0x10, 0x13, 0xfb, 0x00, 0xf0, 0x01, 0xeb, 0x16, 0x71, + 0xc3, 0x10, 0x09, 0x11, 0x00, 0xeb, 0x13, 0x70, 0x49, 0x1d, 0x0a, 0x26, + 0x00, 0x11, 0x91, 0xfb, 0xf6, 0xf1, 0x40, 0x1f, 0x02, 0xf8, 0x20, 0x1f, + 0x90, 0xfb, 0xf6, 0xf0, 0x50, 0x70, 0x00, 0xe0, 0x02, 0x25, 0x04, 0x98, + 0x05, 0x43, 0x04, 0x95, 0x13, 0xe1, 0x0c, 0x28, 0x04, 0xd1, 0x00, 0x21, + 0x20, 0x46, 0x00, 0xf0, 0x9e, 0xfb, 0x65, 0xe0, 0x12, 0x28, 0x08, 0xd1, + 0x70, 0x68, 0x90, 0xf8, 0x7c, 0x01, 0x04, 0xa9, 0xee, 0xf7, 0xb0, 0xfb, + 0x21, 0x6b, 0x08, 0x80, 0x01, 0xe1, 0x0e, 0x28, 0x27, 0xd1, 0xb0, 0x68, + 0x65, 0x68, 0x41, 0x7d, 0x00, 0x27, 0x02, 0x29, 0x1c, 0xd1, 0x20, 0x6b, + 0x4f, 0xf4, 0xb6, 0x71, 0x00, 0xf0, 0x92, 0xfc, 0x70, 0x68, 0x23, 0x6b, + 0xe1, 0x6a, 0x00, 0xf1, 0x28, 0x02, 0xe8, 0xb2, 0x12, 0xf0, 0x2b, 0xfe, + 0x70, 0x68, 0xd0, 0xf8, 0x00, 0x11, 0x0a, 0x05, 0x06, 0xd4, 0x00, 0xf0, + 0x6d, 0xf9, 0x71, 0x68, 0x07, 0x46, 0x00, 0x20, 0x81, 0xf8, 0x8d, 0x01, + 0xe8, 0xb2, 0xfb, 0xf7, 0x89, 0xf8, 0x00, 0xe0, 0x02, 0x27, 0x04, 0x98, + 0x07, 0x43, 0x04, 0x97, 0xd7, 0xe0, 0x13, 0x28, 0x25, 0xd1, 0xe0, 0x6a, + 0x47, 0x78, 0x05, 0x78, 0x4f, 0xf0, 0x00, 0x09, 0x0e, 0xe0, 0x04, 0x98, + 0x40, 0xf0, 0x04, 0x00, 0x07, 0xe0, 0x09, 0xeb, 0x05, 0x02, 0xd2, 0xb2, + 0x20, 0x46, 0x10, 0xf0, 0x89, 0xfd, 0x04, 0x99, 0x08, 0x43, 0x04, 0x90, + 0x09, 0xf1, 0x01, 0x09, 0xb9, 0x45, 0xe5, 0xda, 0xb9, 0xf1, 0x08, 0x0f, + 0xeb, 0xd2, 0xe0, 0x6a, 0x81, 0x1c, 0xb0, 0x68, 0x09, 0xeb, 0xc9, 0x02, + 0x8b, 0x18, 0x41, 0x7d, 0x02, 0x29, 0x0c, 0xbf, 0x01, 0x21, 0x00, 0x21, + 0xe3, 0xe7, 0x14, 0x28, 0x0a, 0xd1, 0xe0, 0x6a, 0x01, 0x78, 0x42, 0x1c, + 0x5f, 0xfa, 0x88, 0xf0, 0x11, 0xf0, 0xad, 0xfc, 0x04, 0x99, 0x08, 0x43, + 0x04, 0x90, 0xa2, 0xe0, 0x15, 0x28, 0x26, 0xd1, 0xe2, 0x6a, 0x57, 0x88, + 0x10, 0x88, 0x75, 0x69, 0x04, 0x2f, 0x1e, 0xd8, 0xb2, 0x69, 0x38, 0x23, + 0xb2, 0xfb, 0xf3, 0xf3, 0x9b, 0xb2, 0x3e, 0x18, 0xb3, 0x42, 0x16, 0xdb, + 0x4f, 0xf0, 0x00, 0x0a, 0x4f, 0xf0, 0x38, 0x09, 0x06, 0x46, 0xba, 0x45, + 0x10, 0xda, 0x0a, 0xeb, 0x06, 0x00, 0x09, 0xfb, 0x00, 0xf0, 0x23, 0x6b, + 0x29, 0x18, 0x09, 0xfb, 0x0a, 0xfc, 0x38, 0x22, 0x03, 0xeb, 0x0c, 0x00, + 0xee, 0xf7, 0xf2, 0xfd, 0x0a, 0xf1, 0x01, 0x0a, 0xed, 0xe7, 0x04, 0x91, + 0x79, 0xe0, 0x1b, 0x28, 0x2c, 0xd1, 0xe6, 0x6a, 0x30, 0x79, 0x40, 0xb1, + 0x02, 0x28, 0x06, 0xdc, 0x00, 0x21, 0xff, 0x20, 0xfb, 0xf7, 0x97, 0xf8, + 0x30, 0x79, 0xfb, 0xf7, 0x98, 0xf8, 0xfb, 0xf7, 0x94, 0xf8, 0x01, 0x46, + 0xb0, 0x78, 0x08, 0x40, 0x1c, 0xbf, 0x00, 0x21, 0xfb, 0xf7, 0x8b, 0xf8, + 0x00, 0x27, 0x01, 0x21, 0xb0, 0x78, 0xb9, 0x40, 0x08, 0x42, 0x04, 0xd0, + 0xf0, 0x78, 0x01, 0x40, 0xf8, 0xb2, 0xfb, 0xf7, 0x86, 0xf8, 0x7f, 0x1c, + 0xf9, 0xb2, 0x08, 0x29, 0xf1, 0xd3, 0x71, 0x78, 0x30, 0x78, 0xfb, 0xf7, + 0x78, 0xf8, 0xfb, 0xf7, 0x78, 0xf8, 0x21, 0x6b, 0x08, 0x70, 0x4a, 0xe0, + 0x1d, 0x28, 0x04, 0xd1, 0x5f, 0xfa, 0x88, 0xf0, 0xfb, 0xf7, 0x2a, 0xf9, + 0x43, 0xe0, 0x1e, 0x28, 0x5c, 0xd1, 0xb0, 0x68, 0x23, 0x6b, 0x00, 0xf5, + 0x09, 0x71, 0x0a, 0x8e, 0x1a, 0x80, 0x22, 0x6b, 0x0e, 0x78, 0x96, 0x70, + 0x22, 0x6b, 0x90, 0xf8, 0x59, 0x31, 0xd3, 0x70, 0x22, 0x6b, 0x0b, 0x7d, + 0x13, 0x71, 0x00, 0xf1, 0x98, 0x02, 0x26, 0x6b, 0xd3, 0x88, 0xf3, 0x80, + 0x26, 0x6b, 0x13, 0x89, 0x33, 0x81, 0x26, 0x6b, 0x13, 0x78, 0xb3, 0x72, + 0x26, 0x6b, 0x53, 0x78, 0xf3, 0x72, 0x26, 0x6b, 0xd3, 0x89, 0xb3, 0x81, + 0x23, 0x6b, 0x89, 0x88, 0xd9, 0x81, 0x23, 0x6b, 0x11, 0x7d, 0x19, 0x74, + 0x23, 0x6b, 0x92, 0xf8, 0x24, 0x10, 0x59, 0x74, 0x23, 0x6b, 0x92, 0xf8, + 0x25, 0x10, 0x99, 0x74, 0x23, 0x6b, 0x92, 0xf8, 0x26, 0x10, 0xd9, 0x74, + 0x92, 0xf8, 0x27, 0x10, 0x22, 0x6b, 0x11, 0x75, 0x00, 0x21, 0x42, 0x18, + 0x23, 0x6b, 0x92, 0xf8, 0xc8, 0x20, 0x03, 0xf1, 0x15, 0x06, 0x72, 0x54, + 0x49, 0x1c, 0x08, 0x29, 0xf5, 0xd3, 0x00, 0x22, 0x00, 0xf0, 0x72, 0xf8, + 0x04, 0x99, 0x08, 0x43, 0x04, 0xf1, 0x34, 0x01, 0x04, 0x90, 0x4b, 0x68, + 0x04, 0x9a, 0xd3, 0xf8, 0xd8, 0x00, 0x82, 0x43, 0x04, 0x92, 0x00, 0x20, + 0x0f, 0x22, 0x08, 0x70, 0x48, 0x70, 0x8a, 0x70, 0x04, 0x98, 0xc9, 0x68, + 0xca, 0x68, 0x52, 0x1c, 0xca, 0x60, 0x4d, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x1f, 0x28, 0xe2, 0xd1, 0xb0, 0x68, 0x00, 0xf5, 0x16, 0x71, 0x20, 0x6b, + 0xb1, 0xf8, 0x14, 0x23, 0x02, 0x80, 0x01, 0xf5, 0xf8, 0x72, 0x20, 0x6b, + 0x13, 0x78, 0x83, 0x70, 0x20, 0x6b, 0x53, 0x78, 0xc3, 0x70, 0x00, 0x20, + 0x01, 0xf2, 0x13, 0x23, 0x27, 0x6b, 0x1e, 0x5c, 0x3d, 0x1d, 0x00, 0x28, + 0x2e, 0x54, 0x0c, 0xbf, 0x16, 0x56, 0x92, 0xf9, 0x01, 0x60, 0x27, 0x6b, + 0x1b, 0x5c, 0x07, 0x44, 0x40, 0x1c, 0x9e, 0x1b, 0x01, 0x28, 0xbe, 0x71, + 0xec, 0xd9, 0x23, 0x6b, 0x92, 0xf8, 0x50, 0x00, 0x18, 0x72, 0x23, 0x6b, + 0x92, 0xf8, 0x51, 0x00, 0x58, 0x72, 0x23, 0x6b, 0x92, 0xf8, 0x52, 0x00, + 0x98, 0x72, 0x92, 0xf8, 0x53, 0x00, 0x22, 0x6b, 0xd0, 0x72, 0x00, 0x20, + 0x0a, 0x18, 0x23, 0x6b, 0x92, 0xf8, 0x4c, 0x22, 0x03, 0xf1, 0x0c, 0x06, + 0x32, 0x54, 0x40, 0x1c, 0x08, 0x28, 0xf5, 0xd3, 0x00, 0x20, 0x22, 0x6b, + 0x01, 0xeb, 0x80, 0x06, 0x02, 0xf1, 0x14, 0x03, 0xd6, 0xf8, 0xa4, 0x20, + 0x43, 0xf8, 0x20, 0x20, 0x40, 0x1c, 0x01, 0x28, 0xf3, 0xd9, 0x00, 0x20, + 0x22, 0x6b, 0x01, 0xeb, 0x80, 0x06, 0x02, 0xeb, 0x80, 0x03, 0xd6, 0xf8, + 0xb0, 0x20, 0xda, 0x61, 0x40, 0x1c, 0x10, 0x28, 0xf4, 0xd3, 0x8a, 0xe7, + 0x03, 0x21, 0x5f, 0xfa, 0x88, 0xf0, 0xfb, 0xf7, 0x8c, 0xba, 0x64, 0x21, + 0x50, 0x46, 0xee, 0xf7, 0x29, 0xbb, 0x9d, 0xf8, 0x04, 0x00, 0x05, 0x21, + 0xfb, 0xf7, 0x83, 0xba, 0x9b, 0xf8, 0x15, 0x00, 0x02, 0x28, 0x70, 0x47, + 0x01, 0x21, 0x80, 0xf8, 0x8d, 0x11, 0xb0, 0x68, 0x71, 0x68, 0x00, 0xf5, + 0xae, 0x62, 0x60, 0x68, 0x01, 0xf5, 0xc6, 0x71, 0xc0, 0xb2, 0xee, 0xf7, + 0xf4, 0xba, 0x10, 0xb5, 0x03, 0x46, 0x00, 0x20, 0x03, 0xf1, 0x34, 0x04, + 0x05, 0x29, 0x0c, 0xbf, 0x00, 0x2a, 0x52, 0xea, 0x01, 0x03, 0x05, 0xd0, + 0x01, 0x29, 0x18, 0xbf, 0x06, 0x29, 0x04, 0xd1, 0x00, 0x2a, 0x40, 0xd1, + 0x21, 0x70, 0x62, 0x70, 0x10, 0xbd, 0x02, 0x29, 0x0f, 0xd1, 0x01, 0x2a, + 0x18, 0xbf, 0x17, 0x2a, 0xf6, 0xd0, 0x03, 0x2a, 0x18, 0xbf, 0x06, 0x2a, + 0xf2, 0xd0, 0x02, 0x2a, 0x1c, 0xbf, 0x04, 0x2a, 0x05, 0x2a, 0xed, 0xd0, + 0x07, 0x2a, 0x2c, 0xd1, 0xea, 0xe7, 0x03, 0x29, 0x0a, 0xd1, 0x01, 0x2a, + 0x18, 0xbf, 0x11, 0x2a, 0xe4, 0xd0, 0x08, 0x2a, 0x1c, 0xbf, 0x09, 0x2a, + 0x0a, 0x2a, 0xdf, 0xd0, 0x0b, 0x2a, 0xf0, 0xe7, 0x07, 0x29, 0x1c, 0xd1, + 0x0c, 0x2a, 0x18, 0xbf, 0x0d, 0x2a, 0xd7, 0xd0, 0x12, 0x2a, 0x18, 0xbf, + 0x0e, 0x2a, 0xd3, 0xd0, 0x13, 0x2a, 0x18, 0xbf, 0x14, 0x2a, 0xcf, 0xd0, + 0x15, 0x2a, 0x18, 0xbf, 0x19, 0x2a, 0xcb, 0xd0, 0x18, 0x2a, 0x18, 0xbf, + 0x1a, 0x2a, 0xc7, 0xd0, 0x1b, 0x2a, 0x18, 0xbf, 0x1c, 0x2a, 0xc3, 0xd0, + 0x1d, 0x2a, 0x1c, 0xbf, 0x1e, 0x2a, 0x1f, 0x2a, 0xbe, 0xd0, 0xe0, 0x68, + 0x01, 0x68, 0x41, 0xf0, 0x02, 0x01, 0x01, 0x60, 0x02, 0x20, 0x10, 0xbd, + 0x70, 0xb5, 0x00, 0xf1, 0x34, 0x06, 0xa0, 0xb0, 0x75, 0x78, 0x12, 0x49, + 0x68, 0x46, 0x80, 0x22, 0xee, 0xf7, 0x8c, 0xfc, 0x36, 0x78, 0x00, 0x24, + 0x07, 0x2e, 0x03, 0xd1, 0x20, 0x2d, 0xb8, 0xbf, 0x5d, 0xf8, 0x25, 0x40, + 0x20, 0x46, 0x20, 0xb0, 0x70, 0xbd, 0x30, 0xb5, 0x01, 0x46, 0x00, 0x20, + 0x00, 0x22, 0x07, 0x4b, 0xd4, 0xb2, 0x53, 0xf8, 0x24, 0x40, 0x65, 0x68, + 0x8d, 0x42, 0x04, 0xd0, 0x52, 0x1c, 0xd4, 0xb2, 0x04, 0x2c, 0xf5, 0xd3, + 0x30, 0xbd, 0x20, 0x46, 0x30, 0xbd, 0x00, 0x00, 0xe0, 0x76, 0x02, 0x20, + 0xb8, 0x89, 0x04, 0x01, 0x2d, 0xe9, 0xfe, 0x4f, 0x00, 0x21, 0x02, 0x91, + 0x83, 0x46, 0x00, 0xf0, 0x11, 0xfa, 0x58, 0x46, 0x00, 0xf0, 0x5a, 0xfa, + 0x0b, 0xf1, 0x38, 0x04, 0x4f, 0xf0, 0x01, 0x09, 0x20, 0x68, 0x61, 0x68, + 0xd0, 0xf8, 0x00, 0x71, 0x78, 0x03, 0x48, 0x7d, 0x48, 0xbf, 0x4f, 0xf0, + 0x00, 0x09, 0x00, 0x28, 0x0b, 0xf1, 0x35, 0x05, 0x00, 0xf0, 0x4f, 0x81, + 0xdb, 0xf8, 0x04, 0x60, 0x08, 0x20, 0x68, 0x70, 0x01, 0x22, 0x03, 0x21, + 0xf0, 0xb2, 0xfb, 0xf7, 0xc8, 0xf9, 0x00, 0xf0, 0x49, 0xf9, 0x6f, 0xf0, + 0xc7, 0x08, 0x78, 0x06, 0x0e, 0xd4, 0x28, 0x78, 0x01, 0x28, 0x18, 0xbf, + 0x11, 0x28, 0x09, 0xd1, 0x20, 0x68, 0x90, 0xf8, 0x7c, 0x01, 0x02, 0xa9, + 0xee, 0xf7, 0x5c, 0xf9, 0x80, 0x46, 0x60, 0x68, 0xa0, 0xf8, 0x6c, 0x85, + 0x78, 0x07, 0x3f, 0xd4, 0x28, 0x78, 0x01, 0x28, 0x18, 0xbf, 0x0a, 0x28, + 0x3a, 0xd1, 0x40, 0x46, 0x00, 0xee, 0x10, 0x0a, 0x60, 0x68, 0xb0, 0xf9, + 0x3e, 0x15, 0x00, 0xee, 0x90, 0x1a, 0xb8, 0xee, 0xc0, 0x0a, 0xf8, 0xee, + 0xe0, 0x0a, 0x30, 0xee, 0x60, 0x0a, 0xb0, 0xee, 0xc0, 0x0a, 0x20, 0x68, + 0x90, 0xf8, 0x7e, 0x11, 0x00, 0xee, 0x90, 0x1a, 0xf8, 0xee, 0x60, 0x0a, + 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x02, 0xda, 0x28, 0x78, + 0x0a, 0x28, 0x1b, 0xd1, 0x01, 0x22, 0x02, 0x21, 0xf0, 0xb2, 0xfb, 0xf7, + 0x43, 0xf9, 0x00, 0xf0, 0x09, 0xf9, 0x60, 0x68, 0x00, 0xf2, 0x2d, 0x53, + 0x00, 0xf2, 0x2c, 0x52, 0x20, 0x68, 0x90, 0xf8, 0x7d, 0x11, 0xf0, 0xb2, + 0x11, 0xf0, 0xb4, 0xfa, 0x60, 0x68, 0xa0, 0xf8, 0x3e, 0x85, 0x00, 0x22, + 0x02, 0x21, 0xf0, 0xb2, 0xfb, 0xf7, 0x2e, 0xf9, 0x00, 0xf0, 0xf4, 0xf8, + 0xf8, 0x06, 0x2c, 0xd5, 0x28, 0x78, 0x01, 0x28, 0x18, 0xbf, 0x0f, 0x28, + 0x27, 0xd1, 0xb8, 0x0a, 0x00, 0xf0, 0x01, 0x00, 0x80, 0xf0, 0x01, 0x0c, + 0x60, 0x68, 0x00, 0x7d, 0x79, 0x0a, 0x01, 0xf0, 0x01, 0x01, 0x3a, 0x0a, + 0x3b, 0x0b, 0x81, 0xf0, 0x01, 0x01, 0x02, 0xf0, 0x01, 0x02, 0x03, 0xf0, + 0x07, 0x03, 0x10, 0xb1, 0x10, 0x28, 0x80, 0x41, 0xc0, 0x0f, 0x01, 0x90, + 0xcd, 0xf8, 0x00, 0xc0, 0x58, 0x46, 0x12, 0xf0, 0x25, 0xfe, 0x61, 0x68, + 0x91, 0xf8, 0x41, 0x05, 0x08, 0xb1, 0x00, 0xf0, 0xcf, 0xf8, 0x61, 0x68, + 0x91, 0xf8, 0x42, 0x05, 0x08, 0xb1, 0x00, 0xf0, 0xc9, 0xf8, 0xb8, 0x06, + 0x13, 0xd5, 0x28, 0x78, 0x01, 0x28, 0x18, 0xbf, 0x10, 0x28, 0x0e, 0xd1, + 0x61, 0x68, 0xd1, 0xf8, 0x64, 0x04, 0x50, 0xb1, 0x58, 0x46, 0x13, 0xf0, + 0x49, 0xf8, 0x00, 0xf0, 0xb5, 0xf8, 0x62, 0x68, 0x92, 0xf8, 0x53, 0x04, + 0x08, 0xb1, 0x00, 0xf0, 0xb3, 0xf8, 0x60, 0x68, 0x41, 0x7d, 0x02, 0x29, + 0x23, 0xd1, 0x39, 0x05, 0x21, 0xd4, 0x29, 0x78, 0x01, 0x29, 0x18, 0xbf, + 0x16, 0x29, 0x1c, 0xd1, 0xd0, 0xf8, 0x64, 0x04, 0x04, 0x28, 0x18, 0xd3, + 0x20, 0x68, 0x01, 0x21, 0x80, 0xf8, 0x95, 0x11, 0x61, 0x68, 0x20, 0x68, + 0x01, 0xf5, 0xae, 0x62, 0x00, 0xf5, 0xc6, 0x71, 0xf0, 0xb2, 0x00, 0x20, + 0xc0, 0x46, 0x00, 0xf0, 0x91, 0xf8, 0x60, 0x68, 0x00, 0xf5, 0xae, 0x60, + 0x01, 0x78, 0x40, 0x78, 0x09, 0x1a, 0x49, 0xb2, 0xf0, 0xb2, 0xfa, 0xf7, + 0x12, 0xfd, 0x60, 0x68, 0x41, 0x7d, 0x02, 0x29, 0x15, 0xd1, 0xf9, 0x07, + 0x13, 0xd4, 0x29, 0x78, 0x01, 0x29, 0x18, 0xbf, 0x08, 0x29, 0x0e, 0xd1, + 0x21, 0x68, 0xb1, 0xf8, 0x4a, 0x21, 0x00, 0x92, 0x00, 0xf5, 0x3e, 0x73, + 0x00, 0xf5, 0x1b, 0x72, 0x01, 0xf5, 0x88, 0x71, 0xf0, 0xb2, 0x13, 0xf0, + 0x73, 0xfb, 0x00, 0xf0, 0x6d, 0xf8, 0x60, 0x68, 0x41, 0x7d, 0x02, 0x29, + 0x29, 0xd1, 0xb8, 0x07, 0x27, 0xd4, 0x28, 0x78, 0x01, 0x28, 0x18, 0xbf, + 0x09, 0x28, 0x22, 0xd1, 0x01, 0x20, 0xb9, 0xf1, 0x00, 0x0f, 0x11, 0xd1, + 0x21, 0x68, 0xd1, 0xf8, 0x00, 0x21, 0x13, 0x03, 0x58, 0xbf, 0x02, 0x20, + 0x01, 0x22, 0x81, 0xf8, 0x54, 0x21, 0x61, 0x68, 0x91, 0xf8, 0x68, 0x22, + 0xd1, 0x07, 0x03, 0xd5, 0x23, 0x68, 0x00, 0x22, 0x83, 0xf8, 0x54, 0x21, + 0x4f, 0xf0, 0x00, 0x0a, 0x81, 0x46, 0x06, 0xe0, 0x58, 0x46, 0x15, 0xf0, + 0x11, 0xf9, 0x00, 0xf0, 0x43, 0xf8, 0x0a, 0xf1, 0x01, 0x0a, 0xca, 0x45, + 0xf6, 0xdb, 0x60, 0x68, 0x41, 0x7d, 0x01, 0x29, 0x0e, 0xd1, 0xb9, 0x07, + 0x0c, 0xd4, 0x29, 0x78, 0x01, 0x29, 0x18, 0xbf, 0x09, 0x29, 0x07, 0xd1, + 0x00, 0xf5, 0x3e, 0x72, 0x20, 0x68, 0x00, 0xf1, 0x18, 0x01, 0xf0, 0xb2, + 0xee, 0xf7, 0x9e, 0xfc, 0x38, 0x07, 0x0a, 0xd5, 0x28, 0x78, 0x01, 0x28, + 0x18, 0xbf, 0x0b, 0x28, 0x05, 0xd1, 0x01, 0x21, 0x58, 0x46, 0x00, 0xf0, + 0x28, 0xf8, 0x00, 0xf0, 0x1f, 0xf8, 0x00, 0x22, 0x03, 0x21, 0xf0, 0xb2, + 0xfb, 0xf7, 0x97, 0xf8, 0x00, 0xf0, 0x18, 0xf8, 0x41, 0x46, 0xf0, 0xb2, + 0xfa, 0xf7, 0xf1, 0xff, 0x00, 0xf0, 0x12, 0xf8, 0x20, 0x68, 0x02, 0x9b, + 0x00, 0xf1, 0xd8, 0x02, 0x11, 0x68, 0x8b, 0x43, 0x02, 0x93, 0x02, 0x98, + 0x18, 0xb1, 0x92, 0xf8, 0x28, 0x00, 0x01, 0x06, 0x01, 0xd5, 0x09, 0x20, + 0x68, 0x70, 0x02, 0x98, 0xbd, 0xe8, 0xfe, 0x8f, 0x02, 0x99, 0x08, 0x43, + 0x02, 0x90, 0x70, 0x47, 0x02, 0xa9, 0x58, 0x46, 0x89, 0xe0, 0x2d, 0xe9, + 0xf0, 0x41, 0x86, 0xb0, 0x04, 0x46, 0x08, 0x46, 0xe2, 0x6b, 0x51, 0x7d, + 0x00, 0x25, 0x00, 0x29, 0x7a, 0xd0, 0x60, 0xb3, 0xa3, 0x6b, 0x03, 0xf5, + 0xb2, 0x70, 0x02, 0xf5, 0xac, 0x6e, 0x06, 0x79, 0x01, 0x2e, 0x03, 0xf2, + 0x53, 0x16, 0x0c, 0xbf, 0x01, 0x27, 0x00, 0x27, 0x96, 0xf8, 0x00, 0xc0, + 0x02, 0x97, 0xbc, 0xf1, 0x01, 0x0f, 0x18, 0xbf, 0xac, 0x46, 0x02, 0xf2, + 0x59, 0x58, 0x02, 0xf5, 0xab, 0x62, 0x03, 0xf1, 0x28, 0x07, 0xcd, 0xf8, + 0x14, 0xe0, 0xcd, 0xf8, 0x10, 0x80, 0x03, 0x92, 0xcd, 0xf8, 0x04, 0xc0, + 0x00, 0x97, 0x03, 0x68, 0x60, 0x68, 0x72, 0x7b, 0xc0, 0xb2, 0xee, 0xf7, + 0x17, 0xfd, 0xe0, 0x6b, 0xd0, 0xf8, 0x64, 0x14, 0xc0, 0xf8, 0x5c, 0x15, + 0x4d, 0xe0, 0xe0, 0x6a, 0xd4, 0xf8, 0x30, 0xc0, 0x03, 0x7a, 0x02, 0xf5, + 0xac, 0x62, 0x01, 0x2b, 0xa3, 0x6b, 0x93, 0xf8, 0x53, 0x71, 0x05, 0x92, + 0x0c, 0xbf, 0x01, 0x26, 0x00, 0x26, 0x01, 0x2f, 0x0c, 0xf1, 0x01, 0x02, + 0x18, 0xbf, 0x00, 0x27, 0x28, 0x33, 0x04, 0x92, 0x00, 0x93, 0xcd, 0xf8, + 0x0c, 0xc0, 0x02, 0x96, 0x01, 0x97, 0x43, 0x68, 0x02, 0x78, 0x60, 0x68, + 0xc0, 0xb2, 0xee, 0xf7, 0xf1, 0xfc, 0xa0, 0x6b, 0xd0, 0xf8, 0x00, 0x01, + 0x01, 0x07, 0x09, 0xd4, 0x22, 0x6b, 0xe3, 0x6b, 0x11, 0x78, 0x83, 0xf8, + 0x58, 0x15, 0x21, 0x6b, 0x4a, 0x78, 0xe1, 0x6b, 0x81, 0xf8, 0x59, 0x25, + 0xe1, 0x6b, 0xd1, 0xf8, 0x64, 0x24, 0xc1, 0xf8, 0x5c, 0x25, 0x49, 0x7d, + 0x02, 0x29, 0x16, 0xd1, 0x00, 0x05, 0x14, 0xd4, 0xa0, 0x6b, 0x01, 0x21, + 0x80, 0xf8, 0x8d, 0x11, 0xe1, 0x6b, 0xa0, 0x6b, 0x01, 0xf5, 0xae, 0x62, + 0x00, 0xf5, 0xc6, 0x71, 0x60, 0x68, 0xc0, 0xb2, 0x00, 0x20, 0xc0, 0x46, + 0xa1, 0x6b, 0x05, 0x46, 0x00, 0x20, 0x81, 0xf8, 0x8d, 0x01, 0x00, 0xe0, + 0x02, 0x25, 0x28, 0x46, 0x06, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, 0xf8, 0xb5, + 0x04, 0x46, 0x0d, 0x46, 0xa0, 0x6b, 0xd0, 0xf8, 0x00, 0x11, 0x01, 0x26, + 0x48, 0x03, 0x48, 0xbf, 0x02, 0x26, 0x00, 0x27, 0x06, 0xe0, 0x20, 0x46, + 0x15, 0xf0, 0x2c, 0xf8, 0x29, 0x68, 0x08, 0x43, 0x28, 0x60, 0x7f, 0x1c, + 0x78, 0xb2, 0xb0, 0x42, 0xf5, 0xdb, 0xf1, 0xbd, 0xf8, 0xb5, 0x04, 0x46, + 0xe0, 0x6b, 0x41, 0x7d, 0x02, 0x29, 0x02, 0xbf, 0x00, 0xf2, 0xdc, 0x41, + 0x91, 0xf9, 0x02, 0x00, 0x00, 0x28, 0x3e, 0xd1, 0x94, 0xf8, 0x36, 0x20, + 0x65, 0x68, 0x06, 0x2a, 0x29, 0xdb, 0x08, 0x56, 0x38, 0xbb, 0x01, 0x22, + 0x0a, 0x70, 0xe8, 0xb2, 0xfa, 0xf7, 0x58, 0xfd, 0xe8, 0xb2, 0xfa, 0xf7, + 0x57, 0xfd, 0x01, 0x20, 0xed, 0xf7, 0xfc, 0xfd, 0xe0, 0x6b, 0x00, 0xf1, + 0xbc, 0x06, 0xe9, 0xb2, 0x30, 0x46, 0xfa, 0xf7, 0x43, 0xfd, 0x00, 0x20, + 0x00, 0x90, 0x00, 0x27, 0x69, 0x46, 0xe8, 0xb2, 0xfa, 0xf7, 0xf0, 0xfc, + 0xf9, 0xb2, 0x7f, 0x1c, 0x00, 0x98, 0x06, 0xeb, 0x81, 0x02, 0xfb, 0xb2, + 0x03, 0x2b, 0x50, 0x66, 0xf2, 0xd3, 0xe1, 0x6b, 0x00, 0x20, 0xc1, 0xf8, + 0xe8, 0x04, 0xfa, 0xf7, 0x39, 0xfd, 0xfa, 0xf7, 0x39, 0xfd, 0xe1, 0x6b, + 0xd1, 0xf8, 0xe8, 0x24, 0x10, 0x18, 0xc1, 0xf8, 0xe8, 0x04, 0x00, 0x21, + 0xe8, 0xb2, 0xfa, 0xf7, 0x31, 0xfd, 0x01, 0x28, 0x08, 0xbf, 0xfa, 0xf7, + 0x29, 0xfd, 0xf1, 0xbd, 0xc2, 0x6b, 0x51, 0x7d, 0x02, 0x29, 0x00, 0xd0, + 0x70, 0x47, 0x10, 0xb5, 0x02, 0xf2, 0xda, 0x43, 0x93, 0xf9, 0x04, 0x10, + 0x99, 0xb9, 0x00, 0x24, 0x1c, 0x80, 0xa2, 0xf8, 0x1c, 0x15, 0xdc, 0x71, + 0xc2, 0x6b, 0x82, 0xf8, 0xe2, 0x14, 0xc2, 0x6b, 0x82, 0xf8, 0xe4, 0x14, + 0xc2, 0x6b, 0x82, 0xf8, 0x1f, 0x15, 0xc2, 0x6b, 0x82, 0xf8, 0xe0, 0x14, + 0xc0, 0x6b, 0x80, 0xf8, 0x20, 0x15, 0x10, 0xbd, 0x00, 0x22, 0xed, 0xf7, + 0xe5, 0xbb, 0x00, 0x00, 0xf8, 0xb5, 0x13, 0x46, 0x03, 0xf1, 0x14, 0x02, + 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x82, 0xe8, 0xf0, 0x00, + 0x03, 0xf1, 0x24, 0x02, 0xc2, 0xe9, 0x00, 0x45, 0x9c, 0x80, 0xdc, 0x80, + 0x1c, 0x81, 0x5d, 0x81, 0x0a, 0x79, 0x01, 0x46, 0x03, 0xf1, 0x0c, 0x00, + 0xbd, 0xe8, 0xf8, 0x40, 0x86, 0xe3, 0xf8, 0xb5, 0x07, 0x46, 0x06, 0x9e, + 0x18, 0x78, 0x0d, 0x46, 0x14, 0x00, 0x18, 0xbf, 0x65, 0x79, 0x30, 0x70, + 0x59, 0x78, 0x71, 0x70, 0x29, 0x46, 0x98, 0x78, 0xb0, 0x70, 0x38, 0x46, + 0xda, 0x78, 0xf2, 0x70, 0xfa, 0xf7, 0x95, 0xfa, 0x94, 0xb1, 0x61, 0x6a, + 0x0a, 0x04, 0x0f, 0xd4, 0x94, 0xf9, 0x22, 0x20, 0x20, 0x79, 0x28, 0xb9, + 0x21, 0x56, 0x10, 0x46, 0x88, 0x42, 0x07, 0xda, 0x08, 0x46, 0x05, 0xe0, + 0x94, 0xf9, 0x03, 0x00, 0x82, 0x42, 0xbc, 0xbf, 0x10, 0x46, 0x40, 0x42, + 0x86, 0xf8, 0x34, 0x00, 0x32, 0x46, 0x29, 0x46, 0x38, 0x46, 0xbd, 0xe8, + 0xf8, 0x40, 0x00, 0xf0, 0x22, 0xbc, 0xfe, 0xb5, 0x8d, 0xf8, 0x07, 0x00, + 0x8d, 0xf8, 0x06, 0x10, 0x08, 0x9c, 0x1f, 0x78, 0x17, 0x70, 0x02, 0xf1, + 0x8c, 0x06, 0x5d, 0x78, 0x55, 0x70, 0x01, 0x29, 0x9f, 0x78, 0x97, 0x70, + 0x08, 0xbf, 0xa2, 0xf1, 0x8c, 0x06, 0xdd, 0x78, 0xd5, 0x70, 0x93, 0xf9, + 0x0d, 0x20, 0x8d, 0xf8, 0x00, 0x20, 0x9d, 0x7b, 0x8d, 0xf8, 0x01, 0x50, + 0xda, 0x7b, 0x8d, 0xf8, 0x02, 0x20, 0x1a, 0x7c, 0x8d, 0xf8, 0x03, 0x20, + 0x5a, 0x7c, 0x8d, 0xf8, 0x04, 0x20, 0x9a, 0x7c, 0x8d, 0xf8, 0x05, 0x20, + 0x2c, 0xb9, 0xc1, 0xf1, 0x01, 0x01, 0xca, 0xb2, 0x96, 0xf9, 0x34, 0x10, + 0x02, 0xe0, 0x0a, 0x46, 0x93, 0xf9, 0x34, 0x10, 0xfa, 0xf7, 0x2b, 0xfa, + 0x68, 0x46, 0xfa, 0xf7, 0xa3, 0xfc, 0xf7, 0xbd, 0x7c, 0xb5, 0x16, 0x46, + 0x01, 0x22, 0x00, 0x92, 0x0d, 0x46, 0x04, 0x46, 0x33, 0x46, 0x2a, 0x46, + 0x00, 0x21, 0xff, 0xf7, 0xbe, 0xff, 0x01, 0x22, 0x00, 0x92, 0x33, 0x46, + 0x2a, 0x46, 0x01, 0x21, 0x20, 0x46, 0xff, 0xf7, 0xb6, 0xff, 0x73, 0xbd, + 0x00, 0xee, 0x90, 0x0a, 0xf8, 0xee, 0xe0, 0x0a, 0x20, 0xee, 0x80, 0x0a, + 0xb5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xf6, 0xee, 0x00, 0x0a, + 0x06, 0xd5, 0xc9, 0xb2, 0x00, 0x29, 0x14, 0xbf, 0xb1, 0xee, 0x40, 0x0a, + 0xfe, 0xee, 0x00, 0x0a, 0x30, 0xee, 0x20, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, + 0x10, 0xee, 0x10, 0x0a, 0x70, 0x47, 0x01, 0x46, 0x00, 0x20, 0x4a, 0x79, + 0x09, 0x79, 0x39, 0xb9, 0xd1, 0x07, 0x48, 0xbf, 0x08, 0x20, 0x91, 0x07, + 0x09, 0xd5, 0x40, 0xf0, 0x02, 0x00, 0x70, 0x47, 0xd1, 0x07, 0x48, 0xbf, + 0x04, 0x20, 0x91, 0x07, 0x48, 0xbf, 0x40, 0xf0, 0x01, 0x00, 0x70, 0x47, + 0x2d, 0xe9, 0xfa, 0x4f, 0x83, 0x46, 0x0f, 0xf6, 0xe8, 0x00, 0x8f, 0xb0, + 0x91, 0x46, 0x19, 0x79, 0x03, 0x68, 0x8d, 0xf8, 0x0c, 0x10, 0x08, 0xaa, + 0x58, 0x46, 0x13, 0x60, 0x00, 0x27, 0xed, 0xf7, 0xb3, 0xfd, 0x00, 0x21, + 0x88, 0x46, 0x0e, 0x90, 0xad, 0xf8, 0x0e, 0x10, 0x89, 0xf8, 0x47, 0x10, + 0x00, 0x20, 0x10, 0x99, 0x00, 0x90, 0x4c, 0x7a, 0x64, 0x09, 0x04, 0xf0, + 0x01, 0x04, 0x00, 0x26, 0x08, 0xad, 0xbe, 0x42, 0x0e, 0xbf, 0xe9, 0x5d, + 0xa9, 0x5d, 0x01, 0xf0, 0x3f, 0x01, 0x01, 0x22, 0xb2, 0x40, 0xd2, 0xb2, + 0x58, 0x46, 0xfa, 0xf7, 0x4b, 0xfb, 0x76, 0x1c, 0x04, 0x2e, 0xf0, 0xd3, + 0x9d, 0xf8, 0x3c, 0x00, 0xe0, 0xb9, 0x03, 0x2f, 0x3a, 0xd8, 0xdf, 0xe8, + 0x07, 0xf0, 0x02, 0x07, 0x0c, 0x11, 0x9d, 0xf8, 0x0c, 0x20, 0x99, 0xf9, + 0x00, 0x10, 0x0d, 0xe0, 0x9d, 0xf8, 0x0c, 0x20, 0x99, 0xf9, 0x02, 0x10, + 0x08, 0xe0, 0x9d, 0xf8, 0x0c, 0x20, 0x99, 0xf9, 0x01, 0x10, 0x03, 0xe0, + 0x9d, 0xf8, 0x0c, 0x20, 0x99, 0xf9, 0x03, 0x10, 0x58, 0x46, 0xfa, 0xf7, + 0x94, 0xf9, 0x1f, 0xe0, 0x03, 0x2f, 0x1d, 0xd8, 0xdf, 0xe8, 0x07, 0xf0, + 0x02, 0x09, 0x0e, 0x13, 0x00, 0xf0, 0xef, 0xf8, 0x99, 0xf9, 0x00, 0x20, + 0x8d, 0xf8, 0x10, 0x20, 0x0f, 0xe0, 0x00, 0xf0, 0xe8, 0xf8, 0x99, 0xf9, + 0x02, 0x10, 0x08, 0xe0, 0x00, 0xf0, 0xe3, 0xf8, 0x99, 0xf9, 0x01, 0x10, + 0x03, 0xe0, 0x00, 0xf0, 0xde, 0xf8, 0x99, 0xf9, 0x03, 0x10, 0x8d, 0xf8, + 0x10, 0x10, 0x04, 0xa8, 0xfa, 0xf7, 0xb2, 0xf9, 0x58, 0x46, 0xfa, 0xf7, + 0x1e, 0xfb, 0x58, 0x46, 0xed, 0xf7, 0x4e, 0xfd, 0x00, 0x26, 0x09, 0xeb, + 0x47, 0x03, 0xbd, 0xf8, 0x68, 0x10, 0x8d, 0xf8, 0x0d, 0x60, 0xb2, 0x46, + 0x0b, 0x93, 0xb1, 0xb9, 0x58, 0x46, 0xfa, 0xf7, 0x0e, 0xf9, 0x06, 0xab, + 0x07, 0xaa, 0xf9, 0xb2, 0x58, 0x46, 0xfa, 0xf7, 0xd7, 0xf8, 0x07, 0x98, + 0x0b, 0x9a, 0x41, 0x00, 0x91, 0x84, 0x06, 0x98, 0x0b, 0x9a, 0x09, 0x1a, + 0x91, 0x84, 0x77, 0xe0, 0xbd, 0xf8, 0x68, 0xa0, 0x00, 0x27, 0x00, 0x26, + 0x09, 0xe0, 0x00, 0x9d, 0xcd, 0xf8, 0x28, 0x90, 0x0d, 0x94, 0x0c, 0x97, + 0x81, 0x46, 0x05, 0xe0, 0xed, 0xf7, 0x46, 0xfc, 0x76, 0x1c, 0xb9, 0x46, + 0x0a, 0xf1, 0x01, 0x0a, 0xbd, 0xf8, 0x68, 0x10, 0x1f, 0xfa, 0x8a, 0xf0, + 0x88, 0x42, 0x45, 0xd2, 0x58, 0x46, 0xfa, 0xf7, 0xe4, 0xf8, 0x58, 0x46, + 0xed, 0xf7, 0x14, 0xfd, 0x07, 0x46, 0xed, 0xf7, 0x3a, 0xfc, 0x04, 0x00, + 0x02, 0xbf, 0x0a, 0x99, 0x91, 0xf9, 0x46, 0x00, 0x00, 0x28, 0x15, 0xd1, + 0x00, 0x21, 0xad, 0xf8, 0x24, 0x10, 0x09, 0xa8, 0x02, 0x90, 0x0d, 0xf1, + 0x0e, 0x02, 0x0d, 0xf1, 0x0d, 0x01, 0x01, 0x92, 0x00, 0x91, 0xad, 0x1d, + 0x0c, 0x98, 0x10, 0x9b, 0x0a, 0x9a, 0xc1, 0xb2, 0x58, 0x46, 0x00, 0xf0, + 0x86, 0xfa, 0xbd, 0xf8, 0x24, 0x00, 0x80, 0x44, 0x9d, 0xf8, 0x0d, 0x10, + 0x01, 0x29, 0x04, 0xd1, 0x0d, 0x98, 0x10, 0xb1, 0x0a, 0x98, 0x80, 0xf8, + 0x87, 0x10, 0x00, 0x2c, 0xb6, 0xd1, 0x0a, 0x98, 0x90, 0xf9, 0x87, 0x10, + 0x01, 0x29, 0xb1, 0xd0, 0xb9, 0x45, 0x07, 0xd2, 0x9d, 0xf8, 0x6c, 0x00, + 0x00, 0x28, 0xb7, 0xd1, 0x58, 0x46, 0xfa, 0xf7, 0xa8, 0xfa, 0xb5, 0xe7, + 0x32, 0xb2, 0x52, 0x42, 0x01, 0x21, 0x58, 0x46, 0xed, 0xf7, 0xde, 0xfc, + 0xdd, 0xf8, 0x28, 0x90, 0x00, 0x95, 0x36, 0xb2, 0xd9, 0xf8, 0x3c, 0x00, + 0x0d, 0x9c, 0x0c, 0x9f, 0x30, 0x18, 0xc9, 0xf8, 0x3c, 0x00, 0x09, 0xeb, + 0x87, 0x00, 0x01, 0x6f, 0x76, 0x18, 0x06, 0x67, 0x1f, 0xfa, 0x8a, 0xf1, + 0xbd, 0xf8, 0x68, 0x00, 0x81, 0x42, 0xff, 0xf4, 0x7c, 0xaf, 0x0b, 0x98, + 0x00, 0x21, 0x81, 0x84, 0x99, 0xf9, 0x87, 0x00, 0x01, 0x28, 0x03, 0xd0, + 0x7f, 0x1c, 0x04, 0x2f, 0xff, 0xf4, 0x0d, 0xaf, 0x99, 0xf9, 0x46, 0x00, + 0x20, 0xbb, 0x10, 0x98, 0x41, 0x7a, 0xbd, 0xf8, 0x68, 0x00, 0xc1, 0xf3, + 0x81, 0x03, 0x9b, 0x1c, 0x00, 0x28, 0x18, 0xbf, 0x00, 0x2c, 0x19, 0xd0, + 0x00, 0x98, 0xdb, 0xb2, 0x81, 0x00, 0x18, 0xfb, 0x03, 0xf0, 0x4a, 0x46, + 0x89, 0xb2, 0x80, 0xb2, 0x00, 0xf0, 0x83, 0xfa, 0x99, 0xf9, 0x47, 0x00, + 0x01, 0x28, 0x0b, 0xd1, 0x01, 0x21, 0x89, 0xf8, 0x87, 0x10, 0x00, 0x20, + 0x00, 0x21, 0x09, 0xf1, 0x24, 0x02, 0x22, 0xf8, 0x10, 0x10, 0x40, 0x1c, + 0x04, 0x28, 0xfa, 0xd3, 0x58, 0x46, 0xed, 0xf7, 0x87, 0xfc, 0xb9, 0xf8, + 0x5e, 0x20, 0x90, 0x44, 0xa9, 0xf8, 0x5e, 0x80, 0x0e, 0x99, 0x40, 0x1a, + 0x11, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x9d, 0xf8, 0x0c, 0x10, 0x8d, 0xf8, + 0x16, 0x10, 0x70, 0x47, 0x2d, 0xe9, 0xfc, 0x41, 0x06, 0x46, 0x0c, 0x46, + 0x17, 0x46, 0x8d, 0xf8, 0x07, 0x60, 0xf9, 0xf7, 0xe9, 0xff, 0xb8, 0x42, + 0x1b, 0xd0, 0x21, 0x46, 0x30, 0x46, 0xfa, 0xf7, 0xa2, 0xf8, 0x05, 0x46, + 0x21, 0x46, 0x30, 0x46, 0xfa, 0xf7, 0xd5, 0xf8, 0x01, 0x2f, 0x80, 0x46, + 0x02, 0xd1, 0x00, 0xf0, 0x17, 0xf8, 0x01, 0xe0, 0x00, 0xf0, 0x0d, 0xf8, + 0x3a, 0x46, 0x21, 0x46, 0x30, 0x46, 0xf9, 0xf7, 0xcf, 0xff, 0x17, 0xb9, + 0x00, 0xf0, 0x0c, 0xf8, 0x01, 0xe0, 0x00, 0xf0, 0x02, 0xf8, 0xbd, 0xe8, + 0xf3, 0x81, 0x8d, 0xf8, 0x06, 0x40, 0x8d, 0xf8, 0x00, 0x50, 0x68, 0x46, + 0xfa, 0xf7, 0xa6, 0xb8, 0x22, 0x46, 0x41, 0x46, 0x30, 0x46, 0xfa, 0xf7, + 0x62, 0xb8, 0xb0, 0xb5, 0x93, 0xf9, 0x00, 0x00, 0x3e, 0x30, 0x7d, 0x28, + 0x24, 0xbf, 0x00, 0x20, 0x98, 0x84, 0x93, 0xf9, 0x01, 0x00, 0x3e, 0x30, + 0x7d, 0x28, 0x24, 0xbf, 0x00, 0x20, 0x18, 0x85, 0x93, 0xf9, 0x02, 0x00, + 0x3e, 0x30, 0x7d, 0x28, 0x24, 0xbf, 0x00, 0x20, 0xd8, 0x84, 0x93, 0xf9, + 0x03, 0x00, 0x3e, 0x30, 0x7d, 0x28, 0x03, 0xeb, 0x41, 0x05, 0x24, 0xbf, + 0x00, 0x20, 0x58, 0x85, 0xb3, 0xf8, 0x24, 0xc0, 0xd8, 0x8c, 0x1c, 0x8d, + 0xaf, 0x8a, 0x84, 0x44, 0x58, 0x8d, 0xa4, 0x44, 0x60, 0x44, 0x07, 0x44, + 0xaf, 0x82, 0x58, 0x18, 0xb5, 0xf9, 0x14, 0x40, 0xd4, 0x42, 0x05, 0xda, + 0x02, 0x7b, 0x52, 0x1c, 0x02, 0x73, 0x00, 0x23, 0xab, 0x82, 0x06, 0xe0, + 0xa2, 0x42, 0x04, 0xda, 0x02, 0x7b, 0x53, 0x1e, 0x03, 0x73, 0x00, 0x24, + 0xac, 0x82, 0x3f, 0x22, 0x01, 0x29, 0x04, 0xd0, 0x02, 0x29, 0x16, 0xbf, + 0x03, 0x29, 0x1f, 0x22, 0x0f, 0x22, 0x90, 0xf9, 0x0c, 0x10, 0x8a, 0x42, + 0xb8, 0xbf, 0x11, 0x46, 0x01, 0x73, 0x52, 0x42, 0x90, 0xf9, 0x0c, 0x10, + 0x91, 0x42, 0xa8, 0xbf, 0x0a, 0x46, 0x02, 0x73, 0xb0, 0xbd, 0x70, 0xb5, + 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0x00, 0xf0, 0x4f, 0xf9, 0xa8, 0x79, + 0x30, 0xb1, 0x00, 0x23, 0x06, 0xf1, 0x0c, 0x02, 0x00, 0x21, 0x20, 0x46, + 0x00, 0xf0, 0xd4, 0xf9, 0xe8, 0x79, 0x38, 0xb1, 0x06, 0xf1, 0x0c, 0x02, + 0x20, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x00, 0x23, 0x01, 0x21, 0xc9, 0xe1, + 0x70, 0xbd, 0xf0, 0xb5, 0x96, 0x88, 0x90, 0x8c, 0xd3, 0x88, 0x14, 0x89, + 0x55, 0x89, 0x86, 0x19, 0xd0, 0x8c, 0x96, 0x80, 0x37, 0xb2, 0xc3, 0x18, + 0x10, 0x8d, 0xd3, 0x80, 0x04, 0x19, 0x50, 0x8d, 0x14, 0x81, 0x45, 0x19, + 0x08, 0x46, 0x40, 0x42, 0xb9, 0x42, 0x55, 0x81, 0x02, 0xda, 0x16, 0x78, + 0x76, 0x1e, 0x04, 0xe0, 0x36, 0xb2, 0x86, 0x42, 0x04, 0xda, 0x16, 0x78, + 0x76, 0x1c, 0x16, 0x70, 0x00, 0x27, 0x97, 0x80, 0x1f, 0xb2, 0xb9, 0x42, + 0x05, 0xda, 0x93, 0x78, 0x5b, 0x1c, 0x00, 0x26, 0x93, 0x70, 0xd6, 0x80, + 0x07, 0xe0, 0x1b, 0xb2, 0x83, 0x42, 0x04, 0xda, 0x93, 0x78, 0x5e, 0x1e, + 0x00, 0x27, 0x96, 0x70, 0xd7, 0x80, 0x26, 0xb2, 0xb1, 0x42, 0x05, 0xda, + 0x53, 0x78, 0x5c, 0x1e, 0x00, 0x26, 0x54, 0x70, 0x16, 0x81, 0x07, 0xe0, + 0x24, 0xb2, 0x84, 0x42, 0x04, 0xda, 0x53, 0x78, 0x5b, 0x1c, 0x00, 0x24, + 0x53, 0x70, 0x14, 0x81, 0x2b, 0xb2, 0x99, 0x42, 0x05, 0xda, 0xd0, 0x78, + 0x40, 0x1c, 0x00, 0x21, 0xd0, 0x70, 0x51, 0x81, 0x07, 0xe0, 0x2d, 0xb2, + 0x85, 0x42, 0x04, 0xda, 0xd0, 0x78, 0x41, 0x1e, 0x00, 0x23, 0xd1, 0x70, + 0x53, 0x81, 0x92, 0xf9, 0x00, 0x00, 0x40, 0x28, 0xa8, 0xbf, 0x3f, 0x20, + 0x10, 0x70, 0x6f, 0xf0, 0x3e, 0x00, 0x92, 0xf9, 0x00, 0x30, 0x83, 0x42, + 0xb8, 0xbf, 0x03, 0x46, 0x13, 0x70, 0x92, 0xf9, 0x01, 0x30, 0x40, 0x2b, + 0xa8, 0xbf, 0x3f, 0x23, 0x53, 0x70, 0x92, 0xf9, 0x01, 0x30, 0x83, 0x42, + 0xb8, 0xbf, 0x03, 0x46, 0x53, 0x70, 0x92, 0xf9, 0x02, 0x30, 0x40, 0x2b, + 0xa8, 0xbf, 0x3f, 0x23, 0x93, 0x70, 0x92, 0xf9, 0x02, 0x30, 0x83, 0x42, + 0xb8, 0xbf, 0x03, 0x46, 0x93, 0x70, 0x92, 0xf9, 0x03, 0x30, 0x40, 0x2b, + 0xa8, 0xbf, 0x3f, 0x23, 0xd3, 0x70, 0x92, 0xf9, 0x03, 0x30, 0x83, 0x42, + 0xa8, 0xbf, 0x18, 0x46, 0xd0, 0x70, 0xf0, 0xbd, 0x2d, 0xe9, 0xfc, 0x41, + 0x07, 0x46, 0x09, 0x98, 0x08, 0x9e, 0x00, 0x90, 0x0c, 0x46, 0x11, 0x46, + 0x98, 0x46, 0x33, 0x46, 0x42, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x0f, 0xf8, + 0x00, 0x25, 0x01, 0x2f, 0x08, 0xd1, 0x9d, 0xf9, 0x28, 0x30, 0x00, 0x95, + 0x42, 0x46, 0x31, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x35, 0xf8, 0x05, 0x46, + 0x28, 0x46, 0xbd, 0xe8, 0xf6, 0x81, 0xf0, 0xb5, 0x05, 0x9c, 0x00, 0x25, + 0x04, 0xe0, 0x05, 0xfb, 0x02, 0x66, 0x67, 0x5d, 0x87, 0x55, 0x6d, 0x1c, + 0x0e, 0x68, 0x9d, 0x42, 0xf7, 0xd3, 0x76, 0x1c, 0x96, 0x42, 0x28, 0xbf, + 0x00, 0x26, 0x0e, 0x60, 0xf0, 0xbd, 0xf0, 0xb5, 0x04, 0x46, 0x00, 0x20, + 0x00, 0x27, 0x04, 0xe0, 0xab, 0x1b, 0x83, 0x42, 0xa8, 0xbf, 0x18, 0x46, + 0x7f, 0x1c, 0x8f, 0x42, 0x11, 0xd2, 0x00, 0x23, 0x93, 0x42, 0xf5, 0xd2, + 0x02, 0xfb, 0x07, 0x3c, 0x14, 0xf9, 0x0c, 0xc0, 0x2b, 0xb1, 0x65, 0x45, + 0xb8, 0xbf, 0x65, 0x46, 0x66, 0x45, 0x02, 0xdd, 0x00, 0xe0, 0x65, 0x46, + 0x66, 0x46, 0x5b, 0x1c, 0xee, 0xe7, 0xf0, 0xbd, 0x38, 0xb5, 0x1d, 0x46, + 0xff, 0xf7, 0xdd, 0xff, 0x00, 0x24, 0x01, 0x46, 0x8d, 0x42, 0x04, 0x98, + 0xa8, 0xbf, 0x01, 0x24, 0x60, 0xb1, 0x38, 0x30, 0x90, 0xf9, 0x13, 0x20, + 0x8a, 0x42, 0x02, 0xda, 0x03, 0x88, 0xc1, 0x74, 0x43, 0x75, 0x90, 0xf9, + 0x14, 0x20, 0x8a, 0x42, 0xb8, 0xbf, 0x01, 0x75, 0x20, 0x46, 0x32, 0xbd, + 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0x31, 0x46, 0x28, 0x46, + 0xf9, 0xf7, 0x51, 0xff, 0x60, 0x70, 0x31, 0x46, 0x28, 0x46, 0xfa, 0xf7, + 0x13, 0xf8, 0xa0, 0x70, 0x31, 0x46, 0x28, 0x46, 0xfa, 0xf7, 0x1c, 0xf8, + 0xe0, 0x70, 0x31, 0x46, 0x28, 0x46, 0xfa, 0xf7, 0x25, 0xf8, 0x20, 0x71, + 0x31, 0x46, 0x28, 0x46, 0xfa, 0xf7, 0x2e, 0xf8, 0x60, 0x71, 0x31, 0x46, + 0x28, 0x46, 0xfa, 0xf7, 0x37, 0xf8, 0xa0, 0x71, 0x70, 0xbd, 0x02, 0x46, + 0x00, 0x20, 0x0a, 0x40, 0x8a, 0x42, 0x08, 0xbf, 0x01, 0x20, 0x70, 0x47, + 0x70, 0xb5, 0x04, 0x46, 0x20, 0x25, 0x00, 0x26, 0x4f, 0xf4, 0x1d, 0x71, + 0x20, 0x46, 0xff, 0xf7, 0xf0, 0xff, 0x01, 0x28, 0x06, 0xd0, 0x40, 0xf2, + 0x8b, 0x11, 0x20, 0x46, 0xff, 0xf7, 0xe9, 0xff, 0x01, 0x28, 0x05, 0xd1, + 0x76, 0x1c, 0x14, 0x2d, 0xa8, 0xbf, 0xa4, 0x0a, 0x0a, 0x3d, 0x03, 0xe0, + 0x0a, 0x2d, 0xc8, 0xbf, 0x64, 0x08, 0x6d, 0x1e, 0x6d, 0xb2, 0x0a, 0x2d, + 0xe4, 0xda, 0x36, 0x06, 0x70, 0x0e, 0x70, 0xbd, 0x38, 0xb5, 0x14, 0x46, + 0x84, 0xb0, 0x94, 0xf9, 0x01, 0x30, 0xad, 0xf8, 0x06, 0x30, 0x94, 0xf9, + 0x00, 0x50, 0xad, 0xf8, 0x04, 0x50, 0x01, 0x25, 0x94, 0xf9, 0x03, 0x20, + 0xad, 0xf8, 0x02, 0x20, 0x94, 0xf9, 0x02, 0x30, 0xad, 0xf8, 0x00, 0x30, + 0x8d, 0xf8, 0x08, 0x50, 0x09, 0x79, 0xf9, 0xf7, 0xf4, 0xfe, 0x8d, 0xf8, + 0x09, 0x00, 0x68, 0x46, 0x13, 0xf0, 0x34, 0xff, 0x9d, 0xf8, 0x0b, 0x10, + 0x21, 0x73, 0x9d, 0xf8, 0x0c, 0x10, 0x61, 0x73, 0x9d, 0xf8, 0x0a, 0x10, + 0xe1, 0x74, 0x84, 0xf8, 0x40, 0x00, 0x05, 0xb0, 0x30, 0xbd, 0x2d, 0xe9, + 0xfc, 0x41, 0x14, 0x46, 0x04, 0xf1, 0x45, 0x05, 0x80, 0x46, 0x95, 0xf9, + 0x01, 0x00, 0x19, 0x46, 0xe0, 0xb9, 0x0a, 0x9e, 0x08, 0x9f, 0x40, 0x46, + 0xfa, 0xf7, 0x8a, 0xf8, 0x38, 0x70, 0x00, 0x23, 0x2b, 0x70, 0x8d, 0xf8, + 0x00, 0x30, 0x6a, 0x46, 0x21, 0x46, 0x40, 0x46, 0x00, 0xf0, 0x10, 0xf8, + 0x20, 0x6e, 0x9d, 0xf8, 0x00, 0x10, 0x41, 0x18, 0x21, 0x66, 0x30, 0x88, + 0x9d, 0xf8, 0x00, 0x10, 0x41, 0x18, 0x31, 0x80, 0x20, 0x46, 0x41, 0x46, + 0xfa, 0xf7, 0xba, 0xf8, 0xbd, 0xe8, 0xf3, 0x81, 0x2d, 0xe9, 0xf8, 0x43, + 0x89, 0x46, 0x09, 0xf1, 0x45, 0x05, 0x80, 0x46, 0x95, 0xf9, 0x01, 0x00, + 0x14, 0x46, 0x00, 0x26, 0xe8, 0xb9, 0x00, 0x27, 0x69, 0x46, 0x40, 0x46, + 0xfa, 0xf7, 0x5c, 0xf8, 0x03, 0x2f, 0x03, 0xd2, 0x00, 0x98, 0x09, 0xeb, + 0x87, 0x01, 0x48, 0x66, 0x00, 0x98, 0xff, 0xf7, 0x71, 0xff, 0x56, 0xfa, + 0x80, 0xf6, 0x40, 0x46, 0xfa, 0xf7, 0x50, 0xf8, 0x03, 0x2f, 0x03, 0xd2, + 0x29, 0x78, 0xb8, 0x40, 0x08, 0x43, 0x28, 0x70, 0x7f, 0x1c, 0x06, 0x2f, + 0xe4, 0xd3, 0x70, 0x00, 0x20, 0x70, 0xbd, 0xe8, 0xf1, 0x83, 0x13, 0x46, + 0x0a, 0x46, 0x01, 0x46, 0x03, 0xf1, 0x0c, 0x00, 0x2e, 0xe7, 0x88, 0x42, + 0x05, 0xd3, 0x51, 0x6d, 0x01, 0x20, 0x49, 0x1c, 0x82, 0xf8, 0x47, 0x00, + 0x51, 0x65, 0x70, 0x47, 0x2d, 0xe9, 0xff, 0x41, 0x16, 0x46, 0x02, 0xaa, + 0x00, 0x24, 0xc2, 0xe9, 0x00, 0x44, 0x01, 0x2b, 0x8d, 0xf8, 0x07, 0x00, + 0x8d, 0xf8, 0x06, 0x10, 0x52, 0xd1, 0x0a, 0x46, 0x01, 0x46, 0x02, 0xa8, + 0xff, 0xf7, 0x14, 0xff, 0x01, 0x25, 0x02, 0xac, 0x67, 0x57, 0x70, 0x57, + 0xb8, 0x42, 0x4f, 0xf0, 0x01, 0x08, 0x16, 0xda, 0x4f, 0xf0, 0xff, 0x38, + 0x13, 0xe0, 0x30, 0x79, 0x8d, 0xf8, 0x03, 0x00, 0x71, 0x79, 0x8d, 0xf8, + 0x04, 0x10, 0x8d, 0xf8, 0x05, 0x70, 0x06, 0xe0, 0x30, 0x79, 0x8d, 0xf8, + 0x03, 0x00, 0x8d, 0xf8, 0x04, 0x70, 0x8d, 0xf8, 0x05, 0x10, 0x68, 0x46, + 0xf9, 0xf7, 0xd4, 0xfd, 0x47, 0x44, 0x71, 0x57, 0x78, 0xb2, 0x88, 0x42, + 0x26, 0xd0, 0x6a, 0x1e, 0x94, 0xf9, 0x06, 0x10, 0x05, 0x2a, 0xf5, 0xd8, + 0xdf, 0xe8, 0x02, 0xf0, 0x06, 0x0b, 0x14, 0x1a, 0x05, 0x04, 0xef, 0xe7, + 0xdb, 0xe7, 0xe3, 0xe7, 0x8d, 0xf8, 0x00, 0x70, 0xff, 0xf7, 0x7d, 0xfd, + 0xe8, 0xe7, 0xe0, 0x78, 0x8d, 0xf8, 0x01, 0x70, 0x8d, 0xf8, 0x02, 0x00, + 0x68, 0x46, 0xf9, 0xf7, 0x9e, 0xfd, 0xdf, 0xe7, 0xb1, 0x78, 0x8d, 0xf8, + 0x01, 0x10, 0x8d, 0xf8, 0x02, 0x70, 0xf5, 0xe7, 0x62, 0x79, 0x8d, 0xf8, + 0x03, 0x70, 0x8d, 0xf8, 0x04, 0x20, 0xce, 0xe7, 0x6d, 0x1c, 0x06, 0x2d, + 0x16, 0xdc, 0xb3, 0xe7, 0x96, 0xf9, 0x01, 0x00, 0x8d, 0xf8, 0x00, 0x00, + 0xb1, 0x78, 0x8d, 0xf8, 0x01, 0x10, 0xf0, 0x78, 0x8d, 0xf8, 0x02, 0x00, + 0x30, 0x79, 0x8d, 0xf8, 0x03, 0x00, 0x70, 0x79, 0x8d, 0xf8, 0x04, 0x00, + 0xb0, 0x79, 0x8d, 0xf8, 0x05, 0x00, 0x68, 0x46, 0xfa, 0xf7, 0x32, 0xf8, + 0xbd, 0xe8, 0xff, 0x81, 0x70, 0xb5, 0x8a, 0x88, 0x82, 0x80, 0xcb, 0x88, + 0xc3, 0x80, 0x0a, 0x89, 0x02, 0x81, 0x4b, 0x89, 0x43, 0x81, 0x0a, 0x78, + 0x02, 0x70, 0x4b, 0x78, 0x43, 0x70, 0x8a, 0x78, 0x82, 0x70, 0x02, 0x22, + 0xcb, 0x78, 0xc3, 0x70, 0x01, 0xeb, 0x42, 0x03, 0x00, 0xeb, 0x42, 0x05, + 0x9c, 0x8a, 0xac, 0x82, 0x8b, 0x18, 0x86, 0x18, 0x1c, 0x7b, 0x34, 0x73, + 0x52, 0x1c, 0x06, 0x2a, 0xf2, 0xdd, 0x70, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, + 0x04, 0x46, 0x0d, 0x46, 0x90, 0x46, 0x1f, 0x46, 0x00, 0x26, 0x29, 0x46, + 0xf0, 0xb2, 0x88, 0x42, 0x05, 0xd0, 0xc1, 0xf1, 0x01, 0x01, 0x88, 0x42, + 0x08, 0xbf, 0x01, 0x2f, 0x11, 0xd1, 0x98, 0xf9, 0x0d, 0x20, 0xf1, 0xb2, + 0x20, 0x46, 0xf9, 0xf7, 0x7a, 0xff, 0x98, 0xf9, 0x0e, 0x20, 0xf1, 0xb2, + 0x20, 0x46, 0xf9, 0xf7, 0x6d, 0xff, 0x98, 0xf9, 0x0f, 0x20, 0xf1, 0xb2, + 0x20, 0x46, 0xf9, 0xf7, 0x70, 0xff, 0x76, 0x1c, 0xf0, 0xb2, 0x01, 0x28, + 0xdf, 0xd9, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x00, 0x94, 0x95, 0x84, 0x85, + 0x00, 0x22, 0xed, 0xf7, 0xe5, 0xbc, 0x00, 0x00, 0x13, 0xf0, 0x00, 0x4c, + 0x03, 0xd5, 0x5b, 0x42, 0x52, 0x42, 0x63, 0xf1, 0x00, 0x03, 0x9c, 0xea, + 0x21, 0x0c, 0x00, 0xf0, 0x17, 0x80, 0x10, 0xb5, 0x64, 0x46, 0x03, 0xd3, + 0x49, 0x42, 0x40, 0x42, 0x61, 0xf1, 0x00, 0x01, 0x00, 0xf0, 0x0e, 0xf8, + 0x64, 0x00, 0x04, 0xd3, 0x49, 0x42, 0x40, 0x42, 0x61, 0xf1, 0x00, 0x01, + 0x24, 0x42, 0x03, 0xd5, 0x5b, 0x42, 0x52, 0x42, 0x63, 0xf1, 0x00, 0x03, + 0x10, 0xbd, 0x00, 0x00, 0xd3, 0xbb, 0xd9, 0xb1, 0xb2, 0xf5, 0x80, 0x3f, + 0x5b, 0xd2, 0x02, 0x2a, 0x1e, 0xd9, 0x8c, 0x46, 0xb1, 0xfb, 0xf2, 0xf1, + 0x02, 0xfb, 0x11, 0xc3, 0x1b, 0x04, 0x43, 0xea, 0x10, 0x43, 0xb3, 0xfb, + 0xf2, 0xfc, 0x02, 0xfb, 0x1c, 0x33, 0x80, 0xb2, 0x40, 0xea, 0x03, 0x43, + 0xb3, 0xfb, 0xf2, 0xf0, 0x02, 0xfb, 0x10, 0x32, 0x40, 0xea, 0x0c, 0x40, + 0x00, 0x23, 0x70, 0x47, 0x02, 0x2a, 0x05, 0xd9, 0x84, 0x46, 0xb0, 0xfb, + 0xf2, 0xf0, 0x02, 0xfb, 0x10, 0xc2, 0x70, 0x47, 0x4a, 0xb1, 0x05, 0xd1, + 0x00, 0xf0, 0x01, 0x02, 0x49, 0x08, 0x5f, 0xea, 0x30, 0x00, 0x70, 0x47, + 0x00, 0x22, 0x00, 0x23, 0x70, 0x47, 0xec, 0xf7, 0x5d, 0xbf, 0x0b, 0x00, + 0x02, 0x00, 0x00, 0x21, 0x00, 0x20, 0x70, 0x47, 0xf7, 0xd3, 0x00, 0x22, + 0x00, 0x23, 0x70, 0x47, 0x90, 0x42, 0x71, 0xeb, 0x03, 0x0c, 0xf2, 0xd3, + 0x70, 0xb5, 0xb1, 0xfa, 0x81, 0xf4, 0xb3, 0xfa, 0x83, 0xf5, 0x2c, 0x1b, + 0xa3, 0x40, 0xc4, 0xf1, 0x20, 0x05, 0x32, 0xfa, 0x05, 0xf6, 0x33, 0x43, + 0xa2, 0x40, 0x5f, 0xf0, 0x00, 0x46, 0xe6, 0x40, 0x02, 0xe0, 0x5b, 0x08, + 0x5f, 0xea, 0x32, 0x02, 0x84, 0x1a, 0x71, 0xeb, 0x03, 0x05, 0x24, 0xbf, + 0x20, 0x46, 0x29, 0x46, 0x76, 0x41, 0xf4, 0xd3, 0x02, 0x00, 0x0b, 0x00, + 0x30, 0x00, 0x00, 0x21, 0x70, 0xbd, 0x70, 0xb5, 0xb1, 0xfa, 0x81, 0xf4, + 0xb2, 0xfa, 0x82, 0xf5, 0xc4, 0xf1, 0x20, 0x04, 0x64, 0x19, 0xb4, 0xf1, + 0x20, 0x06, 0xda, 0xd3, 0xb2, 0x40, 0x5f, 0xf0, 0x00, 0x44, 0xf4, 0x40, + 0x00, 0x25, 0x02, 0xe0, 0x52, 0x08, 0x5f, 0xea, 0x33, 0x03, 0xc6, 0x1a, + 0x71, 0xeb, 0x02, 0x0e, 0x24, 0xbf, 0x30, 0x46, 0x71, 0x46, 0x64, 0x41, + 0x6d, 0x41, 0xf3, 0xd3, 0x02, 0x00, 0x0b, 0x00, 0x20, 0x00, 0x29, 0x00, + 0x70, 0xbd, 0x00, 0x00, 0x00, 0x78, 0x02, 0x40, 0xca, 0x40, 0xd0, 0xb2, + 0x70, 0x47, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, + 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x70, + 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0xdf, 0xf8, 0xe0, 0x0c, 0x01, 0x68, + 0xd1, 0xf8, 0xb8, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x70, 0x47, 0xdf, 0xf8, + 0xd0, 0x0c, 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, 0xc0, 0xf3, 0x07, 0x20, + 0x70, 0x47, 0xdf, 0xf8, 0xc4, 0x2c, 0x52, 0xf8, 0x20, 0x00, 0x01, 0x29, + 0x03, 0xd1, 0x00, 0x21, 0x80, 0xf8, 0x50, 0x10, 0x70, 0x47, 0x01, 0x22, + 0x80, 0xf8, 0x50, 0x20, 0x70, 0x47, 0x70, 0xb5, 0x05, 0x46, 0x00, 0xf0, + 0xdd, 0xfb, 0x28, 0x46, 0x00, 0xf0, 0x12, 0xf8, 0x04, 0x00, 0x0d, 0xd1, + 0xdf, 0xf8, 0x98, 0x0c, 0x2e, 0x46, 0x50, 0xf8, 0x26, 0x00, 0x01, 0xf0, + 0xef, 0xf8, 0xc0, 0x1c, 0xff, 0xf7, 0xc1, 0xff, 0x00, 0x21, 0x28, 0x46, + 0x00, 0xf0, 0x1c, 0xf9, 0x20, 0x46, 0x70, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, + 0xdf, 0xf8, 0x74, 0x1c, 0xdf, 0xf8, 0x68, 0x5c, 0xdf, 0xf8, 0x68, 0x6c, + 0x80, 0x46, 0x51, 0xf8, 0x28, 0x10, 0x00, 0x24, 0x01, 0xf1, 0x74, 0x09, + 0x29, 0x68, 0x02, 0x28, 0x4f, 0xf4, 0x7a, 0x77, 0x13, 0xd1, 0x91, 0xf8, + 0x5a, 0x30, 0x00, 0xf0, 0xe3, 0xfa, 0x99, 0xf8, 0x00, 0x00, 0xb1, 0x68, + 0x00, 0xf0, 0x86, 0xf8, 0xb2, 0x68, 0xd0, 0xf8, 0x56, 0x10, 0x4f, 0x43, + 0x42, 0xf8, 0x34, 0x7f, 0x90, 0xf8, 0x5b, 0x00, 0xd0, 0x75, 0xb1, 0x68, + 0x71, 0xe0, 0x02, 0x00, 0x2a, 0xd1, 0x00, 0x20, 0x00, 0x90, 0x00, 0xf0, + 0x88, 0xf8, 0x28, 0x68, 0x90, 0xf8, 0x85, 0x30, 0x00, 0xf0, 0xc8, 0xfa, + 0x99, 0xf8, 0x00, 0x00, 0x31, 0x68, 0x00, 0xf0, 0x71, 0xf8, 0xd2, 0xf8, + 0x81, 0x00, 0x47, 0x43, 0x30, 0x68, 0x47, 0x63, 0x00, 0x20, 0x00, 0xf0, + 0x99, 0xf8, 0x04, 0x00, 0x5b, 0xd1, 0x00, 0x99, 0x00, 0x20, 0x01, 0xf0, + 0x95, 0xfb, 0x28, 0x68, 0x32, 0x68, 0x90, 0xf8, 0x86, 0x10, 0x82, 0xf8, + 0x4b, 0x10, 0x01, 0x20, 0x37, 0x68, 0x00, 0xf0, 0x60, 0xf8, 0xd2, 0xf8, + 0x5e, 0x00, 0xd2, 0xf8, 0x62, 0x10, 0x2b, 0xe0, 0x01, 0x28, 0x2d, 0xd1, + 0x00, 0x94, 0x01, 0x20, 0x00, 0xf0, 0x5b, 0xf8, 0x28, 0x68, 0x90, 0xf8, + 0xb0, 0x30, 0x00, 0xf0, 0x9b, 0xfa, 0x99, 0xf8, 0x00, 0x00, 0x71, 0x68, + 0x00, 0xf0, 0x44, 0xf8, 0xd2, 0xf8, 0xac, 0x00, 0x47, 0x43, 0x70, 0x68, + 0x47, 0x63, 0x01, 0x20, 0x00, 0xf0, 0x6c, 0xf8, 0x04, 0x00, 0x2e, 0xd1, + 0x00, 0x99, 0x01, 0x20, 0x01, 0xf0, 0x68, 0xfb, 0x28, 0x68, 0x90, 0xf8, + 0xb1, 0x10, 0x70, 0x68, 0x80, 0xf8, 0x4b, 0x10, 0x01, 0x20, 0x77, 0x68, + 0x00, 0xf0, 0x33, 0xf8, 0xd2, 0xf8, 0x89, 0x00, 0xd2, 0xf8, 0x8d, 0x10, + 0x01, 0xf0, 0xf3, 0xf9, 0xb8, 0x60, 0x18, 0xe0, 0x03, 0x28, 0x16, 0xd1, + 0x91, 0xf8, 0x29, 0x3c, 0x00, 0xf0, 0x70, 0xfa, 0x99, 0xf8, 0x00, 0x00, + 0xf1, 0x68, 0x00, 0xf0, 0x13, 0xf8, 0xf2, 0x68, 0xd0, 0xf8, 0x25, 0x1c, + 0x4f, 0x43, 0x42, 0xf8, 0x34, 0x7f, 0x90, 0xf8, 0x2a, 0x0c, 0xd0, 0x75, + 0xf1, 0x68, 0x01, 0xf1, 0x4c, 0x00, 0x04, 0x71, 0x04, 0x60, 0x56, 0xf8, + 0x28, 0x00, 0x41, 0x6b, 0x81, 0x67, 0x47, 0xe2, 0x00, 0xf0, 0x3f, 0x00, + 0x81, 0xf8, 0x30, 0x00, 0x28, 0x68, 0x70, 0x47, 0x00, 0xf0, 0x3f, 0x00, + 0x81, 0xf8, 0x30, 0x00, 0x69, 0x46, 0x2a, 0x68, 0x70, 0x47, 0x00, 0x21, + 0x87, 0xf8, 0x50, 0x00, 0xf9, 0x64, 0x2a, 0x68, 0x70, 0x47, 0x3e, 0xb5, + 0x03, 0x46, 0xdf, 0xf8, 0x04, 0x0b, 0xdf, 0xf8, 0x0c, 0x5b, 0x00, 0x68, + 0x00, 0x24, 0x19, 0x00, 0x0c, 0xbf, 0x90, 0xf8, 0x85, 0x10, 0x90, 0xf8, + 0xb0, 0x10, 0x0a, 0x00, 0x42, 0x69, 0x08, 0xbf, 0x01, 0x21, 0x08, 0x46, + 0xb2, 0xfb, 0xf0, 0xf0, 0xa8, 0x42, 0x09, 0xd3, 0x01, 0x90, 0x00, 0x91, + 0x01, 0x20, 0xdf, 0xf8, 0xe4, 0x2a, 0xb7, 0x21, 0xfb, 0xf7, 0x71, 0xfc, + 0x4b, 0xf2, 0x16, 0x74, 0x20, 0x46, 0x3e, 0xbd, 0x70, 0xb5, 0x0a, 0x46, + 0xdf, 0xf8, 0xbc, 0x1a, 0x09, 0x68, 0x00, 0x23, 0x04, 0x00, 0x26, 0xd0, + 0x01, 0x28, 0x22, 0xd1, 0x91, 0xf8, 0xb0, 0x00, 0x13, 0x60, 0x04, 0x00, + 0x4c, 0x69, 0x00, 0xbf, 0x10, 0xa6, 0x08, 0xbf, 0x01, 0x20, 0xb4, 0xfb, + 0xf0, 0xf4, 0x00, 0x25, 0x56, 0xf8, 0x35, 0x00, 0xb4, 0xfb, 0xf0, 0xf1, + 0x00, 0xfb, 0x11, 0x40, 0x18, 0xb9, 0x11, 0xb1, 0x48, 0x1e, 0x01, 0x42, + 0x03, 0xd0, 0x6d, 0x1c, 0x04, 0x2d, 0xf1, 0xd3, 0x03, 0xe0, 0x06, 0xeb, + 0xc5, 0x00, 0x41, 0x68, 0x11, 0x60, 0x10, 0x68, 0x08, 0xb9, 0x4b, 0xf2, + 0x15, 0x73, 0x18, 0x46, 0x70, 0xbd, 0x91, 0xf8, 0x85, 0x00, 0xd9, 0xe7, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x60, 0xf9, 0xff, 0x00, 0xaf, 0x00, 0x00, + 0x00, 0x66, 0xfd, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x78, 0xff, 0xff, + 0x24, 0xf4, 0x00, 0x00, 0x78, 0x97, 0xfe, 0xff, 0x2d, 0xe9, 0xf8, 0x4f, + 0x06, 0x46, 0xdf, 0xf8, 0x40, 0x0a, 0xb2, 0x46, 0x50, 0xf8, 0x2a, 0x40, + 0x0d, 0x46, 0x67, 0x1c, 0x2b, 0x46, 0x80, 0x22, 0x07, 0x21, 0x00, 0xf0, + 0xa5, 0xff, 0x2b, 0x46, 0x00, 0xf0, 0xa0, 0xff, 0x2b, 0x46, 0x20, 0x22, + 0x05, 0x21, 0x00, 0xf0, 0x9d, 0xff, 0x2b, 0x46, 0x10, 0x22, 0x04, 0x21, + 0x00, 0xf0, 0x98, 0xff, 0x2b, 0x46, 0x04, 0x22, 0x02, 0x21, 0x00, 0xf0, + 0x93, 0xff, 0x2b, 0x46, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0x8e, 0xff, + 0x2b, 0x46, 0x08, 0x22, 0x03, 0x21, 0x04, 0xf1, 0x9d, 0x00, 0xff, 0xf7, + 0x74, 0xfe, 0x04, 0xf1, 0x8c, 0x07, 0x2b, 0x46, 0x02, 0x22, 0x01, 0x21, + 0x00, 0xf0, 0x80, 0xff, 0x00, 0xf0, 0xf4, 0xfc, 0xa0, 0x1c, 0xff, 0xf7, + 0x68, 0xfe, 0x30, 0x46, 0x00, 0xf0, 0x11, 0xf9, 0x04, 0xf1, 0x6d, 0x08, + 0x00, 0x23, 0x00, 0xf0, 0x9b, 0xf9, 0x01, 0x23, 0x00, 0xf0, 0x98, 0xf9, + 0x00, 0x23, 0x80, 0x22, 0x07, 0x21, 0x00, 0xf0, 0x95, 0xf9, 0x00, 0xf0, + 0x40, 0xff, 0x00, 0xf0, 0x91, 0xf9, 0x00, 0x20, 0x20, 0x70, 0xff, 0x21, + 0x21, 0x70, 0x00, 0x23, 0x00, 0xf0, 0xeb, 0xf8, 0x01, 0x23, 0x00, 0xf0, + 0xe8, 0xf8, 0x00, 0x23, 0x80, 0x22, 0x07, 0x21, 0x00, 0xf0, 0x45, 0xfa, + 0x00, 0xf0, 0x2d, 0xff, 0x00, 0xf0, 0x41, 0xfa, 0x01, 0x23, 0x40, 0x22, + 0x06, 0x21, 0x04, 0xf1, 0x75, 0x00, 0xff, 0xf7, 0x3a, 0xfe, 0x03, 0x23, + 0x0c, 0x22, 0x02, 0x21, 0x04, 0xf1, 0x26, 0x00, 0xff, 0xf7, 0x33, 0xfe, + 0x20, 0x23, 0xff, 0x22, 0x00, 0x21, 0x04, 0xf1, 0x77, 0x00, 0xff, 0xf7, + 0x2c, 0xfe, 0xa1, 0x23, 0xff, 0x22, 0x00, 0x21, 0x04, 0xf1, 0x78, 0x00, + 0xff, 0xf7, 0x25, 0xfe, 0x07, 0x23, 0xff, 0x22, 0x00, 0x21, 0x04, 0xf1, + 0x79, 0x00, 0xff, 0xf7, 0x1e, 0xfe, 0x04, 0xf1, 0x0f, 0x06, 0x02, 0x23, + 0x00, 0xf0, 0xbc, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0xa3, 0xfc, 0x04, 0xf1, + 0x18, 0x06, 0x06, 0x23, 0xe0, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x9e, 0xfc, + 0x03, 0x23, 0x18, 0x22, 0x03, 0x21, 0x00, 0xf0, 0x99, 0xfc, 0x08, 0x23, + 0x7f, 0x22, 0x00, 0x21, 0x04, 0xf1, 0x76, 0x00, 0xff, 0xf7, 0x03, 0xfe, + 0x04, 0xf1, 0x11, 0x09, 0x00, 0xf0, 0x35, 0xf9, 0x04, 0xf1, 0x10, 0x06, + 0x08, 0x23, 0x00, 0xf0, 0x9d, 0xf8, 0x06, 0x23, 0x00, 0xf0, 0x84, 0xfc, + 0x01, 0x23, 0x03, 0x22, 0x00, 0xf0, 0x33, 0xf9, 0x00, 0x23, 0x04, 0x22, + 0x02, 0x21, 0x00, 0xf0, 0x27, 0xf9, 0x04, 0xf1, 0x89, 0x06, 0x01, 0x23, + 0x30, 0x22, 0x00, 0xf0, 0x76, 0xfc, 0x00, 0xf0, 0x78, 0xfc, 0x03, 0x23, + 0x18, 0x22, 0x03, 0x21, 0x04, 0xf1, 0x23, 0x00, 0xff, 0xf7, 0xdf, 0xfd, + 0x01, 0x23, 0x04, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x69, 0xfc, 0xe6, 0x1c, + 0x01, 0xf0, 0xed, 0xf9, 0x00, 0xf0, 0x04, 0xff, 0x0a, 0x23, 0x0f, 0x22, + 0x00, 0x21, 0x04, 0xf1, 0x92, 0x00, 0xff, 0xf7, 0xce, 0xfd, 0x00, 0xf0, + 0x73, 0xf8, 0x04, 0xf1, 0x8b, 0x0b, 0x01, 0x23, 0x04, 0x22, 0x02, 0x21, + 0x01, 0xf0, 0x60, 0xf8, 0x00, 0xf0, 0xa9, 0xfe, 0x01, 0xf0, 0x5c, 0xf8, + 0x00, 0x23, 0xe0, 0x22, 0x05, 0x21, 0x01, 0xf0, 0x57, 0xf8, 0x01, 0x23, + 0x30, 0x22, 0x04, 0x21, 0x00, 0xf0, 0xca, 0xfe, 0x00, 0xf0, 0xeb, 0xf8, + 0x04, 0xf1, 0x0e, 0x07, 0x00, 0xf0, 0xc1, 0xfe, 0x20, 0x23, 0x00, 0xf0, + 0x17, 0xfb, 0x0f, 0x23, 0xf0, 0x22, 0x04, 0x21, 0x04, 0xf1, 0x21, 0x00, + 0xff, 0xf7, 0xa7, 0xfd, 0x00, 0xf0, 0x2e, 0xfc, 0x04, 0xf1, 0x20, 0x00, + 0xff, 0xf7, 0xa1, 0xfd, 0x00, 0xf0, 0xd1, 0xf8, 0x04, 0xf1, 0x87, 0x00, + 0xff, 0xf7, 0x9b, 0xfd, 0x00, 0x23, 0xc0, 0x22, 0x06, 0x21, 0x04, 0xf1, + 0x0b, 0x00, 0xff, 0xf7, 0x94, 0xfd, 0x2b, 0x46, 0x40, 0x22, 0x06, 0x21, + 0x00, 0xf0, 0x2f, 0xf8, 0x2b, 0x46, 0x20, 0x22, 0x05, 0x21, 0x00, 0xf0, + 0x2a, 0xf8, 0x01, 0xf0, 0x9e, 0xf9, 0x00, 0xf0, 0xb5, 0xfe, 0x04, 0xf1, + 0x72, 0x07, 0x00, 0xf0, 0x29, 0xf8, 0x00, 0xf0, 0x18, 0xfc, 0x00, 0xf0, + 0x91, 0xfe, 0x00, 0x23, 0x40, 0x22, 0x06, 0x21, 0x00, 0xf0, 0xb6, 0xf8, + 0x01, 0xf0, 0x1a, 0xf8, 0x00, 0xf0, 0xb2, 0xf8, 0xae, 0x34, 0x00, 0xf0, + 0x4a, 0xf8, 0x00, 0xf0, 0x70, 0xf9, 0x00, 0xf0, 0xf7, 0xfb, 0x00, 0xf0, + 0x6c, 0xf9, 0xdf, 0xf8, 0xd8, 0x17, 0x51, 0xf8, 0x2a, 0x20, 0x68, 0x1e, + 0x80, 0x41, 0xc0, 0x0f, 0xd0, 0x62, 0xbd, 0xe8, 0xf1, 0x8f, 0x80, 0x22, + 0x07, 0x21, 0x04, 0xf1, 0x6f, 0x00, 0x5c, 0xe5, 0x0f, 0x22, 0x00, 0x21, + 0x30, 0x46, 0x58, 0xe5, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x38, 0x46, + 0x53, 0xe5, 0x38, 0xb5, 0xdf, 0xf8, 0xa8, 0x17, 0x51, 0xf8, 0x20, 0x40, + 0x65, 0x1c, 0x00, 0xf0, 0xe4, 0xfb, 0x01, 0xf0, 0x0c, 0xf8, 0x00, 0xf0, + 0x2e, 0xfe, 0x01, 0xf0, 0x08, 0xf8, 0x04, 0xf1, 0x8d, 0x05, 0x00, 0xf0, + 0x1a, 0xf8, 0x01, 0xf0, 0x02, 0xf8, 0x00, 0xf0, 0xc7, 0xfb, 0x00, 0xf0, + 0xfe, 0xff, 0x04, 0xf1, 0x8b, 0x05, 0x00, 0xf0, 0xf7, 0xff, 0x01, 0x23, + 0x00, 0xf0, 0xf5, 0xff, 0x9d, 0x34, 0x00, 0xf0, 0x64, 0xf8, 0x00, 0xf0, + 0x30, 0xf9, 0x20, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x00, 0x23, + 0x01, 0x22, 0x01, 0xf0, 0x68, 0xb9, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, + 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x43, 0xdf, 0xf8, 0x48, 0x07, 0xdf, 0xf8, + 0x3c, 0x77, 0xc6, 0x68, 0xdf, 0xf8, 0x38, 0x57, 0x06, 0xf1, 0xae, 0x08, + 0x00, 0xf0, 0x49, 0xf8, 0x00, 0xf0, 0x52, 0xf8, 0x06, 0xf1, 0x03, 0x09, + 0x01, 0x23, 0x01, 0x22, 0x00, 0xf0, 0x4f, 0xf8, 0x3a, 0x68, 0x02, 0xf6, + 0x0a, 0x43, 0x18, 0x68, 0x59, 0x68, 0xeb, 0x68, 0xc3, 0xe9, 0x04, 0x01, + 0xc3, 0xe9, 0x00, 0x01, 0x92, 0xf8, 0x12, 0x0c, 0x83, 0xf8, 0x38, 0x00, + 0x03, 0x20, 0x00, 0xf0, 0x6d, 0xfa, 0x04, 0x00, 0x1c, 0xd1, 0x38, 0x68, + 0x90, 0xf8, 0x14, 0x3c, 0x72, 0x36, 0x20, 0x22, 0x05, 0x21, 0x00, 0xf0, + 0x83, 0xfb, 0x38, 0x68, 0x90, 0xf8, 0x13, 0x3c, 0x10, 0x22, 0x00, 0xf0, + 0x7c, 0xfb, 0x38, 0x68, 0x90, 0xf8, 0x12, 0x3c, 0xfc, 0x22, 0x02, 0x21, + 0x00, 0xf0, 0x24, 0xf8, 0xe9, 0x68, 0x03, 0x20, 0x03, 0xf0, 0x74, 0xfe, + 0x03, 0x20, 0x00, 0xf0, 0x6b, 0xf9, 0x04, 0x46, 0x64, 0xb9, 0x03, 0x20, + 0x00, 0xf0, 0x78, 0xfb, 0x04, 0x46, 0x3c, 0xb9, 0x00, 0xf0, 0x02, 0xfe, + 0x00, 0xf0, 0x12, 0xf8, 0x00, 0xf0, 0xfe, 0xfd, 0x00, 0xf0, 0x0a, 0xf8, + 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, + 0x70, 0x47, 0x01, 0x23, 0x08, 0x22, 0x03, 0x21, 0x48, 0x46, 0xc4, 0xe4, + 0x20, 0x22, 0x05, 0x21, 0x40, 0x46, 0xc0, 0xe4, 0x3f, 0x22, 0x00, 0x21, + 0x48, 0x46, 0xbc, 0xe4, 0x2d, 0xe9, 0xfe, 0x4f, 0x81, 0x46, 0x8a, 0x46, + 0x00, 0x20, 0x01, 0x90, 0x90, 0x46, 0xdf, 0xf8, 0x40, 0x1c, 0xdf, 0xf8, + 0x64, 0x56, 0x91, 0xf8, 0x2c, 0x00, 0x00, 0x90, 0x48, 0x46, 0x2c, 0x68, + 0x04, 0xf1, 0x2c, 0x06, 0x51, 0x46, 0xf2, 0x7d, 0x37, 0x78, 0x00, 0xf0, + 0x62, 0xff, 0x4f, 0xf0, 0x00, 0x0b, 0xba, 0x1c, 0x4b, 0xf1, 0x00, 0x03, + 0xff, 0xf7, 0x16, 0xfc, 0x72, 0x78, 0x00, 0x23, 0x52, 0x00, 0xff, 0xf7, + 0x11, 0xfc, 0x00, 0x99, 0xc4, 0xf8, 0x3b, 0x90, 0x01, 0x26, 0x07, 0x46, + 0x06, 0xfa, 0x01, 0xf1, 0xc4, 0xf8, 0x3f, 0xa0, 0xb7, 0xfb, 0xf1, 0xfb, + 0x28, 0x68, 0x0f, 0xf2, 0x88, 0x0a, 0x4f, 0xf4, 0x7a, 0x71, 0xb7, 0xfb, + 0xf1, 0xf1, 0x01, 0x61, 0x04, 0x25, 0xfb, 0xf7, 0xf7, 0xf9, 0x00, 0xf0, + 0x6c, 0xfd, 0xdf, 0xf8, 0xdc, 0x0b, 0xff, 0xf7, 0x7e, 0xfc, 0xdd, 0xf8, + 0x04, 0x90, 0x00, 0x9c, 0xdf, 0xf8, 0xd0, 0x0b, 0x83, 0x45, 0x14, 0xd3, + 0x64, 0x1c, 0xe3, 0xb2, 0x03, 0x22, 0x00, 0x21, 0xdf, 0xf8, 0xc4, 0x0b, + 0xff, 0xf7, 0x6f, 0xfc, 0x06, 0xfa, 0x04, 0xf0, 0x04, 0x2c, 0xb7, 0xfb, + 0xf0, 0xfb, 0x06, 0xd3, 0x52, 0x46, 0xb7, 0x21, 0x03, 0x20, 0xfb, 0xf7, + 0xee, 0xf9, 0x4b, 0xf2, 0x0f, 0x79, 0x6d, 0x1e, 0xe4, 0xd1, 0xb8, 0xf1, + 0x01, 0x0f, 0x4d, 0x46, 0x04, 0xd1, 0x02, 0x20, 0xff, 0xf7, 0x05, 0xff, + 0x00, 0xf0, 0x1a, 0xf8, 0x02, 0xf0, 0xff, 0xfe, 0x3d, 0xb9, 0x01, 0x20, + 0x01, 0xf0, 0xb3, 0xfe, 0x00, 0x21, 0x01, 0x20, 0x02, 0xf0, 0xbe, 0xff, + 0x05, 0x46, 0x28, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, 0x41, 0x72, 0x6d, 0x20, + 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x6f, 0x20, + 0x66, 0x61, 0x73, 0x74, 0x0a, 0x00, 0x00, 0x00, 0x70, 0xb5, 0xdf, 0xf8, + 0x7c, 0x05, 0xdf, 0xf8, 0x70, 0x65, 0x84, 0x68, 0x30, 0x68, 0xdf, 0xf8, + 0x6c, 0x55, 0x90, 0xf8, 0x43, 0x10, 0xa8, 0x68, 0x80, 0xf8, 0x38, 0x10, + 0x32, 0x68, 0xd2, 0xf8, 0x3b, 0x00, 0xd2, 0xf8, 0x3f, 0x10, 0xaa, 0x68, + 0xc2, 0xe9, 0x04, 0x01, 0xc2, 0xe9, 0x00, 0x01, 0x02, 0x20, 0x00, 0xf0, + 0x91, 0xf9, 0xe0, 0xb9, 0x30, 0x68, 0x90, 0xf8, 0x43, 0x10, 0x72, 0x34, + 0x01, 0x29, 0x03, 0xd1, 0x00, 0xf0, 0xcb, 0xfe, 0x01, 0x23, 0x02, 0xe0, + 0x00, 0xf0, 0x12, 0xf8, 0x00, 0x23, 0x10, 0x22, 0x04, 0x21, 0x00, 0xf0, + 0x10, 0xf8, 0xa9, 0x68, 0x02, 0x20, 0x03, 0xf0, 0x9d, 0xfd, 0x02, 0x20, + 0x00, 0xf0, 0x94, 0xf8, 0x18, 0xb9, 0xbd, 0xe8, 0x70, 0x40, 0x02, 0x20, + 0xa0, 0xe2, 0x70, 0xbd, 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0xfd, 0xbb, 0xdf, 0xf8, 0x14, 0x0d, 0xc1, 0x68, 0x02, 0xe0, + 0xdf, 0xf8, 0xf0, 0x04, 0x81, 0x68, 0xd1, 0xe9, 0x04, 0x01, 0x70, 0x47, + 0xf8, 0xb5, 0x06, 0x46, 0x03, 0x20, 0x0d, 0xf0, 0x8f, 0xfe, 0xdf, 0xf8, + 0xdc, 0x54, 0x04, 0x46, 0x37, 0x46, 0x55, 0xf8, 0x27, 0x00, 0xb0, 0x21, + 0xff, 0xf7, 0x36, 0xfb, 0x55, 0xf8, 0x27, 0x00, 0x00, 0xf1, 0x85, 0x01, + 0x00, 0x22, 0x0a, 0x70, 0xc2, 0x62, 0xff, 0x20, 0xc8, 0x77, 0x30, 0x46, + 0x55, 0xf8, 0x27, 0x10, 0x03, 0xf0, 0x40, 0xfd, 0x55, 0xf8, 0x27, 0x00, + 0x00, 0x21, 0x81, 0x66, 0xc1, 0x67, 0x30, 0x00, 0x18, 0xbf, 0x01, 0x2e, + 0xdf, 0xf8, 0x40, 0x1d, 0x08, 0xd1, 0x28, 0x69, 0x10, 0xbb, 0x1c, 0xb1, + 0x01, 0xf1, 0xd8, 0x00, 0x28, 0x61, 0xf1, 0xbd, 0x29, 0x61, 0xf1, 0xbd, + 0x02, 0x2e, 0x07, 0xd1, 0x1c, 0xb1, 0x01, 0xf5, 0x90, 0x70, 0x68, 0x61, + 0xf1, 0xbd, 0x48, 0x31, 0x69, 0x61, 0xf1, 0xbd, 0x03, 0x2e, 0x07, 0xd1, + 0x1c, 0xb1, 0x01, 0xf5, 0xb4, 0x70, 0xa8, 0x61, 0xf1, 0xbd, 0x90, 0x31, + 0xa9, 0x61, 0xf1, 0xbd, 0xbd, 0xe8, 0xf8, 0x40, 0x03, 0x22, 0x4b, 0xf2, + 0x03, 0x71, 0x01, 0x20, 0x08, 0xf0, 0xa8, 0xbc, 0xf1, 0xbd, 0xf8, 0xb5, + 0x00, 0xf0, 0xe6, 0xff, 0x23, 0x78, 0x05, 0xf1, 0x13, 0x06, 0x3f, 0x22, + 0xff, 0xf7, 0x41, 0xfe, 0x05, 0xf1, 0x12, 0x07, 0x63, 0x78, 0x00, 0xf0, + 0x01, 0xf9, 0x23, 0x79, 0x3f, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x15, 0x00, + 0xff, 0xf7, 0x91, 0xfb, 0x63, 0x79, 0x3f, 0x22, 0x00, 0x21, 0x05, 0xf1, + 0x14, 0x00, 0xff, 0xf7, 0x8a, 0xfb, 0xa3, 0x79, 0x3f, 0x22, 0x00, 0x21, + 0x05, 0xf1, 0x16, 0x00, 0xff, 0xf7, 0x83, 0xfb, 0xa3, 0x78, 0x40, 0x22, + 0x06, 0x21, 0x00, 0xf0, 0x0d, 0xfa, 0xe3, 0x78, 0x38, 0x46, 0x01, 0xb0, + 0xbd, 0xe8, 0xf0, 0x40, 0x40, 0x22, 0x06, 0x21, 0xff, 0xf7, 0x75, 0xbb, + 0x2d, 0xe9, 0xf8, 0x46, 0x07, 0x46, 0xdf, 0xf8, 0xe8, 0x13, 0xdf, 0xf8, + 0xe0, 0xa3, 0x3e, 0x46, 0x51, 0xf8, 0x26, 0x50, 0x02, 0x20, 0x05, 0xf0, + 0xcc, 0xf9, 0x5a, 0xf8, 0x26, 0x00, 0x01, 0x6f, 0x00, 0x24, 0x01, 0x29, + 0x07, 0xd1, 0x43, 0x6f, 0xdb, 0xb2, 0x3f, 0x22, 0x00, 0x21, 0x05, 0xf1, + 0x74, 0x00, 0xff, 0xf7, 0x5a, 0xfb, 0x5a, 0xf8, 0x26, 0x00, 0x90, 0xed, + 0x0d, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xdf, 0xed, 0xc3, 0x0a, 0x60, 0xee, + 0x20, 0x0a, 0xfc, 0xee, 0xe0, 0x0a, 0x10, 0xee, 0x90, 0x0a, 0x0d, 0xf0, + 0xb5, 0xfd, 0x03, 0x46, 0xc0, 0xb2, 0xff, 0x28, 0x0c, 0xbf, 0x00, 0x23, + 0x5b, 0x1c, 0xdb, 0xb2, 0x70, 0x22, 0x04, 0x21, 0x00, 0xf0, 0x46, 0xfc, + 0x5a, 0xf8, 0x26, 0x10, 0x91, 0xf8, 0xac, 0x00, 0x10, 0xb1, 0x38, 0x46, + 0x0a, 0xf0, 0xf1, 0xfe, 0x5a, 0xf8, 0x26, 0x00, 0x90, 0xf8, 0x3d, 0x30, + 0xff, 0x22, 0x00, 0x21, 0xa8, 0x1d, 0xff, 0xf7, 0x2e, 0xfb, 0x5a, 0xf8, + 0x26, 0x00, 0x90, 0xf8, 0x3e, 0x30, 0xff, 0x22, 0x00, 0x21, 0xe8, 0x1d, + 0xff, 0xf7, 0x25, 0xfb, 0x5a, 0xf8, 0x26, 0x00, 0x90, 0xf8, 0x3f, 0x30, + 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x08, 0x00, 0xff, 0xf7, 0x1b, 0xfb, + 0x5a, 0xf8, 0x26, 0x00, 0x90, 0xf8, 0x40, 0x30, 0xff, 0x22, 0x00, 0x21, + 0x05, 0xf1, 0x09, 0x00, 0xff, 0xf7, 0x11, 0xfb, 0x5a, 0xf8, 0x26, 0x00, + 0x90, 0xf8, 0x42, 0x30, 0x07, 0x22, 0x00, 0x21, 0x68, 0x1d, 0xff, 0xf7, + 0x08, 0xfb, 0x5a, 0xf8, 0x26, 0x00, 0x90, 0xf8, 0x41, 0x30, 0xff, 0x22, + 0x00, 0x21, 0x28, 0x1d, 0xff, 0xf7, 0xff, 0xfa, 0x01, 0x23, 0x10, 0x22, + 0x04, 0x21, 0x05, 0xf1, 0x6b, 0x00, 0xff, 0xf7, 0xf8, 0xfa, 0x5a, 0xf8, + 0x26, 0x20, 0x92, 0xf8, 0x3a, 0x10, 0x05, 0xf1, 0x68, 0x07, 0x05, 0xf1, + 0x6c, 0x00, 0x19, 0xb9, 0x00, 0xf0, 0x83, 0xfd, 0x00, 0x23, 0x05, 0xe0, + 0x00, 0xf0, 0x90, 0xfd, 0x5a, 0xf8, 0x26, 0x00, 0x90, 0xf8, 0x3a, 0x30, + 0x00, 0xf0, 0x4c, 0xf8, 0x00, 0xf0, 0xa0, 0xfd, 0x05, 0xf1, 0x1b, 0x09, + 0x00, 0xf0, 0x89, 0xfd, 0x00, 0x23, 0x00, 0x22, 0x0a, 0x21, 0x02, 0x20, + 0x05, 0xf0, 0x45, 0xf9, 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x1a, 0x00, + 0xff, 0xf7, 0xcc, 0xfa, 0x07, 0x46, 0x07, 0x22, 0x00, 0x21, 0x48, 0x46, + 0xff, 0xf7, 0xc6, 0xfa, 0x07, 0x43, 0x05, 0xd0, 0x00, 0xf0, 0xaa, 0xfb, + 0x00, 0x28, 0xed, 0xd0, 0x4b, 0xf2, 0x14, 0x74, 0x01, 0x23, 0x00, 0xf0, + 0x80, 0xfd, 0x04, 0xbb, 0x5a, 0xf8, 0x26, 0x10, 0x91, 0xf8, 0x84, 0x20, + 0x01, 0x2a, 0x0c, 0xbf, 0x01, 0x23, 0x02, 0x23, 0x05, 0xf1, 0x95, 0x00, + 0x03, 0x22, 0x00, 0xf0, 0xce, 0xfb, 0x5a, 0xf8, 0x26, 0x00, 0x90, 0xf8, + 0x44, 0x30, 0x1f, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x1f, 0x00, 0xff, 0xf7, + 0xa8, 0xfa, 0x5a, 0xf8, 0x26, 0x00, 0x90, 0xf8, 0x43, 0x30, 0x0f, 0x22, + 0x00, 0x21, 0x05, 0xf1, 0x96, 0x00, 0xff, 0xf7, 0x9e, 0xfa, 0x02, 0x20, + 0x05, 0xf0, 0x7d, 0xf9, 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x86, 0x12, 0x23, + 0x3f, 0x22, 0x00, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x92, 0xba, 0x00, 0x00, + 0x2d, 0xe9, 0xf9, 0x47, 0x80, 0x46, 0x87, 0x4d, 0x60, 0xa0, 0x82, 0xb0, + 0x55, 0xf8, 0x28, 0x40, 0x50, 0xf8, 0x28, 0x60, 0xd4, 0xe9, 0x04, 0x01, + 0x00, 0xf0, 0x3d, 0xfd, 0x00, 0x22, 0x91, 0x42, 0x01, 0xd8, 0xb0, 0x42, + 0x03, 0xd3, 0x01, 0x27, 0x84, 0xf8, 0x84, 0x70, 0x01, 0xe0, 0x84, 0xf8, + 0x84, 0x20, 0x04, 0xf1, 0x38, 0x00, 0x86, 0x64, 0xc4, 0xe9, 0x00, 0x22, + 0x01, 0x78, 0x4e, 0x1e, 0x86, 0x70, 0x9d, 0xf8, 0x08, 0x00, 0x00, 0xf0, + 0xb4, 0xfe, 0x82, 0x46, 0x55, 0xf8, 0x28, 0x00, 0x00, 0x90, 0x00, 0x23, + 0x9d, 0xf8, 0x08, 0x00, 0x00, 0x9e, 0x55, 0xf8, 0x20, 0x10, 0xd1, 0xf8, + 0x34, 0x90, 0xd6, 0xe9, 0x04, 0x47, 0x20, 0x46, 0x39, 0x46, 0x4a, 0x46, + 0xff, 0xf7, 0xd0, 0xf9, 0x06, 0x46, 0x20, 0x46, 0x39, 0x46, 0x4a, 0x46, + 0x00, 0xf0, 0x0f, 0xfd, 0x14, 0x46, 0x4f, 0xea, 0x4a, 0x02, 0x4f, 0xea, + 0xda, 0x73, 0xa2, 0xfb, 0x04, 0x01, 0x03, 0xfb, 0x04, 0x11, 0x4a, 0x46, + 0x00, 0xf0, 0x03, 0xfd, 0x00, 0x27, 0x40, 0x1c, 0x61, 0xf1, 0xff, 0x31, + 0x49, 0x08, 0x4f, 0xea, 0x30, 0x00, 0x00, 0x99, 0x50, 0x45, 0x04, 0xbf, + 0x00, 0x20, 0x76, 0x1c, 0x81, 0xf8, 0x3d, 0x00, 0x02, 0x0a, 0x55, 0xf8, + 0x28, 0x10, 0x81, 0xf8, 0x3e, 0x20, 0x02, 0x0c, 0x55, 0xf8, 0x28, 0x10, + 0x81, 0xf8, 0x3f, 0x20, 0x00, 0x0e, 0x55, 0xf8, 0x28, 0x10, 0xdf, 0xf8, + 0x90, 0x2c, 0x81, 0xf8, 0x40, 0x00, 0x30, 0x04, 0x55, 0xf8, 0x28, 0x10, + 0x00, 0x0e, 0x00, 0xf0, 0x07, 0x00, 0x81, 0xf8, 0x42, 0x00, 0x00, 0x23, + 0x55, 0xf8, 0x28, 0x00, 0x80, 0xf8, 0x41, 0x60, 0x00, 0x24, 0x55, 0xf8, + 0x28, 0x10, 0xd1, 0xe9, 0x04, 0x01, 0xff, 0xf7, 0x8b, 0xf9, 0x06, 0x46, + 0x9d, 0xf8, 0x08, 0x00, 0x00, 0x28, 0x18, 0xbf, 0x01, 0x28, 0x89, 0x46, + 0x0e, 0xd0, 0x02, 0x28, 0x08, 0xbf, 0x6c, 0x69, 0x0b, 0xd0, 0x03, 0x28, + 0x08, 0xbf, 0xac, 0x69, 0x07, 0xd0, 0x03, 0x22, 0x4b, 0xf2, 0x03, 0x71, + 0x01, 0x20, 0x08, 0xf0, 0xff, 0xfa, 0x01, 0xe0, 0x2c, 0x69, 0x09, 0x27, + 0xa4, 0x46, 0xbe, 0x46, 0x00, 0x24, 0x00, 0x21, 0x00, 0x23, 0x00, 0xe0, + 0x64, 0x1c, 0x74, 0x45, 0x0c, 0xeb, 0xc4, 0x07, 0x0a, 0xd0, 0x3a, 0x88, + 0x99, 0x45, 0x01, 0xd8, 0x96, 0x42, 0xf5, 0xd3, 0x78, 0x88, 0x49, 0x45, + 0xf2, 0xd3, 0x01, 0xd8, 0xb0, 0x42, 0xef, 0xd3, 0x55, 0xf8, 0x28, 0x00, + 0x3a, 0x79, 0x80, 0xf8, 0x44, 0x20, 0x55, 0xf8, 0x28, 0x00, 0x79, 0x79, + 0x80, 0xf8, 0x43, 0x10, 0x55, 0xf8, 0x28, 0x00, 0xb9, 0x79, 0x80, 0xf8, + 0x47, 0x10, 0x55, 0xf8, 0x28, 0x00, 0xf9, 0x79, 0x80, 0xf8, 0x45, 0x10, + 0x00, 0x20, 0x04, 0xb0, 0xbd, 0xe8, 0xf0, 0x87, 0x9a, 0xab, 0x8b, 0x31, + 0xd0, 0x59, 0x99, 0x00, 0xd0, 0x59, 0x99, 0x00, 0xd0, 0x59, 0x99, 0x00, + 0xe0, 0x79, 0xaf, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0x07, 0x46, 0x21, 0x48, + 0x50, 0xf8, 0x27, 0x60, 0x0c, 0x46, 0x00, 0x23, 0x00, 0x22, 0x42, 0xf2, + 0x10, 0x71, 0x20, 0x46, 0x05, 0xf0, 0x23, 0xf8, 0x06, 0xf1, 0xa7, 0x08, + 0x01, 0x23, 0x0f, 0x22, 0x00, 0x21, 0xff, 0xf7, 0xeb, 0xfc, 0x0f, 0x23, + 0xf0, 0x22, 0x04, 0x21, 0xff, 0xf7, 0xe6, 0xfc, 0x14, 0x48, 0x50, 0xf8, + 0x27, 0x10, 0x91, 0xf8, 0x4b, 0x30, 0x06, 0xf1, 0x87, 0x08, 0x04, 0x22, + 0x02, 0x21, 0xff, 0xf7, 0xdb, 0xfc, 0x00, 0xf0, 0x34, 0xf8, 0xff, 0xf7, + 0xd7, 0xfc, 0xa6, 0x36, 0x00, 0xf0, 0x29, 0xf8, 0x00, 0xf0, 0x1e, 0xf8, + 0x00, 0xf0, 0x22, 0xf8, 0x00, 0x25, 0x30, 0x78, 0xc0, 0xf3, 0x00, 0x10, + 0x30, 0xb1, 0x20, 0x46, 0x05, 0xf0, 0xcd, 0xf8, 0x00, 0x28, 0xf6, 0xd0, + 0x4b, 0xf2, 0x08, 0x75, 0x20, 0x46, 0x05, 0xf0, 0x53, 0xf8, 0x28, 0x46, + 0xbd, 0xe8, 0xf0, 0x81, 0xb4, 0x76, 0x02, 0x20, 0x20, 0x76, 0x02, 0x20, + 0x30, 0x9c, 0x04, 0x01, 0x90, 0xd0, 0x03, 0x00, 0x74, 0x91, 0x04, 0x01, + 0x01, 0x23, 0x02, 0x22, 0x01, 0x21, 0x70, 0x47, 0xf0, 0x22, 0x04, 0x21, + 0x30, 0x46, 0xff, 0xf7, 0x6e, 0xb9, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, + 0x30, 0x46, 0xff, 0xf7, 0x68, 0xb9, 0x00, 0x23, 0x08, 0x22, 0x03, 0x21, + 0x70, 0x47, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, + 0x81, 0x46, 0xdf, 0xf8, 0x10, 0x0c, 0x92, 0xb0, 0xcb, 0x46, 0x50, 0xf8, + 0x2b, 0x50, 0xdf, 0xf8, 0xcc, 0x87, 0x02, 0x20, 0x04, 0xf0, 0xb7, 0xff, + 0x00, 0x23, 0xc0, 0x22, 0x06, 0x21, 0x05, 0xf1, 0x0b, 0x00, 0xff, 0xf7, + 0x4c, 0xf9, 0x05, 0xf1, 0x88, 0x01, 0x10, 0x91, 0x05, 0xf1, 0x0a, 0x00, + 0x0f, 0x90, 0x00, 0x24, 0x58, 0xf8, 0x2b, 0x00, 0xc1, 0x6c, 0x01, 0x29, + 0x40, 0xf0, 0x06, 0x81, 0x00, 0x95, 0x06, 0xa8, 0x24, 0x21, 0xfe, 0xf7, + 0x49, 0xfb, 0x00, 0x98, 0x11, 0x30, 0x05, 0x90, 0xff, 0xf7, 0xcd, 0xff, + 0xff, 0xf7, 0x33, 0xf9, 0x00, 0x98, 0x00, 0x23, 0x04, 0x22, 0x02, 0x21, + 0x87, 0x30, 0xff, 0xf7, 0x2c, 0xf9, 0x00, 0xf0, 0x40, 0xfa, 0x00, 0xf0, + 0xfb, 0xf9, 0x00, 0xf0, 0x42, 0xfa, 0x00, 0x98, 0x14, 0x30, 0x04, 0x90, + 0x00, 0xf0, 0x2c, 0xfa, 0x00, 0x98, 0x16, 0x30, 0x03, 0x90, 0x00, 0xf0, + 0x27, 0xfa, 0x58, 0xf8, 0x2b, 0x00, 0x90, 0xf8, 0x8f, 0x00, 0x01, 0x00, + 0x00, 0xee, 0x10, 0x1a, 0xb8, 0xee, 0x40, 0x0a, 0xf7, 0xee, 0x00, 0x0a, + 0x70, 0xee, 0x20, 0x0a, 0x9f, 0xed, 0x20, 0x1a, 0x20, 0xee, 0x81, 0x8a, + 0x04, 0xd1, 0x0f, 0x20, 0x04, 0x21, 0xdf, 0xed, 0x1e, 0x8a, 0x16, 0xe0, + 0x01, 0x28, 0x04, 0xd1, 0x1f, 0x20, 0x02, 0x21, 0xdf, 0xed, 0x1b, 0x8a, + 0x0f, 0xe0, 0x02, 0x28, 0x07, 0xd1, 0x2f, 0x20, 0xdf, 0xed, 0x19, 0x8a, + 0x8d, 0xf8, 0x18, 0x00, 0x8d, 0xf8, 0x19, 0x40, 0x09, 0xe0, 0x03, 0x28, + 0x0b, 0xd1, 0x3e, 0x20, 0x04, 0x21, 0xdf, 0xed, 0x15, 0x8a, 0x8d, 0xf8, + 0x18, 0x00, 0x8d, 0xf8, 0x19, 0x10, 0x8d, 0xf8, 0x1c, 0x40, 0x01, 0x23, + 0x2c, 0xe0, 0x04, 0x28, 0x06, 0xd1, 0x30, 0x20, 0xdf, 0xed, 0xd5, 0x8a, + 0x8d, 0xf8, 0x18, 0x00, 0x0c, 0x21, 0x07, 0xe0, 0x05, 0x28, 0x17, 0xd1, + 0x3f, 0x20, 0xdf, 0xed, 0xd2, 0x8a, 0x8d, 0xf8, 0x18, 0x00, 0x10, 0x21, + 0x8d, 0xf8, 0x19, 0x10, 0x8d, 0xf8, 0x1c, 0x40, 0x00, 0x23, 0x00, 0x26, + 0x15, 0xe0, 0x00, 0xbf, 0x52, 0x49, 0x1d, 0x39, 0x0f, 0x30, 0x8c, 0x2d, + 0x0f, 0x30, 0x0c, 0x2e, 0x17, 0x48, 0x52, 0x2e, 0x0f, 0x30, 0x8c, 0x2e, + 0x3f, 0x20, 0xdf, 0xed, 0xc7, 0x8a, 0x8d, 0xf8, 0x18, 0x00, 0x8d, 0xf8, + 0x19, 0x00, 0x8d, 0xf8, 0x1c, 0x00, 0x00, 0x23, 0x1e, 0x46, 0x00, 0x98, + 0x12, 0x30, 0x02, 0x90, 0x00, 0xf0, 0xbf, 0xf9, 0x00, 0x98, 0x13, 0x30, + 0x01, 0x90, 0x33, 0x46, 0x00, 0xf0, 0xb9, 0xf9, 0x06, 0xa9, 0x48, 0x46, + 0xff, 0xf7, 0x03, 0xfd, 0x9f, 0xed, 0xbb, 0x0a, 0x28, 0xee, 0x00, 0x0a, + 0x58, 0xf8, 0x2b, 0x00, 0x88, 0xee, 0x80, 0x0a, 0xf2, 0xee, 0x0c, 0x0a, + 0xc0, 0xee, 0x20, 0x0a, 0x90, 0xed, 0x0d, 0x0a, 0xb8, 0xee, 0x40, 0x0a, + 0x20, 0xee, 0x80, 0x0a, 0xec, 0xf7, 0x20, 0xff, 0x00, 0xf0, 0x6d, 0xf9, + 0x88, 0xee, 0x00, 0x0a, 0x09, 0xf0, 0x1a, 0xfe, 0xf0, 0xee, 0x40, 0x0a, + 0xb0, 0xee, 0x00, 0x0a, 0x03, 0xf0, 0xa8, 0xfd, 0xdf, 0xed, 0xac, 0x0a, + 0x20, 0xee, 0x20, 0x0a, 0xec, 0xf7, 0x0e, 0xff, 0x00, 0xf0, 0x5b, 0xf9, + 0x88, 0xee, 0x00, 0x0a, 0x00, 0x9e, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, + 0x10, 0x0a, 0x0d, 0x36, 0xc3, 0xb2, 0x70, 0x22, 0xff, 0xf7, 0x03, 0xff, + 0xb9, 0xf1, 0x03, 0x0f, 0x23, 0xd0, 0x00, 0x23, 0x00, 0x22, 0xdf, 0xf8, + 0x38, 0x1a, 0x02, 0x20, 0x04, 0xf0, 0xd9, 0xfe, 0xff, 0xf7, 0xf2, 0xfe, + 0xff, 0xf7, 0xf6, 0xfe, 0xff, 0xf7, 0xf7, 0xfe, 0x4b, 0xf2, 0x07, 0x7a, + 0x00, 0xf0, 0x80, 0xf9, 0x00, 0x28, 0x77, 0xd1, 0x00, 0xf0, 0x7c, 0xf9, + 0x00, 0x28, 0xf7, 0xd1, 0x4c, 0xb9, 0x00, 0x9f, 0x0e, 0x37, 0x00, 0xf0, + 0x49, 0xf9, 0x01, 0x28, 0x73, 0xd1, 0x00, 0xf0, 0x45, 0xf9, 0x01, 0x28, + 0xf7, 0xd1, 0x00, 0xf0, 0x2e, 0xf9, 0x04, 0x98, 0x00, 0xf0, 0x80, 0xf9, + 0x03, 0x98, 0x00, 0xf0, 0x7d, 0xf9, 0x02, 0x98, 0x00, 0xf0, 0x7a, 0xf9, + 0x01, 0x98, 0x00, 0xf0, 0x77, 0xf9, 0x05, 0x98, 0x00, 0xf0, 0x25, 0xf9, + 0xff, 0xf7, 0x3d, 0xf8, 0xff, 0xf7, 0x13, 0xfb, 0xff, 0xf7, 0xc8, 0xfe, + 0x00, 0xf0, 0x4d, 0xf9, 0x00, 0xf0, 0x08, 0xf9, 0x00, 0xf0, 0x4f, 0xf9, + 0x7c, 0xb9, 0x58, 0xf8, 0x2b, 0x00, 0x10, 0xf8, 0x8f, 0x1f, 0x41, 0x75, + 0x58, 0xf8, 0x2b, 0x00, 0x00, 0xf1, 0x88, 0x01, 0x48, 0x46, 0xff, 0xf7, + 0x80, 0xfc, 0x48, 0x46, 0xec, 0xf7, 0x0e, 0xff, 0x04, 0x46, 0x00, 0x2c, + 0x40, 0xf0, 0xa0, 0x80, 0x00, 0x23, 0x00, 0xf0, 0x1d, 0xf9, 0xff, 0xf7, + 0xf2, 0xfa, 0xa8, 0x1c, 0xff, 0xf7, 0x17, 0xf8, 0x00, 0xf0, 0x40, 0xf9, + 0x05, 0xf1, 0x65, 0x00, 0xff, 0xf7, 0x11, 0xf8, 0x01, 0x22, 0x00, 0x21, + 0x05, 0xf1, 0x20, 0x00, 0xff, 0xf7, 0x06, 0xf8, 0x8d, 0xf8, 0x00, 0x00, + 0x00, 0xf0, 0x32, 0xf9, 0x00, 0xf0, 0x0c, 0xf9, 0xff, 0xf7, 0xdb, 0xfa, + 0x00, 0xf0, 0xfe, 0xf8, 0x05, 0xf1, 0x17, 0x06, 0xff, 0xf7, 0x95, 0xfe, + 0xff, 0xf7, 0x8a, 0xfe, 0x05, 0xf1, 0x1e, 0x07, 0x00, 0xf0, 0x07, 0xf9, + 0xff, 0xf7, 0x5d, 0xfd, 0x00, 0xf0, 0x17, 0xf9, 0xff, 0xf7, 0x83, 0xfe, + 0x00, 0xf0, 0x0e, 0xf9, 0xb8, 0xb1, 0x00, 0xf0, 0xcf, 0xf8, 0x00, 0x28, + 0xf8, 0xd0, 0x4b, 0xf2, 0x05, 0x74, 0x14, 0xe0, 0x00, 0xf0, 0xc8, 0xf8, + 0x00, 0x28, 0x3f, 0xf4, 0x7f, 0xaf, 0x54, 0x46, 0x84, 0xe7, 0x00, 0xf0, + 0xc1, 0xf8, 0x00, 0x28, 0x83, 0xd0, 0x54, 0x46, 0x89, 0xe7, 0x00, 0xf0, + 0xbb, 0xf8, 0x00, 0x28, 0xeb, 0xd1, 0x00, 0xf0, 0xc2, 0xf8, 0x00, 0x28, + 0xf7, 0xd1, 0x00, 0xf0, 0xb0, 0xf8, 0x9d, 0xf8, 0x00, 0x30, 0x01, 0x22, + 0x00, 0x21, 0x00, 0xf0, 0xd1, 0xf8, 0x00, 0xf0, 0xc0, 0xf8, 0x01, 0x22, + 0x00, 0x21, 0x05, 0xf1, 0x1d, 0x00, 0xfe, 0xf7, 0xbd, 0xff, 0x03, 0x46, + 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, 0xba, 0xf8, 0xff, 0x22, 0x00, 0x21, + 0x05, 0xf1, 0x1c, 0x00, 0xfe, 0xf7, 0xb2, 0xff, 0x03, 0x46, 0xff, 0x22, + 0x00, 0x21, 0x05, 0xf1, 0x1c, 0x00, 0xfe, 0xf7, 0xb0, 0xff, 0x00, 0xf0, + 0xdd, 0xf8, 0xff, 0xf7, 0x35, 0xfe, 0x00, 0xf0, 0xa7, 0xf8, 0x00, 0xf0, + 0x8e, 0xf8, 0xff, 0xf7, 0x35, 0xfe, 0x00, 0x23, 0x00, 0xf0, 0xb4, 0xf8, + 0xff, 0xf7, 0x09, 0xfd, 0x00, 0xf0, 0xc3, 0xf8, 0xff, 0xf7, 0x2f, 0xfe, + 0x00, 0xf0, 0xba, 0xf8, 0x30, 0xb1, 0x00, 0xf0, 0x7b, 0xf8, 0x00, 0x28, + 0xf8, 0xd0, 0x4b, 0xf2, 0x05, 0x74, 0x08, 0xe0, 0x3c, 0xb9, 0x00, 0xf0, + 0x7e, 0xf8, 0x20, 0xb1, 0x00, 0xf0, 0x70, 0xf8, 0x00, 0x28, 0xf8, 0xd0, + 0xf3, 0xe7, 0x00, 0xf0, 0x72, 0xf8, 0xff, 0xf7, 0x15, 0xfe, 0x00, 0xf0, + 0x7c, 0xf8, 0x00, 0xf0, 0x62, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0x80, 0xf8, + 0xe4, 0xbb, 0x58, 0xf8, 0x2b, 0x00, 0xd0, 0xf8, 0xa8, 0x10, 0x0a, 0x20, + 0xb1, 0xfb, 0xf0, 0xf1, 0x00, 0x23, 0x00, 0x22, 0x02, 0x20, 0x04, 0xf0, + 0xe0, 0xfd, 0x20, 0x22, 0x05, 0x21, 0x05, 0xf1, 0x26, 0x00, 0xfe, 0xf7, + 0x67, 0xff, 0x01, 0x28, 0x05, 0xd0, 0x00, 0xf0, 0x4b, 0xf8, 0x00, 0x28, + 0xf3, 0xd0, 0x4b, 0xf2, 0x01, 0x74, 0x00, 0xf0, 0x42, 0xf8, 0xfc, 0xb9, + 0x5f, 0xea, 0x09, 0x00, 0x18, 0xbf, 0x01, 0x28, 0x1a, 0xd1, 0x02, 0x21, + 0xff, 0xf7, 0x96, 0xfd, 0x00, 0x28, 0x02, 0xbf, 0x58, 0xf8, 0x2b, 0x00, + 0x90, 0xf8, 0x50, 0x10, 0x01, 0x29, 0x0b, 0xd1, 0x48, 0x46, 0x0a, 0xf0, + 0x66, 0xfb, 0x00, 0x21, 0x48, 0x46, 0x0a, 0xf0, 0x25, 0xfb, 0x04, 0x46, + 0x48, 0x46, 0x0a, 0xf0, 0x80, 0xfb, 0x03, 0xe0, 0x48, 0x46, 0x0a, 0xf0, + 0xd7, 0xfc, 0x04, 0x46, 0x02, 0x20, 0x04, 0xf0, 0x20, 0xfe, 0x12, 0xb0, + 0x20, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, 0x00, 0xbf, + 0x13, 0x3c, 0xaf, 0x2e, 0x17, 0x48, 0xd2, 0x2e, 0x7e, 0x56, 0xf2, 0x2e, + 0x6f, 0x12, 0x03, 0x3b, 0x00, 0x00, 0x80, 0x3d, 0x58, 0xf8, 0x2b, 0x00, + 0x90, 0xf8, 0x90, 0x30, 0x10, 0x98, 0x7f, 0x22, 0x70, 0x47, 0xb0, 0xee, + 0x40, 0x8a, 0xb0, 0xee, 0x00, 0x0a, 0xec, 0xf7, 0xab, 0xbd, 0x02, 0x20, + 0x04, 0xf0, 0xec, 0xbd, 0x02, 0x20, 0x04, 0xf0, 0x5c, 0xbe, 0x01, 0x23, + 0x08, 0x22, 0x03, 0x21, 0x70, 0x47, 0x01, 0x23, 0x80, 0x22, 0x07, 0x21, + 0x70, 0x47, 0x02, 0x22, 0x01, 0x21, 0x30, 0x46, 0xfe, 0xf7, 0x08, 0xbf, + 0x80, 0x22, 0x07, 0x21, 0x38, 0x46, 0xfe, 0xf7, 0x03, 0xbf, 0x3f, 0x22, + 0x00, 0x21, 0x38, 0x46, 0xfe, 0xf7, 0xfe, 0xbe, 0x05, 0xf1, 0x1d, 0x00, + 0xfe, 0xf7, 0xff, 0xbe, 0x40, 0x22, 0x06, 0x21, 0x05, 0xf1, 0x8a, 0x00, + 0xfe, 0xf7, 0xf9, 0xbe, 0x05, 0xf1, 0x20, 0x00, 0xfe, 0xf7, 0xf5, 0xbe, + 0x01, 0x23, 0x40, 0x22, 0x06, 0x21, 0xfe, 0xf7, 0xf0, 0xbe, 0x01, 0x23, + 0x40, 0x22, 0x06, 0x21, 0x38, 0x46, 0xfe, 0xf7, 0xea, 0xbe, 0x58, 0xf8, + 0x2b, 0x00, 0x90, 0xf8, 0x8f, 0x30, 0x0f, 0x98, 0x1f, 0x22, 0x00, 0x21, + 0xfe, 0xf7, 0xe1, 0xbe, 0x01, 0x22, 0x00, 0x21, 0x30, 0x46, 0xfe, 0xf7, + 0xd7, 0xbe, 0x00, 0x23, 0x00, 0x22, 0x42, 0xf2, 0x10, 0x71, 0x02, 0x20, + 0x04, 0xf0, 0x43, 0xbd, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x70, 0x47, + 0x00, 0x23, 0x80, 0x22, 0x07, 0x21, 0x30, 0x46, 0xfe, 0xf7, 0xcb, 0xbe, + 0x00, 0x23, 0x40, 0x22, 0x06, 0x21, 0xfe, 0xf7, 0xc6, 0xbe, 0xf0, 0xb5, + 0x00, 0x23, 0x01, 0x2a, 0x27, 0xd8, 0xdf, 0xf8, 0xe0, 0x66, 0x37, 0x68, + 0x17, 0x44, 0x7a, 0x78, 0x82, 0xb9, 0xdf, 0xf8, 0xd8, 0x46, 0x6f, 0xf0, + 0x01, 0x05, 0x00, 0x19, 0x69, 0x41, 0x01, 0x27, 0xb9, 0x42, 0xdf, 0xf8, + 0xcc, 0x66, 0x18, 0xd3, 0x01, 0xd8, 0xb0, 0x42, 0x15, 0xd3, 0x4b, 0xf2, + 0x02, 0x73, 0x12, 0xe0, 0xdf, 0xf8, 0xbc, 0x46, 0x4f, 0xf0, 0xff, 0x35, + 0x00, 0x19, 0x69, 0x41, 0x01, 0x27, 0xb9, 0x42, 0xdf, 0xf8, 0xb0, 0x66, + 0x07, 0xd3, 0x01, 0xd8, 0xb0, 0x42, 0x04, 0xd3, 0x4b, 0xf2, 0x0e, 0x73, + 0x01, 0xe0, 0x4b, 0xf2, 0x03, 0x73, 0x18, 0x46, 0xf0, 0xbd, 0x00, 0x00, + 0xfc, 0x64, 0x03, 0x20, 0x19, 0x00, 0x00, 0x47, 0x01, 0x65, 0xcd, 0x1d, + 0x17, 0x00, 0x00, 0x47, 0x2d, 0xe9, 0xf1, 0x4f, 0x84, 0xb0, 0xdf, 0xf8, + 0x68, 0x16, 0xdf, 0xf8, 0x2c, 0x92, 0x00, 0x90, 0x14, 0x46, 0x51, 0xf8, + 0x20, 0x10, 0x02, 0x91, 0x01, 0x91, 0x1d, 0x46, 0x9d, 0xf8, 0x38, 0x20, + 0x20, 0x46, 0x29, 0x46, 0x00, 0xf0, 0x35, 0xf9, 0x82, 0x46, 0x9d, 0xf8, + 0x10, 0x00, 0x8b, 0x46, 0x00, 0xf0, 0xb8, 0xfe, 0x00, 0x27, 0x00, 0x26, + 0x01, 0x28, 0xb0, 0x46, 0x40, 0xf0, 0xbc, 0x80, 0x00, 0xf0, 0xfc, 0xf8, + 0x06, 0x00, 0x40, 0xf0, 0xf2, 0x80, 0x00, 0x98, 0x59, 0xf8, 0x20, 0x00, + 0x01, 0x23, 0xc0, 0xe9, 0x04, 0x45, 0x9d, 0xf8, 0x38, 0x10, 0x80, 0xf8, + 0x38, 0x10, 0x00, 0x98, 0x59, 0xf8, 0x20, 0x00, 0xc0, 0xe9, 0x00, 0x87, + 0x10, 0xf8, 0x38, 0x1f, 0x4a, 0x1e, 0x82, 0x70, 0x10, 0x22, 0x01, 0x9c, + 0x6b, 0x34, 0x04, 0x21, 0xff, 0xf7, 0x4f, 0xfa, 0x00, 0x99, 0x59, 0xf8, + 0x21, 0x20, 0x01, 0x9d, 0x01, 0x98, 0x92, 0xf8, 0x3a, 0x10, 0x68, 0x35, + 0x6c, 0x30, 0x19, 0xb9, 0x00, 0xf0, 0xd9, 0xf8, 0x00, 0x23, 0x06, 0xe0, + 0x00, 0xf0, 0xe6, 0xf8, 0x00, 0x98, 0x59, 0xf8, 0x20, 0x10, 0x91, 0xf8, + 0x3a, 0x30, 0x3f, 0x22, 0x00, 0xf0, 0xf8, 0xf8, 0x00, 0x9a, 0x59, 0xf8, + 0x22, 0x50, 0x00, 0xf0, 0xea, 0xf8, 0xa8, 0x60, 0xc5, 0xe9, 0x00, 0xab, + 0xdd, 0xf8, 0x08, 0x90, 0x09, 0xf1, 0x6e, 0x05, 0x00, 0xf0, 0xcc, 0xf8, + 0x00, 0xf0, 0xe9, 0xf8, 0x00, 0xf0, 0xc8, 0xf8, 0xff, 0xf7, 0x23, 0xfa, + 0x00, 0xf0, 0xd3, 0xf8, 0x09, 0xf1, 0x6d, 0x09, 0x00, 0x23, 0x20, 0x22, + 0x05, 0x21, 0xff, 0xf7, 0x53, 0xf9, 0x00, 0xf0, 0xc4, 0xf8, 0x01, 0x23, + 0x10, 0x22, 0x04, 0x21, 0xff, 0xf7, 0x13, 0xfa, 0x0f, 0x23, 0xff, 0x22, + 0x00, 0xf0, 0xd0, 0xf8, 0xff, 0xf7, 0x0a, 0xfa, 0x01, 0x23, 0x20, 0x22, + 0x05, 0x21, 0xff, 0xf7, 0x41, 0xf9, 0xff, 0xf7, 0xf0, 0xfe, 0xff, 0xf7, + 0x3d, 0xf9, 0xfe, 0xf7, 0x18, 0xfe, 0x9d, 0xf8, 0x10, 0x40, 0xdf, 0xf8, + 0x70, 0x95, 0x80, 0x46, 0xf8, 0xb2, 0x00, 0xf0, 0x4a, 0xfc, 0xa0, 0x42, + 0x15, 0xd1, 0x00, 0xf0, 0x59, 0xf9, 0x12, 0xd5, 0xf8, 0xb2, 0x59, 0xf8, + 0x20, 0x00, 0x00, 0xf1, 0x70, 0x0a, 0x00, 0x23, 0x00, 0xf0, 0x8b, 0xf8, + 0x01, 0x23, 0x00, 0xf0, 0x88, 0xf8, 0xff, 0xf7, 0x80, 0xfc, 0x00, 0xf0, + 0x86, 0xf8, 0xff, 0xf7, 0xca, 0xfe, 0x00, 0xf0, 0x82, 0xf8, 0x00, 0xf0, + 0x3f, 0xf9, 0xe1, 0xd1, 0xfe, 0xf7, 0xeb, 0xfd, 0x80, 0x46, 0x00, 0x27, + 0xdf, 0xf8, 0x28, 0x95, 0xf8, 0xb2, 0x00, 0xf0, 0x0f, 0xfc, 0xa0, 0x42, + 0x19, 0xd1, 0x00, 0xf0, 0x35, 0xf9, 0x16, 0xd5, 0xf8, 0xb2, 0x59, 0xf8, + 0x20, 0xa0, 0x0a, 0xf1, 0x41, 0x0b, 0xff, 0xf7, 0xf5, 0xfe, 0x00, 0xf0, + 0x63, 0xf8, 0xff, 0xf7, 0xf8, 0xf8, 0x00, 0xf0, 0x5f, 0xf8, 0x0a, 0xf1, + 0x03, 0x0a, 0xff, 0xf7, 0xf2, 0xf8, 0x00, 0xf0, 0x5e, 0xf8, 0xff, 0xf7, + 0xe7, 0xfe, 0x00, 0xf0, 0x5a, 0xf8, 0x00, 0xf0, 0x17, 0xf9, 0xdd, 0xd1, + 0x01, 0x23, 0x10, 0x22, 0x04, 0x21, 0x00, 0xf0, 0x74, 0xf8, 0x3a, 0xe0, + 0x00, 0x98, 0x59, 0xf8, 0x20, 0x10, 0x01, 0x91, 0x91, 0xf8, 0x85, 0x00, + 0x00, 0x28, 0x30, 0xd0, 0x00, 0xf0, 0x38, 0xf8, 0x06, 0x00, 0x22, 0xd1, + 0x01, 0x99, 0x0f, 0x98, 0xc1, 0xe9, 0x04, 0x45, 0x01, 0x99, 0x9d, 0xf8, + 0x38, 0x20, 0x81, 0xf8, 0x38, 0x20, 0x01, 0x28, 0x05, 0xd1, 0x9d, 0xf8, + 0x10, 0x00, 0xff, 0xf7, 0x05, 0xfb, 0x06, 0x00, 0x0b, 0xd1, 0x00, 0x98, + 0x59, 0xf8, 0x20, 0x10, 0x9d, 0xf8, 0x10, 0x00, 0x02, 0xf0, 0x1e, 0xff, + 0x9d, 0xf8, 0x10, 0x00, 0xff, 0xf7, 0x14, 0xfa, 0x06, 0x46, 0x86, 0xb9, + 0x9d, 0xf8, 0x10, 0x00, 0xff, 0xf7, 0x20, 0xfc, 0x06, 0x46, 0x56, 0xb9, + 0x00, 0x99, 0x59, 0xf8, 0x21, 0x40, 0x00, 0xf0, 0x34, 0xf8, 0xa0, 0x60, + 0xc4, 0xe9, 0x00, 0xab, 0x01, 0xe0, 0xc1, 0xe9, 0x00, 0x87, 0x30, 0x46, + 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0x00, 0x20, 0x76, 0x02, 0x20, + 0x9d, 0xf8, 0x10, 0x20, 0x20, 0x46, 0x29, 0x46, 0xa3, 0xe6, 0x01, 0x23, + 0x02, 0x22, 0x01, 0x21, 0xfe, 0xf7, 0x65, 0xbd, 0x58, 0x46, 0xfe, 0xf7, + 0x62, 0xbd, 0x04, 0x22, 0x02, 0x21, 0x50, 0x46, 0xfe, 0xf7, 0x5d, 0xbd, + 0x00, 0x23, 0x10, 0x22, 0x04, 0x21, 0x70, 0x47, 0x00, 0x23, 0x02, 0x22, + 0x01, 0x21, 0xfe, 0xf7, 0x54, 0xbd, 0x00, 0x23, 0x80, 0x22, 0x07, 0x21, + 0x48, 0x46, 0xfe, 0xf7, 0x4e, 0xbd, 0x00, 0x23, 0x20, 0x22, 0x05, 0x21, + 0x20, 0x46, 0xfe, 0xf7, 0x48, 0xbd, 0x50, 0x46, 0x59, 0x46, 0x4f, 0xf4, + 0x7a, 0x72, 0x00, 0x23, 0xfe, 0xf7, 0xb8, 0xbc, 0x00, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x28, 0x46, 0xfe, 0xf7, 0x3b, 0xbd, 0x80, 0xb5, 0x00, 0xf0, + 0x71, 0xfb, 0x02, 0xe0, 0x80, 0xb5, 0x00, 0xf0, 0x84, 0xfb, 0xdf, 0xf8, + 0xe0, 0x13, 0x51, 0xf8, 0x20, 0x00, 0x80, 0x68, 0x02, 0xbd, 0x00, 0x00, + 0x60, 0x7f, 0x04, 0x01, 0x00, 0xee, 0x10, 0x1a, 0xdf, 0xf8, 0xc8, 0x13, + 0x51, 0xf8, 0x20, 0x00, 0x00, 0xee, 0x90, 0x2a, 0xb8, 0xee, 0x40, 0x0a, + 0xf8, 0xee, 0x60, 0x0a, 0x80, 0xed, 0x15, 0x0a, 0xc0, 0xed, 0x16, 0x0a, + 0x70, 0x47, 0x30, 0xb5, 0x04, 0x46, 0x8c, 0x42, 0xdf, 0xf8, 0xa8, 0x03, + 0x08, 0xbf, 0x03, 0x21, 0x09, 0xd0, 0xb4, 0xeb, 0x51, 0x0f, 0x03, 0xd1, + 0x03, 0x21, 0x18, 0x30, 0x52, 0x08, 0x02, 0xe0, 0x01, 0x21, 0x30, 0x30, + 0x92, 0x08, 0x1a, 0x60, 0x00, 0x22, 0x1c, 0x68, 0x01, 0xe0, 0x08, 0x30, + 0x52, 0x1c, 0x8a, 0x42, 0x02, 0xd0, 0x05, 0x68, 0xac, 0x42, 0xf8, 0xd3, + 0x30, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, 0x06, 0x46, 0x89, 0x46, 0xfe, 0xf7, + 0x04, 0xfd, 0x80, 0x46, 0x00, 0x27, 0x34, 0x46, 0xdf, 0xf8, 0x5c, 0x53, + 0x00, 0xf0, 0x52, 0xf8, 0x1b, 0xd5, 0xf8, 0xb2, 0x00, 0xf0, 0x24, 0xfb, + 0xb0, 0x42, 0x16, 0xd1, 0x55, 0xf8, 0x24, 0x10, 0x48, 0x6a, 0x90, 0xb1, + 0xf8, 0xb2, 0xff, 0xf7, 0xa7, 0xff, 0x01, 0x46, 0xf8, 0xb2, 0x03, 0xf0, + 0x15, 0xfe, 0x55, 0xf8, 0x24, 0x10, 0x49, 0x6a, 0x6b, 0x46, 0x4a, 0x46, + 0xff, 0xf7, 0xbd, 0xff, 0x42, 0x79, 0x01, 0x79, 0xf8, 0xb2, 0x03, 0xf0, + 0xc7, 0xfd, 0x00, 0xf0, 0x2f, 0xf8, 0xdd, 0xd1, 0xfe, 0xf7, 0xe3, 0xfc, + 0x80, 0x46, 0x00, 0x27, 0x00, 0xf0, 0x2c, 0xf8, 0x1a, 0xd5, 0xf8, 0xb2, + 0x00, 0xf0, 0x15, 0xfb, 0xb0, 0x42, 0x15, 0xd1, 0x55, 0xf8, 0x24, 0x10, + 0x08, 0x6a, 0x88, 0xb1, 0xf8, 0xb2, 0xff, 0xf7, 0x85, 0xff, 0x01, 0x46, + 0xf8, 0xb2, 0x02, 0xf0, 0x4c, 0xfd, 0x55, 0xf8, 0x24, 0x10, 0x09, 0x6a, + 0x6b, 0x46, 0x4a, 0x46, 0xff, 0xf7, 0x97, 0xff, 0x81, 0x79, 0xf8, 0xb2, + 0x02, 0xf0, 0x10, 0xfb, 0x00, 0xf0, 0x0a, 0xf8, 0xde, 0xd1, 0x4f, 0xf4, + 0x7a, 0x71, 0x30, 0x46, 0xa1, 0xfb, 0x09, 0x23, 0x00, 0xf0, 0x0a, 0xf8, + 0xbd, 0xe8, 0xf2, 0x83, 0x7f, 0x1c, 0xf8, 0xb2, 0x08, 0x28, 0x70, 0x47, + 0x28, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x43, + 0x8b, 0xb0, 0x19, 0x46, 0x80, 0x46, 0x00, 0x23, 0x10, 0x46, 0x03, 0x93, + 0x04, 0x93, 0x08, 0x93, 0x06, 0x93, 0x05, 0x93, 0x4f, 0xf4, 0x7a, 0x72, + 0xfe, 0xf7, 0x00, 0xfc, 0x00, 0x24, 0x05, 0xaf, 0x0a, 0x94, 0x09, 0x94, + 0x07, 0x94, 0x81, 0x46, 0x01, 0x97, 0x06, 0xad, 0x00, 0x95, 0x09, 0xab, + 0x04, 0xaa, 0x49, 0x46, 0x40, 0x46, 0x03, 0xf0, 0xc1, 0xfd, 0x07, 0xab, + 0x08, 0xa8, 0x01, 0x93, 0x00, 0x90, 0x0a, 0xab, 0x03, 0xaa, 0x49, 0x46, + 0x40, 0x46, 0x02, 0xf0, 0x0f, 0xfd, 0x06, 0x98, 0x0d, 0xf1, 0x0a, 0x02, + 0x02, 0xa9, 0xc0, 0xb2, 0x03, 0xf0, 0x07, 0xfd, 0x08, 0x98, 0x00, 0xf0, + 0x77, 0xf8, 0x91, 0x4d, 0x9d, 0xf8, 0x08, 0x00, 0x9d, 0xf8, 0x09, 0x10, + 0x55, 0xf8, 0x28, 0x20, 0x88, 0x42, 0x38, 0xbf, 0x08, 0x46, 0x82, 0xf8, + 0x29, 0x00, 0x0d, 0xf1, 0x0a, 0x02, 0x05, 0x98, 0x02, 0xa9, 0xc0, 0xb2, + 0x03, 0xf0, 0xf1, 0xfc, 0x07, 0x98, 0x00, 0xf0, 0x61, 0xf8, 0x9d, 0xf8, + 0x09, 0x00, 0x9d, 0xf8, 0x08, 0x10, 0x55, 0xf8, 0x28, 0x20, 0x88, 0x42, + 0x88, 0xbf, 0x08, 0x46, 0x82, 0xf8, 0x28, 0x00, 0x4b, 0xf2, 0x04, 0x77, + 0x55, 0xf8, 0x28, 0x20, 0x92, 0xf8, 0x85, 0x00, 0x02, 0x28, 0x18, 0xbf, + 0x01, 0x28, 0x35, 0xd1, 0x04, 0x98, 0x03, 0x99, 0x08, 0x43, 0x08, 0xbf, + 0x3c, 0x46, 0x03, 0xd0, 0x04, 0x98, 0x50, 0x62, 0x03, 0x99, 0x11, 0x62, + 0x04, 0x98, 0x03, 0x99, 0x88, 0x42, 0x2c, 0xbf, 0x50, 0x6a, 0x10, 0x6a, + 0xb9, 0xfb, 0xf0, 0xf0, 0x69, 0x49, 0x82, 0xf8, 0x39, 0x00, 0x55, 0xf8, + 0x28, 0x00, 0x51, 0xf8, 0x28, 0x60, 0x90, 0xf8, 0x29, 0x00, 0x6d, 0x36, + 0x01, 0x28, 0x06, 0xd1, 0x00, 0x23, 0x0c, 0x22, 0x02, 0x21, 0xff, 0xf7, + 0xa7, 0xfa, 0x01, 0x23, 0x08, 0xe0, 0x02, 0x28, 0x0c, 0xbf, 0x01, 0x23, + 0x03, 0x23, 0x0c, 0x22, 0x02, 0x21, 0xff, 0xf7, 0x9d, 0xfa, 0x00, 0x23, + 0xff, 0xf7, 0x9e, 0xfa, 0x00, 0xf0, 0x1f, 0xf8, 0xff, 0xf7, 0xaa, 0xfe, + 0xff, 0xf7, 0x94, 0xfa, 0x55, 0xf8, 0x28, 0x10, 0x91, 0xf8, 0x85, 0x00, + 0x03, 0x28, 0x0b, 0xd1, 0x03, 0x98, 0x08, 0xb9, 0x3c, 0x46, 0x07, 0xe0, + 0x08, 0x62, 0x00, 0x22, 0x08, 0x6a, 0x4a, 0x62, 0xb9, 0xfb, 0xf0, 0xf0, + 0x81, 0xf8, 0x39, 0x00, 0x20, 0x46, 0x0b, 0xb0, 0xbd, 0xe8, 0xf0, 0x83, + 0x0d, 0xf1, 0x09, 0x01, 0xc0, 0xb2, 0x02, 0xf0, 0x80, 0xba, 0x00, 0x23, + 0x40, 0x22, 0x06, 0x21, 0x30, 0x46, 0xfe, 0xf7, 0xe4, 0xbb, 0x00, 0x00, + 0x40, 0x42, 0x0f, 0x00, 0x38, 0xb5, 0x00, 0xf0, 0x21, 0xf8, 0xe3, 0xb2, + 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x55, 0x00, 0xfe, 0xf7, 0xd7, 0xfb, + 0x23, 0x04, 0x1b, 0x0e, 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x56, 0x00, + 0xfe, 0xf7, 0xcf, 0xfb, 0x23, 0x02, 0x1b, 0x0e, 0xff, 0x22, 0x00, 0x21, + 0x05, 0xf1, 0x57, 0x00, 0xfe, 0xf7, 0xc7, 0xfb, 0x23, 0x0e, 0x05, 0xf1, + 0x58, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0xff, 0x22, 0x00, 0x21, + 0xfe, 0xf7, 0xbd, 0xbb, 0x0c, 0x46, 0x33, 0x49, 0x51, 0xf8, 0x20, 0x50, + 0x70, 0x47, 0x31, 0x49, 0x51, 0xf8, 0x20, 0x10, 0x01, 0xf1, 0x55, 0x00, + 0x01, 0xf1, 0x56, 0x02, 0x00, 0x78, 0x12, 0x78, 0x01, 0xf1, 0x57, 0x03, + 0x58, 0x31, 0x1b, 0x78, 0x09, 0x78, 0x40, 0xea, 0x02, 0x20, 0x40, 0xea, + 0x03, 0x40, 0x40, 0xea, 0x01, 0x60, 0x70, 0x47, 0x38, 0xb5, 0x00, 0x24, + 0x08, 0x38, 0x03, 0x28, 0x2d, 0x4d, 0x19, 0xd8, 0xdf, 0xe8, 0x00, 0xf0, + 0x02, 0x04, 0x0b, 0x14, 0xa9, 0x68, 0x10, 0xe0, 0x00, 0x20, 0x00, 0xf0, + 0xd9, 0xfb, 0x01, 0x28, 0x0e, 0xd0, 0x29, 0x68, 0x05, 0xe0, 0x01, 0x20, + 0x00, 0xf0, 0xd2, 0xfb, 0x01, 0x28, 0x07, 0xd0, 0x69, 0x68, 0x91, 0xf8, + 0x85, 0x00, 0x01, 0xe0, 0xe9, 0x68, 0xc8, 0x6a, 0x00, 0xb1, 0x01, 0x24, + 0x20, 0x46, 0x32, 0xbd, 0x0b, 0x46, 0x1e, 0x49, 0x51, 0xf8, 0x20, 0x20, + 0xd1, 0x6a, 0x01, 0x29, 0x00, 0xd0, 0x70, 0x47, 0x10, 0xb5, 0x11, 0x4c, + 0x54, 0xf8, 0x20, 0x00, 0xbd, 0xe8, 0x10, 0x40, 0x02, 0x22, 0x20, 0x30, + 0xfe, 0xf7, 0x6f, 0xbb, 0x03, 0x28, 0x0b, 0x46, 0x14, 0xd8, 0xdf, 0xe8, + 0x00, 0xf0, 0x02, 0x06, 0x0a, 0x0e, 0x10, 0x22, 0x04, 0x21, 0x13, 0x48, + 0x0a, 0xe0, 0x10, 0x22, 0x04, 0x21, 0x12, 0x48, 0x06, 0xe0, 0x10, 0x22, + 0x04, 0x21, 0x11, 0x48, 0x02, 0xe0, 0x10, 0x22, 0x04, 0x21, 0x10, 0x48, + 0xfe, 0xf7, 0x57, 0xbb, 0x70, 0x47, 0x00, 0x00, 0x30, 0x9c, 0x04, 0x01, + 0xa0, 0x86, 0x01, 0x00, 0x80, 0x77, 0x02, 0x20, 0x00, 0x99, 0xce, 0x58, + 0x01, 0x67, 0x31, 0xa7, 0x00, 0xd8, 0x94, 0x11, 0x01, 0x50, 0xd6, 0xdc, + 0x68, 0x94, 0x04, 0x01, 0x48, 0x98, 0x04, 0x01, 0x20, 0x76, 0x02, 0x20, + 0x74, 0x55, 0x00, 0x20, 0x26, 0x00, 0x30, 0x47, 0x26, 0x00, 0x40, 0x47, + 0x26, 0x00, 0x09, 0x48, 0x26, 0x00, 0x06, 0x48, 0x00, 0x78, 0x02, 0x40, + 0xca, 0x40, 0xd0, 0xb2, 0x70, 0x47, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, + 0x72, 0xb6, 0x05, 0x78, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, + 0x29, 0x43, 0x01, 0x70, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0xf8, 0xb5, + 0xdf, 0xf8, 0xec, 0x46, 0x21, 0x68, 0x01, 0x20, 0x81, 0xf8, 0x85, 0x00, + 0x61, 0x68, 0x81, 0xf8, 0x85, 0x00, 0x68, 0x46, 0xf8, 0xf7, 0x25, 0xfd, + 0x9d, 0xf8, 0x00, 0x20, 0x9d, 0xf8, 0x01, 0x00, 0x9d, 0xf8, 0x03, 0x30, + 0x82, 0x18, 0x9d, 0xf8, 0x02, 0x00, 0x81, 0x18, 0x59, 0x18, 0x18, 0x18, + 0x63, 0x68, 0x24, 0x68, 0xc9, 0xb2, 0xd2, 0xb2, 0xc0, 0xb2, 0x1a, 0xb9, + 0x03, 0x22, 0x84, 0xf8, 0x85, 0x20, 0x04, 0xe0, 0x02, 0x2a, 0x04, 0xbf, + 0x03, 0x22, 0x83, 0xf8, 0x85, 0x20, 0x18, 0xb9, 0x02, 0x20, 0x84, 0xf8, + 0x85, 0x00, 0x03, 0xe0, 0x02, 0x28, 0x08, 0xbf, 0x83, 0xf8, 0x85, 0x00, + 0x21, 0xb9, 0x00, 0x20, 0x84, 0xf8, 0x85, 0x00, 0x01, 0x21, 0x05, 0xe0, + 0x04, 0x29, 0x05, 0xd1, 0x01, 0x20, 0x84, 0xf8, 0x85, 0x00, 0x00, 0x21, + 0x83, 0xf8, 0x85, 0x10, 0xdf, 0xf8, 0x74, 0x06, 0x00, 0x68, 0xd0, 0xf8, + 0x5e, 0x60, 0xd0, 0xf8, 0x62, 0x70, 0x00, 0x2f, 0x02, 0xbf, 0x00, 0x2e, + 0x00, 0x21, 0x84, 0xf8, 0x85, 0x10, 0xd0, 0xf8, 0x89, 0x40, 0xd0, 0xf8, + 0x8d, 0x50, 0x00, 0x2d, 0x02, 0xbf, 0x00, 0x2c, 0x00, 0x20, 0x83, 0xf8, + 0x85, 0x00, 0xf1, 0xbd, 0xf8, 0xb5, 0x04, 0x46, 0xdf, 0xf8, 0x44, 0x06, + 0x26, 0x46, 0x50, 0xf8, 0x26, 0x50, 0x00, 0x23, 0x10, 0x22, 0x04, 0x21, + 0xe8, 0x1c, 0xff, 0xf7, 0x8e, 0xff, 0x05, 0xf1, 0x6b, 0x07, 0x00, 0x23, + 0x00, 0xf0, 0x18, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0x15, 0xf8, 0xdf, 0xf8, + 0x24, 0x16, 0x0a, 0x68, 0x32, 0x44, 0x6c, 0x35, 0x50, 0x78, 0x00, 0x28, + 0x0c, 0xbf, 0x00, 0x23, 0x01, 0x23, 0x10, 0x22, 0x04, 0x21, 0x00, 0xf0, + 0x59, 0xfa, 0x20, 0x46, 0x00, 0xf0, 0x01, 0xfa, 0x20, 0x46, 0xbd, 0xe8, + 0xf2, 0x40, 0x09, 0xe1, 0x10, 0x22, 0x04, 0x21, 0x38, 0x46, 0x6c, 0xe7, + 0x2d, 0xe9, 0xfc, 0x42, 0xdf, 0xf8, 0xec, 0x15, 0x1d, 0x46, 0x86, 0x46, + 0x0b, 0x68, 0xf4, 0x46, 0x63, 0x44, 0x14, 0x46, 0x58, 0x78, 0x00, 0x22, + 0x18, 0xbb, 0x01, 0x23, 0x9d, 0x42, 0xdf, 0xf8, 0xd8, 0x25, 0x75, 0xd8, + 0x28, 0xbf, 0x94, 0x42, 0x72, 0xd2, 0x9d, 0x42, 0xdf, 0xf8, 0xcc, 0x05, + 0x79, 0xd8, 0x28, 0xbf, 0x84, 0x42, 0x76, 0xd2, 0x00, 0x23, 0x9d, 0x42, + 0xdf, 0xf8, 0xc0, 0x25, 0x71, 0xd8, 0x94, 0x42, 0x6f, 0xd2, 0x9d, 0x42, + 0xdf, 0xf8, 0xb8, 0x05, 0x79, 0xd8, 0x84, 0x42, 0x77, 0xd2, 0x9d, 0x42, + 0xdf, 0xf8, 0xb0, 0x25, 0x02, 0xd8, 0x94, 0x42, 0xc0, 0xf0, 0x8a, 0x80, + 0x7d, 0xe0, 0x6e, 0x01, 0x2f, 0x01, 0x69, 0x00, 0xbe, 0xf1, 0x00, 0x0f, + 0x46, 0xea, 0xd4, 0x66, 0x47, 0xea, 0x14, 0x77, 0x41, 0xea, 0xd4, 0x71, + 0x3a, 0xd1, 0xdf, 0xf8, 0x70, 0x25, 0xd2, 0xf8, 0x00, 0xe0, 0xde, 0xf8, + 0x71, 0x20, 0xde, 0xf8, 0x75, 0x30, 0xab, 0x42, 0x08, 0xbf, 0xa2, 0x42, + 0x3e, 0xd0, 0xde, 0xf8, 0x71, 0x20, 0xde, 0xf8, 0x75, 0x30, 0x8b, 0x42, + 0x08, 0xbf, 0xb2, 0xeb, 0x44, 0x0f, 0x40, 0xd0, 0xde, 0xf8, 0x71, 0x20, + 0xde, 0xf8, 0x75, 0x30, 0xa9, 0x00, 0x41, 0xea, 0x94, 0x71, 0x8b, 0x42, + 0x08, 0xbf, 0xb2, 0xeb, 0x84, 0x0f, 0x42, 0xd0, 0xde, 0xf8, 0x71, 0x20, + 0xde, 0xf8, 0x75, 0x30, 0xe9, 0x00, 0x41, 0xea, 0x54, 0x71, 0x8b, 0x42, + 0x08, 0xbf, 0xb2, 0xeb, 0xc4, 0x0f, 0x44, 0xd0, 0xde, 0xf8, 0x71, 0x00, + 0xde, 0xf8, 0x75, 0x10, 0xb9, 0x42, 0x08, 0xbf, 0xb0, 0xeb, 0x04, 0x1f, + 0x46, 0xd0, 0xde, 0xf8, 0x71, 0x00, 0xde, 0xf8, 0x75, 0x10, 0x47, 0xe0, + 0xbe, 0xf1, 0x01, 0x0f, 0x4a, 0xd1, 0xdf, 0xf8, 0xf4, 0x24, 0x13, 0x68, + 0x03, 0xf1, 0x9c, 0x0e, 0xde, 0xf8, 0x00, 0x20, 0xde, 0xf8, 0x04, 0x30, + 0xab, 0x42, 0x08, 0xbf, 0xa2, 0x42, 0x01, 0xd1, 0x01, 0x22, 0x3b, 0xe0, + 0xde, 0xf8, 0x00, 0x20, 0xde, 0xf8, 0x04, 0x30, 0x8b, 0x42, 0x08, 0xbf, + 0xb2, 0xeb, 0x44, 0x0f, 0x01, 0xd1, 0x02, 0x22, 0x30, 0xe0, 0xde, 0xf8, + 0x00, 0x20, 0xde, 0xf8, 0x04, 0x30, 0xa9, 0x00, 0x41, 0xea, 0x94, 0x71, + 0x8b, 0x42, 0x08, 0xbf, 0xb2, 0xeb, 0x84, 0x0f, 0x01, 0xd1, 0x04, 0x22, + 0x22, 0xe0, 0xde, 0xf8, 0x00, 0x20, 0xde, 0xf8, 0x04, 0x30, 0xe9, 0x00, + 0x41, 0xea, 0x54, 0x71, 0x8b, 0x42, 0x08, 0xbf, 0xb2, 0xeb, 0xc4, 0x0f, + 0x01, 0xd1, 0x08, 0x22, 0x14, 0xe0, 0xde, 0xf8, 0x00, 0x00, 0xde, 0xf8, + 0x04, 0x10, 0xb9, 0x42, 0x08, 0xbf, 0xb0, 0xeb, 0x04, 0x1f, 0x01, 0xd1, + 0x10, 0x22, 0x09, 0xe0, 0xde, 0xf8, 0x00, 0x00, 0xde, 0xf8, 0x04, 0x10, + 0xb1, 0x42, 0x06, 0xbf, 0xb0, 0xeb, 0x44, 0x1f, 0x20, 0x22, 0x40, 0x22, + 0x08, 0x98, 0x09, 0x9b, 0xdf, 0xf8, 0x54, 0x14, 0x02, 0x70, 0x51, 0xf8, + 0x2c, 0x20, 0xc2, 0xe9, 0x06, 0x45, 0x00, 0x78, 0xa4, 0xfb, 0x00, 0x97, + 0x05, 0xfb, 0x00, 0x77, 0xc3, 0xe9, 0x00, 0x97, 0xbd, 0xe8, 0xf3, 0x82, + 0x1c, 0xb5, 0x04, 0x46, 0x6b, 0x46, 0x0d, 0xf1, 0x01, 0x02, 0x0d, 0xf1, + 0x02, 0x01, 0x0d, 0xf1, 0x03, 0x00, 0x00, 0xf0, 0x77, 0xf9, 0x04, 0x2c, + 0x04, 0xd2, 0x9d, 0xf8, 0x01, 0x00, 0x28, 0xb1, 0x01, 0x20, 0x16, 0xbd, + 0x00, 0xf0, 0x5b, 0xf9, 0x18, 0xbf, 0x00, 0x20, 0x16, 0xbd, 0x1c, 0xb5, + 0x04, 0x46, 0x0d, 0xf1, 0x02, 0x03, 0x0d, 0xf1, 0x03, 0x02, 0x69, 0x46, + 0x0d, 0xf1, 0x01, 0x00, 0x00, 0xf0, 0x60, 0xf9, 0x04, 0x2c, 0x04, 0xd2, + 0x9d, 0xf8, 0x01, 0x00, 0x28, 0xb1, 0x01, 0x20, 0x16, 0xbd, 0x00, 0xf0, + 0x44, 0xf9, 0x18, 0xbf, 0x00, 0x20, 0x16, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, + 0xdf, 0xf8, 0xe0, 0x73, 0x39, 0x68, 0x04, 0x46, 0xdf, 0xf8, 0xd4, 0x03, + 0x26, 0x46, 0x89, 0x19, 0x50, 0xf8, 0x26, 0x80, 0x48, 0x78, 0x00, 0x25, + 0x00, 0x28, 0x08, 0xf1, 0x6c, 0x0b, 0x08, 0xf1, 0x6b, 0x09, 0x08, 0xf1, + 0x03, 0x0a, 0x3f, 0xd1, 0x01, 0x23, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, + 0xc7, 0xf8, 0x00, 0xf0, 0xc2, 0xf8, 0x00, 0xf0, 0xcf, 0xf8, 0x00, 0xf0, + 0xc8, 0xf8, 0x00, 0xf0, 0xc1, 0xf8, 0x08, 0xf1, 0x69, 0x04, 0x00, 0x23, + 0x3f, 0x22, 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x3c, 0xfe, 0x00, 0x23, + 0x00, 0xf0, 0xad, 0xf8, 0x38, 0x68, 0x80, 0x19, 0xc1, 0x78, 0x01, 0x29, + 0x40, 0xf0, 0xa0, 0x80, 0x00, 0x23, 0x02, 0x22, 0x00, 0xf0, 0xaa, 0xf8, + 0x00, 0xf0, 0xa5, 0xf8, 0x00, 0x23, 0x00, 0xf0, 0xb2, 0xf8, 0x01, 0x23, + 0x00, 0xf0, 0xaa, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0x98, 0xf8, 0x39, 0x68, + 0x89, 0x19, 0x08, 0x7e, 0x00, 0x28, 0x0c, 0xbf, 0x01, 0x23, 0x00, 0x23, + 0x04, 0x22, 0x02, 0x21, 0x58, 0x46, 0xff, 0xf7, 0x18, 0xfe, 0x38, 0x68, + 0x80, 0x19, 0x3f, 0x22, 0x03, 0x7e, 0x00, 0x21, 0x20, 0x46, 0x79, 0xe0, + 0x01, 0x23, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0x87, 0xf8, 0x00, 0x23, + 0x00, 0xf0, 0x82, 0xf8, 0xdf, 0xf8, 0x20, 0x03, 0x00, 0x68, 0x44, 0xbb, + 0x00, 0xf0, 0x72, 0xf8, 0xdf, 0xf8, 0x34, 0x23, 0x02, 0x23, 0x9e, 0x42, + 0x2d, 0xd8, 0x28, 0xbf, 0x94, 0x42, 0x2a, 0xd2, 0x00, 0xf0, 0x68, 0xf8, + 0xdf, 0xf8, 0x24, 0x23, 0x01, 0x23, 0x9e, 0x42, 0x2e, 0xd8, 0x28, 0xbf, + 0x94, 0x42, 0x2b, 0xd2, 0x00, 0xf0, 0x5e, 0xf8, 0xdf, 0xf8, 0x14, 0x23, + 0x9e, 0x42, 0x2f, 0xd8, 0x28, 0xbf, 0x94, 0x42, 0x2c, 0xd2, 0xd0, 0xf8, + 0x71, 0x20, 0xd0, 0xf8, 0x75, 0x30, 0xc1, 0x4c, 0x01, 0x26, 0xb3, 0x42, + 0x30, 0xd3, 0x2e, 0xd8, 0xa2, 0x42, 0x2d, 0xd3, 0x2b, 0xe0, 0x01, 0x2c, + 0x2a, 0xd1, 0x50, 0xf8, 0x9c, 0x4f, 0x46, 0x68, 0xb7, 0x4a, 0x02, 0x23, + 0x9e, 0x42, 0x04, 0xd3, 0x01, 0xd8, 0x94, 0x42, 0x01, 0xd3, 0x06, 0x25, + 0x1e, 0xe0, 0x04, 0x68, 0x46, 0x68, 0xb3, 0x4a, 0x01, 0x23, 0x9e, 0x42, + 0x04, 0xd3, 0x01, 0xd8, 0x94, 0x42, 0x01, 0xd3, 0x04, 0x25, 0x13, 0xe0, + 0x04, 0x68, 0x46, 0x68, 0xae, 0x4a, 0x9e, 0x42, 0x04, 0xd3, 0x01, 0xd8, + 0x94, 0x42, 0x01, 0xd3, 0x03, 0x25, 0x09, 0xe0, 0x02, 0x68, 0x43, 0x68, + 0xaa, 0x48, 0x01, 0x21, 0x8b, 0x42, 0x03, 0xd3, 0x01, 0xd8, 0x82, 0x42, + 0x00, 0xd3, 0x02, 0x25, 0x2b, 0x46, 0x70, 0x22, 0x04, 0x21, 0x08, 0xf1, + 0x6a, 0x00, 0xff, 0xf7, 0xa8, 0xfd, 0x00, 0xf0, 0x2d, 0xf8, 0x00, 0xf0, + 0x26, 0xf8, 0x00, 0xf0, 0x1f, 0xf8, 0x00, 0x23, 0x3f, 0x22, 0x00, 0x21, + 0x08, 0xf1, 0x69, 0x00, 0xff, 0xf7, 0x9b, 0xfd, 0x00, 0x23, 0x20, 0x22, + 0x05, 0x21, 0x48, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, 0x92, 0xe5, + 0xbd, 0xe8, 0xf1, 0x8f, 0xd0, 0xf8, 0x71, 0x40, 0xd0, 0xf8, 0x75, 0x60, + 0x70, 0x47, 0x20, 0x22, 0x05, 0x21, 0x48, 0x46, 0x87, 0xe5, 0x01, 0x23, + 0x20, 0x22, 0x05, 0x21, 0x50, 0x46, 0x82, 0xe5, 0x00, 0x23, 0x04, 0x22, + 0x02, 0x21, 0x58, 0x46, 0x7d, 0xe5, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, + 0x48, 0x46, 0x78, 0xe5, 0x01, 0x23, 0x02, 0x22, 0x01, 0x21, 0x48, 0x46, + 0x73, 0xe5, 0x7c, 0xb5, 0x06, 0x46, 0x7e, 0x49, 0x7e, 0x4c, 0x32, 0x46, + 0x51, 0xf8, 0x22, 0x50, 0x68, 0x46, 0xf8, 0xf7, 0xaa, 0xfa, 0x6c, 0x35, + 0x30, 0x00, 0x1e, 0xd1, 0x9d, 0xf8, 0x02, 0x00, 0x01, 0x28, 0x03, 0xd1, + 0x00, 0xf0, 0x3f, 0xf8, 0x00, 0x20, 0x02, 0xe0, 0x00, 0xf0, 0x40, 0xf8, + 0x01, 0x20, 0x21, 0x68, 0x81, 0xf8, 0x20, 0x00, 0x00, 0xf0, 0x31, 0xf8, + 0x06, 0xd1, 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x32, 0xf8, + 0x00, 0x20, 0x02, 0xe0, 0x00, 0xf0, 0x35, 0xf8, 0x01, 0x20, 0x21, 0x68, + 0x81, 0xf8, 0x22, 0x00, 0x73, 0xbd, 0x01, 0x2e, 0x1e, 0xd1, 0x9d, 0xf8, + 0x03, 0x00, 0x01, 0x28, 0x03, 0xd1, 0x00, 0xf0, 0x23, 0xf8, 0x00, 0x20, + 0x02, 0xe0, 0x00, 0xf0, 0x1a, 0xf8, 0x01, 0x20, 0x21, 0x68, 0x81, 0xf8, + 0x21, 0x00, 0x9d, 0xf8, 0x01, 0x00, 0x01, 0x28, 0x03, 0xd1, 0x00, 0xf0, + 0x1a, 0xf8, 0x00, 0x20, 0x05, 0xe0, 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, + 0x00, 0xf0, 0x0c, 0xf8, 0x01, 0x20, 0x21, 0x68, 0x81, 0xf8, 0x23, 0x00, + 0x73, 0xbd, 0x9d, 0xf8, 0x00, 0x00, 0x01, 0x28, 0x70, 0x47, 0x01, 0x23, + 0x40, 0x22, 0x06, 0x21, 0x28, 0x46, 0x1c, 0xe5, 0x00, 0x23, 0x40, 0x22, + 0x06, 0x21, 0x28, 0x46, 0x17, 0xe5, 0x00, 0x23, 0x20, 0x22, 0x05, 0x21, + 0x28, 0x46, 0x12, 0xe5, 0xf8, 0xb5, 0x06, 0x46, 0x0d, 0x46, 0x17, 0x46, + 0x1c, 0x46, 0x68, 0x46, 0xf8, 0xf7, 0x4b, 0xfa, 0x9d, 0xf8, 0x02, 0x00, + 0x01, 0x28, 0x0c, 0xbf, 0x00, 0x20, 0x01, 0x20, 0x30, 0x70, 0xff, 0xf7, + 0xdc, 0xff, 0x0c, 0xbf, 0x00, 0x20, 0x01, 0x20, 0x38, 0x70, 0x9d, 0xf8, + 0x03, 0x00, 0x01, 0x28, 0x0c, 0xbf, 0x00, 0x20, 0x01, 0x20, 0x28, 0x70, + 0x9d, 0xf8, 0x01, 0x00, 0x01, 0x28, 0x0c, 0xbf, 0x00, 0x20, 0x01, 0x20, + 0x20, 0x70, 0xf1, 0xbd, 0x10, 0xb5, 0x3d, 0x4c, 0x20, 0x68, 0x00, 0x21, + 0x41, 0x70, 0xc1, 0x70, 0x81, 0x70, 0x01, 0x71, 0x37, 0x49, 0x0b, 0x68, + 0x93, 0xf8, 0x79, 0x20, 0x02, 0x76, 0x08, 0x68, 0x23, 0x68, 0x90, 0xf8, + 0xa4, 0x20, 0x5a, 0x76, 0x00, 0x20, 0x21, 0x68, 0x00, 0xf0, 0x07, 0xf8, + 0x20, 0xb9, 0x21, 0x68, 0xbd, 0xe8, 0x10, 0x40, 0x01, 0x20, 0x00, 0xe0, + 0x10, 0xbd, 0x38, 0xb5, 0x00, 0x24, 0x00, 0x28, 0x2b, 0x48, 0x03, 0x68, + 0x4f, 0xf6, 0x5a, 0x72, 0x1f, 0xd1, 0x93, 0xf8, 0x7a, 0x50, 0x05, 0xf0, + 0x07, 0x05, 0x01, 0x2d, 0x06, 0xd0, 0x02, 0x2d, 0x06, 0xd0, 0x04, 0x2d, + 0x08, 0xd0, 0x05, 0x2d, 0x05, 0xd0, 0x08, 0xe0, 0x4c, 0x70, 0x07, 0xe0, + 0x01, 0x22, 0x4a, 0x70, 0x04, 0xe0, 0x4c, 0x70, 0x01, 0x20, 0xc8, 0x70, + 0x00, 0xe0, 0x14, 0x46, 0x77, 0x22, 0x00, 0x21, 0x28, 0x48, 0xff, 0xf7, + 0xa9, 0xfc, 0x1d, 0x49, 0x0a, 0x68, 0x90, 0x77, 0x1e, 0xe0, 0x93, 0xf8, + 0xa5, 0x50, 0x05, 0xf0, 0x07, 0x05, 0x01, 0x2d, 0x06, 0xd0, 0x02, 0x2d, + 0x06, 0xd0, 0x04, 0x2d, 0x08, 0xd0, 0x05, 0x2d, 0x05, 0xd0, 0x08, 0xe0, + 0x8c, 0x70, 0x07, 0xe0, 0x01, 0x22, 0x8a, 0x70, 0x04, 0xe0, 0x8c, 0x70, + 0x01, 0x20, 0x08, 0x71, 0x00, 0xe0, 0x14, 0x46, 0x77, 0x22, 0x00, 0x21, + 0x19, 0x48, 0xff, 0xf7, 0x89, 0xfc, 0x0d, 0x49, 0x0a, 0x68, 0xd0, 0x77, + 0x20, 0x46, 0x32, 0xbd, 0x0a, 0x4a, 0x12, 0x68, 0x01, 0x46, 0x00, 0x20, + 0x0b, 0x00, 0x08, 0xbf, 0x51, 0x78, 0x02, 0xd0, 0x01, 0x29, 0x03, 0xd1, + 0x91, 0x78, 0x01, 0x29, 0x08, 0xbf, 0x01, 0x20, 0x70, 0x47, 0x00, 0x00, + 0x20, 0x76, 0x02, 0x20, 0xb4, 0x76, 0x02, 0x20, 0x30, 0x9c, 0x04, 0x01, + 0x80, 0x77, 0x02, 0x20, 0x00, 0x67, 0x31, 0xa7, 0x00, 0x38, 0xc9, 0x4d, + 0x80, 0xb3, 0x98, 0xd3, 0xc0, 0x59, 0xcc, 0x69, 0x70, 0x16, 0x73, 0x1a, + 0x01, 0x1a, 0x71, 0x18, 0x01, 0x86, 0x3b, 0xa1, 0x01, 0xbc, 0xa0, 0x65, + 0x01, 0x8d, 0x38, 0x0c, 0x6c, 0x00, 0x30, 0x47, 0x6c, 0x00, 0x40, 0x47, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x70, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x38, 0xb5, 0x99, 0x49, 0x51, 0xf8, 0x20, 0x40, + 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x04, 0xf1, 0xb2, 0x00, 0xff, 0xf7, + 0xe7, 0xff, 0x00, 0xf0, 0xc5, 0xf8, 0x04, 0xf1, 0xb0, 0x05, 0x00, 0x23, + 0x08, 0x22, 0x03, 0x21, 0x28, 0x46, 0xff, 0xf7, 0xdd, 0xff, 0x00, 0xf0, + 0xbb, 0xf8, 0x01, 0x23, 0x04, 0x22, 0x02, 0x21, 0x28, 0x46, 0xff, 0xf7, + 0xd5, 0xff, 0x00, 0xf0, 0xb3, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0xa7, 0xf8, + 0x00, 0xf0, 0xae, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0xa6, 0xf8, 0x4f, 0xf4, + 0xfa, 0x50, 0x03, 0xf0, 0xab, 0xfe, 0x01, 0x23, 0x04, 0x22, 0x02, 0x21, + 0x04, 0xf1, 0x95, 0x00, 0xff, 0xf7, 0xc0, 0xff, 0xbd, 0xe8, 0x32, 0x40, + 0x0f, 0x20, 0x03, 0xf0, 0x9f, 0xbe, 0x2d, 0xe9, 0xf0, 0x47, 0x80, 0x46, + 0x7c, 0x48, 0x41, 0x46, 0x50, 0xf8, 0x21, 0x40, 0x02, 0x20, 0x0c, 0xf0, + 0xdf, 0xf9, 0x81, 0x46, 0x04, 0xf1, 0x95, 0x00, 0x00, 0x25, 0x01, 0x78, + 0x00, 0x26, 0xc1, 0xf3, 0x80, 0x01, 0x39, 0xb1, 0x00, 0x23, 0x04, 0x22, + 0x02, 0x21, 0xff, 0xf7, 0xa3, 0xff, 0x0f, 0x20, 0x03, 0xf0, 0x84, 0xfe, + 0x00, 0x23, 0x00, 0xf0, 0x74, 0xf8, 0x00, 0xf0, 0x7b, 0xf8, 0x00, 0x23, + 0x00, 0xf0, 0x73, 0xf8, 0x4f, 0xf4, 0xfa, 0x50, 0x03, 0xf0, 0x78, 0xfe, + 0x08, 0x23, 0x1f, 0x22, 0x00, 0x21, 0x04, 0xf1, 0x90, 0x00, 0xff, 0xf7, + 0x8d, 0xff, 0x04, 0xf1, 0x94, 0x07, 0x4c, 0xf2, 0x50, 0x3a, 0x38, 0x78, + 0xc0, 0xf3, 0xc0, 0x00, 0x28, 0xb9, 0x00, 0xf0, 0xc7, 0xf8, 0x76, 0x1c, + 0x56, 0x45, 0xf6, 0xd1, 0x01, 0xe0, 0x56, 0x45, 0x41, 0xd1, 0x38, 0x78, + 0x60, 0xb9, 0x93, 0x34, 0x01, 0x23, 0x00, 0xf0, 0x4a, 0xf8, 0x64, 0x20, + 0x03, 0xf0, 0x58, 0xfe, 0x00, 0x23, 0x00, 0xf0, 0x44, 0xf8, 0x64, 0x20, + 0x03, 0xf0, 0x52, 0xfe, 0x38, 0x78, 0xc0, 0xf3, 0xc0, 0x00, 0x70, 0xbb, + 0x38, 0x78, 0xc0, 0xf3, 0x40, 0x10, 0x10, 0xb1, 0x4b, 0xf2, 0x02, 0x45, + 0x32, 0xe0, 0x38, 0x78, 0xc0, 0xf3, 0x40, 0x00, 0x10, 0xb1, 0x4b, 0xf2, + 0x05, 0x45, 0x2b, 0xe0, 0x38, 0x78, 0xc0, 0xf3, 0x80, 0x10, 0x10, 0xb1, + 0x4b, 0xf2, 0x01, 0x45, 0x24, 0xe0, 0x38, 0x78, 0xc0, 0x07, 0x48, 0xbf, + 0x4b, 0xf2, 0x06, 0x45, 0x1e, 0xd4, 0x38, 0x78, 0xc0, 0xf3, 0x80, 0x00, + 0x10, 0xb1, 0x4b, 0xf2, 0x04, 0x45, 0x17, 0xe0, 0x38, 0x78, 0xc0, 0xf3, + 0x00, 0x10, 0x28, 0xb1, 0xb9, 0xf1, 0x00, 0x0f, 0x05, 0xd0, 0x4b, 0xf2, + 0x03, 0x45, 0x0d, 0xe0, 0x4b, 0xf2, 0x0b, 0x45, 0x0a, 0xe0, 0x42, 0xf2, + 0x28, 0x30, 0x03, 0xf0, 0x1b, 0xfe, 0x40, 0x46, 0x03, 0x28, 0x03, 0xd0, + 0x02, 0x21, 0x00, 0xf0, 0x15, 0xf8, 0x05, 0x46, 0x28, 0x46, 0xbd, 0xe8, + 0xf0, 0x87, 0x10, 0x22, 0x04, 0x21, 0x20, 0x46, 0x28, 0xe7, 0x01, 0x22, + 0x00, 0x21, 0x60, 0x1c, 0x24, 0xe7, 0x80, 0x22, 0x07, 0x21, 0x04, 0xf1, + 0x92, 0x00, 0x1f, 0xe7, 0x4f, 0xf4, 0xfa, 0x60, 0x03, 0xf0, 0x00, 0xbe, + 0x2d, 0xe9, 0xf0, 0x41, 0x0e, 0x46, 0x2d, 0x49, 0x00, 0x25, 0x00, 0x27, + 0x51, 0xf8, 0x20, 0x80, 0x02, 0x2e, 0x01, 0xd0, 0x30, 0x00, 0x33, 0xd1, + 0x08, 0xf1, 0xb0, 0x04, 0x20, 0x78, 0xc0, 0xf3, 0x80, 0x00, 0x58, 0xb3, + 0x00, 0x23, 0x04, 0x22, 0x02, 0x21, 0xff, 0xf7, 0xda, 0xff, 0x00, 0xf0, + 0x47, 0xf8, 0x01, 0x23, 0x08, 0x22, 0x03, 0x21, 0xff, 0xf7, 0xd3, 0xff, + 0x08, 0xf1, 0xb1, 0x04, 0x00, 0xf0, 0x3e, 0xf8, 0x21, 0x78, 0x20, 0x78, + 0x49, 0x08, 0x00, 0xf0, 0x01, 0x00, 0x01, 0xf0, 0x01, 0x02, 0x02, 0x43, + 0x02, 0xd0, 0x7f, 0x1c, 0x32, 0x2f, 0xf1, 0xd3, 0x32, 0x2f, 0x0d, 0xd1, + 0x01, 0xf0, 0x01, 0x01, 0x08, 0x42, 0x18, 0xbf, 0x4b, 0xf2, 0x09, 0x45, + 0x23, 0xd1, 0x00, 0x28, 0x0c, 0xbf, 0x4b, 0xf2, 0x07, 0x45, 0x4b, 0xf2, + 0x08, 0x45, 0x1c, 0xe0, 0x02, 0x2e, 0x01, 0xd0, 0x01, 0x2e, 0x18, 0xd1, + 0x08, 0xf1, 0xb2, 0x00, 0x01, 0x78, 0xc9, 0x07, 0x13, 0xd5, 0x00, 0x23, + 0x01, 0x22, 0x00, 0x21, 0xff, 0xf7, 0xd0, 0xfe, 0x00, 0x26, 0x00, 0xf0, + 0x11, 0xf8, 0x08, 0xf1, 0xb3, 0x00, 0x00, 0x78, 0xc0, 0x09, 0x02, 0xd1, + 0x76, 0x1c, 0x32, 0x2e, 0xf5, 0xd3, 0x32, 0x2e, 0x08, 0xbf, 0x4b, 0xf2, + 0x0a, 0x45, 0x28, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x30, 0x9c, 0x04, 0x01, + 0x01, 0x20, 0x03, 0xf0, 0x9d, 0xbd, 0x00, 0x00, 0xdf, 0xf8, 0x64, 0x0c, + 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, 0x08, 0xe0, 0xdf, 0xf8, 0x58, 0x0c, + 0xdf, 0xf8, 0x58, 0x2c, 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, 0x11, 0x68, + 0x08, 0x40, 0x00, 0xf0, 0xff, 0x00, 0x70, 0x47, 0xdf, 0xf8, 0x40, 0x0c, + 0xdf, 0xf8, 0x40, 0x2c, 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, 0x11, 0x68, + 0x08, 0x40, 0x00, 0x04, 0x00, 0x0e, 0x70, 0x47, 0xdf, 0xf8, 0x28, 0x0c, + 0xdf, 0xf8, 0x28, 0x2c, 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, 0x11, 0x68, + 0x08, 0x40, 0x00, 0x0c, 0x00, 0xf0, 0x03, 0x00, 0x70, 0x47, 0xdf, 0xf8, + 0x10, 0x1c, 0x09, 0x68, 0x0a, 0x18, 0xe0, 0x20, 0x92, 0xf8, 0xbc, 0x30, + 0x43, 0x43, 0xc8, 0x18, 0xc4, 0x30, 0x70, 0x47, 0xdf, 0xf8, 0xf8, 0x1b, + 0x09, 0x68, 0x0a, 0x18, 0xed, 0x20, 0x92, 0xf8, 0xbc, 0x30, 0x43, 0x43, + 0xc8, 0x18, 0x00, 0xf2, 0x44, 0x40, 0x70, 0x47, 0x00, 0x78, 0x02, 0x40, + 0xca, 0x40, 0xd0, 0xb2, 0x70, 0x47, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, + 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, 0x0d, 0xf8, 0x01, 0x70, 0x07, 0xe0, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x00, 0xf0, + 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x70, 0x47, 0x7c, 0xb5, + 0xdf, 0xf8, 0xa8, 0x1b, 0xdf, 0xf8, 0xa8, 0x5b, 0x09, 0x78, 0xdf, 0xf8, + 0xa8, 0x6b, 0xdf, 0xf8, 0xa8, 0x4b, 0x01, 0xf0, 0x03, 0x01, 0x29, 0x77, + 0x71, 0x78, 0x01, 0xf0, 0x03, 0x01, 0x69, 0x77, 0xdf, 0xf8, 0x80, 0x1b, + 0x0b, 0x68, 0x5a, 0x69, 0x4f, 0xf4, 0x7a, 0x71, 0x4a, 0x43, 0x2a, 0x60, + 0x10, 0xb3, 0x01, 0x23, 0x80, 0x22, 0x07, 0x21, 0x00, 0xf0, 0x66, 0xff, + 0x00, 0x20, 0x01, 0xf0, 0xe4, 0xf8, 0x28, 0x62, 0x01, 0xf0, 0x65, 0xf8, + 0xdf, 0xf8, 0x48, 0x0e, 0xff, 0xf7, 0xbd, 0xff, 0x01, 0x23, 0x04, 0x22, + 0x02, 0x21, 0x01, 0xf0, 0x54, 0xf8, 0x01, 0xf0, 0x4f, 0xf8, 0x30, 0x78, + 0x00, 0xf0, 0x01, 0x00, 0x8d, 0xf8, 0x00, 0x00, 0x02, 0xb0, 0x30, 0x46, + 0xbd, 0xe8, 0x70, 0x40, 0x01, 0x23, 0x01, 0x22, 0x00, 0xf0, 0x93, 0xbd, + 0x20, 0x78, 0xc0, 0x09, 0x0c, 0xbf, 0x01, 0x20, 0x00, 0x20, 0x01, 0xf0, + 0xc2, 0xf8, 0x28, 0x62, 0x73, 0xbd, 0x00, 0x28, 0x00, 0xd1, 0x70, 0x47, + 0x80, 0xb5, 0x01, 0x20, 0x01, 0xf0, 0xb9, 0xf8, 0xdf, 0xf8, 0x20, 0x1b, + 0x08, 0x63, 0x00, 0x23, 0xbd, 0xe8, 0x00, 0x50, 0x80, 0x22, 0x07, 0x21, + 0xdf, 0xf8, 0x0c, 0x0b, 0x8d, 0xe7, 0xdf, 0xf8, 0xf4, 0x0a, 0xdf, 0xf8, + 0x08, 0x3b, 0x01, 0x68, 0xc8, 0x69, 0x4f, 0xf4, 0x7a, 0x72, 0xb0, 0xfb, + 0xf2, 0xf0, 0x41, 0x1e, 0x83, 0xf8, 0x34, 0x10, 0x00, 0x20, 0x70, 0x47, + 0x2d, 0xe9, 0xf1, 0x4f, 0x86, 0xb0, 0x00, 0x20, 0x00, 0x90, 0x00, 0x24, + 0xff, 0xf7, 0x42, 0xff, 0x01, 0x90, 0x01, 0x98, 0xe0, 0x40, 0xc1, 0x07, + 0x40, 0xf1, 0xe5, 0x80, 0xe0, 0xb2, 0xff, 0xf7, 0x52, 0xff, 0x05, 0x46, + 0xdf, 0xf8, 0xa4, 0x0d, 0x5f, 0xfa, 0x84, 0xf9, 0x05, 0xf1, 0x93, 0x07, + 0x50, 0xf8, 0x39, 0x60, 0x3b, 0x68, 0xdf, 0xf8, 0x98, 0x2d, 0x00, 0xf0, + 0xb4, 0xfc, 0x00, 0xf0, 0x3b, 0xff, 0x00, 0xf0, 0xf6, 0xfc, 0x00, 0xf0, + 0xed, 0xfc, 0xdf, 0xf8, 0x80, 0x0d, 0x3b, 0x68, 0xdf, 0xf8, 0x7c, 0x2d, + 0x00, 0xeb, 0xc9, 0x01, 0x05, 0xf1, 0x6f, 0x07, 0x4e, 0x68, 0x00, 0xf0, + 0xa2, 0xfc, 0x00, 0xf0, 0x29, 0xff, 0x00, 0xf0, 0xe4, 0xfc, 0x00, 0xf0, + 0xdb, 0xfc, 0xdf, 0xf8, 0x64, 0x0d, 0x50, 0xf8, 0x29, 0x90, 0x7b, 0x7f, + 0x4f, 0xf4, 0x40, 0x52, 0x0c, 0x21, 0x00, 0xf0, 0x96, 0xfc, 0x05, 0xf1, + 0x8f, 0x08, 0x4f, 0xf4, 0x40, 0x72, 0x98, 0xf8, 0x02, 0x30, 0x08, 0x21, + 0x00, 0xf0, 0x8d, 0xfc, 0x98, 0xf8, 0x03, 0x30, 0x30, 0x22, 0x04, 0x21, + 0x09, 0xf1, 0x14, 0x00, 0xff, 0xf7, 0x36, 0xff, 0x98, 0xf8, 0x00, 0x30, + 0x4f, 0xf0, 0x40, 0x52, 0x1c, 0x21, 0x00, 0xf0, 0x97, 0xfe, 0x09, 0xf1, + 0x20, 0x0b, 0x98, 0xf8, 0x01, 0x30, 0x00, 0xf0, 0x8c, 0xfc, 0x3b, 0x7f, + 0x4f, 0xf4, 0x80, 0x52, 0x0c, 0x21, 0x00, 0xf0, 0x8b, 0xfe, 0x09, 0xf1, + 0x04, 0x06, 0xbb, 0x7f, 0x4f, 0xf4, 0x40, 0x52, 0x0c, 0x21, 0x00, 0xf0, + 0xf3, 0xfe, 0x09, 0xf1, 0x10, 0x0a, 0xfb, 0x7f, 0x4f, 0xf0, 0x40, 0x72, + 0x18, 0x21, 0x00, 0xf0, 0x81, 0xfe, 0xbb, 0x7e, 0x30, 0x22, 0x04, 0x21, + 0x00, 0xf0, 0x74, 0xfc, 0xdf, 0xf8, 0xf8, 0x09, 0x90, 0xf8, 0x34, 0x30, + 0x09, 0xf1, 0x1c, 0x0b, 0x4f, 0xf4, 0x7f, 0x02, 0x10, 0x21, 0x00, 0xf0, + 0x69, 0xfc, 0x98, 0xf8, 0x08, 0x30, 0x07, 0x22, 0x00, 0xf0, 0x72, 0xfc, + 0x3d, 0x35, 0x07, 0x22, 0xeb, 0x78, 0x00, 0x21, 0x09, 0xf1, 0x0c, 0x00, + 0xff, 0xf7, 0xf6, 0xfe, 0x09, 0xf1, 0x08, 0x08, 0x2b, 0x79, 0x4f, 0xf0, + 0xe0, 0x42, 0x1c, 0x21, 0x00, 0xf0, 0x4e, 0xfc, 0x6b, 0x79, 0x4f, 0xf0, + 0xe0, 0x62, 0x00, 0xf0, 0x50, 0xfe, 0xfb, 0x78, 0x00, 0xf0, 0x51, 0xfe, + 0x3b, 0x79, 0x4f, 0xf0, 0xe0, 0x42, 0x1c, 0x21, 0x00, 0xf0, 0x46, 0xfc, + 0x7b, 0x79, 0x4f, 0xf0, 0xe0, 0x62, 0x18, 0x21, 0x00, 0xf0, 0xb2, 0xfe, + 0x2b, 0x78, 0x4f, 0xf4, 0xe0, 0x62, 0x00, 0xf0, 0x34, 0xfc, 0x6b, 0x78, + 0x00, 0xf0, 0x19, 0xfc, 0x00, 0xf0, 0x38, 0xfe, 0xab, 0x78, 0x07, 0x22, + 0x00, 0x21, 0x09, 0xf1, 0x18, 0x00, 0xff, 0xf7, 0xc9, 0xfe, 0x3b, 0x78, + 0x70, 0x22, 0x04, 0x21, 0x00, 0xf0, 0x2a, 0xfc, 0x7b, 0x78, 0x00, 0xf0, + 0x08, 0xfc, 0x00, 0xf0, 0x0e, 0xfc, 0xbb, 0x78, 0x4f, 0xf4, 0xe0, 0x02, + 0x14, 0x21, 0x00, 0xf0, 0x27, 0xfe, 0x01, 0x23, 0x4f, 0xf4, 0x80, 0x72, + 0x08, 0x21, 0x00, 0xf0, 0x1b, 0xfe, 0x01, 0x23, 0x4f, 0xf4, 0x80, 0x12, + 0x14, 0x21, 0x09, 0xf1, 0x0c, 0x00, 0xff, 0xf7, 0xab, 0xfe, 0x01, 0x23, + 0x4f, 0xf4, 0x80, 0x72, 0x08, 0x21, 0x00, 0xf0, 0x0b, 0xfc, 0x01, 0x23, + 0x4f, 0xf4, 0x80, 0x52, 0x0c, 0x21, 0x09, 0xf1, 0x14, 0x00, 0xff, 0xf7, + 0x9d, 0xfe, 0x00, 0x21, 0xe0, 0xb2, 0x00, 0xf0, 0x3c, 0xfe, 0x01, 0x21, + 0xe0, 0xb2, 0x00, 0xf0, 0x38, 0xfe, 0x64, 0x1c, 0xe0, 0xb2, 0x08, 0x28, + 0x7f, 0xf4, 0x11, 0xaf, 0x9d, 0xf8, 0x18, 0x00, 0xb0, 0xb1, 0xdf, 0xf8, + 0xe0, 0x18, 0x0a, 0x68, 0xd2, 0xf8, 0xb8, 0x00, 0xc0, 0xf3, 0x07, 0x24, + 0x00, 0x98, 0x00, 0x25, 0x24, 0xfa, 0x05, 0xf1, 0xc9, 0x07, 0x44, 0xbf, + 0xe8, 0xb2, 0x12, 0xf0, 0xf3, 0xfc, 0x6d, 0x1c, 0xe9, 0xb2, 0x08, 0x29, + 0x01, 0xd0, 0x00, 0x28, 0xf2, 0xd0, 0x00, 0x90, 0xff, 0xf7, 0x2a, 0xfe, + 0x02, 0x90, 0x00, 0x24, 0x00, 0x98, 0x32, 0x25, 0x00, 0x28, 0x40, 0xf0, + 0xa8, 0x81, 0x02, 0x98, 0xe0, 0x40, 0xc1, 0x07, 0x40, 0xf1, 0x9e, 0x81, + 0x00, 0xf0, 0xe3, 0xfb, 0x07, 0x46, 0x4f, 0xf0, 0x00, 0x08, 0xdf, 0xf8, + 0x64, 0x0c, 0x00, 0xeb, 0xc4, 0x01, 0x01, 0x91, 0x51, 0xf8, 0x28, 0x90, + 0xdf, 0xf8, 0x58, 0x1c, 0x08, 0x68, 0x00, 0xeb, 0x84, 0x02, 0x00, 0x21, + 0x93, 0x6a, 0x6f, 0xf0, 0x7f, 0x42, 0x00, 0xf0, 0xa0, 0xfb, 0x09, 0xf1, + 0x04, 0x06, 0x00, 0xf0, 0xe6, 0xfd, 0x00, 0xf0, 0x23, 0xfe, 0x00, 0xf0, + 0xc2, 0xfd, 0x00, 0xf0, 0x1f, 0xfe, 0x00, 0xf0, 0xc5, 0xfb, 0x00, 0xf0, + 0x1b, 0xfe, 0x05, 0xfb, 0x08, 0xf0, 0x38, 0x44, 0x09, 0xf1, 0x40, 0x0a, + 0xd0, 0xf8, 0x25, 0x60, 0xdf, 0xf8, 0x84, 0x2d, 0x33, 0x46, 0x06, 0x21, + 0x00, 0xf0, 0xa4, 0xfd, 0x09, 0xf1, 0x54, 0x09, 0x33, 0x46, 0xdf, 0xf8, + 0x74, 0x2d, 0x06, 0x21, 0x00, 0xf0, 0x96, 0xfd, 0x00, 0xf0, 0xa5, 0xfd, + 0x00, 0xf0, 0x98, 0xfd, 0x00, 0xf0, 0xa1, 0xfd, 0x00, 0xf0, 0x8e, 0xfd, + 0x00, 0xf0, 0xa4, 0xfb, 0x00, 0xf0, 0x90, 0xfd, 0x00, 0xf0, 0xa0, 0xfb, + 0x00, 0xf0, 0x86, 0xfd, 0x00, 0xf0, 0xb5, 0xfd, 0x00, 0xf0, 0x88, 0xfd, + 0x00, 0xf0, 0xb1, 0xfd, 0x00, 0xf0, 0x7e, 0xfd, 0x08, 0xf1, 0x01, 0x08, + 0xb8, 0xf1, 0x01, 0x0f, 0xad, 0xdd, 0xdf, 0xf8, 0x34, 0x0d, 0x50, 0xf8, + 0x24, 0x90, 0x3d, 0x46, 0x05, 0xf1, 0x82, 0x07, 0x09, 0xf1, 0x04, 0x08, + 0xfb, 0x78, 0x4f, 0xf0, 0x40, 0x42, 0x1e, 0x21, 0x00, 0xf0, 0x62, 0xfb, + 0x3b, 0x78, 0x4f, 0xf4, 0x40, 0x42, 0x0e, 0x21, 0x00, 0xf0, 0x5c, 0xfb, + 0x05, 0xf1, 0x5f, 0x06, 0x4f, 0xf4, 0x40, 0x02, 0x73, 0x7f, 0x16, 0x21, + 0x00, 0xf0, 0x54, 0xfb, 0x09, 0xf1, 0x0c, 0x0a, 0x73, 0x7f, 0x00, 0xf0, + 0x5a, 0xfd, 0x73, 0x7f, 0x4f, 0xf4, 0x60, 0x22, 0x11, 0x21, 0x09, 0xf1, + 0x08, 0x00, 0xff, 0xf7, 0xe7, 0xfd, 0x05, 0xf1, 0xcd, 0x0b, 0x4f, 0xf4, + 0x60, 0x12, 0x9b, 0xf8, 0x01, 0x30, 0x13, 0x21, 0x00, 0xf0, 0x3e, 0xfb, + 0x9b, 0xf8, 0x00, 0x30, 0x00, 0xf0, 0x21, 0xfb, 0x00, 0xf0, 0x38, 0xfb, + 0x7b, 0x78, 0x4f, 0xf4, 0x40, 0x72, 0x00, 0xf0, 0x32, 0xfb, 0x3b, 0x79, + 0x60, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x2e, 0xfb, 0xbb, 0x78, 0x18, 0x22, + 0x03, 0x21, 0x00, 0xf0, 0x29, 0xfb, 0xbb, 0x79, 0x00, 0xf0, 0x51, 0xfd, + 0x20, 0x46, 0xff, 0xf7, 0x9e, 0xfd, 0x4f, 0xf4, 0x40, 0x22, 0x90, 0xf8, + 0x92, 0x30, 0x12, 0x21, 0x00, 0xf0, 0x2a, 0xfd, 0xdf, 0xf8, 0x54, 0x07, + 0x90, 0xf8, 0x34, 0x30, 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x10, 0x00, + 0xff, 0xf7, 0xb2, 0xfd, 0x01, 0x23, 0x4f, 0xf0, 0x80, 0x72, 0x18, 0x21, + 0x00, 0xf0, 0x0c, 0xfb, 0x00, 0xf0, 0x42, 0xfb, 0x00, 0xf0, 0x08, 0xfb, + 0x01, 0x23, 0x4f, 0xf0, 0x80, 0x52, 0x1c, 0x21, 0x00, 0xf0, 0x10, 0xfd, + 0x01, 0x23, 0x4f, 0xf4, 0x00, 0x02, 0x17, 0x21, 0x00, 0xf0, 0x0a, 0xfd, + 0x01, 0x23, 0x4f, 0xf4, 0x00, 0x32, 0x11, 0x21, 0x00, 0xf0, 0x04, 0xfd, + 0xdf, 0xf8, 0x7c, 0x0d, 0x50, 0xf8, 0x24, 0xa0, 0x33, 0x7f, 0x18, 0x22, + 0x03, 0x21, 0x00, 0xf0, 0xfb, 0xfc, 0xf3, 0x7e, 0x00, 0xf0, 0x07, 0xfd, + 0xb3, 0x7e, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0xf3, 0xfc, 0x73, 0x7e, + 0x00, 0xf0, 0x0d, 0xfd, 0xb0, 0x79, 0x01, 0x28, 0x0c, 0xbf, 0x01, 0x23, + 0x00, 0x23, 0x4f, 0xf4, 0x80, 0x72, 0x08, 0x21, 0x00, 0xf0, 0xe6, 0xfc, + 0x2d, 0x35, 0x09, 0xf1, 0x08, 0x0b, 0x6b, 0x79, 0x07, 0x22, 0x00, 0x21, + 0x00, 0xf0, 0xd6, 0xfa, 0x2b, 0x78, 0x4f, 0xf4, 0xe0, 0x62, 0x08, 0x21, + 0x00, 0xf0, 0xd0, 0xfa, 0x6b, 0x78, 0x38, 0x22, 0x03, 0x21, 0x00, 0xf0, + 0xcb, 0xfa, 0x09, 0xf1, 0x14, 0x05, 0x73, 0x79, 0x07, 0x22, 0x00, 0x21, + 0x28, 0x46, 0xff, 0xf7, 0x5d, 0xfd, 0x33, 0x78, 0x4f, 0xf4, 0xe0, 0x62, + 0x08, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x56, 0xfd, 0x73, 0x78, 0x70, 0x22, + 0x04, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x50, 0xfd, 0x7b, 0x79, 0x00, 0xf0, + 0xc5, 0xfa, 0x00, 0xf0, 0xe6, 0xfd, 0x0a, 0xf1, 0x0c, 0x00, 0xff, 0xf7, + 0x47, 0xfd, 0x00, 0x27, 0x32, 0x25, 0x01, 0x98, 0x50, 0xf8, 0x27, 0x60, + 0x00, 0xf0, 0xbd, 0xfa, 0x80, 0x46, 0x00, 0x23, 0x04, 0x22, 0x02, 0x21, + 0x00, 0xf0, 0x86, 0xfa, 0x05, 0xfb, 0x07, 0xf0, 0x40, 0x44, 0x00, 0xf1, + 0x2a, 0x08, 0x01, 0x22, 0x98, 0xf8, 0x01, 0x30, 0x00, 0xf0, 0xa4, 0xfa, + 0x98, 0xf8, 0x00, 0x30, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0x02, 0xfd, + 0x7f, 0x1c, 0x01, 0x2f, 0xe1, 0xdd, 0x00, 0xf0, 0xa2, 0xfa, 0x07, 0x46, + 0xdf, 0xf8, 0x9c, 0x0c, 0xdf, 0xf8, 0x9c, 0x2c, 0x50, 0xf8, 0x24, 0x90, + 0x07, 0xf1, 0xbb, 0x06, 0x09, 0xf1, 0x38, 0x08, 0x33, 0x78, 0x10, 0x21, + 0x00, 0xf0, 0x76, 0xfa, 0x73, 0x78, 0x4f, 0xf6, 0xfc, 0x72, 0x02, 0x21, + 0x00, 0xf0, 0x70, 0xfa, 0xb3, 0x78, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, + 0x6b, 0xfa, 0xf3, 0x78, 0x01, 0x22, 0x00, 0xf0, 0x80, 0xfa, 0x09, 0xf1, + 0x3c, 0x08, 0x33, 0x79, 0x4f, 0xf4, 0xff, 0x02, 0x0f, 0x21, 0x00, 0xf0, + 0x5f, 0xfa, 0x73, 0x79, 0x4f, 0xf4, 0xf8, 0x42, 0x0a, 0x21, 0x00, 0xf0, + 0x59, 0xfa, 0xb3, 0x79, 0x4f, 0xf4, 0xfc, 0x72, 0x03, 0x21, 0x00, 0xf0, + 0x53, 0xfa, 0xf3, 0x79, 0x00, 0xf0, 0x68, 0xfa, 0x33, 0x7a, 0x6f, 0xf0, + 0x7e, 0x42, 0x00, 0x21, 0x09, 0xf1, 0x40, 0x00, 0xff, 0xf7, 0xe8, 0xfc, + 0x97, 0xf8, 0x8d, 0x30, 0x01, 0x22, 0x00, 0xf0, 0x65, 0xfc, 0x00, 0xf0, + 0x5e, 0xfa, 0x07, 0x46, 0x02, 0x22, 0x97, 0xf8, 0x8e, 0x30, 0x01, 0x21, + 0x00, 0xf0, 0x42, 0xfc, 0x97, 0xf8, 0x8e, 0x00, 0x01, 0x28, 0x0b, 0xd1, + 0x09, 0xf1, 0x04, 0x09, 0x00, 0x20, 0x07, 0xeb, 0x40, 0x01, 0x40, 0x1c, + 0xb1, 0xf8, 0x8f, 0x20, 0x29, 0xf8, 0x02, 0x2b, 0x0a, 0x28, 0xf6, 0xd1, + 0x64, 0x1c, 0xe4, 0xb2, 0x08, 0x2c, 0x7f, 0xf4, 0x58, 0xae, 0x9d, 0xf8, + 0x18, 0x00, 0x00, 0x28, 0x00, 0xf0, 0x54, 0x81, 0xff, 0xf7, 0x6e, 0xfc, + 0x04, 0x46, 0x00, 0x98, 0x00, 0x25, 0x50, 0xb9, 0x24, 0xfa, 0x05, 0xf1, + 0xc9, 0x07, 0x44, 0xbf, 0xe8, 0xb2, 0x12, 0xf0, 0x88, 0xfc, 0x6d, 0x1c, + 0xe9, 0xb2, 0x08, 0x29, 0xf3, 0xd1, 0x00, 0x25, 0x04, 0x94, 0x00, 0x28, + 0x40, 0xf0, 0x3d, 0x81, 0x04, 0x99, 0xe9, 0x40, 0xca, 0x07, 0x40, 0xf1, + 0x33, 0x81, 0x03, 0x90, 0xe8, 0xb2, 0x06, 0xf0, 0x4f, 0xfb, 0x04, 0x00, + 0x03, 0xd1, 0x4f, 0xf6, 0x77, 0x70, 0x03, 0x90, 0x27, 0xe1, 0xdf, 0xf8, + 0x94, 0x1b, 0xdf, 0xf8, 0x94, 0x0b, 0x5f, 0xfa, 0x85, 0xf9, 0x51, 0xf8, + 0x29, 0x70, 0x50, 0xf8, 0x29, 0x10, 0x00, 0x91, 0x00, 0xf0, 0xf7, 0xf9, + 0x00, 0xf0, 0xe7, 0xf9, 0x00, 0xf0, 0xf3, 0xf9, 0x00, 0xf0, 0xdf, 0xf9, + 0x00, 0xf0, 0xef, 0xf9, 0x00, 0xf0, 0xd7, 0xf9, 0x07, 0xf1, 0x8c, 0x08, + 0x00, 0xf0, 0xe9, 0xf9, 0x00, 0xf0, 0xde, 0xf9, 0x07, 0xf1, 0x9c, 0x06, + 0x00, 0xf0, 0xe3, 0xf9, 0x00, 0xf0, 0x50, 0xfc, 0x07, 0xf1, 0xac, 0x0a, + 0x00, 0xf0, 0xdd, 0xf9, 0x00, 0xf0, 0xe0, 0xfb, 0x00, 0xf0, 0x0d, 0xfa, + 0x00, 0xf0, 0xc9, 0xf9, 0x00, 0xf0, 0x09, 0xfa, 0x00, 0xf0, 0xc1, 0xf9, + 0x00, 0xf0, 0x05, 0xfa, 0x00, 0xf0, 0xb9, 0xf9, 0x00, 0xf0, 0x01, 0xfa, + 0x00, 0xf0, 0xc2, 0xf9, 0x00, 0xf0, 0xfd, 0xf9, 0x00, 0xf0, 0x36, 0xfc, + 0x00, 0xf0, 0xf9, 0xf9, 0x00, 0xf0, 0xc8, 0xfb, 0x04, 0xf2, 0x0c, 0x7b, + 0x40, 0xf2, 0xff, 0x32, 0xbb, 0xf8, 0x00, 0x30, 0x00, 0x21, 0x07, 0xf1, + 0x48, 0x00, 0xff, 0xf7, 0x4f, 0xfc, 0xb4, 0xf8, 0x61, 0x37, 0x00, 0xf0, + 0x86, 0xf9, 0x07, 0xf1, 0x84, 0x00, 0xff, 0xf7, 0x47, 0xfc, 0xbb, 0xf8, + 0x02, 0x10, 0x02, 0x91, 0x00, 0x21, 0xbb, 0xf8, 0x04, 0x20, 0x02, 0x9b, + 0x01, 0x92, 0x40, 0xf2, 0xff, 0x32, 0xbb, 0xf8, 0x06, 0xb0, 0x00, 0xf0, + 0x94, 0xf9, 0x01, 0x9b, 0x00, 0xf0, 0x71, 0xf9, 0x00, 0xf0, 0x8b, 0xf9, + 0x00, 0xf0, 0x6c, 0xf9, 0x00, 0xf0, 0x83, 0xf9, 0x02, 0x9b, 0x40, 0xf2, + 0xff, 0x32, 0x00, 0xf0, 0xa4, 0xf9, 0x01, 0x9b, 0x40, 0xf2, 0xff, 0x32, + 0x00, 0xf0, 0x9a, 0xf9, 0x00, 0xf0, 0x5e, 0xf9, 0x00, 0xf0, 0x90, 0xfb, + 0xdf, 0xf8, 0xa8, 0x0a, 0x50, 0xf8, 0x29, 0x00, 0x50, 0xf8, 0x28, 0x3f, + 0x02, 0x99, 0x01, 0x9a, 0x03, 0xf0, 0x40, 0x43, 0x0b, 0x43, 0x43, 0xea, + 0x82, 0x23, 0x43, 0xea, 0x0b, 0x53, 0x4f, 0xf0, 0xff, 0x32, 0x00, 0x21, + 0xff, 0xf7, 0x0e, 0xfc, 0x04, 0xf2, 0xa9, 0x7b, 0x9b, 0xf8, 0x06, 0x30, + 0x00, 0xf0, 0x8e, 0xfb, 0x94, 0xf8, 0x0b, 0x37, 0x4f, 0xf4, 0x40, 0x32, + 0x10, 0x21, 0x07, 0xf1, 0x48, 0x00, 0xff, 0xf7, 0xff, 0xfb, 0x04, 0xf2, + 0x54, 0x74, 0x4f, 0xf4, 0x40, 0x32, 0x23, 0x7b, 0x10, 0x21, 0x07, 0xf1, + 0x84, 0x00, 0xff, 0xf7, 0xf5, 0xfb, 0x9b, 0xf8, 0x07, 0x30, 0x00, 0x98, + 0x4f, 0xf4, 0x60, 0x42, 0x0d, 0x21, 0xff, 0xf7, 0xed, 0xfb, 0x9b, 0xf8, + 0x08, 0x30, 0x00, 0x98, 0x00, 0xf0, 0x2f, 0xf9, 0xff, 0xf7, 0xe6, 0xfb, + 0x9b, 0xf8, 0x09, 0x30, 0x00, 0x98, 0x4f, 0xf4, 0x60, 0x12, 0x13, 0x21, + 0xff, 0xf7, 0xde, 0xfb, 0x23, 0x78, 0x00, 0xf0, 0x1e, 0xf9, 0x00, 0xf0, + 0x34, 0xf9, 0x63, 0x78, 0x00, 0xf0, 0x19, 0xf9, 0x00, 0xf0, 0x2b, 0xf9, + 0xa3, 0x78, 0x00, 0xf0, 0x14, 0xf9, 0x00, 0xf0, 0x22, 0xf9, 0x9b, 0xf8, + 0x00, 0x30, 0x00, 0xf0, 0x0e, 0xf9, 0x00, 0xf0, 0x29, 0xf9, 0x9b, 0xf8, + 0x01, 0x30, 0x00, 0xf0, 0x08, 0xf9, 0x00, 0xf0, 0x9b, 0xfb, 0x9b, 0xf8, + 0x02, 0x30, 0x00, 0xf0, 0x02, 0xf9, 0x00, 0xf0, 0x2b, 0xfb, 0xe3, 0x78, + 0x00, 0xf0, 0xf9, 0xf8, 0x00, 0xf0, 0x13, 0xf9, 0x23, 0x79, 0x00, 0xf0, + 0xf4, 0xf8, 0x00, 0xf0, 0x0a, 0xf9, 0x63, 0x79, 0x00, 0xf0, 0xef, 0xf8, + 0x00, 0xf0, 0x01, 0xf9, 0x9b, 0xf8, 0x03, 0x30, 0x00, 0xf0, 0xe9, 0xf8, + 0x00, 0xf0, 0x08, 0xf9, 0x9b, 0xf8, 0x04, 0x30, 0x00, 0xf0, 0xe3, 0xf8, + 0x00, 0xf0, 0x7a, 0xfb, 0x9b, 0xf8, 0x05, 0x30, 0x00, 0xf0, 0xdd, 0xf8, + 0x00, 0xf0, 0x0a, 0xfb, 0x00, 0xf0, 0x03, 0xf9, 0x38, 0x1d, 0xff, 0xf7, + 0x97, 0xfb, 0x00, 0x98, 0x00, 0xf0, 0x2f, 0xfc, 0x2c, 0x30, 0xff, 0xf7, + 0x91, 0xfb, 0x00, 0xf0, 0x27, 0xf9, 0x07, 0xf1, 0x18, 0x00, 0xff, 0xf7, + 0x8b, 0xfb, 0x00, 0xf0, 0x21, 0xf9, 0x07, 0xf1, 0x28, 0x00, 0xff, 0xf7, + 0x85, 0xfb, 0x00, 0xf0, 0x1b, 0xf9, 0x07, 0xf1, 0x38, 0x00, 0xff, 0xf7, + 0x7f, 0xfb, 0xdf, 0xf8, 0x50, 0x09, 0x50, 0xf8, 0x29, 0x00, 0x01, 0x23, + 0x4f, 0xf0, 0x80, 0x52, 0x1c, 0x21, 0x00, 0xf5, 0xda, 0x70, 0xff, 0xf7, + 0x73, 0xfb, 0x03, 0x98, 0x6d, 0x1c, 0xe9, 0xb2, 0x08, 0x29, 0x7f, 0xf4, + 0xc0, 0xae, 0x00, 0x90, 0xff, 0xf7, 0x38, 0xfb, 0x80, 0x46, 0x00, 0x98, + 0xdf, 0xf8, 0x38, 0x59, 0xdf, 0xf8, 0x90, 0x92, 0xa9, 0x4f, 0x00, 0x26, + 0x00, 0x28, 0x40, 0xf0, 0x93, 0x80, 0x28, 0xfa, 0x06, 0xf0, 0xc0, 0x07, + 0x40, 0xf1, 0x89, 0x80, 0xf0, 0xb2, 0xd9, 0xf8, 0x00, 0x10, 0x55, 0xf8, + 0x20, 0x40, 0x70, 0x22, 0x12, 0xfb, 0x00, 0xf2, 0x0a, 0x44, 0x02, 0xf5, + 0x32, 0x6a, 0x04, 0xf1, 0x14, 0x0b, 0xda, 0xf8, 0x14, 0x30, 0xdf, 0xf8, + 0x04, 0x29, 0x04, 0x21, 0x00, 0xf0, 0xac, 0xf8, 0x00, 0xf0, 0xb2, 0xf8, + 0x00, 0xf0, 0xc6, 0xf8, 0x01, 0x23, 0x4f, 0xf0, 0x00, 0x52, 0x1d, 0x21, + 0x00, 0xf0, 0xa2, 0xf8, 0xda, 0xf8, 0x10, 0x30, 0xdf, 0xf8, 0xe4, 0x28, + 0x04, 0xf1, 0xe8, 0x0b, 0x05, 0x21, 0x00, 0xf0, 0x99, 0xf8, 0x00, 0xf0, + 0x9f, 0xf8, 0x00, 0xf0, 0xaf, 0xf8, 0x00, 0xf0, 0x93, 0xf8, 0x00, 0xf0, + 0xaf, 0xf8, 0x0a, 0xf1, 0x22, 0x0a, 0x20, 0x22, 0x9a, 0xf8, 0x04, 0x30, + 0x05, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x22, 0xfb, 0x9a, 0xf8, 0x03, 0x30, + 0x10, 0x22, 0x04, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x1b, 0xfb, 0x9a, 0xf8, + 0x00, 0x30, 0x07, 0x22, 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x14, 0xfb, + 0x04, 0xf1, 0x04, 0x0b, 0x9a, 0xf8, 0x07, 0x30, 0x4f, 0xf0, 0xe0, 0x72, + 0x16, 0x21, 0x00, 0xf0, 0x71, 0xf8, 0x9a, 0xf8, 0x0c, 0x30, 0x00, 0xf0, + 0x4e, 0xf8, 0x00, 0xf0, 0x6b, 0xf8, 0x9a, 0xf8, 0x05, 0x30, 0x4f, 0xf4, + 0x80, 0x42, 0x0e, 0x21, 0x00, 0xf0, 0x64, 0xf8, 0x9a, 0xf8, 0x09, 0x30, + 0x00, 0xf0, 0x5d, 0xf8, 0x9a, 0xf8, 0x0a, 0x30, 0x4f, 0xf4, 0x40, 0x62, + 0x0a, 0x21, 0x00, 0xf0, 0x59, 0xf8, 0x9a, 0xf8, 0x08, 0x30, 0x60, 0x22, + 0x05, 0x21, 0x00, 0xf0, 0x53, 0xf8, 0x9a, 0xf8, 0x0b, 0x30, 0x0c, 0x22, + 0x00, 0xf0, 0x58, 0xf8, 0x9a, 0xf8, 0x06, 0x30, 0x03, 0x22, 0x00, 0x21, + 0x00, 0xf0, 0x48, 0xf8, 0x97, 0xf8, 0x34, 0x30, 0x4f, 0xf0, 0x7f, 0x42, + 0x18, 0x21, 0x04, 0xf1, 0x08, 0x00, 0xff, 0xf7, 0xd9, 0xfa, 0x02, 0x23, + 0x4f, 0xf4, 0x40, 0x52, 0x0c, 0x21, 0x04, 0xf1, 0x2c, 0x00, 0xff, 0xf7, + 0xd1, 0xfa, 0x76, 0x1c, 0xf0, 0xb2, 0x02, 0x28, 0x7f, 0xf4, 0x6d, 0xaf, + 0x01, 0xf0, 0xf0, 0xfc, 0x00, 0x98, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x5b, 0x46, 0x40, 0xf2, 0xff, 0x32, 0x00, 0x21, 0x70, 0x47, 0x4f, 0xf0, + 0x7f, 0x52, 0x16, 0x21, 0x70, 0x47, 0x4f, 0xf4, 0x7f, 0x32, 0x0a, 0x21, + 0x70, 0x47, 0x4f, 0xf4, 0xe0, 0x22, 0x10, 0x21, 0x70, 0x47, 0x01, 0x21, + 0x30, 0x1d, 0xff, 0xf7, 0xb1, 0xba, 0x09, 0xf1, 0x24, 0x00, 0xff, 0xf7, + 0xad, 0xba, 0x07, 0xf1, 0x70, 0x00, 0xff, 0xf7, 0xa9, 0xba, 0x07, 0xf1, + 0x60, 0x00, 0xff, 0xf7, 0xa5, 0xba, 0x07, 0xf1, 0x50, 0x00, 0xff, 0xf7, + 0xa1, 0xba, 0x08, 0x21, 0x40, 0x46, 0xff, 0xf7, 0x9d, 0xba, 0x4f, 0xf4, + 0x40, 0x52, 0x0c, 0x21, 0x58, 0x46, 0xff, 0xf7, 0x97, 0xba, 0x00, 0x23, + 0x4f, 0xf0, 0x00, 0x42, 0x1f, 0x21, 0x70, 0x47, 0x00, 0x23, 0x04, 0x22, + 0x02, 0x21, 0x58, 0x46, 0xff, 0xf7, 0x8c, 0xba, 0x00, 0x21, 0x30, 0x46, + 0xff, 0xf7, 0x88, 0xba, 0x07, 0x22, 0x00, 0x21, 0x40, 0x46, 0xff, 0xf7, + 0x83, 0xba, 0x20, 0x46, 0xff, 0xf7, 0x66, 0xba, 0x01, 0x23, 0x10, 0x22, + 0x04, 0x21, 0x70, 0x47, 0x01, 0x23, 0x08, 0x22, 0x03, 0x21, 0x58, 0x46, + 0xff, 0xf7, 0x76, 0xba, 0x01, 0x23, 0x4f, 0xf0, 0x00, 0x62, 0x1b, 0x21, + 0x30, 0x46, 0xff, 0xf7, 0x6f, 0xba, 0x01, 0x23, 0x4f, 0xf0, 0x80, 0x52, + 0x1c, 0x21, 0x30, 0x46, 0xff, 0xf7, 0x68, 0xba, 0x01, 0x23, 0x4f, 0xf0, + 0x00, 0x72, 0x19, 0x21, 0x70, 0x47, 0x01, 0x23, 0x4f, 0xf0, 0x80, 0x42, + 0x1e, 0x21, 0x70, 0x47, 0x00, 0x28, 0x00, 0xd1, 0x70, 0x47, 0x10, 0xb5, + 0x00, 0xf0, 0xe4, 0xfa, 0xdf, 0xf8, 0x24, 0x07, 0x22, 0x4c, 0xff, 0xf7, + 0x4a, 0xfa, 0x00, 0xf0, 0xdd, 0xfa, 0xdf, 0xf8, 0x1c, 0x07, 0xff, 0xf7, + 0x44, 0xfa, 0x00, 0xf0, 0xd7, 0xfa, 0xdf, 0xf8, 0x14, 0x07, 0xff, 0xf7, + 0x3e, 0xfa, 0x00, 0xf0, 0xd1, 0xfa, 0xdf, 0xf8, 0x0c, 0x07, 0xff, 0xf7, + 0x38, 0xfa, 0x12, 0x48, 0x00, 0x68, 0x81, 0x69, 0x00, 0xee, 0x10, 0x1a, + 0xc1, 0x69, 0x00, 0xee, 0x90, 0x1a, 0xb8, 0xee, 0x40, 0x0a, 0xf8, 0xee, + 0x60, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0xea, 0xf7, 0xd3, 0xff, 0xbd, 0xee, + 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x20, 0x75, 0xe0, 0x22, 0x23, 0x7d, + 0x08, 0x48, 0x05, 0x21, 0xff, 0xf7, 0x1d, 0xfa, 0x94, 0xf8, 0x34, 0x30, + 0xdf, 0xf8, 0xcc, 0x06, 0xbd, 0xe8, 0x10, 0x40, 0xff, 0x22, 0x00, 0x21, + 0xff, 0xf7, 0x13, 0xba, 0xb4, 0x76, 0x02, 0x20, 0xb0, 0x76, 0x02, 0x20, + 0x17, 0x00, 0x00, 0x47, 0x0c, 0x65, 0x03, 0x20, 0x2d, 0x04, 0x00, 0x47, + 0x19, 0x00, 0x00, 0x47, 0xfc, 0x64, 0x03, 0x20, 0x2d, 0xe9, 0xf8, 0x4f, + 0x80, 0x46, 0x00, 0x20, 0x5f, 0xea, 0x08, 0x01, 0x00, 0x90, 0xdf, 0xf8, + 0x98, 0x96, 0x29, 0xd0, 0xdf, 0xf8, 0x94, 0x46, 0x00, 0x23, 0x40, 0x22, + 0x06, 0x21, 0x00, 0xf0, 0x93, 0xf9, 0x00, 0xf0, 0x70, 0xf9, 0x00, 0xf0, + 0x8f, 0xf9, 0xd9, 0xf8, 0x00, 0x00, 0x90, 0xf8, 0x2a, 0x30, 0x00, 0xf0, + 0x87, 0xf9, 0xd9, 0xf8, 0x00, 0x00, 0x90, 0xf8, 0x2b, 0x30, 0x02, 0x22, + 0x01, 0x21, 0x00, 0xf0, 0x81, 0xf9, 0xd9, 0xf8, 0x00, 0x00, 0xdf, 0xf8, + 0x64, 0x46, 0x90, 0xf8, 0x2c, 0x30, 0x0f, 0x22, 0x00, 0xf0, 0x77, 0xf9, + 0xd9, 0xf8, 0x00, 0x00, 0x90, 0xf8, 0x2d, 0x30, 0x70, 0x22, 0x04, 0x21, + 0x00, 0xf0, 0x70, 0xf9, 0xff, 0xf7, 0x9a, 0xf9, 0x05, 0x46, 0x4f, 0xf0, + 0x00, 0x0a, 0xdf, 0xf8, 0x40, 0x46, 0x25, 0xfa, 0x0a, 0xf0, 0xc0, 0x07, + 0x2b, 0xd5, 0x5f, 0xfa, 0x8a, 0xf0, 0x54, 0xf8, 0x20, 0xb0, 0xff, 0xf7, + 0xa4, 0xf9, 0x06, 0x46, 0x0b, 0xf2, 0x2c, 0x77, 0x00, 0xf0, 0x39, 0xf9, + 0x00, 0xf0, 0x26, 0xf9, 0x00, 0xf0, 0x59, 0xf9, 0x00, 0xf0, 0x22, 0xf9, + 0x16, 0xf8, 0xcb, 0x3f, 0x00, 0xf0, 0x40, 0xf9, 0x73, 0x78, 0x02, 0x22, + 0x01, 0x21, 0x00, 0xf0, 0x19, 0xf9, 0xf3, 0x78, 0x07, 0x22, 0x00, 0x21, + 0x0b, 0xf5, 0xe6, 0x60, 0xff, 0xf7, 0xae, 0xf9, 0x70, 0x78, 0x01, 0x28, + 0x03, 0xd1, 0x00, 0xf0, 0x22, 0xf9, 0x00, 0xf0, 0x0b, 0xf9, 0x00, 0xf0, + 0x16, 0xf9, 0x00, 0xf0, 0x07, 0xf9, 0x0a, 0xf1, 0x01, 0x0a, 0x5f, 0xfa, + 0x8a, 0xf0, 0x08, 0x28, 0xc9, 0xd1, 0xff, 0xf7, 0x51, 0xf9, 0x83, 0x46, + 0x00, 0x27, 0x2b, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x59, 0xd5, 0xf8, 0xb2, + 0xff, 0xf7, 0x78, 0xf9, 0x06, 0x46, 0xdf, 0xf8, 0xbc, 0x05, 0xfc, 0xb2, + 0x50, 0xf8, 0x24, 0x50, 0x05, 0xf1, 0x51, 0x0a, 0x00, 0xf0, 0xfd, 0xf8, + 0x00, 0xf0, 0x1e, 0xfa, 0x00, 0xf0, 0x1d, 0xf9, 0x00, 0xf0, 0x1a, 0xfa, + 0x16, 0xf8, 0xab, 0x3f, 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x14, 0xfa, + 0x73, 0x78, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0x0f, 0xfa, 0xf3, 0x78, + 0x07, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x52, 0x00, 0xff, 0xf7, 0x67, 0xf9, + 0x70, 0x78, 0x01, 0x28, 0x02, 0xd1, 0x00, 0x23, 0x00, 0xf0, 0x00, 0xfa, + 0x00, 0xf0, 0xd9, 0xf8, 0x00, 0xf0, 0xfe, 0xf9, 0xf8, 0xb2, 0xff, 0xf7, + 0x49, 0xf9, 0x05, 0x46, 0xdf, 0xf8, 0x60, 0x05, 0x50, 0xf8, 0x24, 0xa0, + 0x0a, 0xf2, 0xf2, 0x34, 0x00, 0xf0, 0xcf, 0xf8, 0x00, 0xf0, 0xee, 0xf8, + 0x00, 0xf0, 0xf3, 0xf8, 0x15, 0xf8, 0xb3, 0x3f, 0x00, 0xf0, 0xe6, 0xf8, + 0x6b, 0x78, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0xe3, 0xf8, 0xeb, 0x78, + 0x0a, 0xf2, 0xf3, 0x3a, 0x07, 0x22, 0x00, 0x21, 0x00, 0xf0, 0xde, 0xf9, + 0x68, 0x78, 0x01, 0x28, 0x03, 0xd1, 0x00, 0xf0, 0xba, 0xf8, 0x00, 0xf0, + 0xd5, 0xf8, 0x00, 0xf0, 0xae, 0xf8, 0x00, 0xf0, 0xd1, 0xf8, 0x7f, 0x1c, + 0xf8, 0xb2, 0x08, 0x28, 0x9d, 0xd1, 0xff, 0xf7, 0x03, 0xf9, 0x82, 0x46, + 0x00, 0x26, 0xdf, 0xf8, 0x08, 0x55, 0x2a, 0xfa, 0x06, 0xf0, 0xc0, 0x07, + 0x2f, 0xd5, 0xf0, 0xb2, 0xd9, 0xf8, 0x00, 0x10, 0x55, 0xf8, 0x20, 0x70, + 0x70, 0x22, 0x12, 0xfb, 0x00, 0xf2, 0x0a, 0x44, 0x02, 0xf5, 0x32, 0x6b, + 0x07, 0xf2, 0xf2, 0x34, 0x00, 0xf0, 0x93, 0xf8, 0x00, 0xf0, 0xb2, 0xf8, + 0x00, 0xf0, 0xb7, 0xf8, 0x1b, 0xf8, 0x5f, 0x3f, 0x00, 0xf0, 0xaa, 0xf8, + 0x9b, 0xf8, 0x01, 0x30, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0xa6, 0xf8, + 0x9b, 0xf8, 0x03, 0x30, 0x07, 0xf2, 0xf3, 0x37, 0x07, 0x22, 0x00, 0xf0, + 0x99, 0xf8, 0x9b, 0xf8, 0x01, 0x00, 0x01, 0x28, 0x03, 0xd1, 0x00, 0xf0, + 0x7c, 0xf8, 0x00, 0xf0, 0x97, 0xf8, 0x00, 0xf0, 0x70, 0xf8, 0x00, 0xf0, + 0x93, 0xf8, 0x76, 0x1c, 0xf0, 0xb2, 0x02, 0x28, 0xc7, 0xd1, 0xb8, 0xf1, + 0x00, 0x0f, 0x4d, 0xd0, 0xff, 0xf7, 0xa4, 0xf8, 0xdd, 0xf8, 0x00, 0x80, + 0xdf, 0xf8, 0x44, 0x64, 0x07, 0x46, 0x00, 0x24, 0x27, 0xfa, 0x04, 0xf0, + 0xc0, 0x07, 0x3b, 0xd5, 0xe0, 0xb2, 0x05, 0xf0, 0x95, 0xff, 0x4f, 0xf0, + 0x00, 0x08, 0x10, 0xb9, 0x4f, 0xf6, 0x77, 0x78, 0x2f, 0xe0, 0xe1, 0xb2, + 0x56, 0xf8, 0x21, 0x90, 0x42, 0xf2, 0xc1, 0x71, 0x45, 0x18, 0x01, 0x22, + 0x2b, 0x78, 0x00, 0xf0, 0x59, 0xf8, 0x09, 0xf1, 0x04, 0x0a, 0x6b, 0x78, + 0x00, 0xf0, 0x5d, 0xf8, 0xab, 0x78, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, + 0x3b, 0xf8, 0xeb, 0x78, 0x00, 0xf0, 0x47, 0xf8, 0x2b, 0x79, 0x4f, 0xf4, + 0x40, 0x72, 0x08, 0x21, 0x00, 0xf0, 0x2c, 0xf8, 0x6b, 0x79, 0x03, 0x22, + 0x00, 0xf0, 0x42, 0xf8, 0xab, 0x79, 0x1c, 0x22, 0x02, 0x21, 0x00, 0xf0, + 0x23, 0xf8, 0xeb, 0x79, 0xe0, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x1e, 0xf8, + 0xab, 0x7d, 0x4f, 0xf0, 0x40, 0x72, 0x00, 0xf0, 0x18, 0xf8, 0xb8, 0xf1, + 0x00, 0x0f, 0x03, 0xd1, 0x64, 0x1c, 0xe0, 0xb2, 0x08, 0x28, 0xbb, 0xd1, + 0xcd, 0xf8, 0x00, 0x80, 0x00, 0x98, 0xbd, 0xe8, 0xf2, 0x8f, 0x00, 0x00, + 0x31, 0x04, 0x00, 0x47, 0x88, 0x8e, 0x04, 0x01, 0xfe, 0xff, 0xff, 0x01, + 0x88, 0x94, 0x04, 0x01, 0x38, 0x46, 0xff, 0xf7, 0x99, 0xb8, 0x18, 0x21, + 0x48, 0x46, 0xff, 0xf7, 0x95, 0xb8, 0x4f, 0xf4, 0xe0, 0x42, 0x0c, 0x21, + 0x50, 0x46, 0xff, 0xf7, 0x8f, 0xb8, 0x00, 0x23, 0x10, 0x22, 0x04, 0x21, + 0x70, 0x47, 0x00, 0x23, 0x20, 0x22, 0x05, 0x21, 0x70, 0x47, 0x00, 0x23, + 0x08, 0x22, 0x03, 0x21, 0x70, 0x47, 0x04, 0x22, 0x02, 0x21, 0x50, 0x46, + 0xff, 0xf7, 0x7e, 0xb8, 0x00, 0x21, 0x48, 0x46, 0xff, 0xf7, 0x7a, 0xb8, + 0x01, 0x22, 0x00, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x75, 0xb8, 0x01, 0x22, + 0x00, 0x21, 0x50, 0x46, 0xff, 0xf7, 0x70, 0xb8, 0x00, 0x21, 0x38, 0x46, + 0xff, 0xf7, 0x63, 0xb8, 0x01, 0x22, 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, + 0x5e, 0xb8, 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, 0x70, 0x47, 0x01, 0x23, + 0x20, 0x22, 0x05, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x54, 0xb8, 0x70, 0xb5, + 0x0c, 0x46, 0xdf, 0xf8, 0x5c, 0x13, 0x01, 0xeb, 0xc0, 0x03, 0x53, 0xf8, + 0x24, 0x50, 0xff, 0xf7, 0x2e, 0xf8, 0x32, 0x21, 0x4c, 0x43, 0x01, 0x19, + 0x01, 0xf1, 0x3a, 0x04, 0x01, 0x22, 0xa3, 0x7a, 0x00, 0x21, 0x28, 0x1d, + 0xff, 0xf7, 0x48, 0xf8, 0x05, 0xf1, 0x50, 0x06, 0x23, 0x78, 0x4f, 0xf4, + 0x80, 0x12, 0x14, 0x21, 0x00, 0xf0, 0x18, 0xf8, 0x63, 0x78, 0x10, 0x22, + 0x04, 0x21, 0x05, 0xf1, 0x54, 0x00, 0xff, 0xf7, 0x39, 0xf8, 0xa3, 0x78, + 0x30, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x4f, 0xf0, 0x80, 0x52, 0x1c, 0x21, + 0xff, 0xf7, 0x30, 0xb8, 0xc8, 0x8e, 0x04, 0x01, 0xb8, 0x76, 0x02, 0x20, + 0x00, 0x23, 0x4f, 0xf0, 0x00, 0x52, 0x1d, 0x21, 0x30, 0x46, 0xff, 0xf7, + 0x25, 0xb8, 0x2d, 0xe9, 0xf8, 0x4f, 0x00, 0x29, 0x40, 0xf0, 0x9a, 0x80, + 0x04, 0x46, 0x01, 0x23, 0xf0, 0x22, 0x04, 0x21, 0xb8, 0x48, 0xff, 0xf7, + 0x10, 0xf8, 0x01, 0x23, 0xf0, 0x22, 0x04, 0x21, 0xb6, 0x48, 0xff, 0xf7, + 0x0a, 0xf8, 0x01, 0x23, 0xf0, 0x22, 0x04, 0x21, 0xb4, 0x48, 0xff, 0xf7, + 0x04, 0xf8, 0x01, 0x2c, 0x04, 0xd1, 0x00, 0xf0, 0x95, 0xf8, 0xb2, 0x48, + 0xfe, 0xf7, 0xfd, 0xff, 0xb1, 0x4e, 0xdf, 0xf8, 0xc8, 0xb2, 0x35, 0x68, + 0x05, 0xf1, 0x22, 0x08, 0x01, 0x23, 0x08, 0x22, 0x03, 0x21, 0x40, 0x46, + 0xfe, 0xf7, 0xf1, 0xff, 0x77, 0x68, 0x07, 0xf1, 0x22, 0x0a, 0x01, 0x23, + 0x00, 0xf0, 0x8a, 0xf8, 0xb6, 0x68, 0x06, 0xf1, 0x22, 0x09, 0x01, 0x23, + 0x08, 0x22, 0x03, 0x21, 0x48, 0x46, 0xfe, 0xf7, 0xe2, 0xff, 0x01, 0x23, + 0x02, 0x22, 0x01, 0x21, 0x48, 0x46, 0xfe, 0xf7, 0xdc, 0xff, 0xff, 0xf7, + 0x7c, 0xff, 0x58, 0x46, 0xfe, 0xf7, 0xd7, 0xff, 0x20, 0x22, 0x05, 0x21, + 0x58, 0x46, 0xfe, 0xf7, 0xcd, 0xff, 0x8d, 0xf8, 0x00, 0x00, 0x00, 0x23, + 0x80, 0x22, 0x07, 0x21, 0x58, 0x46, 0xfe, 0xf7, 0xca, 0xff, 0x24, 0x35, + 0x00, 0xf0, 0x5c, 0xf8, 0x28, 0x46, 0xfe, 0xf7, 0xc4, 0xff, 0x24, 0x37, + 0x00, 0x23, 0x01, 0x22, 0xff, 0xf7, 0x58, 0xff, 0x24, 0x36, 0x00, 0xf0, + 0x55, 0xf8, 0x01, 0x22, 0x00, 0x21, 0x28, 0x46, 0xfe, 0xf7, 0xb2, 0xff, + 0x8d, 0xf8, 0x00, 0x00, 0x01, 0x22, 0x00, 0x21, 0x38, 0x46, 0xfe, 0xf7, + 0xab, 0xff, 0x8d, 0xf8, 0x00, 0x00, 0x01, 0x22, 0x00, 0x21, 0x30, 0x46, + 0xfe, 0xf7, 0xa4, 0xff, 0x8d, 0xf8, 0x00, 0x00, 0x00, 0xf0, 0x49, 0xf8, + 0x40, 0x46, 0xfe, 0xf7, 0xa2, 0xff, 0x00, 0xf0, 0x44, 0xf8, 0x00, 0xf0, + 0x3f, 0xf8, 0x00, 0xf0, 0x40, 0xf8, 0x48, 0x46, 0xfe, 0xf7, 0x99, 0xff, + 0x24, 0xb3, 0x00, 0xf0, 0xb2, 0xf8, 0x28, 0x46, 0xfe, 0xf7, 0x93, 0xff, + 0x00, 0xf0, 0xad, 0xf8, 0xff, 0xf7, 0x29, 0xff, 0x00, 0xf0, 0xa9, 0xf8, + 0x00, 0xf0, 0x27, 0xf8, 0x00, 0xf0, 0x2d, 0xf8, 0x28, 0x46, 0xfe, 0xf7, + 0x86, 0xff, 0x00, 0xf0, 0x28, 0xf8, 0xff, 0xf7, 0x1c, 0xff, 0x00, 0xf0, + 0x24, 0xf8, 0x00, 0xf0, 0x1a, 0xf8, 0x09, 0xe0, 0x02, 0x20, 0x08, 0xf0, + 0x90, 0xf9, 0x01, 0x21, 0x02, 0x20, 0x08, 0xf0, 0x4f, 0xf9, 0x02, 0x20, + 0x08, 0xf0, 0xab, 0xf9, 0x00, 0x20, 0xbd, 0xe8, 0xf2, 0x8f, 0x00, 0x00, + 0xc0, 0xff, 0xff, 0x3f, 0x28, 0x96, 0x04, 0x01, 0x00, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x70, 0x47, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x30, 0x46, + 0xfe, 0xf7, 0x61, 0xbf, 0x08, 0x22, 0x03, 0x21, 0x50, 0x46, 0xfe, 0xf7, + 0x5c, 0xbf, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x70, 0x47, 0x2d, 0xe9, + 0xf8, 0x43, 0x00, 0x21, 0x01, 0x20, 0xff, 0xf7, 0x36, 0xff, 0x05, 0x00, + 0x5b, 0x48, 0x86, 0x68, 0xd0, 0xf8, 0x04, 0x90, 0xd0, 0xf8, 0x00, 0x80, + 0x32, 0xd1, 0x00, 0x20, 0x59, 0x4f, 0x00, 0xf0, 0x66, 0xf8, 0x38, 0x63, + 0x4f, 0xf6, 0x57, 0x75, 0x64, 0x24, 0x08, 0xf1, 0x25, 0x00, 0x01, 0x78, + 0x01, 0xf0, 0x07, 0x01, 0x8d, 0xf8, 0x02, 0x10, 0x09, 0xf1, 0x25, 0x00, + 0x01, 0x78, 0x01, 0xf0, 0x07, 0x01, 0x8d, 0xf8, 0x01, 0x10, 0x06, 0xf1, + 0x25, 0x00, 0x01, 0x78, 0x01, 0xf0, 0x07, 0x01, 0x8d, 0xf8, 0x00, 0x10, + 0x9d, 0xf8, 0x00, 0x00, 0x05, 0x28, 0x01, 0xbf, 0x9d, 0xf8, 0x02, 0x00, + 0x04, 0x28, 0x9d, 0xf8, 0x01, 0x00, 0x04, 0x28, 0x05, 0xd0, 0x01, 0x20, + 0x02, 0xf0, 0x74, 0xfc, 0x64, 0x1e, 0xda, 0xd1, 0x04, 0xe0, 0x01, 0x20, + 0x00, 0xf0, 0x39, 0xf8, 0x00, 0x25, 0x38, 0x63, 0xff, 0xf7, 0xaa, 0xff, + 0x08, 0xf1, 0x24, 0x00, 0xfe, 0xf7, 0x11, 0xff, 0xff, 0xf7, 0xa4, 0xff, + 0x09, 0xf1, 0x24, 0x00, 0xfe, 0xf7, 0x0b, 0xff, 0xff, 0xf7, 0x9e, 0xff, + 0x06, 0xf1, 0x24, 0x00, 0xfe, 0xf7, 0x05, 0xff, 0xff, 0xf7, 0xa7, 0xff, + 0x33, 0x48, 0xfe, 0xf7, 0x00, 0xff, 0x28, 0x46, 0xbd, 0xe8, 0xf2, 0x83, + 0x01, 0x46, 0x00, 0x20, 0xdd, 0xe6, 0x10, 0xb5, 0x2f, 0x48, 0x84, 0x68, + 0x22, 0x34, 0x00, 0x23, 0xff, 0xf7, 0x90, 0xfe, 0xff, 0xf7, 0x73, 0xfe, + 0xff, 0xf7, 0x8e, 0xfe, 0x00, 0x23, 0x04, 0x22, 0x02, 0x21, 0xff, 0xf7, + 0x89, 0xfe, 0x00, 0xf0, 0x04, 0xf8, 0xff, 0xf7, 0x85, 0xfe, 0x00, 0x20, + 0x10, 0xbd, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, 0x70, 0x47, 0x10, 0xb5, + 0x16, 0x4a, 0x25, 0x49, 0x12, 0x68, 0x01, 0x23, 0x4f, 0xf4, 0x7a, 0x74, + 0x18, 0xb1, 0x10, 0x69, 0x44, 0x43, 0x08, 0x78, 0x02, 0xe0, 0x50, 0x69, + 0x44, 0x43, 0x48, 0x78, 0x83, 0x40, 0xb4, 0xfb, 0xf3, 0xf0, 0x10, 0xbd, + 0xe8, 0x96, 0x04, 0x01, 0x28, 0x97, 0x04, 0x01, 0x00, 0x00, 0xff, 0x3f, + 0x08, 0x99, 0x04, 0x01, 0xe8, 0x98, 0x04, 0x01, 0x28, 0x98, 0x04, 0x01, + 0xcc, 0x9d, 0x04, 0x01, 0xf0, 0xff, 0xff, 0x0f, 0xe0, 0xff, 0xff, 0x1f, + 0x36, 0x04, 0x00, 0x47, 0x34, 0x04, 0x00, 0x47, 0x38, 0x04, 0x00, 0x47, + 0x3a, 0x04, 0x00, 0x47, 0x1b, 0x00, 0x00, 0x47, 0xb4, 0x76, 0x02, 0x20, + 0x6f, 0x00, 0x09, 0x48, 0x70, 0x00, 0x09, 0x48, 0x08, 0x94, 0x04, 0x01, + 0xa8, 0x97, 0x04, 0x01, 0x28, 0x94, 0x04, 0x01, 0xec, 0x9d, 0x04, 0x01, + 0x88, 0x8e, 0x04, 0x01, 0x39, 0x04, 0x00, 0x47, 0x35, 0x04, 0x00, 0x47, + 0x37, 0x04, 0x00, 0x47, 0x2d, 0x04, 0x00, 0x47, 0x30, 0x9c, 0x04, 0x01, + 0x19, 0x00, 0x00, 0x47, 0xfc, 0x64, 0x03, 0x20, 0x28, 0x65, 0x03, 0x20, + 0x2d, 0xe9, 0xfc, 0x41, 0x04, 0x46, 0x88, 0x46, 0x20, 0x20, 0x02, 0xf0, + 0xff, 0xf9, 0x22, 0x20, 0x02, 0xf0, 0xfc, 0xf9, 0x20, 0x20, 0x02, 0xf0, + 0x9d, 0xf9, 0x22, 0x20, 0x02, 0xf0, 0x9a, 0xf9, 0x00, 0x25, 0x00, 0x2c, + 0x77, 0x4e, 0x37, 0xd0, 0x77, 0x48, 0x75, 0x60, 0xb5, 0x60, 0xf5, 0x60, + 0x35, 0x61, 0x4f, 0xf4, 0xe1, 0x32, 0x01, 0x6b, 0xb1, 0xfb, 0xf2, 0xf4, + 0x00, 0x2c, 0x47, 0xd0, 0x00, 0xf0, 0xcc, 0xf8, 0x71, 0x4f, 0x38, 0x68, + 0x00, 0x90, 0x44, 0xf0, 0x00, 0x44, 0x00, 0x99, 0x49, 0x08, 0x49, 0x00, + 0x00, 0x91, 0xb8, 0xf1, 0x00, 0x0f, 0x00, 0x98, 0x38, 0x60, 0x18, 0xbf, + 0xc6, 0xf8, 0x14, 0x80, 0x6a, 0x48, 0x00, 0x90, 0x40, 0xf2, 0x87, 0x10, + 0x00, 0x99, 0x39, 0x60, 0xfc, 0x60, 0x38, 0x61, 0x20, 0x20, 0x02, 0xf0, + 0x6d, 0xf9, 0x04, 0x21, 0x20, 0x20, 0x02, 0xf0, 0xd4, 0xf9, 0x20, 0x20, + 0x02, 0xf0, 0xb7, 0xf9, 0x38, 0x68, 0x00, 0x90, 0x00, 0x99, 0x41, 0xf0, + 0x01, 0x01, 0x00, 0x91, 0x00, 0x99, 0x39, 0x60, 0xb0, 0x69, 0x48, 0xb9, + 0x03, 0x21, 0x00, 0x91, 0x06, 0xf1, 0x1c, 0x03, 0x00, 0x22, 0x00, 0x21, + 0x01, 0x20, 0x07, 0xf0, 0x03, 0xfc, 0xb0, 0x61, 0x09, 0x20, 0x58, 0x49, + 0x08, 0x60, 0x22, 0x20, 0x02, 0xf0, 0x4c, 0xf9, 0x04, 0x21, 0x22, 0x20, + 0x02, 0xf0, 0xb3, 0xf9, 0x22, 0x20, 0x02, 0xf0, 0x96, 0xf9, 0x28, 0x46, + 0xbd, 0xe8, 0xf6, 0x81, 0x4b, 0xf6, 0x01, 0x15, 0xf9, 0xe7, 0x70, 0xb5, + 0x20, 0x20, 0x02, 0xf0, 0x46, 0xf9, 0x4e, 0x4d, 0x48, 0x4e, 0x28, 0x68, + 0x08, 0x24, 0xc1, 0x07, 0x07, 0xd5, 0xa8, 0x69, 0x71, 0x69, 0x09, 0xb1, + 0xc0, 0xb2, 0x88, 0x47, 0x28, 0x68, 0x64, 0x1e, 0xf5, 0xd1, 0x00, 0x21, + 0x82, 0x07, 0x03, 0xd5, 0x71, 0x68, 0x49, 0x1c, 0x71, 0x60, 0x02, 0x21, + 0x42, 0x07, 0x04, 0xd5, 0xb3, 0x68, 0x5b, 0x1c, 0xb3, 0x60, 0x41, 0xf0, + 0x04, 0x01, 0x02, 0x07, 0x04, 0xd5, 0xf3, 0x68, 0x5b, 0x1c, 0xf3, 0x60, + 0x41, 0xf0, 0x08, 0x01, 0xc0, 0x06, 0x04, 0xd5, 0x32, 0x69, 0x52, 0x1c, + 0x32, 0x61, 0x41, 0xf0, 0x10, 0x01, 0x28, 0x68, 0x20, 0xea, 0x01, 0x01, + 0x29, 0x60, 0x70, 0xbd, 0x1c, 0xb5, 0x00, 0x20, 0x00, 0x90, 0x36, 0x49, + 0x2f, 0x4c, 0x08, 0x68, 0x01, 0x07, 0x44, 0xbf, 0x01, 0x22, 0x22, 0x70, + 0xc0, 0x07, 0x16, 0xd5, 0x21, 0x78, 0x01, 0x29, 0x13, 0xd1, 0x00, 0x20, + 0x20, 0x70, 0x06, 0xf0, 0x23, 0xfc, 0x01, 0x28, 0x0d, 0xd0, 0xa0, 0x69, + 0x69, 0x46, 0x07, 0xf0, 0xbf, 0xfc, 0x00, 0x98, 0x38, 0xb1, 0x2b, 0x48, + 0x4f, 0xf0, 0x80, 0x51, 0x01, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, + 0x6f, 0x8f, 0x13, 0xbd, 0xf8, 0xb5, 0x05, 0x46, 0x0f, 0x46, 0x01, 0x24, + 0x1d, 0x4e, 0x4f, 0xf0, 0x8c, 0x41, 0x48, 0x68, 0xc0, 0xf3, 0xc0, 0x00, + 0x00, 0x90, 0x00, 0x98, 0x90, 0xb1, 0x38, 0x00, 0x0e, 0xd0, 0x02, 0xf0, + 0xcb, 0xf9, 0x00, 0x28, 0xf1, 0xd1, 0x06, 0xf0, 0xfd, 0xfb, 0x02, 0x28, + 0xed, 0xd1, 0xb0, 0x69, 0x4f, 0xf0, 0xff, 0x31, 0x07, 0xf0, 0x32, 0xfd, + 0x00, 0x28, 0xe6, 0xd1, 0x00, 0x24, 0x09, 0xe0, 0xef, 0xf3, 0x10, 0x80, + 0x72, 0xb6, 0x0a, 0x68, 0x12, 0x0a, 0x45, 0xea, 0x02, 0x25, 0x0d, 0x60, + 0x80, 0xf3, 0x10, 0x88, 0x20, 0x46, 0xf2, 0xbd, 0x81, 0xb0, 0x11, 0x48, + 0x00, 0x68, 0xc0, 0xf3, 0x08, 0x00, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, + 0xf7, 0xd1, 0x0a, 0x49, 0x08, 0x68, 0xc0, 0xf3, 0xc0, 0x10, 0x00, 0x90, + 0x00, 0x98, 0x01, 0x28, 0xf7, 0xd1, 0x01, 0xb0, 0x70, 0x47, 0x00, 0x00, + 0x90, 0x70, 0x02, 0x20, 0xfc, 0x64, 0x03, 0x20, 0x04, 0x00, 0x10, 0x46, + 0x00, 0x03, 0x00, 0x20, 0x08, 0x00, 0x00, 0x46, 0x08, 0x00, 0x10, 0x46, + 0x04, 0x00, 0x00, 0x46, 0x04, 0xed, 0x00, 0xe0, 0x0c, 0x00, 0x00, 0x46, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, + 0x0d, 0xf8, 0x01, 0x70, 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, + 0x72, 0xb6, 0x05, 0x68, 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, + 0x29, 0x43, 0x70, 0x47, 0xdf, 0xf8, 0x40, 0x09, 0x01, 0x68, 0xd1, 0xf8, + 0xb8, 0x00, 0xc0, 0xf3, 0x07, 0x20, 0x70, 0x47, 0xdf, 0xf8, 0x30, 0x19, + 0x09, 0x68, 0x0a, 0x18, 0xe0, 0x20, 0x92, 0xf8, 0xbc, 0x30, 0x43, 0x43, + 0xc8, 0x18, 0xc4, 0x30, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, 0xdf, 0xf8, + 0x18, 0x09, 0xdf, 0xf8, 0x18, 0x69, 0x01, 0x68, 0xdf, 0xf8, 0x14, 0xa9, + 0xd1, 0xf8, 0xb8, 0x00, 0x31, 0x68, 0xdf, 0xf8, 0x10, 0x89, 0x08, 0x40, + 0x04, 0x04, 0xdf, 0xf8, 0x0c, 0x09, 0x00, 0x90, 0x24, 0x0e, 0x00, 0x27, + 0x24, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x40, 0xf1, 0x05, 0x81, 0xdd, 0xf8, + 0x00, 0xc0, 0xdf, 0xf8, 0xf8, 0x18, 0x5f, 0xfa, 0x87, 0xf9, 0x51, 0xf8, + 0x29, 0x50, 0x5c, 0xf8, 0x29, 0x00, 0x03, 0x23, 0x4f, 0xf4, 0x70, 0x62, + 0x08, 0x21, 0x00, 0xf5, 0xfa, 0x70, 0xff, 0xf7, 0xb0, 0xff, 0x00, 0x23, + 0x10, 0x22, 0x04, 0x21, 0x00, 0xf0, 0xb1, 0xf9, 0x00, 0x23, 0x02, 0x22, + 0x01, 0x21, 0xa8, 0x1d, 0xff, 0xf7, 0x9c, 0xff, 0x00, 0x23, 0x80, 0x22, + 0x07, 0x21, 0xa8, 0x1c, 0xff, 0xf7, 0x96, 0xff, 0x00, 0x23, 0x80, 0x22, + 0x07, 0x21, 0x00, 0xf0, 0xa0, 0xf9, 0x00, 0x23, 0x40, 0x22, 0x06, 0x21, + 0x05, 0xf1, 0x12, 0x00, 0xff, 0xf7, 0x8a, 0xff, 0x05, 0xf1, 0x1a, 0x0b, + 0x01, 0x23, 0x80, 0x22, 0x07, 0x21, 0x00, 0xf0, 0x44, 0xf9, 0x00, 0x23, + 0x01, 0x22, 0x00, 0x21, 0x68, 0x1c, 0xff, 0xf7, 0x7d, 0xff, 0x00, 0x23, + 0x20, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x87, 0xf9, 0x00, 0x23, 0x01, 0x22, + 0x00, 0xf0, 0x82, 0xf9, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, + 0x30, 0xf9, 0x19, 0x23, 0x3e, 0x22, 0x00, 0xf0, 0x2b, 0xf9, 0x05, 0x23, + 0x1f, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x11, 0x00, 0xff, 0xf7, 0x64, 0xff, + 0x24, 0x23, 0x3f, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x0e, 0x00, 0xff, 0xf7, + 0x5d, 0xff, 0x05, 0xf1, 0x70, 0x0b, 0x01, 0x23, 0x02, 0x22, 0x00, 0xf0, + 0x17, 0xf9, 0x3f, 0x23, 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x73, 0x00, + 0xff, 0xf7, 0x50, 0xff, 0x00, 0x23, 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, + 0x74, 0x00, 0xff, 0xf7, 0x49, 0xff, 0x11, 0x23, 0xff, 0x22, 0x00, 0x21, + 0x05, 0xf1, 0x71, 0x00, 0xff, 0xf7, 0x42, 0xff, 0x01, 0x23, 0xff, 0x22, + 0x00, 0x21, 0x05, 0xf1, 0x72, 0x00, 0xff, 0xf7, 0x3b, 0xff, 0x3f, 0x23, + 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x77, 0x00, 0xff, 0xf7, 0x34, 0xff, + 0x00, 0x23, 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x78, 0x00, 0xff, 0xf7, + 0x2d, 0xff, 0x11, 0x23, 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x75, 0x00, + 0xff, 0xf7, 0x26, 0xff, 0x01, 0x23, 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, + 0x76, 0x00, 0xff, 0xf7, 0x1f, 0xff, 0x0c, 0x23, 0x1f, 0x22, 0x00, 0x21, + 0x05, 0xf1, 0x27, 0x00, 0xff, 0xf7, 0x18, 0xff, 0x04, 0x23, 0x0f, 0x22, + 0x00, 0x21, 0x05, 0xf1, 0x26, 0x00, 0xff, 0xf7, 0x11, 0xff, 0x04, 0x23, + 0x3f, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x31, 0x00, 0xff, 0xf7, 0x0a, 0xff, + 0x04, 0x23, 0x3f, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x35, 0x00, 0xff, 0xf7, + 0x03, 0xff, 0x11, 0x23, 0x3f, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x33, 0x00, + 0xff, 0xf7, 0xfc, 0xfe, 0x11, 0x23, 0x3f, 0x22, 0x00, 0x21, 0x05, 0xf1, + 0x37, 0x00, 0xff, 0xf7, 0xf5, 0xfe, 0x00, 0x23, 0x0f, 0x22, 0x00, 0x21, + 0x05, 0xf1, 0x29, 0x00, 0xff, 0xf7, 0xee, 0xfe, 0x03, 0x23, 0x03, 0x22, + 0x00, 0x21, 0x05, 0xf1, 0x3d, 0x00, 0xff, 0xf7, 0xe7, 0xfe, 0x00, 0x23, + 0x00, 0xf0, 0xb4, 0xfb, 0xf8, 0xb2, 0x00, 0xf0, 0xb6, 0xf8, 0x01, 0x23, + 0x10, 0x22, 0x04, 0x21, 0x00, 0xf0, 0x9d, 0xf8, 0x00, 0x23, 0x00, 0xf0, + 0xaa, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0xa7, 0xf8, 0xf8, 0xb2, 0xff, 0xf7, + 0xf5, 0xfe, 0x05, 0x46, 0x5a, 0xf8, 0x39, 0x00, 0x95, 0xf8, 0x52, 0x30, + 0x4f, 0xf0, 0x7f, 0x42, 0x18, 0x21, 0x20, 0x30, 0x0a, 0xeb, 0xc9, 0x0b, + 0xff, 0xf7, 0xcf, 0xfe, 0xdb, 0xf8, 0x04, 0x00, 0x95, 0xf8, 0x84, 0x30, + 0x4f, 0xf0, 0x7f, 0x42, 0x18, 0x21, 0x20, 0x30, 0xff, 0xf7, 0xc5, 0xfe, + 0x5a, 0xf8, 0x39, 0x00, 0x00, 0xf0, 0x7f, 0xf8, 0xdb, 0xf8, 0x04, 0x00, + 0x00, 0xf0, 0x7b, 0xf8, 0x7f, 0x1c, 0xf8, 0xb2, 0x08, 0x28, 0x7f, 0xf4, + 0xf1, 0xae, 0xdf, 0xf8, 0xd4, 0x86, 0xd8, 0xf8, 0x00, 0x00, 0xd0, 0xf8, + 0xb8, 0x10, 0x30, 0x68, 0x08, 0x40, 0x00, 0x0c, 0x00, 0xf0, 0x03, 0x00, + 0x00, 0x24, 0x00, 0x90, 0x00, 0x98, 0xe0, 0x40, 0xc1, 0x07, 0x57, 0xd5, + 0xdf, 0xf8, 0xc8, 0x26, 0xdf, 0xf8, 0xc8, 0x16, 0xe0, 0xb2, 0x52, 0xf8, + 0x20, 0x90, 0x51, 0xf8, 0x20, 0x50, 0xd8, 0xf8, 0x00, 0x20, 0x70, 0x21, + 0x48, 0x43, 0x10, 0x44, 0x00, 0xf5, 0x32, 0x60, 0x05, 0xf2, 0xf2, 0x37, + 0x10, 0xf8, 0x5f, 0x6f, 0x90, 0xf8, 0x01, 0xa0, 0x90, 0xf8, 0x03, 0xb0, + 0x01, 0x23, 0x00, 0xf0, 0x50, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0x43, 0xf8, + 0x00, 0x23, 0x20, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x40, 0xf8, 0x33, 0x46, + 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x3b, 0xf8, 0x53, 0x46, 0x02, 0x22, + 0x01, 0x21, 0x00, 0xf0, 0x36, 0xf8, 0x05, 0xf2, 0xf3, 0x35, 0x5b, 0x46, + 0x07, 0x22, 0x00, 0xf0, 0x79, 0xf8, 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, + 0x00, 0xf0, 0x2b, 0xf8, 0x00, 0x23, 0x00, 0xf0, 0x30, 0xf8, 0xba, 0xf1, + 0x01, 0x0f, 0x0c, 0xbf, 0x00, 0x23, 0x01, 0x23, 0x00, 0xf0, 0x1f, 0xf8, + 0x09, 0xf1, 0xa4, 0x05, 0x01, 0x23, 0x4f, 0xf4, 0x78, 0x72, 0x05, 0x21, + 0x28, 0x46, 0xff, 0xf7, 0x5c, 0xfe, 0x00, 0x23, 0x4f, 0xf4, 0xf8, 0x42, + 0x0a, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x55, 0xfe, 0x01, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x4f, 0xfe, 0x64, 0x1c, 0xe0, 0xb2, + 0x02, 0x28, 0x9f, 0xd1, 0xbd, 0xe8, 0xf1, 0x8f, 0x01, 0x21, 0x58, 0x46, + 0x3c, 0xe6, 0x08, 0x22, 0x03, 0x21, 0x38, 0x46, 0x38, 0xe6, 0x01, 0x23, + 0x4f, 0xf0, 0x80, 0x72, 0x18, 0x21, 0x34, 0x30, 0x3b, 0xe6, 0x10, 0x22, + 0x04, 0x21, 0x38, 0x46, 0x2e, 0xe6, 0x10, 0x22, 0x04, 0x21, 0x40, 0x46, + 0x2a, 0xe6, 0x10, 0xb5, 0x04, 0x46, 0xff, 0xf7, 0x49, 0xfe, 0x90, 0xf8, + 0xd3, 0x10, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x38, 0xb5, 0xdf, 0xf8, + 0xcc, 0x25, 0x52, 0xf8, 0x20, 0x40, 0x01, 0x29, 0x04, 0xf1, 0x79, 0x05, + 0x05, 0xd1, 0x00, 0x23, 0x03, 0x22, 0x00, 0xf0, 0x23, 0xf8, 0x01, 0x23, + 0x08, 0xe0, 0x02, 0x29, 0x07, 0xbf, 0x01, 0x23, 0x03, 0x22, 0x03, 0x23, + 0x03, 0x22, 0x00, 0xf0, 0x19, 0xf8, 0x00, 0x23, 0x04, 0x22, 0x02, 0x21, + 0x00, 0xf0, 0x15, 0xf8, 0x70, 0x34, 0x00, 0x23, 0x00, 0xf0, 0x67, 0xfa, + 0x00, 0x23, 0x08, 0x22, 0x03, 0x21, 0x00, 0xf0, 0x64, 0xfa, 0x01, 0x23, + 0x00, 0xf0, 0x5f, 0xfa, 0x20, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, + 0x01, 0x23, 0x08, 0x22, 0x03, 0x21, 0xf1, 0xe5, 0x00, 0x21, 0x28, 0x46, + 0xee, 0xe5, 0xdf, 0xf8, 0x68, 0x25, 0x52, 0xf8, 0x20, 0x00, 0x10, 0xf8, + 0x79, 0x2f, 0x00, 0x78, 0x12, 0xf0, 0x03, 0x02, 0xc0, 0xf3, 0x80, 0x00, + 0x02, 0xd1, 0x08, 0xb1, 0x01, 0x20, 0x04, 0xe0, 0x01, 0x2a, 0x06, 0xbf, + 0x00, 0x28, 0x02, 0x20, 0x04, 0x20, 0x08, 0x70, 0x70, 0x47, 0x70, 0xb5, + 0x0c, 0x46, 0xdf, 0xf8, 0x38, 0x15, 0x51, 0xf8, 0x20, 0x60, 0x15, 0x46, + 0x2b, 0x46, 0x3f, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x31, 0x00, 0xff, 0xf7, + 0xcb, 0xfd, 0x23, 0x46, 0x3f, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x33, 0x00, + 0xff, 0xf7, 0xc4, 0xfd, 0x2b, 0x46, 0x3f, 0x22, 0x00, 0x21, 0x06, 0xf1, + 0x35, 0x00, 0xff, 0xf7, 0xbd, 0xfd, 0x23, 0x46, 0x06, 0xf1, 0x37, 0x00, + 0xbd, 0xe8, 0x70, 0x40, 0x3f, 0x22, 0xff, 0xe7, 0x00, 0x21, 0xb3, 0xe5, + 0x2d, 0xe9, 0xfe, 0x4f, 0x81, 0x46, 0xff, 0xf7, 0xc9, 0xfd, 0x02, 0x90, + 0x00, 0x25, 0xdf, 0xf8, 0xe4, 0x64, 0xdf, 0xf8, 0xec, 0x84, 0x02, 0x98, + 0xe8, 0x40, 0xc1, 0x07, 0x40, 0xf1, 0x83, 0x80, 0xe8, 0xb2, 0xfd, 0xf7, + 0x6c, 0xff, 0x48, 0x45, 0x7d, 0xd1, 0xe8, 0xb2, 0xff, 0xf7, 0xbe, 0xfd, + 0x07, 0x46, 0xe8, 0xb2, 0xfd, 0xf7, 0x63, 0xff, 0x81, 0x46, 0x69, 0x46, + 0xe8, 0xb2, 0xf6, 0xf7, 0x7c, 0xfd, 0x00, 0x98, 0x4f, 0xf4, 0x7a, 0x71, + 0xb0, 0xfb, 0xf1, 0xf4, 0xb8, 0x68, 0x0a, 0x46, 0xb0, 0xfb, 0xf2, 0xf2, + 0x52, 0x00, 0x21, 0x46, 0xe8, 0xb2, 0x00, 0xf0, 0x96, 0xf8, 0x82, 0x46, + 0x00, 0x20, 0x58, 0xf8, 0x30, 0x10, 0x8c, 0x42, 0x02, 0xd2, 0x40, 0x1c, + 0x04, 0x28, 0xf8, 0xd9, 0x05, 0x28, 0x08, 0xbf, 0x04, 0x20, 0x08, 0xeb, + 0xc0, 0x00, 0xe9, 0xb2, 0x56, 0xf8, 0x21, 0xb0, 0x03, 0x79, 0x3f, 0x22, + 0x00, 0x21, 0x0b, 0xf1, 0x0e, 0x00, 0xff, 0xf7, 0x6d, 0xfd, 0x00, 0xf0, + 0x58, 0xf8, 0x08, 0xf1, 0x28, 0x01, 0x08, 0xb1, 0x08, 0xf1, 0xd0, 0x01, + 0x01, 0x98, 0x00, 0x22, 0x51, 0xf8, 0x32, 0x30, 0x83, 0x42, 0x3c, 0xbf, + 0x52, 0x1c, 0x08, 0x2a, 0xf8, 0xd3, 0x00, 0xf0, 0x41, 0xf8, 0x0b, 0xf1, + 0x29, 0x00, 0xff, 0xf7, 0x57, 0xfd, 0x00, 0xf0, 0x42, 0xf8, 0x08, 0xf1, + 0x98, 0x01, 0x08, 0xb1, 0x08, 0xf5, 0xa0, 0x71, 0x01, 0x98, 0x00, 0x22, + 0x51, 0xf8, 0x32, 0x30, 0x83, 0x42, 0x3c, 0xbf, 0x52, 0x1c, 0x08, 0x2a, + 0xf8, 0xd3, 0x00, 0xf0, 0x2b, 0xf8, 0x0b, 0xf1, 0x26, 0x00, 0xff, 0xf7, + 0x41, 0xfd, 0x00, 0xf0, 0x2c, 0xf8, 0x08, 0xf1, 0x60, 0x01, 0x08, 0xb1, + 0x08, 0xf5, 0x84, 0x71, 0x01, 0x98, 0x00, 0x22, 0x51, 0xf8, 0x32, 0x30, + 0x83, 0x42, 0x3c, 0xbf, 0x52, 0x1c, 0x08, 0x2a, 0xf8, 0xd3, 0x01, 0xeb, + 0xc2, 0x00, 0x1f, 0x22, 0x83, 0x88, 0xdb, 0xb2, 0x00, 0x21, 0x0b, 0xf1, + 0x27, 0x00, 0xff, 0xf7, 0x27, 0xfd, 0xba, 0x68, 0x53, 0x46, 0x21, 0x46, + 0xe8, 0xb2, 0x00, 0xf0, 0x65, 0xf8, 0x6d, 0x1c, 0xe8, 0xb2, 0x08, 0x28, + 0x7f, 0xf4, 0x73, 0xaf, 0xbd, 0xe8, 0xf7, 0x8f, 0x01, 0xeb, 0xc2, 0x00, + 0x0f, 0x22, 0x83, 0x88, 0xdb, 0xb2, 0x00, 0x21, 0x70, 0x47, 0xb8, 0x68, + 0x01, 0x90, 0x0f, 0x20, 0x0a, 0xf0, 0x2a, 0xbb, 0xf8, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0xff, 0xf7, 0x2b, 0xfd, 0x06, 0x46, 0x69, 0x46, 0x20, 0x46, + 0xf6, 0xf7, 0xed, 0xfc, 0x00, 0x98, 0x4f, 0xf4, 0x7a, 0x71, 0xb0, 0xfb, + 0xf1, 0xf7, 0xb0, 0x68, 0x0a, 0x46, 0xb0, 0xfb, 0xf2, 0xf2, 0x52, 0x00, + 0x39, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x07, 0xf8, 0x03, 0x46, 0x2a, 0x46, + 0x39, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x34, 0xf8, 0xf1, 0xbd, 0x38, 0xb5, + 0xdd, 0x4c, 0x0a, 0xb1, 0xc8, 0x2a, 0x16, 0xd9, 0xa2, 0xf1, 0xc9, 0x03, + 0x64, 0x2b, 0x38, 0xbf, 0x38, 0x34, 0x10, 0xd3, 0xa2, 0xf2, 0x2d, 0x13, + 0x64, 0x2b, 0x0b, 0xd3, 0xa2, 0xf2, 0x91, 0x13, 0xc8, 0x2b, 0x38, 0xbf, + 0xa8, 0x34, 0x06, 0xd3, 0xa2, 0xf2, 0x59, 0x22, 0xc8, 0x2a, 0x38, 0xbf, + 0xe0, 0x34, 0x00, 0xd3, 0x70, 0x34, 0x00, 0x22, 0x23, 0x68, 0x8b, 0x42, + 0x03, 0xd3, 0x08, 0x34, 0x52, 0x1c, 0x07, 0x2a, 0xf8, 0xd3, 0x07, 0x2a, + 0xc7, 0x4d, 0x55, 0xf8, 0x20, 0x00, 0x08, 0xbf, 0x08, 0x3c, 0x1f, 0x22, + 0x23, 0x79, 0x00, 0x21, 0x11, 0x30, 0xff, 0xf7, 0xbf, 0xfc, 0x20, 0x79, + 0x32, 0xbd, 0x00, 0x00, 0x00, 0xee, 0x10, 0x1a, 0x00, 0xee, 0x90, 0x2a, + 0xf8, 0xee, 0x60, 0x0a, 0x9f, 0xed, 0xa7, 0x1a, 0xb8, 0xee, 0x40, 0x0a, + 0xdf, 0xed, 0xa6, 0x1a, 0x60, 0xee, 0x81, 0x0a, 0x20, 0xee, 0x21, 0x0a, + 0x9f, 0xed, 0xa4, 0x2a, 0xf4, 0xee, 0x42, 0x0a, 0x9f, 0xed, 0xa3, 0x2a, + 0xdf, 0xed, 0xa3, 0x1a, 0x9f, 0xed, 0xa3, 0x4a, 0xdf, 0xed, 0xa3, 0x4a, + 0xf1, 0xee, 0x10, 0xfa, 0x40, 0xee, 0x02, 0x1a, 0x9f, 0xed, 0xa1, 0x2a, + 0x71, 0xee, 0x82, 0x2a, 0x9f, 0xed, 0xa0, 0x5a, 0x4c, 0xbf, 0x9f, 0xed, + 0xa0, 0x1a, 0x9f, 0xed, 0xa0, 0x1a, 0x9f, 0xed, 0xa0, 0x0a, 0x81, 0xee, + 0xa2, 0x3a, 0x61, 0xee, 0x82, 0x1a, 0xc1, 0xee, 0xa2, 0x1a, 0x02, 0xee, + 0x90, 0x3a, 0xf8, 0xee, 0x62, 0x2a, 0x42, 0xee, 0x84, 0x4a, 0xdf, 0xed, + 0x9a, 0x2a, 0x34, 0xee, 0x85, 0x5a, 0xb1, 0xee, 0x00, 0x4a, 0x20, 0xee, + 0x80, 0x0a, 0x60, 0xee, 0xa2, 0x0a, 0x60, 0xee, 0x82, 0x0a, 0xb7, 0xee, + 0x00, 0x2a, 0x82, 0xee, 0x20, 0x2a, 0x23, 0xee, 0x01, 0x1a, 0x35, 0xee, + 0x02, 0x2a, 0x20, 0xee, 0x00, 0x3a, 0xf0, 0xee, 0x00, 0x3a, 0x61, 0xee, + 0x82, 0x1a, 0x10, 0xb5, 0x61, 0xee, 0x83, 0x1a, 0xc1, 0xee, 0x81, 0x0a, + 0x2d, 0xed, 0x04, 0x8b, 0x23, 0xee, 0x23, 0x8a, 0x23, 0xee, 0x04, 0x3a, + 0x20, 0xee, 0xa0, 0x4a, 0x00, 0xee, 0xe3, 0x4a, 0xc8, 0xee, 0x01, 0x8a, + 0x80, 0xee, 0x01, 0x1a, 0x01, 0xee, 0x01, 0x4a, 0xbd, 0xee, 0x00, 0x1a, + 0x28, 0xee, 0xa8, 0x0a, 0x34, 0xee, 0x01, 0x1a, 0x82, 0xb0, 0x04, 0x46, + 0x03, 0xee, 0x41, 0x0a, 0xe9, 0xf7, 0xc0, 0xff, 0x30, 0xee, 0x68, 0x0a, + 0x80, 0xee, 0x08, 0x0a, 0xdf, 0xed, 0x75, 0x0a, 0x80, 0xee, 0x20, 0x0a, + 0x9f, 0xed, 0x79, 0x8a, 0x30, 0xee, 0x08, 0x9a, 0x9f, 0xed, 0x78, 0x0a, + 0x89, 0xee, 0x00, 0x0a, 0xe9, 0xf7, 0xe4, 0xfc, 0xdf, 0xed, 0x75, 0x8a, + 0x20, 0xee, 0x28, 0x0a, 0xdf, 0xed, 0x74, 0x0a, 0x70, 0xee, 0x20, 0x9a, + 0x39, 0xee, 0x40, 0x0a, 0x9f, 0xed, 0x72, 0x1a, 0x80, 0xee, 0x01, 0x0a, + 0xe9, 0xf7, 0xf2, 0xfc, 0xdf, 0xed, 0x6f, 0x0a, 0x40, 0xee, 0x20, 0x9a, + 0x68, 0x46, 0xf6, 0xf7, 0x31, 0xfc, 0x01, 0xa8, 0xf6, 0xf7, 0x33, 0xfc, + 0x9d, 0xed, 0x01, 0x0a, 0xdd, 0xed, 0x00, 0x0a, 0xc0, 0xee, 0x20, 0x0a, + 0x89, 0xee, 0xa0, 0x0a, 0x30, 0xee, 0x08, 0x8a, 0x9f, 0xed, 0x63, 0x1a, + 0x88, 0xee, 0x01, 0x0a, 0xe9, 0xf7, 0xba, 0xfc, 0xb0, 0xee, 0x40, 0x9a, + 0x09, 0xee, 0x68, 0x8a, 0x9f, 0xed, 0x60, 0x0a, 0x88, 0xee, 0x00, 0x0a, + 0xe9, 0xf7, 0xce, 0xfc, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, + 0xc2, 0xb2, 0xbd, 0xee, 0xc9, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0xc1, 0xb2, + 0x20, 0x46, 0xff, 0xf7, 0x1c, 0xfe, 0x02, 0xb0, 0xbd, 0xec, 0x04, 0x8b, + 0x10, 0xbd, 0x1c, 0xb5, 0x0c, 0x46, 0x69, 0x46, 0xff, 0xf7, 0xfd, 0xfd, + 0x9d, 0xf8, 0x00, 0x00, 0xb4, 0xfb, 0xf0, 0xf0, 0x40, 0x08, 0x16, 0xbd, + 0x2d, 0xe9, 0xf8, 0x4f, 0x0a, 0x9c, 0xdd, 0xf8, 0x2c, 0xa0, 0x80, 0x46, + 0x8b, 0x46, 0x16, 0x46, 0x1f, 0x46, 0xff, 0xf7, 0xf5, 0xfb, 0x81, 0x46, + 0x00, 0x20, 0x30, 0x60, 0x4f, 0xf0, 0xff, 0x31, 0x39, 0x60, 0x00, 0x25, + 0x29, 0xfa, 0x05, 0xf0, 0xc0, 0x07, 0x14, 0xd5, 0xe8, 0xb2, 0xfd, 0xf7, + 0x98, 0xfd, 0x40, 0x45, 0x0f, 0xd1, 0x59, 0x46, 0xe8, 0xb2, 0xff, 0xf7, + 0xd6, 0xff, 0x32, 0x68, 0xe9, 0xb2, 0x82, 0x42, 0x3c, 0xbf, 0x30, 0x60, + 0x21, 0x60, 0x3b, 0x68, 0x98, 0x42, 0x3c, 0xbf, 0x38, 0x60, 0xca, 0xf8, + 0x00, 0x10, 0x6d, 0x1c, 0xe8, 0xb2, 0x08, 0x28, 0xe2, 0xd1, 0xbd, 0xe8, + 0xf1, 0x8f, 0x10, 0xb5, 0x3c, 0x49, 0x51, 0xf8, 0x20, 0x40, 0x01, 0x23, + 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0x13, 0xf8, 0x01, 0x23, 0x02, 0x22, + 0x01, 0x21, 0x04, 0xf1, 0x3c, 0x00, 0xff, 0xf7, 0xa5, 0xfb, 0x01, 0x23, + 0x80, 0x22, 0x07, 0x21, 0x00, 0xf0, 0x07, 0xf8, 0x20, 0x46, 0xbd, 0xe8, + 0x10, 0x40, 0x01, 0x23, 0x30, 0xe0, 0x04, 0x22, 0x02, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0x96, 0xbb, 0x2d, 0x4a, 0x52, 0xf8, 0x20, 0x20, 0x10, 0x78, + 0xc0, 0xf3, 0x40, 0x00, 0x08, 0x70, 0x02, 0xf1, 0x3c, 0x00, 0x00, 0x78, + 0xc0, 0xf3, 0x40, 0x00, 0x48, 0x70, 0x10, 0x78, 0xc0, 0x09, 0x88, 0x70, + 0x10, 0x78, 0xc0, 0xf3, 0x80, 0x00, 0xc8, 0x70, 0x70, 0x47, 0x38, 0xb5, + 0x0c, 0x46, 0x22, 0x49, 0x51, 0xf8, 0x20, 0x50, 0xa3, 0x78, 0x80, 0x22, + 0x07, 0x21, 0xff, 0xf7, 0x86, 0xfd, 0x23, 0x78, 0x02, 0x22, 0x01, 0x21, + 0xff, 0xf7, 0x81, 0xfd, 0x63, 0x78, 0x00, 0xf0, 0x3f, 0xf8, 0xe3, 0x78, + 0x28, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x04, 0x22, 0x02, 0x21, + 0xff, 0xf7, 0x66, 0xbb, 0x00, 0x00, 0x7a, 0x44, 0x00, 0x24, 0x74, 0x49, + 0x20, 0xbc, 0x3e, 0x4d, 0xc8, 0xcf, 0x31, 0xb3, 0x33, 0x33, 0xd0, 0x43, + 0xe0, 0xfe, 0xbd, 0x2b, 0xdc, 0x24, 0xb4, 0x2a, 0x00, 0x80, 0x0a, 0x44, + 0xcc, 0xbc, 0x8c, 0x2c, 0x20, 0x11, 0x6a, 0x51, 0xd9, 0x8c, 0x2f, 0x52, + 0xdb, 0x0f, 0xc9, 0x40, 0xdb, 0x0f, 0x49, 0x41, 0x7d, 0x1d, 0x90, 0xa9, + 0xdc, 0x24, 0xb4, 0x29, 0x7d, 0x1d, 0x90, 0x29, 0xdf, 0xf3, 0xbe, 0x27, + 0xb4, 0x76, 0x02, 0x20, 0xb0, 0x76, 0x02, 0x20, 0x88, 0x8e, 0x04, 0x01, + 0x3c, 0x09, 0x00, 0x47, 0x88, 0x94, 0x04, 0x01, 0x68, 0x94, 0x04, 0x01, + 0xcc, 0x9d, 0x04, 0x01, 0xc4, 0x9d, 0x04, 0x01, 0x98, 0x82, 0x04, 0x01, + 0x64, 0x85, 0x04, 0x01, 0x02, 0x22, 0x01, 0x21, 0x05, 0xf1, 0x3c, 0x00, + 0xff, 0xf7, 0x2a, 0xbb, 0x00, 0x20, 0x2d, 0x3a, 0x1f, 0x2a, 0x3f, 0xbf, + 0xdf, 0xf8, 0x70, 0x25, 0x51, 0x18, 0xdf, 0xf8, 0x70, 0x35, 0x99, 0x42, + 0x28, 0xbf, 0x4b, 0xf2, 0x06, 0x70, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46, + 0x0c, 0x22, 0xdf, 0xf8, 0x60, 0x35, 0x54, 0x43, 0x1a, 0x19, 0x02, 0x28, + 0x01, 0xf1, 0x54, 0x03, 0x13, 0xd1, 0xdf, 0xf8, 0x54, 0x05, 0x00, 0x68, + 0xd0, 0xf8, 0x52, 0x40, 0x00, 0xee, 0x10, 0x4a, 0xb8, 0xee, 0x40, 0x0a, + 0x83, 0xed, 0x00, 0x0a, 0x90, 0xf8, 0x51, 0x00, 0x00, 0xee, 0x10, 0x0a, + 0xb8, 0xee, 0x40, 0x0a, 0x83, 0xed, 0x01, 0x0a, 0x03, 0xe0, 0x14, 0x68, + 0x1c, 0x60, 0x50, 0x68, 0x58, 0x60, 0x12, 0x7a, 0x81, 0xf8, 0x46, 0x20, + 0x10, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x43, 0x0c, 0x46, 0x04, 0xf1, + 0x54, 0x09, 0x2d, 0xed, 0x10, 0x8b, 0x06, 0x46, 0xd9, 0xf8, 0x2c, 0x20, + 0xdf, 0xf8, 0x08, 0x85, 0x03, 0x28, 0xd4, 0xe9, 0x04, 0x01, 0x4f, 0xf4, + 0x7a, 0x73, 0x08, 0xbf, 0x08, 0xf1, 0x60, 0x08, 0xa3, 0xfb, 0x02, 0x57, + 0x8f, 0x42, 0x05, 0xd3, 0x01, 0xd8, 0x85, 0x42, 0x02, 0xd3, 0x98, 0xed, + 0x16, 0x8a, 0x01, 0xe0, 0x98, 0xed, 0x15, 0x8a, 0xe9, 0xf7, 0x5a, 0xfe, + 0x00, 0xee, 0x10, 0x0a, 0x9f, 0xed, 0x82, 0xaa, 0x60, 0xee, 0x0a, 0x0a, + 0x20, 0xee, 0xa0, 0x1a, 0xf6, 0xee, 0x00, 0xda, 0x61, 0xee, 0x20, 0x0a, + 0xdf, 0xed, 0xee, 0x1a, 0x94, 0xf8, 0x43, 0x00, 0x60, 0xee, 0xa1, 0x1a, + 0x28, 0xee, 0x2d, 0x2a, 0x61, 0xee, 0x82, 0x1a, 0xd8, 0xed, 0x17, 0x2a, + 0x00, 0xee, 0x90, 0x0a, 0x61, 0xee, 0xa2, 0x2a, 0xf8, 0xee, 0x60, 0x0a, + 0x62, 0xee, 0xa0, 0xaa, 0xc9, 0xed, 0x02, 0xaa, 0xdf, 0xed, 0xe4, 0x1a, + 0x94, 0xed, 0x0d, 0x1a, 0xd9, 0xed, 0x01, 0x0a, 0xf8, 0xee, 0x41, 0x8a, + 0x80, 0xee, 0x28, 0xba, 0x60, 0xee, 0xa1, 0x1a, 0x9f, 0xed, 0xdf, 0x0a, + 0x81, 0xee, 0x80, 0x0a, 0xe9, 0xf7, 0x4a, 0xfe, 0xf7, 0xee, 0x00, 0x0a, + 0x80, 0xee, 0x80, 0x8a, 0x68, 0xee, 0x08, 0x0a, 0x9f, 0xed, 0xda, 0x1a, + 0xb3, 0xee, 0x09, 0x0a, 0x00, 0xee, 0x81, 0x0a, 0xe9, 0xf7, 0x08, 0xfe, + 0xf1, 0xee, 0x04, 0x0a, 0xb1, 0xee, 0x00, 0x1a, 0x30, 0xee, 0x20, 0x0a, + 0xd8, 0xed, 0x01, 0x0a, 0x98, 0xed, 0x06, 0xca, 0xd8, 0xed, 0x00, 0xca, + 0x28, 0xee, 0x01, 0x1a, 0xc0, 0xee, 0x01, 0xba, 0x9f, 0xed, 0x5a, 0x1a, + 0x80, 0xee, 0x81, 0x1a, 0x99, 0xed, 0x00, 0x8a, 0x21, 0xee, 0x2a, 0x1a, + 0x88, 0xee, 0x2b, 0x0a, 0x88, 0xee, 0x01, 0x1a, 0x20, 0xee, 0x0a, 0x0a, + 0x21, 0xee, 0x0b, 0x1a, 0x20, 0xee, 0x01, 0x1a, 0xf7, 0xee, 0x00, 0x1a, + 0xc1, 0xee, 0x81, 0x0a, 0xb4, 0xee, 0x60, 0xca, 0xf1, 0xee, 0x10, 0xfa, + 0x48, 0xbf, 0xf0, 0xee, 0x4c, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xf7, 0xee, + 0x00, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0x20, 0xee, 0x2a, 0x0a, 0x88, 0xee, + 0x00, 0x0a, 0x20, 0xee, 0x0b, 0x0a, 0x60, 0xee, 0x0a, 0x9a, 0x98, 0xed, + 0x02, 0x0a, 0xf4, 0xee, 0x40, 0x9a, 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, + 0xf0, 0xee, 0x40, 0x9a, 0x39, 0xee, 0xec, 0x0a, 0x80, 0xee, 0x2c, 0x0a, + 0xe9, 0xf7, 0x12, 0xfb, 0xb0, 0xee, 0x40, 0x9a, 0xf7, 0xee, 0x00, 0x0a, + 0x79, 0xee, 0x20, 0x0a, 0x9f, 0xed, 0xe3, 0x0a, 0x60, 0xee, 0xac, 0x0a, + 0x29, 0xee, 0x80, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x44, 0xbf, 0xbf, 0xee, 0x00, 0x1a, 0x39, 0xee, 0x01, 0x9a, 0xb7, 0xee, + 0x00, 0x0a, 0x39, 0xee, 0x00, 0x0a, 0x60, 0xee, 0x2c, 0x9a, 0xdf, 0xed, + 0x30, 0x0a, 0xc9, 0xee, 0xa0, 0xca, 0x6c, 0xee, 0xaa, 0x0a, 0xc8, 0xee, + 0x20, 0x0a, 0x98, 0xed, 0x0e, 0xda, 0x98, 0xed, 0x0f, 0xea, 0x60, 0xee, + 0x8b, 0xea, 0xb0, 0xee, 0x4d, 0x0a, 0x03, 0x2e, 0x0f, 0xbf, 0xcd, 0xee, + 0x0e, 0x0a, 0xf7, 0xee, 0x00, 0x0a, 0x7e, 0xee, 0x20, 0x0a, 0xcd, 0xee, + 0x20, 0x0a, 0xb4, 0xee, 0x6e, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, + 0xf0, 0xee, 0x40, 0xea, 0xf4, 0xee, 0x60, 0xea, 0xf1, 0xee, 0x10, 0xfa, + 0x48, 0xbf, 0xf0, 0xee, 0x60, 0xea, 0x8d, 0xee, 0x2e, 0xfa, 0x03, 0x2e, + 0x04, 0xbf, 0x9f, 0xed, 0xc4, 0x0a, 0x30, 0xee, 0x4f, 0xfa, 0xb0, 0xee, + 0x4f, 0x0a, 0xe9, 0xf7, 0xa5, 0xfa, 0xff, 0xee, 0x00, 0x0a, 0x30, 0xee, + 0x20, 0x8a, 0xb0, 0xee, 0x4f, 0x0a, 0x06, 0xf0, 0xf5, 0xfa, 0xb7, 0xee, + 0x00, 0x1a, 0xf7, 0xee, 0x00, 0x0a, 0x30, 0xee, 0x01, 0x0a, 0x7e, 0xee, + 0x20, 0x0a, 0x70, 0xee, 0xc8, 0x1a, 0x70, 0xee, 0xc0, 0x0a, 0xcd, 0xee, + 0x21, 0x1a, 0xcd, 0xee, 0x20, 0x0a, 0x71, 0xee, 0xa0, 0x0a, 0x60, 0xee, + 0xad, 0x0a, 0xf4, 0xee, 0x6e, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x58, 0xbf, + 0xb0, 0xee, 0x40, 0x8a, 0x03, 0x2e, 0x09, 0xd1, 0x9f, 0xed, 0xad, 0x0a, + 0x30, 0xee, 0x48, 0x0a, 0x8d, 0xee, 0x00, 0x0a, 0x08, 0xe0, 0x00, 0xbf, + 0xdb, 0x0f, 0xc9, 0x40, 0xf7, 0xee, 0x00, 0x0a, 0x78, 0xee, 0x20, 0x0a, + 0x8d, 0xee, 0x20, 0x0a, 0xb0, 0xee, 0x00, 0x3a, 0x60, 0xee, 0x2a, 0x0a, + 0x6c, 0xee, 0xa0, 0x0a, 0xc0, 0xee, 0x8b, 0xaa, 0xca, 0xee, 0xab, 0x0a, + 0x60, 0xee, 0x8a, 0x0a, 0x60, 0xee, 0x80, 0x0a, 0xf7, 0xee, 0x00, 0x1a, + 0xf7, 0xee, 0x00, 0x3a, 0x2a, 0xee, 0xab, 0x1a, 0xc1, 0xee, 0xa0, 0x0a, + 0xb4, 0xee, 0x60, 0xca, 0xf1, 0xee, 0x10, 0xfa, 0x61, 0xee, 0x0a, 0x1a, + 0x21, 0xee, 0x03, 0x1a, 0x21, 0xee, 0x0a, 0x1a, 0x61, 0xee, 0x80, 0x1a, + 0x21, 0xee, 0x00, 0x0a, 0x83, 0xee, 0x80, 0xaa, 0x98, 0xed, 0x07, 0x0a, + 0xd8, 0xed, 0x03, 0xca, 0xb7, 0xee, 0x00, 0x2a, 0xc2, 0xee, 0x21, 0x1a, + 0x21, 0xee, 0xa0, 0x2a, 0x70, 0xee, 0xe1, 0x2a, 0x48, 0xbf, 0xf0, 0xee, + 0x4c, 0x0a, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, + 0xf0, 0xee, 0x40, 0x0a, 0x82, 0xee, 0x22, 0xba, 0x98, 0xed, 0x09, 0x0a, + 0x98, 0xed, 0x05, 0xca, 0xb4, 0xee, 0x4b, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x48, 0xbf, 0xb0, 0xee, 0x40, 0xba, 0x98, 0xed, 0x0a, 0x0a, 0xb4, 0xee, + 0x40, 0xba, 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, 0xb0, 0xee, 0x40, 0xba, + 0x98, 0xed, 0x0c, 0x0a, 0xb4, 0xee, 0x4a, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x48, 0xbf, 0xb0, 0xee, 0x40, 0xaa, 0x98, 0xed, 0x0d, 0x0a, 0xb4, 0xee, + 0x40, 0xaa, 0x2c, 0xee, 0x2c, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0xf4, 0xee, + 0x41, 0x0a, 0x48, 0xbf, 0xb0, 0xee, 0x40, 0xaa, 0xf1, 0xee, 0x10, 0xfa, + 0x80, 0xee, 0x8c, 0x0a, 0x05, 0xd5, 0xe9, 0xf7, 0x1f, 0xfa, 0x01, 0x25, + 0xf0, 0xee, 0x40, 0xba, 0x08, 0xe0, 0xe9, 0xf7, 0x19, 0xfa, 0x70, 0xee, + 0x6c, 0xba, 0x3c, 0xee, 0xab, 0x0a, 0x00, 0x25, 0x20, 0xee, 0x0c, 0x0a, + 0x88, 0x34, 0x84, 0xed, 0x04, 0x0a, 0xd8, 0xed, 0x04, 0xca, 0x98, 0xed, + 0x08, 0xca, 0x6c, 0xee, 0x2c, 0x0a, 0xb4, 0xee, 0x60, 0xba, 0xf1, 0xee, + 0x10, 0xfa, 0x8b, 0xee, 0x0c, 0x0a, 0x05, 0xd5, 0xe9, 0xf7, 0x00, 0xfa, + 0x01, 0x27, 0xb0, 0xee, 0x40, 0xba, 0x08, 0xe0, 0xe9, 0xf7, 0xfa, 0xf9, + 0x30, 0xee, 0x6c, 0xba, 0x3c, 0xee, 0x8b, 0x0a, 0x00, 0x27, 0x20, 0xee, + 0x0c, 0x0a, 0x84, 0xed, 0x05, 0x0a, 0x03, 0x2e, 0x98, 0xed, 0x0b, 0x0a, + 0x8a, 0xee, 0x00, 0x0a, 0x06, 0xd1, 0xe9, 0xf7, 0xe9, 0xf9, 0xd8, 0xed, + 0x04, 0x0a, 0x30, 0xee, 0x60, 0xaa, 0x05, 0xe0, 0xe9, 0xf7, 0xe2, 0xf9, + 0xff, 0xee, 0x00, 0x0a, 0x30, 0xee, 0x20, 0xaa, 0xdf, 0xed, 0x4e, 0x0a, + 0xf4, 0xee, 0x60, 0xba, 0x9f, 0xed, 0x4d, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0xa8, 0xbf, 0xf0, 0xee, 0x40, 0xba, 0xb4, 0xee, 0x60, 0xba, 0xf1, 0xee, + 0x10, 0xfa, 0xa8, 0xbf, 0xb0, 0xee, 0x40, 0xba, 0xb4, 0xee, 0x60, 0xaa, + 0xf1, 0xee, 0x10, 0xfa, 0xa8, 0xbf, 0xb0, 0xee, 0x40, 0xaa, 0xb4, 0xee, + 0x60, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0xd9, 0xf8, 0x28, 0x00, 0xa8, 0xbf, + 0xb0, 0xee, 0x40, 0x8a, 0x01, 0x28, 0x0d, 0xd1, 0x28, 0xee, 0xa9, 0x0a, + 0xd9, 0xed, 0x06, 0x0a, 0x10, 0xe0, 0x00, 0xbf, 0x83, 0xf9, 0x22, 0x3e, + 0xdb, 0x0f, 0x49, 0x40, 0x00, 0x00, 0x34, 0x43, 0x00, 0x00, 0x00, 0x42, + 0x02, 0x2e, 0x18, 0xbf, 0x03, 0x2e, 0x06, 0xd1, 0x28, 0xee, 0xa9, 0x0a, + 0xdf, 0xed, 0x34, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0x05, 0xe0, 0x28, 0xee, + 0xa9, 0x0a, 0x9f, 0xed, 0x32, 0x1a, 0x20, 0xee, 0x01, 0x0a, 0xd8, 0xed, + 0x12, 0x0a, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x5d, 0xbf, + 0xd8, 0xed, 0x13, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0xb0, 0xee, 0x60, 0x0a, 0xd8, 0xed, 0x11, 0x0a, 0x80, 0xee, 0x20, 0x0a, + 0xe9, 0xf7, 0x86, 0xf9, 0xbf, 0xee, 0x00, 0x1a, 0x30, 0xee, 0x01, 0x0a, + 0xbd, 0xee, 0xeb, 0x1a, 0x11, 0xee, 0x10, 0x0a, 0x20, 0x70, 0xbd, 0xee, + 0xcb, 0x1a, 0x11, 0xee, 0x10, 0x0a, 0x60, 0x70, 0xfd, 0xee, 0xca, 0x0a, + 0xfd, 0xee, 0xc8, 0x1a, 0x10, 0xee, 0x90, 0x1a, 0x11, 0xee, 0x90, 0x0a, + 0x21, 0x71, 0x60, 0x71, 0xa0, 0x71, 0xa5, 0x70, 0xfd, 0xee, 0xc9, 0x0a, + 0xbd, 0xee, 0xc0, 0x1a, 0xe7, 0x70, 0x10, 0xee, 0x90, 0x0a, 0x11, 0xee, + 0x10, 0x1a, 0xfc, 0xee, 0xea, 0x1a, 0xe0, 0x71, 0x21, 0x72, 0xc4, 0xed, + 0x08, 0x1a, 0xf7, 0xee, 0x00, 0x0a, 0x7a, 0xee, 0x20, 0x0a, 0x98, 0xed, + 0x0b, 0x1a, 0xd8, 0xed, 0x10, 0x1a, 0x40, 0xee, 0x81, 0x1a, 0xc4, 0xed, + 0x06, 0x1a, 0xd8, 0xed, 0x11, 0x0a, 0xb0, 0xee, 0x60, 0x1a, 0x00, 0xee, + 0x20, 0x1a, 0x84, 0xed, 0x03, 0x1a, 0xbd, 0xec, 0x10, 0x8b, 0xbd, 0xe8, + 0xf1, 0x83, 0x00, 0x00, 0x33, 0x33, 0x93, 0x3f, 0x00, 0x00, 0x80, 0x42, + 0x01, 0x00, 0x7c, 0x42, 0x00, 0x00, 0x7c, 0x42, 0xff, 0xeb, 0x2f, 0x2d, + 0x1f, 0x6a, 0xc0, 0x2f, 0xa0, 0x15, 0xff, 0xff, 0x01, 0xf9, 0x15, 0x00, + 0x14, 0x91, 0x04, 0x01, 0xb4, 0x76, 0x02, 0x20, 0x90, 0x48, 0x00, 0x20, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, 0x70, 0x4c, 0x71, 0x4a, + 0x20, 0x68, 0x13, 0x68, 0x50, 0xf8, 0xb8, 0x1f, 0x19, 0x40, 0x0d, 0x04, + 0x01, 0x68, 0x01, 0xea, 0x03, 0x00, 0x2d, 0x0e, 0x00, 0xf0, 0xff, 0x09, + 0x00, 0x27, 0x25, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x18, 0xd5, 0x20, 0x68, + 0xf9, 0xb2, 0x01, 0x44, 0xe0, 0x23, 0x91, 0xf8, 0xbc, 0x20, 0x5a, 0x43, + 0x83, 0x18, 0x03, 0xf1, 0xc4, 0x08, 0x08, 0xf1, 0x98, 0x06, 0xf8, 0xb2, + 0x31, 0x78, 0x00, 0xf0, 0x99, 0xf8, 0x71, 0x78, 0xf8, 0xb2, 0x00, 0xf0, + 0x81, 0xf8, 0x08, 0xf1, 0x9b, 0x01, 0xf8, 0xb2, 0x00, 0xf0, 0x3c, 0xf8, + 0x7f, 0x1c, 0xf8, 0xb2, 0x08, 0x28, 0xde, 0xdb, 0x00, 0x25, 0x29, 0xfa, + 0x05, 0xf0, 0xc0, 0x07, 0x15, 0xd5, 0x21, 0x68, 0xea, 0xb2, 0x64, 0x23, + 0x5a, 0x43, 0x8b, 0x18, 0x03, 0xf5, 0xff, 0x67, 0xe8, 0xb2, 0x39, 0x78, + 0x00, 0xf0, 0x73, 0xf8, 0x79, 0x78, 0xe8, 0xb2, 0x00, 0xf0, 0x56, 0xf8, + 0x00, 0x23, 0x07, 0xf1, 0x34, 0x02, 0x39, 0x1d, 0xe8, 0xb2, 0x00, 0xf0, + 0x06, 0xf8, 0x6d, 0x1c, 0xe8, 0xb2, 0x08, 0x28, 0xe1, 0xdb, 0xbd, 0xe8, + 0xf1, 0x83, 0x10, 0xb5, 0x00, 0xf0, 0x38, 0xf8, 0x0c, 0xbf, 0x18, 0x30, + 0x78, 0x30, 0x00, 0x23, 0x31, 0xf8, 0x13, 0x40, 0x20, 0xf8, 0x02, 0x4b, + 0x5b, 0x1c, 0x18, 0x2b, 0xf8, 0xd1, 0x00, 0x21, 0x32, 0xf8, 0x11, 0x30, + 0x20, 0xf8, 0x02, 0x3b, 0x49, 0x1c, 0x18, 0x29, 0xf8, 0xd1, 0x10, 0xbd, + 0x3e, 0x4a, 0x52, 0xf8, 0x20, 0x00, 0x48, 0x30, 0x00, 0x22, 0x31, 0xf8, + 0x12, 0x30, 0x20, 0xf8, 0x02, 0x3b, 0x52, 0x1c, 0x18, 0x2a, 0xf8, 0xd1, + 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, 0x14, 0xf8, 0x0c, 0xbf, 0x18, 0x30, + 0x78, 0x30, 0x00, 0x23, 0x30, 0xf9, 0x02, 0x4b, 0x21, 0xf8, 0x13, 0x40, + 0x5b, 0x1c, 0x18, 0x2b, 0xf8, 0xd1, 0x00, 0x21, 0x30, 0xf9, 0x02, 0x3b, + 0x22, 0xf8, 0x11, 0x30, 0x49, 0x1c, 0x18, 0x29, 0xf8, 0xd1, 0x10, 0xbd, + 0x2d, 0x4c, 0x54, 0xf8, 0x20, 0x00, 0x00, 0x2b, 0x70, 0x47, 0x10, 0xb5, + 0x00, 0xf0, 0x10, 0xf8, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x10, 0x22, + 0x04, 0x21, 0x07, 0xe0, 0x10, 0xb5, 0x00, 0xf0, 0x07, 0xf8, 0xbd, 0xe8, + 0x10, 0x40, 0x0b, 0x46, 0x06, 0x22, 0x01, 0x21, 0x14, 0x30, 0x4b, 0xe7, + 0x21, 0x4c, 0x54, 0xf8, 0x20, 0x00, 0x70, 0x47, 0x10, 0xb5, 0x1e, 0x4c, + 0x54, 0xf8, 0x20, 0x00, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x03, 0x22, + 0x00, 0x21, 0x40, 0x30, 0x3c, 0xe7, 0x10, 0xb5, 0xff, 0xf7, 0xee, 0xff, + 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x01, 0x22, 0x00, 0x21, 0xe5, 0xe7, + 0x10, 0xb5, 0x14, 0x4c, 0x54, 0xf8, 0x20, 0x00, 0xbd, 0xe8, 0x10, 0x40, + 0x0b, 0x46, 0x4f, 0xf4, 0x80, 0x52, 0x0c, 0x21, 0x28, 0x30, 0x27, 0xe7, + 0x0f, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x14, 0x30, 0x70, 0x47, 0x0e, 0x49, + 0x51, 0xf8, 0x20, 0x00, 0x00, 0x1d, 0x00, 0x68, 0xc0, 0xf3, 0x81, 0x50, + 0x70, 0x47, 0x10, 0xb5, 0x09, 0x4c, 0x54, 0xf8, 0x20, 0x00, 0xbd, 0xe8, + 0x10, 0x40, 0x0b, 0x46, 0x4f, 0xf4, 0x40, 0x02, 0x16, 0x21, 0x00, 0x1d, + 0x0e, 0xe7, 0x00, 0x00, 0xb4, 0x76, 0x02, 0x20, 0xb0, 0x76, 0x02, 0x20, + 0x88, 0x94, 0x04, 0x01, 0xe8, 0x96, 0x04, 0x01, 0x28, 0x96, 0x04, 0x01, + 0x10, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0xb0, 0xee, 0x60, 0x8a, 0x18, 0xee, + 0x10, 0x0a, 0x40, 0x00, 0x1e, 0xbf, 0xf7, 0xee, 0x00, 0x0a, 0xb4, 0xee, + 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x82, 0xb0, 0x00, 0xf0, 0xba, 0x81, + 0xbf, 0xee, 0x00, 0x1a, 0xb4, 0xee, 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x07, 0xd1, 0x00, 0x16, 0x40, 0x1c, 0x18, 0xee, 0x10, 0x1a, 0x02, 0xd1, + 0x49, 0x02, 0x00, 0xf0, 0xab, 0x81, 0x10, 0xee, 0x10, 0x0a, 0x40, 0x00, + 0x00, 0x16, 0x40, 0x1c, 0x00, 0xf0, 0xf3, 0x80, 0x10, 0xee, 0x10, 0x0a, + 0x40, 0x00, 0x00, 0xf0, 0xee, 0x80, 0x18, 0xee, 0x10, 0x0a, 0x40, 0x00, + 0x00, 0x16, 0x40, 0x1c, 0x00, 0xf0, 0xe7, 0x80, 0x18, 0xee, 0x10, 0x1a, + 0x48, 0x00, 0x08, 0xbf, 0xf0, 0xee, 0x48, 0x8a, 0x0f, 0xd0, 0x00, 0x0e, + 0xc0, 0xf1, 0x96, 0x00, 0x18, 0x28, 0xa8, 0xbf, 0x01, 0xf0, 0x00, 0x41, + 0x05, 0xda, 0x00, 0x28, 0xc4, 0xbf, 0x21, 0xfa, 0x00, 0xf2, 0x02, 0xfa, + 0x00, 0xf1, 0x08, 0xee, 0x90, 0x1a, 0x10, 0xee, 0x10, 0x0a, 0xc0, 0x0f, + 0x1c, 0xbf, 0xb4, 0xee, 0x68, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x05, 0xd0, + 0xaf, 0xf3, 0x00, 0x80, 0x02, 0xb0, 0x9f, 0xed, 0xb9, 0x0a, 0x75, 0xe1, + 0x10, 0xee, 0x10, 0x1a, 0x21, 0xf0, 0x00, 0x40, 0xb0, 0xf5, 0x00, 0x0f, + 0x06, 0xd2, 0x00, 0x21, 0x00, 0x91, 0x60, 0xb1, 0x68, 0x46, 0xe9, 0xf7, + 0x85, 0xfb, 0x08, 0xe0, 0xc0, 0x0d, 0x21, 0xf0, 0xff, 0x41, 0x7e, 0x38, + 0x41, 0xf0, 0x7c, 0x51, 0x00, 0x90, 0x00, 0xee, 0x10, 0x1a, 0x10, 0xee, + 0x10, 0x0a, 0xc0, 0x0f, 0x21, 0xd0, 0x10, 0xee, 0x10, 0x0a, 0x20, 0xf0, + 0x00, 0x40, 0x00, 0xee, 0x10, 0x0a, 0x18, 0xee, 0x90, 0x1a, 0x48, 0x00, + 0x08, 0xbf, 0xf0, 0xee, 0x68, 0x0a, 0x0f, 0xd0, 0x00, 0x0e, 0xc0, 0xf1, + 0x97, 0x00, 0x18, 0x28, 0xa8, 0xbf, 0x01, 0xf0, 0x00, 0x41, 0x05, 0xda, + 0x00, 0x28, 0xc4, 0xbf, 0x21, 0xfa, 0x00, 0xf2, 0x02, 0xfa, 0x00, 0xf1, + 0x00, 0xee, 0x90, 0x1a, 0xf4, 0xee, 0x60, 0x8a, 0xf1, 0xee, 0x10, 0xfa, + 0x01, 0xd1, 0x00, 0x24, 0x00, 0xe0, 0x01, 0x24, 0xdf, 0xed, 0x9c, 0x0a, + 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x06, 0xd5, 0x00, 0x98, + 0xb0, 0xee, 0x00, 0x1a, 0x40, 0x1e, 0x20, 0xee, 0x01, 0x0a, 0x00, 0x90, + 0xff, 0xee, 0x00, 0x0a, 0x70, 0xee, 0x20, 0x0a, 0xb7, 0xee, 0x00, 0x1a, + 0x30, 0xee, 0x01, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0x20, 0xee, 0x00, 0x1a, + 0xdf, 0xed, 0x90, 0x1a, 0x9f, 0xed, 0x90, 0x2a, 0x01, 0xee, 0x21, 0x2a, + 0xdf, 0xed, 0x8f, 0x2a, 0x42, 0xee, 0x01, 0x2a, 0x62, 0xee, 0x81, 0x2a, + 0x72, 0xee, 0xe0, 0x2a, 0x22, 0xee, 0x80, 0x0a, 0x30, 0xee, 0x80, 0x0a, + 0xdd, 0xed, 0x00, 0x0a, 0xb8, 0xee, 0xe0, 0x1a, 0xdf, 0xed, 0x88, 0x1a, + 0xb0, 0xee, 0x41, 0x2a, 0x00, 0xee, 0x21, 0x2a, 0x62, 0xee, 0x08, 0x0a, + 0xdf, 0xed, 0x85, 0x2a, 0xf4, 0xee, 0x62, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x38, 0xd4, 0x9f, 0xed, 0x83, 0x3a, 0xf4, 0xee, 0x43, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x2e, 0xda, 0x10, 0xee, 0x90, 0x0a, 0xc0, 0x0f, 0x06, 0xd0, + 0xfe, 0xee, 0x00, 0x1a, 0x70, 0xee, 0xa1, 0x0a, 0xfd, 0xee, 0xe0, 0x1a, + 0x05, 0xe0, 0xb6, 0xee, 0x00, 0x2a, 0x30, 0xee, 0x82, 0x2a, 0xfd, 0xee, + 0xc2, 0x1a, 0x11, 0xee, 0x90, 0x0a, 0x21, 0xee, 0x08, 0x1a, 0xf8, 0xee, + 0xe1, 0x1a, 0x20, 0xee, 0x08, 0x0a, 0x31, 0xee, 0x61, 0x1a, 0xdf, 0xed, + 0x73, 0x2a, 0xf7, 0xee, 0x00, 0x0a, 0x01, 0xee, 0x22, 0x0a, 0x10, 0xf0, + 0xdf, 0xfe, 0x10, 0xee, 0x10, 0x0a, 0x41, 0x00, 0x0a, 0xd0, 0x10, 0xee, + 0x10, 0x1a, 0x48, 0x00, 0x00, 0x16, 0x40, 0x1c, 0x06, 0xd1, 0x49, 0x02, + 0x04, 0xd1, 0x9f, 0xed, 0x6a, 0x0a, 0x01, 0xe0, 0x9f, 0xed, 0x69, 0x0a, + 0x00, 0x2c, 0x00, 0xf0, 0xb7, 0x80, 0x02, 0xb0, 0xb1, 0xee, 0x40, 0x0a, + 0xb4, 0xe0, 0x10, 0xee, 0x10, 0x1a, 0x49, 0x00, 0x08, 0x16, 0x40, 0x1c, + 0x02, 0xd1, 0x09, 0x02, 0x40, 0xf0, 0xaa, 0x80, 0x18, 0xee, 0x10, 0x1a, + 0x49, 0x00, 0x08, 0x16, 0x40, 0x1c, 0x05, 0xd1, 0x09, 0x02, 0x18, 0xbf, + 0xb0, 0xee, 0x48, 0x0a, 0x40, 0xf0, 0x9e, 0x80, 0x18, 0xee, 0x10, 0x1a, + 0x49, 0x00, 0x01, 0x20, 0x09, 0x16, 0x49, 0x1c, 0x3b, 0xd0, 0x18, 0xee, + 0x10, 0x2a, 0x51, 0x00, 0x08, 0xbf, 0xf0, 0xee, 0x48, 0x0a, 0x0f, 0xd0, + 0x09, 0x0e, 0xc1, 0xf1, 0x96, 0x01, 0x18, 0x29, 0xa8, 0xbf, 0x02, 0xf0, + 0x00, 0x42, 0x05, 0xda, 0x00, 0x29, 0xc4, 0xbf, 0x22, 0xfa, 0x01, 0xf3, + 0x03, 0xfa, 0x01, 0xf2, 0x00, 0xee, 0x90, 0x2a, 0xb4, 0xee, 0x60, 0x8a, + 0xf1, 0xee, 0x10, 0xfa, 0x18, 0xbf, 0x00, 0x20, 0x10, 0xee, 0x90, 0x2a, + 0x51, 0x00, 0x08, 0xbf, 0xb0, 0xee, 0x60, 0x1a, 0x0f, 0xd0, 0x09, 0x0e, + 0xc1, 0xf1, 0x97, 0x01, 0x18, 0x29, 0xa8, 0xbf, 0x02, 0xf0, 0x00, 0x42, + 0x05, 0xda, 0x00, 0x29, 0xc4, 0xbf, 0x22, 0xfa, 0x01, 0xf3, 0x03, 0xfa, + 0x01, 0xf2, 0x01, 0xee, 0x10, 0x2a, 0x30, 0xb1, 0xf4, 0xee, 0x41, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x0c, 0xbf, 0x00, 0x20, 0x01, 0x20, 0x10, 0xee, + 0x10, 0x2a, 0x51, 0x00, 0x09, 0x16, 0x49, 0x1c, 0x0a, 0xd1, 0x52, 0x02, + 0x08, 0xd1, 0x10, 0xee, 0x10, 0x1a, 0xc9, 0x0f, 0x1a, 0xd1, 0x18, 0xee, + 0x10, 0x0a, 0xc0, 0x0f, 0x41, 0xd0, 0x37, 0xe0, 0x18, 0xee, 0x10, 0x2a, + 0x51, 0x00, 0x09, 0x16, 0x49, 0x1c, 0x15, 0xd1, 0x52, 0x02, 0x13, 0xd1, + 0x10, 0xee, 0x10, 0x1a, 0x21, 0xf0, 0x00, 0x40, 0xb0, 0xf5, 0x00, 0x0f, + 0x16, 0xd2, 0x00, 0x21, 0x00, 0x91, 0xb0, 0xb1, 0x68, 0x46, 0xe9, 0xf7, + 0x53, 0xfa, 0x12, 0xe0, 0x18, 0xee, 0x10, 0x1a, 0xc9, 0x0f, 0x21, 0xd0, + 0xe0, 0xb1, 0x05, 0xe0, 0xb0, 0xb9, 0x18, 0xee, 0x10, 0x1a, 0xc9, 0x0f, + 0x1a, 0xd1, 0xa8, 0xb1, 0x02, 0xb0, 0x9f, 0xed, 0x20, 0x0a, 0x25, 0xe0, + 0xc0, 0x0d, 0x7e, 0x38, 0x00, 0x90, 0x18, 0xee, 0x10, 0x0a, 0xc0, 0x0f, + 0x00, 0x98, 0x02, 0xd1, 0x00, 0x28, 0x10, 0xdc, 0x06, 0xe0, 0x00, 0x28, + 0x04, 0xdc, 0x0c, 0xe0, 0x10, 0xee, 0x10, 0x0a, 0xc0, 0x0f, 0xe4, 0xe7, + 0x02, 0xb0, 0x9f, 0xed, 0x14, 0x0a, 0x0f, 0xe0, 0x18, 0xb1, 0x02, 0xb0, + 0x9f, 0xed, 0x13, 0x0a, 0x0a, 0xe0, 0x02, 0xb0, 0x9f, 0xed, 0x0e, 0x0a, + 0x06, 0xe0, 0x00, 0xbf, 0xff, 0xff, 0xff, 0x7f, 0xb7, 0xee, 0x00, 0x0a, + 0x02, 0xb0, 0x00, 0xbf, 0xbd, 0xec, 0x02, 0x8b, 0x10, 0xbd, 0x00, 0x00, + 0xf3, 0x04, 0x35, 0x3f, 0x15, 0x02, 0x99, 0x3e, 0x11, 0xae, 0xcc, 0x3e, + 0xc0, 0xaa, 0x2a, 0x3f, 0x3b, 0xaa, 0xb8, 0x3f, 0x00, 0x00, 0x00, 0xc7, + 0x01, 0x00, 0x00, 0x47, 0x18, 0x72, 0x31, 0x3f, 0x00, 0x00, 0x80, 0x7f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0xff, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, + 0x0d, 0xf8, 0x01, 0x70, 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, + 0x72, 0xb6, 0x05, 0x68, 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, + 0x29, 0x43, 0x70, 0x47, 0xdf, 0xf8, 0x10, 0x05, 0x01, 0x68, 0xd1, 0xf8, + 0xb8, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x70, 0x47, 0xdf, 0xf8, 0x00, 0x15, + 0x09, 0x68, 0x0a, 0x18, 0xed, 0x20, 0x92, 0xf8, 0xbc, 0x30, 0x43, 0x43, + 0xc8, 0x18, 0x00, 0xf2, 0x44, 0x40, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, + 0xdf, 0xf8, 0xe4, 0x04, 0x2d, 0xed, 0x02, 0x8b, 0x02, 0x68, 0xdf, 0xf8, + 0xe0, 0x04, 0x00, 0x68, 0x82, 0xb0, 0xd2, 0xf8, 0xb8, 0x10, 0x08, 0x40, + 0x00, 0xf0, 0xff, 0x00, 0x00, 0x24, 0x00, 0x25, 0x00, 0x90, 0x00, 0x98, + 0xe8, 0x40, 0xc1, 0x07, 0x40, 0xf1, 0x33, 0x81, 0xe8, 0xb2, 0x10, 0xf0, + 0x92, 0xff, 0x04, 0x00, 0x40, 0xf0, 0x32, 0x81, 0xe8, 0xb2, 0xff, 0xf7, + 0xd3, 0xff, 0xdf, 0xf8, 0xb0, 0x04, 0x5f, 0xfa, 0x85, 0xf9, 0x50, 0xf8, + 0x29, 0x60, 0x00, 0x23, 0x07, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x12, 0x00, + 0xff, 0xf7, 0xa4, 0xff, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x06, 0xf1, + 0x1d, 0x00, 0xff, 0xf7, 0x9d, 0xff, 0x01, 0xf0, 0x1a, 0xfa, 0x00, 0xee, + 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x8a, 0x9f, 0xed, 0xb6, 0x0a, 0x80, 0xee, + 0x08, 0x0a, 0xf7, 0xee, 0x00, 0x0a, 0xc0, 0xee, 0x80, 0x0a, 0x9f, 0xed, + 0xb3, 0x1a, 0x30, 0xee, 0x81, 0x1a, 0xf7, 0xee, 0x00, 0x1a, 0xc1, 0xee, + 0x81, 0x1a, 0x9f, 0xed, 0xb0, 0x0a, 0x31, 0xee, 0x80, 0x0a, 0xdf, 0xed, + 0xaf, 0x0a, 0xc0, 0xee, 0x80, 0x0a, 0x9f, 0xed, 0xae, 0x1a, 0x80, 0xee, + 0x81, 0x1a, 0xdf, 0xed, 0xad, 0x1a, 0xbf, 0xee, 0x00, 0x0a, 0x01, 0xee, + 0x21, 0x0a, 0xdf, 0xed, 0xab, 0x0a, 0xc0, 0xee, 0x80, 0x0a, 0x9f, 0xed, + 0xaa, 0x1a, 0x20, 0xee, 0x81, 0x1a, 0xf7, 0xee, 0x00, 0x1a, 0xc1, 0xee, + 0x81, 0x1a, 0x9f, 0xed, 0xc0, 0x2a, 0x31, 0xee, 0x82, 0x2a, 0x9f, 0xed, + 0xa1, 0x0a, 0x22, 0xee, 0x00, 0x0a, 0xe8, 0xf7, 0xa5, 0xfd, 0x00, 0x24, + 0xb5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x63, 0xd4, 0xdf, 0xed, + 0xb9, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x5c, 0xda, + 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0xc3, 0xb2, 0x3f, 0x22, + 0x00, 0x21, 0x06, 0xf1, 0x10, 0x00, 0xff, 0xf7, 0x47, 0xff, 0xbb, 0xee, + 0x09, 0x0a, 0x38, 0xee, 0x00, 0x0a, 0xdf, 0xed, 0xaf, 0x0a, 0x20, 0xee, + 0x00, 0x1a, 0xdf, 0xed, 0xae, 0x1a, 0xc0, 0xee, 0x20, 0x0a, 0xc1, 0xee, + 0x21, 0x1a, 0x70, 0xee, 0xe1, 0x1a, 0x9f, 0xed, 0xab, 0x2a, 0xb3, 0xee, + 0x00, 0x0a, 0x01, 0xee, 0x82, 0x0a, 0xe8, 0xf7, 0x75, 0xfd, 0xb5, 0xee, + 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x37, 0xd4, 0xdf, 0xed, 0xa5, 0x0a, + 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x30, 0xda, 0xbd, 0xee, + 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x7a, 0xfb, 0xb2, 0x1f, 0x22, 0x00, 0x21, + 0x06, 0xf1, 0x20, 0x00, 0xff, 0xf7, 0x18, 0xff, 0xfb, 0xb2, 0x1f, 0x22, + 0x00, 0x21, 0x06, 0xf1, 0x25, 0x00, 0xff, 0xf7, 0x11, 0xff, 0x00, 0xf0, + 0x37, 0xf9, 0x06, 0xf1, 0x23, 0x00, 0xff, 0xf7, 0x0b, 0xff, 0x06, 0xf1, + 0x30, 0x07, 0x00, 0x23, 0x04, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x2a, 0xf9, + 0x00, 0x23, 0x10, 0x22, 0x00, 0xf0, 0x25, 0xf9, 0x01, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x06, 0xf1, 0x11, 0x00, 0xff, 0xf7, 0xf9, 0xfe, 0xe8, 0xb2, + 0x00, 0xf0, 0x7e, 0xf8, 0x04, 0xe0, 0x4b, 0xf2, 0x03, 0x34, 0x01, 0xe0, + 0x4b, 0xf2, 0x05, 0x34, 0xdf, 0xf8, 0x30, 0x03, 0x50, 0xf8, 0x29, 0x90, + 0xe8, 0xb2, 0xff, 0xf7, 0x0b, 0xff, 0x09, 0xf2, 0xf2, 0x3a, 0x10, 0xf8, + 0xb3, 0x8f, 0x47, 0x78, 0x90, 0xf8, 0x03, 0xb0, 0x01, 0x23, 0x00, 0xf0, + 0x63, 0xf8, 0x01, 0x23, 0x08, 0x22, 0x03, 0x21, 0x00, 0xf0, 0x60, 0xf8, + 0x00, 0x23, 0x20, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x5b, 0xf8, 0x43, 0x46, + 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x56, 0xf8, 0x3b, 0x46, 0x02, 0x22, + 0x01, 0x21, 0x00, 0xf0, 0x51, 0xf8, 0x09, 0xf2, 0xf3, 0x39, 0x5b, 0x46, + 0x07, 0x22, 0x00, 0x21, 0x48, 0x46, 0xff, 0xf7, 0xc3, 0xfe, 0x01, 0x23, + 0x20, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x44, 0xf8, 0x00, 0x23, 0x00, 0xf0, + 0x3f, 0xf8, 0x01, 0x2f, 0x0c, 0xbf, 0x00, 0x23, 0x01, 0x23, 0x08, 0x22, + 0x03, 0x21, 0x00, 0xf0, 0x39, 0xf8, 0x7c, 0xbb, 0x10, 0x23, 0x1f, 0x22, + 0x00, 0x21, 0xb0, 0x1c, 0xff, 0xf7, 0xac, 0xfe, 0x00, 0xf0, 0xd2, 0xf8, + 0x06, 0xf1, 0x08, 0x00, 0xff, 0xf7, 0xa6, 0xfe, 0x06, 0xf1, 0x33, 0x07, + 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0xc5, 0xf8, 0x00, 0x23, + 0x80, 0x22, 0x07, 0x21, 0x00, 0xf0, 0xc0, 0xf8, 0x01, 0x23, 0x10, 0x22, + 0x04, 0x21, 0xa1, 0x48, 0xff, 0xf7, 0x94, 0xfe, 0x01, 0x23, 0x04, 0x22, + 0x02, 0x21, 0x9e, 0x48, 0xff, 0xf7, 0x8e, 0xfe, 0x00, 0x23, 0x20, 0x22, + 0x05, 0x21, 0x06, 0xf1, 0x09, 0x00, 0xff, 0xf7, 0x87, 0xfe, 0x6d, 0x1c, + 0xe8, 0xb2, 0x08, 0x28, 0x7f, 0xf4, 0xc3, 0xae, 0x02, 0xb0, 0x20, 0x46, + 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, 0x10, 0x22, 0x04, 0x21, + 0x50, 0x46, 0x77, 0xe6, 0x10, 0xb5, 0x04, 0x46, 0xff, 0xf7, 0x96, 0xfe, + 0xd7, 0x30, 0x42, 0x78, 0x01, 0x78, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, + 0x56, 0xe0, 0x10, 0xb5, 0x8c, 0x4b, 0x53, 0xf8, 0x20, 0x40, 0x04, 0xf1, + 0x40, 0x03, 0x18, 0x78, 0x1b, 0x78, 0x00, 0xf0, 0x01, 0x00, 0xc3, 0xf3, + 0x01, 0x13, 0x13, 0xb9, 0x08, 0xb1, 0x01, 0x20, 0x04, 0xe0, 0x01, 0x2b, + 0x06, 0xbf, 0x00, 0x28, 0x02, 0x20, 0x04, 0x20, 0x08, 0x70, 0x20, 0x78, + 0xc0, 0xf3, 0x80, 0x00, 0x00, 0x28, 0x0c, 0xbf, 0x04, 0x20, 0x02, 0x20, + 0x10, 0x70, 0x10, 0xbd, 0x38, 0xb5, 0x0c, 0x46, 0x7c, 0x49, 0x51, 0xf8, + 0x20, 0x50, 0x00, 0xf0, 0x6f, 0xf8, 0x28, 0x46, 0xff, 0xf7, 0x44, 0xfe, + 0x02, 0x2c, 0x04, 0xd1, 0x01, 0x23, 0x00, 0xf0, 0x25, 0xf8, 0x00, 0x23, + 0x03, 0xe0, 0x00, 0x23, 0x00, 0xf0, 0x20, 0xf8, 0x01, 0x23, 0x02, 0x22, + 0x01, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x34, 0xfe, 0x05, 0xf1, 0x10, 0x00, + 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x07, 0x23, 0x07, 0x22, 0x00, 0x21, + 0x2a, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x9a, 0x99, 0x99, 0x3f, + 0x49, 0x92, 0x24, 0x3f, 0x00, 0xe0, 0x88, 0x45, 0x00, 0xe0, 0x6e, 0x45, + 0xae, 0x47, 0xb1, 0x40, 0xae, 0x47, 0x91, 0x40, 0xcd, 0xcc, 0xd8, 0x41, + 0x04, 0x22, 0x02, 0x21, 0x28, 0x46, 0x15, 0xe6, 0xf8, 0xb5, 0x04, 0x46, + 0x15, 0x46, 0x60, 0x48, 0x22, 0x46, 0x50, 0xf8, 0x22, 0x60, 0x01, 0x29, + 0x06, 0xf1, 0x40, 0x07, 0x04, 0xd1, 0x00, 0x23, 0x00, 0xf0, 0x2c, 0xf8, + 0x01, 0x23, 0x06, 0xe0, 0x02, 0x29, 0x0c, 0xbf, 0x01, 0x23, 0x03, 0x23, + 0x00, 0xf0, 0x24, 0xf8, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, + 0x21, 0xf8, 0x41, 0x36, 0x00, 0xf0, 0x20, 0xf8, 0x30, 0x46, 0xff, 0xf7, + 0xf5, 0xfd, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x30, 0x46, 0xff, 0xf7, + 0xef, 0xfd, 0x29, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0xf4, 0x40, 0x9b, 0xe7, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x1c, 0xeb, 0xbc, 0x01, 0x00, 0x7c, 0x42, + 0x00, 0x80, 0x0a, 0x43, 0x00, 0x20, 0x7d, 0x46, 0x00, 0x00, 0xc8, 0x42, + 0x01, 0x00, 0xf8, 0x41, 0x30, 0x22, 0x04, 0x21, 0x38, 0x46, 0xd7, 0xe5, + 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x70, 0x47, 0x1c, 0xb5, 0x0c, 0x46, + 0x6a, 0x46, 0x0d, 0xf1, 0x01, 0x01, 0xff, 0xf7, 0x60, 0xff, 0x9d, 0xf8, + 0x01, 0x00, 0x9d, 0xf8, 0x00, 0x10, 0xb4, 0xfb, 0xf0, 0xf0, 0xb0, 0xfb, + 0xf1, 0xf0, 0x16, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x0a, 0x9c, 0xdd, 0xf8, + 0x2c, 0xa0, 0x80, 0x46, 0x8b, 0x46, 0x16, 0x46, 0x1f, 0x46, 0xff, 0xf7, + 0xd3, 0xfd, 0x81, 0x46, 0x00, 0x20, 0x30, 0x60, 0x4f, 0xf0, 0xff, 0x31, + 0x39, 0x60, 0x00, 0x25, 0x29, 0xfa, 0x05, 0xf0, 0xc0, 0x07, 0x14, 0xd5, + 0xe8, 0xb2, 0xfc, 0xf7, 0xd9, 0xfc, 0x40, 0x45, 0x0f, 0xd1, 0x59, 0x46, + 0xe8, 0xb2, 0xff, 0xf7, 0xd1, 0xff, 0x32, 0x68, 0xe9, 0xb2, 0x82, 0x42, + 0x3c, 0xbf, 0x30, 0x60, 0x21, 0x60, 0x3b, 0x68, 0x98, 0x42, 0x3c, 0xbf, + 0x38, 0x60, 0xca, 0xf8, 0x00, 0x10, 0x6d, 0x1c, 0xe8, 0xb2, 0x08, 0x28, + 0xe2, 0xd1, 0xbd, 0xe8, 0xf1, 0x8f, 0x70, 0xb5, 0x04, 0x46, 0x00, 0x25, + 0x1f, 0x4e, 0x01, 0x20, 0xa8, 0x40, 0x04, 0x42, 0x05, 0xd0, 0x56, 0xf8, + 0x25, 0x00, 0xff, 0xf7, 0xaf, 0xff, 0xff, 0xf7, 0x8e, 0xfd, 0x6d, 0x1c, + 0x08, 0x2d, 0xf2, 0xd1, 0x70, 0xbd, 0x10, 0xb5, 0x00, 0x22, 0x17, 0x4b, + 0x01, 0x24, 0x94, 0x40, 0x20, 0x42, 0x05, 0xd0, 0x53, 0xf8, 0x22, 0x40, + 0x24, 0x68, 0x04, 0xf0, 0x01, 0x04, 0x8c, 0x54, 0x52, 0x1c, 0x08, 0x2a, + 0xf2, 0xd1, 0x10, 0xbd, 0xf8, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x00, 0x26, + 0x0d, 0x4f, 0x01, 0x20, 0xb0, 0x40, 0x04, 0x42, 0x06, 0xd0, 0xab, 0x5d, + 0x57, 0xf8, 0x26, 0x00, 0x01, 0x22, 0x00, 0x21, 0xff, 0xf7, 0x69, 0xfd, + 0x76, 0x1c, 0x08, 0x2e, 0xf1, 0xd1, 0xf1, 0xbd, 0xb4, 0x76, 0x02, 0x20, + 0xb0, 0x76, 0x02, 0x20, 0x88, 0x97, 0x04, 0x01, 0x28, 0x94, 0x04, 0x01, + 0x3b, 0x09, 0x00, 0x47, 0x48, 0x98, 0x04, 0x01, 0x28, 0x99, 0x04, 0x01, + 0x2d, 0xe9, 0xf8, 0x43, 0x0d, 0x46, 0xf5, 0xf7, 0xe6, 0xfa, 0x00, 0x24, + 0x00, 0x28, 0x71, 0xd0, 0xdf, 0xf8, 0xd8, 0x13, 0xdf, 0xf8, 0xd8, 0x83, + 0x08, 0x78, 0xa1, 0x46, 0x00, 0x26, 0x00, 0x27, 0x48, 0xb9, 0x01, 0x22, + 0x0a, 0x70, 0x9c, 0x21, 0x40, 0x46, 0xfa, 0xf7, 0x3b, 0xf8, 0x9c, 0x21, + 0x28, 0x46, 0xfa, 0xf7, 0x79, 0xfd, 0x40, 0x46, 0x10, 0xf0, 0xf7, 0xfd, + 0x01, 0x20, 0x00, 0xf0, 0x63, 0xf9, 0x08, 0xeb, 0xc4, 0x05, 0x01, 0x22, + 0x05, 0xf1, 0x14, 0x01, 0x00, 0xf0, 0x98, 0xf8, 0x98, 0xb9, 0x02, 0x20, + 0x00, 0xf0, 0x58, 0xf9, 0x02, 0x22, 0x05, 0xf1, 0x14, 0x01, 0x00, 0xf0, + 0x8f, 0xf8, 0x50, 0xb9, 0xa9, 0x8a, 0x95, 0xed, 0x06, 0x0a, 0xea, 0x8a, + 0x89, 0x44, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x1a, 0xb6, 0x18, + 0xcf, 0x19, 0x64, 0x1c, 0x10, 0x2c, 0x01, 0xd2, 0x00, 0x28, 0xdb, 0xd0, + 0x04, 0x00, 0x08, 0xf1, 0x94, 0x05, 0x29, 0xd1, 0x4f, 0xea, 0x19, 0x10, + 0x28, 0x80, 0x36, 0x09, 0xf8, 0x10, 0x07, 0xeb, 0x10, 0x77, 0x6e, 0x80, + 0x3f, 0x11, 0xaf, 0x80, 0x00, 0x26, 0x68, 0x88, 0x10, 0xf0, 0x5c, 0xfe, + 0x28, 0x88, 0x10, 0xf0, 0x44, 0xfe, 0xf6, 0xf7, 0x49, 0xfa, 0x05, 0x46, + 0x25, 0xfa, 0x06, 0xf0, 0xc0, 0x07, 0x06, 0xd5, 0xf0, 0xb2, 0xf6, 0xf7, + 0xdc, 0xf9, 0x01, 0x46, 0xf0, 0xb2, 0x11, 0xf0, 0xbd, 0xf8, 0x76, 0x1c, + 0xf0, 0xb2, 0x08, 0x28, 0xf0, 0xdb, 0x00, 0xbf, 0xc9, 0xa2, 0x00, 0x21, + 0x03, 0x20, 0xf6, 0xf7, 0x5e, 0xfb, 0x05, 0xe0, 0x4f, 0xf4, 0x00, 0x60, + 0x28, 0x80, 0x68, 0x80, 0x00, 0x20, 0xa8, 0x80, 0x21, 0x46, 0x40, 0x46, + 0x10, 0xf0, 0x9f, 0xfd, 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0x80, 0xb5, + 0x00, 0xf0, 0x09, 0xf8, 0x00, 0xf0, 0x0f, 0xfa, 0x02, 0xbd, 0x80, 0xb5, + 0x00, 0xf0, 0x03, 0xf8, 0x00, 0xf0, 0xf4, 0xf9, 0x02, 0xbd, 0x00, 0x92, + 0x0b, 0x46, 0x02, 0x46, 0x04, 0x21, 0xb6, 0x48, 0x70, 0x47, 0x70, 0xb5, + 0x08, 0x46, 0x14, 0x46, 0x00, 0x25, 0xb2, 0x49, 0x13, 0xb1, 0x01, 0x2b, + 0x09, 0xd0, 0x0b, 0xe0, 0x14, 0x26, 0x22, 0x68, 0xb2, 0x42, 0x0a, 0xd3, + 0x32, 0x46, 0xe8, 0xf7, 0x89, 0xf9, 0x26, 0x60, 0x07, 0xe0, 0x94, 0x31, + 0x08, 0x26, 0xf4, 0xe7, 0x4f, 0xf6, 0x2a, 0x75, 0x01, 0xe0, 0x4f, 0xf6, + 0x26, 0x75, 0x28, 0x46, 0x70, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x00, 0x24, + 0x01, 0x29, 0x01, 0xd1, 0xab, 0xa2, 0x02, 0xe0, 0x4f, 0xf6, 0x27, 0x74, + 0xb0, 0xa2, 0x00, 0x21, 0x03, 0x20, 0xf6, 0xf7, 0x14, 0xfb, 0x20, 0x46, + 0x10, 0xbd, 0x10, 0xf0, 0xed, 0xbd, 0x10, 0xf0, 0x00, 0xbe, 0x00, 0x00, + 0x2d, 0xe9, 0xf0, 0x41, 0x2d, 0xed, 0x04, 0x8b, 0x82, 0xb0, 0x80, 0x46, + 0x0d, 0x46, 0x17, 0x46, 0x10, 0xf0, 0x8f, 0xfd, 0x01, 0x20, 0x10, 0xf0, + 0x88, 0xfd, 0x00, 0x20, 0x10, 0xf0, 0x74, 0xfd, 0x06, 0x20, 0x00, 0xf0, + 0xc7, 0xfc, 0x38, 0x46, 0x10, 0xf0, 0x88, 0xfd, 0x00, 0x24, 0x00, 0x26, + 0x06, 0x20, 0x00, 0xf0, 0xbf, 0xfc, 0x38, 0x46, 0x10, 0xf0, 0x96, 0xfd, + 0x01, 0x28, 0x04, 0xd0, 0x76, 0x1c, 0xb6, 0xf5, 0xfa, 0x6f, 0xf3, 0xd3, + 0x01, 0x24, 0x00, 0x2c, 0x9f, 0xed, 0x80, 0x8a, 0xf6, 0xee, 0x00, 0x8a, + 0x40, 0xd1, 0xb8, 0x07, 0x40, 0xd5, 0x10, 0xf0, 0xa2, 0xfd, 0x00, 0xee, + 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x9a, 0x10, 0xf0, 0x9e, 0xfd, 0x00, 0xee, + 0x10, 0x0a, 0x82, 0x48, 0x02, 0x68, 0x11, 0x69, 0x4f, 0xf4, 0x7a, 0x70, + 0xb8, 0xee, 0x40, 0x0a, 0x41, 0x43, 0x39, 0xee, 0x00, 0x0a, 0x00, 0xee, + 0x90, 0x1a, 0x01, 0x21, 0x01, 0xfa, 0x08, 0xf8, 0x01, 0xee, 0x10, 0x8a, + 0xbf, 0xee, 0x08, 0x2a, 0xf8, 0xee, 0x60, 0x0a, 0xb8, 0xee, 0xc1, 0x1a, + 0x00, 0xee, 0x28, 0x2a, 0xc0, 0xee, 0x81, 0x0a, 0xdf, 0xed, 0x6b, 0x1a, + 0x9f, 0xed, 0x6b, 0x0a, 0x60, 0xee, 0xa1, 0x1a, 0x00, 0xee, 0xc0, 0x2a, + 0x81, 0xee, 0x82, 0x9a, 0x29, 0xee, 0x08, 0x0a, 0xe8, 0xf7, 0x74, 0xfa, + 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x28, 0x80, 0xb0, 0xee, + 0x49, 0x0a, 0x02, 0x21, 0x28, 0x46, 0x00, 0xf0, 0x77, 0xf8, 0x04, 0x46, + 0x00, 0x2c, 0x49, 0xd1, 0xf8, 0x07, 0x26, 0xd5, 0x10, 0xf0, 0x53, 0xfd, + 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x9a, 0x10, 0xf0, 0x53, 0xfd, + 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x39, 0xee, 0x00, 0x0a, + 0xf6, 0xee, 0x00, 0x0a, 0x40, 0xee, 0x28, 0x0a, 0x9f, 0xed, 0x55, 0x0a, + 0xc0, 0xee, 0x80, 0x8a, 0x28, 0xee, 0x88, 0x0a, 0xe8, 0xf7, 0x4a, 0xfa, + 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x68, 0x80, 0xb0, 0xee, + 0x68, 0x0a, 0x01, 0x21, 0xa8, 0x1c, 0x00, 0xf0, 0x4d, 0xf8, 0x04, 0x46, + 0x04, 0xbb, 0x04, 0x20, 0xf5, 0xf7, 0xae, 0xfe, 0x01, 0x28, 0x02, 0xd1, + 0x29, 0x1d, 0x04, 0x20, 0x06, 0xe0, 0x0a, 0x20, 0xf5, 0xf7, 0xa6, 0xfe, + 0x01, 0x28, 0x05, 0xd1, 0x29, 0x1d, 0x0a, 0x20, 0xe8, 0xf7, 0x8e, 0xf8, + 0x04, 0x46, 0x0d, 0xe0, 0x69, 0x46, 0x40, 0xf6, 0xff, 0x70, 0xe7, 0xf7, + 0xac, 0xff, 0x04, 0x46, 0xbd, 0xf9, 0x00, 0x00, 0x00, 0xee, 0x10, 0x0a, + 0xb8, 0xee, 0xc0, 0x0a, 0x85, 0xed, 0x01, 0x0a, 0x01, 0x20, 0x10, 0xf0, + 0xc9, 0xfc, 0x00, 0x20, 0x10, 0xf0, 0xd7, 0xfc, 0x02, 0xb0, 0x20, 0x46, + 0xbd, 0xec, 0x04, 0x8b, 0xbd, 0xe8, 0xf0, 0x81, 0x80, 0xb5, 0x3b, 0x49, + 0x09, 0x68, 0xc0, 0x07, 0x08, 0x69, 0x4f, 0xf4, 0x7a, 0x72, 0x02, 0xfb, + 0x00, 0xf2, 0x00, 0xee, 0x10, 0x2a, 0xb8, 0xee, 0x40, 0x0a, 0x4c, 0xbf, + 0xdf, 0xed, 0x2e, 0x0a, 0xdf, 0xed, 0x2e, 0x0a, 0x80, 0xee, 0x20, 0x0a, + 0x05, 0xf0, 0x34, 0xfa, 0xbc, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, + 0x08, 0xf0, 0x13, 0xff, 0xc0, 0xb2, 0x02, 0xbd, 0x30, 0xb5, 0x02, 0x46, + 0x00, 0x20, 0x8c, 0x07, 0x29, 0x4b, 0x0d, 0xd5, 0x1d, 0x78, 0x00, 0xee, + 0x90, 0x5a, 0x00, 0xf0, 0x2b, 0xf8, 0x05, 0xd4, 0x5c, 0x78, 0x00, 0xee, + 0x90, 0x4a, 0x00, 0xf0, 0x15, 0xf8, 0x01, 0xd5, 0x10, 0x80, 0x02, 0x20, + 0xc9, 0x07, 0x0e, 0xd5, 0x9c, 0x78, 0x00, 0xee, 0x90, 0x4a, 0x00, 0xf0, + 0x1b, 0xf8, 0x05, 0xd4, 0xd9, 0x78, 0x00, 0xee, 0x90, 0x1a, 0x00, 0xf0, + 0x05, 0xf8, 0x02, 0xd5, 0x00, 0x20, 0x10, 0x80, 0x02, 0x20, 0x30, 0xbd, + 0xf8, 0xee, 0x60, 0x0a, 0x9f, 0xed, 0x14, 0x1a, 0x80, 0xee, 0x81, 0x1a, + 0xf7, 0xee, 0x00, 0x1a, 0x71, 0xee, 0xc1, 0x1a, 0xb4, 0xee, 0x61, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x70, 0x47, 0x00, 0x00, 0xf8, 0xee, 0x60, 0x0a, + 0x9f, 0xed, 0x0c, 0x1a, 0x80, 0xee, 0x81, 0x1a, 0xf7, 0xee, 0x00, 0x1a, + 0x71, 0xee, 0x21, 0x1a, 0xf4, 0xee, 0x40, 0x1a, 0xf1, 0xee, 0x10, 0xfa, + 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x06, 0x68, 0x53, 0x35, + 0xfe, 0x2f, 0x01, 0x33, 0x66, 0x66, 0x78, 0x43, 0x28, 0x6b, 0x6e, 0x4d, + 0x28, 0x6b, 0xee, 0x4d, 0x00, 0x00, 0xc8, 0x42, 0xae, 0x77, 0x02, 0x20, + 0x84, 0x67, 0x02, 0x20, 0xb0, 0x55, 0x00, 0x20, 0xb4, 0x76, 0x02, 0x20, + 0x52, 0x63, 0x54, 0x75, 0x6e, 0x65, 0x72, 0x43, 0x61, 0x6c, 0x20, 0x44, + 0x6f, 0x6e, 0x65, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x52, 0x63, 0x54, 0x75, + 0x6e, 0x65, 0x72, 0x20, 0x43, 0x74, 0x72, 0x6c, 0x20, 0x2d, 0x20, 0x74, + 0x65, 0x73, 0x74, 0x20, 0x63, 0x6d, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x52, 0x63, 0x54, 0x75, 0x6e, 0x65, 0x72, 0x20, 0x43, 0x74, 0x72, 0x6c, + 0x20, 0x2d, 0x20, 0x62, 0x61, 0x64, 0x20, 0x63, 0x6d, 0x64, 0x0a, 0x00, + 0x04, 0xf0, 0x29, 0xba, 0x70, 0xb5, 0x14, 0x48, 0x14, 0x49, 0x00, 0x68, + 0xb0, 0xfb, 0xf1, 0xf4, 0x4f, 0xf4, 0x7a, 0x72, 0xb0, 0xfb, 0xf2, 0xf5, + 0x04, 0xf0, 0x58, 0xfc, 0x6d, 0x1e, 0x02, 0x28, 0x01, 0xd0, 0x00, 0xf0, + 0x2d, 0xf8, 0xef, 0xf3, 0x10, 0x86, 0x01, 0x20, 0x80, 0xf3, 0x10, 0x88, + 0x04, 0xf0, 0x11, 0xfa, 0x0a, 0x49, 0x0b, 0x4a, 0x09, 0x68, 0x12, 0x68, + 0x86, 0xf3, 0x10, 0x88, 0x52, 0x01, 0x44, 0xbf, 0x40, 0x1c, 0x29, 0x46, + 0x6d, 0x1a, 0x4f, 0xf4, 0x7a, 0x72, 0xb5, 0xfb, 0xf4, 0xf1, 0x02, 0xfb, + 0x00, 0x10, 0x70, 0xbd, 0x84, 0x77, 0x02, 0x20, 0x40, 0x42, 0x0f, 0x00, + 0x18, 0xe0, 0x00, 0xe0, 0x04, 0xed, 0x00, 0xe0, 0x10, 0xb5, 0x04, 0x46, + 0x04, 0xf0, 0x2e, 0xfc, 0x02, 0x28, 0x01, 0xd0, 0x00, 0xf0, 0x04, 0xf8, + 0x04, 0xf0, 0xed, 0xf9, 0x00, 0x1b, 0x10, 0xbd, 0x03, 0x22, 0x4f, 0xf6, + 0x59, 0x71, 0x01, 0x20, 0x03, 0xf0, 0xdc, 0xbc, 0x88, 0x42, 0x01, 0xd2, + 0x08, 0x1a, 0x70, 0x47, 0x4f, 0xf0, 0xff, 0x32, 0x10, 0x1a, 0x08, 0x18, + 0x70, 0x47, 0x38, 0xb5, 0x04, 0x46, 0x08, 0x46, 0xff, 0xf7, 0xe0, 0xff, + 0x00, 0x25, 0x84, 0x42, 0x38, 0xbf, 0x01, 0x25, 0x28, 0x46, 0x32, 0xbd, + 0x38, 0xb5, 0x00, 0x24, 0x99, 0x42, 0x15, 0x46, 0x38, 0xbf, 0x4f, 0xf6, + 0x2d, 0x74, 0x5a, 0x19, 0x91, 0x42, 0x38, 0xbf, 0x4f, 0xf6, 0x2e, 0x74, + 0x05, 0xd3, 0x24, 0xb9, 0x41, 0x19, 0x04, 0x98, 0x1a, 0x46, 0xe7, 0xf7, + 0x99, 0xff, 0x20, 0x46, 0x32, 0xbd, 0x38, 0xb5, 0x00, 0x24, 0x99, 0x42, + 0x15, 0x46, 0x38, 0xbf, 0x4f, 0xf6, 0x2d, 0x74, 0x5a, 0x19, 0x91, 0x42, + 0x38, 0xbf, 0x4f, 0xf6, 0x2e, 0x74, 0x05, 0xd3, 0x24, 0xb9, 0x04, 0x99, + 0x1a, 0x46, 0x28, 0x44, 0xe7, 0xf7, 0x84, 0xff, 0x20, 0x46, 0x32, 0xbd, + 0x80, 0xb5, 0x01, 0x20, 0xf5, 0xf7, 0xa1, 0xf8, 0x16, 0xa2, 0xff, 0x21, + 0x03, 0x20, 0xf6, 0xf7, 0x1e, 0xf9, 0x11, 0xf0, 0x51, 0xf9, 0x08, 0x48, + 0x08, 0x4a, 0x01, 0x6b, 0x11, 0x60, 0x03, 0x20, 0x15, 0xa2, 0xff, 0x21, + 0xf6, 0xf7, 0x13, 0xf9, 0x04, 0xf0, 0xfe, 0xf8, 0x00, 0x20, 0x13, 0xf0, + 0x9b, 0xf8, 0x30, 0xbf, 0xfd, 0xe7, 0x00, 0x00, 0xfc, 0x64, 0x03, 0x20, + 0x84, 0x77, 0x02, 0x20, 0x70, 0xb5, 0x04, 0x00, 0x0d, 0x46, 0x16, 0x46, + 0x0b, 0xd0, 0xf5, 0xf7, 0x46, 0xf8, 0x29, 0x46, 0x03, 0xf0, 0xb1, 0xfc, + 0x32, 0x46, 0x21, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x01, 0x20, 0x03, 0xf0, + 0x6d, 0xbc, 0x70, 0xbd, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, + 0x6e, 0x67, 0x20, 0x4d, 0x41, 0x49, 0x4e, 0x28, 0x29, 0x0a, 0x00, 0x00, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x52, 0x54, 0x4f, + 0x53, 0x0a, 0x00, 0x00, 0x38, 0xb5, 0x04, 0x46, 0x00, 0x25, 0x29, 0x46, + 0x20, 0x46, 0x00, 0xf0, 0x05, 0xf8, 0x6d, 0x1c, 0x8a, 0x2d, 0xf8, 0xd3, + 0x00, 0x20, 0x32, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, 0x07, 0x46, 0x08, 0x46, + 0x9f, 0x49, 0x00, 0xeb, 0x80, 0x03, 0xcc, 0x18, 0x01, 0x25, 0x26, 0x78, + 0x16, 0xf0, 0x03, 0x02, 0x1c, 0xbf, 0x00, 0x21, 0x00, 0xf0, 0xe9, 0xf8, + 0x00, 0x2f, 0x4d, 0xd0, 0xf0, 0x06, 0x4b, 0xd5, 0x06, 0xf0, 0x03, 0x01, + 0x01, 0x29, 0x08, 0xbf, 0x08, 0x25, 0x04, 0xd0, 0x06, 0xf0, 0x03, 0x00, + 0x02, 0x28, 0x08, 0xbf, 0x02, 0x25, 0xa7, 0x78, 0x94, 0xf8, 0x01, 0x80, + 0x39, 0x46, 0x28, 0x46, 0x00, 0xf0, 0x45, 0xf9, 0x04, 0x46, 0x01, 0x20, + 0x00, 0xfa, 0x05, 0xf5, 0x6d, 0x1e, 0xbd, 0x40, 0x77, 0x09, 0x07, 0xf0, + 0x01, 0x07, 0x3a, 0x46, 0x29, 0x46, 0x00, 0xfa, 0x04, 0xf4, 0x89, 0x48, + 0x00, 0xeb, 0x88, 0x09, 0x48, 0x46, 0x00, 0xf0, 0x29, 0xf9, 0x64, 0x1e, + 0x0c, 0xb1, 0x00, 0xf0, 0x26, 0xf8, 0x06, 0xf0, 0x0c, 0x00, 0x04, 0x28, + 0x83, 0x48, 0x0c, 0xbf, 0x01, 0x27, 0x00, 0x27, 0x00, 0xeb, 0x88, 0x09, + 0x3a, 0x46, 0x29, 0x46, 0x48, 0x46, 0x00, 0xf0, 0x17, 0xf9, 0x0c, 0xb1, + 0x00, 0xf0, 0x15, 0xf8, 0x06, 0xf0, 0x0c, 0x06, 0x76, 0x1e, 0x7c, 0x48, + 0xb6, 0x41, 0x00, 0xeb, 0x88, 0x07, 0xf2, 0x0f, 0x29, 0x46, 0x38, 0x46, + 0x00, 0xf0, 0x08, 0xf9, 0x24, 0xb1, 0xf2, 0x0f, 0x21, 0x46, 0x38, 0x1d, + 0x00, 0xf0, 0x02, 0xf9, 0x00, 0x20, 0xbd, 0xe8, 0xf2, 0x83, 0x3a, 0x46, + 0x21, 0x46, 0x09, 0xf1, 0x04, 0x00, 0xf9, 0xe0, 0x00, 0x28, 0x07, 0xd4, + 0x01, 0x22, 0x00, 0xf0, 0x1f, 0x01, 0x6f, 0x4b, 0x8a, 0x40, 0x40, 0x09, + 0x43, 0xf8, 0x20, 0x20, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x41, 0x00, 0x21, + 0x8a, 0x28, 0x3d, 0xd2, 0x65, 0x4a, 0x00, 0xeb, 0x80, 0x03, 0xd7, 0x18, + 0x3a, 0x78, 0xd6, 0x06, 0x36, 0xd5, 0x02, 0xf0, 0x03, 0x01, 0x01, 0x29, + 0x08, 0xbf, 0x08, 0x25, 0x04, 0xd0, 0x02, 0xf0, 0x03, 0x02, 0x02, 0x2a, + 0x04, 0xd1, 0x02, 0x25, 0x00, 0xf0, 0x98, 0xf8, 0x06, 0x46, 0x01, 0xe0, + 0x01, 0x25, 0x01, 0x26, 0x97, 0xf8, 0x01, 0x80, 0xbf, 0x78, 0x39, 0x46, + 0x28, 0x46, 0x00, 0xf0, 0xd4, 0xf8, 0x01, 0x23, 0x5a, 0x4a, 0x52, 0xf8, + 0x28, 0x10, 0x03, 0xfa, 0x05, 0xfc, 0xac, 0xf1, 0x01, 0x0c, 0x0c, 0xea, + 0x06, 0x0c, 0x0c, 0xfa, 0x07, 0xfc, 0x0c, 0xea, 0x01, 0x01, 0x42, 0xf8, + 0x28, 0x10, 0x2d, 0x1a, 0x40, 0xb1, 0x02, 0xeb, 0x88, 0x02, 0xee, 0x40, + 0x54, 0x68, 0x83, 0x40, 0x34, 0x40, 0x5b, 0x1e, 0x1c, 0x40, 0x54, 0x60, + 0xf9, 0x40, 0x08, 0xb1, 0xac, 0x40, 0x21, 0x43, 0x08, 0x46, 0xbd, 0xe8, + 0xf0, 0x81, 0x00, 0x28, 0x07, 0xd4, 0x01, 0x22, 0x00, 0xf0, 0x1f, 0x01, + 0x48, 0x4b, 0x8a, 0x40, 0x40, 0x09, 0x43, 0xf8, 0x20, 0x20, 0x70, 0x47, + 0x00, 0x28, 0x0b, 0xd4, 0x01, 0x22, 0x00, 0xf0, 0x1f, 0x01, 0x44, 0x4b, + 0x8a, 0x40, 0x40, 0x09, 0x43, 0xf8, 0x20, 0x20, 0xbf, 0xf3, 0x4f, 0x8f, + 0xbf, 0xf3, 0x6f, 0x8f, 0x70, 0x47, 0x09, 0x01, 0x00, 0x28, 0x02, 0xd4, + 0x3e, 0x4a, 0x11, 0x54, 0x70, 0x47, 0x3e, 0x4b, 0x00, 0xf0, 0x0f, 0x00, + 0x18, 0x44, 0x00, 0xf8, 0x04, 0x1c, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x01, + 0x04, 0xf0, 0xff, 0x04, 0x20, 0x00, 0x18, 0xbf, 0x01, 0x20, 0x12, 0xf0, + 0x7b, 0xff, 0xef, 0xf3, 0x10, 0x81, 0x72, 0xb6, 0xef, 0xf3, 0x11, 0x80, + 0x08, 0xb1, 0x84, 0x42, 0x01, 0xd2, 0x84, 0xf3, 0x11, 0x88, 0x81, 0xf3, + 0x10, 0x88, 0x10, 0xbd, 0x80, 0xf3, 0x11, 0x88, 0x70, 0x47, 0x70, 0xb5, + 0x8a, 0x28, 0x0c, 0x46, 0x25, 0xd2, 0x00, 0xeb, 0x80, 0x05, 0x22, 0x4e, + 0x70, 0x5d, 0x10, 0xf0, 0x03, 0x0f, 0x1e, 0xd0, 0xf4, 0xf7, 0x17, 0xff, + 0x00, 0x28, 0x0c, 0xbf, 0x27, 0x49, 0x28, 0x49, 0x72, 0x5d, 0x70, 0x19, + 0x02, 0xf0, 0x03, 0x02, 0xc0, 0x78, 0x02, 0x2a, 0x0c, 0xbf, 0x04, 0xf0, + 0x03, 0x04, 0x04, 0xf0, 0xff, 0x04, 0xef, 0xf3, 0x10, 0x82, 0x01, 0x23, + 0x83, 0xf3, 0x10, 0x88, 0x51, 0xf8, 0x20, 0x50, 0x2d, 0x0a, 0x44, 0xea, + 0x05, 0x24, 0x41, 0xf8, 0x20, 0x40, 0x82, 0xf3, 0x10, 0x88, 0x70, 0xbd, + 0x38, 0xb5, 0x04, 0x46, 0x00, 0x20, 0x8a, 0x2c, 0x18, 0xd2, 0x04, 0xeb, + 0x84, 0x04, 0x0c, 0x4d, 0x29, 0x5d, 0x11, 0xf0, 0x03, 0x0f, 0x11, 0xd0, + 0xf4, 0xf7, 0xeb, 0xfe, 0x00, 0x28, 0x0c, 0xbf, 0x11, 0x48, 0x12, 0x48, + 0x29, 0x19, 0x2a, 0x5d, 0xc9, 0x78, 0x50, 0xf8, 0x21, 0x00, 0x02, 0xf0, + 0x03, 0x02, 0x02, 0x2a, 0x0c, 0xbf, 0x03, 0x22, 0xff, 0x22, 0x10, 0x40, + 0x32, 0xbd, 0x00, 0x00, 0x2c, 0x44, 0x00, 0x20, 0x4c, 0x00, 0x80, 0x46, + 0x98, 0x00, 0x80, 0x46, 0xe4, 0x00, 0x80, 0x46, 0x80, 0xe2, 0x00, 0xe0, + 0x7c, 0x01, 0x80, 0x46, 0x00, 0xe1, 0x00, 0xe0, 0x80, 0xe1, 0x00, 0xe0, + 0x00, 0xe4, 0x00, 0xe0, 0x18, 0xed, 0x00, 0xe0, 0x00, 0x00, 0x20, 0x41, + 0x00, 0x00, 0x20, 0x44, 0xef, 0xf3, 0x05, 0x80, 0x00, 0xb1, 0x01, 0x20, + 0xc0, 0xb2, 0x70, 0x47, 0x01, 0x2a, 0x07, 0xbf, 0x02, 0x68, 0x22, 0xea, + 0x01, 0x01, 0x03, 0x68, 0x19, 0x43, 0x01, 0x60, 0x70, 0x47, 0x02, 0x46, + 0x00, 0x20, 0xc1, 0xf1, 0x20, 0x01, 0x91, 0x42, 0x38, 0xbf, 0x50, 0x1a, + 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x12, 0x48, 0x01, 0x68, 0x41, 0xf0, + 0x80, 0x71, 0x01, 0x60, 0x10, 0x48, 0x11, 0x49, 0x02, 0x68, 0x00, 0x92, + 0x00, 0x9a, 0x12, 0xf0, 0x70, 0x4f, 0x0b, 0xd0, 0x00, 0x9a, 0x93, 0x01, + 0x08, 0xd4, 0x00, 0x22, 0x42, 0x60, 0x01, 0x22, 0x03, 0x68, 0x43, 0xf0, + 0x01, 0x03, 0x03, 0x60, 0x0a, 0x70, 0x03, 0xe0, 0x08, 0x78, 0x08, 0xb9, + 0x00, 0xf0, 0x02, 0xf8, 0x00, 0x20, 0x02, 0xbd, 0x03, 0x22, 0x4b, 0xf2, + 0x01, 0x51, 0x01, 0x20, 0x03, 0xf0, 0xb4, 0xba, 0xfc, 0xed, 0x00, 0xe0, + 0x00, 0x10, 0x00, 0xe0, 0xa8, 0x77, 0x02, 0x20, 0xba, 0x48, 0x00, 0x6b, + 0x70, 0x47, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, + 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, + 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x38, 0xb5, 0x04, 0x01, 0xb2, 0x4d, + 0x28, 0x5d, 0x08, 0xb1, 0x00, 0xf0, 0x5e, 0xf8, 0x01, 0x21, 0x29, 0x55, + 0x31, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, 0x00, 0xf0, 0x52, 0xf8, 0x1e, 0x46, + 0x2b, 0x78, 0x01, 0x2b, 0x88, 0x46, 0x17, 0x46, 0x01, 0xd0, 0x00, 0xf0, + 0x4f, 0xf8, 0xa9, 0x48, 0xa9, 0x4a, 0x6f, 0x70, 0x80, 0x45, 0x88, 0xbf, + 0x80, 0x46, 0xa4, 0x48, 0x01, 0x6b, 0xa1, 0xfb, 0x08, 0x01, 0x00, 0x23, + 0xfa, 0xf7, 0xf0, 0xf8, 0xa9, 0x68, 0x08, 0x60, 0x02, 0x21, 0xa8, 0x68, + 0x40, 0xf8, 0x0c, 0x1f, 0xff, 0x00, 0xa8, 0x68, 0x47, 0xf0, 0x60, 0x07, + 0x40, 0xf8, 0x08, 0x7f, 0x20, 0x46, 0x00, 0xf0, 0x57, 0xf8, 0x01, 0x2e, + 0x04, 0xbf, 0x20, 0x46, 0x00, 0xf0, 0x58, 0xf8, 0x00, 0xf0, 0x21, 0xf8, + 0x02, 0x20, 0x28, 0x70, 0xbd, 0xe8, 0xf0, 0x81, 0x38, 0xb5, 0x00, 0xf0, + 0x20, 0xf8, 0x2b, 0x78, 0x01, 0x2b, 0x01, 0xd0, 0x00, 0xf0, 0x20, 0xf8, + 0x00, 0x21, 0x69, 0x70, 0x00, 0x20, 0xa9, 0x68, 0x08, 0x60, 0x02, 0x22, + 0xa8, 0x68, 0x40, 0xf8, 0x0c, 0x2f, 0x64, 0x21, 0xa8, 0x68, 0x40, 0xf8, + 0x08, 0x1f, 0x20, 0x46, 0x00, 0xf0, 0x34, 0xf8, 0x00, 0xf0, 0x03, 0xf8, + 0x02, 0x20, 0x28, 0x70, 0x31, 0xbd, 0xa8, 0x68, 0x01, 0x23, 0x10, 0x22, + 0x04, 0x21, 0x08, 0x30, 0x91, 0xe7, 0x04, 0x46, 0x82, 0x48, 0x00, 0xeb, + 0x04, 0x15, 0x70, 0x47, 0x03, 0x22, 0x4f, 0xf6, 0x01, 0x71, 0x01, 0x20, + 0x03, 0xf0, 0x32, 0xba, 0x70, 0xb5, 0xff, 0xf7, 0xf2, 0xff, 0x00, 0x22, + 0xa8, 0x68, 0x01, 0x1d, 0x0e, 0x68, 0x40, 0xf8, 0x08, 0x2f, 0x68, 0x68, + 0xff, 0xf7, 0x9c, 0xfe, 0x20, 0x46, 0x00, 0xf0, 0x0f, 0xf8, 0x01, 0x20, + 0x28, 0x70, 0x30, 0x46, 0x70, 0xbd, 0x38, 0xb5, 0x04, 0x01, 0x73, 0x4d, + 0x29, 0x5d, 0x01, 0x29, 0x18, 0xbf, 0xff, 0xf7, 0xe5, 0xff, 0x00, 0x20, + 0x28, 0x55, 0x31, 0xbd, 0x6e, 0x49, 0x01, 0xeb, 0x00, 0x12, 0x50, 0x68, + 0xff, 0xf7, 0x28, 0xbe, 0x6b, 0x49, 0x01, 0xeb, 0x00, 0x12, 0x50, 0x68, + 0xff, 0xf7, 0x73, 0xbe, 0x68, 0x49, 0x01, 0xeb, 0x00, 0x12, 0x50, 0x68, + 0xff, 0xf7, 0x78, 0xbe, 0x80, 0xb5, 0x06, 0x21, 0x0f, 0x20, 0xff, 0xf7, + 0x82, 0xfe, 0x06, 0x21, 0x10, 0x20, 0xff, 0xf7, 0x7e, 0xfe, 0x06, 0x21, + 0x11, 0x20, 0xff, 0xf7, 0x7a, 0xfe, 0x06, 0x21, 0x12, 0x20, 0xff, 0xf7, + 0x76, 0xfe, 0x06, 0x21, 0x13, 0x20, 0xff, 0xf7, 0x72, 0xfe, 0x06, 0x21, + 0x14, 0x20, 0xff, 0xf7, 0x6e, 0xfe, 0x06, 0x21, 0x15, 0x20, 0xff, 0xf7, + 0x6a, 0xfe, 0x06, 0x21, 0x16, 0x20, 0xff, 0xf7, 0x66, 0xfe, 0x06, 0x21, + 0x17, 0x20, 0xff, 0xf7, 0x62, 0xfe, 0x06, 0x21, 0x18, 0x20, 0xff, 0xf7, + 0x5e, 0xfe, 0x06, 0x21, 0x19, 0x20, 0xff, 0xf7, 0x5a, 0xfe, 0x06, 0x21, + 0x1a, 0x20, 0xff, 0xf7, 0x56, 0xfe, 0x06, 0x21, 0x1b, 0x20, 0xff, 0xf7, + 0x52, 0xfe, 0x06, 0x21, 0x1c, 0x20, 0xff, 0xf7, 0x4e, 0xfe, 0x06, 0x21, + 0x1d, 0x20, 0xff, 0xf7, 0x4a, 0xfe, 0xbd, 0xe8, 0x04, 0x40, 0x06, 0x21, + 0x1e, 0x20, 0xff, 0xf7, 0x44, 0xbe, 0x44, 0x49, 0x01, 0xeb, 0x00, 0x10, + 0x82, 0x68, 0x52, 0xf8, 0x14, 0x0f, 0x00, 0xf0, 0x01, 0x00, 0x70, 0x47, + 0x3f, 0x49, 0x01, 0xeb, 0x00, 0x10, 0x82, 0x68, 0x52, 0xf8, 0x04, 0x0f, + 0x70, 0x47, 0x3c, 0x4a, 0x02, 0xeb, 0x00, 0x10, 0xc1, 0x60, 0x70, 0x47, + 0x38, 0xb5, 0x04, 0x00, 0x00, 0x25, 0xff, 0xf7, 0xf7, 0xfe, 0x39, 0x49, + 0xb0, 0xfb, 0xf1, 0xf0, 0x00, 0xfb, 0x04, 0xf0, 0x06, 0x21, 0xb0, 0xfb, + 0xf1, 0xf1, 0x00, 0x20, 0x88, 0x42, 0x02, 0xd2, 0x00, 0xbf, 0x40, 0x1c, + 0xfa, 0xe7, 0x31, 0xbd, 0x38, 0xb5, 0x04, 0x46, 0x2e, 0x49, 0x01, 0xeb, + 0x04, 0x15, 0x68, 0x68, 0xff, 0xf7, 0xb3, 0xfd, 0x68, 0x78, 0x10, 0xb9, + 0x20, 0x46, 0xff, 0xf7, 0x81, 0xff, 0xe8, 0x68, 0x10, 0xb1, 0xbd, 0xe8, + 0x32, 0x40, 0x00, 0x47, 0x31, 0xbd, 0x00, 0x20, 0xea, 0xe7, 0x01, 0x20, + 0xe8, 0xe7, 0x02, 0x20, 0xe6, 0xe7, 0x03, 0x20, 0xe4, 0xe7, 0x04, 0x20, + 0xe2, 0xe7, 0x05, 0x20, 0xe0, 0xe7, 0x06, 0x20, 0xde, 0xe7, 0x07, 0x20, + 0xdc, 0xe7, 0x08, 0x20, 0xda, 0xe7, 0x09, 0x20, 0xd8, 0xe7, 0x0a, 0x20, + 0xd6, 0xe7, 0x0b, 0x20, 0xd4, 0xe7, 0x0c, 0x20, 0xd2, 0xe7, 0x0d, 0x20, + 0xd0, 0xe7, 0x0e, 0x20, 0xce, 0xe7, 0x0f, 0x20, 0xcc, 0xe7, 0x70, 0xb5, + 0x18, 0x4c, 0xa5, 0x68, 0x0f, 0x20, 0xff, 0xf7, 0xc0, 0xfe, 0x21, 0x78, + 0x01, 0x29, 0x01, 0xd0, 0xff, 0xf7, 0x20, 0xff, 0x01, 0x20, 0x60, 0x70, + 0x00, 0x21, 0x05, 0xf1, 0x0c, 0x00, 0x29, 0x60, 0x02, 0x22, 0x05, 0xf1, + 0x08, 0x06, 0x02, 0x60, 0x6e, 0x21, 0x31, 0x60, 0x0f, 0x20, 0xff, 0xf7, + 0x35, 0xff, 0x01, 0x23, 0x10, 0x22, 0x04, 0x21, 0x30, 0x46, 0xff, 0xf7, + 0x98, 0xfe, 0x02, 0x20, 0x09, 0x49, 0x20, 0x70, 0x2d, 0x1d, 0x0d, 0x60, + 0x70, 0xbd, 0x07, 0x48, 0x01, 0x68, 0x08, 0x68, 0x70, 0x47, 0x00, 0x00, + 0xfc, 0x64, 0x03, 0x20, 0x1c, 0x41, 0x00, 0x20, 0x00, 0x12, 0x7a, 0x00, + 0x40, 0x42, 0x0f, 0x00, 0x0c, 0x42, 0x00, 0x20, 0x78, 0x77, 0x02, 0x20, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, + 0x0d, 0xf8, 0x01, 0x70, 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, + 0x72, 0xb6, 0x05, 0x68, 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, + 0x29, 0x43, 0x70, 0x47, 0xf8, 0xb5, 0x8a, 0x4c, 0x8a, 0x4d, 0xa0, 0x78, + 0x8a, 0x4e, 0x85, 0xf8, 0x50, 0x00, 0x00, 0x27, 0xe8, 0x19, 0x31, 0x78, + 0x01, 0x70, 0x01, 0x23, 0x72, 0x78, 0x02, 0x74, 0x08, 0x22, 0xb1, 0x78, + 0x80, 0xf8, 0x20, 0x10, 0x7f, 0x1c, 0xf1, 0x78, 0x00, 0xf8, 0x30, 0x1f, + 0x31, 0x79, 0x01, 0x74, 0x20, 0x46, 0x03, 0x21, 0xff, 0xf7, 0xca, 0xff, + 0x00, 0x23, 0x08, 0x22, 0x03, 0x21, 0x00, 0xf0, 0xe0, 0xf8, 0x10, 0x2f, + 0xe4, 0xd1, 0xf1, 0xbd, 0x00, 0x28, 0x00, 0xd1, 0x70, 0x47, 0x10, 0xb5, + 0x02, 0x23, 0x3f, 0x22, 0x00, 0x21, 0x78, 0x48, 0x78, 0x4c, 0xff, 0xf7, + 0xb7, 0xff, 0x02, 0x23, 0x3f, 0x22, 0x00, 0x21, 0x76, 0x48, 0xff, 0xf7, + 0xb1, 0xff, 0x08, 0x23, 0x3f, 0x22, 0x00, 0x21, 0x74, 0x48, 0xff, 0xf7, + 0xab, 0xff, 0x03, 0x23, 0x4f, 0xf4, 0x70, 0x12, 0x12, 0x21, 0x00, 0xf0, + 0x16, 0xf8, 0x0a, 0x23, 0x4f, 0xf4, 0x7c, 0x32, 0x0c, 0x21, 0x00, 0xf0, + 0x10, 0xf8, 0x0a, 0x23, 0x4f, 0xf4, 0x7c, 0x62, 0x06, 0x21, 0x00, 0xf0, + 0x0a, 0xf8, 0x0c, 0x23, 0x3f, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x05, 0xf8, + 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x20, 0x08, 0xf0, 0x2b, 0xbb, 0x20, 0x46, + 0x95, 0xe7, 0x00, 0x28, 0x00, 0xd1, 0x70, 0x47, 0xf8, 0xb5, 0x00, 0x24, + 0x62, 0x4d, 0x55, 0xf8, 0x24, 0x60, 0x30, 0x36, 0x05, 0x23, 0x4f, 0xf0, + 0x70, 0x62, 0x18, 0x21, 0x00, 0xf0, 0x8b, 0xf8, 0x05, 0x23, 0x4f, 0xf4, + 0x7c, 0x12, 0x10, 0x21, 0x00, 0xf0, 0x85, 0xf8, 0x05, 0x23, 0x4f, 0xf4, + 0x7c, 0x52, 0x08, 0x21, 0x00, 0xf0, 0x7f, 0xf8, 0x0a, 0x23, 0x3f, 0x22, + 0x00, 0x21, 0x00, 0xf0, 0x7a, 0xf8, 0x64, 0x1c, 0x08, 0x2c, 0xe2, 0xd3, + 0x54, 0x4e, 0x00, 0x24, 0x56, 0xf8, 0x24, 0x50, 0x6c, 0x35, 0x05, 0x23, + 0x00, 0xf0, 0x87, 0xf8, 0x05, 0x23, 0x00, 0xf0, 0x73, 0xf8, 0x05, 0x23, + 0x00, 0xf0, 0x6b, 0xf8, 0x0a, 0x23, 0x00, 0xf0, 0xa5, 0xf8, 0x64, 0x1c, + 0x08, 0x2c, 0xed, 0xd3, 0x00, 0x24, 0x4b, 0x4e, 0x56, 0xf8, 0x24, 0x50, + 0x40, 0x35, 0x03, 0x23, 0x00, 0xf0, 0x73, 0xf8, 0x03, 0x23, 0x00, 0xf0, + 0x5f, 0xf8, 0x02, 0x23, 0x00, 0xf0, 0x57, 0xf8, 0x08, 0x23, 0x00, 0xf0, + 0x91, 0xf8, 0x64, 0x1c, 0x01, 0x2c, 0xed, 0xd9, 0x42, 0x4c, 0x43, 0x4d, + 0x43, 0x4e, 0x44, 0x4f, 0x31, 0x20, 0xff, 0xf7, 0x81, 0xfc, 0x06, 0x21, + 0x31, 0x20, 0xff, 0xf7, 0xe8, 0xfc, 0x32, 0x20, 0xff, 0xf7, 0x7a, 0xfc, + 0x01, 0x21, 0x32, 0x20, 0xff, 0xf7, 0xe1, 0xfc, 0x33, 0x20, 0xff, 0xf7, + 0x73, 0xfc, 0x01, 0x21, 0x33, 0x20, 0xff, 0xf7, 0xda, 0xfc, 0x01, 0x23, + 0x00, 0xf0, 0x3f, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0x44, 0xf8, 0x01, 0x23, + 0x00, 0xf0, 0x3d, 0xf8, 0x00, 0xf0, 0x48, 0xf8, 0x01, 0x23, 0x02, 0x22, + 0x01, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x18, 0xff, 0x31, 0x20, 0xff, 0xf7, + 0xb7, 0xfc, 0x32, 0x20, 0xff, 0xf7, 0xb4, 0xfc, 0x33, 0x20, 0xff, 0xf7, + 0xb1, 0xfc, 0x31, 0x20, 0xff, 0xf7, 0xa3, 0xfc, 0x32, 0x20, 0xff, 0xf7, + 0xa0, 0xfc, 0x33, 0x20, 0xff, 0xf7, 0x9d, 0xfc, 0x00, 0x23, 0x00, 0xf0, + 0x1c, 0xf8, 0x00, 0x23, 0x00, 0xf0, 0x21, 0xf8, 0x00, 0x23, 0x00, 0xf0, + 0x1a, 0xf8, 0x00, 0xf0, 0x25, 0xf8, 0x38, 0x46, 0x01, 0xb0, 0xbd, 0xe8, + 0xf0, 0x40, 0x01, 0x23, 0x02, 0x22, 0x01, 0x21, 0xf2, 0xe6, 0x30, 0x46, + 0xf9, 0xe6, 0x4f, 0xf4, 0x7c, 0x62, 0x06, 0x21, 0x28, 0x46, 0xf4, 0xe6, + 0x4f, 0xf4, 0x7c, 0x32, 0x0c, 0x21, 0x28, 0x46, 0xef, 0xe6, 0x20, 0x22, + 0x05, 0x21, 0x20, 0x46, 0xe2, 0xe6, 0x08, 0x22, 0x03, 0x21, 0x30, 0x46, + 0xde, 0xe6, 0x08, 0x22, 0x03, 0x21, 0x28, 0x46, 0xda, 0xe6, 0x4f, 0xf4, + 0x70, 0x12, 0x12, 0x21, 0x28, 0x46, 0xde, 0xe6, 0x01, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x38, 0x46, 0xd0, 0xe6, 0x00, 0x00, 0x11, 0x04, 0x00, 0x47, + 0xb4, 0x71, 0x02, 0x20, 0x0d, 0x04, 0x00, 0x47, 0xb7, 0x09, 0x00, 0x47, + 0xc0, 0x06, 0x00, 0x48, 0xb8, 0x09, 0x00, 0x47, 0xb9, 0x09, 0x00, 0x47, + 0x88, 0x94, 0x04, 0x01, 0x28, 0x96, 0x04, 0x01, 0xcc, 0x9d, 0x04, 0x01, + 0x21, 0x00, 0x00, 0x47, 0x22, 0x00, 0x00, 0x47, 0xc6, 0x00, 0x00, 0x47, + 0x16, 0x04, 0x00, 0x47, 0x3f, 0x22, 0x00, 0x21, 0x28, 0x46, 0xb8, 0xe6, + 0x80, 0xb5, 0xff, 0xf7, 0xc7, 0xfe, 0xbd, 0xe8, 0x08, 0x40, 0x01, 0x22, + 0x4f, 0xf6, 0x54, 0x71, 0x07, 0xe0, 0x80, 0xb5, 0xff, 0xf7, 0xbe, 0xfe, + 0xbd, 0xe8, 0x08, 0x40, 0x03, 0x22, 0x4f, 0xf6, 0x55, 0x71, 0x01, 0x20, + 0x02, 0xf0, 0xc8, 0xbf, 0x80, 0xb5, 0xff, 0xf7, 0xb3, 0xfe, 0xbd, 0xe8, + 0x08, 0x40, 0x03, 0x22, 0x4f, 0xf6, 0x56, 0x71, 0xf3, 0xe7, 0x00, 0x00, + 0x7c, 0xb5, 0x00, 0x24, 0x00, 0x28, 0x40, 0xd0, 0x23, 0x48, 0x01, 0x78, + 0xc1, 0xf3, 0x80, 0x11, 0x11, 0xb9, 0x4b, 0xf2, 0x01, 0x34, 0x38, 0xe0, + 0x01, 0x7b, 0xc1, 0xf3, 0x80, 0x11, 0x11, 0xb9, 0x4b, 0xf2, 0x02, 0x34, + 0x31, 0xe0, 0x03, 0x78, 0x00, 0x7b, 0x03, 0xf0, 0x3f, 0x03, 0x00, 0xf0, + 0x3f, 0x00, 0x83, 0x42, 0x05, 0xd0, 0x00, 0x90, 0xb3, 0x21, 0x18, 0x4a, + 0x02, 0x20, 0xf5, 0xf7, 0x26, 0xfc, 0x17, 0x49, 0x17, 0x4a, 0x08, 0x68, + 0x13, 0x68, 0x00, 0xf1, 0xb8, 0x01, 0x08, 0x68, 0x18, 0x40, 0x0b, 0x68, + 0x11, 0x68, 0x14, 0x4a, 0x0b, 0x40, 0x05, 0x04, 0x03, 0xf0, 0xff, 0x03, + 0x43, 0xea, 0x15, 0x60, 0x00, 0x21, 0xef, 0xf3, 0x10, 0x85, 0x20, 0xfa, + 0x01, 0xf3, 0xdb, 0x07, 0x08, 0xd5, 0x52, 0xf8, 0x21, 0x30, 0x72, 0xb6, + 0x1e, 0x78, 0x06, 0xf0, 0xef, 0x06, 0x1e, 0x70, 0x85, 0xf3, 0x10, 0x88, + 0x49, 0x1c, 0x08, 0x29, 0xef, 0xdb, 0x20, 0x46, 0x76, 0xbd, 0x02, 0x48, + 0x00, 0x78, 0x00, 0xf0, 0x3f, 0x00, 0x70, 0x47, 0x58, 0x04, 0x00, 0x47, + 0x04, 0x90, 0x04, 0x01, 0xb4, 0x76, 0x02, 0x20, 0xb0, 0x76, 0x02, 0x20, + 0x68, 0x94, 0x04, 0x01, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x78, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x70, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0xf8, 0xb5, 0x07, 0x46, + 0x00, 0x24, 0x1f, 0x2f, 0x63, 0xd8, 0x84, 0x4d, 0x89, 0xa2, 0x1d, 0x2f, + 0x24, 0xbf, 0x2c, 0x7d, 0x04, 0xf0, 0x01, 0x04, 0x23, 0x46, 0xff, 0x21, + 0x03, 0x20, 0xf5, 0xf7, 0xd2, 0xfb, 0xa4, 0xb1, 0x1d, 0x2f, 0x04, 0xd1, + 0x2c, 0x7a, 0x68, 0x7a, 0xa9, 0x7a, 0xea, 0x7a, 0x48, 0xe0, 0x1e, 0x2f, + 0x04, 0xd1, 0x2c, 0x7b, 0x68, 0x7b, 0xa9, 0x7b, 0xea, 0x7b, 0x41, 0xe0, + 0x1f, 0x2f, 0x04, 0xd1, 0x2c, 0x7c, 0x68, 0x7c, 0xa9, 0x7c, 0xea, 0x7c, + 0x3a, 0xe0, 0xfb, 0xb2, 0x1f, 0x22, 0x00, 0x21, 0x28, 0x46, 0xff, 0xf7, + 0xc5, 0xff, 0x00, 0xf0, 0xc5, 0xf8, 0x00, 0x26, 0x05, 0x24, 0x6f, 0x4f, + 0x4f, 0xf4, 0xfa, 0x60, 0x00, 0x22, 0x39, 0x78, 0xc9, 0x07, 0x02, 0xd4, + 0xb9, 0x79, 0xc9, 0x07, 0x02, 0xd4, 0x8d, 0xf8, 0x00, 0x20, 0x07, 0xe0, + 0x01, 0x26, 0x0b, 0xe0, 0x00, 0xbf, 0x9d, 0xf8, 0x00, 0x10, 0x49, 0x1c, + 0x8d, 0xf8, 0x00, 0x10, 0x9d, 0xf8, 0x00, 0x10, 0x10, 0x29, 0xf5, 0xd3, + 0x40, 0x1e, 0xe8, 0xd1, 0x38, 0x78, 0xc0, 0x07, 0x02, 0xd5, 0x00, 0xf0, + 0xa3, 0xf8, 0x02, 0xe0, 0xb8, 0x79, 0xc0, 0x07, 0x08, 0xd4, 0x64, 0x1e, + 0xda, 0xd1, 0x2e, 0xb9, 0x03, 0x22, 0x4f, 0xf6, 0x79, 0x71, 0x01, 0x20, + 0x02, 0xf0, 0xfc, 0xfe, 0x2c, 0x79, 0xe8, 0x78, 0xa9, 0x78, 0x6a, 0x78, + 0x44, 0xea, 0x00, 0x24, 0x44, 0xea, 0x01, 0x44, 0x44, 0xea, 0x02, 0x64, + 0x05, 0xe0, 0x3b, 0x46, 0x5c, 0xa2, 0xff, 0x21, 0x01, 0x20, 0xf5, 0xf7, + 0x74, 0xfb, 0x20, 0x46, 0xf2, 0xbd, 0xf8, 0xb5, 0xf4, 0xf7, 0x8d, 0xfa, + 0x4e, 0x4e, 0x4f, 0x4c, 0x31, 0x68, 0x41, 0xf2, 0x07, 0x07, 0x4f, 0xf6, + 0x1a, 0x75, 0xca, 0x5d, 0xd2, 0x09, 0x22, 0x73, 0xc8, 0xb1, 0x0b, 0x20, + 0xff, 0xf7, 0x7e, 0xff, 0x00, 0x0e, 0xe0, 0x71, 0x07, 0xd1, 0x1f, 0x20, + 0xff, 0xf7, 0x78, 0xff, 0x00, 0x0e, 0x04, 0xbf, 0x01, 0x21, 0x21, 0x73, + 0xa0, 0x71, 0x20, 0x70, 0x31, 0x68, 0x43, 0x4b, 0xca, 0x5d, 0x22, 0x72, + 0x1a, 0x78, 0x62, 0x72, 0xc9, 0x5d, 0x81, 0x42, 0x01, 0xd0, 0x20, 0x7b, + 0x50, 0xb3, 0x30, 0x68, 0x00, 0xf5, 0x81, 0x50, 0x00, 0x25, 0x01, 0x79, + 0x01, 0xf0, 0x0f, 0x01, 0x61, 0x70, 0x02, 0x78, 0x02, 0xf0, 0x0f, 0x02, + 0x11, 0x43, 0x81, 0xf0, 0xff, 0x01, 0x61, 0x70, 0x01, 0x79, 0x09, 0x09, + 0xa1, 0x70, 0x02, 0x78, 0x41, 0xea, 0x12, 0x11, 0x81, 0xf0, 0xff, 0x01, + 0xa1, 0x70, 0x81, 0x78, 0xc1, 0xf3, 0x01, 0x11, 0x81, 0xf0, 0x03, 0x01, + 0xe1, 0x70, 0x81, 0x78, 0xc9, 0x09, 0x21, 0x71, 0x81, 0xf0, 0x01, 0x01, + 0x80, 0x78, 0x21, 0x71, 0xc0, 0xf3, 0x80, 0x10, 0x60, 0x71, 0x80, 0xf0, + 0x01, 0x00, 0x60, 0x71, 0x28, 0x46, 0xf2, 0xbd, 0x25, 0x48, 0x28, 0x4a, + 0x70, 0xb5, 0x01, 0x68, 0x24, 0x48, 0x51, 0xf8, 0xb8, 0x3f, 0x16, 0x68, + 0x85, 0x78, 0x33, 0x40, 0x03, 0xf0, 0xff, 0x03, 0x00, 0x24, 0x2b, 0x43, + 0xab, 0x42, 0x11, 0xd1, 0x0b, 0x68, 0x16, 0x68, 0x45, 0x78, 0x33, 0x40, + 0x1b, 0x04, 0x55, 0xea, 0x13, 0x63, 0xab, 0x42, 0x08, 0xd1, 0x0b, 0x68, + 0xc1, 0x78, 0x33, 0x40, 0x1b, 0x0c, 0x03, 0xf0, 0x03, 0x03, 0x0b, 0x43, + 0x8b, 0x42, 0x09, 0xd0, 0x00, 0x7b, 0x4f, 0xf6, 0x19, 0x71, 0x00, 0x28, + 0x0f, 0xbf, 0x0c, 0x46, 0x01, 0x22, 0x01, 0x20, 0x02, 0xf0, 0x68, 0xfe, + 0x20, 0x46, 0x70, 0xbd, 0x1c, 0xb5, 0x0d, 0x4c, 0x00, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, 0xf6, 0xfe, 0x00, 0x22, 0x00, 0x92, + 0x03, 0xe0, 0x00, 0xbf, 0x00, 0x98, 0x40, 0x1c, 0x00, 0x90, 0x00, 0x98, + 0x10, 0x28, 0xf8, 0xd3, 0x20, 0x46, 0x02, 0xb0, 0xbd, 0xe8, 0x10, 0x40, + 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0xe3, 0xe6, 0x92, 0x01, 0x00, 0x47, + 0x8b, 0x01, 0x00, 0x47, 0xb4, 0x76, 0x02, 0x20, 0x04, 0x41, 0x00, 0x20, + 0x04, 0x00, 0x00, 0x47, 0xb0, 0x76, 0x02, 0x20, 0x6f, 0x76, 0x65, 0x72, + 0x72, 0x69, 0x64, 0x65, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x20, + 0x25, 0x64, 0x0a, 0x00, 0x45, 0x46, 0x55, 0x53, 0x45, 0x5f, 0x52, 0x65, + 0x61, 0x64, 0x46, 0x75, 0x73, 0x65, 0x3a, 0x20, 0x62, 0x61, 0x64, 0x20, + 0x61, 0x64, 0x64, 0x72, 0x20, 0x25, 0x58, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x38, 0xb5, 0x00, 0xf0, 0x1f, 0xf8, 0x4f, 0xf4, + 0x80, 0x72, 0x08, 0x21, 0x28, 0x46, 0xff, 0xf7, 0xe9, 0xff, 0x23, 0x46, + 0x28, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x4f, 0xf4, 0x00, 0x72, + 0x09, 0x21, 0xdf, 0xe7, 0x38, 0xb5, 0x00, 0xf0, 0x0d, 0xf8, 0x10, 0x22, + 0x04, 0x21, 0x28, 0x46, 0xff, 0xf7, 0xd8, 0xff, 0x23, 0x46, 0x28, 0x46, + 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x20, 0x22, 0x05, 0x21, 0xcf, 0xe7, + 0xdf, 0xf8, 0xa4, 0x55, 0x05, 0xeb, 0xc0, 0x00, 0x1c, 0x46, 0x50, 0xf8, + 0x21, 0x50, 0x13, 0x46, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x43, 0x87, 0xb0, + 0x05, 0x46, 0x0e, 0x9c, 0x89, 0x46, 0x16, 0x46, 0x1f, 0x46, 0xc0, 0xb2, + 0x12, 0xf0, 0x83, 0xfa, 0x00, 0x21, 0x01, 0x22, 0x8d, 0xf8, 0x01, 0x10, + 0x8d, 0xf8, 0x00, 0x20, 0x8d, 0xf8, 0x03, 0x20, 0x01, 0x96, 0x80, 0x46, + 0x02, 0x97, 0x8d, 0xf8, 0x0c, 0x90, 0x8d, 0xf8, 0x0d, 0x90, 0x8d, 0xf8, + 0x18, 0x40, 0x8d, 0xf8, 0x02, 0x80, 0x00, 0xf0, 0xe6, 0xf8, 0x04, 0x00, + 0x05, 0xd1, 0x00, 0x23, 0x03, 0x22, 0x41, 0x46, 0xe8, 0xb2, 0x12, 0xf0, + 0x75, 0xfa, 0x20, 0x46, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x83, 0x30, 0xb5, + 0x87, 0xb0, 0x01, 0x25, 0x02, 0x93, 0x8d, 0xf8, 0x02, 0x10, 0x00, 0x23, + 0x0a, 0x9c, 0x01, 0x92, 0x8d, 0xf8, 0x03, 0x30, 0x8d, 0xf8, 0x00, 0x50, + 0x00, 0xf0, 0x17, 0xf8, 0x04, 0xf0, 0x66, 0xfa, 0x07, 0xb0, 0x30, 0xbd, + 0x5c, 0xb5, 0x87, 0xb0, 0x01, 0x26, 0x01, 0x92, 0x8d, 0xf8, 0x02, 0x10, + 0x00, 0x22, 0x0c, 0x9c, 0x02, 0x93, 0x8d, 0xf8, 0x03, 0x20, 0x00, 0xf0, + 0x04, 0xf8, 0x12, 0xf0, 0xa7, 0xfa, 0x09, 0xb0, 0x50, 0xbd, 0x8d, 0xf8, + 0x00, 0x60, 0x8d, 0xf8, 0x18, 0x40, 0x69, 0x46, 0xc0, 0xb2, 0x70, 0x47, + 0x2d, 0xe9, 0xf8, 0x41, 0x05, 0x46, 0x87, 0xb0, 0x2e, 0x68, 0x69, 0x7a, + 0x8d, 0xf8, 0x01, 0x10, 0x29, 0x7a, 0x8d, 0xf8, 0x00, 0x10, 0x69, 0x46, + 0xa8, 0x7a, 0x8d, 0xf8, 0x03, 0x00, 0xe8, 0x68, 0x01, 0x90, 0x28, 0x69, + 0x02, 0x90, 0x28, 0x7d, 0x8d, 0xf8, 0x0c, 0x00, 0x68, 0x7d, 0x8d, 0xf8, + 0x0d, 0x00, 0xa8, 0x7d, 0x8d, 0xf8, 0x18, 0x00, 0xf0, 0xb2, 0x6a, 0x68, + 0x8d, 0xf8, 0x02, 0x20, 0x12, 0xf0, 0x8a, 0xfb, 0x04, 0x00, 0x25, 0xd1, + 0x28, 0x68, 0xf5, 0xf7, 0xff, 0xf8, 0x9d, 0xf8, 0x02, 0x80, 0x43, 0x46, + 0x1c, 0x22, 0x53, 0x43, 0x38, 0x21, 0xdf, 0xf8, 0x90, 0x24, 0x48, 0x43, + 0x10, 0x44, 0x9d, 0xf8, 0x00, 0x20, 0xc7, 0x18, 0x01, 0x2a, 0x0d, 0xd1, + 0x18, 0x44, 0x69, 0x46, 0x1c, 0x22, 0xe7, 0xf7, 0x4f, 0xf8, 0x02, 0x20, + 0x38, 0x76, 0x00, 0x23, 0x03, 0x22, 0x41, 0x46, 0xf0, 0xb2, 0x12, 0xf0, + 0x03, 0xfa, 0x05, 0xe0, 0x00, 0x20, 0x38, 0x76, 0x41, 0x46, 0x28, 0x68, + 0x00, 0xf0, 0x60, 0xfb, 0x5f, 0xe0, 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, + 0xc0, 0xb2, 0x12, 0xf0, 0xe6, 0xf9, 0x01, 0x46, 0x2a, 0x46, 0x20, 0x46, + 0xbd, 0xe8, 0x38, 0x40, 0x2d, 0xe9, 0xf8, 0x41, 0x87, 0xb0, 0x05, 0x46, + 0x0c, 0x46, 0x90, 0x46, 0xf5, 0xf7, 0xc8, 0xf8, 0x38, 0x21, 0xdf, 0xf8, + 0x2c, 0x24, 0x48, 0x43, 0x1c, 0x23, 0x10, 0x44, 0x63, 0x43, 0xc1, 0x18, + 0x27, 0x46, 0x0a, 0x7e, 0x02, 0x2a, 0x0d, 0xd1, 0x08, 0x78, 0x58, 0xb1, + 0x8f, 0x70, 0xe8, 0xb2, 0x12, 0xf0, 0x3c, 0xfb, 0x04, 0x46, 0x00, 0x23, + 0x03, 0x22, 0xf9, 0xb2, 0xe8, 0xb2, 0x12, 0xf0, 0xcf, 0xf9, 0x32, 0xe0, + 0x00, 0x23, 0x00, 0x22, 0xf9, 0xb2, 0xe8, 0xb2, 0xff, 0xf7, 0x12, 0xff, + 0xee, 0xb2, 0x00, 0x23, 0x00, 0x22, 0xf9, 0xb2, 0xe8, 0xb2, 0xff, 0xf7, + 0xf9, 0xfe, 0xdf, 0xf8, 0xdc, 0x03, 0x00, 0xeb, 0xc6, 0x0e, 0xfe, 0xb2, + 0x5e, 0xf8, 0x26, 0x00, 0x00, 0x23, 0x00, 0xf0, 0x24, 0xf8, 0x00, 0x20, + 0xad, 0xf8, 0x00, 0x00, 0x8d, 0xf8, 0x18, 0x80, 0x8d, 0xf8, 0x02, 0x40, + 0x00, 0xf0, 0x17, 0xf8, 0x04, 0x00, 0x08, 0xd1, 0x01, 0x21, 0x8d, 0xf8, + 0x01, 0x10, 0x00, 0x22, 0x8d, 0xf8, 0x00, 0x20, 0x00, 0xf0, 0x0d, 0xf8, + 0x04, 0x46, 0xf9, 0xb2, 0xe8, 0xb2, 0x12, 0xf0, 0xa3, 0xfc, 0xf9, 0xb2, + 0x28, 0x46, 0x00, 0xf0, 0xff, 0xfa, 0x20, 0x46, 0x08, 0xb0, 0xbd, 0xe8, + 0xf0, 0x81, 0x69, 0x46, 0xe8, 0xb2, 0x12, 0xf0, 0xf9, 0xba, 0x4f, 0xf4, + 0x80, 0x52, 0x0c, 0x21, 0xb8, 0xe6, 0x38, 0xb5, 0x0c, 0x46, 0xdf, 0xf8, + 0x7c, 0x13, 0x51, 0xf8, 0x20, 0x50, 0x13, 0x46, 0x2d, 0x1d, 0x4f, 0xf0, + 0x00, 0x72, 0x19, 0x21, 0x28, 0x46, 0xff, 0xf7, 0xab, 0xfe, 0x23, 0x46, + 0x28, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x4f, 0xf0, 0x80, 0x72, + 0x18, 0x21, 0xa1, 0xe6, 0x10, 0xb5, 0x04, 0x46, 0xc0, 0xb2, 0x12, 0xf0, + 0x64, 0xf9, 0x01, 0x46, 0xe0, 0xb2, 0xbd, 0xe8, 0x10, 0x40, 0x12, 0xf0, + 0xad, 0xbc, 0x5c, 0xb5, 0x87, 0xb0, 0x0c, 0x9c, 0x8d, 0xf8, 0x02, 0x10, + 0x01, 0x26, 0x01, 0x92, 0x02, 0x93, 0xff, 0xf7, 0x16, 0xff, 0x12, 0xf0, + 0xa7, 0xfc, 0x09, 0xb0, 0x50, 0xbd, 0x18, 0xb5, 0x87, 0xb0, 0x00, 0x24, + 0x8d, 0xf8, 0x02, 0x10, 0x8d, 0xf8, 0x18, 0x20, 0x8d, 0xf8, 0x00, 0x40, + 0x69, 0x46, 0xc0, 0xb2, 0x12, 0xf0, 0x98, 0xfc, 0x08, 0xb0, 0x10, 0xbd, + 0x18, 0xb5, 0x87, 0xb0, 0x00, 0xf0, 0x0c, 0xf8, 0x04, 0xf0, 0x50, 0xf9, + 0x08, 0xb0, 0x10, 0xbd, 0x18, 0xb5, 0x87, 0xb0, 0x00, 0xf0, 0x04, 0xf8, + 0x12, 0xf0, 0x9a, 0xf9, 0x08, 0xb0, 0x10, 0xbd, 0x00, 0x24, 0x8d, 0xf8, + 0x02, 0x10, 0x8d, 0xf8, 0x18, 0x20, 0x8d, 0xf8, 0x00, 0x40, 0x8d, 0xf8, + 0x03, 0x40, 0x69, 0x46, 0xc0, 0xb2, 0x70, 0x47, 0xf8, 0xb5, 0xf4, 0xf7, + 0xed, 0xff, 0x05, 0x46, 0xe0, 0x21, 0xaf, 0x48, 0xf8, 0xf7, 0x8a, 0xfd, + 0x00, 0x24, 0x00, 0x26, 0x25, 0xfa, 0x06, 0xf0, 0xc0, 0x07, 0x0f, 0xd5, + 0x00, 0x27, 0x01, 0x22, 0x39, 0x46, 0x30, 0x46, 0xff, 0xf7, 0x30, 0xff, + 0x04, 0x46, 0xf9, 0xb2, 0x30, 0x46, 0x00, 0xf0, 0x7f, 0xfa, 0x7f, 0x1c, + 0x01, 0x2f, 0x01, 0xd8, 0x00, 0x2c, 0xf0, 0xd0, 0x76, 0x1c, 0x08, 0x2e, + 0x01, 0xd2, 0x00, 0x2c, 0xe6, 0xd0, 0x20, 0x46, 0xf2, 0xbd, 0x2d, 0xe9, + 0xf8, 0x46, 0xf4, 0xf7, 0xc7, 0xff, 0x00, 0x26, 0x81, 0x46, 0x00, 0x27, + 0x9d, 0x4d, 0x29, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x32, 0xd5, 0x00, 0x24, + 0xfe, 0xb2, 0x9b, 0x48, 0x00, 0x68, 0x81, 0x19, 0xed, 0x23, 0x91, 0xf8, + 0xbc, 0x20, 0x29, 0x68, 0x5a, 0x43, 0x10, 0x44, 0x00, 0xf2, 0x44, 0x4a, + 0x01, 0xeb, 0x86, 0x00, 0xe1, 0xb2, 0x82, 0x6a, 0xf8, 0xb2, 0x12, 0xf0, + 0x29, 0xfc, 0xe1, 0xb2, 0xf8, 0xb2, 0x12, 0xf0, 0xc5, 0xf8, 0x70, 0xb1, + 0x32, 0x21, 0x61, 0x43, 0x51, 0x44, 0x08, 0x7d, 0x48, 0xb1, 0xd1, 0xf8, + 0x19, 0x20, 0x01, 0x20, 0x00, 0x90, 0x00, 0x23, 0x21, 0x46, 0x38, 0x46, + 0xff, 0xf7, 0x6f, 0xff, 0x04, 0xe0, 0x01, 0x22, 0x21, 0x46, 0x38, 0x46, + 0xff, 0xf7, 0x77, 0xff, 0x64, 0x1c, 0x01, 0x2c, 0x01, 0xd8, 0x00, 0x28, + 0xcf, 0xd0, 0x06, 0x46, 0x7f, 0x1c, 0x08, 0x2f, 0x01, 0xd2, 0x00, 0x2e, + 0xc3, 0xd0, 0x30, 0x46, 0xbd, 0xe8, 0xf2, 0x86, 0x2d, 0xe9, 0xf0, 0x41, + 0x8a, 0xb0, 0xf4, 0xf7, 0x71, 0xff, 0x06, 0x46, 0xf4, 0xf7, 0x7e, 0xff, + 0x00, 0x24, 0xad, 0xf8, 0x08, 0x40, 0x02, 0xad, 0x00, 0x27, 0x26, 0xfa, + 0x07, 0xf0, 0xc0, 0x07, 0x4f, 0xd5, 0x01, 0xa9, 0x38, 0x46, 0x01, 0xf0, + 0x30, 0xfc, 0x04, 0x46, 0x01, 0x98, 0xf4, 0xf7, 0x98, 0xff, 0x00, 0x2c, + 0x45, 0xd1, 0x01, 0x99, 0xff, 0x29, 0x18, 0xbf, 0xff, 0x28, 0x40, 0xd0, + 0x68, 0x5c, 0x00, 0x28, 0x3d, 0xd1, 0x6d, 0x49, 0x09, 0x68, 0x01, 0xaa, + 0xf8, 0xb2, 0x13, 0x78, 0x08, 0x44, 0x70, 0x24, 0x63, 0x43, 0x90, 0xf8, + 0xbc, 0x00, 0x19, 0x44, 0x01, 0xf5, 0x32, 0x61, 0x01, 0xeb, 0x80, 0x08, + 0xd8, 0xf8, 0x37, 0x20, 0x3a, 0xb1, 0x01, 0x20, 0x00, 0x90, 0x00, 0x23, + 0x01, 0x98, 0x00, 0x21, 0xff, 0xf7, 0x2e, 0xfe, 0x04, 0xe0, 0x01, 0x98, + 0x01, 0x22, 0x00, 0x21, 0xff, 0xf7, 0x3e, 0xff, 0x04, 0x00, 0x1c, 0xd1, + 0xd8, 0xf8, 0x47, 0x00, 0x78, 0xb1, 0x04, 0x90, 0x01, 0x21, 0x8d, 0xf8, + 0x0c, 0x10, 0x8d, 0xf8, 0x0e, 0x10, 0x00, 0x22, 0x8d, 0xf8, 0x24, 0x10, + 0x05, 0x92, 0x03, 0xa9, 0x01, 0x98, 0xc0, 0xb2, 0x12, 0xf0, 0xca, 0xf8, + 0x04, 0xe0, 0x01, 0x98, 0x01, 0x22, 0x01, 0x21, 0xff, 0xf7, 0x24, 0xff, + 0x04, 0x00, 0x02, 0xd1, 0x01, 0x99, 0x01, 0x20, 0x68, 0x54, 0x7f, 0x1c, + 0x08, 0x2f, 0x01, 0xd2, 0x00, 0x2c, 0xa6, 0xd0, 0x20, 0x46, 0x0a, 0xb0, + 0xbd, 0xe8, 0xf0, 0x81, 0x7c, 0xb5, 0xf4, 0xf7, 0x18, 0xff, 0x00, 0x24, + 0x05, 0x46, 0x00, 0x26, 0x25, 0xfa, 0x06, 0xf0, 0xc0, 0x07, 0x24, 0xd5, + 0x00, 0x24, 0x44, 0x48, 0x00, 0x68, 0x81, 0x19, 0xe0, 0x23, 0x91, 0xf8, + 0xbc, 0x20, 0x5a, 0x43, 0x10, 0x44, 0x32, 0x21, 0xc4, 0x30, 0x61, 0x43, + 0x01, 0x44, 0x91, 0xf8, 0x25, 0x00, 0x48, 0xb1, 0xd1, 0xf8, 0x2a, 0x20, + 0x01, 0x20, 0x00, 0x90, 0x00, 0x23, 0x21, 0x46, 0x30, 0x46, 0xff, 0xf7, + 0xca, 0xfd, 0x04, 0xe0, 0x01, 0x22, 0x21, 0x46, 0x30, 0x46, 0xff, 0xf7, + 0xe5, 0xfe, 0x64, 0x1c, 0x01, 0x2c, 0x01, 0xdc, 0x00, 0x28, 0xdc, 0xd0, + 0x04, 0x46, 0x76, 0x1c, 0x08, 0x2e, 0x01, 0xda, 0x00, 0x2c, 0xd1, 0xd0, + 0x20, 0x46, 0x76, 0xbd, 0x78, 0xb5, 0x85, 0xb0, 0xf4, 0xf7, 0xe0, 0xfe, + 0x00, 0x24, 0x05, 0x46, 0x00, 0x26, 0x25, 0xfa, 0x06, 0xf0, 0xc0, 0x07, + 0x21, 0xd5, 0x00, 0xf0, 0xed, 0xf8, 0x04, 0x00, 0x1d, 0xd1, 0x00, 0x98, + 0xff, 0x28, 0x13, 0xd0, 0x25, 0x49, 0x08, 0x68, 0xf2, 0xb2, 0x02, 0x44, + 0x70, 0x24, 0x92, 0xf8, 0xbc, 0x10, 0x9d, 0xf8, 0x00, 0x20, 0x62, 0x43, + 0x10, 0x44, 0x00, 0xf5, 0x32, 0x60, 0x00, 0xeb, 0x81, 0x00, 0xd0, 0xf8, + 0x37, 0x20, 0xd0, 0xf8, 0x47, 0x30, 0x01, 0xe0, 0x00, 0x22, 0x00, 0x23, + 0x00, 0x99, 0x30, 0x46, 0x00, 0xf0, 0x0d, 0xf9, 0x04, 0x46, 0x76, 0x1c, + 0x08, 0x2e, 0x01, 0xd2, 0x00, 0x2c, 0xd4, 0xd0, 0x20, 0x46, 0x00, 0x26, + 0x00, 0x24, 0xe0, 0xb9, 0x25, 0xfa, 0x06, 0xf1, 0xc9, 0x07, 0x15, 0xd5, + 0x00, 0xf0, 0xbe, 0xf8, 0x90, 0xb9, 0x00, 0x98, 0xff, 0x28, 0x04, 0xd0, + 0x01, 0x46, 0x30, 0x46, 0x00, 0xf0, 0xd3, 0xf8, 0x0a, 0xe0, 0x01, 0xa8, + 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x80, 0xe8, 0x1e, 0x00, 0xf0, 0xb2, + 0xe7, 0xf7, 0xd3, 0xfe, 0x00, 0xf0, 0x48, 0xfd, 0x76, 0x1c, 0x08, 0x2e, + 0xe1, 0xd3, 0x06, 0xb0, 0x70, 0xbd, 0x00, 0x00, 0xc8, 0x8e, 0x04, 0x01, + 0x8c, 0x5f, 0x02, 0x20, 0x08, 0x97, 0x04, 0x01, 0xb8, 0x76, 0x02, 0x20, + 0xb4, 0x76, 0x02, 0x20, 0x2d, 0xe9, 0xf8, 0x4f, 0x83, 0x46, 0x0e, 0x46, + 0x90, 0x46, 0x99, 0x46, 0xf3, 0xf7, 0xb7, 0xfe, 0x00, 0x25, 0x00, 0x24, + 0x01, 0x2e, 0xa2, 0x46, 0x0a, 0xd1, 0x01, 0x28, 0x5d, 0xd1, 0x4a, 0x46, + 0x41, 0x46, 0x5f, 0xfa, 0x8b, 0xf0, 0x12, 0xf0, 0xde, 0xf8, 0x00, 0xf0, + 0x1e, 0xfd, 0x53, 0xe0, 0x0a, 0x9e, 0x00, 0x27, 0x38, 0x46, 0xf4, 0xf7, + 0x8b, 0xfe, 0x2b, 0xfa, 0x07, 0xf1, 0xc9, 0x07, 0x2c, 0xd5, 0xff, 0x28, + 0x2a, 0xd0, 0x69, 0x46, 0x38, 0x46, 0x01, 0xf0, 0x1e, 0xfb, 0x04, 0x00, + 0x0f, 0xd1, 0x00, 0x98, 0xff, 0x28, 0x0d, 0xd0, 0x49, 0x46, 0xc0, 0xb2, + 0x12, 0xf0, 0xb4, 0xf8, 0x04, 0x46, 0x00, 0x98, 0x08, 0xb9, 0x01, 0x25, + 0x03, 0xe0, 0x01, 0x28, 0x08, 0xbf, 0x4f, 0xf0, 0x01, 0x0a, 0x3c, 0xb9, + 0x4a, 0x46, 0x41, 0x46, 0xf8, 0xb2, 0x12, 0xf0, 0xb4, 0xf8, 0x00, 0xf0, + 0xf4, 0xfc, 0x04, 0x46, 0x00, 0x2c, 0x08, 0xbf, 0x01, 0x2e, 0x07, 0xd1, + 0x00, 0x9c, 0xf8, 0xb2, 0xe7, 0xf7, 0x74, 0xfe, 0x20, 0x46, 0x00, 0xf0, + 0xf6, 0xfc, 0x04, 0x46, 0x7f, 0x1c, 0x08, 0x2f, 0x01, 0xd2, 0x00, 0x2c, + 0xc6, 0xd0, 0x20, 0x46, 0x00, 0x24, 0xa8, 0xb9, 0x69, 0x46, 0x20, 0x46, + 0x01, 0xf0, 0xeb, 0xfa, 0x68, 0xb9, 0x00, 0x99, 0x11, 0xb9, 0x29, 0x00, + 0x05, 0xd1, 0x08, 0xe0, 0x01, 0x29, 0x06, 0xd1, 0x5f, 0xea, 0x0a, 0x01, + 0x03, 0xd0, 0x00, 0x99, 0x20, 0x46, 0x00, 0xf0, 0x4e, 0xf8, 0x64, 0x1c, + 0x08, 0x2c, 0xe8, 0xd3, 0x04, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x8f, + 0x7c, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x00, 0x26, 0x00, 0xf0, 0x24, 0xf8, + 0x00, 0x28, 0x04, 0xbf, 0x00, 0x99, 0xa1, 0x42, 0x08, 0xd1, 0xf0, 0xb2, + 0xe7, 0xf7, 0x2b, 0xfe, 0x03, 0x46, 0x00, 0x99, 0x2a, 0x46, 0x30, 0x46, + 0x00, 0xf0, 0x55, 0xf8, 0x76, 0x1c, 0x08, 0x2e, 0x01, 0xd2, 0x00, 0x28, + 0xea, 0xd0, 0x00, 0x25, 0x68, 0xb9, 0x69, 0x46, 0x28, 0x46, 0x01, 0xf0, + 0xb6, 0xfa, 0x00, 0x28, 0x01, 0xbf, 0x00, 0x99, 0xa1, 0x42, 0x28, 0x46, + 0x00, 0xf0, 0x21, 0xf8, 0x6d, 0x1c, 0x08, 0x2d, 0xf0, 0xd3, 0x76, 0xbd, + 0x69, 0x46, 0x30, 0x46, 0x01, 0xf0, 0xa7, 0xba, 0x70, 0xb5, 0xf4, 0xf7, + 0xd5, 0xfd, 0x05, 0x46, 0x00, 0x26, 0x00, 0x20, 0x25, 0xfa, 0x06, 0xf1, + 0xc9, 0x07, 0x08, 0xd5, 0xff, 0xf7, 0xf0, 0xff, 0x28, 0xb9, 0x00, 0x99, + 0xff, 0x29, 0x1c, 0xbf, 0x30, 0x46, 0x00, 0xf0, 0x06, 0xf8, 0x76, 0x1c, + 0x08, 0x2e, 0x01, 0xd2, 0x00, 0x28, 0xed, 0xd0, 0x62, 0xbd, 0x78, 0xb5, + 0x85, 0xb0, 0x05, 0x46, 0x0e, 0x46, 0x69, 0x46, 0x30, 0x46, 0x03, 0xf0, + 0x19, 0xfe, 0x04, 0x00, 0x06, 0xd1, 0x9d, 0xf8, 0x00, 0x10, 0x01, 0xaa, + 0x28, 0x46, 0x03, 0xf0, 0x63, 0xfe, 0x04, 0x46, 0x64, 0xb9, 0x01, 0xa9, + 0x30, 0x46, 0x03, 0xf0, 0xd6, 0xfc, 0x02, 0x99, 0xe8, 0xb2, 0xe7, 0xf7, + 0xf0, 0xfd, 0xff, 0x2e, 0x02, 0xd0, 0x00, 0xf0, 0x63, 0xfc, 0x04, 0x46, + 0x20, 0x46, 0x06, 0xb0, 0x70, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x08, 0x46, + 0x1e, 0x46, 0x15, 0x46, 0x31, 0x46, 0xc0, 0xb2, 0x12, 0xf0, 0x02, 0xf8, + 0x40, 0xb9, 0x32, 0x46, 0x29, 0x46, 0xe0, 0xb2, 0x12, 0xf0, 0x0b, 0xf8, + 0xbd, 0xe8, 0x70, 0x40, 0x00, 0xf0, 0x49, 0xbc, 0x70, 0xbd, 0x2d, 0xe9, + 0xfc, 0x41, 0x06, 0x46, 0x0d, 0x46, 0x90, 0x46, 0x1f, 0x46, 0xf3, 0xf7, + 0xca, 0xfd, 0x00, 0x24, 0x01, 0x2d, 0x09, 0xd1, 0x01, 0x28, 0x2e, 0xd1, + 0x41, 0x46, 0xf0, 0xb2, 0x12, 0xf0, 0x02, 0xf8, 0x00, 0xf0, 0x32, 0xfc, + 0x04, 0x46, 0x26, 0xe0, 0x00, 0x25, 0x28, 0x46, 0xf4, 0xf7, 0xa2, 0xfd, + 0x26, 0xfa, 0x05, 0xf1, 0xc9, 0x07, 0x19, 0xd5, 0xff, 0x28, 0x17, 0xd0, + 0x41, 0x46, 0xe8, 0xb2, 0x11, 0xf0, 0xf0, 0xff, 0x00, 0xf0, 0x20, 0xfc, + 0x04, 0x00, 0x08, 0xbf, 0x01, 0x2f, 0x0d, 0xd1, 0x00, 0x20, 0x00, 0x90, + 0x69, 0x46, 0x28, 0x46, 0x01, 0xf0, 0x29, 0xfa, 0x04, 0x00, 0x05, 0xd1, + 0x00, 0x98, 0xff, 0x28, 0x02, 0xd0, 0x00, 0xf0, 0x18, 0xfc, 0x04, 0x46, + 0x6d, 0x1c, 0x08, 0x2d, 0x01, 0xd2, 0x00, 0x2c, 0xd9, 0xd0, 0x20, 0x46, + 0xbd, 0xe8, 0xf6, 0x81, 0x78, 0xb5, 0x87, 0xb0, 0x0c, 0x46, 0x00, 0x26, + 0x05, 0x46, 0x8d, 0xf8, 0x02, 0x40, 0x8d, 0xf8, 0x01, 0x60, 0x69, 0x46, + 0xe8, 0xb2, 0x12, 0xf0, 0x3e, 0xf9, 0x9d, 0xf8, 0x00, 0x00, 0x06, 0x43, + 0x9d, 0xf8, 0x01, 0x00, 0x40, 0x1c, 0x8d, 0xf8, 0x01, 0x00, 0xc0, 0xb2, + 0x01, 0x28, 0xf0, 0xdd, 0xf6, 0xb2, 0x2e, 0xb9, 0x00, 0x23, 0x00, 0x22, + 0x21, 0x46, 0xe8, 0xb2, 0x11, 0xf0, 0x7c, 0xfe, 0x08, 0xb0, 0x70, 0xbd, + 0x00, 0x68, 0x02, 0x40, 0x22, 0xfa, 0x01, 0xf0, 0x70, 0x47, 0x30, 0xb5, + 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, + 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, + 0x30, 0xbd, 0xdf, 0xf8, 0x4c, 0x08, 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, + 0x18, 0xe0, 0xdf, 0xf8, 0x40, 0x08, 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, + 0xc0, 0xf3, 0x07, 0x20, 0x70, 0x47, 0xdf, 0xf8, 0x30, 0x08, 0x01, 0x68, + 0xd1, 0xf8, 0xb8, 0x00, 0xc0, 0xf3, 0x01, 0x40, 0x70, 0x47, 0xdf, 0xf8, + 0x20, 0x08, 0xdf, 0xf8, 0x20, 0x28, 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, + 0x11, 0x68, 0x08, 0x40, 0x00, 0xf0, 0xff, 0x00, 0x70, 0x47, 0xdf, 0xf8, + 0x08, 0x08, 0xdf, 0xf8, 0x08, 0x28, 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, + 0x11, 0x68, 0x08, 0x40, 0x00, 0x04, 0x00, 0x0e, 0x70, 0x47, 0xdf, 0xf8, + 0xf0, 0x07, 0xdf, 0xf8, 0xf0, 0x27, 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, + 0x11, 0x68, 0x08, 0x40, 0x00, 0x0c, 0x00, 0xf0, 0x03, 0x00, 0x70, 0x47, + 0x00, 0x23, 0x00, 0x22, 0xfe, 0xf7, 0xe5, 0xbe, 0x2d, 0xe9, 0xf8, 0x43, + 0x05, 0x46, 0x00, 0x24, 0x28, 0x00, 0x08, 0xd0, 0x12, 0xf0, 0x39, 0xfa, + 0x12, 0xf0, 0x3b, 0xfa, 0x01, 0x28, 0x18, 0xbf, 0x4b, 0xf2, 0x04, 0x14, + 0x64, 0xd1, 0xff, 0xf7, 0xd2, 0xff, 0x06, 0x46, 0xff, 0xf7, 0xc3, 0xff, + 0x07, 0x46, 0xff, 0xf7, 0xd8, 0xff, 0x80, 0x46, 0xdf, 0xf8, 0xa4, 0x97, + 0x02, 0x22, 0x49, 0x46, 0x30, 0x46, 0x00, 0xf0, 0x4e, 0xfb, 0x02, 0x22, + 0x09, 0xf1, 0x20, 0x01, 0x38, 0x46, 0x00, 0xf0, 0x48, 0xfb, 0x02, 0x22, + 0x09, 0xf1, 0x40, 0x01, 0x40, 0x46, 0x00, 0xf0, 0x42, 0xfb, 0x08, 0x22, + 0xdf, 0xf8, 0x80, 0x17, 0x01, 0x20, 0x00, 0xf0, 0x3c, 0xfb, 0x00, 0x21, + 0x30, 0x46, 0x00, 0xf0, 0xda, 0xf8, 0x00, 0x21, 0x38, 0x46, 0x00, 0xf0, + 0xea, 0xf8, 0x00, 0x21, 0x40, 0x46, 0x00, 0xf0, 0xfa, 0xf8, 0x00, 0x26, + 0xdf, 0xf8, 0x60, 0x77, 0x57, 0xf8, 0x26, 0x80, 0x00, 0x23, 0x4f, 0xf0, + 0xff, 0x32, 0x00, 0x21, 0x08, 0xf1, 0x18, 0x00, 0xff, 0xf7, 0x69, 0xff, + 0x00, 0x23, 0x4f, 0xf0, 0xff, 0x32, 0x00, 0x21, 0x08, 0xf1, 0x2c, 0x00, + 0xff, 0xf7, 0x61, 0xff, 0x76, 0x1c, 0x08, 0x2e, 0xea, 0xd3, 0xdf, 0xf8, + 0x38, 0x67, 0x30, 0x68, 0x00, 0xf0, 0x1c, 0xf8, 0x70, 0x68, 0x00, 0xf0, + 0x19, 0xf8, 0xff, 0xf7, 0x78, 0xff, 0x01, 0x21, 0x00, 0xf0, 0x4d, 0xfb, + 0x85, 0xb1, 0xef, 0xf3, 0x10, 0x80, 0x72, 0xb6, 0xdf, 0xf8, 0x18, 0x17, + 0x0a, 0x78, 0xff, 0x23, 0x0b, 0x70, 0x80, 0xf3, 0x10, 0x88, 0x01, 0x22, + 0x7c, 0x21, 0xdf, 0xf8, 0x0c, 0x07, 0x00, 0xf0, 0xd8, 0xf8, 0x04, 0x46, + 0x00, 0xf0, 0x6d, 0xbb, 0x00, 0x23, 0x4f, 0xf0, 0xff, 0x32, 0x00, 0x21, + 0x18, 0x30, 0x36, 0xe7, 0x2d, 0xe9, 0xf0, 0x41, 0x04, 0x46, 0x0d, 0x46, + 0x16, 0x46, 0xff, 0xf7, 0x60, 0xff, 0x00, 0xf0, 0x53, 0xf8, 0x18, 0xbf, + 0x4b, 0xf2, 0x01, 0x18, 0x1e, 0xd1, 0xdf, 0xf8, 0xdc, 0x76, 0x01, 0x2d, + 0x0c, 0xbf, 0xbc, 0x73, 0xfc, 0x73, 0x01, 0x2e, 0x16, 0xd1, 0x01, 0x2d, + 0x0c, 0xbf, 0x25, 0x46, 0x00, 0x25, 0x04, 0x20, 0xfe, 0xf7, 0x43, 0xfe, + 0x00, 0xf0, 0x43, 0xf8, 0x38, 0x78, 0x20, 0x40, 0xa8, 0x42, 0x06, 0xd0, + 0x04, 0x20, 0xfe, 0xf7, 0x18, 0xff, 0x00, 0x28, 0xf6, 0xd0, 0x4b, 0xf2, + 0x02, 0x18, 0x04, 0x20, 0xfe, 0xf7, 0xb1, 0xfe, 0x2b, 0xe0, 0x2d, 0xe9, + 0xf0, 0x41, 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0xff, 0xf7, 0x27, 0xff, + 0x00, 0xf0, 0x26, 0xf8, 0x18, 0xbf, 0x4b, 0xf2, 0x01, 0x18, 0x1e, 0xd1, + 0xdf, 0xf8, 0x84, 0x76, 0x01, 0x2d, 0x0c, 0xbf, 0x3c, 0x72, 0x7c, 0x72, + 0x01, 0x2e, 0x16, 0xd1, 0x01, 0x2d, 0x0c, 0xbf, 0x25, 0x46, 0x00, 0x25, + 0x04, 0x20, 0xfe, 0xf7, 0x16, 0xfe, 0x00, 0xf0, 0x16, 0xf8, 0x38, 0x78, + 0x20, 0x40, 0xa8, 0x42, 0x06, 0xd0, 0x04, 0x20, 0xfe, 0xf7, 0xeb, 0xfe, + 0x00, 0x28, 0xf6, 0xd0, 0x4b, 0xf2, 0x02, 0x18, 0x04, 0x20, 0xfe, 0xf7, + 0x84, 0xfe, 0x40, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x20, 0x40, 0x4f, 0xf0, + 0x00, 0x08, 0xa0, 0x42, 0x70, 0x47, 0xc8, 0x21, 0x04, 0x20, 0x1b, 0xe7, + 0x2d, 0xe9, 0xf0, 0x41, 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0xff, 0xf7, + 0x08, 0xff, 0xff, 0xf7, 0xef, 0xff, 0x18, 0xbf, 0x4b, 0xf2, 0x01, 0x18, + 0x20, 0xd1, 0xdf, 0xf8, 0x1c, 0x76, 0x01, 0x2d, 0x0c, 0xbf, 0x3c, 0x75, + 0x7c, 0x75, 0x01, 0x2e, 0x18, 0xd1, 0x01, 0x2d, 0x0c, 0xbf, 0x25, 0x46, + 0x00, 0x25, 0x04, 0x20, 0xfe, 0xf7, 0xdf, 0xfd, 0xff, 0xf7, 0xdf, 0xff, + 0x38, 0x78, 0x00, 0xf0, 0x03, 0x00, 0x20, 0x40, 0xa8, 0x42, 0x06, 0xd0, + 0x04, 0x20, 0xfe, 0xf7, 0xb2, 0xfe, 0x00, 0x28, 0xf4, 0xd0, 0x4b, 0xf2, + 0x02, 0x18, 0x04, 0x20, 0xfe, 0xf7, 0x4b, 0xfe, 0xc5, 0xe7, 0x70, 0xb5, + 0x04, 0x46, 0x0d, 0x46, 0xff, 0xf7, 0xcf, 0xfe, 0x00, 0x26, 0x20, 0x40, + 0xa0, 0x42, 0x18, 0xbf, 0x4b, 0xf2, 0x01, 0x16, 0x05, 0xd1, 0xdf, 0xf8, + 0xc4, 0x05, 0x01, 0x2d, 0x0c, 0xbf, 0x04, 0x70, 0x44, 0x70, 0x30, 0x46, + 0x70, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0xff, 0xf7, 0xaf, 0xfe, + 0x00, 0x26, 0x20, 0x40, 0xa0, 0x42, 0x18, 0xbf, 0x4b, 0xf2, 0x01, 0x16, + 0x05, 0xd1, 0xdf, 0xf8, 0xa0, 0x05, 0x01, 0x2d, 0x0c, 0xbf, 0x04, 0x70, + 0x44, 0x70, 0x30, 0x46, 0x70, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, + 0xff, 0xf7, 0xb3, 0xfe, 0x00, 0x26, 0x20, 0x40, 0xa0, 0x42, 0x18, 0xbf, + 0x4b, 0xf2, 0x01, 0x16, 0x05, 0xd1, 0xdf, 0xf8, 0x7c, 0x05, 0x01, 0x2d, + 0x0c, 0xbf, 0x04, 0x70, 0x44, 0x70, 0x30, 0x46, 0x70, 0xbd, 0x2d, 0xe9, + 0xf0, 0x4e, 0x82, 0x46, 0x14, 0x46, 0x00, 0x26, 0x41, 0xf0, 0x80, 0x49, + 0x00, 0x27, 0x40, 0xf6, 0xb8, 0x35, 0x06, 0x20, 0xfe, 0xf7, 0xb2, 0xfc, + 0x83, 0x46, 0x00, 0xf0, 0x37, 0xf8, 0x58, 0xb1, 0x58, 0x46, 0x80, 0xf3, + 0x11, 0x88, 0x01, 0x20, 0xfe, 0xf7, 0x6c, 0xfe, 0x7f, 0x1c, 0xaf, 0x42, + 0xef, 0xd3, 0x4b, 0xf2, 0x0e, 0x16, 0x21, 0xe0, 0xca, 0xf8, 0x00, 0x90, + 0x58, 0x46, 0x80, 0xf3, 0x11, 0x88, 0x01, 0x2c, 0x1f, 0xd1, 0x00, 0xf0, + 0x21, 0xf8, 0x04, 0x00, 0x04, 0xd0, 0x01, 0x20, 0xfe, 0xf7, 0x58, 0xfe, + 0x6d, 0x1e, 0xf6, 0xd1, 0x4f, 0xf0, 0x00, 0x42, 0x1f, 0x21, 0x50, 0x46, + 0xff, 0xf7, 0x30, 0xfe, 0x38, 0xb1, 0xdf, 0xf8, 0x08, 0x15, 0x50, 0x46, + 0x00, 0xf0, 0x21, 0xf8, 0x06, 0x00, 0x03, 0xd1, 0x07, 0xe0, 0x34, 0xb1, + 0x4b, 0xf2, 0x02, 0x16, 0x02, 0x22, 0x31, 0x46, 0x01, 0x20, 0x01, 0xf0, + 0xe9, 0xff, 0x30, 0x46, 0xbd, 0xe8, 0xf0, 0x8e, 0x4f, 0xf0, 0x80, 0x42, + 0x1e, 0x21, 0x50, 0x46, 0x16, 0xe6, 0xdf, 0xf8, 0xdc, 0x34, 0xff, 0xe7, + 0x53, 0xf8, 0x20, 0x00, 0xad, 0xe7, 0xdf, 0xf8, 0xd4, 0x34, 0xf9, 0xe7, + 0x0a, 0x46, 0x01, 0x46, 0xdf, 0xf8, 0xa4, 0x04, 0xa5, 0xe7, 0x80, 0xb5, + 0x02, 0x68, 0xd2, 0x0f, 0x0a, 0x70, 0x00, 0xf1, 0x50, 0x03, 0x00, 0xf1, + 0x14, 0x02, 0x12, 0x68, 0x4a, 0x70, 0x1a, 0x68, 0x02, 0xf0, 0xff, 0x02, + 0x8a, 0x60, 0x00, 0xf0, 0x02, 0xf8, 0x00, 0x20, 0x02, 0xbd, 0x1f, 0xb5, + 0x03, 0x46, 0x88, 0x68, 0x02, 0x90, 0x03, 0x20, 0x4a, 0x78, 0x01, 0x92, + 0x0c, 0x78, 0xdf, 0xf8, 0x94, 0x24, 0x00, 0x94, 0xb1, 0x21, 0xf4, 0xf7, + 0x3c, 0xfc, 0x1f, 0xbd, 0x0a, 0x46, 0x29, 0x21, 0xcd, 0xe7, 0x0a, 0x46, + 0x2b, 0x21, 0xca, 0xe7, 0x0a, 0x46, 0x2c, 0x21, 0xc7, 0xe7, 0x0a, 0x46, + 0x12, 0x21, 0xc4, 0xe7, 0x0a, 0x46, 0x11, 0x21, 0xc1, 0xe7, 0x02, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x4b, 0xf2, 0x0f, 0x10, 0x70, 0x47, + 0x70, 0xb5, 0x00, 0xf0, 0x19, 0xf8, 0x0d, 0xda, 0x02, 0x29, 0x0b, 0xd2, + 0x00, 0xf0, 0x1b, 0xf8, 0x00, 0xf0, 0x1f, 0xf8, 0x00, 0xf0, 0x0a, 0xf8, + 0x00, 0xf0, 0x12, 0xf8, 0x30, 0x46, 0xfe, 0xf7, 0xf6, 0xfb, 0x01, 0xe0, + 0x4b, 0xf2, 0x01, 0x15, 0x28, 0x46, 0x70, 0xbd, 0x01, 0x21, 0x01, 0xfa, + 0x04, 0xf4, 0x44, 0xea, 0x00, 0x01, 0x70, 0x47, 0x00, 0x25, 0x08, 0x28, + 0x04, 0x46, 0x70, 0x47, 0x30, 0x46, 0xfe, 0xf7, 0x24, 0xbc, 0xdf, 0xf8, + 0xd8, 0x23, 0x02, 0xeb, 0x01, 0x11, 0x8e, 0x6a, 0x70, 0x47, 0x30, 0x46, + 0xfe, 0xf7, 0x46, 0xbc, 0x2d, 0xe9, 0xf0, 0x41, 0x00, 0x29, 0x07, 0xbf, + 0x08, 0x26, 0xdf, 0xf8, 0xc4, 0x83, 0x02, 0x26, 0xdf, 0xf8, 0xc0, 0x83, + 0x04, 0x46, 0x15, 0x46, 0x00, 0x27, 0x09, 0xe0, 0x24, 0xfa, 0x07, 0xf0, + 0xc0, 0x07, 0x04, 0xd5, 0x58, 0xf8, 0x27, 0x00, 0x2b, 0x46, 0xff, 0xf7, + 0x58, 0xfe, 0x7f, 0x1c, 0xb7, 0x42, 0xf3, 0xd3, 0x00, 0x20, 0xbd, 0xe8, + 0xf0, 0x81, 0x02, 0x46, 0x08, 0x2a, 0x4b, 0xf2, 0x01, 0x10, 0x05, 0xd2, + 0xdf, 0xf8, 0x84, 0x03, 0x00, 0xeb, 0x02, 0x12, 0x00, 0x20, 0xd1, 0x60, + 0x70, 0x47, 0x02, 0x46, 0x02, 0x2a, 0x4b, 0xf2, 0x01, 0x10, 0x05, 0xd2, + 0xdf, 0xf8, 0x68, 0x03, 0x00, 0xeb, 0x02, 0x12, 0x00, 0x20, 0xd1, 0x64, + 0x70, 0x47, 0x10, 0xb5, 0xdf, 0xf8, 0x5c, 0x43, 0xa0, 0x68, 0xfe, 0xf7, + 0x5a, 0xfb, 0xe0, 0x68, 0x00, 0xb1, 0x0a, 0xe0, 0x10, 0xbd, 0x10, 0xb5, + 0xdf, 0xf8, 0x48, 0x43, 0xa0, 0x69, 0xfe, 0xf7, 0x50, 0xfb, 0xe0, 0x69, + 0x00, 0xb1, 0x00, 0xe0, 0x10, 0xbd, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x47, + 0x10, 0xb5, 0xdf, 0xf8, 0x30, 0x43, 0xa0, 0x6a, 0xfe, 0xf7, 0x43, 0xfb, + 0xe0, 0x6a, 0x00, 0xb1, 0xf3, 0xe7, 0x10, 0xbd, 0x10, 0xb5, 0xdf, 0xf8, + 0x1c, 0x43, 0xa0, 0x6b, 0xfe, 0xf7, 0x39, 0xfb, 0xe0, 0x6b, 0x00, 0xb1, + 0xe9, 0xe7, 0x10, 0xbd, 0x10, 0xb5, 0xdf, 0xf8, 0x08, 0x43, 0xa0, 0x6c, + 0xfe, 0xf7, 0x2f, 0xfb, 0xe0, 0x6c, 0x00, 0xb1, 0xdf, 0xe7, 0x10, 0xbd, + 0x10, 0xb5, 0xbd, 0x4c, 0xa0, 0x6d, 0xfe, 0xf7, 0x26, 0xfb, 0xe0, 0x6d, + 0x00, 0xb1, 0xd6, 0xe7, 0x10, 0xbd, 0x10, 0xb5, 0xb8, 0x4c, 0xa0, 0x6e, + 0xfe, 0xf7, 0x1d, 0xfb, 0xe0, 0x6e, 0x00, 0xb1, 0xcd, 0xe7, 0x10, 0xbd, + 0x10, 0xb5, 0xb4, 0x4c, 0xa0, 0x6f, 0xfe, 0xf7, 0x14, 0xfb, 0xe0, 0x6f, + 0x00, 0xb1, 0xc4, 0xe7, 0x10, 0xbd, 0x10, 0xb5, 0xae, 0x4c, 0xa0, 0x68, + 0xfe, 0xf7, 0x0b, 0xfb, 0xe0, 0x68, 0x00, 0xb1, 0xbb, 0xe7, 0x10, 0xbd, + 0x10, 0xb5, 0xaa, 0x4c, 0xa0, 0x6a, 0xfe, 0xf7, 0x02, 0xfb, 0xe0, 0x6a, + 0x00, 0xb1, 0xb2, 0xe7, 0x10, 0xbd, 0x10, 0xb5, 0xa5, 0x4c, 0xa0, 0x6c, + 0xfe, 0xf7, 0xf9, 0xfa, 0xe0, 0x6c, 0x00, 0xb1, 0xa9, 0xe7, 0x10, 0xbd, + 0x10, 0xb5, 0xa1, 0x4c, 0xa0, 0x69, 0xfe, 0xf7, 0xf0, 0xfa, 0xe0, 0x69, + 0x00, 0xb1, 0xa0, 0xe7, 0x10, 0xbd, 0x10, 0xb5, 0x9c, 0x4c, 0xa0, 0x6b, + 0xfe, 0xf7, 0xe7, 0xfa, 0xe0, 0x6b, 0x00, 0xb1, 0x97, 0xe7, 0x10, 0xbd, + 0x10, 0xb5, 0x98, 0x4c, 0xa0, 0x6d, 0xfe, 0xf7, 0xde, 0xfa, 0xe0, 0x6d, + 0x00, 0xb1, 0x8e, 0xe7, 0x10, 0xbd, 0x2d, 0xe9, 0xf0, 0x47, 0x04, 0x46, + 0xff, 0xf7, 0xff, 0xfc, 0x80, 0x46, 0xff, 0xf7, 0xf6, 0xfc, 0x07, 0x46, + 0xff, 0xf7, 0x01, 0xfd, 0x81, 0x46, 0x9e, 0x48, 0x0f, 0xf2, 0x80, 0x2a, + 0x01, 0x68, 0x9d, 0x48, 0x21, 0x60, 0x01, 0x26, 0x43, 0xf6, 0xfc, 0x71, + 0xe7, 0xf7, 0x8a, 0xfa, 0x60, 0x60, 0x00, 0x25, 0x28, 0xfa, 0x05, 0xf0, + 0xc0, 0x07, 0x0d, 0xd5, 0x5a, 0xf8, 0x25, 0x00, 0x00, 0xf2, 0xfc, 0x71, + 0x0a, 0x68, 0x44, 0xf8, 0x36, 0x20, 0x40, 0xf2, 0xfc, 0x71, 0xe7, 0xf7, + 0x79, 0xfa, 0x21, 0x1d, 0x41, 0xf8, 0x36, 0x00, 0x76, 0x1c, 0x6d, 0x1c, + 0x08, 0x2d, 0xe9, 0xd1, 0x00, 0x25, 0x0f, 0xf2, 0x5c, 0x28, 0x27, 0xfa, + 0x05, 0xf0, 0xc0, 0x07, 0x0d, 0xd5, 0x58, 0xf8, 0x25, 0x00, 0x00, 0xf6, + 0xfc, 0x71, 0x0a, 0x68, 0x44, 0xf8, 0x36, 0x20, 0x40, 0xf6, 0xfc, 0x71, + 0xe7, 0xf7, 0x60, 0xfa, 0x21, 0x1d, 0x41, 0xf8, 0x36, 0x00, 0x76, 0x1c, + 0x6d, 0x1c, 0x08, 0x2d, 0xe9, 0xd1, 0x0f, 0xf2, 0x4c, 0x28, 0x00, 0x25, + 0x41, 0xf6, 0xfc, 0x77, 0x29, 0xfa, 0x05, 0xf0, 0xc0, 0x07, 0x0a, 0xd5, + 0x58, 0xf8, 0x25, 0x00, 0x3a, 0x58, 0x44, 0xf8, 0x36, 0x20, 0x39, 0x46, + 0xe7, 0xf7, 0x48, 0xfa, 0x21, 0x1d, 0x41, 0xf8, 0x36, 0x00, 0x76, 0x1c, + 0x6d, 0x1c, 0x02, 0x2d, 0xec, 0xd1, 0xbd, 0xe8, 0xf0, 0x87, 0xf8, 0xb5, + 0x04, 0x46, 0xff, 0xf7, 0x9e, 0xfc, 0x06, 0x46, 0xff, 0xf7, 0x95, 0xfc, + 0x05, 0x46, 0xff, 0xf7, 0xa0, 0xfc, 0x01, 0x46, 0x23, 0x68, 0x67, 0x68, + 0x01, 0x20, 0x00, 0x22, 0xbb, 0x42, 0x34, 0xd1, 0x00, 0x23, 0x52, 0x1c, + 0x26, 0xfa, 0x03, 0xf7, 0xff, 0x07, 0x07, 0xd5, 0x04, 0xf1, 0x04, 0x0c, + 0x54, 0xf8, 0x32, 0x70, 0x5c, 0xf8, 0x32, 0xe0, 0x77, 0x45, 0x26, 0xd1, + 0x5b, 0x1c, 0xdf, 0xb2, 0x08, 0x2f, 0xee, 0xd1, 0x00, 0x23, 0x52, 0x1c, + 0x25, 0xfa, 0x03, 0xf6, 0xf7, 0x07, 0x06, 0xd5, 0x27, 0x1d, 0x54, 0xf8, + 0x32, 0x60, 0x57, 0xf8, 0x32, 0x70, 0xbe, 0x42, 0x15, 0xd1, 0x5b, 0x1c, + 0xde, 0xb2, 0x08, 0x2e, 0xef, 0xd1, 0x00, 0x23, 0x52, 0x1c, 0x21, 0xfa, + 0x03, 0xf5, 0xee, 0x07, 0x06, 0xd5, 0x26, 0x1d, 0x54, 0xf8, 0x32, 0x50, + 0x56, 0xf8, 0x32, 0x70, 0xbd, 0x42, 0x04, 0xd1, 0x5b, 0x1c, 0xdd, 0xb2, + 0x02, 0x2d, 0xef, 0xd1, 0xf2, 0xbd, 0x00, 0x20, 0xf2, 0xbd, 0x2d, 0xe9, + 0xf0, 0x41, 0x04, 0x46, 0x0d, 0x46, 0x90, 0x46, 0x00, 0x27, 0x19, 0xe0, + 0xb0, 0x68, 0xfe, 0xf7, 0x77, 0xfa, 0x14, 0xe0, 0x00, 0x2c, 0x05, 0xeb, + 0x07, 0x16, 0xf7, 0xd0, 0x30, 0x68, 0x01, 0x28, 0xf4, 0xd1, 0xb0, 0x68, + 0x21, 0x46, 0xfe, 0xf7, 0xa0, 0xfa, 0xb0, 0x68, 0xfe, 0xf7, 0x0c, 0xfa, + 0x71, 0x68, 0xb0, 0x68, 0xfe, 0xf7, 0x73, 0xfa, 0xb0, 0x68, 0xfe, 0xf7, + 0x56, 0xfa, 0x7f, 0x1c, 0x47, 0x45, 0xe7, 0xd3, 0xbd, 0xe8, 0xf0, 0x81, + 0x01, 0x21, 0xca, 0x20, 0x0a, 0xe6, 0x01, 0x21, 0xcb, 0x20, 0x07, 0xe6, + 0x01, 0x21, 0xcc, 0x20, 0x04, 0xe6, 0x02, 0x28, 0x00, 0xd3, 0x0d, 0xe0, + 0x00, 0x28, 0x0c, 0xbf, 0x69, 0x20, 0x6a, 0x20, 0x06, 0xe0, 0x02, 0x28, + 0x00, 0xd3, 0x05, 0xe0, 0x00, 0x28, 0x0c, 0xbf, 0x6b, 0x20, 0x6c, 0x20, + 0x01, 0x21, 0xf3, 0xe5, 0x4b, 0xf2, 0x01, 0x10, 0x70, 0x47, 0x2d, 0xe9, + 0xf8, 0x43, 0x05, 0x46, 0x0e, 0x46, 0xff, 0xf7, 0x22, 0xfc, 0x00, 0x24, + 0x28, 0x40, 0xa8, 0x42, 0x18, 0xbf, 0x4b, 0xf2, 0x01, 0x14, 0x26, 0xd1, + 0x01, 0x2e, 0x0c, 0xbf, 0x00, 0x26, 0x01, 0x26, 0x00, 0x27, 0xdf, 0xf8, + 0x9c, 0x80, 0x25, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x18, 0xd5, 0x58, 0xf8, + 0x27, 0x00, 0x00, 0xf1, 0x24, 0x09, 0x33, 0x46, 0x4f, 0xf4, 0x80, 0x12, + 0x14, 0x21, 0x48, 0x46, 0xff, 0xf7, 0xe1, 0xfb, 0x33, 0x46, 0x4f, 0xf0, + 0x80, 0x72, 0x18, 0x21, 0x48, 0x46, 0xff, 0xf7, 0xda, 0xfb, 0x33, 0x46, + 0x4f, 0xf0, 0x80, 0x52, 0x1c, 0x21, 0x48, 0x46, 0xff, 0xf7, 0xd3, 0xfb, + 0x7f, 0x1c, 0x08, 0x2f, 0xdf, 0xd3, 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x83, + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x76, 0x02, 0x20, 0xb0, 0x76, 0x02, 0x20, + 0x1c, 0x8a, 0x00, 0x20, 0x7c, 0x8a, 0x00, 0x20, 0x48, 0x95, 0x04, 0x01, + 0xdc, 0x9d, 0x04, 0x01, 0x98, 0x00, 0x00, 0x47, 0x00, 0x00, 0xb0, 0x46, + 0x0a, 0x06, 0x00, 0x47, 0x08, 0x06, 0x00, 0x47, 0x0c, 0x06, 0x00, 0x47, + 0x1b, 0x06, 0x00, 0x47, 0x13, 0x06, 0x00, 0x47, 0x23, 0x06, 0x00, 0x47, + 0xf0, 0x76, 0x02, 0x20, 0x08, 0x98, 0x04, 0x01, 0xd4, 0x9d, 0x04, 0x01, + 0xb0, 0x90, 0x04, 0x01, 0xfc, 0x3f, 0xa0, 0x46, 0x00, 0x00, 0xa0, 0x46, + 0x28, 0x96, 0x04, 0x01, 0x00, 0x00, 0x02, 0x60, 0x00, 0x00, 0x12, 0x60, + 0x00, 0x00, 0x22, 0x60, 0x00, 0x00, 0x32, 0x60, 0x00, 0x00, 0x42, 0x60, + 0x00, 0x00, 0x52, 0x60, 0x00, 0x00, 0x62, 0x60, 0x00, 0x00, 0x72, 0x60, + 0x00, 0x00, 0x82, 0x60, 0x00, 0x00, 0x92, 0x60, 0x00, 0x00, 0xa2, 0x60, + 0x00, 0x00, 0xb2, 0x60, 0x00, 0x00, 0xc2, 0x60, 0x00, 0x00, 0xd2, 0x60, + 0x00, 0x00, 0xe2, 0x60, 0x00, 0x00, 0xf2, 0x60, 0x00, 0x00, 0x02, 0x61, + 0x00, 0x00, 0x12, 0x61, 0x00, 0x68, 0x02, 0x40, 0x22, 0xfa, 0x01, 0xf0, + 0x70, 0x47, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, + 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, + 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x15, 0x46, + 0x1e, 0x46, 0x4f, 0xf4, 0x52, 0x70, 0x28, 0x60, 0x00, 0x22, 0x32, 0x70, + 0xa1, 0xb1, 0x20, 0x46, 0x00, 0xf0, 0x22, 0xf8, 0x01, 0x28, 0x09, 0xd1, + 0xdf, 0xf8, 0x70, 0x04, 0x21, 0x46, 0x50, 0xf8, 0x21, 0x20, 0x52, 0xf8, + 0x08, 0x1f, 0xc1, 0xf3, 0x09, 0x01, 0x0d, 0xe0, 0x02, 0x28, 0x12, 0xd1, + 0x20, 0x46, 0x00, 0xf0, 0x2e, 0xf8, 0x0d, 0xe0, 0xdf, 0xf8, 0x54, 0x04, + 0x00, 0xeb, 0x84, 0x00, 0x01, 0x78, 0x40, 0x78, 0x41, 0xea, 0x00, 0x21, + 0x29, 0x60, 0x20, 0x46, 0x00, 0xf0, 0xf6, 0xf9, 0x00, 0xf0, 0x7f, 0x00, + 0x30, 0x70, 0x70, 0xbd, 0xdf, 0xf8, 0x30, 0x14, 0x51, 0xf8, 0x20, 0x00, + 0x23, 0xe1, 0xdf, 0xf8, 0x30, 0x14, 0x08, 0x5c, 0x70, 0x47, 0x38, 0xb5, + 0x0b, 0x46, 0xdf, 0xf8, 0x1c, 0x14, 0xdf, 0xf8, 0x20, 0x54, 0x51, 0xf8, + 0x20, 0x40, 0x19, 0x00, 0x18, 0xbf, 0x01, 0x21, 0x29, 0x54, 0x20, 0x46, + 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x4f, 0xf0, 0x00, 0x42, 0x1f, 0x21, + 0xa5, 0xe7, 0x80, 0xb5, 0xdf, 0xf8, 0xf4, 0x33, 0x53, 0xf8, 0x20, 0x00, + 0x4f, 0xf4, 0xfe, 0x42, 0x08, 0x21, 0x0c, 0x30, 0xff, 0xf7, 0x96, 0xff, + 0xc0, 0xb2, 0x02, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0xff, 0xf7, + 0xd1, 0xff, 0x00, 0x26, 0x01, 0x28, 0x10, 0xd1, 0x2b, 0x46, 0xdf, 0xf8, + 0xcc, 0x03, 0x25, 0x46, 0x50, 0xf8, 0x25, 0x00, 0x40, 0xf2, 0xff, 0x32, + 0x00, 0x21, 0x08, 0x30, 0xff, 0xf7, 0x85, 0xff, 0x01, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0xc7, 0xff, 0x01, 0xe0, 0x4b, 0xf6, 0x01, 0x26, 0x30, 0x46, + 0x70, 0xbd, 0xdf, 0xf8, 0xb0, 0x13, 0x81, 0xb0, 0x51, 0xf8, 0x20, 0x00, + 0x14, 0x30, 0x00, 0x68, 0x00, 0x90, 0x00, 0x98, 0x40, 0x0b, 0x00, 0xf0, + 0x01, 0x00, 0x01, 0xb0, 0x70, 0x47, 0xdf, 0xf8, 0x88, 0x13, 0x51, 0xf8, + 0x20, 0x00, 0x08, 0x30, 0x00, 0x68, 0xc0, 0xf3, 0x09, 0x00, 0x70, 0x47, + 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0xff, 0xf7, 0x9d, 0xff, 0x68, 0x70, + 0x01, 0x23, 0xdf, 0xf8, 0x70, 0x03, 0x02, 0x5d, 0xaa, 0x70, 0x2b, 0x70, + 0x20, 0x46, 0xff, 0xf7, 0xe8, 0xff, 0xa8, 0x80, 0x00, 0x20, 0x32, 0xbd, + 0x38, 0xb5, 0x00, 0x24, 0x03, 0x29, 0x0b, 0x46, 0x08, 0xd0, 0xdf, 0xf8, + 0x48, 0x53, 0x55, 0xf8, 0x20, 0x00, 0x03, 0x22, 0x00, 0x21, 0xff, 0xf7, + 0x46, 0xff, 0x01, 0xe0, 0x4b, 0xf6, 0x01, 0x24, 0x20, 0x46, 0x32, 0xbd, + 0x2d, 0xe9, 0xf8, 0x4f, 0xdf, 0xf8, 0x3c, 0xa3, 0xdf, 0xf8, 0x3c, 0x13, + 0xda, 0xf8, 0x00, 0x70, 0x0d, 0x68, 0xd7, 0xf8, 0xb8, 0x00, 0xdf, 0xf8, + 0x34, 0x13, 0x05, 0x40, 0x38, 0x69, 0x88, 0x42, 0x05, 0xf0, 0xff, 0x05, + 0x4f, 0xf0, 0x00, 0x09, 0x28, 0xbf, 0x02, 0x20, 0x05, 0xd2, 0xdf, 0xf8, + 0x20, 0x13, 0x88, 0x42, 0x80, 0x41, 0xc0, 0x43, 0xc0, 0x0f, 0x00, 0xee, + 0x10, 0x0a, 0xf8, 0xee, 0x40, 0x0a, 0xb0, 0xee, 0x00, 0x0a, 0xfd, 0xf7, + 0x77, 0xf8, 0x38, 0x69, 0x00, 0xee, 0x90, 0x0a, 0xf8, 0xee, 0x60, 0x0a, + 0x9f, 0xed, 0x9d, 0x1a, 0x60, 0xee, 0x81, 0x0a, 0x80, 0xee, 0x80, 0x0a, + 0x03, 0xf0, 0xd6, 0xf8, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x6a, + 0xf6, 0xb2, 0x0a, 0x2e, 0x38, 0xbf, 0x0a, 0x26, 0x02, 0xd3, 0x10, 0x2e, + 0x28, 0xbf, 0x0f, 0x26, 0x00, 0x24, 0x25, 0xfa, 0x04, 0xf0, 0xc0, 0x07, + 0x54, 0xd5, 0x01, 0x21, 0xe0, 0xb2, 0xff, 0xf7, 0xa7, 0xff, 0x5f, 0xea, + 0x00, 0x09, 0x54, 0xd1, 0xa6, 0x48, 0xe7, 0xb2, 0x50, 0xf8, 0x27, 0x80, + 0x08, 0xf1, 0x10, 0x0b, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, + 0x50, 0xf8, 0x1e, 0x23, 0xfc, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x4b, 0xf8, + 0x33, 0x46, 0x00, 0xf0, 0x45, 0xf8, 0x08, 0xf1, 0x14, 0x0b, 0x02, 0x23, + 0x00, 0xf0, 0x40, 0xf8, 0x33, 0x46, 0x4f, 0xf4, 0x70, 0x42, 0x0c, 0x21, + 0x00, 0xf0, 0x3d, 0xf8, 0xd1, 0x23, 0x4f, 0xf4, 0x7f, 0x02, 0x10, 0x21, + 0x00, 0xf0, 0x37, 0xf8, 0xda, 0xf8, 0x00, 0x00, 0xc1, 0x19, 0xed, 0x23, + 0x91, 0xf8, 0xbc, 0x20, 0x5a, 0x43, 0x10, 0x44, 0x00, 0xf2, 0x44, 0x47, + 0xe0, 0xb2, 0x97, 0xf8, 0xe9, 0x10, 0xc9, 0x1c, 0xc9, 0xb2, 0x00, 0xf0, + 0x2c, 0xf8, 0x97, 0xf8, 0xe9, 0x10, 0x49, 0x1c, 0xc9, 0xb2, 0xe0, 0xb2, + 0x00, 0xf0, 0x32, 0xf8, 0x40, 0xf2, 0x47, 0x33, 0x40, 0xf2, 0xff, 0x32, + 0x00, 0x21, 0x08, 0xf1, 0x08, 0x00, 0xff, 0xf7, 0xb2, 0xfe, 0x00, 0x21, + 0xe0, 0xb2, 0xff, 0xf7, 0xf4, 0xfe, 0xe0, 0xb2, 0xff, 0xf7, 0xe8, 0xfe, + 0x01, 0x28, 0x04, 0xd1, 0x64, 0x1c, 0xe0, 0xb2, 0x08, 0x28, 0xa2, 0xdb, + 0x01, 0xe0, 0x4b, 0xf6, 0x01, 0x29, 0x48, 0x46, 0xbd, 0xe8, 0xf2, 0x8f, + 0x4f, 0xf4, 0x70, 0x62, 0x08, 0x21, 0x58, 0x46, 0x99, 0xe6, 0x00, 0x68, + 0x00, 0xf0, 0x03, 0x00, 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, 0x06, 0xf8, + 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0xff, 0x22, 0x00, 0x21, 0x0c, 0xe0, + 0x71, 0x4c, 0x54, 0xf8, 0x20, 0x00, 0x70, 0x47, 0x10, 0xb5, 0xff, 0xf7, + 0xf9, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x4f, 0xf4, 0x7f, 0x42, + 0x08, 0x21, 0x00, 0x1d, 0x7d, 0xe6, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x41, + 0x6d, 0x49, 0x2d, 0xed, 0x06, 0x8b, 0x0a, 0x68, 0xd2, 0xf8, 0xb8, 0x50, + 0x00, 0x26, 0x00, 0x28, 0x05, 0xf0, 0xff, 0x05, 0xf2, 0xee, 0x0c, 0x9a, + 0x00, 0xf0, 0x8e, 0x80, 0x00, 0x24, 0x9f, 0xed, 0x5a, 0x8a, 0x69, 0x4f, + 0xdf, 0xed, 0x59, 0x8a, 0x40, 0xf6, 0xff, 0x78, 0x9f, 0xed, 0x58, 0xaa, + 0xb2, 0xee, 0x04, 0x9a, 0xa4, 0xf5, 0x51, 0x70, 0x04, 0x28, 0x38, 0xbf, + 0xdf, 0xed, 0x55, 0xaa, 0x14, 0xd3, 0x00, 0xf0, 0x7f, 0xf8, 0x20, 0xee, + 0x0a, 0x0a, 0xb1, 0xee, 0x04, 0x1a, 0x80, 0xee, 0x01, 0x0a, 0x03, 0xf0, + 0x17, 0xf8, 0xf0, 0xee, 0x40, 0xaa, 0x9f, 0xed, 0x4f, 0x0a, 0xf4, 0xee, + 0x40, 0xaa, 0xf1, 0xee, 0x10, 0xfa, 0xa8, 0xbf, 0xf0, 0xee, 0x4a, 0xaa, + 0xdf, 0xed, 0x4b, 0x0a, 0x6a, 0xee, 0xa0, 0x0a, 0xb1, 0xee, 0x04, 0x1a, + 0x20, 0xee, 0x81, 0x0a, 0xe6, 0xf7, 0x02, 0xf9, 0xf3, 0xee, 0x04, 0x0a, + 0x20, 0xee, 0x20, 0x0a, 0x30, 0xee, 0x69, 0x0a, 0xbb, 0xee, 0x04, 0x1a, + 0xc0, 0xee, 0x01, 0x0a, 0xb0, 0xee, 0x49, 0x0a, 0xfc, 0xf7, 0x88, 0xff, + 0xdf, 0xed, 0x40, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xe5, 0xf7, 0xb4, 0xff, + 0xfc, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x90, 0x0a, 0x40, 0x45, 0x00, 0xd8, + 0x01, 0xd3, 0xb0, 0xee, 0x68, 0x0a, 0xbc, 0xee, 0xc0, 0x0a, 0xfc, 0xee, + 0xea, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0xb6, 0xf5, 0x48, 0x6f, 0x08, 0xbf, + 0x40, 0x46, 0x10, 0xee, 0x90, 0x1a, 0x09, 0x03, 0x01, 0xf4, 0xfe, 0x21, + 0x08, 0x43, 0x00, 0x21, 0x25, 0xfa, 0x01, 0xf2, 0xd2, 0x07, 0x44, 0xbf, + 0x57, 0xf8, 0x21, 0x30, 0xf0, 0x50, 0x49, 0x1c, 0x08, 0x29, 0xf5, 0xdb, + 0x36, 0x1d, 0x64, 0x1c, 0xb4, 0xf5, 0x52, 0x7f, 0x79, 0xee, 0x88, 0x9a, + 0x9a, 0xd3, 0xdf, 0xed, 0x25, 0x9a, 0x78, 0x24, 0x00, 0xf0, 0x1e, 0xf8, + 0x20, 0xee, 0x28, 0x0a, 0xe5, 0xf7, 0x80, 0xff, 0xbc, 0xee, 0xc0, 0x0a, + 0x00, 0x21, 0x10, 0xee, 0x10, 0x0a, 0x25, 0xfa, 0x01, 0xf2, 0xd2, 0x07, + 0x44, 0xbf, 0x57, 0xf8, 0x21, 0x30, 0xf0, 0x50, 0x49, 0x1c, 0x08, 0x29, + 0xf5, 0xdb, 0x36, 0x1d, 0x64, 0x1e, 0x79, 0xee, 0x88, 0x9a, 0xe5, 0xd1, + 0xbd, 0xec, 0x06, 0x8b, 0xbd, 0xe8, 0xf0, 0x81, 0xac, 0xc5, 0xa7, 0x37, + 0xb3, 0xee, 0x04, 0x0a, 0xc9, 0xee, 0x80, 0x0a, 0xb0, 0xee, 0x49, 0x0a, + 0xfc, 0xf7, 0x2c, 0xbf, 0x1c, 0x4a, 0x52, 0xf8, 0x20, 0x00, 0x40, 0xf2, + 0xbf, 0x32, 0x91, 0x42, 0x88, 0xbf, 0x11, 0x46, 0x00, 0xeb, 0x81, 0x00, + 0x02, 0x68, 0x12, 0x48, 0x00, 0xea, 0x02, 0x20, 0x40, 0xea, 0x01, 0x50, + 0xc2, 0xf3, 0x06, 0x31, 0x08, 0x43, 0x70, 0x47, 0x09, 0x4a, 0x52, 0xf8, + 0x20, 0x00, 0x40, 0xf8, 0x24, 0x1f, 0x70, 0x47, 0xcd, 0xcc, 0x4c, 0xbd, + 0x00, 0xf0, 0x7f, 0x45, 0x00, 0x00, 0x80, 0x42, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x80, 0x42, 0x00, 0x00, 0x80, 0x3c, 0x00, 0x00, 0x80, 0x45, + 0x08, 0x97, 0x04, 0x01, 0xb3, 0x01, 0x00, 0x47, 0x4c, 0x77, 0x02, 0x20, + 0x28, 0x98, 0x04, 0x01, 0x00, 0xff, 0x0f, 0x00, 0xb4, 0x76, 0x02, 0x20, + 0xb0, 0x76, 0x02, 0x20, 0x41, 0x42, 0x0f, 0x00, 0x21, 0xa1, 0x07, 0x00, + 0xa8, 0x96, 0x04, 0x01, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0xdf, 0xf8, 0xb4, 0x32, + 0x19, 0x68, 0x00, 0x22, 0x31, 0xb3, 0xdf, 0xf8, 0xb0, 0x12, 0x0b, 0x68, + 0x03, 0xf0, 0xff, 0x03, 0x03, 0x60, 0x0b, 0x69, 0x03, 0xf0, 0x07, 0x03, + 0x43, 0x60, 0x4b, 0x68, 0x03, 0xf0, 0xff, 0x03, 0x83, 0x60, 0x4b, 0x69, + 0x03, 0xf0, 0x07, 0x03, 0xc3, 0x60, 0x8b, 0x68, 0x03, 0xf0, 0x03, 0x03, + 0x03, 0x61, 0x8b, 0x69, 0x03, 0xf0, 0x07, 0x03, 0x43, 0x61, 0xcb, 0x68, + 0x03, 0xf0, 0x1f, 0x03, 0x83, 0x61, 0xcb, 0x69, 0x03, 0xf0, 0xff, 0x03, + 0xc3, 0x61, 0x09, 0x6a, 0x01, 0xf0, 0x07, 0x01, 0x01, 0x62, 0x01, 0xe0, + 0x4f, 0xf6, 0x0a, 0x72, 0x10, 0x46, 0x70, 0x47, 0xdf, 0xf8, 0x54, 0x12, + 0x09, 0x68, 0x00, 0x20, 0x59, 0xb1, 0x08, 0x60, 0x0f, 0x22, 0x07, 0x23, + 0x88, 0x60, 0x08, 0x61, 0x8a, 0x61, 0x48, 0x60, 0xc8, 0x60, 0x48, 0x61, + 0xc8, 0x61, 0x0b, 0x62, 0x70, 0x47, 0x4f, 0xf6, 0x0a, 0x70, 0x70, 0x47, + 0x38, 0xb5, 0xdf, 0xf8, 0x2c, 0x12, 0x04, 0x46, 0x08, 0x68, 0x00, 0x25, + 0x00, 0x28, 0x32, 0xd0, 0x23, 0x68, 0xdf, 0xf8, 0x20, 0x02, 0xff, 0x22, + 0x00, 0xf0, 0x32, 0xf8, 0x63, 0x68, 0xdf, 0xf8, 0x18, 0x02, 0x00, 0xf0, + 0x2c, 0xf8, 0xa3, 0x68, 0xdf, 0xf8, 0x10, 0x02, 0xff, 0x22, 0x00, 0xf0, + 0x27, 0xf8, 0xe3, 0x68, 0xdf, 0xf8, 0x08, 0x02, 0x00, 0xf0, 0x21, 0xf8, + 0x23, 0x69, 0xdf, 0xf8, 0x04, 0x02, 0x03, 0x22, 0x00, 0xf0, 0x1c, 0xf8, + 0x63, 0x69, 0xdf, 0xf8, 0xfc, 0x01, 0x00, 0xf0, 0x16, 0xf8, 0xa3, 0x69, + 0xdf, 0xf8, 0xf4, 0x01, 0x1f, 0x22, 0x00, 0xf0, 0x11, 0xf8, 0xe3, 0x69, + 0xdf, 0xf8, 0xec, 0x01, 0xff, 0x22, 0x00, 0xf0, 0x0b, 0xf8, 0x23, 0x6a, + 0xdf, 0xf8, 0xe4, 0x01, 0x00, 0xf0, 0x05, 0xf8, 0x01, 0xe0, 0x4f, 0xf6, + 0x0a, 0x75, 0x28, 0x46, 0x32, 0xbd, 0x07, 0x22, 0x00, 0x21, 0x6b, 0xe7, + 0x10, 0xb5, 0x04, 0x46, 0xf2, 0xf7, 0x09, 0xfe, 0x00, 0x28, 0x23, 0x46, + 0x4f, 0xf0, 0xff, 0x32, 0x07, 0xbf, 0x00, 0x21, 0xdf, 0xf8, 0xbc, 0x01, + 0x00, 0x21, 0xdf, 0xf8, 0xbc, 0x01, 0x0a, 0xe0, 0x10, 0xb5, 0x00, 0x28, + 0xdf, 0xf8, 0xb4, 0x41, 0x14, 0xbf, 0x01, 0x23, 0x00, 0x23, 0x4f, 0xf4, + 0x80, 0x72, 0x08, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x4f, 0xff, 0x00, 0x20, + 0x10, 0xbd, 0x38, 0xb5, 0xf2, 0xf7, 0xc3, 0xfd, 0x00, 0x28, 0x59, 0xd0, + 0x0f, 0xf2, 0xa4, 0x12, 0xff, 0x21, 0x03, 0x20, 0xf3, 0xf7, 0x9d, 0xfe, + 0xdf, 0xf8, 0x88, 0x01, 0x54, 0x4c, 0x00, 0x68, 0x0f, 0xf2, 0xa0, 0x12, + 0xdf, 0xf8, 0x80, 0x51, 0x20, 0x60, 0x00, 0xf1, 0x24, 0x01, 0x61, 0x60, + 0x0b, 0x46, 0xff, 0x21, 0x03, 0x20, 0xf3, 0xf7, 0x8c, 0xfe, 0x00, 0x20, + 0xff, 0xf7, 0xd2, 0xff, 0x02, 0x23, 0x03, 0x22, 0x00, 0x21, 0x56, 0x48, + 0xff, 0xf7, 0x28, 0xff, 0x20, 0x68, 0xff, 0xf7, 0x63, 0xff, 0x20, 0x68, + 0xff, 0xf7, 0x74, 0xff, 0x20, 0x68, 0xff, 0xf7, 0x2d, 0xff, 0x0f, 0xf2, + 0x80, 0x12, 0xff, 0x21, 0x03, 0x20, 0xf3, 0xf7, 0x74, 0xfe, 0x20, 0x68, + 0x41, 0x68, 0x00, 0x91, 0x2a, 0x46, 0x03, 0x68, 0x00, 0xf0, 0x25, 0xf8, + 0x20, 0x68, 0xc1, 0x68, 0x00, 0x91, 0x05, 0xf1, 0x2c, 0x02, 0x83, 0x68, + 0x00, 0xf0, 0x1d, 0xf8, 0x20, 0x68, 0x41, 0x69, 0x00, 0x91, 0x05, 0xf1, + 0x58, 0x02, 0x03, 0x69, 0x00, 0xf0, 0x15, 0xf8, 0x20, 0x68, 0xc1, 0x69, + 0x00, 0x91, 0x05, 0xf1, 0x84, 0x02, 0x83, 0x69, 0x00, 0xf0, 0x0d, 0xf8, + 0x20, 0x68, 0x0f, 0xf2, 0x50, 0x12, 0x03, 0x6a, 0xff, 0x21, 0x03, 0x20, + 0xf3, 0xf7, 0x4d, 0xfe, 0xbd, 0xe8, 0x32, 0x40, 0x01, 0x20, 0x91, 0xe7, + 0x31, 0xbd, 0xff, 0x21, 0x03, 0x20, 0xf3, 0xf7, 0x44, 0xbe, 0x38, 0x49, + 0x0a, 0x68, 0x82, 0xf4, 0x80, 0x72, 0x10, 0x43, 0x0a, 0x60, 0x01, 0xe0, + 0x40, 0xea, 0x01, 0x20, 0x40, 0xf0, 0x80, 0x50, 0x70, 0xe7, 0x38, 0xb5, + 0x04, 0x46, 0x0d, 0x46, 0x31, 0x48, 0x00, 0xea, 0x05, 0x20, 0x20, 0x43, + 0xff, 0xf7, 0x68, 0xff, 0x2d, 0x0c, 0x44, 0xea, 0x05, 0x20, 0xbd, 0xe8, + 0x32, 0x40, 0x61, 0xe7, 0x2d, 0xe9, 0xfc, 0x41, 0x00, 0xf0, 0x2e, 0xf8, + 0x00, 0x24, 0x80, 0xb1, 0x18, 0x4e, 0x00, 0xf0, 0x23, 0xf8, 0xfd, 0xf7, + 0xe2, 0xfc, 0x04, 0x00, 0x09, 0xd1, 0x00, 0x20, 0xff, 0xf7, 0x62, 0xff, + 0x30, 0x68, 0xff, 0xf7, 0x0d, 0xff, 0x04, 0x46, 0x01, 0x20, 0xff, 0xf7, + 0x5b, 0xff, 0x10, 0xe0, 0x2d, 0xe9, 0xfc, 0x41, 0x00, 0xf0, 0x16, 0xf8, + 0x00, 0x24, 0x50, 0xb1, 0x0c, 0x4e, 0x30, 0x68, 0xff, 0xf7, 0xba, 0xfe, + 0x04, 0x00, 0x04, 0xd1, 0x00, 0xf0, 0x06, 0xf8, 0xfd, 0xf7, 0xb0, 0xfc, + 0x04, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0xf6, 0x81, 0x00, 0x97, 0x43, 0x46, + 0x30, 0x68, 0x2a, 0x46, 0x24, 0x21, 0x70, 0x47, 0x05, 0x46, 0x88, 0x46, + 0x17, 0x46, 0xf2, 0xf7, 0x10, 0xbd, 0x00, 0x00, 0x44, 0x77, 0x02, 0x20, + 0x04, 0x00, 0x40, 0x46, 0x14, 0x00, 0x40, 0x46, 0x08, 0x00, 0x40, 0x46, + 0x18, 0x00, 0x40, 0x46, 0x0c, 0x00, 0x40, 0x46, 0x1c, 0x00, 0x40, 0x46, + 0x10, 0x00, 0x40, 0x46, 0x20, 0x00, 0x40, 0x46, 0x24, 0x00, 0x40, 0x46, + 0x28, 0x00, 0x40, 0x46, 0x2c, 0x00, 0x40, 0x46, 0x00, 0x00, 0x40, 0x46, + 0x9c, 0x65, 0x02, 0x20, 0x3c, 0x87, 0x04, 0x01, 0x94, 0x77, 0x02, 0x20, + 0x00, 0xff, 0xff, 0x00, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x5f, 0x49, 0x6e, + 0x69, 0x74, 0x28, 0x29, 0x0a, 0x00, 0x00, 0x00, 0x20, 0x20, 0x70, 0x54, + 0x65, 0x6c, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, + 0x20, 0x30, 0x78, 0x25, 0x30, 0x38, 0x58, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x54, 0x53, 0x20, 0x6d, 0x61, 0x73, 0x6b, + 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x58, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x70, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, 0xdf, 0xf8, 0xac, 0x55, + 0x06, 0x46, 0x2e, 0x70, 0xfe, 0xf7, 0x68, 0xfa, 0x04, 0x00, 0x04, 0xd1, + 0xfb, 0xf7, 0xa9, 0xfc, 0xfc, 0xf7, 0x2e, 0xff, 0x04, 0x46, 0x64, 0xb9, + 0x11, 0xf0, 0x1e, 0xfa, 0x04, 0x00, 0x03, 0xd1, 0x30, 0x46, 0xfe, 0xf7, + 0x75, 0xff, 0x04, 0x46, 0x1c, 0xb9, 0x30, 0x46, 0x11, 0xf0, 0xca, 0xfa, + 0x04, 0x46, 0x0f, 0xf2, 0x51, 0x41, 0x00, 0x20, 0xff, 0xf7, 0x9b, 0xf9, + 0x0f, 0xf2, 0x59, 0x41, 0x01, 0x20, 0xff, 0xf7, 0x96, 0xf9, 0x05, 0xf1, + 0x14, 0x01, 0x01, 0x20, 0x02, 0xf0, 0xd2, 0xff, 0xa8, 0x60, 0xf3, 0xf7, + 0x33, 0xfc, 0x06, 0x46, 0x28, 0x78, 0x0f, 0xf2, 0x51, 0x21, 0x00, 0x28, + 0x51, 0xd0, 0x00, 0x27, 0x4f, 0xf0, 0x03, 0x08, 0x00, 0x20, 0xff, 0xf7, + 0x76, 0xf9, 0x26, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x03, 0xd5, 0x01, 0x21, + 0x38, 0x46, 0xff, 0xf7, 0x25, 0xf9, 0x7f, 0x1c, 0xff, 0xb2, 0xb8, 0x45, + 0xf3, 0xda, 0x06, 0x20, 0xfd, 0xf7, 0x1d, 0xfe, 0x0f, 0xf2, 0xfd, 0x21, + 0x06, 0x20, 0xfd, 0xf7, 0x06, 0xff, 0x00, 0x20, 0xe8, 0x60, 0x28, 0x61, + 0x00, 0x26, 0xdf, 0xf8, 0x10, 0x25, 0xdf, 0xf8, 0x10, 0x35, 0x53, 0xf8, + 0x26, 0x00, 0x50, 0xf8, 0x08, 0xcf, 0x01, 0x27, 0x00, 0x21, 0xb7, 0x40, + 0x5f, 0xea, 0xcc, 0x7c, 0x06, 0xd5, 0xd5, 0xf8, 0x0c, 0xc0, 0x47, 0xea, + 0x0c, 0x0c, 0x01, 0x21, 0xc5, 0xf8, 0x0c, 0xc0, 0x00, 0x68, 0xc0, 0xf3, + 0x00, 0x20, 0x20, 0xb1, 0x28, 0x69, 0x07, 0x43, 0x41, 0xf4, 0x80, 0x71, + 0x2f, 0x61, 0x52, 0xf8, 0x26, 0x00, 0xef, 0xf3, 0x10, 0x87, 0x72, 0xb6, + 0x50, 0xf8, 0x30, 0xcf, 0xdf, 0xf8, 0xcc, 0xe4, 0x0e, 0xea, 0x0c, 0x0c, + 0x4c, 0xea, 0x01, 0x21, 0x01, 0x60, 0x87, 0xf3, 0x10, 0x88, 0x76, 0x1c, + 0x08, 0x2e, 0xd2, 0xdb, 0x20, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x04, 0x27, + 0x4f, 0xf0, 0x07, 0x08, 0x01, 0x20, 0xac, 0xe7, 0x01, 0x21, 0xff, 0xf7, + 0x0c, 0xb8, 0x00, 0x21, 0xff, 0xf7, 0x09, 0xb8, 0x01, 0x21, 0xff, 0xf7, + 0x1a, 0xb8, 0x00, 0x21, 0xff, 0xf7, 0x17, 0xb8, 0x01, 0x21, 0xff, 0xf7, + 0x28, 0xb8, 0x00, 0x21, 0xff, 0xf7, 0x25, 0xb8, 0x01, 0x29, 0x0c, 0xbf, + 0x01, 0x22, 0x00, 0x22, 0x01, 0x21, 0x01, 0xfa, 0x00, 0xf0, 0xfe, 0xf7, + 0x61, 0xbf, 0x01, 0x29, 0x0c, 0xbf, 0x01, 0x22, 0x00, 0x22, 0x01, 0x23, + 0x00, 0x21, 0x03, 0xfa, 0x00, 0xf0, 0xfe, 0xf7, 0x57, 0xbf, 0x01, 0x29, + 0x0c, 0xbf, 0x01, 0x22, 0x00, 0x22, 0x01, 0x21, 0x01, 0xfa, 0x00, 0xf0, + 0xfe, 0xf7, 0x7b, 0xbf, 0x01, 0x29, 0x0c, 0xbf, 0x01, 0x22, 0x00, 0x22, + 0x01, 0x23, 0x00, 0x21, 0x03, 0xfa, 0x00, 0xf0, 0xfe, 0xf7, 0x71, 0xbf, + 0xf8, 0xb5, 0x0d, 0x46, 0x04, 0x46, 0x16, 0x46, 0x1f, 0x46, 0x01, 0x21, + 0x11, 0xf0, 0x86, 0xfa, 0x78, 0xb9, 0x20, 0x46, 0x11, 0xf0, 0x44, 0xfa, + 0x58, 0xb9, 0x20, 0x46, 0x11, 0xf0, 0x47, 0xfa, 0x38, 0xb9, 0x3b, 0x46, + 0x32, 0x46, 0x29, 0x46, 0x20, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x40, + 0xd3, 0xe7, 0xf2, 0xbd, 0x38, 0xb5, 0x05, 0x46, 0xff, 0xf7, 0xd8, 0xff, + 0x04, 0x46, 0x28, 0x46, 0x11, 0xf0, 0x46, 0xfa, 0x04, 0xb9, 0x04, 0x46, + 0x00, 0x21, 0x28, 0x46, 0x11, 0xf0, 0x66, 0xfa, 0x20, 0x46, 0x32, 0xbd, + 0x10, 0xb5, 0x0c, 0x46, 0x01, 0x2c, 0x4f, 0xf6, 0x51, 0x71, 0x18, 0xbf, + 0x00, 0x24, 0x12, 0xb1, 0x07, 0x2a, 0x07, 0xd0, 0x0b, 0xe0, 0x01, 0x21, + 0x22, 0x46, 0x01, 0xfa, 0x00, 0xf0, 0xfe, 0xf7, 0x6d, 0xff, 0x03, 0xe0, + 0x19, 0x68, 0x22, 0x46, 0xff, 0xf7, 0x5d, 0xf8, 0x01, 0x46, 0x08, 0x46, + 0x10, 0xbd, 0x80, 0xb5, 0x01, 0x29, 0x4f, 0xf6, 0x51, 0x73, 0x18, 0xbf, + 0x00, 0x21, 0x12, 0xb1, 0x07, 0x2a, 0x08, 0xd0, 0x0a, 0xe0, 0x0a, 0x46, + 0x01, 0x23, 0x00, 0x21, 0x03, 0xfa, 0x00, 0xf0, 0xfe, 0xf7, 0x54, 0xff, + 0x01, 0xe0, 0xff, 0xf7, 0x49, 0xf8, 0x03, 0x46, 0x18, 0x46, 0x02, 0xbd, + 0xff, 0xf7, 0x74, 0xb8, 0x10, 0xb5, 0x00, 0x24, 0x01, 0x2a, 0x18, 0xbf, + 0x00, 0x22, 0x0b, 0x00, 0x0c, 0xbf, 0x00, 0x21, 0x01, 0x29, 0x02, 0xd1, + 0x11, 0xf0, 0xdc, 0xfa, 0x01, 0xe0, 0x4f, 0xf6, 0x51, 0x74, 0x20, 0x46, + 0x10, 0xbd, 0x70, 0xb5, 0x00, 0x22, 0x09, 0xb3, 0x08, 0x28, 0x1c, 0xd2, + 0xdf, 0xf8, 0x4c, 0x33, 0x53, 0xf8, 0x20, 0x30, 0x53, 0xf8, 0x08, 0x4f, + 0xe4, 0x07, 0x05, 0xd4, 0xdf, 0xf8, 0x34, 0x43, 0xe5, 0x68, 0xc5, 0x40, + 0xee, 0x07, 0x01, 0xd5, 0x0a, 0x60, 0x11, 0xe0, 0x1b, 0x68, 0xdb, 0x05, + 0x03, 0xd4, 0x24, 0x69, 0xc4, 0x40, 0xe0, 0x07, 0x02, 0xd5, 0x01, 0x23, + 0x0b, 0x60, 0x07, 0xe0, 0xff, 0x20, 0x08, 0x60, 0x04, 0xe0, 0x4f, 0xf6, + 0x52, 0x72, 0x01, 0xe0, 0x4f, 0xf6, 0x0a, 0x72, 0x10, 0x46, 0x70, 0xbd, + 0x2d, 0xe9, 0xf8, 0x4f, 0xbe, 0x4d, 0x68, 0x78, 0x00, 0x28, 0x67, 0xd1, + 0x01, 0x21, 0x69, 0x70, 0x01, 0x23, 0x69, 0x68, 0x01, 0x22, 0x06, 0x20, + 0xfd, 0xf7, 0x09, 0xfd, 0xf3, 0xf7, 0xf8, 0xfa, 0x29, 0x78, 0xbb, 0x4a, + 0xdf, 0xf8, 0xec, 0x92, 0x00, 0x29, 0x19, 0xbf, 0x00, 0x26, 0x4f, 0xf0, + 0x03, 0x0a, 0x04, 0x26, 0x4f, 0xf0, 0x07, 0x0a, 0x00, 0x24, 0x31, 0x46, + 0x00, 0xe0, 0x49, 0x1c, 0x8a, 0x45, 0x13, 0xd3, 0x20, 0xfa, 0x01, 0xf3, + 0xdb, 0x07, 0xf8, 0xd5, 0x59, 0xf8, 0x21, 0x70, 0x57, 0xf8, 0x48, 0x3f, + 0x52, 0xf8, 0x21, 0x70, 0x07, 0xf5, 0xd8, 0x77, 0x03, 0xf0, 0x30, 0x03, + 0x3f, 0x68, 0x07, 0xf0, 0x03, 0x07, 0x3b, 0x43, 0x1c, 0x43, 0xe8, 0xd0, + 0x00, 0x2c, 0x83, 0x46, 0x34, 0xd1, 0x01, 0x20, 0xfd, 0xf7, 0xc4, 0xfd, + 0x28, 0x78, 0xa7, 0x4f, 0xdf, 0xf8, 0x9c, 0x82, 0x18, 0xb1, 0x00, 0xf0, + 0x93, 0xf8, 0x40, 0x46, 0x02, 0xe0, 0x00, 0xf0, 0x8f, 0xf8, 0x38, 0x46, + 0xff, 0xf7, 0x4e, 0xfe, 0x9e, 0x49, 0x00, 0x20, 0x00, 0xe0, 0x76, 0x1c, + 0xb2, 0x45, 0x0c, 0xd3, 0x2b, 0xfa, 0x06, 0xf2, 0xd2, 0x07, 0xf8, 0xd5, + 0x59, 0xf8, 0x26, 0x30, 0x53, 0xf8, 0x48, 0x2f, 0x51, 0xf8, 0x26, 0x30, + 0x00, 0xf0, 0x82, 0xf8, 0xef, 0xd0, 0x28, 0xb9, 0x06, 0x20, 0xfd, 0xf7, + 0x17, 0xfd, 0x00, 0x21, 0x69, 0x70, 0x09, 0xe0, 0x28, 0x78, 0x18, 0xb1, + 0x00, 0xf0, 0x72, 0xf8, 0x40, 0x46, 0x02, 0xe0, 0x00, 0xf0, 0x6e, 0xf8, + 0x38, 0x46, 0x79, 0xe0, 0xbd, 0xe8, 0xf1, 0x8f, 0x2d, 0xe9, 0xf8, 0x4f, + 0xf3, 0xf7, 0x94, 0xfa, 0x85, 0x4d, 0xdf, 0xf8, 0x24, 0xa2, 0xdf, 0xf8, + 0x24, 0xb2, 0x01, 0x46, 0x28, 0x78, 0x00, 0x28, 0x19, 0xbf, 0x00, 0x26, + 0x03, 0x27, 0x04, 0x26, 0x07, 0x27, 0x00, 0x24, 0x30, 0x46, 0x00, 0xe0, + 0x40, 0x1c, 0x87, 0x42, 0x13, 0xd3, 0x21, 0xfa, 0x00, 0xf2, 0xd2, 0x07, + 0xf8, 0xd5, 0x5b, 0xf8, 0x20, 0x30, 0x53, 0xf8, 0x48, 0x2f, 0x5a, 0xf8, + 0x20, 0x30, 0x03, 0xf5, 0xd8, 0x73, 0x02, 0xf0, 0x30, 0x02, 0x1b, 0x68, + 0x03, 0xf0, 0x03, 0x03, 0x1a, 0x43, 0x14, 0x43, 0xe8, 0xd0, 0x00, 0x2c, + 0x00, 0x91, 0x35, 0xd1, 0x01, 0x20, 0xfd, 0xf7, 0x5f, 0xfd, 0x28, 0x78, + 0xdf, 0xf8, 0xd0, 0x81, 0xdf, 0xf8, 0xd0, 0x91, 0x18, 0xb1, 0x00, 0xf0, + 0x2d, 0xf8, 0x48, 0x46, 0x02, 0xe0, 0x00, 0xf0, 0x29, 0xf8, 0x40, 0x46, + 0xff, 0xf7, 0xe8, 0xfd, 0x00, 0x99, 0x00, 0x20, 0x00, 0xe0, 0x76, 0x1c, + 0xb7, 0x42, 0x0c, 0xd3, 0x21, 0xfa, 0x06, 0xf2, 0xd2, 0x07, 0xf8, 0xd5, + 0x5b, 0xf8, 0x26, 0x30, 0x53, 0xf8, 0x48, 0x2f, 0x5a, 0xf8, 0x26, 0x30, + 0x00, 0xf0, 0x1c, 0xf8, 0xef, 0xd0, 0x28, 0xb9, 0x06, 0x20, 0xfd, 0xf7, + 0xb1, 0xfc, 0x00, 0x21, 0x69, 0x70, 0x09, 0xe0, 0x28, 0x78, 0x18, 0xb1, + 0x00, 0xf0, 0x0c, 0xf8, 0x48, 0x46, 0x02, 0xe0, 0x00, 0xf0, 0x08, 0xf8, + 0x40, 0x46, 0x13, 0xe0, 0xbd, 0xe8, 0xf1, 0x8f, 0x00, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x70, 0x47, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x70, 0x47, + 0x03, 0xf5, 0xd8, 0x73, 0x02, 0xf0, 0x30, 0x02, 0x1c, 0x68, 0x04, 0xf0, + 0x03, 0x04, 0x22, 0x43, 0x10, 0x43, 0x70, 0x47, 0x01, 0xb0, 0xbd, 0xe8, + 0xf0, 0x4f, 0xab, 0xe5, 0x1c, 0xb5, 0x00, 0x20, 0x00, 0x90, 0x69, 0x46, + 0x47, 0x4c, 0xa0, 0x68, 0x02, 0xf0, 0x9c, 0xfe, 0x01, 0x21, 0x09, 0xe0, + 0x1c, 0xb5, 0x00, 0x20, 0x00, 0x90, 0x6a, 0x46, 0x42, 0x4c, 0xa0, 0x68, + 0x00, 0x21, 0x02, 0xf0, 0xcb, 0xff, 0x00, 0x21, 0x00, 0x98, 0xa1, 0x70, + 0x38, 0xb1, 0x46, 0x48, 0x4f, 0xf0, 0x80, 0x51, 0x01, 0x60, 0xbf, 0xf3, + 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x13, 0xbd, 0x80, 0xb5, 0x01, 0x00, + 0x38, 0x48, 0x80, 0x68, 0x08, 0xbf, 0x4f, 0xf0, 0xff, 0x31, 0x02, 0xf0, + 0x15, 0xff, 0x01, 0x28, 0x18, 0xbf, 0x00, 0x20, 0x02, 0xbd, 0x38, 0xb5, + 0x05, 0x20, 0xfd, 0xf7, 0x1f, 0xfb, 0x31, 0x4d, 0x04, 0x46, 0xa8, 0x68, + 0x02, 0xf0, 0xd8, 0xff, 0x38, 0xb9, 0xa8, 0x78, 0x28, 0xb1, 0xa8, 0x68, + 0x00, 0x23, 0x00, 0x22, 0x00, 0x21, 0x02, 0xf0, 0xb2, 0xfd, 0x20, 0x46, + 0x80, 0xf3, 0x11, 0x88, 0x00, 0x20, 0x32, 0xbd, 0xf8, 0xb5, 0x17, 0x46, + 0x0e, 0x46, 0x00, 0x25, 0x00, 0x24, 0x01, 0x22, 0x00, 0x21, 0x01, 0x28, + 0x8d, 0xf8, 0x00, 0x10, 0x31, 0xd1, 0x38, 0x78, 0x20, 0xb1, 0x01, 0x28, + 0x0c, 0xbf, 0x8d, 0xf8, 0x00, 0x00, 0x00, 0x22, 0x78, 0x78, 0x08, 0xb9, + 0x01, 0x21, 0x02, 0xe0, 0x01, 0x28, 0x18, 0xbf, 0x00, 0x22, 0xb8, 0x78, + 0x08, 0xb9, 0x01, 0x24, 0x01, 0xe0, 0x01, 0x28, 0x1a, 0xd1, 0xca, 0xb1, + 0x00, 0x29, 0x6b, 0x46, 0x04, 0xd0, 0x06, 0x22, 0x30, 0x46, 0x10, 0xf0, + 0xac, 0xff, 0x04, 0xe0, 0x06, 0x22, 0x01, 0x21, 0x30, 0x46, 0x10, 0xf0, + 0xd0, 0xff, 0x05, 0x00, 0x1e, 0xd1, 0x00, 0x2c, 0x9d, 0xf8, 0x00, 0x10, + 0x14, 0xbf, 0x01, 0x22, 0x00, 0x22, 0x30, 0x46, 0xff, 0xf7, 0x5e, 0xfe, + 0x05, 0x46, 0x13, 0xe0, 0x4f, 0xf6, 0x6b, 0x75, 0x10, 0xe0, 0x02, 0x28, + 0x03, 0xd1, 0x38, 0x68, 0x07, 0x49, 0x48, 0x60, 0x0a, 0xe0, 0x03, 0x28, + 0x06, 0xd1, 0x38, 0x78, 0x10, 0xf0, 0x5b, 0xff, 0x78, 0x78, 0x10, 0xf0, + 0x55, 0xff, 0x01, 0xe0, 0x4f, 0xf6, 0x6a, 0x75, 0x28, 0x46, 0xf2, 0xbd, + 0x78, 0x43, 0x00, 0x20, 0x28, 0x98, 0x04, 0x01, 0xc8, 0x97, 0x04, 0x01, + 0xff, 0xfe, 0xfe, 0xff, 0xe8, 0x96, 0x04, 0x01, 0x08, 0x97, 0x04, 0x01, + 0x44, 0x01, 0x00, 0x47, 0x43, 0x01, 0x00, 0x47, 0x04, 0xed, 0x00, 0xe0, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x38, 0xb5, 0x00, 0x24, 0xdf, 0xf8, 0x48, 0x54, + 0x50, 0x22, 0x62, 0x43, 0x2a, 0x44, 0x02, 0xf1, 0x20, 0x01, 0x01, 0x20, + 0x02, 0xf0, 0xf8, 0xfc, 0x45, 0xf8, 0x24, 0x00, 0x64, 0x1c, 0x08, 0x2c, + 0xf2, 0xd3, 0x31, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, 0xdf, 0xf8, 0x24, 0x84, + 0xdf, 0xf8, 0x24, 0x94, 0x04, 0x46, 0x58, 0xf8, 0x24, 0x00, 0x00, 0xf0, + 0xb1, 0xf9, 0xdf, 0xf8, 0x1c, 0x14, 0x51, 0xf8, 0x24, 0x60, 0x00, 0xf0, + 0x4d, 0xf8, 0x00, 0x25, 0x59, 0xf8, 0x24, 0x00, 0x00, 0xeb, 0x85, 0x11, + 0x01, 0xf1, 0x0c, 0x07, 0x34, 0x21, 0x38, 0x46, 0xf6, 0xf7, 0xea, 0xfe, + 0x6d, 0x1c, 0x4f, 0xf4, 0x80, 0x00, 0x41, 0x2d, 0xb8, 0x61, 0xef, 0xd3, + 0xdf, 0xf8, 0xf0, 0x13, 0x51, 0xf8, 0x24, 0x20, 0x4f, 0xf4, 0xe6, 0x20, + 0x42, 0xf8, 0xd8, 0x0f, 0x00, 0x23, 0x31, 0x68, 0xdf, 0xf8, 0xe0, 0x03, + 0x01, 0x40, 0x41, 0xf4, 0x7f, 0x41, 0x41, 0xf0, 0x0d, 0x01, 0x31, 0x60, + 0x00, 0x22, 0x58, 0xf8, 0x24, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x43, + 0x67, 0xe0, 0xf8, 0xb5, 0x00, 0xf0, 0x45, 0xf8, 0x00, 0xf0, 0x7c, 0xf9, + 0x00, 0xf0, 0x18, 0xf8, 0x00, 0x20, 0xdf, 0xf8, 0xa8, 0x13, 0x00, 0x27, + 0x51, 0xf8, 0x25, 0x20, 0x83, 0x01, 0x40, 0x1c, 0xd7, 0x50, 0x41, 0x28, + 0xf8, 0xd3, 0x30, 0x68, 0x40, 0xf4, 0x7f, 0x40, 0x40, 0xf0, 0x03, 0x00, + 0x30, 0x60, 0x00, 0x23, 0x54, 0xf8, 0x25, 0x00, 0x01, 0xb0, 0xbd, 0xe8, + 0xf0, 0x40, 0x47, 0xe0, 0xdf, 0xf8, 0x7c, 0x13, 0x51, 0xf8, 0x25, 0x60, + 0x18, 0x36, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x30, 0x46, 0x7b, 0xe7, + 0xf8, 0xb5, 0x00, 0xf0, 0x1c, 0xf8, 0x00, 0xf0, 0x53, 0xf9, 0xff, 0xf7, + 0xef, 0xff, 0x00, 0x20, 0xd5, 0x49, 0x00, 0x27, 0x51, 0xf8, 0x25, 0x20, + 0x02, 0xeb, 0x80, 0x13, 0x40, 0x1c, 0x41, 0x28, 0x9f, 0x60, 0xf7, 0xd3, + 0x30, 0x68, 0x40, 0xf4, 0x7f, 0x40, 0x40, 0xf0, 0x10, 0x00, 0x30, 0x60, + 0x00, 0x23, 0x54, 0xf8, 0x25, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x40, + 0x1e, 0xe0, 0xc9, 0x4c, 0x05, 0x46, 0x54, 0xf8, 0x25, 0x00, 0x70, 0x47, + 0x38, 0xb5, 0x00, 0xf0, 0x2d, 0xf9, 0xc7, 0x48, 0x50, 0xf8, 0x24, 0x00, + 0x00, 0x23, 0x06, 0xe0, 0x38, 0xb5, 0x00, 0xf0, 0x25, 0xf9, 0xc3, 0x48, + 0x50, 0xf8, 0x24, 0x00, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x18, 0x30, + 0xff, 0xf7, 0x44, 0xff, 0x55, 0xf8, 0x24, 0x00, 0x01, 0xb0, 0xbd, 0xe8, + 0x30, 0x40, 0x00, 0x23, 0x00, 0x22, 0x00, 0x21, 0x02, 0xf0, 0x85, 0xbc, + 0x70, 0xb5, 0x00, 0xf0, 0x0f, 0xf9, 0xb8, 0x49, 0x51, 0xf8, 0x24, 0x00, + 0x50, 0xf8, 0x18, 0x6f, 0x55, 0xf8, 0x24, 0x00, 0x00, 0x23, 0x00, 0x22, + 0x00, 0x21, 0x02, 0xf0, 0x76, 0xfc, 0x06, 0xf0, 0x01, 0x00, 0x70, 0xbd, + 0x2d, 0xe9, 0xf8, 0x4f, 0x41, 0x29, 0x8a, 0x46, 0x61, 0xd2, 0xdf, 0xf8, + 0xb0, 0x82, 0x81, 0x46, 0x58, 0xf8, 0x29, 0x00, 0x1c, 0x46, 0x15, 0x46, + 0x00, 0xf0, 0xf6, 0xf8, 0xa9, 0x49, 0x51, 0xf8, 0x29, 0x60, 0x56, 0xf8, + 0x18, 0x7f, 0x04, 0x20, 0xfd, 0xf7, 0xbc, 0xf9, 0x83, 0x46, 0xff, 0xf7, + 0x8e, 0xff, 0xa3, 0x48, 0x50, 0xf8, 0x29, 0x10, 0x60, 0x68, 0x01, 0xeb, + 0x8a, 0x12, 0x02, 0xf1, 0x0c, 0x01, 0x22, 0x68, 0xc2, 0xea, 0x00, 0x43, + 0x0b, 0x60, 0xa0, 0x68, 0xa0, 0x4b, 0x80, 0xb2, 0x48, 0x60, 0x2a, 0x68, + 0x12, 0x04, 0x0a, 0x61, 0x6a, 0x68, 0xa8, 0x68, 0x03, 0xea, 0x82, 0x03, + 0x43, 0xea, 0x00, 0x53, 0x28, 0x68, 0xc0, 0xf3, 0x01, 0x40, 0x03, 0x43, + 0x4b, 0x61, 0xea, 0x68, 0x28, 0x69, 0x98, 0x4b, 0x03, 0xea, 0x82, 0x13, + 0x43, 0xea, 0x00, 0x63, 0xa8, 0x68, 0xc0, 0xf3, 0x05, 0x30, 0x03, 0x43, + 0x8b, 0x61, 0x6a, 0x69, 0xa8, 0x69, 0x93, 0x4b, 0x03, 0xea, 0x82, 0x23, + 0x43, 0xea, 0x00, 0x73, 0x28, 0x69, 0xc0, 0xf3, 0x09, 0x20, 0x03, 0x43, + 0xcb, 0x61, 0x4f, 0xf6, 0x01, 0x72, 0xa8, 0x69, 0xc0, 0xf3, 0x0d, 0x10, + 0x08, 0x62, 0x13, 0x46, 0x00, 0x21, 0x30, 0x46, 0xff, 0xf7, 0xce, 0xfe, + 0x58, 0x46, 0x80, 0xf3, 0x11, 0x88, 0xf8, 0x07, 0x01, 0xd4, 0xff, 0xf7, + 0x46, 0xff, 0x58, 0xf8, 0x29, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, + 0x81, 0xe7, 0xbd, 0xe8, 0xf1, 0x8f, 0x41, 0x29, 0x00, 0xd3, 0x70, 0x47, + 0x10, 0xb5, 0x79, 0x4c, 0x54, 0xf8, 0x20, 0x00, 0x00, 0xeb, 0x81, 0x11, + 0x01, 0xf1, 0x0c, 0x00, 0x04, 0x68, 0x24, 0x04, 0x24, 0x14, 0x1c, 0x60, + 0x01, 0x68, 0x09, 0x14, 0x59, 0x60, 0x41, 0x68, 0x09, 0x04, 0x09, 0x14, + 0x99, 0x60, 0x03, 0x69, 0x41, 0x69, 0x9b, 0x08, 0x43, 0xea, 0x81, 0x73, + 0x9b, 0x13, 0x13, 0x60, 0x41, 0x69, 0x09, 0x03, 0x89, 0x13, 0x51, 0x60, + 0x43, 0x69, 0x81, 0x69, 0x9b, 0x09, 0x43, 0xea, 0x81, 0x63, 0x9b, 0x13, + 0x93, 0x60, 0x81, 0x69, 0x09, 0x02, 0x89, 0x13, 0xd1, 0x60, 0x83, 0x69, + 0xc1, 0x69, 0x9b, 0x0a, 0x43, 0xea, 0x81, 0x53, 0x9b, 0x13, 0x13, 0x61, + 0xc1, 0x69, 0x09, 0x01, 0x89, 0x13, 0x51, 0x61, 0x01, 0x6a, 0xc0, 0x69, + 0x80, 0x0b, 0x40, 0xea, 0x81, 0x40, 0x80, 0x13, 0x90, 0x61, 0x10, 0xbd, + 0xf8, 0xb5, 0x8a, 0xb0, 0x04, 0x46, 0x0d, 0x46, 0x17, 0x46, 0x1e, 0x46, + 0x1c, 0x21, 0x03, 0xa8, 0xf6, 0xf7, 0x9c, 0xfd, 0x69, 0x46, 0x00, 0x20, + 0x00, 0x22, 0x00, 0x23, 0x81, 0xe8, 0x0d, 0x00, 0x06, 0x97, 0x01, 0x96, + 0x6b, 0x46, 0x03, 0xaa, 0x29, 0x46, 0x20, 0x46, 0xff, 0xf7, 0x40, 0xff, + 0x0b, 0xb0, 0xf0, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x41, 0x29, 0x0f, 0x46, + 0x31, 0xd2, 0xdf, 0xf8, 0x2c, 0x81, 0x82, 0x46, 0x58, 0xf8, 0x2a, 0x00, + 0x99, 0x46, 0x15, 0x46, 0x00, 0xf0, 0x34, 0xf8, 0x48, 0x49, 0x51, 0xf8, + 0x2a, 0x40, 0x54, 0xf8, 0x18, 0x6f, 0x04, 0x20, 0xfd, 0xf7, 0xfa, 0xf8, + 0x83, 0x46, 0x00, 0xf0, 0x20, 0xf8, 0x42, 0x48, 0x50, 0xf8, 0x2a, 0x10, + 0xbf, 0x01, 0xad, 0xb2, 0x1f, 0xfa, 0x89, 0xf0, 0x45, 0xea, 0x00, 0x45, + 0xcd, 0x51, 0x4f, 0xf6, 0x01, 0x72, 0x13, 0x46, 0x00, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0x3c, 0xfe, 0x58, 0x46, 0x80, 0xf3, 0x11, 0x88, 0xf0, 0x07, + 0x01, 0xd4, 0x00, 0xf0, 0x08, 0xf8, 0x58, 0xf8, 0x2a, 0x00, 0x01, 0xb0, + 0xbd, 0xe8, 0xf0, 0x4f, 0xef, 0xe6, 0xbd, 0xe8, 0xf1, 0x8f, 0x00, 0x23, + 0x01, 0x22, 0x00, 0x21, 0x20, 0x46, 0x27, 0xe6, 0x2e, 0x4d, 0x04, 0x46, + 0x55, 0xf8, 0x24, 0x00, 0x4f, 0xf4, 0x7a, 0x71, 0x02, 0xf0, 0xb8, 0xbc, + 0x41, 0x29, 0x00, 0xd3, 0x70, 0x47, 0x10, 0xb5, 0x29, 0x4c, 0x54, 0xf8, + 0x20, 0x00, 0x89, 0x01, 0x40, 0x58, 0x10, 0x80, 0x00, 0x0c, 0x18, 0x80, + 0x10, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, 0xdf, 0xf8, 0x8c, 0x80, 0x04, 0x46, + 0x0d, 0x46, 0x58, 0xf8, 0x24, 0x00, 0xff, 0xf7, 0xe5, 0xff, 0x21, 0x49, + 0x51, 0xf8, 0x24, 0x70, 0x57, 0xf8, 0x18, 0x6f, 0x04, 0x20, 0xfd, 0xf7, + 0xab, 0xf8, 0x81, 0x46, 0x00, 0xf0, 0x20, 0xf8, 0x00, 0x20, 0x1a, 0x49, + 0x51, 0xf8, 0x24, 0x20, 0x02, 0xeb, 0x80, 0x13, 0x35, 0xf9, 0x10, 0x20, + 0x9a, 0x60, 0x40, 0x1c, 0x41, 0x28, 0xf5, 0xd3, 0x4f, 0xf6, 0x01, 0x72, + 0x13, 0x46, 0x00, 0x21, 0x38, 0x46, 0xff, 0xf7, 0xeb, 0xfd, 0x48, 0x46, + 0x80, 0xf3, 0x11, 0x88, 0xf0, 0x07, 0x01, 0xd4, 0x00, 0xf0, 0x06, 0xf8, + 0x58, 0xf8, 0x24, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x43, 0x9e, 0xe6, + 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x38, 0x46, 0xd8, 0xe5, 0x70, 0xb5, + 0x00, 0x22, 0x07, 0x4b, 0x53, 0xf8, 0x20, 0x40, 0x04, 0xeb, 0x82, 0x15, + 0xae, 0x68, 0x21, 0xf8, 0x12, 0x60, 0x52, 0x1c, 0x41, 0x2a, 0xf5, 0xd3, + 0x70, 0xbd, 0x00, 0x00, 0xac, 0x43, 0x02, 0x20, 0xc8, 0x96, 0x04, 0x01, + 0x08, 0x97, 0x04, 0x01, 0xe8, 0x96, 0x04, 0x01, 0x92, 0x00, 0xff, 0xff, + 0xfc, 0xff, 0x0f, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x0f, + 0x18, 0x22, 0x4f, 0x4b, 0x50, 0x43, 0x18, 0x44, 0x10, 0x29, 0x40, 0x68, + 0x01, 0xd2, 0x08, 0x30, 0x70, 0x47, 0x0c, 0x30, 0x70, 0x47, 0x70, 0x47, + 0x70, 0xb5, 0x00, 0x24, 0xf1, 0xf7, 0x91, 0xff, 0xe2, 0xb2, 0x18, 0x23, + 0x46, 0x49, 0x5a, 0x43, 0x8d, 0x18, 0x6e, 0x69, 0x86, 0x42, 0x19, 0xd1, + 0x69, 0x68, 0x00, 0x20, 0x41, 0xf8, 0x08, 0x0f, 0x00, 0x22, 0x69, 0x68, + 0x41, 0xf8, 0x0c, 0x0f, 0x69, 0x68, 0x41, 0xf8, 0x10, 0x0f, 0x69, 0x68, + 0x41, 0xf8, 0x14, 0x0f, 0x69, 0x68, 0x08, 0x60, 0x68, 0x68, 0x40, 0xf8, + 0x04, 0x2f, 0xe9, 0x68, 0xa8, 0x68, 0xfd, 0xf7, 0x28, 0xf8, 0xa8, 0x68, + 0xfd, 0xf7, 0x0b, 0xf8, 0x64, 0x1c, 0xe0, 0xb2, 0x08, 0x28, 0xd7, 0xdb, + 0x70, 0xbd, 0x38, 0xb5, 0x0c, 0x46, 0xff, 0xf7, 0xc5, 0xff, 0x05, 0x46, + 0x06, 0x20, 0xfd, 0xf7, 0x25, 0xf8, 0x63, 0x00, 0x29, 0x68, 0x01, 0x22, + 0x03, 0xf0, 0x1e, 0x03, 0x9a, 0x40, 0x91, 0x43, 0x29, 0x60, 0xbd, 0xe8, + 0x32, 0x40, 0xfd, 0xf7, 0x2f, 0xb8, 0x3e, 0xb5, 0x08, 0x28, 0x05, 0x46, + 0x34, 0xda, 0x18, 0x21, 0x27, 0x4a, 0x48, 0x43, 0x14, 0x18, 0xa0, 0x68, + 0xfc, 0xf7, 0xa1, 0xff, 0xf1, 0xf7, 0x49, 0xff, 0x61, 0x69, 0x81, 0x42, + 0x0c, 0xbf, 0x01, 0x20, 0x00, 0x20, 0x0f, 0xf0, 0x89, 0xff, 0x8d, 0xf8, + 0x00, 0x50, 0x60, 0x68, 0x50, 0xf8, 0x04, 0x1b, 0x01, 0xf0, 0x3f, 0x01, + 0x01, 0x91, 0x3f, 0x29, 0x00, 0x68, 0x02, 0x90, 0x11, 0xd1, 0xb0, 0xf1, + 0x3f, 0x3f, 0x4f, 0xf6, 0x5c, 0x71, 0x05, 0xd1, 0x02, 0x22, 0x00, 0x20, + 0x00, 0xf0, 0x5e, 0xfb, 0x30, 0xbf, 0xfd, 0xe7, 0x03, 0x22, 0x00, 0x20, + 0x00, 0xf0, 0x58, 0xfb, 0x00, 0x20, 0x0f, 0xf0, 0x6b, 0xff, 0x21, 0x69, + 0x68, 0x46, 0x88, 0x47, 0x61, 0x68, 0x00, 0x20, 0x08, 0x60, 0x37, 0xbd, + 0x02, 0x22, 0x4f, 0xf6, 0x04, 0x71, 0x00, 0x20, 0x00, 0xf0, 0x48, 0xfb, + 0x37, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x00, 0x26, 0x08, 0x2c, 0x0d, 0x46, + 0x0a, 0xda, 0x06, 0x20, 0xfc, 0xf7, 0xd0, 0xff, 0x18, 0x21, 0x05, 0x4a, + 0x4c, 0x43, 0x11, 0x19, 0x0d, 0x61, 0x80, 0xf3, 0x11, 0x88, 0x01, 0xe0, + 0x4f, 0xf6, 0x02, 0x76, 0x30, 0x46, 0x70, 0xbd, 0x50, 0x49, 0x00, 0x20, + 0xdf, 0xf8, 0x2c, 0x16, 0x00, 0x20, 0xc8, 0x60, 0x70, 0x47, 0x2d, 0xe9, + 0xfe, 0x4f, 0x89, 0x46, 0xdf, 0xf8, 0x20, 0x16, 0xdf, 0xf8, 0x18, 0x66, + 0x8b, 0x68, 0x73, 0x60, 0x00, 0x28, 0x09, 0x68, 0xb1, 0x60, 0x00, 0xf0, + 0xa1, 0x81, 0xdf, 0xf8, 0x10, 0x06, 0xf0, 0x60, 0x01, 0x46, 0x41, 0xf2, + 0x38, 0x02, 0x18, 0x46, 0xe4, 0xf7, 0xf8, 0xfd, 0x72, 0x68, 0xb1, 0x68, + 0x10, 0x69, 0x48, 0x60, 0x00, 0x24, 0x4f, 0xf0, 0x30, 0x08, 0x00, 0x25, + 0x70, 0x68, 0x20, 0x44, 0x90, 0xf8, 0xbc, 0xa0, 0xe0, 0xb2, 0x00, 0xf0, + 0xab, 0xfa, 0xb1, 0x68, 0x00, 0x78, 0x21, 0x44, 0x81, 0xf8, 0x40, 0x01, + 0xb0, 0x68, 0x00, 0xf5, 0x56, 0x71, 0x0d, 0x60, 0x00, 0xf0, 0xaa, 0xfa, + 0x30, 0xb1, 0x4c, 0xf2, 0x9c, 0x32, 0x81, 0x58, 0xb0, 0x68, 0x00, 0xf5, + 0x56, 0x72, 0x11, 0x60, 0xba, 0xf1, 0x04, 0x0f, 0xb0, 0x68, 0x00, 0xf1, + 0x08, 0x01, 0x01, 0xeb, 0x84, 0x00, 0x80, 0xf0, 0xdd, 0x80, 0x71, 0x68, + 0xed, 0x22, 0x12, 0xfb, 0x0a, 0xf2, 0x0a, 0x44, 0xd2, 0xf8, 0xc1, 0x14, + 0x01, 0x60, 0xe0, 0xb2, 0x00, 0xf0, 0x96, 0xfa, 0x07, 0x46, 0xe0, 0xb2, + 0x00, 0xf0, 0xa2, 0xfa, 0x07, 0xf2, 0x01, 0x72, 0xb3, 0x68, 0x01, 0x46, + 0x10, 0x68, 0x28, 0x33, 0x43, 0xf8, 0x24, 0x00, 0x42, 0xf2, 0xc1, 0x70, + 0x38, 0x18, 0x42, 0xf2, 0xbd, 0x73, 0x90, 0xf8, 0x02, 0xb0, 0xd6, 0xf8, + 0x08, 0xc0, 0xbb, 0xf1, 0x00, 0x0f, 0x18, 0xbf, 0x4f, 0xf0, 0x01, 0x0b, + 0xfb, 0x18, 0x0c, 0xeb, 0x84, 0x0c, 0xd3, 0xf8, 0x00, 0xe0, 0x2e, 0xfa, + 0x0b, 0xfe, 0xcc, 0xf8, 0x7c, 0xe0, 0xd6, 0xf8, 0x08, 0xe0, 0x90, 0xf8, + 0x00, 0xc0, 0xa6, 0x44, 0x8e, 0xf8, 0x9c, 0xc0, 0x42, 0xf2, 0xe0, 0x7e, + 0xd3, 0xf8, 0x00, 0xc0, 0xb3, 0x68, 0x03, 0xeb, 0x84, 0x03, 0x03, 0xf5, + 0x88, 0x73, 0xbe, 0x44, 0xc3, 0xf8, 0x00, 0xc0, 0xd6, 0xf8, 0x08, 0xc0, + 0x43, 0x78, 0xa4, 0x44, 0x8c, 0xf8, 0xa4, 0x30, 0xd6, 0xf8, 0x08, 0xc0, + 0x83, 0x78, 0xa4, 0x44, 0x8c, 0xf8, 0xac, 0x30, 0xd6, 0xf8, 0x08, 0xc0, + 0xc3, 0x78, 0xa4, 0x44, 0x8c, 0xf8, 0xb4, 0x30, 0xb3, 0x68, 0xbe, 0xf8, + 0x00, 0xb0, 0x03, 0xeb, 0x44, 0x0c, 0x0c, 0xf5, 0x5f, 0x7c, 0x23, 0x44, + 0xac, 0xf8, 0x00, 0xb0, 0xbe, 0xf8, 0x02, 0xb0, 0xac, 0xf8, 0x10, 0xb0, + 0xbe, 0xf8, 0x04, 0xb0, 0xac, 0xf8, 0x20, 0xb0, 0x9e, 0xf8, 0x06, 0xc0, + 0x83, 0xf8, 0xac, 0xc3, 0xb3, 0x68, 0x9e, 0xf8, 0x07, 0xe0, 0x23, 0x44, + 0x83, 0xf8, 0xb4, 0xe3, 0xae, 0x46, 0xb3, 0x68, 0x90, 0xf8, 0x04, 0xc0, + 0x23, 0x44, 0x83, 0xf8, 0x5c, 0xc3, 0xb3, 0x68, 0x90, 0xf8, 0x05, 0xc0, + 0x23, 0x44, 0x83, 0xf8, 0x64, 0xc3, 0xb3, 0x68, 0x90, 0xf8, 0x06, 0xc0, + 0x23, 0x44, 0x83, 0xf8, 0x6c, 0xc3, 0x04, 0xeb, 0x44, 0x0c, 0xb3, 0x68, + 0xc0, 0x79, 0x23, 0x44, 0x83, 0xf8, 0x74, 0x03, 0x38, 0x46, 0xb7, 0x68, + 0x00, 0xeb, 0x0e, 0x03, 0x67, 0x44, 0x77, 0x44, 0x93, 0xf8, 0x05, 0xb7, + 0x87, 0xf8, 0xc0, 0xb0, 0xb7, 0x68, 0x93, 0xf8, 0x5a, 0x37, 0x67, 0x44, + 0x77, 0x44, 0x0e, 0xf1, 0x01, 0x0e, 0xbe, 0xf1, 0x03, 0x0f, 0x87, 0xf8, + 0xd8, 0x30, 0xea, 0xd3, 0x13, 0x68, 0xb2, 0x68, 0x02, 0xeb, 0x84, 0x02, + 0xc2, 0xf8, 0xf0, 0x30, 0x00, 0x23, 0x4f, 0xf0, 0xe0, 0x0e, 0x1e, 0xfb, + 0x0a, 0xfe, 0xb7, 0x68, 0x07, 0xeb, 0x44, 0x02, 0x77, 0x68, 0xbe, 0x44, + 0x32, 0x27, 0x5f, 0x43, 0x77, 0x44, 0x1a, 0x44, 0x97, 0xf8, 0x03, 0x71, + 0x82, 0xf8, 0x48, 0x71, 0x5b, 0x1c, 0x01, 0x2b, 0xeb, 0xd9, 0xaa, 0x46, + 0x08, 0xfb, 0x0a, 0xf2, 0x83, 0x18, 0xd3, 0xf8, 0x01, 0x20, 0xb3, 0x68, + 0x03, 0xeb, 0x44, 0x13, 0x03, 0xeb, 0x8a, 0x03, 0x03, 0xf5, 0xac, 0x77, + 0x0a, 0xf1, 0x01, 0x0a, 0xba, 0xf1, 0x08, 0x0f, 0x3a, 0x60, 0xed, 0xd3, + 0x00, 0x20, 0x08, 0xfb, 0x00, 0xf3, 0xca, 0x58, 0xb3, 0x68, 0x03, 0xeb, + 0x44, 0x13, 0x03, 0xeb, 0x80, 0x03, 0x03, 0xf5, 0x16, 0x73, 0x40, 0x1c, + 0x08, 0x28, 0x1a, 0x60, 0xf1, 0xd3, 0x09, 0xe0, 0x05, 0x60, 0xb0, 0x68, + 0x00, 0xf1, 0x28, 0x01, 0x41, 0xf8, 0x24, 0x50, 0xb0, 0x68, 0x00, 0xeb, + 0x84, 0x01, 0xcd, 0x67, 0x64, 0x1c, 0x08, 0x2c, 0xff, 0xf4, 0xf2, 0xae, + 0x00, 0xf0, 0xdc, 0xf9, 0xb1, 0x68, 0x03, 0x78, 0x01, 0xf5, 0x9c, 0x72, + 0x13, 0x60, 0xb2, 0x68, 0xc1, 0x68, 0x02, 0xf5, 0x9e, 0x73, 0x19, 0x60, + 0x72, 0x68, 0x11, 0x6a, 0xb2, 0x68, 0x02, 0xf5, 0x98, 0x73, 0x19, 0x60, + 0x81, 0x68, 0xb0, 0x68, 0x00, 0xf5, 0x9a, 0x72, 0x11, 0x60, 0x00, 0xf0, + 0x86, 0xf9, 0x00, 0xf0, 0xff, 0x00, 0x08, 0x67, 0x00, 0xf0, 0x81, 0xf9, + 0xc0, 0xf3, 0x07, 0x20, 0x48, 0x67, 0x00, 0xf0, 0x7c, 0xf9, 0xc0, 0xf3, + 0x01, 0x40, 0x88, 0x67, 0x00, 0x21, 0x70, 0x20, 0x72, 0x68, 0xb4, 0x68, + 0x48, 0x43, 0x02, 0x44, 0x02, 0xf5, 0x33, 0x63, 0x1a, 0x68, 0x04, 0xf1, + 0x48, 0x03, 0x43, 0xf8, 0x21, 0x20, 0x72, 0x68, 0x13, 0x18, 0xd3, 0xf8, + 0x3c, 0x2b, 0xb3, 0x68, 0x03, 0xeb, 0x81, 0x04, 0x22, 0x65, 0x72, 0x68, + 0x13, 0x18, 0xd3, 0xf8, 0x38, 0x2b, 0xb3, 0x68, 0x03, 0xeb, 0x81, 0x04, + 0xa2, 0x65, 0x72, 0x68, 0x02, 0x44, 0x92, 0xf8, 0x45, 0x3b, 0xb2, 0x68, + 0x0a, 0x44, 0x82, 0xf8, 0xbc, 0x30, 0x72, 0x68, 0x53, 0x18, 0x10, 0x44, + 0x93, 0xf8, 0xbc, 0x20, 0x00, 0xeb, 0x82, 0x04, 0xb2, 0x68, 0xd4, 0xf8, + 0x67, 0x0b, 0x02, 0xeb, 0x81, 0x03, 0x49, 0x1c, 0x01, 0x29, 0x18, 0x66, + 0xcb, 0xd9, 0x72, 0x68, 0xd2, 0xf8, 0x5e, 0x00, 0xd2, 0xf8, 0x62, 0x10, + 0xb4, 0x68, 0x4f, 0xf4, 0x7a, 0x72, 0x00, 0x23, 0xf7, 0xf7, 0x0e, 0xf8, + 0xa0, 0x66, 0x4f, 0xf4, 0x7a, 0x72, 0x74, 0x68, 0xd4, 0xf8, 0x89, 0x00, + 0xd4, 0xf8, 0x8d, 0x10, 0xb4, 0x68, 0x00, 0x23, 0xf7, 0xf7, 0x02, 0xf8, + 0xe0, 0x66, 0x00, 0x24, 0xb1, 0x68, 0xbb, 0x48, 0x08, 0x60, 0x10, 0xf0, + 0x56, 0xfa, 0x10, 0xf0, 0x60, 0xfa, 0x01, 0x28, 0x18, 0xbf, 0x48, 0xf2, + 0x01, 0x04, 0x00, 0x2c, 0x40, 0xf0, 0x10, 0x81, 0x00, 0x20, 0xdf, 0xf8, + 0xd4, 0xa2, 0x00, 0x21, 0x86, 0x46, 0x00, 0x22, 0x4f, 0xf0, 0xff, 0x08, + 0x0a, 0xf1, 0x08, 0x04, 0x5f, 0xfa, 0x82, 0xfc, 0x52, 0x1c, 0xd5, 0xb2, + 0x44, 0xf8, 0x2c, 0x80, 0x08, 0x2d, 0xf7, 0xdb, 0x00, 0x22, 0x0a, 0xf1, + 0x28, 0x04, 0x5f, 0xfa, 0x82, 0xfc, 0x52, 0x1c, 0xd5, 0xb2, 0x44, 0xf8, + 0x2c, 0x80, 0x08, 0x2d, 0xf7, 0xdb, 0xca, 0xf8, 0x00, 0x80, 0xca, 0xf8, + 0x04, 0x80, 0x00, 0x22, 0x0a, 0xf1, 0x48, 0x04, 0x5f, 0xfa, 0x82, 0xfc, + 0x52, 0x1c, 0xd5, 0xb2, 0x44, 0xf8, 0x2c, 0x80, 0x08, 0x2d, 0xf7, 0xdb, + 0x00, 0x22, 0x0a, 0xf1, 0x68, 0x04, 0x5f, 0xfa, 0x82, 0xfc, 0x52, 0x1c, + 0xd5, 0xb2, 0x44, 0xf8, 0x2c, 0x80, 0x04, 0x2d, 0xf7, 0xd3, 0x00, 0x22, + 0x0a, 0xf1, 0x78, 0x04, 0x5f, 0xfa, 0x82, 0xfc, 0x52, 0x1c, 0xd5, 0xb2, + 0x44, 0xf8, 0x2c, 0x80, 0x04, 0x2d, 0xf7, 0xd3, 0xca, 0xf8, 0x88, 0x80, + 0x00, 0x22, 0x0a, 0xf1, 0x8c, 0x04, 0x02, 0x94, 0xd7, 0xb2, 0x44, 0xf8, + 0x27, 0x80, 0x52, 0x1c, 0xd4, 0xb2, 0x04, 0x2c, 0xf5, 0xd3, 0x72, 0x68, + 0xcc, 0x46, 0x00, 0x25, 0x81, 0x46, 0x01, 0x23, 0x02, 0xf6, 0x18, 0x34, + 0xd2, 0xf8, 0xb8, 0x70, 0xef, 0x40, 0xff, 0x07, 0x16, 0xd5, 0x67, 0x5d, + 0x67, 0x45, 0x13, 0xd1, 0xbe, 0xf1, 0x04, 0x0f, 0x0d, 0xd2, 0x03, 0xfa, + 0x09, 0xf7, 0x39, 0x43, 0x0a, 0xf1, 0x28, 0x07, 0x47, 0xf8, 0x25, 0xe0, + 0x0a, 0xf1, 0x78, 0x07, 0x47, 0xf8, 0x2e, 0x50, 0x0e, 0xf1, 0x01, 0x0e, + 0x06, 0xe0, 0x4f, 0xf6, 0x67, 0x70, 0x03, 0xe0, 0x0a, 0xf1, 0x28, 0x07, + 0x47, 0xf8, 0x25, 0x80, 0x6d, 0x1c, 0x08, 0x2d, 0x09, 0xf1, 0x01, 0x09, + 0x01, 0xd0, 0x00, 0x28, 0xd8, 0xd0, 0x02, 0xf1, 0xb8, 0x07, 0x4f, 0xf0, + 0x00, 0x0e, 0x00, 0x25, 0x01, 0x97, 0x50, 0xbb, 0xdd, 0xf8, 0x04, 0xb0, + 0xdb, 0xf8, 0x00, 0x70, 0x4f, 0xf4, 0x80, 0x7b, 0x0b, 0xfa, 0x05, 0xfb, + 0x17, 0xea, 0x0b, 0x0f, 0x16, 0xd0, 0x67, 0x5d, 0x67, 0x45, 0x13, 0xd1, + 0xbe, 0xf1, 0x04, 0x0f, 0x0d, 0xd2, 0x03, 0xfa, 0x09, 0xf7, 0x39, 0x43, + 0x0a, 0xf1, 0x08, 0x07, 0x47, 0xf8, 0x25, 0xe0, 0x0a, 0xf1, 0x68, 0x07, + 0x47, 0xf8, 0x2e, 0x50, 0x0e, 0xf1, 0x01, 0x0e, 0x06, 0xe0, 0x4f, 0xf6, + 0x67, 0x70, 0x03, 0xe0, 0x0a, 0xf1, 0x08, 0x07, 0x47, 0xf8, 0x25, 0x80, + 0x6d, 0x1c, 0x08, 0x2d, 0x09, 0xf1, 0x01, 0x09, 0xd3, 0xd1, 0x04, 0x46, + 0x00, 0x20, 0x4d, 0x46, 0x86, 0x46, 0x4f, 0xf6, 0x67, 0x79, 0x2c, 0xbb, + 0xdd, 0xf8, 0x04, 0xb0, 0xdb, 0xf8, 0x00, 0x70, 0x4f, 0xf4, 0x80, 0x3b, + 0x0b, 0xfa, 0x0e, 0xfb, 0x17, 0xea, 0x0b, 0x0f, 0x12, 0xd0, 0x02, 0xeb, + 0x0e, 0x07, 0x97, 0xf8, 0x00, 0x7c, 0x67, 0x45, 0x0c, 0xd1, 0x48, 0xb9, + 0x03, 0xfa, 0x05, 0xf0, 0x01, 0x43, 0x00, 0x20, 0x4a, 0xf8, 0x2e, 0x00, + 0xca, 0xf8, 0x88, 0xe0, 0x01, 0x20, 0x03, 0xe0, 0x4c, 0x46, 0x01, 0xe0, + 0x4a, 0xf8, 0x2e, 0x80, 0x6d, 0x1c, 0x0e, 0xf1, 0x01, 0x0e, 0xbe, 0xf1, + 0x02, 0x0f, 0xd8, 0xd1, 0x00, 0x27, 0x0d, 0x46, 0xbb, 0x46, 0xe4, 0xb9, + 0xcd, 0xf8, 0x04, 0xc0, 0x5f, 0xfa, 0x8b, 0xf0, 0xf3, 0xf7, 0xb5, 0xff, + 0x58, 0xb3, 0x70, 0x68, 0x2c, 0x21, 0x01, 0xfb, 0x0b, 0xf1, 0x01, 0x44, + 0x01, 0x98, 0x91, 0xf8, 0x44, 0x2e, 0x82, 0x42, 0x21, 0xd1, 0x04, 0x2f, + 0x08, 0xd2, 0x0a, 0xf1, 0x48, 0x00, 0x40, 0xf8, 0x2b, 0x70, 0x02, 0x99, + 0x41, 0xf8, 0x27, 0xb0, 0x7f, 0x1c, 0x1a, 0xe0, 0x4c, 0x46, 0x70, 0x68, + 0x10, 0xf8, 0xb4, 0x1f, 0x8d, 0xf8, 0x00, 0x10, 0x42, 0x78, 0x8d, 0xf8, + 0x01, 0x20, 0x81, 0x78, 0x8d, 0xf8, 0x02, 0x10, 0xc0, 0x78, 0x8d, 0xf8, + 0x03, 0x00, 0x68, 0x46, 0xf1, 0xf7, 0x68, 0xf9, 0x04, 0xb9, 0x35, 0x60, + 0x20, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, 0x0a, 0xf1, 0x48, 0x00, 0x40, 0xf8, + 0x2b, 0x80, 0x0b, 0xf1, 0x01, 0x0b, 0xbb, 0xf1, 0x08, 0x0f, 0xc5, 0xd1, + 0xdf, 0xe7, 0x71, 0x68, 0xd1, 0xf8, 0xb8, 0x00, 0xb1, 0x68, 0x70, 0x47, + 0x02, 0x46, 0x20, 0x48, 0xc1, 0x68, 0x00, 0x20, 0x19, 0xb1, 0x88, 0x18, + 0x4d, 0xf2, 0xcc, 0x31, 0x08, 0x44, 0x70, 0x47, 0x1b, 0x48, 0xc1, 0x68, + 0x00, 0x20, 0x11, 0xb1, 0x41, 0xf2, 0x38, 0x00, 0x08, 0x44, 0x70, 0x47, + 0x02, 0x46, 0x17, 0x48, 0xc1, 0x68, 0x00, 0x20, 0x49, 0xb1, 0x88, 0x18, + 0x90, 0xf8, 0xbc, 0x20, 0x42, 0xf2, 0xe8, 0x70, 0x42, 0x43, 0x88, 0x18, + 0x42, 0xf6, 0x48, 0x41, 0x08, 0x44, 0x70, 0x47, 0x02, 0x46, 0x0f, 0x48, + 0xc1, 0x68, 0x00, 0x20, 0x49, 0xb1, 0x88, 0x18, 0x90, 0xf8, 0xbc, 0x20, + 0x40, 0xf2, 0x04, 0x70, 0x42, 0x43, 0x88, 0x18, 0x41, 0xf2, 0x38, 0x01, + 0x08, 0x44, 0x70, 0x47, 0x07, 0x48, 0xc1, 0x68, 0x00, 0x20, 0x11, 0xb1, + 0x4c, 0xf6, 0xe8, 0x30, 0x08, 0x44, 0x70, 0x47, 0x03, 0x48, 0xc1, 0x68, + 0x00, 0x20, 0x11, 0xb1, 0x4d, 0xf2, 0xb4, 0x30, 0x08, 0x44, 0x70, 0x47, + 0xb0, 0x76, 0x02, 0x20, 0xd8, 0x03, 0x00, 0x02, 0x17, 0x0c, 0x7f, 0xc0, + 0x11, 0xdd, 0xaa, 0x55, 0x80, 0x66, 0x03, 0x20, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, + 0x11, 0x40, 0x29, 0x43, 0x01, 0x70, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0xf8, 0xb5, 0x0c, 0x46, 0x05, 0x00, 0x17, 0x46, 0x47, 0x4e, 0x48, 0x49, + 0x03, 0xd0, 0x02, 0x28, 0x1a, 0xd0, 0x14, 0xd3, 0x00, 0xe0, 0x0c, 0x60, + 0x03, 0x2f, 0x1b, 0xd1, 0xf2, 0xf7, 0x5c, 0xfc, 0x40, 0xb1, 0x00, 0x94, + 0x2b, 0x46, 0x32, 0x46, 0xff, 0x21, 0x01, 0x20, 0xf2, 0xf7, 0x71, 0xfc, + 0xf2, 0xf7, 0x58, 0xfc, 0xbd, 0xe8, 0xf2, 0x40, 0x00, 0x20, 0x0f, 0xf0, + 0xf7, 0xbb, 0x02, 0x2f, 0x4c, 0x60, 0xe9, 0xd1, 0x01, 0x20, 0x03, 0xe0, + 0x02, 0x2f, 0x8c, 0x60, 0x38, 0x46, 0xe3, 0xd1, 0x00, 0xf0, 0x3b, 0xf8, + 0xf2, 0xf7, 0x40, 0xfc, 0x70, 0xb1, 0x38, 0x00, 0x08, 0xbf, 0x03, 0x20, + 0x03, 0xd0, 0x01, 0x2f, 0x0c, 0xbf, 0x02, 0x20, 0x01, 0x20, 0x00, 0x94, + 0x2b, 0x46, 0x06, 0xf1, 0x4c, 0x02, 0xff, 0x21, 0xf2, 0xf7, 0x4d, 0xfc, + 0xf1, 0xbd, 0x10, 0xb5, 0x0b, 0x46, 0x00, 0x24, 0x10, 0xb1, 0x01, 0x28, + 0x04, 0xd0, 0x09, 0xe0, 0xff, 0x22, 0x00, 0x21, 0x28, 0x48, 0x02, 0xe0, + 0xff, 0x22, 0x00, 0x21, 0x27, 0x48, 0xff, 0xf7, 0xa5, 0xff, 0x01, 0xe0, + 0x4f, 0xf6, 0x09, 0x74, 0x20, 0x46, 0x10, 0xbd, 0x02, 0x46, 0x00, 0x20, + 0x61, 0xb1, 0x21, 0x4b, 0x12, 0xb1, 0x01, 0x2a, 0x02, 0xd0, 0x04, 0xe0, + 0x1a, 0x78, 0x00, 0xe0, 0x5a, 0x78, 0x0a, 0x70, 0x70, 0x47, 0x4f, 0xf6, + 0x09, 0x70, 0x70, 0x47, 0x4f, 0xf6, 0x0a, 0x70, 0x70, 0x47, 0x10, 0xb5, + 0x04, 0x46, 0xf1, 0xf7, 0x66, 0xfb, 0xef, 0xf3, 0x10, 0x81, 0x72, 0xb6, + 0x01, 0x2c, 0x17, 0x4a, 0x0e, 0xd1, 0x30, 0xb9, 0x10, 0x78, 0x40, 0xf0, + 0x08, 0x03, 0x13, 0x70, 0x00, 0xf0, 0x2e, 0xf8, 0x0f, 0xe0, 0x50, 0x78, + 0x40, 0xf0, 0x08, 0x03, 0x53, 0x70, 0x00, 0xf0, 0x27, 0xf8, 0x10, 0xe0, + 0x02, 0x2c, 0x0f, 0xd1, 0x38, 0xb9, 0x10, 0x78, 0x40, 0xf0, 0x04, 0x03, + 0x13, 0x70, 0x00, 0xf0, 0x17, 0xf8, 0x10, 0x70, 0x06, 0xe0, 0x50, 0x78, + 0x40, 0xf0, 0x04, 0x03, 0x53, 0x70, 0x00, 0xf0, 0x0f, 0xf8, 0x50, 0x70, + 0x81, 0xf3, 0x10, 0x88, 0x10, 0xbd, 0x00, 0x00, 0x24, 0x8b, 0x04, 0x01, + 0x8c, 0x76, 0x02, 0x20, 0x00, 0x02, 0x00, 0x47, 0x01, 0x02, 0x00, 0x47, + 0x43, 0x01, 0x00, 0x47, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0xf0, + 0xfb, 0x00, 0x70, 0x47, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0xf0, + 0xf7, 0x00, 0x70, 0x47, 0x7f, 0xb5, 0xf2, 0xf7, 0xbf, 0xfa, 0x05, 0x46, + 0xf2, 0xf7, 0xbd, 0xfa, 0x00, 0x24, 0x05, 0x43, 0x00, 0x26, 0x25, 0xfa, + 0x06, 0xf0, 0xc0, 0x07, 0x09, 0xd5, 0x69, 0x46, 0x30, 0x46, 0x10, 0xf0, + 0x13, 0xfe, 0x04, 0x00, 0x03, 0xd1, 0x69, 0x46, 0x30, 0x46, 0x11, 0xf0, + 0x32, 0xf8, 0x76, 0x1c, 0x08, 0x2e, 0x01, 0xd2, 0x00, 0x2c, 0xec, 0xd0, + 0xf1, 0xf7, 0xdf, 0xfa, 0x80, 0xb1, 0x01, 0xf0, 0x8b, 0xf9, 0xf2, 0xf7, + 0x91, 0xfa, 0x05, 0x46, 0x00, 0x26, 0x4c, 0xb9, 0x25, 0xfa, 0x06, 0xf0, + 0xc0, 0x07, 0x44, 0xbf, 0x30, 0x46, 0x01, 0xf0, 0xb3, 0xf9, 0x76, 0x1c, + 0x08, 0x2e, 0xf5, 0xd3, 0x20, 0x46, 0x04, 0xb0, 0x70, 0xbd, 0x00, 0x00, + 0x2d, 0xe9, 0xf8, 0x43, 0xb8, 0xb0, 0x04, 0x46, 0x0a, 0xaa, 0x0d, 0xf1, + 0x2a, 0x01, 0x00, 0xf0, 0x7b, 0xf9, 0x00, 0x28, 0x40, 0xf0, 0xbd, 0x80, + 0x00, 0x27, 0xb9, 0x46, 0x00, 0x25, 0x0d, 0xf1, 0x2c, 0x08, 0x10, 0xe0, + 0x04, 0xf1, 0x0c, 0x00, 0x50, 0xf8, 0x25, 0x20, 0x63, 0x79, 0x20, 0x68, + 0x10, 0xf0, 0x39, 0xfb, 0x48, 0xf8, 0x25, 0x00, 0x04, 0xf1, 0x0c, 0x01, + 0x81, 0x44, 0x51, 0xf8, 0x25, 0x20, 0xd7, 0x19, 0x6d, 0x1c, 0xa0, 0x68, + 0x21, 0x79, 0x85, 0x42, 0xea, 0xd3, 0x00, 0x26, 0x00, 0x25, 0x97, 0xfb, + 0xf0, 0xf2, 0x01, 0x29, 0x99, 0xfb, 0xf0, 0xf9, 0x04, 0xf1, 0x21, 0x07, + 0x08, 0xd1, 0x38, 0x78, 0x28, 0xb1, 0x20, 0x68, 0x11, 0x46, 0x10, 0xf0, + 0xf5, 0xfb, 0x06, 0x46, 0x00, 0xe0, 0x7e, 0x78, 0x61, 0x79, 0x01, 0x29, + 0x08, 0xd1, 0x38, 0x78, 0x28, 0xb1, 0x20, 0x68, 0x49, 0x46, 0x10, 0xf0, + 0xe9, 0xfb, 0x05, 0x46, 0x00, 0xe0, 0x7d, 0x78, 0x0e, 0xa8, 0x09, 0x90, + 0x0a, 0x21, 0x00, 0x22, 0x03, 0x23, 0x08, 0x91, 0x07, 0x92, 0x06, 0x93, + 0x4f, 0xf4, 0x40, 0x73, 0xa0, 0x69, 0x05, 0x90, 0x04, 0x92, 0x03, 0x92, + 0x02, 0x93, 0x01, 0x92, 0x00, 0x92, 0xb7, 0xee, 0x00, 0x1a, 0x20, 0x68, + 0xd4, 0xed, 0x07, 0x0a, 0x9f, 0xed, 0x37, 0x0a, 0x00, 0x23, 0x01, 0x21, + 0x10, 0xf0, 0x4c, 0xfc, 0x16, 0xa8, 0x02, 0x90, 0x01, 0x96, 0x00, 0x21, + 0x00, 0x91, 0xbd, 0xf8, 0x2a, 0x30, 0x94, 0xf8, 0x20, 0x20, 0x21, 0x79, + 0x20, 0x68, 0x10, 0xf0, 0x13, 0xfb, 0x1a, 0xa8, 0x02, 0x90, 0x01, 0x95, + 0x00, 0x21, 0x00, 0x91, 0xbd, 0xf8, 0x28, 0x30, 0x94, 0xf8, 0x20, 0x20, + 0x61, 0x79, 0x20, 0x68, 0x10, 0xf0, 0x06, 0xfb, 0x00, 0x27, 0x18, 0x25, + 0x0e, 0xa9, 0x05, 0xfb, 0x07, 0xf2, 0x11, 0x44, 0x01, 0xf1, 0x40, 0x03, + 0xa0, 0x68, 0x07, 0x93, 0x87, 0x42, 0x80, 0x41, 0x00, 0x22, 0x06, 0x92, + 0x01, 0x23, 0xa1, 0x79, 0x05, 0x91, 0x04, 0x92, 0x03, 0x93, 0xc0, 0x0f, + 0x02, 0x92, 0x01, 0x90, 0x00, 0x90, 0x01, 0x22, 0x04, 0xf1, 0x0c, 0x00, + 0x16, 0xa9, 0x50, 0xf8, 0x27, 0x30, 0x20, 0x68, 0x10, 0xf0, 0xff, 0xfa, + 0x7f, 0x1c, 0x01, 0x2f, 0xde, 0xd9, 0x00, 0x27, 0x0e, 0xa9, 0x05, 0xfb, + 0x07, 0xf2, 0x11, 0x44, 0x01, 0xf1, 0x70, 0x03, 0xa0, 0x68, 0x07, 0x93, + 0x87, 0x42, 0x80, 0x41, 0x00, 0x26, 0x06, 0x96, 0x00, 0x22, 0xe1, 0x79, + 0x05, 0x91, 0x01, 0x23, 0x04, 0x92, 0x03, 0x93, 0xc0, 0x0f, 0x02, 0x96, + 0x01, 0x90, 0x00, 0x90, 0x1a, 0xa9, 0x58, 0xf8, 0x27, 0x30, 0x20, 0x68, + 0x10, 0xf0, 0xdf, 0xfa, 0x7f, 0x1c, 0x01, 0x2f, 0xe0, 0xd9, 0x20, 0x68, + 0x0e, 0xa9, 0xc0, 0x46, 0xc0, 0x46, 0x20, 0x68, 0x00, 0x23, 0x0e, 0xaa, + 0x03, 0x21, 0x11, 0xf0, 0x9c, 0xf8, 0x39, 0xb0, 0xbd, 0xe8, 0xf0, 0x83, + 0x00, 0x00, 0x00, 0x00, 0x0a, 0x46, 0x03, 0x21, 0x11, 0xf0, 0xe8, 0xba, + 0x2d, 0xe9, 0xf0, 0x4d, 0x06, 0x46, 0x8e, 0xb0, 0x0d, 0x46, 0x30, 0x68, + 0x03, 0x21, 0x11, 0xf0, 0x7a, 0xfb, 0x04, 0x46, 0x4f, 0xf4, 0x40, 0x72, + 0x21, 0x46, 0x01, 0x20, 0x10, 0xf0, 0x4b, 0xfc, 0x8d, 0xf8, 0x14, 0x00, + 0x0d, 0xf1, 0x12, 0x02, 0x04, 0xa9, 0x30, 0x46, 0x00, 0xf0, 0x9a, 0xf8, + 0xbd, 0xf8, 0x10, 0x20, 0x31, 0x79, 0x30, 0x68, 0x10, 0xf0, 0x4b, 0xfa, + 0xa8, 0x61, 0x21, 0x46, 0x01, 0x20, 0x10, 0xf0, 0x5a, 0xfc, 0x28, 0x60, + 0x06, 0xa9, 0xb0, 0x68, 0x68, 0x60, 0x07, 0xa8, 0x96, 0xf8, 0x20, 0x20, + 0x03, 0x90, 0x08, 0xab, 0x02, 0x91, 0x01, 0x93, 0x10, 0x46, 0x2f, 0x68, + 0xbd, 0xf8, 0x12, 0x30, 0xbd, 0xf8, 0x10, 0x10, 0x00, 0x97, 0x10, 0xf0, + 0x6d, 0xfd, 0x09, 0x95, 0x00, 0x27, 0x03, 0x94, 0x6e, 0xe0, 0x01, 0x28, + 0x04, 0xbf, 0x70, 0x79, 0x01, 0x28, 0x68, 0xd1, 0xa1, 0x68, 0x30, 0x68, + 0x10, 0xf0, 0x16, 0xfb, 0x40, 0xb2, 0x40, 0x42, 0xc3, 0xb2, 0x59, 0xe0, + 0x09, 0x98, 0x00, 0xeb, 0x87, 0x04, 0x06, 0xeb, 0x87, 0x00, 0xc1, 0x68, + 0xa1, 0x60, 0xc2, 0x68, 0x73, 0x79, 0x31, 0x79, 0x30, 0x68, 0x10, 0xf0, + 0x2c, 0xfa, 0x20, 0x61, 0xb8, 0x1c, 0x8d, 0xf8, 0x08, 0x00, 0xfa, 0xb2, + 0x03, 0x99, 0x01, 0x20, 0x10, 0xf0, 0x23, 0xfc, 0x8b, 0x46, 0x82, 0x46, + 0x9d, 0xf8, 0x08, 0x20, 0x03, 0x99, 0x01, 0x20, 0x10, 0xf0, 0x1b, 0xfc, + 0x0d, 0x46, 0x80, 0x46, 0x0c, 0xa9, 0x0a, 0xa8, 0x00, 0x91, 0x01, 0x90, + 0x9d, 0xf8, 0x08, 0x30, 0x03, 0x99, 0xfa, 0xb2, 0x01, 0x20, 0x10, 0xf0, + 0x23, 0xfc, 0x9d, 0xed, 0x08, 0x0a, 0x50, 0x46, 0x59, 0x46, 0x10, 0xf0, + 0x97, 0xfc, 0x84, 0xed, 0x07, 0x0a, 0x40, 0x46, 0x9d, 0xed, 0x07, 0x0a, + 0x29, 0x46, 0x10, 0xf0, 0x8f, 0xfc, 0x84, 0xed, 0x09, 0x0a, 0xdd, 0xe9, + 0x0c, 0x01, 0x9d, 0xed, 0x06, 0x0a, 0x10, 0xf0, 0x87, 0xfc, 0x84, 0xed, + 0x0b, 0x0a, 0xdd, 0xe9, 0x0a, 0x01, 0x9d, 0xed, 0x06, 0x0a, 0x10, 0xf0, + 0x7f, 0xfc, 0xff, 0xee, 0x00, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0x84, 0xed, + 0x0d, 0x0a, 0x30, 0x79, 0x00, 0x28, 0x04, 0xbf, 0x71, 0x79, 0x01, 0x29, + 0x9d, 0xd1, 0x21, 0x69, 0x30, 0x68, 0x10, 0xf0, 0xb9, 0xfa, 0x03, 0x46, + 0x30, 0x68, 0x04, 0xf1, 0x34, 0x02, 0x04, 0xf1, 0x2c, 0x01, 0x10, 0xf0, + 0xd1, 0xfa, 0x7f, 0x1c, 0xb0, 0x68, 0x87, 0x42, 0x9a, 0xd3, 0x9d, 0xf8, + 0x14, 0x00, 0x0e, 0xb0, 0xbd, 0xe8, 0xf0, 0x8d, 0xf8, 0xb5, 0x02, 0x91, + 0x03, 0x92, 0x41, 0x69, 0x01, 0x91, 0x01, 0x21, 0x90, 0xf8, 0x20, 0x20, + 0x00, 0x92, 0x43, 0x79, 0x02, 0x79, 0x00, 0x68, 0x10, 0xf0, 0x66, 0xf9, + 0x05, 0xb0, 0x00, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, 0x0a, 0x9c, 0x81, 0x46, + 0x00, 0x2c, 0x1c, 0xbf, 0x09, 0x98, 0x00, 0x28, 0x0d, 0x46, 0x90, 0x46, + 0x1e, 0x46, 0x00, 0xf0, 0xc1, 0x80, 0x08, 0x9f, 0x20, 0x63, 0xa5, 0x22, + 0x4f, 0xea, 0x88, 0x01, 0xe3, 0xf7, 0x6c, 0xfa, 0x21, 0x6b, 0x01, 0xeb, + 0x88, 0x00, 0x00, 0x1f, 0x4f, 0xea, 0xd0, 0x08, 0x00, 0x21, 0x04, 0xf1, + 0x34, 0x02, 0x2b, 0x78, 0x13, 0x70, 0x28, 0x78, 0x80, 0xb1, 0x6b, 0x78, + 0x53, 0x70, 0x68, 0x78, 0x60, 0xb1, 0xab, 0x78, 0x93, 0x70, 0xa8, 0x78, + 0x40, 0xb1, 0xeb, 0x78, 0xd3, 0x70, 0xe8, 0x78, 0x20, 0xb1, 0x09, 0x1d, + 0x12, 0x1d, 0x2d, 0x1d, 0x10, 0x29, 0xea, 0xd3, 0x00, 0x20, 0x06, 0x2f, + 0x88, 0xbf, 0x06, 0x27, 0x04, 0xf1, 0x44, 0x05, 0x84, 0xf8, 0x43, 0x00, + 0xe7, 0x62, 0xaf, 0x60, 0xe8, 0x60, 0xc7, 0xf1, 0x07, 0x07, 0x20, 0x1d, + 0x00, 0x21, 0x01, 0x61, 0x04, 0xf1, 0x18, 0x00, 0x00, 0x21, 0x01, 0x61, + 0x24, 0x61, 0xa7, 0x61, 0x64, 0x62, 0x00, 0x20, 0x28, 0x62, 0x00, 0x21, + 0x29, 0x61, 0x68, 0x61, 0xa9, 0x61, 0xe8, 0x61, 0x69, 0x62, 0x04, 0xf1, + 0x6c, 0x00, 0x32, 0x46, 0x01, 0x70, 0x41, 0x70, 0x4f, 0xea, 0xc8, 0x00, + 0x49, 0x46, 0x11, 0xf0, 0x95, 0xfb, 0x20, 0x60, 0x11, 0xf0, 0xc8, 0xfb, + 0xdf, 0xf8, 0x9c, 0x68, 0xf0, 0x6c, 0x40, 0x1c, 0xf0, 0x64, 0xa1, 0x46, + 0xb0, 0x6a, 0xc8, 0xbb, 0xb4, 0x62, 0xf0, 0x6c, 0x01, 0x28, 0x3d, 0xd1, + 0xdf, 0xf8, 0xa0, 0x78, 0x38, 0x46, 0x11, 0xf0, 0xfd, 0xfb, 0x07, 0xf1, + 0x14, 0x00, 0x11, 0xf0, 0xf9, 0xfb, 0x07, 0xf1, 0x28, 0x00, 0x11, 0xf0, + 0xf5, 0xfb, 0x07, 0xf1, 0x3c, 0x00, 0x11, 0xf0, 0xf1, 0xfb, 0x07, 0xf1, + 0x50, 0x00, 0x11, 0xf0, 0xed, 0xfb, 0x07, 0xf1, 0x64, 0x00, 0x11, 0xf0, + 0xe9, 0xfb, 0x07, 0xf1, 0x78, 0x00, 0x11, 0xf0, 0xe5, 0xfb, 0x06, 0xf1, + 0x7c, 0x00, 0x11, 0xf0, 0xe1, 0xfb, 0x06, 0xf1, 0x90, 0x07, 0x38, 0x46, + 0x11, 0xf0, 0xdc, 0xfb, 0x30, 0x46, 0x11, 0xf0, 0xd9, 0xfb, 0x06, 0xf1, + 0x14, 0x00, 0x11, 0xf0, 0xd5, 0xfb, 0x06, 0xf1, 0x38, 0x00, 0x11, 0xf0, + 0xd1, 0xfb, 0x06, 0xf1, 0x7c, 0x00, 0xf0, 0x62, 0x37, 0x63, 0x07, 0xe0, + 0xb0, 0x6d, 0x28, 0xb9, 0xe0, 0x6a, 0xb1, 0x6a, 0xca, 0x6a, 0x90, 0x42, + 0x28, 0xbf, 0xb4, 0x62, 0xb0, 0x6e, 0xdf, 0xf8, 0x24, 0x38, 0x40, 0x1c, + 0xb0, 0x66, 0x28, 0x60, 0x01, 0x22, 0xe0, 0x6a, 0x71, 0x6d, 0x82, 0x40, + 0x11, 0x43, 0x71, 0x65, 0x00, 0xeb, 0x80, 0x02, 0x21, 0x1d, 0x03, 0xeb, + 0x82, 0x00, 0x11, 0xf0, 0xbe, 0xfb, 0x11, 0xf0, 0x75, 0xfb, 0xb0, 0x6d, + 0x80, 0xb1, 0xb0, 0x6a, 0xc1, 0x6a, 0xe0, 0x6a, 0x81, 0x42, 0x0b, 0xd2, + 0xdf, 0xf8, 0xf0, 0x27, 0x4f, 0xf0, 0x80, 0x51, 0x11, 0x60, 0xbf, 0xf3, + 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x01, 0xe0, 0x4f, 0xf0, 0x00, 0x09, + 0x48, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0x70, 0xb5, 0x04, 0x00, 0x2b, 0xd0, + 0xdf, 0xf8, 0xac, 0x57, 0x68, 0x6f, 0x40, 0x1c, 0x68, 0x67, 0x00, 0x20, + 0x2e, 0x6d, 0xa9, 0x6a, 0x81, 0xf8, 0x6d, 0x00, 0xaa, 0x6a, 0x10, 0x1d, + 0x11, 0xf0, 0xbd, 0xfb, 0x30, 0xb9, 0xa8, 0x6a, 0x69, 0x6d, 0xc0, 0x6a, + 0x01, 0x22, 0x82, 0x40, 0x91, 0x43, 0x69, 0x65, 0xa4, 0x19, 0xa8, 0x6a, + 0x44, 0x60, 0xb4, 0x42, 0xa8, 0x6a, 0x04, 0xd2, 0x01, 0x1d, 0x28, 0x6b, + 0x11, 0xf0, 0x91, 0xfb, 0x07, 0xe0, 0x01, 0x1d, 0xe8, 0x6a, 0x11, 0xf0, + 0x8c, 0xfb, 0xe8, 0x6e, 0x84, 0x42, 0x38, 0xbf, 0xec, 0x66, 0x00, 0xf0, + 0x47, 0xf9, 0x40, 0xb9, 0xdf, 0xf8, 0x74, 0x17, 0x4f, 0xf0, 0x80, 0x50, + 0x08, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x70, 0xbd, + 0x2d, 0xe9, 0xf0, 0x41, 0xdf, 0xf8, 0x3c, 0x67, 0x05, 0x46, 0xb0, 0x6a, + 0x85, 0x42, 0x08, 0xbf, 0x00, 0x20, 0x21, 0xd0, 0x11, 0xf0, 0x0e, 0xfb, + 0x6c, 0x69, 0xd6, 0xf8, 0x2c, 0x80, 0x37, 0x6b, 0x11, 0xf0, 0x14, 0xfb, + 0x44, 0x45, 0x18, 0xbf, 0xbc, 0x42, 0x0b, 0xd0, 0x06, 0xf1, 0x38, 0x01, + 0x8c, 0x42, 0x0a, 0xd1, 0xa8, 0x6a, 0x28, 0xb9, 0x95, 0xf8, 0x6c, 0x00, + 0x01, 0x28, 0x18, 0xbf, 0x03, 0x20, 0x09, 0xd1, 0x02, 0x20, 0xbd, 0xe8, + 0xf0, 0x81, 0x06, 0xf1, 0x14, 0x00, 0x84, 0x42, 0x16, 0xbf, 0x00, 0x2c, + 0x04, 0x20, 0x01, 0x20, 0xbd, 0xe8, 0xf0, 0x81, 0x38, 0xb5, 0x04, 0x46, + 0x11, 0xf0, 0xe8, 0xfa, 0xdf, 0xf8, 0xdc, 0x56, 0x04, 0xb9, 0xac, 0x6a, + 0x20, 0x1d, 0x11, 0xf0, 0x5c, 0xfb, 0x70, 0xb9, 0xe1, 0x6a, 0xdf, 0xf8, + 0xe8, 0x26, 0x01, 0xeb, 0x81, 0x03, 0x9b, 0x00, 0xd0, 0x58, 0x30, 0xb9, + 0x68, 0x6d, 0x01, 0x22, 0x02, 0xfa, 0x01, 0xf1, 0x20, 0xea, 0x01, 0x01, + 0x69, 0x65, 0xa0, 0x6a, 0x18, 0xb1, 0x04, 0xf1, 0x18, 0x00, 0x11, 0xf0, + 0x46, 0xfb, 0x21, 0x1d, 0x05, 0xf1, 0x38, 0x00, 0x11, 0xf0, 0x19, 0xfb, + 0x94, 0xf8, 0x6c, 0x00, 0x01, 0x28, 0x04, 0xbf, 0x00, 0x21, 0x84, 0xf8, + 0x6c, 0x10, 0x11, 0xf0, 0xc9, 0xfa, 0xa8, 0x6d, 0x28, 0xb1, 0x11, 0xf0, + 0xb9, 0xfa, 0x00, 0xf0, 0x51, 0xfb, 0x11, 0xf0, 0xc1, 0xfa, 0xa9, 0x6a, + 0x8c, 0x42, 0x15, 0xd1, 0xa8, 0x6d, 0x48, 0xb1, 0xdf, 0xf8, 0x8c, 0x06, + 0x4f, 0xf0, 0x80, 0x51, 0x01, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, + 0x6f, 0x8f, 0x31, 0xbd, 0xa8, 0x6b, 0xe9, 0x6c, 0x88, 0x42, 0x02, 0xd1, + 0x00, 0x20, 0xa8, 0x62, 0x31, 0xbd, 0xbd, 0xe8, 0x31, 0x40, 0xa7, 0xe1, + 0x31, 0xbd, 0x01, 0x46, 0xdf, 0xf8, 0x40, 0x26, 0x4b, 0x69, 0x00, 0x20, + 0x02, 0xf1, 0x38, 0x0c, 0x63, 0x45, 0x04, 0xd1, 0x89, 0x6a, 0x91, 0x42, + 0x01, 0xd0, 0x01, 0xb9, 0x01, 0x20, 0x70, 0x47, 0x38, 0xb5, 0xdf, 0xf8, + 0x24, 0x56, 0x04, 0x46, 0xa8, 0x6a, 0x84, 0x42, 0x18, 0xbf, 0x00, 0x2c, + 0x29, 0xd0, 0x11, 0xf0, 0x81, 0xfa, 0x20, 0x46, 0xff, 0xf7, 0xe3, 0xff, + 0xf8, 0xb1, 0x20, 0x1d, 0x11, 0xf0, 0xf5, 0xfa, 0xe0, 0x6a, 0x69, 0x6d, + 0xdf, 0xf8, 0x18, 0x36, 0x01, 0x22, 0x82, 0x40, 0x11, 0x43, 0x69, 0x65, + 0x00, 0xeb, 0x80, 0x02, 0x21, 0x1d, 0x03, 0xeb, 0x82, 0x00, 0x11, 0xf0, + 0xbe, 0xfa, 0xe0, 0x6a, 0xa9, 0x6a, 0xca, 0x6a, 0x90, 0x42, 0x08, 0xd3, + 0xdf, 0xf8, 0xf8, 0x15, 0x4f, 0xf0, 0x80, 0x50, 0x08, 0x60, 0xbf, 0xf3, + 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0xbd, 0xe8, 0x31, 0x40, 0x11, 0xf0, + 0x65, 0xba, 0x31, 0xbd, 0xf8, 0xb5, 0x04, 0x46, 0x00, 0x25, 0xef, 0xf3, + 0x11, 0x86, 0x30, 0x20, 0x80, 0xf3, 0x11, 0x88, 0xbf, 0xf3, 0x4f, 0x8f, + 0xbf, 0xf3, 0x6f, 0x8f, 0x20, 0x46, 0xff, 0xf7, 0xae, 0xff, 0xf8, 0xb1, + 0xdf, 0xf8, 0x9c, 0x75, 0x78, 0x6f, 0xb0, 0xb9, 0xe0, 0x6a, 0xb9, 0x6a, + 0xca, 0x6a, 0x90, 0x42, 0x28, 0xbf, 0x01, 0x25, 0x20, 0x1d, 0x11, 0xf0, + 0xb6, 0xfa, 0xe0, 0x6a, 0x79, 0x6d, 0xdf, 0xf8, 0x9c, 0x35, 0x01, 0x22, + 0x82, 0x40, 0x11, 0x43, 0x79, 0x65, 0x00, 0xeb, 0x80, 0x02, 0x21, 0x1d, + 0x03, 0xeb, 0x82, 0x00, 0x02, 0xe0, 0x04, 0xf1, 0x18, 0x01, 0x38, 0x46, + 0x11, 0xf0, 0x7b, 0xfa, 0x86, 0xf3, 0x11, 0x88, 0x28, 0x46, 0xf2, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x86, 0xb0, 0x00, 0x21, 0x05, 0x91, + 0x04, 0x91, 0x03, 0xaa, 0x04, 0xa9, 0x05, 0xa8, 0x11, 0xf0, 0xb3, 0xfa, + 0x05, 0x98, 0x04, 0x99, 0xdf, 0xf8, 0x38, 0x45, 0x02, 0x90, 0x00, 0x22, + 0x00, 0x92, 0x01, 0x91, 0x00, 0x23, 0x03, 0x9a, 0x12, 0xa1, 0x0f, 0xf2, + 0xc9, 0x40, 0xff, 0xf7, 0xe3, 0xfd, 0x20, 0x67, 0xd8, 0xb1, 0x00, 0xf0, + 0xef, 0xfb, 0x01, 0x28, 0x17, 0xd1, 0x30, 0x20, 0x80, 0xf3, 0x11, 0x88, + 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x4f, 0xf0, 0xff, 0x31, + 0xe1, 0x66, 0x01, 0x20, 0xa0, 0x65, 0x00, 0x21, 0x21, 0x65, 0xfc, 0xf7, + 0xf8, 0xf9, 0xa0, 0x6a, 0xc1, 0x6a, 0xa0, 0x6a, 0x40, 0x6d, 0x11, 0xf0, + 0x7d, 0xfa, 0x11, 0xf0, 0xd1, 0xf9, 0x06, 0xb0, 0x10, 0xbd, 0x00, 0x00, + 0x49, 0x44, 0x4c, 0x45, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0xd4, 0x04, + 0x41, 0x6f, 0x49, 0x1c, 0x41, 0x67, 0x70, 0x47, 0x70, 0xb5, 0x11, 0xf0, + 0xdb, 0xf9, 0xdf, 0xf8, 0xc4, 0x64, 0x70, 0x6f, 0x40, 0x1e, 0x70, 0x67, + 0x00, 0x24, 0x70, 0x6f, 0x00, 0x25, 0x00, 0x28, 0x3d, 0xd1, 0xf0, 0x6c, + 0xf8, 0xb9, 0x3a, 0xe0, 0xf0, 0x68, 0xc4, 0x68, 0x04, 0xf1, 0x18, 0x00, + 0x11, 0xf0, 0x43, 0xfa, 0x20, 0x1d, 0x11, 0xf0, 0x40, 0xfa, 0xe0, 0x6a, + 0x71, 0x6d, 0xdf, 0xf8, 0xb0, 0x34, 0x01, 0x22, 0x82, 0x40, 0x11, 0x43, + 0x71, 0x65, 0x00, 0xeb, 0x80, 0x02, 0x21, 0x1d, 0x03, 0xeb, 0x82, 0x00, + 0x11, 0xf0, 0x09, 0xfa, 0xe0, 0x6a, 0xb1, 0x6a, 0xca, 0x6a, 0x90, 0x42, + 0x24, 0xbf, 0x01, 0x21, 0x31, 0x66, 0x30, 0x68, 0x00, 0x28, 0xdd, 0xd1, + 0x0c, 0xb1, 0x00, 0xf0, 0x43, 0xfa, 0xf4, 0x6d, 0x3c, 0xb1, 0x00, 0xf0, + 0x56, 0xf8, 0x08, 0xb1, 0x01, 0x20, 0x30, 0x66, 0x64, 0x1e, 0xf8, 0xd1, + 0xf5, 0x65, 0x30, 0x6e, 0x48, 0xb1, 0xdf, 0xf8, 0x68, 0x14, 0x4f, 0xf0, + 0x80, 0x50, 0x01, 0x25, 0x08, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, + 0x6f, 0x8f, 0x11, 0xf0, 0x9d, 0xf9, 0x28, 0x46, 0x70, 0xbd, 0x00, 0xe0, + 0x00, 0x00, 0xdf, 0xf8, 0x28, 0x04, 0x00, 0x6d, 0x70, 0x47, 0xdf, 0xf8, + 0x9c, 0x06, 0x00, 0x6f, 0x70, 0x47, 0x70, 0xb5, 0xdf, 0xf8, 0x14, 0x54, + 0x69, 0x6f, 0x49, 0x1c, 0x69, 0x67, 0x04, 0x46, 0xff, 0xf7, 0x62, 0xfe, + 0x02, 0x28, 0x25, 0xd1, 0x20, 0x1d, 0x11, 0xf0, 0xf2, 0xf9, 0x11, 0xf0, + 0x75, 0xf9, 0xa0, 0x6a, 0x01, 0x26, 0x28, 0xb1, 0x04, 0xf1, 0x18, 0x00, + 0x11, 0xf0, 0xe9, 0xf9, 0x84, 0xf8, 0x6d, 0x60, 0x11, 0xf0, 0x76, 0xf9, + 0xe0, 0x6a, 0x69, 0x6d, 0xdf, 0xf8, 0xf8, 0x33, 0x06, 0xfa, 0x00, 0xf2, + 0x11, 0x43, 0x69, 0x65, 0x00, 0xeb, 0x80, 0x02, 0x21, 0x1d, 0x03, 0xeb, + 0x82, 0x00, 0x11, 0xf0, 0xae, 0xf9, 0xa8, 0x6a, 0xc1, 0x6a, 0xe0, 0x6a, + 0x81, 0x42, 0x02, 0xd2, 0x2e, 0x66, 0x00, 0xe0, 0x00, 0x26, 0xff, 0xf7, + 0x73, 0xff, 0x30, 0x46, 0x70, 0xbd, 0xf8, 0xb5, 0xdf, 0xf8, 0xa8, 0x73, + 0x78, 0x6f, 0x00, 0x26, 0x00, 0x28, 0x49, 0xd1, 0x3c, 0x6d, 0x64, 0x1c, + 0x3c, 0x65, 0x08, 0xd1, 0xf8, 0x6a, 0x39, 0x6b, 0xf9, 0x62, 0x38, 0x63, + 0x78, 0x6e, 0x40, 0x1c, 0x78, 0x66, 0x00, 0xf0, 0xd5, 0xf9, 0xf8, 0x6e, + 0x84, 0x42, 0x2b, 0xd3, 0x1d, 0xe0, 0x28, 0x1d, 0x11, 0xf0, 0xaf, 0xf9, + 0xa8, 0x6a, 0x18, 0xb1, 0x05, 0xf1, 0x18, 0x00, 0x11, 0xf0, 0xa9, 0xf9, + 0xe8, 0x6a, 0x79, 0x6d, 0xdf, 0xf8, 0x80, 0x33, 0x01, 0x22, 0x82, 0x40, + 0x11, 0x43, 0x79, 0x65, 0x00, 0xeb, 0x80, 0x02, 0x29, 0x1d, 0x03, 0xeb, + 0x82, 0x00, 0x11, 0xf0, 0x72, 0xf9, 0xe8, 0x6a, 0xb9, 0x6a, 0xca, 0x6a, + 0x90, 0x42, 0x28, 0xbf, 0x01, 0x26, 0xf8, 0x6a, 0x00, 0x68, 0x30, 0xb1, + 0xf8, 0x6a, 0xc1, 0x68, 0xcd, 0x68, 0x68, 0x68, 0x84, 0x42, 0xd8, 0xd2, + 0x01, 0xe0, 0x4f, 0xf0, 0xff, 0x30, 0xf8, 0x66, 0xb8, 0x6a, 0xdf, 0xf8, + 0x40, 0x13, 0xc0, 0x6a, 0x00, 0xeb, 0x80, 0x02, 0x92, 0x00, 0x89, 0x58, + 0xf8, 0x6d, 0x02, 0x29, 0x28, 0xbf, 0x01, 0x26, 0x28, 0xb9, 0x02, 0xe0, + 0xf8, 0x6d, 0x40, 0x1c, 0xf8, 0x65, 0x11, 0xf0, 0x93, 0xf9, 0x38, 0x6e, + 0x00, 0xb1, 0x01, 0x26, 0x30, 0x46, 0xf2, 0xbd, 0x10, 0xb5, 0xbd, 0x4c, + 0x60, 0x6f, 0x10, 0xb1, 0x01, 0x21, 0x21, 0x66, 0x10, 0xbd, 0x20, 0x66, + 0xa0, 0x6a, 0xc1, 0x6a, 0xa2, 0x6a, 0x50, 0x6d, 0x11, 0xf0, 0x74, 0xf9, + 0xfc, 0xf7, 0x0f, 0xf9, 0xa1, 0x6f, 0x81, 0x42, 0x04, 0xd2, 0xa2, 0x6a, + 0x53, 0x6e, 0xc3, 0x18, 0x59, 0x1a, 0x51, 0x66, 0xa0, 0x67, 0xa0, 0x6a, + 0x00, 0x6b, 0xa1, 0x6a, 0x0a, 0x68, 0x90, 0x42, 0x05, 0xd3, 0xa0, 0x6a, + 0x00, 0xf1, 0x34, 0x01, 0xa0, 0x6a, 0x11, 0xf0, 0x66, 0xf9, 0x61, 0x6d, + 0xb1, 0x48, 0xb1, 0xfa, 0x81, 0xf1, 0x49, 0x42, 0x01, 0xeb, 0x81, 0x02, + 0x00, 0xeb, 0x82, 0x00, 0x00, 0xf5, 0x1b, 0x70, 0x00, 0xf1, 0x08, 0x02, + 0x41, 0x68, 0x49, 0x68, 0x41, 0x60, 0x91, 0x42, 0x04, 0xbf, 0x49, 0x68, + 0x41, 0x60, 0x40, 0x68, 0xc1, 0x68, 0xa1, 0x62, 0xa0, 0x6a, 0xc1, 0x6a, + 0xa0, 0x6a, 0x40, 0x6d, 0xbd, 0xe8, 0x10, 0x40, 0x11, 0xf0, 0x40, 0xb9, + 0x70, 0xb5, 0xdf, 0xf8, 0xe8, 0x44, 0xa2, 0x6a, 0x0d, 0x46, 0x02, 0xf1, + 0x18, 0x01, 0x11, 0xf0, 0x08, 0xf9, 0x26, 0x6d, 0xa1, 0x6a, 0x00, 0x20, + 0x81, 0xf8, 0x6d, 0x00, 0xa0, 0x6a, 0x00, 0x1d, 0x11, 0xf0, 0x19, 0xf9, + 0x30, 0xb9, 0xa0, 0x6a, 0x61, 0x6d, 0xc0, 0x6a, 0x01, 0x22, 0x82, 0x40, + 0x91, 0x43, 0x61, 0x65, 0x15, 0xf1, 0x01, 0x0f, 0x00, 0xd1, 0x41, 0xe0, + 0xa0, 0x6a, 0xad, 0x19, 0x45, 0x60, 0xb5, 0x42, 0xa0, 0x6a, 0x00, 0xd2, + 0x42, 0xe0, 0x01, 0x1d, 0xe0, 0x6a, 0x11, 0xf0, 0xe8, 0xf8, 0xe0, 0x6e, + 0x85, 0x42, 0x38, 0xbf, 0xe5, 0x66, 0x70, 0xbd, 0x70, 0xb5, 0xdf, 0xf8, + 0x8c, 0x44, 0x15, 0x46, 0xa2, 0x6a, 0x41, 0xf0, 0x00, 0x41, 0x91, 0x61, + 0xa3, 0x6a, 0x03, 0xf1, 0x18, 0x01, 0x11, 0xf0, 0xc8, 0xf8, 0x26, 0x6d, + 0xa1, 0x6a, 0x00, 0x20, 0x81, 0xf8, 0x6d, 0x00, 0xa0, 0x6a, 0x00, 0x1d, + 0x11, 0xf0, 0xe7, 0xf8, 0x30, 0xb9, 0xa0, 0x6a, 0x61, 0x6d, 0xc0, 0x6a, + 0x01, 0x22, 0x82, 0x40, 0x91, 0x43, 0x61, 0x65, 0x15, 0xf1, 0x01, 0x0f, + 0x00, 0xd1, 0x0f, 0xe0, 0xa0, 0x6a, 0xad, 0x19, 0x45, 0x60, 0xb5, 0x42, + 0xa0, 0x6a, 0x00, 0xd2, 0x10, 0xe0, 0x01, 0x1d, 0xe0, 0x6a, 0x11, 0xf0, + 0xb6, 0xf8, 0xe0, 0x6e, 0x85, 0x42, 0x38, 0xbf, 0xe5, 0x66, 0x70, 0xbd, + 0xa0, 0x6a, 0x01, 0x1d, 0x04, 0xf1, 0x38, 0x00, 0xbd, 0xe8, 0x70, 0x40, + 0x11, 0xf0, 0x9b, 0xb8, 0x01, 0x1d, 0x20, 0x6b, 0xbd, 0xe8, 0x70, 0x40, + 0x11, 0xf0, 0xa3, 0xb8, 0x38, 0xb5, 0x14, 0x46, 0x63, 0x4a, 0x93, 0x6a, + 0x0d, 0x46, 0x03, 0xf1, 0x18, 0x01, 0x11, 0xf0, 0x8c, 0xf8, 0x0c, 0xb1, + 0x4f, 0xf0, 0xff, 0x35, 0x21, 0x46, 0x28, 0x46, 0xbd, 0xe8, 0x34, 0x40, + 0x00, 0xf0, 0xbf, 0xb9, 0x38, 0xb5, 0xc1, 0x68, 0x5a, 0x4c, 0xcd, 0x68, + 0x05, 0xf1, 0x18, 0x00, 0x11, 0xf0, 0xa3, 0xf8, 0x60, 0x6f, 0x80, 0xb9, + 0x28, 0x1d, 0x11, 0xf0, 0x9e, 0xf8, 0xe8, 0x6a, 0x61, 0x6d, 0xdf, 0xf8, + 0xd0, 0x33, 0x01, 0x22, 0x82, 0x40, 0x11, 0x43, 0x61, 0x65, 0x00, 0xeb, + 0x80, 0x02, 0x29, 0x1d, 0x03, 0xeb, 0x82, 0x00, 0x02, 0xe0, 0x05, 0xf1, + 0x18, 0x01, 0x20, 0x46, 0x11, 0xf0, 0x63, 0xf8, 0xa0, 0x6a, 0xc1, 0x6a, + 0xe8, 0x6a, 0x81, 0x42, 0x02, 0xd2, 0x01, 0x20, 0x20, 0x66, 0x32, 0xbd, + 0x00, 0x20, 0x32, 0xbd, 0x38, 0xb5, 0x41, 0xf0, 0x00, 0x41, 0x01, 0x60, + 0xc4, 0x68, 0x44, 0x4d, 0x11, 0xf0, 0x79, 0xf8, 0x20, 0x1d, 0x11, 0xf0, + 0x76, 0xf8, 0xe0, 0x6a, 0x69, 0x6d, 0xdf, 0xf8, 0x80, 0x33, 0x01, 0x22, + 0x82, 0x40, 0x11, 0x43, 0x69, 0x65, 0x00, 0xeb, 0x80, 0x02, 0x21, 0x1d, + 0x03, 0xeb, 0x82, 0x00, 0x11, 0xf0, 0x3f, 0xf8, 0xa8, 0x6a, 0xc1, 0x6a, + 0xe0, 0x6a, 0x81, 0x42, 0x3c, 0xbf, 0x01, 0x21, 0x29, 0x66, 0x31, 0xbd, + 0xdf, 0xf8, 0x50, 0x13, 0x4a, 0x6e, 0x02, 0x60, 0x09, 0x6d, 0x41, 0x60, + 0x70, 0x47, 0xf8, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x10, 0xf0, 0xd8, 0xff, + 0xdf, 0xf8, 0x38, 0x13, 0x0a, 0x6d, 0x63, 0x68, 0x8f, 0x6a, 0x97, 0xf8, + 0x6d, 0x00, 0xd6, 0x1a, 0x20, 0xb1, 0x88, 0x6a, 0x00, 0x22, 0x80, 0xf8, + 0x6d, 0x20, 0x16, 0xe0, 0x28, 0x68, 0x10, 0xf1, 0x01, 0x0f, 0x0e, 0xd0, + 0x4f, 0x6e, 0xd4, 0xf8, 0x00, 0xc0, 0x67, 0x45, 0x01, 0xd0, 0x9a, 0x42, + 0x0b, 0xd2, 0x86, 0x42, 0x07, 0xd2, 0x86, 0x1b, 0x2e, 0x60, 0x48, 0x6e, + 0x20, 0x60, 0x09, 0x6d, 0x61, 0x60, 0x00, 0x24, 0x02, 0xe0, 0x00, 0x20, + 0x28, 0x60, 0x01, 0x24, 0x10, 0xf0, 0xbc, 0xff, 0x20, 0x46, 0xf2, 0xbd, + 0xdf, 0xf8, 0xe4, 0x12, 0x01, 0x20, 0x08, 0x66, 0x70, 0x47, 0x00, 0x00, + 0xf8, 0xb5, 0x1f, 0x4c, 0x1d, 0x4e, 0xdf, 0xf8, 0xd4, 0x72, 0x4f, 0xf0, + 0x80, 0x55, 0x0e, 0xe0, 0x10, 0xf0, 0x9e, 0xff, 0x38, 0x6a, 0xc1, 0x68, + 0x08, 0x1d, 0x11, 0xf0, 0x14, 0xf8, 0xf8, 0x6c, 0x40, 0x1e, 0xf8, 0x64, + 0x78, 0x6b, 0x40, 0x1e, 0x78, 0x63, 0x10, 0xf0, 0x9d, 0xff, 0x78, 0x6b, + 0x00, 0x28, 0xed, 0xd1, 0x31, 0x68, 0x02, 0x29, 0x04, 0xd3, 0x25, 0x60, + 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x11, 0xf0, 0x19, 0xf8, + 0xf1, 0xe7, 0x04, 0x29, 0x06, 0xda, 0x10, 0xb9, 0xdf, 0xf8, 0x88, 0x02, + 0x80, 0x6a, 0x00, 0xeb, 0x81, 0x00, 0x42, 0x65, 0x70, 0x47, 0x00, 0x00, + 0x40, 0x66, 0x02, 0x20, 0x02, 0x46, 0x00, 0x20, 0x04, 0x29, 0x06, 0xda, + 0x12, 0xb9, 0xdf, 0xf8, 0x6c, 0x02, 0x82, 0x6a, 0x02, 0xeb, 0x81, 0x00, + 0x40, 0x6d, 0x70, 0x47, 0x40, 0x69, 0x02, 0x20, 0x04, 0xed, 0x00, 0xe0, + 0xdf, 0xf8, 0x54, 0x12, 0xc8, 0x6a, 0x00, 0x68, 0x10, 0xb9, 0x4f, 0xf0, + 0xff, 0x32, 0x03, 0xe0, 0xc8, 0x6a, 0xc2, 0x68, 0xd0, 0x68, 0x42, 0x68, + 0xca, 0x66, 0x70, 0x47, 0xdf, 0xf8, 0x38, 0x02, 0x80, 0x6a, 0x70, 0x47, + 0xdf, 0xf8, 0x30, 0x12, 0x88, 0x6d, 0x08, 0xb9, 0x01, 0x20, 0x70, 0x47, + 0x48, 0x6f, 0x08, 0xb9, 0x02, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, + 0x70, 0xb5, 0x04, 0x46, 0x00, 0x20, 0x00, 0x2c, 0x42, 0xd0, 0xe1, 0x6a, + 0xdf, 0xf8, 0x0c, 0x52, 0xaa, 0x6a, 0xd3, 0x6a, 0x99, 0x42, 0x35, 0xd2, + 0xa0, 0x69, 0x00, 0x28, 0x04, 0xd4, 0xa8, 0x6a, 0xc2, 0x6a, 0xc2, 0xf1, + 0x07, 0x02, 0xa2, 0x61, 0x01, 0xeb, 0x81, 0x03, 0xdf, 0xf8, 0xf0, 0x61, + 0x62, 0x69, 0x06, 0xeb, 0x83, 0x01, 0x8a, 0x42, 0x20, 0xd1, 0x20, 0x1d, + 0x10, 0xf0, 0xa3, 0xff, 0x60, 0xb9, 0xe1, 0x6a, 0x01, 0xeb, 0x81, 0x02, + 0x92, 0x00, 0xb0, 0x58, 0x30, 0xb9, 0x68, 0x6d, 0x01, 0x22, 0x02, 0xfa, + 0x01, 0xf1, 0x20, 0xea, 0x01, 0x01, 0x69, 0x65, 0x01, 0x22, 0xa8, 0x6a, + 0xc0, 0x6a, 0xe0, 0x62, 0x82, 0x40, 0x69, 0x6d, 0x11, 0x43, 0x69, 0x65, + 0x00, 0xeb, 0x80, 0x03, 0x21, 0x1d, 0x06, 0xeb, 0x83, 0x00, 0x10, 0xf0, + 0x5e, 0xff, 0x08, 0xe0, 0xa8, 0x6a, 0xc1, 0x6a, 0xe1, 0x62, 0x04, 0xe0, + 0xe1, 0x6c, 0xaa, 0x6a, 0xd3, 0x6a, 0x99, 0x42, 0x00, 0xd2, 0x01, 0x20, + 0x70, 0xbd, 0x38, 0xb5, 0x04, 0x46, 0x00, 0x21, 0x84, 0xb3, 0x20, 0x6d, + 0xe2, 0x6a, 0xe3, 0x6c, 0x40, 0x1e, 0x9a, 0x42, 0x20, 0x65, 0x29, 0xd0, + 0x40, 0xbb, 0x20, 0x1d, 0x10, 0xf0, 0x6b, 0xff, 0xdf, 0xf8, 0x6c, 0x51, + 0x70, 0xb9, 0xe1, 0x6a, 0x01, 0xeb, 0x81, 0x02, 0x92, 0x00, 0xa8, 0x58, + 0x40, 0xb9, 0xdf, 0xf8, 0x58, 0x01, 0x42, 0x6d, 0x01, 0x23, 0x03, 0xfa, + 0x01, 0xf1, 0x22, 0xea, 0x01, 0x01, 0x41, 0x65, 0x01, 0x23, 0xe2, 0x6c, + 0xe2, 0x62, 0xc2, 0xf1, 0x07, 0x00, 0xa0, 0x61, 0x93, 0x40, 0xdf, 0xf8, + 0x38, 0x01, 0x41, 0x6d, 0x19, 0x43, 0x41, 0x65, 0x02, 0xeb, 0x82, 0x00, + 0x21, 0x1d, 0x05, 0xeb, 0x80, 0x00, 0x10, 0xf0, 0x1e, 0xff, 0x01, 0x21, + 0x08, 0x46, 0x32, 0xbd, 0x38, 0xb5, 0x04, 0x00, 0x3d, 0xd0, 0xe0, 0x6c, + 0x81, 0x42, 0x38, 0xbf, 0x01, 0x46, 0xe0, 0x6a, 0x88, 0x42, 0x36, 0xd0, + 0x22, 0x6d, 0x01, 0x2a, 0x33, 0xd1, 0xa2, 0x69, 0xdf, 0xf8, 0x00, 0x51, + 0xe1, 0x62, 0x00, 0x2a, 0x5c, 0xbf, 0xc1, 0xf1, 0x07, 0x01, 0xa1, 0x61, + 0x61, 0x69, 0x00, 0xeb, 0x80, 0x02, 0x05, 0xeb, 0x82, 0x02, 0x91, 0x42, + 0x23, 0xd1, 0x20, 0x1d, 0x10, 0xf0, 0x23, 0xff, 0x70, 0xb9, 0xe1, 0x6a, + 0x01, 0xeb, 0x81, 0x02, 0x92, 0x00, 0xa8, 0x58, 0x40, 0xb9, 0xdf, 0xf8, + 0xcc, 0x00, 0x42, 0x6d, 0x01, 0x23, 0x03, 0xfa, 0x01, 0xf1, 0x22, 0xea, + 0x01, 0x01, 0x41, 0x65, 0xe0, 0x6a, 0xdf, 0xf8, 0xb8, 0x10, 0x4a, 0x6d, + 0x01, 0x23, 0x83, 0x40, 0x1a, 0x43, 0x4a, 0x65, 0x21, 0x1d, 0x00, 0xeb, + 0x80, 0x02, 0x05, 0xeb, 0x82, 0x00, 0xbd, 0xe8, 0x34, 0x40, 0x10, 0xf0, + 0xda, 0xbe, 0x31, 0xbd, 0xdf, 0xf8, 0x94, 0x10, 0x88, 0x6a, 0x80, 0x69, + 0x8a, 0x6a, 0x89, 0x6a, 0xcb, 0x6a, 0xc3, 0xf1, 0x07, 0x03, 0x93, 0x61, + 0x70, 0x47, 0xdf, 0xf8, 0x80, 0x10, 0x88, 0x6a, 0x18, 0xb1, 0x88, 0x6a, + 0x02, 0x6d, 0x52, 0x1c, 0x02, 0x65, 0x88, 0x6a, 0x70, 0x47, 0xf8, 0xb5, + 0x1a, 0x4d, 0x2f, 0x6d, 0x0c, 0x46, 0xa9, 0x6a, 0x06, 0x46, 0x00, 0x20, + 0x81, 0xf8, 0x6d, 0x00, 0xaa, 0x6a, 0x10, 0x1d, 0x10, 0xf0, 0xdf, 0xfe, + 0x30, 0xb9, 0xa8, 0x6a, 0x69, 0x6d, 0xc0, 0x6a, 0x01, 0x22, 0x82, 0x40, + 0x91, 0x43, 0x69, 0x65, 0x16, 0xf1, 0x01, 0x0f, 0x08, 0xd1, 0x3c, 0xb1, + 0xa8, 0x6a, 0x01, 0x1d, 0x05, 0xf1, 0x38, 0x00, 0xbd, 0xe8, 0xf4, 0x40, + 0x10, 0xf0, 0xa3, 0xbe, 0xa8, 0x6a, 0xf6, 0x19, 0x46, 0x60, 0xbe, 0x42, + 0xa8, 0x6a, 0x05, 0xd2, 0x01, 0x1d, 0x28, 0x6b, 0xbd, 0xe8, 0xf4, 0x40, + 0x10, 0xf0, 0xa5, 0xbe, 0x01, 0x1d, 0xe8, 0x6a, 0x10, 0xf0, 0xa1, 0xfe, + 0xe8, 0x6e, 0x86, 0x42, 0x38, 0xbf, 0xee, 0x66, 0xf1, 0xbd, 0x00, 0x00, + 0x40, 0x66, 0x02, 0x20, 0x40, 0x69, 0x02, 0x20, 0xfb, 0xf7, 0xf2, 0xbd, + 0xff, 0xf7, 0xdf, 0xba, 0x70, 0xb5, 0x06, 0x46, 0x05, 0x20, 0xfb, 0xf7, + 0xf8, 0xfc, 0x05, 0x20, 0xfb, 0xf7, 0x32, 0xfd, 0xff, 0xf7, 0x99, 0xfc, + 0x00, 0x25, 0xc6, 0xe9, 0x00, 0x05, 0x61, 0xbd, 0xe0, 0xb5, 0x06, 0x46, + 0x05, 0x20, 0xfb, 0xf7, 0xd1, 0xfd, 0x07, 0x46, 0x05, 0x20, 0xfb, 0xf7, + 0x64, 0xfd, 0xff, 0xf7, 0x8a, 0xfc, 0xc6, 0xe9, 0x00, 0x07, 0xc1, 0xbd, + 0x38, 0xb5, 0x86, 0xb0, 0x00, 0xf0, 0x68, 0xf9, 0xdf, 0xf8, 0x50, 0x53, + 0xa8, 0x68, 0x00, 0x24, 0xb8, 0xb1, 0x05, 0x94, 0x04, 0x94, 0x03, 0xaa, + 0x04, 0xa9, 0x05, 0xa8, 0x10, 0xf0, 0xa8, 0xfe, 0x05, 0x98, 0x04, 0x99, + 0x02, 0x90, 0x06, 0x22, 0x00, 0x92, 0x01, 0x91, 0x00, 0x23, 0x03, 0x9a, + 0x0f, 0xf2, 0x30, 0x31, 0x0f, 0xf2, 0x91, 0x00, 0xff, 0xf7, 0xd2, 0xf9, + 0xe8, 0x60, 0x00, 0xb1, 0x01, 0x24, 0x20, 0x46, 0x07, 0xb0, 0x30, 0xbd, + 0x2d, 0xe9, 0xf8, 0x43, 0x09, 0x9c, 0x05, 0x46, 0x0e, 0x46, 0x91, 0x46, + 0x98, 0x46, 0x64, 0xb1, 0x08, 0x9f, 0x00, 0xf0, 0x3d, 0xf9, 0x25, 0x60, + 0xa6, 0x61, 0xc4, 0xf8, 0x1c, 0x90, 0xc4, 0xf8, 0x20, 0x80, 0x67, 0x62, + 0x20, 0x1d, 0x00, 0x21, 0x01, 0x61, 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x83, + 0xf8, 0xb5, 0xdf, 0xf8, 0xe0, 0x72, 0xbc, 0x68, 0x05, 0x46, 0x84, 0xb0, + 0x1e, 0x46, 0x00, 0x20, 0xc4, 0xb1, 0x06, 0x29, 0x00, 0x91, 0x01, 0x92, + 0x02, 0x95, 0x0d, 0xda, 0xff, 0xf7, 0x76, 0xfe, 0x02, 0x28, 0xb8, 0x68, + 0x07, 0xbf, 0x0a, 0x9a, 0x00, 0x23, 0x00, 0x23, 0x00, 0x22, 0x69, 0x46, + 0x00, 0xf0, 0x5b, 0xfe, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x23, 0x32, 0x46, + 0x69, 0x46, 0x20, 0x46, 0x00, 0xf0, 0xd5, 0xfe, 0x05, 0xb0, 0xf0, 0xbd, + 0xa6, 0x48, 0xc0, 0x68, 0x70, 0x47, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x43, + 0x89, 0xb0, 0xdf, 0xf8, 0x90, 0x82, 0xa2, 0x4f, 0x4f, 0xf0, 0x80, 0x59, + 0x39, 0x68, 0x08, 0x68, 0x10, 0xb9, 0x01, 0x24, 0x00, 0x25, 0x02, 0xe0, + 0xc8, 0x68, 0x05, 0x68, 0x00, 0x24, 0xff, 0xf7, 0xbb, 0xfb, 0x68, 0x46, + 0x00, 0xf0, 0x96, 0xf8, 0x06, 0x46, 0x00, 0x98, 0x00, 0x28, 0x3d, 0xd1, + 0x44, 0xbb, 0xae, 0x42, 0x2b, 0xd3, 0xff, 0xf7, 0xb5, 0xfb, 0x38, 0x68, + 0xc1, 0x68, 0xcc, 0x68, 0x20, 0x1d, 0x10, 0xf0, 0x08, 0xfe, 0xe0, 0x69, + 0x01, 0x28, 0x17, 0xd1, 0xa1, 0x69, 0x2b, 0x46, 0x32, 0x46, 0x49, 0x19, + 0x20, 0x46, 0x00, 0xf0, 0xbe, 0xf8, 0x00, 0x28, 0x1c, 0xbf, 0xb8, 0x68, + 0x00, 0x28, 0x0b, 0xd0, 0x00, 0x21, 0x01, 0x91, 0x02, 0x95, 0x03, 0x94, + 0xff, 0xf7, 0x24, 0xfe, 0xb8, 0x68, 0x00, 0x23, 0x00, 0x22, 0x01, 0xa9, + 0x00, 0xf0, 0x0d, 0xfe, 0x61, 0x6a, 0x20, 0x46, 0x88, 0x47, 0x1e, 0xe0, + 0x78, 0x68, 0x01, 0x68, 0x4c, 0x1e, 0xa4, 0x41, 0xe4, 0x0f, 0xb8, 0x68, + 0x22, 0x46, 0xa9, 0x1b, 0x01, 0xf0, 0xb8, 0xf8, 0xff, 0xf7, 0x84, 0xfb, + 0x88, 0xb9, 0xc8, 0xf8, 0x00, 0x90, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, + 0x6f, 0x8f, 0x0a, 0xe0, 0xff, 0xf7, 0x7a, 0xfb, 0x07, 0xe0, 0x02, 0x99, + 0xa1, 0x61, 0x03, 0x46, 0x02, 0x46, 0x09, 0x18, 0x20, 0x46, 0x00, 0xf0, + 0x8a, 0xf8, 0xb8, 0x68, 0x00, 0x22, 0x01, 0xa9, 0x00, 0xf0, 0xc3, 0xfe, + 0x00, 0x28, 0x9d, 0xd0, 0x01, 0x98, 0x00, 0x28, 0x03, 0xd5, 0x04, 0x99, + 0x03, 0x98, 0x02, 0x9a, 0x90, 0x47, 0x01, 0x98, 0x00, 0x28, 0xee, 0xd4, + 0x03, 0x9c, 0x60, 0x69, 0x10, 0xb1, 0x20, 0x1d, 0x10, 0xf0, 0xb3, 0xfd, + 0x68, 0x46, 0x00, 0xf0, 0x2f, 0xf8, 0x01, 0x99, 0x09, 0x29, 0xe2, 0xd8, + 0xdf, 0xe8, 0x01, 0xf0, 0x07, 0x07, 0x07, 0x05, 0x06, 0x05, 0x07, 0x07, + 0x05, 0x06, 0xda, 0xe7, 0xd1, 0xe7, 0x02, 0x99, 0x02, 0x46, 0xa0, 0x69, + 0x0b, 0x46, 0x41, 0x18, 0x20, 0x46, 0x00, 0xf0, 0x5c, 0xf8, 0x00, 0x28, + 0xcf, 0xd0, 0x61, 0x6a, 0x20, 0x46, 0x88, 0x47, 0xe0, 0x69, 0x01, 0x28, + 0xc9, 0xd1, 0x02, 0x99, 0xa2, 0x69, 0xb8, 0x68, 0x51, 0x18, 0x00, 0x28, + 0xc3, 0xd0, 0x00, 0x22, 0x05, 0x92, 0x06, 0x91, 0x07, 0x94, 0xff, 0xf7, + 0xb9, 0xfd, 0xb8, 0x68, 0x00, 0x23, 0x00, 0x22, 0x05, 0xa9, 0x00, 0xf0, + 0xa2, 0xfd, 0xb6, 0xe7, 0x2d, 0xe9, 0xf0, 0x41, 0x84, 0xb0, 0x04, 0x46, + 0xff, 0xf7, 0x71, 0xfb, 0x4b, 0x4e, 0x80, 0x46, 0x30, 0x69, 0x80, 0x45, + 0x0d, 0xd3, 0x00, 0x21, 0x21, 0x60, 0xc6, 0xf8, 0x10, 0x80, 0x40, 0x46, + 0x04, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, 0x78, 0x60, 0x3f, 0x61, 0x39, 0x1d, + 0x30, 0x68, 0x10, 0xf0, 0x4e, 0xfd, 0x31, 0x68, 0x08, 0x68, 0xf8, 0xb1, + 0xc8, 0x68, 0x05, 0x68, 0xc7, 0x68, 0x38, 0x1d, 0x10, 0xf0, 0x5f, 0xfd, + 0x79, 0x6a, 0x38, 0x46, 0x88, 0x47, 0xf8, 0x69, 0x01, 0x28, 0xf0, 0xd1, + 0xb8, 0x69, 0x40, 0x19, 0x85, 0x42, 0xe6, 0xd3, 0xb0, 0x68, 0x00, 0x28, + 0xe9, 0xd0, 0x00, 0x21, 0x00, 0x91, 0x01, 0x95, 0x02, 0x97, 0xff, 0xf7, + 0x7d, 0xfd, 0xb0, 0x68, 0x00, 0x23, 0x00, 0x22, 0x69, 0x46, 0x00, 0xf0, + 0x66, 0xfd, 0xdc, 0xe7, 0x70, 0x68, 0x71, 0x60, 0x30, 0x60, 0x01, 0x21, + 0xca, 0xe7, 0x10, 0xb5, 0x00, 0x24, 0x8a, 0x42, 0x41, 0x60, 0x00, 0x61, + 0x07, 0xd3, 0x81, 0x69, 0xd2, 0x1a, 0x8a, 0x42, 0x07, 0xd2, 0x29, 0x4a, + 0x01, 0x1d, 0x50, 0x68, 0x08, 0xe0, 0x9a, 0x42, 0x03, 0xd2, 0x99, 0x42, + 0x01, 0xd3, 0x01, 0x24, 0x04, 0xe0, 0x01, 0x1d, 0x23, 0x48, 0x00, 0x68, + 0x10, 0xf0, 0x0d, 0xfd, 0x20, 0x46, 0x10, 0xbd, 0x1c, 0xb5, 0x10, 0xf0, + 0xa7, 0xfc, 0x1f, 0x4c, 0xa0, 0x68, 0xe0, 0xb9, 0x04, 0xf1, 0x14, 0x00, + 0x10, 0xf0, 0xe6, 0xfc, 0x04, 0xf1, 0x28, 0x00, 0x10, 0xf0, 0xe2, 0xfc, + 0x04, 0xf1, 0x14, 0x00, 0x04, 0xf1, 0x28, 0x01, 0x00, 0x22, 0x20, 0x60, + 0x61, 0x60, 0x00, 0x92, 0x04, 0xf1, 0x3c, 0x03, 0x04, 0xf1, 0x8c, 0x02, + 0x10, 0x21, 0x10, 0x20, 0x00, 0xf0, 0xbe, 0xfc, 0xa0, 0x60, 0x10, 0xb1, + 0x14, 0xa1, 0x00, 0xf0, 0xc0, 0xff, 0xbd, 0xe8, 0x13, 0x40, 0x10, 0xf0, + 0x8f, 0xbc, 0x10, 0xb5, 0x04, 0x46, 0x10, 0xf0, 0x7f, 0xfc, 0x24, 0x6a, + 0x10, 0xf0, 0x88, 0xfc, 0x20, 0x46, 0x10, 0xbd, 0x38, 0xb5, 0x84, 0xb0, + 0x1c, 0x46, 0x03, 0x92, 0x01, 0x90, 0x22, 0x46, 0x05, 0x4c, 0xa0, 0x68, + 0x02, 0x91, 0x4f, 0xf0, 0xff, 0x35, 0x00, 0x95, 0x00, 0x23, 0x69, 0x46, + 0x00, 0xf0, 0x05, 0xfd, 0x05, 0xb0, 0x30, 0xbd, 0x78, 0x58, 0x02, 0x20, + 0x04, 0xed, 0x00, 0xe0, 0x54, 0x6d, 0x72, 0x20, 0x53, 0x76, 0x63, 0x00, + 0x54, 0x6d, 0x72, 0x51, 0x00, 0x00, 0x00, 0x00, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, 0x0d, 0xf8, 0x01, 0x70, + 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, + 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x70, 0x47, + 0x2d, 0xe9, 0xf0, 0x41, 0xac, 0x4c, 0xdf, 0xf8, 0xb4, 0x82, 0x20, 0x68, + 0xd0, 0xf8, 0xb8, 0x50, 0x05, 0xf0, 0xff, 0x05, 0xff, 0x27, 0x00, 0x26, + 0x25, 0xfa, 0x06, 0xf0, 0xc0, 0x07, 0x15, 0xd5, 0x20, 0x68, 0xf1, 0xb2, + 0x01, 0x44, 0x91, 0xf8, 0xbc, 0x20, 0xed, 0x21, 0x11, 0xfb, 0x02, 0xf2, + 0x10, 0x44, 0x4f, 0xf0, 0xe0, 0x52, 0x90, 0xf8, 0xc0, 0x34, 0x58, 0xf8, + 0x26, 0x00, 0xbb, 0x42, 0x98, 0xbf, 0x1f, 0x46, 0x1a, 0x21, 0x00, 0x1d, + 0xff, 0xf7, 0xc9, 0xff, 0x76, 0x1c, 0x08, 0x2e, 0xe2, 0xd3, 0x04, 0x2f, + 0x06, 0xd2, 0x3b, 0x46, 0xbd, 0xe8, 0xf0, 0x41, 0x60, 0x22, 0x05, 0x21, + 0x97, 0x48, 0xb3, 0xe7, 0xbd, 0xe8, 0xf0, 0x81, 0x70, 0x47, 0x70, 0xb5, + 0x01, 0x28, 0x0c, 0x46, 0x33, 0xd8, 0x94, 0x49, 0x94, 0x4a, 0x51, 0xf8, + 0x20, 0x50, 0x52, 0xf8, 0x20, 0x60, 0x23, 0x7b, 0x4f, 0xf4, 0x80, 0x72, + 0x08, 0x21, 0x00, 0xf0, 0x29, 0xf8, 0x63, 0x7b, 0x70, 0x22, 0x04, 0x21, + 0x05, 0xf1, 0x08, 0x00, 0xff, 0xf7, 0xa3, 0xff, 0x06, 0xf1, 0x14, 0x05, + 0xa3, 0x68, 0x8b, 0x4a, 0x04, 0x21, 0x00, 0xf0, 0x1b, 0xf8, 0x00, 0x23, + 0x04, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x16, 0xf8, 0x01, 0x23, 0x08, 0x22, + 0x03, 0x21, 0x00, 0xf0, 0x11, 0xf8, 0x63, 0x68, 0x6f, 0xf0, 0x7f, 0x42, + 0x00, 0x21, 0x06, 0xf1, 0x18, 0x00, 0xff, 0xf7, 0x8a, 0xff, 0x28, 0x46, + 0xbd, 0xe8, 0x70, 0x40, 0x01, 0x23, 0x4f, 0xf0, 0x00, 0x52, 0x1d, 0x21, + 0x81, 0xe7, 0x70, 0xbd, 0x28, 0x46, 0x7e, 0xe7, 0x10, 0xb5, 0x76, 0x4c, + 0x54, 0xf8, 0x20, 0x00, 0xbd, 0xe8, 0x10, 0x40, 0x01, 0x23, 0xff, 0xe7, + 0x4f, 0xf4, 0x80, 0x32, 0x10, 0x21, 0x0c, 0x30, 0x71, 0xe7, 0x38, 0xb5, + 0x71, 0x4d, 0x04, 0x46, 0x55, 0xf8, 0x24, 0x00, 0x01, 0x23, 0x80, 0x22, + 0x07, 0x21, 0x08, 0x30, 0xff, 0xf7, 0x67, 0xff, 0x01, 0x23, 0x80, 0x22, + 0x07, 0x21, 0x6a, 0x48, 0xff, 0xf7, 0x58, 0xff, 0x6a, 0x48, 0x50, 0xf8, + 0x24, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x01, 0x23, 0x10, 0x22, + 0x04, 0x21, 0x56, 0xe7, 0x70, 0xb5, 0x15, 0x46, 0x66, 0x4a, 0x64, 0x4b, + 0x52, 0xf8, 0x20, 0x40, 0x53, 0xf8, 0x21, 0x10, 0x04, 0xf1, 0x10, 0x02, + 0x00, 0x26, 0x13, 0x68, 0xc3, 0xf3, 0x02, 0x12, 0x23, 0x68, 0xdb, 0x07, + 0x03, 0xd4, 0x02, 0x2a, 0x18, 0xbf, 0x01, 0x2a, 0x02, 0xd1, 0x4b, 0xf6, + 0x01, 0x36, 0x1d, 0xe0, 0x10, 0x22, 0x22, 0x60, 0x28, 0x31, 0x26, 0x60, + 0x01, 0x22, 0x41, 0xf8, 0x20, 0x20, 0x41, 0xf8, 0x20, 0x60, 0x6f, 0xf0, + 0x7f, 0x42, 0xa9, 0x78, 0x28, 0x88, 0x09, 0x02, 0x41, 0xea, 0x00, 0x41, + 0x21, 0x60, 0x00, 0x21, 0x6b, 0x68, 0x20, 0x1d, 0xff, 0xf7, 0x29, 0xff, + 0xa8, 0x78, 0x29, 0x88, 0x00, 0x02, 0x40, 0xea, 0x01, 0x40, 0x40, 0xf0, + 0x01, 0x00, 0x20, 0x60, 0x30, 0x46, 0x70, 0xbd, 0x4b, 0x49, 0x51, 0xf8, + 0x20, 0x00, 0x10, 0x30, 0x00, 0x68, 0x80, 0xe0, 0x10, 0xb5, 0x48, 0x4a, + 0x52, 0xf8, 0x20, 0x00, 0x00, 0xf1, 0x10, 0x04, 0x11, 0xb1, 0x21, 0x68, + 0xc9, 0x07, 0xfc, 0xd4, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0xff, 0xf7, + 0x0a, 0xff, 0x20, 0x68, 0xc0, 0x07, 0x01, 0xd5, 0x00, 0x20, 0x10, 0xbd, + 0x02, 0x20, 0x10, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, 0x3c, 0x4b, 0x3a, 0x4d, + 0x55, 0xf8, 0x21, 0x10, 0x80, 0x46, 0x53, 0xf8, 0x28, 0x40, 0x04, 0xf1, + 0x10, 0x03, 0x00, 0x20, 0x1d, 0x68, 0x1b, 0x68, 0xc5, 0xf3, 0x02, 0x15, + 0x02, 0x2d, 0x14, 0xbf, 0x01, 0x2d, 0x4b, 0xf6, 0x02, 0x30, 0x01, 0xf5, + 0x2a, 0x75, 0x1b, 0x0a, 0x55, 0xf8, 0x28, 0x50, 0xb3, 0xeb, 0x15, 0x2f, + 0x15, 0x46, 0x18, 0xbf, 0x00, 0x23, 0x04, 0xf1, 0x28, 0x02, 0x2b, 0x60, + 0x04, 0xf1, 0x2c, 0x03, 0x12, 0x68, 0x1e, 0x68, 0xb7, 0x03, 0x96, 0x03, + 0x57, 0xea, 0x92, 0x47, 0xb6, 0x0b, 0x46, 0xea, 0x87, 0x46, 0xbf, 0x13, + 0xc5, 0xe9, 0x02, 0x67, 0x04, 0xf1, 0x30, 0x02, 0x04, 0xf1, 0x34, 0x03, + 0x16, 0x68, 0x1a, 0x68, 0x93, 0x03, 0xb2, 0x03, 0x53, 0xea, 0x96, 0x43, + 0x92, 0x0b, 0x42, 0xea, 0x83, 0x42, 0x9b, 0x13, 0xc5, 0xe9, 0x04, 0x23, + 0x01, 0xf1, 0xa8, 0x06, 0x01, 0xf5, 0x94, 0x77, 0x56, 0xf8, 0x28, 0x20, + 0x57, 0xf8, 0x28, 0x60, 0x37, 0x03, 0x16, 0x03, 0x57, 0xea, 0x12, 0x57, + 0x36, 0x0b, 0x46, 0xea, 0x07, 0x56, 0x3f, 0x13, 0xc5, 0xe9, 0x06, 0x67, + 0x01, 0xf5, 0xd4, 0x72, 0x01, 0xf5, 0x0a, 0x71, 0x52, 0xf8, 0x28, 0x20, + 0x51, 0xf8, 0x28, 0x60, 0x13, 0x0d, 0x14, 0x03, 0x43, 0xea, 0x06, 0x31, + 0x24, 0x0b, 0x44, 0xea, 0x01, 0x54, 0x09, 0x13, 0xc5, 0xe9, 0x08, 0x41, + 0xbd, 0xe8, 0xf0, 0x81, 0x07, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x00, 0x68, + 0x00, 0x0a, 0x00, 0xf0, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, + 0xb4, 0x76, 0x02, 0x20, 0x28, 0x96, 0x04, 0x01, 0x18, 0x00, 0x00, 0x47, + 0xcc, 0x9d, 0x04, 0x01, 0xe4, 0x9d, 0x04, 0x01, 0xf0, 0xff, 0xff, 0x0f, + 0xc8, 0x97, 0x04, 0x01, 0x2d, 0xe9, 0xf2, 0x4f, 0x82, 0xb0, 0x80, 0x46, + 0xf0, 0xf7, 0x98, 0xff, 0x00, 0x24, 0x81, 0x46, 0x00, 0x25, 0x00, 0x26, + 0x29, 0xfa, 0x06, 0xf0, 0xc1, 0x07, 0x06, 0xf1, 0x01, 0x0a, 0x30, 0xd5, + 0x01, 0xa9, 0x30, 0x46, 0xfd, 0xf7, 0x59, 0xfc, 0x04, 0x00, 0x32, 0xd1, + 0x01, 0x98, 0x40, 0x45, 0x27, 0xd1, 0x6a, 0x46, 0x41, 0x46, 0x30, 0x46, + 0x00, 0xf0, 0x76, 0xf8, 0x04, 0x00, 0x28, 0xd1, 0x00, 0x9f, 0x30, 0x46, + 0xf0, 0xf7, 0xf4, 0xfd, 0x06, 0x46, 0x40, 0x46, 0xf0, 0xf7, 0x35, 0xff, + 0x83, 0x46, 0x40, 0x46, 0xf0, 0xf7, 0x3e, 0xff, 0x7f, 0x42, 0xb0, 0x42, + 0x13, 0xd3, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xdf, 0xed, + 0x2e, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xe3, 0xf7, 0x39, 0xf8, 0xbd, 0xee, + 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0xc7, 0x42, 0xa8, 0xbf, 0xb8, 0x42, + 0x05, 0xdb, 0x56, 0x46, 0x07, 0xe0, 0xb3, 0x45, 0x38, 0xbf, 0x4b, 0xf6, + 0x04, 0x34, 0x01, 0x25, 0x03, 0xe0, 0x56, 0x46, 0x0c, 0xb9, 0x08, 0x2e, + 0xbc, 0xd3, 0x02, 0x98, 0x05, 0x70, 0x20, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, + 0xf8, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x82, 0xb0, 0x06, 0x46, 0x00, 0x20, + 0x01, 0x90, 0x0c, 0x46, 0x15, 0x46, 0x69, 0x46, 0x30, 0x46, 0xfd, 0xf7, + 0x0e, 0xfc, 0x9f, 0xed, 0x19, 0x8a, 0x00, 0x27, 0x10, 0xbb, 0x00, 0x98, + 0xff, 0x28, 0x08, 0xbf, 0x4b, 0xf6, 0x05, 0x30, 0x1c, 0xd0, 0xf0, 0xf7, + 0x9d, 0xfd, 0x08, 0xee, 0x90, 0x0a, 0x00, 0x98, 0x21, 0x46, 0x00, 0xf0, + 0x52, 0xf8, 0x08, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x68, 0x0a, 0xf8, 0xee, + 0x48, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0xe3, 0xf7, 0x71, 0xfa, 0xe3, 0xf7, + 0x13, 0xf8, 0xbd, 0xee, 0xc0, 0x0a, 0x00, 0x99, 0x10, 0xee, 0x10, 0x7a, + 0x01, 0xaa, 0x30, 0x46, 0x00, 0xf0, 0x0e, 0xf8, 0x01, 0x99, 0x69, 0x60, + 0x85, 0xed, 0x02, 0x8a, 0x2c, 0x73, 0x6f, 0x73, 0x02, 0xb0, 0xbd, 0xec, + 0x02, 0x8b, 0xf2, 0xbd, 0xae, 0x47, 0xe1, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0xf8, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0x21, 0x46, 0x28, 0x46, + 0xf0, 0xf7, 0xb5, 0xfe, 0x07, 0x46, 0x28, 0x46, 0xf0, 0xf7, 0xa4, 0xfe, + 0x05, 0x46, 0x69, 0x46, 0x20, 0x46, 0xef, 0xf7, 0xf5, 0xfe, 0x9d, 0xed, + 0x00, 0x0a, 0x00, 0xee, 0x90, 0x7a, 0xb8, 0xee, 0x40, 0x0a, 0xf8, 0xee, + 0xe0, 0x0a, 0x30, 0xee, 0x20, 0x0a, 0x00, 0xee, 0x90, 0x5a, 0xf8, 0xee, + 0x60, 0x0a, 0x04, 0x46, 0x80, 0xee, 0x20, 0x0a, 0xe2, 0xf7, 0xd8, 0xff, + 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x45, 0x43, 0x00, 0x98, + 0x2d, 0x1a, 0xef, 0x1b, 0x37, 0x60, 0x20, 0x46, 0xf2, 0xbd, 0x00, 0x29, + 0x08, 0xbf, 0xf0, 0xf7, 0xa3, 0xbe, 0xf0, 0xf7, 0x94, 0xbe, 0x00, 0x00, + 0x10, 0xee, 0x10, 0x0a, 0x73, 0x46, 0x00, 0xf0, 0x03, 0xf8, 0x00, 0xee, + 0x10, 0x0a, 0x18, 0x47, 0xc0, 0xf3, 0xc7, 0x52, 0x7e, 0x3a, 0x09, 0xdd, + 0x18, 0x2a, 0x0e, 0xda, 0x6f, 0xf0, 0x7f, 0x41, 0xd1, 0x40, 0x00, 0x42, + 0x58, 0xbf, 0x40, 0x18, 0x88, 0x43, 0x70, 0x47, 0xc0, 0x42, 0x18, 0xbf, + 0x4f, 0xf0, 0x7e, 0x50, 0x28, 0xbf, 0x4f, 0xf0, 0x00, 0x40, 0x70, 0x47, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x0d, 0x46, 0x82, 0x46, + 0xae, 0x78, 0x4b, 0x4c, 0xf0, 0xf7, 0xcc, 0xfe, 0x81, 0x46, 0x38, 0x20, + 0x00, 0xfb, 0x09, 0xf0, 0x1c, 0x21, 0x48, 0x4a, 0x11, 0xfb, 0x06, 0xf1, + 0x02, 0x44, 0x57, 0x18, 0x23, 0x18, 0x19, 0x44, 0x01, 0xf1, 0x08, 0x08, + 0x38, 0x46, 0x29, 0x46, 0x00, 0xf0, 0x7b, 0xf8, 0x28, 0x78, 0x04, 0xeb, + 0x49, 0x04, 0x50, 0xb9, 0x00, 0x21, 0x79, 0x60, 0xb8, 0x60, 0x29, 0x7e, + 0x29, 0xb9, 0xa0, 0x5d, 0x18, 0xb1, 0x38, 0x46, 0x41, 0x46, 0x00, 0xf0, + 0x6c, 0xf8, 0x3b, 0x48, 0x01, 0x68, 0x01, 0xeb, 0x0a, 0x02, 0xe0, 0x20, + 0x92, 0xf8, 0xbc, 0x30, 0x43, 0x43, 0xc8, 0x18, 0x4f, 0xf0, 0x00, 0x09, + 0xd0, 0xf8, 0x57, 0x11, 0x38, 0x78, 0x39, 0x61, 0x49, 0x08, 0x79, 0x61, + 0x28, 0xb1, 0x78, 0x68, 0x10, 0xf0, 0x6a, 0xfa, 0x5f, 0xea, 0x00, 0x09, + 0x35, 0xd1, 0x30, 0x48, 0x97, 0xed, 0x02, 0x0a, 0x2f, 0x4a, 0x00, 0xeb, + 0xca, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xdf, 0xed, 0x27, 0x0a, 0xb8, 0x78, + 0x60, 0xee, 0x20, 0x0a, 0x9f, 0xed, 0x25, 0x1a, 0x80, 0xee, 0x81, 0x1a, + 0x5a, 0xf8, 0x20, 0x00, 0xbc, 0xee, 0xc1, 0x1a, 0x11, 0xee, 0x10, 0x3a, + 0x10, 0x21, 0x10, 0x30, 0xff, 0xf7, 0x96, 0xff, 0xb8, 0x78, 0x5a, 0xf8, + 0x20, 0xb0, 0x7b, 0x68, 0x5b, 0x42, 0x6f, 0xf0, 0x7f, 0x42, 0x00, 0x21, + 0x58, 0x46, 0xff, 0xf7, 0x8b, 0xff, 0x01, 0x23, 0x4f, 0xf0, 0x00, 0x62, + 0x1b, 0x21, 0x58, 0x46, 0xff, 0xf7, 0x84, 0xff, 0xb8, 0x78, 0x3b, 0x78, + 0x5a, 0xf8, 0x20, 0x00, 0x4f, 0xf0, 0x80, 0x62, 0x1a, 0x21, 0xff, 0xf7, + 0x7b, 0xff, 0x28, 0x7e, 0x01, 0x28, 0x05, 0xd1, 0x40, 0x46, 0x39, 0x46, + 0x00, 0xf0, 0x17, 0xf8, 0x01, 0x21, 0xa1, 0x55, 0x48, 0x46, 0xbd, 0xe8, + 0xf2, 0x8f, 0x10, 0xb5, 0x0c, 0x46, 0xf0, 0xf7, 0x4d, 0xfe, 0x01, 0x46, + 0x38, 0x22, 0x20, 0x46, 0x09, 0x4b, 0xa4, 0x78, 0x51, 0x43, 0x5a, 0x18, + 0x1c, 0x21, 0x4c, 0x43, 0x11, 0x19, 0x00, 0xf0, 0x02, 0xf8, 0x00, 0x20, + 0x10, 0xbd, 0x1c, 0x22, 0xe2, 0xf7, 0xa6, 0xbd, 0x00, 0x00, 0x80, 0x47, + 0x00, 0x00, 0xb4, 0x43, 0xbc, 0x5d, 0x02, 0x20, 0x6c, 0x60, 0x02, 0x20, + 0xb4, 0x76, 0x02, 0x20, 0x88, 0x8e, 0x04, 0x01, 0x00, 0x00, 0xff, 0xff, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x70, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x80, 0x4a, 0x52, 0xf8, 0x20, 0x00, 0x40, 0xf8, + 0xa0, 0x1f, 0x70, 0x47, 0x7e, 0x4a, 0x52, 0xf8, 0x20, 0x00, 0x41, 0xf0, + 0x80, 0x01, 0x00, 0xf8, 0xe1, 0x1f, 0x70, 0x47, 0x10, 0xb5, 0x00, 0xbf, + 0x8d, 0xa3, 0x1c, 0x5c, 0x0c, 0x70, 0x00, 0xbf, 0x90, 0xa1, 0x08, 0x5c, + 0x10, 0x70, 0x10, 0xbd, 0x16, 0x28, 0x3a, 0xbf, 0x0f, 0xf2, 0x48, 0x22, + 0x10, 0x5c, 0x00, 0x20, 0x08, 0x70, 0x70, 0x47, 0x70, 0xb5, 0x72, 0x4e, + 0x56, 0xf8, 0x20, 0x60, 0x1d, 0x46, 0x14, 0x46, 0x0b, 0x46, 0x1f, 0x22, + 0x00, 0x21, 0x06, 0xf5, 0x7c, 0x70, 0xff, 0xf7, 0xc5, 0xff, 0x06, 0xf2, + 0xf1, 0x36, 0x23, 0x46, 0xfc, 0x22, 0x02, 0x21, 0x30, 0x46, 0xff, 0xf7, + 0xbd, 0xff, 0x85, 0xf0, 0x01, 0x03, 0x01, 0x22, 0x00, 0x21, 0x30, 0x46, + 0xff, 0xf7, 0xb6, 0xff, 0x2b, 0x46, 0x30, 0x46, 0xbd, 0xe8, 0x70, 0x40, + 0x02, 0x22, 0x01, 0x21, 0xae, 0xe7, 0x30, 0xb5, 0x60, 0x4c, 0x54, 0xf8, + 0x20, 0x00, 0x00, 0xf5, 0x7c, 0x75, 0x00, 0xf2, 0xf1, 0x30, 0x2c, 0x78, + 0x04, 0xf0, 0x1f, 0x04, 0x0c, 0x70, 0x01, 0x78, 0x89, 0x08, 0x11, 0x70, + 0x00, 0x78, 0xc0, 0xf3, 0x40, 0x00, 0x18, 0x70, 0x30, 0xbd, 0x56, 0x49, + 0x51, 0xf8, 0x20, 0x00, 0xa0, 0x30, 0x00, 0x68, 0xc0, 0xf3, 0x80, 0x00, + 0x70, 0x47, 0x54, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x74, 0x30, 0x00, 0x68, + 0x00, 0x0e, 0x00, 0xf0, 0x0f, 0x00, 0x70, 0x47, 0x38, 0xb5, 0x0c, 0x00, + 0x14, 0xbf, 0x21, 0x21, 0x22, 0x21, 0x01, 0x22, 0xfc, 0xf7, 0x4b, 0xfa, + 0x05, 0x46, 0x14, 0xb1, 0x01, 0x20, 0xfb, 0xf7, 0x77, 0xf8, 0x28, 0x46, + 0x32, 0xbd, 0x00, 0x29, 0x19, 0xbf, 0x00, 0x22, 0x26, 0x21, 0x01, 0x22, + 0x27, 0x21, 0xfc, 0xf7, 0x3c, 0xba, 0x38, 0xb5, 0x44, 0x4d, 0x04, 0x46, + 0x55, 0xf8, 0x24, 0x00, 0x00, 0xf0, 0x11, 0xf8, 0x3f, 0x48, 0x50, 0xf8, + 0x24, 0x00, 0x00, 0xf0, 0x0c, 0xf8, 0x3c, 0x48, 0x50, 0xf8, 0x24, 0x00, + 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0xa5, 0x23, 0xff, 0x22, 0x00, 0x21, + 0x00, 0xf2, 0xff, 0x30, 0x5a, 0xe7, 0xa5, 0x23, 0xff, 0x22, 0x00, 0x21, + 0x00, 0xf2, 0xff, 0x30, 0x54, 0xe7, 0x00, 0x00, 0x2d, 0xe9, 0xfc, 0x41, + 0x05, 0x46, 0x34, 0x48, 0x0f, 0xf2, 0xdc, 0x08, 0x00, 0xf0, 0x34, 0xf8, + 0x01, 0xae, 0x08, 0x78, 0x8d, 0xf8, 0x04, 0x00, 0x00, 0x24, 0x2d, 0x48, + 0x00, 0xf0, 0x2c, 0xf8, 0x00, 0x27, 0x08, 0x78, 0x70, 0x70, 0x29, 0x48, + 0x00, 0xf0, 0x26, 0xf8, 0x08, 0x78, 0xb0, 0x70, 0xf3, 0x5d, 0xa5, 0x2b, + 0x09, 0xd0, 0xa5, 0x22, 0x00, 0x92, 0x03, 0x21, 0x42, 0x46, 0x01, 0x20, + 0xf0, 0xf7, 0x5f, 0xfe, 0xf0, 0xf7, 0x46, 0xfe, 0x64, 0x1c, 0x7f, 0x1c, + 0x03, 0x2f, 0xef, 0xd3, 0x20, 0x48, 0x50, 0xf8, 0x25, 0x10, 0x0b, 0x68, + 0x20, 0x48, 0x83, 0x42, 0x09, 0xd0, 0x00, 0x90, 0x5f, 0xf0, 0x03, 0x01, + 0x26, 0xa2, 0x01, 0x20, 0xf0, 0xf7, 0x4b, 0xfe, 0xf0, 0xf7, 0x32, 0xfe, + 0x64, 0x1c, 0xe0, 0xb2, 0xbd, 0xe8, 0xf6, 0x81, 0x50, 0xf8, 0x25, 0x10, + 0x01, 0xf2, 0xff, 0x31, 0x70, 0x47, 0x70, 0xb5, 0x16, 0x4a, 0x52, 0xf8, + 0x20, 0x50, 0x0c, 0x46, 0x28, 0x46, 0xfc, 0xf7, 0xdc, 0xf9, 0x06, 0x46, + 0x21, 0x46, 0x28, 0x46, 0xfc, 0xf7, 0xe9, 0xf9, 0x30, 0x46, 0x70, 0xbd, + 0x10, 0x49, 0x51, 0xf8, 0x20, 0x00, 0xef, 0xf3, 0x10, 0x81, 0x72, 0xb6, + 0x50, 0xf8, 0x1c, 0x2f, 0x00, 0x23, 0x03, 0x60, 0x81, 0xf3, 0x10, 0x88, + 0x70, 0x47, 0x0a, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x1c, 0x30, 0x00, 0x68, + 0x70, 0x47, 0x00, 0x00, 0xcc, 0x9d, 0x04, 0x01, 0xf4, 0x9d, 0x04, 0x01, + 0xec, 0x9d, 0x04, 0x01, 0xbc, 0x9d, 0x04, 0x01, 0xfc, 0x9d, 0x04, 0x01, + 0xfe, 0xca, 0xad, 0xab, 0xd4, 0x9d, 0x04, 0x01, 0xdc, 0x9d, 0x04, 0x01, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x20, 0x76, 0x65, 0x72, 0x20, 0x64, 0x38, + 0x3a, 0x20, 0x25, 0x58, 0x20, 0x21, 0x3d, 0x20, 0x25, 0x58, 0x0a, 0x00, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x20, 0x76, 0x65, 0x72, 0x20, 0x64, 0x33, + 0x32, 0x3a, 0x20, 0x25, 0x58, 0x20, 0x21, 0x3d, 0x20, 0x25, 0x58, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x09, + 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, + 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0b, 0x0c, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x00, 0x00, 0x0e, 0xb4, 0xc0, 0xb5, + 0x02, 0x46, 0x03, 0xa8, 0x00, 0x21, 0x01, 0x90, 0x00, 0x91, 0x01, 0xab, + 0x01, 0x21, 0x04, 0x48, 0x78, 0x44, 0x0c, 0x30, 0x10, 0xf0, 0xa2, 0xf8, + 0x06, 0xbc, 0x5d, 0xf8, 0x10, 0xfb, 0x00, 0xbf, 0x15, 0xb3, 0x02, 0x00, + 0x70, 0xb5, 0x1c, 0x00, 0x2a, 0xd0, 0x00, 0x29, 0x0c, 0xbf, 0x24, 0x60, + 0x22, 0x60, 0x04, 0x9d, 0xe0, 0x63, 0x21, 0x64, 0x04, 0xf1, 0x44, 0x06, + 0x0f, 0xf0, 0xc0, 0xff, 0xe2, 0x6b, 0x20, 0x6c, 0x21, 0x68, 0x42, 0x43, + 0x88, 0x18, 0xa0, 0x60, 0x00, 0x21, 0xa1, 0x63, 0x20, 0x68, 0xe2, 0x6b, + 0x60, 0x60, 0x52, 0x1e, 0x20, 0x6c, 0x21, 0x68, 0x42, 0x43, 0x88, 0x18, + 0xe0, 0x60, 0x4f, 0xf0, 0xff, 0x30, 0x30, 0x70, 0x70, 0x70, 0x04, 0xf1, + 0x10, 0x00, 0x0f, 0xf0, 0xed, 0xff, 0x04, 0xf1, 0x24, 0x00, 0x0f, 0xf0, + 0xe9, 0xff, 0x0f, 0xf0, 0xad, 0xff, 0x35, 0x72, 0x20, 0x46, 0x70, 0xbd, + 0x70, 0xb5, 0x0c, 0x00, 0x05, 0x46, 0x32, 0xd0, 0x24, 0x60, 0x01, 0x20, + 0x00, 0x21, 0xe0, 0x63, 0x21, 0x64, 0x04, 0xf1, 0x44, 0x06, 0x0f, 0xf0, + 0x91, 0xff, 0xe2, 0x6b, 0x20, 0x6c, 0x21, 0x68, 0x42, 0x43, 0x88, 0x18, + 0xa0, 0x60, 0x00, 0x21, 0xa1, 0x63, 0x20, 0x68, 0xe2, 0x6b, 0x60, 0x60, + 0x52, 0x1e, 0x20, 0x6c, 0x21, 0x68, 0x42, 0x43, 0x88, 0x18, 0xe0, 0x60, + 0x4f, 0xf0, 0xff, 0x30, 0x30, 0x70, 0x70, 0x70, 0x04, 0xf1, 0x10, 0x00, + 0x0f, 0xf0, 0xbe, 0xff, 0x04, 0xf1, 0x24, 0x00, 0x0f, 0xf0, 0xba, 0xff, + 0x0f, 0xf0, 0x7e, 0xff, 0x35, 0x72, 0x00, 0x20, 0xa0, 0x60, 0x00, 0x21, + 0x21, 0x60, 0x00, 0x22, 0xe2, 0x60, 0x00, 0x23, 0x20, 0x46, 0x00, 0xf0, + 0x02, 0xf8, 0x20, 0x46, 0x70, 0xbd, 0x2d, 0xe9, 0xf7, 0x4f, 0x06, 0x46, + 0x8a, 0x46, 0x9b, 0x46, 0x00, 0x24, 0x06, 0xf1, 0x44, 0x07, 0xdf, 0xf8, + 0x58, 0x85, 0x4f, 0xf0, 0x80, 0x59, 0x33, 0xe0, 0x02, 0x98, 0x00, 0x28, + 0x51, 0xd0, 0x1c, 0xb9, 0x68, 0x46, 0xfe, 0xf7, 0x6d, 0xff, 0x01, 0x24, + 0x0f, 0xf0, 0x5a, 0xff, 0xfe, 0xf7, 0x68, 0xfd, 0x0f, 0xf0, 0x4a, 0xff, + 0x97, 0xf9, 0x00, 0x00, 0x10, 0xf1, 0x01, 0x0f, 0x04, 0xbf, 0x00, 0x21, + 0x39, 0x70, 0x97, 0xf9, 0x01, 0x00, 0x10, 0xf1, 0x01, 0x0f, 0x04, 0xbf, + 0x00, 0x21, 0x79, 0x70, 0x0f, 0xf0, 0x46, 0xff, 0x02, 0xa9, 0x68, 0x46, + 0xfe, 0xf7, 0x59, 0xff, 0x00, 0x28, 0x47, 0xd1, 0x0f, 0xf0, 0x32, 0xff, + 0xb0, 0x6b, 0xf1, 0x6b, 0x88, 0x42, 0x14, 0xbf, 0x00, 0x25, 0x01, 0x25, + 0x0f, 0xf0, 0x36, 0xff, 0x4d, 0xbb, 0x30, 0x46, 0x00, 0xf0, 0x2f, 0xfa, + 0xfe, 0xf7, 0x46, 0xfd, 0x0f, 0xf0, 0x22, 0xff, 0xb0, 0x6b, 0xf1, 0x6b, + 0x88, 0x42, 0x02, 0xd3, 0xbb, 0xf1, 0x02, 0x0f, 0xc2, 0xd1, 0x5a, 0x46, + 0x51, 0x46, 0x30, 0x46, 0x00, 0xf0, 0xd8, 0xf9, 0x71, 0x6a, 0x29, 0xb1, + 0x06, 0xf1, 0x24, 0x00, 0xfe, 0xf7, 0xe0, 0xfe, 0x08, 0xb9, 0x06, 0xe0, + 0x28, 0xb1, 0xc8, 0xf8, 0x00, 0x90, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, + 0x6f, 0x8f, 0x0f, 0xf0, 0x11, 0xff, 0x01, 0x20, 0x1c, 0xe0, 0x0f, 0xf0, + 0x0d, 0xff, 0x00, 0x20, 0x18, 0xe0, 0x02, 0x99, 0x06, 0xf1, 0x10, 0x00, + 0xfe, 0xf7, 0x4a, 0xfe, 0x30, 0x46, 0x00, 0xf0, 0x00, 0xfa, 0xfe, 0xf7, + 0x17, 0xfd, 0x00, 0x28, 0xce, 0xd1, 0xc8, 0xf8, 0x00, 0x90, 0xbf, 0xf3, + 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0xc7, 0xe7, 0x30, 0x46, 0x00, 0xf0, + 0xf2, 0xf9, 0xfe, 0xf7, 0x09, 0xfd, 0xe4, 0xe7, 0x03, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0xf8, 0xb5, 0x06, 0x46, 0x14, 0x46, 0xef, 0xf3, 0x11, 0x85, + 0x30, 0x20, 0x80, 0xf3, 0x11, 0x88, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, + 0x6f, 0x8f, 0xb2, 0x6b, 0xf0, 0x6b, 0x82, 0x42, 0x01, 0xd3, 0x02, 0x2b, + 0x1a, 0xd1, 0x96, 0xf9, 0x45, 0x70, 0x1a, 0x46, 0x30, 0x46, 0x00, 0xf0, + 0x8d, 0xf9, 0x17, 0xf1, 0x01, 0x0f, 0x0c, 0xd1, 0x70, 0x6a, 0x68, 0xb1, + 0x06, 0xf1, 0x24, 0x00, 0xfe, 0xf7, 0x92, 0xfe, 0x00, 0x28, 0x18, 0xbf, + 0x00, 0x2c, 0x05, 0xd0, 0x01, 0x20, 0x20, 0x60, 0x02, 0xe0, 0x7f, 0x1c, + 0x86, 0xf8, 0x45, 0x70, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x85, 0xf3, + 0x11, 0x88, 0xf2, 0xbd, 0x38, 0xb5, 0x0c, 0x46, 0xef, 0xf3, 0x11, 0x85, + 0x30, 0x21, 0x81, 0xf3, 0x11, 0x88, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, + 0x6f, 0x8f, 0x81, 0x6b, 0xc2, 0x6b, 0x91, 0x42, 0x17, 0xd2, 0x90, 0xf9, + 0x45, 0x20, 0x49, 0x1c, 0x12, 0xf1, 0x01, 0x0f, 0x81, 0x63, 0x0b, 0xd1, + 0x41, 0x6a, 0x61, 0xb1, 0x24, 0x30, 0xfe, 0xf7, 0x67, 0xfe, 0x00, 0x28, + 0x18, 0xbf, 0x00, 0x2c, 0x05, 0xd0, 0x01, 0x20, 0x20, 0x60, 0x02, 0xe0, + 0x52, 0x1c, 0x80, 0xf8, 0x45, 0x20, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, + 0x85, 0xf3, 0x11, 0x88, 0x32, 0xbd, 0x2d, 0xe9, 0xf6, 0x47, 0x06, 0x46, + 0x82, 0xb0, 0x8a, 0x46, 0x00, 0x24, 0x06, 0xf1, 0x44, 0x07, 0xdf, 0xf8, + 0x9c, 0x83, 0x4f, 0xf0, 0x80, 0x59, 0x04, 0xe0, 0x30, 0x46, 0x00, 0xf0, + 0x80, 0xf9, 0xfe, 0xf7, 0x97, 0xfc, 0x0f, 0xf0, 0x73, 0xfe, 0xb5, 0x6b, + 0x2d, 0xb9, 0x03, 0x98, 0x50, 0xb9, 0x0f, 0xf0, 0x79, 0xfe, 0x00, 0x20, + 0xef, 0xe0, 0x51, 0x46, 0x30, 0x46, 0x00, 0xf0, 0x5d, 0xf9, 0x6d, 0x1e, + 0xb5, 0x63, 0xd8, 0xe0, 0x1c, 0xb9, 0x68, 0x46, 0xfe, 0xf7, 0x7c, 0xfe, + 0x01, 0x24, 0x0f, 0xf0, 0x69, 0xfe, 0xfe, 0xf7, 0x77, 0xfc, 0x0f, 0xf0, + 0x59, 0xfe, 0x78, 0x57, 0x10, 0xf1, 0x01, 0x0f, 0x04, 0xbf, 0x00, 0x21, + 0x39, 0x70, 0x97, 0xf9, 0x01, 0x00, 0x10, 0xf1, 0x01, 0x0f, 0x04, 0xbf, + 0x00, 0x21, 0x79, 0x70, 0x0f, 0xf0, 0x56, 0xfe, 0x03, 0xa9, 0x68, 0x46, + 0xfe, 0xf7, 0x69, 0xfe, 0xe0, 0xb9, 0x0f, 0xf0, 0x43, 0xfe, 0xb0, 0x6b, + 0x45, 0x1e, 0xad, 0x41, 0x0f, 0xf0, 0x4a, 0xfe, 0xed, 0x0f, 0x00, 0x2d, + 0xc0, 0xd0, 0x03, 0x99, 0x06, 0xf1, 0x24, 0x00, 0xfe, 0xf7, 0x86, 0xfd, + 0x30, 0x46, 0x00, 0xf0, 0x3c, 0xf9, 0xfe, 0xf7, 0x53, 0xfc, 0x00, 0x28, + 0xb9, 0xd1, 0xc8, 0xf8, 0x00, 0x90, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, + 0x6f, 0x8f, 0xb2, 0xe7, 0x30, 0x46, 0x00, 0xf0, 0x2e, 0xf9, 0xfe, 0xf7, + 0x45, 0xfc, 0x0f, 0xf0, 0x21, 0xfe, 0xb0, 0x6b, 0x45, 0x1e, 0xad, 0x41, + 0x0f, 0xf0, 0x28, 0xfe, 0xed, 0x0f, 0x00, 0x2d, 0xa3, 0xd0, 0xaa, 0xe7, + 0x2d, 0xe9, 0xf3, 0x47, 0x06, 0x46, 0x00, 0x24, 0x82, 0xb0, 0xa2, 0x46, + 0x06, 0xf1, 0x44, 0x07, 0xdf, 0xf8, 0xbc, 0x82, 0x4f, 0xf0, 0x80, 0x59, + 0x04, 0xe0, 0x30, 0x46, 0x00, 0xf0, 0x11, 0xf9, 0xfe, 0xf7, 0x28, 0xfc, + 0x0f, 0xf0, 0x04, 0xfe, 0xb0, 0x6b, 0x20, 0xb9, 0x03, 0x98, 0x50, 0xb9, + 0x0f, 0xf0, 0x0a, 0xfe, 0x6f, 0xe0, 0x40, 0x1e, 0xb0, 0x63, 0x30, 0x68, + 0x10, 0xb9, 0xfe, 0xf7, 0x7c, 0xff, 0xb0, 0x60, 0x69, 0xe0, 0x1c, 0xb9, + 0x68, 0x46, 0xfe, 0xf7, 0x0d, 0xfe, 0x01, 0x24, 0x0f, 0xf0, 0xfa, 0xfd, + 0xfe, 0xf7, 0x08, 0xfc, 0x0f, 0xf0, 0xea, 0xfd, 0x97, 0xf9, 0x00, 0x00, + 0x10, 0xf1, 0x01, 0x0f, 0x04, 0xbf, 0x00, 0x21, 0x39, 0x70, 0x97, 0xf9, + 0x01, 0x00, 0x10, 0xf1, 0x01, 0x0f, 0x04, 0xbf, 0x00, 0x21, 0x79, 0x70, + 0x0f, 0xf0, 0xe6, 0xfd, 0x03, 0xa9, 0x68, 0x46, 0xfe, 0xf7, 0xf9, 0xfd, + 0x30, 0xbb, 0x0f, 0xf0, 0xd3, 0xfd, 0xb0, 0x6b, 0x45, 0x1e, 0xad, 0x41, + 0x0f, 0xf0, 0xda, 0xfd, 0xed, 0x0f, 0x00, 0x2d, 0xbf, 0xd0, 0x30, 0x68, + 0x38, 0xb9, 0x0f, 0xf0, 0xc7, 0xfd, 0xb0, 0x68, 0xfe, 0xf7, 0x7c, 0xfe, + 0x82, 0x46, 0x0f, 0xf0, 0xcd, 0xfd, 0x03, 0x99, 0x06, 0xf1, 0x24, 0x00, + 0xfe, 0xf7, 0x0c, 0xfd, 0x30, 0x46, 0x00, 0xf0, 0xc2, 0xf8, 0xfe, 0xf7, + 0xd9, 0xfb, 0x00, 0x28, 0xae, 0xd1, 0xc8, 0xf8, 0x00, 0x90, 0xbf, 0xf3, + 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0xa7, 0xe7, 0x30, 0x46, 0x00, 0xf0, + 0xb4, 0xf8, 0xfe, 0xf7, 0xcb, 0xfb, 0x0f, 0xf0, 0xa7, 0xfd, 0xb0, 0x6b, + 0x45, 0x1e, 0xad, 0x41, 0x0f, 0xf0, 0xae, 0xfd, 0xed, 0x0f, 0x00, 0x2d, + 0x98, 0xd0, 0xba, 0xf1, 0x00, 0x0f, 0x0e, 0xd0, 0x0f, 0xf0, 0x9a, 0xfd, + 0x70, 0x6a, 0x00, 0x28, 0x1d, 0xbf, 0x30, 0x6b, 0x01, 0x68, 0xc1, 0xf1, + 0x07, 0x01, 0x00, 0x21, 0xb0, 0x68, 0xfe, 0xf7, 0xc7, 0xfe, 0x0f, 0xf0, + 0x99, 0xfd, 0x00, 0x20, 0x0f, 0xe0, 0x30, 0x69, 0x50, 0xb1, 0x06, 0xf1, + 0x10, 0x00, 0xfe, 0xf7, 0x55, 0xfd, 0x28, 0xb1, 0xc8, 0xf8, 0x00, 0x90, + 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x0f, 0xf0, 0x88, 0xfd, + 0x01, 0x20, 0x04, 0xb0, 0xbd, 0xe8, 0xf0, 0x87, 0x2d, 0xe9, 0xf0, 0x41, + 0x07, 0x46, 0x14, 0x46, 0xef, 0xf3, 0x11, 0x88, 0x30, 0x20, 0x80, 0xf3, + 0x11, 0x88, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0xbd, 0x6b, + 0xdd, 0xb1, 0x97, 0xf9, 0x44, 0x60, 0x38, 0x46, 0x00, 0xf0, 0x5a, 0xf8, + 0x6d, 0x1e, 0x16, 0xf1, 0x01, 0x0f, 0xbd, 0x63, 0x0c, 0xd1, 0x38, 0x69, + 0x68, 0xb1, 0x07, 0xf1, 0x10, 0x00, 0xfe, 0xf7, 0x29, 0xfd, 0x00, 0x28, + 0x18, 0xbf, 0x00, 0x2c, 0x05, 0xd0, 0x01, 0x20, 0x20, 0x60, 0x02, 0xe0, + 0x76, 0x1c, 0x87, 0xf8, 0x44, 0x60, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, + 0x88, 0xf3, 0x11, 0x88, 0xbd, 0xe8, 0xf0, 0x81, 0x10, 0xb5, 0x04, 0x46, + 0x0f, 0xf0, 0x44, 0xfd, 0xa4, 0x6b, 0xff, 0xe7, 0x0f, 0xf0, 0x4c, 0xfd, + 0x20, 0x46, 0x10, 0xbd, 0xf8, 0xb5, 0x06, 0x46, 0x15, 0x46, 0xb4, 0x6b, + 0x32, 0x6c, 0x00, 0x27, 0x42, 0xb9, 0x30, 0x68, 0x30, 0xbb, 0xb0, 0x68, + 0xfe, 0xf7, 0x33, 0xfe, 0x00, 0x21, 0x07, 0x46, 0xb1, 0x60, 0x1f, 0xe0, + 0x65, 0xb9, 0x70, 0x68, 0xe2, 0xf7, 0x76, 0xf9, 0x70, 0x68, 0x31, 0x6c, + 0xb2, 0x68, 0x08, 0x44, 0x90, 0x42, 0x70, 0x60, 0x14, 0xd3, 0x30, 0x68, + 0x70, 0x60, 0x11, 0xe0, 0xf0, 0x68, 0xe2, 0xf7, 0x69, 0xf9, 0x30, 0x6c, + 0xf1, 0x68, 0x40, 0x42, 0x01, 0x44, 0xf1, 0x60, 0x32, 0x68, 0x91, 0x42, + 0x02, 0xd2, 0xb1, 0x68, 0x08, 0x44, 0xf0, 0x60, 0x02, 0x2d, 0x01, 0xd1, + 0x04, 0xb1, 0x64, 0x1e, 0x64, 0x1c, 0xb4, 0x63, 0x38, 0x46, 0xf2, 0xbd, + 0x18, 0xb4, 0x02, 0x6c, 0x0b, 0x46, 0x62, 0xb1, 0xc1, 0x68, 0x84, 0x68, + 0x11, 0x44, 0xc1, 0x60, 0xa1, 0x42, 0x24, 0xbf, 0x01, 0x68, 0xc1, 0x60, + 0xc1, 0x68, 0x18, 0x46, 0x18, 0xbc, 0xe2, 0xf7, 0x45, 0xb9, 0x11, 0xbc, + 0x70, 0x47, 0xf8, 0xb5, 0x05, 0x46, 0x0f, 0xf0, 0xf3, 0xfc, 0x05, 0xf1, + 0x44, 0x06, 0x96, 0xf9, 0x01, 0x40, 0x01, 0x2c, 0x0a, 0xdb, 0x68, 0x6a, + 0x40, 0xb1, 0x05, 0xf1, 0x24, 0x00, 0xfe, 0xf7, 0xb7, 0xfc, 0x08, 0xb1, + 0xfe, 0xf7, 0x36, 0xfd, 0x64, 0x1e, 0xf4, 0xd1, 0x4f, 0xf0, 0xff, 0x37, + 0x77, 0x70, 0x0f, 0xf0, 0xe9, 0xfc, 0x0f, 0xf0, 0xdb, 0xfc, 0x96, 0xf9, + 0x00, 0x40, 0x01, 0x2c, 0x0a, 0xdb, 0x28, 0x69, 0x40, 0xb1, 0x05, 0xf1, + 0x10, 0x00, 0xfe, 0xf7, 0xa1, 0xfc, 0x08, 0xb1, 0xfe, 0xf7, 0x20, 0xfd, + 0x64, 0x1e, 0xf4, 0xd1, 0x37, 0x70, 0xbd, 0xe8, 0xf1, 0x40, 0x0f, 0xf0, + 0xd3, 0xbc, 0x30, 0xb4, 0x0b, 0x4c, 0x00, 0x23, 0x25, 0x46, 0x2a, 0x68, + 0x42, 0xb1, 0xaa, 0x68, 0x5b, 0x1c, 0x2a, 0xb1, 0x5b, 0x1c, 0x10, 0x35, + 0x0a, 0x2b, 0xf6, 0xd3, 0x30, 0xbc, 0x70, 0x47, 0x44, 0xf8, 0x33, 0x10, + 0x04, 0xeb, 0xc3, 0x01, 0x48, 0x60, 0x30, 0xbc, 0x70, 0x47, 0x00, 0x00, + 0x04, 0xed, 0x00, 0xe0, 0x18, 0x72, 0x02, 0x20, 0xf8, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x16, 0x46, 0x0f, 0xf0, 0xa6, 0xfc, 0x04, 0xf1, 0x38, 0x07, + 0x97, 0xf9, 0x0c, 0x00, 0x10, 0xf1, 0x01, 0x0f, 0x04, 0xbf, 0x00, 0x21, + 0x39, 0x73, 0x97, 0xf9, 0x0d, 0x00, 0x10, 0xf1, 0x01, 0x0f, 0x04, 0xbf, + 0x00, 0x21, 0x79, 0x73, 0x0f, 0xf0, 0xa0, 0xfc, 0x38, 0x68, 0x28, 0xb9, + 0x32, 0x46, 0x29, 0x46, 0x04, 0xf1, 0x24, 0x00, 0xfe, 0xf7, 0x4a, 0xfc, + 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x40, 0x90, 0xe7, 0x03, 0xb5, 0x81, 0xb0, + 0x02, 0x46, 0x00, 0x20, 0x00, 0x90, 0x02, 0xab, 0x01, 0x21, 0x03, 0x48, + 0x78, 0x44, 0x08, 0x30, 0x0f, 0xf0, 0x4a, 0xfd, 0x03, 0xb0, 0x00, 0xbd, + 0x69, 0xac, 0x02, 0x00, 0x80, 0xb5, 0x8d, 0xf8, 0x00, 0x00, 0x01, 0x22, + 0x69, 0x46, 0x01, 0x20, 0xf0, 0xf7, 0x76, 0xfc, 0x01, 0x28, 0x02, 0xd1, + 0x9d, 0xf8, 0x00, 0x00, 0x02, 0xbd, 0x4f, 0xf0, 0xff, 0x30, 0x02, 0xbd, + 0xc9, 0xb2, 0x02, 0x78, 0x8a, 0x42, 0x1a, 0xb1, 0x1c, 0xbf, 0x10, 0xf8, + 0x01, 0x2f, 0xf9, 0xe7, 0x18, 0xbf, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, + 0x00, 0xf1, 0x01, 0x03, 0x10, 0xf8, 0x01, 0x1b, 0x11, 0xb1, 0x10, 0xf8, + 0x01, 0x1b, 0xfb, 0xe7, 0xc0, 0x1a, 0x70, 0x47, 0xa0, 0xf1, 0x41, 0x01, + 0x1a, 0x29, 0x38, 0xbf, 0x20, 0x30, 0x70, 0x47, 0x04, 0xe0, 0x10, 0xf8, + 0x01, 0x3b, 0x6b, 0xb1, 0x49, 0x1c, 0x52, 0x1e, 0x52, 0xb1, 0x0b, 0x78, + 0x90, 0xf8, 0x00, 0xc0, 0x9c, 0x45, 0xf4, 0xd0, 0x02, 0xd2, 0x4f, 0xf0, + 0xff, 0x30, 0x70, 0x47, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, + 0x30, 0xb4, 0x00, 0xe0, 0x40, 0x1c, 0x03, 0x78, 0x4b, 0xb1, 0x0c, 0x46, + 0x22, 0x78, 0x00, 0x2a, 0xf8, 0xd0, 0x14, 0xf8, 0x01, 0x5b, 0xab, 0x42, + 0xf8, 0xd1, 0x30, 0xbc, 0x70, 0x47, 0x30, 0xbc, 0x00, 0x20, 0x70, 0x47, + 0x00, 0x78, 0x02, 0x40, 0xca, 0x40, 0xd0, 0xb2, 0x70, 0x47, 0x30, 0xb5, + 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x03, 0xfa, 0x01, 0xf1, + 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x70, 0x84, 0xf3, 0x10, 0x88, + 0x30, 0xbd, 0x04, 0x46, 0xdf, 0xf8, 0x7c, 0x04, 0x21, 0x46, 0x50, 0xf8, + 0x21, 0x50, 0x70, 0x47, 0x70, 0xb5, 0x0c, 0x46, 0xdf, 0xf8, 0x6c, 0x14, + 0x51, 0xf8, 0x20, 0x60, 0x02, 0x20, 0xfa, 0xf7, 0xce, 0xfa, 0x00, 0x23, + 0x00, 0x22, 0x21, 0x46, 0x02, 0x20, 0xfa, 0xf7, 0xd2, 0xfa, 0x00, 0x25, + 0x30, 0x36, 0x02, 0x20, 0xfa, 0xf7, 0xa1, 0xfb, 0x10, 0xb9, 0x30, 0x78, + 0x00, 0x28, 0xf8, 0xd1, 0x30, 0x78, 0x08, 0xb1, 0x4b, 0xf2, 0x0c, 0x75, + 0x02, 0x20, 0xfa, 0xf7, 0x36, 0xfb, 0x28, 0x46, 0x70, 0xbd, 0x10, 0xb5, + 0xdf, 0xf8, 0x2c, 0x44, 0x54, 0xf8, 0x20, 0x00, 0xbd, 0xe8, 0x10, 0x40, + 0x00, 0x23, 0x0e, 0x22, 0x01, 0x21, 0x28, 0x30, 0xbd, 0xe7, 0x38, 0xb5, + 0xff, 0xf7, 0xc9, 0xff, 0x00, 0x23, 0x03, 0x22, 0x00, 0x21, 0x05, 0xf1, + 0x2e, 0x00, 0xff, 0xf7, 0xb4, 0xff, 0x0a, 0x23, 0xff, 0x22, 0x00, 0x21, + 0x05, 0xf1, 0x2d, 0x00, 0xff, 0xf7, 0xad, 0xff, 0x20, 0x46, 0xff, 0xf7, + 0xe0, 0xff, 0x01, 0x23, 0x80, 0x22, 0x07, 0x21, 0x05, 0xf1, 0x28, 0x00, + 0xff, 0xf7, 0xa3, 0xff, 0x20, 0x46, 0xbd, 0xe8, 0x34, 0x40, 0x64, 0x21, + 0xb2, 0xe7, 0x00, 0x00, 0x70, 0xb5, 0x05, 0x46, 0x00, 0x24, 0x19, 0xbb, + 0xef, 0xf3, 0x10, 0x86, 0x72, 0xb6, 0x00, 0xf0, 0x6d, 0xf8, 0x04, 0x00, + 0x07, 0xd1, 0x02, 0x21, 0x28, 0x46, 0x00, 0xf0, 0xf3, 0xf8, 0x04, 0x00, + 0x18, 0xbf, 0x4b, 0xf2, 0x12, 0x74, 0x86, 0xf3, 0x10, 0x88, 0xdf, 0xf8, + 0xb0, 0x03, 0x29, 0x46, 0x50, 0xf8, 0x21, 0x20, 0x92, 0xed, 0x0d, 0x0a, + 0xb8, 0xee, 0x40, 0x0a, 0xdf, 0xed, 0xcc, 0x0a, 0xc0, 0xee, 0x80, 0x0a, + 0xff, 0xee, 0xcb, 0x0a, 0x10, 0xee, 0x90, 0x0a, 0xfa, 0xf7, 0x54, 0xfb, + 0xef, 0xf3, 0x10, 0x86, 0x72, 0xb6, 0x64, 0xb9, 0x28, 0x46, 0x00, 0xf0, + 0x47, 0xf8, 0x04, 0x46, 0x3c, 0xb9, 0x01, 0x21, 0x28, 0x46, 0x00, 0xf0, + 0xcd, 0xf8, 0x04, 0x00, 0x18, 0xbf, 0x4b, 0xf2, 0x13, 0x74, 0x86, 0xf3, + 0x10, 0x88, 0x20, 0x46, 0x70, 0xbd, 0x38, 0xb5, 0x00, 0xf0, 0x1b, 0xf8, + 0x04, 0xf1, 0x24, 0x05, 0x01, 0x23, 0x02, 0x22, 0x01, 0x21, 0x28, 0x46, + 0xff, 0xf7, 0x55, 0xff, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x28, 0x46, + 0xff, 0xf7, 0x4f, 0xff, 0x04, 0xf1, 0x22, 0x01, 0x00, 0x20, 0x08, 0x70, + 0x01, 0xb0, 0x04, 0xf1, 0x23, 0x00, 0xbd, 0xe8, 0x30, 0x40, 0x03, 0x23, + 0x18, 0x22, 0x03, 0x21, 0x41, 0xe7, 0xc8, 0x49, 0x51, 0xf8, 0x20, 0x40, + 0x70, 0x47, 0x10, 0xb5, 0xff, 0xf7, 0xf9, 0xff, 0x24, 0x34, 0x00, 0xf0, + 0x0c, 0xf8, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x30, 0xe7, 0x20, 0x78, 0x00, 0xf0, 0x01, 0x00, 0x8d, 0xf8, + 0x00, 0x00, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, 0x20, 0x46, 0x26, 0xe7, + 0x2d, 0xe9, 0xf8, 0x4d, 0x80, 0x46, 0xb9, 0x48, 0x87, 0xb0, 0x45, 0x46, + 0x50, 0xf8, 0x25, 0x10, 0x06, 0x91, 0x01, 0xf1, 0x2f, 0x07, 0x01, 0x23, + 0x01, 0x22, 0x00, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x16, 0xff, 0x4b, 0xf2, + 0x0c, 0x76, 0x4c, 0xf2, 0x50, 0x34, 0x00, 0xf0, 0x50, 0xf9, 0x01, 0x22, + 0x00, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x06, 0xff, 0x10, 0xb1, 0x64, 0x1e, + 0xf5, 0xd1, 0x61, 0xe0, 0xab, 0x48, 0x50, 0xf8, 0x25, 0x10, 0x48, 0x6b, + 0x4f, 0xf4, 0x7a, 0x72, 0xb0, 0xfb, 0xf2, 0xf4, 0x6a, 0x46, 0x02, 0xa9, + 0x40, 0x46, 0x00, 0xf0, 0x80, 0xf8, 0x00, 0xf0, 0x57, 0xf8, 0x07, 0x46, + 0x0d, 0x46, 0x32, 0x22, 0x00, 0x26, 0xa2, 0xfb, 0x04, 0x01, 0x12, 0xfb, + 0x06, 0x11, 0x00, 0x23, 0x4f, 0xf4, 0x7a, 0x72, 0xf4, 0xf7, 0xea, 0xfa, + 0x82, 0x46, 0x8b, 0x46, 0x00, 0xf0, 0x46, 0xf8, 0xa2, 0x1a, 0x66, 0xeb, + 0x03, 0x03, 0x5b, 0x45, 0x06, 0xd8, 0x28, 0xbf, 0x52, 0x45, 0x03, 0xd2, + 0xb8, 0x1c, 0x45, 0xf1, 0x00, 0x01, 0x02, 0xe0, 0x78, 0x1c, 0x65, 0xf1, + 0xff, 0x31, 0xa4, 0xfb, 0x00, 0x23, 0x04, 0xfb, 0x01, 0x33, 0x54, 0x1e, + 0x63, 0xf1, 0x00, 0x05, 0x06, 0x9b, 0x20, 0x04, 0x03, 0xf1, 0x4e, 0x01, + 0x00, 0x0e, 0x08, 0x70, 0x21, 0x0c, 0x03, 0xf1, 0x4f, 0x00, 0x03, 0xf1, + 0x50, 0x02, 0x01, 0x70, 0x20, 0x0e, 0x10, 0x70, 0x03, 0xf1, 0x52, 0x07, + 0x03, 0xf1, 0x51, 0x00, 0x2a, 0x0c, 0x05, 0x70, 0x28, 0x0a, 0x38, 0x70, + 0x03, 0xf1, 0x54, 0x07, 0x03, 0xf1, 0x53, 0x00, 0x04, 0xa9, 0x02, 0x70, + 0x28, 0x0e, 0x38, 0x70, 0x6a, 0x46, 0x03, 0xf1, 0x4d, 0x00, 0x04, 0x70, + 0x40, 0x46, 0x00, 0xf0, 0x32, 0xf8, 0xdd, 0xe9, 0x00, 0x01, 0x8d, 0x42, + 0x0c, 0xbf, 0x84, 0x42, 0x4b, 0xf2, 0x0d, 0x76, 0x30, 0x46, 0x08, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8d, 0xdd, 0xe9, 0x02, 0x01, 0x22, 0x46, 0x00, 0x23, + 0xf4, 0xf7, 0x9a, 0xba, 0xf8, 0xb5, 0x0d, 0x46, 0x73, 0x49, 0x51, 0xf8, + 0x20, 0x70, 0x07, 0xf1, 0x22, 0x04, 0x00, 0x21, 0x21, 0x70, 0x00, 0xf0, + 0xd0, 0xf8, 0x69, 0x00, 0x41, 0xf0, 0x01, 0x01, 0x21, 0x70, 0x4b, 0xf2, + 0x0c, 0x76, 0x4c, 0xf2, 0x50, 0x34, 0x07, 0xf1, 0x25, 0x00, 0x00, 0x78, + 0x28, 0x40, 0xa8, 0x42, 0x04, 0xd0, 0x00, 0xf0, 0xc0, 0xf8, 0x64, 0x1e, + 0xf5, 0xd1, 0x00, 0xe0, 0x00, 0x26, 0x30, 0x46, 0xf2, 0xbd, 0x2d, 0xe9, + 0xff, 0x4e, 0x0f, 0x46, 0x62, 0x49, 0x51, 0xf8, 0x20, 0x60, 0xff, 0x22, + 0x00, 0x21, 0x06, 0xf1, 0x45, 0x00, 0xff, 0xf7, 0x69, 0xfe, 0x04, 0x46, + 0xff, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x46, 0x00, 0xff, 0xf7, 0x62, 0xfe, + 0x44, 0xea, 0x00, 0x24, 0x00, 0x21, 0xff, 0x22, 0x06, 0xf1, 0x47, 0x00, + 0xff, 0xf7, 0x5a, 0xfe, 0x05, 0x46, 0xff, 0x22, 0x00, 0x21, 0x06, 0xf1, + 0x48, 0x00, 0xff, 0xf7, 0x53, 0xfe, 0x81, 0x46, 0xff, 0x22, 0x00, 0x21, + 0x06, 0xf1, 0x49, 0x00, 0xff, 0xf7, 0x4c, 0xfe, 0x8d, 0xf8, 0x00, 0x00, + 0xff, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x4a, 0x00, 0xff, 0xf7, 0x44, 0xfe, + 0x82, 0x46, 0xff, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x4b, 0x00, 0xff, 0xf7, + 0x3d, 0xfe, 0x02, 0x46, 0x44, 0xea, 0x05, 0x40, 0x40, 0xea, 0x09, 0x64, + 0x9d, 0xf8, 0x00, 0x00, 0x40, 0xea, 0x0a, 0x21, 0x41, 0xea, 0x02, 0x45, + 0xff, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x4c, 0x00, 0xff, 0xf7, 0x2c, 0xfe, + 0x55, 0xea, 0x00, 0x61, 0xc7, 0xe9, 0x00, 0x41, 0xff, 0x22, 0x00, 0x21, + 0x06, 0xf1, 0x4d, 0x00, 0xff, 0xf7, 0x22, 0xfe, 0x04, 0x46, 0xff, 0x22, + 0x00, 0x21, 0x06, 0xf1, 0x4e, 0x00, 0xff, 0xf7, 0x1b, 0xfe, 0x44, 0xea, + 0x00, 0x24, 0x00, 0x21, 0xff, 0x22, 0x06, 0xf1, 0x4f, 0x00, 0xff, 0xf7, + 0x13, 0xfe, 0x07, 0x46, 0xff, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x50, 0x00, + 0xff, 0xf7, 0x0c, 0xfe, 0x05, 0x46, 0xff, 0x22, 0x00, 0x21, 0x06, 0xf1, + 0x51, 0x00, 0xff, 0xf7, 0x05, 0xfe, 0x83, 0x46, 0xff, 0x22, 0x00, 0x21, + 0x06, 0xf1, 0x52, 0x00, 0xff, 0xf7, 0xfe, 0xfd, 0x81, 0x46, 0xff, 0x22, + 0x00, 0x21, 0x06, 0xf1, 0x53, 0x00, 0xff, 0xf7, 0xf7, 0xfd, 0x02, 0x46, + 0x44, 0xea, 0x07, 0x40, 0x40, 0xea, 0x05, 0x64, 0x4b, 0xea, 0x09, 0x21, + 0x41, 0xea, 0x02, 0x45, 0xff, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x54, 0x00, + 0xff, 0xf7, 0xe8, 0xfd, 0x02, 0x9a, 0x55, 0xea, 0x00, 0x61, 0xc2, 0xe9, + 0x00, 0x41, 0xbd, 0xe8, 0xff, 0x8e, 0x00, 0x00, 0x00, 0x24, 0x74, 0x4b, + 0x7c, 0xb5, 0x00, 0xf0, 0x23, 0xf8, 0xff, 0xf7, 0xad, 0xfe, 0x01, 0x23, + 0x00, 0xf0, 0x24, 0xf8, 0x00, 0xf0, 0x13, 0xf8, 0x07, 0x20, 0x20, 0x70, + 0x4c, 0xf2, 0x50, 0x34, 0x05, 0xf1, 0x25, 0x01, 0x08, 0x78, 0x00, 0xf0, + 0x03, 0x00, 0x03, 0x28, 0x04, 0xd0, 0x00, 0xf0, 0x0c, 0xf8, 0x64, 0x1e, + 0xf4, 0xd1, 0x00, 0xe0, 0x00, 0x26, 0x30, 0x46, 0x76, 0xbd, 0x05, 0xf1, + 0x22, 0x04, 0x00, 0x20, 0x20, 0x70, 0x4f, 0xf6, 0x57, 0x76, 0x01, 0x20, + 0xfa, 0xf7, 0x9c, 0xb9, 0x05, 0x49, 0x51, 0xf8, 0x20, 0x50, 0x05, 0xf1, + 0x24, 0x04, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, + 0xb2, 0xbd, 0x00, 0x00, 0x30, 0x9c, 0x04, 0x01, 0x20, 0x76, 0x02, 0x20, + 0xe0, 0xb5, 0x03, 0x20, 0x00, 0x21, 0x01, 0x90, 0x00, 0x91, 0xdf, 0xf8, + 0x78, 0x39, 0x0f, 0xf6, 0xa8, 0x22, 0xdf, 0xf8, 0x74, 0x19, 0xdf, 0xf8, + 0x74, 0x09, 0x10, 0xf0, 0x63, 0xf9, 0x00, 0x20, 0x0e, 0xbd, 0x2d, 0xe9, + 0xf8, 0x4f, 0xdf, 0xf8, 0x68, 0x09, 0x06, 0x7c, 0x94, 0xb0, 0xd0, 0xe9, + 0x00, 0x49, 0x05, 0x7b, 0x90, 0xf8, 0x08, 0x80, 0xfe, 0xf7, 0x21, 0xf8, + 0x0e, 0x90, 0x47, 0x46, 0xef, 0xf7, 0x81, 0xfe, 0x00, 0xea, 0x08, 0x08, + 0xef, 0xf7, 0x7c, 0xfe, 0x05, 0x40, 0xef, 0xf7, 0x7b, 0xfe, 0x06, 0x40, + 0x02, 0x96, 0xef, 0xf7, 0x83, 0xfe, 0x07, 0x40, 0x05, 0x97, 0x2b, 0x46, + 0x02, 0x98, 0x00, 0x90, 0x42, 0x46, 0x20, 0x46, 0x49, 0x46, 0x10, 0xf0, + 0xb9, 0xff, 0x06, 0x00, 0x03, 0xa8, 0x4f, 0xf0, 0x00, 0x0b, 0xc0, 0xe9, + 0x00, 0xbb, 0x06, 0xd1, 0x03, 0xa9, 0x28, 0x46, 0xf9, 0xf7, 0x7d, 0xfb, + 0x28, 0x46, 0xf9, 0xf7, 0x68, 0xfb, 0x00, 0x23, 0xdf, 0xf8, 0x04, 0x29, + 0x00, 0x20, 0x00, 0x27, 0x47, 0xf6, 0x30, 0x6c, 0x94, 0x44, 0x0c, 0xeb, + 0xc3, 0x01, 0x47, 0xf6, 0x10, 0x6c, 0xc1, 0xe9, 0x00, 0x00, 0x94, 0x44, + 0x4c, 0xf8, 0x23, 0x70, 0x5b, 0x1c, 0x08, 0x2b, 0xf0, 0xd3, 0x00, 0x23, + 0x47, 0xf6, 0xb4, 0x6e, 0x96, 0x44, 0x0e, 0xeb, 0xc3, 0x01, 0xcd, 0xf8, + 0x2c, 0xe0, 0xc1, 0xe9, 0x00, 0x00, 0x5b, 0x1c, 0x08, 0x2b, 0xf3, 0xd3, + 0xdf, 0xf8, 0xc8, 0x18, 0x07, 0x91, 0xcd, 0xf8, 0x18, 0xc0, 0xbe, 0xbb, + 0xdf, 0xf8, 0xb4, 0x18, 0x0a, 0x69, 0x8e, 0x68, 0xcb, 0x68, 0x0d, 0x92, + 0xd1, 0xe9, 0x00, 0x01, 0x0c, 0x93, 0x4f, 0xf0, 0xff, 0x33, 0xdf, 0xf8, + 0xac, 0x28, 0x02, 0x40, 0x0b, 0x40, 0x08, 0xbf, 0x00, 0x2a, 0xdc, 0x46, + 0x03, 0xd1, 0x00, 0x29, 0x08, 0xbf, 0x00, 0x28, 0x09, 0xd1, 0xcd, 0xe9, + 0x00, 0x01, 0x0f, 0xf6, 0x0c, 0x12, 0xff, 0x21, 0x03, 0x20, 0xef, 0xf7, + 0x34, 0xff, 0x4f, 0xf6, 0x17, 0x7c, 0x0c, 0x99, 0x0d, 0x98, 0x0e, 0x43, + 0x06, 0x43, 0x07, 0xd1, 0x0f, 0xf6, 0x04, 0x12, 0xff, 0x21, 0x03, 0x20, + 0xef, 0xf7, 0x27, 0xff, 0x4f, 0xf6, 0x16, 0x7c, 0x5f, 0xea, 0x0c, 0x06, + 0x06, 0xd0, 0x06, 0x99, 0x07, 0x98, 0x00, 0x96, 0xff, 0x23, 0x13, 0x22, + 0x00, 0xf0, 0x2a, 0xf9, 0x40, 0x46, 0xfc, 0xf7, 0x17, 0xfa, 0x28, 0x46, + 0xfc, 0xf7, 0x1a, 0xfa, 0x02, 0x98, 0xfc, 0xf7, 0x1d, 0xfa, 0x00, 0x21, + 0x28, 0x46, 0xfb, 0xf7, 0xbc, 0xfc, 0x4e, 0xb9, 0x08, 0xa9, 0x28, 0x46, + 0x11, 0xf0, 0x09, 0xf9, 0x28, 0x46, 0x11, 0xf0, 0x1d, 0xf9, 0x06, 0x46, + 0x4f, 0xf0, 0x01, 0x0b, 0xcd, 0xe9, 0x0c, 0x49, 0xcd, 0xf8, 0x00, 0x80, + 0x00, 0x20, 0xa8, 0x46, 0x34, 0x46, 0x81, 0x46, 0x00, 0x2c, 0x08, 0xbf, + 0x00, 0x28, 0x73, 0xd1, 0xdf, 0xf8, 0x0c, 0x08, 0x5f, 0xfa, 0x89, 0xf1, + 0x08, 0x44, 0x00, 0x21, 0x05, 0x7e, 0x05, 0xf0, 0x1f, 0x06, 0x01, 0x20, + 0x32, 0x46, 0x11, 0xf0, 0x37, 0xf9, 0xcd, 0xe9, 0x10, 0x01, 0x0e, 0x2e, + 0x06, 0xd1, 0x08, 0xa9, 0x40, 0x46, 0x11, 0xf0, 0x13, 0xf9, 0x04, 0x46, + 0x4f, 0xf0, 0x00, 0x0b, 0x13, 0x2d, 0x51, 0xd2, 0x24, 0x22, 0xdf, 0xf8, + 0xdc, 0x17, 0x12, 0xfb, 0x06, 0xf2, 0x8f, 0x18, 0x78, 0x68, 0x00, 0x28, + 0x48, 0xd0, 0xdd, 0xe9, 0x0c, 0x23, 0xdd, 0xe9, 0x10, 0x01, 0x10, 0x40, + 0x19, 0x40, 0x08, 0xbf, 0x00, 0x28, 0x3f, 0xd0, 0x00, 0x2c, 0x3d, 0xd1, + 0xdf, 0xf8, 0xb8, 0x07, 0x50, 0xf8, 0x26, 0x00, 0x00, 0x25, 0xc1, 0x07, + 0x48, 0xbf, 0x00, 0x9d, 0x81, 0x07, 0x48, 0xbf, 0x48, 0xea, 0x05, 0x05, + 0x42, 0x07, 0x44, 0xbf, 0x02, 0x99, 0x0d, 0x43, 0x00, 0x07, 0x48, 0xbf, + 0x05, 0x9d, 0x39, 0x6a, 0x7a, 0x68, 0x28, 0x46, 0x90, 0x47, 0x04, 0x46, + 0xdf, 0xf8, 0x80, 0x07, 0x01, 0x7d, 0x00, 0x27, 0x01, 0x29, 0x4f, 0xf0, + 0x00, 0x0a, 0x0e, 0xd1, 0x40, 0x7d, 0x28, 0xb9, 0x4f, 0xf6, 0x71, 0x7a, + 0x01, 0x27, 0x0f, 0xf6, 0x78, 0x03, 0x02, 0xe0, 0x01, 0x27, 0x0f, 0xf6, + 0x68, 0x03, 0x0f, 0xf6, 0x54, 0x02, 0x00, 0xf0, 0xaa, 0xfa, 0x07, 0xb1, + 0x54, 0x46, 0x00, 0x2c, 0x51, 0xd1, 0x0b, 0x98, 0x2a, 0x46, 0x31, 0x46, + 0x00, 0xf0, 0x82, 0xf8, 0x2a, 0x46, 0x31, 0x46, 0xdf, 0xf8, 0x48, 0x07, + 0x00, 0xf0, 0x7c, 0xf8, 0x0a, 0xf0, 0xe4, 0xf8, 0x09, 0xf1, 0x01, 0x09, + 0x5f, 0xfa, 0x89, 0xf1, 0x13, 0x29, 0x87, 0xdb, 0x01, 0x21, 0x40, 0x46, + 0xfb, 0xf7, 0x2d, 0xfc, 0xbb, 0xf1, 0x00, 0x0f, 0x03, 0xd0, 0x08, 0xa9, + 0x40, 0x46, 0x11, 0xf0, 0xa9, 0xf8, 0xef, 0xf7, 0x5a, 0xfd, 0xfc, 0xf7, + 0x76, 0xf9, 0xef, 0xf7, 0x55, 0xfd, 0xfc, 0xf7, 0x78, 0xf9, 0xef, 0xf7, + 0x53, 0xfd, 0xfc, 0xf7, 0x7a, 0xf9, 0x03, 0xa9, 0x40, 0x46, 0xf9, 0xf7, + 0x79, 0xfa, 0x10, 0xf0, 0x29, 0xff, 0x04, 0xb9, 0x04, 0x46, 0x0e, 0x98, + 0xf9, 0xf7, 0xea, 0xfc, 0xdf, 0xf8, 0xf0, 0x16, 0xdf, 0xf8, 0xf0, 0x26, + 0x08, 0x60, 0xdd, 0xe9, 0x0c, 0x31, 0x00, 0x90, 0x01, 0x94, 0xff, 0x21, + 0x03, 0x20, 0xef, 0xf7, 0x54, 0xfe, 0x61, 0x1e, 0xdf, 0xf8, 0xb4, 0x06, + 0x89, 0x41, 0xc9, 0x0f, 0x41, 0x75, 0xbf, 0xf3, 0x5f, 0x8f, 0x00, 0x22, + 0x02, 0x75, 0x01, 0x20, 0x00, 0xf0, 0x74, 0xf8, 0x15, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0xb9, 0x46, 0x00, 0x27, 0x25, 0xfa, 0x07, 0xf0, 0xc0, 0x07, + 0x22, 0xd5, 0x14, 0x21, 0x00, 0x20, 0x01, 0x91, 0x00, 0x90, 0x01, 0xab, + 0x0f, 0xaa, 0x39, 0x46, 0x30, 0x46, 0x00, 0xf0, 0xe6, 0xf8, 0xb9, 0xf1, + 0x00, 0x0f, 0x1c, 0xbf, 0x50, 0x46, 0xcd, 0xf8, 0x3c, 0xa0, 0x01, 0x23, + 0xbb, 0x40, 0x00, 0x28, 0x04, 0xbf, 0x0f, 0x98, 0xb0, 0xf1, 0x00, 0x4f, + 0x00, 0xd0, 0x18, 0xb9, 0x00, 0x20, 0x00, 0x90, 0x13, 0x22, 0x01, 0xe0, + 0x00, 0x90, 0x32, 0x46, 0x06, 0x99, 0x07, 0x98, 0x00, 0xf0, 0x2a, 0xf8, + 0x7f, 0x1c, 0x08, 0x2f, 0xd5, 0xd3, 0x00, 0x94, 0x33, 0x46, 0x0f, 0xf2, + 0xe8, 0x62, 0xff, 0x21, 0x01, 0x20, 0xef, 0xf7, 0x10, 0xfe, 0x8b, 0xe7, + 0x2d, 0xe9, 0xf0, 0x43, 0x06, 0x46, 0x89, 0x46, 0x90, 0x46, 0x00, 0x27, + 0x28, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x0e, 0xd5, 0x06, 0xeb, 0xc7, 0x00, + 0x00, 0x21, 0xd0, 0xe9, 0x00, 0x45, 0x01, 0x20, 0x4a, 0x46, 0x11, 0xf0, + 0x49, 0xf8, 0x06, 0xeb, 0xc7, 0x02, 0x20, 0x43, 0x29, 0x43, 0xc2, 0xe9, + 0x00, 0x01, 0x7f, 0x1c, 0x08, 0x2f, 0xe9, 0xd3, 0xbd, 0xe8, 0xf0, 0x83, + 0x2d, 0xe9, 0xf8, 0x43, 0x08, 0x9e, 0x04, 0x46, 0x88, 0x46, 0x15, 0x46, + 0x99, 0x46, 0x00, 0x27, 0x29, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x0c, 0xd5, + 0x13, 0x2d, 0x08, 0xd0, 0x01, 0x20, 0x00, 0x21, 0x2a, 0x46, 0x11, 0xf0, + 0x2b, 0xf8, 0x04, 0xeb, 0xc7, 0x02, 0xc2, 0xe9, 0x00, 0x01, 0x48, 0xf8, + 0x27, 0x60, 0x7f, 0x1c, 0x08, 0x2f, 0xeb, 0xd3, 0xbd, 0xe8, 0xf1, 0x83, + 0xf8, 0xb5, 0x04, 0x46, 0x47, 0xf6, 0xf4, 0x66, 0xdf, 0xf8, 0xb0, 0x75, + 0x31, 0x46, 0x38, 0x46, 0xe2, 0xf7, 0x2c, 0xfd, 0x00, 0x25, 0x24, 0xb9, + 0xb9, 0x59, 0x88, 0x42, 0x02, 0xd0, 0x01, 0x25, 0x00, 0xe0, 0xb8, 0x51, + 0x28, 0x46, 0xf2, 0xbd, 0x70, 0xb5, 0xdf, 0xf8, 0x8c, 0x65, 0x33, 0x7d, + 0x83, 0xb9, 0xdd, 0xe9, 0x04, 0x45, 0xb0, 0x60, 0xc6, 0xe9, 0x00, 0x45, + 0xf1, 0x60, 0x00, 0x20, 0x32, 0x61, 0x70, 0x75, 0x01, 0x21, 0x31, 0x75, + 0xdf, 0xf8, 0x64, 0x05, 0x10, 0xf0, 0x8c, 0xf8, 0x00, 0x20, 0x70, 0xbd, + 0x4f, 0xf6, 0x18, 0x70, 0x70, 0xbd, 0x70, 0xb5, 0x04, 0x9c, 0x05, 0x9d, + 0xdf, 0xf8, 0x64, 0x65, 0x30, 0x73, 0xf4, 0x80, 0xb5, 0x60, 0x32, 0x60, + 0x31, 0x61, 0xb3, 0x80, 0x06, 0xf1, 0x2c, 0x00, 0xbd, 0xe8, 0x70, 0x40, + 0x10, 0xf0, 0x49, 0xb8, 0xf8, 0xb5, 0xdf, 0xf8, 0x60, 0xc5, 0x00, 0xf0, + 0x1b, 0xf8, 0x48, 0x69, 0x20, 0xb1, 0xdf, 0xf8, 0x24, 0x05, 0x10, 0xf0, + 0x48, 0xf8, 0x01, 0xe0, 0x4f, 0xf6, 0x27, 0x75, 0x28, 0x46, 0xf2, 0xbd, + 0xf8, 0xb5, 0xdf, 0xf8, 0x44, 0xc5, 0x00, 0xf0, 0x0b, 0xf8, 0x88, 0x69, + 0x20, 0xb1, 0xdf, 0xf8, 0x04, 0x05, 0x10, 0xf0, 0x4e, 0xf8, 0x01, 0xe0, + 0x4f, 0xf6, 0x27, 0x75, 0x28, 0x46, 0xf2, 0xbd, 0x06, 0x9e, 0x07, 0x9c, + 0x08, 0x9f, 0xcc, 0xf8, 0x14, 0x10, 0xcc, 0xf8, 0x00, 0x20, 0xcc, 0xf8, + 0x04, 0x30, 0x24, 0x21, 0xdf, 0xf8, 0xf8, 0x34, 0x8c, 0xf8, 0x10, 0x00, + 0x4a, 0x43, 0x99, 0x18, 0xcc, 0xf8, 0x0c, 0x60, 0xcc, 0xf8, 0x08, 0x70, + 0xac, 0xf8, 0x18, 0x40, 0x00, 0x25, 0x70, 0x47, 0x80, 0xb5, 0xdf, 0xf8, + 0xc0, 0x04, 0x10, 0xf0, 0x74, 0xf8, 0x00, 0x20, 0x02, 0xbd, 0x80, 0xb5, + 0xe4, 0x22, 0xdf, 0xf8, 0xe8, 0x14, 0xe1, 0xf7, 0xab, 0xfb, 0x00, 0x20, + 0x02, 0xbd, 0xf8, 0xb5, 0x1e, 0x46, 0x24, 0x23, 0xdf, 0xf8, 0xb8, 0x74, + 0x04, 0x46, 0x5c, 0x43, 0x3c, 0x44, 0x15, 0x46, 0x08, 0x46, 0x22, 0x69, + 0x4f, 0xf6, 0x2a, 0x71, 0x52, 0xb1, 0x21, 0x6a, 0x06, 0x9b, 0x00, 0x91, + 0x29, 0x46, 0x01, 0x25, 0x24, 0x69, 0x32, 0x46, 0x05, 0xfa, 0x00, 0xf0, + 0xa0, 0x47, 0x01, 0x46, 0x08, 0x46, 0xf2, 0xbd, 0x10, 0xb5, 0xdf, 0xf8, + 0x74, 0x34, 0x1a, 0x7d, 0x22, 0xb9, 0x00, 0x24, 0x04, 0x70, 0x58, 0x7d, + 0x08, 0x70, 0x10, 0xbd, 0x01, 0x21, 0x01, 0x70, 0x10, 0xbd, 0xf8, 0xb5, + 0xdf, 0xf8, 0x80, 0x54, 0xdf, 0xf8, 0x68, 0x14, 0x2e, 0x68, 0x24, 0x22, + 0x84, 0xb0, 0x72, 0x43, 0x00, 0x24, 0x8f, 0x18, 0x03, 0x94, 0x78, 0x69, + 0xa0, 0xb1, 0x2c, 0x8b, 0xa9, 0x68, 0x22, 0x46, 0x05, 0xf1, 0x1c, 0x00, + 0xe1, 0xf7, 0x6c, 0xfb, 0x39, 0x6a, 0x00, 0xf0, 0x4e, 0xf8, 0x23, 0x46, + 0x00, 0x92, 0x01, 0x20, 0xec, 0x68, 0x69, 0x68, 0x7f, 0x69, 0x05, 0xf1, + 0x1c, 0x02, 0xa0, 0x40, 0xb8, 0x47, 0x04, 0x46, 0x0c, 0x2e, 0x06, 0xd1, + 0x00, 0x20, 0x11, 0xf0, 0xaf, 0xfa, 0xc0, 0xf1, 0x01, 0x00, 0xc0, 0xb2, + 0x50, 0xb1, 0x03, 0x98, 0x01, 0x90, 0x05, 0xf1, 0x1c, 0x01, 0x00, 0x91, + 0x23, 0x46, 0x69, 0x69, 0x28, 0x7c, 0x32, 0x46, 0x0c, 0xf0, 0x8a, 0xf9, + 0x05, 0xb0, 0xf0, 0xbd, 0xf8, 0xb5, 0xdf, 0xf8, 0x14, 0x44, 0xdf, 0xf8, + 0xf8, 0x23, 0x25, 0x68, 0x24, 0x23, 0x84, 0xb0, 0x6b, 0x43, 0x00, 0x20, + 0xd6, 0x18, 0x03, 0x90, 0xb1, 0x69, 0x89, 0xb1, 0x27, 0x8b, 0xa1, 0x68, + 0x3a, 0x46, 0x04, 0xf1, 0x1c, 0x00, 0xe1, 0xf7, 0x33, 0xfb, 0x31, 0x6a, + 0x00, 0xf0, 0x15, 0xf8, 0x00, 0x92, 0x61, 0x68, 0xe0, 0x68, 0xb6, 0x69, + 0x3b, 0x46, 0x04, 0xf1, 0x1c, 0x02, 0xb0, 0x47, 0x03, 0x99, 0x01, 0x91, + 0x04, 0xf1, 0x1c, 0x02, 0x00, 0x92, 0x03, 0x46, 0x61, 0x69, 0x20, 0x7c, + 0x2a, 0x46, 0x0c, 0xf0, 0x66, 0xf9, 0x05, 0xb0, 0xf0, 0xbd, 0x02, 0x91, + 0x4f, 0xf4, 0x80, 0x70, 0x01, 0x90, 0x03, 0xaa, 0x70, 0x47, 0xf8, 0xb5, + 0x00, 0x25, 0xdf, 0xf8, 0x98, 0x43, 0x54, 0xf8, 0x25, 0x00, 0x60, 0xb9, + 0x2b, 0x46, 0x04, 0xf1, 0x70, 0x02, 0xff, 0x21, 0x01, 0x20, 0xef, 0xf7, + 0xac, 0xfc, 0x03, 0x22, 0x4f, 0xf6, 0x0f, 0x71, 0x01, 0x20, 0xfd, 0xf7, + 0x1d, 0xf8, 0x6d, 0x1c, 0x13, 0x2d, 0xec, 0xd3, 0xdf, 0xf8, 0x68, 0x63, + 0x00, 0x25, 0x24, 0x27, 0x6f, 0x43, 0xf0, 0x59, 0xa0, 0xb1, 0x54, 0xf8, + 0x25, 0x10, 0x00, 0x20, 0x01, 0x29, 0x06, 0xd0, 0x02, 0x29, 0x07, 0xd0, + 0x04, 0x29, 0x08, 0xbf, 0xef, 0xf7, 0x76, 0xfb, 0x04, 0xe0, 0xef, 0xf7, + 0x72, 0xfb, 0x01, 0xe0, 0xef, 0xf7, 0x6e, 0xfb, 0xf1, 0x19, 0xf2, 0x59, + 0x09, 0x6a, 0x90, 0x47, 0x6d, 0x1c, 0x13, 0x2d, 0xe3, 0xd3, 0xe4, 0x21, + 0xdf, 0xf8, 0x44, 0x03, 0xf3, 0xf7, 0x04, 0xf9, 0xc3, 0x48, 0x00, 0x21, + 0x01, 0x75, 0x41, 0x75, 0x01, 0x21, 0x81, 0x75, 0xf1, 0xbd, 0xc0, 0x48, + 0x80, 0x7d, 0x70, 0x47, 0x70, 0xb5, 0xc2, 0x4c, 0xc2, 0x49, 0x25, 0x68, + 0x24, 0x22, 0x6a, 0x43, 0x8e, 0x18, 0xb0, 0x68, 0x38, 0xb1, 0x33, 0x6a, + 0xa2, 0x68, 0xe1, 0x88, 0xa0, 0x88, 0xb6, 0x68, 0xb0, 0x47, 0x03, 0x46, + 0x01, 0xe0, 0x4f, 0xf6, 0x28, 0x73, 0x21, 0x69, 0x20, 0x7b, 0x2a, 0x46, + 0xbd, 0xe8, 0x70, 0x40, 0x0c, 0xf0, 0xef, 0xb8, 0x38, 0xb5, 0x0c, 0x46, + 0x11, 0x46, 0x1a, 0x46, 0x24, 0x23, 0xb4, 0x4d, 0x58, 0x43, 0x05, 0x44, + 0xe8, 0x68, 0x20, 0xb1, 0x20, 0x46, 0x2b, 0x6a, 0xec, 0x68, 0xa0, 0x47, + 0x32, 0xbd, 0x4f, 0xf6, 0x29, 0x70, 0x32, 0xbd, 0xf8, 0xb5, 0x04, 0x46, + 0xab, 0x4f, 0x0d, 0x46, 0x16, 0x46, 0x07, 0xf1, 0x2c, 0x00, 0x0f, 0xf0, + 0xa7, 0xff, 0x00, 0x07, 0x02, 0xd5, 0x4f, 0xf6, 0x2f, 0x70, 0xf2, 0xbd, + 0x00, 0x96, 0x2b, 0x46, 0x22, 0x46, 0x13, 0x21, 0x07, 0xf1, 0x18, 0x00, + 0xf9, 0xf7, 0xf7, 0xfa, 0xf2, 0xbd, 0x80, 0xb5, 0x00, 0x92, 0x0b, 0x46, + 0x02, 0x46, 0x13, 0x21, 0xa7, 0x48, 0xf9, 0xf7, 0xd9, 0xfa, 0x02, 0xbd, + 0x19, 0xb1, 0x9c, 0x48, 0x40, 0x6b, 0x11, 0xf0, 0x43, 0xbb, 0x70, 0x47, + 0x70, 0xb5, 0x04, 0x46, 0x00, 0x25, 0x0f, 0xf2, 0x18, 0x36, 0x24, 0xfa, + 0x05, 0xf0, 0xc0, 0x07, 0x08, 0xd5, 0x28, 0x46, 0xef, 0xf7, 0x18, 0xfb, + 0xff, 0x28, 0x03, 0xd0, 0x2b, 0x46, 0x32, 0x46, 0x00, 0xf0, 0x21, 0xf8, + 0x6d, 0x1c, 0x08, 0x2d, 0xef, 0xd3, 0x4f, 0xf4, 0xfa, 0x70, 0xfd, 0xf7, + 0xc6, 0xfa, 0x2b, 0x46, 0x0f, 0xf2, 0xfc, 0x22, 0x00, 0xf0, 0x15, 0xf8, + 0x01, 0x22, 0xe1, 0xb2, 0x02, 0x20, 0x11, 0xf0, 0x3d, 0xfa, 0x38, 0xb1, + 0x01, 0x22, 0x21, 0x46, 0x02, 0x20, 0x11, 0xf0, 0x5f, 0xfa, 0x01, 0x20, + 0xfd, 0xf7, 0xb3, 0xfa, 0x02, 0x22, 0x21, 0x46, 0x02, 0x20, 0x11, 0xf0, + 0x57, 0xfa, 0x00, 0x20, 0x70, 0xbd, 0xff, 0x21, 0x03, 0x20, 0xef, 0xf7, + 0xec, 0xbb, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x46, 0x4f, 0xea, 0x04, 0x03, + 0xb2, 0xa2, 0xff, 0xf7, 0xf4, 0xff, 0x01, 0x20, 0xfd, 0xf7, 0x9d, 0xfa, + 0x00, 0x25, 0x00, 0x26, 0x24, 0xfa, 0x06, 0xf0, 0xc0, 0x07, 0x0a, 0xd5, + 0x30, 0x46, 0xef, 0xf7, 0xd9, 0xfa, 0xff, 0x28, 0x05, 0xd0, 0x06, 0x2e, + 0x16, 0xbf, 0x07, 0x2e, 0x4f, 0xf6, 0x51, 0x75, 0x00, 0x25, 0x76, 0x1c, + 0x07, 0x2e, 0xed, 0xd9, 0x01, 0x22, 0xe1, 0xb2, 0x03, 0x20, 0x11, 0xf0, + 0x05, 0xfa, 0x38, 0xb1, 0x01, 0x22, 0x21, 0x46, 0x03, 0x20, 0x11, 0xf0, + 0x27, 0xfa, 0x01, 0x20, 0xfd, 0xf7, 0x7b, 0xfa, 0x02, 0x22, 0x21, 0x46, + 0x03, 0x20, 0x11, 0xf0, 0x1f, 0xfa, 0x28, 0x46, 0x70, 0xbd, 0x2d, 0xe9, + 0xf8, 0x41, 0x89, 0xb0, 0x88, 0x46, 0x16, 0x46, 0x1d, 0x46, 0x09, 0xf0, + 0x0f, 0xfe, 0x04, 0x46, 0x14, 0x21, 0x04, 0xa8, 0xf3, 0xf7, 0x30, 0xf8, + 0x02, 0xa8, 0x00, 0x27, 0xc0, 0xe9, 0x00, 0x77, 0xcd, 0xe9, 0x00, 0x77, + 0x84, 0xb9, 0x64, 0x49, 0x64, 0x4a, 0x65, 0x48, 0x05, 0x91, 0x06, 0x92, + 0x04, 0x90, 0x64, 0x49, 0x64, 0x4a, 0x07, 0x91, 0x08, 0x92, 0x64, 0x49, + 0x64, 0x4a, 0x02, 0x91, 0x03, 0x92, 0x64, 0x49, 0x64, 0x4a, 0x11, 0xe0, + 0x05, 0x2c, 0x11, 0xd1, 0x63, 0x49, 0x64, 0x4a, 0x64, 0x48, 0x05, 0x91, + 0x06, 0x92, 0x04, 0x90, 0x63, 0x49, 0x64, 0x4a, 0x07, 0x91, 0x08, 0x92, + 0x63, 0x49, 0x64, 0x4a, 0x02, 0x91, 0x03, 0x92, 0x63, 0x49, 0x64, 0x4a, + 0x00, 0x91, 0x01, 0x92, 0x1d, 0xb1, 0x02, 0x2d, 0x0f, 0xd0, 0x0b, 0xd3, + 0x0f, 0xe0, 0x04, 0xa9, 0x14, 0x24, 0x30, 0x68, 0xa0, 0x42, 0x0d, 0xd3, + 0x22, 0x46, 0x40, 0x46, 0xe1, 0xf7, 0xcc, 0xf9, 0x34, 0x60, 0x09, 0xe0, + 0x02, 0xa9, 0x08, 0x24, 0xf3, 0xe7, 0x69, 0x46, 0xfb, 0xe7, 0x4f, 0xf6, + 0x2a, 0x77, 0x01, 0xe0, 0x4f, 0xf6, 0x26, 0x77, 0x38, 0x46, 0x0a, 0xb0, + 0xbd, 0xe8, 0xf0, 0x81, 0x2d, 0xe9, 0xf8, 0x41, 0x85, 0xb0, 0x88, 0x46, + 0x16, 0x46, 0x1f, 0x46, 0x09, 0xf0, 0xb8, 0xfd, 0x00, 0x25, 0x04, 0x46, + 0xff, 0xb9, 0x14, 0x21, 0x68, 0x46, 0xf2, 0xf7, 0xd7, 0xff, 0xd4, 0xb1, + 0x06, 0x2c, 0x18, 0xbf, 0x07, 0x2c, 0x0b, 0xd1, 0x68, 0x46, 0x09, 0xf0, + 0x92, 0xfd, 0x06, 0x2c, 0x14, 0xbf, 0x4f, 0xf6, 0x51, 0x71, 0x4b, 0xf2, + 0x02, 0x11, 0x68, 0x46, 0x09, 0xf0, 0x8d, 0xfd, 0x30, 0x68, 0x14, 0x28, + 0x0a, 0xd3, 0x14, 0x22, 0x69, 0x46, 0x40, 0x46, 0xe1, 0xf7, 0x94, 0xf9, + 0x14, 0x20, 0x30, 0x60, 0x04, 0xe0, 0x4f, 0xf6, 0x2a, 0x75, 0x01, 0xe0, + 0x4f, 0xf6, 0x26, 0x75, 0x28, 0x46, 0x06, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, + 0x00, 0x20, 0x61, 0xb9, 0x01, 0x99, 0x13, 0x78, 0x99, 0x42, 0x0a, 0xd3, + 0x00, 0x21, 0x01, 0xe0, 0x51, 0x54, 0x49, 0x1c, 0x99, 0x42, 0xfb, 0xd3, + 0x00, 0x99, 0x0b, 0x60, 0x70, 0x47, 0x4f, 0xf6, 0x27, 0x70, 0x70, 0x47, + 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x11, 0xf0, 0xa5, 0xfa, 0x10, 0xb1, + 0x12, 0x48, 0x04, 0x75, 0x45, 0x75, 0x31, 0xbd, 0x38, 0xb5, 0x2c, 0x4c, + 0x04, 0x9d, 0x04, 0x40, 0x18, 0xbf, 0x01, 0x24, 0x1c, 0x70, 0x40, 0xf6, + 0x08, 0x01, 0x29, 0x4b, 0x03, 0x40, 0x18, 0xbf, 0x01, 0x23, 0x08, 0x40, + 0x13, 0x70, 0x18, 0xbf, 0x01, 0x20, 0x28, 0x70, 0x31, 0xbd, 0x00, 0x00, + 0xa0, 0x91, 0x04, 0x01, 0x08, 0x44, 0x00, 0x20, 0xf7, 0xf5, 0x02, 0x01, + 0x98, 0x76, 0x02, 0x20, 0xc0, 0x77, 0x02, 0x20, 0xf0, 0xf5, 0x02, 0x20, + 0x00, 0x21, 0xfc, 0xff, 0xdc, 0x43, 0x00, 0x20, 0xd4, 0x7a, 0x04, 0x01, + 0xec, 0x87, 0x04, 0x01, 0x34, 0xf6, 0x02, 0x20, 0x30, 0xf6, 0x02, 0x20, + 0x38, 0x88, 0x04, 0x01, 0x84, 0x5b, 0x02, 0x20, 0xa0, 0x5c, 0x02, 0x20, + 0xd0, 0xf5, 0x02, 0x20, 0xf4, 0x43, 0x00, 0x20, 0xbe, 0xba, 0x01, 0x00, + 0xed, 0xfe, 0x01, 0x00, 0xef, 0xbe, 0x01, 0x00, 0xad, 0xba, 0x01, 0x00, + 0xad, 0xda, 0x01, 0x00, 0xfe, 0xca, 0x01, 0x00, 0x0d, 0xf0, 0x01, 0x00, + 0xad, 0xde, 0x01, 0x00, 0xce, 0xfa, 0x01, 0x00, 0xbe, 0xba, 0x02, 0x00, + 0xed, 0xfe, 0x02, 0x00, 0xef, 0xbe, 0x02, 0x00, 0xad, 0xba, 0x02, 0x00, + 0xad, 0xda, 0x02, 0x00, 0xfe, 0xca, 0x02, 0x00, 0x0d, 0xf0, 0x02, 0x00, + 0xad, 0xde, 0x02, 0x00, 0xce, 0xfa, 0x02, 0x00, 0xf0, 0x4e, 0x02, 0x00, + 0x06, 0x00, 0x04, 0x00, 0x21, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x63, 0x61, + 0x6c, 0x4d, 0x61, 0x73, 0x6b, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x00, + 0x63, 0x68, 0x61, 0x6e, 0x4d, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x3d, 0x3d, + 0x20, 0x30, 0x0a, 0x00, 0x69, 0x6e, 0x69, 0x74, 0x3a, 0x20, 0x6f, 0x62, + 0x6a, 0x49, 0x64, 0x20, 0x30, 0x78, 0x25, 0x58, 0x2c, 0x20, 0x65, 0x72, + 0x72, 0x20, 0x25, 0x58, 0x0a, 0x00, 0x00, 0x00, 0x54, 0x65, 0x73, 0x74, + 0x43, 0x61, 0x6c, 0x30, 0x3a, 0x20, 0x63, 0x68, 0x20, 0x25, 0x64, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x6c, 0x30, + 0x3a, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x0a, 0x00, 0x54, 0x65, 0x73, 0x74, + 0x43, 0x61, 0x6c, 0x31, 0x3a, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x73, 0x20, 0x30, 0x78, 0x25, 0x58, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x6e, 0x69, 0x74, 0x3a, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x20, + 0x25, 0x73, 0x0a, 0x00, 0x50, 0x41, 0x53, 0x53, 0x00, 0x00, 0x00, 0x00, + 0x46, 0x41, 0x49, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x83, 0xf8, 0x01, 0x01, + 0x9b, 0xf2, 0x01, 0x01, 0x0d, 0xf9, 0x01, 0x01, 0xab, 0xf7, 0x01, 0x01, + 0x1d, 0xf8, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, + 0x84, 0xb0, 0x0b, 0xb1, 0x00, 0x24, 0x1c, 0x60, 0x04, 0x46, 0xa0, 0x46, + 0x01, 0xe0, 0x08, 0xf1, 0x01, 0x08, 0x98, 0xf8, 0x00, 0x00, 0xa0, 0xf1, + 0x09, 0x03, 0x05, 0x2b, 0xf7, 0xd3, 0x20, 0x28, 0xf5, 0xd0, 0x2d, 0x28, + 0x16, 0xbf, 0x2b, 0x28, 0x18, 0xf8, 0x01, 0x5b, 0x2b, 0x25, 0x00, 0x2a, + 0x01, 0x91, 0x03, 0xd4, 0x01, 0x2a, 0x01, 0xd0, 0x25, 0x2a, 0x03, 0xdb, + 0x00, 0x29, 0x59, 0xd0, 0x0c, 0x60, 0x57, 0xe0, 0x00, 0x2a, 0x0c, 0xdd, + 0x10, 0x2a, 0x04, 0xbf, 0x98, 0xf8, 0x00, 0x00, 0x30, 0x28, 0x02, 0xbf, + 0x98, 0xf8, 0x01, 0x00, 0x40, 0xf0, 0x20, 0x00, 0x78, 0x28, 0x11, 0xd1, + 0x0c, 0xe0, 0x98, 0xf8, 0x00, 0x00, 0x30, 0x28, 0x18, 0xbf, 0x0a, 0x22, + 0x0a, 0xd1, 0x98, 0xf8, 0x01, 0x00, 0x40, 0xf0, 0x20, 0x00, 0x78, 0x28, + 0x03, 0xd1, 0x10, 0x22, 0x08, 0xf1, 0x02, 0x08, 0x00, 0xe0, 0x08, 0x22, + 0xcd, 0xf8, 0x0c, 0x80, 0x01, 0xe0, 0x08, 0xf1, 0x01, 0x08, 0x98, 0xf8, + 0x00, 0x00, 0x30, 0x28, 0xf9, 0xd0, 0x07, 0x4e, 0x7e, 0x44, 0x18, 0x36, + 0x4f, 0xf0, 0x00, 0x09, 0x06, 0xf1, 0x28, 0x00, 0xcd, 0xf8, 0x08, 0x80, + 0xca, 0x46, 0x8d, 0xf8, 0x00, 0x00, 0x17, 0x46, 0x0c, 0xe0, 0x00, 0xbf, + 0xb0, 0x21, 0xfe, 0xff, 0x9d, 0xf8, 0x00, 0x10, 0x40, 0x1a, 0xca, 0x46, + 0x5f, 0xfa, 0x80, 0xfb, 0x07, 0xfb, 0x09, 0xb9, 0x08, 0xf1, 0x01, 0x08, + 0x98, 0xf8, 0x00, 0x10, 0xa1, 0xf1, 0x41, 0x00, 0x1a, 0x28, 0x38, 0xbf, + 0x20, 0x31, 0x3a, 0x46, 0x06, 0xf1, 0x28, 0x00, 0x11, 0xf0, 0x7a, 0xf9, + 0x00, 0x28, 0xe7, 0xd1, 0x03, 0x99, 0x41, 0x45, 0x04, 0xd1, 0x01, 0x98, + 0x00, 0xb1, 0x04, 0x60, 0x00, 0x20, 0x20, 0xe0, 0x02, 0x99, 0xf0, 0x5d, + 0xa8, 0xeb, 0x01, 0x01, 0x08, 0x1a, 0x00, 0x28, 0x10, 0xd4, 0x06, 0xdc, + 0xb9, 0xeb, 0x0b, 0x01, 0x03, 0xd3, 0xb1, 0xfb, 0xf7, 0xf0, 0x50, 0x45, + 0x08, 0xd0, 0xaf, 0xf3, 0x00, 0x80, 0x04, 0x98, 0x08, 0xb1, 0x01, 0x21, + 0x01, 0x60, 0x4f, 0xf0, 0xff, 0x39, 0x03, 0xe0, 0x2d, 0x2d, 0x08, 0xbf, + 0xc9, 0xf1, 0x00, 0x09, 0x01, 0x98, 0x08, 0xb1, 0xc0, 0xf8, 0x00, 0x80, + 0x48, 0x46, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0xff, 0xe7, 0x00, 0x23, + 0x0a, 0x22, 0x00, 0x21, 0x58, 0xe7, 0x00, 0x00, 0x80, 0xb5, 0x2d, 0xed, + 0x02, 0x8b, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x8a, 0xed, 0xf7, + 0xa4, 0xfa, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xdf, 0xed, + 0x06, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0x9f, 0xed, 0x05, 0x1a, 0x20, 0xee, + 0x01, 0x1a, 0x88, 0xee, 0x01, 0x0a, 0xbd, 0xec, 0x02, 0x8b, 0x01, 0xbd, + 0x28, 0x6b, 0x6e, 0x4e, 0x00, 0x00, 0x00, 0x3d, 0x2d, 0xe9, 0xf0, 0x41, + 0x17, 0x46, 0x80, 0x46, 0x86, 0xb0, 0x38, 0x88, 0x0d, 0x9c, 0xad, 0xf8, + 0x10, 0x00, 0x0e, 0x46, 0x3a, 0x88, 0xad, 0xf8, 0x12, 0x20, 0x1d, 0x46, + 0x8d, 0xf8, 0x14, 0x80, 0x04, 0xa8, 0xed, 0xf7, 0x0b, 0xf8, 0x06, 0x21, + 0x00, 0x22, 0x01, 0x2e, 0x8d, 0xf8, 0x05, 0x80, 0x8d, 0xf8, 0x03, 0x10, + 0x8d, 0xf8, 0x02, 0x20, 0x08, 0xbf, 0x04, 0x20, 0x05, 0xd0, 0x08, 0x20, + 0x01, 0x2c, 0x8d, 0xf8, 0x01, 0x00, 0x02, 0xd1, 0x0a, 0x20, 0x8d, 0xf8, + 0x01, 0x00, 0x01, 0x2e, 0x8d, 0xf8, 0x00, 0x20, 0x8d, 0xf8, 0x0d, 0x80, + 0x8d, 0xf8, 0x0b, 0x10, 0x8d, 0xf8, 0x0a, 0x20, 0x03, 0xd1, 0x01, 0x20, + 0x8d, 0xf8, 0x09, 0x00, 0x07, 0xe0, 0x02, 0x20, 0x8d, 0xf8, 0x09, 0x00, + 0x01, 0x2c, 0x04, 0xbf, 0x05, 0x22, 0x8d, 0xf8, 0x09, 0x20, 0x01, 0x21, + 0x8d, 0xf8, 0x08, 0x10, 0x78, 0x7a, 0x02, 0x28, 0x23, 0xd1, 0x02, 0x2d, + 0x04, 0xd1, 0x03, 0x21, 0x8d, 0xf8, 0x03, 0x10, 0x8d, 0xf8, 0x0b, 0x10, + 0x01, 0x2c, 0xb8, 0x7a, 0xa0, 0xf1, 0x1c, 0x01, 0x8d, 0xf8, 0x04, 0x10, + 0xb8, 0x7a, 0xa0, 0xf1, 0x20, 0x01, 0x8d, 0xf8, 0x0c, 0x10, 0x23, 0xd1, + 0xb8, 0x7a, 0x01, 0x28, 0x06, 0xd1, 0xe4, 0x21, 0xe1, 0x22, 0x8d, 0xf8, + 0x04, 0x10, 0x8d, 0xf8, 0x0c, 0x20, 0x19, 0xe0, 0xc6, 0x21, 0xd2, 0x22, + 0x8d, 0xf8, 0x0c, 0x10, 0x8d, 0xf8, 0x04, 0x20, 0x12, 0xe0, 0x0c, 0x98, + 0xba, 0x7a, 0x02, 0xeb, 0x80, 0x02, 0xa2, 0xf1, 0x20, 0x03, 0x00, 0x22, + 0x02, 0x2d, 0x8d, 0xf8, 0x04, 0x30, 0x8d, 0xf8, 0x0c, 0x20, 0x05, 0xd1, + 0x01, 0x28, 0x12, 0xbf, 0x00, 0x28, 0x03, 0x20, 0x8d, 0xf8, 0x03, 0x00, + 0x68, 0x46, 0xec, 0xf7, 0xad, 0xff, 0x02, 0xa8, 0xec, 0xf7, 0xaa, 0xff, + 0x40, 0x46, 0xed, 0xf7, 0xc5, 0xf9, 0x06, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, + 0x2d, 0xe9, 0xf0, 0x47, 0x89, 0x46, 0x08, 0x9f, 0x09, 0x9c, 0x0a, 0x9d, + 0x80, 0x46, 0x92, 0x46, 0x1e, 0x46, 0x00, 0x21, 0xed, 0xf7, 0x81, 0xf8, + 0xba, 0xf1, 0x02, 0x0f, 0x38, 0x70, 0x20, 0xd0, 0x40, 0x42, 0x20, 0x70, + 0x70, 0x7a, 0x02, 0x28, 0x03, 0xd1, 0x97, 0xf9, 0x00, 0x10, 0x49, 0x42, + 0x29, 0x70, 0x4a, 0x46, 0x94, 0xf9, 0x00, 0x10, 0x40, 0x46, 0xed, 0xf7, + 0x13, 0xf8, 0x49, 0x46, 0x40, 0x46, 0xed, 0xf7, 0x32, 0xf8, 0x20, 0x70, + 0x70, 0x7a, 0x02, 0x28, 0x07, 0xd1, 0x95, 0xf9, 0x00, 0x10, 0x4a, 0x46, + 0x40, 0x46, 0xbd, 0xe8, 0xf0, 0x47, 0xed, 0xf7, 0x34, 0xb8, 0xbd, 0xe8, + 0xf0, 0x87, 0x49, 0x46, 0x40, 0x46, 0xed, 0xf7, 0x20, 0xf8, 0x20, 0x70, + 0x70, 0x7a, 0x02, 0x28, 0xf5, 0xd1, 0x49, 0x46, 0x40, 0x46, 0xed, 0xf7, + 0x2f, 0xf8, 0x28, 0x70, 0xef, 0xe7, 0xf8, 0xb5, 0x0f, 0x46, 0x04, 0x46, + 0x78, 0x68, 0xa1, 0x68, 0x88, 0x42, 0x16, 0x46, 0x1d, 0x46, 0x05, 0xd2, + 0x20, 0x7c, 0x98, 0x42, 0x0c, 0xd3, 0x40, 0x1b, 0x20, 0x74, 0x09, 0xe0, + 0x30, 0x46, 0xe0, 0xf7, 0x4f, 0xfa, 0x21, 0x7c, 0x3f, 0x30, 0x6a, 0x18, + 0x90, 0x42, 0x24, 0xbf, 0x69, 0x18, 0x21, 0x74, 0x78, 0x7a, 0x02, 0x28, + 0x13, 0xd1, 0x78, 0x68, 0xe1, 0x68, 0x88, 0x42, 0x05, 0xd2, 0x20, 0x7c, + 0xa8, 0x42, 0x0c, 0xd3, 0x61, 0x7c, 0x4d, 0x1b, 0x08, 0xe0, 0x30, 0x46, + 0xe0, 0xf7, 0x38, 0xfa, 0x61, 0x7c, 0x3f, 0x30, 0x6a, 0x18, 0x90, 0x42, + 0x01, 0xd3, 0x6d, 0x18, 0x65, 0x74, 0xf1, 0xbd, 0x70, 0xb5, 0x4e, 0x7a, + 0x84, 0x68, 0x4d, 0x68, 0x02, 0x2e, 0x0e, 0xd0, 0x01, 0x2b, 0x04, 0xd1, + 0xa5, 0x42, 0x06, 0xd2, 0x01, 0x7c, 0x52, 0x18, 0x05, 0xe0, 0x03, 0x68, + 0x5d, 0x1b, 0xac, 0x42, 0xf8, 0xd3, 0x01, 0x7c, 0x8a, 0x1a, 0x02, 0x74, + 0x70, 0xbd, 0x03, 0x7c, 0xa5, 0x42, 0x2c, 0xbf, 0x9b, 0x1a, 0xd3, 0x18, + 0x03, 0x74, 0x45, 0x68, 0x49, 0x68, 0xc4, 0x68, 0x43, 0x7c, 0x6d, 0x1a, + 0xac, 0x42, 0x2c, 0xbf, 0x9a, 0x1a, 0xd2, 0x18, 0x42, 0x74, 0x70, 0xbd, + 0x30, 0xb5, 0x84, 0x68, 0x4d, 0x68, 0x01, 0x2a, 0x0f, 0xd1, 0xa5, 0x42, + 0x03, 0xd2, 0x02, 0x7c, 0x0a, 0xb1, 0x52, 0x1e, 0x02, 0x74, 0x4a, 0x7a, + 0x02, 0x2a, 0x24, 0xd1, 0x49, 0x68, 0xc2, 0x68, 0x91, 0x42, 0x20, 0xd2, + 0x01, 0x7c, 0xd9, 0xb9, 0x30, 0xbd, 0x4a, 0x7a, 0x01, 0x2a, 0x0c, 0xd1, + 0x01, 0x2b, 0x02, 0xd1, 0xa5, 0x42, 0x16, 0xd3, 0x03, 0xe0, 0x01, 0x68, + 0x4d, 0x1b, 0xac, 0x42, 0x11, 0xd3, 0x02, 0x7c, 0x51, 0x1e, 0x01, 0x74, + 0x30, 0xbd, 0xa5, 0x42, 0x02, 0xd3, 0x02, 0x7c, 0x53, 0x1e, 0x03, 0x74, + 0x43, 0x68, 0x49, 0x68, 0xc2, 0x68, 0x5b, 0x1a, 0x9a, 0x42, 0x02, 0xd3, + 0x42, 0x7c, 0x51, 0x1e, 0x41, 0x74, 0x30, 0xbd, 0x2d, 0xe9, 0xf0, 0x4f, + 0x8b, 0xb0, 0x16, 0x46, 0x15, 0x9d, 0xf7, 0x7a, 0x02, 0x2d, 0x83, 0x46, + 0x88, 0x46, 0x9a, 0x46, 0x0d, 0xd1, 0xb8, 0xf1, 0x01, 0x0f, 0x04, 0xd1, + 0x00, 0x24, 0x00, 0x94, 0x01, 0x23, 0x00, 0x22, 0x03, 0xe0, 0x01, 0x22, + 0x00, 0x92, 0x00, 0x23, 0x00, 0x21, 0xed, 0xf7, 0xd0, 0xf8, 0x00, 0x21, + 0x8d, 0xf8, 0x0e, 0x10, 0x8d, 0xf8, 0x0d, 0x10, 0x53, 0x46, 0x70, 0x7a, + 0x01, 0x95, 0x02, 0x28, 0x08, 0xbf, 0x01, 0x27, 0x00, 0x97, 0x32, 0x46, + 0x41, 0x46, 0x58, 0x46, 0xff, 0xf7, 0x86, 0xfe, 0x0d, 0xf1, 0x0d, 0x00, + 0x0d, 0xf1, 0x0e, 0x01, 0x03, 0xaa, 0x02, 0x90, 0x01, 0x91, 0x00, 0x92, + 0x33, 0x46, 0x52, 0x46, 0x41, 0x46, 0x58, 0x46, 0xff, 0xf7, 0xfe, 0xfe, + 0x34, 0x7a, 0xba, 0xf1, 0x02, 0x0f, 0x03, 0xd0, 0x00, 0x21, 0xad, 0xf8, + 0x20, 0x10, 0x12, 0xe0, 0x02, 0x2d, 0x10, 0xd1, 0x9d, 0xf8, 0x0e, 0x00, + 0x00, 0xf0, 0x0e, 0xf9, 0x8d, 0xf8, 0x20, 0x00, 0x70, 0x7a, 0x02, 0x28, + 0x04, 0xd1, 0x9d, 0xf8, 0x0d, 0x00, 0x00, 0xf0, 0x05, 0xf9, 0x00, 0xe0, + 0x00, 0x20, 0x8d, 0xf8, 0x21, 0x00, 0x00, 0x21, 0x01, 0x2d, 0x06, 0x91, + 0x07, 0x91, 0x89, 0x46, 0x44, 0xd1, 0x58, 0x46, 0xed, 0xf7, 0xdb, 0xf8, + 0x81, 0x46, 0x01, 0x21, 0x58, 0x46, 0xed, 0xf7, 0xd4, 0xf8, 0x3b, 0xe0, + 0x9d, 0xf9, 0x0c, 0x00, 0x9d, 0xf9, 0x21, 0x10, 0x09, 0x18, 0x49, 0x42, + 0x8d, 0xf8, 0x0d, 0x10, 0x1f, 0xe0, 0x9d, 0xf9, 0x0c, 0x20, 0x23, 0x46, + 0x31, 0x46, 0x04, 0xa8, 0xff, 0xf7, 0x03, 0xff, 0xb1, 0x7a, 0x91, 0xea, + 0x07, 0x0f, 0x00, 0xf0, 0xc9, 0x80, 0x9d, 0xf9, 0x20, 0x00, 0x9d, 0xf8, + 0x0c, 0x10, 0x40, 0x1a, 0x8d, 0xf8, 0x0e, 0x00, 0x70, 0x7a, 0x02, 0x28, + 0x09, 0xd1, 0xb0, 0x7a, 0x00, 0x28, 0xdd, 0xd0, 0x9d, 0xf9, 0x21, 0x00, + 0x9d, 0xf8, 0x0c, 0x10, 0x40, 0x1a, 0x8d, 0xf8, 0x0d, 0x00, 0x42, 0x46, + 0x9d, 0xf9, 0x0e, 0x10, 0x58, 0x46, 0xec, 0xf7, 0xd7, 0xfe, 0x70, 0x7a, + 0x02, 0x28, 0x05, 0xd1, 0x9d, 0xf9, 0x0d, 0x10, 0x42, 0x46, 0x58, 0x46, + 0xec, 0xf7, 0xff, 0xfe, 0x58, 0x46, 0xed, 0xf7, 0x82, 0xf8, 0x64, 0x10, + 0x9c, 0xb3, 0x58, 0x46, 0xec, 0xf7, 0x7d, 0xfe, 0x00, 0xf0, 0xb6, 0xf8, + 0xbd, 0xf8, 0x26, 0x00, 0xbd, 0xf8, 0x24, 0x10, 0xbd, 0xf8, 0x28, 0x20, + 0x04, 0x90, 0x06, 0x91, 0x07, 0x92, 0xba, 0xf1, 0x01, 0x0f, 0xbd, 0xf8, + 0x2a, 0x00, 0x05, 0x90, 0x33, 0x88, 0x40, 0xf0, 0x84, 0x80, 0xd6, 0xf8, + 0x04, 0xc0, 0x8c, 0x45, 0x24, 0xbf, 0x04, 0x99, 0xb1, 0xeb, 0x93, 0x0f, + 0x02, 0xd2, 0x31, 0x7a, 0x8c, 0x42, 0x01, 0xd0, 0x00, 0x21, 0x00, 0xe0, + 0x01, 0x21, 0x94, 0x45, 0x28, 0xbf, 0xb0, 0xeb, 0x93, 0x0f, 0x05, 0xd2, + 0x30, 0x7a, 0x84, 0x42, 0x04, 0xbf, 0x72, 0x7a, 0x02, 0x2a, 0x01, 0xd0, + 0x00, 0x29, 0x9a, 0xd0, 0x00, 0x21, 0xad, 0xf8, 0x20, 0x10, 0x58, 0x46, + 0xec, 0xf7, 0x49, 0xfe, 0x00, 0xf0, 0x82, 0xf8, 0xbd, 0xf8, 0x26, 0x00, + 0x04, 0x90, 0x3b, 0x46, 0xbd, 0xf8, 0x2a, 0x00, 0x05, 0x90, 0x52, 0x46, + 0xbd, 0xf8, 0x24, 0x00, 0x06, 0x90, 0x31, 0x46, 0xbd, 0xf8, 0x28, 0x00, + 0x07, 0x90, 0x04, 0xa8, 0xff, 0xf7, 0xe2, 0xfe, 0x01, 0x2d, 0x07, 0xd1, + 0x00, 0x21, 0x58, 0x46, 0xed, 0xf7, 0x45, 0xf8, 0x49, 0x46, 0x58, 0x46, + 0xed, 0xf7, 0x45, 0xf8, 0x9d, 0xf9, 0x0c, 0x20, 0x01, 0x2f, 0x04, 0xbf, + 0x70, 0x7a, 0x01, 0x28, 0xc2, 0xf1, 0x3f, 0x01, 0x06, 0xd1, 0x9d, 0xf8, + 0x20, 0x40, 0xcb, 0xb2, 0xa3, 0x42, 0x2b, 0xd2, 0x8d, 0xf8, 0x20, 0x10, + 0x70, 0x7a, 0x02, 0x28, 0x12, 0xd1, 0xb0, 0x7a, 0x01, 0x28, 0x12, 0xd1, + 0x9d, 0xf8, 0x20, 0x40, 0xcb, 0xb2, 0xa3, 0x42, 0x38, 0xbf, 0x8d, 0xf8, + 0x20, 0x10, 0x02, 0xf1, 0x3f, 0x00, 0x9d, 0xf8, 0x21, 0x40, 0xc3, 0xb2, + 0xa3, 0x42, 0x38, 0xbf, 0x8d, 0xf8, 0x21, 0x00, 0x70, 0x7a, 0x02, 0x28, + 0x10, 0xd1, 0xb0, 0x7a, 0x70, 0xb9, 0x3f, 0x32, 0x9d, 0xf8, 0x20, 0x00, + 0xd3, 0xb2, 0x83, 0x42, 0x38, 0xbf, 0x8d, 0xf8, 0x20, 0x20, 0x9d, 0xf8, + 0x21, 0x20, 0xc8, 0xb2, 0x90, 0x42, 0x38, 0xbf, 0x8d, 0xf8, 0x21, 0x10, + 0x9d, 0xf8, 0x20, 0x20, 0x14, 0x99, 0xba, 0xf1, 0x02, 0x0f, 0x14, 0xd0, + 0x0a, 0x70, 0x9d, 0xf8, 0x21, 0x00, 0x48, 0x70, 0x17, 0xe0, 0x3b, 0x46, + 0x22, 0x46, 0x31, 0x46, 0x04, 0xa8, 0xff, 0xf7, 0x67, 0xfe, 0x31, 0xe7, + 0x9d, 0xf9, 0x0c, 0x00, 0x9d, 0xf9, 0x20, 0x10, 0x09, 0x18, 0x49, 0x42, + 0x8d, 0xf8, 0x0e, 0x10, 0x34, 0xe7, 0x08, 0x78, 0x12, 0x1a, 0x8a, 0x70, + 0x48, 0x78, 0x9d, 0xf8, 0x21, 0x20, 0x12, 0x1a, 0xca, 0x70, 0x0b, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x9d, 0xf8, 0x0c, 0x10, 0x08, 0x18, 0x40, 0xb2, + 0xe0, 0xf7, 0x7c, 0xb8, 0x00, 0x22, 0x09, 0xa9, 0x58, 0x46, 0xec, 0xf7, + 0x9f, 0xbf, 0x2d, 0xe9, 0xf8, 0x4f, 0x84, 0xb0, 0x82, 0x46, 0x9d, 0xf9, + 0x40, 0x70, 0x0e, 0x46, 0x93, 0x46, 0x99, 0x46, 0xec, 0xf7, 0xc6, 0xfe, + 0xb9, 0xf1, 0x01, 0x0f, 0x4f, 0xf0, 0x00, 0x08, 0x08, 0xd1, 0x00, 0x97, + 0x01, 0x23, 0x43, 0xf6, 0xff, 0x72, 0x06, 0x21, 0x50, 0x46, 0xe0, 0xf7, + 0xb3, 0xf8, 0x80, 0x46, 0x0e, 0x9c, 0x00, 0x21, 0x8d, 0xf8, 0x0c, 0x10, + 0xad, 0xf8, 0x0e, 0x10, 0x04, 0xb1, 0x21, 0x70, 0x00, 0x2e, 0x4c, 0xd0, + 0x0f, 0x9d, 0x01, 0x2d, 0x33, 0x46, 0x02, 0xd1, 0x0b, 0x2e, 0x28, 0xbf, + 0x0a, 0x23, 0x2a, 0x46, 0x59, 0x46, 0x50, 0x46, 0x00, 0xf0, 0x44, 0xf9, + 0x8d, 0xf8, 0x3c, 0x50, 0x0a, 0x21, 0x11, 0xfb, 0x06, 0xf6, 0x05, 0x46, + 0x8d, 0xf8, 0x0d, 0x90, 0x9d, 0xf8, 0x0d, 0x10, 0x01, 0x29, 0x0d, 0xd1, + 0x9d, 0xf8, 0x3c, 0x00, 0x01, 0x90, 0x0d, 0xf1, 0x0e, 0x01, 0x00, 0x91, + 0x02, 0x97, 0x03, 0xab, 0x5a, 0x46, 0x41, 0x46, 0x50, 0x46, 0x00, 0xf0, + 0x9f, 0xfa, 0x0c, 0xe0, 0xe8, 0xb2, 0xff, 0xf7, 0xe7, 0xfc, 0xf2, 0xee, + 0x04, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, + 0x10, 0x0a, 0xad, 0xf8, 0x0e, 0x00, 0x71, 0x1d, 0xbd, 0xf9, 0x0e, 0x00, + 0x81, 0x42, 0x07, 0xda, 0x01, 0x23, 0x00, 0x22, 0x59, 0x46, 0x50, 0x46, + 0x00, 0xf0, 0x1d, 0xf9, 0x6d, 0x1e, 0x09, 0xe0, 0x71, 0x1f, 0x88, 0x42, + 0x0e, 0xda, 0x02, 0x23, 0x01, 0x22, 0x59, 0x46, 0x50, 0x46, 0x00, 0xf0, + 0x12, 0xf9, 0xad, 0x1c, 0xe8, 0xb2, 0x21, 0x28, 0xc6, 0xdb, 0xbd, 0xf9, + 0x0e, 0x00, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0x2c, 0xf8, 0xd0, + 0x25, 0x70, 0xf6, 0xe7, 0x2d, 0xe9, 0xf0, 0x4f, 0x90, 0x46, 0x89, 0x46, + 0x87, 0xb0, 0x98, 0xf9, 0x0c, 0x10, 0x11, 0x9d, 0x8d, 0xf8, 0x0d, 0x10, + 0x1e, 0x46, 0x00, 0x24, 0x01, 0x2d, 0x71, 0x78, 0x37, 0x78, 0x08, 0xbf, + 0xa1, 0x46, 0x8f, 0x42, 0x28, 0xbf, 0x0f, 0x46, 0x27, 0xb9, 0x00, 0x20, + 0xb0, 0x70, 0xf7, 0x70, 0x30, 0x71, 0x6c, 0xe0, 0x12, 0x99, 0x8d, 0xf8, + 0x0c, 0x00, 0x01, 0x29, 0x13, 0xd1, 0x04, 0xa8, 0x01, 0x90, 0x02, 0x95, + 0x05, 0xa8, 0x00, 0x90, 0x06, 0xab, 0x9d, 0xf8, 0x0c, 0x00, 0x49, 0x46, + 0x00, 0xf0, 0x6d, 0xf8, 0x9d, 0xf8, 0x10, 0x00, 0xf0, 0x70, 0x9d, 0xf8, + 0x11, 0x00, 0xb0, 0x72, 0x9d, 0xf8, 0x12, 0x00, 0xf0, 0x72, 0xbb, 0x46, + 0x9d, 0xf9, 0x0d, 0x10, 0xdd, 0xf8, 0x40, 0xa0, 0x02, 0x91, 0x0a, 0x20, + 0x01, 0x95, 0x00, 0x94, 0x53, 0x46, 0x01, 0x22, 0x39, 0x46, 0x10, 0xfb, + 0x0b, 0xfb, 0x9d, 0xf8, 0x0c, 0x00, 0xff, 0xf7, 0x42, 0xff, 0xab, 0xf1, + 0x05, 0x0b, 0x58, 0x45, 0xb8, 0xbf, 0x02, 0x24, 0x0a, 0xdb, 0x00, 0xf0, + 0x3f, 0xf8, 0x9d, 0xf8, 0x10, 0x00, 0x30, 0x71, 0x9d, 0xf8, 0x11, 0x00, + 0x30, 0x73, 0x9d, 0xf8, 0x12, 0x00, 0x70, 0x73, 0x9d, 0xf8, 0x0c, 0x00, + 0xec, 0xf7, 0xfe, 0xfd, 0x9d, 0xf9, 0x0d, 0x00, 0x02, 0x90, 0x00, 0x21, + 0x00, 0x91, 0x01, 0x95, 0x53, 0x46, 0x9d, 0xf8, 0x0c, 0x00, 0x00, 0x22, + 0x39, 0x46, 0xff, 0xf7, 0x20, 0xff, 0x58, 0x45, 0xb8, 0xbf, 0x44, 0xf0, + 0x01, 0x04, 0x0a, 0xdb, 0x00, 0xf0, 0x1e, 0xf8, 0x9d, 0xf8, 0x10, 0x00, + 0xb0, 0x70, 0x9d, 0xf8, 0x11, 0x00, 0x30, 0x72, 0x9d, 0xf8, 0x12, 0x00, + 0x70, 0x72, 0x9d, 0xf8, 0x0c, 0x00, 0xec, 0xf7, 0xdd, 0xfd, 0x4c, 0xb9, + 0x31, 0x79, 0xb2, 0x78, 0xf0, 0x78, 0x52, 0x18, 0x12, 0x04, 0x00, 0xeb, + 0x52, 0x40, 0x17, 0xfb, 0x00, 0xf0, 0x00, 0xe0, 0x00, 0x20, 0xf0, 0x80, + 0x07, 0xb0, 0x20, 0x46, 0xbd, 0xe8, 0xf0, 0x8f, 0x04, 0xa8, 0x01, 0x90, + 0x05, 0xa9, 0x00, 0x91, 0x02, 0x95, 0x06, 0xab, 0x9d, 0xf8, 0x0c, 0x00, + 0x42, 0x46, 0x49, 0x46, 0xff, 0xe7, 0x2d, 0xe9, 0xf8, 0x43, 0x86, 0xb0, + 0x88, 0x46, 0x10, 0x9c, 0x81, 0x46, 0x17, 0x46, 0x1e, 0x46, 0x03, 0xa9, + 0xec, 0xf7, 0x76, 0xfe, 0x02, 0xaa, 0x41, 0x46, 0x48, 0x46, 0xec, 0xf7, + 0x75, 0xfe, 0x01, 0x2c, 0x04, 0xbf, 0x48, 0x46, 0xec, 0xf7, 0xad, 0xfe, + 0x0e, 0x9d, 0x01, 0x20, 0xb8, 0x72, 0x01, 0x94, 0x00, 0x96, 0x00, 0xf0, + 0x42, 0xf8, 0x00, 0x20, 0xb8, 0x72, 0x01, 0x94, 0x00, 0x95, 0x00, 0xf0, + 0x3c, 0xf8, 0x02, 0xaa, 0x41, 0x46, 0x48, 0x46, 0xec, 0xf7, 0x60, 0xfe, + 0x03, 0xa9, 0x48, 0x46, 0xec, 0xf7, 0x58, 0xfe, 0x01, 0x2c, 0x04, 0xbf, + 0x48, 0x46, 0xec, 0xf7, 0x94, 0xfe, 0x30, 0x78, 0x2a, 0x78, 0x0f, 0x99, + 0x82, 0x42, 0x2c, 0xbf, 0x08, 0x70, 0x0a, 0x70, 0x01, 0x2c, 0x10, 0xd1, + 0x68, 0x78, 0x32, 0x78, 0x90, 0x42, 0x39, 0xbf, 0x08, 0x70, 0x48, 0x70, + 0x0a, 0x70, 0x4a, 0x70, 0x28, 0x78, 0x72, 0x78, 0x90, 0x42, 0x0e, 0xd3, + 0x0b, 0x78, 0x70, 0x78, 0xc3, 0x18, 0x0b, 0x70, 0x0c, 0xe0, 0x08, 0x78, + 0x48, 0x70, 0x02, 0x2c, 0x08, 0xd1, 0x6a, 0x78, 0x73, 0x78, 0x9a, 0x42, + 0xf2, 0xd2, 0x10, 0x18, 0x01, 0xe0, 0x0a, 0x78, 0x80, 0x18, 0x08, 0x70, + 0x0b, 0x78, 0x48, 0x78, 0x1b, 0x1a, 0x8b, 0x70, 0x07, 0xb0, 0xbd, 0xe8, + 0xf0, 0x83, 0x01, 0x23, 0x3a, 0x46, 0x41, 0x46, 0x48, 0x46, 0x2d, 0xe5, + 0x10, 0xb5, 0x1c, 0x46, 0x01, 0x2a, 0x08, 0xbf, 0x64, 0x00, 0xe3, 0xb2, + 0x01, 0x22, 0x00, 0xf0, 0x02, 0xf8, 0xe0, 0xb2, 0x10, 0xbd, 0x10, 0xb5, + 0x04, 0x46, 0x08, 0x00, 0x11, 0x46, 0x1a, 0x46, 0x20, 0x46, 0x02, 0xd0, + 0xec, 0xf7, 0x38, 0xfd, 0x01, 0xe0, 0xec, 0xf7, 0x28, 0xfd, 0x20, 0x46, + 0xbd, 0xe8, 0x10, 0x40, 0xec, 0xf7, 0x31, 0xbe, 0x38, 0xb5, 0x15, 0x46, + 0x91, 0xf9, 0x00, 0x10, 0x04, 0x46, 0x01, 0x22, 0xec, 0xf7, 0x72, 0xfc, + 0x95, 0xf9, 0x00, 0x10, 0x20, 0x46, 0xbd, 0xe8, 0x38, 0x40, 0x01, 0x22, + 0xec, 0xf7, 0x9b, 0xbc, 0x70, 0xb5, 0x0d, 0x46, 0x04, 0x46, 0x95, 0xf9, + 0x14, 0x10, 0x16, 0x46, 0xec, 0xf7, 0x62, 0xfc, 0x95, 0xf9, 0x14, 0x10, + 0x32, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0xec, 0xf7, 0x8b, 0xbc, + 0x24, 0x31, 0x7c, 0xb5, 0x00, 0x23, 0x00, 0x24, 0xdd, 0xb2, 0x5b, 0x1c, + 0x0d, 0x44, 0xde, 0xb2, 0x08, 0x2e, 0x2c, 0x73, 0xf8, 0xd3, 0x13, 0x78, + 0x0b, 0x70, 0x54, 0x78, 0x4c, 0x70, 0x93, 0x78, 0x8b, 0x70, 0xd2, 0x78, + 0xca, 0x70, 0x8d, 0xf8, 0x07, 0x00, 0x00, 0x20, 0x00, 0x90, 0xad, 0xf8, + 0x04, 0x00, 0x8d, 0xf8, 0x06, 0x00, 0x68, 0x46, 0xec, 0xf7, 0xc0, 0xfe, + 0x01, 0x21, 0x8d, 0xf8, 0x06, 0x10, 0x68, 0x46, 0xec, 0xf7, 0xba, 0xfe, + 0x73, 0xbd, 0x1c, 0xb5, 0x04, 0x46, 0x48, 0x89, 0xad, 0xf8, 0x00, 0x00, + 0x68, 0x46, 0x49, 0x89, 0x00, 0xf0, 0x04, 0xf9, 0x00, 0x22, 0x06, 0x21, + 0x20, 0x46, 0xec, 0xf7, 0xd8, 0xfd, 0x01, 0x22, 0xe4, 0x21, 0x00, 0xf0, + 0x0d, 0xf8, 0x02, 0x22, 0xe0, 0x21, 0x00, 0xf0, 0x09, 0xf8, 0x04, 0x22, + 0xe1, 0x21, 0x00, 0xf0, 0x05, 0xf8, 0x08, 0x22, 0xe5, 0x21, 0x00, 0xf0, + 0x01, 0xf8, 0x13, 0xbd, 0x20, 0x46, 0xec, 0xf7, 0xb1, 0xbd, 0x1c, 0xb5, + 0x91, 0xf9, 0x0c, 0x40, 0x53, 0x7b, 0xe4, 0x1a, 0x8d, 0xf8, 0x01, 0x40, + 0x92, 0xf9, 0x0d, 0x20, 0x91, 0xf9, 0x0d, 0x30, 0x52, 0x42, 0xd2, 0x1a, + 0x8d, 0xf8, 0x00, 0x20, 0x0d, 0xf1, 0x01, 0x01, 0x6a, 0x46, 0xff, 0xf7, + 0x85, 0xff, 0x13, 0xbd, 0x80, 0xb5, 0x00, 0x93, 0x13, 0x46, 0x01, 0x22, + 0x03, 0xe0, 0x80, 0xb5, 0x00, 0x93, 0x13, 0x46, 0x00, 0x22, 0x00, 0xf0, + 0x01, 0xf8, 0x01, 0xbd, 0x2d, 0xe9, 0xfe, 0x43, 0x81, 0x46, 0x0d, 0x46, + 0x0a, 0x9e, 0x00, 0x20, 0x28, 0x70, 0x98, 0x46, 0x14, 0x46, 0x41, 0x46, + 0x48, 0x46, 0xdf, 0xf7, 0xfd, 0xff, 0x00, 0x27, 0x0a, 0xe0, 0x41, 0x46, + 0x48, 0x46, 0xe0, 0xf7, 0x04, 0xf8, 0x28, 0x78, 0x30, 0x18, 0x28, 0x70, + 0x00, 0xe0, 0x76, 0x1e, 0x47, 0xfa, 0x86, 0xf7, 0x78, 0xb2, 0x20, 0x28, + 0x23, 0xda, 0xf3, 0xb2, 0x01, 0x22, 0x21, 0x46, 0x48, 0x46, 0xff, 0xf7, + 0x44, 0xff, 0x48, 0x46, 0xec, 0xf7, 0x83, 0xfb, 0x69, 0x46, 0x48, 0x46, + 0xec, 0xf7, 0x5c, 0xfd, 0xbd, 0xf8, 0x00, 0x00, 0xbd, 0xf8, 0x02, 0x10, + 0xbd, 0xf8, 0x04, 0x20, 0x08, 0x18, 0xbd, 0xf8, 0x06, 0x10, 0x10, 0x18, + 0x08, 0x18, 0x80, 0xb2, 0x00, 0x28, 0xd6, 0xd0, 0xf3, 0xb2, 0x00, 0x22, + 0x21, 0x46, 0x48, 0x46, 0xff, 0xf7, 0x29, 0xff, 0xf0, 0xb2, 0x02, 0x28, + 0xd5, 0xd2, 0xbd, 0xe8, 0xf7, 0x83, 0xf0, 0xb5, 0x05, 0x98, 0x06, 0x9c, + 0x92, 0xf9, 0x0e, 0x60, 0x27, 0x56, 0x07, 0x9d, 0x09, 0x99, 0xbe, 0x42, + 0xa4, 0xbf, 0x2f, 0x56, 0xbe, 0x42, 0x09, 0xda, 0x56, 0x69, 0xb7, 0x04, + 0x33, 0xd4, 0x03, 0xf1, 0xb3, 0x06, 0x37, 0x78, 0x36, 0x79, 0x3e, 0x44, + 0x02, 0x2e, 0x2c, 0xd2, 0x08, 0x98, 0x00, 0x24, 0x0c, 0x70, 0x00, 0x28, + 0x10, 0x7d, 0x0d, 0xd1, 0x81, 0x06, 0x08, 0xd4, 0x93, 0xf8, 0x30, 0x00, + 0x93, 0xf8, 0x31, 0x10, 0x41, 0x1a, 0x93, 0xf8, 0x37, 0x00, 0x41, 0x18, + 0x0f, 0xe0, 0x93, 0xf9, 0x24, 0x10, 0x0c, 0xe0, 0x81, 0x06, 0x08, 0xd4, + 0x93, 0xf8, 0x37, 0x40, 0x93, 0xf8, 0x31, 0x00, 0x93, 0xf8, 0x30, 0x10, + 0x24, 0x1a, 0x61, 0x1a, 0x01, 0xe0, 0x93, 0xf9, 0x27, 0x10, 0x50, 0x69, + 0x44, 0x04, 0x19, 0xd4, 0x93, 0xf9, 0x14, 0x00, 0x4d, 0xb2, 0x85, 0x42, + 0x12, 0xdb, 0x49, 0xb2, 0x88, 0x42, 0x12, 0xda, 0x07, 0xe0, 0x01, 0x26, + 0x0e, 0x70, 0x29, 0x5c, 0x20, 0x5c, 0x08, 0x1a, 0x40, 0xb2, 0x02, 0x28, + 0x03, 0xdb, 0x18, 0x7d, 0x40, 0x1c, 0x18, 0x75, 0x05, 0xe0, 0x10, 0xf1, + 0x01, 0x0f, 0x02, 0xda, 0x18, 0x7d, 0x41, 0x1e, 0x19, 0x75, 0x50, 0x7c, + 0x01, 0x06, 0x07, 0xd4, 0x92, 0xf9, 0x12, 0x00, 0x93, 0xf9, 0x14, 0x10, + 0x88, 0x42, 0xb8, 0xbf, 0x08, 0x46, 0x18, 0x75, 0xf0, 0xbd, 0x90, 0xf9, + 0x14, 0x20, 0x91, 0xf9, 0x0f, 0x10, 0x91, 0x42, 0xa6, 0xbf, 0x49, 0x42, + 0x8a, 0x42, 0x01, 0x75, 0x70, 0x47, 0x3e, 0xb5, 0x0d, 0x46, 0x04, 0x46, + 0x01, 0x22, 0x94, 0x21, 0xec, 0xf7, 0xda, 0xfc, 0x02, 0x22, 0x95, 0x21, + 0xff, 0xf7, 0x22, 0xff, 0x04, 0x22, 0x84, 0x21, 0xff, 0xf7, 0x1e, 0xff, + 0x08, 0x22, 0x85, 0x21, 0xff, 0xf7, 0x1a, 0xff, 0xa8, 0x88, 0xad, 0xf8, + 0x00, 0x00, 0x68, 0x46, 0x69, 0x88, 0x00, 0xf0, 0x01, 0xf8, 0x37, 0xbd, + 0xad, 0xf8, 0x02, 0x10, 0x8d, 0xf8, 0x04, 0x40, 0xec, 0xf7, 0x88, 0xba, + 0xf0, 0xb5, 0x85, 0xb0, 0x06, 0x27, 0x01, 0x92, 0x02, 0x93, 0x0b, 0x9c, + 0x9d, 0xf9, 0x30, 0x50, 0x0a, 0x9e, 0x04, 0x95, 0x0a, 0x46, 0x03, 0x96, + 0x00, 0x97, 0x43, 0xf6, 0xff, 0x73, 0x21, 0x46, 0xdf, 0xf7, 0x32, 0xfe, + 0x05, 0xb0, 0xf0, 0xbd, 0x2d, 0xe9, 0xfe, 0x4f, 0x83, 0x46, 0x0e, 0x46, + 0x17, 0x46, 0x1c, 0x46, 0xec, 0xf7, 0xce, 0xfb, 0x01, 0x2c, 0x4f, 0xf0, + 0x00, 0x08, 0x09, 0xd1, 0x04, 0x20, 0x00, 0x90, 0x01, 0x23, 0x43, 0xf6, + 0xff, 0x72, 0x06, 0x21, 0x58, 0x46, 0xdf, 0xf7, 0xbb, 0xfd, 0x80, 0x46, + 0xdd, 0xf8, 0x38, 0x90, 0xdd, 0xf8, 0x34, 0xa0, 0x00, 0x20, 0x38, 0x70, + 0x4b, 0x46, 0x52, 0x46, 0x39, 0x46, 0x58, 0x46, 0xff, 0xf7, 0xee, 0xfe, + 0x0c, 0x9d, 0x01, 0x2c, 0x08, 0xd1, 0x00, 0xf0, 0x2e, 0xf8, 0x3b, 0x46, + 0x01, 0x22, 0x41, 0x46, 0x58, 0x46, 0xff, 0xf7, 0xbf, 0xff, 0x05, 0xe0, + 0x38, 0x78, 0xff, 0xf7, 0x07, 0xfa, 0x00, 0xf0, 0x28, 0xf8, 0x39, 0x70, + 0x58, 0x46, 0xec, 0xf7, 0x9f, 0xfb, 0x00, 0x20, 0x30, 0x70, 0x4b, 0x46, + 0x52, 0x46, 0x31, 0x46, 0x58, 0x46, 0xff, 0xf7, 0xd6, 0xfe, 0x01, 0x2c, + 0x08, 0xd1, 0x00, 0xf0, 0x12, 0xf8, 0x33, 0x46, 0x00, 0x22, 0x41, 0x46, + 0x58, 0x46, 0xff, 0xf7, 0xa3, 0xff, 0x05, 0xe0, 0x30, 0x78, 0xff, 0xf7, + 0xeb, 0xf9, 0x00, 0xf0, 0x0c, 0xf8, 0x31, 0x70, 0x58, 0x46, 0xbd, 0xe8, + 0xfe, 0x4f, 0xec, 0xf7, 0x81, 0xbb, 0x04, 0x20, 0x00, 0x21, 0x02, 0x90, + 0x00, 0x91, 0x01, 0x95, 0x70, 0x47, 0xf6, 0xee, 0x00, 0x0a, 0x30, 0xee, + 0x20, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x1a, 0x70, 0x47, + 0x2d, 0xe9, 0xf8, 0x4f, 0x9a, 0x46, 0x88, 0xb0, 0x89, 0x46, 0x9a, 0xf8, + 0x00, 0x10, 0x18, 0x9c, 0xdd, 0xf8, 0x58, 0x80, 0x8d, 0xf8, 0x18, 0x10, + 0xd9, 0xf8, 0x14, 0x30, 0x13, 0x9e, 0x12, 0x9f, 0x07, 0x92, 0x59, 0x00, + 0x4c, 0xbf, 0x02, 0x25, 0x01, 0x25, 0x83, 0x46, 0x01, 0x22, 0x04, 0x21, + 0xec, 0xf7, 0x2a, 0xfc, 0x01, 0x22, 0x04, 0x21, 0x58, 0x46, 0xec, 0xf7, + 0x27, 0xfc, 0x49, 0x46, 0x58, 0x46, 0xff, 0xf7, 0x52, 0xfe, 0x07, 0x98, + 0x00, 0xf1, 0x24, 0x02, 0x49, 0x46, 0x58, 0x46, 0xff, 0xf7, 0x6d, 0xfe, + 0x01, 0x20, 0xdf, 0xf7, 0x82, 0xfd, 0x9d, 0xf8, 0x18, 0x00, 0x02, 0x95, + 0x02, 0x23, 0x07, 0x99, 0x00, 0x93, 0x01, 0xf1, 0xb0, 0x02, 0x01, 0x92, + 0x39, 0x18, 0x32, 0x18, 0x43, 0x46, 0x58, 0x46, 0xff, 0xf7, 0x60, 0xff, + 0x15, 0x98, 0x01, 0x2c, 0x24, 0xd1, 0x04, 0x90, 0xcd, 0xf8, 0x14, 0x80, + 0x4a, 0x46, 0x9d, 0xf8, 0x50, 0x00, 0x17, 0x9c, 0x03, 0x90, 0x02, 0x96, + 0x01, 0x97, 0x58, 0x46, 0x9d, 0xf8, 0x18, 0x10, 0x07, 0x9b, 0x00, 0x91, + 0x21, 0x46, 0xff, 0xf7, 0xaa, 0xfe, 0x07, 0x98, 0x49, 0x46, 0xff, 0xf7, + 0x08, 0xff, 0x07, 0x99, 0x22, 0x46, 0x58, 0x46, 0xff, 0xf7, 0xe6, 0xfd, + 0x99, 0xf8, 0x10, 0x10, 0x06, 0xa8, 0xdf, 0xf7, 0x96, 0xff, 0x9d, 0xf8, + 0x18, 0x00, 0x8a, 0xf8, 0x00, 0x00, 0x0d, 0xe0, 0x9d, 0xf8, 0x18, 0x20, + 0x99, 0xf9, 0x0e, 0x10, 0xbb, 0x56, 0x99, 0x42, 0xa4, 0xbf, 0xb2, 0x56, + 0x91, 0x42, 0xa7, 0xbf, 0x00, 0x21, 0x01, 0x70, 0x01, 0x22, 0x02, 0x70, + 0x09, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0x00, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, 0x0d, 0xf8, 0x01, 0x70, + 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, + 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x70, 0x47, + 0x2d, 0xe9, 0xf8, 0x43, 0x80, 0x46, 0x00, 0x24, 0x00, 0x26, 0x00, 0x27, + 0x00, 0x25, 0x6c, 0x20, 0x68, 0x43, 0x00, 0xf0, 0x2f, 0xf8, 0x28, 0xb1, + 0x99, 0xf8, 0x0b, 0x00, 0x00, 0xea, 0x06, 0x01, 0x0f, 0x43, 0x06, 0x43, + 0x6d, 0x1c, 0x03, 0x2d, 0xf1, 0xdb, 0xff, 0xb2, 0x0f, 0xb1, 0x4b, 0xf6, + 0x01, 0x04, 0x1c, 0xe0, 0x2d, 0xe9, 0xf8, 0x43, 0x80, 0x46, 0x00, 0x24, + 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x6c, 0x20, 0x78, 0x43, 0x00, 0xf0, + 0x15, 0xf8, 0x28, 0xb1, 0x99, 0xf8, 0x10, 0x00, 0x6d, 0x1c, 0x03, 0x28, + 0x08, 0xbf, 0x76, 0x1c, 0x7f, 0x1c, 0x03, 0x2f, 0xf1, 0xdb, 0xf0, 0xb2, + 0x00, 0x28, 0x1f, 0xbf, 0xf6, 0xb2, 0xed, 0xb2, 0xae, 0x42, 0x4b, 0xf6, + 0x06, 0x04, 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0x08, 0xeb, 0x00, 0x09, + 0x48, 0x46, 0x65, 0xe3, 0x00, 0x23, 0x07, 0x22, 0x00, 0x21, 0xdf, 0xf8, + 0x18, 0x07, 0xaa, 0xe7, 0x2d, 0xe9, 0xf8, 0x4f, 0x8e, 0xb0, 0x06, 0x46, + 0x1c, 0x46, 0x00, 0x20, 0x8d, 0xf8, 0x04, 0x00, 0x89, 0x46, 0x94, 0xf8, + 0xc7, 0x37, 0xdf, 0xf8, 0xfc, 0x06, 0x4f, 0xf4, 0x40, 0x32, 0x10, 0x21, + 0xff, 0xf7, 0x99, 0xff, 0x24, 0x22, 0x00, 0x21, 0x05, 0xa8, 0xdf, 0xf7, + 0x23, 0xfc, 0x4f, 0xf0, 0x00, 0x08, 0x00, 0x25, 0x4f, 0xf0, 0x07, 0x0a, + 0x00, 0x27, 0x6c, 0x20, 0x78, 0x43, 0x09, 0xeb, 0x00, 0x0b, 0x58, 0x46, + 0x00, 0xf0, 0x3c, 0xfb, 0x98, 0xb1, 0x4f, 0xf4, 0xc2, 0x71, 0x04, 0xf5, + 0xc0, 0x70, 0x79, 0x43, 0x42, 0x5c, 0xdb, 0xf8, 0x5d, 0x10, 0x01, 0x2a, + 0x08, 0xbf, 0x89, 0x00, 0x0c, 0x22, 0x05, 0xa8, 0x7a, 0x43, 0x83, 0x18, + 0x00, 0x22, 0x30, 0x46, 0xef, 0xf7, 0x54, 0xfd, 0x80, 0x46, 0x7f, 0x1c, + 0x03, 0x2f, 0x02, 0xda, 0xb8, 0xf1, 0x00, 0x0f, 0xdd, 0xd0, 0xb8, 0xf1, + 0x00, 0x0f, 0x04, 0x94, 0x43, 0xd1, 0x05, 0x9b, 0x07, 0x22, 0x00, 0x21, + 0x00, 0xf0, 0xf1, 0xfa, 0x05, 0xac, 0x70, 0x22, 0xe3, 0x68, 0x04, 0x21, + 0x00, 0xf0, 0xeb, 0xfa, 0xa3, 0x69, 0x4f, 0xf4, 0xe0, 0x62, 0x08, 0x21, + 0x00, 0xf0, 0xe5, 0xfa, 0x04, 0x9c, 0x00, 0x26, 0xb0, 0x00, 0x00, 0xf1, + 0x90, 0x40, 0x00, 0xf1, 0x08, 0x0b, 0xa0, 0x19, 0x00, 0xf2, 0xaf, 0x77, + 0x4f, 0xf4, 0x80, 0x72, 0x3b, 0x78, 0x08, 0x21, 0x00, 0xf0, 0xde, 0xfa, + 0x3b, 0x7a, 0x70, 0x22, 0x04, 0x21, 0x00, 0xf0, 0xd9, 0xfa, 0x3b, 0x7c, + 0x07, 0x22, 0x00, 0x21, 0x00, 0xf0, 0xd4, 0xfa, 0x38, 0x78, 0x20, 0xb1, + 0x38, 0x7c, 0x01, 0x25, 0x50, 0x45, 0x38, 0xbf, 0x82, 0x46, 0x76, 0x1c, + 0x08, 0x2e, 0xdd, 0xd3, 0x2b, 0x46, 0xdf, 0xf8, 0x24, 0x56, 0x04, 0x94, + 0x08, 0x22, 0x03, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x21, 0xff, 0x53, 0x46, + 0x07, 0x22, 0x00, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x1b, 0xff, 0xb8, 0xf1, + 0x00, 0x0f, 0x40, 0xf0, 0xa2, 0x82, 0xcd, 0xf8, 0x08, 0x90, 0x00, 0x25, + 0xaa, 0x46, 0x00, 0x24, 0x00, 0x26, 0xa9, 0x46, 0x02, 0x98, 0x6c, 0x21, + 0x71, 0x43, 0x47, 0x18, 0x38, 0x46, 0x00, 0xf0, 0xc7, 0xfa, 0x60, 0xb3, + 0xdf, 0xf8, 0xe4, 0x05, 0xf9, 0x7b, 0x50, 0xf8, 0x26, 0xb0, 0x01, 0x29, + 0x0c, 0xbf, 0x01, 0x23, 0x00, 0x23, 0x0b, 0xf5, 0x8e, 0x60, 0x4f, 0xf0, + 0x00, 0x72, 0x19, 0x21, 0xff, 0xf7, 0x01, 0xff, 0x3b, 0x7c, 0x03, 0x2b, + 0x3b, 0xd0, 0x4f, 0xf4, 0xe0, 0x22, 0x10, 0x21, 0x0b, 0xf5, 0x40, 0x70, + 0xff, 0xf7, 0xf7, 0xfe, 0x39, 0x7c, 0x01, 0x20, 0x00, 0xfa, 0x01, 0xf1, + 0x78, 0x7c, 0x0d, 0x43, 0x01, 0x28, 0x18, 0xbf, 0x02, 0x28, 0x04, 0xd1, + 0x01, 0x28, 0x41, 0xea, 0x09, 0x09, 0x08, 0xbf, 0x0c, 0x43, 0xb8, 0x7c, + 0x08, 0xb1, 0x41, 0xea, 0x0a, 0x0a, 0x76, 0x1c, 0x03, 0x2e, 0xc7, 0xdb, + 0x2e, 0x46, 0x5f, 0xfa, 0x89, 0xf5, 0x05, 0xb1, 0x01, 0x25, 0xdf, 0xf8, + 0x80, 0x75, 0x2b, 0x46, 0x40, 0x22, 0x06, 0x21, 0x38, 0x46, 0xff, 0xf7, + 0xcb, 0xfe, 0x5f, 0xfa, 0x8a, 0xf3, 0x38, 0x22, 0x03, 0x21, 0x38, 0x46, + 0xff, 0xf7, 0xc4, 0xfe, 0xdf, 0xf8, 0x64, 0xa5, 0xf3, 0xb2, 0x07, 0x22, + 0x00, 0x21, 0x50, 0x46, 0xff, 0xf7, 0xbc, 0xfe, 0x1d, 0xb9, 0x07, 0x23, + 0x08, 0xe0, 0x00, 0x26, 0xdf, 0xe7, 0xe3, 0xb2, 0x38, 0x22, 0x03, 0x21, + 0x50, 0x46, 0xff, 0xf7, 0xb1, 0xfe, 0x00, 0x23, 0x07, 0x22, 0x00, 0x21, + 0x38, 0x46, 0xff, 0xf7, 0xab, 0xfe, 0x00, 0x20, 0x00, 0x90, 0x00, 0x9a, + 0x02, 0x99, 0x6c, 0x20, 0x42, 0x43, 0x8d, 0x18, 0x28, 0x46, 0x00, 0xf0, + 0x5f, 0xfa, 0x00, 0x28, 0x00, 0xf0, 0xfb, 0x81, 0x00, 0x98, 0x01, 0x21, + 0x81, 0x40, 0x05, 0x91, 0x04, 0x99, 0x91, 0xf8, 0xc7, 0x07, 0x05, 0x99, + 0x08, 0x42, 0x02, 0xd1, 0x00, 0x98, 0x02, 0x28, 0x4f, 0xd1, 0x00, 0x9f, + 0xf8, 0xb2, 0x00, 0x28, 0x0c, 0xbf, 0x40, 0x24, 0x20, 0x24, 0x00, 0x26, + 0x1b, 0xe0, 0x08, 0xf5, 0x8c, 0x58, 0x00, 0xf0, 0x14, 0xfa, 0x40, 0x46, + 0xff, 0xf7, 0x8b, 0xfe, 0x4b, 0x46, 0x1f, 0x22, 0x00, 0x21, 0x40, 0x46, + 0x0c, 0xe0, 0x01, 0x28, 0xf1, 0xd1, 0x00, 0xf0, 0x08, 0xfa, 0x08, 0xf5, + 0x78, 0x60, 0xff, 0xf7, 0x7e, 0xfe, 0x4b, 0x46, 0x3f, 0x22, 0x00, 0x21, + 0x08, 0xf5, 0x88, 0x50, 0xff, 0xf7, 0x77, 0xfe, 0x76, 0x1c, 0xa6, 0x42, + 0x80, 0xf0, 0xa5, 0x80, 0xb0, 0x00, 0x00, 0xf1, 0x90, 0x48, 0xa8, 0x19, + 0xf9, 0xb2, 0x90, 0xf8, 0x1b, 0x90, 0x02, 0x29, 0x09, 0xd1, 0xa9, 0xf1, + 0x20, 0x09, 0xb9, 0xf1, 0x1f, 0x0f, 0x26, 0xbf, 0x01, 0x23, 0x4f, 0xf0, + 0x1f, 0x09, 0x00, 0x23, 0xcd, 0xe7, 0xb9, 0xf1, 0x40, 0x0f, 0xa6, 0xbf, + 0x01, 0x23, 0x4f, 0xf0, 0x3f, 0x09, 0x00, 0x23, 0xf8, 0xb2, 0x00, 0x28, + 0xcf, 0xd1, 0x00, 0xf0, 0xda, 0xf9, 0x08, 0xf5, 0x20, 0x60, 0xff, 0xf7, + 0x50, 0xfe, 0x4b, 0x46, 0x3f, 0x22, 0x00, 0x21, 0x08, 0xf5, 0x50, 0x60, + 0xd0, 0xe7, 0x80, 0x46, 0xdf, 0xf8, 0x60, 0x04, 0x00, 0x68, 0x00, 0xf0, + 0x03, 0x0a, 0x5f, 0xfa, 0x88, 0xf1, 0x42, 0x46, 0x4f, 0xf4, 0xc2, 0x70, + 0x00, 0x29, 0x04, 0x99, 0x0c, 0xbf, 0x4f, 0xf0, 0xc0, 0x09, 0x4f, 0xf0, + 0x60, 0x09, 0x42, 0x43, 0x88, 0x18, 0x00, 0x24, 0x03, 0x90, 0x48, 0xe0, + 0x07, 0xf5, 0x78, 0x6b, 0x00, 0xf0, 0xb5, 0xf9, 0x00, 0xf0, 0xc4, 0xf9, + 0x00, 0xf0, 0xbc, 0xf9, 0x07, 0xf5, 0x60, 0x67, 0x73, 0x78, 0x1f, 0x22, + 0x00, 0xf0, 0xc4, 0xf9, 0x73, 0x78, 0x4f, 0xf4, 0x78, 0x72, 0x05, 0x21, + 0x00, 0xf0, 0xbb, 0xf9, 0x73, 0x78, 0x4f, 0xf4, 0xf8, 0x42, 0x0a, 0x21, + 0x00, 0xf0, 0xb5, 0xf9, 0x73, 0x78, 0x4f, 0xf4, 0x78, 0x22, 0x0f, 0x21, + 0x00, 0xf0, 0xaf, 0xf9, 0x73, 0x78, 0x4f, 0xf0, 0xf8, 0x72, 0x14, 0x21, + 0x00, 0xf0, 0xa9, 0xf9, 0x73, 0x78, 0x4f, 0xf0, 0x78, 0x52, 0x19, 0x21, + 0x00, 0xf0, 0xa3, 0xf9, 0x73, 0x78, 0x1f, 0x22, 0x00, 0x21, 0x00, 0xf0, + 0x99, 0xf9, 0x73, 0x78, 0x4f, 0xf4, 0x78, 0x72, 0x05, 0x21, 0x00, 0xf0, + 0x93, 0xf9, 0x03, 0x99, 0x91, 0xf8, 0x80, 0x01, 0x00, 0x28, 0x05, 0x98, + 0x0c, 0xbf, 0x2a, 0xea, 0x00, 0x0a, 0x40, 0xea, 0x0a, 0x0a, 0x53, 0x46, + 0x03, 0x22, 0x00, 0x21, 0xdf, 0xf8, 0xac, 0x03, 0xff, 0xf7, 0xeb, 0xfd, + 0x64, 0x1c, 0x4c, 0x45, 0x19, 0xd2, 0x03, 0x98, 0x00, 0xeb, 0x44, 0x06, + 0x5f, 0xfa, 0x88, 0xf0, 0x71, 0x78, 0xa7, 0x00, 0x20, 0x29, 0x9b, 0x41, + 0xdb, 0x43, 0xdb, 0x0f, 0x00, 0x28, 0x07, 0xf1, 0x90, 0x47, 0xa5, 0xd1, + 0x07, 0xf5, 0x20, 0x6b, 0x00, 0xf0, 0x5b, 0xf9, 0x00, 0xf0, 0x6a, 0xf9, + 0x00, 0xf0, 0x62, 0xf9, 0x07, 0xf5, 0xe0, 0x67, 0xa4, 0xe7, 0xd8, 0x48, + 0x00, 0x99, 0x50, 0xf8, 0x21, 0x90, 0x4f, 0xf0, 0x00, 0x0a, 0x05, 0xeb, + 0x0a, 0x00, 0xc3, 0x7c, 0x08, 0x2b, 0x28, 0xbf, 0x1f, 0x23, 0x09, 0xeb, + 0x8a, 0x00, 0x1f, 0x22, 0x00, 0x21, 0x00, 0xf5, 0x41, 0x70, 0xff, 0xf7, + 0xba, 0xfd, 0x0a, 0xf1, 0x01, 0x0a, 0xba, 0xf1, 0x08, 0x0f, 0xec, 0xd3, + 0x18, 0x9e, 0x00, 0x24, 0x28, 0x19, 0xc0, 0x7c, 0x08, 0x28, 0x0a, 0xd2, + 0x06, 0xeb, 0xc4, 0x01, 0x09, 0xeb, 0x80, 0x00, 0xcb, 0x78, 0x20, 0x22, + 0x05, 0x21, 0x00, 0xf5, 0x41, 0x70, 0xff, 0xf7, 0xa4, 0xfd, 0x64, 0x1c, + 0x08, 0x2c, 0xed, 0xd3, 0x18, 0x96, 0x4f, 0xf0, 0x00, 0x08, 0xe8, 0x7a, + 0xef, 0xf7, 0xd2, 0xfa, 0x2b, 0x78, 0x01, 0x2b, 0x06, 0x46, 0x09, 0xf5, + 0x40, 0x7a, 0xc8, 0xbf, 0x4b, 0xf6, 0x0a, 0x08, 0x07, 0xdc, 0x03, 0x22, + 0x00, 0x21, 0x00, 0xf0, 0x1a, 0xf9, 0x68, 0x79, 0x10, 0xb9, 0x4b, 0xf6, + 0x14, 0x08, 0x9d, 0xe0, 0x68, 0x7a, 0x42, 0x1e, 0x10, 0x42, 0x1a, 0xd1, + 0xc8, 0xb1, 0x09, 0xf5, 0x88, 0x67, 0xeb, 0x78, 0x00, 0xf0, 0x1d, 0xf9, + 0xab, 0x78, 0x4f, 0xf4, 0x70, 0x62, 0x08, 0x21, 0x00, 0xf0, 0x15, 0xf9, + 0x2b, 0x79, 0x4f, 0xf4, 0xf8, 0x12, 0x10, 0x21, 0x00, 0xf0, 0x0f, 0xf9, + 0x73, 0x1e, 0x00, 0xf0, 0x09, 0xf9, 0x28, 0x78, 0x01, 0x28, 0x0c, 0xbf, + 0x01, 0x23, 0xab, 0x7a, 0x02, 0xe0, 0x4b, 0xf6, 0x0d, 0x08, 0x7b, 0xe0, + 0x4f, 0xf0, 0x00, 0x42, 0x1f, 0x21, 0x00, 0xf0, 0xfe, 0xf8, 0xeb, 0x79, + 0x09, 0xf2, 0x44, 0x47, 0x5b, 0x1e, 0x00, 0xf0, 0xfa, 0xf8, 0x28, 0x78, + 0x01, 0x28, 0x07, 0xd1, 0x6b, 0x78, 0x5b, 0x1e, 0xf8, 0x22, 0x03, 0x21, + 0x09, 0xf5, 0x94, 0x60, 0xff, 0xf7, 0x51, 0xfd, 0xab, 0x79, 0x4f, 0xf4, + 0x7f, 0x42, 0x08, 0x21, 0x00, 0xf0, 0xe7, 0xf8, 0x6b, 0x79, 0x5b, 0x1e, + 0x4f, 0xf4, 0x7f, 0x02, 0x10, 0x21, 0x00, 0xf0, 0xe0, 0xf8, 0x00, 0x23, + 0x4f, 0xf0, 0x40, 0x42, 0x1e, 0x21, 0x00, 0xf0, 0xda, 0xf8, 0x09, 0xf5, + 0x89, 0x66, 0x95, 0xf8, 0x65, 0x30, 0xe0, 0x22, 0x05, 0x21, 0x00, 0xf0, + 0xc0, 0xf8, 0x2b, 0x7a, 0x5b, 0x1e, 0x1f, 0x22, 0x00, 0x21, 0x00, 0xf0, + 0xba, 0xf8, 0x2b, 0x7a, 0x5b, 0x1e, 0x00, 0xf0, 0xc5, 0xf8, 0x01, 0x23, + 0x4f, 0xf4, 0x60, 0x42, 0x0d, 0x21, 0x00, 0xf0, 0xb0, 0xf8, 0x00, 0x23, + 0x04, 0x22, 0x02, 0x21, 0x00, 0xf0, 0xad, 0xf8, 0x01, 0x23, 0x08, 0x22, + 0x03, 0x21, 0x00, 0xf0, 0xa8, 0xf8, 0x6b, 0x7a, 0x5b, 0x1e, 0x4f, 0xf4, + 0xf8, 0x52, 0x08, 0x21, 0x00, 0xf0, 0x9f, 0xf8, 0xe8, 0x79, 0x29, 0x7a, + 0xc0, 0x00, 0xb0, 0xfb, 0xf1, 0xf2, 0x01, 0xfb, 0x12, 0x00, 0x03, 0x00, + 0x18, 0xbf, 0x01, 0x23, 0xdb, 0xb2, 0x00, 0xf0, 0x8e, 0xf8, 0x00, 0xf0, + 0x90, 0xf8, 0x01, 0x23, 0x4f, 0xf4, 0x80, 0x62, 0x0a, 0x21, 0x09, 0xf5, + 0x8e, 0x60, 0xff, 0xf7, 0xfe, 0xfc, 0x68, 0x7b, 0x2b, 0x7b, 0x43, 0xea, + 0x00, 0x23, 0x4f, 0xf6, 0xff, 0x72, 0x00, 0x21, 0x09, 0xf2, 0x34, 0x40, + 0xff, 0xf7, 0xf3, 0xfc, 0x09, 0xf5, 0x87, 0x64, 0x20, 0x68, 0xc0, 0xf3, + 0x00, 0x20, 0x08, 0xb1, 0x4b, 0xf6, 0x0f, 0x08, 0xb8, 0xf1, 0x00, 0x0f, + 0x61, 0xd1, 0x09, 0xf5, 0x86, 0x64, 0x01, 0x23, 0x4f, 0xf4, 0x00, 0x52, + 0x0d, 0x21, 0x00, 0xf0, 0x82, 0xf8, 0xa8, 0x7b, 0xc0, 0xf3, 0x40, 0x03, + 0x40, 0x22, 0x06, 0x21, 0x00, 0xf0, 0x65, 0xf8, 0x28, 0x78, 0x00, 0x28, + 0x06, 0xbf, 0xab, 0x7b, 0x03, 0xf0, 0x01, 0x03, 0x00, 0x23, 0x80, 0x22, + 0x07, 0x21, 0x00, 0xf0, 0x5a, 0xf8, 0x28, 0x78, 0x00, 0x28, 0x06, 0xbf, + 0xab, 0x7b, 0xdb, 0x09, 0x00, 0x23, 0x4f, 0xf4, 0x00, 0x42, 0x0f, 0x21, + 0x00, 0xf0, 0x65, 0xf8, 0xa8, 0x7b, 0xc0, 0xf3, 0x80, 0x16, 0x33, 0x46, + 0x4f, 0xf0, 0x80, 0x52, 0x1c, 0x21, 0x00, 0xf0, 0x5c, 0xf8, 0x3e, 0xb1, + 0xa8, 0x7b, 0xc0, 0xf3, 0x83, 0x03, 0x4f, 0xf0, 0x70, 0x62, 0x18, 0x21, + 0x00, 0xf0, 0x53, 0xf8, 0x01, 0x23, 0x04, 0x22, 0x02, 0x21, 0x00, 0xf0, + 0x4e, 0xf8, 0x00, 0x98, 0xd0, 0xb9, 0x02, 0x9d, 0xe8, 0x7a, 0x00, 0x23, + 0x01, 0x21, 0x99, 0x40, 0x08, 0x42, 0x03, 0xd1, 0x5b, 0x1c, 0x08, 0x2b, + 0xf8, 0xd3, 0x05, 0xe0, 0x4f, 0xf4, 0xe0, 0x62, 0x08, 0x21, 0x3d, 0x48, + 0xff, 0xf7, 0x99, 0xfc, 0x02, 0x95, 0x00, 0x23, 0x08, 0x22, 0x03, 0x21, + 0x39, 0x48, 0xff, 0xf7, 0x92, 0xfc, 0x01, 0x20, 0x8d, 0xf8, 0x04, 0x00, + 0x00, 0x98, 0x40, 0x1c, 0x03, 0x28, 0x00, 0x90, 0x03, 0xda, 0xb8, 0xf1, + 0x00, 0x0f, 0x3f, 0xf4, 0xd4, 0xad, 0xb8, 0xf1, 0x00, 0x0f, 0x02, 0xbf, + 0x9d, 0xf8, 0x04, 0x00, 0x00, 0x28, 0x4b, 0xf6, 0x08, 0x08, 0x40, 0x46, + 0x0f, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x4f, 0xf4, 0x80, 0x32, 0x10, 0x21, + 0x70, 0x47, 0x30, 0x46, 0x73, 0xe4, 0x50, 0x46, 0x71, 0xe4, 0x4f, 0xf0, + 0x90, 0x40, 0x6e, 0xe4, 0x03, 0x98, 0x10, 0xf8, 0x14, 0x30, 0x4f, 0xf4, + 0xe0, 0x52, 0x0a, 0x21, 0x58, 0x46, 0x66, 0xe4, 0x4f, 0xf0, 0xf8, 0x52, + 0x18, 0x21, 0x38, 0x46, 0x61, 0xe4, 0xff, 0x22, 0x00, 0x21, 0x38, 0x46, + 0x5d, 0xe4, 0x20, 0x46, 0x5b, 0xe4, 0x38, 0xb5, 0x04, 0x46, 0x00, 0x25, + 0x04, 0xeb, 0xc5, 0x00, 0x0f, 0x22, 0x03, 0x79, 0x1f, 0x48, 0x00, 0x21, + 0x00, 0xeb, 0x85, 0x00, 0xff, 0xf7, 0x4f, 0xfc, 0x6d, 0x1c, 0x08, 0x2d, + 0xf2, 0xd3, 0x31, 0xbd, 0x02, 0x46, 0x00, 0x20, 0xd1, 0x79, 0x00, 0x29, + 0x1e, 0xbf, 0xd1, 0x7a, 0x00, 0x29, 0x01, 0x20, 0x70, 0x47, 0x38, 0xb5, + 0x00, 0xf2, 0xcf, 0x34, 0x15, 0x4d, 0x23, 0x78, 0x4f, 0xf0, 0x00, 0x42, + 0x1f, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x37, 0xfc, 0x63, 0x88, 0x12, 0x4a, + 0x5b, 0x1e, 0x08, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x30, 0xfc, 0x63, 0x78, + 0x0f, 0x48, 0x4f, 0xf0, 0xe0, 0x42, 0x1c, 0x21, 0xff, 0xf7, 0x29, 0xfc, + 0x23, 0x79, 0x1f, 0x22, 0x00, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x23, 0xfc, + 0x00, 0x20, 0x32, 0xbd, 0x10, 0x06, 0x00, 0x48, 0x20, 0x00, 0x00, 0x47, + 0x8c, 0x9d, 0x04, 0x01, 0x83, 0x01, 0x00, 0x47, 0x84, 0x01, 0x00, 0x47, + 0x00, 0x12, 0x00, 0x48, 0xf0, 0x05, 0x00, 0x48, 0xf0, 0x06, 0x00, 0x48, + 0x00, 0xff, 0xff, 0x00, 0x28, 0x00, 0x00, 0x48, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, 0x0d, 0xf8, 0x01, 0x70, + 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, + 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x70, 0x47, + 0x2d, 0xe9, 0xf8, 0x43, 0x80, 0x46, 0x00, 0x24, 0x00, 0x26, 0x00, 0x27, + 0x00, 0x25, 0x48, 0x20, 0x68, 0x43, 0x00, 0xf0, 0x2f, 0xf8, 0x28, 0xb1, + 0x99, 0xf8, 0x0b, 0x00, 0x00, 0xea, 0x06, 0x01, 0x0f, 0x43, 0x06, 0x43, + 0x6d, 0x1c, 0x01, 0x2d, 0xf1, 0xdd, 0xff, 0xb2, 0x0f, 0xb1, 0x4b, 0xf6, + 0x02, 0x04, 0x1c, 0xe0, 0x2d, 0xe9, 0xf8, 0x43, 0x80, 0x46, 0x00, 0x24, + 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x48, 0x20, 0x78, 0x43, 0x00, 0xf0, + 0x15, 0xf8, 0x28, 0xb1, 0x99, 0xf8, 0x0f, 0x00, 0x6d, 0x1c, 0x03, 0x28, + 0x08, 0xbf, 0x76, 0x1c, 0x7f, 0x1c, 0x01, 0x2f, 0xf1, 0xdd, 0xf0, 0xb2, + 0x00, 0x28, 0x1f, 0xbf, 0xf6, 0xb2, 0xed, 0xb2, 0xae, 0x42, 0x4b, 0xf6, + 0x07, 0x04, 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0x08, 0xeb, 0x00, 0x09, + 0x48, 0x46, 0x51, 0xe3, 0x00, 0x23, 0x03, 0x22, 0x00, 0x21, 0xdf, 0xf8, + 0xe8, 0x06, 0xaa, 0xe7, 0x2d, 0xe9, 0xf0, 0x4f, 0x82, 0x46, 0x17, 0x46, + 0x07, 0xf2, 0x94, 0x70, 0x8b, 0xb0, 0x83, 0x7e, 0xdf, 0xf8, 0xd0, 0x46, + 0xdf, 0xf8, 0xd0, 0x86, 0x0e, 0x46, 0x0c, 0x22, 0x02, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0x99, 0xff, 0x97, 0xf8, 0x94, 0x37, 0x4f, 0xf4, 0x7f, 0x42, + 0x08, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x91, 0xff, 0xff, 0x23, 0x4f, 0xf4, + 0x7f, 0x42, 0x08, 0x21, 0x40, 0x46, 0xff, 0xf7, 0x8a, 0xff, 0x18, 0x22, + 0x00, 0x21, 0x05, 0xa8, 0xdf, 0xf7, 0x18, 0xf8, 0x00, 0x24, 0x8d, 0xf8, + 0x00, 0x40, 0x4f, 0xf0, 0x70, 0x09, 0x00, 0x25, 0x48, 0x20, 0x68, 0x43, + 0x4f, 0xf4, 0xc2, 0x71, 0x06, 0xeb, 0x00, 0x0b, 0x04, 0x91, 0x58, 0x46, + 0x00, 0xf0, 0x16, 0xfb, 0x90, 0xb1, 0x04, 0x98, 0x68, 0x43, 0x38, 0x44, + 0x90, 0xf8, 0x0c, 0x16, 0x01, 0x29, 0xdb, 0xf8, 0x3c, 0x10, 0x08, 0xbf, + 0x89, 0x00, 0x0c, 0x22, 0x05, 0xa8, 0x6a, 0x43, 0x83, 0x18, 0x00, 0x22, + 0x50, 0x46, 0xef, 0xf7, 0x47, 0xf9, 0x04, 0x46, 0x6d, 0x1c, 0x01, 0x2d, + 0x01, 0xdc, 0x00, 0x2c, 0xdc, 0xd0, 0x00, 0x2c, 0x01, 0x96, 0x02, 0x97, + 0x4d, 0xd1, 0xdf, 0xf8, 0x44, 0x56, 0x05, 0x9b, 0x07, 0x22, 0x00, 0xf0, + 0x37, 0xfb, 0x08, 0x9b, 0x70, 0x22, 0x04, 0x21, 0x00, 0xf0, 0x33, 0xfb, + 0x02, 0x9e, 0x9d, 0xf8, 0x00, 0xa0, 0x00, 0x27, 0xb8, 0x00, 0x00, 0xf1, + 0x90, 0x40, 0x00, 0xf1, 0x08, 0x0b, 0xf0, 0x19, 0x00, 0xf2, 0x96, 0x75, + 0x4f, 0xf0, 0x80, 0x72, 0x2b, 0x78, 0x18, 0x21, 0x00, 0xf0, 0xa9, 0xfa, + 0x2b, 0x7a, 0x4f, 0xf4, 0xe0, 0x02, 0x14, 0x21, 0x00, 0xf0, 0xa3, 0xfa, + 0x2b, 0x7c, 0x4f, 0xf4, 0xe0, 0x22, 0x00, 0xf0, 0x9d, 0xfa, 0x28, 0x78, + 0x28, 0xb1, 0x28, 0x7c, 0x48, 0x45, 0x4f, 0xf0, 0x01, 0x0a, 0x38, 0xbf, + 0x81, 0x46, 0x7f, 0x1c, 0x08, 0x2f, 0xdb, 0xd3, 0x30, 0x46, 0x00, 0xf2, + 0x94, 0x70, 0x02, 0x96, 0x81, 0x7e, 0x03, 0x29, 0x05, 0xd0, 0x43, 0x78, + 0xff, 0x22, 0x00, 0x21, 0x40, 0x46, 0xff, 0xf7, 0x18, 0xff, 0xdf, 0xf8, + 0xc8, 0x65, 0x53, 0x46, 0x80, 0x22, 0x07, 0x21, 0x30, 0x46, 0xff, 0xf7, + 0x07, 0xff, 0x4b, 0x46, 0x70, 0x22, 0x04, 0x21, 0x30, 0x46, 0xff, 0xf7, + 0x01, 0xff, 0x00, 0x2c, 0x40, 0xf0, 0x66, 0x82, 0x00, 0x27, 0x01, 0x9e, + 0xdf, 0xf8, 0xa4, 0xa5, 0x4f, 0xf0, 0x00, 0x0b, 0x00, 0x25, 0xb8, 0x46, + 0xdf, 0xf8, 0x9c, 0x05, 0x50, 0xf8, 0x28, 0x00, 0x01, 0x23, 0x03, 0xfa, + 0x08, 0xf3, 0x4f, 0xf4, 0x7f, 0x42, 0x08, 0x21, 0xff, 0xf7, 0xf3, 0xfe, + 0x48, 0x20, 0x00, 0xfb, 0x08, 0xf0, 0x06, 0xeb, 0x00, 0x09, 0x48, 0x46, + 0x00, 0xf0, 0x8c, 0xfa, 0x00, 0x28, 0x1c, 0xbf, 0x99, 0xf8, 0x0f, 0x10, + 0x03, 0x29, 0x22, 0xd0, 0x4a, 0x1c, 0x99, 0xf8, 0x10, 0x00, 0x42, 0xea, + 0x0b, 0x0b, 0x00, 0xb1, 0x15, 0x43, 0x99, 0xf8, 0x11, 0x00, 0x00, 0xb1, + 0x17, 0x43, 0x00, 0x29, 0x18, 0xbf, 0x02, 0x29, 0x06, 0xd1, 0x99, 0xf8, + 0x12, 0x30, 0x0f, 0x22, 0x00, 0x21, 0x50, 0x46, 0xff, 0xf7, 0xc6, 0xfe, + 0x99, 0xf8, 0x0f, 0x00, 0x01, 0x28, 0x18, 0xbf, 0x02, 0x28, 0x06, 0xd1, + 0x99, 0xf8, 0x12, 0x30, 0xf0, 0x22, 0x04, 0x21, 0x50, 0x46, 0xff, 0xf7, + 0xb9, 0xfe, 0x08, 0xf1, 0x01, 0x08, 0xb8, 0xf1, 0x01, 0x0f, 0xbd, 0xdd, + 0x01, 0x96, 0xeb, 0xb2, 0x03, 0xb1, 0x01, 0x23, 0xdf, 0xf8, 0x14, 0x55, + 0x10, 0x22, 0x04, 0x21, 0x28, 0x46, 0xff, 0xf7, 0xa9, 0xfe, 0x5f, 0xfa, + 0x8b, 0xf3, 0x03, 0x22, 0x00, 0x21, 0x28, 0x46, 0xff, 0xf7, 0xa2, 0xfe, + 0xfb, 0xb2, 0x0c, 0x22, 0x02, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x9c, 0xfe, + 0x00, 0x20, 0x00, 0x90, 0x00, 0x9a, 0x01, 0x99, 0x48, 0x20, 0x42, 0x43, + 0x88, 0x18, 0x00, 0xf0, 0x3d, 0xfa, 0x00, 0x28, 0x00, 0xf0, 0xf0, 0x81, + 0x00, 0x98, 0x01, 0x21, 0x81, 0x40, 0x03, 0x91, 0x02, 0x99, 0x01, 0xf2, + 0x94, 0x70, 0x82, 0x7e, 0x03, 0x98, 0x02, 0x42, 0x5f, 0xd0, 0x00, 0x9c, + 0x01, 0x99, 0x22, 0x46, 0x48, 0x20, 0x42, 0x43, 0x4f, 0xf0, 0x00, 0x0a, + 0x8d, 0x18, 0x05, 0xeb, 0x0a, 0x01, 0xe0, 0xb2, 0xcf, 0x7e, 0x20, 0x2f, + 0xa6, 0xbf, 0x01, 0x23, 0x1f, 0x27, 0x00, 0x23, 0x4f, 0xea, 0x8a, 0x06, + 0x00, 0x28, 0x06, 0xf1, 0x90, 0x46, 0x4f, 0xf4, 0x80, 0x32, 0x0a, 0xd1, + 0x10, 0x21, 0x06, 0xf5, 0xb0, 0x50, 0xff, 0xf7, 0x70, 0xfe, 0x3b, 0x46, + 0x1f, 0x22, 0x00, 0x21, 0x06, 0xf5, 0xc8, 0x50, 0x09, 0xe0, 0x10, 0x21, + 0x06, 0xf5, 0xdc, 0x50, 0xff, 0xf7, 0x65, 0xfe, 0x3b, 0x46, 0x1f, 0x22, + 0x00, 0x21, 0x06, 0xf5, 0xe8, 0x50, 0xff, 0xf7, 0x5e, 0xfe, 0x0a, 0xf1, + 0x01, 0x0a, 0xba, 0xf1, 0x1f, 0x0f, 0xd2, 0xd9, 0xdf, 0xf8, 0x50, 0x04, + 0x00, 0x99, 0x50, 0xf8, 0x21, 0xa0, 0x01, 0x98, 0x48, 0x26, 0x71, 0x43, + 0x00, 0x27, 0x44, 0x18, 0xe0, 0x19, 0xc3, 0x7c, 0x08, 0x2b, 0x28, 0xbf, + 0x1f, 0x23, 0x0a, 0xeb, 0x87, 0x00, 0x1f, 0x22, 0x00, 0x21, 0x00, 0xf5, + 0x41, 0x70, 0xff, 0xf7, 0x42, 0xfe, 0x7f, 0x1c, 0x08, 0x2f, 0xef, 0xd3, + 0x00, 0x99, 0x01, 0x98, 0x4e, 0x43, 0x06, 0x44, 0x00, 0x24, 0xf0, 0x7a, + 0xee, 0xf7, 0x72, 0xff, 0x33, 0x78, 0x01, 0x2b, 0x05, 0x46, 0x0a, 0xf5, + 0x4a, 0x77, 0x7d, 0xdd, 0x4b, 0xf6, 0x0c, 0x04, 0x52, 0xe1, 0x00, 0x9a, + 0x04, 0x98, 0x02, 0x99, 0xdd, 0xf8, 0x00, 0xa0, 0x42, 0x43, 0x88, 0x18, + 0x00, 0xf2, 0x8c, 0x44, 0xdf, 0xf8, 0xf0, 0x03, 0x07, 0x68, 0x5f, 0xfa, + 0x8a, 0xf1, 0x00, 0x29, 0x07, 0xf0, 0x03, 0x07, 0x0c, 0xbf, 0xc0, 0x26, + 0x60, 0x26, 0x4f, 0xf0, 0x00, 0x08, 0x46, 0xe0, 0x09, 0xf5, 0xdc, 0x5b, + 0x00, 0xf0, 0x7e, 0xf9, 0x00, 0xf0, 0x74, 0xf9, 0x00, 0xf0, 0x7d, 0xf9, + 0x09, 0xf5, 0xd0, 0x59, 0x6b, 0x78, 0x1f, 0x22, 0x00, 0x21, 0x00, 0xf0, + 0x78, 0xf9, 0x6b, 0x78, 0x4f, 0xf4, 0x78, 0x72, 0x05, 0x21, 0x00, 0xf0, + 0x72, 0xf9, 0x6b, 0x78, 0x4f, 0xf4, 0xf8, 0x42, 0x0a, 0x21, 0x00, 0xf0, + 0x6c, 0xf9, 0x6b, 0x78, 0x4f, 0xf4, 0x78, 0x22, 0x0f, 0x21, 0x00, 0xf0, + 0x66, 0xf9, 0x6b, 0x78, 0x4f, 0xf0, 0xf8, 0x72, 0x14, 0x21, 0x00, 0xf0, + 0x60, 0xf9, 0x6b, 0x78, 0x4f, 0xf0, 0x78, 0x52, 0x19, 0x21, 0x00, 0xf0, + 0x5a, 0xf9, 0x6b, 0x78, 0x1f, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x53, 0xf9, + 0x6b, 0x78, 0x4f, 0xf4, 0x78, 0x72, 0x05, 0x21, 0x00, 0xf0, 0x4d, 0xf9, + 0x94, 0xf8, 0x80, 0x01, 0x00, 0x28, 0x03, 0x98, 0x0c, 0xbf, 0x87, 0x43, + 0x07, 0x43, 0x3b, 0x46, 0x03, 0x22, 0x00, 0x21, 0xd4, 0x48, 0xff, 0xf7, + 0xd2, 0xfd, 0x08, 0xf1, 0x01, 0x08, 0xb0, 0x45, 0xbf, 0xf4, 0x74, 0xaf, + 0x4f, 0xea, 0x88, 0x00, 0x04, 0xeb, 0x48, 0x05, 0x00, 0xf1, 0x90, 0x49, + 0x68, 0x78, 0x1f, 0x28, 0x94, 0xbf, 0x00, 0x23, 0x01, 0x23, 0x5f, 0xfa, + 0x8a, 0xf1, 0x00, 0x29, 0xa6, 0xd1, 0x09, 0xf5, 0xb0, 0x5b, 0x00, 0xf0, + 0x25, 0xf9, 0x00, 0xf0, 0x1b, 0xf9, 0x00, 0xf0, 0x24, 0xf9, 0x09, 0xf5, + 0x98, 0x59, 0xa5, 0xe7, 0x03, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x18, 0xf9, + 0x70, 0x79, 0x10, 0xb9, 0x4b, 0xf6, 0x14, 0x04, 0xce, 0xe0, 0x71, 0x7a, + 0x4a, 0x1e, 0x11, 0x42, 0x53, 0xd1, 0x00, 0x29, 0x51, 0xd0, 0x0a, 0xf5, + 0x4c, 0x7b, 0xf3, 0x78, 0xff, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x0b, 0xf9, + 0x33, 0x79, 0x1f, 0x22, 0x00, 0x21, 0x0a, 0xf5, 0x4d, 0x70, 0xff, 0xf7, + 0x96, 0xfd, 0x33, 0x79, 0x5b, 0x1c, 0x1f, 0x22, 0x00, 0x21, 0x0a, 0xf5, + 0x4e, 0x70, 0xff, 0xf7, 0x8e, 0xfd, 0x33, 0x79, 0x9b, 0x1c, 0x1f, 0x22, + 0x00, 0x21, 0x0a, 0xf5, 0x4f, 0x70, 0xff, 0xf7, 0x86, 0xfd, 0x33, 0x79, + 0xdb, 0x1c, 0x1f, 0x22, 0x00, 0x21, 0x0a, 0xf5, 0x50, 0x70, 0xff, 0xf7, + 0x7e, 0xfd, 0x33, 0x79, 0x1b, 0x1d, 0x1f, 0x22, 0x00, 0x21, 0x0a, 0xf5, + 0x51, 0x70, 0xff, 0xf7, 0x76, 0xfd, 0x33, 0x79, 0x5b, 0x1d, 0x1f, 0x22, + 0x00, 0x21, 0x0a, 0xf5, 0x52, 0x70, 0xff, 0xf7, 0x6e, 0xfd, 0x33, 0x79, + 0x9b, 0x1d, 0x1f, 0x22, 0x00, 0x21, 0x0a, 0xf5, 0x53, 0x70, 0xff, 0xf7, + 0x66, 0xfd, 0x33, 0x79, 0xdb, 0x1d, 0x1f, 0x22, 0x00, 0x21, 0x0a, 0xf5, + 0x54, 0x70, 0xff, 0xf7, 0x5e, 0xfd, 0x6b, 0x1e, 0x4f, 0xf4, 0xf8, 0x52, + 0x08, 0x21, 0x00, 0xf0, 0xc6, 0xf8, 0x30, 0x78, 0x01, 0x28, 0x0c, 0xbf, + 0x01, 0x23, 0xb3, 0x7a, 0x02, 0xe0, 0x4b, 0xf6, 0x0e, 0x04, 0x73, 0xe0, + 0x4f, 0xf4, 0x00, 0x42, 0x0f, 0x21, 0x00, 0xf0, 0xb8, 0xf8, 0xf3, 0x79, + 0x5b, 0x1e, 0x4f, 0xf4, 0x7f, 0x02, 0x00, 0xf0, 0xb1, 0xf8, 0x30, 0x78, + 0x01, 0x28, 0x08, 0xd1, 0x73, 0x78, 0x5b, 0x1e, 0x4f, 0xf4, 0xf8, 0x52, + 0x08, 0x21, 0x0a, 0xf5, 0x5e, 0x70, 0xff, 0xf7, 0x38, 0xfd, 0xb3, 0x79, + 0x4f, 0xf0, 0x7f, 0x42, 0x18, 0x21, 0x00, 0xf0, 0xa0, 0xf8, 0x73, 0x79, + 0x0a, 0xf5, 0x55, 0x75, 0x5b, 0x1e, 0xff, 0x22, 0x00, 0xf0, 0x10, 0xf9, + 0x00, 0x23, 0x4f, 0xf4, 0x40, 0x42, 0x0e, 0x21, 0x00, 0xf0, 0x0b, 0xf9, + 0x96, 0xf8, 0x44, 0x30, 0x4f, 0xf4, 0x60, 0x02, 0x15, 0x21, 0x00, 0xf0, + 0x04, 0xf9, 0x33, 0x7a, 0x5b, 0x1e, 0x4f, 0xf4, 0xf8, 0x12, 0x10, 0x21, + 0x00, 0xf0, 0xfd, 0xf8, 0x33, 0x7a, 0x5b, 0x1e, 0x4f, 0xf4, 0xf8, 0x52, + 0x08, 0x21, 0x00, 0xf0, 0xf6, 0xf8, 0x01, 0x23, 0x4f, 0xf0, 0x60, 0x42, + 0x1d, 0x21, 0x00, 0xf0, 0xf0, 0xf8, 0x00, 0x23, 0x04, 0x22, 0x02, 0x21, + 0x00, 0xf0, 0x6e, 0xf8, 0x01, 0x23, 0x08, 0x22, 0x03, 0x21, 0x00, 0xf0, + 0x69, 0xf8, 0x73, 0x7a, 0x5b, 0x1e, 0x4f, 0xf0, 0xf8, 0x52, 0x18, 0x21, + 0x00, 0xf0, 0xdf, 0xf8, 0xf0, 0x79, 0x31, 0x7a, 0xc0, 0x00, 0xb0, 0xfb, + 0xf1, 0xf2, 0x01, 0xfb, 0x12, 0x00, 0x03, 0x00, 0x18, 0xbf, 0x01, 0x23, + 0xdb, 0xb2, 0x4f, 0xf4, 0x00, 0x52, 0x0d, 0x21, 0x00, 0xf0, 0xcf, 0xf8, + 0x70, 0x7b, 0x33, 0x7b, 0x5e, 0x4a, 0x43, 0xea, 0x00, 0x23, 0x10, 0x21, + 0x00, 0xf0, 0x4a, 0xf8, 0x38, 0x68, 0xc0, 0xf3, 0x00, 0x40, 0x08, 0xb1, + 0x4b, 0xf6, 0x10, 0x04, 0x84, 0xbb, 0xb0, 0x7b, 0xc0, 0xf3, 0x40, 0x03, + 0x40, 0x22, 0x06, 0x21, 0x00, 0xf0, 0x3c, 0xf8, 0x30, 0x78, 0x00, 0x28, + 0x06, 0xbf, 0xb3, 0x7b, 0x03, 0xf0, 0x01, 0x03, 0x00, 0x23, 0x80, 0x22, + 0x07, 0x21, 0x00, 0xf0, 0x31, 0xf8, 0x30, 0x78, 0x00, 0x28, 0x06, 0xbf, + 0xb3, 0x7b, 0xdb, 0x09, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, 0x38, 0x46, + 0xff, 0xf7, 0xbd, 0xfc, 0xb0, 0x7b, 0xc0, 0xf3, 0x80, 0x15, 0x2b, 0x46, + 0x4f, 0xf4, 0x80, 0x52, 0x0c, 0x21, 0x38, 0x46, 0xff, 0xf7, 0xb3, 0xfc, + 0x45, 0xb1, 0xb0, 0x7b, 0xc0, 0xf3, 0x83, 0x03, 0x4f, 0xf4, 0x70, 0x62, + 0x08, 0x21, 0x38, 0x46, 0xff, 0xf7, 0xa9, 0xfc, 0x00, 0x98, 0x40, 0x1c, + 0x01, 0x28, 0x00, 0x90, 0x02, 0xdc, 0x00, 0x2c, 0x3f, 0xf4, 0xfe, 0xad, + 0x20, 0x46, 0x0b, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x14, 0xf8, 0x18, 0x30, + 0x4f, 0xf4, 0xe0, 0x52, 0x0a, 0x21, 0x70, 0x47, 0x50, 0x46, 0x94, 0xe4, + 0x4f, 0xf4, 0x80, 0x32, 0x10, 0x21, 0x58, 0x46, 0x8f, 0xe4, 0x48, 0x46, + 0x8d, 0xe4, 0x2d, 0xe9, 0xf0, 0x41, 0x80, 0x46, 0x00, 0x27, 0x31, 0x4c, + 0x31, 0x4d, 0x2c, 0x20, 0x78, 0x43, 0x40, 0x44, 0x55, 0xf8, 0x27, 0x60, + 0x43, 0x78, 0x0a, 0x36, 0x01, 0x22, 0x00, 0x21, 0x30, 0x46, 0xff, 0xf7, + 0x73, 0xfc, 0x30, 0x78, 0x21, 0x78, 0x00, 0xf0, 0x01, 0x00, 0x7f, 0x1c, + 0x40, 0x18, 0x08, 0x2f, 0x20, 0x70, 0xea, 0xd3, 0xbd, 0xe8, 0xf0, 0x81, + 0x38, 0xb5, 0x04, 0x46, 0x00, 0x25, 0x2c, 0x20, 0x68, 0x43, 0x20, 0x44, + 0x03, 0x22, 0x83, 0x78, 0x22, 0x48, 0x00, 0x21, 0x00, 0xeb, 0x85, 0x00, + 0xff, 0xf7, 0x63, 0xfc, 0x6d, 0x1c, 0x08, 0x2d, 0xf1, 0xd3, 0x31, 0xbd, + 0x02, 0x46, 0x00, 0x20, 0xd1, 0x79, 0x00, 0x29, 0x1e, 0xbf, 0xd1, 0x7a, + 0x00, 0x29, 0x01, 0x20, 0x70, 0x47, 0x38, 0xb5, 0x00, 0xf2, 0xca, 0x34, + 0x18, 0x4d, 0x23, 0x78, 0x4f, 0xf0, 0x00, 0x42, 0x1f, 0x21, 0x00, 0xf0, + 0x32, 0xf8, 0x63, 0x88, 0x15, 0x4a, 0x5b, 0x1e, 0x08, 0x21, 0x00, 0xf0, + 0x2c, 0xf8, 0x63, 0x78, 0x13, 0x48, 0x4f, 0xf0, 0xe0, 0x62, 0x18, 0x21, + 0xff, 0xf7, 0x3f, 0xfc, 0x23, 0x79, 0x1f, 0x22, 0x00, 0xf0, 0x20, 0xf8, + 0x00, 0x20, 0x32, 0xbd, 0x38, 0x01, 0x00, 0x48, 0x3c, 0x01, 0x00, 0x48, + 0x04, 0x00, 0x00, 0x48, 0x20, 0x00, 0x00, 0x47, 0x86, 0x01, 0x00, 0x47, + 0x04, 0x9e, 0x04, 0x01, 0x85, 0x01, 0x00, 0x47, 0x80, 0x1d, 0x00, 0x48, + 0x00, 0x00, 0xff, 0xff, 0xab, 0x77, 0x02, 0x20, 0xa8, 0x98, 0x04, 0x01, + 0xb8, 0x00, 0x00, 0x48, 0xe0, 0x06, 0x00, 0x48, 0x00, 0xff, 0xff, 0x00, + 0x28, 0x00, 0x00, 0x48, 0x00, 0x21, 0x28, 0x46, 0x17, 0xe4, 0x00, 0x00, + 0xb0, 0xfa, 0x80, 0xf0, 0xc0, 0xf1, 0x1f, 0x00, 0x70, 0x47, 0x01, 0x46, + 0xb1, 0xfa, 0x81, 0xf0, 0xc0, 0xf1, 0x1f, 0x00, 0x01, 0x22, 0x82, 0x40, + 0x52, 0x1e, 0x0a, 0x42, 0x18, 0xbf, 0x40, 0x1c, 0x70, 0x47, 0x70, 0xb5, + 0x03, 0x46, 0x00, 0x20, 0x00, 0x24, 0x00, 0x25, 0x06, 0xe0, 0x53, 0xf8, + 0x25, 0x60, 0xb0, 0x42, 0x3c, 0xbf, 0x30, 0x46, 0x2c, 0x46, 0x6d, 0x1c, + 0x8d, 0x42, 0xf6, 0xd3, 0x02, 0xb1, 0x14, 0x60, 0x70, 0xbd, 0x02, 0x46, + 0xb2, 0xfb, 0xf1, 0xf0, 0x41, 0x43, 0x91, 0x42, 0x18, 0xbf, 0x40, 0x1c, + 0x70, 0x47, 0x06, 0xe0, 0xb0, 0xfb, 0xf1, 0xf3, 0x0a, 0x46, 0x01, 0xfb, + 0x13, 0x00, 0x01, 0x46, 0x10, 0x46, 0x00, 0x29, 0xf6, 0xd1, 0x70, 0x47, + 0x10, 0xb5, 0x04, 0x46, 0x08, 0x48, 0x00, 0x78, 0xa0, 0x28, 0x05, 0xd0, + 0x03, 0x22, 0x4f, 0xf6, 0x72, 0x71, 0x01, 0x20, 0xfa, 0xf7, 0x54, 0xfe, + 0x01, 0x20, 0x04, 0x2c, 0x82, 0xbf, 0xa4, 0x1f, 0x02, 0x2c, 0x00, 0x20, + 0x10, 0xbd, 0x00, 0xbf, 0x05, 0x00, 0x00, 0x47, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, + 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0x2d, 0xe9, 0xf8, 0x4f, 0x86, 0xb0, 0x06, 0x46, 0x89, 0x46, 0x18, 0x22, + 0x00, 0x21, 0x68, 0x46, 0xde, 0xf7, 0x46, 0xfc, 0x00, 0x24, 0x00, 0x25, + 0x4f, 0xf0, 0x2b, 0x0b, 0x0b, 0xfb, 0x05, 0xf0, 0x19, 0xf8, 0x00, 0x10, + 0x01, 0x29, 0x0c, 0xd1, 0x48, 0x44, 0x0c, 0x22, 0xd0, 0xf8, 0x27, 0x10, + 0x6a, 0x43, 0x0d, 0xeb, 0x02, 0x03, 0x00, 0x22, 0x30, 0x46, 0xee, 0xf7, + 0x83, 0xfd, 0x04, 0x00, 0x04, 0xd1, 0x6d, 0x1c, 0x01, 0x2d, 0x01, 0xdc, + 0x00, 0x2c, 0xe7, 0xd0, 0x00, 0x2c, 0x66, 0xd1, 0x00, 0x9b, 0x35, 0x48, + 0x00, 0xf0, 0x6e, 0xf8, 0x03, 0x9b, 0x34, 0x48, 0x00, 0xf0, 0x6a, 0xf8, + 0x00, 0x25, 0x0b, 0xfb, 0x05, 0xf0, 0x09, 0xeb, 0x00, 0x06, 0x30, 0x78, + 0x01, 0x28, 0x53, 0xd1, 0x00, 0x27, 0xf0, 0x19, 0x83, 0x79, 0x2e, 0x48, + 0x00, 0xeb, 0x87, 0x08, 0x40, 0x2b, 0xe8, 0xb2, 0x04, 0xdb, 0x08, 0xb9, + 0x01, 0x23, 0x08, 0xe0, 0x01, 0x23, 0x10, 0xe0, 0x40, 0xb9, 0x3f, 0x22, + 0x00, 0x21, 0x40, 0x46, 0xff, 0xf7, 0xa6, 0xff, 0x00, 0x23, 0x80, 0x22, + 0x07, 0x21, 0x09, 0xe0, 0x4f, 0xf4, 0x7c, 0x52, 0x08, 0x21, 0x40, 0x46, + 0xff, 0xf7, 0x9c, 0xff, 0x00, 0x23, 0x4f, 0xf4, 0x00, 0x42, 0x0f, 0x21, + 0x40, 0x46, 0xff, 0xf7, 0x95, 0xff, 0x7f, 0x1c, 0x20, 0x2f, 0xd8, 0xd3, + 0xa8, 0x00, 0x00, 0xf1, 0x90, 0x47, 0x73, 0x78, 0x07, 0xf5, 0xd4, 0x6a, + 0x5b, 0x1e, 0xff, 0x22, 0x00, 0x21, 0x50, 0x46, 0xff, 0xf7, 0x86, 0xff, + 0x33, 0x79, 0x5b, 0x1e, 0x4f, 0xf4, 0x78, 0x02, 0x13, 0x21, 0x50, 0x46, + 0xff, 0xf7, 0x7e, 0xff, 0x73, 0x79, 0x5b, 0x1e, 0x4f, 0xf4, 0xf8, 0x52, + 0x08, 0x21, 0x50, 0x46, 0xff, 0xf7, 0x76, 0xff, 0xf3, 0x78, 0x07, 0xf5, + 0xd5, 0x67, 0x5b, 0x1e, 0xff, 0x22, 0x00, 0x21, 0x38, 0x46, 0xff, 0xf7, + 0x6d, 0xff, 0xb3, 0x78, 0x4f, 0xf4, 0x7f, 0x42, 0x08, 0x21, 0x38, 0x46, + 0xff, 0xf7, 0x66, 0xff, 0x6d, 0x1c, 0x01, 0x2d, 0xa1, 0xdd, 0x20, 0x46, + 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0x00, 0xa0, 0x06, 0x00, 0x48, + 0xa4, 0x06, 0x00, 0x48, 0x20, 0x06, 0x00, 0x48, 0x4f, 0xf4, 0xe0, 0x22, + 0x10, 0x21, 0x53, 0xe7, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x78, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x70, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x80, 0xb5, 0xea, 0xf7, + 0x60, 0xf8, 0x00, 0x20, 0x02, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x83, 0x46, + 0x0d, 0x46, 0xee, 0xf7, 0x8f, 0xfc, 0x06, 0x46, 0xee, 0xf7, 0xb3, 0xfc, + 0x07, 0x46, 0xee, 0xf7, 0xcc, 0xfc, 0x04, 0x46, 0x30, 0x46, 0xea, 0xf7, + 0x4e, 0xf8, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x83, 0x48, 0x84, 0x4e, + 0xff, 0xf7, 0xd6, 0xff, 0x01, 0x2f, 0x4f, 0xf0, 0x00, 0x08, 0x01, 0xd1, + 0x01, 0x23, 0x00, 0xe0, 0x02, 0x23, 0x0c, 0x22, 0x02, 0x21, 0x30, 0x46, + 0xff, 0xf7, 0xca, 0xff, 0x00, 0x27, 0xfb, 0xb2, 0x03, 0x22, 0x00, 0x21, + 0x30, 0x46, 0xff, 0xf7, 0xc3, 0xff, 0x64, 0x20, 0xf7, 0xf7, 0xb4, 0xfb, + 0x7f, 0x1c, 0xf9, 0xb2, 0x8b, 0x45, 0xf2, 0xd2, 0x76, 0x4a, 0xdf, 0xf8, + 0xdc, 0xa1, 0x94, 0x42, 0x2c, 0xbf, 0x00, 0x23, 0x01, 0x23, 0x70, 0x22, + 0x04, 0x21, 0x30, 0x46, 0xff, 0xf7, 0xb0, 0xff, 0x30, 0x78, 0x72, 0x49, + 0x0a, 0x78, 0x00, 0x95, 0xc0, 0xf3, 0x02, 0x10, 0x82, 0x18, 0x00, 0x24, + 0x0a, 0x70, 0xa1, 0x46, 0xe5, 0xb2, 0x5a, 0xf8, 0x25, 0x60, 0xe0, 0xb2, + 0xee, 0xf7, 0x5d, 0xfc, 0x00, 0x28, 0x00, 0xf0, 0xbc, 0x80, 0xf7, 0xf7, + 0xc2, 0xfd, 0x00, 0xf0, 0x3f, 0x03, 0xff, 0x22, 0x00, 0x21, 0x06, 0xf1, + 0xf9, 0x00, 0xff, 0xf7, 0x93, 0xff, 0x59, 0x46, 0xe0, 0xb2, 0xea, 0xf7, + 0xc8, 0xfb, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0xb0, 0x1c, 0xff, 0xf7, + 0x89, 0xff, 0x00, 0x23, 0x04, 0x22, 0x02, 0x21, 0xf0, 0x1c, 0xff, 0xf7, + 0x83, 0xff, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, 0x06, 0xf1, 0x09, 0x00, + 0xff, 0xf7, 0x7c, 0xff, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, 0x06, 0xf1, + 0x0a, 0x00, 0xff, 0xf7, 0x75, 0xff, 0x06, 0xf1, 0xc7, 0x07, 0x18, 0x23, + 0x1f, 0x22, 0x00, 0xf0, 0xac, 0xf8, 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, + 0x38, 0x46, 0xff, 0xf7, 0x69, 0xff, 0xee, 0xf7, 0x1d, 0xfc, 0x4f, 0x4f, + 0x4f, 0x4a, 0xc0, 0x19, 0x41, 0xeb, 0x09, 0x01, 0x00, 0x23, 0xf1, 0xf7, + 0x73, 0xfb, 0x40, 0x1c, 0x06, 0xf1, 0x12, 0x08, 0xc3, 0xb2, 0x1f, 0x22, + 0x00, 0x21, 0x40, 0x46, 0xff, 0xf7, 0x56, 0xff, 0x01, 0x23, 0x20, 0x22, + 0x05, 0x21, 0x40, 0x46, 0xff, 0xf7, 0x50, 0xff, 0x12, 0x23, 0x1f, 0x22, + 0x00, 0x21, 0x06, 0xf1, 0x22, 0x00, 0xff, 0xf7, 0x49, 0xff, 0x06, 0xf1, + 0x20, 0x07, 0x01, 0x23, 0x40, 0x22, 0x06, 0x21, 0x38, 0x46, 0xff, 0xf7, + 0x41, 0xff, 0x00, 0x23, 0x80, 0x22, 0x07, 0x21, 0x38, 0x46, 0xff, 0xf7, + 0x3b, 0xff, 0x10, 0x23, 0x1f, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x2d, 0x00, + 0xff, 0xf7, 0x34, 0xff, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x06, 0xf1, + 0xa8, 0x00, 0xff, 0xf7, 0x2d, 0xff, 0x2c, 0x20, 0x45, 0x43, 0xbb, 0xf1, + 0x02, 0x0f, 0x18, 0xbf, 0xbb, 0xf1, 0x01, 0x0f, 0x05, 0xd1, 0x00, 0x98, + 0x41, 0x5d, 0xe0, 0xb2, 0x00, 0xf0, 0x60, 0xf8, 0x04, 0xe0, 0x00, 0x98, + 0x41, 0x5d, 0xe0, 0xb2, 0x00, 0xf0, 0x5a, 0xf8, 0x5f, 0xea, 0x00, 0x08, + 0x35, 0xd1, 0x06, 0xf1, 0x15, 0x00, 0x77, 0x1c, 0x05, 0x78, 0x00, 0x23, + 0x00, 0xf0, 0x4c, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0x49, 0xf8, 0x01, 0x20, + 0xf7, 0xf7, 0xfe, 0xfa, 0x05, 0x20, 0xf7, 0xf7, 0x08, 0xfa, 0xc5, 0xf3, + 0x42, 0x00, 0x02, 0x21, 0x08, 0x30, 0x81, 0x40, 0x00, 0x23, 0x00, 0x22, + 0x05, 0x20, 0xf7, 0xf7, 0x08, 0xfa, 0x00, 0x25, 0x06, 0xf1, 0x18, 0x00, + 0x00, 0x78, 0xc0, 0xf3, 0x00, 0x10, 0x48, 0xb1, 0x01, 0x20, 0xf7, 0xf7, + 0xe7, 0xfa, 0x06, 0xf1, 0x21, 0x00, 0x00, 0x78, 0xc0, 0xf3, 0x40, 0x10, + 0x00, 0xb1, 0x01, 0x25, 0x05, 0x20, 0xf7, 0xf7, 0xc8, 0xfa, 0x08, 0xb1, + 0x28, 0x00, 0x0f, 0xd0, 0x28, 0x00, 0xe7, 0xd0, 0x05, 0x20, 0xf7, 0xf7, + 0x60, 0xfa, 0x64, 0x1c, 0xe0, 0xb2, 0x08, 0x28, 0x03, 0xd2, 0xb8, 0xf1, + 0x00, 0x0f, 0x3f, 0xf4, 0x33, 0xaf, 0x40, 0x46, 0xbd, 0xe8, 0xf2, 0x8f, + 0x40, 0xf6, 0x0a, 0x48, 0xee, 0xe7, 0x00, 0x00, 0x01, 0x80, 0x08, 0x48, + 0x05, 0x80, 0x08, 0x48, 0xd9, 0xdf, 0x3d, 0x00, 0xa8, 0x98, 0x04, 0x01, + 0xac, 0x77, 0x02, 0x20, 0x00, 0x65, 0xcd, 0x1d, 0x00, 0xca, 0x9a, 0x3b, + 0x01, 0x22, 0x00, 0x21, 0x38, 0x46, 0xbf, 0xe6, 0x10, 0xb5, 0x04, 0x46, + 0x03, 0x21, 0xe9, 0xf7, 0x63, 0xfc, 0x00, 0x21, 0x20, 0x46, 0xe9, 0xf7, + 0x6e, 0xfc, 0x01, 0x21, 0x20, 0x46, 0xe9, 0xf7, 0x52, 0xfc, 0x0f, 0x21, + 0x20, 0x46, 0xe9, 0xf7, 0x6f, 0xfc, 0x00, 0x21, 0x20, 0x46, 0xe9, 0xf7, + 0xbc, 0xfc, 0x1f, 0x21, 0x20, 0x46, 0xe9, 0xf7, 0x90, 0xfc, 0x0f, 0x21, + 0x20, 0x46, 0xe9, 0xf7, 0x97, 0xfc, 0x0f, 0x21, 0x20, 0x46, 0xe9, 0xf7, + 0x9c, 0xfc, 0x0f, 0x21, 0x20, 0x46, 0xe9, 0xf7, 0xa1, 0xfc, 0x00, 0x21, + 0x20, 0x46, 0xe9, 0xf7, 0xb1, 0xfc, 0x10, 0x21, 0x20, 0x46, 0xe9, 0xf7, + 0xc7, 0xfc, 0x08, 0x21, 0x20, 0x46, 0xe9, 0xf7, 0xed, 0xfc, 0x20, 0x46, + 0xe9, 0xf7, 0x67, 0xff, 0x00, 0x21, 0x20, 0x46, 0xe9, 0xf7, 0x02, 0xfd, + 0x00, 0x20, 0x10, 0xbd, 0x80, 0xb5, 0x4f, 0xf4, 0x8c, 0x61, 0xdf, 0xf8, + 0x10, 0x08, 0xf0, 0xf7, 0x2b, 0xfd, 0xef, 0xf7, 0xa7, 0xfc, 0x00, 0x20, + 0x02, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, 0x04, 0x46, 0x18, 0x21, 0x65, 0x68, + 0xdf, 0xf8, 0xf8, 0x67, 0xdf, 0xf8, 0xf8, 0x87, 0x69, 0x43, 0x58, 0x20, + 0x68, 0x43, 0x08, 0xeb, 0x00, 0x07, 0x70, 0x18, 0x00, 0xf5, 0xcc, 0x72, + 0xa2, 0x61, 0x00, 0xf5, 0xfc, 0x70, 0xe7, 0x62, 0xe0, 0x61, 0xdf, 0xf8, + 0xe0, 0x17, 0x22, 0x68, 0x51, 0xf8, 0x22, 0x00, 0x38, 0x60, 0x21, 0x68, + 0x79, 0x60, 0x00, 0x21, 0x60, 0x68, 0xb8, 0x60, 0xa1, 0x62, 0x40, 0xf2, + 0x3c, 0x60, 0x68, 0x43, 0x26, 0x63, 0x40, 0x44, 0xbe, 0x63, 0x00, 0xf5, + 0xb8, 0x60, 0x60, 0x63, 0xf8, 0x63, 0x4f, 0xf4, 0x16, 0x71, 0xf0, 0xf7, + 0xf7, 0xfc, 0xdf, 0xf8, 0xb0, 0x27, 0x11, 0x68, 0xfa, 0x6b, 0x41, 0xf2, + 0x01, 0x00, 0x0b, 0x5c, 0x53, 0x75, 0x2c, 0x20, 0x23, 0x68, 0x43, 0x43, + 0xc8, 0x18, 0xf9, 0x6b, 0x90, 0xf8, 0x41, 0x0e, 0x88, 0x75, 0x41, 0xf6, + 0xb0, 0x62, 0x14, 0x20, 0x68, 0x43, 0x40, 0x44, 0x10, 0x44, 0xa0, 0x63, + 0x38, 0x64, 0x4f, 0xf4, 0xb6, 0x72, 0x14, 0x20, 0x60, 0x62, 0x06, 0xf5, + 0x16, 0x70, 0x39, 0x6c, 0x21, 0x62, 0xe0, 0x63, 0x78, 0x64, 0x4f, 0xf4, + 0x8c, 0x61, 0x08, 0xf5, 0xb0, 0x70, 0xb8, 0x64, 0xf9, 0x64, 0x00, 0x20, + 0xa0, 0x60, 0x6a, 0x43, 0xdf, 0xf8, 0x5c, 0x07, 0xa0, 0x65, 0x78, 0x61, + 0x42, 0x44, 0x60, 0x69, 0x00, 0xf1, 0x0d, 0x01, 0x39, 0x65, 0x43, 0xf2, + 0x48, 0x21, 0xdf, 0xf8, 0x4c, 0x07, 0x20, 0x65, 0xf8, 0x60, 0xdf, 0xf8, + 0x48, 0x07, 0x60, 0x65, 0x38, 0x61, 0xdf, 0xf8, 0x44, 0x07, 0xe0, 0x65, + 0xb8, 0x61, 0xdf, 0xf8, 0x40, 0x07, 0x20, 0x66, 0xf8, 0x61, 0xdf, 0xf8, + 0x3c, 0x07, 0x00, 0x6b, 0x60, 0x66, 0x38, 0x62, 0x43, 0xf2, 0x28, 0x20, + 0x30, 0x18, 0xa0, 0x66, 0x78, 0x62, 0x70, 0x18, 0xe0, 0x66, 0xb8, 0x62, + 0x4c, 0x20, 0x68, 0x43, 0x40, 0x44, 0x00, 0xf5, 0xf8, 0x51, 0x42, 0xf2, + 0x30, 0x00, 0x10, 0x44, 0x38, 0x63, 0xf9, 0x62, 0x00, 0x21, 0xf8, 0x6b, + 0x80, 0xf8, 0xde, 0x14, 0xe8, 0xb2, 0xee, 0xf7, 0xaf, 0xfa, 0x01, 0x28, + 0x04, 0xbf, 0xf9, 0x6b, 0x81, 0xf8, 0xde, 0x04, 0x00, 0x20, 0x78, 0x65, + 0x12, 0x20, 0xff, 0xf7, 0x1b, 0xfd, 0x18, 0xb1, 0x78, 0x6d, 0x40, 0xf0, + 0x02, 0x00, 0x78, 0x65, 0x38, 0x46, 0xbd, 0xe8, 0xf0, 0x41, 0x00, 0x21, + 0xef, 0xf7, 0x01, 0xbc, 0x2d, 0xe9, 0xfe, 0x4f, 0x80, 0x46, 0x8b, 0x46, + 0x2c, 0x20, 0xdf, 0xf8, 0xb4, 0x16, 0x91, 0x46, 0x00, 0xfb, 0x08, 0xf0, + 0x01, 0x90, 0x1e, 0x46, 0x0a, 0x68, 0x10, 0x44, 0x4f, 0xf0, 0x00, 0x0a, + 0x90, 0xf8, 0x41, 0x4e, 0xeb, 0xf7, 0x03, 0xff, 0xbb, 0xf1, 0x00, 0x0f, + 0x04, 0xbf, 0x04, 0xf0, 0x01, 0x01, 0x91, 0xea, 0x00, 0x0f, 0x00, 0xf0, + 0xea, 0x80, 0x01, 0x27, 0x04, 0xf0, 0x06, 0x00, 0xbb, 0xf1, 0x00, 0x0f, + 0x00, 0x90, 0xdf, 0xf8, 0x6c, 0x56, 0x16, 0xd0, 0x00, 0x2c, 0x18, 0xbf, + 0x01, 0x2c, 0x12, 0xd1, 0xdf, 0xf8, 0x68, 0x06, 0x01, 0x9a, 0x01, 0x68, + 0x0a, 0x44, 0xd2, 0xf8, 0x45, 0x7e, 0xb8, 0xb2, 0x40, 0xb1, 0x5f, 0xfa, + 0x88, 0xf0, 0xf0, 0xf7, 0xac, 0xf9, 0x80, 0x68, 0x05, 0xeb, 0x40, 0x01, + 0xa1, 0xf8, 0x94, 0x70, 0x00, 0x27, 0xb9, 0xf1, 0x00, 0x0f, 0x11, 0xd1, + 0x00, 0x98, 0x24, 0xf0, 0x06, 0x01, 0x08, 0xb9, 0x02, 0x20, 0x02, 0xe0, + 0x06, 0x28, 0x09, 0xd1, 0x00, 0x20, 0x01, 0x43, 0x00, 0x98, 0x06, 0x28, + 0x0c, 0xbf, 0x04, 0x20, 0x00, 0x20, 0x00, 0x2e, 0x40, 0xea, 0x01, 0x04, + 0x40, 0xf0, 0x9f, 0x80, 0xc5, 0xf8, 0x00, 0xa0, 0xa8, 0x22, 0x6b, 0x68, + 0x0c, 0x98, 0xdf, 0xf8, 0x28, 0x16, 0x0b, 0x43, 0x6b, 0x60, 0x05, 0xf1, + 0x75, 0x06, 0xea, 0x75, 0x38, 0x21, 0xb1, 0x71, 0x4f, 0xf0, 0xff, 0x0c, + 0xfe, 0x22, 0x86, 0xf8, 0x00, 0xc0, 0x32, 0x71, 0x41, 0xf2, 0x7c, 0x52, + 0xe9, 0x6b, 0x41, 0xf0, 0x00, 0x41, 0x41, 0xf0, 0x04, 0x01, 0xe9, 0x63, + 0x6f, 0xf0, 0x03, 0x03, 0x05, 0xf1, 0xdc, 0x01, 0x05, 0xf1, 0x50, 0x0e, + 0xca, 0x83, 0x0b, 0x84, 0x08, 0x23, 0xdf, 0xf8, 0xec, 0x25, 0x4a, 0x62, + 0x05, 0xf2, 0x23, 0x12, 0x13, 0x70, 0x81, 0x23, 0x93, 0x73, 0x82, 0xf8, + 0x05, 0x90, 0x0d, 0x23, 0x93, 0x71, 0x05, 0x23, 0x85, 0xf8, 0x74, 0x31, + 0x6f, 0xf0, 0x05, 0x03, 0x38, 0xb3, 0x01, 0x20, 0x8e, 0xf8, 0x04, 0x00, + 0x86, 0xf8, 0x0a, 0xc0, 0x1c, 0x20, 0x8e, 0xf8, 0x00, 0x00, 0x0a, 0x26, + 0x44, 0xf2, 0x10, 0x20, 0xae, 0xf8, 0x02, 0x00, 0x8e, 0xf8, 0x13, 0x60, + 0x4f, 0xf6, 0xf0, 0x70, 0xae, 0xf8, 0x22, 0x00, 0x4f, 0xf4, 0xfa, 0x66, + 0x32, 0x20, 0x8e, 0xf8, 0x15, 0x00, 0xae, 0xf8, 0x1c, 0x00, 0x4e, 0x82, + 0x3c, 0x20, 0x8e, 0xf8, 0x1e, 0x00, 0x8b, 0x82, 0x40, 0xf6, 0x2e, 0x10, + 0x08, 0x83, 0x4b, 0x83, 0x04, 0x21, 0x85, 0xf8, 0x44, 0x11, 0x11, 0x72, + 0x3e, 0xe0, 0x0d, 0x98, 0x10, 0xb1, 0x45, 0x20, 0x8e, 0xf8, 0x00, 0x00, + 0x39, 0x20, 0xb0, 0x71, 0x4f, 0xf0, 0x19, 0x0c, 0x14, 0x20, 0xae, 0xf8, + 0x10, 0x00, 0x8e, 0xf8, 0x0b, 0xc0, 0x32, 0x20, 0x8e, 0xf8, 0x13, 0x00, + 0xae, 0xf8, 0x0c, 0x00, 0xae, 0xf8, 0x0e, 0x00, 0x45, 0xf6, 0x48, 0x0c, + 0x1e, 0x20, 0x8e, 0xf8, 0x15, 0x00, 0xa1, 0xf8, 0x06, 0xc0, 0x4f, 0xf6, + 0xff, 0x70, 0xae, 0xf8, 0x1c, 0x00, 0x4f, 0xf0, 0x32, 0x0e, 0x86, 0xf8, + 0x0d, 0xe0, 0x45, 0xf6, 0x3c, 0x26, 0x0e, 0x80, 0x6f, 0xf0, 0x09, 0x06, + 0x4e, 0x80, 0x0e, 0x81, 0x05, 0xf1, 0x84, 0x06, 0x30, 0x80, 0x70, 0x80, + 0x41, 0xf2, 0xeb, 0x60, 0xb0, 0x80, 0x6f, 0xf0, 0x02, 0x00, 0xf0, 0x80, + 0xb3, 0x81, 0x43, 0xf2, 0xbd, 0x10, 0x70, 0x81, 0x0f, 0x20, 0xdf, 0xf8, + 0x08, 0x35, 0x4b, 0x62, 0x10, 0x72, 0x05, 0x21, 0x51, 0x72, 0xa0, 0x07, + 0x07, 0xd5, 0x37, 0xb1, 0x4f, 0xf4, 0x80, 0x72, 0x29, 0x46, 0x40, 0x46, + 0x00, 0xf0, 0x16, 0xfa, 0x82, 0x46, 0x60, 0x07, 0x07, 0xd5, 0x37, 0xb1, + 0x98, 0x22, 0x05, 0xf5, 0x80, 0x71, 0x40, 0x46, 0x00, 0xf0, 0x0c, 0xfa, + 0x82, 0x46, 0x50, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, 0x1c, 0xb5, 0x00, 0xf0, + 0x19, 0xf8, 0x12, 0xbf, 0x4f, 0xf4, 0x80, 0x71, 0x04, 0xf5, 0x80, 0x74, + 0x98, 0x21, 0x02, 0x46, 0x20, 0x46, 0xf6, 0xf7, 0xa6, 0xfd, 0x16, 0xbd, + 0x1c, 0xb5, 0x00, 0xf0, 0x0b, 0xf8, 0x12, 0xbf, 0x4f, 0xf4, 0x80, 0x71, + 0x04, 0xf5, 0x80, 0x74, 0x98, 0x21, 0x02, 0x46, 0x20, 0x46, 0xf6, 0xf7, + 0x83, 0xfd, 0x16, 0xbd, 0x0b, 0x46, 0x04, 0x99, 0xdf, 0xf8, 0x60, 0x44, + 0x00, 0x92, 0x00, 0x29, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46, 0x0f, 0xf2, + 0x90, 0x42, 0x23, 0x68, 0x0c, 0x21, 0x03, 0x20, 0xec, 0xf7, 0xc3, 0xfe, + 0x00, 0x21, 0xa1, 0x60, 0xe0, 0x6a, 0xa1, 0x6a, 0xef, 0xf7, 0xc5, 0xfa, + 0x90, 0xb9, 0x62, 0x68, 0xdf, 0xf8, 0x68, 0x14, 0x88, 0x5c, 0x00, 0x28, + 0x14, 0xbf, 0x17, 0x22, 0x01, 0x22, 0x02, 0x21, 0x20, 0x46, 0x00, 0xf0, + 0x3b, 0xf9, 0x28, 0xb9, 0xf6, 0xf7, 0x02, 0xfd, 0xa0, 0x64, 0x20, 0x46, + 0x00, 0xf0, 0x3a, 0xf9, 0x00, 0xb1, 0xe0, 0x60, 0x00, 0x20, 0x10, 0xbd, + 0x78, 0xb5, 0x0e, 0x46, 0x85, 0xb0, 0x00, 0x24, 0x05, 0x46, 0x34, 0x60, + 0x00, 0xf0, 0x88, 0xf9, 0xf6, 0xf7, 0xf0, 0xfc, 0x05, 0xf1, 0x48, 0x02, + 0x11, 0x68, 0x40, 0x1a, 0x50, 0x60, 0x95, 0xf8, 0x46, 0x00, 0x2b, 0x68, + 0x06, 0x28, 0x06, 0xd1, 0x0f, 0xf2, 0x34, 0x42, 0x0c, 0x21, 0x03, 0x20, + 0xec, 0xf7, 0x8b, 0xfe, 0x0b, 0xe0, 0x29, 0x69, 0x02, 0x91, 0x0c, 0x21, + 0xea, 0x68, 0x01, 0x92, 0x00, 0x90, 0x03, 0x20, 0xdf, 0xf8, 0xfc, 0x23, + 0xec, 0xf7, 0x7f, 0xfe, 0xec, 0x68, 0x95, 0xf8, 0x46, 0x00, 0x06, 0x28, + 0x05, 0xd0, 0x00, 0x22, 0x05, 0x21, 0x28, 0x46, 0x00, 0xf0, 0x00, 0xf9, + 0x04, 0x43, 0x2c, 0xb1, 0xec, 0x60, 0x28, 0x46, 0x00, 0xf0, 0x80, 0xf8, + 0x30, 0x60, 0x28, 0xb9, 0x69, 0x69, 0x48, 0x7a, 0x10, 0xb1, 0x28, 0x46, + 0x00, 0xf0, 0x27, 0xf8, 0x29, 0x6a, 0x14, 0x22, 0x68, 0x46, 0xde, 0xf7, + 0xbd, 0xfc, 0xa8, 0x69, 0x02, 0x99, 0x81, 0x60, 0xea, 0x68, 0xdf, 0xf8, + 0xb0, 0x13, 0x42, 0x61, 0x00, 0x20, 0x6a, 0x68, 0x88, 0x54, 0x01, 0x20, + 0x06, 0xb0, 0x70, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x00, 0x25, 0xdf, 0xf8, + 0x98, 0x63, 0x24, 0xfa, 0x05, 0xf0, 0xc0, 0x07, 0x06, 0xd5, 0x28, 0x46, + 0xec, 0xf7, 0x5f, 0xfd, 0xff, 0x28, 0x1c, 0xbf, 0x01, 0x21, 0x31, 0x54, + 0x6d, 0x1c, 0x08, 0x2d, 0xf1, 0xd3, 0x70, 0xbd, 0x00, 0xbf, 0x2d, 0xe9, + 0xf8, 0x41, 0x04, 0x46, 0x85, 0xb0, 0x00, 0x26, 0xc4, 0xf8, 0xcc, 0x60, + 0xa6, 0x60, 0x01, 0x22, 0x03, 0x21, 0x00, 0xf0, 0xbf, 0xf8, 0x05, 0x00, + 0x0f, 0xf2, 0x90, 0x38, 0x22, 0xd1, 0x60, 0x69, 0x01, 0x7b, 0x01, 0x29, + 0x0c, 0xbf, 0x01, 0x27, 0x00, 0x27, 0x07, 0xf0, 0x83, 0xf8, 0x01, 0x28, + 0x18, 0xbf, 0x00, 0x20, 0x07, 0x42, 0x15, 0xd1, 0x20, 0x46, 0x00, 0xf0, + 0xb1, 0xf8, 0x05, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x07, 0xf9, 0x94, 0xf8, + 0x46, 0x00, 0x00, 0x90, 0x42, 0x46, 0x23, 0x68, 0x0c, 0x21, 0x04, 0x20, + 0xec, 0xf7, 0x13, 0xfe, 0x25, 0xb9, 0x94, 0xf8, 0x46, 0x00, 0x09, 0x28, + 0xdd, 0xd1, 0x0f, 0xe0, 0x94, 0xf8, 0x46, 0x00, 0x09, 0x28, 0x05, 0xd0, + 0x00, 0x22, 0x05, 0x21, 0x20, 0x46, 0x00, 0xf0, 0x8f, 0xf8, 0x05, 0x43, + 0x25, 0xb1, 0xe5, 0x60, 0x20, 0x46, 0x00, 0xf0, 0x0f, 0xf8, 0x06, 0x46, + 0x21, 0x6a, 0x14, 0x22, 0x68, 0x46, 0xde, 0xf7, 0x53, 0xfc, 0xe0, 0x69, + 0x02, 0x99, 0x81, 0x60, 0xe2, 0x68, 0x42, 0x61, 0x30, 0x46, 0x06, 0xb0, + 0xbd, 0xe8, 0xf0, 0x81, 0x10, 0xb5, 0x04, 0x46, 0x01, 0x20, 0xa0, 0x60, + 0x00, 0x21, 0x00, 0x20, 0xe2, 0x68, 0xca, 0x40, 0xd3, 0x07, 0x03, 0xd4, + 0x49, 0x1c, 0x20, 0x29, 0xf8, 0xd3, 0x63, 0xe0, 0x01, 0x20, 0x00, 0xfa, + 0x01, 0xf1, 0x01, 0x29, 0x59, 0xd0, 0x02, 0x29, 0x54, 0xd0, 0x04, 0x29, + 0x4f, 0xd0, 0x08, 0x29, 0x4a, 0xd0, 0x10, 0x29, 0x21, 0xd0, 0x20, 0x29, + 0x40, 0xd0, 0x40, 0x29, 0x3b, 0xd0, 0x80, 0x29, 0x36, 0xd0, 0xb1, 0xf5, + 0x80, 0x7f, 0x30, 0xd0, 0xb1, 0xf5, 0x00, 0x7f, 0x2a, 0xd0, 0xb1, 0xf5, + 0x80, 0x6f, 0x24, 0xd0, 0xb1, 0xf5, 0x00, 0x6f, 0x1e, 0xd0, 0xb1, 0xf5, + 0x80, 0x5f, 0x18, 0xd0, 0xb1, 0xf5, 0x00, 0x5f, 0x12, 0xd0, 0xb1, 0xf5, + 0x80, 0x4f, 0x0c, 0xd0, 0xb1, 0xf5, 0x80, 0x3f, 0x06, 0xd0, 0xb1, 0xf5, + 0x80, 0x2f, 0x24, 0xd0, 0x32, 0xe0, 0x40, 0xf6, 0x05, 0x40, 0x31, 0xe0, + 0x40, 0xf6, 0x12, 0x40, 0x2e, 0xe0, 0x40, 0xf6, 0x0f, 0x40, 0x2b, 0xe0, + 0x40, 0xf6, 0x0e, 0x40, 0x28, 0xe0, 0x40, 0xf6, 0x0d, 0x40, 0x25, 0xe0, + 0x40, 0xf6, 0x0c, 0x40, 0x22, 0xe0, 0x40, 0xf6, 0x0b, 0x40, 0x1f, 0xe0, + 0x40, 0xf6, 0x0a, 0x40, 0x1c, 0xe0, 0x40, 0xf6, 0x09, 0x40, 0x19, 0xe0, + 0x40, 0xf6, 0x08, 0x40, 0x16, 0xe0, 0x40, 0xf6, 0x07, 0x40, 0x13, 0xe0, + 0x40, 0xf6, 0x06, 0x40, 0x10, 0xe0, 0x40, 0xf6, 0x14, 0x40, 0x0d, 0xe0, + 0x40, 0xf6, 0x04, 0x40, 0x0a, 0xe0, 0x40, 0xf6, 0x03, 0x40, 0x07, 0xe0, + 0x40, 0xf6, 0x02, 0x40, 0x04, 0xe0, 0x40, 0xf6, 0x01, 0x40, 0x01, 0xe0, + 0x4f, 0xf4, 0x41, 0x60, 0x20, 0x61, 0x01, 0x46, 0x01, 0x22, 0x01, 0x20, + 0xfa, 0xf7, 0xee, 0xf8, 0x20, 0x69, 0x10, 0xbd, 0x2c, 0x30, 0x01, 0x76, + 0x42, 0x76, 0x00, 0x68, 0xef, 0xf7, 0xeb, 0xbe, 0x2d, 0xe9, 0xfc, 0x41, + 0x06, 0x46, 0x00, 0x22, 0x01, 0x21, 0x00, 0xf0, 0x66, 0xf8, 0x00, 0x28, + 0x3e, 0xd1, 0xf4, 0x6a, 0x67, 0x68, 0x00, 0x21, 0xad, 0xf8, 0x00, 0x10, + 0x00, 0xf0, 0x42, 0xf8, 0x00, 0x28, 0x35, 0xd1, 0x6a, 0x46, 0x0d, 0xf1, + 0x01, 0x01, 0xf8, 0xb2, 0xea, 0xf7, 0x63, 0xfe, 0x80, 0x46, 0x04, 0xf1, + 0x34, 0x00, 0x01, 0x78, 0x07, 0x29, 0x04, 0xbf, 0x40, 0x78, 0x1b, 0x28, + 0x04, 0xd1, 0xe1, 0x6a, 0x08, 0x78, 0x08, 0xb1, 0x01, 0x24, 0x03, 0xe0, + 0x00, 0xf0, 0x2e, 0xf8, 0x00, 0x24, 0xe8, 0xb9, 0x9d, 0xf8, 0x00, 0x00, + 0x80, 0x45, 0x1c, 0xbf, 0x01, 0x20, 0xdd, 0xf7, 0x71, 0xff, 0xf0, 0x6a, + 0xef, 0xf7, 0x7c, 0xf9, 0x05, 0x00, 0x01, 0xd1, 0x0c, 0xb1, 0x0a, 0xe0, + 0x14, 0xb9, 0x00, 0xf0, 0x17, 0xf8, 0x40, 0xb9, 0x9d, 0xf8, 0x00, 0x20, + 0x9d, 0xf8, 0x01, 0x10, 0xf8, 0xb2, 0xea, 0xf7, 0x3a, 0xfe, 0x00, 0xf0, + 0x11, 0xf8, 0x00, 0x22, 0x00, 0xf0, 0x0f, 0xf8, 0x28, 0xb1, 0x03, 0x22, + 0x4f, 0xf6, 0x70, 0x71, 0x01, 0x20, 0xfa, 0xf7, 0x97, 0xf8, 0x28, 0x46, + 0xbd, 0xe8, 0xf6, 0x81, 0x01, 0x22, 0x01, 0x21, 0x30, 0x46, 0x16, 0xe0, + 0x01, 0x22, 0x00, 0x21, 0x30, 0x46, 0x12, 0xe0, 0x10, 0xb5, 0x00, 0xf1, + 0x2c, 0x04, 0x20, 0x68, 0x90, 0xf8, 0x36, 0x00, 0xa0, 0x76, 0x10, 0xbd, + 0xc0, 0x6a, 0xef, 0xf7, 0xdf, 0xbe, 0x38, 0x4a, 0x13, 0x68, 0x2c, 0x21, + 0x48, 0x43, 0x18, 0x44, 0x90, 0xf8, 0x41, 0x0e, 0x70, 0x47, 0x10, 0xb5, + 0x13, 0x46, 0x00, 0x22, 0x00, 0x2b, 0x14, 0xbf, 0x43, 0x6f, 0x03, 0x6f, + 0xdc, 0xb2, 0x01, 0x2c, 0x0c, 0xd0, 0x40, 0x69, 0x02, 0x69, 0x21, 0xb1, + 0x01, 0x21, 0xd8, 0xb2, 0xeb, 0xf7, 0xba, 0xfd, 0x03, 0xe0, 0x11, 0x46, + 0xd8, 0xb2, 0xeb, 0xf7, 0xfb, 0xfd, 0x02, 0x46, 0x10, 0x46, 0x10, 0xbd, + 0x24, 0x48, 0x70, 0x47, 0x2d, 0xe9, 0xfe, 0x43, 0x88, 0x46, 0x2c, 0x21, + 0x91, 0x46, 0x04, 0x46, 0x4c, 0x43, 0x23, 0x4a, 0x12, 0x68, 0x11, 0x19, + 0x00, 0x20, 0x91, 0xf8, 0x41, 0x5e, 0xed, 0x08, 0x15, 0x2d, 0x28, 0xbf, + 0x40, 0xf6, 0x03, 0x40, 0x02, 0xf6, 0x2d, 0x47, 0x00, 0x26, 0x1d, 0xe0, + 0x38, 0x19, 0x71, 0x08, 0x00, 0xeb, 0x81, 0x00, 0x00, 0xf5, 0x06, 0x73, + 0x71, 0x00, 0x01, 0xf0, 0x02, 0x01, 0x1a, 0x68, 0x49, 0x1c, 0xc9, 0x00, + 0x22, 0xfa, 0x01, 0xf0, 0x8d, 0xf8, 0x04, 0x00, 0x01, 0xa9, 0x30, 0x01, + 0x00, 0x91, 0x00, 0xf0, 0x10, 0x00, 0xc2, 0x40, 0x01, 0x23, 0x02, 0xf0, + 0xff, 0x02, 0x49, 0x46, 0x40, 0x46, 0xf6, 0xf7, 0x78, 0xfb, 0x76, 0x1c, + 0xae, 0x42, 0x01, 0xda, 0x00, 0x28, 0xdd, 0xd0, 0xbd, 0xe8, 0xfe, 0x83, + 0x80, 0xb5, 0xc0, 0xb2, 0xed, 0xf7, 0x4a, 0xff, 0x28, 0xb9, 0x04, 0x48, + 0xb0, 0xf8, 0x34, 0x11, 0xc9, 0x01, 0xa0, 0xf8, 0x34, 0x11, 0x01, 0xbd, + 0x18, 0xf8, 0x02, 0x20, 0xb4, 0x57, 0x00, 0x20, 0xb8, 0xf6, 0x02, 0x20, + 0xa8, 0x98, 0x04, 0x01, 0xb4, 0x76, 0x02, 0x20, 0xad, 0x96, 0x02, 0x01, + 0xa9, 0xd9, 0x01, 0x01, 0xad, 0xd9, 0x01, 0x01, 0xb1, 0xd9, 0x01, 0x01, + 0xcd, 0xd9, 0x01, 0x01, 0xfc, 0x64, 0x03, 0x20, 0x20, 0x1a, 0x03, 0x00, + 0x10, 0x18, 0x04, 0x00, 0x30, 0x18, 0x04, 0x00, 0x88, 0x77, 0x02, 0x20, + 0x40, 0x90, 0x04, 0x01, 0x53, 0x65, 0x72, 0x64, 0x65, 0x73, 0x3a, 0x20, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x6c, 0x61, 0x6e, 0x65, 0x25, 0x64, + 0x0a, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x69, 0x74, 0x3a, 0x20, 0x6c, 0x61, + 0x6e, 0x65, 0x25, 0x64, 0x2c, 0x20, 0x46, 0x47, 0x5f, 0x44, 0x4f, 0x4e, + 0x45, 0x0a, 0x00, 0x00, 0x20, 0x6c, 0x61, 0x6e, 0x65, 0x25, 0x64, 0x2c, + 0x20, 0x66, 0x73, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x25, 0x64, + 0x0a, 0x00, 0x00, 0x00, 0x38, 0xb5, 0x04, 0x46, 0x12, 0xb1, 0xfe, 0x29, + 0xa8, 0xbf, 0x11, 0x7a, 0x08, 0x00, 0x1b, 0xd0, 0x0a, 0x29, 0x19, 0xd2, + 0xdf, 0xf8, 0xac, 0x2b, 0x02, 0xeb, 0x81, 0x03, 0x1d, 0x1f, 0x20, 0x46, + 0x29, 0x78, 0xea, 0xf7, 0x6e, 0xfc, 0xa9, 0x78, 0x20, 0x46, 0xea, 0xf7, + 0x6c, 0xfc, 0x69, 0x78, 0x20, 0x46, 0xea, 0xf7, 0x6a, 0xfc, 0xe9, 0x78, + 0x20, 0x46, 0xea, 0xf7, 0x68, 0xfc, 0x20, 0x46, 0xbd, 0xe8, 0x32, 0x40, + 0xea, 0xf7, 0x65, 0xbc, 0x31, 0xbd, 0xf8, 0xb5, 0x01, 0x29, 0x05, 0x46, + 0x4f, 0xf0, 0xff, 0x37, 0xdf, 0xf8, 0x70, 0x4b, 0x1b, 0xd1, 0x00, 0xf0, + 0x1f, 0xf8, 0x06, 0x46, 0xa8, 0x6b, 0x90, 0xf8, 0x79, 0x10, 0xfe, 0x29, + 0x10, 0xd1, 0xe8, 0x6b, 0xc1, 0x68, 0x60, 0x68, 0x81, 0x42, 0x04, 0xbf, + 0x61, 0x88, 0x8e, 0x42, 0x04, 0xd0, 0x22, 0x46, 0xff, 0x21, 0x28, 0x46, + 0x00, 0xf0, 0x1f, 0xf8, 0xe8, 0x6b, 0xc7, 0x68, 0x66, 0x80, 0x04, 0xe0, + 0x6a, 0x20, 0x20, 0x70, 0x01, 0xe0, 0x0f, 0x21, 0x21, 0x70, 0x67, 0x60, + 0x20, 0x78, 0xf2, 0xbd, 0x01, 0x46, 0x88, 0x6b, 0x89, 0x68, 0x00, 0xf1, + 0x50, 0x03, 0x18, 0x79, 0x1a, 0x78, 0x03, 0xeb, 0x41, 0x03, 0x00, 0x01, + 0x00, 0xf4, 0x70, 0x60, 0xb3, 0xf8, 0x44, 0x10, 0x10, 0x43, 0x0a, 0x00, + 0x18, 0xbf, 0x08, 0x46, 0x70, 0x47, 0x2d, 0xe9, 0xf6, 0x4f, 0x89, 0xb0, + 0x81, 0x6b, 0x01, 0xf1, 0x50, 0x02, 0x02, 0xf1, 0x2b, 0x01, 0x00, 0x24, + 0x0b, 0x78, 0xc3, 0xf3, 0x01, 0x13, 0x8d, 0xf8, 0x05, 0x30, 0x4f, 0xf0, + 0x01, 0x08, 0x09, 0x7a, 0x01, 0xf0, 0x0f, 0x01, 0x06, 0x91, 0xc3, 0x6b, + 0x03, 0x94, 0x03, 0xf5, 0xac, 0x75, 0x05, 0x95, 0x12, 0x79, 0x02, 0xf0, + 0x0f, 0x02, 0x08, 0x92, 0xff, 0xf7, 0xce, 0xff, 0x05, 0x9a, 0x07, 0x90, + 0x02, 0x94, 0x02, 0xf1, 0xc4, 0x05, 0x08, 0x98, 0x02, 0x99, 0x08, 0xfa, + 0x01, 0xf1, 0xc2, 0xb2, 0x0a, 0x42, 0x79, 0xd0, 0x02, 0x99, 0xdf, 0xf8, + 0xb0, 0x0a, 0x01, 0xeb, 0x41, 0x01, 0x4f, 0xf0, 0x00, 0x0a, 0x47, 0x18, + 0x07, 0x98, 0x08, 0xfa, 0x0a, 0xf1, 0x89, 0xb2, 0x08, 0x42, 0x66, 0xd0, + 0x00, 0x26, 0x28, 0x8c, 0x08, 0xfa, 0x06, 0xf1, 0x08, 0x42, 0x5d, 0xd0, + 0x4f, 0xf0, 0x00, 0x09, 0x05, 0x98, 0x00, 0xf1, 0xe6, 0x01, 0x04, 0x91, + 0x08, 0xfa, 0x09, 0xf3, 0x09, 0x78, 0x19, 0x42, 0x4d, 0xd0, 0x72, 0x1c, + 0x06, 0x98, 0x8d, 0xf8, 0x04, 0x20, 0x09, 0xf1, 0x01, 0x0b, 0x70, 0xb1, + 0x00, 0x21, 0x00, 0x91, 0x9d, 0xf8, 0x05, 0x20, 0x9d, 0xf8, 0x04, 0x00, + 0x00, 0x23, 0x5f, 0xfa, 0x8b, 0xf1, 0x02, 0xf0, 0x43, 0xfa, 0x06, 0x99, + 0x88, 0x42, 0x00, 0xd3, 0xb8, 0xbb, 0x00, 0x21, 0xea, 0x8b, 0x08, 0xfa, + 0x01, 0xf3, 0x1a, 0x42, 0x2e, 0xd0, 0x9d, 0xf8, 0x24, 0x20, 0x03, 0x9b, + 0x4f, 0xf0, 0x00, 0x0c, 0x04, 0x98, 0x40, 0x78, 0x08, 0xfa, 0x0c, 0xfe, + 0x10, 0xea, 0x0e, 0x0f, 0x19, 0xd0, 0x20, 0x46, 0x44, 0x1c, 0xc0, 0xb2, + 0x82, 0x42, 0x14, 0xd1, 0x38, 0x78, 0x68, 0x70, 0x7b, 0x78, 0xab, 0x70, + 0x0a, 0xf1, 0x01, 0x03, 0xb8, 0x78, 0xe8, 0x70, 0x2b, 0x72, 0x48, 0x1c, + 0x28, 0x70, 0x85, 0xf8, 0x04, 0xc0, 0x85, 0xf8, 0x05, 0xc0, 0x2b, 0x46, + 0x9d, 0xf8, 0x04, 0x00, 0xa8, 0x71, 0x85, 0xf8, 0x07, 0xb0, 0x0c, 0xf1, + 0x01, 0x0c, 0x5f, 0xfa, 0x8c, 0xf0, 0x08, 0x28, 0xd8, 0xd3, 0x8d, 0xf8, + 0x24, 0x20, 0x03, 0x93, 0x49, 0x1c, 0x10, 0x29, 0xc8, 0xd3, 0x09, 0xf1, + 0x01, 0x09, 0xb9, 0xf1, 0x08, 0x0f, 0xa3, 0xd3, 0x76, 0x1c, 0x10, 0x2e, + 0x99, 0xd3, 0x0a, 0xf1, 0x01, 0x0a, 0xba, 0xf1, 0x08, 0x0f, 0x8d, 0xd9, + 0x02, 0x98, 0x40, 0x1c, 0x03, 0x28, 0x02, 0x90, 0xff, 0xf4, 0x79, 0xaf, + 0x0a, 0x98, 0x00, 0xb1, 0x04, 0x70, 0x03, 0x98, 0x0b, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0x2d, 0xe9, 0xf0, 0x4f, 0x04, 0x46, 0x87, 0xb0, 0x88, 0x46, + 0xa1, 0x6b, 0x17, 0x46, 0x01, 0xf1, 0x50, 0x02, 0x05, 0x92, 0x4f, 0xf0, + 0x00, 0x0a, 0xe1, 0x6b, 0x01, 0xf5, 0xac, 0x72, 0x05, 0x99, 0x06, 0x92, + 0x01, 0xf1, 0x22, 0x06, 0xf2, 0x79, 0xfe, 0x2a, 0x1c, 0xbf, 0x41, 0x46, + 0xff, 0xf7, 0xf9, 0xfe, 0xdf, 0xf8, 0x74, 0x19, 0x8d, 0xf8, 0x0c, 0x70, + 0x07, 0xeb, 0xc7, 0x02, 0x01, 0xeb, 0x02, 0x0b, 0x06, 0x99, 0x5f, 0xea, + 0x08, 0x02, 0x01, 0xf1, 0xc4, 0x07, 0x0c, 0xd1, 0x9d, 0xf8, 0x0c, 0x10, + 0xc0, 0xb2, 0x81, 0x42, 0x06, 0xd2, 0x0b, 0xf5, 0x6f, 0x7a, 0x09, 0x22, + 0x51, 0x46, 0x38, 0x46, 0xde, 0xf7, 0x72, 0xf9, 0xae, 0xe0, 0x06, 0x99, + 0x75, 0x7a, 0x96, 0xf8, 0x11, 0x90, 0x01, 0xf1, 0xe6, 0x02, 0x04, 0x92, + 0xb2, 0xf9, 0x04, 0x20, 0xad, 0xf8, 0x0e, 0x20, 0xf1, 0x79, 0xfe, 0x29, + 0x0a, 0xd0, 0x9d, 0xf8, 0x0c, 0x10, 0xc0, 0xb2, 0x81, 0x42, 0x05, 0xd2, + 0x09, 0x22, 0x59, 0x46, 0x38, 0x46, 0xde, 0xf7, 0x59, 0xf9, 0xda, 0x46, + 0x30, 0x88, 0x38, 0x84, 0x4f, 0xf0, 0x01, 0x0b, 0x05, 0x99, 0x91, 0xf8, + 0x21, 0x00, 0x04, 0x99, 0x08, 0x70, 0x05, 0x98, 0x41, 0x88, 0xf9, 0x83, + 0x05, 0x98, 0x41, 0x78, 0x04, 0x98, 0x41, 0x70, 0xe8, 0x07, 0x0b, 0xd5, + 0xbd, 0xf9, 0x0e, 0x00, 0x22, 0x46, 0x01, 0x21, 0xdd, 0xf7, 0x98, 0xfe, + 0x38, 0x71, 0x78, 0x71, 0x0b, 0xfa, 0x00, 0xf0, 0x04, 0x99, 0x48, 0x70, + 0x68, 0x07, 0x0d, 0xd5, 0xa1, 0x6b, 0x01, 0xf5, 0xba, 0x70, 0x00, 0xf0, + 0x7b, 0xf8, 0x03, 0x7c, 0x00, 0xf0, 0x72, 0xf8, 0xb8, 0x71, 0x40, 0x1e, + 0x0b, 0xfa, 0x00, 0xf0, 0x38, 0x84, 0x0a, 0xe0, 0x5f, 0xea, 0xc9, 0x60, + 0x07, 0xd5, 0xa1, 0x6b, 0xb8, 0x79, 0x91, 0xf8, 0x74, 0x11, 0x81, 0x42, + 0x38, 0xbf, 0x01, 0x46, 0xb9, 0x71, 0x05, 0x9a, 0xb9, 0x79, 0x92, 0xf9, + 0x05, 0x00, 0x41, 0x18, 0xb9, 0x71, 0x29, 0x07, 0x16, 0xd5, 0xa0, 0x6b, + 0x6f, 0xf0, 0x1d, 0x03, 0x00, 0xf2, 0x87, 0x10, 0x00, 0x21, 0x64, 0x22, + 0x00, 0x93, 0x02, 0x91, 0x01, 0x92, 0x01, 0x21, 0x43, 0x78, 0x02, 0x78, + 0xbd, 0xf9, 0x0e, 0x00, 0xdd, 0xf7, 0x70, 0xfe, 0xf8, 0x71, 0x40, 0x1e, + 0x04, 0x99, 0x0b, 0xfa, 0x00, 0xf0, 0x08, 0x70, 0xa8, 0x07, 0x0d, 0xd5, + 0xa1, 0x6b, 0x01, 0xf5, 0xb8, 0x70, 0x00, 0xf0, 0x41, 0xf8, 0x43, 0x7d, + 0x00, 0xf0, 0x38, 0xf8, 0x38, 0x70, 0x40, 0x1e, 0x0b, 0xfa, 0x00, 0xf0, + 0xf8, 0x83, 0x0a, 0xe0, 0x5f, 0xea, 0x89, 0x60, 0x07, 0xd5, 0xa1, 0x6b, + 0x38, 0x78, 0x91, 0xf8, 0x70, 0x11, 0x81, 0x42, 0x38, 0xbf, 0x01, 0x46, + 0x39, 0x70, 0xf0, 0x79, 0xfe, 0x28, 0x08, 0xbf, 0xb8, 0xf1, 0x01, 0x0f, + 0x0c, 0xd1, 0x01, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x48, 0xfe, 0x9d, 0xf8, + 0x0c, 0x10, 0x81, 0x42, 0x04, 0xd2, 0x00, 0x22, 0x20, 0x46, 0xff, 0xf7, + 0x7c, 0xfe, 0x82, 0x46, 0xa0, 0x6b, 0xd0, 0xf8, 0x00, 0x11, 0xc8, 0x04, + 0x0a, 0xd5, 0x00, 0x21, 0x00, 0x91, 0x03, 0x23, 0x06, 0x98, 0x00, 0xf1, + 0xcb, 0x02, 0x00, 0xf1, 0xca, 0x01, 0x20, 0x46, 0x02, 0xf0, 0x2d, 0xf9, + 0x50, 0x46, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x02, 0x78, 0xbd, 0xf9, + 0x0e, 0x00, 0x01, 0x21, 0xdd, 0xf7, 0x22, 0xbe, 0x64, 0x23, 0x00, 0x22, + 0x01, 0x93, 0x6f, 0xf0, 0x1d, 0x01, 0x02, 0x92, 0x00, 0x91, 0x70, 0x47, + 0x38, 0xb5, 0x1c, 0x46, 0xff, 0xf7, 0x07, 0xff, 0x00, 0x25, 0x20, 0xb1, + 0x09, 0x22, 0x21, 0x46, 0xde, 0xf7, 0xa6, 0xf8, 0x00, 0xe0, 0x04, 0x25, + 0x28, 0x46, 0x32, 0xbd, 0xf0, 0xb5, 0x05, 0x46, 0x89, 0xb0, 0xea, 0x6b, + 0xa8, 0x6b, 0x53, 0x7d, 0x90, 0xf8, 0x79, 0x10, 0x6c, 0x68, 0x00, 0x26, + 0x02, 0x2b, 0x18, 0xbf, 0x90, 0xf8, 0xaa, 0x10, 0x02, 0xf5, 0x07, 0x77, + 0x3a, 0x46, 0xe0, 0xb2, 0xff, 0xf7, 0xd6, 0xfd, 0x39, 0x46, 0xe0, 0xb2, + 0xea, 0xf7, 0x40, 0xfa, 0x39, 0x46, 0xe0, 0xb2, 0xea, 0xf7, 0x3f, 0xfa, + 0x39, 0x46, 0xe0, 0xb2, 0xea, 0xf7, 0x29, 0xfa, 0x39, 0x46, 0xe0, 0xb2, + 0xea, 0xf7, 0x2a, 0xfa, 0x39, 0x46, 0xe0, 0xb2, 0xea, 0xf7, 0x2b, 0xfa, + 0x39, 0x46, 0xe0, 0xb2, 0xea, 0xf7, 0x36, 0xfa, 0x39, 0x46, 0xe0, 0xb2, + 0xea, 0xf7, 0x35, 0xfa, 0x39, 0x46, 0xe0, 0xb2, 0xea, 0xf7, 0x34, 0xfa, + 0xe0, 0xb2, 0xea, 0xf7, 0x3c, 0xfa, 0xaf, 0x6b, 0xf8, 0x7d, 0xc0, 0xf3, + 0x40, 0x10, 0xc0, 0xb1, 0x0d, 0x21, 0x05, 0xa8, 0xef, 0xf7, 0x8c, 0xfe, + 0xf9, 0x7d, 0xe8, 0x6b, 0x03, 0x96, 0x89, 0x09, 0x49, 0x1c, 0xc9, 0xb2, + 0x04, 0x91, 0x00, 0x23, 0x90, 0xf8, 0x22, 0x12, 0x02, 0x91, 0x18, 0x30, + 0x01, 0x90, 0x00, 0x96, 0x05, 0xaa, 0x07, 0xf1, 0x10, 0x01, 0xe0, 0xb2, + 0x01, 0xf0, 0x28, 0xfd, 0x06, 0x46, 0x30, 0x46, 0x09, 0xb0, 0xf0, 0xbd, + 0xf8, 0xb5, 0x8e, 0xb0, 0x1f, 0x46, 0x15, 0x9a, 0xdf, 0xf8, 0xec, 0x46, + 0x52, 0x8b, 0x65, 0x6a, 0x01, 0x23, 0x83, 0x40, 0x1a, 0x42, 0x5a, 0xd0, + 0x26, 0x6a, 0x38, 0x2e, 0x57, 0xd3, 0x8d, 0xf8, 0x01, 0x10, 0x8d, 0xf8, + 0x00, 0x00, 0x0a, 0x22, 0x39, 0x78, 0x8d, 0xf8, 0x05, 0x10, 0x07, 0xf1, + 0xb0, 0x01, 0x78, 0x78, 0x8d, 0xf8, 0x06, 0x00, 0x78, 0x79, 0x8d, 0xf8, + 0x04, 0x00, 0xf8, 0x88, 0xad, 0xf8, 0x14, 0x00, 0x38, 0x89, 0xad, 0xf8, + 0x16, 0x00, 0x78, 0x89, 0xad, 0xf8, 0x18, 0x00, 0xb8, 0x89, 0xad, 0xf8, + 0x1a, 0x00, 0xf8, 0x89, 0xad, 0xf8, 0x1c, 0x00, 0x38, 0x69, 0x08, 0x90, + 0x38, 0x7d, 0x8d, 0xf8, 0x07, 0x00, 0xf8, 0x69, 0x09, 0x90, 0x38, 0x6a, + 0x0a, 0x90, 0x97, 0xf8, 0x24, 0x00, 0x8d, 0xf8, 0x08, 0x00, 0x97, 0xf8, + 0x25, 0x00, 0x8d, 0xf8, 0x09, 0x00, 0x97, 0xf8, 0x26, 0x00, 0x8d, 0xf8, + 0x0a, 0x00, 0x97, 0xf8, 0x27, 0x00, 0x8d, 0xf8, 0x0b, 0x00, 0xb7, 0xf8, + 0x5c, 0x00, 0xad, 0xf8, 0x1e, 0x00, 0x0b, 0xa8, 0xde, 0xf7, 0x0c, 0xf8, + 0x00, 0x20, 0x39, 0x18, 0x0d, 0xeb, 0x00, 0x02, 0x91, 0xf8, 0x30, 0x10, + 0x11, 0x73, 0x40, 0x1c, 0x08, 0x28, 0xf6, 0xd3, 0x38, 0x20, 0x69, 0x1c, + 0x41, 0x43, 0x8e, 0x42, 0xe3, 0x69, 0x38, 0xbf, 0x00, 0x25, 0x68, 0x43, + 0x38, 0x22, 0x69, 0x46, 0x18, 0x44, 0xdd, 0xf7, 0xe5, 0xff, 0x6d, 0x1c, + 0x65, 0x62, 0x0f, 0xb0, 0xf0, 0xbd, 0xf8, 0xb5, 0x92, 0xf8, 0x2b, 0x50, + 0x44, 0x79, 0xad, 0x09, 0x05, 0xf0, 0x01, 0x05, 0x00, 0x26, 0x85, 0xf0, + 0x01, 0x05, 0x54, 0xb3, 0x94, 0x7c, 0x03, 0xf1, 0xce, 0x07, 0x3c, 0xb1, + 0xb0, 0xf9, 0x0c, 0x40, 0xb7, 0xf9, 0x00, 0xc0, 0xa4, 0x45, 0xbc, 0xbf, + 0x01, 0x26, 0x3c, 0x80, 0x14, 0x8a, 0x34, 0xb1, 0xc4, 0x89, 0xb7, 0xf8, + 0x02, 0xc0, 0xa4, 0x45, 0x3c, 0xbf, 0x01, 0x26, 0x7c, 0x80, 0x14, 0x7d, + 0x03, 0xf1, 0xd4, 0x07, 0x34, 0xb1, 0x04, 0x69, 0xd7, 0xf8, 0x00, 0xc0, + 0xa4, 0x45, 0x3c, 0xbf, 0x01, 0x26, 0x3c, 0x60, 0x2e, 0x43, 0x08, 0xd0, + 0x00, 0x93, 0x13, 0x46, 0x0a, 0x46, 0x01, 0x46, 0x01, 0x20, 0x00, 0xf0, + 0x15, 0xf8, 0x87, 0xed, 0x01, 0x0a, 0xf1, 0xbd, 0x30, 0xb1, 0x92, 0xf9, + 0x26, 0x00, 0x92, 0xf9, 0x27, 0x10, 0x88, 0x42, 0x07, 0xdd, 0x05, 0xe0, + 0x92, 0xf9, 0x27, 0x00, 0x92, 0xf9, 0x26, 0x10, 0x88, 0x42, 0x00, 0xda, + 0x08, 0x46, 0xdd, 0xf7, 0xd3, 0xba, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x41, + 0x2d, 0xed, 0x0c, 0x8b, 0x0e, 0x46, 0x12, 0x9d, 0x1f, 0x46, 0x9f, 0xed, + 0x90, 0x8a, 0x00, 0xb1, 0x2e, 0x1d, 0xf0, 0x88, 0x31, 0x89, 0x00, 0xf0, + 0x28, 0xf9, 0x96, 0xf9, 0x14, 0x00, 0xf1, 0x89, 0xf8, 0xee, 0x40, 0xca, + 0xb8, 0xee, 0x60, 0xda, 0x00, 0xf0, 0x1f, 0xf9, 0xb6, 0xf9, 0x0c, 0x00, + 0x96, 0xf9, 0x30, 0x80, 0xb8, 0xee, 0xc0, 0xca, 0xf8, 0xee, 0x60, 0x8a, + 0x00, 0xee, 0x10, 0x0a, 0xd6, 0xed, 0x04, 0x0a, 0x96, 0xf9, 0x31, 0x10, + 0xb8, 0xee, 0xc0, 0x9a, 0xf8, 0xee, 0x60, 0x9a, 0x40, 0x46, 0x00, 0xf0, + 0x0a, 0xf9, 0xb8, 0xee, 0xc0, 0xaa, 0xf8, 0xee, 0xe0, 0xaa, 0x00, 0x24, + 0xf9, 0x7f, 0x01, 0x23, 0xa3, 0x40, 0x13, 0xea, 0x01, 0x00, 0x18, 0xbf, + 0x01, 0x20, 0x32, 0x46, 0x39, 0x46, 0xff, 0xf7, 0xb1, 0xff, 0x00, 0xee, + 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x00, 0x2c, 0x0c, 0xbf, 0xb0, 0xee, + 0x40, 0xba, 0xf0, 0xee, 0x40, 0xba, 0x64, 0x1c, 0x01, 0x2c, 0xe7, 0xd9, + 0xb8, 0x89, 0x05, 0xf1, 0xd4, 0x03, 0x88, 0xb1, 0xb3, 0xf9, 0x18, 0x10, + 0x00, 0xf0, 0xea, 0xf8, 0x8c, 0xee, 0x80, 0x0a, 0xff, 0xee, 0x00, 0x0a, + 0x70, 0xee, 0x20, 0x0a, 0xb0, 0xee, 0xe0, 0x0a, 0x00, 0xee, 0x90, 0x0a, + 0xf8, 0xee, 0x60, 0x0a, 0x20, 0xee, 0x80, 0x8a, 0xf8, 0x89, 0x38, 0xb1, + 0xb3, 0xf9, 0x1a, 0x10, 0x00, 0xf0, 0xd6, 0xf8, 0x8d, 0xee, 0x00, 0x0a, + 0x00, 0xf0, 0xd9, 0xf8, 0xb8, 0x7d, 0x28, 0xb1, 0xb3, 0xf9, 0x1c, 0x10, + 0x00, 0xf0, 0xcc, 0xf8, 0x00, 0xf0, 0xcf, 0xf8, 0xf8, 0x7d, 0x70, 0xb1, + 0x97, 0xf8, 0x20, 0x10, 0x00, 0xee, 0x10, 0x1a, 0xb8, 0xee, 0x40, 0x0a, + 0xb4, 0xee, 0x4c, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, 0xb0, 0xee, + 0x40, 0xca, 0x00, 0xf0, 0xbe, 0xf8, 0xb8, 0x8b, 0x70, 0xb1, 0x97, 0xf9, + 0x1e, 0x10, 0x00, 0xf0, 0xb3, 0xf8, 0xb4, 0xee, 0x40, 0xba, 0xf1, 0xee, + 0x10, 0xfa, 0x48, 0xbf, 0xb0, 0xee, 0x40, 0xba, 0x8b, 0xee, 0x00, 0x0a, + 0x00, 0xf0, 0xaf, 0xf8, 0x78, 0x7d, 0x38, 0xb1, 0xb3, 0xf9, 0x22, 0x10, + 0x00, 0xf0, 0xa2, 0xf8, 0x8b, 0xee, 0x80, 0x0a, 0x00, 0xf0, 0xa5, 0xf8, + 0xfa, 0x7c, 0x00, 0x2a, 0x40, 0xd0, 0xb3, 0xf9, 0x1e, 0x10, 0x08, 0x46, + 0x00, 0xee, 0x10, 0x0a, 0xb3, 0xf9, 0x20, 0x00, 0x04, 0x46, 0xb8, 0xee, + 0xc0, 0x0a, 0xdf, 0xed, 0x3f, 0x0a, 0x01, 0xee, 0x10, 0x4a, 0x80, 0xee, + 0x20, 0x0a, 0xb8, 0xee, 0xc1, 0x1a, 0xdf, 0xed, 0x3b, 0x1a, 0xc1, 0xee, + 0x21, 0x0a, 0x9f, 0xed, 0x3a, 0x1a, 0xb8, 0xf1, 0x00, 0x0f, 0x08, 0xbf, + 0xb0, 0xee, 0x41, 0xaa, 0xca, 0xee, 0x8a, 0x1a, 0xf4, 0xee, 0x61, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x03, 0xd5, 0x40, 0xb1, 0xb0, 0xee, 0x60, 0x0a, + 0x0a, 0xe0, 0xf4, 0xee, 0x40, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x03, 0xd5, + 0x21, 0xb9, 0xb0, 0xee, 0x41, 0x0a, 0x01, 0xe0, 0xb0, 0xee, 0x61, 0x0a, + 0x81, 0xee, 0x80, 0x0a, 0xbf, 0xee, 0x00, 0x1a, 0x00, 0xee, 0x90, 0x2a, + 0x30, 0xee, 0x01, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0xb0, 0xee, 0xc0, 0x0a, + 0x00, 0xee, 0x80, 0x8a, 0x38, 0x8a, 0x05, 0xf1, 0xce, 0x02, 0xb7, 0xee, + 0x00, 0x0a, 0x80, 0xb1, 0x54, 0x88, 0x00, 0xee, 0x90, 0x4a, 0x00, 0x2c, + 0xf8, 0xee, 0x60, 0x0a, 0x08, 0xbf, 0xf0, 0xee, 0x40, 0x0a, 0xc8, 0xee, + 0xa0, 0x0a, 0xff, 0xee, 0x00, 0x1a, 0x01, 0xee, 0x10, 0x0a, 0x00, 0xf0, + 0x35, 0xf8, 0xb9, 0x7c, 0x89, 0xb1, 0xb2, 0xf9, 0x00, 0x20, 0x00, 0xee, + 0x90, 0x2a, 0x00, 0x2a, 0xf8, 0xee, 0xe0, 0x0a, 0x08, 0xbf, 0xf0, 0xee, + 0x40, 0x0a, 0xc9, 0xee, 0x20, 0x0a, 0xff, 0xee, 0x00, 0x1a, 0x01, 0xee, + 0x10, 0x1a, 0x00, 0xf0, 0x21, 0xf8, 0x38, 0x7d, 0x88, 0xb1, 0x19, 0x68, + 0x00, 0xee, 0x90, 0x1a, 0xf8, 0xee, 0x60, 0x0a, 0x09, 0xb9, 0xf0, 0xee, + 0x40, 0x0a, 0x00, 0xee, 0x10, 0x0a, 0xc9, 0xee, 0xa0, 0x0a, 0xb8, 0xee, + 0x40, 0x0a, 0xf0, 0xee, 0xe0, 0x0a, 0x00, 0xee, 0x20, 0x8a, 0xb0, 0xee, + 0x48, 0x0a, 0xbd, 0xec, 0x0c, 0x8b, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x42, 0x00, 0x00, 0x80, 0x00, + 0x70, 0xee, 0xa1, 0x1a, 0xb8, 0xee, 0x41, 0x1a, 0xf0, 0xee, 0xe1, 0x0a, + 0x01, 0xee, 0x20, 0x8a, 0x70, 0x47, 0x00, 0xee, 0x10, 0x0a, 0x00, 0xee, + 0x90, 0x1a, 0x70, 0x47, 0x00, 0xee, 0x10, 0x1a, 0xb8, 0xee, 0xc0, 0x0a, + 0x70, 0x47, 0x8c, 0xee, 0x00, 0x0a, 0xff, 0xee, 0x00, 0x0a, 0x70, 0xee, + 0x20, 0x0a, 0xb0, 0xee, 0xe0, 0x0a, 0x00, 0xee, 0x90, 0x0a, 0xf8, 0xee, + 0x60, 0x0a, 0x00, 0xee, 0x80, 0x8a, 0x70, 0x47, 0x2d, 0xe9, 0xf1, 0x4f, + 0x2d, 0xed, 0x02, 0x8b, 0x8a, 0xb0, 0x0d, 0x46, 0x18, 0x9e, 0x71, 0x8b, + 0x01, 0x24, 0x84, 0x40, 0x0c, 0x40, 0x18, 0xbf, 0x01, 0x24, 0x06, 0x94, + 0xa6, 0x46, 0x30, 0x8a, 0x00, 0xb1, 0x01, 0x24, 0x06, 0xf1, 0x2e, 0x07, + 0xf9, 0x88, 0x29, 0xb9, 0x3f, 0x89, 0x07, 0xb1, 0x01, 0x27, 0x8d, 0xf8, + 0x04, 0x70, 0x02, 0xe0, 0x01, 0x21, 0x8d, 0xf8, 0x04, 0x10, 0x4f, 0xf0, + 0x01, 0x09, 0xb1, 0x7c, 0x00, 0x29, 0x0e, 0xbf, 0xcd, 0xf8, 0x1c, 0xe0, + 0x01, 0x27, 0x07, 0x97, 0xdd, 0xf8, 0x58, 0x80, 0x98, 0xf8, 0x05, 0xe0, + 0x17, 0x9f, 0xcd, 0xf8, 0x20, 0xe0, 0xd7, 0xf8, 0x24, 0xe0, 0x8d, 0xf8, + 0x10, 0x50, 0x5f, 0xea, 0x0e, 0x7c, 0x9d, 0xf8, 0x10, 0xc0, 0x48, 0xbf, + 0x4f, 0xf0, 0x00, 0x09, 0x02, 0x25, 0xbc, 0xf1, 0x01, 0x0f, 0x8d, 0xf8, + 0x12, 0x50, 0x03, 0xd0, 0x01, 0x25, 0x8d, 0xf8, 0x12, 0x50, 0xa9, 0x46, + 0x19, 0x9d, 0x8d, 0xf8, 0x13, 0x20, 0x00, 0x2b, 0x05, 0xf1, 0xd4, 0x0b, + 0x3f, 0xd0, 0x07, 0x98, 0x20, 0x43, 0xc0, 0xb2, 0xe8, 0xb1, 0xbc, 0xf1, + 0x01, 0x0f, 0x1a, 0xd1, 0x14, 0xb1, 0x2e, 0xf0, 0x02, 0x00, 0x78, 0x62, + 0x07, 0x98, 0x18, 0xb1, 0x78, 0x6a, 0x20, 0xf0, 0x10, 0x00, 0x78, 0x62, + 0x00, 0x20, 0x9d, 0xf8, 0x12, 0x10, 0x03, 0x90, 0x00, 0x91, 0x01, 0x24, + 0x9d, 0xf8, 0x30, 0x00, 0x02, 0x94, 0x01, 0x94, 0x4b, 0x46, 0x00, 0xf0, + 0xf6, 0xf8, 0x78, 0x6a, 0x40, 0xf0, 0x12, 0x00, 0x78, 0x62, 0x05, 0xf1, + 0xce, 0x01, 0x08, 0x98, 0x38, 0xb1, 0xb8, 0xf8, 0x0c, 0x00, 0x08, 0x80, + 0xd8, 0xf8, 0x10, 0x20, 0xb8, 0xf8, 0x0e, 0x00, 0x01, 0xe0, 0x08, 0x80, + 0x00, 0x22, 0xcb, 0xf8, 0x00, 0x20, 0x48, 0x80, 0xc0, 0x22, 0x9d, 0xf8, + 0x13, 0x00, 0x68, 0x70, 0x41, 0x46, 0x28, 0x1d, 0xdd, 0xf7, 0xd2, 0xfd, + 0x00, 0xf0, 0xd1, 0xf8, 0x8b, 0xed, 0x01, 0x0a, 0xb9, 0xe0, 0xad, 0xf8, + 0x14, 0x00, 0x8d, 0xf8, 0x11, 0x10, 0x00, 0xf0, 0xd2, 0xf8, 0x00, 0x21, + 0x00, 0x20, 0x31, 0x82, 0x00, 0xf0, 0xb4, 0xf8, 0x00, 0x2c, 0xb0, 0xee, + 0x40, 0x8a, 0x4f, 0xf0, 0x01, 0x0a, 0x4f, 0xd0, 0xbd, 0xf8, 0x14, 0x00, + 0xdb, 0xed, 0x01, 0x0a, 0x00, 0xee, 0x10, 0x0a, 0x00, 0xf0, 0xac, 0xf8, + 0x06, 0xd4, 0x06, 0x99, 0x9d, 0xf8, 0x04, 0x00, 0x01, 0x43, 0xc9, 0xb2, + 0x00, 0x29, 0x3f, 0xd0, 0x9d, 0xf8, 0x10, 0x00, 0x01, 0x28, 0x15, 0xd1, + 0x78, 0x6a, 0x20, 0xf0, 0x02, 0x00, 0x78, 0x62, 0x00, 0x21, 0x03, 0x91, + 0xcd, 0xf8, 0x08, 0xa0, 0xcd, 0xf8, 0x04, 0xa0, 0x4b, 0x46, 0x9d, 0xf8, + 0x12, 0x10, 0x9d, 0xf8, 0x30, 0x00, 0x00, 0x91, 0x00, 0xf0, 0x9d, 0xf8, + 0x78, 0x6a, 0x40, 0xf0, 0x02, 0x00, 0x78, 0x62, 0xbd, 0xf8, 0x14, 0x00, + 0x32, 0x8b, 0x30, 0x82, 0xb8, 0xf8, 0x0e, 0x10, 0x91, 0x42, 0x01, 0xd2, + 0x06, 0x98, 0x50, 0xb1, 0x9d, 0xf8, 0x11, 0x00, 0xb0, 0x74, 0x00, 0xf0, + 0x8e, 0xf8, 0x00, 0x20, 0x00, 0xf0, 0x72, 0xf8, 0xb0, 0xee, 0x40, 0x8a, + 0x01, 0xe0, 0x4f, 0xf0, 0x00, 0x0a, 0x9d, 0xf8, 0x10, 0x00, 0x01, 0x28, + 0x0a, 0xd1, 0x98, 0xf9, 0x32, 0x00, 0xdd, 0xf7, 0x9d, 0xf8, 0x96, 0xf8, + 0x2e, 0x10, 0x88, 0x42, 0x06, 0xd3, 0x4f, 0xf0, 0x00, 0x0a, 0x03, 0xe0, + 0x9d, 0xf8, 0x10, 0x00, 0x00, 0x28, 0x30, 0xd0, 0x07, 0x99, 0x1a, 0xea, + 0x01, 0x0f, 0x2c, 0xd0, 0x9d, 0xf8, 0x11, 0x10, 0xdb, 0xed, 0x01, 0x0a, + 0x00, 0xee, 0x10, 0x1a, 0x00, 0xf0, 0x54, 0xf8, 0x01, 0xd4, 0x06, 0x98, + 0x08, 0xb3, 0x78, 0x6a, 0x20, 0xf0, 0x10, 0x00, 0x78, 0x62, 0x00, 0x21, + 0x03, 0x91, 0x01, 0x20, 0x9d, 0xf8, 0x12, 0x10, 0x02, 0x90, 0x01, 0x90, + 0x00, 0x91, 0x4b, 0x46, 0x9d, 0xf8, 0x30, 0x00, 0x00, 0xf0, 0x4f, 0xf8, + 0x78, 0x6a, 0x40, 0xf0, 0x10, 0x00, 0x78, 0x62, 0x2b, 0x46, 0x9d, 0xf8, + 0x11, 0x00, 0xb0, 0x74, 0x32, 0x46, 0x39, 0x46, 0x40, 0x46, 0xff, 0xf7, + 0x4a, 0xfd, 0x00, 0xf0, 0x3a, 0xf8, 0xb0, 0xee, 0x40, 0x8a, 0xbd, 0xf8, + 0x14, 0x00, 0x30, 0x82, 0x9d, 0xf8, 0x11, 0x10, 0xb1, 0x74, 0x06, 0x98, + 0x38, 0xb1, 0xb8, 0xf8, 0x0e, 0x00, 0x31, 0x8b, 0x88, 0x42, 0x16, 0xd3, + 0x08, 0x98, 0x18, 0xb9, 0x13, 0xe0, 0xba, 0xf1, 0x00, 0x0f, 0x10, 0xd0, + 0x9b, 0xed, 0x01, 0x0a, 0xb4, 0xee, 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, + 0x09, 0xd5, 0xc0, 0x22, 0x41, 0x46, 0x28, 0x1d, 0xdd, 0xf7, 0x18, 0xfd, + 0x8b, 0xed, 0x01, 0x8a, 0x9d, 0xf8, 0x13, 0x00, 0x68, 0x70, 0x0a, 0xb0, + 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf1, 0x8f, 0xb0, 0x74, 0x00, 0x95, + 0x33, 0x46, 0x3a, 0x46, 0x41, 0x46, 0x5f, 0xe5, 0xb8, 0xee, 0x40, 0x0a, + 0x70, 0xee, 0x20, 0x0a, 0xb4, 0xee, 0x60, 0x8a, 0xf1, 0xee, 0x10, 0xfa, + 0x70, 0x47, 0x00, 0x95, 0x33, 0x46, 0x3a, 0x46, 0x41, 0x46, 0x00, 0x20, + 0x50, 0xe5, 0x3a, 0x46, 0x41, 0x46, 0xe9, 0xf7, 0xbb, 0xbe, 0x2b, 0x46, + 0x32, 0x46, 0x39, 0x46, 0x40, 0x46, 0xfe, 0xe4, 0x10, 0xb5, 0xdf, 0xf8, + 0xf8, 0x06, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x80, 0xe8, + 0x1e, 0x00, 0x10, 0xbd, 0x8c, 0x3d, 0x00, 0x20, 0xbc, 0x3d, 0x00, 0x20, + 0xb0, 0x3d, 0x00, 0x20, 0x48, 0x39, 0x00, 0x20, 0x20, 0x39, 0x00, 0x20, + 0x2d, 0xe9, 0xf0, 0x4f, 0x8a, 0x46, 0x15, 0x46, 0xe9, 0xb0, 0x80, 0x46, + 0xdf, 0xf8, 0xc8, 0x26, 0x00, 0x20, 0x09, 0x90, 0x10, 0x70, 0x1c, 0x46, + 0xd8, 0xf8, 0x3c, 0x10, 0x48, 0x7d, 0xd8, 0xf8, 0x04, 0x70, 0xd8, 0xf8, + 0x38, 0x90, 0x02, 0x28, 0x0c, 0xbf, 0x01, 0x26, 0x00, 0x26, 0x01, 0xf5, + 0xac, 0x72, 0x09, 0xf1, 0x18, 0x03, 0x98, 0x31, 0x09, 0xf1, 0x50, 0x0b, + 0x06, 0x92, 0x01, 0x93, 0x02, 0x91, 0xd6, 0xb9, 0x58, 0x22, 0x59, 0x46, + 0x18, 0xa8, 0xdd, 0xf7, 0xa5, 0xfc, 0x99, 0xf8, 0xa8, 0x10, 0x8d, 0xf8, + 0x84, 0x10, 0x00, 0x22, 0xd8, 0xf8, 0x38, 0x00, 0x90, 0xf8, 0xa9, 0x10, + 0x8d, 0xf8, 0x85, 0x10, 0x1b, 0x92, 0x00, 0x21, 0x01, 0x22, 0xad, 0xf8, + 0x70, 0x20, 0x8d, 0xf8, 0x74, 0x10, 0x8d, 0xf8, 0x77, 0x10, 0x0d, 0xf1, + 0x60, 0x0b, 0x00, 0x20, 0x8d, 0xf8, 0x13, 0x00, 0x09, 0x21, 0x0b, 0xa8, + 0xef, 0xf7, 0xb2, 0xfa, 0x07, 0xa8, 0xdd, 0xf7, 0x07, 0xf9, 0x02, 0x98, + 0x90, 0xf9, 0xba, 0x90, 0xc0, 0x21, 0xef, 0xf7, 0xeb, 0xff, 0x02, 0x99, + 0x00, 0x20, 0x81, 0xf8, 0xba, 0x00, 0x01, 0x98, 0x41, 0x6a, 0xc8, 0x02, + 0x16, 0xd5, 0xf8, 0xb2, 0xe9, 0xf7, 0x13, 0xfe, 0xb5, 0xee, 0x40, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x47, 0xbf, 0xfe, 0xee, 0x00, 0x0a, 0x30, 0xee, + 0x20, 0x0a, 0xb6, 0xee, 0x00, 0x1a, 0x30, 0xee, 0x01, 0x0a, 0x02, 0x99, + 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x81, 0xf8, 0xba, 0x00, + 0x01, 0x98, 0x41, 0x6a, 0x48, 0x02, 0x44, 0xbf, 0x02, 0x99, 0x81, 0xf8, + 0xba, 0x90, 0x02, 0x98, 0x90, 0xf9, 0xba, 0x10, 0xf8, 0xb2, 0xe9, 0xf7, + 0xf4, 0xfd, 0xf8, 0xb2, 0xe9, 0xf7, 0xe4, 0xfd, 0x06, 0x99, 0x0f, 0x70, + 0x01, 0x22, 0x01, 0x21, 0x12, 0x92, 0xb9, 0x40, 0xad, 0xf8, 0x20, 0x10, + 0xbb, 0xf8, 0x1a, 0x20, 0xbd, 0xf8, 0x20, 0x10, 0x0a, 0x42, 0x08, 0xd0, + 0x29, 0x00, 0x06, 0xd0, 0x20, 0x00, 0x04, 0xd0, 0xdf, 0xf8, 0xbc, 0x25, + 0x95, 0x61, 0xd5, 0x61, 0x14, 0x62, 0xf8, 0xb2, 0xe9, 0xf7, 0xdd, 0xfe, + 0x17, 0x90, 0x0b, 0xf1, 0x24, 0x00, 0xc0, 0x7a, 0xc2, 0x06, 0x00, 0xf0, + 0x07, 0x01, 0x06, 0xd5, 0x01, 0x29, 0x04, 0xd9, 0x98, 0xf8, 0x54, 0x20, + 0x93, 0x07, 0x48, 0xbf, 0x89, 0x1e, 0x80, 0x06, 0x03, 0xd5, 0xc9, 0xb2, + 0xf8, 0xb2, 0xe9, 0xf7, 0xc6, 0xfe, 0x01, 0x98, 0x41, 0x6a, 0x0a, 0x91, + 0x01, 0x20, 0x01, 0x99, 0x4a, 0x6a, 0x60, 0xf3, 0x52, 0x42, 0x4a, 0x62, + 0x31, 0x00, 0x01, 0x98, 0x18, 0xd0, 0x40, 0x6a, 0x40, 0xf0, 0x12, 0x00, + 0x01, 0x07, 0x01, 0x99, 0x48, 0xbf, 0x40, 0xf0, 0x04, 0x00, 0x48, 0x62, + 0x01, 0x9a, 0x02, 0x99, 0xf8, 0xb2, 0xfd, 0xf7, 0x79, 0xf8, 0x2e, 0xa8, + 0x02, 0x99, 0x01, 0x9a, 0x00, 0x90, 0x01, 0xf1, 0x24, 0x03, 0x00, 0x21, + 0xf8, 0xb2, 0xef, 0xf7, 0x44, 0xfa, 0x03, 0xe0, 0x41, 0x6a, 0x21, 0xf0, + 0x02, 0x01, 0x41, 0x62, 0x00, 0x21, 0x0b, 0xf1, 0x24, 0x05, 0x8d, 0xf8, + 0x12, 0x10, 0x2c, 0x78, 0x95, 0xf8, 0x01, 0x90, 0xe9, 0xf7, 0x91, 0xfe, + 0xdf, 0xf8, 0x20, 0x15, 0x88, 0x42, 0x80, 0x41, 0xc0, 0x43, 0xc0, 0x0f, + 0x14, 0x90, 0x69, 0x79, 0xfe, 0x29, 0x05, 0xd1, 0x00, 0x22, 0x31, 0x46, + 0x40, 0x46, 0xff, 0xf7, 0x3a, 0xfa, 0x04, 0xe0, 0x14, 0x98, 0x10, 0xb1, + 0x2c, 0x7b, 0x95, 0xf8, 0x0d, 0x90, 0x31, 0x46, 0x40, 0x46, 0xff, 0xf7, + 0x42, 0xf9, 0xa0, 0x42, 0xb8, 0xbf, 0x04, 0x46, 0x48, 0x45, 0xb8, 0xbf, + 0x81, 0x46, 0x06, 0x99, 0xcd, 0xf8, 0x4c, 0x80, 0x8d, 0xf8, 0x11, 0x60, + 0xcd, 0xf8, 0x14, 0xb0, 0xba, 0xf1, 0x01, 0x0f, 0x04, 0xbf, 0x00, 0x24, + 0xa1, 0x46, 0xcd, 0xf8, 0x58, 0x90, 0x01, 0xf1, 0xc4, 0x02, 0x01, 0x9e, + 0xdd, 0xf8, 0x08, 0xb0, 0x9d, 0xf8, 0x13, 0x80, 0x07, 0x92, 0x15, 0x94, + 0xa1, 0x46, 0x18, 0xe0, 0x15, 0x98, 0xaa, 0xeb, 0x00, 0x00, 0x05, 0x28, + 0x11, 0xd2, 0x06, 0xe0, 0x00, 0x28, 0xf7, 0xd0, 0x6c, 0xb1, 0x5f, 0xfa, + 0x88, 0xf0, 0x05, 0x28, 0x09, 0xd2, 0x05, 0x98, 0x07, 0x9a, 0x01, 0x90, + 0x00, 0x96, 0x5b, 0x46, 0x5f, 0xfa, 0x89, 0xf1, 0xf8, 0xb2, 0xff, 0xf7, + 0x55, 0xfb, 0x09, 0xf1, 0x01, 0x09, 0x16, 0x98, 0x5f, 0xfa, 0x89, 0xfa, + 0x82, 0x45, 0x80, 0xf2, 0x9f, 0x80, 0x01, 0x21, 0x8d, 0xf8, 0x12, 0x10, + 0x5f, 0xfa, 0x89, 0xf2, 0x9d, 0xf8, 0x11, 0x10, 0x13, 0x98, 0xff, 0xf7, + 0xe8, 0xf9, 0x13, 0x98, 0xff, 0xf7, 0xe8, 0xfa, 0x09, 0x90, 0x9d, 0xf8, + 0x11, 0x00, 0x88, 0xb3, 0x70, 0x6a, 0xc1, 0x03, 0x17, 0xd4, 0x00, 0x28, + 0x1b, 0xd5, 0x07, 0x99, 0x9d, 0xf8, 0x34, 0x00, 0x0a, 0x7a, 0x90, 0x42, + 0x0f, 0xd1, 0x89, 0x79, 0x9d, 0xf8, 0x32, 0x00, 0x81, 0x42, 0x21, 0xbf, + 0x07, 0x99, 0x08, 0x78, 0x9d, 0xf8, 0x2c, 0x20, 0x90, 0x42, 0x04, 0xd3, + 0x9d, 0xf8, 0x2e, 0x00, 0x8a, 0x78, 0x90, 0x42, 0x05, 0xd0, 0x32, 0x46, + 0x59, 0x46, 0xf8, 0xb2, 0xfc, 0xf7, 0xd8, 0xff, 0x05, 0xe0, 0x2e, 0xaa, + 0x0b, 0xf1, 0x24, 0x01, 0xf8, 0xb2, 0xef, 0xf7, 0x0d, 0xfa, 0x07, 0x99, + 0x09, 0x22, 0x0b, 0xa8, 0xdd, 0xf7, 0x6a, 0xfb, 0x5a, 0x46, 0x31, 0x46, + 0xf8, 0xb2, 0xe9, 0xf7, 0x28, 0xfd, 0x19, 0xe0, 0xc0, 0x21, 0x58, 0x46, + 0xef, 0xf7, 0x7a, 0xf9, 0x96, 0xf8, 0x23, 0x00, 0xc1, 0x07, 0x0c, 0xd4, + 0x01, 0x20, 0x51, 0xab, 0x03, 0x90, 0x02, 0x90, 0x01, 0x90, 0x00, 0x93, + 0x5a, 0x46, 0x33, 0x46, 0x10, 0x21, 0xf8, 0xb2, 0xec, 0xf7, 0x8f, 0xfc, + 0x04, 0xe0, 0x5a, 0x46, 0x31, 0x46, 0xf8, 0xb2, 0xe9, 0xf7, 0x02, 0xfe, + 0x05, 0x98, 0xbd, 0xf8, 0x20, 0x20, 0x41, 0x8b, 0x9b, 0xf8, 0x05, 0x40, + 0x11, 0x42, 0x15, 0x99, 0x14, 0xbf, 0x44, 0xf0, 0x01, 0x00, 0x20, 0x46, + 0x8a, 0x45, 0x08, 0xbf, 0x01, 0x23, 0x01, 0xd0, 0x00, 0x23, 0x00, 0xb3, + 0x05, 0x99, 0x06, 0x98, 0x02, 0x91, 0x03, 0x90, 0x01, 0x96, 0xcd, 0xf8, + 0x00, 0xb0, 0x5f, 0xfa, 0x89, 0xf2, 0x9d, 0xf8, 0x11, 0x10, 0xf8, 0xb2, + 0xff, 0xf7, 0xd2, 0xfc, 0x8c, 0xb1, 0x9d, 0xf8, 0x11, 0x00, 0x60, 0xb1, + 0x96, 0xf8, 0x24, 0x00, 0x81, 0x06, 0x08, 0xd4, 0x2e, 0xa8, 0x00, 0x90, + 0x0b, 0xf1, 0x24, 0x03, 0x32, 0x46, 0x00, 0x21, 0xf8, 0xb2, 0xef, 0xf7, + 0x50, 0xf9, 0x08, 0xf1, 0x01, 0x08, 0x05, 0x98, 0x41, 0x8b, 0x48, 0x0a, + 0xc9, 0x05, 0x00, 0xf0, 0x01, 0x00, 0x7f, 0xf5, 0x4f, 0xaf, 0x00, 0x28, + 0x3f, 0xf4, 0x53, 0xaf, 0x00, 0x2c, 0x7f, 0xf4, 0x50, 0xaf, 0x58, 0xe7, + 0x9d, 0xf8, 0x12, 0x00, 0xdd, 0xf8, 0x4c, 0x90, 0xdd, 0xf8, 0x24, 0xa0, + 0x06, 0x9c, 0x8d, 0xf8, 0x10, 0x70, 0x00, 0x28, 0x8d, 0xf8, 0x13, 0x80, + 0x00, 0xf0, 0x81, 0x80, 0x62, 0x78, 0x9d, 0xf8, 0x11, 0x10, 0x48, 0x46, + 0xff, 0xf7, 0x3f, 0xf9, 0x48, 0x46, 0xff, 0xf7, 0x77, 0xf8, 0x04, 0xf1, + 0xc4, 0x08, 0x04, 0xf1, 0xe8, 0x02, 0x98, 0xf8, 0x08, 0x10, 0x11, 0x70, + 0xa9, 0x79, 0x51, 0xb3, 0x98, 0xf8, 0x08, 0x30, 0x02, 0x2b, 0x04, 0xbf, + 0x6b, 0x79, 0xfe, 0x2b, 0x23, 0xd1, 0xb2, 0xf9, 0x02, 0x00, 0xad, 0xf8, + 0x00, 0x00, 0x01, 0xf0, 0x0f, 0x00, 0x00, 0xeb, 0x80, 0x00, 0xa0, 0xf1, + 0x28, 0x0a, 0x97, 0x7b, 0x05, 0x98, 0x09, 0x09, 0xa7, 0xeb, 0x41, 0x07, + 0xc1, 0x7f, 0x48, 0x08, 0x18, 0xbf, 0x01, 0x20, 0x05, 0x99, 0x22, 0x1d, + 0xff, 0xf7, 0x10, 0xfb, 0xbd, 0xf9, 0x00, 0x10, 0x0f, 0xfa, 0x8a, 0xf2, + 0x8a, 0x42, 0x45, 0xdb, 0xff, 0xb2, 0x87, 0x42, 0x42, 0xd3, 0x03, 0x20, + 0x88, 0xf8, 0x08, 0x00, 0x3e, 0xe0, 0x69, 0x79, 0xfe, 0x29, 0x3b, 0xd1, + 0xb2, 0xf9, 0x10, 0x30, 0xb8, 0xf8, 0x0c, 0x10, 0x9b, 0xb2, 0x99, 0x42, + 0x16, 0xda, 0x98, 0xf8, 0x08, 0x10, 0x89, 0xb3, 0xa0, 0x4a, 0x11, 0x44, + 0xcb, 0x7a, 0x29, 0x8a, 0x08, 0x40, 0x5b, 0x1c, 0xd9, 0xb2, 0x09, 0x29, + 0x28, 0xd2, 0x57, 0x5c, 0x12, 0x99, 0xa7, 0xf1, 0x01, 0x08, 0x01, 0xfa, + 0x08, 0xfe, 0x1f, 0xfa, 0x8e, 0xf1, 0x01, 0x42, 0xf1, 0xd0, 0x1a, 0xe0, + 0xb2, 0xf9, 0x12, 0x20, 0x92, 0xb2, 0x8a, 0x42, 0x18, 0xda, 0x98, 0xf8, + 0x08, 0x10, 0xa9, 0xb1, 0x6a, 0x8a, 0x10, 0x40, 0x91, 0x4a, 0x11, 0x44, + 0xcb, 0x7a, 0x5b, 0x1e, 0xd9, 0xb2, 0x09, 0x29, 0x0c, 0xd2, 0x57, 0x5c, + 0x12, 0x99, 0xa7, 0xf1, 0x01, 0x08, 0x01, 0xfa, 0x08, 0xfe, 0x1f, 0xfa, + 0x8e, 0xf1, 0x01, 0x42, 0xf1, 0xd0, 0x04, 0xf1, 0xc4, 0x00, 0x07, 0x72, + 0x48, 0x46, 0xff, 0xf7, 0xc9, 0xf9, 0x82, 0x46, 0x22, 0xe0, 0xd9, 0xf8, + 0x38, 0x00, 0xd0, 0xf8, 0x00, 0x11, 0xc8, 0x04, 0x16, 0xd5, 0x9d, 0xf8, + 0x10, 0x00, 0xe9, 0xf7, 0x0e, 0xfc, 0x8d, 0xf8, 0x0a, 0x00, 0x9d, 0xf8, + 0x10, 0x00, 0xe9, 0xf7, 0x0d, 0xfc, 0x8d, 0xf8, 0x0b, 0x00, 0x03, 0x23, + 0x00, 0x20, 0x00, 0x90, 0x0d, 0xf1, 0x0b, 0x02, 0x0d, 0xf1, 0x0a, 0x01, + 0x48, 0x46, 0x01, 0xf0, 0xb8, 0xfa, 0x05, 0xe0, 0x69, 0x79, 0x9d, 0xf8, + 0x10, 0x00, 0x00, 0x22, 0xfe, 0xf7, 0x8e, 0xff, 0x9d, 0xf8, 0x11, 0x00, + 0x28, 0xb1, 0x9d, 0xf8, 0x10, 0x00, 0x32, 0x46, 0x59, 0x46, 0xfc, 0xf7, + 0xaf, 0xfe, 0x0a, 0x98, 0x70, 0x62, 0x17, 0x99, 0x01, 0xf0, 0x07, 0x01, + 0x8d, 0xf8, 0x12, 0x10, 0xe8, 0x7a, 0x00, 0xf0, 0x60, 0x00, 0x20, 0x28, + 0x04, 0xbf, 0x9d, 0xf8, 0x10, 0x00, 0xe9, 0xf7, 0xd2, 0xfc, 0x30, 0x7b, + 0x8d, 0xf8, 0x18, 0x00, 0x31, 0x8a, 0x31, 0x73, 0x9d, 0xf8, 0x11, 0x00, + 0x00, 0x28, 0x56, 0xd0, 0x0a, 0x9a, 0x71, 0x6a, 0x14, 0x98, 0x02, 0xf4, + 0x80, 0x22, 0x11, 0x43, 0x20, 0xb1, 0x0a, 0x98, 0x82, 0x03, 0x58, 0xbf, + 0x41, 0xf4, 0x80, 0x21, 0x71, 0x62, 0x00, 0x27, 0x05, 0x98, 0x9d, 0xf8, + 0x10, 0x80, 0x00, 0xf1, 0x24, 0x05, 0x32, 0x46, 0x59, 0x46, 0x40, 0x46, + 0xfc, 0xf7, 0x7e, 0xfe, 0x5a, 0x46, 0x31, 0x46, 0x40, 0x46, 0xe9, 0xf7, + 0xda, 0xfb, 0x94, 0xf9, 0x18, 0x00, 0x9b, 0xf9, 0x14, 0x10, 0x95, 0xf9, + 0x08, 0x20, 0x40, 0x1a, 0x90, 0x42, 0x04, 0xdb, 0x7f, 0x1c, 0x69, 0x7a, + 0xf8, 0xb2, 0x88, 0x42, 0xe7, 0xd3, 0x8d, 0xf8, 0x10, 0x80, 0x9b, 0xf8, + 0x00, 0x10, 0x9b, 0xf8, 0x01, 0x00, 0xd9, 0xf8, 0x3c, 0x20, 0x81, 0x42, + 0xb4, 0xbf, 0x41, 0x1a, 0x09, 0x1a, 0x00, 0x20, 0x82, 0xf8, 0x76, 0x04, + 0xd9, 0xf8, 0x38, 0x00, 0x00, 0xf5, 0x94, 0x72, 0x53, 0x7a, 0x18, 0x06, + 0x4b, 0xd5, 0x10, 0x78, 0x08, 0xb9, 0x02, 0x20, 0x03, 0xe0, 0xc9, 0xb2, + 0x81, 0x42, 0x05, 0xd2, 0x01, 0x20, 0xd9, 0xf8, 0x3c, 0x10, 0x81, 0xf8, + 0x76, 0x04, 0x3e, 0xe0, 0x90, 0x78, 0x00, 0x28, 0x3b, 0xd0, 0xd9, 0xf8, + 0x3c, 0x00, 0x02, 0x21, 0x80, 0xf8, 0x76, 0x14, 0x35, 0xe0, 0x36, 0x48, + 0x01, 0x21, 0x01, 0x70, 0xd9, 0xf8, 0x38, 0x20, 0x02, 0xf1, 0xa8, 0x00, + 0x41, 0x78, 0x00, 0x78, 0x09, 0x1a, 0x01, 0x29, 0x29, 0xd0, 0x96, 0xf8, + 0x23, 0x00, 0xc1, 0x07, 0x0d, 0xd4, 0x01, 0x20, 0x03, 0x90, 0x02, 0x90, + 0x01, 0x90, 0x51, 0xab, 0x00, 0x93, 0x33, 0x46, 0x9d, 0xf8, 0x10, 0x00, + 0x5a, 0x46, 0x10, 0x21, 0xec, 0xf7, 0xff, 0xfa, 0x05, 0xe0, 0x9d, 0xf8, + 0x10, 0x00, 0x5a, 0x46, 0x31, 0x46, 0xe9, 0xf7, 0x71, 0xfc, 0xbb, 0xf8, + 0x0e, 0x00, 0x9d, 0xf8, 0x10, 0x30, 0x03, 0x90, 0x9b, 0xf8, 0x01, 0x10, + 0x02, 0x91, 0xff, 0x21, 0x9b, 0xf8, 0x00, 0x20, 0x01, 0x92, 0x60, 0x78, + 0x20, 0x4a, 0x00, 0x90, 0x03, 0x20, 0xeb, 0xf7, 0x3c, 0xfb, 0x0a, 0x98, + 0x70, 0x62, 0xe9, 0x7a, 0x01, 0xf0, 0xa0, 0x01, 0x20, 0x29, 0x05, 0xd1, + 0x9d, 0xf8, 0x12, 0x10, 0x9d, 0xf8, 0x10, 0x00, 0xe9, 0xf7, 0x2f, 0xfc, + 0x9d, 0xf8, 0x18, 0x00, 0x30, 0x73, 0xc4, 0x34, 0x9d, 0xf8, 0x13, 0x10, + 0x21, 0x77, 0x9b, 0xf8, 0x05, 0x00, 0x00, 0x28, 0x04, 0xbf, 0xba, 0xf1, + 0x00, 0x0f, 0x4f, 0xf4, 0x80, 0x3a, 0x68, 0x46, 0xdc, 0xf7, 0x06, 0xfe, + 0x01, 0x98, 0x0e, 0x90, 0x0e, 0xa8, 0xdc, 0xf7, 0xdd, 0xfd, 0x11, 0x98, + 0xa0, 0x61, 0x69, 0xb0, 0x50, 0x46, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0x20, + 0x09, 0x29, 0x05, 0xd2, 0x08, 0x4b, 0x03, 0xeb, 0x81, 0x01, 0x13, 0x68, + 0x0b, 0x60, 0x70, 0x47, 0x04, 0x20, 0x70, 0x47, 0x38, 0x39, 0x00, 0x20, + 0xaa, 0x77, 0x02, 0x20, 0x20, 0x39, 0x00, 0x20, 0xc1, 0x05, 0xd9, 0x01, + 0x48, 0x8e, 0x04, 0x01, 0x8c, 0x3d, 0x00, 0x20, 0x2d, 0xe9, 0xfc, 0x41, + 0x1f, 0x46, 0x08, 0x9e, 0x00, 0x23, 0x0d, 0x46, 0x90, 0x46, 0x8d, 0xf8, + 0x00, 0x30, 0x04, 0x46, 0x6a, 0x46, 0x0c, 0x21, 0xe9, 0xf7, 0xd3, 0xfb, + 0x33, 0x46, 0x00, 0xf0, 0x0c, 0xf8, 0x38, 0x70, 0x73, 0x1c, 0x00, 0xf0, + 0x08, 0xf8, 0x78, 0x70, 0x20, 0x46, 0x9d, 0xf8, 0x00, 0x10, 0xe9, 0xf7, + 0xc8, 0xfb, 0xbd, 0xe8, 0xf3, 0x81, 0x42, 0x46, 0x29, 0x46, 0x20, 0x46, + 0xe9, 0xf7, 0xc3, 0xbb, 0xe9, 0xf7, 0xc3, 0xbb, 0x10, 0xb5, 0x04, 0x46, + 0x11, 0xb1, 0x01, 0x29, 0x06, 0xd0, 0x10, 0xbd, 0x08, 0x22, 0x08, 0x21, + 0xe9, 0xf7, 0x8e, 0xfb, 0x02, 0x22, 0x04, 0xe0, 0x04, 0x22, 0x04, 0x21, + 0xe9, 0xf7, 0x88, 0xfb, 0x01, 0x22, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, + 0x11, 0x46, 0xe9, 0xf7, 0x83, 0xbb, 0x11, 0xb1, 0x01, 0x29, 0x03, 0xd0, + 0x70, 0x47, 0x0f, 0x22, 0xfc, 0x21, 0x01, 0xe0, 0x0f, 0x22, 0xfd, 0x21, + 0xe9, 0xf7, 0x7a, 0xbb, 0x2d, 0xe9, 0xf0, 0x41, 0x04, 0x46, 0x0d, 0x46, + 0x16, 0x46, 0x98, 0x46, 0x00, 0x27, 0xdf, 0xf8, 0x88, 0x0b, 0x00, 0xeb, + 0x86, 0x03, 0xf8, 0xb2, 0x08, 0xeb, 0xc5, 0x02, 0x19, 0x5c, 0x0a, 0x44, + 0x01, 0xeb, 0x05, 0x11, 0xc9, 0xb2, 0x20, 0x46, 0xe9, 0xf7, 0x89, 0xf9, + 0x7f, 0x1c, 0xfa, 0xb2, 0x04, 0x2a, 0xec, 0xd3, 0xbd, 0xe8, 0xf0, 0x81, + 0xf8, 0xb5, 0x84, 0xb0, 0x97, 0x1c, 0x0a, 0x9e, 0x0b, 0x9c, 0x00, 0x92, + 0x01, 0x97, 0x15, 0x1d, 0x02, 0x95, 0x97, 0x1d, 0x03, 0x97, 0x00, 0x22, + 0x06, 0xeb, 0xc0, 0x00, 0xdf, 0xf8, 0x40, 0x6b, 0x06, 0xeb, 0x81, 0x05, + 0xae, 0x5c, 0x5d, 0xf8, 0x22, 0x50, 0x2d, 0x88, 0x87, 0x5d, 0xab, 0x42, + 0x2c, 0xbf, 0xe7, 0x19, 0x3f, 0x1b, 0x52, 0x1c, 0x87, 0x55, 0x04, 0x2a, + 0xee, 0xd3, 0x05, 0xb0, 0xf0, 0xbd, 0x02, 0xeb, 0xc0, 0x00, 0x0a, 0x46, + 0x52, 0x42, 0x02, 0x44, 0x08, 0x44, 0x53, 0x70, 0x83, 0x70, 0x53, 0x71, + 0x83, 0x71, 0x70, 0x47, 0xff, 0xb5, 0x00, 0xf0, 0x2a, 0xf8, 0x02, 0xeb, + 0xc0, 0x00, 0x00, 0xf0, 0x1c, 0xf8, 0xb5, 0x18, 0x20, 0x2d, 0x34, 0xbf, + 0xb2, 0x18, 0x1f, 0x22, 0x64, 0x1c, 0x04, 0x2c, 0x3a, 0x70, 0xf4, 0xd3, + 0xff, 0xbd, 0xd8, 0xb5, 0x84, 0xb0, 0x02, 0xeb, 0xc0, 0x00, 0x00, 0xf0, + 0x16, 0xf8, 0x00, 0xf0, 0x0a, 0xf8, 0x96, 0x42, 0x34, 0xbf, 0x92, 0x1b, + 0x00, 0x22, 0x64, 0x1c, 0x04, 0x2c, 0x3a, 0x70, 0xf5, 0xd3, 0x05, 0xb0, + 0xd0, 0xbd, 0xdf, 0xf8, 0xc0, 0x2a, 0x1e, 0x78, 0x02, 0xeb, 0x81, 0x07, + 0x3a, 0x5d, 0x82, 0x5c, 0x5d, 0xf8, 0x24, 0x70, 0x70, 0x47, 0x09, 0x9e, + 0x00, 0x96, 0x74, 0x1c, 0x01, 0x94, 0xb7, 0x1c, 0xf6, 0x1c, 0x02, 0x97, + 0x03, 0x96, 0x00, 0x24, 0x70, 0x47, 0x2d, 0xe9, 0xf6, 0x4f, 0x8b, 0x46, + 0x8d, 0xb0, 0x09, 0xae, 0x19, 0x99, 0x81, 0x46, 0x18, 0x98, 0x44, 0x88, + 0x09, 0x91, 0x01, 0xaf, 0x19, 0x99, 0xcd, 0xf8, 0x14, 0xd0, 0x4a, 0x1c, + 0x72, 0x60, 0x64, 0x1e, 0x19, 0x99, 0x8a, 0x1c, 0xb2, 0x60, 0x03, 0xeb, + 0xcb, 0x08, 0x19, 0x99, 0xca, 0x1c, 0xf2, 0x60, 0x05, 0xa9, 0x0d, 0xf1, + 0x02, 0x02, 0x4a, 0x60, 0x8f, 0x60, 0x0d, 0xf1, 0x06, 0x02, 0xca, 0x60, + 0xe4, 0x03, 0x9d, 0xf8, 0x38, 0x20, 0x9d, 0xf8, 0x38, 0x10, 0x07, 0x78, + 0x52, 0x42, 0x41, 0x44, 0x42, 0x44, 0x24, 0x0c, 0x7f, 0x00, 0x04, 0x91, + 0x03, 0x92, 0x65, 0xe0, 0x00, 0x2a, 0x58, 0xd5, 0x56, 0xf8, 0x2c, 0x10, + 0x08, 0x78, 0x00, 0x28, 0x53, 0xd0, 0x56, 0xf8, 0x2c, 0x00, 0x90, 0xf8, + 0x00, 0xe0, 0x96, 0x44, 0x80, 0xf8, 0x00, 0xe0, 0x4b, 0xe0, 0x03, 0x98, + 0x41, 0x78, 0x2f, 0x29, 0x1e, 0xbf, 0x04, 0x98, 0x81, 0x78, 0x2f, 0x29, + 0x07, 0xd0, 0x03, 0x98, 0x41, 0x79, 0x2f, 0x29, 0x1e, 0xbf, 0x04, 0x98, + 0x81, 0x79, 0x2f, 0x29, 0x49, 0xd1, 0x9d, 0xf8, 0x38, 0xa0, 0x00, 0x25, + 0xdf, 0xf8, 0xf4, 0x09, 0x00, 0xeb, 0x8a, 0x01, 0x02, 0x91, 0x49, 0x5d, + 0x18, 0xf8, 0x01, 0x20, 0x2f, 0x2a, 0x07, 0xd1, 0x56, 0xf8, 0x25, 0x20, + 0x01, 0xeb, 0x0b, 0x11, 0xc9, 0xb2, 0x48, 0x46, 0xe9, 0xf7, 0xbd, 0xf8, + 0x6d, 0x1c, 0x04, 0x2d, 0xea, 0xd3, 0x00, 0xf0, 0x82, 0xfb, 0x48, 0x46, + 0xe9, 0xf7, 0xa9, 0xf8, 0x69, 0x46, 0x48, 0x46, 0xe9, 0xf7, 0x82, 0xfa, + 0x9d, 0xf9, 0x68, 0x20, 0x4f, 0xf0, 0x00, 0x0c, 0x05, 0xab, 0x02, 0x98, + 0x10, 0xf8, 0x0c, 0x00, 0x18, 0xf8, 0x00, 0x10, 0x2f, 0x29, 0x0e, 0xd1, + 0x53, 0xf8, 0x2c, 0x10, 0x09, 0x88, 0x00, 0x2a, 0x02, 0xdd, 0xa1, 0x42, + 0xb3, 0xdb, 0x01, 0xe0, 0x8c, 0x42, 0xa9, 0xdb, 0x56, 0xf8, 0x2c, 0x10, + 0x09, 0x78, 0x08, 0xf8, 0x00, 0x10, 0x0c, 0xf1, 0x01, 0x0c, 0xbc, 0xf1, + 0x04, 0x0f, 0xe4, 0xd3, 0x8d, 0xf8, 0x68, 0x20, 0x7f, 0x1e, 0x19, 0x98, + 0x00, 0xf0, 0x04, 0xf8, 0xf8, 0xb2, 0x00, 0x28, 0xa5, 0xd1, 0x3d, 0xe1, + 0x01, 0x78, 0x20, 0x29, 0x24, 0xbf, 0x1f, 0x22, 0x02, 0x70, 0x41, 0x78, + 0x20, 0x29, 0x24, 0xbf, 0x1f, 0x22, 0x42, 0x70, 0x81, 0x78, 0x20, 0x29, + 0x24, 0xbf, 0x1f, 0x22, 0x82, 0x70, 0xc1, 0x78, 0x20, 0x29, 0x24, 0xbf, + 0x1f, 0x22, 0xc2, 0x70, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, 0x0a, 0x9c, + 0x0b, 0x9d, 0x4f, 0xf0, 0x00, 0x0a, 0x04, 0xeb, 0xc1, 0x08, 0x05, 0xeb, + 0xc1, 0x07, 0x8d, 0xf8, 0x00, 0xa0, 0x00, 0x26, 0x03, 0xeb, 0xc1, 0x0b, + 0x04, 0x46, 0x0d, 0x46, 0x91, 0x46, 0xdf, 0xf8, 0x18, 0x09, 0x00, 0xeb, + 0x89, 0x02, 0xf3, 0xb2, 0x4a, 0xf0, 0x40, 0x00, 0xd1, 0x5c, 0x1b, 0xf8, + 0x01, 0x20, 0x2f, 0x2a, 0x06, 0xd1, 0x7b, 0x18, 0x01, 0x22, 0x1a, 0x74, + 0x1f, 0x22, 0x8d, 0xf8, 0x00, 0x20, 0x08, 0xe0, 0x18, 0xf8, 0x01, 0x30, + 0x2f, 0x2b, 0x06, 0xd1, 0x00, 0x22, 0x8d, 0xf8, 0x00, 0x20, 0x01, 0x23, + 0x7b, 0x54, 0x82, 0x46, 0x0a, 0xe0, 0x07, 0xeb, 0x01, 0x0e, 0x9a, 0x18, + 0x00, 0x20, 0x78, 0x54, 0x12, 0x04, 0x8e, 0xf8, 0x10, 0x00, 0x52, 0x0c, + 0x8d, 0xf8, 0x00, 0x20, 0x01, 0xeb, 0x05, 0x11, 0x6a, 0x46, 0xc9, 0xb2, + 0x20, 0x46, 0xe9, 0xf7, 0x30, 0xf8, 0x76, 0x1c, 0xf2, 0xb2, 0x04, 0x2a, + 0xcb, 0xd3, 0x50, 0x46, 0xbd, 0xe8, 0xf2, 0x8f, 0x2d, 0xe9, 0xfc, 0x41, + 0x04, 0x46, 0x88, 0x46, 0x16, 0x46, 0x1f, 0x46, 0x00, 0x25, 0x01, 0x97, + 0x00, 0x96, 0x43, 0x46, 0x00, 0x22, 0xe9, 0xb2, 0x20, 0x46, 0xff, 0xf7, + 0xa8, 0xff, 0x01, 0x97, 0x00, 0x96, 0x43, 0x46, 0x01, 0x22, 0xe9, 0xb2, + 0x20, 0x46, 0xff, 0xf7, 0xa0, 0xff, 0x6d, 0x1c, 0xe8, 0xb2, 0x02, 0x28, + 0xeb, 0xd3, 0xbd, 0xe8, 0xf3, 0x81, 0x2d, 0xe9, 0xf0, 0x4f, 0x89, 0x46, + 0x16, 0x46, 0x19, 0x46, 0x80, 0x46, 0x01, 0x23, 0x01, 0x22, 0x8f, 0xb0, + 0xb9, 0xf8, 0x02, 0x40, 0xe8, 0xf7, 0x9a, 0xff, 0x49, 0x46, 0x40, 0x46, + 0x00, 0xf0, 0xe2, 0xfc, 0x00, 0x23, 0x00, 0xf0, 0xc7, 0xf8, 0x01, 0x23, + 0x00, 0x22, 0x03, 0x21, 0x40, 0x46, 0xe9, 0xf7, 0xde, 0xf9, 0x02, 0x23, + 0x00, 0xf0, 0xbe, 0xf8, 0x03, 0x23, 0x00, 0x22, 0x03, 0x21, 0x40, 0x46, + 0x64, 0x1e, 0xe9, 0xf7, 0xd4, 0xf9, 0x4f, 0xf0, 0x00, 0x0b, 0xe4, 0x03, + 0x00, 0x25, 0xea, 0xb2, 0x00, 0x21, 0x40, 0x46, 0xe8, 0xf7, 0xc1, 0xff, + 0xea, 0xb2, 0x01, 0x21, 0x40, 0x46, 0xe8, 0xf7, 0xbc, 0xff, 0x6d, 0x1c, + 0xe8, 0xb2, 0x01, 0x28, 0xf1, 0xd9, 0x0a, 0x96, 0x00, 0x25, 0xdd, 0xf8, + 0x60, 0xa0, 0x00, 0x26, 0xe9, 0xb2, 0x40, 0x46, 0xff, 0xf7, 0x0c, 0xfe, + 0xf1, 0xb2, 0x40, 0x46, 0xff, 0xf7, 0x1f, 0xfe, 0xeb, 0xb2, 0xf2, 0xb2, + 0x1f, 0x21, 0x40, 0x46, 0xe8, 0xf7, 0xa3, 0xff, 0x10, 0x23, 0x00, 0xf0, + 0x87, 0xf8, 0x10, 0x27, 0x06, 0xab, 0xf2, 0xb2, 0xe9, 0xb2, 0x40, 0x46, + 0xff, 0xf7, 0x1a, 0xfe, 0x00, 0xf0, 0x81, 0xfa, 0x40, 0x46, 0xe8, 0xf7, + 0xa8, 0xff, 0x04, 0xa9, 0x40, 0x46, 0xe9, 0xf7, 0x81, 0xf9, 0x7f, 0x10, + 0xf8, 0xb2, 0x06, 0xa9, 0x01, 0x90, 0x00, 0x91, 0x23, 0x0c, 0x04, 0xaa, + 0xf1, 0xb2, 0xe8, 0xb2, 0xff, 0xf7, 0x22, 0xfe, 0x00, 0x2f, 0xe3, 0xd1, + 0x2f, 0x23, 0x0b, 0xaa, 0x00, 0xf0, 0x67, 0xf8, 0x00, 0xf0, 0x5d, 0xf8, + 0xff, 0xf7, 0x44, 0xfe, 0x4f, 0xf0, 0xff, 0x30, 0x00, 0xf0, 0x51, 0xf8, + 0x0b, 0xab, 0x00, 0xf0, 0x5f, 0xf8, 0x00, 0xf0, 0x52, 0xf8, 0xff, 0xf7, + 0x4a, 0xfe, 0x2f, 0x23, 0x00, 0xf0, 0x54, 0xf8, 0x01, 0x20, 0x00, 0xf0, + 0x44, 0xf8, 0x06, 0xab, 0x00, 0xf0, 0x52, 0xf8, 0x0b, 0xa8, 0x00, 0x90, + 0xcd, 0xf8, 0x04, 0xa0, 0x06, 0xab, 0xf2, 0xb2, 0xe9, 0xb2, 0x40, 0x46, + 0xff, 0xf7, 0x0b, 0xff, 0x40, 0xea, 0x0b, 0x0b, 0x0a, 0x98, 0x01, 0x28, + 0x0e, 0xd1, 0x0f, 0xf6, 0xdc, 0x00, 0x00, 0x88, 0xad, 0xf8, 0x08, 0x00, + 0x02, 0xa9, 0x00, 0x91, 0xcd, 0xf8, 0x04, 0xa0, 0x4b, 0x46, 0xf2, 0xb2, + 0xe9, 0xb2, 0x40, 0x46, 0x00, 0xf0, 0x16, 0xfb, 0xeb, 0xb2, 0xf2, 0xb2, + 0x00, 0x21, 0x40, 0x46, 0xe8, 0xf7, 0x43, 0xff, 0xea, 0xb2, 0xf1, 0xb2, + 0x40, 0x46, 0xe8, 0xf7, 0x40, 0xff, 0x76, 0x1c, 0xf0, 0xb2, 0x01, 0x28, + 0x88, 0xd9, 0x6d, 0x1c, 0xe9, 0xb2, 0x01, 0x29, 0x83, 0xd9, 0x0a, 0x98, + 0x01, 0x28, 0x04, 0xbf, 0x50, 0x46, 0x00, 0xf0, 0x9a, 0xfb, 0x53, 0x46, + 0x0b, 0xaa, 0x06, 0xa9, 0x40, 0x46, 0xff, 0xf7, 0x21, 0xff, 0x58, 0x46, + 0x0f, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x03, 0xa9, 0x02, 0x90, 0x01, 0x91, + 0xcd, 0xf8, 0x00, 0x90, 0x70, 0x47, 0x03, 0xa8, 0x00, 0x90, 0x4b, 0x46, + 0x06, 0xaa, 0xf1, 0xb2, 0xe8, 0xb2, 0x70, 0x47, 0x06, 0xaa, 0xf1, 0xb2, + 0xe8, 0xb2, 0xd2, 0xe5, 0xf2, 0xb2, 0xe9, 0xb2, 0x40, 0x46, 0x10, 0xe6, + 0x00, 0x22, 0x02, 0x21, 0x40, 0x46, 0xe9, 0xf7, 0x18, 0xb9, 0x00, 0x00, + 0x2d, 0xe9, 0xf2, 0x4f, 0x96, 0xb0, 0x00, 0x21, 0x80, 0x46, 0x8d, 0xf8, + 0x28, 0x10, 0x14, 0x46, 0x1d, 0x46, 0x68, 0x46, 0xdc, 0xf7, 0x12, 0xfb, + 0x40, 0x46, 0xdc, 0xf7, 0x31, 0xfb, 0x9d, 0xf8, 0x58, 0x00, 0x01, 0x28, + 0x0c, 0xd0, 0x40, 0x46, 0xe9, 0xf7, 0x21, 0xf9, 0x8d, 0xf8, 0x28, 0x00, + 0x00, 0x21, 0x40, 0x46, 0xe9, 0xf7, 0x1d, 0xf9, 0x01, 0x21, 0x40, 0x46, + 0xe9, 0xf7, 0x1d, 0xf9, 0x08, 0x94, 0xdd, 0xf8, 0x80, 0xa0, 0x61, 0x78, + 0xca, 0x08, 0x00, 0x24, 0x02, 0xf0, 0x01, 0x02, 0x0a, 0xf1, 0x70, 0x07, + 0x12, 0x92, 0x8d, 0xf8, 0x14, 0x40, 0x00, 0x20, 0x78, 0x70, 0x3c, 0x70, + 0x0d, 0xf1, 0x4c, 0x09, 0x06, 0xae, 0x21, 0xfa, 0x00, 0xf2, 0x02, 0xf0, + 0x01, 0x02, 0x49, 0xf8, 0x20, 0x20, 0x01, 0x28, 0x0c, 0xbf, 0x02, 0x23, + 0x03, 0x46, 0x33, 0x54, 0x14, 0x19, 0x40, 0x1c, 0x02, 0x28, 0xf0, 0xd9, + 0xc1, 0xf3, 0x03, 0x10, 0x00, 0x21, 0x07, 0x90, 0x09, 0x91, 0x00, 0x26, + 0x8d, 0xf8, 0x15, 0x50, 0x40, 0x46, 0xdc, 0xf7, 0xf3, 0xfa, 0x59, 0xf8, + 0x26, 0x50, 0x4f, 0xf0, 0x00, 0x0b, 0x4d, 0xb1, 0x06, 0xa8, 0x10, 0xf8, + 0x06, 0xb0, 0x59, 0x46, 0x40, 0x46, 0xe9, 0xf7, 0xcc, 0xf8, 0x87, 0xf8, + 0x00, 0xb0, 0x01, 0xe0, 0x00, 0x2c, 0x3a, 0xd1, 0x9d, 0xf8, 0x15, 0x20, + 0x08, 0x99, 0xcd, 0xf8, 0x00, 0xa0, 0x0a, 0xab, 0x40, 0x46, 0xff, 0xf7, + 0xb8, 0xfe, 0x83, 0x46, 0x9d, 0xf8, 0x15, 0x00, 0x08, 0x99, 0x00, 0x90, + 0xcd, 0xf8, 0x04, 0xa0, 0x01, 0x23, 0x0a, 0xaa, 0x40, 0x46, 0x00, 0xf0, + 0x85, 0xf9, 0x40, 0xea, 0x0b, 0x0b, 0x08, 0x98, 0xc0, 0x79, 0x10, 0xf0, + 0x0f, 0x0f, 0x15, 0xd0, 0x81, 0x09, 0x00, 0xf0, 0x1f, 0x00, 0x02, 0x90, + 0x49, 0x1c, 0xc9, 0xb2, 0x9d, 0xf8, 0x15, 0x00, 0x04, 0x91, 0x00, 0x22, + 0x03, 0x92, 0x00, 0x90, 0xcd, 0xf8, 0x04, 0xa0, 0x00, 0x23, 0x08, 0x99, + 0x0a, 0xaa, 0x40, 0x46, 0x00, 0xf0, 0xe8, 0xfa, 0x40, 0xea, 0x0b, 0x0b, + 0x78, 0x78, 0x18, 0xb9, 0x00, 0xf0, 0xac, 0xf8, 0x00, 0xf0, 0xb0, 0xf8, + 0x78, 0x78, 0x40, 0x1c, 0x78, 0x70, 0x01, 0x23, 0x01, 0x22, 0x0a, 0xf1, + 0x48, 0x01, 0x40, 0x46, 0x00, 0xf0, 0xa6, 0xf8, 0x1b, 0xf0, 0xc0, 0x0f, + 0x06, 0xd0, 0x78, 0x78, 0xe1, 0xb2, 0x88, 0x42, 0x1e, 0xd2, 0xcd, 0xf8, + 0x24, 0xb0, 0x65, 0xe0, 0xe6, 0xb9, 0xd9, 0xf8, 0x04, 0x00, 0xc8, 0xb1, + 0x07, 0x9a, 0x07, 0x98, 0xc2, 0xf1, 0x1f, 0x02, 0x00, 0x21, 0xd2, 0xb2, + 0x00, 0x23, 0x0a, 0xf1, 0x4c, 0x05, 0x5f, 0xfa, 0x83, 0xfc, 0x15, 0xf8, + 0x0c, 0x50, 0xaa, 0x42, 0xac, 0xbf, 0x85, 0x42, 0x01, 0x21, 0x5b, 0x1c, + 0xdd, 0xb2, 0x10, 0x2d, 0xf1, 0xd3, 0x00, 0x29, 0x07, 0x90, 0x49, 0xd1, + 0x04, 0x26, 0x47, 0xe0, 0x0c, 0xb1, 0x00, 0x2d, 0x4b, 0xd0, 0x12, 0x98, + 0x04, 0x26, 0x00, 0x28, 0x40, 0xd1, 0x78, 0x78, 0x01, 0x28, 0x3d, 0xd9, + 0x00, 0xf0, 0x6c, 0xf8, 0x00, 0xf0, 0xa5, 0xf8, 0x9d, 0xf8, 0x14, 0x10, + 0x40, 0x46, 0xe9, 0xf7, 0x4a, 0xf8, 0x9d, 0xf8, 0x14, 0x00, 0x38, 0x70, + 0x07, 0x9a, 0x09, 0x99, 0x00, 0x23, 0x0a, 0xeb, 0x03, 0x00, 0x00, 0xf1, + 0x4c, 0x05, 0x28, 0x7d, 0x00, 0x28, 0x18, 0xbf, 0x1f, 0x28, 0x1f, 0xd1, + 0x00, 0xee, 0x10, 0x0a, 0x28, 0x78, 0x10, 0x38, 0x00, 0xee, 0x90, 0x0a, + 0xf8, 0xee, 0x60, 0x0a, 0x9f, 0xed, 0x25, 0x1a, 0xf3, 0xee, 0x00, 0x1a, + 0xb8, 0xee, 0x40, 0x0a, 0x40, 0xee, 0x81, 0x1a, 0xd0, 0xb2, 0x30, 0xee, + 0x61, 0x0a, 0x00, 0xee, 0x90, 0x0a, 0xb0, 0xee, 0xc0, 0x0a, 0xf8, 0xee, + 0x60, 0x0a, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xbf, + 0x8b, 0x46, 0x10, 0x23, 0x5b, 0x1c, 0xdb, 0xb2, 0x10, 0x2b, 0xd2, 0xd3, + 0x07, 0x92, 0x09, 0x91, 0x59, 0xf8, 0x26, 0x00, 0x18, 0xb1, 0x06, 0xa9, + 0x88, 0x5d, 0x8d, 0xf8, 0x14, 0x00, 0x76, 0x1c, 0xf6, 0xb2, 0x02, 0x2e, + 0x7f, 0xf6, 0x2e, 0xaf, 0x9d, 0xf8, 0x58, 0x00, 0x01, 0x28, 0x03, 0xd0, + 0x00, 0x21, 0x40, 0x46, 0xe9, 0xf7, 0x19, 0xf8, 0x40, 0x46, 0xdc, 0xf7, + 0x25, 0xfa, 0x78, 0x60, 0x40, 0x46, 0xdc, 0xf7, 0x27, 0xfa, 0xb8, 0x60, + 0x08, 0xb1, 0x4b, 0xf4, 0x80, 0x5b, 0x68, 0x46, 0xdc, 0xf7, 0xf8, 0xf9, + 0x01, 0x98, 0x0e, 0x90, 0x0e, 0xa8, 0xdc, 0xf7, 0xcf, 0xf9, 0x11, 0x98, + 0xf8, 0x60, 0x17, 0xb0, 0x58, 0x46, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0x00, + 0x71, 0x3d, 0xaa, 0x3f, 0x01, 0x23, 0x01, 0x22, 0x0a, 0xf1, 0x5c, 0x01, + 0x40, 0x46, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x43, 0x01, 0x2b, 0x80, 0x46, + 0x0d, 0x46, 0x16, 0x46, 0x0e, 0xd1, 0xe8, 0xf7, 0xc8, 0xfd, 0x28, 0x70, + 0x40, 0x46, 0xe8, 0xf7, 0xc6, 0xfd, 0x68, 0x70, 0x40, 0x46, 0xe8, 0xf7, + 0xc4, 0xfd, 0xa8, 0x70, 0x40, 0x46, 0xe8, 0xf7, 0xc2, 0xfd, 0xe8, 0x70, + 0x01, 0x2e, 0x1a, 0xd1, 0x00, 0x26, 0x00, 0x27, 0x00, 0x24, 0x00, 0xf0, + 0x46, 0xf8, 0x05, 0xeb, 0x00, 0x09, 0xe3, 0xb2, 0xfa, 0xb2, 0xf1, 0xb2, + 0x40, 0x46, 0xe8, 0xf7, 0xa4, 0xfd, 0x89, 0xf8, 0x04, 0x00, 0x64, 0x1c, + 0xe0, 0xb2, 0x04, 0x28, 0xef, 0xd3, 0x7f, 0x1c, 0xf9, 0xb2, 0x02, 0x29, + 0xea, 0xd3, 0x76, 0x1c, 0xf0, 0xb2, 0x02, 0x28, 0xe5, 0xd3, 0xbd, 0xe8, + 0xf1, 0x83, 0x2d, 0xe9, 0xfc, 0x41, 0x01, 0x2b, 0x80, 0x46, 0x0d, 0x46, + 0x16, 0x46, 0x08, 0xd1, 0x6a, 0x78, 0x29, 0x78, 0xe8, 0xf7, 0x8d, 0xfd, + 0xea, 0x78, 0xa9, 0x78, 0x40, 0x46, 0xe8, 0xf7, 0x8a, 0xfd, 0x01, 0x2e, + 0x19, 0xd1, 0x00, 0x26, 0x00, 0x27, 0x00, 0x24, 0x00, 0xf0, 0x17, 0xf8, + 0x28, 0x44, 0xe3, 0xb2, 0x01, 0x79, 0x00, 0x91, 0xfa, 0xb2, 0xf1, 0xb2, + 0x40, 0x46, 0xe8, 0xf7, 0x69, 0xfd, 0x64, 0x1c, 0xe0, 0xb2, 0x04, 0x28, + 0xf0, 0xd3, 0x7f, 0x1c, 0xf9, 0xb2, 0x02, 0x29, 0xeb, 0xd3, 0x76, 0x1c, + 0xf0, 0xb2, 0x02, 0x28, 0xe6, 0xd3, 0xbd, 0xe8, 0xf3, 0x81, 0xb8, 0x00, + 0x00, 0xeb, 0xc6, 0x00, 0x20, 0x18, 0xc0, 0xb2, 0x70, 0x47, 0x2d, 0xe9, + 0xfc, 0x4d, 0x5d, 0x88, 0x9d, 0xf9, 0x2c, 0x40, 0x6d, 0x1e, 0xed, 0x03, + 0x2d, 0x0c, 0x01, 0x2c, 0xac, 0xbf, 0x01, 0x26, 0x1f, 0x26, 0x82, 0x46, + 0x8b, 0x46, 0x90, 0x46, 0x01, 0x27, 0xc6, 0xf1, 0x20, 0x03, 0xdb, 0xb2, + 0xf2, 0xb2, 0x59, 0x46, 0x50, 0x46, 0xe8, 0xf7, 0x66, 0xfd, 0x00, 0xf0, + 0x2c, 0xf8, 0x50, 0x46, 0xe8, 0xf7, 0x53, 0xfd, 0x00, 0x21, 0x50, 0x46, + 0xe8, 0xf7, 0x2a, 0xff, 0x01, 0x2c, 0x0b, 0xd1, 0xa8, 0x42, 0x0f, 0xdb, + 0x0a, 0x98, 0xff, 0xb2, 0x20, 0x2f, 0x58, 0x44, 0x14, 0xd1, 0x01, 0x2c, + 0xac, 0xbf, 0x1f, 0x26, 0x01, 0x26, 0x0b, 0xe0, 0x4f, 0xf0, 0xff, 0x32, + 0x94, 0x42, 0x01, 0xd1, 0x85, 0x42, 0xef, 0xda, 0x7f, 0x1c, 0xa6, 0x19, + 0xf8, 0xb2, 0x20, 0x28, 0xd5, 0xd3, 0xe9, 0xe7, 0x01, 0x21, 0x80, 0xf8, + 0x22, 0x10, 0x02, 0xe0, 0x00, 0x22, 0x80, 0xf8, 0x22, 0x20, 0x88, 0xf8, + 0x00, 0x60, 0xbd, 0xe8, 0xf3, 0x8d, 0x01, 0x20, 0xdc, 0xf7, 0x75, 0xb8, + 0x2d, 0xe9, 0xfe, 0x4f, 0x0d, 0x9c, 0x8a, 0x46, 0x90, 0x46, 0x1e, 0x46, + 0x81, 0x46, 0x00, 0x23, 0x01, 0x22, 0x04, 0xf1, 0x48, 0x01, 0xff, 0xf7, + 0x41, 0xff, 0x01, 0x2e, 0x4f, 0xf0, 0x00, 0x0b, 0x09, 0xd0, 0x01, 0x23, + 0x01, 0x22, 0x41, 0x46, 0x48, 0x46, 0xe8, 0xf7, 0xb7, 0xfc, 0x51, 0x46, + 0x48, 0x46, 0x00, 0xf0, 0xff, 0xf9, 0x00, 0x21, 0x48, 0x46, 0xe8, 0xf7, + 0xfa, 0xfc, 0x00, 0xf0, 0xe9, 0xf9, 0x00, 0xf0, 0xdd, 0xf9, 0x00, 0xf0, + 0xf0, 0xf9, 0x0c, 0x9e, 0x00, 0x27, 0x00, 0xf0, 0x64, 0xf8, 0xf8, 0xb2, + 0x38, 0xb9, 0x00, 0xf0, 0xd8, 0xf9, 0x08, 0x21, 0x48, 0x46, 0xe8, 0xf7, + 0xe8, 0xfc, 0x00, 0x23, 0x0b, 0xe0, 0x01, 0x28, 0x0b, 0xd1, 0x00, 0x22, + 0x04, 0x21, 0x48, 0x46, 0xe8, 0xf7, 0xce, 0xfe, 0x02, 0x21, 0x48, 0x46, + 0xe8, 0xf7, 0xdb, 0xfc, 0x01, 0x23, 0x00, 0xf0, 0xcf, 0xf9, 0x01, 0x20, + 0x01, 0x90, 0x00, 0x94, 0x53, 0x46, 0x0d, 0xf1, 0x09, 0x02, 0xf9, 0xb2, + 0x48, 0x46, 0xff, 0xf7, 0x6c, 0xff, 0x4f, 0xf0, 0xff, 0x30, 0x01, 0x90, + 0x00, 0x94, 0x53, 0x46, 0x02, 0xaa, 0xf9, 0xb2, 0x48, 0x46, 0xff, 0xf7, + 0x62, 0xff, 0xf8, 0xb2, 0x20, 0x18, 0x20, 0x30, 0x81, 0x78, 0x01, 0x29, + 0x1a, 0xbf, 0x00, 0x78, 0x01, 0x28, 0x4b, 0xf0, 0x80, 0x0b, 0x9d, 0xf8, + 0x09, 0x00, 0x9d, 0xf8, 0x08, 0x10, 0x0d, 0x18, 0x2d, 0x04, 0x6d, 0x0c, + 0x01, 0x2e, 0x0e, 0xd1, 0x0f, 0xf2, 0x84, 0x30, 0x00, 0x88, 0xad, 0xf8, + 0x0a, 0x00, 0x01, 0x94, 0x0d, 0xf1, 0x0a, 0x01, 0x00, 0x91, 0xeb, 0xb2, + 0x52, 0x46, 0xf9, 0xb2, 0x48, 0x46, 0x00, 0xf0, 0xb3, 0xf8, 0xc5, 0xf1, + 0x20, 0x03, 0xdb, 0xb2, 0xea, 0xb2, 0xf9, 0xb2, 0x48, 0x46, 0xe8, 0xf7, + 0xb6, 0xfc, 0x7f, 0x1c, 0xf8, 0xb2, 0x02, 0x28, 0xa3, 0xd3, 0x00, 0xf0, + 0x08, 0xf8, 0x01, 0x22, 0x41, 0x46, 0x48, 0x46, 0xe8, 0xf7, 0x46, 0xfc, + 0x58, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, 0x00, 0x23, 0x01, 0x22, 0x04, 0xf1, + 0x48, 0x01, 0x48, 0x46, 0xef, 0xe6, 0x08, 0x18, 0x00, 0x21, 0x01, 0x2a, + 0x40, 0xb2, 0x08, 0xbf, 0x01, 0x21, 0x88, 0x42, 0xb8, 0xbf, 0x08, 0x46, + 0x1f, 0x28, 0xc8, 0xbf, 0x1f, 0x20, 0xc0, 0xb2, 0x70, 0x47, 0xff, 0xb5, + 0x9e, 0x1c, 0x01, 0x96, 0x00, 0x93, 0x9e, 0x1d, 0x0a, 0x9d, 0x03, 0x96, + 0x05, 0xeb, 0xc0, 0x05, 0x1f, 0x1d, 0x01, 0x23, 0x59, 0x48, 0x02, 0x97, + 0x16, 0x00, 0x00, 0xeb, 0x81, 0x01, 0x12, 0xd1, 0x00, 0x22, 0x8e, 0x5c, + 0xaf, 0x19, 0x00, 0x20, 0x87, 0xf8, 0x24, 0x00, 0x5d, 0xf8, 0x22, 0x40, + 0x20, 0x88, 0x20, 0xb1, 0x2e, 0x44, 0x01, 0x20, 0x00, 0x23, 0x86, 0xf8, + 0x24, 0x00, 0x52, 0x1c, 0x04, 0x2a, 0xee, 0xd3, 0x17, 0xe0, 0x01, 0x2a, + 0x14, 0xd1, 0x09, 0x98, 0x00, 0x22, 0x8e, 0x5c, 0xac, 0x19, 0x00, 0x27, + 0x84, 0xf8, 0x24, 0x70, 0x5d, 0xf8, 0x22, 0x40, 0x27, 0x88, 0x87, 0x42, + 0x04, 0xd2, 0x2e, 0x44, 0x01, 0x24, 0x00, 0x23, 0x86, 0xf8, 0x24, 0x40, + 0x52, 0x1c, 0x04, 0x2a, 0xed, 0xd3, 0x00, 0xe0, 0x00, 0x23, 0x18, 0x46, + 0x04, 0xb0, 0xf0, 0xbd, 0x2d, 0xe9, 0xf0, 0x4f, 0x85, 0xb0, 0x81, 0x46, + 0x58, 0x88, 0x0e, 0x9c, 0x8a, 0x46, 0x41, 0x1e, 0x93, 0x46, 0xad, 0xf8, + 0x08, 0x10, 0x6f, 0xf0, 0x02, 0x08, 0x00, 0x27, 0x02, 0xe0, 0x08, 0xbf, + 0x4f, 0xf0, 0x03, 0x08, 0x00, 0x25, 0x36, 0x4a, 0x02, 0xeb, 0x8b, 0x00, + 0xe9, 0xb2, 0x6d, 0x1c, 0x46, 0x5c, 0x06, 0xeb, 0x0a, 0x16, 0xf1, 0xb2, + 0x48, 0x46, 0xe8, 0xf7, 0x0b, 0xfc, 0x00, 0x22, 0x41, 0x46, 0xff, 0xf7, + 0x90, 0xff, 0x8d, 0xf8, 0x00, 0x00, 0x6a, 0x46, 0xf1, 0xb2, 0x48, 0x46, + 0xe8, 0xf7, 0x29, 0xfc, 0xe8, 0xb2, 0x04, 0x28, 0xe5, 0xd3, 0xff, 0xf7, + 0xee, 0xfe, 0x48, 0x46, 0xe8, 0xf7, 0x15, 0xfc, 0x03, 0xa9, 0x48, 0x46, + 0xe8, 0xf7, 0xee, 0xfd, 0x0f, 0x98, 0xbd, 0xf8, 0x08, 0x10, 0x01, 0x90, + 0x00, 0x91, 0x03, 0xab, 0xfa, 0xb2, 0x59, 0x46, 0x50, 0x46, 0xff, 0xf7, + 0x80, 0xff, 0xf9, 0xb2, 0x7f, 0x1c, 0x60, 0x54, 0xf8, 0xb2, 0x01, 0x28, + 0xc7, 0xd9, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x2d, 0xe9, 0xf8, 0x4f, + 0x52, 0x88, 0x0a, 0x9f, 0x0b, 0x9c, 0x55, 0x1e, 0x6f, 0xf0, 0x02, 0x0a, + 0x00, 0x26, 0x80, 0x46, 0x89, 0x46, 0x9b, 0x46, 0x02, 0xe0, 0x08, 0xbf, + 0x4f, 0xf0, 0x03, 0x0a, 0x01, 0x22, 0x51, 0x46, 0x58, 0x46, 0xff, 0xf7, + 0x54, 0xff, 0xc0, 0xf1, 0x20, 0x03, 0x02, 0x46, 0xdb, 0xb2, 0x49, 0x46, + 0x40, 0x46, 0xe8, 0xf7, 0xee, 0xfb, 0xff, 0xf7, 0xb4, 0xfe, 0x40, 0x46, + 0xe8, 0xf7, 0xdb, 0xfb, 0x00, 0x21, 0x40, 0x46, 0xe8, 0xf7, 0xb2, 0xfd, + 0x02, 0x46, 0x00, 0x94, 0xab, 0xb2, 0xf1, 0xb2, 0x48, 0x46, 0x00, 0xf0, + 0x0b, 0xf8, 0xf1, 0xb2, 0x76, 0x1c, 0x78, 0x54, 0xf0, 0xb2, 0x01, 0x28, + 0xd9, 0xd9, 0xbd, 0xe8, 0xf1, 0x8f, 0x00, 0x00, 0x70, 0x40, 0x00, 0x20, + 0x30, 0xb5, 0x03, 0x9d, 0x04, 0x46, 0x2c, 0x44, 0x01, 0x20, 0x44, 0x34, + 0x0d, 0x00, 0x06, 0xd1, 0x1a, 0xb1, 0x01, 0x21, 0x00, 0x20, 0x21, 0x70, + 0x30, 0xbd, 0x22, 0x70, 0x30, 0xbd, 0x01, 0x29, 0x07, 0xd1, 0x9a, 0x42, + 0x02, 0xd2, 0x00, 0x20, 0xa1, 0x70, 0x30, 0xbd, 0x00, 0x22, 0xa2, 0x70, + 0x30, 0xbd, 0x00, 0x20, 0x30, 0xbd, 0x70, 0x47, 0x2d, 0xe9, 0xfc, 0x47, + 0xdd, 0xf8, 0x2c, 0x80, 0x0c, 0x46, 0x92, 0x46, 0x1d, 0x46, 0x81, 0x46, + 0x01, 0x23, 0x01, 0x22, 0x08, 0xf1, 0x48, 0x01, 0xff, 0xf7, 0xc2, 0xfd, + 0x01, 0x2d, 0x06, 0xd0, 0x00, 0x23, 0x01, 0x22, 0x51, 0x46, 0x48, 0x46, + 0xe8, 0xf7, 0x3a, 0xfb, 0x03, 0xe0, 0x00, 0x21, 0x48, 0x46, 0xe8, 0xf7, + 0xca, 0xfd, 0x0e, 0x9e, 0x0c, 0x9a, 0x51, 0x46, 0x48, 0x46, 0xe8, 0xf7, + 0xc2, 0xfd, 0x21, 0x46, 0x48, 0x46, 0x00, 0xf0, 0x77, 0xf8, 0x00, 0xf0, + 0x5b, 0xf8, 0x00, 0xf0, 0x63, 0xf8, 0x00, 0xf0, 0x6c, 0xf8, 0x00, 0x23, + 0x00, 0xf0, 0x64, 0xf8, 0x00, 0xf0, 0x57, 0xf8, 0x10, 0x21, 0x48, 0x46, + 0xe8, 0xf7, 0x91, 0xfd, 0x01, 0x20, 0x36, 0x01, 0xdb, 0xf7, 0xc6, 0xfe, + 0x10, 0x36, 0x10, 0x24, 0x00, 0x25, 0x76, 0xb2, 0x00, 0x27, 0x1c, 0xe0, + 0x9c, 0xb1, 0x64, 0x1e, 0x10, 0xe0, 0x48, 0x46, 0xe8, 0xf7, 0x65, 0xfb, + 0x6b, 0x46, 0x01, 0xaa, 0x00, 0x21, 0x48, 0x46, 0xe8, 0xf7, 0x2e, 0xfb, + 0x01, 0x98, 0x00, 0x99, 0xb0, 0xeb, 0x51, 0x0f, 0x38, 0xbf, 0x1f, 0x2c, + 0xec, 0xd2, 0x64, 0x1c, 0xe4, 0xb2, 0xe1, 0xb2, 0x48, 0x46, 0xe8, 0xf7, + 0x6e, 0xfd, 0x10, 0x2f, 0xa8, 0xbf, 0x65, 0x19, 0x7f, 0x1c, 0xb7, 0x42, + 0xe3, 0xdb, 0xa6, 0xf1, 0x10, 0x00, 0x00, 0xeb, 0xd0, 0x70, 0xc0, 0x03, + 0x00, 0x0c, 0xa6, 0xf1, 0x10, 0x01, 0x10, 0xfa, 0x85, 0xf0, 0xc9, 0xb2, + 0x90, 0xfb, 0xf1, 0xf1, 0xc9, 0xb2, 0x48, 0x46, 0xe8, 0xf7, 0x57, 0xfd, + 0x48, 0x46, 0xe8, 0xf7, 0x64, 0xfd, 0x88, 0xf8, 0x72, 0x00, 0x01, 0x23, + 0x01, 0x22, 0x08, 0xf1, 0x48, 0x01, 0x48, 0x46, 0xff, 0xf7, 0x8b, 0xfd, + 0x01, 0x22, 0x51, 0x46, 0x48, 0x46, 0xe8, 0xf7, 0xd3, 0xfa, 0x00, 0x20, + 0xbd, 0xe8, 0xf6, 0x87, 0x0e, 0x22, 0x00, 0x21, 0x48, 0x46, 0xe8, 0xf7, + 0x09, 0xbd, 0x00, 0x22, 0x08, 0x21, 0x48, 0x46, 0xe8, 0xf7, 0xfe, 0xbc, + 0x00, 0x23, 0x00, 0x22, 0x02, 0x21, 0x48, 0x46, 0xe8, 0xf7, 0x0f, 0xbd, + 0x01, 0x22, 0x1f, 0x21, 0x48, 0x46, 0xe8, 0xf7, 0xfe, 0xba, 0x01, 0x22, + 0xfd, 0x21, 0x48, 0x46, 0xe8, 0xf7, 0xf4, 0xbc, 0x38, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0xe8, 0xf7, 0xe1, 0xfc, 0x69, 0x88, 0x20, 0x46, 0xe8, 0xf7, + 0x00, 0xfd, 0xa9, 0x88, 0x20, 0x46, 0xbd, 0xe8, 0x34, 0x40, 0xe8, 0xf7, + 0xfc, 0xbc, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x38, 0xb5, + 0x04, 0x46, 0x0d, 0x46, 0x28, 0x46, 0x00, 0xf0, 0x06, 0xf8, 0x29, 0x78, + 0x20, 0x46, 0xbd, 0xe8, 0x34, 0x40, 0xe8, 0xf7, 0x53, 0xbc, 0x01, 0x7a, + 0x42, 0x7a, 0x22, 0xb9, 0x00, 0x29, 0x14, 0xbf, 0x55, 0x21, 0x50, 0x21, + 0x03, 0xe0, 0x00, 0x29, 0x0c, 0xbf, 0xa0, 0x21, 0xaa, 0x21, 0x01, 0x70, + 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x43, 0x04, 0x46, 0x0d, 0x46, 0x90, 0x46, + 0x99, 0x46, 0x00, 0x26, 0x00, 0x27, 0x06, 0xe0, 0x42, 0x46, 0x29, 0x46, + 0x20, 0x46, 0x00, 0xf0, 0x0b, 0xf8, 0x36, 0x18, 0x7f, 0x1c, 0xf8, 0xb2, + 0x48, 0x45, 0xf5, 0xd3, 0xb6, 0xb2, 0x96, 0xfb, 0xf9, 0xf0, 0xc0, 0xb2, + 0xbd, 0xe8, 0xf2, 0x83, 0x2d, 0xe9, 0xf8, 0x4f, 0x0d, 0x46, 0x88, 0xb0, + 0x80, 0x46, 0x28, 0x78, 0x16, 0x46, 0xc2, 0x09, 0x04, 0xd0, 0x00, 0x21, + 0x40, 0x46, 0xe8, 0xf7, 0x26, 0xfb, 0x0c, 0xe0, 0xc0, 0xf3, 0x80, 0x11, + 0x19, 0xb1, 0x40, 0x46, 0xe8, 0xf7, 0x1f, 0xfb, 0x0c, 0xe0, 0xc0, 0xf3, + 0x40, 0x10, 0x28, 0xb1, 0x40, 0x46, 0xe8, 0xf7, 0x2f, 0xfb, 0x82, 0x46, + 0x00, 0x21, 0x05, 0xe0, 0x01, 0x21, 0x40, 0x46, 0xe8, 0xf7, 0x28, 0xfb, + 0x82, 0x46, 0x01, 0x21, 0x40, 0x46, 0xe8, 0xf7, 0x44, 0xfb, 0x81, 0x46, + 0xe8, 0x88, 0xad, 0xf8, 0x18, 0x00, 0x06, 0xa8, 0xa9, 0x88, 0xad, 0xf8, + 0x1a, 0x10, 0x8d, 0xf8, 0x1c, 0x80, 0xe8, 0xf7, 0x43, 0xfa, 0x00, 0x24, + 0x8d, 0xf8, 0x09, 0x80, 0x8d, 0xf8, 0x04, 0x40, 0x8d, 0xf8, 0x06, 0x40, + 0x06, 0x22, 0x8d, 0xf8, 0x07, 0x20, 0x01, 0x22, 0xa9, 0x7a, 0x68, 0x7a, + 0x49, 0x00, 0xc1, 0xf1, 0x03, 0x01, 0x09, 0x1a, 0x8a, 0x40, 0x8d, 0xf8, + 0x05, 0x20, 0x01, 0x2e, 0xe8, 0x7a, 0x05, 0xd1, 0x01, 0x28, 0x1a, 0xbf, + 0x03, 0x28, 0xe4, 0x20, 0xe5, 0x20, 0x04, 0xe0, 0x01, 0x28, 0x16, 0xbf, + 0x03, 0x28, 0xe1, 0x20, 0xe0, 0x20, 0x8d, 0xf8, 0x08, 0x00, 0x00, 0x27, + 0x01, 0xa8, 0xe8, 0xf7, 0x27, 0xfa, 0x8d, 0xf8, 0x17, 0x80, 0x68, 0x7a, + 0x8d, 0xf8, 0x16, 0x00, 0x2f, 0xe0, 0xa8, 0x7a, 0x28, 0xb9, 0x6a, 0x7a, + 0x4f, 0xfa, 0x8b, 0xf1, 0x40, 0x46, 0xe8, 0xf7, 0xa7, 0xfa, 0xa8, 0x7a, + 0x01, 0x28, 0x32, 0xd1, 0x6a, 0x7a, 0x4f, 0xfa, 0x8b, 0xf1, 0x40, 0x46, + 0xe8, 0xf7, 0xcf, 0xfa, 0x2b, 0xe0, 0x00, 0x28, 0x14, 0xbf, 0x02, 0x28, + 0x14, 0x46, 0x01, 0x28, 0x18, 0xbf, 0x03, 0x28, 0x0d, 0xd1, 0x64, 0x1c, + 0x0a, 0xe0, 0x01, 0x2e, 0xf3, 0xd1, 0x00, 0x28, 0x14, 0xbf, 0x02, 0x28, + 0x1c, 0x46, 0x01, 0x28, 0x18, 0xbf, 0x03, 0x28, 0x01, 0xd1, 0x64, 0x1e, + 0x64, 0xb2, 0xa4, 0xeb, 0x09, 0x00, 0x3f, 0x28, 0x18, 0xbf, 0x10, 0xf1, + 0x3f, 0x0f, 0x42, 0xd0, 0x7f, 0x1c, 0x69, 0x88, 0xb8, 0xb2, 0x88, 0x42, + 0x3d, 0xd2, 0xe8, 0x7a, 0x02, 0x28, 0xa4, 0xeb, 0x09, 0x0b, 0xc6, 0xd2, + 0x8d, 0xf8, 0x10, 0xb0, 0x04, 0xa8, 0xe8, 0xf7, 0xb9, 0xfa, 0x40, 0x46, + 0xe8, 0xf7, 0x25, 0xfc, 0x40, 0x46, 0xe8, 0xf7, 0x22, 0xfa, 0x03, 0xab, + 0x6a, 0x46, 0x00, 0x21, 0x40, 0x46, 0xe8, 0xf7, 0xeb, 0xf9, 0x00, 0x99, + 0xe8, 0x7a, 0x62, 0x1e, 0x63, 0x1c, 0x00, 0x29, 0x52, 0xb2, 0x5b, 0xb2, + 0xc9, 0xd0, 0x01, 0x2e, 0x0e, 0xd1, 0x00, 0x28, 0x18, 0xbf, 0x02, 0x28, + 0x02, 0xd1, 0x00, 0x2c, 0xc8, 0xbf, 0x14, 0x46, 0x01, 0x28, 0x18, 0xbf, + 0x03, 0x28, 0x12, 0xd1, 0x00, 0x2c, 0x10, 0xd5, 0x64, 0x1c, 0x0d, 0xe0, + 0x00, 0x28, 0x18, 0xbf, 0x02, 0x28, 0x02, 0xd1, 0x00, 0x2c, 0x48, 0xbf, + 0x1c, 0x46, 0x01, 0x28, 0x18, 0xbf, 0x03, 0x28, 0x03, 0xd1, 0x00, 0x2c, + 0x01, 0xdd, 0x64, 0x1e, 0x64, 0xb2, 0xe8, 0x7a, 0x02, 0x28, 0x05, 0xd2, + 0x8d, 0xf8, 0x10, 0xa0, 0x04, 0xa8, 0xe8, 0xf7, 0x7d, 0xfa, 0x03, 0xe0, + 0x51, 0x46, 0x40, 0x46, 0xdb, 0xf7, 0xae, 0xfd, 0x20, 0x46, 0xdb, 0xf7, + 0x9b, 0xfc, 0x09, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x2d, 0xe9, 0xfc, 0x47, + 0x14, 0x46, 0xdd, 0xf8, 0x28, 0xa0, 0x00, 0x25, 0x81, 0x46, 0x1f, 0x46, + 0xe5, 0x72, 0x4f, 0xfa, 0x81, 0xf8, 0x00, 0x21, 0x8d, 0xf8, 0x00, 0x10, + 0xe0, 0x7a, 0x02, 0x28, 0x06, 0x46, 0x04, 0xd2, 0x61, 0x7a, 0x01, 0x22, + 0x48, 0x46, 0xee, 0xf7, 0x85, 0xf9, 0x01, 0x23, 0x01, 0x22, 0x21, 0x46, + 0x48, 0x46, 0xff, 0xf7, 0xe4, 0xfe, 0x8d, 0xf8, 0x00, 0x00, 0x01, 0x23, + 0x9d, 0xf8, 0x00, 0x00, 0xb8, 0x55, 0x00, 0x22, 0x21, 0x46, 0x48, 0x46, + 0xff, 0xf7, 0xd9, 0xfe, 0x8d, 0xf8, 0x00, 0x00, 0x9d, 0xf9, 0x00, 0x00, + 0x40, 0x42, 0x0a, 0xf8, 0x06, 0x00, 0xe1, 0x7a, 0x02, 0x29, 0x04, 0xd2, + 0x61, 0x7a, 0x00, 0x22, 0x48, 0x46, 0xee, 0xf7, 0x65, 0xf9, 0x9d, 0xf9, + 0x00, 0x00, 0x40, 0x45, 0xe0, 0x7a, 0xbe, 0xbf, 0xb9, 0x57, 0x41, 0x45, + 0x01, 0x25, 0x40, 0x1c, 0xe0, 0x72, 0xc0, 0xb2, 0x04, 0x28, 0xc6, 0xd3, + 0x28, 0x46, 0xbd, 0xe8, 0xf6, 0x87, 0xf8, 0xb5, 0x04, 0x46, 0x0d, 0x46, + 0x16, 0x46, 0xe8, 0xf7, 0xa5, 0xfa, 0x00, 0x27, 0x0e, 0xe0, 0x01, 0x21, + 0x20, 0x46, 0xe8, 0xf7, 0xf7, 0xfa, 0x05, 0xe0, 0x30, 0x00, 0xf8, 0xd0, + 0x01, 0x21, 0x20, 0x46, 0xe8, 0xf7, 0xee, 0xfa, 0x20, 0x46, 0xe8, 0xf7, + 0x84, 0xfb, 0x7f, 0x1c, 0x78, 0xb2, 0xa8, 0x42, 0xf2, 0xdb, 0xf1, 0xbd, + 0x2d, 0xe9, 0xf2, 0x4f, 0x2d, 0xed, 0x02, 0x8b, 0x84, 0xb0, 0x83, 0x46, + 0x00, 0x20, 0x8d, 0xf8, 0x0c, 0x00, 0x81, 0x46, 0x00, 0x25, 0xb5, 0xee, + 0x00, 0x8a, 0xaa, 0x46, 0xc5, 0xf1, 0x10, 0x06, 0x06, 0xe0, 0x11, 0x28, + 0xf9, 0xd3, 0x4f, 0xf0, 0x01, 0x09, 0x2e, 0x46, 0xa5, 0xf1, 0x10, 0x0a, + 0x00, 0x27, 0xb8, 0x46, 0x04, 0x24, 0x04, 0x20, 0x02, 0x90, 0x01, 0x23, + 0x02, 0x20, 0x01, 0x90, 0x4a, 0x46, 0x03, 0xa8, 0x00, 0x90, 0x5f, 0xfa, + 0x8a, 0xf1, 0x58, 0x46, 0xfb, 0xf7, 0x97, 0xfb, 0x9d, 0xf9, 0x0c, 0x10, + 0x3f, 0x18, 0x64, 0x1e, 0x88, 0x44, 0xec, 0xd1, 0x0f, 0xfa, 0x88, 0xf8, + 0x00, 0xee, 0x10, 0x8a, 0xb8, 0xee, 0xc0, 0x0a, 0xf6, 0xee, 0x00, 0x0a, + 0x40, 0xee, 0x08, 0x0a, 0x06, 0x99, 0xf6, 0xb2, 0xbd, 0xee, 0xe0, 0x0a, + 0x3f, 0xb2, 0x10, 0xee, 0x10, 0x0a, 0x01, 0xee, 0x10, 0x7a, 0x88, 0x55, + 0xb8, 0xee, 0xc1, 0x1a, 0xf6, 0xee, 0x00, 0x1a, 0x41, 0xee, 0x08, 0x1a, + 0x06, 0x99, 0xfd, 0xee, 0xe1, 0x1a, 0x11, 0xee, 0x90, 0x0a, 0x5f, 0xea, + 0x09, 0x02, 0x01, 0xeb, 0x46, 0x02, 0x08, 0xbf, 0x40, 0x42, 0x50, 0x84, + 0x6d, 0x1c, 0xe8, 0xb2, 0x21, 0x28, 0xb8, 0xd3, 0x58, 0x46, 0xe8, 0xf7, + 0x35, 0xfa, 0x04, 0xb0, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf1, 0x8f, + 0x2d, 0xe9, 0xf4, 0x4f, 0x84, 0xb0, 0x82, 0x46, 0x0f, 0x46, 0x99, 0x46, + 0xe8, 0xf7, 0x27, 0xfb, 0x8d, 0xf8, 0x04, 0x00, 0x39, 0x46, 0x10, 0xf0, + 0x0f, 0x00, 0x18, 0xbf, 0x01, 0x20, 0x38, 0x72, 0x4f, 0xf0, 0x00, 0x08, + 0x50, 0x46, 0xff, 0xf7, 0x10, 0xfe, 0x00, 0x25, 0x00, 0x24, 0x01, 0x2d, + 0x88, 0xf0, 0x01, 0x08, 0x39, 0xd1, 0x01, 0x24, 0x66, 0xb2, 0x76, 0x42, + 0x4f, 0xfa, 0x86, 0xfb, 0x09, 0xeb, 0x0b, 0x00, 0x5f, 0xfa, 0x88, 0xf2, + 0x90, 0xf9, 0x18, 0x11, 0x50, 0x46, 0xff, 0xf7, 0x5c, 0xff, 0x50, 0x46, + 0xe8, 0xf7, 0xf3, 0xfa, 0x7e, 0x70, 0x02, 0xa9, 0x00, 0x91, 0x03, 0xab, + 0x9d, 0xf8, 0x10, 0x10, 0x3a, 0x46, 0x50, 0x46, 0xff, 0xf7, 0x08, 0xff, + 0x79, 0x7a, 0x01, 0x29, 0x04, 0xbf, 0x76, 0x42, 0x4f, 0xfa, 0x86, 0xfb, + 0x00, 0x21, 0x0d, 0xf1, 0x0c, 0x0c, 0x42, 0x23, 0x09, 0xeb, 0x4b, 0x02, + 0x4b, 0x43, 0x13, 0x44, 0x03, 0xf1, 0x20, 0x02, 0x1c, 0xf8, 0x01, 0x30, + 0x13, 0x70, 0x02, 0xab, 0x5e, 0x5c, 0x56, 0x70, 0x49, 0x1c, 0x04, 0x29, + 0xef, 0xdb, 0x01, 0x28, 0x07, 0xd0, 0x64, 0x1c, 0x60, 0xb2, 0x11, 0x28, + 0x03, 0xda, 0x00, 0x2d, 0xc4, 0xd1, 0x26, 0x46, 0xc4, 0xe7, 0x50, 0x46, + 0xe8, 0xf7, 0xd4, 0xf9, 0x6d, 0x1c, 0x01, 0x2d, 0xb6, 0xdd, 0x9d, 0xf8, + 0x04, 0x10, 0x50, 0x46, 0xe8, 0xf7, 0x20, 0xfa, 0x05, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0x7f, 0xb5, 0x04, 0x46, 0x10, 0x88, 0xad, 0xf8, 0x02, 0x00, + 0x0d, 0x46, 0x50, 0x88, 0xad, 0xf8, 0x04, 0x00, 0x1e, 0x46, 0x91, 0x88, + 0xad, 0xf8, 0x06, 0x10, 0x06, 0xf5, 0x84, 0x71, 0x2a, 0x78, 0x8d, 0xf8, + 0x09, 0x20, 0x20, 0x46, 0x6a, 0x78, 0x8d, 0xf8, 0x0a, 0x20, 0xff, 0xf7, + 0x21, 0xff, 0xaa, 0x78, 0x33, 0x46, 0x69, 0x46, 0x20, 0x46, 0xff, 0xf7, + 0x7b, 0xff, 0x7f, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, 0x07, 0x46, 0x08, 0x98, + 0xdf, 0xf8, 0x58, 0x99, 0x6f, 0xf0, 0x00, 0x48, 0x4f, 0xf0, 0x00, 0x0c, + 0x00, 0x26, 0xf4, 0xb2, 0x0a, 0x25, 0x09, 0xeb, 0x4c, 0x0e, 0x15, 0xfb, + 0x04, 0xf4, 0xa6, 0x44, 0x00, 0x24, 0xd5, 0x07, 0x04, 0xd5, 0x9e, 0xf8, + 0x00, 0x50, 0xec, 0x1b, 0x48, 0xbf, 0x64, 0x42, 0x95, 0x07, 0x07, 0xd5, + 0x9e, 0xf8, 0x01, 0x50, 0xb5, 0xeb, 0x01, 0x0e, 0x48, 0xbf, 0xce, 0xf1, + 0x00, 0x0e, 0x74, 0x44, 0xa0, 0x45, 0x03, 0xdb, 0x1e, 0x70, 0xa0, 0x46, + 0x80, 0xf8, 0x00, 0xc0, 0x76, 0x1c, 0xf4, 0xb2, 0x07, 0x2c, 0xdc, 0xd3, + 0x0c, 0xf1, 0x01, 0x0c, 0xbc, 0xf1, 0x05, 0x0f, 0xd6, 0xd3, 0x40, 0x46, + 0xbd, 0xe8, 0xf2, 0x83, 0xfe, 0xb5, 0x04, 0x46, 0x01, 0x25, 0x01, 0x26, + 0x01, 0xaf, 0x00, 0x97, 0x0d, 0xf1, 0x05, 0x03, 0x22, 0x46, 0xf1, 0xb2, + 0xe8, 0xb2, 0xff, 0xf7, 0xbd, 0xff, 0xdf, 0xf8, 0xe0, 0x78, 0x2a, 0x06, + 0x07, 0xeb, 0x12, 0x51, 0xf2, 0xb2, 0x01, 0xeb, 0x42, 0x03, 0x9d, 0xf8, + 0x04, 0x10, 0x9d, 0xf8, 0x05, 0x20, 0x76, 0x1c, 0x01, 0xeb, 0x02, 0x17, + 0x07, 0xeb, 0x00, 0x27, 0xf0, 0xb2, 0x09, 0x28, 0x23, 0xf8, 0x12, 0x7c, + 0xe0, 0xd3, 0x6d, 0x1c, 0xe9, 0xb2, 0x11, 0x29, 0xdb, 0xd3, 0xf7, 0xbd, + 0x2d, 0xe9, 0xf0, 0x41, 0xdf, 0xf8, 0xa8, 0x68, 0x80, 0x46, 0x30, 0x78, + 0x17, 0x46, 0xb8, 0x42, 0x0d, 0x46, 0x1c, 0x46, 0x03, 0xd0, 0x38, 0x46, + 0xff, 0xf7, 0xca, 0xff, 0x37, 0x70, 0xdf, 0xf8, 0x8c, 0x08, 0x00, 0xeb, + 0x08, 0x11, 0x01, 0xeb, 0x45, 0x02, 0x32, 0xf8, 0x12, 0x0c, 0x14, 0xb1, + 0xc0, 0xf3, 0x03, 0x11, 0x21, 0x70, 0x06, 0x99, 0x11, 0xb1, 0x00, 0xf0, + 0x0f, 0x02, 0x0a, 0x70, 0x00, 0x0a, 0xbd, 0xe8, 0xf0, 0x81, 0x2d, 0xe9, + 0xf3, 0x4f, 0x8f, 0xb0, 0x80, 0x6b, 0x15, 0x46, 0x00, 0xf5, 0xb6, 0x71, + 0x0f, 0x9a, 0x05, 0x91, 0x00, 0xf5, 0x94, 0x70, 0xd1, 0x6b, 0x04, 0x90, + 0x01, 0xf2, 0x2c, 0x54, 0x01, 0xf5, 0x3e, 0x7b, 0x00, 0xf1, 0x2b, 0x01, + 0x9a, 0x46, 0x0a, 0x22, 0x09, 0xa8, 0xdb, 0xf7, 0x7d, 0xff, 0x0f, 0x98, + 0x01, 0x22, 0x00, 0x26, 0x8d, 0xf8, 0x27, 0x20, 0x24, 0x34, 0x47, 0x68, + 0x5f, 0xea, 0x0a, 0x01, 0x15, 0xd0, 0x01, 0xa8, 0x00, 0x90, 0x0d, 0xf1, + 0x05, 0x03, 0x10, 0x98, 0x29, 0x78, 0x00, 0x78, 0x52, 0x46, 0xff, 0xf7, + 0xb1, 0xff, 0x9d, 0xf8, 0x05, 0x00, 0xa0, 0x70, 0x9d, 0xf8, 0x04, 0x10, + 0xe1, 0x70, 0x9d, 0xf8, 0x05, 0x00, 0x20, 0x70, 0x9d, 0xf8, 0x04, 0x10, + 0x61, 0x70, 0x0a, 0x21, 0x23, 0x78, 0xdf, 0xf8, 0xec, 0x27, 0x94, 0xf8, + 0x01, 0xa0, 0x1a, 0x98, 0x4b, 0x43, 0x13, 0x44, 0x03, 0xeb, 0x4a, 0x03, + 0x93, 0xf8, 0x00, 0xe0, 0xcd, 0xf8, 0x0c, 0xe0, 0x93, 0xf8, 0x01, 0x80, + 0xa3, 0x78, 0x11, 0xfb, 0x03, 0xf1, 0x11, 0x44, 0xe2, 0x78, 0x10, 0x9b, + 0x01, 0xeb, 0x42, 0x01, 0x0a, 0x78, 0x0d, 0x92, 0x91, 0xf8, 0x01, 0x90, + 0x1a, 0x70, 0x49, 0x78, 0x29, 0x70, 0xb0, 0xb9, 0x10, 0x98, 0x01, 0x78, + 0x8d, 0xf8, 0x1e, 0x10, 0x06, 0xa9, 0x2a, 0x78, 0x8d, 0xf8, 0x1f, 0x20, + 0xf8, 0xb2, 0xe8, 0xf7, 0xdd, 0xf8, 0x06, 0xa9, 0xf8, 0xb2, 0xe8, 0xf7, + 0xde, 0xf8, 0x30, 0x46, 0x11, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x0c, 0x9d, + 0x05, 0x94, 0xcd, 0xf8, 0x10, 0xa0, 0x03, 0x98, 0x0d, 0x99, 0x40, 0x1a, + 0x40, 0xb2, 0xdb, 0xf7, 0x59, 0xfa, 0x00, 0x28, 0xef, 0xd0, 0x10, 0x99, + 0x03, 0x98, 0x91, 0xf9, 0x00, 0x20, 0x12, 0x1a, 0x52, 0xb2, 0x01, 0x2a, + 0xac, 0xbf, 0x01, 0x21, 0x4f, 0xf0, 0xff, 0x31, 0x50, 0xfa, 0x81, 0xf0, + 0x03, 0x90, 0x0f, 0x98, 0x00, 0xf0, 0x76, 0xf8, 0x04, 0x46, 0x03, 0x98, + 0x8d, 0xf8, 0x1e, 0x00, 0x00, 0xf0, 0x6b, 0xf8, 0x82, 0x46, 0x06, 0xa9, + 0xf8, 0xb2, 0xe8, 0xf7, 0xad, 0xf8, 0x00, 0xf0, 0x64, 0xf8, 0x4a, 0xea, + 0x04, 0x04, 0x20, 0x43, 0x06, 0x43, 0x05, 0x98, 0x81, 0x7e, 0xc8, 0x07, + 0x13, 0xd5, 0x00, 0xf0, 0x5a, 0xf8, 0x04, 0x46, 0x01, 0x21, 0x06, 0x20, + 0x01, 0x91, 0x0b, 0xf5, 0xd0, 0x72, 0x02, 0x90, 0x00, 0x92, 0x5b, 0x46, + 0x04, 0x99, 0x09, 0xaa, 0xf8, 0xb2, 0x02, 0xf0, 0x55, 0xf9, 0x00, 0xf0, + 0x4a, 0xf8, 0x04, 0x43, 0x26, 0x43, 0x0c, 0x95, 0x05, 0x9c, 0xdd, 0xf8, + 0x10, 0xa0, 0x2e, 0xe0, 0xa0, 0x7a, 0x42, 0x07, 0x58, 0xfa, 0x81, 0xf8, + 0x05, 0xd5, 0x49, 0x42, 0x0f, 0x98, 0x49, 0xb2, 0x00, 0xf0, 0x3e, 0xf8, + 0x06, 0x43, 0x8d, 0xf8, 0x1f, 0x80, 0x00, 0xf0, 0x34, 0xf8, 0x05, 0x46, + 0x06, 0xa9, 0xf8, 0xb2, 0xe8, 0xf7, 0x7b, 0xf8, 0x00, 0xf0, 0x2d, 0xf8, + 0x05, 0x43, 0xa0, 0x7e, 0x2e, 0x43, 0x81, 0x07, 0x13, 0xd5, 0x00, 0xf0, + 0x26, 0xf8, 0x05, 0x46, 0x06, 0x20, 0x01, 0x21, 0x0b, 0xf5, 0xd0, 0x72, + 0x02, 0x90, 0x01, 0x91, 0x00, 0x92, 0x5b, 0x46, 0x09, 0xaa, 0x51, 0x46, + 0xf8, 0xb2, 0x02, 0xf0, 0x21, 0xf9, 0x00, 0xf0, 0x16, 0xf8, 0x05, 0x43, + 0x2e, 0x43, 0xa8, 0xeb, 0x09, 0x00, 0x40, 0xb2, 0xdb, 0xf7, 0xe4, 0xf9, + 0x00, 0x28, 0x3f, 0xf4, 0x7e, 0xaf, 0x0c, 0x98, 0x90, 0xf9, 0x00, 0x10, + 0xa1, 0xeb, 0x08, 0x01, 0x49, 0xb2, 0x01, 0x29, 0xac, 0xbf, 0x01, 0x21, + 0x4f, 0xf0, 0xff, 0x31, 0xbc, 0xe7, 0x00, 0x22, 0x02, 0x21, 0xf8, 0xb2, + 0xe8, 0xf7, 0xe4, 0xbb, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, + 0xd0, 0xb0, 0x42, 0x68, 0x8d, 0xf8, 0x08, 0x20, 0x00, 0x25, 0x82, 0x6b, + 0x02, 0xf5, 0xb6, 0x73, 0x02, 0xf5, 0x94, 0x74, 0x03, 0x93, 0x08, 0x94, + 0x4f, 0xf0, 0x01, 0x0a, 0xd2, 0xf8, 0x00, 0x01, 0x42, 0x03, 0x03, 0x98, + 0x80, 0x7a, 0x48, 0xbf, 0xaa, 0x46, 0x0d, 0xf1, 0x06, 0x0b, 0x00, 0x09, + 0x8d, 0xf8, 0x06, 0x00, 0x8b, 0xf8, 0x01, 0x00, 0xdf, 0xed, 0x6b, 0x0a, + 0x03, 0x98, 0xc2, 0x7a, 0x8d, 0xf8, 0x09, 0x10, 0x00, 0xee, 0x10, 0x2a, + 0xb8, 0xee, 0x40, 0x0a, 0x80, 0xee, 0x20, 0x8a, 0x00, 0x24, 0x4f, 0xf0, + 0x8c, 0x08, 0x09, 0xaa, 0x08, 0xfb, 0x04, 0xf3, 0xd6, 0x18, 0x8c, 0x21, + 0x30, 0x46, 0xee, 0xf7, 0xcb, 0xf9, 0x00, 0x96, 0x33, 0x46, 0x9d, 0xf8, + 0x08, 0x00, 0x00, 0x22, 0xe1, 0xb2, 0xed, 0xf7, 0x9e, 0xfc, 0x96, 0xf9, + 0x34, 0x90, 0x01, 0x21, 0xb0, 0xee, 0x48, 0x0a, 0x48, 0x46, 0xed, 0xf7, + 0x11, 0xfd, 0x01, 0xa9, 0x01, 0x27, 0x08, 0x55, 0xf0, 0x19, 0x01, 0x21, + 0x90, 0xf9, 0x0c, 0x00, 0xb0, 0xee, 0x48, 0x0a, 0xed, 0xf7, 0x06, 0xfd, + 0x04, 0xa9, 0x01, 0xeb, 0xc4, 0x02, 0xd0, 0x55, 0x7f, 0x1c, 0x08, 0x2f, + 0xf0, 0xd3, 0x08, 0x98, 0x90, 0xf9, 0x1a, 0x10, 0x49, 0x45, 0xbc, 0xbf, + 0x90, 0xf9, 0x1b, 0x30, 0x99, 0x45, 0x13, 0xda, 0x01, 0xa8, 0x10, 0xf8, + 0x04, 0xe0, 0x9d, 0xf8, 0x09, 0x00, 0x10, 0xfb, 0x0e, 0x9e, 0x4f, 0xfa, + 0x8e, 0xf0, 0x83, 0x42, 0xb8, 0xbf, 0xa3, 0xeb, 0x09, 0x00, 0x03, 0xdb, + 0x88, 0x42, 0x03, 0xda, 0xa9, 0xeb, 0x01, 0x00, 0x0b, 0xf8, 0x04, 0x00, + 0x64, 0x1c, 0x02, 0x2c, 0xb5, 0xd3, 0x9b, 0xf9, 0x01, 0x00, 0x9d, 0xf9, + 0x06, 0x10, 0x88, 0x42, 0xb4, 0xbf, 0x08, 0x91, 0x08, 0x90, 0x9d, 0xf9, + 0x09, 0x60, 0xab, 0x46, 0x25, 0xe0, 0x00, 0x2c, 0x64, 0xd0, 0x0a, 0x21, + 0x48, 0x46, 0xe7, 0xf7, 0x9e, 0xfe, 0x09, 0xa8, 0x08, 0xfb, 0x04, 0xf1, + 0x42, 0x18, 0xcd, 0xf8, 0x00, 0xa0, 0x13, 0x46, 0xe1, 0xb2, 0x48, 0x46, + 0xed, 0xf7, 0x77, 0xfc, 0x00, 0xf0, 0x62, 0xf8, 0x07, 0x46, 0x0f, 0x21, + 0x48, 0x46, 0xe7, 0xf7, 0x8c, 0xfe, 0x00, 0xf0, 0x5b, 0xf8, 0x07, 0x43, + 0x3d, 0x43, 0x64, 0x1c, 0x02, 0x2c, 0xe0, 0xd3, 0x8d, 0xf8, 0x08, 0x90, + 0x00, 0xf0, 0x52, 0xf8, 0x05, 0x43, 0x0b, 0xf1, 0x01, 0x0b, 0x08, 0x98, + 0x83, 0x45, 0x43, 0xda, 0x03, 0x99, 0x88, 0x7a, 0xc1, 0x07, 0x18, 0xd5, + 0x9d, 0xf9, 0x04, 0x00, 0x9d, 0xf8, 0x58, 0x10, 0x83, 0x45, 0xb4, 0xbf, + 0x9d, 0xf9, 0x09, 0x00, 0x00, 0x20, 0x40, 0x18, 0x8d, 0xf8, 0x58, 0x00, + 0x09, 0xa9, 0x9d, 0xf9, 0x05, 0x00, 0x91, 0xf8, 0xc0, 0x20, 0x83, 0x45, + 0xb4, 0xbf, 0x9d, 0xf9, 0x09, 0x00, 0x00, 0x20, 0x80, 0x18, 0x81, 0xf8, + 0xc0, 0x00, 0x03, 0x98, 0x81, 0x7a, 0x88, 0x07, 0x1a, 0xd5, 0x01, 0x20, + 0x00, 0x21, 0x04, 0xaa, 0x02, 0x44, 0x12, 0xf9, 0x31, 0x30, 0x9b, 0x45, + 0x0c, 0xda, 0x09, 0xaa, 0x02, 0x44, 0x08, 0xfb, 0x01, 0xf4, 0x22, 0x44, + 0x92, 0xf9, 0x0c, 0x30, 0x00, 0x2b, 0xcc, 0xbf, 0x34, 0x46, 0x74, 0x42, + 0xe3, 0x18, 0x13, 0x73, 0x49, 0x1c, 0x02, 0x29, 0xe9, 0xd3, 0x40, 0x1c, + 0x08, 0x28, 0xe5, 0xd3, 0x00, 0x24, 0x01, 0xe0, 0x8d, 0xf8, 0x08, 0x90, + 0x9d, 0xf8, 0x08, 0x90, 0x05, 0x21, 0x95, 0xe7, 0x50, 0xb0, 0x28, 0x46, + 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, 0x00, 0x00, 0x7a, 0x44, + 0x00, 0x22, 0x02, 0x21, 0x48, 0x46, 0xe8, 0xf7, 0xe5, 0xba, 0x00, 0x00, + 0x2d, 0xe9, 0xf3, 0x4f, 0x81, 0xb0, 0x00, 0x20, 0x2d, 0xed, 0x02, 0x8b, + 0x8c, 0xb0, 0x82, 0x46, 0x02, 0x90, 0x93, 0x46, 0x0f, 0x98, 0x41, 0x68, + 0x0f, 0x98, 0x8d, 0xf8, 0x05, 0x10, 0x99, 0x46, 0x0f, 0x99, 0x80, 0x6b, + 0xc9, 0x6b, 0x01, 0xf5, 0x3e, 0x72, 0x00, 0xf5, 0xb6, 0x75, 0x06, 0x92, + 0x01, 0xf2, 0x2c, 0x56, 0x01, 0xf5, 0xac, 0x71, 0x00, 0x24, 0x00, 0xf1, + 0x50, 0x03, 0x06, 0x98, 0x0a, 0x91, 0x00, 0xf5, 0xa7, 0x77, 0x04, 0x93, + 0x39, 0x57, 0x05, 0x91, 0xf1, 0x75, 0xb4, 0x75, 0x74, 0x75, 0x97, 0xf9, + 0x0c, 0x00, 0xdb, 0xf7, 0xa3, 0xf8, 0x80, 0x46, 0x97, 0xf9, 0x0b, 0x00, + 0xdb, 0xf7, 0x9e, 0xf8, 0x4f, 0xfa, 0x88, 0xf1, 0x42, 0xb2, 0x91, 0x42, + 0xb8, 0xbf, 0x42, 0x46, 0x06, 0xdb, 0x02, 0x46, 0x4f, 0xfa, 0x88, 0xf8, + 0x40, 0xb2, 0xb8, 0xbf, 0x80, 0x46, 0x40, 0x46, 0xeb, 0x79, 0xd9, 0x07, + 0x4c, 0xbf, 0x8d, 0xf8, 0x0c, 0x00, 0x8d, 0xf8, 0x0c, 0x20, 0x99, 0x07, + 0x4c, 0xbf, 0x8d, 0xf8, 0x07, 0x00, 0x8d, 0xf8, 0x07, 0x20, 0x9d, 0xf8, + 0x05, 0x00, 0xe7, 0xf7, 0xef, 0xfe, 0x80, 0x46, 0x9d, 0xf8, 0x05, 0x00, + 0xe7, 0xf7, 0xef, 0xfe, 0x8d, 0xf8, 0x04, 0x00, 0x9d, 0xf8, 0x05, 0x00, + 0xe7, 0xf7, 0xee, 0xfe, 0x8d, 0xf8, 0x06, 0x00, 0x86, 0xf8, 0x14, 0x80, + 0x9d, 0xf8, 0x04, 0x00, 0xb0, 0x70, 0x9d, 0xf8, 0x06, 0x10, 0xf1, 0x70, + 0x9d, 0xf8, 0x05, 0x00, 0xe7, 0xf7, 0xe8, 0xfe, 0xb0, 0x73, 0x9d, 0xf8, + 0x05, 0x00, 0xe7, 0xf7, 0xe5, 0xfe, 0xf0, 0x73, 0x97, 0xf9, 0x5f, 0x10, + 0x97, 0xf9, 0x5e, 0x00, 0x00, 0xee, 0x10, 0x1a, 0x00, 0x28, 0xb8, 0xee, + 0xc0, 0x0a, 0x0e, 0xbf, 0xdf, 0xed, 0x03, 0x0a, 0x00, 0xee, 0x90, 0x0a, + 0xf8, 0xee, 0xe0, 0x0a, 0x02, 0xe0, 0x00, 0xbf, 0x00, 0x00, 0x80, 0x00, + 0x06, 0xf1, 0x24, 0x07, 0x80, 0xee, 0x20, 0x8a, 0x87, 0xed, 0x01, 0x8a, + 0x02, 0xa9, 0x28, 0x7c, 0xdb, 0xf7, 0x40, 0xfa, 0xad, 0xf8, 0x0e, 0x00, + 0x06, 0xf1, 0x20, 0x01, 0xbd, 0xf8, 0x0e, 0x00, 0x30, 0x82, 0x00, 0x91, + 0x04, 0x98, 0xc3, 0x7a, 0x0f, 0x98, 0x81, 0x6b, 0xbd, 0xf9, 0x0e, 0x00, + 0x01, 0xf1, 0xee, 0x02, 0x64, 0x21, 0xdb, 0xf7, 0x29, 0xfb, 0x04, 0x98, + 0x06, 0xf1, 0x22, 0x01, 0x00, 0x91, 0x90, 0xf8, 0x32, 0x30, 0x0f, 0x98, + 0x81, 0x6b, 0xbd, 0xf9, 0x0e, 0x00, 0x01, 0xf1, 0xf4, 0x02, 0x64, 0x21, + 0xdb, 0xf7, 0x1a, 0xfb, 0xb6, 0xf9, 0x20, 0x00, 0xb6, 0xf9, 0x22, 0x10, + 0x00, 0xee, 0x10, 0x0a, 0x0a, 0x98, 0xb8, 0xee, 0xc0, 0x0a, 0xdf, 0xed, + 0xbb, 0x0a, 0x01, 0xee, 0x10, 0x1a, 0x10, 0xf8, 0xc6, 0x1f, 0x01, 0x29, + 0x80, 0xee, 0x20, 0x0a, 0xb8, 0xee, 0xc1, 0x1a, 0xdf, 0xed, 0xb5, 0x1a, + 0x18, 0xbf, 0x02, 0x29, 0xc1, 0xee, 0x21, 0x0a, 0x04, 0xd1, 0x40, 0x78, + 0x41, 0x1e, 0x89, 0x41, 0xc9, 0x0f, 0x00, 0xe0, 0x00, 0x21, 0x1a, 0x98, + 0xfa, 0x78, 0xbb, 0x78, 0x7a, 0x70, 0x3b, 0x70, 0x00, 0xb1, 0x01, 0x21, + 0x1b, 0x98, 0x00, 0x28, 0x14, 0xbf, 0x6a, 0x7a, 0xea, 0x78, 0x10, 0x00, + 0x08, 0xbf, 0x01, 0x22, 0x5f, 0xea, 0x09, 0x00, 0x14, 0xbf, 0x00, 0x94, + 0xcd, 0xf8, 0x00, 0xb0, 0x5f, 0xea, 0x89, 0x70, 0x4e, 0xbf, 0x04, 0x94, + 0x9d, 0xf8, 0x40, 0x00, 0x04, 0x90, 0x70, 0x68, 0x13, 0x46, 0xb0, 0xfb, + 0xf3, 0xfe, 0x52, 0x1e, 0x03, 0xfb, 0x1e, 0x03, 0xd2, 0xb2, 0x93, 0x42, + 0x40, 0xf0, 0x2e, 0x81, 0x00, 0x28, 0x00, 0xf0, 0x2b, 0x81, 0x05, 0x98, + 0x95, 0xf9, 0x01, 0x30, 0x9d, 0xf8, 0x04, 0x20, 0x98, 0x42, 0xa2, 0xbf, + 0x9d, 0xf9, 0x0c, 0x00, 0x95, 0xf9, 0x05, 0x30, 0x98, 0x42, 0x21, 0xda, + 0x2b, 0x7e, 0x9a, 0x42, 0x01, 0xd2, 0x00, 0x98, 0x40, 0xb9, 0x5f, 0xea, + 0x09, 0x00, 0x0b, 0xd0, 0x10, 0x2a, 0x3e, 0xbf, 0xb8, 0x78, 0x06, 0x28, + 0x9a, 0x42, 0x05, 0xd2, 0x51, 0x1c, 0x8d, 0xf8, 0x04, 0x10, 0xb8, 0x78, + 0x40, 0x1c, 0x2b, 0xe0, 0x00, 0x29, 0x1c, 0xbf, 0x04, 0x98, 0x00, 0x28, + 0x35, 0xd0, 0x29, 0x79, 0x88, 0x45, 0x32, 0xd3, 0x6a, 0x7e, 0x90, 0x45, + 0x2f, 0xd2, 0x08, 0xf1, 0x01, 0x08, 0x2b, 0xe0, 0x95, 0xf9, 0x02, 0x00, + 0x05, 0x9b, 0x98, 0x42, 0xa2, 0xbf, 0x95, 0xf9, 0x06, 0x00, 0x9d, 0xf9, + 0x07, 0x30, 0x98, 0x42, 0x21, 0xda, 0x2b, 0x7a, 0x93, 0x42, 0x01, 0xd2, + 0x00, 0x98, 0x40, 0xb9, 0x5f, 0xea, 0x09, 0x00, 0x0e, 0xd0, 0x06, 0x2a, + 0x0c, 0xd3, 0xb8, 0x78, 0x50, 0xb1, 0x93, 0x42, 0x08, 0xd2, 0x50, 0x1e, + 0x8d, 0xf8, 0x04, 0x00, 0xb9, 0x78, 0x48, 0x1e, 0xb8, 0x70, 0x4f, 0xf0, + 0x01, 0x0a, 0x0a, 0xe0, 0x00, 0x29, 0x1c, 0xbf, 0x04, 0x98, 0x00, 0x28, + 0x05, 0xd0, 0x28, 0x79, 0x40, 0x45, 0x02, 0xd2, 0xa8, 0xf1, 0x01, 0x08, + 0x01, 0x24, 0x5f, 0xea, 0x09, 0x00, 0x65, 0xd0, 0x54, 0xea, 0x0a, 0x00, + 0x62, 0xd1, 0x4f, 0xea, 0xd9, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xc0, 0xf1, + 0x01, 0x01, 0xdd, 0xf8, 0x18, 0xc0, 0xc9, 0xb2, 0x00, 0x22, 0x03, 0x46, + 0xb4, 0xee, 0x40, 0x8a, 0x9d, 0xf8, 0x06, 0x00, 0xf1, 0xee, 0x10, 0xfa, + 0x04, 0xd4, 0x9c, 0xf8, 0xe0, 0xe1, 0xbe, 0xf1, 0x07, 0x0f, 0x1d, 0xd1, + 0x5f, 0xea, 0x89, 0x7e, 0x0b, 0xd5, 0x9a, 0x42, 0x09, 0xd1, 0x95, 0xf8, + 0x04, 0xb0, 0x5f, 0xfa, 0x88, 0xfe, 0xf3, 0x45, 0x03, 0xd2, 0xa8, 0xf1, + 0x01, 0x08, 0x01, 0x24, 0x02, 0x22, 0x5f, 0xea, 0xc9, 0x7e, 0x35, 0xd5, + 0x8a, 0x42, 0x33, 0xd1, 0x95, 0xf8, 0x1b, 0xb0, 0x83, 0x45, 0x2f, 0xd2, + 0x04, 0x28, 0x2d, 0xd9, 0xf8, 0x78, 0x58, 0xb3, 0x40, 0x1e, 0x25, 0xe0, + 0xf4, 0xee, 0x48, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x24, 0xd5, 0x5f, 0xea, + 0x89, 0x7e, 0x0f, 0xd5, 0x9a, 0x42, 0x0d, 0xd1, 0x95, 0xf8, 0x04, 0xb0, + 0x5f, 0xfa, 0x88, 0xfe, 0xde, 0x45, 0x07, 0xd3, 0x95, 0xf8, 0x19, 0xb0, + 0xde, 0x45, 0x03, 0xd2, 0x08, 0xf1, 0x01, 0x08, 0x01, 0x24, 0x02, 0x22, + 0x5f, 0xea, 0xc9, 0x7e, 0x0e, 0xd5, 0x8a, 0x42, 0x0c, 0xd1, 0x95, 0xf8, + 0x1c, 0xe0, 0x70, 0x45, 0x3e, 0xbf, 0x08, 0x28, 0xf8, 0x78, 0x04, 0x28, + 0x04, 0xd2, 0x40, 0x1c, 0xf8, 0x70, 0x4f, 0xf0, 0x01, 0x0a, 0x02, 0x22, + 0x52, 0x1c, 0xd2, 0xb2, 0x02, 0x2a, 0xa7, 0xd3, 0x9d, 0xf8, 0x05, 0x00, + 0x01, 0x22, 0x02, 0x21, 0xe8, 0xf7, 0x1e, 0xf9, 0x02, 0x99, 0x9d, 0xf8, + 0x04, 0x20, 0x8d, 0xf8, 0x22, 0x20, 0x08, 0x43, 0xba, 0xf1, 0x00, 0x0f, + 0x02, 0x90, 0x8d, 0xf8, 0x1c, 0x80, 0x33, 0xd0, 0x00, 0x98, 0x00, 0x28, + 0x08, 0xbf, 0x5f, 0xea, 0x09, 0x00, 0x2d, 0xd0, 0xa8, 0x7a, 0x5f, 0xea, + 0x09, 0x01, 0x08, 0xd0, 0x00, 0x90, 0x00, 0x23, 0x0f, 0x98, 0x0d, 0xf1, + 0x06, 0x02, 0x01, 0xa9, 0xff, 0xf7, 0x1d, 0xfc, 0x11, 0xe0, 0x58, 0xb1, + 0x9d, 0xf9, 0x04, 0x10, 0x96, 0xf9, 0x02, 0x00, 0x09, 0x1a, 0x0f, 0x98, + 0x49, 0xb2, 0xff, 0xf7, 0x11, 0xfd, 0x02, 0x99, 0x08, 0x43, 0x02, 0x90, + 0x07, 0xa9, 0x9d, 0xf8, 0x05, 0x00, 0xe7, 0xf7, 0x4b, 0xfd, 0x9d, 0xf8, + 0x05, 0x00, 0xe7, 0xf7, 0x4a, 0xfd, 0xb0, 0x70, 0x9d, 0xf8, 0x05, 0x00, + 0xe7, 0xf7, 0x4a, 0xfd, 0xf0, 0x70, 0x01, 0x21, 0xf0, 0x69, 0xb1, 0x75, + 0x40, 0x1c, 0xf0, 0x61, 0x00, 0xf0, 0x30, 0xf8, 0x02, 0x99, 0x08, 0x43, + 0x02, 0x90, 0xa4, 0xb1, 0x04, 0x98, 0x00, 0x28, 0x08, 0xbf, 0xb9, 0xf1, + 0x00, 0x0f, 0x0e, 0xd0, 0x9d, 0xf8, 0x05, 0x00, 0x07, 0xa9, 0xe7, 0xf7, + 0x26, 0xfd, 0x9d, 0xf8, 0x05, 0x00, 0xe7, 0xf7, 0x25, 0xfd, 0x30, 0x75, + 0x01, 0x21, 0xb0, 0x69, 0x71, 0x75, 0x40, 0x1c, 0xb0, 0x61, 0x00, 0xf0, + 0x15, 0xf8, 0x02, 0x99, 0x08, 0x43, 0x02, 0x90, 0x70, 0x68, 0x40, 0x1c, + 0x70, 0x60, 0x02, 0x98, 0x0c, 0xb0, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, + 0xfe, 0x8f, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x42, 0x18, 0x40, 0x00, 0x20, + 0x28, 0x63, 0x03, 0x20, 0x97, 0x90, 0x00, 0x20, 0x00, 0x22, 0x9d, 0xf8, + 0x05, 0x00, 0x02, 0x21, 0xe8, 0xf7, 0xa6, 0xb8, 0x2d, 0xe9, 0xff, 0x47, + 0x06, 0x46, 0x00, 0x20, 0x00, 0x90, 0x69, 0x46, 0xb0, 0x6b, 0x74, 0x68, + 0x00, 0xf5, 0xb6, 0x79, 0xf0, 0x6b, 0x00, 0xf2, 0x2c, 0x55, 0x00, 0xf5, + 0x3e, 0x78, 0x99, 0xf8, 0x10, 0x00, 0xdb, 0xf7, 0x7d, 0xf8, 0x82, 0x46, + 0xa5, 0xf8, 0x10, 0xa0, 0xe0, 0xb2, 0xe7, 0xf7, 0xfb, 0xfc, 0xa8, 0x73, + 0x00, 0x27, 0xe0, 0xb2, 0xe7, 0xf7, 0xf8, 0xfc, 0xe8, 0x73, 0xe0, 0xb2, + 0xe7, 0xf7, 0xe0, 0xfc, 0x28, 0x75, 0xe0, 0xb2, 0xe7, 0xf7, 0xe1, 0xfc, + 0xa8, 0x70, 0xe0, 0xb2, 0xe7, 0xf7, 0xe2, 0xfc, 0xe8, 0x70, 0xa8, 0x7b, + 0xe9, 0x7b, 0x28, 0x73, 0x69, 0x73, 0x99, 0xf8, 0x00, 0x00, 0xf8, 0xb9, + 0x32, 0x46, 0x00, 0x21, 0x50, 0x46, 0xdb, 0xf7, 0x79, 0xf8, 0x01, 0x00, + 0x18, 0xd4, 0xa8, 0x68, 0x00, 0x28, 0x1e, 0xbf, 0xaa, 0x7b, 0xc8, 0xb2, + 0x90, 0x42, 0x11, 0xd0, 0xa9, 0x73, 0xe9, 0x73, 0x8d, 0xf8, 0x08, 0x10, + 0x8d, 0xf8, 0x09, 0x10, 0xe0, 0xb2, 0x01, 0xa9, 0xe7, 0xf7, 0xc4, 0xfc, + 0x01, 0xa9, 0xe0, 0xb2, 0xe7, 0xf7, 0xc3, 0xfc, 0xe0, 0xb2, 0xe7, 0xf7, + 0xd8, 0xfc, 0x01, 0x27, 0x88, 0xf8, 0x5b, 0x71, 0xa8, 0x68, 0x40, 0x1c, + 0xa8, 0x60, 0x00, 0x98, 0x04, 0xb0, 0xbd, 0xe8, 0xf0, 0x87, 0x00, 0x00, + 0x01, 0x46, 0x48, 0x78, 0x0a, 0x78, 0x89, 0x78, 0x80, 0x00, 0x00, 0xeb, + 0xc2, 0x00, 0x08, 0x18, 0xc0, 0xb2, 0x70, 0x47, 0x2d, 0xe9, 0xfe, 0x43, + 0x88, 0x46, 0x04, 0x46, 0x5f, 0xea, 0x08, 0x00, 0x16, 0x46, 0x1d, 0x46, + 0x8d, 0xf8, 0x07, 0x40, 0x0c, 0xbf, 0x05, 0x27, 0x0a, 0x27, 0x20, 0x46, + 0xe7, 0xf7, 0x12, 0xfb, 0xb0, 0x42, 0x27, 0xd0, 0x39, 0x46, 0x20, 0x46, + 0xe7, 0xf7, 0x6f, 0xfb, 0x41, 0x46, 0x20, 0x46, 0xe7, 0xf7, 0xde, 0xfb, + 0x07, 0x46, 0x41, 0x46, 0x20, 0x46, 0xe7, 0xf7, 0xfa, 0xfb, 0x01, 0x2e, + 0x81, 0x46, 0x04, 0xd1, 0x00, 0xf0, 0x1d, 0xf8, 0x00, 0xf0, 0x16, 0xf8, + 0x01, 0xe0, 0x00, 0xf0, 0x1d, 0xf8, 0x32, 0x46, 0x41, 0x46, 0x20, 0x46, + 0xe7, 0xf7, 0xf2, 0xfa, 0x26, 0xb9, 0x00, 0xf0, 0x10, 0xf8, 0x00, 0xf0, + 0x09, 0xf8, 0x01, 0xe0, 0x00, 0xf0, 0x10, 0xf8, 0x29, 0x46, 0x20, 0x46, + 0xe7, 0xf7, 0x4b, 0xfb, 0xbd, 0xe8, 0xf7, 0x83, 0x42, 0x46, 0x49, 0x46, + 0x20, 0x46, 0xe7, 0xf7, 0xae, 0xbb, 0x42, 0x46, 0x49, 0x46, 0x20, 0x46, + 0xe7, 0xf7, 0x78, 0xbb, 0x8d, 0xf8, 0x06, 0x80, 0x8d, 0xf8, 0x00, 0x70, + 0x68, 0x46, 0xe7, 0xf7, 0xb9, 0xbb, 0x80, 0x78, 0x03, 0x28, 0x18, 0xbf, + 0x01, 0x28, 0x02, 0xd1, 0x4f, 0xf0, 0xff, 0x30, 0x70, 0x47, 0x01, 0x20, + 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x83, 0x78, 0x02, 0x78, 0x00, 0x21, + 0x02, 0x2b, 0x0a, 0xd3, 0x43, 0x78, 0x03, 0xeb, 0x42, 0x02, 0x03, 0x2a, + 0x1a, 0xd8, 0xdf, 0xe8, 0x02, 0xf0, 0x02, 0x15, 0x0f, 0x14, 0xc0, 0x78, + 0x0c, 0xe0, 0x12, 0xb1, 0x01, 0x2a, 0x02, 0xd0, 0x10, 0xe0, 0xc0, 0x78, + 0x01, 0xe0, 0xc0, 0x78, 0x01, 0x21, 0xe7, 0xf7, 0xa6, 0xfb, 0x08, 0xe0, + 0xc0, 0x78, 0x01, 0x21, 0xe7, 0xf7, 0x69, 0xfb, 0x03, 0xe0, 0x01, 0x21, + 0xc0, 0x78, 0xe7, 0xf7, 0x7b, 0xfb, 0x01, 0x46, 0x08, 0x46, 0x02, 0xbd, + 0x1c, 0xb5, 0x11, 0xfb, 0x02, 0xf1, 0x82, 0x78, 0x02, 0x2a, 0x0b, 0xd3, + 0x03, 0x78, 0x44, 0x78, 0x04, 0xeb, 0x43, 0x04, 0x03, 0x2c, 0x1e, 0xd8, + 0xdf, 0xe8, 0x04, 0xf0, 0x02, 0x10, 0x12, 0x18, 0x00, 0x22, 0x0e, 0xe0, + 0x8d, 0xf8, 0x00, 0x10, 0xc1, 0x78, 0x8d, 0xf8, 0x07, 0x10, 0x02, 0x78, + 0x8d, 0xf8, 0x06, 0x20, 0x68, 0x46, 0xe7, 0xf7, 0x69, 0xfb, 0x13, 0xbd, + 0x00, 0x22, 0x06, 0xe0, 0x01, 0x22, 0xc0, 0x78, 0x49, 0xb2, 0xe7, 0xf7, + 0x19, 0xfb, 0x13, 0xbd, 0x01, 0x22, 0xc0, 0x78, 0x49, 0xb2, 0xe7, 0xf7, + 0x44, 0xfb, 0x13, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x86, 0xb0, 0x0d, 0x46, + 0x10, 0x9e, 0x12, 0x9c, 0x00, 0x21, 0x8d, 0xf8, 0x09, 0x10, 0x17, 0x46, + 0x90, 0xf8, 0x04, 0x80, 0x01, 0x88, 0xad, 0xf8, 0x10, 0x10, 0x99, 0x46, + 0x00, 0xf0, 0x59, 0xf8, 0x06, 0xf5, 0xd6, 0x71, 0x91, 0xf9, 0x07, 0x20, + 0x91, 0xf9, 0x00, 0x00, 0x94, 0xf8, 0x84, 0x40, 0x82, 0x18, 0x91, 0xf9, + 0x01, 0x00, 0x10, 0x1a, 0xc0, 0xb2, 0xb0, 0xf1, 0x0a, 0x06, 0xf6, 0xb2, + 0xb8, 0xbf, 0x00, 0x26, 0x04, 0xb9, 0x00, 0x26, 0x38, 0x46, 0x11, 0x9f, + 0x8d, 0xf8, 0x08, 0x60, 0x4f, 0xf0, 0x00, 0x0a, 0x8d, 0xf8, 0x0a, 0x00, + 0x04, 0xe0, 0x9d, 0xf8, 0x08, 0x00, 0x40, 0x1c, 0x8d, 0xf8, 0x08, 0x00, + 0x9d, 0xf8, 0x08, 0x00, 0x40, 0x28, 0x2c, 0xd2, 0x01, 0x46, 0x4a, 0x46, + 0x00, 0xf0, 0x36, 0xf9, 0x03, 0xa8, 0x01, 0x90, 0x00, 0x94, 0x9d, 0xf8, + 0x0a, 0x10, 0xe8, 0x78, 0x3b, 0x46, 0x42, 0x46, 0x00, 0xf0, 0x2e, 0xf8, + 0x83, 0x46, 0x9d, 0xf8, 0x08, 0x00, 0xb0, 0x42, 0x08, 0xbf, 0xda, 0x46, + 0x00, 0x2c, 0x18, 0xbf, 0x01, 0x2c, 0x06, 0xd1, 0x0d, 0xf1, 0x09, 0x02, + 0x02, 0xa9, 0x58, 0x46, 0x00, 0xf0, 0x39, 0xfd, 0x0b, 0xe0, 0x02, 0x2c, + 0xd5, 0xd1, 0x0d, 0xf1, 0x09, 0x00, 0x00, 0x90, 0x02, 0xab, 0x03, 0x9a, + 0x59, 0x46, 0x50, 0x46, 0x00, 0xf0, 0x41, 0xfd, 0xda, 0x46, 0x01, 0x28, + 0xc9, 0xd1, 0x9d, 0xf8, 0x09, 0x00, 0xff, 0xe7, 0x07, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0x40, 0x88, 0xad, 0xf8, 0x12, 0x00, 0x04, 0xa8, 0xe9, 0x78, + 0x8d, 0xf8, 0x14, 0x10, 0xe7, 0xf7, 0x04, 0xba, 0x2d, 0xe9, 0xff, 0x41, + 0x05, 0x46, 0x14, 0x46, 0x0a, 0x98, 0x00, 0x22, 0x18, 0xb1, 0x02, 0x28, + 0x03, 0xd0, 0x02, 0xd3, 0x04, 0xe0, 0xea, 0x22, 0x02, 0xe0, 0xd4, 0x22, + 0x03, 0xb9, 0xc1, 0x22, 0x06, 0x23, 0x8d, 0xf8, 0x09, 0x10, 0x8d, 0xf8, + 0x0b, 0x30, 0x8d, 0xf8, 0x0c, 0x20, 0x8d, 0xf8, 0x0d, 0x50, 0x02, 0xa8, + 0x00, 0x26, 0x8d, 0xf8, 0x08, 0x60, 0x8d, 0xf8, 0x0a, 0x60, 0xe7, 0xf7, + 0xef, 0xf9, 0xb0, 0x46, 0x00, 0x27, 0x0d, 0xe0, 0x28, 0x46, 0xe7, 0xf7, + 0x2e, 0xfa, 0x6b, 0x46, 0x01, 0xaa, 0x00, 0x21, 0x28, 0x46, 0xe7, 0xf7, + 0xf7, 0xf9, 0x01, 0x98, 0x00, 0x99, 0x86, 0x19, 0x88, 0x44, 0x7f, 0x1c, + 0xf8, 0xb2, 0xa0, 0x42, 0xee, 0xd3, 0x0b, 0x98, 0xb6, 0xfb, 0xf4, 0xf1, + 0x10, 0xb1, 0xb8, 0xfb, 0xf4, 0xf2, 0x02, 0x60, 0x08, 0x46, 0x04, 0xb0, + 0xbd, 0xe8, 0xf0, 0x81, 0x2d, 0xe9, 0xf0, 0x4f, 0x87, 0xb0, 0x89, 0x46, + 0x00, 0x21, 0x05, 0x46, 0x93, 0x46, 0xdd, 0xf8, 0x40, 0x80, 0x8d, 0xf8, + 0x0c, 0x10, 0x9a, 0x46, 0x58, 0x46, 0xff, 0xf7, 0xde, 0xfe, 0x07, 0x46, + 0x28, 0x7d, 0xee, 0x7c, 0x46, 0xea, 0x00, 0x26, 0x74, 0x0a, 0x04, 0xf0, + 0x03, 0x04, 0x01, 0x07, 0x89, 0xf8, 0x84, 0x40, 0x05, 0xd5, 0x98, 0xf9, + 0xe6, 0x01, 0x10, 0xb9, 0x00, 0x21, 0x89, 0xf8, 0x84, 0x10, 0x8d, 0xf8, + 0x0d, 0xa0, 0x29, 0x88, 0xad, 0xf8, 0x14, 0x10, 0x6a, 0x88, 0xad, 0xf8, + 0x16, 0x20, 0x9b, 0xf8, 0x03, 0x00, 0x8d, 0xf8, 0x18, 0x00, 0x05, 0xa8, + 0xe7, 0xf7, 0x94, 0xf9, 0x58, 0x46, 0xe7, 0xf7, 0xbf, 0xf9, 0x8d, 0xf8, + 0x0e, 0x00, 0x01, 0x20, 0x01, 0x90, 0xcd, 0xf8, 0x08, 0x90, 0xcd, 0xf8, + 0x00, 0x80, 0x3b, 0x46, 0x9d, 0xf8, 0x0d, 0x20, 0x59, 0x46, 0x28, 0x46, + 0xff, 0xf7, 0x0a, 0xff, 0x82, 0x46, 0x00, 0x20, 0x01, 0x90, 0x7f, 0x42, + 0x9d, 0xf8, 0x0d, 0x20, 0xcd, 0xf8, 0x08, 0x90, 0xcd, 0xf8, 0x00, 0x80, + 0x7b, 0xb2, 0x59, 0x46, 0x28, 0x46, 0xff, 0xf7, 0xfb, 0xfe, 0x80, 0x46, + 0x00, 0x20, 0xf2, 0x07, 0x04, 0x90, 0x26, 0xd4, 0x08, 0xeb, 0x0a, 0x07, + 0x7f, 0x10, 0x00, 0x2c, 0x18, 0xbf, 0x01, 0x2c, 0x09, 0xd1, 0x03, 0xa9, + 0x01, 0x91, 0x04, 0xa8, 0xf9, 0xb2, 0x02, 0x90, 0x00, 0x91, 0x00, 0xf0, + 0x52, 0xf8, 0x00, 0xf0, 0xd5, 0xfc, 0x02, 0x2c, 0x09, 0xd1, 0x04, 0xa8, + 0x03, 0xa9, 0x02, 0x90, 0x01, 0x91, 0xff, 0xb2, 0x00, 0x97, 0x00, 0xf0, + 0x46, 0xf8, 0x00, 0xf0, 0x3d, 0xfd, 0x9d, 0xf8, 0x0e, 0x10, 0x58, 0x46, + 0xe7, 0xf7, 0xa0, 0xf9, 0x00, 0x24, 0xb1, 0x07, 0x15, 0xd4, 0x04, 0x98, + 0x98, 0xb1, 0x68, 0x7c, 0x01, 0x24, 0xaa, 0xeb, 0x08, 0x01, 0x88, 0x42, + 0x04, 0xda, 0x4f, 0xf0, 0xff, 0x30, 0x8d, 0xf8, 0x0c, 0x00, 0x08, 0xe0, + 0xa8, 0xeb, 0x0a, 0x01, 0x88, 0x42, 0xb2, 0xbf, 0x8d, 0xf8, 0x0c, 0x40, + 0x00, 0x22, 0x8d, 0xf8, 0x0c, 0x20, 0x58, 0x46, 0xff, 0xf7, 0x02, 0xfe, + 0x06, 0x46, 0xda, 0xf7, 0xda, 0xfc, 0x07, 0x46, 0x9b, 0xf8, 0x03, 0x00, + 0xda, 0xf7, 0xac, 0xfd, 0x1f, 0xb1, 0x00, 0x20, 0x8d, 0xf8, 0x0c, 0x00, + 0x12, 0xe0, 0x09, 0xeb, 0x06, 0x01, 0x81, 0xf8, 0x10, 0xa0, 0x81, 0xf8, + 0x20, 0x80, 0xc2, 0x44, 0x2a, 0x7c, 0x92, 0x45, 0x03, 0xdb, 0x04, 0x99, + 0x01, 0xb1, 0x04, 0xb1, 0x20, 0xb1, 0x00, 0x20, 0x8d, 0xf8, 0x0c, 0x00, + 0x89, 0xf8, 0x63, 0x00, 0x9d, 0xf9, 0x0c, 0x00, 0xfc, 0xe6, 0x4a, 0x46, + 0x9d, 0xf8, 0x0d, 0x30, 0x29, 0x46, 0x58, 0x46, 0x70, 0x47, 0xf9, 0xb2, + 0x28, 0x46, 0x5f, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf1, 0x4f, + 0x16, 0x46, 0x84, 0xb0, 0x89, 0x46, 0x9a, 0x46, 0x30, 0x46, 0xe7, 0xf7, + 0x27, 0xf9, 0x8d, 0xf8, 0x08, 0x00, 0x00, 0x27, 0xb1, 0x78, 0x08, 0x25, + 0x03, 0x29, 0x26, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, 0x02, 0x1d, 0x20, 0x23, + 0x02, 0x24, 0x4f, 0xf0, 0x01, 0x08, 0x9d, 0xf8, 0x38, 0x30, 0x31, 0x78, + 0xf0, 0x78, 0x01, 0x22, 0xff, 0xf7, 0xc0, 0xfd, 0x00, 0xf0, 0xc5, 0xf8, + 0x00, 0x90, 0x30, 0x46, 0xff, 0xf7, 0x12, 0xfe, 0x83, 0x46, 0x00, 0xf0, + 0xae, 0xf8, 0x27, 0xd8, 0xdf, 0xe8, 0x02, 0xf0, 0x02, 0x0f, 0x16, 0x1d, + 0xad, 0xf8, 0x04, 0x70, 0x1c, 0xe0, 0x01, 0x24, 0xa0, 0x46, 0xe4, 0xe7, + 0x08, 0x24, 0xb8, 0x46, 0xe8, 0xe7, 0x04, 0x24, 0xfb, 0xe7, 0x00, 0x24, + 0xf9, 0xe7, 0x01, 0x21, 0x02, 0x25, 0x8d, 0xf8, 0x04, 0x70, 0x8d, 0xf8, + 0x05, 0x10, 0x0b, 0xe0, 0x01, 0x20, 0x04, 0x25, 0x8d, 0xf8, 0x04, 0x00, + 0x8d, 0xf8, 0x05, 0x70, 0x04, 0xe0, 0x01, 0x25, 0x8d, 0xf8, 0x04, 0x50, + 0x8d, 0xf8, 0x05, 0x50, 0x8d, 0xf8, 0x06, 0x40, 0x00, 0xf0, 0x8b, 0xf8, + 0x64, 0x20, 0xc0, 0x46, 0xc0, 0x46, 0x00, 0x9c, 0x00, 0xf0, 0x8f, 0xf8, + 0x04, 0x99, 0x04, 0x43, 0x08, 0x7b, 0x40, 0xb9, 0x04, 0x98, 0xcd, 0xf8, + 0x00, 0xa0, 0x2b, 0x46, 0x32, 0x46, 0x49, 0x46, 0xff, 0xf7, 0xdc, 0xfe, + 0x07, 0x46, 0x30, 0x46, 0xff, 0xf7, 0x6e, 0xfd, 0x05, 0x46, 0xbb, 0xf1, + 0x00, 0x0f, 0x09, 0xf8, 0x05, 0x70, 0x02, 0xd4, 0x59, 0x46, 0x01, 0x22, + 0x04, 0xe0, 0xcb, 0xf1, 0x00, 0x0b, 0x59, 0x46, 0x4f, 0xf0, 0xff, 0x32, + 0xc9, 0xb2, 0x30, 0x46, 0xff, 0xf7, 0xe6, 0xfd, 0x00, 0xf0, 0x6b, 0xf8, + 0x04, 0x43, 0x00, 0xf0, 0x58, 0xf8, 0x23, 0xd8, 0xdf, 0xe8, 0x02, 0xf0, + 0x02, 0x06, 0x0f, 0x18, 0x00, 0x21, 0xad, 0xf8, 0x04, 0x10, 0x0e, 0xe0, + 0x00, 0x20, 0x01, 0x21, 0x8d, 0xf8, 0x04, 0x00, 0x8d, 0xf8, 0x05, 0x10, + 0x8d, 0xf8, 0x06, 0x00, 0x10, 0xe0, 0x01, 0x20, 0x00, 0x21, 0x8d, 0xf8, + 0x04, 0x00, 0x8d, 0xf8, 0x05, 0x10, 0x8d, 0xf8, 0x06, 0x10, 0x07, 0xe0, + 0x01, 0x20, 0x00, 0x22, 0x8d, 0xf8, 0x04, 0x00, 0x8d, 0xf8, 0x05, 0x00, + 0x8d, 0xf8, 0x06, 0x20, 0x00, 0xf0, 0x39, 0xf8, 0x00, 0xf0, 0x41, 0xf8, + 0x9d, 0xf8, 0x08, 0x10, 0x04, 0x43, 0x00, 0x2f, 0x08, 0x46, 0x02, 0xdd, + 0x1f, 0x28, 0x38, 0xbf, 0x49, 0x1c, 0x00, 0x2f, 0x02, 0xd5, 0x02, 0x28, + 0x28, 0xbf, 0x49, 0x1e, 0xc8, 0xb2, 0x00, 0x28, 0x14, 0xbf, 0x1f, 0x28, + 0x44, 0xf4, 0x80, 0x74, 0x00, 0xf0, 0x27, 0xf8, 0x30, 0x46, 0xe7, 0xf7, + 0x73, 0xf8, 0x09, 0xeb, 0x05, 0x01, 0x00, 0x22, 0x81, 0xf8, 0x50, 0x00, + 0x00, 0x21, 0xf0, 0x78, 0xe7, 0xf7, 0x58, 0xfd, 0x04, 0x43, 0xb8, 0xf1, + 0x00, 0x0f, 0x06, 0xd0, 0x9d, 0xf8, 0x38, 0x30, 0x31, 0x78, 0xf0, 0x78, + 0x00, 0x22, 0xff, 0xf7, 0x0d, 0xfd, 0x20, 0x46, 0x05, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0x31, 0x78, 0x70, 0x78, 0x00, 0xeb, 0x41, 0x02, 0x03, 0x2a, + 0x70, 0x47, 0xf0, 0x78, 0x8d, 0xf8, 0x07, 0x00, 0x01, 0xa8, 0xe7, 0xf7, + 0xb5, 0xb8, 0xc9, 0xb2, 0x30, 0x46, 0xe7, 0xf7, 0x71, 0xb8, 0xf0, 0x78, + 0x00, 0x22, 0x00, 0x21, 0xe7, 0xf7, 0x34, 0xbd, 0x2d, 0xe9, 0xf0, 0x4f, + 0x8b, 0x46, 0x8b, 0xb0, 0x99, 0x46, 0x9b, 0xf8, 0x13, 0x30, 0x06, 0x93, + 0x16, 0x46, 0x80, 0x46, 0x01, 0x22, 0xff, 0xf7, 0xf0, 0xff, 0x05, 0x46, + 0x40, 0x46, 0xda, 0xf7, 0x79, 0xfc, 0x68, 0x46, 0xda, 0xf7, 0x54, 0xfc, + 0x01, 0x20, 0x86, 0xf8, 0x63, 0x00, 0x06, 0x21, 0x04, 0xa8, 0xec, 0xf7, + 0xf5, 0xfd, 0x8d, 0xf8, 0x15, 0x80, 0x00, 0x27, 0x8d, 0xf8, 0x10, 0x70, + 0x04, 0xa8, 0xe7, 0xf7, 0x01, 0xf8, 0x7f, 0x1c, 0xf8, 0xb2, 0x04, 0x28, + 0xf6, 0xd3, 0xda, 0xf7, 0x9c, 0xfb, 0x07, 0x00, 0x0c, 0xd1, 0x06, 0x98, + 0x01, 0x07, 0x09, 0xd5, 0x06, 0xf1, 0x70, 0x02, 0x10, 0x69, 0x28, 0xb1, + 0x32, 0x46, 0x59, 0x46, 0x40, 0x46, 0x00, 0xf0, 0x5d, 0xfa, 0x05, 0x43, + 0x00, 0x20, 0x8d, 0xf8, 0x08, 0x00, 0x06, 0x99, 0x48, 0x07, 0x51, 0xd4, + 0x00, 0x24, 0x4f, 0x46, 0x00, 0xf0, 0x4b, 0xfa, 0xe1, 0xb2, 0x40, 0x46, + 0xda, 0xf7, 0xed, 0xfd, 0x4f, 0xf0, 0x00, 0x09, 0x4f, 0xf0, 0x00, 0x0a, + 0x8d, 0xf8, 0x0c, 0x40, 0x8d, 0xf8, 0x0d, 0x90, 0x8d, 0xf8, 0x0e, 0xa0, + 0x8d, 0xf8, 0x0f, 0x80, 0xda, 0xf7, 0x71, 0xfb, 0xe0, 0xb9, 0x4f, 0xea, + 0x89, 0x01, 0xbb, 0xf8, 0x0e, 0x00, 0x01, 0xeb, 0xc4, 0x01, 0x51, 0x44, + 0xc8, 0x40, 0xc0, 0x07, 0x12, 0xd5, 0x9d, 0xf8, 0x08, 0x10, 0x00, 0x91, + 0x3b, 0x46, 0x03, 0xaa, 0x31, 0x46, 0x58, 0x46, 0xff, 0xf7, 0xae, 0xfe, + 0x00, 0x95, 0x00, 0x22, 0x05, 0x46, 0x00, 0x21, 0x40, 0x46, 0xe7, 0xf7, + 0xc5, 0xfc, 0x28, 0x43, 0x00, 0x9d, 0x05, 0x43, 0x00, 0xf0, 0x0d, 0xfa, + 0xd4, 0xd3, 0x09, 0xf1, 0x01, 0x09, 0xb9, 0xf1, 0x01, 0x0f, 0xcd, 0xd9, + 0x00, 0xf0, 0x0b, 0xfa, 0xe1, 0xb2, 0x40, 0x46, 0xda, 0xf7, 0xb3, 0xfd, + 0x64, 0x1c, 0x01, 0x2c, 0xbc, 0xd9, 0xda, 0xf7, 0x40, 0xfb, 0x07, 0x00, + 0x08, 0xd1, 0x06, 0x98, 0x41, 0x06, 0x05, 0xd5, 0x32, 0x46, 0x59, 0x46, + 0x40, 0x46, 0x00, 0xf0, 0x97, 0xf9, 0x05, 0x43, 0x06, 0x98, 0xc1, 0x06, + 0x0c, 0xd5, 0xda, 0xf7, 0x30, 0xfb, 0x07, 0x00, 0x04, 0xbf, 0x96, 0xf9, + 0x63, 0x00, 0x01, 0x28, 0x04, 0xd1, 0x32, 0x46, 0x59, 0x46, 0x40, 0x46, + 0x00, 0xf0, 0x25, 0xf8, 0x56, 0xf8, 0x70, 0x0f, 0x14, 0x9c, 0x3f, 0x18, + 0x37, 0x60, 0x40, 0x46, 0xda, 0xf7, 0xee, 0xfb, 0x70, 0x60, 0x40, 0x46, + 0xda, 0xf7, 0xf0, 0xfb, 0xf1, 0x68, 0xb0, 0x60, 0x41, 0x18, 0xf1, 0x60, + 0x84, 0x42, 0x38, 0xbf, 0x45, 0xf4, 0x80, 0x65, 0x68, 0x46, 0xda, 0xf7, + 0xbd, 0xfb, 0x01, 0x98, 0x07, 0x90, 0x07, 0xa8, 0xda, 0xf7, 0x94, 0xfb, + 0x0a, 0x98, 0x31, 0x69, 0xb0, 0x61, 0x49, 0x1c, 0x31, 0x61, 0x28, 0x46, + 0x0b, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x2d, 0xe9, 0xf0, 0x4f, 0x0f, 0x46, + 0x8d, 0xb0, 0x79, 0x7d, 0x03, 0x91, 0x81, 0x46, 0x90, 0x46, 0xe7, 0xf7, + 0xc6, 0xf9, 0x08, 0xf1, 0x60, 0x06, 0x82, 0x46, 0x30, 0x89, 0x28, 0xb9, + 0x03, 0x98, 0x0a, 0xfa, 0x00, 0xf1, 0x31, 0x81, 0x31, 0x89, 0x71, 0x81, + 0x48, 0x46, 0xe6, 0xf7, 0x84, 0xff, 0x96, 0xf9, 0x0c, 0x10, 0x40, 0x1a, + 0x70, 0x70, 0x00, 0x24, 0x00, 0xf0, 0x92, 0xf8, 0x96, 0xf9, 0x0d, 0x10, + 0x40, 0x1a, 0xb0, 0x70, 0x48, 0x46, 0x00, 0xf0, 0xd0, 0xf8, 0x48, 0x46, + 0xe6, 0xf7, 0x7b, 0xff, 0xe0, 0xb2, 0x05, 0xa9, 0x09, 0xaa, 0x01, 0xeb, + 0x80, 0x03, 0x02, 0xeb, 0x80, 0x02, 0xe1, 0xb2, 0x48, 0x46, 0xe6, 0xf7, + 0x3f, 0xff, 0x64, 0x1c, 0xe0, 0xb2, 0x04, 0x28, 0xf0, 0xd3, 0x09, 0xac, + 0x61, 0x68, 0xe0, 0x68, 0x41, 0x18, 0x05, 0xad, 0x04, 0x91, 0xd5, 0xf8, + 0x04, 0xb0, 0xe8, 0x68, 0xbf, 0x7d, 0x83, 0x44, 0x00, 0xf0, 0x6f, 0xf8, + 0x7f, 0x00, 0xf8, 0xb2, 0x02, 0x90, 0x00, 0x20, 0x00, 0x90, 0xcd, 0xf8, + 0x04, 0x80, 0x08, 0xf1, 0x61, 0x03, 0x04, 0x99, 0x5a, 0x46, 0x48, 0x46, + 0x00, 0xf0, 0x66, 0xf8, 0x00, 0xf0, 0x5f, 0xf8, 0x01, 0x20, 0xff, 0xb2, + 0x00, 0x90, 0x02, 0x97, 0xcd, 0xf8, 0x04, 0x80, 0x05, 0x9a, 0xa8, 0x68, + 0x09, 0x99, 0x82, 0x18, 0xa0, 0x68, 0x41, 0x18, 0x08, 0xf1, 0x62, 0x03, + 0x48, 0x46, 0x00, 0xf0, 0x53, 0xf8, 0x00, 0xf0, 0x4c, 0xf8, 0xb6, 0xf9, + 0x08, 0x00, 0x96, 0xf9, 0x01, 0x10, 0x09, 0x18, 0x96, 0xf9, 0x02, 0x00, + 0x0f, 0x18, 0x38, 0xb2, 0x00, 0x28, 0x48, 0xbf, 0x00, 0x27, 0x37, 0x81, + 0x48, 0x46, 0xe6, 0xf7, 0x24, 0xff, 0x00, 0xf0, 0x36, 0xf8, 0xf0, 0x73, + 0x48, 0x46, 0xe7, 0xf7, 0x52, 0xf9, 0x30, 0x70, 0xb9, 0xb2, 0xb6, 0xf9, + 0x0a, 0x20, 0x03, 0x98, 0xba, 0x1a, 0xc1, 0x40, 0x12, 0xb2, 0x01, 0x23, + 0x03, 0xfa, 0x00, 0xf0, 0x00, 0x2a, 0x00, 0xb2, 0x01, 0xdd, 0x82, 0x42, + 0x01, 0xe0, 0x40, 0x42, 0x90, 0x42, 0xac, 0xbf, 0x01, 0x20, 0x00, 0x20, + 0xca, 0xb2, 0x1f, 0x2a, 0x28, 0xbf, 0x1f, 0x21, 0xca, 0xb2, 0x92, 0x45, + 0x18, 0xbf, 0x00, 0x28, 0x06, 0xd0, 0xc9, 0xb2, 0x48, 0x46, 0xe7, 0xf7, + 0x20, 0xf9, 0x00, 0xf0, 0x12, 0xf8, 0x77, 0x81, 0x48, 0x46, 0xe7, 0xf7, + 0x2a, 0xf9, 0x30, 0x70, 0x48, 0x46, 0xe6, 0xf7, 0xf2, 0xfe, 0x00, 0xf0, + 0x04, 0xf8, 0xf0, 0x73, 0x0d, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0xb0, 0x73, + 0x48, 0x46, 0xe6, 0xf7, 0xec, 0xbe, 0x00, 0x22, 0x00, 0x21, 0x48, 0x46, + 0xe7, 0xf7, 0xb6, 0xbb, 0xf8, 0xb5, 0x08, 0x9d, 0x93, 0xf9, 0x00, 0x40, + 0xc5, 0xf1, 0x64, 0x06, 0x56, 0x43, 0x64, 0x27, 0x49, 0x00, 0xb6, 0xfb, + 0xf7, 0xf7, 0xb9, 0x42, 0x38, 0xbf, 0x64, 0x1c, 0x64, 0x35, 0x6a, 0x43, + 0x64, 0x25, 0xb2, 0xfb, 0xf5, 0xf2, 0x8a, 0x42, 0x07, 0x9a, 0x06, 0x99, + 0x38, 0xbf, 0x64, 0x1e, 0x6c, 0x32, 0x0d, 0x00, 0x0c, 0xbf, 0x12, 0x78, + 0x52, 0x78, 0x1c, 0x70, 0x63, 0xb2, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x40, + 0x38, 0xb5, 0x9c, 0x18, 0x00, 0x25, 0x64, 0xb2, 0x1f, 0x2c, 0x4f, 0xf4, + 0x80, 0x72, 0xc8, 0xbf, 0x1f, 0x24, 0x02, 0xdc, 0x00, 0x2c, 0x01, 0xd5, + 0x00, 0x24, 0x15, 0x46, 0xc4, 0xf1, 0x20, 0x02, 0x00, 0x29, 0xd2, 0xb2, + 0xe1, 0xb2, 0x02, 0xd1, 0xe6, 0xf7, 0xa7, 0xfe, 0x01, 0xe0, 0xe6, 0xf7, + 0xa6, 0xfe, 0x28, 0x46, 0x32, 0xbd, 0x1c, 0xb5, 0x04, 0x46, 0x00, 0x22, + 0x03, 0x21, 0xe7, 0xf7, 0xa2, 0xf8, 0x0f, 0x22, 0x94, 0x21, 0x20, 0x46, + 0xe7, 0xf7, 0x8a, 0xf8, 0x00, 0x22, 0x01, 0x21, 0x00, 0xf0, 0x1a, 0xf8, + 0x01, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x16, 0xf8, 0x02, 0x22, 0x04, 0x21, + 0x00, 0xf0, 0x12, 0xf8, 0x03, 0x22, 0x08, 0x21, 0x00, 0xf0, 0x0e, 0xf8, + 0x4f, 0xf4, 0x80, 0x50, 0xad, 0xf8, 0x00, 0x00, 0x4f, 0xf4, 0x80, 0x41, + 0xad, 0xf8, 0x02, 0x10, 0x8d, 0xf8, 0x04, 0x40, 0x68, 0x46, 0xe6, 0xf7, + 0x35, 0xfe, 0x13, 0xbd, 0x20, 0x46, 0xe7, 0xf7, 0x63, 0xb8, 0x2d, 0xe9, + 0xf8, 0x4f, 0x83, 0x46, 0x0e, 0x46, 0x17, 0x46, 0x98, 0x46, 0x30, 0x46, + 0xff, 0xf7, 0xfa, 0xfa, 0x82, 0x46, 0x0b, 0xeb, 0x0a, 0x00, 0x4f, 0xf0, + 0x00, 0x09, 0x90, 0xf8, 0x50, 0x50, 0xb0, 0x78, 0x01, 0x28, 0x07, 0xd8, + 0x31, 0x78, 0xf0, 0x78, 0x43, 0x46, 0x01, 0x22, 0xff, 0xf7, 0xf4, 0xfa, + 0x01, 0x24, 0x00, 0xe0, 0x00, 0x24, 0x00, 0x2f, 0x29, 0x46, 0x03, 0xdd, + 0x1f, 0x2d, 0x04, 0xd2, 0x49, 0x1c, 0x02, 0xe0, 0x01, 0xd5, 0x05, 0xb1, + 0x49, 0x1e, 0xc8, 0xb2, 0x00, 0x28, 0x14, 0xbf, 0x1f, 0x28, 0x4f, 0xf4, + 0x80, 0x79, 0xff, 0xf7, 0xe2, 0xfd, 0x30, 0x46, 0xe6, 0xf7, 0x2e, 0xfe, + 0x0b, 0xeb, 0x0a, 0x01, 0x81, 0xf8, 0x50, 0x00, 0x2c, 0xb1, 0x31, 0x78, + 0xf0, 0x78, 0x43, 0x46, 0x00, 0x22, 0xff, 0xf7, 0xd1, 0xfa, 0x48, 0x46, + 0xbd, 0xe8, 0xf2, 0x8f, 0x2d, 0xe9, 0xf8, 0x4f, 0x84, 0xb0, 0x93, 0x46, + 0x0d, 0xf1, 0x0a, 0x02, 0x80, 0x46, 0x89, 0x46, 0x00, 0x26, 0x16, 0x80, + 0x0d, 0xf1, 0x0a, 0x01, 0x0b, 0xf1, 0x50, 0x00, 0xda, 0xf7, 0xcf, 0xfb, + 0x8d, 0xf8, 0x08, 0x60, 0x00, 0x27, 0x0b, 0xeb, 0x07, 0x00, 0x0d, 0xf1, + 0x0a, 0x01, 0x90, 0xf9, 0x64, 0x00, 0xcc, 0x57, 0x0b, 0xeb, 0x07, 0x02, + 0x04, 0x1b, 0x82, 0xf8, 0x66, 0x40, 0x00, 0xf0, 0x46, 0xf8, 0xf9, 0xb2, + 0x40, 0x46, 0xda, 0xf7, 0xe8, 0xfb, 0x00, 0x25, 0x4f, 0xf0, 0x00, 0x0a, + 0x8d, 0xf8, 0x0c, 0x70, 0x8d, 0xf8, 0x0d, 0x50, 0x8d, 0xf8, 0x0e, 0xa0, + 0x8d, 0xf8, 0x0f, 0x80, 0xa9, 0x00, 0xb9, 0xf8, 0x0e, 0x00, 0x01, 0xeb, + 0xc7, 0x01, 0x51, 0x44, 0xc8, 0x40, 0xc0, 0x07, 0x10, 0xd5, 0x9d, 0xf8, + 0x08, 0x30, 0x62, 0xb2, 0x03, 0xa9, 0x58, 0x46, 0xff, 0xf7, 0x81, 0xff, + 0x00, 0x96, 0x00, 0x22, 0x06, 0x46, 0x00, 0x21, 0x40, 0x46, 0xe7, 0xf7, + 0xc7, 0xfa, 0x30, 0x43, 0x00, 0x9e, 0x06, 0x43, 0x00, 0xf0, 0x0f, 0xf8, + 0xda, 0xd3, 0x6d, 0x1c, 0x02, 0x2d, 0xd5, 0xd3, 0x00, 0xf0, 0x0f, 0xf8, + 0xf9, 0xb2, 0x40, 0x46, 0xda, 0xf7, 0xb7, 0xfb, 0x7f, 0x1c, 0x02, 0x2f, + 0xb9, 0xd3, 0x30, 0x46, 0x66, 0xe5, 0x0a, 0xf1, 0x01, 0x0a, 0x5f, 0xfa, + 0x8a, 0xf0, 0x04, 0x28, 0x70, 0x47, 0x00, 0x20, 0x01, 0x90, 0x00, 0x90, + 0x01, 0x23, 0x01, 0x22, 0x70, 0x47, 0x00, 0x20, 0x02, 0xa9, 0x01, 0x90, + 0x00, 0x91, 0x01, 0x23, 0x00, 0x22, 0x70, 0x47, 0x2d, 0xe9, 0xfe, 0x4f, + 0x0c, 0x46, 0x00, 0x21, 0xad, 0xf8, 0x00, 0x10, 0x82, 0x46, 0x15, 0x46, + 0x88, 0x46, 0x89, 0x46, 0xe6, 0x7c, 0x69, 0x46, 0x05, 0xf1, 0x50, 0x00, + 0xda, 0xf7, 0x61, 0xfb, 0x00, 0x20, 0xcd, 0xf8, 0x04, 0xd0, 0x1d, 0xf9, + 0x00, 0x10, 0x88, 0x44, 0x29, 0x18, 0x40, 0x1c, 0x91, 0xf9, 0x64, 0x30, + 0x02, 0x28, 0x99, 0x44, 0xf3, 0xd3, 0x4f, 0xfa, 0x88, 0xf0, 0x00, 0xeb, + 0xd0, 0x70, 0x41, 0x10, 0x4f, 0xfa, 0x89, 0xf0, 0x00, 0xeb, 0xd0, 0x70, + 0x42, 0x10, 0x30, 0x06, 0x47, 0xbf, 0x8e, 0x1a, 0x4f, 0xfa, 0x82, 0xf8, + 0xa1, 0xf1, 0x10, 0x06, 0x4f, 0xfa, 0x81, 0xf8, 0x50, 0x46, 0xe6, 0xf7, + 0xce, 0xff, 0x07, 0x46, 0x70, 0xb2, 0xda, 0xf7, 0x55, 0xf8, 0xe1, 0x7d, + 0x01, 0xf0, 0x0f, 0x01, 0x81, 0x42, 0x05, 0xd2, 0x76, 0xb2, 0x00, 0x2e, + 0xcc, 0xbf, 0x01, 0x20, 0xff, 0x20, 0xc7, 0x19, 0xf8, 0xb2, 0x1f, 0x28, + 0x0b, 0xd2, 0x00, 0xf0, 0x4f, 0xf8, 0x06, 0x46, 0xf9, 0xb2, 0x50, 0x46, + 0xe6, 0xf7, 0xa5, 0xff, 0x00, 0xf0, 0x48, 0xf8, 0x40, 0xea, 0x06, 0x09, + 0x01, 0xe0, 0x4f, 0xf4, 0x80, 0x79, 0x50, 0x46, 0xe6, 0xf7, 0xab, 0xff, + 0x05, 0xf8, 0x60, 0x0f, 0x02, 0x94, 0x00, 0x24, 0x01, 0x98, 0x07, 0x57, + 0x00, 0x2c, 0xa7, 0xeb, 0x08, 0x07, 0x50, 0x46, 0x04, 0xd1, 0xe6, 0xf7, + 0x6a, 0xfd, 0x06, 0x46, 0x6f, 0x70, 0x03, 0xe0, 0xe6, 0xf7, 0x69, 0xfd, + 0x06, 0x46, 0xaf, 0x70, 0x78, 0xb2, 0xda, 0xf7, 0x1f, 0xf8, 0x02, 0x99, + 0xca, 0x7d, 0x12, 0x09, 0x82, 0x42, 0x15, 0xd2, 0x7f, 0xb2, 0x00, 0x2f, + 0x4c, 0xbf, 0x4f, 0xf0, 0xff, 0x3b, 0x4f, 0xf0, 0x01, 0x0b, 0x00, 0xf0, + 0x1b, 0xf8, 0x07, 0x46, 0x5b, 0x46, 0x32, 0x46, 0xe1, 0xb2, 0x50, 0x46, + 0xff, 0xf7, 0x8a, 0xfe, 0x07, 0x43, 0x00, 0xf0, 0x11, 0xf8, 0x07, 0x43, + 0x47, 0xea, 0x09, 0x09, 0x64, 0x1c, 0x02, 0x2c, 0xce, 0xd3, 0x50, 0x46, + 0xe6, 0xf7, 0x3f, 0xfd, 0xa8, 0x73, 0x50, 0x46, 0xe6, 0xf7, 0x3f, 0xfd, + 0xe8, 0x73, 0x48, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, 0x00, 0x22, 0x00, 0x21, + 0x50, 0x46, 0xe7, 0xf7, 0x05, 0xba, 0x03, 0x46, 0x00, 0x20, 0x6b, 0xb1, + 0x12, 0x78, 0x12, 0xb9, 0x0a, 0x78, 0x02, 0x2a, 0x01, 0xd2, 0x01, 0x20, + 0x70, 0x47, 0x05, 0x2a, 0x02, 0xd3, 0x12, 0x1f, 0x0a, 0x70, 0x70, 0x47, + 0x08, 0x70, 0x70, 0x47, 0x09, 0x78, 0x11, 0x70, 0x70, 0x47, 0x30, 0xb5, + 0x00, 0x24, 0x52, 0x08, 0x91, 0x42, 0x03, 0x9d, 0x28, 0xbf, 0x82, 0x42, + 0x03, 0xd2, 0x8a, 0x42, 0x28, 0xbf, 0x90, 0x42, 0x11, 0xd3, 0x80, 0x1a, + 0x48, 0xbf, 0x40, 0x42, 0x89, 0x1a, 0x1c, 0x78, 0x2c, 0x70, 0x48, 0xbf, + 0x49, 0x42, 0x88, 0x42, 0x11, 0xda, 0x18, 0x78, 0x00, 0x28, 0x07, 0xbf, + 0x00, 0x21, 0x29, 0x70, 0x40, 0x1e, 0x28, 0x70, 0x09, 0xe0, 0x91, 0x42, + 0x08, 0xd3, 0x18, 0x78, 0x02, 0x28, 0x02, 0xd3, 0x80, 0x1e, 0x18, 0x70, + 0x02, 0xe0, 0x1c, 0x70, 0x2c, 0x70, 0x01, 0x24, 0x20, 0x46, 0x30, 0xbd, + 0x10, 0xb5, 0x04, 0x46, 0x00, 0x20, 0x52, 0x08, 0x91, 0x42, 0x28, 0xbf, + 0xa2, 0x42, 0x03, 0xd2, 0x8a, 0x42, 0x0e, 0xd3, 0x94, 0x42, 0x14, 0xd3, + 0x01, 0x20, 0xa4, 0x1a, 0x48, 0xbf, 0x64, 0x42, 0x89, 0x1a, 0x48, 0xbf, + 0x49, 0x42, 0x8c, 0x42, 0x0b, 0xda, 0x19, 0x78, 0x49, 0xb1, 0x49, 0x1e, + 0x03, 0xe0, 0x19, 0x78, 0x02, 0x29, 0x02, 0xd3, 0x89, 0x1e, 0x19, 0x70, + 0x10, 0xbd, 0x18, 0x70, 0x01, 0x20, 0x10, 0xbd, 0x2d, 0xe9, 0xf3, 0x4f, + 0x85, 0xb0, 0x00, 0x24, 0x8d, 0xf8, 0x0c, 0x40, 0x02, 0x94, 0x82, 0x46, + 0x06, 0x99, 0x91, 0xf8, 0x04, 0xb0, 0x91, 0x46, 0x98, 0x46, 0xff, 0xf7, + 0xa2, 0xf9, 0x05, 0x46, 0x50, 0x46, 0xe6, 0xf7, 0xa3, 0xfc, 0x04, 0x90, + 0x99, 0xf8, 0x84, 0x60, 0x9d, 0xf8, 0x40, 0x10, 0x2a, 0x46, 0x50, 0x46, + 0xff, 0xf7, 0xc8, 0xf9, 0x00, 0x27, 0xe1, 0xb2, 0x50, 0x46, 0xe6, 0xf7, + 0xbb, 0xfc, 0x02, 0xa8, 0x01, 0x90, 0x00, 0x96, 0x01, 0x23, 0x00, 0xf0, + 0x47, 0xf8, 0x20, 0xb1, 0x64, 0x1c, 0xe0, 0xb2, 0x20, 0x28, 0xf0, 0xd3, + 0x00, 0xe0, 0x27, 0x46, 0x6d, 0x42, 0x9d, 0xf8, 0x40, 0x10, 0x8d, 0xf8, + 0x00, 0xb0, 0x6a, 0xb2, 0x50, 0x46, 0xff, 0xf7, 0xad, 0xf9, 0x9d, 0xf8, + 0x0c, 0x40, 0x9d, 0xf8, 0x00, 0xb0, 0x00, 0x25, 0xe9, 0xb2, 0x50, 0x46, + 0xe6, 0xf7, 0x9c, 0xfc, 0x02, 0xa8, 0x01, 0x90, 0x00, 0x96, 0x00, 0x23, + 0x00, 0xf0, 0x28, 0xf8, 0x20, 0xb9, 0x2c, 0x46, 0x6d, 0x1c, 0xe8, 0xb2, + 0x20, 0x28, 0xef, 0xd3, 0x04, 0xa9, 0x7f, 0xb2, 0x91, 0xf9, 0x00, 0x10, + 0x11, 0x98, 0x64, 0xb2, 0xcf, 0x1b, 0x64, 0x1a, 0xe1, 0x1b, 0x49, 0xb2, + 0x01, 0xeb, 0xd1, 0x71, 0x49, 0x10, 0x01, 0x70, 0xe0, 0x19, 0x40, 0xb2, + 0xd9, 0xf7, 0x32, 0xff, 0x06, 0x99, 0x8a, 0x7c, 0x82, 0x42, 0x02, 0xd2, + 0x12, 0x98, 0x01, 0x21, 0x01, 0x60, 0x50, 0x46, 0xff, 0xf7, 0xf2, 0xf8, + 0x48, 0x44, 0x00, 0xf8, 0x30, 0x7f, 0x04, 0x74, 0xff, 0xf7, 0x0a, 0xba, + 0x9a, 0xf8, 0x03, 0x00, 0x5a, 0x46, 0x41, 0x46, 0xff, 0xf7, 0x10, 0xba, + 0x2d, 0xe9, 0xf8, 0x4f, 0x84, 0xb0, 0x0e, 0x79, 0xdd, 0xf8, 0x38, 0xa0, + 0x04, 0x46, 0x90, 0x46, 0x9b, 0x46, 0xff, 0xf7, 0x32, 0xf9, 0x05, 0x46, + 0x20, 0x46, 0xe6, 0xf7, 0x33, 0xfc, 0x98, 0xf8, 0x84, 0x70, 0x00, 0x21, + 0x8d, 0xf8, 0x08, 0x10, 0x03, 0x91, 0x81, 0x46, 0x6d, 0x42, 0x6a, 0xb2, + 0x51, 0x46, 0x20, 0x46, 0xff, 0xf7, 0x54, 0xf9, 0x8d, 0xf8, 0x08, 0x90, + 0x04, 0xe0, 0x9d, 0xf8, 0x08, 0x10, 0x49, 0x1c, 0x8d, 0xf8, 0x08, 0x10, + 0x9d, 0xf8, 0x08, 0x00, 0x20, 0x28, 0x18, 0xd2, 0x01, 0x46, 0x20, 0x46, + 0xe6, 0xf7, 0x3c, 0xfc, 0x03, 0xa8, 0x01, 0x90, 0x00, 0x97, 0x00, 0x23, + 0xe0, 0x78, 0x32, 0x46, 0x00, 0xf0, 0x23, 0xf8, 0x9d, 0xf8, 0x08, 0x10, + 0x03, 0x9a, 0x49, 0x45, 0x08, 0xbf, 0x82, 0x46, 0x01, 0x46, 0x02, 0xab, + 0x50, 0x46, 0xff, 0xf7, 0x2b, 0xff, 0x01, 0x28, 0xdd, 0xd1, 0x20, 0x46, + 0x9d, 0xf9, 0x08, 0x20, 0x0f, 0x99, 0x10, 0x9c, 0xa2, 0xeb, 0x09, 0x02, + 0x0a, 0x70, 0xff, 0xf7, 0x9b, 0xf8, 0x40, 0x44, 0x9d, 0xf9, 0x08, 0x10, + 0x00, 0xf8, 0x30, 0x1f, 0x9d, 0xf9, 0x08, 0x20, 0x02, 0x74, 0x00, 0x20, + 0x20, 0x60, 0xff, 0xf7, 0x8d, 0xbb, 0x59, 0x46, 0xff, 0xf7, 0xb6, 0xb9, + 0x2d, 0xe9, 0xf0, 0x41, 0x2d, 0xed, 0x04, 0x8b, 0x08, 0xee, 0x90, 0x0a, + 0x0c, 0x46, 0x15, 0x46, 0x9f, 0xed, 0x20, 0x8a, 0xfa, 0xee, 0x65, 0x8a, + 0x00, 0x26, 0xf0, 0xb2, 0x01, 0xf0, 0xa7, 0xfc, 0xff, 0xee, 0x00, 0x0a, + 0x30, 0xee, 0x20, 0x9a, 0x00, 0x27, 0x04, 0xeb, 0x07, 0x18, 0x9f, 0xed, + 0x1a, 0x0a, 0xd8, 0xed, 0x02, 0x0a, 0x79, 0xee, 0x20, 0x0a, 0x78, 0xee, + 0xe0, 0x0a, 0x20, 0xee, 0x80, 0x0a, 0xda, 0xf7, 0xb1, 0xfc, 0xd8, 0xed, + 0x00, 0x0a, 0xf0, 0xee, 0x40, 0x9a, 0x79, 0xee, 0x20, 0x0a, 0x38, 0xee, + 0xe0, 0x0a, 0xd9, 0xf7, 0xa3, 0xfe, 0x06, 0xeb, 0xc7, 0x00, 0x05, 0xeb, + 0x80, 0x01, 0x98, 0xed, 0x03, 0x1a, 0xd1, 0xed, 0x00, 0x0a, 0x20, 0xee, + 0x80, 0x0a, 0x20, 0xee, 0x29, 0x0a, 0x7f, 0x1c, 0x80, 0xee, 0x01, 0x1a, + 0x02, 0x2f, 0x31, 0xee, 0x08, 0x8a, 0xd4, 0xd3, 0x76, 0x1c, 0x08, 0x2e, + 0xc9, 0xd3, 0xb0, 0xee, 0x48, 0x0a, 0xbd, 0xec, 0x04, 0x8b, 0xbd, 0xe8, + 0xf0, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdb, 0x0f, 0x49, 0x40, + 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, 0xd8, 0xb0, 0x89, 0x46, + 0x01, 0x20, 0x65, 0x99, 0x11, 0x90, 0x16, 0x46, 0x08, 0x68, 0x98, 0x46, + 0x42, 0x03, 0x44, 0xbf, 0x00, 0x20, 0x11, 0x90, 0x98, 0xf9, 0x4d, 0x01, + 0x8d, 0xf8, 0x01, 0x00, 0x00, 0x27, 0x9f, 0xed, 0xd6, 0x8a, 0x08, 0xf1, + 0x04, 0x02, 0x02, 0xeb, 0x87, 0x03, 0x38, 0x01, 0x08, 0xa9, 0x0c, 0x18, + 0x93, 0xed, 0x00, 0x0a, 0x20, 0xee, 0x08, 0x0a, 0x08, 0xf1, 0x08, 0x03, + 0x84, 0xed, 0x00, 0x0a, 0x79, 0x42, 0x53, 0xf8, 0x21, 0x20, 0x09, 0xab, + 0x7f, 0x1c, 0x1a, 0x50, 0x08, 0xf1, 0x08, 0x00, 0x00, 0xeb, 0x81, 0x01, + 0xd4, 0xed, 0x00, 0x0a, 0x91, 0xed, 0x00, 0x0a, 0x20, 0xee, 0x08, 0x0a, + 0x84, 0xed, 0x02, 0x0a, 0x9f, 0xed, 0xc5, 0x0a, 0x94, 0xed, 0x02, 0x1a, + 0x30, 0xee, 0xc1, 0x1a, 0x21, 0xee, 0x00, 0x0a, 0xda, 0xf7, 0x44, 0xfc, + 0x01, 0x2f, 0x84, 0xed, 0x03, 0x0a, 0xd0, 0xd9, 0x64, 0x99, 0x00, 0x20, + 0x81, 0xf8, 0x86, 0x00, 0x20, 0x21, 0x9d, 0xf9, 0x01, 0x70, 0x8d, 0xf8, + 0x00, 0x70, 0x12, 0xa8, 0xec, 0xf7, 0x12, 0xf9, 0x20, 0x21, 0x1a, 0xa8, + 0xec, 0xf7, 0x0e, 0xf9, 0x54, 0x21, 0x2d, 0xa8, 0xec, 0xf7, 0x0a, 0xf9, + 0x0b, 0x21, 0x04, 0xa8, 0xec, 0xf7, 0x06, 0xf9, 0x2c, 0x21, 0x22, 0xa8, + 0xec, 0xf7, 0x02, 0xf9, 0x00, 0x22, 0x08, 0xf5, 0xb6, 0x75, 0x03, 0x92, + 0xcd, 0xf8, 0x04, 0x90, 0x02, 0x96, 0x9f, 0xed, 0xae, 0x8a, 0xa8, 0x7c, + 0x00, 0x28, 0x54, 0xd0, 0x6f, 0xf0, 0x1f, 0x04, 0x08, 0xf1, 0x10, 0x02, + 0x08, 0xa9, 0x20, 0xb2, 0xff, 0xf7, 0x3c, 0xff, 0xb4, 0xee, 0x40, 0x8a, + 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, 0xb0, 0xee, 0x40, 0x8a, 0x64, 0x1c, + 0x21, 0x2c, 0xef, 0xdb, 0x85, 0xed, 0x0a, 0x8a, 0x28, 0x68, 0xd0, 0xb9, + 0xa8, 0x7c, 0x02, 0x28, 0x0c, 0xd1, 0x01, 0x98, 0x41, 0x78, 0x00, 0xee, + 0x10, 0x1a, 0xb8, 0xee, 0x40, 0x0a, 0xf2, 0xee, 0x04, 0x0a, 0xc0, 0xee, + 0x20, 0x0a, 0xc5, 0xed, 0x05, 0x0a, 0x2e, 0xe0, 0x9d, 0xf9, 0x01, 0x00, + 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0xc0, 0x0a, 0x88, 0xee, 0x00, 0x0a, + 0x85, 0xed, 0x05, 0x0a, 0x23, 0xe0, 0x01, 0x98, 0x02, 0x9a, 0xc1, 0x78, + 0x00, 0xf0, 0xf2, 0xfa, 0x9f, 0xed, 0x91, 0x1a, 0x00, 0xf0, 0xe7, 0xfa, + 0x71, 0xee, 0x21, 0x1a, 0x00, 0xf0, 0xdc, 0xfa, 0x08, 0xf5, 0xbd, 0x71, + 0x10, 0xee, 0x10, 0x0a, 0xc8, 0x54, 0x9f, 0xed, 0x8b, 0x1a, 0x01, 0x98, + 0x01, 0x79, 0x02, 0x9a, 0x00, 0xf0, 0xde, 0xfa, 0x00, 0xf0, 0xd5, 0xfa, + 0x71, 0xee, 0xc1, 0x1a, 0x00, 0xf0, 0xca, 0xfa, 0x08, 0xf5, 0xbe, 0x71, + 0x10, 0xee, 0x10, 0x0a, 0xc8, 0x54, 0x6f, 0xf0, 0x04, 0x06, 0x01, 0x98, + 0x00, 0xf1, 0x21, 0x01, 0x07, 0x91, 0x0d, 0xf1, 0x48, 0x09, 0x00, 0x24, + 0x1a, 0xa8, 0x10, 0x90, 0x08, 0xf1, 0x10, 0x02, 0x60, 0x1e, 0x06, 0xeb, + 0x40, 0x10, 0x00, 0xf0, 0xcb, 0xfa, 0x10, 0x98, 0x00, 0xeb, 0x84, 0x01, + 0x64, 0x1c, 0x08, 0x2c, 0x81, 0xed, 0x00, 0x0a, 0xee, 0xd3, 0x00, 0x24, + 0xa6, 0xf1, 0x0a, 0x0a, 0x60, 0xe0, 0x42, 0xa8, 0x78, 0xee, 0x68, 0x0a, + 0x00, 0xeb, 0x84, 0x01, 0x30, 0xee, 0x80, 0x0a, 0x81, 0xed, 0x00, 0x0a, + 0x52, 0xe0, 0x4f, 0xf0, 0x00, 0x0b, 0xab, 0xf1, 0x01, 0x00, 0x0a, 0xeb, + 0x40, 0x10, 0x00, 0xf0, 0xab, 0xfa, 0x09, 0xeb, 0x8b, 0x00, 0x0b, 0xf1, + 0x01, 0x0b, 0xbb, 0xf1, 0x08, 0x0f, 0x80, 0xed, 0x00, 0x0a, 0xf0, 0xd3, + 0x12, 0x98, 0x20, 0xf0, 0x00, 0x40, 0x2d, 0xa9, 0x99, 0xed, 0x01, 0x8a, + 0x00, 0xee, 0x10, 0x0a, 0x01, 0xeb, 0x84, 0x02, 0x38, 0xee, 0x40, 0x0a, + 0x82, 0xed, 0x00, 0x0a, 0x02, 0x20, 0x09, 0xeb, 0x80, 0x02, 0x10, 0x9b, + 0x92, 0xed, 0x00, 0x0a, 0x03, 0xeb, 0x80, 0x02, 0x2d, 0xa9, 0xd2, 0xed, + 0x00, 0x0a, 0x01, 0xeb, 0x84, 0x03, 0x30, 0xee, 0x60, 0x0a, 0xb0, 0xee, + 0xc0, 0x0a, 0x93, 0xed, 0x00, 0x1a, 0x01, 0xeb, 0x84, 0x01, 0x40, 0x1c, + 0x31, 0xee, 0x40, 0x1a, 0x08, 0x28, 0x81, 0xed, 0x00, 0x1a, 0xe4, 0xd3, + 0xb6, 0xb9, 0xaa, 0xf1, 0x20, 0x00, 0x00, 0xf0, 0x73, 0xfa, 0x0a, 0xf1, + 0x20, 0x00, 0xf0, 0xee, 0x40, 0x8a, 0x00, 0xf0, 0x6d, 0xfa, 0x07, 0x99, + 0x88, 0x7a, 0x00, 0x28, 0xab, 0xd1, 0x42, 0xa9, 0x78, 0xee, 0x28, 0x0a, + 0x01, 0xeb, 0x84, 0x00, 0x30, 0xee, 0xc0, 0x0a, 0x80, 0xed, 0x00, 0x0a, + 0x64, 0x1c, 0xe4, 0xb2, 0x0a, 0xf1, 0x01, 0x0a, 0x06, 0xf1, 0x0b, 0x00, + 0x82, 0x45, 0xa4, 0xdb, 0x9f, 0xed, 0x3f, 0x0a, 0xdf, 0xed, 0x3e, 0x0a, + 0x00, 0x20, 0x2d, 0xa9, 0x01, 0xeb, 0x80, 0x02, 0x92, 0xed, 0x00, 0x1a, + 0xb5, 0xee, 0x40, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0xc8, 0xbf, 0x30, 0xee, + 0x01, 0x0a, 0x40, 0x1c, 0x0b, 0x28, 0xf1, 0xd3, 0x0a, 0x20, 0x01, 0xeb, + 0x80, 0x02, 0x92, 0xed, 0x00, 0x1a, 0xb5, 0xee, 0x40, 0x1a, 0xf1, 0xee, + 0x10, 0xfa, 0xc8, 0xbf, 0x70, 0xee, 0x81, 0x0a, 0x40, 0x1c, 0x15, 0x28, + 0xf1, 0xd3, 0x03, 0x99, 0xf4, 0xee, 0x40, 0x0a, 0x22, 0xa8, 0xf1, 0xee, + 0x10, 0xfa, 0x00, 0xeb, 0x81, 0x02, 0xb8, 0xbf, 0xb0, 0xee, 0x60, 0x0a, + 0x82, 0xed, 0x00, 0x0a, 0x04, 0xa8, 0x03, 0x99, 0x46, 0x54, 0x76, 0x1c, + 0x03, 0x98, 0x40, 0x1c, 0xc0, 0xb2, 0x06, 0x2e, 0x03, 0x90, 0xff, 0xf6, + 0x4a, 0xaf, 0x9d, 0xed, 0x22, 0x0a, 0x00, 0x26, 0x01, 0x20, 0x22, 0xa9, + 0x01, 0xeb, 0x80, 0x02, 0xd2, 0xed, 0x00, 0x0a, 0xb4, 0xee, 0x60, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xbf, 0xb0, 0xee, 0x60, 0x0a, 0x06, 0x46, + 0x40, 0x1c, 0x0b, 0x28, 0xf0, 0xd3, 0x02, 0x99, 0x0a, 0x79, 0x08, 0xf2, + 0x71, 0x14, 0x00, 0x20, 0xa0, 0x54, 0x68, 0x72, 0x28, 0x71, 0x08, 0xf2, + 0x77, 0x13, 0x02, 0x99, 0x0a, 0x79, 0x7f, 0x20, 0x98, 0x54, 0x9f, 0xed, + 0x12, 0x1a, 0x00, 0x20, 0x68, 0x73, 0xa8, 0x72, 0x9f, 0xed, 0x0e, 0x0a, + 0x01, 0x98, 0x41, 0x7f, 0x07, 0x98, 0x00, 0xee, 0x90, 0x1a, 0x81, 0x7a, + 0xf8, 0xee, 0x60, 0x0a, 0x01, 0x29, 0xc0, 0xee, 0x81, 0x0a, 0x13, 0xd1, + 0x01, 0x98, 0xc1, 0x7e, 0x02, 0x98, 0x02, 0x79, 0xa1, 0x54, 0x01, 0x98, + 0x81, 0x7e, 0x02, 0x98, 0x02, 0x79, 0x99, 0x54, 0x86, 0xe0, 0x00, 0xbf, + 0x00, 0x00, 0x00, 0x3d, 0xdb, 0x0f, 0x49, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc8, 0x42, 0x02, 0x9a, 0x00, 0x21, 0x6f, 0xf0, 0x09, 0x0c, + 0x0d, 0xf1, 0x02, 0x0e, 0x0d, 0xf1, 0x0c, 0x09, 0x42, 0xa8, 0x00, 0xeb, + 0x81, 0x00, 0xbc, 0xf1, 0x0a, 0x0f, 0x90, 0xed, 0x00, 0x1a, 0x31, 0xee, + 0x40, 0x0a, 0x07, 0xda, 0x43, 0xa8, 0x00, 0xeb, 0x81, 0x00, 0xd0, 0xed, + 0x00, 0x1a, 0x71, 0xee, 0xc1, 0x1a, 0x01, 0xe0, 0xdf, 0xed, 0xd0, 0x1a, + 0x39, 0xb1, 0xf4, 0xee, 0x60, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, + 0xbc, 0xf1, 0x00, 0x0f, 0x11, 0xd5, 0x68, 0x7b, 0xb6, 0xee, 0x00, 0x0a, + 0x31, 0xee, 0x00, 0x0a, 0x00, 0xf0, 0x01, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, + 0x10, 0xee, 0x10, 0xba, 0x09, 0xf8, 0x0a, 0xb0, 0x0e, 0xf8, 0x0a, 0xc0, + 0x40, 0x1c, 0x68, 0x73, 0x1b, 0xe0, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x02, 0xd5, 0xbc, 0xf1, 0x00, 0x0f, 0x02, 0xd5, 0xbc, 0xf1, + 0x0a, 0x0f, 0x10, 0xd1, 0x68, 0x7a, 0x70, 0xb9, 0xb6, 0xee, 0x00, 0x0a, + 0x31, 0xee, 0x00, 0x0a, 0x10, 0x79, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, + 0x10, 0xaa, 0x04, 0xf8, 0x00, 0xa0, 0x85, 0xf8, 0x04, 0xc0, 0x01, 0x20, + 0x68, 0x72, 0x0c, 0xf1, 0x01, 0x0c, 0x49, 0x1c, 0xbc, 0xf1, 0x0b, 0x0f, + 0xb0, 0xee, 0x41, 0x0a, 0xc9, 0xb2, 0xab, 0xdb, 0x02, 0x92, 0x68, 0x7b, + 0x92, 0xf8, 0x04, 0xc0, 0x00, 0xf0, 0x01, 0x01, 0xc1, 0xf1, 0x01, 0x01, + 0x01, 0x28, 0xc9, 0xb2, 0x04, 0xeb, 0x0c, 0x02, 0x0e, 0xd9, 0x92, 0xf9, + 0x00, 0xa0, 0x19, 0xf9, 0x01, 0x00, 0xdd, 0xf8, 0x04, 0xc0, 0xaa, 0xeb, + 0x00, 0x0a, 0x9c, 0xf9, 0x1c, 0x00, 0x82, 0x45, 0xbc, 0xbf, 0xc1, 0xf1, + 0x01, 0x01, 0xc9, 0xb2, 0x19, 0xf8, 0x01, 0x00, 0x90, 0x71, 0x1e, 0xf8, + 0x01, 0x10, 0xa9, 0x72, 0xf6, 0xb2, 0x65, 0x98, 0x00, 0x68, 0x01, 0x04, + 0x1d, 0xd5, 0x95, 0xf9, 0x41, 0x10, 0x95, 0xf9, 0x40, 0x20, 0x00, 0xee, + 0x10, 0x1a, 0x00, 0xee, 0x90, 0x2a, 0xb8, 0xee, 0xc0, 0x0a, 0xf8, 0xee, + 0xe0, 0x0a, 0xc0, 0xee, 0x20, 0x0a, 0xb0, 0xee, 0xe0, 0x0a, 0xb5, 0xee, + 0x00, 0x1a, 0xb4, 0xee, 0x41, 0x0a, 0x00, 0x0c, 0xf1, 0xee, 0x10, 0xfa, + 0x00, 0xf0, 0x03, 0x00, 0x03, 0xd5, 0x04, 0xa9, 0x8a, 0x5d, 0x10, 0x1a, + 0x88, 0x55, 0x04, 0xa8, 0x01, 0x99, 0x80, 0x57, 0x4e, 0x7a, 0x7a, 0x1c, + 0xb1, 0x06, 0x09, 0xd4, 0x01, 0x9e, 0x96, 0xf9, 0x1e, 0x10, 0x81, 0x42, + 0xb8, 0xbf, 0x17, 0x46, 0xc8, 0x42, 0x2d, 0xda, 0x7f, 0x1e, 0x2b, 0xe0, + 0x01, 0x99, 0x91, 0xf9, 0x1f, 0x10, 0x88, 0x42, 0xc8, 0xbf, 0x08, 0x46, + 0x49, 0x42, 0x88, 0x42, 0xb8, 0xbf, 0x08, 0x46, 0x98, 0xf8, 0x02, 0x10, + 0x40, 0x18, 0x88, 0xf8, 0x02, 0x00, 0x40, 0xb2, 0x01, 0x9e, 0x96, 0xf9, + 0x1e, 0x10, 0x88, 0x42, 0x03, 0xdb, 0x00, 0x20, 0x17, 0x46, 0x88, 0xf8, + 0x02, 0x00, 0x01, 0x98, 0x90, 0xf9, 0x1e, 0x10, 0x98, 0xf9, 0x02, 0x00, + 0x49, 0x42, 0x81, 0x42, 0x03, 0xdb, 0x00, 0x21, 0x7f, 0x1e, 0x88, 0xf8, + 0x02, 0x10, 0x01, 0x98, 0x41, 0x7a, 0x48, 0x06, 0x44, 0xbf, 0x00, 0x21, + 0x88, 0xf8, 0x02, 0x10, 0x02, 0x98, 0x01, 0x79, 0x07, 0x98, 0x0c, 0x44, + 0x01, 0x78, 0x94, 0xf9, 0x00, 0x60, 0x71, 0xb3, 0xdd, 0xf8, 0x04, 0xc0, + 0x28, 0x68, 0x9c, 0xf8, 0x21, 0xe0, 0x01, 0x46, 0x71, 0x45, 0x88, 0xbf, + 0x71, 0x46, 0x00, 0xee, 0x10, 0x1a, 0xb8, 0xee, 0x40, 0x0a, 0x08, 0xb9, + 0xb7, 0xee, 0x00, 0x0a, 0x94, 0xf9, 0x02, 0x00, 0x00, 0x28, 0x0c, 0xbf, + 0x00, 0xee, 0x90, 0x6a, 0x00, 0xee, 0x90, 0x0a, 0xf8, 0xee, 0xe0, 0x0a, + 0x80, 0xee, 0x80, 0x1a, 0x70, 0xee, 0xc1, 0x0a, 0x01, 0xee, 0x10, 0x6a, + 0xb8, 0xee, 0xc1, 0x1a, 0x81, 0xee, 0x00, 0x0a, 0xb6, 0xee, 0x00, 0x1a, + 0x30, 0xee, 0x01, 0x0a, 0x30, 0xee, 0x80, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, + 0x10, 0xee, 0x10, 0x0a, 0xa0, 0x70, 0x11, 0x98, 0xf8, 0xb1, 0x02, 0x99, + 0x0c, 0x79, 0x08, 0xf2, 0x73, 0x10, 0x06, 0x5d, 0x4c, 0x78, 0x06, 0x55, + 0x02, 0x98, 0x01, 0x79, 0x5c, 0x5c, 0x41, 0x78, 0x5c, 0x54, 0x08, 0xf5, + 0xbd, 0x73, 0x02, 0x98, 0x01, 0x79, 0x5b, 0x5c, 0x02, 0x99, 0x4c, 0x78, + 0x08, 0xf5, 0xbd, 0x70, 0x03, 0x55, 0x08, 0xf5, 0xbe, 0x70, 0x02, 0x99, + 0x0b, 0x79, 0xc0, 0x5c, 0x02, 0x9b, 0x5c, 0x78, 0x08, 0xf5, 0xbe, 0x71, + 0x08, 0x55, 0x02, 0x9b, 0x5c, 0x78, 0x01, 0x98, 0x98, 0xf8, 0xe0, 0xc1, + 0x90, 0xf9, 0x1b, 0x10, 0x90, 0xf9, 0x1a, 0x00, 0x44, 0x44, 0x04, 0xf2, + 0x73, 0x14, 0x94, 0xf9, 0x07, 0x30, 0x94, 0xf9, 0x00, 0x60, 0x99, 0x42, + 0xa8, 0xbf, 0x19, 0x46, 0x94, 0xf9, 0x09, 0x30, 0x83, 0x42, 0xa8, 0xbf, + 0x18, 0x46, 0x94, 0xf9, 0x04, 0x30, 0x07, 0x9c, 0xa4, 0x7a, 0x01, 0x2c, + 0x04, 0xbf, 0x7f, 0xb2, 0x7f, 0x42, 0xbc, 0xf1, 0x07, 0x0f, 0x0f, 0xbf, + 0x98, 0xf9, 0x4d, 0x71, 0xdd, 0xf8, 0x04, 0x80, 0x98, 0xf9, 0x1c, 0xc0, + 0xbc, 0xf1, 0x7f, 0x0f, 0x24, 0xd0, 0x95, 0xf9, 0x0a, 0x50, 0x15, 0xf1, + 0x0a, 0x0f, 0x01, 0x9d, 0xed, 0x79, 0x0c, 0xbf, 0x9e, 0x46, 0x0c, 0xeb, + 0x03, 0x0e, 0xed, 0x07, 0xa6, 0xeb, 0x0c, 0x08, 0x48, 0xbf, 0x4f, 0xf0, + 0x00, 0x0e, 0x09, 0xd4, 0xf5, 0x1a, 0xb5, 0xeb, 0x4c, 0x0f, 0x05, 0xda, + 0x9e, 0x19, 0x06, 0xeb, 0xd6, 0x76, 0x4f, 0xea, 0x66, 0x08, 0xc6, 0x46, + 0x4f, 0xfa, 0x88, 0xf3, 0x99, 0x42, 0xc8, 0xbf, 0x19, 0x46, 0x4f, 0xfa, + 0x8e, 0xf3, 0x98, 0x42, 0xb8, 0xbf, 0x18, 0x46, 0x7f, 0xb2, 0x8f, 0x42, + 0xc8, 0xbf, 0x0f, 0x46, 0x64, 0x99, 0x87, 0x42, 0xb8, 0xbf, 0x07, 0x46, + 0x01, 0x2c, 0x91, 0xf9, 0x86, 0x00, 0x08, 0xbf, 0x7f, 0x42, 0x00, 0x28, + 0x1c, 0xbf, 0x91, 0xf9, 0x46, 0x10, 0x01, 0x29, 0x0f, 0xd1, 0x9d, 0xf9, + 0x01, 0x10, 0x78, 0xb2, 0x88, 0x42, 0x05, 0xda, 0x9d, 0xf8, 0x00, 0x00, + 0x41, 0x1e, 0x8d, 0xf8, 0x00, 0x10, 0x04, 0xe0, 0x7f, 0xb2, 0xb9, 0x42, + 0xb8, 0xbf, 0x8d, 0xf8, 0x00, 0x20, 0x9d, 0xf9, 0x00, 0x00, 0x40, 0x28, + 0xa8, 0xbf, 0x3f, 0x20, 0x04, 0xda, 0x10, 0xf1, 0x3f, 0x0f, 0x03, 0xda, + 0x6f, 0xf0, 0x3e, 0x00, 0x8d, 0xf8, 0x00, 0x00, 0x9d, 0xf9, 0x00, 0x00, + 0x58, 0xb0, 0xf5, 0xe1, 0x00, 0x00, 0x00, 0x00, 0xb6, 0xee, 0x00, 0x2a, + 0x00, 0xee, 0x21, 0x2a, 0xbd, 0xee, 0xc2, 0x0a, 0x70, 0x47, 0x80, 0xee, + 0x81, 0x1a, 0xf7, 0xee, 0x00, 0x1a, 0x88, 0xee, 0x00, 0x0a, 0x70, 0x47, + 0x95, 0xed, 0x05, 0x0a, 0x13, 0x79, 0x00, 0xee, 0x90, 0x1a, 0xf8, 0xee, + 0x60, 0x0a, 0x70, 0x47, 0x08, 0xf1, 0x10, 0x02, 0x08, 0xa9, 0x00, 0xb2, + 0x0e, 0xe4, 0x00, 0x00, 0x2d, 0xe9, 0xfc, 0x4b, 0x2d, 0xed, 0x02, 0x8b, + 0x8c, 0xb0, 0x80, 0x46, 0x0e, 0x46, 0x17, 0x46, 0x1c, 0x46, 0x04, 0xa8, + 0x64, 0xa1, 0x20, 0x22, 0xd9, 0xf7, 0x98, 0xff, 0x00, 0x25, 0xb5, 0xee, + 0x00, 0x8a, 0x0d, 0xf1, 0x10, 0x09, 0x94, 0xf8, 0x4c, 0x01, 0xa8, 0xb1, + 0x04, 0xf1, 0x0c, 0x02, 0x31, 0x7a, 0x00, 0xee, 0x10, 0x0a, 0x50, 0x5d, + 0x41, 0x18, 0x49, 0xb2, 0x04, 0xeb, 0x81, 0x03, 0x20, 0x1d, 0xb8, 0xee, + 0x40, 0x0a, 0xd3, 0xed, 0x4a, 0x0a, 0x00, 0xeb, 0x85, 0x01, 0x80, 0xee, + 0x80, 0x0a, 0x81, 0xed, 0x00, 0x0a, 0x02, 0xe0, 0x22, 0x1d, 0x42, 0xf8, + 0x25, 0x00, 0x04, 0xf1, 0x0c, 0x02, 0x96, 0xf9, 0x08, 0x10, 0x53, 0x57, + 0x59, 0x18, 0x0c, 0x20, 0x41, 0x43, 0x03, 0x20, 0xc9, 0xb2, 0x04, 0xf1, + 0x10, 0x02, 0x00, 0xeb, 0xc5, 0x03, 0x02, 0xeb, 0x83, 0x03, 0x42, 0x18, + 0x04, 0xeb, 0x42, 0x0b, 0x40, 0x1c, 0xbb, 0xf9, 0x50, 0x20, 0x00, 0xee, + 0x10, 0x2a, 0xb8, 0xee, 0xc0, 0x0a, 0x08, 0x28, 0x83, 0xed, 0x00, 0x0a, + 0xeb, 0xd3, 0x04, 0xeb, 0x41, 0x00, 0xb0, 0xf9, 0x60, 0x10, 0xb0, 0xf9, + 0x62, 0xe0, 0xb0, 0xf9, 0x64, 0x20, 0xb0, 0xf9, 0x66, 0x30, 0xad, 0xf8, + 0x06, 0x10, 0xad, 0xf8, 0x04, 0xe0, 0xad, 0xf8, 0x02, 0x20, 0xad, 0xf8, + 0x00, 0x30, 0x40, 0x46, 0x94, 0xf8, 0x4c, 0x11, 0x8d, 0xf8, 0x08, 0x10, + 0x39, 0x79, 0xe6, 0xf7, 0x56, 0xf8, 0x8d, 0xf8, 0x09, 0x00, 0x68, 0x46, + 0x00, 0xf0, 0x96, 0xf8, 0x9d, 0xf9, 0x0a, 0x10, 0x04, 0xf1, 0x10, 0x02, + 0x00, 0xee, 0x10, 0x1a, 0x02, 0xeb, 0x45, 0x12, 0xb8, 0xee, 0xc0, 0x0a, + 0x82, 0xed, 0x00, 0x0a, 0x04, 0xeb, 0x45, 0x10, 0x9d, 0xf9, 0x0b, 0x10, + 0x00, 0xee, 0x10, 0x1a, 0xb8, 0xee, 0xc0, 0x0a, 0x80, 0xed, 0x05, 0x0a, + 0x04, 0xf1, 0x10, 0x03, 0x9d, 0xf9, 0x0c, 0x10, 0x00, 0xee, 0x10, 0x1a, + 0xb8, 0xee, 0xc0, 0x0a, 0x80, 0xed, 0x06, 0x0a, 0x00, 0x20, 0x00, 0xeb, + 0xc5, 0x01, 0x09, 0xeb, 0x80, 0x02, 0x40, 0x1c, 0x92, 0xed, 0x00, 0x0a, + 0x03, 0xeb, 0x81, 0x02, 0x20, 0xee, 0x08, 0x0a, 0xd2, 0xed, 0x00, 0x0a, + 0x04, 0xf1, 0x10, 0x02, 0x02, 0xeb, 0x81, 0x01, 0x60, 0xee, 0x20, 0x0a, + 0x03, 0x28, 0xc1, 0xed, 0x00, 0x0a, 0xe8, 0xd3, 0x03, 0x21, 0x01, 0xeb, + 0xc5, 0x00, 0x94, 0xf8, 0x4c, 0x21, 0x04, 0xf1, 0x10, 0x03, 0x00, 0xee, + 0x10, 0x2a, 0x03, 0xeb, 0x80, 0x02, 0xb8, 0xee, 0x40, 0x0a, 0xd2, 0xed, + 0x00, 0x0a, 0x04, 0xf1, 0x10, 0x02, 0x02, 0xeb, 0x80, 0x03, 0x80, 0xee, + 0x80, 0x0a, 0x83, 0xed, 0x00, 0x0a, 0x09, 0xeb, 0x81, 0x03, 0x02, 0xeb, + 0x80, 0x00, 0xd3, 0xed, 0x00, 0x0a, 0x60, 0xee, 0x88, 0x0a, 0x49, 0x1c, + 0x20, 0xee, 0x80, 0x0a, 0x08, 0x29, 0x80, 0xed, 0x00, 0x0a, 0xda, 0xd3, + 0x6d, 0x1c, 0x02, 0x2d, 0xff, 0xf4, 0x45, 0xaf, 0x0c, 0xb0, 0xbd, 0xec, + 0x02, 0x8b, 0xbd, 0xe8, 0xf3, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, + 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x40, 0xc0, 0xb2, 0x01, 0xee, 0x10, 0x0a, 0x01, 0xee, + 0x90, 0x1a, 0xb5, 0xee, 0x40, 0x0a, 0xb8, 0xee, 0x41, 0x1a, 0xf8, 0xee, + 0x61, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x21, 0xee, 0x21, 0x1a, 0x4c, 0xbf, + 0xfe, 0xee, 0x00, 0x0a, 0xf6, 0xee, 0x00, 0x0a, 0x80, 0xee, 0x01, 0x0a, + 0x30, 0xee, 0x20, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, + 0x40, 0xb2, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, + 0x06, 0x46, 0x84, 0xb0, 0xb6, 0xf9, 0x06, 0x10, 0x03, 0x91, 0xb6, 0xf9, + 0x04, 0x20, 0x03, 0x99, 0x02, 0x92, 0x30, 0x7a, 0xb6, 0xf9, 0x02, 0x30, + 0xb6, 0xf9, 0x00, 0xe0, 0x8d, 0xf8, 0x00, 0x00, 0x5b, 0x42, 0xc0, 0xeb, + 0x80, 0x10, 0x81, 0x42, 0x02, 0x99, 0xb4, 0xbf, 0x00, 0x24, 0x01, 0x24, + 0x81, 0x42, 0x1b, 0xb2, 0xb4, 0xbf, 0x00, 0x25, 0x01, 0x25, 0xce, 0xf1, + 0x00, 0x0e, 0x83, 0x42, 0x0f, 0xfa, 0x8e, 0xfe, 0x03, 0xeb, 0x0e, 0x01, + 0xad, 0xf8, 0x02, 0x10, 0xb4, 0xbf, 0x4f, 0xf0, 0x00, 0x08, 0x4f, 0xf0, + 0x01, 0x08, 0xbd, 0xf8, 0x02, 0xc0, 0x02, 0x99, 0x8c, 0x44, 0x03, 0x99, + 0x86, 0x45, 0x61, 0x44, 0xb4, 0xbf, 0x4f, 0xf0, 0x00, 0x09, 0x4f, 0xf0, + 0x01, 0x09, 0x0f, 0xfa, 0x81, 0xfc, 0xae, 0xeb, 0x03, 0x01, 0xad, 0xf8, + 0x06, 0x10, 0x28, 0x19, 0x02, 0x99, 0x00, 0xee, 0x10, 0xca, 0xbd, 0xf8, + 0x06, 0xc0, 0x8c, 0x44, 0x03, 0x99, 0xac, 0xeb, 0x01, 0x01, 0x40, 0x44, + 0xb8, 0xee, 0xc0, 0x8a, 0x0f, 0xfa, 0x81, 0xfc, 0x48, 0x44, 0x00, 0xee, + 0x10, 0xca, 0xc0, 0xb2, 0xb8, 0xee, 0xc0, 0x0a, 0xa8, 0xb9, 0x00, 0xf0, + 0x87, 0xf8, 0x00, 0xf0, 0x7f, 0xf8, 0xff, 0xf7, 0x85, 0xff, 0xf0, 0x72, + 0xbd, 0xf8, 0x02, 0x40, 0x02, 0x9b, 0x03, 0x9a, 0x31, 0x7a, 0xe4, 0x1a, + 0xa4, 0x1a, 0x24, 0xb2, 0x00, 0xee, 0x10, 0x4a, 0x04, 0x20, 0x00, 0xf0, + 0x7a, 0xf8, 0x00, 0x27, 0x65, 0xe0, 0x03, 0x99, 0x59, 0x1a, 0xad, 0xf8, + 0x04, 0x10, 0x01, 0x28, 0x02, 0x99, 0xae, 0xeb, 0x01, 0x01, 0xad, 0xf8, + 0x02, 0x10, 0x3d, 0xd1, 0x02, 0x98, 0x1b, 0x18, 0x34, 0xb1, 0xbd, 0xf9, + 0x02, 0xb0, 0xbd, 0xf9, 0x06, 0x20, 0x9a, 0x46, 0x03, 0x27, 0x1c, 0xe0, + 0x03, 0x98, 0x86, 0x44, 0x35, 0xb1, 0xbd, 0xf9, 0x04, 0xb0, 0xbd, 0xf9, + 0x06, 0x20, 0xf2, 0x46, 0x04, 0x27, 0x12, 0xe0, 0x02, 0x99, 0x08, 0x1a, + 0xb8, 0xf1, 0x00, 0x0f, 0x05, 0xd0, 0xbd, 0xf9, 0x02, 0xb0, 0xf2, 0x46, + 0x02, 0x46, 0x01, 0x27, 0x07, 0xe0, 0xb9, 0xf1, 0x00, 0x0f, 0x04, 0xd0, + 0xbd, 0xf9, 0x04, 0xb0, 0x9a, 0x46, 0x02, 0x46, 0x02, 0x27, 0x12, 0xb2, + 0x9d, 0xf8, 0x00, 0x10, 0x00, 0xee, 0x10, 0x2a, 0x00, 0xf0, 0x3e, 0xf8, + 0xb0, 0x72, 0x0f, 0xfa, 0x8a, 0xfa, 0x31, 0x7a, 0x00, 0xee, 0x10, 0xaa, + 0x00, 0xf0, 0x36, 0xf8, 0xf0, 0x72, 0x0f, 0xfa, 0x8b, 0xfb, 0x31, 0x7a, + 0x02, 0x20, 0x00, 0xee, 0x10, 0xba, 0x17, 0xe0, 0x00, 0xf0, 0x28, 0xf8, + 0x00, 0xf0, 0x20, 0xf8, 0x07, 0x27, 0xff, 0xf7, 0x25, 0xff, 0x58, 0xea, + 0x04, 0x04, 0xf0, 0x72, 0x03, 0xd1, 0x31, 0x7a, 0xbd, 0xf9, 0x04, 0x20, + 0x05, 0xe0, 0x59, 0xea, 0x05, 0x05, 0x08, 0xd1, 0x31, 0x7a, 0xbd, 0xf9, + 0x02, 0x20, 0x02, 0x20, 0x00, 0xee, 0x10, 0x2a, 0x00, 0xf0, 0x15, 0xf8, + 0x01, 0xe0, 0x96, 0xf9, 0x09, 0x00, 0x30, 0x73, 0x04, 0xb0, 0xf8, 0xb2, + 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, 0xb0, 0x72, 0x04, 0x20, + 0x31, 0x7a, 0xb0, 0xee, 0x48, 0x0a, 0x70, 0x47, 0x9d, 0xf8, 0x00, 0x10, + 0x04, 0x20, 0xfd, 0xe6, 0x02, 0x20, 0xb8, 0xee, 0xc0, 0x0a, 0xf9, 0xe6, + 0xf0, 0xb5, 0x9d, 0xf9, 0x18, 0x00, 0x91, 0xf9, 0x08, 0x10, 0x05, 0x9a, + 0x41, 0x18, 0x0c, 0x20, 0x41, 0x43, 0x00, 0x20, 0x50, 0xfa, 0x81, 0xf4, + 0x03, 0xeb, 0x44, 0x04, 0x16, 0x18, 0xb4, 0xf8, 0x50, 0x50, 0x96, 0xf9, + 0x2c, 0x70, 0x40, 0x1c, 0xef, 0x19, 0x0c, 0x28, 0xa4, 0xf8, 0x50, 0x70, + 0xf0, 0xd3, 0xf0, 0xbd, 0x2d, 0xe9, 0xfa, 0x4f, 0xad, 0xf5, 0x63, 0x7d, + 0x00, 0x21, 0x83, 0xf8, 0x31, 0x12, 0x91, 0x46, 0x9d, 0xf8, 0xc0, 0x13, + 0x10, 0x91, 0x01, 0x29, 0xe3, 0x99, 0x8c, 0xbf, 0xcb, 0x8a, 0x8b, 0x8a, + 0xad, 0xf8, 0x12, 0x30, 0x80, 0x46, 0xe4, 0x99, 0x4f, 0xf4, 0x0d, 0x72, + 0x56, 0xa8, 0xd9, 0xf7, 0x89, 0xfd, 0xee, 0x99, 0x8c, 0x22, 0x11, 0xa8, + 0xd9, 0xf7, 0x84, 0xfd, 0xe3, 0x98, 0x00, 0xf1, 0x28, 0x01, 0x0c, 0x91, + 0x0d, 0xa8, 0xca, 0x79, 0x41, 0x46, 0xeb, 0xf7, 0x39, 0xff, 0x87, 0x21, + 0x34, 0xa8, 0xeb, 0xf7, 0x91, 0xfb, 0x00, 0x20, 0x06, 0x90, 0x05, 0xa9, + 0x0f, 0xf2, 0xf4, 0x30, 0x02, 0x68, 0x0a, 0x60, 0x48, 0x46, 0xeb, 0xf7, + 0x3a, 0xfc, 0x8d, 0xf8, 0x1d, 0x00, 0x8d, 0xf8, 0x21, 0x80, 0x06, 0x20, + 0x8d, 0xf8, 0x1f, 0x00, 0x00, 0x25, 0x99, 0xf8, 0x03, 0x00, 0x50, 0xb1, + 0x9d, 0xf8, 0xbc, 0x03, 0x01, 0x90, 0x00, 0x95, 0x00, 0xf0, 0xf0, 0xf9, + 0x00, 0x22, 0xc9, 0xb2, 0x40, 0x46, 0xd9, 0xf7, 0x94, 0xfb, 0x99, 0xf8, + 0x04, 0x10, 0x40, 0x46, 0xe5, 0xf7, 0x31, 0xfe, 0x8d, 0xf8, 0x0d, 0x00, + 0x1c, 0xaf, 0x99, 0xf8, 0x09, 0x00, 0xc0, 0xf3, 0x40, 0x00, 0x0f, 0x90, + 0x4b, 0x46, 0x38, 0x7f, 0x40, 0x1c, 0x38, 0x77, 0x8d, 0xf8, 0x0c, 0x50, + 0x11, 0xa9, 0xe4, 0x9a, 0x40, 0x46, 0x00, 0xf0, 0x7a, 0xff, 0x11, 0xaa, + 0x49, 0x46, 0x40, 0x46, 0xeb, 0xf7, 0x58, 0xfb, 0xad, 0xf8, 0x10, 0x50, + 0x00, 0x24, 0xad, 0xf8, 0x0e, 0x50, 0x04, 0xe0, 0xbd, 0xf8, 0x0e, 0x00, + 0x40, 0x1c, 0xad, 0xf8, 0x0e, 0x00, 0xbd, 0xf8, 0x0e, 0x00, 0xbd, 0xf8, + 0x12, 0x10, 0x88, 0x42, 0x80, 0xf0, 0x15, 0x81, 0x00, 0x20, 0x78, 0x86, + 0x82, 0x46, 0xbd, 0xf8, 0x10, 0x10, 0x49, 0x1c, 0xad, 0xf8, 0x10, 0x10, + 0x4f, 0xf0, 0x01, 0x0b, 0x40, 0xe0, 0x00, 0x2c, 0x08, 0xbf, 0x00, 0x2d, + 0x40, 0xf0, 0x92, 0x80, 0xc6, 0xbb, 0xbd, 0xf8, 0x68, 0x60, 0xe3, 0x98, + 0x42, 0x7a, 0xd3, 0x08, 0x03, 0xf0, 0x01, 0x03, 0x83, 0xf0, 0x01, 0x03, + 0x91, 0x08, 0x01, 0xf0, 0x01, 0x01, 0x81, 0xf0, 0x01, 0x01, 0x10, 0x09, + 0x52, 0x08, 0x02, 0xf0, 0x01, 0x02, 0x82, 0xf0, 0x01, 0x02, 0x16, 0xfb, + 0x02, 0xf2, 0xad, 0xf8, 0x68, 0x20, 0x00, 0xf0, 0x01, 0x00, 0xbd, 0xf8, + 0x6a, 0x20, 0x12, 0xfb, 0x03, 0xf2, 0xad, 0xf8, 0x6a, 0x20, 0x80, 0xf0, + 0x01, 0x00, 0xbd, 0xf8, 0x6c, 0x20, 0x12, 0xfb, 0x01, 0xf1, 0xad, 0xf8, + 0x6c, 0x10, 0x11, 0xab, 0xbd, 0xf8, 0x6e, 0x10, 0x11, 0xfb, 0x00, 0xf0, + 0xad, 0xf8, 0x6e, 0x00, 0x5f, 0xfa, 0x8b, 0xf1, 0xe3, 0x98, 0xb0, 0xf9, + 0x10, 0x20, 0x40, 0x46, 0xeb, 0xf7, 0x43, 0xfd, 0x9d, 0xf8, 0x08, 0xa0, + 0x0b, 0xf1, 0x01, 0x0b, 0x10, 0x99, 0x5f, 0xfa, 0x8b, 0xf0, 0x49, 0x1c, + 0x88, 0x42, 0x53, 0xd2, 0x5f, 0xfa, 0x8b, 0xf1, 0x0a, 0xf1, 0x01, 0x00, + 0x01, 0x29, 0x8d, 0xf8, 0x08, 0x00, 0x05, 0xad, 0x2e, 0xd1, 0x00, 0x20, + 0x8d, 0xf8, 0x1e, 0x00, 0x00, 0x26, 0x00, 0xf0, 0x7a, 0xf9, 0xf0, 0xb2, + 0x04, 0x28, 0xfa, 0xd3, 0x00, 0xf0, 0x69, 0xf9, 0x06, 0x46, 0x97, 0xf9, + 0x1a, 0x00, 0x08, 0xb9, 0x00, 0xf0, 0x4b, 0xf9, 0xd9, 0xf7, 0x89, 0xf8, + 0x00, 0xf0, 0x52, 0xf9, 0x08, 0xb1, 0x01, 0x24, 0x03, 0xe0, 0x00, 0x2c, + 0x08, 0xbf, 0x00, 0x2d, 0x08, 0xd0, 0xbd, 0xf8, 0x12, 0x00, 0xad, 0xf8, + 0x0e, 0x00, 0x9d, 0xf8, 0xc0, 0x03, 0x00, 0xf1, 0x01, 0x0b, 0xc9, 0xe7, + 0x00, 0x2e, 0xc7, 0xd1, 0xe3, 0x98, 0xb0, 0xf9, 0x10, 0x10, 0x11, 0xaa, + 0x40, 0x46, 0xeb, 0xf7, 0x6e, 0xfd, 0xbd, 0xe7, 0x8d, 0xf8, 0x1e, 0xb0, + 0x00, 0x26, 0x00, 0xf0, 0x4c, 0xf9, 0xf0, 0xb2, 0x04, 0x28, 0xfa, 0xd3, + 0x00, 0xf0, 0x3b, 0xf9, 0x06, 0x46, 0x97, 0xf9, 0x1a, 0x00, 0x08, 0xb9, + 0x00, 0xf0, 0x1d, 0xf9, 0xd9, 0xf7, 0x5b, 0xf8, 0x00, 0xf0, 0x24, 0xf9, + 0x00, 0x28, 0x3f, 0xf4, 0x6a, 0xaf, 0x01, 0x24, 0xbd, 0xf8, 0x12, 0x00, + 0xad, 0xf8, 0x0e, 0x00, 0xbd, 0xf8, 0x10, 0x00, 0xb8, 0x81, 0x34, 0xb1, + 0xee, 0x99, 0xe4, 0x9b, 0x00, 0x91, 0x0d, 0xa8, 0x01, 0x90, 0x00, 0xf0, + 0x01, 0xf9, 0x78, 0x8e, 0xbd, 0xf8, 0xc8, 0x10, 0x81, 0x42, 0x38, 0xbf, + 0xad, 0xf8, 0xc8, 0x00, 0x10, 0x98, 0x01, 0x28, 0x0d, 0xd9, 0x00, 0x2d, + 0x04, 0xbf, 0xba, 0xf1, 0x06, 0x0f, 0x00, 0x2c, 0x4b, 0xd1, 0x11, 0xaa, + 0x49, 0x46, 0x40, 0x46, 0xeb, 0xf7, 0x17, 0xfd, 0x00, 0xf0, 0x01, 0xf9, + 0x06, 0xe0, 0xbd, 0xf8, 0x10, 0x10, 0xad, 0xf8, 0xc0, 0x12, 0x54, 0xea, + 0x05, 0x00, 0x3c, 0xd1, 0x0c, 0x99, 0xc8, 0x7a, 0x00, 0x28, 0x3f, 0xf4, + 0x1f, 0xaf, 0xbd, 0xf8, 0x0e, 0x10, 0x00, 0x20, 0x0f, 0x29, 0x9d, 0xf9, + 0x44, 0x10, 0x8d, 0xf8, 0x24, 0x10, 0x28, 0xbf, 0x01, 0x20, 0x9d, 0xf8, + 0x45, 0x10, 0x8d, 0xf8, 0x25, 0x10, 0x01, 0x22, 0x9d, 0xf8, 0x46, 0x10, + 0x8d, 0xf8, 0x26, 0x10, 0x09, 0x23, 0x9d, 0xf8, 0x47, 0x10, 0x8d, 0xf8, + 0x27, 0x10, 0x02, 0x92, 0x00, 0x93, 0x0f, 0x23, 0x9d, 0xf8, 0x52, 0x10, + 0x8d, 0xf8, 0x28, 0x10, 0x06, 0xaa, 0x9d, 0xf8, 0x53, 0x10, 0x8d, 0xf8, + 0x29, 0x10, 0x9d, 0xf8, 0x54, 0x10, 0x8d, 0xf8, 0x2a, 0x10, 0x9d, 0xf8, + 0x55, 0x10, 0x8d, 0xf8, 0x2b, 0x10, 0x9d, 0xf8, 0x56, 0x10, 0x8d, 0xf8, + 0x2c, 0x10, 0x09, 0xa9, 0x01, 0x91, 0x34, 0xa9, 0xeb, 0xf7, 0x74, 0xfd, + 0x01, 0x28, 0x8d, 0xf8, 0x0c, 0x00, 0x7f, 0xf4, 0xe5, 0xae, 0x78, 0x7f, + 0x40, 0x1c, 0x78, 0x77, 0xb8, 0x8d, 0x40, 0x1c, 0xb8, 0x85, 0xe3, 0x98, + 0x42, 0x79, 0x02, 0xf0, 0x01, 0x01, 0x52, 0x08, 0x02, 0xf0, 0x01, 0x02, + 0x04, 0xbb, 0x97, 0xf9, 0x1a, 0x00, 0x01, 0x28, 0x04, 0xd1, 0x3a, 0xb9, + 0x01, 0x20, 0x8d, 0xf8, 0x0c, 0x00, 0x17, 0xe0, 0x00, 0x28, 0xf9, 0xd1, + 0x00, 0x29, 0xf7, 0xd0, 0xe4, 0x99, 0xe3, 0x9b, 0x00, 0x91, 0x11, 0xa8, + 0x01, 0x90, 0x34, 0xaa, 0x49, 0x46, 0x03, 0xa8, 0x00, 0xf0, 0x45, 0xfd, + 0x9d, 0xf8, 0x0c, 0x00, 0x30, 0xb9, 0xee, 0x98, 0xe4, 0x9b, 0x00, 0x90, + 0x0d, 0xa9, 0x01, 0x91, 0x00, 0xf0, 0x74, 0xf8, 0x9d, 0xf9, 0x44, 0x40, + 0x9d, 0xf9, 0x45, 0x60, 0x9d, 0xf9, 0x46, 0xa0, 0x9d, 0xf9, 0x47, 0xb0, + 0x99, 0xf8, 0x04, 0x20, 0x9d, 0xf9, 0x0d, 0x10, 0x40, 0x46, 0xe5, 0xf7, + 0xa0, 0xfc, 0x99, 0xf8, 0x03, 0x00, 0x58, 0xb1, 0x9d, 0xf8, 0xbc, 0x03, + 0x01, 0x90, 0x00, 0x21, 0x00, 0x91, 0x00, 0xf0, 0x65, 0xf8, 0x01, 0x22, + 0xc9, 0xb2, 0x40, 0x46, 0xd9, 0xf7, 0x09, 0xfa, 0x00, 0x2d, 0x3a, 0xd1, + 0x0f, 0x98, 0x0f, 0x99, 0x94, 0xfb, 0xf0, 0xf0, 0x8d, 0xf8, 0x44, 0x00, + 0x96, 0xfb, 0xf1, 0xf1, 0x0f, 0x98, 0x8d, 0xf8, 0x45, 0x10, 0x9a, 0xfb, + 0xf0, 0xf0, 0x8d, 0xf8, 0x46, 0x00, 0xab, 0xab, 0x0f, 0x98, 0x9d, 0xf9, + 0x46, 0x10, 0x9b, 0xfb, 0xf0, 0xf0, 0x8d, 0xf8, 0x47, 0x00, 0xdb, 0x1c, + 0x9d, 0xf8, 0x44, 0x00, 0x9d, 0xf9, 0x47, 0x20, 0x8d, 0xf8, 0xaf, 0x02, + 0x99, 0x70, 0xda, 0x70, 0x9d, 0xf9, 0x45, 0x00, 0x58, 0x70, 0x10, 0x9b, + 0x01, 0x2b, 0x14, 0xd9, 0x9d, 0xf8, 0x57, 0x30, 0x8d, 0xf8, 0x70, 0x30, + 0x00, 0x23, 0x11, 0xac, 0xdd, 0xb2, 0x2c, 0x44, 0x5b, 0x1c, 0x26, 0x7b, + 0x84, 0xf8, 0x2d, 0x60, 0xdc, 0xb2, 0x07, 0x2c, 0xf5, 0xd3, 0x38, 0x72, + 0x9d, 0xf8, 0xaf, 0x02, 0x78, 0x72, 0xba, 0x72, 0xf9, 0x72, 0x11, 0xaa, + 0x0c, 0x98, 0xc1, 0x79, 0x40, 0x46, 0xeb, 0xf7, 0x12, 0xfe, 0xe4, 0x98, + 0x4f, 0xf4, 0x0d, 0x72, 0x56, 0xa9, 0xd9, 0xf7, 0x83, 0xfb, 0xee, 0x98, + 0x8c, 0x22, 0x11, 0xa9, 0xd9, 0xf7, 0x7e, 0xfb, 0x00, 0xf0, 0x1d, 0xf8, + 0x0d, 0xf5, 0x65, 0x7d, 0xbd, 0xe8, 0xf0, 0x8f, 0x94, 0x95, 0x84, 0x85, + 0x4a, 0x46, 0x11, 0xa9, 0x40, 0x46, 0x00, 0xf0, 0x3e, 0xbd, 0x11, 0xaa, + 0x49, 0x46, 0x40, 0x46, 0x00, 0xf0, 0x09, 0xbd, 0x01, 0x23, 0x99, 0xf8, + 0x01, 0x10, 0xc1, 0xf1, 0x01, 0x01, 0x70, 0x47, 0x05, 0x46, 0xee, 0x9a, + 0x4b, 0x46, 0x56, 0xa9, 0x11, 0xa8, 0x00, 0xf0, 0x5c, 0xbd, 0xe4, 0x9a, + 0x4b, 0x46, 0x11, 0xa9, 0x40, 0x46, 0x00, 0xf0, 0x94, 0xbd, 0x0c, 0x98, + 0xe3, 0x9a, 0x01, 0x78, 0x01, 0x91, 0x4b, 0x46, 0xd0, 0x8c, 0x00, 0x90, + 0x11, 0xaa, 0x00, 0x21, 0x40, 0x46, 0xeb, 0xf7, 0x2f, 0xba, 0xf0, 0xb2, + 0x8d, 0xf8, 0x1c, 0x60, 0x76, 0x1c, 0x29, 0x5c, 0x8d, 0xf8, 0x20, 0x10, + 0x07, 0xa8, 0xe5, 0xf7, 0x71, 0xbb, 0x38, 0xb5, 0x0c, 0x46, 0x15, 0x46, + 0x43, 0xb9, 0x21, 0x00, 0x08, 0xd1, 0x29, 0x78, 0xb9, 0xb1, 0x4b, 0x1e, + 0x2b, 0x70, 0x01, 0x22, 0x00, 0x21, 0x0f, 0xe0, 0x21, 0x00, 0xf6, 0xd1, + 0x69, 0x78, 0x21, 0xb1, 0x49, 0x1e, 0x69, 0x70, 0x01, 0x22, 0x00, 0x21, + 0x10, 0xe0, 0x29, 0x78, 0x1f, 0x29, 0x0f, 0xd2, 0x49, 0x1c, 0x29, 0x70, + 0x01, 0x22, 0x01, 0x21, 0xe5, 0xf7, 0x89, 0xfc, 0x08, 0xe0, 0x69, 0x78, + 0x1f, 0x29, 0x05, 0xd2, 0x49, 0x1c, 0x69, 0x70, 0x01, 0x22, 0x01, 0x21, + 0xe5, 0xf7, 0x8c, 0xfc, 0x95, 0xf9, 0x01, 0x10, 0x95, 0xf9, 0x00, 0x00, + 0x08, 0x1a, 0x01, 0x2c, 0x04, 0xbf, 0x40, 0xb2, 0x40, 0x42, 0x40, 0xb2, + 0x32, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, + 0x82, 0xb0, 0xdf, 0xed, 0x6a, 0x0a, 0xdd, 0xf8, 0x40, 0x80, 0x0e, 0x9d, + 0x11, 0x9e, 0xdd, 0xf8, 0x3c, 0x90, 0x8d, 0xf8, 0x04, 0x00, 0x00, 0xee, + 0x10, 0x8a, 0xb8, 0xee, 0x40, 0x0a, 0x00, 0x24, 0x80, 0xee, 0x20, 0x8a, + 0x00, 0x27, 0x88, 0x46, 0x92, 0x46, 0x9b, 0x46, 0x27, 0xe0, 0x00, 0x95, + 0x5b, 0x46, 0x9d, 0xf8, 0x04, 0x00, 0x52, 0x46, 0x41, 0x46, 0xe5, 0xf7, + 0x4b, 0xfc, 0x51, 0x46, 0x00, 0xee, 0x10, 0x0a, 0x00, 0xee, 0x90, 0x1a, + 0xb8, 0xee, 0x40, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x80, 0xee, 0x20, 0x0a, + 0xf6, 0xee, 0x00, 0x0a, 0x78, 0xee, 0x20, 0x0a, 0x04, 0x19, 0xf4, 0xee, + 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x5f, 0xbf, 0xb6, 0xee, 0x00, 0x1a, + 0x31, 0xee, 0x48, 0x1a, 0xb4, 0xee, 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x48, 0xbf, 0x30, 0x60, 0x7f, 0x1c, 0xf8, 0xb2, 0x48, 0x45, 0xd4, 0xd3, + 0x02, 0xb0, 0x20, 0x46, 0xf6, 0xe4, 0x00, 0x00, 0x2d, 0xe9, 0xfe, 0x4f, + 0x88, 0xb0, 0x15, 0x9e, 0x33, 0x7a, 0xdd, 0xf8, 0x58, 0x90, 0x14, 0x9a, + 0xcb, 0x18, 0x5b, 0xb2, 0x09, 0xeb, 0x83, 0x0a, 0xda, 0xf8, 0x28, 0x31, + 0x23, 0xf0, 0x00, 0x43, 0x00, 0xee, 0x10, 0x3a, 0x52, 0xb1, 0x9d, 0xf8, + 0x28, 0x20, 0x01, 0x2a, 0x06, 0xd1, 0xdf, 0xed, 0x3d, 0x0a, 0xb4, 0xee, + 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x6c, 0xd5, 0x06, 0xf1, 0x29, 0x02, + 0x07, 0x92, 0x00, 0x27, 0x92, 0xf8, 0x01, 0x80, 0x74, 0x89, 0x75, 0x7e, + 0xf2, 0x79, 0x8d, 0xf8, 0x15, 0x00, 0x66, 0x08, 0x52, 0x08, 0x06, 0x96, + 0x04, 0x96, 0x02, 0xf0, 0x01, 0x02, 0x09, 0xf5, 0xb6, 0x76, 0x8b, 0x46, + 0x18, 0x46, 0x8d, 0xf8, 0x14, 0x20, 0x1e, 0xe0, 0x47, 0x46, 0x1b, 0xe0, + 0x04, 0xa8, 0x07, 0x99, 0x03, 0x90, 0x5b, 0x46, 0x08, 0x78, 0x02, 0x90, + 0x01, 0x95, 0x06, 0x21, 0x9d, 0xf8, 0x14, 0x20, 0x9d, 0xf8, 0x15, 0x00, + 0x00, 0x92, 0x22, 0x46, 0xff, 0xf7, 0x6e, 0xff, 0x04, 0x99, 0x06, 0x9a, + 0x91, 0x42, 0xe9, 0xd0, 0xf1, 0x61, 0x32, 0x68, 0x31, 0x6a, 0xb2, 0x61, + 0x49, 0x1c, 0xfa, 0xb2, 0x31, 0x62, 0x72, 0x62, 0x7f, 0x1c, 0xf9, 0xb2, + 0x41, 0x45, 0xdf, 0xd3, 0x00, 0xee, 0x10, 0x0a, 0x09, 0x9e, 0xbb, 0xf1, + 0x00, 0x0f, 0xf8, 0xee, 0x40, 0x0a, 0x0b, 0xd1, 0x9d, 0xf8, 0x28, 0x00, + 0x01, 0x28, 0x04, 0xd0, 0x24, 0x21, 0x09, 0xf5, 0x94, 0x70, 0xeb, 0xf7, + 0x75, 0xf8, 0x86, 0xed, 0x00, 0x0a, 0x0b, 0xe0, 0x17, 0x98, 0x96, 0xed, + 0x00, 0x0a, 0x40, 0x78, 0xb8, 0xee, 0x40, 0x0a, 0x70, 0xee, 0xc0, 0x0a, + 0x01, 0x28, 0x08, 0xbf, 0xf1, 0xee, 0x60, 0x0a, 0x00, 0xee, 0x10, 0x4a, + 0xb8, 0xee, 0x40, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0x00, 0xee, 0x90, 0x5a, + 0xf8, 0xee, 0x60, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0xdf, 0xed, 0x07, 0x0a, + 0x20, 0xee, 0x20, 0x0a, 0x8a, 0xed, 0x4a, 0x0a, 0x01, 0xe0, 0x9a, 0xed, + 0x4a, 0x0a, 0x0b, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0x00, 0xc8, 0x42, + 0xac, 0xc5, 0x27, 0x37, 0x00, 0x00, 0x80, 0x42, 0x2d, 0xe9, 0xf8, 0x4f, + 0x2d, 0xed, 0x04, 0x8b, 0x9a, 0xb0, 0x44, 0x68, 0x81, 0x6b, 0xc0, 0x6b, + 0x01, 0xf5, 0x94, 0x76, 0x01, 0xf5, 0x80, 0x71, 0x00, 0xf5, 0x3e, 0x7a, + 0x12, 0x91, 0x00, 0x7d, 0x10, 0x28, 0x05, 0xd2, 0x01, 0x00, 0x18, 0xbf, + 0x01, 0x21, 0x8d, 0xf8, 0x12, 0x10, 0x02, 0xe0, 0x00, 0x23, 0x8d, 0xf8, + 0x12, 0x30, 0x01, 0x22, 0x01, 0x21, 0xe0, 0xb2, 0xe5, 0xf7, 0x4c, 0xff, + 0x05, 0x46, 0xf0, 0x89, 0xad, 0xf8, 0x2c, 0x00, 0x0b, 0xa8, 0xb1, 0x89, + 0xad, 0xf8, 0x2e, 0x10, 0x8d, 0xf8, 0x30, 0x40, 0xe5, 0xf7, 0x24, 0xfa, + 0xe0, 0xb2, 0xd8, 0xf7, 0x93, 0xfe, 0x17, 0xa8, 0xd8, 0xf7, 0x6e, 0xfe, + 0x01, 0x20, 0x12, 0x99, 0x11, 0x90, 0x08, 0x68, 0x42, 0x03, 0x0b, 0xd5, + 0x00, 0x20, 0x11, 0x90, 0x96, 0xf8, 0x2c, 0x00, 0xc0, 0xf1, 0x01, 0x00, + 0x86, 0xf8, 0x2c, 0x00, 0x06, 0xf1, 0x2b, 0x00, 0xd9, 0xf7, 0x51, 0xf8, + 0x0a, 0x22, 0x06, 0xf1, 0x2b, 0x01, 0x06, 0xa8, 0xd9, 0xf7, 0xd4, 0xf9, + 0xb0, 0x7c, 0x10, 0xf0, 0x0f, 0x00, 0x18, 0xbf, 0x01, 0x20, 0x8d, 0xf8, + 0x18, 0x00, 0x0a, 0xf5, 0xa6, 0x71, 0x9d, 0xf8, 0x19, 0x00, 0x00, 0x28, + 0x0c, 0xbf, 0x0a, 0x20, 0x05, 0x20, 0x8d, 0xf8, 0x1a, 0x00, 0x4f, 0xf0, + 0x01, 0x08, 0x9d, 0xf8, 0x19, 0x00, 0x88, 0x71, 0x00, 0xf0, 0xc5, 0xfa, + 0x0a, 0xf5, 0xa6, 0x71, 0xf7, 0xee, 0x00, 0x8a, 0x48, 0x70, 0x00, 0x21, + 0x00, 0xf0, 0xc3, 0xfa, 0x8d, 0xf8, 0x29, 0x00, 0x00, 0xf0, 0xbe, 0xfa, + 0x8d, 0xf8, 0x28, 0x00, 0x00, 0x20, 0xc0, 0x46, 0xc0, 0x46, 0x00, 0xf0, + 0xcd, 0xfa, 0x00, 0x21, 0x00, 0x91, 0x40, 0xea, 0x05, 0x07, 0x9d, 0xf8, + 0x19, 0x10, 0xcd, 0xf8, 0x04, 0x80, 0xc1, 0xf1, 0x01, 0x01, 0x01, 0x23, + 0x00, 0x22, 0xc9, 0xb2, 0xe0, 0xb2, 0xd8, 0xf7, 0xe6, 0xff, 0x00, 0xf0, + 0xbb, 0xfa, 0x0a, 0xf5, 0xd0, 0x72, 0x00, 0x92, 0x05, 0x46, 0xcd, 0xf8, + 0x08, 0x80, 0xcd, 0xf8, 0x04, 0x80, 0x00, 0xf0, 0x87, 0xfa, 0x00, 0xf0, + 0xaf, 0xfa, 0x3d, 0x43, 0x40, 0xea, 0x05, 0x09, 0xd8, 0x21, 0x0a, 0xf1, + 0x50, 0x00, 0xea, 0xf7, 0xad, 0xff, 0x00, 0x20, 0x8a, 0xf8, 0x4c, 0x01, + 0x96, 0xf8, 0x20, 0x00, 0x01, 0x06, 0x0b, 0xd5, 0xe5, 0xf7, 0x1d, 0xfc, + 0x00, 0xf0, 0xa7, 0xfa, 0xdf, 0xed, 0x0a, 0x0a, 0x80, 0xee, 0x80, 0x0a, + 0x9f, 0xed, 0x09, 0x1a, 0x60, 0xee, 0x01, 0x8a, 0x96, 0xf8, 0x20, 0x00, + 0x20, 0xf0, 0x80, 0x00, 0x00, 0xf0, 0x99, 0xfa, 0xf2, 0xee, 0x04, 0x0a, + 0x00, 0x21, 0x80, 0xee, 0x20, 0x9a, 0x8d, 0xf8, 0x13, 0x10, 0x2b, 0xe0, + 0x28, 0x6b, 0x6e, 0x4e, 0x00, 0x00, 0x00, 0x3d, 0x9d, 0xf9, 0x10, 0x00, + 0x9a, 0xf9, 0x0c, 0x10, 0x88, 0x42, 0xc8, 0xbf, 0x08, 0x46, 0x8a, 0xf8, + 0x0c, 0x00, 0x9a, 0xf9, 0x0d, 0x10, 0x9d, 0xf9, 0x11, 0x00, 0x88, 0x42, + 0xc8, 0xbf, 0x08, 0x46, 0x8a, 0xf8, 0x0d, 0x00, 0x0f, 0xe0, 0x9a, 0xf8, + 0x4c, 0x01, 0x40, 0x1c, 0x8a, 0xf8, 0x4c, 0x01, 0xc0, 0xb2, 0x01, 0x28, + 0xe4, 0xd1, 0x9d, 0xf8, 0x10, 0x00, 0x8a, 0xf8, 0x0c, 0x00, 0x9d, 0xf8, + 0x11, 0x10, 0x8a, 0xf8, 0x0d, 0x10, 0x9d, 0xf8, 0x13, 0x00, 0x40, 0x1c, + 0x8d, 0xf8, 0x13, 0x00, 0x9d, 0xf8, 0x13, 0x00, 0x31, 0x7e, 0x88, 0x42, + 0x08, 0xf1, 0x01, 0x05, 0x80, 0xf0, 0x17, 0x81, 0x00, 0x22, 0xad, 0xf8, + 0x10, 0x20, 0x9a, 0xf9, 0x01, 0x00, 0x9a, 0xf9, 0x00, 0x70, 0x9d, 0xf8, + 0x12, 0x30, 0x00, 0x92, 0xc7, 0x1b, 0x9d, 0xf8, 0x19, 0x00, 0xcd, 0xf8, + 0x08, 0xa0, 0x06, 0xa9, 0x01, 0x28, 0x03, 0x91, 0x04, 0xbf, 0x7f, 0xb2, + 0x7f, 0x42, 0x01, 0x96, 0x09, 0xaa, 0x79, 0xb2, 0xe0, 0xb2, 0xff, 0xf7, + 0x5f, 0xfe, 0x00, 0xf0, 0x35, 0xfa, 0x83, 0x46, 0x00, 0xf0, 0x04, 0xfa, + 0x06, 0x20, 0x01, 0x21, 0xa8, 0x46, 0x02, 0x90, 0x01, 0x91, 0x0a, 0xf5, + 0xd0, 0x75, 0x00, 0x95, 0x00, 0xf0, 0xfe, 0xf9, 0x00, 0xf0, 0x26, 0xfa, + 0x00, 0xf0, 0xf1, 0xf9, 0xd8, 0xf7, 0xdd, 0xfc, 0x38, 0xb9, 0x7f, 0xb2, + 0x01, 0x97, 0x00, 0x95, 0x00, 0xf0, 0x21, 0xfa, 0xe0, 0xb2, 0xff, 0xf7, + 0x49, 0xfb, 0x0f, 0xf2, 0xb4, 0x60, 0x0f, 0xf2, 0xb4, 0x61, 0x00, 0x88, + 0x09, 0x88, 0xad, 0xf8, 0x14, 0x00, 0x0d, 0xf1, 0x11, 0x02, 0x04, 0xab, + 0xad, 0xf8, 0x16, 0x10, 0x0d, 0x92, 0x0e, 0x93, 0x00, 0x20, 0x0d, 0xab, + 0x53, 0xf8, 0x20, 0x50, 0x0f, 0x95, 0x10, 0x90, 0x25, 0x46, 0x01, 0x24, + 0x37, 0xe0, 0x7f, 0xb2, 0x01, 0x97, 0x0a, 0xf5, 0xd0, 0x70, 0x00, 0x90, + 0x00, 0xf0, 0xff, 0xf9, 0xe8, 0xb2, 0xff, 0xf7, 0x27, 0xfb, 0x27, 0xe0, + 0x60, 0xb2, 0x01, 0x28, 0x0f, 0xdd, 0xb5, 0xee, 0x40, 0x8a, 0xf1, 0xee, + 0x10, 0xfa, 0x78, 0xb2, 0x01, 0xdd, 0x00, 0x28, 0x06, 0xd4, 0xb5, 0xee, + 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x02, 0xd5, 0x00, 0x28, 0x00, 0xdd, + 0x89, 0x46, 0x00, 0xf0, 0xb3, 0xf9, 0x06, 0x20, 0x01, 0x21, 0x00, 0xf0, + 0xb9, 0xf9, 0xe8, 0xb2, 0xff, 0xf7, 0x24, 0xfb, 0x00, 0xf0, 0xd3, 0xf9, + 0x40, 0xea, 0x09, 0x09, 0xd8, 0xf7, 0x8f, 0xfc, 0x00, 0x28, 0x08, 0xf1, + 0x01, 0x08, 0xce, 0xd0, 0x34, 0x7a, 0x64, 0x1c, 0x0f, 0x98, 0x01, 0x78, + 0x49, 0x1c, 0x01, 0x70, 0x64, 0x1c, 0x10, 0x98, 0x0d, 0xf1, 0x16, 0x01, + 0x0a, 0x5c, 0x8d, 0xf8, 0x0c, 0x20, 0x61, 0xb2, 0x96, 0xf9, 0x08, 0x00, + 0x88, 0x42, 0x47, 0xdb, 0x13, 0x46, 0x9d, 0xf8, 0x19, 0x10, 0x52, 0x46, + 0xe8, 0xb2, 0xff, 0xf7, 0x60, 0xfd, 0x9a, 0xf9, 0x01, 0x00, 0x9a, 0xf9, + 0x00, 0x70, 0xc7, 0x1b, 0x9d, 0xf8, 0x19, 0x00, 0x01, 0x28, 0x04, 0xbf, + 0x7f, 0xb2, 0x7f, 0x42, 0x00, 0xf0, 0xa5, 0xf9, 0x83, 0x46, 0x06, 0xa8, + 0x00, 0x21, 0x03, 0x90, 0x00, 0x91, 0xcd, 0xf8, 0x08, 0xa0, 0x01, 0x96, + 0x09, 0xaa, 0x9d, 0xf8, 0x12, 0x30, 0x79, 0xb2, 0xe8, 0xb2, 0xff, 0xf7, + 0xc3, 0xfd, 0xb0, 0xee, 0x40, 0x8a, 0x00, 0xf0, 0x92, 0xf9, 0x00, 0xf0, + 0x62, 0xf9, 0x96, 0xf8, 0x20, 0x00, 0x00, 0x28, 0x49, 0xf4, 0x00, 0x61, + 0x98, 0xd0, 0x10, 0x9b, 0x96, 0xf9, 0x08, 0x00, 0x05, 0xaa, 0x28, 0xee, + 0x28, 0x0a, 0x12, 0xf9, 0x03, 0xc0, 0x00, 0xee, 0x90, 0xca, 0xf8, 0xee, + 0xe0, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xb4, 0xee, 0x49, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0xa8, 0xbf, 0x44, 0x1c, 0x96, 0xda, 0x62, 0xb2, 0x82, 0x42, + 0x93, 0xd1, 0x91, 0xe7, 0x0f, 0x98, 0x90, 0xf9, 0x00, 0x70, 0x2c, 0x46, + 0x10, 0x9d, 0x1f, 0xe0, 0x9d, 0xf8, 0x0c, 0x30, 0x9d, 0xf8, 0x19, 0x10, + 0xc3, 0xf1, 0x01, 0x03, 0xdb, 0xb2, 0x52, 0x46, 0xe0, 0xb2, 0xff, 0xf7, + 0x0e, 0xfd, 0x00, 0xf0, 0x63, 0xf9, 0x40, 0xea, 0x09, 0x09, 0x00, 0xf0, + 0x31, 0xf9, 0xd8, 0xf7, 0x18, 0xfc, 0x71, 0x7a, 0xca, 0x07, 0x08, 0xf1, + 0x01, 0x08, 0x06, 0xd5, 0x28, 0xb9, 0x00, 0xf0, 0x43, 0xf9, 0x00, 0xf0, + 0x53, 0xf9, 0x40, 0xea, 0x09, 0x09, 0x7f, 0x1e, 0x78, 0xb2, 0x00, 0x28, + 0xdc, 0xdc, 0x68, 0x1c, 0x02, 0x28, 0xff, 0xf4, 0x40, 0xaf, 0x9d, 0xf9, + 0x10, 0x00, 0x40, 0x42, 0x8d, 0xf8, 0x10, 0x00, 0xd8, 0xf7, 0xfd, 0xfb, + 0x00, 0x28, 0x3f, 0xf4, 0xd0, 0xae, 0x30, 0x7e, 0x8d, 0xf8, 0x13, 0x00, + 0xdb, 0xe6, 0xd8, 0xf7, 0xf4, 0xfb, 0x00, 0x28, 0x03, 0x90, 0x55, 0xd1, + 0x0a, 0xf5, 0xd0, 0x71, 0x00, 0x91, 0x53, 0x46, 0x06, 0xaa, 0x31, 0x46, + 0xe0, 0xb2, 0xff, 0xf7, 0x73, 0xf8, 0x12, 0x99, 0x00, 0x20, 0x00, 0xf0, + 0x05, 0xf9, 0xe0, 0xb2, 0x0a, 0xf5, 0xa6, 0x77, 0xfe, 0xf7, 0xc6, 0xfc, + 0xb8, 0x70, 0x00, 0xf0, 0x21, 0xf9, 0x83, 0x46, 0x9d, 0xf8, 0x19, 0x20, + 0x97, 0xf9, 0x02, 0x10, 0xe0, 0xb2, 0xe5, 0xf7, 0xca, 0xf8, 0x00, 0xf0, + 0x17, 0xf9, 0x00, 0xf0, 0xe2, 0xf8, 0x11, 0x98, 0x68, 0xb1, 0x9d, 0xf8, + 0x19, 0x20, 0x97, 0xf9, 0x02, 0x10, 0xc2, 0xf1, 0x01, 0x02, 0xd2, 0xb2, + 0xe0, 0xb2, 0xe5, 0xf7, 0xba, 0xf8, 0x00, 0xf0, 0x07, 0xf9, 0x40, 0xea, + 0x09, 0x09, 0x9d, 0xf8, 0x19, 0x10, 0xc1, 0xf1, 0x01, 0x01, 0xc9, 0xb2, + 0x00, 0xf0, 0xe9, 0xf8, 0xf8, 0x70, 0x00, 0xf0, 0xe0, 0xf8, 0xb8, 0x70, + 0x11, 0x98, 0x20, 0xb1, 0x01, 0x21, 0x8d, 0xf8, 0x1e, 0x10, 0x8d, 0xf8, + 0x1f, 0x10, 0x00, 0xf0, 0xc3, 0xf8, 0x00, 0xf0, 0xdd, 0xf8, 0x00, 0xf0, + 0xed, 0xf8, 0x40, 0xea, 0x09, 0x09, 0xe8, 0xb2, 0xc0, 0x46, 0xc0, 0x46, + 0xe0, 0xb2, 0xd8, 0xf7, 0x71, 0xfc, 0x38, 0x61, 0xe0, 0xb2, 0xd8, 0xf7, + 0x73, 0xfc, 0x78, 0x61, 0x0a, 0xf2, 0xe5, 0x15, 0x0a, 0xf5, 0x09, 0x78, + 0x95, 0xf9, 0x01, 0x00, 0x00, 0x28, 0x5a, 0xd1, 0x00, 0x21, 0x88, 0xf8, + 0x0c, 0x10, 0x14, 0x21, 0xb0, 0x79, 0x40, 0x1c, 0x10, 0xfb, 0x01, 0xf1, + 0xad, 0xf8, 0x00, 0x10, 0x95, 0xf9, 0x04, 0x00, 0x28, 0xb9, 0x95, 0xf9, + 0x05, 0x00, 0x47, 0x1e, 0xbf, 0x41, 0xff, 0x0f, 0x00, 0xe0, 0x00, 0x27, + 0x06, 0xf1, 0x2c, 0x00, 0x0a, 0xf5, 0xa6, 0x71, 0x00, 0x7a, 0x4a, 0x69, + 0x40, 0x09, 0x00, 0xf0, 0x01, 0x0b, 0x70, 0x8c, 0x90, 0x42, 0x80, 0x41, + 0xc0, 0x0f, 0x01, 0x90, 0x00, 0x26, 0xe5, 0xf7, 0xc3, 0xfa, 0x00, 0xb1, + 0x01, 0x26, 0xbd, 0xf8, 0x00, 0x00, 0xb8, 0xf8, 0x00, 0x10, 0x01, 0x9a, + 0x88, 0x42, 0x89, 0x41, 0x32, 0x43, 0xc9, 0x0f, 0x47, 0xea, 0x02, 0x03, + 0x0b, 0x43, 0x1b, 0xea, 0x03, 0x0f, 0x24, 0xd0, 0x0f, 0xb1, 0x49, 0xf0, + 0x10, 0x09, 0x0a, 0x43, 0xd2, 0xb2, 0xf2, 0xb1, 0x01, 0x98, 0x18, 0xb1, + 0x2a, 0x78, 0x42, 0xf0, 0x10, 0x02, 0x2a, 0x70, 0x1e, 0xb1, 0x28, 0x78, + 0x40, 0xf0, 0x20, 0x00, 0x28, 0x70, 0x19, 0xb1, 0x28, 0x78, 0x40, 0xf0, + 0x80, 0x00, 0x28, 0x70, 0x0e, 0x43, 0x0a, 0xd0, 0x01, 0x20, 0x88, 0xf8, + 0x0c, 0x00, 0x00, 0x22, 0x03, 0x21, 0xe0, 0xb2, 0xe5, 0xf7, 0xac, 0xfc, + 0x00, 0x20, 0x88, 0xf8, 0x0c, 0x00, 0x49, 0xf4, 0x80, 0x69, 0x00, 0x21, + 0x00, 0x91, 0x01, 0x20, 0x9d, 0xf8, 0x19, 0x10, 0x01, 0x90, 0xc1, 0xf1, + 0x01, 0x01, 0x01, 0x23, 0x01, 0x22, 0xc9, 0xb2, 0xe0, 0xb2, 0xd8, 0xf7, + 0x98, 0xfd, 0x68, 0x46, 0xd8, 0xf7, 0xd6, 0xfb, 0x01, 0x98, 0x13, 0x90, + 0x0a, 0xf5, 0xa6, 0x75, 0x13, 0xa8, 0xd8, 0xf7, 0xab, 0xfb, 0x29, 0x6a, + 0x16, 0x98, 0xa8, 0x61, 0x49, 0x1c, 0x29, 0x62, 0x03, 0x98, 0xe9, 0x8b, + 0x41, 0x18, 0xe9, 0x83, 0x17, 0x98, 0x00, 0x99, 0x09, 0x1a, 0xc8, 0xf8, + 0x08, 0x10, 0xe0, 0xb2, 0x00, 0x21, 0xe5, 0xf7, 0x1e, 0xf8, 0x28, 0x71, + 0x00, 0xf0, 0x3a, 0xf8, 0x68, 0x71, 0x29, 0x79, 0x9d, 0xf8, 0x29, 0x20, + 0x8a, 0x1a, 0xea, 0x71, 0x52, 0xb2, 0x9d, 0xf8, 0x28, 0x10, 0x40, 0x1a, + 0x28, 0x72, 0x52, 0x1c, 0x02, 0x2a, 0x84, 0xbf, 0x01, 0x20, 0x68, 0x72, + 0x95, 0xf9, 0x08, 0x00, 0x40, 0x1c, 0x02, 0x28, 0x84, 0xbf, 0x01, 0x20, + 0xa8, 0x72, 0x1a, 0xb0, 0x48, 0x46, 0xbd, 0xec, 0x04, 0x8b, 0xbd, 0xe8, + 0xf2, 0x8f, 0x40, 0xea, 0x0b, 0x00, 0x40, 0xea, 0x09, 0x09, 0x70, 0x47, + 0x5f, 0xfa, 0x88, 0xf0, 0xe4, 0xf7, 0x8b, 0xbf, 0x53, 0x46, 0x06, 0xaa, + 0x31, 0x46, 0xe0, 0xb2, 0xff, 0xf7, 0x6e, 0xb9, 0x0a, 0xf5, 0xd0, 0x72, + 0x02, 0x90, 0x01, 0x91, 0x00, 0x92, 0x53, 0x46, 0x06, 0xaa, 0x31, 0x46, + 0x70, 0x47, 0xe0, 0xb2, 0x9d, 0xf8, 0x19, 0x10, 0xe4, 0xf7, 0xe1, 0xbf, + 0x01, 0x21, 0xe0, 0xb2, 0xe4, 0xf7, 0xdd, 0xbf, 0x06, 0x20, 0x01, 0x21, + 0x0a, 0xf5, 0xd0, 0x72, 0x02, 0x90, 0x01, 0x91, 0x00, 0x92, 0x53, 0x46, + 0x06, 0xaa, 0x31, 0x46, 0xe0, 0xb2, 0xff, 0xf7, 0x4f, 0xb9, 0x00, 0x22, + 0x01, 0x21, 0xe8, 0xb2, 0xe5, 0xf7, 0x2a, 0xbc, 0x00, 0x22, 0x01, 0x21, + 0xe0, 0xb2, 0xe5, 0xf7, 0x25, 0xbc, 0xb0, 0xee, 0x48, 0x0a, 0x53, 0x46, + 0x06, 0xaa, 0x31, 0x46, 0x70, 0x47, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, + 0x40, 0x0a, 0x70, 0x47, 0x70, 0xb5, 0x40, 0x79, 0x1d, 0x46, 0xc0, 0xf3, + 0x81, 0x03, 0x03, 0xeb, 0x83, 0x03, 0x2c, 0x78, 0x1e, 0x00, 0x20, 0xd0, + 0x01, 0x2c, 0x1e, 0xd1, 0x01, 0xf5, 0xd0, 0x76, 0x96, 0xf9, 0x02, 0x00, + 0x00, 0x28, 0x04, 0xbf, 0x31, 0x56, 0x00, 0x29, 0x15, 0xd0, 0x92, 0xf9, + 0x02, 0x10, 0x01, 0xf1, 0x3e, 0x04, 0x7d, 0x2c, 0x38, 0xbf, 0x1a, 0x46, + 0x08, 0xd3, 0x92, 0xf9, 0x00, 0x10, 0x01, 0xf1, 0x3e, 0x00, 0x7d, 0x28, + 0x06, 0xd2, 0x96, 0xf9, 0x00, 0x00, 0x1a, 0x46, 0x00, 0xf0, 0x36, 0xf8, + 0x04, 0x46, 0x00, 0xe0, 0x00, 0x24, 0x2c, 0x70, 0x70, 0xbd, 0xfe, 0xb5, + 0x04, 0x46, 0x16, 0x46, 0x22, 0x78, 0x8d, 0xf8, 0x04, 0x20, 0x1d, 0x46, + 0x22, 0xbb, 0x09, 0x9f, 0x08, 0x46, 0x00, 0xf0, 0x95, 0xf8, 0x03, 0x46, + 0x00, 0x97, 0x0f, 0x22, 0x09, 0x21, 0x30, 0x46, 0xeb, 0xf7, 0x40, 0xf8, + 0x01, 0x28, 0x8d, 0xf8, 0x04, 0x00, 0x05, 0xd1, 0x08, 0x99, 0x01, 0xab, + 0x3a, 0x46, 0x28, 0x46, 0xff, 0xf7, 0xb6, 0xff, 0x9d, 0xf8, 0x04, 0x10, + 0x01, 0x29, 0x07, 0xf1, 0x4a, 0x00, 0x06, 0xd1, 0x01, 0x8a, 0x02, 0x78, + 0x49, 0x1c, 0x52, 0x1c, 0x01, 0x82, 0x02, 0x70, 0x02, 0xe0, 0x41, 0x8a, + 0x49, 0x1c, 0x41, 0x82, 0x9d, 0xf8, 0x04, 0x00, 0x20, 0x70, 0xf7, 0xbd, + 0x30, 0xb5, 0x03, 0x46, 0x00, 0x20, 0x02, 0xf1, 0x64, 0x04, 0xc2, 0xf1, + 0x64, 0x02, 0x5c, 0x43, 0x5a, 0x43, 0x64, 0x25, 0x00, 0x2b, 0x24, 0xb2, + 0x12, 0xb2, 0x11, 0xfb, 0x05, 0xf1, 0x04, 0xd5, 0xa1, 0x42, 0x07, 0xdb, + 0x8a, 0x42, 0x04, 0xda, 0x30, 0xbd, 0x91, 0x42, 0xa8, 0xbf, 0x8c, 0x42, + 0x00, 0xdb, 0x01, 0x20, 0x30, 0xbd, 0x38, 0xb5, 0x14, 0x46, 0x4d, 0x7a, + 0xe5, 0xf7, 0x2c, 0xf9, 0x6d, 0x09, 0x01, 0x28, 0x1c, 0xbf, 0x94, 0xf9, + 0x47, 0x10, 0x01, 0x29, 0x05, 0xf0, 0x01, 0x05, 0x13, 0xd1, 0x94, 0xf9, + 0x00, 0x00, 0x00, 0x28, 0x04, 0xbf, 0x94, 0xf9, 0x01, 0x00, 0x00, 0x28, + 0x07, 0xd1, 0x94, 0xf9, 0x02, 0x00, 0x00, 0x28, 0x04, 0xbf, 0x94, 0xf9, + 0x03, 0x00, 0x00, 0x28, 0x03, 0xd0, 0x15, 0xb1, 0x01, 0x20, 0x84, 0xf8, + 0x87, 0x00, 0x31, 0xbd, 0x10, 0xb5, 0x0c, 0x46, 0x01, 0x23, 0x84, 0xf8, + 0x30, 0x32, 0x00, 0x22, 0x03, 0x21, 0xe5, 0xf7, 0x75, 0xfb, 0x00, 0x22, + 0x84, 0xf8, 0x30, 0x22, 0x10, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, 0x0c, 0x46, + 0x15, 0x46, 0x81, 0x46, 0x09, 0x9f, 0x94, 0xf9, 0x86, 0x60, 0xa8, 0x79, + 0x98, 0x46, 0x28, 0xb1, 0x01, 0x23, 0x3a, 0x46, 0x00, 0x21, 0x48, 0x46, + 0xeb, 0xf7, 0xba, 0xf8, 0xe8, 0x79, 0x28, 0xb1, 0x01, 0x23, 0x3a, 0x46, + 0x01, 0x21, 0x48, 0x46, 0xeb, 0xf7, 0xb2, 0xf8, 0x08, 0x99, 0x20, 0x46, + 0xeb, 0xf7, 0x26, 0xf9, 0x76, 0x1c, 0x84, 0xf8, 0x86, 0x60, 0x01, 0x20, + 0x88, 0xf8, 0x31, 0x02, 0xbd, 0xe8, 0xf1, 0x83, 0x41, 0x7a, 0x02, 0x20, + 0x00, 0x22, 0x01, 0xe0, 0x40, 0x00, 0x52, 0x1c, 0xb2, 0xeb, 0x91, 0x1f, + 0xfa, 0xdb, 0x40, 0xb2, 0x70, 0x47, 0x70, 0xb5, 0x0c, 0x46, 0x00, 0x21, + 0x00, 0xf1, 0x46, 0x06, 0x75, 0x56, 0x95, 0xb9, 0xd4, 0xf8, 0x6c, 0x41, + 0x7c, 0xb1, 0x5b, 0x7a, 0x9c, 0x06, 0x0c, 0xd5, 0x96, 0xf9, 0x41, 0x50, + 0x01, 0x2d, 0x08, 0xbf, 0x01, 0x21, 0x06, 0xd0, 0x2a, 0xb1, 0xdb, 0x06, + 0x03, 0xd5, 0x11, 0x46, 0x00, 0xf0, 0x03, 0xf8, 0x01, 0x46, 0x08, 0x46, + 0x70, 0xbd, 0xf8, 0xb5, 0x05, 0x46, 0x0e, 0x46, 0x00, 0x24, 0x01, 0x27, + 0x05, 0xf1, 0x0c, 0x01, 0x06, 0xf1, 0x0c, 0x02, 0xc8, 0x5d, 0xd3, 0x5d, + 0xc0, 0x1a, 0x40, 0xb2, 0xd8, 0xf7, 0x02, 0xf9, 0x04, 0x28, 0x0e, 0xd8, + 0xf8, 0x1e, 0x04, 0x28, 0x06, 0xd2, 0x05, 0xf1, 0x0c, 0x01, 0xc8, 0x57, + 0xd8, 0xf7, 0xf8, 0xf8, 0x07, 0x28, 0x04, 0xd2, 0x7f, 0x1c, 0x07, 0x2f, + 0xe6, 0xdb, 0x20, 0x46, 0xf2, 0xbd, 0x01, 0x24, 0xfb, 0xe7, 0xf8, 0xb5, + 0x0d, 0x46, 0x04, 0x46, 0x95, 0xf9, 0x46, 0x00, 0x16, 0x46, 0x1f, 0x46, + 0x88, 0xb9, 0xe5, 0xf7, 0xdf, 0xf8, 0x79, 0x7a, 0x8a, 0x06, 0x0c, 0xd5, + 0x58, 0xb1, 0x95, 0xf9, 0x88, 0x00, 0x40, 0xb9, 0x31, 0x46, 0x20, 0x46, + 0xff, 0xf7, 0x70, 0xff, 0x95, 0xf8, 0x88, 0x00, 0x40, 0x1c, 0x85, 0xf8, + 0x88, 0x00, 0xf1, 0xbd, 0x01, 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x2d, 0xe9, 0xff, 0x4f, 0x01, 0x21, 0xad, 0xf5, + 0xa0, 0x6d, 0xaf, 0xb0, 0x05, 0x46, 0x02, 0x91, 0x00, 0x20, 0x4f, 0xf6, + 0xff, 0x71, 0x03, 0x90, 0xad, 0xf8, 0x34, 0x00, 0xad, 0xf8, 0x02, 0x10, + 0x80, 0x46, 0x04, 0xa8, 0xdf, 0xf8, 0xe8, 0x1c, 0x24, 0x22, 0xd8, 0xf7, + 0x81, 0xfd, 0x4f, 0xf4, 0xb0, 0x61, 0x0f, 0xa8, 0xea, 0xf7, 0x96, 0xfb, + 0xdd, 0xf8, 0xc0, 0x05, 0x40, 0x21, 0xeb, 0xf7, 0xd3, 0xf8, 0x00, 0x26, + 0x00, 0x21, 0x01, 0x95, 0x8d, 0xf8, 0x00, 0x60, 0x01, 0x9b, 0x1d, 0x1d, + 0xc1, 0xeb, 0x01, 0x16, 0xdf, 0xf8, 0xbc, 0x2c, 0xa8, 0x5d, 0x00, 0x28, + 0x1f, 0xbf, 0x02, 0xf5, 0xa2, 0x62, 0x32, 0xf8, 0x11, 0x00, 0x00, 0x28, + 0x8d, 0xf8, 0x00, 0x10, 0x49, 0x1c, 0x08, 0x29, 0xec, 0xd3, 0x00, 0x25, + 0x9d, 0xf8, 0x00, 0x10, 0xdf, 0xf8, 0x98, 0x0c, 0x8d, 0x42, 0x00, 0xeb, + 0x45, 0x03, 0x05, 0xd2, 0xb3, 0xf8, 0x10, 0x05, 0x41, 0x1e, 0x89, 0x41, + 0xc9, 0x0f, 0x00, 0xe0, 0x00, 0x21, 0x0e, 0x22, 0x0f, 0xa8, 0x6a, 0x43, + 0x02, 0x44, 0x01, 0x9f, 0x02, 0xf2, 0x12, 0x56, 0xc5, 0xeb, 0x05, 0x12, + 0x3c, 0x1d, 0xa0, 0x5c, 0x90, 0xb1, 0xb3, 0xf8, 0x10, 0x05, 0x00, 0x28, + 0x08, 0xbf, 0x00, 0x29, 0x0c, 0xd0, 0x02, 0x9c, 0x05, 0xf1, 0x29, 0x03, + 0x9b, 0xb2, 0xa4, 0xb2, 0xa3, 0x42, 0x4b, 0xf6, 0x01, 0x77, 0xc0, 0xf0, + 0xc1, 0x80, 0x31, 0xb1, 0x28, 0x20, 0x12, 0xe0, 0x01, 0x20, 0x00, 0x21, + 0x30, 0x70, 0x31, 0x81, 0x59, 0xe1, 0xbd, 0xf8, 0x02, 0x30, 0x5b, 0x1c, + 0xad, 0xf8, 0x34, 0x30, 0x43, 0x08, 0xc4, 0x07, 0xbd, 0xf8, 0x02, 0x40, + 0x48, 0xbf, 0x5b, 0x1c, 0x23, 0x44, 0xad, 0xf8, 0x02, 0x30, 0xdd, 0xf8, + 0xc0, 0x35, 0x23, 0xf8, 0x15, 0x00, 0xdf, 0xf8, 0x18, 0x0c, 0x03, 0x68, + 0x18, 0x69, 0x01, 0x9b, 0x13, 0x44, 0xd3, 0xf8, 0x05, 0x20, 0xb0, 0xfb, + 0xf2, 0xfe, 0xdd, 0xf8, 0xc0, 0x05, 0x30, 0xf8, 0x15, 0x20, 0x02, 0x98, + 0xad, 0xf8, 0x12, 0x20, 0xad, 0xf8, 0x16, 0x00, 0x00, 0x22, 0xad, 0xf8, + 0x14, 0xe0, 0x8d, 0xf8, 0x10, 0x20, 0x00, 0x20, 0x0a, 0x90, 0x07, 0xab, + 0x23, 0xf8, 0x12, 0x00, 0x52, 0x1c, 0x02, 0x2a, 0xfa, 0xd9, 0x00, 0x22, + 0x01, 0x23, 0x0e, 0x93, 0x01, 0x24, 0xd3, 0x1c, 0x04, 0xfa, 0x03, 0xf3, + 0xbd, 0xf8, 0x14, 0x40, 0x1f, 0xfa, 0x83, 0xf9, 0x4c, 0x45, 0x38, 0xbf, + 0x23, 0x46, 0x0d, 0xf1, 0x22, 0x04, 0x24, 0xf8, 0x12, 0x30, 0x52, 0x1c, + 0x02, 0x2a, 0xeb, 0xd9, 0x0d, 0xf1, 0x22, 0x02, 0xbd, 0xf8, 0x18, 0x30, + 0x32, 0xf8, 0x13, 0xc0, 0x9d, 0xf8, 0x10, 0x20, 0x0a, 0xb9, 0x4f, 0xea, + 0x4c, 0x0c, 0xbd, 0xf8, 0x12, 0x20, 0x1f, 0xe0, 0x07, 0xac, 0x0c, 0xfb, + 0x19, 0x2c, 0x24, 0xf8, 0x13, 0x90, 0x1f, 0xfa, 0x8c, 0xf2, 0xbd, 0xf8, + 0x18, 0x30, 0x5b, 0x1c, 0xad, 0xf8, 0x18, 0x30, 0x9c, 0xb2, 0x9b, 0xb2, + 0x02, 0x2c, 0x04, 0xac, 0x04, 0xeb, 0x43, 0x04, 0x88, 0xbf, 0x38, 0x46, + 0xa4, 0x8b, 0xad, 0xf8, 0x1a, 0x40, 0x0d, 0xf1, 0x22, 0x04, 0x34, 0xf8, + 0x13, 0xc0, 0x9d, 0xf8, 0x10, 0x30, 0x0b, 0xb9, 0x4f, 0xea, 0x4c, 0x0c, + 0xba, 0xb1, 0xb0, 0xb9, 0x1f, 0xfa, 0x8c, 0xf3, 0x92, 0xfb, 0xf3, 0xf4, + 0x03, 0xfb, 0x14, 0x23, 0x03, 0xb1, 0x64, 0x1c, 0xbd, 0xf8, 0x1a, 0x90, + 0xbd, 0xf8, 0x18, 0x30, 0xa4, 0xb2, 0xa1, 0x45, 0xce, 0xdb, 0x07, 0xaa, + 0x22, 0xf8, 0x13, 0x40, 0xbd, 0xf8, 0x1a, 0x20, 0x14, 0x1b, 0xad, 0xf8, + 0x1a, 0x40, 0x00, 0x22, 0x00, 0x28, 0x0d, 0xf1, 0x1c, 0x0c, 0x14, 0xd1, + 0xbd, 0xf8, 0x28, 0x30, 0x3c, 0xf8, 0x12, 0x40, 0xe3, 0x18, 0xad, 0xf8, + 0x28, 0x30, 0x02, 0xf1, 0x03, 0x09, 0x3c, 0xf8, 0x12, 0x40, 0xbd, 0xf8, + 0x2a, 0x30, 0x04, 0xfa, 0x09, 0xf4, 0x52, 0x1c, 0xe3, 0x18, 0x02, 0x2a, + 0xad, 0xf8, 0x2a, 0x30, 0xea, 0xd9, 0x00, 0x28, 0x03, 0x90, 0x0e, 0xd1, + 0x02, 0x98, 0x30, 0x81, 0x02, 0x9a, 0xbd, 0xf8, 0x28, 0x00, 0x10, 0x18, + 0x02, 0x90, 0x40, 0x1e, 0x70, 0x81, 0x80, 0xb2, 0x31, 0x28, 0x38, 0xbf, + 0x00, 0x20, 0x06, 0xd3, 0x03, 0x97, 0xa2, 0xe0, 0x4f, 0xea, 0x0e, 0x42, + 0x40, 0x1c, 0x4f, 0xea, 0x52, 0x4e, 0x1f, 0xfa, 0x8e, 0xf2, 0x01, 0x2a, + 0xf6, 0xd8, 0xbd, 0xf8, 0x18, 0x20, 0xd2, 0x1c, 0x92, 0xb2, 0x80, 0xb2, + 0x82, 0x42, 0x88, 0xbf, 0x02, 0x46, 0x72, 0x80, 0x00, 0x29, 0xdd, 0xf8, + 0xc0, 0x05, 0x10, 0xf8, 0x15, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xb0, 0x80, + 0xdd, 0xf8, 0xc0, 0x25, 0x02, 0xeb, 0x45, 0x03, 0x18, 0x82, 0xbd, 0xf8, + 0x34, 0x00, 0x40, 0xf0, 0xcf, 0x80, 0x00, 0x22, 0x00, 0x27, 0x07, 0xab, + 0x33, 0xf8, 0x11, 0x40, 0x0d, 0xf1, 0x22, 0x03, 0x33, 0xf8, 0x11, 0x30, + 0x49, 0x1c, 0x02, 0x29, 0x03, 0xfb, 0x04, 0x77, 0xf3, 0xd9, 0xdd, 0xf8, + 0xc0, 0x15, 0x31, 0xf8, 0x15, 0x30, 0x9d, 0xf8, 0x10, 0x10, 0x71, 0xb9, + 0xb1, 0x88, 0x01, 0xeb, 0x53, 0x03, 0x0a, 0xe0, 0x0d, 0xf1, 0x3c, 0x0e, + 0x00, 0x21, 0x1f, 0xfa, 0x88, 0xf4, 0x2e, 0xf8, 0x14, 0x10, 0x08, 0xf1, + 0x01, 0x08, 0x52, 0x1c, 0x5b, 0x1c, 0x99, 0xb2, 0xbc, 0xb2, 0xa1, 0x42, + 0xf0, 0xd3, 0xdf, 0xf8, 0x2c, 0x3a, 0x59, 0x19, 0x91, 0xf8, 0x20, 0x15, + 0xf1, 0x80, 0x01, 0xb9, 0x7f, 0x00, 0xdd, 0xf8, 0xc0, 0x15, 0x21, 0xf8, + 0x15, 0x70, 0x00, 0x27, 0x0d, 0xf1, 0x22, 0x01, 0x4f, 0xf0, 0x00, 0x0c, + 0x31, 0xf8, 0x17, 0xe0, 0x15, 0xe0, 0x4f, 0xf0, 0x00, 0x09, 0x1f, 0xfa, + 0x81, 0xfb, 0x2a, 0xf8, 0x1b, 0x90, 0x49, 0x1c, 0x08, 0xf1, 0x01, 0x08, + 0x1f, 0xfa, 0x88, 0xf9, 0xa1, 0x45, 0xf2, 0xdb, 0x94, 0xb2, 0xa6, 0x45, + 0x88, 0x46, 0x2c, 0xbf, 0x00, 0x22, 0xa2, 0xeb, 0x0e, 0x02, 0x0c, 0xf1, + 0x01, 0x0c, 0x07, 0xac, 0x1f, 0xfa, 0x8c, 0xf1, 0x34, 0xf8, 0x17, 0x40, + 0xa1, 0x42, 0x1d, 0xd2, 0x0e, 0x99, 0xfc, 0x1c, 0x01, 0xfa, 0x04, 0xf4, + 0xa4, 0xb2, 0x91, 0x46, 0x41, 0x46, 0x0d, 0xe0, 0x1f, 0xfa, 0x80, 0xf8, + 0x33, 0xf8, 0x18, 0x80, 0x0d, 0xf1, 0x3c, 0x0a, 0x1f, 0xfa, 0x81, 0xfb, + 0x2a, 0xf8, 0x1b, 0x80, 0x40, 0x1c, 0x49, 0x1c, 0x09, 0xf1, 0x01, 0x09, + 0x1f, 0xfa, 0x89, 0xf8, 0xf0, 0x45, 0xed, 0xd3, 0xf0, 0x46, 0x0d, 0xf1, + 0x3c, 0x0a, 0xcd, 0xe7, 0x7f, 0x1c, 0x02, 0x2f, 0xba, 0xd9, 0x00, 0x20, + 0x30, 0x70, 0x6d, 0x1c, 0x08, 0x2d, 0xff, 0xf4, 0x6f, 0xae, 0x1f, 0xfa, + 0x88, 0xf1, 0x08, 0x46, 0xb0, 0xf5, 0x22, 0x7f, 0x07, 0xd2, 0xc1, 0xf5, + 0x22, 0x71, 0x0f, 0xaa, 0x49, 0x00, 0x02, 0xeb, 0x40, 0x00, 0xea, 0xf7, + 0x1b, 0xff, 0xff, 0xad, 0xff, 0x35, 0x03, 0x98, 0x00, 0x21, 0x4f, 0xf0, + 0x0e, 0x08, 0x53, 0x35, 0x80, 0xb9, 0xdd, 0xf8, 0xc0, 0x05, 0x0f, 0xaa, + 0x08, 0xfb, 0x01, 0xf3, 0x1a, 0x44, 0x02, 0xf2, 0x12, 0x52, 0x00, 0xeb, + 0x41, 0x03, 0x56, 0x89, 0x1e, 0x84, 0x49, 0x1c, 0x12, 0x78, 0x1a, 0x86, + 0x08, 0x29, 0xf0, 0xd3, 0x9d, 0xf8, 0xc8, 0x05, 0x01, 0x28, 0x1d, 0xd1, + 0x9d, 0xf8, 0xc4, 0x75, 0x00, 0x26, 0x01, 0x99, 0x08, 0x68, 0xf0, 0x40, + 0xc0, 0x07, 0x12, 0xd5, 0x03, 0x98, 0x00, 0x24, 0x50, 0xb9, 0x08, 0xfb, + 0x04, 0xf0, 0x2b, 0x18, 0x22, 0x46, 0x39, 0x46, 0x30, 0x46, 0x00, 0xf0, + 0x57, 0xfb, 0x64, 0x1c, 0x08, 0x2c, 0xf4, 0xd3, 0x0f, 0xaa, 0x39, 0x46, + 0x30, 0x46, 0x00, 0xf0, 0x86, 0xfb, 0x76, 0x1c, 0x08, 0x2e, 0xe4, 0xd3, + 0x03, 0x98, 0x0d, 0xf5, 0xa0, 0x6d, 0x33, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0xbd, 0xf8, 0x2a, 0x00, 0x31, 0x70, 0x80, 0x44, 0xdd, 0xf8, 0xc0, 0x05, + 0x00, 0x22, 0x20, 0xf8, 0x15, 0x20, 0xa2, 0xe7, 0x2d, 0xe9, 0xf8, 0x4f, + 0x88, 0xb0, 0x05, 0x46, 0xf4, 0xf7, 0x42, 0xf8, 0x4f, 0xf0, 0x00, 0x09, + 0x5f, 0xea, 0x00, 0x08, 0x08, 0xbf, 0x4f, 0xf6, 0x77, 0x79, 0x00, 0xf0, + 0x4e, 0x81, 0x00, 0x24, 0xaa, 0x46, 0xdf, 0xf8, 0xbc, 0xb8, 0x8d, 0xf8, + 0x00, 0x50, 0x5b, 0xf8, 0x2a, 0x00, 0xdf, 0xf8, 0xb4, 0x28, 0x07, 0x90, + 0x30, 0x21, 0x61, 0x43, 0x08, 0xeb, 0x01, 0x05, 0x00, 0xeb, 0x84, 0x00, + 0xd5, 0xf8, 0x29, 0x30, 0x00, 0x21, 0x00, 0xf5, 0xa0, 0x70, 0xff, 0xf7, + 0xa7, 0xfd, 0x07, 0x98, 0xd5, 0xf8, 0x0a, 0x30, 0x1c, 0x26, 0x06, 0xfb, + 0x04, 0x06, 0x6f, 0xf0, 0x7f, 0x42, 0x00, 0x21, 0x06, 0xf1, 0x14, 0x00, + 0xff, 0xf7, 0x9a, 0xfd, 0x37, 0x46, 0xab, 0x7b, 0x03, 0x22, 0x00, 0xf0, + 0xb3, 0xfa, 0x10, 0x36, 0x00, 0x23, 0x4f, 0xf0, 0x00, 0x52, 0x1d, 0x21, + 0x00, 0xf0, 0xbe, 0xfb, 0x01, 0x23, 0x4f, 0xf0, 0x80, 0x52, 0x00, 0xf0, + 0xb8, 0xfb, 0x05, 0xf1, 0x21, 0x06, 0x4f, 0xf4, 0x70, 0x72, 0x33, 0x78, + 0x06, 0x21, 0x00, 0xf0, 0xa0, 0xfa, 0x73, 0x78, 0x3c, 0x22, 0x02, 0x21, + 0x00, 0xf0, 0x9b, 0xfa, 0x33, 0x7b, 0x4f, 0xf4, 0x80, 0x32, 0x10, 0x21, + 0x00, 0xf0, 0x95, 0xfa, 0xb0, 0x78, 0xad, 0xf8, 0x0c, 0x00, 0xf0, 0x78, + 0xad, 0xf8, 0x0e, 0x00, 0x30, 0x79, 0x00, 0xf0, 0x99, 0xfa, 0x70, 0x79, + 0xad, 0xf8, 0x0a, 0x00, 0x22, 0x46, 0xb0, 0x79, 0xad, 0xf8, 0x08, 0x00, + 0xf1, 0x79, 0xad, 0xf8, 0x06, 0x10, 0x9d, 0xf8, 0x00, 0x10, 0x07, 0x91, + 0x01, 0x21, 0x07, 0x98, 0x00, 0xf0, 0xca, 0xfa, 0x8d, 0xf8, 0x10, 0x40, + 0x04, 0xa9, 0xd5, 0xf8, 0x0f, 0x00, 0x05, 0x90, 0x64, 0x1c, 0xd5, 0xf8, + 0x1b, 0x00, 0x06, 0x90, 0xe8, 0x7f, 0x8d, 0xf8, 0x11, 0x00, 0x9d, 0xf8, + 0x00, 0x00, 0x00, 0xf0, 0x0b, 0xfb, 0x08, 0x2c, 0x8f, 0xd3, 0x08, 0xf5, + 0xc0, 0x72, 0x07, 0x98, 0x01, 0x21, 0x00, 0xf0, 0xe8, 0xfa, 0x5b, 0xf8, + 0x2a, 0x50, 0x00, 0x26, 0x08, 0xeb, 0xc6, 0x00, 0x00, 0xf5, 0xd2, 0x67, + 0x05, 0xeb, 0x86, 0x04, 0x04, 0xf5, 0x80, 0x74, 0xfb, 0x79, 0x4f, 0xf0, + 0xe0, 0x42, 0x1c, 0x21, 0x00, 0xf0, 0xd0, 0xfa, 0x00, 0xf0, 0x49, 0xfa, + 0x00, 0xf0, 0xcc, 0xfa, 0x00, 0xf0, 0x40, 0xfa, 0x00, 0xf0, 0xc8, 0xfa, + 0x3b, 0x79, 0x4f, 0xf4, 0xe0, 0x22, 0x10, 0x21, 0x00, 0xf0, 0xc2, 0xfa, + 0x00, 0xf0, 0x31, 0xfa, 0x00, 0xf0, 0xbe, 0xfa, 0xbb, 0x78, 0x00, 0xf0, + 0xb8, 0xfa, 0x7b, 0x78, 0x70, 0x22, 0x04, 0x21, 0x00, 0xf0, 0xb6, 0xfa, + 0x3b, 0x78, 0x07, 0x22, 0x00, 0xf0, 0xb5, 0xfa, 0x76, 0x1c, 0x08, 0x2e, + 0xd0, 0xd3, 0x08, 0xf5, 0xda, 0x65, 0x5b, 0xf8, 0x2a, 0x40, 0x2b, 0x78, + 0x7f, 0x22, 0x00, 0x21, 0x04, 0xf1, 0xfc, 0x00, 0xff, 0xf7, 0x06, 0xfd, + 0xd8, 0xf8, 0xd1, 0x36, 0x00, 0xf0, 0x09, 0xfa, 0x04, 0xf5, 0x90, 0x70, + 0xff, 0xf7, 0xfe, 0xfc, 0xd8, 0xf8, 0xd5, 0x36, 0x00, 0xf0, 0x01, 0xfa, + 0x04, 0xf5, 0x92, 0x70, 0xff, 0xf7, 0xf6, 0xfc, 0x6b, 0x7a, 0x01, 0x22, + 0x00, 0x21, 0x04, 0xf1, 0xf8, 0x00, 0xff, 0xf7, 0xef, 0xfc, 0xab, 0x7a, + 0xff, 0x22, 0x00, 0x21, 0x04, 0xf1, 0xe4, 0x00, 0xff, 0xf7, 0xe8, 0xfc, + 0x6b, 0x7b, 0x3f, 0x22, 0x00, 0x21, 0x04, 0xf1, 0xf0, 0x00, 0xff, 0xf7, + 0xe1, 0xfc, 0xab, 0x7b, 0x3f, 0x22, 0x00, 0x21, 0x04, 0xf1, 0xf4, 0x00, + 0xff, 0xf7, 0xda, 0xfc, 0x04, 0xf5, 0x9e, 0x76, 0xeb, 0x7b, 0xff, 0x22, + 0x00, 0xf0, 0x0e, 0xfb, 0x2b, 0x7c, 0x4f, 0xf4, 0x7f, 0x42, 0x08, 0x21, + 0x00, 0xf0, 0xfe, 0xfa, 0x6b, 0x7c, 0x4f, 0xf4, 0x7f, 0x02, 0x10, 0x21, + 0x00, 0xf0, 0xf8, 0xfa, 0x04, 0xf5, 0x9c, 0x76, 0xab, 0x7c, 0x07, 0x22, + 0x00, 0xf0, 0xfc, 0xfa, 0xeb, 0x7c, 0x70, 0x22, 0x04, 0x21, 0x00, 0xf0, + 0xed, 0xfa, 0x2b, 0x7d, 0x00, 0xf0, 0xc5, 0xf9, 0x00, 0xf0, 0xe8, 0xfa, + 0x6b, 0x7d, 0x00, 0xf0, 0xc5, 0xf9, 0x00, 0xf0, 0xe3, 0xfa, 0xab, 0x7d, + 0x4f, 0xf4, 0xe0, 0x22, 0x10, 0x21, 0x00, 0xf0, 0xdd, 0xfa, 0xeb, 0x7d, + 0x00, 0xf0, 0xbf, 0xf9, 0x00, 0xf0, 0xd8, 0xfa, 0x2b, 0x7e, 0x00, 0xf0, + 0xbf, 0xf9, 0x00, 0xf0, 0xd3, 0xfa, 0x6b, 0x7e, 0x4f, 0xf0, 0xe0, 0x42, + 0x00, 0xf0, 0xcd, 0xfa, 0x00, 0x26, 0x04, 0xeb, 0x86, 0x00, 0x00, 0xf5, + 0x94, 0x7b, 0x08, 0xeb, 0x86, 0x00, 0x00, 0xf2, 0xea, 0x67, 0xdf, 0xf8, + 0x74, 0x26, 0x7b, 0x88, 0x10, 0x21, 0x58, 0x46, 0xff, 0xf7, 0x8e, 0xfc, + 0x3b, 0x88, 0x40, 0xf2, 0xff, 0x32, 0x00, 0x21, 0x58, 0x46, 0xff, 0xf7, + 0x87, 0xfc, 0x76, 0x1c, 0x04, 0x2e, 0xe6, 0xd3, 0xdf, 0xf8, 0x54, 0x06, + 0x50, 0xf8, 0x2a, 0x00, 0xeb, 0x7a, 0x00, 0xf5, 0xf8, 0x74, 0x03, 0x22, + 0x00, 0xf0, 0x1b, 0xfa, 0x2b, 0x7b, 0x70, 0x22, 0x04, 0x21, 0x00, 0xf0, + 0x13, 0xfa, 0x98, 0xf8, 0xfa, 0x36, 0x00, 0xf0, 0x0c, 0xfa, 0x48, 0x46, + 0x72, 0xe1, 0x2d, 0xe9, 0xf8, 0x4f, 0x88, 0xb0, 0x05, 0x46, 0xf3, 0xf7, + 0xd3, 0xfe, 0x4f, 0xf0, 0x00, 0x0b, 0x5f, 0xea, 0x00, 0x0a, 0x08, 0xbf, + 0x4f, 0xf6, 0x77, 0x7b, 0x00, 0xf0, 0x63, 0x81, 0x00, 0x24, 0xa9, 0x46, + 0xdf, 0xf8, 0x0c, 0x66, 0x8d, 0xf8, 0x00, 0x50, 0x56, 0xf8, 0x29, 0x00, + 0xdf, 0xf8, 0xf4, 0x25, 0x04, 0x90, 0x30, 0x21, 0x61, 0x43, 0x0a, 0xeb, + 0x01, 0x05, 0x00, 0xeb, 0x84, 0x00, 0xd5, 0xf8, 0x2a, 0x30, 0x00, 0x21, + 0x00, 0xf5, 0xb0, 0x70, 0xff, 0xf7, 0x48, 0xfc, 0x04, 0x98, 0xd5, 0xf8, + 0x0b, 0x30, 0x00, 0xeb, 0x44, 0x18, 0x6f, 0xf0, 0x7f, 0x42, 0x00, 0x21, + 0x08, 0xf1, 0x14, 0x00, 0xff, 0xf7, 0x3c, 0xfc, 0xeb, 0x7b, 0x03, 0x22, + 0x00, 0xf0, 0x6a, 0xf9, 0x08, 0xf1, 0x10, 0x07, 0x00, 0x23, 0x4f, 0xf0, + 0x00, 0x52, 0x1d, 0x21, 0x00, 0xf0, 0x4f, 0xf9, 0x01, 0x23, 0x4f, 0xf0, + 0x80, 0x52, 0x1c, 0x21, 0x00, 0xf0, 0x49, 0xf9, 0x05, 0xf1, 0x21, 0x07, + 0xff, 0x22, 0x3b, 0x78, 0x00, 0x21, 0x08, 0xf1, 0x1c, 0x00, 0xff, 0xf7, + 0x21, 0xfc, 0x7b, 0x78, 0x3c, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x3f, 0xf9, + 0xbb, 0x78, 0x4f, 0xf4, 0x70, 0x72, 0x06, 0x21, 0x00, 0xf0, 0x39, 0xf9, + 0x7b, 0x7b, 0x4f, 0xf4, 0x80, 0x32, 0x00, 0xf0, 0x33, 0xf9, 0xf8, 0x78, + 0xad, 0xf8, 0x0c, 0x00, 0x38, 0x79, 0xad, 0xf8, 0x0e, 0x00, 0x78, 0x79, + 0x00, 0xf0, 0x34, 0xf9, 0xb8, 0x79, 0xad, 0xf8, 0x0a, 0x00, 0x22, 0x46, + 0xf8, 0x79, 0xad, 0xf8, 0x08, 0x00, 0x39, 0x7a, 0xad, 0xf8, 0x06, 0x10, + 0x9d, 0xf8, 0x00, 0x10, 0x04, 0x91, 0x00, 0x21, 0x04, 0x98, 0x00, 0xf0, + 0x65, 0xf9, 0x8d, 0xf8, 0x14, 0x40, 0x05, 0xa9, 0x28, 0x69, 0x06, 0x90, + 0x64, 0x1c, 0xe8, 0x69, 0x07, 0x90, 0x95, 0xf8, 0x20, 0x00, 0x8d, 0xf8, + 0x15, 0x00, 0x9d, 0xf8, 0x00, 0x00, 0x00, 0xf0, 0xef, 0xf9, 0x08, 0x2c, + 0x8a, 0xd3, 0x0a, 0xf2, 0x81, 0x12, 0x04, 0x98, 0x00, 0x21, 0x00, 0xf0, + 0x84, 0xf9, 0x56, 0xf8, 0x29, 0x40, 0x00, 0x25, 0x04, 0xeb, 0x85, 0x00, + 0x00, 0xf5, 0x90, 0x78, 0x0a, 0xeb, 0xc5, 0x00, 0x00, 0xf2, 0x91, 0x67, + 0x4f, 0xf0, 0xe0, 0x42, 0xfb, 0x79, 0x1c, 0x21, 0x00, 0xf0, 0xf1, 0xf8, + 0x00, 0xf0, 0xe5, 0xf8, 0x00, 0xf0, 0xed, 0xf8, 0x00, 0xf0, 0xdc, 0xf8, + 0x00, 0xf0, 0xe9, 0xf8, 0x3b, 0x79, 0x4f, 0xf4, 0xe0, 0x22, 0x00, 0xf0, + 0xe3, 0xf8, 0x00, 0xf0, 0xce, 0xf8, 0x00, 0xf0, 0xe0, 0xf8, 0xbb, 0x78, + 0x00, 0xf0, 0xc5, 0xf8, 0x00, 0xf0, 0xdb, 0xf8, 0x7b, 0x78, 0x70, 0x22, + 0x04, 0x21, 0x00, 0xf0, 0xd6, 0xf8, 0x3b, 0x78, 0x07, 0x22, 0x00, 0xf0, + 0xe1, 0xf8, 0x6d, 0x1c, 0x08, 0x2d, 0xcf, 0xd3, 0x56, 0xf8, 0x29, 0x00, + 0x04, 0x90, 0x0a, 0xf2, 0xd1, 0x66, 0x07, 0x46, 0x33, 0x78, 0x7f, 0x22, + 0x00, 0x21, 0x07, 0xf5, 0x8e, 0x70, 0xff, 0xf7, 0x9f, 0xfb, 0xda, 0xf8, + 0xd2, 0x36, 0x00, 0xf0, 0xa2, 0xf8, 0x07, 0xf5, 0xa2, 0x70, 0xff, 0xf7, + 0x97, 0xfb, 0xda, 0xf8, 0xd6, 0x36, 0x00, 0xf0, 0x9a, 0xf8, 0x07, 0xf5, + 0xa0, 0x70, 0xff, 0xf7, 0x8f, 0xfb, 0x73, 0x7a, 0x01, 0x22, 0x00, 0x21, + 0x07, 0xf5, 0x8c, 0x70, 0xff, 0xf7, 0x88, 0xfb, 0xb3, 0x7a, 0xff, 0x22, + 0x00, 0x21, 0x07, 0xf5, 0x82, 0x70, 0xff, 0xf7, 0x81, 0xfb, 0x73, 0x7b, + 0x3f, 0x22, 0x00, 0x21, 0x07, 0xf5, 0x88, 0x70, 0xff, 0xf7, 0x7a, 0xfb, + 0xb3, 0x7b, 0x3f, 0x22, 0x00, 0x21, 0x07, 0xf5, 0x8a, 0x70, 0xff, 0xf7, + 0x73, 0xfb, 0x0a, 0xf2, 0xfb, 0x64, 0x07, 0xf5, 0xc0, 0x75, 0x23, 0x78, + 0x00, 0xf0, 0xa2, 0xf8, 0x63, 0x78, 0x00, 0xf0, 0x8f, 0xf8, 0x07, 0xf5, + 0xae, 0x75, 0xf3, 0x7b, 0x00, 0xf0, 0x9a, 0xf8, 0x33, 0x7c, 0x4f, 0xf4, + 0x7f, 0x42, 0x08, 0x21, 0x00, 0xf0, 0x87, 0xf8, 0x73, 0x7c, 0x00, 0xf0, + 0x81, 0xf8, 0xba, 0xf8, 0xfe, 0x36, 0x4f, 0xf6, 0xff, 0x72, 0x00, 0x21, + 0x07, 0xf5, 0xc4, 0x70, 0xff, 0xf7, 0x52, 0xfb, 0x07, 0xf5, 0xac, 0x75, + 0xb3, 0x7c, 0x07, 0x22, 0x00, 0xf0, 0x83, 0xf8, 0xf3, 0x7c, 0x70, 0x22, + 0x04, 0x21, 0x00, 0xf0, 0x70, 0xf8, 0x33, 0x7d, 0x00, 0xf0, 0x4f, 0xf8, + 0x00, 0xf0, 0x6b, 0xf8, 0x73, 0x7d, 0x00, 0xf0, 0x4f, 0xf8, 0x00, 0xf0, + 0x66, 0xf8, 0xb3, 0x7d, 0x4f, 0xf4, 0xe0, 0x22, 0x00, 0xf0, 0x60, 0xf8, + 0xf3, 0x7d, 0x00, 0xf0, 0x4a, 0xf8, 0x00, 0xf0, 0x5c, 0xf8, 0x33, 0x7e, + 0x00, 0xf0, 0x4a, 0xf8, 0x00, 0xf0, 0x57, 0xf8, 0x73, 0x7e, 0x4f, 0xf0, + 0xe0, 0x42, 0x1c, 0x21, 0x00, 0xf0, 0x51, 0xf8, 0x00, 0x25, 0x04, 0x98, + 0xdf, 0xf8, 0x94, 0x23, 0x00, 0xeb, 0x85, 0x00, 0x00, 0xf5, 0xa4, 0x78, + 0x0a, 0xeb, 0x85, 0x00, 0x00, 0xf2, 0xeb, 0x67, 0x10, 0x21, 0x7b, 0x88, + 0x00, 0xf0, 0x3b, 0xf8, 0x3b, 0x88, 0x40, 0xf2, 0xff, 0x32, 0x00, 0xf0, + 0x45, 0xf8, 0x6d, 0x1c, 0x04, 0x2d, 0xe8, 0xd3, 0xdd, 0x48, 0x50, 0xf8, + 0x29, 0x00, 0xf3, 0x7a, 0x00, 0xf5, 0xd8, 0x75, 0x03, 0x22, 0x00, 0xf0, + 0x3e, 0xf8, 0x33, 0x7b, 0x70, 0x22, 0x04, 0x21, 0x00, 0xf0, 0x2b, 0xf8, + 0xa3, 0x78, 0x00, 0xf0, 0x0a, 0xf8, 0x00, 0xf0, 0x26, 0xf8, 0x58, 0x46, + 0x09, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x4f, 0xf0, 0xff, 0x32, 0x00, 0x21, + 0x70, 0x47, 0x4f, 0xf4, 0xe0, 0x62, 0x08, 0x21, 0x70, 0x47, 0xfb, 0x78, + 0x4f, 0xf4, 0xe0, 0x42, 0x0c, 0x21, 0x70, 0x47, 0x7b, 0x79, 0x4f, 0xf4, + 0xe0, 0x02, 0x14, 0x21, 0x70, 0x47, 0xbb, 0x79, 0x4f, 0xf0, 0xe0, 0x62, + 0x18, 0x21, 0x70, 0x47, 0x00, 0x21, 0x38, 0x46, 0xff, 0xf7, 0xde, 0xba, + 0x10, 0x21, 0x40, 0x46, 0xff, 0xf7, 0xda, 0xba, 0x4f, 0xf4, 0x7f, 0x02, + 0x10, 0x21, 0x28, 0x46, 0xff, 0xf7, 0xd4, 0xba, 0x00, 0xb1, 0x01, 0x20, + 0x8d, 0xf8, 0x04, 0x00, 0x01, 0xab, 0x70, 0x47, 0x00, 0x21, 0x40, 0x46, + 0xff, 0xf7, 0xca, 0xba, 0xff, 0x22, 0x00, 0x21, 0x28, 0x46, 0xff, 0xf7, + 0xc5, 0xba, 0xf8, 0xb5, 0x05, 0x46, 0x0e, 0x46, 0x30, 0x00, 0x17, 0x46, + 0xab, 0x4c, 0x04, 0xd1, 0x4f, 0xf4, 0xa5, 0x61, 0x20, 0x46, 0xe9, 0xf7, + 0x79, 0xfe, 0x00, 0x20, 0x05, 0xe0, 0x37, 0xf8, 0x10, 0x20, 0x81, 0x19, + 0x24, 0xf8, 0x11, 0x20, 0x40, 0x1c, 0xa8, 0x42, 0xf7, 0xd3, 0x00, 0x20, + 0xf2, 0xbd, 0x70, 0xb5, 0x00, 0x21, 0xa1, 0x4a, 0x30, 0xf8, 0x11, 0x30, + 0x02, 0xeb, 0x41, 0x04, 0x45, 0x18, 0xa4, 0xf8, 0x10, 0x35, 0x56, 0x18, + 0x2b, 0x7c, 0x86, 0xf8, 0x20, 0x35, 0x49, 0x1c, 0x08, 0x29, 0xf1, 0xd3, + 0x00, 0x20, 0x70, 0xbd, 0x13, 0x46, 0x01, 0x22, 0xff, 0xf7, 0xa4, 0xba, + 0x13, 0x46, 0x00, 0x22, 0xff, 0xf7, 0xa0, 0xba, 0x38, 0xb5, 0x01, 0x29, + 0x0c, 0xbf, 0x9e, 0x49, 0x9e, 0x49, 0x1d, 0x46, 0x51, 0xf8, 0x20, 0x00, + 0x2b, 0x89, 0x00, 0xeb, 0x82, 0x04, 0x4f, 0xf0, 0x7c, 0x52, 0x18, 0x21, + 0x00, 0xf0, 0x20, 0xf8, 0x6b, 0x89, 0x4f, 0xf4, 0x7c, 0x12, 0x10, 0x21, + 0x00, 0xf0, 0x1a, 0xf8, 0x2b, 0x78, 0x01, 0x22, 0x00, 0xf0, 0x19, 0xf8, + 0xeb, 0x88, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0x11, 0xf8, 0xab, 0x88, + 0x04, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x0c, 0xf8, 0x6b, 0x88, 0x20, 0x46, + 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x70, 0x22, 0x04, 0x21, 0xff, 0xf7, + 0x65, 0xba, 0x4f, 0xf4, 0xe0, 0x62, 0x08, 0x21, 0x20, 0x46, 0xff, 0xf7, + 0x5f, 0xba, 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x5b, 0xba, 0x70, 0xb5, + 0x14, 0x46, 0x83, 0x4a, 0x52, 0xf8, 0x20, 0x50, 0x00, 0x26, 0x01, 0x29, + 0x1c, 0xbf, 0x81, 0x49, 0x51, 0xf8, 0x20, 0x50, 0x34, 0xf9, 0x16, 0x30, + 0x05, 0xeb, 0x86, 0x00, 0x4f, 0xf6, 0xff, 0x72, 0x00, 0x21, 0x00, 0xf5, + 0x80, 0x70, 0xff, 0xf7, 0x45, 0xfa, 0x76, 0x1c, 0xb6, 0xf5, 0x22, 0x7f, + 0xf0, 0xd3, 0x70, 0xbd, 0xf8, 0xb5, 0x0c, 0x46, 0x6f, 0x49, 0x51, 0xf8, + 0x20, 0x00, 0x25, 0x78, 0x1c, 0x21, 0x11, 0xfb, 0x05, 0x05, 0xa0, 0x68, + 0x00, 0xf0, 0xb0, 0xf8, 0x06, 0x46, 0x05, 0xf1, 0x10, 0x07, 0x63, 0x68, + 0x6f, 0xf0, 0x7f, 0x42, 0xff, 0xf7, 0x4a, 0xff, 0x33, 0x46, 0x00, 0xf0, + 0x5c, 0xf8, 0x01, 0x23, 0x4f, 0xf0, 0x00, 0x62, 0x1b, 0x21, 0xff, 0xf7, + 0x42, 0xff, 0x63, 0x78, 0x4f, 0xf0, 0x80, 0x62, 0x1a, 0x21, 0xff, 0xf7, + 0x3c, 0xff, 0x63, 0x78, 0x28, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x40, + 0x40, 0xe0, 0x38, 0xb5, 0x0c, 0x46, 0x5b, 0x49, 0x51, 0xf8, 0x20, 0x20, + 0x21, 0x78, 0x1c, 0x20, 0x10, 0xfb, 0x01, 0x21, 0x01, 0xf1, 0x10, 0x00, + 0x02, 0x68, 0x92, 0x0e, 0x02, 0xf0, 0x01, 0x02, 0x62, 0x70, 0x05, 0x68, + 0x51, 0xf8, 0x0c, 0x0f, 0x80, 0xb2, 0x00, 0xf0, 0x61, 0xf8, 0xa0, 0x60, + 0x25, 0xf0, 0x7f, 0x45, 0x28, 0x02, 0x48, 0xbf, 0x45, 0xf0, 0x7f, 0x45, + 0x65, 0x60, 0x31, 0xbd, 0x70, 0xb5, 0x00, 0xf0, 0x4e, 0xf8, 0x63, 0x68, + 0x05, 0xeb, 0x40, 0x15, 0x05, 0xf1, 0x10, 0x06, 0x6f, 0xf0, 0x7f, 0x42, + 0x00, 0xf0, 0x26, 0xf8, 0xa0, 0x68, 0x00, 0xf0, 0x65, 0xf8, 0x03, 0x46, + 0x00, 0xf0, 0x19, 0xf8, 0x01, 0x23, 0x4f, 0xf0, 0x00, 0x62, 0x1b, 0x21, + 0x00, 0xf0, 0x10, 0xf8, 0x63, 0x78, 0x4f, 0xf0, 0x80, 0x62, 0x1a, 0x21, + 0x00, 0xf0, 0x0a, 0xf8, 0x63, 0x78, 0x28, 0x46, 0xbd, 0xe8, 0x70, 0x40, + 0x4f, 0xf4, 0x80, 0x62, 0x0a, 0x21, 0xff, 0xf7, 0xd1, 0xb9, 0x1c, 0x21, + 0x30, 0x46, 0xff, 0xf7, 0xcd, 0xb9, 0x4f, 0xf6, 0xff, 0x72, 0x00, 0x21, + 0x05, 0xf1, 0x0c, 0x00, 0xff, 0xf7, 0xc6, 0xb9, 0x00, 0x21, 0x30, 0x46, + 0xff, 0xf7, 0xc2, 0xb9, 0x38, 0xb5, 0x00, 0xf0, 0x18, 0xf8, 0x05, 0xeb, + 0x40, 0x15, 0x05, 0xf1, 0x0c, 0x01, 0x08, 0x68, 0x80, 0xb2, 0x00, 0xf0, + 0x17, 0xf8, 0xa0, 0x60, 0x55, 0xf8, 0x10, 0x0f, 0x80, 0x0e, 0x00, 0xf0, + 0x01, 0x00, 0x60, 0x70, 0x28, 0x68, 0x20, 0xf0, 0x7f, 0x40, 0x01, 0x02, + 0x48, 0xbf, 0x40, 0xf0, 0x7f, 0x40, 0x60, 0x60, 0x31, 0xbd, 0x0c, 0x46, + 0x27, 0x49, 0x51, 0xf8, 0x20, 0x50, 0x20, 0x78, 0x70, 0x47, 0x00, 0x00, + 0x00, 0xee, 0x10, 0x0a, 0x80, 0xb5, 0xb8, 0xee, 0x40, 0x0a, 0xdf, 0xed, + 0x1b, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0x9f, 0xed, 0x1a, 0x1a, 0x20, 0xee, + 0x01, 0x0a, 0xd8, 0xf7, 0x93, 0xf8, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, + 0x10, 0x0a, 0x4f, 0xf4, 0xb4, 0x72, 0x90, 0xfb, 0xf2, 0xf2, 0x4f, 0xf4, + 0xb4, 0x71, 0x01, 0xfb, 0x12, 0x00, 0x02, 0xbd, 0x4f, 0xf4, 0xb4, 0x72, + 0x90, 0xfb, 0xf2, 0xf2, 0x4f, 0xf4, 0xb4, 0x71, 0x01, 0xfb, 0x12, 0x00, + 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xdf, 0xed, 0x0b, 0x0a, + 0x60, 0xee, 0x20, 0x0a, 0x9f, 0xed, 0x07, 0x1a, 0x80, 0xee, 0x81, 0x1a, + 0xbc, 0xee, 0xc1, 0x1a, 0x11, 0xee, 0x10, 0x0a, 0x70, 0x47, 0x00, 0x00, + 0x18, 0x92, 0x04, 0x01, 0x70, 0x2e, 0x02, 0x20, 0xb4, 0x76, 0x02, 0x20, + 0x00, 0x00, 0xb4, 0x43, 0x00, 0x00, 0x80, 0x37, 0x00, 0x00, 0x80, 0x47, + 0xe8, 0x94, 0x04, 0x01, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xff, 0x03, + 0x28, 0x95, 0x04, 0x01, 0x48, 0x96, 0x04, 0x01, 0x88, 0x96, 0x04, 0x01, + 0x08, 0x95, 0x04, 0x01, 0x68, 0x96, 0x04, 0x01, 0x10, 0xee, 0x10, 0x1a, + 0x49, 0x00, 0x10, 0xb5, 0x09, 0x16, 0x49, 0x1c, 0x1a, 0xd0, 0x10, 0xee, + 0x10, 0x1a, 0x49, 0x00, 0x16, 0xd0, 0x10, 0xee, 0x90, 0x1a, 0x49, 0x00, + 0x09, 0x16, 0x49, 0x1c, 0x10, 0xd0, 0x10, 0xee, 0x90, 0x1a, 0x49, 0x00, + 0x0c, 0xd0, 0x9f, 0xed, 0x8b, 0x1a, 0xb4, 0xee, 0x41, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x40, 0xf1, 0x80, 0x80, 0x10, 0xee, 0x90, 0x1a, 0x01, 0xf0, + 0x00, 0x40, 0x8a, 0xe0, 0x10, 0xee, 0x10, 0x2a, 0x52, 0x00, 0x11, 0x16, + 0x49, 0x1c, 0x02, 0xd1, 0x12, 0x02, 0x40, 0xf0, 0xff, 0x80, 0x10, 0xee, + 0x90, 0x2a, 0x52, 0x00, 0x11, 0x16, 0x49, 0x1c, 0x01, 0xd1, 0x12, 0x02, + 0x41, 0xd1, 0x10, 0xee, 0x90, 0x1a, 0x49, 0x00, 0x08, 0xd1, 0x10, 0xee, + 0x10, 0x1a, 0x48, 0x00, 0x00, 0x16, 0x40, 0x1c, 0x37, 0xd1, 0x49, 0x02, + 0x35, 0xd1, 0x0e, 0xe0, 0x09, 0x16, 0x49, 0x1c, 0x10, 0xee, 0x90, 0x2a, + 0x0e, 0xd1, 0x52, 0x02, 0x0c, 0xd1, 0x10, 0xee, 0x10, 0x1a, 0x48, 0x00, + 0x00, 0x16, 0x40, 0x1c, 0x27, 0xd1, 0x49, 0x02, 0x25, 0xd1, 0xaf, 0xf3, + 0x00, 0x80, 0x9f, 0xed, 0x6e, 0x0a, 0x10, 0xbd, 0x10, 0xee, 0x10, 0x1a, + 0x49, 0x00, 0x1f, 0xd1, 0x10, 0xee, 0x90, 0x3a, 0x23, 0xf0, 0x00, 0x42, + 0xd1, 0x0d, 0x00, 0xeb, 0x01, 0x04, 0x22, 0xd1, 0x2a, 0xb1, 0xb0, 0xee, + 0x60, 0x0a, 0x08, 0xf0, 0x47, 0xf8, 0xf0, 0xee, 0x40, 0x0a, 0x10, 0xee, + 0x90, 0x0a, 0x41, 0x00, 0x07, 0xd0, 0x10, 0xee, 0x90, 0x1a, 0x48, 0x00, + 0x00, 0x16, 0x40, 0x1c, 0x03, 0xd1, 0x49, 0x02, 0x01, 0xd1, 0xaf, 0xf3, + 0x00, 0x80, 0xb0, 0xee, 0x60, 0x0a, 0x10, 0xbd, 0x10, 0xee, 0x10, 0x1a, + 0x48, 0x00, 0x00, 0x16, 0x40, 0x1c, 0x19, 0xd1, 0x49, 0x02, 0x17, 0xd1, + 0x20, 0xee, 0x20, 0x0a, 0x10, 0xbd, 0x00, 0x2c, 0xda, 0xdd, 0xff, 0x2c, + 0x09, 0xdb, 0x10, 0xee, 0x90, 0x1a, 0x4f, 0xf0, 0xff, 0x40, 0x01, 0xf0, + 0x00, 0x41, 0x08, 0x43, 0x00, 0xee, 0x90, 0x0a, 0xd5, 0xe7, 0x23, 0xf0, + 0xff, 0x43, 0x43, 0xea, 0xc4, 0x53, 0x00, 0xee, 0x90, 0x3a, 0xce, 0xe7, + 0x10, 0xee, 0x90, 0x1a, 0x01, 0xf0, 0x00, 0x40, 0x0f, 0xe0, 0x9f, 0xed, + 0x49, 0x1a, 0xb4, 0xee, 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x0b, 0xdb, + 0x10, 0xee, 0x90, 0x1a, 0xaf, 0xf3, 0x00, 0x80, 0x4f, 0xf0, 0xff, 0x40, + 0x01, 0xf0, 0x00, 0x41, 0x08, 0x43, 0x00, 0xee, 0x10, 0x0a, 0x10, 0xbd, + 0x9f, 0xed, 0x40, 0x1a, 0x20, 0xee, 0x01, 0x1a, 0x11, 0xee, 0x10, 0x2a, + 0x4f, 0xf0, 0x7c, 0x51, 0x02, 0xf0, 0x00, 0x42, 0x11, 0x43, 0x01, 0xee, + 0x90, 0x1a, 0x31, 0xee, 0x21, 0x1a, 0xbd, 0xee, 0xc1, 0x1a, 0x11, 0xee, + 0x10, 0x1a, 0xb8, 0xee, 0xc1, 0x1a, 0xdf, 0xed, 0x37, 0x1a, 0x01, 0xee, + 0x61, 0x0a, 0x9f, 0xed, 0x36, 0x2a, 0x01, 0xee, 0x42, 0x0a, 0x10, 0xee, + 0x10, 0x2a, 0x22, 0xf0, 0x00, 0x42, 0x01, 0xee, 0x10, 0x2a, 0xdf, 0xed, + 0x32, 0x1a, 0xb4, 0xee, 0x61, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, + 0xb0, 0xee, 0x60, 0x0a, 0x1d, 0xd4, 0xdf, 0xed, 0x2e, 0x2a, 0xb6, 0xee, + 0x00, 0x3a, 0x20, 0xee, 0x00, 0x1a, 0x9f, 0xed, 0x2c, 0x2a, 0x01, 0xee, + 0x22, 0x3a, 0x61, 0xee, 0x02, 0x1a, 0x23, 0xee, 0x00, 0x0a, 0x31, 0xee, + 0x80, 0x1a, 0x31, 0xee, 0xc0, 0x0a, 0xf7, 0xee, 0x00, 0x3a, 0xf7, 0xee, + 0x00, 0x1a, 0x71, 0xee, 0x23, 0x3a, 0x70, 0xee, 0x21, 0x1a, 0xc3, 0xee, + 0xa1, 0x1a, 0x21, 0xee, 0xa0, 0x0a, 0x10, 0xee, 0x10, 0x3a, 0x40, 0x18, + 0x23, 0xf0, 0x00, 0x42, 0xd1, 0x0d, 0x00, 0xeb, 0x01, 0x04, 0x14, 0xd0, + 0x00, 0x2c, 0x12, 0xdd, 0xff, 0x2c, 0x09, 0xdb, 0x10, 0xee, 0x10, 0x1a, + 0x4f, 0xf0, 0xff, 0x40, 0x01, 0xf0, 0x00, 0x41, 0x08, 0x43, 0x00, 0xee, + 0x10, 0x0a, 0x09, 0xe0, 0x23, 0xf0, 0xff, 0x43, 0x43, 0xea, 0xc4, 0x53, + 0x00, 0xee, 0x10, 0x3a, 0x02, 0xe0, 0x0a, 0xb1, 0x07, 0xf0, 0x90, 0xff, + 0x10, 0xee, 0x10, 0x0a, 0x41, 0x00, 0x07, 0xd0, 0x10, 0xee, 0x10, 0x1a, + 0x48, 0x00, 0x00, 0x16, 0x40, 0x1c, 0x03, 0xd1, 0x49, 0x02, 0x01, 0xd1, + 0xaf, 0xf3, 0x00, 0x80, 0x10, 0xbd, 0x00, 0xbf, 0x00, 0x00, 0x65, 0xc3, + 0xff, 0xff, 0xff, 0x7f, 0x01, 0x00, 0x65, 0x43, 0x3b, 0xaa, 0xb8, 0x3f, + 0x00, 0x60, 0x31, 0x3f, 0xbf, 0xbf, 0x90, 0x39, 0x01, 0x00, 0x00, 0x33, + 0x13, 0x54, 0x08, 0x3c, 0x9e, 0xbf, 0xcc, 0x3d, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, + 0x11, 0x40, 0x29, 0x43, 0x01, 0x70, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0xf0, 0xb5, 0xb6, 0x4c, 0x54, 0xf8, 0x20, 0x00, 0x04, 0x1d, 0x14, 0x25, + 0x00, 0xf1, 0x4e, 0x07, 0x25, 0x70, 0x00, 0x26, 0x00, 0xf1, 0x55, 0x04, + 0x3e, 0x70, 0x00, 0xf1, 0x50, 0x07, 0x26, 0x70, 0x00, 0xf1, 0x57, 0x04, + 0x3e, 0x70, 0x26, 0x70, 0x00, 0xf1, 0x56, 0x04, 0x00, 0xf1, 0x4f, 0x05, + 0x00, 0xf1, 0x54, 0x06, 0x4d, 0x30, 0x23, 0xb1, 0x08, 0x21, 0x01, 0x70, + 0x31, 0x70, 0x00, 0x22, 0x0b, 0xe0, 0x29, 0xb9, 0x18, 0x21, 0x01, 0x70, + 0x31, 0x70, 0x1f, 0x27, 0x2f, 0x70, 0x27, 0x70, 0x2a, 0xb1, 0x18, 0x21, + 0x01, 0x70, 0x31, 0x70, 0x15, 0x22, 0x2a, 0x70, 0x22, 0x70, 0xf0, 0xbd, + 0x9e, 0x49, 0x03, 0x22, 0xf8, 0xb5, 0x51, 0xf8, 0x20, 0x50, 0x00, 0x23, + 0x00, 0xf0, 0x58, 0xf8, 0x00, 0x23, 0x00, 0xf0, 0x59, 0xf8, 0x00, 0xf0, + 0xef, 0xf8, 0x00, 0xf0, 0xe9, 0xf8, 0x00, 0xf0, 0x3d, 0xf8, 0x06, 0xd0, + 0x00, 0xf0, 0xe8, 0xf8, 0x76, 0x1c, 0xb6, 0xf5, 0xfa, 0x6f, 0xf6, 0xd1, + 0x02, 0xe0, 0xb6, 0xf5, 0xfa, 0x6f, 0x05, 0xd1, 0xf8, 0x07, 0x4c, 0xbf, + 0x40, 0xf2, 0x09, 0x54, 0x40, 0xf2, 0x0a, 0x54, 0x20, 0x46, 0xf2, 0xbd, + 0xf8, 0xb5, 0x8c, 0x49, 0x51, 0xf8, 0x20, 0x50, 0x8b, 0x49, 0x08, 0x5c, + 0x00, 0xf0, 0xcc, 0xf8, 0x10, 0xb9, 0x40, 0xf2, 0x0b, 0x54, 0x1b, 0xe0, + 0x01, 0x23, 0x03, 0x22, 0x00, 0xf0, 0x2c, 0xf8, 0x01, 0x23, 0x00, 0xf0, + 0x2d, 0xf8, 0x00, 0xf0, 0xc3, 0xf8, 0x00, 0xf0, 0x13, 0xf8, 0x06, 0xd0, + 0x00, 0xf0, 0xbe, 0xf8, 0x76, 0x1c, 0xb6, 0xf5, 0xfa, 0x6f, 0xf6, 0xd1, + 0x02, 0xe0, 0xb6, 0xf5, 0xfa, 0x6f, 0x05, 0xd1, 0xf8, 0x07, 0x4c, 0xbf, + 0x40, 0xf2, 0x02, 0x54, 0x40, 0xf2, 0x01, 0x54, 0x20, 0x46, 0xf2, 0xbd, + 0x05, 0xf1, 0x3c, 0x00, 0x00, 0x78, 0xc0, 0xf3, 0x00, 0x10, 0x08, 0xb1, + 0x47, 0xf0, 0x01, 0x07, 0x05, 0xf1, 0x3d, 0x00, 0x00, 0x78, 0xc0, 0xf3, + 0x00, 0x10, 0x08, 0xb1, 0x47, 0xf0, 0x02, 0x07, 0x03, 0x2f, 0x70, 0x47, + 0x00, 0x21, 0x05, 0xf1, 0x3a, 0x00, 0x5d, 0xe7, 0x03, 0x22, 0x00, 0x21, + 0x05, 0xf1, 0x3b, 0x00, 0x58, 0xe7, 0x2d, 0xe9, 0xf8, 0x43, 0x6b, 0x49, + 0x09, 0x68, 0x06, 0x46, 0x67, 0x48, 0x50, 0xf8, 0x26, 0x40, 0x8a, 0x19, + 0xed, 0x20, 0x92, 0xf8, 0xbc, 0x30, 0x43, 0x43, 0xc8, 0x18, 0x00, 0xf2, + 0x44, 0x47, 0x65, 0x49, 0xf8, 0x68, 0x88, 0x42, 0x4f, 0xf0, 0x00, 0x08, + 0x02, 0xd3, 0x63, 0x49, 0x88, 0x42, 0x06, 0xd3, 0x62, 0x4a, 0x05, 0x21, + 0x02, 0x20, 0xe5, 0xf7, 0x86, 0xfe, 0x40, 0xf2, 0x0c, 0x58, 0x07, 0xf1, + 0xd9, 0x05, 0x01, 0x21, 0xa8, 0x78, 0xfa, 0x68, 0xc0, 0xf1, 0x12, 0x00, + 0x01, 0xfa, 0x00, 0xf0, 0xb2, 0xfb, 0xf0, 0xf3, 0xe8, 0x78, 0xc0, 0xf1, + 0x12, 0x00, 0x01, 0xfa, 0x00, 0xf0, 0xb2, 0xfb, 0xf0, 0xf0, 0x97, 0xf8, + 0x81, 0x20, 0xc2, 0xf1, 0x12, 0x02, 0x91, 0x40, 0xfa, 0x68, 0xb2, 0xfb, + 0xf1, 0xf1, 0x42, 0xf6, 0xe1, 0x62, 0x93, 0x42, 0x3e, 0xbf, 0x90, 0x42, + 0x41, 0xf2, 0x71, 0x70, 0x81, 0x42, 0x02, 0xd3, 0x40, 0xf2, 0x0b, 0x58, + 0x1d, 0xe0, 0x04, 0xf1, 0x38, 0x09, 0x2b, 0x78, 0x00, 0xf0, 0x1c, 0xf8, + 0x6b, 0x78, 0xf0, 0x22, 0x04, 0x21, 0x00, 0xf0, 0x19, 0xf8, 0x04, 0xf1, + 0x39, 0x09, 0xab, 0x78, 0x00, 0xf0, 0x12, 0xf8, 0xeb, 0x78, 0xf0, 0x22, + 0x04, 0x21, 0x00, 0xf0, 0x0f, 0xf8, 0x97, 0xf8, 0x81, 0x30, 0x0f, 0x22, + 0x00, 0x21, 0xa0, 0x1d, 0xff, 0xf7, 0xf8, 0xfe, 0x3a, 0x49, 0x01, 0x20, + 0x88, 0x55, 0x40, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0x0f, 0x22, 0x00, 0x21, + 0x48, 0x46, 0xed, 0xe6, 0x34, 0x49, 0x03, 0x22, 0xf8, 0xb5, 0x51, 0xf8, + 0x20, 0x50, 0x02, 0x23, 0xff, 0xf7, 0x84, 0xff, 0x02, 0x23, 0xff, 0xf7, + 0x85, 0xff, 0x00, 0xf0, 0x1b, 0xf8, 0x00, 0xf0, 0x15, 0xf8, 0xff, 0xf7, + 0x69, 0xff, 0x06, 0xd0, 0x00, 0xf0, 0x14, 0xf8, 0x76, 0x1c, 0xb6, 0xf5, + 0xfa, 0x6f, 0xf6, 0xd1, 0x02, 0xe0, 0xb6, 0xf5, 0xfa, 0x6f, 0x05, 0xd1, + 0xf8, 0x07, 0x4c, 0xbf, 0x4f, 0xf4, 0xa1, 0x64, 0x40, 0xf2, 0x07, 0x54, + 0x20, 0x46, 0xf2, 0xbd, 0x00, 0x24, 0x00, 0x26, 0x00, 0x27, 0x70, 0x47, + 0x01, 0x20, 0xef, 0xf7, 0xdb, 0xbf, 0x1f, 0x49, 0x00, 0x23, 0x01, 0x22, + 0x2d, 0xe9, 0xf0, 0x41, 0x51, 0xf8, 0x20, 0x50, 0x05, 0xf1, 0x08, 0x08, + 0x00, 0x21, 0x00, 0xf0, 0x41, 0xf8, 0x00, 0x23, 0x00, 0xf0, 0x3c, 0xf8, + 0xff, 0xf7, 0xec, 0xff, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, + 0x37, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0x32, 0xf8, 0xff, 0xf7, 0xe2, 0xff, + 0xff, 0xf7, 0xdc, 0xff, 0x0a, 0x35, 0x42, 0xf2, 0x10, 0x78, 0x28, 0x78, + 0xc0, 0x07, 0x28, 0x78, 0x48, 0xbf, 0x47, 0xf0, 0x01, 0x07, 0xc0, 0xf3, + 0x00, 0x10, 0x08, 0xb1, 0x47, 0xf0, 0x02, 0x07, 0x03, 0x2f, 0x05, 0xd0, + 0xff, 0xf7, 0xce, 0xff, 0x76, 0x1c, 0x46, 0x45, 0xed, 0xd1, 0x01, 0xe0, + 0x46, 0x45, 0x05, 0xd1, 0xf8, 0x07, 0x4c, 0xbf, 0x40, 0xf2, 0x04, 0x54, + 0x40, 0xf2, 0x03, 0x54, 0x20, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x00, + 0xa8, 0x97, 0x04, 0x01, 0x54, 0x77, 0x02, 0x20, 0xb4, 0x76, 0x02, 0x20, + 0xc0, 0x5c, 0x15, 0x00, 0xc1, 0xc6, 0x2d, 0x00, 0x44, 0x91, 0x04, 0x01, + 0x10, 0x22, 0x04, 0x21, 0x40, 0x46, 0x73, 0xe6, 0x00, 0x21, 0x01, 0x60, + 0x41, 0x60, 0x81, 0x60, 0xc1, 0x60, 0x01, 0x61, 0x70, 0x47, 0x00, 0x21, + 0x01, 0x60, 0x41, 0x60, 0x70, 0x47, 0xb1, 0xf1, 0x00, 0x4f, 0x08, 0xbf, + 0x00, 0x21, 0x01, 0x60, 0xc2, 0x68, 0x52, 0x1c, 0xc2, 0x60, 0x21, 0xb9, + 0x01, 0x69, 0x49, 0x1c, 0x01, 0x61, 0x64, 0x21, 0x41, 0x60, 0x70, 0x47, + 0x06, 0xf0, 0x40, 0xb8, 0x06, 0xf0, 0x43, 0xb8, 0xb0, 0xfa, 0x80, 0xf0, + 0xc0, 0xf1, 0x1f, 0x00, 0x70, 0x47, 0x01, 0x21, 0x01, 0xfa, 0x00, 0xf0, + 0x70, 0x47, 0x00, 0x00, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x78, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x70, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x38, 0xb5, 0x04, 0x46, + 0x3f, 0x4d, 0x23, 0x46, 0x01, 0x22, 0x00, 0x21, 0x28, 0x46, 0xff, 0xf7, + 0xe9, 0xff, 0x23, 0x46, 0x28, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, + 0x08, 0x22, 0x03, 0x21, 0xe0, 0xe7, 0x03, 0x46, 0x01, 0x22, 0x00, 0x21, + 0x02, 0xe0, 0x03, 0x46, 0x06, 0x22, 0x01, 0x21, 0x35, 0x48, 0xd7, 0xe7, + 0x38, 0xb5, 0x04, 0x46, 0xe0, 0x07, 0x32, 0x4d, 0x05, 0xd5, 0x01, 0x23, + 0x02, 0x22, 0x01, 0x21, 0x28, 0x46, 0xff, 0xf7, 0xcd, 0xff, 0xa0, 0x07, + 0x07, 0xd5, 0x28, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x01, 0x23, + 0x04, 0x22, 0x02, 0x21, 0xc2, 0xe7, 0x31, 0xbd, 0x01, 0x46, 0x00, 0x20, + 0x27, 0x4a, 0xcb, 0x07, 0x44, 0xbf, 0x10, 0x78, 0xc0, 0xf3, 0x40, 0x00, + 0x89, 0x07, 0x03, 0xd5, 0x11, 0x78, 0xc1, 0xf3, 0x80, 0x01, 0x08, 0x43, + 0x80, 0xf0, 0x01, 0x00, 0x70, 0x47, 0x22, 0x49, 0x08, 0x78, 0x49, 0x78, + 0x01, 0xf0, 0x0f, 0x01, 0x0c, 0xe0, 0x20, 0x49, 0x48, 0x78, 0x09, 0x78, + 0x01, 0xf0, 0x0f, 0x01, 0x06, 0xe0, 0x1e, 0x49, 0x00, 0xe0, 0x1e, 0x49, + 0x48, 0x78, 0x09, 0x78, 0x01, 0xf0, 0x07, 0x01, 0x40, 0xea, 0x01, 0x20, + 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46, 0xe3, 0xb2, 0xff, 0x22, 0x00, 0x21, + 0x18, 0x48, 0xff, 0xf7, 0x93, 0xff, 0x23, 0x0a, 0xbd, 0xe8, 0x10, 0x40, + 0x0f, 0x22, 0x00, 0x21, 0x15, 0x48, 0x8b, 0xe7, 0x14, 0x48, 0x01, 0x78, + 0x40, 0x78, 0x01, 0xf0, 0x0f, 0x01, 0xe7, 0xe7, 0x10, 0xb5, 0x04, 0x46, + 0xe3, 0xb2, 0xff, 0x22, 0x00, 0x21, 0x10, 0x48, 0xff, 0xf7, 0x7e, 0xff, + 0x23, 0x0a, 0xbd, 0xe8, 0x10, 0x40, 0x0f, 0x22, 0x00, 0x21, 0x0d, 0x48, + 0x76, 0xe7, 0x0c, 0x48, 0x01, 0x78, 0x40, 0x78, 0x01, 0xf0, 0x0f, 0x01, + 0xd2, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x50, 0x47, 0x19, 0x00, 0x00, 0x47, + 0x05, 0x00, 0x50, 0x47, 0x07, 0x00, 0x50, 0x47, 0x09, 0x00, 0x50, 0x47, + 0x0b, 0x00, 0x50, 0x47, 0x02, 0x00, 0x50, 0x47, 0x01, 0x00, 0x50, 0x47, + 0x04, 0x00, 0x50, 0x47, 0x03, 0x00, 0x50, 0x47, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, 0x0d, 0xf8, 0x01, 0x70, + 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, + 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x70, 0x47, + 0xdf, 0xf8, 0x64, 0x19, 0x51, 0xf8, 0x20, 0x00, 0x00, 0x68, 0xc0, 0xf3, + 0xc1, 0x00, 0x70, 0x47, 0xdf, 0xf8, 0x58, 0x29, 0x91, 0x42, 0x34, 0xbf, + 0x9f, 0xed, 0xbd, 0x0a, 0x9f, 0xed, 0xbd, 0x0a, 0x80, 0xed, 0x01, 0x0a, + 0x70, 0x47, 0x2d, 0xe9, 0xf3, 0x4f, 0x85, 0xb0, 0xdf, 0xf8, 0x38, 0x19, + 0x00, 0x90, 0x15, 0x46, 0x51, 0xf8, 0x20, 0x70, 0x38, 0x68, 0xc0, 0xf3, + 0xc1, 0x00, 0x04, 0x90, 0x38, 0x68, 0x00, 0xf0, 0x01, 0x0a, 0x38, 0x68, + 0xc0, 0xf3, 0x40, 0x00, 0x03, 0x90, 0x38, 0x68, 0xc0, 0xf3, 0x80, 0x00, + 0x02, 0x90, 0x9d, 0xf8, 0x14, 0x00, 0xee, 0xf7, 0x20, 0xfc, 0x80, 0x46, + 0xdf, 0xf8, 0x0c, 0x19, 0x00, 0x98, 0x51, 0xf8, 0x20, 0x60, 0x56, 0xf8, + 0x04, 0x0f, 0xc0, 0xf3, 0xc1, 0x00, 0x01, 0x90, 0x30, 0x68, 0x34, 0x68, + 0xc0, 0xf3, 0x41, 0x1b, 0xa4, 0x0f, 0x30, 0x68, 0x00, 0x2d, 0xc0, 0xf3, + 0x01, 0x29, 0x42, 0xd0, 0x06, 0x9d, 0x04, 0x99, 0x2b, 0x78, 0x99, 0x42, + 0x01, 0xd0, 0x00, 0xf0, 0x96, 0xf8, 0x6b, 0x78, 0x9a, 0x45, 0x03, 0xd0, + 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x91, 0xf8, 0xab, 0x78, 0x03, 0x98, + 0x98, 0x42, 0x03, 0xd0, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0x89, 0xf8, + 0xeb, 0x78, 0x02, 0x98, 0x98, 0x42, 0x03, 0xd0, 0x04, 0x22, 0x02, 0x21, + 0x00, 0xf0, 0x81, 0xf8, 0x6b, 0x79, 0x01, 0x98, 0x98, 0x42, 0x01, 0xd0, + 0x00, 0xf0, 0x75, 0xf8, 0xeb, 0x79, 0x9b, 0x45, 0x03, 0xd0, 0x60, 0x22, + 0x05, 0x21, 0x00, 0xf0, 0x20, 0xf9, 0xab, 0x79, 0x9c, 0x42, 0x04, 0xd0, + 0x4f, 0xf0, 0x40, 0x42, 0x1e, 0x21, 0x00, 0xf0, 0x18, 0xf9, 0x2b, 0x79, + 0x99, 0x45, 0x01, 0xd0, 0x00, 0xf0, 0x10, 0xf9, 0xb8, 0xf1, 0x00, 0x0f, + 0x5a, 0xd0, 0x9d, 0xf8, 0x14, 0x00, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, + 0x00, 0x21, 0xee, 0xf7, 0xd0, 0xbb, 0xdf, 0xf8, 0x64, 0x08, 0x00, 0x9a, + 0x01, 0x68, 0x0a, 0x44, 0xed, 0x20, 0x92, 0xf8, 0xbc, 0x30, 0x43, 0x43, + 0xc8, 0x18, 0x00, 0xf2, 0x44, 0x40, 0x00, 0xf1, 0x78, 0x05, 0x04, 0x99, + 0xeb, 0x78, 0x99, 0x42, 0x01, 0xd0, 0x00, 0xf0, 0x46, 0xf8, 0x2b, 0x78, + 0x9a, 0x45, 0x03, 0xd0, 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x41, 0xf8, + 0x6b, 0x78, 0x03, 0x98, 0x98, 0x42, 0x03, 0xd0, 0x02, 0x22, 0x01, 0x21, + 0x00, 0xf0, 0x39, 0xf8, 0xab, 0x78, 0x02, 0x98, 0x98, 0x42, 0x03, 0xd0, + 0x04, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x31, 0xf8, 0x2b, 0x7b, 0x01, 0x98, + 0x98, 0x42, 0x01, 0xd0, 0x00, 0xf0, 0x25, 0xf8, 0xab, 0x7b, 0x9b, 0x45, + 0x03, 0xd0, 0x60, 0x22, 0x05, 0x21, 0x00, 0xf0, 0xd0, 0xf8, 0x6b, 0x7b, + 0x9c, 0x42, 0x04, 0xd0, 0x4f, 0xf0, 0x40, 0x42, 0x1e, 0x21, 0x00, 0xf0, + 0xc8, 0xf8, 0xeb, 0x7a, 0x99, 0x45, 0x01, 0xd0, 0x00, 0xf0, 0xc0, 0xf8, + 0x29, 0x79, 0x88, 0x45, 0x1c, 0xbf, 0x9d, 0xf8, 0x14, 0x00, 0xee, 0xf7, + 0x84, 0xfb, 0x9d, 0xf8, 0x14, 0x00, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, + 0x04, 0xf0, 0x88, 0xbd, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x18, 0x22, + 0x03, 0x21, 0x30, 0x46, 0x0d, 0xe7, 0x18, 0x22, 0x03, 0x21, 0x38, 0x46, + 0x09, 0xe7, 0x70, 0xb5, 0x04, 0x46, 0xdf, 0xf8, 0x98, 0x07, 0x25, 0x46, + 0x50, 0xf8, 0x25, 0x00, 0x4b, 0x1e, 0x0e, 0x46, 0x9b, 0x41, 0xdb, 0x0f, + 0x01, 0x22, 0x00, 0x21, 0x14, 0x30, 0xff, 0xf7, 0xfa, 0xfe, 0x86, 0xb9, + 0xdf, 0xf8, 0x84, 0x17, 0x0a, 0x68, 0x64, 0x20, 0x45, 0x43, 0x50, 0x19, + 0x00, 0xf5, 0xff, 0x60, 0x00, 0xf1, 0x34, 0x02, 0x01, 0x1d, 0x20, 0x46, + 0xbd, 0xe8, 0x70, 0x40, 0x00, 0x23, 0xee, 0xf7, 0xcc, 0xba, 0x70, 0xbd, + 0x10, 0xb5, 0xdf, 0xf8, 0x64, 0x17, 0x51, 0xf8, 0x20, 0x40, 0x24, 0x1d, + 0x00, 0x23, 0x01, 0x22, 0x00, 0xf0, 0x49, 0xf8, 0x00, 0xf0, 0x16, 0xf9, + 0x00, 0xf0, 0x46, 0xf8, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x23, + 0x04, 0x22, 0x22, 0xe0, 0x70, 0xb5, 0xdf, 0xf8, 0x40, 0x67, 0x04, 0x46, + 0xdf, 0xf8, 0x34, 0x07, 0x50, 0xf8, 0x24, 0x50, 0x30, 0x68, 0x20, 0x44, + 0x2d, 0x1d, 0x90, 0xf8, 0xa4, 0x30, 0x01, 0x22, 0x00, 0x21, 0x28, 0x46, + 0xff, 0xf7, 0xc1, 0xfe, 0x32, 0x68, 0x22, 0x44, 0x01, 0x21, 0x92, 0xf8, + 0xac, 0x30, 0x02, 0x22, 0x28, 0x46, 0xff, 0xf7, 0xb8, 0xfe, 0x30, 0x68, + 0x20, 0x44, 0x04, 0x22, 0x90, 0xf8, 0xb4, 0x30, 0x28, 0x46, 0xbd, 0xe8, + 0x70, 0x40, 0x02, 0x21, 0xad, 0xe6, 0x10, 0xb5, 0xdf, 0xf8, 0xf0, 0x16, + 0x51, 0xf8, 0x20, 0x40, 0x00, 0x23, 0x4f, 0xf4, 0x40, 0x72, 0x08, 0x21, + 0x00, 0xf0, 0x10, 0xf8, 0x00, 0x23, 0x03, 0x22, 0x00, 0xf0, 0x0b, 0xf8, + 0x01, 0x23, 0x1c, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x07, 0xf8, 0x20, 0x46, + 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x23, 0xe0, 0x22, 0x2a, 0xe0, 0x00, 0x21, + 0x20, 0x46, 0x90, 0xe6, 0x70, 0xb5, 0x04, 0x46, 0xdf, 0xf8, 0xb4, 0x06, + 0xdf, 0xf8, 0xb4, 0x56, 0x50, 0xf8, 0x24, 0x60, 0x28, 0x68, 0x20, 0x44, + 0x4f, 0xf4, 0x40, 0x72, 0x90, 0xf8, 0x5c, 0x33, 0x00, 0xf0, 0x20, 0xf8, + 0x2a, 0x68, 0x22, 0x44, 0x00, 0x21, 0x92, 0xf8, 0x64, 0x33, 0x03, 0x22, + 0x00, 0xf0, 0x19, 0xf8, 0x28, 0x68, 0x20, 0x44, 0x1c, 0x22, 0x90, 0xf8, + 0x6c, 0x33, 0x02, 0x21, 0x00, 0xf0, 0x11, 0xf8, 0x28, 0x68, 0x20, 0x44, + 0xe0, 0x22, 0x90, 0xf8, 0x74, 0x33, 0x30, 0x46, 0xbd, 0xe8, 0x70, 0x40, + 0x05, 0x21, 0x66, 0xe6, 0x86, 0x37, 0x54, 0x36, 0x05, 0xc6, 0xa9, 0x34, + 0x4f, 0xf4, 0x40, 0x72, 0x08, 0x21, 0x30, 0x46, 0x5d, 0xe6, 0x10, 0xb5, + 0xdf, 0xf8, 0x58, 0x16, 0x51, 0xf8, 0x20, 0x40, 0x00, 0xf0, 0x24, 0xf8, + 0x04, 0xf1, 0x50, 0x00, 0xff, 0xf7, 0x53, 0xfe, 0x00, 0xf0, 0x1e, 0xf8, + 0x04, 0xf1, 0x60, 0x00, 0xff, 0xf7, 0x4d, 0xfe, 0x00, 0xf0, 0x18, 0xf8, + 0x04, 0xf1, 0x70, 0x00, 0xff, 0xf7, 0x47, 0xfe, 0x00, 0xf0, 0x12, 0xf8, + 0x04, 0xf1, 0x8c, 0x00, 0xff, 0xf7, 0x41, 0xfe, 0x00, 0xf0, 0x0c, 0xf8, + 0x04, 0xf1, 0x9c, 0x00, 0xff, 0xf7, 0x3b, 0xfe, 0x04, 0xf1, 0xac, 0x00, + 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x23, 0x4f, 0xf0, 0x00, 0x42, 0x47, 0xe0, + 0x00, 0x23, 0x4f, 0xf0, 0x00, 0x42, 0x1f, 0x21, 0x70, 0x47, 0x70, 0xb5, + 0x04, 0x46, 0xdf, 0xf8, 0xf8, 0x05, 0xdf, 0xf8, 0xf0, 0x65, 0x50, 0xf8, + 0x24, 0x50, 0x30, 0x68, 0x04, 0xeb, 0x44, 0x04, 0x20, 0x44, 0x4f, 0xf0, + 0x00, 0x42, 0x90, 0xf8, 0xc0, 0x30, 0x1f, 0x21, 0x05, 0xf1, 0x50, 0x00, + 0xff, 0xf7, 0x19, 0xfe, 0x31, 0x68, 0x21, 0x44, 0x4f, 0xf0, 0x00, 0x42, + 0x91, 0xf8, 0xc1, 0x30, 0x1f, 0x21, 0x05, 0xf1, 0x60, 0x00, 0xff, 0xf7, + 0x0e, 0xfe, 0x00, 0xf0, 0x23, 0xf8, 0x90, 0xf8, 0xc2, 0x30, 0x1f, 0x21, + 0x05, 0xf1, 0x70, 0x00, 0xff, 0xf7, 0x05, 0xfe, 0x00, 0xf0, 0x1a, 0xf8, + 0x90, 0xf8, 0xd8, 0x30, 0x1f, 0x21, 0x05, 0xf1, 0x8c, 0x00, 0xff, 0xf7, + 0xfc, 0xfd, 0x00, 0xf0, 0x11, 0xf8, 0x90, 0xf8, 0xd9, 0x30, 0x1f, 0x21, + 0x05, 0xf1, 0x9c, 0x00, 0xff, 0xf7, 0xf3, 0xfd, 0x00, 0xf0, 0x08, 0xf8, + 0x90, 0xf8, 0xda, 0x30, 0x05, 0xf1, 0xac, 0x00, 0xbd, 0xe8, 0x70, 0x40, + 0x1f, 0x21, 0xe8, 0xe5, 0x30, 0x68, 0x20, 0x44, 0x4f, 0xf0, 0x00, 0x42, + 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, 0x1b, 0xf8, 0xf1, 0xf7, 0x00, 0xfe, + 0x38, 0xb9, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x23, 0x02, 0x22, + 0x01, 0x21, 0x02, 0xf0, 0x90, 0xbf, 0x10, 0xbd, 0x38, 0xb5, 0x05, 0x46, + 0x00, 0xf0, 0x0c, 0xf8, 0xf1, 0xf7, 0x0a, 0xfe, 0x00, 0xf0, 0x07, 0xf8, + 0x28, 0x46, 0x02, 0xf0, 0xae, 0xff, 0x04, 0xb9, 0x04, 0x46, 0x20, 0x46, + 0x32, 0xbd, 0x04, 0x46, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, 0x70, 0x47, + 0x10, 0xb5, 0x04, 0x46, 0x2d, 0xed, 0x02, 0x8b, 0xdf, 0xf8, 0x1c, 0x05, + 0x82, 0xb0, 0x81, 0x42, 0x0c, 0xbf, 0x9f, 0xed, 0xab, 0x8a, 0x9f, 0xed, + 0xab, 0x8a, 0x68, 0x46, 0xe4, 0xf7, 0xa8, 0xf9, 0xef, 0xf7, 0x99, 0xfe, + 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x9f, 0xed, 0xa6, 0x1a, + 0x81, 0xee, 0x00, 0x1a, 0xf7, 0xee, 0x00, 0x1a, 0xc1, 0xee, 0x81, 0x1a, + 0x9f, 0xed, 0xa3, 0x2a, 0x31, 0xee, 0x82, 0x2a, 0xb7, 0xee, 0x00, 0x0a, + 0x80, 0xee, 0x02, 0x0a, 0x9f, 0xed, 0xa0, 0x1a, 0x30, 0xee, 0x01, 0x1a, + 0xdf, 0xed, 0x9f, 0x1a, 0xc1, 0xee, 0x81, 0x1a, 0x9f, 0xed, 0x9e, 0x2a, + 0xdf, 0xed, 0x9e, 0x0a, 0x81, 0xee, 0x82, 0x2a, 0x9d, 0xed, 0x00, 0x0a, + 0x78, 0xee, 0x20, 0x0a, 0x80, 0xee, 0x02, 0x0a, 0x9f, 0xed, 0x9a, 0x1a, + 0x00, 0xee, 0x80, 0x1a, 0xdf, 0xed, 0x99, 0x0a, 0x81, 0xee, 0x20, 0x0a, + 0xd7, 0xf7, 0x10, 0xfa, 0x00, 0xf0, 0xc8, 0xf8, 0x08, 0xd5, 0x00, 0x21, + 0x89, 0xb2, 0x20, 0x46, 0x00, 0xf0, 0xd5, 0xf9, 0x02, 0xb0, 0xbd, 0xec, + 0x02, 0x8b, 0x10, 0xbd, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x1a, + 0x88, 0xb2, 0xb0, 0xf5, 0x80, 0x7f, 0xef, 0xd3, 0xff, 0x21, 0xed, 0xe7, + 0xf8, 0xb5, 0x07, 0x46, 0x06, 0x98, 0x0d, 0x46, 0x1e, 0x46, 0x3c, 0x46, + 0x48, 0xb3, 0x00, 0x2a, 0x07, 0xbf, 0x00, 0x21, 0x01, 0x22, 0x01, 0x21, + 0x00, 0x22, 0x20, 0x46, 0xf0, 0xf7, 0xd9, 0xf8, 0x00, 0x21, 0x38, 0x46, + 0x02, 0xf0, 0xa4, 0xfd, 0x07, 0x46, 0x00, 0xee, 0x10, 0x5a, 0x00, 0xee, + 0x90, 0x7a, 0xb8, 0xee, 0x40, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x80, 0xee, + 0x20, 0x0a, 0xd7, 0xf7, 0xf7, 0xf9, 0x00, 0x20, 0xbd, 0xee, 0xc0, 0x0a, + 0x00, 0x90, 0x10, 0xee, 0x10, 0x1a, 0x07, 0xfb, 0x11, 0x55, 0x00, 0x23, + 0x2a, 0x46, 0x31, 0x46, 0x20, 0x46, 0xef, 0xf7, 0xac, 0xff, 0x05, 0x46, + 0x09, 0xe0, 0x00, 0x21, 0x20, 0x46, 0xf0, 0xf7, 0x48, 0xf8, 0x05, 0x46, + 0x00, 0x22, 0x00, 0x21, 0x20, 0x46, 0xf0, 0xf7, 0xae, 0xf8, 0x28, 0x46, + 0xf2, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0xdb, 0xb2, 0x2d, 0xed, 0x02, 0x8b, + 0x03, 0x2b, 0x04, 0x46, 0xb0, 0xee, 0x40, 0x8a, 0x0d, 0x46, 0x16, 0x46, + 0x07, 0xda, 0x0f, 0xf2, 0x50, 0x47, 0xfa, 0x5c, 0x01, 0x21, 0xa1, 0x40, + 0x01, 0x20, 0x07, 0xf0, 0x65, 0xf8, 0x08, 0x9b, 0xb0, 0xee, 0x48, 0x0a, + 0xbd, 0xec, 0x02, 0x8b, 0x32, 0x46, 0x29, 0x46, 0x20, 0x46, 0x01, 0xb0, + 0xbd, 0xe8, 0xf0, 0x40, 0xf8, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x8e, 0xb0, + 0x05, 0x46, 0xb0, 0xee, 0x40, 0x8a, 0x0c, 0x46, 0x17, 0x46, 0x1e, 0x46, + 0xe4, 0xf7, 0x7b, 0xff, 0x40, 0xf2, 0x2b, 0x31, 0xb0, 0xfb, 0xf1, 0xf1, + 0x01, 0x22, 0x8d, 0xf8, 0x04, 0x20, 0x03, 0x23, 0x00, 0x22, 0x8f, 0x42, + 0x88, 0xbf, 0x0f, 0x46, 0x03, 0x97, 0x8d, 0xf8, 0x18, 0x30, 0x05, 0x92, + 0x9f, 0xed, 0xc7, 0x0a, 0xdd, 0xed, 0x03, 0x0a, 0x00, 0x95, 0xf8, 0xee, + 0x60, 0x0a, 0x60, 0xee, 0x88, 0x0a, 0x02, 0x94, 0x80, 0xee, 0x80, 0x0a, + 0xf4, 0xf7, 0xcc, 0xf9, 0xbc, 0xee, 0xc0, 0x0a, 0x8d, 0xed, 0x04, 0x0a, + 0x68, 0x46, 0x07, 0xf0, 0x49, 0xfa, 0x04, 0x00, 0x06, 0xd1, 0x0a, 0x21, + 0x28, 0x46, 0x07, 0xf0, 0xb7, 0xfa, 0x40, 0x1e, 0x01, 0x28, 0x08, 0xd9, + 0xbc, 0xb9, 0x07, 0xa9, 0x68, 0x46, 0x07, 0xf0, 0xb3, 0xfa, 0x40, 0xb1, + 0x40, 0x1e, 0x02, 0x28, 0x02, 0xd8, 0x4f, 0xf4, 0xc1, 0x64, 0x0c, 0xe0, + 0x40, 0xf2, 0x04, 0x64, 0x09, 0xe0, 0x44, 0xb9, 0x9d, 0xed, 0x0b, 0x0a, + 0x00, 0xf0, 0x0a, 0xf8, 0x94, 0xbf, 0x40, 0xf2, 0x02, 0x64, 0x86, 0xed, + 0x00, 0x0a, 0x0e, 0xb0, 0x20, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xf2, 0xbd, + 0xb5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x70, 0x47, 0x38, 0xb5, + 0x0d, 0x46, 0x04, 0x46, 0x00, 0x21, 0x00, 0xf0, 0x24, 0xf9, 0x29, 0x78, + 0x20, 0x46, 0xbd, 0xe8, 0x34, 0x40, 0x37, 0xe1, 0x2d, 0xe9, 0xfc, 0x41, + 0x04, 0x46, 0x90, 0x46, 0x01, 0x25, 0x0e, 0x46, 0x00, 0xf0, 0x44, 0xf9, + 0xb7, 0x49, 0x88, 0x45, 0x37, 0x46, 0x05, 0xd1, 0x01, 0x28, 0x31, 0xd1, + 0x30, 0xb1, 0xd7, 0xf8, 0x0d, 0x00, 0x05, 0xe0, 0xb3, 0x49, 0x88, 0x45, + 0x15, 0xd1, 0x00, 0xbb, 0xd7, 0xf8, 0x01, 0x00, 0x00, 0x90, 0x20, 0x46, + 0x9d, 0xf8, 0x00, 0x10, 0x00, 0xf0, 0x01, 0xf9, 0x9d, 0xf8, 0x01, 0x10, + 0x20, 0x46, 0x00, 0xf0, 0x15, 0xf9, 0xbd, 0xf8, 0x02, 0x10, 0x20, 0x46, + 0x00, 0xf0, 0xdb, 0xf8, 0x28, 0x46, 0xbd, 0xe8, 0xf6, 0x81, 0xa8, 0x49, + 0x88, 0x45, 0x08, 0xbf, 0x37, 0x1d, 0xdd, 0xd0, 0xa2, 0x49, 0x88, 0x45, + 0x0c, 0xd1, 0x30, 0xb9, 0x06, 0xf1, 0x08, 0x07, 0xde, 0xe7, 0x01, 0x28, + 0x06, 0xd1, 0x37, 0x1d, 0xd3, 0xe7, 0x01, 0x28, 0x08, 0xbf, 0x06, 0xf1, + 0x08, 0x07, 0xce, 0xd0, 0x00, 0x25, 0xe5, 0xe7, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x66, 0x86, 0x3f, 0x00, 0x00, 0x00, 0x42, 0x9a, 0x99, 0x99, 0x3f, + 0x49, 0x92, 0x24, 0x3f, 0x00, 0xe0, 0x88, 0x45, 0x00, 0xe0, 0x6e, 0x45, + 0x66, 0x66, 0xe6, 0x3e, 0x66, 0x66, 0xe6, 0xbe, 0x29, 0x5c, 0x8f, 0x3d, + 0x2d, 0xe9, 0xf8, 0x43, 0x2d, 0xed, 0x02, 0x8b, 0x91, 0x49, 0x82, 0xb0, + 0x02, 0x46, 0x51, 0xf8, 0x22, 0x80, 0x08, 0xf1, 0x1d, 0x09, 0x69, 0x46, + 0x99, 0xf8, 0x00, 0x40, 0xe3, 0xf7, 0xf8, 0xff, 0x00, 0x25, 0x04, 0xf0, + 0x01, 0x04, 0x74, 0xb1, 0x00, 0x99, 0x8a, 0x48, 0x8a, 0x4a, 0x41, 0x18, + 0x91, 0x42, 0x22, 0xbf, 0x00, 0x98, 0x89, 0x49, 0x88, 0x42, 0x02, 0xd2, + 0x52, 0x26, 0x01, 0x27, 0x03, 0xe0, 0x42, 0x26, 0x00, 0xe0, 0x0e, 0x26, + 0x02, 0x27, 0x33, 0x46, 0xff, 0x22, 0x00, 0x21, 0x08, 0xf1, 0x1e, 0x00, + 0xff, 0xf7, 0x18, 0xfc, 0x33, 0x46, 0xff, 0x22, 0x00, 0x21, 0x08, 0xf1, + 0x1f, 0x00, 0xff, 0xf7, 0x11, 0xfc, 0x3b, 0x46, 0x06, 0x22, 0x01, 0x21, + 0x48, 0x46, 0xff, 0xf7, 0x0b, 0xfc, 0x00, 0xee, 0x10, 0x4a, 0xb8, 0xee, + 0x40, 0x8a, 0xef, 0xf7, 0xf8, 0xfc, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, + 0x40, 0x0a, 0xfb, 0xee, 0x09, 0x0a, 0x70, 0xee, 0x20, 0x8a, 0x00, 0x98, + 0x73, 0x49, 0x9f, 0xed, 0x5a, 0x0a, 0x9f, 0xed, 0x5a, 0x1a, 0x01, 0xee, + 0x90, 0x6a, 0x08, 0xee, 0x00, 0x1a, 0xf8, 0xee, 0x61, 0x1a, 0xb3, 0xee, + 0x00, 0x2a, 0x88, 0x42, 0x21, 0xee, 0x21, 0x0a, 0x68, 0xee, 0x02, 0x0a, + 0x06, 0xd2, 0x9f, 0xed, 0x53, 0x1a, 0x70, 0xee, 0x81, 0x0a, 0x30, 0xee, + 0x80, 0x0a, 0x05, 0xe0, 0xdf, 0xed, 0x50, 0x1a, 0x70, 0xee, 0xa1, 0x1a, + 0x31, 0xee, 0x80, 0x0a, 0xd7, 0xf7, 0x94, 0xf8, 0xf0, 0xee, 0x40, 0x0a, + 0xb3, 0xee, 0x0c, 0x1a, 0x9f, 0xed, 0x4b, 0x0a, 0x08, 0xee, 0x01, 0x0a, + 0xdf, 0xed, 0x4a, 0x2a, 0x68, 0xee, 0xa8, 0x1a, 0x9f, 0xed, 0x49, 0x2a, + 0xc8, 0xee, 0xa2, 0x2a, 0xb7, 0xee, 0x00, 0x1a, 0x81, 0xee, 0x82, 0x2a, + 0x32, 0xee, 0x81, 0x1a, 0x32, 0xee, 0x41, 0x1a, 0x70, 0xee, 0x60, 0x0a, + 0x01, 0xee, 0x20, 0x0a, 0xd7, 0xf7, 0x76, 0xf8, 0xff, 0xf7, 0x10, 0xff, + 0x4b, 0xf2, 0x04, 0x30, 0x03, 0xd5, 0x05, 0x46, 0x9f, 0xed, 0x3e, 0x0a, + 0x09, 0xe0, 0xdf, 0xed, 0x3e, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0xa4, 0xbf, 0x05, 0x46, 0x9f, 0xed, 0x3b, 0x0a, 0xbd, 0xee, + 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0xc3, 0xb2, 0x3f, 0x22, 0x00, 0x21, + 0x08, 0xf1, 0x21, 0x00, 0xff, 0xf7, 0x9e, 0xfb, 0x02, 0xb0, 0x28, 0x46, + 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x83, 0x52, 0xe7, 0x38, 0xb5, + 0x00, 0xf0, 0x2d, 0xf8, 0x23, 0x0a, 0x03, 0x22, 0x00, 0x21, 0x05, 0xf1, + 0x19, 0x00, 0xff, 0xf7, 0x8d, 0xfb, 0xe3, 0xb2, 0x05, 0xf1, 0x1a, 0x00, + 0x1a, 0xe0, 0x36, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x00, 0xf1, 0x19, 0x02, + 0x1a, 0x30, 0x11, 0x78, 0x00, 0x78, 0x01, 0xf0, 0x03, 0x01, 0x00, 0xeb, + 0x01, 0x20, 0x80, 0xb2, 0x70, 0x47, 0x38, 0xb5, 0x00, 0xf0, 0x11, 0xf8, + 0x23, 0x46, 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x14, 0x00, 0xff, 0xf7, + 0x71, 0xfb, 0x23, 0x46, 0x05, 0xf1, 0x16, 0x00, 0x01, 0xb0, 0xbd, 0xe8, + 0x30, 0x40, 0xff, 0x22, 0x00, 0x21, 0xff, 0xf7, 0x67, 0xbb, 0x0c, 0x46, + 0x24, 0x49, 0x51, 0xf8, 0x20, 0x50, 0x70, 0x47, 0x10, 0xb5, 0x22, 0x4c, + 0x54, 0xf8, 0x20, 0x00, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0xff, 0x22, + 0x00, 0x21, 0x18, 0x30, 0xff, 0xf7, 0x56, 0xbb, 0x00, 0x00, 0x7a, 0x44, + 0x1b, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x18, 0x30, 0x00, 0x78, 0x70, 0x47, + 0x18, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x1d, 0x30, 0x00, 0x78, 0x00, 0xf0, + 0x01, 0x00, 0x70, 0x47, 0xcd, 0xcc, 0xcc, 0x3d, 0x33, 0x33, 0xf3, 0xbe, + 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x0e, 0x42, 0x00, 0x00, 0x44, 0x42, + 0x00, 0x80, 0x0a, 0x43, 0x00, 0x20, 0x7d, 0x46, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x7c, 0x42, 0x00, 0x00, 0x7c, 0x42, 0xe8, 0x96, 0x04, 0x01, + 0x80, 0xee, 0x36, 0x00, 0x28, 0x96, 0x04, 0x01, 0xb4, 0x76, 0x02, 0x20, + 0xe8, 0x98, 0x04, 0x01, 0xb8, 0x76, 0x02, 0x20, 0x08, 0x99, 0x04, 0x01, + 0x80, 0x1a, 0x06, 0x00, 0xb0, 0x1e, 0x04, 0x00, 0xe0, 0x93, 0x04, 0x00, + 0x68, 0x24, 0x05, 0x00, 0x88, 0x97, 0x04, 0x01, 0x7f, 0xb0, 0xed, 0xff, + 0xff, 0x9e, 0x24, 0x00, 0x81, 0x4f, 0x12, 0x00, 0x01, 0x6a, 0x18, 0x00, + 0x38, 0xb5, 0x0c, 0x46, 0xeb, 0xf7, 0xb0, 0xf8, 0x00, 0x25, 0x10, 0xb1, + 0x01, 0x28, 0x0e, 0xd1, 0x01, 0x25, 0x29, 0x46, 0x20, 0x46, 0xe3, 0xf7, + 0xe8, 0xfd, 0x04, 0x00, 0x05, 0xd0, 0x23, 0x46, 0x04, 0xa2, 0x06, 0x21, + 0x01, 0x20, 0xe4, 0xf7, 0xf0, 0xff, 0x20, 0x46, 0x32, 0xbd, 0x4f, 0xf6, + 0x53, 0x74, 0xf4, 0xe7, 0x42, 0x42, 0x46, 0x3a, 0x20, 0x52, 0x65, 0x70, + 0x72, 0x6f, 0x67, 0x4c, 0x6f, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x58, + 0x20, 0x0a, 0x00, 0x00, 0x01, 0x02, 0x04, 0x00, 0x10, 0xb5, 0x03, 0x46, + 0x00, 0x24, 0x08, 0x46, 0x01, 0x2b, 0x19, 0x46, 0x01, 0xd1, 0x01, 0x2a, + 0x00, 0xe0, 0x00, 0x2b, 0x02, 0xd1, 0xe9, 0xf7, 0x64, 0xfa, 0x01, 0xe0, + 0x4b, 0xf2, 0x11, 0x74, 0x20, 0x46, 0x10, 0xbd, 0x1f, 0xb5, 0x23, 0x4c, + 0x04, 0xf5, 0x03, 0x71, 0x01, 0x20, 0xf4, 0xf7, 0x35, 0xfa, 0xa0, 0x60, + 0x20, 0xb9, 0x03, 0x22, 0x4f, 0xf6, 0x6f, 0x71, 0x01, 0xf0, 0xb3, 0xfb, + 0x00, 0x20, 0x4f, 0xf0, 0xff, 0x31, 0x1c, 0x4a, 0x02, 0xeb, 0x00, 0x12, + 0x40, 0x1c, 0x0c, 0x28, 0xd1, 0x60, 0xc2, 0xf8, 0xc8, 0x10, 0xf6, 0xd3, + 0x04, 0xf5, 0xce, 0x70, 0x17, 0x49, 0x02, 0x90, 0x05, 0x22, 0x01, 0x91, + 0x00, 0x92, 0x00, 0x23, 0x40, 0xf2, 0xee, 0x22, 0x14, 0xa1, 0x0f, 0xf2, + 0x59, 0x00, 0xf2, 0xf7, 0x8b, 0xfd, 0x60, 0x60, 0x20, 0xb9, 0x03, 0x22, + 0x4f, 0xf6, 0x0b, 0x71, 0x01, 0xf0, 0x91, 0xfb, 0x00, 0x20, 0x00, 0x90, + 0x04, 0xf5, 0xa6, 0x73, 0x04, 0xf1, 0x0c, 0x02, 0x10, 0x21, 0x14, 0x20, + 0xf4, 0xf7, 0xd2, 0xf9, 0x20, 0x60, 0x20, 0xb9, 0x03, 0x22, 0x4f, 0xf6, + 0x1d, 0x71, 0x01, 0xf0, 0x80, 0xfb, 0xf4, 0xf7, 0xc9, 0xff, 0xbd, 0xe8, + 0x1f, 0x40, 0x05, 0xf0, 0xfb, 0xba, 0x00, 0x00, 0x4c, 0x46, 0x02, 0x20, + 0xec, 0x28, 0x02, 0x20, 0x00, 0xad, 0x01, 0x20, 0x43, 0x54, 0x52, 0x4c, + 0x00, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0x99, 0xb0, 0x02, 0x22, + 0x00, 0x21, 0x00, 0x20, 0xf3, 0xf7, 0xfd, 0xf9, 0xf2, 0xf7, 0xf5, 0xff, + 0x00, 0x22, 0x00, 0x21, 0xf3, 0xf7, 0xf7, 0xf9, 0xf3, 0xf7, 0xc2, 0xfb, + 0x01, 0x22, 0x00, 0x21, 0xf3, 0xf7, 0xf1, 0xf9, 0xdf, 0xf8, 0x9c, 0x08, + 0xdf, 0xf8, 0x9c, 0x58, 0x00, 0x69, 0x4f, 0xf4, 0x7a, 0x61, 0x07, 0xf0, + 0xd9, 0xf8, 0x4f, 0xf0, 0x00, 0x08, 0x29, 0x46, 0x5f, 0xfa, 0x88, 0xf0, + 0xf1, 0xf7, 0x85, 0xff, 0x08, 0xf1, 0x01, 0x08, 0x5f, 0xfa, 0x88, 0xf0, + 0x08, 0x28, 0xf4, 0xdb, 0xdf, 0xf8, 0x78, 0x18, 0xdf, 0xf8, 0x78, 0x28, + 0x0b, 0x68, 0x01, 0xf0, 0x0a, 0xfb, 0x00, 0x20, 0x05, 0xe0, 0x02, 0x20, + 0xf2, 0xf7, 0xff, 0xfd, 0xbd, 0xf8, 0x00, 0x00, 0x40, 0x1c, 0xad, 0xf8, + 0x00, 0x00, 0xbd, 0xf8, 0x00, 0x00, 0x64, 0x28, 0x07, 0xd2, 0xf5, 0xf7, + 0xc0, 0xfa, 0x00, 0x28, 0xef, 0xd0, 0x05, 0xf0, 0xa0, 0xfd, 0x00, 0x28, + 0xeb, 0xd0, 0xbd, 0xf8, 0x00, 0x00, 0x64, 0x28, 0x04, 0xd1, 0x03, 0x22, + 0x4f, 0xf6, 0x69, 0x71, 0x01, 0xf0, 0x1f, 0xfb, 0xdf, 0xf8, 0x34, 0x28, + 0x01, 0xf0, 0xe3, 0xfa, 0xdf, 0xf8, 0x30, 0x28, 0x01, 0xf0, 0xdf, 0xfa, + 0x02, 0x20, 0xf2, 0xf7, 0xda, 0xfd, 0xe3, 0xf7, 0x62, 0xfe, 0x01, 0x21, + 0xf2, 0xf7, 0xcd, 0xfa, 0x18, 0xb1, 0x01, 0x46, 0x03, 0x22, 0x01, 0xf0, + 0x0a, 0xfb, 0xe3, 0xf7, 0x30, 0xfe, 0x30, 0xb1, 0xdf, 0xf8, 0x0c, 0x28, + 0x01, 0xf0, 0xcb, 0xfa, 0x01, 0x20, 0xe4, 0xf7, 0x57, 0xff, 0x07, 0xf0, + 0x68, 0xf9, 0xdf, 0xf8, 0x00, 0x88, 0x08, 0xf5, 0xc3, 0x71, 0x08, 0xf5, + 0xd0, 0x72, 0x0d, 0x91, 0x0b, 0x92, 0x08, 0xf5, 0xcc, 0x71, 0x08, 0xf5, + 0xc8, 0x72, 0x11, 0x91, 0x10, 0x92, 0x08, 0xf5, 0xf0, 0x71, 0x08, 0xf5, + 0xc6, 0x72, 0x0c, 0x91, 0x0f, 0x92, 0x08, 0xf5, 0xc2, 0x75, 0x4f, 0xf0, + 0x01, 0x09, 0x04, 0xe0, 0x01, 0x22, 0x4f, 0xf6, 0x25, 0x71, 0x01, 0xf0, + 0xe0, 0xfa, 0xdf, 0xf8, 0xc8, 0x07, 0x00, 0x68, 0x4f, 0xf0, 0xff, 0x32, + 0x07, 0xa9, 0xf4, 0xf7, 0x6a, 0xfa, 0x20, 0xb9, 0x02, 0x22, 0x4f, 0xf6, + 0x20, 0x71, 0x01, 0xf0, 0xd2, 0xfa, 0x9d, 0xf8, 0x1c, 0x00, 0x00, 0x28, + 0xe8, 0xd1, 0x9d, 0xf8, 0x20, 0x00, 0x8d, 0xf8, 0x14, 0x00, 0x00, 0x21, + 0x04, 0x91, 0x8a, 0x46, 0x9d, 0xf8, 0x14, 0x20, 0x09, 0x99, 0xcd, 0xf8, + 0x38, 0x90, 0x08, 0x2a, 0x8d, 0xf8, 0x0c, 0x90, 0x06, 0x91, 0x26, 0xda, + 0xdf, 0xf8, 0x84, 0x07, 0x50, 0xf8, 0x32, 0x30, 0x99, 0x42, 0x1d, 0xd2, + 0x00, 0x1d, 0x50, 0xf8, 0x32, 0x20, 0x02, 0xeb, 0x01, 0x12, 0x10, 0x7a, + 0x98, 0xb9, 0x10, 0x68, 0x93, 0x89, 0x47, 0x88, 0xbb, 0x42, 0x0b, 0xd0, + 0x03, 0x88, 0x53, 0x81, 0x04, 0x1d, 0x43, 0x88, 0x93, 0x81, 0x00, 0x27, + 0x03, 0x88, 0xad, 0xf8, 0x0e, 0x30, 0x82, 0xf8, 0x08, 0x90, 0x0a, 0xe0, + 0x4f, 0xf6, 0x08, 0x77, 0x07, 0xe0, 0x4f, 0xf6, 0x06, 0x77, 0x04, 0xe0, + 0x4f, 0xf6, 0x05, 0x77, 0x01, 0xe0, 0x4f, 0xf6, 0x04, 0x77, 0xbd, 0xf8, + 0x0e, 0x00, 0x02, 0x28, 0x18, 0xbf, 0x08, 0x28, 0x2c, 0xd0, 0x98, 0xf8, + 0x00, 0x00, 0xbd, 0xf8, 0x0e, 0x30, 0x08, 0xf1, 0x04, 0x02, 0x00, 0x01, + 0x13, 0x52, 0x08, 0xf1, 0x08, 0x00, 0x98, 0xf8, 0x00, 0x20, 0x9d, 0xf8, + 0x20, 0x30, 0x12, 0x01, 0x83, 0x54, 0x08, 0xf1, 0x0c, 0x00, 0x98, 0xf8, + 0x00, 0x20, 0x12, 0x01, 0x81, 0x50, 0x08, 0xf1, 0x10, 0x01, 0x98, 0xf8, + 0x00, 0x00, 0x0a, 0x9a, 0x00, 0x01, 0x0a, 0x50, 0x98, 0xf8, 0x00, 0x00, + 0xdf, 0xf8, 0xec, 0x26, 0x40, 0x1c, 0x88, 0xf8, 0x00, 0x00, 0xc0, 0xb2, + 0x0c, 0x28, 0x28, 0xbf, 0x88, 0xf8, 0x00, 0xa0, 0xbd, 0xf8, 0x0e, 0x30, + 0x01, 0xf0, 0x2d, 0xfa, 0x00, 0x2f, 0x41, 0xf0, 0xb3, 0x81, 0x08, 0xf2, + 0x89, 0x11, 0x08, 0xf5, 0xc4, 0x72, 0x12, 0x91, 0x01, 0x92, 0x08, 0xf2, + 0x8f, 0x11, 0xbd, 0xf8, 0x0e, 0x00, 0x08, 0xf2, 0x8b, 0x12, 0x4a, 0x28, + 0x02, 0x91, 0x00, 0x92, 0x01, 0xf2, 0x89, 0x81, 0xdf, 0xe8, 0x10, 0xf0, + 0x4b, 0x00, 0x53, 0x00, 0x5f, 0x00, 0x74, 0x00, 0x7b, 0x00, 0x83, 0x00, + 0xc6, 0x00, 0xcd, 0x00, 0xd5, 0x00, 0x0d, 0x01, 0x82, 0x01, 0xbc, 0x01, + 0x42, 0x02, 0x57, 0x02, 0x32, 0x01, 0x4b, 0x01, 0x84, 0x02, 0xce, 0x02, + 0xf1, 0x02, 0x1e, 0x03, 0x7a, 0x03, 0xc4, 0x03, 0xf8, 0x03, 0x4f, 0x04, + 0x26, 0x04, 0x7d, 0x05, 0x8a, 0x05, 0x3d, 0x05, 0x55, 0x05, 0x5b, 0x05, + 0xa3, 0x05, 0xaf, 0x05, 0xc1, 0x05, 0xc5, 0x05, 0xd4, 0x05, 0xf7, 0x05, + 0xb5, 0x05, 0x33, 0x06, 0xdf, 0x05, 0x6b, 0x06, 0x87, 0x09, 0x55, 0x01, + 0x6e, 0x01, 0xaa, 0x03, 0xb5, 0x03, 0xc0, 0x06, 0xe9, 0x07, 0x03, 0x08, + 0x64, 0x08, 0x9b, 0x06, 0xa8, 0x06, 0x97, 0x08, 0x8e, 0x00, 0x12, 0x08, + 0xb1, 0x07, 0x7a, 0x05, 0x1d, 0x02, 0x1e, 0x03, 0x7d, 0x09, 0x73, 0x09, + 0xee, 0x06, 0x4f, 0x07, 0x6d, 0x02, 0x49, 0x08, 0xe1, 0x04, 0x06, 0x05, + 0xa3, 0x04, 0xc8, 0x04, 0x22, 0x05, 0x28, 0x05, 0x2c, 0x05, 0x33, 0x05, + 0xb4, 0x08, 0x7d, 0x05, 0x8a, 0x05, 0xc5, 0xf8, 0x00, 0xa0, 0x01, 0x99, + 0x20, 0x68, 0x08, 0x60, 0x08, 0x20, 0x2e, 0x68, 0x77, 0xe2, 0x20, 0x68, + 0x61, 0x68, 0x22, 0x69, 0xe6, 0x68, 0xa3, 0x68, 0xcd, 0xe9, 0x00, 0x01, + 0x31, 0x46, 0x18, 0x46, 0xf5, 0xf7, 0x38, 0xf8, 0x2c, 0xe0, 0x0d, 0xf1, + 0x01, 0x01, 0x68, 0x46, 0xf5, 0xf7, 0xbe, 0xf8, 0x9d, 0xf8, 0x00, 0x00, + 0x01, 0x28, 0x18, 0xbf, 0x00, 0x20, 0x28, 0x70, 0xca, 0x46, 0x9d, 0xf8, + 0x01, 0x00, 0x01, 0x28, 0x18, 0xbf, 0x00, 0x20, 0x68, 0x70, 0x00, 0x26, + 0x02, 0x20, 0xf7, 0xe0, 0x28, 0x46, 0xf5, 0xf7, 0x88, 0xf8, 0x06, 0x46, + 0xca, 0x46, 0xe4, 0x20, 0xf0, 0xe0, 0xf5, 0xf7, 0x7b, 0xf8, 0x00, 0x26, + 0x00, 0x28, 0x40, 0xf0, 0xe1, 0x87, 0x00, 0xf0, 0xde, 0xbf, 0x20, 0x7a, + 0x61, 0x68, 0x01, 0x28, 0x20, 0x68, 0x0c, 0xbf, 0x01, 0x22, 0x00, 0x22, + 0x05, 0xf0, 0x85, 0xfa, 0x00, 0xf0, 0x7f, 0xbf, 0x20, 0x7d, 0xc5, 0xf8, + 0x00, 0xa0, 0x01, 0x28, 0x60, 0x68, 0x0c, 0xbf, 0x01, 0x26, 0x00, 0x26, + 0x00, 0x28, 0x1c, 0xbf, 0x20, 0x68, 0x10, 0xf0, 0x11, 0x0f, 0x04, 0xd0, + 0x61, 0x68, 0x32, 0x46, 0x05, 0xf0, 0x71, 0xfa, 0x28, 0x60, 0xa0, 0x68, + 0x40, 0xb1, 0x20, 0x68, 0x40, 0x06, 0x05, 0xd5, 0x28, 0x68, 0x18, 0xb9, + 0xa1, 0x68, 0x01, 0xf0, 0x64, 0xf9, 0x28, 0x60, 0xe0, 0x68, 0x00, 0x28, + 0x1c, 0xbf, 0x20, 0x68, 0x10, 0xf0, 0x26, 0x0f, 0x05, 0xd0, 0x28, 0x68, + 0x18, 0xb9, 0xe1, 0x68, 0x01, 0xf0, 0x57, 0xf9, 0x28, 0x60, 0x20, 0x69, + 0x40, 0xb1, 0x20, 0x68, 0x00, 0x07, 0x05, 0xd5, 0x28, 0x68, 0x18, 0xb9, + 0x21, 0x69, 0x01, 0xf0, 0x4c, 0xf9, 0x28, 0x60, 0x28, 0x68, 0xbb, 0xe1, + 0x01, 0x98, 0x05, 0xf0, 0x33, 0xfb, 0x01, 0xf0, 0x83, 0xf9, 0x24, 0x20, + 0x9e, 0xe0, 0x01, 0x98, 0x05, 0xf0, 0x0a, 0xfb, 0x01, 0xf0, 0x7c, 0xf9, + 0x5c, 0x21, 0x01, 0xf0, 0xb0, 0xb8, 0x01, 0xf0, 0x2c, 0xf9, 0x20, 0x78, + 0x08, 0xb9, 0x00, 0x26, 0x11, 0xe0, 0x01, 0x28, 0x08, 0xbf, 0x01, 0x26, + 0x0d, 0xd0, 0x02, 0x28, 0x07, 0xd1, 0x06, 0xf0, 0x01, 0xfd, 0x02, 0x26, + 0x38, 0xb9, 0x4f, 0xf6, 0x2a, 0x70, 0x28, 0x60, 0x03, 0xe0, 0x4f, 0xf6, + 0x2a, 0x71, 0x03, 0x26, 0x29, 0x60, 0x28, 0x68, 0xa0, 0xb9, 0xd4, 0xf8, + 0x01, 0x00, 0x13, 0x28, 0x04, 0xd2, 0x01, 0xf0, 0x08, 0xf9, 0xf5, 0xf7, + 0x10, 0xf8, 0x0a, 0xe0, 0x30, 0x28, 0x06, 0xd3, 0x36, 0x28, 0x04, 0xd8, + 0x01, 0xf0, 0xff, 0xf8, 0x05, 0xf0, 0xbe, 0xfa, 0x01, 0xe0, 0x4f, 0xf6, + 0x2a, 0x70, 0x28, 0x60, 0x28, 0x68, 0x20, 0xb9, 0x04, 0x98, 0x00, 0x1d, + 0xca, 0x46, 0x00, 0xf0, 0x56, 0xbd, 0x04, 0x21, 0x22, 0xe0, 0x01, 0xf0, + 0xf4, 0xf8, 0xd4, 0xf8, 0x01, 0x00, 0x13, 0x28, 0x12, 0xd3, 0x30, 0x28, + 0x01, 0xd3, 0x36, 0x28, 0x0e, 0xd9, 0x20, 0x78, 0x10, 0xb1, 0x06, 0xf0, + 0xc9, 0xfc, 0x48, 0xb1, 0xd4, 0xf8, 0x01, 0x00, 0xf0, 0x28, 0x08, 0xd1, + 0x22, 0x78, 0x01, 0x98, 0x04, 0xa9, 0x07, 0xf0, 0xcb, 0xfa, 0x01, 0xe0, + 0x4f, 0xf6, 0x2a, 0x70, 0x28, 0x60, 0x28, 0x68, 0x00, 0x28, 0x03, 0xbf, + 0xca, 0x46, 0x04, 0x99, 0x09, 0x1d, 0x04, 0x21, 0x00, 0xf0, 0x36, 0xbd, + 0x26, 0x78, 0x6b, 0x46, 0x02, 0xaa, 0x01, 0xa9, 0x30, 0x46, 0x07, 0xf0, + 0xb6, 0xfc, 0x2e, 0x71, 0xca, 0x46, 0x12, 0x98, 0x01, 0x99, 0x01, 0x60, + 0x08, 0xf5, 0xc7, 0x71, 0x9d, 0xf8, 0x00, 0x00, 0x88, 0xf8, 0x8d, 0x01, + 0x00, 0x26, 0x02, 0x98, 0x08, 0x60, 0x00, 0x21, 0x29, 0x60, 0x0e, 0x20, + 0x20, 0xe0, 0x20, 0x78, 0x62, 0x79, 0xd4, 0xf8, 0x01, 0x10, 0x07, 0xf0, + 0x43, 0xfc, 0x01, 0xf0, 0xd2, 0xf8, 0x00, 0xf0, 0xbb, 0xbe, 0xe4, 0xf7, + 0xd3, 0xfb, 0x01, 0x46, 0x20, 0x78, 0xc5, 0xf8, 0x00, 0xa0, 0x01, 0x40, + 0x00, 0x20, 0x21, 0xfa, 0x00, 0xf2, 0xd2, 0x07, 0x03, 0xd4, 0x40, 0x1c, + 0x08, 0x28, 0xf8, 0xd3, 0x02, 0xe0, 0x01, 0x99, 0xf1, 0xf7, 0x73, 0xfc, + 0x28, 0x68, 0x01, 0xf0, 0xe4, 0xf8, 0x86, 0x20, 0x01, 0xf0, 0x0d, 0xb8, + 0xe4, 0xf7, 0xba, 0xfb, 0x06, 0x46, 0x20, 0x78, 0xc5, 0xf8, 0x00, 0xa0, + 0x06, 0x40, 0x26, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x03, 0xd5, 0x61, 0x1c, + 0x38, 0x46, 0xf1, 0xf7, 0x24, 0xfc, 0x7f, 0x1c, 0x08, 0x2f, 0xf4, 0xd3, + 0x28, 0x68, 0xff, 0xe0, 0x06, 0xf0, 0x60, 0xfc, 0x01, 0x46, 0x20, 0x78, + 0x00, 0x26, 0x02, 0x28, 0x08, 0xbf, 0x01, 0x29, 0x07, 0xd1, 0xc5, 0xf8, + 0x00, 0xa0, 0xe9, 0xf7, 0x43, 0xfb, 0x01, 0x9a, 0x10, 0x60, 0x51, 0x60, + 0x26, 0xe0, 0x03, 0x28, 0x08, 0xbf, 0x01, 0x29, 0x09, 0xd1, 0xc5, 0xf8, + 0x00, 0xa0, 0xe9, 0xf7, 0x33, 0xfb, 0x01, 0x9a, 0x10, 0x60, 0x51, 0x60, + 0xc5, 0xf8, 0x00, 0xa0, 0x18, 0xe0, 0x01, 0x28, 0x04, 0xd0, 0x20, 0xb1, + 0x4b, 0xf2, 0x03, 0x70, 0x28, 0x60, 0xab, 0xe0, 0x01, 0x26, 0x31, 0x46, + 0x68, 0x46, 0xe3, 0xf7, 0x24, 0xfb, 0x28, 0x60, 0x01, 0x9a, 0x00, 0x9b, + 0x4f, 0xf4, 0x7a, 0x70, 0xa0, 0xfb, 0x03, 0x01, 0x10, 0x60, 0x51, 0x60, + 0x28, 0x68, 0x08, 0xb1, 0x00, 0xf0, 0x9a, 0xb8, 0xca, 0x46, 0x97, 0xe0, + 0x06, 0xf0, 0x26, 0xfc, 0x21, 0x78, 0x02, 0x46, 0x03, 0x29, 0x4b, 0xf2, + 0x03, 0x70, 0x3f, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, 0x22, 0x2f, 0x02, 0x0e, + 0x01, 0x2a, 0x39, 0xd1, 0xd4, 0xf8, 0x01, 0x00, 0xd4, 0xf8, 0x05, 0x10, + 0xe9, 0xf7, 0x3e, 0xfa, 0x28, 0x60, 0xc5, 0xf8, 0x00, 0xa0, 0x30, 0xe0, + 0x01, 0x2a, 0x2d, 0xd1, 0xd4, 0xf8, 0x01, 0x00, 0xd4, 0xf8, 0x05, 0x10, + 0xbd, 0x4a, 0x13, 0x68, 0x03, 0xf6, 0x0a, 0x4c, 0xcc, 0xf8, 0x00, 0x00, + 0xcc, 0xf8, 0x04, 0x10, 0x11, 0x68, 0x81, 0xf8, 0x12, 0x9c, 0xe9, 0xf7, + 0xc0, 0xf9, 0x1b, 0xe0, 0x01, 0xf0, 0x0e, 0xf8, 0x28, 0x60, 0xc0, 0xb9, + 0x01, 0xf0, 0x46, 0xf8, 0x00, 0x21, 0xe3, 0xf7, 0x54, 0xfa, 0x28, 0x60, + 0x00, 0x24, 0x00, 0x20, 0x0b, 0xe0, 0x01, 0xf0, 0x01, 0xf8, 0x28, 0x60, + 0x58, 0xb9, 0x01, 0xf0, 0x39, 0xf8, 0x01, 0x21, 0xe3, 0xf7, 0x47, 0xfa, + 0x28, 0x60, 0x01, 0x24, 0x01, 0x20, 0x01, 0xf0, 0xad, 0xf9, 0x00, 0xe0, + 0x28, 0x60, 0x28, 0x68, 0x80, 0xb9, 0xe4, 0xf7, 0x21, 0xfb, 0x04, 0x46, + 0x00, 0x26, 0x24, 0xfa, 0x06, 0xf0, 0xc0, 0x07, 0x44, 0xbf, 0xf0, 0xb2, + 0xff, 0xf7, 0x0c, 0xfb, 0x76, 0x1c, 0x08, 0x2e, 0xf5, 0xd3, 0xef, 0xf7, + 0x3b, 0xfd, 0x28, 0x60, 0x28, 0x68, 0x01, 0xf0, 0x34, 0xf8, 0x00, 0xf0, + 0x67, 0xbf, 0x22, 0x78, 0x03, 0x2a, 0x1c, 0xd8, 0xdf, 0xe8, 0x02, 0xf0, + 0x0b, 0x12, 0x02, 0x08, 0xe9, 0xf7, 0xac, 0xfa, 0x01, 0x22, 0xe9, 0xf7, + 0xe5, 0xf9, 0x14, 0xe0, 0xe9, 0xf7, 0x7b, 0xf9, 0x11, 0xe0, 0x00, 0x21, + 0x68, 0x46, 0xe3, 0xf7, 0xa0, 0xfa, 0x00, 0x98, 0x00, 0x21, 0x05, 0xe0, + 0x01, 0x21, 0x68, 0x46, 0xe3, 0xf7, 0x99, 0xfa, 0x00, 0x98, 0x01, 0x21, + 0xe3, 0xf7, 0x09, 0xfa, 0x01, 0xe0, 0x4b, 0xf2, 0x03, 0x70, 0x28, 0x60, + 0x28, 0x68, 0x3f, 0xe0, 0x20, 0x78, 0x00, 0x23, 0x01, 0x28, 0x04, 0xd0, + 0x20, 0xb1, 0x4b, 0xf2, 0x03, 0x70, 0x28, 0x60, 0x08, 0xe0, 0x01, 0x23, + 0x01, 0x9a, 0x0f, 0x99, 0x18, 0x46, 0xe3, 0xf7, 0x58, 0xfa, 0x28, 0x60, + 0x00, 0xb9, 0xca, 0x46, 0x2e, 0x68, 0x0c, 0x20, 0x86, 0xe3, 0x20, 0x78, + 0x00, 0x23, 0x01, 0x28, 0x04, 0xd0, 0x20, 0xb1, 0x4b, 0xf2, 0x03, 0x70, + 0x28, 0x60, 0x0a, 0xe0, 0x01, 0x23, 0xd4, 0xf8, 0x01, 0x20, 0xd4, 0xf8, + 0x05, 0x10, 0x18, 0x46, 0xe3, 0xf7, 0x5a, 0xfa, 0x28, 0x60, 0x00, 0xb9, + 0xca, 0x46, 0x2e, 0x68, 0x40, 0xe3, 0xc5, 0xf8, 0x00, 0xa0, 0x20, 0x78, + 0x8d, 0xf8, 0x00, 0x00, 0x61, 0x78, 0x8d, 0xf8, 0x01, 0x10, 0x00, 0xf0, + 0x73, 0xff, 0xe3, 0xf7, 0x4d, 0xf8, 0xea, 0xf7, 0x2c, 0xfb, 0x00, 0x20, + 0xea, 0xf7, 0xa7, 0xfd, 0x01, 0x20, 0xea, 0xf7, 0xa4, 0xfd, 0x28, 0x68, + 0x00, 0xf0, 0x8a, 0xbd, 0xe3, 0xf7, 0x15, 0xfb, 0x00, 0x28, 0x40, 0xf0, + 0x00, 0x87, 0x00, 0x24, 0x2c, 0x60, 0x00, 0x26, 0x08, 0xeb, 0x86, 0x00, + 0xff, 0x21, 0x00, 0xf5, 0xc8, 0x77, 0xf1, 0x40, 0xc8, 0x07, 0x0d, 0xd5, + 0xf0, 0xb2, 0xea, 0xf7, 0x84, 0xfc, 0x08, 0xeb, 0x06, 0x01, 0x81, 0xf8, + 0x88, 0x01, 0x69, 0x46, 0x30, 0x46, 0xe3, 0xf7, 0x9a, 0xfa, 0x00, 0x98, + 0x38, 0x60, 0x04, 0xe0, 0x08, 0xeb, 0x06, 0x02, 0x82, 0xf8, 0x88, 0x41, + 0x3c, 0x60, 0x76, 0x1c, 0x08, 0x2e, 0xe1, 0xd1, 0x00, 0x26, 0x08, 0xeb, + 0x86, 0x00, 0xff, 0x21, 0x00, 0xf5, 0xdc, 0x77, 0xf1, 0x40, 0xc8, 0x07, + 0x0d, 0xd5, 0xf0, 0xb2, 0xea, 0xf7, 0x4e, 0xfc, 0x08, 0xeb, 0x06, 0x01, + 0x81, 0xf8, 0xb0, 0x01, 0x69, 0x46, 0x30, 0x46, 0xe3, 0xf7, 0x68, 0xfa, + 0x00, 0x98, 0x38, 0x60, 0x04, 0xe0, 0x08, 0xeb, 0x06, 0x02, 0x82, 0xf8, + 0xb0, 0x41, 0x3c, 0x60, 0x76, 0x1c, 0x08, 0x2e, 0xe1, 0xd1, 0x2e, 0x68, + 0x54, 0x20, 0x04, 0x90, 0x00, 0xf0, 0xc7, 0xbd, 0x27, 0x78, 0xe4, 0xf7, + 0x68, 0xfa, 0x00, 0xea, 0x07, 0x06, 0x00, 0x20, 0x28, 0x71, 0x00, 0x27, + 0x26, 0xfa, 0x07, 0xf1, 0xc9, 0x07, 0x12, 0xd5, 0xa0, 0x78, 0x30, 0xb1, + 0x00, 0xf0, 0x01, 0xff, 0x38, 0x46, 0x61, 0x78, 0xef, 0xf7, 0x29, 0xf9, + 0x04, 0xe0, 0x61, 0x78, 0x01, 0x22, 0x38, 0x46, 0xef, 0xf7, 0x44, 0xfa, + 0x29, 0x79, 0x09, 0xfa, 0x07, 0xf2, 0x11, 0x43, 0x29, 0x71, 0x7f, 0x1c, + 0x08, 0x2f, 0xe5, 0xd3, 0x84, 0xe0, 0x00, 0xf0, 0x19, 0xff, 0x07, 0x46, + 0xe4, 0xf7, 0x60, 0xfa, 0x00, 0x26, 0xff, 0x28, 0x1d, 0xd0, 0x60, 0x78, + 0x02, 0x28, 0x07, 0xda, 0x8d, 0xf8, 0x4a, 0x00, 0x12, 0xa9, 0xf8, 0xb2, + 0xf3, 0xf7, 0x03, 0xfc, 0x06, 0x46, 0x01, 0xe0, 0x4b, 0xf2, 0x04, 0x06, + 0x20, 0x78, 0x28, 0x71, 0x76, 0xb9, 0x9d, 0xf8, 0x4a, 0x00, 0x00, 0x99, + 0x68, 0x71, 0x14, 0x98, 0x08, 0x60, 0x9d, 0xf8, 0x48, 0x10, 0x02, 0x98, + 0x88, 0xf8, 0x8a, 0x11, 0x13, 0x99, 0x01, 0x60, 0x00, 0xe0, 0x28, 0x71, + 0x2e, 0x60, 0x0e, 0xb1, 0x00, 0xf0, 0x04, 0xba, 0xca, 0x46, 0x01, 0xe2, + 0x26, 0x78, 0xe4, 0xf7, 0x19, 0xfa, 0x00, 0xea, 0x06, 0x07, 0x00, 0x20, + 0xbd, 0xf8, 0x0e, 0x60, 0x28, 0x71, 0x83, 0x46, 0x27, 0xfa, 0x0b, 0xf1, + 0xc9, 0x07, 0x40, 0xd5, 0x60, 0x78, 0x02, 0x28, 0x07, 0xdb, 0x00, 0x90, + 0x5b, 0x46, 0xdf, 0xf8, 0xec, 0x2c, 0xff, 0x21, 0x01, 0x20, 0xe4, 0xf7, + 0x1e, 0xfb, 0xa0, 0x78, 0xf0, 0xb1, 0x00, 0xf0, 0xa4, 0xfe, 0x58, 0x46, + 0x61, 0x78, 0xef, 0xf7, 0xdf, 0xf8, 0x1c, 0xe0, 0xfc, 0x64, 0x03, 0x20, + 0xf3, 0xb9, 0x02, 0x01, 0xb0, 0x76, 0x02, 0x20, 0xb0, 0x8a, 0x04, 0x01, + 0xc4, 0x8a, 0x04, 0x01, 0xd8, 0x8a, 0x04, 0x01, 0xf4, 0x8a, 0x04, 0x01, + 0xec, 0x28, 0x02, 0x20, 0x4c, 0x46, 0x02, 0x20, 0x04, 0x8c, 0x04, 0x01, + 0x14, 0x8b, 0x04, 0x01, 0xb4, 0x76, 0x02, 0x20, 0x61, 0x78, 0x01, 0x22, + 0x58, 0x46, 0xef, 0xf7, 0xd7, 0xf9, 0x13, 0x2e, 0x08, 0xbf, 0x00, 0x28, + 0x06, 0xd1, 0x61, 0x78, 0x21, 0xb9, 0xd4, 0xf8, 0x07, 0x10, 0x58, 0x46, + 0xef, 0xf7, 0xbc, 0xfb, 0x29, 0x79, 0x09, 0xfa, 0x0b, 0xf2, 0x11, 0x43, + 0x29, 0x71, 0x0b, 0xf1, 0x01, 0x0b, 0xbb, 0xf1, 0x01, 0x0f, 0x01, 0xd8, + 0x00, 0x28, 0xb3, 0xd0, 0xad, 0xf8, 0x0e, 0x60, 0x00, 0xf0, 0xd6, 0xfe, + 0x00, 0xf0, 0x00, 0xbe, 0x00, 0xf0, 0x90, 0xfe, 0x07, 0x46, 0xe4, 0xf7, + 0xe6, 0xf9, 0x61, 0x78, 0x00, 0x26, 0x0b, 0x46, 0x02, 0x2b, 0x06, 0xdb, + 0x0f, 0xf6, 0x48, 0x42, 0x00, 0xf0, 0x8f, 0xfe, 0x4b, 0xf2, 0x04, 0x06, + 0x18, 0xe0, 0xff, 0x28, 0x16, 0xd0, 0x8d, 0xf8, 0x4a, 0x10, 0xf8, 0xb2, + 0x12, 0xa9, 0x01, 0xf0, 0xd0, 0xfb, 0x06, 0x00, 0x20, 0x78, 0x28, 0x71, + 0x0c, 0xd1, 0x9d, 0xf8, 0x4a, 0x00, 0x9d, 0xf8, 0x48, 0x10, 0x68, 0x71, + 0x88, 0xf8, 0x8a, 0x11, 0x00, 0x98, 0x14, 0x99, 0x01, 0x60, 0x02, 0x98, + 0x13, 0x99, 0x01, 0x60, 0x2e, 0x60, 0x0e, 0xb1, 0x00, 0xf0, 0x78, 0xb9, + 0xca, 0x46, 0x75, 0xe1, 0xe3, 0x78, 0x03, 0xb1, 0x01, 0x23, 0x61, 0x78, + 0x01, 0xb1, 0x01, 0x21, 0xa2, 0x78, 0x20, 0x78, 0xef, 0xf7, 0xed, 0xfb, + 0x71, 0xe1, 0xa0, 0x7a, 0x00, 0xb1, 0x01, 0x20, 0x61, 0x78, 0x01, 0xb1, + 0x01, 0x21, 0xd4, 0xf8, 0x06, 0x30, 0xd4, 0xf8, 0x02, 0x20, 0x00, 0x90, + 0x20, 0x78, 0xef, 0xf7, 0xf1, 0xfa, 0x62, 0xe1, 0x27, 0x78, 0x94, 0xf8, + 0x01, 0xb0, 0xe4, 0xf7, 0x6f, 0xf9, 0x00, 0xea, 0x07, 0x06, 0x00, 0x20, + 0x28, 0x71, 0x85, 0xf8, 0x05, 0xb0, 0x00, 0x27, 0x26, 0xfa, 0x07, 0xf1, + 0xc9, 0x07, 0x1e, 0xd5, 0xa2, 0x78, 0x8d, 0xf8, 0x50, 0x20, 0x12, 0x97, + 0xcd, 0xf8, 0x4c, 0xb0, 0xa0, 0x68, 0x15, 0x90, 0xe0, 0x78, 0x8d, 0xf8, + 0x51, 0x00, 0x60, 0x68, 0x16, 0x90, 0x21, 0x7b, 0x8d, 0xf8, 0x5c, 0x10, + 0x8d, 0xf8, 0x5d, 0x10, 0x09, 0xfa, 0x07, 0xf1, 0x28, 0x79, 0x8d, 0xf8, + 0x5e, 0xa0, 0x08, 0x43, 0x28, 0x71, 0x8d, 0xf8, 0x52, 0x90, 0x12, 0xa8, + 0xef, 0xf7, 0x44, 0xf8, 0x10, 0xb9, 0x7f, 0x1c, 0x08, 0x2f, 0xd9, 0xd3, + 0x28, 0x60, 0x7d, 0xe1, 0x00, 0xf0, 0x12, 0xfe, 0x07, 0x46, 0xe4, 0xf7, + 0x5f, 0xf9, 0x00, 0x26, 0x94, 0xf8, 0x01, 0xb0, 0xff, 0x28, 0x1e, 0xd0, + 0xa1, 0x78, 0x8d, 0xf8, 0x49, 0x10, 0x8d, 0xf8, 0x4a, 0xb0, 0x12, 0xa9, + 0xf8, 0xb2, 0x01, 0xf0, 0x20, 0xfd, 0x06, 0x46, 0x20, 0x78, 0x9d, 0xf8, + 0x48, 0x10, 0x68, 0x71, 0x85, 0xf8, 0x04, 0xb0, 0xa0, 0x78, 0x88, 0xf8, + 0x8a, 0x01, 0x88, 0xf8, 0x8b, 0x11, 0x0f, 0x98, 0x14, 0x99, 0x01, 0x60, + 0x10, 0x98, 0x13, 0x99, 0x01, 0x60, 0x9d, 0xf8, 0x54, 0x00, 0x88, 0xf8, + 0x94, 0x01, 0x2e, 0x60, 0x06, 0xb9, 0xca, 0x46, 0x11, 0x20, 0xb7, 0xe1, + 0x00, 0xf0, 0xe4, 0xfd, 0x07, 0x46, 0xe4, 0xf7, 0x31, 0xf9, 0x00, 0x26, + 0xff, 0x28, 0x18, 0xd0, 0x60, 0x78, 0x8d, 0xf8, 0x4a, 0x00, 0x12, 0xa9, + 0xf8, 0xb2, 0x01, 0xf0, 0x0f, 0xfe, 0x06, 0x00, 0x20, 0x78, 0x28, 0x71, + 0x9d, 0xf8, 0x4a, 0x00, 0x68, 0x71, 0x0c, 0xd1, 0x9d, 0xf8, 0x48, 0x00, + 0x00, 0x99, 0x88, 0xf8, 0x8a, 0x01, 0x14, 0x98, 0x08, 0x60, 0x02, 0x99, + 0x13, 0x98, 0x08, 0x60, 0x01, 0xe0, 0xff, 0x21, 0x29, 0x71, 0x2e, 0x60, + 0x0e, 0xb1, 0x00, 0xf0, 0xd3, 0xb8, 0xca, 0x46, 0xd0, 0xe0, 0x26, 0x78, + 0x61, 0x78, 0x01, 0x91, 0xd3, 0x46, 0xe4, 0xf7, 0xe3, 0xf8, 0x06, 0x40, + 0x02, 0x96, 0x85, 0xf8, 0x04, 0xa0, 0x00, 0x26, 0x01, 0x99, 0x69, 0x71, + 0x02, 0x98, 0xf0, 0x40, 0xc1, 0x07, 0x2b, 0xd5, 0x29, 0x79, 0x01, 0x9a, + 0x8d, 0xf8, 0x4a, 0x20, 0x09, 0xfa, 0x06, 0xf0, 0x01, 0x43, 0x00, 0x27, + 0x29, 0x71, 0xd3, 0x46, 0x8d, 0xf8, 0x49, 0xb0, 0x12, 0xa9, 0xf0, 0xb2, + 0x01, 0xf0, 0xbb, 0xfc, 0x10, 0xb9, 0x9d, 0xf8, 0x48, 0x10, 0x0f, 0x43, + 0x0b, 0xf1, 0x01, 0x0b, 0x5f, 0xfa, 0x8b, 0xf2, 0x02, 0x2a, 0xef, 0xdb, + 0x5f, 0xea, 0x00, 0x0b, 0x0e, 0xd1, 0xff, 0xb2, 0x9f, 0xb9, 0xa0, 0x78, + 0xd8, 0xb1, 0xd4, 0xf8, 0x03, 0x30, 0xd4, 0xf8, 0x07, 0x20, 0x01, 0x99, + 0xcd, 0xf8, 0x00, 0x90, 0x30, 0x46, 0xef, 0xf7, 0x84, 0xf8, 0x83, 0x46, + 0x76, 0x1c, 0x08, 0x2e, 0x05, 0xd2, 0xbb, 0xf1, 0x00, 0x0f, 0xc9, 0xd0, + 0x01, 0xe0, 0x4b, 0xf2, 0x06, 0x0b, 0xbb, 0xf1, 0x00, 0x0f, 0x08, 0xbf, + 0xca, 0x46, 0xc5, 0xf8, 0x00, 0xb0, 0x5e, 0x46, 0xda, 0xe0, 0x01, 0x99, + 0x01, 0x22, 0x30, 0x46, 0xef, 0xf7, 0x7b, 0xf8, 0xe7, 0xe7, 0x26, 0x78, + 0xe4, 0xf7, 0x92, 0xf8, 0x00, 0xf0, 0x1f, 0xfd, 0x00, 0xf0, 0x0e, 0xfd, + 0x16, 0xd5, 0x00, 0x27, 0x00, 0xf0, 0x2c, 0xfd, 0x0f, 0xd0, 0x8d, 0xf8, + 0x00, 0x70, 0x09, 0xfa, 0x06, 0xf2, 0xa0, 0x78, 0x6b, 0x79, 0x8d, 0xf8, + 0x01, 0x00, 0x19, 0x43, 0xd4, 0xf8, 0x07, 0x00, 0x01, 0x90, 0x00, 0xf0, + 0x6d, 0xfd, 0xfe, 0xf7, 0x63, 0xf8, 0x7f, 0x1c, 0x08, 0x2f, 0xe9, 0xd3, + 0x00, 0xf0, 0x22, 0xfd, 0xe2, 0xdb, 0x00, 0xf0, 0x59, 0xfd, 0xaf, 0xe0, + 0x26, 0x78, 0xe4, 0xf7, 0x6d, 0xf8, 0x00, 0xf0, 0xfa, 0xfc, 0x00, 0xf0, + 0xe9, 0xfc, 0x0c, 0xd5, 0x00, 0x27, 0x00, 0xf0, 0x07, 0xfd, 0x05, 0xd0, + 0x00, 0xf0, 0xf7, 0xfc, 0xfe, 0xf7, 0x80, 0xf8, 0x00, 0xf0, 0xe2, 0xfc, + 0x7f, 0x1c, 0x08, 0x2f, 0xf3, 0xd3, 0x00, 0xf0, 0x07, 0xfd, 0xec, 0xdb, + 0x3c, 0xe0, 0x26, 0x78, 0xe4, 0xf7, 0x55, 0xf8, 0x00, 0xf0, 0xe1, 0xfc, + 0x00, 0xf0, 0xd0, 0xfc, 0x16, 0xd5, 0x00, 0x27, 0x00, 0xf0, 0xee, 0xfc, + 0x0f, 0xd0, 0xa2, 0x78, 0x8d, 0xf8, 0x01, 0x20, 0x8d, 0xf8, 0x00, 0x70, + 0x09, 0xfa, 0x06, 0xf2, 0xd4, 0xf8, 0x07, 0x00, 0x6b, 0x79, 0x01, 0x90, + 0x19, 0x43, 0x00, 0xf0, 0x2f, 0xfd, 0xfd, 0xf7, 0xdd, 0xff, 0x7f, 0x1c, + 0x08, 0x2f, 0xe9, 0xd3, 0x00, 0xf0, 0xe4, 0xfc, 0xe2, 0xdb, 0x00, 0xf0, + 0x1b, 0xfd, 0x71, 0xe0, 0x26, 0x78, 0xe4, 0xf7, 0x30, 0xf8, 0x00, 0xf0, + 0xbc, 0xfc, 0x00, 0xf0, 0xab, 0xfc, 0x0c, 0xd5, 0x00, 0x27, 0x00, 0xf0, + 0xc9, 0xfc, 0x05, 0xd0, 0x00, 0xf0, 0xb9, 0xfc, 0xfd, 0xf7, 0xed, 0xff, + 0x00, 0xf0, 0xa4, 0xfc, 0x7f, 0x1c, 0x08, 0x2f, 0xf3, 0xd3, 0x00, 0xf0, + 0xc9, 0xfc, 0xec, 0xdb, 0x00, 0xf0, 0x00, 0xfd, 0x0f, 0x20, 0xbb, 0xe0, + 0x21, 0x88, 0x60, 0x88, 0x22, 0x1d, 0xfd, 0xf7, 0x2e, 0xff, 0xe4, 0xe2, + 0x20, 0x46, 0xfd, 0xf7, 0x42, 0xff, 0xe0, 0xe2, 0x94, 0xf8, 0x7c, 0x20, + 0x01, 0x99, 0x20, 0x46, 0xfd, 0xf7, 0x4e, 0xff, 0x05, 0xe0, 0x94, 0xf8, + 0x7c, 0x20, 0x01, 0x99, 0x20, 0x46, 0xfd, 0xf7, 0x4b, 0xff, 0x00, 0xf0, + 0x13, 0xfd, 0x44, 0x20, 0xa0, 0xe0, 0x21, 0x88, 0x11, 0xf4, 0x70, 0x4f, + 0x03, 0xd0, 0x4b, 0xf2, 0x01, 0x60, 0x28, 0x60, 0x0c, 0xe0, 0x01, 0x98, + 0xd5, 0xf7, 0x95, 0xfe, 0x0b, 0x99, 0x20, 0x88, 0xd5, 0xf7, 0x57, 0xfe, + 0x20, 0x88, 0xc5, 0xf8, 0x00, 0xa0, 0xa8, 0xf8, 0xa2, 0x01, 0xca, 0x46, + 0x2e, 0x68, 0x20, 0x20, 0x88, 0xe0, 0x01, 0x98, 0xd5, 0xf7, 0xba, 0xfe, + 0x00, 0xf0, 0xcb, 0xfc, 0x1c, 0xe0, 0x21, 0x88, 0x11, 0xf4, 0x70, 0x6f, + 0x0f, 0xd0, 0x08, 0x26, 0xf0, 0xb2, 0xe9, 0xf7, 0xc5, 0xff, 0x09, 0xfa, + 0x06, 0xf7, 0x28, 0xb9, 0x21, 0x88, 0x39, 0x42, 0x1c, 0xbf, 0x21, 0xea, + 0x07, 0x07, 0x27, 0x80, 0x76, 0x1c, 0x0c, 0x2e, 0xf0, 0xd3, 0x20, 0x88, + 0xd5, 0xf7, 0xb6, 0xfe, 0x28, 0x60, 0x20, 0x88, 0xa8, 0x80, 0x28, 0x68, + 0x00, 0xf0, 0xd7, 0xfc, 0x06, 0x20, 0x63, 0xe0, 0x06, 0xf0, 0x69, 0xfc, + 0xe3, 0xe2, 0x19, 0x28, 0x03, 0xd0, 0x49, 0x28, 0x05, 0xd1, 0x01, 0x20, + 0x00, 0xe0, 0x00, 0x20, 0xe2, 0xf7, 0xcc, 0xff, 0x16, 0xe0, 0x4f, 0xf6, + 0x25, 0x70, 0x13, 0xe0, 0x1a, 0x28, 0xcd, 0xf8, 0x10, 0xa0, 0x02, 0xd0, + 0x4a, 0x28, 0x08, 0xd0, 0x0a, 0xe0, 0x01, 0x20, 0xe2, 0xf7, 0x91, 0xfd, + 0x28, 0x60, 0x01, 0x20, 0xe2, 0xf7, 0xba, 0xff, 0x04, 0xe0, 0xe2, 0xf7, + 0xc0, 0xff, 0x01, 0xe0, 0x4f, 0xf6, 0x25, 0x70, 0x28, 0x60, 0x04, 0x21, + 0x2e, 0x68, 0x04, 0x91, 0xee, 0xe2, 0x00, 0xf0, 0x4d, 0xfc, 0x01, 0x22, + 0xf0, 0xf7, 0x3e, 0xfc, 0x28, 0x60, 0x06, 0x46, 0x08, 0xb1, 0x00, 0xf0, + 0x63, 0xba, 0xca, 0x46, 0x60, 0xe2, 0x00, 0xf0, 0x41, 0xfc, 0x00, 0x22, + 0xf0, 0xf7, 0x32, 0xfc, 0x57, 0xe2, 0x20, 0x68, 0x06, 0xf0, 0x20, 0xf8, + 0x28, 0x60, 0x20, 0xb9, 0x05, 0xf0, 0xb6, 0xfe, 0xe3, 0xf7, 0xec, 0xff, + 0xca, 0x46, 0x2e, 0x68, 0x4e, 0xe2, 0x20, 0x68, 0x07, 0xf0, 0x85, 0xf8, + 0x47, 0xe2, 0x22, 0x68, 0x03, 0xa9, 0x04, 0xf1, 0x08, 0x00, 0x02, 0x91, + 0x01, 0x90, 0xe3, 0x88, 0x06, 0x99, 0x9d, 0xf8, 0x14, 0x00, 0x00, 0x93, + 0xa3, 0x88, 0x07, 0xf0, 0x82, 0xf8, 0x38, 0xe2, 0x20, 0x68, 0x01, 0x9b, + 0xe2, 0x88, 0xa1, 0x88, 0x07, 0xf0, 0x46, 0xf8, 0x00, 0xf0, 0x72, 0xfc, + 0xe0, 0x88, 0x00, 0x1d, 0x9b, 0xe3, 0x20, 0x78, 0x05, 0x28, 0x18, 0xbf, + 0xe4, 0xf7, 0xb3, 0xf8, 0x60, 0x78, 0xff, 0x28, 0x18, 0xbf, 0xe4, 0xf7, + 0xb9, 0xf8, 0xa0, 0x79, 0xff, 0x28, 0x07, 0xd0, 0xd4, 0xf8, 0x02, 0x10, + 0x01, 0x28, 0x18, 0xbf, 0x00, 0x20, 0xc9, 0xb2, 0xe4, 0xf7, 0xa8, 0xf8, + 0xca, 0x46, 0x00, 0x26, 0x6a, 0xe2, 0x60, 0x89, 0x40, 0xf2, 0x01, 0x11, + 0x88, 0x42, 0x31, 0xd2, 0x8d, 0xf8, 0x0d, 0xa0, 0x20, 0x68, 0x13, 0x28, + 0x07, 0xd2, 0x00, 0xf0, 0x3a, 0xfc, 0xf4, 0xf7, 0xbb, 0xfa, 0x28, 0x60, + 0x8d, 0xf8, 0x0c, 0xa0, 0x13, 0xe0, 0x9d, 0xf8, 0x14, 0x00, 0x06, 0x28, + 0x18, 0xbf, 0x07, 0x28, 0x04, 0xd0, 0x00, 0xf0, 0x2c, 0xfc, 0x04, 0xf0, + 0x75, 0xfc, 0x03, 0xe0, 0x00, 0xf0, 0x27, 0xfc, 0x04, 0xf0, 0xa4, 0xfc, + 0x28, 0x60, 0x8d, 0xf8, 0x0c, 0xa0, 0x8d, 0xf8, 0x0d, 0x90, 0x20, 0x68, + 0x0c, 0x28, 0x18, 0xbf, 0x33, 0x28, 0x46, 0xd1, 0x9d, 0xf8, 0x0d, 0x00, + 0x05, 0xf0, 0xe0, 0xfd, 0x00, 0x28, 0x40, 0xd0, 0x00, 0x22, 0x8d, 0xf8, + 0x0c, 0x90, 0xca, 0x46, 0x04, 0x92, 0x3a, 0xe0, 0x4f, 0xf6, 0x61, 0x70, + 0x06, 0x21, 0x28, 0x60, 0x34, 0xe0, 0x05, 0xf0, 0xaf, 0xff, 0x00, 0x28, + 0x2b, 0xd0, 0x60, 0x89, 0x40, 0xf2, 0x01, 0x11, 0x88, 0x42, 0x1e, 0xd2, + 0x20, 0x68, 0x13, 0x28, 0x04, 0xd2, 0x00, 0xf0, 0xfc, 0xfb, 0xf4, 0xf7, + 0x8d, 0xfa, 0x05, 0xe0, 0x36, 0x28, 0x07, 0xd8, 0x00, 0xf0, 0xf5, 0xfb, + 0x04, 0xf0, 0x98, 0xfc, 0x28, 0x60, 0x8d, 0xf8, 0x0c, 0xa0, 0x1a, 0xe0, + 0xa5, 0xf8, 0x04, 0xa0, 0x20, 0x46, 0x00, 0xf0, 0xfb, 0xfc, 0x28, 0x60, + 0x00, 0xb9, 0xca, 0x46, 0xa9, 0x88, 0x8d, 0xf8, 0x0c, 0x90, 0x89, 0x1d, + 0x0c, 0xe0, 0x4f, 0xf6, 0x61, 0x70, 0x28, 0x60, 0xa5, 0xf8, 0x04, 0xa0, + 0x06, 0x20, 0x04, 0x90, 0x05, 0xe0, 0x4f, 0xf6, 0x60, 0x71, 0x29, 0x60, + 0xa8, 0x80, 0x06, 0x21, 0x04, 0x91, 0x2e, 0x68, 0x1d, 0xe3, 0x61, 0x79, + 0x01, 0xb1, 0x01, 0x21, 0x20, 0x68, 0x27, 0x79, 0x01, 0x24, 0x09, 0x26, + 0x31, 0xb9, 0xc0, 0xb2, 0x05, 0xf0, 0x0e, 0xfe, 0x04, 0x46, 0x66, 0x1c, + 0xb4, 0x42, 0x1d, 0xd2, 0x01, 0xaa, 0x69, 0x46, 0x20, 0x46, 0x05, 0xf0, + 0x2a, 0xfe, 0x00, 0x98, 0x13, 0x28, 0x06, 0xd2, 0x01, 0x98, 0x00, 0xea, + 0x07, 0x01, 0x00, 0x98, 0xf4, 0xf7, 0xa4, 0xfb, 0x09, 0xe0, 0x36, 0x28, + 0x04, 0xd2, 0x01, 0x99, 0x39, 0x40, 0x04, 0xf0, 0xe0, 0xfd, 0x02, 0xe0, + 0x01, 0x98, 0x05, 0xf0, 0xe1, 0xfe, 0x20, 0x46, 0x05, 0xf0, 0x1f, 0xfe, + 0x64, 0x1c, 0xdf, 0xe7, 0x00, 0xf0, 0x8b, 0xfb, 0x74, 0xe1, 0xe0, 0x78, + 0xa2, 0x78, 0x01, 0x28, 0x20, 0x78, 0x0c, 0xbf, 0x61, 0x78, 0x18, 0x21, + 0x07, 0xf0, 0x20, 0xf8, 0x28, 0x60, 0x06, 0x46, 0xca, 0x46, 0x67, 0xe1, + 0x18, 0x21, 0x8d, 0xf8, 0x01, 0x10, 0x8d, 0xf8, 0x00, 0xa0, 0x6a, 0x46, + 0x20, 0x78, 0x0d, 0xf1, 0x01, 0x01, 0x07, 0xf0, 0x25, 0xf8, 0x0d, 0x99, + 0x08, 0x60, 0xca, 0x46, 0x9d, 0xf8, 0x01, 0x00, 0x9d, 0xf8, 0x00, 0x10, + 0x28, 0x70, 0x69, 0x70, 0x06, 0x21, 0x0d, 0x98, 0x06, 0x68, 0xc4, 0xe2, + 0x00, 0xf0, 0x47, 0xfb, 0x28, 0xb9, 0x40, 0xf6, 0x01, 0x40, 0x28, 0x60, + 0xa5, 0xf8, 0x04, 0xa0, 0x21, 0xe0, 0x00, 0xf0, 0x50, 0xfb, 0x07, 0x46, + 0xfe, 0x6a, 0xf1, 0x6a, 0x60, 0x78, 0x08, 0x70, 0x0c, 0x22, 0xf1, 0x6a, + 0xd4, 0xf8, 0x03, 0x00, 0x48, 0x60, 0x81, 0xf8, 0x08, 0x90, 0x07, 0x21, + 0x38, 0x46, 0xf7, 0xf7, 0x05, 0xfa, 0x38, 0x46, 0xf7, 0xf7, 0x08, 0xfa, + 0xc5, 0xf8, 0x00, 0xa0, 0x18, 0xb1, 0x38, 0x46, 0xf7, 0xf7, 0x82, 0xf9, + 0x28, 0x60, 0x30, 0x6b, 0x01, 0x78, 0x29, 0x71, 0x30, 0x6b, 0x41, 0x78, + 0x69, 0x71, 0x06, 0x20, 0x2e, 0x68, 0xa2, 0xe1, 0x20, 0x21, 0x28, 0x46, + 0xe8, 0xf7, 0x2a, 0xf9, 0x00, 0xf0, 0x15, 0xfb, 0x20, 0xb9, 0x0b, 0x98, + 0x40, 0xf6, 0x01, 0x41, 0x01, 0x60, 0x50, 0xe0, 0x00, 0xf0, 0x1f, 0xfb, + 0x06, 0x46, 0x1e, 0x22, 0xf4, 0x6a, 0x07, 0x21, 0xf7, 0xf7, 0xde, 0xf9, + 0x30, 0x46, 0xf7, 0xf7, 0xe1, 0xf9, 0x00, 0x28, 0x3e, 0xd1, 0x0b, 0x98, + 0xc0, 0xf8, 0x00, 0xa0, 0x20, 0x6b, 0x01, 0x88, 0x29, 0x80, 0x80, 0x78, + 0xa8, 0x70, 0x21, 0x6b, 0xc8, 0x78, 0xe8, 0x70, 0x21, 0x6b, 0x08, 0x79, + 0x28, 0x71, 0x20, 0x6b, 0xc1, 0x88, 0xa8, 0xf8, 0x89, 0x11, 0x02, 0x89, + 0xa8, 0xf8, 0x8b, 0x21, 0x80, 0x7a, 0x88, 0xf8, 0x8d, 0x01, 0x21, 0x6b, + 0xc8, 0x7a, 0x88, 0xf8, 0x8e, 0x01, 0x20, 0x6b, 0x81, 0x89, 0xa8, 0xf8, + 0x8f, 0x11, 0xc2, 0x89, 0xa8, 0xf8, 0x91, 0x21, 0x00, 0x7c, 0x11, 0x9a, + 0x88, 0xf8, 0x93, 0x01, 0x21, 0x6b, 0x48, 0x7c, 0x88, 0xf8, 0x94, 0x01, + 0x21, 0x6b, 0x88, 0x7c, 0x88, 0xf8, 0x95, 0x01, 0x21, 0x6b, 0xc8, 0x7c, + 0x88, 0xf8, 0x96, 0x01, 0x21, 0x6b, 0x08, 0x7d, 0x88, 0xf8, 0x97, 0x01, + 0x20, 0x6b, 0x00, 0xf1, 0x15, 0x01, 0x08, 0x68, 0x10, 0x60, 0x48, 0x68, + 0x50, 0x60, 0x04, 0xe0, 0x30, 0x46, 0xf7, 0xf7, 0x1d, 0xf9, 0x0b, 0x99, + 0x08, 0x60, 0x20, 0x21, 0x0b, 0x98, 0x0b, 0x9a, 0x5d, 0xe0, 0x60, 0x21, + 0x28, 0x46, 0xe8, 0xf7, 0xc9, 0xf8, 0x00, 0xf0, 0xb4, 0xfa, 0x20, 0xb9, + 0x0c, 0x98, 0x40, 0xf6, 0x01, 0x41, 0x01, 0x60, 0x4e, 0xe0, 0x00, 0xf0, + 0xbe, 0xfa, 0x06, 0x46, 0x1f, 0x22, 0xf4, 0x6a, 0x07, 0x21, 0xf7, 0xf7, + 0x7d, 0xf9, 0x30, 0x46, 0xf7, 0xf7, 0x80, 0xf9, 0x00, 0x28, 0x3c, 0xd1, + 0x0c, 0x98, 0xc0, 0xf8, 0x00, 0xa0, 0x26, 0x6b, 0x30, 0x88, 0x28, 0x80, + 0xb1, 0x1c, 0x0d, 0x98, 0x0a, 0x78, 0x02, 0x70, 0x4a, 0x78, 0x42, 0x70, + 0x02, 0x22, 0x01, 0x98, 0x31, 0x1d, 0xd5, 0xf7, 0x47, 0xfd, 0xb0, 0x1d, + 0x08, 0xf5, 0xc5, 0x71, 0x02, 0x78, 0x0a, 0x70, 0x42, 0x78, 0x4a, 0x70, + 0x30, 0x7a, 0x10, 0x9a, 0x88, 0xf8, 0x8c, 0x01, 0x21, 0x6b, 0x48, 0x7a, + 0x88, 0xf8, 0x8d, 0x01, 0x21, 0x6b, 0x88, 0x7a, 0x88, 0xf8, 0x8e, 0x01, + 0x21, 0x6b, 0xc8, 0x7a, 0x88, 0xf8, 0x8f, 0x01, 0x20, 0x6b, 0x00, 0xf1, + 0x0c, 0x01, 0xd1, 0xe9, 0x00, 0x31, 0xc2, 0xe9, 0x00, 0x31, 0x00, 0xf1, + 0x14, 0x01, 0x11, 0x9a, 0xd1, 0xe9, 0x00, 0x31, 0xc2, 0xe9, 0x00, 0x31, + 0x40, 0x22, 0x00, 0xf1, 0x1c, 0x01, 0x0b, 0x98, 0xd5, 0xf7, 0x1c, 0xfd, + 0x04, 0xe0, 0x30, 0x46, 0xf7, 0xf7, 0xbe, 0xf8, 0x0c, 0x99, 0x08, 0x60, + 0x60, 0x21, 0x0c, 0x98, 0x0c, 0x9a, 0x06, 0x68, 0x04, 0x91, 0x10, 0x68, + 0xe1, 0xe0, 0x08, 0xf5, 0xc4, 0x76, 0x00, 0x20, 0x30, 0x60, 0x28, 0x60, + 0x21, 0x68, 0xf9, 0x40, 0xc9, 0x07, 0x26, 0xd5, 0xf9, 0x1e, 0x03, 0x29, + 0x1b, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, 0x0f, 0x02, 0x14, 0x08, 0xe3, 0xf7, + 0x76, 0xfd, 0x03, 0x21, 0x07, 0xf0, 0xb6, 0xfa, 0x11, 0xe0, 0xe3, 0xf7, + 0x71, 0xfd, 0x4f, 0xf4, 0x7a, 0x61, 0x07, 0xf0, 0x87, 0xfd, 0x0a, 0xe0, + 0xe3, 0xf7, 0x76, 0xfd, 0xf7, 0xf7, 0x2e, 0xf8, 0x0c, 0xe0, 0xe3, 0xf7, + 0x63, 0xfd, 0x4f, 0xf4, 0x7a, 0x61, 0x08, 0xf0, 0x42, 0xf8, 0x30, 0xb1, + 0x31, 0x68, 0x09, 0xfa, 0x07, 0xf2, 0x11, 0x43, 0x31, 0x60, 0x28, 0x60, + 0x00, 0x20, 0x7f, 0x1c, 0x06, 0x2f, 0xd1, 0xd9, 0x28, 0x68, 0x00, 0x28, + 0x5e, 0xd1, 0xca, 0x46, 0x5c, 0xe0, 0x21, 0x78, 0x8d, 0xf8, 0x00, 0x10, + 0x68, 0x46, 0xe5, 0xf7, 0xf3, 0xff, 0x28, 0x60, 0x9d, 0xf8, 0x00, 0x00, + 0x28, 0x71, 0x9d, 0xf8, 0x01, 0x00, 0x68, 0x71, 0x9d, 0xf8, 0x02, 0x00, + 0x88, 0xf8, 0x8a, 0x01, 0x9d, 0xf8, 0x03, 0x00, 0x88, 0xf8, 0x8b, 0x01, + 0x28, 0x68, 0x00, 0xf0, 0x4e, 0xfa, 0x08, 0x21, 0x81, 0xe1, 0x22, 0x78, + 0x8d, 0xf8, 0x00, 0x20, 0x60, 0x78, 0x8d, 0xf8, 0x01, 0x00, 0x00, 0xf0, + 0xdf, 0xf9, 0xe5, 0xf7, 0xef, 0xff, 0x28, 0x60, 0x00, 0xf0, 0x3f, 0xfa, + 0x04, 0x20, 0x68, 0xe1, 0x26, 0x68, 0x16, 0xf1, 0x03, 0x0f, 0x0a, 0xd1, + 0x00, 0x20, 0xe5, 0xf7, 0x56, 0xfd, 0x01, 0x20, 0xe5, 0xf7, 0x53, 0xfd, + 0x00, 0x20, 0x28, 0x60, 0x6f, 0xf0, 0x02, 0x00, 0x16, 0xe0, 0x16, 0xf1, + 0x02, 0x0f, 0x0c, 0xd1, 0xdf, 0xf8, 0xfc, 0x06, 0x01, 0x68, 0x01, 0xf6, + 0x2d, 0x40, 0xe5, 0xf7, 0xdb, 0xfc, 0x28, 0x60, 0x6f, 0xf0, 0x01, 0x01, + 0x01, 0x98, 0x01, 0x60, 0x0f, 0xe0, 0x16, 0xf1, 0x01, 0x0f, 0x06, 0xd1, + 0x00, 0x20, 0x28, 0x60, 0xe5, 0xf7, 0xa7, 0xff, 0x01, 0x99, 0x08, 0x60, + 0x05, 0xe0, 0x30, 0x46, 0xe5, 0xf7, 0x5d, 0xff, 0x28, 0x60, 0x01, 0x98, + 0x06, 0x60, 0xca, 0x46, 0x28, 0x68, 0x08, 0xb1, 0x4f, 0xf0, 0x00, 0x0a, + 0x06, 0x46, 0x08, 0x20, 0x31, 0xe1, 0x61, 0x78, 0x24, 0x78, 0x01, 0xea, + 0x04, 0x02, 0x00, 0x20, 0x8c, 0x43, 0x11, 0x00, 0x05, 0xd0, 0x01, 0x21, + 0x10, 0x46, 0xe6, 0xf7, 0xb3, 0xf9, 0xc0, 0xb2, 0x28, 0xb9, 0x3c, 0xb1, + 0x00, 0x21, 0x20, 0x46, 0xe6, 0xf7, 0xac, 0xf9, 0xc0, 0xb2, 0x10, 0xb1, + 0x06, 0x46, 0x01, 0xe0, 0x00, 0xb9, 0xca, 0x46, 0x00, 0x20, 0x16, 0xe1, + 0x4f, 0xf4, 0x01, 0x71, 0x28, 0x46, 0xe7, 0xf7, 0xb3, 0xff, 0x00, 0xf0, + 0x9e, 0xf9, 0x18, 0xb9, 0x40, 0xf6, 0x01, 0x40, 0x28, 0x60, 0x1d, 0xe0, + 0x00, 0xf0, 0xa9, 0xf9, 0x06, 0x46, 0x10, 0x20, 0xf4, 0x6a, 0xe1, 0x6a, + 0x08, 0x70, 0x0d, 0x22, 0xe0, 0x6a, 0x80, 0xf8, 0x01, 0x90, 0x07, 0x21, + 0x30, 0x46, 0xf7, 0xf7, 0x61, 0xf8, 0x30, 0x46, 0xf7, 0xf7, 0x64, 0xf8, + 0xc5, 0xf8, 0x00, 0xa0, 0x18, 0xb1, 0x30, 0x46, 0xf6, 0xf7, 0xde, 0xff, + 0x28, 0x60, 0x21, 0x6b, 0x01, 0x98, 0x60, 0x22, 0xd5, 0xf7, 0x32, 0xfc, + 0x2e, 0x68, 0x4f, 0xf4, 0x01, 0x70, 0x04, 0x90, 0x28, 0x68, 0x00, 0x28, + 0x00, 0xd1, 0xca, 0x46, 0xf1, 0xe0, 0xe2, 0xf7, 0xda, 0xfc, 0x90, 0xb1, + 0xc5, 0xf8, 0x00, 0xa0, 0xca, 0x46, 0x20, 0x68, 0xee, 0xf7, 0xd2, 0xf9, + 0x01, 0x99, 0x0f, 0xf2, 0x4c, 0x62, 0x08, 0x60, 0x01, 0x99, 0x23, 0x68, + 0x08, 0x68, 0x00, 0x90, 0xff, 0x21, 0x03, 0x20, 0xe3, 0xf7, 0xa9, 0xfd, + 0x02, 0xe0, 0x4f, 0xf6, 0x76, 0x71, 0x29, 0x60, 0x08, 0x22, 0x2e, 0x68, + 0x04, 0x92, 0xd4, 0xe0, 0x21, 0x78, 0x00, 0x26, 0x04, 0x29, 0x00, 0xf2, + 0xb2, 0x80, 0xdf, 0xe8, 0x01, 0xf0, 0xa2, 0x5d, 0x2b, 0x16, 0x03, 0x00, + 0xe3, 0xf7, 0x78, 0xfc, 0x67, 0x78, 0xf8, 0x40, 0xc0, 0x07, 0x04, 0xd5, + 0x38, 0x46, 0xf0, 0xf7, 0xb3, 0xfb, 0x01, 0x46, 0x01, 0xe0, 0x4f, 0xf6, + 0x52, 0x76, 0x20, 0x78, 0x28, 0x71, 0x6f, 0x71, 0x88, 0xf8, 0x8a, 0x11, + 0x9b, 0xe0, 0xe3, 0xf7, 0x65, 0xfc, 0x67, 0x78, 0xf8, 0x40, 0xc0, 0x07, + 0x08, 0xd5, 0xa1, 0x78, 0x38, 0x46, 0x11, 0xb1, 0xf0, 0xf7, 0x88, 0xfb, + 0x04, 0xe0, 0xf0, 0xf7, 0x7d, 0xfb, 0x01, 0xe0, 0x4f, 0xf6, 0x52, 0x76, + 0x20, 0x78, 0x28, 0x71, 0x6f, 0x71, 0x86, 0xe0, 0xe3, 0xf7, 0x50, 0xfc, + 0x67, 0x78, 0x94, 0xf8, 0x02, 0xb0, 0xf8, 0x40, 0xc0, 0x07, 0x0d, 0xd5, + 0xbb, 0xf1, 0x40, 0x0f, 0x07, 0xd8, 0x6b, 0x46, 0x0d, 0xf1, 0x02, 0x02, + 0x59, 0x46, 0x38, 0x46, 0xf0, 0xf7, 0x9c, 0xfc, 0x04, 0xe0, 0x4b, 0xf6, + 0x02, 0x26, 0x01, 0xe0, 0x4f, 0xf6, 0x52, 0x76, 0x20, 0x78, 0x28, 0x71, + 0x6f, 0x71, 0x88, 0xf8, 0x8a, 0xb1, 0xbd, 0xf9, 0x02, 0x10, 0xbd, 0xf8, + 0x02, 0x00, 0x88, 0xf8, 0x8b, 0x01, 0x09, 0x04, 0x09, 0x0e, 0x88, 0xf8, + 0x8c, 0x11, 0xbd, 0xf9, 0x00, 0x10, 0xbd, 0xf8, 0x00, 0x00, 0x88, 0xf8, + 0x8d, 0x01, 0x09, 0x04, 0x09, 0x0e, 0x88, 0xf8, 0x8e, 0x11, 0x54, 0xe0, + 0xe3, 0xf7, 0x1e, 0xfc, 0x61, 0x78, 0x8d, 0xf8, 0x00, 0x10, 0xe1, 0x1c, + 0xa2, 0x78, 0x8d, 0xf8, 0x01, 0x20, 0x0d, 0xf1, 0x02, 0x02, 0x0b, 0x78, + 0x13, 0x70, 0x4b, 0x78, 0x53, 0x70, 0x61, 0x1d, 0x01, 0xaa, 0x0b, 0x78, + 0x13, 0x70, 0x4b, 0x78, 0x9d, 0xf8, 0x00, 0x10, 0x53, 0x70, 0xc8, 0x40, + 0xc0, 0x07, 0x1e, 0xd5, 0x9d, 0xf8, 0x01, 0x00, 0x40, 0x28, 0x04, 0xd9, + 0xff, 0x28, 0x05, 0xd0, 0x4b, 0xf6, 0x02, 0x26, 0x17, 0xe0, 0x07, 0x46, + 0xff, 0x2f, 0x10, 0xd1, 0x01, 0x27, 0x4f, 0xf0, 0x40, 0x0b, 0xf8, 0xb2, + 0x83, 0x45, 0x0e, 0xdb, 0xbd, 0xf9, 0x04, 0x30, 0xbd, 0xf9, 0x02, 0x20, + 0x9d, 0xf8, 0x00, 0x00, 0xf9, 0xb2, 0xf0, 0xf7, 0x01, 0xfc, 0x7f, 0x1c, + 0xf1, 0xe7, 0xbb, 0x46, 0xef, 0xe7, 0x4f, 0xf6, 0x52, 0x76, 0x20, 0x78, + 0x9d, 0xf8, 0x00, 0x10, 0x28, 0x71, 0x69, 0x71, 0x9d, 0xf8, 0x01, 0x00, + 0x88, 0xf8, 0x8a, 0x01, 0x0f, 0xe0, 0x60, 0x1c, 0x61, 0x1c, 0x02, 0x68, + 0x00, 0x92, 0x00, 0x20, 0x22, 0x78, 0x2a, 0x71, 0x12, 0x9b, 0x0a, 0x5c, + 0x1a, 0x54, 0x40, 0x1c, 0x04, 0x28, 0xf9, 0xd3, 0x01, 0xe0, 0x4f, 0xf6, + 0x25, 0x76, 0x2e, 0x60, 0x06, 0xb9, 0xca, 0x46, 0x2e, 0x60, 0x1a, 0x20, + 0x07, 0xe0, 0x01, 0x98, 0x06, 0xf0, 0xe2, 0xf9, 0x06, 0x00, 0x08, 0xbf, + 0xca, 0x46, 0x2e, 0x60, 0x05, 0x20, 0x04, 0x90, 0x0b, 0xe0, 0x20, 0x78, + 0x06, 0xf0, 0xdd, 0xf9, 0x06, 0x00, 0x08, 0xbf, 0xca, 0x46, 0x2e, 0x60, + 0x04, 0x21, 0x04, 0x91, 0x01, 0xe0, 0xcd, 0xf8, 0x38, 0xa0, 0x9d, 0xf8, + 0x0c, 0x00, 0x00, 0x28, 0x13, 0xd0, 0x0e, 0x98, 0x08, 0xb9, 0x05, 0x23, + 0x04, 0xe0, 0xba, 0xf1, 0x00, 0x0f, 0x0c, 0xbf, 0x04, 0x23, 0x00, 0x23, + 0x04, 0x98, 0xbd, 0xf8, 0x0e, 0x10, 0x01, 0x90, 0x00, 0x95, 0x32, 0x46, + 0x05, 0xa8, 0x00, 0xf0, 0xd2, 0xf8, 0x07, 0x46, 0x00, 0x2f, 0x3e, 0xf4, + 0xc8, 0xad, 0x01, 0x22, 0x39, 0x46, 0xfe, 0xf7, 0xc2, 0xbd, 0x00, 0x00, + 0x44, 0x8c, 0x04, 0x01, 0x53, 0x45, 0x54, 0x5f, 0x4f, 0x52, 0x58, 0x5f, + 0x4e, 0x43, 0x4f, 0x3a, 0x20, 0x6e, 0x63, 0x6f, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x2b, 0xfa, 0x06, 0xf0, + 0xc0, 0x07, 0x70, 0x47, 0x9d, 0xf8, 0x49, 0x00, 0x02, 0x99, 0x88, 0xf8, + 0x8a, 0x01, 0x13, 0x98, 0x08, 0x60, 0x00, 0x99, 0x14, 0x98, 0x08, 0x60, + 0x70, 0x47, 0x00, 0xea, 0x06, 0x0b, 0xa5, 0xf8, 0x04, 0xa0, 0x00, 0x26, + 0x70, 0x47, 0x28, 0x79, 0x6b, 0x79, 0x8d, 0xf8, 0x48, 0x70, 0x09, 0xfa, + 0x06, 0xf2, 0x10, 0x43, 0x19, 0x43, 0x28, 0x71, 0x69, 0x71, 0xf0, 0xb2, + 0x12, 0xa9, 0x70, 0x47, 0x62, 0x78, 0x09, 0xfa, 0x07, 0xf1, 0x0a, 0x42, + 0x70, 0x47, 0xd4, 0xf8, 0x03, 0x30, 0xd4, 0xf8, 0x07, 0x20, 0xcd, 0xf8, + 0x00, 0x90, 0x70, 0x47, 0x76, 0x1c, 0xf0, 0xb2, 0x08, 0x28, 0x70, 0x47, + 0xa0, 0x78, 0x8d, 0xf8, 0x02, 0x00, 0xe0, 0x78, 0x8d, 0xf8, 0x03, 0x00, + 0x68, 0x46, 0x70, 0x47, 0x21, 0x78, 0x01, 0xb1, 0x01, 0x21, 0xd4, 0xf8, + 0x01, 0x00, 0x70, 0x47, 0xd4, 0xf8, 0x0d, 0x00, 0xc0, 0xb2, 0xfe, 0xf7, + 0x7b, 0xbc, 0xd4, 0xf8, 0x05, 0x10, 0x00, 0x96, 0x04, 0xab, 0x01, 0x9a, + 0x70, 0x47, 0x4f, 0xf4, 0x7f, 0x72, 0x04, 0x92, 0xc5, 0xf8, 0x00, 0xa0, + 0x70, 0x47, 0x20, 0x78, 0xe1, 0xf7, 0xe4, 0xbc, 0x20, 0x78, 0xfd, 0xf7, + 0xa5, 0xbe, 0x20, 0x68, 0x32, 0x46, 0x04, 0xf0, 0xfe, 0xb8, 0xff, 0x21, + 0x03, 0x20, 0xe3, 0xf7, 0x3e, 0xbc, 0xff, 0x21, 0x03, 0x20, 0xe3, 0xf7, + 0x3a, 0xbc, 0x20, 0x78, 0x01, 0x22, 0x01, 0x21, 0x05, 0xf0, 0xc0, 0xb9, + 0x00, 0x21, 0x29, 0x60, 0xca, 0x46, 0x00, 0x26, 0x70, 0x47, 0x00, 0x20, + 0x28, 0x60, 0xca, 0x46, 0x00, 0x26, 0x70, 0x47, 0xd4, 0xf8, 0x03, 0x00, + 0x02, 0x90, 0x69, 0x71, 0x69, 0x46, 0x28, 0x79, 0x10, 0x43, 0x28, 0x71, + 0xf0, 0xb2, 0x70, 0x47, 0x4f, 0xf4, 0x7a, 0x72, 0x00, 0x23, 0xd4, 0xf8, + 0x01, 0x00, 0xd4, 0xf8, 0x05, 0x10, 0xe7, 0xf7, 0x05, 0xbe, 0xd4, 0xf8, + 0x06, 0x00, 0x22, 0x68, 0x04, 0xf1, 0x0c, 0x01, 0x02, 0x91, 0x63, 0x89, + 0x06, 0x99, 0x01, 0x93, 0x00, 0x90, 0xa3, 0x88, 0x9d, 0xf8, 0x14, 0x00, + 0x70, 0x47, 0x01, 0x20, 0xf0, 0xf7, 0x7e, 0xbf, 0x28, 0x60, 0x00, 0xb9, + 0xca, 0x46, 0x06, 0x46, 0x70, 0x47, 0xf0, 0xb5, 0x85, 0xb0, 0x00, 0x22, + 0x00, 0x23, 0x00, 0x92, 0x8d, 0xf8, 0x04, 0x30, 0x02, 0xac, 0x90, 0xe8, + 0xe0, 0x00, 0x84, 0xe8, 0xe0, 0x00, 0xa3, 0x4c, 0x20, 0x68, 0x6a, 0x46, + 0x01, 0xa9, 0xf2, 0xf7, 0x1c, 0xff, 0x00, 0x98, 0x38, 0xb1, 0xa0, 0x48, + 0x4f, 0xf0, 0x80, 0x51, 0x01, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, + 0x6f, 0x8f, 0x05, 0xb0, 0xf0, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x06, 0x46, + 0x90, 0x46, 0x0b, 0x9a, 0x34, 0x78, 0x75, 0x68, 0x90, 0x1d, 0x08, 0x2c, + 0x89, 0x46, 0x9a, 0x46, 0x2e, 0xda, 0x96, 0x49, 0x51, 0xf8, 0x34, 0x30, + 0x9d, 0x42, 0x26, 0xd2, 0x09, 0x1d, 0x51, 0xf8, 0x34, 0x30, 0x03, 0xeb, + 0x05, 0x17, 0x79, 0x68, 0x81, 0x42, 0x1b, 0xd3, 0x38, 0x68, 0x79, 0x89, + 0x01, 0x80, 0xbb, 0x89, 0x43, 0x80, 0xa0, 0xf8, 0x04, 0xa0, 0x80, 0x1d, + 0x0a, 0x99, 0xd5, 0xf7, 0x1b, 0xfa, 0xbf, 0xf3, 0x5f, 0x8f, 0x06, 0x20, + 0xed, 0xf7, 0xc4, 0xfb, 0x83, 0x46, 0x00, 0x20, 0x38, 0x72, 0x29, 0x46, + 0x20, 0x46, 0xf0, 0xf7, 0x90, 0xfb, 0x58, 0x46, 0x80, 0xf3, 0x11, 0x88, + 0x00, 0x24, 0x07, 0xe0, 0x4f, 0xf6, 0x07, 0x74, 0x04, 0xe0, 0x4f, 0xf6, + 0x05, 0x74, 0x01, 0xe0, 0x4f, 0xf6, 0x04, 0x74, 0x7b, 0x4d, 0xa8, 0x68, + 0x4f, 0xf0, 0xff, 0x31, 0xf2, 0xf7, 0x98, 0xff, 0x01, 0x28, 0x2a, 0xd1, + 0x7a, 0x48, 0x41, 0x78, 0x33, 0x78, 0x00, 0xeb, 0x01, 0x12, 0xc2, 0xf8, + 0xc4, 0x30, 0x41, 0x78, 0x00, 0xeb, 0x01, 0x12, 0x71, 0x68, 0xc2, 0xf8, + 0xc8, 0x10, 0x42, 0x78, 0x00, 0xeb, 0x02, 0x13, 0xa3, 0xf8, 0xce, 0xa0, + 0x41, 0x78, 0x00, 0xeb, 0x01, 0x12, 0xc2, 0xf8, 0xd0, 0x80, 0x41, 0x78, + 0x00, 0xeb, 0x01, 0x12, 0xa2, 0xf8, 0xcc, 0x90, 0x41, 0x78, 0x49, 0x1c, + 0x41, 0x70, 0xc9, 0xb2, 0x0c, 0x29, 0x24, 0xbf, 0x00, 0x21, 0x41, 0x70, + 0xa8, 0x68, 0x00, 0x23, 0x00, 0x22, 0x00, 0x21, 0xf2, 0xf7, 0x1f, 0xfe, + 0x04, 0xe0, 0x00, 0x22, 0x4f, 0xf6, 0x70, 0x71, 0xff, 0xf7, 0x65, 0xff, + 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x8f, 0x1f, 0xb5, 0x00, 0xf0, 0x29, 0xf8, + 0x0c, 0xbf, 0x00, 0x23, 0x04, 0x23, 0x1b, 0xe0, 0x7f, 0xb5, 0x00, 0xf0, + 0x3d, 0xf8, 0x00, 0xf0, 0x36, 0xf8, 0x0c, 0xbf, 0x00, 0x23, 0x04, 0x23, + 0x29, 0xe0, 0x7f, 0xb5, 0x00, 0xf0, 0x34, 0xf8, 0x00, 0xf0, 0x2d, 0xf8, + 0x0c, 0xbf, 0x00, 0x23, 0x04, 0x23, 0x80, 0x1d, 0x01, 0x90, 0x22, 0x46, + 0x25, 0x21, 0x20, 0xe0, 0x1f, 0xb5, 0x00, 0xf0, 0x0c, 0xf8, 0x0c, 0xbf, + 0x00, 0x23, 0x04, 0x23, 0x00, 0x90, 0x02, 0x60, 0x04, 0x24, 0x01, 0x94, + 0x21, 0x21, 0x02, 0xa8, 0xff, 0xf7, 0x5d, 0xff, 0x1f, 0xbd, 0x8d, 0xf8, + 0x08, 0x00, 0x1a, 0x00, 0x4a, 0x48, 0x03, 0x91, 0x70, 0x47, 0x7f, 0xb5, + 0x00, 0xf0, 0x12, 0xf8, 0x00, 0xf0, 0x0b, 0xf8, 0x0c, 0xbf, 0x00, 0x23, + 0x04, 0x23, 0x80, 0x1d, 0x01, 0x90, 0x22, 0x46, 0x23, 0x21, 0x02, 0xa8, + 0xff, 0xf7, 0x47, 0xff, 0x7f, 0xbd, 0x00, 0x2c, 0xb5, 0xf8, 0x88, 0x01, + 0x00, 0x96, 0x70, 0x47, 0x09, 0x9a, 0x3d, 0x4d, 0x03, 0x91, 0x8d, 0xf8, + 0x08, 0x00, 0x05, 0xf5, 0xc2, 0x76, 0x1c, 0x46, 0xa5, 0xf8, 0x88, 0x21, + 0x34, 0x60, 0x05, 0xf5, 0xc5, 0x70, 0x08, 0x99, 0xd5, 0xf7, 0x70, 0xb9, + 0x7f, 0xb5, 0xff, 0xf7, 0xed, 0xff, 0xff, 0xf7, 0xe6, 0xff, 0x0c, 0xbf, + 0x00, 0x23, 0x04, 0x23, 0x80, 0x1d, 0x01, 0x90, 0x22, 0x46, 0x25, 0x21, + 0xd9, 0xe7, 0x00, 0x00, 0x7c, 0xb5, 0x01, 0x68, 0x00, 0x24, 0x82, 0x29, + 0x30, 0xd0, 0x85, 0x29, 0x23, 0xd0, 0x87, 0x29, 0x2c, 0xd0, 0xbc, 0x29, + 0x0a, 0xd0, 0xc0, 0x29, 0x44, 0xd1, 0xd0, 0xf8, 0x06, 0x10, 0x00, 0xf1, + 0x0c, 0x02, 0x80, 0x88, 0xef, 0xf7, 0xf0, 0xff, 0x04, 0x46, 0x3d, 0xe0, + 0x81, 0x88, 0x01, 0x29, 0x38, 0xd1, 0xd0, 0xf8, 0x06, 0x20, 0xc1, 0x68, + 0xd2, 0xb2, 0x08, 0x2a, 0x08, 0xda, 0x11, 0xf1, 0x01, 0x0f, 0x31, 0xd0, + 0xd0, 0xf8, 0x06, 0x20, 0xd0, 0xb2, 0xeb, 0xf7, 0xcd, 0xfc, 0x2b, 0xe0, + 0x4f, 0xf6, 0x6b, 0x74, 0x28, 0xe0, 0x19, 0x4d, 0x80, 0x88, 0x05, 0xf5, + 0xc5, 0x72, 0x69, 0x46, 0x06, 0xf0, 0x00, 0xf8, 0x00, 0x98, 0xa5, 0xf8, + 0x88, 0x01, 0x1d, 0xe0, 0x81, 0x88, 0x00, 0x25, 0x00, 0x26, 0xca, 0x07, + 0x03, 0xd5, 0x01, 0x25, 0x89, 0x07, 0x48, 0xbf, 0x01, 0x26, 0x01, 0x68, + 0x82, 0x29, 0x31, 0x46, 0x28, 0x46, 0x02, 0xd1, 0xf3, 0xf7, 0xa6, 0xff, + 0x01, 0xe0, 0x04, 0xf0, 0xe5, 0xfa, 0x00, 0x96, 0x4f, 0xea, 0x05, 0x03, + 0x1b, 0xa2, 0xff, 0x21, 0x03, 0x20, 0xe3, 0xf7, 0xb6, 0xfa, 0x01, 0xe0, + 0x4f, 0xf6, 0x6a, 0x74, 0x20, 0x46, 0x76, 0xbd, 0xb4, 0x76, 0x02, 0x20, + 0x4c, 0x46, 0x02, 0x20, 0x04, 0xed, 0x00, 0xe0, 0x04, 0x8c, 0x04, 0x01, + 0xec, 0x28, 0x02, 0x20, 0x70, 0x2a, 0x02, 0x20, 0x70, 0xb5, 0x05, 0x00, + 0x04, 0x46, 0x18, 0xbf, 0x01, 0x25, 0xe3, 0xf7, 0x73, 0xf9, 0x02, 0x2c, + 0x06, 0x46, 0x0b, 0xda, 0x00, 0x24, 0x26, 0xfa, 0x04, 0xf0, 0xc0, 0x07, + 0x03, 0xd5, 0x29, 0x46, 0x20, 0x46, 0x07, 0xf0, 0x03, 0xfe, 0x64, 0x1c, + 0x08, 0x2c, 0xf4, 0xd3, 0x70, 0xbd, 0x00, 0x00, 0x45, 0x46, 0x55, 0x53, + 0x45, 0x5f, 0x47, 0x45, 0x54, 0x5b, 0x25, 0x58, 0x5d, 0x20, 0x30, 0x78, + 0x25, 0x78, 0x0a, 0x00, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x20, 0x25, 0x64, + 0x2c, 0x20, 0x50, 0x61, 0x73, 0x73, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, + 0x00, 0x78, 0x02, 0x40, 0xca, 0x40, 0xd0, 0xb2, 0x70, 0x47, 0x30, 0xb5, + 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, + 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, + 0x30, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0x2d, 0xed, 0x10, 0x8a, + 0xdf, 0xf8, 0xe8, 0x43, 0xe2, 0xf7, 0xa3, 0xf9, 0x54, 0xf8, 0x20, 0x00, + 0xdf, 0xf8, 0xe0, 0x33, 0x4f, 0xf0, 0xff, 0x32, 0x00, 0x21, 0xff, 0xf7, + 0xe0, 0xff, 0xdf, 0xf8, 0xd8, 0x43, 0x4f, 0xf0, 0x11, 0x30, 0x20, 0x60, + 0x00, 0xf0, 0x54, 0xf8, 0xe2, 0xf7, 0x91, 0xf9, 0x60, 0xb9, 0xdf, 0xf8, + 0xc8, 0x53, 0x1f, 0x20, 0x28, 0x60, 0x01, 0x26, 0x30, 0x46, 0xed, 0xf7, + 0x5f, 0xfe, 0x45, 0xf8, 0x26, 0x00, 0x76, 0x1c, 0x1f, 0x2e, 0xf7, 0xd9, + 0xe2, 0xf7, 0x81, 0xf9, 0xdf, 0xf8, 0xac, 0x53, 0x29, 0x46, 0xf0, 0xf7, + 0xff, 0xfd, 0x28, 0x78, 0x20, 0xb9, 0xe2, 0xf7, 0x78, 0xf9, 0x18, 0x21, + 0xf0, 0xf7, 0xe3, 0xfd, 0x3a, 0x20, 0xef, 0xf7, 0xe8, 0xfb, 0xe2, 0xf7, + 0x70, 0xf9, 0x20, 0xb9, 0xdf, 0xf8, 0x8c, 0x13, 0x3f, 0x20, 0x08, 0x60, + 0x03, 0xe0, 0xdf, 0xf8, 0x88, 0x03, 0x3f, 0x22, 0x02, 0x60, 0x00, 0x21, + 0xdf, 0xf8, 0x80, 0x03, 0x41, 0x60, 0x81, 0x60, 0xc1, 0x60, 0x01, 0x61, + 0x01, 0x23, 0x03, 0x22, 0xff, 0xf7, 0xa1, 0xff, 0xe2, 0xf7, 0x59, 0xf9, + 0x18, 0xb9, 0xdf, 0xf8, 0x6c, 0x13, 0x08, 0x60, 0x02, 0xe0, 0xda, 0x48, + 0x00, 0x22, 0x02, 0x60, 0xe2, 0xf7, 0x4f, 0xf9, 0xd8, 0x4d, 0x20, 0xb9, + 0x28, 0x78, 0x40, 0xf0, 0x01, 0x00, 0x28, 0x70, 0x03, 0xe0, 0x68, 0x78, + 0x40, 0xf0, 0x01, 0x00, 0x68, 0x70, 0x4f, 0xf0, 0x33, 0x30, 0x20, 0x60, + 0x30, 0xbf, 0xfd, 0xe7, 0x2d, 0xe9, 0xf0, 0x4f, 0x2d, 0xed, 0x10, 0x8a, + 0xcf, 0x4c, 0xef, 0xf3, 0x10, 0x80, 0x20, 0x60, 0xef, 0xf3, 0x13, 0x80, + 0x60, 0x60, 0xef, 0xf3, 0x11, 0x80, 0xa0, 0x60, 0xef, 0xf3, 0x14, 0x80, + 0xe0, 0x60, 0xef, 0xf3, 0x08, 0x80, 0x20, 0x61, 0xef, 0xf3, 0x09, 0x80, + 0xc7, 0x49, 0x60, 0x61, 0x00, 0x20, 0x51, 0xf8, 0x20, 0x20, 0x04, 0xeb, + 0x80, 0x03, 0x40, 0x1c, 0x08, 0x28, 0x9a, 0x61, 0xf7, 0xd3, 0x00, 0x20, + 0xc2, 0x49, 0x51, 0xf8, 0x20, 0x20, 0x04, 0xeb, 0x80, 0x03, 0x40, 0x1c, + 0x08, 0x28, 0x9a, 0x63, 0xf7, 0xd3, 0xbf, 0x49, 0x00, 0x20, 0x51, 0xf8, + 0x20, 0x20, 0x04, 0xeb, 0x80, 0x03, 0x40, 0x1c, 0x08, 0x28, 0x9a, 0x65, + 0xf7, 0xd3, 0x00, 0x20, 0xba, 0x49, 0x51, 0xf8, 0x20, 0x20, 0x04, 0xeb, + 0x80, 0x03, 0x40, 0x1c, 0x08, 0x28, 0x9a, 0x67, 0xf7, 0xd3, 0xb7, 0x49, + 0x00, 0x20, 0x51, 0xf8, 0x20, 0x20, 0x04, 0xeb, 0x80, 0x03, 0x40, 0x1c, + 0x08, 0x28, 0xc3, 0xf8, 0x98, 0x20, 0xf6, 0xd3, 0x00, 0x20, 0xb2, 0x49, + 0x0a, 0x5c, 0x23, 0x18, 0x40, 0x1c, 0xf0, 0x28, 0x83, 0xf8, 0xb8, 0x20, + 0xf8, 0xd3, 0xaf, 0x49, 0x0a, 0x68, 0x04, 0xf5, 0xd4, 0x70, 0x02, 0x60, + 0x4b, 0x68, 0x43, 0x60, 0x8a, 0x68, 0x82, 0x60, 0xcb, 0x68, 0xc3, 0x60, + 0x0a, 0x69, 0x02, 0x61, 0x00, 0x22, 0x4b, 0x69, 0x43, 0x61, 0xa8, 0x4b, + 0x9d, 0x5c, 0xa6, 0x18, 0x52, 0x1c, 0x0c, 0x2a, 0x86, 0xf8, 0xc0, 0x51, + 0xf8, 0xd3, 0x4a, 0x6a, 0x42, 0x62, 0x8b, 0x6a, 0x83, 0x62, 0xca, 0x6a, + 0xc2, 0x62, 0x0b, 0x6b, 0x03, 0x63, 0x4a, 0x6b, 0x42, 0x63, 0x8b, 0x6b, + 0x83, 0x63, 0xca, 0x6b, 0xc2, 0x63, 0x0a, 0x6c, 0x02, 0x64, 0x4a, 0x6c, + 0x42, 0x64, 0x8a, 0x6c, 0x82, 0x64, 0xc9, 0x6c, 0x9a, 0x4a, 0xc1, 0x64, + 0x00, 0x21, 0x52, 0xf8, 0x21, 0x30, 0x04, 0xeb, 0x81, 0x05, 0x49, 0x1c, + 0x04, 0x29, 0xc5, 0xf8, 0xf8, 0x31, 0xf6, 0xd3, 0x00, 0x21, 0x95, 0x4a, + 0x52, 0xf8, 0x21, 0x30, 0x04, 0xeb, 0x81, 0x05, 0x49, 0x1c, 0x04, 0x29, + 0xc5, 0xf8, 0x08, 0x32, 0xf6, 0xd9, 0x91, 0x49, 0x91, 0x4e, 0x0a, 0x68, + 0x91, 0x49, 0x42, 0x67, 0x04, 0xf2, 0x96, 0x25, 0x0b, 0x68, 0x83, 0x67, + 0x4a, 0x68, 0xc2, 0x67, 0x04, 0xf5, 0x0a, 0x70, 0x8a, 0x68, 0x02, 0x60, + 0xc9, 0x68, 0x41, 0x60, 0x8b, 0x49, 0x0a, 0x68, 0x82, 0x60, 0x4b, 0x68, + 0xc3, 0x60, 0x8a, 0x68, 0x02, 0x61, 0xcb, 0x68, 0x43, 0x61, 0x09, 0x69, + 0x81, 0x61, 0x87, 0x49, 0x0a, 0x78, 0x02, 0x77, 0x4b, 0x78, 0x43, 0x77, + 0x8a, 0x78, 0x82, 0x77, 0x0b, 0x7a, 0xc3, 0x77, 0x04, 0xf5, 0x12, 0x70, + 0x4a, 0x7a, 0x02, 0x70, 0x20, 0x22, 0x89, 0x7a, 0x41, 0x70, 0x80, 0x48, + 0x01, 0x68, 0x80, 0x48, 0xc4, 0xf8, 0x4a, 0x12, 0x01, 0x68, 0x7f, 0x48, + 0xc4, 0xf8, 0x4e, 0x12, 0x01, 0x68, 0x7e, 0x48, 0xc4, 0xf8, 0x52, 0x12, + 0x01, 0x68, 0x7d, 0x48, 0xc4, 0xf8, 0x56, 0x12, 0x01, 0x68, 0x7c, 0x48, + 0xc4, 0xf8, 0x5a, 0x12, 0x01, 0x68, 0x7b, 0x48, 0xc4, 0xf8, 0x5e, 0x12, + 0x01, 0x68, 0x7a, 0x48, 0xc4, 0xf8, 0x62, 0x12, 0x01, 0x68, 0x79, 0x48, + 0xc4, 0xf8, 0x66, 0x12, 0x01, 0x68, 0x78, 0x48, 0xc4, 0xf8, 0x6a, 0x12, + 0x01, 0x68, 0x77, 0x48, 0xc4, 0xf8, 0x6e, 0x12, 0x01, 0x68, 0x76, 0x48, + 0xc4, 0xf8, 0x72, 0x12, 0x01, 0x68, 0x75, 0x48, 0xc4, 0xf8, 0x76, 0x12, + 0x01, 0x68, 0x74, 0x48, 0xc4, 0xf8, 0x7a, 0x12, 0x01, 0x68, 0x73, 0x48, + 0xc4, 0xf8, 0x7e, 0x12, 0x01, 0x68, 0x72, 0x48, 0xc4, 0xf8, 0x82, 0x12, + 0x01, 0x68, 0x71, 0x48, 0xc4, 0xf8, 0x86, 0x12, 0x01, 0x68, 0x70, 0x48, + 0xc4, 0xf8, 0x8a, 0x12, 0x01, 0x68, 0x6f, 0x48, 0xc4, 0xf8, 0x8e, 0x12, + 0x01, 0x68, 0xc4, 0xf8, 0x92, 0x12, 0x05, 0x21, 0x30, 0x68, 0x26, 0x30, + 0xff, 0xf7, 0x6c, 0xfe, 0x28, 0x70, 0x20, 0x22, 0x70, 0x68, 0x05, 0x21, + 0x26, 0x30, 0xff, 0xf7, 0x65, 0xfe, 0x68, 0x70, 0x20, 0x22, 0xb0, 0x68, + 0x05, 0x21, 0x26, 0x30, 0xff, 0xf7, 0x5e, 0xfe, 0xa8, 0x70, 0x20, 0x22, + 0xf0, 0x68, 0x05, 0x21, 0x26, 0x30, 0xff, 0xf7, 0x57, 0xfe, 0xe8, 0x70, + 0x00, 0x20, 0xe2, 0xf7, 0x2f, 0xfc, 0x0a, 0x21, 0x90, 0xfb, 0xf1, 0xf0, + 0xa8, 0x80, 0x01, 0x20, 0xe2, 0xf7, 0x28, 0xfc, 0x0a, 0x21, 0x90, 0xfb, + 0xf1, 0xf0, 0xe8, 0x80, 0x02, 0x20, 0xe2, 0xf7, 0x21, 0xfc, 0x0a, 0x21, + 0x90, 0xfb, 0xf1, 0xf0, 0x28, 0x81, 0x03, 0x20, 0xe2, 0xf7, 0x1a, 0xfc, + 0x0a, 0x21, 0x90, 0xfb, 0xf1, 0xf0, 0x68, 0x81, 0x04, 0x20, 0xe2, 0xf7, + 0x13, 0xfc, 0x0a, 0x21, 0x90, 0xfb, 0xf1, 0xf0, 0xa8, 0x81, 0x05, 0x20, + 0xe2, 0xf7, 0x0c, 0xfc, 0x0a, 0x21, 0x90, 0xfb, 0xf1, 0xf0, 0xe8, 0x81, + 0x06, 0x20, 0xe2, 0xf7, 0x05, 0xfc, 0x0a, 0x21, 0x90, 0xfb, 0xf1, 0xf0, + 0x28, 0x82, 0x07, 0x20, 0xe2, 0xf7, 0xfe, 0xfb, 0x0a, 0x21, 0x90, 0xfb, + 0xf1, 0xf0, 0x68, 0x82, 0x08, 0x20, 0xe2, 0xf7, 0xf7, 0xfb, 0x0a, 0x21, + 0x90, 0xfb, 0xf1, 0xf0, 0xa8, 0x82, 0x09, 0x20, 0xe2, 0xf7, 0xf0, 0xfb, + 0x0a, 0x21, 0x90, 0xfb, 0xf1, 0xf0, 0xe8, 0x82, 0x0a, 0x20, 0xe2, 0xf7, + 0xe9, 0xfb, 0x0a, 0x21, 0x90, 0xfb, 0xf1, 0xf0, 0x28, 0x83, 0x0b, 0x20, + 0xe2, 0xf7, 0xe2, 0xfb, 0x0a, 0x21, 0x90, 0xfb, 0xf1, 0xf0, 0x0b, 0x4a, + 0x68, 0x83, 0xc4, 0xf8, 0xb2, 0x22, 0xbd, 0xec, 0x10, 0x8a, 0xbd, 0xe8, + 0xf0, 0x4f, 0x70, 0x47, 0x28, 0xb9, 0x31, 0x49, 0x4f, 0xf0, 0x00, 0x40, + 0x08, 0x60, 0x30, 0xbf, 0xfd, 0xe7, 0x70, 0x47, 0x98, 0x9d, 0x04, 0x01, + 0x00, 0x00, 0xab, 0xab, 0x98, 0x03, 0x00, 0x01, 0xcc, 0x69, 0x02, 0x20, + 0xa9, 0x77, 0x02, 0x20, 0x00, 0x00, 0x70, 0x41, 0x00, 0x00, 0x70, 0x44, + 0x00, 0x00, 0x40, 0x46, 0x04, 0x00, 0x00, 0x41, 0x04, 0x00, 0x00, 0x44, + 0x43, 0x01, 0x00, 0x47, 0xf4, 0x40, 0x02, 0x20, 0x00, 0xe1, 0x00, 0xe0, + 0x80, 0xe1, 0x00, 0xe0, 0x00, 0xe2, 0x00, 0xe0, 0x80, 0xe2, 0x00, 0xe0, + 0x00, 0xe3, 0x00, 0xe0, 0x00, 0xe4, 0x00, 0xe0, 0x00, 0xed, 0x00, 0xe0, + 0x18, 0xed, 0x00, 0xe0, 0x50, 0xed, 0x00, 0xe0, 0x60, 0xed, 0x00, 0xe0, + 0x88, 0xed, 0x00, 0xe0, 0x30, 0x9c, 0x04, 0x01, 0x10, 0xe0, 0x00, 0xe0, + 0x34, 0xef, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x47, 0x00, 0x00, 0xb0, 0x46, + 0x00, 0x20, 0x82, 0x60, 0x00, 0x20, 0x92, 0x60, 0x00, 0x20, 0xa2, 0x60, + 0x00, 0x20, 0xb2, 0x60, 0x00, 0x20, 0xc2, 0x60, 0x00, 0x20, 0xd2, 0x60, + 0x00, 0x20, 0xe2, 0x60, 0x00, 0x20, 0xf2, 0x60, 0x00, 0x20, 0x02, 0x60, + 0x00, 0x20, 0x12, 0x60, 0x00, 0x20, 0x22, 0x60, 0x00, 0x20, 0x32, 0x60, + 0x00, 0x20, 0x42, 0x60, 0x00, 0x20, 0x52, 0x60, 0x00, 0x20, 0x62, 0x60, + 0x00, 0x20, 0x72, 0x60, 0x00, 0x20, 0x02, 0x61, 0x00, 0x20, 0x12, 0x61, + 0x04, 0xed, 0x00, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x02, 0x46, 0x00, 0x20, + 0x02, 0x29, 0x00, 0xdb, 0x70, 0x47, 0x30, 0xb5, 0x1c, 0x4b, 0x1c, 0x68, + 0x22, 0x44, 0xed, 0x23, 0x92, 0xf8, 0xbc, 0x50, 0x5d, 0x43, 0x32, 0x22, + 0x63, 0x19, 0x51, 0x43, 0x19, 0x44, 0x91, 0xf8, 0x77, 0x44, 0x01, 0x2c, + 0x08, 0xbf, 0x01, 0x20, 0x30, 0xbd, 0x38, 0xb5, 0x04, 0x46, 0x00, 0x21, + 0xff, 0xf7, 0xe4, 0xff, 0x00, 0x25, 0x28, 0xb9, 0x01, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0xde, 0xff, 0x00, 0xb1, 0x01, 0x25, 0x28, 0x46, 0x32, 0xbd, + 0x70, 0xb5, 0x14, 0x46, 0x0c, 0x4a, 0x02, 0xeb, 0xc0, 0x00, 0x1d, 0x46, + 0x50, 0xf8, 0x21, 0x60, 0x23, 0x46, 0x4f, 0xf4, 0xe0, 0x02, 0x14, 0x21, + 0x30, 0x46, 0xff, 0xf7, 0xbd, 0xff, 0x01, 0x2c, 0x07, 0xd1, 0x2b, 0x46, + 0x30, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x4f, 0xf4, 0x40, 0x32, 0x10, 0x21, + 0xb2, 0xe7, 0x70, 0xbd, 0xb4, 0x76, 0x02, 0x20, 0xc8, 0x8e, 0x04, 0x01, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x10, 0xb5, 0x90, 0x4b, 0x1c, 0x68, 0x70, 0x22, + 0x50, 0x43, 0x22, 0x18, 0x88, 0x78, 0x02, 0xf5, 0x32, 0x62, 0x18, 0xb9, + 0x50, 0x69, 0x08, 0x61, 0x00, 0x20, 0x02, 0xe0, 0x10, 0x69, 0x08, 0x61, + 0x40, 0x08, 0x48, 0x61, 0x10, 0xbd, 0x88, 0x49, 0x51, 0xf8, 0x20, 0x00, + 0x18, 0x30, 0x00, 0x68, 0x20, 0xf0, 0x7f, 0x40, 0x01, 0x02, 0x48, 0xbf, + 0x40, 0xf0, 0x7f, 0x40, 0x70, 0x47, 0x82, 0x49, 0x51, 0xf8, 0x20, 0x00, + 0xec, 0x30, 0x00, 0x68, 0x20, 0xf0, 0x7f, 0x40, 0x01, 0x02, 0x48, 0xbf, + 0x40, 0xf0, 0x7f, 0x40, 0x70, 0x47, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x4b, + 0x81, 0x46, 0x0d, 0x46, 0xe2, 0xf7, 0x8b, 0xfe, 0x04, 0x46, 0x38, 0x21, + 0xaa, 0x78, 0x78, 0x4f, 0x61, 0x43, 0x1c, 0x20, 0x79, 0x18, 0x42, 0x43, + 0x88, 0x18, 0x06, 0x1d, 0x00, 0xf1, 0x3c, 0x08, 0x30, 0x46, 0x29, 0x46, + 0x00, 0xf0, 0x9d, 0xf8, 0x28, 0x78, 0x07, 0xeb, 0x44, 0x07, 0x58, 0xb9, + 0x00, 0x21, 0x71, 0x60, 0xb1, 0x60, 0x28, 0x7e, 0x30, 0xb9, 0xa9, 0x78, + 0x78, 0x5c, 0x18, 0xb1, 0x30, 0x46, 0x41, 0x46, 0x00, 0xf0, 0x8d, 0xf8, + 0x31, 0x46, 0x48, 0x46, 0xff, 0xf7, 0xaa, 0xff, 0x30, 0x78, 0x00, 0x24, + 0x40, 0xb1, 0xb0, 0x78, 0x01, 0x28, 0x05, 0xd1, 0x71, 0x69, 0x70, 0x68, + 0x02, 0xf0, 0x22, 0xfa, 0x04, 0x00, 0x4b, 0xd1, 0x60, 0x48, 0x50, 0xf8, + 0x29, 0x90, 0xb0, 0x78, 0x73, 0x68, 0x00, 0x28, 0x09, 0xf1, 0xe8, 0x0b, + 0x6f, 0xf0, 0x7f, 0x42, 0x0b, 0xd1, 0x00, 0x21, 0x09, 0xf1, 0x18, 0x00, + 0xff, 0xf7, 0x80, 0xff, 0x01, 0x23, 0x4f, 0xf0, 0x00, 0x52, 0x1d, 0x21, + 0x09, 0xf1, 0x14, 0x00, 0x08, 0xe0, 0x00, 0x21, 0x09, 0xf1, 0xec, 0x00, + 0xff, 0xf7, 0x74, 0xff, 0x01, 0x23, 0x08, 0x22, 0x03, 0x21, 0x58, 0x46, + 0xff, 0xf7, 0x6e, 0xff, 0x96, 0xed, 0x02, 0x0a, 0xb8, 0xee, 0x40, 0x0a, + 0xdf, 0xed, 0x4a, 0x0a, 0x60, 0xee, 0x20, 0x0a, 0x9f, 0xed, 0x49, 0x1a, + 0xb1, 0x78, 0x4c, 0x4a, 0x80, 0xee, 0x81, 0x1a, 0xbc, 0xee, 0xc1, 0x0a, + 0x01, 0x29, 0x10, 0xee, 0x10, 0x3a, 0x07, 0xbf, 0x10, 0x21, 0x09, 0xf1, + 0xf4, 0x00, 0x10, 0x21, 0x09, 0xf1, 0x20, 0x00, 0xff, 0xf7, 0x52, 0xff, + 0xb1, 0x78, 0x29, 0xb9, 0x01, 0x23, 0x10, 0x22, 0x04, 0x21, 0x09, 0xf1, + 0x04, 0x00, 0x03, 0xe0, 0x33, 0x78, 0x02, 0x22, 0x01, 0x21, 0x58, 0x46, + 0xff, 0xf7, 0x44, 0xff, 0x28, 0x7e, 0x01, 0x28, 0x06, 0xd1, 0x40, 0x46, + 0x31, 0x46, 0x00, 0xf0, 0x2a, 0xf8, 0xa8, 0x78, 0x01, 0x21, 0x39, 0x54, + 0x20, 0x46, 0xbd, 0xe8, 0xf0, 0x8b, 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, + 0xe2, 0xf7, 0xfd, 0xfd, 0x01, 0x46, 0x38, 0x22, 0xa8, 0x78, 0x31, 0x4b, + 0x51, 0x43, 0x5a, 0x18, 0x06, 0x46, 0x1c, 0x21, 0x4e, 0x43, 0x91, 0x19, + 0x0e, 0x1d, 0x21, 0x46, 0x00, 0xf0, 0x14, 0xf8, 0x30, 0x70, 0xa8, 0x78, + 0x00, 0x28, 0x20, 0x46, 0x02, 0xd1, 0xff, 0xf7, 0x3e, 0xff, 0x01, 0xe0, + 0xff, 0xf7, 0x47, 0xff, 0x70, 0x60, 0x31, 0x46, 0x28, 0x46, 0x00, 0xf0, + 0x02, 0xf8, 0x00, 0x20, 0x70, 0xbd, 0x1c, 0x22, 0xd4, 0xf7, 0x36, 0xbd, + 0x20, 0x4a, 0x52, 0xf8, 0x21, 0x10, 0x20, 0xb9, 0x51, 0xf8, 0x04, 0x0f, + 0xc0, 0xf3, 0x00, 0x10, 0x70, 0x47, 0x51, 0xf8, 0xe8, 0x0f, 0xc0, 0xf3, + 0x40, 0x00, 0x70, 0x47, 0x18, 0xb5, 0x87, 0xb0, 0x01, 0x22, 0x0c, 0x46, + 0x8d, 0xf8, 0x02, 0x20, 0x69, 0x46, 0xff, 0xf7, 0x07, 0xff, 0x05, 0x99, + 0x20, 0x46, 0x02, 0xf0, 0x85, 0xf9, 0x08, 0xb0, 0x10, 0xbd, 0x15, 0x4b, + 0x18, 0x70, 0x59, 0x70, 0x08, 0x12, 0x98, 0x70, 0x09, 0x14, 0xd9, 0x70, + 0x1a, 0x71, 0x10, 0x12, 0x58, 0x71, 0x12, 0x14, 0x9a, 0x71, 0x70, 0x47, + 0x1c, 0xb5, 0x04, 0x46, 0x08, 0x46, 0x6a, 0x46, 0x0d, 0xf1, 0x01, 0x01, + 0xf1, 0xf7, 0x88, 0xff, 0x0a, 0x48, 0x04, 0x70, 0x9d, 0xf8, 0x01, 0x10, + 0x41, 0x70, 0x9d, 0xf8, 0x00, 0x20, 0x82, 0x70, 0x13, 0xbd, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, 0xb4, 0x43, 0xb4, 0x76, 0x02, 0x20, + 0xcc, 0x9d, 0x04, 0x01, 0x4c, 0x6b, 0x02, 0x20, 0x00, 0x00, 0xff, 0xff, + 0x23, 0x02, 0x00, 0x47, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x2d, 0xe9, 0xf8, 0x4e, + 0x0f, 0x46, 0x89, 0xb0, 0x83, 0x46, 0x78, 0x78, 0xdf, 0xf8, 0xf8, 0xa2, + 0xdf, 0xf8, 0xf8, 0x92, 0x00, 0x90, 0x58, 0x46, 0xba, 0x78, 0x02, 0x92, + 0xe2, 0xf7, 0x6a, 0xfd, 0x00, 0x9a, 0x1c, 0x21, 0x4a, 0x43, 0x04, 0x46, + 0x70, 0x23, 0x02, 0x99, 0x63, 0x43, 0x38, 0x20, 0x41, 0x43, 0x0a, 0xeb, + 0x03, 0x05, 0x4b, 0x44, 0x0d, 0x44, 0x19, 0x44, 0x15, 0x44, 0x11, 0x44, + 0x01, 0xf1, 0x10, 0x02, 0x01, 0x92, 0x28, 0x46, 0x3e, 0x78, 0x39, 0x46, + 0x00, 0xf0, 0x55, 0xf9, 0x02, 0x99, 0x09, 0xeb, 0x84, 0x00, 0x00, 0xeb, + 0x41, 0x07, 0x28, 0x78, 0x88, 0xb9, 0x00, 0x21, 0x69, 0x60, 0xa8, 0x60, + 0x08, 0x21, 0x28, 0x7e, 0x29, 0x73, 0x69, 0x73, 0x00, 0x28, 0x02, 0xbf, + 0x00, 0x98, 0x39, 0x5c, 0x01, 0x29, 0x04, 0xd1, 0x01, 0x99, 0x00, 0xf0, + 0x3d, 0xf9, 0x00, 0x20, 0x28, 0x76, 0x58, 0x46, 0xe2, 0xf7, 0x36, 0xfd, + 0x04, 0x46, 0xa8, 0x78, 0x8d, 0xf8, 0x0a, 0x00, 0x02, 0xa9, 0x58, 0x46, + 0x00, 0xf0, 0x16, 0xfa, 0x9d, 0x49, 0x09, 0x68, 0x01, 0xeb, 0x0b, 0x03, + 0xed, 0x22, 0x93, 0xf8, 0xbc, 0xc0, 0xab, 0x78, 0x12, 0xfb, 0x0c, 0xfc, + 0x01, 0xeb, 0x0c, 0x02, 0x32, 0x21, 0x4b, 0x43, 0xd2, 0x18, 0xd2, 0xf8, + 0x69, 0x14, 0x29, 0x61, 0x49, 0x08, 0x00, 0x28, 0x69, 0x61, 0x49, 0xd1, + 0x70, 0x22, 0xa9, 0x78, 0x54, 0x43, 0x0a, 0xeb, 0x04, 0x02, 0x0c, 0x46, + 0x38, 0x23, 0x5c, 0x43, 0x13, 0x19, 0x6a, 0x78, 0x82, 0xf0, 0x01, 0x0c, + 0x1c, 0x22, 0x12, 0xfb, 0x0c, 0xfc, 0x01, 0x2e, 0x13, 0xf8, 0x0c, 0x40, + 0x2d, 0xd1, 0x58, 0x46, 0x00, 0xf0, 0xff, 0xf9, 0x01, 0x2c, 0x01, 0x46, + 0x0f, 0xd1, 0xe8, 0x78, 0x10, 0xb9, 0x68, 0x68, 0x09, 0x18, 0x69, 0x60, + 0x69, 0x68, 0x03, 0x98, 0x08, 0x1a, 0x68, 0x60, 0x69, 0x69, 0x02, 0xf0, + 0xc1, 0xf8, 0x18, 0xb3, 0x4b, 0xf2, 0x05, 0x00, 0x20, 0xe0, 0x6a, 0x68, + 0x00, 0x2a, 0x54, 0xbf, 0x4f, 0xf4, 0xfa, 0x64, 0x7c, 0x4c, 0x12, 0x1b, + 0x03, 0x92, 0xe8, 0x78, 0x08, 0xb9, 0x89, 0x18, 0x03, 0x91, 0x01, 0x21, + 0x8d, 0xf8, 0x08, 0x10, 0x00, 0x21, 0xaa, 0x78, 0x8d, 0xf8, 0x0a, 0x20, + 0x04, 0x91, 0x00, 0xf0, 0xa1, 0xf8, 0x6c, 0x60, 0x08, 0xe0, 0x01, 0x2c, + 0x06, 0xd0, 0x8d, 0xf8, 0x08, 0x00, 0xa9, 0x78, 0x8d, 0xf8, 0x0a, 0x10, + 0x00, 0xf0, 0x96, 0xf8, 0x04, 0x00, 0x29, 0xd1, 0x28, 0x7e, 0x01, 0x28, + 0x0d, 0xd1, 0x70, 0x22, 0xa8, 0x78, 0x12, 0xfb, 0x0b, 0xf2, 0x38, 0x21, + 0x4a, 0x44, 0x48, 0x43, 0x11, 0x18, 0x6a, 0x78, 0x1c, 0x20, 0x42, 0x43, + 0x88, 0x18, 0x69, 0x68, 0x41, 0x61, 0x66, 0x48, 0xa9, 0x78, 0x2b, 0x78, + 0x00, 0xeb, 0xcb, 0x06, 0x56, 0xf8, 0x21, 0x00, 0x69, 0x78, 0x11, 0xb9, + 0x01, 0x22, 0x40, 0x30, 0x02, 0xe0, 0x01, 0x22, 0x00, 0x21, 0x54, 0x30, + 0xff, 0xf7, 0x22, 0xff, 0x28, 0x78, 0x00, 0x28, 0x60, 0xd0, 0x69, 0x69, + 0x68, 0x68, 0x02, 0xf0, 0x71, 0xf8, 0x04, 0x00, 0x5a, 0xd1, 0xa8, 0x78, + 0x56, 0xf8, 0x20, 0x40, 0x68, 0x78, 0x6b, 0x68, 0x00, 0x28, 0x6f, 0xf0, + 0xff, 0x02, 0x0a, 0xd1, 0x08, 0x21, 0x04, 0xf1, 0x44, 0x00, 0xff, 0xf7, + 0x0b, 0xff, 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, 0x04, 0xf1, 0x40, 0x00, + 0x09, 0xe0, 0x08, 0x21, 0x04, 0xf1, 0x58, 0x00, 0xff, 0xf7, 0x00, 0xff, + 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, 0x04, 0xf1, 0x54, 0x00, 0xff, 0xf7, + 0xf9, 0xfe, 0x28, 0x46, 0x02, 0xf0, 0x38, 0xf8, 0x04, 0x00, 0x35, 0xd1, + 0xa8, 0x78, 0x56, 0xf8, 0x20, 0x40, 0x68, 0x78, 0x6b, 0x7b, 0x00, 0x28, + 0x0c, 0xbf, 0x44, 0x34, 0x58, 0x34, 0xf0, 0x22, 0x04, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0xe6, 0xfe, 0x2b, 0x7b, 0x0f, 0x22, 0x00, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0xe0, 0xfe, 0x28, 0x46, 0x02, 0xf0, 0x29, 0xf8, 0x04, 0x00, + 0x1c, 0xd1, 0x95, 0xed, 0x02, 0x0a, 0xa8, 0x78, 0xb8, 0xee, 0x40, 0x0a, + 0xdf, 0xed, 0x31, 0x0a, 0x60, 0xee, 0x20, 0x0a, 0x9f, 0xed, 0x30, 0x1a, + 0x69, 0x78, 0x56, 0xf8, 0x20, 0x00, 0x34, 0x4a, 0x80, 0xee, 0x81, 0x1a, + 0xbc, 0xee, 0xc1, 0x0a, 0x00, 0x29, 0x10, 0xee, 0x10, 0x3a, 0x07, 0xbf, + 0x10, 0x21, 0x4c, 0x30, 0x10, 0x21, 0x60, 0x30, 0xff, 0xf7, 0xbe, 0xfe, + 0x28, 0x7e, 0x01, 0x28, 0x06, 0xd1, 0x01, 0x98, 0x29, 0x46, 0x00, 0xf0, + 0x42, 0xf8, 0x00, 0x99, 0x01, 0x20, 0x78, 0x54, 0x20, 0x46, 0x0a, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8e, 0x02, 0xa9, 0x28, 0x7e, 0x8d, 0xf8, 0x20, 0x00, + 0x58, 0x46, 0x00, 0xf0, 0x97, 0xb8, 0xf0, 0xb5, 0x0d, 0x46, 0x87, 0xb0, + 0x6f, 0x78, 0xac, 0x78, 0x06, 0x46, 0xe2, 0xf7, 0x29, 0xfc, 0x70, 0x23, + 0x18, 0x4a, 0xa6, 0x46, 0x01, 0x46, 0x59, 0x43, 0x53, 0x18, 0x38, 0x22, + 0x12, 0xfb, 0x0e, 0xfe, 0x1c, 0x21, 0x03, 0xeb, 0x0e, 0x02, 0x4f, 0x43, + 0xd1, 0x19, 0x00, 0xf0, 0x1b, 0xf8, 0x8d, 0xf8, 0x02, 0x40, 0x69, 0x46, + 0x30, 0x46, 0x00, 0xf0, 0xfb, 0xf8, 0x04, 0x00, 0x0f, 0xd1, 0x9d, 0xf8, + 0x00, 0x00, 0x60, 0xb1, 0x68, 0x68, 0x01, 0x99, 0x08, 0x18, 0x68, 0x60, + 0xe8, 0x78, 0x30, 0xb9, 0xa9, 0x78, 0x30, 0x46, 0x00, 0xf0, 0x01, 0xf9, + 0x69, 0x68, 0x08, 0x1a, 0x68, 0x60, 0x20, 0x46, 0x07, 0xb0, 0xf0, 0xbd, + 0x28, 0x46, 0x1c, 0x22, 0xd4, 0xf7, 0x5e, 0xbb, 0x00, 0x00, 0x80, 0x47, + 0x00, 0x00, 0xb4, 0x43, 0xb8, 0x56, 0x02, 0x20, 0xa8, 0x48, 0x02, 0x20, + 0xb4, 0x76, 0x02, 0x20, 0x30, 0xf8, 0xff, 0xff, 0xc8, 0x8e, 0x04, 0x01, + 0x00, 0x00, 0xff, 0xff, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x38, 0xb5, 0x12, 0x4a, + 0x02, 0xeb, 0xc0, 0x00, 0x4f, 0xf6, 0xff, 0x75, 0x50, 0xf8, 0x21, 0x40, + 0x00, 0x23, 0x2a, 0x46, 0x00, 0x21, 0x04, 0xf1, 0x38, 0x00, 0xff, 0xf7, + 0xe3, 0xff, 0x00, 0x23, 0x2a, 0x46, 0x00, 0x21, 0x04, 0xf1, 0x3c, 0x00, + 0xff, 0xf7, 0xdc, 0xff, 0x2c, 0x34, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, + 0x20, 0x46, 0xff, 0xf7, 0xd5, 0xff, 0x20, 0x46, 0x01, 0xb0, 0xbd, 0xe8, + 0x30, 0x40, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0xcc, 0xe7, 0x00, 0x00, + 0xc8, 0x8e, 0x04, 0x01, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x5f, 0x4b, 0x03, 0xeb, + 0xc0, 0x00, 0x40, 0xf8, 0x21, 0x20, 0x70, 0x47, 0x5c, 0x4a, 0x02, 0xeb, + 0xc0, 0x00, 0x50, 0xf8, 0x21, 0x00, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x47, + 0x81, 0x46, 0x0e, 0x46, 0xe2, 0xf7, 0x94, 0xfb, 0x04, 0x46, 0xb1, 0x78, + 0x56, 0x4a, 0x57, 0x4d, 0x1c, 0x20, 0x41, 0x43, 0x38, 0x20, 0x60, 0x43, + 0x02, 0x44, 0x57, 0x18, 0x2b, 0x18, 0x19, 0x44, 0x01, 0xf1, 0x08, 0x08, + 0x38, 0x46, 0x31, 0x46, 0x00, 0xf0, 0x7c, 0xf8, 0x38, 0x78, 0x05, 0xeb, + 0x44, 0x05, 0x68, 0xb9, 0x00, 0x21, 0x38, 0x7e, 0x79, 0x60, 0xb9, 0x60, + 0x00, 0x28, 0x02, 0xbf, 0xb0, 0x78, 0x29, 0x5c, 0x01, 0x29, 0x03, 0xd1, + 0x38, 0x46, 0x41, 0x46, 0x00, 0xf0, 0x6a, 0xf8, 0xb9, 0x78, 0x48, 0x46, + 0xff, 0xf7, 0xcc, 0xff, 0x38, 0x61, 0x40, 0x08, 0x39, 0x78, 0x78, 0x61, + 0x00, 0x24, 0x29, 0xb1, 0x01, 0x46, 0x78, 0x68, 0x01, 0xf0, 0x30, 0xff, + 0x04, 0x00, 0x3a, 0xd1, 0x3f, 0x48, 0xb9, 0x78, 0x00, 0xeb, 0xc9, 0x09, + 0x00, 0x23, 0x59, 0xf8, 0x21, 0x00, 0x00, 0xf1, 0x04, 0x0a, 0x02, 0x22, + 0x01, 0x21, 0x50, 0x46, 0xff, 0xf7, 0x9e, 0xff, 0x7b, 0x68, 0x39, 0x4a, + 0x06, 0x21, 0x50, 0x46, 0xff, 0xf7, 0x98, 0xff, 0x01, 0x23, 0x10, 0x22, + 0x04, 0x21, 0x50, 0x46, 0xff, 0xf7, 0x92, 0xff, 0x97, 0xed, 0x02, 0x0a, + 0xb8, 0x78, 0xb8, 0xee, 0x40, 0x0a, 0xdf, 0xed, 0x2b, 0x0a, 0x60, 0xee, + 0x20, 0x0a, 0x9f, 0xed, 0x2a, 0x1a, 0x80, 0xee, 0x81, 0x1a, 0x59, 0xf8, + 0x20, 0x00, 0x2d, 0x4a, 0xbc, 0xee, 0xc1, 0x1a, 0x11, 0xee, 0x10, 0x3a, + 0x10, 0x21, 0x14, 0x30, 0xff, 0xf7, 0x7a, 0xff, 0xb8, 0x78, 0x59, 0xf8, + 0x20, 0x00, 0x3b, 0x78, 0x04, 0x22, 0x02, 0x21, 0x00, 0x1d, 0xff, 0xf7, + 0x71, 0xff, 0x30, 0x7e, 0x01, 0x28, 0x06, 0xd1, 0x40, 0x46, 0x39, 0x46, + 0x00, 0xf0, 0x18, 0xf8, 0xb0, 0x78, 0x01, 0x21, 0x29, 0x54, 0x20, 0x46, + 0xbd, 0xe8, 0xf0, 0x87, 0x10, 0xb5, 0x0c, 0x46, 0xe2, 0xf7, 0x14, 0xfb, + 0x01, 0x46, 0x38, 0x22, 0x20, 0x46, 0x16, 0x4b, 0xa4, 0x78, 0x51, 0x43, + 0x5a, 0x18, 0x1c, 0x21, 0x4c, 0x43, 0x11, 0x19, 0x00, 0xf0, 0x02, 0xf8, + 0x00, 0x20, 0x10, 0xbd, 0x1c, 0x22, 0xd4, 0xf7, 0x67, 0xba, 0x38, 0xb5, + 0x0d, 0x46, 0xe2, 0xf7, 0xff, 0xfa, 0x0e, 0x4a, 0x02, 0xeb, 0x40, 0x01, + 0x00, 0x24, 0x4b, 0x5d, 0x01, 0x2b, 0x0a, 0xd1, 0x38, 0x21, 0x48, 0x43, + 0x11, 0x18, 0x1c, 0x22, 0x55, 0x43, 0x4a, 0x19, 0x02, 0xf1, 0x08, 0x01, + 0x08, 0x78, 0x00, 0xb1, 0x4c, 0x68, 0x20, 0x46, 0x32, 0xbd, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, 0xb4, 0x43, 0xa8, 0x72, 0x02, 0x20, + 0x4c, 0x61, 0x02, 0x20, 0xa4, 0x5e, 0x02, 0x20, 0xc8, 0x8e, 0x04, 0x01, + 0xc0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x10, 0xb5, 0x1b, 0x4c, + 0xb0, 0x21, 0x20, 0x46, 0xe6, 0xf7, 0x52, 0xf8, 0x19, 0x4a, 0x13, 0x68, + 0x23, 0x60, 0x10, 0xbd, 0x80, 0xb5, 0x18, 0x48, 0x18, 0x49, 0x09, 0x1a, + 0xd5, 0xf7, 0x26, 0xfb, 0x13, 0x4a, 0x50, 0x60, 0x01, 0xbd, 0x13, 0x21, + 0x15, 0x48, 0xee, 0xf7, 0x7e, 0xb8, 0x13, 0x21, 0x13, 0x48, 0xee, 0xf7, + 0xdc, 0xb8, 0x10, 0xb5, 0x12, 0x48, 0x13, 0x4c, 0x00, 0x68, 0x4d, 0xf2, + 0xd8, 0x31, 0x42, 0x58, 0x22, 0x60, 0xd5, 0xf7, 0x11, 0xfb, 0x60, 0x60, + 0x10, 0xbd, 0x0e, 0x48, 0x41, 0x68, 0x00, 0x68, 0x81, 0x42, 0x01, 0xd1, + 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x01, 0x21, 0x0a, 0x48, + 0x00, 0xf0, 0x0c, 0xb9, 0x01, 0x21, 0x08, 0x48, 0x00, 0xf0, 0x1a, 0xb9, + 0xd0, 0x65, 0x03, 0x20, 0xfc, 0xff, 0x04, 0x01, 0x00, 0x00, 0x00, 0x01, + 0xfc, 0xff, 0x04, 0x01, 0xd8, 0x65, 0x03, 0x20, 0xbc, 0x76, 0x02, 0x20, + 0x70, 0x66, 0x03, 0x20, 0x78, 0x66, 0x03, 0x20, 0x38, 0xb5, 0x00, 0xe0, + 0x38, 0xb5, 0x55, 0x4c, 0x04, 0xeb, 0x80, 0x05, 0x00, 0x23, 0xa8, 0x68, + 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x00, 0x22, 0x00, 0x21, 0xf1, 0xf7, + 0x26, 0xbe, 0x38, 0xb5, 0x00, 0xf0, 0x0b, 0xf8, 0x01, 0x28, 0x18, 0xbf, + 0x00, 0x20, 0x32, 0xbd, 0x38, 0xb5, 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x28, + 0x18, 0xbf, 0x00, 0x20, 0x32, 0xbd, 0x48, 0x4c, 0x04, 0xeb, 0x80, 0x05, + 0x4f, 0xf4, 0x7a, 0x72, 0x51, 0x43, 0xa8, 0x68, 0xb1, 0xfb, 0xf2, 0xf1, + 0xf1, 0xf7, 0x5a, 0xbf, 0x42, 0x49, 0x08, 0x70, 0x70, 0x47, 0x41, 0x49, + 0x48, 0x70, 0x70, 0x47, 0xf8, 0xb5, 0x3f, 0x4c, 0x04, 0xf1, 0x28, 0x01, + 0x01, 0x20, 0xf1, 0xf7, 0xc7, 0xfd, 0x00, 0x25, 0x60, 0x60, 0x10, 0xb9, + 0x4f, 0xf6, 0x6f, 0x75, 0x1d, 0xe0, 0x00, 0x26, 0x50, 0x27, 0x30, 0x46, + 0xe2, 0xf7, 0x52, 0xfa, 0xff, 0x28, 0x13, 0xd0, 0x07, 0xfb, 0x06, 0xf0, + 0x20, 0x44, 0x00, 0xf1, 0x78, 0x01, 0x01, 0x20, 0xf1, 0xf7, 0xb2, 0xfd, + 0x04, 0xeb, 0x86, 0x01, 0x88, 0x60, 0x00, 0x21, 0xf1, 0xf7, 0x32, 0xff, + 0x01, 0x21, 0x30, 0x46, 0xed, 0xf7, 0x02, 0xff, 0x00, 0xb1, 0x05, 0x46, + 0x76, 0x1c, 0x08, 0x2e, 0xe3, 0xd3, 0x28, 0x46, 0xf2, 0xbd, 0x70, 0xb5, + 0x04, 0x46, 0x00, 0x20, 0x16, 0x46, 0x08, 0x2e, 0x1d, 0x46, 0x26, 0x4a, + 0x03, 0xd1, 0x13, 0x78, 0x01, 0x2b, 0x1d, 0xd1, 0x03, 0xe0, 0x0a, 0x2e, + 0x18, 0xbf, 0x09, 0x2e, 0x0b, 0xd0, 0x50, 0x78, 0x48, 0xb9, 0x50, 0x68, + 0x4f, 0xf4, 0x7a, 0x71, 0xf1, 0xf7, 0x10, 0xff, 0x01, 0x28, 0x02, 0xd0, + 0x4f, 0xf6, 0x70, 0x70, 0x70, 0xbd, 0x29, 0x46, 0x30, 0x46, 0x00, 0xf0, + 0x48, 0xf8, 0x01, 0x46, 0x01, 0x20, 0x00, 0xf0, 0x31, 0xf8, 0x01, 0x46, + 0x20, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x31, 0xe0, 0x70, 0xbd, 0xf8, 0xb5, + 0x06, 0x46, 0x15, 0x46, 0x00, 0x27, 0x28, 0x46, 0x08, 0x28, 0x19, 0x46, + 0x10, 0x4c, 0x02, 0xd1, 0x22, 0x78, 0x01, 0x2a, 0x1a, 0xd1, 0x00, 0xf0, + 0x30, 0xf8, 0x01, 0x46, 0x00, 0x20, 0x00, 0xf0, 0x19, 0xf8, 0x01, 0x46, + 0x30, 0x46, 0x00, 0xf0, 0x1b, 0xf8, 0x0a, 0x2d, 0x18, 0xbf, 0x09, 0x2d, + 0x07, 0x46, 0x0b, 0xd0, 0x60, 0x78, 0x48, 0xb9, 0x60, 0x68, 0x00, 0x23, + 0x00, 0x22, 0x00, 0x21, 0xf1, 0xf7, 0x8d, 0xfd, 0x01, 0x28, 0x18, 0xbf, + 0x4f, 0xf6, 0x78, 0x77, 0x38, 0x46, 0xf2, 0xbd, 0x38, 0x3b, 0x02, 0x20, + 0x18, 0xb1, 0x09, 0xb9, 0x03, 0x20, 0x70, 0x47, 0x02, 0x20, 0x70, 0x47, + 0x02, 0x29, 0x04, 0xbf, 0x01, 0x21, 0xed, 0xf7, 0x98, 0xbe, 0x03, 0x29, + 0x04, 0xbf, 0x01, 0x21, 0xed, 0xf7, 0x90, 0xbe, 0x01, 0x21, 0xed, 0xf7, + 0x93, 0xbe, 0x02, 0x46, 0x01, 0x20, 0x92, 0x1f, 0x01, 0x2a, 0x01, 0xd8, + 0x01, 0xb1, 0x08, 0x78, 0x70, 0x47, 0x38, 0xb5, 0x04, 0x46, 0x00, 0x21, + 0x00, 0xf0, 0x4b, 0xf9, 0x05, 0x46, 0x01, 0x21, 0x20, 0x46, 0x00, 0xf0, + 0x46, 0xf9, 0x45, 0xea, 0x80, 0x05, 0xed, 0xb2, 0x35, 0xb1, 0x03, 0x2d, + 0x02, 0xd0, 0x0c, 0x2d, 0x02, 0xd0, 0x03, 0xe0, 0x01, 0x20, 0x32, 0xbd, + 0x00, 0x20, 0x32, 0xbd, 0x02, 0x20, 0x32, 0xbd, 0x38, 0xb5, 0x04, 0x46, + 0xef, 0xf7, 0xfa, 0xfd, 0x00, 0x25, 0x00, 0x2c, 0x1c, 0xbf, 0x00, 0x78, + 0x00, 0x28, 0x07, 0xd0, 0xff, 0xf7, 0xf8, 0xfe, 0xff, 0xf7, 0xfa, 0xfe, + 0x01, 0x28, 0x18, 0xbf, 0x4b, 0xf6, 0x01, 0x65, 0x28, 0x46, 0x32, 0xbd, + 0x10, 0xb5, 0x05, 0x4a, 0x11, 0x68, 0x04, 0x46, 0x04, 0x48, 0xd5, 0xf7, + 0xef, 0xf9, 0x60, 0x60, 0x03, 0x48, 0x01, 0x68, 0x21, 0x60, 0x10, 0xbd, + 0x20, 0x04, 0x00, 0x20, 0x00, 0x00, 0x30, 0x4d, 0x24, 0x04, 0x00, 0x20, + 0x01, 0x46, 0x01, 0x20, 0x0a, 0x68, 0x49, 0x68, 0x8a, 0x42, 0x18, 0xbf, + 0x00, 0x20, 0x70, 0x47, 0x06, 0x22, 0x1a, 0x49, 0x42, 0x43, 0x11, 0x44, + 0xc0, 0xb2, 0xee, 0xf7, 0x47, 0xb9, 0x10, 0xb5, 0x04, 0x46, 0xff, 0xf7, + 0xf5, 0xff, 0x50, 0xb9, 0x01, 0x21, 0x20, 0x46, 0x00, 0xf0, 0x28, 0xf8, + 0x28, 0xb9, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x40, 0xf2, 0x47, 0x31, + 0x23, 0xe0, 0x10, 0xbd, 0x70, 0xb5, 0x05, 0x46, 0x06, 0x22, 0x0d, 0x49, + 0x6a, 0x43, 0x8e, 0x18, 0x30, 0x78, 0x80, 0xb1, 0xb1, 0x88, 0xe8, 0xb2, + 0xee, 0xf7, 0xf6, 0xf8, 0x04, 0x00, 0x0c, 0xd1, 0x71, 0x78, 0xe8, 0xb2, + 0xee, 0xf7, 0x36, 0xf9, 0x00, 0x21, 0xe8, 0xb2, 0xee, 0xf7, 0xcb, 0xf8, + 0x00, 0x20, 0x30, 0x70, 0x01, 0xe0, 0x4f, 0xf6, 0x6c, 0x74, 0x20, 0x46, + 0x70, 0xbd, 0x00, 0x00, 0x50, 0x73, 0x02, 0x20, 0xc0, 0xb2, 0xee, 0xf7, + 0x25, 0xb9, 0xc0, 0xb2, 0xee, 0xf7, 0xdc, 0xb8, 0x38, 0xb5, 0x05, 0x46, + 0x21, 0xb9, 0x01, 0x21, 0xed, 0xf7, 0x03, 0xfe, 0x04, 0x46, 0x0b, 0xe0, + 0x01, 0x21, 0xed, 0xf7, 0x01, 0xfe, 0x04, 0x00, 0x06, 0xd1, 0xe8, 0xb2, + 0xee, 0xf7, 0xe9, 0xf8, 0x01, 0x28, 0x18, 0xbf, 0x4f, 0xf6, 0x18, 0x74, + 0x20, 0x46, 0x32, 0xbd, 0x1c, 0xb5, 0x04, 0x46, 0xc0, 0xb2, 0xee, 0xf7, + 0x9c, 0xf8, 0x01, 0x00, 0x18, 0xbf, 0x01, 0x21, 0x00, 0xf0, 0x03, 0xf8, + 0x9d, 0xf8, 0x00, 0x00, 0x16, 0xbd, 0x6b, 0x46, 0x01, 0xaa, 0xc9, 0xb2, + 0xe0, 0xb2, 0xee, 0xf7, 0x5a, 0xb8, 0xc0, 0xb2, 0xee, 0xf7, 0x8c, 0xba, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x70, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x10, 0xb5, 0x00, 0xf0, 0x88, 0xf8, 0x03, 0xd1, + 0x30, 0x22, 0x04, 0x21, 0xc0, 0x1c, 0x0a, 0xe0, 0x01, 0x29, 0x03, 0xd1, + 0x30, 0x22, 0x04, 0x21, 0x40, 0x1d, 0x04, 0xe0, 0x02, 0x29, 0x03, 0xd1, + 0x30, 0x22, 0x04, 0x21, 0x0b, 0x30, 0x27, 0xe0, 0x10, 0xbd, 0x5d, 0x4a, + 0x52, 0xf8, 0x20, 0x00, 0x0b, 0x00, 0x08, 0xbf, 0xc0, 0x1c, 0x06, 0xd0, + 0x01, 0x29, 0x08, 0xbf, 0x40, 0x1d, 0x02, 0xd0, 0x02, 0x29, 0x02, 0xd1, + 0x0b, 0x30, 0x00, 0x78, 0x75, 0xe0, 0x00, 0x20, 0x70, 0x47, 0x10, 0xb5, + 0x00, 0xf0, 0x61, 0xf8, 0x03, 0xd1, 0x0f, 0x22, 0x00, 0x21, 0xc0, 0x1c, + 0x0a, 0xe0, 0x01, 0x29, 0x03, 0xd1, 0x0f, 0x22, 0x00, 0x21, 0x40, 0x1d, + 0x04, 0xe0, 0x02, 0x29, 0x03, 0xd1, 0x0f, 0x22, 0x00, 0x21, 0x0b, 0x30, + 0x00, 0xe0, 0x10, 0xbd, 0xbd, 0xe8, 0x10, 0x40, 0xb2, 0xe7, 0x38, 0xb5, + 0x14, 0x46, 0x47, 0x4a, 0x52, 0xf8, 0x20, 0x50, 0x08, 0x00, 0x04, 0xd1, + 0x23, 0x46, 0x3f, 0x22, 0x00, 0x21, 0x28, 0x1d, 0x11, 0xe0, 0x01, 0x29, + 0x08, 0xd1, 0x05, 0x20, 0xf4, 0xf7, 0xc8, 0xfe, 0x78, 0xb1, 0x23, 0x46, + 0x3f, 0x22, 0x00, 0x21, 0xa8, 0x1d, 0x06, 0xe0, 0x02, 0x29, 0x08, 0xd1, + 0x23, 0x46, 0x3f, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x0a, 0x00, 0x01, 0xb0, + 0xbd, 0xe8, 0x30, 0x40, 0x90, 0xe7, 0x31, 0xbd, 0x38, 0xb5, 0x36, 0x4a, + 0x52, 0xf8, 0x20, 0x40, 0x08, 0x00, 0x08, 0xbf, 0x24, 0x1d, 0x0a, 0xd0, + 0x01, 0x29, 0x05, 0xd1, 0x05, 0x20, 0xf4, 0xf7, 0xa9, 0xfe, 0x48, 0xb1, + 0xa4, 0x1d, 0x02, 0xe0, 0x02, 0x29, 0x04, 0xd1, 0x0a, 0x34, 0x25, 0x78, + 0x05, 0xf0, 0x3f, 0x05, 0x00, 0xe0, 0x40, 0x25, 0xe8, 0xb2, 0x32, 0xbd, + 0x10, 0xb5, 0x00, 0xf0, 0x0c, 0xf8, 0x03, 0xd1, 0x01, 0x22, 0x00, 0x21, + 0xc0, 0x1d, 0x04, 0xe0, 0x01, 0x29, 0x03, 0xd1, 0x01, 0x22, 0x00, 0x21, + 0x09, 0x30, 0xb1, 0xe7, 0x10, 0xbd, 0x13, 0x46, 0x21, 0x4a, 0x52, 0xf8, + 0x20, 0x00, 0x0c, 0x00, 0x70, 0x47, 0x1f, 0x4a, 0x52, 0xf8, 0x20, 0x00, + 0x33, 0x30, 0x00, 0x29, 0x00, 0x78, 0x02, 0xd1, 0xc0, 0xf3, 0x81, 0x00, + 0x70, 0x47, 0xc0, 0xf3, 0x01, 0x10, 0x70, 0x47, 0x10, 0xb5, 0xff, 0xf7, + 0xea, 0xff, 0x03, 0xd1, 0x1f, 0x22, 0x00, 0x21, 0x80, 0x1c, 0x04, 0xe0, + 0x01, 0x29, 0x03, 0xd1, 0x01, 0x22, 0x00, 0x21, 0x08, 0x30, 0x8f, 0xe7, + 0x10, 0xbd, 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x14, 0x20, 0xf4, 0xf7, + 0x65, 0xfe, 0x50, 0xb1, 0x2b, 0x46, 0x0d, 0x48, 0x50, 0xf8, 0x24, 0x00, + 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x3f, 0x22, 0x00, 0x21, 0x80, 0x1d, + 0x32, 0xe7, 0x31, 0xbd, 0x38, 0xb5, 0x04, 0x46, 0x14, 0x20, 0xf4, 0xf7, + 0x53, 0xfe, 0x00, 0x25, 0x30, 0xb1, 0x04, 0x48, 0x50, 0xf8, 0x24, 0x10, + 0x11, 0xf8, 0x06, 0x5f, 0x05, 0xf0, 0x3f, 0x05, 0x28, 0x46, 0x32, 0xbd, + 0x88, 0x97, 0x04, 0x01, 0x19, 0xb1, 0x02, 0x29, 0x05, 0xd0, 0x02, 0xd3, + 0x05, 0xe0, 0xe1, 0xf7, 0x6e, 0xbe, 0xe1, 0xf7, 0xb8, 0xbe, 0xe1, 0xf7, + 0x79, 0xbf, 0x00, 0x20, 0x70, 0x47, 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, + 0xff, 0xf7, 0xee, 0xff, 0x06, 0x46, 0x29, 0x46, 0x20, 0x46, 0x00, 0xf0, + 0x04, 0xf8, 0x00, 0xb1, 0x76, 0x08, 0x30, 0x46, 0x70, 0xbd, 0x80, 0xb5, + 0xff, 0xf7, 0xe2, 0xff, 0xdf, 0xf8, 0xf8, 0x19, 0x88, 0x42, 0x80, 0x41, + 0xc0, 0x43, 0xc0, 0x0f, 0x02, 0xbd, 0x03, 0x28, 0x02, 0xd0, 0x04, 0x28, + 0x03, 0xd0, 0x04, 0xe0, 0x4f, 0xf4, 0x4b, 0x70, 0x70, 0x47, 0x7f, 0x20, + 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x70, 0xb5, 0x2d, 0xed, 0x02, 0x8b, + 0x11, 0x46, 0x07, 0x9d, 0x9d, 0xed, 0x06, 0x8a, 0x1c, 0x46, 0xff, 0xf7, + 0xd2, 0xff, 0x00, 0xf0, 0x14, 0xf8, 0xd4, 0xf7, 0x99, 0xf8, 0x00, 0xf0, + 0x6b, 0xfa, 0x28, 0x80, 0x00, 0x26, 0x20, 0x46, 0xff, 0xf7, 0xdf, 0xff, + 0x29, 0x88, 0x88, 0x42, 0x88, 0xbf, 0x08, 0x46, 0x28, 0x80, 0x28, 0x88, + 0x14, 0x28, 0xb8, 0xbf, 0x4b, 0xf2, 0x01, 0x26, 0x26, 0xe0, 0x00, 0xee, + 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xf8, 0xee, 0x48, 0x0a, 0x80, 0xee, + 0x20, 0x0a, 0x70, 0x47, 0x70, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x11, 0x46, + 0x1c, 0x46, 0x9d, 0xed, 0x06, 0x8a, 0xff, 0xf7, 0xaa, 0xff, 0xff, 0xf7, + 0xec, 0xff, 0xf1, 0xf7, 0xc9, 0xf8, 0x00, 0xf0, 0x43, 0xfa, 0x00, 0x26, + 0x81, 0xb2, 0x07, 0x9d, 0x14, 0x29, 0xb8, 0xbf, 0x14, 0x20, 0x28, 0x80, + 0x20, 0x46, 0xff, 0xf7, 0xb2, 0xff, 0x29, 0x88, 0x88, 0x42, 0x38, 0xbf, + 0x4b, 0xf2, 0x01, 0x26, 0xbd, 0xec, 0x02, 0x8b, 0x30, 0x46, 0x70, 0xbd, + 0x2d, 0xe9, 0xfe, 0x43, 0x88, 0x46, 0x91, 0x46, 0x0a, 0x9d, 0x04, 0x46, + 0x1e, 0x46, 0x49, 0x46, 0xff, 0xf7, 0x87, 0xff, 0x07, 0x46, 0x31, 0x46, + 0x20, 0x46, 0xff, 0xf7, 0x82, 0xff, 0x06, 0x46, 0x0b, 0x99, 0x00, 0x91, + 0x02, 0xa8, 0x01, 0x90, 0x2b, 0x46, 0x4a, 0x46, 0x41, 0x46, 0x20, 0x46, + 0xff, 0xf7, 0xc4, 0xff, 0x04, 0x00, 0x23, 0xd1, 0x28, 0x46, 0xff, 0xf7, + 0x8a, 0xff, 0x80, 0x46, 0x31, 0x46, 0x38, 0x46, 0xf4, 0xf7, 0x9b, 0xfd, + 0xb6, 0xfb, 0xf0, 0xf6, 0xb7, 0xfb, 0xf0, 0xf5, 0xbd, 0xf8, 0x08, 0x00, + 0x29, 0x46, 0xf4, 0xf7, 0x8a, 0xfd, 0x07, 0x46, 0x31, 0x46, 0x14, 0x20, + 0xf4, 0xf7, 0x85, 0xfd, 0x87, 0x42, 0x38, 0xbf, 0x07, 0x46, 0x0c, 0x98, + 0x0d, 0x99, 0x7d, 0x43, 0x7e, 0x43, 0xa8, 0x45, 0x05, 0x80, 0x2c, 0xbf, + 0xb0, 0x45, 0x4b, 0xf2, 0x01, 0x24, 0x0e, 0x80, 0x20, 0x46, 0xbd, 0xe8, + 0xfe, 0x83, 0x10, 0xb5, 0x14, 0x46, 0xff, 0xf7, 0x4a, 0xff, 0xb0, 0xfb, + 0xf4, 0xf0, 0x10, 0xbd, 0x80, 0xb5, 0x11, 0xb1, 0x02, 0x29, 0x04, 0xd0, + 0x07, 0xe0, 0x69, 0x46, 0xe0, 0xf7, 0x32, 0xff, 0x05, 0xe0, 0x69, 0x46, + 0xe0, 0xf7, 0x41, 0xff, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x90, 0x00, 0x98, + 0x02, 0xbd, 0xf8, 0xb5, 0x0e, 0x46, 0x05, 0x46, 0x14, 0x46, 0x19, 0x46, + 0xff, 0xf7, 0xe8, 0xff, 0x01, 0x2e, 0x07, 0x46, 0x0e, 0xd1, 0x28, 0x46, + 0xe1, 0xf7, 0xa9, 0xfe, 0x05, 0x46, 0x38, 0x1b, 0x00, 0xee, 0x10, 0x0a, + 0x00, 0xee, 0x90, 0x5a, 0x00, 0xf0, 0x8d, 0xf8, 0x00, 0xf0, 0xbe, 0xf9, + 0x68, 0x43, 0x03, 0xe0, 0x31, 0x46, 0x28, 0x46, 0xff, 0xf7, 0xd2, 0xff, + 0x04, 0x19, 0xe0, 0x1b, 0xf2, 0xbd, 0x80, 0xb5, 0xf4, 0xf7, 0x1b, 0xfd, + 0x40, 0x1e, 0xc0, 0xb2, 0x02, 0xbd, 0x02, 0x46, 0x49, 0x00, 0x01, 0xfb, + 0x01, 0xf0, 0x48, 0x43, 0x04, 0x2a, 0x08, 0xbf, 0x48, 0x43, 0x70, 0x47, + 0x70, 0xb5, 0x15, 0x46, 0x06, 0x9e, 0x04, 0x9a, 0x31, 0x70, 0x72, 0x71, + 0x03, 0x2d, 0x05, 0x9c, 0x73, 0x80, 0x0c, 0xbf, 0x00, 0x22, 0x01, 0x22, + 0x72, 0x70, 0xff, 0xf7, 0x06, 0xff, 0x00, 0xb1, 0x01, 0x20, 0x30, 0x71, + 0x28, 0x46, 0x71, 0x88, 0xff, 0xf7, 0xe1, 0xff, 0x34, 0x73, 0xb0, 0x60, + 0x70, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, 0x80, 0x46, 0x1d, 0x46, 0x07, 0x9b, + 0x08, 0x98, 0x0d, 0x9c, 0x18, 0x43, 0x0f, 0x46, 0x03, 0xd1, 0x00, 0x21, + 0x60, 0x70, 0xa1, 0x70, 0x49, 0xe0, 0x0c, 0x9e, 0x0a, 0x98, 0x09, 0x99, + 0xdd, 0xf8, 0x18, 0xc0, 0x22, 0x70, 0x5f, 0xea, 0x0c, 0x02, 0x18, 0xbf, + 0x01, 0x22, 0xa2, 0x70, 0x1a, 0x00, 0x18, 0xbf, 0x01, 0x22, 0x62, 0x70, + 0x02, 0x00, 0x18, 0xbf, 0x01, 0x22, 0x08, 0x00, 0x18, 0xbf, 0x01, 0x20, + 0xa0, 0x74, 0x62, 0x74, 0xb8, 0x68, 0xff, 0xf7, 0xb0, 0xff, 0xe0, 0x74, + 0x66, 0x61, 0x39, 0x78, 0x0b, 0x98, 0x02, 0x29, 0x06, 0xd1, 0x01, 0x00, + 0x08, 0xbf, 0x01, 0x20, 0x02, 0xd0, 0x01, 0x28, 0x08, 0xbf, 0x00, 0x20, + 0x20, 0x74, 0x38, 0x78, 0x01, 0x28, 0x14, 0xd1, 0x40, 0x46, 0xe1, 0xf7, + 0x32, 0xfe, 0x06, 0x46, 0x00, 0xee, 0x10, 0x5a, 0x00, 0xee, 0x90, 0x6a, + 0x00, 0xf0, 0x17, 0xf8, 0xbd, 0xee, 0xc0, 0x0a, 0x39, 0x7b, 0x10, 0xee, + 0x10, 0x0a, 0x46, 0x43, 0x40, 0x46, 0x00, 0xf0, 0x3c, 0xf8, 0xad, 0x1b, + 0x45, 0x19, 0x39, 0x78, 0x40, 0x46, 0xff, 0xf7, 0x8f, 0xfe, 0x01, 0x46, + 0x28, 0x46, 0x00, 0xf0, 0x0c, 0xf8, 0xc4, 0xe9, 0x02, 0x01, 0xbd, 0xe8, + 0xf0, 0x81, 0xb8, 0xee, 0xc0, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x80, 0xee, + 0x20, 0x0a, 0xd3, 0xf7, 0x75, 0xbf, 0x0a, 0x46, 0x00, 0x23, 0x41, 0x02, + 0xd0, 0x1a, 0x63, 0xeb, 0x01, 0x01, 0x00, 0xb5, 0xd3, 0x0f, 0x52, 0x00, + 0xe6, 0xf7, 0x6e, 0xf9, 0x00, 0xf0, 0x10, 0xf8, 0x00, 0xbd, 0x00, 0x00, + 0x80, 0xb5, 0xdf, 0xed, 0x88, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xd3, 0xf7, + 0x5f, 0xff, 0x10, 0xee, 0x10, 0x0a, 0x06, 0xf0, 0x6f, 0xfb, 0x00, 0xf0, + 0x01, 0xf8, 0x04, 0xbd, 0x09, 0x06, 0x41, 0xea, 0x10, 0x21, 0x00, 0x06, + 0x00, 0x0e, 0x40, 0xea, 0x01, 0x20, 0x09, 0x16, 0x70, 0x47, 0x10, 0xb5, + 0x4c, 0x07, 0xe1, 0xf7, 0xe2, 0xfd, 0x64, 0x17, 0x44, 0x43, 0x64, 0x42, + 0xe0, 0x10, 0x10, 0xbd, 0x80, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x08, 0xee, + 0x10, 0x1a, 0xe1, 0xf7, 0xd6, 0xfd, 0x00, 0xee, 0x10, 0x0a, 0xf8, 0xee, + 0xc8, 0x0a, 0xb2, 0xee, 0x00, 0x1a, 0x60, 0xee, 0x81, 0x0a, 0xb8, 0xee, + 0x40, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0xd3, 0xf7, 0x31, 0xff, 0x00, 0xf0, + 0xe5, 0xf8, 0xbd, 0xec, 0x02, 0x8b, 0x00, 0xf0, 0x07, 0x00, 0x02, 0xbd, + 0xdf, 0xf8, 0xa0, 0x26, 0x11, 0x54, 0x70, 0x47, 0x30, 0xb5, 0xdf, 0xf8, + 0x98, 0x46, 0x0f, 0xf2, 0xfc, 0x65, 0x20, 0x5c, 0xd1, 0xed, 0x00, 0x1a, + 0x92, 0xed, 0x00, 0x1a, 0x43, 0x43, 0x5b, 0x42, 0x0f, 0xf2, 0x08, 0x70, + 0x03, 0xf0, 0x07, 0x03, 0x05, 0xeb, 0x83, 0x04, 0x00, 0xeb, 0x83, 0x03, + 0x94, 0xed, 0x00, 0x0a, 0xd3, 0xed, 0x00, 0x0a, 0x21, 0xee, 0xa0, 0x2a, + 0x01, 0xee, 0x00, 0x2a, 0x21, 0xee, 0x80, 0x0a, 0x01, 0xee, 0x60, 0x0a, + 0x81, 0xed, 0x00, 0x0a, 0x82, 0xed, 0x00, 0x2a, 0x30, 0xbd, 0x00, 0x00, + 0x10, 0xb5, 0x2d, 0xed, 0x04, 0x8b, 0x08, 0xee, 0x10, 0x3a, 0x08, 0x9c, + 0x06, 0x9b, 0xdd, 0xed, 0x07, 0x8a, 0x22, 0x70, 0x63, 0x70, 0xff, 0xf7, + 0xfd, 0xfd, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x9a, 0xb8, 0xee, + 0x48, 0x0a, 0xdf, 0xed, 0x4d, 0x0a, 0x60, 0xee, 0x20, 0x0a, 0x60, 0xee, + 0x89, 0x0a, 0x9f, 0xed, 0x4b, 0x1a, 0x20, 0xee, 0x81, 0x1a, 0x9f, 0xed, + 0x4a, 0x0a, 0x21, 0xee, 0x00, 0x0a, 0xd3, 0xf7, 0xdd, 0xfe, 0xbd, 0xee, + 0xc0, 0x0a, 0xf8, 0xee, 0xe8, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x9f, 0xed, + 0x45, 0x0a, 0x20, 0xee, 0x80, 0x0a, 0x60, 0x80, 0x80, 0xee, 0x09, 0x0a, + 0xb1, 0xee, 0x40, 0x0a, 0xd3, 0xf7, 0xcc, 0xfe, 0xbd, 0xee, 0xc0, 0x0a, + 0x84, 0xed, 0x01, 0x0a, 0xbd, 0xec, 0x04, 0x8b, 0x10, 0xbd, 0x00, 0x00, + 0x2d, 0xe9, 0xf8, 0x4f, 0x4f, 0xf0, 0x00, 0x0b, 0x2d, 0xed, 0x04, 0x8b, + 0xb0, 0xee, 0x60, 0x8a, 0x17, 0x9f, 0x0e, 0x98, 0xdd, 0xf8, 0x3c, 0x80, + 0xdd, 0xf8, 0x40, 0x90, 0x11, 0x9d, 0x12, 0x9e, 0xdd, 0xf8, 0x4c, 0xa0, + 0xdd, 0xf8, 0x50, 0xc0, 0xdd, 0xf8, 0x54, 0xe0, 0x16, 0x9c, 0x87, 0xf8, + 0x34, 0xb0, 0x39, 0x70, 0xc7, 0xf8, 0x08, 0x90, 0x11, 0x00, 0x18, 0xbf, + 0x01, 0x21, 0x79, 0x70, 0xc7, 0xf8, 0x0c, 0xa0, 0x19, 0x00, 0x18, 0xbf, + 0x01, 0x21, 0xb9, 0x70, 0x87, 0xf8, 0x10, 0xc0, 0x01, 0x00, 0x18, 0xbf, + 0x01, 0x21, 0x5f, 0xea, 0x08, 0x00, 0x18, 0xbf, 0x01, 0x20, 0xf9, 0x70, + 0x38, 0x71, 0x87, 0xf8, 0x12, 0xe0, 0xfc, 0x74, 0x19, 0xf4, 0x40, 0x3f, + 0xf0, 0xee, 0x41, 0x8a, 0x3d, 0x75, 0x7e, 0x75, 0x0f, 0xd0, 0xd4, 0xf7, + 0xe3, 0xf8, 0xf0, 0xee, 0x40, 0x0a, 0xb8, 0xee, 0x00, 0x1a, 0xbb, 0xee, + 0x08, 0x0a, 0x00, 0xee, 0x81, 0x0a, 0xd3, 0xf7, 0x5f, 0xfe, 0x00, 0xf0, + 0x31, 0xf8, 0x78, 0x74, 0x01, 0xe0, 0x87, 0xf8, 0x11, 0xb0, 0x9f, 0xed, + 0xbb, 0x9a, 0x28, 0xee, 0x09, 0x0a, 0xf0, 0xf7, 0xab, 0xfe, 0xbc, 0xee, + 0xc0, 0x0a, 0x87, 0xed, 0x06, 0x0a, 0x28, 0xee, 0x89, 0x0a, 0xd3, 0xf7, + 0x4b, 0xfe, 0xdf, 0xed, 0xb4, 0x0a, 0x06, 0xf0, 0x9f, 0xfa, 0xbc, 0xee, + 0xc0, 0x0a, 0x87, 0xed, 0x07, 0x0a, 0xa6, 0xe1, 0x70, 0x47, 0x00, 0x00, + 0x80, 0xb5, 0xdf, 0xed, 0xaf, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xf0, 0xf7, + 0x91, 0xfe, 0x00, 0xf0, 0x0b, 0xf8, 0x02, 0xbd, 0x00, 0x00, 0x80, 0xd3, + 0xbd, 0x37, 0x86, 0x35, 0x00, 0x00, 0x7a, 0x44, 0x00, 0x00, 0x80, 0x3a, + 0x00, 0x00, 0x80, 0x4b, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, + 0x70, 0x47, 0x48, 0x68, 0x02, 0x40, 0x12, 0xf4, 0x40, 0x1f, 0x01, 0xd0, + 0x01, 0x20, 0x70, 0x47, 0x12, 0xf4, 0xfe, 0x4f, 0x01, 0xd0, 0x02, 0x20, + 0x70, 0x47, 0x10, 0x03, 0x01, 0xd5, 0x04, 0x20, 0x70, 0x47, 0x50, 0x03, + 0x01, 0xd5, 0x05, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x49, 0x68, + 0x00, 0x20, 0x4a, 0x03, 0x48, 0xbf, 0x01, 0x20, 0x70, 0x47, 0x49, 0x68, + 0x00, 0x20, 0x0a, 0x03, 0x48, 0xbf, 0x01, 0x20, 0x70, 0x47, 0x08, 0x68, + 0xc0, 0xf3, 0x0d, 0x40, 0x70, 0x47, 0x10, 0xb5, 0x0b, 0x68, 0x94, 0x00, + 0xe3, 0x40, 0x03, 0xf0, 0x0f, 0x03, 0x02, 0x28, 0x9a, 0xbf, 0x01, 0xeb, + 0x82, 0x00, 0x80, 0x68, 0x00, 0x20, 0x5b, 0x00, 0xbd, 0xe8, 0x10, 0x40, + 0xc3, 0xf1, 0x12, 0x03, 0xc1, 0x17, 0x1a, 0x46, 0x03, 0xf0, 0x90, 0xb8, + 0xf8, 0xb5, 0x1e, 0x46, 0x06, 0x9c, 0x07, 0x9d, 0xb2, 0x42, 0x07, 0xd1, + 0xff, 0xf7, 0xe3, 0xff, 0xc4, 0xe9, 0x00, 0x01, 0x00, 0x20, 0xc5, 0xe9, + 0x00, 0x00, 0xf1, 0xbd, 0x96, 0x42, 0x02, 0xd2, 0x13, 0x46, 0x32, 0x46, + 0x1e, 0x46, 0x0b, 0x68, 0x4f, 0xea, 0x82, 0x0c, 0x4f, 0xea, 0x86, 0x0e, + 0x23, 0xfa, 0x0c, 0xf7, 0x23, 0xfa, 0x0e, 0xf3, 0x01, 0x28, 0x07, 0xf0, + 0x0f, 0x07, 0x03, 0xf0, 0x0f, 0x03, 0x02, 0xd0, 0x02, 0x28, 0x0d, 0xd0, + 0x1a, 0xe0, 0x0f, 0xf2, 0xc0, 0x40, 0x94, 0x46, 0x50, 0xf8, 0x2c, 0x00, + 0x06, 0x44, 0xb2, 0x1a, 0x52, 0x1e, 0x01, 0xeb, 0xc2, 0x01, 0x08, 0x6a, + 0x4e, 0x6a, 0x0f, 0xe0, 0x10, 0x00, 0x04, 0xd1, 0x01, 0x2e, 0x09, 0xd1, + 0x88, 0x6b, 0xce, 0x6b, 0x08, 0xe0, 0x02, 0x2a, 0x08, 0xbf, 0x03, 0x2e, + 0x02, 0xd1, 0x08, 0x6c, 0x4e, 0x6c, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x26, + 0xc7, 0xf1, 0x12, 0x07, 0xff, 0x1a, 0xc1, 0x17, 0x3a, 0x46, 0x03, 0xf0, + 0x47, 0xf8, 0xc4, 0xe9, 0x00, 0x01, 0x3a, 0x46, 0x30, 0x46, 0xf1, 0x17, + 0x03, 0xf0, 0x40, 0xf8, 0xc5, 0xe9, 0x00, 0x01, 0xf1, 0xbd, 0xf0, 0xb5, + 0x1d, 0x46, 0x0e, 0x68, 0x93, 0x00, 0xde, 0x40, 0x01, 0x28, 0x06, 0xf0, + 0x0f, 0x06, 0x02, 0xd0, 0x02, 0x28, 0x02, 0xd0, 0x06, 0xe0, 0x2a, 0xb9, + 0x01, 0xe0, 0x01, 0xeb, 0xc2, 0x01, 0x88, 0x69, 0xcc, 0x69, 0x01, 0xe0, + 0x00, 0x20, 0x00, 0x24, 0x76, 0x00, 0xc6, 0xf1, 0x12, 0x06, 0xc1, 0x17, + 0x32, 0x46, 0x05, 0x9f, 0x03, 0xf0, 0x20, 0xf8, 0xc5, 0xe9, 0x00, 0x01, + 0x32, 0x46, 0x20, 0x46, 0xe1, 0x17, 0x03, 0xf0, 0x19, 0xf8, 0xc7, 0xe9, + 0x00, 0x01, 0xf0, 0xbd, 0x80, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0xb0, 0xee, + 0x40, 0x8a, 0x06, 0xf0, 0xd7, 0xf9, 0x00, 0xee, 0x10, 0x0a, 0x20, 0xee, + 0x08, 0x0a, 0xbd, 0xec, 0x02, 0x8b, 0x01, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, + 0x2d, 0xed, 0x06, 0x8b, 0x82, 0xb0, 0x05, 0x46, 0x0c, 0x46, 0xe1, 0xf7, + 0xf8, 0xfa, 0x08, 0xee, 0x90, 0x0a, 0x28, 0x46, 0xe1, 0xf7, 0x02, 0xfc, + 0x9f, 0xed, 0xc6, 0x8a, 0xb8, 0xee, 0x68, 0x0a, 0xdf, 0xed, 0xc5, 0x9a, + 0x20, 0xee, 0x08, 0x0a, 0x09, 0xee, 0x10, 0x0a, 0x20, 0xee, 0x29, 0x0a, + 0xf0, 0xf7, 0xa0, 0xfd, 0xdf, 0xed, 0xc1, 0xaa, 0xb4, 0xee, 0x6a, 0x0a, + 0x9f, 0xed, 0xc0, 0xaa, 0xf1, 0xee, 0x10, 0xfa, 0xa8, 0xbf, 0xb0, 0xee, + 0x4a, 0x0a, 0xff, 0xf7, 0x0f, 0xff, 0xb8, 0xee, 0x49, 0x0a, 0x20, 0x80, + 0x20, 0xee, 0x08, 0x0a, 0x20, 0xee, 0x29, 0x0a, 0xf0, 0xf7, 0x8a, 0xfd, + 0xb4, 0xee, 0x6a, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xa8, 0xbf, 0xb0, 0xee, + 0x4a, 0x0a, 0xff, 0xf7, 0xfd, 0xfe, 0x60, 0x80, 0xea, 0x46, 0xcd, 0xed, + 0x00, 0x8a, 0x8a, 0xed, 0x01, 0x9a, 0x00, 0x25, 0x0f, 0xf2, 0x98, 0x36, + 0x0f, 0xf2, 0x90, 0x3b, 0x0f, 0xf2, 0x84, 0x38, 0x0f, 0xf2, 0x78, 0x39, + 0xf4, 0xee, 0x00, 0x8a, 0x0a, 0xeb, 0x85, 0x00, 0x09, 0xeb, 0x85, 0x01, + 0x90, 0xed, 0x00, 0x0a, 0xd1, 0xed, 0x00, 0x0a, 0xb8, 0xee, 0x40, 0x9a, + 0x69, 0xee, 0x20, 0x0a, 0x60, 0xee, 0x88, 0x0a, 0x20, 0xee, 0xa8, 0x0a, + 0xf0, 0xf7, 0x5e, 0xfd, 0x04, 0xeb, 0x45, 0x07, 0xff, 0xf7, 0xd6, 0xfe, + 0x38, 0x81, 0x08, 0xeb, 0x85, 0x00, 0x90, 0xed, 0x00, 0x0a, 0x29, 0xee, + 0x00, 0x0a, 0x20, 0xee, 0x08, 0x0a, 0x20, 0xee, 0x28, 0x0a, 0xf0, 0xf7, + 0x4d, 0xfd, 0xff, 0xf7, 0xc7, 0xfe, 0xb8, 0x80, 0x60, 0x19, 0x1b, 0xf8, + 0x05, 0x10, 0x81, 0x73, 0x72, 0x5d, 0x02, 0x73, 0x6d, 0x1c, 0x01, 0x2d, + 0xd0, 0xd9, 0x02, 0xb0, 0x00, 0x20, 0xbd, 0xec, 0x06, 0x8b, 0xbd, 0xe8, + 0xf2, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x4f, 0x00, 0x00, 0x80, 0x4e, + 0x2d, 0xe9, 0xf0, 0x47, 0x2d, 0xed, 0x04, 0x8b, 0xdd, 0xf8, 0x34, 0xa0, + 0x0e, 0x9e, 0x0f, 0x9f, 0x9d, 0xed, 0x0c, 0x8a, 0x14, 0x46, 0x98, 0x46, + 0xff, 0xf7, 0xf5, 0xfc, 0x00, 0xf0, 0x88, 0xf8, 0x00, 0xf0, 0x35, 0xf8, + 0x09, 0xee, 0x10, 0x0a, 0xff, 0xf7, 0xe7, 0xfc, 0x00, 0xf0, 0x26, 0xf8, + 0x00, 0xf0, 0x3c, 0xf8, 0x20, 0xee, 0x20, 0x8a, 0xd3, 0xf7, 0x9a, 0xff, + 0x00, 0xf0, 0x2b, 0xf8, 0xc0, 0xee, 0x01, 0x8a, 0xd3, 0xf7, 0x94, 0xff, + 0x01, 0xee, 0x90, 0x0a, 0xb8, 0xee, 0x49, 0x2a, 0x81, 0xee, 0x82, 0x0a, + 0x68, 0xee, 0x28, 0x1a, 0x61, 0xee, 0xa8, 0x1a, 0xca, 0xed, 0x00, 0x1a, + 0x68, 0xee, 0x00, 0x0a, 0x60, 0xee, 0xa8, 0x1a, 0xc6, 0xed, 0x00, 0x1a, + 0x60, 0xee, 0x80, 0x1a, 0xc7, 0xed, 0x00, 0x1a, 0xbd, 0xec, 0x04, 0x8b, + 0xbd, 0xe8, 0xf0, 0x87, 0x81, 0x46, 0x18, 0xee, 0x10, 0x0a, 0xf4, 0xf7, + 0xd8, 0xb9, 0xbd, 0xec, 0x04, 0x8b, 0xbd, 0xe8, 0xf1, 0x8f, 0x05, 0x46, + 0x41, 0x46, 0x20, 0x46, 0xb7, 0xe4, 0x00, 0x21, 0x09, 0xf1, 0x01, 0x02, + 0x00, 0xee, 0x10, 0x0a, 0x01, 0x20, 0xb8, 0xee, 0x68, 0x1a, 0x02, 0xf0, + 0x2d, 0xbf, 0x00, 0x00, 0x01, 0x24, 0x84, 0x40, 0x00, 0xee, 0x10, 0x4a, + 0xb8, 0xee, 0x40, 0x0a, 0xf8, 0xee, 0x48, 0x0a, 0x80, 0xee, 0x20, 0x0a, + 0x01, 0x20, 0x00, 0x21, 0x6a, 0x1c, 0xdf, 0xed, 0x5d, 0x0a, 0x02, 0xf0, + 0x1b, 0xbf, 0x00, 0x00, 0x38, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x08, 0xee, + 0x10, 0x2a, 0xff, 0xf7, 0x94, 0xfc, 0x00, 0xf0, 0x27, 0xf8, 0x04, 0x46, + 0xff, 0xf7, 0xcb, 0xff, 0x05, 0x46, 0x01, 0x20, 0x00, 0x21, 0x62, 0x1c, + 0x02, 0xf0, 0x08, 0xff, 0xd3, 0xf7, 0x3c, 0xff, 0x01, 0x22, 0x02, 0xfa, + 0x05, 0xf5, 0x01, 0xee, 0x10, 0x5a, 0xb8, 0xee, 0x41, 0x1a, 0xf8, 0xee, + 0x48, 0x1a, 0x00, 0xee, 0x10, 0x0a, 0xf8, 0xee, 0x68, 0x0a, 0x81, 0xee, + 0x21, 0x1a, 0x9f, 0xed, 0x49, 0x2a, 0x80, 0xee, 0x20, 0x0a, 0x21, 0xee, + 0x02, 0x2a, 0x22, 0xee, 0x00, 0x2a, 0xbd, 0xec, 0x02, 0x8b, 0x22, 0xee, + 0x00, 0x0a, 0x31, 0xbd, 0x08, 0xee, 0x90, 0x0a, 0xff, 0xf7, 0x61, 0xbc, + 0x10, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x08, 0xee, 0x10, 0x2a, 0xff, 0xf7, + 0x60, 0xfc, 0xff, 0xf7, 0xf3, 0xff, 0x42, 0x1c, 0x01, 0x20, 0x00, 0x21, + 0x02, 0xf0, 0xd8, 0xfe, 0xd3, 0xf7, 0x0c, 0xff, 0x00, 0xee, 0x10, 0x0a, + 0xf8, 0xee, 0x68, 0x0a, 0xc0, 0xee, 0x20, 0x8a, 0xff, 0xf7, 0x8b, 0xff, + 0x01, 0x24, 0x84, 0x40, 0x00, 0xee, 0x10, 0x4a, 0xff, 0xf7, 0x9f, 0xfb, + 0xdf, 0xed, 0x31, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0x20, 0xee, 0x28, 0x0a, + 0xbd, 0xec, 0x02, 0x8b, 0x10, 0xbd, 0x00, 0x00, 0x38, 0xb5, 0x00, 0x25, + 0x14, 0x46, 0x01, 0x29, 0x2d, 0xed, 0x02, 0x8b, 0x18, 0xbf, 0x00, 0x2c, + 0xb0, 0xee, 0x40, 0x8a, 0x41, 0xd0, 0xff, 0xf7, 0x35, 0xfb, 0x00, 0xee, + 0x10, 0x0a, 0x00, 0xee, 0x90, 0x4a, 0xf8, 0xee, 0x60, 0x0a, 0xb8, 0xee, + 0x40, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0xdf, 0xed, 0x22, 0x0a, 0x20, 0xee, + 0x20, 0x0a, 0xd3, 0xf7, 0xf9, 0xfb, 0xb0, 0xee, 0x00, 0x1a, 0x60, 0xee, + 0x01, 0x0a, 0xf8, 0xee, 0x00, 0x1a, 0xf1, 0xee, 0x60, 0x8a, 0x70, 0xee, + 0xa1, 0x0a, 0xb7, 0xee, 0x00, 0x2a, 0x28, 0xee, 0xa8, 0x0a, 0x00, 0xee, + 0x88, 0x2a, 0xf1, 0xee, 0x00, 0x2a, 0x02, 0xee, 0x62, 0x0a, 0xd3, 0xf7, + 0xb1, 0xfe, 0xf1, 0xee, 0x68, 0x0a, 0x70, 0xee, 0xc0, 0x0a, 0xb6, 0xee, + 0x00, 0x1a, 0xb7, 0xee, 0x00, 0x0a, 0x00, 0xee, 0xc1, 0x0a, 0xd3, 0xf7, + 0x55, 0xfe, 0xd3, 0xf7, 0xd9, 0xfb, 0xbd, 0xee, 0xc0, 0x0a, 0x6f, 0xf0, + 0x02, 0x04, 0x10, 0xee, 0x10, 0x0a, 0x20, 0x1a, 0x03, 0xd4, 0x08, 0x28, + 0xac, 0xbf, 0x07, 0x25, 0x05, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xe8, 0xb2, + 0x32, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x7a, 0x44, 0xbd, 0x37, 0x06, 0x34, + 0x01, 0xf0, 0x7f, 0x45, 0x00, 0xf0, 0x7f, 0x45, 0x00, 0x00, 0x80, 0x27, + 0xdb, 0x0f, 0xc9, 0x40, 0x41, 0x42, 0x0f, 0x00, 0x0c, 0x77, 0x02, 0x20, + 0x70, 0xb5, 0x04, 0x46, 0x20, 0x00, 0x2d, 0xed, 0x02, 0x8b, 0x0d, 0x46, + 0xd6, 0xb2, 0x24, 0xd0, 0x80, 0xee, 0x80, 0x0a, 0xd3, 0xf7, 0x04, 0xfd, + 0x01, 0x20, 0xe4, 0x1c, 0xb0, 0xee, 0x40, 0x8a, 0x00, 0xfa, 0x04, 0xf4, + 0x00, 0xee, 0x10, 0x4a, 0xb8, 0xee, 0xc0, 0x0a, 0xf7, 0xee, 0x00, 0x0a, + 0xc0, 0xee, 0x80, 0x0a, 0xb7, 0xee, 0x00, 0x1a, 0x31, 0xee, 0x60, 0x0a, + 0xd3, 0xf7, 0xf0, 0xfc, 0x00, 0xee, 0x90, 0x5a, 0x88, 0xee, 0x00, 0x0a, + 0xf8, 0xee, 0x60, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0xf0, 0xf7, 0xe6, 0xfb, + 0xff, 0xf7, 0x60, 0xfd, 0x86, 0x19, 0xbd, 0xec, 0x02, 0x8b, 0xb0, 0xb2, + 0x70, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0xf3, 0x04, 0x35, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0xf3, 0x04, 0x35, 0xbf, 0x00, 0x00, 0x80, 0xbf, + 0xf3, 0x04, 0x35, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xf3, 0x04, 0x35, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0xf3, 0x04, 0x35, 0x3f, 0x00, 0x00, 0x80, 0x3f, + 0xf3, 0x04, 0x35, 0x3f, 0x00, 0x00, 0x00, 0x80, 0xf3, 0x04, 0x35, 0xbf, + 0x00, 0x00, 0x80, 0xbf, 0xf3, 0x04, 0x35, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xbd, 0x37, 0x86, 0x35, 0xbd, 0x37, 0x86, 0x35, 0xac, 0xc5, 0xa7, 0x36, + 0xbd, 0x37, 0x06, 0x36, 0x00, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x68, 0x02, 0x40, 0x22, 0xfa, 0x01, 0xf0, 0x70, 0x47, 0x30, 0xb5, + 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, + 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, + 0x30, 0xbd, 0x2d, 0xe9, 0xfe, 0x4f, 0x8b, 0x46, 0xdf, 0xf8, 0x48, 0x1a, + 0xdf, 0xf8, 0x90, 0x6a, 0x80, 0x46, 0x51, 0xf8, 0x28, 0xa0, 0x16, 0x20, + 0xf4, 0xf7, 0xa0, 0xf8, 0xdf, 0xf8, 0x84, 0x1a, 0x70, 0x70, 0x5f, 0xfa, + 0x88, 0xf3, 0x0a, 0x68, 0x13, 0x44, 0xed, 0x21, 0x93, 0xf8, 0xbc, 0xc0, + 0x93, 0xf8, 0xbc, 0x30, 0x11, 0xfb, 0x0c, 0xfc, 0x02, 0xeb, 0x0c, 0x01, + 0x01, 0xf2, 0x44, 0x41, 0xd1, 0xf8, 0x7d, 0x40, 0xd1, 0xf8, 0x89, 0x90, + 0x01, 0xf1, 0xc4, 0x05, 0xe0, 0x21, 0x4b, 0x43, 0xd1, 0x18, 0xd1, 0xf8, + 0x57, 0x71, 0x18, 0xb1, 0x50, 0x46, 0x00, 0xf0, 0xfd, 0xfc, 0x05, 0xe0, + 0xda, 0xf8, 0x00, 0x00, 0x40, 0xf0, 0x01, 0x00, 0xca, 0xf8, 0x00, 0x00, + 0x0a, 0xf1, 0x04, 0x00, 0x47, 0xf0, 0x00, 0x47, 0x01, 0x68, 0x2a, 0x7a, + 0x2b, 0x78, 0xdf, 0xf8, 0x2c, 0xea, 0xd2, 0x05, 0x01, 0xf0, 0x7f, 0x41, + 0x02, 0xf4, 0x00, 0x02, 0x11, 0x43, 0xea, 0x79, 0x12, 0x05, 0x02, 0xf4, + 0xe0, 0x02, 0x11, 0x43, 0xaa, 0x79, 0x12, 0x04, 0x02, 0xf4, 0x70, 0x22, + 0x11, 0x43, 0x6a, 0x79, 0xd2, 0x03, 0x02, 0xf4, 0x00, 0x42, 0x11, 0x43, + 0x2a, 0x79, 0x12, 0x03, 0x02, 0xf4, 0xe0, 0x42, 0x11, 0x43, 0xea, 0x78, + 0x12, 0x02, 0x02, 0xf4, 0x70, 0x62, 0x11, 0x43, 0xaa, 0x78, 0xd2, 0x01, + 0x02, 0xf0, 0x80, 0x02, 0x11, 0x43, 0x6a, 0x78, 0x12, 0x01, 0x02, 0xf0, + 0x70, 0x02, 0x11, 0x43, 0x03, 0xf0, 0x0f, 0x03, 0x19, 0x43, 0x01, 0x60, + 0x0a, 0xf1, 0x08, 0x00, 0x0a, 0xf1, 0x0c, 0x01, 0x07, 0x60, 0x44, 0xf0, + 0x00, 0x44, 0x0a, 0xf1, 0x10, 0x02, 0x0c, 0x60, 0x49, 0xf0, 0x00, 0x40, + 0x0a, 0xf1, 0x14, 0x01, 0x10, 0x60, 0x0a, 0x68, 0xdf, 0xf8, 0xb0, 0x09, + 0x02, 0x43, 0x0a, 0x60, 0x0a, 0xf1, 0x18, 0x01, 0x0a, 0x68, 0xbb, 0xf8, + 0x00, 0x30, 0xbb, 0xf8, 0x02, 0x40, 0x02, 0xf0, 0xf0, 0x22, 0x0e, 0xea, + 0x03, 0x40, 0x02, 0x43, 0xc4, 0xf3, 0x0b, 0x04, 0x22, 0x43, 0x0a, 0x60, + 0x0a, 0xf1, 0x34, 0x00, 0x00, 0x90, 0x0a, 0xf5, 0x9a, 0x71, 0xdf, 0xf8, + 0x84, 0x09, 0x01, 0x91, 0x00, 0x24, 0x00, 0xeb, 0x48, 0x09, 0x5d, 0xf8, + 0x24, 0x00, 0x01, 0x68, 0x0b, 0xeb, 0x04, 0x02, 0x09, 0xeb, 0x04, 0x07, + 0x93, 0x7b, 0x09, 0xf8, 0x04, 0x30, 0x00, 0x23, 0x15, 0x7b, 0x3d, 0x74, + 0x01, 0xf0, 0xc0, 0x21, 0xdf, 0xf8, 0x5c, 0x59, 0x05, 0xeb, 0x48, 0x07, + 0x3b, 0x55, 0x0b, 0xeb, 0x44, 0x03, 0x95, 0x7b, 0x12, 0x7b, 0x2d, 0x07, + 0x05, 0xf0, 0x40, 0x55, 0x29, 0x43, 0x1d, 0x89, 0x0e, 0xea, 0x05, 0x47, + 0x12, 0x03, 0x39, 0x43, 0x02, 0xf4, 0x40, 0x52, 0x11, 0x43, 0x9a, 0x88, + 0xc2, 0xf3, 0x0b, 0x02, 0x64, 0x1c, 0x11, 0x43, 0x02, 0x2c, 0x01, 0x60, + 0xd3, 0xd3, 0xa0, 0x20, 0x00, 0xfb, 0x08, 0xf0, 0x00, 0x25, 0x06, 0xeb, + 0xc8, 0x07, 0x34, 0x18, 0x4f, 0xf0, 0x50, 0x09, 0x03, 0x21, 0x00, 0x91, + 0x00, 0x22, 0x09, 0xfb, 0x05, 0xf1, 0x61, 0x18, 0x01, 0xf1, 0xa4, 0x03, + 0x00, 0x21, 0x01, 0x20, 0xf0, 0xf7, 0xfc, 0xfc, 0x07, 0xeb, 0x85, 0x01, + 0x6d, 0x1c, 0x02, 0x2d, 0x48, 0x62, 0xed, 0xd3, 0x00, 0x25, 0x09, 0xfb, + 0x05, 0xf0, 0x20, 0x18, 0x00, 0xf2, 0xa4, 0x51, 0x01, 0x20, 0xf0, 0xf7, + 0x1d, 0xfd, 0x07, 0xeb, 0x85, 0x01, 0x6d, 0x1c, 0x02, 0x2d, 0x48, 0x66, + 0xf1, 0xd3, 0x41, 0x20, 0xeb, 0xf7, 0xf0, 0xfa, 0x01, 0x21, 0x01, 0xfa, + 0x08, 0xf4, 0x44, 0xea, 0x00, 0x01, 0x41, 0x20, 0xeb, 0xf7, 0xbd, 0xfa, + 0x42, 0x20, 0xeb, 0xf7, 0xe5, 0xfa, 0x44, 0xea, 0x00, 0x01, 0x42, 0x20, + 0xeb, 0xf7, 0xb5, 0xfa, 0x30, 0x78, 0xa8, 0xb9, 0x41, 0x20, 0xeb, 0xf7, + 0x1f, 0xfa, 0x42, 0x20, 0xeb, 0xf7, 0x1c, 0xfa, 0x06, 0x21, 0x41, 0x20, + 0xeb, 0xf7, 0x83, 0xfa, 0x06, 0x21, 0x42, 0x20, 0xeb, 0xf7, 0x7f, 0xfa, + 0x41, 0x20, 0xeb, 0xf7, 0x62, 0xfa, 0x42, 0x20, 0xeb, 0xf7, 0x5f, 0xfa, + 0x01, 0x21, 0x31, 0x70, 0x70, 0x78, 0x10, 0xb1, 0x50, 0x46, 0x00, 0xf0, + 0x18, 0xfc, 0xbd, 0xe8, 0xf7, 0x8f, 0x0b, 0x46, 0x11, 0x46, 0xdf, 0xf8, + 0x54, 0x28, 0x80, 0xb5, 0x02, 0xeb, 0xc0, 0x00, 0x1b, 0x09, 0x00, 0xeb, + 0x83, 0x03, 0x58, 0x6e, 0xf0, 0xf7, 0x5e, 0xfe, 0x08, 0xb9, 0x02, 0x20, + 0x02, 0xbd, 0x00, 0x20, 0x02, 0xbd, 0x38, 0xb5, 0xdf, 0xf8, 0x30, 0x58, + 0x05, 0xeb, 0xc0, 0x00, 0x0c, 0x46, 0x24, 0x09, 0x00, 0xeb, 0x84, 0x04, + 0x00, 0x23, 0x60, 0x6e, 0x00, 0x22, 0x00, 0x21, 0xf0, 0xf7, 0xfd, 0xfc, + 0x40, 0x1e, 0xdf, 0xf8, 0x2c, 0x28, 0x80, 0x41, 0x4f, 0xf0, 0x80, 0x51, + 0xc0, 0x0f, 0x11, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, + 0x32, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x81, 0x46, 0xdf, 0xf8, 0xa8, 0x07, + 0x50, 0xf8, 0x29, 0x80, 0x0e, 0x46, 0x00, 0x24, 0x35, 0x09, 0x01, 0x2d, + 0x08, 0xbf, 0x08, 0xf5, 0x80, 0x78, 0x08, 0xf1, 0x28, 0x00, 0x93, 0x46, + 0x00, 0x68, 0xc0, 0x0f, 0x9a, 0x46, 0x18, 0xbf, 0x4b, 0xf2, 0x03, 0x24, + 0x2a, 0xd1, 0xdf, 0xf8, 0xcc, 0x77, 0x07, 0xeb, 0xc9, 0x02, 0x02, 0xeb, + 0x85, 0x03, 0x00, 0x21, 0x58, 0x6a, 0xf0, 0xf7, 0x1b, 0xfe, 0x07, 0xeb, + 0x49, 0x01, 0x48, 0x19, 0x04, 0x75, 0x06, 0x71, 0xdf, 0xf8, 0xc8, 0x07, + 0x00, 0xeb, 0xc9, 0x01, 0x41, 0xf8, 0x25, 0xa0, 0x78, 0x78, 0x10, 0xb1, + 0x40, 0x46, 0x00, 0xf0, 0xa9, 0xfb, 0x06, 0x20, 0xeb, 0xf7, 0x1a, 0xfa, + 0x06, 0x46, 0x5a, 0x46, 0x29, 0x46, 0x48, 0x46, 0x00, 0xf0, 0x0b, 0xf8, + 0x30, 0x46, 0x80, 0xf3, 0x11, 0x88, 0x78, 0x78, 0x10, 0xb1, 0x40, 0x46, + 0x00, 0xf0, 0xa5, 0xfb, 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x8f, 0x2d, 0xe9, + 0xf8, 0x4f, 0xdf, 0xf8, 0x20, 0x37, 0x53, 0xf8, 0x20, 0x80, 0x01, 0x29, + 0x08, 0xbf, 0x08, 0xf5, 0x80, 0x78, 0x14, 0x46, 0x08, 0xf1, 0x20, 0x02, + 0x13, 0x68, 0x03, 0xf0, 0x40, 0x43, 0x13, 0x60, 0x08, 0xf1, 0x28, 0x03, + 0xdf, 0xf8, 0x68, 0x27, 0x1b, 0x68, 0xa5, 0x78, 0x66, 0x78, 0x6d, 0x07, + 0x13, 0x40, 0x22, 0x78, 0x05, 0xf0, 0x00, 0x55, 0x12, 0x06, 0x2b, 0x43, + 0x02, 0xf0, 0x40, 0x72, 0x13, 0x43, 0xa5, 0x68, 0xdf, 0xf8, 0x4c, 0x27, + 0x15, 0x40, 0xb6, 0x07, 0x2b, 0x43, 0x06, 0xf0, 0x80, 0x46, 0x08, 0xf1, + 0x28, 0x05, 0x33, 0x43, 0x2b, 0x60, 0x08, 0xf1, 0x2c, 0x03, 0xdf, 0xf8, + 0x38, 0x27, 0x1d, 0x68, 0x26, 0x7c, 0xb6, 0x05, 0x15, 0x40, 0x62, 0x7c, + 0x06, 0xf4, 0x40, 0x06, 0x12, 0x03, 0x35, 0x43, 0x02, 0xf4, 0xe0, 0x42, + 0x15, 0x43, 0xa2, 0x7c, 0x92, 0x02, 0x02, 0xf4, 0x40, 0x62, 0x15, 0x43, + 0x45, 0xf0, 0x40, 0x75, 0x1d, 0x60, 0x08, 0xf1, 0x30, 0x03, 0x04, 0xf1, + 0x98, 0x05, 0x1e, 0x68, 0xe7, 0x7c, 0x6a, 0x89, 0x06, 0xf0, 0x7f, 0x46, + 0x46, 0xea, 0x07, 0x46, 0x16, 0x43, 0x1e, 0x60, 0xdf, 0xf8, 0xd8, 0x36, + 0x26, 0x7d, 0x03, 0xeb, 0x40, 0x02, 0x53, 0x5c, 0x9e, 0x42, 0x01, 0xbf, + 0x66, 0x7d, 0x52, 0x18, 0x13, 0x7c, 0x9e, 0x42, 0x15, 0xd0, 0xdf, 0xf8, + 0xc4, 0x66, 0x06, 0xeb, 0x40, 0x03, 0x01, 0x22, 0x5a, 0x54, 0x08, 0xf1, + 0x34, 0x01, 0x0a, 0x68, 0x23, 0x7d, 0x1b, 0x07, 0x22, 0xf0, 0x30, 0x22, + 0x03, 0xf0, 0x40, 0x53, 0x1a, 0x43, 0x63, 0x7d, 0x1b, 0x03, 0x03, 0xf4, + 0x40, 0x53, 0x1a, 0x43, 0x0a, 0x60, 0x08, 0xf1, 0x38, 0x01, 0x04, 0xf1, + 0x28, 0x06, 0x0a, 0x68, 0xa3, 0x69, 0xdf, 0xf8, 0xa4, 0xc6, 0x0b, 0x60, + 0x08, 0xf1, 0x3c, 0x01, 0x04, 0xf1, 0x22, 0x07, 0x0a, 0x68, 0x09, 0x68, + 0x08, 0xf1, 0x40, 0x01, 0x0a, 0x68, 0x22, 0xf0, 0x00, 0x42, 0x0a, 0x60, + 0x08, 0xf1, 0x44, 0x01, 0x0a, 0x68, 0x22, 0xf0, 0x00, 0x42, 0x0a, 0x60, + 0x08, 0xf1, 0x48, 0x01, 0x0a, 0x68, 0xe3, 0x78, 0x02, 0xf4, 0x40, 0x42, + 0x42, 0xea, 0xc3, 0x72, 0x23, 0x79, 0x9b, 0x07, 0x03, 0xf0, 0x80, 0x43, + 0x1a, 0x43, 0x33, 0x7a, 0x1b, 0x07, 0x03, 0xf0, 0x40, 0x53, 0x1a, 0x43, + 0x73, 0x7a, 0xdb, 0x06, 0x03, 0xf0, 0x00, 0x63, 0x1a, 0x43, 0x33, 0x7b, + 0x9b, 0x06, 0x03, 0xf0, 0x80, 0x63, 0x1a, 0x43, 0x73, 0x89, 0x0c, 0xea, + 0x03, 0x43, 0x1a, 0x43, 0x94, 0xf8, 0x20, 0x30, 0x1b, 0x03, 0x03, 0xf4, + 0x40, 0x53, 0x1a, 0x43, 0x94, 0xf8, 0x21, 0x30, 0xdb, 0x02, 0x03, 0xf4, + 0x00, 0x63, 0x1a, 0x43, 0xbb, 0x78, 0x9b, 0x02, 0x03, 0xf4, 0x80, 0x63, + 0x1a, 0x43, 0x3b, 0x88, 0xc3, 0xf3, 0x09, 0x03, 0x1a, 0x43, 0x0a, 0x60, + 0xdf, 0xf8, 0x10, 0x16, 0x51, 0xf8, 0x20, 0x00, 0x94, 0xf8, 0x20, 0x10, + 0x2c, 0x30, 0x01, 0x29, 0x08, 0xbf, 0x33, 0x79, 0x03, 0xd0, 0x31, 0x7a, + 0x01, 0x29, 0x04, 0xd1, 0x33, 0x7d, 0x07, 0x22, 0x00, 0x21, 0xff, 0xf7, + 0x82, 0xfd, 0x08, 0xf1, 0x4c, 0x01, 0xdf, 0xf8, 0xec, 0x05, 0x0a, 0x68, + 0xe3, 0x68, 0x02, 0x40, 0xdf, 0xf8, 0xe4, 0x05, 0x00, 0xea, 0x03, 0x40, + 0x73, 0x7b, 0x1b, 0x02, 0x02, 0x43, 0x03, 0xf4, 0xe0, 0x63, 0x1a, 0x43, + 0xfb, 0x78, 0x03, 0xf0, 0x07, 0x03, 0x1a, 0x43, 0x40, 0xf6, 0x08, 0x00, + 0x02, 0x43, 0x08, 0xf1, 0x50, 0x00, 0x0a, 0x60, 0x04, 0xf1, 0x50, 0x07, + 0x01, 0x68, 0x32, 0x68, 0x02, 0x60, 0x08, 0xf1, 0x54, 0x00, 0x08, 0xf1, + 0x58, 0x02, 0x03, 0x68, 0x31, 0x69, 0x01, 0x60, 0x04, 0xf1, 0x70, 0x0c, + 0x13, 0x68, 0xb1, 0x7e, 0x70, 0x7e, 0x00, 0xf0, 0xf9, 0xf8, 0x30, 0x7e, + 0x01, 0xf0, 0x80, 0x41, 0x00, 0x07, 0x0b, 0x43, 0x39, 0x78, 0x00, 0xf0, + 0x40, 0x50, 0x89, 0x06, 0x03, 0x43, 0x78, 0x78, 0x01, 0xf0, 0x40, 0x61, + 0x00, 0x06, 0x0b, 0x43, 0x00, 0xf0, 0x80, 0x70, 0x03, 0x43, 0xb8, 0x78, + 0x00, 0xf0, 0xdf, 0xf8, 0xf8, 0x78, 0x00, 0xf0, 0xd7, 0xf8, 0xd6, 0xe9, + 0x08, 0x01, 0x00, 0x0e, 0x40, 0xea, 0x01, 0x20, 0x80, 0xb2, 0x03, 0x43, + 0x13, 0x60, 0x08, 0xf1, 0x5c, 0x02, 0x13, 0x68, 0xb9, 0x7a, 0x78, 0x7a, + 0x03, 0xf0, 0x70, 0x73, 0x89, 0x07, 0x43, 0xea, 0xc0, 0x73, 0x38, 0x7a, + 0x00, 0xf0, 0xd2, 0xf8, 0x38, 0x7e, 0x80, 0x06, 0x00, 0xf0, 0x40, 0x60, + 0x03, 0x43, 0xb8, 0x7e, 0x00, 0xf0, 0xbf, 0xf8, 0xf8, 0x7e, 0xd7, 0xe9, + 0x04, 0xab, 0x00, 0xf0, 0xb5, 0xf8, 0x4f, 0xea, 0x1a, 0x60, 0x40, 0xea, + 0x0b, 0x20, 0x80, 0xb2, 0x03, 0x43, 0x13, 0x60, 0x08, 0xf1, 0x60, 0x02, + 0x13, 0x68, 0x9c, 0xf8, 0x02, 0x10, 0x9c, 0xf8, 0x01, 0x00, 0x00, 0xf0, + 0xaf, 0xf8, 0x9c, 0xf8, 0x00, 0x00, 0x00, 0xf0, 0xb1, 0xf8, 0x9c, 0xf8, + 0x10, 0x00, 0x80, 0x06, 0x00, 0xf0, 0x40, 0x60, 0x03, 0x43, 0x9c, 0xf8, + 0x11, 0x00, 0x00, 0x06, 0x00, 0xf0, 0x80, 0x70, 0x03, 0x43, 0x9c, 0xf8, + 0x12, 0x00, 0x00, 0xf0, 0x96, 0xf8, 0x9c, 0xf8, 0x13, 0x00, 0xdc, 0xe9, + 0x02, 0x49, 0x00, 0xf0, 0x8b, 0xf8, 0x20, 0x0e, 0x40, 0xea, 0x09, 0x20, + 0x80, 0xb2, 0x03, 0x43, 0x08, 0xf1, 0x64, 0x0e, 0x13, 0x60, 0xde, 0xf8, + 0x00, 0x00, 0x9c, 0xf8, 0x19, 0x10, 0x00, 0xf0, 0x70, 0x70, 0x40, 0xea, + 0xc1, 0x70, 0x9c, 0xf8, 0x1a, 0x10, 0x89, 0x07, 0x01, 0xf0, 0x80, 0x41, + 0x08, 0x43, 0x9c, 0xf8, 0x18, 0x10, 0x09, 0x07, 0x01, 0xf0, 0x40, 0x51, + 0x08, 0x43, 0x29, 0x78, 0x89, 0x06, 0x01, 0xf0, 0x40, 0x61, 0x08, 0x43, + 0xa9, 0x78, 0x49, 0x05, 0x01, 0xf4, 0x00, 0x11, 0x08, 0x43, 0xe9, 0x78, + 0xdc, 0xe9, 0x08, 0x23, 0x09, 0x04, 0x01, 0xf4, 0xf8, 0x11, 0x08, 0x43, + 0x00, 0x90, 0x10, 0x0e, 0x40, 0xea, 0x03, 0x20, 0x00, 0x99, 0x80, 0xb2, + 0x08, 0x43, 0xce, 0xf8, 0x00, 0x00, 0x08, 0xf1, 0x68, 0x03, 0x18, 0x68, + 0x00, 0xf0, 0xff, 0x00, 0x00, 0x90, 0xd6, 0xe9, 0x08, 0x01, 0x00, 0x9e, + 0x46, 0xea, 0x00, 0x26, 0x08, 0xf1, 0x6c, 0x00, 0x1e, 0x60, 0x01, 0x68, + 0x01, 0xf0, 0xff, 0x01, 0x41, 0xea, 0x0a, 0x21, 0x01, 0x60, 0x08, 0xf1, + 0x70, 0x00, 0x01, 0x68, 0x01, 0xf0, 0xff, 0x01, 0x41, 0xea, 0x04, 0x21, + 0x01, 0x60, 0x08, 0xf1, 0x74, 0x00, 0x01, 0x68, 0x01, 0xf0, 0xff, 0x01, + 0x41, 0xea, 0x02, 0x21, 0x01, 0x60, 0x08, 0xf1, 0x78, 0x00, 0x01, 0x68, + 0x6b, 0x7a, 0x2a, 0x7a, 0x01, 0xf0, 0xc0, 0x41, 0x1b, 0x06, 0x41, 0xea, + 0xc2, 0x71, 0xea, 0x68, 0x03, 0xf0, 0xf8, 0x53, 0x19, 0x43, 0x22, 0xf0, + 0x7f, 0x42, 0x11, 0x43, 0x01, 0x60, 0x08, 0xf1, 0x7c, 0x00, 0x01, 0x23, + 0x01, 0x68, 0x7a, 0x68, 0x02, 0x60, 0x08, 0xf1, 0x80, 0x00, 0x01, 0x68, + 0xfa, 0x69, 0x02, 0x60, 0x08, 0xf1, 0x84, 0x00, 0x01, 0x68, 0xdc, 0xf8, + 0x14, 0x20, 0x02, 0x60, 0x08, 0xf1, 0x88, 0x00, 0x01, 0x68, 0x6a, 0x68, + 0x02, 0x60, 0x08, 0xf1, 0x28, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, + 0x4f, 0xf0, 0x00, 0x42, 0x1f, 0x21, 0x64, 0xe4, 0x00, 0x04, 0x00, 0xf4, + 0xf8, 0x10, 0x03, 0x43, 0x70, 0x47, 0x40, 0x05, 0x00, 0xf4, 0x00, 0x10, + 0x03, 0x43, 0x70, 0x47, 0x03, 0xf0, 0x30, 0x73, 0x89, 0x07, 0x43, 0xea, + 0xc0, 0x73, 0x70, 0x47, 0x01, 0xf0, 0x80, 0x41, 0x00, 0x07, 0x0b, 0x43, + 0x00, 0xf0, 0x40, 0x50, 0x03, 0x43, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x47, + 0xdf, 0xf8, 0x4c, 0x43, 0x80, 0x46, 0xbf, 0x48, 0x00, 0x26, 0x0d, 0x09, + 0x11, 0x46, 0x04, 0xeb, 0xc8, 0x02, 0x02, 0xeb, 0x85, 0x03, 0x50, 0xf8, + 0x28, 0x90, 0x58, 0x6a, 0x01, 0x2d, 0x08, 0xbf, 0x09, 0xf5, 0x80, 0x79, + 0xf0, 0xf7, 0xd2, 0xfb, 0x09, 0xf1, 0x28, 0x07, 0xe0, 0xb9, 0x04, 0xeb, + 0x48, 0x00, 0x28, 0x44, 0x01, 0x21, 0x01, 0x75, 0x60, 0x78, 0x10, 0xb1, + 0x48, 0x46, 0x00, 0xf0, 0x63, 0xf9, 0x00, 0x23, 0x4f, 0xf0, 0x00, 0x42, + 0x1f, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x23, 0xfc, 0x60, 0x78, 0x10, 0xb1, + 0x48, 0x46, 0x00, 0xf0, 0x64, 0xf9, 0x64, 0x21, 0x38, 0x68, 0xc0, 0x0f, + 0x01, 0xd0, 0x49, 0x1e, 0xfa, 0xd1, 0x02, 0x26, 0xdf, 0xf8, 0xf8, 0x02, + 0x00, 0xeb, 0x48, 0x00, 0x41, 0x5d, 0x01, 0x29, 0x23, 0xd1, 0x00, 0x22, + 0x42, 0x55, 0x09, 0xf1, 0x34, 0x0a, 0xdf, 0xf8, 0xe0, 0x02, 0xda, 0xf8, + 0x00, 0x10, 0x00, 0xeb, 0x48, 0x00, 0x21, 0xf0, 0x30, 0x22, 0x41, 0x5d, + 0x09, 0x07, 0x01, 0xf0, 0x40, 0x51, 0x28, 0x44, 0x0a, 0x43, 0x01, 0x7c, + 0x60, 0x78, 0x09, 0x03, 0x01, 0xf4, 0x40, 0x51, 0x41, 0xea, 0x02, 0x05, + 0x10, 0xb1, 0x48, 0x46, 0x00, 0xf0, 0x2c, 0xf9, 0xca, 0xf8, 0x00, 0x50, + 0x60, 0x78, 0x10, 0xb1, 0x48, 0x46, 0x00, 0xf0, 0x32, 0xf9, 0x38, 0x68, + 0xc0, 0x0f, 0x18, 0xbf, 0x01, 0x26, 0x30, 0x46, 0xbd, 0xe8, 0xf0, 0x87, + 0x38, 0xb5, 0x00, 0xf0, 0x23, 0xf8, 0x08, 0xbf, 0x04, 0xf5, 0x80, 0x74, + 0x10, 0xb1, 0x20, 0x46, 0x00, 0xf0, 0x14, 0xf9, 0x04, 0xf1, 0x90, 0x02, + 0x4f, 0xf4, 0x00, 0x11, 0x11, 0x60, 0x68, 0x78, 0x00, 0xb1, 0x1c, 0xe0, + 0x31, 0xbd, 0x38, 0xb5, 0x00, 0xf0, 0x10, 0xf8, 0x08, 0xbf, 0x04, 0xf5, + 0x80, 0x74, 0x10, 0xb1, 0x20, 0x46, 0x00, 0xf0, 0x01, 0xf9, 0x04, 0xf1, + 0x90, 0x02, 0x4f, 0xf4, 0x80, 0x11, 0x11, 0x60, 0x68, 0x78, 0x00, 0xb1, + 0x09, 0xe0, 0x31, 0xbd, 0x7a, 0x4a, 0xdf, 0xf8, 0x34, 0x52, 0x52, 0xf8, + 0x20, 0x40, 0x68, 0x78, 0x09, 0x09, 0x01, 0x29, 0x70, 0x47, 0x20, 0x46, + 0xbd, 0xe8, 0x32, 0x40, 0xf7, 0xe0, 0xdf, 0xf8, 0x58, 0x22, 0x52, 0xf8, + 0x20, 0x00, 0x09, 0x09, 0x01, 0xd1, 0x8c, 0x30, 0x70, 0x47, 0x00, 0xf5, + 0xc6, 0x70, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, 0x80, 0x46, 0xdf, 0xf8, + 0x00, 0x72, 0x0c, 0x46, 0x07, 0xeb, 0x48, 0x00, 0x05, 0x19, 0xac, 0xb0, + 0x29, 0x79, 0xdf, 0xf8, 0x0c, 0x02, 0x8d, 0xf8, 0x00, 0x10, 0x00, 0xeb, + 0xc8, 0x02, 0x40, 0x46, 0x52, 0xf8, 0x24, 0x90, 0xff, 0xf7, 0xdf, 0xff, + 0x82, 0x46, 0x00, 0x22, 0x62, 0x48, 0x01, 0x92, 0x50, 0xf8, 0x28, 0xb0, + 0x78, 0x78, 0x18, 0xb1, 0x00, 0xf0, 0x8a, 0xf8, 0x00, 0xbf, 0x00, 0xbf, + 0x4f, 0xf0, 0x00, 0x40, 0x00, 0x2c, 0x07, 0xbf, 0x0b, 0xf1, 0x8c, 0x01, + 0x08, 0x60, 0x0b, 0xf5, 0xc6, 0x72, 0x10, 0x60, 0x78, 0x78, 0x10, 0xb1, + 0x00, 0x23, 0x00, 0xf0, 0x7a, 0xf8, 0x9d, 0xf8, 0x00, 0x00, 0x90, 0xb1, + 0x01, 0x28, 0x15, 0xd0, 0x02, 0x28, 0x18, 0xd0, 0x03, 0x28, 0x1b, 0xd0, + 0x04, 0x28, 0x1e, 0xd0, 0x10, 0x28, 0x21, 0xd0, 0x11, 0x28, 0x24, 0xd0, + 0x12, 0x28, 0x27, 0xd0, 0x13, 0x28, 0x2a, 0xd0, 0x14, 0x28, 0x2d, 0xd0, + 0x31, 0xe0, 0x00, 0xf0, 0x5c, 0xf8, 0x05, 0xf0, 0x29, 0xfd, 0x2b, 0xe0, + 0x00, 0xf0, 0x57, 0xf8, 0x01, 0x20, 0xc0, 0x46, 0x26, 0xe0, 0x00, 0xf0, + 0x52, 0xf8, 0x01, 0x20, 0xc0, 0x46, 0x21, 0xe0, 0x00, 0xf0, 0x4d, 0xf8, + 0x01, 0x20, 0xc0, 0x46, 0x1c, 0xe0, 0x00, 0xf0, 0x48, 0xf8, 0x01, 0x20, + 0xc0, 0x46, 0x17, 0xe0, 0x00, 0xf0, 0x43, 0xf8, 0x01, 0x20, 0xc0, 0x46, + 0x12, 0xe0, 0x00, 0xf0, 0x3e, 0xf8, 0x01, 0x20, 0xc0, 0x46, 0x0d, 0xe0, + 0x00, 0xf0, 0x39, 0xf8, 0x01, 0x20, 0xc0, 0x46, 0x08, 0xe0, 0x00, 0xf0, + 0x34, 0xf8, 0x01, 0x20, 0xc0, 0x46, 0x03, 0xe0, 0x00, 0xf0, 0x2f, 0xf8, + 0x01, 0x20, 0xc0, 0x46, 0x06, 0x46, 0x28, 0x7d, 0x00, 0x28, 0x04, 0xbf, + 0xf6, 0xb2, 0x00, 0x2e, 0x10, 0xd1, 0x78, 0x78, 0x18, 0xb1, 0x00, 0xf0, + 0x27, 0xf8, 0x00, 0xbf, 0x00, 0xbf, 0x02, 0xaa, 0x21, 0x46, 0x40, 0x46, + 0xff, 0xf7, 0xc1, 0xfc, 0x78, 0x78, 0xa8, 0xb1, 0x00, 0x23, 0x00, 0xf0, + 0x1c, 0xf8, 0x11, 0xe0, 0x07, 0xeb, 0xc8, 0x00, 0x00, 0xeb, 0x84, 0x02, + 0x01, 0xa9, 0x50, 0x6a, 0xf0, 0xf7, 0x10, 0xfa, 0x01, 0x98, 0x38, 0xb1, + 0x3a, 0x48, 0x4f, 0xf0, 0x80, 0x51, 0x01, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, + 0xbf, 0xf3, 0x6f, 0x8f, 0x2d, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x02, 0xab, + 0x52, 0x46, 0x49, 0x46, 0x40, 0x46, 0x70, 0x47, 0x01, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x58, 0x46, 0xff, 0xf7, 0xf7, 0xba, 0x38, 0xb5, 0x41, 0x20, + 0xea, 0xf7, 0x33, 0xfe, 0x04, 0x46, 0x00, 0x25, 0x24, 0xfa, 0x05, 0xf0, + 0xc0, 0x07, 0x03, 0xd5, 0x00, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x42, 0xff, + 0x6d, 0x1c, 0x08, 0x2d, 0xf4, 0xd3, 0x31, 0xbd, 0x38, 0xb5, 0x42, 0x20, + 0xea, 0xf7, 0x21, 0xfe, 0x04, 0x46, 0x00, 0x25, 0x24, 0xfa, 0x05, 0xf0, + 0xc0, 0x07, 0x03, 0xd5, 0x01, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x30, 0xff, + 0x6d, 0x1c, 0x08, 0x2d, 0xf4, 0xd3, 0x31, 0xbd, 0x04, 0x49, 0x51, 0xf8, + 0x20, 0x10, 0x51, 0xf8, 0x14, 0x2f, 0x18, 0x48, 0x02, 0x43, 0x0a, 0x60, + 0x70, 0x47, 0x00, 0x00, 0xe8, 0x97, 0x04, 0x01, 0x38, 0xb5, 0x00, 0xf0, + 0x17, 0xf8, 0x40, 0xf4, 0x80, 0x73, 0x2a, 0x46, 0x00, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0xbd, 0xfa, 0x00, 0xbf, 0x00, 0xbf, 0x31, 0xbd, 0x38, 0xb5, + 0x00, 0xf0, 0x0a, 0xf8, 0x20, 0xf4, 0x80, 0x73, 0x2a, 0x46, 0x20, 0x46, + 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x00, 0x21, 0xff, 0xf7, 0xad, 0xba, + 0x00, 0xf1, 0x2c, 0x04, 0x40, 0xf2, 0xff, 0x35, 0x2a, 0x46, 0x00, 0x21, + 0x20, 0x46, 0xff, 0xf7, 0x9f, 0xba, 0x00, 0x00, 0x48, 0x1e, 0x02, 0x20, + 0xb4, 0x76, 0x02, 0x20, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x88, 0x08, + 0x2c, 0x74, 0x02, 0x20, 0xd0, 0x76, 0x02, 0x20, 0x04, 0xed, 0x00, 0xe0, + 0x68, 0x72, 0x02, 0x20, 0x0f, 0x00, 0xc0, 0x9c, 0xf0, 0xff, 0x3f, 0x00, + 0xff, 0x83, 0x00, 0xfc, 0x00, 0x00, 0xff, 0x03, 0x28, 0x97, 0x04, 0x01, + 0xf0, 0xf0, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x3f, 0xe8, 0x97, 0x04, 0x01, + 0x49, 0x08, 0x49, 0x00, 0xa0, 0xf1, 0x20, 0x03, 0x4f, 0xf0, 0x80, 0x7c, + 0x99, 0x61, 0x1a, 0x60, 0xc3, 0xf8, 0x1c, 0xc0, 0x6f, 0xf0, 0x02, 0x02, + 0x0f, 0xf2, 0x0d, 0x01, 0x59, 0x61, 0x40, 0xf8, 0x24, 0x2d, 0x20, 0x38, + 0x70, 0x47, 0x00, 0x00, 0x30, 0x20, 0x80, 0xf3, 0x11, 0x88, 0xbf, 0xf3, + 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0xfe, 0xe7, 0x80, 0xb5, 0x20, 0x48, + 0x01, 0x68, 0x41, 0xf4, 0x70, 0x01, 0x01, 0x60, 0x02, 0x68, 0x42, 0xf0, + 0x70, 0x42, 0x02, 0x60, 0x00, 0xf0, 0x3e, 0xf8, 0x1b, 0x49, 0x00, 0x20, + 0x08, 0x60, 0x05, 0xf0, 0xaf, 0xfd, 0x1a, 0x48, 0x01, 0x68, 0x41, 0xf0, + 0x40, 0x41, 0x01, 0x60, 0x05, 0xf0, 0x98, 0xfd, 0x00, 0x20, 0x02, 0xbd, + 0x30, 0x20, 0x80, 0xf3, 0x11, 0x88, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, + 0x6f, 0x8f, 0x11, 0x48, 0x01, 0x68, 0x49, 0x1c, 0x01, 0x60, 0x70, 0x47, + 0x0e, 0x49, 0x08, 0x68, 0x40, 0x1e, 0x08, 0x60, 0x08, 0xbf, 0x80, 0xf3, + 0x11, 0x88, 0x70, 0x47, 0x80, 0xb5, 0x30, 0x20, 0x80, 0xf3, 0x11, 0x88, + 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0xee, 0xf7, 0x93, 0xfe, + 0x18, 0xb1, 0x07, 0x49, 0x4f, 0xf0, 0x80, 0x50, 0x08, 0x60, 0x00, 0x22, + 0x82, 0xf3, 0x11, 0x88, 0x01, 0xbd, 0x00, 0x00, 0x20, 0xed, 0x00, 0xe0, + 0xac, 0x55, 0x00, 0x20, 0x34, 0xef, 0x00, 0xe0, 0x04, 0xed, 0x00, 0xe0, + 0x07, 0x48, 0x08, 0x4b, 0xdf, 0xf8, 0x20, 0xc0, 0x00, 0x21, 0x01, 0x60, + 0x81, 0x60, 0x19, 0x68, 0xa1, 0xfb, 0x0c, 0xc2, 0x52, 0x0a, 0x52, 0x1e, + 0x42, 0x60, 0x07, 0x21, 0x01, 0x60, 0x70, 0x47, 0x10, 0xe0, 0x00, 0xe0, + 0x84, 0x77, 0x02, 0x20, 0x98, 0x6e, 0x12, 0x83, 0x4f, 0xf0, 0xff, 0x32, + 0x00, 0xf1, 0x08, 0x01, 0x82, 0x60, 0x41, 0x60, 0xc1, 0x60, 0x00, 0xf1, + 0x08, 0x02, 0x02, 0x61, 0x00, 0x21, 0x01, 0x60, 0x70, 0x47, 0x42, 0x68, + 0x4a, 0x60, 0x93, 0x68, 0x8b, 0x60, 0xd2, 0xf8, 0x08, 0xc0, 0xcc, 0xf8, + 0x04, 0x10, 0x91, 0x60, 0x08, 0x61, 0x01, 0x68, 0x49, 0x1c, 0x01, 0x60, + 0x70, 0x47, 0x30, 0xb4, 0x0a, 0x68, 0x12, 0xf1, 0x01, 0x0f, 0x08, 0xbf, + 0x03, 0x69, 0x07, 0xd0, 0x00, 0xf1, 0x08, 0x03, 0x00, 0xe0, 0x23, 0x46, + 0x5c, 0x68, 0x25, 0x68, 0xaa, 0x42, 0xfa, 0xd2, 0x5a, 0x68, 0x4a, 0x60, + 0x91, 0x60, 0x8b, 0x60, 0x59, 0x60, 0x08, 0x61, 0x01, 0x68, 0x49, 0x1c, + 0x01, 0x60, 0x30, 0xbc, 0x70, 0x47, 0x43, 0x68, 0x01, 0x69, 0x82, 0x68, + 0x9a, 0x60, 0x83, 0x68, 0x42, 0x68, 0x5a, 0x60, 0x4a, 0x68, 0x82, 0x42, + 0x04, 0xbf, 0x83, 0x68, 0x4b, 0x60, 0x00, 0x22, 0x02, 0x61, 0x08, 0x68, + 0x40, 0x1e, 0x08, 0x60, 0x08, 0x68, 0x70, 0x47, 0x02, 0xf0, 0x28, 0xbf, + 0x40, 0xea, 0x01, 0x41, 0x00, 0x20, 0xec, 0xf7, 0x24, 0xbf, 0x02, 0xf0, + 0x21, 0xbf, 0x00, 0x20, 0xfd, 0xf7, 0xe4, 0xbc, 0x70, 0x47, 0x07, 0x4b, + 0x03, 0x60, 0x07, 0x48, 0x08, 0x60, 0x64, 0x21, 0x11, 0x60, 0x70, 0x47, + 0x05, 0x4b, 0x03, 0x60, 0x05, 0x48, 0x08, 0x60, 0xf0, 0x21, 0x11, 0x60, + 0x70, 0x47, 0x00, 0x00, 0xc0, 0x6b, 0x02, 0x20, 0x70, 0xd8, 0x01, 0x20, + 0x30, 0x6c, 0x02, 0x20, 0x90, 0xd1, 0x01, 0x20, 0x01, 0x46, 0x00, 0x20, + 0x0a, 0x7b, 0x09, 0x2a, 0xba, 0xbf, 0x49, 0x7b, 0x09, 0x29, 0x4b, 0xf2, + 0x03, 0x00, 0x70, 0x47, 0x01, 0x46, 0x00, 0x20, 0x89, 0x68, 0x40, 0xf2, + 0x69, 0x12, 0x91, 0x42, 0x28, 0xbf, 0x4b, 0xf2, 0x02, 0x00, 0x70, 0x47, + 0x02, 0x46, 0x00, 0x20, 0xca, 0x42, 0xac, 0xbf, 0x91, 0x42, 0x4b, 0xf2, + 0x01, 0x00, 0x70, 0x47, 0x2d, 0xe9, 0xf1, 0x4f, 0xb2, 0xb0, 0x91, 0x46, + 0x04, 0x91, 0x0d, 0xf1, 0x42, 0x01, 0x3c, 0x9a, 0x21, 0x91, 0x4a, 0x70, + 0x00, 0x21, 0x0d, 0xf1, 0x95, 0x02, 0x1e, 0x46, 0x0d, 0x91, 0x2f, 0x92, + 0x0b, 0xe0, 0x19, 0xf8, 0x01, 0x1b, 0x04, 0x98, 0x32, 0x9a, 0x90, 0x47, + 0x00, 0x28, 0x04, 0x90, 0x00, 0xf0, 0xa0, 0x85, 0x0d, 0x98, 0x40, 0x1c, + 0x0d, 0x90, 0x99, 0xf8, 0x00, 0x00, 0x50, 0xb1, 0x25, 0x28, 0xee, 0xd1, + 0x00, 0x21, 0x00, 0x22, 0x07, 0x91, 0x08, 0x92, 0x09, 0x91, 0x0a, 0x92, + 0x0b, 0x91, 0x0c, 0x92, 0x04, 0xe0, 0x0d, 0x98, 0x00, 0xf0, 0x8e, 0xbd, + 0x41, 0xf0, 0x01, 0x01, 0x19, 0xf8, 0x01, 0x0f, 0x20, 0x28, 0xf9, 0xd0, + 0x23, 0x28, 0x0c, 0xd0, 0x2b, 0x28, 0x04, 0xd0, 0x2d, 0x28, 0x05, 0xd0, + 0x30, 0x28, 0x09, 0xd0, 0x0b, 0xe0, 0x41, 0xf0, 0x02, 0x01, 0xef, 0xe7, + 0x41, 0xf0, 0x04, 0x01, 0xec, 0xe7, 0x41, 0xf0, 0x08, 0x01, 0xe9, 0xe7, + 0x41, 0xf0, 0x10, 0x01, 0xe6, 0xe7, 0x2a, 0x28, 0x0d, 0xd1, 0x32, 0x68, + 0x52, 0xf8, 0x04, 0x0b, 0x32, 0x60, 0x00, 0x28, 0x0f, 0x90, 0x03, 0xd5, + 0x40, 0x42, 0x0f, 0x90, 0x41, 0xf0, 0x04, 0x01, 0x09, 0xf1, 0x01, 0x09, + 0x14, 0xe0, 0x0f, 0x92, 0xdf, 0xf8, 0x18, 0x3c, 0x0a, 0xe0, 0x0f, 0x98, + 0x98, 0x42, 0x05, 0xda, 0x00, 0xeb, 0x80, 0x04, 0x02, 0xeb, 0x44, 0x02, + 0x30, 0x3a, 0x0f, 0x92, 0x09, 0xf1, 0x01, 0x09, 0x99, 0xf8, 0x00, 0x20, + 0xa2, 0xf1, 0x30, 0x00, 0x0a, 0x28, 0xee, 0xd3, 0x99, 0xf8, 0x00, 0x00, + 0x2e, 0x28, 0x03, 0xd0, 0x4f, 0xf0, 0xff, 0x32, 0x0e, 0x92, 0x27, 0xe0, + 0x19, 0xf8, 0x01, 0x0f, 0x2a, 0x28, 0x07, 0xd1, 0x30, 0x68, 0x50, 0xf8, + 0x04, 0x2b, 0x30, 0x60, 0x0e, 0x92, 0x09, 0xf1, 0x01, 0x09, 0x1b, 0xe0, + 0x2d, 0x28, 0x0c, 0xbf, 0x09, 0xf1, 0x01, 0x09, 0x00, 0x20, 0x00, 0x22, + 0x0e, 0x92, 0xdf, 0xf8, 0xbc, 0x4b, 0x0b, 0xe0, 0x40, 0xb9, 0x0e, 0x9a, + 0xa2, 0x42, 0x05, 0xda, 0x02, 0xeb, 0x82, 0x05, 0x03, 0xeb, 0x45, 0x03, + 0x30, 0x3b, 0x0e, 0x93, 0x09, 0xf1, 0x01, 0x09, 0x99, 0xf8, 0x00, 0x30, + 0xa3, 0xf1, 0x30, 0x02, 0x0a, 0x2a, 0xed, 0xd3, 0xad, 0xf8, 0x40, 0x10, + 0x0f, 0xf6, 0xfc, 0x30, 0x99, 0xf8, 0x00, 0x10, 0xf0, 0xf7, 0x24, 0xfa, + 0x08, 0xb1, 0x19, 0xf8, 0x01, 0x0b, 0x8d, 0xf8, 0x42, 0x00, 0x9d, 0xf8, + 0x42, 0x00, 0x68, 0x28, 0x05, 0xd1, 0x99, 0xf8, 0x00, 0x00, 0x68, 0x28, + 0x0c, 0xd1, 0x62, 0x21, 0x06, 0xe0, 0x6c, 0x28, 0x04, 0xbf, 0x99, 0xf8, + 0x00, 0x00, 0x6c, 0x28, 0x04, 0xd1, 0x71, 0x21, 0x8d, 0xf8, 0x42, 0x10, + 0x09, 0xf1, 0x01, 0x09, 0x12, 0xa8, 0x06, 0x90, 0x19, 0xf8, 0x01, 0xab, + 0xba, 0xf1, 0x25, 0x01, 0x26, 0xd0, 0x20, 0x39, 0x02, 0x29, 0x40, 0xf2, + 0xb1, 0x81, 0x13, 0x39, 0x00, 0xf0, 0x2b, 0x84, 0x0b, 0x39, 0x00, 0xf0, + 0xb1, 0x84, 0x49, 0x1e, 0x00, 0xf0, 0x67, 0x84, 0x49, 0x1e, 0x02, 0x29, + 0x40, 0xf2, 0xa4, 0x81, 0x09, 0x1f, 0x00, 0xf0, 0x60, 0x84, 0x49, 0x1f, + 0x00, 0xf0, 0x24, 0x81, 0x49, 0x1e, 0x00, 0xf0, 0x18, 0x84, 0x49, 0x1e, + 0x00, 0xf0, 0xcf, 0x80, 0xc9, 0x1e, 0x0d, 0xd0, 0x89, 0x1e, 0x00, 0xf0, + 0x10, 0x84, 0xc9, 0x1e, 0x00, 0xf0, 0x0d, 0x84, 0x00, 0xf0, 0x9d, 0xbc, + 0x25, 0x23, 0x8d, 0xf8, 0x48, 0x30, 0x01, 0x21, 0x00, 0xf0, 0xa2, 0xbc, + 0x30, 0x68, 0x50, 0xf8, 0x04, 0x4b, 0x30, 0x60, 0x00, 0x2c, 0x05, 0x94, + 0x40, 0xf0, 0xa5, 0x80, 0x21, 0x99, 0x48, 0x78, 0x00, 0x28, 0x00, 0xf0, + 0x9c, 0x80, 0x4f, 0xf0, 0xff, 0x34, 0x0f, 0xf6, 0x70, 0x30, 0x05, 0xf0, + 0xdf, 0xfb, 0x20, 0x1a, 0x40, 0xf0, 0xb0, 0x84, 0x00, 0xf0, 0x8b, 0xbc, + 0x6d, 0x1e, 0x40, 0xf0, 0xa2, 0x84, 0x32, 0x97, 0x07, 0x9d, 0x0d, 0xf1, + 0x48, 0x08, 0x75, 0xb1, 0x32, 0x9f, 0x18, 0xf8, 0x01, 0x2b, 0x02, 0xa9, + 0x38, 0x46, 0x00, 0xf0, 0x5d, 0xfd, 0x00, 0x28, 0x01, 0xd4, 0x6d, 0x1e, + 0xf5, 0xd1, 0x00, 0x28, 0x32, 0x97, 0x40, 0xf0, 0x97, 0x84, 0x0a, 0x9d, + 0x30, 0x20, 0x00, 0x2d, 0x8d, 0xf8, 0x04, 0x00, 0x0c, 0xdd, 0x32, 0x9f, + 0x01, 0x23, 0x01, 0xaa, 0x02, 0xa9, 0x38, 0x46, 0x00, 0xf0, 0x58, 0xfd, + 0x00, 0x28, 0x40, 0xf0, 0x87, 0x84, 0x6d, 0x1e, 0xf4, 0xd1, 0x32, 0x97, + 0xdd, 0xf8, 0x14, 0x80, 0x08, 0x9d, 0x75, 0xb1, 0x32, 0x9f, 0x18, 0xf8, + 0x01, 0x2b, 0x02, 0xa9, 0x38, 0x46, 0x00, 0xf0, 0x37, 0xfd, 0x00, 0x28, + 0x01, 0xd4, 0x6d, 0x1e, 0xf5, 0xd1, 0x00, 0x28, 0x32, 0x97, 0x40, 0xf0, + 0x71, 0x84, 0x0b, 0x9d, 0x30, 0x20, 0x00, 0x2d, 0x8d, 0xf8, 0x04, 0x00, + 0x0c, 0xdd, 0x32, 0x9f, 0x01, 0x23, 0x01, 0xaa, 0x02, 0xa9, 0x38, 0x46, + 0x00, 0xf0, 0x32, 0xfd, 0x00, 0x28, 0x40, 0xf0, 0x61, 0x84, 0x6d, 0x1e, + 0xf4, 0xd1, 0x32, 0x97, 0x05, 0x98, 0x08, 0x99, 0x09, 0x9d, 0x00, 0xeb, + 0x01, 0x08, 0x75, 0xb1, 0x32, 0x9f, 0x18, 0xf8, 0x01, 0x2b, 0x02, 0xa9, + 0x38, 0x46, 0x00, 0xf0, 0x0f, 0xfd, 0x00, 0x28, 0x01, 0xd4, 0x6d, 0x1e, + 0xf5, 0xd1, 0x00, 0x28, 0x32, 0x97, 0x40, 0xf0, 0x49, 0x84, 0x0c, 0x9d, + 0x30, 0x20, 0x00, 0x2d, 0x8d, 0xf8, 0x04, 0x00, 0x0c, 0xdd, 0x32, 0x9f, + 0x01, 0x23, 0x01, 0xaa, 0x02, 0xa9, 0x38, 0x46, 0x00, 0xf0, 0x0a, 0xfd, + 0x00, 0x28, 0x40, 0xf0, 0x39, 0x84, 0x6d, 0x1e, 0xf4, 0xd1, 0x32, 0x97, + 0x9d, 0xf8, 0x40, 0x00, 0x41, 0x07, 0x7f, 0xf5, 0x94, 0xae, 0x20, 0x20, + 0x00, 0x2c, 0x8d, 0xf8, 0x04, 0x00, 0x7f, 0xf7, 0x8e, 0xae, 0x32, 0x9d, + 0x01, 0x23, 0x01, 0xaa, 0x02, 0xa9, 0x28, 0x46, 0x00, 0xf0, 0xf2, 0xfc, + 0x00, 0x28, 0x40, 0xf0, 0x21, 0x84, 0x64, 0x1e, 0xf4, 0xd1, 0x32, 0x95, + 0x7f, 0xe6, 0x0f, 0xf6, 0x58, 0x20, 0x05, 0x90, 0xf5, 0xe3, 0x0e, 0x9d, + 0x00, 0x2d, 0x04, 0xd5, 0x20, 0x46, 0xf0, 0xf7, 0x2f, 0xf9, 0x04, 0x46, + 0x07, 0xe0, 0x2a, 0x46, 0x20, 0x46, 0x02, 0xf0, 0x0d, 0xfb, 0x00, 0x28, + 0x14, 0xbf, 0x04, 0x1b, 0x2c, 0x46, 0x08, 0x94, 0xe3, 0xe3, 0x31, 0x68, + 0x51, 0xf8, 0x04, 0x0b, 0x31, 0x60, 0x20, 0xf0, 0x00, 0x04, 0x00, 0x21, + 0x21, 0xf0, 0xff, 0x35, 0x12, 0xab, 0xcd, 0xe9, 0x02, 0x45, 0x05, 0x93, + 0xdd, 0xe9, 0x02, 0x23, 0x06, 0x99, 0x3c, 0x24, 0x13, 0xb9, 0x0a, 0xb9, + 0x0e, 0x98, 0x98, 0xb1, 0x02, 0xf0, 0x0f, 0x05, 0x30, 0x35, 0x64, 0x1e, + 0xef, 0xb2, 0x3a, 0x2f, 0xa8, 0xbf, 0x27, 0x35, 0x12, 0x09, 0x42, 0xea, + 0x03, 0x72, 0x1b, 0x09, 0x0d, 0x55, 0x08, 0xbf, 0x00, 0x2a, 0x03, 0xd0, + 0x05, 0x98, 0x0d, 0x19, 0xa8, 0x42, 0xeb, 0xd3, 0x08, 0x19, 0x05, 0x90, + 0xc4, 0xf1, 0x3c, 0x02, 0x0e, 0x98, 0x08, 0x92, 0x82, 0x42, 0x09, 0xda, + 0xbd, 0xf8, 0x40, 0x10, 0x82, 0x1a, 0x4f, 0xf6, 0xef, 0x70, 0x01, 0x40, + 0x0a, 0x92, 0xad, 0xf8, 0x40, 0x10, 0xa8, 0xe3, 0x00, 0x28, 0x40, 0xf1, + 0xa6, 0x83, 0x9d, 0xf8, 0x40, 0x00, 0x00, 0xf0, 0x14, 0x00, 0x10, 0x28, + 0x40, 0xf0, 0x9f, 0x83, 0x0f, 0x9b, 0x07, 0x99, 0x0a, 0x98, 0x5b, 0x1a, + 0x1b, 0x1a, 0x9a, 0x1a, 0x00, 0x2a, 0x40, 0xf3, 0x96, 0x83, 0xf4, 0xe2, + 0x21, 0x99, 0x48, 0x78, 0x20, 0xb1, 0x4f, 0xf0, 0xff, 0x34, 0x0f, 0xf6, + 0x38, 0x10, 0xfa, 0xe6, 0x9d, 0xf8, 0x42, 0x00, 0x62, 0x28, 0x53, 0xd0, + 0x68, 0x28, 0x15, 0xd0, 0x6a, 0x28, 0x36, 0xd0, 0x6c, 0x28, 0x06, 0xd0, + 0x71, 0x28, 0x3c, 0xd0, 0x74, 0x28, 0x25, 0xd0, 0x7a, 0x28, 0x18, 0xd0, + 0x53, 0xe0, 0x31, 0x68, 0x51, 0xf8, 0x04, 0x0b, 0x31, 0x60, 0x00, 0x28, + 0x57, 0xd1, 0x4f, 0xf0, 0xff, 0x34, 0x0f, 0xf6, 0x18, 0x10, 0xde, 0xe6, + 0x31, 0x68, 0x51, 0xf8, 0x04, 0x0b, 0x31, 0x60, 0x20, 0xb9, 0x4f, 0xf0, + 0xff, 0x34, 0x0f, 0xf6, 0x04, 0x10, 0xd4, 0xe6, 0x0d, 0x99, 0x01, 0x80, + 0x63, 0xe3, 0x31, 0x68, 0x51, 0xf8, 0x04, 0x0b, 0x31, 0x60, 0x00, 0x28, + 0x3f, 0xd1, 0x4f, 0xf0, 0xff, 0x34, 0x0f, 0xf6, 0xe8, 0x00, 0xc6, 0xe6, + 0x31, 0x68, 0x51, 0xf8, 0x04, 0x0b, 0x31, 0x60, 0x00, 0x28, 0x34, 0xd1, + 0x4f, 0xf0, 0xff, 0x34, 0x0f, 0xf6, 0xd0, 0x00, 0xbb, 0xe6, 0x31, 0x68, + 0x51, 0xf8, 0x04, 0x0b, 0x31, 0x60, 0x70, 0xb9, 0x4f, 0xf0, 0xff, 0x34, + 0x0f, 0xf6, 0xbc, 0x00, 0xb1, 0xe6, 0x31, 0x68, 0x51, 0xf8, 0x04, 0x0b, + 0x31, 0x60, 0x20, 0xb9, 0x4f, 0xf0, 0xff, 0x34, 0x0f, 0xf6, 0xa8, 0x00, + 0xa7, 0xe6, 0x0d, 0x9a, 0xd3, 0x17, 0xc0, 0xe9, 0x00, 0x23, 0x34, 0xe3, + 0x31, 0x68, 0x51, 0xf8, 0x04, 0x0b, 0x31, 0x60, 0x20, 0xb9, 0x4f, 0xf0, + 0xff, 0x34, 0x0f, 0xf6, 0x8c, 0x00, 0x98, 0xe6, 0x0d, 0x99, 0x01, 0x70, + 0x27, 0xe3, 0x31, 0x68, 0x51, 0xf8, 0x04, 0x0b, 0x31, 0x60, 0x20, 0xb9, + 0x4f, 0xf0, 0xff, 0x34, 0x0f, 0xf6, 0x70, 0x00, 0x8b, 0xe6, 0x0d, 0x99, + 0x01, 0x60, 0x1a, 0xe3, 0x32, 0x68, 0xd2, 0x1d, 0x22, 0xf0, 0x07, 0x02, + 0x32, 0x60, 0xd2, 0xe9, 0x00, 0x01, 0x08, 0x32, 0x32, 0x60, 0xcd, 0xe9, + 0x02, 0x01, 0xc8, 0x0f, 0x02, 0xd0, 0x07, 0x98, 0x2d, 0x21, 0x0a, 0xe0, + 0xbd, 0xf8, 0x40, 0x00, 0x81, 0x07, 0x02, 0xd5, 0x07, 0x98, 0x2b, 0x21, + 0x03, 0xe0, 0xc0, 0x07, 0x05, 0xd5, 0x07, 0x98, 0x20, 0x21, 0x12, 0xaa, + 0x11, 0x54, 0x40, 0x1c, 0x07, 0x90, 0xdd, 0xe9, 0x02, 0x23, 0x07, 0x99, + 0x12, 0xa8, 0xcd, 0xe9, 0x22, 0x23, 0x08, 0x44, 0x0e, 0x99, 0x05, 0x90, + 0x00, 0x29, 0x25, 0xac, 0x02, 0xd5, 0x06, 0x21, 0x0e, 0x91, 0x05, 0xe0, + 0x01, 0xbf, 0x4a, 0xf0, 0x20, 0x01, 0x67, 0x29, 0x01, 0x22, 0x0e, 0x92, + 0xdd, 0xe9, 0x02, 0x23, 0x59, 0x00, 0x49, 0x15, 0x49, 0x1c, 0x0d, 0xd1, + 0x1a, 0x03, 0x0b, 0xd0, 0xaa, 0xf1, 0x61, 0x05, 0x03, 0x21, 0x1a, 0x2d, + 0x08, 0x91, 0x02, 0xd2, 0x0f, 0xf6, 0x18, 0x01, 0x10, 0xe0, 0x0f, 0xf6, + 0x18, 0x01, 0x0d, 0xe0, 0x59, 0x00, 0x49, 0x15, 0x49, 0x1c, 0x0d, 0xd1, + 0x1a, 0x03, 0x0b, 0xd1, 0xaa, 0xf1, 0x61, 0x05, 0x03, 0x21, 0x1a, 0x2d, + 0x08, 0x91, 0x17, 0xd3, 0x0f, 0xf6, 0x00, 0x01, 0x03, 0x22, 0xd2, 0xf7, + 0xa9, 0xf8, 0xc0, 0xe2, 0xdd, 0xe9, 0x02, 0x01, 0xcd, 0xe9, 0x30, 0x01, + 0xdd, 0xe9, 0x30, 0x23, 0x23, 0xf0, 0x00, 0x43, 0xb3, 0xf5, 0x80, 0x1f, + 0x0d, 0xd2, 0x00, 0x25, 0x00, 0x2b, 0x08, 0xbf, 0x00, 0x2a, 0x00, 0x95, + 0x03, 0xd1, 0x1e, 0xe0, 0x0f, 0xf2, 0xcc, 0x71, 0xe6, 0xe7, 0x6a, 0x46, + 0x05, 0xf0, 0x18, 0xfa, 0x0f, 0xe0, 0xdf, 0xf8, 0xf4, 0x06, 0xdf, 0xf8, + 0xf4, 0x16, 0x00, 0xeb, 0x13, 0x50, 0x00, 0x90, 0xdd, 0xe9, 0x30, 0x23, + 0x19, 0x40, 0x4f, 0xf0, 0xff, 0x30, 0xdf, 0xf8, 0xe4, 0x36, 0x10, 0x40, + 0x19, 0x43, 0x00, 0x9d, 0xdf, 0xf8, 0xdc, 0x36, 0x47, 0xf2, 0x97, 0x52, + 0x55, 0x43, 0x95, 0xfb, 0xf3, 0xf5, 0xcd, 0xe9, 0x02, 0x01, 0x20, 0xf0, + 0x00, 0x02, 0x31, 0xf0, 0x00, 0x43, 0x08, 0xbf, 0x00, 0x2a, 0x02, 0xd1, + 0x00, 0x27, 0x00, 0x25, 0xac, 0xe0, 0xdd, 0xe9, 0x22, 0x23, 0x23, 0xf0, + 0x00, 0x43, 0xcd, 0xe9, 0x22, 0x23, 0x00, 0x95, 0x2a, 0x46, 0xd2, 0xf1, + 0x07, 0x02, 0x04, 0xdd, 0xdd, 0xe9, 0x22, 0x01, 0x00, 0xf0, 0x22, 0xfb, + 0x0b, 0xe0, 0x52, 0x42, 0x00, 0x20, 0xdf, 0xf8, 0x98, 0x16, 0x00, 0xf0, + 0x1b, 0xfb, 0x02, 0x46, 0x0b, 0x46, 0xdd, 0xe9, 0x22, 0x01, 0x05, 0xf0, + 0x0f, 0xfa, 0x4a, 0xf0, 0x20, 0x0b, 0x04, 0x46, 0xbb, 0xf1, 0x66, 0x0f, + 0x06, 0xbf, 0x00, 0x98, 0x00, 0xf1, 0x0a, 0x08, 0x4f, 0xf0, 0x06, 0x08, + 0x0e, 0x98, 0x80, 0x44, 0xb8, 0xf1, 0x14, 0x0f, 0xc8, 0xbf, 0x4f, 0xf0, + 0x14, 0x08, 0x30, 0x20, 0x0d, 0x46, 0x8d, 0xf8, 0x94, 0x00, 0x0d, 0xf1, + 0x95, 0x07, 0xb8, 0xf1, 0x00, 0x0f, 0x36, 0xdd, 0x20, 0x46, 0x29, 0x46, + 0x05, 0xf0, 0x14, 0xfb, 0x01, 0x46, 0x0a, 0x46, 0x07, 0xf1, 0x08, 0x03, + 0x04, 0x20, 0x0a, 0x27, 0xb2, 0xfb, 0xf7, 0xf7, 0x07, 0xeb, 0x87, 0x0e, + 0xa2, 0xeb, 0x4e, 0x02, 0x30, 0x32, 0x03, 0xf8, 0x01, 0x2c, 0x0a, 0x22, + 0xb7, 0xfb, 0xf2, 0xf2, 0x02, 0xeb, 0x82, 0x0e, 0xa7, 0xeb, 0x4e, 0x07, + 0x30, 0x37, 0x40, 0x1e, 0x03, 0xf8, 0x02, 0x7d, 0xe9, 0xd1, 0xa8, 0xf1, + 0x08, 0x08, 0xb8, 0xf1, 0x00, 0x0f, 0x03, 0xf1, 0x08, 0x07, 0xd6, 0xdd, + 0x08, 0x46, 0x05, 0xf0, 0x03, 0xfb, 0x02, 0x46, 0x0b, 0x46, 0x20, 0x46, + 0x29, 0x46, 0x05, 0xf0, 0x0b, 0xfb, 0x00, 0x22, 0xdf, 0xf8, 0xf0, 0x35, + 0x05, 0xf0, 0x78, 0xfb, 0x04, 0x46, 0x0d, 0x46, 0xc8, 0xe7, 0x2f, 0x98, + 0x3f, 0x1a, 0x0d, 0xf1, 0x95, 0x04, 0x04, 0xe0, 0x00, 0x98, 0x40, 0x1e, + 0x7f, 0x1e, 0x00, 0x90, 0x64, 0x1c, 0x20, 0x78, 0x30, 0x28, 0xf7, 0xd0, + 0xbb, 0xf1, 0x66, 0x0f, 0x02, 0xd1, 0x00, 0x98, 0x40, 0x1c, 0x04, 0xe0, + 0xbb, 0xf1, 0x65, 0x0f, 0x0c, 0xbf, 0x01, 0x20, 0x00, 0x20, 0x0e, 0x99, + 0x40, 0x18, 0x87, 0x42, 0xb8, 0xbf, 0x78, 0x1e, 0x00, 0x28, 0x1d, 0xd4, + 0xb8, 0x42, 0x04, 0xda, 0x21, 0x5c, 0x34, 0x29, 0xc8, 0xbf, 0x39, 0x21, + 0x00, 0xdc, 0x30, 0x21, 0x02, 0x46, 0x63, 0x1e, 0x9d, 0x18, 0x00, 0xe0, + 0x40, 0x1e, 0x15, 0xf8, 0x01, 0x79, 0x52, 0x1e, 0x8f, 0x42, 0xf9, 0xd0, + 0x39, 0x29, 0x02, 0xd1, 0xa1, 0x5c, 0x49, 0x1c, 0xa1, 0x54, 0x00, 0x2a, + 0x04, 0xd5, 0x00, 0x99, 0x49, 0x1c, 0x1c, 0x46, 0x40, 0x1c, 0x00, 0x91, + 0x07, 0x46, 0x00, 0x9d, 0xdd, 0xf8, 0x38, 0x80, 0x38, 0xb2, 0x00, 0x28, + 0x02, 0xdc, 0x01, 0x27, 0x0f, 0xf2, 0x18, 0x64, 0x4a, 0xf0, 0x20, 0x00, + 0x66, 0x28, 0x08, 0xbf, 0x6d, 0x1c, 0x17, 0xd0, 0x67, 0x28, 0x0f, 0xfa, + 0x85, 0xfb, 0x5a, 0xd1, 0x1b, 0xf1, 0x04, 0x0f, 0x43, 0xdb, 0xc3, 0x45, + 0x41, 0xda, 0x9d, 0xf8, 0x40, 0x00, 0x6d, 0x1c, 0x01, 0x07, 0x03, 0xd4, + 0x38, 0xb2, 0x40, 0x45, 0xb8, 0xbf, 0x80, 0x46, 0x28, 0xb2, 0xb8, 0xeb, + 0x00, 0x08, 0x48, 0xbf, 0x4f, 0xf0, 0x00, 0x08, 0x0f, 0xfa, 0x85, 0xfa, + 0xba, 0xf1, 0x00, 0x0f, 0x00, 0xf3, 0xaa, 0x80, 0x08, 0x98, 0x41, 0x1c, + 0x08, 0x91, 0x30, 0x22, 0x05, 0x99, 0x0a, 0x54, 0xb8, 0xf1, 0x00, 0x0f, + 0x03, 0xdc, 0x9d, 0xf8, 0x40, 0x00, 0x01, 0x07, 0x05, 0xd5, 0x08, 0x98, + 0x41, 0x1c, 0x08, 0x91, 0x2e, 0x22, 0x05, 0x99, 0x0a, 0x54, 0x18, 0xeb, + 0x0a, 0x0f, 0xb8, 0xbf, 0xc8, 0xf1, 0x00, 0x05, 0x2d, 0xb2, 0x68, 0x42, + 0x0b, 0x90, 0xa8, 0x44, 0x3a, 0xb2, 0x90, 0x45, 0xb8, 0xbf, 0x47, 0x46, + 0x05, 0x9b, 0x08, 0x98, 0x3f, 0xb2, 0x09, 0x97, 0x3a, 0x46, 0x21, 0x46, + 0x18, 0x44, 0xd1, 0xf7, 0x69, 0xff, 0xa8, 0xeb, 0x07, 0x00, 0x0c, 0x90, + 0xc8, 0xe0, 0x38, 0xb2, 0x40, 0x45, 0x04, 0xda, 0x9d, 0xf8, 0x40, 0x10, + 0x0a, 0x07, 0x58, 0xbf, 0x80, 0x46, 0xb8, 0xf1, 0x01, 0x08, 0x48, 0xbf, + 0x4f, 0xf0, 0x00, 0x08, 0xba, 0xf1, 0x67, 0x0f, 0x0c, 0xbf, 0x4f, 0xf0, + 0x65, 0x0a, 0x4f, 0xf0, 0x45, 0x0a, 0x08, 0x98, 0x41, 0x1c, 0x08, 0x91, + 0xb8, 0xf1, 0x00, 0x0f, 0x05, 0x99, 0x14, 0xf8, 0x01, 0x2b, 0x0a, 0x54, + 0x03, 0xdc, 0x9d, 0xf8, 0x40, 0x00, 0x01, 0x07, 0x1b, 0xd5, 0x08, 0x98, + 0x41, 0x1c, 0x08, 0x91, 0x2e, 0x22, 0x05, 0x99, 0x0a, 0x54, 0xb8, 0xf1, + 0x00, 0x0f, 0x12, 0xdd, 0x7f, 0x1e, 0x38, 0xb2, 0x80, 0x45, 0x05, 0x98, + 0x08, 0x9b, 0xb8, 0xbf, 0x47, 0x46, 0x3a, 0xb2, 0x21, 0x46, 0x18, 0x44, + 0xd1, 0xf7, 0x2e, 0xff, 0x08, 0x98, 0x3f, 0xb2, 0x38, 0x18, 0x08, 0x90, + 0xa8, 0xeb, 0x07, 0x00, 0x0b, 0x90, 0x05, 0x98, 0x08, 0x99, 0x08, 0x44, + 0xbb, 0xf1, 0x00, 0x0f, 0x80, 0xf8, 0x00, 0xa0, 0x03, 0xd4, 0x2b, 0x22, + 0x42, 0x70, 0x81, 0x1c, 0x04, 0xe0, 0x2d, 0x21, 0x41, 0x70, 0x5d, 0x46, + 0x81, 0x1c, 0x6d, 0x42, 0x00, 0x20, 0x22, 0xaa, 0x0a, 0x24, 0x09, 0xe0, + 0x2b, 0x46, 0x93, 0xfb, 0xf4, 0xf5, 0x05, 0xeb, 0x85, 0x07, 0xa3, 0xeb, + 0x47, 0x03, 0x02, 0xf8, 0x01, 0x3b, 0x40, 0x1c, 0x2d, 0xb2, 0x00, 0x2d, + 0xf2, 0xdc, 0x01, 0x28, 0x06, 0xdc, 0x4a, 0xf0, 0x20, 0x02, 0x65, 0x2a, + 0x04, 0xbf, 0x30, 0x22, 0x01, 0xf8, 0x01, 0x2b, 0x00, 0x28, 0x22, 0xaa, + 0x08, 0xd1, 0x30, 0x20, 0x01, 0xf8, 0x01, 0x0b, 0x06, 0xe0, 0x40, 0x1e, + 0x13, 0x5c, 0x30, 0x33, 0x01, 0xf8, 0x01, 0x3b, 0x00, 0x28, 0xf8, 0xdc, + 0x05, 0x9a, 0x08, 0x98, 0x10, 0x44, 0x09, 0x1a, 0x09, 0x91, 0x4b, 0xe0, + 0x38, 0xb2, 0x29, 0xb2, 0x88, 0x42, 0x1d, 0xda, 0x05, 0x98, 0x08, 0x9b, + 0x3a, 0xb2, 0x21, 0x46, 0x18, 0x44, 0xd1, 0xf7, 0xdd, 0xfe, 0x08, 0x99, + 0x3f, 0xb2, 0x79, 0x18, 0xaa, 0xeb, 0x07, 0x07, 0xb8, 0xf1, 0x00, 0x0f, + 0x08, 0x91, 0x0b, 0x97, 0x03, 0xdc, 0x9d, 0xf8, 0x40, 0x00, 0x02, 0x07, + 0x05, 0xd5, 0x05, 0x9a, 0x2e, 0x20, 0x50, 0x54, 0x09, 0x99, 0x49, 0x1c, + 0x09, 0x91, 0xcd, 0xf8, 0x30, 0x80, 0x29, 0xe0, 0x05, 0x98, 0x08, 0x9b, + 0x2a, 0xb2, 0x21, 0x46, 0x18, 0x44, 0xd1, 0xf7, 0xbf, 0xfe, 0x08, 0x98, + 0x7f, 0x1b, 0x50, 0x44, 0xb8, 0xf1, 0x00, 0x0f, 0x08, 0x90, 0x03, 0xdc, + 0x9d, 0xf8, 0x40, 0x10, 0x0a, 0x07, 0x04, 0xd5, 0x41, 0x1c, 0x08, 0x91, + 0x2e, 0x22, 0x05, 0x99, 0x0a, 0x54, 0x38, 0xb2, 0x80, 0x45, 0x05, 0x98, + 0x08, 0x9b, 0xb8, 0xbf, 0x47, 0x46, 0x3a, 0xb2, 0x04, 0xeb, 0x0a, 0x01, + 0x18, 0x44, 0xd1, 0xf7, 0xa3, 0xfe, 0x08, 0x98, 0x3f, 0xb2, 0x38, 0x18, + 0xa8, 0xeb, 0x07, 0x07, 0x08, 0x90, 0x0b, 0x97, 0x9d, 0xf8, 0x40, 0x00, + 0x00, 0xf0, 0x14, 0x00, 0x10, 0x28, 0x40, 0xf0, 0xae, 0x80, 0x07, 0x9a, + 0x08, 0x99, 0x0b, 0x98, 0x8a, 0x18, 0x09, 0x99, 0x82, 0x18, 0x0c, 0x98, + 0x8a, 0x18, 0x82, 0x18, 0x0f, 0x98, 0x82, 0x42, 0x80, 0xf2, 0xa1, 0x80, + 0x82, 0x1a, 0x0a, 0x92, 0x9d, 0xe0, 0x9d, 0xf8, 0x42, 0x00, 0x62, 0x28, + 0x08, 0xd0, 0x68, 0x28, 0x0c, 0xd0, 0x6a, 0x28, 0x10, 0xd0, 0x6c, 0x28, + 0x18, 0xd0, 0x71, 0x28, 0x0c, 0xd0, 0x15, 0xe0, 0x31, 0x68, 0x51, 0xf8, + 0x04, 0x0b, 0x31, 0x60, 0xc0, 0xb2, 0x13, 0xe0, 0x31, 0x68, 0x51, 0xf8, + 0x04, 0x0b, 0x31, 0x60, 0x80, 0xb2, 0x0d, 0xe0, 0x32, 0x68, 0xd2, 0x1d, + 0x22, 0xf0, 0x07, 0x02, 0x32, 0x60, 0xd2, 0xe9, 0x00, 0x01, 0x08, 0x32, + 0x32, 0x60, 0x04, 0xe0, 0x31, 0x68, 0x51, 0xf8, 0x04, 0x0b, 0x31, 0x60, + 0x00, 0x21, 0xcd, 0xe9, 0x02, 0x01, 0x9d, 0xf8, 0x40, 0x00, 0x01, 0x07, + 0x51, 0xd5, 0xdd, 0xe9, 0x02, 0x23, 0x00, 0x2b, 0x08, 0xbf, 0x00, 0x2a, + 0x4b, 0xd0, 0x4a, 0xf0, 0x20, 0x00, 0x78, 0x28, 0x47, 0xd1, 0x07, 0x98, + 0x12, 0xa9, 0x30, 0x22, 0x0a, 0x54, 0x40, 0x1c, 0x43, 0x1c, 0x07, 0x93, + 0x01, 0xf8, 0x00, 0xa0, 0x3d, 0xe0, 0x9d, 0xf8, 0x42, 0x00, 0x62, 0x28, + 0x08, 0xd0, 0x68, 0x28, 0x0c, 0xd0, 0x6a, 0x28, 0x10, 0xd0, 0x6c, 0x28, + 0x18, 0xd0, 0x71, 0x28, 0x0c, 0xd0, 0x15, 0xe0, 0x31, 0x68, 0x51, 0xf8, + 0x04, 0x0b, 0x31, 0x60, 0x40, 0xb2, 0x13, 0xe0, 0x31, 0x68, 0x51, 0xf8, + 0x04, 0x0b, 0x31, 0x60, 0x00, 0xb2, 0x0d, 0xe0, 0x32, 0x68, 0xd2, 0x1d, + 0x22, 0xf0, 0x07, 0x02, 0x32, 0x60, 0xd2, 0xe9, 0x00, 0x01, 0x08, 0x32, + 0x32, 0x60, 0x04, 0xe0, 0x31, 0x68, 0x51, 0xf8, 0x04, 0x0b, 0x31, 0x60, + 0xc1, 0x17, 0xcd, 0xe9, 0x02, 0x01, 0x00, 0x29, 0x02, 0xd5, 0x07, 0x98, + 0x2d, 0x21, 0x0a, 0xe0, 0xbd, 0xf8, 0x40, 0x00, 0x81, 0x07, 0x02, 0xd5, + 0x07, 0x98, 0x2b, 0x21, 0x03, 0xe0, 0xc0, 0x07, 0x05, 0xd5, 0x07, 0x98, + 0x20, 0x21, 0x12, 0xaa, 0x11, 0x54, 0x40, 0x1c, 0x07, 0x90, 0x12, 0xa8, + 0x07, 0x99, 0x01, 0x44, 0x05, 0x91, 0x02, 0xa8, 0x51, 0x46, 0x00, 0xf0, + 0x3e, 0xf8, 0x14, 0xe0, 0x01, 0x20, 0x07, 0x90, 0x30, 0x68, 0x50, 0xf8, + 0x04, 0x1b, 0x30, 0x60, 0x8d, 0xf8, 0x48, 0x10, 0x0b, 0xe0, 0x25, 0x21, + 0x01, 0x22, 0xba, 0xf1, 0x00, 0x0f, 0x8d, 0xf8, 0x48, 0x10, 0x07, 0x92, + 0x03, 0xd0, 0x8d, 0xf8, 0x49, 0xa0, 0x02, 0x21, 0x07, 0x91, 0x0f, 0x9a, + 0x07, 0x98, 0x0a, 0x99, 0x0c, 0x9c, 0x12, 0x1a, 0x08, 0x98, 0x52, 0x1a, + 0x0b, 0x99, 0x12, 0x1a, 0x09, 0x98, 0x52, 0x1a, 0x12, 0x1a, 0x9d, 0xf8, + 0x40, 0x00, 0x14, 0x1b, 0x41, 0x07, 0x3f, 0xf5, 0x67, 0xab, 0x20, 0x20, + 0x00, 0x2c, 0x8d, 0xf8, 0x04, 0x00, 0x7f, 0xf7, 0x61, 0xab, 0x32, 0x9f, + 0x25, 0x46, 0x01, 0x23, 0x01, 0xaa, 0x02, 0xa9, 0x38, 0x46, 0x00, 0xf0, + 0xd1, 0xf8, 0x00, 0x28, 0x3f, 0xf4, 0x52, 0xab, 0x4f, 0xf0, 0xff, 0x30, + 0x33, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x2d, 0xe9, 0xfc, 0x43, 0x07, 0x46, + 0x6f, 0x29, 0x3e, 0x69, 0x08, 0xbf, 0x08, 0x24, 0x05, 0xd0, 0x41, 0xf0, + 0x20, 0x00, 0x78, 0x28, 0x14, 0xbf, 0x0a, 0x24, 0x10, 0x24, 0x3c, 0x25, + 0xd7, 0xe9, 0x00, 0x23, 0x64, 0x29, 0x18, 0xbf, 0x69, 0x29, 0x90, 0x46, + 0x99, 0x46, 0x05, 0xd1, 0x00, 0x2b, 0x03, 0xd5, 0xd8, 0xf1, 0x00, 0x08, + 0x69, 0xeb, 0x49, 0x09, 0xb9, 0xf1, 0x00, 0x0f, 0x08, 0xbf, 0xb8, 0xf1, + 0x00, 0x0f, 0x0c, 0xd1, 0x38, 0x6b, 0x50, 0xb9, 0x08, 0x2c, 0x39, 0xd1, + 0x97, 0xf8, 0x38, 0x00, 0x01, 0x07, 0x35, 0xd5, 0x30, 0x20, 0x3b, 0x25, + 0x86, 0xf8, 0x3b, 0x00, 0x30, 0xe0, 0x8d, 0xf8, 0x00, 0x10, 0x40, 0x46, + 0x49, 0x46, 0x22, 0x46, 0xe3, 0x17, 0xe4, 0xf7, 0x19, 0xf9, 0x30, 0x32, + 0xd0, 0xb2, 0x6d, 0x1e, 0x3a, 0x28, 0x01, 0x95, 0x04, 0xdb, 0x9d, 0xf8, + 0x00, 0x00, 0xa0, 0xf1, 0x51, 0x01, 0x8a, 0x18, 0x72, 0x55, 0x40, 0x46, + 0x49, 0x46, 0x22, 0x46, 0xe3, 0x17, 0xe4, 0xf7, 0x07, 0xf9, 0x80, 0x46, + 0x5f, 0xea, 0x01, 0x09, 0x08, 0xbf, 0xb8, 0xf1, 0x00, 0x0f, 0x03, 0xd0, + 0xf8, 0x68, 0x71, 0x19, 0x88, 0x42, 0xdc, 0xd3, 0x08, 0x2c, 0x09, 0xd1, + 0x97, 0xf8, 0x38, 0x00, 0x01, 0x07, 0x05, 0xd5, 0x70, 0x5d, 0x30, 0x28, + 0x02, 0xd0, 0x6d, 0x1e, 0x30, 0x20, 0x70, 0x55, 0xc5, 0xf1, 0x3c, 0x02, + 0xba, 0x61, 0x71, 0x19, 0xf9, 0x60, 0x38, 0x6b, 0x82, 0x42, 0x08, 0xda, + 0x82, 0x1a, 0x3a, 0x62, 0x4f, 0xf6, 0xef, 0x70, 0x39, 0x8f, 0x01, 0x40, + 0x39, 0x87, 0xbd, 0xe8, 0xf3, 0x83, 0x00, 0x28, 0x0e, 0xd5, 0x97, 0xf8, + 0x38, 0x00, 0x00, 0xf0, 0x14, 0x00, 0x10, 0x28, 0x08, 0xd1, 0x7b, 0x6b, + 0x79, 0x69, 0x38, 0x6a, 0x5b, 0x1a, 0x1b, 0x1a, 0x9a, 0x1a, 0x00, 0x2a, + 0xc8, 0xbf, 0x3a, 0x62, 0xbd, 0xe8, 0xf3, 0x83, 0x2d, 0xe9, 0xd0, 0x43, + 0x06, 0x46, 0x0f, 0x46, 0x14, 0x46, 0x4f, 0xf0, 0x00, 0x08, 0xdf, 0xf8, + 0x54, 0x90, 0x12, 0xe0, 0xe0, 0x07, 0x07, 0xd5, 0x42, 0x46, 0x4b, 0x46, + 0x30, 0x46, 0x39, 0x46, 0x05, 0xf0, 0xa0, 0xf8, 0x06, 0x46, 0x0f, 0x46, + 0x40, 0x46, 0x49, 0x46, 0x42, 0x46, 0x4b, 0x46, 0x05, 0xf0, 0x98, 0xf8, + 0x64, 0x10, 0x80, 0x46, 0x89, 0x46, 0x00, 0x2c, 0xea, 0xd1, 0x30, 0x46, + 0x39, 0x46, 0xbd, 0xe8, 0xd0, 0x83, 0x00, 0x00, 0xcb, 0xcc, 0xcc, 0x0c, + 0x02, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x00, 0x00, 0xe0, 0x3f, + 0xa0, 0x86, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x84, 0xd7, 0x97, 0x41, + 0x00, 0x00, 0x24, 0x40, 0x10, 0xb5, 0x03, 0x46, 0x0c, 0x46, 0x11, 0x46, + 0xa0, 0x68, 0x98, 0x47, 0xa0, 0x60, 0x20, 0xb1, 0xe0, 0x6a, 0x40, 0x1c, + 0xe0, 0x62, 0x00, 0x20, 0x10, 0xbd, 0x4f, 0xf0, 0xff, 0x30, 0x10, 0xbd, + 0xf8, 0xb5, 0x05, 0x46, 0x0e, 0x46, 0x17, 0x46, 0x1c, 0x46, 0x00, 0x20, + 0x5c, 0xb1, 0x17, 0xf8, 0x01, 0x1b, 0xb0, 0x68, 0xa8, 0x47, 0xb0, 0x60, + 0x30, 0xb1, 0xf0, 0x6a, 0x40, 0x1c, 0xf0, 0x62, 0x00, 0x20, 0x64, 0x1e, + 0xf3, 0xd1, 0xf2, 0xbd, 0x4f, 0xf0, 0xff, 0x30, 0xf2, 0xbd, 0x00, 0x00, + 0x68, 0x6a, 0x6c, 0x74, 0x7a, 0x4c, 0x00, 0x00, 0x70, 0x72, 0x69, 0x6e, + 0x74, 0x66, 0x5f, 0x73, 0x3a, 0x20, 0x25, 0x6e, 0x20, 0x64, 0x69, 0x73, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x00, 0x70, 0x72, 0x69, 0x6e, + 0x74, 0x66, 0x3a, 0x20, 0x62, 0x61, 0x64, 0x20, 0x25, 0x6e, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x70, 0x72, 0x69, 0x6e, + 0x74, 0x66, 0x5f, 0x73, 0x3a, 0x20, 0x62, 0x61, 0x64, 0x20, 0x25, 0x73, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0x61, 0x6e, 0x00, 0x4e, 0x41, 0x4e, 0x00, + 0x69, 0x6e, 0x66, 0x00, 0x49, 0x4e, 0x46, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x7f, 0xb5, 0x1d, 0x46, 0x0c, 0x46, 0x29, 0x68, 0x1c, 0x29, 0x43, 0xd0, + 0x65, 0x60, 0x22, 0x60, 0x00, 0x21, 0x21, 0x76, 0xe1, 0x61, 0x21, 0x61, + 0x2a, 0x69, 0x09, 0x9b, 0x02, 0x92, 0xa9, 0x68, 0x01, 0x91, 0x00, 0x93, + 0xea, 0x68, 0x69, 0x68, 0x23, 0x46, 0xed, 0xf7, 0x1f, 0xfc, 0xa0, 0x60, + 0x28, 0xb9, 0x03, 0x22, 0x4f, 0xf6, 0x0b, 0x71, 0x01, 0x20, 0xed, 0xf7, + 0xa5, 0xf9, 0x2a, 0x68, 0xa0, 0x68, 0x00, 0x21, 0xee, 0xf7, 0xb5, 0xf8, + 0xa0, 0x68, 0x22, 0x46, 0x01, 0x21, 0xee, 0xf7, 0xb0, 0xf8, 0x68, 0x69, + 0x05, 0xf0, 0xc6, 0xf8, 0xe0, 0x60, 0x28, 0xb9, 0x03, 0x22, 0x4f, 0xf6, + 0x1c, 0x71, 0x01, 0x20, 0xed, 0xf7, 0x90, 0xf9, 0xa8, 0x69, 0x98, 0xb1, + 0x01, 0x90, 0x23, 0x46, 0x0f, 0xf2, 0x39, 0x10, 0x08, 0x9e, 0x00, 0x90, + 0x00, 0x22, 0xe8, 0x69, 0x31, 0x46, 0xee, 0xf7, 0x29, 0xfa, 0x20, 0x61, + 0x28, 0xb9, 0x03, 0x22, 0x4f, 0xf6, 0x1e, 0x71, 0x01, 0x20, 0xed, 0xf7, + 0x7b, 0xf9, 0x66, 0x61, 0x00, 0x20, 0x04, 0xb0, 0x70, 0xbd, 0x7c, 0xb5, + 0x04, 0x46, 0x25, 0x68, 0x29, 0x68, 0x88, 0x47, 0xe0, 0x68, 0x1a, 0x21, + 0x05, 0xf0, 0xf7, 0xf8, 0x25, 0x21, 0xe0, 0x68, 0x05, 0xf0, 0x00, 0xf9, + 0x4f, 0xf0, 0xff, 0x30, 0x00, 0x90, 0x00, 0x23, 0xe0, 0x68, 0x01, 0x22, + 0x4f, 0xf4, 0xfe, 0x41, 0x05, 0xf0, 0x98, 0xf8, 0x06, 0x46, 0x30, 0x05, + 0x05, 0xd5, 0x4f, 0xf4, 0x00, 0x61, 0x21, 0x62, 0x20, 0x46, 0xaa, 0x68, + 0x90, 0x47, 0xb0, 0x05, 0x13, 0xd5, 0x4f, 0xf4, 0x00, 0x71, 0x20, 0x69, + 0x21, 0x62, 0x70, 0xb1, 0x00, 0x21, 0x00, 0x91, 0x00, 0x23, 0x00, 0x22, + 0x03, 0x21, 0xee, 0xf7, 0x07, 0xfa, 0xe0, 0x68, 0x02, 0x21, 0x05, 0xf0, + 0xce, 0xf8, 0xe0, 0x68, 0x01, 0x21, 0x05, 0xf0, 0xd7, 0xf8, 0x70, 0x05, + 0x0c, 0xd5, 0x4f, 0xf4, 0x80, 0x61, 0x20, 0x69, 0x21, 0x62, 0x38, 0xb1, + 0xe0, 0x68, 0x01, 0x21, 0x05, 0xf0, 0xbf, 0xf8, 0xe0, 0x68, 0x02, 0x21, + 0x05, 0xf0, 0xc8, 0xf8, 0xf0, 0x04, 0x05, 0xd5, 0x4f, 0xf4, 0x80, 0x51, + 0x21, 0x62, 0x20, 0x46, 0xea, 0x68, 0x90, 0x47, 0x70, 0x04, 0x05, 0xd5, + 0x4f, 0xf4, 0x80, 0x41, 0x21, 0x62, 0x20, 0x46, 0xea, 0x68, 0x90, 0x47, + 0xb0, 0x04, 0x05, 0xd5, 0x4f, 0xf4, 0x00, 0x51, 0x21, 0x62, 0x20, 0x46, + 0x2a, 0x69, 0x90, 0x47, 0xf0, 0x05, 0xad, 0xd5, 0x4f, 0xf4, 0x80, 0x71, + 0x21, 0x62, 0x08, 0x21, 0xe0, 0x68, 0x05, 0xf0, 0xa7, 0xf8, 0xe0, 0x68, + 0x04, 0x21, 0x05, 0xf0, 0x96, 0xf8, 0xed, 0xf7, 0xbf, 0xfd, 0x00, 0xf0, + 0xaa, 0xf8, 0x41, 0xf6, 0x12, 0x21, 0x08, 0x40, 0x12, 0x28, 0x04, 0xbf, + 0x00, 0x20, 0x20, 0x76, 0xed, 0xf7, 0xba, 0xfd, 0x20, 0x69, 0x30, 0xb1, + 0x00, 0x21, 0x00, 0x91, 0x00, 0x23, 0x62, 0x69, 0x04, 0x21, 0xee, 0xf7, + 0xb5, 0xf9, 0x69, 0x68, 0x20, 0x46, 0x88, 0x47, 0xe0, 0x68, 0x08, 0x21, + 0x05, 0xf0, 0x79, 0xf8, 0x04, 0x21, 0x80, 0xe7, 0x10, 0xb5, 0xee, 0xf7, + 0x00, 0xfb, 0x04, 0x46, 0x00, 0x21, 0xe0, 0x68, 0x05, 0xf0, 0x6f, 0xf8, + 0x00, 0xf0, 0x12, 0x00, 0x12, 0x28, 0x06, 0xd1, 0xe0, 0x68, 0xbd, 0xe8, + 0x10, 0x40, 0x4f, 0xf4, 0x80, 0x71, 0x05, 0xf0, 0x71, 0xb8, 0x10, 0xbd, + 0x80, 0xb5, 0x00, 0xf0, 0x0c, 0xf8, 0x00, 0x7e, 0x02, 0xbd, 0x80, 0xb5, + 0x00, 0xf0, 0x07, 0xf8, 0x00, 0x6a, 0x02, 0xbd, 0x01, 0x21, 0x01, 0x76, + 0x80, 0x68, 0xed, 0xf7, 0xde, 0xbd, 0x80, 0xb5, 0xee, 0xf7, 0x08, 0xf8, + 0xbd, 0xe8, 0x04, 0x40, 0x01, 0x21, 0xed, 0xf7, 0xe5, 0xbf, 0x10, 0xb5, + 0x00, 0xf0, 0x1b, 0xf8, 0xe0, 0x68, 0xbd, 0xe8, 0x10, 0x40, 0x4f, 0xf4, + 0x00, 0x61, 0x05, 0xf0, 0x4f, 0xb8, 0x10, 0xb5, 0x00, 0xf0, 0x11, 0xf8, + 0xe0, 0x68, 0xbd, 0xe8, 0x10, 0x40, 0x4f, 0xf4, 0x80, 0x51, 0x05, 0xf0, + 0x45, 0xb8, 0x10, 0xb5, 0x00, 0xf0, 0x07, 0xf8, 0xe0, 0x68, 0xbd, 0xe8, + 0x10, 0x40, 0x4f, 0xf4, 0x80, 0x41, 0x05, 0xf0, 0x3b, 0xb8, 0x04, 0x46, + 0xd2, 0xe7, 0x10, 0xb5, 0xff, 0xf7, 0xfb, 0xff, 0x05, 0x20, 0xed, 0xf7, + 0xe2, 0xfb, 0xe0, 0x68, 0xbd, 0xe8, 0x10, 0x40, 0x4f, 0xf4, 0x00, 0x51, + 0x05, 0xf0, 0x2c, 0xb8, 0xc0, 0x68, 0x4f, 0xf4, 0x89, 0x71, 0x05, 0xf0, + 0x27, 0xb8, 0x10, 0xb5, 0x04, 0x46, 0xa0, 0x68, 0x90, 0xb1, 0xed, 0xf7, + 0x3f, 0xfd, 0x20, 0x46, 0xff, 0xf7, 0xb8, 0xff, 0xe0, 0x68, 0x4f, 0xf4, + 0xa0, 0x61, 0x05, 0xf0, 0x0c, 0xf8, 0xe0, 0x68, 0x4f, 0xf4, 0x00, 0x71, + 0x05, 0xf0, 0x14, 0xf8, 0xe0, 0x69, 0x40, 0x1c, 0xe0, 0x61, 0x54, 0xe0, + 0x10, 0xbd, 0x10, 0xb5, 0x04, 0x46, 0xa0, 0x68, 0xa0, 0xb1, 0xed, 0xf7, + 0x27, 0xfd, 0xe0, 0x69, 0x40, 0x1e, 0xe0, 0x61, 0x0d, 0xd1, 0x00, 0xf0, + 0x0e, 0xf8, 0xc0, 0x06, 0x04, 0xd5, 0xe0, 0x68, 0x4f, 0xf4, 0xa0, 0x61, + 0x04, 0xf0, 0xfc, 0xff, 0xe0, 0x68, 0x4f, 0xf4, 0x00, 0x71, 0x04, 0xf0, + 0xea, 0xff, 0x3a, 0xe0, 0x10, 0xbd, 0xe0, 0x68, 0x00, 0x21, 0x04, 0xf0, + 0xe4, 0xbf, 0x10, 0xb5, 0x04, 0x46, 0xa0, 0x68, 0x68, 0xb1, 0xed, 0xf7, + 0x09, 0xfd, 0x20, 0x46, 0xff, 0xf7, 0x82, 0xff, 0xe0, 0x68, 0x4f, 0xf4, + 0xa2, 0x61, 0x04, 0xf0, 0xd6, 0xff, 0xe0, 0x68, 0x4f, 0xf4, 0x08, 0x71, + 0x21, 0xe0, 0x10, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x10, 0x25, 0xa0, 0x68, + 0x60, 0x26, 0x98, 0xb1, 0xed, 0xf7, 0xf4, 0xfc, 0xe0, 0x69, 0x18, 0xb9, + 0x4f, 0xf4, 0x18, 0x76, 0x4f, 0xf4, 0xa2, 0x65, 0xe0, 0x68, 0x31, 0x46, + 0x04, 0xf0, 0xbf, 0xff, 0xe0, 0x68, 0x29, 0x46, 0x04, 0xf0, 0xc8, 0xff, + 0xbd, 0xe8, 0x70, 0x40, 0xed, 0xf7, 0xe8, 0xbc, 0x70, 0xbd, 0x10, 0xb5, + 0x04, 0x46, 0xed, 0xf7, 0xdd, 0xfc, 0xe0, 0x68, 0x40, 0x21, 0x04, 0xf0, + 0xbb, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0xed, 0xf7, 0xdb, 0xbc, 0x38, 0xb5, + 0x04, 0x46, 0xa0, 0x68, 0x50, 0xb1, 0x4f, 0xf0, 0xff, 0x35, 0x00, 0x95, + 0x00, 0x23, 0xe0, 0x68, 0x00, 0x22, 0x04, 0x21, 0x04, 0xf0, 0x4c, 0xff, + 0x40, 0x07, 0xf4, 0xd5, 0x00, 0x20, 0x32, 0xbd, 0x80, 0xb5, 0x82, 0x68, + 0x00, 0x21, 0x1a, 0xb1, 0xc0, 0x68, 0x04, 0xf0, 0x92, 0xff, 0x01, 0x46, + 0xc8, 0xb2, 0x02, 0xbd, 0x01, 0x46, 0x00, 0x20, 0x89, 0x68, 0x01, 0xb1, + 0x01, 0x20, 0x70, 0x47, 0x2d, 0xe9, 0xfe, 0x4f, 0x00, 0x24, 0x4f, 0xf0, + 0x01, 0x08, 0xdf, 0xf8, 0x84, 0x5a, 0xdf, 0xf8, 0x84, 0xba, 0x4f, 0xf0, + 0x24, 0x09, 0xdf, 0xf8, 0xbc, 0x0a, 0xdf, 0xf8, 0xbc, 0x2a, 0x01, 0x68, + 0xd1, 0xf8, 0xb8, 0x00, 0x11, 0x68, 0x08, 0x40, 0x06, 0x04, 0x36, 0x0e, + 0x2b, 0xe0, 0xdf, 0xf8, 0xa4, 0x0a, 0xdf, 0xf8, 0xa4, 0x2a, 0x00, 0x68, + 0x00, 0x26, 0xb8, 0x30, 0x06, 0x2c, 0x22, 0xd8, 0xdf, 0xe8, 0x04, 0xf0, + 0x04, 0x1c, 0x1c, 0x05, 0x04, 0x1c, 0x15, 0x00, 0xe3, 0xe7, 0x00, 0x21, + 0xdf, 0xf8, 0x88, 0x0a, 0xca, 0xb2, 0x50, 0xf8, 0x22, 0x20, 0xff, 0x2a, + 0x04, 0xd1, 0x49, 0x1c, 0xcb, 0xb2, 0x08, 0x2b, 0xf6, 0xdb, 0x0e, 0xe0, + 0x08, 0xfa, 0x01, 0xf6, 0x0b, 0xe0, 0x01, 0x68, 0x16, 0x68, 0x0e, 0x40, + 0x36, 0x0c, 0x06, 0xf0, 0x03, 0x06, 0x04, 0xe0, 0x01, 0x68, 0x16, 0x68, + 0x0e, 0x40, 0x06, 0xf0, 0xff, 0x06, 0x4f, 0xf0, 0x00, 0x0a, 0x51, 0x46, + 0x00, 0xf0, 0x2d, 0xfc, 0x07, 0x46, 0xff, 0x2f, 0x30, 0xd0, 0x00, 0xf0, + 0x52, 0xfa, 0x62, 0x43, 0x0a, 0x44, 0x09, 0xfb, 0x07, 0xf3, 0xd1, 0x18, + 0x09, 0xfb, 0x04, 0xf2, 0x5a, 0x44, 0x50, 0x68, 0x00, 0xb3, 0x26, 0xfa, + 0x0a, 0xf0, 0xc0, 0x07, 0x1c, 0xd5, 0x28, 0x19, 0x02, 0x79, 0x01, 0x92, + 0x05, 0xeb, 0x84, 0x00, 0xa0, 0x22, 0x03, 0x69, 0x62, 0x43, 0x28, 0x20, + 0x00, 0x93, 0x5a, 0x44, 0x78, 0x43, 0x10, 0x44, 0x00, 0xf1, 0xfc, 0x03, + 0x0f, 0xf6, 0x50, 0x22, 0xdf, 0xf8, 0x04, 0x0a, 0xff, 0xf7, 0xcc, 0xfd, + 0xe8, 0x68, 0x07, 0xeb, 0x84, 0x07, 0x08, 0xfa, 0x07, 0xf7, 0x07, 0x43, + 0xef, 0x60, 0x03, 0xe0, 0x00, 0x20, 0x88, 0x60, 0xc8, 0x60, 0x08, 0x61, + 0x0a, 0xf1, 0x01, 0x0a, 0xba, 0xf1, 0x08, 0x0f, 0xc3, 0xd3, 0x64, 0x1c, + 0x07, 0x2c, 0x92, 0xd3, 0x00, 0x20, 0xbd, 0xe8, 0xfe, 0x8f, 0x2d, 0xe9, + 0xf8, 0x43, 0x80, 0x46, 0x0d, 0x46, 0x08, 0x98, 0x09, 0x99, 0x16, 0x46, + 0xdf, 0xf8, 0xc4, 0x29, 0x02, 0xeb, 0x08, 0x12, 0xa6, 0xf1, 0x30, 0x07, + 0x16, 0x60, 0x55, 0x60, 0x13, 0x81, 0x50, 0x81, 0xd1, 0x60, 0x00, 0x24, + 0x00, 0xf0, 0x03, 0xfa, 0x7a, 0x43, 0x24, 0x20, 0x0a, 0x44, 0x60, 0x43, + 0x02, 0xeb, 0x00, 0x09, 0x48, 0x46, 0xff, 0xf7, 0x55, 0xff, 0x01, 0x28, + 0x03, 0xd0, 0x64, 0x1c, 0x04, 0x2c, 0xef, 0xd3, 0x02, 0xe0, 0x48, 0x46, + 0xff, 0xf7, 0x8f, 0xfe, 0x04, 0x2c, 0x09, 0xd3, 0x32, 0x46, 0x29, 0x46, + 0x40, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x43, 0x4f, 0xf6, 0x24, 0x73, + 0xfc, 0xf7, 0x80, 0xb8, 0xbd, 0xe8, 0xf1, 0x83, 0x2d, 0xe9, 0xf0, 0x47, + 0x00, 0xf0, 0x25, 0xf8, 0x01, 0x46, 0xff, 0x29, 0x4f, 0xf0, 0x00, 0x09, + 0x0b, 0xd0, 0x00, 0xf0, 0x43, 0xf8, 0x08, 0xbf, 0x00, 0x21, 0x00, 0xf0, + 0x09, 0xf8, 0x01, 0x28, 0x03, 0xd1, 0x20, 0x46, 0xff, 0xf7, 0x77, 0xfe, + 0x01, 0xe0, 0x4f, 0xf6, 0x24, 0x79, 0x32, 0xe0, 0xc2, 0xf8, 0x00, 0xa0, + 0xc2, 0xf8, 0x04, 0x80, 0xd5, 0x60, 0x57, 0x61, 0x90, 0x20, 0xdf, 0xf8, + 0x30, 0x39, 0x46, 0x43, 0x24, 0x22, 0x98, 0x19, 0x51, 0x43, 0x44, 0x18, + 0x20, 0x46, 0xff, 0xf7, 0x15, 0xbf, 0x90, 0x46, 0x08, 0x9f, 0x04, 0x46, + 0x0d, 0x46, 0xa8, 0xf1, 0x30, 0x06, 0x9a, 0x46, 0x39, 0x46, 0xf0, 0xb2, + 0x00, 0xf0, 0x88, 0xbb, 0x2d, 0xe9, 0xf0, 0x47, 0xff, 0xf7, 0xf1, 0xff, + 0x01, 0x46, 0xff, 0x29, 0x4f, 0xf0, 0x00, 0x09, 0x0b, 0xd0, 0x00, 0xf0, + 0x0f, 0xf8, 0x08, 0xbf, 0x00, 0x21, 0xff, 0xf7, 0xd5, 0xff, 0x01, 0x28, + 0x03, 0xd1, 0x20, 0x46, 0xff, 0xf7, 0x4d, 0xfe, 0x01, 0xe0, 0x4f, 0xf6, + 0x24, 0x79, 0x48, 0x46, 0xbd, 0xe8, 0xf0, 0x87, 0x18, 0x22, 0xdf, 0xf8, + 0xd4, 0xc8, 0x0a, 0x9b, 0x09, 0x98, 0x54, 0x43, 0x0c, 0xeb, 0x04, 0x02, + 0x03, 0x2e, 0x10, 0x82, 0x93, 0x60, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x41, + 0x18, 0x25, 0xa2, 0xf1, 0x30, 0x0e, 0x00, 0x26, 0xdf, 0xf8, 0xb4, 0x88, + 0x06, 0x9f, 0x07, 0x9c, 0xdd, 0xf8, 0x20, 0xc0, 0x68, 0x43, 0x40, 0x44, + 0xbe, 0xf1, 0x03, 0x0f, 0x47, 0x61, 0xc1, 0x60, 0x42, 0x60, 0x08, 0xbf, + 0x00, 0x27, 0x03, 0x60, 0xc0, 0xf8, 0x08, 0xc0, 0x04, 0x82, 0x90, 0x21, + 0xdf, 0xf8, 0x84, 0x28, 0x01, 0xfb, 0x0e, 0xf0, 0x11, 0x18, 0x24, 0x20, + 0x47, 0x43, 0xcc, 0x19, 0xff, 0xf7, 0xa8, 0xff, 0x01, 0x28, 0x03, 0xd1, + 0x20, 0x46, 0xff, 0xf7, 0x1e, 0xfe, 0x01, 0xe0, 0x4f, 0xf6, 0x24, 0x76, + 0x30, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x2d, 0xe9, 0xf5, 0x4f, 0x81, 0xb0, + 0x0e, 0x46, 0xdf, 0xf7, 0x24, 0xfa, 0x04, 0x46, 0xdf, 0xf7, 0x8c, 0xfa, + 0x00, 0xf0, 0x8e, 0xf8, 0x01, 0x98, 0xe8, 0x40, 0xc1, 0x07, 0x36, 0xd5, + 0x9d, 0xf8, 0x08, 0x00, 0x00, 0x90, 0x00, 0x27, 0x03, 0x2d, 0x16, 0xd1, + 0x26, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x29, 0xd5, 0x38, 0x46, 0xdf, 0xf7, + 0x3e, 0xfa, 0xff, 0x28, 0x24, 0xd0, 0x50, 0x46, 0xff, 0xf7, 0x94, 0xfe, + 0xd8, 0xb1, 0x00, 0x98, 0x01, 0x28, 0x50, 0x46, 0x02, 0xd1, 0xff, 0xf7, + 0x4b, 0xfe, 0x1c, 0xe0, 0xff, 0xf7, 0x35, 0xfe, 0x19, 0xe0, 0x24, 0xfa, + 0x07, 0xf0, 0xc0, 0x07, 0x12, 0xd5, 0x00, 0xf0, 0x18, 0xf8, 0xff, 0x28, + 0x0e, 0xd0, 0x00, 0xf0, 0x6d, 0xf8, 0x30, 0xb1, 0x00, 0x98, 0x01, 0x28, + 0x58, 0x46, 0x05, 0xd1, 0xff, 0xf7, 0x36, 0xfe, 0x04, 0xe0, 0x4f, 0xf6, + 0x24, 0x79, 0x07, 0xe0, 0xff, 0xf7, 0x1d, 0xfe, 0x7f, 0x1c, 0x07, 0x2f, + 0xcc, 0xd9, 0x6d, 0x1c, 0x07, 0x2d, 0xc1, 0xd3, 0x4b, 0xe0, 0x39, 0x46, + 0xe8, 0xb2, 0xe5, 0xe2, 0x2d, 0xe9, 0xf5, 0x4f, 0x81, 0xb0, 0x0e, 0x46, + 0xdf, 0xf7, 0xd7, 0xf9, 0x04, 0x46, 0xdf, 0xf7, 0x3f, 0xfa, 0x00, 0xf0, + 0x41, 0xf8, 0x01, 0x98, 0xe8, 0x40, 0xc1, 0x07, 0x36, 0xd5, 0x9d, 0xf8, + 0x08, 0x00, 0x00, 0x90, 0x00, 0x27, 0x03, 0x2d, 0x16, 0xd1, 0x26, 0xfa, + 0x07, 0xf0, 0xc0, 0x07, 0x29, 0xd5, 0x38, 0x46, 0xdf, 0xf7, 0xf1, 0xf9, + 0xff, 0x28, 0x24, 0xd0, 0x50, 0x46, 0xff, 0xf7, 0x47, 0xfe, 0xd8, 0xb1, + 0x00, 0x98, 0x01, 0x28, 0x50, 0x46, 0x02, 0xd1, 0xff, 0xf7, 0xb5, 0xfd, + 0x1c, 0xe0, 0xff, 0xf7, 0xca, 0xfd, 0x19, 0xe0, 0x24, 0xfa, 0x07, 0xf0, + 0xc0, 0x07, 0x12, 0xd5, 0xff, 0xf7, 0xcb, 0xff, 0xff, 0x28, 0x0e, 0xd0, + 0x00, 0xf0, 0x20, 0xf8, 0x30, 0xb1, 0x00, 0x98, 0x01, 0x28, 0x58, 0x46, + 0x05, 0xd1, 0xff, 0xf7, 0xa0, 0xfd, 0x04, 0xe0, 0x4f, 0xf6, 0x24, 0x79, + 0x07, 0xe0, 0xff, 0xf7, 0xb2, 0xfd, 0x7f, 0x1c, 0x07, 0x2f, 0xcc, 0xd9, + 0x6d, 0x1c, 0x07, 0x2d, 0xc1, 0xd3, 0x48, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, + 0x34, 0x40, 0xdf, 0xf8, 0x28, 0x87, 0x4f, 0xf0, 0x00, 0x09, 0x06, 0x40, + 0x00, 0x25, 0x08, 0xf5, 0xd8, 0x7a, 0x70, 0x47, 0x90, 0x21, 0x69, 0x43, + 0x24, 0x22, 0x41, 0x44, 0x50, 0x43, 0x01, 0xeb, 0x00, 0x0b, 0x58, 0x46, + 0xff, 0xf7, 0x08, 0xbe, 0xf8, 0xb5, 0x1e, 0x46, 0x24, 0x23, 0xdf, 0xf8, + 0xa8, 0x76, 0x04, 0x46, 0x30, 0x3c, 0x5c, 0x43, 0x3c, 0x44, 0x15, 0x46, + 0x08, 0x46, 0x22, 0x69, 0x4f, 0xf6, 0x2a, 0x71, 0x52, 0xb1, 0x21, 0x6a, + 0x06, 0x9b, 0x00, 0x91, 0x29, 0x46, 0x01, 0x25, 0x24, 0x69, 0x32, 0x46, + 0x05, 0xfa, 0x00, 0xf0, 0xa0, 0x47, 0x01, 0x46, 0x08, 0x46, 0xf2, 0xbd, + 0x70, 0xb5, 0x04, 0x46, 0x58, 0x21, 0xe3, 0xf7, 0x3d, 0xfc, 0x00, 0x25, + 0x00, 0x26, 0x31, 0x46, 0xff, 0xf7, 0x78, 0xff, 0xff, 0x28, 0x0d, 0xd0, + 0x03, 0x2d, 0x08, 0xbf, 0x00, 0x20, 0x00, 0xf0, 0x36, 0xf8, 0x61, 0x19, + 0xc6, 0xeb, 0xc6, 0x02, 0x11, 0x44, 0x81, 0xf8, 0x20, 0x00, 0x40, 0x06, + 0x00, 0xf0, 0x24, 0xf8, 0x76, 0x1c, 0x07, 0x2e, 0xe9, 0xd9, 0x6d, 0x1c, + 0x07, 0x2d, 0xe5, 0xd3, 0x00, 0x20, 0x70, 0xbd, 0x70, 0xb5, 0x04, 0x46, + 0x20, 0x21, 0xe3, 0xf7, 0x1b, 0xfc, 0x00, 0x25, 0x00, 0x26, 0x31, 0x46, + 0xff, 0xf7, 0x56, 0xff, 0xff, 0x28, 0x07, 0xd0, 0x03, 0x2d, 0x08, 0xbf, + 0x00, 0x20, 0x00, 0xf0, 0x14, 0xf8, 0xc0, 0x06, 0x00, 0xf0, 0x08, 0xf8, + 0x76, 0x1c, 0x07, 0x2e, 0xef, 0xd9, 0x6d, 0x1c, 0x07, 0x2d, 0xeb, 0xd3, + 0x00, 0x20, 0x70, 0xbd, 0x06, 0xd5, 0x04, 0xeb, 0x86, 0x00, 0x01, 0x22, + 0x01, 0x68, 0xaa, 0x40, 0x11, 0x43, 0x01, 0x60, 0x70, 0x47, 0x90, 0x22, + 0xdf, 0xf8, 0x38, 0x16, 0x6a, 0x43, 0x24, 0x23, 0x0a, 0x44, 0x58, 0x43, + 0x10, 0x44, 0xff, 0xf7, 0x91, 0xbd, 0x02, 0x46, 0x00, 0x20, 0x00, 0x23, + 0x07, 0x2a, 0x3d, 0xbf, 0xdf, 0xf8, 0xc4, 0x35, 0x03, 0xeb, 0x82, 0x02, + 0x13, 0x69, 0x4f, 0xf6, 0x2f, 0x70, 0x0b, 0x60, 0x70, 0x47, 0x2d, 0xe9, + 0xfc, 0x41, 0x00, 0x92, 0x0b, 0x46, 0xdf, 0xf8, 0xac, 0x85, 0x02, 0x46, + 0x1c, 0x21, 0x08, 0xf1, 0x10, 0x00, 0xe9, 0xf7, 0xd4, 0xf8, 0x04, 0x00, + 0x20, 0xd1, 0x00, 0x26, 0x00, 0x27, 0xff, 0xf7, 0x6d, 0xfe, 0xff, 0x28, + 0x14, 0xd0, 0x03, 0x2e, 0x08, 0xbf, 0x00, 0x20, 0x00, 0xf0, 0x19, 0xf8, + 0x72, 0x43, 0x24, 0x23, 0x0a, 0x44, 0x58, 0x43, 0x15, 0x18, 0x28, 0x46, + 0xff, 0xf7, 0x6c, 0xfd, 0x30, 0xb1, 0x08, 0xf1, 0x10, 0x00, 0x50, 0xf8, + 0x26, 0x10, 0x28, 0x46, 0x41, 0x61, 0xc0, 0x46, 0x7f, 0x1c, 0x07, 0x2f, + 0xe3, 0xd9, 0x76, 0x1c, 0x07, 0x2e, 0xdf, 0xd3, 0x20, 0x46, 0xbd, 0xe8, + 0xf6, 0x81, 0x90, 0x22, 0xdf, 0xf8, 0xa4, 0x15, 0x70, 0x47, 0xf8, 0xb5, + 0x0d, 0x46, 0xa0, 0xf1, 0x30, 0x04, 0x00, 0x26, 0x01, 0x20, 0xb0, 0x40, + 0x05, 0x42, 0x0f, 0xd0, 0x00, 0xf0, 0xc6, 0xf9, 0xff, 0xf7, 0xef, 0xff, + 0x62, 0x43, 0x24, 0x23, 0x0a, 0x44, 0x58, 0x43, 0x17, 0x18, 0x38, 0x46, + 0xff, 0xf7, 0x42, 0xfd, 0x10, 0xb1, 0xb8, 0x68, 0x01, 0xf0, 0xec, 0xf8, + 0x76, 0x1c, 0x08, 0x2e, 0xe8, 0xd3, 0xf1, 0xbd, 0x80, 0xb5, 0x00, 0x92, + 0x0b, 0x46, 0x02, 0x46, 0x1c, 0x21, 0xdf, 0xf8, 0x68, 0x05, 0xe9, 0xf7, + 0x6f, 0xf8, 0x02, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, 0x80, 0x46, 0x24, 0x27, + 0xd8, 0xf8, 0x04, 0x10, 0xdf, 0xf8, 0xf0, 0x54, 0x4e, 0x6a, 0x30, 0x3e, + 0x77, 0x43, 0x01, 0x24, 0xe8, 0x59, 0x58, 0xb1, 0x09, 0x6a, 0xf0, 0xb2, + 0x00, 0xf0, 0xb8, 0xf9, 0xff, 0x28, 0x14, 0xd0, 0xe9, 0x19, 0xea, 0x59, + 0x09, 0x6a, 0x04, 0xfa, 0x00, 0xf0, 0x90, 0x47, 0xd8, 0xf8, 0x04, 0x20, + 0xdf, 0xf8, 0xc0, 0x04, 0x13, 0x6a, 0xc1, 0x68, 0x03, 0xeb, 0x86, 0x03, + 0x9c, 0x40, 0x31, 0xea, 0x04, 0x04, 0xc4, 0x60, 0x04, 0xbf, 0x01, 0x21, + 0x01, 0x70, 0xbd, 0xe8, 0xf0, 0x81, 0xdf, 0xf8, 0xa4, 0x04, 0x00, 0x78, + 0x70, 0x47, 0x70, 0xb5, 0x05, 0x46, 0x24, 0x26, 0x69, 0x68, 0xdf, 0xf8, + 0x98, 0x34, 0x48, 0x6a, 0xa0, 0xf1, 0x30, 0x02, 0xd2, 0xb2, 0x16, 0xfb, + 0x02, 0xf6, 0x1e, 0x44, 0x00, 0x24, 0x70, 0x68, 0x78, 0xb1, 0x09, 0x6a, + 0x10, 0x46, 0x00, 0xf0, 0x87, 0xf9, 0xff, 0x28, 0x07, 0xd0, 0x31, 0x6a, + 0x73, 0x68, 0x01, 0x22, 0x02, 0xfa, 0x00, 0xf0, 0x98, 0x47, 0x04, 0x46, + 0x01, 0xe0, 0x4f, 0xf6, 0x52, 0x74, 0xdf, 0xf8, 0xc4, 0x04, 0x01, 0x78, + 0x01, 0x29, 0x10, 0xd1, 0x40, 0x78, 0x0f, 0xf2, 0xc4, 0x42, 0x00, 0x28, + 0x07, 0xbf, 0x4f, 0xf6, 0x71, 0x74, 0x0f, 0xf2, 0xd4, 0x43, 0x00, 0x24, + 0x0f, 0xf2, 0xc4, 0x43, 0xff, 0x21, 0x03, 0x20, 0xdf, 0xf7, 0x5b, 0xf9, + 0x02, 0xe0, 0xb4, 0xf1, 0x00, 0x4f, 0x0b, 0xd0, 0x54, 0xb1, 0x28, 0x46, + 0xff, 0xf7, 0x6f, 0xfc, 0x28, 0x46, 0xff, 0xf7, 0x9a, 0xfc, 0x02, 0x22, + 0x21, 0x46, 0x02, 0x20, 0xec, 0xf7, 0xc2, 0xfc, 0xdf, 0xf8, 0x7c, 0x14, + 0x4f, 0xf0, 0x80, 0x50, 0x08, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, + 0x6f, 0x8f, 0x70, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x80, 0x46, 0x01, 0x21, + 0xd8, 0xf8, 0x04, 0x00, 0xdf, 0xf8, 0x44, 0x74, 0x44, 0x6a, 0x00, 0x6a, + 0x01, 0xfa, 0x00, 0xf0, 0x30, 0x3c, 0x6f, 0xea, 0x00, 0x09, 0x90, 0x21, + 0x24, 0x25, 0xdf, 0xf8, 0x34, 0x04, 0x61, 0x43, 0x03, 0x2c, 0x00, 0xeb, + 0x01, 0x0a, 0x21, 0xd0, 0xff, 0x20, 0x38, 0x60, 0x00, 0x26, 0x00, 0xf0, + 0x0f, 0xf9, 0xff, 0x28, 0x07, 0xd0, 0x29, 0xfa, 0x00, 0xf1, 0xc9, 0x07, + 0x03, 0xd5, 0x68, 0x43, 0x50, 0x44, 0xff, 0xf7, 0x00, 0xfc, 0x76, 0x1c, + 0x08, 0x2e, 0xf0, 0xd3, 0x00, 0x26, 0x00, 0xf0, 0xff, 0xf8, 0xff, 0x28, + 0x07, 0xd0, 0x29, 0xfa, 0x00, 0xf1, 0xc9, 0x07, 0x03, 0xd5, 0x68, 0x43, + 0x50, 0x44, 0xff, 0xf7, 0x60, 0xfc, 0x76, 0x1c, 0x08, 0x2e, 0xf0, 0xd3, + 0xdf, 0xf8, 0x8c, 0x13, 0x05, 0xfb, 0x04, 0xf2, 0x8e, 0x18, 0xb0, 0x68, + 0x40, 0xb1, 0x33, 0x6a, 0xfa, 0x68, 0x79, 0x89, 0x38, 0x89, 0xd6, 0xf8, + 0x08, 0xc0, 0xe0, 0x47, 0x06, 0x46, 0x01, 0xe0, 0x4f, 0xf6, 0x28, 0x76, + 0x03, 0x2c, 0x13, 0xd0, 0x4f, 0xf0, 0x00, 0x0b, 0x59, 0x46, 0x00, 0xf0, + 0xda, 0xf8, 0xff, 0x28, 0x07, 0xd0, 0x29, 0xfa, 0x00, 0xf1, 0xc9, 0x07, + 0x03, 0xd5, 0x68, 0x43, 0x50, 0x44, 0xff, 0xf7, 0xe2, 0xfb, 0x0b, 0xf1, + 0x01, 0x0b, 0xbb, 0xf1, 0x08, 0x0f, 0xed, 0xd3, 0x79, 0x68, 0xd8, 0xf8, + 0x04, 0x00, 0x42, 0x6a, 0x33, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, + 0x00, 0x20, 0xfb, 0xf7, 0x85, 0xbd, 0x38, 0xb5, 0x0c, 0x46, 0x11, 0x46, + 0x1a, 0x46, 0x30, 0x38, 0x24, 0x23, 0xdf, 0xf8, 0x1c, 0x53, 0x58, 0x43, + 0x05, 0x44, 0xe8, 0x68, 0x20, 0xb1, 0x20, 0x46, 0x2b, 0x6a, 0xec, 0x68, + 0xa0, 0x47, 0x32, 0xbd, 0x4f, 0xf6, 0x29, 0x70, 0x32, 0xbd, 0x2d, 0xe9, + 0xf8, 0x4f, 0x04, 0x46, 0x84, 0xb0, 0x60, 0x68, 0x41, 0x6a, 0xa1, 0xf1, + 0x30, 0x00, 0x00, 0x26, 0x5f, 0xfa, 0x80, 0xf8, 0x03, 0x96, 0xf9, 0xf7, + 0x0f, 0xfb, 0xc0, 0x04, 0x06, 0xd5, 0xdd, 0xf7, 0xf4, 0xff, 0x00, 0x28, + 0x14, 0xbf, 0x02, 0x27, 0x00, 0x27, 0x05, 0xe0, 0xdd, 0xf7, 0xed, 0xff, + 0x00, 0x28, 0x0c, 0xbf, 0x06, 0x27, 0x07, 0x27, 0x3a, 0x46, 0x18, 0x20, + 0xdf, 0xf8, 0x18, 0x13, 0x42, 0x43, 0x4f, 0xf0, 0x24, 0x0c, 0x8d, 0x18, + 0xad, 0x4a, 0x1c, 0xfb, 0x08, 0xfc, 0xff, 0x23, 0x02, 0xeb, 0x0c, 0x09, + 0x6b, 0x60, 0x01, 0xf1, 0xc0, 0x0a, 0xd9, 0xf8, 0x14, 0x00, 0xf8, 0xb1, + 0x60, 0x68, 0x01, 0x6a, 0x40, 0x46, 0x00, 0xf0, 0x95, 0xf8, 0x06, 0x46, + 0xff, 0x2e, 0x15, 0xd0, 0xb5, 0xf8, 0x10, 0xb0, 0xa9, 0x68, 0x5a, 0x46, + 0x50, 0x46, 0xd0, 0xf7, 0xdb, 0xfe, 0xd9, 0xf8, 0x20, 0x00, 0x00, 0xf0, + 0x61, 0xf8, 0x01, 0x20, 0x00, 0x92, 0xb0, 0x40, 0x29, 0x68, 0xd9, 0xf8, + 0x14, 0x60, 0x5b, 0x46, 0x52, 0x46, 0xb0, 0x47, 0x06, 0x46, 0x01, 0xe0, + 0x4f, 0xf6, 0x52, 0x76, 0xb8, 0xf1, 0x03, 0x0f, 0x06, 0xd1, 0x01, 0x20, + 0x00, 0xf0, 0x1a, 0xfe, 0xc0, 0xf1, 0x01, 0x00, 0xc0, 0xb2, 0x50, 0xb1, + 0x03, 0x98, 0x01, 0x90, 0xcd, 0xf8, 0x00, 0xa0, 0x33, 0x46, 0x61, 0x68, + 0x4a, 0x6a, 0xe9, 0x68, 0x38, 0x46, 0xfb, 0xf7, 0x20, 0xfd, 0x13, 0xe1, + 0x2d, 0xe9, 0xf8, 0x43, 0x04, 0x46, 0x84, 0xb0, 0x60, 0x68, 0x46, 0x6a, + 0x00, 0x25, 0x03, 0x95, 0xdd, 0xf7, 0x95, 0xff, 0x30, 0x3e, 0x00, 0x28, + 0x0c, 0xbf, 0xa8, 0x46, 0x4f, 0xf0, 0x02, 0x08, 0x18, 0x21, 0x9b, 0x48, + 0x83, 0x4b, 0x11, 0xfb, 0x08, 0xf1, 0x47, 0x18, 0x24, 0x21, 0x4e, 0x43, + 0xff, 0x22, 0x9e, 0x19, 0x7a, 0x60, 0x00, 0xf1, 0xc0, 0x09, 0xb0, 0x69, + 0x80, 0xb1, 0x3d, 0x8a, 0xb9, 0x68, 0x2a, 0x46, 0x48, 0x46, 0xd0, 0xf7, + 0x8f, 0xfe, 0x30, 0x6a, 0x00, 0xf0, 0x16, 0xf8, 0x00, 0x92, 0x2b, 0x46, + 0x39, 0x68, 0x78, 0x69, 0xb5, 0x69, 0x4a, 0x46, 0xa8, 0x47, 0x05, 0x46, + 0x03, 0x98, 0x01, 0x90, 0xcd, 0xf8, 0x00, 0x90, 0x2b, 0x46, 0x61, 0x68, + 0x4a, 0x6a, 0xf9, 0x68, 0x40, 0x46, 0xfb, 0xf7, 0x09, 0xfd, 0x05, 0xb0, + 0xbd, 0xe8, 0xf0, 0x83, 0x02, 0x90, 0x4f, 0xf4, 0x80, 0x71, 0x01, 0x91, + 0x03, 0xaa, 0x70, 0x47, 0x31, 0x46, 0xe0, 0xb2, 0x00, 0xe0, 0x00, 0x00, + 0x80, 0xb5, 0xff, 0x22, 0x06, 0x28, 0x15, 0xd8, 0xdf, 0xe8, 0x00, 0xf0, + 0x04, 0x0c, 0x0c, 0x08, 0x04, 0x0c, 0x10, 0x00, 0x08, 0x46, 0xde, 0xf7, + 0x05, 0xff, 0x0a, 0xe0, 0x08, 0x46, 0xde, 0xf7, 0x16, 0xff, 0x06, 0xe0, + 0x08, 0x46, 0xde, 0xf7, 0x03, 0xff, 0x02, 0xe0, 0x08, 0x46, 0xde, 0xf7, + 0x08, 0xff, 0x02, 0x46, 0x10, 0x46, 0x02, 0xbd, 0x80, 0xb5, 0xff, 0x22, + 0x06, 0x28, 0x15, 0xd8, 0xdf, 0xe8, 0x00, 0xf0, 0x04, 0x0c, 0x0c, 0x08, + 0x04, 0x0c, 0x10, 0x00, 0x08, 0x46, 0xde, 0xf7, 0x07, 0xff, 0x0a, 0xe0, + 0x08, 0x46, 0xde, 0xf7, 0x15, 0xff, 0x06, 0xe0, 0x08, 0x46, 0xde, 0xf7, + 0x05, 0xff, 0x02, 0xe0, 0x08, 0x46, 0xde, 0xf7, 0x07, 0xff, 0x02, 0x46, + 0x10, 0x46, 0x02, 0xbd, 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x00, 0xf0, + 0x63, 0xff, 0x10, 0xb1, 0x62, 0x48, 0x04, 0x70, 0x45, 0x70, 0x31, 0xbd, + 0x2d, 0xe9, 0xfe, 0x4f, 0x82, 0xb0, 0x04, 0x46, 0x0d, 0x46, 0xdd, 0xf8, + 0x38, 0xb0, 0xdf, 0xf8, 0x7c, 0x81, 0x20, 0x21, 0x40, 0x46, 0xe2, 0xf7, + 0x47, 0xfc, 0x01, 0xa8, 0x00, 0x90, 0x0d, 0xf1, 0x05, 0x03, 0x0d, 0xf1, + 0x06, 0x02, 0x20, 0x46, 0x29, 0x46, 0xef, 0xf7, 0xa7, 0xfc, 0x40, 0x46, + 0xff, 0xf7, 0x5c, 0xfd, 0x00, 0x26, 0x04, 0x46, 0x00, 0x25, 0x4f, 0xf0, + 0x01, 0x09, 0x0c, 0xe0, 0x01, 0x22, 0x50, 0x46, 0xff, 0xf7, 0xb4, 0xfc, + 0x04, 0x00, 0x38, 0xd1, 0x76, 0x1c, 0x7f, 0x1c, 0x08, 0x2f, 0x05, 0xd3, + 0x34, 0xe0, 0x03, 0x28, 0x32, 0xd0, 0x09, 0xfa, 0x05, 0xfa, 0x00, 0x27, + 0x58, 0xf8, 0x27, 0x20, 0x12, 0xea, 0x0a, 0x0f, 0x27, 0xd0, 0x9d, 0xf8, + 0x06, 0x00, 0x00, 0x23, 0x00, 0x28, 0x18, 0xbf, 0x1a, 0xf0, 0x11, 0x0f, + 0x09, 0xfa, 0x07, 0xf1, 0x03, 0xd0, 0x03, 0x98, 0x08, 0x42, 0x18, 0xbf, + 0x01, 0x23, 0x9d, 0xf8, 0x05, 0x00, 0x00, 0x28, 0x18, 0xbf, 0x1a, 0xf0, + 0x26, 0x0f, 0x03, 0xd0, 0x04, 0x98, 0x08, 0x42, 0x18, 0xbf, 0x01, 0x23, + 0x9d, 0xf8, 0x04, 0x00, 0x00, 0x28, 0x1c, 0xbf, 0x1a, 0xf0, 0x42, 0x0f, + 0x1b, 0xea, 0x01, 0x0f, 0xc8, 0xd1, 0x00, 0x2b, 0xc6, 0xd1, 0x22, 0xea, + 0x0a, 0x02, 0x48, 0xf8, 0x27, 0x20, 0x00, 0x2c, 0xc7, 0xd0, 0x1c, 0xb9, + 0x6d, 0x1c, 0xe8, 0xb2, 0x07, 0x28, 0xc6, 0xdb, 0x1e, 0xb3, 0x14, 0xbb, + 0x00, 0x25, 0x01, 0xe0, 0x03, 0x28, 0x1a, 0xd0, 0x00, 0x26, 0x58, 0xf8, + 0x26, 0x00, 0xe8, 0x40, 0xc1, 0x07, 0x10, 0xd5, 0x31, 0x46, 0xe8, 0xb2, + 0xff, 0xf7, 0x4a, 0xff, 0xff, 0x28, 0x0a, 0xd0, 0xea, 0xb2, 0x90, 0x23, + 0x20, 0x49, 0x5a, 0x43, 0x24, 0x24, 0x8b, 0x18, 0x60, 0x43, 0x18, 0x44, + 0xff, 0xf7, 0xa5, 0xfa, 0x04, 0x46, 0x34, 0xb9, 0x76, 0x1c, 0x08, 0x2e, + 0xe5, 0xd3, 0x6d, 0x1c, 0xe8, 0xb2, 0x07, 0x28, 0xde, 0xdb, 0x20, 0x46, + 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0x00, 0x84, 0x8b, 0x00, 0x20, + 0x70, 0x6f, 0x04, 0x01, 0x70, 0xb5, 0x00, 0x20, 0x00, 0x24, 0x18, 0x4d, + 0x01, 0xe0, 0x03, 0x29, 0x10, 0xd0, 0x00, 0x26, 0x55, 0xf8, 0x26, 0x10, + 0xe1, 0x40, 0xcb, 0x07, 0x07, 0xd5, 0x01, 0x20, 0x00, 0xfa, 0x06, 0xf1, + 0x00, 0x22, 0xa0, 0x40, 0xff, 0xf7, 0x32, 0xfc, 0x10, 0xb9, 0x76, 0x1c, + 0x08, 0x2e, 0xef, 0xd3, 0x64, 0x1c, 0xe1, 0xb2, 0x07, 0x29, 0xe8, 0xdb, + 0x70, 0xbd, 0x00, 0x00, 0xb4, 0x76, 0x02, 0x20, 0xb0, 0x76, 0x02, 0x20, + 0xc8, 0x66, 0x03, 0x20, 0xf7, 0xf5, 0x02, 0x01, 0xcc, 0x6a, 0x02, 0x20, + 0x98, 0x33, 0x02, 0x20, 0x38, 0x53, 0x02, 0x20, 0xf8, 0x54, 0x02, 0x20, + 0x94, 0x8b, 0x00, 0x20, 0xa6, 0x77, 0x02, 0x20, 0x04, 0xed, 0x00, 0xe0, + 0x8c, 0x75, 0x02, 0x20, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x3a, 0x20, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x20, 0x25, 0x73, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x50, 0x41, 0x53, 0x53, 0x00, 0x00, 0x00, 0x00, 0x46, 0x41, 0x49, 0x4c, + 0x00, 0x00, 0x00, 0x00, 0x79, 0xfe, 0x02, 0x01, 0xd7, 0xfe, 0x02, 0x01, + 0x75, 0xff, 0x02, 0x01, 0x77, 0x00, 0x03, 0x01, 0x45, 0x01, 0x03, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x47, 0x87, 0x4c, 0xdf, 0xf8, + 0x20, 0xa2, 0x80, 0x46, 0x89, 0x46, 0x00, 0x26, 0x04, 0xf1, 0xb0, 0x05, + 0x28, 0xfa, 0x06, 0xf0, 0xc0, 0x07, 0x25, 0xd5, 0x30, 0x46, 0xde, 0xf7, + 0xdf, 0xfd, 0x07, 0x46, 0xff, 0x2f, 0x1f, 0xd0, 0x00, 0x20, 0x09, 0xf8, + 0x07, 0x00, 0x29, 0x46, 0x30, 0x46, 0x04, 0xf0, 0x15, 0xfa, 0x20, 0xb1, + 0x01, 0x46, 0x03, 0x22, 0x02, 0x20, 0xec, 0xf7, 0x3f, 0xfa, 0x0c, 0x21, + 0x4f, 0xf4, 0x58, 0x72, 0x78, 0x48, 0x79, 0x43, 0x7a, 0x43, 0x08, 0x44, + 0x2c, 0x21, 0x4a, 0x44, 0x4f, 0x43, 0x13, 0x1d, 0xe1, 0x19, 0x05, 0x60, + 0x43, 0x60, 0x81, 0x60, 0xda, 0xf8, 0x00, 0x20, 0x42, 0xf8, 0x26, 0x00, + 0x76, 0x1c, 0x08, 0x2e, 0xd2, 0xd3, 0xbd, 0xe8, 0xf0, 0x87, 0x2d, 0xe9, + 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, 0x82, 0xb0, 0x00, 0x24, 0x00, 0x27, + 0xb2, 0xee, 0x04, 0x8a, 0xdf, 0xf8, 0x9c, 0x91, 0x00, 0x90, 0x8a, 0x46, + 0x00, 0x98, 0xf8, 0x40, 0xc1, 0x07, 0x57, 0xd5, 0x38, 0x46, 0xde, 0xf7, + 0xa3, 0xfd, 0x05, 0x46, 0x2c, 0x20, 0x68, 0x43, 0x09, 0xeb, 0x00, 0x08, + 0x40, 0x46, 0xf9, 0xf7, 0xdc, 0xf8, 0x4f, 0xf4, 0x58, 0x71, 0x69, 0x43, + 0x0a, 0xeb, 0x01, 0x06, 0x32, 0x1d, 0x09, 0xf1, 0xb0, 0x01, 0x38, 0x46, + 0x04, 0xf0, 0xd5, 0xf9, 0x04, 0x46, 0x21, 0x46, 0x40, 0x46, 0xf9, 0xf7, + 0xd0, 0xf8, 0x00, 0x2c, 0x3a, 0xd1, 0x01, 0x20, 0x0a, 0xf8, 0x05, 0x00, + 0x35, 0x1d, 0x05, 0xf5, 0x57, 0x76, 0x96, 0xf8, 0x00, 0xb0, 0x05, 0xeb, + 0x8b, 0x00, 0x90, 0xed, 0x07, 0x0a, 0xd0, 0xed, 0x47, 0x0a, 0x90, 0xed, + 0x87, 0x1a, 0xc0, 0xee, 0x80, 0x8a, 0x80, 0xee, 0x01, 0x0a, 0xd0, 0xf7, + 0x6d, 0xff, 0x20, 0xee, 0x08, 0x0a, 0x88, 0xed, 0x05, 0x0a, 0xb0, 0xee, + 0x68, 0x0a, 0xd0, 0xf7, 0x65, 0xff, 0x20, 0xee, 0x08, 0x0a, 0x88, 0xed, + 0x06, 0x0a, 0x08, 0xf1, 0x1c, 0x00, 0xdd, 0xf7, 0x69, 0xfd, 0x05, 0xeb, + 0x0b, 0x00, 0x90, 0xf8, 0x1c, 0x03, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, + 0x40, 0x0a, 0x88, 0xed, 0x08, 0x0a, 0x08, 0xf1, 0x24, 0x00, 0xdd, 0xf7, + 0x60, 0xfd, 0x70, 0x78, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, + 0x88, 0xed, 0x0a, 0x0a, 0x7f, 0x1c, 0x08, 0x2f, 0x01, 0xd2, 0x00, 0x2c, + 0x9e, 0xd0, 0x02, 0xb0, 0x20, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, + 0xf2, 0x8f, 0x80, 0xb5, 0x00, 0xf0, 0x09, 0xf8, 0xe8, 0xf7, 0xfb, 0xfc, + 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x03, 0xf8, 0xe8, 0xf7, 0xe0, 0xfc, + 0x02, 0xbd, 0x00, 0x92, 0x0b, 0x46, 0x02, 0x46, 0x20, 0x21, 0x2d, 0x48, + 0x70, 0x47, 0xf8, 0xb5, 0x0c, 0x46, 0x15, 0x46, 0x1f, 0x46, 0xf9, 0xf7, + 0x83, 0xf8, 0xde, 0xf7, 0x29, 0xfd, 0x00, 0x26, 0xff, 0x28, 0x1a, 0xd0, + 0x2c, 0x21, 0x23, 0x4a, 0x48, 0x43, 0x11, 0x18, 0x1f, 0xb1, 0x02, 0x2f, + 0x0b, 0xd0, 0x0a, 0xd3, 0x0b, 0xe0, 0x14, 0x27, 0x28, 0x68, 0xb8, 0x42, + 0x0a, 0xd3, 0x3a, 0x46, 0x20, 0x46, 0xd0, 0xf7, 0x69, 0xfc, 0x2f, 0x60, + 0x09, 0xe0, 0x2c, 0x27, 0xf4, 0xe7, 0x4f, 0xf6, 0x2a, 0x76, 0x04, 0xe0, + 0x4f, 0xf6, 0x26, 0x76, 0x01, 0xe0, 0x4f, 0xf6, 0x2b, 0x76, 0x30, 0x46, + 0xf2, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x00, 0x26, 0x24, 0xfa, + 0x06, 0xf0, 0xc0, 0x07, 0x0a, 0xd5, 0x30, 0x46, 0xde, 0xf7, 0xfc, 0xfc, + 0xff, 0x28, 0x05, 0xd0, 0x00, 0xeb, 0x40, 0x00, 0x29, 0x18, 0x30, 0x46, + 0x04, 0xf0, 0x4c, 0xfa, 0x76, 0x1c, 0x08, 0x2e, 0xed, 0xd3, 0x70, 0xbd, + 0x38, 0xb5, 0x04, 0x46, 0x00, 0x20, 0x00, 0x25, 0x24, 0xfa, 0x05, 0xf1, + 0xca, 0x07, 0x04, 0xd5, 0x07, 0x49, 0x28, 0x46, 0x04, 0xf0, 0x24, 0xf9, + 0x10, 0xb9, 0x6d, 0x1c, 0x08, 0x2d, 0xf3, 0xd3, 0x32, 0xbd, 0x00, 0x00, + 0xb8, 0x47, 0x00, 0x20, 0x88, 0x04, 0x00, 0x01, 0x80, 0x73, 0x02, 0x20, + 0x68, 0x48, 0x00, 0x20, 0xf8, 0xb5, 0x05, 0x46, 0x0e, 0x46, 0x00, 0x24, + 0x00, 0x27, 0x25, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x0c, 0xd5, 0x38, 0x46, + 0xde, 0xf7, 0xca, 0xfc, 0xff, 0x28, 0x07, 0xd0, 0x00, 0xeb, 0x40, 0x00, + 0x31, 0x18, 0x38, 0x46, 0x04, 0xf0, 0x12, 0xfa, 0x04, 0x00, 0x02, 0xd1, + 0x7f, 0x1c, 0x08, 0x2f, 0xeb, 0xd3, 0x20, 0x46, 0xf2, 0xbd, 0x00, 0x00, + 0xd2, 0xb2, 0x20, 0x3a, 0x22, 0xbf, 0x00, 0xfa, 0x02, 0xf1, 0x00, 0x20, + 0x70, 0x47, 0x52, 0x42, 0xd0, 0x41, 0xd2, 0xf1, 0x20, 0x02, 0x91, 0x40, + 0x41, 0x40, 0xd0, 0x40, 0x90, 0x40, 0x41, 0x40, 0x70, 0x47, 0x00, 0x00, + 0x2d, 0xe9, 0xfe, 0x4f, 0x12, 0x20, 0xf1, 0xf7, 0xb3, 0xfa, 0x04, 0x46, + 0xdc, 0xf7, 0x97, 0xfe, 0x00, 0x27, 0xdf, 0xf8, 0xa0, 0x16, 0xdf, 0xf8, + 0xa0, 0x66, 0x88, 0x42, 0x80, 0x41, 0xc0, 0x43, 0xc0, 0x0f, 0x8d, 0xf8, + 0x08, 0x00, 0xb8, 0x46, 0xdc, 0xf7, 0x89, 0xfe, 0xdf, 0xf8, 0x8c, 0x16, + 0x88, 0x42, 0x26, 0xbf, 0x9d, 0xf8, 0x08, 0x00, 0x80, 0xf0, 0x01, 0x09, + 0xb9, 0x46, 0xba, 0x46, 0x00, 0x25, 0x00, 0x94, 0xe8, 0xb2, 0xde, 0xf7, + 0xcf, 0xfc, 0x01, 0x28, 0x0c, 0xbf, 0x01, 0x24, 0x00, 0x24, 0x28, 0x46, + 0xde, 0xf7, 0x8b, 0xfc, 0x00, 0x2c, 0x18, 0xbf, 0xff, 0x28, 0x32, 0xd0, + 0xd0, 0x22, 0xdf, 0xf8, 0x5c, 0x16, 0x42, 0x43, 0x8c, 0x18, 0x00, 0x23, + 0x23, 0x61, 0xe9, 0xb2, 0x21, 0x60, 0x60, 0x60, 0xa3, 0x62, 0x66, 0x61, + 0x82, 0x46, 0x96, 0xf8, 0x0e, 0xb0, 0x20, 0x46, 0xf1, 0xf7, 0xbd, 0xfc, + 0xe0, 0x6a, 0xc1, 0x6b, 0x48, 0x7d, 0x01, 0x28, 0x00, 0x98, 0x08, 0xbf, + 0x4f, 0xf0, 0x01, 0x08, 0x10, 0xb1, 0x58, 0xea, 0x0b, 0x00, 0x04, 0xd0, + 0x02, 0x20, 0x01, 0x21, 0x20, 0x67, 0x61, 0x67, 0x05, 0xe0, 0xdd, 0xf7, + 0x92, 0xfc, 0xc0, 0x1c, 0x20, 0x67, 0x02, 0x20, 0x60, 0x67, 0x20, 0x46, + 0xf1, 0xf7, 0xa3, 0xfc, 0xe0, 0x6a, 0xc1, 0x6b, 0x48, 0x7d, 0x01, 0x28, + 0x08, 0xbf, 0x4f, 0xf0, 0x01, 0x08, 0x28, 0x46, 0xf2, 0xf7, 0x31, 0xf8, + 0x00, 0xf0, 0x06, 0x00, 0x02, 0x28, 0x14, 0xbf, 0x04, 0x28, 0x47, 0xf0, + 0x01, 0x07, 0x6d, 0x1c, 0x08, 0x2d, 0xb1, 0xd3, 0x00, 0x26, 0xf0, 0xb2, + 0xde, 0xf7, 0x80, 0xfc, 0x01, 0x28, 0x0c, 0xbf, 0x01, 0x24, 0x00, 0x24, + 0x30, 0x46, 0xde, 0xf7, 0x3c, 0xfc, 0x00, 0x2c, 0x1a, 0xbf, 0xff, 0x28, + 0x01, 0x21, 0x00, 0x21, 0x9d, 0xf8, 0x08, 0x00, 0x00, 0x90, 0xcd, 0xf8, + 0x04, 0x90, 0x43, 0x46, 0xfa, 0xb2, 0x30, 0x46, 0xf1, 0xf7, 0x1e, 0xfd, + 0x76, 0x1c, 0x08, 0x2e, 0xe3, 0xd3, 0x50, 0x46, 0xf2, 0xf7, 0x64, 0xf8, + 0xbd, 0xe8, 0xfe, 0x4f, 0x01, 0x20, 0xdc, 0xf7, 0x88, 0xbe, 0x2d, 0xe9, + 0xf8, 0x4f, 0x01, 0x46, 0xdf, 0xf8, 0x84, 0x05, 0x00, 0x7a, 0x00, 0x25, + 0x84, 0xb0, 0xaa, 0x46, 0x08, 0xb1, 0x05, 0x28, 0x01, 0xd3, 0x40, 0xf6, + 0x03, 0x45, 0x00, 0x23, 0x03, 0x91, 0x02, 0x90, 0x04, 0xe0, 0x0b, 0xfa, + 0x03, 0xf1, 0x41, 0xea, 0x0a, 0x0a, 0x5b, 0x1c, 0x83, 0x42, 0x4f, 0xf0, + 0x01, 0x0b, 0xf6, 0xd3, 0x00, 0x2d, 0x40, 0xf0, 0x8e, 0x80, 0x03, 0x9c, + 0x1a, 0xea, 0x04, 0x04, 0x00, 0xf0, 0x81, 0x80, 0xf1, 0xf7, 0x3a, 0xfc, + 0xa1, 0x46, 0x4f, 0xf0, 0x00, 0x08, 0x00, 0x26, 0x00, 0x24, 0x29, 0xfa, + 0x06, 0xf0, 0xc0, 0x07, 0x24, 0xd5, 0x30, 0x46, 0xde, 0xf7, 0xf1, 0xfb, + 0x07, 0x46, 0xf0, 0xb2, 0xde, 0xf7, 0x2a, 0xfc, 0x01, 0x28, 0x1b, 0xd1, + 0xff, 0x2f, 0x19, 0xd0, 0xd0, 0x21, 0xdf, 0xf8, 0x20, 0x05, 0x4f, 0x43, + 0xc5, 0x19, 0x00, 0x20, 0xa8, 0x60, 0x28, 0x61, 0xe8, 0x60, 0xa8, 0x69, + 0xf8, 0xf7, 0x0f, 0xff, 0xa9, 0x69, 0x68, 0x6b, 0x14, 0x22, 0xd0, 0xf7, + 0x1d, 0xfb, 0x28, 0x46, 0xf1, 0xf7, 0xf3, 0xfd, 0x05, 0x00, 0x04, 0xbf, + 0x0b, 0xfa, 0x06, 0xf0, 0x40, 0xea, 0x08, 0x08, 0x04, 0xb9, 0x2c, 0x46, + 0x76, 0x1c, 0x08, 0x2e, 0xd1, 0xd3, 0x25, 0x46, 0x44, 0x46, 0x23, 0x46, + 0x0f, 0xf2, 0xf4, 0x42, 0x0c, 0x21, 0x03, 0x20, 0xde, 0xf7, 0xab, 0xfc, + 0x00, 0x2d, 0x40, 0xd1, 0x00, 0x20, 0x01, 0x90, 0x4f, 0xf0, 0x07, 0x08, + 0x81, 0x46, 0x24, 0xfa, 0x00, 0xf1, 0xc9, 0x07, 0x05, 0xd5, 0x40, 0x45, + 0x98, 0xbf, 0x80, 0x46, 0x48, 0x45, 0x28, 0xbf, 0x81, 0x46, 0x40, 0x1c, + 0x08, 0x28, 0xf2, 0xd3, 0x2a, 0xe0, 0x24, 0xfa, 0x06, 0xf0, 0xc0, 0x07, + 0x23, 0xd5, 0x30, 0x46, 0xde, 0xf7, 0xa5, 0xfb, 0xd0, 0x22, 0xdf, 0xf8, + 0x98, 0x14, 0x50, 0x43, 0x0f, 0x18, 0x01, 0xa9, 0x38, 0x46, 0xf1, 0xf7, + 0xe1, 0xfd, 0xa0, 0xb1, 0x0b, 0xfa, 0x06, 0xf0, 0x84, 0x43, 0x01, 0x99, + 0xb8, 0x69, 0xf8, 0xf7, 0xca, 0xfe, 0xb9, 0x69, 0x78, 0x6b, 0x14, 0x22, + 0xd0, 0xf7, 0xd4, 0xfa, 0x01, 0x98, 0xdf, 0xf8, 0x70, 0x24, 0x00, 0x90, + 0x33, 0x46, 0x0c, 0x21, 0x03, 0x20, 0xde, 0xf7, 0x70, 0xfc, 0x05, 0xb9, + 0x01, 0x9d, 0x76, 0x1c, 0xb1, 0x45, 0x00, 0xd2, 0x46, 0x46, 0x00, 0x2c, + 0xd1, 0xd1, 0x02, 0x98, 0x0a, 0xfa, 0x00, 0xfa, 0x40, 0xf2, 0x01, 0x11, + 0x8a, 0x45, 0xff, 0xf4, 0x6f, 0xaf, 0x2b, 0x46, 0x0f, 0xf2, 0x60, 0x42, + 0x0c, 0x21, 0x03, 0x20, 0xde, 0xf7, 0x59, 0xfc, 0x28, 0x46, 0x05, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x2d, 0xe9, 0xf8, 0x4f, 0x0f, 0xf2, 0x60, 0x42, + 0x33, 0x21, 0x04, 0x20, 0xde, 0xf7, 0x4d, 0xfc, 0x00, 0x24, 0x00, 0x27, + 0x0f, 0xf2, 0x64, 0x48, 0xdf, 0xf8, 0x04, 0xb4, 0xf8, 0xb2, 0xde, 0xf7, + 0x97, 0xfb, 0x01, 0x28, 0x0c, 0xbf, 0x01, 0x25, 0x00, 0x25, 0x38, 0x46, + 0xde, 0xf7, 0x53, 0xfb, 0x81, 0x46, 0xb9, 0xf1, 0xff, 0x0f, 0x9b, 0xf8, + 0x0c, 0x00, 0x14, 0xbf, 0x4f, 0xf0, 0x01, 0x0a, 0x4f, 0xf0, 0x00, 0x0a, + 0x01, 0x28, 0x0c, 0xbf, 0x01, 0x26, 0x00, 0x26, 0xf8, 0xf7, 0x88, 0xfe, + 0x40, 0x1e, 0x80, 0x41, 0x86, 0xf0, 0x01, 0x01, 0x06, 0xea, 0xd0, 0x76, + 0x0a, 0xea, 0x05, 0x05, 0x0e, 0x43, 0x35, 0x42, 0x40, 0xd0, 0x3b, 0x46, + 0x42, 0x46, 0x33, 0x21, 0x04, 0x20, 0xde, 0xf7, 0x1c, 0xfc, 0xd0, 0x21, + 0xdf, 0xf8, 0xb0, 0x03, 0x01, 0xfb, 0x09, 0xf1, 0x45, 0x18, 0x00, 0x22, + 0xe8, 0x69, 0x42, 0x60, 0x14, 0x22, 0x68, 0x6b, 0xe9, 0x69, 0x00, 0xf5, + 0x16, 0x76, 0x30, 0x46, 0xd0, 0xf7, 0x76, 0xfa, 0xa8, 0x69, 0xc1, 0x68, + 0x31, 0xb1, 0x00, 0x68, 0x20, 0xb9, 0x28, 0x46, 0xf1, 0xf7, 0xc2, 0xfd, + 0x2c, 0x69, 0x01, 0xe0, 0x40, 0xf6, 0x0f, 0x44, 0xe8, 0x69, 0x21, 0x46, + 0xf8, 0xf7, 0x47, 0xfe, 0xe9, 0x69, 0x14, 0x22, 0x30, 0x46, 0xd0, 0xf7, + 0x61, 0xfa, 0x84, 0xb1, 0x40, 0xf6, 0x0b, 0x40, 0x84, 0x42, 0x1a, 0xbf, + 0x40, 0xf6, 0x05, 0x41, 0x8c, 0x42, 0x00, 0x24, 0x07, 0xd0, 0x00, 0x94, + 0x3b, 0x46, 0x0f, 0xf2, 0xbc, 0x32, 0x33, 0x21, 0x03, 0x20, 0xde, 0xf7, + 0xe4, 0xfb, 0x01, 0x20, 0xec, 0xf7, 0xbc, 0xff, 0x7f, 0x1c, 0x08, 0x2f, + 0x96, 0xd3, 0x0f, 0xf2, 0xc4, 0x32, 0x33, 0x21, 0x04, 0x20, 0xde, 0xf7, + 0xd8, 0xfb, 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x8f, 0x3e, 0xb5, 0x06, 0x9d, + 0x00, 0x95, 0x01, 0x24, 0x03, 0xe0, 0x3e, 0xb5, 0x06, 0x9d, 0x00, 0x95, + 0x00, 0x24, 0x01, 0x94, 0x00, 0xf0, 0x01, 0xf8, 0x3e, 0xbd, 0x2d, 0xe9, + 0xf0, 0x47, 0x89, 0x46, 0x17, 0x46, 0x1c, 0x46, 0xf8, 0xf7, 0x20, 0xfe, + 0x80, 0x46, 0xde, 0xf7, 0xd4, 0xfa, 0x05, 0x46, 0x5f, 0xfa, 0x88, 0xf0, + 0xde, 0xf7, 0x0c, 0xfb, 0x00, 0x26, 0x01, 0x28, 0x74, 0xd1, 0xff, 0x2d, + 0x72, 0xd0, 0xd0, 0x20, 0xb8, 0x49, 0x45, 0x43, 0x09, 0x98, 0x4d, 0x19, + 0x1c, 0xb1, 0x02, 0x2c, 0x32, 0xd0, 0x0e, 0xd3, 0x62, 0xe0, 0x00, 0x28, + 0x0c, 0xbf, 0xe9, 0x69, 0xa9, 0x69, 0x14, 0x24, 0x38, 0x68, 0xa0, 0x42, + 0x5d, 0xd3, 0x48, 0x46, 0x22, 0x46, 0xd0, 0xf7, 0xf9, 0xf9, 0x3c, 0x60, + 0x5c, 0xe0, 0x28, 0x68, 0x00, 0x22, 0x01, 0x21, 0xc0, 0xb2, 0x00, 0xf0, + 0x21, 0xf9, 0x04, 0x46, 0x04, 0xf1, 0x2c, 0x08, 0x28, 0x46, 0xd8, 0xf8, + 0x00, 0xa0, 0xf1, 0xf7, 0x79, 0xfe, 0x20, 0x46, 0xf1, 0xf7, 0x76, 0xfe, + 0xa6, 0x4c, 0x95, 0xf8, 0x46, 0x00, 0x20, 0x70, 0x4f, 0xf4, 0xb6, 0x72, + 0x98, 0xf8, 0x1a, 0x10, 0x61, 0x70, 0x20, 0x1d, 0xda, 0xf8, 0x30, 0x10, + 0xd0, 0xf7, 0xe8, 0xf9, 0x21, 0x46, 0x4f, 0xf4, 0xb8, 0x74, 0xd3, 0xe7, + 0xe9, 0x6a, 0xc9, 0x6b, 0x02, 0x00, 0x3a, 0x68, 0x12, 0xbf, 0x4f, 0xf4, + 0x16, 0x74, 0x01, 0xf5, 0x16, 0x71, 0x4f, 0xf4, 0x79, 0x74, 0x10, 0x3a, + 0xa2, 0x42, 0xc5, 0xd2, 0x97, 0x4b, 0x5d, 0x68, 0xa8, 0x45, 0x0a, 0xd1, + 0xd3, 0xf8, 0x08, 0xc0, 0xbc, 0xf1, 0x00, 0x0f, 0x18, 0xbf, 0x4f, 0xf0, + 0x01, 0x0c, 0x5f, 0xfa, 0x8c, 0xf5, 0xa8, 0x42, 0x00, 0xd0, 0x1e, 0x60, + 0x1d, 0x68, 0x05, 0xfb, 0x02, 0xfc, 0x6d, 0x1c, 0x1d, 0x60, 0x64, 0x45, + 0xc3, 0xf8, 0x04, 0x80, 0x98, 0x60, 0xab, 0xd3, 0xa4, 0xeb, 0x0c, 0x04, + 0x94, 0x42, 0x88, 0xbf, 0x14, 0x46, 0x94, 0x42, 0x61, 0x44, 0xa3, 0xd2, + 0x1e, 0x60, 0xa1, 0xe7, 0x4f, 0xf6, 0x2a, 0x76, 0x04, 0xe0, 0x4f, 0xf6, + 0x26, 0x76, 0x01, 0xe0, 0x4f, 0xf6, 0x2b, 0x76, 0x30, 0x46, 0xbd, 0xe8, + 0xf0, 0x87, 0x1c, 0xb5, 0x04, 0x04, 0x04, 0xd5, 0x00, 0xf0, 0x15, 0xf8, + 0xe8, 0xf7, 0xf9, 0xf9, 0x16, 0xbd, 0x01, 0x24, 0x01, 0xe0, 0x1c, 0xb5, + 0x00, 0x24, 0x00, 0x94, 0xf1, 0xf7, 0x3e, 0xfc, 0x16, 0xbd, 0x1c, 0xb5, + 0x04, 0x04, 0x04, 0xd5, 0x00, 0xf0, 0x05, 0xf8, 0xe8, 0xf7, 0xd4, 0xf9, + 0x16, 0xbd, 0x01, 0x24, 0x09, 0xe0, 0x00, 0x92, 0x0b, 0x46, 0xa0, 0xf5, + 0x00, 0x42, 0x92, 0xb2, 0x14, 0x21, 0x6b, 0x48, 0x70, 0x47, 0x1c, 0xb5, + 0x00, 0x24, 0x00, 0x94, 0xf1, 0xf7, 0x34, 0xfc, 0x16, 0xbd, 0x2d, 0xe9, + 0xf8, 0x4f, 0x1e, 0x00, 0x0c, 0x46, 0x4f, 0xf0, 0x00, 0x08, 0x32, 0xd0, + 0x17, 0x46, 0x38, 0x78, 0xde, 0xf7, 0x5c, 0xfa, 0x01, 0x28, 0x18, 0xd1, + 0x38, 0x78, 0xde, 0xf7, 0x1a, 0xfa, 0xff, 0x28, 0x53, 0xd0, 0xd0, 0x21, + 0x5f, 0x4a, 0x0a, 0x9d, 0x48, 0x43, 0x62, 0x49, 0x02, 0xeb, 0x00, 0x09, + 0x08, 0x78, 0x02, 0x2c, 0x4c, 0xd0, 0x6f, 0xd3, 0x04, 0x2c, 0x52, 0xd0, + 0x6c, 0xd2, 0x78, 0x78, 0x08, 0x28, 0x05, 0xdb, 0x40, 0xf6, 0x02, 0x48, + 0x3f, 0xe0, 0x4f, 0xf6, 0x2b, 0x78, 0x3c, 0xe0, 0x02, 0x2e, 0x0e, 0xd9, + 0x38, 0x78, 0x08, 0x70, 0x00, 0xf0, 0x61, 0xf8, 0xba, 0x78, 0x79, 0x78, + 0x82, 0x46, 0xf1, 0xf7, 0x6b, 0xfd, 0x04, 0x00, 0x1a, 0xd1, 0xda, 0xf8, + 0x2c, 0x40, 0x04, 0x2e, 0x02, 0xd2, 0x40, 0xf6, 0x03, 0x48, 0x28, 0xe0, + 0x97, 0xf8, 0x03, 0xb0, 0x50, 0x46, 0xf1, 0xf7, 0xc5, 0xfd, 0x36, 0x1f, + 0xb0, 0x42, 0xf4, 0xd1, 0x02, 0x46, 0xe0, 0x6a, 0x39, 0x1d, 0xd0, 0xf7, + 0x25, 0xf9, 0xbb, 0xf1, 0x01, 0x0f, 0x18, 0xd1, 0x50, 0x46, 0xf1, 0xf7, + 0x55, 0xfd, 0x04, 0x46, 0x9c, 0xb1, 0x48, 0x46, 0xf1, 0xf7, 0xd0, 0xfc, + 0x5f, 0xea, 0x00, 0x08, 0x0d, 0xd1, 0x64, 0xb1, 0xd9, 0xf8, 0x0c, 0x00, + 0x04, 0x43, 0xc9, 0xf8, 0x0c, 0x40, 0x48, 0x46, 0xf1, 0xf7, 0xc4, 0xfc, + 0x00, 0x90, 0x04, 0x20, 0x28, 0x60, 0x00, 0x98, 0x38, 0x60, 0x40, 0x46, + 0xbd, 0xe8, 0xf2, 0x8f, 0x00, 0xf0, 0x25, 0xf8, 0x06, 0x46, 0xf1, 0xf7, + 0x37, 0xfd, 0x04, 0x00, 0xf5, 0xd0, 0x30, 0x46, 0xe0, 0xe7, 0x00, 0x22, + 0x00, 0xf0, 0x1c, 0xf8, 0x04, 0x46, 0x48, 0x46, 0xf1, 0xf7, 0x86, 0xfd, + 0x20, 0x46, 0xf1, 0xf7, 0x83, 0xfd, 0x02, 0x20, 0x28, 0x60, 0x99, 0xf8, + 0x46, 0x10, 0x8d, 0xf8, 0x00, 0x10, 0x94, 0xf8, 0x46, 0x00, 0x9d, 0xf8, + 0x00, 0x10, 0x8d, 0xf8, 0x01, 0x00, 0x39, 0x70, 0x9d, 0xf8, 0x01, 0x10, + 0x79, 0x70, 0xd8, 0xe7, 0x4f, 0xf6, 0x27, 0x78, 0xd5, 0xe7, 0x01, 0x22, + 0x01, 0x21, 0x0b, 0xe0, 0x10, 0xb5, 0xde, 0xf7, 0x94, 0xf9, 0x00, 0x24, + 0xff, 0x28, 0x03, 0xd0, 0xd0, 0x21, 0x1c, 0x4a, 0x48, 0x43, 0x14, 0x18, + 0x20, 0x46, 0x10, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, 0x0e, 0x46, 0x90, 0x46, + 0xff, 0xf7, 0xee, 0xff, 0x04, 0x46, 0xd0, 0x20, 0x1a, 0x4d, 0x10, 0xfb, + 0x06, 0xf0, 0x2f, 0x18, 0xb8, 0xf1, 0x00, 0x0f, 0x4f, 0xf0, 0x00, 0x09, + 0x0f, 0xd0, 0xd0, 0x22, 0x21, 0x46, 0x38, 0x46, 0xd0, 0xf7, 0xba, 0xf8, + 0x58, 0x20, 0x46, 0x43, 0xa8, 0x19, 0x00, 0xf5, 0xd0, 0x76, 0xe1, 0x6a, + 0x58, 0x22, 0x30, 0x46, 0xd0, 0xf7, 0xb0, 0xf8, 0xfe, 0x62, 0x04, 0xb1, + 0xb9, 0x46, 0x48, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0x04, 0x49, 0x08, 0xb1, + 0xc8, 0x7a, 0x70, 0x47, 0x88, 0x7a, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, + 0xc1, 0x05, 0xd9, 0x01, 0x94, 0x57, 0x00, 0x20, 0x01, 0x36, 0x6e, 0x01, + 0x28, 0x56, 0x03, 0x20, 0x3c, 0x92, 0x04, 0x01, 0xb8, 0x61, 0x03, 0x20, + 0xa8, 0x57, 0x00, 0x20, 0xaf, 0x77, 0x02, 0x20, 0x68, 0x5f, 0x03, 0x20, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x3a, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x72, 0x64, 0x65, 0x73, 0x49, 0x6e, + 0x69, 0x74, 0x3a, 0x20, 0x65, 0x72, 0x72, 0x20, 0x30, 0x78, 0x25, 0x78, + 0x0a, 0x00, 0x00, 0x00, 0x53, 0x65, 0x72, 0x64, 0x65, 0x73, 0x54, 0x72, + 0x61, 0x63, 0x6b, 0x3a, 0x20, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x0a, 0x00, + 0x53, 0x65, 0x72, 0x64, 0x65, 0x73, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x3a, + 0x20, 0x6c, 0x61, 0x6e, 0x65, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x53, 0x65, 0x72, 0x64, 0x65, 0x73, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x3a, + 0x20, 0x6c, 0x61, 0x6e, 0x65, 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, + 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x53, 0x65, 0x72, 0x64, + 0x65, 0x73, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x3a, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x00, 0x00, 0x00, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x78, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x70, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x80, 0xb5, 0xdd, 0xf7, + 0xfe, 0xf8, 0x30, 0xb1, 0x00, 0x20, 0x00, 0x21, 0xa3, 0x4a, 0x11, 0x54, + 0x40, 0x1c, 0x06, 0x28, 0xfb, 0xd3, 0x0f, 0xf2, 0x1d, 0x21, 0xbd, 0xe8, + 0x04, 0x40, 0x02, 0x20, 0xe9, 0xf7, 0xf5, 0xbd, 0x10, 0xb5, 0x01, 0x46, + 0x9d, 0x48, 0x02, 0x68, 0x01, 0x20, 0x0c, 0x23, 0x43, 0x43, 0xd4, 0x58, + 0x8c, 0x42, 0x02, 0xd0, 0x40, 0x1c, 0x09, 0x28, 0xf7, 0xd3, 0x10, 0xbd, + 0xf8, 0xb5, 0x07, 0x46, 0x0c, 0x46, 0x16, 0x46, 0x00, 0xf0, 0x4c, 0xf9, + 0x00, 0x25, 0x60, 0xb1, 0x93, 0x48, 0x01, 0x68, 0x0c, 0x22, 0x7a, 0x43, + 0x88, 0x18, 0x09, 0x2f, 0x05, 0xd2, 0x81, 0x68, 0x31, 0x42, 0x1e, 0xbf, + 0x40, 0x68, 0x20, 0x42, 0x01, 0x25, 0x28, 0x46, 0xf2, 0xbd, 0x70, 0xb5, + 0x8b, 0x4b, 0x1c, 0x68, 0x0c, 0x25, 0x45, 0x43, 0x66, 0x59, 0x0e, 0x60, + 0x89, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x10, 0x60, 0x70, 0xbd, 0x87, 0x4a, + 0x00, 0x21, 0x42, 0xf8, 0x20, 0x10, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, + 0xdf, 0xf8, 0x08, 0xa2, 0x84, 0xb0, 0x81, 0x46, 0xda, 0xf8, 0x00, 0x50, + 0xda, 0xf8, 0x04, 0x00, 0x02, 0x90, 0x8b, 0x46, 0x14, 0x46, 0x00, 0xf0, + 0x1b, 0xf9, 0x00, 0x28, 0x4f, 0xf0, 0x00, 0x08, 0x14, 0xd0, 0xb9, 0xf1, + 0x09, 0x0f, 0x28, 0xbf, 0x4f, 0xf6, 0x64, 0x78, 0x80, 0xf0, 0x8f, 0x80, + 0x0c, 0x21, 0x03, 0x94, 0x01, 0xfb, 0x09, 0xf1, 0x01, 0x91, 0x6a, 0x18, + 0x00, 0x92, 0x91, 0x68, 0x03, 0x98, 0x01, 0x42, 0x1c, 0xbf, 0x51, 0x68, + 0x11, 0xea, 0x0b, 0x0f, 0x00, 0xf0, 0x7f, 0x80, 0x02, 0x98, 0x6d, 0x4e, + 0x07, 0x68, 0xff, 0x43, 0x3c, 0x46, 0x3d, 0x0a, 0xdd, 0xf7, 0xaf, 0xf8, + 0x3f, 0x0c, 0x00, 0x28, 0xe3, 0xb2, 0x14, 0xd1, 0xff, 0x22, 0x00, 0x21, + 0x69, 0x48, 0xff, 0xf7, 0x6f, 0xff, 0xeb, 0xb2, 0xff, 0x22, 0x00, 0x21, + 0x67, 0x48, 0xff, 0xf7, 0x69, 0xff, 0xfb, 0xb2, 0xff, 0x22, 0x00, 0x21, + 0x65, 0x48, 0xff, 0xf7, 0x63, 0xff, 0x34, 0x46, 0x75, 0x1c, 0xb6, 0x1c, + 0x13, 0xe0, 0xff, 0x22, 0x00, 0x21, 0x62, 0x48, 0xff, 0xf7, 0x5a, 0xff, + 0xeb, 0xb2, 0xff, 0x22, 0x00, 0x21, 0x60, 0x48, 0xff, 0xf7, 0x54, 0xff, + 0xfb, 0xb2, 0xff, 0x22, 0x00, 0x21, 0x5e, 0x48, 0xff, 0xf7, 0x4e, 0xff, + 0xf4, 0x1c, 0x35, 0x1d, 0x76, 0x1d, 0x20, 0x78, 0x48, 0xb9, 0x84, 0xf8, + 0x00, 0x90, 0x03, 0x98, 0x00, 0xf0, 0x47, 0xf8, 0x28, 0x70, 0x58, 0x46, + 0x00, 0xf0, 0x43, 0xf8, 0x30, 0x70, 0x00, 0x20, 0x01, 0xf0, 0xc2, 0xf9, + 0x10, 0xb1, 0x00, 0x20, 0x01, 0xf0, 0xcc, 0xf9, 0x02, 0x99, 0x4b, 0x4f, + 0x08, 0x68, 0x30, 0xb1, 0x00, 0xf0, 0xdc, 0xfa, 0x00, 0xf0, 0x3a, 0xf8, + 0x00, 0xf0, 0xc8, 0xfa, 0x10, 0xe0, 0xda, 0xf8, 0x00, 0x00, 0x01, 0x99, + 0x42, 0x58, 0x36, 0x2a, 0x3a, 0xbf, 0x57, 0xf8, 0x29, 0x00, 0x4b, 0xea, + 0x00, 0x00, 0xec, 0xf7, 0xc9, 0xfb, 0x47, 0xf8, 0x29, 0x00, 0x00, 0x20, + 0xec, 0xf7, 0x30, 0xf8, 0x00, 0x20, 0x01, 0xf0, 0x9f, 0xf9, 0x10, 0xb1, + 0x00, 0x20, 0x01, 0xf0, 0xe5, 0xf9, 0x20, 0x78, 0x28, 0xb1, 0x84, 0xf8, + 0x00, 0x80, 0x85, 0xf8, 0x00, 0x80, 0x86, 0xf8, 0x00, 0x80, 0x00, 0x98, + 0x01, 0x68, 0x36, 0x29, 0x3d, 0xbf, 0x57, 0xf8, 0x29, 0x00, 0x20, 0xea, + 0x0b, 0x00, 0x47, 0xf8, 0x29, 0x00, 0x47, 0xf8, 0x29, 0x80, 0x40, 0x46, + 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0xb0, 0xfa, 0x80, 0xf0, 0xc0, 0xf1, + 0x1f, 0x00, 0xc0, 0xb2, 0x70, 0x47, 0x00, 0x00, 0x31, 0x48, 0x01, 0x68, + 0x49, 0x1c, 0x01, 0x60, 0x00, 0xbe, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46, + 0xe8, 0xf7, 0x62, 0xf9, 0x00, 0x28, 0x20, 0x46, 0x0b, 0xd0, 0xec, 0xf7, + 0x8f, 0xf8, 0x60, 0xb1, 0x2a, 0x49, 0x4f, 0xf0, 0x80, 0x50, 0x08, 0x60, + 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x10, 0xbd, 0xbd, 0xe8, + 0x10, 0x40, 0xec, 0xf7, 0x4d, 0xb8, 0x10, 0xbd, 0x1f, 0xb5, 0x18, 0x21, + 0x8d, 0xf8, 0x00, 0x10, 0x00, 0x23, 0x8d, 0xf8, 0x01, 0x30, 0x0d, 0xf1, + 0x01, 0x02, 0x69, 0x46, 0x01, 0x20, 0x01, 0xf0, 0x3f, 0xf9, 0x1e, 0x49, + 0x08, 0x78, 0x9d, 0xf8, 0x00, 0x20, 0x01, 0x24, 0x90, 0x42, 0x1d, 0xd1, + 0x02, 0xaa, 0x01, 0xa9, 0x20, 0x46, 0xff, 0xf7, 0x04, 0xff, 0x01, 0x98, + 0x13, 0x28, 0x05, 0xd2, 0x02, 0x99, 0x01, 0xf0, 0xff, 0x01, 0xee, 0xf7, + 0x7f, 0xfc, 0x09, 0xe0, 0x36, 0x28, 0x04, 0xd2, 0x02, 0x99, 0xc9, 0xb2, + 0xfe, 0xf7, 0xbb, 0xfe, 0x02, 0xe0, 0x02, 0x98, 0xff, 0xf7, 0xbc, 0xff, + 0x20, 0x46, 0xff, 0xf7, 0xfa, 0xfe, 0x64, 0x1c, 0x09, 0x2c, 0xe1, 0xd3, + 0x1f, 0xbd, 0x00, 0x00, 0x0a, 0x02, 0x00, 0x47, 0x8c, 0x04, 0x00, 0x01, + 0x08, 0x74, 0x02, 0x20, 0x3d, 0x05, 0x00, 0x47, 0x3e, 0x05, 0x00, 0x47, + 0x3f, 0x05, 0x00, 0x47, 0x41, 0x05, 0x00, 0x47, 0x42, 0x05, 0x00, 0x47, + 0x43, 0x05, 0x00, 0x47, 0x90, 0x77, 0x02, 0x20, 0x04, 0xed, 0x00, 0xe0, + 0xc4, 0x02, 0x00, 0x47, 0x01, 0x46, 0x00, 0x20, 0x06, 0x4a, 0x91, 0x42, + 0x03, 0xd1, 0x06, 0x4b, 0x01, 0x21, 0x19, 0x60, 0x70, 0x47, 0x4f, 0xf6, + 0x60, 0x70, 0x70, 0x47, 0x02, 0x48, 0x00, 0x68, 0x70, 0x47, 0x00, 0x00, + 0xdb, 0xd1, 0x0a, 0x00, 0xa0, 0x03, 0x00, 0x01, 0xc9, 0xb2, 0x83, 0x07, + 0x06, 0xd0, 0x52, 0x1e, 0x22, 0xd3, 0x10, 0xf8, 0x01, 0x3b, 0x99, 0x42, + 0xf7, 0xd1, 0x1f, 0xe0, 0x08, 0x3a, 0x13, 0xd3, 0x02, 0xf1, 0x04, 0x02, + 0x41, 0xea, 0x01, 0x21, 0x41, 0xea, 0x01, 0x41, 0x50, 0xf8, 0x04, 0x3b, + 0x12, 0x1f, 0x21, 0xbf, 0x4b, 0x40, 0xa3, 0xf1, 0x01, 0x3c, 0x2c, 0xea, + 0x03, 0x0c, 0x1c, 0xf0, 0x80, 0x3f, 0xf3, 0xd0, 0xc9, 0xb2, 0x00, 0x1f, + 0x08, 0x32, 0x10, 0xf8, 0x01, 0x3b, 0x52, 0x1e, 0x28, 0xbf, 0x91, 0xea, + 0x03, 0x0f, 0xf8, 0xd8, 0x18, 0xbf, 0x01, 0x20, 0x40, 0x1e, 0x70, 0x47, + 0x10, 0xee, 0x10, 0x0a, 0xb5, 0xee, 0x40, 0x0a, 0x4f, 0xf0, 0x80, 0x7c, + 0x1c, 0xeb, 0x40, 0x0f, 0x42, 0xd2, 0xf1, 0xee, 0x10, 0xfa, 0xdf, 0xf8, + 0xa4, 0xc0, 0xdc, 0xec, 0x09, 0x0a, 0x45, 0xdd, 0x5f, 0xea, 0xd0, 0x5c, + 0x2b, 0xd0, 0xac, 0xf1, 0x7e, 0x0c, 0xa0, 0xeb, 0xcc, 0x50, 0x00, 0xee, + 0x10, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xbf, + 0xac, 0xf1, 0x01, 0x0c, 0x20, 0xee, 0x21, 0x0a, 0x00, 0xee, 0x90, 0xca, + 0xf8, 0xee, 0xe0, 0x0a, 0x70, 0xee, 0x41, 0x5a, 0x30, 0xee, 0x01, 0x6a, + 0x85, 0xee, 0x86, 0x6a, 0x66, 0xee, 0x06, 0x6a, 0x02, 0xee, 0xa6, 0x3a, + 0x43, 0xee, 0x26, 0x3a, 0xb0, 0xee, 0x65, 0x0a, 0x03, 0xee, 0xe6, 0x0a, + 0x20, 0xee, 0x06, 0x6a, 0x04, 0xee, 0xe0, 0x6a, 0x35, 0xee, 0xc6, 0x0a, + 0x04, 0xee, 0x20, 0x0a, 0x70, 0x47, 0x20, 0xee, 0x02, 0x0a, 0x10, 0xee, + 0x10, 0x0a, 0x4f, 0xea, 0xd0, 0x5c, 0xac, 0xf1, 0x7e, 0x0c, 0xa0, 0xeb, + 0xcc, 0x50, 0xac, 0xf1, 0x17, 0x0c, 0xca, 0xe7, 0x07, 0xd8, 0x00, 0x42, + 0x44, 0xbf, 0x6f, 0xf0, 0x00, 0x40, 0x00, 0xee, 0x10, 0x0a, 0xaf, 0xf3, + 0x00, 0x80, 0x70, 0x47, 0xf6, 0xdb, 0x6f, 0xf0, 0x00, 0x00, 0xc0, 0x05, + 0x00, 0xee, 0x10, 0x0a, 0x70, 0x47, 0x00, 0x00, 0x7c, 0x8d, 0x04, 0x01, + 0x01, 0x00, 0x10, 0xee, 0x10, 0x0a, 0xc0, 0xf3, 0xc7, 0x52, 0x0a, 0xd4, + 0xd2, 0xb3, 0xff, 0x2a, 0x37, 0xd0, 0x52, 0x18, 0xff, 0x2a, 0x4c, 0xd2, + 0x00, 0xeb, 0xc1, 0x51, 0x00, 0xee, 0x10, 0x1a, 0x70, 0x47, 0x49, 0x42, + 0x32, 0xb3, 0xff, 0x2a, 0x2b, 0xd0, 0x91, 0x42, 0x04, 0xd2, 0xa0, 0xeb, + 0xc1, 0x51, 0x00, 0xee, 0x10, 0x1a, 0x70, 0x47, 0x52, 0x1e, 0x89, 0x1a, + 0xa0, 0xeb, 0xc2, 0x50, 0x00, 0xee, 0x10, 0x0a, 0x19, 0x29, 0x18, 0xd8, + 0xc1, 0xf1, 0x7f, 0x01, 0xc9, 0x05, 0x00, 0xee, 0x90, 0x1a, 0xf1, 0xee, + 0x10, 0x1a, 0x21, 0xf0, 0x1f, 0x00, 0x20, 0xf4, 0xf8, 0x50, 0xe1, 0xee, + 0x10, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xf1, 0xee, 0x10, 0x0a, 0xe1, 0xee, + 0x10, 0x1a, 0x00, 0x09, 0x25, 0xd2, 0x70, 0x47, 0xc0, 0x42, 0xe5, 0xd1, + 0x70, 0x47, 0x00, 0xf0, 0x00, 0x40, 0x00, 0xee, 0x10, 0x0a, 0x70, 0x47, + 0xc0, 0x42, 0xfc, 0xd0, 0x7f, 0x29, 0x06, 0xd8, 0x7f, 0x31, 0xc9, 0x05, + 0x00, 0xee, 0x90, 0x1a, 0x20, 0xee, 0x20, 0x0a, 0x70, 0x47, 0x4f, 0xf0, + 0xfe, 0x40, 0x00, 0xee, 0x90, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0x7f, 0x39, + 0x10, 0xee, 0x10, 0x0a, 0xc0, 0xf3, 0xc7, 0x52, 0xaf, 0xe7, 0xc1, 0x0d, + 0x41, 0xf0, 0xff, 0x01, 0xc9, 0x05, 0x00, 0xee, 0x10, 0x1a, 0xaf, 0xf3, + 0x00, 0x80, 0x70, 0x47, 0x70, 0xb5, 0xb6, 0xb0, 0x04, 0x46, 0x0a, 0xa9, + 0x00, 0xf0, 0xd8, 0xf8, 0x00, 0x28, 0x67, 0xd1, 0x20, 0x79, 0x01, 0x28, + 0x05, 0xd1, 0xa1, 0x68, 0x20, 0x68, 0xfb, 0xf7, 0xed, 0xff, 0x05, 0x46, + 0x00, 0xe0, 0x00, 0x25, 0x0c, 0xa8, 0x09, 0x90, 0x0a, 0x21, 0x00, 0x22, + 0x03, 0x23, 0x08, 0x91, 0x07, 0x92, 0x06, 0x93, 0x4f, 0xf4, 0x80, 0x73, + 0x20, 0x69, 0x05, 0x90, 0x04, 0x92, 0x01, 0x20, 0x03, 0x92, 0x02, 0x93, + 0x01, 0x90, 0x00, 0x92, 0xb7, 0xee, 0x00, 0x1a, 0x20, 0x68, 0xd4, 0xed, + 0x05, 0x0a, 0x9f, 0xed, 0x24, 0x0a, 0x00, 0x23, 0x01, 0x21, 0xfc, 0xf7, + 0x4f, 0xf8, 0x14, 0xa8, 0x00, 0x21, 0x02, 0x90, 0x01, 0x95, 0x00, 0x91, + 0xbd, 0xf8, 0x28, 0x30, 0x22, 0x7e, 0x21, 0x79, 0x20, 0x68, 0xfb, 0xf7, + 0x17, 0xff, 0x1c, 0xa8, 0x07, 0x90, 0x00, 0x21, 0x01, 0x20, 0x01, 0x22, + 0x06, 0x91, 0x05, 0x91, 0x04, 0x91, 0x03, 0x90, 0x02, 0x91, 0x01, 0x92, + 0x00, 0x90, 0x14, 0xa9, 0xa3, 0x68, 0x20, 0x68, 0xfb, 0xf7, 0x1f, 0xff, + 0x01, 0x25, 0x00, 0x26, 0xe9, 0xb2, 0x18, 0x22, 0x1c, 0xa8, 0x51, 0x43, + 0x42, 0x18, 0x00, 0x23, 0x01, 0x21, 0x07, 0x92, 0x06, 0x93, 0x05, 0x96, + 0x04, 0x93, 0x03, 0x91, 0x02, 0x93, 0x01, 0x93, 0x00, 0x93, 0x01, 0x22, + 0x20, 0x68, 0x14, 0xa9, 0xfb, 0xf7, 0x09, 0xff, 0x6d, 0x1c, 0xe8, 0xb2, + 0x04, 0x28, 0xe7, 0xdb, 0x20, 0x68, 0x0c, 0xa9, 0xc0, 0x46, 0xc0, 0x46, + 0x20, 0x68, 0x00, 0x23, 0x0c, 0xaa, 0x02, 0x21, 0xfc, 0xf7, 0xc5, 0xfc, + 0x36, 0xb0, 0x70, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x46, 0x02, 0x21, + 0xfc, 0xf7, 0x12, 0xbf, 0xf8, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x07, 0x46, + 0x88, 0xb0, 0x0c, 0x46, 0x38, 0x68, 0x02, 0x21, 0xfc, 0xf7, 0xa3, 0xff, + 0x05, 0x46, 0x4f, 0xf4, 0x80, 0x72, 0x29, 0x46, 0x01, 0x20, 0xfc, 0xf7, + 0x74, 0xf8, 0x06, 0x46, 0x02, 0xa9, 0x38, 0x46, 0x00, 0xf0, 0x50, 0xf8, + 0xbd, 0xf8, 0x08, 0x20, 0x39, 0x79, 0x38, 0x68, 0xfb, 0xf7, 0x77, 0xfe, + 0xa0, 0x60, 0x29, 0x46, 0x01, 0x20, 0xfc, 0xf7, 0x86, 0xf8, 0x20, 0x60, + 0xb8, 0x68, 0x60, 0x60, 0x22, 0x68, 0xbd, 0xf8, 0x08, 0x10, 0x38, 0x7e, + 0xfc, 0xf7, 0x0c, 0xfa, 0x22, 0x68, 0xbd, 0xf8, 0x08, 0x10, 0x38, 0x7e, + 0xb0, 0xee, 0x40, 0x8a, 0xfc, 0xf7, 0x38, 0xfa, 0xf0, 0xee, 0x40, 0x8a, + 0x00, 0x22, 0x29, 0x46, 0x01, 0x20, 0xfc, 0xf7, 0x72, 0xf8, 0xb0, 0xee, + 0x48, 0x0a, 0xfc, 0xf7, 0xfd, 0xf8, 0x84, 0xed, 0x03, 0x0a, 0x04, 0xa8, + 0x06, 0xa9, 0x01, 0x90, 0x00, 0x91, 0x01, 0x23, 0x00, 0x22, 0x29, 0x46, + 0x01, 0x20, 0xfc, 0xf7, 0x77, 0xf8, 0xdd, 0xe9, 0x06, 0x01, 0xb0, 0xee, + 0x68, 0x0a, 0xfc, 0xf7, 0xeb, 0xf8, 0x84, 0xed, 0x05, 0x0a, 0xdd, 0xe9, + 0x04, 0x01, 0xb0, 0xee, 0x68, 0x0a, 0xfc, 0xf7, 0xe3, 0xf8, 0xd4, 0xed, + 0x05, 0x0a, 0x84, 0xed, 0x06, 0x0a, 0x60, 0xee, 0xa0, 0x0a, 0x40, 0xee, + 0x00, 0x0a, 0xc4, 0xed, 0x04, 0x0a, 0x08, 0xb0, 0x30, 0x46, 0xbd, 0xec, + 0x02, 0x8b, 0xf2, 0xbd, 0xe0, 0xb5, 0x01, 0x91, 0xc1, 0x68, 0x00, 0x91, + 0x03, 0x7e, 0x02, 0x79, 0x00, 0x68, 0x01, 0x21, 0xfb, 0xf7, 0xbe, 0xfd, + 0x0e, 0xbd, 0x00, 0x00, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x38, 0xb5, 0x2d, 0xed, + 0x02, 0x8b, 0x08, 0xee, 0x10, 0x0a, 0x08, 0xee, 0x90, 0x1a, 0x00, 0xf0, + 0x5f, 0xf8, 0xb8, 0xee, 0x68, 0x0a, 0xdf, 0xed, 0x17, 0x0a, 0x80, 0xee, + 0x20, 0x0a, 0xbb, 0xee, 0xed, 0x8a, 0x04, 0x46, 0x20, 0xee, 0x08, 0x0a, + 0x03, 0xf0, 0x04, 0xfc, 0x05, 0x46, 0x00, 0xf0, 0x23, 0xf8, 0x24, 0x20, + 0xe7, 0xf7, 0xf8, 0xfd, 0x2b, 0x46, 0x4f, 0xf0, 0xff, 0x32, 0x00, 0x21, + 0x20, 0x46, 0xff, 0xf7, 0xcf, 0xff, 0x00, 0x21, 0x24, 0x20, 0xe7, 0xf7, + 0x58, 0xfe, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0x31, 0x40, 0x00, 0xbf, + 0x80, 0xb5, 0x00, 0xf0, 0x39, 0xf8, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, + 0x00, 0x1d, 0xff, 0xf7, 0xbd, 0xff, 0xbd, 0xe8, 0x02, 0x40, 0x24, 0x20, + 0xe7, 0xf7, 0x2b, 0xbe, 0x00, 0x00, 0x7a, 0x44, 0x10, 0xb5, 0x00, 0xf0, + 0x29, 0xf8, 0x04, 0x46, 0x24, 0x20, 0xe7, 0xf7, 0x2d, 0xfe, 0x20, 0x1d, + 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0xa7, 0xe7, + 0x80, 0xb5, 0x00, 0xf0, 0x1b, 0xf8, 0xef, 0xf3, 0x10, 0x81, 0x72, 0xb6, + 0x50, 0xf8, 0x04, 0x2f, 0x42, 0xf0, 0x02, 0x03, 0x03, 0x60, 0x22, 0xf0, + 0x02, 0x02, 0x02, 0x60, 0x81, 0xf3, 0x10, 0x88, 0x01, 0xbd, 0x80, 0xb5, + 0x03, 0x22, 0x4f, 0xf6, 0x62, 0x71, 0x01, 0x20, 0xeb, 0xf7, 0x98, 0xf9, + 0xbd, 0xe8, 0x02, 0x40, 0x00, 0x20, 0xfa, 0xf7, 0xa9, 0xbd, 0x00, 0x00, + 0x80, 0xb5, 0xdc, 0xf7, 0x5e, 0xfd, 0x00, 0xbf, 0x01, 0xa1, 0x51, 0xf8, + 0x20, 0x00, 0x02, 0xbd, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x44, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, + 0x0d, 0xf8, 0x01, 0x70, 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, + 0x72, 0xb6, 0x05, 0x68, 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, + 0x29, 0x43, 0x70, 0x47, 0x10, 0xb5, 0xdc, 0xf7, 0x38, 0xfd, 0xdf, 0xf8, + 0x8c, 0x46, 0x58, 0xb9, 0x4f, 0xf0, 0x00, 0x50, 0xe0, 0x60, 0x4f, 0xf0, + 0x80, 0x70, 0xdf, 0xf8, 0x80, 0x16, 0x61, 0x61, 0x20, 0x61, 0xdf, 0xf8, + 0x7c, 0x16, 0x0a, 0xe0, 0x4f, 0xf0, 0x04, 0x50, 0xe0, 0x60, 0x4f, 0xf0, + 0x00, 0x70, 0xdf, 0xf8, 0x70, 0x16, 0x61, 0x61, 0x20, 0x61, 0xdf, 0xf8, + 0x6c, 0x16, 0xa1, 0x61, 0x10, 0xbd, 0x70, 0xb5, 0xdc, 0xf7, 0x19, 0xfd, + 0x04, 0x46, 0xdf, 0xf8, 0x60, 0x06, 0x50, 0xf8, 0x24, 0x50, 0xff, 0xf7, + 0xd7, 0xff, 0x6c, 0xb1, 0x00, 0x24, 0xdf, 0xf8, 0x54, 0x66, 0x06, 0xeb, + 0xc4, 0x01, 0x56, 0xf8, 0x34, 0x00, 0x4a, 0x68, 0x01, 0x46, 0xcf, 0xf7, + 0x1b, 0xfc, 0x64, 0x1c, 0x14, 0x2c, 0xf4, 0xd3, 0xdf, 0xf8, 0x20, 0x46, + 0xe1, 0x68, 0x62, 0x69, 0x52, 0x1a, 0x08, 0x46, 0xcf, 0xf7, 0x10, 0xfc, + 0xdf, 0xf8, 0x2c, 0x36, 0x4f, 0xf0, 0xff, 0x32, 0x00, 0x21, 0x28, 0x46, + 0xff, 0xf7, 0xa7, 0xff, 0x20, 0x69, 0xa2, 0x69, 0x12, 0x1a, 0x01, 0x46, + 0xcf, 0xf7, 0x02, 0xfc, 0xbd, 0xe8, 0x70, 0x40, 0x0f, 0x21, 0xdf, 0xf8, + 0x10, 0x06, 0xe1, 0xf7, 0x25, 0xba, 0x7c, 0xb5, 0xdc, 0xf7, 0xe3, 0xfc, + 0x04, 0x46, 0xff, 0xf7, 0xa5, 0xff, 0xdf, 0xf8, 0xdc, 0x05, 0xc1, 0x68, + 0x42, 0x69, 0x41, 0x60, 0x82, 0x60, 0xa4, 0xb9, 0x0b, 0x24, 0xdf, 0xf8, + 0xf0, 0x55, 0xdf, 0xf8, 0xf0, 0x65, 0x68, 0x7a, 0xc0, 0x09, 0x02, 0xd0, + 0x01, 0x23, 0x00, 0xf0, 0xa3, 0xf9, 0x70, 0x79, 0xc0, 0x09, 0x01, 0xd0, + 0x00, 0xf0, 0x0e, 0xf9, 0x64, 0x1e, 0xf2, 0xd1, 0x00, 0xf0, 0xf8, 0xf8, + 0x7c, 0xe0, 0x0b, 0x24, 0xdf, 0xf8, 0xcc, 0x55, 0xdf, 0xf8, 0xcc, 0x65, + 0x68, 0x7a, 0xc0, 0x09, 0x02, 0xd0, 0x01, 0x23, 0x00, 0xf0, 0x8a, 0xf9, + 0x70, 0x79, 0xc0, 0x09, 0x01, 0xd0, 0x00, 0xf0, 0xf9, 0xf8, 0x64, 0x1e, + 0xf2, 0xd1, 0x00, 0xf0, 0xe3, 0xf8, 0x00, 0xf0, 0xe6, 0xf8, 0xdf, 0xf8, + 0xac, 0x05, 0xdf, 0xf8, 0xac, 0x45, 0xdf, 0xf8, 0x88, 0x55, 0xff, 0xf7, + 0x5a, 0xff, 0x00, 0xf0, 0xdc, 0xf8, 0xdf, 0xf8, 0xa0, 0x05, 0xff, 0xf7, + 0x54, 0xff, 0x00, 0xf0, 0xd6, 0xf8, 0xdf, 0xf8, 0x98, 0x05, 0xff, 0xf7, + 0x4e, 0xff, 0x00, 0xf0, 0xd0, 0xf8, 0xdf, 0xf8, 0x90, 0x05, 0xff, 0xf7, + 0x48, 0xff, 0x00, 0xf0, 0xca, 0xf8, 0xdf, 0xf8, 0x88, 0x05, 0xff, 0xf7, + 0x42, 0xff, 0x00, 0xf0, 0xc4, 0xf8, 0xdf, 0xf8, 0x80, 0x05, 0xff, 0xf7, + 0x3c, 0xff, 0x00, 0xf0, 0xbe, 0xf8, 0xdf, 0xf8, 0x78, 0x05, 0xff, 0xf7, + 0x36, 0xff, 0x00, 0xf0, 0xb8, 0xf8, 0xdf, 0xf8, 0x70, 0x05, 0xff, 0xf7, + 0x30, 0xff, 0x00, 0xf0, 0xba, 0xf8, 0x00, 0xf0, 0xb0, 0xf8, 0x00, 0xf0, + 0xb9, 0xf8, 0x00, 0xf0, 0xac, 0xf8, 0xdf, 0xf8, 0x5c, 0x05, 0xdf, 0xf8, + 0x5c, 0x45, 0xff, 0xf7, 0x22, 0xff, 0x00, 0xf0, 0xac, 0xf8, 0x00, 0xf0, + 0xa2, 0xf8, 0x00, 0xf0, 0xab, 0xf8, 0x01, 0x23, 0x02, 0x22, 0x01, 0x21, + 0xdf, 0xf8, 0x44, 0x05, 0xff, 0xf7, 0x0c, 0xff, 0x02, 0x24, 0x55, 0xf8, + 0x34, 0x60, 0x00, 0x23, 0x4f, 0xf4, 0x80, 0x72, 0x08, 0x21, 0x00, 0xf0, + 0x96, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0x91, 0xf8, 0x00, 0x23, 0x00, 0xf0, + 0x8e, 0xf8, 0x01, 0x23, 0x4f, 0xf4, 0x80, 0x52, 0x0c, 0x21, 0x06, 0xf1, + 0x08, 0x00, 0xff, 0xf7, 0xfe, 0xfe, 0x64, 0x1c, 0x14, 0x2c, 0xe6, 0xd3, + 0xdc, 0xf7, 0x45, 0xfc, 0x90, 0xb9, 0x01, 0x21, 0x25, 0x20, 0xe7, 0xf7, + 0xf6, 0xfc, 0x01, 0x21, 0x26, 0x20, 0xe7, 0xf7, 0xf2, 0xfc, 0x25, 0x20, + 0xe7, 0xf7, 0x84, 0xfc, 0x26, 0x20, 0xe7, 0xf7, 0x81, 0xfc, 0x25, 0x20, + 0xe7, 0xf7, 0xcf, 0xfc, 0x26, 0x20, 0x39, 0xe0, 0x01, 0x21, 0x27, 0x20, + 0xe7, 0xf7, 0xe3, 0xfc, 0x01, 0x21, 0x28, 0x20, 0xe7, 0xf7, 0xdf, 0xfc, + 0x27, 0x20, 0xe7, 0xf7, 0x71, 0xfc, 0x28, 0x20, 0xe7, 0xf7, 0x6e, 0xfc, + 0x27, 0x20, 0xe7, 0xf7, 0xbc, 0xfc, 0x28, 0x20, 0xe7, 0xf7, 0xb9, 0xfc, + 0x01, 0x21, 0x29, 0x20, 0xe7, 0xf7, 0xcf, 0xfc, 0x01, 0x21, 0x2a, 0x20, + 0xe7, 0xf7, 0xcb, 0xfc, 0x01, 0x21, 0x2b, 0x20, 0xe7, 0xf7, 0xc7, 0xfc, + 0x01, 0x21, 0x2c, 0x20, 0xe7, 0xf7, 0xc3, 0xfc, 0x29, 0x20, 0xe7, 0xf7, + 0x55, 0xfc, 0x2a, 0x20, 0xe7, 0xf7, 0x52, 0xfc, 0x2b, 0x20, 0xe7, 0xf7, + 0x4f, 0xfc, 0x2c, 0x20, 0xe7, 0xf7, 0x4c, 0xfc, 0x29, 0x20, 0xe7, 0xf7, + 0x9a, 0xfc, 0x2a, 0x20, 0xe7, 0xf7, 0x97, 0xfc, 0x2b, 0x20, 0xe7, 0xf7, + 0x94, 0xfc, 0x2c, 0x20, 0xe7, 0xf7, 0x91, 0xfc, 0xdf, 0xf8, 0x68, 0x44, + 0x0f, 0xf2, 0x95, 0x11, 0x00, 0x91, 0x04, 0xf1, 0x10, 0x00, 0x01, 0x90, + 0x4f, 0xf4, 0x7a, 0x70, 0xa1, 0x68, 0x41, 0x43, 0xb1, 0xfb, 0xf0, 0xf1, + 0x00, 0x23, 0x01, 0x22, 0x0f, 0xf2, 0x60, 0x40, 0xec, 0xf7, 0xb8, 0xf8, + 0xe0, 0x60, 0x28, 0xb9, 0x03, 0x22, 0x4f, 0xf6, 0x1e, 0x71, 0x01, 0x20, + 0xeb, 0xf7, 0x0a, 0xf8, 0xeb, 0xf7, 0x11, 0xfd, 0x00, 0x21, 0x00, 0x91, + 0x02, 0x46, 0xe0, 0x68, 0x00, 0x23, 0x01, 0x21, 0xec, 0xf7, 0xbe, 0xf8, + 0x00, 0x20, 0x76, 0xbd, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, 0x30, 0x46, + 0x72, 0xe6, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x70, 0x47, 0x01, 0x22, + 0x00, 0x21, 0x30, 0x46, 0x73, 0xe6, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, + 0x20, 0x46, 0x6e, 0xe6, 0x01, 0x23, 0x80, 0x22, 0x07, 0x21, 0x28, 0x46, + 0x60, 0xe6, 0x00, 0x23, 0x00, 0x22, 0x00, 0x21, 0x0f, 0xf2, 0x65, 0x10, + 0xec, 0xf7, 0xfe, 0xb9, 0x25, 0x20, 0x0c, 0xe0, 0x26, 0x20, 0x0a, 0xe0, + 0x27, 0x20, 0x08, 0xe0, 0x28, 0x20, 0x06, 0xe0, 0x29, 0x20, 0x04, 0xe0, + 0x2a, 0x20, 0x02, 0xe0, 0x2b, 0x20, 0x00, 0xe0, 0x2c, 0x20, 0x2d, 0xe9, + 0xfc, 0x41, 0x00, 0x27, 0xdf, 0xf8, 0x74, 0x63, 0x8d, 0xf8, 0x00, 0x00, + 0x00, 0x24, 0x25, 0x28, 0xa0, 0x46, 0xb0, 0x73, 0xdf, 0xf8, 0x6c, 0x53, + 0x08, 0xd0, 0x26, 0x28, 0x0b, 0xd0, 0x27, 0x28, 0x19, 0xd0, 0x28, 0x28, + 0x1c, 0xd0, 0x2b, 0x28, 0x2c, 0xd0, 0x3d, 0xe0, 0x00, 0x23, 0x00, 0xf0, + 0x5b, 0xf8, 0x25, 0x20, 0x23, 0xe0, 0x2c, 0x78, 0xdf, 0xf8, 0x44, 0x03, + 0x00, 0xf0, 0x4c, 0xf8, 0xa4, 0x09, 0x20, 0x00, 0x05, 0xd0, 0x00, 0x23, + 0xc0, 0x22, 0x06, 0x21, 0xff, 0xf7, 0xbf, 0xff, 0x27, 0x46, 0x26, 0x20, + 0x13, 0xe0, 0x00, 0x23, 0x00, 0xf0, 0x42, 0xf8, 0x27, 0x20, 0x0e, 0xe0, + 0xca, 0x4d, 0xc9, 0x48, 0x2c, 0x78, 0x00, 0xf0, 0x37, 0xf8, 0xa4, 0x09, + 0x20, 0x00, 0x05, 0xd0, 0x00, 0x23, 0xc0, 0x22, 0x06, 0x21, 0xff, 0xf7, + 0xaa, 0xff, 0x27, 0x46, 0x28, 0x20, 0xe7, 0xf7, 0xa9, 0xfb, 0x11, 0xe0, + 0xa9, 0x78, 0xea, 0x78, 0xce, 0x48, 0xc9, 0x01, 0x41, 0xea, 0x52, 0x01, + 0xd2, 0x03, 0x01, 0x40, 0x02, 0xf4, 0x60, 0x32, 0x11, 0x43, 0xa1, 0xf5, + 0x40, 0x21, 0xb1, 0xf5, 0x00, 0x5f, 0x38, 0xbf, 0x4f, 0xf0, 0x01, 0x08, + 0x58, 0xea, 0x07, 0x00, 0x0e, 0xd1, 0x03, 0x22, 0x48, 0xf2, 0x01, 0x51, + 0x01, 0x20, 0xea, 0xf7, 0x73, 0xff, 0x70, 0x68, 0x40, 0x1c, 0x70, 0x60, + 0x44, 0xb9, 0xbd, 0xe8, 0xf6, 0x41, 0x00, 0x20, 0xfa, 0xf7, 0x80, 0xbb, + 0x38, 0x00, 0x1c, 0xbf, 0xbf, 0x00, 0xb7, 0x73, 0xbd, 0xe8, 0xf3, 0x81, + 0x00, 0x23, 0x80, 0x22, 0x07, 0x21, 0xd9, 0xe5, 0x80, 0x22, 0x07, 0x21, + 0xb8, 0x48, 0xd5, 0xe5, 0x80, 0x22, 0x07, 0x21, 0xb7, 0x48, 0xd1, 0xe5, + 0x2d, 0xe9, 0xff, 0x41, 0x00, 0xf0, 0x82, 0xf8, 0x05, 0x46, 0xdc, 0xf7, + 0xf8, 0xfa, 0x00, 0xf0, 0x83, 0xf8, 0x01, 0xd1, 0x00, 0xf0, 0x88, 0xf8, + 0x00, 0xf0, 0x8e, 0xf8, 0x02, 0xd1, 0x3b, 0x46, 0x00, 0xf0, 0x85, 0xf8, + 0x9d, 0xf8, 0x00, 0x00, 0x00, 0x28, 0x0f, 0xd0, 0x00, 0xf0, 0x45, 0xf8, + 0x06, 0xd1, 0x01, 0x28, 0xc4, 0xbf, 0x00, 0x21, 0x71, 0x70, 0x00, 0xf0, + 0x31, 0xf8, 0x05, 0xe0, 0x02, 0x28, 0x04, 0xbf, 0x03, 0x21, 0x71, 0x70, + 0x00, 0xf0, 0x3d, 0xf8, 0xbd, 0xe8, 0xff, 0x81, 0x2d, 0xe9, 0xff, 0x41, + 0x00, 0xf0, 0x5a, 0xf8, 0x05, 0x46, 0xdc, 0xf7, 0xd0, 0xfa, 0x00, 0xf0, + 0x5b, 0xf8, 0x01, 0xd1, 0x00, 0xf0, 0x60, 0xf8, 0x00, 0xf0, 0x66, 0xf8, + 0x02, 0xd1, 0x3b, 0x46, 0x00, 0xf0, 0x5d, 0xf8, 0x9d, 0xf8, 0x00, 0x00, + 0x00, 0x28, 0x0f, 0xd0, 0x00, 0xf0, 0x1d, 0xf8, 0x06, 0xd1, 0x01, 0x28, + 0xc4, 0xbf, 0x00, 0x21, 0x71, 0x70, 0x00, 0xf0, 0x09, 0xf8, 0x05, 0xe0, + 0x02, 0x28, 0x04, 0xbf, 0x03, 0x21, 0x71, 0x70, 0x00, 0xf0, 0x15, 0xf8, + 0xbd, 0xe8, 0xff, 0x81, 0x05, 0xf1, 0x0c, 0x00, 0x71, 0x78, 0x50, 0xf8, + 0x21, 0x00, 0x68, 0x60, 0x05, 0xf1, 0x14, 0x01, 0x70, 0x78, 0x51, 0xf8, + 0x20, 0x10, 0xa9, 0x60, 0x70, 0x47, 0x70, 0x78, 0x40, 0x1c, 0x70, 0x70, + 0x01, 0x2c, 0x70, 0x78, 0x70, 0x47, 0x70, 0x78, 0x02, 0x28, 0x0f, 0xdd, + 0x70, 0x78, 0xc0, 0x1e, 0x14, 0x28, 0x09, 0xd2, 0x6b, 0x49, 0x51, 0xf8, + 0x30, 0x20, 0x6a, 0x60, 0x09, 0x1d, 0x51, 0xf8, 0x30, 0x00, 0x82, 0x18, + 0xaa, 0x60, 0x01, 0xe0, 0x00, 0x21, 0x71, 0x70, 0x70, 0x78, 0x01, 0x28, + 0x0b, 0xdc, 0x05, 0xf1, 0x0c, 0x01, 0x70, 0x78, 0x51, 0xf8, 0x20, 0x10, + 0x69, 0x60, 0x05, 0xf1, 0x14, 0x00, 0x71, 0x78, 0x50, 0xf8, 0x21, 0x00, + 0xa8, 0x60, 0x70, 0x47, 0x00, 0x21, 0x01, 0x91, 0x8d, 0xf8, 0x00, 0x10, + 0xdc, 0xf7, 0x9b, 0xba, 0x04, 0x46, 0x59, 0x48, 0x6c, 0x4e, 0x50, 0xf8, + 0x25, 0x80, 0x70, 0x78, 0x01, 0x28, 0x70, 0x47, 0xd8, 0xf8, 0x00, 0x70, + 0x56, 0x4b, 0x4f, 0xf0, 0xff, 0x32, 0x00, 0x21, 0x40, 0x46, 0x3e, 0xe5, + 0x01, 0x98, 0x69, 0x49, 0x4b, 0x4d, 0x02, 0xe0, 0x01, 0x98, 0x40, 0x1c, + 0x01, 0x90, 0x01, 0x98, 0x72, 0x68, 0x90, 0x42, 0x17, 0xd2, 0x68, 0x68, + 0x72, 0xb6, 0x0a, 0x68, 0x52, 0x1c, 0x0a, 0x60, 0x03, 0x68, 0x02, 0x93, + 0x02, 0x9a, 0x02, 0x60, 0x08, 0x68, 0x40, 0x1e, 0x08, 0x60, 0x00, 0xd1, + 0x62, 0xb6, 0x68, 0x68, 0x02, 0x1d, 0x6a, 0x60, 0x10, 0x46, 0xaa, 0x68, + 0x90, 0x42, 0xe3, 0xd3, 0x01, 0x20, 0x8d, 0xf8, 0x00, 0x00, 0x70, 0x78, + 0x01, 0x28, 0x70, 0x47, 0x38, 0xb5, 0x00, 0x92, 0x0b, 0x46, 0x51, 0x4c, + 0x02, 0x46, 0x08, 0x21, 0x20, 0x1d, 0xe7, 0xf7, 0xda, 0xf9, 0x05, 0x46, + 0xa2, 0x68, 0x4f, 0xf4, 0x7a, 0x70, 0x00, 0x21, 0x42, 0x43, 0x00, 0x91, + 0xb2, 0xfb, 0xf0, 0xf2, 0xe0, 0x68, 0x00, 0x23, 0x04, 0x21, 0xeb, 0xf7, + 0x3d, 0xff, 0x28, 0x46, 0x32, 0xbd, 0x80, 0xb5, 0x00, 0x92, 0x0b, 0x46, + 0x02, 0x46, 0x08, 0x21, 0x48, 0x48, 0xe7, 0xf7, 0xad, 0xf9, 0x02, 0xbd, + 0x41, 0x49, 0x0a, 0x78, 0x02, 0x70, 0x00, 0x20, 0x70, 0x47, 0x1c, 0xb5, + 0x3e, 0x4c, 0x21, 0x78, 0x02, 0x00, 0x0c, 0xd1, 0x01, 0x29, 0x19, 0xd1, + 0x00, 0x20, 0x00, 0x90, 0x00, 0x23, 0xe0, 0x68, 0x00, 0x22, 0x03, 0x21, + 0xeb, 0xf7, 0x1e, 0xff, 0x00, 0x21, 0x21, 0x70, 0x0e, 0xe0, 0x01, 0x28, + 0x08, 0xbf, 0x00, 0x29, 0x0a, 0xd1, 0x20, 0x70, 0xeb, 0xf7, 0x5f, 0xfb, + 0x00, 0x21, 0x02, 0x46, 0x00, 0x91, 0x00, 0x23, 0xe0, 0x68, 0x01, 0x21, + 0xeb, 0xf7, 0x0c, 0xff, 0x00, 0x20, 0x16, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, + 0x06, 0x46, 0x0f, 0x46, 0x90, 0x46, 0xdc, 0xf7, 0x14, 0xfa, 0x1d, 0x4d, + 0x1a, 0x4c, 0x1e, 0xb1, 0x02, 0x2e, 0x13, 0xd0, 0x05, 0xd3, 0x18, 0xe0, + 0x08, 0xb9, 0x01, 0x23, 0x03, 0xe0, 0x01, 0x23, 0x06, 0xe0, 0x20, 0xb9, + 0x02, 0x23, 0xc0, 0x22, 0x06, 0x21, 0x20, 0x46, 0x03, 0xe0, 0x02, 0x23, + 0xc0, 0x22, 0x06, 0x21, 0x28, 0x46, 0xbd, 0xe8, 0xf0, 0x41, 0xa5, 0xe4, + 0x0f, 0x22, 0x0c, 0x49, 0x40, 0x46, 0xcf, 0xf7, 0x0b, 0xf9, 0x0f, 0x20, + 0x38, 0x60, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x00, 0xcc, 0x75, 0x02, 0x20, + 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x04, 0x21, + 0x00, 0x00, 0x05, 0x02, 0x98, 0x9d, 0x04, 0x01, 0x98, 0x88, 0x04, 0x01, + 0x00, 0x00, 0xab, 0xab, 0xc0, 0x76, 0x02, 0x20, 0x3f, 0x00, 0x00, 0x47, + 0x3a, 0x00, 0x00, 0x47, 0xe4, 0x00, 0x00, 0x47, 0xdf, 0x00, 0x00, 0x47, + 0x50, 0x01, 0x09, 0x4c, 0x7c, 0x02, 0x09, 0x4c, 0x54, 0x01, 0x09, 0x4c, + 0x58, 0x01, 0x09, 0x4c, 0x5c, 0x01, 0x09, 0x4c, 0x60, 0x01, 0x09, 0x4c, + 0x64, 0x01, 0x09, 0x4c, 0x68, 0x01, 0x09, 0x4c, 0x6c, 0x01, 0x09, 0x4c, + 0x74, 0x02, 0x09, 0x4c, 0x80, 0x02, 0x09, 0x4c, 0x52, 0x06, 0x00, 0x47, + 0xc8, 0x40, 0x00, 0x20, 0xfc, 0xff, 0xff, 0x7f, 0xed, 0x00, 0x00, 0x47, + 0x48, 0x00, 0x00, 0x47, 0x7c, 0x77, 0x02, 0x20, 0xcc, 0x40, 0x00, 0x20, + 0x50, 0x61, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x72, 0x75, 0x62, 0x54, + 0x6d, 0x72, 0x00, 0x00, 0x70, 0xb5, 0x0c, 0x46, 0x00, 0x25, 0x09, 0x49, + 0x00, 0x2a, 0x22, 0x68, 0x0e, 0xbf, 0x08, 0x26, 0x08, 0x31, 0x04, 0x26, + 0xb2, 0x42, 0x03, 0xd3, 0x32, 0x46, 0xcf, 0xf7, 0xb1, 0xf8, 0x02, 0xe0, + 0x4f, 0xf6, 0x68, 0x75, 0x00, 0x26, 0x26, 0x60, 0x28, 0x46, 0x70, 0xbd, + 0xb8, 0x40, 0x00, 0x20, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x78, 0x00, 0xf0, 0x0d, 0xf8, 0x01, 0x70, 0x07, 0xe0, 0x30, 0xb5, + 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x00, 0xf0, 0x04, 0xf8, + 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x03, 0xfa, 0x01, 0xf1, + 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x70, 0x47, 0xdf, 0xf8, 0xd4, 0x13, + 0x09, 0x68, 0x0a, 0x18, 0xe0, 0x20, 0x92, 0xf8, 0xbc, 0x30, 0x43, 0x43, + 0xc8, 0x18, 0xc4, 0x30, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, 0x04, 0x46, + 0xdf, 0xf8, 0xbc, 0x03, 0x27, 0x46, 0x50, 0xf8, 0x27, 0x60, 0x0d, 0x46, + 0x01, 0x23, 0x4f, 0xf4, 0x80, 0x12, 0x14, 0x21, 0x30, 0x1d, 0xff, 0xf7, + 0xd4, 0xff, 0x00, 0x23, 0x4f, 0xf4, 0x80, 0x72, 0x08, 0x21, 0x06, 0xf1, + 0x14, 0x00, 0xff, 0xf7, 0xcc, 0xff, 0xe6, 0x48, 0x50, 0xf8, 0x27, 0x60, + 0x06, 0xf1, 0x0c, 0x09, 0x00, 0x23, 0x4f, 0xf0, 0x40, 0x52, 0x1c, 0x21, + 0x48, 0x46, 0xff, 0xf7, 0xc0, 0xff, 0xe9, 0x68, 0x01, 0x22, 0x00, 0xf0, + 0x06, 0xf9, 0x03, 0x46, 0x06, 0xf1, 0x20, 0x08, 0xdd, 0x4a, 0x00, 0x21, + 0x00, 0xf0, 0x6f, 0xf8, 0xdc, 0x48, 0x50, 0xf8, 0x27, 0x70, 0x3d, 0x37, + 0x03, 0x23, 0x03, 0x22, 0x00, 0x21, 0x38, 0x46, 0xff, 0xf7, 0xa2, 0xff, + 0x01, 0x23, 0x10, 0x22, 0x04, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x9c, 0xff, + 0x06, 0xf1, 0x08, 0x0b, 0x2b, 0x78, 0x4f, 0xf4, 0x7c, 0x12, 0x10, 0x21, + 0x00, 0xf0, 0x79, 0xf9, 0x6b, 0x78, 0x4f, 0xf0, 0x7c, 0x52, 0x18, 0x21, + 0x00, 0xf0, 0xde, 0xf8, 0x37, 0x1d, 0xab, 0x78, 0x4f, 0xf0, 0x70, 0x62, + 0x18, 0x21, 0x00, 0xf0, 0xd5, 0xf8, 0x06, 0xf1, 0x1c, 0x0a, 0xeb, 0x78, + 0x4f, 0xf4, 0x7f, 0x42, 0x08, 0x21, 0x50, 0x46, 0xff, 0xf7, 0x87, 0xff, + 0x2b, 0x79, 0x4f, 0xf0, 0xf8, 0x52, 0x00, 0xf0, 0x3b, 0xf8, 0x03, 0x23, + 0x7f, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x59, 0xf9, 0x06, 0xf1, 0x18, 0x08, + 0x03, 0x23, 0x4f, 0xf0, 0x40, 0x52, 0x1c, 0x21, 0x00, 0xf0, 0x2f, 0xf8, + 0x03, 0x23, 0x4f, 0xf0, 0x40, 0x72, 0x00, 0xf0, 0x29, 0xf8, 0x6b, 0x69, + 0x70, 0x22, 0x04, 0x21, 0x00, 0xf0, 0xb0, 0xf8, 0xab, 0x69, 0x4f, 0xf4, + 0xe0, 0x62, 0x08, 0x21, 0x48, 0x46, 0xff, 0xf7, 0x64, 0xff, 0xeb, 0x69, + 0xff, 0x22, 0x00, 0x21, 0x50, 0x46, 0xff, 0xf7, 0x5e, 0xff, 0x2b, 0x6a, + 0xff, 0x22, 0x00, 0x21, 0x48, 0x46, 0xff, 0xf7, 0x58, 0xff, 0x2b, 0x69, + 0x4f, 0xf6, 0xff, 0x72, 0x00, 0x21, 0x06, 0xf1, 0x14, 0x00, 0xff, 0xf7, + 0x50, 0xff, 0xa9, 0x68, 0x00, 0xf0, 0x96, 0xf8, 0x03, 0x46, 0x40, 0x46, + 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, 0x88, 0xe0, 0x18, 0x21, 0x40, 0x46, + 0x43, 0xe7, 0x38, 0xb5, 0xa4, 0x4d, 0x04, 0x46, 0x55, 0xf8, 0x24, 0x00, + 0x00, 0x23, 0x00, 0xf0, 0x2a, 0xf8, 0x9e, 0x48, 0x50, 0xf8, 0x24, 0x00, + 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x01, 0x23, 0x4f, 0xf4, 0x00, 0x22, + 0x13, 0x21, 0x1c, 0x30, 0x2f, 0xe7, 0x1c, 0xb5, 0x97, 0x49, 0x51, 0xf8, + 0x20, 0x20, 0x52, 0xf8, 0x1c, 0x1f, 0xc9, 0x0c, 0x01, 0xf0, 0x01, 0x01, + 0x8d, 0xf8, 0x00, 0x10, 0x9d, 0xf8, 0x00, 0x10, 0x81, 0xf0, 0x01, 0x01, + 0x8d, 0xf8, 0x00, 0x10, 0x9d, 0xf8, 0x00, 0x10, 0x01, 0x29, 0x05, 0xd1, + 0x90, 0x4c, 0x54, 0xf8, 0x20, 0x00, 0xff, 0x23, 0x00, 0xf0, 0x03, 0xf8, + 0x9d, 0xf8, 0x00, 0x00, 0x16, 0xbd, 0x4f, 0xf4, 0x7f, 0x42, 0x08, 0x21, + 0x50, 0x30, 0x0c, 0xe7, 0x10, 0xb5, 0x86, 0x4c, 0x54, 0xf8, 0x20, 0x00, + 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x4f, 0xf0, 0x80, 0x72, 0x18, 0x21, + 0x14, 0x30, 0x00, 0xe7, 0x10, 0xb5, 0x83, 0x4c, 0x54, 0xf8, 0x20, 0x00, + 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x4f, 0xf0, 0x80, 0x72, 0x18, 0x21, + 0xbc, 0x30, 0xf4, 0xe6, 0xf8, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x79, 0x48, + 0x6b, 0x78, 0x21, 0x46, 0x50, 0xf8, 0x21, 0x60, 0x06, 0xf1, 0x14, 0x07, + 0x4f, 0xf4, 0x7c, 0x12, 0x10, 0x21, 0x00, 0xf0, 0x2b, 0xf8, 0xab, 0x78, + 0x4f, 0xf0, 0xf8, 0x52, 0x18, 0x21, 0x06, 0xf1, 0x20, 0x00, 0xff, 0xf7, + 0xde, 0xfe, 0xab, 0x88, 0x4f, 0xf6, 0xff, 0x72, 0x00, 0x21, 0x00, 0xf0, + 0x1d, 0xf8, 0xeb, 0x88, 0x6f, 0x4a, 0x15, 0x21, 0x06, 0xf1, 0x1c, 0x00, + 0xff, 0xf7, 0xd1, 0xfe, 0xa9, 0x68, 0x4f, 0xf4, 0x80, 0x62, 0x00, 0xf0, + 0x16, 0xf8, 0x03, 0x46, 0x66, 0x4a, 0x00, 0x21, 0x00, 0xf0, 0x0e, 0xf8, + 0xe9, 0x68, 0x00, 0xf0, 0x0d, 0xf8, 0x03, 0x46, 0x06, 0xf1, 0x18, 0x00, + 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x40, 0x64, 0x4a, 0x00, 0x21, 0xba, 0xe6, + 0x38, 0x46, 0xb8, 0xe6, 0x30, 0x46, 0xb6, 0xe6, 0x40, 0x22, 0x20, 0x46, + 0x28, 0xe0, 0x70, 0xb5, 0x0c, 0x46, 0x5c, 0x49, 0x51, 0xf8, 0x20, 0x50, + 0x63, 0x78, 0x05, 0xf1, 0xb8, 0x06, 0x4f, 0xf0, 0x80, 0x52, 0x1c, 0x21, + 0xff, 0xf7, 0xee, 0xff, 0xa3, 0x78, 0x4f, 0xf0, 0x7c, 0x72, 0x14, 0x21, + 0xff, 0xf7, 0xe8, 0xff, 0xe3, 0x78, 0x4f, 0xf0, 0x80, 0x52, 0x1c, 0x21, + 0x05, 0xf1, 0xbc, 0x00, 0xff, 0xf7, 0x99, 0xfe, 0xc0, 0x35, 0x23, 0x79, + 0x4f, 0xf4, 0xf8, 0x32, 0x0c, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x91, 0xfe, + 0x63, 0x79, 0x28, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x1f, 0x22, 0xcd, 0xe7, + 0x38, 0xb5, 0x0c, 0x46, 0x15, 0x46, 0xff, 0xf7, 0x97, 0xfe, 0xc1, 0x69, + 0x4f, 0xf4, 0x7a, 0x70, 0x4c, 0x43, 0x45, 0x43, 0xb4, 0xfb, 0xf5, 0xf0, + 0x32, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, + 0x04, 0x46, 0x08, 0xee, 0x10, 0x1a, 0x15, 0x46, 0x00, 0x26, 0xdf, 0xf8, + 0x00, 0xa1, 0xdf, 0xf8, 0xf0, 0x80, 0x01, 0x20, 0xb0, 0x40, 0x04, 0x42, + 0x3f, 0xd0, 0xf0, 0xb2, 0x58, 0xf8, 0x20, 0x90, 0xff, 0xf7, 0x78, 0xfe, + 0xf8, 0xee, 0x48, 0x0a, 0xc1, 0x69, 0x00, 0xee, 0x10, 0x1a, 0xb8, 0xee, + 0x40, 0x0a, 0x20, 0xee, 0x80, 0x0a, 0xdf, 0xed, 0x2b, 0x0a, 0x80, 0xee, + 0x20, 0x0a, 0x9f, 0xed, 0x2a, 0x1a, 0xb4, 0xee, 0x41, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0xa8, 0xbf, 0x09, 0x27, 0x0e, 0xda, 0x0b, 0x20, 0x0a, 0xeb, + 0xc0, 0x02, 0x0a, 0xeb, 0xc0, 0x01, 0xd2, 0xed, 0x00, 0x0a, 0x4f, 0x68, + 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x01, 0xda, 0x40, 0x1e, + 0xf1, 0xd1, 0x09, 0xf1, 0xb8, 0x0b, 0x2b, 0x46, 0x4f, 0xf0, 0x80, 0x52, + 0x1c, 0x21, 0x00, 0xf0, 0x16, 0xf8, 0x01, 0x23, 0x4f, 0xf0, 0x7c, 0x72, + 0x14, 0x21, 0x00, 0xf0, 0x10, 0xf8, 0x3b, 0x46, 0x4f, 0xf4, 0xf8, 0x32, + 0x0c, 0x21, 0x09, 0xf1, 0xc0, 0x00, 0xff, 0xf7, 0x2c, 0xfe, 0x76, 0x1c, + 0xf0, 0xb2, 0x08, 0x28, 0xb7, 0xd1, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, + 0xf1, 0x8f, 0x58, 0x46, 0x21, 0xe6, 0x70, 0xb5, 0x0c, 0x46, 0x15, 0x46, + 0x1e, 0x46, 0xef, 0xf7, 0x41, 0xfd, 0x11, 0x49, 0x51, 0xf8, 0x20, 0x00, + 0x00, 0xf1, 0xb8, 0x01, 0xc0, 0x30, 0x0a, 0x68, 0x12, 0x0f, 0x02, 0xf0, + 0x01, 0x02, 0x32, 0x70, 0x09, 0x68, 0xc1, 0xf3, 0x05, 0x51, 0x29, 0x60, + 0x00, 0x68, 0xc0, 0xf3, 0x04, 0x30, 0x20, 0x60, 0x70, 0xbd, 0x00, 0x00, + 0x00, 0x24, 0x74, 0x49, 0x9b, 0x71, 0x4b, 0x45, 0xb4, 0x76, 0x02, 0x20, + 0x88, 0x94, 0x04, 0x01, 0xc8, 0x94, 0x04, 0x01, 0xff, 0xff, 0x3f, 0x00, + 0x68, 0x94, 0x04, 0x01, 0xa8, 0x94, 0x04, 0x01, 0x00, 0x00, 0xe0, 0xff, + 0xff, 0xff, 0x03, 0x00, 0x70, 0x8c, 0x04, 0x01, 0x10, 0xb5, 0x0c, 0x46, + 0x11, 0x46, 0x1a, 0x46, 0x00, 0xf0, 0xf0, 0x03, 0x30, 0x2b, 0x06, 0xd2, + 0x13, 0x46, 0x0a, 0x46, 0x21, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0xed, 0xf7, + 0xcb, 0xbb, 0x06, 0xd1, 0x13, 0x46, 0x0a, 0x46, 0x21, 0x46, 0xbd, 0xe8, + 0x10, 0x40, 0xfd, 0xf7, 0x4a, 0xbf, 0x80, 0x2b, 0x0c, 0xd1, 0x3a, 0x4b, + 0x00, 0xf0, 0x0f, 0x00, 0x53, 0xf8, 0x30, 0x30, 0x1b, 0xb1, 0x20, 0x46, + 0xbd, 0xe8, 0x10, 0x40, 0x18, 0x47, 0x4f, 0xf6, 0x29, 0x70, 0x10, 0xbd, + 0x4f, 0xf6, 0x2c, 0x70, 0x10, 0xbd, 0x01, 0x46, 0x00, 0x20, 0x32, 0x4a, + 0x91, 0x42, 0x03, 0xd1, 0x31, 0x4b, 0x01, 0x21, 0x19, 0x71, 0x70, 0x47, + 0x4f, 0xf6, 0x5e, 0x70, 0x70, 0x47, 0x2d, 0xe9, 0xfc, 0x47, 0x0a, 0x9c, + 0x82, 0x46, 0x88, 0x46, 0x15, 0x46, 0x1e, 0x46, 0xfe, 0xf7, 0x86, 0xff, + 0x4f, 0xf0, 0x00, 0x09, 0x01, 0x27, 0xb8, 0xb9, 0x27, 0x48, 0x01, 0x79, + 0x01, 0x29, 0x21, 0xd1, 0x01, 0x68, 0x0a, 0x29, 0x28, 0xbf, 0x4f, 0xf6, + 0x5f, 0x79, 0x3b, 0xd2, 0x00, 0xeb, 0xc1, 0x01, 0x8d, 0x60, 0x02, 0x68, + 0x00, 0xeb, 0xc2, 0x03, 0x9e, 0x81, 0x01, 0x68, 0x00, 0xeb, 0xc1, 0x02, + 0xd4, 0x81, 0x03, 0x68, 0x5b, 0x1c, 0x03, 0x60, 0x05, 0xf0, 0xf0, 0x03, + 0x0b, 0x9a, 0x30, 0x2b, 0x50, 0x46, 0x41, 0x46, 0x09, 0xd2, 0x01, 0x92, + 0x00, 0x94, 0x33, 0x46, 0x2a, 0x46, 0xed, 0xf7, 0x28, 0xfa, 0x09, 0xe0, + 0x4f, 0xf6, 0x5d, 0x79, 0x1c, 0xe0, 0x07, 0xd1, 0x01, 0x92, 0x00, 0x94, + 0x33, 0x46, 0x2a, 0x46, 0xfd, 0xf7, 0xc1, 0xfb, 0x00, 0x27, 0x13, 0xe0, + 0x05, 0xf0, 0xf0, 0x00, 0x80, 0x28, 0x0d, 0xd1, 0x0d, 0x48, 0x05, 0xf0, + 0x0f, 0x05, 0x50, 0xf8, 0x35, 0x30, 0x23, 0xb1, 0x21, 0x46, 0x30, 0x46, + 0x98, 0x47, 0x81, 0x46, 0x04, 0xe0, 0x4f, 0xf6, 0x29, 0x79, 0x01, 0xe0, + 0x4f, 0xf6, 0x2c, 0x79, 0x0c, 0x98, 0x07, 0x70, 0x48, 0x46, 0xbd, 0xe8, + 0xf6, 0x87, 0x00, 0x00, 0x38, 0x89, 0x04, 0x01, 0x69, 0x20, 0xec, 0x14, + 0x5c, 0x71, 0x02, 0x20, 0x3c, 0x89, 0x04, 0x01, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, + 0x11, 0x40, 0x29, 0x43, 0x01, 0x70, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0x30, 0xb5, 0x03, 0x46, 0x00, 0x20, 0x01, 0x2b, 0x0d, 0xdc, 0x50, 0x4c, + 0x18, 0x29, 0x04, 0xeb, 0x43, 0x05, 0x03, 0xda, 0x04, 0xf8, 0x13, 0x10, + 0x6a, 0x70, 0x30, 0xbd, 0x18, 0x21, 0x04, 0xf8, 0x13, 0x10, 0x68, 0x70, + 0x30, 0xbd, 0x0d, 0xe0, 0x30, 0xb5, 0x03, 0x46, 0x00, 0x20, 0x01, 0x2b, + 0x08, 0xdc, 0x46, 0x4c, 0x14, 0xf8, 0x13, 0x50, 0x0d, 0x70, 0x04, 0xeb, + 0x43, 0x01, 0x4b, 0x78, 0x13, 0x70, 0x30, 0xbd, 0x4b, 0xf6, 0x01, 0x50, + 0x30, 0xbd, 0x00, 0x00, 0x4b, 0xa1, 0x1c, 0xb5, 0x00, 0xf0, 0x3f, 0xf8, + 0x00, 0x24, 0x20, 0xb9, 0x9d, 0xf8, 0x00, 0x00, 0x18, 0x28, 0xb8, 0xbf, + 0x01, 0x24, 0x20, 0x46, 0x16, 0xbd, 0x00, 0x00, 0x1c, 0xb5, 0x00, 0xbf, + 0x44, 0xa1, 0x00, 0xf0, 0x30, 0xf8, 0x04, 0x00, 0x29, 0xd1, 0x9d, 0xf8, + 0x00, 0x00, 0x18, 0x28, 0x22, 0xda, 0x00, 0xf0, 0x73, 0xf8, 0x61, 0xb9, + 0x18, 0xb9, 0xdb, 0xb2, 0xff, 0x22, 0x31, 0x48, 0x17, 0xe0, 0x01, 0x28, + 0xdb, 0xb2, 0x19, 0xbf, 0xff, 0x22, 0x2f, 0x48, 0xff, 0x22, 0x2f, 0x48, + 0x0f, 0xe0, 0x20, 0xb9, 0xdb, 0xb2, 0xff, 0x22, 0x00, 0x21, 0x2d, 0x48, + 0x09, 0xe0, 0x01, 0x28, 0xdb, 0xb2, 0x03, 0xd1, 0xff, 0x22, 0x00, 0x21, + 0x2a, 0x48, 0x02, 0xe0, 0xff, 0x22, 0x00, 0x21, 0x29, 0x48, 0xff, 0xf7, + 0x91, 0xff, 0x04, 0xe0, 0x4b, 0xf6, 0x02, 0x54, 0x01, 0xe0, 0x4b, 0xf6, + 0x01, 0x54, 0x20, 0x46, 0x16, 0xbd, 0x0b, 0x88, 0xad, 0xf8, 0x00, 0x30, + 0x0d, 0xf1, 0x01, 0x02, 0x69, 0x46, 0xa3, 0xe7, 0x1c, 0xb5, 0x00, 0xbf, + 0x27, 0xa1, 0xff, 0xf7, 0xf4, 0xff, 0x04, 0x00, 0x29, 0xd1, 0x9d, 0xf8, + 0x00, 0x00, 0x18, 0x28, 0x22, 0xda, 0x00, 0xf0, 0x37, 0xf8, 0x61, 0xb9, + 0x18, 0xb9, 0xdb, 0xb2, 0xff, 0x22, 0x16, 0x48, 0x17, 0xe0, 0x01, 0x28, + 0xdb, 0xb2, 0x19, 0xbf, 0xff, 0x22, 0x15, 0x48, 0xff, 0x22, 0x13, 0x48, + 0x0f, 0xe0, 0x20, 0xb9, 0xdb, 0xb2, 0xff, 0x22, 0x00, 0x21, 0x0c, 0x48, + 0x09, 0xe0, 0x01, 0x28, 0xdb, 0xb2, 0x03, 0xd1, 0xff, 0x22, 0x00, 0x21, + 0x0a, 0x48, 0x02, 0xe0, 0xff, 0x22, 0x00, 0x21, 0x07, 0x48, 0xff, 0xf7, + 0x55, 0xff, 0x04, 0xe0, 0x4b, 0xf6, 0x02, 0x54, 0x01, 0xe0, 0x4b, 0xf6, + 0x01, 0x54, 0x20, 0x46, 0x16, 0xbd, 0x00, 0x00, 0xc4, 0x40, 0x00, 0x20, + 0xa2, 0x09, 0x00, 0x47, 0xa4, 0x09, 0x00, 0x47, 0xa3, 0x09, 0x00, 0x47, + 0xa5, 0x09, 0x00, 0x47, 0xa6, 0x09, 0x00, 0x47, 0xa7, 0x09, 0x00, 0x47, + 0x03, 0x46, 0xd8, 0x08, 0x03, 0xf0, 0x07, 0x03, 0x01, 0x22, 0x9d, 0xf8, + 0x01, 0x10, 0x02, 0xfa, 0x03, 0xf3, 0x70, 0x47, 0x18, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xfe, 0x43, + 0x81, 0x46, 0x88, 0x46, 0x00, 0x26, 0xdf, 0xf8, 0x20, 0x76, 0x29, 0xfa, + 0x06, 0xf0, 0xc0, 0x07, 0x1a, 0xd5, 0x30, 0x46, 0xdc, 0xf7, 0xc0, 0xfd, + 0x04, 0x46, 0xb4, 0x21, 0xdf, 0xf8, 0x0c, 0x06, 0x61, 0x43, 0x45, 0x18, + 0xb4, 0x21, 0x28, 0x46, 0xe1, 0xf7, 0x7c, 0xf8, 0xf0, 0xb2, 0x28, 0x60, + 0x6c, 0x60, 0x00, 0x20, 0x68, 0x62, 0xa8, 0x60, 0x85, 0xf8, 0x3e, 0x00, + 0xaf, 0x61, 0xc5, 0xf8, 0x34, 0x80, 0x28, 0x46, 0x02, 0xf0, 0x44, 0xfc, + 0x76, 0x1c, 0x08, 0x2e, 0xdd, 0xd3, 0xb9, 0xf1, 0x00, 0x0f, 0x10, 0xd0, + 0x07, 0xf1, 0x28, 0x00, 0x0f, 0xf2, 0x25, 0x51, 0x01, 0x90, 0x00, 0x91, + 0x4b, 0x46, 0x01, 0x22, 0x64, 0x21, 0x0f, 0xf2, 0xd8, 0x50, 0xeb, 0xf7, + 0xb1, 0xfa, 0x38, 0x62, 0x01, 0x20, 0x00, 0xf0, 0xa4, 0xfa, 0x07, 0xf1, + 0x54, 0x01, 0x01, 0x20, 0xec, 0xf7, 0xfc, 0xf8, 0x78, 0x62, 0x40, 0xb9, + 0x03, 0xb0, 0xbd, 0xe8, 0xf0, 0x43, 0x03, 0x22, 0x4f, 0xf6, 0x6f, 0x71, + 0x02, 0x20, 0xea, 0xf7, 0xf7, 0xb9, 0xbd, 0xe8, 0xf7, 0x83, 0x2d, 0xe9, + 0xf8, 0x41, 0x85, 0xb0, 0x04, 0x46, 0x00, 0x25, 0x02, 0x94, 0x74, 0xb3, + 0x00, 0x20, 0x00, 0xf0, 0x88, 0xfa, 0x2a, 0xe0, 0x32, 0x7a, 0x00, 0x21, + 0x03, 0x91, 0x04, 0x91, 0x00, 0x20, 0x01, 0x23, 0x02, 0x9f, 0x83, 0x40, + 0x1f, 0x42, 0x08, 0xd0, 0x03, 0x9f, 0x1f, 0x43, 0x03, 0x97, 0x49, 0x1c, + 0x04, 0x9f, 0x3b, 0x43, 0x91, 0x42, 0x04, 0x93, 0x02, 0xd2, 0x40, 0x1c, + 0x08, 0x28, 0xee, 0xd3, 0x02, 0xa9, 0x02, 0x20, 0x00, 0xf0, 0x4a, 0xf8, + 0x02, 0xa9, 0x02, 0x20, 0x00, 0xf0, 0x70, 0xf8, 0x02, 0x98, 0x78, 0xb1, + 0x70, 0x7a, 0x01, 0x28, 0xdc, 0xd1, 0x02, 0xa9, 0x03, 0x20, 0x00, 0xf0, + 0x3d, 0xf8, 0x02, 0xa9, 0x03, 0x20, 0x00, 0xf0, 0x63, 0xf8, 0x02, 0x98, + 0xdf, 0xf8, 0x1c, 0x65, 0x00, 0x28, 0xcf, 0xd1, 0x00, 0x27, 0x0f, 0xf2, + 0x34, 0x58, 0x24, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x21, 0xd5, 0x00, 0xf0, + 0x58, 0xf9, 0xb4, 0x22, 0xdf, 0xf8, 0x04, 0x15, 0x50, 0x43, 0x0e, 0x18, + 0x3b, 0x46, 0x70, 0x6c, 0x01, 0x90, 0x03, 0x20, 0xf1, 0x69, 0x0a, 0x68, + 0x00, 0x92, 0x02, 0x21, 0x42, 0x46, 0xdc, 0xf7, 0x2a, 0xfe, 0x30, 0x46, + 0x02, 0xf0, 0x06, 0xff, 0xf2, 0x69, 0x01, 0x46, 0x10, 0x68, 0x00, 0xb9, + 0x11, 0x60, 0x35, 0xb9, 0xd6, 0xf8, 0xa8, 0x00, 0x40, 0x1c, 0xc6, 0xf8, + 0xa8, 0x00, 0xf0, 0x69, 0x05, 0x68, 0x7f, 0x1c, 0x08, 0x2f, 0xd6, 0xd3, + 0x14, 0xb1, 0x01, 0x20, 0x00, 0xf0, 0x27, 0xfa, 0x28, 0x46, 0x06, 0xb0, + 0xbd, 0xe8, 0xf0, 0x81, 0x2d, 0xe9, 0xf0, 0x41, 0x80, 0x46, 0x0e, 0x46, + 0x00, 0x27, 0x01, 0x24, 0xb0, 0x68, 0xbc, 0x40, 0x20, 0x42, 0x1a, 0xd0, + 0x00, 0xf0, 0x21, 0xf9, 0xb4, 0x22, 0xdf, 0xf8, 0x98, 0x14, 0x50, 0x43, + 0x0d, 0x18, 0xb8, 0xf1, 0x02, 0x0f, 0x04, 0xbf, 0xe8, 0x69, 0xf7, 0xf7, + 0x40, 0xf8, 0x41, 0x46, 0x28, 0x46, 0x02, 0xf0, 0x34, 0xfc, 0x40, 0xb1, + 0xe9, 0x69, 0x08, 0x60, 0xe4, 0x43, 0xb0, 0x68, 0x20, 0x40, 0xb0, 0x60, + 0x31, 0x68, 0x0c, 0x40, 0x34, 0x60, 0x7f, 0x1c, 0x08, 0x2f, 0xdc, 0xd3, + 0xbd, 0xe8, 0xf0, 0x81, 0x2d, 0xe9, 0xfc, 0x47, 0x80, 0x46, 0x0c, 0x46, + 0x00, 0x20, 0x00, 0x90, 0xa6, 0x68, 0xdf, 0xf8, 0x4c, 0xa4, 0x2a, 0xe0, + 0x00, 0x27, 0x01, 0x25, 0xbd, 0x40, 0x2e, 0x42, 0x22, 0xd0, 0x00, 0xf0, + 0xf2, 0xf8, 0xb4, 0x22, 0xdf, 0xf8, 0x38, 0x14, 0x50, 0x43, 0x01, 0xeb, + 0x00, 0x09, 0x6a, 0x46, 0x41, 0x46, 0x48, 0x46, 0x02, 0xf0, 0x6a, 0xfc, + 0xa0, 0xb1, 0xed, 0x43, 0x2e, 0x40, 0xb8, 0xf1, 0x03, 0x0f, 0x1c, 0xbf, + 0x9a, 0xf8, 0x09, 0x00, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x98, 0x28, 0xb1, + 0xa0, 0x68, 0x28, 0x40, 0xa0, 0x60, 0x21, 0x68, 0x0d, 0x40, 0x25, 0x60, + 0xd9, 0xf8, 0x1c, 0x10, 0x00, 0x98, 0x08, 0x60, 0x7f, 0x1c, 0x08, 0x2f, + 0xd5, 0xd3, 0x00, 0x2e, 0xd2, 0xd1, 0xbd, 0xe8, 0xf3, 0x87, 0x2d, 0xe9, + 0xfc, 0x41, 0xf7, 0xf7, 0x07, 0xf8, 0x05, 0x46, 0xdc, 0xf7, 0xa6, 0xfc, + 0x00, 0x24, 0xff, 0x28, 0x0c, 0xd1, 0x4f, 0xf6, 0x2b, 0x74, 0x00, 0x94, + 0x2b, 0x46, 0x0f, 0xf2, 0x08, 0x42, 0x34, 0x21, 0x01, 0x20, 0xdc, 0xf7, + 0x98, 0xfd, 0x20, 0x46, 0xbd, 0xe8, 0xf6, 0x81, 0xb4, 0x21, 0xdf, 0xf8, + 0xbc, 0x23, 0x48, 0x43, 0x16, 0x18, 0x96, 0xf8, 0x3e, 0x00, 0x10, 0xb1, + 0x40, 0xf2, 0x0b, 0x24, 0xe9, 0xe7, 0xf0, 0x69, 0x01, 0x69, 0x31, 0xb1, + 0x00, 0x68, 0xdf, 0xf8, 0x9c, 0x73, 0x00, 0x28, 0x4f, 0xf6, 0x70, 0x78, + 0x02, 0xd0, 0x40, 0xf2, 0x05, 0x24, 0xdc, 0xe7, 0x30, 0x6a, 0xf6, 0xf7, + 0xc2, 0xff, 0x31, 0x6a, 0x01, 0x20, 0x48, 0x60, 0x4f, 0xf0, 0xff, 0x31, + 0x78, 0x6a, 0xec, 0xf7, 0x69, 0xf9, 0x01, 0x28, 0x18, 0xbf, 0x44, 0x46, + 0x10, 0xd1, 0x1c, 0xb9, 0x30, 0x46, 0x02, 0xf0, 0x9c, 0xfc, 0x04, 0x46, + 0x44, 0x45, 0x09, 0xd0, 0x78, 0x6a, 0x00, 0x23, 0x00, 0x22, 0x00, 0x21, + 0xec, 0xf7, 0x0b, 0xf8, 0x01, 0x28, 0x18, 0xbf, 0x4f, 0xf6, 0x78, 0x74, + 0xdf, 0xf8, 0x50, 0x13, 0x4f, 0xf0, 0x80, 0x50, 0x08, 0x60, 0xbf, 0xf3, + 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0xd6, 0xf8, 0xac, 0x00, 0x31, 0x6a, + 0x40, 0x1c, 0xc6, 0xf8, 0xac, 0x00, 0xc8, 0x6a, 0x08, 0xb1, 0x00, 0x2c, + 0xcc, 0xd0, 0x00, 0x20, 0x00, 0x2c, 0x86, 0xf8, 0x3e, 0x00, 0xac, 0xd0, + 0x44, 0x45, 0x1e, 0xbf, 0x40, 0xf2, 0x0e, 0x20, 0x84, 0x42, 0xb4, 0xf1, + 0x00, 0x4f, 0x9c, 0xd1, 0x00, 0x24, 0xa2, 0xe7, 0x7c, 0xb5, 0x00, 0xf0, + 0x15, 0xf8, 0xdc, 0xf7, 0x37, 0xfc, 0x06, 0x9a, 0x00, 0x92, 0x01, 0x21, + 0x07, 0xe0, 0x7c, 0xb5, 0x00, 0xf0, 0x0c, 0xf8, 0xdc, 0xf7, 0x2e, 0xfc, + 0x06, 0x9a, 0x00, 0x92, 0x00, 0x21, 0x01, 0x91, 0x33, 0x46, 0x2a, 0x46, + 0x21, 0x46, 0x00, 0xf0, 0x06, 0xf8, 0x76, 0xbd, 0x0c, 0x46, 0x15, 0x46, + 0x1e, 0x46, 0xf6, 0xf7, 0x7d, 0xbf, 0xf8, 0xb5, 0x0c, 0x46, 0x15, 0x46, + 0x07, 0x99, 0xb2, 0x4f, 0xb4, 0x22, 0x00, 0x26, 0x50, 0x43, 0x38, 0x44, + 0x00, 0x29, 0x14, 0xbf, 0xc1, 0x69, 0x01, 0x6a, 0x1b, 0xb1, 0x02, 0x2b, + 0x0b, 0xd0, 0x0a, 0xd3, 0x10, 0xe0, 0x14, 0x27, 0x28, 0x68, 0xb8, 0x42, + 0x0f, 0xd3, 0x3a, 0x46, 0x20, 0x46, 0xce, 0xf7, 0x5f, 0xfb, 0x2f, 0x60, + 0x0b, 0xe0, 0x2f, 0x68, 0xa7, 0xf1, 0x14, 0x02, 0x1d, 0x2a, 0xf1, 0xd3, + 0x30, 0x27, 0xef, 0xe7, 0x4f, 0xf6, 0x2a, 0x76, 0x01, 0xe0, 0x4f, 0xf6, + 0x26, 0x76, 0x30, 0x46, 0xf2, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x09, 0xf8, + 0xe6, 0xf7, 0xb3, 0xfb, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x03, 0xf8, + 0xe6, 0xf7, 0x98, 0xfb, 0x02, 0xbd, 0x00, 0x92, 0x0b, 0x46, 0x02, 0x46, + 0x20, 0x21, 0x96, 0x48, 0x70, 0x47, 0x38, 0x46, 0xdc, 0xf7, 0xe0, 0xbb, + 0x2d, 0xe9, 0xf8, 0x43, 0xa2, 0xb0, 0x88, 0x46, 0x00, 0x21, 0x01, 0x91, + 0x15, 0x46, 0xf6, 0xf7, 0x35, 0xff, 0x81, 0x46, 0xdc, 0xf7, 0xd4, 0xfb, + 0x06, 0x46, 0xff, 0x2e, 0x03, 0xd1, 0x4f, 0xf6, 0x2b, 0x70, 0x01, 0x90, + 0x4f, 0xe0, 0x4b, 0x46, 0x9e, 0xa2, 0x02, 0x21, 0x03, 0x20, 0xdc, 0xf7, + 0xc6, 0xfc, 0xb4, 0x21, 0x87, 0x48, 0x2a, 0x9f, 0x71, 0x43, 0x44, 0x18, + 0xb8, 0xf1, 0x00, 0x0f, 0x10, 0xd0, 0xfe, 0xf7, 0x4b, 0xfc, 0x18, 0xb9, + 0x4f, 0xf4, 0x03, 0x70, 0x01, 0x90, 0x32, 0xe0, 0xb8, 0xf1, 0x09, 0x0f, + 0x1d, 0xd8, 0xdf, 0xe8, 0x08, 0xf0, 0x05, 0x19, 0x3a, 0x45, 0x53, 0x5b, + 0x4f, 0x62, 0x6e, 0x7a, 0x01, 0x21, 0x29, 0x60, 0x0a, 0x20, 0x00, 0x22, + 0x68, 0x60, 0xaa, 0x60, 0xea, 0x60, 0x10, 0x21, 0x39, 0x60, 0x18, 0x21, + 0xe0, 0x69, 0x14, 0x30, 0xe0, 0xf7, 0x24, 0xf9, 0x20, 0x6a, 0x18, 0x21, + 0x14, 0x30, 0xe0, 0xf7, 0x1f, 0xf9, 0x1c, 0xe0, 0x94, 0xf8, 0x3e, 0x00, + 0x00, 0x28, 0x68, 0xd1, 0x61, 0x6a, 0xa0, 0x6a, 0xd0, 0xf7, 0xe6, 0xfc, + 0x01, 0x28, 0x12, 0xd1, 0x20, 0x46, 0x02, 0xf0, 0x74, 0xfc, 0x01, 0x90, + 0x01, 0xa9, 0x04, 0x20, 0x38, 0x60, 0x08, 0x68, 0x28, 0x60, 0x01, 0x98, + 0x38, 0xb1, 0x01, 0x98, 0x7f, 0xa2, 0x00, 0x90, 0x4b, 0x46, 0x02, 0x21, + 0x01, 0x20, 0xdc, 0xf7, 0x7c, 0xfc, 0x01, 0x98, 0x23, 0xb0, 0xbd, 0xe8, + 0xf0, 0x83, 0x29, 0x78, 0x07, 0x29, 0x03, 0xdb, 0x40, 0xf2, 0x0b, 0x21, + 0x01, 0x91, 0xec, 0xe7, 0x20, 0x46, 0x02, 0xf0, 0x15, 0xfd, 0xdb, 0xe7, + 0x20, 0x46, 0x02, 0xf0, 0x16, 0xfd, 0x01, 0x20, 0x38, 0x60, 0x04, 0xf1, + 0x3d, 0x01, 0x08, 0x78, 0x28, 0x70, 0xe6, 0xe7, 0xa0, 0x6a, 0xd0, 0xf7, + 0x35, 0xfd, 0xcd, 0xe7, 0x18, 0x20, 0x38, 0x60, 0x18, 0x22, 0x55, 0x49, + 0x28, 0x46, 0xce, 0xf7, 0xb3, 0xfa, 0xda, 0xe7, 0x18, 0x21, 0x39, 0x60, + 0x4e, 0x43, 0x52, 0x4b, 0x18, 0x22, 0x99, 0x19, 0xf4, 0xe7, 0xa0, 0x6a, + 0x02, 0xa9, 0xd1, 0xf7, 0x13, 0xf8, 0x08, 0x20, 0x38, 0x60, 0x02, 0xa9, + 0x08, 0x68, 0x28, 0x60, 0x48, 0x68, 0x68, 0x60, 0xc7, 0xe7, 0xa0, 0x6a, + 0x02, 0xa9, 0xd1, 0xf7, 0x0b, 0xf8, 0x80, 0x20, 0x38, 0x60, 0x80, 0x22, + 0x02, 0xa9, 0x28, 0x46, 0xce, 0xf7, 0x94, 0xfa, 0xbb, 0xe7, 0x28, 0x78, + 0x8d, 0xf8, 0x00, 0x00, 0x01, 0x46, 0xa0, 0x6a, 0xd1, 0xf7, 0x00, 0xf8, + 0x01, 0x20, 0x38, 0x60, 0x9d, 0xf8, 0x00, 0x00, 0xc6, 0xe7, 0x4f, 0xf6, + 0x27, 0x70, 0x6f, 0xe7, 0x38, 0xb5, 0x0c, 0x46, 0xdc, 0xf7, 0x26, 0xfb, + 0xb4, 0x21, 0x37, 0x4b, 0x48, 0x43, 0x00, 0x22, 0x1d, 0x18, 0x00, 0x92, + 0x21, 0x46, 0xa8, 0x6a, 0xd0, 0xf7, 0x8d, 0xfd, 0x28, 0x6d, 0x69, 0x46, + 0xeb, 0xf7, 0x74, 0xff, 0x00, 0x98, 0x38, 0xb1, 0x30, 0x48, 0x4f, 0xf0, + 0x80, 0x51, 0x01, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, + 0x31, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0xeb, 0xf7, 0x93, 0xf9, + 0x80, 0x46, 0x00, 0x27, 0x27, 0x4c, 0x2b, 0x4d, 0x28, 0xfa, 0x07, 0xf0, + 0xc0, 0x07, 0x09, 0xd5, 0x2e, 0x78, 0xff, 0xf7, 0x1a, 0xff, 0xb4, 0x22, + 0x50, 0x43, 0x20, 0x44, 0x31, 0x46, 0x80, 0x6a, 0xd0, 0xf7, 0x95, 0xff, + 0x7f, 0x1c, 0x08, 0x2f, 0xee, 0xd3, 0x28, 0x78, 0x80, 0xf0, 0x01, 0x00, + 0x28, 0x70, 0xbd, 0xe8, 0xf0, 0x81, 0x1c, 0xb5, 0x19, 0x4c, 0x20, 0xb9, + 0x00, 0x90, 0x00, 0x23, 0x00, 0x22, 0x03, 0x21, 0x06, 0xe0, 0xea, 0xf7, + 0x62, 0xfc, 0x02, 0x46, 0x00, 0x20, 0x00, 0x90, 0x00, 0x23, 0x01, 0x21, + 0x20, 0x6a, 0xeb, 0xf7, 0x0f, 0xf8, 0x13, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, + 0x04, 0x46, 0x0f, 0x48, 0xc0, 0x69, 0x0d, 0x46, 0x00, 0x26, 0x00, 0xb1, + 0x05, 0x46, 0x00, 0x27, 0xdf, 0xf8, 0x30, 0x80, 0x24, 0xfa, 0x07, 0xf0, + 0xc0, 0x07, 0x08, 0xd5, 0xff, 0xf7, 0xe5, 0xfe, 0xff, 0x28, 0x0a, 0xd0, + 0xb4, 0x21, 0x48, 0x43, 0x40, 0x44, 0x02, 0x6a, 0xd5, 0x62, 0x7f, 0x1c, + 0x08, 0x2f, 0xef, 0xd3, 0x30, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x4f, 0xf6, + 0x2b, 0x76, 0xf9, 0xe7, 0x40, 0x3e, 0x00, 0x20, 0x98, 0x5c, 0x03, 0x20, + 0x04, 0xed, 0x00, 0xe0, 0xe4, 0x3e, 0x00, 0x20, 0x98, 0x1c, 0x03, 0x20, + 0x96, 0x90, 0x00, 0x20, 0x41, 0x64, 0x63, 0x4f, 0x76, 0x72, 0x6c, 0x00, + 0x41, 0x64, 0x63, 0x52, 0x78, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, + 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x58, 0x2c, 0x20, 0x25, 0x64, 0x20, + 0x6d, 0x73, 0x0a, 0x00, 0x41, 0x64, 0x63, 0x52, 0x78, 0x54, 0x72, 0x3a, + 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, + 0x78, 0x0a, 0x00, 0x00, 0x41, 0x64, 0x63, 0x52, 0x78, 0x5f, 0x43, 0x74, + 0x72, 0x6c, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x00, + 0x41, 0x64, 0x63, 0x52, 0x78, 0x5f, 0x43, 0x74, 0x72, 0x6c, 0x3a, 0x20, + 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x30, 0x78, + 0x25, 0x78, 0x0a, 0x00, 0xdf, 0xf8, 0x00, 0xf0, 0x69, 0x29, 0x00, 0x02, + 0xdf, 0xf8, 0x00, 0xf0, 0x85, 0x26, 0x00, 0x02, 0xdf, 0xf8, 0x00, 0xf0, + 0xa5, 0x27, 0x00, 0x02, 0xdf, 0xf8, 0x00, 0xf0, 0x21, 0x29, 0x00, 0x02, + 0x2d, 0xe9, 0xf8, 0x43, 0x80, 0x46, 0x89, 0x46, 0x00, 0x27, 0xdf, 0xf8, + 0x04, 0x45, 0x28, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x18, 0xd5, 0x38, 0x46, + 0xdc, 0xf7, 0x67, 0xfa, 0x05, 0x46, 0xd4, 0x21, 0xdf, 0xf8, 0xf0, 0x04, + 0x69, 0x43, 0x46, 0x18, 0xd4, 0x21, 0x30, 0x46, 0xe0, 0xf7, 0x14, 0xfd, + 0xf8, 0xb2, 0x30, 0x60, 0x75, 0x60, 0x00, 0x20, 0x74, 0x61, 0x86, 0xf8, + 0x37, 0x00, 0xc6, 0xf8, 0x2c, 0x90, 0x30, 0x46, 0x02, 0xf0, 0x5a, 0xfd, + 0x7f, 0x1c, 0x01, 0x2f, 0xdf, 0xd9, 0xbd, 0xe8, 0xf1, 0x83, 0x7f, 0xb5, + 0xdf, 0xf8, 0xb8, 0x64, 0x31, 0x7c, 0x05, 0x46, 0x00, 0x24, 0x51, 0xb9, + 0x0d, 0x20, 0xe6, 0xf7, 0x8a, 0xfc, 0x0d, 0x20, 0xe6, 0xf7, 0x09, 0xfc, + 0x0f, 0xf2, 0x3d, 0x41, 0x0d, 0x20, 0xe6, 0xf7, 0xf2, 0xfc, 0x00, 0x20, + 0x25, 0xfa, 0x00, 0xf1, 0xc9, 0x07, 0x03, 0xd4, 0x40, 0x1c, 0x01, 0x28, + 0xf8, 0xd9, 0x61, 0xe0, 0xdc, 0xf7, 0x2f, 0xfa, 0x00, 0x28, 0x5d, 0xd1, + 0x30, 0x7c, 0x58, 0xb9, 0x0f, 0xf2, 0x8c, 0x42, 0x36, 0x21, 0x03, 0x20, + 0xdc, 0xf7, 0x15, 0xfb, 0x01, 0x23, 0x01, 0x22, 0x01, 0x21, 0x0d, 0x20, + 0xe6, 0xf7, 0xf3, 0xfb, 0xdf, 0xf8, 0x64, 0x54, 0xa8, 0x69, 0xf6, 0xf7, + 0x52, 0xfd, 0x05, 0xf1, 0x37, 0x04, 0x20, 0x78, 0x20, 0xb9, 0x28, 0x46, + 0x02, 0xf0, 0xcf, 0xfd, 0x10, 0xb9, 0x0b, 0xe0, 0x40, 0xf2, 0x19, 0x30, + 0xa9, 0x69, 0x0f, 0xf2, 0x6c, 0x42, 0x08, 0x60, 0x00, 0x90, 0x03, 0x21, + 0x2b, 0x68, 0x03, 0x20, 0xdc, 0xf7, 0xf5, 0xfa, 0x00, 0x20, 0x02, 0x90, + 0x0f, 0xf2, 0x6c, 0x46, 0x13, 0xe0, 0x02, 0xa9, 0x28, 0x46, 0x02, 0xf0, + 0x53, 0xfe, 0x70, 0xb1, 0xa9, 0x69, 0x02, 0x98, 0x08, 0x60, 0x00, 0x22, + 0x28, 0x6c, 0x02, 0x99, 0x22, 0x70, 0x01, 0x90, 0x00, 0x91, 0x32, 0x46, + 0x2b, 0x68, 0x03, 0x21, 0x03, 0x20, 0xdc, 0xf7, 0xdc, 0xfa, 0x60, 0x78, + 0x01, 0x28, 0xe8, 0xd0, 0x69, 0x69, 0x08, 0x7c, 0x10, 0xb9, 0x0d, 0x20, + 0xe6, 0xf7, 0x18, 0xfc, 0x28, 0x46, 0x03, 0xf0, 0xad, 0xf8, 0xaa, 0x69, + 0x01, 0x46, 0x10, 0x68, 0x00, 0xb9, 0x11, 0x60, 0xa8, 0x69, 0x04, 0x68, + 0x44, 0xb9, 0x05, 0xf1, 0xc4, 0x00, 0x4f, 0xf0, 0xff, 0x31, 0x81, 0x60, + 0xc1, 0x60, 0x01, 0x68, 0x49, 0x1c, 0x01, 0x60, 0x20, 0x46, 0x04, 0xb0, + 0x70, 0xbd, 0x2d, 0xe9, 0xfc, 0x47, 0x04, 0x46, 0xf6, 0xf7, 0x16, 0xfd, + 0x82, 0x46, 0xdc, 0xf7, 0xc4, 0xf9, 0xff, 0x28, 0x08, 0xbf, 0x4f, 0xf6, + 0x2b, 0x74, 0x09, 0xd0, 0xd4, 0x21, 0xdf, 0xf8, 0xa4, 0x23, 0x48, 0x43, + 0x16, 0x18, 0x96, 0xf8, 0x37, 0x00, 0x10, 0xb1, 0x40, 0xf2, 0x19, 0x34, + 0x74, 0xe0, 0xb0, 0x69, 0x01, 0x69, 0x09, 0xb1, 0x00, 0x68, 0x10, 0xb1, + 0x40, 0xf2, 0x1b, 0x34, 0x6c, 0xe0, 0x02, 0x20, 0x86, 0xf8, 0x37, 0x00, + 0x01, 0xaa, 0x30, 0x6a, 0x0f, 0xf2, 0xd4, 0x38, 0x01, 0x21, 0xff, 0xf7, + 0x1d, 0xff, 0x00, 0x28, 0x06, 0xf1, 0xc8, 0x07, 0x52, 0xd1, 0xd7, 0xf8, + 0x08, 0x90, 0x9d, 0xed, 0x01, 0x0a, 0xdf, 0xf8, 0x58, 0x53, 0xf0, 0xee, + 0x00, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xce, 0xf7, 0x83, 0xfb, 0xb2, 0xee, + 0x04, 0x1a, 0x20, 0xee, 0x01, 0x1a, 0x95, 0xed, 0x07, 0x0a, 0xb4, 0xee, + 0x40, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x27, 0xdb, 0xa8, 0x69, 0x81, 0x45, + 0x03, 0xd3, 0x69, 0x69, 0x20, 0x46, 0x00, 0xf0, 0x6f, 0xf9, 0x00, 0x20, + 0xb8, 0x60, 0xe6, 0xf7, 0xc3, 0xf8, 0x78, 0x60, 0xf0, 0x69, 0xf6, 0xf7, + 0xb0, 0xfc, 0xf1, 0x69, 0x01, 0x20, 0x48, 0x60, 0x30, 0x46, 0x02, 0xf0, + 0x70, 0xfe, 0x04, 0x46, 0x38, 0x68, 0x40, 0x1c, 0x38, 0x60, 0xf1, 0x69, + 0x88, 0x69, 0x08, 0xb1, 0x00, 0x2c, 0xed, 0xd0, 0x2c, 0xb3, 0x40, 0xf2, + 0x1e, 0x30, 0x84, 0x42, 0x18, 0xbf, 0xb4, 0xf1, 0x00, 0x4f, 0x1b, 0xd1, + 0x00, 0x24, 0x1c, 0xe0, 0x19, 0xf1, 0x01, 0x0f, 0x04, 0xbf, 0x78, 0x68, + 0x10, 0xf1, 0x01, 0x0f, 0xdc, 0xd0, 0x78, 0x68, 0x10, 0xb9, 0x00, 0x21, + 0xb9, 0x60, 0xd4, 0xe7, 0xe6, 0xf7, 0x98, 0xf8, 0x01, 0x46, 0x78, 0x68, + 0xe6, 0xf7, 0xd8, 0xf8, 0xb8, 0x60, 0xcf, 0xe7, 0x40, 0xf2, 0x17, 0x30, + 0x00, 0x90, 0x00, 0xf0, 0x0a, 0xf8, 0xc9, 0xe7, 0x00, 0x94, 0x00, 0xf0, + 0x06, 0xf8, 0x00, 0x20, 0x86, 0xf8, 0x37, 0x00, 0x20, 0x46, 0xbd, 0xe8, + 0xf6, 0x87, 0x53, 0x46, 0x42, 0x46, 0x36, 0x21, 0x01, 0x20, 0xdc, 0xf7, + 0x26, 0xba, 0x7c, 0xb5, 0x00, 0xf0, 0x1d, 0xf8, 0xdc, 0xf7, 0x31, 0xf9, + 0x06, 0x9a, 0x00, 0x92, 0x01, 0x21, 0x01, 0x91, 0x00, 0xf0, 0x01, 0xf8, + 0x76, 0xbd, 0x33, 0x46, 0x2a, 0x46, 0x21, 0x46, 0x14, 0xe0, 0xfe, 0xb5, + 0x00, 0xf0, 0x0d, 0xf8, 0xdc, 0xf7, 0x21, 0xf9, 0x00, 0x27, 0xff, 0x28, + 0x05, 0xd0, 0x08, 0x9a, 0x00, 0x92, 0x01, 0x97, 0xff, 0xf7, 0xef, 0xff, + 0x07, 0x46, 0x38, 0x46, 0xfe, 0xbd, 0x0c, 0x46, 0x15, 0x46, 0x1e, 0x46, + 0xf6, 0xf7, 0x60, 0xbc, 0xf8, 0xb5, 0x0c, 0x46, 0x15, 0x46, 0x07, 0x99, + 0x90, 0x4f, 0xd4, 0x22, 0x00, 0x26, 0x50, 0x43, 0x38, 0x44, 0x00, 0x29, + 0x14, 0xbf, 0x81, 0x69, 0xc1, 0x69, 0x1b, 0xb1, 0x02, 0x2b, 0x0b, 0xd0, + 0x0a, 0xd3, 0x10, 0xe0, 0x14, 0x27, 0x28, 0x68, 0xb8, 0x42, 0x0f, 0xd3, + 0x3a, 0x46, 0x20, 0x46, 0xce, 0xf7, 0x42, 0xf8, 0x2f, 0x60, 0x0b, 0xe0, + 0x2f, 0x68, 0xa7, 0xf1, 0x14, 0x02, 0x09, 0x2a, 0xf1, 0xd3, 0x1c, 0x27, + 0xef, 0xe7, 0x4f, 0xf6, 0x2a, 0x76, 0x01, 0xe0, 0x4f, 0xf6, 0x26, 0x76, + 0x30, 0x46, 0xf2, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x09, 0xf8, 0xe6, 0xf7, + 0x96, 0xf8, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x03, 0xf8, 0xe6, 0xf7, + 0x7b, 0xf8, 0x02, 0xbd, 0x00, 0x92, 0x0b, 0x46, 0x02, 0x46, 0x20, 0x21, + 0x74, 0x48, 0x70, 0x47, 0x2d, 0xe9, 0xfc, 0x41, 0x0c, 0x46, 0x00, 0x21, + 0x00, 0x91, 0x15, 0x46, 0xf6, 0xf7, 0x1c, 0xfc, 0x06, 0x46, 0xdc, 0xf7, + 0xca, 0xf8, 0x07, 0x46, 0xff, 0x2f, 0x03, 0xd1, 0x4f, 0xf6, 0x2b, 0x70, + 0x00, 0x90, 0x40, 0xe0, 0x4f, 0xea, 0x06, 0x03, 0x88, 0xa2, 0x03, 0x21, + 0x03, 0x20, 0xdc, 0xf7, 0xac, 0xf9, 0x08, 0x9e, 0xa4, 0xb1, 0xfe, 0xf7, + 0x37, 0xf9, 0x10, 0xb9, 0x40, 0xf2, 0x1a, 0x30, 0x36, 0xe0, 0xd4, 0x20, + 0x63, 0x49, 0x78, 0x43, 0x01, 0xeb, 0x00, 0x08, 0x06, 0x2c, 0x08, 0xf1, + 0x20, 0x02, 0x5c, 0xd8, 0xdf, 0xe8, 0x04, 0xf0, 0x04, 0x0f, 0x2e, 0x3e, + 0x4c, 0x54, 0x48, 0x00, 0x01, 0x21, 0x29, 0x60, 0x0c, 0x20, 0x68, 0x60, + 0x05, 0x22, 0x00, 0x20, 0xaa, 0x60, 0xe8, 0x60, 0x10, 0x21, 0x31, 0x60, + 0x17, 0xe0, 0xd0, 0x7d, 0xc0, 0xb9, 0x10, 0x68, 0x00, 0x21, 0xff, 0xf7, + 0x13, 0xfe, 0x01, 0x28, 0x0f, 0xd1, 0x40, 0x46, 0x02, 0xf0, 0x98, 0xfe, + 0x00, 0x90, 0x04, 0x20, 0x30, 0x60, 0x00, 0x98, 0x28, 0x60, 0x00, 0x98, + 0x28, 0xb1, 0x00, 0x9b, 0x70, 0xa2, 0x03, 0x21, 0x01, 0x20, 0xdc, 0xf7, + 0x72, 0xf9, 0x00, 0x98, 0xbd, 0xe8, 0xf6, 0x81, 0x40, 0xf2, 0x19, 0x30, + 0x00, 0x90, 0xf2, 0xe7, 0x28, 0x78, 0x07, 0x28, 0xa8, 0xbf, 0x4f, 0xf4, + 0x46, 0x70, 0xf7, 0xda, 0x02, 0x28, 0x16, 0xbf, 0x03, 0x28, 0x01, 0x22, + 0x00, 0x22, 0x01, 0x46, 0x40, 0x46, 0x02, 0xf0, 0x9f, 0xfe, 0xd6, 0xe7, + 0x40, 0x46, 0x02, 0xf0, 0xa1, 0xfe, 0x01, 0x20, 0x30, 0x60, 0x08, 0xf1, + 0x36, 0x01, 0x08, 0x78, 0x28, 0x70, 0xde, 0xe7, 0x10, 0x68, 0xff, 0xf7, + 0xe1, 0xfd, 0xc8, 0xe7, 0x18, 0x20, 0x30, 0x60, 0x18, 0x22, 0x38, 0x49, + 0x28, 0x46, 0xcd, 0xf7, 0xa1, 0xff, 0xd2, 0xe7, 0x18, 0x21, 0x31, 0x60, + 0x4f, 0x43, 0x35, 0x4b, 0x18, 0x22, 0xd9, 0x19, 0xf4, 0xe7, 0x4f, 0xf6, + 0x27, 0x71, 0x00, 0x91, 0xc1, 0xe7, 0x38, 0xb5, 0x0c, 0x46, 0xdc, 0xf7, + 0x46, 0xf8, 0xd4, 0x21, 0x2c, 0x4b, 0x48, 0x43, 0x00, 0x22, 0x1d, 0x18, + 0x00, 0x92, 0x21, 0x46, 0x28, 0x6a, 0xff, 0xf7, 0xc3, 0xfd, 0xe8, 0x6c, + 0x69, 0x46, 0xeb, 0xf7, 0x85, 0xfc, 0x00, 0x98, 0x38, 0xb1, 0x28, 0x48, + 0x4f, 0xf0, 0x80, 0x51, 0x01, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, + 0x6f, 0x8f, 0x31, 0xbd, 0x10, 0xb5, 0x0c, 0x46, 0xdc, 0xf7, 0x29, 0xf8, + 0xd4, 0x22, 0x1e, 0x4b, 0x50, 0x43, 0x18, 0x44, 0x21, 0x46, 0x00, 0x6a, + 0xbd, 0xe8, 0x10, 0x40, 0xff, 0xf7, 0xa6, 0xbd, 0x19, 0x48, 0x00, 0xf1, + 0xb4, 0x02, 0x11, 0x7a, 0x13, 0x68, 0x00, 0x68, 0x49, 0x1c, 0x11, 0x72, + 0x5b, 0x1c, 0x13, 0x60, 0xc9, 0xb2, 0xc0, 0xb2, 0xeb, 0xf7, 0xe8, 0xb9, + 0x2d, 0xe9, 0xf0, 0x41, 0x04, 0x46, 0x10, 0x48, 0x40, 0x69, 0x0d, 0x46, + 0x00, 0x26, 0x00, 0xb1, 0x05, 0x46, 0x00, 0x27, 0xdf, 0xf8, 0x34, 0x80, + 0x24, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x09, 0xd5, 0x38, 0x46, 0xdb, 0xf7, + 0xfe, 0xff, 0xff, 0x28, 0x0a, 0xd0, 0xd4, 0x21, 0x48, 0x43, 0x40, 0x44, + 0xc2, 0x69, 0x95, 0x61, 0x7f, 0x1c, 0x01, 0x2f, 0xee, 0xd9, 0x30, 0x46, + 0xbd, 0xe8, 0xf0, 0x81, 0x4f, 0xf6, 0x2b, 0x76, 0xf9, 0xe7, 0x00, 0x00, + 0xc8, 0x3d, 0x00, 0x20, 0x28, 0x64, 0x03, 0x20, 0x24, 0x3e, 0x00, 0x20, + 0x78, 0x49, 0x03, 0x20, 0x04, 0xed, 0x00, 0xe0, 0x41, 0x64, 0x63, 0x4f, + 0x72, 0x78, 0x3a, 0x20, 0x75, 0x73, 0x65, 0x20, 0x72, 0x61, 0x6d, 0x70, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x0a, 0x00, 0x41, 0x64, 0x63, 0x4f, + 0x72, 0x78, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, + 0x72, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x00, 0x41, 0x64, 0x63, 0x4f, + 0x72, 0x78, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, + 0x72, 0x20, 0x25, 0x78, 0x2c, 0x20, 0x25, 0x64, 0x20, 0x6d, 0x73, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x64, 0x63, 0x4f, 0x72, 0x78, 0x54, 0x72, + 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, + 0x25, 0x78, 0x0a, 0x00, 0x41, 0x64, 0x63, 0x4f, 0x72, 0x78, 0x5f, 0x43, + 0x74, 0x72, 0x6c, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x0a, 0x00, 0x00, + 0x41, 0x64, 0x63, 0x4f, 0x72, 0x78, 0x5f, 0x43, 0x74, 0x72, 0x6c, 0x3a, + 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, 0x80, 0x46, 0x89, 0x46, + 0x00, 0x27, 0xdf, 0xf8, 0xbc, 0x44, 0x28, 0xfa, 0x07, 0xf0, 0xc0, 0x07, + 0x17, 0xd5, 0x00, 0xf0, 0x71, 0xf9, 0x05, 0x46, 0xd4, 0x21, 0xdf, 0xf8, + 0xac, 0x04, 0x69, 0x43, 0x46, 0x18, 0xd4, 0x21, 0x30, 0x46, 0xe0, 0xf7, + 0x2b, 0xfa, 0xf8, 0xb2, 0x30, 0x60, 0x75, 0x60, 0x00, 0x20, 0x74, 0x61, + 0x86, 0xf8, 0x37, 0x00, 0xc6, 0xf8, 0x2c, 0x90, 0x30, 0x46, 0x02, 0xf0, + 0xbd, 0xfe, 0x7f, 0x1c, 0x08, 0x2f, 0xe0, 0xd3, 0xbd, 0xe8, 0xf1, 0x83, + 0x2d, 0xe9, 0xf1, 0x4f, 0x82, 0xb0, 0x00, 0x20, 0xdd, 0xf8, 0x08, 0xa0, + 0xdf, 0xf8, 0x6c, 0x94, 0x01, 0x90, 0x4f, 0xf0, 0xd4, 0x08, 0x01, 0x26, + 0xba, 0xf1, 0x00, 0x0f, 0x54, 0xd0, 0xdf, 0xf8, 0x58, 0x14, 0xc9, 0x7b, + 0x00, 0x20, 0x00, 0x24, 0x00, 0x22, 0x06, 0xfa, 0x02, 0xf3, 0x1a, 0xea, + 0x03, 0x0f, 0x03, 0xd0, 0x1c, 0x43, 0x40, 0x1c, 0x88, 0x42, 0x02, 0xd2, + 0x52, 0x1c, 0x08, 0x2a, 0xf3, 0xd3, 0x00, 0x25, 0x06, 0xfa, 0x05, 0xf7, + 0x3c, 0x42, 0x18, 0xd0, 0x28, 0x46, 0xdb, 0xf7, 0x31, 0xff, 0x08, 0xfb, + 0x00, 0xfb, 0x09, 0xf1, 0x18, 0x00, 0x50, 0xf8, 0x0b, 0x00, 0xf6, 0xf7, + 0x6a, 0xfa, 0x09, 0xeb, 0x0b, 0x00, 0x02, 0xf0, 0x28, 0xff, 0x40, 0xb1, + 0x09, 0xf1, 0x18, 0x01, 0xff, 0x43, 0x51, 0xf8, 0x0b, 0x20, 0x3c, 0x40, + 0x10, 0x60, 0x07, 0xea, 0x0a, 0x0a, 0x6d, 0x1c, 0x08, 0x2d, 0xdf, 0xd3, + 0x00, 0x20, 0x00, 0x90, 0x00, 0x2c, 0xc5, 0xd0, 0x00, 0x27, 0x06, 0xfa, + 0x07, 0xfb, 0x14, 0xea, 0x0b, 0x0f, 0x13, 0xd0, 0x00, 0xf0, 0x08, 0xf9, + 0x08, 0xfb, 0x00, 0xf5, 0x69, 0x46, 0x09, 0xeb, 0x05, 0x00, 0x02, 0xf0, + 0x44, 0xff, 0x48, 0xb1, 0x09, 0xf1, 0x18, 0x01, 0x6f, 0xea, 0x0b, 0x00, + 0x04, 0x40, 0x00, 0xea, 0x0a, 0x0a, 0x4a, 0x59, 0x00, 0x98, 0x10, 0x60, + 0x7f, 0x1c, 0x08, 0x2f, 0xe3, 0xd3, 0xdf, 0xe7, 0x02, 0x9c, 0x01, 0x9e, + 0x0f, 0xf2, 0xc0, 0x3a, 0x00, 0x27, 0x24, 0xfa, 0x07, 0xf0, 0xc0, 0x07, + 0x21, 0xd5, 0x00, 0xf0, 0xe7, 0xf8, 0x08, 0xfb, 0x00, 0xf0, 0x09, 0xeb, + 0x00, 0x05, 0x3b, 0x46, 0x28, 0x6c, 0x01, 0x90, 0x03, 0x20, 0xa9, 0x69, + 0x0a, 0x68, 0x00, 0x92, 0x04, 0x21, 0x52, 0x46, 0xdb, 0xf7, 0xd5, 0xff, + 0x28, 0x46, 0x03, 0xf0, 0x94, 0xf9, 0xaa, 0x69, 0x01, 0x46, 0x10, 0x68, + 0x00, 0xb9, 0x11, 0x60, 0x3e, 0xb9, 0xa8, 0x69, 0x06, 0x68, 0x26, 0xb9, + 0xd5, 0xf8, 0xc4, 0x00, 0x40, 0x1c, 0xc5, 0xf8, 0xc4, 0x00, 0x7f, 0x1c, + 0x08, 0x2f, 0xd6, 0xd3, 0x30, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, 0x00, 0x00, + 0x2d, 0xe9, 0xfc, 0x41, 0xf6, 0xf7, 0x18, 0xfa, 0x05, 0x46, 0xdb, 0xf7, + 0xbd, 0xfe, 0xd4, 0x22, 0xdf, 0xf8, 0x3c, 0x13, 0x42, 0x43, 0x8e, 0x18, + 0xf3, 0x69, 0x9f, 0x69, 0x07, 0xb1, 0x01, 0x27, 0xff, 0x28, 0x08, 0xbf, + 0x4f, 0xf6, 0x2b, 0x74, 0x4a, 0xd0, 0x96, 0xf8, 0x37, 0x00, 0x10, 0xb1, + 0x40, 0xf2, 0x14, 0x44, 0x44, 0xe0, 0xb0, 0x69, 0x01, 0x69, 0x09, 0xb1, + 0x00, 0x68, 0x10, 0xb1, 0x40, 0xf2, 0x16, 0x44, 0x3c, 0xe0, 0x02, 0x20, + 0x86, 0xf8, 0x37, 0x00, 0xf9, 0xb2, 0xdf, 0xf8, 0x04, 0x83, 0x29, 0xb1, + 0x30, 0x68, 0x58, 0xf8, 0x20, 0x00, 0x01, 0x23, 0x00, 0xf0, 0x33, 0xf8, + 0xf0, 0x69, 0xf6, 0xf7, 0xd2, 0xf9, 0xf1, 0x69, 0x01, 0x20, 0x48, 0x60, + 0x30, 0x46, 0x02, 0xf0, 0x82, 0xff, 0x04, 0x46, 0xd6, 0xf8, 0xc8, 0x00, + 0xf1, 0x69, 0x40, 0x1c, 0xc6, 0xf8, 0xc8, 0x00, 0x88, 0x69, 0x08, 0xb1, + 0x00, 0x2c, 0xeb, 0xd0, 0xff, 0xb2, 0x2f, 0xb1, 0x30, 0x68, 0x58, 0xf8, + 0x20, 0x00, 0x00, 0x23, 0x00, 0xf0, 0x17, 0xf8, 0x7c, 0xb1, 0x40, 0xf2, + 0x19, 0x40, 0x84, 0x42, 0x14, 0xbf, 0xb4, 0xf1, 0x00, 0x4f, 0x00, 0x24, + 0x07, 0xd0, 0x00, 0x94, 0x4f, 0xea, 0x05, 0x03, 0xb3, 0xa2, 0x35, 0x21, + 0x01, 0x20, 0xdb, 0xf7, 0x60, 0xff, 0x00, 0x20, 0x86, 0xf8, 0x37, 0x00, + 0x20, 0x46, 0xbd, 0xe8, 0xf6, 0x81, 0x01, 0x22, 0x00, 0x21, 0x30, 0x30, + 0xcc, 0xe6, 0x7c, 0xb5, 0x00, 0xf0, 0x15, 0xf8, 0xdb, 0xf7, 0x58, 0xfe, + 0x06, 0x9a, 0x00, 0x92, 0x01, 0x21, 0x07, 0xe0, 0x7c, 0xb5, 0x00, 0xf0, + 0x0c, 0xf8, 0xdb, 0xf7, 0x4f, 0xfe, 0x06, 0x9a, 0x00, 0x92, 0x00, 0x21, + 0x01, 0x91, 0x33, 0x46, 0x2a, 0x46, 0x21, 0x46, 0x00, 0xf0, 0x06, 0xf8, + 0x76, 0xbd, 0x0c, 0x46, 0x15, 0x46, 0x1e, 0x46, 0xf6, 0xf7, 0x98, 0xb9, + 0xf8, 0xb5, 0x0c, 0x46, 0x15, 0x46, 0x07, 0x99, 0x8f, 0x4f, 0xd4, 0x22, + 0x00, 0x26, 0x50, 0x43, 0x38, 0x44, 0x00, 0x29, 0x14, 0xbf, 0x81, 0x69, + 0xc1, 0x69, 0x1b, 0xb1, 0x02, 0x2b, 0x0b, 0xd0, 0x0a, 0xd3, 0x10, 0xe0, + 0x14, 0x27, 0x28, 0x68, 0xb8, 0x42, 0x0f, 0xd3, 0x3a, 0x46, 0x20, 0x46, + 0xcd, 0xf7, 0x7a, 0xfd, 0x2f, 0x60, 0x0b, 0xe0, 0x2f, 0x68, 0xa7, 0xf1, + 0x14, 0x02, 0x09, 0x2a, 0xf1, 0xd3, 0x1c, 0x27, 0xef, 0xe7, 0x4f, 0xf6, + 0x2a, 0x76, 0x01, 0xe0, 0x4f, 0xf6, 0x26, 0x76, 0x30, 0x46, 0xf2, 0xbd, + 0x80, 0xb5, 0x00, 0xf0, 0x09, 0xf8, 0xe5, 0xf7, 0xce, 0xfd, 0x02, 0xbd, + 0x80, 0xb5, 0x00, 0xf0, 0x03, 0xf8, 0xe5, 0xf7, 0xb3, 0xfd, 0x02, 0xbd, + 0x00, 0x92, 0x0b, 0x46, 0x02, 0x46, 0x20, 0x21, 0x73, 0x48, 0x70, 0x47, + 0x38, 0x46, 0xdb, 0xf7, 0x01, 0xbe, 0x00, 0x00, 0x2d, 0xe9, 0xfc, 0x41, + 0x0c, 0x46, 0x00, 0x21, 0x00, 0x91, 0x15, 0x46, 0xf6, 0xf7, 0x50, 0xf9, + 0x06, 0x46, 0xdb, 0xf7, 0xf5, 0xfd, 0x07, 0x46, 0xff, 0x2f, 0x03, 0xd1, + 0x4f, 0xf6, 0x2b, 0x70, 0x00, 0x90, 0x40, 0xe0, 0x4f, 0xea, 0x06, 0x03, + 0x79, 0xa2, 0x04, 0x21, 0x03, 0x20, 0xdb, 0xf7, 0xe0, 0xfe, 0x08, 0x9e, + 0xa4, 0xb1, 0xfd, 0xf7, 0x6b, 0xfe, 0x10, 0xb9, 0x40, 0xf2, 0x15, 0x40, + 0x36, 0xe0, 0xd4, 0x20, 0x60, 0x49, 0x78, 0x43, 0x01, 0xeb, 0x00, 0x08, + 0x06, 0x2c, 0x08, 0xf1, 0x20, 0x02, 0x5c, 0xd8, 0xdf, 0xe8, 0x04, 0xf0, + 0x04, 0x0f, 0x2e, 0x3e, 0x4c, 0x54, 0x48, 0x00, 0x01, 0x21, 0x29, 0x60, + 0x0c, 0x20, 0x68, 0x60, 0x05, 0x22, 0x00, 0x20, 0xaa, 0x60, 0xe8, 0x60, + 0x10, 0x21, 0x31, 0x60, 0x17, 0xe0, 0xd0, 0x7d, 0xc0, 0xb9, 0x10, 0x68, + 0x00, 0x21, 0xff, 0xf7, 0x47, 0xfb, 0x01, 0x28, 0x0f, 0xd1, 0x40, 0x46, + 0x03, 0xf0, 0x0d, 0xf8, 0x00, 0x90, 0x04, 0x20, 0x30, 0x60, 0x00, 0x98, + 0x28, 0x60, 0x00, 0x98, 0x28, 0xb1, 0x00, 0x9b, 0x61, 0xa2, 0x04, 0x21, + 0x01, 0x20, 0xdb, 0xf7, 0xa6, 0xfe, 0x00, 0x98, 0xbd, 0xe8, 0xf6, 0x81, + 0x40, 0xf2, 0x14, 0x40, 0x00, 0x90, 0xf2, 0xe7, 0x28, 0x78, 0x07, 0x28, + 0xa8, 0xbf, 0x40, 0xf2, 0x13, 0x40, 0xf7, 0xda, 0x02, 0x28, 0x16, 0xbf, + 0x03, 0x28, 0x01, 0x22, 0x00, 0x22, 0x01, 0x46, 0x40, 0x46, 0x03, 0xf0, + 0x12, 0xf8, 0xd6, 0xe7, 0x40, 0x46, 0x03, 0xf0, 0x14, 0xf8, 0x01, 0x20, + 0x30, 0x60, 0x08, 0xf1, 0x36, 0x01, 0x08, 0x78, 0x28, 0x70, 0xde, 0xe7, + 0x10, 0x68, 0xff, 0xf7, 0x15, 0xfb, 0xc8, 0xe7, 0x18, 0x20, 0x30, 0x60, + 0x18, 0x22, 0x36, 0x49, 0x28, 0x46, 0xcd, 0xf7, 0xd5, 0xfc, 0xd2, 0xe7, + 0x18, 0x21, 0x31, 0x60, 0x4f, 0x43, 0x33, 0x4b, 0x18, 0x22, 0xd9, 0x19, + 0xf4, 0xe7, 0x4f, 0xf6, 0x27, 0x71, 0x00, 0x91, 0xc1, 0xe7, 0x38, 0xb5, + 0x0c, 0x46, 0xdb, 0xf7, 0x71, 0xfd, 0xff, 0x28, 0x18, 0xd0, 0xd4, 0x21, + 0x28, 0x4b, 0x48, 0x43, 0x00, 0x22, 0x1d, 0x18, 0x00, 0x92, 0x21, 0x46, + 0x28, 0x6a, 0xff, 0xf7, 0xf5, 0xfa, 0xe8, 0x6c, 0x69, 0x46, 0xeb, 0xf7, + 0xb7, 0xf9, 0x00, 0x98, 0x70, 0xb1, 0x25, 0x48, 0x4f, 0xf0, 0x80, 0x51, + 0x01, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x31, 0xbd, + 0x01, 0x22, 0x4f, 0xf6, 0x2b, 0x71, 0x01, 0x20, 0xe9, 0xf7, 0xc0, 0xf9, + 0x31, 0xbd, 0x10, 0xb5, 0x0c, 0x46, 0xdb, 0xf7, 0x4b, 0xfd, 0xd4, 0x22, + 0x16, 0x4b, 0x50, 0x43, 0x18, 0x44, 0x21, 0x46, 0x00, 0x6a, 0xbd, 0xe8, + 0x10, 0x40, 0xff, 0xf7, 0xd1, 0xba, 0x2d, 0xe9, 0xf0, 0x41, 0x04, 0x46, + 0x0f, 0x48, 0x40, 0x69, 0x0d, 0x46, 0x00, 0x26, 0x00, 0xb1, 0x05, 0x46, + 0x00, 0x27, 0xdf, 0xf8, 0x34, 0x80, 0x24, 0xfa, 0x07, 0xf0, 0xc0, 0x07, + 0x08, 0xd5, 0xff, 0xf7, 0x2b, 0xff, 0xff, 0x28, 0x0a, 0xd0, 0xd4, 0x21, + 0x48, 0x43, 0x40, 0x44, 0xc2, 0x69, 0x95, 0x61, 0x7f, 0x1c, 0x08, 0x2f, + 0xef, 0xd3, 0x30, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x4f, 0xf6, 0x2b, 0x76, + 0xf9, 0xe7, 0x00, 0x00, 0xfc, 0x3e, 0x00, 0x20, 0xd8, 0x52, 0x03, 0x20, + 0x28, 0x98, 0x04, 0x01, 0x00, 0x40, 0x00, 0x20, 0x48, 0x40, 0x03, 0x20, + 0x04, 0xed, 0x00, 0xe0, 0x41, 0x64, 0x63, 0x54, 0x78, 0x3a, 0x20, 0x63, + 0x68, 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x58, 0x2c, + 0x20, 0x25, 0x64, 0x20, 0x6d, 0x73, 0x0a, 0x00, 0x41, 0x64, 0x63, 0x54, + 0x78, 0x54, 0x72, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x65, + 0x72, 0x72, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x41, 0x64, 0x63, 0x54, + 0x78, 0x6c, 0x62, 0x5f, 0x43, 0x74, 0x72, 0x6c, 0x3a, 0x20, 0x63, 0x68, + 0x25, 0x64, 0x0a, 0x00, 0x41, 0x64, 0x63, 0x54, 0x78, 0x6c, 0x62, 0x5f, + 0x43, 0x74, 0x72, 0x6c, 0x3a, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x78, + 0x0a, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x43, 0x81, 0x46, 0x0f, 0x46, + 0x00, 0x25, 0x9f, 0x4c, 0xdf, 0xf8, 0x7c, 0x82, 0x29, 0xfa, 0x05, 0xf0, + 0xc0, 0x07, 0x20, 0xd5, 0x28, 0x46, 0xdb, 0xf7, 0xd3, 0xfc, 0x06, 0x46, + 0x00, 0x20, 0xb8, 0x55, 0x08, 0xf5, 0xd8, 0x71, 0x44, 0xf8, 0x36, 0x10, + 0x3a, 0x1d, 0x21, 0x1d, 0x02, 0xeb, 0x86, 0x20, 0x41, 0xf8, 0x36, 0x00, + 0x4f, 0xf4, 0x80, 0x61, 0xdf, 0xf7, 0x82, 0xff, 0x6c, 0x21, 0x01, 0xfb, + 0x06, 0xf0, 0x40, 0x44, 0xdf, 0xf7, 0x7c, 0xff, 0xf0, 0xb2, 0xe1, 0xf7, + 0x61, 0xfe, 0x01, 0x46, 0x28, 0x46, 0x00, 0xf0, 0x1f, 0xf9, 0x6d, 0x1c, + 0x08, 0x2d, 0xd7, 0xd3, 0xbd, 0xe8, 0xf1, 0x83, 0x80, 0xb5, 0x00, 0xf0, + 0x09, 0xf8, 0xe5, 0xf7, 0x68, 0xfc, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, + 0x03, 0xf8, 0xe5, 0xf7, 0x4d, 0xfc, 0x02, 0xbd, 0x00, 0x92, 0x0b, 0x46, + 0x02, 0x46, 0x40, 0x21, 0x82, 0x48, 0x70, 0x47, 0x2d, 0xe9, 0xf1, 0x4f, + 0x82, 0xb0, 0x00, 0x24, 0x89, 0x46, 0x01, 0x94, 0xe5, 0xf7, 0xe6, 0xfb, + 0x00, 0x26, 0xdf, 0xf8, 0xf8, 0xa1, 0xdf, 0xf8, 0xec, 0x81, 0x02, 0x98, + 0xf0, 0x40, 0xc1, 0x07, 0x71, 0xd5, 0x30, 0x46, 0xdb, 0xf7, 0x8a, 0xfc, + 0x83, 0x46, 0xbb, 0xf1, 0xff, 0x0f, 0x6a, 0xd0, 0x09, 0xeb, 0x8b, 0x20, + 0x07, 0x1d, 0x4f, 0xf4, 0x80, 0x61, 0x38, 0x46, 0xdf, 0xf7, 0x3e, 0xff, + 0x6c, 0x20, 0x00, 0xfb, 0x0b, 0xf0, 0x08, 0xeb, 0x00, 0x05, 0x28, 0x46, + 0xf5, 0xf7, 0xb7, 0xff, 0x01, 0x21, 0x30, 0x46, 0x03, 0xf0, 0x9d, 0xf8, + 0x01, 0xa9, 0x30, 0x46, 0xda, 0xf7, 0x38, 0xfc, 0xda, 0xf8, 0x0c, 0x00, + 0x01, 0x99, 0x88, 0x42, 0x30, 0x46, 0x06, 0xd2, 0x03, 0xf0, 0xbb, 0xf9, + 0x01, 0x21, 0x30, 0x46, 0x03, 0xf0, 0x5f, 0xfb, 0x07, 0xe0, 0x03, 0xf0, + 0xb4, 0xf9, 0x3a, 0x46, 0x08, 0xf5, 0xd8, 0x71, 0x30, 0x46, 0x03, 0xf0, + 0xe2, 0xf9, 0x04, 0x00, 0x2c, 0xd1, 0x01, 0x20, 0x09, 0xf8, 0x0b, 0x00, + 0x00, 0x20, 0x07, 0xeb, 0x80, 0x01, 0x05, 0xeb, 0x80, 0x03, 0x0a, 0x6b, + 0x5a, 0x64, 0x40, 0x1c, 0x03, 0x28, 0xf6, 0xd3, 0xb8, 0x6c, 0x28, 0x65, + 0xf9, 0x6c, 0x69, 0x65, 0x38, 0x6d, 0xa8, 0x65, 0x79, 0x6d, 0xe9, 0x65, + 0x05, 0xf1, 0x64, 0x01, 0xb8, 0x6d, 0x28, 0x66, 0x07, 0xf5, 0x77, 0x70, + 0x82, 0x88, 0x0a, 0x80, 0x00, 0x68, 0x48, 0x60, 0x00, 0x20, 0x07, 0xeb, + 0x80, 0x01, 0x05, 0xeb, 0x80, 0x02, 0x0b, 0x78, 0x13, 0x75, 0x40, 0x1c, + 0x4b, 0x78, 0x53, 0x75, 0x0c, 0x28, 0x89, 0x78, 0x91, 0x75, 0xf2, 0xd3, + 0x00, 0x94, 0x33, 0x46, 0x77, 0xa2, 0x06, 0x21, 0x03, 0x20, 0xdb, 0xf7, + 0x1c, 0xfd, 0x21, 0x46, 0x28, 0x46, 0xf5, 0xf7, 0x64, 0xff, 0x00, 0x21, + 0x30, 0x46, 0x03, 0xf0, 0x46, 0xf8, 0x76, 0x1c, 0x08, 0x2e, 0x86, 0xd3, + 0x20, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, 0xf8, 0xb5, 0x0c, 0x46, 0x15, 0x46, + 0x1f, 0x46, 0xf5, 0xf7, 0x67, 0xff, 0xdb, 0xf7, 0x0d, 0xfc, 0x00, 0x26, + 0xff, 0x28, 0x1a, 0xd0, 0x6c, 0x21, 0x36, 0x4a, 0x48, 0x43, 0x11, 0x18, + 0x1f, 0xb1, 0x02, 0x2f, 0x0b, 0xd0, 0x0a, 0xd3, 0x0b, 0xe0, 0x14, 0x27, + 0x28, 0x68, 0xb8, 0x42, 0x0a, 0xd3, 0x3a, 0x46, 0x20, 0x46, 0xcd, 0xf7, + 0x4d, 0xfb, 0x2f, 0x60, 0x09, 0xe0, 0x6c, 0x27, 0xf4, 0xe7, 0x4f, 0xf6, + 0x2a, 0x76, 0x04, 0xe0, 0x4f, 0xf6, 0x26, 0x76, 0x01, 0xe0, 0x4f, 0xf6, + 0x2b, 0x76, 0x30, 0x46, 0xf2, 0xbd, 0x2d, 0xe9, 0xf0, 0x47, 0x08, 0x9f, + 0x0a, 0x9e, 0x98, 0x46, 0xcc, 0xb2, 0x00, 0x25, 0x63, 0x1e, 0x3d, 0x60, + 0x03, 0xd0, 0x5b, 0x1e, 0x01, 0x2b, 0x06, 0xd9, 0x39, 0xe0, 0x41, 0xf2, + 0x04, 0x01, 0x30, 0x46, 0xdf, 0xf7, 0x98, 0xfe, 0x35, 0xe0, 0x00, 0x21, + 0x00, 0x23, 0x20, 0xfa, 0x03, 0xfc, 0x5f, 0xea, 0xcc, 0x7c, 0x44, 0xbf, + 0x49, 0x1c, 0x99, 0x46, 0x5b, 0x1c, 0x08, 0x2b, 0xf5, 0xd3, 0x01, 0x29, + 0x22, 0xd1, 0x92, 0x46, 0x48, 0x46, 0xdb, 0xf7, 0xc5, 0xfb, 0x02, 0x2c, + 0x06, 0xeb, 0x80, 0x26, 0x12, 0xd1, 0xb8, 0xf1, 0x30, 0x0f, 0x18, 0xbf, + 0x40, 0xf6, 0x0a, 0x15, 0x19, 0xd1, 0x30, 0x22, 0x51, 0x46, 0x30, 0x1d, + 0xcd, 0xf7, 0x0a, 0xfb, 0x01, 0x23, 0x32, 0x1d, 0x0c, 0x49, 0x48, 0x46, + 0x03, 0xf0, 0x22, 0xfb, 0x05, 0x46, 0x0c, 0xe0, 0x30, 0x22, 0x31, 0x1d, + 0x50, 0x46, 0xcd, 0xf7, 0xfd, 0xfa, 0x30, 0x20, 0x38, 0x60, 0x04, 0xe0, + 0x40, 0xf6, 0x0b, 0x15, 0x01, 0xe0, 0x4f, 0xf6, 0x27, 0x75, 0x28, 0x46, + 0xbd, 0xe8, 0xf0, 0x87, 0xac, 0x75, 0x02, 0x20, 0x34, 0x8c, 0x00, 0x20, + 0xe4, 0x8d, 0x00, 0x20, 0x68, 0x8b, 0x00, 0x20, 0x7f, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0xc0, 0xb2, 0xe1, 0xf7, 0x38, 0xfd, 0x06, 0x46, 0x02, 0xa9, + 0x20, 0x46, 0xda, 0xf7, 0x55, 0xfb, 0xae, 0x42, 0x4b, 0xd1, 0x02, 0xa9, + 0x20, 0x46, 0x03, 0xf0, 0xf9, 0xf8, 0x00, 0x28, 0x3a, 0xd0, 0x1b, 0x22, + 0x06, 0x21, 0x20, 0x46, 0x02, 0xf0, 0x38, 0xff, 0x1b, 0x22, 0x07, 0x21, + 0x20, 0x46, 0x02, 0xf0, 0x33, 0xff, 0x02, 0x98, 0x03, 0xa9, 0x03, 0xf0, + 0xae, 0xfe, 0x05, 0x46, 0x0d, 0xf1, 0x05, 0x00, 0x00, 0x90, 0x01, 0xab, + 0x03, 0x98, 0x0d, 0xf1, 0x06, 0x02, 0x0d, 0xf1, 0x07, 0x01, 0x03, 0xf0, + 0xcb, 0xfe, 0x9d, 0xf8, 0x06, 0x20, 0x06, 0x21, 0x00, 0xf0, 0x29, 0xf8, + 0x9d, 0xf8, 0x07, 0x20, 0x00, 0xf0, 0x24, 0xf8, 0x9d, 0xf8, 0x05, 0x20, + 0x00, 0x21, 0x00, 0xf0, 0x20, 0xf8, 0x9d, 0xf8, 0x04, 0x00, 0x40, 0xea, + 0x80, 0x01, 0xc9, 0xb2, 0x20, 0x46, 0x02, 0xf0, 0x5e, 0xff, 0x2a, 0x46, + 0x06, 0x21, 0x20, 0x46, 0x02, 0xf0, 0xd0, 0xfe, 0x2a, 0x46, 0x07, 0x21, + 0x20, 0x46, 0x02, 0xf0, 0xcb, 0xfe, 0x7f, 0xbd, 0x07, 0x22, 0x00, 0xf0, + 0x09, 0xf8, 0x00, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x06, 0xf8, 0x00, 0x21, + 0x20, 0x46, 0x02, 0xf0, 0x48, 0xff, 0x7f, 0xbd, 0x08, 0x21, 0x20, 0x46, + 0x02, 0xf0, 0x29, 0xbf, 0x54, 0x78, 0x48, 0x52, 0x4d, 0x3a, 0x20, 0x63, + 0x68, 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x58, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf3, 0xc7, 0x52, 0x7e, 0x3a, 0x1d, 0xdd, + 0xc1, 0x17, 0x00, 0x02, 0xd2, 0xf1, 0x20, 0x02, 0x40, 0xf0, 0x00, 0x40, + 0x03, 0xdd, 0xd0, 0x40, 0x08, 0x44, 0x48, 0x40, 0x70, 0x47, 0x20, 0x32, + 0x0a, 0xdd, 0x20, 0xfa, 0x02, 0xf3, 0xc2, 0xf1, 0x20, 0x02, 0x90, 0x40, + 0x48, 0x40, 0x4b, 0x40, 0x40, 0x1a, 0x63, 0xeb, 0x01, 0x01, 0x70, 0x47, + 0x41, 0x32, 0x03, 0xd0, 0xc8, 0x43, 0x80, 0xf0, 0x00, 0x41, 0x70, 0x47, + 0x00, 0x20, 0x00, 0x21, 0x70, 0x47, 0x00, 0x00, 0x10, 0xee, 0x10, 0x0a, + 0xf5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x0b, 0xd6, 0x18, 0xb9, + 0x04, 0xbf, 0xb0, 0xee, 0x60, 0x0a, 0x06, 0xe0, 0xf4, 0xee, 0x40, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0xb8, 0xbf, 0xb0, 0xee, 0x60, 0x0a, 0x70, 0x47, + 0xcb, 0x17, 0xc0, 0x18, 0x59, 0x41, 0x58, 0x40, 0x59, 0x40, 0xdb, 0x07, + 0xb1, 0xb1, 0xb1, 0xfa, 0x81, 0xf2, 0x41, 0x40, 0x90, 0x40, 0xc2, 0xf1, + 0x20, 0x02, 0x61, 0xfa, 0x02, 0xf1, 0x81, 0xea, 0x00, 0x00, 0x18, 0xbf, + 0x40, 0xf0, 0x01, 0x00, 0x02, 0xf1, 0x9d, 0x01, 0x02, 0x06, 0x43, 0xea, + 0xc1, 0x51, 0x72, 0xf1, 0x00, 0x42, 0x41, 0xeb, 0x10, 0x20, 0x70, 0x47, + 0x58, 0xb1, 0xb0, 0xfa, 0x80, 0xf2, 0x90, 0x40, 0xc2, 0xf1, 0x9d, 0x02, + 0x01, 0x06, 0x43, 0xea, 0xc2, 0x52, 0x71, 0xf1, 0x00, 0x41, 0x42, 0xeb, + 0x10, 0x20, 0x70, 0x47, 0xc2, 0x6b, 0x52, 0x1e, 0x91, 0x42, 0x3a, 0xbf, + 0x40, 0x6b, 0x09, 0x18, 0x81, 0x6b, 0x08, 0x46, 0x70, 0x47, 0x00, 0x00, + 0x2d, 0xe9, 0xf0, 0x41, 0x0c, 0x46, 0x04, 0xf1, 0x28, 0x05, 0x8a, 0xb0, + 0x80, 0x46, 0xe8, 0x68, 0x29, 0x7e, 0xcd, 0xf8, 0x24, 0x80, 0x00, 0x28, + 0xaa, 0x78, 0x08, 0x92, 0x0c, 0xbf, 0x4f, 0xf4, 0x80, 0x70, 0x00, 0x20, + 0x49, 0x1e, 0x89, 0x41, 0x00, 0x23, 0x07, 0x93, 0xc9, 0x0f, 0x27, 0x7f, + 0x06, 0x97, 0x03, 0x23, 0x2a, 0x6a, 0x02, 0x90, 0x00, 0x27, 0x05, 0x92, + 0x04, 0x93, 0x03, 0x97, 0x01, 0x91, 0xb7, 0xee, 0x00, 0x1a, 0xa8, 0x7e, + 0x00, 0x90, 0x9f, 0xed, 0x6c, 0x0a, 0x6b, 0x7e, 0xa8, 0x68, 0xd4, 0xed, + 0x08, 0x0a, 0x00, 0x22, 0x01, 0x21, 0xf9, 0xf7, 0x89, 0xfc, 0x08, 0xf1, + 0x20, 0x01, 0x02, 0x91, 0x01, 0x97, 0x00, 0x21, 0x6a, 0x78, 0x00, 0x92, + 0xa3, 0x8c, 0x2a, 0x78, 0xa8, 0x68, 0xf9, 0xf7, 0x51, 0xfb, 0x28, 0x7e, + 0x18, 0xb3, 0x61, 0x69, 0xa8, 0x68, 0xf9, 0xf7, 0xf5, 0xfb, 0x28, 0x77, + 0x08, 0xf1, 0x30, 0x01, 0x02, 0x91, 0x01, 0x90, 0x00, 0x97, 0xe3, 0x8c, + 0x2a, 0x78, 0xa8, 0x68, 0x01, 0x21, 0xf9, 0xf7, 0x3f, 0xfb, 0x28, 0x7e, + 0x88, 0xb1, 0x08, 0xf1, 0x88, 0x01, 0x07, 0x91, 0x06, 0x97, 0x01, 0x21, + 0x05, 0x97, 0x04, 0x97, 0x03, 0x91, 0x02, 0x97, 0x01, 0x91, 0x00, 0x91, + 0x63, 0x69, 0xa8, 0x68, 0x00, 0x22, 0x08, 0xf1, 0x30, 0x01, 0xf9, 0xf7, + 0x44, 0xfb, 0x00, 0x26, 0x1e, 0xe0, 0x04, 0xeb, 0x80, 0x02, 0x01, 0x21, + 0x53, 0x68, 0x22, 0x18, 0x10, 0x7c, 0x08, 0xb1, 0x01, 0x20, 0x5b, 0x42, + 0xfa, 0xb2, 0x4f, 0xf0, 0x18, 0x0c, 0x1c, 0xfb, 0x02, 0xf2, 0x42, 0x44, + 0x40, 0x32, 0x07, 0x92, 0x06, 0x96, 0x05, 0x90, 0x04, 0x96, 0x01, 0x22, + 0x03, 0x92, 0x02, 0x96, 0x01, 0x91, 0x00, 0x91, 0x08, 0xf1, 0x20, 0x01, + 0xa8, 0x68, 0xf9, 0xf7, 0x24, 0xfb, 0x7f, 0x1c, 0x69, 0x69, 0xf8, 0xb2, + 0xc9, 0xb2, 0x88, 0x42, 0x0a, 0xd2, 0xf9, 0xb2, 0x20, 0x46, 0xff, 0xf7, + 0x6b, 0xff, 0x21, 0x78, 0x88, 0x42, 0xd4, 0xd3, 0x00, 0x21, 0x00, 0x20, + 0x00, 0x23, 0xd9, 0xe7, 0xa8, 0x68, 0x41, 0x46, 0x0a, 0xb0, 0xbd, 0xe8, + 0xf0, 0x41, 0xf9, 0xf7, 0x83, 0xbc, 0x00, 0x00, 0xf8, 0xb5, 0x0d, 0x46, + 0x2d, 0xed, 0x02, 0x8b, 0x04, 0x46, 0x05, 0xf1, 0x2c, 0x07, 0xaa, 0xb0, + 0xc0, 0xb2, 0x00, 0x21, 0x05, 0xf5, 0xbc, 0x76, 0x78, 0x60, 0x39, 0x70, + 0xb2, 0x61, 0x01, 0x20, 0x38, 0x75, 0xb9, 0x60, 0x03, 0x20, 0x38, 0x61, + 0x02, 0x21, 0xf9, 0x60, 0x28, 0x78, 0x03, 0x28, 0x94, 0xbf, 0x00, 0x20, + 0x01, 0x20, 0x78, 0x75, 0x00, 0x20, 0xb8, 0x75, 0x29, 0x78, 0x03, 0x29, + 0x98, 0xbf, 0x01, 0x20, 0xf8, 0x75, 0xa8, 0x69, 0xb0, 0xf5, 0x80, 0x4f, + 0x00, 0xee, 0x10, 0x0a, 0x38, 0xbf, 0x9f, 0xed, 0x1e, 0x8a, 0x11, 0xd3, + 0xf8, 0xee, 0x40, 0x8a, 0x9f, 0xed, 0x1c, 0x0a, 0x88, 0xee, 0x80, 0x0a, + 0xea, 0xf7, 0xe8, 0xfa, 0xbc, 0xee, 0xc0, 0x8a, 0xb8, 0xee, 0x48, 0x0a, + 0x88, 0xee, 0x80, 0x0a, 0xea, 0xf7, 0xe0, 0xfa, 0xbc, 0xee, 0xc0, 0x0a, + 0x87, 0xed, 0x08, 0x8a, 0x87, 0xed, 0x07, 0x0a, 0x00, 0x20, 0xc5, 0xf8, + 0xf4, 0x00, 0x48, 0x21, 0x05, 0xf5, 0x80, 0x70, 0xde, 0xf7, 0x56, 0xff, + 0x30, 0x21, 0x05, 0xf5, 0xa4, 0x70, 0xde, 0xf7, 0x51, 0xff, 0x00, 0x20, + 0xc6, 0xe9, 0x00, 0x00, 0xc6, 0xe9, 0x02, 0x00, 0xc6, 0xe9, 0x04, 0x00, + 0x29, 0x46, 0x68, 0x46, 0xff, 0xf7, 0x0c, 0xff, 0x2b, 0x46, 0x6a, 0x46, + 0x00, 0x21, 0x20, 0x46, 0xfa, 0xf7, 0x75, 0xf8, 0x2a, 0xb0, 0xbd, 0xec, + 0x02, 0x8b, 0xf2, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0xfc, 0x7f, 0x46, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, + 0x0e, 0x46, 0x88, 0xb0, 0x00, 0x21, 0xfa, 0xf7, 0xb7, 0xfa, 0x00, 0x28, + 0x83, 0x46, 0x40, 0xf0, 0xc5, 0x80, 0x06, 0xf5, 0xbc, 0x7a, 0xda, 0xf8, + 0x18, 0x90, 0xd6, 0xf8, 0xf4, 0x00, 0xc9, 0xf8, 0x04, 0x00, 0x06, 0xf1, + 0x28, 0x04, 0x31, 0x78, 0x89, 0xf8, 0x08, 0x10, 0x06, 0xa9, 0x20, 0x78, + 0x03, 0x91, 0x05, 0xaa, 0x04, 0xab, 0x02, 0x92, 0x01, 0x93, 0x02, 0x46, + 0x21, 0x6a, 0x00, 0x91, 0x00, 0x27, 0xf3, 0x8c, 0xb1, 0x8c, 0xf9, 0xf7, + 0x53, 0xfd, 0x94, 0xed, 0x09, 0x0a, 0xdd, 0xed, 0x04, 0x0a, 0x9d, 0xed, + 0x06, 0x1a, 0xb8, 0xee, 0x40, 0x0a, 0xc0, 0xee, 0x80, 0x0a, 0xcd, 0xed, + 0x04, 0x0a, 0x81, 0xee, 0x00, 0x1a, 0xdd, 0xed, 0x05, 0x0a, 0x8d, 0xed, + 0x06, 0x1a, 0x80, 0xee, 0x80, 0x0a, 0x8d, 0xed, 0x05, 0x0a, 0xbf, 0xee, + 0x00, 0x8a, 0x0b, 0xe0, 0x05, 0xeb, 0x80, 0x01, 0x40, 0x1c, 0x91, 0xed, + 0x03, 0x0a, 0x20, 0xee, 0x08, 0x0a, 0x81, 0xed, 0x03, 0x0a, 0xb8, 0x42, + 0xf4, 0xd3, 0x7f, 0x1c, 0x30, 0x78, 0x87, 0x42, 0x1c, 0xd2, 0x0c, 0x21, + 0x79, 0x43, 0x4f, 0xf0, 0x00, 0x08, 0x09, 0xeb, 0x01, 0x05, 0x10, 0xe0, + 0x18, 0x22, 0x7a, 0x43, 0x32, 0x44, 0x02, 0xeb, 0xc8, 0x03, 0x9d, 0xed, + 0x04, 0x0a, 0xd3, 0xe9, 0x40, 0x01, 0xf9, 0xf7, 0x85, 0xfc, 0x05, 0xeb, + 0x88, 0x02, 0x08, 0xf1, 0x01, 0x08, 0x82, 0xed, 0x03, 0x0a, 0x30, 0x78, + 0x80, 0x45, 0xeb, 0xd3, 0x00, 0x20, 0xdc, 0xe7, 0x35, 0x46, 0x00, 0x27, + 0x4e, 0x46, 0x20, 0xe0, 0x05, 0xeb, 0x07, 0x10, 0x00, 0xf5, 0xa4, 0x78, + 0x9d, 0xed, 0x05, 0x0a, 0xd8, 0xe9, 0x00, 0x01, 0x06, 0xeb, 0xc7, 0x09, + 0xf9, 0xf7, 0x6a, 0xfc, 0x89, 0xed, 0x0c, 0x0a, 0xd8, 0xe9, 0x02, 0x01, + 0x9d, 0xed, 0x05, 0x0a, 0xf9, 0xf7, 0x62, 0xfc, 0x20, 0xee, 0x08, 0x0a, + 0x89, 0xed, 0x0d, 0x0a, 0x23, 0x7f, 0xa0, 0x68, 0x09, 0xf1, 0x34, 0x02, + 0x09, 0xf1, 0x30, 0x01, 0xf9, 0xf7, 0xc0, 0xfa, 0x7f, 0x1c, 0x28, 0x78, + 0x87, 0x42, 0xdb, 0xd3, 0xda, 0xe9, 0x00, 0x01, 0x9d, 0xed, 0x04, 0x0a, + 0xf9, 0xf7, 0x4c, 0xfc, 0x86, 0xed, 0x12, 0x0a, 0xda, 0xe9, 0x02, 0x01, + 0x9d, 0xed, 0x04, 0x0a, 0xf9, 0xf7, 0x44, 0xfc, 0x86, 0xed, 0x13, 0x0a, + 0xda, 0xe9, 0x04, 0x01, 0x9d, 0xed, 0x06, 0x0a, 0xf9, 0xf7, 0x3c, 0xfc, + 0x86, 0xed, 0x14, 0x0a, 0xa0, 0x68, 0xda, 0xf7, 0x4d, 0xff, 0x00, 0xee, + 0x10, 0x0a, 0xa0, 0x68, 0xb8, 0xee, 0x40, 0x8a, 0x00, 0x21, 0xf9, 0xf7, + 0xd6, 0xf8, 0xd5, 0xed, 0x01, 0x0a, 0xf8, 0xee, 0xe0, 0x0a, 0xc0, 0xee, + 0x88, 0x0a, 0xc6, 0xed, 0x00, 0x0a, 0x86, 0xed, 0x15, 0x8a, 0x00, 0xee, + 0x10, 0x0a, 0xa8, 0x8c, 0x01, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, + 0xb8, 0xee, 0x41, 0x1a, 0x80, 0xee, 0x01, 0x1a, 0x88, 0xee, 0x01, 0x1a, + 0x86, 0xed, 0x16, 0x1a, 0x08, 0xb0, 0x58, 0x46, 0xbd, 0xec, 0x02, 0x8b, + 0xbd, 0xe8, 0xf2, 0x8f, 0xf8, 0xf7, 0xb2, 0xbf, 0x2d, 0xe9, 0xfe, 0x4f, + 0x0f, 0x46, 0x91, 0x46, 0x4f, 0xf4, 0x80, 0x72, 0x49, 0x46, 0x01, 0x20, + 0xf9, 0xf7, 0x4f, 0xfb, 0x07, 0xf1, 0x2c, 0x04, 0x00, 0x28, 0x20, 0x70, + 0x07, 0xf1, 0xd8, 0x08, 0x06, 0xd1, 0x49, 0x46, 0x01, 0x20, 0xf9, 0xf7, + 0x66, 0xfb, 0x10, 0xb9, 0x03, 0x20, 0x20, 0x70, 0xd7, 0xe0, 0xa0, 0x62, + 0x20, 0x7d, 0xf0, 0xb1, 0x00, 0x26, 0x17, 0xe0, 0xf1, 0xb2, 0x38, 0x46, + 0xff, 0xf7, 0xf6, 0xfd, 0x39, 0x78, 0x81, 0x42, 0x0f, 0xd3, 0x07, 0xf1, + 0xb0, 0x02, 0x07, 0xf1, 0xa8, 0x01, 0x02, 0xeb, 0x00, 0x12, 0x01, 0xeb, + 0x00, 0x10, 0x01, 0x92, 0x00, 0x90, 0x03, 0x23, 0xf2, 0xb2, 0x49, 0x46, + 0x01, 0x20, 0xf9, 0xf7, 0x5f, 0xfb, 0x76, 0x1c, 0x21, 0x69, 0xf0, 0xb2, + 0xc9, 0xb2, 0x88, 0x42, 0xe2, 0xd3, 0x00, 0x25, 0x18, 0x26, 0x27, 0xe0, + 0x5f, 0xfa, 0x8b, 0xf1, 0x38, 0x46, 0xff, 0xf7, 0xd5, 0xfd, 0x39, 0x78, + 0x88, 0x42, 0x16, 0xd2, 0x07, 0xeb, 0xca, 0x02, 0x06, 0xfb, 0x00, 0xf3, + 0x1a, 0x44, 0x02, 0xf1, 0x60, 0x01, 0x06, 0xfb, 0x0a, 0xfc, 0x01, 0x91, + 0xbc, 0x44, 0x0c, 0xeb, 0xc0, 0x00, 0x00, 0xf1, 0x60, 0x01, 0x00, 0x91, + 0x5f, 0xfa, 0x8b, 0xf3, 0xea, 0xb2, 0x49, 0x46, 0x01, 0x20, 0xf9, 0xf7, + 0x37, 0xfb, 0x0b, 0xf1, 0x01, 0x0b, 0x21, 0x69, 0x5f, 0xfa, 0x8b, 0xf0, + 0xc9, 0xb2, 0x88, 0x42, 0xd8, 0xd3, 0x6d, 0x1c, 0x21, 0x69, 0xe8, 0xb2, + 0xc9, 0xb2, 0x88, 0x42, 0x15, 0xd2, 0xe9, 0xb2, 0x38, 0x46, 0xff, 0xf7, + 0xa9, 0xfd, 0x82, 0x46, 0x38, 0x78, 0x82, 0x45, 0xf1, 0xd2, 0xea, 0xb2, + 0x49, 0x46, 0x01, 0x20, 0xf9, 0xf7, 0x07, 0xfb, 0x07, 0xf1, 0x60, 0x02, + 0x02, 0xeb, 0x4a, 0x13, 0x05, 0xf1, 0x01, 0x0b, 0xc3, 0xe9, 0x00, 0x01, + 0xdd, 0xe7, 0x20, 0x7d, 0x30, 0xb1, 0x03, 0x22, 0x49, 0x46, 0x01, 0x20, + 0xf9, 0xf7, 0xf7, 0xfa, 0xc8, 0xe9, 0x04, 0x01, 0x07, 0xf1, 0xe0, 0x00, + 0x00, 0x90, 0x43, 0x46, 0x00, 0x22, 0x49, 0x46, 0x01, 0x20, 0xf9, 0xf7, + 0x54, 0xfb, 0xe0, 0x7d, 0x00, 0x28, 0x5a, 0xd0, 0x4f, 0xf0, 0x00, 0x09, + 0x13, 0xe0, 0x06, 0xfb, 0x09, 0xf0, 0x38, 0x18, 0x00, 0xeb, 0xcc, 0x0e, + 0xde, 0xe9, 0x40, 0x01, 0xde, 0xe9, 0x18, 0x23, 0x80, 0x18, 0x59, 0x41, + 0xce, 0xe9, 0x40, 0x01, 0x0c, 0xf1, 0x01, 0x0c, 0x38, 0x78, 0x84, 0x45, + 0xed, 0xd3, 0x09, 0xf1, 0x01, 0x09, 0x38, 0x78, 0x81, 0x45, 0x4f, 0xf0, + 0x00, 0x0c, 0x18, 0xd2, 0xf4, 0xe7, 0x07, 0xeb, 0x0c, 0x10, 0x00, 0xf1, + 0xa8, 0x05, 0x00, 0xf5, 0xa4, 0x7e, 0xd5, 0xe9, 0x00, 0x01, 0xde, 0xe9, + 0x00, 0x23, 0x10, 0x18, 0x59, 0x41, 0xce, 0xe9, 0x00, 0x01, 0xde, 0xe9, + 0x02, 0x62, 0xd5, 0xe9, 0x02, 0x01, 0x30, 0x18, 0x51, 0x41, 0xce, 0xe9, + 0x02, 0x01, 0x0c, 0xf1, 0x01, 0x0c, 0x38, 0x78, 0x84, 0x45, 0xe4, 0xd3, + 0x07, 0xf5, 0xbc, 0x70, 0xd8, 0xe9, 0x00, 0x69, 0xd0, 0xe9, 0x00, 0x23, + 0x96, 0x19, 0x43, 0xeb, 0x09, 0x09, 0xc0, 0xe9, 0x00, 0x69, 0xd0, 0xe9, + 0x02, 0xab, 0xd8, 0xe9, 0x02, 0x23, 0x1a, 0xeb, 0x02, 0x02, 0x4b, 0xeb, + 0x03, 0x03, 0xc0, 0xe9, 0x02, 0x23, 0xd0, 0xe9, 0x04, 0x61, 0xd8, 0xe9, + 0x04, 0x23, 0xb2, 0x18, 0x4b, 0x41, 0xc0, 0xe9, 0x04, 0x23, 0xd8, 0xf8, + 0x1c, 0x10, 0xa0, 0x6a, 0x41, 0x18, 0xc8, 0xf8, 0x1c, 0x10, 0x39, 0x78, + 0xe0, 0x68, 0x49, 0x1e, 0x88, 0x42, 0x02, 0xd2, 0x40, 0x1c, 0xe0, 0x60, + 0x1e, 0xe0, 0xa1, 0x68, 0x20, 0x69, 0x41, 0x18, 0xa1, 0x60, 0x3a, 0x78, + 0x91, 0x42, 0x10, 0xd3, 0x01, 0x20, 0x20, 0x75, 0x00, 0x21, 0xa1, 0x60, + 0x03, 0x20, 0x20, 0x61, 0x02, 0x21, 0xe1, 0x60, 0x38, 0x78, 0x03, 0x28, + 0x94, 0xbf, 0x00, 0x20, 0x01, 0x20, 0x60, 0x75, 0x00, 0x20, 0xa0, 0x75, + 0x0a, 0xe0, 0x00, 0x21, 0x21, 0x75, 0x04, 0x20, 0xa1, 0x68, 0x20, 0x61, + 0xc9, 0x1c, 0xe1, 0x60, 0x00, 0x20, 0x01, 0x21, 0x60, 0x75, 0xa1, 0x75, + 0x39, 0x78, 0xe0, 0x68, 0x88, 0x42, 0x07, 0xd2, 0xa2, 0x68, 0x20, 0x69, + 0x82, 0x18, 0x8a, 0x42, 0x80, 0x41, 0xc0, 0x43, 0xc0, 0x0f, 0x00, 0xe0, + 0x01, 0x20, 0xe0, 0x75, 0xb9, 0x69, 0xd8, 0xf8, 0x1c, 0x00, 0x88, 0x42, + 0x07, 0xd2, 0x20, 0x78, 0x28, 0xb9, 0x02, 0x98, 0x39, 0x46, 0xff, 0xf7, + 0xed, 0xfc, 0x00, 0x20, 0x00, 0xe0, 0x01, 0x20, 0xbd, 0xe8, 0xfe, 0x8f, + 0x0a, 0x46, 0x00, 0x21, 0xf9, 0xf7, 0x25, 0xbe, 0x00, 0x21, 0xf9, 0xf7, + 0x34, 0xbe, 0x00, 0x00, 0xef, 0xf3, 0x09, 0x80, 0xbf, 0xf3, 0x6f, 0x8f, + 0x26, 0x4b, 0x1a, 0x68, 0x1e, 0xf0, 0x10, 0x0f, 0x08, 0xbf, 0x20, 0xed, + 0x10, 0x8a, 0x20, 0xe9, 0xf0, 0x4f, 0x10, 0x60, 0x09, 0xb4, 0x4f, 0xf0, + 0x30, 0x00, 0x80, 0xf3, 0x11, 0x88, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, + 0x6f, 0x8f, 0xe9, 0xf7, 0x97, 0xf9, 0x4f, 0xf0, 0x00, 0x00, 0x80, 0xf3, + 0x11, 0x88, 0x09, 0xbc, 0x19, 0x68, 0x08, 0x68, 0xb0, 0xe8, 0xf0, 0x4f, + 0x1e, 0xf0, 0x10, 0x0f, 0x08, 0xbf, 0xb0, 0xec, 0x10, 0x8a, 0x80, 0xf3, + 0x09, 0x88, 0xbf, 0xf3, 0x6f, 0x8f, 0x70, 0x47, 0x12, 0x4b, 0x19, 0x68, + 0x08, 0x68, 0xb0, 0xe8, 0xf0, 0x4f, 0x80, 0xf3, 0x09, 0x88, 0xbf, 0xf3, + 0x6f, 0x8f, 0x4f, 0xf0, 0x00, 0x00, 0x80, 0xf3, 0x11, 0x88, 0x70, 0x47, + 0x0c, 0x48, 0x00, 0x68, 0x00, 0x68, 0x80, 0xf3, 0x08, 0x88, 0x4f, 0xf0, + 0x00, 0x00, 0x80, 0xf3, 0x14, 0x88, 0x62, 0xb6, 0x61, 0xb6, 0xbf, 0xf3, + 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x00, 0xdf, 0xdf, 0xf8, 0x14, 0x00, + 0x01, 0x68, 0x41, 0xf4, 0x70, 0x01, 0x01, 0x60, 0x70, 0x47, 0x00, 0x00, + 0x68, 0x66, 0x02, 0x20, 0x08, 0xed, 0x00, 0xe0, 0x88, 0xed, 0x00, 0xe0, + 0x80, 0xb5, 0x00, 0xb9, 0x06, 0xa0, 0x05, 0x49, 0x0b, 0x68, 0x1b, 0xb1, + 0x22, 0x22, 0x00, 0x21, 0x98, 0x47, 0x01, 0xe0, 0xcc, 0xf7, 0xb7, 0xf8, + 0x22, 0x20, 0x02, 0xbd, 0xa0, 0x77, 0x02, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x72, 0x3a, 0x20, 0x62, 0x61, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x00, 0x10, 0xb5, 0x14, 0x46, 0x00, 0xf0, 0x02, 0xf8, + 0x22, 0x60, 0x10, 0xbd, 0xc1, 0xf3, 0x0a, 0x53, 0x43, 0xb1, 0x4a, 0x00, + 0x12, 0xf5, 0x00, 0x1f, 0x28, 0xd2, 0xa3, 0xf2, 0xfe, 0x32, 0xa1, 0xeb, + 0x02, 0x51, 0x70, 0x47, 0x50, 0xea, 0x41, 0x0c, 0x20, 0xd0, 0x01, 0xf0, + 0x00, 0x4c, 0x31, 0xea, 0x0c, 0x01, 0xb1, 0xfa, 0x81, 0xf2, 0x04, 0xbf, + 0xb0, 0xfa, 0x80, 0xf3, 0xd2, 0x18, 0x0b, 0x3a, 0xb2, 0xf1, 0x20, 0x03, + 0x2c, 0xbf, 0x00, 0xfa, 0x03, 0xf1, 0x91, 0x40, 0x41, 0xea, 0x0c, 0x01, + 0x3e, 0xbf, 0xc2, 0xf1, 0x20, 0x0c, 0x20, 0xfa, 0x0c, 0xf3, 0x19, 0x43, + 0x90, 0x40, 0x52, 0x42, 0x40, 0xf2, 0xfd, 0x33, 0xd2, 0x1a, 0x01, 0xeb, + 0x03, 0x51, 0x70, 0x47, 0x00, 0x22, 0x70, 0x47, 0xf0, 0xb5, 0x40, 0xf2, + 0xff, 0x75, 0x81, 0xea, 0x03, 0x0c, 0x0c, 0xf0, 0x00, 0x4c, 0x15, 0xea, + 0x11, 0x54, 0x1d, 0xbf, 0x15, 0xea, 0x13, 0x57, 0xac, 0x42, 0xaf, 0x42, + 0xe5, 0xe0, 0xbc, 0x41, 0xc1, 0xf3, 0x13, 0x01, 0xc3, 0xf3, 0x13, 0x03, + 0x80, 0x1a, 0x99, 0x41, 0x43, 0xf4, 0x80, 0x13, 0x04, 0xd2, 0x64, 0x1e, + 0x40, 0x00, 0x49, 0x41, 0x80, 0x18, 0x59, 0x41, 0xc9, 0x02, 0x41, 0xea, + 0x50, 0x51, 0xb1, 0xfb, 0xf3, 0xf6, 0x03, 0xfb, 0x16, 0x11, 0xa2, 0xfb, + 0x06, 0x75, 0xd7, 0xeb, 0xc0, 0x20, 0xa9, 0x41, 0x02, 0xd2, 0x76, 0x1e, + 0x80, 0x18, 0x59, 0x41, 0xc9, 0x02, 0x41, 0xea, 0x50, 0x51, 0xb1, 0xfb, + 0xf3, 0xfe, 0x03, 0xfb, 0x1e, 0x11, 0xa2, 0xfb, 0x0e, 0x75, 0xd7, 0xeb, + 0xc0, 0x20, 0xa9, 0x41, 0x03, 0xd2, 0xae, 0xf1, 0x01, 0x0e, 0x80, 0x18, + 0x59, 0x41, 0x89, 0x02, 0x41, 0xea, 0x90, 0x51, 0x76, 0x05, 0x46, 0xea, + 0x8e, 0x2e, 0xb1, 0xfb, 0xf3, 0xf6, 0x03, 0xfb, 0x16, 0x11, 0xa2, 0xfb, + 0x06, 0x75, 0xd7, 0xeb, 0x80, 0x20, 0xa9, 0x41, 0x02, 0xd2, 0x76, 0x1e, + 0x80, 0x18, 0x59, 0x41, 0xc9, 0x02, 0x41, 0xea, 0x50, 0x51, 0x4e, 0xea, + 0x06, 0x0e, 0xb1, 0xfb, 0xf3, 0xf6, 0x03, 0xfb, 0x16, 0x11, 0xa2, 0xfb, + 0x06, 0x75, 0xd7, 0xeb, 0xc0, 0x20, 0xa9, 0x41, 0x02, 0xd2, 0x76, 0x1e, + 0x80, 0x18, 0x59, 0x41, 0xc9, 0x02, 0x41, 0xea, 0x50, 0x51, 0xb1, 0xfb, + 0xf3, 0xf7, 0x03, 0xfb, 0x17, 0x11, 0xa2, 0xfb, 0x07, 0x35, 0xd3, 0xeb, + 0xc0, 0x20, 0xa9, 0x41, 0x67, 0xf1, 0x00, 0x07, 0x0c, 0xbf, 0x00, 0x42, + 0x47, 0xf0, 0x01, 0x07, 0x66, 0xf3, 0xd5, 0x27, 0x4f, 0xea, 0x1e, 0x31, + 0xb8, 0x08, 0x14, 0xf5, 0x80, 0x64, 0x12, 0xdd, 0xbd, 0x07, 0x75, 0xf1, + 0x00, 0x42, 0x50, 0xeb, 0x0e, 0x50, 0x51, 0xeb, 0x04, 0x51, 0x11, 0xf5, + 0x80, 0x1f, 0x5c, 0xbf, 0x41, 0xea, 0x0c, 0x01, 0xf0, 0xbd, 0x4c, 0xf0, + 0x7f, 0x61, 0x41, 0xf0, 0xe0, 0x41, 0x00, 0x20, 0xf0, 0xbd, 0xbd, 0x07, + 0x6d, 0x08, 0x40, 0xea, 0x0e, 0x50, 0x41, 0xf4, 0x80, 0x11, 0xd4, 0xf1, + 0x01, 0x04, 0xb4, 0xf1, 0x20, 0x06, 0x0a, 0xda, 0xc4, 0xf1, 0x20, 0x06, + 0x02, 0x00, 0xe0, 0x40, 0x01, 0xfa, 0x06, 0xf3, 0xe1, 0x40, 0x18, 0x43, + 0xb2, 0x40, 0x15, 0x43, 0x0e, 0xe0, 0x34, 0x2c, 0x13, 0xdc, 0xc6, 0xf1, + 0x20, 0x04, 0x45, 0xea, 0x40, 0x05, 0x6d, 0x08, 0x20, 0xfa, 0x06, 0xf2, + 0x15, 0x43, 0x21, 0xfa, 0x06, 0xf0, 0xa1, 0x40, 0x0d, 0x43, 0x00, 0x21, + 0x75, 0xf1, 0x00, 0x42, 0x50, 0xf1, 0x00, 0x00, 0x51, 0xeb, 0x0c, 0x01, + 0xf0, 0xbd, 0x00, 0x20, 0x5f, 0xea, 0x0c, 0x01, 0xf0, 0xbd, 0xcf, 0xb9, + 0x92, 0x18, 0x5b, 0x41, 0xb3, 0xfa, 0x83, 0xf7, 0x04, 0xbf, 0xb2, 0xfa, + 0x82, 0xf6, 0xbf, 0x19, 0x0b, 0x3f, 0xb7, 0xf1, 0x20, 0x06, 0x2f, 0xbf, + 0x02, 0xfa, 0x06, 0xf3, 0xbb, 0x40, 0xc7, 0xf1, 0x20, 0x06, 0x22, 0xfa, + 0x06, 0xf6, 0x38, 0xbf, 0x33, 0x43, 0xba, 0x40, 0x1c, 0xb1, 0xe4, 0x19, + 0x64, 0x1e, 0x33, 0xe7, 0x7f, 0x42, 0x31, 0xf0, 0x00, 0x41, 0xb1, 0xfa, + 0x81, 0xf4, 0x04, 0xbf, 0xb0, 0xfa, 0x80, 0xf6, 0xa4, 0x19, 0x0b, 0x3c, + 0xb4, 0xf1, 0x20, 0x06, 0x2f, 0xbf, 0x00, 0xfa, 0x06, 0xf1, 0xa1, 0x40, + 0xc4, 0xf1, 0x20, 0x06, 0x20, 0xfa, 0x06, 0xf6, 0x38, 0xbf, 0x31, 0x43, + 0xa0, 0x40, 0x3c, 0x1b, 0x1a, 0xe7, 0xac, 0x42, 0x1a, 0xbf, 0x05, 0xea, + 0x13, 0x57, 0xaf, 0x42, 0x12, 0xe0, 0x50, 0xea, 0x41, 0x06, 0x1c, 0xbf, + 0x52, 0xea, 0x43, 0x06, 0xbf, 0xe7, 0x50, 0xea, 0x41, 0x07, 0x30, 0x46, + 0x61, 0x46, 0x1c, 0xbf, 0x41, 0xea, 0x05, 0x51, 0xf0, 0xbd, 0x52, 0xea, + 0x43, 0x0c, 0x08, 0xbf, 0xc1, 0x43, 0xf0, 0xbd, 0x00, 0x20, 0x4f, 0xf4, + 0x00, 0x16, 0x16, 0xeb, 0x41, 0x0f, 0x98, 0xbf, 0x16, 0xeb, 0x43, 0x0f, + 0x08, 0xbf, 0x16, 0xeb, 0x41, 0x0f, 0x24, 0xbf, 0xc1, 0x43, 0x05, 0xe0, + 0x16, 0xeb, 0x43, 0x0f, 0x0c, 0xbf, 0x61, 0x46, 0x4c, 0xea, 0x05, 0x51, + 0xf0, 0xbd, 0x00, 0x00, 0x40, 0x0d, 0x49, 0x18, 0x40, 0xea, 0x81, 0x20, + 0x0c, 0xd2, 0x49, 0x0d, 0xa1, 0xf5, 0x80, 0x61, 0x49, 0x1c, 0x40, 0xf0, + 0x00, 0x40, 0x05, 0xdb, 0xd1, 0xf1, 0x1f, 0x01, 0x54, 0xbf, 0xc8, 0x40, + 0xc0, 0x17, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x01, 0x46, 0x48, 0xb1, + 0xb0, 0xfa, 0x80, 0xf1, 0x88, 0x40, 0xc9, 0x1c, 0xc1, 0xf5, 0x84, 0x61, + 0x09, 0x05, 0x01, 0xeb, 0xd0, 0x21, 0x40, 0x05, 0x70, 0x47, 0x00, 0x00, + 0x70, 0xb4, 0x4f, 0xf0, 0x00, 0x45, 0x91, 0xea, 0x03, 0x0f, 0x4d, 0xf5, + 0x45, 0xaa, 0x6b, 0x40, 0x84, 0x1a, 0x71, 0xeb, 0x03, 0x06, 0x03, 0xd2, + 0x00, 0x1b, 0xb1, 0x41, 0x12, 0x19, 0x73, 0x41, 0x4f, 0xf4, 0x00, 0x1c, + 0x1c, 0xeb, 0x41, 0x0f, 0x34, 0xbf, 0x7c, 0xeb, 0x43, 0x04, 0x42, 0xe0, + 0x0c, 0x0d, 0xa4, 0xeb, 0x13, 0x56, 0x35, 0x2e, 0x4f, 0xdc, 0x45, 0xea, + 0xc3, 0x23, 0xdb, 0x0a, 0x45, 0xea, 0xc1, 0x21, 0xc9, 0x12, 0xb6, 0xf1, + 0x20, 0x05, 0x0d, 0xdd, 0x63, 0xfa, 0x05, 0xf6, 0xeb, 0x40, 0x86, 0xea, + 0x03, 0x05, 0x12, 0x42, 0x18, 0xbf, 0x45, 0xf0, 0x01, 0x05, 0xc0, 0x18, + 0x51, 0xf1, 0x00, 0x01, 0x0c, 0xd2, 0x13, 0xe0, 0x62, 0xfa, 0x06, 0xf5, + 0xf2, 0x40, 0x55, 0x40, 0xf3, 0x41, 0x5a, 0x40, 0xb3, 0x40, 0xf3, 0x40, + 0x5a, 0x40, 0x80, 0x18, 0x59, 0x41, 0x07, 0xd3, 0x49, 0x08, 0x5f, 0xea, + 0x30, 0x00, 0x5f, 0xea, 0x35, 0x05, 0x28, 0xbf, 0x45, 0xf0, 0x01, 0x05, + 0x01, 0xf5, 0x80, 0x11, 0x42, 0x08, 0x75, 0xf1, 0x00, 0x42, 0x50, 0xf1, + 0x00, 0x00, 0x41, 0xeb, 0x04, 0x51, 0x4e, 0x00, 0x16, 0xf5, 0x00, 0x1f, + 0x70, 0xbc, 0x38, 0xbf, 0x70, 0x47, 0x00, 0x20, 0x09, 0x0d, 0x09, 0x05, + 0x70, 0x47, 0x1c, 0xeb, 0x41, 0x0f, 0x10, 0xd2, 0x52, 0xea, 0x43, 0x06, + 0x0b, 0xd0, 0xbc, 0xeb, 0x41, 0x0f, 0x05, 0xd8, 0x0c, 0x0d, 0xab, 0x43, + 0x66, 0x1e, 0x34, 0x2e, 0xb6, 0xdd, 0x02, 0xe0, 0xab, 0x43, 0x80, 0x18, + 0x59, 0x41, 0x70, 0xbc, 0x70, 0x47, 0x70, 0xbc, 0x70, 0x47, 0x00, 0x00, + 0xb0, 0xb5, 0x81, 0xea, 0x03, 0x0c, 0x0c, 0xf0, 0x00, 0x4c, 0x40, 0xf2, + 0xff, 0x75, 0x15, 0xea, 0x11, 0x54, 0x1d, 0xbf, 0x15, 0xea, 0x13, 0x57, + 0xac, 0x42, 0xaf, 0x42, 0x39, 0xe0, 0xe4, 0x19, 0x23, 0xea, 0x45, 0x53, + 0x43, 0xf4, 0x80, 0x13, 0xc9, 0x02, 0x41, 0xf0, 0x00, 0x41, 0x41, 0xea, + 0x50, 0x5e, 0xc7, 0x02, 0x11, 0x00, 0xa7, 0xfb, 0x02, 0x02, 0x00, 0x28, + 0x4f, 0xf0, 0x00, 0x00, 0xee, 0xfb, 0x01, 0x20, 0x4f, 0xf0, 0x00, 0x01, + 0xe3, 0xfb, 0x07, 0x21, 0x18, 0xbf, 0x42, 0xf0, 0x01, 0x02, 0x40, 0x18, + 0x00, 0x21, 0x49, 0x41, 0xe3, 0xfb, 0x0e, 0x01, 0xa4, 0xf5, 0x80, 0x64, + 0x0f, 0x03, 0x02, 0xd2, 0x52, 0x00, 0x40, 0x41, 0x49, 0x41, 0x54, 0xf1, + 0x01, 0x04, 0x6c, 0xdd, 0x47, 0x08, 0x72, 0xf1, 0x00, 0x42, 0x50, 0xf1, + 0x00, 0x00, 0x51, 0xeb, 0x04, 0x51, 0xa1, 0xf5, 0x80, 0x11, 0x5c, 0xbf, + 0x41, 0xea, 0x0c, 0x01, 0xb0, 0xbd, 0x4c, 0xea, 0x05, 0x51, 0x00, 0x20, + 0xb0, 0xbd, 0x05, 0xea, 0x13, 0x57, 0xac, 0x42, 0x14, 0xbf, 0xaf, 0x42, + 0x41, 0xe0, 0x50, 0xea, 0x41, 0x0e, 0x1c, 0xbf, 0x52, 0xea, 0x43, 0x0e, + 0x02, 0xe0, 0x61, 0x46, 0x00, 0x20, 0xb0, 0xbd, 0x24, 0x42, 0x3c, 0x44, + 0x1b, 0xd1, 0x5f, 0xea, 0x07, 0x0e, 0xf6, 0xd0, 0x09, 0x03, 0x02, 0xbf, + 0x01, 0x46, 0x00, 0x20, 0xae, 0xf1, 0x14, 0x0e, 0xb1, 0xfa, 0x81, 0xf7, + 0xae, 0xeb, 0x07, 0x04, 0x01, 0xfa, 0x07, 0xfe, 0x0c, 0x37, 0xc7, 0xf1, + 0x20, 0x01, 0x00, 0xfa, 0x07, 0xf7, 0xc8, 0x40, 0x4e, 0xea, 0x00, 0x0e, + 0x23, 0xea, 0x45, 0x53, 0x43, 0xf4, 0x80, 0x13, 0xa2, 0xe7, 0x33, 0xf0, + 0x00, 0x43, 0xb3, 0xfa, 0x83, 0xf7, 0x04, 0xbf, 0xb2, 0xfa, 0x82, 0xfe, + 0x77, 0x44, 0x0b, 0x3f, 0xe4, 0x1b, 0xb7, 0xf1, 0x20, 0x0e, 0x2f, 0xbf, + 0x02, 0xfa, 0x0e, 0xf3, 0xbb, 0x40, 0xc7, 0xf1, 0x20, 0x0e, 0x22, 0xfa, + 0x0e, 0xfe, 0x38, 0xbf, 0x43, 0xea, 0x0e, 0x03, 0xba, 0x40, 0x64, 0x1c, + 0x82, 0xe7, 0x50, 0xea, 0x41, 0x0e, 0x14, 0xbf, 0x52, 0xea, 0x43, 0x0e, + 0x6f, 0xf0, 0x00, 0x01, 0x4f, 0xf4, 0x00, 0x17, 0x17, 0xeb, 0x43, 0x0f, + 0x8a, 0xbf, 0x19, 0x46, 0x17, 0xeb, 0x41, 0x0f, 0xb5, 0xe7, 0x4c, 0xea, + 0x05, 0x51, 0x00, 0x20, 0xb0, 0xbd, 0xd4, 0xf1, 0x01, 0x04, 0xb4, 0xf1, + 0x20, 0x07, 0x0f, 0xda, 0xc4, 0xf1, 0x20, 0x07, 0x52, 0x08, 0x28, 0xbf, + 0x42, 0xf0, 0x01, 0x02, 0x10, 0xfa, 0x07, 0xf5, 0x01, 0xfa, 0x07, 0xf7, + 0xe1, 0xbf, 0x2a, 0x43, 0xe0, 0x40, 0x38, 0x43, 0xe1, 0x40, 0x0f, 0xe0, + 0x35, 0x2c, 0x98, 0xdc, 0xc7, 0xf1, 0x20, 0x04, 0x52, 0xea, 0x40, 0x02, + 0x20, 0xfa, 0x07, 0xf2, 0x18, 0xbf, 0x42, 0xf0, 0x01, 0x02, 0x31, 0xfa, + 0x07, 0xf0, 0xa1, 0x40, 0x0a, 0x43, 0x00, 0x21, 0x72, 0xf1, 0x00, 0x42, + 0x50, 0xf1, 0x00, 0x00, 0x51, 0xeb, 0x0c, 0x01, 0xb0, 0xbd, 0x00, 0x00, + 0x10, 0xb5, 0x04, 0x00, 0x04, 0xd0, 0x00, 0x21, 0x21, 0x60, 0x20, 0x1d, + 0xf9, 0xf7, 0xa8, 0xff, 0x20, 0x46, 0x10, 0xbd, 0x2d, 0xe9, 0xf0, 0x47, + 0x08, 0x9d, 0x07, 0x46, 0x88, 0x46, 0x14, 0x46, 0x99, 0x46, 0xe8, 0xf7, + 0x73, 0xfd, 0x3e, 0x68, 0x4a, 0x46, 0x41, 0x46, 0x30, 0x46, 0x00, 0xf0, + 0x7d, 0xf8, 0x4f, 0xf0, 0x00, 0x0a, 0x30, 0xb1, 0x00, 0x25, 0xa4, 0xb1, + 0x38, 0x68, 0x20, 0xea, 0x08, 0x00, 0x38, 0x60, 0x0f, 0xe0, 0x75, 0xb1, + 0x0c, 0xb1, 0x4f, 0xf0, 0x80, 0x7a, 0xb9, 0xf1, 0x00, 0x0f, 0x18, 0xbf, + 0x4a, 0xf0, 0x80, 0x6a, 0x2a, 0x46, 0x4a, 0xea, 0x08, 0x01, 0x38, 0x1d, + 0xe8, 0xf7, 0xb6, 0xfe, 0x00, 0x26, 0xe8, 0xf7, 0x57, 0xfd, 0x0d, 0xb3, + 0x38, 0xb9, 0x34, 0x49, 0x4f, 0xf0, 0x80, 0x50, 0x08, 0x60, 0xbf, 0xf3, + 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0xe9, 0xf7, 0xa3, 0xf8, 0x06, 0x46, + 0xb0, 0x01, 0x11, 0xd4, 0xf9, 0xf7, 0x24, 0xff, 0x3e, 0x68, 0x4a, 0x46, + 0x41, 0x46, 0x30, 0x46, 0x00, 0xf0, 0x4a, 0xf8, 0x00, 0x28, 0x18, 0xbf, + 0x00, 0x2c, 0x03, 0xd0, 0x38, 0x68, 0x20, 0xea, 0x08, 0x00, 0x38, 0x60, + 0xf9, 0xf7, 0x20, 0xff, 0x26, 0xf0, 0x7f, 0x46, 0x30, 0x46, 0xbd, 0xe8, + 0xf0, 0x87, 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0xf9, 0xf7, 0x0a, 0xff, + 0x26, 0x68, 0x26, 0xea, 0x05, 0x05, 0x25, 0x60, 0xf9, 0xf7, 0x10, 0xff, + 0x30, 0x46, 0x70, 0xbd, 0xf8, 0xb5, 0x05, 0x46, 0x0c, 0x46, 0xe8, 0xf7, + 0x19, 0xfd, 0x28, 0x68, 0x2a, 0x69, 0x04, 0x43, 0x00, 0x26, 0x2c, 0x60, + 0x16, 0xe0, 0x98, 0x42, 0x13, 0xd1, 0xff, 0x01, 0x48, 0xbf, 0x1e, 0x43, + 0x41, 0xf0, 0x00, 0x71, 0x10, 0x46, 0xe8, 0xf7, 0xe7, 0xfe, 0x0a, 0xe0, + 0x17, 0x68, 0x54, 0x68, 0x27, 0xf0, 0x7f, 0x43, 0x5f, 0xea, 0x47, 0x1c, + 0x01, 0xea, 0x03, 0x00, 0xeb, 0xd4, 0x00, 0x28, 0xeb, 0xd1, 0x22, 0x46, + 0x05, 0xf1, 0x0c, 0x00, 0x29, 0x68, 0x82, 0x42, 0xee, 0xd1, 0x21, 0xea, + 0x06, 0x06, 0x2e, 0x60, 0xe8, 0xf7, 0xf8, 0xfc, 0x28, 0x68, 0xf2, 0xbd, + 0x03, 0x46, 0x00, 0x20, 0x0b, 0x40, 0x0a, 0xb9, 0x1b, 0xb1, 0x01, 0xe0, + 0x8b, 0x42, 0x00, 0xd1, 0x01, 0x20, 0x70, 0x47, 0x04, 0xed, 0x00, 0xe0, + 0x80, 0xb5, 0x00, 0x23, 0x00, 0x22, 0x03, 0x21, 0x0e, 0xe1, 0x2d, 0xe9, + 0xf0, 0x47, 0x88, 0xb0, 0x81, 0x46, 0x0f, 0x46, 0x15, 0x46, 0x00, 0xf0, + 0x5c, 0xf9, 0x04, 0x00, 0x05, 0xd1, 0x2a, 0x46, 0x39, 0x46, 0x48, 0x46, + 0x00, 0xf0, 0x82, 0xf9, 0x04, 0x46, 0x00, 0x2c, 0x05, 0xf5, 0x47, 0x78, + 0x05, 0xf5, 0x57, 0x76, 0x40, 0xf0, 0x8e, 0x80, 0x01, 0x21, 0xcd, 0xf8, + 0x04, 0x90, 0x8d, 0xf8, 0x08, 0x10, 0x00, 0x21, 0x3a, 0x68, 0x05, 0x92, + 0x06, 0x91, 0x00, 0x22, 0x78, 0x68, 0x04, 0x90, 0x78, 0x7d, 0x8d, 0xf8, + 0x1c, 0x00, 0xb3, 0x78, 0x71, 0x78, 0x48, 0x46, 0x00, 0xf0, 0xfc, 0xf8, + 0x00, 0xf0, 0xcc, 0xf8, 0xe6, 0xf7, 0xbc, 0xff, 0x04, 0x00, 0x04, 0xd1, + 0x00, 0xf0, 0xc6, 0xf8, 0xf8, 0xf7, 0x4f, 0xf9, 0x04, 0x46, 0x00, 0x2c, + 0x5d, 0xd1, 0x00, 0x20, 0x00, 0x90, 0xea, 0x68, 0xb9, 0x7d, 0x00, 0x23, + 0x48, 0x46, 0xe5, 0xf7, 0xfe, 0xf9, 0x3c, 0x46, 0x00, 0x27, 0x14, 0xe0, + 0x18, 0xf8, 0x07, 0x20, 0x3f, 0x2a, 0x0f, 0xd8, 0x02, 0x21, 0x48, 0x46, + 0xf8, 0xf7, 0xa7, 0xfa, 0x01, 0x21, 0x48, 0x46, 0x00, 0xf0, 0xe1, 0xf9, + 0x05, 0xf5, 0x8e, 0x70, 0x00, 0xeb, 0x87, 0x02, 0x69, 0x69, 0x01, 0xa8, + 0x00, 0xf0, 0xa4, 0xf9, 0x7f, 0x1c, 0xe1, 0x7d, 0x8f, 0x42, 0x01, 0xd2, + 0x00, 0x28, 0xe5, 0xd0, 0x4f, 0x46, 0x30, 0xb9, 0x00, 0x90, 0xaa, 0x68, + 0xa1, 0x7d, 0x00, 0x23, 0x38, 0x46, 0xe5, 0xf7, 0xd8, 0xf9, 0x4f, 0xf0, + 0x00, 0x09, 0x1e, 0xe0, 0x18, 0xf8, 0x09, 0x20, 0x3f, 0x2a, 0x18, 0xd8, + 0x02, 0x21, 0x38, 0x46, 0xf8, 0xf7, 0x81, 0xfa, 0x02, 0x21, 0x38, 0x46, + 0x00, 0xf0, 0xbb, 0xf9, 0x05, 0xf1, 0x1c, 0x00, 0x00, 0xeb, 0x89, 0x02, + 0x29, 0x69, 0x01, 0xa8, 0x00, 0xf0, 0x7e, 0xf9, 0x38, 0xb9, 0x05, 0xf5, + 0x07, 0x70, 0x00, 0xeb, 0x89, 0x02, 0xa9, 0x69, 0x01, 0xa8, 0x00, 0xf0, + 0x75, 0xf9, 0x09, 0xf1, 0x01, 0x09, 0xe1, 0x7d, 0x89, 0x45, 0x01, 0xd2, + 0x00, 0x28, 0xdb, 0xd0, 0xb9, 0x46, 0x27, 0x46, 0x04, 0x46, 0x00, 0x21, + 0x48, 0x46, 0xe5, 0xf7, 0x4c, 0xfa, 0x04, 0xb9, 0x04, 0x46, 0x00, 0xf0, + 0x61, 0xf8, 0xe6, 0xf7, 0x6b, 0xff, 0x82, 0x46, 0x00, 0xf0, 0x5c, 0xf8, + 0xf8, 0xf7, 0x0f, 0xf9, 0xba, 0xf1, 0x00, 0x0f, 0x08, 0xbf, 0x82, 0x46, + 0x04, 0xb9, 0x54, 0x46, 0x00, 0x2c, 0x47, 0xd1, 0x95, 0xed, 0x05, 0x0a, + 0xd5, 0xed, 0x04, 0x0a, 0xb8, 0xee, 0xc0, 0x0a, 0xf8, 0xee, 0xe0, 0x0a, + 0x80, 0xee, 0x20, 0x0a, 0xf8, 0x7e, 0xf7, 0xee, 0x00, 0x0a, 0x40, 0xee, + 0x00, 0x0a, 0x01, 0x28, 0x20, 0xee, 0xa0, 0x1a, 0xb1, 0xee, 0x00, 0x0a, + 0x0c, 0xbf, 0x40, 0x20, 0x3f, 0x20, 0x80, 0xee, 0x01, 0x0a, 0x00, 0x21, + 0x00, 0xe0, 0x49, 0x1c, 0xfa, 0x7d, 0x91, 0x42, 0x23, 0xd2, 0x18, 0xf8, + 0x01, 0x30, 0x3f, 0x2b, 0xf7, 0xd8, 0x05, 0xeb, 0x81, 0x02, 0x97, 0xed, + 0x02, 0x1a, 0xd2, 0xed, 0x07, 0x0a, 0xb4, 0xee, 0x60, 0x1a, 0xf1, 0xee, + 0x10, 0xfa, 0x41, 0xbf, 0xd2, 0xed, 0x47, 0x1a, 0xc1, 0xee, 0xa0, 0x1a, + 0xb4, 0xee, 0x61, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xe3, 0xd5, 0x92, 0xed, + 0x87, 0x1a, 0xd7, 0xed, 0x03, 0x1a, 0xc1, 0xee, 0x20, 0x0a, 0xf4, 0xee, + 0x61, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xd8, 0xd5, 0x08, 0x46, 0x3f, 0x28, + 0x88, 0xbf, 0x40, 0xf6, 0x01, 0x64, 0x30, 0x70, 0x24, 0xb9, 0x29, 0x46, + 0x48, 0x46, 0x00, 0xf0, 0x0a, 0xf8, 0x04, 0x46, 0x20, 0x46, 0x08, 0xb0, + 0xbd, 0xe8, 0xf0, 0x87, 0x00, 0x23, 0x04, 0x22, 0x01, 0x21, 0x48, 0x46, + 0x70, 0x47, 0x38, 0xb5, 0x01, 0xf5, 0x57, 0x74, 0x25, 0x78, 0xa3, 0x78, + 0x29, 0x44, 0x91, 0xf8, 0x1c, 0x23, 0x61, 0x78, 0x00, 0xf0, 0x1e, 0xf8, + 0x00, 0x20, 0x32, 0xbd, 0x80, 0xb5, 0x8b, 0x78, 0x0a, 0x78, 0x49, 0x78, + 0x00, 0xf0, 0x16, 0xf8, 0x00, 0x20, 0x02, 0xbd, 0x38, 0xb5, 0x0d, 0x46, + 0x04, 0x46, 0x02, 0x21, 0xf8, 0xf7, 0xfc, 0xf9, 0x28, 0x70, 0x02, 0x21, + 0x20, 0x46, 0xf8, 0xf7, 0xaa, 0xf9, 0x68, 0x70, 0x20, 0x46, 0xf8, 0xf7, + 0x51, 0xfa, 0x00, 0xb1, 0x01, 0x20, 0xa8, 0x70, 0x31, 0xbd, 0x00, 0x00, + 0xf8, 0xb5, 0x0d, 0x46, 0x01, 0x2b, 0x04, 0x46, 0x16, 0x46, 0x0c, 0xbf, + 0x0f, 0x21, 0x00, 0x21, 0xf8, 0xf7, 0x2f, 0xfa, 0x8b, 0xa0, 0x05, 0xf0, + 0x03, 0x01, 0x2a, 0x46, 0x47, 0x5c, 0x00, 0x21, 0x20, 0x46, 0xf8, 0xf7, + 0x79, 0xf9, 0x2a, 0x46, 0x02, 0x21, 0x20, 0x46, 0xf8, 0xf7, 0x74, 0xf9, + 0x2a, 0x46, 0x01, 0x21, 0x20, 0x46, 0xf8, 0xf7, 0x6f, 0xf9, 0x3a, 0x46, + 0x00, 0x21, 0x20, 0x46, 0xf8, 0xf7, 0x91, 0xf9, 0x3a, 0x46, 0x02, 0x21, + 0x20, 0x46, 0xf8, 0xf7, 0x8c, 0xf9, 0x3a, 0x46, 0x01, 0x21, 0x20, 0x46, + 0xf8, 0xf7, 0x87, 0xf9, 0x32, 0x46, 0x00, 0x21, 0x20, 0x46, 0xf8, 0xf7, + 0x9a, 0xf9, 0x32, 0x46, 0x02, 0x21, 0x20, 0x46, 0xf8, 0xf7, 0x95, 0xf9, + 0x32, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0xf8, 0x40, 0x01, 0x21, 0xf8, 0xf7, + 0x8e, 0xb9, 0xf8, 0xb5, 0x07, 0x46, 0x0d, 0x46, 0x14, 0x46, 0xda, 0xf7, + 0xae, 0xf9, 0x46, 0x08, 0x69, 0x46, 0x38, 0x46, 0xd9, 0xf7, 0x16, 0xfa, + 0x07, 0x46, 0x70, 0x42, 0xa6, 0x60, 0xe0, 0x60, 0x00, 0x99, 0x71, 0x18, + 0x21, 0x61, 0x00, 0x98, 0x80, 0x1b, 0x60, 0x61, 0x00, 0x99, 0xc1, 0xeb, + 0xc1, 0x01, 0x89, 0x1b, 0xa1, 0x61, 0x00, 0x98, 0x20, 0x60, 0x66, 0x60, + 0x14, 0x20, 0xed, 0xf7, 0x47, 0xf8, 0x30, 0xb1, 0x00, 0x98, 0xe9, 0x69, + 0x86, 0x1b, 0x8e, 0x42, 0x80, 0x41, 0xc0, 0x43, 0xc0, 0x0f, 0x84, 0xf8, + 0x5e, 0x03, 0x38, 0x46, 0xf2, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x2d, 0xed, + 0x02, 0x8b, 0x15, 0x46, 0x82, 0xb0, 0x0c, 0x46, 0x29, 0x68, 0x68, 0x68, + 0x41, 0x18, 0x08, 0xee, 0x10, 0x1a, 0x18, 0xee, 0x10, 0x0a, 0x00, 0xf0, + 0x78, 0xf8, 0x06, 0x46, 0x68, 0x46, 0xd9, 0xf7, 0x22, 0xfa, 0x01, 0xa8, + 0xd9, 0xf7, 0x1a, 0xfa, 0x4f, 0xa0, 0xdd, 0xed, 0x00, 0x0a, 0x06, 0xf0, + 0x03, 0x01, 0x9f, 0xed, 0x45, 0x1a, 0x42, 0x5c, 0x00, 0xee, 0x10, 0x2a, + 0xb8, 0xee, 0x40, 0x0a, 0x60, 0xee, 0x20, 0x0a, 0xf8, 0xee, 0xc8, 0x1a, + 0x9f, 0xed, 0x40, 0x0a, 0x20, 0xee, 0x81, 0x1a, 0x21, 0xee, 0x80, 0x0a, + 0x21, 0xee, 0x00, 0x0a, 0xb7, 0xee, 0x00, 0x2a, 0x82, 0xee, 0x00, 0x2a, + 0xdd, 0xed, 0x01, 0x0a, 0xc2, 0xee, 0x20, 0x0a, 0x9f, 0xed, 0x39, 0x0a, + 0x30, 0xee, 0x80, 0x0a, 0x9f, 0xed, 0x38, 0x1a, 0x80, 0xee, 0x01, 0x0a, + 0xcc, 0xf7, 0xaa, 0xfa, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, + 0x40, 0x28, 0xa8, 0xbf, 0x3f, 0x20, 0x02, 0xda, 0x00, 0x28, 0x48, 0xbf, + 0x00, 0x20, 0xa1, 0x7e, 0x01, 0x29, 0x0c, 0xbf, 0xc0, 0xb2, 0x00, 0x20, + 0x00, 0x21, 0x0d, 0xe0, 0x40, 0x22, 0x07, 0xe0, 0x94, 0xf9, 0x19, 0x20, + 0x83, 0x18, 0x22, 0x7e, 0x02, 0xfb, 0x01, 0x32, 0x40, 0x2a, 0xf5, 0xd2, + 0x6b, 0x18, 0x49, 0x1c, 0x83, 0xf8, 0x1c, 0x23, 0xe2, 0x7d, 0x91, 0x42, + 0xf0, 0xd3, 0x85, 0xf8, 0x5d, 0x63, 0x02, 0xb0, 0x00, 0x20, 0xbd, 0xec, + 0x02, 0x8b, 0x70, 0xbd, 0xf0, 0xb5, 0x05, 0x46, 0x87, 0xb0, 0xa9, 0x60, + 0x16, 0x46, 0xfc, 0xf7, 0x37, 0xfb, 0x04, 0x00, 0x10, 0xd1, 0x28, 0x68, + 0x4f, 0xf4, 0x7a, 0x71, 0xfc, 0xf7, 0xa4, 0xfb, 0x40, 0xf6, 0x02, 0x67, + 0x38, 0xb9, 0x69, 0x46, 0x28, 0x46, 0xfc, 0xf7, 0xa1, 0xfb, 0x10, 0xb9, + 0x04, 0x98, 0x30, 0x60, 0x00, 0xe0, 0x3c, 0x46, 0x20, 0x46, 0x07, 0xb0, + 0xf0, 0xbd, 0x10, 0xb5, 0x04, 0x46, 0x04, 0x20, 0xec, 0xf7, 0xae, 0xff, + 0x28, 0xb9, 0x10, 0x48, 0x84, 0x42, 0x05, 0xd3, 0x0f, 0x49, 0x8c, 0x42, + 0x06, 0xe0, 0x0f, 0x48, 0x84, 0x42, 0x01, 0xd2, 0x01, 0x20, 0x10, 0xbd, + 0x0d, 0x48, 0x84, 0x42, 0x01, 0xd2, 0x02, 0x20, 0x10, 0xbd, 0x03, 0x20, + 0x10, 0xbd, 0x0a, 0x46, 0x01, 0x21, 0x81, 0x40, 0x05, 0x20, 0xfc, 0xf7, + 0xe3, 0xb8, 0x00, 0x00, 0xdb, 0x0f, 0xc9, 0x40, 0x00, 0x00, 0x7a, 0x44, + 0xc5, 0x21, 0x9b, 0xaa, 0x64, 0xbd, 0x85, 0x28, 0xe0, 0xc8, 0x10, 0x00, + 0xa0, 0xf0, 0x19, 0x00, 0x50, 0x2d, 0x19, 0x00, 0x30, 0xf6, 0x29, 0x00, + 0x00, 0xc8, 0x64, 0x32, 0x00, 0x03, 0x06, 0x0c, 0xbd, 0xee, 0x40, 0x0a, + 0x10, 0xee, 0x10, 0x0a, 0x70, 0x47, 0x00, 0x00, 0x2d, 0xe9, 0xfc, 0x41, + 0x05, 0x46, 0x40, 0xf2, 0x0d, 0x26, 0x69, 0x68, 0x04, 0x29, 0x7d, 0xd2, + 0x18, 0x20, 0xdf, 0xf8, 0x88, 0x27, 0x48, 0x43, 0x40, 0xf2, 0x54, 0x63, + 0x10, 0x44, 0x4b, 0x43, 0x1a, 0x44, 0x02, 0xf1, 0x60, 0x04, 0x40, 0xf6, + 0x58, 0x0e, 0x04, 0x60, 0x0e, 0xfb, 0x01, 0xfe, 0xdf, 0xf8, 0x6c, 0xc7, + 0xe6, 0x44, 0x43, 0xf6, 0x28, 0x78, 0x02, 0xf5, 0x8e, 0x73, 0x02, 0xf5, + 0xae, 0x74, 0x02, 0xf5, 0x14, 0x77, 0x0e, 0xeb, 0x08, 0x0c, 0x02, 0xf5, + 0x56, 0x7e, 0x43, 0x60, 0x84, 0x60, 0xc7, 0x60, 0xc0, 0xf8, 0x14, 0xc0, + 0xc0, 0xf8, 0x10, 0xe0, 0x02, 0xf1, 0x60, 0x00, 0xa8, 0x62, 0x6b, 0x62, + 0x30, 0x20, 0xdf, 0xf8, 0x3c, 0x27, 0xc5, 0xf8, 0x34, 0xc0, 0x41, 0x43, + 0x50, 0x18, 0x00, 0xf1, 0xc0, 0x03, 0xc5, 0xf8, 0x38, 0xe0, 0xe8, 0x61, + 0x2b, 0x62, 0xec, 0x62, 0x2f, 0x63, 0x30, 0x21, 0xde, 0xf7, 0xe6, 0xfb, + 0x28, 0x6a, 0x30, 0x21, 0xde, 0xf7, 0xe2, 0xfb, 0x28, 0x46, 0x00, 0xf0, + 0x1d, 0xfb, 0x03, 0x20, 0x00, 0x90, 0x05, 0xf1, 0x54, 0x03, 0x00, 0x22, + 0x00, 0x21, 0x01, 0x20, 0xe9, 0xf7, 0x50, 0xfc, 0x28, 0x65, 0x00, 0x21, + 0xe9, 0xf7, 0x02, 0xfe, 0x28, 0x68, 0xc0, 0xb2, 0xcc, 0xf7, 0x78, 0xfe, + 0x28, 0x68, 0x00, 0x21, 0xc0, 0xb2, 0xcc, 0xf7, 0x8f, 0xfe, 0x28, 0x68, + 0x00, 0x21, 0xcc, 0xf7, 0x15, 0xff, 0x28, 0x68, 0x01, 0x21, 0xcc, 0xf7, + 0x11, 0xff, 0x69, 0x6a, 0xa8, 0x6a, 0xce, 0xf7, 0x4b, 0xfa, 0x04, 0x46, + 0xa8, 0x6a, 0x01, 0x21, 0xce, 0xf7, 0x86, 0xfd, 0x01, 0x2c, 0x04, 0xd1, + 0x28, 0x46, 0x00, 0xf0, 0xd4, 0xf9, 0x04, 0x00, 0x13, 0xd1, 0x28, 0x68, + 0x01, 0x21, 0x00, 0xf0, 0x80, 0xf8, 0x10, 0xb3, 0x00, 0xf0, 0x80, 0xf8, + 0x0f, 0xf2, 0xb8, 0x62, 0x00, 0xf0, 0x0e, 0xf9, 0x34, 0x46, 0x06, 0xe0, + 0x4f, 0xf6, 0x52, 0x74, 0x03, 0x22, 0x21, 0x46, 0x01, 0x20, 0xe7, 0xf7, + 0x4d, 0xfd, 0x00, 0x94, 0x02, 0x21, 0x2b, 0x68, 0x0f, 0xf2, 0xac, 0x62, + 0x00, 0xf0, 0xfe, 0xf8, 0x03, 0x27, 0xb4, 0x42, 0x08, 0xbf, 0x01, 0x27, + 0x3a, 0x46, 0x02, 0xb0, 0xbd, 0xe8, 0xf0, 0x41, 0x40, 0xf2, 0x07, 0x21, + 0x01, 0x20, 0xe7, 0xf7, 0x39, 0xbd, 0xbd, 0xe8, 0xf3, 0x81, 0x2d, 0xe9, + 0xf8, 0x43, 0x0e, 0x46, 0x05, 0x46, 0x02, 0x2e, 0x4f, 0xf0, 0x00, 0x08, + 0x02, 0xbf, 0xa9, 0x69, 0x48, 0x7e, 0x00, 0x28, 0x04, 0xbf, 0x28, 0x46, + 0x00, 0xf0, 0xb6, 0xfa, 0x00, 0x21, 0x28, 0x46, 0x00, 0xf0, 0x3c, 0xfa, + 0xe8, 0x69, 0x01, 0x69, 0x4c, 0x1e, 0xa4, 0x41, 0x02, 0x2e, 0x05, 0xf1, + 0x40, 0x07, 0x25, 0xd1, 0xe3, 0xf7, 0xf8, 0xff, 0x38, 0x60, 0x85, 0xf8, + 0x3f, 0x80, 0xe1, 0x0f, 0x28, 0x68, 0x00, 0xf0, 0x36, 0xf8, 0x40, 0xf2, + 0x0d, 0x29, 0x28, 0xb1, 0x00, 0xf0, 0x34, 0xf8, 0x0f, 0xf2, 0x4c, 0x62, + 0x03, 0x20, 0x0f, 0xe0, 0x28, 0x46, 0x00, 0xf0, 0x44, 0xfa, 0x5f, 0xea, + 0x00, 0x08, 0x22, 0xd1, 0x28, 0x68, 0xe1, 0x0f, 0x00, 0xf0, 0x23, 0xf8, + 0x40, 0xb1, 0x00, 0xf0, 0x23, 0xf8, 0x0f, 0xf2, 0x4c, 0x62, 0x01, 0x20, + 0xda, 0xf7, 0x81, 0xf9, 0xc8, 0x46, 0x14, 0xe0, 0x38, 0x69, 0x00, 0x21, + 0xe9, 0xf7, 0x72, 0xfd, 0x31, 0x46, 0x28, 0x46, 0x00, 0xf0, 0x1e, 0xfa, + 0x01, 0x00, 0x04, 0xbf, 0xa8, 0x6a, 0xce, 0xf7, 0x47, 0xfa, 0x01, 0x28, + 0x08, 0xd1, 0x28, 0x46, 0x00, 0xf0, 0x55, 0xf9, 0x5f, 0xea, 0x00, 0x08, + 0x02, 0xd0, 0x28, 0x46, 0x00, 0xf0, 0x46, 0xfa, 0x2d, 0xe1, 0xc0, 0xb2, + 0xcc, 0xf7, 0xfe, 0xbd, 0x00, 0x90, 0x02, 0x21, 0x2b, 0x68, 0x70, 0x47, + 0x2d, 0xe9, 0xf8, 0x4f, 0x05, 0x46, 0x0c, 0x46, 0x05, 0xf1, 0x3d, 0x01, + 0x00, 0x27, 0x88, 0x78, 0x00, 0x28, 0x93, 0x46, 0x4f, 0xf0, 0x00, 0x08, + 0x78, 0xd0, 0xa8, 0x69, 0x01, 0x68, 0x02, 0x2c, 0x06, 0xbf, 0x4f, 0xf0, + 0x0f, 0x09, 0x49, 0x08, 0x4f, 0xf0, 0x10, 0x09, 0x00, 0x91, 0x28, 0x46, + 0x95, 0xf8, 0x3d, 0xa0, 0x00, 0xf0, 0xef, 0xf9, 0x05, 0xf1, 0x40, 0x06, + 0x30, 0x68, 0xe3, 0xf7, 0xc7, 0xff, 0x70, 0x60, 0x95, 0xf8, 0x3d, 0x10, + 0x8a, 0x45, 0x18, 0xbf, 0xf0, 0x60, 0xf4, 0xf7, 0x91, 0xfb, 0x18, 0xb1, + 0x4f, 0xf0, 0x00, 0x48, 0x01, 0x27, 0x0a, 0xe0, 0x95, 0xf8, 0x3d, 0x00, + 0x48, 0x45, 0x15, 0xd1, 0x01, 0x27, 0x03, 0x2c, 0x1e, 0xbf, 0xa9, 0x69, + 0x48, 0x7a, 0x00, 0x28, 0x02, 0xd1, 0x28, 0x46, 0x00, 0xf0, 0x02, 0xfa, + 0x02, 0x2c, 0x38, 0xd1, 0xb8, 0xf1, 0x00, 0x0f, 0x37, 0xd1, 0x28, 0x68, + 0x00, 0xf0, 0x1b, 0xfa, 0x02, 0x20, 0xe4, 0xf7, 0xe5, 0xfa, 0x30, 0xe0, + 0x07, 0x28, 0xe7, 0xd0, 0xa8, 0x6a, 0xce, 0xf7, 0xe7, 0xf9, 0x01, 0x28, + 0x0b, 0xd1, 0x28, 0x46, 0x00, 0xf0, 0x4e, 0xf9, 0x80, 0xb3, 0x28, 0x46, + 0x00, 0xf0, 0xf1, 0xf8, 0x01, 0x27, 0x5f, 0xea, 0x00, 0x08, 0xde, 0xd1, + 0xd7, 0xe7, 0x70, 0x68, 0x00, 0x99, 0x81, 0x42, 0x24, 0xd2, 0xff, 0xf7, + 0x9b, 0xff, 0x0f, 0xf2, 0x5c, 0x52, 0x00, 0xf0, 0x29, 0xf8, 0x28, 0x68, + 0x00, 0x21, 0xff, 0xf7, 0x90, 0xff, 0x01, 0x27, 0x00, 0x28, 0x40, 0xf2, + 0x06, 0x28, 0xca, 0xd0, 0xff, 0xf7, 0x8c, 0xff, 0x0f, 0xf2, 0x54, 0x52, + 0x00, 0xf0, 0x1a, 0xf8, 0x40, 0xf2, 0x0d, 0x28, 0xc1, 0xe7, 0x03, 0x2c, + 0x02, 0xd0, 0xa9, 0x69, 0x48, 0x7a, 0x38, 0xb9, 0xa9, 0x6b, 0xe8, 0x69, + 0x14, 0x22, 0xcb, 0xf7, 0x39, 0xff, 0xe9, 0x69, 0x68, 0x69, 0x08, 0x60, + 0xcb, 0xf8, 0x00, 0x80, 0x38, 0x46, 0xbd, 0xe8, 0xf2, 0x8f, 0x01, 0x90, + 0x00, 0x96, 0x3a, 0x46, 0x23, 0x68, 0x02, 0x21, 0x01, 0x20, 0xda, 0xf7, + 0xce, 0xb8, 0x2d, 0xe9, 0xf8, 0x43, 0x06, 0x46, 0x01, 0x21, 0x00, 0xf0, + 0x57, 0xf9, 0xb0, 0x69, 0x0f, 0xf2, 0x24, 0x59, 0x01, 0x7e, 0xb0, 0x6a, + 0x49, 0x1e, 0x89, 0x41, 0xc9, 0x0f, 0xce, 0xf7, 0x71, 0xfc, 0x03, 0x21, + 0x30, 0x46, 0x00, 0xf0, 0x61, 0xf9, 0x4f, 0xf0, 0x00, 0x08, 0x04, 0x46, + 0x06, 0xf1, 0x40, 0x07, 0x06, 0xf1, 0x3d, 0x05, 0x00, 0x2c, 0x3b, 0xd1, + 0xf4, 0xf7, 0x0a, 0xfb, 0x10, 0xb1, 0x4f, 0xf0, 0x00, 0x48, 0x35, 0xe0, + 0xb0, 0x6a, 0xce, 0xf7, 0x7d, 0xf9, 0x04, 0x46, 0x01, 0x2c, 0x05, 0xd1, + 0x30, 0x46, 0x00, 0xf0, 0xe3, 0xf8, 0xf0, 0xb9, 0x00, 0x24, 0x00, 0xe0, + 0xdc, 0xb9, 0x30, 0x46, 0x00, 0xf0, 0x47, 0xf9, 0x28, 0x78, 0x00, 0x90, + 0x4a, 0x46, 0x33, 0x68, 0x34, 0x21, 0x04, 0x20, 0xda, 0xf7, 0x93, 0xf8, + 0x28, 0x78, 0x10, 0x28, 0x1d, 0xd0, 0x07, 0x28, 0x2e, 0xd0, 0x0d, 0x28, + 0x09, 0xd1, 0xb0, 0x69, 0x41, 0x68, 0x38, 0x69, 0xe9, 0xf7, 0x7e, 0xfc, + 0x01, 0x28, 0x02, 0xd1, 0x78, 0x6e, 0x40, 0x1c, 0x78, 0x66, 0x68, 0x78, + 0x02, 0x28, 0xcb, 0xd1, 0x38, 0x68, 0xe3, 0xf7, 0x05, 0xff, 0xb8, 0x60, + 0xb1, 0x69, 0x0a, 0x68, 0x90, 0x42, 0xc3, 0xd3, 0x40, 0xf2, 0x0e, 0x28, + 0x28, 0x78, 0x10, 0x28, 0x04, 0xd1, 0x31, 0x6a, 0xc8, 0x6a, 0x00, 0xb1, + 0x40, 0x1e, 0xc8, 0x62, 0x28, 0x78, 0x10, 0x28, 0x18, 0xbf, 0x07, 0x28, + 0x08, 0xd0, 0x05, 0x21, 0x30, 0x46, 0x00, 0xf0, 0x0b, 0xf9, 0x04, 0x43, + 0xb0, 0x6a, 0xce, 0xf7, 0x35, 0xf9, 0x04, 0x43, 0x01, 0x2c, 0x03, 0xd1, + 0x30, 0x46, 0x00, 0xf0, 0x42, 0xf8, 0x80, 0x46, 0xb8, 0xf1, 0x00, 0x0f, + 0x15, 0xd1, 0x02, 0xe0, 0x28, 0x20, 0xe8, 0xf7, 0x2d, 0xfc, 0xb0, 0x6a, + 0xce, 0xf7, 0x0e, 0xfc, 0x68, 0xb1, 0xb0, 0x6a, 0xce, 0xf7, 0x0e, 0xfc, + 0x38, 0x6f, 0x40, 0x1c, 0x38, 0x67, 0xb0, 0x6a, 0xce, 0xf7, 0x04, 0xfc, + 0x18, 0xb1, 0xf4, 0xf7, 0x9d, 0xfa, 0x00, 0x28, 0xea, 0xd0, 0xb1, 0x6b, + 0x30, 0x6a, 0x14, 0x22, 0xcb, 0xf7, 0x96, 0xfe, 0x31, 0x6a, 0x70, 0x69, + 0x08, 0x60, 0x40, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0x81, 0x68, 0x00, 0x22, + 0xb9, 0xb1, 0xc1, 0x68, 0x01, 0x29, 0x06, 0xd0, 0x02, 0x29, 0x07, 0xd0, + 0x04, 0x29, 0x08, 0xd0, 0x08, 0x29, 0x09, 0xd0, 0x0b, 0xe0, 0x40, 0xf2, + 0x01, 0x22, 0x0a, 0xe0, 0x40, 0xf2, 0x02, 0x22, 0x07, 0xe0, 0x40, 0xf2, + 0x03, 0x22, 0x04, 0xe0, 0x4f, 0xf4, 0x01, 0x72, 0x01, 0xe0, 0x40, 0xf2, + 0x09, 0x22, 0x42, 0x61, 0x70, 0x47, 0xfe, 0xb5, 0x04, 0x46, 0x01, 0x20, + 0xe1, 0x68, 0x21, 0x61, 0xa0, 0x60, 0x94, 0xf8, 0x3e, 0x10, 0xa0, 0x6a, + 0x02, 0x29, 0x06, 0xd1, 0x22, 0x6a, 0x02, 0xf1, 0x14, 0x01, 0xce, 0xf7, + 0x83, 0xf9, 0x20, 0x6a, 0x04, 0xe0, 0xe1, 0x69, 0x14, 0x31, 0xce, 0xf7, + 0x7d, 0xf9, 0xe0, 0x69, 0x40, 0x69, 0x0f, 0xf2, 0xa8, 0x37, 0xe0, 0x60, + 0x94, 0xf8, 0x3e, 0x00, 0x02, 0x28, 0x0c, 0xbf, 0x20, 0x6a, 0xe0, 0x69, + 0x00, 0xf1, 0x14, 0x05, 0x00, 0x26, 0x05, 0xeb, 0x86, 0x00, 0x40, 0x68, + 0x08, 0xb1, 0xff, 0xf7, 0x18, 0xff, 0x76, 0x1c, 0x01, 0x2e, 0xf6, 0xd9, + 0xe8, 0x68, 0x28, 0xb1, 0x01, 0x90, 0x00, 0x20, 0x00, 0xf0, 0x6e, 0xf8, + 0xff, 0xf7, 0x12, 0xff, 0x00, 0x26, 0x0f, 0xf2, 0xac, 0x37, 0x05, 0xf1, + 0x10, 0x00, 0x50, 0xf8, 0x26, 0x00, 0x08, 0xb1, 0xff, 0xf7, 0x03, 0xff, + 0x76, 0x1c, 0x01, 0x2e, 0xf5, 0xd9, 0xa1, 0x69, 0x88, 0x7a, 0x18, 0xb1, + 0xa0, 0x6a, 0xce, 0xf7, 0x72, 0xf9, 0x03, 0xe0, 0xe0, 0x68, 0x21, 0x69, + 0x88, 0x42, 0x02, 0xd0, 0x20, 0x46, 0xff, 0xf7, 0x93, 0xff, 0xa0, 0x69, + 0xc1, 0x7a, 0x01, 0x29, 0x04, 0xbf, 0x00, 0x20, 0x60, 0x61, 0x60, 0x69, + 0xfe, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x04, 0x46, 0x88, 0xb0, 0xa0, 0x6a, + 0xc7, 0xa6, 0x02, 0xa9, 0xce, 0xf7, 0x32, 0xf9, 0x00, 0x25, 0x00, 0x27, + 0x02, 0xa8, 0x00, 0xeb, 0x87, 0x01, 0x49, 0x68, 0x41, 0xb1, 0xa2, 0x69, + 0xd0, 0x68, 0x31, 0xea, 0x00, 0x00, 0x18, 0xbf, 0x01, 0x25, 0x01, 0xd1, + 0x00, 0xf0, 0x27, 0xf8, 0x7f, 0x1c, 0x01, 0x2f, 0xee, 0xd9, 0x05, 0x99, + 0x59, 0xb1, 0xa2, 0x69, 0x10, 0x69, 0x31, 0xea, 0x00, 0x00, 0x18, 0xbf, + 0x01, 0x25, 0x04, 0xd1, 0x01, 0x91, 0x00, 0xf0, 0x21, 0xf8, 0x00, 0xf0, + 0x1b, 0xf8, 0x00, 0x27, 0xc4, 0xa6, 0x02, 0xa8, 0x00, 0xeb, 0x87, 0x01, + 0x09, 0x69, 0x41, 0xb1, 0xa2, 0x69, 0x50, 0x69, 0x31, 0xea, 0x00, 0x00, + 0x18, 0xbf, 0x01, 0x25, 0x01, 0xd1, 0x00, 0xf0, 0x06, 0xf8, 0x7f, 0x1c, + 0x01, 0x2f, 0xee, 0xd9, 0x28, 0x46, 0x09, 0xb0, 0xf0, 0xbd, 0x01, 0x91, + 0x00, 0x97, 0x32, 0x46, 0x23, 0x68, 0x02, 0x21, 0x02, 0x20, 0xd9, 0xf7, + 0x78, 0xbf, 0x00, 0x00, 0x00, 0x90, 0x02, 0x21, 0xd4, 0xf8, 0x00, 0x30, + 0xab, 0xa2, 0x70, 0x47, 0x38, 0xb5, 0x05, 0x46, 0x05, 0xf1, 0x40, 0x04, + 0x00, 0x20, 0x60, 0x66, 0xa8, 0x60, 0xe8, 0x60, 0x68, 0x61, 0x21, 0xb9, + 0x01, 0x20, 0x85, 0xf8, 0x3e, 0x00, 0x61, 0x60, 0x31, 0xbd, 0xe3, 0xf7, + 0xb5, 0xfd, 0x20, 0x60, 0x00, 0x21, 0x02, 0x20, 0x85, 0xf8, 0x3e, 0x00, + 0xa1, 0x60, 0x31, 0xbd, 0x28, 0x30, 0x01, 0x75, 0x00, 0x68, 0xce, 0xf7, + 0xb1, 0xb8, 0x10, 0xb5, 0x00, 0xf1, 0x28, 0x04, 0x20, 0x68, 0xce, 0xf7, + 0xbc, 0xf8, 0x60, 0x75, 0x10, 0xbd, 0x38, 0xb5, 0x04, 0x46, 0x00, 0x25, + 0x94, 0xf8, 0x3f, 0x00, 0x10, 0xbb, 0x20, 0x68, 0x00, 0x22, 0x01, 0x21, + 0x03, 0xf0, 0xcc, 0xf9, 0x20, 0x68, 0x58, 0x49, 0xc0, 0xb2, 0xe2, 0xf7, + 0xa1, 0xfa, 0x20, 0x68, 0x00, 0x23, 0x00, 0x22, 0x01, 0x21, 0xe6, 0xf7, + 0x47, 0xfa, 0x05, 0x46, 0x20, 0x68, 0xc0, 0xb2, 0xe2, 0xf7, 0x77, 0xfa, + 0x02, 0x20, 0xe4, 0xf7, 0xfb, 0xf8, 0xa0, 0x6a, 0x01, 0x21, 0xce, 0xf7, + 0xdd, 0xfa, 0xa0, 0x6a, 0x01, 0x21, 0xce, 0xf7, 0xdf, 0xfa, 0x01, 0x20, + 0x84, 0xf8, 0x3f, 0x00, 0x28, 0x46, 0x32, 0xbd, 0x70, 0xb5, 0x04, 0x46, + 0x04, 0xf1, 0x3e, 0x06, 0x00, 0x25, 0x70, 0x78, 0x01, 0x28, 0x16, 0xd1, + 0x20, 0x68, 0x00, 0x23, 0x00, 0x22, 0x01, 0x21, 0xe6, 0xf7, 0x2d, 0xfa, + 0x05, 0x46, 0xa0, 0x6a, 0x00, 0x21, 0xce, 0xf7, 0xc7, 0xfa, 0x20, 0x68, + 0x00, 0xf0, 0x0b, 0xf8, 0x00, 0x20, 0x30, 0x70, 0x01, 0x22, 0x20, 0x68, + 0x00, 0x21, 0x03, 0xf0, 0x8f, 0xf9, 0x00, 0x20, 0x70, 0x70, 0x28, 0x46, + 0x70, 0xbd, 0x38, 0x49, 0xc0, 0xb2, 0xe2, 0xf7, 0x76, 0xba, 0x00, 0x00, + 0x3e, 0xb5, 0x04, 0x46, 0x00, 0x20, 0x84, 0xf8, 0x3e, 0x00, 0xa0, 0x60, + 0xc4, 0xf8, 0xb0, 0x00, 0x40, 0xf2, 0x54, 0x60, 0x63, 0x68, 0x2d, 0x4a, + 0x01, 0x46, 0x58, 0x43, 0x13, 0x18, 0x03, 0xf1, 0x60, 0x00, 0xde, 0xf7, + 0xaf, 0xf8, 0xe0, 0x6a, 0xd5, 0xf7, 0xb7, 0xf9, 0x2b, 0x48, 0x22, 0x78, + 0x01, 0x68, 0xe5, 0x6a, 0x0a, 0x44, 0xe0, 0x20, 0x92, 0xf8, 0xbc, 0x30, + 0x43, 0x43, 0x10, 0x22, 0xc8, 0x18, 0x00, 0x21, 0x69, 0x70, 0x2a, 0x70, + 0xc4, 0x30, 0x25, 0x49, 0xa9, 0x60, 0xdf, 0xed, 0x1d, 0x0a, 0x01, 0x69, + 0x00, 0xee, 0x10, 0x1a, 0xb8, 0xee, 0x40, 0x0a, 0x20, 0xee, 0x20, 0x0a, + 0x85, 0xed, 0x01, 0x0a, 0x05, 0xf1, 0x0c, 0x00, 0xd8, 0xf7, 0xd2, 0xfd, + 0x05, 0xf1, 0x10, 0x00, 0xd8, 0xf7, 0xd3, 0xfd, 0x69, 0x46, 0x40, 0xf6, + 0xff, 0x70, 0xcb, 0xf7, 0x0a, 0xfc, 0x00, 0x28, 0x03, 0xbf, 0xbd, 0xf9, + 0x00, 0x00, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0xc0, 0x0a, 0x9f, 0xed, + 0x0e, 0x0a, 0x85, 0xed, 0x05, 0x0a, 0x20, 0x68, 0x12, 0x49, 0x13, 0x4b, + 0x51, 0xf8, 0x20, 0x20, 0x02, 0x92, 0x53, 0xf8, 0x30, 0x00, 0x01, 0x90, + 0xa1, 0x6b, 0x00, 0x91, 0x63, 0x6b, 0x22, 0x6b, 0xe1, 0x6a, 0x60, 0x6a, + 0xd5, 0xf7, 0x4a, 0xf9, 0x61, 0x6a, 0xa0, 0x6a, 0xcd, 0xf7, 0xf0, 0xfe, + 0x00, 0x20, 0x3e, 0xbd, 0x00, 0x00, 0x7a, 0x44, 0x00, 0x00, 0x0c, 0x42, + 0x98, 0x1c, 0x03, 0x20, 0xc0, 0x77, 0x02, 0x20, 0x04, 0x5a, 0x02, 0x20, + 0x74, 0x77, 0x02, 0x20, 0xb4, 0x76, 0x02, 0x20, 0x52, 0xb8, 0x96, 0x40, + 0xc8, 0x98, 0x04, 0x01, 0x08, 0x8f, 0x04, 0x01, 0x2d, 0x2d, 0x2d, 0x3e, + 0x20, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, + 0x25, 0x64, 0x0a, 0x00, 0x41, 0x64, 0x63, 0x52, 0x78, 0x3a, 0x20, 0x63, + 0x68, 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x78, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x2d, 0x2d, 0x2d, 0x3e, 0x20, 0x52, 0x78, 0x49, + 0x6e, 0x69, 0x74, 0x41, 0x3a, 0x20, 0x72, 0x65, 0x67, 0x46, 0x61, 0x69, + 0x6c, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x25, 0x64, 0x0a, 0x00, + 0x2d, 0x2d, 0x2d, 0x3e, 0x20, 0x52, 0x78, 0x49, 0x6e, 0x69, 0x74, 0x42, + 0x20, 0x72, 0x65, 0x67, 0x46, 0x61, 0x69, 0x6c, 0x3a, 0x20, 0x63, 0x68, + 0x25, 0x64, 0x2c, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x52, 0x78, 0x49, 0x6e, + 0x69, 0x74, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x54, 0x4f, + 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x2d, 0x2d, 0x3e, + 0x20, 0x52, 0x78, 0x54, 0x4f, 0x20, 0x72, 0x65, 0x67, 0x46, 0x61, 0x69, + 0x6c, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x25, 0x64, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x52, 0x78, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, + 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x41, 0x64, 0x63, 0x52, + 0x78, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x53, 0x54, 0x47, + 0x31, 0x5b, 0x25, 0x64, 0x5d, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x78, + 0x0a, 0x00, 0x00, 0x00, 0x41, 0x64, 0x63, 0x52, 0x78, 0x3a, 0x20, 0x63, + 0x68, 0x25, 0x64, 0x2c, 0x20, 0x53, 0x54, 0x47, 0x56, 0x5b, 0x25, 0x64, + 0x5d, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x00, + 0x41, 0x64, 0x63, 0x52, 0x78, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, + 0x20, 0x44, 0x52, 0x46, 0x5b, 0x25, 0x64, 0x5d, 0x20, 0x65, 0x72, 0x72, + 0x20, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x00, 0xf0, + 0x7d, 0xa5, 0x00, 0x02, 0xdf, 0xf8, 0x00, 0xf0, 0x3b, 0x29, 0x00, 0x02, + 0xdf, 0xf8, 0x00, 0xf0, 0x2d, 0xa5, 0x00, 0x02, 0xdf, 0xf8, 0x00, 0xf0, + 0xa3, 0x28, 0x00, 0x02, 0xdf, 0xf8, 0x00, 0xf0, 0xa9, 0x28, 0x00, 0x02, + 0x2d, 0xe9, 0xf0, 0x43, 0x05, 0x46, 0x93, 0xb0, 0xdf, 0xf8, 0x10, 0x15, + 0x2b, 0x78, 0x0a, 0x68, 0x70, 0x20, 0x43, 0x43, 0xd0, 0x18, 0x00, 0xf5, + 0x32, 0x66, 0x68, 0x68, 0x00, 0x24, 0x00, 0x28, 0x40, 0xf2, 0x1d, 0x38, + 0x7d, 0xd1, 0xdf, 0xf8, 0xf8, 0x04, 0xdf, 0xf8, 0xf8, 0x34, 0xdf, 0xf8, + 0xf8, 0x94, 0x44, 0x60, 0x00, 0xf1, 0x18, 0x01, 0x01, 0x60, 0x00, 0xf5, + 0x15, 0x72, 0x00, 0xf1, 0x80, 0x01, 0x00, 0xf5, 0x59, 0x77, 0x81, 0x60, + 0xc2, 0x60, 0x43, 0x61, 0x07, 0x61, 0x18, 0x30, 0x28, 0x62, 0x69, 0x62, + 0x2f, 0x63, 0x09, 0xf1, 0x04, 0x00, 0xa8, 0x61, 0x09, 0xf1, 0x20, 0x01, + 0x05, 0xf1, 0x36, 0x07, 0xaa, 0x62, 0xeb, 0x62, 0xe9, 0x61, 0x00, 0x20, + 0x78, 0x70, 0x05, 0xf1, 0xa4, 0x01, 0xe8, 0x60, 0x00, 0x22, 0x00, 0x23, + 0x84, 0x46, 0x81, 0xe8, 0x0d, 0x10, 0x28, 0x68, 0xc0, 0xb2, 0xe8, 0xf7, + 0x04, 0xff, 0xb1, 0x68, 0x99, 0xf8, 0x00, 0x30, 0x68, 0x6a, 0x01, 0x22, + 0xff, 0xf7, 0xa2, 0xff, 0x28, 0x68, 0x30, 0xb9, 0xb3, 0x68, 0x0f, 0xf2, + 0x24, 0x72, 0x03, 0x21, 0x03, 0x20, 0xd9, 0xf7, 0x94, 0xfd, 0x00, 0xf0, + 0xf2, 0xf8, 0x00, 0x26, 0x00, 0xf0, 0xe0, 0xf8, 0x03, 0x20, 0x00, 0x90, + 0x05, 0xf1, 0x50, 0x03, 0x00, 0x22, 0x00, 0x21, 0x01, 0x20, 0xe8, 0xf7, + 0xc7, 0xff, 0xe8, 0x64, 0x00, 0x21, 0xe9, 0xf7, 0x79, 0xf9, 0x28, 0x68, + 0xdf, 0xf8, 0x5c, 0x14, 0xc0, 0xb2, 0xe8, 0xf7, 0x5d, 0xfe, 0x28, 0x68, + 0x31, 0x46, 0xcc, 0xf7, 0xd1, 0xfa, 0x76, 0x1c, 0x04, 0x2e, 0xf8, 0xd3, + 0x28, 0x6a, 0x03, 0xa9, 0xfd, 0xf7, 0x00, 0xfa, 0x01, 0x28, 0x02, 0xd0, + 0x02, 0x20, 0x38, 0x70, 0x03, 0xe0, 0x00, 0xf0, 0x76, 0xf9, 0x04, 0x00, + 0x0a, 0xd1, 0x00, 0xf0, 0xc2, 0xf8, 0x38, 0xb1, 0x00, 0xf0, 0xb0, 0xf8, + 0x0f, 0xf2, 0xc8, 0x62, 0x03, 0x20, 0xd9, 0xf7, 0x5e, 0xfd, 0x44, 0x46, + 0x28, 0x68, 0x01, 0x22, 0x0c, 0x21, 0x00, 0xf0, 0xa9, 0xfa, 0x3c, 0xb9, + 0x18, 0xe0, 0x4f, 0xf6, 0x52, 0x74, 0x03, 0x22, 0x21, 0x46, 0x01, 0x20, + 0xe7, 0xf7, 0xc6, 0xf8, 0x00, 0x94, 0x03, 0x21, 0x2b, 0x68, 0x0f, 0xf2, + 0xb4, 0x62, 0x01, 0x20, 0xd9, 0xf7, 0x47, 0xfd, 0x03, 0x27, 0x44, 0x45, + 0x08, 0xbf, 0x01, 0x27, 0x3a, 0x46, 0x4f, 0xf4, 0x45, 0x71, 0x01, 0x20, + 0xe7, 0xf7, 0xb4, 0xf8, 0x28, 0x68, 0xdf, 0xf8, 0xd8, 0x13, 0xc0, 0xb2, + 0xe8, 0xf7, 0x18, 0xfe, 0x13, 0xb0, 0xbd, 0xe8, 0xf0, 0x83, 0x2d, 0xe9, + 0xf8, 0x41, 0x93, 0xb0, 0x05, 0x46, 0x00, 0x21, 0x00, 0xf0, 0xcf, 0xfa, + 0x28, 0x46, 0x00, 0xf0, 0xe9, 0xfa, 0x00, 0x27, 0x04, 0x00, 0x05, 0xf1, + 0x36, 0x06, 0x3f, 0xd1, 0x28, 0x68, 0xdf, 0xf8, 0x94, 0x23, 0x5f, 0xfa, + 0x80, 0xfc, 0x13, 0x68, 0x70, 0x21, 0x11, 0xfb, 0x0c, 0xfc, 0x03, 0xeb, + 0x0c, 0x01, 0x01, 0xf5, 0x32, 0x68, 0xc0, 0xb2, 0xe8, 0xf7, 0x75, 0xfe, + 0x68, 0x69, 0x43, 0x7c, 0xdf, 0xf8, 0x7c, 0x03, 0x01, 0x78, 0x8b, 0x42, + 0x06, 0xd0, 0x03, 0x70, 0xd8, 0xf8, 0x08, 0x10, 0x68, 0x6a, 0x01, 0x22, + 0xff, 0xf7, 0x0c, 0xff, 0x00, 0xf0, 0x65, 0xf8, 0x00, 0xf0, 0x54, 0xf8, + 0x28, 0x6a, 0x03, 0xa9, 0xfd, 0xf7, 0x8e, 0xf9, 0x01, 0x28, 0x04, 0xd1, + 0x28, 0x46, 0x00, 0xf0, 0x13, 0xfa, 0x04, 0x46, 0x01, 0xe0, 0x02, 0x20, + 0x30, 0x70, 0x7c, 0xb9, 0x29, 0x68, 0xdf, 0xf8, 0x4c, 0x03, 0x00, 0xeb, + 0x41, 0x02, 0x10, 0x8b, 0x01, 0x04, 0x07, 0xd5, 0x8d, 0xf8, 0x00, 0x00, + 0x6a, 0x46, 0x28, 0x6a, 0x02, 0x21, 0xff, 0xf7, 0xef, 0xfe, 0x07, 0x46, + 0x01, 0x20, 0xe8, 0xf7, 0xbd, 0xf8, 0x2c, 0xbb, 0x00, 0xf0, 0x3b, 0xf8, + 0x48, 0xb1, 0x00, 0xf0, 0x29, 0xf8, 0x0f, 0xf2, 0xec, 0x52, 0x01, 0x20, + 0xd9, 0xf7, 0xd7, 0xfc, 0x40, 0xf2, 0x1d, 0x34, 0x19, 0xe0, 0xe8, 0x6c, + 0x00, 0x21, 0xe9, 0xf7, 0xc7, 0xf8, 0x01, 0x20, 0xb0, 0x70, 0x01, 0x22, + 0x02, 0x21, 0x00, 0xf0, 0x86, 0xf9, 0x07, 0x43, 0x01, 0x2f, 0x03, 0xd1, + 0x00, 0xf0, 0xd1, 0xf8, 0x04, 0x00, 0x07, 0xd1, 0x68, 0x69, 0x01, 0x7c, + 0x01, 0x29, 0x07, 0xd1, 0x28, 0x68, 0xe8, 0xf7, 0x05, 0xfe, 0x04, 0x46, + 0x14, 0xb1, 0x28, 0x46, 0x00, 0xf0, 0x94, 0xfa, 0x20, 0x46, 0x14, 0xb0, + 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x90, 0x03, 0x21, 0x2b, 0x68, 0x70, 0x47, + 0x53, 0xf8, 0x20, 0x00, 0x01, 0x90, 0x03, 0xa8, 0x29, 0x6b, 0x00, 0x91, + 0xeb, 0x6a, 0xaa, 0x6a, 0x69, 0x6a, 0xff, 0xf7, 0xb1, 0xbe, 0x28, 0x68, + 0xc0, 0xb2, 0xe8, 0xf7, 0x1f, 0xbe, 0x28, 0x68, 0xa9, 0x49, 0xaa, 0x4b, + 0x51, 0xf8, 0x20, 0x20, 0x02, 0x92, 0x70, 0x47, 0x2d, 0xe9, 0xfc, 0x47, + 0x05, 0x46, 0x95, 0xf8, 0x36, 0xa0, 0x28, 0x6a, 0x89, 0x46, 0xfd, 0xf7, + 0x23, 0xf9, 0x80, 0x46, 0x28, 0x46, 0xca, 0xf7, 0x23, 0xfd, 0x05, 0xf1, + 0x3c, 0x06, 0x00, 0x24, 0x30, 0x68, 0xe3, 0xf7, 0x0f, 0xfb, 0x70, 0x60, + 0x00, 0x27, 0x95, 0xf8, 0x36, 0x10, 0x8a, 0x45, 0x18, 0xbf, 0xf0, 0x60, + 0xf3, 0xf7, 0xd8, 0xfe, 0x10, 0xb1, 0x4f, 0xf0, 0x00, 0x44, 0x05, 0xe0, + 0x95, 0xf8, 0x36, 0x00, 0x08, 0x28, 0x18, 0xbf, 0x0f, 0x28, 0x01, 0xd1, + 0x01, 0x27, 0x25, 0xe0, 0x69, 0x69, 0x48, 0x7b, 0xc8, 0xb9, 0x70, 0x68, + 0x09, 0x68, 0x81, 0x42, 0x15, 0xd2, 0xff, 0xf7, 0xb5, 0xff, 0x0f, 0xf2, + 0x24, 0x52, 0x02, 0x20, 0xd9, 0xf7, 0x63, 0xfc, 0xff, 0xf7, 0xbd, 0xff, + 0x40, 0xf2, 0x15, 0x34, 0x01, 0x27, 0x40, 0xb1, 0xff, 0xf7, 0xa8, 0xff, + 0x0f, 0xf2, 0x1c, 0x52, 0x01, 0x20, 0xd9, 0xf7, 0x56, 0xfc, 0x40, 0xf2, + 0x1d, 0x34, 0x95, 0xf8, 0x36, 0x00, 0x04, 0x28, 0x04, 0xd1, 0x00, 0x21, + 0x28, 0x46, 0x00, 0xf0, 0xaf, 0xf9, 0x04, 0x46, 0xb8, 0xf1, 0x01, 0x0f, + 0x04, 0xd1, 0x00, 0xf0, 0x52, 0xf8, 0x04, 0x00, 0x2d, 0xd1, 0x00, 0xe0, + 0x6c, 0xbb, 0x68, 0x69, 0x01, 0x7c, 0x01, 0x29, 0x29, 0xd1, 0xd6, 0xf8, + 0x78, 0x80, 0x28, 0x68, 0x00, 0x24, 0xe8, 0xf7, 0x14, 0xfe, 0x80, 0x45, + 0xb0, 0x67, 0x1d, 0xd1, 0x28, 0x68, 0x05, 0xf1, 0xa4, 0x01, 0xe8, 0xf7, + 0xf0, 0xfd, 0x2b, 0x68, 0x0f, 0xf2, 0xe4, 0x42, 0x03, 0x21, 0x01, 0x20, + 0xd9, 0xf7, 0x29, 0xfc, 0x69, 0x69, 0x88, 0x7b, 0x60, 0xb1, 0x95, 0xf8, + 0xbd, 0x00, 0x0a, 0x28, 0x08, 0xd2, 0x40, 0x1c, 0x85, 0xf8, 0xbd, 0x00, + 0x01, 0x21, 0x28, 0x68, 0xe8, 0xf7, 0x64, 0xfd, 0x04, 0x46, 0x01, 0xe0, + 0x4f, 0xf4, 0x47, 0x74, 0x0c, 0xb1, 0x01, 0x27, 0x01, 0xe0, 0x38, 0x00, + 0x18, 0xd0, 0x28, 0x46, 0x00, 0xf0, 0xec, 0xf9, 0x04, 0xb9, 0x04, 0x46, + 0x68, 0x69, 0x01, 0x7c, 0x01, 0x29, 0x05, 0xd1, 0x28, 0x68, 0x00, 0x21, + 0xe8, 0xf7, 0x4e, 0xfd, 0x04, 0xb9, 0x04, 0x46, 0x29, 0x6b, 0xa8, 0x69, + 0x14, 0x22, 0xcb, 0xf7, 0x59, 0xfa, 0xa8, 0x69, 0x29, 0x69, 0x01, 0x60, + 0xaa, 0x68, 0x42, 0x61, 0xc9, 0xf8, 0x00, 0x40, 0x38, 0x46, 0xbd, 0xe8, + 0xf6, 0x87, 0x28, 0x46, 0x0a, 0xe1, 0x2d, 0xe9, 0xfe, 0x43, 0x05, 0x46, + 0x69, 0x46, 0x06, 0x20, 0xfa, 0xf7, 0xc1, 0xf9, 0x01, 0x21, 0x28, 0x46, + 0x00, 0xf0, 0x89, 0xf9, 0x4f, 0x48, 0x29, 0x68, 0x30, 0xf8, 0x11, 0x00, + 0x00, 0x26, 0x01, 0x04, 0x07, 0xd5, 0x8d, 0xf8, 0x04, 0x00, 0x01, 0xaa, + 0x28, 0x6a, 0x02, 0x21, 0xff, 0xf7, 0xe2, 0xfd, 0x06, 0x46, 0x05, 0xf1, + 0x3c, 0x07, 0x00, 0x21, 0x38, 0x69, 0xe8, 0xf7, 0xc9, 0xff, 0x28, 0x68, + 0x00, 0x21, 0xe8, 0xf7, 0x26, 0xfd, 0x04, 0x46, 0x00, 0x98, 0xe6, 0xf7, + 0xa3, 0xf8, 0x4f, 0xf0, 0x00, 0x48, 0x28, 0xb9, 0xf3, 0xf7, 0x20, 0xfe, + 0x00, 0x28, 0x59, 0xd0, 0x44, 0x46, 0x57, 0xe0, 0x00, 0x2c, 0x53, 0xd1, + 0x0a, 0x20, 0xe3, 0xf7, 0x89, 0xfd, 0x28, 0x68, 0xc0, 0xb2, 0xe8, 0xf7, + 0xf0, 0xfc, 0x01, 0x28, 0x4c, 0xd0, 0x02, 0x22, 0x00, 0xf0, 0x6e, 0xf8, + 0x06, 0x43, 0x30, 0x00, 0x26, 0xd1, 0x00, 0x2c, 0x34, 0xd1, 0x28, 0x6a, + 0xfd, 0xf7, 0x3e, 0xf8, 0x06, 0x46, 0xf3, 0xf7, 0x03, 0xfe, 0x28, 0xbb, + 0x78, 0x6e, 0x48, 0xb9, 0x03, 0x22, 0x00, 0xf0, 0x5d, 0xf8, 0x81, 0x46, + 0x28, 0x6a, 0xfd, 0xf7, 0x31, 0xf8, 0x40, 0xea, 0x09, 0x00, 0x06, 0x43, + 0x28, 0x46, 0xca, 0xf7, 0x2f, 0xfc, 0x95, 0xf8, 0x36, 0x00, 0x0a, 0x28, + 0x04, 0xd1, 0x01, 0x21, 0x28, 0x46, 0x00, 0xf0, 0xf3, 0xf8, 0x04, 0x46, + 0x95, 0xf8, 0x36, 0x00, 0x0d, 0x28, 0x2a, 0xd0, 0x0f, 0x28, 0xd6, 0xd1, + 0x00, 0x2c, 0x08, 0xbf, 0x01, 0x2e, 0x0b, 0xd1, 0xff, 0xf7, 0x8f, 0xff, + 0x04, 0x46, 0x07, 0xe0, 0x00, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x39, 0xf8, + 0x28, 0x6a, 0xfd, 0xf7, 0x0d, 0xf8, 0x44, 0x46, 0x38, 0x68, 0xe3, 0xf7, + 0xff, 0xf9, 0xb8, 0x60, 0x14, 0x22, 0x29, 0x6b, 0xe8, 0x69, 0xcb, 0xf7, + 0xcb, 0xf9, 0xe8, 0x69, 0x29, 0x69, 0x01, 0x60, 0xaa, 0x68, 0x42, 0x61, + 0xe6, 0xf7, 0x4f, 0xf8, 0x01, 0x21, 0x28, 0x68, 0xe8, 0xf7, 0xbd, 0xfc, + 0x04, 0xb9, 0x04, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0xfe, 0x83, 0xe9, 0x69, + 0x88, 0x69, 0x00, 0xb1, 0x40, 0x1e, 0x88, 0x61, 0xd0, 0xe7, 0x00, 0x00, + 0xb4, 0x76, 0x02, 0x20, 0x78, 0x49, 0x03, 0x20, 0xd8, 0x9d, 0x02, 0x20, + 0xe8, 0x3d, 0x00, 0x20, 0x7b, 0x00, 0x78, 0x00, 0x7f, 0x00, 0x78, 0x00, + 0x68, 0x8b, 0x00, 0x20, 0xbc, 0x9d, 0x04, 0x01, 0xc4, 0x9d, 0x04, 0x01, + 0x80, 0x8b, 0x00, 0x20, 0x03, 0x21, 0x28, 0x46, 0xca, 0xf7, 0xd2, 0xbb, + 0x10, 0xb5, 0x00, 0x21, 0x00, 0x22, 0x83, 0x68, 0xd3, 0x40, 0xdc, 0x07, + 0x04, 0xd4, 0x52, 0x1c, 0x20, 0x2a, 0xf8, 0xd3, 0x01, 0x61, 0x10, 0xbd, + 0x1b, 0x2a, 0x48, 0xd8, 0xdf, 0xe8, 0x02, 0xf0, 0x0e, 0x11, 0x14, 0x17, + 0x1a, 0x47, 0x47, 0x47, 0x1d, 0x20, 0x23, 0x26, 0x29, 0x47, 0x47, 0x47, + 0x2c, 0x2f, 0x32, 0x35, 0x38, 0x47, 0x47, 0x47, 0x3b, 0x3e, 0x41, 0x44, + 0x40, 0xf2, 0x01, 0x31, 0xe8, 0xe7, 0x40, 0xf2, 0x02, 0x31, 0xe5, 0xe7, + 0x40, 0xf2, 0x03, 0x31, 0xe2, 0xe7, 0x4f, 0xf4, 0x41, 0x71, 0xdf, 0xe7, + 0x40, 0xf2, 0x05, 0x31, 0xdc, 0xe7, 0x40, 0xf2, 0x06, 0x31, 0xd9, 0xe7, + 0x40, 0xf2, 0x07, 0x31, 0xd6, 0xe7, 0x4f, 0xf4, 0x42, 0x71, 0xd3, 0xe7, + 0x40, 0xf2, 0x09, 0x31, 0xd0, 0xe7, 0x40, 0xf2, 0x0a, 0x31, 0xcd, 0xe7, + 0x40, 0xf2, 0x0b, 0x31, 0xca, 0xe7, 0x4f, 0xf4, 0x43, 0x71, 0xc7, 0xe7, + 0x40, 0xf2, 0x0d, 0x31, 0xc4, 0xe7, 0x40, 0xf2, 0x0e, 0x31, 0xc1, 0xe7, + 0x40, 0xf2, 0x0f, 0x31, 0xbe, 0xe7, 0x4f, 0xf4, 0x44, 0x71, 0xbb, 0xe7, + 0x40, 0xf2, 0x11, 0x31, 0xb8, 0xe7, 0x40, 0xf2, 0x12, 0x31, 0xb5, 0xe7, + 0x40, 0xf2, 0x13, 0x31, 0xb2, 0xe7, 0x40, 0xf2, 0x17, 0x31, 0xaf, 0xe7, + 0x38, 0xb5, 0x04, 0x46, 0x00, 0x25, 0xa1, 0x68, 0x20, 0x6a, 0xe1, 0x60, + 0xff, 0xf7, 0xf0, 0xfc, 0x62, 0x69, 0x01, 0x46, 0xa1, 0x60, 0x10, 0x7b, + 0x18, 0xb1, 0x20, 0x6a, 0xff, 0xf7, 0xec, 0xfc, 0x02, 0xe0, 0xe0, 0x68, + 0x81, 0x42, 0x02, 0xd0, 0x20, 0x46, 0xff, 0xf7, 0x8f, 0xff, 0x20, 0x69, + 0x40, 0xf2, 0x01, 0x32, 0x81, 0x1a, 0x03, 0xd0, 0x49, 0x1f, 0x01, 0xd0, + 0x49, 0x1f, 0x01, 0xd1, 0x25, 0x61, 0x00, 0xe0, 0x05, 0x46, 0x60, 0x69, + 0x41, 0x7b, 0x01, 0x29, 0x08, 0xbf, 0x00, 0x25, 0x28, 0x46, 0x32, 0xbd, + 0x20, 0x30, 0x01, 0x75, 0x42, 0x75, 0x00, 0x68, 0xca, 0xf7, 0x40, 0xbb, + 0x10, 0xb5, 0x00, 0xf1, 0x20, 0x04, 0x20, 0x68, 0xca, 0xf7, 0x3e, 0xfb, + 0xa0, 0x75, 0x10, 0xbd, 0x38, 0xb5, 0x04, 0x46, 0x08, 0x46, 0x15, 0x46, + 0x6a, 0x46, 0x0d, 0xf1, 0x01, 0x01, 0xe8, 0xf7, 0x95, 0xfb, 0x9d, 0xf8, + 0x00, 0x20, 0x9d, 0xf8, 0x01, 0x10, 0x2b, 0x46, 0x20, 0x46, 0xe8, 0xf7, + 0x9f, 0xfb, 0x31, 0xbd, 0xf8, 0xb5, 0x04, 0x46, 0x0e, 0x46, 0xe3, 0xf7, + 0xed, 0xf8, 0x07, 0x46, 0x30, 0x00, 0x04, 0xf1, 0xa0, 0x05, 0x0a, 0xd0, + 0x60, 0x69, 0x41, 0x68, 0xe0, 0x6c, 0xe8, 0xf7, 0x85, 0xfe, 0x01, 0x28, + 0x03, 0xd1, 0x28, 0x68, 0x40, 0x1c, 0x28, 0x60, 0x23, 0xe0, 0xf3, 0xf7, + 0xe1, 0xfc, 0x00, 0xbb, 0x20, 0x68, 0xc0, 0xb2, 0xe8, 0xf7, 0xc1, 0xfb, + 0x01, 0x00, 0x13, 0xd1, 0x30, 0x00, 0x18, 0xd0, 0x38, 0x46, 0xe3, 0xf7, + 0x03, 0xf9, 0x61, 0x69, 0x8a, 0x68, 0x82, 0x42, 0xe2, 0xd2, 0x00, 0x22, + 0x05, 0x21, 0x20, 0x46, 0xca, 0xf7, 0x02, 0xfb, 0x20, 0x6a, 0xfc, 0xf7, + 0x01, 0xff, 0x40, 0xf2, 0x1e, 0x35, 0x0a, 0xe0, 0x29, 0x6a, 0x49, 0x1c, + 0x29, 0x62, 0x01, 0x46, 0x20, 0x68, 0xcb, 0xf7, 0xfb, 0xff, 0x20, 0x46, + 0xff, 0xf7, 0x7a, 0xff, 0x05, 0x46, 0x28, 0x46, 0xf2, 0xbd, 0x70, 0xb5, + 0x04, 0x46, 0x04, 0xf1, 0x38, 0x05, 0x00, 0x20, 0xa8, 0x66, 0xa0, 0x60, + 0x20, 0x61, 0x28, 0x70, 0x0e, 0x46, 0xe3, 0xf7, 0xa7, 0xf8, 0x68, 0x60, + 0x5e, 0xb9, 0x04, 0xf1, 0xbc, 0x00, 0x00, 0x21, 0x01, 0x70, 0xe9, 0x67, + 0x41, 0x60, 0xa9, 0x60, 0x20, 0x68, 0xbd, 0xe8, 0x70, 0x40, 0xe8, 0xf7, + 0x13, 0xbc, 0x00, 0x20, 0xe8, 0x60, 0x70, 0xbd, 0x10, 0xb5, 0x04, 0x46, + 0x00, 0x20, 0x94, 0xf8, 0x38, 0x10, 0xb1, 0xb9, 0x20, 0x68, 0x04, 0xf1, + 0x3b, 0x03, 0x04, 0xf1, 0x3a, 0x02, 0x04, 0xf1, 0x39, 0x01, 0xe8, 0xf7, + 0x56, 0xfb, 0x20, 0x68, 0x01, 0x22, 0x11, 0x21, 0xff, 0xf7, 0x7e, 0xff, + 0x20, 0x68, 0x00, 0x23, 0x00, 0x22, 0x01, 0x21, 0xe5, 0xf7, 0x88, 0xfd, + 0x01, 0x21, 0x84, 0xf8, 0x38, 0x10, 0x10, 0xbd, 0x70, 0xb5, 0x04, 0x46, + 0x04, 0xf1, 0x37, 0x06, 0x00, 0x25, 0x70, 0x78, 0x01, 0x28, 0x11, 0xd1, + 0xa1, 0x69, 0xa0, 0x68, 0x48, 0x61, 0x75, 0x70, 0x35, 0x70, 0x00, 0x23, + 0x20, 0x68, 0x00, 0x22, 0x01, 0x21, 0xe5, 0xf7, 0x8a, 0xfd, 0x05, 0x46, + 0x33, 0x79, 0xf2, 0x78, 0xb1, 0x78, 0x20, 0x68, 0xe8, 0xf7, 0x0a, 0xfb, + 0x28, 0x46, 0x70, 0xbd, 0x20, 0x20, 0x4f, 0x72, 0x78, 0x20, 0x41, 0x44, + 0x43, 0x20, 0x72, 0x61, 0x74, 0x65, 0x3a, 0x20, 0x25, 0x64, 0x0a, 0x00, + 0x2d, 0x2d, 0x2d, 0x3e, 0x20, 0x4f, 0x72, 0x78, 0x20, 0x76, 0x65, 0x72, + 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x25, 0x64, 0x0a, 0x00, + 0x41, 0x64, 0x63, 0x4f, 0x72, 0x78, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, + 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x00, + 0x2d, 0x2d, 0x2d, 0x3e, 0x20, 0x4f, 0x72, 0x78, 0x49, 0x6e, 0x69, 0x74, + 0x20, 0x72, 0x65, 0x67, 0x46, 0x61, 0x69, 0x6c, 0x3a, 0x20, 0x63, 0x68, + 0x25, 0x64, 0x2c, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x4f, 0x72, 0x78, 0x3a, + 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x54, 0x4f, 0x20, 0x25, 0x64, + 0x0a, 0x00, 0x00, 0x00, 0x2d, 0x2d, 0x2d, 0x3e, 0x20, 0x4f, 0x72, 0x78, + 0x54, 0x4f, 0x20, 0x72, 0x65, 0x67, 0x46, 0x61, 0x69, 0x6c, 0x3a, 0x20, + 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x00, + 0x4f, 0x72, 0x78, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x64, + 0x61, 0x63, 0x20, 0x73, 0x74, 0x75, 0x63, 0x6b, 0x0a, 0x00, 0x00, 0x00, + 0xdf, 0xf8, 0x00, 0xf0, 0x85, 0xad, 0x00, 0x02, 0xdf, 0xf8, 0x00, 0xf0, + 0x65, 0xad, 0x00, 0x02, 0xdf, 0xf8, 0x78, 0x17, 0x09, 0x68, 0x0a, 0x18, + 0xed, 0x20, 0x92, 0xf8, 0xbc, 0x30, 0x43, 0x43, 0xc8, 0x18, 0x00, 0xf2, + 0x44, 0x40, 0x70, 0x47, 0xf8, 0xb5, 0x04, 0x46, 0x20, 0x68, 0x65, 0x68, + 0xc0, 0xb2, 0xff, 0xf7, 0xed, 0xff, 0xff, 0x2d, 0x00, 0xf0, 0x98, 0x80, + 0x18, 0x21, 0xdf, 0xf8, 0x50, 0x27, 0x69, 0x43, 0x4f, 0xf4, 0x0d, 0x73, + 0x11, 0x44, 0x6b, 0x43, 0x00, 0x27, 0x1a, 0x44, 0x4f, 0x60, 0x02, 0xf1, + 0x60, 0x06, 0x4f, 0xf4, 0x13, 0x7c, 0x0e, 0x60, 0x0c, 0xfb, 0x05, 0xfc, + 0xdf, 0xf8, 0x30, 0x77, 0xbc, 0x44, 0x43, 0xf2, 0xf8, 0x5e, 0x02, 0xf1, + 0xc8, 0x03, 0x02, 0xf5, 0xfc, 0x76, 0x0c, 0xeb, 0x0e, 0x07, 0x02, 0xf5, + 0x07, 0x7c, 0x8b, 0x60, 0xce, 0x60, 0x4f, 0x61, 0xc1, 0xf8, 0x10, 0xc0, + 0x02, 0xf1, 0x60, 0x01, 0x21, 0x62, 0x63, 0x62, 0x1c, 0x21, 0xdf, 0xf8, + 0x08, 0x27, 0xa6, 0x62, 0x4d, 0x43, 0x51, 0x19, 0x0b, 0x1d, 0xa3, 0x61, + 0x01, 0xf1, 0x74, 0x05, 0x00, 0x21, 0x84, 0xf8, 0x37, 0x10, 0xe7, 0x62, + 0xe5, 0x61, 0x00, 0x23, 0x04, 0xf1, 0xa4, 0x01, 0xc4, 0xf8, 0x30, 0xc0, + 0xe3, 0x60, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x81, 0xe8, 0xe8, 0x00, + 0x00, 0xf1, 0xa7, 0x05, 0x12, 0x78, 0x29, 0x68, 0x60, 0x6a, 0xff, 0xf7, + 0x99, 0xff, 0x20, 0x68, 0x30, 0xb9, 0x2b, 0x68, 0x0f, 0xf2, 0xcc, 0x62, + 0x04, 0x21, 0x03, 0x20, 0xd9, 0xf7, 0x3f, 0xf9, 0x20, 0x46, 0x00, 0xf0, + 0x18, 0xfb, 0x05, 0x46, 0x03, 0x20, 0x00, 0x90, 0x04, 0xf1, 0x50, 0x03, + 0x00, 0x22, 0x00, 0x21, 0x01, 0x20, 0xe8, 0xf7, 0x73, 0xfb, 0xe0, 0x64, + 0x00, 0x21, 0xe8, 0xf7, 0x25, 0xfd, 0x20, 0x68, 0x01, 0x21, 0xc0, 0xb2, + 0x02, 0xf0, 0xf0, 0xfb, 0x20, 0x68, 0x31, 0x46, 0x02, 0xf0, 0xde, 0xfc, + 0x76, 0x1c, 0x04, 0x2e, 0xf8, 0xd3, 0x6d, 0xb9, 0x20, 0x68, 0x00, 0xf0, + 0x61, 0xf8, 0xe0, 0xb1, 0x00, 0x90, 0x04, 0x21, 0x23, 0x68, 0x0f, 0xf2, + 0x8c, 0x62, 0x03, 0x20, 0xd9, 0xf7, 0x15, 0xf9, 0x4f, 0xf4, 0x83, 0x65, + 0x00, 0x95, 0x04, 0x21, 0x23, 0x68, 0x0f, 0xf2, 0x94, 0x62, 0x01, 0x20, + 0xd9, 0xf7, 0x0b, 0xf9, 0x03, 0x26, 0xb5, 0xf5, 0x83, 0x6f, 0x08, 0xbf, + 0x01, 0x26, 0x32, 0x46, 0x40, 0xf2, 0x0e, 0x41, 0x01, 0x20, 0xe6, 0xf7, + 0x77, 0xfc, 0x20, 0x68, 0xbd, 0xe8, 0xf4, 0x40, 0x00, 0x21, 0xc0, 0xb2, + 0x02, 0xf0, 0xc0, 0xbb, 0x4f, 0xf6, 0x52, 0x75, 0xe2, 0xe7, 0x38, 0xb5, + 0x05, 0x46, 0x00, 0x21, 0x00, 0xf0, 0x81, 0xfa, 0x28, 0x46, 0x00, 0xf0, + 0xca, 0xfa, 0x04, 0x00, 0x03, 0xd1, 0x28, 0x46, 0x00, 0xf0, 0x94, 0xfa, + 0x04, 0x46, 0x14, 0xbb, 0x00, 0xf0, 0x27, 0xf8, 0x50, 0xb1, 0x00, 0x90, + 0x04, 0x21, 0x2b, 0x68, 0x0f, 0xf2, 0x48, 0x62, 0x01, 0x20, 0xd9, 0xf7, + 0xdc, 0xf8, 0x4f, 0xf4, 0x83, 0x64, 0x15, 0xe0, 0xe8, 0x6c, 0x00, 0x21, + 0xe8, 0xf7, 0xcc, 0xfc, 0x01, 0x22, 0x02, 0x21, 0x28, 0x46, 0xca, 0xf7, + 0x61, 0xf9, 0x01, 0x28, 0x04, 0xd1, 0x28, 0x46, 0x00, 0xf0, 0x25, 0xfa, + 0x04, 0x00, 0x04, 0xd1, 0x28, 0x68, 0x01, 0x21, 0x02, 0xf0, 0xb9, 0xfb, + 0x04, 0x46, 0x14, 0xb1, 0x28, 0x46, 0x00, 0xf0, 0x82, 0xfa, 0x20, 0x46, + 0x32, 0xbd, 0x28, 0x68, 0xc0, 0xb2, 0x02, 0xf0, 0xdb, 0xbb, 0x2d, 0xe9, + 0xf8, 0x4f, 0x05, 0x46, 0x89, 0x46, 0x05, 0xf1, 0x36, 0x01, 0x00, 0x24, + 0x88, 0x78, 0x00, 0x27, 0x00, 0x28, 0x00, 0xf0, 0xa9, 0x80, 0x95, 0xf8, + 0x36, 0xa0, 0x28, 0x6a, 0xfc, 0xf7, 0x3c, 0xfd, 0x80, 0x46, 0x28, 0x46, + 0xca, 0xf7, 0x3c, 0xf9, 0x05, 0xf1, 0x3c, 0x06, 0xa3, 0x46, 0x30, 0x68, + 0xe2, 0xf7, 0x28, 0xff, 0x70, 0x60, 0x95, 0xf8, 0x36, 0x10, 0x8a, 0x45, + 0x18, 0xbf, 0xf0, 0x60, 0xf3, 0xf7, 0xf2, 0xfa, 0x10, 0xb1, 0x4f, 0xf0, + 0x00, 0x44, 0x07, 0xe0, 0x05, 0xf1, 0x36, 0x0a, 0x9a, 0xf8, 0x00, 0x00, + 0x08, 0x28, 0x18, 0xbf, 0x0f, 0x28, 0x01, 0xd1, 0x01, 0x27, 0x2c, 0xe0, + 0x69, 0x69, 0x48, 0x7b, 0xd8, 0xb9, 0x70, 0x68, 0x09, 0x68, 0x81, 0x42, + 0x17, 0xd2, 0x00, 0x90, 0x04, 0x21, 0x2b, 0x68, 0x0f, 0xf2, 0xa4, 0x52, + 0x02, 0x20, 0xd9, 0xf7, 0x7a, 0xf8, 0xff, 0xf7, 0xba, 0xff, 0x4f, 0xf4, + 0x82, 0x64, 0x01, 0x27, 0x48, 0xb1, 0x00, 0x90, 0x04, 0x21, 0x2b, 0x68, + 0x0f, 0xf2, 0x9c, 0x52, 0x01, 0x20, 0xd9, 0xf7, 0x6c, 0xf8, 0x4f, 0xf4, + 0x83, 0x64, 0x9a, 0xf8, 0x00, 0x00, 0x04, 0x28, 0x09, 0xd1, 0x28, 0x68, + 0xc0, 0xb2, 0x02, 0xf0, 0x4d, 0xfb, 0x01, 0x28, 0x03, 0xd1, 0x28, 0x68, + 0x01, 0x21, 0x02, 0xf0, 0x53, 0xfc, 0xb8, 0xf1, 0x01, 0x0f, 0x05, 0xd1, + 0x28, 0x46, 0x00, 0xf0, 0xb0, 0xf9, 0x04, 0x00, 0x29, 0xd1, 0x00, 0xe0, + 0x4c, 0xbb, 0xd6, 0xf8, 0x78, 0xa0, 0x28, 0x68, 0x00, 0x24, 0x02, 0xf0, + 0xcd, 0xfb, 0x82, 0x45, 0xb0, 0x67, 0x1d, 0xd1, 0x28, 0x68, 0x05, 0xf1, + 0xa4, 0x01, 0x02, 0xf0, 0xaa, 0xfb, 0x2b, 0x68, 0x0f, 0xf2, 0x60, 0x52, + 0x03, 0x21, 0x01, 0x20, 0xd9, 0xf7, 0x3d, 0xf8, 0x69, 0x69, 0x88, 0x7b, + 0x60, 0xb1, 0x95, 0xf8, 0xbd, 0x00, 0x0a, 0x28, 0x08, 0xd2, 0x40, 0x1c, + 0x85, 0xf8, 0xbd, 0x00, 0x01, 0x21, 0x28, 0x68, 0x02, 0xf0, 0x23, 0xfb, + 0x04, 0x46, 0x01, 0xe0, 0x40, 0xf2, 0x17, 0x44, 0x0c, 0xb1, 0x01, 0x27, + 0x09, 0xe0, 0xff, 0xb1, 0x00, 0x2c, 0x08, 0xbf, 0xb8, 0xf1, 0x01, 0x0f, + 0x03, 0xd1, 0x28, 0x46, 0x00, 0xf0, 0x79, 0xf9, 0x83, 0x46, 0x28, 0x46, + 0x00, 0xf0, 0xdd, 0xf9, 0x04, 0xb9, 0x04, 0x46, 0x28, 0x68, 0x00, 0x21, + 0x02, 0xf0, 0x09, 0xfb, 0x14, 0xb9, 0x04, 0x46, 0x04, 0xb9, 0x5c, 0x46, + 0x29, 0x6b, 0xa8, 0x69, 0x14, 0x22, 0xca, 0xf7, 0x67, 0xfe, 0xa8, 0x69, + 0x29, 0x69, 0x01, 0x60, 0xaa, 0x68, 0x42, 0x61, 0xc9, 0xf8, 0x00, 0x40, + 0x38, 0x46, 0xbd, 0xe8, 0xf2, 0x8f, 0x2d, 0xe9, 0xf8, 0x4f, 0x07, 0x46, + 0x84, 0xb0, 0x39, 0x68, 0x01, 0x91, 0x08, 0x46, 0xf6, 0xf7, 0x39, 0xfd, + 0x03, 0x90, 0x4f, 0xf0, 0x00, 0x49, 0xf8, 0x69, 0x80, 0x69, 0x00, 0x28, + 0x07, 0xbf, 0x08, 0x21, 0x8d, 0xf8, 0x00, 0x10, 0x09, 0x22, 0x8d, 0xf8, + 0x00, 0x20, 0x00, 0x23, 0x02, 0x93, 0x38, 0xb3, 0x03, 0x99, 0x01, 0x20, + 0x02, 0x29, 0x02, 0x90, 0x0a, 0xd1, 0x9d, 0xf8, 0x00, 0x20, 0x01, 0x98, + 0x01, 0x21, 0xf6, 0xf7, 0xae, 0xfc, 0x05, 0x00, 0x40, 0xf0, 0xc7, 0x80, + 0x00, 0xe0, 0x01, 0x94, 0x02, 0x98, 0x80, 0xf0, 0x01, 0x00, 0x8d, 0xf8, + 0x01, 0x00, 0x01, 0x21, 0x38, 0x46, 0x07, 0xf1, 0x3c, 0x06, 0x00, 0xf0, + 0x5e, 0xf9, 0x30, 0x69, 0x00, 0x21, 0xe8, 0xf7, 0xc1, 0xfb, 0x02, 0x22, + 0x03, 0x21, 0x38, 0x46, 0xca, 0xf7, 0x56, 0xf8, 0x00, 0x25, 0xa8, 0x46, + 0x04, 0x46, 0x5f, 0xe0, 0x01, 0x9c, 0x14, 0x21, 0x20, 0x46, 0xf6, 0xf7, + 0x47, 0xfc, 0x01, 0x28, 0xdf, 0xd0, 0xf3, 0xf7, 0x13, 0xfa, 0x00, 0x28, + 0xf5, 0xd0, 0x4d, 0x46, 0xa8, 0xe0, 0xd7, 0xf8, 0xc0, 0x00, 0x40, 0x1c, + 0xc7, 0xf8, 0xc0, 0x00, 0x38, 0x68, 0x02, 0xf0, 0xa3, 0xfb, 0x38, 0x46, + 0x00, 0xf0, 0x03, 0xf9, 0x05, 0x46, 0x34, 0xe0, 0x00, 0x2d, 0x04, 0xbf, + 0x5f, 0xfa, 0x88, 0xf0, 0x00, 0x28, 0x43, 0xd1, 0x00, 0xf0, 0x98, 0xf8, + 0x04, 0x43, 0x00, 0xf0, 0x99, 0xf8, 0x97, 0xf8, 0x36, 0x00, 0x0a, 0x28, + 0x36, 0xd1, 0x00, 0xf0, 0x8f, 0xf8, 0x04, 0x43, 0xe2, 0xf7, 0xe8, 0xfd, + 0x5f, 0xfa, 0x84, 0xfa, 0x04, 0x46, 0x78, 0x69, 0x41, 0x68, 0x30, 0x69, + 0xe8, 0xf7, 0x82, 0xfb, 0x01, 0x28, 0x57, 0xd0, 0xf3, 0xf7, 0xe2, 0xf9, + 0x00, 0x28, 0xd8, 0xd1, 0x38, 0x68, 0xc0, 0xb2, 0x02, 0xf0, 0x6c, 0xfa, + 0x01, 0x00, 0xca, 0xd1, 0x20, 0x46, 0xe2, 0xf7, 0x05, 0xfe, 0x79, 0x69, + 0x8a, 0x68, 0x82, 0x42, 0xe7, 0xd2, 0x00, 0xf0, 0x76, 0xf8, 0x00, 0xf0, + 0x6d, 0xf8, 0x40, 0xf2, 0x19, 0x45, 0x00, 0xf0, 0x6d, 0xf8, 0x54, 0x46, + 0x5c, 0xb9, 0x00, 0x2d, 0xc4, 0xd1, 0x00, 0xf0, 0x63, 0xf8, 0x00, 0xf0, + 0x64, 0xf8, 0x97, 0xf8, 0x36, 0x00, 0x0b, 0x28, 0xf4, 0xd1, 0x4f, 0xf0, + 0x01, 0x0b, 0xd8, 0x46, 0xe0, 0xb2, 0x00, 0x28, 0xc3, 0x46, 0xb5, 0xd0, + 0x9d, 0xf8, 0x01, 0x00, 0x10, 0xb1, 0x38, 0x68, 0xf6, 0xf7, 0xce, 0xfb, + 0x03, 0x22, 0x03, 0x21, 0x38, 0x46, 0xc9, 0xf7, 0xe3, 0xff, 0x04, 0x43, + 0xe4, 0xb2, 0xa4, 0xb9, 0x35, 0xbb, 0x00, 0xf0, 0x45, 0xf8, 0x00, 0xf0, + 0x46, 0xf8, 0xf3, 0xf7, 0xa3, 0xf9, 0x30, 0xb1, 0x00, 0xf0, 0x45, 0xf8, + 0x04, 0x43, 0x00, 0xf0, 0x3b, 0xf8, 0x04, 0x43, 0x4d, 0x46, 0x97, 0xf8, + 0x36, 0x00, 0x0d, 0x28, 0x0e, 0xd0, 0x0f, 0x28, 0xe9, 0xd1, 0x00, 0x2d, + 0x08, 0xbf, 0x01, 0x2c, 0x0e, 0xd1, 0x38, 0x46, 0x00, 0xf0, 0x8d, 0xf8, + 0x05, 0x46, 0x09, 0xe0, 0x70, 0x6e, 0x40, 0x1c, 0x70, 0x66, 0x80, 0xe7, + 0xf9, 0x69, 0x88, 0x69, 0x00, 0xb1, 0x40, 0x1e, 0x88, 0x61, 0xec, 0xe7, + 0x30, 0x68, 0xe2, 0xf7, 0xad, 0xfd, 0xb0, 0x60, 0x14, 0x22, 0x39, 0x6b, + 0xf8, 0x69, 0xca, 0xf7, 0x79, 0xfd, 0xf8, 0x69, 0x39, 0x69, 0x01, 0x60, + 0xba, 0x68, 0x42, 0x61, 0x02, 0x98, 0x58, 0xb1, 0x03, 0x98, 0x02, 0x28, + 0x08, 0xd1, 0x9d, 0xf8, 0x00, 0x20, 0x01, 0x98, 0x00, 0x23, 0x01, 0x21, + 0xf6, 0xf7, 0x07, 0xfc, 0x05, 0xb9, 0x05, 0x46, 0x28, 0x46, 0x05, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x38, 0x6a, 0xfc, 0xf7, 0x97, 0xbb, 0x04, 0x46, + 0x38, 0x46, 0xc9, 0xf7, 0x97, 0xbf, 0x00, 0x22, 0x05, 0x21, 0x38, 0x46, + 0xc9, 0xf7, 0x8c, 0xbf, 0x10, 0xb5, 0x00, 0x21, 0x00, 0x22, 0x83, 0x68, + 0xd3, 0x40, 0xdc, 0x07, 0x04, 0xd4, 0x52, 0x1c, 0x20, 0x2a, 0xf8, 0xd3, + 0x01, 0x61, 0x10, 0xbd, 0xd2, 0xb1, 0x01, 0x2a, 0x1b, 0xd0, 0x02, 0x2a, + 0x1c, 0xd0, 0x03, 0x2a, 0x1d, 0xd0, 0x04, 0x2a, 0x1e, 0xd0, 0x08, 0x2a, + 0x1f, 0xd0, 0x09, 0x2a, 0x20, 0xd0, 0x0a, 0x2a, 0x21, 0xd0, 0x0b, 0x2a, + 0x22, 0xd0, 0x0c, 0x2a, 0x23, 0xd0, 0x18, 0x2a, 0x24, 0xd0, 0x19, 0x2a, + 0x25, 0xd0, 0x1a, 0x2a, 0x26, 0xd0, 0x1b, 0x2a, 0x27, 0xd0, 0x29, 0xe0, + 0x40, 0xf2, 0x01, 0x41, 0xde, 0xe7, 0x40, 0xf2, 0x02, 0x41, 0xdb, 0xe7, + 0x40, 0xf2, 0x03, 0x41, 0xd8, 0xe7, 0x40, 0xf2, 0x04, 0x41, 0xd5, 0xe7, + 0x40, 0xf2, 0x05, 0x41, 0xd2, 0xe7, 0x40, 0xf2, 0x06, 0x41, 0xcf, 0xe7, + 0x40, 0xf2, 0x07, 0x41, 0xcc, 0xe7, 0x4f, 0xf4, 0x81, 0x61, 0xc9, 0xe7, + 0x40, 0xf2, 0x09, 0x41, 0xc6, 0xe7, 0x40, 0xf2, 0x0a, 0x41, 0xc3, 0xe7, + 0x40, 0xf2, 0x0b, 0x41, 0xc0, 0xe7, 0x40, 0xf2, 0x0c, 0x41, 0xbd, 0xe7, + 0x40, 0xf2, 0x0d, 0x41, 0xba, 0xe7, 0x40, 0xf2, 0x0f, 0x41, 0xb7, 0xe7, + 0x40, 0xf2, 0x12, 0x41, 0xb4, 0xe7, 0x38, 0xb5, 0x04, 0x46, 0x00, 0x25, + 0xa1, 0x68, 0x20, 0x6a, 0xe1, 0x60, 0xff, 0xf7, 0xaf, 0xf8, 0x62, 0x69, + 0x01, 0x46, 0xa1, 0x60, 0x10, 0x7b, 0x18, 0xb1, 0x20, 0x6a, 0xff, 0xf7, + 0xab, 0xf8, 0x02, 0xe0, 0xe0, 0x68, 0x81, 0x42, 0x02, 0xd0, 0x20, 0x46, + 0xff, 0xf7, 0x94, 0xff, 0x20, 0x69, 0x40, 0xf2, 0x01, 0x42, 0x81, 0x1a, + 0x01, 0xd0, 0x49, 0x1f, 0x01, 0xd1, 0x25, 0x61, 0x00, 0xe0, 0x05, 0x46, + 0x60, 0x69, 0x41, 0x7b, 0x01, 0x29, 0x08, 0xbf, 0x00, 0x25, 0x28, 0x46, + 0x32, 0xbd, 0x20, 0x30, 0x01, 0x75, 0x42, 0x75, 0x00, 0x68, 0xc9, 0xf7, + 0x01, 0xbf, 0x10, 0xb5, 0x00, 0xf1, 0x20, 0x04, 0x20, 0x68, 0xc9, 0xf7, + 0xff, 0xfe, 0xa0, 0x75, 0x10, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x04, 0xf1, + 0x38, 0x05, 0x00, 0x20, 0xa8, 0x66, 0xa0, 0x60, 0x20, 0x61, 0x28, 0x70, + 0x0e, 0x46, 0xe2, 0xf7, 0xb9, 0xfc, 0x68, 0x60, 0x4e, 0xb9, 0x00, 0x20, + 0xe8, 0x67, 0xc4, 0xf8, 0xc0, 0x00, 0xa8, 0x60, 0x20, 0x68, 0xbd, 0xe8, + 0x70, 0x40, 0x02, 0xf0, 0xcd, 0xb9, 0x00, 0x20, 0xe8, 0x60, 0x70, 0xbd, + 0x10, 0xb5, 0x04, 0x46, 0x00, 0x20, 0x94, 0xf8, 0x38, 0x10, 0x79, 0xb9, + 0x20, 0x68, 0x00, 0x23, 0x0a, 0x22, 0x01, 0x21, 0xe5, 0xf7, 0x80, 0xf9, + 0x28, 0xb9, 0x20, 0x68, 0x00, 0x23, 0x0a, 0x22, 0x01, 0x21, 0xf6, 0xf7, + 0x12, 0xfb, 0x01, 0x21, 0x84, 0xf8, 0x38, 0x10, 0x10, 0xbd, 0x38, 0xb5, + 0x05, 0x46, 0x05, 0xf1, 0x37, 0x00, 0x00, 0x24, 0x41, 0x78, 0x01, 0x29, + 0x0f, 0xd1, 0x44, 0x70, 0x04, 0x70, 0x00, 0x23, 0x28, 0x68, 0x0a, 0x22, + 0xe5, 0xf7, 0x80, 0xf9, 0x04, 0x46, 0x28, 0x68, 0x00, 0x23, 0x0a, 0x22, + 0x01, 0x21, 0xf6, 0xf7, 0x22, 0xfb, 0x04, 0xb9, 0x04, 0x46, 0x20, 0x46, + 0x32, 0xbd, 0x78, 0xb5, 0x04, 0x46, 0x93, 0xb0, 0x20, 0x68, 0xc0, 0xb2, + 0xff, 0xf7, 0x76, 0xfc, 0x06, 0x46, 0x20, 0x68, 0xc0, 0xb2, 0x02, 0xf0, + 0x1b, 0xf9, 0x60, 0x69, 0x42, 0x7c, 0x19, 0x48, 0x01, 0x78, 0x00, 0x25, + 0x8a, 0x42, 0x05, 0xd0, 0x02, 0x70, 0xd6, 0xf8, 0xa7, 0x10, 0x60, 0x6a, + 0xff, 0xf7, 0x5c, 0xfc, 0x20, 0x68, 0x14, 0x49, 0x14, 0x4b, 0x51, 0xf8, + 0x20, 0x20, 0x02, 0x92, 0x53, 0xf8, 0x20, 0x00, 0x01, 0x90, 0x03, 0xa8, + 0x21, 0x6b, 0x00, 0x91, 0xe3, 0x6a, 0xa2, 0x6a, 0x61, 0x6a, 0xff, 0xf7, + 0x4f, 0xfc, 0x20, 0x6a, 0x03, 0xa9, 0xfc, 0xf7, 0x85, 0xfa, 0x01, 0x28, + 0x04, 0xd1, 0x20, 0x46, 0xff, 0xf7, 0x4b, 0xff, 0x05, 0x46, 0x02, 0xe0, + 0x02, 0x20, 0x84, 0xf8, 0x36, 0x00, 0x28, 0x46, 0x14, 0xb0, 0x70, 0xbd, + 0xb4, 0x76, 0x02, 0x20, 0x48, 0x40, 0x03, 0x20, 0xc0, 0x77, 0x02, 0x20, + 0x1c, 0x3f, 0x00, 0x20, 0x68, 0x98, 0x04, 0x01, 0x48, 0x97, 0x04, 0x01, + 0x20, 0x20, 0x54, 0x78, 0x20, 0x20, 0x41, 0x44, 0x43, 0x20, 0x72, 0x61, + 0x74, 0x65, 0x3a, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x2d, 0x2d, 0x2d, 0x3e, + 0x20, 0x54, 0x78, 0x4c, 0x42, 0x20, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x63, + 0x68, 0x25, 0x64, 0x2c, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x54, 0x78, 0x6c, 0x62, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, + 0x65, 0x72, 0x72, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x2d, 0x2d, 0x2d, 0x3e, + 0x20, 0x54, 0x78, 0x6c, 0x62, 0x20, 0x72, 0x65, 0x67, 0x46, 0x61, 0x69, + 0x6c, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x25, 0x64, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x78, 0x6c, 0x62, 0x3a, 0x20, 0x63, 0x68, + 0x25, 0x64, 0x2c, 0x20, 0x54, 0x4f, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, + 0x2d, 0x2d, 0x2d, 0x3e, 0x20, 0x54, 0x78, 0x6c, 0x62, 0x54, 0x4f, 0x20, + 0x72, 0x65, 0x67, 0x46, 0x61, 0x69, 0x6c, 0x3a, 0x20, 0x63, 0x68, 0x25, + 0x64, 0x2c, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x4f, 0x72, 0x78, 0x3a, + 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x64, 0x61, 0x63, 0x20, 0x73, + 0x74, 0x75, 0x63, 0x6b, 0x0a, 0x00, 0x00, 0x00, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, + 0x11, 0x40, 0x29, 0x43, 0x01, 0x70, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0x13, 0x46, 0xdf, 0xf8, 0xd4, 0x23, 0x52, 0xf8, 0x20, 0x00, 0x09, 0x29, + 0x2e, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, 0x05, 0x0d, 0x15, 0x09, 0x11, 0x19, + 0x25, 0x29, 0x1d, 0x21, 0x3f, 0x22, 0x00, 0x21, 0x20, 0x30, 0x22, 0xe0, + 0x3f, 0x22, 0x00, 0x21, 0x23, 0x30, 0x1e, 0xe0, 0x3f, 0x22, 0x00, 0x21, + 0x21, 0x30, 0x1a, 0xe0, 0x3f, 0x22, 0x00, 0x21, 0x24, 0x30, 0x16, 0xe0, + 0x3f, 0x22, 0x00, 0x21, 0x22, 0x30, 0x12, 0xe0, 0x3f, 0x22, 0x00, 0x21, + 0x25, 0x30, 0x0e, 0xe0, 0x3f, 0x22, 0x00, 0x21, 0x28, 0x30, 0x0a, 0xe0, + 0x3f, 0x22, 0x00, 0x21, 0x29, 0x30, 0x06, 0xe0, 0x3f, 0x22, 0x00, 0x21, + 0x26, 0x30, 0x02, 0xe0, 0x3f, 0x22, 0x00, 0x21, 0x27, 0x30, 0xbb, 0xe7, + 0x70, 0x47, 0x00, 0x00, 0x13, 0x46, 0xdf, 0xf8, 0x64, 0x23, 0x52, 0xf8, + 0x20, 0x00, 0x09, 0x29, 0x2e, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, 0x05, 0x0d, + 0x15, 0x09, 0x11, 0x19, 0x25, 0x29, 0x1d, 0x21, 0x3f, 0x22, 0x00, 0x21, + 0x30, 0x30, 0x22, 0xe0, 0x3f, 0x22, 0x00, 0x21, 0x33, 0x30, 0x1e, 0xe0, + 0x3f, 0x22, 0x00, 0x21, 0x31, 0x30, 0x1a, 0xe0, 0x3f, 0x22, 0x00, 0x21, + 0x34, 0x30, 0x16, 0xe0, 0x3f, 0x22, 0x00, 0x21, 0x32, 0x30, 0x12, 0xe0, + 0x3f, 0x22, 0x00, 0x21, 0x35, 0x30, 0x0e, 0xe0, 0x3f, 0x22, 0x00, 0x21, + 0x38, 0x30, 0x0a, 0xe0, 0x3f, 0x22, 0x00, 0x21, 0x39, 0x30, 0x06, 0xe0, + 0x3f, 0x22, 0x00, 0x21, 0x36, 0x30, 0x02, 0xe0, 0x3f, 0x22, 0x00, 0x21, + 0x37, 0x30, 0x83, 0xe7, 0x70, 0x47, 0x13, 0x46, 0xdf, 0xf8, 0xf4, 0x22, + 0x52, 0xf8, 0x20, 0x00, 0x05, 0x29, 0x06, 0xd9, 0x89, 0x1f, 0x01, 0x29, + 0x0b, 0xd9, 0x89, 0x1e, 0x01, 0x29, 0x04, 0xd9, 0x70, 0x47, 0x07, 0x22, + 0x00, 0x21, 0x11, 0x30, 0x06, 0xe0, 0x07, 0x22, 0x00, 0x21, 0x10, 0x30, + 0x02, 0xe0, 0x07, 0x22, 0x00, 0x21, 0x12, 0x30, 0x68, 0xe7, 0x0b, 0x46, + 0xdf, 0xf8, 0xc0, 0x12, 0x51, 0xf8, 0x20, 0x00, 0x10, 0xf8, 0x50, 0x1f, + 0x01, 0xf0, 0xf0, 0x01, 0x0b, 0x43, 0xff, 0x22, 0x3b, 0xe1, 0x38, 0xb5, + 0x0c, 0x46, 0xdf, 0xf8, 0xa8, 0x12, 0x51, 0xf8, 0x20, 0x50, 0x2d, 0x1d, + 0x23, 0x46, 0x07, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x2e, 0xf9, 0x23, 0x46, + 0x28, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x38, 0x22, 0x03, 0x21, + 0x48, 0xe7, 0x2d, 0xe9, 0xf8, 0x4f, 0xdf, 0xf8, 0x84, 0x22, 0xdf, 0xf8, + 0x84, 0x62, 0x52, 0xf8, 0x20, 0x50, 0x05, 0xf1, 0x0a, 0x08, 0x05, 0xf1, + 0x0b, 0x0a, 0x05, 0xf1, 0x06, 0x0b, 0x6f, 0x1d, 0x05, 0xf1, 0x09, 0x04, + 0x05, 0xf1, 0x08, 0x09, 0x33, 0x35, 0x01, 0x29, 0x40, 0xf0, 0xa3, 0x80, + 0x28, 0x78, 0xc0, 0x09, 0x30, 0x70, 0x00, 0x23, 0x80, 0x22, 0x07, 0x21, + 0x00, 0xf0, 0x07, 0xf9, 0x28, 0x78, 0xc0, 0xf3, 0x80, 0x10, 0x70, 0x70, + 0x00, 0x23, 0x00, 0xf0, 0xfe, 0xf8, 0x28, 0x78, 0xc0, 0xf3, 0x01, 0x10, + 0xb0, 0x70, 0x02, 0x23, 0x30, 0x22, 0x04, 0x21, 0x00, 0xf0, 0xf7, 0xf8, + 0x28, 0x78, 0xc0, 0xf3, 0x81, 0x00, 0xf0, 0x70, 0x01, 0x23, 0x0c, 0x22, + 0x02, 0x21, 0x00, 0xf0, 0xee, 0xf8, 0x28, 0x78, 0xc0, 0xf3, 0x40, 0x00, + 0x30, 0x71, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0xe5, 0xf8, + 0x28, 0x78, 0x00, 0xf0, 0x01, 0x00, 0x70, 0x71, 0x00, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x00, 0xf0, 0xdc, 0xf8, 0x99, 0xf8, 0x00, 0x00, 0x00, 0xf0, + 0x01, 0x00, 0xb0, 0x71, 0x00, 0x23, 0x00, 0xf0, 0xc6, 0xf8, 0x20, 0x78, + 0xc0, 0xf3, 0x40, 0x10, 0xf0, 0x71, 0x00, 0xf0, 0xe5, 0xf8, 0x20, 0x78, + 0xc0, 0xf3, 0x00, 0x10, 0x30, 0x72, 0x00, 0x23, 0x10, 0x22, 0x04, 0x21, + 0x00, 0xf0, 0xdf, 0xf8, 0x20, 0x78, 0xc0, 0xf3, 0xc0, 0x00, 0x70, 0x72, + 0x00, 0x23, 0x08, 0x22, 0x03, 0x21, 0x00, 0xf0, 0xd6, 0xf8, 0x20, 0x78, + 0xc0, 0xf3, 0x80, 0x00, 0xb0, 0x72, 0x00, 0x23, 0x04, 0x22, 0x02, 0x21, + 0x00, 0xf0, 0xcd, 0xf8, 0x20, 0x78, 0xc0, 0xf3, 0x40, 0x00, 0xf0, 0x72, + 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0xc4, 0xf8, 0x20, 0x78, + 0x00, 0xf0, 0x01, 0x00, 0x30, 0x73, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, + 0x00, 0xf0, 0xbb, 0xf8, 0x38, 0x78, 0xc0, 0xf3, 0x01, 0x10, 0x70, 0x73, + 0x03, 0x23, 0x00, 0xf0, 0x94, 0xf8, 0x38, 0x78, 0x00, 0xf0, 0x0f, 0x00, + 0xb0, 0x73, 0x0c, 0x23, 0x0f, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x8d, 0xf8, + 0x05, 0x20, 0xeb, 0xf7, 0x4d, 0xf9, 0x38, 0xb1, 0x9b, 0xf8, 0x00, 0x00, + 0x00, 0xf0, 0x3f, 0x00, 0xf0, 0x73, 0x00, 0x23, 0x00, 0xf0, 0x73, 0xf8, + 0x9a, 0xf8, 0x00, 0x00, 0xc0, 0xf3, 0x01, 0x10, 0x30, 0x74, 0x03, 0x23, + 0x00, 0xf0, 0x73, 0xf8, 0x9a, 0xf8, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, + 0x70, 0x74, 0x0c, 0x23, 0x0f, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x6b, 0xf8, + 0x98, 0xf8, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0xb0, 0x74, 0x00, 0x23, + 0x52, 0xe0, 0x33, 0x78, 0x80, 0x22, 0x07, 0x21, 0x00, 0xf0, 0x67, 0xf8, + 0x73, 0x78, 0x00, 0xf0, 0x62, 0xf8, 0xb3, 0x78, 0x30, 0x22, 0x04, 0x21, + 0x00, 0xf0, 0x5f, 0xf8, 0xf3, 0x78, 0x0c, 0x22, 0x02, 0x21, 0x00, 0xf0, + 0x5a, 0xf8, 0x33, 0x79, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0x55, 0xf8, + 0x73, 0x79, 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x50, 0xf8, 0xb3, 0x79, + 0x00, 0xf0, 0x3f, 0xf8, 0xf3, 0x79, 0x00, 0xf0, 0x62, 0xf8, 0x33, 0x7a, + 0x10, 0x22, 0x04, 0x21, 0x00, 0xf0, 0x5f, 0xf8, 0x73, 0x7a, 0x08, 0x22, + 0x03, 0x21, 0x00, 0xf0, 0x5a, 0xf8, 0xb3, 0x7a, 0x04, 0x22, 0x02, 0x21, + 0x00, 0xf0, 0x55, 0xf8, 0xf3, 0x7a, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, + 0x50, 0xf8, 0x33, 0x7b, 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x4b, 0xf8, + 0x73, 0x7b, 0x00, 0xf0, 0x28, 0xf8, 0xb3, 0x7b, 0x0f, 0x22, 0x00, 0x21, + 0x00, 0xf0, 0x25, 0xf8, 0x05, 0x20, 0xeb, 0xf7, 0xe5, 0xf8, 0x10, 0xb1, + 0xf3, 0x7b, 0x00, 0xf0, 0x10, 0xf8, 0x33, 0x7c, 0x00, 0xf0, 0x15, 0xf8, + 0x73, 0x7c, 0x0f, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x12, 0xf8, 0xb3, 0x7c, + 0x3f, 0x22, 0x00, 0x21, 0x40, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, + 0x34, 0xe6, 0x3f, 0x22, 0x00, 0x21, 0x58, 0x46, 0x30, 0xe6, 0x01, 0x22, + 0x00, 0x21, 0x48, 0x46, 0x2c, 0xe6, 0x30, 0x22, 0x04, 0x21, 0x50, 0x46, + 0x28, 0xe6, 0x30, 0x22, 0x04, 0x21, 0x38, 0x46, 0x24, 0xe6, 0x40, 0x22, + 0x06, 0x21, 0x28, 0x46, 0x20, 0xe6, 0x00, 0x21, 0x1e, 0xe6, 0x10, 0xb5, + 0x0b, 0x49, 0x51, 0xf8, 0x20, 0x40, 0x50, 0x34, 0x00, 0x23, 0x40, 0x22, + 0x06, 0x21, 0x00, 0xf0, 0x0c, 0xf8, 0x00, 0xf0, 0x07, 0xf8, 0x20, 0x46, + 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x23, 0x10, 0x22, 0x04, 0x21, 0x0b, 0xe6, + 0x00, 0x23, 0x20, 0x22, 0x05, 0x21, 0x20, 0x46, 0x06, 0xe6, 0x00, 0x00, + 0x48, 0x98, 0x04, 0x01, 0x88, 0x97, 0x04, 0x01, 0x05, 0x72, 0x02, 0x20, + 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x6a, 0x46, 0x0d, 0xf1, 0x01, 0x01, + 0xc0, 0xb2, 0xe1, 0xf7, 0x90, 0xfe, 0x29, 0x46, 0x20, 0x46, 0xd7, 0xf7, + 0x49, 0xfa, 0x9d, 0xf8, 0x00, 0x00, 0x02, 0x28, 0x01, 0xd1, 0x01, 0x20, + 0x32, 0xbd, 0x00, 0x20, 0x32, 0xbd, 0x2d, 0xe9, 0xfc, 0x41, 0x05, 0x46, + 0x0c, 0x46, 0x00, 0x20, 0x00, 0x90, 0x16, 0x46, 0xdf, 0xf8, 0xb4, 0x1c, + 0x08, 0x68, 0xea, 0xb2, 0x02, 0x44, 0xed, 0x23, 0x92, 0xf8, 0xbc, 0x70, + 0x5f, 0x43, 0xc3, 0x19, 0x03, 0xf2, 0x44, 0x48, 0x00, 0x22, 0x06, 0x21, + 0x28, 0x46, 0xff, 0xf7, 0x50, 0xfe, 0x00, 0x22, 0x08, 0x21, 0x28, 0x46, + 0xff, 0xf7, 0x4b, 0xfe, 0x00, 0x22, 0x00, 0x21, 0x28, 0x46, 0xff, 0xf7, + 0x46, 0xfe, 0x00, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x5c, 0xfe, 0x00, 0x22, + 0x06, 0x21, 0x00, 0xf0, 0x3d, 0xf9, 0x00, 0x22, 0x07, 0x21, 0x00, 0xf0, + 0x39, 0xf9, 0x00, 0x22, 0x06, 0x21, 0x00, 0xf0, 0x38, 0xf9, 0x00, 0x22, + 0x07, 0x21, 0x00, 0xf0, 0x34, 0xf9, 0x00, 0x22, 0x08, 0x21, 0x00, 0xf0, + 0x2d, 0xf9, 0x00, 0x22, 0x09, 0x21, 0x00, 0xf0, 0x29, 0xf9, 0x00, 0x22, + 0x08, 0x21, 0x00, 0xf0, 0x28, 0xf9, 0x00, 0x22, 0x09, 0x21, 0x00, 0xf0, + 0x24, 0xf9, 0x00, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x1d, 0xf9, 0x00, 0x22, + 0x03, 0x21, 0x00, 0xf0, 0x19, 0xf9, 0x00, 0x22, 0x01, 0x21, 0x00, 0xf0, + 0x15, 0xf9, 0x00, 0x22, 0x04, 0x21, 0x00, 0xf0, 0x11, 0xf9, 0x00, 0x22, + 0x02, 0x21, 0x00, 0xf0, 0x0d, 0xf9, 0x00, 0x22, 0x05, 0x21, 0x00, 0xf0, + 0x09, 0xf9, 0x00, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x08, 0xf9, 0x00, 0x22, + 0x03, 0x21, 0x00, 0xf0, 0x04, 0xf9, 0x00, 0x22, 0x01, 0x21, 0x00, 0xf0, + 0x00, 0xf9, 0x00, 0x22, 0x04, 0x21, 0x00, 0xf0, 0xfc, 0xf8, 0x00, 0x22, + 0x02, 0x21, 0x00, 0xf0, 0xf8, 0xf8, 0x00, 0x22, 0x05, 0x21, 0x00, 0xf0, + 0xf4, 0xf8, 0x00, 0x23, 0x4f, 0xf4, 0x80, 0x32, 0x00, 0x21, 0x28, 0x46, + 0xe5, 0xf7, 0xd2, 0xf9, 0x01, 0xa9, 0x28, 0x46, 0xff, 0xf7, 0x6a, 0xff, + 0x06, 0xf5, 0x74, 0x77, 0x01, 0x99, 0x38, 0x82, 0x39, 0x60, 0x28, 0x46, + 0xd8, 0xf7, 0x45, 0xf9, 0xb8, 0x60, 0x01, 0x98, 0x38, 0x60, 0xd8, 0xf8, + 0x7d, 0x00, 0x61, 0x69, 0x90, 0xfb, 0xf1, 0xf1, 0x4f, 0xf4, 0x7a, 0x72, + 0x91, 0xfb, 0xf2, 0xf1, 0x51, 0x43, 0x79, 0x60, 0x0b, 0x22, 0x3b, 0x68, + 0xc9, 0x18, 0x31, 0x63, 0x00, 0x23, 0x39, 0x68, 0x78, 0x68, 0x09, 0x1a, + 0x71, 0x63, 0x39, 0x68, 0x78, 0x68, 0x01, 0xeb, 0x41, 0x01, 0x09, 0x1a, + 0xb1, 0x63, 0x28, 0x46, 0x01, 0x21, 0xe4, 0xf7, 0xfd, 0xfd, 0x18, 0xb9, + 0x00, 0xf0, 0x9e, 0xf8, 0xf5, 0xf7, 0x91, 0xff, 0x00, 0x90, 0x00, 0x98, + 0x40, 0xb9, 0x00, 0x21, 0x00, 0x91, 0x00, 0x23, 0x7a, 0x68, 0x61, 0x7a, + 0x28, 0x46, 0xe3, 0xf7, 0x40, 0xf8, 0x00, 0x90, 0x0a, 0x20, 0xe2, 0xf7, + 0x7f, 0xfc, 0x00, 0x98, 0x20, 0xb9, 0x00, 0xf0, 0x8e, 0xf8, 0x00, 0xf0, + 0xa9, 0xf8, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, 0x40, 0xf0, 0x7f, 0x80, + 0x96, 0xed, 0x0f, 0x0a, 0xd6, 0xed, 0x10, 0x0a, 0xf0, 0x6b, 0xb0, 0x64, + 0x70, 0xee, 0x60, 0x0a, 0xc6, 0xed, 0x13, 0x0a, 0x96, 0xed, 0x0f, 0x0a, + 0xd6, 0xed, 0x11, 0x0a, 0x70, 0xee, 0x60, 0x0a, 0xc6, 0xed, 0x14, 0x0a, + 0x28, 0x46, 0xd8, 0xf7, 0x99, 0xf9, 0xff, 0x28, 0x05, 0xd0, 0x06, 0xf5, + 0x77, 0x71, 0xa8, 0xb2, 0xca, 0xf7, 0xb4, 0xf8, 0x00, 0x90, 0x00, 0x98, + 0x00, 0x28, 0x04, 0xbf, 0xa0, 0x78, 0x00, 0x28, 0x47, 0xd1, 0xe0, 0x78, + 0x01, 0x28, 0x0d, 0xd1, 0x00, 0x27, 0x04, 0xeb, 0x87, 0x00, 0xfa, 0xb2, + 0x90, 0xed, 0x09, 0x0a, 0x31, 0x46, 0x28, 0x46, 0x01, 0xf0, 0x12, 0xf9, + 0x7f, 0x1c, 0x06, 0x2f, 0xf3, 0xd9, 0x36, 0xe0, 0x20, 0x78, 0x70, 0xb1, + 0x22, 0x46, 0x31, 0x46, 0x28, 0x46, 0x00, 0xf0, 0xcf, 0xf9, 0x00, 0x90, + 0x00, 0x98, 0x20, 0xb9, 0x00, 0xf0, 0x47, 0xf8, 0x00, 0xf0, 0x62, 0xf8, + 0x00, 0x90, 0x00, 0xf0, 0x46, 0xf8, 0x00, 0x98, 0x00, 0x28, 0x22, 0xd1, + 0x60, 0x78, 0x00, 0x28, 0x1f, 0xd0, 0x96, 0xed, 0x13, 0x0a, 0x01, 0xf0, + 0xcb, 0xfb, 0x1a, 0xd5, 0x00, 0x27, 0x06, 0xeb, 0x87, 0x01, 0x0c, 0x20, + 0x48, 0x70, 0x0c, 0x22, 0xf9, 0xb2, 0x00, 0xf0, 0x48, 0xf8, 0x7f, 0x1c, + 0x06, 0x2f, 0xf4, 0xd3, 0x22, 0x46, 0x31, 0x46, 0x28, 0x46, 0x00, 0xf0, + 0x31, 0xfb, 0x00, 0x90, 0x00, 0x98, 0x20, 0xb9, 0x00, 0xf0, 0x21, 0xf8, + 0x00, 0xf0, 0x3c, 0xf8, 0x00, 0x90, 0x00, 0xf0, 0x20, 0xf8, 0x00, 0x98, + 0x88, 0xb9, 0x00, 0x21, 0x28, 0x46, 0xe3, 0xf7, 0x62, 0xf8, 0x00, 0xf0, + 0x0f, 0xf8, 0xe4, 0xf7, 0x83, 0xfd, 0x04, 0x46, 0x00, 0xf0, 0x0a, 0xf8, + 0xf5, 0xf7, 0x27, 0xff, 0x04, 0xb9, 0x04, 0x46, 0x00, 0x98, 0x00, 0xb9, + 0x00, 0x94, 0x00, 0x98, 0xbd, 0xe8, 0xf6, 0x81, 0x00, 0x23, 0x0b, 0x22, + 0x01, 0x21, 0x28, 0x46, 0x70, 0x47, 0x32, 0x46, 0x21, 0x46, 0x28, 0x46, + 0x20, 0xe1, 0x00, 0x98, 0x78, 0xb9, 0x96, 0xed, 0x0f, 0x0a, 0xd6, 0xed, + 0x10, 0x0a, 0x70, 0xee, 0x60, 0x0a, 0xc6, 0xed, 0x15, 0x0a, 0x96, 0xed, + 0x0f, 0x0a, 0xd6, 0xed, 0x11, 0x0a, 0x70, 0xee, 0x60, 0x0a, 0xc6, 0xed, + 0x16, 0x0a, 0x70, 0x47, 0x28, 0x46, 0xff, 0xf7, 0x8f, 0xbc, 0x28, 0x46, + 0xff, 0xf7, 0xc4, 0xbc, 0x00, 0x90, 0x33, 0x46, 0x22, 0x46, 0x29, 0x46, + 0x01, 0x20, 0x01, 0xf0, 0x37, 0xbb, 0x10, 0xb5, 0x01, 0x29, 0x04, 0x46, + 0x1a, 0xd1, 0x07, 0x22, 0x06, 0x21, 0xff, 0xf7, 0xec, 0xfc, 0x07, 0x22, + 0x08, 0x21, 0x00, 0xf0, 0x63, 0xf8, 0x00, 0xf0, 0x5f, 0xf8, 0x00, 0xf0, + 0x59, 0xf8, 0x00, 0x22, 0x06, 0x21, 0x00, 0xf0, 0x5e, 0xf8, 0x00, 0x22, + 0x07, 0x21, 0x00, 0xf0, 0x5a, 0xf8, 0x00, 0x22, 0x06, 0x21, 0x00, 0xf0, + 0xc8, 0xfa, 0x00, 0x22, 0x07, 0x21, 0x15, 0xe0, 0x07, 0x22, 0x08, 0x21, + 0xff, 0xf7, 0xd1, 0xfc, 0x00, 0xf0, 0x48, 0xf8, 0x00, 0xf0, 0x42, 0xf8, + 0x00, 0x22, 0x08, 0x21, 0x00, 0xf0, 0x47, 0xf8, 0x00, 0x22, 0x09, 0x21, + 0x00, 0xf0, 0x43, 0xf8, 0x00, 0x22, 0x08, 0x21, 0x00, 0xf0, 0xb1, 0xfa, + 0x00, 0x22, 0x09, 0x21, 0x00, 0xf0, 0xad, 0xfa, 0x00, 0x22, 0x00, 0x21, + 0x00, 0xf0, 0x37, 0xf8, 0x00, 0x22, 0x03, 0x21, 0x00, 0xf0, 0x33, 0xf8, + 0x00, 0x22, 0x01, 0x21, 0x00, 0xf0, 0x2f, 0xf8, 0x00, 0x22, 0x04, 0x21, + 0x00, 0xf0, 0x2b, 0xf8, 0x00, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x27, 0xf8, + 0x00, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x23, 0xf8, 0x00, 0x22, 0x00, 0x21, + 0x00, 0xf0, 0x91, 0xfa, 0x00, 0x22, 0x03, 0x21, 0x00, 0xf0, 0x8d, 0xfa, + 0x00, 0x22, 0x01, 0x21, 0x00, 0xf0, 0x89, 0xfa, 0x00, 0x22, 0x04, 0x21, + 0x00, 0xf0, 0x85, 0xfa, 0x00, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x81, 0xfa, + 0x00, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x7d, 0xfa, 0x00, 0x20, 0x10, 0xbd, + 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, 0xa1, 0xbc, 0x07, 0x22, 0x00, 0x21, + 0x20, 0x46, 0xff, 0xf7, 0x82, 0xbc, 0x20, 0x46, 0xff, 0xf7, 0x10, 0xbc, + 0x2d, 0xe9, 0xf0, 0x41, 0x16, 0x46, 0x01, 0x2b, 0x80, 0x46, 0x06, 0xf1, + 0x21, 0x05, 0x14, 0xd1, 0x00, 0x27, 0x06, 0xeb, 0x87, 0x04, 0xf9, 0xb2, + 0x22, 0x78, 0x01, 0xf0, 0x1b, 0xfa, 0x62, 0x78, 0xf9, 0xb2, 0x01, 0xf0, + 0x12, 0xfa, 0xa2, 0x78, 0xf9, 0xb2, 0x01, 0xf0, 0x27, 0xfa, 0x7f, 0x1c, + 0x0c, 0x2f, 0xee, 0xd3, 0x00, 0xf0, 0x68, 0xf8, 0x63, 0xe0, 0xb6, 0xf8, + 0xe0, 0x03, 0x01, 0x28, 0x1a, 0xd1, 0xb2, 0x7e, 0x06, 0x21, 0x01, 0xf0, + 0x19, 0xfa, 0x01, 0xf0, 0x15, 0xfa, 0xb2, 0x78, 0x00, 0x21, 0x01, 0xf0, + 0x13, 0xfa, 0x00, 0xf0, 0x57, 0xf8, 0x32, 0x7e, 0x06, 0x21, 0x01, 0xf0, + 0xf9, 0xf9, 0x32, 0x7f, 0x07, 0x21, 0x01, 0xf0, 0xf5, 0xf9, 0x72, 0x7e, + 0x06, 0x21, 0x01, 0xf0, 0xec, 0xf9, 0x72, 0x7f, 0x07, 0x21, 0x16, 0xe0, + 0x01, 0xf0, 0xfe, 0xf9, 0xb2, 0x78, 0x00, 0x21, 0x01, 0xf0, 0xfc, 0xf9, + 0x00, 0xf0, 0x40, 0xf8, 0x96, 0xf8, 0x20, 0x20, 0x08, 0x21, 0x01, 0xf0, + 0xe1, 0xf9, 0xea, 0x78, 0x09, 0x21, 0x01, 0xf0, 0xdd, 0xf9, 0x2a, 0x78, + 0x08, 0x21, 0x01, 0xf0, 0xd4, 0xf9, 0x2a, 0x79, 0x09, 0x21, 0x01, 0xf0, + 0xd0, 0xf9, 0x32, 0x78, 0x01, 0xf0, 0xdb, 0xf9, 0x32, 0x7b, 0x03, 0x21, + 0x01, 0xf0, 0xce, 0xf9, 0x32, 0x79, 0x01, 0xf0, 0xca, 0xf9, 0x32, 0x7c, + 0x04, 0x21, 0x01, 0xf0, 0xc7, 0xf9, 0x32, 0x7a, 0x02, 0x21, 0x01, 0xf0, + 0xc3, 0xf9, 0x32, 0x7d, 0x05, 0x21, 0x01, 0xf0, 0xbf, 0xf9, 0x72, 0x78, + 0x01, 0xf0, 0xc0, 0xf9, 0x72, 0x7b, 0x03, 0x21, 0x01, 0xf0, 0xb3, 0xf9, + 0x72, 0x79, 0x01, 0xf0, 0xaf, 0xf9, 0x72, 0x7c, 0x04, 0x21, 0x01, 0xf0, + 0xac, 0xf9, 0x72, 0x7a, 0x02, 0x21, 0x01, 0xf0, 0xa8, 0xf9, 0x72, 0x7d, + 0x05, 0x21, 0x01, 0xf0, 0xa4, 0xf9, 0x00, 0x20, 0xbd, 0xe8, 0xf0, 0x81, + 0x68, 0x7b, 0x69, 0x7a, 0x41, 0xea, 0x80, 0x01, 0xc9, 0xb2, 0x40, 0x46, + 0xff, 0xf7, 0x0d, 0xbc, 0xf8, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, + 0x00, 0x27, 0x06, 0xeb, 0x87, 0x00, 0x00, 0xf1, 0x3c, 0x03, 0x01, 0x6b, + 0x2a, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x05, 0xf8, 0x7f, 0x1c, 0x03, 0x2f, + 0xf3, 0xd3, 0x00, 0x20, 0xf2, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, 0x8e, 0xb0, + 0x06, 0x46, 0x0c, 0x46, 0x17, 0x46, 0x98, 0x46, 0xe1, 0xf7, 0x36, 0xff, + 0x05, 0x46, 0x1c, 0x21, 0x68, 0x46, 0xdb, 0xf7, 0x5f, 0xfd, 0x1c, 0x21, + 0x07, 0xa8, 0xdb, 0xf7, 0x5b, 0xfd, 0x00, 0x96, 0x01, 0x21, 0x8d, 0xf8, + 0x04, 0x10, 0xf9, 0x68, 0x04, 0x91, 0x00, 0x21, 0x05, 0x91, 0x38, 0x69, + 0x03, 0x90, 0x68, 0x46, 0x39, 0x7a, 0x8d, 0xf8, 0x18, 0x10, 0x02, 0x94, + 0xfa, 0xf7, 0x4a, 0xf9, 0x04, 0x00, 0x1a, 0xd1, 0x00, 0x98, 0x4f, 0xf4, + 0x7a, 0x71, 0xfa, 0xf7, 0xb7, 0xf9, 0x10, 0xb1, 0x40, 0xf6, 0x03, 0x14, + 0x11, 0xe0, 0x07, 0xa9, 0x68, 0x46, 0xfa, 0xf7, 0xb3, 0xf9, 0x10, 0xb1, + 0x40, 0xf6, 0x04, 0x14, 0x09, 0xe0, 0x9d, 0xed, 0x0b, 0x0a, 0xca, 0xf7, + 0xaf, 0xf9, 0xf2, 0xee, 0x04, 0x0a, 0x60, 0xee, 0x20, 0x0a, 0xc8, 0xed, + 0x00, 0x0a, 0xe1, 0xf7, 0xfd, 0xfe, 0x01, 0x46, 0x28, 0x46, 0xe1, 0xf7, + 0x3d, 0xff, 0x20, 0x46, 0x0e, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x00, + 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, 0x82, 0xb0, 0x00, 0x24, + 0x07, 0x46, 0x01, 0x94, 0x0d, 0x46, 0x92, 0x46, 0xb5, 0xf8, 0xe0, 0x03, + 0x00, 0x28, 0x05, 0xf1, 0x22, 0x06, 0x05, 0xf1, 0x38, 0x08, 0x9f, 0xed, + 0xa0, 0x8a, 0x00, 0xf0, 0xb7, 0x80, 0xd8, 0xf8, 0x00, 0x10, 0x05, 0xf1, + 0x44, 0x03, 0x00, 0xf0, 0x0d, 0xff, 0x00, 0xf0, 0x40, 0xf9, 0x40, 0xf1, + 0x2f, 0x81, 0xb9, 0x46, 0x69, 0x1c, 0x0c, 0x20, 0x01, 0xf8, 0x24, 0x00, + 0x0c, 0x22, 0xe1, 0xb2, 0x00, 0xf0, 0x44, 0xf9, 0x64, 0x1c, 0x06, 0x2c, + 0xf4, 0xd3, 0x00, 0xf0, 0x42, 0xf9, 0x00, 0xf0, 0x3b, 0xf9, 0x28, 0x46, + 0x00, 0xf0, 0x11, 0xfb, 0xaa, 0x7e, 0x06, 0x21, 0x48, 0x46, 0xff, 0xf7, + 0x5e, 0xfb, 0x32, 0x78, 0x08, 0x21, 0x48, 0x46, 0xff, 0xf7, 0x59, 0xfb, + 0xaa, 0x78, 0x00, 0x21, 0x48, 0x46, 0xff, 0xf7, 0x54, 0xfb, 0x30, 0x7b, + 0x31, 0x7a, 0xdf, 0xf8, 0x30, 0x6d, 0x41, 0xea, 0x80, 0x01, 0xc9, 0xb2, + 0x48, 0x46, 0xff, 0xf7, 0x64, 0xfb, 0x2a, 0x7e, 0x06, 0x21, 0x48, 0x46, + 0xff, 0xf7, 0xd6, 0xfa, 0x2a, 0x7f, 0x07, 0x21, 0x48, 0x46, 0xff, 0xf7, + 0xd1, 0xfa, 0x2a, 0x46, 0x51, 0x46, 0x48, 0x46, 0xff, 0xf7, 0x48, 0xff, + 0x2b, 0x46, 0x52, 0x46, 0x49, 0x46, 0x01, 0x20, 0x01, 0xf0, 0x78, 0xf9, + 0x04, 0x00, 0x5f, 0xd1, 0x00, 0xf0, 0x0b, 0xf9, 0x00, 0xf0, 0x04, 0xf9, + 0x00, 0x20, 0x00, 0x90, 0x00, 0x23, 0x2a, 0x46, 0x51, 0x46, 0x48, 0x46, + 0x00, 0xf0, 0x24, 0xfb, 0x95, 0xf8, 0x8c, 0x00, 0x03, 0x28, 0x02, 0xd1, + 0x32, 0x46, 0x00, 0xf0, 0x41, 0xfa, 0x95, 0xf8, 0x8c, 0x00, 0x04, 0x28, + 0x03, 0xd1, 0x06, 0xf1, 0x38, 0x02, 0x00, 0xf0, 0x39, 0xfa, 0x00, 0xf0, + 0xf8, 0xf8, 0x01, 0x9f, 0x04, 0x46, 0x00, 0xe0, 0x7f, 0x1c, 0xb4, 0xb1, + 0x00, 0xf0, 0xf1, 0xf8, 0x00, 0xf0, 0xf6, 0xf8, 0x48, 0x46, 0xff, 0xf7, + 0x2a, 0xff, 0x98, 0xed, 0x01, 0x0a, 0xd8, 0xed, 0x03, 0x0a, 0x06, 0x2f, + 0x30, 0xee, 0x60, 0x0a, 0x00, 0xd3, 0x34, 0xb1, 0xb4, 0xee, 0x48, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0xe8, 0xdb, 0x00, 0x2c, 0xe6, 0xd1, 0x95, 0xf8, + 0xc0, 0x00, 0x03, 0x28, 0x03, 0xd1, 0x06, 0xf1, 0x70, 0x02, 0x00, 0xf0, + 0x13, 0xfa, 0x95, 0xf8, 0xc0, 0x00, 0x04, 0x28, 0x03, 0xd1, 0x06, 0xf1, + 0xa0, 0x02, 0x00, 0xf0, 0x0b, 0xfa, 0x95, 0xf8, 0xf4, 0x00, 0x03, 0x28, + 0x03, 0xd1, 0x06, 0xf1, 0xd0, 0x02, 0x00, 0xf0, 0x03, 0xfa, 0x95, 0xf8, + 0xf4, 0x00, 0x04, 0x28, 0x03, 0xd1, 0x06, 0xf5, 0x80, 0x72, 0x00, 0xf0, + 0xfb, 0xf9, 0x05, 0xf5, 0x77, 0x71, 0x1f, 0xfa, 0x89, 0xf0, 0xc9, 0xf7, + 0x05, 0xfe, 0x04, 0x46, 0x00, 0x2c, 0x06, 0xd0, 0x23, 0x46, 0x06, 0xf5, + 0x98, 0x72, 0x09, 0x21, 0x03, 0x20, 0xd7, 0xf7, 0xd2, 0xff, 0x81, 0xe0, + 0x6f, 0xf0, 0x01, 0x09, 0xad, 0xf8, 0x00, 0x40, 0x4a, 0x46, 0x38, 0x46, + 0x01, 0xf0, 0x94, 0xf8, 0xd8, 0xf8, 0x00, 0x10, 0x05, 0xf1, 0x44, 0x03, + 0x52, 0x46, 0x00, 0xf0, 0x4d, 0xfe, 0x00, 0xf0, 0x80, 0xf8, 0x6f, 0xd5, + 0x3c, 0x46, 0x00, 0x27, 0x69, 0x1c, 0x0c, 0x20, 0x01, 0xf8, 0x27, 0x00, + 0x0c, 0x22, 0xf9, 0xb2, 0x00, 0xf0, 0x9d, 0xf8, 0x7f, 0x1c, 0x06, 0x2f, + 0xf4, 0xd3, 0x4a, 0x46, 0x29, 0x46, 0x20, 0x46, 0x01, 0xf0, 0x78, 0xf8, + 0x9d, 0xf8, 0x01, 0x90, 0x9d, 0xf8, 0x00, 0x70, 0x05, 0xf5, 0x78, 0x7b, + 0x08, 0xe0, 0x7f, 0x1c, 0x37, 0x73, 0x20, 0x46, 0x31, 0x7a, 0x41, 0xea, + 0x87, 0x01, 0xc9, 0xb2, 0xff, 0xf7, 0xaf, 0xfa, 0x00, 0x20, 0x00, 0x90, + 0x03, 0x23, 0x00, 0xf0, 0x54, 0xf8, 0x00, 0x20, 0x00, 0x90, 0x09, 0x23, + 0x00, 0xf0, 0x4f, 0xf8, 0x9b, 0xf9, 0x04, 0x10, 0x01, 0x20, 0x35, 0x29, + 0x0e, 0xdb, 0x5f, 0xfa, 0x89, 0xf1, 0x03, 0x29, 0x0a, 0xd2, 0x09, 0xf1, + 0x01, 0x09, 0x86, 0xf8, 0x08, 0x90, 0x30, 0x7b, 0x49, 0xea, 0x80, 0x01, + 0xc9, 0xb2, 0xff, 0xf7, 0xee, 0xfd, 0x00, 0x20, 0x9b, 0xf9, 0x04, 0x10, + 0x11, 0xf1, 0x34, 0x0f, 0x02, 0xda, 0xf9, 0xb2, 0x03, 0x29, 0xd0, 0xd3, + 0x00, 0x28, 0xd7, 0xd0, 0x00, 0x20, 0x00, 0x90, 0x26, 0x46, 0x00, 0xf0, + 0x27, 0xf8, 0xdd, 0xf8, 0x04, 0x90, 0x04, 0x46, 0x01, 0xe0, 0x09, 0xf1, + 0x01, 0x09, 0xcc, 0xb1, 0x00, 0x20, 0x00, 0x90, 0x00, 0xf0, 0x1c, 0xf8, + 0x00, 0xf0, 0x44, 0xf8, 0x30, 0x46, 0xff, 0xf7, 0x78, 0xfe, 0x98, 0xed, + 0x01, 0x0a, 0xd8, 0xed, 0x03, 0x0a, 0xb9, 0xf1, 0x06, 0x0f, 0x30, 0xee, + 0x60, 0x0a, 0x00, 0xd3, 0x34, 0xb1, 0xb4, 0xee, 0x48, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0xe4, 0xdb, 0x00, 0x2c, 0xe2, 0xd1, 0x02, 0xb0, 0x20, 0x46, + 0x3e, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x60, 0x42, 0x04, 0x23, 0x2a, 0x46, + 0x51, 0x46, 0x30, 0x46, 0x38, 0xe2, 0x2a, 0x46, 0x51, 0x46, 0x20, 0x46, + 0x34, 0xe2, 0x98, 0xed, 0x01, 0x0a, 0xd8, 0xed, 0x03, 0x0a, 0x70, 0xee, + 0x60, 0x0a, 0x9a, 0xed, 0x07, 0x0a, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x70, 0x47, 0x6a, 0x7f, 0x07, 0x21, 0x48, 0x46, 0xff, 0xf7, + 0xef, 0xb9, 0x1b, 0x20, 0x68, 0x76, 0x68, 0x77, 0x06, 0x21, 0x6a, 0x7e, + 0x48, 0x46, 0xff, 0xf7, 0xe7, 0xb9, 0x00, 0x20, 0x00, 0x90, 0x01, 0x23, + 0x2a, 0x46, 0x51, 0x46, 0x48, 0x46, 0x13, 0xe2, 0x04, 0x46, 0xd8, 0xf8, + 0x00, 0x10, 0x05, 0xf1, 0x44, 0x03, 0x52, 0x46, 0x70, 0x47, 0x20, 0x46, + 0xff, 0xf7, 0xd6, 0xb9, 0x2d, 0xe9, 0xf8, 0x4f, 0x8a, 0x46, 0x2d, 0xed, + 0x02, 0x8b, 0x0a, 0xf5, 0x78, 0x76, 0x82, 0xb0, 0x00, 0x21, 0xf1, 0x61, + 0x80, 0x46, 0x01, 0x91, 0x91, 0x46, 0x30, 0x88, 0x00, 0x28, 0x9f, 0xed, + 0xb6, 0x8a, 0xdf, 0xed, 0xb5, 0x8a, 0x00, 0xf0, 0x80, 0x80, 0x99, 0xf8, + 0x06, 0x00, 0x01, 0x24, 0x01, 0x28, 0x34, 0xd1, 0x34, 0x75, 0x00, 0x27, + 0x00, 0xf0, 0x07, 0xf9, 0x00, 0x22, 0x00, 0x92, 0x00, 0xf0, 0xfe, 0xf8, + 0x00, 0xf0, 0x23, 0xf9, 0x00, 0xf0, 0x28, 0xf9, 0x9a, 0xf8, 0x20, 0x10, + 0x00, 0xee, 0x10, 0x1a, 0x7f, 0x1c, 0xb8, 0xee, 0x40, 0x0a, 0xd6, 0xed, + 0x07, 0x0a, 0x03, 0x2f, 0x30, 0xee, 0x08, 0x8a, 0x78, 0xee, 0xa0, 0x8a, + 0x01, 0xd2, 0x00, 0x28, 0xe4, 0xd0, 0x00, 0xbb, 0xf0, 0xee, 0x08, 0x0a, + 0xb0, 0xee, 0x08, 0x0a, 0xc8, 0xee, 0xa0, 0x8a, 0x88, 0xee, 0x00, 0x0a, + 0x07, 0x22, 0x51, 0x46, 0x40, 0x46, 0x00, 0xf0, 0x6b, 0xfd, 0xb7, 0xee, + 0x00, 0x0a, 0xc6, 0xed, 0x07, 0x8a, 0x38, 0xee, 0x80, 0x0a, 0x40, 0x46, + 0x00, 0xf0, 0xb0, 0xff, 0x09, 0xe0, 0x00, 0xf0, 0xda, 0xf8, 0x00, 0x20, + 0x00, 0x90, 0x00, 0xf0, 0xcb, 0xf8, 0x00, 0xf0, 0xf0, 0xf8, 0x00, 0xf0, + 0xf5, 0xf8, 0x99, 0xf8, 0x06, 0x00, 0x01, 0x28, 0x37, 0xd1, 0x00, 0x20, + 0xf0, 0x61, 0x00, 0x27, 0x00, 0xf0, 0xc3, 0xf8, 0x37, 0xb1, 0x02, 0x2f, + 0x08, 0xd0, 0x3c, 0xbf, 0x0b, 0x25, 0x4f, 0xf0, 0x0e, 0x0b, 0x06, 0xe0, + 0x0a, 0x25, 0x4f, 0xf0, 0x0d, 0x0b, 0x02, 0xe0, 0x0c, 0x25, 0x4f, 0xf0, + 0x0f, 0x0b, 0x00, 0xf0, 0xcd, 0xf8, 0x00, 0xf0, 0xbd, 0xf8, 0x00, 0xf0, + 0xc9, 0xf8, 0x00, 0xf0, 0xb9, 0xf8, 0x00, 0x20, 0x00, 0x90, 0x5f, 0xfa, + 0x8b, 0xf3, 0x00, 0xf0, 0xa2, 0xf8, 0x00, 0xf0, 0xb1, 0xf8, 0x7f, 0x1c, + 0x96, 0xed, 0x07, 0x0a, 0x03, 0x2f, 0x78, 0xee, 0x80, 0x8a, 0xd7, 0xd3, + 0xb0, 0xee, 0x08, 0x0a, 0x88, 0xee, 0x80, 0x0a, 0x86, 0xed, 0x07, 0x0a, + 0xf7, 0xee, 0x00, 0x0a, 0x30, 0xee, 0x20, 0x0a, 0x40, 0x46, 0x00, 0xf0, + 0x69, 0xff, 0x00, 0x21, 0x00, 0xf0, 0x93, 0xf8, 0x00, 0xf0, 0xb4, 0xf8, + 0x00, 0x20, 0x00, 0x90, 0x05, 0x23, 0x00, 0xf0, 0x82, 0xf8, 0x0a, 0xf5, + 0xc0, 0x74, 0x06, 0x46, 0x20, 0x7c, 0xdf, 0xf8, 0x60, 0x59, 0x03, 0x28, + 0x03, 0xd1, 0x05, 0xf1, 0x70, 0x02, 0x00, 0xf0, 0x83, 0xf8, 0x20, 0x7c, + 0x04, 0x28, 0x03, 0xd1, 0x05, 0xf1, 0xa0, 0x02, 0x00, 0xf0, 0x7c, 0xf8, + 0x94, 0xed, 0x00, 0x0a, 0xd9, 0xed, 0x07, 0x0a, 0x00, 0xf0, 0xd2, 0xff, + 0x44, 0xd5, 0x00, 0xf0, 0x7e, 0xf8, 0x00, 0xf0, 0x91, 0xf8, 0x00, 0xf0, + 0x7a, 0xf8, 0x00, 0xf0, 0x8d, 0xf8, 0x46, 0x46, 0x01, 0x9c, 0x80, 0x46, + 0x00, 0xe0, 0x64, 0x1c, 0xb8, 0xf1, 0x00, 0x0f, 0x23, 0xd0, 0x00, 0x20, + 0x00, 0x90, 0x06, 0x23, 0x00, 0xf0, 0x4e, 0xf8, 0x00, 0x20, 0x00, 0x90, + 0x10, 0x23, 0x00, 0xf0, 0x49, 0xf8, 0x80, 0x46, 0xda, 0xf8, 0x34, 0x10, + 0x0a, 0xf1, 0x40, 0x03, 0x4a, 0x46, 0x30, 0x46, 0xff, 0xf7, 0x51, 0xfd, + 0x9a, 0xed, 0x0f, 0x0a, 0xda, 0xed, 0x10, 0x0a, 0x06, 0x2c, 0x30, 0xee, + 0x60, 0x0a, 0x02, 0xd3, 0xb8, 0xf1, 0x00, 0x0f, 0x05, 0xd0, 0x00, 0xf0, + 0x9f, 0xff, 0xda, 0xdb, 0xb8, 0xf1, 0x00, 0x0f, 0xd7, 0xd1, 0x9a, 0xf8, + 0xc4, 0x01, 0x03, 0x28, 0x46, 0x46, 0x03, 0xd1, 0x05, 0xf1, 0xd0, 0x02, + 0x00, 0xf0, 0x38, 0xf8, 0x9a, 0xf8, 0xc4, 0x01, 0x04, 0x28, 0x03, 0xd1, + 0x05, 0xf5, 0x80, 0x72, 0x00, 0xf0, 0x30, 0xf8, 0x2e, 0xb1, 0x33, 0x46, + 0x05, 0xa2, 0x09, 0x21, 0x03, 0x20, 0xd7, 0xf7, 0x10, 0xfe, 0x02, 0xb0, + 0x30, 0x46, 0x00, 0xbf, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x49, 0x6d, 0x70, 0x72, 0x6f, 0x76, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, + 0x3d, 0x20, 0x25, 0x64, 0x20, 0x0a, 0x00, 0x00, 0x52, 0x46, 0x49, 0x46, + 0x30, 0x46, 0xe9, 0xe0, 0x07, 0x23, 0x52, 0x46, 0x49, 0x46, 0x40, 0x46, + 0xe4, 0xe0, 0x04, 0xfa, 0x07, 0xf1, 0x01, 0xf0, 0x07, 0x01, 0xc9, 0x43, + 0xc9, 0xb2, 0x40, 0x46, 0xff, 0xf7, 0x05, 0xb9, 0x09, 0x21, 0x02, 0x20, + 0xd7, 0xf7, 0xe3, 0xbd, 0x00, 0x21, 0x00, 0x91, 0x10, 0x23, 0x52, 0x46, + 0x49, 0x46, 0x40, 0x46, 0xd0, 0xe0, 0x00, 0x20, 0x00, 0x90, 0x06, 0x23, + 0x52, 0x46, 0x49, 0x46, 0x40, 0x46, 0xc9, 0xe0, 0x00, 0x20, 0x00, 0x90, + 0xeb, 0xb2, 0x52, 0x46, 0x49, 0x46, 0x40, 0x46, 0xc2, 0xe0, 0x00, 0x20, + 0x00, 0x90, 0x08, 0x23, 0x52, 0x46, 0x49, 0x46, 0x40, 0x46, 0xbb, 0xe0, + 0x00, 0x20, 0x00, 0x90, 0x10, 0x23, 0x52, 0x46, 0x49, 0x46, 0x40, 0x46, + 0xb4, 0xe0, 0x70, 0xb5, 0x00, 0x23, 0xdf, 0xf8, 0x74, 0x2d, 0xdf, 0xf8, + 0xe8, 0x5d, 0x00, 0x24, 0x55, 0xf8, 0x34, 0x60, 0x86, 0x1b, 0x48, 0xbf, + 0x76, 0x42, 0x96, 0x42, 0xbc, 0xbf, 0x32, 0x46, 0x23, 0x46, 0x64, 0x1c, + 0x08, 0x2c, 0xf3, 0xd1, 0x55, 0xf8, 0x33, 0x40, 0x20, 0x1a, 0xc0, 0x22, + 0x50, 0x43, 0x90, 0xfb, 0xf4, 0xf0, 0x40, 0xb2, 0x1f, 0x28, 0xc8, 0xbf, + 0x1f, 0x20, 0x10, 0xf1, 0x21, 0x0f, 0xb8, 0xbf, 0x6f, 0xf0, 0x1f, 0x00, + 0x20, 0x30, 0x0b, 0x60, 0xc0, 0xb2, 0x70, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x30, 0xb5, 0xdf, 0xf8, 0x9c, 0x4d, 0x04, 0xeb, 0xc0, 0x00, 0x6f, 0xf0, + 0x01, 0x04, 0x90, 0xf9, 0x04, 0x00, 0xa0, 0x42, 0x02, 0xda, 0x00, 0x20, + 0x18, 0x70, 0x0e, 0xe0, 0x00, 0x25, 0x1d, 0x70, 0x10, 0xb9, 0x10, 0x70, + 0x0d, 0x70, 0x1d, 0xe0, 0x10, 0xf1, 0x01, 0x0f, 0x03, 0xd1, 0x05, 0x20, + 0x10, 0x70, 0x0d, 0x70, 0x05, 0xe0, 0xa0, 0x42, 0x05, 0xd1, 0x07, 0x20, + 0x10, 0x70, 0x00, 0x22, 0x0a, 0x70, 0x07, 0x21, 0x16, 0xe0, 0x01, 0x28, + 0x02, 0xd1, 0x15, 0x70, 0x05, 0x22, 0x08, 0xe0, 0x02, 0x28, 0x08, 0xbf, + 0x15, 0x70, 0x03, 0xd0, 0x03, 0x28, 0x05, 0xd1, 0x01, 0x20, 0x10, 0x70, + 0x07, 0x22, 0x0a, 0x70, 0x00, 0x21, 0x05, 0xe0, 0x03, 0x20, 0x10, 0x70, + 0x07, 0x22, 0x0a, 0x70, 0x00, 0x21, 0x19, 0x70, 0x03, 0x98, 0x01, 0x70, + 0x30, 0xbd, 0x7f, 0xb5, 0x04, 0x46, 0x04, 0xf5, 0x74, 0x75, 0x02, 0xa9, + 0x28, 0x68, 0xff, 0xf7, 0x92, 0xff, 0x01, 0xa9, 0x06, 0x46, 0x00, 0x91, + 0x0d, 0xf1, 0x05, 0x03, 0x02, 0x98, 0x0d, 0xf1, 0x06, 0x02, 0x0d, 0xf1, + 0x07, 0x01, 0xff, 0xf7, 0xaf, 0xff, 0x02, 0x99, 0xdf, 0xf8, 0xf8, 0x0c, + 0x00, 0xeb, 0xc1, 0x02, 0x13, 0x79, 0xab, 0x74, 0x9d, 0xf8, 0x04, 0x10, + 0xa1, 0x70, 0x9d, 0xf8, 0x04, 0x20, 0xa2, 0x71, 0x9d, 0xf8, 0x04, 0x10, + 0xa1, 0x72, 0x9d, 0xf8, 0x04, 0x20, 0xa2, 0x73, 0x9d, 0xf8, 0x04, 0x10, + 0xa1, 0x74, 0x9d, 0xf8, 0x04, 0x20, 0xa2, 0x75, 0x02, 0x99, 0x50, 0xf8, + 0x31, 0x10, 0x2a, 0x68, 0x8a, 0x1a, 0xc0, 0x20, 0x42, 0x43, 0x92, 0xfb, + 0xf1, 0xf0, 0xe8, 0x74, 0x26, 0x76, 0x04, 0xf1, 0x22, 0x00, 0x26, 0x77, + 0x00, 0x21, 0x01, 0x72, 0x9d, 0xf8, 0x06, 0x20, 0xa2, 0x76, 0x9d, 0xf8, + 0x07, 0x10, 0x01, 0x70, 0x9d, 0xf8, 0x05, 0x20, 0x02, 0x72, 0xa1, 0x7e, + 0xa1, 0x77, 0x02, 0x78, 0x01, 0x7a, 0x02, 0x71, 0x01, 0x73, 0x7f, 0xbd, + 0xb4, 0x76, 0x02, 0x20, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x06, 0x8b, + 0x86, 0xb0, 0x9a, 0x46, 0x00, 0x27, 0x88, 0x46, 0x15, 0x46, 0x00, 0x24, + 0xba, 0xf1, 0x10, 0x0f, 0x05, 0x94, 0x9f, 0xed, 0x36, 0x8a, 0xad, 0xf8, + 0x00, 0x40, 0x8d, 0xf8, 0x08, 0x40, 0x8d, 0xf8, 0x03, 0x40, 0xdf, 0xed, + 0x33, 0x8a, 0x05, 0xf5, 0x67, 0x71, 0xb2, 0xee, 0x00, 0x0a, 0xf3, 0xee, + 0x00, 0x0a, 0xb0, 0xee, 0x00, 0x1a, 0xb1, 0xee, 0x00, 0x9a, 0xf7, 0xee, + 0x00, 0x1a, 0x9f, 0xed, 0x2d, 0x2a, 0xdf, 0xed, 0x2d, 0x2a, 0x9f, 0xed, + 0x2d, 0x3a, 0x00, 0xf2, 0x4d, 0x81, 0xdf, 0xe8, 0x1a, 0xf0, 0x11, 0x00, + 0x57, 0x00, 0x92, 0x00, 0xae, 0x00, 0x10, 0x01, 0x0a, 0x01, 0x31, 0x01, + 0xba, 0x00, 0xcd, 0x00, 0xda, 0x00, 0xe8, 0x00, 0xfc, 0x00, 0x03, 0x01, + 0x1c, 0x01, 0x23, 0x01, 0x2a, 0x01, 0x37, 0x01, 0x05, 0xf1, 0x5c, 0x02, + 0x4f, 0xf0, 0x40, 0x43, 0x14, 0x70, 0x53, 0x60, 0xc2, 0xed, 0x03, 0x1a, + 0xc2, 0xed, 0x04, 0x1a, 0xdf, 0xf8, 0x78, 0x3c, 0x93, 0x60, 0x02, 0x23, + 0x13, 0x75, 0x82, 0xed, 0x06, 0x3a, 0x91, 0xf9, 0x46, 0x10, 0x00, 0xee, + 0x10, 0x1a, 0xb8, 0xee, 0xc0, 0x0a, 0x82, 0xed, 0x09, 0x0a, 0x98, 0xf8, + 0x05, 0x70, 0x52, 0x46, 0x34, 0x21, 0x4a, 0x43, 0x05, 0xeb, 0x02, 0x09, + 0x09, 0xf1, 0x70, 0x06, 0x31, 0x69, 0xd6, 0xed, 0x04, 0x0a, 0xb1, 0x61, + 0x40, 0xf6, 0x06, 0x11, 0x99, 0xed, 0x19, 0x0a, 0x00, 0xf0, 0x16, 0xfe, + 0x02, 0xd5, 0x02, 0x22, 0x0c, 0x46, 0x32, 0x77, 0x96, 0xed, 0x04, 0x0a, + 0xd9, 0xed, 0x18, 0x0a, 0x00, 0xf0, 0x0c, 0xfe, 0x40, 0xf1, 0x05, 0x81, + 0x0c, 0x46, 0x01, 0x20, 0xc9, 0xe2, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x42, 0x00, 0x00, 0x7c, 0xc2, + 0x00, 0x00, 0xc8, 0x42, 0x9d, 0xf9, 0x58, 0x30, 0x05, 0xf1, 0x90, 0x02, + 0x01, 0x26, 0x01, 0x2b, 0x16, 0x70, 0x09, 0xd1, 0x2b, 0x7e, 0x82, 0xed, + 0x02, 0x2a, 0x00, 0xee, 0x90, 0x3a, 0xf8, 0xee, 0x60, 0x0a, 0xc2, 0xed, + 0x01, 0x0a, 0x0c, 0xe0, 0x4f, 0xf0, 0xff, 0x36, 0xb3, 0x42, 0x54, 0x60, + 0x0a, 0xd1, 0x95, 0xf8, 0x18, 0x90, 0x00, 0xee, 0x90, 0x9a, 0xf8, 0xee, + 0x60, 0x0a, 0xc2, 0xed, 0x02, 0x0a, 0xc9, 0x6d, 0x91, 0x61, 0x03, 0xe0, + 0x82, 0xed, 0x02, 0x2a, 0x82, 0xed, 0x06, 0x3a, 0x98, 0xf8, 0x04, 0x10, + 0xc2, 0xed, 0x03, 0x1a, 0x01, 0x29, 0x0c, 0xbf, 0xc2, 0xed, 0x04, 0x1a, + 0x82, 0xed, 0x04, 0x0a, 0x02, 0x21, 0x11, 0x75, 0x2b, 0x7e, 0x00, 0xee, + 0x10, 0x3a, 0xb8, 0xee, 0x40, 0x0a, 0x82, 0xed, 0x09, 0x0a, 0x01, 0x27, + 0x99, 0xe7, 0x05, 0xf1, 0xc4, 0x01, 0x02, 0x22, 0x0a, 0x70, 0x4c, 0x60, + 0x81, 0xed, 0x02, 0x2a, 0x98, 0xf8, 0x04, 0x20, 0xc1, 0xed, 0x03, 0x1a, + 0x01, 0x2a, 0x0c, 0xbf, 0xc1, 0xed, 0x04, 0x1a, 0x81, 0xed, 0x04, 0x0a, + 0x02, 0x22, 0x00, 0xf0, 0x94, 0xfa, 0x6a, 0x7e, 0x00, 0xee, 0x10, 0x2a, + 0xb8, 0xee, 0x40, 0x0a, 0x81, 0xed, 0x09, 0x0a, 0xe1, 0xe7, 0x05, 0xf1, + 0xf8, 0x01, 0x03, 0x22, 0x00, 0xf0, 0x92, 0xfa, 0xc1, 0xed, 0x04, 0x0a, + 0x81, 0xed, 0x06, 0x3a, 0x95, 0xf8, 0x20, 0x20, 0xec, 0xe7, 0x05, 0xf5, + 0xe4, 0x71, 0x07, 0x22, 0x0a, 0x70, 0xc1, 0xed, 0x01, 0x2a, 0x01, 0x22, + 0x0a, 0x75, 0x81, 0xed, 0x02, 0x2a, 0xc1, 0xed, 0x03, 0x1a, 0x81, 0xed, + 0x04, 0x0a, 0x81, 0xed, 0x06, 0x3a, 0x95, 0xf8, 0x20, 0x20, 0xd9, 0xe7, + 0x05, 0xf5, 0xfe, 0x71, 0x08, 0x22, 0x00, 0xf0, 0x6c, 0xfa, 0xc1, 0xed, + 0x03, 0x1a, 0x81, 0xed, 0x04, 0x0a, 0x00, 0xf0, 0x62, 0xfa, 0x4c, 0x62, + 0xb5, 0xe7, 0x05, 0xf5, 0x0c, 0x71, 0x09, 0x22, 0x0a, 0x70, 0xc1, 0xed, + 0x01, 0x2a, 0x02, 0x22, 0x81, 0xed, 0x02, 0x2a, 0xc1, 0xed, 0x03, 0x1a, + 0xc1, 0xed, 0x04, 0x0a, 0xed, 0xe7, 0x05, 0xf5, 0x19, 0x71, 0x0a, 0x22, + 0x00, 0xf0, 0x51, 0xfa, 0x81, 0xed, 0x03, 0x1a, 0x81, 0xed, 0x04, 0x1a, + 0x00, 0xf0, 0x47, 0xfa, 0x01, 0x27, 0x2b, 0x78, 0x00, 0xee, 0x10, 0x3a, + 0xb8, 0xee, 0x40, 0x0a, 0x81, 0xed, 0x09, 0x0a, 0x2f, 0xe7, 0x05, 0xf5, + 0x26, 0x71, 0x0b, 0x22, 0x00, 0xf0, 0x59, 0xfa, 0x2a, 0x79, 0xa3, 0xe7, + 0x05, 0xf5, 0x33, 0x71, 0x0c, 0x22, 0x00, 0xf0, 0x52, 0xfa, 0x2a, 0x7a, + 0x9c, 0xe7, 0x05, 0xf5, 0xb0, 0x71, 0x05, 0x22, 0x00, 0xf0, 0x40, 0xfa, + 0xc5, 0xe7, 0x05, 0xf5, 0x96, 0x71, 0x04, 0x22, 0x00, 0xf0, 0x30, 0xfa, + 0x81, 0xed, 0x04, 0x9a, 0x81, 0xed, 0x06, 0x3a, 0x95, 0xf8, 0x21, 0x20, + 0x8a, 0xe7, 0x05, 0xf5, 0x40, 0x71, 0x0d, 0x22, 0x00, 0xf0, 0x39, 0xfa, + 0x6a, 0x78, 0x83, 0xe7, 0x05, 0xf5, 0x4d, 0x71, 0x0e, 0x22, 0x00, 0xf0, + 0x32, 0xfa, 0x6a, 0x79, 0x7c, 0xe7, 0x05, 0xf5, 0x5a, 0x71, 0x0f, 0x22, + 0x00, 0xf0, 0x2b, 0xfa, 0x6a, 0x7a, 0x75, 0xe7, 0x05, 0xf5, 0xca, 0x71, + 0x06, 0x22, 0x00, 0xf0, 0x19, 0xfa, 0x9e, 0xe7, 0x10, 0x23, 0x0b, 0x70, + 0xdf, 0xf8, 0x58, 0x2a, 0xdf, 0xf8, 0x58, 0x3a, 0x4a, 0x60, 0x8b, 0x60, + 0xdf, 0xf8, 0x54, 0x2a, 0xdf, 0xf8, 0x54, 0x3a, 0xca, 0x60, 0x0b, 0x61, + 0x01, 0x22, 0x00, 0xf0, 0xf2, 0xf9, 0x0a, 0x6e, 0x4a, 0x62, 0xe0, 0xe6, + 0x40, 0xf6, 0x05, 0x14, 0xc8, 0xe1, 0x00, 0x2c, 0xfc, 0xd1, 0x05, 0xf1, + 0x30, 0x0b, 0x01, 0x90, 0x05, 0xf1, 0x3c, 0x03, 0xdb, 0xf8, 0x00, 0x10, + 0x42, 0x46, 0xff, 0xf7, 0x9c, 0xfa, 0x01, 0x99, 0x2b, 0x46, 0x42, 0x46, + 0x00, 0x20, 0x00, 0xf0, 0xb9, 0xfc, 0x04, 0x00, 0xea, 0xd1, 0x30, 0x78, + 0x01, 0x28, 0x02, 0xd0, 0x02, 0x28, 0x0b, 0xd0, 0x16, 0xe0, 0xdb, 0xf8, + 0x04, 0x10, 0x01, 0x98, 0x05, 0xf1, 0x40, 0x03, 0x42, 0x46, 0xff, 0xf7, + 0x86, 0xfa, 0x00, 0xf0, 0x00, 0xfa, 0x09, 0xe0, 0xdb, 0xf8, 0x08, 0x10, + 0x01, 0x98, 0x05, 0xf1, 0x44, 0x03, 0x42, 0x46, 0xff, 0xf7, 0x7b, 0xfa, + 0x00, 0xf0, 0xef, 0xf9, 0x30, 0xee, 0x60, 0x8a, 0x00, 0x2c, 0xcb, 0xd1, + 0x96, 0xed, 0x01, 0x0a, 0x96, 0xed, 0x04, 0xaa, 0x86, 0xed, 0x02, 0x8a, + 0x30, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0xc0, 0x9a, 0xd9, 0xed, 0x1b, 0xaa, + 0xf0, 0xee, 0x48, 0x0a, 0xb0, 0xee, 0x4a, 0x0a, 0x50, 0x46, 0x00, 0xf0, + 0xe4, 0xf9, 0x99, 0xed, 0x1b, 0x0a, 0xd9, 0xed, 0x1a, 0x0a, 0xf4, 0xee, + 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x0b, 0xd5, 0x60, 0xee, 0x89, 0x0a, + 0x80, 0xee, 0x20, 0x0a, 0xf7, 0xee, 0x00, 0x0a, 0x30, 0xee, 0x20, 0x0a, + 0xc9, 0xf7, 0xfe, 0xfa, 0xfc, 0xee, 0xc0, 0x8a, 0xcd, 0xf8, 0x10, 0x80, + 0x03, 0x95, 0x8d, 0xf8, 0x02, 0xa0, 0x05, 0x9d, 0x9d, 0xf8, 0x08, 0x80, + 0x9d, 0xf8, 0x03, 0xa0, 0xcd, 0xed, 0x02, 0x8a, 0x25, 0xe0, 0x01, 0x20, + 0x8d, 0xf8, 0x01, 0x00, 0x6d, 0x1c, 0xed, 0xb2, 0xe8, 0x07, 0x0e, 0xd4, + 0xb5, 0xee, 0x00, 0x0a, 0x6a, 0xee, 0x80, 0xaa, 0x99, 0xed, 0x1a, 0x0a, + 0xb4, 0xee, 0x6a, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xa4, 0xbf, 0xf0, 0xee, + 0x40, 0xaa, 0x0a, 0xf1, 0x01, 0x0a, 0x03, 0x98, 0x04, 0x9a, 0xdb, 0xf8, + 0x00, 0x10, 0x00, 0xf1, 0x3c, 0x03, 0x01, 0x98, 0xff, 0xf7, 0x21, 0xfa, + 0x03, 0x9b, 0x04, 0x9a, 0x01, 0x99, 0x00, 0x20, 0x00, 0xf0, 0x3e, 0xfc, + 0x04, 0x46, 0x02, 0x98, 0xb5, 0xeb, 0x40, 0x0f, 0x72, 0xd2, 0x5f, 0xfa, + 0x8a, 0xf0, 0x01, 0x28, 0x98, 0xbf, 0x00, 0x2c, 0x6c, 0xd1, 0x9d, 0xf8, + 0x01, 0x00, 0x00, 0x28, 0x14, 0xbf, 0xb1, 0xee, 0x6a, 0x0a, 0xb0, 0xee, + 0x6a, 0x0a, 0x7a, 0xee, 0x00, 0x8a, 0x00, 0xf0, 0x41, 0xf9, 0x06, 0xd5, + 0x9d, 0xf8, 0x00, 0x00, 0x40, 0x1c, 0xf0, 0xee, 0x40, 0x8a, 0x8d, 0xf8, + 0x00, 0x00, 0x99, 0xed, 0x19, 0x0a, 0x9d, 0xf8, 0x00, 0x00, 0xb4, 0xee, + 0x68, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xbf, 0xf0, 0xee, 0x40, 0x8a, + 0x08, 0xf1, 0x01, 0x08, 0x01, 0x28, 0x84, 0xbf, 0x03, 0x21, 0x31, 0x77, + 0x5f, 0xfa, 0x88, 0xf0, 0x01, 0x28, 0x84, 0xbf, 0x04, 0x20, 0x30, 0x77, + 0x9d, 0xf8, 0x02, 0x20, 0x03, 0x99, 0x01, 0x98, 0xb0, 0xee, 0x68, 0x0a, + 0x00, 0xf0, 0x60, 0xf9, 0x30, 0x78, 0x01, 0x28, 0x02, 0xd0, 0x02, 0x28, + 0x0c, 0xd0, 0x18, 0xe0, 0x03, 0x99, 0x04, 0x9a, 0x01, 0x98, 0x01, 0xf1, + 0x40, 0x03, 0xdb, 0xf8, 0x04, 0x10, 0xff, 0xf7, 0xce, 0xf9, 0x00, 0xf0, + 0x48, 0xf9, 0x0a, 0xe0, 0x03, 0x98, 0x04, 0x9a, 0xdb, 0xf8, 0x08, 0x10, + 0x00, 0xf1, 0x44, 0x03, 0x01, 0x98, 0xff, 0xf7, 0xc2, 0xf9, 0x00, 0xf0, + 0x36, 0xf9, 0x30, 0xee, 0x60, 0x8a, 0x00, 0x2c, 0xa1, 0xd1, 0x00, 0xf0, + 0xf7, 0xf8, 0xa1, 0xbf, 0xd9, 0xed, 0x19, 0x0a, 0xf4, 0xee, 0x68, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0xc6, 0xed, 0x04, 0x8a, 0x00, 0xf0, 0xe1, 0xf8, + 0x7f, 0xf5, 0x6d, 0xaf, 0xd6, 0xed, 0x02, 0x0a, 0xf4, 0xee, 0x48, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x8b, 0xd5, 0x00, 0xf0, 0xcd, 0xf8, 0x88, 0xe7, + 0x04, 0x9d, 0xdd, 0xf8, 0x0c, 0xa0, 0x9d, 0xf8, 0x02, 0x80, 0x01, 0x2f, + 0x72, 0xd1, 0x68, 0x79, 0xd9, 0xed, 0x18, 0x8a, 0x01, 0x28, 0x08, 0xbf, + 0x99, 0xed, 0x19, 0x9a, 0x17, 0xd0, 0xb9, 0xee, 0x04, 0x0a, 0x3a, 0xee, + 0x00, 0x0a, 0xf4, 0xee, 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, + 0xf0, 0xee, 0x40, 0x8a, 0xb1, 0xee, 0x04, 0x0a, 0x99, 0xed, 0x19, 0x9a, + 0x3a, 0xee, 0x00, 0x0a, 0xb4, 0xee, 0x49, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x48, 0xbf, 0xb0, 0xee, 0x40, 0x9a, 0x01, 0x9f, 0x25, 0xe0, 0xdb, 0xf8, + 0x08, 0x10, 0x0a, 0xf1, 0x44, 0x03, 0x00, 0xf0, 0xe6, 0xf8, 0x00, 0xf0, + 0xe8, 0xf8, 0x30, 0xee, 0x60, 0x8a, 0xd4, 0xb9, 0x00, 0xf0, 0xaa, 0xf8, + 0xa1, 0xbf, 0xd9, 0xed, 0x19, 0x0a, 0xf4, 0xee, 0x68, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0xc6, 0xed, 0x04, 0x8a, 0x00, 0xf0, 0x94, 0xf8, 0x42, 0xbf, + 0xd6, 0xed, 0x02, 0x0a, 0xf4, 0xee, 0x48, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x01, 0xd5, 0x00, 0xf0, 0x81, 0xf8, 0xb7, 0xee, 0x00, 0x0a, 0x78, 0xee, + 0x80, 0x8a, 0xb4, 0xee, 0x68, 0x9a, 0xf1, 0xee, 0x10, 0xfa, 0x24, 0xdb, + 0x1c, 0xbb, 0x00, 0xf0, 0x89, 0xf8, 0x48, 0xbf, 0xf0, 0xee, 0x40, 0x8a, + 0x99, 0xed, 0x19, 0x0a, 0xb4, 0xee, 0x68, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x48, 0xbf, 0xf0, 0xee, 0x40, 0x8a, 0xb0, 0xee, 0x68, 0x0a, 0x42, 0x46, + 0x51, 0x46, 0x38, 0x46, 0x00, 0xf0, 0xbc, 0xf8, 0x30, 0x78, 0x01, 0x28, + 0x02, 0xd0, 0x02, 0x28, 0xb9, 0xd0, 0xc2, 0xe7, 0xdb, 0xf8, 0x04, 0x10, + 0x0a, 0xf1, 0x40, 0x03, 0x00, 0xf0, 0x9f, 0xf8, 0x00, 0xf0, 0xa7, 0xf8, + 0xb7, 0xe7, 0x01, 0x97, 0x34, 0xb9, 0x01, 0x98, 0xb0, 0xee, 0x4a, 0x0a, + 0x42, 0x46, 0x51, 0x46, 0x00, 0xf0, 0xa4, 0xf8, 0x30, 0x78, 0x01, 0x28, + 0x02, 0xd0, 0x02, 0x28, 0x0b, 0xd0, 0x16, 0xe0, 0xdb, 0xf8, 0x04, 0x10, + 0x01, 0x98, 0x0a, 0xf1, 0x40, 0x03, 0x2a, 0x46, 0xff, 0xf7, 0x13, 0xf9, + 0x00, 0xf0, 0x8d, 0xf8, 0x09, 0xe0, 0xdb, 0xf8, 0x08, 0x10, 0x01, 0x98, + 0x0a, 0xf1, 0x44, 0x03, 0x2a, 0x46, 0xff, 0xf7, 0x08, 0xf9, 0x00, 0xf0, + 0x7c, 0xf8, 0x30, 0xee, 0x60, 0x8a, 0x54, 0xb9, 0x86, 0xed, 0x03, 0x8a, + 0x86, 0xed, 0x05, 0xaa, 0xf0, 0xee, 0x48, 0x0a, 0xb0, 0xee, 0x4a, 0x0a, + 0x40, 0x46, 0x00, 0xf0, 0x7a, 0xf8, 0xd6, 0xed, 0x02, 0x0a, 0x96, 0xed, + 0x03, 0x0a, 0xb9, 0xee, 0x08, 0x1a, 0x30, 0xee, 0x81, 0x1a, 0xb4, 0xee, + 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x09, 0xd5, 0xd5, 0xed, 0x07, 0x0a, + 0x00, 0xf0, 0x44, 0xfb, 0x06, 0xd5, 0x05, 0x20, 0x30, 0x77, 0x40, 0xf6, + 0x07, 0x14, 0x01, 0xe0, 0x00, 0x20, 0x30, 0x77, 0x06, 0xb0, 0x20, 0x46, + 0xbd, 0xec, 0x06, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, 0x10, 0x84, 0x04, 0x01, + 0x96, 0xed, 0x01, 0x0a, 0x96, 0xed, 0x04, 0xaa, 0x30, 0xee, 0x48, 0x0a, + 0xf0, 0xee, 0xc0, 0x9a, 0x70, 0x47, 0x96, 0xed, 0x01, 0x0a, 0x30, 0xee, + 0x48, 0x0a, 0xb0, 0xee, 0xc0, 0x0a, 0xb4, 0xee, 0x69, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x70, 0x47, 0x99, 0xed, 0x18, 0x0a, 0xf4, 0xee, 0x40, 0x8a, + 0xf1, 0xee, 0x10, 0xfa, 0x70, 0x47, 0x0a, 0x75, 0x81, 0xed, 0x06, 0x3a, + 0x70, 0x47, 0x0a, 0x70, 0xc1, 0xed, 0x01, 0x2a, 0x01, 0x22, 0x81, 0xed, + 0x02, 0x2a, 0x70, 0x47, 0x0a, 0x70, 0xc1, 0xed, 0x01, 0x2a, 0x02, 0x22, + 0x0a, 0x75, 0x81, 0xed, 0x02, 0x2a, 0xc1, 0xed, 0x03, 0x1a, 0x70, 0x47, + 0x0a, 0x70, 0xc1, 0xed, 0x01, 0x2a, 0x01, 0x22, 0x81, 0xed, 0x02, 0x2a, + 0xc1, 0xed, 0x03, 0x1a, 0x81, 0xed, 0x04, 0x9a, 0x70, 0x47, 0x0a, 0x70, + 0xc1, 0xed, 0x01, 0x2a, 0x01, 0x22, 0x0a, 0x75, 0x81, 0xed, 0x02, 0x2a, + 0x81, 0xed, 0x03, 0x1a, 0x81, 0xed, 0x04, 0x1a, 0x81, 0xed, 0x06, 0x3a, + 0x70, 0x47, 0x2a, 0x46, 0x38, 0x46, 0xff, 0xf7, 0x8a, 0xb8, 0x04, 0x46, + 0x9b, 0xed, 0x03, 0x0a, 0xdb, 0xed, 0x05, 0x0a, 0x70, 0x47, 0x04, 0x46, + 0x9b, 0xed, 0x03, 0x0a, 0xdb, 0xed, 0x04, 0x0a, 0x70, 0x47, 0x70, 0x47, + 0x2d, 0xe9, 0xf0, 0x47, 0x2d, 0xed, 0x02, 0x8b, 0xb0, 0xee, 0x40, 0x8a, + 0x0f, 0x46, 0xbd, 0xee, 0xc8, 0x0a, 0x10, 0x2a, 0x80, 0x46, 0x07, 0xf2, + 0xe2, 0x36, 0x07, 0xf1, 0x21, 0x05, 0x10, 0xee, 0x10, 0x4a, 0x00, 0xf2, + 0xb6, 0x81, 0xdf, 0xe8, 0x12, 0xf0, 0x11, 0x00, 0x2b, 0x00, 0x39, 0x00, + 0x44, 0x00, 0x3a, 0x01, 0x06, 0x01, 0x73, 0x01, 0x44, 0x00, 0x5d, 0x00, + 0x8b, 0x00, 0xdd, 0x00, 0xed, 0x00, 0xfd, 0x00, 0x50, 0x01, 0x5d, 0x01, + 0x6a, 0x01, 0xa6, 0x01, 0x34, 0x70, 0x38, 0x46, 0xff, 0xf7, 0xe1, 0xfb, + 0xba, 0x7e, 0x06, 0x21, 0x00, 0xf0, 0xee, 0xf9, 0x00, 0xf0, 0xea, 0xf9, + 0xba, 0x78, 0x00, 0x21, 0x00, 0xf0, 0xe8, 0xf9, 0x68, 0x7b, 0x69, 0x7a, + 0xbd, 0xec, 0x02, 0x8b, 0x41, 0xea, 0x80, 0x01, 0x40, 0x46, 0xbd, 0xe8, + 0xf0, 0x47, 0xc9, 0xb2, 0xfe, 0xf7, 0x37, 0xbc, 0xbd, 0xee, 0xc8, 0x0a, + 0x74, 0x70, 0x10, 0xee, 0x10, 0x2a, 0x3a, 0x76, 0x3a, 0x77, 0x06, 0x21, + 0xd2, 0xb2, 0xfe, 0xf7, 0xa3, 0xfb, 0x3a, 0x7f, 0x07, 0x21, 0xf9, 0xe0, + 0x00, 0xf0, 0x8a, 0xf9, 0x7a, 0x76, 0x7a, 0x77, 0x06, 0x21, 0xd2, 0xb2, + 0xfe, 0xf7, 0xd0, 0xfb, 0x7a, 0x7f, 0x07, 0x21, 0x5a, 0xe1, 0x00, 0xf0, + 0x84, 0xf9, 0xb4, 0x70, 0x07, 0xdb, 0x00, 0xf0, 0x7b, 0xf9, 0x87, 0xf8, + 0x20, 0x20, 0x00, 0x20, 0xe8, 0x70, 0xd2, 0xb2, 0x06, 0xe0, 0x00, 0x20, + 0x87, 0xf8, 0x20, 0x00, 0x00, 0xf0, 0x69, 0xf9, 0xe8, 0x70, 0x00, 0x22, + 0x08, 0x21, 0x00, 0xf0, 0x99, 0xf9, 0xea, 0x78, 0x09, 0x21, 0xd5, 0xe0, + 0x00, 0xf0, 0x6b, 0xf9, 0x06, 0xdd, 0x20, 0x46, 0xa1, 0x46, 0xa2, 0x46, + 0x00, 0x21, 0x00, 0x24, 0x00, 0x25, 0x04, 0xe0, 0x00, 0x20, 0x21, 0x46, + 0x25, 0x46, 0x81, 0x46, 0x82, 0x46, 0x40, 0x1a, 0xf0, 0x73, 0x00, 0x23, + 0x40, 0xb2, 0x00, 0xee, 0x10, 0x0a, 0x00, 0x22, 0x00, 0xf0, 0x8b, 0xf9, + 0xa9, 0xeb, 0x04, 0x00, 0x30, 0x74, 0x4f, 0xfa, 0x80, 0xf9, 0x00, 0xee, + 0x10, 0x9a, 0x00, 0x23, 0x01, 0x22, 0x00, 0xf0, 0x80, 0xf9, 0xa5, 0xeb, + 0x0a, 0x00, 0x70, 0x74, 0x4f, 0xfa, 0x80, 0xfa, 0x00, 0xee, 0x10, 0xaa, + 0x00, 0x23, 0x02, 0x22, 0x08, 0x21, 0x91, 0xe0, 0x00, 0xf0, 0x3d, 0xf9, + 0x06, 0xdd, 0xa4, 0x46, 0xa1, 0x46, 0x20, 0x46, 0xa2, 0x46, 0x00, 0x24, + 0x00, 0x25, 0x04, 0xe0, 0x00, 0x20, 0x81, 0x46, 0x84, 0x46, 0x25, 0x46, + 0x82, 0x46, 0x96, 0xf9, 0x03, 0xe0, 0x4f, 0xfa, 0x8c, 0xfc, 0x00, 0xee, + 0x10, 0xea, 0x00, 0xee, 0x90, 0xca, 0x00, 0xf0, 0x2b, 0xf9, 0x40, 0xb2, + 0x6d, 0xb2, 0x00, 0xee, 0x90, 0x0a, 0xf8, 0xee, 0xe0, 0x0a, 0x00, 0x23, + 0x00, 0x22, 0x09, 0x21, 0x30, 0xee, 0x60, 0x0a, 0x38, 0x46, 0x64, 0xb2, + 0x4f, 0xfa, 0x89, 0xf9, 0x00, 0xf0, 0x9a, 0xf9, 0x96, 0xf9, 0x04, 0x00, + 0x00, 0xee, 0x10, 0x0a, 0x00, 0xee, 0x90, 0x5a, 0x00, 0xf0, 0x12, 0xf9, + 0x00, 0xee, 0x90, 0x4a, 0xf8, 0xee, 0xe0, 0x0a, 0x00, 0x23, 0x01, 0x22, + 0x09, 0x21, 0x30, 0xee, 0x60, 0x0a, 0x38, 0x46, 0x4f, 0xfa, 0x8a, 0xfa, + 0x00, 0xf0, 0x84, 0xf9, 0x96, 0xf9, 0x05, 0x00, 0x00, 0xee, 0x10, 0x0a, + 0x00, 0xee, 0x90, 0x9a, 0x00, 0xf0, 0xfc, 0xf8, 0x00, 0xee, 0x90, 0xaa, + 0xf8, 0xee, 0xe0, 0x0a, 0x00, 0x23, 0x02, 0x22, 0x09, 0x21, 0x30, 0xee, + 0x60, 0x0a, 0x41, 0xe0, 0xf0, 0x7b, 0x24, 0x18, 0xf4, 0x70, 0x00, 0x23, + 0x64, 0xb2, 0x00, 0xee, 0x10, 0x4a, 0x00, 0x22, 0x0a, 0x21, 0x00, 0xf0, + 0xee, 0xf8, 0x00, 0xf0, 0x11, 0xf9, 0x3a, 0x7b, 0x03, 0x21, 0x45, 0xe0, + 0x30, 0x7c, 0x24, 0x18, 0x34, 0x71, 0x00, 0x23, 0x64, 0xb2, 0x00, 0xee, + 0x10, 0x4a, 0x01, 0x22, 0x0b, 0x21, 0x00, 0xf0, 0xde, 0xf8, 0x00, 0xf0, + 0xf7, 0xf8, 0x3a, 0x7c, 0x04, 0x21, 0x35, 0xe0, 0x70, 0x7c, 0x24, 0x18, + 0x74, 0x71, 0x00, 0xf0, 0xd8, 0xf8, 0x0c, 0x21, 0x00, 0xf0, 0xd1, 0xf8, + 0x26, 0xe0, 0xb0, 0x7c, 0x01, 0x28, 0x07, 0xd1, 0xf0, 0x78, 0x00, 0xf0, + 0x03, 0xf9, 0x30, 0x79, 0x00, 0xf0, 0xd1, 0xf8, 0x70, 0x79, 0x06, 0xe0, + 0xf0, 0x7b, 0x00, 0xf0, 0xfb, 0xf8, 0x30, 0x7c, 0x00, 0xf0, 0xc9, 0xf8, + 0x70, 0x7c, 0x24, 0x18, 0xf4, 0x72, 0x00, 0xf0, 0xbe, 0xf8, 0x05, 0x21, + 0xb8, 0xee, 0xc0, 0x0a, 0x00, 0xf0, 0xb7, 0xf8, 0x00, 0xf0, 0xd8, 0xf8, + 0x3a, 0x7b, 0x03, 0x21, 0x00, 0xf0, 0xcc, 0xf8, 0x00, 0xf0, 0xc8, 0xf8, + 0x3a, 0x7c, 0x04, 0x21, 0x00, 0xf0, 0xc6, 0xf8, 0x3a, 0x7a, 0x02, 0x21, + 0x00, 0xf0, 0xc2, 0xf8, 0x3a, 0x7d, 0x05, 0x21, 0xbd, 0xec, 0x02, 0x8b, + 0x40, 0x46, 0xbd, 0xe8, 0xf0, 0x47, 0xfe, 0xf7, 0x9f, 0xba, 0x00, 0xf0, + 0x8e, 0xf8, 0x06, 0xdb, 0x00, 0xf0, 0x86, 0xf8, 0x00, 0x20, 0x2a, 0x70, + 0x28, 0x71, 0xd2, 0xb2, 0x05, 0xe0, 0x00, 0x20, 0x28, 0x70, 0x00, 0xf0, + 0x76, 0xf8, 0x28, 0x71, 0x00, 0x22, 0x08, 0x21, 0x00, 0xf0, 0xa1, 0xf8, + 0x2a, 0x79, 0x09, 0x21, 0x4e, 0xe0, 0xb4, 0x71, 0x01, 0x23, 0x00, 0x22, + 0x0d, 0x21, 0xb0, 0xee, 0x48, 0x0a, 0x00, 0xf0, 0x80, 0xf8, 0x00, 0xf0, + 0x9c, 0xf8, 0x7a, 0x7b, 0x03, 0x21, 0x41, 0xe0, 0x34, 0x71, 0x01, 0x23, + 0x01, 0x22, 0x0e, 0x21, 0xb0, 0xee, 0x48, 0x0a, 0x00, 0xf0, 0x73, 0xf8, + 0x00, 0xf0, 0x85, 0xf8, 0x7a, 0x7c, 0x04, 0x21, 0x34, 0xe0, 0x74, 0x71, + 0x01, 0x23, 0x02, 0x22, 0x0f, 0x21, 0xb0, 0xee, 0x48, 0x0a, 0x00, 0xf0, + 0x66, 0xf8, 0x25, 0xe0, 0x06, 0x21, 0x01, 0x23, 0x70, 0x56, 0x00, 0xee, + 0x10, 0x0a, 0xb8, 0xee, 0xc0, 0x0a, 0x00, 0x22, 0x30, 0xee, 0x08, 0x0a, + 0x00, 0xf0, 0x59, 0xf8, 0x96, 0xf9, 0x07, 0x00, 0x00, 0xf0, 0x35, 0xf8, + 0x01, 0x22, 0x00, 0xf0, 0x84, 0xf8, 0x96, 0xf9, 0x08, 0x00, 0x00, 0xf0, + 0x2e, 0xf8, 0x02, 0x22, 0x00, 0xf0, 0x7d, 0xf8, 0x00, 0xf0, 0x67, 0xf8, + 0x7a, 0x7b, 0x03, 0x21, 0x00, 0xf0, 0x5b, 0xf8, 0x00, 0xf0, 0x57, 0xf8, + 0x7a, 0x7c, 0x04, 0x21, 0x00, 0xf0, 0x55, 0xf8, 0x7a, 0x7a, 0x02, 0x21, + 0x00, 0xf0, 0x51, 0xf8, 0x7a, 0x7d, 0x05, 0x21, 0xbd, 0xec, 0x02, 0x8b, + 0x40, 0x46, 0xbd, 0xe8, 0xf0, 0x47, 0xfe, 0xf7, 0x6b, 0xba, 0x07, 0xf2, + 0xfc, 0x30, 0xb7, 0xee, 0x00, 0x0a, 0x38, 0xee, 0x00, 0x0a, 0x80, 0xed, + 0x00, 0x8a, 0x40, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf0, 0x47, + 0x84, 0xe0, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf0, 0x87, 0x00, 0xee, + 0x10, 0x0a, 0xb8, 0xee, 0xc0, 0x0a, 0x01, 0x23, 0x70, 0x47, 0xb0, 0xee, + 0xc8, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x70, 0x47, + 0xbd, 0xee, 0xc8, 0x0a, 0x10, 0xee, 0x10, 0x2a, 0x70, 0x47, 0xb5, 0xee, + 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x70, 0x47, 0xb8, 0xee, 0xc0, 0x0a, + 0xf8, 0xee, 0xe0, 0x0a, 0x30, 0xee, 0x20, 0x0a, 0x70, 0x47, 0xb8, 0xee, + 0xc0, 0x0a, 0x38, 0x46, 0x74, 0xe0, 0x00, 0x23, 0x64, 0xb2, 0x00, 0xee, + 0x10, 0x4a, 0x02, 0x22, 0x70, 0x47, 0x20, 0x18, 0xb0, 0x72, 0x00, 0x23, + 0x40, 0xb2, 0x00, 0xee, 0x10, 0x0a, 0x01, 0x22, 0x05, 0x21, 0xb8, 0xee, + 0xc0, 0x0a, 0x38, 0x46, 0x62, 0xe0, 0x7a, 0x79, 0x01, 0x21, 0x40, 0x46, + 0xfe, 0xf7, 0x20, 0xba, 0x3a, 0x79, 0x01, 0x21, 0x40, 0x46, 0xfe, 0xf7, + 0xe3, 0xb9, 0x7a, 0x78, 0x00, 0x21, 0x40, 0x46, 0xfe, 0xf7, 0x16, 0xba, + 0x3a, 0x78, 0x00, 0x21, 0x40, 0x46, 0xfe, 0xf7, 0xd9, 0xb9, 0x08, 0x21, + 0xb8, 0xee, 0xc0, 0x0a, 0x38, 0x46, 0x49, 0xe0, 0x6a, 0x78, 0x08, 0x21, + 0x40, 0x46, 0xfe, 0xf7, 0x3e, 0xba, 0x06, 0x21, 0x30, 0xee, 0x08, 0x0a, + 0x38, 0x46, 0x3f, 0xe0, 0x20, 0x18, 0x70, 0x72, 0x00, 0x23, 0x40, 0xb2, + 0x00, 0xee, 0x10, 0x0a, 0x00, 0x22, 0x05, 0x21, 0xb8, 0xee, 0xc0, 0x0a, + 0x38, 0x46, 0x33, 0xe0, 0x10, 0xb5, 0x22, 0x31, 0x92, 0x1c, 0x04, 0x2a, + 0x10, 0xd8, 0xdf, 0xe8, 0x02, 0xf0, 0x03, 0x05, 0x07, 0x0a, 0x0d, 0x00, + 0x07, 0x22, 0x02, 0xe0, 0x05, 0x23, 0x03, 0xe0, 0x00, 0x22, 0x0a, 0x70, + 0x04, 0xe0, 0x01, 0x23, 0x0b, 0x70, 0x01, 0xe0, 0x03, 0x24, 0x0c, 0x70, + 0x0a, 0x78, 0x0a, 0x71, 0x08, 0x21, 0xbd, 0xe8, 0x10, 0x40, 0xfe, 0xf7, + 0x10, 0xba, 0x00, 0x00, 0x10, 0xb5, 0xdf, 0xed, 0x49, 0x0a, 0x04, 0x46, + 0x20, 0xee, 0x20, 0x0a, 0xc8, 0xf7, 0xd6, 0xfe, 0x20, 0x46, 0xbd, 0xe8, + 0x10, 0x40, 0xbd, 0xee, 0xc0, 0x1a, 0x00, 0x23, 0x11, 0xee, 0x10, 0x2a, + 0x00, 0x21, 0xe3, 0xf7, 0xe3, 0xbd, 0x00, 0x00, 0x98, 0x92, 0x98, 0x00, + 0xb5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x00, 0xeb, 0x82, 0x00, + 0x13, 0xdb, 0xdf, 0xed, 0x3c, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0xa8, 0xbf, 0x9f, 0xed, 0x39, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, + 0x10, 0xee, 0x10, 0x1a, 0x13, 0xb9, 0x01, 0x70, 0x00, 0x21, 0x14, 0xe0, + 0x41, 0x70, 0x00, 0x21, 0x1b, 0xe0, 0xdf, 0xed, 0x34, 0x0a, 0xb4, 0xee, + 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, 0xb0, 0xee, 0x60, 0x0a, + 0x4b, 0xb9, 0x00, 0x21, 0x01, 0x70, 0xb0, 0xee, 0xc0, 0x0a, 0xbd, 0xee, + 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x1a, 0x01, 0x73, 0x70, 0x47, 0x00, 0x21, + 0x41, 0x70, 0xb0, 0xee, 0xc0, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, + 0x10, 0x1a, 0x41, 0x73, 0x70, 0x47, 0x00, 0x00, 0x48, 0x8f, 0x04, 0x01, + 0x2d, 0xe9, 0xf0, 0x41, 0x04, 0x46, 0x0d, 0x46, 0x90, 0x46, 0x1f, 0x46, + 0x00, 0x20, 0x00, 0x26, 0x98, 0xed, 0x07, 0x0a, 0x97, 0xed, 0x0f, 0x1a, + 0xff, 0xee, 0x00, 0x0a, 0x60, 0xee, 0x20, 0x0a, 0xb4, 0xee, 0x60, 0x1a, + 0xf1, 0xee, 0x10, 0xfa, 0x1f, 0xd5, 0x0a, 0x20, 0xe1, 0xf7, 0x7a, 0xf8, + 0x01, 0x2c, 0x05, 0xd1, 0x3a, 0x46, 0x41, 0x46, 0x28, 0x46, 0xfe, 0xf7, + 0xab, 0xfd, 0x06, 0xe0, 0x39, 0x6b, 0x07, 0xf1, 0x3c, 0x03, 0x42, 0x46, + 0x28, 0x46, 0xfe, 0xf7, 0xb6, 0xfd, 0x76, 0x1c, 0xf1, 0xb2, 0x04, 0x29, + 0x07, 0xd2, 0x97, 0xed, 0x0f, 0x0a, 0xdf, 0xed, 0x0e, 0x0a, 0x00, 0xf0, + 0x09, 0xf8, 0xd5, 0xdb, 0x01, 0xe0, 0x40, 0xf6, 0x08, 0x10, 0xbd, 0xe8, + 0xf0, 0x81, 0x00, 0x00, 0xdf, 0xed, 0x09, 0x0a, 0xb4, 0xee, 0x60, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x40, + 0x00, 0x00, 0x80, 0x47, 0x01, 0x00, 0x7c, 0x42, 0x00, 0x00, 0x7c, 0x42, + 0x00, 0x00, 0x7c, 0xc2, 0xff, 0xff, 0x81, 0xc2, 0x00, 0x00, 0x60, 0x42, + 0xcd, 0xcc, 0xcc, 0xbd, 0xcd, 0xcc, 0xcc, 0x3d, 0x0a, 0xd7, 0xa3, 0x3a, + 0x0a, 0xd7, 0xa3, 0x3b, 0x70, 0xb5, 0x04, 0x46, 0x00, 0x25, 0x89, 0x4e, + 0x24, 0xfa, 0x05, 0xf0, 0xc0, 0x07, 0x09, 0xd5, 0x28, 0x46, 0xd6, 0xf7, + 0x65, 0xfd, 0xff, 0x28, 0x04, 0xd0, 0x14, 0x21, 0x48, 0x43, 0x30, 0x44, + 0xdb, 0xf7, 0x24, 0xf8, 0x6d, 0x1c, 0x08, 0x2d, 0xee, 0xd3, 0x70, 0xbd, + 0x2d, 0xe9, 0xf1, 0x4f, 0x82, 0xb0, 0x00, 0x20, 0x01, 0x90, 0x02, 0x9c, + 0xdf, 0xf8, 0xf4, 0x81, 0x08, 0xf1, 0x05, 0x00, 0x00, 0x90, 0x4f, 0xf0, + 0x01, 0x0a, 0x00, 0x2c, 0x6d, 0xd0, 0x00, 0x99, 0x09, 0x78, 0x00, 0x20, + 0x04, 0x29, 0x28, 0xbf, 0x04, 0x21, 0x81, 0x46, 0x00, 0x22, 0x0a, 0xfa, + 0x02, 0xf3, 0x1c, 0x42, 0x04, 0xd0, 0x40, 0x1c, 0x88, 0x42, 0x43, 0xea, + 0x09, 0x09, 0x02, 0xd2, 0x52, 0x1c, 0x08, 0x2a, 0xf3, 0xd3, 0x00, 0x26, + 0x00, 0x27, 0x0a, 0xfa, 0x07, 0xf5, 0x19, 0xea, 0x05, 0x0f, 0x21, 0xd0, + 0xf8, 0xb2, 0xd6, 0xf7, 0x2d, 0xfd, 0xff, 0x28, 0x1c, 0xd0, 0x14, 0x22, + 0x67, 0x49, 0x50, 0x43, 0x01, 0xeb, 0x00, 0x0b, 0x58, 0x46, 0xf1, 0xf7, + 0x6a, 0xf8, 0x41, 0x46, 0xf8, 0xb2, 0xf9, 0xf7, 0xf6, 0xfb, 0x31, 0x46, + 0x58, 0x46, 0x00, 0xf0, 0x05, 0xfb, 0xf8, 0xb2, 0x00, 0xf0, 0x3a, 0xfa, + 0x06, 0x46, 0x31, 0x46, 0x58, 0x46, 0x00, 0xf0, 0xfd, 0xfa, 0x1e, 0xb1, + 0xed, 0x43, 0x05, 0xea, 0x09, 0x09, 0x2c, 0x40, 0x7f, 0x1c, 0xf8, 0xb2, + 0x08, 0x28, 0xd4, 0xdb, 0xb9, 0xf1, 0x00, 0x0f, 0xb9, 0xd0, 0x00, 0x25, + 0x14, 0x26, 0x55, 0x4f, 0x0a, 0xfa, 0x05, 0xfb, 0x19, 0xea, 0x0b, 0x0f, + 0x1c, 0xd0, 0xe8, 0xb2, 0xd6, 0xf7, 0xfc, 0xfc, 0xff, 0x28, 0x17, 0xd0, + 0x70, 0x43, 0x39, 0x18, 0x08, 0x68, 0x18, 0xb9, 0x42, 0x46, 0xe8, 0xb2, + 0x00, 0xf0, 0x22, 0xfa, 0x00, 0x28, 0x02, 0xbf, 0x00, 0x98, 0xc1, 0x7f, + 0x01, 0x29, 0x04, 0xd1, 0x08, 0xf1, 0x24, 0x01, 0xe8, 0xb2, 0x00, 0xf0, + 0x49, 0xfa, 0x6f, 0xea, 0x0b, 0x00, 0x00, 0xea, 0x09, 0x09, 0x04, 0x40, + 0x6d, 0x1c, 0xe8, 0xb2, 0x08, 0x28, 0xd9, 0xdb, 0xd2, 0xe7, 0x02, 0x9d, + 0xdd, 0xf8, 0x04, 0x80, 0x3f, 0x4f, 0x14, 0x26, 0x25, 0xfa, 0x04, 0xf0, + 0xc0, 0x07, 0x0d, 0xd5, 0x20, 0x46, 0xd6, 0xf7, 0xd1, 0xfc, 0x70, 0x43, + 0x38, 0x44, 0xd0, 0xf8, 0x00, 0x90, 0x49, 0x46, 0xf1, 0xf7, 0x15, 0xf8, + 0xb8, 0xf1, 0x00, 0x0f, 0x08, 0xbf, 0xc8, 0x46, 0x64, 0x1c, 0x08, 0x2c, + 0xea, 0xd3, 0x40, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, 0x80, 0xb5, 0x00, 0xf0, + 0x09, 0xf8, 0xe0, 0xf7, 0x7e, 0xfc, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, + 0x03, 0xf8, 0xe0, 0xf7, 0x63, 0xfc, 0x02, 0xbd, 0x00, 0x92, 0x0b, 0x46, + 0x02, 0x46, 0x40, 0x21, 0x2b, 0x48, 0x70, 0x47, 0xf8, 0xb5, 0x0c, 0x46, + 0x16, 0x46, 0x1f, 0x46, 0xf1, 0xf7, 0x06, 0xf8, 0xd6, 0xf7, 0xa6, 0xfc, + 0x00, 0x25, 0xff, 0x28, 0x13, 0xd0, 0x67, 0xb9, 0x31, 0x68, 0x14, 0x29, + 0x0c, 0xd3, 0x14, 0x22, 0x21, 0x4b, 0x50, 0x43, 0x19, 0x18, 0x20, 0x46, + 0xc8, 0xf7, 0xf2, 0xfb, 0x14, 0x20, 0x30, 0x60, 0x07, 0xe0, 0x4f, 0xf6, + 0x2a, 0x75, 0x04, 0xe0, 0x4f, 0xf6, 0x26, 0x75, 0x01, 0xe0, 0x4f, 0xf6, + 0x52, 0x75, 0x28, 0x46, 0xf2, 0xbd, 0x70, 0xb5, 0x0c, 0x46, 0x15, 0x46, + 0xf0, 0xf7, 0xe4, 0xff, 0x06, 0x46, 0xd6, 0xf7, 0x83, 0xfc, 0xff, 0x28, + 0x02, 0xd1, 0x4f, 0xf6, 0x2b, 0x70, 0x70, 0xbd, 0x2b, 0x46, 0x22, 0x46, + 0x31, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x10, 0x48, 0x00, 0xf0, 0x39, 0xba, + 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0xd6, 0xf7, 0x70, 0xfc, + 0xff, 0x28, 0x12, 0xd0, 0x14, 0x21, 0x09, 0x4a, 0x48, 0x43, 0x11, 0x18, + 0x08, 0x69, 0x60, 0xb1, 0x2d, 0xb1, 0x31, 0x46, 0xe0, 0xb2, 0xbd, 0xe8, + 0x70, 0x40, 0x00, 0xf0, 0xb5, 0xb9, 0xe0, 0xb2, 0xbd, 0xe8, 0x70, 0x40, + 0x03, 0x49, 0x00, 0xf0, 0xbd, 0xb9, 0x70, 0xbd, 0x1c, 0x67, 0x03, 0x20, + 0xb4, 0x55, 0x00, 0x20, 0xd8, 0x55, 0x00, 0x20, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, 0x0d, 0xf8, 0x01, 0x70, + 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, + 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x70, 0x47, + 0xf8, 0xb5, 0x04, 0x46, 0x5e, 0x48, 0x50, 0xf8, 0x24, 0x70, 0x0d, 0x46, + 0x85, 0xf0, 0x01, 0x06, 0x33, 0x46, 0x02, 0x22, 0x01, 0x21, 0x07, 0xf1, + 0x0f, 0x00, 0xff, 0xf7, 0xd7, 0xff, 0x28, 0x00, 0x11, 0xd0, 0x33, 0x46, + 0x40, 0x22, 0x06, 0x21, 0x07, 0xf1, 0x33, 0x00, 0xff, 0xf7, 0xce, 0xff, + 0x2b, 0x46, 0x54, 0x48, 0x50, 0xf8, 0x24, 0x00, 0x01, 0xb0, 0xbd, 0xe8, + 0xf0, 0x40, 0x01, 0x22, 0x00, 0x21, 0x18, 0x30, 0xcb, 0xe7, 0xf1, 0xbd, + 0x50, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x74, 0x30, 0x00, 0x68, 0x00, 0x0e, + 0x00, 0xf0, 0x0f, 0x00, 0x70, 0x47, 0x38, 0xb5, 0x0c, 0x00, 0x14, 0xbf, + 0x35, 0x21, 0x36, 0x21, 0x01, 0x22, 0xe2, 0xf7, 0x9a, 0xf8, 0x05, 0x46, + 0x14, 0xb1, 0x01, 0x20, 0xe0, 0xf7, 0xcc, 0xfe, 0x28, 0x46, 0x32, 0xbd, + 0x38, 0xb5, 0x45, 0x4d, 0x04, 0x46, 0x55, 0xf8, 0x24, 0x00, 0x00, 0xf0, + 0x11, 0xf8, 0x43, 0x48, 0x50, 0xf8, 0x24, 0x00, 0x00, 0xf0, 0x0c, 0xf8, + 0x3d, 0x48, 0x50, 0xf8, 0x24, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, + 0x5a, 0x23, 0xff, 0x22, 0x00, 0x21, 0x00, 0xf2, 0xff, 0x30, 0x91, 0xe7, + 0x5a, 0x23, 0xff, 0x22, 0x00, 0x21, 0x00, 0xf2, 0xff, 0x30, 0x8b, 0xe7, + 0x2d, 0xe9, 0xff, 0x41, 0x04, 0x46, 0x35, 0x48, 0x0f, 0xf2, 0xe4, 0x08, + 0x00, 0xf0, 0x38, 0xf8, 0x02, 0xae, 0x08, 0x78, 0x8d, 0xf8, 0x08, 0x00, + 0x00, 0x25, 0x31, 0x48, 0x00, 0xf0, 0x30, 0xf8, 0x00, 0x27, 0x08, 0x78, + 0x70, 0x70, 0x2b, 0x48, 0x00, 0xf0, 0x2a, 0xf8, 0x08, 0x78, 0xb0, 0x70, + 0xf0, 0x5d, 0x5a, 0x28, 0x0b, 0xd0, 0x5a, 0x22, 0x01, 0x92, 0x00, 0x90, + 0x23, 0x46, 0x42, 0x46, 0x04, 0x21, 0x01, 0x20, 0xd6, 0xf7, 0xbb, 0xfc, + 0xd6, 0xf7, 0xa2, 0xfc, 0x6d, 0x1c, 0x7f, 0x1c, 0x03, 0x2f, 0xed, 0xd3, + 0x20, 0x48, 0x50, 0xf8, 0x24, 0x10, 0x08, 0x68, 0x21, 0x49, 0x88, 0x42, + 0x0a, 0xd0, 0x01, 0x91, 0x00, 0x90, 0x23, 0x46, 0x29, 0xa2, 0x04, 0x21, + 0x01, 0x20, 0xd6, 0xf7, 0xa6, 0xfc, 0xd6, 0xf7, 0x8d, 0xfc, 0x6d, 0x1c, + 0xe8, 0xb2, 0x04, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, 0x50, 0xf8, 0x24, 0x10, + 0x01, 0xf2, 0xff, 0x31, 0x70, 0x47, 0x70, 0xb5, 0x16, 0x4a, 0x52, 0xf8, + 0x20, 0x50, 0x0c, 0x46, 0x28, 0x46, 0xe2, 0xf7, 0x36, 0xf8, 0x06, 0x46, + 0x21, 0x46, 0x28, 0x46, 0xe2, 0xf7, 0x43, 0xf8, 0x30, 0x46, 0x70, 0xbd, + 0x10, 0xb5, 0x10, 0x4c, 0x54, 0xf8, 0x20, 0x00, 0xbd, 0xe8, 0x10, 0x40, + 0x00, 0x23, 0x4f, 0xf0, 0xff, 0x32, 0x00, 0x21, 0x24, 0x30, 0x34, 0xe7, + 0x0a, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x24, 0x30, 0x00, 0x68, 0x70, 0x47, + 0x88, 0x97, 0x04, 0x01, 0x28, 0x97, 0x04, 0x01, 0x48, 0x94, 0x04, 0x01, + 0x68, 0x98, 0x04, 0x01, 0x68, 0x97, 0x04, 0x01, 0x28, 0x94, 0x04, 0x01, + 0xfe, 0xca, 0xad, 0xab, 0x08, 0x98, 0x04, 0x01, 0x28, 0x98, 0x04, 0x01, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x2c, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, + 0x20, 0x76, 0x65, 0x72, 0x20, 0x64, 0x38, 0x3a, 0x20, 0x25, 0x58, 0x20, + 0x21, 0x3d, 0x20, 0x25, 0x58, 0x0a, 0x00, 0x00, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x2c, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x72, + 0x20, 0x64, 0x33, 0x32, 0x3a, 0x20, 0x25, 0x58, 0x20, 0x21, 0x3d, 0x20, + 0x25, 0x58, 0x0a, 0x00, 0xf8, 0xb5, 0x0d, 0x46, 0x26, 0xa6, 0x06, 0xeb, + 0xc5, 0x01, 0x04, 0x46, 0x4f, 0x68, 0x38, 0x46, 0xe0, 0xf7, 0x8a, 0xfc, + 0x01, 0x21, 0x01, 0xfa, 0x04, 0xf4, 0x44, 0xea, 0x00, 0x01, 0x38, 0x46, + 0xe0, 0xf7, 0x57, 0xfc, 0x38, 0x46, 0xe0, 0xf7, 0xc3, 0xfb, 0x56, 0xf8, + 0x35, 0x10, 0x38, 0x46, 0xe0, 0xf7, 0x29, 0xfc, 0x38, 0x46, 0xbd, 0xe8, + 0xf2, 0x40, 0xe0, 0xf7, 0x0a, 0xbc, 0x00, 0x00, 0x00, 0x20, 0x05, 0xe0, + 0x01, 0x20, 0x03, 0xe0, 0x02, 0x20, 0x01, 0xe0, 0x03, 0x20, 0x00, 0xbf, + 0x70, 0xb5, 0x04, 0x46, 0x12, 0xa1, 0x01, 0xeb, 0xc4, 0x03, 0x00, 0x26, + 0x58, 0x68, 0xe0, 0xf7, 0xb2, 0xfb, 0x05, 0x46, 0x25, 0xfa, 0x06, 0xf0, + 0xc0, 0x07, 0x03, 0xd5, 0x21, 0x46, 0x30, 0x46, 0xfa, 0xf7, 0x9f, 0xfd, + 0x76, 0x1c, 0x08, 0x2e, 0xf4, 0xd3, 0x70, 0xbd, 0x70, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x00, 0x26, 0x25, 0xfa, 0x06, 0xf0, 0xc0, 0x07, 0x03, 0xd5, + 0xf1, 0xb2, 0x20, 0x46, 0xfa, 0xf7, 0xb5, 0xfd, 0x76, 0x1c, 0xf0, 0xb2, + 0x04, 0x28, 0xf3, 0xd3, 0x70, 0xbd, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x80, 0xb5, 0xaf, 0xf3, 0x00, 0x80, 0x02, 0x4a, + 0x11, 0x00, 0x18, 0x20, 0xab, 0xbe, 0xfb, 0xe7, 0x26, 0x00, 0x02, 0x00, + 0x38, 0xb5, 0x05, 0x46, 0x00, 0x23, 0x00, 0x22, 0x01, 0x21, 0xe2, 0xf7, + 0xe7, 0xfe, 0x04, 0x00, 0x04, 0xbf, 0x28, 0x46, 0xf9, 0xf7, 0x49, 0xfa, + 0x20, 0x46, 0x32, 0xbd, 0xf8, 0xb5, 0x0e, 0x46, 0x05, 0x46, 0x17, 0x46, + 0x4f, 0xf4, 0x7a, 0x71, 0x00, 0xf0, 0x4f, 0xf8, 0x00, 0xf0, 0x16, 0xf8, + 0x00, 0x2c, 0x04, 0xbf, 0x97, 0xf8, 0x3c, 0x00, 0x01, 0x28, 0x05, 0xd1, + 0x39, 0x46, 0x28, 0x46, 0x00, 0xf0, 0xac, 0xf8, 0x00, 0xf0, 0x0a, 0xf8, + 0x00, 0x23, 0x00, 0x22, 0x01, 0x21, 0x28, 0x46, 0xe2, 0xf7, 0xcd, 0xfe, + 0x04, 0xb9, 0x04, 0x46, 0x20, 0x46, 0xf2, 0xbd, 0x04, 0x46, 0x21, 0x46, + 0x30, 0x46, 0x95, 0xe0, 0x38, 0xb5, 0x01, 0x25, 0x85, 0x40, 0x01, 0xfa, + 0x00, 0xf4, 0xe9, 0xb2, 0xe0, 0xb2, 0x00, 0xf0, 0x3e, 0xf8, 0xe9, 0xb2, + 0xe0, 0xb2, 0xbd, 0xe8, 0x34, 0x40, 0x49, 0xe0, 0xf8, 0xb5, 0x04, 0x46, + 0x01, 0x26, 0x0d, 0x46, 0xa6, 0x40, 0x00, 0x27, 0xf0, 0xb2, 0xf8, 0x40, + 0xc0, 0x07, 0x08, 0xd5, 0x29, 0x46, 0xf8, 0xb2, 0xf9, 0xf7, 0x56, 0xfa, + 0x05, 0xf1, 0x10, 0x01, 0xf8, 0xb2, 0xf9, 0xf7, 0x92, 0xfa, 0x7f, 0x1c, + 0xf8, 0xb2, 0x08, 0x28, 0xee, 0xdb, 0x2a, 0x78, 0xa2, 0x40, 0xf1, 0xb2, + 0xd0, 0xb2, 0x00, 0xf0, 0x1c, 0xf8, 0x28, 0x7c, 0x00, 0xfa, 0x04, 0xf4, + 0xf1, 0xb2, 0xe0, 0xb2, 0xbd, 0xe8, 0xf4, 0x40, 0x24, 0xe0, 0xf8, 0xb5, + 0x04, 0x46, 0x0d, 0x46, 0xe0, 0xf7, 0xc8, 0xf9, 0x00, 0x26, 0x07, 0x46, + 0x20, 0x46, 0xf9, 0xf7, 0xfa, 0xf9, 0x30, 0xb9, 0x38, 0x46, 0xe0, 0xf7, + 0xf3, 0xf9, 0xa8, 0x42, 0xf6, 0xd3, 0x4f, 0xf4, 0x81, 0x76, 0x30, 0x46, + 0xf2, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x00, 0x26, 0x25, 0xfa, + 0x06, 0xf0, 0xc2, 0x07, 0x03, 0xd5, 0x00, 0xf0, 0x18, 0xf8, 0xf9, 0xf7, + 0x07, 0xfa, 0x76, 0x1c, 0xf2, 0xb2, 0x08, 0x2a, 0xf3, 0xdb, 0x70, 0xbd, + 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x00, 0x26, 0x25, 0xfa, 0x06, 0xf0, + 0xc2, 0x07, 0x03, 0xd5, 0x00, 0xf0, 0x07, 0xf8, 0xf9, 0xf7, 0x02, 0xfa, + 0x76, 0x1c, 0xf2, 0xb2, 0x08, 0x2a, 0xf3, 0xdb, 0x70, 0xbd, 0x24, 0xfa, + 0x06, 0xf1, 0x01, 0xf0, 0x01, 0x01, 0xf0, 0xb2, 0x70, 0x47, 0x70, 0xb5, + 0x04, 0x46, 0x18, 0x78, 0x0d, 0x46, 0x00, 0x26, 0x12, 0xb1, 0x01, 0x2a, + 0x0d, 0xd0, 0x19, 0xe0, 0x08, 0xb9, 0x00, 0x21, 0x05, 0xe0, 0x04, 0xf1, + 0x24, 0x01, 0xe8, 0xb2, 0xf9, 0xf7, 0xf2, 0xf9, 0x01, 0x21, 0xe8, 0xb2, + 0xf9, 0xf7, 0xd6, 0xf9, 0x0e, 0xe0, 0x08, 0xb9, 0x00, 0x21, 0x05, 0xe0, + 0x04, 0xf1, 0x34, 0x01, 0xe8, 0xb2, 0xf9, 0xf7, 0x26, 0xfa, 0x01, 0x21, + 0xe8, 0xb2, 0xf9, 0xf7, 0xd5, 0xf9, 0x01, 0xe0, 0x4f, 0xf4, 0x82, 0x76, + 0x30, 0x46, 0x70, 0xbd, 0x01, 0x60, 0x41, 0x68, 0x19, 0x31, 0x41, 0x60, + 0x70, 0x47, 0x00, 0x00, 0x30, 0xb5, 0x85, 0xb0, 0x05, 0x46, 0x0c, 0x46, + 0x0c, 0x22, 0x00, 0x21, 0x02, 0xa8, 0xc7, 0xf7, 0x91, 0xfc, 0x00, 0xbf, + 0x21, 0xa0, 0x02, 0x95, 0x69, 0x46, 0x90, 0xec, 0x02, 0x0a, 0x81, 0xec, + 0x02, 0x0a, 0x02, 0x21, 0x4f, 0xf4, 0x80, 0x72, 0x8d, 0xf8, 0x0c, 0x10, + 0xad, 0xf8, 0x0e, 0x20, 0xa0, 0x68, 0x04, 0x90, 0x02, 0xa8, 0x00, 0xf0, + 0x35, 0xf8, 0x04, 0x00, 0x13, 0xd1, 0x4f, 0xf4, 0x7a, 0x71, 0x28, 0x46, + 0x00, 0xf0, 0xaa, 0xf8, 0x18, 0xb1, 0x02, 0x28, 0x09, 0xd0, 0x08, 0xd3, + 0x09, 0xe0, 0x69, 0x46, 0x02, 0xa8, 0x00, 0xf0, 0xa5, 0xf8, 0x20, 0xb1, + 0x40, 0xf2, 0x01, 0x14, 0x01, 0xe0, 0x40, 0xf2, 0x03, 0x14, 0x9d, 0xed, + 0x00, 0x1a, 0x9d, 0xed, 0x00, 0x0a, 0xdd, 0xed, 0x01, 0x0a, 0x21, 0xee, + 0x00, 0x0a, 0x00, 0xee, 0xa0, 0x0a, 0xc8, 0xf7, 0xd1, 0xfb, 0xdf, 0xed, + 0x06, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xa8, 0xbf, + 0x40, 0xf2, 0x05, 0x14, 0x20, 0x46, 0x05, 0xb0, 0x30, 0xbd, 0x00, 0x00, + 0xff, 0xff, 0xa7, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0xb5, 0x04, 0x46, 0xb4, 0xb0, 0x21, 0x79, 0x20, 0x68, 0xf4, 0xf7, + 0x94, 0xf9, 0x00, 0xee, 0x10, 0x0a, 0x0a, 0xa9, 0x0a, 0x20, 0x00, 0x22, + 0x03, 0x23, 0x09, 0x91, 0x08, 0x90, 0x07, 0x92, 0x06, 0x93, 0xb8, 0xee, + 0x40, 0x0a, 0xe0, 0x88, 0xd4, 0xed, 0x02, 0x0a, 0x04, 0x92, 0x01, 0xee, + 0x10, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0xb8, 0xee, 0x41, 0x1a, 0xdf, 0xed, + 0x25, 0x1a, 0x20, 0xee, 0x80, 0x0a, 0x61, 0xee, 0x21, 0x1a, 0xc0, 0xee, + 0x21, 0x1a, 0xfc, 0xee, 0xe1, 0x1a, 0x01, 0x23, 0xcd, 0xed, 0x05, 0x1a, + 0x03, 0x92, 0x02, 0x92, 0x01, 0x93, 0x00, 0x92, 0xb7, 0xee, 0x00, 0x1a, + 0x20, 0x68, 0xdf, 0xed, 0x1c, 0x0a, 0x9f, 0xed, 0x1b, 0x0a, 0x00, 0x23, + 0x01, 0x21, 0xf4, 0xf7, 0x87, 0xfb, 0x12, 0xa8, 0x00, 0x21, 0x02, 0x90, + 0x01, 0x91, 0x00, 0x91, 0xe3, 0x88, 0x21, 0x79, 0x20, 0x68, 0x03, 0x22, + 0xf4, 0xf7, 0x50, 0xfa, 0x1a, 0xa8, 0x07, 0x90, 0x00, 0x21, 0x01, 0x20, + 0x00, 0x23, 0x03, 0x90, 0x01, 0x22, 0x06, 0x91, 0x05, 0x91, 0x04, 0x93, + 0x02, 0x91, 0x01, 0x92, 0x00, 0x93, 0x12, 0xa9, 0x20, 0x68, 0xf4, 0xf7, + 0x58, 0xfa, 0x20, 0xa8, 0x00, 0xf0, 0x14, 0xf8, 0x26, 0xa8, 0x00, 0xf0, + 0x11, 0xf8, 0x20, 0x68, 0x0a, 0xa9, 0xc0, 0x46, 0xc0, 0x46, 0x20, 0x68, + 0x00, 0x23, 0x0a, 0xaa, 0x12, 0x21, 0xf5, 0xf7, 0x12, 0xf8, 0x34, 0xb0, + 0x10, 0xbd, 0x00, 0x00, 0x00, 0x24, 0x74, 0x49, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x90, 0x00, 0x21, 0x01, 0x20, 0x00, 0x23, 0x03, 0x90, 0x06, 0x91, + 0x05, 0x91, 0x04, 0x93, 0x02, 0x91, 0x01, 0x91, 0x00, 0x93, 0x01, 0x22, + 0x20, 0x68, 0x12, 0xa9, 0xf4, 0xf7, 0x31, 0xba, 0x0a, 0x46, 0x12, 0x21, + 0xf5, 0xf7, 0x4c, 0xba, 0xf8, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x06, 0x46, + 0x86, 0xb0, 0x0c, 0x46, 0x30, 0x68, 0x12, 0x21, 0xf5, 0xf7, 0xdd, 0xfa, + 0x07, 0x46, 0x00, 0x22, 0x39, 0x46, 0x03, 0x20, 0xf4, 0xf7, 0xaf, 0xfb, + 0x05, 0x46, 0xf6, 0x88, 0x39, 0x46, 0x01, 0x20, 0xf4, 0xf7, 0xcb, 0xfb, + 0x02, 0x46, 0x31, 0x46, 0x03, 0x20, 0xf4, 0xf7, 0x55, 0xfd, 0x02, 0xa8, + 0x04, 0xa9, 0x01, 0x90, 0x00, 0x91, 0xb0, 0xee, 0x40, 0x8a, 0x01, 0x23, + 0x00, 0x22, 0x39, 0x46, 0x01, 0x20, 0xf4, 0xf7, 0xd3, 0xfb, 0xdd, 0xe9, + 0x04, 0x01, 0xb0, 0xee, 0x48, 0x0a, 0xf4, 0xf7, 0x47, 0xfc, 0x84, 0xed, + 0x00, 0x0a, 0xdd, 0xe9, 0x02, 0x01, 0xb0, 0xee, 0x48, 0x0a, 0xf4, 0xf7, + 0x3f, 0xfc, 0x84, 0xed, 0x01, 0x0a, 0x06, 0xb0, 0x28, 0x46, 0xbd, 0xec, + 0x02, 0x8b, 0xf2, 0xbd, 0x2d, 0xe9, 0xf0, 0x47, 0x08, 0x9e, 0x00, 0x27, + 0x00, 0x24, 0x1c, 0xe0, 0x0e, 0xeb, 0x07, 0x08, 0x06, 0xeb, 0x88, 0x08, + 0x0e, 0xf1, 0x01, 0x0e, 0xc8, 0xed, 0x00, 0x0a, 0xe6, 0x45, 0xf5, 0xd3, + 0xac, 0xf1, 0x01, 0x0e, 0x07, 0xeb, 0x5e, 0x08, 0x0a, 0xeb, 0x85, 0x0e, + 0x06, 0xeb, 0x88, 0x09, 0xde, 0xed, 0x00, 0x0a, 0x6d, 0x1c, 0x60, 0xee, + 0x20, 0x0a, 0x01, 0x2d, 0xc9, 0xed, 0x00, 0x0a, 0x67, 0x44, 0x05, 0xd9, + 0x64, 0x1c, 0x9c, 0x42, 0x11, 0xd2, 0x00, 0x25, 0x01, 0xeb, 0xc4, 0x0a, + 0x02, 0xeb, 0xc4, 0x0e, 0x00, 0xeb, 0x44, 0x0c, 0x0e, 0xeb, 0x85, 0x08, + 0x1c, 0xf8, 0x05, 0xc0, 0xd8, 0xed, 0x00, 0x0a, 0x60, 0xee, 0x20, 0x0a, + 0x4f, 0xf0, 0x00, 0x0e, 0xd6, 0xe7, 0xbd, 0xe8, 0xf0, 0x87, 0x80, 0xed, + 0x00, 0x0a, 0x80, 0xed, 0x01, 0x0a, 0x20, 0xee, 0x01, 0x0a, 0x80, 0xed, + 0x04, 0x0a, 0x80, 0xed, 0x05, 0x0a, 0x20, 0xee, 0x81, 0x0a, 0xc0, 0xed, + 0x02, 0x0a, 0xc0, 0xed, 0x03, 0x0a, 0x80, 0xed, 0x06, 0x0a, 0x80, 0xed, + 0x07, 0x0a, 0x70, 0x47, 0x38, 0xb5, 0x2d, 0xed, 0x04, 0x8b, 0x04, 0x46, + 0xb0, 0xee, 0x40, 0x9a, 0xb0, 0xee, 0x60, 0x8a, 0xf0, 0xee, 0x41, 0x8a, + 0x00, 0x25, 0xe8, 0x1f, 0xdf, 0xed, 0x7b, 0x0a, 0x00, 0xee, 0x10, 0x0a, + 0x69, 0xee, 0x20, 0x0a, 0xb8, 0xee, 0xc0, 0x0a, 0x20, 0xee, 0x80, 0x0a, + 0x01, 0xf0, 0x7f, 0xfb, 0x01, 0xf0, 0x8c, 0xfb, 0x04, 0xeb, 0xc5, 0x00, + 0x6d, 0x1c, 0x10, 0x2d, 0x80, 0xec, 0x02, 0x0a, 0xe9, 0xd3, 0x04, 0xf1, + 0x80, 0x00, 0xb7, 0xee, 0x00, 0x0a, 0x80, 0xed, 0x00, 0x0a, 0xc0, 0xed, + 0x01, 0x8a, 0x80, 0xed, 0x02, 0x0a, 0x80, 0xed, 0x03, 0x8a, 0x80, 0xed, + 0x04, 0x9a, 0xdc, 0xe1, 0x00, 0xeb, 0xc1, 0x00, 0x00, 0xf1, 0x38, 0x01, + 0x91, 0xec, 0x02, 0x0a, 0x70, 0x47, 0x00, 0x00, 0xf0, 0xb5, 0xb0, 0xee, + 0x40, 0x1a, 0x05, 0x9c, 0xf7, 0xee, 0x00, 0x1a, 0x9f, 0xed, 0xd9, 0x0a, + 0x00, 0x25, 0xb0, 0xee, 0x61, 0x2a, 0x00, 0x26, 0x1e, 0xe0, 0x04, 0xfb, + 0x06, 0xc7, 0xd7, 0x5d, 0xa7, 0xf1, 0x01, 0x0e, 0x0e, 0xeb, 0xde, 0x7e, + 0x11, 0xeb, 0x6e, 0x0e, 0x0a, 0xd4, 0xbe, 0x45, 0x08, 0xda, 0xae, 0x44, + 0x00, 0xeb, 0x8e, 0x0e, 0x22, 0xee, 0x22, 0x3a, 0xde, 0xed, 0x00, 0x3a, + 0x03, 0xee, 0x23, 0x0a, 0x7d, 0x19, 0x62, 0xee, 0xa0, 0x2a, 0x0c, 0xf1, + 0x01, 0x0c, 0xa4, 0x45, 0xe3, 0xd3, 0x22, 0xee, 0x01, 0x2a, 0x76, 0x1c, + 0x9e, 0x42, 0x04, 0xd2, 0xf0, 0xee, 0x61, 0x2a, 0x4f, 0xf0, 0x00, 0x0c, + 0xf3, 0xe7, 0xf0, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, + 0x88, 0x46, 0x82, 0xb0, 0x98, 0xf8, 0x00, 0xa0, 0x0e, 0x9f, 0x05, 0x46, + 0x91, 0x46, 0x1e, 0x46, 0x00, 0xf0, 0xf7, 0xf9, 0xaa, 0xf1, 0x01, 0x0b, + 0x00, 0x24, 0x10, 0xe0, 0x00, 0x96, 0xf0, 0xee, 0x68, 0x0a, 0xb0, 0xee, + 0x48, 0x0a, 0x4b, 0x46, 0x42, 0x46, 0xa4, 0xeb, 0x5b, 0x01, 0x28, 0x46, + 0xff, 0xf7, 0xae, 0xff, 0x07, 0xeb, 0x84, 0x00, 0x64, 0x1c, 0x80, 0xed, + 0x00, 0x0a, 0x54, 0x45, 0xec, 0xd3, 0x02, 0xb0, 0xbd, 0xec, 0x02, 0x8b, + 0xbd, 0xe8, 0xf1, 0x8f, 0x10, 0xb5, 0x04, 0x46, 0x01, 0xf0, 0x04, 0xfb, + 0x04, 0xf1, 0x08, 0x00, 0x00, 0xf0, 0xba, 0xfe, 0x00, 0xf0, 0x22, 0xfa, + 0x94, 0xec, 0x02, 0x0a, 0xbd, 0xe8, 0x10, 0x40, 0x01, 0xf0, 0xa5, 0xba, + 0xf8, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x2d, 0xed, 0x02, 0x8b, 0x04, 0xf1, + 0xb0, 0x07, 0xd5, 0xed, 0x24, 0x0a, 0x97, 0xed, 0x0a, 0x0a, 0x9f, 0xed, + 0x29, 0x1a, 0x20, 0xee, 0x81, 0x1a, 0x16, 0x46, 0x21, 0xee, 0x00, 0x0a, + 0x01, 0xf0, 0xdd, 0xfa, 0x01, 0xf0, 0xea, 0xfa, 0x00, 0x2e, 0xd5, 0xf8, + 0x90, 0x00, 0x00, 0xf0, 0xb0, 0xf9, 0x1a, 0xd1, 0x38, 0x60, 0x20, 0x46, + 0x95, 0xed, 0x24, 0x0a, 0xff, 0xf7, 0xce, 0xff, 0x04, 0xf1, 0xb8, 0x00, + 0x00, 0xf0, 0x3a, 0xf8, 0x04, 0xf1, 0xb8, 0x00, 0x80, 0xec, 0x02, 0x0a, + 0x95, 0xed, 0x24, 0x0a, 0x04, 0xf1, 0x10, 0x00, 0xff, 0xf7, 0xc0, 0xff, + 0x04, 0xf1, 0xc0, 0x00, 0x00, 0xf0, 0x2c, 0xf8, 0x04, 0xf1, 0xc0, 0x00, + 0x21, 0xe0, 0x78, 0x60, 0x20, 0x46, 0x95, 0xed, 0x24, 0x0a, 0xb1, 0xee, + 0x40, 0x0a, 0xff, 0xf7, 0xb1, 0xff, 0x01, 0xf0, 0x71, 0xfb, 0x04, 0xf1, + 0xc8, 0x00, 0x00, 0xf0, 0x1b, 0xf8, 0x04, 0xf1, 0xc8, 0x00, 0x80, 0xec, + 0x02, 0x0a, 0x95, 0xed, 0x24, 0x0a, 0xb1, 0xee, 0x40, 0x0a, 0x04, 0xf1, + 0x10, 0x00, 0xff, 0xf7, 0x9f, 0xff, 0x01, 0xf0, 0x5f, 0xfb, 0x04, 0xf1, + 0xd0, 0x00, 0x00, 0xf0, 0x09, 0xf8, 0x04, 0xf1, 0xd0, 0x00, 0x80, 0xec, + 0x02, 0x0a, 0xbd, 0xec, 0x02, 0x8b, 0xf1, 0xbd, 0xdb, 0x0f, 0xc9, 0xc0, + 0xb0, 0xee, 0x48, 0x1a, 0x80, 0xec, 0x02, 0x0a, 0xf0, 0xee, 0x68, 0x1a, + 0x01, 0xf0, 0x63, 0xba, 0x70, 0xb5, 0x05, 0x46, 0x0c, 0x46, 0x16, 0x46, + 0x01, 0x20, 0x00, 0x21, 0x1a, 0x46, 0xf7, 0xf7, 0xe9, 0xfa, 0x2d, 0xed, + 0x02, 0x8b, 0xc8, 0xf7, 0x1b, 0xfb, 0x00, 0xee, 0x10, 0x0a, 0xb7, 0xee, + 0x00, 0x8a, 0x88, 0xee, 0x00, 0x0a, 0x00, 0x20, 0x0c, 0xe0, 0x05, 0xeb, + 0x80, 0x01, 0x04, 0xeb, 0x80, 0x02, 0xd1, 0xed, 0x00, 0x0a, 0xf8, 0xee, + 0xe0, 0x0a, 0x60, 0xee, 0x80, 0x0a, 0xc2, 0xed, 0x00, 0x0a, 0x40, 0x1c, + 0xb0, 0x42, 0xf0, 0xd3, 0xba, 0xe0, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, + 0x06, 0x8b, 0x82, 0xb0, 0x17, 0x78, 0x0f, 0xf2, 0x70, 0x08, 0x12, 0x9e, + 0x00, 0xf1, 0x84, 0x05, 0x7c, 0x1e, 0x64, 0x08, 0x95, 0xed, 0x02, 0xaa, + 0xd5, 0xed, 0x00, 0xaa, 0x98, 0xec, 0x02, 0x9a, 0x64, 0x42, 0x00, 0x25, + 0x80, 0x46, 0x8b, 0x46, 0x92, 0x46, 0x99, 0x46, 0x1a, 0xe0, 0x21, 0x46, + 0x40, 0x46, 0xff, 0xf7, 0xdf, 0xfe, 0x00, 0xf0, 0x1e, 0xf9, 0x00, 0x96, + 0xf0, 0xee, 0x6a, 0x0a, 0xb0, 0xee, 0x4a, 0x0a, 0x4b, 0x46, 0x52, 0x46, + 0x21, 0x46, 0x58, 0x46, 0xff, 0xf7, 0xda, 0xfe, 0x01, 0xf0, 0x3e, 0xfa, + 0x00, 0xf0, 0x8a, 0xfb, 0x00, 0xf0, 0xe0, 0xfd, 0x00, 0xf0, 0x02, 0xfe, + 0x64, 0x1c, 0x6d, 0x1c, 0xbd, 0x42, 0xe2, 0xd3, 0x02, 0xb0, 0x00, 0xf0, + 0x3c, 0xfe, 0xbd, 0xec, 0x06, 0x8b, 0xbd, 0xe8, 0xf1, 0x8f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf7, 0x4f, + 0x2d, 0xed, 0x06, 0x8b, 0x82, 0xb0, 0x81, 0x46, 0x14, 0x9f, 0xdd, 0xf8, + 0x54, 0x80, 0xdd, 0xf8, 0x58, 0xb0, 0x00, 0xf0, 0xee, 0xf8, 0x9a, 0x46, + 0x00, 0x20, 0x29, 0xe0, 0x6a, 0x1e, 0xa4, 0xeb, 0x52, 0x01, 0x48, 0x46, + 0xff, 0xf7, 0xa4, 0xfe, 0x5f, 0xea, 0x0b, 0x00, 0x00, 0xf0, 0xd8, 0xfd, + 0x03, 0xd0, 0x01, 0xf0, 0xc5, 0xfa, 0x00, 0xf0, 0xd3, 0xfd, 0x2a, 0xee, + 0x2a, 0x0a, 0x01, 0xf0, 0x05, 0xfa, 0x00, 0xf0, 0xdb, 0xf8, 0x00, 0xf0, + 0x49, 0xfb, 0x08, 0xeb, 0x87, 0x00, 0x64, 0x1c, 0x80, 0xed, 0x00, 0x0a, + 0x07, 0xeb, 0x0a, 0x00, 0x08, 0xeb, 0x80, 0x01, 0x7f, 0x1c, 0xc1, 0xed, + 0x00, 0x0a, 0xac, 0x42, 0xda, 0xd3, 0x76, 0x1c, 0x01, 0x2e, 0x0b, 0xd9, + 0x00, 0x98, 0x40, 0x1c, 0x00, 0x90, 0x0a, 0x99, 0x00, 0x98, 0x88, 0x42, + 0x0f, 0xd2, 0x09, 0xeb, 0x80, 0x01, 0x00, 0x26, 0x91, 0xed, 0x22, 0xaa, + 0x09, 0xeb, 0x86, 0x00, 0x00, 0x99, 0xd0, 0xed, 0x20, 0xaa, 0x09, 0x98, + 0x06, 0xeb, 0x41, 0x02, 0x00, 0x24, 0x85, 0x5c, 0xe3, 0xe7, 0x02, 0xb0, + 0xbd, 0xec, 0x06, 0x8b, 0xbd, 0xe8, 0xf7, 0x8f, 0x70, 0xb5, 0x2d, 0xed, + 0x02, 0x8b, 0x84, 0xb0, 0x04, 0x46, 0x00, 0x20, 0x02, 0x90, 0x0d, 0x46, + 0x00, 0x26, 0xb0, 0xee, 0x41, 0x8a, 0xf0, 0xee, 0x61, 0x8a, 0x01, 0x95, + 0x00, 0x96, 0x10, 0x23, 0x02, 0x22, 0xdf, 0xf8, 0x0c, 0x1b, 0x20, 0x46, + 0xff, 0xf7, 0x96, 0xff, 0x0a, 0x20, 0x00, 0x90, 0x02, 0x96, 0x01, 0x95, + 0x10, 0x23, 0x02, 0x22, 0xdf, 0xf8, 0xf8, 0x1a, 0x00, 0xf0, 0x82, 0xf8, + 0x20, 0x46, 0xff, 0xf7, 0x89, 0xff, 0x04, 0xb0, 0xbd, 0xec, 0x02, 0x8b, + 0x70, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xb5, 0x2d, 0xed, + 0x04, 0x8b, 0x00, 0xf0, 0x78, 0xf8, 0x04, 0x46, 0x0d, 0x46, 0xc0, 0x46, + 0xc0, 0x46, 0xb0, 0xee, 0x40, 0x9a, 0x00, 0xf0, 0x6b, 0xf8, 0xb0, 0xee, + 0x60, 0x0a, 0x84, 0xed, 0x00, 0x9a, 0xf1, 0xee, 0x40, 0x0a, 0xc4, 0xed, + 0x01, 0x0a, 0x85, 0xed, 0x00, 0x0a, 0x85, 0xed, 0x01, 0x9a, 0xbd, 0xec, + 0x04, 0x8b, 0x31, 0xbd, 0x10, 0xb5, 0x2d, 0xed, 0x08, 0x8b, 0xb0, 0xee, + 0x40, 0x9a, 0x9f, 0xed, 0xbb, 0x0a, 0x29, 0xee, 0x00, 0x0a, 0xb0, 0xee, + 0x60, 0x8a, 0xf0, 0xee, 0x41, 0x8a, 0xb0, 0xee, 0x61, 0xba, 0xf0, 0xee, + 0x42, 0xba, 0x04, 0x46, 0x20, 0xee, 0x22, 0x0a, 0x01, 0xf0, 0x71, 0xf9, + 0x01, 0xf0, 0x7e, 0xf9, 0x01, 0xf0, 0x94, 0xf8, 0xb0, 0xee, 0x4a, 0x1a, + 0xf0, 0xee, 0x6a, 0x1a, 0x01, 0xf0, 0xb6, 0xf8, 0x00, 0xf0, 0x3f, 0xf8, + 0xb0, 0xee, 0x4a, 0x1a, 0xf0, 0xee, 0x6a, 0x1a, 0x01, 0xf0, 0xa4, 0xf8, + 0x01, 0xf0, 0x84, 0xf8, 0x04, 0xf1, 0x20, 0x01, 0x20, 0x46, 0x00, 0xf0, + 0x2d, 0xf8, 0xff, 0xf7, 0xb3, 0xff, 0xb0, 0xee, 0x49, 0x0a, 0x01, 0xf0, + 0x59, 0xf9, 0x00, 0xf0, 0x2f, 0xf8, 0x04, 0xf1, 0x28, 0x01, 0x04, 0xf1, + 0x08, 0x00, 0xff, 0xf7, 0xa7, 0xff, 0x04, 0xf1, 0x30, 0x01, 0x04, 0xf1, + 0x10, 0x00, 0xb0, 0xee, 0x4a, 0x0a, 0xf0, 0xee, 0x6a, 0x0a, 0xff, 0xf7, + 0x9d, 0xff, 0xb0, 0xee, 0x49, 0x0a, 0x01, 0xf0, 0x43, 0xf9, 0x00, 0xf0, + 0x65, 0xf8, 0xb0, 0xee, 0x4a, 0x0a, 0xf0, 0xee, 0x6a, 0x0a, 0x01, 0xf0, + 0x0e, 0xf9, 0xbd, 0xec, 0x08, 0x8b, 0x04, 0xf1, 0x38, 0x01, 0x04, 0xf1, + 0x18, 0x00, 0xbd, 0xe8, 0x10, 0x40, 0x87, 0xe7, 0xb0, 0xee, 0x48, 0x0a, + 0xf0, 0xee, 0x68, 0x0a, 0x70, 0x47, 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, + 0x60, 0x8a, 0x70, 0x47, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, + 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, 0x01, 0xf0, 0xf1, 0xb8, + 0x38, 0xb5, 0x04, 0x46, 0x1d, 0xa0, 0xd2, 0xb2, 0x2d, 0xed, 0x04, 0x8b, + 0xb0, 0xee, 0x40, 0x9a, 0x01, 0x2a, 0xa6, 0xb0, 0x0d, 0x46, 0x90, 0xec, + 0x02, 0x8a, 0x0c, 0xbf, 0xb7, 0xee, 0x00, 0x0a, 0xbf, 0xee, 0x00, 0x0a, + 0x01, 0xf0, 0x03, 0xf9, 0x00, 0xf0, 0x2c, 0xf8, 0xd5, 0xed, 0x23, 0x9a, + 0x85, 0xed, 0x23, 0x9a, 0x05, 0xa9, 0xff, 0xf7, 0xcf, 0xff, 0x28, 0x46, + 0xff, 0xf7, 0x2a, 0xff, 0xc5, 0xed, 0x23, 0x9a, 0x02, 0x20, 0x00, 0x90, + 0x10, 0x23, 0x01, 0xaa, 0x04, 0xf5, 0x8e, 0x71, 0x05, 0xa8, 0x01, 0xf0, + 0xc5, 0xf9, 0x9d, 0xed, 0x01, 0x0a, 0xdd, 0xed, 0x04, 0x0a, 0x30, 0xee, + 0x20, 0x0a, 0x9f, 0xed, 0x6e, 0x1a, 0x26, 0xb0, 0xb4, 0xee, 0x41, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0xbd, 0xec, 0x04, 0x8b, 0xb8, 0xbf, 0x9f, 0xed, + 0x6a, 0x0a, 0x31, 0xbd, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x70, 0x47, 0x00, 0x00, + 0x10, 0xb5, 0x04, 0x46, 0x2d, 0xed, 0x02, 0x8b, 0x94, 0xed, 0x13, 0x0a, + 0x01, 0xf0, 0xce, 0xf8, 0xdf, 0xf8, 0x28, 0x09, 0x00, 0xf0, 0x84, 0xfc, + 0xff, 0xf7, 0x9b, 0xff, 0x94, 0xed, 0x12, 0x0a, 0x01, 0xf0, 0xc4, 0xf8, + 0x00, 0xf0, 0x4e, 0xfc, 0x94, 0xf8, 0x5d, 0x00, 0x01, 0x28, 0x08, 0xbf, + 0x01, 0xf0, 0x76, 0xf9, 0x01, 0xf0, 0x4a, 0xfa, 0xdf, 0xed, 0x56, 0x0a, + 0x80, 0xee, 0x20, 0x0a, 0x94, 0xed, 0x16, 0x1a, 0xd4, 0xed, 0x00, 0x1a, + 0x80, 0xee, 0x01, 0x1a, 0xbd, 0xec, 0x02, 0x8b, 0x31, 0xee, 0x21, 0x0a, + 0x10, 0xbd, 0x38, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x82, 0xb0, 0x04, 0x46, + 0x00, 0x91, 0x15, 0x46, 0xff, 0xf7, 0x75, 0xff, 0x02, 0x23, 0x02, 0x22, + 0xdf, 0xf8, 0xc4, 0x18, 0x04, 0xf1, 0xdc, 0x00, 0xff, 0xf7, 0x68, 0xfd, + 0x00, 0x95, 0xf0, 0xee, 0x68, 0x0a, 0xb0, 0xee, 0x48, 0x0a, 0x02, 0x23, + 0x02, 0x22, 0xdf, 0xf8, 0xb0, 0x18, 0x04, 0xf5, 0x82, 0x70, 0xff, 0xf7, + 0x5b, 0xfd, 0x02, 0xb0, 0xbd, 0xec, 0x02, 0x8b, 0x31, 0xbd, 0x00, 0x00, + 0xf8, 0xb5, 0x2d, 0xed, 0x04, 0x8b, 0x0d, 0x46, 0x0a, 0x98, 0x00, 0x24, + 0xb0, 0xb1, 0x05, 0xf5, 0x4f, 0x70, 0x00, 0xbf, 0x39, 0xa1, 0x90, 0xed, + 0x00, 0x0a, 0x40, 0x68, 0x3b, 0xa3, 0x00, 0xf0, 0x03, 0x00, 0x01, 0xeb, + 0x80, 0x02, 0x03, 0xeb, 0x80, 0x00, 0xd2, 0xed, 0x00, 0x0a, 0x90, 0xed, + 0x00, 0x1a, 0x20, 0xee, 0x20, 0x8a, 0x60, 0xee, 0x01, 0x8a, 0x03, 0xe0, + 0x9f, 0xed, 0xd6, 0x8a, 0xdf, 0xed, 0xd5, 0x8a, 0x0b, 0x9e, 0x00, 0x27, + 0x9f, 0xed, 0xd4, 0x9a, 0x05, 0xeb, 0x87, 0x00, 0x03, 0x2f, 0x90, 0xed, + 0xd3, 0x0a, 0x08, 0xbf, 0x30, 0xee, 0x08, 0x0a, 0x20, 0xee, 0x09, 0x0a, + 0xc7, 0xf7, 0x32, 0xfe, 0x06, 0xeb, 0x87, 0x00, 0x7f, 0x1c, 0xbd, 0xee, + 0xc0, 0x0a, 0x07, 0x2f, 0x80, 0xed, 0x00, 0x0a, 0xea, 0xd3, 0x00, 0x27, + 0x05, 0xeb, 0x87, 0x00, 0x01, 0x2f, 0x90, 0xed, 0xda, 0x0a, 0x08, 0xbf, + 0x30, 0xee, 0x28, 0x0a, 0x20, 0xee, 0x09, 0x0a, 0xc7, 0xf7, 0x1c, 0xfe, + 0x06, 0xf1, 0x1c, 0x00, 0x00, 0xeb, 0x87, 0x01, 0x7f, 0x1c, 0xbd, 0xee, + 0xc0, 0x0a, 0x03, 0x2f, 0x81, 0xed, 0x00, 0x0a, 0xe8, 0xd3, 0x00, 0x20, + 0x56, 0xf8, 0x20, 0x10, 0x01, 0xf5, 0x00, 0x31, 0xb1, 0xf5, 0x80, 0x2f, + 0x03, 0xd2, 0x40, 0x1c, 0x07, 0x28, 0xf5, 0xd3, 0x01, 0xe0, 0x43, 0xf2, + 0x06, 0x24, 0x00, 0x20, 0x06, 0xf1, 0x1c, 0x01, 0x51, 0xf8, 0x20, 0x20, + 0x02, 0xf5, 0x00, 0x42, 0xb2, 0xf5, 0x80, 0x3f, 0x03, 0xd2, 0x40, 0x1c, + 0x03, 0x28, 0xf5, 0xd3, 0x01, 0xe0, 0x43, 0xf2, 0x06, 0x24, 0xbd, 0xec, + 0x04, 0x8b, 0x20, 0x46, 0xf2, 0xbd, 0x00, 0x00, 0xdb, 0x0f, 0xc9, 0xc0, + 0x60, 0x70, 0x89, 0x30, 0x5f, 0x70, 0x89, 0x30, 0xdb, 0x0f, 0xc9, 0x40, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x80, 0xbf, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0xbf, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0xbf, 0x2d, 0xe9, 0xf8, 0x43, + 0x04, 0x46, 0x00, 0xee, 0x10, 0x2a, 0x2d, 0xed, 0x08, 0x8b, 0xb8, 0xee, + 0x40, 0x0a, 0x9f, 0xed, 0xdb, 0x1a, 0x04, 0xf5, 0xba, 0x79, 0xa4, 0xb0, + 0x20, 0xee, 0x01, 0xaa, 0x0d, 0x46, 0xf0, 0xee, 0x4a, 0x0a, 0x99, 0xed, + 0x02, 0x0a, 0xdf, 0xf8, 0x50, 0x67, 0xde, 0xf7, 0x8b, 0xfd, 0x05, 0xf1, + 0xc8, 0x00, 0xf0, 0xee, 0x40, 0xaa, 0xb7, 0xee, 0x00, 0x1a, 0x31, 0xee, + 0x6a, 0xba, 0x90, 0xec, 0x02, 0x0a, 0x01, 0xf0, 0x8f, 0xf8, 0x05, 0xf1, + 0xd0, 0x00, 0x00, 0xf0, 0x6f, 0xfb, 0x00, 0xf0, 0x99, 0xfb, 0xb0, 0xee, + 0x4b, 0x0a, 0x00, 0xf0, 0xcb, 0xff, 0x00, 0xf0, 0x17, 0xf9, 0xff, 0xf7, + 0x9a, 0xfe, 0xb0, 0xee, 0x4b, 0x0a, 0x00, 0xf0, 0xc3, 0xff, 0x00, 0xf0, + 0x09, 0xf9, 0xb0, 0xee, 0x40, 0x9a, 0x99, 0xed, 0x03, 0x0a, 0xf0, 0xee, + 0x60, 0x9a, 0x03, 0xab, 0x2b, 0xee, 0x00, 0x0a, 0x01, 0x22, 0x08, 0x21, + 0x28, 0x46, 0x01, 0xf0, 0xd9, 0xf9, 0x00, 0x20, 0x03, 0x90, 0x00, 0x21, + 0x03, 0xa8, 0x08, 0x23, 0x41, 0x60, 0x01, 0x61, 0x41, 0x61, 0x01, 0x22, + 0x00, 0x93, 0x02, 0x90, 0x01, 0x92, 0x03, 0xab, 0x08, 0x21, 0x01, 0xf0, + 0xdb, 0xf9, 0x94, 0xed, 0x16, 0x0a, 0xd4, 0xed, 0x12, 0x1a, 0x94, 0xed, + 0x1a, 0x1a, 0x60, 0xee, 0x0a, 0x0a, 0x0b, 0xa8, 0x21, 0xee, 0x8a, 0x0a, + 0xff, 0xf7, 0xe3, 0xfb, 0x01, 0x20, 0x00, 0x90, 0x08, 0x23, 0x0b, 0xaa, + 0x0b, 0xa9, 0x03, 0xa8, 0x01, 0xf0, 0xa3, 0xfb, 0x0b, 0xaa, 0x08, 0x21, + 0x05, 0xf1, 0x20, 0x00, 0x01, 0xf0, 0x39, 0xfa, 0x0b, 0xa8, 0x00, 0xf0, + 0x8e, 0xf9, 0xff, 0xf7, 0xd0, 0xfb, 0x0b, 0xaa, 0x08, 0x21, 0x05, 0xf1, + 0x20, 0x00, 0x01, 0xf0, 0x45, 0xfa, 0xb0, 0xee, 0x6a, 0x0a, 0x01, 0x22, + 0x08, 0x21, 0x28, 0x46, 0x01, 0xf0, 0x9b, 0xf9, 0x95, 0xed, 0x00, 0x0a, + 0x30, 0xee, 0x08, 0x0a, 0x85, 0xed, 0x00, 0x0a, 0xd5, 0xed, 0x01, 0x0a, + 0x95, 0xed, 0x04, 0x0a, 0x70, 0xee, 0xa8, 0x0a, 0xc5, 0xed, 0x01, 0x0a, + 0x30, 0xee, 0x09, 0x0a, 0xd5, 0xed, 0x05, 0x0a, 0x85, 0xed, 0x04, 0x0a, + 0x70, 0xee, 0xa9, 0x0a, 0xc5, 0xed, 0x05, 0x0a, 0xf0, 0xee, 0x4a, 0x0a, + 0x99, 0xed, 0x00, 0x0a, 0xde, 0xf7, 0x02, 0xfd, 0xb0, 0xee, 0x40, 0xba, + 0x05, 0xf5, 0x5d, 0x70, 0xb7, 0xee, 0x00, 0x0a, 0x05, 0xf5, 0x5f, 0x71, + 0x70, 0xee, 0x4b, 0xaa, 0x90, 0xec, 0x02, 0x8a, 0x91, 0xec, 0x02, 0x0a, + 0x01, 0xf0, 0x02, 0xf8, 0xff, 0xf7, 0x1e, 0xfe, 0xf0, 0xee, 0x60, 0x9a, + 0x13, 0xa8, 0xb0, 0xee, 0x40, 0x9a, 0x78, 0xee, 0x69, 0xba, 0x00, 0x90, + 0xb0, 0xee, 0x4a, 0x0a, 0x02, 0x23, 0x04, 0xf1, 0xc0, 0x02, 0x04, 0xf1, + 0xb0, 0x01, 0x30, 0x46, 0xff, 0xf7, 0x48, 0xfb, 0x1d, 0xa8, 0x00, 0x90, + 0xb0, 0xee, 0x4a, 0x0a, 0x0f, 0xf6, 0x98, 0x57, 0x02, 0x23, 0x04, 0xf5, + 0x90, 0x72, 0x04, 0xf5, 0x88, 0x71, 0x38, 0x46, 0xff, 0xf7, 0x3a, 0xfb, + 0x05, 0xf1, 0xdc, 0x08, 0x99, 0xed, 0x01, 0x0a, 0x03, 0xab, 0x2a, 0xee, + 0x80, 0x0a, 0x01, 0x22, 0x10, 0x21, 0x40, 0x46, 0x01, 0xf0, 0x40, 0xf9, + 0x00, 0x21, 0x06, 0x91, 0x0e, 0x91, 0x10, 0x23, 0x01, 0x21, 0x03, 0xa8, + 0x01, 0x91, 0x00, 0x93, 0x02, 0x90, 0x03, 0xab, 0x01, 0x22, 0x10, 0x21, + 0x01, 0xf0, 0x44, 0xf9, 0x01, 0x20, 0x00, 0x90, 0x10, 0x23, 0x13, 0xaa, + 0x13, 0xa9, 0x03, 0xa8, 0x01, 0xf0, 0x19, 0xfb, 0x05, 0xf5, 0x8e, 0x79, + 0x13, 0xaa, 0x10, 0x21, 0x48, 0x46, 0x01, 0xf0, 0xae, 0xf9, 0xb0, 0xee, + 0x4b, 0x0a, 0x01, 0x22, 0x10, 0x21, 0x40, 0x46, 0x01, 0xf0, 0x1b, 0xf9, + 0x28, 0xee, 0x08, 0x0a, 0x05, 0xf1, 0xe8, 0x00, 0x08, 0xee, 0xa8, 0x0a, + 0x20, 0xee, 0x2a, 0x0a, 0x80, 0xee, 0x2b, 0x0a, 0xd0, 0xed, 0x00, 0x0a, + 0x90, 0xed, 0x08, 0x1a, 0x70, 0xee, 0x20, 0x0a, 0xc0, 0xed, 0x00, 0x0a, + 0x78, 0xee, 0x89, 0x0a, 0x60, 0xee, 0xaa, 0x0a, 0xc0, 0xee, 0xab, 0x0a, + 0x30, 0xee, 0x81, 0x1a, 0x80, 0xed, 0x08, 0x1a, 0x13, 0xa8, 0x00, 0xf0, + 0x2b, 0xf8, 0x04, 0xf1, 0xa0, 0x02, 0x04, 0xf1, 0x90, 0x01, 0x30, 0x46, + 0xff, 0xf7, 0xe4, 0xfa, 0x1d, 0xa8, 0x00, 0xf0, 0x21, 0xf8, 0x04, 0xf5, + 0x80, 0x72, 0x04, 0xf1, 0xf0, 0x01, 0x38, 0x46, 0xff, 0xf7, 0xda, 0xfa, + 0x13, 0xaa, 0x10, 0x21, 0x48, 0x46, 0x01, 0xf0, 0x89, 0xf9, 0x24, 0xb0, + 0xbd, 0xec, 0x08, 0x8b, 0xbd, 0xe8, 0xf1, 0x83, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x47, 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, + 0x00, 0xf0, 0x85, 0xbe, 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, + 0x00, 0xf0, 0x7f, 0xbe, 0x00, 0x90, 0xb7, 0xee, 0x00, 0x0a, 0x02, 0x23, + 0x70, 0x47, 0x80, 0xed, 0x36, 0x0a, 0x70, 0x47, 0x2d, 0xe9, 0xfc, 0x47, + 0x0c, 0x46, 0x05, 0x46, 0x04, 0xf1, 0xdc, 0x06, 0x0f, 0xf6, 0x70, 0x48, + 0x00, 0x96, 0xff, 0xf7, 0xee, 0xff, 0x05, 0xf1, 0xa0, 0x02, 0x05, 0xf1, + 0x90, 0x01, 0x40, 0x46, 0xff, 0xf7, 0xa6, 0xfa, 0x04, 0xf5, 0x82, 0x77, + 0x0f, 0xf6, 0x58, 0x49, 0x00, 0x97, 0xff, 0xf7, 0xe0, 0xff, 0x05, 0xf5, + 0x80, 0x72, 0x05, 0xf1, 0xf0, 0x01, 0x48, 0x46, 0xff, 0xf7, 0x98, 0xfa, + 0x04, 0xf5, 0x8e, 0x7a, 0x4f, 0xf4, 0x08, 0x71, 0x50, 0x46, 0xd9, 0xf7, + 0x17, 0xf9, 0x32, 0x46, 0x10, 0x21, 0x50, 0x46, 0x01, 0xf0, 0x29, 0xf9, + 0x00, 0x96, 0xff, 0xf7, 0xca, 0xff, 0x05, 0xf1, 0x80, 0x02, 0x05, 0xf1, + 0x70, 0x01, 0x40, 0x46, 0xff, 0xf7, 0x82, 0xfa, 0x00, 0x97, 0xff, 0xf7, + 0xc0, 0xff, 0x05, 0xf1, 0xe0, 0x02, 0x05, 0xf1, 0xd0, 0x01, 0x48, 0x46, + 0xff, 0xf7, 0x78, 0xfa, 0x04, 0xf5, 0x4f, 0x75, 0x00, 0x20, 0x28, 0x60, + 0x68, 0x60, 0x28, 0x73, 0x04, 0xf5, 0x5a, 0x72, 0xdf, 0xf8, 0xc8, 0x03, + 0xa8, 0x60, 0x04, 0xf5, 0x53, 0x71, 0xdf, 0xed, 0x4f, 0x0a, 0x9f, 0xed, + 0x4e, 0x0a, 0x20, 0x46, 0xff, 0xf7, 0xa5, 0xfd, 0xdf, 0xf8, 0xb4, 0x1a, + 0x04, 0xf5, 0x5d, 0x70, 0x91, 0xec, 0x02, 0x0a, 0x80, 0xec, 0x02, 0x0a, + 0xdf, 0xf8, 0xa8, 0x0a, 0xdf, 0xf8, 0xa8, 0x1a, 0x04, 0xf5, 0x5f, 0x72, + 0x90, 0xec, 0x02, 0x1a, 0x82, 0xec, 0x02, 0x1a, 0xa9, 0x64, 0xbd, 0xe8, + 0xf3, 0x87, 0x00, 0x00, 0xbd, 0x37, 0x86, 0x35, 0x38, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x28, 0x46, 0x00, 0xf0, 0x3b, 0xf8, 0xff, 0xf7, 0x7d, 0xfa, + 0x90, 0x21, 0x05, 0xf1, 0x20, 0x00, 0xd9, 0xf7, 0xc5, 0xf8, 0x2a, 0x46, + 0x08, 0x21, 0x05, 0xf1, 0x20, 0x00, 0x01, 0xf0, 0xd6, 0xf8, 0x28, 0x46, + 0xb7, 0xee, 0x00, 0x1a, 0xd4, 0xed, 0x04, 0x0a, 0x94, 0xed, 0x00, 0x0a, + 0xff, 0xf7, 0x69, 0xfa, 0x05, 0xf1, 0xb0, 0x00, 0x9f, 0xed, 0xd1, 0x0a, + 0x80, 0xed, 0x00, 0x0a, 0x80, 0xed, 0x01, 0x0a, 0x05, 0xf1, 0xb8, 0x01, + 0xdf, 0xf8, 0x38, 0x0a, 0x05, 0xf1, 0xc0, 0x02, 0x90, 0xec, 0x02, 0x0a, + 0x81, 0xec, 0x02, 0x0a, 0xdf, 0xf8, 0x2c, 0x1a, 0x05, 0xf1, 0xc8, 0x03, + 0x91, 0xec, 0x02, 0x1a, 0x82, 0xec, 0x02, 0x1a, 0x90, 0xec, 0x02, 0x0a, + 0x83, 0xec, 0x02, 0x0a, 0x05, 0xf1, 0xd0, 0x00, 0x91, 0xec, 0x02, 0x1a, + 0x80, 0xec, 0x02, 0x1a, 0x31, 0xbd, 0x94, 0xed, 0x10, 0x1a, 0xd4, 0xed, + 0x0c, 0x0a, 0x94, 0xed, 0x08, 0x0a, 0x70, 0x47, 0x38, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0xff, 0xf7, 0x47, 0xff, 0x29, 0x46, 0x20, 0x46, 0xbd, 0xe8, + 0x34, 0x40, 0xad, 0xe7, 0x10, 0xb5, 0x00, 0xee, 0x90, 0x2a, 0x2d, 0xed, + 0x02, 0x8b, 0xb8, 0xee, 0x60, 0x8a, 0x00, 0xee, 0x90, 0x3a, 0xf8, 0xee, + 0x60, 0x0a, 0x9f, 0xed, 0xce, 0x1a, 0xa6, 0xb0, 0x80, 0xee, 0x81, 0x1a, + 0x0c, 0x46, 0xf0, 0xee, 0x48, 0x0a, 0x68, 0x46, 0xff, 0xf7, 0x32, 0xfa, + 0x01, 0x22, 0xb0, 0xee, 0x48, 0x0a, 0x69, 0x46, 0x20, 0x46, 0xff, 0xf7, + 0xab, 0xfc, 0xd4, 0xed, 0xcf, 0x0a, 0xb0, 0xee, 0x00, 0x1a, 0x20, 0xee, + 0x81, 0x1a, 0x26, 0xb0, 0x01, 0xee, 0x20, 0x0a, 0xf5, 0xee, 0x00, 0x0a, + 0xbd, 0xec, 0x02, 0x8b, 0x20, 0xee, 0x20, 0x0a, 0x10, 0xbd, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf7, 0x4f, 0x2d, 0xed, 0x04, 0x8b, + 0xa8, 0xb0, 0x80, 0x46, 0x24, 0x22, 0x08, 0xf1, 0x0c, 0x01, 0x0c, 0xa8, + 0xc7, 0xf7, 0x2a, 0xfa, 0x18, 0x22, 0x08, 0xf1, 0x30, 0x01, 0x06, 0xa8, + 0xc7, 0xf7, 0x24, 0xfa, 0x01, 0x21, 0x0c, 0xa8, 0x2b, 0xe0, 0x0a, 0x01, + 0x83, 0x18, 0xd3, 0xed, 0x00, 0x0a, 0x00, 0xf0, 0xb6, 0xfc, 0x21, 0xd4, + 0x0c, 0x23, 0x4b, 0x43, 0xc4, 0x18, 0x9d, 0xed, 0x0c, 0x2a, 0xd4, 0xed, + 0x00, 0x0a, 0xdd, 0xed, 0x0c, 0x1a, 0x00, 0xeb, 0x81, 0x04, 0x60, 0xee, + 0x21, 0x1a, 0x94, 0xed, 0x00, 0x1a, 0x0c, 0xac, 0x23, 0x44, 0x03, 0xeb, + 0x81, 0x03, 0x21, 0xee, 0x01, 0x1a, 0xd3, 0xed, 0x00, 0x2a, 0x62, 0xee, + 0x22, 0x2a, 0x00, 0xee, 0xa0, 0x1a, 0x72, 0xee, 0xc1, 0x0a, 0xf4, 0xee, + 0x61, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x01, 0xd5, 0x00, 0x23, 0x83, 0x50, + 0x49, 0x1c, 0x98, 0xf8, 0x08, 0x20, 0x91, 0x42, 0xcf, 0xd3, 0x00, 0x23, + 0x02, 0xe0, 0x11, 0x01, 0x52, 0x1c, 0x43, 0x50, 0x02, 0x2a, 0xfa, 0xd9, + 0x6b, 0x46, 0x03, 0x22, 0x06, 0xa9, 0x01, 0xf0, 0x99, 0xf9, 0x98, 0xf8, + 0x08, 0x90, 0xdf, 0xf8, 0xe8, 0xb8, 0x00, 0x24, 0x18, 0x27, 0x34, 0xe0, + 0x0c, 0x21, 0x08, 0xeb, 0x84, 0x00, 0x71, 0x43, 0x45, 0x18, 0x95, 0xed, + 0x03, 0x0a, 0x00, 0xf0, 0x55, 0xfd, 0x00, 0xf0, 0x03, 0xf9, 0x0c, 0x20, + 0x60, 0x43, 0x40, 0x44, 0x00, 0xeb, 0x86, 0x0a, 0x00, 0xf0, 0xe2, 0xf8, + 0x00, 0xf0, 0xd6, 0xf8, 0x16, 0xa8, 0x07, 0xfb, 0x04, 0xf1, 0x08, 0x44, + 0x00, 0xeb, 0xc6, 0x02, 0x82, 0xec, 0x02, 0x0a, 0x95, 0xed, 0x03, 0x0a, + 0xb1, 0xee, 0x40, 0x0a, 0x00, 0xf0, 0x3c, 0xfd, 0x00, 0xf0, 0xea, 0xf8, + 0x00, 0xf0, 0xce, 0xf8, 0x00, 0xf0, 0xc2, 0xf8, 0x16, 0xa8, 0x00, 0xeb, + 0xc4, 0x01, 0x07, 0xfb, 0x06, 0xf2, 0x11, 0x44, 0x76, 0x1c, 0x81, 0xec, + 0x02, 0x0a, 0x4e, 0x45, 0xcc, 0xd3, 0x15, 0x94, 0x64, 0x1c, 0x4c, 0x45, + 0x0c, 0xd2, 0x08, 0xf1, 0x0c, 0x00, 0x00, 0xeb, 0x04, 0x11, 0x66, 0x1c, + 0x00, 0xf0, 0xb2, 0xf8, 0x00, 0xf0, 0xa1, 0xf8, 0x16, 0xa8, 0x00, 0xeb, + 0x44, 0x11, 0xea, 0xe7, 0x0f, 0xf6, 0x70, 0x10, 0x00, 0x25, 0x90, 0xec, + 0x02, 0x9a, 0x6c, 0x46, 0x1c, 0xe0, 0x16, 0xa8, 0x07, 0xfb, 0x05, 0xf1, + 0x08, 0x44, 0x00, 0xeb, 0xca, 0x02, 0x04, 0xeb, 0xca, 0x03, 0x92, 0xec, + 0x02, 0x1a, 0x93, 0xec, 0x02, 0x0a, 0x00, 0xf0, 0xd8, 0xfc, 0x04, 0xeb, + 0xc5, 0x00, 0x00, 0xf0, 0x9f, 0xf8, 0xff, 0xf7, 0x4d, 0xfe, 0x00, 0xf0, + 0xa3, 0xf8, 0x00, 0xf0, 0xc5, 0xf8, 0x0a, 0xf1, 0x01, 0x0a, 0xca, 0x45, + 0xe3, 0xd3, 0x6d, 0x1c, 0x4d, 0x45, 0x38, 0xbf, 0x4f, 0xf0, 0x00, 0x0a, + 0xf7, 0xd3, 0x2d, 0x9d, 0x98, 0xed, 0x14, 0x0a, 0x00, 0xf0, 0xec, 0xfc, + 0x00, 0xf0, 0x0f, 0xfc, 0x00, 0xf0, 0xa8, 0xfc, 0xc0, 0x46, 0xc0, 0x46, + 0xb0, 0xee, 0x40, 0x9a, 0x98, 0xed, 0x0d, 0x0a, 0x00, 0xf0, 0xe0, 0xfc, + 0x00, 0xf0, 0x8e, 0xf8, 0xff, 0xf7, 0xaf, 0xfb, 0x98, 0xed, 0x0c, 0x0a, + 0x00, 0xf0, 0xd8, 0xfc, 0x00, 0xf0, 0x62, 0xf8, 0x85, 0xec, 0x02, 0x0a, + 0x02, 0x27, 0x1f, 0xe0, 0x0c, 0x21, 0x08, 0xf1, 0x0c, 0x00, 0x79, 0x43, + 0x01, 0x44, 0x00, 0xf0, 0x5d, 0xf8, 0x00, 0xf0, 0x79, 0xf8, 0x08, 0xf1, + 0x0c, 0x00, 0x00, 0xeb, 0x87, 0x01, 0xff, 0xf7, 0x96, 0xfb, 0x00, 0xf0, + 0x53, 0xf8, 0x00, 0xf0, 0x4b, 0xf8, 0x04, 0xeb, 0xc7, 0x00, 0x00, 0xf0, + 0x75, 0xf8, 0xff, 0xf7, 0xdd, 0xfb, 0x95, 0xec, 0x02, 0x0a, 0x00, 0xf0, + 0x75, 0xfc, 0x85, 0xec, 0x02, 0x0a, 0x7f, 0x1c, 0x4f, 0x45, 0xdd, 0xd3, + 0xdd, 0xf8, 0xb8, 0x90, 0x98, 0xed, 0x03, 0x0a, 0x00, 0xf0, 0xaa, 0xfc, + 0x00, 0xf0, 0x2b, 0xf8, 0x89, 0xec, 0x02, 0x0a, 0x98, 0xed, 0x06, 0x0a, + 0x00, 0xf0, 0xa2, 0xfc, 0x00, 0xf0, 0x50, 0xf8, 0xff, 0xf7, 0x71, 0xfb, + 0x98, 0xed, 0x04, 0x0a, 0x00, 0xf0, 0x9a, 0xfc, 0x00, 0xf0, 0x24, 0xf8, + 0x09, 0xf1, 0x08, 0x00, 0x80, 0xec, 0x02, 0x0a, 0x98, 0xf8, 0x5d, 0x10, + 0x01, 0x29, 0x0b, 0xd1, 0x00, 0xf0, 0x48, 0xfd, 0x09, 0xf1, 0x08, 0x00, + 0x80, 0xec, 0x02, 0x0a, 0x95, 0xec, 0x02, 0x0a, 0x00, 0xf0, 0x40, 0xfd, + 0x85, 0xec, 0x02, 0x0a, 0x28, 0xb0, 0xb0, 0xee, 0x49, 0x0a, 0xbd, 0xec, + 0x04, 0x8b, 0xbd, 0xe8, 0xf7, 0x8f, 0xdf, 0xf8, 0x14, 0x07, 0x90, 0xec, + 0x02, 0x1a, 0x00, 0xf0, 0x24, 0xbc, 0x00, 0x00, 0xcd, 0xcc, 0xcc, 0x3d, + 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, 0x00, 0xf0, 0x1b, 0xbc, + 0x91, 0xed, 0x00, 0x0a, 0x00, 0xf0, 0x6a, 0xbc, 0xb0, 0xee, 0x40, 0x8a, + 0xf0, 0xee, 0x60, 0x8a, 0x9a, 0xed, 0x03, 0x0a, 0x00, 0xf0, 0x62, 0xbc, + 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, 0x60, 0x8a, 0x90, 0xec, 0x02, 0x0a, + 0x00, 0xf0, 0x14, 0xbd, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, + 0xb0, 0xee, 0x49, 0x0a, 0xf0, 0xee, 0x69, 0x0a, 0x00, 0xf0, 0xfd, 0xbb, + 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x9b, 0xec, 0x02, 0x0a, + 0x00, 0xf0, 0x1b, 0xbc, 0xdf, 0xf8, 0xb4, 0x06, 0xb0, 0xee, 0x40, 0x1a, + 0xf0, 0xee, 0x60, 0x1a, 0x90, 0xec, 0x02, 0x0a, 0x00, 0xf0, 0x11, 0xbc, + 0x00, 0x00, 0x82, 0x42, 0x04, 0xa5, 0x03, 0x01, 0x08, 0xa5, 0x03, 0x01, + 0x18, 0x90, 0x00, 0x20, 0xb0, 0xee, 0x40, 0x9a, 0xf0, 0xee, 0x60, 0x9a, + 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x43, 0x2d, 0xed, 0x04, 0x8b, 0x8a, 0xb0, + 0x04, 0x46, 0x88, 0x46, 0x91, 0x46, 0x1f, 0x46, 0x16, 0x9d, 0x17, 0x9e, + 0x06, 0xa8, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x8c, 0x46, 0x80, 0xe8, + 0x0e, 0x10, 0xff, 0xf7, 0xe7, 0xff, 0xb0, 0xee, 0x61, 0x8a, 0x8d, 0xed, + 0x06, 0x1a, 0x8d, 0xed, 0x09, 0x1a, 0xc0, 0x46, 0xc0, 0x46, 0x8d, 0xed, + 0x04, 0x0a, 0x00, 0xf0, 0x1c, 0xf8, 0xb0, 0xee, 0x60, 0x0a, 0x8d, 0xed, + 0x05, 0x0a, 0x00, 0x96, 0x2b, 0x46, 0x4a, 0x46, 0x41, 0x46, 0x04, 0xa8, + 0x00, 0xf0, 0xca, 0xfc, 0x03, 0x96, 0x02, 0x95, 0x01, 0x94, 0x00, 0x97, + 0xb0, 0xee, 0x48, 0x0a, 0x4b, 0x46, 0x06, 0xaa, 0x41, 0x46, 0x04, 0xa8, + 0x00, 0xf0, 0xda, 0xfc, 0x0a, 0xb0, 0xbd, 0xec, 0x04, 0x8b, 0xbd, 0xe8, + 0xf2, 0x83, 0xb0, 0xee, 0x49, 0x0a, 0xf0, 0xee, 0x69, 0x0a, 0x70, 0x47, + 0xd1, 0xf8, 0x40, 0x03, 0x40, 0x1c, 0xc1, 0xf8, 0x40, 0x03, 0x70, 0x47, + 0x80, 0xed, 0xe1, 0x0a, 0x70, 0x47, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, + 0x88, 0x46, 0x2d, 0xed, 0x10, 0x8b, 0x08, 0xf5, 0x4f, 0x71, 0xb2, 0xb0, + 0x91, 0x46, 0x8a, 0x6c, 0x04, 0x92, 0x00, 0xf5, 0x98, 0x7a, 0x9b, 0x46, + 0x0b, 0xaa, 0x05, 0xa9, 0x9a, 0xed, 0x0f, 0x0a, 0x48, 0x46, 0xff, 0xf7, + 0x1b, 0xfe, 0xd9, 0xed, 0x15, 0x0a, 0x99, 0xed, 0x16, 0x1a, 0xda, 0xed, + 0x00, 0x1a, 0x9a, 0xed, 0x0a, 0x2a, 0x99, 0xf8, 0x5c, 0x00, 0x4c, 0x9e, + 0x80, 0xee, 0x81, 0x1a, 0x61, 0xee, 0x21, 0x0a, 0x22, 0xee, 0x00, 0x0a, + 0x00, 0x27, 0x00, 0x24, 0x00, 0x25, 0x00, 0xf0, 0xd6, 0xfa, 0x48, 0xbf, + 0xf0, 0xee, 0x40, 0x0a, 0x99, 0xed, 0x01, 0x0a, 0xb8, 0xee, 0x40, 0x0a, + 0x80, 0xee, 0x80, 0x0a, 0x09, 0xf1, 0x5c, 0x01, 0xd9, 0xed, 0x03, 0x0a, + 0x8a, 0x78, 0x60, 0xee, 0x20, 0xea, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, + 0x40, 0x8a, 0x00, 0xee, 0x90, 0x2a, 0xf8, 0xee, 0x60, 0x0a, 0x9f, 0xed, + 0xee, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0x8d, 0xed, 0x03, 0x0a, 0x48, 0x46, + 0xff, 0xf7, 0xc4, 0xfa, 0x8d, 0xed, 0x02, 0x0a, 0xf0, 0xee, 0x48, 0x0a, + 0x9d, 0xed, 0x03, 0x1a, 0x30, 0x46, 0xfe, 0xf7, 0xf3, 0xff, 0x10, 0x23, + 0x07, 0x22, 0x0f, 0xa9, 0x58, 0x46, 0xff, 0xf7, 0xfb, 0xf8, 0x01, 0x20, + 0x00, 0x90, 0x01, 0x23, 0x0f, 0xf2, 0x44, 0x62, 0x0f, 0xa9, 0x30, 0x46, + 0xff, 0xf7, 0x17, 0xf9, 0xb0, 0xee, 0x40, 0xfa, 0xf0, 0xee, 0x60, 0xfa, + 0x10, 0x23, 0x03, 0x22, 0x0f, 0xa9, 0x0b, 0xf1, 0x1c, 0x00, 0xff, 0xf7, + 0xe7, 0xf8, 0x01, 0x20, 0x00, 0x90, 0x01, 0x23, 0x0f, 0xf2, 0x20, 0x62, + 0x0f, 0xa9, 0x30, 0x46, 0xff, 0xf7, 0x03, 0xf9, 0x09, 0xa8, 0x09, 0xa9, + 0xdf, 0xf8, 0xf8, 0x24, 0xdf, 0xf8, 0xe8, 0xb4, 0x80, 0xec, 0x02, 0x0a, + 0x91, 0xec, 0x02, 0x1a, 0x92, 0xec, 0x02, 0x0a, 0x00, 0xf0, 0x33, 0xfb, + 0xff, 0xf7, 0x28, 0xff, 0x00, 0xf0, 0x90, 0xfa, 0xff, 0xf7, 0x7e, 0xfa, + 0x9b, 0xec, 0x02, 0x0a, 0x00, 0xf0, 0x03, 0xfb, 0xff, 0xf7, 0x0c, 0xff, + 0xb0, 0xee, 0x40, 0xca, 0xf0, 0xee, 0x60, 0xca, 0x00, 0xf0, 0x82, 0xfa, + 0x00, 0xf0, 0xa2, 0xfa, 0xff, 0xf7, 0x02, 0xff, 0xff, 0xf7, 0x1b, 0xfa, + 0x00, 0xf0, 0x70, 0xfa, 0xff, 0xf7, 0x68, 0xfa, 0x9f, 0xed, 0xbf, 0xaa, + 0x9b, 0xec, 0x02, 0x0a, 0x00, 0xf0, 0xeb, 0xfa, 0xff, 0xf7, 0xf4, 0xfe, + 0xb0, 0xee, 0x40, 0xba, 0xf0, 0xee, 0x60, 0xba, 0x00, 0xf0, 0x60, 0xfa, + 0x00, 0xf0, 0x8a, 0xfa, 0xff, 0xf7, 0xea, 0xfe, 0x0d, 0xf1, 0x2c, 0x0b, + 0x0b, 0xf1, 0x08, 0x00, 0x00, 0xf0, 0x8a, 0xfa, 0x00, 0xf0, 0x78, 0xfa, + 0xb0, 0xee, 0x4c, 0x0a, 0xf0, 0xee, 0x6c, 0x0a, 0x00, 0xf0, 0xf7, 0xfa, + 0xff, 0xf7, 0xae, 0xfe, 0x0b, 0xf1, 0x08, 0x00, 0xb0, 0xee, 0x40, 0xda, + 0xf0, 0xee, 0x60, 0xda, 0x90, 0xec, 0x02, 0x1a, 0x00, 0xf0, 0x56, 0xfa, + 0x00, 0xf0, 0x64, 0xfa, 0xff, 0xf7, 0x1f, 0xff, 0x00, 0xf0, 0xe5, 0xfa, + 0xff, 0xf7, 0x9c, 0xfe, 0x09, 0xf1, 0x5c, 0x00, 0xb0, 0xee, 0x40, 0x9a, + 0x41, 0x78, 0x01, 0x29, 0xf0, 0xee, 0x60, 0x9a, 0x40, 0xf0, 0xc5, 0x81, + 0x05, 0xa8, 0xb0, 0xee, 0x4d, 0x0a, 0x90, 0xec, 0x02, 0x8a, 0xf0, 0xee, + 0x6d, 0x0a, 0x00, 0xf0, 0xb7, 0xfb, 0x00, 0xf0, 0x1b, 0xfa, 0xff, 0xf7, + 0x04, 0xff, 0x00, 0xf0, 0xb1, 0xfb, 0xb0, 0xee, 0x60, 0x1a, 0xf0, 0xee, + 0x40, 0x0a, 0x96, 0xed, 0x24, 0x0a, 0xd8, 0xed, 0x36, 0x2a, 0x0f, 0xa8, + 0xf0, 0xee, 0x4a, 0x1a, 0xb0, 0xee, 0x6a, 0x2a, 0xb1, 0xee, 0x40, 0x0a, + 0xff, 0xf7, 0x58, 0xf9, 0xff, 0xf7, 0xb2, 0xf9, 0x00, 0xf0, 0x9c, 0xfb, + 0x02, 0x20, 0x08, 0x21, 0x01, 0x90, 0x00, 0x91, 0x08, 0xf1, 0x20, 0x03, + 0x42, 0x46, 0x0f, 0xa9, 0x00, 0x20, 0xf7, 0xee, 0x00, 0x1a, 0xb0, 0xee, + 0x6e, 0x1a, 0xff, 0xf7, 0xa2, 0xfe, 0x01, 0x22, 0x31, 0x46, 0x40, 0x46, + 0xfe, 0xf7, 0xd6, 0xff, 0x08, 0xf1, 0xd0, 0x00, 0x08, 0xf1, 0xc8, 0x01, + 0x90, 0xec, 0x02, 0x1a, 0x91, 0xec, 0x02, 0x0a, 0x00, 0xf0, 0x71, 0xfa, + 0xb0, 0xee, 0x40, 0x8a, 0x0f, 0xf2, 0xc8, 0x41, 0x96, 0xed, 0x24, 0x0a, + 0xd8, 0xed, 0x36, 0x2a, 0xf0, 0xee, 0x60, 0x8a, 0x13, 0xa8, 0xd1, 0xec, + 0x02, 0x1a, 0xd1, 0xec, 0x02, 0x0a, 0xb1, 0xee, 0x40, 0x0a, 0xff, 0xf7, + 0x23, 0xf9, 0x02, 0x20, 0x00, 0x90, 0xf5, 0xee, 0x00, 0xca, 0x68, 0xee, + 0x08, 0xaa, 0x08, 0x23, 0x0f, 0xaa, 0x08, 0xf1, 0x20, 0x01, 0x13, 0xa8, + 0x48, 0xee, 0xa8, 0xaa, 0x00, 0xf0, 0x74, 0xfb, 0x07, 0xa8, 0x01, 0x22, + 0x80, 0xec, 0x02, 0x8a, 0x31, 0x46, 0x40, 0x46, 0x9d, 0xed, 0x0f, 0x0a, + 0xdd, 0xed, 0x12, 0x0a, 0x01, 0x24, 0x30, 0xee, 0x20, 0xca, 0xb7, 0xee, + 0x00, 0x0a, 0xff, 0xf7, 0x73, 0xf9, 0x20, 0xee, 0x2c, 0xaa, 0xb0, 0xee, + 0x6a, 0x0a, 0xda, 0xed, 0x17, 0x0a, 0x60, 0xee, 0x20, 0x0a, 0xb4, 0xee, + 0x60, 0xca, 0xf1, 0xee, 0x10, 0xfa, 0xb0, 0xee, 0x4c, 0xea, 0x0b, 0xd4, + 0x20, 0xee, 0x0a, 0x0a, 0x9a, 0xed, 0x18, 0x1a, 0x20, 0xee, 0x01, 0x0a, + 0xb4, 0xee, 0x40, 0xca, 0xf1, 0xee, 0x10, 0xfa, 0x40, 0xf1, 0x82, 0x80, + 0x05, 0xa9, 0x0f, 0xa8, 0x91, 0xec, 0x02, 0x0a, 0x80, 0xec, 0x02, 0x0a, + 0x00, 0xf0, 0x93, 0xf9, 0xb0, 0xee, 0x4d, 0x0a, 0xf0, 0xee, 0x6d, 0x0a, + 0x00, 0xf0, 0x15, 0xfa, 0xff, 0xf7, 0x1e, 0xfe, 0x68, 0x46, 0xb0, 0xee, + 0x49, 0x1a, 0x80, 0xec, 0x02, 0x0a, 0xf0, 0xee, 0x69, 0x1a, 0xb0, 0xee, + 0x4d, 0x0a, 0xf0, 0xee, 0x6d, 0x0a, 0x00, 0xf0, 0x19, 0xfa, 0xb6, 0x49, + 0xff, 0xf7, 0x7a, 0xf9, 0x91, 0xec, 0x02, 0x0a, 0x00, 0xf0, 0x25, 0xfa, + 0x68, 0x46, 0x00, 0xf0, 0xad, 0xf9, 0x0f, 0xa8, 0x90, 0xec, 0x02, 0x1a, + 0x00, 0xf0, 0x0a, 0xfa, 0xb0, 0xee, 0x40, 0xba, 0xf0, 0xee, 0x60, 0xba, + 0x00, 0xf0, 0x88, 0xf9, 0xaa, 0x48, 0xff, 0xf7, 0xfb, 0xfd, 0xff, 0xf7, + 0x63, 0xf9, 0x11, 0xa9, 0xb0, 0xee, 0x4b, 0x0a, 0xf0, 0xee, 0x6b, 0x0a, + 0x30, 0x46, 0xff, 0xf7, 0x63, 0xf8, 0x00, 0xf0, 0x79, 0xf9, 0xb0, 0xee, + 0x40, 0x8a, 0x9a, 0xed, 0x16, 0x0a, 0x2a, 0xee, 0x80, 0x0a, 0xb4, 0xee, + 0x4c, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x0b, 0xa8, 0xf0, 0xee, 0x60, 0x8a, + 0x58, 0xbf, 0xb0, 0xee, 0x40, 0xca, 0x90, 0xec, 0x02, 0x0a, 0x01, 0xf0, + 0x6d, 0xf8, 0x0b, 0xf1, 0x08, 0x00, 0xb0, 0xee, 0x40, 0x9a, 0x90, 0xec, + 0x02, 0x0a, 0x01, 0xf0, 0x65, 0xf8, 0xda, 0xed, 0x0d, 0x0a, 0x9a, 0xed, + 0x0e, 0x1a, 0x60, 0xee, 0x89, 0x0a, 0x41, 0xee, 0x00, 0x0a, 0x02, 0x20, + 0x10, 0x21, 0x01, 0x90, 0x00, 0x91, 0xb7, 0xee, 0x00, 0x1a, 0x9a, 0xed, + 0x09, 0x0a, 0x60, 0xee, 0xa0, 0x0a, 0x70, 0xee, 0x01, 0x1a, 0x40, 0xee, + 0x8c, 0xea, 0x08, 0xf5, 0x8e, 0x73, 0x08, 0xf1, 0xdc, 0x02, 0x11, 0xa9, + 0x04, 0xa8, 0xb0, 0xee, 0x6e, 0x1a, 0xff, 0xf7, 0xc7, 0xf8, 0xff, 0xf7, + 0xc6, 0xfd, 0x00, 0x28, 0x32, 0xd0, 0x01, 0x25, 0x01, 0x22, 0xb7, 0xee, + 0x00, 0x0a, 0x31, 0x46, 0x40, 0x46, 0xff, 0xf7, 0xcf, 0xf8, 0xb0, 0xee, + 0x40, 0x9a, 0x99, 0xed, 0x06, 0x0a, 0x00, 0xf0, 0xe7, 0xf9, 0x7c, 0x48, + 0xff, 0xf7, 0x9e, 0xfd, 0xff, 0xf7, 0xb5, 0xf8, 0x99, 0xed, 0x04, 0x0a, + 0x00, 0xf0, 0xde, 0xf9, 0xff, 0xf7, 0x68, 0xfd, 0xff, 0xf7, 0xad, 0xf8, + 0x99, 0xed, 0x03, 0x0a, 0x00, 0xf0, 0xd6, 0xf9, 0xb0, 0xee, 0x48, 0x1a, + 0xf0, 0xee, 0x68, 0x1a, 0x00, 0xf0, 0x90, 0xf9, 0x01, 0xf0, 0x1a, 0xf8, + 0xdf, 0xed, 0x6a, 0x0a, 0x00, 0xf0, 0xe0, 0xf8, 0x09, 0xdb, 0xb7, 0xee, + 0x00, 0x0a, 0x06, 0xe0, 0x00, 0x00, 0x82, 0x42, 0x00, 0x00, 0x00, 0x00, + 0x43, 0xf2, 0x0c, 0x27, 0xa4, 0xe0, 0xda, 0xed, 0x07, 0x0a, 0xda, 0xed, + 0x03, 0x1a, 0x00, 0xf0, 0xcf, 0xf8, 0x58, 0xbf, 0xb0, 0xee, 0x60, 0x0a, + 0x80, 0xee, 0x20, 0x0a, 0x20, 0xee, 0x09, 0x0a, 0xda, 0xed, 0x05, 0x0a, + 0x00, 0xf0, 0xc9, 0xf8, 0x42, 0xbf, 0x9a, 0xed, 0x06, 0x1a, 0xb4, 0xee, + 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x47, 0xbf, 0xda, 0xed, 0x02, 0x0a, + 0x20, 0xee, 0x20, 0x0a, 0x9a, 0xed, 0x01, 0x1a, 0x20, 0xee, 0x01, 0x0a, + 0xda, 0xed, 0x04, 0x0a, 0x00, 0xf0, 0xb0, 0xf8, 0x4c, 0xbf, 0xb0, 0xee, + 0x40, 0x1a, 0xb0, 0xee, 0x60, 0x1a, 0xf4, 0xee, 0x41, 0x1a, 0xf1, 0xee, + 0x10, 0xfa, 0x05, 0xd5, 0x00, 0xf0, 0xa4, 0xf8, 0x04, 0xd4, 0xb0, 0xee, + 0x60, 0x0a, 0x01, 0xe0, 0xb0, 0xee, 0x61, 0x0a, 0xc7, 0xf7, 0x0e, 0xfa, + 0x08, 0xf5, 0x4f, 0x70, 0x09, 0xf1, 0x5c, 0x02, 0xd0, 0xed, 0x00, 0x0a, + 0x00, 0xf0, 0x99, 0xf8, 0x5f, 0xbf, 0x9a, 0xed, 0x08, 0x1a, 0x60, 0xee, + 0x81, 0x0a, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x58, 0xbf, + 0xb0, 0xee, 0x60, 0x0a, 0x80, 0xed, 0x00, 0x0a, 0x08, 0xf5, 0x53, 0x7b, + 0x02, 0x99, 0x81, 0x60, 0x08, 0xf5, 0x5a, 0x79, 0x93, 0x78, 0x03, 0x73, + 0x4a, 0x46, 0x59, 0x46, 0x40, 0x46, 0xf0, 0xee, 0x00, 0x0a, 0x60, 0xee, + 0x20, 0x0a, 0x00, 0xee, 0x80, 0x9a, 0xdd, 0xed, 0x03, 0x0a, 0xb7, 0xee, + 0x00, 0x0a, 0xff, 0xf7, 0xae, 0xf8, 0x00, 0x94, 0x5f, 0xf0, 0x01, 0x03, + 0x78, 0xa2, 0x59, 0x46, 0x30, 0x46, 0xfe, 0xf7, 0xe6, 0xfe, 0x08, 0xf5, + 0x5d, 0x70, 0x01, 0x23, 0x80, 0xec, 0x02, 0x0a, 0x00, 0x94, 0x49, 0x46, + 0x73, 0xa2, 0x30, 0x46, 0xfe, 0xf7, 0xdb, 0xfe, 0x08, 0xf5, 0x5f, 0x70, + 0x29, 0xee, 0x2c, 0xaa, 0x24, 0xe0, 0x00, 0x22, 0x31, 0x46, 0x40, 0x46, + 0xfe, 0xf7, 0x44, 0xfe, 0x99, 0xed, 0x03, 0x0a, 0x00, 0xf0, 0x38, 0xf9, + 0xff, 0xf7, 0x09, 0xf8, 0x99, 0xed, 0x0d, 0x0a, 0x00, 0xf0, 0x32, 0xf9, + 0x21, 0x48, 0xff, 0xf7, 0xe9, 0xfc, 0xff, 0xf7, 0xf7, 0xfc, 0x99, 0xed, + 0x0c, 0x0a, 0x00, 0xf0, 0x29, 0xf9, 0x00, 0xf0, 0x4c, 0xf8, 0x00, 0xf0, + 0xd2, 0xf8, 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, 0x00, 0xf0, + 0x05, 0xf9, 0x07, 0xa8, 0x9f, 0xed, 0x13, 0xea, 0x80, 0xec, 0x02, 0x0a, + 0x4d, 0x98, 0x02, 0x99, 0x01, 0x60, 0x00, 0xf1, 0x0c, 0x02, 0x80, 0xed, + 0x01, 0xaa, 0x09, 0xa9, 0x82, 0xec, 0x02, 0xfa, 0x00, 0xf1, 0x14, 0x03, + 0x91, 0xec, 0x02, 0x0a, 0x83, 0xec, 0x02, 0x0a, 0x07, 0xab, 0x00, 0xf1, + 0x1c, 0x02, 0x93, 0xec, 0x02, 0x1a, 0x82, 0xec, 0x02, 0x1a, 0x80, 0xed, + 0x02, 0xea, 0x00, 0xf8, 0x24, 0x4f, 0x45, 0x70, 0x32, 0xb0, 0x38, 0x46, + 0xbd, 0xec, 0x10, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, 0x01, 0x00, 0x80, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x90, 0x00, 0x20, 0x6c, 0x77, 0x02, 0x20, + 0x00, 0x00, 0x80, 0xbf, 0x18, 0x90, 0x00, 0x20, 0x28, 0x90, 0x00, 0x20, + 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x70, 0x47, 0xf4, 0xee, + 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x70, 0x47, 0xb0, 0xee, 0x40, 0xaa, + 0xf0, 0xee, 0x60, 0xaa, 0x70, 0x47, 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, + 0x69, 0x1a, 0x70, 0x47, 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, + 0xb0, 0xee, 0x4f, 0x0a, 0xf0, 0xee, 0x6f, 0x0a, 0x00, 0xf0, 0x79, 0xb8, + 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, 0xb0, 0xee, 0x4f, 0x0a, + 0xf0, 0xee, 0x6f, 0x0a, 0x00, 0xf0, 0x82, 0xb8, 0xb0, 0xee, 0x4b, 0x0a, + 0xf0, 0xee, 0x6b, 0x0a, 0x00, 0xf0, 0x8f, 0xb8, 0xb0, 0xee, 0x49, 0x1a, + 0xf0, 0xee, 0x69, 0x1a, 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, + 0x00, 0xf0, 0x85, 0xb8, 0x0b, 0xa8, 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, + 0x60, 0x8a, 0x90, 0xec, 0x02, 0x1a, 0x70, 0x47, 0xb0, 0xee, 0x40, 0x1a, + 0xf0, 0xee, 0x60, 0x1a, 0x9b, 0xec, 0x02, 0x0a, 0x00, 0xf0, 0x62, 0xb8, + 0xb0, 0xee, 0x40, 0x9a, 0xf0, 0xee, 0x60, 0x9a, 0x90, 0xec, 0x02, 0x1a, + 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, 0x00, 0xf0, 0x69, 0xb8, + 0x30, 0xb5, 0x04, 0x46, 0x00, 0x20, 0x00, 0x25, 0x00, 0xe0, 0x6d, 0x1c, + 0x8d, 0x42, 0x08, 0xd2, 0x54, 0xf8, 0x25, 0x30, 0x5b, 0x00, 0x1a, 0x16, + 0x52, 0x1c, 0xf6, 0xd1, 0x1b, 0x02, 0xf4, 0xd0, 0x01, 0x20, 0x30, 0xbd, + 0x70, 0xb5, 0x0c, 0x46, 0x08, 0x21, 0x20, 0x46, 0xff, 0xf7, 0xe8, 0xff, + 0x06, 0x46, 0x24, 0x21, 0x04, 0xf1, 0x20, 0x00, 0xff, 0xf7, 0xe2, 0xff, + 0x06, 0x43, 0x10, 0x21, 0x04, 0xf1, 0xdc, 0x00, 0xff, 0xf7, 0xdc, 0xff, + 0x06, 0x43, 0x88, 0x21, 0x04, 0xf5, 0x8e, 0x70, 0xff, 0xf7, 0xd6, 0xff, + 0x00, 0x25, 0x06, 0x43, 0x18, 0xbf, 0x43, 0xf2, 0x0d, 0x25, 0x28, 0x46, + 0x70, 0xbd, 0x00, 0x00, 0x07, 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x69, 0x46, 0x91, 0xec, 0x02, 0x0a, 0x03, 0xb0, + 0x00, 0xbd, 0x00, 0xb5, 0x83, 0xb0, 0x11, 0xee, 0x90, 0x1a, 0x00, 0x91, + 0x11, 0xee, 0x10, 0x0a, 0x03, 0x46, 0x10, 0xee, 0x90, 0x1a, 0x10, 0xee, + 0x10, 0x0a, 0x0a, 0x46, 0x01, 0x46, 0x01, 0xa8, 0x00, 0xf0, 0x90, 0xfe, + 0x01, 0xa9, 0xe8, 0xe7, 0x00, 0xb5, 0x83, 0xb0, 0x11, 0xee, 0x90, 0x1a, + 0x00, 0x91, 0x11, 0xee, 0x10, 0x0a, 0x03, 0x46, 0x10, 0xee, 0x90, 0x1a, + 0x10, 0xee, 0x10, 0x0a, 0x0a, 0x46, 0x01, 0x46, 0x01, 0xa8, 0x00, 0xf0, + 0x8a, 0xfe, 0x01, 0xa9, 0xd5, 0xe7, 0x00, 0xb5, 0x83, 0xb0, 0x11, 0xee, + 0x90, 0x1a, 0x00, 0x91, 0x11, 0xee, 0x10, 0x0a, 0x03, 0x46, 0x10, 0xee, + 0x90, 0x1a, 0x10, 0xee, 0x10, 0x0a, 0x0a, 0x46, 0x01, 0x46, 0x01, 0xa8, + 0x00, 0xf0, 0x8b, 0xfe, 0x01, 0xa9, 0xc2, 0xe7, 0x00, 0xb5, 0x83, 0xb0, + 0x11, 0xee, 0x90, 0x1a, 0x00, 0x91, 0x11, 0xee, 0x10, 0x0a, 0x03, 0x46, + 0x10, 0xee, 0x90, 0x1a, 0x10, 0xee, 0x10, 0x0a, 0x0a, 0x46, 0x01, 0x46, + 0x01, 0xa8, 0x00, 0xf0, 0x8d, 0xfe, 0x01, 0xa9, 0xaf, 0xe7, 0xe0, 0xb5, + 0x10, 0xee, 0x10, 0x1a, 0x68, 0x46, 0x00, 0xf0, 0xa1, 0xfe, 0xa7, 0xe7, + 0xe0, 0xb5, 0x10, 0xee, 0x10, 0x1a, 0x68, 0x46, 0x00, 0xf0, 0xa2, 0xfe, + 0xa0, 0xe7, 0x00, 0x00, 0x80, 0xb5, 0x2d, 0xed, 0x04, 0x8b, 0xf0, 0xee, + 0x40, 0x8a, 0x18, 0xee, 0x90, 0x1a, 0x49, 0x00, 0x08, 0x16, 0x40, 0x1c, + 0xb0, 0xee, 0x60, 0x8a, 0x06, 0xd1, 0x09, 0x02, 0x04, 0xd0, 0x18, 0xee, + 0x10, 0x0a, 0x41, 0x00, 0x14, 0xd0, 0x43, 0xe0, 0x18, 0xee, 0x10, 0x1a, + 0x49, 0x00, 0x08, 0x16, 0x40, 0x1c, 0x1a, 0xd1, 0x09, 0x02, 0x18, 0xd0, + 0x18, 0xee, 0x90, 0x1a, 0x48, 0x00, 0x00, 0x16, 0x40, 0x1c, 0x08, 0xd1, + 0x49, 0x02, 0x06, 0xd1, 0x18, 0xee, 0x90, 0x0a, 0xc0, 0x0f, 0x07, 0xd1, + 0xb0, 0xee, 0x68, 0x9a, 0x01, 0xe0, 0xb0, 0xee, 0x48, 0x9a, 0xf0, 0xee, + 0x48, 0x8a, 0x73, 0xe0, 0x9f, 0xed, 0x3e, 0x9a, 0xdf, 0xed, 0x3d, 0x8a, + 0x6e, 0xe0, 0x18, 0xee, 0x90, 0x1a, 0x48, 0x00, 0x00, 0x16, 0x40, 0x1c, + 0x12, 0xd1, 0x49, 0x02, 0x10, 0xd1, 0x18, 0xee, 0x90, 0x0a, 0xc0, 0x0f, + 0x18, 0xee, 0x10, 0x1a, 0x17, 0xd1, 0x48, 0x00, 0x00, 0x16, 0x40, 0x1c, + 0x31, 0xd1, 0x49, 0x02, 0x2f, 0xd1, 0xb0, 0xee, 0x68, 0x9a, 0xdf, 0xed, + 0x32, 0x8a, 0x55, 0xe0, 0x18, 0xee, 0x10, 0x1a, 0x48, 0x00, 0x00, 0x16, + 0x40, 0x1c, 0x35, 0xd1, 0x49, 0x02, 0x33, 0xd1, 0xdf, 0xed, 0x2c, 0x8a, + 0xb0, 0xee, 0x68, 0x9a, 0x48, 0xe0, 0x48, 0x00, 0x00, 0x16, 0x40, 0x1c, + 0x0a, 0xd1, 0x49, 0x02, 0x08, 0xd1, 0x18, 0xee, 0x10, 0x1a, 0x01, 0xf0, + 0x00, 0x40, 0x9f, 0xed, 0x24, 0x9a, 0x08, 0xee, 0x90, 0x0a, 0x39, 0xe0, + 0xb0, 0xee, 0x48, 0x0a, 0xc6, 0xf7, 0x44, 0xfd, 0xdf, 0xed, 0x1f, 0x8a, + 0x20, 0xee, 0x28, 0x9a, 0xb0, 0xee, 0x48, 0x0a, 0xc6, 0xf7, 0x3e, 0xfd, + 0x60, 0xee, 0x28, 0x8a, 0x2a, 0xe0, 0x18, 0xee, 0x10, 0x0a, 0x40, 0x00, + 0xaa, 0xd0, 0xb0, 0xee, 0x48, 0x0a, 0xc6, 0xf7, 0x31, 0xfd, 0x28, 0xee, + 0x80, 0x9a, 0xb0, 0xee, 0x48, 0x0a, 0xc6, 0xf7, 0x2d, 0xfd, 0x68, 0xee, + 0x80, 0x8a, 0x19, 0xe0, 0xb0, 0xee, 0x48, 0x0a, 0xc6, 0xf7, 0x24, 0xfd, + 0xf0, 0xee, 0x40, 0x0a, 0x00, 0x20, 0xb0, 0xee, 0x68, 0x0a, 0xee, 0xf7, + 0xef, 0xfc, 0xb0, 0xee, 0x40, 0x9a, 0xb0, 0xee, 0x48, 0x0a, 0xc6, 0xf7, + 0x19, 0xfd, 0xf0, 0xee, 0x40, 0x0a, 0x00, 0x20, 0xb0, 0xee, 0x68, 0x0a, + 0xee, 0xf7, 0xe2, 0xfc, 0xf0, 0xee, 0x40, 0x8a, 0xf0, 0xee, 0x68, 0x0a, + 0xb0, 0xee, 0x49, 0x0a, 0xbd, 0xec, 0x04, 0x8b, 0xbd, 0xe8, 0x01, 0x40, + 0x00, 0xf0, 0xfe, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x7f, + 0x82, 0xb0, 0xf1, 0xee, 0x60, 0x0a, 0x8d, 0xed, 0x00, 0x0a, 0xcd, 0xed, + 0x01, 0x0a, 0x02, 0xb0, 0x70, 0x47, 0x00, 0x00, 0x3e, 0xb5, 0x02, 0x90, + 0x0d, 0x46, 0x01, 0x20, 0x01, 0x90, 0x1c, 0x46, 0x06, 0x99, 0x00, 0x94, + 0x13, 0x46, 0x22, 0x46, 0x28, 0x46, 0x00, 0xf0, 0x56, 0xfa, 0x37, 0xbd, + 0x1f, 0xb5, 0x02, 0x92, 0x0c, 0x46, 0x06, 0x9a, 0x00, 0x92, 0x19, 0x46, + 0x01, 0x91, 0x03, 0x46, 0x0a, 0x46, 0x20, 0x46, 0x00, 0xf0, 0xfc, 0xf8, + 0x1f, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x47, 0x2d, 0xed, 0x02, 0x8b, + 0xad, 0xf5, 0x08, 0x7d, 0x80, 0x46, 0x94, 0x9d, 0x95, 0x9f, 0xdd, 0xf8, + 0x48, 0x92, 0x48, 0xa8, 0x02, 0x90, 0x0c, 0x46, 0x16, 0x46, 0x9a, 0x46, + 0x01, 0x95, 0xb0, 0xee, 0x40, 0x8a, 0x00, 0x97, 0x23, 0x46, 0x2a, 0x46, + 0x29, 0x46, 0x48, 0x46, 0x00, 0xf0, 0xa0, 0xf8, 0x04, 0xa8, 0x02, 0x90, + 0x01, 0x97, 0x00, 0x95, 0x48, 0xab, 0x2a, 0x46, 0x39, 0x46, 0x20, 0x46, + 0x00, 0xf0, 0x8c, 0xfa, 0x04, 0xab, 0xb0, 0xee, 0x48, 0x0a, 0x3a, 0x46, + 0x39, 0x46, 0x04, 0xa8, 0x00, 0xf0, 0x1a, 0xf9, 0x00, 0x97, 0x3b, 0x46, + 0x04, 0xaa, 0x31, 0x46, 0x04, 0xa8, 0x00, 0xf0, 0x02, 0xfb, 0x02, 0x2f, + 0x03, 0xd1, 0x04, 0xa9, 0x04, 0xa8, 0x00, 0xf0, 0xa4, 0xfa, 0x93, 0x9c, + 0x01, 0x26, 0x00, 0x2c, 0x3d, 0xd0, 0x94, 0xed, 0x00, 0x8a, 0xb5, 0xee, + 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x36, 0xdd, 0x02, 0x2f, 0x0f, 0xd1, + 0x00, 0xf0, 0x60, 0xf8, 0x01, 0x21, 0x40, 0x46, 0x00, 0xf0, 0x64, 0xfa, + 0x03, 0xa8, 0x02, 0x21, 0x02, 0x90, 0x01, 0x91, 0x00, 0x96, 0x43, 0x46, + 0x02, 0x22, 0x01, 0x21, 0x08, 0xa8, 0x0e, 0xe0, 0x00, 0x96, 0x3b, 0x46, + 0x08, 0xaa, 0x41, 0x46, 0x04, 0xa8, 0x00, 0xf0, 0x93, 0xfe, 0x03, 0xa8, + 0x02, 0x90, 0x01, 0x97, 0x01, 0x21, 0x00, 0x91, 0x08, 0xab, 0x3a, 0x46, + 0x40, 0x46, 0x00, 0xf0, 0x5a, 0xfa, 0x9d, 0xed, 0x03, 0x0a, 0xb5, 0xee, + 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xd8, 0xbf, 0x9f, 0xed, 0x1b, 0x0a, + 0xc6, 0xf7, 0x36, 0xff, 0xb4, 0xee, 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, + 0x84, 0xed, 0x00, 0x0a, 0x48, 0xbf, 0x00, 0x26, 0x23, 0xd4, 0x02, 0x2f, + 0x06, 0xd1, 0x00, 0xf0, 0x29, 0xf8, 0x29, 0x46, 0x48, 0xa8, 0x00, 0xf0, + 0x2d, 0xfa, 0x06, 0xe0, 0x00, 0x95, 0x3b, 0x46, 0x08, 0xaa, 0x04, 0xa9, + 0x48, 0xa8, 0x00, 0xf0, 0x78, 0xfe, 0xcd, 0xf8, 0x08, 0xa0, 0x01, 0x96, + 0x00, 0x97, 0x43, 0x46, 0x3a, 0x46, 0x29, 0x46, 0x08, 0xa8, 0x00, 0xf0, + 0x81, 0xf9, 0xcd, 0xf8, 0x08, 0x90, 0x01, 0x97, 0x00, 0x95, 0x48, 0xab, + 0x3a, 0x46, 0x29, 0x46, 0x08, 0xa8, 0x00, 0xf0, 0xfd, 0xf8, 0x0d, 0xf5, + 0x08, 0x7d, 0x30, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf0, 0x87, + 0x00, 0x00, 0x00, 0x00, 0x08, 0xa8, 0x02, 0x21, 0x02, 0x90, 0x01, 0x91, + 0x02, 0x22, 0x00, 0x92, 0x04, 0xab, 0x70, 0x47, 0xb0, 0xee, 0x40, 0x1a, + 0xf0, 0xee, 0x60, 0x1a, 0xf0, 0xee, 0x41, 0x0a, 0xb0, 0xee, 0x61, 0x0a, + 0x00, 0xf0, 0x66, 0xbe, 0x2d, 0xe9, 0xf0, 0x4f, 0x05, 0x46, 0x89, 0x46, + 0x98, 0x46, 0x16, 0x46, 0x09, 0x9b, 0x0a, 0x98, 0x0b, 0x99, 0x00, 0x22, + 0x00, 0xe0, 0x22, 0x46, 0x4a, 0x45, 0x2f, 0xd2, 0x00, 0x27, 0x54, 0x1c, + 0x00, 0xe0, 0x7f, 0x1c, 0x9f, 0x42, 0xf6, 0xd2, 0x03, 0xfb, 0x02, 0x7c, + 0x4f, 0xf0, 0x00, 0x0e, 0x41, 0xf8, 0x2c, 0xe0, 0xb6, 0x45, 0xf4, 0xd2, + 0x0e, 0xf1, 0x01, 0x0a, 0x96, 0x45, 0x39, 0xbf, 0x04, 0xfb, 0x02, 0xfb, + 0x0e, 0xeb, 0x5b, 0x0b, 0x0a, 0xfb, 0x0e, 0xfb, 0x02, 0xeb, 0x5b, 0x0b, + 0x05, 0xeb, 0x8b, 0x0b, 0x00, 0xfb, 0x07, 0xee, 0x9b, 0xed, 0x00, 0x0a, + 0x08, 0xeb, 0x8e, 0x0e, 0x01, 0xeb, 0x8c, 0x0b, 0xde, 0xed, 0x00, 0x0a, + 0x9b, 0xed, 0x00, 0x1a, 0x01, 0xeb, 0x8c, 0x0e, 0x00, 0xee, 0x20, 0x1a, + 0x8e, 0xed, 0x00, 0x1a, 0xd6, 0x46, 0xdb, 0xe7, 0xbd, 0xe8, 0xf0, 0x8f, + 0x2d, 0xe9, 0xf0, 0x4f, 0x80, 0x46, 0x09, 0x9d, 0x0a, 0x98, 0x0b, 0x99, + 0x00, 0x22, 0x00, 0xe0, 0x52, 0x1c, 0xaa, 0x42, 0x3d, 0xd2, 0x4f, 0xf0, + 0x00, 0x0e, 0x01, 0xe0, 0x0e, 0xf1, 0x01, 0x0e, 0xae, 0x45, 0xf5, 0xd2, + 0x05, 0xfb, 0x02, 0xe4, 0x00, 0x26, 0x41, 0xf8, 0x24, 0x60, 0x37, 0x46, + 0x87, 0x42, 0xf3, 0xd2, 0x4f, 0xf0, 0x00, 0x0c, 0x7e, 0x1c, 0x84, 0x45, + 0xf7, 0xd2, 0x0c, 0xf1, 0x01, 0x09, 0xbc, 0x45, 0x39, 0xbf, 0x06, 0xfb, + 0x07, 0xfa, 0x0c, 0xeb, 0x5a, 0x0a, 0x09, 0xfb, 0x0c, 0xfa, 0x07, 0xeb, + 0x5a, 0x0a, 0x08, 0xeb, 0x8a, 0x0b, 0x00, 0xfb, 0x02, 0x7a, 0x03, 0xeb, + 0x8a, 0x0a, 0x00, 0xfb, 0x0e, 0xcc, 0x9b, 0xed, 0x00, 0x0a, 0xda, 0xed, + 0x00, 0x0a, 0x03, 0xeb, 0x8c, 0x0c, 0x01, 0xeb, 0x84, 0x0a, 0x20, 0xee, + 0x20, 0x0a, 0x9c, 0xed, 0x00, 0x1a, 0xda, 0xed, 0x00, 0x0a, 0x01, 0xeb, + 0x84, 0x0c, 0x40, 0xee, 0x01, 0x0a, 0xcc, 0xed, 0x00, 0x0a, 0xcc, 0x46, + 0xd3, 0xe7, 0xbd, 0xe8, 0xf0, 0x8f, 0x03, 0x46, 0x30, 0xb5, 0x51, 0x43, + 0x00, 0x22, 0x0a, 0xe0, 0x00, 0xeb, 0x82, 0x04, 0x03, 0xeb, 0x82, 0x05, + 0xd4, 0xed, 0x00, 0x0a, 0x60, 0xee, 0x80, 0x0a, 0xc5, 0xed, 0x00, 0x0a, + 0x52, 0x1c, 0x8a, 0x42, 0xf2, 0xd3, 0x30, 0xbd, 0x2d, 0xe9, 0xf0, 0x43, + 0x08, 0x9c, 0x09, 0x9d, 0x00, 0x26, 0x15, 0xe0, 0x02, 0xfb, 0x06, 0x7c, + 0x04, 0xfb, 0x06, 0x78, 0x00, 0xeb, 0x8c, 0x0e, 0x03, 0xeb, 0x88, 0x09, + 0x9e, 0xed, 0x00, 0x0a, 0xd9, 0xed, 0x00, 0x0a, 0x05, 0xeb, 0x8c, 0x0c, + 0x60, 0xee, 0x20, 0x0a, 0xcc, 0xed, 0x00, 0x0a, 0x7f, 0x1c, 0x97, 0x42, + 0xea, 0xd3, 0x76, 0x1c, 0x8e, 0x42, 0x38, 0xbf, 0x00, 0x27, 0xf8, 0xd3, + 0xbd, 0xe8, 0xf0, 0x83, 0x2d, 0xe9, 0xf0, 0x43, 0x08, 0x9c, 0x09, 0x9d, + 0x00, 0x26, 0x15, 0xe0, 0x02, 0xfb, 0x06, 0x7c, 0x04, 0xfb, 0x06, 0x78, + 0x00, 0xeb, 0x8c, 0x0e, 0x03, 0xeb, 0x88, 0x09, 0x9e, 0xed, 0x00, 0x0a, + 0xd9, 0xed, 0x00, 0x0a, 0x05, 0xeb, 0x8c, 0x0c, 0xc0, 0xee, 0x20, 0x0a, + 0xcc, 0xed, 0x00, 0x0a, 0x7f, 0x1c, 0x97, 0x42, 0xea, 0xd3, 0x76, 0x1c, + 0x8e, 0x42, 0x38, 0xbf, 0x00, 0x27, 0xf8, 0xd3, 0xbd, 0xe8, 0xf0, 0x83, + 0x2d, 0xe9, 0xf0, 0x4f, 0x04, 0x46, 0x88, 0x46, 0x0a, 0x98, 0x0b, 0x99, + 0x4f, 0xf0, 0x00, 0x0e, 0x1e, 0xe0, 0x02, 0xfb, 0x0e, 0xc9, 0x04, 0xeb, + 0x89, 0x09, 0x00, 0xfb, 0x05, 0xca, 0x99, 0xed, 0x00, 0x0a, 0x03, 0xeb, + 0x8a, 0x0b, 0x01, 0xeb, 0x87, 0x09, 0xdb, 0xed, 0x00, 0x0a, 0x99, 0xed, + 0x00, 0x1a, 0x01, 0xeb, 0x87, 0x0a, 0x00, 0xee, 0x60, 0x1a, 0x8a, 0xed, + 0x00, 0x1a, 0x0c, 0xf1, 0x01, 0x0c, 0x94, 0x45, 0xe5, 0xd3, 0x35, 0x46, + 0x45, 0x45, 0x04, 0xd3, 0x0e, 0xf1, 0x01, 0x0e, 0xc6, 0x45, 0x08, 0xd2, + 0x75, 0x46, 0x6e, 0x1c, 0x06, 0xfb, 0x05, 0xf7, 0x4f, 0xf0, 0x00, 0x0c, + 0x0e, 0xeb, 0x57, 0x07, 0xed, 0xe7, 0xbd, 0xe8, 0xf0, 0x8f, 0x70, 0xb5, + 0x00, 0x23, 0x10, 0xe0, 0x00, 0xf0, 0x2c, 0xf8, 0x00, 0xeb, 0x85, 0x06, + 0x02, 0xeb, 0x83, 0x03, 0x96, 0xed, 0x00, 0x0a, 0xd3, 0xed, 0x00, 0x0a, + 0x00, 0xeb, 0x85, 0x05, 0x70, 0xee, 0x20, 0x0a, 0xc5, 0xed, 0x00, 0x0a, + 0x23, 0x46, 0x8b, 0x42, 0xec, 0xd3, 0x70, 0xbd, 0x70, 0xb5, 0x00, 0x23, + 0x13, 0xe0, 0x00, 0xf0, 0x15, 0xf8, 0x02, 0xeb, 0x83, 0x03, 0x00, 0xeb, + 0x85, 0x06, 0x93, 0xed, 0x00, 0x0a, 0xd6, 0xed, 0x00, 0x0a, 0xb4, 0xee, + 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xbf, 0x00, 0xeb, 0x85, 0x03, + 0x83, 0xed, 0x00, 0x0a, 0x23, 0x46, 0x8b, 0x42, 0xe9, 0xd3, 0x70, 0xbd, + 0x5c, 0x1c, 0x04, 0xfb, 0x03, 0xf5, 0x03, 0xeb, 0x55, 0x05, 0x70, 0x47, + 0x93, 0x42, 0x02, 0xd2, 0x11, 0x46, 0x1a, 0x46, 0x0b, 0x46, 0x59, 0x1c, + 0x4b, 0x43, 0x02, 0xeb, 0x53, 0x02, 0x00, 0xeb, 0x82, 0x00, 0x90, 0xed, + 0x00, 0x0a, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x47, 0x05, 0x46, 0x8e, 0x46, + 0x09, 0x98, 0x0a, 0x99, 0x00, 0x24, 0x00, 0xe0, 0x64, 0x1c, 0x74, 0x45, + 0x23, 0xd2, 0x4f, 0xf0, 0x00, 0x0c, 0x1a, 0xe0, 0x02, 0xfb, 0x04, 0x78, + 0x05, 0xeb, 0x88, 0x08, 0x00, 0xfb, 0x07, 0xc9, 0x98, 0xed, 0x00, 0x0a, + 0x03, 0xeb, 0x89, 0x0a, 0x01, 0xeb, 0x86, 0x08, 0xda, 0xed, 0x00, 0x0a, + 0x98, 0xed, 0x00, 0x1a, 0x01, 0xeb, 0x86, 0x09, 0x00, 0xee, 0x20, 0x1a, + 0x89, 0xed, 0x00, 0x1a, 0x7f, 0x1c, 0x97, 0x42, 0xe6, 0xd3, 0x0c, 0xf1, + 0x01, 0x0c, 0x84, 0x45, 0xdc, 0xd2, 0x00, 0x27, 0x00, 0xfb, 0x04, 0xc6, + 0xf5, 0xe7, 0xbd, 0xe8, 0xf0, 0x87, 0x2d, 0xe9, 0xf0, 0x47, 0x05, 0x46, + 0x8e, 0x46, 0x09, 0x98, 0x0a, 0x99, 0x00, 0x24, 0x00, 0xe0, 0x64, 0x1c, + 0x74, 0x45, 0x23, 0xd2, 0x4f, 0xf0, 0x00, 0x0c, 0x1a, 0xe0, 0x02, 0xfb, + 0x04, 0x78, 0x05, 0xeb, 0x88, 0x08, 0x00, 0xfb, 0x07, 0xc9, 0x98, 0xed, + 0x00, 0x0a, 0x03, 0xeb, 0x89, 0x0a, 0x01, 0xeb, 0x86, 0x08, 0xda, 0xed, + 0x00, 0x0a, 0x98, 0xed, 0x00, 0x1a, 0x01, 0xeb, 0x86, 0x09, 0x00, 0xee, + 0x60, 0x1a, 0x89, 0xed, 0x00, 0x1a, 0x7f, 0x1c, 0x97, 0x42, 0xe6, 0xd3, + 0x0c, 0xf1, 0x01, 0x0c, 0x84, 0x45, 0xdc, 0xd2, 0x00, 0x27, 0x00, 0xfb, + 0x04, 0xc6, 0xf5, 0xe7, 0xbd, 0xe8, 0xf0, 0x87, 0x2d, 0xe9, 0xf0, 0x4f, + 0x00, 0xf0, 0x2c, 0xf8, 0x00, 0xe0, 0x52, 0x1c, 0x42, 0x45, 0x25, 0xd2, + 0x4f, 0xf0, 0x00, 0x0e, 0x1b, 0xe0, 0x06, 0xfb, 0x02, 0xc9, 0x05, 0xeb, + 0x89, 0x09, 0x00, 0xfb, 0x0e, 0xca, 0x99, 0xed, 0x00, 0x0a, 0x03, 0xeb, + 0x8a, 0x0b, 0x01, 0xeb, 0x87, 0x09, 0xdb, 0xed, 0x00, 0x0a, 0x99, 0xed, + 0x00, 0x1a, 0x01, 0xeb, 0x87, 0x0a, 0x00, 0xee, 0x20, 0x1a, 0x8a, 0xed, + 0x00, 0x1a, 0x0c, 0xf1, 0x01, 0x0c, 0xb4, 0x45, 0xe5, 0xd3, 0x0e, 0xf1, + 0x01, 0x0e, 0xa6, 0x45, 0xdb, 0xd2, 0x4f, 0xf0, 0x00, 0x0c, 0x04, 0xfb, + 0x02, 0xe7, 0xf4, 0xe7, 0xbd, 0xe8, 0xf0, 0x8f, 0x05, 0x46, 0x88, 0x46, + 0x16, 0x46, 0x09, 0x9c, 0x0a, 0x98, 0x0b, 0x99, 0x00, 0x22, 0x70, 0x47, + 0x2d, 0xe9, 0xfe, 0x43, 0x0b, 0x9e, 0x00, 0xf0, 0x1d, 0xf8, 0x02, 0x97, + 0x01, 0x96, 0x4b, 0x46, 0x0a, 0x9a, 0x00, 0x92, 0x29, 0x46, 0x42, 0x46, + 0x20, 0x46, 0xff, 0xf7, 0x57, 0xff, 0xbd, 0xe8, 0xf7, 0x83, 0x2d, 0xe9, + 0xfe, 0x43, 0x0a, 0x9e, 0x00, 0xf0, 0x0c, 0xf8, 0x02, 0x97, 0x4b, 0x46, + 0x0b, 0x9a, 0x01, 0x92, 0x00, 0x96, 0x42, 0x46, 0x29, 0x46, 0x20, 0x46, + 0xff, 0xf7, 0xa8, 0xff, 0xbd, 0xe8, 0xf7, 0x83, 0x0c, 0x9f, 0x0d, 0x46, + 0x04, 0x46, 0x06, 0xfb, 0x05, 0xf1, 0x90, 0x46, 0x99, 0x46, 0x89, 0x00, + 0x38, 0x46, 0xd7, 0xf7, 0xdd, 0xbe, 0xf8, 0xb5, 0x05, 0x46, 0x2d, 0xed, + 0x0a, 0x8b, 0x28, 0x68, 0x0c, 0x46, 0x00, 0xf0, 0x71, 0xfc, 0x41, 0xec, + 0x18, 0x0b, 0x68, 0x68, 0x00, 0xf0, 0x6c, 0xfc, 0x41, 0xec, 0x19, 0x0b, + 0xa8, 0x68, 0x00, 0xf0, 0x67, 0xfc, 0x41, 0xec, 0x1a, 0x0b, 0xe8, 0x68, + 0x00, 0xf0, 0x62, 0xfc, 0x41, 0xec, 0x1b, 0x0b, 0x53, 0xec, 0x18, 0x2b, + 0xf9, 0xf7, 0x0e, 0xfc, 0x06, 0x46, 0x0f, 0x46, 0x53, 0xec, 0x19, 0x2b, + 0x51, 0xec, 0x1a, 0x0b, 0xf9, 0xf7, 0x06, 0xfc, 0x02, 0x46, 0x0b, 0x46, + 0x30, 0x46, 0x39, 0x46, 0xf9, 0xf7, 0x8e, 0xfb, 0x41, 0xec, 0x1c, 0x0b, + 0x51, 0xec, 0x1b, 0x0b, 0x53, 0xec, 0x1c, 0x2b, 0xf9, 0xf7, 0x40, 0xfa, + 0x00, 0xf0, 0x68, 0xfc, 0x20, 0x60, 0x53, 0xec, 0x1c, 0x2b, 0x51, 0xec, + 0x19, 0x0b, 0xf9, 0xf7, 0x37, 0xfa, 0x81, 0xf0, 0x00, 0x41, 0x00, 0xf0, + 0x5d, 0xfc, 0x60, 0x60, 0x53, 0xec, 0x1c, 0x2b, 0x51, 0xec, 0x1a, 0x0b, + 0xf9, 0xf7, 0x2c, 0xfa, 0x81, 0xf0, 0x00, 0x41, 0x00, 0xf0, 0x52, 0xfc, + 0xa0, 0x60, 0x53, 0xec, 0x1c, 0x2b, 0x51, 0xec, 0x18, 0x0b, 0xf9, 0xf7, + 0x21, 0xfa, 0x00, 0xf0, 0x49, 0xfc, 0xe0, 0x60, 0xbd, 0xec, 0x0a, 0x8b, + 0xf1, 0xbd, 0x00, 0x2b, 0x00, 0xd1, 0x70, 0x47, 0x70, 0xb5, 0x04, 0x9c, + 0x00, 0x25, 0x63, 0x43, 0x4c, 0xb1, 0x06, 0xe0, 0x00, 0xf0, 0x08, 0xf8, + 0x70, 0xee, 0x20, 0x0a, 0xc4, 0xed, 0x00, 0x0a, 0x6d, 0x1c, 0x9d, 0x42, + 0xf6, 0xd1, 0x70, 0xbd, 0x00, 0xeb, 0x85, 0x04, 0x01, 0xeb, 0x85, 0x06, + 0x94, 0xed, 0x00, 0x0a, 0xd6, 0xed, 0x00, 0x0a, 0x02, 0xeb, 0x85, 0x04, + 0x70, 0x47, 0x00, 0x00, 0x2d, 0xe9, 0xfe, 0x4f, 0x2d, 0xed, 0x04, 0x8b, + 0x83, 0x46, 0x86, 0xb0, 0x00, 0x20, 0x00, 0x26, 0x00, 0x27, 0x13, 0xe0, + 0x55, 0x18, 0x4b, 0xf8, 0x25, 0x60, 0x03, 0xfb, 0x02, 0x05, 0x4b, 0xf8, + 0x25, 0x70, 0x52, 0x1c, 0x9a, 0x42, 0xf5, 0xdb, 0x0c, 0x99, 0xdf, 0xf8, + 0xfc, 0x33, 0x01, 0xeb, 0xc0, 0x02, 0x93, 0xec, 0x02, 0x1a, 0x82, 0xec, + 0x02, 0x1a, 0x40, 0x1c, 0x9d, 0xf8, 0x2c, 0x10, 0x00, 0x91, 0x88, 0x42, + 0x0e, 0xda, 0x41, 0x43, 0x43, 0x18, 0x0b, 0xeb, 0x83, 0x02, 0xd2, 0xed, + 0x00, 0x0a, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xe5, 0xd5, + 0x9d, 0xf8, 0x2c, 0x30, 0x00, 0x22, 0xdf, 0xe7, 0x00, 0x25, 0x1a, 0xe0, + 0x43, 0x18, 0x0b, 0xeb, 0x83, 0x03, 0x02, 0xfb, 0x00, 0x57, 0xd3, 0xed, + 0x00, 0x0a, 0x0b, 0xeb, 0x87, 0x03, 0x40, 0x1c, 0x93, 0xed, 0x00, 0x1a, + 0x21, 0xee, 0x01, 0x1a, 0x00, 0xee, 0xa0, 0x1a, 0x30, 0xee, 0x41, 0x0a, + 0xa8, 0x42, 0xeb, 0xdb, 0xc6, 0xf7, 0x0a, 0xfc, 0x0b, 0xeb, 0x86, 0x00, + 0x6d, 0x1c, 0x80, 0xed, 0x00, 0x0a, 0x9d, 0xf8, 0x2c, 0x00, 0x00, 0x90, + 0x85, 0x42, 0x80, 0xf2, 0x85, 0x80, 0x68, 0x43, 0x00, 0x26, 0x05, 0x90, + 0x4f, 0xe0, 0x00, 0x9c, 0xdd, 0xf8, 0x14, 0xa0, 0xdd, 0xf8, 0x04, 0x80, + 0x7c, 0x43, 0x05, 0xeb, 0x04, 0x09, 0x34, 0x19, 0xba, 0x44, 0x0b, 0xeb, + 0x8a, 0x00, 0x0b, 0xeb, 0x84, 0x01, 0xb8, 0x44, 0x90, 0xed, 0x00, 0x0a, + 0xd1, 0xed, 0x00, 0x0a, 0x0b, 0xeb, 0x89, 0x00, 0x00, 0xf0, 0x83, 0xf9, + 0x01, 0xee, 0x60, 0x0a, 0xff, 0xf7, 0x58, 0xfb, 0x00, 0xf0, 0x94, 0xf9, + 0x0b, 0xeb, 0x89, 0x00, 0x0b, 0xeb, 0x84, 0x01, 0x00, 0xf0, 0x42, 0xf9, + 0x90, 0xed, 0x00, 0x0a, 0xd1, 0xed, 0x00, 0x0a, 0x0b, 0xeb, 0x8a, 0x00, + 0x00, 0xf0, 0x6f, 0xf9, 0x01, 0xee, 0x20, 0x0a, 0xff, 0xf7, 0x44, 0xfb, + 0x00, 0xf0, 0x59, 0xf9, 0x00, 0xf0, 0x5d, 0xf9, 0x00, 0xf0, 0x46, 0xf9, + 0x7f, 0x1c, 0xb7, 0x42, 0xc7, 0xdb, 0x04, 0x98, 0x0b, 0xeb, 0x80, 0x01, + 0x03, 0x98, 0xd1, 0xed, 0x00, 0x0a, 0xb7, 0xee, 0x00, 0x0a, 0x80, 0xee, + 0x20, 0x0a, 0x0b, 0xeb, 0x80, 0x01, 0x60, 0xee, 0x09, 0x0a, 0xc1, 0xed, + 0x00, 0x0a, 0x20, 0xee, 0x29, 0x0a, 0x02, 0x9a, 0x0b, 0xeb, 0x82, 0x00, + 0x80, 0xed, 0x00, 0x0a, 0x76, 0x1c, 0xae, 0x42, 0x23, 0xda, 0x00, 0x99, + 0x71, 0x43, 0x01, 0x91, 0x72, 0x18, 0x0b, 0xeb, 0x82, 0x01, 0x04, 0x92, + 0x00, 0xf0, 0x19, 0xf9, 0xf2, 0xdd, 0x05, 0x98, 0x30, 0x18, 0x02, 0x90, + 0x00, 0x27, 0x0b, 0xeb, 0x80, 0x00, 0x00, 0xf0, 0x49, 0xf9, 0x00, 0xf0, + 0x4b, 0xf9, 0x01, 0x98, 0x28, 0x18, 0x03, 0x90, 0xb0, 0xee, 0x40, 0x8a, + 0x0b, 0xeb, 0x80, 0x00, 0xf0, 0xee, 0x60, 0x8a, 0x00, 0xf0, 0x3c, 0xf9, + 0x00, 0xf0, 0x17, 0xf9, 0x00, 0xf0, 0x06, 0xf9, 0xbf, 0xe7, 0x9d, 0xf8, + 0x2c, 0x20, 0x02, 0xfb, 0x05, 0xf1, 0x6e, 0x18, 0x0b, 0xeb, 0x86, 0x00, + 0x90, 0xed, 0x00, 0x0a, 0x00, 0x20, 0x6b, 0xe7, 0x00, 0x26, 0xdf, 0xf8, + 0x70, 0x92, 0x4c, 0xe0, 0x0c, 0x99, 0x01, 0xeb, 0xc6, 0x02, 0x90, 0xec, + 0x02, 0x0a, 0x82, 0xec, 0x02, 0x0a, 0x43, 0xe0, 0x07, 0xeb, 0xc4, 0x00, + 0xdd, 0xf8, 0x00, 0xa0, 0x01, 0x9e, 0x90, 0xec, 0x02, 0x1a, 0x0a, 0xfb, + 0x04, 0x5a, 0x07, 0xeb, 0xc4, 0x01, 0xa6, 0x19, 0x0b, 0xeb, 0x8a, 0x00, + 0x91, 0xec, 0x02, 0x0a, 0x0b, 0xeb, 0x86, 0x01, 0x90, 0xed, 0x00, 0x2a, + 0xd1, 0xed, 0x00, 0x2a, 0x22, 0xee, 0x20, 0x0a, 0x02, 0xee, 0xc1, 0x0a, + 0xff, 0xf7, 0xca, 0xfa, 0x00, 0xf0, 0xbf, 0xf8, 0x07, 0xeb, 0xc4, 0x00, + 0x00, 0xf0, 0xb6, 0xf8, 0x07, 0xeb, 0xc4, 0x01, 0x90, 0xec, 0x02, 0x0a, + 0x91, 0xec, 0x02, 0x1a, 0x0b, 0xeb, 0x8a, 0x00, 0x0b, 0xeb, 0x86, 0x01, + 0x00, 0xf0, 0xe8, 0xf8, 0x00, 0xf0, 0xcd, 0xf8, 0x00, 0xf0, 0xd1, 0xf8, + 0x00, 0xf0, 0xba, 0xf8, 0x64, 0x1e, 0x00, 0x2c, 0xc8, 0xd5, 0x0b, 0xeb, + 0x88, 0x00, 0x0c, 0x97, 0x2e, 0x46, 0x00, 0xf0, 0xe3, 0xf8, 0x00, 0xf0, + 0xb4, 0xf8, 0x0c, 0x98, 0x00, 0xeb, 0xc6, 0x01, 0x81, 0xec, 0x02, 0x0a, + 0x76, 0x1c, 0x9d, 0xf8, 0x2c, 0x50, 0xae, 0x42, 0x70, 0xda, 0x75, 0x43, + 0x06, 0xeb, 0x05, 0x08, 0x0b, 0xeb, 0x88, 0x01, 0x01, 0x95, 0x48, 0x46, + 0x00, 0xf0, 0x95, 0xf8, 0xa4, 0xdd, 0x0a, 0x98, 0x00, 0xeb, 0xc6, 0x01, + 0x74, 0x1e, 0x91, 0xed, 0x01, 0x0a, 0xff, 0xf7, 0x8b, 0xfa, 0x00, 0xf0, + 0x80, 0xf8, 0x0a, 0x98, 0x00, 0xeb, 0xc6, 0x01, 0x00, 0xf0, 0x76, 0xf8, + 0x91, 0xed, 0x00, 0x0a, 0xff, 0xf7, 0x80, 0xfa, 0x00, 0xf0, 0x95, 0xf8, + 0x9d, 0xf8, 0x2c, 0x00, 0x0c, 0x9f, 0x00, 0x90, 0x00, 0xf0, 0x80, 0xf8, + 0x35, 0x46, 0xc4, 0xe7, 0x0c, 0x99, 0x01, 0xeb, 0xc5, 0x02, 0x90, 0xec, + 0x02, 0x0a, 0x82, 0xec, 0x02, 0x0a, 0x41, 0xe0, 0x06, 0xeb, 0xc4, 0x00, + 0x06, 0xeb, 0xc4, 0x01, 0xdd, 0xf8, 0x00, 0x90, 0x90, 0xec, 0x02, 0x0a, + 0x08, 0xfb, 0x04, 0x5a, 0x91, 0xec, 0x02, 0x1a, 0xa1, 0x44, 0x0b, 0xeb, + 0x8a, 0x00, 0x0b, 0xeb, 0x89, 0x01, 0x00, 0xf0, 0x8b, 0xf8, 0x00, 0xf0, + 0x97, 0xf8, 0x06, 0xeb, 0xc4, 0x00, 0x00, 0xf0, 0x47, 0xf8, 0x06, 0xeb, + 0xc4, 0x01, 0x90, 0xec, 0x02, 0x0a, 0x91, 0xec, 0x02, 0x1a, 0x0b, 0xeb, + 0x89, 0x00, 0x0b, 0xeb, 0x8a, 0x01, 0x90, 0xed, 0x00, 0x2a, 0xd1, 0xed, + 0x00, 0x0a, 0x22, 0xee, 0x00, 0x0a, 0x00, 0xee, 0xe1, 0x0a, 0xff, 0xf7, + 0x41, 0xfa, 0x00, 0xf0, 0x56, 0xf8, 0x00, 0xf0, 0x5a, 0xf8, 0x00, 0xf0, + 0x43, 0xf8, 0x64, 0x1c, 0x44, 0x45, 0xc9, 0xdb, 0x0b, 0xeb, 0x87, 0x00, + 0x0c, 0x96, 0x00, 0xf0, 0x6d, 0xf8, 0x00, 0xf0, 0x3e, 0xf8, 0x0c, 0x98, + 0x00, 0xeb, 0xc5, 0x01, 0x81, 0xec, 0x02, 0x0a, 0x6d, 0x1e, 0x16, 0xd4, + 0x9d, 0xf8, 0x2c, 0x70, 0x37, 0x48, 0x07, 0xfb, 0x05, 0x57, 0x0b, 0xeb, + 0x87, 0x01, 0x00, 0xf0, 0x22, 0xf8, 0xa9, 0xdd, 0x0c, 0x98, 0x9d, 0xf8, + 0x2c, 0x80, 0x0c, 0x9e, 0x00, 0xeb, 0xc5, 0x01, 0x08, 0xfb, 0x05, 0xf0, + 0x91, 0xec, 0x02, 0x9a, 0x6c, 0x1c, 0x00, 0x90, 0xd8, 0xe7, 0x06, 0xb0, + 0xbd, 0xec, 0x04, 0x8b, 0xbd, 0xe8, 0xf7, 0x8f, 0xb0, 0xee, 0x40, 0x8a, + 0xf0, 0xee, 0x60, 0x8a, 0x70, 0x47, 0x09, 0xf1, 0x08, 0x00, 0xb0, 0xee, + 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x90, 0xec, 0x02, 0x0a, 0xff, 0xf7, + 0xd2, 0xb9, 0x91, 0xed, 0x00, 0x0a, 0xb5, 0xee, 0x40, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x70, 0x47, 0xb0, 0xee, 0x40, 0x9a, 0xf0, 0xee, 0x60, 0x9a, + 0x70, 0x47, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0xb0, 0xee, + 0x49, 0x0a, 0xf0, 0xee, 0x69, 0x0a, 0xff, 0xf7, 0xcf, 0xb9, 0xb0, 0xee, + 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, 0xff, 0xf7, 0x90, 0xb9, 0xb0, 0xee, + 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0xb0, 0xee, 0x49, 0x0a, 0xf0, 0xee, + 0x69, 0x0a, 0xff, 0xf7, 0x99, 0xb9, 0x0b, 0xeb, 0x88, 0x01, 0x20, 0xee, + 0x20, 0x0a, 0x90, 0xed, 0x00, 0x1a, 0xd1, 0xed, 0x00, 0x0a, 0x70, 0x47, + 0x90, 0xed, 0x00, 0x2a, 0xd1, 0xed, 0x00, 0x0a, 0x22, 0xee, 0x00, 0x0a, + 0x00, 0xee, 0xa1, 0x0a, 0xff, 0xf7, 0xc6, 0xb9, 0x90, 0xed, 0x00, 0x0a, + 0xff, 0xf7, 0xc2, 0xb9, 0x05, 0x48, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, + 0x60, 0x1a, 0x90, 0xec, 0x02, 0x0a, 0xff, 0xf7, 0x8c, 0xb9, 0x00, 0x00, + 0x60, 0x40, 0x00, 0x20, 0x68, 0x40, 0x00, 0x20, 0x00, 0xf0, 0x40, 0xba, + 0x08, 0xb4, 0x01, 0xee, 0x10, 0x1a, 0x69, 0x46, 0x01, 0xee, 0x90, 0x2a, + 0x91, 0xec, 0x02, 0x0a, 0x31, 0xee, 0x00, 0x3a, 0x31, 0xee, 0xa0, 0x0a, + 0x0b, 0xe0, 0x08, 0xb4, 0x01, 0xee, 0x10, 0x1a, 0x69, 0x46, 0x01, 0xee, + 0x90, 0x2a, 0x91, 0xec, 0x02, 0x0a, 0x31, 0xee, 0x40, 0x3a, 0x31, 0xee, + 0xe0, 0x0a, 0xb0, 0xee, 0x43, 0x2a, 0xf0, 0xee, 0x40, 0x2a, 0x80, 0xec, + 0x02, 0x2a, 0x01, 0xb0, 0x70, 0x47, 0x08, 0xb4, 0x01, 0xee, 0x10, 0x1a, + 0x69, 0x46, 0x01, 0xee, 0x90, 0x2a, 0x91, 0xec, 0x02, 0x0a, 0x21, 0xee, + 0x00, 0x3a, 0x21, 0xee, 0x20, 0x1a, 0x01, 0xee, 0xe0, 0x3a, 0x01, 0xee, + 0x80, 0x1a, 0xb0, 0xee, 0x43, 0x2a, 0xf0, 0xee, 0x41, 0x2a, 0xe6, 0xe7, + 0x08, 0xb4, 0x01, 0xee, 0x10, 0x1a, 0x69, 0x46, 0x01, 0xee, 0x90, 0x2a, + 0x91, 0xec, 0x02, 0x0a, 0x20, 0xee, 0x00, 0x3a, 0x61, 0xee, 0x00, 0x3a, + 0x21, 0xee, 0x80, 0x0a, 0x00, 0xee, 0xa0, 0x3a, 0x41, 0xee, 0xa0, 0x3a, + 0x01, 0xee, 0x60, 0x0a, 0xc3, 0xee, 0x83, 0x3a, 0x80, 0xee, 0x03, 0x0a, + 0xb0, 0xee, 0x63, 0x2a, 0xc9, 0xe7, 0x00, 0x00, 0x00, 0xee, 0x10, 0x1a, + 0x9f, 0xed, 0x07, 0x1a, 0xf0, 0xee, 0x40, 0x1a, 0x06, 0xe0, 0x00, 0x00, + 0x00, 0xee, 0x10, 0x1a, 0xb0, 0xee, 0x40, 0x1a, 0xdf, 0xed, 0x02, 0x1a, + 0x80, 0xec, 0x02, 0x1a, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x82, 0xb0, 0x8d, 0xed, 0x00, 0x0a, 0xcd, 0xed, 0x01, 0x0a, 0x02, 0xb0, + 0x70, 0x47, 0x00, 0x00, 0xf8, 0xb5, 0x0d, 0x46, 0x16, 0x46, 0x04, 0x46, + 0x1f, 0x46, 0x31, 0x46, 0x00, 0xf0, 0x8b, 0xf8, 0x01, 0x20, 0x00, 0x90, + 0x33, 0x46, 0x3a, 0x46, 0x29, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x01, 0xf8, + 0xf1, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, 0x82, 0xb0, + 0x80, 0x46, 0x0e, 0x9c, 0x0e, 0x46, 0x92, 0x46, 0x99, 0x46, 0x00, 0x27, + 0x1f, 0xe0, 0x00, 0x20, 0x1a, 0xe0, 0x13, 0x18, 0x08, 0xeb, 0x83, 0x03, + 0x93, 0xed, 0x00, 0x0a, 0x04, 0xfb, 0x02, 0xf3, 0x0a, 0xeb, 0x83, 0x03, + 0x00, 0xf0, 0xdb, 0xf8, 0xba, 0x42, 0xf2, 0xd3, 0x58, 0xf8, 0x21, 0x00, + 0x00, 0xf0, 0x4a, 0xf9, 0x00, 0xf0, 0xd9, 0xf8, 0x00, 0xf0, 0x59, 0xf8, + 0xdd, 0xe9, 0x00, 0x23, 0xf9, 0xf7, 0xf4, 0xf8, 0x00, 0xf0, 0x64, 0xf9, + 0x4a, 0xf8, 0x25, 0x00, 0x7f, 0x1c, 0x4f, 0x45, 0x0c, 0xd2, 0x00, 0xf0, + 0xb7, 0xf8, 0x04, 0xfb, 0x07, 0xf5, 0x00, 0xf0, 0xb9, 0xf8, 0xd6, 0xdd, + 0x06, 0xeb, 0x85, 0x02, 0x92, 0xed, 0x00, 0x8a, 0x00, 0x22, 0xdd, 0xe7, + 0xa9, 0xf1, 0x01, 0x0b, 0x00, 0x25, 0x5e, 0x46, 0x2c, 0xe0, 0x00, 0x20, + 0x27, 0xe0, 0x09, 0xfb, 0x00, 0x61, 0x04, 0xfb, 0x00, 0xf2, 0x08, 0xeb, + 0x81, 0x01, 0x0a, 0xeb, 0x82, 0x03, 0x91, 0xed, 0x00, 0x0a, 0x00, 0xf0, + 0xa7, 0xf8, 0x40, 0x1e, 0x86, 0x42, 0xf0, 0xd3, 0x09, 0xfb, 0x06, 0x60, + 0x08, 0xeb, 0x80, 0x00, 0x90, 0xed, 0x00, 0x0a, 0xb5, 0xee, 0x40, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0xe3, 0xdd, 0x10, 0xee, 0x10, 0x0a, 0x00, 0xf0, + 0x09, 0xf9, 0x00, 0xf0, 0x98, 0xf8, 0x00, 0xf0, 0x18, 0xf8, 0xdd, 0xe9, + 0x00, 0x23, 0xf9, 0xf7, 0xb3, 0xf8, 0x00, 0xf0, 0x23, 0xf9, 0x4a, 0xf8, + 0x27, 0x00, 0x76, 0x1e, 0x00, 0x2e, 0x0a, 0xd4, 0x6d, 0x1c, 0xa9, 0x45, + 0x07, 0xd3, 0x04, 0xfb, 0x06, 0xf7, 0x0a, 0xeb, 0x87, 0x00, 0x90, 0xed, + 0x00, 0x8a, 0x58, 0x46, 0xd4, 0xe7, 0x02, 0xb0, 0x66, 0xe0, 0xcd, 0xe9, + 0x00, 0x01, 0x18, 0xee, 0x10, 0x0a, 0x00, 0xf0, 0xe7, 0xb8, 0x2d, 0xe9, + 0xf8, 0x4f, 0x80, 0x46, 0x2d, 0xed, 0x02, 0x8b, 0x89, 0x46, 0x00, 0x20, + 0x00, 0x24, 0x07, 0xe0, 0x09, 0xfb, 0x00, 0x13, 0x48, 0xf8, 0x23, 0x40, + 0x49, 0x1c, 0x49, 0x45, 0xf8, 0xd3, 0x10, 0x46, 0x48, 0x45, 0x13, 0xd2, + 0x42, 0x1c, 0x11, 0x46, 0xf7, 0xe7, 0x81, 0x19, 0x08, 0xeb, 0x81, 0x01, + 0x40, 0x1c, 0xd1, 0xed, 0x00, 0x0a, 0x00, 0xee, 0xe0, 0x0a, 0xa0, 0x42, + 0xf5, 0xd3, 0xc6, 0xf7, 0x17, 0xf9, 0x08, 0xeb, 0x85, 0x00, 0x64, 0x1c, + 0x80, 0xed, 0x00, 0x0a, 0x4c, 0x45, 0x37, 0xd2, 0x00, 0x27, 0x09, 0xfb, + 0x04, 0xf6, 0x1e, 0xe0, 0x93, 0x19, 0x08, 0xeb, 0x83, 0x03, 0x93, 0xed, + 0x00, 0x0a, 0x13, 0x18, 0x08, 0xeb, 0x83, 0x03, 0x00, 0xf0, 0x3b, 0xf8, + 0xba, 0x42, 0xf3, 0xd3, 0x58, 0xf8, 0x21, 0x00, 0x00, 0xf0, 0xaa, 0xf8, + 0x00, 0xf0, 0x39, 0xf8, 0x82, 0x46, 0x8b, 0x46, 0xff, 0xf7, 0xb9, 0xff, + 0x52, 0x46, 0x5b, 0x46, 0xf9, 0xf7, 0x52, 0xf8, 0x00, 0xf0, 0xc2, 0xf8, + 0x48, 0xf8, 0x25, 0x00, 0x7f, 0x1c, 0xa7, 0x42, 0x0b, 0xd2, 0x00, 0xf0, + 0x15, 0xf8, 0x00, 0xf0, 0x19, 0xf8, 0xf7, 0xdd, 0xbd, 0x19, 0x08, 0xeb, + 0x85, 0x02, 0x92, 0xed, 0x00, 0x8a, 0x00, 0x22, 0xdc, 0xe7, 0xa5, 0x19, + 0x08, 0xeb, 0x85, 0x00, 0x90, 0xed, 0x00, 0x0a, 0x00, 0x20, 0xbc, 0xe7, + 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf1, 0x8f, 0x09, 0xfb, 0x07, 0xf0, + 0x39, 0x18, 0x08, 0xeb, 0x81, 0x02, 0x70, 0x47, 0x92, 0xed, 0x00, 0x0a, + 0xb5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x70, 0x47, 0x52, 0x1c, + 0xd3, 0xed, 0x00, 0x0a, 0x00, 0xee, 0x60, 0x8a, 0x70, 0x47, 0x02, 0x46, + 0x0b, 0x46, 0x00, 0x20, 0x01, 0x49, 0xf8, 0xf7, 0x63, 0xbe, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x3f, 0x2d, 0xe9, 0xf8, 0x43, 0x00, 0xf0, 0x25, 0xf8, + 0x09, 0xe0, 0x00, 0x96, 0x4b, 0x46, 0x08, 0xeb, 0x87, 0x02, 0x05, 0xeb, + 0x87, 0x01, 0x20, 0x46, 0xff, 0xf7, 0xef, 0xfe, 0x7f, 0x1c, 0xb7, 0x42, + 0xf3, 0xd3, 0xbd, 0xe8, 0xf1, 0x83, 0x2d, 0xe9, 0xf8, 0x43, 0x00, 0xf0, + 0x12, 0xf8, 0x0c, 0xe0, 0x01, 0x23, 0x09, 0xfb, 0x07, 0xf0, 0x00, 0x93, + 0x08, 0xeb, 0x80, 0x02, 0x04, 0xeb, 0x80, 0x01, 0x4b, 0x46, 0x28, 0x46, + 0xff, 0xf7, 0xd9, 0xfe, 0x7f, 0x1c, 0xb7, 0x42, 0xf0, 0xd3, 0xbd, 0xe8, + 0xf1, 0x83, 0x08, 0x9e, 0x04, 0x46, 0x0d, 0x46, 0x90, 0x46, 0x99, 0x46, + 0x00, 0x27, 0x70, 0x47, 0x52, 0xec, 0x10, 0x1a, 0xb0, 0xee, 0xc0, 0x0a, + 0xc8, 0x0f, 0x49, 0x00, 0x52, 0x00, 0xf0, 0xee, 0xe0, 0x0a, 0x28, 0xbf, + 0x0c, 0x30, 0x11, 0xf1, 0x80, 0x7f, 0x38, 0xbf, 0x12, 0xf1, 0x80, 0x7f, + 0x0c, 0xd2, 0x8a, 0x42, 0x38, 0xbf, 0x80, 0xf0, 0x04, 0x00, 0x12, 0x42, + 0x14, 0xd0, 0x34, 0xbf, 0x80, 0xee, 0x80, 0x0a, 0x80, 0xee, 0x20, 0x0a, + 0x00, 0xf0, 0x9e, 0xb8, 0x11, 0xf1, 0x80, 0x7f, 0x08, 0xbf, 0x80, 0xf0, + 0x04, 0x00, 0x98, 0xbf, 0x12, 0xf1, 0x80, 0x7f, 0x08, 0xd8, 0x8a, 0x42, + 0x14, 0xbf, 0x00, 0x22, 0x4f, 0xf0, 0x7e, 0x52, 0x00, 0xee, 0x10, 0x2a, + 0x00, 0xf0, 0x8c, 0xb8, 0x6f, 0xf0, 0x00, 0x41, 0x00, 0xee, 0x10, 0x1a, + 0x70, 0x47, 0x00, 0x00, 0xc0, 0xf3, 0xc7, 0x51, 0x81, 0xb1, 0xff, 0x29, + 0x06, 0xd0, 0xc1, 0x10, 0x40, 0x07, 0x21, 0xf0, 0xe0, 0x41, 0x01, 0xf1, + 0x60, 0x51, 0x70, 0x47, 0x41, 0x02, 0x0c, 0xbf, 0x40, 0xf4, 0xe0, 0x01, + 0x6f, 0xf0, 0x00, 0x41, 0x00, 0x20, 0x70, 0x47, 0x00, 0xf0, 0x00, 0x41, + 0x00, 0x02, 0x0a, 0xd0, 0xb0, 0xfa, 0x80, 0xfc, 0x00, 0xfa, 0x0c, 0xf0, + 0x01, 0xf1, 0x60, 0x51, 0xa1, 0xeb, 0x0c, 0x51, 0x01, 0xeb, 0xd0, 0x21, + 0x40, 0x05, 0x70, 0x47, 0x01, 0xf0, 0x00, 0x42, 0x8b, 0x1a, 0xa3, 0xf1, + 0x60, 0x51, 0xb1, 0xf5, 0x80, 0x1f, 0x0a, 0xdb, 0xb1, 0xf1, 0x7f, 0x6f, + 0x1f, 0xd2, 0x42, 0xea, 0xc1, 0x02, 0xc1, 0x00, 0x71, 0xf1, 0x00, 0x41, + 0x42, 0xeb, 0x50, 0x70, 0x70, 0x47, 0x0b, 0x15, 0xc3, 0xf1, 0x09, 0x03, + 0x21, 0x2b, 0x10, 0xd2, 0x89, 0x02, 0x41, 0xea, 0x90, 0x51, 0x80, 0x02, + 0x01, 0x28, 0x49, 0x41, 0x41, 0xf0, 0x00, 0x41, 0x21, 0xfa, 0x03, 0xf0, + 0xc3, 0xf1, 0x20, 0x03, 0x99, 0x40, 0x71, 0xf1, 0x00, 0x41, 0x50, 0x41, + 0x70, 0x47, 0x10, 0x00, 0x70, 0x47, 0x6f, 0xf0, 0x00, 0x00, 0x13, 0xeb, + 0x10, 0x3f, 0x5c, 0xbf, 0x00, 0x0e, 0x42, 0xea, 0xc0, 0x50, 0x70, 0x47, + 0x1c, 0xb5, 0x68, 0x46, 0x00, 0xf0, 0x7c, 0xf8, 0x00, 0x98, 0x30, 0xb3, + 0x10, 0xee, 0x10, 0x0a, 0x40, 0x00, 0x00, 0x16, 0x40, 0x1c, 0x20, 0xd0, + 0x10, 0xee, 0x10, 0x3a, 0x00, 0x98, 0x23, 0xf0, 0x00, 0x42, 0xd1, 0x0d, + 0x00, 0xeb, 0x01, 0x04, 0x14, 0xd0, 0x00, 0x2c, 0x12, 0xdd, 0xff, 0x2c, + 0x09, 0xdb, 0x10, 0xee, 0x10, 0x1a, 0x4f, 0xf0, 0xff, 0x40, 0x01, 0xf0, + 0x00, 0x41, 0x08, 0x43, 0x00, 0xee, 0x10, 0x0a, 0x13, 0xbd, 0x23, 0xf0, + 0xff, 0x43, 0x43, 0xea, 0xc4, 0x53, 0x00, 0xee, 0x10, 0x3a, 0x13, 0xbd, + 0x0a, 0xb1, 0xf5, 0xf7, 0x7d, 0xfd, 0x13, 0xbd, 0x1a, 0xa2, 0x10, 0xee, + 0x10, 0x1a, 0x43, 0xf2, 0xa4, 0x0c, 0xc3, 0xf6, 0x89, 0x6c, 0xf2, 0xec, + 0x06, 0x0a, 0x61, 0x45, 0x09, 0xdb, 0x00, 0xee, 0x80, 0x3a, 0x70, 0xee, + 0x80, 0x0a, 0x83, 0xee, 0x20, 0x0a, 0x40, 0xf0, 0x02, 0x00, 0x10, 0xee, + 0x10, 0x1a, 0x49, 0x00, 0xd1, 0xf1, 0xe6, 0x41, 0x0b, 0xd8, 0x60, 0xee, + 0x00, 0x0a, 0x20, 0xee, 0x20, 0x3a, 0x03, 0xee, 0x01, 0x0a, 0x01, 0xee, + 0xa0, 0x2a, 0x42, 0xee, 0x20, 0x2a, 0x80, 0xee, 0x22, 0x0a, 0x40, 0x08, + 0x10, 0xf0, 0x02, 0x0f, 0x18, 0xbf, 0xb1, 0xee, 0x40, 0x0a, 0x02, 0xeb, + 0x80, 0x02, 0xd2, 0xed, 0x00, 0x0a, 0x30, 0xee, 0x20, 0x0a, 0x28, 0xbf, + 0xb1, 0xee, 0x40, 0x0a, 0x70, 0x47, 0x00, 0x00, 0xd7, 0xb3, 0xdd, 0x3f, + 0x6a, 0xd5, 0x03, 0x3f, 0x2b, 0x94, 0xa9, 0x3d, 0xb8, 0x2a, 0x59, 0x3f, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x92, 0x0a, 0x06, 0x3f, 0xdb, 0x0f, 0xc9, 0x3f, 0x92, 0x0a, 0x86, 0x3f, + 0xdb, 0x0f, 0xc9, 0x3f, 0x92, 0x0a, 0x06, 0x40, 0xdb, 0x0f, 0x49, 0x40, + 0x36, 0x8d, 0x27, 0x40, 0x38, 0xb5, 0x2d, 0xed, 0x04, 0x8b, 0x04, 0x46, + 0x84, 0xb0, 0x00, 0x21, 0x21, 0x60, 0xf0, 0xee, 0x40, 0x8a, 0x18, 0xee, + 0x90, 0x1a, 0x48, 0x00, 0x00, 0x16, 0x40, 0x1c, 0xb0, 0xee, 0x60, 0x8a, + 0x01, 0xd1, 0x49, 0x02, 0x10, 0xd0, 0x18, 0xee, 0x10, 0x1a, 0x48, 0x00, + 0x00, 0x16, 0x40, 0x1c, 0x01, 0xd1, 0x49, 0x02, 0x08, 0xd0, 0x18, 0xee, + 0x90, 0x1a, 0x49, 0x00, 0x08, 0x16, 0x40, 0x1c, 0x06, 0xd1, 0x09, 0x02, + 0x04, 0xd0, 0x19, 0xe1, 0x04, 0xb0, 0x9f, 0xed, 0x8e, 0x0a, 0x16, 0xe1, + 0x18, 0xee, 0x10, 0x1a, 0x49, 0x00, 0x08, 0x16, 0x40, 0x1c, 0x05, 0xd1, + 0x09, 0x02, 0x18, 0xbf, 0xb0, 0xee, 0x48, 0x0a, 0x40, 0xf0, 0x0a, 0x81, + 0x18, 0xee, 0x90, 0x1a, 0x21, 0xf0, 0x00, 0x40, 0xb0, 0xf5, 0x00, 0x0f, + 0x08, 0xd2, 0x00, 0x21, 0x00, 0x91, 0x70, 0xb1, 0x68, 0x46, 0xc6, 0xf7, + 0x47, 0xf8, 0xf0, 0xee, 0x40, 0x8a, 0x08, 0xe0, 0xc0, 0x0d, 0x21, 0xf0, + 0xff, 0x41, 0x7e, 0x38, 0x41, 0xf0, 0x7c, 0x51, 0x00, 0x90, 0x08, 0xee, + 0x90, 0x1a, 0x18, 0xee, 0x10, 0x1a, 0x21, 0xf0, 0x00, 0x40, 0xb0, 0xf5, + 0x00, 0x0f, 0x0a, 0xd2, 0x00, 0x21, 0x01, 0x91, 0x80, 0xb1, 0x01, 0xa8, + 0xb0, 0xee, 0x48, 0x0a, 0xc6, 0xf7, 0x2c, 0xf8, 0xb0, 0xee, 0x40, 0x8a, + 0x08, 0xe0, 0xc0, 0x0d, 0x21, 0xf0, 0xff, 0x41, 0x7e, 0x38, 0x41, 0xf0, + 0x7c, 0x51, 0x01, 0x90, 0x08, 0xee, 0x10, 0x1a, 0x18, 0xee, 0x90, 0x0a, + 0x20, 0xf0, 0x00, 0x40, 0x08, 0xee, 0x90, 0x0a, 0x18, 0xee, 0x10, 0x0a, + 0x20, 0xf0, 0x00, 0x40, 0x08, 0xee, 0x10, 0x0a, 0x40, 0x00, 0x18, 0xee, + 0x90, 0x0a, 0x05, 0xd1, 0x41, 0x00, 0x1b, 0xd1, 0x04, 0xb0, 0x9f, 0xed, + 0x64, 0x0a, 0xc0, 0xe0, 0x40, 0x00, 0x09, 0xd0, 0x00, 0x99, 0x01, 0x98, + 0x81, 0x42, 0x05, 0xdb, 0x10, 0xd1, 0xf4, 0xee, 0x48, 0x8a, 0xf1, 0xee, + 0x10, 0xfa, 0x0b, 0xd5, 0x00, 0x99, 0x01, 0x9a, 0x02, 0x91, 0xb0, 0xee, + 0x68, 0x0a, 0x02, 0x99, 0x00, 0x92, 0xf0, 0xee, 0x48, 0x8a, 0x01, 0x91, + 0xb0, 0xee, 0x40, 0x8a, 0x00, 0x99, 0x00, 0x98, 0x49, 0x10, 0x00, 0xeb, + 0x91, 0x70, 0x80, 0x10, 0x40, 0x00, 0x08, 0xbf, 0x02, 0x20, 0x20, 0x60, + 0x04, 0x46, 0x00, 0x9a, 0x18, 0xee, 0x90, 0x3a, 0x12, 0x1b, 0x23, 0xf0, + 0x00, 0x41, 0xc8, 0x0d, 0x02, 0xeb, 0x00, 0x05, 0x14, 0xd0, 0x00, 0x2d, + 0x12, 0xdd, 0xff, 0x2d, 0x09, 0xdb, 0x18, 0xee, 0x90, 0x1a, 0x4f, 0xf0, + 0xff, 0x40, 0x01, 0xf0, 0x00, 0x41, 0x08, 0x43, 0x08, 0xee, 0x90, 0x0a, + 0x0e, 0xe0, 0x23, 0xf0, 0xff, 0x43, 0x43, 0xea, 0xc5, 0x53, 0x08, 0xee, + 0x90, 0x3a, 0x07, 0xe0, 0x31, 0xb1, 0x10, 0x46, 0xb0, 0xee, 0x68, 0x0a, + 0xf5, 0xf7, 0x64, 0xfc, 0xf0, 0xee, 0x40, 0x8a, 0x01, 0x98, 0x18, 0xee, + 0x10, 0x2a, 0x04, 0x1b, 0x22, 0xf0, 0x00, 0x41, 0xc8, 0x0d, 0x04, 0xeb, + 0x00, 0x03, 0x14, 0xd0, 0x00, 0x2b, 0x12, 0xdd, 0xff, 0x2b, 0x09, 0xdb, + 0x18, 0xee, 0x10, 0x1a, 0x4f, 0xf0, 0xff, 0x40, 0x01, 0xf0, 0x00, 0x41, + 0x08, 0x43, 0x08, 0xee, 0x10, 0x0a, 0x0e, 0xe0, 0x22, 0xf0, 0xff, 0x42, + 0x42, 0xea, 0xc3, 0x52, 0x08, 0xee, 0x10, 0x2a, 0x07, 0xe0, 0x31, 0xb1, + 0x20, 0x46, 0xb0, 0xee, 0x48, 0x0a, 0xf5, 0xf7, 0x3d, 0xfc, 0xb0, 0xee, + 0x40, 0x8a, 0x38, 0xee, 0xc8, 0x0a, 0xb4, 0xee, 0x68, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x47, 0xd0, 0xb4, 0xee, 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, + 0x0f, 0xd5, 0x88, 0xee, 0x88, 0x9a, 0xb7, 0xee, 0x00, 0x0a, 0x09, 0xee, + 0x09, 0x0a, 0xc5, 0xf7, 0x77, 0xfe, 0x39, 0xee, 0x00, 0x0a, 0x88, 0xee, + 0x00, 0x0a, 0x04, 0xb0, 0x30, 0xee, 0x28, 0x0a, 0x33, 0xe0, 0x80, 0xee, + 0x08, 0x9a, 0x19, 0xee, 0x10, 0x0a, 0xff, 0xf7, 0x17, 0xfe, 0x00, 0x22, + 0x4f, 0xf0, 0x80, 0x43, 0xc5, 0xf7, 0x96, 0xff, 0x04, 0x46, 0x0d, 0x46, + 0x19, 0xee, 0x10, 0x0a, 0xff, 0xf7, 0x0c, 0xfe, 0x22, 0x46, 0x2b, 0x46, + 0xf8, 0xf7, 0xba, 0xfd, 0xff, 0xf7, 0x2a, 0xfe, 0x09, 0xee, 0x90, 0x0a, + 0xb0, 0xee, 0x00, 0x0a, 0x39, 0xee, 0x80, 0x0a, 0xc5, 0xf7, 0x50, 0xfe, + 0xdf, 0xed, 0x0d, 0x0a, 0x70, 0xee, 0x20, 0x0a, 0xc9, 0xee, 0xa0, 0x0a, + 0x9f, 0xed, 0x0b, 0x0a, 0x30, 0xee, 0x80, 0x0a, 0x30, 0xee, 0x09, 0x0a, + 0x9f, 0xed, 0x09, 0x1a, 0x30, 0xee, 0x01, 0x1a, 0x88, 0xee, 0x01, 0x1a, + 0x31, 0xee, 0x28, 0x0a, 0x04, 0xb0, 0xbd, 0xec, 0x04, 0x8b, 0x31, 0xbd, + 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xf3, 0x04, 0xb5, 0x3f, + 0xf3, 0x89, 0x63, 0x37, 0x41, 0x82, 0x1a, 0x40, 0x70, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x16, 0x46, 0x00, 0xf0, 0xa4, 0xfe, 0x32, 0x46, 0x29, 0x46, + 0x20, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x2d, 0xe9, 0xf8, 0x43, 0x2d, 0xed, + 0x02, 0x8b, 0x06, 0x46, 0x0d, 0x46, 0x17, 0x46, 0x00, 0xf0, 0x28, 0xff, + 0x04, 0x46, 0x30, 0x46, 0x00, 0xf0, 0x2a, 0xff, 0x80, 0x46, 0x30, 0x46, + 0x00, 0xf0, 0x42, 0xff, 0x81, 0x46, 0x30, 0x46, 0x00, 0xf0, 0x45, 0xff, + 0x06, 0x46, 0x1c, 0x21, 0x09, 0xf1, 0x58, 0x00, 0xd7, 0xf7, 0x1a, 0xf8, + 0x3c, 0x21, 0x09, 0xf1, 0x74, 0x00, 0xd7, 0xf7, 0x15, 0xf8, 0x4f, 0xf4, + 0x80, 0x20, 0xc9, 0xf8, 0x90, 0x00, 0x00, 0x21, 0x31, 0x60, 0x00, 0x20, + 0x70, 0x60, 0xb7, 0xee, 0x00, 0x8a, 0x86, 0xed, 0x02, 0x8a, 0xf0, 0x60, + 0x87, 0xf8, 0x20, 0x00, 0x87, 0xf8, 0x21, 0x00, 0xdf, 0xf8, 0x40, 0x1c, + 0x79, 0x61, 0x04, 0xf5, 0xd9, 0x67, 0x05, 0xf1, 0x40, 0x01, 0x01, 0xeb, + 0x80, 0x02, 0x95, 0xed, 0x02, 0x0a, 0x00, 0xf0, 0xb3, 0xf8, 0x03, 0x28, + 0xc3, 0xed, 0x00, 0x0a, 0xf5, 0xd3, 0x04, 0x20, 0x05, 0xf1, 0x58, 0x01, + 0x42, 0x42, 0x01, 0xeb, 0x82, 0x03, 0x95, 0xed, 0x02, 0x0a, 0xd3, 0xed, + 0x00, 0x0a, 0x07, 0xeb, 0x80, 0x02, 0x40, 0x1c, 0x60, 0xee, 0x20, 0x0a, + 0x07, 0x28, 0xc2, 0xed, 0x00, 0x0a, 0xef, 0xd3, 0x07, 0x20, 0xe9, 0x68, + 0x47, 0xf8, 0x20, 0x10, 0x40, 0x1c, 0x0a, 0x28, 0xf9, 0xd3, 0x0a, 0x20, + 0x05, 0xf1, 0x24, 0x01, 0x01, 0xeb, 0x80, 0x02, 0x00, 0xf0, 0x8c, 0xf8, + 0x11, 0x28, 0xc3, 0xed, 0x00, 0x0a, 0xf7, 0xd3, 0x12, 0x20, 0x05, 0xf1, + 0xac, 0x06, 0x41, 0x42, 0x06, 0xeb, 0x81, 0x02, 0x00, 0xf0, 0x80, 0xf8, + 0x19, 0x28, 0xc3, 0xed, 0x00, 0x0a, 0xf6, 0xd3, 0x19, 0x20, 0xe9, 0x69, + 0x47, 0xf8, 0x20, 0x10, 0x40, 0x1c, 0x1c, 0x28, 0xf9, 0xd3, 0x04, 0xf2, + 0xd4, 0x60, 0x29, 0x68, 0x01, 0x60, 0x6a, 0x68, 0x42, 0x61, 0x29, 0x69, + 0x81, 0x63, 0x4f, 0xf4, 0xcb, 0x61, 0x6a, 0x69, 0xc2, 0x65, 0x04, 0xf1, + 0x70, 0x00, 0xd6, 0xf7, 0xab, 0xff, 0x3a, 0x46, 0x1c, 0x21, 0x04, 0xf1, + 0x70, 0x00, 0xfe, 0xf7, 0xbc, 0xff, 0x70, 0x21, 0x20, 0x46, 0xd6, 0xf7, + 0xa1, 0xff, 0x84, 0xed, 0x11, 0x8a, 0x00, 0x20, 0x08, 0xf1, 0x74, 0x03, + 0x05, 0xf1, 0x40, 0x01, 0x01, 0xeb, 0x80, 0x02, 0x95, 0xed, 0x0a, 0x0a, + 0xd2, 0xed, 0x00, 0x0a, 0x03, 0xeb, 0x80, 0x01, 0x40, 0x1c, 0x60, 0xee, + 0x20, 0x0a, 0x03, 0x28, 0xc1, 0xed, 0x00, 0x0a, 0xee, 0xd3, 0x04, 0x20, + 0x08, 0xf1, 0x74, 0x04, 0x05, 0xf1, 0x58, 0x01, 0x42, 0x42, 0x01, 0xeb, + 0x82, 0x03, 0x95, 0xed, 0x0a, 0x0a, 0xd3, 0xed, 0x00, 0x0a, 0x04, 0xeb, + 0x80, 0x01, 0x40, 0x1c, 0x60, 0xee, 0x20, 0x0a, 0x07, 0x28, 0xc1, 0xed, + 0x00, 0x0a, 0xed, 0xd3, 0x08, 0xf1, 0x80, 0x00, 0x29, 0x6a, 0x01, 0x60, + 0x0a, 0x21, 0x05, 0xf1, 0x24, 0x02, 0x02, 0xeb, 0x81, 0x03, 0x00, 0xf0, + 0x1b, 0xf8, 0x11, 0x29, 0xc2, 0xed, 0x00, 0x0a, 0xf5, 0xd3, 0x12, 0x21, + 0x4a, 0x42, 0x06, 0xeb, 0x82, 0x03, 0x00, 0xf0, 0x11, 0xf8, 0x19, 0x29, + 0xc2, 0xed, 0x00, 0x0a, 0xf6, 0xd3, 0x29, 0x6b, 0x81, 0x63, 0x00, 0x20, + 0x00, 0x21, 0x48, 0xf8, 0x20, 0x10, 0x40, 0x1c, 0x1c, 0x28, 0xfa, 0xd3, + 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf1, 0x83, 0x95, 0xed, 0x0e, 0x0a, + 0xd3, 0xed, 0x00, 0x0a, 0x04, 0xeb, 0x81, 0x02, 0x49, 0x1c, 0x60, 0xee, + 0x20, 0x0a, 0x70, 0x47, 0x95, 0xed, 0x06, 0x0a, 0xd2, 0xed, 0x00, 0x0a, + 0x07, 0xeb, 0x80, 0x03, 0x40, 0x1c, 0x60, 0xee, 0x20, 0x0a, 0x70, 0x47, + 0x10, 0xb5, 0x1a, 0x89, 0x93, 0xed, 0x04, 0x0a, 0x00, 0xee, 0x90, 0x2a, + 0xb8, 0xee, 0x40, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x8c, 0x31, 0x60, 0xee, + 0x20, 0x0a, 0x93, 0xed, 0x01, 0x0a, 0x91, 0xed, 0x00, 0x1a, 0x80, 0xee, + 0x80, 0x0a, 0x01, 0x20, 0xb4, 0xee, 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x2d, 0xd4, 0x91, 0xed, 0x0c, 0x0a, 0x93, 0xed, 0x05, 0x1a, 0xd3, 0xed, + 0x06, 0x0a, 0xb4, 0xee, 0x40, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xbf, + 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x1d, 0xd4, 0x03, 0xf1, + 0x1c, 0x02, 0x03, 0xf1, 0x1c, 0x04, 0x31, 0xee, 0x20, 0x4a, 0x1c, 0x33, + 0x92, 0xec, 0x02, 0x0a, 0x94, 0xec, 0x02, 0x1a, 0x92, 0xec, 0x02, 0x2a, + 0x93, 0xec, 0x02, 0x3a, 0x20, 0xee, 0x01, 0x0a, 0x02, 0xee, 0xa3, 0x0a, + 0x64, 0xee, 0x04, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0xd1, 0xed, 0x0a, 0x1a, + 0xf4, 0xee, 0x40, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x00, 0xd5, 0x00, 0x20, + 0x10, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x84, 0xb0, 0x82, 0x46, 0x89, 0x46, + 0x93, 0x46, 0x98, 0x46, 0x00, 0xf0, 0xe4, 0xfd, 0x03, 0x46, 0x5a, 0x46, + 0x41, 0x46, 0x48, 0x46, 0x00, 0xf0, 0x5c, 0xf8, 0x50, 0x46, 0x00, 0xf0, + 0xac, 0xfd, 0x01, 0x00, 0x1b, 0xd1, 0x0e, 0x9c, 0x50, 0x46, 0x00, 0xf0, + 0xdd, 0xfd, 0x06, 0x46, 0x50, 0x46, 0x00, 0xf0, 0xfc, 0xfd, 0x05, 0x46, + 0x50, 0x46, 0x00, 0xf0, 0xf1, 0xfd, 0x50, 0x46, 0x00, 0xf0, 0xd9, 0xfd, + 0x02, 0x90, 0x01, 0x96, 0x23, 0x46, 0x0f, 0x98, 0x00, 0x90, 0x5a, 0x46, + 0x29, 0x46, 0x48, 0x46, 0x00, 0xf0, 0xc4, 0xf8, 0x50, 0x46, 0x00, 0xf0, + 0x98, 0xfd, 0x01, 0x00, 0x1f, 0xd1, 0x50, 0x46, 0x00, 0xf0, 0xe3, 0xfd, + 0x04, 0x46, 0x50, 0x46, 0x00, 0xf0, 0xc3, 0xfd, 0x05, 0x46, 0x50, 0x46, + 0x00, 0xf0, 0xc6, 0xfd, 0x06, 0x46, 0x50, 0x46, 0x00, 0xf0, 0xc9, 0xfd, + 0x07, 0x46, 0x50, 0x46, 0x00, 0xf0, 0xaa, 0xfd, 0x03, 0x97, 0x02, 0x96, + 0x01, 0x95, 0x00, 0x90, 0x5b, 0x46, 0x22, 0x46, 0x41, 0x46, 0x48, 0x46, + 0x00, 0xf0, 0x82, 0xf9, 0x50, 0x46, 0x00, 0xf0, 0x91, 0xfd, 0x90, 0xb9, + 0x50, 0x46, 0x00, 0xf0, 0xc9, 0xfd, 0x04, 0x46, 0x50, 0x46, 0x00, 0xf0, + 0xb7, 0xfd, 0x05, 0x46, 0x50, 0x46, 0x00, 0xf0, 0xba, 0xfd, 0x02, 0x46, + 0x23, 0x46, 0x29, 0x46, 0x48, 0x46, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, + 0x87, 0xe3, 0x02, 0x20, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0x00, + 0x2d, 0xe9, 0xf0, 0x41, 0x0d, 0x46, 0x2d, 0xed, 0x04, 0x8b, 0x95, 0xed, + 0x06, 0x0a, 0xd5, 0xed, 0x05, 0x0a, 0x00, 0x27, 0xf4, 0xee, 0x40, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x04, 0x46, 0x16, 0x46, 0x98, 0x46, 0x22, 0xd5, + 0x95, 0xed, 0x03, 0x1a, 0xb1, 0xee, 0x41, 0x1a, 0x05, 0xf1, 0x24, 0x00, + 0x05, 0xf1, 0x2c, 0x01, 0x85, 0xed, 0x03, 0x1a, 0x85, 0xed, 0x05, 0x0a, + 0xc5, 0xed, 0x06, 0x0a, 0x90, 0xec, 0x02, 0x8a, 0x91, 0xec, 0x02, 0x0a, + 0xfe, 0xf7, 0x82, 0xfc, 0x05, 0xf1, 0x24, 0x00, 0x01, 0x27, 0x80, 0xec, + 0x02, 0x0a, 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, 0xfe, 0xf7, + 0x77, 0xfc, 0x05, 0xf1, 0x2c, 0x01, 0x81, 0xec, 0x02, 0x0a, 0x28, 0x89, + 0x95, 0xed, 0x00, 0x8a, 0xd5, 0xed, 0x01, 0x0a, 0x00, 0xee, 0x10, 0x0a, + 0xb8, 0xee, 0x40, 0x0a, 0x20, 0xee, 0x08, 0x0a, 0xc0, 0xee, 0x20, 0x8a, + 0x95, 0xed, 0x03, 0x0a, 0x05, 0xf1, 0x24, 0x00, 0x80, 0xee, 0x08, 0x9a, + 0x90, 0xec, 0x02, 0x0a, 0xfe, 0xf7, 0x32, 0xfd, 0xdf, 0xed, 0x87, 0x0a, + 0x68, 0xee, 0xa0, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0x70, 0xee, 0x09, 0x8a, + 0x94, 0xed, 0x29, 0x0a, 0xb5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x07, 0xdd, 0x88, 0xee, 0x00, 0x8a, 0x28, 0xee, 0x88, 0x0a, 0xc5, 0xf7, + 0x69, 0xf9, 0xc0, 0xee, 0x08, 0x8a, 0x00, 0x2f, 0x14, 0xbf, 0xb1, 0xee, + 0x68, 0x0a, 0xb0, 0xee, 0x68, 0x0a, 0x86, 0xed, 0x03, 0x0a, 0x9f, 0xed, + 0x79, 0x0a, 0xc6, 0xed, 0x04, 0x8a, 0x28, 0xee, 0x80, 0x0a, 0xc5, 0xf7, + 0x57, 0xf9, 0xbd, 0xee, 0xc0, 0x0a, 0x88, 0xed, 0x00, 0x0a, 0xdf, 0xed, + 0x74, 0x0a, 0x28, 0xee, 0xa0, 0x0a, 0xc5, 0xf7, 0x4d, 0xf9, 0xbd, 0xee, + 0xc0, 0x0a, 0x88, 0xed, 0x01, 0x0a, 0xbd, 0xec, 0x04, 0x8b, 0xbd, 0xe8, + 0xf0, 0x81, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0x2d, 0xed, 0x08, 0x8b, + 0x80, 0x46, 0x9d, 0xed, 0x0e, 0x0a, 0xb8, 0xee, 0x40, 0x1a, 0xdf, 0xed, + 0x69, 0x0a, 0x0f, 0x9d, 0x98, 0xed, 0x24, 0x0a, 0x81, 0xee, 0x20, 0x8a, + 0x0e, 0x46, 0x17, 0x46, 0x1c, 0x46, 0xf0, 0xee, 0x48, 0x0a, 0xdc, 0xf7, + 0xfb, 0xf8, 0x05, 0xf1, 0x94, 0x00, 0x85, 0xed, 0x1c, 0x0a, 0x80, 0xed, + 0x14, 0x8a, 0x97, 0xf8, 0x21, 0x10, 0x8c, 0x42, 0x08, 0xd1, 0xd8, 0xed, + 0x0b, 0x0a, 0x98, 0xed, 0x09, 0x1a, 0xd8, 0xed, 0x0f, 0x1a, 0x98, 0xed, + 0x0d, 0x2a, 0x1f, 0xe0, 0x61, 0x1a, 0x48, 0xbf, 0x49, 0x42, 0xc9, 0xb2, + 0x00, 0xee, 0x90, 0x1a, 0xf8, 0xee, 0x60, 0x0a, 0x9f, 0xed, 0x55, 0x1a, + 0x80, 0xee, 0x81, 0x1a, 0x81, 0xee, 0x08, 0x2a, 0xd8, 0xed, 0x1b, 0x1a, + 0x98, 0xed, 0x1a, 0x1a, 0xd8, 0xed, 0x1c, 0x2a, 0x61, 0xee, 0x82, 0x0a, + 0xd8, 0xed, 0x1d, 0x1a, 0x21, 0xee, 0x02, 0x1a, 0x61, 0xee, 0x82, 0x1a, + 0x22, 0xee, 0x82, 0x2a, 0x87, 0xf8, 0x21, 0x40, 0x07, 0x21, 0x05, 0xf1, + 0x74, 0x02, 0x02, 0xeb, 0x81, 0x03, 0x49, 0x1c, 0x0a, 0x29, 0xc3, 0xed, + 0x00, 0x0a, 0xf8, 0xd3, 0x80, 0xed, 0x00, 0x1a, 0x19, 0x21, 0x02, 0xeb, + 0x81, 0x03, 0x49, 0x1c, 0x1c, 0x29, 0xc3, 0xed, 0x00, 0x1a, 0xf8, 0xd3, + 0xff, 0xee, 0x00, 0x1a, 0xf7, 0xee, 0x00, 0x2a, 0x80, 0xed, 0x12, 0x2a, + 0xd6, 0xed, 0x01, 0x0a, 0x96, 0xed, 0x03, 0x2a, 0x96, 0xed, 0x02, 0x1a, + 0x97, 0xf8, 0x20, 0x00, 0x60, 0xee, 0xa1, 0x0a, 0x62, 0xee, 0x21, 0x8a, + 0x72, 0xee, 0xc0, 0x9a, 0x96, 0xed, 0x00, 0x8a, 0xd7, 0xed, 0x05, 0x1a, + 0x29, 0xee, 0x81, 0x9a, 0xe0, 0xb9, 0xb0, 0xee, 0x68, 0x0a, 0x08, 0xee, + 0xa0, 0x0a, 0xf0, 0xee, 0x41, 0x1a, 0x01, 0xee, 0x08, 0x0a, 0x41, 0xee, + 0x20, 0x1a, 0x29, 0xee, 0x80, 0x0a, 0x48, 0xee, 0xc8, 0x1a, 0x80, 0xee, + 0x21, 0x0a, 0x85, 0xed, 0x03, 0x0a, 0x00, 0xee, 0x28, 0x9a, 0xb7, 0xee, + 0x00, 0x0a, 0x30, 0xee, 0x80, 0x0a, 0x89, 0xee, 0x00, 0x0a, 0x85, 0xed, + 0x11, 0x0a, 0x2f, 0xe0, 0xbf, 0xee, 0x00, 0x1a, 0x30, 0xee, 0x01, 0xaa, + 0x9f, 0xed, 0x1d, 0x0a, 0x61, 0xee, 0x80, 0xaa, 0x6a, 0xee, 0x20, 0xba, + 0xb0, 0xee, 0x6a, 0x0a, 0xc5, 0xf7, 0x80, 0xf8, 0xb0, 0xee, 0x00, 0xba, + 0x20, 0xee, 0x0b, 0x0a, 0xcb, 0xee, 0x80, 0xba, 0xb0, 0xee, 0x6a, 0x0a, + 0xc5, 0xf7, 0x76, 0xf8, 0x6a, 0xee, 0x28, 0x8a, 0x20, 0xee, 0x0b, 0x0a, + 0x88, 0xee, 0x80, 0x0a, 0x69, 0xee, 0x88, 0x0a, 0xc5, 0xed, 0x03, 0x0a, + 0x85, 0xed, 0x12, 0x0a, 0xf1, 0xee, 0x6b, 0x0a, 0xb1, 0xee, 0x40, 0x0a, + 0xc5, 0xed, 0x04, 0xba, 0xc5, 0xed, 0x02, 0x0a, 0x85, 0xed, 0x11, 0x9a, + 0x85, 0xed, 0x10, 0x0a, 0x00, 0xee, 0x90, 0x4a, 0x10, 0x98, 0xf8, 0xee, + 0x60, 0x0a, 0x9f, 0xed, 0x09, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0x80, 0xed, + 0x00, 0x0a, 0xbd, 0xec, 0x08, 0x8b, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x00, + 0xdb, 0x0f, 0xc9, 0x40, 0x00, 0x00, 0x80, 0x4f, 0x00, 0x00, 0xe0, 0xc8, + 0x00, 0x24, 0x74, 0x49, 0x00, 0x00, 0x7f, 0x43, 0x2d, 0xe9, 0xf0, 0x47, + 0x04, 0x46, 0x0d, 0x46, 0x2d, 0xed, 0x10, 0x8b, 0x05, 0xf1, 0x1c, 0x00, + 0x88, 0xb0, 0x95, 0xed, 0x06, 0x1a, 0xd5, 0xed, 0x05, 0x1a, 0x31, 0xee, + 0x81, 0x9a, 0x90, 0xec, 0x02, 0x0a, 0xb0, 0xee, 0x00, 0x8a, 0xf0, 0xee, + 0x49, 0x8a, 0x98, 0x46, 0x40, 0xee, 0x08, 0x8a, 0x00, 0xee, 0x48, 0x9a, + 0x31, 0xee, 0xc1, 0xaa, 0x60, 0xee, 0x88, 0x9a, 0x8a, 0xee, 0x28, 0x0a, + 0x04, 0xf1, 0x84, 0x07, 0x88, 0xed, 0x00, 0x0a, 0xc9, 0xee, 0xa8, 0x0a, + 0xc8, 0xed, 0x01, 0x0a, 0xb0, 0xee, 0xc0, 0x0a, 0xd7, 0xed, 0x06, 0x1a, + 0xd8, 0xed, 0x04, 0x0a, 0xb4, 0xee, 0x61, 0x0a, 0xb0, 0xee, 0xe0, 0x1a, + 0xf1, 0xee, 0x10, 0xfa, 0x5d, 0xbf, 0x97, 0xed, 0x07, 0x2a, 0xb4, 0xee, + 0x42, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x9f, 0xed, 0xd9, 0xaa, 0xc8, 0xed, + 0x05, 0x0a, 0x91, 0x46, 0xd7, 0xed, 0x04, 0x0a, 0x00, 0xf0, 0x32, 0xfb, + 0x06, 0xda, 0x97, 0xed, 0x05, 0x0a, 0xb4, 0xee, 0x40, 0x1a, 0xf1, 0xee, + 0x10, 0xfa, 0x01, 0xd5, 0x00, 0x20, 0x00, 0xe0, 0x01, 0x20, 0x22, 0x9e, + 0xdf, 0xf8, 0xe0, 0xa5, 0x88, 0xf8, 0x20, 0x00, 0xbf, 0xee, 0x00, 0xda, + 0x99, 0xed, 0x01, 0x0a, 0xd9, 0xed, 0x00, 0xaa, 0xd9, 0xed, 0x02, 0xba, + 0x20, 0xee, 0x0d, 0xba, 0x99, 0xed, 0x03, 0x0a, 0x20, 0xee, 0x0d, 0xca, + 0xb6, 0xee, 0x00, 0x0a, 0x2a, 0xee, 0xaa, 0x1a, 0x68, 0xee, 0x80, 0x0a, + 0x0b, 0xee, 0x0b, 0x1a, 0x2b, 0xee, 0xab, 0x2a, 0x20, 0xee, 0x81, 0x1a, + 0x69, 0xee, 0x00, 0x1a, 0x0c, 0xee, 0x0c, 0x2a, 0x01, 0xee, 0x82, 0x1a, + 0x6a, 0xee, 0x8c, 0x1a, 0x4b, 0xee, 0x6b, 0x1a, 0x01, 0xee, 0x8a, 0x1a, + 0x6a, 0xee, 0xab, 0x1a, 0x4b, 0xee, 0x0c, 0x1a, 0x68, 0xee, 0xaa, 0xca, + 0x01, 0xee, 0xa9, 0x1a, 0x4a, 0xee, 0x0c, 0xca, 0x70, 0xee, 0xc1, 0x0a, + 0x49, 0xee, 0xab, 0xca, 0xc6, 0xed, 0x00, 0x0a, 0xf1, 0xee, 0x6c, 0x2a, + 0xc6, 0xed, 0x01, 0x2a, 0x99, 0xed, 0x01, 0x0a, 0x20, 0xee, 0x0d, 0x0a, + 0xfe, 0xf7, 0xf4, 0xf9, 0x00, 0xf0, 0x7f, 0xf9, 0xb0, 0xee, 0x40, 0xea, + 0xf0, 0xee, 0x60, 0xea, 0x99, 0xed, 0x00, 0x0a, 0xfe, 0xf7, 0xea, 0xf9, + 0xb0, 0xee, 0x4e, 0x1a, 0xf0, 0xee, 0x6e, 0x1a, 0xfe, 0xf7, 0x91, 0xf9, + 0x68, 0x46, 0x80, 0xec, 0x02, 0x0a, 0x99, 0xed, 0x03, 0x0a, 0x20, 0xee, + 0x0d, 0x0a, 0xfe, 0xf7, 0xdb, 0xf9, 0x00, 0xf0, 0x66, 0xf9, 0xb0, 0xee, + 0x40, 0xda, 0xf0, 0xee, 0x60, 0xda, 0x99, 0xed, 0x02, 0x0a, 0xdf, 0xf8, + 0x1c, 0x95, 0xfe, 0xf7, 0xcf, 0xf9, 0x00, 0xf0, 0x35, 0xf9, 0xfe, 0xf7, + 0x78, 0xf9, 0x00, 0xf0, 0x3f, 0xf9, 0x99, 0xec, 0x02, 0x0a, 0xfe, 0xf7, + 0x72, 0xf9, 0xb0, 0xee, 0x40, 0xfa, 0xf0, 0xee, 0x60, 0xfa, 0x00, 0xf0, + 0x27, 0xf9, 0x99, 0xec, 0x02, 0x0a, 0xfe, 0xf7, 0x7b, 0xf9, 0x68, 0x46, + 0xb0, 0xee, 0x40, 0xea, 0xf0, 0xee, 0x60, 0xea, 0x90, 0xec, 0x02, 0x1a, + 0x9a, 0xec, 0x02, 0x0a, 0xfe, 0xf7, 0x83, 0xf9, 0x00, 0xf0, 0x24, 0xf9, + 0xb0, 0xee, 0x4f, 0x0a, 0xf0, 0xee, 0x6f, 0x0a, 0xfe, 0xf7, 0x55, 0xf9, + 0x06, 0xa8, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x80, 0xec, + 0x02, 0x1a, 0x00, 0xf0, 0x07, 0xf9, 0xb0, 0xee, 0x4e, 0x0a, 0xf0, 0xee, + 0x6e, 0x0a, 0xfe, 0xf7, 0x46, 0xf9, 0x04, 0xa9, 0xb0, 0xee, 0x4d, 0x1a, + 0x81, 0xec, 0x02, 0x0a, 0xf0, 0xee, 0x6d, 0x1a, 0xb0, 0xee, 0x4f, 0x0a, + 0xf0, 0xee, 0x6f, 0x0a, 0xfe, 0xf7, 0x4c, 0xf9, 0x02, 0xa8, 0xb0, 0xee, + 0x4d, 0x1a, 0x80, 0xec, 0x02, 0x0a, 0xf0, 0xee, 0x6d, 0x1a, 0xb0, 0xee, + 0x4e, 0x0a, 0xf0, 0xee, 0x6e, 0x0a, 0xfe, 0xf7, 0x3f, 0xf9, 0x69, 0x46, + 0x05, 0xf1, 0x1c, 0x00, 0x81, 0xec, 0x02, 0x0a, 0x04, 0xa9, 0xd5, 0xed, + 0x05, 0xea, 0x95, 0xed, 0x06, 0xea, 0x90, 0xec, 0x02, 0xfa, 0x91, 0xec, + 0x02, 0x0a, 0xfe, 0xf7, 0x29, 0xfa, 0x00, 0xf0, 0xec, 0xf8, 0x06, 0xa8, + 0x00, 0xf0, 0xef, 0xf8, 0x9d, 0xed, 0x06, 0x2a, 0xdd, 0xed, 0x06, 0x2a, + 0xdd, 0xed, 0x07, 0x1a, 0xdd, 0xed, 0x04, 0x0a, 0x9d, 0xed, 0x05, 0x1a, + 0x00, 0xf0, 0xcb, 0xf8, 0x9d, 0xed, 0x04, 0x0a, 0x20, 0xee, 0x80, 0x0a, + 0x01, 0xee, 0x01, 0x0a, 0x02, 0xa8, 0xb5, 0xee, 0x00, 0xda, 0x40, 0xee, + 0x0e, 0x1a, 0x61, 0xee, 0x8d, 0xda, 0x90, 0xec, 0x02, 0x0a, 0xfe, 0xf7, + 0x07, 0xfa, 0x00, 0xf0, 0xca, 0xf8, 0x68, 0x46, 0x00, 0xf0, 0xcd, 0xf8, + 0x9d, 0xed, 0x00, 0x2a, 0xdd, 0xed, 0x00, 0x2a, 0xdd, 0xed, 0x01, 0x1a, + 0xdd, 0xed, 0x02, 0x0a, 0x9d, 0xed, 0x03, 0x1a, 0x2b, 0x89, 0x23, 0x9a, + 0x21, 0x99, 0x20, 0x98, 0x00, 0xf0, 0xa5, 0xf8, 0x9d, 0xed, 0x02, 0x0a, + 0x95, 0xed, 0x01, 0x2a, 0x20, 0xee, 0x80, 0x0a, 0x01, 0xee, 0x01, 0x0a, + 0xdf, 0xed, 0x7c, 0x0a, 0x40, 0xee, 0x0e, 0x1a, 0xf4, 0xee, 0x60, 0xda, + 0x21, 0xee, 0x8d, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, 0xdf, 0xed, + 0x45, 0xda, 0xb4, 0xee, 0x60, 0x0a, 0x95, 0xed, 0x04, 0x1a, 0xd7, 0xed, + 0x00, 0x0a, 0x01, 0xee, 0x90, 0x3a, 0xf1, 0xee, 0x10, 0xfa, 0xb8, 0xee, + 0x41, 0x1a, 0xf8, 0xee, 0x61, 0x1a, 0x48, 0xbf, 0x9f, 0xed, 0x3c, 0x0a, + 0x6d, 0xee, 0xa0, 0x0a, 0x61, 0xee, 0x81, 0x1a, 0xb4, 0xee, 0x60, 0x0a, + 0x81, 0xee, 0x82, 0x2a, 0xf1, 0xee, 0x10, 0xfa, 0xd4, 0xed, 0x1e, 0x1a, + 0x4c, 0xbf, 0xd4, 0xed, 0x20, 0x0a, 0xd4, 0xed, 0x1f, 0x0a, 0xc0, 0xee, + 0x81, 0x0a, 0x88, 0xed, 0x07, 0x0a, 0x2d, 0xee, 0x80, 0x1a, 0xc1, 0xee, + 0x82, 0x1a, 0x60, 0xee, 0x81, 0x0a, 0x3d, 0xee, 0x80, 0x0a, 0xc8, 0xed, + 0x06, 0xda, 0x40, 0xee, 0x21, 0x0a, 0xc6, 0xed, 0x02, 0x0a, 0xc6, 0xed, + 0x03, 0x0a, 0x7b, 0x68, 0x33, 0x61, 0xc8, 0xed, 0x02, 0x0a, 0x6a, 0xee, + 0x2b, 0x0a, 0x91, 0xed, 0x00, 0x0a, 0xc2, 0xed, 0x00, 0xca, 0x48, 0xee, + 0xcb, 0x0a, 0x49, 0xee, 0xcc, 0x0a, 0xc2, 0xed, 0x01, 0x0a, 0x20, 0xee, + 0x2c, 0x1a, 0x60, 0xee, 0x20, 0x0a, 0x82, 0xed, 0x04, 0x1a, 0xc2, 0xed, + 0x05, 0x0a, 0x69, 0xee, 0x2b, 0x0a, 0x29, 0xee, 0x4c, 0x1a, 0x4a, 0xee, + 0x4b, 0x0a, 0x0a, 0xee, 0x6a, 0x1a, 0x60, 0xee, 0x28, 0x1a, 0x49, 0xee, + 0xaa, 0x0a, 0x09, 0xee, 0xcb, 0x1a, 0xc2, 0xed, 0x06, 0x1a, 0xc2, 0xed, + 0x08, 0x0a, 0x82, 0xed, 0x09, 0x1a, 0x00, 0x21, 0xf1, 0xee, 0x4a, 0x1a, + 0x60, 0xee, 0x20, 0x0a, 0x20, 0xee, 0x01, 0x1a, 0x20, 0xee, 0x29, 0x2a, + 0x20, 0xee, 0x21, 0x0a, 0xc2, 0xed, 0x02, 0x8a, 0xd1, 0x60, 0xd1, 0x61, + 0xc2, 0xed, 0x0a, 0x9a, 0xc2, 0xed, 0x0b, 0x1a, 0xc2, 0xed, 0x0c, 0x0a, + 0x82, 0xed, 0x0d, 0x1a, 0x82, 0xed, 0x0e, 0x2a, 0x82, 0xed, 0x0f, 0x0a, + 0x08, 0xb0, 0x00, 0xf5, 0xd9, 0x62, 0xbd, 0xec, 0x10, 0x8b, 0x1c, 0x21, + 0xbd, 0xe8, 0xf0, 0x47, 0x70, 0x30, 0xfe, 0xf7, 0x63, 0xbb, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb0, 0xee, 0x4d, 0x1a, 0xf0, 0xee, 0x6d, 0x1a, + 0x70, 0x47, 0x62, 0xee, 0x22, 0x2a, 0x41, 0xee, 0xa1, 0x2a, 0x62, 0xee, + 0xae, 0x1a, 0x40, 0xee, 0x08, 0x1a, 0x70, 0x47, 0xb0, 0xee, 0x40, 0xda, + 0xf0, 0xee, 0x60, 0xda, 0xb0, 0xee, 0x4d, 0x1a, 0xf0, 0xee, 0x6d, 0x1a, + 0x70, 0x47, 0xb0, 0xee, 0x4f, 0x1a, 0xf0, 0xee, 0x6f, 0x1a, 0xfe, 0xf7, + 0x4e, 0xb8, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x90, 0xec, + 0x02, 0x0a, 0xfe, 0xf7, 0x46, 0xb8, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, + 0x60, 0x1a, 0x9a, 0xec, 0x02, 0x0a, 0xfe, 0xf7, 0x3e, 0xb8, 0x10, 0xb5, + 0x00, 0xf0, 0x39, 0xf8, 0x00, 0x24, 0x00, 0xb9, 0x02, 0x24, 0x20, 0x46, + 0x10, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x47, 0x04, 0x46, 0x0d, 0x46, + 0x1e, 0x46, 0x00, 0xf0, 0xfe, 0xf9, 0x82, 0x46, 0x20, 0x46, 0x00, 0xf0, + 0x1d, 0xfa, 0x07, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x0b, 0xfa, 0x80, 0x46, + 0x20, 0x46, 0x00, 0xf0, 0x0e, 0xfa, 0x00, 0xee, 0x10, 0x6a, 0xb8, 0xee, + 0x40, 0x0a, 0xdf, 0xed, 0x80, 0x0a, 0x81, 0x46, 0x80, 0xee, 0x20, 0x0a, + 0x8a, 0xed, 0x00, 0x0a, 0x20, 0x46, 0x00, 0xf0, 0x9c, 0xf9, 0x30, 0xb9, + 0x3b, 0x46, 0x4a, 0x46, 0x41, 0x46, 0x28, 0x46, 0xbd, 0xe8, 0xf0, 0x47, + 0x09, 0xe0, 0x00, 0x20, 0xbd, 0xe8, 0xf0, 0x87, 0xff, 0xe6, 0xdb, 0x2e, + 0x80, 0xb5, 0x00, 0xf0, 0xe9, 0xf9, 0x58, 0x30, 0x02, 0xbd, 0xf8, 0xb5, + 0x2d, 0xed, 0x0a, 0x8b, 0x91, 0xed, 0x0e, 0x0a, 0x00, 0xf1, 0xa8, 0x06, + 0xff, 0xee, 0x00, 0x0a, 0x70, 0xee, 0x20, 0x0a, 0xf0, 0xee, 0xe0, 0x0a, + 0x96, 0xed, 0x02, 0x1a, 0x01, 0x25, 0xb4, 0xee, 0x60, 0x1a, 0xf1, 0xee, + 0x10, 0xfa, 0x14, 0x46, 0x00, 0xf1, 0xc8, 0x80, 0xd3, 0xed, 0x00, 0x0a, + 0x40, 0xee, 0x40, 0x0a, 0x96, 0xed, 0x00, 0x0a, 0x00, 0xf0, 0xfe, 0xf8, + 0x76, 0xd4, 0x91, 0xed, 0x03, 0x0a, 0xd3, 0xed, 0x01, 0x0a, 0x40, 0xee, + 0x40, 0x0a, 0x96, 0xed, 0x01, 0x0a, 0x00, 0xf0, 0xf3, 0xf8, 0x6b, 0xd4, + 0x94, 0xed, 0x03, 0x0a, 0x5d, 0x4f, 0xb1, 0xee, 0x40, 0x0a, 0xfd, 0xf7, + 0xfd, 0xff, 0x00, 0xf0, 0xf7, 0xf8, 0x00, 0xf0, 0xc4, 0xf8, 0x94, 0xed, + 0x02, 0x0a, 0xfd, 0xf7, 0xf5, 0xff, 0x00, 0xf0, 0xcb, 0xf8, 0xb0, 0xee, + 0x40, 0xaa, 0x94, 0xed, 0x01, 0x0a, 0xf0, 0xee, 0x60, 0xaa, 0xb1, 0xee, + 0x40, 0x0a, 0xfd, 0xf7, 0xe9, 0xff, 0x00, 0xf0, 0xe3, 0xf8, 0x00, 0xf0, + 0xb0, 0xf8, 0x94, 0xed, 0x00, 0x0a, 0x4f, 0x4c, 0xfd, 0xf7, 0xe0, 0xff, + 0x00, 0xf0, 0xb6, 0xf8, 0x00, 0xf0, 0xa7, 0xf8, 0x00, 0xf0, 0xb8, 0xf8, + 0x00, 0xf0, 0xcb, 0xf8, 0xfd, 0xf7, 0x83, 0xff, 0xb0, 0xee, 0x40, 0x9a, + 0xf0, 0xee, 0x60, 0x9a, 0x00, 0xf0, 0x8e, 0xf8, 0xc0, 0x46, 0xc0, 0x46, + 0xb0, 0xee, 0x40, 0xba, 0x00, 0xf0, 0x88, 0xf8, 0xc0, 0x46, 0xc0, 0x46, + 0x2b, 0xee, 0x00, 0xba, 0x00, 0xf0, 0x82, 0xf8, 0xb0, 0xee, 0x60, 0x0a, + 0xf0, 0xee, 0x40, 0xba, 0x00, 0xf0, 0x7c, 0xf8, 0xb0, 0xee, 0x60, 0x0a, + 0x6b, 0xee, 0x80, 0xba, 0x00, 0xf0, 0x9e, 0xf8, 0xc0, 0x46, 0xc0, 0x46, + 0xb0, 0xee, 0x40, 0xca, 0x00, 0xf0, 0x98, 0xf8, 0xc0, 0x46, 0xc0, 0x46, + 0x2c, 0xee, 0x00, 0xca, 0x00, 0xf0, 0x92, 0xf8, 0xb0, 0xee, 0x60, 0x0a, + 0xf0, 0xee, 0x40, 0xca, 0x00, 0xf0, 0x8c, 0xf8, 0xb0, 0xee, 0x60, 0x0a, + 0x0c, 0xee, 0x80, 0xca, 0x96, 0xed, 0x04, 0x0a, 0x3b, 0xee, 0x2b, 0x9a, + 0x2c, 0xee, 0x00, 0x0a, 0xb4, 0xee, 0x49, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x46, 0xd4, 0x00, 0xf0, 0x73, 0xf8, 0x00, 0xf0, 0x86, 0xf8, 0xfd, 0xf7, + 0x51, 0xff, 0x00, 0xf0, 0x5a, 0xf8, 0x00, 0xf0, 0x5d, 0xf8, 0xc0, 0x46, + 0xc0, 0x46, 0xb0, 0xee, 0x40, 0x9a, 0x00, 0xf0, 0x57, 0xf8, 0xc0, 0x46, + 0xc0, 0x46, 0x29, 0xee, 0x00, 0x9a, 0x00, 0xf0, 0x51, 0xf8, 0xb0, 0xee, + 0x60, 0x0a, 0xf0, 0xee, 0x40, 0x9a, 0x00, 0xf0, 0x4b, 0xf8, 0xb0, 0xee, + 0x60, 0x0a, 0x69, 0xee, 0x80, 0x9a, 0x00, 0xf0, 0x3b, 0xf8, 0x00, 0xf0, + 0x5d, 0xf8, 0xc0, 0x46, 0xc0, 0x46, 0xb0, 0xee, 0x40, 0xaa, 0x00, 0xf0, + 0x33, 0xf8, 0x00, 0xf0, 0x55, 0xf8, 0xc0, 0x46, 0xc0, 0x46, 0x2a, 0xee, + 0x00, 0xba, 0x00, 0xf0, 0x2b, 0xf8, 0x00, 0xf0, 0x4d, 0xf8, 0xf0, 0xee, + 0x60, 0xaa, 0x00, 0xf0, 0x25, 0xf8, 0x00, 0xf0, 0x47, 0xf8, 0x0a, 0xee, + 0xa0, 0xba, 0x96, 0xed, 0x04, 0x0a, 0x39, 0xee, 0x29, 0x1a, 0x2b, 0xee, + 0x00, 0x0a, 0xb4, 0xee, 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x00, 0xd5, + 0x00, 0x25, 0xbd, 0xec, 0x0a, 0x8b, 0x28, 0x46, 0xf2, 0xbd, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0x43, 0xcd, 0xcc, 0xcc, 0x3d, 0xf4, 0x55, 0x00, 0x20, + 0xfc, 0x55, 0x00, 0x20, 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, + 0x94, 0xec, 0x02, 0x0a, 0xfd, 0xf7, 0xfa, 0xbe, 0xb0, 0xee, 0x48, 0x1a, + 0xf0, 0xee, 0x68, 0x1a, 0x70, 0x47, 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, + 0x60, 0x8a, 0x70, 0x47, 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, + 0x94, 0xec, 0x02, 0x0a, 0xfd, 0xf7, 0xe8, 0xbe, 0xb0, 0xee, 0x48, 0x1a, + 0xf0, 0xee, 0x68, 0x1a, 0xfd, 0xf7, 0xcf, 0xbe, 0xb0, 0xee, 0x48, 0x1a, + 0xf0, 0xee, 0x68, 0x1a, 0x97, 0xec, 0x02, 0x0a, 0xfd, 0xf7, 0xed, 0xbe, + 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, 0x94, 0xec, 0x02, 0x0a, + 0xfd, 0xf7, 0xbf, 0xbe, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x70, 0x47, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0xb0, 0xee, + 0x4a, 0x0a, 0xf0, 0xee, 0x6a, 0x0a, 0x70, 0x47, 0xb0, 0xee, 0x40, 0x1a, + 0xf0, 0xee, 0x60, 0x1a, 0x97, 0xec, 0x02, 0x0a, 0xfd, 0xf7, 0xcf, 0xbe, + 0x2d, 0xe9, 0xf8, 0x43, 0x81, 0x46, 0x00, 0xf0, 0xc5, 0xf8, 0x48, 0x46, + 0x00, 0xf0, 0x4c, 0xf9, 0x40, 0xf6, 0x94, 0x22, 0x23, 0x49, 0x80, 0x46, + 0xc4, 0xf7, 0x5e, 0xfb, 0x08, 0xf5, 0x3b, 0x66, 0x3e, 0x25, 0x08, 0xf1, + 0x0c, 0x01, 0x00, 0xf0, 0x3f, 0xf8, 0x08, 0xf1, 0x10, 0x01, 0x00, 0xf0, + 0x3b, 0xf8, 0x06, 0x24, 0x1a, 0xe0, 0x00, 0x2c, 0xf3, 0xd0, 0x07, 0xf1, + 0x18, 0x01, 0x00, 0xf0, 0x33, 0xf8, 0xf8, 0x69, 0x10, 0xf1, 0x01, 0x0f, + 0x03, 0xd0, 0x07, 0xf1, 0x1c, 0x01, 0x00, 0xf0, 0x2b, 0xf8, 0x38, 0x6a, + 0x10, 0xf1, 0x01, 0x0f, 0x03, 0xd0, 0x07, 0xf1, 0x20, 0x01, 0x00, 0xf0, + 0x23, 0xf8, 0x07, 0xf1, 0x24, 0x01, 0x00, 0xf0, 0x1f, 0xf8, 0x0b, 0x34, + 0x6d, 0x1e, 0x08, 0xeb, 0x84, 0x07, 0xe0, 0xd1, 0xc4, 0xf5, 0x3b, 0x74, + 0xff, 0x22, 0xa1, 0x00, 0x38, 0x46, 0xc4, 0xf7, 0x7f, 0xfb, 0xff, 0x22, + 0x42, 0xf2, 0x2c, 0x41, 0x06, 0xf6, 0xcc, 0x10, 0xc3, 0xf7, 0x32, 0xfd, + 0x43, 0xf2, 0xa4, 0x10, 0x30, 0x44, 0xbd, 0xe8, 0xf8, 0x43, 0xff, 0x22, + 0x4f, 0xf4, 0x2b, 0x71, 0xc3, 0xf7, 0x28, 0xbd, 0x10, 0xcb, 0x03, 0x01, + 0x48, 0x46, 0x00, 0xf0, 0xbc, 0xb8, 0x3e, 0xb5, 0x00, 0xf0, 0x29, 0xf8, + 0x0c, 0x21, 0x01, 0x91, 0x0b, 0x22, 0x00, 0x92, 0x00, 0xf2, 0xd4, 0x71, + 0x12, 0xe0, 0x3e, 0xb5, 0x00, 0xf0, 0x1f, 0xf8, 0x01, 0x46, 0x06, 0x20, + 0x01, 0x22, 0x00, 0x90, 0x01, 0x92, 0x00, 0x23, 0x0a, 0xe0, 0x3e, 0xb5, + 0x00, 0xf0, 0x15, 0xf8, 0x1a, 0x21, 0x01, 0x91, 0x0b, 0x22, 0x00, 0x92, + 0x00, 0xf1, 0x18, 0x01, 0x00, 0x23, 0x00, 0x22, 0x20, 0x46, 0x00, 0xf0, + 0xa1, 0xf8, 0x4f, 0xf4, 0x7a, 0x71, 0x20, 0x46, 0x00, 0xf0, 0xb7, 0xf8, + 0x00, 0x25, 0x00, 0xb1, 0x01, 0x25, 0x28, 0x46, 0x3e, 0xbd, 0x04, 0x46, + 0x00, 0xf0, 0xce, 0xb8, 0x3e, 0xb5, 0xff, 0xf7, 0xfa, 0xff, 0x23, 0x21, + 0x01, 0x91, 0x0b, 0x22, 0x00, 0x92, 0x00, 0xf5, 0x92, 0x61, 0xe3, 0xe7, + 0x00, 0xf0, 0xc2, 0xb8, 0x80, 0xb5, 0x00, 0xf0, 0xbf, 0xf8, 0x00, 0xf5, + 0x49, 0x60, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0xb9, 0xf8, 0x41, 0xf2, + 0xc8, 0x31, 0x08, 0x44, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0xb2, 0xf8, + 0x41, 0xf2, 0xb0, 0x41, 0x08, 0x44, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, + 0xab, 0xf8, 0x43, 0xf6, 0xa8, 0x11, 0x08, 0x44, 0x02, 0xbd, 0x80, 0xb5, + 0x00, 0xf0, 0xa4, 0xf8, 0x43, 0xf6, 0xbc, 0x11, 0x08, 0x44, 0x02, 0xbd, + 0x80, 0xb5, 0x00, 0xf0, 0x9d, 0xf8, 0x41, 0xf2, 0xb4, 0x41, 0x08, 0x44, + 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x96, 0xf8, 0x41, 0xf2, 0x64, 0x51, + 0x08, 0x44, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x8f, 0xf8, 0x41, 0xf2, + 0x74, 0x51, 0x08, 0x44, 0x02, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x04, 0x46, + 0x50, 0x48, 0x51, 0x4e, 0x50, 0xf8, 0x24, 0x50, 0x06, 0xeb, 0x84, 0x07, + 0x04, 0x21, 0x07, 0xf5, 0x29, 0x70, 0xd6, 0xf7, 0x01, 0xfe, 0x50, 0x21, + 0x03, 0x22, 0x61, 0x43, 0x00, 0x92, 0x31, 0x44, 0x01, 0xf1, 0x24, 0x03, + 0x00, 0x22, 0x00, 0x21, 0x01, 0x20, 0xe1, 0xf7, 0x6f, 0xfe, 0x78, 0x60, + 0x81, 0x20, 0xdc, 0xf7, 0x77, 0xfc, 0x01, 0x46, 0x01, 0x20, 0x00, 0xfa, + 0x04, 0xf4, 0x21, 0x43, 0x81, 0x20, 0xdc, 0xf7, 0x44, 0xfc, 0x82, 0x20, + 0xdc, 0xf7, 0x6c, 0xfc, 0x44, 0xea, 0x00, 0x01, 0x82, 0x20, 0xdc, 0xf7, + 0x3c, 0xfc, 0x30, 0x78, 0xa8, 0xb9, 0x81, 0x20, 0xdc, 0xf7, 0xa6, 0xfb, + 0x82, 0x20, 0xdc, 0xf7, 0xa3, 0xfb, 0x06, 0x21, 0x81, 0x20, 0xdc, 0xf7, + 0x0a, 0xfc, 0x06, 0x21, 0x82, 0x20, 0xdc, 0xf7, 0x06, 0xfc, 0x81, 0x20, + 0xdc, 0xf7, 0xe9, 0xfb, 0x82, 0x20, 0xdc, 0xf7, 0xe6, 0xfb, 0x01, 0x20, + 0x30, 0x70, 0x31, 0x49, 0x45, 0xf8, 0x58, 0x1f, 0xf1, 0xbd, 0x30, 0x4b, + 0x0a, 0x68, 0x53, 0xf8, 0x20, 0x00, 0x82, 0x18, 0x0a, 0x60, 0x70, 0x47, + 0x70, 0xb5, 0x00, 0x2a, 0x2c, 0x4c, 0x54, 0xf8, 0x20, 0x40, 0x0c, 0xbf, + 0x26, 0x4a, 0x2b, 0x4a, 0x26, 0x1d, 0x52, 0xf8, 0x20, 0x50, 0x05, 0x9a, + 0x04, 0x98, 0x30, 0x60, 0x5b, 0x19, 0x04, 0xf1, 0x08, 0x00, 0x01, 0x60, + 0x04, 0xf1, 0x0c, 0x01, 0x0b, 0x60, 0x04, 0xf1, 0x10, 0x03, 0x1a, 0x60, + 0x01, 0x22, 0x22, 0x60, 0x70, 0xbd, 0x38, 0xb5, 0x1f, 0x4a, 0x1b, 0x4b, + 0x52, 0xf8, 0x20, 0x50, 0x53, 0xf8, 0x20, 0x40, 0x19, 0x4a, 0x02, 0xeb, + 0x80, 0x03, 0x58, 0x68, 0xe1, 0xf7, 0xc6, 0xff, 0x20, 0xb9, 0x04, 0x21, + 0x44, 0xf8, 0x30, 0x1f, 0x02, 0x20, 0x32, 0xbd, 0x55, 0xf8, 0x1c, 0x0f, + 0x41, 0x07, 0x05, 0xd5, 0x04, 0x22, 0x01, 0x20, 0x2a, 0x60, 0x44, 0xf8, + 0x3c, 0x0f, 0x32, 0xbd, 0x00, 0x20, 0x32, 0xbd, 0x0f, 0x49, 0x51, 0xf8, + 0x20, 0x00, 0x70, 0x47, 0x80, 0xb5, 0x00, 0x22, 0x00, 0x92, 0x69, 0x46, + 0x09, 0x4b, 0x03, 0xeb, 0x80, 0x02, 0x50, 0x68, 0xe1, 0xf7, 0x0c, 0xff, + 0x00, 0x98, 0x38, 0xb1, 0x0a, 0x48, 0x4f, 0xf0, 0x80, 0x51, 0x01, 0x60, + 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x01, 0xbd, 0x00, 0x00, + 0xa8, 0x95, 0x04, 0x01, 0x30, 0x3e, 0x02, 0x20, 0xd6, 0xff, 0xff, 0x07, + 0xc8, 0x95, 0x04, 0x01, 0x08, 0x96, 0x04, 0x01, 0xe8, 0x95, 0x04, 0x01, + 0x04, 0xed, 0x00, 0xe0, 0x38, 0xb5, 0x81, 0x20, 0xdc, 0xf7, 0x2d, 0xfb, + 0x04, 0x46, 0x00, 0x25, 0x24, 0xfa, 0x05, 0xf0, 0xc0, 0x07, 0x44, 0xbf, + 0x28, 0x46, 0xff, 0xf7, 0xcf, 0xff, 0x6d, 0x1c, 0x08, 0x2d, 0xf5, 0xd3, + 0x31, 0xbd, 0x38, 0xb5, 0x82, 0x20, 0xdc, 0xf7, 0x1c, 0xfb, 0x04, 0x46, + 0x00, 0x25, 0x24, 0xfa, 0x05, 0xf0, 0xc0, 0x07, 0x44, 0xbf, 0x28, 0x46, + 0xff, 0xf7, 0xbe, 0xff, 0x6d, 0x1c, 0x08, 0x2d, 0xf5, 0xd3, 0x31, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x3c, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, + 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x78, 0x0c, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x03, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x0c, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0x0c, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x01, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0b, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, + 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcc, 0x0b, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x03, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x0b, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x01, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0b, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x0c, 0x00, 0x00, 0x38, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x3c, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1c, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, 0xe4, 0x3c, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xc8, 0x13, 0x00, 0x00, 0x90, 0x0c, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x14, 0x00, 0x00, 0x38, 0x14, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xe4, 0x3c, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, + 0x1c, 0x1c, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0d, 0x00, 0x00, 0xe4, 0x3c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x0d, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x14, 0x00, 0x00, + 0xac, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x3c, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x01, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x1c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x3c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb4, 0x14, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x0c, 0x00, 0x00, + 0xb0, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x3c, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x01, 0x00, 0x00, 0xbc, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x3c, 0x00, 0x00, 0xbc, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb8, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x14, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x0c, 0x00, 0x00, + 0xb0, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x3c, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x01, 0x00, 0x00, 0xe8, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x3c, 0x00, 0x00, 0xe8, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, + 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb4, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0c, 0x15, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x01, 0x00, 0x07, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x15, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x3c, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x11, 0x01, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd0, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x28, 0x15, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x01, 0x00, + 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x3c, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0xf1, 0xee, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x01, 0x00, 0x01, 0x07, 0x00, 0x00, + 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x0b, 0x00, 0x00, + 0x0c, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x64, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf1, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x01, 0x00, 0x01, 0x07, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xcc, 0x0b, 0x00, 0x00, 0x0c, 0x15, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x68, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf1, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x01, 0x00, + 0x01, 0x0f, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0c, 0x00, 0x00, 0x28, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x6c, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xee, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x01, 0x00, 0x01, 0x0f, 0x00, 0x00, + 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x0c, 0x00, 0x00, + 0x28, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x70, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x22, 0x01, 0x00, 0x02, 0x07, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb0, 0x0b, 0x00, 0x00, 0xbc, 0x39, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x22, 0x01, 0x00, + 0x02, 0x03, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe8, 0x0b, 0x00, 0x00, 0xcc, 0x39, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x34, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x22, 0x01, 0x00, 0x02, 0x0f, 0x00, 0x00, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, + 0xdc, 0x39, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x4c, 0x3a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x22, 0x01, 0x00, 0x02, 0x03, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x00, 0x00, 0xec, 0x39, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xc4, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, + 0x1c, 0x02, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0x39, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xdc, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x02, 0x1c, 0x00, 0x00, + 0x1c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x3a, 0x00, 0x00, + 0xfc, 0x39, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xbc, 0x3b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xbc, 0x3b, 0x00, 0x00, 0xb8, 0x39, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xc8, 0x3b, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x01, 0x00, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc8, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x3b, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x01, 0x00, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0xe0, 0x3b, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x39, 0x00, 0x00, 0xe0, 0x3b, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe8, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xec, 0x3b, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x01, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe4, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x3b, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x02, 0x00, 0x00, + 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3b, 0x00, 0x00, + 0xec, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf8, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x3b, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf8, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x3c, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3b, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x3b, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4a, 0x00, 0x01, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xec, 0x3b, 0x00, 0x00, 0xf8, 0x3b, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xec, 0x3b, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, + 0x02, 0x1c, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xdc, 0x3a, 0x00, 0x00, 0xec, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x04, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1c, 0x02, 0x00, 0x00, + 0x02, 0x01, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, 0x04, 0x3c, 0x00, 0x00, + 0xa8, 0x39, 0x00, 0x00, 0x90, 0x0c, 0x00, 0x00, 0x90, 0x0c, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x01, 0x00, 0x1c, 0x02, 0x00, 0x00, 0x02, 0x1c, 0x00, 0x00, + 0x1c, 0x1c, 0x00, 0x00, 0x04, 0x3c, 0x00, 0x00, 0xdc, 0x3a, 0x00, 0x00, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb4, 0x14, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x0c, 0x00, 0x00, + 0xb0, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x3c, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x01, 0x00, 0x00, 0xbc, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x3c, 0x00, 0x00, 0xbc, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb8, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x14, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x0c, 0x00, 0x00, + 0xb0, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x3c, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x01, 0x00, 0x00, 0xe8, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x3c, 0x00, 0x00, 0xe8, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, + 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb4, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0c, 0x15, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x01, 0x00, 0x07, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x15, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x3c, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x11, 0x01, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd0, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x28, 0x15, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x01, 0x00, + 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x3c, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x0f, 0x00, 0x00, + 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x14, 0x00, 0x00, + 0xd0, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x74, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x01, 0x07, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x14, 0x00, 0x00, 0xb4, 0x14, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf1, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x01, 0x00, + 0x01, 0x07, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0x0b, 0x00, 0x00, 0x0c, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x64, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xee, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x01, 0x00, 0x01, 0x07, 0x00, 0x00, + 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x0b, 0x00, 0x00, + 0x0c, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x68, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf1, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x01, 0x00, 0x01, 0x0f, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x28, 0x15, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x6c, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf1, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x01, 0x00, + 0x01, 0x0f, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x0c, 0x00, 0x00, 0x28, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, + 0x2d, 0xed, 0x0a, 0x8b, 0x0d, 0x46, 0xad, 0xf5, 0x08, 0x7d, 0x2f, 0x69, + 0x0b, 0x97, 0x80, 0x46, 0xa9, 0x68, 0xe8, 0x68, 0xd5, 0xf8, 0x14, 0x90, + 0x00, 0x26, 0x0e, 0x60, 0x4e, 0x60, 0x06, 0xa9, 0x04, 0x91, 0x07, 0xaa, + 0x05, 0xab, 0x03, 0x92, 0x02, 0x93, 0x0d, 0xf1, 0x16, 0x01, 0x01, 0x91, + 0x08, 0xa9, 0x00, 0x91, 0x90, 0xf8, 0x5e, 0x30, 0xc2, 0x68, 0x81, 0x68, + 0x90, 0xed, 0x04, 0x0a, 0x40, 0x46, 0x00, 0xf0, 0x01, 0xfd, 0x04, 0x46, + 0x08, 0x99, 0x48, 0x46, 0x41, 0x60, 0xc0, 0x46, 0x00, 0x2c, 0x4f, 0xd1, + 0x07, 0xf1, 0x08, 0x01, 0x10, 0x22, 0x0c, 0xa8, 0x01, 0x91, 0x00, 0x92, + 0x02, 0x90, 0x06, 0x9a, 0x07, 0x99, 0x04, 0x23, 0x40, 0x46, 0x00, 0xf0, + 0x40, 0xfd, 0xf0, 0xb9, 0x00, 0x23, 0x0c, 0x22, 0x39, 0x46, 0x0d, 0xac, + 0x02, 0xfb, 0x03, 0xf7, 0x0d, 0xf1, 0x30, 0x0c, 0x01, 0xeb, 0x03, 0x10, + 0x5c, 0xf8, 0x07, 0xe0, 0x40, 0xf8, 0x20, 0xef, 0x0d, 0xf1, 0x38, 0x0e, + 0x54, 0xf8, 0x07, 0xc0, 0xa0, 0xf8, 0x04, 0xc0, 0x5b, 0x1c, 0x5e, 0xf8, + 0x07, 0x70, 0xc7, 0x80, 0x04, 0x2b, 0x87, 0x88, 0x07, 0x81, 0x46, 0x81, + 0x86, 0x81, 0xe5, 0xd3, 0x0f, 0x46, 0x41, 0x22, 0x07, 0xf1, 0x90, 0x01, + 0x07, 0xf1, 0x78, 0x00, 0x00, 0xf0, 0xa2, 0xfe, 0x78, 0x1c, 0x01, 0x22, + 0x06, 0x70, 0x42, 0x70, 0x38, 0x1d, 0x06, 0x99, 0x01, 0x60, 0x86, 0x60, + 0xc6, 0x60, 0x06, 0x61, 0x07, 0xf1, 0x62, 0x00, 0xbd, 0xf8, 0x16, 0x10, + 0x01, 0x80, 0xbd, 0xf8, 0x14, 0x20, 0x42, 0x80, 0x07, 0xf1, 0x68, 0x00, + 0x07, 0x99, 0x01, 0x60, 0x01, 0x22, 0xc6, 0x63, 0x46, 0x63, 0x86, 0x63, + 0x82, 0x72, 0x06, 0x72, 0xf4, 0xe2, 0x30, 0x46, 0x00, 0xf0, 0x98, 0xfc, + 0x40, 0x46, 0xf6, 0xf7, 0xcd, 0xfb, 0xf0, 0x60, 0x0d, 0xaf, 0x00, 0x20, + 0x01, 0x01, 0x06, 0xf1, 0x28, 0x02, 0x53, 0x5a, 0x47, 0xf8, 0x20, 0x30, + 0x31, 0x44, 0x11, 0xab, 0x0a, 0x6a, 0x00, 0x99, 0x52, 0x1a, 0x43, 0xf8, + 0x20, 0x20, 0x40, 0x1c, 0x04, 0x28, 0xef, 0xd3, 0x70, 0x68, 0x15, 0x90, + 0x15, 0xa8, 0xb1, 0x68, 0x01, 0x71, 0x06, 0xf1, 0x62, 0x0b, 0x04, 0xf1, + 0x5e, 0x01, 0x4a, 0x78, 0x42, 0x71, 0xd9, 0xf8, 0x00, 0x30, 0x83, 0x60, + 0xbb, 0xf8, 0x00, 0x20, 0x82, 0x81, 0x09, 0x78, 0x81, 0x73, 0xb2, 0x78, + 0xc2, 0x73, 0xa1, 0x6a, 0x01, 0x61, 0x40, 0x46, 0x0d, 0xa9, 0x00, 0xf0, + 0xdb, 0xfe, 0x07, 0x00, 0x3f, 0xd1, 0x61, 0x6a, 0x40, 0x46, 0x00, 0xf0, + 0x3b, 0xff, 0x01, 0x28, 0x03, 0xd1, 0x43, 0xf2, 0x03, 0x27, 0x00, 0x20, + 0x2b, 0xe0, 0x02, 0x28, 0x05, 0xd1, 0xda, 0xf8, 0x1c, 0x00, 0x40, 0x1c, + 0xca, 0xf8, 0x1c, 0x00, 0x2b, 0xe0, 0x01, 0xaa, 0x0d, 0xa9, 0x40, 0x46, + 0x00, 0xf0, 0x2c, 0xff, 0xf8, 0xb9, 0xb0, 0x70, 0x01, 0x99, 0x31, 0x61, + 0x02, 0x98, 0x70, 0x61, 0x03, 0x98, 0xb0, 0x61, 0x04, 0x98, 0xf0, 0x61, + 0x01, 0x20, 0x01, 0x99, 0x02, 0x9a, 0x06, 0xeb, 0x01, 0x11, 0x90, 0x40, + 0x0b, 0x8d, 0x8a, 0x8d, 0x83, 0x43, 0x0b, 0x85, 0x02, 0x42, 0x04, 0xbf, + 0x01, 0x22, 0xf2, 0x70, 0x8b, 0x8d, 0x4a, 0x8d, 0x02, 0x43, 0x18, 0x43, + 0x88, 0x85, 0x4a, 0x85, 0x01, 0x20, 0x30, 0x70, 0x07, 0xe0, 0x03, 0x28, + 0x92, 0xd0, 0x9b, 0xf8, 0x10, 0x00, 0x00, 0x28, 0x8b, 0xd0, 0x00, 0x21, + 0x31, 0x70, 0x30, 0x78, 0x10, 0xb9, 0x40, 0x46, 0xf6, 0xf7, 0x98, 0xfc, + 0x00, 0x2f, 0x40, 0xf0, 0x3a, 0x82, 0x0b, 0x98, 0x01, 0x78, 0x01, 0x29, + 0x40, 0xf0, 0xd8, 0x81, 0xd5, 0xf8, 0x0c, 0xb0, 0xd5, 0xf8, 0x10, 0x90, + 0x69, 0x69, 0x10, 0x91, 0x01, 0x22, 0x8d, 0xf8, 0x28, 0x20, 0x0a, 0xab, + 0x06, 0x22, 0x01, 0x21, 0x40, 0x46, 0xef, 0xf7, 0xea, 0xf9, 0x00, 0x24, + 0x07, 0x00, 0x09, 0xf1, 0x60, 0x0a, 0x21, 0xd1, 0x40, 0x46, 0xef, 0xf7, + 0x87, 0xf9, 0x0d, 0xa9, 0x40, 0x46, 0xd0, 0xf7, 0xdf, 0xfb, 0x01, 0x24, + 0x07, 0x00, 0x17, 0xd1, 0x04, 0xa9, 0x40, 0x46, 0xd1, 0xf7, 0x9f, 0xfa, + 0x40, 0x46, 0xd1, 0xf7, 0x62, 0xfb, 0x03, 0x90, 0x04, 0xab, 0x0d, 0x98, + 0x02, 0x90, 0x41, 0xaa, 0xda, 0xf8, 0x08, 0x10, 0x01, 0x91, 0x11, 0xa9, + 0xd9, 0xf8, 0x18, 0x00, 0x00, 0x90, 0x0b, 0xf1, 0x30, 0x00, 0x00, 0xf0, + 0x63, 0xff, 0x07, 0x46, 0x00, 0x2f, 0x57, 0xae, 0x41, 0xd1, 0x0b, 0xf1, + 0x54, 0x01, 0x88, 0x88, 0x0e, 0x90, 0x00, 0x20, 0xca, 0x88, 0x0f, 0x92, + 0x0d, 0xf1, 0x2a, 0x02, 0x10, 0x80, 0x9a, 0xf8, 0x10, 0x00, 0x08, 0xb9, + 0x08, 0x89, 0x0e, 0x90, 0x57, 0xa8, 0xcd, 0xf8, 0x24, 0xa0, 0x08, 0x92, + 0x07, 0x90, 0x0a, 0x27, 0x0b, 0x68, 0x06, 0x93, 0x00, 0x22, 0x05, 0x97, + 0x04, 0x92, 0x0e, 0xab, 0xc8, 0x7a, 0x03, 0x90, 0x02, 0x93, 0x9f, 0xed, + 0x67, 0x0a, 0x89, 0x7a, 0x9d, 0xf8, 0x28, 0x20, 0x01, 0x91, 0x41, 0xa9, + 0xba, 0xf8, 0x04, 0x00, 0x00, 0x90, 0x40, 0x46, 0xba, 0xf8, 0x02, 0x30, + 0x00, 0xf0, 0x64, 0xfc, 0x07, 0x46, 0xd9, 0xf8, 0x0c, 0x00, 0x86, 0xf8, + 0x5e, 0x00, 0x96, 0xf8, 0x5e, 0x10, 0x8d, 0xf8, 0x1a, 0x12, 0x9a, 0xf8, + 0x00, 0x00, 0x40, 0xb9, 0xda, 0xf8, 0x48, 0x30, 0xd9, 0xf8, 0x18, 0x10, + 0x10, 0x98, 0x0d, 0xf1, 0x2a, 0x02, 0x01, 0xf0, 0xe0, 0xf8, 0x1c, 0xb1, + 0x05, 0x21, 0x40, 0x46, 0xef, 0xf7, 0x2d, 0xf9, 0x0a, 0xab, 0x06, 0x22, + 0x01, 0x21, 0x40, 0x46, 0xef, 0xf7, 0x9d, 0xf9, 0x40, 0x46, 0xf6, 0xf7, + 0x07, 0xfc, 0x00, 0x2f, 0x40, 0xf0, 0xa9, 0x81, 0x0c, 0x99, 0x08, 0x78, + 0x00, 0x28, 0x00, 0xf0, 0xa4, 0x81, 0xd5, 0xf8, 0x00, 0xa0, 0xcd, 0xf8, + 0x24, 0xa0, 0x69, 0x68, 0x08, 0x91, 0xd5, 0xf8, 0x0c, 0x90, 0xcd, 0xf8, + 0x14, 0x90, 0x2c, 0x69, 0x04, 0x94, 0xaa, 0x68, 0x02, 0xf1, 0x28, 0x00, + 0x07, 0x90, 0x6b, 0x69, 0x06, 0x92, 0x0a, 0x93, 0x04, 0x9a, 0xd7, 0x68, + 0x01, 0x91, 0xd4, 0xf8, 0xa8, 0x10, 0x00, 0x91, 0xdb, 0xf7, 0xd4, 0xfa, + 0x83, 0x46, 0x00, 0x98, 0x59, 0x46, 0xdb, 0xf7, 0x13, 0xfb, 0x02, 0x46, + 0xe0, 0x78, 0x01, 0x28, 0x10, 0xd1, 0x00, 0x21, 0xe1, 0x70, 0x00, 0x92, + 0x96, 0xed, 0x1b, 0x0a, 0xd9, 0xed, 0x0b, 0x0a, 0x20, 0xee, 0x20, 0x0a, + 0xc3, 0xf7, 0x12, 0xfc, 0xbc, 0xee, 0xc0, 0x0a, 0x00, 0x9a, 0x10, 0xee, + 0x10, 0x0a, 0x82, 0x18, 0x09, 0xf1, 0x2c, 0x00, 0xc4, 0xf8, 0xa8, 0xb0, + 0x81, 0x6c, 0x8a, 0x42, 0x88, 0xbf, 0x0a, 0x46, 0x01, 0x99, 0x50, 0x46, + 0xfb, 0xf7, 0x48, 0xfe, 0x02, 0x21, 0x40, 0x46, 0x00, 0xf0, 0x1b, 0xfd, + 0x00, 0x23, 0x00, 0xf0, 0xf8, 0xf9, 0x81, 0x46, 0x01, 0x23, 0x00, 0xf0, + 0xf4, 0xf9, 0x03, 0x90, 0x82, 0x46, 0x0c, 0xa9, 0x57, 0xa8, 0x00, 0x91, + 0x01, 0x90, 0x0a, 0x9b, 0x08, 0x9a, 0x09, 0x99, 0xcd, 0xf8, 0x08, 0x90, + 0x40, 0x46, 0x00, 0xf0, 0x99, 0xfc, 0x04, 0x46, 0x04, 0x98, 0xb9, 0xf1, + 0x00, 0x0f, 0x00, 0xf1, 0x70, 0x0b, 0x06, 0xd0, 0xdb, 0xf8, 0x38, 0x30, + 0x07, 0x98, 0x0c, 0xaa, 0x57, 0xa9, 0x00, 0xf0, 0x62, 0xfa, 0xba, 0xf1, + 0x00, 0x0f, 0x06, 0xd0, 0xdb, 0xf8, 0x38, 0x30, 0x07, 0x98, 0x16, 0xaa, + 0x6f, 0xa9, 0x00, 0xf0, 0x58, 0xfa, 0x6c, 0xbb, 0x04, 0x98, 0x78, 0x30, + 0x00, 0xf0, 0x14, 0xfd, 0x04, 0x99, 0x48, 0x78, 0x60, 0xb1, 0x04, 0x98, + 0x00, 0x21, 0x41, 0x70, 0x09, 0x98, 0x08, 0x99, 0xfc, 0xf7, 0x12, 0xfa, + 0x9b, 0xf8, 0x00, 0x00, 0x10, 0xb1, 0x40, 0x1e, 0x8b, 0xf8, 0x00, 0x00, + 0x05, 0x99, 0x48, 0x6e, 0x87, 0x42, 0x34, 0xbf, 0x00, 0x21, 0x39, 0x1a, + 0xc7, 0x19, 0x41, 0x2f, 0x88, 0xbf, 0x41, 0x27, 0x00, 0x20, 0x0c, 0x46, + 0x07, 0xe0, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x01, 0x23, 0xe2, 0xb2, + 0x00, 0xf0, 0x8e, 0xf9, 0x64, 0x1c, 0xa7, 0x42, 0x01, 0xd3, 0x00, 0x28, + 0xf6, 0xd0, 0x04, 0x46, 0x00, 0x2c, 0x08, 0xbf, 0xba, 0xf1, 0x01, 0x0f, + 0x0c, 0xaf, 0x6d, 0xd1, 0x96, 0xed, 0x1b, 0xca, 0xd7, 0xed, 0x0b, 0xca, + 0xdf, 0xf8, 0xac, 0xa5, 0x72, 0xae, 0x00, 0xf0, 0x84, 0xf9, 0x00, 0xf0, + 0x86, 0xf9, 0x00, 0xf0, 0x78, 0xf9, 0x00, 0xf0, 0x6c, 0xf9, 0xb0, 0xee, + 0x40, 0xba, 0x00, 0xf0, 0x7a, 0xf9, 0x00, 0xf0, 0x7c, 0xf9, 0x00, 0xf0, + 0x6e, 0xf9, 0x00, 0xf0, 0x62, 0xf9, 0xb0, 0xee, 0x40, 0x8a, 0x00, 0xf0, + 0x70, 0xf9, 0x00, 0xf0, 0x72, 0xf9, 0xb0, 0xee, 0x40, 0x9a, 0xf0, 0xee, + 0x60, 0x9a, 0x96, 0xed, 0x01, 0x0a, 0xfc, 0xf7, 0xb5, 0xfd, 0xb0, 0xee, + 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, 0xfc, 0xf7, 0x5c, 0xfd, 0xf0, 0xee, + 0x60, 0x9a, 0x00, 0xf0, 0x5c, 0xf9, 0x00, 0xf0, 0x5e, 0xf9, 0xb0, 0xee, + 0x40, 0xaa, 0xf0, 0xee, 0x60, 0xaa, 0x96, 0xed, 0x01, 0x0a, 0xfc, 0xf7, + 0xa1, 0xfd, 0xb0, 0xee, 0x4a, 0x1a, 0xf0, 0xee, 0x6a, 0x1a, 0xfc, 0xf7, + 0x48, 0xfd, 0x2b, 0xee, 0x08, 0x1a, 0x09, 0xee, 0xa0, 0x1a, 0x2c, 0xee, + 0x0c, 0x0a, 0x81, 0xee, 0x00, 0x0a, 0x05, 0x98, 0x90, 0xed, 0x05, 0x1a, + 0xd0, 0xed, 0x07, 0x0a, 0xb4, 0xee, 0x41, 0xca, 0xf1, 0xee, 0x10, 0xfa, + 0x58, 0xbf, 0xb0, 0xee, 0x41, 0xca, 0x81, 0xee, 0x0c, 0x1a, 0x61, 0xee, + 0x20, 0x0a, 0x90, 0xed, 0x06, 0x1a, 0xb4, 0xee, 0x40, 0x1a, 0xf1, 0xee, + 0x10, 0xfa, 0x58, 0xbf, 0xb0, 0xee, 0x41, 0x0a, 0x80, 0xee, 0x01, 0x0a, + 0x20, 0xee, 0x20, 0x0a, 0xb4, 0xee, 0x6c, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x44, 0xbf, 0x00, 0x20, 0x8b, 0xf8, 0x02, 0x00, 0xb9, 0xf1, 0x01, 0x0f, + 0x0c, 0xd1, 0x05, 0x98, 0xd7, 0xed, 0x01, 0x0a, 0x90, 0xed, 0x08, 0x0a, + 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xbf, 0x02, 0x20, + 0x8b, 0xf8, 0x00, 0x00, 0x60, 0x1e, 0x80, 0x41, 0xc0, 0x0f, 0x8b, 0xf8, + 0x01, 0x00, 0x9b, 0xf8, 0x01, 0x00, 0x00, 0x28, 0x1c, 0xbf, 0x9d, 0xf8, + 0x7d, 0x00, 0x00, 0x28, 0x12, 0xd0, 0x06, 0x98, 0x01, 0x69, 0x49, 0x1c, + 0x01, 0x61, 0x97, 0xed, 0x0b, 0x0a, 0xc3, 0xf7, 0x5f, 0xfc, 0xfa, 0xee, + 0x04, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xc3, 0xf7, 0x01, 0xfb, 0x06, 0x98, + 0xbc, 0xee, 0xc0, 0x0a, 0x80, 0xed, 0x02, 0x0a, 0x27, 0x46, 0x5c, 0xe0, + 0xef, 0x68, 0x2c, 0x69, 0x04, 0x21, 0x40, 0x46, 0x00, 0x26, 0x00, 0xf0, + 0x12, 0xfc, 0xb1, 0x46, 0xb8, 0x6e, 0x81, 0x45, 0x17, 0xd2, 0xd4, 0xf8, + 0xa4, 0x10, 0x04, 0xf1, 0x78, 0x00, 0x00, 0xf0, 0x66, 0xfc, 0x20, 0xb1, + 0xd4, 0xf8, 0xa4, 0x20, 0x00, 0xf0, 0xe7, 0xf8, 0x06, 0x46, 0xd4, 0xf8, + 0xa4, 0x00, 0x40, 0x1c, 0x41, 0x28, 0x28, 0xbf, 0x00, 0x20, 0x00, 0x2e, + 0xc4, 0xf8, 0xa4, 0x00, 0x09, 0xf1, 0x01, 0x09, 0xe4, 0xd0, 0x37, 0x46, + 0x00, 0x20, 0x00, 0x23, 0x04, 0xeb, 0x00, 0x11, 0x20, 0x31, 0x40, 0x1c, + 0x4a, 0x89, 0x8a, 0x81, 0x04, 0x28, 0x4b, 0x81, 0xf6, 0xd3, 0x01, 0x20, + 0xa0, 0x70, 0x20, 0x46, 0x00, 0xf0, 0x0c, 0xfa, 0xeb, 0xf7, 0x76, 0xfd, + 0x00, 0x28, 0x08, 0xbf, 0x00, 0x2f, 0x22, 0xd1, 0xd5, 0xf8, 0x10, 0xa0, + 0xda, 0xf8, 0x0c, 0x60, 0xec, 0x68, 0xd5, 0xf8, 0x08, 0x90, 0x00, 0x23, + 0x00, 0xf0, 0x9d, 0xf8, 0x07, 0x46, 0xd9, 0xf8, 0x0c, 0x10, 0x64, 0x20, + 0xc9, 0xf8, 0x04, 0x00, 0x49, 0x1c, 0xc9, 0xf8, 0x0c, 0x10, 0xe0, 0x6e, + 0xdf, 0xf7, 0xdc, 0xfe, 0x00, 0x20, 0xc9, 0xf8, 0x04, 0x00, 0x00, 0x21, + 0x0a, 0xf1, 0x9c, 0x00, 0x01, 0x60, 0x41, 0x60, 0x1f, 0xb9, 0x01, 0x23, + 0x00, 0xf0, 0x85, 0xf8, 0x07, 0x46, 0x29, 0x46, 0x40, 0x46, 0x01, 0xf0, + 0x2c, 0xfa, 0x3e, 0x46, 0x2f, 0x69, 0xec, 0x68, 0x69, 0x68, 0x28, 0x68, + 0xfc, 0xf7, 0x50, 0xfc, 0x04, 0xf1, 0x8c, 0x01, 0x07, 0xf1, 0x9c, 0x02, + 0xf8, 0xb9, 0x43, 0xf2, 0x0c, 0x20, 0x86, 0x42, 0x1c, 0xbf, 0x43, 0xf2, + 0x06, 0x23, 0x9e, 0x42, 0x18, 0xd0, 0x43, 0xf2, 0x03, 0x20, 0x86, 0x42, + 0x1c, 0xbf, 0x43, 0xf2, 0x01, 0x23, 0x9e, 0x42, 0x07, 0xd0, 0x4f, 0xf6, + 0x70, 0x70, 0x86, 0x42, 0x1c, 0xbf, 0x4f, 0xf6, 0x78, 0x73, 0x9e, 0x42, + 0x14, 0xd1, 0x10, 0x68, 0x40, 0x1c, 0x10, 0x60, 0x09, 0x68, 0x81, 0x42, + 0x0e, 0xd3, 0x03, 0x22, 0x07, 0xe0, 0x06, 0x46, 0x50, 0x68, 0x40, 0x1c, + 0x50, 0x60, 0x4b, 0x68, 0x83, 0x42, 0xe0, 0xd3, 0x00, 0x22, 0x29, 0x46, + 0x40, 0x46, 0x00, 0xf0, 0x64, 0xf9, 0x00, 0x26, 0xeb, 0xf7, 0x10, 0xfd, + 0x30, 0xbb, 0x2e, 0xbb, 0x0b, 0x99, 0xc8, 0x70, 0x00, 0x27, 0x0b, 0x99, + 0x08, 0x70, 0x00, 0x21, 0x0b, 0x98, 0x00, 0xf1, 0x60, 0x02, 0x0c, 0x92, + 0x11, 0x70, 0x00, 0x22, 0x0c, 0x99, 0x4a, 0x74, 0xec, 0x68, 0x2e, 0x69, + 0xd5, 0xf8, 0x08, 0xa0, 0x01, 0x21, 0x40, 0x46, 0x00, 0xf0, 0x65, 0xfb, + 0x69, 0x46, 0x40, 0x46, 0xd0, 0xf7, 0x6a, 0xf9, 0x04, 0xf1, 0x60, 0x09, + 0x40, 0x46, 0xd9, 0xf8, 0x10, 0x10, 0xf6, 0xf7, 0xf5, 0xf9, 0x02, 0x28, + 0x7f, 0xf4, 0xe6, 0xac, 0x37, 0x70, 0x5b, 0xe5, 0x30, 0x00, 0xae, 0x68, + 0x03, 0xd1, 0x28, 0x69, 0xc2, 0x68, 0x00, 0xf0, 0x32, 0xf8, 0x01, 0x00, + 0x72, 0x69, 0x18, 0xbf, 0x01, 0x21, 0x52, 0xfa, 0x81, 0xf1, 0x71, 0x61, + 0x30, 0x60, 0x64, 0x23, 0x73, 0x60, 0x0d, 0xf5, 0x08, 0x7d, 0xbd, 0xec, + 0x0a, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, + 0x68, 0x1a, 0xfc, 0xf7, 0x08, 0xbc, 0xf2, 0xb2, 0x29, 0x46, 0x40, 0x46, + 0x8b, 0xe0, 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, 0x60, 0x8a, 0x96, 0xed, + 0x01, 0x0a, 0xfc, 0xf7, 0x4f, 0xbc, 0x96, 0xed, 0x03, 0x0a, 0xfc, 0xf7, + 0x4b, 0xbc, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x9a, 0xec, + 0x02, 0x0a, 0xfc, 0xf7, 0x16, 0xbc, 0x57, 0xaa, 0x29, 0x46, 0x40, 0x46, + 0x2d, 0xe0, 0x00, 0x23, 0xd2, 0xb2, 0x29, 0x46, 0x40, 0x46, 0x6e, 0xe0, + 0x10, 0xb5, 0x8c, 0x68, 0x20, 0x46, 0xeb, 0xf7, 0x8b, 0xfc, 0x00, 0x21, + 0x04, 0xf1, 0x28, 0x00, 0x61, 0x61, 0xa1, 0x61, 0xe1, 0x61, 0x61, 0x62, + 0x01, 0x70, 0x41, 0x70, 0x10, 0xbd, 0xf8, 0xb5, 0x4c, 0x68, 0x0d, 0x68, + 0x88, 0x68, 0xce, 0x68, 0x0f, 0x69, 0x00, 0x21, 0x00, 0xf8, 0x28, 0x1f, + 0x41, 0x70, 0x20, 0x46, 0x96, 0xed, 0x1e, 0x0a, 0xfc, 0xf7, 0x32, 0xf8, + 0xdb, 0xf7, 0x86, 0xf8, 0xc7, 0xf8, 0xa8, 0x00, 0x21, 0x46, 0x32, 0x68, + 0x28, 0x46, 0xfb, 0xf7, 0x19, 0xfc, 0x00, 0x20, 0xf2, 0xbd, 0xf8, 0xb5, + 0x2d, 0xed, 0x02, 0x8b, 0x10, 0x46, 0x0d, 0x68, 0x4e, 0x68, 0xca, 0x68, + 0x09, 0x69, 0x01, 0x24, 0x01, 0x2b, 0x0f, 0xd1, 0xd2, 0xed, 0x20, 0x0a, + 0xd2, 0xed, 0x07, 0x1a, 0x90, 0xed, 0x1b, 0x1a, 0x92, 0xed, 0x1f, 0x0a, + 0x61, 0xee, 0xa0, 0x1a, 0x81, 0xee, 0x81, 0x8a, 0x60, 0x30, 0xf7, 0xee, + 0x00, 0x8a, 0x0b, 0xe0, 0x02, 0xf1, 0x84, 0x03, 0x90, 0xed, 0x03, 0x1a, + 0x93, 0xed, 0x00, 0x0a, 0xd3, 0xed, 0x01, 0x0a, 0x92, 0xed, 0x08, 0x8a, + 0xff, 0xee, 0x00, 0x8a, 0xb4, 0xee, 0x40, 0x1a, 0xf1, 0xee, 0x10, 0xfa, + 0x14, 0xd4, 0xf4, 0xee, 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x10, 0xdb, + 0xcf, 0x68, 0xfb, 0xf7, 0x07, 0xfb, 0x20, 0xee, 0x28, 0x0a, 0xfb, 0xb2, + 0x01, 0x22, 0x31, 0x46, 0x28, 0x46, 0xfb, 0xf7, 0xef, 0xfd, 0xb4, 0xee, + 0x48, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x00, 0xd5, 0x00, 0x24, 0xbd, 0xec, + 0x02, 0x8b, 0x20, 0x46, 0xf2, 0xbd, 0x7c, 0xb5, 0x0e, 0x69, 0x00, 0x93, + 0x15, 0x46, 0x4b, 0x68, 0x0a, 0x68, 0x29, 0x46, 0x00, 0xf0, 0x85, 0xfa, + 0x04, 0x00, 0x04, 0xd1, 0x29, 0x46, 0x06, 0xf1, 0x78, 0x00, 0x00, 0xf0, + 0xe0, 0xfa, 0x20, 0x46, 0x76, 0xbd, 0x2d, 0xe9, 0xf0, 0x47, 0x04, 0x46, + 0x2d, 0xed, 0x02, 0x8b, 0x0d, 0x46, 0x21, 0x78, 0xdf, 0xf8, 0x64, 0xa1, + 0x30, 0x20, 0x41, 0x43, 0x60, 0x18, 0x05, 0xf1, 0x5c, 0x07, 0x06, 0x1d, + 0x78, 0x78, 0x54, 0x49, 0x90, 0x46, 0x99, 0x46, 0x60, 0xb9, 0x08, 0xf1, + 0x14, 0x02, 0x91, 0xec, 0x02, 0x0a, 0x92, 0xec, 0x02, 0x1a, 0xfc, 0xf7, + 0x70, 0xfb, 0x00, 0xf0, 0x55, 0xf8, 0xfc, 0xf7, 0x46, 0xfb, 0x0b, 0xe0, + 0x08, 0xf1, 0x14, 0x00, 0x91, 0xec, 0x02, 0x0a, 0x90, 0xec, 0x02, 0x1a, + 0xfc, 0xf7, 0x63, 0xfb, 0x00, 0xf0, 0x48, 0xf8, 0xfc, 0xf7, 0x4c, 0xfb, + 0x08, 0xf1, 0x0c, 0x00, 0x90, 0xec, 0x02, 0x1a, 0xfc, 0xf7, 0x6c, 0xfb, + 0x38, 0x78, 0x30, 0x70, 0xb0, 0xee, 0x40, 0x8a, 0x79, 0x78, 0x71, 0x70, + 0xf0, 0xee, 0x60, 0x8a, 0xb8, 0x78, 0xb0, 0x70, 0xe8, 0x68, 0x70, 0x60, + 0x29, 0x6d, 0xb1, 0x60, 0x28, 0x6b, 0xf0, 0x60, 0x69, 0x6b, 0x31, 0x61, + 0xd8, 0xf8, 0x00, 0x00, 0x70, 0x61, 0x08, 0xf1, 0x1c, 0x00, 0xd8, 0xf8, + 0x04, 0x10, 0xb1, 0x61, 0x90, 0xec, 0x02, 0x0a, 0xc0, 0x46, 0xc0, 0x46, + 0x08, 0xf1, 0x1c, 0x00, 0x86, 0xed, 0x07, 0x0a, 0x90, 0xec, 0x02, 0x0a, + 0xc6, 0xed, 0x08, 0x0a, 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, + 0xc0, 0x46, 0xc0, 0x46, 0x86, 0xed, 0x09, 0x0a, 0xc6, 0xed, 0x0a, 0x8a, + 0xc6, 0xf8, 0x2c, 0x90, 0x20, 0x78, 0x40, 0x1c, 0x00, 0xf0, 0x03, 0x00, + 0x20, 0x70, 0x60, 0x78, 0x04, 0x28, 0x3c, 0xbf, 0x40, 0x1c, 0x60, 0x70, + 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf0, 0x87, 0xb0, 0xee, 0x40, 0x1a, + 0xf0, 0xee, 0x60, 0x1a, 0x9a, 0xec, 0x02, 0x0a, 0x70, 0x47, 0x2d, 0xe9, + 0xf8, 0x4f, 0x81, 0x46, 0x15, 0x46, 0x28, 0x00, 0xd1, 0xf8, 0x0c, 0xa0, + 0xd1, 0xf8, 0x00, 0xb0, 0xd1, 0xf8, 0x04, 0x80, 0x8c, 0x68, 0x0e, 0x69, + 0x18, 0xbf, 0x01, 0x28, 0x11, 0xd1, 0x41, 0x46, 0x58, 0x46, 0xfb, 0xf7, + 0x87, 0xfc, 0x00, 0x27, 0x00, 0x23, 0x4f, 0xf4, 0x80, 0x32, 0xf9, 0xb2, + 0x48, 0x46, 0xde, 0xf7, 0x17, 0xf8, 0x7f, 0x1c, 0xf8, 0xb2, 0x41, 0x28, + 0xf4, 0xd3, 0x28, 0x00, 0x01, 0xd0, 0x02, 0x28, 0x05, 0xd1, 0x41, 0x46, + 0x58, 0x46, 0xfb, 0xf7, 0xdf, 0xfc, 0x28, 0x00, 0x01, 0xd0, 0x03, 0x2d, + 0x07, 0xd1, 0x00, 0x20, 0x86, 0xf8, 0x72, 0x00, 0x01, 0x21, 0xb1, 0x70, + 0x30, 0x46, 0x00, 0xf0, 0x0f, 0xf8, 0xa0, 0x69, 0x40, 0x1c, 0xa0, 0x61, + 0x40, 0x46, 0x9a, 0xed, 0x1e, 0x0a, 0xbd, 0xe8, 0xf2, 0x4f, 0xfb, 0xf7, + 0x17, 0xbf, 0x00, 0x00, 0x58, 0x90, 0x00, 0x20, 0x60, 0x90, 0x00, 0x20, + 0x00, 0x21, 0x00, 0xeb, 0x01, 0x12, 0x20, 0x32, 0x49, 0x1c, 0x93, 0x88, + 0x13, 0x81, 0x04, 0x29, 0xf7, 0xd3, 0x01, 0x21, 0x80, 0xf8, 0x72, 0x10, + 0x41, 0x70, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x43, 0x2d, 0xed, 0x04, 0x8b, + 0x84, 0xb0, 0x0d, 0x46, 0x10, 0x99, 0x80, 0x46, 0x91, 0x46, 0xf0, 0xee, + 0x40, 0x8a, 0x1e, 0x46, 0xcf, 0xf7, 0xc6, 0xff, 0x04, 0x00, 0x3c, 0xd1, + 0x00, 0xee, 0x10, 0x5a, 0x11, 0x9f, 0xb8, 0xee, 0x40, 0x9a, 0x89, 0xee, + 0x28, 0x0a, 0xc3, 0xf7, 0x93, 0xf8, 0x12, 0x98, 0x03, 0x90, 0xbc, 0xee, + 0xc0, 0x0a, 0x02, 0x97, 0x8d, 0xed, 0x01, 0x0a, 0xf6, 0xb2, 0x00, 0x96, + 0x01, 0x23, 0x00, 0x22, 0x01, 0x21, 0x40, 0x46, 0xef, 0xf7, 0x28, 0xf8, + 0x04, 0x00, 0x22, 0xd1, 0x14, 0x9e, 0x13, 0x9d, 0x3a, 0x88, 0x00, 0x21, + 0x40, 0x46, 0xef, 0xf7, 0x62, 0xf8, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, + 0x40, 0x0a, 0x20, 0xee, 0x28, 0x0a, 0xc3, 0xf7, 0x73, 0xf8, 0xbc, 0xee, + 0xc0, 0x0a, 0x08, 0xee, 0x10, 0x9a, 0x85, 0xed, 0x00, 0x0a, 0xb8, 0xee, + 0x40, 0x0a, 0xf8, 0xee, 0x48, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0x80, 0xee, + 0x09, 0x0a, 0xc3, 0xf7, 0x63, 0xf8, 0xbc, 0xee, 0xc0, 0x0a, 0x86, 0xed, + 0x00, 0x0a, 0x04, 0xb0, 0x20, 0x46, 0xbd, 0xec, 0x04, 0x8b, 0xbd, 0xe8, + 0xf2, 0x83, 0x2d, 0xe9, 0xf0, 0x4f, 0x91, 0xb0, 0x0f, 0x46, 0x16, 0x46, + 0x9b, 0x46, 0x04, 0xa9, 0xd0, 0xf7, 0x3f, 0xfe, 0x09, 0xaa, 0x03, 0x96, + 0x02, 0x97, 0x00, 0x92, 0xcd, 0xf8, 0x04, 0xb0, 0x0d, 0xab, 0x01, 0x22, + 0x08, 0xa9, 0x07, 0xa8, 0x01, 0xf0, 0x5b, 0xf8, 0x00, 0x24, 0x10, 0xb9, + 0x43, 0xf2, 0x05, 0x24, 0x32, 0xe0, 0x00, 0x22, 0x59, 0x46, 0x09, 0xa8, + 0xe3, 0xf7, 0x83, 0xfd, 0x21, 0x28, 0x02, 0xd2, 0x1a, 0x99, 0x81, 0x42, + 0x01, 0xd2, 0x43, 0xf2, 0x04, 0x24, 0x1b, 0x99, 0x08, 0x60, 0x1c, 0xbb, + 0xdd, 0xf8, 0x70, 0x80, 0x00, 0x25, 0x0d, 0xf1, 0x24, 0x09, 0x0d, 0xf1, + 0x34, 0x0a, 0x19, 0xe0, 0x59, 0xf8, 0x25, 0x00, 0x02, 0x90, 0x01, 0x97, + 0x00, 0x96, 0x5a, 0xf8, 0x25, 0x30, 0x04, 0x9a, 0x06, 0xa9, 0x05, 0xa8, + 0x01, 0xf0, 0x02, 0xf8, 0x0c, 0x22, 0x6a, 0x43, 0x42, 0x44, 0x5a, 0xf8, + 0x25, 0x30, 0x13, 0x60, 0x01, 0x21, 0x59, 0xf8, 0x25, 0x30, 0x99, 0x40, + 0x49, 0x1e, 0x51, 0x60, 0x90, 0x60, 0x6d, 0x1c, 0x5d, 0x45, 0xe3, 0xd3, + 0x20, 0x46, 0x11, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x2d, 0xe9, 0xf7, 0x4f, + 0x2d, 0xed, 0x02, 0x8b, 0xe8, 0xb0, 0x82, 0x46, 0x7e, 0x9c, 0x98, 0x46, + 0xb0, 0xee, 0x40, 0x8a, 0x00, 0x21, 0xee, 0xf7, 0x30, 0xff, 0x00, 0xee, + 0x10, 0x0a, 0xf8, 0xee, 0x40, 0x8a, 0x50, 0x46, 0xf5, 0xf7, 0x72, 0xfe, + 0x8d, 0xf8, 0x00, 0x00, 0x01, 0x20, 0x7f, 0x99, 0x00, 0x25, 0x08, 0x70, + 0x00, 0x26, 0x0c, 0xaf, 0x6b, 0x98, 0x0d, 0xe0, 0x00, 0x2d, 0x04, 0xbf, + 0xa0, 0x5d, 0x00, 0x28, 0x40, 0xf0, 0x8a, 0x80, 0x76, 0x1c, 0x01, 0x2e, + 0x00, 0xf2, 0x89, 0x80, 0x00, 0x2e, 0xf1, 0xd0, 0x6b, 0x98, 0x2c, 0x30, + 0x41, 0x6a, 0x8d, 0xf8, 0x08, 0x10, 0x00, 0x21, 0x0e, 0xe0, 0x0c, 0x22, + 0x4a, 0x43, 0x0d, 0xf1, 0x08, 0x09, 0x83, 0x58, 0x09, 0xeb, 0x81, 0x0c, + 0x02, 0x44, 0xcc, 0xf8, 0x04, 0x30, 0x89, 0x44, 0x13, 0x79, 0x89, 0xf8, + 0x10, 0x30, 0x49, 0x1c, 0x42, 0x6a, 0x91, 0x42, 0xed, 0xd3, 0x81, 0x6a, + 0xbd, 0xf8, 0xd8, 0x01, 0xad, 0xf8, 0x2e, 0x00, 0x07, 0x91, 0xad, 0xf8, + 0x2c, 0x80, 0x9f, 0xed, 0x36, 0x0a, 0x9d, 0xf8, 0xdc, 0x01, 0x8d, 0xf8, + 0x30, 0x00, 0x42, 0x46, 0x78, 0x98, 0x00, 0xeb, 0x86, 0x01, 0x01, 0xee, + 0x10, 0x2a, 0xd1, 0xed, 0x00, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x80, 0xee, + 0x80, 0x0a, 0x20, 0xee, 0x28, 0x0a, 0xb8, 0xee, 0x41, 0x1a, 0x80, 0xee, + 0x01, 0x0a, 0xdf, 0xf7, 0xfb, 0xff, 0x9d, 0xf8, 0xe4, 0x01, 0x8d, 0xf8, + 0x24, 0x00, 0xbc, 0xee, 0xc0, 0x0a, 0x9d, 0xf8, 0xe8, 0x01, 0x8d, 0xed, + 0x08, 0x0a, 0x8d, 0xed, 0x0a, 0x8a, 0x78, 0x70, 0x50, 0x46, 0x9d, 0xf8, + 0xec, 0x11, 0xb9, 0x70, 0x08, 0x21, 0x00, 0xf0, 0xae, 0xf8, 0x7d, 0x98, + 0x60, 0x21, 0x71, 0x43, 0x00, 0xeb, 0x01, 0x0b, 0x5a, 0x46, 0x02, 0xa9, + 0x50, 0x46, 0xf5, 0xf7, 0xc1, 0xfc, 0x5f, 0xea, 0x00, 0x09, 0x05, 0xd1, + 0x7c, 0x9a, 0x02, 0xa9, 0x50, 0x46, 0xf5, 0xf7, 0x23, 0xfd, 0x05, 0x46, + 0x38, 0x79, 0xa0, 0x55, 0x10, 0x21, 0x50, 0x46, 0x00, 0xf0, 0x95, 0xf8, + 0x9d, 0xf8, 0xb0, 0x01, 0x01, 0x28, 0x0b, 0xf1, 0x5c, 0x01, 0x0c, 0xbf, + 0x00, 0x20, 0x01, 0x20, 0x08, 0x70, 0x30, 0x00, 0x18, 0xbf, 0x01, 0x20, + 0x48, 0x70, 0xb9, 0xf1, 0x00, 0x0f, 0x9d, 0xf8, 0x00, 0x00, 0x88, 0x70, + 0x08, 0xd1, 0x01, 0x2d, 0x7f, 0xf4, 0x76, 0xaf, 0x7f, 0x99, 0x00, 0x20, + 0x08, 0x70, 0x43, 0xf2, 0x01, 0x29, 0x02, 0xe0, 0x7f, 0x99, 0x00, 0x20, + 0x08, 0x70, 0x68, 0xb0, 0x48, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, + 0xfe, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x7a, 0x44, 0x2d, 0xe9, 0xf1, 0x4f, + 0xb2, 0xb0, 0x89, 0x46, 0x3d, 0x9f, 0x3c, 0x9e, 0x97, 0xf8, 0x5e, 0x00, + 0x3e, 0x9d, 0x8d, 0xf8, 0x00, 0x00, 0x92, 0x46, 0x98, 0x46, 0xda, 0xf7, + 0xed, 0xfd, 0x83, 0x46, 0x9d, 0xf8, 0x00, 0x10, 0x32, 0x98, 0x09, 0xab, + 0x02, 0xaa, 0xdd, 0xf7, 0x2e, 0xfe, 0x00, 0x24, 0x01, 0x2d, 0x0a, 0xd1, + 0x01, 0x96, 0x0c, 0xa8, 0x00, 0x90, 0x02, 0xab, 0x3a, 0x46, 0x51, 0x46, + 0x48, 0x46, 0xfb, 0xf7, 0x87, 0xfd, 0x04, 0x46, 0x03, 0xe0, 0x06, 0xf1, + 0x24, 0x00, 0x04, 0x70, 0x44, 0x70, 0x5b, 0x46, 0x32, 0x46, 0x39, 0x46, + 0x40, 0x46, 0x00, 0xf0, 0x86, 0xfb, 0x00, 0x2c, 0x04, 0xbf, 0x3f, 0x98, + 0x01, 0x28, 0x0d, 0xd1, 0x06, 0xf1, 0x28, 0x00, 0x0c, 0xa9, 0x01, 0x90, + 0x00, 0x91, 0x02, 0xab, 0x07, 0xf1, 0x60, 0x02, 0x51, 0x46, 0x48, 0x46, + 0xfb, 0xf7, 0x6a, 0xfd, 0x04, 0x46, 0x04, 0xe0, 0x06, 0xf1, 0x4c, 0x00, + 0x00, 0x21, 0x01, 0x70, 0x41, 0x70, 0x5b, 0x46, 0x06, 0xf1, 0x28, 0x02, + 0x07, 0xf1, 0x60, 0x01, 0x40, 0x46, 0x00, 0xf0, 0x66, 0xfb, 0x20, 0x46, + 0x33, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x70, 0xb5, 0x0e, 0x46, 0x19, 0x46, + 0x8c, 0xb0, 0x05, 0x46, 0x9d, 0xf8, 0x40, 0x30, 0x00, 0x93, 0x10, 0x46, + 0x02, 0xac, 0x01, 0x94, 0x33, 0x46, 0x01, 0x22, 0xfb, 0xf7, 0xa6, 0xf8, + 0x04, 0x00, 0x05, 0xd1, 0x09, 0xab, 0x02, 0xaa, 0x31, 0x46, 0x28, 0x46, + 0xdd, 0xf7, 0x72, 0xfd, 0x20, 0x46, 0x0c, 0xb0, 0x70, 0xbd, 0x38, 0xb5, + 0x0d, 0x46, 0x01, 0x21, 0x01, 0xfa, 0x00, 0xf4, 0x2a, 0x46, 0x21, 0x46, + 0x07, 0x20, 0xf2, 0xf7, 0x93, 0xfd, 0x2a, 0x46, 0x21, 0x46, 0xbd, 0xe8, + 0x38, 0x40, 0x08, 0x20, 0xf2, 0xf7, 0x8c, 0xbd, 0x10, 0xb5, 0x0b, 0x46, + 0x02, 0x60, 0x51, 0x09, 0xa2, 0xeb, 0x41, 0x12, 0x20, 0x2a, 0x2f, 0xbf, + 0x4f, 0xf0, 0xff, 0x34, 0x01, 0x24, 0x94, 0x40, 0x64, 0x1e, 0x00, 0x2a, + 0x0c, 0xbf, 0x0a, 0x46, 0x4a, 0x1c, 0x84, 0x60, 0x42, 0x60, 0x03, 0x61, + 0x89, 0x00, 0xbd, 0xe8, 0x10, 0x40, 0x18, 0x46, 0xd4, 0xf7, 0x92, 0xbb, + 0x10, 0xb5, 0x00, 0x21, 0x04, 0xe0, 0x4f, 0xf0, 0xff, 0x33, 0x42, 0xf8, + 0x21, 0x30, 0x49, 0x1c, 0x43, 0x68, 0x02, 0x69, 0x5c, 0x1e, 0xa1, 0x42, + 0xf5, 0xd3, 0x80, 0x68, 0x02, 0xeb, 0x83, 0x01, 0x41, 0xf8, 0x04, 0x0c, + 0x10, 0xbd, 0x43, 0x68, 0x4a, 0x09, 0x9a, 0x42, 0x00, 0xd3, 0x70, 0x47, + 0x10, 0xb5, 0x00, 0xf0, 0x0f, 0xf8, 0x19, 0x43, 0x09, 0xe0, 0x43, 0x68, + 0x4a, 0x09, 0x9a, 0x42, 0x00, 0xd3, 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, + 0x05, 0xf8, 0x23, 0xea, 0x01, 0x01, 0x40, 0xf8, 0x22, 0x10, 0x10, 0xbd, + 0x00, 0x69, 0x01, 0x24, 0x50, 0xf8, 0x22, 0x30, 0xa1, 0xeb, 0x42, 0x11, + 0x04, 0xfa, 0x01, 0xf1, 0x70, 0x47, 0x10, 0xb5, 0x02, 0x46, 0x4b, 0x09, + 0x54, 0x68, 0x00, 0x20, 0xa3, 0x42, 0x07, 0xd2, 0x10, 0x69, 0x50, 0xf8, + 0x23, 0x00, 0xa1, 0xeb, 0x43, 0x11, 0xc8, 0x40, 0x00, 0xf0, 0x01, 0x00, + 0x10, 0xbd, 0xf8, 0xb5, 0x4d, 0x09, 0x14, 0x46, 0x4f, 0xf0, 0xff, 0x33, + 0xa1, 0xeb, 0x45, 0x11, 0x07, 0x69, 0x00, 0x22, 0x03, 0xfa, 0x01, 0xf1, + 0x01, 0xe0, 0x19, 0x46, 0x6d, 0x1c, 0x46, 0x68, 0xb5, 0x42, 0x0b, 0xd2, + 0x57, 0xf8, 0x25, 0x60, 0x31, 0x40, 0xf6, 0xd0, 0x48, 0x42, 0x08, 0x40, + 0xe3, 0xf7, 0x92, 0xfb, 0x00, 0xeb, 0x45, 0x10, 0x20, 0x60, 0x01, 0x22, + 0x10, 0x46, 0xf2, 0xbd, 0x38, 0xb5, 0x04, 0x46, 0x15, 0x46, 0xff, 0xf7, + 0xdc, 0xff, 0x01, 0x00, 0x05, 0xd1, 0x2a, 0x46, 0x20, 0x46, 0xbd, 0xe8, + 0x38, 0x40, 0x00, 0x21, 0xd3, 0xe7, 0x32, 0xbd, 0xf8, 0xb5, 0xb4, 0xb0, + 0x04, 0x46, 0x0d, 0x46, 0x0a, 0xa8, 0x05, 0xf1, 0x20, 0x06, 0x09, 0x90, + 0x0a, 0x21, 0x00, 0x22, 0x08, 0x91, 0x07, 0x92, 0x00, 0x21, 0x70, 0x79, + 0x06, 0x90, 0x03, 0x22, 0x05, 0x91, 0x04, 0x92, 0x00, 0x23, 0x00, 0x20, + 0x01, 0x21, 0x00, 0x22, 0x03, 0x93, 0x02, 0x90, 0x01, 0x91, 0x00, 0x92, + 0xb7, 0xee, 0x00, 0x1a, 0xd6, 0xed, 0x02, 0x0a, 0x9f, 0xed, 0x70, 0x0a, + 0x00, 0x21, 0x20, 0x46, 0xee, 0xf7, 0x7c, 0xff, 0x12, 0xa8, 0x00, 0x21, + 0x02, 0x90, 0x01, 0x91, 0x00, 0x91, 0xb3, 0x89, 0xb2, 0x7b, 0x20, 0x46, + 0xee, 0xf7, 0x46, 0xfe, 0x00, 0x27, 0x18, 0x21, 0x0a, 0xa8, 0x79, 0x43, + 0x01, 0x44, 0x01, 0xf1, 0x40, 0x02, 0x00, 0x21, 0x07, 0x92, 0x01, 0x22, + 0x55, 0xf8, 0x27, 0x00, 0x05, 0x91, 0x04, 0x91, 0x03, 0x91, 0x02, 0x91, + 0x05, 0xeb, 0x87, 0x03, 0x01, 0x21, 0x06, 0x90, 0x01, 0x91, 0x00, 0x92, + 0x12, 0xa9, 0x1b, 0x69, 0x20, 0x46, 0xee, 0xf7, 0x44, 0xfe, 0x7f, 0x1c, + 0x04, 0x2f, 0xe2, 0xd3, 0x32, 0xa8, 0x02, 0x90, 0x31, 0x68, 0x01, 0x91, + 0x00, 0x21, 0x32, 0x79, 0x50, 0x1e, 0xc0, 0xb2, 0x00, 0x90, 0x33, 0x69, + 0xf2, 0x7b, 0x20, 0x46, 0xee, 0xf7, 0x0a, 0xff, 0x0a, 0xa9, 0x20, 0x46, + 0xc0, 0x46, 0xc0, 0x46, 0x00, 0x23, 0x0a, 0xaa, 0x01, 0x21, 0x20, 0x46, + 0xef, 0xf7, 0xf3, 0xfb, 0x35, 0xb0, 0xf0, 0xbd, 0x0a, 0x46, 0x01, 0x21, + 0xef, 0xf7, 0x42, 0xbe, 0x2d, 0xe9, 0xf8, 0x43, 0x0f, 0x46, 0x2d, 0xed, + 0x06, 0x8b, 0x04, 0x46, 0x15, 0x46, 0x01, 0x21, 0xef, 0xf7, 0xd3, 0xfe, + 0x06, 0x46, 0x00, 0x22, 0x31, 0x46, 0x00, 0x20, 0xee, 0xf7, 0xa5, 0xff, + 0x80, 0x46, 0x00, 0x20, 0x5f, 0xea, 0x08, 0x01, 0x28, 0x74, 0x79, 0xd1, + 0x97, 0xed, 0x0a, 0x0a, 0xee, 0xf7, 0x82, 0xff, 0x81, 0x46, 0xb0, 0x6b, + 0x48, 0x45, 0xb8, 0xbf, 0x4f, 0xf0, 0x02, 0x08, 0x6e, 0xdb, 0x01, 0x20, + 0x28, 0x74, 0x30, 0x6f, 0xc0, 0xf3, 0x01, 0x41, 0x29, 0x60, 0xc0, 0xf3, + 0x84, 0x40, 0x68, 0x60, 0x00, 0x21, 0x20, 0x46, 0xee, 0xf7, 0xe3, 0xfc, + 0x00, 0xee, 0x10, 0x0a, 0xb8, 0x8d, 0x2a, 0x68, 0x00, 0xee, 0x90, 0x0a, + 0x07, 0xf1, 0x10, 0x01, 0xb8, 0xee, 0x40, 0x0a, 0xf8, 0xee, 0x60, 0x0a, + 0x80, 0xee, 0x20, 0x9a, 0x51, 0xf8, 0x22, 0x30, 0x3c, 0x6a, 0x68, 0x68, + 0x96, 0xed, 0x10, 0x0a, 0xd6, 0xed, 0x0f, 0x9a, 0x96, 0xed, 0x0e, 0xaa, + 0x00, 0xfb, 0x04, 0x34, 0xb8, 0xee, 0xc0, 0x0a, 0xfb, 0xf7, 0xd2, 0xff, + 0x26, 0x48, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x90, 0xec, + 0x02, 0x0a, 0xfb, 0xf7, 0x9c, 0xff, 0x00, 0xf0, 0x45, 0xf8, 0xb8, 0xee, + 0xe9, 0x0a, 0xfb, 0xf7, 0xc3, 0xff, 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, + 0x68, 0x1a, 0xfb, 0xf7, 0x6a, 0xff, 0x00, 0xf0, 0x39, 0xf8, 0xb8, 0xee, + 0xca, 0x0a, 0xfb, 0xf7, 0xb7, 0xff, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, + 0x60, 0x1a, 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, 0xfb, 0xf7, + 0x93, 0xff, 0x00, 0xf0, 0x29, 0xf8, 0xfc, 0xf7, 0x39, 0xf9, 0xdf, 0xed, + 0x11, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0x20, 0xee, 0x09, 0x0a, 0xc2, 0xf7, + 0x7d, 0xfd, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x04, 0x19, + 0xac, 0x60, 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, 0xfc, 0xf7, + 0xe1, 0xfd, 0x85, 0xed, 0x03, 0x0a, 0x70, 0x6c, 0x48, 0x45, 0xa4, 0xbf, + 0x02, 0x21, 0x29, 0x74, 0xbd, 0xec, 0x06, 0x8b, 0x40, 0x46, 0xbd, 0xe8, + 0xf2, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdb, 0x0f, 0xc9, 0x40, + 0x50, 0x90, 0x00, 0x20, 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, 0x60, 0x8a, + 0x70, 0x47, 0x00, 0x00, 0x2d, 0xe9, 0xf4, 0x4f, 0x2d, 0xed, 0x02, 0x8b, + 0x86, 0xb0, 0x80, 0x46, 0xdd, 0xf8, 0x50, 0xa0, 0xdd, 0xf8, 0x54, 0xb0, + 0x00, 0x20, 0x0f, 0x46, 0x1d, 0x46, 0x00, 0x90, 0x4f, 0xf0, 0x0c, 0x09, + 0x12, 0x9b, 0x03, 0xe0, 0x00, 0x28, 0xfb, 0xd0, 0x12, 0x9b, 0x5b, 0x42, + 0x04, 0x97, 0x01, 0x95, 0x03, 0x93, 0x00, 0x25, 0x5c, 0xe0, 0x18, 0xf8, + 0x05, 0x40, 0x98, 0xed, 0x06, 0x0a, 0x08, 0xeb, 0x85, 0x00, 0x61, 0x1e, + 0x90, 0xed, 0x01, 0x8a, 0x88, 0x07, 0x4c, 0xbf, 0x60, 0x42, 0x20, 0x46, + 0x03, 0x99, 0x46, 0x1c, 0xc0, 0xf1, 0x01, 0x00, 0x0a, 0xfb, 0x00, 0x10, + 0x0a, 0xfb, 0x06, 0x16, 0x02, 0x90, 0x60, 0xee, 0x08, 0x8a, 0x59, 0x46, + 0x00, 0xf0, 0xd3, 0xf8, 0x04, 0x99, 0x30, 0x22, 0x6a, 0x43, 0x8f, 0x18, + 0x00, 0x23, 0x38, 0x60, 0x3b, 0x71, 0x01, 0x21, 0x79, 0x71, 0xbc, 0x71, + 0x00, 0xf0, 0xad, 0xf8, 0x28, 0xee, 0x00, 0x0a, 0x87, 0xed, 0x02, 0x0a, + 0x59, 0x46, 0x70, 0x42, 0x00, 0xf0, 0xbf, 0xf8, 0xf8, 0x60, 0x01, 0x21, + 0x39, 0x74, 0x79, 0x74, 0xbc, 0x74, 0x00, 0xf0, 0x9e, 0xf8, 0x28, 0xee, + 0x00, 0x0a, 0x87, 0xed, 0x05, 0x0a, 0x59, 0x46, 0x30, 0x46, 0x00, 0xf0, + 0xb0, 0xf8, 0xb8, 0x61, 0x00, 0x21, 0x39, 0x77, 0x79, 0x77, 0xbc, 0x77, + 0x00, 0xf0, 0x8f, 0xf8, 0x28, 0xee, 0x80, 0x0a, 0x87, 0xed, 0x08, 0x0a, + 0x59, 0x46, 0x02, 0x98, 0x40, 0x42, 0x00, 0xf0, 0xa0, 0xf8, 0x07, 0xf1, + 0x28, 0x06, 0x78, 0x62, 0x01, 0x21, 0x31, 0x70, 0x00, 0x22, 0x72, 0x70, + 0xb4, 0x70, 0x00, 0xf0, 0x7c, 0xf8, 0x28, 0xee, 0x80, 0x0a, 0x86, 0xed, + 0x01, 0x0a, 0x6d, 0x1c, 0xd8, 0xf8, 0x14, 0x00, 0x85, 0x42, 0x9e, 0xd3, + 0x04, 0x9f, 0x01, 0x9d, 0x00, 0x98, 0x10, 0xb9, 0x08, 0x9c, 0x39, 0x46, + 0x04, 0xe0, 0x08, 0x98, 0x00, 0xf1, 0x2c, 0x04, 0x07, 0xf1, 0x24, 0x01, + 0x91, 0xed, 0x02, 0x0a, 0x00, 0x22, 0x11, 0xe0, 0x00, 0x23, 0x30, 0x20, + 0x00, 0xfb, 0x02, 0xfc, 0xbc, 0x44, 0x09, 0xfb, 0x03, 0xf6, 0x66, 0x44, + 0x5b, 0x1c, 0xd6, 0xed, 0x02, 0x0a, 0xc0, 0xee, 0x80, 0x0a, 0x04, 0x2b, + 0xc6, 0xed, 0x02, 0x0a, 0xf0, 0xd3, 0x52, 0x1c, 0xd8, 0xf8, 0x14, 0x00, + 0x82, 0x42, 0xe9, 0xd3, 0x00, 0x22, 0x62, 0x62, 0x00, 0xf0, 0x47, 0xf8, + 0x00, 0x98, 0x00, 0x28, 0x0c, 0xbf, 0x07, 0xf1, 0x24, 0x06, 0x3e, 0x46, + 0x00, 0xf0, 0x3e, 0xf8, 0x9f, 0xed, 0x4f, 0x0a, 0x00, 0x21, 0x15, 0xe0, + 0x00, 0x22, 0x30, 0x20, 0x00, 0xfb, 0x01, 0xf3, 0xfb, 0x18, 0x09, 0xfb, + 0x02, 0xfc, 0x63, 0x44, 0xd3, 0xed, 0x02, 0x0a, 0xb4, 0xee, 0x60, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xbf, 0xb0, 0xee, 0x60, 0x0a, 0x1e, 0x46, + 0x52, 0x1c, 0x04, 0x2a, 0xec, 0xd3, 0x49, 0x1c, 0xd8, 0xf8, 0x14, 0x00, + 0x81, 0x42, 0xe5, 0xd3, 0xd8, 0xed, 0x08, 0x0a, 0xb4, 0xee, 0x60, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x03, 0xdb, 0x00, 0xf0, 0x17, 0xf8, 0x00, 0x28, + 0xd6, 0xd1, 0x00, 0x98, 0x40, 0x1c, 0x01, 0x28, 0x00, 0x90, 0x7f, 0xf6, + 0x35, 0xaf, 0x12, 0x98, 0x08, 0x99, 0x50, 0x44, 0x88, 0x62, 0x08, 0x99, + 0x12, 0x98, 0xaa, 0xeb, 0x00, 0x00, 0x48, 0x65, 0x06, 0xb0, 0x00, 0x20, + 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, 0x31, 0x46, 0x20, 0x46, + 0x05, 0xe0, 0x01, 0x9b, 0x13, 0x99, 0x98, 0xed, 0x07, 0x0a, 0x52, 0x46, + 0x2a, 0xe0, 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x63, 0x6a, 0x03, 0x2b, + 0x0b, 0xd2, 0x0c, 0x22, 0x53, 0x43, 0xe0, 0x18, 0xc2, 0xf7, 0xec, 0xfa, + 0x61, 0x6a, 0x49, 0x1c, 0x61, 0x62, 0x00, 0x20, 0xa8, 0x60, 0x01, 0x20, + 0x32, 0xbd, 0x00, 0x20, 0x32, 0xbd, 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, + 0x00, 0xee, 0x10, 0x4a, 0x00, 0xee, 0x90, 0x5a, 0xb8, 0xee, 0xc0, 0x0a, + 0xf8, 0xee, 0x60, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0xc2, 0xf7, 0x40, 0xfc, + 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x05, 0xfb, 0x10, 0x44, + 0x20, 0x46, 0x32, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, 0x2d, 0xed, 0x02, 0x8b, + 0x1f, 0x46, 0x82, 0xb0, 0x3c, 0x68, 0x01, 0x94, 0x07, 0xf1, 0x08, 0x03, + 0x00, 0x93, 0x05, 0x46, 0x0e, 0x46, 0x90, 0x46, 0xb0, 0xee, 0x40, 0x8a, + 0x3b, 0x1d, 0x00, 0xf0, 0x1d, 0xf8, 0x04, 0x46, 0x01, 0x20, 0x01, 0x90, + 0x07, 0xf1, 0x0c, 0x03, 0x07, 0xf1, 0x10, 0x00, 0x00, 0x90, 0x42, 0x46, + 0x31, 0x46, 0x28, 0x46, 0x00, 0xf0, 0x10, 0xf8, 0x14, 0xb1, 0xb7, 0xee, + 0x00, 0x8a, 0x02, 0xe0, 0x08, 0xb9, 0x9f, 0xed, 0x04, 0x8a, 0x02, 0xb0, + 0xb0, 0xee, 0x48, 0x0a, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf0, 0x81, + 0x00, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x43, 0x01, 0xeb, 0xd1, 0x77, + 0xa0, 0xeb, 0x67, 0x09, 0x07, 0x9c, 0x08, 0x9d, 0x00, 0xeb, 0x67, 0x00, + 0x00, 0x21, 0x00, 0x27, 0x17, 0xe0, 0x54, 0xf8, 0x27, 0x60, 0x06, 0xeb, + 0xd6, 0x78, 0x53, 0xf8, 0x27, 0x60, 0xb6, 0x1a, 0xa6, 0xeb, 0x68, 0x0c, + 0xcc, 0x45, 0x06, 0xeb, 0x68, 0x06, 0xb8, 0xbf, 0xcc, 0x46, 0x86, 0x46, + 0xb0, 0x42, 0xc8, 0xbf, 0xb6, 0x46, 0xf4, 0x45, 0xbc, 0xbf, 0xae, 0xeb, + 0x0c, 0x06, 0x71, 0x18, 0x7f, 0x1c, 0xaf, 0x42, 0xe5, 0xd3, 0x08, 0x46, + 0xbd, 0xe8, 0xf0, 0x83, 0x38, 0xb5, 0x0d, 0x46, 0x04, 0x46, 0x29, 0x1d, + 0xcf, 0xf7, 0xe2, 0xfa, 0x2c, 0x60, 0x20, 0x46, 0xd0, 0xf7, 0x6b, 0xfa, + 0xa8, 0x60, 0x20, 0x46, 0xd0, 0xf7, 0x56, 0xf9, 0xe8, 0x60, 0x20, 0x46, + 0xd0, 0xf7, 0x4b, 0xf9, 0x28, 0x61, 0x20, 0x46, 0xd0, 0xf7, 0x93, 0xf9, + 0x68, 0x61, 0x00, 0x21, 0x20, 0x46, 0xee, 0xf7, 0xda, 0xfa, 0xa8, 0x61, + 0x01, 0x21, 0x20, 0x46, 0xee, 0xf7, 0xd5, 0xfa, 0xe8, 0x61, 0x00, 0x20, + 0x28, 0x62, 0x68, 0x62, 0xa8, 0x62, 0xe8, 0x62, 0x31, 0xbd, 0xf8, 0xb5, + 0x05, 0x46, 0x1e, 0x46, 0xaf, 0x6a, 0x8c, 0x23, 0x5f, 0x43, 0xeb, 0x19, + 0x14, 0x46, 0x03, 0xf1, 0x30, 0x07, 0x60, 0x22, 0x38, 0x46, 0xc2, 0xf7, + 0x4d, 0xfa, 0x2c, 0xb1, 0x28, 0x22, 0x21, 0x46, 0x07, 0xf1, 0x60, 0x00, + 0xc2, 0xf7, 0x46, 0xfa, 0xc7, 0xf8, 0x88, 0x60, 0xa8, 0x6a, 0x40, 0x1c, + 0x00, 0xf0, 0x0f, 0x00, 0xa8, 0x62, 0x28, 0x6a, 0x0f, 0x28, 0x9c, 0xbf, + 0x40, 0x1c, 0x28, 0x62, 0xf1, 0xbd, 0x30, 0xb5, 0xc5, 0x6a, 0x0c, 0x24, + 0x65, 0x43, 0x44, 0x19, 0x04, 0xf5, 0x0f, 0x64, 0x21, 0x60, 0x63, 0x60, + 0x11, 0x78, 0x52, 0x78, 0x41, 0xea, 0x02, 0x41, 0xa1, 0x60, 0xc1, 0x6a, + 0x49, 0x1c, 0x01, 0xf0, 0x0f, 0x01, 0xc1, 0x62, 0x41, 0x6a, 0x0f, 0x29, + 0x9c, 0xbf, 0x49, 0x1c, 0x41, 0x62, 0x30, 0xbd, 0x2d, 0xe9, 0xf3, 0x4f, + 0x87, 0xb0, 0x00, 0x24, 0xdf, 0xf8, 0x3c, 0x86, 0xdf, 0xf8, 0x3c, 0xb6, + 0x20, 0x46, 0xd0, 0xf7, 0xcf, 0xfa, 0x07, 0x46, 0x24, 0x21, 0xdf, 0xf8, + 0x34, 0x06, 0x61, 0x43, 0x45, 0x18, 0xff, 0x22, 0x2a, 0x60, 0xc5, 0xf8, + 0x04, 0xb0, 0x40, 0xf2, 0xcc, 0x71, 0x08, 0x98, 0xb0, 0x22, 0x61, 0x43, + 0x62, 0x43, 0x08, 0x44, 0x5a, 0x44, 0x43, 0xf2, 0x38, 0x23, 0xa8, 0x60, + 0x13, 0x44, 0xec, 0x22, 0xdf, 0xf8, 0x0c, 0x16, 0xeb, 0x60, 0x62, 0x43, + 0x4f, 0xf4, 0x09, 0x73, 0x63, 0x43, 0x0a, 0x44, 0x4f, 0xf4, 0x1b, 0x61, + 0x61, 0x43, 0x5b, 0x44, 0x59, 0x44, 0x6a, 0x61, 0x03, 0xf5, 0x39, 0x79, + 0x01, 0xf6, 0x74, 0x3a, 0xc5, 0xf8, 0x10, 0x90, 0xc5, 0xf8, 0x18, 0xa0, + 0x00, 0xf5, 0x62, 0x70, 0xff, 0x2f, 0xe8, 0x61, 0x13, 0xd1, 0xd0, 0xf7, + 0x4b, 0xfa, 0x82, 0x46, 0x00, 0x26, 0x2a, 0xfa, 0x06, 0xf0, 0xc0, 0x07, + 0x07, 0xd4, 0xf0, 0xb2, 0xd9, 0xf7, 0xde, 0xfa, 0x28, 0x62, 0xd8, 0xf8, + 0x00, 0x00, 0x40, 0xf8, 0x26, 0x50, 0x76, 0x1c, 0x08, 0x2e, 0xf0, 0xd3, + 0x0b, 0xe0, 0xf8, 0xb2, 0xd9, 0xf7, 0xd2, 0xfa, 0x28, 0x62, 0x51, 0x46, + 0xd8, 0xf8, 0x00, 0x00, 0x40, 0xf8, 0x27, 0x50, 0x38, 0x46, 0xff, 0xf7, + 0x41, 0xff, 0x07, 0x98, 0xf8, 0x40, 0xc1, 0x07, 0x1e, 0xd5, 0xdf, 0xf8, + 0x94, 0x25, 0x00, 0x20, 0x10, 0x55, 0x38, 0x46, 0xdd, 0xf7, 0xcc, 0xf8, + 0x38, 0x46, 0xdd, 0xf7, 0x2d, 0xf9, 0x08, 0x99, 0x6a, 0x46, 0x20, 0x46, + 0x00, 0xf0, 0xda, 0xf9, 0x69, 0x46, 0x38, 0x46, 0xc0, 0x46, 0xc0, 0x46, + 0x48, 0x46, 0xea, 0xf7, 0x7f, 0xfd, 0x08, 0x99, 0x6a, 0x46, 0x20, 0x46, + 0x00, 0xf0, 0xeb, 0xf9, 0x69, 0x46, 0x38, 0x46, 0xff, 0xf7, 0xe6, 0xf8, + 0x64, 0x1c, 0x04, 0x2c, 0x84, 0xd3, 0x09, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x80, 0xb5, 0x00, 0xf0, 0x09, 0xf8, 0xda, 0xf7, 0xee, 0xf9, 0x02, 0xbd, + 0x80, 0xb5, 0x00, 0xf0, 0x03, 0xf8, 0xda, 0xf7, 0xd3, 0xf9, 0x02, 0xbd, + 0x00, 0x92, 0x0b, 0x46, 0x02, 0x46, 0x4f, 0xf4, 0x39, 0x71, 0xdf, 0xf8, + 0x1c, 0x05, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, 0x86, 0xb0, 0x80, 0x46, + 0x89, 0x46, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0xdf, 0xf8, 0x04, 0xa5, + 0xdf, 0xf8, 0x0c, 0xb5, 0x28, 0xfa, 0x06, 0xf0, 0xc0, 0x07, 0x2b, 0xd5, + 0x30, 0x46, 0xd0, 0xf7, 0x0f, 0xfa, 0x07, 0x46, 0x30, 0x46, 0x00, 0xf0, + 0xd5, 0xf9, 0x04, 0x00, 0x09, 0xd1, 0x6a, 0x46, 0x49, 0x46, 0x38, 0x46, + 0x00, 0xf0, 0x92, 0xf9, 0x69, 0x46, 0x30, 0x46, 0x00, 0xf0, 0x09, 0xfb, + 0x04, 0x46, 0x6c, 0xb9, 0x6a, 0x46, 0x49, 0x46, 0x38, 0x46, 0x00, 0xf0, + 0xa4, 0xf9, 0x69, 0x46, 0x30, 0x46, 0xff, 0xf7, 0xae, 0xf8, 0x04, 0x00, + 0x04, 0xbf, 0x01, 0x20, 0x0b, 0xf8, 0x07, 0x00, 0x4f, 0xf4, 0x09, 0x72, + 0x57, 0x43, 0x0a, 0xeb, 0x07, 0x02, 0x21, 0x46, 0x02, 0xf5, 0x39, 0x70, + 0xea, 0xf7, 0x2b, 0xfd, 0x05, 0xb9, 0x25, 0x46, 0x76, 0x1c, 0x08, 0x2e, + 0xca, 0xd3, 0x28, 0x46, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x70, 0xb5, + 0x86, 0xb0, 0x0c, 0x46, 0xea, 0xf7, 0x30, 0xfd, 0x05, 0x46, 0xd0, 0xf7, + 0xd5, 0xf9, 0x06, 0x46, 0xff, 0x2e, 0x19, 0xd0, 0x28, 0x46, 0x00, 0xf0, + 0x99, 0xf9, 0x78, 0xb9, 0xdf, 0xf8, 0x78, 0x14, 0x88, 0x5d, 0x10, 0xb9, + 0x43, 0xf2, 0x02, 0x20, 0x08, 0xe0, 0x6a, 0x46, 0x21, 0x46, 0x30, 0x46, + 0x00, 0xf0, 0x6d, 0xf9, 0x69, 0x46, 0x28, 0x46, 0xfe, 0xf7, 0x8e, 0xfc, + 0xec, 0x21, 0xdf, 0xf8, 0x54, 0x24, 0x4e, 0x43, 0x90, 0x51, 0x01, 0xe0, + 0x4f, 0xf6, 0x52, 0x70, 0x06, 0xb0, 0x70, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, + 0x88, 0x46, 0x15, 0x46, 0x1f, 0x46, 0xea, 0xf7, 0x05, 0xfd, 0xd0, 0xf7, + 0xab, 0xf9, 0x00, 0x26, 0xff, 0x28, 0x1c, 0xd0, 0x4f, 0xf4, 0x09, 0x74, + 0xdf, 0xf8, 0x1c, 0x14, 0x60, 0x43, 0x08, 0x44, 0x00, 0xf5, 0x39, 0x71, + 0x1f, 0xb1, 0x02, 0x2f, 0x02, 0xd0, 0x01, 0xd3, 0x09, 0xe0, 0x14, 0x24, + 0x28, 0x68, 0xa0, 0x42, 0x08, 0xd3, 0x22, 0x46, 0x40, 0x46, 0xc2, 0xf7, + 0xe7, 0xf8, 0x2c, 0x60, 0x07, 0xe0, 0x4f, 0xf6, 0x2a, 0x76, 0x04, 0xe0, + 0x4f, 0xf6, 0x26, 0x76, 0x01, 0xe0, 0x4f, 0xf6, 0x52, 0x76, 0x30, 0x46, + 0xbd, 0xe8, 0xf0, 0x81, 0xf8, 0xb5, 0x0c, 0x46, 0x15, 0x46, 0x1f, 0x46, + 0xea, 0xf7, 0xd8, 0xfc, 0xd0, 0xf7, 0x7e, 0xf9, 0x00, 0x26, 0xff, 0x28, + 0x1b, 0xd0, 0xec, 0x21, 0xdf, 0xf8, 0xcc, 0x23, 0x48, 0x43, 0x11, 0x18, + 0x1f, 0xb1, 0x02, 0x2f, 0x0b, 0xd0, 0x0a, 0xd3, 0x0b, 0xe0, 0x14, 0x27, + 0x28, 0x68, 0xb8, 0x42, 0x0a, 0xd3, 0x3a, 0x46, 0x20, 0x46, 0xc2, 0xf7, + 0xbd, 0xf8, 0x2f, 0x60, 0x09, 0xe0, 0xec, 0x27, 0xf4, 0xe7, 0x4f, 0xf6, + 0x2a, 0x76, 0x04, 0xe0, 0x4f, 0xf6, 0x26, 0x76, 0x01, 0xe0, 0x4f, 0xf6, + 0x52, 0x76, 0x30, 0x46, 0xf2, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, + 0x2d, 0xed, 0x02, 0x8b, 0x86, 0xb0, 0x12, 0x9f, 0xdd, 0xf8, 0x50, 0xb0, + 0x0d, 0x46, 0x16, 0x46, 0x1c, 0x46, 0xea, 0xf7, 0xa5, 0xfc, 0x80, 0x46, + 0xd0, 0xf7, 0x4a, 0xf9, 0x03, 0x46, 0x40, 0xf2, 0xcc, 0x71, 0x59, 0x43, + 0x4f, 0xf0, 0x00, 0x0a, 0x0b, 0xeb, 0x01, 0x09, 0x07, 0x2d, 0xc7, 0xf8, + 0x00, 0xa0, 0x4f, 0xf6, 0x61, 0x71, 0xdf, 0xf8, 0x4c, 0x03, 0x00, 0xf2, + 0xbf, 0x80, 0xdf, 0xe8, 0x05, 0xf0, 0x04, 0x0f, 0x1f, 0x2b, 0x37, 0x4c, + 0xb8, 0x59, 0x04, 0x2c, 0x04, 0xd3, 0x32, 0x68, 0x49, 0x46, 0xfa, 0xf7, + 0x17, 0xfc, 0xb3, 0xe0, 0x49, 0x46, 0xfa, 0xf7, 0x1d, 0xfe, 0xaf, 0xe0, + 0x08, 0x2c, 0x4a, 0xd3, 0x37, 0x68, 0x74, 0x68, 0x8e, 0xbf, 0x30, 0x7a, + 0x40, 0x46, 0xf5, 0xf7, 0x3f, 0xf8, 0x01, 0x46, 0x23, 0x46, 0x3a, 0x46, + 0x40, 0x46, 0xdd, 0xf7, 0xf1, 0xf8, 0x9f, 0xe0, 0x00, 0x2c, 0x3a, 0xd0, + 0x30, 0x78, 0x00, 0x28, 0x40, 0x46, 0x02, 0xd1, 0xdd, 0xf7, 0x10, 0xf8, + 0x96, 0xe0, 0xdd, 0xf7, 0x15, 0xf8, 0x93, 0xe0, 0x00, 0x2c, 0x2e, 0xd0, + 0x31, 0x78, 0x02, 0x29, 0x03, 0xda, 0x40, 0x46, 0x00, 0xf0, 0x9f, 0xfe, + 0x8a, 0xe0, 0x4f, 0xf6, 0x0e, 0x7a, 0x87, 0xe0, 0x02, 0x2c, 0x22, 0xd3, + 0x71, 0x78, 0x8d, 0xf8, 0x00, 0x10, 0x6b, 0x46, 0x30, 0x78, 0x00, 0x28, + 0x05, 0xd0, 0x06, 0x22, 0x01, 0x21, 0x40, 0x46, 0xed, 0xf7, 0xbb, 0xfe, + 0x74, 0xe0, 0x06, 0x22, 0x01, 0x21, 0x40, 0x46, 0xed, 0xf7, 0xdf, 0xfe, + 0x6e, 0xe0, 0x74, 0xb1, 0x34, 0x78, 0x6a, 0x46, 0x59, 0x46, 0x18, 0x46, + 0x00, 0xf0, 0x8f, 0xf8, 0x22, 0x46, 0x69, 0x46, 0x40, 0x46, 0xff, 0xf7, + 0x84, 0xf8, 0x65, 0xe0, 0x00, 0x25, 0x04, 0x2c, 0x01, 0xd2, 0x8a, 0x46, + 0x60, 0xe0, 0x96, 0xed, 0x00, 0x8a, 0x00, 0xf5, 0xd2, 0x71, 0xb0, 0xee, + 0x48, 0x0a, 0x09, 0xf5, 0x62, 0x72, 0x40, 0x46, 0x00, 0xf0, 0xc2, 0xfc, + 0x5f, 0xea, 0x00, 0x0a, 0x37, 0xd1, 0x69, 0x46, 0x40, 0x46, 0x00, 0xf0, + 0x8a, 0xff, 0x01, 0x25, 0x88, 0xbb, 0x01, 0xa9, 0x40, 0x46, 0x00, 0xf0, + 0x95, 0xff, 0x60, 0xbb, 0x9d, 0xed, 0x01, 0x0a, 0x30, 0xee, 0x08, 0x8a, + 0xf7, 0xee, 0x00, 0x0a, 0xb4, 0xee, 0x60, 0x8a, 0xf1, 0xee, 0x10, 0xfa, + 0x09, 0xdb, 0x9d, 0xf8, 0x00, 0x10, 0x49, 0x1c, 0xc9, 0xb2, 0x40, 0x46, + 0x01, 0xf0, 0x54, 0xf8, 0xbf, 0xee, 0x00, 0x0a, 0x0f, 0xe0, 0xdf, 0xed, + 0x88, 0x0a, 0xb4, 0xee, 0x60, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x0b, 0xd5, + 0x9d, 0xf8, 0x00, 0x00, 0x41, 0x1e, 0xc9, 0xb2, 0x40, 0x46, 0x01, 0xf0, + 0x43, 0xf8, 0xb7, 0xee, 0x00, 0x0a, 0x38, 0xee, 0x00, 0x0a, 0x01, 0xe0, + 0xb0, 0xee, 0x48, 0x0a, 0x48, 0x46, 0xfa, 0xf7, 0xd0, 0xfc, 0x06, 0x20, + 0x38, 0x60, 0x31, 0x68, 0x00, 0x91, 0x86, 0xf8, 0x00, 0x80, 0x75, 0x70, + 0x9d, 0xf8, 0x00, 0x00, 0xb0, 0x70, 0x9d, 0xf8, 0x01, 0x00, 0xf0, 0x70, + 0x9d, 0xf8, 0x02, 0x00, 0x30, 0x71, 0x9d, 0xf8, 0x03, 0x00, 0x70, 0x71, + 0x06, 0xe0, 0x40, 0x46, 0x00, 0xf0, 0x46, 0xf8, 0x82, 0x46, 0x01, 0xe0, + 0x4f, 0xf6, 0x27, 0x7a, 0x06, 0xb0, 0x50, 0x46, 0xbd, 0xec, 0x02, 0x8b, + 0xbd, 0xe8, 0xf2, 0x8f, 0x70, 0xb5, 0x40, 0xf2, 0xcc, 0x74, 0x6c, 0x4b, + 0x13, 0x60, 0x44, 0x43, 0x0c, 0x44, 0x03, 0xf5, 0xd0, 0x71, 0x91, 0x60, + 0x4f, 0xf4, 0x09, 0x75, 0x54, 0x60, 0x45, 0x43, 0x4f, 0xf4, 0x1b, 0x61, + 0x1d, 0x44, 0x48, 0x43, 0x05, 0xf5, 0x39, 0x76, 0x18, 0x44, 0x04, 0xf5, + 0x62, 0x74, 0xd6, 0x60, 0x00, 0xf6, 0x74, 0x33, 0x54, 0x61, 0x13, 0x61, + 0x70, 0xbd, 0x70, 0xb5, 0x5e, 0x4b, 0x13, 0x60, 0x03, 0xf5, 0x09, 0x74, + 0xd4, 0x60, 0xec, 0x26, 0x40, 0xf2, 0xcc, 0x74, 0x44, 0x43, 0x5c, 0x4d, + 0x46, 0x43, 0x21, 0x44, 0x2e, 0x44, 0x51, 0x60, 0x96, 0x60, 0xb0, 0x25, + 0x45, 0x43, 0x4f, 0xf4, 0x1b, 0x61, 0x1d, 0x44, 0x43, 0xf2, 0x38, 0x26, + 0x48, 0x43, 0x2e, 0x44, 0x18, 0x44, 0x16, 0x61, 0x00, 0xf6, 0x74, 0x33, + 0x53, 0x61, 0x70, 0xbd, 0x2d, 0xe9, 0xfc, 0x47, 0x05, 0x46, 0x69, 0x46, + 0xce, 0xf7, 0xfa, 0xff, 0x80, 0x46, 0x28, 0x46, 0xcf, 0xf7, 0x83, 0xff, + 0x82, 0x46, 0x00, 0x24, 0x00, 0x20, 0x49, 0x4d, 0x00, 0xe0, 0x40, 0x1c, + 0x95, 0xf8, 0xe2, 0x12, 0x88, 0x42, 0x07, 0xd2, 0x05, 0xeb, 0x80, 0x01, + 0x00, 0x9a, 0xd1, 0xf8, 0xc4, 0x32, 0x9a, 0x42, 0xf3, 0xd2, 0x04, 0x46, + 0x00, 0x26, 0x43, 0xf2, 0x0a, 0x29, 0x00, 0xe0, 0x76, 0x1c, 0x28, 0x19, + 0x90, 0xf8, 0xdc, 0x02, 0x86, 0x42, 0x1b, 0xd2, 0xb8, 0xf1, 0x00, 0x0f, + 0x18, 0xd1, 0xa8, 0x19, 0x90, 0xf8, 0xbc, 0x72, 0x01, 0x2f, 0x09, 0xd9, + 0x00, 0x98, 0x7a, 0x1e, 0x51, 0x46, 0x00, 0xf0, 0x12, 0xf8, 0xd5, 0xf8, + 0xb8, 0x12, 0x88, 0x42, 0x38, 0xbf, 0xc8, 0x46, 0x00, 0x98, 0x7a, 0x1c, + 0x51, 0x46, 0x00, 0xf0, 0x08, 0xf8, 0xd5, 0xf8, 0xb8, 0x12, 0x88, 0x42, + 0xde, 0xd2, 0xc8, 0x46, 0x40, 0x46, 0xbd, 0xe8, 0xf6, 0x87, 0x80, 0xb5, + 0x00, 0xee, 0x10, 0x0a, 0x01, 0xee, 0x10, 0x2a, 0x2d, 0xed, 0x04, 0x8b, + 0x00, 0xee, 0x90, 0x1a, 0xf8, 0xee, 0x41, 0x8a, 0xb8, 0xee, 0x40, 0x9a, + 0xb8, 0xee, 0x60, 0x8a, 0x29, 0xee, 0x28, 0x0a, 0x80, 0xee, 0x08, 0x0a, + 0xc2, 0xf7, 0x9c, 0xf8, 0x28, 0xee, 0x00, 0x0a, 0x80, 0xee, 0x28, 0x0a, + 0x39, 0xee, 0x40, 0x0a, 0xb0, 0xee, 0xc0, 0x0a, 0xdf, 0xf7, 0xcc, 0xf8, + 0xbc, 0xee, 0xc0, 0x0a, 0xbd, 0xec, 0x04, 0x8b, 0x10, 0xee, 0x10, 0x0a, + 0x02, 0xbd, 0x38, 0xb5, 0x18, 0x49, 0x09, 0x68, 0x51, 0xf8, 0x20, 0x50, + 0x28, 0x68, 0x08, 0x28, 0x26, 0xd2, 0x51, 0xf8, 0x20, 0x40, 0x0c, 0xb3, + 0xa9, 0x68, 0xa0, 0x68, 0x4f, 0xf4, 0x62, 0x72, 0xc1, 0xf7, 0x1e, 0xff, + 0xe9, 0x68, 0xe0, 0x68, 0xb0, 0x22, 0xc1, 0xf7, 0x19, 0xff, 0x29, 0x69, + 0x20, 0x69, 0x4f, 0xf4, 0x09, 0x72, 0xc1, 0xf7, 0x13, 0xff, 0x69, 0x69, + 0x60, 0x69, 0xec, 0x22, 0xc1, 0xf7, 0x0e, 0xff, 0xa9, 0x69, 0xa0, 0x69, + 0x4f, 0xf4, 0x1b, 0x62, 0xc1, 0xf7, 0x08, 0xff, 0xe9, 0x69, 0xe0, 0x69, + 0x40, 0xf2, 0x44, 0x42, 0xc1, 0xf7, 0x02, 0xff, 0xff, 0x20, 0x28, 0x60, + 0x31, 0xbd, 0x00, 0x00, 0xff, 0xff, 0x7f, 0xbf, 0x78, 0x04, 0x00, 0x01, + 0x28, 0x04, 0x00, 0x20, 0x20, 0x68, 0x02, 0x20, 0x88, 0x37, 0x02, 0x20, + 0x9c, 0x77, 0x02, 0x20, 0x10, 0xb5, 0x02, 0x68, 0x43, 0x68, 0x9a, 0x42, + 0x39, 0xbf, 0x00, 0x22, 0x04, 0x23, 0x04, 0x22, 0x00, 0x23, 0x84, 0x58, + 0x8a, 0x58, 0xc0, 0x58, 0xc9, 0x58, 0x04, 0xeb, 0x52, 0x04, 0xa0, 0xeb, + 0x51, 0x00, 0x84, 0x42, 0x80, 0x41, 0xc0, 0x43, 0xc0, 0x0f, 0x10, 0xbd, + 0x2d, 0xe9, 0xf8, 0x4f, 0x84, 0xb0, 0x81, 0x46, 0x0f, 0x98, 0x00, 0x90, + 0x8b, 0x46, 0x90, 0x46, 0x00, 0x24, 0x00, 0x25, 0x9a, 0x46, 0x00, 0x26, + 0x17, 0xe0, 0x7f, 0x1c, 0x47, 0x45, 0x11, 0xd2, 0x59, 0xf8, 0x27, 0x00, + 0x03, 0x90, 0x69, 0x46, 0x5b, 0xf8, 0x27, 0x00, 0x01, 0x90, 0x02, 0xa8, + 0xff, 0xf7, 0xd0, 0xff, 0x01, 0x28, 0xf0, 0xd1, 0x00, 0x21, 0x32, 0x46, + 0xf1, 0xf7, 0x9e, 0xfa, 0x04, 0x43, 0x0d, 0x43, 0x0e, 0x9a, 0x92, 0x44, + 0x76, 0x1c, 0x10, 0x98, 0x86, 0x42, 0x03, 0xd2, 0xcd, 0xf8, 0x08, 0xa0, + 0x00, 0x27, 0xe1, 0xe7, 0x20, 0x46, 0x29, 0x46, 0x05, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0x2d, 0xe9, 0xf1, 0x4f, 0x82, 0xb0, 0x90, 0x46, 0x0d, 0x98, + 0x01, 0x25, 0x40, 0x45, 0x9a, 0x46, 0x03, 0xd2, 0x00, 0x25, 0x28, 0x46, + 0xbd, 0xe8, 0xfe, 0x8f, 0x0e, 0x9c, 0xdd, 0xf8, 0x30, 0x90, 0x0f, 0x9f, + 0x00, 0x91, 0xc3, 0x46, 0x00, 0x26, 0x0e, 0xe0, 0x39, 0x46, 0x00, 0x1b, + 0xe2, 0xf7, 0x2b, 0xfd, 0x40, 0x1c, 0x05, 0xe0, 0x00, 0x98, 0x50, 0xf8, + 0x26, 0x00, 0x84, 0x42, 0xf4, 0xd3, 0x01, 0x20, 0x49, 0xf8, 0x26, 0x00, + 0x76, 0x1c, 0x46, 0x45, 0xf4, 0xd3, 0x02, 0x98, 0x00, 0x21, 0x0a, 0xe0, + 0x59, 0xf8, 0x21, 0x30, 0x50, 0xf8, 0x21, 0x20, 0x5b, 0x1e, 0x7b, 0x43, + 0xa2, 0xeb, 0x53, 0x02, 0x4a, 0xf8, 0x21, 0x20, 0x49, 0x1c, 0x41, 0x45, + 0xf2, 0xd3, 0x0d, 0x98, 0x83, 0x45, 0xd0, 0xd2, 0x6a, 0x46, 0x59, 0x46, + 0x48, 0x46, 0xe2, 0xf7, 0xf4, 0xfc, 0x00, 0x98, 0x09, 0xeb, 0x80, 0x01, + 0x0a, 0x68, 0x53, 0x08, 0xd2, 0x1a, 0x0a, 0x60, 0x49, 0xf8, 0x2b, 0x30, + 0x5a, 0xf8, 0x20, 0x00, 0x02, 0xfb, 0x07, 0x02, 0x4a, 0xf8, 0x2b, 0x20, + 0x0b, 0xf1, 0x01, 0x0b, 0xe5, 0xe7, 0x2d, 0xe9, 0xf8, 0x41, 0xad, 0xf5, + 0x30, 0x6d, 0x0e, 0x46, 0x91, 0xb0, 0xb7, 0x68, 0xf5, 0x68, 0x80, 0x46, + 0x00, 0x23, 0x06, 0x22, 0x01, 0x21, 0xdc, 0xf7, 0x19, 0xfb, 0x04, 0x00, + 0x3f, 0xd1, 0x01, 0x20, 0x8d, 0xf8, 0x00, 0x00, 0x6b, 0x46, 0x06, 0x22, + 0x01, 0x21, 0x40, 0x46, 0xed, 0xf7, 0xa7, 0xfc, 0x04, 0x00, 0x34, 0xd1, + 0x38, 0x78, 0x01, 0x28, 0x07, 0xd1, 0x72, 0x69, 0x05, 0xf1, 0x14, 0x03, + 0x39, 0x1d, 0x40, 0x46, 0x00, 0xf0, 0x40, 0xf8, 0x04, 0x46, 0x78, 0x78, + 0x01, 0x28, 0x08, 0xbf, 0x00, 0x2c, 0x14, 0xd1, 0x30, 0x68, 0x01, 0x90, + 0x71, 0x68, 0x02, 0x91, 0xb0, 0x68, 0x00, 0xf1, 0x2c, 0x01, 0x03, 0x91, + 0xf1, 0x68, 0x01, 0xf1, 0x20, 0x02, 0x07, 0xa9, 0x04, 0x92, 0x05, 0x91, + 0x01, 0xa9, 0x30, 0x69, 0x06, 0x90, 0x40, 0x46, 0x01, 0xf0, 0xb2, 0xf8, + 0x04, 0x46, 0x6b, 0x46, 0x06, 0x22, 0x01, 0x21, 0x40, 0x46, 0xed, 0xf7, + 0xa4, 0xfc, 0x04, 0xb9, 0x04, 0x46, 0x00, 0x23, 0x06, 0x22, 0x01, 0x21, + 0x40, 0x46, 0xdc, 0xf7, 0xf3, 0xfa, 0x04, 0xb9, 0x04, 0x46, 0xb8, 0x78, + 0x01, 0x28, 0x08, 0xbf, 0x00, 0x2c, 0x08, 0xd1, 0x33, 0x69, 0x05, 0xf1, + 0x3c, 0x02, 0x07, 0xf1, 0x54, 0x01, 0x40, 0x46, 0x01, 0xf0, 0x94, 0xfa, + 0x04, 0x46, 0x0d, 0xf5, 0x30, 0x6d, 0x20, 0x46, 0x12, 0xb0, 0xbd, 0xe8, + 0xf0, 0x81, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0x0e, 0x46, 0x17, 0x46, + 0x98, 0x46, 0x05, 0x46, 0x00, 0x23, 0x4f, 0xf4, 0x80, 0x32, 0x00, 0x21, + 0xdc, 0xf7, 0x5e, 0xfe, 0x39, 0x46, 0x28, 0x46, 0x00, 0xf0, 0x41, 0xf8, + 0x04, 0x00, 0x04, 0xd1, 0x39, 0x46, 0x28, 0x46, 0x00, 0xf0, 0xab, 0xf8, + 0x04, 0x46, 0xcc, 0xb9, 0x32, 0x46, 0x39, 0x46, 0x28, 0x46, 0x00, 0xf0, + 0xcc, 0xf8, 0x04, 0x46, 0x54, 0xbb, 0x32, 0x46, 0x39, 0x46, 0x28, 0x46, + 0x00, 0xf0, 0x1a, 0xfa, 0x04, 0x46, 0x1c, 0xbb, 0x39, 0x46, 0x28, 0x46, + 0x00, 0xf0, 0x5d, 0xf8, 0x04, 0x46, 0xec, 0xb9, 0x32, 0x46, 0x39, 0x46, + 0x28, 0x46, 0x00, 0xf0, 0xb8, 0xfb, 0x04, 0x46, 0xb4, 0xb9, 0x07, 0xf1, + 0xc8, 0x00, 0xdf, 0xed, 0xa4, 0x0a, 0x90, 0xed, 0x01, 0x0a, 0x90, 0xed, + 0x00, 0x1a, 0x60, 0xee, 0x20, 0x0a, 0x20, 0xee, 0x81, 0x1a, 0xb0, 0xee, + 0xc1, 0x0a, 0xd6, 0xed, 0x09, 0x0a, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x48, 0xbf, 0x43, 0xf2, 0x07, 0x24, 0x41, 0x46, 0x38, 0x46, + 0x00, 0xf0, 0xd7, 0xfb, 0x20, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x38, 0xb5, + 0x05, 0x46, 0x0c, 0x46, 0x98, 0xb0, 0x00, 0x21, 0xc0, 0xb2, 0xd8, 0xf7, + 0x6c, 0xfe, 0x00, 0x23, 0x6a, 0x46, 0x0c, 0xa9, 0xe8, 0xb2, 0xd8, 0xf7, + 0x4a, 0xfe, 0x00, 0xf0, 0x20, 0xf8, 0xf7, 0xee, 0x00, 0x0a, 0x80, 0xee, + 0x80, 0x0a, 0x00, 0x20, 0x0c, 0xa9, 0x04, 0xeb, 0x80, 0x03, 0x31, 0xf9, + 0x10, 0x20, 0x00, 0xee, 0x90, 0x2a, 0xf8, 0xee, 0xe0, 0x0a, 0x60, 0xee, + 0x80, 0x0a, 0xc3, 0xed, 0x00, 0x0a, 0x3d, 0xf9, 0x10, 0x20, 0x00, 0xee, + 0x90, 0x2a, 0xf8, 0xee, 0xe0, 0x0a, 0x40, 0x1c, 0x60, 0xee, 0x80, 0x0a, + 0x18, 0x28, 0xc3, 0xed, 0x18, 0x0a, 0xe5, 0xd3, 0x00, 0xe2, 0xf2, 0xee, + 0x0e, 0x0a, 0xb0, 0xee, 0x00, 0x0a, 0xd8, 0xf7, 0x99, 0xbe, 0x70, 0xb5, + 0x2d, 0xed, 0x02, 0x8b, 0x98, 0xb0, 0x04, 0x46, 0x0d, 0x46, 0xff, 0xf7, + 0xf2, 0xff, 0xb0, 0xee, 0x40, 0x8a, 0x00, 0x26, 0x05, 0xeb, 0x86, 0x00, + 0x90, 0xed, 0x00, 0x0a, 0x28, 0xee, 0x00, 0x0a, 0xc1, 0xf7, 0xb8, 0xfe, + 0xbd, 0xee, 0xc0, 0x0a, 0x0c, 0xa9, 0x10, 0xee, 0x10, 0x0a, 0x21, 0xf8, + 0x16, 0x00, 0x05, 0xeb, 0x86, 0x00, 0x90, 0xed, 0xf9, 0x0a, 0x28, 0xee, + 0x00, 0x0a, 0xc1, 0xf7, 0xa9, 0xfe, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, + 0x10, 0x0a, 0x2d, 0xf8, 0x16, 0x00, 0x76, 0x1c, 0x18, 0x2e, 0xdf, 0xd3, + 0x01, 0x23, 0x6a, 0x46, 0x0c, 0xa9, 0xe0, 0xb2, 0xd8, 0xf7, 0xcd, 0xfd, + 0x01, 0x21, 0xe0, 0xb2, 0xd8, 0xf7, 0x09, 0xfe, 0x18, 0xb0, 0x00, 0x20, + 0xbd, 0xec, 0x02, 0x8b, 0x70, 0xbd, 0xf8, 0xb5, 0x04, 0x46, 0x0d, 0x46, + 0xcf, 0xf7, 0x74, 0xfc, 0x06, 0x46, 0x20, 0x46, 0xcf, 0xf7, 0x25, 0xfd, + 0x07, 0x46, 0x20, 0x46, 0xcf, 0xf7, 0x0a, 0xfc, 0x00, 0xee, 0x10, 0x0a, + 0x05, 0xf1, 0xc0, 0x00, 0x7f, 0x08, 0x07, 0x60, 0x76, 0x08, 0xd0, 0xed, + 0x00, 0x0a, 0x01, 0xee, 0x10, 0x6a, 0xb8, 0xee, 0x40, 0x0a, 0xf8, 0xee, + 0xe0, 0x0a, 0xb8, 0xee, 0x41, 0x1a, 0xc0, 0xee, 0x80, 0x0a, 0x81, 0xee, + 0x00, 0x0a, 0xc0, 0xed, 0x03, 0x0a, 0x80, 0xed, 0x04, 0x0a, 0x00, 0x20, + 0xf2, 0xbd, 0x2d, 0xe9, 0xfc, 0x47, 0x00, 0xf0, 0x2d, 0xfb, 0x05, 0xf1, + 0xe4, 0x08, 0x3a, 0x68, 0x43, 0x46, 0x49, 0x46, 0x20, 0x46, 0x00, 0xf0, + 0x16, 0xf8, 0x00, 0xf0, 0x1c, 0xfb, 0x79, 0x61, 0x05, 0xf5, 0xd2, 0x7a, + 0x68, 0xb9, 0x00, 0xf0, 0x0e, 0xfb, 0x00, 0xf0, 0x0c, 0xf8, 0x00, 0xf0, + 0x13, 0xfb, 0xb9, 0x61, 0x28, 0xb9, 0x05, 0xf1, 0xc4, 0x02, 0x51, 0x46, + 0x40, 0x46, 0x00, 0xf0, 0x77, 0xf8, 0xbd, 0xe8, 0xf6, 0x87, 0x2d, 0xe9, + 0xf8, 0x43, 0x0e, 0x46, 0xdc, 0xb0, 0x80, 0x46, 0x30, 0x69, 0x0e, 0x90, + 0x17, 0x46, 0x71, 0x69, 0x0f, 0x91, 0x1d, 0x46, 0x40, 0x46, 0xcf, 0xf7, + 0xd0, 0xfc, 0x81, 0x46, 0x11, 0xa9, 0x40, 0x46, 0xcf, 0xf7, 0x05, 0xfc, + 0x10, 0xa8, 0x04, 0x90, 0x0b, 0xab, 0x0c, 0xa9, 0x0d, 0xf1, 0x2a, 0x02, + 0x01, 0x93, 0x0d, 0xa8, 0x03, 0x91, 0x02, 0x92, 0x00, 0x90, 0x73, 0x78, + 0xb1, 0x68, 0x96, 0xed, 0x03, 0x0a, 0x00, 0x22, 0x40, 0x46, 0xfe, 0xf7, + 0x57, 0xfd, 0x04, 0x00, 0x0e, 0xd1, 0x0d, 0x98, 0x0c, 0x99, 0x02, 0x90, + 0x01, 0x91, 0xcd, 0xf8, 0x0c, 0x90, 0x00, 0x97, 0x11, 0xab, 0x16, 0xaa, + 0x2c, 0xa9, 0xdf, 0xf8, 0xa0, 0x04, 0xff, 0xf7, 0xb9, 0xf8, 0x04, 0x46, + 0xac, 0xbb, 0x00, 0x20, 0x00, 0x90, 0x00, 0x23, 0x31, 0x78, 0x3a, 0x46, + 0x40, 0x46, 0xda, 0xf7, 0xca, 0xfb, 0x04, 0x46, 0x5c, 0xbb, 0x64, 0x99, + 0x08, 0x91, 0x0a, 0xa8, 0x09, 0x90, 0x07, 0x95, 0x4f, 0xf4, 0x7a, 0x72, + 0x06, 0x92, 0x0a, 0x20, 0x05, 0x90, 0x00, 0x23, 0x03, 0x21, 0x0e, 0xaa, + 0x04, 0x93, 0x03, 0x91, 0x02, 0x92, 0x70, 0x78, 0xbd, 0xf8, 0x2a, 0x10, + 0xbd, 0xf8, 0x2c, 0x30, 0x01, 0x90, 0x00, 0x91, 0x01, 0x22, 0x96, 0xed, + 0x01, 0x0a, 0x16, 0xa9, 0x40, 0x46, 0xfe, 0xf7, 0xc1, 0xfd, 0x04, 0x46, + 0x9d, 0xf8, 0x28, 0x00, 0x00, 0x28, 0x04, 0xbf, 0x00, 0x2c, 0x43, 0xf2, + 0x08, 0x24, 0x00, 0x21, 0x40, 0x46, 0xda, 0xf7, 0x40, 0xfc, 0x04, 0xb9, + 0x04, 0x46, 0x20, 0x46, 0x5d, 0xb0, 0xbd, 0xe8, 0xf0, 0x83, 0x00, 0x00, + 0xdb, 0x0f, 0xc9, 0x40, 0x70, 0xb5, 0x04, 0x46, 0x8e, 0xb0, 0x94, 0xed, + 0x0c, 0x0a, 0xd4, 0xed, 0x03, 0x0a, 0xc0, 0xee, 0x20, 0x0a, 0xcd, 0xed, + 0x0d, 0x0a, 0x94, 0xed, 0x0d, 0x0a, 0xd4, 0xed, 0x03, 0x0a, 0xc0, 0xee, + 0x20, 0x0a, 0x04, 0xf1, 0x90, 0x00, 0xcd, 0xed, 0x0c, 0x0a, 0x90, 0xed, + 0x00, 0x0a, 0xd4, 0xed, 0x1b, 0x0a, 0xc0, 0xee, 0x20, 0x0a, 0xcd, 0xed, + 0x03, 0x0a, 0x90, 0xed, 0x01, 0x0a, 0xd4, 0xed, 0x1b, 0x0a, 0xc0, 0xee, + 0x20, 0x0a, 0xcd, 0xed, 0x02, 0x0a, 0x91, 0xed, 0x0c, 0x0a, 0xd1, 0xed, + 0x03, 0x0a, 0xc0, 0xee, 0x20, 0x0a, 0xcd, 0xed, 0x0b, 0x0a, 0x91, 0xed, + 0x0d, 0x0a, 0xd1, 0xed, 0x03, 0x0a, 0xc0, 0xee, 0x20, 0x0a, 0x01, 0xf1, + 0x90, 0x00, 0xcd, 0xed, 0x0a, 0x0a, 0x90, 0xed, 0x00, 0x0a, 0xd1, 0xed, + 0x1b, 0x0a, 0xc0, 0xee, 0x20, 0x0a, 0xcd, 0xed, 0x09, 0x0a, 0x90, 0xed, + 0x01, 0x0a, 0xd1, 0xed, 0x1b, 0x0a, 0x06, 0xa8, 0x01, 0x90, 0x15, 0x46, + 0xc0, 0xee, 0x20, 0x0a, 0x07, 0xae, 0xcd, 0xed, 0x08, 0x0a, 0x00, 0x96, + 0x08, 0xab, 0x09, 0xaa, 0x0c, 0xa9, 0x0d, 0xa8, 0x00, 0xf0, 0x43, 0xf8, + 0x04, 0xa8, 0x05, 0xa9, 0xbf, 0xee, 0x00, 0x0a, 0xdd, 0xed, 0x03, 0x0a, + 0x9d, 0xed, 0x02, 0x1a, 0x01, 0x90, 0x00, 0x91, 0x60, 0xee, 0x80, 0x0a, + 0x21, 0xee, 0x00, 0x0a, 0xcd, 0xed, 0x03, 0x0a, 0x8d, 0xed, 0x02, 0x0a, + 0x02, 0xab, 0x03, 0xaa, 0x0a, 0xa9, 0x0b, 0xa8, 0x00, 0xf0, 0x2b, 0xf8, + 0x9d, 0xed, 0x06, 0x0a, 0xdd, 0xed, 0x05, 0x0a, 0x9d, 0xed, 0x04, 0x1a, + 0xdd, 0xed, 0x04, 0x1a, 0x60, 0xee, 0x20, 0x0a, 0x9d, 0xed, 0x07, 0x0a, + 0x40, 0xee, 0x01, 0x0a, 0x9d, 0xed, 0x05, 0x1a, 0x20, 0xee, 0x01, 0x1a, + 0x9d, 0xed, 0x06, 0x0a, 0x00, 0xee, 0x61, 0x1a, 0x80, 0xee, 0x81, 0x0a, + 0x01, 0xf0, 0x7e, 0xfc, 0xf6, 0xee, 0x00, 0x0a, 0x60, 0xee, 0x20, 0x0a, + 0x94, 0xed, 0x00, 0x0a, 0x9f, 0xed, 0xbb, 0x1a, 0x20, 0xee, 0x01, 0x1a, + 0x80, 0xee, 0x81, 0x1a, 0x85, 0xed, 0x00, 0x1a, 0x00, 0x20, 0x0e, 0xb0, + 0x70, 0xbd, 0x30, 0xb5, 0x92, 0xed, 0x00, 0x0a, 0xd0, 0xed, 0x00, 0x0a, + 0xd3, 0xed, 0x00, 0x1a, 0x91, 0xed, 0x00, 0x2a, 0x03, 0x9c, 0x04, 0x9d, + 0x30, 0xee, 0x80, 0x1a, 0x30, 0xee, 0xc0, 0x0a, 0x72, 0xee, 0x21, 0x2a, + 0x72, 0xee, 0x61, 0x0a, 0x60, 0xee, 0x00, 0x1a, 0x21, 0xee, 0x00, 0x2a, + 0x40, 0xee, 0xa0, 0x1a, 0x02, 0xee, 0xa0, 0x2a, 0x22, 0xee, 0x80, 0x0a, + 0x82, 0xee, 0x21, 0x2a, 0x01, 0xee, 0x60, 0x0a, 0x84, 0xed, 0x00, 0x2a, + 0x80, 0xee, 0x21, 0x0a, 0x85, 0xed, 0x00, 0x0a, 0x00, 0x20, 0x30, 0xbd, + 0x38, 0xb5, 0xad, 0xf5, 0x16, 0x6d, 0x15, 0x46, 0x0c, 0x46, 0x18, 0xaa, + 0x28, 0x46, 0x00, 0xf0, 0xc1, 0xf8, 0x6a, 0x46, 0x21, 0x46, 0x28, 0x46, + 0x00, 0xf0, 0x44, 0xf9, 0x04, 0xf5, 0x79, 0x74, 0x23, 0x46, 0x18, 0x22, + 0x69, 0x46, 0x18, 0xa8, 0xfb, 0xf7, 0xde, 0xfd, 0x9f, 0xed, 0x97, 0x0a, + 0x00, 0x20, 0x54, 0xf8, 0x20, 0x10, 0x21, 0xf0, 0x00, 0x41, 0x00, 0xee, + 0x90, 0x1a, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x58, 0xbf, + 0xb0, 0xee, 0x60, 0x0a, 0x40, 0x1c, 0x18, 0x28, 0xef, 0xd3, 0xdf, 0xed, + 0x8f, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x11, 0xdb, + 0x9f, 0xed, 0x8c, 0x1a, 0x81, 0xee, 0x00, 0x0a, 0x00, 0x20, 0x04, 0xeb, + 0x80, 0x01, 0x04, 0xeb, 0x80, 0x02, 0xd1, 0xed, 0x00, 0x0a, 0x40, 0x1c, + 0x60, 0xee, 0x80, 0x0a, 0x18, 0x28, 0xc2, 0xed, 0x00, 0x0a, 0xf2, 0xd3, + 0x0d, 0xf5, 0x10, 0x6d, 0x00, 0x20, 0x19, 0xb0, 0x30, 0xbd, 0x00, 0x00, + 0xf8, 0xb5, 0x2d, 0xed, 0x06, 0x8b, 0xb0, 0xee, 0x40, 0xaa, 0xf2, 0xee, + 0x0e, 0x9a, 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0xf0, 0xee, 0x69, 0x0a, + 0xff, 0xf7, 0xef, 0xfd, 0xb0, 0xee, 0x40, 0x9a, 0xf0, 0xee, 0x69, 0x0a, + 0xff, 0xf7, 0xe9, 0xfd, 0xf7, 0xee, 0x00, 0x0a, 0xc0, 0xee, 0x80, 0xaa, + 0xd6, 0xed, 0x31, 0x9a, 0x31, 0x46, 0x20, 0x46, 0xff, 0xf7, 0xad, 0xfd, + 0x9f, 0xed, 0x6f, 0x8a, 0xdf, 0xed, 0x6e, 0x8a, 0x00, 0x20, 0x06, 0xf1, + 0x60, 0x02, 0x06, 0xeb, 0x80, 0x01, 0x02, 0xeb, 0x80, 0x03, 0x40, 0x1c, + 0x91, 0xed, 0x00, 0x0a, 0xd3, 0xed, 0x00, 0x0a, 0x18, 0x28, 0x38, 0xee, + 0x00, 0x8a, 0x78, 0xee, 0xa0, 0x8a, 0xf0, 0xd3, 0xb1, 0xee, 0x4a, 0x0a, + 0x86, 0xed, 0x31, 0x0a, 0x00, 0xf0, 0x44, 0xf8, 0x00, 0x28, 0x3e, 0xd1, + 0x00, 0x27, 0x06, 0xeb, 0x87, 0x00, 0x90, 0xed, 0xf9, 0x0a, 0x29, 0xee, + 0x00, 0x0a, 0xc1, 0xf7, 0x87, 0xfc, 0x06, 0xf1, 0x60, 0x00, 0x00, 0xeb, + 0x87, 0x01, 0x7f, 0x1c, 0x2a, 0xee, 0x80, 0x0a, 0x18, 0x2f, 0x81, 0xed, + 0x00, 0x0a, 0xec, 0xd3, 0x60, 0x22, 0x06, 0xf1, 0x60, 0x01, 0x30, 0x46, + 0xc1, 0xf7, 0x1a, 0xfb, 0x88, 0xee, 0x28, 0x0a, 0xc1, 0xf7, 0x72, 0xfc, + 0xb5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x0f, 0xd5, 0x00, 0x20, + 0x06, 0xeb, 0x80, 0x01, 0xff, 0xee, 0x00, 0x0a, 0x91, 0xed, 0x00, 0x0a, + 0x06, 0xeb, 0x80, 0x02, 0x40, 0x1c, 0x60, 0xee, 0x20, 0x0a, 0x18, 0x28, + 0xc2, 0xed, 0x00, 0x0a, 0xf0, 0xd3, 0xc6, 0xed, 0x31, 0x9a, 0x00, 0xf0, + 0x0b, 0xf8, 0x30, 0xb9, 0xbd, 0xec, 0x06, 0x8b, 0x31, 0x46, 0x20, 0x46, + 0xbd, 0xe8, 0xf4, 0x40, 0x85, 0xe5, 0xbd, 0xec, 0x06, 0x8b, 0xf2, 0xbd, + 0x2a, 0x46, 0x31, 0x46, 0x20, 0x46, 0x35, 0xe7, 0x2d, 0xe9, 0xf8, 0x43, + 0x80, 0x46, 0x2d, 0xed, 0x02, 0x8b, 0x89, 0x46, 0x14, 0x46, 0x98, 0xed, + 0x08, 0x8a, 0x00, 0x27, 0x60, 0x23, 0x7b, 0x43, 0x00, 0x25, 0xe6, 0x18, + 0x78, 0x1b, 0x00, 0xee, 0x10, 0x0a, 0x06, 0xeb, 0x85, 0x02, 0xb8, 0xee, + 0xc0, 0x0a, 0x49, 0x46, 0x40, 0x46, 0x00, 0xf0, 0x19, 0xf8, 0xaf, 0x42, + 0x0b, 0xd1, 0x06, 0xeb, 0x85, 0x00, 0xf0, 0xee, 0x00, 0x0a, 0x90, 0xed, + 0x00, 0x0a, 0x06, 0xeb, 0x85, 0x01, 0x08, 0xee, 0x20, 0x0a, 0x81, 0xed, + 0x00, 0x0a, 0x6d, 0x1c, 0x18, 0x2d, 0xe3, 0xd3, 0x7f, 0x1c, 0x18, 0x2f, + 0xdc, 0xd3, 0xbd, 0xec, 0x02, 0x8b, 0x00, 0x20, 0xbd, 0xe8, 0xf2, 0x83, + 0x10, 0xb5, 0x2d, 0xed, 0x06, 0x8b, 0xb0, 0xee, 0x40, 0x9a, 0x90, 0xed, + 0x06, 0x0a, 0xd0, 0xed, 0x07, 0x8a, 0x70, 0xee, 0x68, 0x9a, 0xb0, 0xee, + 0xc9, 0x0a, 0x9f, 0xed, 0x21, 0x1a, 0x01, 0xf1, 0xcc, 0x00, 0xb4, 0xee, + 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x14, 0x46, 0xd0, 0xed, 0x00, 0x0a, + 0x90, 0xed, 0x01, 0x8a, 0x0c, 0xd5, 0x9f, 0xed, 0x1b, 0x0a, 0x69, 0xee, + 0x80, 0x1a, 0x61, 0xee, 0xa0, 0x0a, 0x68, 0xee, 0x80, 0x1a, 0x41, 0xee, + 0x88, 0x0a, 0xc4, 0xed, 0x00, 0x0a, 0x1b, 0xe0, 0x9f, 0xed, 0x0f, 0xaa, + 0x20, 0xee, 0x8a, 0x0a, 0x20, 0xee, 0x09, 0x0a, 0xc1, 0xf7, 0xc8, 0xfb, + 0xf0, 0xee, 0x00, 0x0a, 0x29, 0xee, 0xa0, 0x1a, 0x68, 0xee, 0xa0, 0x8a, + 0x61, 0xee, 0x00, 0x9a, 0x68, 0xee, 0x0a, 0x0a, 0x20, 0xee, 0x89, 0x0a, + 0xc1, 0xf7, 0xba, 0xfb, 0x48, 0xee, 0x80, 0x9a, 0x89, 0xee, 0x89, 0x0a, + 0x84, 0xed, 0x00, 0x0a, 0x00, 0x20, 0xbd, 0xec, 0x06, 0x8b, 0x10, 0xbd, + 0xdb, 0x0f, 0xc9, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x7f, 0x3f, + 0x00, 0xfe, 0x7f, 0x3f, 0x17, 0xb7, 0xd1, 0x38, 0xdb, 0x0f, 0x49, 0x41, + 0x84, 0x92, 0x04, 0x01, 0xf8, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x04, 0x46, + 0x82, 0xb0, 0x0d, 0x46, 0x16, 0x46, 0x94, 0xed, 0x08, 0x8a, 0x00, 0x27, + 0x6b, 0x46, 0x3a, 0x46, 0x29, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x14, 0xf8, + 0x05, 0xeb, 0x87, 0x00, 0xb0, 0xee, 0x00, 0x0a, 0x28, 0xee, 0x00, 0x0a, + 0xd0, 0xed, 0x18, 0x0a, 0x9d, 0xed, 0x00, 0x1a, 0x06, 0xeb, 0x87, 0x00, + 0x7f, 0x1c, 0x00, 0xee, 0x20, 0x1a, 0x18, 0x2f, 0x80, 0xed, 0x00, 0x1a, + 0xe6, 0xd3, 0x2f, 0xe0, 0xf8, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x0d, 0x46, + 0x82, 0xb0, 0x1e, 0x46, 0x95, 0xed, 0x31, 0x0a, 0xff, 0xee, 0x00, 0x0a, + 0x00, 0x23, 0x04, 0x46, 0x60, 0xee, 0x20, 0x8a, 0x33, 0x60, 0x00, 0x27, + 0x08, 0xee, 0x10, 0x2a, 0x00, 0xee, 0x10, 0x7a, 0xb8, 0xee, 0xc0, 0x0a, + 0x30, 0xee, 0x28, 0x0a, 0xf8, 0xee, 0xc8, 0x0a, 0x6a, 0x46, 0x30, 0xee, + 0x60, 0x0a, 0x29, 0x46, 0x20, 0x46, 0xff, 0xf7, 0x65, 0xff, 0x05, 0xeb, + 0x87, 0x03, 0xdd, 0xed, 0x00, 0x0a, 0x93, 0xed, 0x18, 0x0a, 0x96, 0xed, + 0x00, 0x1a, 0x7f, 0x1c, 0x00, 0xee, 0x20, 0x1a, 0x18, 0x2f, 0x86, 0xed, + 0x00, 0x1a, 0xe1, 0xd3, 0x02, 0xb0, 0x00, 0x20, 0xbd, 0xec, 0x02, 0x8b, + 0xf2, 0xbd, 0x2d, 0xe9, 0xfc, 0x47, 0x00, 0xf0, 0x2d, 0xf8, 0x05, 0xf5, + 0x19, 0x78, 0x3a, 0x68, 0x43, 0x46, 0x49, 0x46, 0x20, 0x46, 0xff, 0xf7, + 0x16, 0xfd, 0x00, 0xf0, 0x1c, 0xf8, 0xf9, 0x61, 0x05, 0xf5, 0x49, 0x7a, + 0x68, 0xb9, 0x00, 0xf0, 0x0e, 0xf8, 0xff, 0xf7, 0x0c, 0xfd, 0x00, 0xf0, + 0x13, 0xf8, 0x39, 0x62, 0x28, 0xb9, 0x05, 0xf1, 0xc8, 0x02, 0x51, 0x46, + 0x40, 0x46, 0xff, 0xf7, 0x77, 0xfd, 0xbd, 0xe8, 0xf6, 0x87, 0x01, 0xa8, + 0x00, 0x90, 0x53, 0x46, 0x3a, 0x68, 0x52, 0x42, 0x49, 0x46, 0x20, 0x46, + 0x70, 0x47, 0x01, 0xae, 0x9d, 0xf8, 0x04, 0x10, 0x72, 0x78, 0x41, 0xea, + 0x02, 0x41, 0x70, 0x47, 0x04, 0x46, 0x0d, 0x46, 0x01, 0xa8, 0x00, 0x21, + 0x05, 0xf1, 0xc0, 0x07, 0x01, 0xab, 0x91, 0x46, 0x01, 0x80, 0x00, 0x93, + 0x70, 0x47, 0x50, 0xf8, 0xc0, 0x2f, 0x0a, 0x60, 0x43, 0x68, 0x4b, 0x60, + 0x80, 0x68, 0x88, 0x60, 0x70, 0x47, 0xc0, 0xb2, 0xd8, 0xf7, 0x95, 0xba, + 0x2d, 0xe9, 0xf8, 0x4f, 0x00, 0x24, 0xdf, 0xf8, 0xa0, 0x82, 0xa8, 0x4e, + 0x4f, 0xf4, 0xe0, 0x79, 0x82, 0x46, 0x2a, 0xfa, 0x04, 0xf0, 0xc0, 0x07, + 0x2e, 0xd5, 0x20, 0x46, 0xcf, 0xf7, 0x52, 0xfa, 0x05, 0x46, 0x09, 0xfb, + 0x05, 0xf0, 0x37, 0x18, 0x49, 0x46, 0x38, 0x46, 0xd3, 0xf7, 0x0a, 0xfd, + 0x9f, 0x48, 0x00, 0xeb, 0x45, 0x1b, 0x20, 0x21, 0x58, 0x46, 0xd3, 0xf7, + 0x03, 0xfd, 0x18, 0x21, 0x9c, 0x48, 0x69, 0x43, 0x08, 0x44, 0xcc, 0x23, + 0x06, 0xf5, 0xe3, 0x62, 0x6b, 0x43, 0x02, 0x60, 0x33, 0x44, 0x47, 0x60, + 0x03, 0xf6, 0x34, 0x01, 0x81, 0x60, 0x06, 0xf5, 0xe0, 0x62, 0x3c, 0x21, + 0x4d, 0x43, 0x71, 0x19, 0x01, 0xf2, 0x44, 0x73, 0xc2, 0x60, 0x03, 0x61, + 0xc0, 0xf8, 0x14, 0xb0, 0xd8, 0xf8, 0x00, 0x10, 0x41, 0xf8, 0x24, 0x00, + 0x64, 0x1c, 0x08, 0x2c, 0xc9, 0xd3, 0xbd, 0xe8, 0xf1, 0x8f, 0x00, 0x00, + 0x2d, 0xe9, 0xfe, 0x4f, 0xdf, 0xf8, 0x20, 0x92, 0x00, 0x24, 0x09, 0xf5, + 0xe3, 0x62, 0xa2, 0x46, 0x01, 0x92, 0x09, 0xf5, 0xe8, 0x67, 0x0f, 0xf2, + 0x20, 0x28, 0x02, 0x90, 0x02, 0x98, 0x20, 0xfa, 0x0a, 0xf0, 0xc1, 0x07, + 0x74, 0xd5, 0x50, 0x46, 0xcf, 0xf7, 0x0a, 0xfa, 0x05, 0x46, 0x7f, 0x48, + 0x00, 0xeb, 0x45, 0x16, 0x30, 0x46, 0xe9, 0xf7, 0x44, 0xfd, 0x00, 0xf0, + 0x7b, 0xf8, 0xdb, 0xf7, 0x2f, 0xfe, 0x04, 0x00, 0x06, 0xd1, 0x6b, 0x46, + 0x05, 0x22, 0x01, 0x21, 0x50, 0x46, 0xec, 0xf7, 0xc0, 0xff, 0x04, 0x46, + 0x00, 0x2c, 0x48, 0xd1, 0x38, 0x78, 0xb0, 0xb1, 0x3c, 0x21, 0x69, 0x43, + 0x09, 0xeb, 0x01, 0x0b, 0x0b, 0xf2, 0x44, 0x72, 0x09, 0xf5, 0xe0, 0x61, + 0x50, 0x46, 0x01, 0xf0, 0xfb, 0xf9, 0x04, 0x00, 0x9b, 0xf8, 0x7c, 0x07, + 0xf0, 0x61, 0x06, 0xd0, 0x23, 0x46, 0x42, 0x46, 0x07, 0x21, 0x03, 0x20, + 0xcf, 0xf7, 0xd5, 0xfa, 0x2f, 0xe0, 0x4f, 0xf4, 0xe0, 0x71, 0x69, 0x43, + 0x78, 0x78, 0x09, 0xeb, 0x01, 0x0b, 0x30, 0xb1, 0x01, 0x99, 0x5a, 0x46, + 0x50, 0x46, 0x00, 0xf0, 0xeb, 0xf8, 0x04, 0x00, 0x0c, 0xd1, 0xb8, 0x78, + 0x58, 0xb1, 0xcc, 0x21, 0x4d, 0x43, 0x09, 0xeb, 0x05, 0x01, 0x01, 0xf6, + 0x34, 0x02, 0x01, 0x99, 0x50, 0x46, 0x00, 0xf0, 0xfd, 0xf8, 0x04, 0x46, + 0x9c, 0xb9, 0x78, 0x78, 0x88, 0xb1, 0x0b, 0xf5, 0xdc, 0x70, 0x53, 0x46, + 0x90, 0xf8, 0x00, 0x10, 0x5e, 0xa2, 0x71, 0x61, 0x41, 0x68, 0xb1, 0x61, + 0x00, 0x78, 0xb0, 0x60, 0x03, 0x20, 0x99, 0xf8, 0xb8, 0x11, 0x00, 0x91, + 0x07, 0x21, 0xcf, 0xf7, 0xa4, 0xfa, 0x00, 0xf0, 0x23, 0xf8, 0xdb, 0xf7, + 0xf1, 0xfd, 0x05, 0x46, 0x6b, 0x46, 0x05, 0x22, 0x01, 0x21, 0x50, 0x46, + 0xec, 0xf7, 0x93, 0xff, 0x05, 0xb9, 0x05, 0x46, 0x04, 0xb9, 0x2c, 0x46, + 0x21, 0x46, 0x30, 0x46, 0xe9, 0xf7, 0xdd, 0xfc, 0x0a, 0xf1, 0x01, 0x0a, + 0xba, 0xf1, 0x08, 0x0f, 0x02, 0xd2, 0x00, 0x2c, 0x3f, 0xf4, 0x7e, 0xaf, + 0x4f, 0xea, 0x04, 0x03, 0x4f, 0xa2, 0x07, 0x21, 0x03, 0x20, 0xcf, 0xf7, + 0x82, 0xfa, 0x20, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, 0x01, 0x20, 0x8d, 0xf8, + 0x00, 0x00, 0x00, 0x23, 0x05, 0x22, 0x01, 0x21, 0x50, 0x46, 0x70, 0x47, + 0xf8, 0xb5, 0x0c, 0x46, 0x15, 0x46, 0x1f, 0x46, 0xe9, 0xf7, 0xd0, 0xfc, + 0xcf, 0xf7, 0x76, 0xf9, 0x00, 0x26, 0xff, 0x28, 0x1f, 0xd0, 0x34, 0x49, + 0x01, 0xeb, 0x40, 0x11, 0x1f, 0xb1, 0x02, 0x2f, 0x0b, 0xd0, 0x0c, 0xd3, + 0x11, 0xe0, 0x14, 0x27, 0x28, 0x68, 0xb8, 0x42, 0x10, 0xd3, 0x3a, 0x46, + 0x20, 0x46, 0xc1, 0xf7, 0xb7, 0xf8, 0x2f, 0x60, 0x0f, 0xe0, 0x20, 0x27, + 0xf4, 0xe7, 0x4f, 0xf4, 0xe0, 0x77, 0x28, 0x49, 0x78, 0x43, 0x01, 0x44, + 0xee, 0xe7, 0x4f, 0xf6, 0x2a, 0x76, 0x04, 0xe0, 0x4f, 0xf6, 0x26, 0x76, + 0x01, 0xe0, 0x4f, 0xf6, 0x52, 0x76, 0x30, 0x46, 0xf2, 0xbd, 0x80, 0xb5, + 0x00, 0xf0, 0x09, 0xf8, 0xd9, 0xf7, 0x07, 0xf9, 0x02, 0xbd, 0x80, 0xb5, + 0x00, 0xf0, 0x03, 0xf8, 0xd9, 0xf7, 0xec, 0xf8, 0x02, 0xbd, 0x00, 0x92, + 0x0b, 0x46, 0x02, 0x46, 0x44, 0x21, 0x1c, 0x48, 0x70, 0x47, 0x38, 0xb5, + 0x0c, 0x46, 0xcf, 0xf7, 0x39, 0xf9, 0x00, 0x25, 0xff, 0x28, 0x05, 0xd0, + 0x15, 0x49, 0x01, 0xeb, 0x40, 0x10, 0x42, 0x69, 0x22, 0x70, 0x01, 0xe0, + 0x4f, 0xf6, 0x52, 0x75, 0x28, 0x46, 0x32, 0xbd, 0x38, 0xb5, 0x0c, 0x46, + 0xcf, 0xf7, 0x28, 0xf9, 0x00, 0x25, 0xff, 0x28, 0x05, 0xd0, 0x0d, 0x49, + 0x01, 0xeb, 0x40, 0x10, 0x82, 0x69, 0x22, 0x60, 0x01, 0xe0, 0x4f, 0xf6, + 0x52, 0x75, 0x28, 0x46, 0x32, 0xbd, 0x38, 0xb5, 0x0c, 0x46, 0xe9, 0xf7, + 0x6f, 0xfc, 0xcf, 0xf7, 0x15, 0xf9, 0x00, 0x25, 0x01, 0x2c, 0x18, 0xbf, + 0x4f, 0xf6, 0x27, 0x75, 0x28, 0x46, 0x32, 0xbd, 0x84, 0x04, 0x00, 0x01, + 0x10, 0x4a, 0x00, 0x20, 0x4c, 0x6a, 0x02, 0x20, 0xfc, 0x70, 0x02, 0x20, + 0x10, 0x51, 0x00, 0x20, 0x4c, 0x62, 0x50, 0x68, 0x61, 0x73, 0x65, 0x43, + 0x61, 0x6c, 0x3a, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x58, 0x0a, 0x00, + 0x50, 0x61, 0x74, 0x68, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x3a, 0x20, 0x63, + 0x68, 0x25, 0x64, 0x2c, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x50, 0x61, 0x74, 0x68, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x3a, 0x20, 0x65, + 0x72, 0x72, 0x20, 0x25, 0x58, 0x0a, 0x00, 0x00, 0xf8, 0xb5, 0x0c, 0x46, + 0x05, 0x46, 0x16, 0x46, 0x06, 0xf5, 0xd8, 0x77, 0x60, 0x7d, 0xf8, 0x71, + 0x28, 0x46, 0x21, 0x7d, 0xb9, 0x71, 0xce, 0xf7, 0x16, 0xff, 0x38, 0x60, + 0x28, 0x46, 0x61, 0x7d, 0x79, 0x71, 0x01, 0xf0, 0x87, 0xfa, 0x32, 0x46, + 0x21, 0x46, 0x28, 0x46, 0x00, 0xf0, 0x74, 0xf8, 0x04, 0x00, 0x03, 0xd1, + 0x39, 0x7a, 0x28, 0x46, 0x01, 0xf0, 0x7c, 0xfa, 0x20, 0x46, 0xf2, 0xbd, + 0x2d, 0xe9, 0xf0, 0x47, 0xf0, 0xb0, 0x81, 0x46, 0x0c, 0x46, 0x90, 0x46, + 0x68, 0x46, 0x4f, 0xf4, 0xe0, 0x71, 0xd2, 0xf7, 0x37, 0xfe, 0x48, 0x46, + 0x6c, 0xae, 0x01, 0xf0, 0x84, 0xfa, 0x04, 0xf1, 0x24, 0x05, 0x70, 0x71, + 0x95, 0xf9, 0x00, 0x20, 0x70, 0x79, 0x41, 0xb2, 0x02, 0xeb, 0xd2, 0x72, + 0xa1, 0xeb, 0x62, 0x01, 0x4a, 0xb2, 0x00, 0x2a, 0x48, 0xbf, 0x00, 0x21, + 0xf1, 0x71, 0x29, 0x78, 0x00, 0xeb, 0x51, 0x00, 0xb0, 0xf5, 0x80, 0x7f, + 0x28, 0xbf, 0xff, 0x20, 0xb0, 0x71, 0x48, 0x46, 0xce, 0xf7, 0xd9, 0xfe, + 0x6c, 0x90, 0x6a, 0x46, 0x21, 0x46, 0x48, 0x46, 0x00, 0xf0, 0x3c, 0xf8, + 0x04, 0x00, 0x16, 0xd1, 0x31, 0x7a, 0x70, 0x79, 0x08, 0x1a, 0x07, 0x46, + 0x48, 0xbf, 0x7f, 0x42, 0x48, 0x46, 0xce, 0xf7, 0xc6, 0xfe, 0x82, 0x46, + 0x48, 0x46, 0xda, 0xf7, 0x2d, 0xf8, 0x69, 0x78, 0xba, 0xfb, 0xf0, 0xf0, + 0x41, 0x43, 0xc9, 0xb2, 0xff, 0xb2, 0xb9, 0x42, 0x38, 0xbf, 0x40, 0xf2, + 0x02, 0x74, 0x08, 0xf1, 0xc0, 0x00, 0x71, 0x79, 0x41, 0x70, 0xf2, 0x79, + 0xc2, 0x70, 0xb1, 0x79, 0x81, 0x70, 0x32, 0x7a, 0x02, 0x71, 0x40, 0x22, + 0x31, 0x79, 0x01, 0x70, 0x40, 0x46, 0x69, 0x46, 0xc0, 0xf7, 0xce, 0xff, + 0x40, 0x22, 0x24, 0xa9, 0x08, 0xf1, 0x40, 0x00, 0xc0, 0xf7, 0xc8, 0xff, + 0x40, 0x22, 0x48, 0xa9, 0x08, 0xf1, 0x80, 0x00, 0xc0, 0xf7, 0xc2, 0xff, + 0x20, 0x46, 0x70, 0xb0, 0xbd, 0xe8, 0xf0, 0x87, 0x01, 0xf0, 0x0e, 0xba, + 0x2d, 0xe9, 0xf1, 0x4f, 0x2d, 0xed, 0x06, 0x8b, 0x89, 0x46, 0x92, 0x46, + 0x9a, 0xb0, 0x0f, 0xf2, 0x44, 0x42, 0x07, 0x21, 0x04, 0x20, 0xcf, 0xf7, + 0x44, 0xf9, 0x0a, 0xf5, 0xd8, 0x77, 0xb8, 0x79, 0xfc, 0x79, 0x99, 0xed, + 0x04, 0x8a, 0x04, 0x1b, 0x64, 0x1c, 0x20, 0x98, 0xe4, 0xb2, 0xce, 0xf7, + 0xed, 0xfe, 0x01, 0xee, 0x10, 0x4a, 0x97, 0xed, 0x00, 0x0a, 0xf0, 0xee, + 0x00, 0x0a, 0xb8, 0xee, 0x41, 0x1a, 0xb8, 0xee, 0x40, 0x0a, 0x21, 0xee, + 0x20, 0x1a, 0x00, 0xeb, 0xd0, 0x75, 0x80, 0xee, 0x01, 0x9a, 0x6d, 0x10, + 0x69, 0xee, 0x20, 0x8a, 0x00, 0xee, 0x90, 0x5a, 0xf8, 0xee, 0xe0, 0x9a, + 0xf6, 0xee, 0x00, 0x0a, 0x69, 0xee, 0xa0, 0x1a, 0xf4, 0xee, 0x68, 0x1a, + 0xf1, 0xee, 0x10, 0xfa, 0x4f, 0xf0, 0x00, 0x08, 0x05, 0xd5, 0xf0, 0xee, + 0x49, 0x8a, 0x28, 0xee, 0xa0, 0x9a, 0x01, 0x24, 0x29, 0xe0, 0x20, 0xee, + 0x20, 0x0a, 0x80, 0xee, 0x28, 0x0a, 0xf1, 0xf7, 0xcd, 0xf8, 0xb0, 0xee, + 0x40, 0xaa, 0xb0, 0xee, 0x48, 0x0a, 0xf1, 0xf7, 0xc7, 0xf8, 0x8a, 0xee, + 0x00, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x4a, 0x9f, 0xed, + 0xa2, 0x0a, 0x29, 0xee, 0x80, 0x0a, 0x80, 0xee, 0x28, 0x0a, 0xf1, 0xf7, + 0xb9, 0xf8, 0xe4, 0xb2, 0x20, 0x46, 0x00, 0xee, 0x90, 0x0a, 0xf8, 0xee, + 0x60, 0x0a, 0xbf, 0xee, 0x00, 0x1a, 0x70, 0xee, 0x81, 0x0a, 0x80, 0xee, + 0x20, 0x0a, 0x01, 0xf0, 0xd3, 0xf9, 0xb0, 0xee, 0x40, 0x8a, 0x66, 0x1c, + 0xb0, 0x00, 0x38, 0x71, 0xc0, 0xb2, 0x25, 0x28, 0x28, 0xbf, 0x40, 0xf2, + 0x03, 0x78, 0x46, 0xd2, 0x76, 0x06, 0xbd, 0xee, 0xc9, 0x0a, 0x36, 0x0e, + 0x10, 0xee, 0x10, 0x0a, 0x4a, 0xf8, 0x26, 0x00, 0x0a, 0xeb, 0xc6, 0x01, + 0x28, 0x1a, 0x41, 0xf8, 0x04, 0x0c, 0x4f, 0xf0, 0x01, 0x0b, 0x1d, 0xe0, + 0x58, 0x46, 0x00, 0xf0, 0x9d, 0xf9, 0xff, 0xee, 0x00, 0x0a, 0x70, 0xee, + 0x20, 0x0a, 0xb0, 0xee, 0x48, 0x0a, 0xd8, 0xf7, 0x57, 0xf8, 0x20, 0xee, + 0x28, 0x0a, 0x00, 0xf0, 0x07, 0xf9, 0x0b, 0xeb, 0x06, 0x01, 0x4a, 0xf8, + 0x21, 0x00, 0x71, 0x00, 0x49, 0x1e, 0xa1, 0xeb, 0x0b, 0x01, 0x28, 0x1a, + 0x4a, 0xf8, 0x21, 0x00, 0x0b, 0xf1, 0x01, 0x00, 0x5f, 0xfa, 0x80, 0xfb, + 0x5c, 0x45, 0xdf, 0xda, 0x00, 0x20, 0x76, 0xb2, 0x72, 0x00, 0x41, 0xb2, + 0x52, 0x1e, 0x52, 0x1a, 0x5a, 0xf8, 0x22, 0x30, 0x5b, 0x42, 0x72, 0x1e, + 0x4a, 0xf8, 0x20, 0x30, 0x52, 0x1a, 0x89, 0x19, 0x5a, 0xf8, 0x21, 0x10, + 0x40, 0x1c, 0x49, 0x42, 0xc0, 0xb2, 0x4a, 0xf8, 0x22, 0x10, 0x84, 0x42, + 0xea, 0xda, 0x5f, 0xea, 0x08, 0x04, 0x40, 0xf0, 0xa2, 0x80, 0x20, 0x99, + 0x02, 0x91, 0x00, 0x22, 0x8d, 0xf8, 0x0c, 0x20, 0xad, 0xf8, 0x0e, 0x20, + 0x01, 0x21, 0x01, 0x22, 0x8d, 0xf8, 0x0d, 0x10, 0x04, 0x92, 0x03, 0x22, + 0xd9, 0xf8, 0x08, 0x00, 0x09, 0x90, 0x02, 0xa8, 0xd9, 0xf8, 0x04, 0x10, + 0x07, 0x91, 0x8d, 0xf8, 0x28, 0x20, 0x01, 0x21, 0x8d, 0xf8, 0x29, 0x10, + 0x01, 0xaa, 0x0d, 0xf1, 0x06, 0x01, 0xdc, 0xf7, 0x4d, 0xfe, 0x04, 0x46, + 0xbd, 0xf8, 0x04, 0x20, 0x9d, 0xf8, 0x0d, 0x10, 0x20, 0x98, 0xec, 0xf7, + 0xfc, 0xff, 0xd9, 0xed, 0x00, 0x0a, 0x99, 0xed, 0x01, 0x1a, 0x00, 0xee, + 0x10, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0xb8, 0xee, 0x41, 0x1a, 0x20, 0xee, + 0x81, 0x1a, 0xb8, 0xee, 0x40, 0x0a, 0x81, 0xee, 0x00, 0x0a, 0x00, 0xf0, + 0xa3, 0xf8, 0xc0, 0xb2, 0x00, 0x2c, 0x08, 0x90, 0x5f, 0xd1, 0x20, 0x98, + 0x00, 0x21, 0x01, 0xf0, 0x30, 0xf9, 0x20, 0x9e, 0x00, 0x25, 0x23, 0xe0, + 0x02, 0x21, 0x30, 0x46, 0x00, 0xf0, 0x99, 0xf8, 0x0b, 0xa9, 0x02, 0xa8, + 0xdc, 0xf7, 0x6e, 0xfd, 0x03, 0x00, 0x43, 0xd1, 0x0a, 0xeb, 0x85, 0x00, + 0x9d, 0xed, 0x16, 0x0a, 0xdd, 0xed, 0x12, 0x0a, 0xc0, 0xee, 0x20, 0x0a, + 0xc0, 0xed, 0x24, 0x0a, 0x9d, 0xed, 0x18, 0x0a, 0xdd, 0xed, 0x12, 0x0a, + 0xc0, 0xee, 0x20, 0x0a, 0xc0, 0xed, 0x48, 0x0a, 0x00, 0x21, 0x30, 0x46, + 0xd9, 0xf7, 0x5b, 0xfe, 0x04, 0x00, 0x36, 0xd1, 0x6d, 0x1c, 0xed, 0xb2, + 0x38, 0x79, 0x85, 0x42, 0x31, 0xda, 0x5a, 0xf8, 0x25, 0x10, 0x05, 0x91, + 0x00, 0x20, 0x00, 0x90, 0x00, 0x23, 0x5a, 0xf8, 0x25, 0x20, 0x01, 0x21, + 0x30, 0x46, 0xd9, 0xf7, 0xa6, 0xfd, 0x04, 0x00, 0x23, 0xd1, 0x01, 0x21, + 0x30, 0x46, 0x00, 0xf0, 0x64, 0xf8, 0x02, 0xa8, 0xdc, 0xf7, 0x68, 0xfc, + 0x04, 0x00, 0x1a, 0xd1, 0xd9, 0xf8, 0x0c, 0x10, 0x30, 0x46, 0xdc, 0xf7, + 0x2f, 0xfd, 0x00, 0x28, 0xba, 0xd0, 0x00, 0xbf, 0x75, 0xa2, 0x07, 0x21, + 0x03, 0x20, 0xcf, 0xf7, 0x04, 0xf8, 0x40, 0xf2, 0x04, 0x74, 0x06, 0xe0, + 0x77, 0xa2, 0x07, 0x21, 0x03, 0x20, 0xce, 0xf7, 0xfc, 0xff, 0x40, 0xf2, + 0x06, 0x74, 0x04, 0x21, 0x30, 0x46, 0x00, 0xf0, 0x44, 0xf8, 0x23, 0x46, + 0x75, 0xa2, 0x07, 0x21, 0x04, 0x20, 0xce, 0xf7, 0xf0, 0xff, 0x7c, 0xbb, + 0x66, 0xa2, 0x07, 0x21, 0x04, 0x20, 0xce, 0xf7, 0xea, 0xff, 0xb8, 0x79, + 0xf9, 0x79, 0x00, 0xee, 0x10, 0x0a, 0xf8, 0xee, 0x40, 0x0a, 0x01, 0xee, + 0x90, 0x1a, 0xb7, 0xee, 0x00, 0x1a, 0xb8, 0xee, 0x61, 0x0a, 0x50, 0x46, + 0x00, 0xf0, 0x30, 0xf8, 0x00, 0xf0, 0x22, 0xf8, 0x38, 0x72, 0xd9, 0xed, + 0x06, 0x0a, 0x38, 0x7a, 0xd9, 0xed, 0x07, 0x1a, 0x99, 0xed, 0x08, 0x1a, + 0x00, 0xf0, 0xa2, 0xf8, 0x70, 0xee, 0x20, 0x0a, 0x30, 0xee, 0x21, 0x0a, + 0x50, 0x46, 0x00, 0xf0, 0x1d, 0xf8, 0x38, 0x7a, 0x00, 0xee, 0x90, 0x0a, + 0xf8, 0xee, 0x60, 0x0a, 0x30, 0xee, 0x60, 0x0a, 0x87, 0xed, 0x03, 0x0a, + 0x1a, 0xb0, 0x20, 0x46, 0xbd, 0xec, 0x06, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, + 0x48, 0xe1, 0xfa, 0x3e, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, + 0x70, 0x47, 0x0a, 0x46, 0x01, 0x21, 0x81, 0x40, 0x06, 0x20, 0xf0, 0xf7, + 0x11, 0xbe, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0x80, 0x46, 0x2d, 0xed, + 0x0c, 0x8b, 0x08, 0xf5, 0xd8, 0x74, 0xb0, 0xee, 0x40, 0x9a, 0x94, 0xed, + 0x00, 0x0a, 0xf8, 0xee, 0x40, 0x9a, 0xb0, 0xee, 0x41, 0x8a, 0x30, 0xee, + 0xc9, 0x0a, 0x80, 0xee, 0x08, 0x0a, 0xc0, 0xf7, 0x3f, 0xff, 0xbd, 0xee, + 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x5a, 0xed, 0xb2, 0x9f, 0xed, 0x2f, 0xaa, + 0xdf, 0xed, 0x2e, 0xaa, 0x00, 0x27, 0x3c, 0xe0, 0x08, 0xeb, 0x86, 0x00, + 0xdf, 0xed, 0x2c, 0x0a, 0x90, 0xed, 0x00, 0x0a, 0xb8, 0xee, 0xc0, 0x0a, + 0x80, 0xee, 0x29, 0x0a, 0x60, 0xee, 0x20, 0x0a, 0x60, 0xee, 0xab, 0xca, + 0xb0, 0xee, 0x6c, 0x0a, 0xc0, 0xf7, 0x1e, 0xff, 0xb0, 0xee, 0x40, 0xda, + 0xb0, 0xee, 0x6c, 0x0a, 0xc0, 0xf7, 0x1a, 0xff, 0x08, 0xeb, 0x86, 0x00, + 0x76, 0x1c, 0x90, 0xed, 0x24, 0x1a, 0xd0, 0xed, 0x48, 0x0a, 0x61, 0xee, + 0x0d, 0x1a, 0x40, 0xee, 0xc0, 0x1a, 0x60, 0xee, 0x8d, 0x0a, 0x41, 0xee, + 0x00, 0x0a, 0x31, 0xee, 0x8c, 0xca, 0x30, 0xee, 0x8b, 0xba, 0xf6, 0xb2, + 0x20, 0x79, 0x86, 0x42, 0xd0, 0xdb, 0x2c, 0xee, 0x0c, 0x0a, 0x0b, 0xee, + 0x0b, 0x0a, 0xb4, 0xee, 0x40, 0xaa, 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xbf, + 0xb0, 0xee, 0x40, 0xaa, 0xf0, 0xee, 0x68, 0xaa, 0x7f, 0x1c, 0xf8, 0xb2, + 0x85, 0x42, 0x12, 0xdb, 0x61, 0x79, 0x00, 0xf0, 0x1b, 0xf8, 0xf0, 0xee, + 0x49, 0x8a, 0x00, 0xee, 0x90, 0x1a, 0x40, 0xee, 0x08, 0x8a, 0xf8, 0xee, + 0x60, 0x0a, 0x9f, 0xed, 0x07, 0xca, 0x9f, 0xed, 0x06, 0xba, 0x78, 0xee, + 0xe0, 0xba, 0x00, 0x26, 0xd8, 0xe7, 0xb0, 0xee, 0x6a, 0x0a, 0xbd, 0xec, + 0x0c, 0x8b, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xdb, 0x0f, 0xc9, 0x40, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, + 0x70, 0x47, 0x00, 0x00, 0x63, 0x61, 0x6c, 0x63, 0x4f, 0x62, 0x73, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x67, 0x65, 0x74, 0x45, 0x73, 0x74, 0x0a, 0x00, + 0x58, 0x43, 0x6f, 0x72, 0x72, 0x5f, 0x57, 0x61, 0x69, 0x74, 0x3a, 0x20, + 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x43, 0x6f, 0x72, 0x72, 0x5f, 0x47, 0x65, 0x74, 0x3a, 0x20, 0x25, + 0x64, 0x0a, 0x00, 0x00, 0x67, 0x65, 0x74, 0x46, 0x69, 0x66, 0x6f, 0x4f, + 0x62, 0x73, 0x3a, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x64, 0x0a, 0x00, + 0x2d, 0xe9, 0xf8, 0x4f, 0x0e, 0x46, 0xd4, 0xb0, 0xd6, 0xf8, 0x10, 0x80, + 0xf2, 0x68, 0x0f, 0x92, 0x81, 0x46, 0x00, 0xf0, 0xfa, 0xf8, 0x04, 0x00, + 0x0d, 0xd0, 0x1c, 0xb9, 0x31, 0x46, 0x48, 0x46, 0x00, 0xf0, 0xca, 0xf9, + 0x0f, 0x99, 0x40, 0x46, 0x00, 0xf0, 0xd9, 0xf9, 0x20, 0x46, 0x55, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x80, 0x46, 0x98, 0xf8, 0x00, 0x00, 0x00, 0x28, + 0x08, 0xbf, 0x00, 0x2c, 0xeb, 0xd1, 0x01, 0x20, 0x88, 0xf8, 0x00, 0x00, + 0x4f, 0xf0, 0x00, 0x0a, 0xcd, 0xf8, 0x2c, 0x80, 0x11, 0xe0, 0x70, 0xb9, + 0xe8, 0x69, 0x01, 0x21, 0x01, 0xfa, 0x07, 0xf7, 0x20, 0xea, 0x07, 0x07, + 0xef, 0x61, 0x06, 0xe0, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0xf1, 0xd5, 0x00, 0x20, 0x28, 0x70, 0x0a, 0xf1, 0x01, 0x0a, 0x0b, 0x98, + 0x81, 0x68, 0x8a, 0x45, 0xda, 0xd2, 0x00, 0x2c, 0xd8, 0xd1, 0xc1, 0x69, + 0x21, 0xfa, 0x0a, 0xf1, 0xc8, 0x07, 0xf2, 0xd5, 0x0b, 0x99, 0xc1, 0xf8, + 0x0c, 0xa0, 0x0d, 0xf1, 0x2a, 0x00, 0x00, 0x21, 0x01, 0x80, 0xb5, 0x68, + 0x37, 0x69, 0x70, 0x69, 0x0e, 0x90, 0x58, 0x20, 0xf9, 0x68, 0x41, 0x43, + 0x78, 0x18, 0xa9, 0x8b, 0x0c, 0x91, 0x00, 0xf1, 0x20, 0x0b, 0xe8, 0x8b, + 0x0d, 0x90, 0x58, 0x46, 0x00, 0x68, 0xc0, 0x46, 0x80, 0x46, 0x00, 0x20, + 0x00, 0x90, 0x00, 0x23, 0x29, 0x78, 0x42, 0x46, 0x48, 0x46, 0xd9, 0xf7, + 0x22, 0xfc, 0x04, 0x00, 0x34, 0xd1, 0x0a, 0xa9, 0x09, 0x91, 0x0d, 0xf1, + 0x2a, 0x02, 0x24, 0xab, 0x08, 0x92, 0x07, 0x93, 0x0a, 0x22, 0xa9, 0x69, + 0x06, 0x91, 0x00, 0x23, 0x05, 0x92, 0x04, 0x93, 0x0c, 0xaa, 0x95, 0xf8, + 0x21, 0x10, 0x03, 0x91, 0x02, 0x92, 0x07, 0xf5, 0x32, 0x60, 0x95, 0xf8, + 0x20, 0x30, 0x01, 0x93, 0x01, 0x22, 0x41, 0x88, 0x00, 0x91, 0x59, 0x46, + 0x03, 0x88, 0x95, 0xed, 0x09, 0x0a, 0x48, 0x46, 0xfd, 0xf7, 0x16, 0xfe, + 0x04, 0x46, 0x9d, 0xf8, 0x28, 0x00, 0x58, 0xb9, 0x0c, 0xb9, 0x43, 0xf2, + 0x08, 0x24, 0xd8, 0xf7, 0xc3, 0xfc, 0x03, 0x46, 0x0e, 0x98, 0x0d, 0xf1, + 0x2a, 0x02, 0x41, 0x46, 0xfe, 0xf7, 0x97, 0xfa, 0x00, 0x21, 0x48, 0x46, + 0xd9, 0xf7, 0x8d, 0xfc, 0x00, 0x2c, 0x98, 0xd1, 0x35, 0x69, 0xb5, 0xf8, + 0x20, 0x0b, 0x3d, 0x99, 0x37, 0x68, 0xd6, 0xf8, 0x04, 0xb0, 0xd6, 0xf8, + 0x08, 0x80, 0x74, 0x69, 0x00, 0xee, 0x10, 0x0a, 0x25, 0x98, 0xb8, 0xee, + 0x40, 0x0a, 0xdf, 0xed, 0x94, 0x0a, 0x60, 0xee, 0x20, 0x0a, 0x08, 0x18, + 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x20, 0xee, 0x80, 0x0a, + 0xdd, 0xed, 0x39, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0xdd, 0xf7, 0x40, 0xfe, + 0xbc, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x2a, 0x59, 0x46, 0x38, 0x46, + 0xf9, 0xf7, 0x28, 0xf8, 0x01, 0x20, 0x24, 0xaa, 0x10, 0xab, 0x03, 0x90, + 0x02, 0x90, 0x01, 0x92, 0x00, 0x93, 0x5a, 0x46, 0x23, 0x46, 0x39, 0x46, + 0x48, 0x46, 0xfd, 0xf7, 0x85, 0xfe, 0x04, 0x46, 0xd5, 0xf8, 0x24, 0x0b, + 0xe9, 0x68, 0x88, 0x42, 0x03, 0xd3, 0x59, 0x46, 0x38, 0x46, 0xf9, 0xf7, + 0x1b, 0xfc, 0xe8, 0x68, 0xc5, 0xf8, 0x24, 0x0b, 0x00, 0x2c, 0xba, 0xd1, + 0x01, 0x20, 0x00, 0x90, 0x5b, 0x46, 0x3a, 0x46, 0x00, 0x21, 0x48, 0x46, + 0xfd, 0xf7, 0xc1, 0xfe, 0x04, 0x00, 0xb0, 0xd1, 0x9d, 0xed, 0x24, 0x0a, + 0x00, 0x23, 0x00, 0x22, 0x59, 0x46, 0x38, 0x46, 0xf9, 0xf7, 0x0e, 0xfa, + 0xef, 0x68, 0x01, 0x20, 0x00, 0x21, 0x3a, 0x46, 0xf0, 0xf7, 0x50, 0xf8, + 0x02, 0x46, 0xa8, 0x69, 0x10, 0x40, 0x0c, 0xbf, 0xd8, 0xed, 0x05, 0x0a, + 0xd8, 0xed, 0x04, 0x0a, 0x2c, 0xe7, 0x2d, 0xe9, 0xf8, 0x43, 0x2d, 0xed, + 0x02, 0x8b, 0x0c, 0x46, 0xc0, 0xb0, 0x81, 0x46, 0xa7, 0x68, 0x25, 0x69, + 0x61, 0x68, 0x20, 0x68, 0xf9, 0xf7, 0xe8, 0xf9, 0x09, 0xa9, 0x48, 0x46, + 0xff, 0xf7, 0xc4, 0xfb, 0x5f, 0xea, 0x00, 0x08, 0x19, 0xd1, 0x60, 0x68, + 0x9d, 0xed, 0x09, 0x0a, 0xf9, 0xf7, 0x25, 0xf9, 0x06, 0xa8, 0x04, 0x90, + 0x0d, 0xf1, 0x16, 0x03, 0x08, 0xa9, 0x05, 0xaa, 0x01, 0x93, 0x07, 0xa8, + 0x03, 0x91, 0x02, 0x92, 0x00, 0x90, 0x97, 0xf8, 0x20, 0x30, 0xba, 0x68, + 0x79, 0x68, 0x97, 0xed, 0x03, 0x0a, 0x48, 0x46, 0xfd, 0xf7, 0xca, 0xfc, + 0x80, 0x46, 0xb8, 0xf1, 0x00, 0x0f, 0x52, 0xd1, 0xb8, 0x68, 0x06, 0x90, + 0x69, 0x46, 0x48, 0x46, 0xcd, 0xf7, 0x94, 0xfc, 0x00, 0x26, 0x5f, 0xea, + 0x00, 0x08, 0x44, 0xd1, 0x48, 0x46, 0xce, 0xf7, 0x20, 0xfc, 0x06, 0x46, + 0x00, 0xee, 0x10, 0x6a, 0xb8, 0xee, 0x40, 0x8a, 0x9d, 0xed, 0x06, 0x0a, + 0xb8, 0xee, 0x40, 0x0a, 0x88, 0xee, 0x00, 0x0a, 0xdd, 0xf7, 0xb0, 0xfd, + 0xbc, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x4a, 0x64, 0x1c, 0xe0, 0x07, + 0x48, 0xbf, 0x64, 0x1c, 0x60, 0x1e, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, + 0x40, 0x0a, 0x88, 0xee, 0x00, 0x0a, 0xc0, 0xf7, 0x65, 0xfd, 0xbc, 0xee, + 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x7a, 0x48, 0x46, 0xce, 0xf7, 0x4c, 0xfb, + 0x86, 0x1b, 0x76, 0x08, 0xb6, 0xfb, 0xf7, 0xf0, 0x40, 0x00, 0x06, 0x19, + 0x00, 0x99, 0x72, 0x1e, 0x7a, 0x43, 0xa1, 0xeb, 0x52, 0x01, 0x29, 0x61, + 0x40, 0x08, 0x01, 0x21, 0x01, 0xfa, 0x06, 0xf3, 0x01, 0xfa, 0x04, 0xf4, + 0x5b, 0x1e, 0x64, 0x1e, 0x6b, 0x61, 0x84, 0x40, 0xac, 0x61, 0x21, 0x2e, + 0x68, 0x69, 0xe8, 0x61, 0x28, 0xbf, 0x43, 0xf2, 0x04, 0x28, 0xae, 0x60, + 0xb8, 0xf1, 0x00, 0x0f, 0x06, 0x97, 0x47, 0xd1, 0x48, 0x46, 0xce, 0xf7, + 0xd0, 0xfb, 0x07, 0x46, 0x0a, 0xa9, 0x48, 0x46, 0xce, 0xf7, 0x05, 0xfb, + 0x00, 0x24, 0x23, 0x4e, 0x00, 0xe0, 0x64, 0x1c, 0xa8, 0x68, 0x84, 0x42, + 0x1c, 0xd2, 0x69, 0x69, 0xe1, 0x40, 0xc8, 0x07, 0xf7, 0xd5, 0x07, 0x99, + 0x08, 0x98, 0x07, 0x9a, 0x02, 0x91, 0x03, 0x97, 0x01, 0x90, 0x0a, 0xab, + 0x29, 0x69, 0x06, 0x98, 0x00, 0xfb, 0x04, 0x11, 0x58, 0x20, 0x89, 0x1a, + 0x60, 0x43, 0x00, 0x91, 0x28, 0x44, 0x00, 0xf1, 0x20, 0x02, 0x0f, 0xa9, + 0x30, 0x46, 0xfd, 0xf7, 0xbb, 0xff, 0x5f, 0xea, 0x00, 0x08, 0xde, 0xd0, + 0xe9, 0x69, 0x48, 0x42, 0x01, 0x40, 0x00, 0xee, 0x10, 0x1a, 0xb8, 0xee, + 0x40, 0x0a, 0xc0, 0xf7, 0x63, 0xff, 0x06, 0x98, 0x68, 0x60, 0x05, 0xf5, + 0x32, 0x60, 0xbd, 0xf8, 0x16, 0x10, 0x01, 0x80, 0x00, 0x21, 0xbd, 0xf8, + 0x14, 0x20, 0x42, 0x80, 0x69, 0x70, 0x29, 0x70, 0xbc, 0xee, 0xc0, 0x0a, + 0x85, 0xed, 0x03, 0x0a, 0x80, 0xed, 0x01, 0x0a, 0x40, 0xb0, 0x40, 0x46, + 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x83, 0x00, 0x00, 0x7a, 0x44, + 0xa8, 0x92, 0x04, 0x01, 0xf8, 0xb5, 0x0d, 0x68, 0x4e, 0x68, 0x04, 0x46, + 0x00, 0x27, 0x00, 0x20, 0x00, 0x90, 0x33, 0x46, 0x2a, 0x46, 0xf9, 0xb2, + 0x20, 0x46, 0xfd, 0xf7, 0xc4, 0xfd, 0x7f, 0x1c, 0x41, 0x2f, 0x01, 0xd2, + 0x00, 0x28, 0xf2, 0xd0, 0xf2, 0xbd, 0x02, 0x69, 0x0a, 0x60, 0x43, 0x68, + 0x4b, 0x60, 0x82, 0x68, 0x8a, 0x60, 0x83, 0x69, 0xcb, 0x60, 0x42, 0x69, + 0x0a, 0x61, 0x00, 0xf5, 0x32, 0x60, 0x03, 0x88, 0x4b, 0x61, 0x40, 0x88, + 0x88, 0x61, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x10, 0x8b, + 0x0f, 0x46, 0xad, 0xf5, 0x40, 0x7d, 0x80, 0x46, 0x78, 0x89, 0x4f, 0xea, + 0x40, 0x09, 0x38, 0x7a, 0x8d, 0xf8, 0x00, 0x00, 0x16, 0x46, 0x97, 0xf8, + 0x09, 0xa0, 0x1d, 0x46, 0x1f, 0xfa, 0x89, 0xf1, 0x21, 0xb9, 0x00, 0xf0, + 0x5e, 0xfb, 0xdb, 0xf7, 0x1d, 0xf8, 0x15, 0xe0, 0x40, 0x46, 0xec, 0xf7, + 0x69, 0xfa, 0x04, 0x00, 0x04, 0xd1, 0x01, 0x21, 0x40, 0x46, 0xec, 0xf7, + 0x9b, 0xfa, 0x04, 0x46, 0x5c, 0xb9, 0x1f, 0xfa, 0x89, 0xf1, 0x40, 0x46, + 0xec, 0xf7, 0x97, 0xfa, 0x04, 0x46, 0x24, 0xb9, 0x00, 0xf0, 0x47, 0xfb, + 0xda, 0xf7, 0xf3, 0xff, 0x04, 0x46, 0x40, 0x46, 0xec, 0xf7, 0xa6, 0xfa, + 0x30, 0x71, 0x34, 0xb9, 0x6b, 0x46, 0x06, 0x22, 0x01, 0x21, 0x40, 0x46, + 0xec, 0xf7, 0x93, 0xf9, 0x04, 0x46, 0xba, 0xf1, 0xff, 0x0f, 0x05, 0xd0, + 0x9d, 0xf8, 0x00, 0x10, 0x52, 0x46, 0x40, 0x46, 0xec, 0xf7, 0x56, 0xfb, + 0x40, 0x46, 0xec, 0xf7, 0x91, 0xfa, 0x01, 0x46, 0x00, 0x23, 0x4f, 0xf4, + 0x80, 0x32, 0x40, 0x46, 0xdb, 0xf7, 0x8e, 0xfb, 0x00, 0x2c, 0x40, 0xf0, + 0xc8, 0x82, 0x00, 0x21, 0x11, 0x91, 0xdf, 0xed, 0x02, 0xea, 0x0f, 0x95, + 0x41, 0xe2, 0x00, 0xbf, 0x00, 0x00, 0x80, 0x47, 0x00, 0x2c, 0x14, 0xd1, + 0x0e, 0xa8, 0x04, 0x90, 0x0a, 0xab, 0x0c, 0xa9, 0x0d, 0xf1, 0x2a, 0x02, + 0x01, 0x93, 0x0d, 0xa8, 0x03, 0x91, 0x02, 0x92, 0x00, 0x90, 0x97, 0xf8, + 0x24, 0x30, 0xf9, 0x68, 0x97, 0xed, 0x04, 0x0a, 0x00, 0x22, 0x40, 0x46, + 0xfd, 0xf7, 0x8a, 0xfb, 0x04, 0x00, 0x40, 0xf0, 0x23, 0x82, 0x14, 0xa9, + 0x40, 0x46, 0xce, 0xf7, 0x1e, 0xfa, 0x40, 0x46, 0xce, 0xf7, 0xe1, 0xfa, + 0x81, 0x46, 0x00, 0x25, 0x78, 0x68, 0x18, 0xb9, 0x40, 0x46, 0xce, 0xf7, + 0xe0, 0xfa, 0x80, 0x08, 0x05, 0xb1, 0x40, 0x42, 0x0d, 0x99, 0x0c, 0x9a, + 0x02, 0x91, 0x01, 0x92, 0x00, 0x90, 0xcd, 0xf8, 0x0c, 0x90, 0x14, 0xab, + 0x19, 0xaa, 0x2f, 0xa9, 0xdf, 0xf8, 0x84, 0x06, 0xfd, 0xf7, 0xda, 0xfe, + 0x00, 0x28, 0x50, 0xd1, 0xbd, 0xf8, 0x2a, 0x00, 0xbd, 0xf8, 0x28, 0xb0, + 0xad, 0xf8, 0x40, 0x00, 0x00, 0x2d, 0x14, 0xbf, 0x0d, 0xf5, 0x0f, 0x7a, + 0x0d, 0xf5, 0xbe, 0x7a, 0x0d, 0xf1, 0x2e, 0x00, 0x00, 0x21, 0x01, 0x80, + 0xf9, 0x69, 0x12, 0x91, 0x38, 0x6a, 0x13, 0x90, 0x19, 0xa8, 0x00, 0x68, + 0xc0, 0x46, 0x00, 0x21, 0x00, 0x91, 0x02, 0x46, 0x39, 0x78, 0x00, 0x23, + 0x40, 0x46, 0xd9, 0xf7, 0xd4, 0xf9, 0x04, 0x00, 0x2a, 0xd1, 0x0b, 0xa8, + 0x0d, 0xf1, 0x2e, 0x01, 0x09, 0x90, 0x08, 0x91, 0xcd, 0xf8, 0x1c, 0xa0, + 0x0a, 0x20, 0xba, 0x69, 0x05, 0x90, 0x00, 0x21, 0x07, 0xf1, 0x24, 0x03, + 0x06, 0x92, 0x04, 0x91, 0x12, 0xa9, 0x58, 0x78, 0x03, 0x90, 0x02, 0x91, + 0x97, 0xf8, 0x24, 0x20, 0xbd, 0xf8, 0x40, 0x00, 0x01, 0x92, 0x07, 0xf1, + 0x24, 0x01, 0x00, 0x90, 0x91, 0xed, 0x01, 0x0a, 0x3a, 0x7a, 0x5b, 0x46, + 0x19, 0xa9, 0x40, 0x46, 0xfd, 0xf7, 0xc6, 0xfb, 0x04, 0x46, 0x9d, 0xf8, + 0x2c, 0x00, 0x00, 0x28, 0x04, 0xbf, 0x00, 0x2c, 0x43, 0xf2, 0x08, 0x24, + 0x00, 0x21, 0x40, 0x46, 0xd9, 0xf7, 0x45, 0xfa, 0x20, 0x46, 0x6d, 0x1c, + 0x01, 0x2d, 0x01, 0xd8, 0x00, 0x28, 0x91, 0xd0, 0x04, 0x00, 0x84, 0xd1, + 0x31, 0x79, 0x06, 0xab, 0x23, 0xaa, 0x40, 0x46, 0xdb, 0xf7, 0xab, 0xfa, + 0x9d, 0xed, 0x5f, 0xea, 0xb0, 0xee, 0x4e, 0x0a, 0x10, 0x22, 0x07, 0x21, + 0x23, 0xa8, 0x00, 0xf0, 0x7d, 0xfa, 0x02, 0xa8, 0x10, 0x22, 0x80, 0xec, + 0x02, 0x0a, 0xb0, 0xee, 0x4e, 0x0a, 0x03, 0x21, 0x06, 0xa8, 0x00, 0xf0, + 0x73, 0xfa, 0x68, 0x46, 0x80, 0xec, 0x02, 0x0a, 0x9d, 0xed, 0x62, 0x0a, + 0xf9, 0xf7, 0xdc, 0xfd, 0x00, 0xf0, 0xdc, 0xfa, 0x9d, 0xed, 0x6c, 0x0a, + 0xf9, 0xf7, 0xd6, 0xfd, 0x00, 0xf0, 0x4f, 0xfa, 0x00, 0xf0, 0xc6, 0xfa, + 0x9d, 0xed, 0x6b, 0x0a, 0xf9, 0xf7, 0xce, 0xfd, 0xb0, 0xee, 0x49, 0x1a, + 0xf0, 0xee, 0x69, 0x1a, 0xf9, 0xf7, 0x75, 0xfd, 0xb0, 0xee, 0x48, 0x1a, + 0xf0, 0xee, 0x68, 0x1a, 0xf9, 0xf7, 0xa8, 0xfd, 0x00, 0xf0, 0xc2, 0xfa, + 0x9d, 0xed, 0x7a, 0x0a, 0xf9, 0xf7, 0xbc, 0xfd, 0x83, 0xa8, 0x00, 0xf0, + 0x0a, 0xfa, 0x00, 0xf0, 0x32, 0xfa, 0x00, 0xf0, 0xed, 0xf9, 0x9d, 0xed, + 0x83, 0x0a, 0xf9, 0xf7, 0xb1, 0xfd, 0x00, 0xf0, 0xfa, 0xf9, 0x00, 0xf0, + 0x14, 0xfa, 0xf9, 0xf7, 0x65, 0xfe, 0xb0, 0xee, 0x40, 0xda, 0xf0, 0xee, + 0x60, 0xda, 0x9d, 0xed, 0x92, 0x0a, 0xf9, 0xf7, 0xa3, 0xfd, 0x00, 0xf0, + 0x95, 0xfa, 0x9d, 0xed, 0x9c, 0x0a, 0xf9, 0xf7, 0x9d, 0xfd, 0x00, 0xf0, + 0x16, 0xfa, 0x00, 0xf0, 0xd1, 0xf9, 0x9d, 0xed, 0x9b, 0x0a, 0xf9, 0xf7, + 0x95, 0xfd, 0x00, 0xf0, 0xde, 0xf9, 0x00, 0xf0, 0xf8, 0xf9, 0xf9, 0xf7, + 0x49, 0xfe, 0xb0, 0xee, 0x40, 0xca, 0xf0, 0xee, 0x60, 0xca, 0x9d, 0xed, + 0xaa, 0x0a, 0xf9, 0xf7, 0x87, 0xfd, 0xb3, 0xa8, 0x00, 0xf0, 0xd5, 0xf9, + 0x00, 0xf0, 0xfd, 0xf9, 0x00, 0xf0, 0xb8, 0xf9, 0x9d, 0xed, 0xb3, 0x0a, + 0xf9, 0xf7, 0x7c, 0xfd, 0x00, 0xf0, 0xc5, 0xf9, 0x00, 0xf0, 0xdf, 0xf9, + 0x00, 0xf0, 0xe3, 0xf9, 0x04, 0xa8, 0xb0, 0xee, 0x4d, 0x1a, 0x80, 0xec, + 0x02, 0x0a, 0x00, 0xf0, 0xac, 0xf9, 0x69, 0x46, 0xdf, 0xf8, 0xb0, 0x04, + 0xb0, 0xee, 0x40, 0xfa, 0xf0, 0xee, 0x60, 0xfa, 0x91, 0xec, 0x02, 0x1a, + 0x90, 0xec, 0x02, 0x0a, 0xf9, 0xf7, 0x35, 0xfd, 0xb0, 0xee, 0x40, 0xba, + 0xf0, 0xee, 0x60, 0xba, 0x00, 0xf0, 0xcd, 0xf9, 0x00, 0xf0, 0xb3, 0xf9, + 0x00, 0xf0, 0x9d, 0xf9, 0xb0, 0xee, 0x4b, 0x1a, 0xf0, 0xee, 0x6b, 0x1a, + 0xf9, 0xf7, 0xff, 0xfc, 0x00, 0xf0, 0xd6, 0xf9, 0x68, 0x46, 0xdf, 0xf8, + 0x74, 0x14, 0x00, 0xf0, 0x4d, 0xfa, 0x90, 0xec, 0x02, 0x1a, 0x91, 0xec, + 0x02, 0x0a, 0xf9, 0xf7, 0x18, 0xfd, 0x00, 0xf0, 0x37, 0xfa, 0xb0, 0xee, + 0x4d, 0x1a, 0x00, 0xf0, 0x7c, 0xf9, 0x00, 0xf0, 0x75, 0xf9, 0xb0, 0xee, + 0x4d, 0x1a, 0xf0, 0xee, 0x6d, 0x1a, 0xb0, 0xee, 0x4c, 0x0a, 0xf0, 0xee, + 0x6c, 0x0a, 0xf9, 0xf7, 0xf3, 0xfc, 0x00, 0xf0, 0x76, 0xf9, 0xb0, 0xee, + 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, 0xf9, 0xf7, 0xeb, 0xfc, 0x00, 0xf0, + 0xaf, 0xf9, 0x00, 0xf0, 0x94, 0xf9, 0xdf, 0xf8, 0x28, 0x04, 0x00, 0xf0, + 0x9f, 0xf9, 0x00, 0xf0, 0x7a, 0xf9, 0xdf, 0xf8, 0x20, 0x04, 0x00, 0xf0, + 0x99, 0xf9, 0x00, 0xf0, 0x60, 0xf9, 0xdf, 0xf8, 0x18, 0x04, 0xb0, 0xee, + 0x40, 0xba, 0xf0, 0xee, 0x60, 0xba, 0xb0, 0xee, 0x4a, 0x1a, 0xf0, 0xee, + 0x6a, 0x1a, 0x90, 0xec, 0x02, 0x0a, 0xf9, 0xf7, 0xf3, 0xfc, 0xb0, 0xee, + 0x40, 0xaa, 0x9f, 0xed, 0xc7, 0x0a, 0x6e, 0xee, 0x00, 0xda, 0xf0, 0xee, + 0x60, 0xaa, 0xb0, 0xee, 0x6d, 0x0a, 0xc0, 0xf7, 0xbd, 0xfd, 0xb0, 0xee, + 0x40, 0xca, 0xb0, 0xee, 0x6d, 0x0a, 0xc0, 0xf7, 0xb7, 0xfa, 0xf0, 0xee, + 0x40, 0xca, 0xb0, 0xee, 0x6d, 0x0a, 0xc0, 0xf7, 0xb1, 0xfd, 0xb0, 0xee, + 0x40, 0xda, 0xb0, 0xee, 0x6d, 0x0a, 0xc0, 0xf7, 0xab, 0xfa, 0x86, 0xed, + 0x00, 0xea, 0x04, 0xaa, 0x38, 0x7a, 0x70, 0x71, 0xf0, 0xee, 0x40, 0xda, + 0x06, 0xf1, 0x18, 0x01, 0x92, 0xec, 0x02, 0x0a, 0x06, 0xf1, 0x20, 0x00, + 0x81, 0xec, 0x02, 0x0a, 0x06, 0xf1, 0x28, 0x01, 0x80, 0xec, 0x02, 0xfa, + 0x06, 0xf1, 0x30, 0x02, 0x81, 0xec, 0x02, 0x8a, 0x02, 0xa8, 0x82, 0xec, + 0x02, 0x9a, 0x06, 0xf1, 0x08, 0x03, 0x90, 0xec, 0x02, 0x0a, 0x83, 0xec, + 0x02, 0x0a, 0x06, 0xf1, 0x10, 0x01, 0x6a, 0x46, 0x00, 0x25, 0x92, 0xec, + 0x02, 0x1a, 0x81, 0xec, 0x02, 0x1a, 0x8b, 0xee, 0x8c, 0x1a, 0x31, 0xee, + 0x0b, 0x1a, 0x21, 0xee, 0x2e, 0x0a, 0xc0, 0xf7, 0x9b, 0xfa, 0xbd, 0xee, + 0xc0, 0x0a, 0x86, 0xed, 0x0e, 0x0a, 0x8b, 0xee, 0xac, 0x0a, 0xdf, 0xed, + 0xcf, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xc0, 0xf7, 0x8f, 0xfa, 0xbd, 0xee, + 0xc0, 0x0a, 0x86, 0xed, 0x0f, 0x0a, 0x8a, 0xee, 0x8d, 0x0a, 0x30, 0xee, + 0x0a, 0x0a, 0x20, 0xee, 0x2e, 0x0a, 0xc0, 0xf7, 0x83, 0xfa, 0xbd, 0xee, + 0xc0, 0x0a, 0x86, 0xed, 0x10, 0x0a, 0xca, 0xee, 0xad, 0x0a, 0x9f, 0xed, + 0xc3, 0x0a, 0x20, 0xee, 0x80, 0x0a, 0xc0, 0xf7, 0x77, 0xfa, 0xbd, 0xee, + 0xc0, 0x0a, 0x02, 0xa9, 0x86, 0xed, 0x11, 0x0a, 0x1c, 0xa8, 0x91, 0xec, + 0x02, 0x0a, 0x80, 0xec, 0x02, 0x0a, 0x69, 0x46, 0x1e, 0xa8, 0x91, 0xec, + 0x02, 0x0a, 0x80, 0xec, 0x02, 0x0a, 0x0f, 0x98, 0x8d, 0xed, 0x19, 0xea, + 0x00, 0x23, 0x19, 0xaa, 0x5f, 0xa9, 0xfd, 0xf7, 0xa8, 0xfe, 0x0f, 0x98, + 0x00, 0x23, 0x19, 0xaa, 0x77, 0xa9, 0xfd, 0xf7, 0xa2, 0xfe, 0xb1, 0xee, + 0x4e, 0x0a, 0x0f, 0x98, 0x8d, 0xed, 0x19, 0x0a, 0x00, 0x23, 0x19, 0xaa, + 0x8f, 0xa9, 0xfd, 0xf7, 0x98, 0xfe, 0x0f, 0x98, 0x00, 0x23, 0x19, 0xaa, + 0xa7, 0xa9, 0xfd, 0xf7, 0x92, 0xfe, 0x1c, 0x21, 0x03, 0xa8, 0xd1, 0xf7, + 0x03, 0xff, 0x68, 0x46, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x80, 0xe8, + 0x0e, 0x00, 0x31, 0x6c, 0x06, 0x91, 0x70, 0x6c, 0x07, 0x90, 0xb0, 0x6b, + 0x01, 0x90, 0xf0, 0x6b, 0x02, 0x90, 0x6b, 0x46, 0x03, 0xaa, 0xe9, 0xb2, + 0x40, 0x46, 0xdb, 0xf7, 0xa1, 0xf8, 0x6d, 0x1c, 0x41, 0x2d, 0xf6, 0xd3, + 0x11, 0x98, 0x40, 0x1c, 0x11, 0x90, 0x11, 0x98, 0x79, 0x69, 0x88, 0x42, + 0xff, 0xf4, 0xbc, 0xad, 0x00, 0x2c, 0x5a, 0xd1, 0x07, 0xf1, 0x24, 0x01, + 0x08, 0x7a, 0x00, 0x28, 0x55, 0xd0, 0x01, 0x22, 0x8d, 0xf8, 0x08, 0x20, + 0x8d, 0xf8, 0x09, 0x20, 0x4f, 0xf4, 0x4b, 0x73, 0x03, 0x22, 0x8d, 0xf8, + 0x0a, 0x20, 0xad, 0xf8, 0x0c, 0x30, 0x68, 0x22, 0x49, 0x89, 0xad, 0xf8, + 0x0e, 0x10, 0x07, 0x92, 0x01, 0xa9, 0x40, 0x46, 0xcd, 0xf7, 0x14, 0xf9, + 0x04, 0x00, 0x3e, 0xd1, 0x78, 0x68, 0x18, 0xb9, 0x40, 0x46, 0xce, 0xf7, + 0xa0, 0xf8, 0x40, 0x08, 0x00, 0x25, 0x81, 0x46, 0x03, 0xe0, 0x84, 0xbb, + 0x0d, 0xb1, 0xc9, 0xf1, 0x00, 0x09, 0x00, 0x20, 0x00, 0x90, 0x00, 0x23, + 0x39, 0x78, 0x4a, 0x46, 0x40, 0x46, 0xd8, 0xf7, 0xb6, 0xff, 0x04, 0x00, + 0x20, 0xd1, 0x01, 0x98, 0xd0, 0x21, 0x48, 0x44, 0x69, 0x43, 0xa0, 0xf5, + 0xff, 0x70, 0x06, 0xeb, 0x01, 0x0a, 0x0a, 0x21, 0x05, 0x90, 0x0a, 0xf1, + 0x48, 0x02, 0x06, 0x91, 0x04, 0x92, 0x02, 0xa9, 0x40, 0x46, 0x00, 0xf0, + 0x31, 0xfb, 0x01, 0x98, 0xa0, 0xeb, 0x09, 0x00, 0xa0, 0xf5, 0xff, 0x70, + 0x0a, 0xf1, 0xb0, 0x01, 0x05, 0x90, 0x04, 0x91, 0x0a, 0x22, 0x06, 0x92, + 0x02, 0xa9, 0x40, 0x46, 0x00, 0xf0, 0x22, 0xfb, 0x6d, 0x1c, 0x01, 0x2d, + 0xcd, 0xd9, 0x00, 0x21, 0x40, 0x46, 0xd9, 0xf7, 0x2e, 0xf8, 0x38, 0x7a, + 0x8d, 0xf8, 0x00, 0x00, 0x6b, 0x46, 0x06, 0x22, 0x01, 0x21, 0x40, 0x46, + 0xeb, 0xf7, 0xf3, 0xfe, 0x05, 0x46, 0x78, 0x89, 0x20, 0xb9, 0x00, 0xf0, + 0x6a, 0xf8, 0xda, 0xf7, 0x43, 0xfd, 0x08, 0xe0, 0x00, 0xf0, 0x65, 0xf8, + 0xda, 0xf7, 0x1a, 0xfd, 0x05, 0xb9, 0x05, 0x46, 0x40, 0x46, 0xeb, 0xf7, + 0x87, 0xff, 0x05, 0xb9, 0x05, 0x46, 0x04, 0xb9, 0x2c, 0x46, 0x0d, 0xf5, + 0x40, 0x7d, 0x20, 0x46, 0xbd, 0xec, 0x10, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, + 0xb0, 0xee, 0x40, 0xaa, 0xf0, 0xee, 0x60, 0xaa, 0x70, 0x47, 0xf0, 0xee, + 0x6d, 0x1a, 0xb0, 0xee, 0x4c, 0x0a, 0xf0, 0xee, 0x6c, 0x0a, 0xf9, 0xf7, + 0x68, 0xbb, 0xb0, 0xee, 0x4a, 0x1a, 0xf0, 0xee, 0x6a, 0x1a, 0xf9, 0xf7, + 0x9b, 0xbb, 0xb0, 0xee, 0x4a, 0x1a, 0xf0, 0xee, 0x6a, 0x1a, 0xf9, 0xf7, + 0x5c, 0xbb, 0xb0, 0xee, 0x40, 0x9a, 0xf0, 0xee, 0x60, 0x9a, 0x90, 0xed, + 0x01, 0x0a, 0xf9, 0xf7, 0xa7, 0xbb, 0xb0, 0xee, 0x40, 0xaa, 0xf0, 0xee, + 0x60, 0xaa, 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, 0xb0, 0xee, + 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, 0xf9, 0xf7, 0x59, 0xbb, 0xb0, 0xee, + 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, 0xf9, 0xf7, 0x79, 0xbb, 0xb0, 0xee, + 0x40, 0x9a, 0xf0, 0xee, 0x60, 0x9a, 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, + 0x69, 0x1a, 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, 0xf9, 0xf7, + 0x32, 0xbb, 0x38, 0x48, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, + 0x90, 0xec, 0x02, 0x0a, 0xf9, 0xf7, 0x4f, 0xbb, 0xdb, 0x0f, 0xc9, 0x40, + 0x02, 0xa8, 0x90, 0xec, 0x02, 0x1a, 0xf9, 0xf7, 0x5b, 0xbb, 0x00, 0x23, + 0x06, 0x22, 0x01, 0x21, 0x40, 0x46, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x41, + 0xdf, 0xed, 0x2a, 0x0a, 0x2d, 0xed, 0x06, 0x8b, 0x80, 0x46, 0x14, 0x46, + 0x20, 0xee, 0x20, 0x0a, 0x0e, 0x46, 0xf9, 0xf7, 0x5c, 0xfb, 0x00, 0xbf, + 0x34, 0xa0, 0x77, 0x1e, 0x00, 0xf0, 0x60, 0xf8, 0x90, 0xec, 0x02, 0x9a, + 0x00, 0x25, 0x2c, 0xe0, 0xa5, 0xeb, 0x57, 0x00, 0x00, 0xee, 0x10, 0x0a, + 0xb8, 0xee, 0xc0, 0x0a, 0xf9, 0xf7, 0x52, 0xfb, 0xb0, 0xee, 0x40, 0x1a, + 0xf0, 0xee, 0x60, 0x1a, 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, + 0xf9, 0xf7, 0x1b, 0xfb, 0xf9, 0xf7, 0x4e, 0xfb, 0x08, 0xeb, 0x85, 0x00, + 0xb0, 0xee, 0x40, 0xaa, 0x90, 0xed, 0x00, 0x0a, 0xf0, 0xee, 0x60, 0xaa, + 0xb8, 0xee, 0xc0, 0x0a, 0xf9, 0xf7, 0x3a, 0xfb, 0xb0, 0xee, 0x4a, 0x1a, + 0xf0, 0xee, 0x6a, 0x1a, 0xf9, 0xf7, 0x07, 0xfb, 0x00, 0xf0, 0x2b, 0xf8, + 0xf9, 0xf7, 0xdd, 0xfa, 0x00, 0xf0, 0x22, 0xf8, 0x6d, 0x1c, 0xb5, 0x42, + 0xd0, 0xd3, 0x01, 0x20, 0x00, 0xfa, 0x04, 0xf4, 0x00, 0xee, 0x10, 0x4a, + 0xb8, 0xee, 0x40, 0x0a, 0xf9, 0xf7, 0x22, 0xfb, 0x00, 0xf0, 0x19, 0xf8, + 0xbd, 0xec, 0x06, 0x8b, 0xbd, 0xe8, 0xf0, 0x41, 0xf9, 0xf7, 0x00, 0xbb, + 0x00, 0x00, 0x80, 0xc7, 0xdb, 0x0f, 0xc9, 0xc0, 0xcc, 0x92, 0x04, 0x01, + 0x30, 0x90, 0x00, 0x20, 0x38, 0x90, 0x00, 0x20, 0x40, 0x90, 0x00, 0x20, + 0x48, 0x90, 0x00, 0x20, 0xb0, 0xee, 0x40, 0x9a, 0xf0, 0xee, 0x60, 0x9a, + 0x70, 0x47, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0xb0, 0xee, + 0x49, 0x0a, 0xf0, 0xee, 0x69, 0x0a, 0x70, 0x47, 0xb0, 0xee, 0x40, 0x8a, + 0xf0, 0xee, 0x60, 0x8a, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xee, 0x10, 0x1a, 0xc1, 0xf3, 0xc7, 0x52, + 0xda, 0xb1, 0x99, 0x2a, 0x0f, 0xda, 0xc8, 0x0f, 0x21, 0xf0, 0x00, 0x41, + 0x00, 0xee, 0x10, 0x1a, 0xb1, 0xf1, 0x7e, 0x5f, 0x7a, 0xf7, 0xa0, 0xab, + 0xf7, 0xee, 0x00, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0x00, 0x1d, 0xfa, 0xf7, + 0x99, 0xbb, 0xff, 0x2a, 0x01, 0xd1, 0x4a, 0x02, 0x05, 0xd1, 0x03, 0x4a, + 0xc9, 0x0f, 0x42, 0xea, 0xc1, 0x71, 0x00, 0xee, 0x10, 0x1a, 0x70, 0x47, + 0xdb, 0x0f, 0xc9, 0x3f, 0x2d, 0xe9, 0xf0, 0x47, 0x2d, 0xed, 0x04, 0x8b, + 0x0f, 0x46, 0x16, 0x46, 0x98, 0xb0, 0x80, 0x46, 0x01, 0x23, 0x00, 0x22, + 0x00, 0x21, 0xec, 0xf7, 0x80, 0xf8, 0x01, 0x46, 0x40, 0x46, 0xec, 0xf7, + 0x55, 0xf9, 0x04, 0x46, 0x01, 0x46, 0x40, 0x46, 0xec, 0xf7, 0x47, 0xf9, + 0x40, 0x42, 0x02, 0x46, 0x00, 0x23, 0x01, 0x21, 0x40, 0x46, 0xec, 0xf7, + 0x70, 0xf8, 0x05, 0x46, 0x40, 0x46, 0xcd, 0xf7, 0x28, 0xff, 0x00, 0xeb, + 0xd0, 0x70, 0x40, 0x10, 0xb9, 0x68, 0x00, 0x2d, 0x58, 0xbf, 0x0b, 0x46, + 0x03, 0xd5, 0x40, 0x42, 0x03, 0x46, 0x08, 0x46, 0x40, 0x42, 0xc2, 0x18, + 0x02, 0xeb, 0xd2, 0x72, 0xb5, 0xeb, 0x62, 0x0f, 0x04, 0xdb, 0x69, 0x1a, + 0x88, 0x42, 0x05, 0xdd, 0x08, 0x46, 0x03, 0xe0, 0x49, 0x19, 0x8b, 0x42, + 0xb8, 0xbf, 0x0b, 0x46, 0x9d, 0x42, 0xb8, 0xbf, 0x1d, 0x46, 0x85, 0x42, + 0xc8, 0xbf, 0x05, 0x46, 0x35, 0x60, 0x62, 0x1e, 0xf8, 0x68, 0x41, 0x19, + 0x04, 0xf0, 0x07, 0x00, 0x31, 0x60, 0x02, 0xf0, 0x07, 0x02, 0x70, 0x71, + 0x64, 0x1c, 0x32, 0x71, 0x04, 0xf0, 0x07, 0x04, 0xb4, 0x71, 0x00, 0x21, + 0x40, 0x46, 0x00, 0xf0, 0x2d, 0xf9, 0x00, 0x20, 0x00, 0x90, 0x00, 0x23, + 0x32, 0x68, 0x01, 0x21, 0x40, 0x46, 0xd8, 0xf7, 0x12, 0xfe, 0x04, 0x00, + 0x69, 0xd1, 0x00, 0x21, 0x01, 0x22, 0xcd, 0xf8, 0x00, 0x80, 0x8d, 0xf8, + 0x04, 0x10, 0x8d, 0xf8, 0x05, 0x20, 0xad, 0xf8, 0x06, 0x10, 0x01, 0x21, + 0x78, 0x68, 0x06, 0x90, 0x02, 0x91, 0x32, 0x68, 0x88, 0x4d, 0x03, 0x92, + 0x39, 0x69, 0x07, 0x91, 0x03, 0x21, 0x3a, 0x68, 0x05, 0x92, 0x8d, 0xf8, + 0x20, 0x10, 0x00, 0x22, 0x8d, 0xf8, 0x21, 0x20, 0x91, 0x46, 0x30, 0x1d, + 0x0d, 0xf1, 0x21, 0x02, 0x10, 0xf8, 0x09, 0x10, 0x51, 0x70, 0x40, 0x46, + 0x4f, 0xf4, 0x80, 0x71, 0x00, 0xf0, 0xfe, 0xf8, 0x68, 0x46, 0xdb, 0xf7, + 0xb1, 0xfc, 0x04, 0x00, 0x3d, 0xd1, 0x4f, 0xf4, 0x7a, 0x71, 0x40, 0x46, + 0xdb, 0xf7, 0x78, 0xfd, 0x00, 0x28, 0x09, 0xd1, 0x4f, 0xf4, 0x00, 0x71, + 0x40, 0x46, 0x00, 0xf0, 0xed, 0xf8, 0x09, 0xa9, 0x68, 0x46, 0xdb, 0xf7, + 0x71, 0xfd, 0x00, 0x28, 0x40, 0xf0, 0x89, 0x80, 0x06, 0xeb, 0x89, 0x00, + 0x10, 0x99, 0x01, 0x62, 0x12, 0x99, 0xc1, 0x62, 0x9d, 0xed, 0x16, 0x0a, + 0xf9, 0xf7, 0x28, 0xfa, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, + 0x95, 0xec, 0x02, 0x0a, 0xf9, 0xf7, 0xf3, 0xf9, 0xb0, 0xee, 0x40, 0x8a, + 0xf0, 0xee, 0x60, 0x8a, 0x9d, 0xed, 0x14, 0x0a, 0xf9, 0xf7, 0x18, 0xfa, + 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, 0xf9, 0xf7, 0xbf, 0xf9, + 0x06, 0xf1, 0x08, 0x00, 0x00, 0xeb, 0xc9, 0x01, 0x09, 0xf1, 0x01, 0x09, + 0xb9, 0xf1, 0x03, 0x0f, 0x81, 0xec, 0x02, 0x0a, 0xb1, 0xd3, 0x00, 0x21, + 0x40, 0x46, 0xd8, 0xf7, 0x44, 0xfe, 0x00, 0x2c, 0x51, 0xd1, 0x06, 0xf1, + 0x08, 0x00, 0x00, 0xf0, 0x57, 0xf8, 0x31, 0x79, 0x70, 0x79, 0x00, 0xf0, + 0x5b, 0xf8, 0x06, 0xf1, 0x18, 0x00, 0xb0, 0xee, 0x40, 0x8a, 0x00, 0xf0, + 0x4d, 0xf8, 0xb1, 0x79, 0x70, 0x79, 0x00, 0xf0, 0x51, 0xf8, 0xf0, 0xee, + 0x40, 0x8a, 0xb0, 0xee, 0x48, 0x0a, 0x00, 0xf0, 0x73, 0xf8, 0x05, 0x46, + 0xb0, 0xee, 0x68, 0x0a, 0x00, 0xf0, 0x6e, 0xf8, 0x82, 0x46, 0x28, 0x46, + 0xb0, 0xee, 0x48, 0x0a, 0x00, 0xf0, 0x72, 0xf8, 0xb0, 0xee, 0x40, 0x9a, + 0x50, 0x46, 0xb0, 0xee, 0x68, 0x0a, 0x00, 0xf0, 0x6b, 0xf8, 0xd7, 0xed, + 0x05, 0x0a, 0xf4, 0xee, 0x49, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x5c, 0xbf, + 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x01, 0xd4, 0x55, 0x45, + 0x13, 0xd0, 0x18, 0xee, 0x90, 0x0a, 0xfa, 0xf7, 0xfb, 0xf9, 0xcd, 0xe9, + 0x02, 0x01, 0x4b, 0xf2, 0x04, 0x24, 0x18, 0xee, 0x10, 0x0a, 0xfa, 0xf7, + 0xf3, 0xf9, 0xcd, 0xe9, 0x00, 0x01, 0x00, 0xbf, 0x39, 0xa2, 0x07, 0x21, + 0x03, 0x20, 0xcd, 0xf7, 0xca, 0xff, 0x86, 0xf8, 0x38, 0x50, 0x29, 0x46, + 0x40, 0x46, 0x00, 0xf0, 0x61, 0xf8, 0x18, 0xb0, 0x20, 0x46, 0xbd, 0xec, + 0x04, 0x8b, 0xbd, 0xe8, 0xf0, 0x87, 0x4b, 0xf2, 0x05, 0x24, 0x9e, 0xe7, + 0x90, 0xec, 0x02, 0x1a, 0x06, 0xf1, 0x10, 0x00, 0x90, 0xec, 0x02, 0x0a, + 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, 0x0c, 0x1a, 0x04, 0xf0, 0x07, 0x04, + 0x2d, 0xed, 0x02, 0x8b, 0x04, 0x2c, 0xb0, 0xee, 0x41, 0x8a, 0xf0, 0xee, + 0x61, 0x8a, 0xa8, 0xbf, 0x08, 0x3c, 0xf9, 0xf7, 0x49, 0xfa, 0xb0, 0xee, + 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, + 0x68, 0x0a, 0xf9, 0xf7, 0x58, 0xf9, 0xf9, 0xf7, 0x13, 0xfb, 0x00, 0xee, + 0x90, 0x4a, 0xf8, 0xee, 0xe0, 0x0a, 0x9f, 0xed, 0x16, 0x1a, 0x60, 0xee, + 0x81, 0x0a, 0xbd, 0xec, 0x02, 0x8b, 0x80, 0xee, 0x20, 0x0a, 0x10, 0xbd, + 0x80, 0xb5, 0xbf, 0xf7, 0x4f, 0xff, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, + 0x10, 0x0a, 0x00, 0xf0, 0x07, 0x00, 0x02, 0xbd, 0xc0, 0xb2, 0x00, 0xee, + 0x90, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x80, 0xb5, 0x30, 0xee, 0x60, 0x0a, + 0xdf, 0xed, 0x08, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xf9, 0xf7, 0x57, 0xf9, + 0xf9, 0xf7, 0x64, 0xf9, 0xf9, 0xf7, 0xea, 0xfa, 0xdf, 0xed, 0x03, 0x0a, + 0x80, 0xee, 0x20, 0x0a, 0xb0, 0xee, 0xc0, 0x0a, 0x01, 0xbd, 0x00, 0x00, + 0xdb, 0x0f, 0x49, 0x3f, 0x88, 0x48, 0x00, 0x20, 0xeb, 0xf7, 0xfe, 0xbf, + 0x0a, 0x46, 0x01, 0x21, 0x81, 0x40, 0x06, 0x20, 0xef, 0xf7, 0xc0, 0xbd, + 0x6e, 0x31, 0x66, 0x20, 0x3d, 0x25, 0x66, 0x2c, 0x20, 0x6e, 0x32, 0x66, + 0x20, 0x3d, 0x25, 0x66, 0x0a, 0x00, 0x00, 0x00, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, + 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0x38, 0xb5, 0x0c, 0x46, 0x14, 0x49, 0x51, 0xf8, 0x20, 0x50, 0x01, 0x23, + 0x20, 0x00, 0x08, 0xbf, 0x00, 0x23, 0x30, 0x35, 0x4f, 0xf4, 0x80, 0x62, + 0x0a, 0x21, 0x28, 0x46, 0xff, 0xf7, 0xe2, 0xff, 0x23, 0x46, 0x28, 0x46, + 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x40, 0xf2, 0xfe, 0x32, 0x01, 0x21, + 0xd8, 0xe7, 0x09, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x30, 0x30, 0x00, 0x68, + 0xc0, 0xf3, 0x48, 0x00, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x4c, 0x54, 0xf8, + 0x20, 0x00, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x01, 0x22, 0x00, 0x21, + 0x30, 0x30, 0xc5, 0xe7, 0x28, 0x97, 0x04, 0x01, 0x10, 0xee, 0x10, 0x0a, + 0x09, 0x49, 0xb5, 0xee, 0x40, 0x0a, 0xd1, 0xf8, 0x3c, 0xc0, 0xbc, 0xeb, + 0x40, 0x0f, 0xd1, 0xec, 0x0d, 0x0a, 0xc0, 0xf0, 0x0b, 0x80, 0xf1, 0xee, + 0x10, 0xfa, 0x4f, 0xf0, 0x00, 0x01, 0x40, 0xf4, 0xbb, 0xac, 0xb0, 0xee, + 0x60, 0x0a, 0x70, 0x47, 0xc0, 0x8d, 0x04, 0x01, 0x4f, 0xf0, 0x80, 0x7c, + 0x1c, 0xeb, 0x40, 0x0f, 0x08, 0xd2, 0x00, 0x42, 0x54, 0xbf, 0xb0, 0xee, + 0x42, 0x0a, 0x31, 0xee, 0x41, 0x0a, 0xaf, 0xf3, 0x00, 0x80, 0x70, 0x47, + 0x04, 0xd8, 0xc0, 0x42, 0x02, 0xd3, 0x00, 0x20, 0x00, 0xee, 0x10, 0x0a, + 0x70, 0x47, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x06, 0x8b, + 0x0f, 0x46, 0xc0, 0xb0, 0x05, 0x46, 0x97, 0xf8, 0x00, 0xa0, 0xfa, 0x88, + 0xb9, 0x88, 0xb8, 0x78, 0xec, 0xf7, 0x40, 0xfa, 0x00, 0x24, 0xd7, 0xf8, + 0x08, 0x80, 0xba, 0xf1, 0x01, 0x0f, 0xa1, 0x46, 0xb0, 0xee, 0x40, 0xaa, + 0x18, 0xd1, 0x01, 0x22, 0x8d, 0xf8, 0x2c, 0x20, 0x8d, 0xf8, 0x2d, 0x20, + 0x8d, 0xf8, 0x2e, 0x20, 0x03, 0x21, 0x03, 0x22, 0x8d, 0xf8, 0x30, 0x20, + 0x8d, 0xf8, 0x31, 0x20, 0x8d, 0xf8, 0x32, 0x20, 0x0d, 0x91, 0x01, 0x22, + 0x8d, 0xf8, 0x2f, 0x40, 0x8d, 0xf8, 0x28, 0x40, 0x8d, 0xf8, 0x29, 0x20, + 0x02, 0x21, 0x13, 0xe0, 0xba, 0xf1, 0x02, 0x0f, 0x13, 0xd1, 0x02, 0x21, + 0x0d, 0x91, 0x0b, 0xa8, 0x03, 0x21, 0x8d, 0xf8, 0x32, 0x10, 0x01, 0x22, + 0x8d, 0xf8, 0x2c, 0x20, 0x44, 0x70, 0x82, 0x70, 0xc4, 0x70, 0x8d, 0xf8, + 0x30, 0x20, 0x8d, 0xf8, 0x28, 0x40, 0x01, 0x21, 0x8d, 0xf8, 0x2a, 0x10, + 0x01, 0xe0, 0x40, 0xf2, 0x05, 0x74, 0x79, 0x69, 0x0d, 0x98, 0xb1, 0xfb, + 0xf0, 0xf0, 0x13, 0x90, 0x02, 0x46, 0x0d, 0x98, 0x42, 0x43, 0x8a, 0x42, + 0x02, 0xd2, 0x13, 0x99, 0x49, 0x1c, 0x13, 0x91, 0x00, 0x21, 0x0e, 0x95, + 0x2f, 0xe1, 0x00, 0x2c, 0x40, 0xf0, 0x31, 0x81, 0x0d, 0x9a, 0x00, 0x20, + 0x0f, 0xac, 0x0a, 0xad, 0x15, 0xf8, 0x00, 0xc0, 0xfb, 0x68, 0x3e, 0x69, + 0x02, 0xfb, 0x01, 0xcc, 0x06, 0xfb, 0x0c, 0x33, 0x44, 0xf8, 0x20, 0x30, + 0x40, 0x1c, 0x04, 0x28, 0xf2, 0xd3, 0x14, 0x91, 0x0d, 0x92, 0x79, 0x78, + 0x01, 0x29, 0x11, 0xd1, 0x0d, 0x98, 0x00, 0x21, 0x00, 0x22, 0x03, 0xe0, + 0x54, 0xf8, 0x22, 0x30, 0x59, 0x18, 0x52, 0x1c, 0x82, 0x42, 0xf9, 0xd3, + 0x0d, 0x90, 0x91, 0xfb, 0xf0, 0xf1, 0x0e, 0x98, 0xeb, 0xf7, 0xe6, 0xfe, + 0x05, 0x46, 0x00, 0xe0, 0x00, 0x25, 0xb9, 0x88, 0x38, 0x7e, 0xd7, 0xed, + 0x08, 0x0a, 0x97, 0xed, 0x07, 0x0a, 0x0a, 0x22, 0xec, 0xf7, 0x4a, 0xfa, + 0xc0, 0xb2, 0x08, 0x90, 0x16, 0xa9, 0x09, 0x91, 0x00, 0x20, 0x03, 0x22, + 0x07, 0x90, 0x06, 0x92, 0x00, 0x22, 0xf9, 0x88, 0x05, 0x91, 0x04, 0x90, + 0x01, 0x21, 0x00, 0x90, 0x00, 0x23, 0x01, 0x91, 0x03, 0x92, 0x02, 0x93, + 0xb7, 0xee, 0x00, 0x1a, 0x0e, 0x98, 0xdf, 0xed, 0x78, 0x0a, 0x9f, 0xed, + 0x77, 0x0a, 0x51, 0x46, 0xeb, 0xf7, 0x40, 0xff, 0x1e, 0xa8, 0x02, 0x90, + 0x01, 0x95, 0x00, 0x25, 0x39, 0x7e, 0x0e, 0x98, 0x00, 0x91, 0xbb, 0x88, + 0xba, 0x78, 0x79, 0x78, 0xeb, 0xf7, 0x08, 0xfe, 0x0e, 0x9e, 0x0b, 0xa8, + 0x18, 0x22, 0x16, 0xa9, 0x6a, 0x43, 0x40, 0x5d, 0x0a, 0x44, 0x02, 0xf1, + 0x40, 0x03, 0x07, 0x93, 0x00, 0x21, 0x06, 0x91, 0x05, 0x91, 0x04, 0x91, + 0x01, 0x23, 0x03, 0x93, 0x02, 0x91, 0x01, 0x90, 0x00, 0x90, 0x01, 0x22, + 0x54, 0xf8, 0x25, 0x30, 0x1e, 0xa9, 0x30, 0x46, 0xeb, 0xf7, 0x07, 0xfe, + 0x6d, 0x1c, 0x04, 0x2d, 0xe3, 0xd3, 0x16, 0xa9, 0x30, 0x46, 0xc0, 0x46, + 0xc0, 0x46, 0x00, 0x25, 0x00, 0x23, 0x16, 0xaa, 0x13, 0x21, 0x30, 0x46, + 0xec, 0xf7, 0xc3, 0xfb, 0x04, 0x00, 0x0b, 0xd1, 0x42, 0xf2, 0x10, 0x72, + 0x13, 0x21, 0x30, 0x46, 0xec, 0xf7, 0x10, 0xfe, 0x28, 0xb1, 0x6d, 0x1c, + 0x04, 0x2d, 0xed, 0xd3, 0x43, 0xf2, 0x02, 0x04, 0x98, 0xe0, 0x0e, 0x96, + 0x13, 0x21, 0x30, 0x46, 0xec, 0xf7, 0x9f, 0xfe, 0x05, 0x46, 0x00, 0x22, + 0x29, 0x46, 0x50, 0x46, 0xeb, 0xf7, 0x71, 0xff, 0x10, 0xb1, 0x43, 0xf2, + 0x03, 0x14, 0x8a, 0xe0, 0x29, 0x46, 0x50, 0x46, 0xeb, 0xf7, 0x8b, 0xff, + 0xf9, 0x88, 0x88, 0x42, 0x18, 0xbf, 0x43, 0xf2, 0x01, 0x24, 0xf4, 0xd1, + 0x0e, 0x98, 0x13, 0x21, 0xec, 0xf7, 0x87, 0xfe, 0x0e, 0x9e, 0x83, 0x46, + 0x00, 0x25, 0x0b, 0xa8, 0x41, 0x5d, 0x01, 0x29, 0x71, 0xd1, 0x78, 0x69, + 0x81, 0x45, 0x6e, 0xd2, 0x02, 0xa9, 0x04, 0xaa, 0x0c, 0xa8, 0x01, 0x91, + 0x00, 0x92, 0xea, 0xb2, 0x43, 0x5d, 0x59, 0x46, 0x50, 0x46, 0xeb, 0xf7, + 0x85, 0xff, 0xb0, 0xee, 0x4a, 0x0a, 0xf8, 0xf7, 0xaf, 0xff, 0xdd, 0xe9, + 0x02, 0x01, 0xb0, 0xee, 0x40, 0x9a, 0xf0, 0xee, 0x60, 0x9a, 0xf2, 0xf7, + 0xd1, 0xf9, 0x00, 0xee, 0x10, 0x0a, 0xf8, 0xf7, 0xa3, 0xff, 0x35, 0x4a, + 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x92, 0xec, 0x02, 0x0a, + 0xf8, 0xf7, 0x6d, 0xff, 0xdd, 0xe9, 0x04, 0x01, 0xb0, 0xee, 0x40, 0x8a, + 0xf0, 0xee, 0x60, 0x8a, 0xf2, 0xf7, 0xbc, 0xf9, 0x00, 0xee, 0x10, 0x0a, + 0xf8, 0xf7, 0x8e, 0xff, 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, + 0xf8, 0xf7, 0x35, 0xff, 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, + 0xf8, 0xf7, 0x55, 0xff, 0x20, 0xee, 0x00, 0x0a, 0x00, 0xee, 0xa0, 0x0a, + 0xbf, 0xf7, 0x92, 0xfe, 0xfb, 0xee, 0x04, 0x0a, 0x20, 0xee, 0x20, 0x0a, + 0xbf, 0xf7, 0x52, 0xfd, 0x9f, 0xed, 0x1c, 0x1a, 0xb4, 0xee, 0x41, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0xa8, 0xbf, 0x9f, 0xed, 0x1a, 0x0a, 0x08, 0xda, + 0xb5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x54, 0xbf, 0xbc, 0xee, + 0xc0, 0x0a, 0x9f, 0xed, 0x13, 0x0a, 0x4f, 0xea, 0x99, 0x00, 0x4f, 0xea, + 0xc9, 0x01, 0x01, 0xf0, 0x18, 0x01, 0x58, 0xf8, 0x20, 0x20, 0xff, 0x23, + 0x8b, 0x40, 0x9a, 0x43, 0x10, 0xee, 0x10, 0x3a, 0x03, 0xfa, 0x01, 0xf1, + 0x11, 0x43, 0x48, 0xf8, 0x20, 0x10, 0x09, 0xf1, 0x01, 0x09, 0x6d, 0x1c, + 0x04, 0x2d, 0x86, 0xd3, 0x0e, 0x96, 0x14, 0x99, 0x49, 0x1c, 0x13, 0x98, + 0x81, 0x42, 0xff, 0xf4, 0xcc, 0xae, 0x40, 0xb0, 0x20, 0x46, 0xbd, 0xec, + 0x06, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x7f, 0x43, 0xff, 0x00, 0x00, 0x00, 0x14, 0x41, 0x00, 0x20, + 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x00, 0xf0, 0xdb, 0xfc, 0x00, 0xf0, + 0x99, 0xfc, 0x05, 0xf5, 0xbc, 0x70, 0x00, 0x21, 0x41, 0x70, 0x00, 0x22, + 0x40, 0x21, 0x82, 0x71, 0xc1, 0x71, 0x02, 0x72, 0x02, 0x70, 0x42, 0x72, + 0x82, 0x72, 0x31, 0xbd, 0x80, 0xb5, 0x00, 0xf5, 0xbe, 0x70, 0x2d, 0xed, + 0x02, 0x8b, 0x00, 0xee, 0x10, 0x1a, 0x01, 0x78, 0x40, 0x78, 0x01, 0xee, + 0x10, 0x1a, 0xb8, 0xee, 0x40, 0x0a, 0xb8, 0xee, 0x41, 0x1a, 0x80, 0xee, + 0x01, 0x8a, 0x01, 0xee, 0x10, 0x2a, 0x01, 0xee, 0x90, 0x0a, 0xb8, 0xee, + 0x41, 0x1a, 0xf8, 0xee, 0x61, 0x1a, 0x71, 0xee, 0x61, 0x1a, 0xfb, 0xee, + 0x04, 0x0a, 0xc1, 0xee, 0xa0, 0x0a, 0xb2, 0xee, 0x04, 0x0a, 0xd6, 0xf7, + 0xa9, 0xfc, 0x28, 0xee, 0x00, 0x0a, 0xbd, 0xec, 0x02, 0x8b, 0x01, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x38, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x03, 0x2a, + 0x08, 0x9d, 0x0c, 0x46, 0x1c, 0xd1, 0x07, 0x99, 0x1a, 0x46, 0x08, 0xee, + 0x10, 0x2a, 0x01, 0x29, 0xbb, 0xee, 0x45, 0x8a, 0x05, 0xd1, 0x94, 0xf8, + 0x78, 0x11, 0x11, 0xb1, 0x04, 0xf1, 0xe0, 0x01, 0x01, 0xe0, 0x04, 0xf1, + 0x70, 0x01, 0x06, 0x9a, 0x69, 0x60, 0x8c, 0x30, 0x28, 0x60, 0x19, 0x46, + 0x20, 0x46, 0xff, 0xf7, 0xb7, 0xff, 0xf7, 0xee, 0x00, 0x0a, 0xc0, 0xee, + 0x88, 0x0a, 0x0e, 0xe0, 0x28, 0x60, 0x02, 0x2a, 0x6c, 0x60, 0x08, 0xbf, + 0xbf, 0xee, 0x00, 0x0a, 0x05, 0xd0, 0xb7, 0xee, 0x00, 0x0a, 0x12, 0xb9, + 0xdf, 0xed, 0x9e, 0x0a, 0x01, 0xe0, 0xf0, 0xee, 0x40, 0x0a, 0xc5, 0xed, + 0x03, 0x0a, 0x85, 0xed, 0x02, 0x0a, 0xbd, 0xec, 0x02, 0x8b, 0x31, 0xbd, + 0x78, 0xb5, 0x87, 0xb0, 0x00, 0xf0, 0x1a, 0xf8, 0xff, 0xf7, 0xc0, 0xff, + 0x04, 0x99, 0x03, 0x98, 0x9d, 0xed, 0x06, 0x0a, 0x00, 0xf0, 0x8e, 0xfe, + 0x08, 0xb0, 0x70, 0xbd, 0x78, 0xb5, 0x87, 0xb0, 0x00, 0xf0, 0x0c, 0xf8, + 0xdb, 0xb2, 0xd2, 0xb2, 0xff, 0xf7, 0xb0, 0xff, 0x04, 0x99, 0x03, 0x98, + 0x9d, 0xed, 0x06, 0x0a, 0x00, 0xf0, 0xf0, 0xfd, 0x08, 0xb0, 0x70, 0xbd, + 0x03, 0xac, 0x01, 0x25, 0x00, 0x26, 0x02, 0x94, 0x01, 0x95, 0x00, 0x96, + 0x70, 0x47, 0x70, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x88, 0xb0, 0x00, 0xf0, + 0x25, 0xf8, 0xd2, 0xb2, 0x00, 0xf0, 0x29, 0xf8, 0x04, 0x99, 0x03, 0x98, + 0x00, 0xf0, 0x8d, 0xfd, 0x00, 0xf0, 0xba, 0xfb, 0x9d, 0xed, 0x05, 0x0a, + 0xf8, 0xf7, 0x86, 0xfe, 0x00, 0xf0, 0xb9, 0xfb, 0x08, 0xb0, 0xbd, 0xec, + 0x02, 0x8b, 0x70, 0xbd, 0x78, 0xb5, 0x87, 0xb0, 0x00, 0xf0, 0x0e, 0xf8, + 0x00, 0xf0, 0x13, 0xf8, 0x04, 0x99, 0x03, 0x98, 0x00, 0xf0, 0xf2, 0xfd, + 0xdd, 0xed, 0x05, 0x0a, 0x60, 0xee, 0xa0, 0x0a, 0x20, 0xee, 0x80, 0x0a, + 0x08, 0xb0, 0x70, 0xbd, 0x01, 0xf2, 0x7f, 0x13, 0x03, 0xac, 0x00, 0x25, + 0x02, 0x94, 0x01, 0x95, 0x70, 0x47, 0x5e, 0x78, 0x00, 0x96, 0x1b, 0x78, + 0x6a, 0xe7, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0x2d, 0xed, 0x08, 0x8b, + 0x05, 0x46, 0x10, 0x9c, 0x0e, 0x46, 0x17, 0x46, 0x98, 0x46, 0xff, 0xf7, + 0xa7, 0xff, 0xdf, 0xf8, 0x70, 0xc6, 0x9c, 0xec, 0x02, 0x1a, 0xf8, 0xf7, + 0x24, 0xfe, 0x00, 0xf0, 0x66, 0xfb, 0x43, 0x46, 0x3a, 0x46, 0x31, 0x46, + 0x28, 0x46, 0xff, 0xf7, 0x8b, 0xff, 0x00, 0x2c, 0x77, 0xd0, 0x05, 0xf5, + 0x8c, 0x70, 0xf6, 0xee, 0x00, 0x0a, 0x20, 0xee, 0x20, 0xba, 0x90, 0xed, + 0x02, 0x8a, 0xd0, 0xed, 0x01, 0x8a, 0xd0, 0xed, 0x00, 0xaa, 0x96, 0xf8, + 0x79, 0x41, 0xb0, 0xee, 0x4b, 0x0a, 0xbf, 0xf7, 0xbd, 0xfe, 0x2a, 0xee, + 0x80, 0xaa, 0xb0, 0xee, 0x4b, 0x0a, 0xbf, 0xf7, 0xb7, 0xfe, 0xf4, 0xee, + 0x4a, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x4c, 0xbf, 0xf0, 0xee, 0x4a, 0x0a, + 0xf0, 0xee, 0x68, 0x0a, 0xf4, 0xee, 0x48, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x04, 0xf0, 0x03, 0x04, 0x2a, 0xee, 0x80, 0x0a, 0x07, 0xd5, 0xf4, 0xee, + 0x4a, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x04, 0xd4, 0xb0, 0xee, 0x68, 0xaa, + 0x01, 0xe0, 0xb0, 0xee, 0x48, 0xaa, 0xf4, 0xee, 0x40, 0x8a, 0xf1, 0xee, + 0x10, 0xfa, 0x4c, 0xbf, 0xf0, 0xee, 0x40, 0x0a, 0xf0, 0xee, 0x68, 0x0a, + 0xf4, 0xee, 0x48, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x07, 0xd5, 0xf4, 0xee, + 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x04, 0xd4, 0xb0, 0xee, 0x68, 0x0a, + 0x01, 0xe0, 0xb0, 0xee, 0x48, 0x0a, 0x0f, 0xf2, 0x38, 0x70, 0x00, 0xeb, + 0x84, 0x01, 0xd1, 0xed, 0x00, 0x0a, 0x20, 0xee, 0x80, 0x0a, 0xf8, 0xf7, + 0xf1, 0xfd, 0xdf, 0xf8, 0xa8, 0x05, 0x00, 0xf0, 0xfd, 0xfa, 0xf8, 0xf7, + 0xbe, 0xfd, 0x0f, 0xf2, 0x08, 0x70, 0x00, 0xeb, 0x84, 0x01, 0xb0, 0xee, + 0x40, 0x8a, 0x91, 0xed, 0x00, 0x0a, 0xf0, 0xee, 0x60, 0x8a, 0x20, 0xee, + 0x0a, 0x0a, 0xf8, 0xf7, 0xdd, 0xfd, 0x00, 0xf0, 0x05, 0xfb, 0xb0, 0xee, + 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0xb0, 0xee, 0x49, 0x0a, 0xf0, 0xee, + 0x69, 0x0a, 0xf8, 0xf7, 0x7e, 0xfd, 0x00, 0xf0, 0xe6, 0xfa, 0xdf, 0xed, + 0x22, 0x1a, 0xb4, 0xee, 0x61, 0x9a, 0xf1, 0xee, 0x10, 0xfa, 0x9f, 0xed, + 0x20, 0x8a, 0xdf, 0xed, 0x20, 0x0a, 0x9f, 0xed, 0x20, 0x1a, 0x0b, 0xda, + 0xbe, 0xee, 0x00, 0x0a, 0xb4, 0xee, 0x40, 0x9a, 0xf1, 0xee, 0x10, 0xfa, + 0x4c, 0xbf, 0xb0, 0xee, 0x41, 0x0a, 0x29, 0xee, 0x20, 0x0a, 0x01, 0xe0, + 0xb0, 0xee, 0x48, 0x0a, 0xf4, 0xee, 0x61, 0x9a, 0xf1, 0xee, 0x10, 0xfa, + 0x0a, 0xda, 0xfe, 0xee, 0x00, 0x1a, 0xf4, 0xee, 0x61, 0x9a, 0xf1, 0xee, + 0x10, 0xfa, 0x4c, 0xbf, 0xb0, 0xee, 0x41, 0x8a, 0x29, 0xee, 0xa0, 0x8a, + 0x0f, 0x9d, 0x0e, 0x9c, 0xbf, 0xf7, 0x7c, 0xfb, 0xbd, 0xee, 0xc0, 0x0a, + 0x10, 0xee, 0x10, 0x0a, 0x20, 0x80, 0xb0, 0xee, 0x48, 0x0a, 0xbf, 0xf7, + 0x73, 0xfb, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x28, 0x80, + 0x00, 0x20, 0xbd, 0xec, 0x08, 0x8b, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x80, 0x47, + 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x80, 0xc7, 0x2d, 0xe9, 0xf5, 0x4f, + 0x81, 0xb0, 0x00, 0x27, 0x2d, 0xed, 0x10, 0x8b, 0x94, 0xb0, 0x88, 0x46, + 0x30, 0x9c, 0x03, 0x2a, 0x9a, 0x46, 0x08, 0xf5, 0xbc, 0x75, 0x00, 0xf5, + 0x94, 0x79, 0x1f, 0xd1, 0xa8, 0x79, 0xc0, 0xb1, 0x22, 0x46, 0x51, 0x46, + 0x40, 0x46, 0xff, 0xf7, 0x49, 0xfe, 0xd9, 0xed, 0x06, 0x0a, 0xb4, 0xee, + 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x5e, 0xbf, 0x99, 0xed, 0x07, 0x1a, + 0xb4, 0xee, 0x40, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x03, 0xd5, 0x25, 0x98, + 0x41, 0x46, 0x00, 0xf0, 0xc9, 0xfa, 0xa8, 0x79, 0x20, 0xb9, 0x01, 0x21, + 0xa9, 0x71, 0x85, 0xf8, 0x04, 0xa0, 0x6c, 0x71, 0x31, 0x9e, 0x06, 0xf1, + 0x08, 0x00, 0x06, 0xf1, 0x08, 0x01, 0x90, 0xec, 0x02, 0x0a, 0x91, 0xec, + 0x02, 0x1a, 0x90, 0xec, 0x02, 0x2a, 0x91, 0xec, 0x02, 0x3a, 0x20, 0xee, + 0x01, 0x0a, 0x02, 0xee, 0xa3, 0x0a, 0xd9, 0xed, 0x00, 0x0a, 0x00, 0xf0, + 0x38, 0xfa, 0x02, 0xdb, 0xaf, 0x70, 0xef, 0x70, 0x4b, 0xe0, 0x96, 0xed, + 0x08, 0x0a, 0xd9, 0xed, 0x01, 0x0a, 0x00, 0xf0, 0x2e, 0xfa, 0x03, 0xdb, + 0xaf, 0x70, 0x01, 0x21, 0xe9, 0x70, 0x40, 0xe0, 0xf8, 0xf7, 0x2c, 0xfd, + 0x06, 0xf1, 0x18, 0x00, 0x00, 0xf0, 0x38, 0xfa, 0xf8, 0xf7, 0x0c, 0xfd, + 0x06, 0xf1, 0x18, 0x00, 0x00, 0xf0, 0x52, 0xfa, 0x90, 0xec, 0x02, 0x0a, + 0xf8, 0xf7, 0xae, 0xfe, 0xd6, 0xed, 0x00, 0x0a, 0xf8, 0xee, 0x60, 0x0a, + 0x20, 0xee, 0x80, 0x0a, 0x9f, 0xed, 0x45, 0x1a, 0x80, 0xee, 0x01, 0x1a, + 0xb0, 0xee, 0xc1, 0x0a, 0xbc, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0xba, + 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, 0xf9, 0xf7, 0x54, 0xfb, + 0xd9, 0xed, 0x02, 0x0a, 0x00, 0xf0, 0xff, 0xf9, 0x0a, 0xd5, 0xd9, 0xf8, + 0x0c, 0x00, 0x83, 0x45, 0x02, 0xd3, 0xaf, 0x70, 0x02, 0x20, 0x0d, 0xe0, + 0x01, 0x21, 0xa9, 0x70, 0x03, 0x20, 0x09, 0xe0, 0xd9, 0xf8, 0x10, 0x00, + 0x83, 0x45, 0x02, 0xd3, 0xaf, 0x70, 0x04, 0x20, 0x02, 0xe0, 0x01, 0x21, + 0xa9, 0x70, 0x05, 0x20, 0xe8, 0x70, 0x03, 0xa9, 0x02, 0x91, 0x9d, 0xf8, + 0x98, 0x20, 0x25, 0x98, 0x01, 0x97, 0x00, 0x94, 0x53, 0x46, 0x41, 0x46, + 0xff, 0xf7, 0xea, 0xfd, 0x9d, 0xf8, 0x98, 0x00, 0x03, 0x28, 0x16, 0xd1, + 0x32, 0x98, 0x00, 0xf1, 0x10, 0x02, 0x08, 0xa9, 0x92, 0xec, 0x02, 0x0a, + 0x81, 0xec, 0x02, 0x0a, 0x00, 0xf1, 0x18, 0x02, 0x0a, 0xa9, 0x92, 0xec, + 0x02, 0x0a, 0x81, 0xec, 0x02, 0x0a, 0x41, 0x68, 0x0c, 0x91, 0x08, 0xf1, + 0x70, 0x02, 0xc1, 0x68, 0x0d, 0x91, 0x00, 0x92, 0x0f, 0xe0, 0x06, 0xf1, + 0x08, 0x01, 0x08, 0xa8, 0x00, 0xf0, 0xb8, 0xf9, 0x06, 0xf1, 0x10, 0x01, + 0x0a, 0xa8, 0x00, 0xf0, 0xb3, 0xf9, 0x32, 0x68, 0x0c, 0x92, 0x71, 0x68, + 0x0d, 0x91, 0xcd, 0xf8, 0x00, 0x80, 0xa8, 0x78, 0x50, 0xbb, 0x04, 0x99, + 0x03, 0x98, 0x00, 0xf0, 0xb2, 0xfb, 0x08, 0xa8, 0x08, 0xa9, 0x00, 0xf0, + 0xbd, 0xf9, 0x91, 0xec, 0x02, 0x2a, 0x9d, 0xed, 0x05, 0x5a, 0xd9, 0xed, + 0x08, 0x5a, 0x90, 0xec, 0x02, 0x3a, 0x91, 0xec, 0x02, 0x4a, 0x25, 0xee, + 0x05, 0x5a, 0x20, 0xee, 0x02, 0x0a, 0x65, 0xee, 0x25, 0x5a, 0x03, 0xee, + 0xa4, 0x0a, 0x61, 0xee, 0x01, 0x0a, 0x25, 0xee, 0x80, 0x0a, 0x41, 0xee, + 0xa1, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xbc, 0x49, 0x8d, 0xed, 0x0e, 0x0a, + 0x00, 0xf0, 0x84, 0xf9, 0x03, 0xe0, 0x00, 0xbf, 0xdb, 0x0f, 0xc9, 0x40, + 0x0e, 0x97, 0xbd, 0xf9, 0xd0, 0x10, 0xbd, 0xf9, 0xcc, 0x20, 0x9d, 0xed, + 0x05, 0xaa, 0x9d, 0xed, 0x06, 0xea, 0xad, 0xf8, 0x1c, 0x20, 0xad, 0xf8, + 0x1e, 0x10, 0x8d, 0xed, 0x0f, 0xaa, 0x8d, 0xed, 0x10, 0xea, 0x08, 0xf5, + 0xa8, 0x76, 0x68, 0x78, 0xc3, 0x07, 0x05, 0xd4, 0x28, 0x22, 0x07, 0xa9, + 0x30, 0x46, 0xbf, 0xf7, 0xef, 0xf8, 0x3a, 0xe1, 0x96, 0xed, 0x05, 0x0a, + 0xb8, 0xee, 0x40, 0x0a, 0xdf, 0xed, 0xa3, 0x0a, 0x60, 0xee, 0x20, 0x0a, + 0x96, 0xed, 0x06, 0x1a, 0xb8, 0xee, 0x41, 0x1a, 0xb7, 0xee, 0x00, 0x0a, + 0x80, 0xee, 0x01, 0x0a, 0x9d, 0xed, 0x0d, 0x1a, 0xb8, 0xee, 0x41, 0x1a, + 0xf7, 0xee, 0x00, 0x1a, 0xc1, 0xee, 0x81, 0x1a, 0x30, 0xee, 0x21, 0x0a, + 0x20, 0xee, 0x80, 0x0a, 0x8d, 0xed, 0x01, 0x0a, 0xd6, 0xed, 0x07, 0x0a, + 0x9d, 0xed, 0x0e, 0x0a, 0xf0, 0x5f, 0xdf, 0xf8, 0x5c, 0xb2, 0x70, 0xee, + 0x80, 0xfa, 0x96, 0xed, 0x08, 0x0a, 0xf6, 0xee, 0x00, 0x0a, 0x30, 0xee, + 0x0a, 0x1a, 0x61, 0xee, 0x20, 0xea, 0x30, 0xee, 0x4a, 0x1a, 0x13, 0x18, + 0x21, 0xee, 0x20, 0xfa, 0x00, 0xee, 0x10, 0x3a, 0xb8, 0xee, 0xc0, 0xba, + 0x82, 0x1a, 0xb6, 0xf9, 0x02, 0x00, 0x00, 0xee, 0x10, 0x2a, 0x0a, 0x18, + 0x00, 0xee, 0x90, 0x2a, 0xb8, 0xee, 0xe0, 0x9a, 0x41, 0x1a, 0xf8, 0xee, + 0xc0, 0xaa, 0x00, 0xee, 0x90, 0x1a, 0xb8, 0xee, 0xe0, 0xca, 0x9f, 0xed, + 0x82, 0x0a, 0xf8, 0xf7, 0x21, 0xfc, 0x00, 0xf0, 0x4f, 0xf9, 0xb0, 0xee, + 0x49, 0x0a, 0xf8, 0xf7, 0x1b, 0xfc, 0x00, 0xf0, 0x3b, 0xf9, 0x00, 0xf0, + 0x2e, 0xf9, 0xb0, 0xee, 0x4b, 0x0a, 0xf8, 0xf7, 0x13, 0xfc, 0x00, 0xf0, + 0x1b, 0xf9, 0x00, 0xf0, 0x44, 0xf9, 0xb0, 0xee, 0x40, 0xba, 0xf0, 0xee, + 0x60, 0xba, 0x9f, 0xed, 0x75, 0x0a, 0xf8, 0xf7, 0x07, 0xfc, 0x00, 0xf0, + 0x35, 0xf9, 0xb0, 0xee, 0x4c, 0x0a, 0xf8, 0xf7, 0x01, 0xfc, 0x00, 0xf0, + 0x21, 0xf9, 0x00, 0xf0, 0x14, 0xf9, 0xb0, 0xee, 0x6a, 0x0a, 0xf8, 0xf7, + 0xf9, 0xfb, 0x00, 0xf0, 0x01, 0xf9, 0x00, 0xf0, 0x2a, 0xf9, 0x00, 0xf0, + 0x23, 0xf9, 0x96, 0xed, 0x08, 0x0a, 0xf8, 0xf7, 0xef, 0xfb, 0x08, 0xf5, + 0xaa, 0x70, 0x90, 0xec, 0x02, 0x1a, 0xf8, 0xf7, 0xbc, 0xfb, 0xb0, 0xee, + 0x40, 0xda, 0xf0, 0xee, 0x60, 0xda, 0xb0, 0xee, 0x4a, 0x0a, 0xf8, 0xf7, + 0xe1, 0xfb, 0x08, 0xa8, 0x90, 0xec, 0x02, 0x1a, 0xf8, 0xf7, 0xaf, 0xfb, + 0xb0, 0xee, 0x40, 0xca, 0xf0, 0xee, 0x60, 0xca, 0x96, 0xed, 0x08, 0x0a, + 0xd6, 0xed, 0x09, 0x0a, 0x0a, 0xa8, 0x08, 0xf5, 0xae, 0x71, 0x60, 0xee, + 0x20, 0xaa, 0x20, 0xee, 0x0e, 0xea, 0x90, 0xec, 0x02, 0x1a, 0x91, 0xec, + 0x02, 0x0a, 0xf8, 0xf7, 0x74, 0xfb, 0x00, 0xf0, 0xdc, 0xf8, 0xb0, 0xee, + 0x4f, 0x0a, 0xf8, 0xf7, 0xc1, 0xfb, 0x00, 0xf0, 0xf4, 0xf8, 0x11, 0xa8, + 0x80, 0xec, 0x02, 0x0a, 0xb0, 0xee, 0x6e, 0x0a, 0xf8, 0xf7, 0xb8, 0xfb, + 0x00, 0xf0, 0xd2, 0xf8, 0x11, 0xa8, 0x90, 0xec, 0x02, 0x1a, 0xf8, 0xf7, + 0x5e, 0xfb, 0x11, 0xa8, 0xb0, 0xee, 0x4c, 0x1a, 0x80, 0xec, 0x02, 0x0a, + 0x00, 0xf0, 0x99, 0xf8, 0xf8, 0xf7, 0x55, 0xfb, 0x11, 0xa9, 0x91, 0xec, + 0x02, 0x1a, 0xf8, 0xf7, 0x50, 0xfb, 0x00, 0xf0, 0x89, 0xf8, 0x71, 0xee, + 0x0a, 0x3a, 0x3a, 0xee, 0x8e, 0x4a, 0x00, 0xf0, 0x9b, 0xf8, 0x01, 0x28, + 0x2c, 0xd1, 0x0a, 0xa8, 0x08, 0xf5, 0xae, 0x71, 0x90, 0xec, 0x02, 0x1a, + 0x91, 0xec, 0x02, 0x0a, 0xf8, 0xf7, 0x50, 0xfb, 0x00, 0xf0, 0xa5, 0xf8, + 0xb0, 0xee, 0x6e, 0x0a, 0xf8, 0xf7, 0x8a, 0xfb, 0x00, 0xf0, 0xbd, 0xf8, + 0x00, 0xf0, 0xb6, 0xf8, 0xb0, 0xee, 0x4f, 0x0a, 0xf8, 0xf7, 0x82, 0xfb, + 0x00, 0xf0, 0x9c, 0xf8, 0x00, 0xf0, 0xa8, 0xf8, 0x00, 0xf0, 0xac, 0xf8, + 0xb0, 0xee, 0x4c, 0x1a, 0x00, 0xf0, 0x67, 0xf8, 0xf8, 0xf7, 0x36, 0xfb, + 0x00, 0xf0, 0x9e, 0xf8, 0x00, 0xf0, 0x5a, 0xf8, 0x71, 0xee, 0x4a, 0x3a, + 0x3a, 0xee, 0xce, 0x4a, 0x00, 0xf0, 0x6c, 0xf8, 0x10, 0xb9, 0x43, 0xf2, + 0x09, 0x17, 0x12, 0xe0, 0x00, 0x99, 0x03, 0x98, 0x9d, 0xed, 0x06, 0x0a, + 0x00, 0xf0, 0x22, 0xfc, 0x10, 0xb9, 0x43, 0xf2, 0x0b, 0x17, 0x08, 0xe0, + 0x00, 0x99, 0x03, 0x98, 0x9d, 0xed, 0x05, 0x0a, 0x00, 0xf0, 0x73, 0xfb, + 0x08, 0xb9, 0x43, 0xf2, 0x0a, 0x17, 0x28, 0x78, 0xf8, 0xb1, 0x25, 0x98, + 0x9d, 0xed, 0x06, 0x0a, 0x00, 0xf1, 0x8c, 0x06, 0x08, 0xf1, 0x70, 0x01, + 0x30, 0x46, 0x00, 0xf0, 0x25, 0xfb, 0xb0, 0xee, 0x40, 0x8a, 0x9d, 0xed, + 0x06, 0x0a, 0x08, 0xf1, 0xe0, 0x01, 0x30, 0x46, 0x00, 0xf0, 0x1c, 0xfb, + 0xd9, 0xed, 0x05, 0x0a, 0xb4, 0xee, 0x60, 0x8a, 0xf1, 0xee, 0x10, 0xfa, + 0x59, 0xbf, 0xb4, 0xee, 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x00, 0x20, + 0x28, 0x70, 0x69, 0x78, 0x49, 0x1c, 0x69, 0x70, 0x9d, 0xf8, 0x98, 0x00, + 0x03, 0x28, 0x04, 0xbf, 0x85, 0xf8, 0x07, 0xa0, 0x2c, 0x72, 0x14, 0xb0, + 0x38, 0x46, 0xbd, 0xec, 0x10, 0x8b, 0xbd, 0xe8, 0xfe, 0x8f, 0x00, 0x00, + 0x00, 0x00, 0x7a, 0x44, 0x00, 0x00, 0x00, 0x37, 0x24, 0x8e, 0x00, 0x20, + 0x2c, 0x8e, 0x00, 0x20, 0x5c, 0x77, 0x02, 0x20, 0x96, 0xed, 0x08, 0x1a, + 0x00, 0x99, 0x03, 0x98, 0xdd, 0xed, 0x01, 0x2a, 0x70, 0x47, 0xf0, 0xee, + 0x6c, 0x1a, 0xb0, 0xee, 0x4d, 0x0a, 0xf0, 0xee, 0x6d, 0x0a, 0x70, 0x47, + 0x91, 0xec, 0x02, 0x0a, 0x80, 0xec, 0x02, 0x0a, 0x70, 0x47, 0xf4, 0xee, + 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x70, 0x47, 0xb7, 0xee, 0x00, 0x3a, + 0xb0, 0xee, 0x6f, 0x2a, 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, + 0x00, 0xf0, 0x9f, 0xb9, 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, + 0xf8, 0xf7, 0x9d, 0xba, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, + 0x90, 0xec, 0x02, 0x0a, 0x70, 0x47, 0xb0, 0xee, 0x40, 0x9a, 0xf0, 0xee, + 0x60, 0x9a, 0x70, 0x47, 0xb0, 0xee, 0x4b, 0x1a, 0xf0, 0xee, 0x6b, 0x1a, + 0xf8, 0xf7, 0xb1, 0xba, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, + 0x9b, 0xec, 0x02, 0x0a, 0xf8, 0xf7, 0xa9, 0xba, 0xb0, 0xee, 0x48, 0x1a, + 0xf0, 0xee, 0x68, 0x1a, 0xf8, 0xf7, 0x7d, 0xba, 0xb0, 0xee, 0x40, 0x8a, + 0xf0, 0xee, 0x60, 0x8a, 0x70, 0x47, 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, + 0x68, 0x1a, 0xf8, 0xf7, 0x98, 0xba, 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, + 0x16, 0x46, 0x00, 0xf0, 0x9f, 0xf8, 0x8c, 0x34, 0x32, 0x46, 0x05, 0xf1, + 0x70, 0x01, 0x20, 0x46, 0x00, 0xf0, 0x98, 0xf8, 0x95, 0xf8, 0x78, 0x01, + 0x28, 0xb1, 0x32, 0x46, 0x05, 0xf1, 0xe0, 0x01, 0x20, 0x46, 0x00, 0xf0, + 0x8f, 0xf8, 0x00, 0x20, 0x70, 0xbd, 0x00, 0x20, 0x81, 0xf8, 0x79, 0x01, + 0x70, 0x47, 0x70, 0xb5, 0x0d, 0x46, 0x05, 0xf5, 0xbc, 0x76, 0x04, 0x46, + 0x30, 0x78, 0x08, 0xb9, 0x00, 0xf0, 0x33, 0xf8, 0x00, 0xf0, 0x08, 0xf8, + 0x00, 0x20, 0xb0, 0x71, 0x01, 0x21, 0x70, 0x7a, 0x31, 0x70, 0x40, 0x1c, + 0x70, 0x72, 0x70, 0xbd, 0x05, 0xf1, 0x70, 0x01, 0x04, 0xf1, 0x8c, 0x00, + 0x00, 0xf0, 0x3a, 0xb8, 0x10, 0xb5, 0x0c, 0x46, 0x04, 0xf1, 0x70, 0x01, + 0x8c, 0x30, 0x00, 0xf0, 0x86, 0xfb, 0x04, 0xf5, 0xbf, 0x70, 0x00, 0x21, + 0x02, 0x79, 0x01, 0x70, 0x52, 0x1c, 0x02, 0x71, 0x10, 0xbd, 0x70, 0xb5, + 0x0d, 0x46, 0x04, 0x46, 0x95, 0xf8, 0x78, 0x01, 0x16, 0x46, 0x08, 0xb9, + 0x00, 0xf0, 0x0b, 0xf8, 0x32, 0x46, 0x05, 0xf1, 0x70, 0x01, 0x04, 0xf1, + 0x8c, 0x00, 0x00, 0xf0, 0x51, 0xf8, 0x01, 0x20, 0x85, 0xf8, 0x78, 0x01, + 0x70, 0xbd, 0x70, 0x22, 0x05, 0xf1, 0x70, 0x01, 0x05, 0xf1, 0xe0, 0x00, + 0xbe, 0xf7, 0xe6, 0xbe, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0xbf, + 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0x3f, + 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0xbf, + 0x7f, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x00, 0xf0, 0x24, 0xf8, 0x06, 0x26, + 0x00, 0xf0, 0x27, 0xf8, 0x04, 0xf1, 0x18, 0x00, 0xf8, 0xf7, 0x82, 0xfc, + 0x05, 0xf1, 0x54, 0x01, 0x01, 0x20, 0x02, 0x91, 0x01, 0x90, 0x00, 0xf0, + 0x1c, 0xf8, 0x05, 0xf1, 0x54, 0x00, 0xf8, 0xf7, 0x77, 0xfc, 0x54, 0x21, + 0x28, 0x46, 0xd0, 0xf7, 0xd5, 0xfc, 0x05, 0xf1, 0x54, 0x02, 0x06, 0x21, + 0x28, 0x46, 0xf8, 0xf7, 0xe6, 0xfc, 0x00, 0xf0, 0x06, 0xf8, 0x00, 0xf0, + 0x0a, 0xf8, 0x20, 0x46, 0xf8, 0xf7, 0x66, 0xfc, 0x7f, 0xbd, 0x05, 0xf1, + 0x54, 0x00, 0x01, 0x21, 0x02, 0x90, 0x01, 0x91, 0x70, 0x47, 0x00, 0x96, + 0x04, 0xf1, 0x48, 0x03, 0x01, 0x22, 0x06, 0x21, 0x70, 0x47, 0x00, 0x00, + 0x70, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x8a, 0xb0, 0x04, 0x46, 0x0d, 0x46, + 0x16, 0x46, 0x00, 0xf0, 0x18, 0xf9, 0x20, 0xee, 0x00, 0x8a, 0x00, 0xee, + 0xa0, 0x8a, 0x94, 0xed, 0x18, 0x0a, 0xb4, 0xee, 0x40, 0x8a, 0xf1, 0xee, + 0x10, 0xfa, 0x00, 0xee, 0x10, 0x6a, 0x48, 0xbf, 0x94, 0xed, 0x19, 0x8a, + 0xb8, 0xee, 0x40, 0x0a, 0x03, 0xab, 0x20, 0xee, 0x08, 0x0a, 0x01, 0x22, + 0x06, 0x21, 0x04, 0xf1, 0x30, 0x00, 0xf8, 0xf7, 0x23, 0xfc, 0x00, 0xf0, + 0x26, 0xf8, 0x00, 0xf0, 0x24, 0xf8, 0x03, 0xaa, 0x06, 0x21, 0x28, 0x46, + 0xf8, 0xf7, 0xa5, 0xfc, 0x9f, 0xed, 0xe2, 0x0a, 0xb4, 0xee, 0x40, 0x8a, + 0xf1, 0xee, 0x10, 0xfa, 0xb8, 0xbf, 0xb7, 0xee, 0x00, 0x8a, 0x03, 0xab, + 0xb0, 0xee, 0x48, 0x0a, 0x01, 0x22, 0x06, 0x21, 0x04, 0xf1, 0x18, 0x00, + 0xf8, 0xf7, 0x08, 0xfc, 0x00, 0xf0, 0x0b, 0xf8, 0x00, 0xf0, 0x09, 0xf8, + 0x03, 0xaa, 0x06, 0x21, 0x28, 0x46, 0xf8, 0xf7, 0xa1, 0xfc, 0x0a, 0xb0, + 0xbd, 0xec, 0x02, 0x8b, 0x70, 0xbd, 0x01, 0x21, 0x06, 0x22, 0x03, 0xa8, + 0x01, 0x91, 0x00, 0x92, 0x02, 0x90, 0x04, 0xf1, 0x48, 0x03, 0x01, 0x22, + 0x06, 0x21, 0xf8, 0xf7, 0x01, 0xbc, 0x2d, 0xe9, 0xf0, 0x41, 0x2d, 0xed, + 0x06, 0x8b, 0xb0, 0xee, 0x40, 0x8a, 0xb0, 0xee, 0x41, 0x9a, 0x8a, 0xb0, + 0x05, 0x46, 0xf0, 0xee, 0x60, 0x8a, 0xb0, 0xee, 0x61, 0xaa, 0xf0, 0xee, + 0x42, 0x9a, 0x16, 0x46, 0xb0, 0xee, 0x49, 0x0a, 0xf8, 0xf7, 0xb4, 0xf9, + 0x00, 0xf0, 0x16, 0xfa, 0x03, 0xa8, 0xe1, 0x4c, 0x80, 0xec, 0x02, 0x0a, + 0x29, 0xee, 0x0a, 0x0a, 0xf8, 0xf7, 0xaa, 0xf9, 0x94, 0xec, 0x02, 0x1a, + 0xf8, 0xf7, 0x53, 0xf9, 0x05, 0xa8, 0x00, 0x27, 0x80, 0xec, 0x02, 0x0a, + 0x29, 0xee, 0x29, 0x0a, 0xf8, 0xf7, 0x9e, 0xf9, 0x94, 0xec, 0x02, 0x1a, + 0xf8, 0xf7, 0x47, 0xf9, 0x07, 0xa8, 0x0d, 0xf1, 0x0c, 0x08, 0x80, 0xec, + 0x02, 0x0a, 0x08, 0xeb, 0xc7, 0x00, 0x06, 0xeb, 0xc7, 0x04, 0x90, 0xec, + 0x02, 0x0a, 0xc0, 0x46, 0xc0, 0x46, 0x08, 0xeb, 0xc7, 0x00, 0x84, 0xed, + 0x00, 0x0a, 0x08, 0xeb, 0xc7, 0x01, 0x90, 0xec, 0x02, 0x0a, 0xb1, 0xee, + 0x60, 0x0a, 0x84, 0xed, 0x01, 0x0a, 0x7f, 0x1c, 0x91, 0xec, 0x02, 0x0a, + 0xc4, 0xed, 0x06, 0x0a, 0x90, 0xec, 0x02, 0x0a, 0xc0, 0x46, 0xc0, 0x46, + 0x03, 0x2f, 0x84, 0xed, 0x07, 0x0a, 0xde, 0xd3, 0x01, 0x20, 0x01, 0x90, + 0x06, 0x21, 0x00, 0x91, 0x02, 0x96, 0x05, 0xf1, 0x48, 0x03, 0x01, 0x22, + 0x30, 0x46, 0xf8, 0xf7, 0xc3, 0xfb, 0x01, 0x21, 0x06, 0x22, 0x06, 0xf1, + 0x18, 0x00, 0x01, 0x91, 0x00, 0x92, 0x02, 0x90, 0x05, 0xf1, 0x48, 0x03, + 0x01, 0x22, 0x06, 0x21, 0xf8, 0xf7, 0xb6, 0xfb, 0x0a, 0xb0, 0xbd, 0xec, + 0x06, 0x8b, 0xbd, 0xe8, 0xf0, 0x81, 0x38, 0xb5, 0x2d, 0xed, 0x04, 0x8b, + 0x05, 0x46, 0x98, 0xb0, 0xab, 0x6f, 0x04, 0x93, 0xb0, 0xee, 0x41, 0x8a, + 0xf0, 0xee, 0x61, 0x8a, 0xf0, 0xee, 0x42, 0x9a, 0x0c, 0x46, 0xb0, 0xee, + 0x62, 0x9a, 0xb0, 0xee, 0x43, 0x1a, 0xf0, 0xee, 0x63, 0x1a, 0xb0, 0xee, + 0x44, 0x2a, 0x0b, 0xaa, 0xff, 0xf7, 0x75, 0xff, 0x05, 0xab, 0x01, 0x20, + 0x06, 0x21, 0x02, 0x93, 0x01, 0x90, 0x00, 0x91, 0x04, 0xf1, 0x54, 0x03, + 0x06, 0x22, 0x02, 0x21, 0x0b, 0xa8, 0xf8, 0xf7, 0xc1, 0xfc, 0x9d, 0xed, + 0x05, 0x0a, 0x38, 0xee, 0x40, 0x0a, 0x05, 0xa8, 0x8d, 0xed, 0x05, 0x0a, + 0x00, 0x22, 0x90, 0xed, 0x01, 0x0a, 0x38, 0xee, 0xc0, 0x0a, 0x80, 0xed, + 0x01, 0x0a, 0xb6, 0xee, 0x00, 0x0a, 0xd5, 0xed, 0x1c, 0x0a, 0x08, 0x92, + 0x40, 0xee, 0x89, 0x9a, 0x29, 0xee, 0x80, 0x0a, 0x8d, 0xed, 0x07, 0x0a, + 0x09, 0x92, 0x02, 0x20, 0x07, 0x99, 0x06, 0x22, 0x04, 0xab, 0x0a, 0x91, + 0x03, 0x90, 0x02, 0x92, 0x01, 0x93, 0x00, 0x94, 0x04, 0xf1, 0x54, 0x03, + 0x95, 0xed, 0x1d, 0x0a, 0x07, 0xaa, 0x0b, 0xa9, 0x05, 0xa8, 0xf8, 0xf7, + 0xe5, 0xf9, 0x04, 0x99, 0xe1, 0x66, 0x18, 0xb0, 0xbd, 0xec, 0x04, 0x8b, + 0x32, 0xbd, 0x10, 0xb5, 0x0c, 0x46, 0x90, 0xed, 0x12, 0x0a, 0xf8, 0xf7, + 0xf9, 0xf8, 0x04, 0xf1, 0x54, 0x00, 0x00, 0xf0, 0xc9, 0xf8, 0xbd, 0xe8, + 0x10, 0x40, 0xf8, 0xf7, 0xd7, 0xb8, 0x38, 0xb5, 0x2d, 0xed, 0x06, 0x8b, + 0x04, 0x46, 0xb0, 0xee, 0x40, 0xaa, 0x0d, 0x46, 0x94, 0xed, 0x14, 0x0a, + 0xf8, 0xf7, 0xe6, 0xf8, 0x05, 0xf1, 0x5c, 0x00, 0x00, 0xf0, 0x28, 0xf8, + 0x00, 0xf0, 0x4a, 0xf9, 0x94, 0xed, 0x16, 0x0a, 0xf8, 0xf7, 0xdc, 0xf8, + 0x05, 0xf1, 0x64, 0x00, 0x00, 0xf0, 0x1e, 0xf8, 0x00, 0xf0, 0x4c, 0xf8, + 0xb0, 0xee, 0x4a, 0x0a, 0xf8, 0xf7, 0xd2, 0xf8, 0xb0, 0xee, 0x40, 0x1a, + 0xf0, 0xee, 0x60, 0x1a, 0xb0, 0xee, 0x49, 0x0a, 0xf0, 0xee, 0x69, 0x0a, + 0xf8, 0xf7, 0x9b, 0xf8, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, + 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, 0xbd, 0xec, 0x06, 0x8b, + 0xbd, 0xe8, 0x31, 0x40, 0xf8, 0xf7, 0x67, 0xb8, 0xb0, 0xee, 0x40, 0x1a, + 0xf0, 0xee, 0x60, 0x1a, 0x90, 0xec, 0x02, 0x0a, 0xf8, 0xf7, 0x98, 0xb8, + 0x38, 0xb5, 0x2d, 0xed, 0x04, 0x8b, 0x00, 0xf0, 0xc3, 0xf8, 0x00, 0xf0, + 0x21, 0xf8, 0x29, 0xee, 0x09, 0x0a, 0x09, 0xee, 0xa9, 0x0a, 0xd4, 0xed, + 0x18, 0x0a, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x0f, 0xd5, + 0xb0, 0xee, 0x48, 0x0a, 0x29, 0x46, 0x20, 0x46, 0xff, 0xf7, 0xa9, 0xff, + 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, 0xbd, 0xec, 0x04, 0x8b, + 0xbd, 0xe8, 0x31, 0x40, 0xf8, 0xf7, 0x76, 0xb8, 0x50, 0x48, 0xbd, 0xec, + 0x04, 0x8b, 0x90, 0xec, 0x02, 0x0a, 0x31, 0xbd, 0xb0, 0xee, 0x40, 0x9a, + 0xf0, 0xee, 0x60, 0x9a, 0x70, 0x47, 0x00, 0x00, 0x38, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x2d, 0xed, 0x02, 0x8b, 0x00, 0x23, 0x00, 0x22, 0x06, 0x21, + 0x28, 0x46, 0xf8, 0xf7, 0x61, 0xfb, 0xd4, 0xed, 0x12, 0x0a, 0x60, 0xee, + 0xa0, 0x0a, 0x80, 0xee, 0x20, 0x8a, 0x01, 0x23, 0x01, 0x22, 0x06, 0x21, + 0x28, 0x46, 0xf8, 0xf7, 0x55, 0xfb, 0xd4, 0xed, 0x13, 0x0a, 0x60, 0xee, + 0xa0, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0x30, 0xee, 0x08, 0x0a, 0x9f, 0xed, + 0x37, 0x1a, 0xb4, 0xee, 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xbd, 0xec, + 0x02, 0x8b, 0xb8, 0xbf, 0x9f, 0xed, 0x33, 0x0a, 0x31, 0xbd, 0x38, 0xb5, + 0x2d, 0xed, 0x02, 0x8b, 0x92, 0xb0, 0x04, 0x46, 0x0d, 0x46, 0xb0, 0xee, + 0x40, 0x8a, 0xff, 0xf7, 0x9d, 0xff, 0x31, 0x48, 0x00, 0xf0, 0x20, 0xf8, + 0xf8, 0xf7, 0x1d, 0xf8, 0x05, 0xaa, 0xb0, 0xee, 0x48, 0x2a, 0xf7, 0xee, + 0x00, 0x1a, 0xb7, 0xee, 0x00, 0x1a, 0x29, 0x46, 0x20, 0x46, 0xff, 0xf7, + 0x76, 0xfe, 0x02, 0x20, 0x00, 0x90, 0x06, 0x23, 0x01, 0xaa, 0x29, 0x46, + 0x05, 0xa8, 0xf8, 0xf7, 0x09, 0xf9, 0x9d, 0xed, 0x01, 0x0a, 0xdd, 0xed, + 0x04, 0x0a, 0x12, 0xb0, 0x30, 0xee, 0x20, 0x0a, 0x34, 0xe0, 0x00, 0x00, + 0x01, 0x00, 0x80, 0x3f, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, + 0x90, 0xec, 0x02, 0x0a, 0x70, 0x47, 0x00, 0x00, 0x38, 0xb5, 0x2d, 0xed, + 0x02, 0x8b, 0x00, 0xf0, 0x35, 0xf8, 0x60, 0xee, 0x00, 0x8a, 0x40, 0xee, + 0xa0, 0x8a, 0x29, 0x46, 0x20, 0x46, 0xff, 0xf7, 0x93, 0xff, 0xd4, 0xed, + 0x1a, 0x0a, 0x68, 0xee, 0xa0, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x11, 0xd5, 0xb0, 0xee, 0x48, 0x0a, 0x29, 0x46, 0x20, 0x46, + 0xff, 0xf7, 0xaf, 0xff, 0x80, 0xee, 0x28, 0x0a, 0xdf, 0xed, 0x09, 0x0a, + 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x04, 0xda, 0x9f, 0xed, + 0x07, 0x0a, 0x01, 0xe0, 0x94, 0xed, 0x1b, 0x0a, 0xbd, 0xec, 0x02, 0x8b, + 0x31, 0xbd, 0x00, 0x00, 0x00, 0xe7, 0xdb, 0x2e, 0xff, 0xe6, 0xdb, 0x2e, + 0x7e, 0x1d, 0x90, 0x26, 0x7d, 0x1d, 0x90, 0x26, 0x64, 0x77, 0x02, 0x20, + 0x44, 0x8e, 0x00, 0x20, 0x04, 0x46, 0x0d, 0x46, 0xb0, 0xee, 0x40, 0x8a, + 0xe5, 0xe6, 0x38, 0xb5, 0x2d, 0xed, 0x06, 0x8b, 0x04, 0x46, 0x0d, 0x46, + 0xb0, 0xee, 0x40, 0xaa, 0xff, 0xf7, 0xdd, 0xfe, 0x00, 0xf0, 0x44, 0xf8, + 0x29, 0x46, 0x20, 0x46, 0xff, 0xf7, 0x52, 0xff, 0xf0, 0xee, 0x40, 0xaa, + 0x94, 0xed, 0x1f, 0x0a, 0x20, 0xee, 0x00, 0x9a, 0x94, 0xed, 0x20, 0x0a, + 0x60, 0xee, 0x00, 0x9a, 0xb0, 0xee, 0x4a, 0x0a, 0xf7, 0xf7, 0xc8, 0xff, + 0x00, 0xf0, 0x2a, 0xf8, 0xb6, 0xee, 0x00, 0x1a, 0x2a, 0xee, 0x81, 0x1a, + 0x6a, 0xee, 0x0a, 0x1a, 0x21, 0xee, 0x21, 0x1a, 0x60, 0xee, 0x00, 0x1a, + 0x40, 0xee, 0xa0, 0x1a, 0xf4, 0xee, 0x49, 0x1a, 0xf1, 0xee, 0x10, 0xfa, + 0xa2, 0xbf, 0xf4, 0xee, 0x61, 0x9a, 0xf1, 0xee, 0x10, 0xfa, 0x01, 0x20, + 0x0f, 0xda, 0xf4, 0xee, 0x49, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x94, 0xed, + 0x21, 0x2a, 0x4c, 0xbf, 0xd4, 0xed, 0x1f, 0x1a, 0xd4, 0xed, 0x20, 0x1a, + 0xbd, 0xec, 0x06, 0x8b, 0xbd, 0xe8, 0x31, 0x40, 0x0d, 0xe0, 0xbd, 0xec, + 0x06, 0x8b, 0x32, 0xbd, 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, + 0xf7, 0xf7, 0x69, 0xbf, 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, 0x60, 0x8a, + 0x70, 0x47, 0x80, 0xb5, 0x2d, 0xed, 0x08, 0x8b, 0xff, 0xf7, 0xf6, 0xff, + 0xb0, 0xee, 0x41, 0xaa, 0xb0, 0xee, 0x61, 0xba, 0xf0, 0xee, 0x42, 0xaa, + 0xf8, 0xf7, 0x14, 0xf9, 0xf7, 0xf7, 0x7b, 0xff, 0xf7, 0xf7, 0x88, 0xff, + 0xff, 0xf7, 0xf4, 0xfe, 0xb0, 0xee, 0x4b, 0x0a, 0xf7, 0xf7, 0x7a, 0xff, + 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, 0xf7, 0xf7, 0x47, 0xff, + 0xff, 0xf7, 0xe8, 0xfe, 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, + 0xf7, 0xf7, 0x2c, 0xff, 0xc0, 0x46, 0xc0, 0x46, 0xb0, 0xee, 0x40, 0xba, + 0x00, 0xf0, 0x1c, 0xf8, 0xc0, 0x46, 0xc0, 0x46, 0x2b, 0xee, 0x00, 0xba, + 0x00, 0xf0, 0x16, 0xf8, 0xb0, 0xee, 0x60, 0x0a, 0xf0, 0xee, 0x40, 0xba, + 0x00, 0xf0, 0x10, 0xf8, 0xb0, 0xee, 0x60, 0x0a, 0x0b, 0xee, 0x80, 0xba, + 0x8b, 0xee, 0x0a, 0x0a, 0xf4, 0xee, 0x40, 0xaa, 0xf1, 0xee, 0x10, 0xfa, + 0xbd, 0xec, 0x08, 0x8b, 0xac, 0xbf, 0x01, 0x20, 0x00, 0x20, 0x02, 0xbd, + 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, 0xb0, 0xee, 0x49, 0x0a, + 0xf0, 0xee, 0x69, 0x0a, 0xf7, 0xf7, 0x00, 0xbf, 0x2d, 0xe9, 0xf0, 0x41, + 0x2d, 0xed, 0x02, 0x8b, 0x04, 0x46, 0x88, 0x46, 0xb0, 0xee, 0x40, 0x8a, + 0x06, 0x21, 0x08, 0xf1, 0x54, 0x00, 0x00, 0xf0, 0x47, 0xf8, 0x05, 0x46, + 0x15, 0x21, 0x40, 0x46, 0x00, 0xf0, 0x42, 0xf8, 0x07, 0x46, 0xb0, 0xee, + 0x48, 0x0a, 0x41, 0x46, 0x20, 0x46, 0xff, 0xf7, 0xce, 0xfe, 0xf0, 0xee, + 0x40, 0x8a, 0xb0, 0xee, 0x48, 0x0a, 0x41, 0x46, 0x20, 0x46, 0xff, 0xf7, + 0x2e, 0xfe, 0x01, 0x26, 0x20, 0xee, 0x00, 0x0a, 0x01, 0x2d, 0x00, 0xee, + 0xa0, 0x0a, 0x14, 0xbf, 0x01, 0x2f, 0x00, 0x26, 0xf5, 0xee, 0x40, 0x8a, + 0xf1, 0xee, 0x10, 0xfa, 0xd4, 0xed, 0x22, 0x0a, 0x48, 0xbf, 0x00, 0x26, + 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, 0x00, 0x26, + 0xbd, 0xec, 0x02, 0x8b, 0x30, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x10, 0xb5, + 0x2d, 0xed, 0x02, 0x8b, 0x0c, 0x46, 0xb0, 0xee, 0x40, 0x8a, 0x01, 0x22, + 0x06, 0x21, 0x04, 0xf1, 0x54, 0x00, 0xf8, 0xf7, 0x1c, 0xf9, 0x28, 0xee, + 0x08, 0x0a, 0xbd, 0xec, 0x02, 0x8b, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, + 0x01, 0x22, 0x15, 0x21, 0xf8, 0xf7, 0x11, 0xb9, 0x30, 0xb5, 0x04, 0x46, + 0x00, 0x20, 0x00, 0x25, 0x00, 0xe0, 0x6d, 0x1c, 0x8d, 0x42, 0x08, 0xd2, + 0x54, 0xf8, 0x25, 0x30, 0x5b, 0x00, 0x1a, 0x16, 0x52, 0x1c, 0xf6, 0xd1, + 0x1b, 0x02, 0xf4, 0xd0, 0x01, 0x20, 0x30, 0xbd, 0x10, 0xb5, 0x1c, 0x46, + 0x70, 0x21, 0x20, 0x46, 0xd0, 0xf7, 0x6e, 0xf9, 0x20, 0x46, 0xe6, 0xf7, + 0x27, 0xff, 0x00, 0x20, 0x10, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, 0x06, 0x9f, + 0xdd, 0xf8, 0x1c, 0x80, 0x0c, 0x46, 0x15, 0x46, 0x1e, 0x46, 0xd6, 0xf7, + 0x31, 0xfb, 0xe8, 0x60, 0x41, 0x46, 0x01, 0x20, 0x28, 0x71, 0x38, 0x46, + 0x22, 0x6a, 0xff, 0xf7, 0xf8, 0xfb, 0x00, 0x20, 0xb0, 0x66, 0xf0, 0x66, + 0xbd, 0xe8, 0xf0, 0x81, 0x2d, 0xe9, 0xf2, 0x4f, 0x2d, 0xed, 0x04, 0x8b, + 0x15, 0x46, 0x88, 0xb0, 0x81, 0x46, 0x1f, 0x46, 0x05, 0xf1, 0x30, 0x02, + 0x44, 0x31, 0x00, 0xf0, 0x6b, 0xfc, 0x05, 0xf1, 0xf8, 0x00, 0x00, 0x21, + 0x01, 0x80, 0x00, 0x20, 0x38, 0x60, 0x78, 0x60, 0x48, 0x46, 0xcc, 0xf7, + 0x24, 0xfa, 0x38, 0x75, 0x00, 0x21, 0x00, 0x20, 0xb8, 0x63, 0xf9, 0x63, + 0x38, 0x64, 0xb9, 0x64, 0x07, 0xf1, 0x4c, 0x00, 0x00, 0x22, 0x42, 0x60, + 0x00, 0x20, 0x07, 0xf1, 0x4c, 0x02, 0x91, 0x60, 0x07, 0xf1, 0x4c, 0x01, + 0x00, 0x22, 0x08, 0x61, 0x00, 0x21, 0x07, 0xf1, 0x4c, 0x00, 0xc2, 0x60, + 0x07, 0xf1, 0x4c, 0x02, 0x00, 0x20, 0x51, 0x61, 0x07, 0xf1, 0x4c, 0x01, + 0x88, 0x61, 0x48, 0x46, 0x18, 0x99, 0xbf, 0xf7, 0x0d, 0xfb, 0x04, 0x46, + 0xd6, 0xf7, 0xe8, 0xfa, 0xa8, 0x60, 0xbc, 0xb9, 0x01, 0x46, 0xe8, 0x68, + 0xd6, 0xf7, 0x26, 0xfb, 0x83, 0x46, 0x0c, 0x98, 0x41, 0x6a, 0x16, 0x98, + 0x8b, 0x45, 0x88, 0xbf, 0x8b, 0x46, 0x17, 0x99, 0x5a, 0x46, 0xff, 0xf7, + 0xa6, 0xfb, 0x04, 0x46, 0x0c, 0x98, 0x81, 0x6a, 0x59, 0x45, 0x03, 0xd2, + 0x17, 0x99, 0x16, 0x98, 0xff, 0xf7, 0xb9, 0xfb, 0x17, 0x99, 0x16, 0x98, + 0xff, 0xf7, 0xb1, 0xfb, 0xa8, 0x68, 0xe8, 0x60, 0x00, 0x21, 0xa9, 0x62, + 0x29, 0x61, 0xe9, 0x61, 0x29, 0x62, 0x00, 0x20, 0x05, 0xf5, 0x80, 0x72, + 0xe8, 0x62, 0x68, 0x61, 0xa8, 0x61, 0x68, 0x62, 0x01, 0x21, 0x11, 0x64, + 0x05, 0xf5, 0xa2, 0x72, 0x05, 0xf5, 0xa2, 0x71, 0x85, 0xf8, 0x44, 0x01, + 0x88, 0x80, 0x50, 0x80, 0x00, 0x22, 0x05, 0xf5, 0xa2, 0x70, 0x82, 0x60, + 0x48, 0x46, 0x00, 0xf0, 0x27, 0xff, 0x68, 0x70, 0x48, 0x46, 0x00, 0xf0, + 0xd7, 0xfd, 0xa8, 0x70, 0xe8, 0x70, 0x1c, 0xb9, 0x48, 0x46, 0x00, 0xf0, + 0x26, 0xff, 0x04, 0x46, 0x17, 0x98, 0x00, 0xf5, 0xbd, 0x71, 0x06, 0x91, + 0x9f, 0xed, 0x2e, 0x8a, 0xdf, 0xed, 0x2e, 0x8a, 0x2e, 0xe0, 0x0c, 0x99, + 0x28, 0x6a, 0x8a, 0x6e, 0x90, 0x42, 0x26, 0xd2, 0x43, 0xf2, 0x0b, 0x11, + 0x8c, 0x42, 0x22, 0xd1, 0x40, 0x1c, 0x28, 0x62, 0x07, 0xf1, 0x4c, 0x00, + 0x41, 0x69, 0x49, 0x1c, 0x41, 0x61, 0x01, 0x6a, 0x49, 0x1c, 0x01, 0x62, + 0x12, 0xe0, 0x0c, 0x99, 0xa8, 0x69, 0x0a, 0x6e, 0x90, 0x42, 0xe6, 0xd2, + 0x43, 0xf2, 0x0a, 0x11, 0x8c, 0x42, 0xe2, 0xd1, 0x40, 0x1c, 0xa8, 0x61, + 0x07, 0xf1, 0x4c, 0x00, 0xc1, 0x68, 0x49, 0x1c, 0xc1, 0x60, 0xc1, 0x69, + 0x49, 0x1c, 0xc1, 0x61, 0x17, 0x99, 0x16, 0x98, 0xfe, 0xf7, 0xca, 0xfe, + 0x00, 0x24, 0x48, 0x46, 0x01, 0xf0, 0x08, 0xf9, 0xe6, 0xf7, 0x6a, 0xfe, + 0x00, 0x28, 0x08, 0xbf, 0x00, 0x2c, 0x40, 0xf0, 0xdf, 0x82, 0xd6, 0xf7, + 0x5f, 0xfa, 0x04, 0x46, 0xe8, 0x68, 0x21, 0x46, 0xd6, 0xf7, 0x9e, 0xfa, + 0xec, 0x60, 0x0c, 0x99, 0x4a, 0x6a, 0x17, 0x99, 0x90, 0x42, 0x88, 0xbf, + 0x10, 0x46, 0x02, 0x46, 0x16, 0x98, 0xff, 0xf7, 0x1e, 0xfb, 0x04, 0x46, + 0x48, 0x46, 0x00, 0xf0, 0x7b, 0xfd, 0x28, 0x70, 0x00, 0x2c, 0x78, 0x75, + 0x40, 0xf0, 0x7d, 0x82, 0x2e, 0x78, 0x30, 0x00, 0x0a, 0xd1, 0x00, 0x20, + 0x78, 0x62, 0x9f, 0xed, 0x03, 0x0a, 0x23, 0xe0, 0x0a, 0xd7, 0x23, 0x3c, + 0xa4, 0x70, 0x7d, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x99, 0x16, 0x98, + 0x33, 0x46, 0x03, 0x22, 0xfe, 0xf7, 0x08, 0xff, 0xb0, 0xee, 0x40, 0x9a, + 0x87, 0xed, 0x09, 0x9a, 0xbe, 0xf7, 0xd6, 0xfc, 0xfa, 0xee, 0x04, 0x0a, + 0x20, 0xee, 0x20, 0x0a, 0xbe, 0xf7, 0x78, 0xfb, 0x0c, 0x98, 0xd0, 0xed, + 0x00, 0x0a, 0xf4, 0xee, 0x49, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xbc, 0xee, + 0xc0, 0x0a, 0x4c, 0xbf, 0x01, 0x20, 0x00, 0x20, 0x00, 0x28, 0x87, 0xed, + 0x02, 0x0a, 0x00, 0xf0, 0x0b, 0x82, 0x95, 0xf8, 0x44, 0x11, 0x8e, 0x42, + 0x0f, 0xd1, 0x05, 0xf5, 0x80, 0x70, 0x01, 0x6c, 0x01, 0x29, 0x0a, 0xd0, + 0x05, 0xf5, 0xa2, 0x71, 0xb1, 0xf9, 0x02, 0x20, 0xad, 0xf8, 0x12, 0x20, + 0xb1, 0xf9, 0x04, 0x10, 0xad, 0xf8, 0x10, 0x10, 0x30, 0xe0, 0x28, 0x79, + 0x48, 0xb1, 0x0c, 0x98, 0x90, 0xed, 0x01, 0x0a, 0xb4, 0xee, 0x40, 0x9a, + 0xf1, 0xee, 0x10, 0xfa, 0x58, 0xbf, 0x00, 0x22, 0x02, 0xd5, 0x00, 0x20, + 0x03, 0x22, 0x28, 0x71, 0x00, 0x21, 0x01, 0x20, 0x03, 0x91, 0x02, 0x90, + 0x04, 0xab, 0x01, 0x93, 0x0d, 0xf1, 0x12, 0x04, 0x17, 0x99, 0x16, 0x98, + 0x00, 0x94, 0x33, 0x46, 0xfe, 0xf7, 0x16, 0xff, 0x04, 0x46, 0xbd, 0xf8, + 0x12, 0x00, 0x38, 0x83, 0x05, 0xf5, 0x80, 0x72, 0xbd, 0xf8, 0x10, 0x10, + 0x79, 0x83, 0x00, 0x20, 0x10, 0x64, 0x05, 0xf5, 0xa2, 0x70, 0xbd, 0xf8, + 0x12, 0x10, 0x41, 0x80, 0xbd, 0xf8, 0x10, 0x20, 0x82, 0x80, 0x06, 0x70, + 0x00, 0xf0, 0x1d, 0xfb, 0x31, 0x46, 0x48, 0x46, 0xd9, 0xf7, 0x6c, 0xfa, + 0x0c, 0x9e, 0x4f, 0xf0, 0x00, 0x08, 0x08, 0xe0, 0x00, 0xf0, 0x13, 0xfb, + 0x5f, 0xfa, 0x88, 0xf1, 0x48, 0x46, 0xd9, 0xf7, 0x61, 0xfa, 0x08, 0xf1, + 0x01, 0x08, 0xb1, 0x7c, 0x5f, 0xfa, 0x88, 0xf0, 0x88, 0x42, 0xf1, 0xd3, + 0x00, 0x2c, 0x0c, 0x96, 0x40, 0xf0, 0xaa, 0x81, 0xb1, 0x68, 0x0c, 0x98, + 0x02, 0x91, 0x05, 0xf5, 0xa2, 0x78, 0xc1, 0x68, 0x0c, 0x98, 0x03, 0x91, + 0x90, 0xf8, 0x10, 0xb0, 0x46, 0x7c, 0xd8, 0xf8, 0x08, 0x00, 0xa6, 0xeb, + 0x0b, 0x06, 0x01, 0x24, 0x76, 0x1c, 0x04, 0xfa, 0x06, 0xf6, 0x41, 0x1c, + 0xb1, 0xfb, 0xf6, 0xf2, 0x06, 0xfb, 0x12, 0x16, 0x70, 0x40, 0xdf, 0xf7, + 0x23, 0xf8, 0x00, 0x21, 0x58, 0x44, 0x04, 0xfa, 0x00, 0xfa, 0x48, 0x46, + 0xc8, 0xf8, 0x08, 0x60, 0x8d, 0xf8, 0x04, 0x10, 0x00, 0x91, 0x01, 0x26, + 0x02, 0x99, 0x00, 0xf0, 0xc7, 0xfc, 0x05, 0x90, 0x88, 0xb1, 0x00, 0x26, + 0x43, 0xf2, 0x02, 0x14, 0xcd, 0xf8, 0x1c, 0xa0, 0xcd, 0xf8, 0x10, 0x90, + 0x02, 0x95, 0x9d, 0xf8, 0x04, 0xb0, 0x9d, 0xf8, 0x03, 0xa0, 0x9d, 0xf8, + 0x02, 0x80, 0x4f, 0xf0, 0x00, 0x09, 0x01, 0x25, 0x60, 0xe0, 0x29, 0x78, + 0x48, 0x46, 0x00, 0xf0, 0xa5, 0xfc, 0x0c, 0x98, 0x00, 0xf1, 0x50, 0x01, + 0x05, 0xf1, 0xf8, 0x02, 0x48, 0x46, 0x00, 0xf0, 0xaf, 0xfc, 0x04, 0x00, + 0x14, 0xbf, 0x00, 0x26, 0x8d, 0xf8, 0x01, 0x60, 0xde, 0xe7, 0x01, 0x98, + 0x24, 0x21, 0xcf, 0xf7, 0x8f, 0xff, 0x40, 0xe0, 0x2e, 0x42, 0x4f, 0xd0, + 0x07, 0x99, 0x89, 0x45, 0x4c, 0xd2, 0x09, 0xf1, 0x01, 0x09, 0x66, 0xb1, + 0x02, 0x98, 0x00, 0x21, 0x30, 0x30, 0x00, 0xf0, 0x8e, 0xfb, 0x04, 0x00, + 0x4f, 0xf0, 0x00, 0x0a, 0x0c, 0xbf, 0x4f, 0xf0, 0x01, 0x0b, 0x00, 0x26, + 0xd0, 0x46, 0x5f, 0xea, 0x0b, 0x00, 0x10, 0xd0, 0x03, 0x99, 0x04, 0x98, + 0x00, 0xf0, 0x94, 0xfb, 0x02, 0x28, 0x08, 0xbf, 0x00, 0x26, 0x08, 0xd0, + 0x01, 0x28, 0x04, 0xd1, 0x00, 0x26, 0x24, 0xb9, 0x43, 0xf2, 0x03, 0x14, + 0x01, 0xe0, 0x4f, 0xf0, 0x01, 0x0a, 0x16, 0xea, 0x0a, 0x0f, 0xce, 0xd0, + 0x02, 0x98, 0x01, 0x99, 0x30, 0x30, 0x00, 0xf0, 0x83, 0xfb, 0x01, 0x46, + 0x03, 0x29, 0x03, 0xd1, 0x00, 0x26, 0x43, 0xf2, 0x04, 0x14, 0x08, 0xe0, + 0x02, 0x9a, 0xd2, 0xf8, 0x00, 0x01, 0x08, 0xb1, 0x4f, 0xf0, 0x01, 0x08, + 0x01, 0x29, 0x08, 0xbf, 0x00, 0x25, 0x16, 0xea, 0x08, 0x0f, 0x05, 0xd0, + 0x04, 0x98, 0x00, 0xf0, 0xed, 0xfc, 0x01, 0x28, 0x08, 0xbf, 0x00, 0x25, + 0x02, 0x98, 0x00, 0xf1, 0xfc, 0x01, 0x01, 0x91, 0xe6, 0xf7, 0x14, 0xfd, + 0x00, 0x28, 0xad, 0xd0, 0xdd, 0xf8, 0x10, 0x90, 0x02, 0x9d, 0x9d, 0xf8, + 0x01, 0x00, 0x68, 0xb1, 0x00, 0x21, 0x48, 0x46, 0x00, 0xf0, 0xda, 0xfc, + 0x01, 0x28, 0x04, 0xd1, 0x00, 0x26, 0x2c, 0xb9, 0x43, 0xf2, 0x05, 0x14, + 0x02, 0xe0, 0x01, 0x20, 0x8d, 0xf8, 0x00, 0x00, 0x05, 0xf5, 0x80, 0x7b, + 0x9d, 0xf8, 0x00, 0x10, 0x0e, 0x42, 0x15, 0xd0, 0x0c, 0x98, 0x00, 0xf1, + 0x50, 0x01, 0x05, 0xf5, 0x90, 0x72, 0x48, 0x46, 0x00, 0xf0, 0xc4, 0xfc, + 0x01, 0x28, 0x03, 0xd1, 0x00, 0x26, 0x43, 0xf2, 0x05, 0x14, 0x0c, 0xe0, + 0xdb, 0xf8, 0x2c, 0x00, 0x08, 0xb9, 0x00, 0x26, 0x07, 0xe0, 0x4f, 0xf0, + 0x01, 0x0a, 0x06, 0xe0, 0x20, 0x21, 0x05, 0xf5, 0x90, 0x70, 0xcf, 0xf7, + 0x07, 0xff, 0x4f, 0xf0, 0x00, 0x0a, 0x05, 0x98, 0x30, 0xb9, 0x48, 0x46, + 0x00, 0xf0, 0x12, 0xfc, 0x10, 0xb1, 0x00, 0x26, 0x43, 0xf2, 0x02, 0x14, + 0x08, 0xea, 0x06, 0x06, 0x00, 0x2c, 0x0a, 0xea, 0x06, 0x06, 0x40, 0xf0, + 0xfe, 0x80, 0x00, 0x2e, 0x00, 0xf0, 0xfb, 0x80, 0x95, 0xf8, 0x00, 0x80, + 0xe8, 0x68, 0x07, 0x90, 0x05, 0xab, 0x0d, 0xf1, 0x16, 0x02, 0x41, 0x46, + 0x48, 0x46, 0xd9, 0xf7, 0xa1, 0xf9, 0x48, 0x46, 0x00, 0xf0, 0x32, 0xfd, + 0x04, 0x46, 0x87, 0xf8, 0x4c, 0x40, 0x00, 0x22, 0x69, 0x78, 0x88, 0x42, + 0x02, 0xd0, 0x6c, 0x70, 0x0c, 0x98, 0x02, 0x6b, 0xe9, 0x78, 0x40, 0x46, + 0x00, 0xee, 0x10, 0x0a, 0xa8, 0x78, 0xf8, 0xee, 0x40, 0x0a, 0x00, 0xee, + 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x01, 0xee, 0x10, 0x1a, 0x0c, 0x98, + 0x80, 0xee, 0x80, 0x0a, 0xb8, 0xee, 0x41, 0x1a, 0xc0, 0xee, 0x81, 0x0a, + 0x90, 0xed, 0x0d, 0x1a, 0xb4, 0xee, 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x5e, 0xbf, 0x90, 0xed, 0x0e, 0x1a, 0xb4, 0xee, 0x40, 0x1a, 0xf1, 0xee, + 0x10, 0xfa, 0x11, 0xd4, 0x90, 0xed, 0x0f, 0x0a, 0xf4, 0xee, 0x40, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x5e, 0xbf, 0x90, 0xed, 0x10, 0x0a, 0xb4, 0xee, + 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x05, 0xd5, 0xc0, 0x6a, 0x85, 0xf8, + 0x03, 0x80, 0x00, 0xe0, 0xc0, 0x6a, 0x82, 0x18, 0x85, 0xf8, 0x02, 0x80, + 0x5a, 0xb1, 0x17, 0x99, 0x16, 0x98, 0xff, 0xf7, 0x82, 0xf9, 0x07, 0xf1, + 0x4c, 0x00, 0x81, 0x69, 0x49, 0x1c, 0x81, 0x61, 0x69, 0x6a, 0x49, 0x1c, + 0x69, 0x62, 0x03, 0x22, 0x07, 0x98, 0xbd, 0xf9, 0x14, 0x10, 0x04, 0x90, + 0x03, 0x91, 0x01, 0x92, 0x05, 0xf5, 0x90, 0x76, 0xbd, 0xf9, 0x16, 0x00, + 0x02, 0x90, 0x05, 0xf1, 0xfc, 0x0a, 0x18, 0x98, 0x00, 0x94, 0x43, 0x46, + 0x32, 0x46, 0x51, 0x46, 0xbf, 0xf7, 0x45, 0xf8, 0xbd, 0xf9, 0x14, 0x00, + 0xbd, 0xf9, 0x16, 0x10, 0x04, 0x90, 0x03, 0x91, 0x02, 0x96, 0x17, 0x99, + 0x16, 0x98, 0xcd, 0xf8, 0x04, 0xa0, 0x00, 0x94, 0x43, 0x46, 0x03, 0x22, + 0xfe, 0xf7, 0x54, 0xfe, 0x04, 0x46, 0x01, 0x20, 0xcb, 0xf8, 0x40, 0x00, + 0x39, 0x69, 0x49, 0x1c, 0x39, 0x61, 0xa8, 0x6a, 0x40, 0x1c, 0xa8, 0x62, + 0xe8, 0x6a, 0x28, 0xb1, 0x97, 0xed, 0x12, 0x0a, 0x00, 0xf0, 0xbd, 0xf8, + 0x87, 0xed, 0x12, 0x0a, 0x00, 0x20, 0xe8, 0x62, 0x43, 0x46, 0x06, 0x99, + 0x08, 0x78, 0xb8, 0x75, 0x03, 0x22, 0x06, 0x99, 0x48, 0x78, 0xf8, 0x75, + 0x17, 0x99, 0x16, 0x98, 0xfe, 0xf7, 0x06, 0xfd, 0x07, 0xf1, 0x1c, 0x00, + 0x00, 0xf0, 0xb2, 0xf8, 0xfe, 0xf7, 0x17, 0xfd, 0x07, 0xf1, 0x28, 0x00, + 0x00, 0xf0, 0xac, 0xf8, 0xfe, 0xf7, 0x2a, 0xfd, 0x87, 0xed, 0x0c, 0x0a, + 0x07, 0xf1, 0x4c, 0x02, 0x17, 0x98, 0xd0, 0xf8, 0xdc, 0x10, 0x79, 0x63, + 0x06, 0x98, 0xc1, 0x79, 0x51, 0x70, 0x40, 0xe0, 0x00, 0xf0, 0xa2, 0xf8, + 0x04, 0x46, 0xd6, 0xf7, 0x05, 0xf8, 0x01, 0x46, 0xa8, 0x68, 0xd6, 0xf7, + 0x45, 0xf8, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0x6b, 0x08, 0xb9, 0x87, 0xed, + 0x0e, 0x0a, 0xd7, 0xed, 0x0f, 0x0a, 0x60, 0xee, 0xa8, 0x0a, 0xb8, 0xee, + 0x40, 0x0a, 0x40, 0xee, 0x08, 0x0a, 0xc7, 0xed, 0x0f, 0x0a, 0xe8, 0x6a, + 0x40, 0x1c, 0xe8, 0x62, 0xa8, 0x6a, 0x28, 0xb1, 0x97, 0xed, 0x10, 0x0a, + 0x00, 0xf0, 0x73, 0xf8, 0x87, 0xed, 0x10, 0x0a, 0x00, 0x20, 0xa8, 0x62, + 0x28, 0x61, 0x68, 0x61, 0xe8, 0x61, 0xa8, 0x61, 0x28, 0x62, 0x68, 0x62, + 0x64, 0x20, 0x29, 0x78, 0xe9, 0x70, 0x78, 0x60, 0xf9, 0x68, 0x49, 0x1c, + 0xf9, 0x60, 0x1c, 0xb9, 0x0c, 0x98, 0xc0, 0x69, 0xda, 0xf7, 0x56, 0xfd, + 0xd5, 0xf7, 0xd0, 0xff, 0xa8, 0x60, 0x00, 0x20, 0x78, 0x60, 0x17, 0x99, + 0x16, 0x98, 0xff, 0xf7, 0xb0, 0xf8, 0x0c, 0x99, 0x28, 0x69, 0xca, 0x6d, + 0x90, 0x42, 0x1b, 0xd2, 0x43, 0xf2, 0x02, 0x10, 0x84, 0x42, 0x1c, 0xbf, + 0x43, 0xf2, 0x03, 0x11, 0x8c, 0x42, 0x0a, 0xd0, 0x43, 0xf2, 0x05, 0x10, + 0x84, 0x42, 0x1f, 0xbf, 0x4f, 0xf6, 0x70, 0x71, 0x8c, 0x42, 0x4f, 0xf6, + 0x78, 0x70, 0x84, 0x42, 0x08, 0xd1, 0x07, 0xf1, 0x4c, 0x00, 0x41, 0x68, + 0x49, 0x1c, 0x41, 0x60, 0x28, 0x69, 0x40, 0x1c, 0x28, 0x61, 0x3b, 0xe5, + 0x0c, 0x99, 0x68, 0x69, 0x8a, 0x6d, 0x90, 0x42, 0xbf, 0xf4, 0x1f, 0xad, + 0x43, 0xf2, 0x09, 0x11, 0x8c, 0x42, 0x7f, 0xf4, 0x1a, 0xad, 0x0c, 0x9a, + 0xe9, 0x69, 0x53, 0x6e, 0x99, 0x42, 0x07, 0xd2, 0x49, 0x1c, 0xe9, 0x61, + 0x07, 0xf1, 0x4c, 0x00, 0x01, 0x69, 0x49, 0x1c, 0x01, 0x61, 0x23, 0xe5, + 0x40, 0x1c, 0x68, 0x61, 0x00, 0x24, 0x07, 0xf1, 0x4c, 0x00, 0x81, 0x68, + 0x49, 0x1c, 0x81, 0x60, 0x16, 0x98, 0x17, 0x99, 0xfe, 0xf7, 0xe2, 0xfb, + 0xec, 0x61, 0x16, 0xe5, 0x14, 0xb9, 0x00, 0xf0, 0x19, 0xf8, 0x04, 0x46, + 0x3c, 0x60, 0x64, 0x20, 0x78, 0x60, 0x08, 0xb0, 0x20, 0x46, 0xbd, 0xec, + 0x04, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, 0x00, 0xee, 0x90, 0x0a, 0x20, 0xee, + 0x28, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x00, 0xee, 0x88, 0x0a, 0x70, 0x47, + 0x03, 0x22, 0x80, 0xec, 0x02, 0x0a, 0x17, 0x99, 0x16, 0x98, 0x70, 0x47, + 0x16, 0x99, 0x17, 0x98, 0x00, 0x91, 0x01, 0x90, 0x3b, 0x46, 0x0c, 0x99, + 0x2a, 0x46, 0x48, 0x46, 0x1a, 0xe0, 0x00, 0x00, 0x38, 0xb5, 0x04, 0x46, + 0x08, 0x46, 0x11, 0x46, 0xfe, 0xf7, 0xb4, 0xfb, 0x00, 0x25, 0x00, 0x23, + 0x00, 0x22, 0xe9, 0xb2, 0x20, 0x46, 0xd8, 0xf7, 0xf1, 0xff, 0x6d, 0x1c, + 0x41, 0x2d, 0xf6, 0xd3, 0x31, 0xbd, 0x0b, 0x46, 0x11, 0x46, 0x01, 0x28, + 0x12, 0xbf, 0x02, 0x28, 0x18, 0x46, 0xff, 0xf7, 0x2e, 0xb8, 0x70, 0x47, + 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, 0x83, 0x46, 0x8a, 0x46, + 0x86, 0xb0, 0x16, 0x78, 0x9a, 0xf8, 0x13, 0x50, 0x30, 0x46, 0x00, 0xee, + 0x10, 0x0a, 0x00, 0x24, 0xb8, 0xee, 0x40, 0x8a, 0xae, 0x42, 0x9a, 0xed, + 0x05, 0x0a, 0xac, 0xbf, 0x77, 0x1b, 0x00, 0x27, 0x28, 0xee, 0x00, 0x0a, + 0xbe, 0xf7, 0x7a, 0xf8, 0x00, 0xf0, 0x70, 0xf8, 0xc0, 0xb2, 0xf9, 0xb2, + 0x88, 0x42, 0x38, 0xbf, 0x10, 0xee, 0x10, 0x7a, 0xff, 0xb2, 0x02, 0x2f, + 0x2e, 0xbf, 0x05, 0x97, 0x01, 0x21, 0x05, 0x91, 0x9a, 0xed, 0x06, 0x0a, + 0x28, 0xee, 0x00, 0x0a, 0xdb, 0xf7, 0xbe, 0xf8, 0xbd, 0xee, 0xc0, 0x0a, + 0xad, 0x19, 0x10, 0xee, 0x10, 0x1a, 0xe8, 0xb2, 0xc9, 0xb2, 0x88, 0x42, + 0x38, 0xbf, 0x10, 0xee, 0x10, 0x5a, 0xed, 0xb2, 0x40, 0x2d, 0x05, 0x9f, + 0x28, 0xbf, 0x40, 0x25, 0x1b, 0xe0, 0x00, 0x20, 0x03, 0x90, 0x02, 0x90, + 0x04, 0xaa, 0x0d, 0xf1, 0x12, 0x03, 0x01, 0x92, 0x00, 0x93, 0x13, 0x99, + 0x12, 0x98, 0xfb, 0xb2, 0x03, 0x22, 0xfe, 0xf7, 0x27, 0xfc, 0x04, 0x46, + 0x00, 0xf0, 0x41, 0xf8, 0xf9, 0xb2, 0x58, 0x46, 0xd8, 0xf7, 0x90, 0xff, + 0xb2, 0x45, 0x04, 0xbf, 0xbd, 0xf9, 0x12, 0x80, 0xbd, 0xf9, 0x10, 0x90, + 0x7f, 0x1c, 0x5f, 0xfa, 0x87, 0xfa, 0x55, 0x45, 0x01, 0xdb, 0x00, 0x2c, + 0xdd, 0xd0, 0x05, 0x9f, 0x00, 0x26, 0x08, 0xe0, 0x0f, 0xfa, 0x89, 0xf3, + 0x0f, 0xfa, 0x88, 0xf2, 0xf1, 0xb2, 0x58, 0x46, 0xd8, 0xf7, 0x78, 0xff, + 0x76, 0x1c, 0xf0, 0xb2, 0xb8, 0x42, 0x0a, 0xda, 0x00, 0x2c, 0xf1, 0xd0, + 0x07, 0xe0, 0x0f, 0xfa, 0x89, 0xf3, 0x0f, 0xfa, 0x88, 0xf2, 0xe9, 0xb2, + 0x58, 0x46, 0xd8, 0xf7, 0x69, 0xff, 0x6d, 0x1c, 0xe8, 0xb2, 0x40, 0x28, + 0x01, 0xd8, 0x00, 0x2c, 0xf1, 0xd0, 0x08, 0x98, 0xa0, 0xf8, 0x18, 0x80, + 0xa0, 0xf8, 0x1a, 0x90, 0x06, 0xb0, 0x20, 0x46, 0xbd, 0xec, 0x02, 0x8b, + 0xbd, 0xe8, 0xf2, 0x8f, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, + 0x70, 0x47, 0xbd, 0xf9, 0x10, 0x30, 0xbd, 0xf9, 0x12, 0x20, 0x70, 0x47, + 0x2d, 0xe9, 0xf8, 0x43, 0x2d, 0xed, 0x02, 0x8b, 0x8c, 0xb0, 0x0d, 0x46, + 0x04, 0x46, 0x16, 0x46, 0x69, 0x46, 0xca, 0xf7, 0x1b, 0xff, 0x0d, 0xf1, + 0x2a, 0x00, 0x0a, 0xa9, 0x03, 0x90, 0x02, 0x91, 0x01, 0x23, 0xaa, 0x68, + 0x00, 0x9f, 0x01, 0x92, 0x00, 0x22, 0x28, 0x78, 0x00, 0x90, 0x01, 0x21, + 0x20, 0x46, 0xe9, 0xf7, 0x87, 0xff, 0x80, 0x46, 0xbd, 0xf8, 0x28, 0x20, + 0x00, 0x21, 0x20, 0x46, 0xe9, 0xf7, 0xc3, 0xff, 0x08, 0xee, 0x10, 0x0a, + 0xd5, 0xed, 0x01, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0xb8, 0xee, 0x48, 0x1a, + 0x60, 0xee, 0x81, 0x0a, 0x9f, 0xed, 0xc0, 0x0a, 0x80, 0xee, 0x80, 0x0a, + 0xdb, 0xf7, 0x24, 0xf8, 0xfc, 0xee, 0xc0, 0x8a, 0x39, 0x46, 0x20, 0x46, + 0xea, 0xf7, 0x9e, 0xf8, 0x0a, 0x21, 0x00, 0x22, 0x08, 0x91, 0x07, 0x92, + 0x03, 0x23, 0x81, 0x46, 0x06, 0x93, 0x04, 0x93, 0x06, 0xf1, 0x20, 0x00, + 0x00, 0x21, 0x4f, 0xf4, 0x00, 0x12, 0x09, 0x90, 0x03, 0x91, 0x02, 0x92, + 0x00, 0x23, 0x00, 0x91, 0x01, 0x93, 0xcd, 0xed, 0x05, 0x8a, 0xb7, 0xee, + 0x00, 0x1a, 0xdf, 0xed, 0xb0, 0x0a, 0x9f, 0xed, 0xaf, 0x0a, 0x00, 0x22, + 0x01, 0x21, 0x20, 0x46, 0xea, 0xf7, 0x00, 0xf9, 0x06, 0xf1, 0x40, 0x00, + 0x00, 0x21, 0x02, 0x90, 0x01, 0x91, 0x00, 0x91, 0xbd, 0xf8, 0x28, 0x30, + 0x2a, 0x78, 0x20, 0x46, 0xe9, 0xf7, 0xc8, 0xff, 0x06, 0xf1, 0x50, 0x00, + 0x00, 0x21, 0x02, 0x90, 0xcd, 0xf8, 0x04, 0x90, 0x00, 0x91, 0xbd, 0xf8, + 0x2a, 0x30, 0x2a, 0x78, 0x01, 0x21, 0x20, 0x46, 0xe9, 0xf7, 0xba, 0xff, + 0x06, 0xf1, 0x60, 0x00, 0x00, 0xf0, 0x68, 0xf8, 0x01, 0x22, 0x04, 0x93, + 0x01, 0x92, 0x00, 0xf0, 0x5d, 0xf8, 0x06, 0xf1, 0x78, 0x00, 0x00, 0x21, + 0x07, 0x90, 0x06, 0x91, 0x01, 0x22, 0x00, 0x23, 0x02, 0x91, 0x01, 0x91, + 0x05, 0x92, 0x04, 0x93, 0x03, 0x92, 0x00, 0xf0, 0x4f, 0xf8, 0x06, 0xf1, + 0x90, 0x00, 0x07, 0x90, 0x00, 0x21, 0x06, 0x91, 0x05, 0x91, 0x04, 0x91, + 0x02, 0x91, 0x01, 0x20, 0x03, 0x90, 0x01, 0x90, 0x00, 0x90, 0x3b, 0x46, + 0x00, 0x22, 0x06, 0xf1, 0x50, 0x01, 0x00, 0xf0, 0x40, 0xf8, 0x06, 0xf1, + 0xa8, 0x00, 0x00, 0xf0, 0x3f, 0xf8, 0x01, 0x91, 0x04, 0x93, 0x00, 0x93, + 0x01, 0x22, 0x00, 0xf0, 0x34, 0xf8, 0x06, 0xf1, 0x20, 0x01, 0x20, 0x46, + 0xc0, 0x46, 0xc0, 0x46, 0x34, 0x60, 0x18, 0xee, 0x90, 0x2a, 0xbd, 0xf8, + 0x28, 0x00, 0xb0, 0x80, 0xbd, 0xf8, 0x2a, 0x10, 0xf1, 0x80, 0x28, 0x78, + 0x30, 0x72, 0x86, 0xed, 0x03, 0x8a, 0xc6, 0xed, 0x04, 0x8a, 0xbd, 0xf8, + 0x28, 0x10, 0x28, 0x78, 0xea, 0xf7, 0xfe, 0xfa, 0x86, 0xed, 0x05, 0x0a, + 0xbd, 0xf8, 0x2a, 0x10, 0x28, 0x78, 0x18, 0xee, 0x90, 0x2a, 0xea, 0xf7, + 0xf5, 0xfa, 0x86, 0xed, 0x06, 0x0a, 0xbd, 0xf8, 0x28, 0x10, 0x28, 0x78, + 0x18, 0xee, 0x90, 0x2a, 0xea, 0xf7, 0xb8, 0xfa, 0x86, 0xed, 0x07, 0x0a, + 0x0c, 0xb0, 0x40, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x83, + 0x00, 0x93, 0x06, 0xf1, 0x40, 0x01, 0x20, 0x46, 0xe9, 0xf7, 0x67, 0xbf, + 0x07, 0x90, 0x00, 0x21, 0x01, 0x20, 0x06, 0x91, 0x05, 0x91, 0x00, 0x23, + 0x03, 0x90, 0x02, 0x91, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x68, 0x01, 0x29, + 0x07, 0xbf, 0x00, 0x21, 0x01, 0x22, 0x01, 0x21, 0x00, 0x22, 0x80, 0xf8, + 0x72, 0x20, 0x80, 0xf8, 0x24, 0x10, 0x00, 0xf1, 0x20, 0x02, 0x20, 0x46, + 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x23, 0x04, 0x21, 0xea, 0xf7, 0x13, 0xbd, + 0x0a, 0x46, 0x04, 0x21, 0xea, 0xf7, 0x64, 0xbf, 0xf8, 0xb5, 0x2d, 0xed, + 0x06, 0x8b, 0x07, 0x46, 0x8a, 0xb0, 0x0c, 0x46, 0x38, 0x68, 0x04, 0x21, + 0xea, 0xf7, 0xf5, 0xff, 0x05, 0x46, 0x4f, 0xf4, 0x00, 0x12, 0x29, 0x46, + 0x01, 0x20, 0xea, 0xf7, 0xc6, 0xf8, 0x06, 0x46, 0xf8, 0x68, 0x20, 0x60, + 0x29, 0x46, 0x01, 0x20, 0xea, 0xf7, 0xe1, 0xf8, 0x02, 0x46, 0x62, 0x60, + 0x38, 0x69, 0x82, 0x42, 0x06, 0xd1, 0x97, 0xed, 0x05, 0x8a, 0xd7, 0xed, + 0x06, 0xaa, 0x97, 0xed, 0x07, 0xaa, 0x13, 0xe0, 0xb9, 0x88, 0x38, 0x7a, + 0xea, 0xf7, 0x94, 0xfa, 0x62, 0x68, 0xf9, 0x88, 0x38, 0x7a, 0xb0, 0xee, + 0x40, 0x8a, 0xea, 0xf7, 0x8d, 0xfa, 0x62, 0x68, 0xb9, 0x88, 0x38, 0x7a, + 0xf0, 0xee, 0x40, 0xaa, 0xea, 0xf7, 0x52, 0xfa, 0xb0, 0xee, 0x40, 0xaa, + 0x02, 0xa8, 0x04, 0xa9, 0x01, 0x90, 0x00, 0x91, 0x03, 0x23, 0x00, 0x22, + 0x29, 0x46, 0x01, 0x20, 0xea, 0xf7, 0xd0, 0xf8, 0x06, 0xa8, 0x08, 0xa9, + 0x01, 0x90, 0x00, 0x91, 0x03, 0x23, 0x02, 0x22, 0x29, 0x46, 0x01, 0x20, + 0xea, 0xf7, 0xc6, 0xf8, 0x00, 0x22, 0x29, 0x46, 0x01, 0x20, 0xea, 0xf7, + 0xac, 0xf8, 0xf0, 0xf7, 0x17, 0xfb, 0x00, 0xee, 0x10, 0x0a, 0x20, 0xee, + 0x0a, 0x0a, 0x84, 0xed, 0x08, 0x0a, 0xb0, 0xee, 0x48, 0x0a, 0xf7, 0xf7, + 0xe3, 0xf8, 0x00, 0xf0, 0x61, 0xf8, 0x00, 0xf0, 0x6f, 0xf8, 0x28, 0x4f, + 0x00, 0xf0, 0x70, 0xf8, 0x00, 0xf0, 0x62, 0xf8, 0x00, 0xf0, 0x68, 0xf8, + 0x00, 0xf0, 0x4a, 0xf8, 0x00, 0xf0, 0x4e, 0xf8, 0x04, 0xf1, 0x08, 0x00, + 0x80, 0xec, 0x02, 0x0a, 0xb0, 0xee, 0x6a, 0x0a, 0xf7, 0xf7, 0xcc, 0xf8, + 0xdd, 0xe9, 0x06, 0x01, 0x00, 0xf0, 0x4a, 0xf8, 0x00, 0xf0, 0x56, 0xf8, + 0x00, 0xf0, 0x58, 0xf8, 0xdd, 0xe9, 0x08, 0x01, 0x00, 0xf0, 0x4a, 0xf8, + 0x00, 0xf0, 0x4e, 0xf8, 0x00, 0xf0, 0x30, 0xf8, 0x00, 0xf0, 0x34, 0xf8, + 0x04, 0xf1, 0x10, 0x00, 0x02, 0xa9, 0x80, 0xec, 0x02, 0x0a, 0x00, 0x91, + 0x04, 0xab, 0x00, 0x22, 0x29, 0x46, 0x01, 0x20, 0xea, 0xf7, 0xd3, 0xf8, + 0xb0, 0xee, 0x4a, 0x0a, 0xf7, 0xf7, 0xaa, 0xf8, 0x00, 0xf0, 0x28, 0xf8, + 0x00, 0xf0, 0x36, 0xf8, 0x00, 0xf0, 0x38, 0xf8, 0x00, 0xf0, 0x2a, 0xf8, + 0x00, 0xf0, 0x30, 0xf8, 0x00, 0xf0, 0x12, 0xf8, 0x00, 0xf0, 0x16, 0xf8, + 0x04, 0xf1, 0x18, 0x00, 0x80, 0xec, 0x02, 0x0a, 0x0a, 0xb0, 0x30, 0x46, + 0xbd, 0xec, 0x06, 0x8b, 0xf2, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x7a, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x8e, 0x00, 0x20, 0xb0, 0xee, 0x48, 0x1a, + 0xf0, 0xee, 0x68, 0x1a, 0xf7, 0xf7, 0x33, 0xb8, 0xb0, 0xee, 0x49, 0x1a, + 0xf0, 0xee, 0x69, 0x1a, 0xf7, 0xf7, 0x53, 0xb8, 0xdd, 0xe9, 0x02, 0x01, + 0xb0, 0xee, 0x40, 0x9a, 0xf0, 0xee, 0x60, 0x9a, 0xf0, 0xf7, 0xa2, 0xba, + 0xdd, 0xe9, 0x04, 0x01, 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, 0x60, 0x8a, + 0xf0, 0xf7, 0x9a, 0xba, 0x00, 0xee, 0x10, 0x0a, 0xf7, 0xf7, 0x6c, 0xb8, + 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x97, 0xec, 0x02, 0x0a, + 0xf7, 0xf7, 0x37, 0xb8, 0xe9, 0xf7, 0x52, 0xbc, 0x10, 0xb5, 0x04, 0x46, + 0xe9, 0xf7, 0x61, 0xfc, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x04, 0x21, + 0xea, 0xf7, 0xe4, 0xbe, 0x0a, 0x46, 0x04, 0x21, 0xea, 0xf7, 0xf5, 0xbb, + 0x04, 0x21, 0xea, 0xf7, 0x04, 0xbc, 0x00, 0x00, 0xf8, 0xb5, 0x2d, 0xed, + 0x04, 0x8b, 0x84, 0xb0, 0x0f, 0x46, 0xff, 0x21, 0x00, 0x91, 0x04, 0x46, + 0x16, 0x46, 0xcb, 0xf7, 0xc8, 0xfb, 0x97, 0xf9, 0x03, 0x10, 0x0d, 0x18, + 0xfa, 0x2d, 0x28, 0xbf, 0x43, 0xf2, 0x06, 0x10, 0x71, 0xd2, 0x69, 0x46, + 0x20, 0x46, 0xd8, 0xf7, 0xf2, 0xf9, 0x00, 0x28, 0x6b, 0xd1, 0x00, 0x98, + 0xff, 0x28, 0x08, 0xbf, 0x40, 0xf6, 0x07, 0x30, 0x65, 0xd0, 0x20, 0x46, + 0xcb, 0xf7, 0x92, 0xfb, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x8a, + 0x9f, 0xed, 0x77, 0x1a, 0xd7, 0xed, 0x01, 0x0a, 0x81, 0xee, 0x08, 0x1a, + 0x9f, 0xed, 0x75, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x21, 0xee, 0x00, 0x0a, + 0x80, 0xee, 0x80, 0x0a, 0xda, 0xf7, 0x30, 0xfe, 0x38, 0x78, 0x00, 0xee, + 0x90, 0x0a, 0xf0, 0xee, 0x40, 0x8a, 0xf8, 0xee, 0x60, 0x0a, 0x60, 0xee, + 0x88, 0x0a, 0x9f, 0xed, 0x6c, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0xda, 0xf7, + 0x21, 0xfe, 0x78, 0x78, 0xb0, 0xee, 0x40, 0x9a, 0x00, 0xf0, 0x3f, 0xf8, + 0xdf, 0xed, 0x66, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0xda, 0xf7, 0x16, 0xfe, + 0xb8, 0x78, 0xf0, 0xee, 0x40, 0x9a, 0x00, 0xf0, 0x34, 0xf8, 0xdf, 0xed, + 0x62, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0xda, 0xf7, 0x0b, 0xfe, 0x30, 0x88, + 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x1a, 0x08, 0x18, 0x30, 0x80, + 0xbd, 0xee, 0xe9, 0x0a, 0x10, 0xee, 0x10, 0x1a, 0xbd, 0xee, 0xc9, 0x0a, + 0x80, 0xb2, 0x89, 0xb2, 0x10, 0xee, 0x10, 0x2a, 0x10, 0xfa, 0x82, 0xf2, + 0x90, 0xfb, 0xf1, 0xf3, 0x01, 0xfb, 0x13, 0x21, 0xad, 0xf8, 0x04, 0x10, + 0xfc, 0xee, 0xe8, 0x0a, 0x8d, 0xf8, 0x06, 0x50, 0xcd, 0xed, 0x02, 0x0a, + 0x20, 0x46, 0xda, 0xf7, 0x25, 0xfc, 0x00, 0x98, 0xda, 0xf7, 0x2f, 0xfc, + 0x00, 0x99, 0x01, 0xaa, 0x20, 0x46, 0xda, 0xf7, 0x45, 0xfc, 0x04, 0xb0, + 0xbd, 0xec, 0x04, 0x8b, 0xf2, 0xbd, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, + 0x40, 0x0a, 0x20, 0xee, 0x08, 0x0a, 0x70, 0x47, 0xda, 0xf7, 0x70, 0xbc, + 0xda, 0xf7, 0x74, 0xbc, 0x70, 0xb5, 0x2d, 0xed, 0x04, 0x8b, 0x8c, 0xb0, + 0x05, 0x46, 0x16, 0x46, 0x69, 0x46, 0xd8, 0xf7, 0x6c, 0xf9, 0x04, 0x00, + 0x6d, 0xd1, 0x00, 0x99, 0x02, 0xaa, 0x28, 0x46, 0xda, 0xf7, 0x7a, 0xfc, + 0x04, 0x46, 0x28, 0x46, 0xcb, 0xf7, 0x0c, 0xfb, 0x30, 0x60, 0x28, 0x46, + 0xcb, 0xf7, 0x12, 0xfb, 0x00, 0xee, 0x10, 0x0a, 0x86, 0xed, 0x01, 0x0a, + 0x02, 0x98, 0x37, 0x4d, 0x00, 0x02, 0x00, 0xee, 0x90, 0x0a, 0xc6, 0xed, + 0x02, 0x0a, 0xb8, 0xee, 0x60, 0x8a, 0xf8, 0xee, 0x40, 0x0a, 0x96, 0xed, + 0x00, 0x0a, 0x68, 0xee, 0x20, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x80, 0xee, + 0x80, 0x0a, 0xbd, 0xf7, 0x67, 0xfd, 0xbc, 0xee, 0xc0, 0x0a, 0x86, 0xed, + 0x03, 0x0a, 0xdd, 0xe9, 0x04, 0x01, 0x9f, 0xed, 0x28, 0x0a, 0x28, 0xee, + 0x00, 0x8a, 0xf0, 0xf7, 0xa9, 0xf9, 0x00, 0xee, 0x90, 0x0a, 0xdd, 0xe9, + 0x06, 0x01, 0x80, 0xee, 0x88, 0x9a, 0xf0, 0xf7, 0xa1, 0xf9, 0x00, 0xee, + 0x10, 0x0a, 0x80, 0xee, 0x08, 0x0a, 0xf6, 0xf7, 0x71, 0xff, 0x00, 0xf0, + 0x4f, 0xf8, 0x00, 0xf0, 0x45, 0xf8, 0x00, 0xf0, 0x3d, 0xf8, 0x06, 0xf1, + 0x10, 0x00, 0x80, 0xec, 0x02, 0x0a, 0x96, 0xed, 0x03, 0x0a, 0xdd, 0xe9, + 0x08, 0x01, 0xb8, 0xee, 0x40, 0x0a, 0xdf, 0xed, 0x17, 0x0a, 0x20, 0xee, + 0x20, 0x8a, 0xf0, 0xf7, 0x85, 0xf9, 0x00, 0xee, 0x10, 0x0a, 0xdd, 0xe9, + 0x0a, 0x01, 0x80, 0xee, 0x08, 0x9a, 0xf0, 0xf7, 0x7d, 0xf9, 0x00, 0xee, + 0x90, 0x0a, 0x80, 0xee, 0x88, 0x0a, 0xf6, 0xf7, 0x4d, 0xff, 0x00, 0xf0, + 0x2b, 0xf8, 0x00, 0xf0, 0x21, 0xf8, 0x00, 0xf0, 0x19, 0xf8, 0x06, 0xf1, + 0x18, 0x00, 0x80, 0xec, 0x02, 0x0a, 0x0c, 0xb0, 0x20, 0x00, 0x18, 0xbf, + 0x01, 0x20, 0xbd, 0xec, 0x04, 0x8b, 0xc0, 0xb2, 0x70, 0xbd, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x43, 0x00, 0x00, 0x7a, 0x44, 0x00, 0x24, 0x74, 0x49, + 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x80, 0x47, 0x34, 0x8e, 0x00, 0x20, + 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, 0xf6, 0xf7, 0xd5, 0xbe, + 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, 0x60, 0x8a, 0xb0, 0xee, 0x49, 0x0a, + 0xf6, 0xf7, 0x20, 0xbf, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, + 0x95, 0xec, 0x02, 0x0a, 0xf6, 0xf7, 0xeb, 0xbe, 0x80, 0xb5, 0xcb, 0xf7, + 0xd8, 0xfb, 0x69, 0x46, 0xda, 0xf7, 0x20, 0xfe, 0x9d, 0xf8, 0x00, 0x00, + 0x02, 0xbd, 0xfe, 0xb5, 0x05, 0x46, 0x69, 0x46, 0xd8, 0xf7, 0xc3, 0xf8, + 0x08, 0xbb, 0x00, 0x98, 0xff, 0x28, 0x02, 0xd1, 0x40, 0xf6, 0x07, 0x30, + 0xfe, 0xbd, 0x28, 0x46, 0xcb, 0xf7, 0x80, 0xfa, 0x04, 0x46, 0x00, 0x98, + 0x29, 0x46, 0xcb, 0xf7, 0x98, 0xfb, 0x06, 0x46, 0x00, 0x98, 0xcb, 0xf7, + 0x87, 0xfb, 0x07, 0x46, 0x01, 0xa9, 0x28, 0x46, 0xca, 0xf7, 0xd8, 0xfb, + 0x48, 0xb9, 0x01, 0x99, 0x76, 0x18, 0xa4, 0x19, 0x94, 0xfb, 0xf7, 0xf1, + 0x07, 0xfb, 0x11, 0x44, 0x0c, 0xb1, 0x43, 0xf2, 0x07, 0x10, 0xfe, 0xbd, + 0x2d, 0xe9, 0xf3, 0x4f, 0xdf, 0xf8, 0x24, 0x84, 0x81, 0xb0, 0x40, 0x46, + 0xc0, 0x46, 0xc0, 0x46, 0x00, 0x25, 0xdf, 0xf8, 0x1c, 0xb4, 0xdf, 0xf8, + 0x1c, 0x64, 0x28, 0x46, 0xcb, 0xf7, 0x10, 0xfc, 0x07, 0x46, 0x1c, 0x20, + 0x68, 0x43, 0x34, 0x18, 0x28, 0x20, 0xff, 0x21, 0x68, 0x43, 0x61, 0x60, + 0x30, 0x44, 0xc4, 0xf8, 0x08, 0x80, 0x00, 0xf5, 0x0d, 0x71, 0x00, 0x91, + 0xe1, 0x60, 0x4f, 0xf4, 0xa8, 0x70, 0x68, 0x43, 0x70, 0x22, 0x30, 0x44, + 0x41, 0xf2, 0x68, 0x71, 0x6a, 0x43, 0x00, 0xeb, 0x01, 0x09, 0x06, 0xeb, + 0x02, 0x0a, 0xc4, 0xf8, 0x10, 0x90, 0x0a, 0xf1, 0x74, 0x00, 0x60, 0x61, + 0x40, 0xf2, 0x24, 0x52, 0x02, 0x99, 0x4f, 0xf4, 0xc2, 0x70, 0x68, 0x43, + 0x6a, 0x43, 0x08, 0x44, 0x32, 0x44, 0xa0, 0x61, 0x02, 0xf5, 0x35, 0x71, + 0xff, 0x2f, 0xe1, 0x61, 0x0f, 0xd1, 0xcb, 0xf7, 0x8f, 0xfb, 0x00, 0x21, + 0x23, 0x1d, 0x20, 0xfa, 0x01, 0xf2, 0xd2, 0x07, 0x5c, 0xbf, 0xdb, 0xf8, + 0x00, 0x20, 0x42, 0xf8, 0x21, 0x30, 0x49, 0x1c, 0x08, 0x29, 0xf4, 0xd3, + 0x07, 0xe0, 0xdb, 0xf8, 0x00, 0x20, 0x20, 0x1d, 0x42, 0xf8, 0x27, 0x00, + 0x38, 0x46, 0xbe, 0xf7, 0xcc, 0xfa, 0x01, 0x98, 0xf8, 0x40, 0xc1, 0x07, + 0x16, 0xd5, 0x00, 0x20, 0x70, 0x55, 0x38, 0x46, 0xd8, 0xf7, 0x55, 0xfa, + 0x02, 0x21, 0x38, 0x46, 0x00, 0xf0, 0xb8, 0xf9, 0x00, 0x9a, 0x08, 0xf5, + 0xa6, 0x71, 0x38, 0x46, 0x00, 0xf0, 0xc6, 0xf9, 0x0a, 0xf1, 0x74, 0x03, + 0x4a, 0x46, 0x08, 0xf5, 0xb0, 0x71, 0x38, 0x46, 0xfe, 0xf7, 0x9a, 0xff, + 0x6d, 0x1c, 0x04, 0x2d, 0x97, 0xd3, 0xbd, 0xe8, 0xf7, 0x8f, 0x2d, 0xe9, + 0xfe, 0x4f, 0x00, 0x24, 0x88, 0x46, 0xa1, 0x46, 0x00, 0x25, 0xdf, 0xf8, + 0x30, 0xa3, 0xdf, 0xf8, 0x34, 0xb3, 0x02, 0x90, 0x02, 0x98, 0xe8, 0x40, + 0xc1, 0x07, 0x3d, 0xd5, 0x28, 0x46, 0xcb, 0xf7, 0x79, 0xfb, 0x06, 0x46, + 0xff, 0x2e, 0x37, 0xd0, 0x94, 0xbb, 0x40, 0xf2, 0x24, 0x51, 0x71, 0x43, + 0x4f, 0xf4, 0xc2, 0x70, 0x59, 0x44, 0x28, 0x24, 0x70, 0x43, 0x01, 0xf5, + 0x35, 0x72, 0x74, 0x43, 0x08, 0xeb, 0x00, 0x07, 0x01, 0x92, 0x5c, 0x44, + 0x00, 0x97, 0x53, 0x46, 0x04, 0xf5, 0x0d, 0x72, 0x0a, 0xf5, 0xa6, 0x71, + 0x28, 0x46, 0x00, 0xf0, 0x96, 0xf9, 0x04, 0x00, 0x14, 0xd1, 0x70, 0x20, + 0x4f, 0xf4, 0xa8, 0x71, 0x70, 0x43, 0x71, 0x43, 0x58, 0x44, 0x59, 0x44, + 0x41, 0xf2, 0x68, 0x72, 0x01, 0x97, 0x00, 0xf1, 0x74, 0x03, 0x0a, 0x44, + 0xcd, 0xf8, 0x00, 0xa0, 0x0a, 0xf5, 0xb0, 0x71, 0x28, 0x46, 0xfe, 0xf7, + 0x5c, 0xff, 0x04, 0x46, 0x14, 0xb9, 0x01, 0x20, 0x0b, 0xf8, 0x06, 0x00, + 0xb9, 0xf1, 0x00, 0x0f, 0x08, 0xbf, 0xa1, 0x46, 0x6d, 0x1c, 0x08, 0x2d, + 0xba, 0xd3, 0x48, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, 0xfe, 0xb5, 0x0c, 0x46, + 0xe5, 0xf7, 0x8c, 0xfe, 0x05, 0x46, 0xcb, 0xf7, 0x31, 0xfb, 0x01, 0x46, + 0x70, 0x23, 0xa3, 0x4a, 0x50, 0x5c, 0x4b, 0x43, 0x13, 0x44, 0xd8, 0xb1, + 0x40, 0xf2, 0x24, 0x50, 0x48, 0x43, 0x10, 0x44, 0x9c, 0x4e, 0x00, 0x96, + 0x00, 0xf5, 0x35, 0x77, 0x4f, 0xf4, 0xc2, 0x70, 0x48, 0x43, 0x04, 0x44, + 0x4f, 0xf4, 0xa8, 0x70, 0x41, 0x43, 0x50, 0x18, 0x41, 0xf2, 0x68, 0x71, + 0x42, 0x18, 0x02, 0x97, 0x01, 0x94, 0x74, 0x33, 0x06, 0xf5, 0xb0, 0x71, + 0x28, 0x46, 0xfe, 0xf7, 0x3b, 0xff, 0xfe, 0xbd, 0x43, 0xf2, 0x01, 0x10, + 0x58, 0x67, 0xfe, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x09, 0xf8, 0xd5, 0xf7, + 0xc2, 0xfa, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x03, 0xf8, 0xd5, 0xf7, + 0xa7, 0xfa, 0x02, 0xbd, 0x00, 0x92, 0x0b, 0x46, 0x02, 0x46, 0x4f, 0xf4, + 0xe6, 0x71, 0x86, 0x48, 0x70, 0x47, 0xf8, 0xb5, 0x0c, 0x46, 0x16, 0x46, + 0x1f, 0x46, 0xe5, 0xf7, 0x49, 0xfe, 0xcb, 0xf7, 0xef, 0xfa, 0x00, 0x25, + 0xff, 0x28, 0x16, 0xd0, 0x7f, 0xb9, 0x31, 0x68, 0x14, 0x29, 0x0f, 0xd3, + 0x28, 0x21, 0x7f, 0x4b, 0x48, 0x43, 0x18, 0x44, 0x00, 0xf5, 0x0d, 0x71, + 0x14, 0x22, 0x20, 0x46, 0xbd, 0xf7, 0x32, 0xfa, 0x14, 0x22, 0x32, 0x60, + 0x07, 0xe0, 0x4f, 0xf6, 0x2a, 0x75, 0x04, 0xe0, 0x4f, 0xf6, 0x26, 0x75, + 0x01, 0xe0, 0x4f, 0xf6, 0x52, 0x75, 0x28, 0x46, 0xf2, 0xbd, 0xf8, 0xb5, + 0x0c, 0x46, 0x15, 0x46, 0x1f, 0x46, 0xe5, 0xf7, 0x23, 0xfe, 0xcb, 0xf7, + 0xc9, 0xfa, 0x00, 0x26, 0x08, 0x28, 0x1e, 0xd0, 0x70, 0x21, 0x6e, 0x4a, + 0x48, 0x43, 0x10, 0x44, 0x1f, 0xb1, 0x02, 0x2f, 0x0d, 0xd0, 0x0c, 0xd3, + 0x0f, 0xe0, 0x00, 0xf1, 0x74, 0x01, 0x14, 0x27, 0x28, 0x68, 0xb8, 0x42, + 0x0c, 0xd3, 0x3a, 0x46, 0x20, 0x46, 0xbd, 0xf7, 0x07, 0xfa, 0x2f, 0x60, + 0x0b, 0xe0, 0x00, 0xf1, 0x74, 0x01, 0x70, 0x27, 0xf2, 0xe7, 0x4f, 0xf6, + 0x2a, 0x76, 0x04, 0xe0, 0x4f, 0xf6, 0x26, 0x76, 0x01, 0xe0, 0x4f, 0xf6, + 0x52, 0x76, 0x30, 0x46, 0xf2, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xfe, 0x43, + 0x0c, 0x9f, 0x89, 0x46, 0x16, 0x46, 0x1c, 0x46, 0xe5, 0xf7, 0xf2, 0xfd, + 0x80, 0x46, 0xcb, 0xf7, 0x97, 0xfa, 0x4f, 0xf4, 0xc2, 0x71, 0x00, 0x25, + 0x48, 0x43, 0x3f, 0x18, 0xb9, 0xf1, 0x05, 0x0f, 0x4f, 0xf6, 0x61, 0x72, + 0x50, 0x48, 0x09, 0xd8, 0xdf, 0xe8, 0x09, 0xf0, 0x09, 0x03, 0x12, 0x1d, + 0x2e, 0x5f, 0x01, 0x46, 0x3a, 0x46, 0x40, 0x46, 0xff, 0xf7, 0x76, 0xfa, + 0x6d, 0xe0, 0x01, 0x23, 0x04, 0xb1, 0x33, 0x78, 0x01, 0x46, 0x3a, 0x46, + 0x18, 0x46, 0xff, 0xf7, 0x7e, 0xfa, 0x64, 0xe0, 0x04, 0x2c, 0x04, 0xd3, + 0x32, 0x68, 0x39, 0x46, 0xfe, 0xf7, 0x91, 0xfa, 0x5d, 0xe0, 0x39, 0x46, + 0xfd, 0xf7, 0x1c, 0xfe, 0x59, 0xe0, 0x04, 0x2c, 0x56, 0xd3, 0x77, 0x5f, + 0xb6, 0xf9, 0x02, 0x40, 0x8e, 0xbf, 0x30, 0x79, 0x40, 0x46, 0xff, 0xf7, + 0xe3, 0xfc, 0x01, 0x46, 0x23, 0x46, 0x3a, 0x46, 0x40, 0x46, 0xd8, 0xf7, + 0x4f, 0xfa, 0x48, 0xe0, 0x00, 0xf5, 0xd8, 0x73, 0xd3, 0xe9, 0x00, 0x01, + 0x0a, 0x9f, 0xcd, 0xe9, 0x00, 0x01, 0x3d, 0x60, 0x04, 0x2c, 0x24, 0xbf, + 0x30, 0x68, 0x01, 0x90, 0x0b, 0x98, 0x20, 0x28, 0x38, 0xd3, 0x40, 0x46, + 0xff, 0xf7, 0xca, 0xfc, 0x01, 0x46, 0x40, 0x46, 0xff, 0xf7, 0xc8, 0xfc, + 0x32, 0x46, 0x69, 0x46, 0x40, 0x46, 0xff, 0xf7, 0xd5, 0xfc, 0x05, 0x00, + 0x2b, 0xd1, 0x01, 0x98, 0x4f, 0xf4, 0x7a, 0x71, 0xb0, 0xfb, 0xf1, 0xf0, + 0xc0, 0x1c, 0xd9, 0xf7, 0x0b, 0xff, 0x00, 0x21, 0x40, 0x46, 0xff, 0xf7, + 0x59, 0xfd, 0x32, 0x46, 0x69, 0x46, 0x40, 0x46, 0xff, 0xf7, 0x56, 0xfd, + 0x20, 0x20, 0x38, 0x60, 0x17, 0xe0, 0xac, 0xb1, 0x34, 0x78, 0x97, 0xf8, + 0x7c, 0x21, 0x21, 0x46, 0x00, 0xee, 0x10, 0x1a, 0x00, 0xee, 0x90, 0x2a, + 0xb8, 0xee, 0x40, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x80, 0xee, 0x20, 0x0a, + 0x07, 0xf1, 0x70, 0x01, 0x8c, 0x30, 0xfe, 0xf7, 0xf8, 0xfd, 0x87, 0xf8, + 0x7c, 0x41, 0x00, 0xe0, 0x15, 0x46, 0x28, 0x46, 0xbd, 0xe8, 0xfe, 0x83, + 0x38, 0xb5, 0x12, 0x49, 0x09, 0x68, 0x51, 0xf8, 0x20, 0x50, 0x28, 0x68, + 0x08, 0x28, 0x1a, 0xd2, 0x51, 0xf8, 0x20, 0x40, 0xac, 0xb1, 0xa9, 0x68, + 0xa0, 0x68, 0x28, 0x22, 0xbd, 0xf7, 0x64, 0xf9, 0xe9, 0x68, 0xe0, 0x68, + 0x4f, 0xf4, 0xa8, 0x72, 0xbd, 0xf7, 0x5e, 0xf9, 0x29, 0x69, 0x20, 0x69, + 0x70, 0x22, 0xbd, 0xf7, 0x59, 0xf9, 0x69, 0x69, 0x60, 0x69, 0x4f, 0xf4, + 0xc2, 0x72, 0xbd, 0xf7, 0x53, 0xf9, 0xff, 0x20, 0x28, 0x60, 0x31, 0xbd, + 0x4c, 0x8e, 0x00, 0x20, 0x80, 0x04, 0x00, 0x01, 0xa0, 0x01, 0x02, 0x20, + 0x08, 0x4a, 0x52, 0xf8, 0x20, 0x00, 0x00, 0xf5, 0xc8, 0x70, 0xef, 0xf3, + 0x10, 0x82, 0x72, 0xb6, 0x03, 0x68, 0x9b, 0x08, 0x01, 0xf0, 0x03, 0x01, + 0x41, 0xea, 0x83, 0x01, 0x01, 0x60, 0x82, 0xf3, 0x10, 0x88, 0x70, 0x47, + 0xe8, 0x96, 0x04, 0x01, 0x10, 0xb5, 0x14, 0x46, 0x28, 0x21, 0x20, 0x46, + 0xce, 0xf7, 0x4a, 0xff, 0x20, 0x46, 0xe5, 0xf7, 0x03, 0xfd, 0x00, 0x20, + 0x10, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, 0xc4, 0xb0, + 0x82, 0x46, 0x17, 0x46, 0x01, 0x26, 0x0c, 0x46, 0x98, 0x46, 0x8d, 0xf8, + 0x00, 0x60, 0x38, 0x46, 0xe5, 0xf7, 0xf9, 0xfc, 0x01, 0x21, 0x50, 0x46, + 0xff, 0xf7, 0xce, 0xff, 0x00, 0x23, 0x07, 0x22, 0x01, 0x21, 0x50, 0x46, + 0xd7, 0xf7, 0xde, 0xfd, 0x05, 0x00, 0x05, 0xd1, 0x00, 0xf0, 0x3c, 0xf9, + 0x50, 0x46, 0xe8, 0xf7, 0x70, 0xff, 0x05, 0x46, 0xdd, 0xf8, 0x40, 0x91, + 0x00, 0x21, 0x50, 0x46, 0xff, 0xf7, 0x22, 0xfc, 0x01, 0x22, 0x01, 0x21, + 0x50, 0x46, 0xd6, 0xf7, 0x2c, 0xf9, 0x49, 0x46, 0x40, 0x46, 0xfd, 0xf7, + 0x45, 0xfd, 0xd5, 0xf7, 0xe5, 0xf8, 0x06, 0x90, 0x83, 0x46, 0x12, 0xaa, + 0x04, 0xf1, 0x08, 0x01, 0x50, 0x46, 0xff, 0xf7, 0x31, 0xfa, 0x07, 0x94, + 0x2c, 0x46, 0x00, 0x2c, 0x40, 0xf0, 0x9e, 0x80, 0x07, 0x98, 0x90, 0xed, + 0x00, 0x8a, 0x00, 0x23, 0x00, 0x22, 0x49, 0x46, 0x40, 0x46, 0xfd, 0xf7, + 0xa5, 0xfd, 0xb4, 0xee, 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x28, 0xd5, + 0x07, 0x99, 0x38, 0x69, 0x49, 0x68, 0xb0, 0xfb, 0xf1, 0xf2, 0x01, 0xfb, + 0x12, 0x00, 0xe0, 0xb9, 0x01, 0x2e, 0x03, 0xd1, 0x02, 0x26, 0x01, 0x25, + 0x01, 0x22, 0x02, 0xe0, 0x01, 0x26, 0x01, 0x25, 0x00, 0x22, 0x01, 0x21, + 0x50, 0x46, 0xd7, 0xf7, 0xf1, 0xfd, 0x04, 0x00, 0x04, 0xd1, 0x01, 0x21, + 0x12, 0xa8, 0xff, 0xf7, 0xea, 0xfa, 0x04, 0x46, 0x6c, 0xb9, 0x41, 0xf2, + 0x88, 0x31, 0x50, 0x46, 0xff, 0xf7, 0xf8, 0xfa, 0x00, 0x28, 0x5a, 0xd0, + 0x62, 0xe0, 0x01, 0x25, 0x02, 0x2e, 0xe7, 0xd1, 0xe2, 0xe7, 0x00, 0x25, + 0x5e, 0xe0, 0x00, 0x2c, 0x5c, 0xd1, 0x05, 0xab, 0x0d, 0xf1, 0x16, 0x02, + 0x00, 0x21, 0x50, 0x46, 0xd8, 0xf7, 0x7e, 0xf9, 0xd5, 0xf7, 0x94, 0xf8, + 0x04, 0x46, 0x21, 0x46, 0x58, 0x46, 0xd5, 0xf7, 0xd3, 0xf8, 0x02, 0x46, + 0x49, 0x46, 0x40, 0x46, 0xfe, 0xf7, 0x59, 0xf9, 0xbd, 0xf9, 0x14, 0x00, + 0xbd, 0xf9, 0x16, 0x10, 0x04, 0x94, 0x03, 0x90, 0x02, 0x91, 0x01, 0x96, + 0x00, 0x22, 0x00, 0x92, 0x00, 0x23, 0x51, 0x98, 0x08, 0xa9, 0xbe, 0xf7, + 0x6e, 0xf8, 0xbd, 0xf9, 0x14, 0x00, 0xbd, 0xf9, 0x16, 0x10, 0x04, 0x90, + 0x00, 0x22, 0x08, 0xa8, 0x03, 0x91, 0x02, 0x92, 0x01, 0x90, 0x00, 0x23, + 0x00, 0x93, 0x32, 0x46, 0x49, 0x46, 0x40, 0x46, 0xfd, 0xf7, 0x7c, 0xfe, + 0xa3, 0x46, 0x04, 0x00, 0x0e, 0xd1, 0x00, 0x20, 0x05, 0xaa, 0x0d, 0xf1, + 0x16, 0x03, 0x03, 0x90, 0x01, 0x92, 0x00, 0x93, 0x02, 0x95, 0x00, 0x23, + 0x00, 0x22, 0x49, 0x46, 0x40, 0x46, 0xfd, 0xf7, 0x8b, 0xfd, 0x04, 0x46, + 0x3c, 0xb9, 0xbd, 0xf9, 0x14, 0x30, 0xbd, 0xf9, 0x16, 0x20, 0x00, 0x21, + 0x50, 0x46, 0xd8, 0xf7, 0xf1, 0xf8, 0x38, 0x69, 0x40, 0x1c, 0x38, 0x61, + 0x0a, 0xe0, 0x08, 0xa9, 0x12, 0xa8, 0xff, 0xf7, 0x9b, 0xfa, 0x18, 0xb9, + 0x09, 0x98, 0x16, 0x99, 0x88, 0x42, 0xa2, 0xd2, 0x40, 0xf6, 0x01, 0x34, + 0x50, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0x00, 0x2d, 0x7f, 0xf4, 0x5f, 0xaf, + 0x56, 0x46, 0x42, 0x46, 0x4b, 0x46, 0x24, 0xb9, 0x39, 0x46, 0x30, 0x46, + 0x00, 0xf0, 0x36, 0xf8, 0x04, 0x46, 0x01, 0x20, 0x8d, 0xf8, 0x00, 0x00, + 0x00, 0x22, 0x01, 0x21, 0x30, 0x46, 0xd7, 0xf7, 0x65, 0xfd, 0x82, 0x46, + 0x00, 0x23, 0x07, 0x22, 0x01, 0x21, 0x30, 0x46, 0xd7, 0xf7, 0x1c, 0xfd, + 0x05, 0x46, 0x00, 0xf0, 0x61, 0xf8, 0x30, 0x46, 0xe8, 0xf7, 0xbf, 0xfe, + 0x44, 0xb9, 0xba, 0xf1, 0x00, 0x0f, 0x18, 0xbf, 0x54, 0x46, 0x03, 0xd1, + 0x00, 0x2d, 0x14, 0xbf, 0x2c, 0x46, 0x04, 0x46, 0x00, 0x22, 0x00, 0x21, + 0x30, 0x46, 0xd6, 0xf7, 0x4e, 0xf8, 0xd5, 0xf7, 0x0b, 0xf8, 0x01, 0x46, + 0x06, 0x98, 0xd5, 0xf7, 0x4b, 0xf8, 0x78, 0x62, 0x21, 0x46, 0x38, 0x46, + 0xe5, 0xf7, 0xf7, 0xfb, 0x44, 0xb0, 0x20, 0x46, 0xbd, 0xec, 0x02, 0x8b, + 0xbd, 0xe8, 0xf2, 0x8f, 0x2d, 0xe9, 0xf8, 0x41, 0x85, 0xb0, 0x05, 0x46, + 0x0e, 0x46, 0x00, 0x20, 0x04, 0xac, 0x03, 0x90, 0x02, 0x90, 0x01, 0x94, + 0x0d, 0xf1, 0x12, 0x01, 0x00, 0x91, 0x17, 0x46, 0x98, 0x46, 0x00, 0x23, + 0x00, 0x22, 0x41, 0x46, 0x38, 0x46, 0xfd, 0xf7, 0x19, 0xfd, 0x04, 0x00, + 0x22, 0xd1, 0x00, 0x22, 0x41, 0x46, 0x38, 0x46, 0xfd, 0xf7, 0xdb, 0xfc, + 0x06, 0xf1, 0x14, 0x00, 0x00, 0x23, 0x80, 0xec, 0x02, 0x0a, 0xbd, 0xf8, + 0x12, 0x10, 0xb1, 0x83, 0x00, 0x22, 0xbd, 0xf8, 0x10, 0x00, 0xf0, 0x83, + 0x41, 0x46, 0x38, 0x46, 0xfd, 0xf7, 0xa6, 0xfc, 0x86, 0xed, 0x08, 0x0a, + 0x00, 0x26, 0xbd, 0xf9, 0x10, 0x30, 0xbd, 0xf9, 0x12, 0x20, 0xf1, 0xb2, + 0x28, 0x46, 0xd8, 0xf7, 0x67, 0xf8, 0x76, 0x1c, 0x41, 0x2e, 0xf4, 0xd3, + 0x20, 0x46, 0x06, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, 0x6b, 0x46, 0x07, 0x22, + 0x01, 0x21, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, + 0x0d, 0x46, 0x8c, 0xb0, 0xec, 0x68, 0x2f, 0x69, 0xae, 0x68, 0x80, 0x46, + 0x00, 0xf0, 0xee, 0xfb, 0x5f, 0xea, 0x00, 0x09, 0x3a, 0xd1, 0x04, 0xf1, + 0x08, 0x0a, 0x00, 0x20, 0x00, 0x21, 0x9a, 0xed, 0x00, 0x0a, 0xd6, 0xed, + 0x08, 0x0a, 0x38, 0x60, 0x79, 0x60, 0x00, 0x22, 0x04, 0xf1, 0x88, 0x00, + 0xb8, 0xee, 0x40, 0x0a, 0xca, 0xf8, 0x7c, 0x20, 0x60, 0xee, 0x20, 0x0a, + 0x9f, 0xed, 0x17, 0x1a, 0x01, 0x60, 0x42, 0x60, 0x81, 0x60, 0x41, 0x62, + 0x82, 0x62, 0x80, 0xee, 0x81, 0x8a, 0xd4, 0xf7, 0x8d, 0xff, 0xca, 0xf8, + 0x04, 0x00, 0x00, 0x20, 0x96, 0xed, 0x09, 0x0a, 0x38, 0xee, 0x00, 0x0a, + 0x8a, 0xed, 0x08, 0x0a, 0xd6, 0xed, 0x0a, 0x0a, 0x78, 0xee, 0x20, 0x0a, + 0xca, 0xed, 0x09, 0x0a, 0x96, 0xed, 0x0b, 0x0a, 0x38, 0xee, 0x00, 0x0a, + 0x8a, 0xed, 0x0a, 0x0a, 0xd6, 0xed, 0x0c, 0x0a, 0x78, 0xee, 0x20, 0x0a, + 0xca, 0xed, 0x0b, 0x0a, 0x84, 0xf8, 0xb4, 0x00, 0x04, 0xf1, 0x80, 0x02, + 0x04, 0xf1, 0x38, 0x00, 0x04, 0x92, 0x03, 0x90, 0xd8, 0xe0, 0x00, 0xbf, + 0x00, 0x00, 0x7a, 0x44, 0x88, 0x78, 0x00, 0x28, 0x1a, 0xd0, 0xd8, 0x69, + 0x40, 0x1c, 0xd8, 0x61, 0x88, 0x78, 0x01, 0x28, 0x02, 0xd1, 0x58, 0x6b, + 0x40, 0x1c, 0x58, 0x63, 0x88, 0x78, 0x02, 0x28, 0x02, 0xd1, 0x98, 0x6b, + 0x40, 0x1c, 0x98, 0x63, 0x88, 0x78, 0x03, 0x28, 0x02, 0xd1, 0xd8, 0x6b, + 0x40, 0x1c, 0xd8, 0x63, 0x88, 0x78, 0x04, 0x28, 0x72, 0xd1, 0x18, 0x6c, + 0x40, 0x1c, 0x18, 0x64, 0x6e, 0xe0, 0x89, 0xed, 0x09, 0x1a, 0xc9, 0xed, + 0x08, 0x1a, 0x89, 0xed, 0x07, 0x2a, 0xc9, 0xed, 0x06, 0x2a, 0x89, 0xed, + 0x05, 0x0a, 0x00, 0xf0, 0x9b, 0xfb, 0x99, 0xed, 0x06, 0x0a, 0xd9, 0xed, + 0x0a, 0x0a, 0x99, 0xed, 0x07, 0x1a, 0x20, 0xee, 0x20, 0x0a, 0xd9, 0xed, + 0x0b, 0x0a, 0x01, 0xee, 0x20, 0x0a, 0x99, 0xed, 0x08, 0x1a, 0xd9, 0xed, + 0x0c, 0x0a, 0x01, 0xee, 0x20, 0x0a, 0x99, 0xed, 0x09, 0x1a, 0xd9, 0xed, + 0x0d, 0x0a, 0x04, 0x46, 0x01, 0xee, 0x20, 0x0a, 0x00, 0xf0, 0x80, 0xfb, + 0x84, 0x42, 0x21, 0xd2, 0xa0, 0xeb, 0x04, 0x0b, 0x00, 0x98, 0x41, 0x69, + 0x83, 0x69, 0x8b, 0x45, 0x38, 0xbf, 0x8b, 0x46, 0x5b, 0x45, 0x88, 0xbf, + 0x5b, 0x46, 0xab, 0xb1, 0xf8, 0x6a, 0x40, 0x1c, 0xf8, 0x62, 0x02, 0x9a, + 0x06, 0x99, 0x40, 0x46, 0x00, 0xf0, 0x5c, 0xfd, 0x02, 0x99, 0x40, 0x46, + 0x00, 0xf0, 0x8d, 0xfd, 0x01, 0x90, 0x38, 0xb9, 0x05, 0x99, 0x40, 0x46, + 0x00, 0xf0, 0x8c, 0xfd, 0x10, 0xb1, 0x38, 0x6b, 0x40, 0x1c, 0x38, 0x63, + 0xd4, 0xf7, 0xfa, 0xfe, 0xc9, 0xf8, 0x0c, 0x00, 0xdd, 0xf8, 0x04, 0x90, + 0x29, 0x46, 0x40, 0x46, 0x01, 0xf0, 0x66, 0xf8, 0x2b, 0x69, 0x5c, 0x6c, + 0xea, 0x68, 0x6f, 0x68, 0xd5, 0xf8, 0x20, 0xe0, 0x64, 0x1c, 0x04, 0xf0, + 0x03, 0x04, 0x28, 0x20, 0x01, 0x21, 0x10, 0xfb, 0x04, 0xf0, 0x59, 0x61, + 0x18, 0x44, 0xb9, 0xf1, 0x00, 0x0f, 0x00, 0xf1, 0x48, 0x0b, 0x02, 0xf1, + 0x80, 0x01, 0x3f, 0xf4, 0x75, 0xaf, 0x98, 0x69, 0x40, 0x1c, 0x98, 0x61, + 0x4e, 0x69, 0x88, 0x69, 0x86, 0x19, 0x1e, 0x62, 0x08, 0x6a, 0xce, 0x69, + 0x86, 0x19, 0x1e, 0x63, 0x88, 0x6a, 0x4e, 0x6a, 0x86, 0x19, 0xde, 0x62, + 0xc3, 0xf8, 0x00, 0x90, 0xde, 0x68, 0x76, 0x1c, 0xde, 0x60, 0x50, 0x69, + 0xc3, 0xf8, 0xe8, 0x00, 0x16, 0x69, 0xcb, 0xf8, 0x08, 0x60, 0x08, 0x78, + 0x01, 0x28, 0x2b, 0xd1, 0x18, 0x69, 0x40, 0x1c, 0x18, 0x61, 0x11, 0x68, + 0xcb, 0xf8, 0x00, 0x10, 0x92, 0xf8, 0xb4, 0x00, 0x01, 0x28, 0x04, 0xbf, + 0x50, 0x68, 0xcb, 0xf8, 0x04, 0x00, 0x01, 0x21, 0x92, 0xf8, 0x3a, 0x00, + 0x82, 0xf8, 0xb4, 0x10, 0x8b, 0xf8, 0x0c, 0x00, 0x97, 0xed, 0x04, 0x0a, + 0xde, 0xed, 0x30, 0x0a, 0x60, 0xee, 0x20, 0x0a, 0xcb, 0xed, 0x04, 0x0a, + 0x10, 0x6e, 0xcb, 0xf8, 0x14, 0x00, 0x39, 0x68, 0xcb, 0xf8, 0x18, 0x10, + 0x78, 0x68, 0xcb, 0xf8, 0x1c, 0x00, 0xb9, 0x69, 0xcb, 0xf8, 0x20, 0x10, + 0xf8, 0x69, 0xcb, 0xf8, 0x24, 0x00, 0x5c, 0x64, 0x00, 0x21, 0x59, 0x61, + 0xe5, 0xf7, 0x92, 0xfa, 0x00, 0x28, 0x08, 0xbf, 0xb9, 0xf1, 0x00, 0x0f, + 0x40, 0xf0, 0x5a, 0x82, 0x03, 0x99, 0x08, 0x70, 0x00, 0x22, 0x03, 0x98, + 0x02, 0x74, 0x04, 0x98, 0x02, 0x70, 0x04, 0x99, 0x8a, 0x70, 0x01, 0x21, + 0xa8, 0x68, 0x01, 0x90, 0xd0, 0xf8, 0x00, 0xb0, 0xee, 0x68, 0xd5, 0xf8, + 0x18, 0xa0, 0x40, 0x46, 0x00, 0xf0, 0xcd, 0xfa, 0x00, 0x20, 0x86, 0xf8, + 0x38, 0x00, 0x06, 0xf1, 0x84, 0x04, 0x0c, 0xe0, 0x02, 0x28, 0x3c, 0xd0, + 0x06, 0xf1, 0x3c, 0x02, 0x51, 0x46, 0x40, 0x46, 0x01, 0xf0, 0x7a, 0xf9, + 0x00, 0x28, 0x4d, 0xd0, 0x00, 0x20, 0x86, 0xf8, 0xb4, 0x00, 0x0d, 0xf1, + 0x01, 0x03, 0xef, 0x68, 0x6a, 0x46, 0x0d, 0xf1, 0x02, 0x01, 0x40, 0x46, + 0x00, 0xf0, 0xe9, 0xfd, 0x9d, 0xf8, 0x00, 0x10, 0x40, 0x46, 0x00, 0xf0, + 0xfc, 0xfd, 0x07, 0xf1, 0x39, 0x00, 0x9d, 0xf8, 0x02, 0x10, 0x01, 0x70, + 0x9d, 0xf8, 0x00, 0x20, 0x42, 0x70, 0x9d, 0xf8, 0x01, 0x10, 0x81, 0x70, + 0x40, 0x46, 0x51, 0x46, 0x01, 0xf0, 0x39, 0xf9, 0x59, 0x46, 0x40, 0x46, + 0x01, 0xf0, 0x4f, 0xf9, 0x01, 0x28, 0xcf, 0xd1, 0x86, 0xf8, 0x82, 0x00, + 0x00, 0x21, 0x20, 0x68, 0x40, 0x1c, 0x20, 0x60, 0x86, 0xf8, 0xb4, 0x10, + 0x01, 0x9a, 0xd1, 0x68, 0x81, 0x42, 0x1e, 0xd2, 0x43, 0xf2, 0x01, 0x09, + 0x1b, 0xe0, 0x00, 0x20, 0x86, 0xf8, 0x38, 0x00, 0x21, 0x69, 0x49, 0x1c, + 0x21, 0x61, 0x86, 0xf8, 0xb4, 0x00, 0x40, 0x46, 0x00, 0xf0, 0xa1, 0xfd, + 0x01, 0x28, 0x02, 0xd1, 0xa0, 0x69, 0x40, 0x1c, 0xa0, 0x61, 0x40, 0x46, + 0x00, 0xf0, 0xa3, 0xfd, 0x01, 0x28, 0x06, 0xd1, 0x20, 0x6a, 0x40, 0x1c, + 0x20, 0x62, 0x02, 0xe0, 0x01, 0x20, 0x86, 0xf8, 0x38, 0x00, 0x03, 0x99, + 0x08, 0x78, 0x00, 0x28, 0x61, 0xd0, 0xb9, 0xf1, 0x00, 0x0f, 0x5e, 0xd1, + 0xd5, 0xf8, 0x0c, 0xa0, 0xd5, 0xf8, 0x1c, 0x90, 0xac, 0x68, 0x2e, 0x6a, + 0x0a, 0xf1, 0x4c, 0x01, 0x02, 0x91, 0x0a, 0xf1, 0x40, 0x0b, 0xea, 0x6a, + 0x01, 0x92, 0x67, 0x68, 0xd4, 0xf7, 0xfc, 0xfd, 0x00, 0x21, 0x8b, 0xf8, + 0x08, 0x10, 0x00, 0x90, 0x0a, 0xf1, 0x3c, 0x03, 0x32, 0x46, 0x49, 0x46, + 0x40, 0x46, 0x00, 0xf0, 0x55, 0xfb, 0x31, 0x46, 0x40, 0x46, 0x00, 0xf0, + 0x74, 0xfc, 0x5f, 0xea, 0x00, 0x09, 0x31, 0xd1, 0x39, 0x46, 0x40, 0x46, + 0x00, 0xf0, 0x72, 0xfc, 0x48, 0xb9, 0x02, 0x9a, 0x31, 0x46, 0x40, 0x46, + 0x00, 0xf0, 0x70, 0xfc, 0x30, 0xbb, 0x01, 0x20, 0x8b, 0xf8, 0x08, 0x00, + 0x2d, 0xe0, 0x01, 0x28, 0x0a, 0xf1, 0x88, 0x06, 0x0b, 0xd1, 0x02, 0x20, + 0x8a, 0xf8, 0x82, 0x00, 0x30, 0x68, 0x40, 0x1c, 0x30, 0x60, 0xe1, 0x68, + 0x81, 0x42, 0x15, 0xd2, 0x43, 0xf2, 0x02, 0x09, 0x12, 0xe0, 0x30, 0x69, + 0x40, 0x1c, 0x30, 0x61, 0x40, 0x46, 0x00, 0xf0, 0x42, 0xfd, 0x01, 0x28, + 0x02, 0xd1, 0xb0, 0x69, 0x40, 0x1c, 0xb0, 0x61, 0x40, 0x46, 0x00, 0xf0, + 0x44, 0xfd, 0x01, 0x28, 0x02, 0xd1, 0x30, 0x6a, 0x40, 0x1c, 0x30, 0x62, + 0x9b, 0xf8, 0x08, 0x00, 0x38, 0xb9, 0xd4, 0xf7, 0xb3, 0xfd, 0x01, 0x46, + 0x01, 0x98, 0x9b, 0xed, 0x00, 0x0a, 0x01, 0xf0, 0xab, 0xf9, 0x03, 0x99, + 0x08, 0x7c, 0x00, 0x28, 0x00, 0xf0, 0x8f, 0x80, 0xb9, 0xf1, 0x00, 0x0f, + 0x79, 0xd1, 0x2c, 0x68, 0x6e, 0x68, 0xa8, 0x68, 0x05, 0x90, 0xd5, 0xf8, + 0x0c, 0xa0, 0xa9, 0x6a, 0x07, 0x91, 0x0a, 0xf1, 0x3a, 0x01, 0xea, 0x6a, + 0x06, 0x92, 0x40, 0x46, 0x4a, 0x78, 0x8d, 0xf8, 0x09, 0x20, 0x0a, 0xf1, + 0x80, 0x07, 0x09, 0x78, 0x8d, 0xf8, 0x08, 0x10, 0xea, 0x69, 0x0a, 0x92, + 0x29, 0x6a, 0x09, 0x91, 0x02, 0x21, 0x00, 0xf0, 0xe2, 0xf9, 0xd4, 0xf7, + 0x87, 0xfd, 0x83, 0x46, 0xda, 0xf8, 0x00, 0x00, 0x59, 0x46, 0xd4, 0xf7, + 0xc5, 0xfd, 0xca, 0xf8, 0x04, 0x00, 0x0a, 0xf1, 0x4c, 0x03, 0x05, 0x99, + 0x0a, 0x69, 0x90, 0x42, 0x88, 0xbf, 0x10, 0x46, 0x08, 0x90, 0xca, 0xf8, + 0x00, 0xb0, 0x00, 0x20, 0x38, 0x70, 0x32, 0x46, 0x21, 0x46, 0x40, 0x46, + 0xf7, 0xf7, 0x60, 0xfc, 0xb8, 0xb3, 0x08, 0x98, 0x9d, 0xf8, 0x08, 0x10, + 0x01, 0x90, 0x00, 0x91, 0x0a, 0xf1, 0x4c, 0x03, 0x32, 0x46, 0x21, 0x46, + 0x40, 0x46, 0xf7, 0xf7, 0x9c, 0xfc, 0x10, 0xb1, 0x01, 0x28, 0x28, 0xd0, + 0x32, 0xe0, 0x01, 0x20, 0x38, 0x70, 0x07, 0x98, 0x01, 0xf0, 0xe6, 0xf9, + 0x32, 0x46, 0x21, 0x46, 0x40, 0x46, 0xf8, 0xf7, 0xb3, 0xf8, 0x03, 0x46, + 0x00, 0xf1, 0x1c, 0x02, 0x9d, 0xf8, 0x09, 0x10, 0x40, 0x46, 0x01, 0xf0, + 0x02, 0xfa, 0x9d, 0xf8, 0x09, 0x10, 0x07, 0x98, 0x01, 0xf0, 0xd7, 0xf9, + 0xcd, 0xf8, 0x00, 0xb0, 0x09, 0x9a, 0x0a, 0x99, 0xd6, 0xed, 0x07, 0x0a, + 0x96, 0xed, 0x03, 0x0a, 0x0a, 0xf1, 0x4c, 0x03, 0x40, 0x46, 0x00, 0xf0, + 0xec, 0xfc, 0x00, 0x20, 0x78, 0x60, 0xb8, 0x60, 0xf8, 0x60, 0x38, 0x78, + 0x98, 0xb1, 0x9d, 0xf8, 0x08, 0x20, 0x06, 0x98, 0x5b, 0x46, 0x0a, 0xf1, + 0x4c, 0x01, 0x01, 0xf0, 0x0c, 0xf9, 0x10, 0xe0, 0x03, 0x20, 0xb8, 0x70, + 0xf8, 0x68, 0x40, 0x1c, 0xf8, 0x60, 0x05, 0x99, 0xca, 0x68, 0x82, 0x42, + 0xeb, 0xd2, 0x43, 0xf2, 0x03, 0x09, 0x06, 0x98, 0x9a, 0xed, 0x10, 0x0a, + 0x59, 0x46, 0x01, 0xf0, 0x17, 0xf9, 0x04, 0x99, 0x88, 0x78, 0x00, 0x28, + 0x4c, 0xd1, 0xb9, 0xf1, 0x00, 0x0f, 0x62, 0xd1, 0xd5, 0xf8, 0x0c, 0xb0, + 0xac, 0x68, 0x68, 0x68, 0x01, 0x90, 0x2e, 0x68, 0xd5, 0xf8, 0x28, 0xa0, + 0x04, 0x21, 0x40, 0x46, 0x00, 0xf0, 0x5f, 0xf9, 0x0b, 0xf1, 0x81, 0x07, + 0x38, 0x78, 0x40, 0x1c, 0x38, 0x70, 0xc0, 0xb2, 0x21, 0x7a, 0x88, 0x42, + 0x34, 0xd3, 0x00, 0x20, 0x38, 0x70, 0x69, 0x46, 0x50, 0x46, 0x01, 0xf0, + 0x6d, 0xf9, 0x68, 0xb3, 0x9d, 0xf8, 0x00, 0x10, 0x50, 0x46, 0x08, 0x44, + 0x80, 0x78, 0x03, 0x46, 0x01, 0x9a, 0x31, 0x46, 0x40, 0x46, 0xf8, 0xf7, + 0x1d, 0xf8, 0xa8, 0xb1, 0x01, 0x9a, 0x31, 0x46, 0x40, 0x46, 0xf8, 0xf7, + 0x45, 0xf8, 0x03, 0x46, 0x00, 0xf1, 0x1c, 0x02, 0x9d, 0xf8, 0x00, 0x10, + 0x40, 0x46, 0x01, 0xf0, 0x94, 0xf9, 0x9d, 0xf8, 0x00, 0x10, 0x50, 0x46, + 0x01, 0xf0, 0x69, 0xf9, 0x00, 0x20, 0xcb, 0xf8, 0x90, 0x00, 0x0b, 0xe0, + 0x04, 0x21, 0x79, 0x70, 0xdb, 0xf8, 0x90, 0x00, 0x40, 0x1c, 0xcb, 0xf8, + 0x90, 0x00, 0xe1, 0x68, 0x81, 0x42, 0x38, 0xbf, 0x43, 0xf2, 0x04, 0x09, + 0x04, 0x99, 0x88, 0x78, 0xa8, 0xb1, 0xb9, 0xf1, 0x00, 0x0f, 0x12, 0xd1, + 0xe8, 0x68, 0x90, 0xf8, 0x82, 0x00, 0x6a, 0x68, 0x29, 0x68, 0xae, 0x69, + 0xac, 0x6a, 0x03, 0x28, 0x12, 0xbf, 0x04, 0x28, 0x40, 0x46, 0xf7, 0xf7, + 0xae, 0xfa, 0x20, 0x46, 0x01, 0xf0, 0x40, 0xf9, 0x30, 0x46, 0x01, 0xf0, + 0x56, 0xf8, 0xe5, 0xf7, 0xb1, 0xf8, 0x00, 0x28, 0x08, 0xbf, 0xb9, 0xf1, + 0x00, 0x0f, 0x7f, 0xf4, 0xb1, 0xad, 0x01, 0x90, 0x4f, 0xf0, 0x00, 0x0b, + 0xe9, 0x69, 0x06, 0x91, 0x00, 0x24, 0xaa, 0x68, 0x00, 0x92, 0xd5, 0xf8, + 0x0c, 0x90, 0x28, 0x6a, 0x00, 0x99, 0x02, 0x90, 0x00, 0x26, 0x48, 0x68, + 0x00, 0x99, 0x05, 0x90, 0xda, 0x46, 0x91, 0xed, 0x07, 0x8a, 0xd4, 0xf7, + 0x91, 0xfc, 0x01, 0x46, 0xd9, 0xf8, 0x0c, 0x00, 0xd4, 0xf7, 0xd0, 0xfc, + 0x00, 0xee, 0x10, 0x0a, 0x09, 0xf1, 0x38, 0x01, 0x89, 0xed, 0x04, 0x0a, + 0x09, 0xf1, 0x80, 0x07, 0x08, 0x78, 0x10, 0xb9, 0x4f, 0xf0, 0x01, 0x0b, + 0x0c, 0xe0, 0x08, 0x7c, 0x08, 0xb9, 0x01, 0x24, 0x08, 0xe0, 0x38, 0x78, + 0x20, 0xb9, 0xb8, 0x78, 0x03, 0x28, 0x18, 0xbf, 0x01, 0x26, 0x01, 0xd1, + 0x4f, 0xf0, 0x01, 0x0a, 0xd9, 0xed, 0x05, 0x0a, 0xf5, 0xee, 0x40, 0x0a, + 0x01, 0xee, 0x10, 0xaa, 0x01, 0xee, 0x90, 0x6a, 0x02, 0xee, 0x10, 0x4a, + 0x02, 0xee, 0x90, 0xba, 0xf1, 0xee, 0x10, 0xfa, 0xb8, 0xee, 0x40, 0x0a, + 0xb8, 0xee, 0xc1, 0x1a, 0xf8, 0xee, 0xe1, 0x1a, 0xb8, 0xee, 0xc2, 0x2a, + 0xf8, 0xee, 0xe2, 0x2a, 0x29, 0xdd, 0xb7, 0xee, 0x00, 0x3a, 0x33, 0xee, + 0x48, 0x3a, 0x63, 0xee, 0x20, 0x0a, 0x40, 0xee, 0x08, 0x0a, 0xb0, 0xee, + 0x60, 0x0a, 0xd9, 0xed, 0x06, 0x3a, 0xd9, 0xed, 0x07, 0x0a, 0x63, 0xee, + 0x23, 0x3a, 0x63, 0xee, 0x20, 0x0a, 0x42, 0xee, 0x88, 0x3a, 0x42, 0xee, + 0x08, 0x0a, 0xf0, 0xee, 0x63, 0x2a, 0xb0, 0xee, 0x60, 0x2a, 0xd9, 0xed, + 0x08, 0x3a, 0xd9, 0xed, 0x09, 0x0a, 0x63, 0xee, 0x23, 0x3a, 0x63, 0xee, + 0x20, 0x0a, 0x41, 0xee, 0x88, 0x3a, 0x41, 0xee, 0x08, 0x0a, 0xf0, 0xee, + 0x63, 0x1a, 0xb0, 0xee, 0x60, 0x1a, 0xe6, 0xe4, 0x28, 0x69, 0xc0, 0xf8, + 0x00, 0x90, 0x64, 0x21, 0x41, 0x60, 0x0c, 0xb0, 0x48, 0x46, 0xbd, 0xec, + 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, 0x2d, 0xe9, 0xf8, 0x4f, 0x84, 0xb0, + 0x0e, 0x68, 0x4c, 0x69, 0xca, 0x69, 0x03, 0x92, 0x05, 0x46, 0x4b, 0x6a, + 0x02, 0x93, 0x0a, 0x69, 0x01, 0x92, 0x4b, 0x68, 0x00, 0x93, 0xd1, 0xf8, + 0x18, 0xa0, 0xd1, 0xf8, 0x20, 0x90, 0xd1, 0xf8, 0x28, 0x80, 0xcf, 0x68, + 0xd1, 0xf8, 0x2c, 0xb0, 0x01, 0xf0, 0x9e, 0xf8, 0x59, 0x46, 0x28, 0x46, + 0x00, 0xf0, 0xca, 0xff, 0x52, 0x46, 0x21, 0x46, 0x28, 0x46, 0x00, 0xf0, + 0xb7, 0xfd, 0x04, 0x00, 0x05, 0xd1, 0x03, 0x99, 0x4a, 0x46, 0x28, 0x46, + 0x00, 0xf0, 0x72, 0xf8, 0x04, 0x46, 0x8c, 0xbb, 0x02, 0x99, 0x42, 0x46, + 0x28, 0x46, 0x01, 0xf0, 0x04, 0xf8, 0x04, 0x46, 0x54, 0xbb, 0x00, 0x9a, + 0x31, 0x46, 0x28, 0x46, 0xf7, 0xf7, 0xda, 0xf9, 0x07, 0xf1, 0x38, 0x00, + 0x00, 0x21, 0x07, 0xf1, 0x80, 0x05, 0x01, 0x70, 0x01, 0x74, 0x29, 0x70, + 0xa9, 0x70, 0x69, 0x70, 0xd4, 0xf7, 0xe0, 0xfb, 0x38, 0x60, 0xec, 0x21, + 0x00, 0x20, 0x78, 0x60, 0x38, 0x61, 0x78, 0x61, 0xb8, 0x61, 0xf8, 0x61, + 0x38, 0x62, 0x78, 0x62, 0x68, 0x60, 0xa8, 0x60, 0xe8, 0x60, 0x28, 0x61, + 0x68, 0x61, 0xa8, 0x61, 0xe8, 0x61, 0x68, 0x62, 0x28, 0x62, 0xa8, 0x62, + 0x04, 0x48, 0x00, 0x6b, 0xb8, 0x60, 0x01, 0x98, 0xce, 0xf7, 0xf4, 0xf9, + 0x20, 0x46, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0xfc, 0x64, 0x03, 0x20, + 0x2d, 0xe9, 0xf0, 0x41, 0x4f, 0x69, 0xcd, 0x69, 0x8c, 0x69, 0x0e, 0x6a, + 0xc9, 0x6a, 0x80, 0x46, 0x00, 0xf0, 0x84, 0xff, 0x22, 0x46, 0x39, 0x46, + 0x40, 0x46, 0x00, 0xf0, 0x67, 0xfd, 0x30, 0xb9, 0x32, 0x46, 0x29, 0x46, + 0x40, 0x46, 0xbd, 0xe8, 0xf0, 0x41, 0x00, 0xf0, 0x21, 0xb8, 0xbd, 0xe8, + 0xf0, 0x81, 0x0a, 0x46, 0x01, 0x21, 0x81, 0x40, 0x04, 0x20, 0xec, 0xf7, + 0xaf, 0xbb, 0x00, 0x00, 0x10, 0xee, 0x10, 0x0a, 0xc0, 0xf3, 0xc7, 0x51, + 0x7e, 0x39, 0x0e, 0xd4, 0xc2, 0x17, 0xd1, 0xf1, 0x20, 0x01, 0x06, 0xdd, + 0x00, 0x02, 0x40, 0xf0, 0x00, 0x40, 0xc8, 0x40, 0x50, 0x41, 0x50, 0x40, + 0x70, 0x47, 0xd0, 0x43, 0x80, 0xf0, 0x00, 0x40, 0x70, 0x47, 0x00, 0x20, + 0x70, 0x47, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0x2d, 0xed, 0x02, 0x8b, + 0x8a, 0xb0, 0x80, 0x46, 0x0d, 0x46, 0x16, 0x46, 0x0a, 0x20, 0x00, 0x21, + 0x09, 0x96, 0x08, 0x90, 0x07, 0x91, 0x01, 0x20, 0x6a, 0x7f, 0x05, 0x91, + 0x06, 0x92, 0x03, 0x21, 0x04, 0x91, 0x03, 0x91, 0x00, 0x21, 0xdf, 0xf8, + 0xa8, 0x25, 0x02, 0x92, 0x01, 0x90, 0x00, 0x91, 0xb7, 0xee, 0x00, 0x1a, + 0xd5, 0xed, 0x08, 0x0a, 0x9f, 0xed, 0xdc, 0x0a, 0x00, 0x23, 0x00, 0x22, + 0x02, 0x21, 0x40, 0x46, 0xe8, 0xf7, 0x0e, 0xfe, 0x06, 0xf1, 0x20, 0x02, + 0x02, 0x92, 0x00, 0x20, 0x01, 0x90, 0x00, 0x90, 0x14, 0x23, 0x2a, 0x7f, + 0x02, 0x21, 0x40, 0x46, 0xe8, 0xf7, 0xd6, 0xfc, 0x06, 0xf1, 0x40, 0x00, + 0x00, 0x21, 0x07, 0x90, 0x06, 0x91, 0x01, 0x22, 0x02, 0x91, 0x05, 0x92, + 0x04, 0x92, 0x03, 0x92, 0x01, 0x92, 0x00, 0x92, 0x00, 0xf0, 0x8a, 0xf8, + 0x06, 0xf1, 0x58, 0x00, 0x07, 0x90, 0x00, 0x21, 0x01, 0x20, 0x06, 0x91, + 0x05, 0x91, 0x04, 0x91, 0x03, 0x90, 0x02, 0x91, 0x01, 0x22, 0x00, 0x90, + 0x01, 0x92, 0x00, 0xf0, 0x7b, 0xf8, 0x06, 0xf1, 0x70, 0x00, 0x00, 0xf0, + 0x88, 0xf8, 0x06, 0xf1, 0x88, 0x00, 0x00, 0xf0, 0x84, 0xf8, 0x31, 0x46, + 0x40, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0x95, 0xed, 0x00, 0x0a, 0x00, 0xf0, + 0x64, 0xf8, 0xbc, 0xf7, 0x79, 0xfc, 0x00, 0xf0, 0x6d, 0xf8, 0xe8, 0xf7, + 0xf7, 0xfb, 0x06, 0xf1, 0xa8, 0x07, 0xbd, 0xf8, 0x08, 0x00, 0x38, 0x80, + 0x95, 0xed, 0x01, 0x0a, 0x00, 0xf0, 0x55, 0xf8, 0xd9, 0xf7, 0xc2, 0xfc, + 0x00, 0xf0, 0x5e, 0xf8, 0xe8, 0xf7, 0xbf, 0xfb, 0x04, 0x00, 0xbd, 0xf8, + 0x08, 0x00, 0x78, 0x80, 0x29, 0x7f, 0xb9, 0x71, 0x36, 0xd1, 0x02, 0x21, + 0x40, 0x46, 0xe8, 0xf7, 0x83, 0xfb, 0x08, 0xee, 0x10, 0x0a, 0x02, 0x21, + 0x40, 0x46, 0xe8, 0xf7, 0x8a, 0xfb, 0x08, 0xee, 0x90, 0x0a, 0x40, 0x46, + 0xca, 0xf7, 0xfe, 0xfa, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, + 0x87, 0xed, 0x04, 0x0a, 0xb8, 0xee, 0x48, 0x0a, 0x87, 0xed, 0x06, 0x0a, + 0xf8, 0xee, 0x68, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0xc7, 0xed, 0x05, 0x0a, + 0x87, 0xed, 0x07, 0x0a, 0x02, 0x21, 0x6a, 0x6a, 0x95, 0xed, 0x0a, 0x0a, + 0x40, 0x46, 0xe9, 0xf7, 0x1d, 0xf8, 0xf8, 0x71, 0x0a, 0x22, 0x39, 0x88, + 0xd5, 0xed, 0x0c, 0x0a, 0x95, 0xed, 0x0b, 0x0a, 0xe9, 0xf7, 0x76, 0xf8, + 0xb0, 0xf5, 0x80, 0x7f, 0x38, 0x81, 0x28, 0xbf, 0x43, 0xf2, 0x07, 0x04, + 0x7b, 0x88, 0x3a, 0x88, 0x06, 0xf1, 0xc8, 0x01, 0x05, 0xf1, 0x38, 0x00, + 0x01, 0xf0, 0x0c, 0xf9, 0x00, 0x20, 0xc6, 0xf8, 0x4c, 0x02, 0x0a, 0xb0, + 0x20, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf0, 0x81, 0xd5, 0xed, + 0x02, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0x70, 0x47, + 0x00, 0x23, 0x06, 0xf1, 0x20, 0x01, 0x40, 0x46, 0xe8, 0xf7, 0x51, 0xbc, + 0x02, 0xa8, 0xbc, 0xee, 0xc0, 0x0a, 0x01, 0x90, 0x8d, 0xed, 0x00, 0x0a, + 0x02, 0x22, 0x2b, 0x7f, 0x02, 0x21, 0x40, 0x46, 0x70, 0x47, 0x00, 0x21, + 0x07, 0x90, 0x06, 0x91, 0x05, 0x91, 0x00, 0x23, 0x03, 0x91, 0x02, 0x91, + 0x01, 0x91, 0x04, 0x93, 0x00, 0x93, 0x01, 0x22, 0x06, 0xf1, 0x20, 0x01, + 0x40, 0x46, 0xe8, 0xf7, 0x36, 0xbc, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x47, + 0x2d, 0xed, 0x02, 0x8b, 0x15, 0x46, 0x1f, 0x46, 0x89, 0x46, 0x0a, 0x9a, + 0x97, 0xed, 0x01, 0x0a, 0x05, 0xf1, 0xc8, 0x01, 0x09, 0xf1, 0x38, 0x00, + 0x01, 0xf0, 0xd8, 0xf8, 0xc5, 0xf8, 0x4c, 0x02, 0x05, 0xf1, 0xa8, 0x06, + 0x01, 0xf0, 0xfa, 0xf8, 0x71, 0x88, 0x32, 0x88, 0x18, 0xb1, 0x43, 0x88, + 0x90, 0xed, 0x01, 0x8a, 0x5b, 0xe0, 0xb7, 0xf8, 0x00, 0xc0, 0xb9, 0xf8, + 0x18, 0x30, 0xd7, 0xed, 0x02, 0x1a, 0x97, 0xed, 0x01, 0x8a, 0x00, 0xee, + 0x90, 0xca, 0x00, 0xee, 0x10, 0x3a, 0xf8, 0xee, 0x60, 0x0a, 0xb3, 0xee, + 0x04, 0x1a, 0xb8, 0xee, 0x40, 0x0a, 0x80, 0xee, 0x81, 0x1a, 0x20, 0xee, + 0x01, 0x1a, 0x99, 0xed, 0x03, 0x0a, 0xbd, 0xee, 0xc1, 0x1a, 0xb4, 0xee, + 0x61, 0x0a, 0x10, 0x46, 0x11, 0xee, 0x10, 0xca, 0x0b, 0x46, 0xf1, 0xee, + 0x10, 0xfa, 0xd9, 0xed, 0x04, 0x0a, 0x99, 0xed, 0x05, 0x1a, 0xa8, 0xbf, + 0x03, 0x46, 0x32, 0xda, 0x1f, 0xfa, 0x8c, 0xfc, 0xf4, 0xee, 0x61, 0x0a, + 0x02, 0xee, 0x10, 0xca, 0xf1, 0xee, 0x10, 0xfa, 0xb8, 0xee, 0x42, 0x2a, + 0x10, 0xdb, 0x01, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x41, 0x1a, 0x32, 0xee, + 0x41, 0x2a, 0x70, 0xee, 0xc0, 0x0a, 0xc2, 0xee, 0x20, 0x0a, 0x31, 0xee, + 0xc0, 0x0a, 0x00, 0xee, 0x80, 0x1a, 0xbd, 0xee, 0xc1, 0x0a, 0x14, 0xe0, + 0xb4, 0xee, 0x61, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x11, 0xdb, 0x00, 0xee, + 0x10, 0x3a, 0xb8, 0xee, 0x40, 0x0a, 0x30, 0xee, 0x42, 0x0a, 0x31, 0xee, + 0x60, 0x1a, 0x80, 0xee, 0x01, 0x0a, 0x71, 0xee, 0xe0, 0x0a, 0x00, 0xee, + 0x20, 0x2a, 0xbd, 0xee, 0xc2, 0x0a, 0x10, 0xee, 0x10, 0x3a, 0x05, 0xf1, + 0xa8, 0x01, 0x10, 0x46, 0x9b, 0xb2, 0x98, 0x42, 0x4f, 0x88, 0x38, 0xbf, + 0x18, 0x46, 0x87, 0x42, 0x88, 0xbf, 0x07, 0x46, 0xb0, 0xee, 0x48, 0x0a, + 0x05, 0xf1, 0x60, 0x08, 0xe8, 0xf7, 0x1c, 0xfc, 0xc8, 0xe9, 0x00, 0x01, + 0x86, 0xed, 0x03, 0x8a, 0x39, 0x46, 0xb0, 0x79, 0xe8, 0xf7, 0x81, 0xfb, + 0x04, 0x46, 0xe8, 0xf7, 0x78, 0xfb, 0xb7, 0x80, 0x6f, 0x84, 0xac, 0x62, + 0x40, 0x1e, 0x05, 0xf1, 0x52, 0x04, 0x9f, 0xed, 0xb0, 0x1a, 0x60, 0x70, + 0x88, 0xf8, 0x0b, 0x00, 0x38, 0x46, 0xb9, 0xf8, 0x1a, 0x10, 0x00, 0xee, + 0x10, 0x0a, 0x00, 0xee, 0x90, 0x1a, 0xb8, 0xee, 0x40, 0x8a, 0xf8, 0xee, + 0x60, 0x0a, 0x20, 0xee, 0x81, 0x1a, 0x96, 0xed, 0x05, 0x0a, 0x21, 0xee, + 0x00, 0x0a, 0x80, 0xee, 0x08, 0x0a, 0xd9, 0xf7, 0x91, 0xfb, 0x00, 0xf0, + 0x65, 0xf8, 0x28, 0xbf, 0x43, 0xf6, 0xff, 0x70, 0xe8, 0x60, 0x39, 0x46, + 0xb0, 0x79, 0xd9, 0xed, 0x0c, 0x0a, 0x99, 0xed, 0x0b, 0x0a, 0x03, 0x28, + 0x0c, 0xbf, 0x4f, 0xf0, 0x08, 0x0a, 0x4f, 0xf0, 0x0a, 0x0a, 0xf0, 0x79, + 0x52, 0x46, 0xe8, 0xf7, 0x6b, 0xff, 0xf1, 0x68, 0x30, 0x81, 0x21, 0xf0, + 0x00, 0x41, 0x00, 0xee, 0x10, 0x1a, 0x28, 0xee, 0x00, 0x0a, 0xd9, 0xed, + 0x0d, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x46, 0xbf, + 0x82, 0x46, 0xf0, 0x79, 0x00, 0x20, 0x85, 0xf8, 0x25, 0x00, 0x85, 0xf8, + 0x13, 0xa0, 0x01, 0x21, 0x8d, 0x48, 0xa8, 0x60, 0x21, 0x70, 0x88, 0xf8, + 0x0a, 0x10, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf0, 0x87, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x14, 0x46, 0x00, 0xee, 0x10, 0x3a, + 0xb8, 0xee, 0x40, 0x0a, 0xdf, 0xed, 0x83, 0x0a, 0x20, 0xee, 0x20, 0x0a, + 0x94, 0xed, 0x2f, 0x1a, 0x60, 0x8c, 0x20, 0xee, 0x01, 0x1a, 0x00, 0xee, + 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x81, 0xee, 0x00, 0x0a, 0xd9, 0xf7, + 0x41, 0xfb, 0x00, 0xf0, 0x15, 0xf8, 0x28, 0xbf, 0x43, 0xf6, 0xff, 0x70, + 0xe0, 0x60, 0x94, 0xf8, 0xae, 0x00, 0x03, 0x28, 0x0c, 0xbf, 0x08, 0x20, + 0x0a, 0x20, 0xe0, 0x74, 0x00, 0x21, 0x00, 0x20, 0x84, 0xf8, 0x25, 0x00, + 0xa1, 0x60, 0x04, 0xf1, 0x52, 0x00, 0x01, 0x70, 0x01, 0x76, 0x10, 0xbd, + 0xbc, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0xb0, 0xf5, 0x80, 0x4f, + 0x70, 0x47, 0x0a, 0x46, 0x00, 0x23, 0x11, 0x21, 0xe9, 0xf7, 0xd7, 0xb8, + 0x0a, 0x46, 0x11, 0x21, 0xe9, 0xf7, 0x28, 0xbb, 0x2d, 0xe9, 0xf0, 0x4d, + 0x2d, 0xed, 0x0a, 0x8b, 0x0d, 0x46, 0x90, 0xb0, 0x16, 0x46, 0x11, 0x21, + 0xe9, 0xf7, 0xb9, 0xfb, 0x80, 0x46, 0x63, 0x4a, 0x41, 0x46, 0x02, 0x20, + 0xe8, 0xf7, 0x8b, 0xfc, 0x03, 0x28, 0x07, 0x46, 0x04, 0xd0, 0x41, 0x46, + 0x02, 0x20, 0xe8, 0xf7, 0xa6, 0xfc, 0x04, 0x00, 0x00, 0xf0, 0xaf, 0x80, + 0x35, 0xf8, 0xac, 0x1f, 0xa8, 0x78, 0x22, 0x46, 0xe8, 0xf7, 0x2c, 0xfe, + 0xb0, 0xee, 0x40, 0x8a, 0x00, 0x22, 0x41, 0x46, 0x02, 0x20, 0xe8, 0xf7, + 0x9a, 0xfc, 0xcd, 0xe9, 0x0e, 0x01, 0x01, 0x22, 0x41, 0x46, 0x02, 0x20, + 0xe8, 0xf7, 0x93, 0xfc, 0x82, 0x46, 0x8b, 0x46, 0x0a, 0xa8, 0x0c, 0xa9, + 0x01, 0x90, 0x00, 0x91, 0x01, 0x23, 0x00, 0x22, 0x41, 0x46, 0x02, 0x20, + 0xe8, 0xf7, 0x9c, 0xfc, 0x06, 0xa8, 0x00, 0x90, 0x08, 0xab, 0x00, 0x22, + 0x41, 0x46, 0x02, 0x20, 0xe8, 0xf7, 0xe7, 0xfc, 0x02, 0xa8, 0x00, 0x90, + 0x04, 0xab, 0x01, 0x22, 0x41, 0x46, 0x02, 0x20, 0xe8, 0xf7, 0xdf, 0xfc, + 0xdd, 0xe9, 0x0e, 0x01, 0x00, 0xf0, 0x9b, 0xf8, 0xf0, 0xee, 0x40, 0x8a, + 0xb0, 0xee, 0x48, 0x0a, 0x50, 0x46, 0x59, 0x46, 0xe8, 0xf7, 0xfa, 0xfc, + 0xdd, 0xe9, 0x0c, 0x01, 0xf0, 0xee, 0x40, 0xba, 0x00, 0xf0, 0x8d, 0xf8, + 0xdd, 0xe9, 0x0a, 0x01, 0xb0, 0xee, 0x40, 0xba, 0x00, 0xf0, 0x87, 0xf8, + 0xdd, 0xe9, 0x08, 0x01, 0xb0, 0xee, 0x40, 0xca, 0x00, 0xf0, 0x81, 0xf8, + 0xdd, 0xe9, 0x06, 0x01, 0xb0, 0xee, 0x40, 0x9a, 0x00, 0xf0, 0x7b, 0xf8, + 0xdd, 0xe9, 0x04, 0x01, 0xf0, 0xee, 0x40, 0x9a, 0x00, 0xf0, 0x75, 0xf8, + 0xdd, 0xe9, 0x02, 0x01, 0xb0, 0xee, 0x40, 0xaa, 0x00, 0xf0, 0x6f, 0xf8, + 0xe8, 0x68, 0x30, 0x60, 0xf0, 0xee, 0x40, 0xaa, 0x29, 0x69, 0x71, 0x60, + 0x00, 0x27, 0x28, 0x88, 0x30, 0x81, 0x95, 0xed, 0x02, 0x0a, 0xd5, 0xed, + 0x05, 0x0a, 0x34, 0x61, 0x60, 0xee, 0x20, 0x0a, 0xc6, 0xed, 0x03, 0x0a, + 0xc6, 0xed, 0x05, 0xba, 0xc6, 0xed, 0x06, 0x8a, 0xb0, 0xee, 0x4c, 0x0a, + 0xf5, 0xf7, 0x70, 0xfc, 0x1f, 0x4c, 0x00, 0xf0, 0x4a, 0xf8, 0x00, 0xf0, + 0x3d, 0xf8, 0xb0, 0xee, 0x4b, 0x0a, 0xf5, 0xf7, 0x67, 0xfc, 0x00, 0xf0, + 0x3c, 0xf8, 0xf5, 0xf7, 0x1d, 0xfd, 0x06, 0xf1, 0x1c, 0x00, 0x80, 0xec, + 0x02, 0x0a, 0xb0, 0xee, 0x6a, 0x0a, 0xf5, 0xf7, 0x5b, 0xfc, 0x00, 0xf0, + 0x36, 0xf8, 0x00, 0xf0, 0x29, 0xf8, 0xb0, 0xee, 0x4a, 0x0a, 0xf5, 0xf7, + 0x53, 0xfc, 0x00, 0xf0, 0x28, 0xf8, 0x06, 0xf1, 0x24, 0x00, 0x80, 0xec, + 0x02, 0x0a, 0xb0, 0xee, 0x69, 0x0a, 0xf5, 0xf7, 0x49, 0xfc, 0x00, 0xf0, + 0x24, 0xf8, 0x00, 0xf0, 0x17, 0xf8, 0xb0, 0xee, 0x49, 0x0a, 0xf5, 0xf7, + 0x41, 0xfc, 0x00, 0xf0, 0x16, 0xf8, 0x06, 0xf1, 0x2c, 0x00, 0x80, 0xec, + 0x02, 0x0a, 0x10, 0xb0, 0x38, 0x46, 0xbd, 0xec, 0x0a, 0x8b, 0xbd, 0xe8, + 0xf0, 0x8d, 0x00, 0x00, 0x6f, 0x12, 0x83, 0x3a, 0x00, 0x10, 0x10, 0x00, + 0x04, 0x56, 0x00, 0x20, 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, 0x60, 0x8a, + 0x70, 0x47, 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, 0xf5, 0xf7, + 0xd0, 0xbb, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x94, 0xec, + 0x02, 0x0a, 0xf5, 0xf7, 0xee, 0xbb, 0xb0, 0xee, 0x48, 0x0a, 0xe8, 0xf7, + 0x63, 0xbc, 0x80, 0xb5, 0x11, 0x21, 0xe9, 0xf7, 0xd2, 0xfa, 0xbd, 0xe8, + 0x04, 0x40, 0x01, 0x46, 0x02, 0x20, 0xe8, 0xf7, 0xba, 0xbb, 0x80, 0xb5, + 0x11, 0x21, 0xe9, 0xf7, 0xc8, 0xfa, 0xbd, 0xe8, 0x04, 0x40, 0x01, 0x46, + 0x02, 0x20, 0xe8, 0xf7, 0xb6, 0xbb, 0x2d, 0xe9, 0xf8, 0x43, 0x04, 0x46, + 0x0d, 0x46, 0x90, 0x46, 0x1f, 0x46, 0xbd, 0xf7, 0x9b, 0xf8, 0x06, 0x46, + 0x31, 0x46, 0x20, 0x46, 0xbd, 0xf7, 0xad, 0xf8, 0x81, 0x46, 0x31, 0x46, + 0x20, 0x46, 0xbd, 0xf7, 0xbe, 0xf8, 0x2e, 0x70, 0x88, 0xf8, 0x00, 0x90, + 0x38, 0x70, 0xbd, 0xe8, 0xf1, 0x83, 0x10, 0xb5, 0x04, 0x46, 0xbd, 0xf7, + 0xbe, 0xf8, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x11, 0x21, 0xe9, 0xf7, + 0x80, 0xba, 0xf8, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x82, 0xb0, 0x1e, 0x46, + 0x06, 0xf1, 0x24, 0x00, 0xf0, 0xee, 0x40, 0x8a, 0xb0, 0xee, 0x60, 0x8a, + 0x0a, 0x9f, 0x0c, 0x46, 0x15, 0x46, 0x90, 0xec, 0x02, 0x0a, 0xf6, 0xf7, + 0x1b, 0xfa, 0x30, 0x89, 0xd6, 0xed, 0x05, 0x0a, 0x00, 0x90, 0xf0, 0xee, + 0x60, 0x1a, 0x80, 0xee, 0x20, 0x1a, 0xd5, 0xf8, 0x4c, 0x22, 0x95, 0xed, + 0x2d, 0x0a, 0xb0, 0xee, 0x48, 0x2a, 0xf0, 0xee, 0x68, 0x0a, 0x3b, 0x46, + 0x05, 0xf1, 0xc8, 0x01, 0x04, 0xf1, 0x38, 0x00, 0x00, 0xf0, 0xa1, 0xfe, + 0x02, 0xb0, 0xbd, 0xec, 0x02, 0x8b, 0xf1, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, + 0x8c, 0xb0, 0x81, 0x46, 0x00, 0x25, 0xdf, 0xf8, 0x90, 0x63, 0xdf, 0xf8, + 0x90, 0xb3, 0xdf, 0xf8, 0x90, 0x83, 0x28, 0x46, 0xca, 0xf7, 0xda, 0xf8, + 0x82, 0x46, 0x28, 0x21, 0xdf, 0xf8, 0x84, 0x03, 0x69, 0x43, 0x44, 0x18, + 0x24, 0x20, 0xff, 0x22, 0x68, 0x43, 0x22, 0x60, 0x58, 0x44, 0xc4, 0xf8, + 0x04, 0x80, 0x00, 0xf5, 0xd2, 0x61, 0x0b, 0xeb, 0x05, 0x22, 0xa1, 0x60, + 0x02, 0xf5, 0xc5, 0x50, 0x4f, 0xf4, 0x14, 0x71, 0x69, 0x43, 0x59, 0x44, + 0x20, 0x61, 0x01, 0xf5, 0xe5, 0x52, 0x70, 0x20, 0x68, 0x43, 0x58, 0x44, + 0x42, 0xf2, 0xe0, 0x51, 0x62, 0x61, 0x01, 0x44, 0xb8, 0x22, 0xec, 0x20, + 0x6a, 0x43, 0x68, 0x43, 0xa1, 0x61, 0x5a, 0x44, 0x58, 0x44, 0xe2, 0x61, + 0x00, 0xf5, 0x38, 0x71, 0x4f, 0xf4, 0x8c, 0x62, 0x6a, 0x43, 0x5a, 0x44, + 0x21, 0x62, 0x02, 0xf5, 0xe4, 0x60, 0xba, 0xf1, 0xff, 0x0f, 0x60, 0x62, + 0x12, 0xd1, 0xca, 0xf7, 0x5e, 0xf8, 0x82, 0x46, 0x00, 0x27, 0x2a, 0xfa, + 0x07, 0xf0, 0xc0, 0x07, 0x06, 0xd4, 0x38, 0x46, 0xf7, 0xf7, 0xfa, 0xfc, + 0xe0, 0x60, 0x30, 0x68, 0x40, 0xf8, 0x27, 0x40, 0x7f, 0x1c, 0x08, 0x2f, + 0xf1, 0xd3, 0x1d, 0xe0, 0x50, 0x46, 0xf7, 0xf7, 0xef, 0xfc, 0xe0, 0x60, + 0x29, 0xfa, 0x0a, 0xf1, 0x30, 0x68, 0x40, 0xf8, 0x2a, 0x40, 0xca, 0x07, + 0x12, 0xd5, 0x69, 0x46, 0x50, 0x46, 0x00, 0xf0, 0x34, 0xf8, 0x08, 0xf5, + 0xba, 0x71, 0x50, 0x46, 0x00, 0xf0, 0xc8, 0xff, 0x69, 0x46, 0x50, 0x46, + 0xff, 0xf7, 0x8d, 0xfb, 0x01, 0x00, 0x03, 0xd0, 0x03, 0x22, 0x02, 0x20, + 0xd7, 0xf7, 0xca, 0xfc, 0x6d, 0x1c, 0x04, 0x2d, 0x91, 0xd3, 0xfe, 0xe0, + 0x80, 0xb5, 0x00, 0xf0, 0x09, 0xf8, 0xd4, 0xf7, 0x0e, 0xf8, 0x02, 0xbd, + 0x80, 0xb5, 0x00, 0xf0, 0x03, 0xf8, 0xd3, 0xf7, 0xf3, 0xff, 0x02, 0xbd, + 0x00, 0x92, 0x0b, 0x46, 0x02, 0x46, 0x4f, 0xf4, 0xc0, 0x71, 0xa3, 0x48, + 0x70, 0x47, 0x10, 0xb5, 0x8c, 0xb0, 0xe4, 0xf7, 0x97, 0xfb, 0x04, 0x46, + 0x69, 0x46, 0x00, 0xf0, 0x06, 0xf8, 0x69, 0x46, 0x20, 0x46, 0xfe, 0xf7, + 0xcd, 0xff, 0x0c, 0xb0, 0x10, 0xbd, 0x70, 0xb5, 0x0c, 0x46, 0xca, 0xf7, + 0x2b, 0xf8, 0x99, 0x49, 0x21, 0x60, 0x01, 0xf1, 0xc0, 0x02, 0x62, 0x61, + 0x01, 0xf1, 0xd8, 0x03, 0xe3, 0x61, 0x01, 0xf5, 0x9e, 0x72, 0x24, 0x25, + 0x62, 0x62, 0x45, 0x43, 0x01, 0xf5, 0xa0, 0x71, 0xec, 0x23, 0xa1, 0x60, + 0x43, 0x43, 0x8f, 0x4a, 0x15, 0x44, 0x13, 0x44, 0x03, 0xf5, 0x38, 0x71, + 0x05, 0xf5, 0xd2, 0x63, 0x63, 0x60, 0x21, 0x61, 0x4f, 0xf4, 0x14, 0x73, + 0x43, 0x43, 0x02, 0xeb, 0x00, 0x21, 0x13, 0x44, 0x01, 0xf5, 0xc5, 0x55, + 0x03, 0xf5, 0xe5, 0x51, 0xa5, 0x61, 0x21, 0x62, 0x70, 0x25, 0xb8, 0x26, + 0x4f, 0xf4, 0x8c, 0x61, 0x45, 0x43, 0x46, 0x43, 0x48, 0x43, 0x15, 0x44, + 0x42, 0xf2, 0xe0, 0x53, 0x16, 0x44, 0x10, 0x44, 0x2b, 0x44, 0xe6, 0x60, + 0x00, 0xf5, 0xe4, 0x62, 0xa3, 0x62, 0xe2, 0x62, 0x70, 0xbd, 0xf8, 0xb5, + 0x0c, 0x46, 0x15, 0x46, 0x1e, 0x46, 0xe4, 0xf7, 0x49, 0xfb, 0xc9, 0xf7, + 0xe9, 0xff, 0xec, 0x21, 0x76, 0x4a, 0x48, 0x43, 0x10, 0x44, 0x00, 0x27, + 0x00, 0xf5, 0x38, 0x71, 0x1e, 0xb1, 0x02, 0x2e, 0x0b, 0xd0, 0x0a, 0xd3, + 0x0b, 0xe0, 0x14, 0x26, 0x28, 0x68, 0xb0, 0x42, 0x0a, 0xd3, 0x32, 0x46, + 0x20, 0x46, 0xbb, 0xf7, 0x2f, 0xff, 0x2e, 0x60, 0x06, 0xe0, 0xec, 0x26, + 0xf4, 0xe7, 0x4f, 0xf6, 0x2a, 0x77, 0x01, 0xe0, 0x4f, 0xf6, 0x26, 0x77, + 0x38, 0x46, 0xf2, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x8c, 0xb0, 0x0d, 0x46, + 0x16, 0x9f, 0x16, 0x46, 0x1c, 0x46, 0xe4, 0xf7, 0x1f, 0xfb, 0x80, 0x46, + 0x07, 0x2d, 0x4f, 0xf0, 0x00, 0x09, 0x62, 0x48, 0x4f, 0xf6, 0x61, 0x71, + 0x64, 0xd8, 0xdf, 0xe8, 0x05, 0xf0, 0x04, 0x0a, 0x0e, 0x1b, 0x2d, 0x38, + 0x59, 0x24, 0x00, 0xf5, 0xba, 0x71, 0x40, 0x46, 0x00, 0xf0, 0x18, 0xff, + 0x5a, 0xe0, 0x40, 0x46, 0x00, 0xf0, 0x70, 0xff, 0x56, 0xe0, 0x04, 0x2c, + 0x99, 0xbf, 0x00, 0x22, 0xd0, 0xf8, 0x50, 0x11, 0x32, 0x79, 0x31, 0x68, + 0x33, 0x46, 0x40, 0x46, 0x00, 0xf0, 0x50, 0xf8, 0x04, 0x20, 0x3b, 0xe0, + 0x69, 0x46, 0x40, 0x46, 0xff, 0xf7, 0x69, 0xff, 0x69, 0x46, 0x40, 0x46, + 0xff, 0xf7, 0xc7, 0xfa, 0x3a, 0xe0, 0x69, 0x46, 0x40, 0x46, 0xff, 0xf7, + 0x60, 0xff, 0x69, 0x46, 0x40, 0x46, 0xff, 0xf7, 0x21, 0xfb, 0x31, 0xe0, + 0x94, 0xb3, 0x30, 0x78, 0x00, 0x28, 0x40, 0x46, 0x02, 0xd0, 0x00, 0xf0, + 0xca, 0xfc, 0x2f, 0xe0, 0x00, 0xf0, 0xd2, 0xfc, 0x2c, 0xe0, 0x08, 0x2c, + 0x26, 0xd3, 0x35, 0x68, 0xd6, 0xf8, 0x04, 0xa0, 0x88, 0xbf, 0x34, 0x7a, + 0x03, 0xd8, 0x40, 0x46, 0xbc, 0xf7, 0xfe, 0xfe, 0x04, 0x46, 0x21, 0x46, + 0x40, 0x46, 0xbc, 0xf7, 0x26, 0xff, 0x83, 0x46, 0x53, 0x46, 0x2a, 0x46, + 0x59, 0x46, 0x40, 0x46, 0x00, 0xf0, 0xd6, 0xfc, 0x33, 0x1d, 0x32, 0x46, + 0x59, 0x46, 0x40, 0x46, 0x00, 0xf0, 0xe8, 0xfc, 0x34, 0x72, 0x09, 0x20, + 0x38, 0x60, 0x0b, 0xe0, 0x24, 0x2c, 0x05, 0xd3, 0x31, 0x46, 0x40, 0x46, + 0xfc, 0xf7, 0x70, 0xf9, 0x81, 0x46, 0x03, 0xe0, 0x89, 0x46, 0x01, 0xe0, + 0x4f, 0xf6, 0x27, 0x79, 0x48, 0x46, 0x0d, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x2d, 0xe9, 0xf0, 0x41, 0x80, 0x46, 0x0e, 0x46, 0x17, 0x46, 0x1c, 0x46, + 0xd3, 0xf7, 0x9c, 0xfe, 0x05, 0x46, 0x40, 0x46, 0xc9, 0xf7, 0x42, 0xff, + 0xb8, 0x21, 0x48, 0x43, 0x22, 0x49, 0x00, 0x2f, 0x0c, 0xbf, 0xae, 0x1b, + 0x76, 0x19, 0x0e, 0x50, 0x08, 0x58, 0x20, 0x60, 0xbd, 0xe8, 0xf0, 0x81, + 0x38, 0xb5, 0x1c, 0x49, 0x09, 0x68, 0x51, 0xf8, 0x20, 0x50, 0x28, 0x68, + 0x08, 0x28, 0x30, 0xd2, 0x51, 0xf8, 0x20, 0x40, 0x5c, 0xb3, 0xa9, 0x68, + 0xa0, 0x68, 0x24, 0x22, 0xbb, 0xf7, 0x90, 0xfe, 0xe9, 0x68, 0xe0, 0x68, + 0x4f, 0xf4, 0xe7, 0x62, 0xbb, 0xf7, 0x8a, 0xfe, 0x29, 0x69, 0x20, 0x69, + 0x4f, 0xf4, 0x80, 0x72, 0xbb, 0xf7, 0x84, 0xfe, 0x69, 0x69, 0x60, 0x69, + 0x4f, 0xf4, 0x14, 0x72, 0xbb, 0xf7, 0x7e, 0xfe, 0xa9, 0x69, 0xa0, 0x69, + 0x70, 0x22, 0xbb, 0xf7, 0x79, 0xfe, 0xe9, 0x69, 0xe0, 0x69, 0xb8, 0x22, + 0xbb, 0xf7, 0x74, 0xfe, 0x29, 0x6a, 0x20, 0x6a, 0xec, 0x22, 0xbb, 0xf7, + 0x6f, 0xfe, 0x69, 0x6a, 0x60, 0x6a, 0x4f, 0xf4, 0x8c, 0x62, 0xbb, 0xf7, + 0x69, 0xfe, 0xff, 0x20, 0x28, 0x60, 0x31, 0xbd, 0x7c, 0x04, 0x00, 0x01, + 0x00, 0xda, 0x01, 0x20, 0x14, 0x56, 0x00, 0x20, 0xe4, 0x66, 0x02, 0x20, + 0x2d, 0xe9, 0xf0, 0x47, 0x2d, 0xed, 0x02, 0x8b, 0x0f, 0x46, 0x98, 0xb0, + 0x82, 0x46, 0x90, 0x46, 0x02, 0x21, 0xe7, 0xf7, 0xb9, 0xfe, 0x08, 0xee, + 0x10, 0x0a, 0x04, 0xa9, 0x50, 0x46, 0xc8, 0xf7, 0xc6, 0xfe, 0x0a, 0xa9, + 0x50, 0x46, 0xc9, 0xf7, 0x9b, 0xfd, 0x14, 0x22, 0x0a, 0xa9, 0x05, 0xa8, + 0xbb, 0xf7, 0x44, 0xfe, 0x00, 0x20, 0x0b, 0xaa, 0x08, 0xe0, 0x04, 0x99, + 0x52, 0xf8, 0x20, 0x30, 0xc3, 0xeb, 0x41, 0x03, 0x06, 0xa9, 0x41, 0xf8, + 0x20, 0x30, 0x40, 0x1c, 0x0a, 0x99, 0x88, 0x42, 0xf3, 0xd3, 0xd7, 0xed, + 0x00, 0x0a, 0x97, 0xed, 0x02, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x80, 0xee, + 0x80, 0x0a, 0xbb, 0xf7, 0x69, 0xff, 0x02, 0xa8, 0xfc, 0xee, 0xc0, 0x0a, + 0x01, 0x90, 0xcd, 0xed, 0x00, 0x0a, 0x02, 0x22, 0x7b, 0x7b, 0x00, 0x21, + 0x50, 0x46, 0xe7, 0xf7, 0xdf, 0xfe, 0x81, 0x46, 0x08, 0xf1, 0xe8, 0x04, + 0xbd, 0xf8, 0x08, 0x00, 0x60, 0x81, 0x50, 0x46, 0x79, 0x7b, 0x61, 0x72, + 0x02, 0x21, 0xbd, 0xf8, 0x08, 0x20, 0xe7, 0xf7, 0x36, 0xff, 0x00, 0xee, + 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xd7, 0xed, 0x02, 0x0a, 0x20, 0xee, + 0x20, 0x0a, 0xbb, 0xf7, 0x45, 0xff, 0xfc, 0xee, 0xc0, 0x8a, 0xd7, 0xed, + 0x01, 0x0a, 0x97, 0xed, 0x00, 0x1a, 0xb8, 0xee, 0x68, 0x0a, 0xf8, 0xee, + 0x60, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xb8, 0xee, 0x41, 0x1a, 0x80, 0xee, + 0x01, 0x0a, 0xbb, 0xf7, 0x33, 0xff, 0xb8, 0xee, 0x48, 0x8a, 0xbc, 0xee, + 0xc0, 0x0a, 0xf8, 0xee, 0x40, 0x0a, 0xc0, 0xee, 0x88, 0x0a, 0xb9, 0xf1, + 0x00, 0x0f, 0x84, 0xed, 0x00, 0x0a, 0xc4, 0xed, 0x01, 0x0a, 0x3c, 0xd1, + 0x04, 0x20, 0x0f, 0xa9, 0x01, 0x90, 0x00, 0x91, 0x8d, 0xed, 0x03, 0x0a, + 0xcd, 0xed, 0x02, 0x8a, 0x13, 0xab, 0x05, 0x9a, 0x08, 0xa9, 0x06, 0xa8, + 0xf9, 0xf7, 0x2d, 0xff, 0x00, 0x22, 0x13, 0xa9, 0x51, 0xf8, 0x22, 0x00, + 0x04, 0x9b, 0xc0, 0x1a, 0x00, 0xee, 0x10, 0x0a, 0x10, 0x01, 0x08, 0xeb, + 0x00, 0x03, 0x08, 0xf1, 0x04, 0x0e, 0x83, 0xed, 0x00, 0x0a, 0xb8, 0xee, + 0xc0, 0x0a, 0x86, 0x44, 0x80, 0xee, 0x08, 0x0a, 0x0f, 0xab, 0x8e, 0xed, + 0x00, 0x0a, 0x01, 0x25, 0x53, 0xf8, 0x22, 0x30, 0x9d, 0x40, 0x08, 0xf1, + 0x08, 0x03, 0x6d, 0x1e, 0x52, 0x1c, 0x1d, 0x50, 0x04, 0x2a, 0xdf, 0xd3, + 0x00, 0x22, 0x04, 0x21, 0x0f, 0xa8, 0xdc, 0xf7, 0x38, 0xfc, 0x20, 0x72, + 0x21, 0x28, 0x28, 0xbf, 0x43, 0xf2, 0x05, 0x09, 0x40, 0x46, 0x00, 0xf0, + 0x3c, 0xf9, 0x08, 0xf1, 0x40, 0x00, 0x09, 0x90, 0x0a, 0x21, 0x00, 0x22, + 0x08, 0x91, 0x07, 0x92, 0x01, 0x21, 0x38, 0x7b, 0x05, 0x92, 0x06, 0x90, + 0x03, 0x22, 0x04, 0x92, 0x03, 0x92, 0x4f, 0xf4, 0x80, 0x10, 0x00, 0x22, + 0x02, 0x90, 0x01, 0x91, 0x00, 0x92, 0xb7, 0xee, 0x00, 0x1a, 0xd7, 0xed, + 0x04, 0x0a, 0x9f, 0xed, 0x8c, 0x0a, 0x00, 0x23, 0x00, 0x21, 0x50, 0x46, + 0xe8, 0xf7, 0x22, 0xf8, 0x08, 0xf1, 0x60, 0x00, 0x00, 0x21, 0x02, 0x90, + 0x01, 0x91, 0x00, 0x91, 0x63, 0x89, 0x62, 0x7a, 0x02, 0x21, 0x50, 0x46, + 0xe7, 0xf7, 0xea, 0xfe, 0x00, 0x26, 0x18, 0x20, 0x70, 0x43, 0x08, 0xeb, + 0x00, 0x05, 0x30, 0x01, 0x05, 0xf1, 0x80, 0x01, 0x08, 0xf1, 0x08, 0x02, + 0x07, 0x91, 0x00, 0x21, 0x13, 0x58, 0x06, 0x93, 0x05, 0x91, 0x04, 0x91, + 0x03, 0x91, 0x02, 0x91, 0x01, 0x22, 0x01, 0x21, 0x01, 0x91, 0x00, 0x91, + 0x08, 0xf1, 0x60, 0x01, 0x58, 0xf8, 0x00, 0x30, 0x50, 0x46, 0xe7, 0xf7, + 0xe6, 0xfe, 0x95, 0xf8, 0x93, 0x00, 0x76, 0x1c, 0x41, 0x1e, 0x04, 0x2e, + 0x85, 0xf8, 0x93, 0x10, 0xdb, 0xd3, 0x08, 0xf1, 0xe0, 0x00, 0x02, 0x90, + 0x21, 0x68, 0x01, 0x91, 0x02, 0x21, 0x22, 0x7a, 0x50, 0x1e, 0xc0, 0xb2, + 0x00, 0x90, 0x00, 0x22, 0x7b, 0x69, 0x50, 0x46, 0xe7, 0xf7, 0xa6, 0xff, + 0x08, 0xf1, 0x40, 0x01, 0x50, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0x97, 0xed, + 0x04, 0x0a, 0xe8, 0xf7, 0x3f, 0xf8, 0xe0, 0x60, 0x02, 0x21, 0x50, 0x46, + 0xe7, 0xf7, 0xa2, 0xfd, 0x08, 0xee, 0x10, 0x0a, 0x02, 0x21, 0x50, 0x46, + 0xe7, 0xf7, 0xa9, 0xfd, 0x00, 0xee, 0x10, 0x0a, 0x60, 0x89, 0x01, 0xee, + 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xb8, 0xee, 0x41, 0x1a, 0xf8, 0xee, + 0x48, 0x0a, 0x80, 0xee, 0x01, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0x84, 0xed, + 0x04, 0x0a, 0x18, 0xb0, 0x48, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, + 0xf0, 0x87, 0x38, 0xb5, 0x00, 0x22, 0x01, 0xeb, 0x02, 0x13, 0x18, 0x25, + 0x55, 0x43, 0xdc, 0x68, 0x0d, 0x44, 0x52, 0x1c, 0x04, 0x2a, 0xc5, 0xf8, + 0x94, 0x40, 0xf4, 0xd3, 0x01, 0xf1, 0xe0, 0x02, 0x00, 0x23, 0x14, 0x7f, + 0x14, 0x70, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x01, 0xf1, 0x40, 0x02, + 0x10, 0x21, 0xe8, 0xf7, 0x54, 0xbc, 0x0a, 0x46, 0x10, 0x21, 0xe8, 0xf7, + 0xa5, 0xbe, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x43, 0x88, 0x46, 0x2d, 0xed, + 0x06, 0x8b, 0x15, 0x46, 0x10, 0x21, 0xe8, 0xf7, 0x36, 0xff, 0x08, 0xf1, + 0xec, 0x07, 0x06, 0x46, 0xf8, 0x88, 0x28, 0x80, 0x4f, 0xf4, 0x80, 0x12, + 0x31, 0x46, 0x00, 0x20, 0xe8, 0xf7, 0x03, 0xf8, 0x00, 0x28, 0x04, 0x46, + 0x6b, 0xd1, 0xb0, 0x6b, 0xb9, 0x68, 0x88, 0x42, 0xb8, 0xbf, 0x02, 0x24, + 0x5b, 0xdb, 0x30, 0x6f, 0xd7, 0xed, 0x00, 0x0a, 0x96, 0xed, 0x0f, 0xaa, + 0xd6, 0xed, 0x0e, 0xaa, 0xc0, 0xf3, 0x01, 0x49, 0xc0, 0xf3, 0x84, 0x40, + 0x09, 0xee, 0x10, 0x0a, 0x08, 0xeb, 0x09, 0x10, 0xb8, 0xee, 0x49, 0x0a, + 0xd0, 0xed, 0x01, 0x9a, 0x40, 0xee, 0x20, 0x9a, 0x96, 0xed, 0x10, 0x0a, + 0xb8, 0xee, 0xc0, 0x0a, 0xf5, 0xf7, 0x48, 0xf8, 0x29, 0x48, 0xb0, 0xee, + 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x90, 0xec, 0x02, 0x0a, 0xf5, 0xf7, + 0x12, 0xf8, 0x00, 0xf0, 0x4b, 0xf8, 0xb8, 0xee, 0xca, 0x0a, 0xf5, 0xf7, + 0x39, 0xf8, 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, 0xf4, 0xf7, + 0xe0, 0xff, 0x00, 0xf0, 0x3f, 0xf8, 0xb8, 0xee, 0xea, 0x0a, 0xf5, 0xf7, + 0x2d, 0xf8, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0xb0, 0xee, + 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, 0xf5, 0xf7, 0x09, 0xf8, 0x00, 0xf0, + 0x2f, 0xf8, 0x97, 0xed, 0x03, 0xaa, 0xf5, 0xf7, 0xad, 0xf9, 0xdf, 0xed, + 0x13, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0x80, 0xee, 0x0a, 0xaa, 0xb0, 0xee, + 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, 0xf5, 0xf7, 0x5d, 0xfe, 0x7a, 0xee, + 0x29, 0x0a, 0xc5, 0xed, 0x01, 0x0a, 0x85, 0xed, 0x02, 0x0a, 0x70, 0x6c, + 0xb9, 0x68, 0x88, 0x42, 0x03, 0xda, 0x40, 0x46, 0x00, 0xf0, 0x17, 0xf8, + 0x05, 0xe0, 0x19, 0xee, 0x10, 0x2a, 0x49, 0x46, 0x40, 0x46, 0x00, 0xf0, + 0x1c, 0xf8, 0xbd, 0xec, 0x06, 0x8b, 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x83, + 0x00, 0x00, 0x00, 0x00, 0xdb, 0x0f, 0xc9, 0x40, 0x0c, 0x56, 0x00, 0x20, + 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, 0x60, 0x8a, 0x70, 0x47, 0x00, 0x21, + 0x00, 0xeb, 0x01, 0x12, 0x49, 0x1c, 0x93, 0x68, 0xd3, 0x60, 0x04, 0x29, + 0xf8, 0xd3, 0x01, 0x21, 0x80, 0xf8, 0xfc, 0x10, 0x70, 0x47, 0x04, 0x29, + 0x00, 0xd3, 0x70, 0x47, 0x10, 0xb5, 0x00, 0xeb, 0x01, 0x11, 0x01, 0x24, + 0xcb, 0x68, 0x04, 0xfa, 0x02, 0xf2, 0x23, 0xea, 0x02, 0x02, 0xca, 0x60, + 0x00, 0x21, 0x80, 0xf8, 0xfc, 0x10, 0x10, 0xbd, 0x10, 0xb5, 0x0c, 0x46, + 0x00, 0xf0, 0x06, 0xf8, 0x00, 0x20, 0x20, 0x61, 0x60, 0x61, 0xa0, 0x61, + 0xe0, 0x61, 0x10, 0xbd, 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0xc8, 0xf7, + 0xba, 0xfc, 0x20, 0x46, 0xc9, 0xf7, 0x2a, 0xfc, 0x68, 0x60, 0x20, 0x46, + 0xc9, 0xf7, 0x24, 0xfc, 0xa8, 0x60, 0x02, 0x21, 0x20, 0x46, 0xe7, 0xf7, + 0xa8, 0xfc, 0xe8, 0x60, 0x31, 0xbd, 0xf8, 0xb5, 0x04, 0x46, 0x1e, 0x46, + 0xa7, 0x69, 0x3c, 0x23, 0x5f, 0x43, 0xe3, 0x19, 0x15, 0x46, 0x03, 0xf1, + 0x20, 0x07, 0x34, 0x22, 0x38, 0x46, 0xbb, 0xf7, 0x25, 0xfc, 0x07, 0xf1, + 0x34, 0x00, 0x06, 0x60, 0x05, 0x71, 0xa0, 0x69, 0x40, 0x1c, 0x00, 0xf0, + 0x0f, 0x00, 0xa0, 0x61, 0x20, 0x69, 0x10, 0x28, 0x3c, 0xbf, 0x40, 0x1c, + 0x20, 0x61, 0xf1, 0xbd, 0xc2, 0x69, 0x00, 0xeb, 0xc2, 0x03, 0x03, 0xf5, + 0x78, 0x72, 0x51, 0x60, 0x82, 0xed, 0x00, 0x0a, 0xc1, 0x69, 0x49, 0x1c, + 0x01, 0xf0, 0x0f, 0x01, 0xc1, 0x61, 0x41, 0x69, 0x0f, 0x29, 0x9c, 0xbf, + 0x49, 0x1c, 0x41, 0x61, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, 0x8e, 0xb0, + 0x0f, 0x68, 0x81, 0x46, 0x93, 0x46, 0x7f, 0x1e, 0x4f, 0xf4, 0x80, 0x72, + 0x06, 0xa9, 0x68, 0x46, 0xf8, 0xf7, 0x64, 0xfe, 0x7f, 0x1c, 0x4f, 0xf4, + 0x80, 0x71, 0xb1, 0xfb, 0xf7, 0xfa, 0x4f, 0xf0, 0x00, 0x08, 0x00, 0x24, + 0xe1, 0xb2, 0x48, 0x46, 0xbc, 0xf7, 0x21, 0xfc, 0xb0, 0xfb, 0xf7, 0xf5, + 0x29, 0x46, 0x68, 0x46, 0xf8, 0xf7, 0x9f, 0xfe, 0x28, 0xb9, 0x29, 0x46, + 0x68, 0x46, 0xf8, 0xf7, 0x7a, 0xfe, 0x08, 0xf1, 0x01, 0x08, 0x64, 0x1c, + 0xb4, 0xf5, 0x80, 0x7f, 0xea, 0xd3, 0xb8, 0xf1, 0x41, 0x0f, 0xd9, 0xd2, + 0x00, 0x25, 0x00, 0x24, 0x21, 0xe0, 0x21, 0x46, 0x68, 0x46, 0xf8, 0xf7, + 0x8a, 0xfe, 0x01, 0x28, 0x1a, 0xd1, 0x00, 0x26, 0xf1, 0xb2, 0x48, 0x46, + 0xbc, 0xf7, 0xff, 0xfb, 0xb0, 0xfb, 0xf7, 0xf0, 0xa0, 0x42, 0x04, 0xd1, + 0xea, 0xb2, 0xf1, 0xb2, 0x48, 0x46, 0xbc, 0xf7, 0xfe, 0xfb, 0x76, 0x1c, + 0xb6, 0xf5, 0x80, 0x7f, 0xee, 0xd3, 0x78, 0x1c, 0x40, 0x08, 0xea, 0xb2, + 0x07, 0xfb, 0x04, 0x00, 0x5a, 0x44, 0x41, 0x1e, 0x91, 0x70, 0x6d, 0x1c, + 0x64, 0x1c, 0x54, 0x45, 0xdb, 0xd3, 0x42, 0x46, 0x0b, 0xf1, 0x60, 0x01, + 0x0b, 0xf1, 0x48, 0x00, 0xf8, 0xf7, 0x16, 0xfe, 0x8b, 0xf8, 0x00, 0x80, + 0x00, 0x20, 0x8b, 0xf8, 0x01, 0x70, 0x8b, 0xf8, 0x68, 0x00, 0x0f, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x94, 0xf8, + 0x68, 0x10, 0x6a, 0x46, 0x04, 0xf1, 0x48, 0x00, 0xf8, 0xf7, 0x7e, 0xfe, + 0x00, 0x99, 0x29, 0x70, 0x23, 0x78, 0x00, 0x9a, 0x5b, 0x1e, 0x9a, 0x42, + 0x34, 0xbf, 0x52, 0x1c, 0x00, 0x22, 0x00, 0x92, 0x00, 0x99, 0x84, 0xf8, + 0x68, 0x10, 0x32, 0xbd, 0x48, 0x30, 0xf8, 0xf7, 0x0b, 0xbe, 0x48, 0x30, + 0xf8, 0xf7, 0x25, 0xbe, 0xf8, 0xb5, 0x04, 0x46, 0x00, 0x25, 0xb6, 0x4e, + 0x56, 0xf8, 0x24, 0x20, 0x02, 0xeb, 0xc5, 0x17, 0x80, 0x21, 0x38, 0x46, + 0xcd, 0xf7, 0x8e, 0xf9, 0x6d, 0x1c, 0x4f, 0xf4, 0x80, 0x52, 0x40, 0x2d, + 0x7a, 0x63, 0xf1, 0xd3, 0xaf, 0x49, 0xb0, 0x48, 0x51, 0xf8, 0x24, 0x20, + 0x02, 0xf5, 0x90, 0x72, 0x4f, 0xf4, 0x80, 0x11, 0x10, 0x60, 0x00, 0x22, + 0xac, 0x48, 0x50, 0xf8, 0x24, 0x00, 0x40, 0xf8, 0xf8, 0x1f, 0x02, 0x60, + 0xf1, 0xbd, 0x40, 0x29, 0x00, 0xd3, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x41, + 0xa6, 0x4c, 0xa3, 0x4f, 0x54, 0xf8, 0x20, 0x40, 0xa5, 0x4e, 0x54, 0xf8, + 0xf8, 0x8f, 0xdf, 0xf8, 0x94, 0xc2, 0x4f, 0xf4, 0x80, 0x35, 0x25, 0x60, + 0x57, 0xf8, 0x20, 0x00, 0x5f, 0x68, 0x00, 0xeb, 0xc1, 0x11, 0x18, 0x68, + 0x40, 0x42, 0x7f, 0x42, 0xc0, 0xf3, 0x11, 0x00, 0x40, 0xea, 0x87, 0x40, + 0x08, 0x60, 0x98, 0x68, 0xdf, 0x68, 0x40, 0x42, 0x7f, 0x42, 0x06, 0xea, + 0x00, 0x10, 0x40, 0xea, 0x87, 0x56, 0x58, 0x68, 0x40, 0x42, 0x80, 0x0b, + 0x00, 0xf0, 0x0f, 0x00, 0x30, 0x43, 0x48, 0x60, 0x1f, 0x69, 0x58, 0x69, + 0x94, 0x4e, 0x7f, 0x42, 0x40, 0x42, 0x06, 0xea, 0x07, 0x26, 0x46, 0xea, + 0x80, 0x66, 0xd8, 0x68, 0x40, 0x42, 0x87, 0x03, 0x46, 0xea, 0x17, 0x60, + 0x88, 0x60, 0x8f, 0x4f, 0x98, 0x69, 0x40, 0x42, 0x07, 0xea, 0x00, 0x37, + 0x58, 0x69, 0x40, 0x42, 0x83, 0x03, 0x57, 0xea, 0x13, 0x57, 0xcf, 0x60, + 0x10, 0x68, 0x8a, 0x4b, 0x80, 0x03, 0x08, 0x62, 0x57, 0x68, 0x90, 0x68, + 0x03, 0xea, 0x87, 0x06, 0x46, 0xea, 0x80, 0x56, 0x10, 0x68, 0x86, 0x4f, + 0xc0, 0xf3, 0x81, 0x40, 0x30, 0x43, 0x48, 0x62, 0xd6, 0x68, 0x10, 0x69, + 0x07, 0xea, 0x86, 0x26, 0x46, 0xea, 0x80, 0x76, 0x90, 0x68, 0xc0, 0xf3, + 0x89, 0x20, 0x30, 0x43, 0x88, 0x62, 0x16, 0x69, 0x50, 0x69, 0xc6, 0xf3, + 0x91, 0x06, 0x46, 0xea, 0x80, 0x40, 0xc8, 0x62, 0xd2, 0xf8, 0x18, 0xe0, + 0xd0, 0x69, 0x0c, 0xea, 0x8e, 0x16, 0x46, 0xea, 0x80, 0x66, 0x50, 0x69, + 0xc0, 0xf3, 0x85, 0x30, 0x06, 0x43, 0x0e, 0x63, 0xd6, 0x69, 0x10, 0x6a, + 0xc6, 0xf3, 0x8d, 0x16, 0x46, 0xea, 0x80, 0x30, 0x48, 0x63, 0x56, 0x6a, + 0x90, 0x6a, 0x03, 0xea, 0x86, 0x03, 0x43, 0xea, 0x80, 0x53, 0x10, 0x6a, + 0xc0, 0xf3, 0x81, 0x40, 0x03, 0x43, 0x8b, 0x63, 0xd3, 0x6a, 0x10, 0x6b, + 0x07, 0xea, 0x83, 0x27, 0x47, 0xea, 0x80, 0x77, 0x90, 0x6a, 0xc0, 0xf3, + 0x89, 0x20, 0x07, 0x43, 0xcf, 0x63, 0x13, 0x6b, 0x50, 0x6b, 0xc3, 0xf3, + 0x91, 0x03, 0x43, 0xea, 0x80, 0x43, 0x0b, 0x64, 0x90, 0x6b, 0x0c, 0xea, + 0x80, 0x13, 0x50, 0x6b, 0xc0, 0xf3, 0x85, 0x30, 0x18, 0x43, 0x48, 0x64, + 0x00, 0x21, 0x21, 0x60, 0x4f, 0xf4, 0x80, 0x10, 0x20, 0x60, 0x21, 0x60, + 0xc8, 0xf3, 0x00, 0x40, 0x00, 0xb1, 0x25, 0x60, 0xbd, 0xe8, 0xf0, 0x81, + 0x40, 0x29, 0x00, 0xd3, 0x70, 0x47, 0x10, 0xb5, 0x4d, 0x4c, 0x54, 0xf8, + 0x20, 0x00, 0x00, 0xeb, 0xc1, 0x10, 0x01, 0x68, 0x89, 0x03, 0x89, 0x13, + 0x49, 0x42, 0x19, 0x60, 0x04, 0x68, 0x41, 0x68, 0x24, 0x09, 0x44, 0xea, + 0x01, 0x74, 0xa4, 0x13, 0x64, 0x42, 0x5c, 0x60, 0x41, 0x68, 0x89, 0x02, + 0x89, 0x13, 0x49, 0x42, 0x99, 0x60, 0x44, 0x68, 0x81, 0x68, 0x24, 0x0a, + 0x44, 0xea, 0x01, 0x64, 0xa4, 0x13, 0x64, 0x42, 0xdc, 0x60, 0x81, 0x68, + 0x89, 0x01, 0x89, 0x13, 0x49, 0x42, 0x19, 0x61, 0x84, 0x68, 0xc1, 0x68, + 0x24, 0x0b, 0x44, 0xea, 0x01, 0x54, 0xa4, 0x13, 0x64, 0x42, 0x5c, 0x61, + 0xc1, 0x68, 0x89, 0x00, 0x89, 0x13, 0x49, 0x42, 0x99, 0x61, 0x03, 0x6a, + 0x41, 0x6a, 0x9b, 0x08, 0x43, 0xea, 0x81, 0x73, 0x1b, 0x13, 0x13, 0x60, + 0x41, 0x6a, 0x89, 0x02, 0x09, 0x13, 0x51, 0x60, 0x43, 0x6a, 0x81, 0x6a, + 0x9b, 0x0a, 0x43, 0xea, 0x81, 0x53, 0x1b, 0x13, 0x93, 0x60, 0x81, 0x6a, + 0x89, 0x00, 0x09, 0x13, 0xd1, 0x60, 0x83, 0x6a, 0xc1, 0x6a, 0x9b, 0x0c, + 0x43, 0xea, 0x81, 0x33, 0x1b, 0x13, 0x13, 0x61, 0xc3, 0x6a, 0x01, 0x6b, + 0x9b, 0x09, 0x43, 0xea, 0x81, 0x63, 0x1b, 0x13, 0x53, 0x61, 0x01, 0x6b, + 0x89, 0x01, 0x09, 0x13, 0x91, 0x61, 0x03, 0x6b, 0x41, 0x6b, 0x9b, 0x0b, + 0x43, 0xea, 0x81, 0x43, 0x1b, 0x13, 0xd3, 0x61, 0x43, 0x6b, 0x81, 0x6b, + 0x9b, 0x08, 0x43, 0xea, 0x81, 0x73, 0x1b, 0x13, 0x13, 0x62, 0x81, 0x6b, + 0x89, 0x02, 0x09, 0x13, 0x51, 0x62, 0x83, 0x6b, 0xc1, 0x6b, 0x9b, 0x0a, + 0x43, 0xea, 0x81, 0x53, 0x1b, 0x13, 0x93, 0x62, 0xc1, 0x6b, 0x89, 0x00, + 0x09, 0x13, 0xd1, 0x62, 0xc3, 0x6b, 0x01, 0x6c, 0x9b, 0x0c, 0x43, 0xea, + 0x81, 0x33, 0x1b, 0x13, 0x13, 0x63, 0x03, 0x6c, 0x41, 0x6c, 0x9b, 0x09, + 0x43, 0xea, 0x81, 0x63, 0x1b, 0x13, 0x53, 0x63, 0x40, 0x6c, 0x80, 0x01, + 0x00, 0x13, 0x90, 0x63, 0x10, 0xbd, 0x0c, 0x49, 0x51, 0xf8, 0x20, 0x00, + 0x00, 0x21, 0x40, 0xf8, 0xf8, 0x1f, 0x4f, 0xf4, 0x80, 0x12, 0x02, 0x60, + 0x01, 0x60, 0x70, 0x47, 0x06, 0x4a, 0x52, 0xf8, 0x20, 0x00, 0x4f, 0xf4, + 0x80, 0x31, 0x40, 0xf8, 0xf8, 0x1f, 0x70, 0x47, 0x88, 0x95, 0x04, 0x01, + 0x88, 0x94, 0x04, 0x01, 0x00, 0x0e, 0x06, 0x00, 0xa8, 0x94, 0x04, 0x01, + 0xf0, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, + 0x00, 0xf0, 0xff, 0x3f, 0xfc, 0xff, 0x3f, 0x00, 0x00, 0xfc, 0xff, 0x3f, + 0xf8, 0xb5, 0x96, 0xb0, 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0x1f, 0x46, + 0x3c, 0x21, 0x07, 0xa8, 0xcd, 0xf7, 0x0c, 0xf8, 0x1c, 0x21, 0x68, 0x46, + 0xcd, 0xf7, 0x08, 0xf8, 0x0e, 0x96, 0x03, 0x97, 0x6b, 0x46, 0x07, 0xaa, + 0x29, 0x46, 0x20, 0x46, 0xff, 0xf7, 0x89, 0xfe, 0x17, 0xb0, 0xf0, 0xbd, + 0x38, 0xb5, 0x96, 0xb0, 0x14, 0x46, 0x1d, 0x46, 0x6b, 0x46, 0x07, 0xaa, + 0xff, 0xf7, 0x2c, 0xff, 0x0e, 0x98, 0x20, 0x60, 0x03, 0x99, 0x29, 0x60, + 0x17, 0xb0, 0x30, 0xbd, 0x70, 0xb5, 0x0c, 0x46, 0x15, 0x46, 0x1e, 0x46, + 0x4f, 0xf4, 0xc2, 0x71, 0x20, 0x46, 0xcc, 0xf7, 0xe7, 0xff, 0x04, 0xf5, + 0xc0, 0x70, 0x05, 0x80, 0x46, 0x80, 0x70, 0xbd, 0xf0, 0xb5, 0x02, 0x46, + 0x00, 0x23, 0x00, 0x20, 0x00, 0x24, 0x30, 0x25, 0x65, 0x43, 0x0d, 0x44, + 0x2e, 0x78, 0x01, 0x2e, 0x18, 0xd1, 0xee, 0x6a, 0x9e, 0x42, 0x15, 0xd3, + 0x6f, 0x88, 0xd5, 0xed, 0x01, 0x0a, 0x70, 0xee, 0x60, 0x0a, 0x01, 0xee, + 0x10, 0x7a, 0xf0, 0xee, 0xe0, 0x0a, 0xb8, 0xee, 0x41, 0x1a, 0x21, 0xee, + 0x20, 0x1a, 0xd2, 0xed, 0x00, 0x0a, 0xb4, 0xee, 0x60, 0x1a, 0xf1, 0xee, + 0x10, 0xfa, 0x44, 0xbf, 0x33, 0x46, 0x28, 0x46, 0x64, 0x1c, 0x08, 0x2c, + 0xdd, 0xd3, 0xf0, 0xbd, 0x01, 0x46, 0x00, 0x20, 0x21, 0xb1, 0x91, 0xf8, + 0x26, 0x20, 0x0c, 0x20, 0x42, 0x43, 0x88, 0x18, 0x70, 0x47, 0x2d, 0xe9, + 0xf1, 0x4f, 0x2d, 0xed, 0x0a, 0x8b, 0x14, 0x00, 0x8b, 0x46, 0x98, 0x46, + 0xf0, 0xee, 0x60, 0xaa, 0xb0, 0xee, 0x41, 0xba, 0xf0, 0xee, 0x61, 0xba, + 0xb0, 0xee, 0x42, 0xca, 0x18, 0xd1, 0x00, 0x21, 0x00, 0x24, 0x00, 0x22, + 0x30, 0x20, 0x50, 0x43, 0x0b, 0xeb, 0x00, 0x03, 0x1b, 0xf8, 0x00, 0x00, + 0x00, 0x28, 0x4f, 0xd0, 0x98, 0x6a, 0xa8, 0xeb, 0x00, 0x00, 0x88, 0x42, + 0x24, 0xbf, 0x01, 0x46, 0x1c, 0x46, 0x52, 0x1c, 0x08, 0x2a, 0xed, 0xd3, + 0x30, 0x21, 0x20, 0x46, 0xcc, 0xf7, 0x88, 0xff, 0x04, 0xf1, 0x24, 0x06, + 0xb0, 0x78, 0xdd, 0xf8, 0x28, 0xa0, 0xdd, 0xf8, 0x50, 0x90, 0x00, 0x28, + 0xff, 0xee, 0x00, 0x9a, 0xb0, 0xee, 0x6a, 0x8a, 0xf0, 0xee, 0x6b, 0x8a, + 0xb0, 0xee, 0x4c, 0x9a, 0x40, 0xf0, 0x90, 0x80, 0xa4, 0xf8, 0x02, 0x90, + 0x84, 0xed, 0x01, 0x8a, 0x00, 0x25, 0x70, 0x78, 0x00, 0x27, 0xf0, 0xee, + 0x4b, 0xca, 0x68, 0xb9, 0x9a, 0xed, 0x01, 0x0a, 0xb4, 0xee, 0x6c, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x20, 0xd4, 0xbb, 0xf8, 0x80, 0x01, 0x48, 0x45, + 0x1c, 0xd2, 0x00, 0xf0, 0xa6, 0xf8, 0x01, 0x27, 0x70, 0x78, 0x01, 0x28, + 0x0c, 0xd1, 0x9a, 0xed, 0x03, 0x0a, 0xb4, 0xee, 0x6c, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x12, 0xd5, 0x22, 0x46, 0x59, 0x46, 0x50, 0x46, 0x00, 0xf0, + 0x05, 0xf9, 0x01, 0x25, 0x01, 0x20, 0x20, 0x70, 0xc4, 0xed, 0x02, 0x8a, + 0xc6, 0xf8, 0x04, 0x80, 0xb5, 0xb9, 0x3d, 0xe0, 0x1c, 0x46, 0xb7, 0xe7, + 0x01, 0x20, 0x70, 0x70, 0xe5, 0xe7, 0x9a, 0xed, 0x02, 0x0a, 0xf4, 0xee, + 0x40, 0xca, 0xf1, 0xee, 0x10, 0xfa, 0xea, 0xd5, 0x00, 0xf0, 0x7f, 0xf8, + 0xbb, 0xf8, 0x80, 0x01, 0x61, 0x88, 0x88, 0x42, 0xe3, 0xd2, 0x75, 0x70, + 0x01, 0x27, 0xe1, 0xe7, 0x00, 0xee, 0x90, 0x9a, 0xb0, 0xee, 0xc8, 0x0a, + 0xf8, 0xee, 0x60, 0x0a, 0x20, 0xee, 0x80, 0x0a, 0xda, 0xed, 0x00, 0x0a, + 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x0a, 0xd5, 0xb5, 0xee, + 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0xc8, 0xbf, 0x03, 0x20, 0x0d, 0xdc, + 0x04, 0x21, 0x31, 0x70, 0x02, 0x20, 0x0e, 0xe0, 0x89, 0xee, 0x28, 0x0a, + 0xda, 0xed, 0x09, 0x0a, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x03, 0xd5, 0x02, 0x20, 0x30, 0x70, 0x01, 0x20, 0x01, 0xe0, 0x30, 0x70, + 0x00, 0x20, 0xb0, 0x70, 0x1f, 0xb1, 0x00, 0x20, 0x20, 0x73, 0x20, 0x76, + 0x01, 0xe0, 0x20, 0x7b, 0x50, 0xb9, 0x60, 0x88, 0x94, 0xed, 0x01, 0x0a, + 0xe0, 0x81, 0xf7, 0xee, 0x00, 0x0a, 0x04, 0xf1, 0x0c, 0x01, 0x50, 0x46, + 0x00, 0xf0, 0x96, 0xf8, 0x20, 0x7e, 0x58, 0xbb, 0x60, 0x88, 0x94, 0xed, + 0x01, 0x0a, 0x60, 0x83, 0xf0, 0xee, 0x69, 0x0a, 0x04, 0xf1, 0x18, 0x01, + 0x50, 0x46, 0x00, 0xf0, 0x89, 0xf8, 0x1f, 0xe0, 0x01, 0x28, 0x94, 0xed, + 0x02, 0x2a, 0x0f, 0xd1, 0xf7, 0xee, 0x00, 0x2a, 0x00, 0xf0, 0x1f, 0xf8, + 0x04, 0xf1, 0x0c, 0x02, 0x59, 0x46, 0x50, 0x46, 0x00, 0xf0, 0x23, 0xf8, + 0x30, 0x78, 0x02, 0x28, 0x0c, 0xd1, 0x02, 0x21, 0xb1, 0x70, 0x0b, 0xe0, + 0xf0, 0xee, 0x69, 0x2a, 0x00, 0xf0, 0x0f, 0xf8, 0x04, 0xf1, 0x18, 0x02, + 0x59, 0x46, 0x50, 0x46, 0x00, 0xf0, 0x13, 0xf8, 0x00, 0x20, 0xb0, 0x70, + 0xb0, 0x68, 0x40, 0x1c, 0xb0, 0x60, 0xbd, 0xec, 0x0a, 0x8b, 0xbd, 0xe8, + 0xf1, 0x8f, 0xf0, 0xee, 0x49, 0x1a, 0xb0, 0xee, 0x68, 0x1a, 0x4b, 0x46, + 0x70, 0x47, 0x22, 0x46, 0x59, 0x46, 0x50, 0x46, 0x66, 0xe0, 0x38, 0xb5, + 0x2d, 0xed, 0x02, 0x8b, 0xb0, 0xee, 0x41, 0x8a, 0xb0, 0xee, 0x40, 0x3a, + 0x81, 0xee, 0x88, 0x1a, 0xb0, 0xee, 0x60, 0x0a, 0xc8, 0xee, 0x02, 0x1a, + 0xf0, 0xee, 0x62, 0x0a, 0x02, 0xee, 0x10, 0x3a, 0xf8, 0xee, 0x42, 0x2a, + 0xd0, 0xed, 0x04, 0x3a, 0x90, 0xed, 0x06, 0x4a, 0x01, 0x25, 0x83, 0xee, + 0xa2, 0x2a, 0xf5, 0xee, 0x40, 0x0a, 0xc4, 0xee, 0x22, 0x2a, 0xf1, 0xee, + 0x10, 0xfa, 0xc7, 0xbf, 0x73, 0xee, 0x62, 0x3a, 0x33, 0xee, 0x42, 0x2a, + 0x73, 0xee, 0x02, 0x3a, 0x33, 0xee, 0x22, 0x2a, 0xd0, 0xed, 0x0a, 0x2a, + 0xf4, 0xee, 0x62, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x14, 0x46, 0x48, 0xbf, + 0x00, 0x25, 0x1d, 0xd4, 0xb4, 0xee, 0x63, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0xa4, 0xbf, 0xb4, 0xee, 0x40, 0x2a, 0xf1, 0xee, 0x10, 0xfa, 0x10, 0xdb, + 0xb7, 0xee, 0x00, 0x0a, 0xb4, 0xee, 0x40, 0x1a, 0xf1, 0xee, 0x10, 0xfa, + 0x42, 0xbf, 0xd0, 0xed, 0x09, 0x0a, 0xf4, 0xee, 0x41, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x05, 0xd5, 0x00, 0xf0, 0x1e, 0xf8, 0x02, 0xe0, 0x21, 0x46, + 0x00, 0xf0, 0x06, 0xf8, 0x25, 0x70, 0x84, 0xed, 0x02, 0x8a, 0xbd, 0xec, + 0x02, 0x8b, 0x31, 0xbd, 0x90, 0xed, 0x05, 0x1a, 0x48, 0x88, 0x01, 0xee, + 0x90, 0x0a, 0x60, 0xee, 0x81, 0x0a, 0xf8, 0xee, 0x61, 0x1a, 0xc0, 0xee, + 0xa1, 0x1a, 0x31, 0xee, 0x80, 0x0a, 0x81, 0xed, 0x01, 0x0a, 0x70, 0x47, + 0x0b, 0x46, 0x90, 0xed, 0x07, 0x0a, 0x02, 0xe0, 0x0b, 0x46, 0x90, 0xed, + 0x08, 0x0a, 0x11, 0x46, 0x18, 0x46, 0x38, 0xb5, 0x0c, 0x46, 0x05, 0x46, + 0x60, 0x88, 0x00, 0xee, 0x90, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x80, 0xee, + 0x80, 0x0a, 0xbb, 0xf7, 0x7b, 0xf9, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, + 0x10, 0x0a, 0x60, 0x80, 0x05, 0xf5, 0xc0, 0x70, 0x62, 0x88, 0x01, 0x88, + 0x8a, 0x42, 0x03, 0xd3, 0x41, 0x88, 0x91, 0x42, 0x88, 0xbf, 0x11, 0x46, + 0x61, 0x80, 0x31, 0xbd, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, + 0x04, 0x46, 0x3f, 0x48, 0x50, 0xf8, 0x24, 0x60, 0x0d, 0x46, 0x06, 0xf1, + 0xa8, 0x07, 0x00, 0x23, 0x4f, 0xf0, 0x80, 0x52, 0x1c, 0x21, 0x00, 0xf0, + 0x4b, 0xf8, 0x2b, 0x88, 0x43, 0xf6, 0xff, 0x72, 0x00, 0x21, 0x06, 0xf1, + 0x9c, 0x00, 0xff, 0xf7, 0xdb, 0xff, 0x06, 0xf1, 0x94, 0x08, 0x6b, 0x79, + 0x4f, 0xf4, 0x7c, 0x52, 0x08, 0x21, 0x40, 0x46, 0xff, 0xf7, 0xd2, 0xff, + 0xab, 0x78, 0x4f, 0xf4, 0xe0, 0x22, 0x10, 0x21, 0x06, 0xf1, 0x90, 0x00, + 0xff, 0xf7, 0xca, 0xff, 0xeb, 0x78, 0x4f, 0xf4, 0xf8, 0x12, 0x10, 0x21, + 0x00, 0xf0, 0x2c, 0xf8, 0x06, 0xf1, 0xa4, 0x07, 0x2b, 0x79, 0x1f, 0x22, + 0x00, 0x21, 0x00, 0xf0, 0x25, 0xf8, 0xab, 0x79, 0xff, 0x22, 0x00, 0x21, + 0x40, 0x46, 0xff, 0xf7, 0xb7, 0xff, 0xeb, 0x79, 0x4f, 0xf0, 0x7f, 0x42, + 0x18, 0x21, 0x00, 0xf0, 0x19, 0xf8, 0x98, 0x36, 0xab, 0x68, 0x6f, 0xf0, + 0x7e, 0x42, 0x00, 0x21, 0x30, 0x46, 0xff, 0xf7, 0xa9, 0xff, 0x01, 0x23, + 0x4f, 0xf0, 0x80, 0x52, 0x1c, 0x21, 0x30, 0x46, 0xff, 0xf7, 0xa2, 0xff, + 0x19, 0x48, 0x50, 0xf8, 0x24, 0x00, 0xbd, 0xe8, 0xf0, 0x41, 0x01, 0x23, + 0x01, 0x22, 0x00, 0x21, 0x08, 0x30, 0x97, 0xe7, 0x38, 0x46, 0x95, 0xe7, + 0x38, 0xb5, 0x12, 0x49, 0x51, 0xf8, 0x20, 0x40, 0x04, 0xf1, 0x98, 0x05, + 0x00, 0x23, 0x4f, 0xf0, 0x80, 0x52, 0x1c, 0x21, 0x28, 0x46, 0xff, 0xf7, + 0x89, 0xff, 0xff, 0x23, 0xff, 0x22, 0x00, 0x21, 0x04, 0xf1, 0x94, 0x00, + 0xff, 0xf7, 0x82, 0xff, 0xff, 0x23, 0x4f, 0xf0, 0x7f, 0x42, 0x18, 0x21, + 0x04, 0xf1, 0xa4, 0x00, 0xff, 0xf7, 0x7a, 0xff, 0x28, 0x46, 0x01, 0xb0, + 0xbd, 0xe8, 0x30, 0x40, 0x14, 0x23, 0x6f, 0xf0, 0x7e, 0x42, 0x00, 0x21, + 0x70, 0xe7, 0x00, 0x00, 0xa8, 0x94, 0x04, 0x01, 0x88, 0x94, 0x04, 0x01, + 0xdf, 0xf8, 0xd0, 0x17, 0x09, 0x68, 0x0a, 0x18, 0xed, 0x20, 0x92, 0xf8, + 0xbc, 0x30, 0x43, 0x43, 0xc8, 0x18, 0x00, 0xf2, 0x44, 0x40, 0x70, 0x47, + 0x38, 0xb5, 0x2d, 0xed, 0x04, 0x8b, 0x82, 0xb0, 0x05, 0x46, 0x00, 0xf0, + 0xc1, 0xf8, 0x04, 0x00, 0x03, 0xd1, 0x28, 0x46, 0x00, 0xf0, 0x48, 0xfb, + 0x04, 0x46, 0x00, 0x2c, 0x56, 0xd1, 0x68, 0x6a, 0xdf, 0xf8, 0x9c, 0x17, + 0x88, 0x42, 0x06, 0xd3, 0x9f, 0xed, 0xa0, 0x8a, 0xdf, 0xed, 0xa0, 0x8a, + 0x9f, 0xed, 0xa0, 0x9a, 0x05, 0xe0, 0x9f, 0xed, 0xa0, 0x8a, 0xdf, 0xed, + 0xa0, 0x8a, 0x9f, 0xed, 0xa0, 0x9a, 0x28, 0x78, 0x00, 0x21, 0xe4, 0xf7, + 0x70, 0xf8, 0xff, 0x20, 0xe8, 0x86, 0x00, 0x21, 0x29, 0x87, 0x00, 0xf0, + 0x41, 0xfb, 0x69, 0x6a, 0x28, 0x78, 0xe3, 0xf7, 0x83, 0xfe, 0x00, 0xf0, + 0x42, 0xfb, 0x00, 0x2c, 0x59, 0xd0, 0x6c, 0xbb, 0xb5, 0xf9, 0x36, 0x00, + 0xa9, 0x69, 0xa8, 0x86, 0x08, 0x70, 0xa8, 0x69, 0x01, 0x78, 0x28, 0x78, + 0xe4, 0xf7, 0x70, 0xf8, 0xb5, 0xf9, 0x34, 0x00, 0xff, 0x28, 0x1a, 0xd1, + 0x95, 0xed, 0x11, 0x0a, 0xb4, 0xee, 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, + 0xa4, 0xbf, 0xb4, 0xee, 0x49, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x13, 0xda, + 0x10, 0xee, 0x10, 0x0a, 0xf5, 0xf7, 0xd2, 0xfa, 0xcd, 0xe9, 0x00, 0x01, + 0x2b, 0x78, 0xdf, 0xf8, 0x18, 0x27, 0x06, 0x21, 0x01, 0x20, 0xc9, 0xf7, + 0xa8, 0xf8, 0x40, 0xf2, 0x06, 0x64, 0xb5, 0xf9, 0x34, 0x00, 0x08, 0xb9, + 0x40, 0xf2, 0x07, 0x64, 0x00, 0xf0, 0x14, 0xfb, 0x04, 0xb9, 0x04, 0x46, + 0x68, 0x69, 0xd5, 0xed, 0x10, 0x0a, 0x9f, 0xed, 0x7c, 0x0a, 0x60, 0xee, + 0x80, 0x0a, 0xfc, 0xee, 0xe0, 0x0a, 0xc0, 0xed, 0x08, 0x0a, 0x95, 0xed, + 0x11, 0x1a, 0x21, 0xee, 0x00, 0x0a, 0xbc, 0xee, 0xc0, 0x0a, 0x80, 0xed, + 0x07, 0x0a, 0xe9, 0x8e, 0x81, 0x82, 0x00, 0x21, 0x2a, 0x8f, 0xc2, 0x82, + 0x01, 0x76, 0xaa, 0x69, 0x11, 0x78, 0x41, 0x76, 0x28, 0x46, 0x21, 0x46, + 0x00, 0xf0, 0xde, 0xf8, 0x04, 0xb9, 0x04, 0x46, 0x02, 0xb0, 0x20, 0x46, + 0xbd, 0xec, 0x04, 0x8b, 0x32, 0xbd, 0xb5, 0xf9, 0x36, 0x00, 0xb5, 0xf9, + 0x38, 0x10, 0x81, 0x42, 0xa0, 0xda, 0x08, 0x18, 0x00, 0xeb, 0xd0, 0x70, + 0x40, 0x10, 0xa8, 0x86, 0xa8, 0x8e, 0xc1, 0xb2, 0x28, 0x78, 0xe4, 0xf7, + 0x11, 0xf8, 0xa8, 0x68, 0x82, 0x7f, 0x02, 0x21, 0x28, 0x46, 0x00, 0xf0, + 0xc3, 0xf9, 0x04, 0x00, 0x8d, 0xd1, 0xe8, 0x69, 0xaa, 0x6c, 0x00, 0xf1, + 0x8c, 0x01, 0xca, 0x60, 0x2b, 0x6d, 0x4b, 0x61, 0xea, 0x6b, 0x0a, 0x60, + 0x6b, 0x6c, 0x8b, 0x60, 0xa9, 0x69, 0x95, 0xf8, 0x20, 0x30, 0x0a, 0x78, + 0x18, 0x44, 0x02, 0x75, 0x95, 0xf8, 0x20, 0x10, 0x95, 0xed, 0x11, 0x0a, + 0xb5, 0xf9, 0x34, 0x00, 0x49, 0x1c, 0xf4, 0xee, 0x40, 0x8a, 0x85, 0xf8, + 0x20, 0x10, 0xf1, 0xee, 0x10, 0xfa, 0x52, 0xbf, 0xe8, 0x86, 0x40, 0x1c, + 0x28, 0x87, 0xc4, 0xe7, 0xf8, 0xb5, 0x04, 0x46, 0x25, 0x78, 0x60, 0x69, + 0xe3, 0xf7, 0x7d, 0xfa, 0x00, 0x21, 0x04, 0xf1, 0x24, 0x06, 0x84, 0xf8, + 0x20, 0x10, 0x31, 0x82, 0x28, 0x46, 0xc8, 0xf7, 0x9c, 0xfe, 0x01, 0x46, + 0x31, 0x60, 0xa3, 0x68, 0xe2, 0x68, 0x93, 0xf8, 0x39, 0x00, 0x40, 0xb1, + 0x10, 0x69, 0x30, 0xb9, 0x70, 0x68, 0x20, 0xb1, 0x47, 0x42, 0x8f, 0x42, + 0x6c, 0xda, 0x41, 0x18, 0x31, 0x60, 0x96, 0xed, 0x00, 0x0a, 0xd2, 0xed, + 0x01, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0xc0, 0xee, + 0x20, 0x0a, 0x9f, 0xed, 0x38, 0x1a, 0x20, 0xee, 0x81, 0x1a, 0xbc, 0xee, + 0xc1, 0x1a, 0x86, 0xed, 0x02, 0x1a, 0x01, 0x21, 0xd3, 0xf8, 0x19, 0x00, + 0xd6, 0xed, 0x00, 0x0a, 0x00, 0xee, 0x10, 0x0a, 0xf8, 0xee, 0x60, 0x0a, + 0xb8, 0xee, 0x40, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0xbc, 0xee, 0xc0, 0x0a, + 0x86, 0xed, 0x03, 0x0a, 0x20, 0x78, 0xe3, 0xf7, 0x02, 0xfc, 0x20, 0x78, + 0xe3, 0xf7, 0x22, 0xfc, 0x20, 0x78, 0xe3, 0xf7, 0xa8, 0xfc, 0x94, 0xf8, + 0x21, 0x00, 0x02, 0x28, 0x04, 0xbf, 0x20, 0x78, 0xe3, 0xf7, 0x51, 0xfc, + 0x20, 0x46, 0x00, 0xf0, 0x77, 0xf8, 0x31, 0x68, 0x20, 0x78, 0xe3, 0xf7, + 0x37, 0xfd, 0xa1, 0x69, 0x7f, 0x20, 0x08, 0x70, 0xa1, 0x69, 0x20, 0x78, + 0xe3, 0xf7, 0x43, 0xfe, 0xe0, 0x68, 0xc1, 0x68, 0x20, 0x69, 0xe3, 0xf7, + 0x05, 0xfb, 0xe0, 0x69, 0x05, 0x70, 0x00, 0x23, 0x31, 0x68, 0x41, 0x60, + 0xf2, 0x68, 0x82, 0x60, 0x71, 0x6a, 0xc1, 0x60, 0x00, 0x21, 0xf2, 0x6a, + 0x02, 0x61, 0x14, 0x30, 0x00, 0x22, 0xc0, 0xe9, 0x00, 0x12, 0xe0, 0x69, + 0x00, 0xf1, 0x1c, 0x01, 0x00, 0x20, 0x81, 0xe8, 0x0d, 0x00, 0xe0, 0x69, + 0x60, 0x21, 0x28, 0x30, 0xcc, 0xf7, 0x40, 0xfc, 0x20, 0x78, 0xe3, 0xf7, + 0xea, 0xfc, 0x05, 0x46, 0x20, 0x69, 0xc0, 0x68, 0xd7, 0xf7, 0x8c, 0xfb, + 0x28, 0x46, 0xf2, 0xbd, 0x40, 0xf2, 0x0b, 0x65, 0xfa, 0xe7, 0x00, 0x00, + 0x94, 0xf5, 0x0f, 0x3f, 0xae, 0xd4, 0xcb, 0x3e, 0x12, 0x4d, 0x90, 0x3e, + 0xf3, 0x3b, 0x35, 0x3f, 0xcb, 0x4d, 0x00, 0x3f, 0x0d, 0xaa, 0xb5, 0x3e, + 0x00, 0x00, 0x7a, 0x44, 0x2d, 0xe9, 0xf8, 0x43, 0x06, 0x46, 0x0d, 0x46, + 0x96, 0xf8, 0x00, 0x90, 0x48, 0x46, 0xe3, 0xf7, 0x1a, 0xff, 0x80, 0x46, + 0x48, 0x46, 0xe3, 0xf7, 0xd3, 0xfc, 0x04, 0x46, 0x00, 0x21, 0x48, 0x46, + 0xe3, 0xf7, 0x99, 0xfb, 0x30, 0x78, 0x00, 0x22, 0x00, 0x21, 0xe3, 0xf7, + 0xc2, 0xfa, 0x30, 0x78, 0xe3, 0xf7, 0xc8, 0xfb, 0x30, 0x78, 0xe3, 0xf7, + 0x6a, 0xfc, 0x96, 0xf8, 0x21, 0x00, 0x00, 0x27, 0x02, 0x28, 0x04, 0xbf, + 0x30, 0x78, 0xe3, 0xf7, 0xff, 0xfb, 0x0d, 0xb1, 0x2f, 0x46, 0x01, 0xe0, + 0x04, 0xb1, 0x27, 0x46, 0xf0, 0x69, 0xa0, 0xf8, 0xa4, 0x80, 0x38, 0x46, + 0xbd, 0xe8, 0xf2, 0x83, 0x2d, 0xe9, 0xf0, 0x41, 0x2d, 0xed, 0x06, 0x8b, + 0x05, 0x46, 0x82, 0xb0, 0x28, 0x78, 0xff, 0xf7, 0x57, 0xfe, 0x07, 0x46, + 0x28, 0x78, 0xe3, 0xf7, 0x89, 0xfa, 0x06, 0x46, 0xf8, 0x68, 0x05, 0xf1, + 0x24, 0x04, 0x40, 0x00, 0xd4, 0xed, 0x03, 0x0a, 0x01, 0xee, 0x10, 0x0a, + 0xf8, 0xee, 0x60, 0x0a, 0xb8, 0xee, 0x41, 0x1a, 0x80, 0xee, 0x81, 0x0a, + 0x9f, 0xed, 0xcf, 0x8a, 0x00, 0xf0, 0xac, 0xf8, 0x80, 0xee, 0x28, 0x0a, + 0x20, 0xee, 0x00, 0x0a, 0xf7, 0xee, 0x00, 0x0a, 0xc0, 0xee, 0x80, 0x0a, + 0xc4, 0xed, 0x09, 0x0a, 0xf8, 0x68, 0x27, 0x68, 0x40, 0x00, 0x00, 0xee, + 0x10, 0x7a, 0x00, 0xee, 0x90, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xf8, 0xee, + 0x60, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0x00, 0xf0, 0x93, 0xf8, 0x80, 0xee, + 0x28, 0x0a, 0x20, 0xee, 0x00, 0x0a, 0xb7, 0xee, 0x00, 0x1a, 0xdf, 0xf8, + 0x18, 0x04, 0x81, 0xee, 0x00, 0x0a, 0x87, 0x42, 0x84, 0xed, 0x0b, 0x0a, + 0x06, 0xd3, 0x2e, 0xb1, 0xdf, 0xed, 0xba, 0x0a, 0x80, 0xee, 0x20, 0x0a, + 0x84, 0xed, 0x0b, 0x0a, 0x00, 0x21, 0x28, 0x78, 0xe6, 0xf7, 0x84, 0xfa, + 0x06, 0x46, 0x21, 0x68, 0x40, 0x08, 0x88, 0x42, 0x6f, 0xd2, 0x28, 0x78, + 0xdf, 0xf8, 0xec, 0x73, 0xe3, 0xf7, 0x3a, 0xfa, 0x80, 0x46, 0x28, 0x78, + 0x69, 0x46, 0xc7, 0xf7, 0xa2, 0xfd, 0xb8, 0xf1, 0x00, 0x0f, 0x08, 0xd1, + 0x00, 0x98, 0xb0, 0xf5, 0x34, 0x2f, 0x19, 0xbf, 0x12, 0x37, 0x01, 0x20, + 0x1b, 0x37, 0x02, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x85, 0xf8, 0x21, 0x00, + 0x01, 0x22, 0x28, 0x78, 0x39, 0x46, 0xe3, 0xf7, 0x34, 0xfa, 0x28, 0x78, + 0x69, 0x46, 0xc7, 0xf7, 0x8a, 0xfd, 0x95, 0xf8, 0x21, 0x00, 0x02, 0x28, + 0x0f, 0xbf, 0x38, 0x7a, 0x00, 0x98, 0xb0, 0xfb, 0xf6, 0xf0, 0xc0, 0xb2, + 0x46, 0x43, 0x00, 0xee, 0x10, 0x6a, 0xf8, 0xee, 0x40, 0x8a, 0x94, 0xed, + 0x03, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x80, 0xee, 0x28, 0x0a, 0x60, 0xee, + 0x08, 0x9a, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x9a, 0x29, 0xee, + 0x89, 0x0a, 0xba, 0xf7, 0x7f, 0xfe, 0xb0, 0xee, 0x40, 0xaa, 0xb0, 0xee, + 0x69, 0x0a, 0xba, 0xf7, 0x79, 0xfe, 0x29, 0xee, 0x00, 0x0a, 0x8a, 0xee, + 0x00, 0x0a, 0x20, 0xee, 0x00, 0x0a, 0xd4, 0xed, 0x09, 0x0a, 0x94, 0xed, + 0x00, 0x1a, 0x80, 0xee, 0x80, 0x0a, 0x84, 0xed, 0x09, 0x0a, 0xb8, 0xee, + 0x41, 0x1a, 0x81, 0xee, 0x28, 0x0a, 0x20, 0xee, 0x08, 0x8a, 0x28, 0xee, + 0x09, 0x0a, 0xba, 0xf7, 0x61, 0xfe, 0xf0, 0xee, 0x40, 0x8a, 0xb0, 0xee, + 0x48, 0x0a, 0xba, 0xf7, 0x5b, 0xfe, 0x29, 0xee, 0x00, 0x0a, 0x88, 0xee, + 0x80, 0x0a, 0x20, 0xee, 0x00, 0x0a, 0xd4, 0xed, 0x0b, 0x0a, 0x80, 0xee, + 0x80, 0x0a, 0x84, 0xed, 0x0b, 0x0a, 0x02, 0xb0, 0xbd, 0xec, 0x06, 0x8b, + 0xbd, 0xe8, 0xf0, 0x81, 0x60, 0xee, 0x08, 0x8a, 0xb0, 0xee, 0x68, 0x0a, + 0xba, 0xf7, 0x44, 0xbe, 0x2d, 0xe9, 0xf0, 0x4f, 0x05, 0x46, 0x89, 0x46, + 0x00, 0x27, 0x89, 0xb0, 0xe8, 0x68, 0x95, 0xf8, 0x00, 0xb0, 0xc1, 0x68, + 0xb9, 0xf1, 0x02, 0x0f, 0x0c, 0xbf, 0x6e, 0x6a, 0x2e, 0x6b, 0x8b, 0x1b, + 0x71, 0x18, 0x07, 0x93, 0x08, 0x91, 0x8d, 0xf8, 0x04, 0x70, 0x05, 0xeb, + 0x89, 0x00, 0x04, 0x90, 0x0d, 0xf1, 0x14, 0x08, 0x02, 0xac, 0x8d, 0xf8, + 0x05, 0x20, 0x06, 0xe0, 0x49, 0x1c, 0x8d, 0xf8, 0x04, 0x10, 0x00, 0x27, + 0xc0, 0x68, 0xd7, 0xf7, 0x51, 0xfa, 0x05, 0x97, 0xc8, 0xf8, 0x04, 0x70, + 0xba, 0x46, 0x04, 0xe0, 0x40, 0xf2, 0x04, 0x60, 0x07, 0x46, 0x0a, 0xf1, + 0x01, 0x0a, 0x9d, 0xf8, 0x05, 0x10, 0x5f, 0xfa, 0x8a, 0xf0, 0x88, 0x42, + 0x2f, 0xd2, 0x38, 0x46, 0x00, 0x27, 0x00, 0x28, 0xf2, 0xd1, 0x02, 0xa8, + 0x00, 0xeb, 0x87, 0x01, 0x00, 0x91, 0x07, 0xa8, 0x4b, 0x46, 0x50, 0xf8, + 0x27, 0x10, 0x28, 0x69, 0x90, 0xed, 0x02, 0x0a, 0x32, 0x46, 0x58, 0x46, + 0xe3, 0xf7, 0x42, 0xfc, 0x04, 0xeb, 0x87, 0x01, 0x5f, 0xea, 0x09, 0x02, + 0x91, 0xed, 0x00, 0x0a, 0x07, 0xd1, 0x29, 0x69, 0xd1, 0xed, 0x01, 0x0a, + 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xd2, 0xd4, 0x08, 0xeb, + 0x87, 0x01, 0x08, 0xeb, 0x87, 0x02, 0x91, 0xed, 0x00, 0x1a, 0x7f, 0x1c, + 0x31, 0xee, 0x00, 0x0a, 0x01, 0x2f, 0x82, 0xed, 0x00, 0x0a, 0xd2, 0xdd, + 0xc6, 0xe7, 0x00, 0x21, 0xaf, 0xb9, 0x9d, 0xf8, 0x05, 0x00, 0x02, 0x46, + 0x00, 0xee, 0x10, 0x2a, 0x08, 0xeb, 0x81, 0x02, 0xb8, 0xee, 0x40, 0x0a, + 0xd2, 0xed, 0x00, 0x0a, 0x04, 0xeb, 0x81, 0x03, 0x49, 0x1c, 0x80, 0xee, + 0x80, 0x0a, 0x01, 0x29, 0x83, 0xed, 0x00, 0x0a, 0xed, 0xdd, 0x8d, 0xf8, + 0x05, 0x00, 0x94, 0xed, 0x01, 0x0a, 0xdd, 0xed, 0x02, 0x0a, 0x80, 0xee, + 0x20, 0x0a, 0xba, 0xf7, 0x19, 0xff, 0x67, 0xb9, 0xf2, 0xee, 0x04, 0x0a, + 0x20, 0xee, 0x20, 0x0a, 0x9f, 0xed, 0x48, 0x1a, 0xb4, 0xee, 0x41, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xdb, 0x40, 0xf2, 0x04, 0x67, 0x28, 0x69, + 0x9d, 0xf8, 0x04, 0x10, 0x02, 0x78, 0x91, 0x42, 0x04, 0xd2, 0x40, 0xf2, + 0x04, 0x63, 0x9f, 0x42, 0x3f, 0xf4, 0x80, 0xaf, 0x9d, 0xf8, 0x04, 0x10, + 0x38, 0x00, 0x00, 0xee, 0x10, 0x1a, 0xb8, 0xee, 0x40, 0x0a, 0x36, 0xd1, + 0x5f, 0xea, 0x09, 0x01, 0x36, 0xd0, 0x04, 0x99, 0xd1, 0xed, 0x0f, 0x0a, + 0x91, 0xed, 0x12, 0x1a, 0x60, 0xee, 0x81, 0x0a, 0xc1, 0xed, 0x0f, 0x0a, + 0x04, 0x99, 0x95, 0xed, 0x0f, 0x1a, 0xc0, 0xee, 0x81, 0x0a, 0xc1, 0xed, + 0x0f, 0x0a, 0xb9, 0xf1, 0x02, 0x0f, 0x16, 0xd1, 0x95, 0xf8, 0x20, 0x30, + 0xea, 0x69, 0x0c, 0x21, 0x4b, 0x43, 0x13, 0x44, 0x02, 0x9a, 0x9a, 0x62, + 0x95, 0xf8, 0x20, 0x20, 0xeb, 0x69, 0x4a, 0x43, 0x1a, 0x44, 0x63, 0x68, + 0xd3, 0x62, 0x95, 0xf8, 0x20, 0x30, 0xea, 0x69, 0x11, 0xfb, 0x03, 0xf1, + 0x11, 0x44, 0x81, 0xed, 0x0c, 0x0a, 0x09, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x02, 0xa8, 0x00, 0xf0, 0xa9, 0xf8, 0x04, 0x98, 0x80, 0xed, 0x0f, 0x0a, + 0xc0, 0xe7, 0x5f, 0xea, 0x09, 0x01, 0xd8, 0xd1, 0xe9, 0x69, 0x02, 0x9a, + 0xca, 0x61, 0xe9, 0x69, 0x62, 0x68, 0x0a, 0x62, 0xe9, 0x69, 0x81, 0xed, + 0x09, 0x0a, 0xe8, 0xe7, 0xdb, 0x0f, 0x49, 0x40, 0x1c, 0x7c, 0x81, 0x3f, + 0x38, 0xb5, 0x05, 0x46, 0x00, 0xf0, 0x14, 0xf8, 0x29, 0x6b, 0x28, 0x78, + 0xe3, 0xf7, 0x56, 0xfb, 0x00, 0xf0, 0x15, 0xf8, 0x34, 0xb9, 0xa8, 0x68, + 0x82, 0x7f, 0x00, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x01, 0xff, 0x04, 0x46, + 0x00, 0xf0, 0x10, 0xf8, 0x04, 0xb9, 0x04, 0x46, 0x20, 0x46, 0x32, 0xbd, + 0x01, 0x21, 0xa8, 0x68, 0x00, 0x91, 0x1d, 0x30, 0x83, 0x79, 0x02, 0x78, + 0x70, 0x47, 0x04, 0x46, 0x28, 0x69, 0xc0, 0x68, 0xd7, 0xf7, 0x64, 0xb9, + 0xa8, 0x68, 0x1d, 0x30, 0x00, 0x21, 0x00, 0x91, 0x83, 0x79, 0x02, 0x78, + 0x29, 0x6b, 0x28, 0x78, 0xe3, 0xf7, 0x30, 0xbb, 0x01, 0x00, 0x00, 0x3f, + 0x2d, 0xe9, 0xf0, 0x43, 0x89, 0xb0, 0x80, 0x46, 0x89, 0x46, 0x16, 0x46, + 0x1f, 0x46, 0xff, 0xf7, 0x67, 0xfc, 0x68, 0x46, 0x2b, 0x49, 0x24, 0x22, + 0xba, 0xf7, 0xdc, 0xfb, 0x40, 0x46, 0xc8, 0xf7, 0xcc, 0xfb, 0x04, 0x90, + 0x03, 0xa9, 0x40, 0x46, 0xc7, 0xf7, 0x3a, 0xfc, 0x68, 0x46, 0x00, 0xf0, + 0xcd, 0xf8, 0x06, 0x98, 0x00, 0x24, 0x01, 0x28, 0x04, 0xbf, 0x08, 0x98, + 0x03, 0x90, 0x40, 0x46, 0xc8, 0xf7, 0xcd, 0xfb, 0x01, 0x90, 0x40, 0x46, + 0xc8, 0xf7, 0x9f, 0xfa, 0x05, 0x46, 0x00, 0x21, 0x40, 0x46, 0xe6, 0xf7, + 0xbb, 0xf8, 0xb5, 0xfb, 0xf0, 0xf1, 0xc9, 0xb2, 0x00, 0x91, 0x6d, 0x08, + 0x01, 0x99, 0x8d, 0x42, 0x02, 0xd2, 0x00, 0x9a, 0x52, 0x00, 0x00, 0x92, + 0x02, 0x90, 0x68, 0x46, 0x00, 0xf0, 0x44, 0xf8, 0x05, 0x98, 0x01, 0x28, + 0x0e, 0xd1, 0xd9, 0xf8, 0x31, 0x10, 0x03, 0x98, 0x49, 0x42, 0x81, 0x42, + 0x04, 0xda, 0xd9, 0xf8, 0x31, 0x00, 0x03, 0x99, 0x40, 0x18, 0x04, 0xe0, + 0x30, 0x60, 0x40, 0xf2, 0x0b, 0x64, 0x01, 0xe0, 0x03, 0x98, 0x30, 0x60, + 0x05, 0x98, 0x02, 0x28, 0x04, 0xd1, 0xd9, 0xf8, 0x35, 0x00, 0x39, 0x68, + 0x40, 0x18, 0x38, 0x60, 0x20, 0x46, 0x09, 0xb0, 0xbd, 0xe8, 0xf0, 0x83, + 0xb4, 0x76, 0x02, 0x20, 0x80, 0x1a, 0x06, 0x00, 0xc8, 0x91, 0x04, 0x01, + 0x10, 0x8c, 0x00, 0x20, 0x60, 0x92, 0x04, 0x01, 0x10, 0xb5, 0x04, 0x46, + 0x2d, 0xed, 0x02, 0x8b, 0x94, 0xed, 0x00, 0x0a, 0xba, 0xf7, 0x86, 0xff, + 0xb0, 0xee, 0x40, 0x8a, 0x94, 0xed, 0x01, 0x0a, 0xba, 0xf7, 0x80, 0xff, + 0x38, 0xee, 0x00, 0x0a, 0xf6, 0xee, 0x00, 0x0a, 0x20, 0xee, 0x20, 0x0a, + 0xbd, 0xec, 0x02, 0x8b, 0x20, 0xee, 0x00, 0x0a, 0x10, 0xbd, 0x00, 0x00, + 0x70, 0xb5, 0x04, 0x46, 0x2d, 0xed, 0x04, 0x8b, 0x94, 0xed, 0x01, 0x0a, + 0xd4, 0xed, 0x02, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xf8, 0xee, 0x60, 0x0a, + 0xc0, 0xee, 0x20, 0x0a, 0x94, 0xed, 0x00, 0x1a, 0xb8, 0xee, 0x41, 0x1a, + 0xb6, 0xee, 0x00, 0x0a, 0xfe, 0xee, 0x00, 0x1a, 0x21, 0xee, 0x00, 0x0a, + 0x61, 0xee, 0x21, 0x1a, 0x30, 0xee, 0x60, 0x0a, 0x71, 0xee, 0xe0, 0x1a, + 0xbd, 0xee, 0xc0, 0x0a, 0xbd, 0xee, 0xe1, 0x8a, 0x00, 0x20, 0x60, 0x61, + 0x18, 0xee, 0x10, 0x6a, 0xff, 0xee, 0x00, 0x8a, 0x10, 0xee, 0x10, 0x5a, + 0x16, 0xe0, 0x60, 0x69, 0x98, 0xb9, 0x00, 0xee, 0x10, 0x6a, 0xb8, 0xee, + 0xc0, 0x9a, 0x9f, 0xed, 0x18, 0x1a, 0xf0, 0xee, 0x68, 0x0a, 0xb0, 0xee, + 0x49, 0x0a, 0x00, 0xf0, 0x2d, 0xf8, 0x9f, 0xed, 0x14, 0x1a, 0xf0, 0xee, + 0x68, 0x0a, 0x29, 0xee, 0x28, 0x0a, 0x00, 0xf0, 0x25, 0xf8, 0x76, 0x1c, + 0xb5, 0x42, 0xe6, 0xda, 0x18, 0xee, 0x10, 0x6a, 0x14, 0xe0, 0x60, 0x69, + 0x88, 0xb9, 0x00, 0xee, 0x10, 0x6a, 0xb8, 0xee, 0xc0, 0x0a, 0x20, 0xee, + 0x28, 0x8a, 0xb7, 0xee, 0x00, 0x1a, 0xf7, 0xee, 0x00, 0x0a, 0x00, 0xf0, + 0x0f, 0xf8, 0xb7, 0xee, 0x00, 0x1a, 0xf0, 0xee, 0x68, 0x0a, 0x00, 0xf0, + 0x09, 0xf8, 0x76, 0x1c, 0xb5, 0x42, 0xe8, 0xda, 0xbd, 0xec, 0x04, 0x8b, + 0x70, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xee, 0x48, 0x0a, + 0x20, 0x46, 0x08, 0xe0, 0x00, 0x21, 0x81, 0x61, 0xc2, 0x68, 0xc1, 0x69, + 0x8a, 0x42, 0x3c, 0xbf, 0x01, 0x22, 0x82, 0x61, 0x70, 0x47, 0x70, 0xb5, + 0x2d, 0xed, 0x06, 0x8b, 0x04, 0x46, 0xb0, 0xee, 0x60, 0x8a, 0xf0, 0xee, + 0x41, 0x8a, 0x94, 0xed, 0x04, 0x1a, 0x61, 0x68, 0xe2, 0x68, 0x01, 0xee, + 0x90, 0x1a, 0xf8, 0xee, 0x61, 0x1a, 0x02, 0xee, 0x10, 0x2a, 0x61, 0xee, + 0xa8, 0x1a, 0xb8, 0xee, 0x42, 0x2a, 0x42, 0xee, 0x48, 0x1a, 0xb8, 0xee, + 0x41, 0xaa, 0x53, 0x00, 0x09, 0xee, 0x10, 0x3a, 0xfc, 0xee, 0xe8, 0x0a, + 0x10, 0xee, 0x90, 0x5a, 0xd4, 0xed, 0x02, 0x0a, 0xf8, 0xee, 0x60, 0x0a, + 0x60, 0xee, 0x80, 0x9a, 0xb6, 0xee, 0x00, 0x0a, 0x49, 0xee, 0xc0, 0x1a, + 0x2a, 0xee, 0x00, 0x0a, 0x81, 0xee, 0x80, 0x0a, 0xc5, 0xf1, 0x01, 0x06, + 0x01, 0xfb, 0x05, 0xf0, 0x02, 0xfb, 0x06, 0x06, 0xba, 0xf7, 0x20, 0xfc, + 0x68, 0xee, 0x88, 0x0a, 0xb8, 0xee, 0x49, 0x1a, 0x40, 0xee, 0x81, 0x9a, + 0x4a, 0xee, 0x00, 0x9a, 0xfd, 0xee, 0xe9, 0x0a, 0x76, 0x00, 0x10, 0xee, + 0x90, 0x0a, 0x30, 0x1a, 0x48, 0xbf, 0x40, 0x42, 0x64, 0x28, 0xbc, 0xbf, + 0x6d, 0x1c, 0x65, 0x61, 0xbd, 0xec, 0x06, 0x8b, 0x70, 0xbd, 0x00, 0x00, + 0x2d, 0xe9, 0xf0, 0x41, 0x04, 0x46, 0x0d, 0x46, 0xc7, 0xf7, 0x81, 0xfb, + 0xdf, 0xf8, 0xec, 0x24, 0xdf, 0xf8, 0xec, 0x84, 0x13, 0x68, 0x00, 0x21, + 0x43, 0xf8, 0x20, 0x10, 0x00, 0x27, 0xc7, 0xf7, 0x76, 0xfb, 0xdf, 0xf8, + 0xe0, 0x24, 0x13, 0x68, 0x00, 0x21, 0x43, 0xf8, 0x20, 0x10, 0x24, 0xfa, + 0x07, 0xf0, 0xc0, 0x07, 0x0f, 0xd5, 0x38, 0x46, 0xc8, 0xf7, 0x2a, 0xfb, + 0x06, 0x46, 0xcc, 0x21, 0x01, 0xfb, 0x06, 0xf0, 0x40, 0x44, 0xcc, 0xf7, + 0xe3, 0xfd, 0xa9, 0x19, 0x00, 0x20, 0x08, 0x70, 0xf8, 0xb2, 0xe3, 0xf7, + 0x8b, 0xfb, 0x7f, 0x1c, 0x08, 0x2f, 0xe8, 0xd3, 0xbd, 0xe8, 0xf0, 0x81, + 0x2d, 0xe9, 0xf0, 0x4f, 0x89, 0x46, 0xdf, 0xf8, 0xa0, 0x14, 0x01, 0xf1, + 0x14, 0x03, 0x01, 0xf1, 0x24, 0x02, 0x9d, 0xb0, 0x80, 0x46, 0x0c, 0x93, + 0x0a, 0x92, 0x0b, 0x91, 0x00, 0x24, 0xdf, 0xf8, 0x7c, 0x34, 0xd1, 0xf8, + 0x49, 0x20, 0x18, 0x68, 0xdf, 0xf8, 0x80, 0x14, 0x03, 0x94, 0x02, 0x94, + 0x05, 0x94, 0x04, 0x94, 0xc7, 0xf7, 0x47, 0xfb, 0x00, 0x27, 0x00, 0x25, + 0x20, 0xb9, 0x40, 0xf2, 0x0a, 0x65, 0x0f, 0xf2, 0x8c, 0x42, 0x17, 0xe1, + 0x0a, 0x98, 0xd0, 0xf8, 0x2d, 0x20, 0xd0, 0xf8, 0x29, 0x30, 0x01, 0x21, + 0xd8, 0xb2, 0xc7, 0xf7, 0xad, 0xfc, 0x5f, 0xea, 0x00, 0x0a, 0x06, 0xd0, + 0x0f, 0xf2, 0x88, 0x42, 0x06, 0x21, 0x01, 0x20, 0xc8, 0xf7, 0xdb, 0xfb, + 0xf1, 0xe0, 0x00, 0x21, 0x05, 0xa8, 0xc7, 0xf7, 0x52, 0xfa, 0x01, 0x21, + 0x04, 0xa8, 0xc7, 0xf7, 0x4e, 0xfa, 0x00, 0x26, 0xcd, 0xf8, 0x1c, 0x80, + 0xcd, 0xf8, 0x18, 0x90, 0xe2, 0xf7, 0x26, 0xfe, 0x00, 0x28, 0x40, 0xf0, + 0xad, 0x80, 0x07, 0x98, 0xf0, 0x40, 0xc1, 0x07, 0x40, 0xf1, 0xa8, 0x80, + 0x5f, 0xfa, 0x86, 0xf8, 0x40, 0x46, 0xc8, 0xf7, 0xc5, 0xfa, 0xcc, 0x23, + 0x43, 0x43, 0xdf, 0xf8, 0xf4, 0x13, 0xdd, 0xf8, 0x18, 0xa0, 0x09, 0x90, + 0x19, 0x44, 0x00, 0x91, 0x0d, 0x91, 0x82, 0x44, 0xdf, 0xf8, 0xf0, 0x13, + 0xcd, 0xf8, 0x38, 0xa0, 0x19, 0x44, 0x0f, 0x91, 0x00, 0x22, 0x0b, 0x99, + 0x8d, 0xf8, 0x20, 0x60, 0x12, 0x92, 0x88, 0x68, 0x18, 0xb9, 0x0c, 0x31, + 0x40, 0x46, 0xc7, 0xf7, 0x73, 0xfa, 0x0d, 0x98, 0xe2, 0xf7, 0xe7, 0xfd, + 0x0a, 0x98, 0x01, 0x78, 0x01, 0x29, 0x5f, 0xfa, 0x86, 0xf9, 0x15, 0xd1, + 0x4b, 0x46, 0x0f, 0xf2, 0x0c, 0x42, 0x06, 0x21, 0x02, 0x20, 0xc8, 0xf7, + 0x92, 0xfb, 0x40, 0x46, 0xc8, 0xf7, 0xff, 0xf9, 0x02, 0x46, 0x0a, 0x99, + 0x9d, 0xf8, 0x20, 0x00, 0xe3, 0xf7, 0xfc, 0xf9, 0x00, 0x28, 0x14, 0xbf, + 0x00, 0x27, 0x40, 0xf2, 0x04, 0x67, 0x61, 0xe0, 0x00, 0x2d, 0x40, 0xd1, + 0x90, 0xf8, 0x39, 0x00, 0x20, 0xb3, 0x4f, 0xf0, 0x02, 0x0a, 0xdd, 0xf8, + 0x48, 0xb0, 0xdf, 0xf8, 0x84, 0x13, 0x12, 0xab, 0x03, 0xaa, 0xf0, 0xb2, + 0xff, 0xf7, 0xf4, 0xfd, 0x04, 0x00, 0x14, 0xd1, 0x02, 0xa9, 0x40, 0x46, + 0xc7, 0xf7, 0x3e, 0xfa, 0x02, 0x98, 0x03, 0x99, 0x88, 0x42, 0x09, 0xd0, + 0xf0, 0xb2, 0xe3, 0xf7, 0x61, 0xfb, 0x04, 0x00, 0x07, 0xd1, 0x03, 0x98, + 0xdf, 0xf8, 0x48, 0x13, 0xc8, 0x60, 0x02, 0xe0, 0x12, 0x98, 0x83, 0x45, + 0x03, 0xd0, 0xba, 0xf1, 0x01, 0x0a, 0xdc, 0xd1, 0xac, 0xb9, 0x00, 0x98, + 0x00, 0xf1, 0xac, 0x01, 0x40, 0x46, 0xc7, 0xf7, 0x23, 0xfa, 0x08, 0xa8, + 0xff, 0xf7, 0x4c, 0xfa, 0x07, 0x46, 0xf0, 0xb2, 0xe3, 0xf7, 0x04, 0xfb, + 0x01, 0x90, 0x00, 0x97, 0x4b, 0x46, 0x0f, 0xf2, 0x88, 0x32, 0x06, 0x21, + 0x03, 0x20, 0xc8, 0xf7, 0x42, 0xfb, 0x07, 0xb9, 0x27, 0x46, 0x40, 0xf2, + 0x06, 0x60, 0x87, 0x42, 0x08, 0xd1, 0x0a, 0x99, 0x91, 0xf8, 0x24, 0x00, + 0xb0, 0xb9, 0x00, 0x27, 0x4b, 0x46, 0xdf, 0xf8, 0x00, 0x23, 0x0d, 0xe0, + 0x40, 0xf2, 0x07, 0x60, 0x87, 0x42, 0x01, 0xbf, 0x0a, 0x99, 0x01, 0xf1, + 0x24, 0x02, 0x90, 0x7d, 0x00, 0x28, 0x07, 0xd1, 0x00, 0x27, 0x4b, 0x46, + 0xdf, 0xf8, 0xe4, 0x22, 0x06, 0x21, 0x02, 0x20, 0xc8, 0xf7, 0x21, 0xfb, + 0x0d, 0x98, 0x39, 0x46, 0xe2, 0xf7, 0x69, 0xfd, 0x05, 0xb9, 0x3d, 0x46, + 0x76, 0x1c, 0xf0, 0xb2, 0x08, 0x28, 0xff, 0xf6, 0x49, 0xaf, 0x00, 0x21, + 0x02, 0xa8, 0xc7, 0xf7, 0x8e, 0xf9, 0x02, 0x98, 0x05, 0x99, 0x88, 0x42, + 0x05, 0xd0, 0x05, 0x98, 0x00, 0x21, 0xc7, 0xf7, 0xfa, 0xf8, 0x05, 0xb9, + 0x05, 0x46, 0x01, 0x21, 0x02, 0xa8, 0xc7, 0xf7, 0x80, 0xf9, 0x02, 0x98, + 0x04, 0x99, 0x88, 0x42, 0x05, 0xd0, 0x04, 0x98, 0x01, 0x21, 0xc7, 0xf7, + 0xec, 0xf8, 0x05, 0xb9, 0x05, 0x46, 0x0a, 0x98, 0xd0, 0xf8, 0x2d, 0x10, + 0xd0, 0xf8, 0x29, 0x20, 0xd0, 0xb2, 0xc7, 0xf7, 0x01, 0xfc, 0x5f, 0xea, + 0x00, 0x0a, 0x0b, 0xd0, 0x0f, 0xf2, 0xf0, 0x22, 0x06, 0x21, 0x01, 0x20, + 0xc8, 0xf7, 0xe9, 0xfa, 0x05, 0xb9, 0x55, 0x46, 0x28, 0x46, 0x1d, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x92, 0x48, 0x93, 0x49, 0xd0, 0xf8, 0x49, 0x20, + 0x8f, 0x48, 0x00, 0x68, 0xc7, 0xf7, 0x2d, 0xfa, 0x00, 0x28, 0xef, 0xd1, + 0x40, 0xf2, 0x0a, 0x65, 0x0f, 0xf2, 0xd8, 0x22, 0x06, 0x21, 0x02, 0x20, + 0xc8, 0xf7, 0xd1, 0xfa, 0xe8, 0xe7, 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, + 0x09, 0xf8, 0xd2, 0xf7, 0x8e, 0xf9, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, + 0x03, 0xf8, 0xd2, 0xf7, 0x73, 0xf9, 0x02, 0xbd, 0x00, 0x92, 0x0b, 0x46, + 0x02, 0x46, 0x3b, 0x21, 0x83, 0x48, 0x70, 0x47, 0xf8, 0xb5, 0x0c, 0x46, + 0x15, 0x46, 0x1f, 0x46, 0xe2, 0xf7, 0x16, 0xfd, 0xc8, 0xf7, 0xbc, 0xf9, + 0x00, 0x26, 0xff, 0x28, 0x16, 0xd0, 0xcc, 0x21, 0x77, 0x4a, 0x48, 0x43, + 0x11, 0x18, 0x17, 0xb1, 0x02, 0x2f, 0x0a, 0xd0, 0x0b, 0xe0, 0x14, 0x27, + 0x28, 0x68, 0xb8, 0x42, 0x0d, 0xd3, 0x3a, 0x46, 0x20, 0x46, 0xba, 0xf7, + 0xfd, 0xf8, 0x2f, 0x60, 0x09, 0xe0, 0xcc, 0x27, 0xf4, 0xe7, 0x4f, 0xf6, + 0x2a, 0x76, 0x04, 0xe0, 0x4f, 0xf6, 0x52, 0x76, 0x01, 0xe0, 0x4f, 0xf6, + 0x26, 0x76, 0x30, 0x46, 0xf2, 0xbd, 0xf8, 0xb5, 0x0e, 0x46, 0x15, 0x46, + 0x1f, 0x46, 0xe2, 0xf7, 0xed, 0xfc, 0x00, 0x24, 0xc8, 0xf7, 0x92, 0xf9, + 0x01, 0x2e, 0x66, 0x48, 0x4f, 0xf6, 0x61, 0x73, 0x25, 0xd0, 0x22, 0xd3, + 0x03, 0x2e, 0x10, 0xd0, 0x1f, 0xd2, 0x10, 0x2f, 0x08, 0xd3, 0x29, 0x78, + 0x01, 0x75, 0x69, 0x68, 0x81, 0x61, 0xaa, 0x68, 0xc2, 0x61, 0xe9, 0x68, + 0x01, 0x62, 0x16, 0xe0, 0x04, 0x2f, 0x07, 0xd1, 0x29, 0x68, 0xc1, 0x61, + 0x11, 0xe0, 0x06, 0x99, 0x07, 0x9a, 0x0c, 0x60, 0x10, 0x2a, 0x01, 0xd2, + 0x1c, 0x46, 0x0a, 0xe0, 0x02, 0x7d, 0x2a, 0x70, 0x10, 0x22, 0x83, 0x69, + 0x6b, 0x60, 0xc0, 0x69, 0xa8, 0x60, 0x0a, 0x60, 0x01, 0xe0, 0x4f, 0xf6, + 0x27, 0x74, 0x20, 0x46, 0xf2, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x01, 0x29, + 0x0c, 0xd1, 0x54, 0x49, 0x0a, 0x60, 0x14, 0x68, 0xe2, 0xf7, 0xb9, 0xfc, + 0x21, 0x46, 0x00, 0xf0, 0x0e, 0xf8, 0x04, 0x46, 0x7a, 0xa2, 0x06, 0x21, + 0x03, 0x20, 0x04, 0xe0, 0x4f, 0xf6, 0x27, 0x74, 0x7d, 0xa2, 0x06, 0x21, + 0x02, 0x20, 0xc8, 0xf7, 0x46, 0xfa, 0x20, 0x46, 0x10, 0xbd, 0x2d, 0xe9, + 0xf0, 0x4f, 0x95, 0xb0, 0x8a, 0x46, 0x41, 0x49, 0xdf, 0xf8, 0x1c, 0x91, + 0x03, 0x91, 0x01, 0xf1, 0x24, 0x02, 0x14, 0x31, 0x04, 0x91, 0x01, 0x27, + 0x03, 0x99, 0x02, 0x92, 0x80, 0x46, 0x00, 0x24, 0x0f, 0x61, 0x00, 0x25, + 0x28, 0xfa, 0x05, 0xf0, 0xc0, 0x07, 0x5e, 0xd5, 0x28, 0x46, 0xc8, 0xf7, + 0x31, 0xf9, 0xcc, 0x22, 0x33, 0x49, 0x42, 0x43, 0x8b, 0x18, 0x09, 0xeb, + 0x00, 0x04, 0x05, 0x93, 0x04, 0xf1, 0x30, 0x01, 0x06, 0x91, 0x01, 0x90, + 0x03, 0xf1, 0x24, 0x02, 0x03, 0x99, 0x8d, 0xf8, 0x00, 0x50, 0x07, 0x92, + 0x88, 0x68, 0x18, 0xb9, 0x0c, 0x31, 0x28, 0x46, 0xc7, 0xf7, 0xe4, 0xf8, + 0x32, 0x48, 0x01, 0x68, 0x4a, 0x19, 0xed, 0x20, 0x92, 0xf8, 0xbc, 0x30, + 0x43, 0x43, 0x19, 0x44, 0x00, 0x24, 0xd1, 0xf8, 0xc1, 0x04, 0x4f, 0xf4, + 0x7a, 0x71, 0x41, 0x43, 0xb0, 0xf5, 0xf0, 0x2f, 0x1c, 0xbf, 0xb0, 0xf5, + 0xb4, 0x2f, 0x49, 0x08, 0x29, 0x48, 0x82, 0x45, 0x01, 0xd3, 0x8a, 0x45, + 0x01, 0xd3, 0x40, 0xf2, 0x09, 0x64, 0x5c, 0xbb, 0x4f, 0xf4, 0x7a, 0x70, + 0xba, 0xfb, 0xf0, 0xf1, 0x28, 0x46, 0xc8, 0xf7, 0x59, 0xf8, 0x05, 0x98, + 0xe2, 0xf7, 0x35, 0xfc, 0x05, 0x99, 0x08, 0x69, 0x00, 0xb9, 0x02, 0x27, + 0x01, 0x26, 0xae, 0x40, 0x30, 0x46, 0xd4, 0xf7, 0xe9, 0xfc, 0x4f, 0xf0, + 0x00, 0x0b, 0x05, 0xe0, 0x68, 0x46, 0xff, 0xf7, 0xdb, 0xf8, 0x04, 0x46, + 0x0b, 0xf1, 0x01, 0x0b, 0xbb, 0x45, 0xf7, 0xd3, 0x30, 0x46, 0xd4, 0xf7, + 0xde, 0xfc, 0x05, 0x98, 0x21, 0x46, 0xe2, 0xf7, 0x1e, 0xfc, 0x28, 0x46, + 0xc8, 0xf7, 0x3a, 0xf8, 0x14, 0xb9, 0x6d, 0x1c, 0x08, 0x2d, 0x99, 0xdb, + 0x03, 0x99, 0x00, 0x20, 0x08, 0x61, 0x15, 0xb0, 0x20, 0x46, 0xbd, 0xe8, + 0xf0, 0x8f, 0x00, 0x00, 0xfc, 0x04, 0x00, 0x01, 0x68, 0x59, 0x03, 0x20, + 0x08, 0x05, 0x00, 0x01, 0xb0, 0x8b, 0x00, 0x20, 0xad, 0x96, 0x02, 0x01, + 0x8c, 0x59, 0x03, 0x20, 0xd4, 0x8b, 0x00, 0x20, 0x28, 0x8d, 0x04, 0x01, + 0x58, 0x8d, 0x04, 0x01, 0x98, 0x77, 0x02, 0x20, 0xc0, 0x77, 0x02, 0x20, + 0xb4, 0x76, 0x02, 0x20, 0x80, 0xf0, 0xfa, 0x02, 0x42, 0x42, 0x46, 0x3a, + 0x20, 0x70, 0x72, 0x65, 0x2d, 0x43, 0x61, 0x6c, 0x20, 0x43, 0x50, 0x55, + 0x20, 0x53, 0x79, 0x6e, 0x63, 0x20, 0x65, 0x72, 0x72, 0x0a, 0x00, 0x00, + 0x42, 0x42, 0x46, 0x3a, 0x20, 0x73, 0x65, 0x6d, 0x20, 0x74, 0x61, 0x6b, + 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x0a, 0x00, 0x54, 0x78, 0x42, 0x42, + 0x46, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x20, 0x2d, 0x20, 0x42, 0x79, + 0x70, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x54, 0x78, 0x42, 0x42, 0x46, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, + 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x58, 0x2c, 0x20, 0x25, 0x64, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x46, 0x3a, 0x20, 0x73, 0x65, 0x6d, + 0x20, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x65, 0x72, 0x72, + 0x0a, 0x00, 0x00, 0x00, 0x42, 0x42, 0x46, 0x3a, 0x20, 0x70, 0x6f, 0x73, + 0x74, 0x2d, 0x43, 0x61, 0x6c, 0x20, 0x43, 0x50, 0x55, 0x20, 0x53, 0x79, + 0x6e, 0x63, 0x20, 0x65, 0x72, 0x72, 0x0a, 0x00, 0x54, 0x78, 0x42, 0x42, + 0x46, 0x20, 0x44, 0x65, 0x62, 0x75, 0x67, 0x20, 0x2d, 0x20, 0x74, 0x65, + 0x73, 0x74, 0x20, 0x63, 0x6d, 0x64, 0x0a, 0x00, 0x54, 0x78, 0x42, 0x42, + 0x46, 0x20, 0x44, 0x65, 0x62, 0x75, 0x67, 0x20, 0x2d, 0x20, 0x62, 0x61, + 0x64, 0x20, 0x63, 0x6d, 0x64, 0x0a, 0x00, 0x00, 0x65, 0x4e, 0x04, 0x01, + 0x7f, 0x4f, 0x04, 0x01, 0x59, 0x4f, 0x04, 0x01, 0x65, 0x4f, 0x04, 0x01, + 0x17, 0x50, 0x04, 0x01, 0x65, 0x50, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x95, 0x39, 0x04, 0x01, 0xf1, 0x39, 0x04, 0x01, 0xfd, 0x39, 0x04, 0x01, + 0x63, 0x3a, 0x04, 0x01, 0xc1, 0x3a, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0x77, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x4b, 0xec, 0x03, 0x01, 0x99, 0xeb, 0x03, 0x01, 0xa5, 0xeb, 0x03, 0x01, + 0xf9, 0xec, 0x03, 0x01, 0x51, 0xed, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa8, 0x7e, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x4d, 0x09, 0x03, 0x01, 0x93, 0x0b, 0x03, 0x01, 0xc3, 0x0b, 0x03, 0x01, + 0x57, 0x0a, 0x03, 0x01, 0xcf, 0x0b, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9f, 0x26, 0x03, 0x01, 0x0f, 0x28, 0x03, 0x01, 0x1b, 0x28, 0x03, 0x01, + 0x93, 0x27, 0x03, 0x01, 0x39, 0x28, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7d, 0x32, 0x03, 0x01, 0xd9, 0x33, 0x03, 0x01, 0xe5, 0x33, 0x03, 0x01, + 0x5d, 0x33, 0x03, 0x01, 0x05, 0x34, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0x2c, 0x03, 0x01, 0x49, 0x2e, 0x03, 0x01, 0x55, 0x2e, 0x03, 0x01, + 0xcb, 0x2d, 0x03, 0x01, 0x6d, 0x2e, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x50, 0x9c, 0x04, 0x01, 0x40, 0x9a, 0x01, 0x20, 0x2c, 0x01, 0x00, 0x00, + 0x78, 0x4a, 0x02, 0x20, 0x10, 0x6d, 0x02, 0x20, 0x2c, 0x62, 0x02, 0x20, + 0xa0, 0x99, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x60, 0x9c, 0x04, 0x01, 0xf0, 0x9e, 0x01, 0x20, + 0x2c, 0x01, 0x00, 0x00, 0xe8, 0x4a, 0x02, 0x20, 0x2c, 0x6d, 0x02, 0x20, + 0x58, 0x62, 0x02, 0x20, 0xb4, 0x99, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x70, 0x9c, 0x04, 0x01, + 0xa0, 0xa3, 0x01, 0x20, 0x2c, 0x01, 0x00, 0x00, 0x58, 0x4b, 0x02, 0x20, + 0x48, 0x6d, 0x02, 0x20, 0x84, 0x62, 0x02, 0x20, 0xc8, 0x99, 0x04, 0x01, + 0x02, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x80, 0x9c, 0x04, 0x01, 0x50, 0xa8, 0x01, 0x20, 0x2c, 0x01, 0x00, 0x00, + 0xc8, 0x4b, 0x02, 0x20, 0x64, 0x6d, 0x02, 0x20, 0xb0, 0x62, 0x02, 0x20, + 0xdc, 0x99, 0x04, 0x01, 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x90, 0x9c, 0x04, 0x01, 0xe0, 0xe1, 0x00, 0x20, + 0x4c, 0x04, 0x00, 0x00, 0x38, 0x4c, 0x02, 0x20, 0x80, 0x6d, 0x02, 0x20, + 0xdc, 0x62, 0x02, 0x20, 0xf0, 0x99, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x31, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0xa0, 0x9c, 0x04, 0x01, + 0x10, 0xf3, 0x00, 0x20, 0x4c, 0x04, 0x00, 0x00, 0xa8, 0x4c, 0x02, 0x20, + 0x9c, 0x6d, 0x02, 0x20, 0x08, 0x63, 0x02, 0x20, 0x04, 0x9a, 0x04, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0xb0, 0x9c, 0x04, 0x01, 0x40, 0x04, 0x01, 0x20, 0x4c, 0x04, 0x00, 0x00, + 0x18, 0x4d, 0x02, 0x20, 0xb8, 0x6d, 0x02, 0x20, 0x34, 0x63, 0x02, 0x20, + 0x18, 0x9a, 0x04, 0x01, 0x02, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0xc0, 0x9c, 0x04, 0x01, 0x70, 0x15, 0x01, 0x20, + 0x4c, 0x04, 0x00, 0x00, 0x88, 0x4d, 0x02, 0x20, 0xd4, 0x6d, 0x02, 0x20, + 0x60, 0x63, 0x02, 0x20, 0x2c, 0x9a, 0x04, 0x01, 0x03, 0x00, 0x00, 0x00, + 0x31, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xd0, 0x9c, 0x04, 0x01, + 0xa0, 0x26, 0x01, 0x20, 0x4c, 0x04, 0x00, 0x00, 0xf8, 0x4d, 0x02, 0x20, + 0xf0, 0x6d, 0x02, 0x20, 0x8c, 0x63, 0x02, 0x20, 0x40, 0x9a, 0x04, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0xe0, 0x9c, 0x04, 0x01, 0xd0, 0x37, 0x01, 0x20, 0x4c, 0x04, 0x00, 0x00, + 0x68, 0x4e, 0x02, 0x20, 0x0c, 0x6e, 0x02, 0x20, 0xb8, 0x63, 0x02, 0x20, + 0x54, 0x9a, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0xf0, 0x9c, 0x04, 0x01, 0x00, 0x49, 0x01, 0x20, + 0x4c, 0x04, 0x00, 0x00, 0xd8, 0x4e, 0x02, 0x20, 0x28, 0x6e, 0x02, 0x20, + 0xe4, 0x63, 0x02, 0x20, 0x68, 0x9a, 0x04, 0x01, 0x02, 0x00, 0x00, 0x00, + 0x32, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x9d, 0x04, 0x01, + 0x30, 0x5a, 0x01, 0x20, 0x4c, 0x04, 0x00, 0x00, 0x48, 0x4f, 0x02, 0x20, + 0x44, 0x6e, 0x02, 0x20, 0x10, 0x64, 0x02, 0x20, 0x7c, 0x9a, 0x04, 0x01, + 0x03, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0xa4, 0x9d, 0x04, 0x01, 0xb8, 0xb8, 0x01, 0x20, 0xaa, 0x02, 0x00, 0x00, + 0xb0, 0x6f, 0x02, 0x20, 0x58, 0x76, 0x02, 0x20, 0xdc, 0x73, 0x02, 0x20, + 0x10, 0x9d, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x66, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x04, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x66, 0x04, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x04, 0x00, 0x01, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x66, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x04, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x00, 0x00, 0x20, 0x9d, 0x04, 0x01, 0xa0, 0x90, 0x00, 0x20, + 0x14, 0x05, 0x00, 0x00, 0x78, 0x51, 0x02, 0x20, 0x40, 0x6f, 0x02, 0x20, + 0xec, 0x64, 0x02, 0x20, 0x90, 0x9a, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x34, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x30, 0x9d, 0x04, 0x01, + 0xf0, 0xa4, 0x00, 0x20, 0x14, 0x05, 0x00, 0x00, 0xe8, 0x51, 0x02, 0x20, + 0x5c, 0x6f, 0x02, 0x20, 0x18, 0x65, 0x02, 0x20, 0xa4, 0x9a, 0x04, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, + 0x40, 0x9d, 0x04, 0x01, 0x40, 0xb9, 0x00, 0x20, 0x14, 0x05, 0x00, 0x00, + 0x58, 0x52, 0x02, 0x20, 0x78, 0x6f, 0x02, 0x20, 0x44, 0x65, 0x02, 0x20, + 0xb8, 0x9a, 0x04, 0x01, 0x02, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x50, 0x9d, 0x04, 0x01, 0x90, 0xcd, 0x00, 0x20, + 0x14, 0x05, 0x00, 0x00, 0xc8, 0x52, 0x02, 0x20, 0x94, 0x6f, 0x02, 0x20, + 0x70, 0x65, 0x02, 0x20, 0xcc, 0x9a, 0x04, 0x01, 0x03, 0x00, 0x00, 0x00, + 0x34, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xe0, 0x9a, 0x04, 0x01, + 0x80, 0x87, 0x01, 0x20, 0x2c, 0x01, 0x00, 0x00, 0xb8, 0x4f, 0x02, 0x20, + 0xd0, 0x6e, 0x02, 0x20, 0x3c, 0x64, 0x02, 0x20, 0xf4, 0x9a, 0x04, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x08, 0x9b, 0x04, 0x01, 0x30, 0x8c, 0x01, 0x20, 0x2c, 0x01, 0x00, 0x00, + 0x28, 0x50, 0x02, 0x20, 0xec, 0x6e, 0x02, 0x20, 0x68, 0x64, 0x02, 0x20, + 0x1c, 0x9b, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, + 0x12, 0x00, 0x00, 0x00, 0x30, 0x9b, 0x04, 0x01, 0xe0, 0x90, 0x01, 0x20, + 0x2c, 0x01, 0x00, 0x00, 0x98, 0x50, 0x02, 0x20, 0x08, 0x6f, 0x02, 0x20, + 0x94, 0x64, 0x02, 0x20, 0x44, 0x9b, 0x04, 0x01, 0x02, 0x00, 0x00, 0x00, + 0x35, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x58, 0x9b, 0x04, 0x01, + 0x90, 0x95, 0x01, 0x20, 0x2c, 0x01, 0x00, 0x00, 0x08, 0x51, 0x02, 0x20, + 0x24, 0x6f, 0x02, 0x20, 0xc0, 0x64, 0x02, 0x20, 0x6c, 0x9b, 0x04, 0x01, + 0x03, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x80, 0x9b, 0x04, 0x01, 0xe0, 0xcc, 0x01, 0x20, 0x2c, 0x01, 0x00, 0x00, + 0x60, 0x6e, 0x02, 0x20, 0x3c, 0x76, 0x02, 0x20, 0xb0, 0x73, 0x02, 0x20, + 0x94, 0x9b, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x66, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x04, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x66, 0x04, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x04, 0x00, 0x01, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x66, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x04, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2d, 0xe9, 0xf0, 0x47, 0x81, 0x46, 0xdf, 0xf8, 0xa4, 0x43, 0xdf, 0xf8, + 0xa4, 0x53, 0xdf, 0xf8, 0xa4, 0x83, 0xdf, 0xf8, 0xa4, 0xa3, 0xdf, 0xf8, + 0xa4, 0x63, 0x00, 0x20, 0x20, 0x70, 0x00, 0x27, 0x29, 0xfa, 0x07, 0xf0, + 0xc0, 0x07, 0x12, 0xd5, 0x38, 0x46, 0xc7, 0xf7, 0x85, 0xfd, 0x0c, 0x21, + 0x41, 0x43, 0x21, 0x44, 0x1c, 0x22, 0x24, 0x23, 0x42, 0x43, 0x58, 0x43, + 0x4e, 0x60, 0x52, 0x44, 0x40, 0x44, 0x8a, 0x60, 0xc8, 0x60, 0x09, 0x1d, + 0x2a, 0x68, 0x42, 0xf8, 0x27, 0x10, 0x7f, 0x1c, 0x08, 0x2f, 0xe5, 0xd3, + 0xbd, 0xe8, 0xf0, 0x87, 0x2d, 0xe9, 0xf8, 0x4f, 0xdf, 0xf8, 0x5c, 0x23, + 0x11, 0x78, 0x84, 0xb0, 0x4f, 0xf0, 0x00, 0x08, 0x29, 0xb9, 0xdf, 0xf8, + 0x40, 0x23, 0x11, 0x78, 0x00, 0x29, 0x40, 0xf0, 0x30, 0x81, 0x00, 0x24, + 0xa1, 0x46, 0x02, 0x94, 0x00, 0x25, 0xdf, 0xf8, 0x3c, 0x73, 0x80, 0x46, + 0x28, 0xfa, 0x05, 0xf0, 0xc0, 0x07, 0x22, 0xd5, 0x28, 0x46, 0xc7, 0xf7, + 0x53, 0xfd, 0x82, 0x46, 0x1c, 0x21, 0xc8, 0x48, 0x01, 0xfb, 0x0a, 0xf1, + 0x46, 0x18, 0x30, 0x46, 0xe2, 0xf7, 0x8b, 0xf8, 0x01, 0x22, 0xb9, 0x78, + 0x02, 0xfa, 0x0a, 0xfa, 0x11, 0xea, 0x0a, 0x0f, 0x05, 0xd0, 0x96, 0xed, + 0x05, 0x0a, 0x28, 0x46, 0x00, 0xf0, 0x82, 0xf9, 0x74, 0x61, 0xf9, 0x78, + 0x11, 0xea, 0x0a, 0x0f, 0x05, 0xd0, 0x96, 0xed, 0x06, 0x0a, 0x28, 0x46, + 0x00, 0xf0, 0x90, 0xf9, 0xb4, 0x61, 0x6d, 0x1c, 0x08, 0x2d, 0xd5, 0xd3, + 0xcd, 0xf8, 0x04, 0x80, 0xa2, 0x46, 0x02, 0x9e, 0x00, 0x25, 0x01, 0x98, + 0x20, 0xfa, 0x0a, 0xf0, 0xc1, 0x07, 0x3e, 0xd5, 0x50, 0x46, 0xc6, 0xf7, + 0x0e, 0xfd, 0x80, 0x46, 0x69, 0x46, 0x50, 0x46, 0xc6, 0xf7, 0xe8, 0xfc, + 0x50, 0x46, 0xc7, 0xf7, 0x1b, 0xfd, 0x83, 0x46, 0x78, 0x78, 0x40, 0xb9, + 0xb8, 0xf1, 0x00, 0x0f, 0x27, 0xd0, 0xb8, 0xf1, 0x01, 0x0f, 0x08, 0xbf, + 0xb9, 0xf1, 0x00, 0x0f, 0x04, 0xd0, 0x01, 0x21, 0x01, 0xfa, 0x0b, 0xf1, + 0x08, 0x42, 0x22, 0xd0, 0x01, 0x20, 0x00, 0x21, 0x00, 0xfa, 0x0a, 0xf0, + 0xf8, 0xf7, 0xe4, 0xfa, 0x04, 0x00, 0x0a, 0xd1, 0x24, 0x21, 0x9f, 0x48, + 0x01, 0xfb, 0x0b, 0xf1, 0x42, 0x18, 0x07, 0xf1, 0x0c, 0x01, 0x50, 0x46, + 0x00, 0xf0, 0x8c, 0xf9, 0x04, 0x46, 0xb8, 0xf1, 0x00, 0x0f, 0x0b, 0xd0, + 0x96, 0x49, 0x01, 0x20, 0x09, 0xf1, 0x01, 0x09, 0x5e, 0x46, 0x08, 0x70, + 0x05, 0xe0, 0x00, 0x9a, 0xb9, 0x68, 0x8a, 0x42, 0xd9, 0xd3, 0xdd, 0xe7, + 0x6d, 0x1c, 0x0a, 0xf1, 0x01, 0x0a, 0xba, 0xf1, 0x08, 0x0f, 0x01, 0xd2, + 0x00, 0x2c, 0xb4, 0xd0, 0xb9, 0xf1, 0x00, 0x0f, 0x01, 0x98, 0x02, 0x94, + 0x18, 0xbf, 0x00, 0x2d, 0x04, 0xd0, 0x21, 0x00, 0x04, 0xbf, 0x41, 0xf2, + 0x03, 0x12, 0x02, 0x92, 0x24, 0x24, 0x66, 0x43, 0x03, 0x96, 0x00, 0x27, + 0x02, 0x99, 0xdf, 0xf8, 0x18, 0x82, 0xdf, 0xf8, 0x1c, 0x92, 0x00, 0x29, + 0x50, 0xd1, 0x01, 0x90, 0x01, 0x98, 0xf8, 0x40, 0xc1, 0x07, 0x47, 0xd5, + 0x38, 0x46, 0xc7, 0xf7, 0xc1, 0xfc, 0x05, 0x46, 0x1c, 0x22, 0x7f, 0x49, + 0x99, 0xf8, 0x01, 0x00, 0x6a, 0x43, 0x8e, 0x18, 0x20, 0xbb, 0x38, 0x46, + 0xc6, 0xf7, 0xa1, 0xfc, 0x83, 0x46, 0x38, 0x46, 0xc6, 0xf7, 0xa1, 0xfc, + 0x82, 0x46, 0x69, 0x46, 0x38, 0x46, 0xc6, 0xf7, 0x77, 0xfc, 0xbb, 0xf1, + 0x00, 0x0f, 0x04, 0xd0, 0x03, 0x99, 0x08, 0xf1, 0x20, 0x00, 0x42, 0x58, + 0x08, 0xe0, 0x00, 0x98, 0xd9, 0xf8, 0x08, 0x10, 0x88, 0x42, 0x04, 0xd3, + 0x08, 0xf1, 0x20, 0x00, 0x65, 0x43, 0x42, 0x59, 0x72, 0x61, 0xba, 0xf1, + 0x00, 0x0f, 0x1b, 0xd0, 0x03, 0x99, 0x08, 0xf1, 0x20, 0x00, 0x15, 0xe0, + 0x01, 0x20, 0x99, 0xf8, 0x02, 0x20, 0xa8, 0x40, 0x02, 0x42, 0x09, 0xeb, + 0x05, 0x01, 0x05, 0xd0, 0x0a, 0x79, 0x08, 0xf1, 0x20, 0x05, 0x62, 0x43, + 0xab, 0x58, 0x73, 0x61, 0x99, 0xf8, 0x03, 0x20, 0x02, 0x42, 0x05, 0xd0, + 0x09, 0x79, 0x08, 0xf1, 0x20, 0x00, 0x61, 0x43, 0x42, 0x58, 0xb2, 0x61, + 0x7f, 0x1c, 0x08, 0x2f, 0xb0, 0xd3, 0x01, 0x98, 0x02, 0x99, 0x5b, 0x4e, + 0x00, 0x25, 0x1c, 0x27, 0xca, 0x46, 0x31, 0xbb, 0x04, 0x46, 0x24, 0xfa, + 0x05, 0xf0, 0xc0, 0x07, 0x1d, 0xd5, 0x28, 0x46, 0xc7, 0xf7, 0x6a, 0xfc, + 0x01, 0x21, 0x01, 0xfa, 0x00, 0xf8, 0x07, 0xfb, 0x00, 0xf9, 0x9a, 0xf8, + 0x02, 0x00, 0x10, 0xea, 0x08, 0x0f, 0x05, 0xd0, 0x06, 0xf1, 0x14, 0x02, + 0x00, 0xf0, 0x2f, 0xf8, 0x00, 0xf0, 0x9e, 0xf8, 0x9a, 0xf8, 0x03, 0x00, + 0x10, 0xea, 0x08, 0x0f, 0x05, 0xd0, 0x06, 0xf1, 0x18, 0x02, 0x00, 0xf0, + 0x24, 0xf8, 0x00, 0xf0, 0xab, 0xf8, 0x6d, 0x1c, 0x08, 0x2d, 0xda, 0xd3, + 0x20, 0x46, 0xdd, 0xf8, 0x08, 0x80, 0x00, 0x25, 0x04, 0x46, 0x24, 0xfa, + 0x05, 0xf0, 0xc0, 0x07, 0x07, 0xd5, 0x28, 0x46, 0xc7, 0xf7, 0x40, 0xfc, + 0x78, 0x43, 0x41, 0x46, 0x30, 0x18, 0xe1, 0xf7, 0x80, 0xff, 0x6d, 0x1c, + 0x08, 0x2d, 0xf0, 0xd3, 0x4f, 0xea, 0x08, 0x03, 0x5d, 0xa2, 0x11, 0x21, + 0x03, 0x20, 0xc7, 0xf7, 0x2a, 0xfd, 0x40, 0x46, 0x05, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0x4a, 0x44, 0x28, 0x46, 0x92, 0xed, 0x00, 0x0a, 0xb1, 0xee, + 0x40, 0x0a, 0x70, 0x47, 0xf8, 0xb5, 0x0c, 0x46, 0x15, 0x46, 0x1f, 0x46, + 0xe1, 0xf7, 0x78, 0xff, 0xc7, 0xf7, 0x1e, 0xfc, 0x00, 0x26, 0xff, 0x28, + 0x19, 0xd0, 0x1c, 0x21, 0x2c, 0x4a, 0x48, 0x43, 0x11, 0x18, 0x17, 0xb1, + 0x02, 0x2f, 0x0a, 0xd0, 0x0b, 0xe0, 0x14, 0x27, 0x28, 0x68, 0xb8, 0x42, + 0x0a, 0xd3, 0x3a, 0x46, 0x20, 0x46, 0xb9, 0xf7, 0x5f, 0xfb, 0x2f, 0x60, + 0x09, 0xe0, 0x1c, 0x27, 0xf4, 0xe7, 0x4f, 0xf6, 0x2a, 0x76, 0x04, 0xe0, + 0x4f, 0xf6, 0x26, 0x76, 0x01, 0xe0, 0x4f, 0xf6, 0x52, 0x76, 0x30, 0x46, + 0xf2, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x09, 0xf8, 0xd1, 0xf7, 0xb5, 0xfb, + 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x03, 0xf8, 0xd1, 0xf7, 0x9a, 0xfb, + 0x02, 0xbd, 0x00, 0x92, 0x0b, 0x46, 0x02, 0x46, 0x24, 0x21, 0x17, 0x48, + 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, 0xdf, 0xed, 0x0f, 0x0a, 0x60, 0xee, + 0x20, 0x0a, 0x9f, 0xed, 0x0e, 0x0a, 0x04, 0x46, 0x80, 0xee, 0x80, 0x0a, + 0xb9, 0xf7, 0x9e, 0xfc, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, + 0x00, 0x28, 0x48, 0xbf, 0x00, 0xf5, 0xb4, 0x70, 0x04, 0x19, 0x4f, 0xf4, + 0xb4, 0x71, 0xb4, 0xfb, 0xf1, 0xf1, 0x4f, 0xf4, 0xb4, 0x70, 0x00, 0xfb, + 0x11, 0x44, 0x20, 0x46, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x34, 0x43, + 0xd0, 0x0f, 0x49, 0x40, 0x1c, 0x73, 0x02, 0x20, 0xe8, 0x04, 0x00, 0x01, + 0xb0, 0x68, 0x02, 0x20, 0x20, 0x70, 0x02, 0x20, 0x70, 0x90, 0x00, 0x20, + 0x10, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x88, 0xb0, 0x00, 0x22, 0x04, 0x46, + 0x8d, 0xf8, 0x02, 0x20, 0xb0, 0xee, 0x40, 0x8a, 0x69, 0x46, 0xc0, 0xb2, + 0xe5, 0xf7, 0x96, 0xf8, 0x00, 0xf0, 0x2a, 0xf8, 0x00, 0xf0, 0x21, 0xf8, + 0xe5, 0xf7, 0x0e, 0xf8, 0x08, 0xb0, 0xbd, 0xec, 0x02, 0x8b, 0x10, 0xbd, + 0x38, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x88, 0xb0, 0x04, 0x46, 0xb0, 0xee, + 0x40, 0x8a, 0x00, 0x25, 0x8d, 0xf8, 0x02, 0x50, 0x69, 0x46, 0xe0, 0xb2, + 0xd6, 0xf7, 0x3f, 0xfd, 0x00, 0xf0, 0x12, 0xf8, 0x00, 0xf0, 0x09, 0xf8, + 0xd6, 0xf7, 0xb6, 0xfc, 0x6d, 0x1c, 0x01, 0x2d, 0xf0, 0xd9, 0x08, 0xb0, + 0xbd, 0xec, 0x02, 0x8b, 0x31, 0xbd, 0x01, 0x21, 0x02, 0x90, 0x8d, 0xf8, + 0x18, 0x10, 0xe0, 0xb2, 0x69, 0x46, 0x70, 0x47, 0x01, 0x22, 0x8d, 0xf8, + 0x00, 0x20, 0xb0, 0xee, 0x48, 0x0a, 0x02, 0x98, 0x90, 0xe7, 0x00, 0x00, + 0x54, 0x78, 0x2f, 0x52, 0x78, 0x20, 0x50, 0x68, 0x61, 0x73, 0x65, 0x20, + 0x43, 0x61, 0x6c, 0x3a, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x25, + 0x58, 0x0a, 0x00, 0x00, 0xf8, 0xb5, 0x06, 0x46, 0x01, 0x20, 0x8d, 0xf8, + 0x00, 0x00, 0x0d, 0x46, 0x17, 0x46, 0x00, 0xf0, 0x36, 0xf8, 0xd3, 0xf7, + 0x91, 0xff, 0x04, 0x00, 0x05, 0xd1, 0x6b, 0x46, 0x00, 0xf0, 0x30, 0xf8, + 0xe5, 0xf7, 0x23, 0xf9, 0x04, 0x46, 0x9c, 0xb9, 0x28, 0x69, 0xd6, 0xf7, + 0x27, 0xf8, 0xaa, 0x68, 0x3b, 0x46, 0x29, 0x46, 0x30, 0x46, 0x00, 0xf0, + 0x27, 0xf8, 0x04, 0x00, 0x08, 0xd1, 0xaa, 0x68, 0x07, 0xf1, 0x10, 0x03, + 0x52, 0x42, 0x29, 0x46, 0x30, 0x46, 0x00, 0xf0, 0x1d, 0xf8, 0x04, 0x46, + 0x00, 0xf0, 0x15, 0xf8, 0xd3, 0xf7, 0x8a, 0xff, 0x05, 0x46, 0x6b, 0x46, + 0x00, 0xf0, 0x10, 0xf8, 0xe5, 0xf7, 0x2d, 0xf9, 0x05, 0xb9, 0x05, 0x46, + 0x04, 0xb9, 0x2c, 0x46, 0x07, 0xf1, 0x10, 0x01, 0x38, 0x46, 0x00, 0xf0, + 0x6f, 0xf8, 0x87, 0xed, 0x08, 0x0a, 0x20, 0x46, 0xf2, 0xbd, 0x00, 0x23, + 0x0c, 0x22, 0x01, 0x21, 0x30, 0x46, 0x70, 0x47, 0xf8, 0xb5, 0x2d, 0xed, + 0x02, 0x8b, 0x9a, 0xb0, 0x05, 0x46, 0x0e, 0x46, 0x14, 0x46, 0x1f, 0x46, + 0x01, 0xa8, 0x2c, 0x49, 0x24, 0x22, 0xb9, 0xf7, 0x7f, 0xfa, 0x01, 0x95, + 0x04, 0x94, 0x00, 0x23, 0x31, 0x68, 0x06, 0x91, 0x00, 0x21, 0x70, 0x68, + 0x07, 0x90, 0x00, 0x91, 0x22, 0x46, 0x01, 0x21, 0x28, 0x46, 0xd2, 0xf7, + 0x90, 0xf9, 0x04, 0x00, 0x16, 0xd1, 0x70, 0x69, 0xd5, 0xf7, 0xda, 0xff, + 0x01, 0xa8, 0xd5, 0xf7, 0x53, 0xf8, 0x04, 0x00, 0x0e, 0xd1, 0xf1, 0x68, + 0x28, 0x46, 0xd5, 0xf7, 0x1b, 0xf9, 0x10, 0xb1, 0x41, 0xf2, 0x01, 0x14, + 0x06, 0xe0, 0x0a, 0xa9, 0x01, 0xa8, 0xd5, 0xf7, 0x17, 0xf9, 0x08, 0xb1, + 0x41, 0xf2, 0x02, 0x14, 0x11, 0x98, 0x38, 0x60, 0x13, 0x98, 0x78, 0x60, + 0x9d, 0xed, 0x17, 0x0a, 0xf2, 0xf7, 0xd0, 0xfd, 0x13, 0x48, 0xb0, 0xee, + 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x90, 0xec, 0x02, 0x0a, 0xf2, 0xf7, + 0x9a, 0xfd, 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, 0x60, 0x8a, 0x9d, 0xed, + 0x15, 0x0a, 0xf2, 0xf7, 0xbf, 0xfd, 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, + 0x68, 0x1a, 0xf2, 0xf7, 0x66, 0xfd, 0x07, 0xf1, 0x08, 0x00, 0x00, 0x21, + 0x80, 0xec, 0x02, 0x0a, 0x28, 0x46, 0xd2, 0xf7, 0xf2, 0xf9, 0x04, 0xb9, + 0x04, 0x46, 0x1a, 0xb0, 0x20, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xf2, 0xbd, + 0xf0, 0x92, 0x04, 0x01, 0x68, 0x90, 0x00, 0x20, 0x80, 0xb5, 0x08, 0x30, + 0x08, 0x31, 0x2d, 0xed, 0x02, 0x8b, 0x90, 0xec, 0x02, 0x8a, 0x91, 0xec, + 0x02, 0x0a, 0xf2, 0xf7, 0x55, 0xfe, 0x00, 0xf0, 0x12, 0xf8, 0xf2, 0xf7, + 0x27, 0xff, 0xfe, 0xee, 0x00, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xf2, 0xf7, + 0x8a, 0xfd, 0xf2, 0xf7, 0x97, 0xfd, 0x00, 0xf0, 0x06, 0xf8, 0xbd, 0xec, + 0x02, 0x8b, 0xbd, 0xe8, 0x01, 0x40, 0xf2, 0xf7, 0x17, 0xbf, 0xb0, 0xee, + 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, + 0x68, 0x0a, 0xf2, 0xf7, 0x50, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5d, 0x8a, 0x01, 0x01, 0x57, 0x8b, 0x01, 0x01, 0x63, 0x8b, 0x01, 0x01, + 0x7b, 0x8b, 0x01, 0x01, 0xb5, 0x8b, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x7e, 0x02, 0x20, 0x19, 0x85, 0x03, 0x01, + 0x45, 0x85, 0x03, 0x01, 0x79, 0x86, 0x03, 0x01, 0x85, 0x86, 0x03, 0x01, + 0x9d, 0x86, 0x03, 0x01, 0xe3, 0x86, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x24, 0x03, 0x01, + 0xfb, 0x24, 0x03, 0x01, 0x0f, 0x28, 0x03, 0x01, 0x1b, 0x28, 0x03, 0x01, + 0x81, 0x27, 0x03, 0x01, 0x39, 0x28, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe8, 0xb6, 0x02, 0x20, 0x2d, 0x2b, 0x03, 0x01, + 0x7f, 0x2b, 0x03, 0x01, 0x49, 0x2e, 0x03, 0x01, 0x55, 0x2e, 0x03, 0x01, + 0xab, 0x2d, 0x03, 0x01, 0x6d, 0x2e, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd8, 0x9d, 0x02, 0x20, 0x01, 0x31, 0x03, 0x01, + 0x51, 0x31, 0x03, 0x01, 0xd9, 0x33, 0x03, 0x01, 0xe5, 0x33, 0x03, 0x01, + 0x4b, 0x33, 0x03, 0x01, 0x05, 0x34, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb8, 0xad, 0x02, 0x20, 0x11, 0x81, 0x04, 0x01, + 0x6d, 0x81, 0x04, 0x01, 0x09, 0x82, 0x04, 0x01, 0x15, 0x82, 0x04, 0x01, + 0x2d, 0x82, 0x04, 0x01, 0x7d, 0x82, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x69, 0x04, 0x01, + 0xd5, 0x69, 0x04, 0x01, 0x59, 0x6c, 0x04, 0x01, 0x65, 0x6c, 0x04, 0x01, + 0x7d, 0x6c, 0x04, 0x01, 0xcf, 0x6c, 0x04, 0x01, 0x3d, 0x6d, 0x04, 0x01, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x77, 0x02, 0x20, 0x41, 0xfb, 0x03, 0x01, + 0xc5, 0xfb, 0x03, 0x01, 0x67, 0xfd, 0x03, 0x01, 0x73, 0xfd, 0x03, 0x01, + 0x09, 0xfd, 0x03, 0x01, 0xcf, 0xfd, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x36, 0x03, 0x01, + 0xc9, 0x36, 0x03, 0x01, 0xa5, 0x36, 0x03, 0x01, 0xb1, 0x36, 0x03, 0x01, + 0xdb, 0x37, 0x03, 0x01, 0x2f, 0x38, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xcc, 0xe5, 0x02, 0x20, 0x8d, 0xea, 0x03, 0x01, + 0xc1, 0xeb, 0x03, 0x01, 0x99, 0xeb, 0x03, 0x01, 0xa5, 0xeb, 0x03, 0x01, + 0x9d, 0xec, 0x03, 0x01, 0x51, 0xed, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa8, 0x7e, 0x02, 0x20, 0x01, 0x38, 0x04, 0x01, + 0xef, 0x38, 0x04, 0x01, 0xf1, 0x39, 0x04, 0x01, 0xfd, 0x39, 0x04, 0x01, + 0x17, 0x3a, 0x04, 0x01, 0xc1, 0x3a, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0x77, 0x02, 0x20, 0xb5, 0x06, 0x03, 0x01, + 0xdf, 0x07, 0x03, 0x01, 0x7f, 0x0b, 0x03, 0x01, 0x9f, 0x0b, 0x03, 0x01, + 0x4d, 0x0a, 0x03, 0x01, 0xcf, 0x0b, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x04, 0x03, 0x01, + 0x97, 0x04, 0x03, 0x01, 0x7f, 0x05, 0x03, 0x01, 0x8b, 0x05, 0x03, 0x01, + 0xa3, 0x05, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x48, 0xd8, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, + 0xb1, 0xf9, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x87, 0xfa, 0x01, 0x01, 0x9d, 0xfb, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x21, 0xfa, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x35, 0xfb, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcd, 0x74, 0x04, 0x01, + 0x25, 0x75, 0x04, 0x01, 0x0b, 0x78, 0x04, 0x01, 0x17, 0x78, 0x04, 0x01, + 0xb9, 0x77, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x41, 0xa0, 0x3f, + 0x02, 0x0f, 0x00, 0x00, 0x3f, 0x35, 0x9e, 0x3f, 0x03, 0x0f, 0x00, 0x00, + 0x08, 0xac, 0x9c, 0x3f, 0x02, 0x0e, 0x00, 0x00, 0xbe, 0x9f, 0x9a, 0x3f, + 0x03, 0x0e, 0x00, 0x00, 0xfe, 0xd4, 0x98, 0x3f, 0x02, 0x0d, 0x00, 0x00, + 0x3d, 0x0a, 0x97, 0x3f, 0x03, 0x0d, 0x00, 0x00, 0x7d, 0x3f, 0x95, 0x3f, + 0x02, 0x0c, 0x00, 0x00, 0xbc, 0x74, 0x93, 0x3f, 0x04, 0x0e, 0x00, 0x00, + 0xfc, 0xa9, 0x91, 0x3f, 0x02, 0x0b, 0x00, 0x00, 0x3b, 0xdf, 0x8f, 0x3f, + 0x05, 0x0f, 0x00, 0x00, 0xf2, 0xd2, 0x8d, 0x3f, 0x02, 0x0a, 0x00, 0x00, + 0xba, 0x49, 0x8c, 0x3f, 0x05, 0x0e, 0x00, 0x00, 0x71, 0x3d, 0x8a, 0x3f, + 0x02, 0x09, 0x00, 0x00, 0xb0, 0x72, 0x88, 0x3f, 0x04, 0x0b, 0x00, 0x00, + 0x2f, 0xdd, 0x84, 0x3f, 0x05, 0x0c, 0x00, 0x00, 0xae, 0x47, 0x81, 0x3f, + 0x05, 0x0b, 0x00, 0x00, 0x48, 0xe1, 0x7a, 0x3f, 0x05, 0x0a, 0x00, 0x00, + 0xb4, 0xc8, 0x76, 0x3f, 0x02, 0x08, 0x00, 0x00, 0x46, 0xb6, 0x73, 0x3f, + 0x05, 0x09, 0x00, 0x00, 0x1d, 0x5a, 0x64, 0x3f, 0x04, 0x08, 0x00, 0x00, + 0x75, 0x93, 0x58, 0x3f, 0x02, 0x07, 0x00, 0x00, 0x19, 0x04, 0x56, 0x3f, + 0x05, 0x08, 0x00, 0x00, 0xf4, 0xfd, 0x54, 0x3f, 0x03, 0x07, 0x00, 0x00, + 0x71, 0x3d, 0x4a, 0x3f, 0x02, 0x0f, 0x01, 0x00, 0xdd, 0x24, 0x46, 0x3f, + 0x03, 0x0f, 0x01, 0x00, 0x5c, 0x8f, 0x42, 0x3f, 0x02, 0x0e, 0x01, 0x00, + 0xc9, 0x76, 0x3e, 0x3f, 0x03, 0x0e, 0x01, 0x00, 0x48, 0xe1, 0x3a, 0x3f, + 0x02, 0x0d, 0x01, 0x00, 0xc7, 0x4b, 0x37, 0x3f, 0x03, 0x0d, 0x01, 0x00, + 0xb2, 0x9d, 0x2f, 0x3f, 0x03, 0x0c, 0x01, 0x00, 0x31, 0x08, 0x2c, 0x3f, + 0x02, 0x0b, 0x01, 0x00, 0xb0, 0x72, 0x28, 0x3f, 0x03, 0x0b, 0x01, 0x00, + 0x9c, 0xc4, 0x20, 0x3f, 0x03, 0x0a, 0x01, 0x00, 0x1b, 0x2f, 0x1d, 0x3f, + 0x02, 0x09, 0x01, 0x00, 0x9a, 0x99, 0x19, 0x3f, 0x05, 0x0d, 0x01, 0x00, + 0x71, 0x3d, 0x0a, 0x3f, 0x05, 0x0b, 0x01, 0x00, 0x5c, 0x8f, 0x02, 0x3f, + 0x05, 0x0a, 0x01, 0x00, 0xb6, 0xf3, 0xfd, 0x3e, 0x02, 0x08, 0x01, 0x00, + 0x8f, 0xc2, 0xf5, 0x3e, 0x03, 0x08, 0x01, 0x00, 0xc7, 0x4b, 0xb7, 0x3e, + 0x05, 0x08, 0x01, 0x00, 0x2b, 0x87, 0x96, 0x3e, 0x04, 0x07, 0x01, 0x00, + 0x6d, 0xe7, 0x7b, 0x3e, 0x02, 0x06, 0x01, 0x00, 0xd5, 0x78, 0x69, 0x3e, + 0x03, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x01, 0x00, + 0x9a, 0x99, 0x69, 0xc1, 0x00, 0x60, 0x1a, 0x45, 0x9a, 0x99, 0x69, 0xc1, + 0x00, 0x60, 0x1a, 0x45, 0x9a, 0x99, 0x69, 0xc1, 0x00, 0x60, 0x1a, 0x45, + 0x9a, 0x99, 0x69, 0xc1, 0x00, 0x60, 0x1a, 0x45, 0x9a, 0x99, 0x69, 0xc1, + 0x00, 0x60, 0x1a, 0x45, 0x9a, 0x99, 0x69, 0xc1, 0x00, 0x60, 0x1a, 0x45, + 0x9a, 0x99, 0x69, 0xc1, 0x00, 0x60, 0x1a, 0x45, 0x9a, 0x99, 0x69, 0xc1, + 0x00, 0x60, 0x1a, 0x45, 0x5a, 0x64, 0x8b, 0x3f, 0xc9, 0x8e, 0x0d, 0xba, + 0xec, 0x51, 0x88, 0x3f, 0xfa, 0x61, 0x84, 0xba, 0x5a, 0x64, 0x8b, 0x3f, + 0xc9, 0x8e, 0x0d, 0xba, 0xec, 0x51, 0x88, 0x3f, 0xfa, 0x61, 0x84, 0xba, + 0x5a, 0x64, 0x8b, 0x3f, 0xc9, 0x8e, 0x0d, 0xba, 0xec, 0x51, 0x88, 0x3f, + 0xfa, 0x61, 0x84, 0xba, 0x7b, 0x14, 0x4e, 0x3f, 0x2e, 0x56, 0x54, 0xba, + 0x7b, 0x14, 0x4e, 0x3f, 0x2e, 0x56, 0x54, 0xba, 0x01, 0x00, 0xbc, 0x1b, + 0x08, 0x03, 0x03, 0x01, 0xbd, 0x1b, 0xac, 0x26, 0x08, 0x03, 0x03, 0x01, + 0xad, 0x26, 0xde, 0x26, 0x08, 0x03, 0x03, 0x01, 0xdf, 0x26, 0xfc, 0x26, + 0x08, 0x03, 0x03, 0x01, 0xfd, 0x26, 0x41, 0x27, 0x08, 0x03, 0x03, 0x01, + 0x42, 0x27, 0xe8, 0x35, 0x08, 0x03, 0x03, 0x01, 0xe9, 0x35, 0xb0, 0x36, + 0x08, 0x03, 0x03, 0x01, 0xb1, 0x36, 0x3c, 0x37, 0x08, 0x03, 0x03, 0x01, + 0x3d, 0x37, 0x78, 0x37, 0x08, 0x03, 0x03, 0x01, 0x01, 0x00, 0xbc, 0x1b, + 0x08, 0x03, 0x03, 0x01, 0xbd, 0x1b, 0xac, 0x26, 0x08, 0x03, 0x03, 0x01, + 0xad, 0x26, 0xde, 0x26, 0x08, 0x03, 0x03, 0x01, 0xdf, 0x26, 0xfc, 0x26, + 0x08, 0x03, 0x03, 0x01, 0xfd, 0x26, 0x41, 0x27, 0x08, 0x03, 0x03, 0x01, + 0x42, 0x27, 0xe8, 0x35, 0x08, 0x03, 0x03, 0x01, 0xe9, 0x35, 0xb0, 0x36, + 0x08, 0x03, 0x03, 0x01, 0xb1, 0x36, 0x3c, 0x37, 0x08, 0x03, 0x03, 0x01, + 0x3d, 0x37, 0x78, 0x37, 0x08, 0x03, 0x03, 0x01, 0x01, 0x00, 0xbd, 0x1f, + 0x08, 0x03, 0x03, 0x01, 0xbe, 0x1f, 0x24, 0x2c, 0x08, 0x03, 0x03, 0x01, + 0x25, 0x2c, 0x88, 0x2c, 0x08, 0x03, 0x03, 0x01, 0x89, 0x2c, 0xa6, 0x2c, + 0x08, 0x03, 0x03, 0x01, 0xa7, 0x2c, 0xeb, 0x2c, 0x08, 0x03, 0x03, 0x01, + 0xec, 0x2c, 0x80, 0x3e, 0x0b, 0x03, 0x03, 0x01, 0x81, 0x3e, 0x02, 0x3f, + 0x0b, 0x03, 0x03, 0x01, 0x03, 0x3f, 0x2a, 0x3f, 0x0b, 0x03, 0x03, 0x01, + 0x2b, 0x3f, 0x7a, 0x3f, 0x09, 0x03, 0x03, 0x01, 0x01, 0x00, 0xbc, 0x1b, + 0x0f, 0x02, 0x03, 0x01, 0xbd, 0x1b, 0xac, 0x26, 0x0f, 0x02, 0x03, 0x01, + 0xad, 0x26, 0xde, 0x26, 0x0f, 0x02, 0x03, 0x01, 0xdf, 0x26, 0xfc, 0x26, + 0x0f, 0x02, 0x03, 0x01, 0xfd, 0x26, 0x41, 0x27, 0x0f, 0x02, 0x03, 0x01, + 0x42, 0x27, 0xec, 0x2c, 0x0f, 0x02, 0x03, 0x01, 0xed, 0x2c, 0xc8, 0x32, + 0x0f, 0x02, 0x03, 0x01, 0xc9, 0x32, 0x4c, 0x36, 0x0f, 0x02, 0x03, 0x01, + 0x4d, 0x36, 0x78, 0x37, 0x09, 0x02, 0x03, 0x01, 0x01, 0x00, 0xbc, 0x1b, + 0x0f, 0x02, 0x03, 0x01, 0xbd, 0x1b, 0xac, 0x26, 0x0f, 0x02, 0x03, 0x01, + 0xad, 0x26, 0xde, 0x26, 0x0f, 0x02, 0x03, 0x01, 0xdf, 0x26, 0xfc, 0x26, + 0x0f, 0x02, 0x03, 0x01, 0xfd, 0x26, 0x41, 0x27, 0x0f, 0x02, 0x03, 0x01, + 0x42, 0x27, 0xec, 0x2c, 0x0f, 0x02, 0x03, 0x01, 0xed, 0x2c, 0xc8, 0x32, + 0x0f, 0x02, 0x03, 0x01, 0xc9, 0x32, 0x4c, 0x36, 0x0f, 0x02, 0x03, 0x01, + 0x4d, 0x36, 0x78, 0x37, 0x09, 0x02, 0x03, 0x01, 0x01, 0x00, 0xbd, 0x1f, + 0x08, 0x02, 0x03, 0x01, 0xbe, 0x1f, 0x24, 0x2c, 0x08, 0x02, 0x03, 0x01, + 0x25, 0x2c, 0x88, 0x2c, 0x08, 0x02, 0x03, 0x01, 0x89, 0x2c, 0xa6, 0x2c, + 0x08, 0x02, 0x03, 0x01, 0xa7, 0x2c, 0xeb, 0x2c, 0x08, 0x02, 0x03, 0x01, + 0xec, 0x2c, 0xb0, 0x36, 0x0f, 0x02, 0x03, 0x01, 0xb1, 0x36, 0x98, 0x3a, + 0x0f, 0x02, 0x03, 0x01, 0x99, 0x3a, 0x22, 0x3d, 0x0f, 0x02, 0x03, 0x01, + 0x23, 0x3d, 0x7a, 0x3f, 0x09, 0x02, 0x03, 0x01, 0x2d, 0xe9, 0xf0, 0x47, + 0x05, 0x46, 0x00, 0x20, 0xd9, 0xf7, 0x84, 0xfd, 0x81, 0x46, 0x08, 0x20, + 0xd9, 0xf7, 0x80, 0xfd, 0x82, 0x46, 0x0a, 0x20, 0xd9, 0xf7, 0x7c, 0xfd, + 0x80, 0x46, 0x00, 0x26, 0x50, 0x4c, 0x25, 0xfa, 0x06, 0xf0, 0xc0, 0x07, + 0x13, 0xd5, 0x30, 0x46, 0xc6, 0xf7, 0x62, 0xff, 0x07, 0x46, 0xff, 0x2f, + 0x0d, 0xd0, 0x43, 0x46, 0x52, 0x46, 0x49, 0x46, 0xf0, 0xb2, 0xe1, 0xf7, + 0x15, 0xf9, 0xf0, 0xb2, 0xe1, 0xf7, 0x42, 0xf9, 0x14, 0x21, 0x4f, 0x43, + 0xe0, 0x19, 0xcb, 0xf7, 0x11, 0xfa, 0x76, 0x1c, 0x08, 0x2e, 0xe4, 0xd3, + 0xbd, 0xe8, 0xf0, 0x87, 0x2d, 0xe9, 0xf0, 0x47, 0x82, 0x46, 0x00, 0x24, + 0x00, 0x26, 0x40, 0x4f, 0x2a, 0xfa, 0x06, 0xf0, 0xc0, 0x07, 0x3c, 0xd5, + 0x5f, 0xfa, 0x86, 0xf8, 0x40, 0x46, 0xc6, 0xf7, 0x3d, 0xff, 0x14, 0x21, + 0x7d, 0x78, 0x39, 0x4a, 0x48, 0x43, 0x02, 0xeb, 0x00, 0x09, 0x48, 0x46, + 0xe1, 0xf7, 0x75, 0xfa, 0x00, 0x23, 0x0d, 0x22, 0x01, 0x21, 0x40, 0x46, + 0xd3, 0xf7, 0x5e, 0xfb, 0x04, 0x00, 0x03, 0xd1, 0xf0, 0xb2, 0xe1, 0xf7, + 0x39, 0xf9, 0x04, 0x46, 0x34, 0xb9, 0x38, 0x78, 0x01, 0x28, 0x0b, 0xd1, + 0xf0, 0xb2, 0xe1, 0xf7, 0x0c, 0xfa, 0x04, 0x46, 0x00, 0x2d, 0x18, 0xbf, + 0x00, 0x2c, 0x03, 0xd0, 0xf0, 0xb2, 0xe1, 0xf7, 0xd9, 0xf9, 0x04, 0x46, + 0x00, 0x23, 0x0d, 0x22, 0x01, 0x21, 0x40, 0x46, 0xd3, 0xf7, 0x5c, 0xfb, + 0x04, 0xb9, 0x04, 0x46, 0x21, 0x46, 0x48, 0x46, 0xe1, 0xf7, 0x51, 0xfa, + 0x28, 0x46, 0x45, 0x1e, 0x10, 0xb1, 0x00, 0x2c, 0xcf, 0xd1, 0x00, 0xe0, + 0x1c, 0xb9, 0x76, 0x1c, 0xf0, 0xb2, 0x08, 0x28, 0xba, 0xdb, 0x20, 0x46, + 0xbd, 0xe8, 0xf0, 0x87, 0x80, 0xb5, 0x00, 0xf0, 0x09, 0xf8, 0xd0, 0xf7, + 0xb6, 0xfe, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x03, 0xf8, 0xd0, 0xf7, + 0x9b, 0xfe, 0x02, 0xbd, 0x00, 0x92, 0x0b, 0x46, 0x02, 0x46, 0x02, 0x21, + 0x13, 0x48, 0x70, 0x47, 0xf8, 0xb5, 0x0c, 0x46, 0x16, 0x46, 0x1f, 0x46, + 0xe1, 0xf7, 0x3e, 0xfa, 0xc6, 0xf7, 0xe4, 0xfe, 0x00, 0x25, 0xff, 0x28, + 0x10, 0xd0, 0x67, 0xb9, 0x31, 0x68, 0x14, 0x29, 0x0f, 0xd3, 0x14, 0x22, + 0x09, 0x4b, 0x50, 0x43, 0x19, 0x18, 0x20, 0x46, 0xb8, 0xf7, 0x2a, 0xfe, + 0x14, 0x20, 0x30, 0x60, 0x07, 0xe0, 0x4f, 0xf6, 0x2a, 0x75, 0x04, 0xe0, + 0x4f, 0xf6, 0x52, 0x75, 0x01, 0xe0, 0x4f, 0xf6, 0x26, 0x75, 0x28, 0x46, + 0xf2, 0xbd, 0x00, 0x00, 0x6c, 0x67, 0x03, 0x20, 0x94, 0x90, 0x00, 0x20, + 0x38, 0xb5, 0x0c, 0x46, 0xe1, 0xf7, 0x18, 0xfa, 0xc6, 0xf7, 0xbe, 0xfe, + 0x00, 0x25, 0x01, 0x2c, 0x18, 0xbf, 0x4f, 0xf6, 0x27, 0x75, 0x28, 0x46, + 0x32, 0xbd, 0x00, 0x00, 0x70, 0x17, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0xa0, 0x0f, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0xd0, 0x07, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x08, 0x46, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x58, 0x09, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa8, 0xcc, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xf8, 0x8f, 0x04, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x48, 0x53, 0x05, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x98, 0x16, 0x06, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xc0, 0x27, 0x09, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x08, 0x46, 0x02, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x58, 0x09, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xa8, 0xcc, 0x03, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xf8, 0x8f, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x48, 0x53, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x98, 0x16, 0x06, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xc0, 0x27, 0x09, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x08, 0x46, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x58, 0x09, 0x03, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xa8, 0xcc, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xf8, 0x8f, 0x04, 0x00, 0x05, 0x00, 0x00, 0x00, 0x48, 0x53, 0x05, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x98, 0x16, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xc0, 0x27, 0x09, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x46, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x58, 0x09, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa8, 0xcc, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0xf8, 0x8f, 0x04, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x48, 0x53, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x98, 0x16, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0xc0, 0x27, 0x09, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x08, 0x46, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x58, 0x09, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0xa8, 0xcc, 0x03, 0x00, + 0x03, 0x00, 0x00, 0x00, 0xf8, 0x8f, 0x04, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x48, 0x53, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x98, 0x16, 0x06, 0x00, + 0x02, 0x00, 0x00, 0x00, 0xc0, 0x27, 0x09, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x08, 0x46, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x58, 0x09, 0x03, 0x00, + 0x03, 0x00, 0x00, 0x00, 0xa8, 0xcc, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, + 0xf8, 0x8f, 0x04, 0x00, 0x03, 0x00, 0x00, 0x00, 0x48, 0x53, 0x05, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x98, 0x16, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, + 0xc0, 0x27, 0x09, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x72, 0x61, 0x64, + 0x69, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, + 0x77, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x69, + 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x6e, 0x2e, 0x20, + 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x20, 0x0a, 0x00, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, + 0x20, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x77, 0x61, 0x6e, 0x74, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x69, 0x63, 0x6b, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x2e, 0x20, 0x76, 0x69, 0x72, 0x74, + 0x75, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x0a, 0x00, + 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x70, 0x69, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, + 0x69, 0x6e, 0x2e, 0x20, 0x63, 0x64, 0x61, 0x63, 0x20, 0x0a, 0x00, 0x00, + 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x70, 0x69, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, + 0x61, 0x78, 0x2e, 0x20, 0x63, 0x64, 0x61, 0x63, 0x20, 0x0a, 0x00, 0x00, + 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x70, 0x69, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, + 0x69, 0x6e, 0x2e, 0x20, 0x66, 0x64, 0x61, 0x63, 0x20, 0x0a, 0x00, 0x00, + 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x70, 0x69, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, + 0x61, 0x78, 0x2e, 0x20, 0x66, 0x64, 0x61, 0x63, 0x20, 0x0a, 0x00, 0x00, + 0x48, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x69, 0x63, 0x20, 0x49, 0x6d, 0x70, + 0x72, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x25, 0x64, 0x20, 0x0a, 0x00, 0x00, 0x00, + 0xbc, 0x1b, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xc4, 0x09, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0xdc, 0x05, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, + 0xc2, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xbc, 0x1b, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0xc4, 0x09, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0xd0, 0x07, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xdc, 0x05, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xbc, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0xbc, 0x1b, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0xc4, 0x09, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xd0, 0x07, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0xdc, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0xe8, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0xbc, 0x1b, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xc4, 0x09, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0xdc, 0x05, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0xc2, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0xbc, 0x1b, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xc4, 0x09, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xd0, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xdc, 0x05, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0xbc, 0x02, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x52, 0x65, 0x66, 0x65, 0x72, 0x20, 0x74, 0x6f, + 0x20, 0x68, 0x65, 0x6c, 0x70, 0x20, 0x6d, 0x61, 0x6e, 0x75, 0x61, 0x6c, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, + 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x54, + 0x50, 0x47, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2d, + 0x3e, 0x53, 0x57, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x44, 0x6f, 0x63, 0x73, 0x2d, 0x3e, 0x43, 0x50, 0x55, 0x2d, 0x3e, + 0x44, 0x65, 0x62, 0x75, 0x67, 0x67, 0x65, 0x72, 0x0a, 0x00, 0x00, 0x00, + 0x53, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x20, + 0x6c, 0x6f, 0x67, 0x20, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x69, 0x74, + 0x79, 0x2f, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x20, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x20, 0x28, 0x31, 0x20, 0x3d, 0x20, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x2c, 0x20, 0x32, 0x20, 0x3d, 0x20, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x57, 0x41, 0x52, 0x4e, 0x49, + 0x4e, 0x47, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x2e, 0x29, 0x0a, 0x09, 0x4c, + 0x4f, 0x47, 0x4c, 0x56, 0x4c, 0x3d, 0x3c, 0x6c, 0x76, 0x6c, 0x3e, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x72, 0x78, 0x53, 0x50, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x3a, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, + 0x20, 0x30, 0x78, 0x25, 0x30, 0x38, 0x58, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x30, 0x38, 0x58, 0x0a, 0x00, + 0x20, 0x20, 0x74, 0x78, 0x53, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x3a, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, + 0x30, 0x38, 0x58, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, + 0x30, 0x78, 0x25, 0x30, 0x38, 0x58, 0x0a, 0x00, 0x20, 0x20, 0x6f, 0x72, + 0x78, 0x53, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x3a, 0x20, 0x73, + 0x72, 0x63, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x30, 0x38, 0x58, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x30, + 0x38, 0x58, 0x0a, 0x00, 0x20, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x3a, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, + 0x20, 0x30, 0x78, 0x25, 0x30, 0x38, 0x58, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x30, 0x38, 0x58, 0x0a, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x69, 0x6e, 0x69, 0x74, 0x3a, 0x20, 0x63, 0x61, + 0x6c, 0x4d, 0x61, 0x73, 0x6b, 0x20, 0x25, 0x58, 0x2c, 0x20, 0x25, 0x64, + 0x20, 0x6d, 0x73, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x58, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x67, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, + 0x43, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x5b, 0x5d, 0x20, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6f, 0x62, 0x6a, + 0x20, 0x49, 0x44, 0x20, 0x30, 0x78, 0x25, 0x58, 0x20, 0x69, 0x73, 0x20, + 0x75, 0x6e, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x64, 0x2e, 0x0a, 0x00, 0x00, 0x00, 0xa0, 0x46, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x4c, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x82, 0x60, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x92, 0x60, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0xa2, 0x60, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xb2, 0x60, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x60, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0xd2, 0x60, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x60, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x60, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x60, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x12, 0x60, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x22, 0x60, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x32, 0x60, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x42, 0x60, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x52, 0x60, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x62, 0x60, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x72, 0x60, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x61, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x12, 0x61, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x93, 0xf9, 0x01, 0x01, 0x65, 0xf9, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xeb, 0x1b, 0x03, 0x01, 0xb9, 0x1b, 0x03, 0x01, 0x31, 0x8e, 0x04, 0x01, + 0x05, 0x8e, 0x04, 0x01, 0x65, 0xfe, 0x02, 0x01, 0xbf, 0xfd, 0x02, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xb5, 0x01, 0x01, + 0xa5, 0xb5, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xb4, 0x02, 0x46, 0x10, 0x68, 0x95, 0x68, 0x13, 0x18, 0x50, 0x68, + 0x03, 0xeb, 0x50, 0x04, 0xc0, 0x07, 0x1c, 0xd5, 0x4d, 0x44, 0x1a, 0xe0, + 0x13, 0xf8, 0x01, 0x7b, 0x05, 0xf8, 0x01, 0x7b, 0x49, 0x1e, 0xf9, 0xd1, + 0x98, 0xb1, 0x13, 0xf8, 0x01, 0x1b, 0xc6, 0xf3, 0x81, 0x06, 0x03, 0x2e, + 0x08, 0xbf, 0x13, 0xf8, 0x01, 0x6b, 0x01, 0xeb, 0x06, 0x21, 0x49, 0x42, + 0x80, 0x1c, 0x29, 0x44, 0x05, 0xd0, 0x11, 0xf8, 0x01, 0x6b, 0x05, 0xf8, + 0x01, 0x6b, 0x40, 0x1e, 0xf9, 0xd1, 0xa3, 0x42, 0x0e, 0xd0, 0x13, 0xf8, + 0x01, 0x6b, 0x16, 0xf0, 0x03, 0x01, 0x04, 0xbf, 0x13, 0xf8, 0x01, 0x1b, + 0xc9, 0x1c, 0x30, 0x09, 0x0f, 0x28, 0xdb, 0xd1, 0x13, 0xf8, 0x01, 0x0b, + 0x0f, 0x30, 0xd7, 0xe7, 0xf0, 0xbc, 0x02, 0xf1, 0x0c, 0x00, 0x70, 0x47, + 0x63, 0x68, 0x61, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x20, + 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x00, 0x43, 0x74, 0x72, 0x6c, + 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x0a, 0x00, 0x00, 0x43, 0x50, 0x55, 0x20, 0x62, 0x6f, 0x6f, 0x74, + 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x0a, 0x00, 0x00, 0x53, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x20, 0x62, 0x6f, 0x6f, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x0a, 0x00, 0x00, 0x00, 0x43, 0x4d, 0x44, 0x20, 0x52, 0x58, 0x44, 0x20, + 0x30, 0x78, 0x25, 0x58, 0x0a, 0x00, 0x00, 0x00, 0x46, 0x41, 0x54, 0x41, + 0x4c, 0x20, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x21, 0x20, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x25, 0x64, + 0x2c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x20, + 0x3d, 0x20, 0x30, 0x78, 0x25, 0x30, 0x38, 0x58, 0x0a, 0x21, 0x21, 0x21, + 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, + 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x0a, 0x0a, 0x00, 0x00, 0x00, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x4c, 0x6f, 0x67, 0x3a, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x58, 0x0a, 0x00, + 0xc0, 0x6b, 0x02, 0x20, 0x30, 0x6c, 0x02, 0x20, 0xe8, 0x47, 0x02, 0x20, + 0xa0, 0x6c, 0x02, 0x20, 0x78, 0x4a, 0x02, 0x20, 0xe8, 0x4a, 0x02, 0x20, + 0x58, 0x4b, 0x02, 0x20, 0xc8, 0x4b, 0x02, 0x20, 0x38, 0x4c, 0x02, 0x20, + 0xa8, 0x4c, 0x02, 0x20, 0x18, 0x4d, 0x02, 0x20, 0x88, 0x4d, 0x02, 0x20, + 0xf8, 0x4d, 0x02, 0x20, 0x68, 0x4e, 0x02, 0x20, 0xd8, 0x4e, 0x02, 0x20, + 0x48, 0x4f, 0x02, 0x20, 0xb8, 0x4f, 0x02, 0x20, 0x28, 0x50, 0x02, 0x20, + 0x98, 0x50, 0x02, 0x20, 0x08, 0x51, 0x02, 0x20, 0x60, 0x6e, 0x02, 0x20, + 0x78, 0x51, 0x02, 0x20, 0xe8, 0x51, 0x02, 0x20, 0x58, 0x52, 0x02, 0x20, + 0xc8, 0x52, 0x02, 0x20, 0xb0, 0x6f, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x78, 0x40, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x88, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x98, 0x40, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, + 0xa8, 0x40, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x98, 0x40, 0x00, 0x20, + 0x01, 0x00, 0x00, 0x00, 0xa8, 0x40, 0x00, 0x20, 0x53, 0x45, 0x54, 0x5f, + 0x4f, 0x52, 0x58, 0x5f, 0x4e, 0x43, 0x4f, 0x3a, 0x20, 0x63, 0x68, 0x25, + 0x64, 0x2c, 0x20, 0x6e, 0x63, 0x6f, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x20, 0x25, 0x64, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x0a, 0x00, 0x9a, 0x71, 0x4b, 0x45, 0x09, 0x00, 0x00, 0x00, + 0x33, 0xa3, 0xa7, 0x44, 0x0a, 0x00, 0x00, 0x00, 0x9a, 0xd9, 0x10, 0x44, + 0x0b, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x86, 0x43, 0x0c, 0x00, 0x00, 0x00, + 0x33, 0x33, 0x02, 0x43, 0x0d, 0x00, 0x00, 0x00, 0x33, 0x33, 0x7f, 0x42, + 0x0e, 0x00, 0x00, 0x00, 0x66, 0x66, 0x02, 0x42, 0x0f, 0x00, 0x00, 0x00, + 0x9a, 0x99, 0x79, 0x41, 0x10, 0x00, 0x00, 0x00, 0x9a, 0x99, 0xf9, 0x40, + 0x11, 0x00, 0x00, 0x00, 0x9a, 0x99, 0x79, 0x40, 0x12, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, + 0x14, 0x00, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x0e, 0x0e, 0x00, 0x0f, 0x0e, + 0x00, 0x0f, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0xee, 0xee, + 0x00, 0xff, 0xee, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x03, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x54, 0x78, 0x42, 0x42, + 0x46, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x69, 0x67, 0x6e, + 0x6f, 0x72, 0x65, 0x20, 0x4d, 0x41, 0x58, 0x20, 0x63, 0x61, 0x70, 0x20, + 0x77, 0x2f, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x20, + 0x65, 0x72, 0x72, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x54, 0x78, 0x42, 0x42, + 0x46, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x69, 0x67, 0x6e, + 0x6f, 0x72, 0x65, 0x20, 0x4d, 0x49, 0x4e, 0x20, 0x63, 0x61, 0x70, 0x20, + 0x65, 0x72, 0x72, 0x0a, 0x00, 0x00, 0x00, 0x00, 0xf3, 0x04, 0x35, 0x3f, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x4b, + 0x15, 0x02, 0x99, 0x3e, 0x11, 0xae, 0xcc, 0x3e, 0xc0, 0xaa, 0x2a, 0x3f, + 0x16, 0x72, 0x31, 0x3f, 0xe8, 0xe8, 0xfb, 0x33, 0x18, 0x72, 0x31, 0x3f, + 0xd8, 0x5b, 0xde, 0x3e, 0x28, 0x37, 0xa9, 0x32, 0xf4, 0x3e, 0xa1, 0x33, + 0xd9, 0x5b, 0xde, 0x3e, 0x98, 0x20, 0x9a, 0x3e, 0x3b, 0xaa, 0xb8, 0x3f, + 0x60, 0x70, 0xa5, 0x32, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x3f, + 0x3b, 0xaa, 0xb8, 0x3f, 0x00, 0x00, 0x80, 0x7f, 0x00, 0x60, 0x31, 0x3f, + 0xbf, 0xbf, 0x90, 0x39, 0x01, 0x00, 0x00, 0x33, 0x9e, 0xbf, 0xcc, 0x3d, + 0x13, 0x54, 0x08, 0x3c, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x80, 0x3f, + 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x3e, + 0x18, 0x72, 0x31, 0x3f, 0x02, 0x00, 0xca, 0x86, 0x00, 0x00, 0x2c, 0x86, + 0x7c, 0xb5, 0x00, 0x92, 0x0b, 0x46, 0x0e, 0x4d, 0x02, 0x46, 0x1c, 0x21, + 0x28, 0x46, 0xd0, 0xf7, 0xb4, 0xf8, 0x04, 0x00, 0x08, 0xd1, 0x00, 0x26, + 0xf0, 0xb2, 0x76, 0x1c, 0x29, 0x5c, 0xcc, 0xf7, 0xdd, 0xf8, 0xf0, 0xb2, + 0x04, 0x28, 0xf7, 0xdb, 0x20, 0x46, 0x76, 0xbd, 0x80, 0xb5, 0x00, 0x92, + 0x0b, 0x46, 0x02, 0x46, 0x1c, 0x21, 0x02, 0x48, 0xd0, 0xf7, 0x8a, 0xf8, + 0x02, 0xbd, 0x00, 0x00, 0x68, 0x8b, 0x00, 0x20, 0x43, 0x54, 0x4c, 0x45, + 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x6e, 0x65, 0x3a, + 0x25, 0x64, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x25, 0x64, 0x20, + 0x73, 0x70, 0x6f, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x25, 0x64, 0x2c, + 0x20, 0x73, 0x70, 0x6f, 0x5f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x25, + 0x64, 0x2c, 0x20, 0x45, 0x4f, 0x4d, 0x3a, 0x25, 0x64, 0x0a, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 0x07, 0x60, 0x00, 0x00, 0x16, 0x60, + 0x00, 0x00, 0x17, 0x60, 0x00, 0x00, 0x26, 0x60, 0x00, 0x00, 0x27, 0x60, + 0x00, 0x00, 0x36, 0x60, 0x00, 0x00, 0x37, 0x60, 0x00, 0x00, 0x46, 0x60, + 0x00, 0x00, 0x47, 0x60, 0x00, 0x00, 0x56, 0x60, 0x00, 0x00, 0x57, 0x60, + 0x00, 0x00, 0x66, 0x60, 0x00, 0x00, 0x67, 0x60, 0x00, 0x00, 0x76, 0x60, + 0x00, 0x00, 0x77, 0x60, 0x00, 0x80, 0x84, 0x60, 0x00, 0x00, 0x85, 0x60, + 0x00, 0x80, 0x94, 0x60, 0x00, 0x00, 0x95, 0x60, 0x00, 0x80, 0xa4, 0x60, + 0x00, 0x00, 0xa5, 0x60, 0x00, 0x80, 0xb4, 0x60, 0x00, 0x00, 0xb5, 0x60, + 0x00, 0x80, 0xc4, 0x60, 0x00, 0x00, 0xc5, 0x60, 0x00, 0x80, 0xd4, 0x60, + 0x00, 0x00, 0xd5, 0x60, 0x00, 0x80, 0xe4, 0x60, 0x00, 0x00, 0xe5, 0x60, + 0x00, 0x80, 0xf4, 0x60, 0x00, 0x00, 0xf5, 0x60, 0x00, 0x00, 0x0c, 0x60, + 0x80, 0x00, 0x0c, 0x60, 0x00, 0x00, 0x1c, 0x60, 0x80, 0x00, 0x1c, 0x60, + 0x00, 0x00, 0x2c, 0x60, 0x80, 0x00, 0x2c, 0x60, 0x00, 0x00, 0x3c, 0x60, + 0x80, 0x00, 0x3c, 0x60, 0x00, 0x00, 0x4c, 0x60, 0x80, 0x00, 0x4c, 0x60, + 0x00, 0x00, 0x5c, 0x60, 0x80, 0x00, 0x5c, 0x60, 0x00, 0x00, 0x6c, 0x60, + 0x80, 0x00, 0x6c, 0x60, 0x00, 0x00, 0x7c, 0x60, 0x80, 0x00, 0x7c, 0x60, + 0x50, 0x89, 0x5d, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x40, 0x62, 0x5d, 0x00, + 0xfe, 0x00, 0x00, 0x00, 0x30, 0x3b, 0x5d, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0x40, 0x2d, 0x51, 0x00, 0xff, 0x00, 0x00, 0x00, 0x10, 0x83, 0x44, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd0, 0x04, 0x3f, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xb0, 0x63, 0x37, 0x00, 0x03, 0x00, 0x00, 0x00, 0xd0, 0xed, 0x2d, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x80, 0xb5, 0xc5, 0xf7, 0x7a, 0xf8, 0x00, 0xb1, + 0x02, 0x20, 0xbd, 0xe8, 0x02, 0x40, 0xd3, 0xf7, 0x1e, 0xb9, 0x80, 0xb5, + 0xc5, 0xf7, 0x71, 0xf8, 0xbd, 0xe8, 0x02, 0x40, 0x00, 0x28, 0x0c, 0xbf, + 0x01, 0x20, 0x03, 0x20, 0xd3, 0xf7, 0x13, 0xb9, 0x80, 0xb5, 0xc5, 0xf7, + 0x66, 0xf8, 0xbd, 0xe8, 0x02, 0x40, 0x00, 0x28, 0x0c, 0xbf, 0x06, 0x20, + 0x07, 0x20, 0xd3, 0xf7, 0x08, 0xb9, 0x00, 0x00, 0x54, 0x65, 0x6d, 0x70, + 0x20, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x20, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x49, 0x6e, 0x69, + 0x74, 0x2e, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x43, 0x6f, 0x64, + 0x65, 0x20, 0x3d, 0x20, 0x25, 0x64, 0x20, 0x20, 0x43, 0x50, 0x55, 0x20, + 0x3d, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x20, 0x42, 0x69, 0x61, 0x73, 0x20, 0x52, 0x42, 0x30, 0x2f, + 0x52, 0x42, 0x31, 0x20, 0x50, 0x54, 0x41, 0x54, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x20, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x3a, 0x20, 0x30, 0x78, 0x25, 0x58, 0x20, 0x30, + 0x78, 0x25, 0x58, 0x2e, 0x0a, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x69, 0x74, + 0x43, 0x61, 0x6c, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x3a, 0x20, 0x6c, 0x61, + 0x6e, 0x65, 0x25, 0x64, 0x2c, 0x20, 0x66, 0x73, 0x6d, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x3a, 0x20, 0x25, 0x64, 0x20, 0x65, 0x72, 0x72, 0x53, 0x65, + 0x72, 0x64, 0x65, 0x73, 0x3a, 0x20, 0x25, 0x64, 0x20, 0x65, 0x72, 0x72, + 0x3a, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x4a, 0x54, 0x78, 0x20, + 0x73, 0x72, 0x73, 0x74, 0x20, 0x70, 0x75, 0x6c, 0x73, 0x65, 0x20, 0x3a, + 0x20, 0x69, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x25, + 0x64, 0x20, 0x2c, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x30, 0x78, 0x25, + 0x78, 0x20, 0x74, 0x6f, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x3a, 0x20, 0x62, 0x61, 0x73, 0x65, + 0x20, 0x25, 0x58, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x64, 0x2c, + 0x20, 0x65, 0x72, 0x72, 0x20, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, + 0x25, 0x78, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x3a, 0x20, 0x25, 0x78, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x60, 0x00, 0x80, 0x97, 0x60, + 0x00, 0x80, 0xa7, 0x60, 0x00, 0x80, 0xb7, 0x60, 0x00, 0x80, 0xc7, 0x60, + 0x00, 0x80, 0xd7, 0x60, 0x00, 0x80, 0xe7, 0x60, 0x00, 0x80, 0xf7, 0x60, + 0x00, 0x00, 0x09, 0x48, 0x00, 0x00, 0x30, 0x47, 0x00, 0x00, 0x40, 0x47, + 0x00, 0x00, 0x06, 0x48, 0x00, 0x24, 0xf4, 0x48, 0x00, 0x00, 0x70, 0x42, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x24, 0xf4, 0x48, 0x00, 0x00, 0x70, 0x42, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x24, 0xf4, 0x48, 0x00, 0x00, 0x70, 0x42, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x24, 0x74, 0x49, 0x00, 0x00, 0x70, 0x42, + 0x0a, 0x00, 0x00, 0x00, 0x44, 0x41, 0x43, 0x20, 0x63, 0x6c, 0x6f, 0x63, + 0x6b, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x69, 0x6e, 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x31, 0x2e, 0x34, 0x20, 0x2d, 0x20, 0x33, 0x2e, 0x30, 0x20, + 0x47, 0x48, 0x7a, 0x00, 0x50, 0x4c, 0x4c, 0x20, 0x25, 0x64, 0x2c, 0x20, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x3a, 0x20, 0x72, 0x65, 0x66, 0x43, 0x6c, + 0x6b, 0x44, 0x69, 0x76, 0x3a, 0x20, 0x25, 0x64, 0x20, 0x2d, 0x2d, 0x3e, + 0x20, 0x72, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x25, 0x64, 0x0a, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x40, 0x9c, 0x04, 0x01, 0x60, 0x6b, 0x01, 0x20, + 0x08, 0x07, 0x00, 0x00, 0xa0, 0x6c, 0x02, 0x20, 0xe8, 0x75, 0x02, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x46, 0x20, 0x63, 0x68, 0x25, 0x64, + 0x3a, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x25, 0x66, 0x20, 0x65, + 0x78, 0x63, 0x65, 0x65, 0x64, 0x73, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x0a, 0x00, 0x10, 0xb5, 0x07, 0x49, + 0x79, 0x44, 0x18, 0x31, 0x06, 0x4c, 0x7c, 0x44, 0x16, 0x34, 0x04, 0xe0, + 0x0a, 0x68, 0x08, 0x1d, 0x11, 0x44, 0x88, 0x47, 0x01, 0x46, 0xa1, 0x42, + 0xf8, 0xd1, 0x10, 0xbd, 0x70, 0x01, 0x00, 0x00, 0xf4, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x1e, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x53, 0x65, 0x72, 0x64, 0x65, 0x73, 0x49, 0x6e, 0x69, 0x74, 0x5f, 0x43, + 0x61, 0x6c, 0x3a, 0x20, 0x6c, 0x61, 0x6e, 0x65, 0x25, 0x64, 0x2c, 0x20, + 0x65, 0x72, 0x72, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x42, 0x0f, 0x00, 0xc0, 0xc6, 0x2d, 0x00, + 0x01, 0x03, 0x05, 0x07, 0x00, 0x00, 0x80, 0x3f, 0x6f, 0x12, 0x83, 0x3a, + 0x6f, 0x12, 0x83, 0x3a, 0x17, 0xb7, 0xd1, 0x38, 0x01, 0x00, 0x00, 0x00, + 0x17, 0xb7, 0xd1, 0x38, 0x0a, 0xd7, 0x23, 0x3c, 0xcd, 0xcc, 0xcc, 0x3d, + 0x01, 0x03, 0x05, 0x07, 0x00, 0x00, 0x80, 0x3f, 0x6f, 0x12, 0x83, 0x3a, + 0x6f, 0x12, 0x83, 0x3a, 0x17, 0xb7, 0xd1, 0x38, 0x01, 0x00, 0x00, 0x00, + 0x17, 0xb7, 0xd1, 0x38, 0x0a, 0xd7, 0x23, 0x3c, 0xcd, 0xcc, 0xcc, 0x3d, + 0x01, 0x03, 0x05, 0x07, 0x00, 0x00, 0x80, 0x3f, 0x6f, 0x12, 0x83, 0x3a, + 0x6f, 0x12, 0x83, 0x3a, 0x17, 0xb7, 0xd1, 0x38, 0x01, 0x00, 0x00, 0x00, + 0x17, 0xb7, 0xd1, 0x38, 0x0a, 0xd7, 0x23, 0x3c, 0xcd, 0xcc, 0xcc, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, + 0x4f, 0xf0, 0x80, 0x7c, 0x1c, 0xeb, 0x40, 0x0f, 0x94, 0xbf, 0x1c, 0xeb, + 0x41, 0x0f, 0x05, 0xe0, 0x40, 0xea, 0x01, 0x0c, 0x1c, 0xeb, 0x0c, 0x0f, + 0x01, 0xd2, 0x88, 0x42, 0x70, 0x47, 0x18, 0xbf, 0x81, 0x42, 0x70, 0x47, + 0x4f, 0xf0, 0x80, 0x7c, 0x1c, 0xeb, 0x40, 0x0f, 0x94, 0xbf, 0x1c, 0xeb, + 0x41, 0x0f, 0x05, 0xe0, 0x40, 0xea, 0x01, 0x0c, 0x1c, 0xeb, 0x0c, 0x0f, + 0x01, 0xd2, 0x81, 0x42, 0x70, 0x47, 0x18, 0xbf, 0x88, 0x42, 0x70, 0x47, + 0x4e, 0xf6, 0x88, 0x51, 0xce, 0xf2, 0x00, 0x01, 0x08, 0x68, 0x40, 0xf4, + 0x70, 0x00, 0x08, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, + 0x4f, 0xf0, 0x00, 0x70, 0xe1, 0xee, 0x10, 0x0a, 0x70, 0x47, 0x00, 0x00, + 0x43, 0x78, 0xfb, 0xff, 0x90, 0x01, 0x00, 0x00, 0x70, 0xd8, 0x01, 0x20, + 0xc0, 0x03, 0x00, 0x00, 0x90, 0xd1, 0x01, 0x20, 0xb8, 0x0b, 0x00, 0x00, + 0x00, 0xad, 0x01, 0x20, 0x20, 0x03, 0x00, 0x00, 0x50, 0xd5, 0x01, 0x20, + 0x80, 0x09, 0x00, 0x00, 0x60, 0xc3, 0x01, 0x20, 0x20, 0x1c, 0x00, 0x00, + 0x60, 0x6b, 0x01, 0x20, 0xc0, 0x44, 0x00, 0x00, 0xe0, 0xe1, 0x00, 0x20, + 0x40, 0x51, 0x00, 0x00, 0xa0, 0x90, 0x00, 0x20, 0xb0, 0x04, 0x00, 0x00, + 0xe0, 0xcc, 0x01, 0x20, 0xc0, 0x12, 0x00, 0x00, 0x80, 0x87, 0x01, 0x20, + 0xc0, 0x12, 0x00, 0x00, 0x40, 0x9a, 0x01, 0x20, 0xc0, 0x44, 0x00, 0x00, + 0xa0, 0x26, 0x01, 0x20, 0xa8, 0x0a, 0x00, 0x00, 0xb8, 0xb8, 0x01, 0x20, + 0xbc, 0x9d, 0x00, 0x00, 0x00, 0xda, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x41, 0xf6, 0xff, 0xff, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, + 0x28, 0x04, 0x00, 0x20, 0x00, 0x00, 0x0d, 0x60, 0x00, 0x00, 0x1d, 0x60, + 0x00, 0x00, 0x2d, 0x60, 0x00, 0x00, 0x3d, 0x60, 0x00, 0x00, 0x4d, 0x60, + 0x00, 0x00, 0x5d, 0x60, 0x00, 0x00, 0x6d, 0x60, 0x00, 0x00, 0x7d, 0x60, + 0x00, 0x64, 0x89, 0x60, 0x00, 0x64, 0x99, 0x60, 0x00, 0x64, 0xa9, 0x60, + 0x00, 0x64, 0xb9, 0x60, 0x00, 0x64, 0xc9, 0x60, 0x00, 0x64, 0xd9, 0x60, + 0x00, 0x64, 0xe9, 0x60, 0x00, 0x64, 0xf9, 0x60, 0x00, 0x68, 0x89, 0x60, + 0x00, 0x68, 0x99, 0x60, 0x00, 0x68, 0xa9, 0x60, 0x00, 0x68, 0xb9, 0x60, + 0x00, 0x68, 0xc9, 0x60, 0x00, 0x68, 0xd9, 0x60, 0x00, 0x68, 0xe9, 0x60, + 0x00, 0x68, 0xf9, 0x60, 0x00, 0x00, 0x0b, 0x60, 0x00, 0x00, 0x1b, 0x60, + 0x00, 0x00, 0x2b, 0x60, 0x00, 0x00, 0x3b, 0x60, 0x00, 0x00, 0x4b, 0x60, + 0x00, 0x00, 0x5b, 0x60, 0x00, 0x00, 0x6b, 0x60, 0x00, 0x00, 0x7b, 0x60, + 0x00, 0x00, 0x04, 0x60, 0x00, 0x00, 0x14, 0x60, 0x00, 0x00, 0x24, 0x60, + 0x00, 0x00, 0x34, 0x60, 0x00, 0x00, 0x44, 0x60, 0x00, 0x00, 0x54, 0x60, + 0x00, 0x00, 0x64, 0x60, 0x00, 0x00, 0x74, 0x60, 0x00, 0x00, 0x03, 0x60, + 0x00, 0x00, 0x13, 0x60, 0x00, 0x00, 0x23, 0x60, 0x00, 0x00, 0x33, 0x60, + 0x00, 0x00, 0x43, 0x60, 0x00, 0x00, 0x53, 0x60, 0x00, 0x00, 0x63, 0x60, + 0x00, 0x00, 0x73, 0x60, 0x00, 0x00, 0x05, 0x60, 0x00, 0x00, 0x15, 0x60, + 0x00, 0x00, 0x25, 0x60, 0x00, 0x00, 0x35, 0x60, 0x00, 0x00, 0x45, 0x60, + 0x00, 0x00, 0x55, 0x60, 0x00, 0x00, 0x65, 0x60, 0x00, 0x00, 0x75, 0x60, + 0x00, 0x0c, 0x0e, 0x60, 0x00, 0x0c, 0x1e, 0x60, 0x00, 0x0c, 0x2e, 0x60, + 0x00, 0x0c, 0x3e, 0x60, 0x00, 0x0c, 0x4e, 0x60, 0x00, 0x0c, 0x5e, 0x60, + 0x00, 0x0c, 0x6e, 0x60, 0x00, 0x0c, 0x7e, 0x60, 0x00, 0x00, 0x0e, 0x60, + 0x00, 0x00, 0x1e, 0x60, 0x00, 0x00, 0x2e, 0x60, 0x00, 0x00, 0x3e, 0x60, + 0x00, 0x00, 0x4e, 0x60, 0x00, 0x00, 0x5e, 0x60, 0x00, 0x00, 0x6e, 0x60, + 0x00, 0x00, 0x7e, 0x60, 0x00, 0x0e, 0x0e, 0x60, 0x00, 0x0e, 0x1e, 0x60, + 0x00, 0x0e, 0x2e, 0x60, 0x00, 0x0e, 0x3e, 0x60, 0x00, 0x0e, 0x4e, 0x60, + 0x00, 0x0e, 0x5e, 0x60, 0x00, 0x0e, 0x6e, 0x60, 0x00, 0x0e, 0x7e, 0x60, + 0x00, 0x30, 0x02, 0x60, 0x00, 0x30, 0x12, 0x60, 0x00, 0x30, 0x22, 0x60, + 0x00, 0x30, 0x32, 0x60, 0x00, 0x30, 0x42, 0x60, 0x00, 0x30, 0x52, 0x60, + 0x00, 0x30, 0x62, 0x60, 0x00, 0x30, 0x72, 0x60, 0x00, 0x00, 0x0a, 0x60, + 0x00, 0x00, 0x1a, 0x60, 0x00, 0x00, 0x2a, 0x60, 0x00, 0x00, 0x3a, 0x60, + 0x00, 0x00, 0x4a, 0x60, 0x00, 0x00, 0x5a, 0x60, 0x00, 0x00, 0x6a, 0x60, + 0x00, 0x00, 0x7a, 0x60, 0x00, 0x00, 0x09, 0x60, 0x00, 0x00, 0x19, 0x60, + 0x00, 0x00, 0x29, 0x60, 0x00, 0x00, 0x39, 0x60, 0x00, 0x00, 0x49, 0x60, + 0x00, 0x00, 0x59, 0x60, 0x00, 0x00, 0x69, 0x60, 0x00, 0x00, 0x79, 0x60, + 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x4c, 0x00, 0x00, 0x02, 0x4c, + 0x00, 0x00, 0x03, 0x4c, 0x00, 0x00, 0x04, 0x4c, 0x00, 0x00, 0x05, 0x4c, + 0x00, 0x00, 0x06, 0x4c, 0x00, 0x00, 0x07, 0x4c, 0x00, 0x80, 0x00, 0x4c, + 0x00, 0x80, 0x01, 0x4c, 0x00, 0x80, 0x02, 0x4c, 0x00, 0x80, 0x03, 0x4c, + 0x00, 0x80, 0x04, 0x4c, 0x00, 0x80, 0x05, 0x4c, 0x00, 0x80, 0x06, 0x4c, + 0x00, 0x80, 0x07, 0x4c, 0x00, 0x40, 0x00, 0x4c, 0x00, 0x40, 0x01, 0x4c, + 0x00, 0x40, 0x02, 0x4c, 0x00, 0x40, 0x03, 0x4c, 0x00, 0x40, 0x04, 0x4c, + 0x00, 0x40, 0x05, 0x4c, 0x00, 0x40, 0x06, 0x4c, 0x00, 0x40, 0x07, 0x4c, + 0x00, 0x50, 0x00, 0x4c, 0x00, 0x50, 0x01, 0x4c, 0x00, 0x50, 0x02, 0x4c, + 0x00, 0x50, 0x03, 0x4c, 0x00, 0x50, 0x04, 0x4c, 0x00, 0x50, 0x05, 0x4c, + 0x00, 0x50, 0x06, 0x4c, 0x00, 0x50, 0x07, 0x4c, 0x00, 0x00, 0x83, 0x60, + 0x00, 0x00, 0x93, 0x60, 0x00, 0x00, 0xa3, 0x60, 0x00, 0x00, 0xb3, 0x60, + 0x00, 0x00, 0xc3, 0x60, 0x00, 0x00, 0xd3, 0x60, 0x00, 0x00, 0xe3, 0x60, + 0x00, 0x00, 0xf3, 0x60, 0x00, 0x0c, 0x8b, 0x60, 0x00, 0x0c, 0x9b, 0x60, + 0x00, 0x0c, 0xab, 0x60, 0x00, 0x0c, 0xbb, 0x60, 0x00, 0x0c, 0xcb, 0x60, + 0x00, 0x0c, 0xdb, 0x60, 0x00, 0x0c, 0xeb, 0x60, 0x00, 0x0c, 0xfb, 0x60, + 0x00, 0x00, 0x8b, 0x60, 0x00, 0x00, 0x9b, 0x60, 0x00, 0x00, 0xab, 0x60, + 0x00, 0x00, 0xbb, 0x60, 0x00, 0x00, 0xcb, 0x60, 0x00, 0x00, 0xdb, 0x60, + 0x00, 0x00, 0xeb, 0x60, 0x00, 0x00, 0xfb, 0x60, 0x00, 0x0e, 0x8b, 0x60, + 0x00, 0x0e, 0x9b, 0x60, 0x00, 0x0e, 0xab, 0x60, 0x00, 0x0e, 0xbb, 0x60, + 0x00, 0x0e, 0xcb, 0x60, 0x00, 0x0e, 0xdb, 0x60, 0x00, 0x0e, 0xeb, 0x60, + 0x00, 0x0e, 0xfb, 0x60, 0x00, 0x20, 0x81, 0x60, 0x00, 0x20, 0x91, 0x60, + 0x00, 0x20, 0xa1, 0x60, 0x00, 0x20, 0xb1, 0x60, 0x00, 0x20, 0xc1, 0x60, + 0x00, 0x20, 0xd1, 0x60, 0x00, 0x20, 0xe1, 0x60, 0x00, 0x20, 0xf1, 0x60, + 0x00, 0x00, 0x81, 0x60, 0x00, 0x00, 0x91, 0x60, 0x00, 0x00, 0xa1, 0x60, + 0x00, 0x00, 0xb1, 0x60, 0x00, 0x00, 0xc1, 0x60, 0x00, 0x00, 0xd1, 0x60, + 0x00, 0x00, 0xe1, 0x60, 0x00, 0x00, 0xf1, 0x60, 0x00, 0x80, 0x83, 0x60, + 0x00, 0x80, 0x93, 0x60, 0x00, 0x80, 0xa3, 0x60, 0x00, 0x80, 0xb3, 0x60, + 0x00, 0x80, 0xc3, 0x60, 0x00, 0x80, 0xd3, 0x60, 0x00, 0x80, 0xe3, 0x60, + 0x00, 0x80, 0xf3, 0x60, 0x00, 0x00, 0x84, 0x60, 0x00, 0x00, 0x94, 0x60, + 0x00, 0x00, 0xa4, 0x60, 0x00, 0x00, 0xb4, 0x60, 0x00, 0x00, 0xc4, 0x60, + 0x00, 0x00, 0xd4, 0x60, 0x00, 0x00, 0xe4, 0x60, 0x00, 0x00, 0xf4, 0x60, + 0x00, 0x80, 0x85, 0x60, 0x00, 0x80, 0x95, 0x60, 0x00, 0x80, 0xa5, 0x60, + 0x00, 0x80, 0xb5, 0x60, 0x00, 0x80, 0xc5, 0x60, 0x00, 0x80, 0xd5, 0x60, + 0x00, 0x80, 0xe5, 0x60, 0x00, 0x80, 0xf5, 0x60, 0x00, 0x40, 0x89, 0x60, + 0x00, 0x40, 0x99, 0x60, 0x00, 0x40, 0xa9, 0x60, 0x00, 0x40, 0xb9, 0x60, + 0x00, 0x40, 0xc9, 0x60, 0x00, 0x40, 0xd9, 0x60, 0x00, 0x40, 0xe9, 0x60, + 0x00, 0x40, 0xf9, 0x60, 0x00, 0x44, 0x89, 0x60, 0x00, 0x44, 0x99, 0x60, + 0x00, 0x44, 0xa9, 0x60, 0x00, 0x44, 0xb9, 0x60, 0x00, 0x44, 0xc9, 0x60, + 0x00, 0x44, 0xd9, 0x60, 0x00, 0x44, 0xe9, 0x60, 0x00, 0x44, 0xf9, 0x60, + 0x00, 0x80, 0x87, 0x60, 0x00, 0x80, 0x97, 0x60, 0x00, 0x80, 0xa7, 0x60, + 0x00, 0x80, 0xb7, 0x60, 0x00, 0x80, 0xc7, 0x60, 0x00, 0x80, 0xd7, 0x60, + 0x00, 0x80, 0xe7, 0x60, 0x00, 0x80, 0xf7, 0x60, 0x00, 0x00, 0x88, 0x60, + 0x00, 0x00, 0x98, 0x60, 0x00, 0x00, 0xa8, 0x60, 0x00, 0x00, 0xb8, 0x60, + 0x00, 0x00, 0xc8, 0x60, 0x00, 0x00, 0xd8, 0x60, 0x00, 0x00, 0xe8, 0x60, + 0x00, 0x00, 0xf8, 0x60, 0x00, 0x00, 0x86, 0x60, 0x00, 0x00, 0x96, 0x60, + 0x00, 0x00, 0xa6, 0x60, 0x00, 0x00, 0xb6, 0x60, 0x00, 0x00, 0xc6, 0x60, + 0x00, 0x00, 0xd6, 0x60, 0x00, 0x00, 0xe6, 0x60, 0x00, 0x00, 0xf6, 0x60, + 0x00, 0x00, 0x87, 0x60, 0x00, 0x00, 0x97, 0x60, 0x00, 0x00, 0xa7, 0x60, + 0x00, 0x00, 0xb7, 0x60, 0x00, 0x00, 0xc7, 0x60, 0x00, 0x00, 0xd7, 0x60, + 0x00, 0x00, 0xe7, 0x60, 0x00, 0x00, 0xf7, 0x60, 0x00, 0x20, 0x82, 0x60, + 0x00, 0x20, 0x92, 0x60, 0x00, 0x20, 0xa2, 0x60, 0x00, 0x20, 0xb2, 0x60, + 0x00, 0x20, 0xc2, 0x60, 0x00, 0x20, 0xd2, 0x60, 0x00, 0x20, 0xe2, 0x60, + 0x00, 0x20, 0xf2, 0x60, 0x00, 0x30, 0x82, 0x60, 0x00, 0x30, 0x92, 0x60, + 0x00, 0x30, 0xa2, 0x60, 0x00, 0x30, 0xb2, 0x60, 0x00, 0x30, 0xc2, 0x60, + 0x00, 0x30, 0xd2, 0x60, 0x00, 0x30, 0xe2, 0x60, 0x00, 0x30, 0xf2, 0x60, + 0x00, 0x80, 0x88, 0x60, 0x00, 0x80, 0x98, 0x60, 0x00, 0x80, 0xa8, 0x60, + 0x00, 0x80, 0xb8, 0x60, 0x00, 0x80, 0xc8, 0x60, 0x00, 0x80, 0xd8, 0x60, + 0x00, 0x80, 0xe8, 0x60, 0x00, 0x80, 0xf8, 0x60, 0x00, 0x00, 0x89, 0x60, + 0x00, 0x00, 0x99, 0x60, 0x00, 0x00, 0xa9, 0x60, 0x00, 0x00, 0xb9, 0x60, + 0x00, 0x00, 0xc9, 0x60, 0x00, 0x00, 0xd9, 0x60, 0x00, 0x00, 0xe9, 0x60, + 0x00, 0x00, 0xf9, 0x60, 0x00, 0x00, 0x07, 0x48, 0x00, 0x08, 0x07, 0x48, + 0x00, 0x10, 0x07, 0x48, 0x00, 0x18, 0x07, 0x48, 0x00, 0x20, 0x07, 0x48, + 0x00, 0x28, 0x07, 0x48, 0x00, 0x30, 0x07, 0x48, 0x00, 0x38, 0x07, 0x48, + 0x00, 0x00, 0x08, 0x48, 0x00, 0x08, 0x08, 0x48, 0x00, 0x10, 0x08, 0x48, + 0x00, 0x18, 0x08, 0x48, 0x00, 0x20, 0x08, 0x48, 0x00, 0x28, 0x08, 0x48, + 0x00, 0x30, 0x08, 0x48, 0x00, 0x38, 0x08, 0x48, 0x00, 0x00, 0x0d, 0x60, + 0x00, 0x00, 0x1d, 0x60, 0x00, 0x00, 0x2d, 0x60, 0x00, 0x00, 0x3d, 0x60, + 0x00, 0x00, 0x4d, 0x60, 0x00, 0x00, 0x5d, 0x60, 0x00, 0x00, 0x6d, 0x60, + 0x00, 0x00, 0x7d, 0x60, 0x00, 0x00, 0x8c, 0x60, 0x00, 0x00, 0x9c, 0x60, + 0x00, 0x00, 0xac, 0x60, 0x00, 0x00, 0xbc, 0x60, 0x00, 0x00, 0xcc, 0x60, + 0x00, 0x00, 0xdc, 0x60, 0x00, 0x00, 0xec, 0x60, 0x00, 0x00, 0xfc, 0x60, + 0x00, 0x00, 0x8d, 0x60, 0x00, 0x00, 0x9d, 0x60, 0x00, 0x00, 0xad, 0x60, + 0x00, 0x00, 0xbd, 0x60, 0x00, 0x00, 0xcd, 0x60, 0x00, 0x00, 0xdd, 0x60, + 0x00, 0x00, 0xed, 0x60, 0x00, 0x00, 0xfd, 0x60, 0x00, 0x00, 0x8e, 0x60, + 0x00, 0x00, 0x9e, 0x60, 0x00, 0x00, 0xae, 0x60, 0x00, 0x00, 0xbe, 0x60, + 0x00, 0x00, 0xce, 0x60, 0x00, 0x00, 0xde, 0x60, 0x00, 0x00, 0xee, 0x60, + 0x00, 0x00, 0xfe, 0x60, 0x01, 0x20, 0xc0, 0x46, 0x00, 0x28, 0x01, 0xd0, + 0xff, 0xf7, 0x4e, 0xfc, 0xaf, 0xf3, 0x00, 0x80, 0x00, 0x20, 0xaf, 0xf3, + 0x00, 0x80, 0xcf, 0xf7, 0x23, 0xfb, 0xb6, 0xf7, 0xe7, 0xfc, 0x00, 0x00, + 0x07, 0x46, 0x38, 0x46, 0xef, 0xf7, 0x5c, 0xf8, 0xfb, 0xe7, 0x10, 0xee, + 0x10, 0x0a, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xee, 0x10, 0x0a, 0x00, 0xee, + 0x90, 0x1a, 0xce, 0xf7, 0xcd, 0xfb, 0xf4, 0xe7, 0x38, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x28, 0x46, 0xd5, 0xf7, 0xc8, 0xf9, 0xa8, 0x42, 0x18, 0xbf, + 0x00, 0x24, 0x20, 0x46, 0x32, 0xbd, 0x00, 0x00, 0x52, 0x78, 0x51, 0x45, + 0x43, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x52, 0x78, 0x51, 0x45, 0x43, 0x20, 0x54, 0x69, + 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x31, 0x00, 0x00, 0x00, 0x00, + 0x52, 0x78, 0x51, 0x45, 0x43, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, + 0x49, 0x64, 0x78, 0x32, 0x00, 0x00, 0x00, 0x00, 0x52, 0x78, 0x51, 0x45, + 0x43, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x33, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x78, 0x4c, 0x4f, 0x4c, 0x20, 0x54, 0x69, + 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x54, 0x78, 0x4c, 0x4f, 0x4c, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, + 0x49, 0x64, 0x78, 0x31, 0x00, 0x00, 0x00, 0x00, 0x54, 0x78, 0x4c, 0x4f, + 0x4c, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x32, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x78, 0x4c, 0x4f, 0x4c, 0x20, 0x54, 0x69, + 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x33, 0x00, 0x00, 0x00, 0x00, + 0x54, 0x78, 0x51, 0x45, 0x43, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, + 0x49, 0x64, 0x78, 0x30, 0x00, 0x00, 0x00, 0x00, 0x54, 0x78, 0x51, 0x45, + 0x43, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x31, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x78, 0x51, 0x45, 0x43, 0x20, 0x54, 0x69, + 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x32, 0x00, 0x00, 0x00, 0x00, + 0x54, 0x78, 0x51, 0x45, 0x43, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, + 0x49, 0x64, 0x78, 0x33, 0x00, 0x00, 0x00, 0x00, 0x52, 0x78, 0x41, 0x64, + 0x63, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x52, 0x78, 0x41, 0x64, 0x63, 0x20, 0x54, 0x69, + 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x31, 0x00, 0x00, 0x00, 0x00, + 0x52, 0x78, 0x41, 0x64, 0x63, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, + 0x49, 0x64, 0x78, 0x32, 0x00, 0x00, 0x00, 0x00, 0x52, 0x78, 0x41, 0x64, + 0x63, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x33, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x78, 0x6c, 0x62, 0x41, 0x64, 0x63, 0x20, + 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x30, 0x00, 0x00, 0x00, + 0x54, 0x78, 0x6c, 0x62, 0x41, 0x64, 0x63, 0x20, 0x54, 0x69, 0x6d, 0x65, + 0x72, 0x20, 0x49, 0x64, 0x78, 0x30, 0x00, 0x00, 0x54, 0x78, 0x6c, 0x62, + 0x41, 0x64, 0x63, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, + 0x31, 0x00, 0x00, 0x00, 0x54, 0x78, 0x6c, 0x62, 0x41, 0x64, 0x63, 0x20, + 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x31, 0x00, 0x00, + 0x54, 0x78, 0x6c, 0x62, 0x41, 0x64, 0x63, 0x20, 0x54, 0x61, 0x73, 0x6b, + 0x20, 0x49, 0x64, 0x78, 0x32, 0x00, 0x00, 0x00, 0x54, 0x78, 0x6c, 0x62, + 0x41, 0x64, 0x63, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, + 0x78, 0x32, 0x00, 0x00, 0x54, 0x78, 0x6c, 0x62, 0x41, 0x64, 0x63, 0x20, + 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x33, 0x00, 0x00, 0x00, + 0x54, 0x78, 0x6c, 0x62, 0x41, 0x64, 0x63, 0x20, 0x54, 0x69, 0x6d, 0x65, + 0x72, 0x20, 0x49, 0x64, 0x78, 0x33, 0x00, 0x00, 0x4f, 0x72, 0x78, 0x41, + 0x64, 0x63, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x4f, 0x72, 0x78, 0x41, 0x64, 0x63, 0x20, 0x54, + 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x30, 0x00, 0x00, 0x00, + 0x00, 0xee, 0x10, 0x0a, 0x00, 0xee, 0x90, 0x1a, 0x80, 0xee, 0x20, 0x0a, + 0x10, 0xee, 0x10, 0x0a, 0x70, 0x47, 0x00, 0xee, 0x10, 0x0a, 0x00, 0xee, + 0x90, 0x1a, 0x30, 0xee, 0x20, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x70, 0x47, + 0x00, 0xee, 0x10, 0x0a, 0x00, 0xee, 0x90, 0x1a, 0x20, 0xee, 0x20, 0x0a, + 0x10, 0xee, 0x10, 0x0a, 0x70, 0x47, 0x00, 0xee, 0x10, 0x0a, 0x00, 0xee, + 0x90, 0x1a, 0x30, 0xee, 0x60, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x70, 0x47, + 0x5b, 0x45, 0x20, 0x20, 0x25, 0x30, 0x32, 0x58, 0x20, 0x25, 0x58, 0x5d, + 0x20, 0x00, 0x00, 0x00, 0x5b, 0x57, 0x20, 0x20, 0x25, 0x30, 0x32, 0x58, + 0x20, 0x25, 0x58, 0x5d, 0x20, 0x00, 0x00, 0x00, 0x5b, 0x49, 0x20, 0x20, + 0x25, 0x30, 0x32, 0x58, 0x20, 0x25, 0x58, 0x5d, 0x20, 0x00, 0x00, 0x00, + 0x5b, 0x49, 0x32, 0x20, 0x25, 0x30, 0x32, 0x58, 0x20, 0x25, 0x58, 0x5d, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x47, 0x00, 0x00, 0x40, 0x47, + 0x00, 0x00, 0x09, 0x48, 0x00, 0x00, 0x06, 0x48, 0x49, 0x6e, 0x69, 0x74, + 0x20, 0x43, 0x61, 0x6c, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x00, 0x00, 0x00, + 0x52, 0x78, 0x51, 0x45, 0x43, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, + 0x64, 0x78, 0x30, 0x00, 0x52, 0x78, 0x51, 0x45, 0x43, 0x20, 0x54, 0x61, + 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x31, 0x00, 0x52, 0x78, 0x51, 0x45, + 0x43, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x32, 0x00, + 0x52, 0x78, 0x51, 0x45, 0x43, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, + 0x64, 0x78, 0x33, 0x00, 0x54, 0x78, 0x4c, 0x4f, 0x4c, 0x20, 0x54, 0x61, + 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x30, 0x00, 0x54, 0x78, 0x4c, 0x4f, + 0x4c, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x31, 0x00, + 0x54, 0x78, 0x4c, 0x4f, 0x4c, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, + 0x64, 0x78, 0x32, 0x00, 0x54, 0x78, 0x4c, 0x4f, 0x4c, 0x20, 0x54, 0x61, + 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x33, 0x00, 0x54, 0x78, 0x51, 0x45, + 0x43, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x30, 0x00, + 0x54, 0x78, 0x51, 0x45, 0x43, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, + 0x64, 0x78, 0x31, 0x00, 0x54, 0x78, 0x51, 0x45, 0x43, 0x20, 0x54, 0x61, + 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x32, 0x00, 0x54, 0x78, 0x51, 0x45, + 0x43, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x33, 0x00, + 0x53, 0x65, 0x72, 0x64, 0x65, 0x73, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, + 0x00, 0x00, 0x00, 0x00, 0x52, 0x78, 0x41, 0x64, 0x63, 0x20, 0x54, 0x61, + 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x30, 0x00, 0x52, 0x78, 0x41, 0x64, + 0x63, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x31, 0x00, + 0x52, 0x78, 0x41, 0x64, 0x63, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, + 0x64, 0x78, 0x32, 0x00, 0x52, 0x78, 0x41, 0x64, 0x63, 0x20, 0x54, 0x61, + 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x33, 0x00, 0x00, 0xee, 0x10, 0x0a, + 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x70, 0x47, 0x00, 0xee, + 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x70, 0x47, + 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, + 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x04, 0x48, + 0x00, 0x00, 0x05, 0x48, 0x00, 0x00, 0x10, 0x41, 0x00, 0x00, 0x10, 0x44, + 0x00, 0x01, 0x81, 0x46, 0x53, 0x65, 0x72, 0x64, 0x65, 0x73, 0x20, 0x54, + 0x61, 0x73, 0x6b, 0x00, 0x80, 0xb5, 0x00, 0x20, 0xe2, 0xf7, 0xac, 0xf9, + 0xfe, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x07, 0x61, 0x00, 0x00, 0x17, 0x61, + 0x00, 0x80, 0x06, 0x61, 0x00, 0x80, 0x16, 0x61, 0x00, 0x00, 0x05, 0x61, + 0x00, 0x00, 0x15, 0x61, 0x00, 0x20, 0x02, 0x61, 0x00, 0x20, 0x12, 0x61, + 0x00, 0x30, 0x02, 0x61, 0x00, 0x30, 0x12, 0x61, 0x00, 0x80, 0x05, 0x61, + 0x00, 0x80, 0x15, 0x61, 0x00, 0xa4, 0x06, 0x61, 0x00, 0xa4, 0x16, 0x61, + 0x00, 0xa8, 0x06, 0x61, 0x00, 0xa8, 0x16, 0x61, 0x00, 0x84, 0x06, 0x61, + 0x00, 0x84, 0x16, 0x61, 0x00, 0x00, 0x01, 0x48, 0x00, 0x00, 0x02, 0x48, + 0xf2, 0x0e, 0x00, 0x01, 0xa0, 0x02, 0x6f, 0x12, 0x83, 0x3a, 0x24, 0xf1, + 0x03, 0x10, 0x21, 0x04, 0xa0, 0x02, 0x77, 0xcc, 0x2b, 0x32, 0x18, 0xf0, + 0x02, 0x03, 0x5f, 0x70, 0x89, 0x30, 0x28, 0xf0, 0x02, 0x0b, 0x00, 0x00, + 0x80, 0x3f, 0x74, 0xa0, 0x02, 0x0a, 0xd7, 0x23, 0x3c, 0x20, 0xa0, 0x02, + 0xbd, 0x37, 0x06, 0x36, 0x10, 0xf1, 0x0f, 0x68, 0xf1, 0x0f, 0x01, 0xe1, + 0x60, 0xf0, 0x02, 0x1b, 0x95, 0xbf, 0xd6, 0x34, 0x60, 0x10, 0x02, 0xff, + 0xe6, 0x5b, 0x2e, 0x10, 0x40, 0x07, 0x3f, 0x7f, 0xfb, 0xfc, 0x41, 0xdb, + 0xd1, 0x07, 0x33, 0xd4, 0x10, 0x0b, 0x20, 0x41, 0xac, 0xcb, 0xa5, 0x39, + 0x00, 0x6f, 0x01, 0x3d, 0x66, 0x66, 0x66, 0xe0, 0x43, 0x80, 0x3e, 0xe8, + 0x83, 0x20, 0x41, 0x3c, 0x63, 0x20, 0x41, 0x5c, 0x20, 0x01, 0x33, 0x33, + 0x73, 0x24, 0x30, 0x02, 0x3f, 0x3b, 0xdf, 0x7f, 0x08, 0x10, 0x02, 0x99, + 0xbb, 0x16, 0x3b, 0x04, 0x12, 0x3c, 0x9c, 0xa0, 0x03, 0x3d, 0x00, 0x40, + 0x1c, 0x46, 0x70, 0x13, 0x01, 0x01, 0x04, 0x46, 0x03, 0x40, 0x20, 0x0c, + 0xd0, 0x07, 0x00, 0x00, 0xcd, 0xcc, 0x4c, 0x3f, 0x88, 0x13, 0x00, 0x00, + 0x30, 0x75, 0x26, 0x23, 0x80, 0x3f, 0xd0, 0x21, 0x58, 0x10, 0x02, 0x3b, + 0x70, 0xce, 0x3b, 0x2b, 0x22, 0x00, 0x24, 0x30, 0x01, 0xa0, 0x86, 0x01, + 0x28, 0x10, 0x07, 0x52, 0xc6, 0xa9, 0x34, 0x17, 0xb7, 0xd1, 0x38, 0x64, + 0x18, 0x50, 0x03, 0x0a, 0x00, 0xe8, 0x03, 0x03, 0x48, 0x52, 0x01, 0x61, + 0x43, 0x01, 0xff, 0x30, 0x21, 0x2c, 0x12, 0x02, 0x14, 0x12, 0xe8, 0x20, + 0x21, 0x5c, 0x60, 0x02, 0x50, 0xc3, 0x00, 0x00, 0x2c, 0x11, 0xf2, 0x45, + 0xb0, 0x20, 0x01, 0xe1, 0xf5, 0x05, 0x18, 0x21, 0x78, 0x21, 0x30, 0x21, + 0xec, 0x21, 0x5c, 0x25, 0x04, 0x21, 0x04, 0x12, 0x0a, 0x25, 0x62, 0x64, + 0x58, 0x13, 0x03, 0x05, 0x56, 0x67, 0x80, 0x3f, 0xf4, 0x21, 0x28, 0x12, + 0x04, 0x1c, 0x21, 0x08, 0x21, 0xb0, 0x10, 0x03, 0xbd, 0x37, 0x86, 0x35, + 0xc8, 0x10, 0x12, 0x32, 0x7e, 0x20, 0x06, 0x19, 0x00, 0x04, 0x03, 0xac, + 0xc5, 0x27, 0x37, 0x3b, 0x21, 0x84, 0x25, 0x21, 0x22, 0xf4, 0xa1, 0x11, + 0x70, 0x20, 0x02, 0x80, 0x96, 0x18, 0x4b, 0x34, 0xa1, 0x04, 0x52, 0x05, + 0x64, 0x21, 0xac, 0x21, 0x68, 0x30, 0x15, 0x09, 0x0b, 0x0d, 0x0f, 0x20, + 0x0b, 0x20, 0x00, 0xa0, 0x25, 0x26, 0x00, 0x40, 0xe1, 0x33, 0x00, 0x80, + 0x58, 0x4f, 0x00, 0x00, 0x12, 0x7a, 0x26, 0xf0, 0x06, 0xff, 0x06, 0x05, + 0x04, 0x03, 0x02, 0x00, 0x05, 0x00, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0x13, 0x01, 0x1c, 0x04, 0x07, 0x01, 0x06, 0x02, 0x09, 0x08, + 0x21, 0x32, 0x1d, 0x1e, 0x32, 0x1c, 0x03, 0x01, 0x03, 0x08, 0x07, 0x06, + 0x29, 0x32, 0xfe, 0x02, 0x04, 0x2a, 0x32, 0x10, 0x08, 0x01, 0x01, 0x02, + 0x00, 0x06, 0x07, 0x10, 0x08, 0x03, 0x05, 0x09, 0x22, 0x07, 0x09, 0x50, + 0x06, 0x0e, 0x01, 0x00, 0x01, 0x07, 0x07, 0x04, 0x04, 0x09, 0x1e, 0x02, + 0x64, 0x32, 0x1d, 0xa5, 0x33, 0x31, 0x12, 0x41, 0x09, 0x62, 0x03, 0x09, + 0x71, 0x1b, 0x40, 0x04, 0x01, 0x04, 0x03, 0x01, 0x01, 0x03, 0x12, 0x41, + 0x09, 0x42, 0x01, 0x3f, 0x30, 0x02, 0x03, 0x07, 0x08, 0x06, 0x24, 0x50, + 0x02, 0x03, 0x07, 0x0a, 0x08, 0x09, 0x62, 0x05, 0x09, 0x33, 0x04, 0x08, + 0x2d, 0x11, 0x12, 0x52, 0x07, 0x09, 0x10, 0x02, 0x04, 0x07, 0x03, 0x08, + 0x1b, 0x50, 0x02, 0x01, 0x07, 0x0b, 0x08, 0x09, 0x62, 0x09, 0x09, 0x62, + 0x07, 0x09, 0x62, 0x05, 0x09, 0x11, 0x3f, 0x42, 0x04, 0x3f, 0x61, 0x09, + 0x42, 0x04, 0x1b, 0x60, 0x01, 0x00, 0x03, 0x10, 0x09, 0x62, 0x0f, 0x09, + 0x51, 0x51, 0x53, 0x00, 0x03, 0x51, 0x53, 0x00, 0x03, 0x51, 0x60, 0x01, + 0x00, 0x03, 0x06, 0x09, 0x11, 0x48, 0x2e, 0x06, 0x8b, 0x34, 0x63, 0x07, + 0x06, 0x09, 0x51, 0x6c, 0x63, 0x00, 0x00, 0x51, 0x63, 0x00, 0x0e, 0x09, + 0x61, 0x51, 0x62, 0x00, 0x51, 0x63, 0x00, 0x08, 0x09, 0x52, 0x07, 0x3f, + 0x63, 0x01, 0x08, 0x09, 0x71, 0x12, 0x61, 0x6c, 0x62, 0x00, 0x99, 0x53, + 0x00, 0x0d, 0x1b, 0x63, 0x00, 0x0a, 0x09, 0x62, 0x09, 0x09, 0x71, 0x51, + 0xa0, 0x04, 0x0c, 0x08, 0x03, 0x07, 0x01, 0x03, 0x2d, 0x62, 0x0c, 0x09, + 0x62, 0x0b, 0x1b, 0x62, 0x10, 0x09, 0x11, 0x5a, 0x42, 0x0a, 0x12, 0x12, + 0x04, 0x3f, 0xb1, 0x09, 0x63, 0x0b, 0x04, 0x1b, 0x60, 0x01, 0x06, 0x03, + 0x0f, 0x09, 0x42, 0x0e, 0x09, 0x62, 0x07, 0x1b, 0x62, 0x07, 0x5a, 0x62, + 0x07, 0x36, 0x52, 0x08, 0x09, 0x53, 0x06, 0x06, 0x24, 0x62, 0x0b, 0x2d, + 0x11, 0x1b, 0x62, 0x0c, 0x1b, 0x41, 0x48, 0x63, 0x06, 0x07, 0x09, 0x52, + 0x06, 0x1b, 0x62, 0x10, 0x12, 0x62, 0x0b, 0x99, 0x71, 0x48, 0x63, 0x10, + 0x08, 0x7e, 0x62, 0x06, 0xc6, 0x61, 0x09, 0x63, 0x06, 0x06, 0xbd, 0x71, + 0x09, 0x62, 0x07, 0x51, 0x71, 0xbd, 0x5a, 0x07, 0x64, 0x6a, 0x05, 0x64, + 0x6a, 0x08, 0x5b, 0x55, 0x68, 0x4a, 0x01, 0xd9, 0x39, 0xac, 0x61, 0x09, + 0x62, 0x04, 0x09, 0x62, 0x06, 0x09, 0x11, 0x36, 0x62, 0x07, 0x24, 0x62, + 0x07, 0x24, 0x62, 0x07, 0x24, 0x62, 0x07, 0x24, 0x62, 0x09, 0x24, 0x62, + 0x09, 0x24, 0x62, 0x09, 0x24, 0x62, 0x09, 0x24, 0x62, 0x0b, 0x24, 0x62, + 0x0b, 0x24, 0x62, 0x0b, 0x24, 0x62, 0x0b, 0x24, 0x62, 0x0d, 0x24, 0x62, + 0x0d, 0x24, 0x62, 0x0d, 0x24, 0x62, 0x0d, 0x24, 0x62, 0x0f, 0x24, 0x62, + 0x0f, 0x24, 0x62, 0x0f, 0x24, 0x62, 0x0f, 0x24, 0x57, 0x00, 0x00, 0x07, + 0x4d, 0x47, 0x03, 0x17, 0x00, 0x07, 0x19, 0x4d, 0x7d, 0x03, 0x4e, 0x10, + 0x7d, 0x03, 0x57, 0x00, 0x07, 0x22, 0x51, 0x12, 0x59, 0xc9, 0x25, 0x22, + 0x31, 0x1b, 0x4d, 0xbc, 0x03, 0x11, 0x1b, 0x62, 0x05, 0x48, 0x31, 0x09, + 0x9b, 0x07, 0x10, 0x54, 0x55, 0x7c, 0x41, 0xe3, 0x81, 0x09, 0x32, 0x03, + 0x09, 0x51, 0x1b, 0x1e, 0x00, 0x1a, 0x04, 0x2d, 0x62, 0x04, 0x40, 0x01, + 0x06, 0x1f, 0x0f, 0x01, 0x12, 0x0c, 0x08, 0x24, 0x0d, 0x06, 0x06, 0x05, + 0x05, 0x03, 0x03, 0x02, 0x02, 0x0c, 0x07, 0x07, 0x0f, 0x08, 0x07, 0x07, + 0x46, 0x11, 0x02, 0x31, 0x33, 0x31, 0x01, 0x12, 0xff, 0x01, 0x1c, 0x03, + 0x00, 0x05, 0x0c, 0x01, 0x98, 0x82, 0x37, 0x21, 0x5a, 0x43, 0xb8, 0x0b, + 0x1a, 0x1e, 0x01, 0x5a, 0x37, 0x13, 0xc4, 0x09, 0x0c, 0x2f, 0x0e, 0x27, + 0xea, 0x37, 0xf0, 0x01, 0x29, 0xc1, 0x07, 0x00, 0x01, 0x52, 0x68, 0x3c, + 0x12, 0xd4, 0x61, 0x12, 0x10, 0x04, 0x12, 0xa0, 0x04, 0x23, 0xe0, 0x0f, + 0x15, 0x2f, 0x0a, 0x01, 0x08, 0x38, 0x2d, 0xd4, 0x37, 0x33, 0x04, 0x01, + 0xd9, 0x71, 0x01, 0xf3, 0x79, 0x01, 0x00, 0x01, 0x12, 0xbc, 0x8c, 0x12, + 0x40, 0x04, 0x12, 0xf4, 0x04, 0x12, 0x08, 0x99, 0x16, 0x5c, 0x3e, 0x4f, + 0x58, 0x08, 0xc4, 0x38, 0x95, 0x34, 0xdf, 0x04, 0x01, 0x03, 0x38, 0xfd, + 0xd3, 0x12, 0x38, 0x65, 0xdc, 0x16, 0x30, 0x09, 0x12, 0x24, 0x0c, 0x12, + 0x78, 0x04, 0x1e, 0x4c, 0x61, 0x39, 0x1c, 0x05, 0x05, 0x04, 0x06, 0x05, + 0x08, 0x06, 0x09, 0x6f, 0x06, 0x1f, 0x06, 0x04, 0xc0, 0x05, 0x1f, 0x06, + 0x0a, 0x4c, 0x06, 0x10, 0x03, 0x06, 0x04, 0x08, 0x05, 0x09, 0x0a, 0x32, + 0x0c, 0x0a, 0x10, 0x07, 0x0a, 0x06, 0x0b, 0x07, 0x0d, 0x08, 0x07, 0x04, + 0x09, 0x0a, 0x10, 0x03, 0x0c, 0x07, 0x0e, 0x08, 0x08, 0x0a, 0x18, 0x01, + 0x0b, 0x06, 0x0d, 0xa7, 0x1c, 0x05, 0x08, 0x04, 0x0a, 0x05, 0x0c, 0x06, + 0x0e, 0x01, 0x03, 0xe5, 0x41, 0x28, 0x07, 0x80, 0x3f, 0x01, 0x02, 0x05, + 0x06, 0x00, 0x03, 0x04, 0x8f, 0xcf, 0x20, 0x00, 0x49, 0x07, 0xb2, 0x21, + 0x10, 0xa0, 0x02, 0x04, 0x00, 0x20, 0x20, 0x1f, 0xa0, 0x01, 0x04, 0x00, + 0x21, 0x10, 0x10, 0x02, 0xef, 0xbe, 0xad, 0xba, 0x04, 0x22, 0xde, 0x08, + 0x34, 0x01, 0x18, 0x00, 0x18, 0xc8, 0x6f, 0x5e, 0x01, 0xf0, 0x3a, 0xf1, + 0x1e, 0x01, 0x1f, 0x0f, 0x0f, 0xf2, 0x03, 0x3d, 0x4a, 0x03, 0x91, 0x01, + 0x4d, 0x80, 0x3c, 0x39, 0xe7, 0x49, 0x3f, 0x31, 0x01, 0x32, 0x10, 0x09, + 0x72, 0x01, 0x10, 0x32, 0x11, 0x09, 0x72, 0x02, 0x10, 0x32, 0x12, 0x09, + 0x72, 0x03, 0x10, 0x32, 0x13, 0x09, 0x72, 0x04, 0x10, 0x32, 0x14, 0x09, + 0x72, 0x05, 0x10, 0x32, 0x15, 0x09, 0x72, 0x06, 0x10, 0x32, 0x16, 0x09, + 0x72, 0x07, 0x10, 0x32, 0x17, 0x09, 0x72, 0x08, 0x10, 0x32, 0x18, 0x09, + 0x72, 0x09, 0x10, 0x32, 0x19, 0x09, 0x72, 0x0a, 0x10, 0x32, 0x1a, 0x09, + 0x72, 0x0b, 0x10, 0x32, 0x1b, 0x09, 0x72, 0x0c, 0x10, 0x32, 0x1c, 0x09, + 0x72, 0x0d, 0x10, 0x32, 0x1d, 0x09, 0x72, 0x0e, 0x10, 0x32, 0x1e, 0x09, + 0xf0, 0x01, 0x43, 0x0f, 0x40, 0x00, 0x01, 0x20, 0x04, 0x6c, 0x6f, 0x67, + 0x6c, 0x76, 0x6c, 0x5b, 0x12, 0x01, 0x0b, 0x37, 0x63, 0x70, 0xac, 0x12, + 0x02, 0x0b, 0x20, 0x01, 0x6f, 0x62, 0x6a, 0x0b, 0x10, 0x06, 0x0c, 0x72, + 0x75, 0x6e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x10, 0x06, 0x0d, 0x67, 0x70, + 0x69, 0x6f, 0x63, 0x66, 0x67, 0x0b, 0x22, 0x0e, 0x0b, 0x23, 0x74, 0x6f, + 0x0b, 0x22, 0x0f, 0x0b, 0x3e, 0x72, 0x40, 0x3c, 0x22, 0x10, 0x0b, 0x23, + 0x77, 0x72, 0x0b, 0x30, 0x04, 0x1b, 0x64, 0x67, 0x62, 0x35, 0x39, 0xb2, + 0x12, 0x27, 0x4d, 0x20, 0x01, 0x74, 0x65, 0x73, 0x42, 0x12, 0x41, 0x4d, + 0x20, 0x01, 0x6d, 0x63, 0x73, 0x17, 0xf3, 0x0c, 0xff, 0x20, 0xcf, 0x10, + 0x0b, 0x65, 0x04, 0x00, 0x01, 0xf0, 0x9b, 0x04, 0x01, 0x00, 0x9c, 0x04, + 0x01, 0x10, 0x04, 0x12, 0x20, 0x04, 0xf2, 0x52, 0x00, 0x01, 0xfd, 0x68, + 0x24, 0x05, 0xf0, 0x10, 0x14, 0x02, 0x01, 0x03, 0x04, 0x05, 0x11, 0x06, + 0x08, 0x09, 0x0e, 0x07, 0x0a, 0x0d, 0x0b, 0x12, 0x0c, 0x0f, 0x10, 0x8a, + 0x35, 0x46, 0xf1, 0x21, 0x05, 0x31, 0x5d, 0x22, 0x10, 0xee, 0x2e, 0x10, + 0xbb, 0x3d, 0xf0, 0x01, 0x28, 0x10, 0x00, 0x03, 0x4b, 0xf1, 0x08, 0x05, + 0x81, 0x01, 0xd1, 0x14, 0xf3, 0x0b, 0x20, 0x00, 0x01, 0x2e, 0x12, 0x73, + 0x04, 0x10, 0x02, 0x11, 0x00, 0x06, 0x01, 0x05, 0x2c, 0x02, 0x0e, 0x02, + 0x00, 0x30, 0x7f, 0x03, 0xfc, 0x0b, 0x05, 0x32, 0x00, 0x17, 0x03, 0x00, + 0x31, 0x00, 0x19, 0x04, 0x00, 0x31, 0x01, 0x01, 0x03, 0x06, 0x31, 0x55, + 0x1f, 0x30, 0x0c, 0x7c, 0x03, 0xa0, 0x01, 0x30, 0x0c, 0x1a, 0x64, 0x1f, + 0x10, 0x0c, 0x70, 0x03, 0x10, 0x02, 0x11, 0x01, 0x09, 0x06, 0x05, 0x13, + 0x11, 0x07, 0x41, 0x10, 0x05, 0x19, 0x08, 0x00, 0x31, 0x02, 0x01, 0x09, + 0x05, 0x13, 0x09, 0x0a, 0x05, 0x10, 0x0a, 0x11, 0x0b, 0x00, 0x11, 0x02, + 0x19, 0x0c, 0x00, 0x11, 0x03, 0x01, 0x0d, 0x05, 0x13, 0x09, 0x0e, 0x05, + 0x10, 0x0a, 0x11, 0x0f, 0x00, 0x39, 0x03, 0x19, 0x10, 0x00, 0x31, 0x04, + 0x01, 0x11, 0x05, 0x13, 0x09, 0x12, 0x05, 0x13, 0x11, 0x13, 0x05, 0x10, + 0x0f, 0x19, 0x14, 0x00, 0x39, 0x05, 0x01, 0x15, 0x00, 0x11, 0x05, 0x09, + 0x16, 0x00, 0x31, 0x05, 0x11, 0x17, 0x05, 0x10, 0x05, 0x19, 0x18, 0x00, + 0x31, 0x06, 0x01, 0x19, 0x05, 0x10, 0x05, 0x09, 0x1a, 0x00, 0x11, 0x06, + 0x11, 0x1b, 0x05, 0x10, 0x05, 0x19, 0x1c, 0x00, 0x32, 0x07, 0x01, 0x1d, + 0x05, 0x13, 0x03, 0x1e, 0x05, 0x13, 0x05, 0x1f, 0x05, 0x10, 0x05, 0x07, + 0x20, 0x00, 0x12, 0x07, 0x09, 0x21, 0x05, 0x13, 0x0b, 0x22, 0x05, 0x10, + 0x05, 0x0d, 0x23, 0x00, 0x31, 0x07, 0x0f, 0x24, 0x05, 0x13, 0x17, 0x25, + 0x05, 0x10, 0x05, 0x1f, 0x26, 0x00, 0x31, 0x08, 0x07, 0x27, 0x05, 0x13, + 0x0f, 0x28, 0x05, 0x13, 0x17, 0x29, 0x05, 0x10, 0x05, 0x1f, 0x2a, 0x00, + 0x31, 0x09, 0x07, 0x2b, 0x05, 0x13, 0x0f, 0x2c, 0x05, 0x13, 0x17, 0x2d, + 0x05, 0x10, 0x05, 0x1f, 0x2e, 0x00, 0x31, 0x0a, 0x07, 0x2f, 0x05, 0x13, + 0x0f, 0x30, 0x05, 0x13, 0x17, 0x31, 0x05, 0x10, 0x0a, 0x1f, 0x32, 0x00, + 0x31, 0x0b, 0x07, 0x33, 0x00, 0x32, 0x0b, 0x0f, 0x34, 0x05, 0x13, 0x11, + 0x35, 0x05, 0x13, 0x13, 0x36, 0x05, 0x13, 0x15, 0x37, 0x05, 0x13, 0x17, + 0x38, 0x05, 0x13, 0x19, 0x39, 0x05, 0x13, 0x1b, 0x3a, 0x05, 0x14, 0x03, + 0x1d, 0x3b, 0x00, 0x30, 0x0d, 0x1e, 0x2f, 0x30, 0x0d, 0x9b, 0x05, 0x16, + 0x0d, 0xfe, 0x17, 0x30, 0x0d, 0xfe, 0x17, 0x30, 0x0d, 0x77, 0x17, 0x30, + 0x0d, 0x5d, 0x20, 0x01, 0x30, 0x0d, 0x06, 0x05, 0x22, 0x07, 0x05, 0x22, + 0x08, 0x05, 0x22, 0x09, 0x05, 0x22, 0x0a, 0x05, 0x22, 0x0b, 0x05, 0x22, + 0x0c, 0x05, 0x11, 0x42, 0x20, 0x01, 0x30, 0x0d, 0x0e, 0x05, 0x1d, 0x8e, + 0x05, 0x10, 0x02, 0x31, 0x0f, 0x00, 0x3c, 0x05, 0x10, 0x05, 0x08, 0x3d, + 0x00, 0x11, 0x0f, 0x10, 0x3e, 0x0a, 0x28, 0x02, 0x18, 0x3f, 0x00, 0x10, + 0x63, 0x2e, 0x30, 0x9b, 0x08, 0x13, 0x10, 0x10, 0x64, 0x1f, 0x11, 0x0c, + 0x20, 0x05, 0x3c, 0x01, 0x11, 0x0c, 0x11, 0x55, 0x41, 0x1d, 0xd4, 0x05, + 0x37, 0x10, 0x27, 0xa1, 0x50, 0x02, 0x07, 0x05, 0x03, 0xff, 0x01, 0x52, + 0x02, 0x01, 0xf2, 0x68, 0x00, 0x01, 0x1e, 0xff, 0x06, 0x03, 0x2e, 0x04, + 0x0a, 0x03, 0x1d, 0x77, 0x08, 0x12, 0x04, 0x0a, 0x1e, 0x01, 0x95, 0x03, + 0x13, 0x00, 0x01, 0x04, 0x3d, 0x16, 0x04, 0x1e, 0x04, 0x45, 0x0e, 0x1c, + 0x01, 0x02, 0x00, 0x03, 0xe7, 0x09, 0x12, 0x01, 0x01, 0x1d, 0x9c, 0x0b, + 0x11, 0x05, 0x11, 0xad, 0x11, 0x20, 0x2d, 0xfd, 0x09, 0x1d, 0x91, 0x41, + 0xf3, 0x9f, 0x01, 0x00, 0x01, 0x46, 0x02, 0x88, 0x2c, 0x02, 0xff, 0xe6, + 0xdb, 0x2e, 0xa0, 0x41, 0x12, 0x80, 0xc1, 0x20, 0x02, 0x03, 0x03, 0x01, + 0x40, 0xc9, 0x4f, 0x40, 0x77, 0xa6, 0x06, 0x2d, 0x74, 0x07, 0x20, 0x06, + 0x52, 0x49, 0x1d, 0x39, 0x52, 0x49, 0x9d, 0x3b, 0x08, 0x14, 0x01, 0x00, + 0x00, 0xd8, 0xc3, 0x20, 0x08, 0x10, 0x41, 0x32, 0x1b, 0xd3, 0x2d, 0x1f, + 0x6f, 0x14, 0x31, 0x08, 0x20, 0x06, 0x84, 0x37, 0x68, 0x2c, 0x3a, 0x9f, + 0x82, 0x2f, 0x08, 0x20, 0x01, 0x32, 0x1b, 0x53, 0x04, 0x22, 0x2f, 0x08, + 0x1c, 0x01, 0x00, 0x48, 0xf3, 0x10, 0x43, 0x23, 0x7c, 0x42, 0x49, 0x20, + 0x06, 0x82, 0xa8, 0xfb, 0x36, 0x82, 0xa8, 0x7b, 0x3a, 0x08, 0x1c, 0x06, + 0x1f, 0x6a, 0xc0, 0x2f, 0x93, 0xa4, 0x00, 0x2f, 0x90, 0x43, 0xc0, 0x03, + 0x2f, 0x9b, 0x33, 0xfc, 0x27, 0x60, 0x21, 0x01, 0x23, 0x80, 0x3f, 0x40, + 0x30, 0x01, 0xc5, 0xce, 0x4f, 0x48, 0x10, 0x02, 0x8e, 0xe2, 0xa8, 0x2a, + 0x04, 0x52, 0x2d, 0x08, 0x71, 0x0c, 0xf0, 0x02, 0x03, 0x00, 0x50, 0x43, + 0x47, 0x60, 0x30, 0x09, 0xff, 0xeb, 0x2f, 0x2d, 0xbf, 0xef, 0x0e, 0x2f, + 0x8f, 0x23, 0x7a, 0x60, 0x1d, 0x16, 0x43, 0x42, 0x41, 0x04, 0x1d, 0xd6, + 0x07, 0x11, 0x05, 0x6f, 0x57, 0xc1, 0x18, 0x0b, 0x13, 0x70, 0x44, 0x6c, + 0x2a, 0x41, 0x73, 0xc1, 0x18, 0x43, 0x50, 0x44, 0x04, 0x81, 0x18, 0x41, + 0x19, 0x12, 0x70, 0x44, 0xa3, 0x80, 0x44, 0x30, 0x51, 0x31, 0x16, 0xa8, + 0x14, 0xf3, 0x00, 0xa8, 0x8a, 0x48, 0x12, 0x20, 0x18, 0xb2, 0x30, 0x18, + 0x51, 0x19, 0x12, 0xa4, 0x30, 0xf2, 0x02, 0xa4, 0x30, 0x11, 0x18, 0xf3, + 0x02, 0x30, 0xa4, 0x30, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0x8c, + 0x01, 0x4e, 0xd0, 0x9a, 0x10, 0x6d, 0x34, 0x0a, 0x3d, 0xdc, 0x4a, 0x40, + 0x04, 0x39, 0x8e, 0xe3, 0x3d, 0x20, 0x00, 0x1c, 0x2d, 0xbc, 0x08, 0x2d, + 0x54, 0x4a, 0x4c, 0x03, 0xe4, 0x83, 0xfe, 0x3f, 0x5a, 0x02, 0x4c, 0x2d, + 0x28, 0x10, 0x1e, 0xbf, 0xac, 0x07, 0x2f, 0x3c, 0x0a, 0xbe, 0x09, 0xfd, + 0xff, 0x46, 0x07, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xe2, 0x01, + 0x3c, 0x01, 0x30, 0x2b, 0x36, 0xeb, 0x0d, 0x30, 0x01, 0x80, 0xb9, 0x2a, + 0x08, 0x1f, 0xcc, 0x62, 0xe8, 0x0d, 0x33, 0x04, 0x02, 0x10, 0x1d, 0x9a, + 0x0e, 0x30, 0x02, 0x00, 0x98, 0x15, 0x1b, 0x10, 0x21, 0x18, 0x30, 0x05, + 0x02, 0x04, 0x04, 0x00, 0xcc, 0x8a, 0x0d, 0x08, 0x12, 0xaa, 0x01, 0x12, + 0x19, 0x01, 0x4c, 0x04, 0x00, 0x3f, 0x03, 0x2c, 0x1d, 0x04, 0x00, 0x4f, + 0x1c, 0x03, 0x80, 0x4a, 0x5d, 0x05, 0x2c, 0x72, 0x04, 0x52, 0x03, 0x04, + 0x52, 0x10, 0x04, 0x3c, 0x01, 0x01, 0x20, 0x1d, 0x98, 0x10, 0x2d, 0x83, + 0x15, 0x4f, 0xa0, 0x0f, 0x56, 0x0e, 0xaf, 0x0f, 0x09, 0x9b, 0x04, 0xcf, + 0x80, 0x3f, 0x64, 0x51, 0x61, 0x0c, 0x2d, 0x2c, 0x50, 0x2f, 0xa3, 0x3b, + 0x50, 0x51, 0x1d, 0xf4, 0x50, 0x2e, 0x33, 0xd8, 0x50, 0x61, 0x10, 0x11, + 0x04, 0x22, 0x35, 0x10, 0x2d, 0x98, 0x4f, 0x2d, 0xf8, 0x0c, 0x2d, 0x50, + 0x50, 0x20, 0x06, 0x13, 0x2e, 0xe1, 0x29, 0x17, 0xb7, 0x51, 0x38, 0x10, + 0x21, 0x30, 0x21, 0x10, 0x2d, 0x34, 0x05, 0x20, 0x02, 0xcd, 0xcc, 0xcc, + 0x3d, 0x4c, 0x11, 0x1c, 0x1c, 0x03, 0x39, 0x42, 0x60, 0xe5, 0x3b, 0x0c, + 0x50, 0x22, 0x3d, 0x14, 0x11, 0x04, 0x30, 0x02, 0x3e, 0x33, 0x33, 0x33, + 0x7c, 0x21, 0x54, 0x41, 0x50, 0x41, 0x08, 0x2d, 0xa4, 0x0d, 0x11, 0xae, + 0x22, 0x41, 0x28, 0x2d, 0x00, 0x50, 0x3c, 0x01, 0x5c, 0x8f, 0x82, 0xb8, + 0x50, 0x2d, 0x2c, 0x51, 0x21, 0x04, 0x41, 0x44, 0x52, 0x4c, 0xa8, 0x1f, + 0xc8, 0x42, 0x8c, 0x05, 0x5e, 0x39, 0x68, 0x52, 0x20, 0x03, 0x3f, 0xf9, + 0x83, 0x01, 0x3d, 0x04, 0x2d, 0xcc, 0x50, 0x2d, 0x80, 0x50, 0x4f, 0xa8, + 0x61, 0x9c, 0x05, 0x2d, 0xa0, 0x50, 0x21, 0x14, 0x43, 0x05, 0x00, 0x14, + 0x3e, 0x58, 0xf4, 0x0f, 0x30, 0x07, 0x80, 0x3f, 0xec, 0x51, 0xb8, 0x3e, + 0xfe, 0xd4, 0x78, 0x88, 0x60, 0x02, 0x32, 0x00, 0xc8, 0x00, 0x28, 0x12, + 0xb4, 0x1f, 0x2c, 0x02, 0x58, 0xca, 0x7e, 0x40, 0xb8, 0x50, 0x1f, 0xcd, + 0xac, 0xac, 0x51, 0x3f, 0x00, 0xc0, 0xa8, 0x51, 0x10, 0x09, 0x3d, 0x0a, + 0x57, 0x3f, 0x85, 0xeb, 0x51, 0x3f, 0xf6, 0x28, 0x5c, 0x88, 0x2c, 0x03, + 0xcc, 0x3d, 0x9a, 0x99, 0x19, 0xbc, 0x51, 0x11, 0x04, 0x32, 0xa0, 0x9c, + 0x21, 0x88, 0x21, 0xac, 0x25, 0x68, 0x21, 0x63, 0x2d, 0xb8, 0x50, 0x2d, + 0x18, 0x19, 0x2d, 0x90, 0x16, 0x60, 0x03, 0x40, 0x42, 0x0f, 0x00, 0x32, + 0x14, 0x11, 0x24, 0x1c, 0x02, 0x55, 0x55, 0xd5, 0xb9, 0x46, 0x0e, 0x50, + 0x02, 0x43, 0x00, 0x00, 0x96, 0x04, 0x4c, 0x0a, 0xc8, 0x43, 0x6b, 0x3c, + 0x01, 0x14, 0x14, 0x0a, 0xa0, 0xa0, 0xac, 0x0d, 0x68, 0x06, 0x21, 0x30, + 0x4e, 0x04, 0xfe, 0x0f, 0x1d, 0xb5, 0x15, 0x23, 0x4e, 0x0e, 0xb6, 0x6d, + 0xbe, 0x10, 0x16, 0x08, 0xce, 0x32, 0x03, 0x66, 0x3d, 0xdf, 0x10, 0x1c, + 0x04, 0x00, 0x06, 0x4b, 0xe9, 0x03, 0xa4, 0xc4, 0x13, 0x20, 0x02, 0x0f, + 0x0f, 0xd3, 0xd3, 0x76, 0x2d, 0x2f, 0x10, 0x33, 0x23, 0x01, 0x70, 0x12, + 0x10, 0x45, 0x1c, 0x0b, 0x04, 0xa0, 0xf0, 0xf4, 0x01, 0x04, 0x04, 0x02, + 0x3f, 0x03, 0x44, 0x14, 0x13, 0x67, 0x1a, 0x5e, 0x50, 0xc5, 0x16, 0x1f, + 0x00, 0x20, 0x4f, 0x10, 0x1a, 0x02, 0x48, 0x10, 0x03, 0x47, 0x80, 0xd0, + 0x42, 0x05, 0x2e, 0x10, 0x03, 0xc8, 0x00, 0x28, 0x0f, 0x0a, 0x40, 0x42, + 0x06, 0xbc, 0x4e, 0x0a, 0xa8, 0x51, 0x3c, 0x08, 0x3c, 0x03, 0x19, 0x80, + 0xb0, 0xaa, 0x00, 0x52, 0x00, 0x8a, 0x20, 0x52, 0x4c, 0x03, 0x06, 0x19, + 0xf3, 0x4e, 0x6a, 0x80, 0x10, 0x5d, 0xc8, 0x51, 0xf3, 0x07, 0x7d, 0x00, + 0x01, 0xfd, 0x1f, 0x0b, 0x07, 0xfe, 0x15, 0x01, 0x91, 0x11, 0xde, 0x01, + 0x58, 0x18, 0x1d, 0x4c, 0x10, 0x14, 0x06, 0x02, 0x0a, 0x32, 0x32, 0x04, + 0x5c, 0x8f, 0x42, 0xac, 0x10, 0x02, 0xff, 0xff, 0x04, 0x02, 0xc6, 0x1d, + 0x30, 0x18, 0x11, 0xdb, 0x1c, 0x01, 0x19, 0x19, 0x09, 0x4b, 0x03, 0x1d, + 0xdc, 0x17, 0x2d, 0xb3, 0x17, 0x1d, 0xd5, 0x16, 0x13, 0x0f, 0x64, 0xb6, + 0x2c, 0x08, 0x01, 0x14, 0x0f, 0x3f, 0x06, 0x14, 0x00, 0x05, 0x06, 0x0a, + 0xca, 0x07, 0x44, 0x03, 0x06, 0x00, 0x01, 0x19, 0x04, 0x37, 0x4c, 0x03, + 0x00, 0x01, 0x23, 0x26, 0x00, 0x48, 0x03, 0x63, 0x0a, 0x00, 0xbf, 0x1c, + 0x03, 0x3f, 0x04, 0x05, 0x34, 0x3a, 0x6a, 0x1d, 0x1b, 0x27, 0x32, 0x7c, + 0x13, 0x3e, 0x64, 0x19, 0x40, 0x06, 0x07, 0x01, 0xd8, 0x46, 0x10, 0x0f, + 0x00, 0x04, 0x87, 0x12, 0x10, 0x72, 0xfc, 0x01, 0xff, 0x07, 0x01, 0x05, + 0xf7, 0x07, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xff, 0x01, 0xf1, 0xf2, 0x01, 0x2d, 0xd3, 0x30, 0x2d, 0x0c, 0x32, 0x9e, + 0x59, 0xdb, 0x30, 0x21, 0x10, 0x52, 0x5a, 0x10, 0x61, 0x20, 0xd2, 0x61, + 0x10, 0x92, 0x62, 0x10, 0x2d, 0x78, 0x33, 0xd2, 0x69, 0x20, 0xd2, 0x6a, + 0x10, 0xd2, 0x03, 0x10, 0xd2, 0x04, 0x10, 0xd2, 0x05, 0x10, 0xd2, 0x06, + 0x10, 0xd2, 0x07, 0x10, 0xd2, 0x08, 0x10, 0xd2, 0x09, 0x10, 0x52, 0x0a, + 0x10, 0xad, 0xf0, 0x49, 0x83, 0x06, 0x00, 0x01, 0x92, 0x0f, 0x0c, 0xad, + 0x1a, 0x47, 0xad, 0xe1, 0x85, 0x92, 0x0e, 0x0c, 0xad, 0x5c, 0x4d, 0x92, + 0x0a, 0x0c, 0xad, 0x21, 0x86, 0x2d, 0xca, 0x33, 0x30, 0x01, 0x20, 0xaa, + 0x44, 0xec, 0x30, 0x01, 0x80, 0x8d, 0x5b, 0x04, 0x70, 0x01, 0x60, 0x56, + 0x6c, 0x22, 0x33, 0x04, 0x03, 0x01, 0x31, 0x10, 0x83, 0x01, 0x00, 0x04, + 0x2d, 0x88, 0x3a, 0x2d, 0xa8, 0x4c, 0x2d, 0x38, 0x4a, 0x2d, 0x4c, 0x4a, + 0x12, 0x02, 0x23, 0xde, 0x78, 0x96, 0x46, 0x21, 0x36, 0x3c, 0x06, 0xb4, + 0xa2, 0x04, 0x38, 0x00, 0x00, 0x48, 0x43, 0x14, 0x85, 0x40, 0x09, 0x35, + 0xa3, 0x30, 0x00, 0x1f, 0x8f, 0x2c, 0x00, 0x12, 0x64, 0x2c, 0x2a, 0x12, + 0x92, 0x3f, 0x52, 0x42, 0xcd, 0x21, 0x21, 0x11, 0x8f, 0x47, 0x60, 0xea, + 0x59, 0x2c, 0x08, 0x40, 0x4b, 0x4c, 0x00, 0x18, 0xfc, 0xff, 0xff, 0x0c, + 0xfe, 0x25, 0x33, 0x5d, 0x56, 0x34, 0xbd, 0x8a, 0x33, 0x5d, 0xd2, 0x3a, + 0x52, 0x02, 0x3b, 0xf0, 0x01, 0xff, 0x00, 0x04, 0x00, 0x01, 0xf1, 0x8e, + 0x01, 0x55, 0xc1, 0x1d, 0x6f, 0x45, 0x11, 0x08, 0x4e, 0x08, 0x60, 0x36, + 0x2d, 0x1c, 0x38, 0x32, 0x80, 0x17, 0x2f, 0x60, 0x42, 0x94, 0x45, 0xf5, + 0x0d, 0xd4, 0x83, 0x80, 0xbf, 0x20, 0x8d, 0x28, 0x38, 0x81, 0x08, 0xf3, + 0x0b, 0x80, 0xbf, 0x40, 0x5d, 0xf8, 0x37, 0x6e, 0x3d, 0x9c, 0x87, 0x2d, + 0x38, 0x38, 0x21, 0x04, 0x20, 0x02, 0x65, 0x4a, 0xf6, 0x2c, 0x04, 0x20, + 0x02, 0x95, 0x95, 0xe6, 0x25, 0x04, 0x20, 0x02, 0xaa, 0x77, 0x38, 0x24, + 0x04, 0x11, 0x9e, 0x42, 0x41, 0x04, 0x33, 0x7a, 0x44, 0x04, 0x2d, 0xec, + 0x88, 0x11, 0x04, 0x2d, 0x78, 0x38, 0x6d, 0x68, 0x37, 0x21, 0x48, 0x8c, + 0x05, 0xdc, 0x24, 0xb4, 0x29, 0xcd, 0xcc, 0x8c, 0xc4, 0x38, 0x70, 0x01, + 0x24, 0x74, 0x49, 0x04, 0xf1, 0x08, 0x01, 0x4d, 0xf8, 0x38, 0x6d, 0x74, + 0x88, 0x20, 0x02, 0x5f, 0x70, 0x09, 0x31, 0x04, 0x61, 0x8c, 0x11, 0x80, + 0x22, 0x23, 0x04, 0x20, 0x02, 0x4a, 0x1e, 0xec, 0x1f, 0x04, 0x61, 0x30, + 0x2d, 0x70, 0x38, 0x41, 0x04, 0x41, 0x94, 0x6d, 0xa4, 0x8a, 0x2d, 0x8c, + 0x89, 0x21, 0x98, 0x40, 0x02, 0x8c, 0x05, 0xb2, 0x2a, 0x8c, 0x23, 0x48, + 0x42, 0xec, 0x1c, 0x01, 0x20, 0x63, 0x4a, 0x6f, 0x36, 0x4f, 0x80, 0x41, + 0xc0, 0x38, 0x2c, 0x04, 0xa6, 0x3f, 0x93, 0x1a, 0x5a, 0x37, 0xb0, 0x38, + 0x11, 0x98, 0x3d, 0xe0, 0x89, 0x2c, 0x06, 0x68, 0x52, 0x84, 0x38, 0x8f, + 0xc2, 0x75, 0x3f, 0xd8, 0x03, 0x2d, 0x86, 0x36, 0x2d, 0x00, 0x39, 0x50, + 0x02, 0xf7, 0xe4, 0xa1, 0x3e, 0x38, 0x22, 0x3f, 0x24, 0x2d, 0x69, 0x03, + 0x2d, 0xdc, 0x03, 0x47, 0xf4, 0x01, 0xb4, 0x20, 0x02, 0xb4, 0x62, 0x5b, + 0x2f, 0x18, 0x21, 0x30, 0x3d, 0xd8, 0x88, 0x1c, 0x04, 0x07, 0x04, 0x02, + 0xef, 0x38, 0x35, 0x90, 0x38, 0x3f, 0xb4, 0x3f, 0x78, 0x04, 0x1d, 0x0c, + 0x89, 0x2c, 0x02, 0x00, 0xa4, 0x93, 0xd6, 0x28, 0x38, 0x60, 0x06, 0xc0, + 0xe1, 0xe4, 0x00, 0x80, 0xd1, 0xf0, 0x08, 0x20, 0x61, 0x08, 0x61, 0x50, + 0x2d, 0x58, 0x04, 0x30, 0x01, 0x05, 0x01, 0x14, 0x0c, 0x2d, 0x07, 0x04, + 0x43, 0x32, 0x00, 0x08, 0xaf, 0x01, 0x00, 0xf8, 0x50, 0xbd, 0x24, 0x3a, + 0x85, 0x68, 0x41, 0x14, 0x91, 0x10, 0x93, 0x00, 0xbf, 0x28, 0x11, 0x01, + 0xb9, 0x1c, 0xd1, 0x18, 0x3e, 0x0f, 0x5f, 0x05, 0x2d, 0x00, 0x05, 0x21, + 0xd4, 0x21, 0x88, 0x21, 0x04, 0x52, 0x64, 0x78, 0x31, 0x84, 0x1e, 0x01, + 0xb3, 0x37, 0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0xc2, 0x6e, 0x2e, 0x00, 0x00, 0x04, 0x21, + 0x6d, 0x02, 0x00, 0x02, 0x5d, 0xc1, 0x02, 0x02, 0x5d, 0xc1, 0x02, 0x02, + 0x5d, 0xc1, 0x02, 0x02, 0x5d, 0xc1, 0x02, 0x02, 0x5d, 0xc1, 0x02, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x8d, 0x45, 0x03, 0x02, 0xc5, 0x02, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x35, 0x45, 0x03, 0x02, 0xc5, 0xea, 0x02, 0x02, + 0x9d, 0x92, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xaf, 0x92, 0x04, 0x02, + 0x3f, 0xb1, 0x01, 0x02, 0x53, 0xb1, 0x01, 0x02, 0x6d, 0xb1, 0x01, 0x02, + 0x81, 0xb1, 0x01, 0x02, 0x95, 0xb1, 0x01, 0x02, 0xa9, 0xb1, 0x01, 0x02, + 0xbb, 0xb1, 0x01, 0x02, 0xcd, 0xb1, 0x01, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xaf, 0x9c, 0x01, 0x02, 0xb3, 0x9c, 0x01, 0x02, 0xb7, 0x9c, 0x01, 0x02, + 0xbb, 0x9c, 0x01, 0x02, 0xbf, 0x9c, 0x01, 0x02, 0xc3, 0x9c, 0x01, 0x02, + 0xc7, 0x9c, 0x01, 0x02, 0xcb, 0x9c, 0x01, 0x02, 0xcf, 0x9c, 0x01, 0x02, + 0xd3, 0x9c, 0x01, 0x02, 0xd7, 0x9c, 0x01, 0x02, 0xdb, 0x9c, 0x01, 0x02, + 0xdf, 0x9c, 0x01, 0x02, 0xe3, 0x9c, 0x01, 0x02, 0xe7, 0x9c, 0x01, 0x02, + 0xeb, 0x9c, 0x01, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0x6b, 0x75, 0x01, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xd1, 0x75, 0x01, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xf7, 0x19, 0x03, 0x02, 0x75, 0x1d, 0x03, 0x02, 0x79, 0x1d, 0x03, 0x02, + 0x7d, 0x1d, 0x03, 0x02, 0x81, 0x1d, 0x03, 0x02, 0x85, 0x1d, 0x03, 0x02, + 0x89, 0x1d, 0x03, 0x02, 0x8d, 0x1d, 0x03, 0x02, 0x91, 0x1d, 0x03, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xfd, 0x9f, 0x01, 0x02, 0x0f, 0xa0, 0x01, 0x02, + 0x25, 0xa0, 0x01, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xcd, 0x8c, 0x03, 0x02, + 0xd1, 0x8c, 0x03, 0x02, 0x7d, 0x92, 0x03, 0x02, 0x81, 0x92, 0x03, 0x02, + 0x85, 0x92, 0x03, 0x02, 0x89, 0x92, 0x03, 0x02, 0x49, 0xe9, 0x02, 0x02, + 0x6d, 0xe9, 0x02, 0x02, 0xdd, 0x03, 0x00, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0x89, 0x8f, 0x03, 0x02, 0x8d, 0x8f, 0x03, 0x02, + 0x91, 0x8f, 0x03, 0x02, 0x95, 0x8f, 0x03, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xdf, 0xb1, 0x01, 0x02, + 0x15, 0xb2, 0x01, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xf1, 0xb1, 0x01, 0x02, 0x27, 0xb2, 0x01, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0x03, 0xb2, 0x01, 0x02, 0x39, 0xb2, 0x01, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0x09, 0xcc, 0x03, 0x02, 0x2b, 0xcc, 0x03, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, 0xb1, 0x9e, 0x04, 0x02, + 0xc5, 0x92, 0x04, 0x02, 0x80, 0xb5, 0x0e, 0xf0, 0x69, 0xfa, 0x0e, 0xf0, + 0x5c, 0xfc, 0x2c, 0xf0, 0x03, 0xfe, 0x2c, 0xf0, 0x0b, 0xfe, 0x0e, 0x48, + 0x41, 0x68, 0x00, 0x68, 0x81, 0x42, 0x10, 0xd1, 0x0c, 0x48, 0x0d, 0x49, + 0x01, 0x60, 0xc2, 0x69, 0x42, 0xf4, 0xe0, 0x22, 0xc2, 0x61, 0xaf, 0xf3, + 0x00, 0x80, 0x49, 0xf0, 0x2b, 0xf9, 0x31, 0xf0, 0xfc, 0xfb, 0xbd, 0xe8, + 0x01, 0x40, 0x49, 0xf0, 0x1b, 0xbc, 0x0e, 0xf0, 0x52, 0xfa, 0x04, 0x21, + 0x1c, 0xf0, 0xbd, 0xfe, 0x30, 0xbf, 0xfd, 0xe7, 0xf8, 0x73, 0x03, 0x21, + 0x08, 0xed, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x02, 0xfe, 0xe7, 0x00, 0x00, + 0xb5, 0xee, 0xc0, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x02, 0xd4, 0xb1, 0xee, + 0xc0, 0x0a, 0x70, 0x47, 0x6f, 0xf0, 0x00, 0x4c, 0x00, 0xee, 0x10, 0xca, + 0xaf, 0xf3, 0x00, 0x80, 0x70, 0x47, 0x82, 0xb0, 0xf1, 0xee, 0x60, 0x0a, + 0x8d, 0xed, 0x00, 0x0a, 0xcd, 0xed, 0x01, 0x0a, 0x02, 0xb0, 0x70, 0x47, + 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0xf0, 0xee, 0x41, 0x0a, + 0xb0, 0xee, 0x61, 0x0a, 0x3b, 0xf0, 0xfe, 0xb9, 0x3b, 0xf0, 0x31, 0xba, + 0x08, 0x4a, 0x52, 0xf8, 0x20, 0x00, 0x00, 0xf5, 0xc8, 0x70, 0xef, 0xf3, + 0x10, 0x82, 0x72, 0xb6, 0x03, 0x68, 0x9b, 0x08, 0x01, 0xf0, 0x03, 0x01, + 0x41, 0xea, 0x83, 0x01, 0x01, 0x60, 0x82, 0xf3, 0x10, 0x88, 0x70, 0x47, + 0x80, 0x98, 0x04, 0x02, 0x5b, 0x45, 0x20, 0x20, 0x25, 0x30, 0x32, 0x58, + 0x20, 0x25, 0x58, 0x5d, 0x20, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x40, 0x02, 0x21, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x20, 0x33, 0x02, 0x21, + 0xf0, 0x72, 0x04, 0x02, 0x00, 0x44, 0x00, 0x21, 0x34, 0x75, 0x02, 0x21, + 0xe4, 0x70, 0x02, 0x21, 0x50, 0x76, 0x02, 0x21, 0x18, 0x8e, 0x04, 0x02, + 0xf0, 0x65, 0x02, 0x21, 0x24, 0x73, 0x03, 0x21, 0xf8, 0x73, 0x03, 0x21, + 0x74, 0x28, 0x02, 0x21, 0x70, 0x47, 0xff, 0xff, 0x44, 0x5d, 0x03, 0x21, + 0x70, 0x47, 0xff, 0xff, 0xd8, 0x34, 0x03, 0x21, 0x10, 0xb5, 0x04, 0x46, + 0x10, 0x46, 0x0a, 0x46, 0x01, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x20, 0xf8, + 0x20, 0x46, 0x10, 0xbd, 0x30, 0xb4, 0x00, 0x25, 0x13, 0xe0, 0x50, 0xf8, + 0x04, 0x2b, 0xd3, 0x07, 0x44, 0xbf, 0xa9, 0xf1, 0x01, 0x03, 0x9a, 0x18, + 0x09, 0x1f, 0x04, 0x29, 0x42, 0xf8, 0x04, 0x5b, 0xfa, 0xd2, 0x13, 0x46, + 0x8c, 0x07, 0x44, 0xbf, 0x15, 0x80, 0x9b, 0x1c, 0xc9, 0x07, 0x48, 0xbf, + 0x1d, 0x70, 0x50, 0xf8, 0x04, 0x1b, 0x00, 0x29, 0xe7, 0xd1, 0x30, 0xbc, + 0x70, 0x47, 0x00, 0x00, 0x40, 0x18, 0x49, 0x1c, 0x1c, 0xbf, 0xb1, 0xf1, + 0x01, 0x01, 0x00, 0xf8, 0x01, 0x2d, 0xf9, 0xd1, 0x70, 0x47, 0x00, 0x00, + 0x10, 0xee, 0x10, 0x0a, 0xf4, 0x46, 0x00, 0xf0, 0x03, 0xf8, 0x00, 0xee, + 0x10, 0x0a, 0x60, 0x47, 0xc0, 0xf3, 0xc7, 0x52, 0x7e, 0x3a, 0x09, 0xdd, + 0x18, 0x2a, 0x0e, 0xda, 0x6f, 0xf0, 0x7f, 0x41, 0xd1, 0x40, 0x00, 0x42, + 0x48, 0xbf, 0x40, 0x18, 0x88, 0x43, 0x70, 0x47, 0xc0, 0x42, 0x1c, 0xbf, + 0x00, 0x20, 0xcb, 0xf6, 0x80, 0x70, 0x38, 0xbf, 0x00, 0x20, 0x70, 0x47, + 0x01, 0x46, 0x00, 0x20, 0x0a, 0x7b, 0x09, 0x2a, 0xba, 0xbf, 0x49, 0x7b, + 0x09, 0x29, 0x4b, 0xf2, 0x03, 0x00, 0x70, 0x47, 0x01, 0x46, 0x00, 0x20, + 0x89, 0x68, 0x40, 0xf2, 0x69, 0x12, 0x91, 0x42, 0x28, 0xbf, 0x4b, 0xf2, + 0x02, 0x00, 0x70, 0x47, 0x02, 0x46, 0x00, 0x20, 0xca, 0x42, 0xac, 0xbf, + 0x91, 0x42, 0x4b, 0xf2, 0x01, 0x00, 0x70, 0x47, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x1b, 0x03, 0x21, 0xdc, 0x3e, 0x00, 0x21, + 0x34, 0x3e, 0x00, 0x21, 0x40, 0x58, 0x03, 0x21, 0x1c, 0x3e, 0x00, 0x21, + 0xbc, 0x3d, 0x00, 0x21, 0x10, 0x4f, 0x03, 0x21, 0xf8, 0x3f, 0x00, 0x21, + 0xbc, 0x3d, 0x00, 0x21, 0x01, 0x46, 0x6f, 0xf0, 0x7f, 0x03, 0x99, 0x42, + 0x08, 0xbf, 0x7f, 0x20, 0x03, 0xd0, 0x00, 0x29, 0x44, 0xbf, 0x49, 0x42, + 0x08, 0x46, 0xc0, 0xb2, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0xf0, 0xee, + 0xc0, 0x0a, 0x9f, 0xed, 0xb4, 0x1a, 0xf4, 0xee, 0x41, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x2d, 0xed, 0x02, 0x8b, 0x48, 0xbf, 0xb7, 0xee, 0x00, 0x0a, + 0x09, 0xd4, 0xdf, 0xed, 0xb3, 0x0a, 0x20, 0xee, 0x20, 0x8a, 0xb0, 0xee, + 0x48, 0x0a, 0x00, 0xf0, 0xc7, 0xfd, 0x80, 0xee, 0x08, 0x0a, 0xbd, 0xec, + 0x02, 0x8b, 0x01, 0xbd, 0xf8, 0xb5, 0x0d, 0x46, 0x04, 0x46, 0x16, 0x46, + 0x1f, 0x46, 0x01, 0x21, 0x0d, 0xf0, 0x83, 0xfa, 0x01, 0x21, 0x20, 0x46, + 0x0d, 0xf0, 0x2d, 0xf9, 0x2a, 0x46, 0x31, 0x46, 0x20, 0x46, 0x0d, 0xf0, + 0x2a, 0xf9, 0x20, 0x46, 0x0d, 0xf0, 0x32, 0xf9, 0x01, 0x2f, 0x20, 0x46, + 0x02, 0xd1, 0x0d, 0xf0, 0x4a, 0xf9, 0x01, 0xe0, 0x0d, 0xf0, 0x38, 0xf9, + 0x20, 0x46, 0x0d, 0xf0, 0x53, 0xf9, 0x05, 0x46, 0x00, 0x21, 0x20, 0x46, + 0x0d, 0xf0, 0x15, 0xf9, 0x00, 0x21, 0x20, 0x46, 0x0d, 0xf0, 0x63, 0xfa, + 0x28, 0x46, 0xf2, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, 0x2d, 0xed, 0x02, 0x8b, + 0x04, 0x46, 0x9d, 0xf9, 0x28, 0x80, 0x0d, 0x46, 0x16, 0x46, 0x99, 0x46, + 0x9f, 0xed, 0xa0, 0x8a, 0x00, 0x27, 0x0f, 0xe0, 0x4b, 0x46, 0x32, 0x46, + 0x29, 0x46, 0x20, 0x46, 0xff, 0xf7, 0xc2, 0xff, 0x00, 0xee, 0x10, 0x0a, + 0xb8, 0xee, 0x40, 0x0a, 0x30, 0xee, 0x08, 0x8a, 0x20, 0x46, 0x0d, 0xf0, + 0x40, 0xfa, 0x7f, 0x1c, 0x78, 0xb2, 0x40, 0x45, 0xec, 0xdb, 0x00, 0xee, + 0x10, 0x8a, 0xb8, 0xee, 0xc0, 0x0a, 0x88, 0xee, 0x00, 0x0a, 0xf6, 0xee, + 0x00, 0x0a, 0x00, 0xf0, 0x98, 0xf9, 0xbd, 0xec, 0x02, 0x8b, 0x80, 0xb2, + 0xbd, 0xe8, 0xf2, 0x83, 0xdf, 0xf8, 0x38, 0x24, 0x51, 0x60, 0x10, 0x60, + 0x70, 0x47, 0xdf, 0xf8, 0x34, 0x24, 0x07, 0xe0, 0xdf, 0xf8, 0x30, 0x34, + 0x18, 0x60, 0x59, 0x60, 0x9a, 0x60, 0x70, 0x47, 0xdf, 0xf8, 0x28, 0x24, + 0x10, 0x60, 0x51, 0x60, 0x70, 0x47, 0xdf, 0xf8, 0x14, 0x14, 0x49, 0x68, + 0x00, 0x29, 0x18, 0xbf, 0x08, 0x47, 0x70, 0x47, 0xdf, 0xf8, 0x04, 0x14, + 0x09, 0x68, 0x00, 0x29, 0x18, 0xbf, 0x08, 0x47, 0x70, 0x47, 0xdf, 0xf8, + 0xfc, 0x23, 0x11, 0x68, 0x00, 0x20, 0x00, 0x29, 0x1c, 0xbf, 0x52, 0x68, + 0x00, 0x2a, 0x03, 0xd0, 0x12, 0x78, 0x00, 0x2a, 0x18, 0xbf, 0x08, 0x47, + 0x70, 0x47, 0x00, 0x00, 0xf8, 0xb5, 0x0e, 0x46, 0x15, 0x46, 0x06, 0x99, + 0x07, 0x9c, 0x9d, 0xf9, 0x28, 0x20, 0x00, 0x92, 0x1f, 0x46, 0x01, 0x23, + 0x3a, 0x46, 0xff, 0xf7, 0x93, 0xff, 0x01, 0x2c, 0x0c, 0xbf, 0x45, 0x1b, + 0x2d, 0x1a, 0x00, 0xee, 0x10, 0x5a, 0x00, 0xee, 0x90, 0x7a, 0xb8, 0xee, + 0xc0, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x08, 0x99, 0x09, 0x98, 0x02, 0x2e, + 0x80, 0xee, 0x20, 0x0a, 0x07, 0xd1, 0xdf, 0xed, 0x67, 0x0a, 0x00, 0xf0, + 0x18, 0xf8, 0xa0, 0xb1, 0xdf, 0xed, 0x65, 0x0a, 0x08, 0xe0, 0x01, 0x2e, + 0x0f, 0xd1, 0xdf, 0xed, 0x64, 0x0a, 0x00, 0xf0, 0x0e, 0xf8, 0x50, 0xb1, + 0xdf, 0xed, 0x62, 0x0a, 0xb6, 0xee, 0x00, 0x1a, 0x00, 0xee, 0x20, 0x1a, + 0xbd, 0xee, 0xc1, 0x0a, 0x10, 0xee, 0x10, 0x1a, 0x01, 0x80, 0x28, 0x46, + 0xf2, 0xbd, 0xb6, 0xee, 0x00, 0x1a, 0x00, 0xee, 0x20, 0x1a, 0xbd, 0xee, + 0xc1, 0x1a, 0x11, 0xee, 0x10, 0x2a, 0x0a, 0x70, 0x70, 0x47, 0x30, 0xb5, + 0x49, 0x1c, 0xc9, 0xb2, 0x00, 0x22, 0x00, 0x23, 0x02, 0xe0, 0x04, 0x57, + 0x12, 0x19, 0x5b, 0x1c, 0xdc, 0xb2, 0x8c, 0x42, 0xf9, 0xdb, 0x4d, 0x08, + 0x92, 0xfb, 0xf1, 0xf3, 0x01, 0xfb, 0x13, 0x21, 0x18, 0x46, 0x8d, 0x42, + 0xb8, 0xbf, 0x40, 0x1c, 0xc0, 0xb2, 0x30, 0xbd, 0x38, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x00, 0x22, 0x0c, 0xf0, 0xe4, 0xff, 0x01, 0x22, 0x29, 0x46, + 0x20, 0x46, 0x0c, 0xf0, 0xdf, 0xff, 0x00, 0x22, 0x29, 0x46, 0x20, 0x46, + 0x0d, 0xf0, 0x0b, 0xf8, 0x29, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0x38, 0x40, + 0x01, 0x22, 0x0d, 0xf0, 0x04, 0xb8, 0x0b, 0x46, 0x11, 0x46, 0x01, 0x28, + 0x08, 0xbf, 0xff, 0x21, 0x18, 0x46, 0x0d, 0xf0, 0xe7, 0xb8, 0x00, 0x00, + 0xba, 0x49, 0x89, 0x68, 0x41, 0x60, 0x71, 0xb1, 0x00, 0xee, 0x90, 0x1a, + 0x90, 0xed, 0x00, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x9f, 0xed, 0xb1, 0x1a, + 0xb8, 0xee, 0x40, 0x0a, 0x80, 0xee, 0x81, 0x1a, 0x80, 0xee, 0x01, 0x0a, + 0x01, 0xe0, 0x9f, 0xed, 0x2e, 0x0a, 0x80, 0xed, 0x03, 0x0a, 0x70, 0x47, + 0x1f, 0xb5, 0x00, 0xf0, 0x19, 0xf8, 0x09, 0x68, 0x29, 0xb1, 0x02, 0xa8, + 0x88, 0x47, 0xdd, 0xe9, 0x02, 0x23, 0xcd, 0xe9, 0x00, 0x23, 0x0a, 0xe0, + 0x1f, 0xb5, 0x00, 0xf0, 0x0d, 0xf8, 0x49, 0x68, 0x29, 0xb1, 0x02, 0xa8, + 0x88, 0x47, 0xdd, 0xe9, 0x02, 0x23, 0xcd, 0xe9, 0x00, 0x23, 0xdd, 0xe9, + 0x00, 0x01, 0xc4, 0xe9, 0x00, 0x01, 0x1f, 0xbd, 0x00, 0x21, 0xcd, 0xe9, + 0x00, 0x11, 0x04, 0x46, 0x9e, 0x49, 0x70, 0x47, 0x9e, 0x49, 0x0a, 0x68, + 0x49, 0x68, 0x12, 0xb1, 0x00, 0x23, 0x42, 0xf8, 0x20, 0x30, 0x11, 0xb1, + 0x00, 0x22, 0x41, 0xf8, 0x20, 0x20, 0x70, 0x47, 0x02, 0x46, 0x98, 0x48, + 0x01, 0x68, 0x04, 0xe0, 0x0a, 0xd7, 0x23, 0x3c, 0x02, 0x46, 0x95, 0x48, + 0x41, 0x68, 0x00, 0x20, 0x09, 0xb1, 0x51, 0xf8, 0x22, 0x00, 0x70, 0x47, + 0xdb, 0x0f, 0x49, 0x40, 0x30, 0xb5, 0x90, 0x4b, 0x1c, 0x68, 0x5b, 0x68, + 0x24, 0xb1, 0x54, 0xf8, 0x20, 0x50, 0x49, 0x19, 0x44, 0xf8, 0x20, 0x10, + 0x63, 0xb1, 0x00, 0x2a, 0x03, 0xdd, 0x53, 0xf8, 0x20, 0x10, 0x52, 0x18, + 0x04, 0xe0, 0x05, 0xd5, 0x53, 0xf8, 0x20, 0x10, 0x52, 0x42, 0x8a, 0x1a, + 0x43, 0xf8, 0x20, 0x20, 0x30, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x42, 0x00, 0x00, 0x20, 0x44, 0x00, 0x00, 0x00, 0x42, + 0x00, 0x00, 0xa0, 0x43, 0x10, 0xb5, 0x0a, 0x70, 0x01, 0x2a, 0x0c, 0xbf, + 0x4c, 0x1d, 0x4c, 0x1c, 0x01, 0x22, 0xe2, 0x70, 0x00, 0xf0, 0x03, 0xf8, + 0x00, 0x22, 0xe2, 0x70, 0x10, 0xbd, 0xfe, 0xb5, 0x0f, 0x46, 0x69, 0x46, + 0x0d, 0xf0, 0xce, 0xf9, 0x3a, 0x78, 0xff, 0x25, 0x00, 0x26, 0x01, 0x2a, + 0x0c, 0xbf, 0x79, 0x1d, 0x79, 0x1c, 0xc8, 0x78, 0x9d, 0xf8, 0x07, 0x30, + 0x00, 0x28, 0x14, 0xbf, 0x18, 0x46, 0x08, 0x78, 0x8d, 0xf8, 0x08, 0x00, + 0xc8, 0x78, 0x00, 0xb9, 0x4b, 0x78, 0x8d, 0xf8, 0x09, 0x30, 0x00, 0x20, + 0xc3, 0xb2, 0x1d, 0xf8, 0x03, 0x30, 0x60, 0x2b, 0x0e, 0xd2, 0xb3, 0x42, + 0x28, 0xbf, 0x1e, 0x46, 0xab, 0x42, 0x98, 0xbf, 0x1d, 0x46, 0x40, 0x1c, + 0xc3, 0xb2, 0x0a, 0x2b, 0xf0, 0xd3, 0x0d, 0x70, 0x4e, 0x70, 0x75, 0x1b, + 0x8d, 0x70, 0xf7, 0xbd, 0x00, 0x26, 0x00, 0x23, 0xff, 0x25, 0xd8, 0xb2, + 0x1d, 0xf8, 0x00, 0x00, 0x20, 0x28, 0x38, 0xbf, 0x80, 0x38, 0xc4, 0xb2, + 0xc0, 0xb2, 0xb4, 0x42, 0x38, 0xbf, 0x34, 0x46, 0xa8, 0x42, 0x88, 0xbf, + 0x28, 0x46, 0x05, 0x46, 0x5b, 0x1c, 0xd8, 0xb2, 0x0a, 0x28, 0x26, 0x46, + 0xeb, 0xd3, 0xe2, 0xe7, 0x10, 0xb5, 0x0c, 0x46, 0x00, 0x21, 0x21, 0x60, + 0x0d, 0xf0, 0xd7, 0xf8, 0xb5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0xcc, 0xbf, 0xf6, 0xee, 0x00, 0x0a, 0xfe, 0xee, 0x00, 0x0a, 0x00, 0xf0, + 0x08, 0xf8, 0x01, 0xb2, 0x37, 0x31, 0xc9, 0x29, 0x24, 0xbf, 0x08, 0x21, + 0x21, 0x60, 0x00, 0xb2, 0x10, 0xbd, 0x30, 0xee, 0x20, 0x0a, 0xbd, 0xee, + 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x70, 0x47, 0x3e, 0xb5, 0x92, 0x6b, + 0x02, 0xf2, 0x7f, 0x12, 0x93, 0x78, 0x02, 0x93, 0x92, 0xf9, 0x04, 0x40, + 0x01, 0x94, 0x92, 0xf9, 0x03, 0x50, 0x00, 0x95, 0x53, 0x78, 0x12, 0x78, + 0x00, 0xf0, 0x02, 0xf8, 0x3e, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x47, + 0x2d, 0xed, 0x02, 0x8b, 0x80, 0x46, 0x9d, 0xf9, 0x28, 0x90, 0x16, 0x46, + 0x1c, 0x46, 0x9d, 0xf9, 0x2c, 0xa0, 0x0c, 0x9d, 0x00, 0xee, 0x90, 0x0a, + 0x48, 0x46, 0x01, 0xee, 0x10, 0x0a, 0x0f, 0x46, 0xf8, 0xee, 0xe0, 0x0a, + 0xb8, 0xee, 0xc1, 0x1a, 0x70, 0xee, 0xc1, 0x0a, 0xaa, 0xeb, 0x00, 0x01, + 0x20, 0x46, 0x01, 0xee, 0x90, 0x0a, 0x30, 0x46, 0x02, 0xee, 0x10, 0x0a, + 0xf8, 0xee, 0x61, 0x1a, 0xb8, 0xee, 0x42, 0x2a, 0x01, 0xee, 0x10, 0x1a, + 0x71, 0xee, 0xc2, 0x1a, 0xb7, 0xee, 0x00, 0x0a, 0xb8, 0xee, 0xc1, 0x1a, + 0x31, 0xee, 0x80, 0x0a, 0x81, 0xee, 0x00, 0x0a, 0x80, 0xee, 0x80, 0x8a, + 0xb0, 0xee, 0x48, 0x0a, 0xff, 0xf7, 0x4a, 0xfd, 0xf0, 0xee, 0x40, 0x8a, + 0xb0, 0xee, 0x48, 0x0a, 0x0d, 0xf0, 0xa0, 0xfb, 0xfd, 0xee, 0xe8, 0x0a, + 0x02, 0x2d, 0x10, 0xee, 0x90, 0x0a, 0x04, 0xd1, 0xb4, 0x42, 0x04, 0xd3, + 0xc8, 0x45, 0x08, 0xda, 0x0c, 0xe0, 0x00, 0x2d, 0xfa, 0xd0, 0xc8, 0x45, + 0x05, 0xdb, 0xd0, 0x45, 0x06, 0xda, 0x26, 0x1a, 0x04, 0xe0, 0xd0, 0x45, + 0x01, 0xdb, 0x66, 0xb2, 0x00, 0xe0, 0x36, 0x18, 0x67, 0xb9, 0x30, 0xee, + 0x48, 0x0a, 0xb0, 0xee, 0xc0, 0x0a, 0xdf, 0xed, 0x0b, 0x0a, 0xb4, 0xee, + 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, 0x4f, 0xf0, 0xff, 0x36, + 0xbd, 0xec, 0x02, 0x8b, 0x70, 0xb2, 0xbd, 0xe8, 0xf0, 0x87, 0x09, 0x49, + 0x08, 0x70, 0x70, 0x47, 0x07, 0x48, 0x00, 0x78, 0x70, 0x47, 0x00, 0x00, + 0x00, 0x24, 0x74, 0x49, 0xce, 0xcc, 0x4c, 0x3e, 0xc4, 0x75, 0x02, 0x21, + 0xbc, 0x75, 0x02, 0x21, 0xa8, 0x75, 0x02, 0x21, 0xcc, 0x75, 0x02, 0x21, + 0x44, 0x76, 0x02, 0x21, 0x80, 0xb5, 0x00, 0xee, 0x10, 0x2a, 0xf8, 0xee, + 0x40, 0x0a, 0x00, 0xee, 0x10, 0x1a, 0xb0, 0xf9, 0x00, 0x10, 0xb0, 0xf9, + 0x02, 0x20, 0xb0, 0xf9, 0x04, 0x00, 0xb8, 0xee, 0xc0, 0x1a, 0x00, 0xee, + 0x10, 0x1a, 0x01, 0xee, 0x90, 0x2a, 0x02, 0xee, 0x10, 0x0a, 0xb8, 0xee, + 0xc0, 0x0a, 0xf8, 0xee, 0xe1, 0x1a, 0xb8, 0xee, 0xc2, 0x2a, 0x80, 0xee, + 0x20, 0x0a, 0xc1, 0xee, 0xa0, 0x1a, 0xc2, 0xee, 0x20, 0x0a, 0x01, 0xee, + 0x81, 0x0a, 0x60, 0xee, 0x81, 0x0a, 0x00, 0xee, 0x81, 0x0a, 0xff, 0xf7, + 0xdb, 0xfc, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x00, 0xb2, + 0x02, 0xbd, 0x00, 0x20, 0x70, 0x47, 0x02, 0x78, 0x52, 0x1c, 0xd3, 0xb2, + 0x99, 0x42, 0x38, 0xbf, 0x00, 0x22, 0x02, 0x70, 0x70, 0x47, 0xf0, 0xb5, + 0x00, 0x22, 0xd4, 0x00, 0x00, 0x23, 0xe4, 0xb2, 0x00, 0x25, 0x54, 0xfa, + 0x85, 0xf6, 0x6d, 0x1c, 0x86, 0x5d, 0x9b, 0x19, 0xef, 0xb2, 0x08, 0x2f, + 0xf7, 0xd3, 0x1b, 0x1d, 0xdb, 0x08, 0x8b, 0x54, 0x52, 0x1c, 0x02, 0x2a, + 0xed, 0xd3, 0xf0, 0xbd, 0x70, 0xb5, 0x15, 0x46, 0x0c, 0x46, 0x00, 0x22, + 0x00, 0x26, 0xf1, 0xb2, 0x35, 0xf9, 0x11, 0x10, 0x01, 0xb1, 0x52, 0x1c, + 0x76, 0x1c, 0xf1, 0xb2, 0x03, 0x29, 0xf6, 0xd3, 0x04, 0x9e, 0x32, 0xb1, + 0x01, 0x46, 0x22, 0x46, 0x28, 0x46, 0xff, 0xf7, 0x9d, 0xff, 0x30, 0x80, + 0x70, 0xbd, 0x33, 0x80, 0x70, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, 0x09, 0x9d, + 0x0e, 0x46, 0x14, 0x46, 0x81, 0x46, 0x1f, 0x46, 0x00, 0x22, 0x29, 0x46, + 0x0d, 0xf0, 0x5e, 0xfa, 0x80, 0x46, 0x00, 0x2c, 0x12, 0xbf, 0x0f, 0x26, + 0x05, 0x20, 0x00, 0xfa, 0x06, 0xf6, 0x08, 0x9c, 0xf1, 0xb2, 0x48, 0x46, + 0x0c, 0xf0, 0x97, 0xfd, 0x0a, 0x20, 0xff, 0xf7, 0x71, 0xfd, 0x00, 0x22, + 0x29, 0x46, 0x48, 0x46, 0x0d, 0xf0, 0x4a, 0xfa, 0x40, 0xea, 0x08, 0x05, + 0x04, 0xb1, 0x26, 0x70, 0x17, 0xb1, 0x0a, 0x20, 0xff, 0xf7, 0x64, 0xfd, + 0x28, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0x41, 0x78, 0x00, 0x29, 0x0c, 0xbf, + 0x0a, 0x21, 0x05, 0x21, 0x81, 0x70, 0x41, 0x78, 0xc1, 0xf1, 0x01, 0x01, + 0x01, 0x71, 0x41, 0x78, 0x01, 0xb1, 0x01, 0x21, 0x81, 0x71, 0x41, 0x78, + 0x49, 0x1e, 0x89, 0x41, 0xc9, 0x0f, 0xc1, 0x71, 0x70, 0x47, 0x00, 0x00, + 0x2d, 0xe9, 0xf8, 0x43, 0x04, 0x46, 0x0d, 0xf0, 0xde, 0xfd, 0x07, 0x46, + 0x20, 0x46, 0x0e, 0xf0, 0x7b, 0xf8, 0x00, 0x25, 0x00, 0x26, 0x5f, 0xea, + 0x00, 0x08, 0x3b, 0xd1, 0x00, 0xf0, 0xbd, 0xf8, 0x01, 0x28, 0x0b, 0xd1, + 0xe8, 0xb2, 0x0e, 0xf0, 0x8f, 0xfd, 0xff, 0x28, 0x06, 0xd0, 0x00, 0x21, + 0xe8, 0xb2, 0x0e, 0xf0, 0x64, 0xfb, 0xe8, 0xb2, 0x0e, 0xf0, 0x1a, 0xfa, + 0x6d, 0x1c, 0xe8, 0xb2, 0x08, 0x28, 0xeb, 0xdb, 0x00, 0x25, 0xdf, 0xf8, + 0x20, 0x91, 0x00, 0xf0, 0xa6, 0xf8, 0x01, 0x28, 0x19, 0xd1, 0xe8, 0xb2, + 0x0e, 0xf0, 0x78, 0xfd, 0xff, 0x28, 0x14, 0xd0, 0xe8, 0xb2, 0x0e, 0xf0, + 0xe1, 0xf9, 0x04, 0x00, 0x04, 0xd1, 0xe8, 0xb2, 0x0e, 0xf0, 0x89, 0xf9, + 0x76, 0x1c, 0x07, 0xe0, 0x00, 0x97, 0x23, 0x46, 0x4a, 0x46, 0xb6, 0x21, + 0x01, 0x20, 0x0e, 0xf0, 0x5e, 0xfe, 0xa0, 0x46, 0xe8, 0xb2, 0x0e, 0xf0, + 0x12, 0xfa, 0xb0, 0xb2, 0x04, 0x28, 0x03, 0xd2, 0x6d, 0x1c, 0xe8, 0xb2, + 0x08, 0x28, 0xda, 0xdb, 0x36, 0xe0, 0x2d, 0xe9, 0xf8, 0x43, 0x07, 0x46, + 0x0e, 0x46, 0x0d, 0xf0, 0x6a, 0xfd, 0x00, 0x24, 0x00, 0x28, 0x14, 0xbf, + 0x0b, 0x25, 0x07, 0x25, 0x0e, 0xf0, 0x28, 0xfd, 0x40, 0xf4, 0x70, 0x60, + 0x00, 0xea, 0x07, 0x09, 0x4f, 0xf0, 0x00, 0x08, 0x34, 0x80, 0x00, 0x27, + 0x01, 0x21, 0xb9, 0x40, 0x19, 0xea, 0x01, 0x0f, 0x0e, 0xd0, 0xf8, 0xb2, + 0x0e, 0xf0, 0x70, 0xfa, 0x01, 0x28, 0x09, 0xd1, 0xf8, 0xb2, 0x0e, 0xf0, + 0x93, 0xf9, 0x31, 0x88, 0x0a, 0x22, 0x90, 0xfb, 0xf2, 0xf0, 0x41, 0x18, + 0x31, 0x80, 0x64, 0x1c, 0x7f, 0x1c, 0xbd, 0x42, 0xe8, 0xd2, 0x24, 0xb2, + 0x01, 0x2c, 0xa7, 0xbf, 0xb6, 0xf9, 0x00, 0x00, 0x90, 0xfb, 0xf4, 0xf0, + 0x4b, 0xf2, 0x01, 0x68, 0x1a, 0x48, 0x30, 0x80, 0x40, 0x46, 0xbd, 0xe8, + 0xf2, 0x83, 0xf8, 0xb5, 0x04, 0x46, 0x0d, 0xf0, 0x32, 0xfd, 0x00, 0x28, + 0x14, 0xbf, 0x0b, 0x26, 0x07, 0x26, 0x00, 0x20, 0x14, 0x4d, 0x13, 0x49, + 0x25, 0xf8, 0x10, 0x10, 0x40, 0x1c, 0x0b, 0x28, 0xfa, 0xd9, 0x00, 0x27, + 0x38, 0x46, 0x0e, 0xf0, 0x0b, 0xfd, 0x07, 0x2f, 0x01, 0xd8, 0xff, 0x28, + 0x0c, 0xd0, 0xf8, 0xb2, 0x0e, 0xf0, 0x38, 0xfa, 0x01, 0x28, 0x07, 0xd1, + 0xf8, 0xb2, 0x0e, 0xf0, 0x5b, 0xf9, 0x0a, 0x21, 0x90, 0xfb, 0xf1, 0xf0, + 0x25, 0xf8, 0x17, 0x00, 0x7f, 0x1c, 0xbe, 0x42, 0xe8, 0xd2, 0x18, 0x22, + 0x29, 0x46, 0x20, 0x46, 0x00, 0xf0, 0xa6, 0xf8, 0x00, 0x20, 0xf2, 0xbd, + 0xdc, 0x92, 0x04, 0x02, 0xee, 0xfe, 0xff, 0xff, 0x1c, 0x75, 0x02, 0x21, + 0x38, 0xb5, 0x04, 0x46, 0x00, 0x20, 0x20, 0x80, 0x00, 0x25, 0x00, 0xf0, + 0x0c, 0xf8, 0x01, 0x28, 0x04, 0xd1, 0x20, 0x88, 0x01, 0x21, 0xa9, 0x40, + 0x08, 0x43, 0x20, 0x80, 0x6d, 0x1c, 0x0c, 0x2d, 0xf3, 0xdb, 0x00, 0x20, + 0x32, 0xbd, 0xe8, 0xb2, 0x0e, 0xf0, 0x08, 0xba, 0x2d, 0xe9, 0xf8, 0x43, + 0x80, 0x46, 0x00, 0x24, 0x0e, 0xf0, 0xaa, 0xfc, 0x40, 0xf4, 0x70, 0x66, + 0x0d, 0xf0, 0xe1, 0xfc, 0x00, 0x28, 0x14, 0xbf, 0x4f, 0xf0, 0x0b, 0x09, + 0x4f, 0xf0, 0x07, 0x09, 0xb8, 0xf5, 0x80, 0x5f, 0xb6, 0xb2, 0xa8, 0xbf, + 0x4b, 0xf2, 0x0e, 0x64, 0x3b, 0xda, 0x00, 0x25, 0x01, 0x27, 0xaf, 0x40, + 0xbf, 0xb2, 0x3e, 0x42, 0x32, 0xd0, 0xff, 0xf7, 0xde, 0xff, 0x18, 0xea, + 0x07, 0x0f, 0x25, 0xd0, 0x60, 0xbb, 0x0e, 0xf0, 0xb2, 0xf8, 0xe8, 0xb2, + 0x0e, 0xf0, 0x6d, 0xf9, 0xe8, 0xb2, 0x0e, 0xf0, 0x1e, 0xfa, 0xe8, 0xb2, + 0x0e, 0xf0, 0x4c, 0xfa, 0xe8, 0xb2, 0x0e, 0xf0, 0x47, 0xf8, 0x04, 0x46, + 0x00, 0x21, 0xe8, 0xb2, 0x0e, 0xf0, 0x79, 0xfa, 0xe8, 0xb2, 0x0e, 0xf0, + 0x2f, 0xf9, 0x3c, 0xb9, 0xe8, 0xb2, 0x0e, 0xf0, 0x05, 0xf9, 0x04, 0x46, + 0x14, 0xb9, 0xe8, 0xb2, 0x0e, 0xf0, 0xad, 0xf8, 0xe8, 0xb2, 0x0e, 0xf0, + 0x40, 0xf9, 0x0e, 0xf0, 0x9a, 0xf8, 0x07, 0xe0, 0x0b, 0x2d, 0x05, 0xd0, + 0xe8, 0xb2, 0x0e, 0xf0, 0xc7, 0xf9, 0xe8, 0xb2, 0x0e, 0xf0, 0x3f, 0xfa, + 0x6d, 0x1c, 0xa9, 0x45, 0xc4, 0xd2, 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x83, + 0x2d, 0xe9, 0xfc, 0x41, 0x00, 0x24, 0x88, 0x46, 0xad, 0xf8, 0x00, 0x40, + 0x05, 0x46, 0x68, 0x46, 0xff, 0xf7, 0x8a, 0xff, 0x01, 0x26, 0xbd, 0xf8, + 0x00, 0x00, 0x00, 0x27, 0xae, 0x40, 0x30, 0x42, 0x06, 0xd1, 0x06, 0x43, + 0xb0, 0xb2, 0xff, 0xf7, 0x95, 0xff, 0x01, 0x27, 0x04, 0x00, 0x15, 0xd1, + 0xe8, 0xb2, 0x0e, 0xf0, 0xbf, 0xf8, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, + 0xc0, 0x0a, 0xf2, 0xee, 0x04, 0x0a, 0x00, 0x2f, 0x80, 0xee, 0x20, 0x0a, + 0x18, 0xbf, 0x0b, 0x2d, 0x88, 0xed, 0x00, 0x0a, 0x04, 0xd0, 0xbd, 0xf8, + 0x00, 0x00, 0xff, 0xf7, 0x7d, 0xff, 0x04, 0x46, 0x20, 0x46, 0xbd, 0xe8, + 0xf6, 0x81, 0x00, 0x00, 0x62, 0xb3, 0x8b, 0x07, 0x08, 0xd0, 0x52, 0x1e, + 0x11, 0xf8, 0x01, 0x3b, 0x00, 0xf8, 0x01, 0x3b, 0x00, 0xf0, 0x24, 0x80, + 0x8b, 0x07, 0xf6, 0xd1, 0x83, 0x07, 0x40, 0xf0, 0x20, 0x80, 0x00, 0xbf, + 0x10, 0x3a, 0x07, 0xd3, 0x30, 0xb4, 0xb1, 0xe8, 0x38, 0x10, 0x10, 0x3a, + 0xa0, 0xe8, 0x38, 0x10, 0xf9, 0xd2, 0x30, 0xbc, 0x53, 0x07, 0x24, 0xbf, + 0xb1, 0xe8, 0x08, 0x10, 0xa0, 0xe8, 0x08, 0x10, 0x44, 0xbf, 0x51, 0xf8, + 0x04, 0x3b, 0x40, 0xf8, 0x04, 0x3b, 0xd2, 0x07, 0x24, 0xbf, 0x31, 0xf8, + 0x02, 0x2b, 0x20, 0xf8, 0x02, 0x2b, 0x44, 0xbf, 0x0b, 0x78, 0x03, 0x70, + 0x70, 0x47, 0x12, 0x1f, 0x17, 0xd3, 0x5b, 0x00, 0x09, 0xd1, 0x51, 0xf8, + 0x04, 0x3b, 0x20, 0xf8, 0x02, 0x3b, 0x1b, 0x0c, 0x12, 0x1f, 0x20, 0xf8, + 0x02, 0x3b, 0xf6, 0xd2, 0x0b, 0xe0, 0x51, 0xf8, 0x04, 0x3b, 0x00, 0xf8, + 0x01, 0x3b, 0x1b, 0x0a, 0x20, 0xf8, 0x02, 0x3b, 0x1b, 0x0c, 0x12, 0x1f, + 0x00, 0xf8, 0x01, 0x3b, 0xf3, 0xd2, 0x38, 0xbf, 0x12, 0x1d, 0x52, 0x1e, + 0x24, 0xbf, 0x11, 0xf8, 0x01, 0x3b, 0x00, 0xf8, 0x01, 0x3b, 0xf8, 0xd8, + 0x70, 0x47, 0x00, 0x00, 0xdf, 0xed, 0x65, 0x0a, 0x60, 0xee, 0x20, 0x0a, + 0x10, 0xee, 0x90, 0x1a, 0x21, 0xf0, 0x00, 0x41, 0x01, 0xee, 0x10, 0x1a, + 0xdf, 0xed, 0x61, 0x1a, 0xb4, 0xee, 0x61, 0x1a, 0xf1, 0xee, 0x10, 0xfa, + 0x27, 0xd5, 0x10, 0xee, 0x90, 0x2a, 0x4f, 0xf0, 0x7c, 0x51, 0x02, 0xf0, + 0x00, 0x42, 0x11, 0x43, 0x01, 0xee, 0x10, 0x1a, 0x70, 0xee, 0x81, 0x0a, + 0xfd, 0xee, 0xe0, 0x0a, 0x10, 0xee, 0x90, 0x1a, 0x00, 0x29, 0x6e, 0xd0, + 0xfa, 0xee, 0xc9, 0x0a, 0x9f, 0xed, 0x55, 0x1a, 0x00, 0xee, 0xc1, 0x0a, + 0xdf, 0xed, 0x54, 0x1a, 0x00, 0xee, 0xe1, 0x0a, 0x9f, 0xed, 0x53, 0x2a, + 0x00, 0xee, 0xc2, 0x0a, 0xdf, 0xed, 0x52, 0x2a, 0x00, 0xee, 0xe2, 0x0a, + 0x9f, 0xed, 0x51, 0x1a, 0x00, 0xee, 0xc1, 0x0a, 0x57, 0xe0, 0x10, 0xee, + 0x10, 0x1a, 0x49, 0x00, 0x09, 0x16, 0x49, 0x1c, 0x10, 0xee, 0x10, 0x1a, + 0x09, 0xd1, 0x49, 0x00, 0x08, 0x16, 0x40, 0x1c, 0x02, 0xd1, 0x09, 0x02, + 0x40, 0xf0, 0x83, 0x80, 0x9f, 0xed, 0x48, 0x0a, 0x70, 0x47, 0x49, 0x00, + 0x04, 0xd1, 0x00, 0x28, 0x7b, 0xd0, 0xb7, 0xee, 0x00, 0x0a, 0x70, 0x47, + 0x10, 0xee, 0x90, 0x2a, 0x4f, 0xf0, 0x7c, 0x51, 0x02, 0xf0, 0x00, 0x42, + 0x11, 0x43, 0x01, 0xee, 0x10, 0x1a, 0x70, 0xee, 0x81, 0x0a, 0x10, 0xee, + 0x90, 0x2a, 0x51, 0x00, 0x0f, 0xd0, 0x09, 0x0e, 0xc1, 0xf1, 0x96, 0x01, + 0x18, 0x29, 0xa8, 0xbf, 0x02, 0xf0, 0x00, 0x42, 0x05, 0xda, 0x00, 0x29, + 0xc4, 0xbf, 0x22, 0xfa, 0x01, 0xf3, 0x03, 0xfa, 0x01, 0xf2, 0x00, 0xee, + 0x90, 0x2a, 0x10, 0xee, 0x90, 0x1a, 0x49, 0x00, 0x17, 0xd0, 0x9f, 0xed, + 0x33, 0x1a, 0x20, 0xee, 0x81, 0x1a, 0xdf, 0xed, 0x2b, 0x1a, 0x01, 0xee, + 0x61, 0x0a, 0x9f, 0xed, 0x2a, 0x2a, 0x01, 0xee, 0x42, 0x0a, 0xdf, 0xed, + 0x29, 0x2a, 0x01, 0xee, 0x62, 0x0a, 0x9f, 0xed, 0x28, 0x3a, 0x01, 0xee, + 0x43, 0x0a, 0xdf, 0xed, 0x27, 0x1a, 0x01, 0xee, 0x61, 0x0a, 0xfd, 0xee, + 0xe0, 0x0a, 0x10, 0xee, 0x90, 0x1a, 0x10, 0xee, 0x10, 0x2a, 0x22, 0xf0, + 0x00, 0x42, 0x00, 0xee, 0x90, 0x2a, 0x9f, 0xed, 0x23, 0x1a, 0x01, 0xf0, + 0x03, 0x01, 0xf4, 0xee, 0x41, 0x0a, 0x08, 0x18, 0xf1, 0xee, 0x10, 0xfa, + 0x00, 0xf0, 0x01, 0x01, 0x03, 0xd5, 0x11, 0xb3, 0xb7, 0xee, 0x00, 0x0a, + 0x1f, 0xe0, 0x60, 0xee, 0x00, 0x0a, 0x71, 0xb1, 0x9f, 0xed, 0x1a, 0x0a, + 0x9f, 0xed, 0x1a, 0x1a, 0x00, 0xee, 0x80, 0x1a, 0xdf, 0xed, 0x19, 0x1a, + 0x41, 0xee, 0x20, 0x1a, 0xb7, 0xee, 0x00, 0x0a, 0x01, 0xee, 0xa0, 0x0a, + 0x0d, 0xe0, 0x9f, 0xed, 0x16, 0x2a, 0xdf, 0xed, 0x16, 0x1a, 0x40, 0xee, + 0x82, 0x1a, 0xdf, 0xed, 0x15, 0x2a, 0x20, 0xee, 0x20, 0x1a, 0x41, 0xee, + 0xa0, 0x2a, 0x01, 0xee, 0x22, 0x0a, 0x80, 0x07, 0x48, 0xbf, 0xb1, 0xee, + 0x40, 0x0a, 0x70, 0x47, 0x83, 0xf9, 0x22, 0x3f, 0x00, 0x00, 0x00, 0x4f, + 0x00, 0x00, 0xc9, 0x46, 0x00, 0xa0, 0xfd, 0x40, 0x00, 0x20, 0xa2, 0x3a, + 0x00, 0x00, 0x34, 0x33, 0x00, 0x30, 0xc2, 0x2e, 0xff, 0xff, 0xff, 0x7f, + 0x00, 0x00, 0x80, 0x38, 0x00, 0x00, 0x80, 0x39, 0x93, 0x49, 0xb2, 0xba, + 0x36, 0xa0, 0x2a, 0x3d, 0xdf, 0xff, 0xff, 0xbe, 0x6e, 0x8c, 0x4c, 0xb9, + 0x42, 0x83, 0x08, 0x3c, 0xa1, 0xaa, 0x2a, 0xbe, 0x01, 0x20, 0x11, 0xe7, + 0x00, 0x20, 0x0f, 0xe7, 0x10, 0xee, 0x10, 0x0a, 0xb5, 0xee, 0x40, 0x0a, + 0x4f, 0xf0, 0x80, 0x71, 0x11, 0xeb, 0x40, 0x0f, 0xb0, 0xf0, 0xc6, 0x82, + 0xf1, 0xee, 0x10, 0xfa, 0x21, 0x49, 0xf1, 0xec, 0x07, 0x0a, 0x70, 0xf3, + 0xc9, 0x82, 0xc2, 0x0d, 0x01, 0xf1, 0x0c, 0x01, 0x91, 0xec, 0x05, 0x4a, + 0x2d, 0xd0, 0x7e, 0x3a, 0xa0, 0xeb, 0xc2, 0x50, 0x00, 0xee, 0x10, 0x0a, + 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xbf, 0x52, 0x1e, + 0x20, 0xee, 0x21, 0x0a, 0x00, 0xee, 0x90, 0x2a, 0xf8, 0xee, 0xe0, 0x0a, + 0x70, 0xee, 0x41, 0x6a, 0x30, 0xee, 0x01, 0x7a, 0x86, 0xee, 0x87, 0x7a, + 0x67, 0xee, 0x07, 0x7a, 0x02, 0xee, 0xa7, 0x3a, 0x43, 0xee, 0x27, 0x3a, + 0xb0, 0xee, 0x66, 0x0a, 0x03, 0xee, 0xe7, 0x0a, 0x20, 0xee, 0x07, 0x7a, + 0x20, 0xee, 0x85, 0x0a, 0x05, 0xee, 0xc7, 0x0a, 0x04, 0xee, 0xa6, 0x0a, + 0x04, 0xee, 0x26, 0x0a, 0x06, 0xee, 0x20, 0x0a, 0x70, 0x47, 0x20, 0xee, + 0x02, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0xc2, 0x0d, 0x7e, 0x3a, 0xa0, 0xeb, + 0xc2, 0x50, 0x17, 0x3a, 0xca, 0xe7, 0x00, 0x00, 0x50, 0x90, 0x04, 0x02, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x70, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, 0x2d, 0xed, 0x04, 0x8b, + 0x5b, 0x49, 0x82, 0xb0, 0x05, 0x46, 0x51, 0xf8, 0x25, 0x60, 0x03, 0x28, + 0x20, 0xd8, 0xdf, 0xe8, 0x00, 0xf0, 0x19, 0x1b, 0x02, 0x1d, 0x08, 0x20, + 0xdf, 0xf8, 0x58, 0x81, 0x56, 0x4f, 0x58, 0xf8, 0x25, 0x30, 0x93, 0xf8, + 0x84, 0x40, 0x07, 0xeb, 0x05, 0x11, 0x01, 0x2c, 0x01, 0xf5, 0xb0, 0x72, + 0x11, 0xd1, 0x92, 0xed, 0x02, 0x8a, 0xd2, 0xed, 0x03, 0x8a, 0x91, 0xed, + 0x6a, 0x9a, 0xd1, 0xed, 0x6b, 0x9a, 0x10, 0xe0, 0x09, 0x20, 0xe7, 0xe7, + 0x0a, 0x20, 0xe5, 0xe7, 0x0b, 0x20, 0xe3, 0xe7, 0x4b, 0xf2, 0x03, 0x74, + 0x84, 0xe0, 0x92, 0xed, 0x00, 0x8a, 0xd2, 0xed, 0x01, 0x8a, 0x91, 0xed, + 0x68, 0x9a, 0xd1, 0xed, 0x69, 0x9a, 0x69, 0x46, 0xff, 0xf7, 0xf0, 0xfd, + 0x04, 0x00, 0x77, 0xd1, 0x58, 0xf8, 0x25, 0x10, 0x48, 0x31, 0x08, 0x6a, + 0x30, 0xb9, 0x9d, 0xed, 0x00, 0x0a, 0x09, 0xee, 0x80, 0x9a, 0x81, 0xed, + 0x06, 0x9a, 0x01, 0xe0, 0xc8, 0x69, 0x88, 0x61, 0x00, 0x20, 0x07, 0xeb, + 0xc0, 0x02, 0x91, 0xed, 0x06, 0x0a, 0xd2, 0xed, 0x00, 0x0a, 0xb4, 0xee, + 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x05, 0xda, 0x40, 0x1c, 0x2c, 0x28, + 0xf1, 0xd3, 0x4b, 0xf2, 0x0e, 0x64, 0x57, 0xe0, 0x50, 0x79, 0x08, 0x70, + 0x06, 0xf1, 0x97, 0x07, 0x58, 0xf8, 0x25, 0x00, 0x11, 0x79, 0x80, 0xf8, + 0x49, 0x10, 0x58, 0xf8, 0x25, 0x00, 0x91, 0x79, 0x80, 0xf8, 0x4a, 0x10, + 0xf0, 0x22, 0x58, 0xf8, 0x25, 0x10, 0x91, 0xf8, 0x49, 0x30, 0x04, 0x21, + 0x06, 0xf1, 0x96, 0x00, 0xff, 0xf7, 0x7e, 0xff, 0x58, 0xf8, 0x25, 0x00, + 0x90, 0xf8, 0x48, 0x30, 0x0f, 0x22, 0x00, 0x21, 0x38, 0x46, 0xff, 0xf7, + 0x75, 0xff, 0x58, 0xf8, 0x25, 0x00, 0x90, 0xf8, 0x4a, 0x30, 0x20, 0x22, + 0x05, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x6c, 0xff, 0x9d, 0xed, 0x00, 0x0a, + 0x40, 0xee, 0x08, 0x8a, 0xf5, 0xee, 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, + 0x98, 0xbf, 0x00, 0x25, 0x0c, 0xd9, 0x9f, 0xed, 0x14, 0x0a, 0xf4, 0xee, + 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0xae, 0xbf, 0x40, 0xf6, 0xff, 0x75, + 0xbd, 0xee, 0xe8, 0x0a, 0x10, 0xee, 0x10, 0x5a, 0xeb, 0xb2, 0xff, 0x22, + 0x00, 0x21, 0x06, 0xf1, 0x66, 0x00, 0xff, 0xf7, 0x4d, 0xff, 0x2d, 0x04, + 0x2b, 0x0e, 0x0f, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x67, 0x00, 0xff, 0xf7, + 0x45, 0xff, 0x01, 0x23, 0x02, 0x22, 0x01, 0x21, 0x06, 0xf1, 0x65, 0x00, + 0xff, 0xf7, 0x3e, 0xff, 0x02, 0xb0, 0x20, 0x46, 0xbd, 0xec, 0x04, 0x8b, + 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0xf0, 0x7f, 0x45, 0x5c, 0x9d, 0x04, 0x02, + 0xc8, 0x74, 0x02, 0x21, 0x04, 0x80, 0x04, 0x02, 0x10, 0xee, 0x10, 0x0a, + 0xb5, 0xee, 0x40, 0x0a, 0x4f, 0xf0, 0x80, 0x71, 0x11, 0xeb, 0x40, 0x0f, + 0xb0, 0xf0, 0xa4, 0x81, 0xf1, 0xee, 0x10, 0xfa, 0x20, 0x49, 0xf1, 0xec, + 0x07, 0x0a, 0x70, 0xf3, 0xa7, 0x81, 0xc2, 0x0d, 0x01, 0xf1, 0x20, 0x01, + 0x91, 0xec, 0x02, 0x4a, 0x2b, 0xd0, 0x7e, 0x3a, 0xa0, 0xeb, 0xc2, 0x50, + 0x00, 0xee, 0x10, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x44, 0xbf, 0x52, 0x1e, 0x20, 0xee, 0x21, 0x0a, 0x00, 0xee, 0x90, 0x2a, + 0xf8, 0xee, 0xe0, 0x0a, 0x70, 0xee, 0x41, 0x5a, 0x30, 0xee, 0x01, 0x6a, + 0x85, 0xee, 0x86, 0x6a, 0x66, 0xee, 0x06, 0x6a, 0x02, 0xee, 0xa6, 0x3a, + 0x43, 0xee, 0x26, 0x3a, 0xb0, 0xee, 0x65, 0x0a, 0x03, 0xee, 0xe6, 0x0a, + 0x20, 0xee, 0x06, 0x6a, 0x24, 0xee, 0xa5, 0x0a, 0x04, 0xee, 0x46, 0x0a, + 0x04, 0xee, 0x25, 0x0a, 0x30, 0xee, 0x20, 0x0a, 0x70, 0x47, 0x20, 0xee, + 0x02, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0xc2, 0x0d, 0x7e, 0x3a, 0xa0, 0xeb, + 0xc2, 0x50, 0x17, 0x3a, 0xcc, 0xe7, 0x00, 0x00, 0x50, 0x90, 0x04, 0x02, + 0xa9, 0xb1, 0xb1, 0xfa, 0x81, 0xf2, 0x41, 0x40, 0x90, 0x40, 0xc2, 0xf1, + 0x20, 0x02, 0x61, 0xfa, 0x02, 0xf1, 0x81, 0xea, 0x00, 0x00, 0x18, 0xbf, + 0x40, 0xf0, 0x01, 0x00, 0x02, 0xf1, 0x9d, 0x01, 0xc9, 0x05, 0x02, 0x06, + 0x72, 0xf1, 0x00, 0x42, 0x41, 0xeb, 0x10, 0x20, 0x70, 0x47, 0x50, 0xb1, + 0xb0, 0xfa, 0x80, 0xf2, 0x90, 0x40, 0xc2, 0xf1, 0x9d, 0x02, 0xd2, 0x05, + 0x01, 0x06, 0x71, 0xf1, 0x00, 0x41, 0x42, 0xeb, 0x10, 0x20, 0x70, 0x47, + 0xdf, 0xed, 0x5f, 0x0a, 0x60, 0xee, 0x20, 0x0a, 0x10, 0xee, 0x90, 0x0a, + 0x20, 0xf0, 0x00, 0x40, 0x01, 0xee, 0x10, 0x0a, 0xdf, 0xed, 0x5b, 0x1a, + 0xb4, 0xee, 0x61, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x27, 0xd5, 0x10, 0xee, + 0x90, 0x1a, 0x4f, 0xf0, 0x7c, 0x50, 0x01, 0xf0, 0x00, 0x41, 0x08, 0x43, + 0x01, 0xee, 0x10, 0x0a, 0x70, 0xee, 0x81, 0x0a, 0xfd, 0xee, 0xe0, 0x0a, + 0x10, 0xee, 0x90, 0x0a, 0x00, 0x28, 0x6a, 0xd0, 0xfa, 0xee, 0xc9, 0x0a, + 0x9f, 0xed, 0x4f, 0x1a, 0x00, 0xee, 0xc1, 0x0a, 0xdf, 0xed, 0x4e, 0x1a, + 0x00, 0xee, 0xe1, 0x0a, 0x9f, 0xed, 0x4d, 0x2a, 0x00, 0xee, 0xc2, 0x0a, + 0xdf, 0xed, 0x4c, 0x2a, 0x00, 0xee, 0xe2, 0x0a, 0x9f, 0xed, 0x4b, 0x1a, + 0x00, 0xee, 0xc1, 0x0a, 0x53, 0xe0, 0x10, 0xee, 0x10, 0x0a, 0x40, 0x00, + 0x00, 0x16, 0x40, 0x1c, 0x0a, 0xd1, 0x10, 0xee, 0x10, 0x1a, 0x49, 0x00, + 0x08, 0x16, 0x40, 0x1c, 0x01, 0xd1, 0x09, 0x02, 0x76, 0xd1, 0x9f, 0xed, + 0x43, 0x0a, 0x70, 0x47, 0x10, 0xee, 0x10, 0x0a, 0x40, 0x00, 0x6f, 0xd0, + 0x10, 0xee, 0x90, 0x1a, 0x4f, 0xf0, 0x7c, 0x50, 0x01, 0xf0, 0x00, 0x41, + 0x08, 0x43, 0x01, 0xee, 0x10, 0x0a, 0x70, 0xee, 0x81, 0x0a, 0x10, 0xee, + 0x90, 0x1a, 0x48, 0x00, 0x0f, 0xd0, 0x00, 0x0e, 0xc0, 0xf1, 0x96, 0x00, + 0x18, 0x28, 0xa8, 0xbf, 0x01, 0xf0, 0x00, 0x41, 0x05, 0xda, 0x00, 0x28, + 0xc4, 0xbf, 0x21, 0xfa, 0x00, 0xf2, 0x02, 0xfa, 0x00, 0xf1, 0x00, 0xee, + 0x90, 0x1a, 0x10, 0xee, 0x90, 0x0a, 0x40, 0x00, 0x17, 0xd0, 0x9f, 0xed, + 0x2f, 0x1a, 0x20, 0xee, 0x81, 0x1a, 0xdf, 0xed, 0x27, 0x1a, 0x01, 0xee, + 0x61, 0x0a, 0x9f, 0xed, 0x26, 0x2a, 0x01, 0xee, 0x42, 0x0a, 0xdf, 0xed, + 0x25, 0x2a, 0x01, 0xee, 0x62, 0x0a, 0x9f, 0xed, 0x24, 0x3a, 0x01, 0xee, + 0x43, 0x0a, 0xdf, 0xed, 0x23, 0x1a, 0x01, 0xee, 0x61, 0x0a, 0xfd, 0xee, + 0xe0, 0x0a, 0x10, 0xee, 0x90, 0x0a, 0x10, 0xee, 0x10, 0x1a, 0x21, 0xf0, + 0x00, 0x41, 0x00, 0xee, 0x90, 0x1a, 0x9f, 0xed, 0x1f, 0x1a, 0xf4, 0xee, + 0x41, 0x0a, 0x00, 0xf0, 0x03, 0x00, 0xf1, 0xee, 0x10, 0xfa, 0x00, 0xf0, + 0x01, 0x00, 0x05, 0xd5, 0xf0, 0xb1, 0xff, 0xee, 0x00, 0x0a, 0x80, 0xee, + 0x80, 0x0a, 0x70, 0x47, 0x20, 0xee, 0x00, 0x1a, 0xdf, 0xed, 0x16, 0x1a, + 0x9f, 0xed, 0x16, 0x2a, 0x01, 0xee, 0x21, 0x2a, 0xf7, 0xee, 0x00, 0x0a, + 0x42, 0xee, 0x01, 0x0a, 0x20, 0xee, 0x01, 0x1a, 0xdf, 0xed, 0x12, 0x2a, + 0x01, 0xee, 0x22, 0x0a, 0x20, 0xb1, 0x80, 0xee, 0x80, 0x0a, 0xb1, 0xee, + 0x40, 0x0a, 0x70, 0x47, 0x80, 0xee, 0x20, 0x0a, 0x70, 0x47, 0x00, 0xbf, + 0x83, 0xf9, 0x22, 0x3f, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0xc9, 0x46, + 0x00, 0xa0, 0xfd, 0x40, 0x00, 0x20, 0xa2, 0x3a, 0x00, 0x00, 0x34, 0x33, + 0x00, 0x30, 0xc2, 0x2e, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x80, 0x38, + 0x00, 0x00, 0x80, 0x39, 0x6d, 0x16, 0x1f, 0x3c, 0x1e, 0xb5, 0xdb, 0xbe, + 0x83, 0x29, 0xc4, 0xbd, 0x03, 0x46, 0x10, 0xee, 0x10, 0x0a, 0xf4, 0x46, + 0x00, 0xf0, 0x04, 0xf8, 0x19, 0x60, 0x00, 0xee, 0x10, 0x0a, 0x60, 0x47, + 0xc0, 0xf3, 0xc7, 0x51, 0x29, 0xb1, 0xff, 0x29, 0x12, 0xd0, 0x7e, 0x39, + 0xa0, 0xeb, 0xc1, 0x50, 0x70, 0x47, 0xc0, 0x42, 0x0d, 0xd0, 0x00, 0xf0, + 0x00, 0x42, 0x40, 0x02, 0xb0, 0xfa, 0x80, 0xf1, 0x88, 0x40, 0x7e, 0x31, + 0x49, 0x42, 0x42, 0xea, 0x10, 0x20, 0x00, 0xf1, 0x7a, 0x50, 0x70, 0x47, + 0x00, 0x21, 0x70, 0x47, 0x10, 0xee, 0x10, 0x1a, 0x49, 0x00, 0x10, 0xb5, + 0x09, 0x16, 0x49, 0x1c, 0x1a, 0xd0, 0x10, 0xee, 0x10, 0x1a, 0x49, 0x00, + 0x16, 0xd0, 0x10, 0xee, 0x90, 0x1a, 0x49, 0x00, 0x09, 0x16, 0x49, 0x1c, + 0x10, 0xd0, 0x10, 0xee, 0x90, 0x1a, 0x49, 0x00, 0x0c, 0xd0, 0x9f, 0xed, + 0x8b, 0x1a, 0xb4, 0xee, 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x40, 0xf1, + 0x80, 0x80, 0x10, 0xee, 0x90, 0x1a, 0x01, 0xf0, 0x00, 0x40, 0x8a, 0xe0, + 0x10, 0xee, 0x10, 0x2a, 0x52, 0x00, 0x11, 0x16, 0x49, 0x1c, 0x02, 0xd1, + 0x12, 0x02, 0x40, 0xf0, 0xff, 0x80, 0x10, 0xee, 0x90, 0x2a, 0x52, 0x00, + 0x11, 0x16, 0x49, 0x1c, 0x01, 0xd1, 0x12, 0x02, 0x41, 0xd1, 0x10, 0xee, + 0x90, 0x1a, 0x49, 0x00, 0x08, 0xd1, 0x10, 0xee, 0x10, 0x1a, 0x48, 0x00, + 0x00, 0x16, 0x40, 0x1c, 0x37, 0xd1, 0x49, 0x02, 0x35, 0xd1, 0x0e, 0xe0, + 0x09, 0x16, 0x49, 0x1c, 0x10, 0xee, 0x90, 0x2a, 0x0e, 0xd1, 0x52, 0x02, + 0x0c, 0xd1, 0x10, 0xee, 0x10, 0x1a, 0x48, 0x00, 0x00, 0x16, 0x40, 0x1c, + 0x27, 0xd1, 0x49, 0x02, 0x25, 0xd1, 0xaf, 0xf3, 0x00, 0x80, 0x9f, 0xed, + 0x6e, 0x0a, 0x10, 0xbd, 0x10, 0xee, 0x10, 0x1a, 0x49, 0x00, 0x1f, 0xd1, + 0x10, 0xee, 0x90, 0x3a, 0x23, 0xf0, 0x00, 0x42, 0xd1, 0x0d, 0x00, 0xeb, + 0x01, 0x04, 0x22, 0xd1, 0x2a, 0xb1, 0xb0, 0xee, 0x60, 0x0a, 0x2f, 0xf0, + 0xeb, 0xff, 0xf0, 0xee, 0x40, 0x0a, 0x10, 0xee, 0x90, 0x0a, 0x41, 0x00, + 0x07, 0xd0, 0x10, 0xee, 0x90, 0x1a, 0x48, 0x00, 0x00, 0x16, 0x40, 0x1c, + 0x03, 0xd1, 0x49, 0x02, 0x01, 0xd1, 0xaf, 0xf3, 0x00, 0x80, 0xb0, 0xee, + 0x60, 0x0a, 0x10, 0xbd, 0x10, 0xee, 0x10, 0x1a, 0x48, 0x00, 0x00, 0x16, + 0x40, 0x1c, 0x19, 0xd1, 0x49, 0x02, 0x17, 0xd1, 0x20, 0xee, 0x20, 0x0a, + 0x10, 0xbd, 0x00, 0x2c, 0xda, 0xdd, 0xff, 0x2c, 0x09, 0xdb, 0x10, 0xee, + 0x90, 0x1a, 0x4f, 0xf0, 0xff, 0x40, 0x01, 0xf0, 0x00, 0x41, 0x08, 0x43, + 0x00, 0xee, 0x90, 0x0a, 0xd5, 0xe7, 0x23, 0xf0, 0xff, 0x43, 0x43, 0xea, + 0xc4, 0x53, 0x00, 0xee, 0x90, 0x3a, 0xce, 0xe7, 0x10, 0xee, 0x90, 0x1a, + 0x01, 0xf0, 0x00, 0x40, 0x0f, 0xe0, 0x9f, 0xed, 0x49, 0x1a, 0xb4, 0xee, + 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x0b, 0xdb, 0x10, 0xee, 0x90, 0x1a, + 0xaf, 0xf3, 0x00, 0x80, 0x4f, 0xf0, 0xff, 0x40, 0x01, 0xf0, 0x00, 0x41, + 0x08, 0x43, 0x00, 0xee, 0x10, 0x0a, 0x10, 0xbd, 0x9f, 0xed, 0x40, 0x1a, + 0x20, 0xee, 0x01, 0x1a, 0x11, 0xee, 0x10, 0x2a, 0x4f, 0xf0, 0x7c, 0x51, + 0x02, 0xf0, 0x00, 0x42, 0x11, 0x43, 0x01, 0xee, 0x90, 0x1a, 0x31, 0xee, + 0x21, 0x1a, 0xbd, 0xee, 0xc1, 0x1a, 0x11, 0xee, 0x10, 0x1a, 0xb8, 0xee, + 0xc1, 0x1a, 0xdf, 0xed, 0x37, 0x1a, 0x01, 0xee, 0x61, 0x0a, 0x9f, 0xed, + 0x36, 0x2a, 0x01, 0xee, 0x42, 0x0a, 0x10, 0xee, 0x10, 0x2a, 0x22, 0xf0, + 0x00, 0x42, 0x01, 0xee, 0x10, 0x2a, 0xdf, 0xed, 0x32, 0x1a, 0xb4, 0xee, + 0x61, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, 0xb0, 0xee, 0x60, 0x0a, + 0x1d, 0xd4, 0xdf, 0xed, 0x2e, 0x2a, 0xb6, 0xee, 0x00, 0x3a, 0x20, 0xee, + 0x00, 0x1a, 0x9f, 0xed, 0x2c, 0x2a, 0x01, 0xee, 0x22, 0x3a, 0x61, 0xee, + 0x02, 0x1a, 0x23, 0xee, 0x00, 0x0a, 0x31, 0xee, 0x80, 0x1a, 0x31, 0xee, + 0xc0, 0x0a, 0xf7, 0xee, 0x00, 0x3a, 0xf7, 0xee, 0x00, 0x1a, 0x71, 0xee, + 0x23, 0x3a, 0x70, 0xee, 0x21, 0x1a, 0xc3, 0xee, 0xa1, 0x1a, 0x21, 0xee, + 0xa0, 0x0a, 0x10, 0xee, 0x10, 0x3a, 0x40, 0x18, 0x23, 0xf0, 0x00, 0x42, + 0xd1, 0x0d, 0x00, 0xeb, 0x01, 0x04, 0x14, 0xd0, 0x00, 0x2c, 0x12, 0xdd, + 0xff, 0x2c, 0x09, 0xdb, 0x10, 0xee, 0x10, 0x1a, 0x4f, 0xf0, 0xff, 0x40, + 0x01, 0xf0, 0x00, 0x41, 0x08, 0x43, 0x00, 0xee, 0x10, 0x0a, 0x09, 0xe0, + 0x23, 0xf0, 0xff, 0x43, 0x43, 0xea, 0xc4, 0x53, 0x00, 0xee, 0x10, 0x3a, + 0x02, 0xe0, 0x0a, 0xb1, 0x2f, 0xf0, 0x34, 0xff, 0x10, 0xee, 0x10, 0x0a, + 0x41, 0x00, 0x07, 0xd0, 0x10, 0xee, 0x10, 0x1a, 0x48, 0x00, 0x00, 0x16, + 0x40, 0x1c, 0x03, 0xd1, 0x49, 0x02, 0x01, 0xd1, 0xaf, 0xf3, 0x00, 0x80, + 0x10, 0xbd, 0x00, 0xbf, 0x00, 0x00, 0x65, 0xc3, 0xff, 0xff, 0xff, 0x7f, + 0x01, 0x00, 0x65, 0x43, 0x3b, 0xaa, 0xb8, 0x3f, 0x00, 0x60, 0x31, 0x3f, + 0xbf, 0xbf, 0x90, 0x39, 0x01, 0x00, 0x00, 0x33, 0x13, 0x54, 0x08, 0x3c, + 0x9e, 0xbf, 0xcc, 0x3d, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x78, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x70, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0xf0, 0xb5, 0xb6, 0x4c, + 0x54, 0xf8, 0x20, 0x00, 0x04, 0x1d, 0x14, 0x25, 0x00, 0xf1, 0x4e, 0x07, + 0x25, 0x70, 0x00, 0x26, 0x00, 0xf1, 0x55, 0x04, 0x3e, 0x70, 0x00, 0xf1, + 0x50, 0x07, 0x26, 0x70, 0x00, 0xf1, 0x57, 0x04, 0x3e, 0x70, 0x26, 0x70, + 0x00, 0xf1, 0x56, 0x04, 0x00, 0xf1, 0x4f, 0x05, 0x00, 0xf1, 0x54, 0x06, + 0x4d, 0x30, 0x23, 0xb1, 0x08, 0x21, 0x01, 0x70, 0x31, 0x70, 0x00, 0x22, + 0x0b, 0xe0, 0x29, 0xb9, 0x18, 0x21, 0x01, 0x70, 0x31, 0x70, 0x1f, 0x27, + 0x2f, 0x70, 0x27, 0x70, 0x2a, 0xb1, 0x18, 0x21, 0x01, 0x70, 0x31, 0x70, + 0x15, 0x22, 0x2a, 0x70, 0x22, 0x70, 0xf0, 0xbd, 0x9e, 0x49, 0x03, 0x22, + 0xf8, 0xb5, 0x51, 0xf8, 0x20, 0x50, 0x00, 0x23, 0x00, 0xf0, 0x58, 0xf8, + 0x00, 0x23, 0x00, 0xf0, 0x59, 0xf8, 0x00, 0xf0, 0xef, 0xf8, 0x00, 0xf0, + 0xe9, 0xf8, 0x00, 0xf0, 0x3d, 0xf8, 0x06, 0xd0, 0x00, 0xf0, 0xe8, 0xf8, + 0x76, 0x1c, 0xb6, 0xf5, 0xfa, 0x6f, 0xf6, 0xd1, 0x02, 0xe0, 0xb6, 0xf5, + 0xfa, 0x6f, 0x05, 0xd1, 0xf8, 0x07, 0x4c, 0xbf, 0x40, 0xf2, 0x09, 0x54, + 0x40, 0xf2, 0x0a, 0x54, 0x20, 0x46, 0xf2, 0xbd, 0xf8, 0xb5, 0x8c, 0x49, + 0x51, 0xf8, 0x20, 0x50, 0x8b, 0x49, 0x08, 0x5c, 0x00, 0xf0, 0xcc, 0xf8, + 0x10, 0xb9, 0x40, 0xf2, 0x0b, 0x54, 0x1b, 0xe0, 0x01, 0x23, 0x03, 0x22, + 0x00, 0xf0, 0x2c, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0x2d, 0xf8, 0x00, 0xf0, + 0xc3, 0xf8, 0x00, 0xf0, 0x13, 0xf8, 0x06, 0xd0, 0x00, 0xf0, 0xbe, 0xf8, + 0x76, 0x1c, 0xb6, 0xf5, 0xfa, 0x6f, 0xf6, 0xd1, 0x02, 0xe0, 0xb6, 0xf5, + 0xfa, 0x6f, 0x05, 0xd1, 0xf8, 0x07, 0x4c, 0xbf, 0x40, 0xf2, 0x02, 0x54, + 0x40, 0xf2, 0x01, 0x54, 0x20, 0x46, 0xf2, 0xbd, 0x05, 0xf1, 0x3c, 0x00, + 0x00, 0x78, 0xc0, 0xf3, 0x00, 0x10, 0x08, 0xb1, 0x47, 0xf0, 0x01, 0x07, + 0x05, 0xf1, 0x3d, 0x00, 0x00, 0x78, 0xc0, 0xf3, 0x00, 0x10, 0x08, 0xb1, + 0x47, 0xf0, 0x02, 0x07, 0x03, 0x2f, 0x70, 0x47, 0x00, 0x21, 0x05, 0xf1, + 0x3a, 0x00, 0x5d, 0xe7, 0x03, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x3b, 0x00, + 0x58, 0xe7, 0x2d, 0xe9, 0xf8, 0x43, 0x6b, 0x49, 0x09, 0x68, 0x06, 0x46, + 0x67, 0x48, 0x50, 0xf8, 0x26, 0x40, 0x8a, 0x19, 0xed, 0x20, 0x92, 0xf8, + 0xbc, 0x30, 0x43, 0x43, 0xc8, 0x18, 0x00, 0xf2, 0x44, 0x47, 0x65, 0x49, + 0xf8, 0x68, 0x88, 0x42, 0x4f, 0xf0, 0x00, 0x08, 0x02, 0xd3, 0x63, 0x49, + 0x88, 0x42, 0x06, 0xd3, 0x62, 0x4a, 0x05, 0x21, 0x02, 0x20, 0x0d, 0xf0, + 0x6a, 0xff, 0x40, 0xf2, 0x0c, 0x58, 0x07, 0xf1, 0xd9, 0x05, 0x01, 0x21, + 0xa8, 0x78, 0xfa, 0x68, 0xc0, 0xf1, 0x12, 0x00, 0x01, 0xfa, 0x00, 0xf0, + 0xb2, 0xfb, 0xf0, 0xf3, 0xe8, 0x78, 0xc0, 0xf1, 0x12, 0x00, 0x01, 0xfa, + 0x00, 0xf0, 0xb2, 0xfb, 0xf0, 0xf0, 0x97, 0xf8, 0x81, 0x20, 0xc2, 0xf1, + 0x12, 0x02, 0x91, 0x40, 0xfa, 0x68, 0xb2, 0xfb, 0xf1, 0xf1, 0x42, 0xf6, + 0xe1, 0x62, 0x93, 0x42, 0x3e, 0xbf, 0x90, 0x42, 0x41, 0xf2, 0x71, 0x70, + 0x81, 0x42, 0x02, 0xd3, 0x40, 0xf2, 0x0b, 0x58, 0x1d, 0xe0, 0x04, 0xf1, + 0x38, 0x09, 0x2b, 0x78, 0x00, 0xf0, 0x1c, 0xf8, 0x6b, 0x78, 0xf0, 0x22, + 0x04, 0x21, 0x00, 0xf0, 0x19, 0xf8, 0x04, 0xf1, 0x39, 0x09, 0xab, 0x78, + 0x00, 0xf0, 0x12, 0xf8, 0xeb, 0x78, 0xf0, 0x22, 0x04, 0x21, 0x00, 0xf0, + 0x0f, 0xf8, 0x97, 0xf8, 0x81, 0x30, 0x0f, 0x22, 0x00, 0x21, 0xa0, 0x1d, + 0xff, 0xf7, 0xf8, 0xfe, 0x3a, 0x49, 0x01, 0x20, 0x88, 0x55, 0x40, 0x46, + 0xbd, 0xe8, 0xf2, 0x83, 0x0f, 0x22, 0x00, 0x21, 0x48, 0x46, 0xed, 0xe6, + 0x34, 0x49, 0x03, 0x22, 0xf8, 0xb5, 0x51, 0xf8, 0x20, 0x50, 0x02, 0x23, + 0xff, 0xf7, 0x84, 0xff, 0x02, 0x23, 0xff, 0xf7, 0x85, 0xff, 0x00, 0xf0, + 0x1b, 0xf8, 0x00, 0xf0, 0x15, 0xf8, 0xff, 0xf7, 0x69, 0xff, 0x06, 0xd0, + 0x00, 0xf0, 0x14, 0xf8, 0x76, 0x1c, 0xb6, 0xf5, 0xfa, 0x6f, 0xf6, 0xd1, + 0x02, 0xe0, 0xb6, 0xf5, 0xfa, 0x6f, 0x05, 0xd1, 0xf8, 0x07, 0x4c, 0xbf, + 0x4f, 0xf4, 0xa1, 0x64, 0x40, 0xf2, 0x07, 0x54, 0x20, 0x46, 0xf2, 0xbd, + 0x00, 0x24, 0x00, 0x26, 0x00, 0x27, 0x70, 0x47, 0x01, 0x20, 0x18, 0xf0, + 0xbf, 0xb8, 0x1f, 0x49, 0x00, 0x23, 0x01, 0x22, 0x2d, 0xe9, 0xf0, 0x41, + 0x51, 0xf8, 0x20, 0x50, 0x05, 0xf1, 0x08, 0x08, 0x00, 0x21, 0x00, 0xf0, + 0x41, 0xf8, 0x00, 0x23, 0x00, 0xf0, 0x3c, 0xf8, 0xff, 0xf7, 0xec, 0xff, + 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x37, 0xf8, 0x01, 0x23, + 0x00, 0xf0, 0x32, 0xf8, 0xff, 0xf7, 0xe2, 0xff, 0xff, 0xf7, 0xdc, 0xff, + 0x0a, 0x35, 0x42, 0xf2, 0x10, 0x78, 0x28, 0x78, 0xc0, 0x07, 0x28, 0x78, + 0x48, 0xbf, 0x47, 0xf0, 0x01, 0x07, 0xc0, 0xf3, 0x00, 0x10, 0x08, 0xb1, + 0x47, 0xf0, 0x02, 0x07, 0x03, 0x2f, 0x05, 0xd0, 0xff, 0xf7, 0xce, 0xff, + 0x76, 0x1c, 0x46, 0x45, 0xed, 0xd1, 0x01, 0xe0, 0x46, 0x45, 0x05, 0xd1, + 0xf8, 0x07, 0x4c, 0xbf, 0x40, 0xf2, 0x04, 0x54, 0x40, 0xf2, 0x03, 0x54, + 0x20, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x00, 0x40, 0x99, 0x04, 0x02, + 0xec, 0x75, 0x02, 0x21, 0x5c, 0x75, 0x02, 0x21, 0xc0, 0x5c, 0x15, 0x00, + 0xc1, 0xc6, 0x2d, 0x00, 0x94, 0x1f, 0x00, 0x02, 0x10, 0x22, 0x04, 0x21, + 0x40, 0x46, 0x73, 0xe6, 0x10, 0xb5, 0x04, 0x46, 0xb4, 0xb0, 0x21, 0x79, + 0x20, 0x68, 0x2b, 0xf0, 0x56, 0xfc, 0x00, 0xee, 0x10, 0x0a, 0x0a, 0xa9, + 0x0a, 0x20, 0x00, 0x22, 0x03, 0x23, 0x09, 0x91, 0x08, 0x90, 0x07, 0x92, + 0x06, 0x93, 0xb8, 0xee, 0x40, 0x0a, 0xe0, 0x88, 0xd4, 0xed, 0x02, 0x0a, + 0x04, 0x92, 0x01, 0xee, 0x10, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0xb8, 0xee, + 0x41, 0x1a, 0xdf, 0xed, 0x25, 0x1a, 0x20, 0xee, 0x80, 0x0a, 0x61, 0xee, + 0x21, 0x1a, 0xc0, 0xee, 0x21, 0x1a, 0xfc, 0xee, 0xe1, 0x1a, 0x01, 0x23, + 0xcd, 0xed, 0x05, 0x1a, 0x03, 0x92, 0x02, 0x92, 0x01, 0x93, 0x00, 0x92, + 0xb7, 0xee, 0x00, 0x1a, 0x20, 0x68, 0xdf, 0xed, 0x1c, 0x0a, 0x9f, 0xed, + 0x1b, 0x0a, 0x00, 0x23, 0x01, 0x21, 0x2b, 0xf0, 0x49, 0xfe, 0x12, 0xa8, + 0x00, 0x21, 0x02, 0x90, 0x01, 0x91, 0x00, 0x91, 0xe3, 0x88, 0x21, 0x79, + 0x20, 0x68, 0x03, 0x22, 0x2b, 0xf0, 0x12, 0xfd, 0x1a, 0xa8, 0x07, 0x90, + 0x00, 0x21, 0x01, 0x20, 0x00, 0x23, 0x03, 0x90, 0x01, 0x22, 0x06, 0x91, + 0x05, 0x91, 0x04, 0x93, 0x02, 0x91, 0x01, 0x92, 0x00, 0x93, 0x12, 0xa9, + 0x20, 0x68, 0x2b, 0xf0, 0x1a, 0xfd, 0x20, 0xa8, 0x00, 0xf0, 0x14, 0xf8, + 0x26, 0xa8, 0x00, 0xf0, 0x11, 0xf8, 0x20, 0x68, 0x0a, 0xa9, 0xc0, 0x46, + 0xc0, 0x46, 0x20, 0x68, 0x00, 0x23, 0x0a, 0xaa, 0x12, 0x21, 0x2c, 0xf0, + 0xd4, 0xfa, 0x34, 0xb0, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x24, 0x74, 0x49, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x90, 0x00, 0x21, 0x01, 0x20, 0x00, 0x23, + 0x03, 0x90, 0x06, 0x91, 0x05, 0x91, 0x04, 0x93, 0x02, 0x91, 0x01, 0x91, + 0x00, 0x93, 0x01, 0x22, 0x20, 0x68, 0x12, 0xa9, 0x2b, 0xf0, 0xf3, 0xbc, + 0x0a, 0x46, 0x12, 0x21, 0x2c, 0xf0, 0x0e, 0xbd, 0xf8, 0xb5, 0x2d, 0xed, + 0x02, 0x8b, 0x06, 0x46, 0x86, 0xb0, 0x0c, 0x46, 0x30, 0x68, 0x12, 0x21, + 0x2c, 0xf0, 0x9f, 0xfd, 0x07, 0x46, 0x00, 0x22, 0x39, 0x46, 0x03, 0x20, + 0x2b, 0xf0, 0x71, 0xfe, 0x05, 0x46, 0xf6, 0x88, 0x39, 0x46, 0x01, 0x20, + 0x2b, 0xf0, 0x8d, 0xfe, 0x02, 0x46, 0x31, 0x46, 0x03, 0x20, 0x2c, 0xf0, + 0x17, 0xf8, 0x02, 0xa8, 0x04, 0xa9, 0x01, 0x90, 0x00, 0x91, 0xb0, 0xee, + 0x40, 0x8a, 0x01, 0x23, 0x00, 0x22, 0x39, 0x46, 0x01, 0x20, 0x2b, 0xf0, + 0x95, 0xfe, 0xdd, 0xe9, 0x04, 0x01, 0xb0, 0xee, 0x48, 0x0a, 0x2b, 0xf0, + 0x09, 0xff, 0x84, 0xed, 0x00, 0x0a, 0xdd, 0xe9, 0x02, 0x01, 0xb0, 0xee, + 0x48, 0x0a, 0x2b, 0xf0, 0x01, 0xff, 0x84, 0xed, 0x01, 0x0a, 0x06, 0xb0, + 0x28, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xf2, 0xbd, 0x69, 0x46, 0x91, 0xec, + 0x02, 0x0a, 0x03, 0xb0, 0x00, 0xbd, 0x00, 0xb5, 0x83, 0xb0, 0x11, 0xee, + 0x90, 0x1a, 0x00, 0x91, 0x11, 0xee, 0x10, 0x0a, 0x03, 0x46, 0x10, 0xee, + 0x90, 0x1a, 0x10, 0xee, 0x10, 0x0a, 0x0a, 0x46, 0x01, 0x46, 0x01, 0xa8, + 0x39, 0xf0, 0x40, 0xfb, 0x01, 0xa9, 0xe8, 0xe7, 0x00, 0xb5, 0x83, 0xb0, + 0x11, 0xee, 0x90, 0x1a, 0x00, 0x91, 0x11, 0xee, 0x10, 0x0a, 0x03, 0x46, + 0x10, 0xee, 0x90, 0x1a, 0x10, 0xee, 0x10, 0x0a, 0x0a, 0x46, 0x01, 0x46, + 0x01, 0xa8, 0x39, 0xf0, 0x3a, 0xfb, 0x01, 0xa9, 0xd5, 0xe7, 0x00, 0xb5, + 0x83, 0xb0, 0x11, 0xee, 0x90, 0x1a, 0x00, 0x91, 0x11, 0xee, 0x10, 0x0a, + 0x03, 0x46, 0x10, 0xee, 0x90, 0x1a, 0x10, 0xee, 0x10, 0x0a, 0x0a, 0x46, + 0x01, 0x46, 0x01, 0xa8, 0x39, 0xf0, 0x3b, 0xfb, 0x01, 0xa9, 0xc2, 0xe7, + 0x00, 0xb5, 0x83, 0xb0, 0x11, 0xee, 0x90, 0x1a, 0x00, 0x91, 0x11, 0xee, + 0x10, 0x0a, 0x03, 0x46, 0x10, 0xee, 0x90, 0x1a, 0x10, 0xee, 0x10, 0x0a, + 0x0a, 0x46, 0x01, 0x46, 0x01, 0xa8, 0x39, 0xf0, 0x3d, 0xfb, 0x01, 0xa9, + 0xaf, 0xe7, 0xe0, 0xb5, 0x10, 0xee, 0x10, 0x1a, 0x68, 0x46, 0x39, 0xf0, + 0x51, 0xfb, 0xa7, 0xe7, 0xe0, 0xb5, 0x10, 0xee, 0x10, 0x1a, 0x68, 0x46, + 0x39, 0xf0, 0x52, 0xfb, 0xa0, 0xe7, 0x38, 0xb5, 0x0d, 0x46, 0x04, 0x46, + 0x69, 0x46, 0x1a, 0xf0, 0x26, 0xf9, 0x05, 0xf1, 0x08, 0x01, 0x20, 0x46, + 0x0c, 0xf0, 0x4e, 0xfc, 0x2c, 0x60, 0x00, 0x98, 0x68, 0x60, 0x20, 0x46, + 0x0d, 0xf0, 0xd5, 0xfb, 0xe8, 0x60, 0x00, 0x98, 0x0d, 0xf0, 0xee, 0xfb, + 0x28, 0x61, 0x20, 0x46, 0x0d, 0xf0, 0xbe, 0xfa, 0x68, 0x61, 0x20, 0x46, + 0x0d, 0xf0, 0xc4, 0xfa, 0xa8, 0x61, 0x00, 0x20, 0xe8, 0x61, 0x28, 0x62, + 0x31, 0xbd, 0xf8, 0xb5, 0x05, 0x46, 0x14, 0x46, 0x2a, 0x6a, 0x50, 0x20, + 0x42, 0x43, 0xa8, 0x18, 0x1e, 0x46, 0x00, 0xf1, 0x24, 0x07, 0x19, 0xb1, + 0x24, 0x22, 0x38, 0x46, 0xff, 0xf7, 0x22, 0xf8, 0x2c, 0xb1, 0x20, 0x22, + 0x21, 0x46, 0x07, 0xf1, 0x24, 0x00, 0xff, 0xf7, 0x1b, 0xf8, 0x0a, 0x9c, + 0xbd, 0xf9, 0x24, 0x30, 0xbd, 0xf9, 0x20, 0x20, 0x07, 0x98, 0x06, 0x99, + 0x07, 0xf8, 0x44, 0x6f, 0xb8, 0x70, 0x79, 0x70, 0xba, 0x80, 0xfb, 0x80, + 0xbc, 0x60, 0x28, 0x6a, 0x40, 0x1c, 0x00, 0xf0, 0x0f, 0x00, 0x28, 0x62, + 0xe8, 0x69, 0x0f, 0x28, 0x9c, 0xbf, 0x40, 0x1c, 0xe8, 0x61, 0xf1, 0xbd, + 0x08, 0x31, 0x0c, 0xf0, 0x05, 0xbc, 0x00, 0x00, 0x10, 0xee, 0x10, 0x0a, + 0xc0, 0xf3, 0xc7, 0x51, 0x7e, 0x39, 0x0e, 0xd4, 0xc2, 0x17, 0xd1, 0xf1, + 0x20, 0x01, 0x06, 0xdd, 0x00, 0x02, 0x40, 0xf0, 0x00, 0x40, 0xc8, 0x40, + 0x50, 0x41, 0x50, 0x40, 0x70, 0x47, 0xd0, 0x43, 0x80, 0xf0, 0x00, 0x40, + 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x49, 0x6e, 0x69, 0x74, + 0x43, 0x61, 0x6c, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x3a, 0x20, 0x6c, 0x61, + 0x6e, 0x65, 0x25, 0x64, 0x2c, 0x20, 0x66, 0x73, 0x6d, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x3a, 0x20, 0x25, 0x64, 0x20, 0x65, 0x72, 0x72, 0x53, 0x65, + 0x72, 0x64, 0x65, 0x73, 0x3a, 0x20, 0x25, 0x64, 0x20, 0x65, 0x72, 0x72, + 0x3a, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x4a, 0x54, 0x78, 0x20, + 0x73, 0x72, 0x73, 0x74, 0x20, 0x70, 0x75, 0x6c, 0x73, 0x65, 0x20, 0x3a, + 0x20, 0x69, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x25, + 0x64, 0x20, 0x2c, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x30, 0x78, 0x25, + 0x78, 0x20, 0x74, 0x6f, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x3a, 0x20, 0x62, 0x61, 0x73, 0x65, + 0x20, 0x25, 0x58, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x64, 0x2c, + 0x20, 0x65, 0x72, 0x72, 0x20, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, + 0x25, 0x78, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x3a, 0x20, 0x25, 0x78, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x60, 0x00, 0x80, 0x97, 0x60, + 0x00, 0x80, 0xa7, 0x60, 0x00, 0x80, 0xb7, 0x60, 0x00, 0x80, 0xc7, 0x60, + 0x00, 0x80, 0xd7, 0x60, 0x00, 0x80, 0xe7, 0x60, 0x00, 0x80, 0xf7, 0x60, + 0x00, 0x00, 0x09, 0x48, 0x00, 0x00, 0x30, 0x47, 0x00, 0x00, 0x40, 0x47, + 0x00, 0x00, 0x06, 0x48, 0x00, 0x24, 0xf4, 0x48, 0x00, 0x00, 0x70, 0x42, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x24, 0xf4, 0x48, 0x00, 0x00, 0x70, 0x42, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x24, 0xf4, 0x48, 0x00, 0x00, 0x70, 0x42, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x24, 0x74, 0x49, 0x00, 0x00, 0x70, 0x42, + 0x0a, 0x00, 0x00, 0x00, 0x44, 0x41, 0x43, 0x20, 0x63, 0x6c, 0x6f, 0x63, + 0x6b, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x69, 0x6e, 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x31, 0x2e, 0x34, 0x20, 0x2d, 0x20, 0x33, 0x2e, 0x30, 0x20, + 0x47, 0x48, 0x7a, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x2d, 0xe9, 0xf0, 0x4f, 0x05, 0x46, 0x89, 0x46, + 0x98, 0x46, 0x16, 0x46, 0x09, 0x9b, 0x0a, 0x98, 0x0b, 0x99, 0x00, 0x22, + 0x00, 0xe0, 0x22, 0x46, 0x4a, 0x45, 0x2f, 0xd2, 0x00, 0x27, 0x54, 0x1c, + 0x00, 0xe0, 0x7f, 0x1c, 0x9f, 0x42, 0xf6, 0xd2, 0x03, 0xfb, 0x02, 0x7c, + 0x4f, 0xf0, 0x00, 0x0e, 0x41, 0xf8, 0x2c, 0xe0, 0xb6, 0x45, 0xf4, 0xd2, + 0x0e, 0xf1, 0x01, 0x0a, 0x96, 0x45, 0x39, 0xbf, 0x04, 0xfb, 0x02, 0xfb, + 0x0e, 0xeb, 0x5b, 0x0b, 0x0a, 0xfb, 0x0e, 0xfb, 0x02, 0xeb, 0x5b, 0x0b, + 0x05, 0xeb, 0x8b, 0x0b, 0x00, 0xfb, 0x07, 0xee, 0x9b, 0xed, 0x00, 0x0a, + 0x08, 0xeb, 0x8e, 0x0e, 0x01, 0xeb, 0x8c, 0x0b, 0xde, 0xed, 0x00, 0x0a, + 0x9b, 0xed, 0x00, 0x1a, 0x01, 0xeb, 0x8c, 0x0e, 0x00, 0xee, 0x20, 0x1a, + 0x8e, 0xed, 0x00, 0x1a, 0xd6, 0x46, 0xdb, 0xe7, 0xbd, 0xe8, 0xf0, 0x8f, + 0x2d, 0xe9, 0xf0, 0x4f, 0x80, 0x46, 0x09, 0x9d, 0x0a, 0x98, 0x0b, 0x99, + 0x00, 0x22, 0x00, 0xe0, 0x52, 0x1c, 0xaa, 0x42, 0x3d, 0xd2, 0x4f, 0xf0, + 0x00, 0x0e, 0x01, 0xe0, 0x0e, 0xf1, 0x01, 0x0e, 0xae, 0x45, 0xf5, 0xd2, + 0x05, 0xfb, 0x02, 0xe4, 0x00, 0x26, 0x41, 0xf8, 0x24, 0x60, 0x37, 0x46, + 0x87, 0x42, 0xf3, 0xd2, 0x4f, 0xf0, 0x00, 0x0c, 0x7e, 0x1c, 0x84, 0x45, + 0xf7, 0xd2, 0x0c, 0xf1, 0x01, 0x09, 0xbc, 0x45, 0x39, 0xbf, 0x06, 0xfb, + 0x07, 0xfa, 0x0c, 0xeb, 0x5a, 0x0a, 0x09, 0xfb, 0x0c, 0xfa, 0x07, 0xeb, + 0x5a, 0x0a, 0x08, 0xeb, 0x8a, 0x0b, 0x00, 0xfb, 0x02, 0x7a, 0x03, 0xeb, + 0x8a, 0x0a, 0x00, 0xfb, 0x0e, 0xcc, 0x9b, 0xed, 0x00, 0x0a, 0xda, 0xed, + 0x00, 0x0a, 0x03, 0xeb, 0x8c, 0x0c, 0x01, 0xeb, 0x84, 0x0a, 0x20, 0xee, + 0x20, 0x0a, 0x9c, 0xed, 0x00, 0x1a, 0xda, 0xed, 0x00, 0x0a, 0x01, 0xeb, + 0x84, 0x0c, 0x40, 0xee, 0x01, 0x0a, 0xcc, 0xed, 0x00, 0x0a, 0xcc, 0x46, + 0xd3, 0xe7, 0xbd, 0xe8, 0xf0, 0x8f, 0x03, 0x46, 0x30, 0xb5, 0x51, 0x43, + 0x00, 0x22, 0x0a, 0xe0, 0x00, 0xeb, 0x82, 0x04, 0x03, 0xeb, 0x82, 0x05, + 0xd4, 0xed, 0x00, 0x0a, 0x60, 0xee, 0x80, 0x0a, 0xc5, 0xed, 0x00, 0x0a, + 0x52, 0x1c, 0x8a, 0x42, 0xf2, 0xd3, 0x30, 0xbd, 0x2d, 0xe9, 0xf0, 0x43, + 0x08, 0x9c, 0x09, 0x9d, 0x00, 0x26, 0x15, 0xe0, 0x02, 0xfb, 0x06, 0x7c, + 0x04, 0xfb, 0x06, 0x78, 0x00, 0xeb, 0x8c, 0x0e, 0x03, 0xeb, 0x88, 0x09, + 0x9e, 0xed, 0x00, 0x0a, 0xd9, 0xed, 0x00, 0x0a, 0x05, 0xeb, 0x8c, 0x0c, + 0x60, 0xee, 0x20, 0x0a, 0xcc, 0xed, 0x00, 0x0a, 0x7f, 0x1c, 0x97, 0x42, + 0xea, 0xd3, 0x76, 0x1c, 0x8e, 0x42, 0x38, 0xbf, 0x00, 0x27, 0xf8, 0xd3, + 0xbd, 0xe8, 0xf0, 0x83, 0x2d, 0xe9, 0xf0, 0x43, 0x08, 0x9c, 0x09, 0x9d, + 0x00, 0x26, 0x15, 0xe0, 0x02, 0xfb, 0x06, 0x7c, 0x04, 0xfb, 0x06, 0x78, + 0x00, 0xeb, 0x8c, 0x0e, 0x03, 0xeb, 0x88, 0x09, 0x9e, 0xed, 0x00, 0x0a, + 0xd9, 0xed, 0x00, 0x0a, 0x05, 0xeb, 0x8c, 0x0c, 0xc0, 0xee, 0x20, 0x0a, + 0xcc, 0xed, 0x00, 0x0a, 0x7f, 0x1c, 0x97, 0x42, 0xea, 0xd3, 0x76, 0x1c, + 0x8e, 0x42, 0x38, 0xbf, 0x00, 0x27, 0xf8, 0xd3, 0xbd, 0xe8, 0xf0, 0x83, + 0x2d, 0xe9, 0xf0, 0x4f, 0x04, 0x46, 0x88, 0x46, 0x0a, 0x98, 0x0b, 0x99, + 0x4f, 0xf0, 0x00, 0x0e, 0x1e, 0xe0, 0x02, 0xfb, 0x0e, 0xc9, 0x04, 0xeb, + 0x89, 0x09, 0x00, 0xfb, 0x05, 0xca, 0x99, 0xed, 0x00, 0x0a, 0x03, 0xeb, + 0x8a, 0x0b, 0x01, 0xeb, 0x87, 0x09, 0xdb, 0xed, 0x00, 0x0a, 0x99, 0xed, + 0x00, 0x1a, 0x01, 0xeb, 0x87, 0x0a, 0x00, 0xee, 0x60, 0x1a, 0x8a, 0xed, + 0x00, 0x1a, 0x0c, 0xf1, 0x01, 0x0c, 0x94, 0x45, 0xe5, 0xd3, 0x35, 0x46, + 0x45, 0x45, 0x04, 0xd3, 0x0e, 0xf1, 0x01, 0x0e, 0xc6, 0x45, 0x08, 0xd2, + 0x75, 0x46, 0x6e, 0x1c, 0x06, 0xfb, 0x05, 0xf7, 0x4f, 0xf0, 0x00, 0x0c, + 0x0e, 0xeb, 0x57, 0x07, 0xed, 0xe7, 0xbd, 0xe8, 0xf0, 0x8f, 0x70, 0xb5, + 0x00, 0x23, 0x10, 0xe0, 0x00, 0xf0, 0x2c, 0xf8, 0x00, 0xeb, 0x85, 0x06, + 0x02, 0xeb, 0x83, 0x03, 0x96, 0xed, 0x00, 0x0a, 0xd3, 0xed, 0x00, 0x0a, + 0x00, 0xeb, 0x85, 0x05, 0x70, 0xee, 0x20, 0x0a, 0xc5, 0xed, 0x00, 0x0a, + 0x23, 0x46, 0x8b, 0x42, 0xec, 0xd3, 0x70, 0xbd, 0x70, 0xb5, 0x00, 0x23, + 0x13, 0xe0, 0x00, 0xf0, 0x15, 0xf8, 0x02, 0xeb, 0x83, 0x03, 0x00, 0xeb, + 0x85, 0x06, 0x93, 0xed, 0x00, 0x0a, 0xd6, 0xed, 0x00, 0x0a, 0xb4, 0xee, + 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xbf, 0x00, 0xeb, 0x85, 0x03, + 0x83, 0xed, 0x00, 0x0a, 0x23, 0x46, 0x8b, 0x42, 0xe9, 0xd3, 0x70, 0xbd, + 0x5c, 0x1c, 0x04, 0xfb, 0x03, 0xf5, 0x03, 0xeb, 0x55, 0x05, 0x70, 0x47, + 0x93, 0x42, 0x02, 0xd2, 0x11, 0x46, 0x1a, 0x46, 0x0b, 0x46, 0x59, 0x1c, + 0x4b, 0x43, 0x02, 0xeb, 0x53, 0x02, 0x00, 0xeb, 0x82, 0x00, 0x90, 0xed, + 0x00, 0x0a, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x47, 0x05, 0x46, 0x8e, 0x46, + 0x09, 0x98, 0x0a, 0x99, 0x00, 0x24, 0x00, 0xe0, 0x64, 0x1c, 0x74, 0x45, + 0x23, 0xd2, 0x4f, 0xf0, 0x00, 0x0c, 0x1a, 0xe0, 0x02, 0xfb, 0x04, 0x78, + 0x05, 0xeb, 0x88, 0x08, 0x00, 0xfb, 0x07, 0xc9, 0x98, 0xed, 0x00, 0x0a, + 0x03, 0xeb, 0x89, 0x0a, 0x01, 0xeb, 0x86, 0x08, 0xda, 0xed, 0x00, 0x0a, + 0x98, 0xed, 0x00, 0x1a, 0x01, 0xeb, 0x86, 0x09, 0x00, 0xee, 0x20, 0x1a, + 0x89, 0xed, 0x00, 0x1a, 0x7f, 0x1c, 0x97, 0x42, 0xe6, 0xd3, 0x0c, 0xf1, + 0x01, 0x0c, 0x84, 0x45, 0xdc, 0xd2, 0x00, 0x27, 0x00, 0xfb, 0x04, 0xc6, + 0xf5, 0xe7, 0xbd, 0xe8, 0xf0, 0x87, 0x2d, 0xe9, 0xf0, 0x47, 0x05, 0x46, + 0x8e, 0x46, 0x09, 0x98, 0x0a, 0x99, 0x00, 0x24, 0x00, 0xe0, 0x64, 0x1c, + 0x74, 0x45, 0x23, 0xd2, 0x4f, 0xf0, 0x00, 0x0c, 0x1a, 0xe0, 0x02, 0xfb, + 0x04, 0x78, 0x05, 0xeb, 0x88, 0x08, 0x00, 0xfb, 0x07, 0xc9, 0x98, 0xed, + 0x00, 0x0a, 0x03, 0xeb, 0x89, 0x0a, 0x01, 0xeb, 0x86, 0x08, 0xda, 0xed, + 0x00, 0x0a, 0x98, 0xed, 0x00, 0x1a, 0x01, 0xeb, 0x86, 0x09, 0x00, 0xee, + 0x60, 0x1a, 0x89, 0xed, 0x00, 0x1a, 0x7f, 0x1c, 0x97, 0x42, 0xe6, 0xd3, + 0x0c, 0xf1, 0x01, 0x0c, 0x84, 0x45, 0xdc, 0xd2, 0x00, 0x27, 0x00, 0xfb, + 0x04, 0xc6, 0xf5, 0xe7, 0xbd, 0xe8, 0xf0, 0x87, 0x2d, 0xe9, 0xf0, 0x4f, + 0x00, 0xf0, 0x2c, 0xf8, 0x00, 0xe0, 0x52, 0x1c, 0x42, 0x45, 0x25, 0xd2, + 0x4f, 0xf0, 0x00, 0x0e, 0x1b, 0xe0, 0x06, 0xfb, 0x02, 0xc9, 0x05, 0xeb, + 0x89, 0x09, 0x00, 0xfb, 0x0e, 0xca, 0x99, 0xed, 0x00, 0x0a, 0x03, 0xeb, + 0x8a, 0x0b, 0x01, 0xeb, 0x87, 0x09, 0xdb, 0xed, 0x00, 0x0a, 0x99, 0xed, + 0x00, 0x1a, 0x01, 0xeb, 0x87, 0x0a, 0x00, 0xee, 0x20, 0x1a, 0x8a, 0xed, + 0x00, 0x1a, 0x0c, 0xf1, 0x01, 0x0c, 0xb4, 0x45, 0xe5, 0xd3, 0x0e, 0xf1, + 0x01, 0x0e, 0xa6, 0x45, 0xdb, 0xd2, 0x4f, 0xf0, 0x00, 0x0c, 0x04, 0xfb, + 0x02, 0xe7, 0xf4, 0xe7, 0xbd, 0xe8, 0xf0, 0x8f, 0x05, 0x46, 0x88, 0x46, + 0x16, 0x46, 0x09, 0x9c, 0x0a, 0x98, 0x0b, 0x99, 0x00, 0x22, 0x70, 0x47, + 0x2d, 0xe9, 0xfe, 0x43, 0x0b, 0x9e, 0x00, 0xf0, 0x1d, 0xf8, 0x02, 0x97, + 0x01, 0x96, 0x4b, 0x46, 0x0a, 0x9a, 0x00, 0x92, 0x29, 0x46, 0x42, 0x46, + 0x20, 0x46, 0xff, 0xf7, 0x57, 0xff, 0xbd, 0xe8, 0xf7, 0x83, 0x2d, 0xe9, + 0xfe, 0x43, 0x0a, 0x9e, 0x00, 0xf0, 0x0c, 0xf8, 0x02, 0x97, 0x4b, 0x46, + 0x0b, 0x9a, 0x01, 0x92, 0x00, 0x96, 0x42, 0x46, 0x29, 0x46, 0x20, 0x46, + 0xff, 0xf7, 0xa8, 0xff, 0xbd, 0xe8, 0xf7, 0x83, 0x0c, 0x9f, 0x0d, 0x46, + 0x04, 0x46, 0x06, 0xfb, 0x05, 0xf1, 0x90, 0x46, 0x99, 0x46, 0x89, 0x00, + 0x38, 0x46, 0x10, 0xf0, 0xc5, 0xbe, 0xf8, 0xb5, 0x05, 0x46, 0x2d, 0xed, + 0x0a, 0x8b, 0x28, 0x68, 0x0c, 0x46, 0x39, 0xf0, 0xbd, 0xf9, 0x41, 0xec, + 0x18, 0x0b, 0x68, 0x68, 0x39, 0xf0, 0xb8, 0xf9, 0x41, 0xec, 0x19, 0x0b, + 0xa8, 0x68, 0x39, 0xf0, 0xb3, 0xf9, 0x41, 0xec, 0x1a, 0x0b, 0xe8, 0x68, + 0x39, 0xf0, 0xae, 0xf9, 0x41, 0xec, 0x1b, 0x0b, 0x53, 0xec, 0x18, 0x2b, + 0x32, 0xf0, 0xc2, 0xfa, 0x06, 0x46, 0x0f, 0x46, 0x53, 0xec, 0x19, 0x2b, + 0x51, 0xec, 0x1a, 0x0b, 0x32, 0xf0, 0xba, 0xfa, 0x02, 0x46, 0x0b, 0x46, + 0x30, 0x46, 0x39, 0x46, 0x32, 0xf0, 0x42, 0xfa, 0x41, 0xec, 0x1c, 0x0b, + 0x51, 0xec, 0x1b, 0x0b, 0x53, 0xec, 0x1c, 0x2b, 0x32, 0xf0, 0xf4, 0xf8, + 0x39, 0xf0, 0xb4, 0xf9, 0x20, 0x60, 0x53, 0xec, 0x1c, 0x2b, 0x51, 0xec, + 0x19, 0x0b, 0x32, 0xf0, 0xeb, 0xf8, 0x81, 0xf0, 0x00, 0x41, 0x39, 0xf0, + 0xa9, 0xf9, 0x60, 0x60, 0x53, 0xec, 0x1c, 0x2b, 0x51, 0xec, 0x1a, 0x0b, + 0x32, 0xf0, 0xe0, 0xf8, 0x81, 0xf0, 0x00, 0x41, 0x39, 0xf0, 0x9e, 0xf9, + 0xa0, 0x60, 0x53, 0xec, 0x1c, 0x2b, 0x51, 0xec, 0x18, 0x0b, 0x32, 0xf0, + 0xd5, 0xf8, 0x39, 0xf0, 0x95, 0xf9, 0xe0, 0x60, 0xbd, 0xec, 0x0a, 0x8b, + 0xf1, 0xbd, 0x00, 0x2b, 0x00, 0xd1, 0x70, 0x47, 0x70, 0xb5, 0x04, 0x9c, + 0x00, 0x25, 0x63, 0x43, 0x4c, 0xb1, 0x06, 0xe0, 0x00, 0xf0, 0x08, 0xf8, + 0x70, 0xee, 0x20, 0x0a, 0xc4, 0xed, 0x00, 0x0a, 0x6d, 0x1c, 0x9d, 0x42, + 0xf6, 0xd1, 0x70, 0xbd, 0x00, 0xeb, 0x85, 0x04, 0x01, 0xeb, 0x85, 0x06, + 0x94, 0xed, 0x00, 0x0a, 0xd6, 0xed, 0x00, 0x0a, 0x02, 0xeb, 0x85, 0x04, + 0x70, 0x47, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, + 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, + 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x00, 0x04, + 0x00, 0x05, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, 0x00, 0x06, 0x00, 0x08, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, + 0x00, 0x02, 0x00, 0x05, 0x00, 0x06, 0x00, 0x08, 0x00, 0x02, 0x00, 0x05, + 0x00, 0x06, 0x00, 0x08, 0x00, 0x02, 0x00, 0x05, 0x00, 0x06, 0x00, 0x08, + 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, + 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, + 0x00, 0x06, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0b, + 0x00, 0x0e, 0x00, 0x10, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, + 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, + 0x00, 0x06, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0b, + 0x00, 0x0e, 0x00, 0x10, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, + 0x00, 0x04, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0b, + 0x00, 0x0e, 0x00, 0x10, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1b, 0x00, 0x20, + 0x00, 0x10, 0x00, 0x16, 0x00, 0x1b, 0x00, 0x20, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, + 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x16, 0x00, 0x1b, 0x00, 0x20, 0x00, 0x10, 0x00, 0x16, + 0x00, 0x1b, 0x00, 0x20, 0x2d, 0xe9, 0xf0, 0x41, 0x05, 0x46, 0x0c, 0x46, + 0x00, 0x27, 0x05, 0xf1, 0x50, 0x06, 0xf4, 0xb1, 0x20, 0x68, 0x68, 0x60, + 0x60, 0x68, 0x28, 0x60, 0xa8, 0x60, 0x28, 0x68, 0x00, 0xf5, 0x00, 0x50, + 0xe8, 0x60, 0x29, 0x68, 0x01, 0xf5, 0xd0, 0x41, 0x29, 0x61, 0x28, 0x68, + 0x00, 0xf5, 0x30, 0x40, 0x68, 0x61, 0xa0, 0x68, 0x70, 0x60, 0xe1, 0x68, + 0xb1, 0x60, 0x20, 0x69, 0xf0, 0x60, 0x28, 0x46, 0x21, 0x6a, 0x31, 0x61, + 0x22, 0x6b, 0x72, 0x61, 0x00, 0xf0, 0x70, 0xf9, 0x07, 0x46, 0xb0, 0x68, + 0x01, 0x21, 0x80, 0xf8, 0x27, 0x10, 0x00, 0x21, 0x70, 0x68, 0x31, 0x70, + 0x00, 0x22, 0x72, 0x70, 0xc1, 0x7f, 0xb0, 0x68, 0x80, 0xf8, 0x2b, 0x10, + 0xb0, 0x68, 0x02, 0x60, 0x01, 0x20, 0xb1, 0x68, 0x4a, 0x60, 0xb1, 0x68, + 0x8a, 0x60, 0xb1, 0x68, 0xca, 0x60, 0xb1, 0x68, 0x0a, 0x61, 0xb1, 0x68, + 0xc8, 0x76, 0x0c, 0x20, 0xb1, 0x68, 0x88, 0x76, 0x05, 0x20, 0xb1, 0x68, + 0x48, 0x76, 0xb1, 0x68, 0x81, 0xf8, 0x2f, 0x20, 0x70, 0x68, 0x01, 0x6a, + 0xb0, 0x68, 0x41, 0x63, 0x71, 0x68, 0xc8, 0x7b, 0xb1, 0x68, 0x81, 0xf8, + 0x20, 0x00, 0x70, 0x68, 0x40, 0x7e, 0x10, 0xb1, 0x01, 0x28, 0x1b, 0xd1, + 0xd4, 0xb1, 0x28, 0x46, 0x00, 0xf0, 0xb5, 0xfc, 0x71, 0x68, 0x07, 0x43, + 0x48, 0x7f, 0x50, 0xb1, 0x28, 0x46, 0x00, 0xf0, 0xc5, 0xfd, 0x80, 0x46, + 0x28, 0x46, 0x00, 0xf0, 0x7a, 0xfe, 0x40, 0xea, 0x08, 0x00, 0x07, 0x43, + 0x02, 0xe0, 0xb1, 0x68, 0x81, 0xf8, 0x23, 0x00, 0x28, 0x46, 0x00, 0xf0, + 0xdd, 0xfe, 0x28, 0x46, 0x00, 0xf0, 0xc5, 0xfe, 0x28, 0x46, 0x00, 0xf0, + 0x91, 0xfc, 0x28, 0x46, 0x00, 0xf0, 0xd4, 0xff, 0x21, 0x46, 0x28, 0x46, + 0x00, 0xf0, 0x4d, 0xf9, 0x04, 0x46, 0x28, 0x46, 0x01, 0xf0, 0x79, 0xfa, + 0xb1, 0x68, 0x02, 0x20, 0x81, 0xf8, 0x27, 0x00, 0xa9, 0x68, 0x03, 0x48, + 0x08, 0x60, 0x44, 0xea, 0x07, 0x00, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x00, + 0xfe, 0xca, 0xad, 0xab, 0x70, 0xb5, 0x04, 0x46, 0x01, 0xf0, 0x9f, 0xfa, + 0x05, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x1a, 0xfc, 0x04, 0xf1, 0x50, 0x06, + 0x05, 0x43, 0x30, 0x78, 0x01, 0x28, 0x04, 0xd1, 0x00, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0x5e, 0xff, 0x19, 0xe0, 0x02, 0x28, 0x01, 0xd0, 0x03, 0x28, + 0x03, 0xd1, 0x20, 0x46, 0x00, 0xf0, 0x33, 0xfa, 0x11, 0xe0, 0x05, 0x28, + 0x03, 0xd1, 0x20, 0x46, 0x00, 0xf0, 0x54, 0xfb, 0x04, 0xe0, 0x04, 0x28, + 0x04, 0xd1, 0x20, 0x46, 0x00, 0xf0, 0xaa, 0xfb, 0x05, 0x43, 0x09, 0xe0, + 0x06, 0x28, 0x07, 0xd1, 0x20, 0x46, 0x00, 0xf0, 0xb0, 0xfb, 0x05, 0x43, + 0xb0, 0x68, 0xc1, 0x68, 0x49, 0x1c, 0xc1, 0x60, 0x20, 0x46, 0x01, 0xf0, + 0x08, 0xfb, 0x28, 0x43, 0x70, 0xbd, 0x38, 0xb5, 0x8d, 0xf8, 0x00, 0x10, + 0x00, 0x25, 0x9d, 0xf8, 0x00, 0x10, 0x8d, 0xf8, 0x01, 0x20, 0x05, 0x29, + 0x18, 0xbf, 0x04, 0x29, 0x04, 0x46, 0x18, 0xd1, 0xea, 0xb9, 0x69, 0x46, + 0x04, 0xf1, 0x28, 0x00, 0x01, 0xf0, 0x77, 0xfb, 0x01, 0x00, 0x0e, 0xd0, + 0xa1, 0x6d, 0x0a, 0x68, 0x42, 0xf0, 0x00, 0x72, 0x0a, 0x60, 0x61, 0x6d, + 0x0a, 0x68, 0xa1, 0x6d, 0x93, 0x01, 0x91, 0xf8, 0x2f, 0x20, 0x48, 0xbf, + 0x01, 0x25, 0x00, 0xf0, 0xd4, 0xf8, 0x28, 0x46, 0x32, 0xbd, 0x00, 0x29, + 0x1c, 0xbf, 0x01, 0x29, 0x06, 0x29, 0x0b, 0xd1, 0x9a, 0xb1, 0xa0, 0x6d, + 0x01, 0x68, 0x41, 0xf0, 0x80, 0x71, 0x01, 0x60, 0x60, 0x6d, 0x01, 0x68, + 0xca, 0x01, 0xee, 0xd5, 0x01, 0x25, 0xec, 0xe7, 0x02, 0x29, 0x18, 0xbf, + 0x03, 0x29, 0xf0, 0xd1, 0x01, 0x2a, 0x1c, 0xbf, 0x02, 0x2a, 0x03, 0x2a, + 0xeb, 0xd1, 0x69, 0x46, 0x04, 0xf1, 0x30, 0x00, 0xcc, 0xe7, 0x80, 0x6d, + 0x90, 0xf8, 0x27, 0x00, 0x70, 0x47, 0x80, 0x6d, 0x00, 0x68, 0x70, 0x47, + 0xf8, 0xb5, 0x06, 0x46, 0x0c, 0x46, 0xb0, 0x6d, 0x01, 0x78, 0x00, 0x25, + 0xca, 0x07, 0x10, 0xd5, 0x00, 0x27, 0x09, 0xe0, 0xf1, 0x6d, 0xfa, 0xb2, + 0x24, 0x20, 0x42, 0x43, 0x88, 0x18, 0x01, 0xf0, 0x49, 0xff, 0x00, 0xb1, + 0x01, 0x25, 0x7f, 0x1c, 0x71, 0x6d, 0x0a, 0x7f, 0xf8, 0xb2, 0x90, 0x42, + 0xf0, 0xd3, 0xb0, 0x6d, 0x01, 0x68, 0xc1, 0xf3, 0x00, 0x20, 0x40, 0xb1, + 0x70, 0x6d, 0x41, 0x7f, 0x01, 0x29, 0x04, 0xd9, 0x30, 0x6e, 0x02, 0xf0, + 0x12, 0xfb, 0x00, 0xb1, 0x01, 0x25, 0xb0, 0x6d, 0x01, 0x68, 0xc1, 0xf3, + 0x00, 0x40, 0x40, 0xb1, 0x70, 0x6d, 0x41, 0x7f, 0x01, 0x29, 0x04, 0xd9, + 0x70, 0x6e, 0x02, 0xf0, 0x36, 0xfc, 0x00, 0xb1, 0x01, 0x25, 0xb0, 0x6d, + 0x01, 0x68, 0x21, 0xea, 0x04, 0x04, 0x04, 0x60, 0x28, 0x46, 0xf2, 0xbd, + 0x10, 0xb5, 0x84, 0x68, 0x03, 0x23, 0x4a, 0x00, 0x93, 0x40, 0x44, 0xf8, + 0x8c, 0x3f, 0x01, 0x22, 0x80, 0x6d, 0x08, 0x44, 0x80, 0xf8, 0x30, 0x20, + 0x10, 0xbd, 0x38, 0xb5, 0x05, 0x46, 0x00, 0x24, 0x00, 0x20, 0x11, 0xb1, + 0x02, 0x29, 0x0a, 0xd0, 0x02, 0xe0, 0x28, 0x6e, 0x02, 0xf0, 0xf7, 0xfa, + 0x18, 0xb1, 0x00, 0xf0, 0x24, 0xf8, 0x48, 0xbf, 0x01, 0x24, 0x20, 0x46, + 0x32, 0xbd, 0x11, 0x78, 0x28, 0x46, 0x01, 0xf0, 0x7e, 0xf9, 0xf8, 0xe7, + 0x70, 0xb5, 0x05, 0x46, 0x16, 0x46, 0x00, 0x24, 0x00, 0x20, 0x19, 0xb1, + 0x02, 0x29, 0x0d, 0xd0, 0x0a, 0xd3, 0x02, 0xe0, 0x28, 0x6e, 0x02, 0xf0, + 0xe6, 0xfa, 0x18, 0xb1, 0x00, 0xf0, 0x0b, 0xf8, 0x48, 0xbf, 0x01, 0x24, + 0x20, 0x46, 0x70, 0xbd, 0x01, 0x21, 0xf3, 0xe7, 0x28, 0x46, 0x01, 0xf0, + 0x6a, 0xf9, 0x30, 0x70, 0xf6, 0xe7, 0xa8, 0x6d, 0x01, 0x68, 0x41, 0xf4, + 0x80, 0x71, 0x01, 0x60, 0x68, 0x6d, 0x01, 0x68, 0xca, 0x05, 0x70, 0x47, + 0x70, 0xb5, 0x04, 0x46, 0x04, 0xf1, 0x18, 0x03, 0x02, 0x22, 0x02, 0x21, + 0x04, 0xf1, 0x28, 0x00, 0x01, 0xf0, 0x6a, 0xfa, 0x00, 0x25, 0x40, 0xb1, + 0x00, 0xf0, 0x1f, 0xf8, 0x96, 0x01, 0x91, 0xf8, 0x2f, 0x20, 0x48, 0xbf, + 0x01, 0x25, 0x00, 0xf0, 0x14, 0xf8, 0x04, 0xf1, 0x20, 0x03, 0x02, 0x22, + 0x02, 0x21, 0x04, 0xf1, 0x30, 0x00, 0x01, 0xf0, 0x57, 0xfa, 0x40, 0xb1, + 0x00, 0xf0, 0x0d, 0xf8, 0x94, 0x01, 0x91, 0xf8, 0x2f, 0x20, 0x48, 0xbf, + 0x01, 0x25, 0x00, 0xf0, 0x02, 0xf8, 0x28, 0x46, 0x70, 0xbd, 0x10, 0x43, + 0x81, 0xf8, 0x2f, 0x00, 0x70, 0x47, 0xa1, 0x6d, 0x0a, 0x68, 0x42, 0xf0, + 0x00, 0x72, 0x0a, 0x60, 0x63, 0x6d, 0x1a, 0x68, 0x70, 0x47, 0xf0, 0xb5, + 0xa7, 0xb0, 0x05, 0x46, 0x0c, 0x46, 0x00, 0x26, 0x00, 0x27, 0x37, 0xe0, + 0x00, 0x20, 0x8d, 0xf8, 0x00, 0x00, 0xa9, 0x68, 0x03, 0x91, 0x4f, 0xf4, + 0x13, 0x71, 0x60, 0x68, 0x00, 0xeb, 0xc7, 0x20, 0x00, 0xf5, 0x20, 0x50, + 0x02, 0x90, 0x79, 0x43, 0x20, 0x68, 0x00, 0xf5, 0x20, 0x50, 0x04, 0x90, + 0x20, 0x68, 0x00, 0xeb, 0x87, 0x20, 0x00, 0xf5, 0x80, 0x60, 0x05, 0x90, + 0x60, 0x69, 0x06, 0x90, 0xa0, 0x69, 0x01, 0x44, 0x07, 0x91, 0xe0, 0x69, + 0x00, 0xeb, 0x87, 0x11, 0x08, 0x91, 0x04, 0xe0, 0x00, 0x2c, 0xdb, 0xd1, + 0x01, 0x20, 0x8d, 0xf8, 0x00, 0x00, 0x24, 0x20, 0xea, 0x6d, 0x78, 0x43, + 0x69, 0x46, 0x10, 0x44, 0x01, 0xf0, 0xc0, 0xfa, 0x38, 0xb1, 0xa8, 0x6d, + 0x00, 0xf0, 0x57, 0xfa, 0x68, 0x6d, 0x01, 0x78, 0xca, 0x07, 0x48, 0xbf, + 0x01, 0x26, 0x7f, 0x1c, 0x68, 0x6d, 0x01, 0x7f, 0x8f, 0x42, 0x19, 0xd2, + 0x8d, 0xf8, 0x01, 0x70, 0xa8, 0x6d, 0x01, 0x7f, 0x8d, 0xf8, 0x02, 0x10, + 0x68, 0x6d, 0x81, 0x7e, 0x8d, 0xf8, 0x04, 0x10, 0xc1, 0x7e, 0x8d, 0xf8, + 0x05, 0x10, 0x41, 0x7e, 0x8d, 0xf8, 0x06, 0x10, 0x00, 0x7f, 0x01, 0x28, + 0x87, 0xbf, 0x1f, 0x21, 0x8d, 0xf8, 0x03, 0x10, 0x1e, 0x20, 0x8d, 0xf8, + 0x03, 0x00, 0xcb, 0xe7, 0x40, 0x7f, 0x00, 0x28, 0x5d, 0xd0, 0xa8, 0x6d, + 0xc1, 0x7f, 0x8d, 0xf8, 0x5a, 0x10, 0xa8, 0x6d, 0x01, 0x7f, 0x8d, 0xf8, + 0x59, 0x10, 0xa8, 0x6d, 0x41, 0x7f, 0x8d, 0xf8, 0x5b, 0x10, 0x68, 0x6d, + 0x01, 0x7d, 0x8d, 0xf8, 0x5c, 0x10, 0x68, 0x6d, 0x41, 0x7d, 0x8d, 0xf8, + 0x5d, 0x10, 0x68, 0x6d, 0x81, 0x7d, 0x8d, 0xf8, 0x5e, 0x10, 0x68, 0x6d, + 0x81, 0x7e, 0x8d, 0xf8, 0x5f, 0x10, 0xc1, 0x7e, 0x8d, 0xf8, 0x60, 0x10, + 0x41, 0x7e, 0x8d, 0xf8, 0x61, 0x10, 0x1c, 0xb9, 0x01, 0x21, 0x8d, 0xf8, + 0x58, 0x10, 0x2a, 0xe0, 0x00, 0x22, 0x8d, 0xf8, 0x58, 0x20, 0xa9, 0x68, + 0x19, 0x91, 0x29, 0x69, 0x1f, 0x91, 0xe9, 0x68, 0x1a, 0x91, 0x61, 0x6a, + 0x24, 0x91, 0xa1, 0x6a, 0x25, 0x91, 0xe1, 0x6a, 0x26, 0x91, 0x00, 0x21, + 0x07, 0x7f, 0x16, 0xaa, 0xb9, 0x42, 0x02, 0xeb, 0x81, 0x02, 0x1b, 0xab, + 0x0c, 0xd2, 0x67, 0x68, 0x07, 0xeb, 0xc1, 0x27, 0x07, 0xf5, 0x20, 0x57, + 0x43, 0xf8, 0x21, 0x70, 0x63, 0x68, 0x03, 0xeb, 0xc1, 0x27, 0x07, 0xf5, + 0xe0, 0x47, 0x02, 0xe0, 0x00, 0x27, 0x43, 0xf8, 0x21, 0x70, 0x49, 0x1c, + 0x04, 0x29, 0x97, 0x62, 0xe4, 0xd3, 0x28, 0x6e, 0x16, 0xa9, 0x01, 0xf0, + 0xf1, 0xfd, 0x18, 0xb1, 0xff, 0xf7, 0x09, 0xff, 0x48, 0xbf, 0x01, 0x26, + 0x69, 0x6d, 0x48, 0x7f, 0x00, 0x28, 0x4f, 0xd0, 0xa8, 0x6d, 0xc1, 0x7f, + 0x8d, 0xf8, 0x25, 0x10, 0x68, 0x6d, 0x01, 0x7d, 0x8d, 0xf8, 0x26, 0x10, + 0x68, 0x6d, 0x41, 0x7d, 0x8d, 0xf8, 0x27, 0x10, 0x68, 0x6d, 0x81, 0x7d, + 0x8d, 0xf8, 0x28, 0x10, 0xa8, 0x6d, 0x81, 0x7f, 0x8d, 0xf8, 0x29, 0x10, + 0x68, 0x6d, 0x81, 0x7e, 0x8d, 0xf8, 0x2a, 0x10, 0xc1, 0x7e, 0x8d, 0xf8, + 0x2b, 0x10, 0x40, 0x7e, 0x8d, 0xf8, 0x2c, 0x00, 0x1c, 0xb9, 0x01, 0x21, + 0x8d, 0xf8, 0x24, 0x10, 0x1f, 0xe0, 0x00, 0x22, 0x8d, 0xf8, 0x24, 0x20, + 0x09, 0xaa, 0x68, 0x68, 0x00, 0xf5, 0x20, 0x50, 0x0c, 0x90, 0x68, 0x68, + 0x00, 0xf5, 0x10, 0x50, 0x0d, 0x90, 0x68, 0x69, 0x0e, 0x90, 0x00, 0x20, + 0x61, 0x68, 0x01, 0xeb, 0xc0, 0x21, 0x02, 0xeb, 0x80, 0x03, 0x40, 0x1c, + 0x01, 0xf5, 0x38, 0x41, 0x04, 0x28, 0x99, 0x61, 0xf4, 0xd3, 0x60, 0x6b, + 0x13, 0x90, 0xa0, 0x6b, 0x14, 0x90, 0xe0, 0x6b, 0x15, 0x90, 0x09, 0xa9, + 0x68, 0x6e, 0x02, 0xf0, 0xa0, 0xf9, 0x38, 0xb1, 0xa8, 0x6d, 0x00, 0xf0, + 0x81, 0xf9, 0x68, 0x6d, 0x01, 0x68, 0xca, 0x03, 0x48, 0xbf, 0x01, 0x26, + 0x30, 0x46, 0x27, 0xb0, 0xf0, 0xbd, 0x2d, 0xe9, 0xf0, 0x47, 0x82, 0x46, + 0x0a, 0xf1, 0x50, 0x05, 0x00, 0x26, 0x28, 0x78, 0xaa, 0x68, 0x69, 0x68, + 0x00, 0x24, 0x02, 0x28, 0x4f, 0xf0, 0x00, 0x08, 0xa1, 0x46, 0x02, 0xf1, + 0x23, 0x03, 0x18, 0xd1, 0x88, 0x7f, 0x1f, 0x7a, 0xb8, 0x42, 0x1b, 0xd3, + 0x10, 0x7f, 0x5c, 0x7a, 0x52, 0x7f, 0xa0, 0x42, 0x08, 0x7b, 0x14, 0xbf, + 0x01, 0x24, 0x00, 0x24, 0x04, 0x40, 0x98, 0x7a, 0x82, 0x42, 0x48, 0x7b, + 0x18, 0xbf, 0x4f, 0xf0, 0x01, 0x09, 0x00, 0xea, 0x09, 0x09, 0x50, 0x46, + 0x00, 0xf0, 0x34, 0xfd, 0x06, 0xe0, 0x18, 0x78, 0x0c, 0x7b, 0x91, 0xf8, + 0x0d, 0x90, 0x01, 0x28, 0x88, 0xbf, 0x8e, 0x7b, 0x68, 0x78, 0x01, 0x28, + 0x18, 0xbf, 0x03, 0x28, 0x17, 0xd1, 0x01, 0x2c, 0x03, 0xd1, 0x50, 0x46, + 0x00, 0xf0, 0xd6, 0xfd, 0x80, 0x46, 0xb9, 0xf1, 0x01, 0x0f, 0x04, 0xd1, + 0x50, 0x46, 0x00, 0xf0, 0xab, 0xfe, 0x40, 0xea, 0x08, 0x08, 0x01, 0x2e, + 0x04, 0xd1, 0x50, 0x46, 0x00, 0xf0, 0x59, 0xff, 0x40, 0xea, 0x08, 0x08, + 0x68, 0x78, 0x01, 0x28, 0x02, 0xd0, 0x68, 0x78, 0x02, 0x28, 0x18, 0xd1, + 0x01, 0x2c, 0x04, 0xd1, 0x50, 0x46, 0x00, 0xf0, 0x38, 0xfd, 0x40, 0xea, + 0x08, 0x08, 0xb9, 0xf1, 0x01, 0x0f, 0x04, 0xd1, 0x50, 0x46, 0x00, 0xf0, + 0x4f, 0xfe, 0x40, 0xea, 0x08, 0x08, 0x01, 0x2e, 0x04, 0xd1, 0x50, 0x46, + 0x00, 0xf0, 0xff, 0xfe, 0x40, 0xea, 0x08, 0x08, 0x50, 0x46, 0x01, 0xf0, + 0x5c, 0xf8, 0x2a, 0x78, 0x02, 0x2a, 0x14, 0xd1, 0xa8, 0x68, 0x69, 0x68, + 0x8b, 0x7f, 0x24, 0x30, 0xc7, 0x79, 0xbb, 0x42, 0x0d, 0xd2, 0x08, 0x22, + 0xc2, 0x70, 0x00, 0x23, 0x2b, 0x70, 0x6b, 0x70, 0xc9, 0x7f, 0xc1, 0x71, + 0x50, 0x46, 0x00, 0xf0, 0xf3, 0xfc, 0x50, 0x46, 0x00, 0xf0, 0x9d, 0xff, + 0x81, 0xe0, 0x49, 0xea, 0x04, 0x00, 0x30, 0x43, 0x7d, 0xd0, 0xd5, 0xf8, + 0x08, 0xc0, 0x0c, 0xf1, 0x24, 0x03, 0x00, 0x2c, 0x1e, 0xbf, 0x9c, 0xf8, + 0x1c, 0x10, 0x1f, 0x79, 0xb9, 0x42, 0x15, 0xd1, 0xb9, 0xf1, 0x00, 0x0f, + 0x1e, 0xbf, 0x9c, 0xf8, 0x1d, 0x10, 0x5f, 0x79, 0xb9, 0x42, 0x0c, 0xd1, + 0x00, 0x2e, 0x1e, 0xbf, 0x9c, 0xf8, 0x1e, 0x10, 0x9f, 0x79, 0xb9, 0x42, + 0x05, 0xd1, 0x02, 0x2a, 0x08, 0xbf, 0x07, 0x20, 0x5b, 0xd0, 0x0d, 0x21, + 0x5c, 0xe0, 0x3c, 0xb1, 0x1f, 0x78, 0x9c, 0xf8, 0x14, 0x10, 0x9c, 0xf8, + 0x1c, 0xe0, 0x0f, 0x40, 0xbe, 0x45, 0x1a, 0xd1, 0xb9, 0xf1, 0x00, 0x0f, + 0x07, 0xd0, 0x5f, 0x78, 0x9c, 0xf8, 0x15, 0x10, 0x9c, 0xf8, 0x1d, 0xe0, + 0x0f, 0x40, 0xbe, 0x45, 0x0e, 0xd1, 0x3e, 0xb1, 0x9f, 0x78, 0x9c, 0xf8, + 0x16, 0x10, 0x9c, 0xf8, 0x1e, 0xe0, 0x0f, 0x40, 0xbe, 0x45, 0x05, 0xd1, + 0x02, 0x2a, 0x08, 0xbf, 0x05, 0x20, 0x38, 0xd0, 0x0b, 0x21, 0x39, 0xe0, + 0x34, 0xb1, 0x1f, 0x78, 0x19, 0x79, 0x9c, 0xf8, 0x1c, 0xe0, 0x0f, 0x43, + 0xbe, 0x45, 0x17, 0xd1, 0xb9, 0xf1, 0x00, 0x0f, 0x06, 0xd0, 0x5f, 0x78, + 0x59, 0x79, 0x9c, 0xf8, 0x1d, 0xe0, 0x0f, 0x43, 0xbe, 0x45, 0x0d, 0xd1, + 0x36, 0xb1, 0x9f, 0x78, 0x99, 0x79, 0x9c, 0xf8, 0x1e, 0x60, 0x39, 0x43, + 0x8e, 0x42, 0x05, 0xd1, 0x02, 0x2a, 0x08, 0xbf, 0x04, 0x20, 0x18, 0xd0, + 0x0a, 0x21, 0x19, 0xe0, 0x01, 0x28, 0x18, 0xd1, 0x18, 0x78, 0x5e, 0x78, + 0x99, 0x78, 0x30, 0x43, 0x08, 0x43, 0x05, 0xd0, 0x02, 0x2a, 0x08, 0xbf, + 0x03, 0x20, 0x0a, 0xd0, 0x09, 0x21, 0x0b, 0xe0, 0x18, 0x79, 0x5e, 0x79, + 0x99, 0x79, 0x30, 0x43, 0x08, 0x43, 0x06, 0xd0, 0x02, 0x2a, 0x02, 0xd1, + 0x06, 0x20, 0xd8, 0x70, 0x01, 0xe0, 0x0c, 0x21, 0xd9, 0x70, 0x28, 0x78, + 0x02, 0x28, 0x1c, 0xd1, 0xa8, 0x68, 0x00, 0xf1, 0x2b, 0x01, 0x00, 0x2c, + 0x1e, 0xbf, 0x02, 0x7f, 0x4b, 0x78, 0x9a, 0x42, 0x13, 0xd1, 0xb9, 0xf1, + 0x00, 0x0f, 0x1e, 0xbf, 0x40, 0x7f, 0x8a, 0x78, 0x90, 0x42, 0x0c, 0xd1, + 0x6a, 0x68, 0x08, 0x78, 0x93, 0x7f, 0x83, 0x42, 0x24, 0xbf, 0x40, 0x1c, + 0x08, 0x70, 0x50, 0x46, 0x00, 0xf0, 0x50, 0xfc, 0x50, 0x46, 0x00, 0xf0, + 0xfa, 0xfe, 0x40, 0x46, 0xbd, 0xe8, 0xf0, 0x87, 0xf8, 0xb5, 0x04, 0x46, + 0x04, 0xf1, 0x50, 0x06, 0x0e, 0x20, 0xb1, 0x68, 0x00, 0x27, 0x00, 0x25, + 0x81, 0xf8, 0x27, 0x00, 0x10, 0xe0, 0xf1, 0x68, 0xfa, 0xb2, 0x24, 0x20, + 0x42, 0x43, 0x88, 0x18, 0x01, 0xf0, 0xae, 0xfb, 0x38, 0xb1, 0xb0, 0x68, + 0x00, 0xf0, 0x41, 0xf8, 0x70, 0x68, 0x01, 0x78, 0xca, 0x07, 0x48, 0xbf, + 0x01, 0x25, 0x7f, 0x1c, 0x70, 0x68, 0x02, 0x7f, 0xf9, 0xb2, 0x91, 0x42, + 0xe9, 0xd3, 0x40, 0x7f, 0x01, 0x28, 0x19, 0xd9, 0x30, 0x69, 0x01, 0xf0, + 0x78, 0xff, 0x48, 0xb1, 0xb0, 0x68, 0x01, 0x68, 0x41, 0xf4, 0x80, 0x71, + 0x01, 0x60, 0x70, 0x68, 0x01, 0x68, 0xca, 0x05, 0x48, 0xbf, 0x01, 0x25, + 0x70, 0x69, 0x02, 0xf0, 0x17, 0xf9, 0x38, 0xb1, 0xb0, 0x68, 0x00, 0xf0, + 0x19, 0xf8, 0x70, 0x68, 0x01, 0x68, 0xca, 0x03, 0x48, 0xbf, 0x01, 0x25, + 0x70, 0x68, 0xc1, 0x7f, 0xb0, 0x68, 0x80, 0xf8, 0x2b, 0x10, 0x20, 0x46, + 0x00, 0xf0, 0x04, 0xfc, 0x20, 0x46, 0x00, 0xf0, 0xae, 0xfe, 0xb1, 0x68, + 0x0f, 0x20, 0x81, 0xf8, 0x27, 0x00, 0x00, 0x20, 0x30, 0x70, 0x70, 0x70, + 0x28, 0x46, 0xf2, 0xbd, 0x01, 0x68, 0x41, 0xf4, 0x80, 0x31, 0x01, 0x60, + 0x70, 0x47, 0x01, 0x68, 0x41, 0xf0, 0x01, 0x01, 0x01, 0x60, 0x70, 0x47, + 0x50, 0x30, 0x10, 0x22, 0x81, 0x68, 0x81, 0xf8, 0x27, 0x20, 0x11, 0x23, + 0x81, 0xf8, 0x27, 0x30, 0x00, 0x21, 0x01, 0x70, 0x41, 0x70, 0x00, 0x20, + 0x70, 0x47, 0x70, 0xb5, 0x00, 0xf1, 0x50, 0x05, 0x12, 0x20, 0xa9, 0x68, + 0x00, 0x26, 0x00, 0x24, 0x81, 0xf8, 0x27, 0x00, 0x10, 0xe0, 0xe9, 0x68, + 0xf2, 0xb2, 0x24, 0x20, 0x42, 0x43, 0x88, 0x18, 0x01, 0xf0, 0x7a, 0xfb, + 0x38, 0xb1, 0xa8, 0x68, 0xff, 0xf7, 0xd9, 0xff, 0x68, 0x68, 0x01, 0x78, + 0xca, 0x07, 0x48, 0xbf, 0x01, 0x24, 0x76, 0x1c, 0x68, 0x68, 0x02, 0x7f, + 0xf1, 0xb2, 0x91, 0x42, 0xe9, 0xd3, 0x40, 0x7f, 0xc8, 0xb1, 0x28, 0x69, + 0x01, 0xf0, 0x44, 0xff, 0x48, 0xb1, 0xa8, 0x68, 0x01, 0x68, 0x41, 0xf4, + 0x80, 0x71, 0x01, 0x60, 0x68, 0x68, 0x01, 0x68, 0xca, 0x05, 0x48, 0xbf, + 0x01, 0x24, 0x68, 0x69, 0x02, 0xf0, 0xc2, 0xf8, 0x38, 0xb1, 0xa8, 0x68, + 0xff, 0xf7, 0xb2, 0xff, 0x68, 0x68, 0x01, 0x68, 0xca, 0x03, 0x48, 0xbf, + 0x01, 0x24, 0xa9, 0x68, 0x13, 0x20, 0x81, 0xf8, 0x27, 0x00, 0x00, 0x20, + 0x28, 0x70, 0x68, 0x70, 0x20, 0x46, 0x70, 0xbd, 0x70, 0xb5, 0x00, 0x24, + 0x06, 0x46, 0x06, 0xf1, 0x28, 0x00, 0x00, 0xf0, 0x6a, 0xff, 0x02, 0x28, + 0x06, 0xf1, 0x54, 0x05, 0x04, 0xd0, 0x06, 0xf1, 0x50, 0x01, 0x06, 0xf1, + 0x28, 0x00, 0x31, 0xe0, 0x06, 0xf1, 0x30, 0x00, 0x00, 0xf0, 0x5d, 0xff, + 0x02, 0x28, 0x3d, 0xd0, 0x68, 0x68, 0x90, 0xf8, 0x27, 0x00, 0x02, 0x28, + 0x18, 0xbf, 0x0f, 0x28, 0x20, 0xd0, 0x13, 0x28, 0x18, 0xbf, 0x11, 0x28, + 0x1c, 0xd0, 0x07, 0x28, 0x1c, 0xbf, 0x08, 0x28, 0x0d, 0x28, 0x17, 0xd0, + 0x04, 0x28, 0x04, 0xbf, 0x96, 0xf8, 0x51, 0x10, 0x02, 0x29, 0x11, 0xd0, + 0x0a, 0x28, 0x04, 0xbf, 0x96, 0xf8, 0x51, 0x10, 0x02, 0x29, 0x0b, 0xd0, + 0x05, 0x28, 0x04, 0xbf, 0x96, 0xf8, 0x51, 0x10, 0x02, 0x29, 0x05, 0xd0, + 0x0b, 0x28, 0x04, 0xbf, 0x96, 0xf8, 0x51, 0x00, 0x02, 0x28, 0x15, 0xd1, + 0x06, 0xf1, 0x50, 0x01, 0x06, 0xf1, 0x30, 0x00, 0x00, 0xf0, 0x3f, 0xff, + 0x01, 0x00, 0x0d, 0xd0, 0x69, 0x68, 0x0a, 0x68, 0x42, 0xf0, 0x00, 0x72, + 0x0a, 0x60, 0x2b, 0x68, 0x1d, 0x68, 0xaa, 0x01, 0x91, 0xf8, 0x2f, 0x20, + 0x48, 0xbf, 0x01, 0x24, 0xff, 0xf7, 0xb9, 0xfc, 0x20, 0x46, 0x70, 0xbd, + 0x80, 0x68, 0xdf, 0xf8, 0x54, 0x16, 0xdf, 0xf8, 0x54, 0x26, 0x40, 0xf8, + 0x6c, 0x1f, 0x02, 0x60, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x4f, 0x4f, 0xf0, + 0x00, 0x09, 0x07, 0x46, 0x86, 0xb0, 0x03, 0xa8, 0x79, 0x68, 0xc0, 0xf8, + 0x00, 0x90, 0x8d, 0xf8, 0x08, 0x90, 0x01, 0xf5, 0x20, 0x52, 0x01, 0xf5, + 0x10, 0x51, 0x05, 0x92, 0x04, 0x91, 0x20, 0x21, 0x78, 0x6d, 0x01, 0x90, + 0x00, 0x22, 0x06, 0x7a, 0xb8, 0x68, 0x74, 0x30, 0x00, 0x23, 0x00, 0x68, + 0xbc, 0x6d, 0x00, 0xf0, 0x0f, 0x00, 0x86, 0x42, 0x4f, 0xf4, 0x80, 0x08, + 0x09, 0xd0, 0x20, 0x68, 0x40, 0xf0, 0x80, 0x60, 0x20, 0x60, 0x01, 0x9d, + 0x28, 0x68, 0x40, 0x01, 0x48, 0xbf, 0x4f, 0xf0, 0x01, 0x09, 0x01, 0x98, + 0x00, 0x7c, 0xdd, 0xf8, 0x04, 0xe0, 0x8d, 0xf8, 0x00, 0x00, 0x05, 0x2e, + 0x01, 0x98, 0x40, 0x7c, 0x9d, 0xf8, 0x00, 0xa0, 0x8d, 0xf8, 0x01, 0x00, + 0x4f, 0xea, 0x4a, 0x0a, 0x9e, 0xf8, 0x12, 0x50, 0xdd, 0xf8, 0x04, 0xe0, + 0x8d, 0xf8, 0x02, 0x50, 0x9e, 0xf8, 0x13, 0x50, 0x8d, 0xf8, 0x03, 0x50, + 0x4f, 0xf0, 0x01, 0x0e, 0x0e, 0xfa, 0x0a, 0xfa, 0x08, 0xd1, 0x06, 0x22, + 0x8a, 0xf0, 0xff, 0x03, 0x4f, 0xf4, 0xc0, 0x08, 0x84, 0xf8, 0x22, 0xe0, + 0x00, 0x20, 0x27, 0xe0, 0x40, 0x00, 0x0e, 0xfa, 0x00, 0xf0, 0x04, 0x2e, + 0x80, 0xea, 0x0a, 0x00, 0x0a, 0xd1, 0x80, 0xf0, 0xff, 0x03, 0x02, 0x26, + 0x05, 0x22, 0x00, 0x21, 0x4f, 0xf4, 0xc0, 0x08, 0x84, 0xf8, 0x22, 0x60, + 0x06, 0x20, 0x15, 0xe0, 0x03, 0x2e, 0x18, 0xd1, 0x9d, 0xf8, 0x02, 0x30, + 0x5b, 0x00, 0x0e, 0xfa, 0x03, 0xf6, 0x6d, 0x00, 0x86, 0xea, 0x00, 0x03, + 0x0e, 0xfa, 0x05, 0xf5, 0x6b, 0x40, 0x04, 0x26, 0x03, 0x22, 0x83, 0xf0, + 0xff, 0x03, 0x4f, 0xf4, 0xc0, 0x08, 0x84, 0xf8, 0x22, 0x60, 0x0f, 0x20, + 0xbe, 0x6d, 0x70, 0x77, 0xbe, 0x6d, 0xb0, 0x77, 0x08, 0xe0, 0x20, 0x68, + 0x40, 0xf0, 0x80, 0x60, 0x20, 0x60, 0x01, 0x9e, 0x30, 0x68, 0x44, 0x01, + 0x48, 0xbf, 0xf1, 0x46, 0xb8, 0x6d, 0x00, 0x26, 0x06, 0x77, 0x00, 0x24, + 0x9d, 0xf8, 0x08, 0xc0, 0x14, 0xe0, 0xff, 0x26, 0x0d, 0xf8, 0x04, 0x60, + 0x0e, 0xe0, 0xbd, 0x6d, 0x05, 0xf1, 0x1c, 0x06, 0xb0, 0x79, 0x84, 0x42, + 0xf5, 0xda, 0x1d, 0xf8, 0x04, 0x00, 0x35, 0x78, 0x0e, 0xfa, 0x00, 0xf0, + 0x05, 0x43, 0x0c, 0xf1, 0x01, 0x0c, 0x35, 0x70, 0x64, 0x1c, 0xe4, 0xb2, + 0x7e, 0x6d, 0x35, 0x7f, 0xac, 0x42, 0xea, 0xdb, 0x4f, 0xf0, 0x00, 0x0b, + 0x3d, 0xe0, 0x0a, 0xf1, 0x01, 0x00, 0x5f, 0xfa, 0x80, 0xfa, 0xaa, 0x45, + 0x03, 0xda, 0x1d, 0xf8, 0x0a, 0x40, 0x5c, 0x45, 0xf5, 0xd1, 0xb8, 0x6d, + 0x00, 0xf1, 0x1c, 0x04, 0xa5, 0x79, 0x02, 0x95, 0x28, 0x46, 0x9a, 0xfb, + 0xf0, 0xf5, 0x01, 0x90, 0x45, 0x43, 0x00, 0xeb, 0x0a, 0x04, 0x02, 0x98, + 0x64, 0x1e, 0xb4, 0xfb, 0xf0, 0xfa, 0x00, 0xfb, 0x1a, 0x44, 0xdd, 0xf8, + 0x04, 0xa0, 0x01, 0x98, 0x95, 0xfb, 0xfa, 0xfa, 0x00, 0xfb, 0x1a, 0x55, + 0x2d, 0x19, 0xed, 0xb2, 0x03, 0xac, 0x1d, 0xf8, 0x05, 0x00, 0x04, 0xf8, + 0x0b, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x3c, 0x68, 0x04, 0xeb, 0xcb, 0x24, + 0x04, 0xf5, 0x20, 0x54, 0x04, 0xf2, 0x94, 0x45, 0x04, 0xf5, 0x9d, 0x64, + 0xc5, 0xf8, 0x00, 0x80, 0x40, 0xf0, 0x08, 0x00, 0x20, 0x60, 0x0b, 0xf1, + 0x01, 0x00, 0x5f, 0xfa, 0x80, 0xfb, 0x35, 0x7f, 0xab, 0x45, 0xb8, 0xbf, + 0x4f, 0xf0, 0x00, 0x0a, 0xbf, 0xdb, 0x01, 0x2d, 0x0c, 0xd9, 0x04, 0x98, + 0x00, 0xf1, 0x32, 0x04, 0x22, 0x70, 0x00, 0xf1, 0x37, 0x02, 0x11, 0x70, + 0x05, 0x99, 0x01, 0xf5, 0x80, 0x71, 0x0b, 0x70, 0x00, 0xf8, 0x49, 0x3f, + 0x5f, 0xfa, 0x8c, 0xf3, 0xb8, 0x6d, 0x90, 0xf8, 0x22, 0x10, 0x7a, 0x6d, + 0x8b, 0x42, 0x02, 0xd1, 0x13, 0x7f, 0x8b, 0x42, 0x08, 0xd2, 0x01, 0x68, + 0x41, 0xf0, 0x80, 0x61, 0x01, 0x60, 0x10, 0x68, 0x41, 0x01, 0x48, 0xbf, + 0x4f, 0xf0, 0x01, 0x09, 0x48, 0x46, 0x06, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x2d, 0xe9, 0xfe, 0x4f, 0x00, 0x21, 0x44, 0x68, 0x8d, 0xf8, 0x04, 0x10, + 0x04, 0xf5, 0x10, 0x54, 0x42, 0x6d, 0x02, 0x92, 0x13, 0x46, 0x5a, 0x7a, + 0x1d, 0x7d, 0x02, 0x9b, 0x8d, 0xf8, 0x00, 0x50, 0x88, 0x46, 0x5b, 0x7d, + 0x9d, 0xf8, 0x00, 0x70, 0x8d, 0xf8, 0x01, 0x30, 0x7f, 0x00, 0x02, 0x9d, + 0x95, 0xf8, 0x16, 0xa0, 0x8d, 0xf8, 0x02, 0xa0, 0x01, 0x25, 0x05, 0xfa, + 0x07, 0xfb, 0x87, 0x6d, 0x00, 0x26, 0x89, 0x46, 0x8e, 0x46, 0x42, 0xb9, + 0x4f, 0xf0, 0x08, 0x09, 0x4f, 0xf0, 0x20, 0x0e, 0x8b, 0xf0, 0x3f, 0x08, + 0x87, 0xf8, 0x23, 0x50, 0x28, 0xe0, 0x5b, 0x00, 0x05, 0xfa, 0x03, 0xf3, + 0x01, 0x2a, 0x83, 0xea, 0x0b, 0x03, 0x04, 0xd1, 0x01, 0x26, 0x83, 0xf0, + 0x3f, 0x08, 0x02, 0x22, 0x10, 0xe0, 0x4f, 0xea, 0x4a, 0x0a, 0x05, 0xfa, + 0x0a, 0xfa, 0x8a, 0xea, 0x03, 0x03, 0x02, 0x2a, 0x83, 0xf0, 0x3f, 0x03, + 0x08, 0xbf, 0x02, 0x26, 0x02, 0xd0, 0x05, 0x2a, 0x05, 0xd1, 0x05, 0x26, + 0x98, 0x46, 0x03, 0x22, 0x87, 0xf8, 0x23, 0x20, 0x08, 0xe0, 0x3b, 0x68, + 0x43, 0xf0, 0x00, 0x63, 0x3b, 0x60, 0x02, 0x9a, 0x13, 0x68, 0x1f, 0x01, + 0x48, 0xbf, 0x01, 0x21, 0x83, 0x6d, 0x00, 0x22, 0xda, 0x77, 0x00, 0x27, + 0x9d, 0xf8, 0x04, 0x20, 0x83, 0x6d, 0x1f, 0x33, 0x93, 0xf8, 0x04, 0xa0, + 0x57, 0x45, 0x0b, 0xda, 0x1d, 0xf8, 0x07, 0xa0, 0x93, 0xf8, 0x00, 0xb0, + 0x05, 0xfa, 0x0a, 0xfa, 0x4a, 0xea, 0x0b, 0x0b, 0x52, 0x1c, 0x83, 0xf8, + 0x00, 0xb0, 0x02, 0xe0, 0xff, 0x23, 0x0d, 0xf8, 0x07, 0x30, 0x7f, 0x1c, + 0x03, 0x2f, 0xe7, 0xd3, 0xe3, 0x1d, 0x04, 0xf1, 0x0d, 0x07, 0x1d, 0x78, + 0x45, 0xf0, 0x01, 0x05, 0x1d, 0x70, 0x3e, 0x70, 0xd2, 0xb2, 0x9d, 0xf8, + 0x01, 0x50, 0x9d, 0xf8, 0x00, 0x60, 0x6d, 0x1c, 0x76, 0x1c, 0xad, 0x00, + 0x06, 0xf0, 0x03, 0x06, 0x05, 0xf0, 0x0c, 0x05, 0x2e, 0x43, 0x9d, 0xf8, + 0x02, 0x50, 0x6d, 0x1c, 0x2d, 0x01, 0x05, 0xf0, 0x30, 0x05, 0x2e, 0x43, + 0x04, 0xf1, 0x0e, 0x05, 0x2e, 0x70, 0x1e, 0x78, 0x06, 0xf0, 0xfe, 0x06, + 0x1e, 0x70, 0x04, 0xf1, 0x33, 0x03, 0x1d, 0x78, 0x05, 0xf0, 0xf7, 0x05, + 0x49, 0xea, 0x05, 0x05, 0x05, 0xf0, 0xdf, 0x05, 0x4e, 0xea, 0x05, 0x05, + 0x1d, 0x70, 0x04, 0xf8, 0x47, 0x8f, 0x83, 0x6d, 0x93, 0xf8, 0x23, 0x40, + 0x40, 0x6d, 0xa2, 0x42, 0x02, 0xd1, 0x42, 0x7f, 0xa2, 0x42, 0x07, 0xd2, + 0x1c, 0x68, 0x44, 0xf0, 0x00, 0x64, 0x1c, 0x60, 0x00, 0x68, 0x02, 0x01, + 0x48, 0xbf, 0x01, 0x21, 0x08, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, 0x2d, 0xe9, + 0xf0, 0x41, 0xd0, 0xf8, 0x54, 0xe0, 0x44, 0x68, 0x9e, 0xf8, 0x0a, 0x30, + 0x9e, 0xf8, 0x0b, 0x20, 0x00, 0x21, 0x04, 0xf5, 0x10, 0x54, 0x8c, 0x46, + 0x00, 0x27, 0x00, 0x25, 0x88, 0x46, 0x0b, 0xb9, 0x80, 0x27, 0x13, 0xe0, + 0x02, 0x2b, 0x08, 0xbf, 0x4f, 0xf0, 0x02, 0x0c, 0x0e, 0xd0, 0x05, 0x2b, + 0x08, 0xbf, 0x4f, 0xf0, 0x05, 0x0c, 0x09, 0xd0, 0x83, 0x6d, 0x1e, 0x68, + 0x46, 0xf0, 0x00, 0x66, 0x1e, 0x60, 0xde, 0xf8, 0x00, 0x30, 0x1e, 0x01, + 0x48, 0xbf, 0x01, 0x21, 0x12, 0xb9, 0x4f, 0xf0, 0x40, 0x08, 0x11, 0xe0, + 0x02, 0x2a, 0x08, 0xbf, 0x20, 0x25, 0x0d, 0xd0, 0x05, 0x2a, 0x08, 0xbf, + 0x50, 0x25, 0x09, 0xd0, 0x80, 0x6d, 0x02, 0x68, 0x42, 0xf0, 0x00, 0x62, + 0x02, 0x60, 0xde, 0xf8, 0x00, 0x00, 0x02, 0x01, 0x48, 0xbf, 0x01, 0x21, + 0xe0, 0x1d, 0x04, 0xf1, 0x0f, 0x03, 0x02, 0x78, 0x42, 0xf0, 0x01, 0x02, + 0x02, 0x70, 0x45, 0xea, 0x0c, 0x02, 0x1a, 0x70, 0x05, 0x78, 0x05, 0xf0, + 0xfe, 0x05, 0x05, 0x70, 0x14, 0xf8, 0x33, 0x0f, 0x00, 0xf0, 0x7f, 0x00, + 0x07, 0x43, 0x07, 0xf0, 0xbf, 0x07, 0x48, 0xea, 0x07, 0x07, 0x27, 0x70, + 0x08, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x81, 0x6d, 0x4b, 0x7f, 0x0a, 0x7f, + 0x80, 0x68, 0xdb, 0x43, 0xd2, 0x43, 0x1b, 0x06, 0xd2, 0xb2, 0xdb, 0x0a, + 0x43, 0xea, 0x02, 0x13, 0x8a, 0x7f, 0x78, 0x49, 0xd2, 0x43, 0xd2, 0xb2, + 0x43, 0xea, 0x82, 0x53, 0x0b, 0x43, 0x40, 0xf8, 0x68, 0x3f, 0x70, 0x47, + 0x36, 0x23, 0x70, 0xb5, 0x41, 0x68, 0x01, 0xf5, 0x20, 0x52, 0x02, 0xf1, + 0xa2, 0x04, 0x02, 0xf1, 0xa3, 0x06, 0x23, 0x70, 0x02, 0xf1, 0xa4, 0x04, + 0x33, 0x70, 0x02, 0xf1, 0xa5, 0x06, 0x23, 0x70, 0x02, 0xf1, 0x63, 0x04, + 0x33, 0x70, 0x02, 0xf1, 0x64, 0x06, 0x23, 0x70, 0x02, 0xf1, 0x65, 0x04, + 0x33, 0x70, 0x02, 0xf1, 0x66, 0x06, 0x23, 0x70, 0x02, 0xf1, 0x6f, 0x04, + 0x33, 0x70, 0x02, 0xf1, 0xae, 0x06, 0x23, 0x70, 0x33, 0x70, 0x01, 0xf5, + 0x10, 0x51, 0x44, 0x6d, 0x65, 0x7f, 0x02, 0x2d, 0x02, 0xf1, 0xb7, 0x03, + 0xc0, 0xf0, 0x9b, 0x80, 0x01, 0xf1, 0x4a, 0x04, 0x25, 0x78, 0x05, 0xf0, + 0xe7, 0x05, 0x25, 0x70, 0x01, 0xf1, 0x4b, 0x05, 0x2e, 0x78, 0x06, 0xf0, + 0xf0, 0x06, 0x46, 0xf0, 0x02, 0x06, 0x2e, 0x70, 0x25, 0x78, 0x05, 0xf0, + 0xf8, 0x05, 0x45, 0xf0, 0x03, 0x05, 0x25, 0x70, 0x02, 0xf1, 0xb8, 0x04, + 0x25, 0x78, 0x05, 0xf0, 0xf0, 0x05, 0x45, 0xf0, 0x0c, 0x05, 0x25, 0x70, + 0x26, 0x78, 0x06, 0xf0, 0x0f, 0x06, 0x46, 0xf0, 0xc0, 0x06, 0x26, 0x70, + 0x02, 0xf1, 0xc6, 0x06, 0x1c, 0x78, 0x04, 0xf0, 0xf8, 0x04, 0x44, 0xf0, + 0x04, 0x04, 0x1c, 0x70, 0x1d, 0x78, 0x05, 0xf0, 0xc7, 0x05, 0x45, 0xf0, + 0x20, 0x05, 0x1d, 0x70, 0x02, 0xf1, 0xb6, 0x03, 0x1c, 0x78, 0x44, 0xf0, + 0x03, 0x04, 0x1c, 0x70, 0x1d, 0x78, 0x45, 0xf0, 0x0c, 0x05, 0x1d, 0x70, + 0x01, 0xf1, 0x36, 0x03, 0x1c, 0x78, 0x04, 0xf0, 0xf8, 0x04, 0x1c, 0x70, + 0x1d, 0x78, 0x45, 0xf0, 0xf0, 0x05, 0x1d, 0x70, 0x01, 0xf1, 0x2b, 0x03, + 0x4d, 0x31, 0x1c, 0x78, 0x04, 0xf0, 0xf8, 0x04, 0x1c, 0x70, 0x02, 0xf1, + 0xd0, 0x04, 0x1d, 0x78, 0x05, 0xf0, 0x8f, 0x05, 0x1d, 0x70, 0x78, 0x23, + 0x23, 0x70, 0x48, 0x25, 0x02, 0xf1, 0xdc, 0x03, 0x35, 0x70, 0x1c, 0x78, + 0x04, 0xf0, 0x1f, 0x04, 0x44, 0xf0, 0x20, 0x04, 0x1c, 0x70, 0x04, 0x23, + 0x02, 0xf1, 0x08, 0x04, 0xd2, 0x1d, 0x23, 0x70, 0x40, 0x6d, 0x2d, 0x4c, + 0x03, 0x6a, 0xa3, 0x42, 0x18, 0xd2, 0x0f, 0x20, 0x10, 0x70, 0x0a, 0x78, + 0x02, 0xf0, 0xfc, 0x02, 0x42, 0xf0, 0x01, 0x02, 0x0a, 0x70, 0x08, 0x78, + 0x00, 0xf0, 0xf3, 0x00, 0x40, 0xf0, 0x04, 0x00, 0x08, 0x70, 0x0a, 0x78, + 0x02, 0xf0, 0xcf, 0x02, 0x42, 0xf0, 0x10, 0x02, 0x0a, 0x70, 0x08, 0x78, + 0x40, 0xf0, 0xc0, 0x00, 0x08, 0x70, 0x70, 0xbd, 0x0c, 0x23, 0x13, 0x70, + 0x08, 0x78, 0x00, 0xf0, 0xfc, 0x00, 0x40, 0xf0, 0x01, 0x00, 0x08, 0x70, + 0x0a, 0x78, 0x02, 0xf0, 0xf3, 0x02, 0x42, 0xf0, 0x04, 0x02, 0x0a, 0x70, + 0x08, 0x78, 0x00, 0xf0, 0xcf, 0x00, 0x40, 0xf0, 0x10, 0x00, 0x08, 0x70, + 0x0a, 0x78, 0x02, 0xf0, 0x3f, 0x02, 0x42, 0xf0, 0x40, 0x02, 0x0a, 0x70, + 0x70, 0xbd, 0x02, 0xf1, 0xad, 0x01, 0x2c, 0x20, 0x02, 0xf1, 0x6e, 0x05, + 0x08, 0x70, 0x02, 0xf1, 0x5b, 0x01, 0x28, 0x70, 0x08, 0x70, 0x07, 0x21, + 0x1c, 0x78, 0x04, 0xf0, 0xc7, 0x04, 0x44, 0xf0, 0x20, 0x04, 0x1c, 0x70, + 0x18, 0x78, 0x00, 0xf0, 0xf8, 0x00, 0x40, 0xf0, 0x04, 0x00, 0x18, 0x70, + 0x06, 0x23, 0x02, 0xf1, 0x0e, 0x00, 0x01, 0x70, 0x02, 0xf8, 0x29, 0x3f, + 0x70, 0xbd, 0x00, 0x00, 0xf0, 0xf0, 0xe1, 0x43, 0x00, 0x10, 0x20, 0x40, + 0xc1, 0xcf, 0x6a, 0x00, 0x10, 0xb5, 0x42, 0x6d, 0x32, 0xf8, 0x24, 0x3f, + 0x41, 0x68, 0x80, 0x6d, 0x90, 0xf9, 0x2b, 0x40, 0xe3, 0x40, 0xd8, 0x07, + 0x01, 0xf5, 0x20, 0x51, 0x54, 0xbf, 0x90, 0x78, 0xd0, 0x78, 0x00, 0xf0, + 0x0f, 0x00, 0x01, 0xf8, 0xe0, 0x0f, 0x10, 0xbd, 0x82, 0x6d, 0x00, 0x21, + 0x82, 0xf8, 0x24, 0x10, 0x82, 0x6d, 0x82, 0xf8, 0x25, 0x10, 0x82, 0x6d, + 0x82, 0xf8, 0x26, 0x10, 0x82, 0x6d, 0x82, 0xf8, 0x28, 0x10, 0x82, 0x6d, + 0x82, 0xf8, 0x29, 0x10, 0x82, 0x6d, 0x82, 0xf8, 0x2a, 0x10, 0x82, 0x6d, + 0x82, 0xf8, 0x2c, 0x10, 0x82, 0x6d, 0x82, 0xf8, 0x2d, 0x10, 0x80, 0x6d, + 0x80, 0xf8, 0x2e, 0x10, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x47, 0x4f, 0xf0, + 0x00, 0x0a, 0x00, 0x25, 0x00, 0xf1, 0x50, 0x04, 0x4f, 0xf0, 0x24, 0x08, + 0x24, 0xe0, 0x00, 0xf0, 0x71, 0xf8, 0x31, 0x40, 0x80, 0xf8, 0x24, 0x10, + 0xa0, 0x68, 0x90, 0xf8, 0x28, 0x10, 0x31, 0x40, 0x00, 0xf0, 0x62, 0xf8, + 0x0e, 0x40, 0x80, 0xf8, 0x2c, 0x60, 0x13, 0xe0, 0x00, 0xf0, 0x58, 0xf8, + 0x07, 0x28, 0xa0, 0x68, 0x01, 0x7d, 0xea, 0xd1, 0x00, 0xf0, 0x5c, 0xf8, + 0x0e, 0x40, 0x80, 0xf8, 0x24, 0x60, 0xa0, 0x68, 0x90, 0xf8, 0x28, 0x10, + 0x39, 0x43, 0x00, 0xf0, 0x4d, 0xf8, 0x0f, 0x43, 0x80, 0xf8, 0x2c, 0x70, + 0x6d, 0x1c, 0xed, 0xb2, 0x60, 0x68, 0x01, 0x7f, 0x8d, 0x42, 0x3c, 0xda, + 0xa0, 0x68, 0x00, 0xf1, 0x1c, 0x01, 0x0a, 0x78, 0xea, 0x40, 0xd0, 0x07, + 0xf2, 0xd5, 0x0a, 0x7a, 0x08, 0x7c, 0x02, 0x43, 0xea, 0x40, 0xd2, 0x07, + 0xec, 0xd4, 0x22, 0x78, 0xe0, 0x68, 0x18, 0xfb, 0x05, 0xf9, 0x02, 0x2a, + 0x48, 0x44, 0x04, 0xd1, 0xca, 0x7b, 0x00, 0x21, 0x00, 0xf0, 0x9f, 0xfd, + 0x02, 0xe0, 0x00, 0x21, 0x00, 0xf0, 0x64, 0xfe, 0x50, 0xb1, 0xa0, 0x68, + 0x01, 0x68, 0x41, 0xf0, 0x01, 0x01, 0x01, 0x60, 0x60, 0x68, 0x01, 0x78, + 0xca, 0x07, 0x48, 0xbf, 0x4f, 0xf0, 0x01, 0x0a, 0xe0, 0x68, 0x01, 0x27, + 0x48, 0x44, 0xaf, 0x40, 0x00, 0xf0, 0xf6, 0xfe, 0xfe, 0x43, 0x04, 0x28, + 0x03, 0xd0, 0x00, 0xf0, 0x0d, 0xf8, 0x09, 0x28, 0xb0, 0xd1, 0xa0, 0x68, + 0x01, 0x7d, 0x00, 0xf0, 0x11, 0xf8, 0x0f, 0x43, 0x80, 0xf8, 0x24, 0x70, + 0x9e, 0xe7, 0x50, 0x46, 0xbd, 0xe8, 0xf0, 0x87, 0xe0, 0x68, 0x48, 0x44, + 0x00, 0xf0, 0xe0, 0xbe, 0x80, 0xf8, 0x28, 0x10, 0xa0, 0x68, 0x90, 0xf8, + 0x2c, 0x10, 0x70, 0x47, 0x31, 0x40, 0x01, 0x75, 0xa0, 0x68, 0x90, 0xf8, + 0x24, 0x10, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, 0x00, 0x24, 0xa3, 0x46, + 0xa2, 0x46, 0x00, 0xf1, 0x50, 0x07, 0x4f, 0xf0, 0x24, 0x08, 0x19, 0xe0, + 0x18, 0x68, 0x40, 0xf0, 0x10, 0x00, 0x18, 0x60, 0x09, 0x78, 0xc8, 0x06, + 0x0c, 0xe0, 0x86, 0xf0, 0x01, 0x02, 0x10, 0x43, 0x0a, 0xd1, 0x38, 0x78, + 0x02, 0x28, 0xf1, 0xd1, 0x1a, 0x68, 0x42, 0xf0, 0x08, 0x02, 0x1a, 0x60, + 0x08, 0x78, 0x01, 0x07, 0x48, 0xbf, 0x01, 0x24, 0x0a, 0xf1, 0x01, 0x00, + 0x5f, 0xfa, 0x80, 0xfa, 0x79, 0x68, 0x08, 0x7f, 0xbb, 0x68, 0x82, 0x45, + 0x6c, 0xda, 0x03, 0xf1, 0x24, 0x02, 0x10, 0x78, 0x20, 0xfa, 0x0a, 0xf5, + 0x18, 0x7d, 0x20, 0xfa, 0x0a, 0xf0, 0x00, 0xf0, 0x01, 0x06, 0x05, 0xf0, + 0x01, 0x00, 0x30, 0x42, 0xd9, 0xd0, 0x3b, 0x78, 0xf9, 0x68, 0x18, 0xfb, + 0x0a, 0xf9, 0x02, 0x2b, 0x01, 0xeb, 0x09, 0x00, 0x04, 0xd1, 0xd2, 0x79, + 0x01, 0x21, 0x00, 0xf0, 0x24, 0xfd, 0x02, 0xe0, 0x01, 0x21, 0x00, 0xf0, + 0xe9, 0xfd, 0x48, 0xb1, 0xb8, 0x68, 0x01, 0x68, 0x41, 0xf0, 0x01, 0x01, + 0x01, 0x60, 0x78, 0x68, 0x01, 0x78, 0xca, 0x07, 0x48, 0xbf, 0x01, 0x24, + 0xf8, 0x68, 0x01, 0x25, 0x48, 0x44, 0x05, 0xfa, 0x0a, 0xf5, 0x00, 0xf0, + 0x7b, 0xfe, 0xee, 0x43, 0x06, 0x28, 0x04, 0xd0, 0xf8, 0x68, 0xff, 0xf7, + 0x92, 0xff, 0x0b, 0x28, 0x18, 0xd1, 0xb8, 0x68, 0x01, 0x7d, 0x31, 0x40, + 0x01, 0x75, 0x4f, 0xf0, 0x01, 0x0b, 0xb8, 0x68, 0x90, 0xf8, 0x24, 0x10, + 0x31, 0x40, 0x80, 0xf8, 0x24, 0x10, 0xb8, 0x68, 0x90, 0xf8, 0x28, 0x10, + 0x0d, 0x43, 0x80, 0xf8, 0x28, 0x50, 0xb8, 0x68, 0x90, 0xf8, 0x2c, 0x10, + 0x0e, 0x40, 0x80, 0xf8, 0x2c, 0x60, 0xa5, 0xe7, 0xf8, 0x68, 0xff, 0xf7, + 0x74, 0xff, 0x07, 0x28, 0xa0, 0xd1, 0xb8, 0x68, 0x01, 0x7d, 0x31, 0x40, + 0x01, 0x75, 0xb8, 0x68, 0x90, 0xf8, 0x24, 0x10, 0x0e, 0x40, 0x80, 0xf8, + 0x24, 0x60, 0xb8, 0x68, 0x90, 0xf8, 0x28, 0x10, 0x29, 0x43, 0x80, 0xf8, + 0x28, 0x10, 0xb8, 0x68, 0x90, 0xf8, 0x2c, 0x10, 0x0d, 0x43, 0x80, 0xf8, + 0x2c, 0x50, 0x89, 0xe7, 0x19, 0x69, 0x59, 0x44, 0x19, 0x61, 0x20, 0x46, + 0xbd, 0xe8, 0xf2, 0x8f, 0x38, 0xb5, 0x00, 0xf0, 0xee, 0xf8, 0xa9, 0x68, + 0x01, 0xf1, 0x1d, 0x02, 0x10, 0x78, 0x00, 0x28, 0x34, 0xd0, 0x10, 0x7a, + 0x11, 0x7c, 0x08, 0x43, 0x30, 0xd1, 0x29, 0x78, 0x28, 0x69, 0x02, 0x29, + 0x04, 0xd1, 0x92, 0x7b, 0x00, 0x21, 0x01, 0xf0, 0x13, 0xf8, 0x02, 0xe0, + 0x00, 0x21, 0x01, 0xf0, 0xea, 0xf8, 0x18, 0xb1, 0x00, 0xf0, 0x92, 0xf8, + 0x48, 0xbf, 0x01, 0x24, 0x00, 0xf0, 0x7c, 0xf8, 0x04, 0x28, 0x03, 0xd0, + 0x00, 0xf0, 0x78, 0xf8, 0x09, 0x28, 0x08, 0xd1, 0xa9, 0x68, 0x00, 0x20, + 0x48, 0x75, 0xa8, 0x68, 0x10, 0xf8, 0x1d, 0x1f, 0x01, 0x72, 0x00, 0x20, + 0x08, 0xe0, 0x00, 0xf0, 0x6b, 0xf8, 0x07, 0x28, 0x02, 0xd1, 0x00, 0xf0, + 0x6a, 0xf8, 0x07, 0xe0, 0x00, 0xf0, 0x5d, 0xf8, 0xa9, 0x68, 0x81, 0xf8, + 0x29, 0x00, 0xa9, 0x68, 0x81, 0xf8, 0x2d, 0x00, 0x20, 0x46, 0x32, 0xbd, + 0x38, 0xb5, 0x00, 0xf0, 0xae, 0xf8, 0xa8, 0x68, 0x10, 0xf8, 0x15, 0x1f, + 0x00, 0x7c, 0x01, 0x42, 0x49, 0xd0, 0x00, 0xf0, 0x51, 0xf8, 0x04, 0x28, + 0x03, 0xd0, 0x00, 0xf0, 0x4d, 0xf8, 0x09, 0x28, 0x2c, 0xd1, 0x29, 0x78, + 0x28, 0x69, 0x02, 0x29, 0x06, 0xd1, 0xa9, 0x68, 0x91, 0xf8, 0x2b, 0x20, + 0x01, 0x21, 0x00, 0xf0, 0xcd, 0xff, 0x02, 0xe0, 0x01, 0x21, 0x01, 0xf0, + 0xa4, 0xf8, 0x18, 0xb1, 0x00, 0xf0, 0x4c, 0xf8, 0x48, 0xbf, 0x01, 0x24, + 0x00, 0xf0, 0x36, 0xf8, 0x06, 0x28, 0x03, 0xd0, 0x00, 0xf0, 0x32, 0xf8, + 0x0b, 0x28, 0x0a, 0xd1, 0x00, 0xf0, 0x27, 0xf8, 0xa8, 0x68, 0x10, 0xf8, + 0x1d, 0x1f, 0x01, 0x73, 0x00, 0x20, 0xa9, 0x68, 0x81, 0xf8, 0x2d, 0x00, + 0x1b, 0xe0, 0x00, 0xf0, 0x23, 0xf8, 0x07, 0x28, 0x17, 0xd1, 0x00, 0xf0, + 0x22, 0xf8, 0x14, 0xe0, 0x29, 0x78, 0xa8, 0x68, 0x02, 0x29, 0x07, 0xd1, + 0x02, 0x68, 0x42, 0xf4, 0x00, 0x62, 0x02, 0x60, 0x68, 0x68, 0x01, 0x68, + 0x0a, 0x05, 0x06, 0xe0, 0x01, 0x68, 0x41, 0xf4, 0x80, 0x51, 0x01, 0x60, + 0x68, 0x68, 0x01, 0x68, 0xca, 0x04, 0x48, 0xbf, 0x01, 0x24, 0x20, 0x46, + 0x32, 0xbd, 0xa9, 0x68, 0x00, 0x20, 0x48, 0x75, 0xa9, 0x68, 0x81, 0xf8, + 0x25, 0x00, 0x70, 0x47, 0x28, 0x69, 0x01, 0xf0, 0x78, 0xb9, 0xa9, 0x68, + 0x00, 0x20, 0x48, 0x75, 0xa9, 0x68, 0x81, 0xf8, 0x25, 0x00, 0xa8, 0x68, + 0x10, 0xf8, 0x1d, 0x1f, 0x01, 0x73, 0xa8, 0x68, 0x10, 0xf8, 0x1d, 0x1f, + 0x01, 0x74, 0x70, 0x47, 0xa8, 0x68, 0x01, 0x68, 0x41, 0xf4, 0x80, 0x71, + 0x01, 0x60, 0x68, 0x68, 0x01, 0x68, 0xca, 0x05, 0x70, 0x47, 0x38, 0xb5, + 0x00, 0xf0, 0x37, 0xf8, 0xa9, 0x68, 0x11, 0xf8, 0x1e, 0x0f, 0x00, 0x28, + 0x2f, 0xd0, 0x08, 0x7a, 0x09, 0x7c, 0x08, 0x43, 0x2b, 0xd1, 0x28, 0x78, + 0x02, 0x28, 0x04, 0xd0, 0x68, 0x69, 0x00, 0x21, 0x01, 0xf0, 0xc0, 0xfa, + 0x18, 0xb1, 0x00, 0xf0, 0x8f, 0xf8, 0x48, 0xbf, 0x01, 0x24, 0x00, 0xf0, + 0x72, 0xf8, 0x04, 0x28, 0x03, 0xd0, 0x00, 0xf0, 0x6e, 0xf8, 0x09, 0x28, + 0x08, 0xd1, 0xa9, 0x68, 0x00, 0x20, 0x88, 0x75, 0xa8, 0x68, 0x10, 0xf8, + 0x1e, 0x1f, 0x01, 0x72, 0x00, 0x20, 0x08, 0xe0, 0x00, 0xf0, 0x61, 0xf8, + 0x07, 0x28, 0x02, 0xd1, 0x00, 0xf0, 0x67, 0xf8, 0x07, 0xe0, 0x00, 0xf0, + 0x5d, 0xf8, 0xa9, 0x68, 0x81, 0xf8, 0x2a, 0x00, 0xa9, 0x68, 0x81, 0xf8, + 0x2e, 0x00, 0x20, 0x46, 0x32, 0xbd, 0x00, 0xf1, 0x50, 0x05, 0x00, 0x24, + 0x70, 0x47, 0x38, 0xb5, 0xff, 0xf7, 0xf9, 0xff, 0xa8, 0x68, 0x10, 0xf8, + 0x16, 0x1f, 0x00, 0x7c, 0x01, 0x42, 0x42, 0xd0, 0x00, 0xf0, 0x43, 0xf8, + 0x04, 0x28, 0x03, 0xd0, 0x00, 0xf0, 0x3f, 0xf8, 0x09, 0x28, 0x25, 0xd1, + 0x28, 0x78, 0x02, 0x28, 0x04, 0xd0, 0x68, 0x69, 0x01, 0x21, 0x01, 0xf0, + 0x7d, 0xfa, 0x18, 0xb1, 0x00, 0xf0, 0x4c, 0xf8, 0x48, 0xbf, 0x01, 0x24, + 0x00, 0xf0, 0x2f, 0xf8, 0x06, 0x28, 0x03, 0xd0, 0x00, 0xf0, 0x2b, 0xf8, + 0x0b, 0x28, 0x0a, 0xd1, 0x00, 0xf0, 0x2a, 0xf8, 0xa8, 0x68, 0x10, 0xf8, + 0x1e, 0x1f, 0x01, 0x73, 0x00, 0x20, 0xa9, 0x68, 0x81, 0xf8, 0x2e, 0x00, + 0x1b, 0xe0, 0x00, 0xf0, 0x1c, 0xf8, 0x07, 0x28, 0x17, 0xd1, 0x00, 0xf0, + 0x22, 0xf8, 0x14, 0xe0, 0x29, 0x78, 0xa8, 0x68, 0x02, 0x29, 0x07, 0xd1, + 0x02, 0x68, 0x42, 0xf4, 0x00, 0x22, 0x02, 0x60, 0x68, 0x68, 0x01, 0x68, + 0x0a, 0x03, 0x06, 0xe0, 0x01, 0x68, 0x41, 0xf4, 0x80, 0x11, 0x01, 0x60, + 0x68, 0x68, 0x01, 0x68, 0xca, 0x02, 0x48, 0xbf, 0x01, 0x24, 0x20, 0x46, + 0x32, 0xbd, 0x68, 0x69, 0x01, 0xf0, 0x7e, 0xba, 0xa9, 0x68, 0x00, 0x20, + 0x88, 0x75, 0xa9, 0x68, 0x81, 0xf8, 0x26, 0x00, 0x70, 0x47, 0xa9, 0x68, + 0x00, 0x20, 0x88, 0x75, 0xa9, 0x68, 0x81, 0xf8, 0x26, 0x00, 0xa8, 0x68, + 0x10, 0xf8, 0x1e, 0x1f, 0x01, 0x73, 0xa8, 0x68, 0x10, 0xf8, 0x1e, 0x1f, + 0x01, 0x74, 0x70, 0x47, 0xa8, 0x68, 0x01, 0x68, 0x41, 0xf4, 0x80, 0x31, + 0x01, 0x60, 0x68, 0x68, 0x01, 0x68, 0xca, 0x03, 0x70, 0x47, 0x40, 0x68, + 0x00, 0xf5, 0x10, 0x50, 0x00, 0xf8, 0x4d, 0x1f, 0x70, 0x47, 0x40, 0x68, + 0x00, 0xf5, 0x10, 0x50, 0x4d, 0x30, 0x00, 0x78, 0x70, 0x47, 0x70, 0xb5, + 0x41, 0x6d, 0x4a, 0x68, 0xc2, 0x63, 0x00, 0x23, 0x83, 0x63, 0x4a, 0x68, + 0x03, 0x64, 0x42, 0x64, 0x49, 0x68, 0x82, 0x6d, 0x83, 0x64, 0xc1, 0x64, + 0xd3, 0x75, 0x82, 0x6d, 0x13, 0x75, 0x82, 0x6d, 0x53, 0x75, 0x82, 0x6d, + 0x93, 0x75, 0xff, 0x22, 0x81, 0x68, 0x01, 0xf1, 0x8c, 0x03, 0x1a, 0x60, + 0x00, 0x22, 0x43, 0xf6, 0x70, 0x14, 0xbf, 0x25, 0x04, 0xf1, 0xba, 0x03, + 0x55, 0x43, 0xbe, 0x26, 0x1d, 0x44, 0x56, 0x43, 0x33, 0x44, 0xed, 0x1a, + 0x01, 0xeb, 0x85, 0x04, 0x52, 0x1c, 0x4f, 0xf0, 0xff, 0x35, 0x04, 0x2a, + 0x44, 0xf8, 0xb0, 0x5f, 0xeb, 0xd3, 0x00, 0x21, 0x00, 0x22, 0x83, 0x6d, + 0x0b, 0x44, 0x49, 0x1c, 0x04, 0x29, 0x83, 0xf8, 0x30, 0x20, 0xf8, 0xd3, + 0x70, 0xbd, 0x30, 0xb5, 0x82, 0x6d, 0x14, 0x32, 0x00, 0x21, 0x13, 0x7f, + 0x01, 0x2b, 0x1e, 0xd1, 0x83, 0x68, 0x90, 0x33, 0x1b, 0x68, 0x14, 0x78, + 0x23, 0x43, 0x13, 0x70, 0x83, 0x6d, 0x1a, 0x7d, 0x42, 0xb9, 0x1c, 0x68, + 0x44, 0xf0, 0x02, 0x04, 0x1c, 0x60, 0x42, 0x6d, 0x14, 0x78, 0xa5, 0x07, + 0x48, 0xbf, 0x01, 0x21, 0x1c, 0x7d, 0x1a, 0x7f, 0x14, 0x40, 0x1c, 0x75, + 0xc0, 0x23, 0xc2, 0x68, 0x02, 0xf2, 0x84, 0x42, 0x13, 0x60, 0x00, 0x23, + 0x82, 0x6d, 0x82, 0xf8, 0x30, 0x30, 0x82, 0x6d, 0x15, 0x32, 0x13, 0x7f, + 0x01, 0x2b, 0x1e, 0xd1, 0x83, 0x68, 0x94, 0x33, 0x1b, 0x68, 0x14, 0x78, + 0x44, 0xea, 0x13, 0x23, 0x13, 0x70, 0xc0, 0x22, 0x03, 0x69, 0x43, 0xf8, + 0x10, 0x2f, 0x83, 0x6d, 0x5a, 0x7d, 0x42, 0xb9, 0x1c, 0x68, 0x44, 0xf4, + 0x00, 0x74, 0x1c, 0x60, 0x42, 0x6d, 0x14, 0x68, 0xa5, 0x05, 0x48, 0xbf, + 0x01, 0x21, 0x5c, 0x7d, 0x5a, 0x7f, 0x14, 0x40, 0x5c, 0x75, 0x00, 0x23, + 0x82, 0x6d, 0x82, 0xf8, 0x31, 0x30, 0x82, 0x6d, 0x16, 0x32, 0x13, 0x7f, + 0x01, 0x2b, 0x1e, 0xd1, 0x83, 0x68, 0x98, 0x33, 0x1b, 0x68, 0x14, 0x78, + 0x44, 0xea, 0x13, 0x43, 0x13, 0x70, 0x00, 0x22, 0x43, 0x69, 0x43, 0xf8, + 0x04, 0x2f, 0x83, 0x6d, 0x9a, 0x7d, 0x42, 0xb9, 0x1c, 0x68, 0x44, 0xf4, + 0x00, 0x34, 0x1c, 0x60, 0x42, 0x6d, 0x14, 0x68, 0xa5, 0x03, 0x48, 0xbf, + 0x01, 0x21, 0x9c, 0x7d, 0x9a, 0x7f, 0x14, 0x40, 0x9c, 0x75, 0x00, 0x23, + 0x80, 0x6d, 0x80, 0xf8, 0x32, 0x30, 0x08, 0x46, 0x30, 0xbd, 0x70, 0xb5, + 0x82, 0x6d, 0x12, 0xf8, 0x24, 0x1f, 0x49, 0xb1, 0x81, 0x68, 0x01, 0xf1, + 0x8c, 0x03, 0x03, 0x24, 0x1c, 0x60, 0x02, 0x26, 0x15, 0x78, 0x41, 0xf8, + 0xe0, 0x5f, 0x1e, 0x60, 0x51, 0x78, 0x51, 0xb1, 0x81, 0x68, 0x01, 0xf1, + 0x8c, 0x03, 0x0c, 0x24, 0x1c, 0x60, 0x08, 0x24, 0x55, 0x78, 0x2d, 0x02, + 0x41, 0xf8, 0xe4, 0x5f, 0x1c, 0x60, 0x91, 0x78, 0x51, 0xb1, 0x80, 0x68, + 0x00, 0xf1, 0x8c, 0x01, 0x30, 0x23, 0x0b, 0x60, 0x92, 0x78, 0x12, 0x04, + 0x40, 0xf8, 0xe8, 0x2f, 0x20, 0x20, 0x08, 0x60, 0x70, 0xbd, 0x70, 0xb5, + 0x83, 0x6d, 0x03, 0xf1, 0x24, 0x04, 0x00, 0x21, 0x22, 0x78, 0x72, 0xb1, + 0x82, 0x6b, 0xc5, 0x6b, 0xaa, 0x42, 0x09, 0xd3, 0x1a, 0x68, 0x42, 0xf0, + 0x04, 0x02, 0x1a, 0x60, 0x45, 0x6d, 0x2a, 0x78, 0x56, 0x07, 0x03, 0xd5, + 0x01, 0x21, 0x01, 0xe0, 0x52, 0x1c, 0x82, 0x63, 0x62, 0x78, 0x72, 0xb1, + 0x02, 0x6c, 0x45, 0x6c, 0xaa, 0x42, 0x09, 0xd3, 0x1a, 0x68, 0x42, 0xf4, + 0x80, 0x62, 0x1a, 0x60, 0x45, 0x6d, 0x2a, 0x68, 0x56, 0x05, 0x03, 0xd5, + 0x01, 0x21, 0x01, 0xe0, 0x52, 0x1c, 0x02, 0x64, 0xa2, 0x78, 0x72, 0xb1, + 0x82, 0x6c, 0xc4, 0x6c, 0xa2, 0x42, 0x09, 0xd3, 0x1a, 0x68, 0x42, 0xf4, + 0x80, 0x22, 0x1a, 0x60, 0x40, 0x6d, 0x02, 0x68, 0x53, 0x03, 0x03, 0xd5, + 0x01, 0x21, 0x01, 0xe0, 0x52, 0x1c, 0x82, 0x64, 0x08, 0x46, 0x70, 0xbd, + 0x38, 0xb5, 0xff, 0x24, 0xc1, 0xf1, 0x08, 0x05, 0xec, 0x40, 0x84, 0x70, + 0xc2, 0x70, 0x43, 0x60, 0x08, 0x29, 0x3f, 0xbf, 0x81, 0x78, 0x49, 0x1c, + 0x51, 0x43, 0x81, 0x29, 0x01, 0xd2, 0x08, 0x2a, 0x01, 0xd9, 0x04, 0x20, + 0x32, 0xbd, 0x00, 0x21, 0x01, 0x70, 0x41, 0x70, 0xbd, 0xe8, 0x32, 0x40, + 0x49, 0xe0, 0x10, 0xb5, 0x01, 0x46, 0x0b, 0x78, 0x4a, 0x78, 0x9a, 0x1a, + 0x00, 0x20, 0xd4, 0xb2, 0x0c, 0xb9, 0x02, 0x20, 0x10, 0xbd, 0x89, 0x78, + 0x49, 0x1c, 0xd2, 0xb2, 0xc9, 0xb2, 0x8a, 0x42, 0x28, 0xbf, 0x01, 0x20, + 0x10, 0xbd, 0xf8, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0xff, 0xf7, 0xe9, 0xff, + 0x00, 0x26, 0x02, 0x28, 0x08, 0xbf, 0x02, 0x26, 0x0f, 0xd0, 0xe1, 0x78, + 0x67, 0x78, 0xa0, 0x78, 0x0a, 0x46, 0x07, 0x40, 0x63, 0x68, 0x11, 0xfb, + 0x07, 0xf1, 0xc9, 0xb2, 0x19, 0x44, 0x28, 0x46, 0xfc, 0xf7, 0x90, 0xff, + 0x61, 0x78, 0x49, 0x1c, 0x61, 0x70, 0x30, 0x46, 0xf2, 0xbd, 0xf8, 0xb5, + 0x04, 0x46, 0x0d, 0x46, 0xff, 0xf7, 0xcd, 0xff, 0x00, 0x26, 0x01, 0x28, + 0x08, 0xbf, 0x01, 0x26, 0x0f, 0xd0, 0xe3, 0x78, 0x27, 0x78, 0xa0, 0x78, + 0x1a, 0x46, 0x29, 0x46, 0x07, 0x40, 0x65, 0x68, 0x13, 0xfb, 0x07, 0xf3, + 0xdb, 0xb2, 0xe8, 0x18, 0xfc, 0xf7, 0x74, 0xff, 0x21, 0x78, 0x49, 0x1c, + 0x21, 0x70, 0x30, 0x46, 0xf2, 0xbd, 0x2d, 0xe9, 0xfe, 0x45, 0x04, 0x46, + 0x00, 0x25, 0x25, 0x70, 0x65, 0x70, 0xa8, 0x46, 0xa8, 0xf1, 0x1f, 0x07, + 0xba, 0x46, 0x00, 0x26, 0x16, 0xe0, 0xc0, 0xb2, 0x01, 0xf0, 0x26, 0xf9, + 0x5f, 0xfa, 0x8a, 0xf1, 0x0a, 0xf1, 0x01, 0x0a, 0x0d, 0xf8, 0x01, 0x00, + 0x5f, 0xfa, 0x8a, 0xf1, 0xe2, 0x78, 0x91, 0x42, 0xf1, 0xd3, 0x82, 0x46, + 0x28, 0x00, 0x04, 0xd1, 0x69, 0x46, 0x20, 0x46, 0xff, 0xf7, 0xc3, 0xff, + 0x05, 0x46, 0x76, 0x1c, 0xa0, 0x78, 0xf1, 0xb2, 0x88, 0x42, 0x03, 0xd3, + 0x00, 0x21, 0x50, 0x46, 0x8a, 0x46, 0xe9, 0xe7, 0x00, 0x26, 0x0f, 0xe0, + 0xc0, 0xb2, 0x01, 0xf0, 0x05, 0xf9, 0xf9, 0xb2, 0x1d, 0xf8, 0x01, 0x10, + 0x81, 0x42, 0x18, 0xbf, 0x08, 0x25, 0x7f, 0x1c, 0xe2, 0x78, 0xf9, 0xb2, + 0x91, 0x42, 0xf1, 0xd3, 0x07, 0x46, 0x76, 0x1c, 0xa0, 0x78, 0xf1, 0xb2, + 0x88, 0x42, 0x09, 0xd3, 0x28, 0x00, 0x04, 0xd1, 0x69, 0x46, 0x20, 0x46, + 0xff, 0xf7, 0x81, 0xff, 0x05, 0x46, 0x38, 0x46, 0x00, 0x27, 0xeb, 0xe7, + 0x08, 0xf1, 0x01, 0x08, 0xb8, 0xf1, 0x02, 0x0f, 0xb6, 0xd3, 0x28, 0x46, + 0xbd, 0xe8, 0xfe, 0x85, 0xf8, 0xb5, 0x05, 0x46, 0x01, 0x20, 0x28, 0x71, + 0x00, 0x24, 0x4a, 0x78, 0x2a, 0x70, 0x88, 0x78, 0x68, 0x70, 0xca, 0x78, + 0xea, 0x70, 0x08, 0x78, 0x68, 0xb9, 0xc8, 0x68, 0xe8, 0x60, 0x8a, 0x68, + 0xaa, 0x60, 0x08, 0x69, 0x28, 0x61, 0x4a, 0x69, 0x6a, 0x61, 0x88, 0x69, + 0xa8, 0x61, 0xca, 0x69, 0xea, 0x61, 0x08, 0x6a, 0x28, 0x62, 0x00, 0x20, + 0x6b, 0x78, 0xaa, 0x78, 0xc3, 0x40, 0x03, 0xf0, 0x01, 0x03, 0x9a, 0x18, + 0xaa, 0x70, 0x40, 0x1c, 0xc2, 0xb2, 0x04, 0x2a, 0xf4, 0xd3, 0x48, 0x79, + 0x30, 0xb1, 0x01, 0x28, 0x06, 0xd1, 0x08, 0x78, 0x43, 0x1e, 0x9b, 0x41, + 0xdb, 0x0f, 0x02, 0xe0, 0x01, 0x23, 0x00, 0xe0, 0x00, 0x23, 0x08, 0x79, + 0x30, 0xb1, 0x01, 0x28, 0x06, 0xd1, 0x08, 0x78, 0x42, 0x1e, 0x92, 0x41, + 0xd2, 0x0f, 0x02, 0xe0, 0x01, 0x22, 0x00, 0xe0, 0x00, 0x22, 0x88, 0x79, + 0x30, 0xb1, 0x01, 0x28, 0x06, 0xd1, 0x08, 0x78, 0x46, 0x1e, 0xb6, 0x41, + 0xf6, 0x0f, 0x02, 0xe0, 0x01, 0x26, 0x00, 0xe0, 0x00, 0x26, 0x00, 0x2b, + 0x00, 0xf0, 0xe2, 0x80, 0xa8, 0x69, 0xe9, 0x69, 0x4c, 0x30, 0xb7, 0xee, + 0x00, 0x0a, 0xc3, 0x6a, 0x0b, 0x60, 0x81, 0xed, 0x01, 0x0a, 0x01, 0xf1, + 0xe0, 0x03, 0x81, 0xed, 0x02, 0x0a, 0x81, 0xed, 0x03, 0x0a, 0x81, 0xed, + 0x04, 0x0a, 0x4c, 0x61, 0x8c, 0x61, 0x1c, 0x60, 0x5c, 0x60, 0x9c, 0x60, + 0xdc, 0x60, 0x1c, 0x61, 0x5c, 0x61, 0x9c, 0x61, 0xdc, 0x61, 0x1c, 0x62, + 0x5c, 0x62, 0x00, 0x23, 0x4f, 0xea, 0x43, 0x0c, 0xac, 0xf1, 0x01, 0x07, + 0x7f, 0xb2, 0x01, 0xeb, 0x83, 0x0e, 0x00, 0xee, 0x10, 0x7a, 0x0e, 0xf5, + 0x84, 0x7c, 0xb8, 0xee, 0xc0, 0x0a, 0xdf, 0xed, 0x83, 0x0a, 0x60, 0xee, + 0x20, 0x0a, 0xcc, 0xed, 0x00, 0x0a, 0xb2, 0xee, 0x08, 0x1a, 0xf0, 0xee, + 0x08, 0x1a, 0xf6, 0xee, 0x08, 0x0a, 0x5b, 0x1c, 0x20, 0xee, 0x01, 0x1a, + 0x60, 0xee, 0x21, 0x1a, 0x20, 0xee, 0x20, 0x0a, 0x01, 0x2b, 0x8c, 0xed, + 0x02, 0x1a, 0xcc, 0xed, 0x04, 0x1a, 0x8c, 0xed, 0x06, 0x0a, 0xd7, 0xdd, + 0x00, 0x23, 0x9c, 0x46, 0x01, 0xeb, 0x83, 0x07, 0x07, 0xf5, 0x94, 0x77, + 0x5b, 0x1c, 0xc7, 0xf8, 0x00, 0xc0, 0x3c, 0x62, 0xc7, 0xf8, 0x40, 0xc0, + 0x08, 0x2b, 0x3c, 0x66, 0xf2, 0xdb, 0x6f, 0xf0, 0x03, 0x03, 0x4f, 0xfa, + 0x83, 0xfc, 0x00, 0xee, 0x10, 0xca, 0xb8, 0xee, 0xc0, 0x0a, 0xf6, 0xee, + 0x00, 0x0a, 0x01, 0xeb, 0x83, 0x07, 0x30, 0xee, 0x20, 0x0a, 0x9f, 0xed, + 0x68, 0x1a, 0x07, 0xf5, 0xdc, 0x77, 0x20, 0xee, 0x01, 0x1a, 0xd0, 0xed, + 0x0b, 0x1a, 0x61, 0xee, 0x21, 0x1a, 0xc7, 0xed, 0x00, 0x1a, 0xdf, 0xed, + 0x63, 0x0a, 0x00, 0xf0, 0xcd, 0xf8, 0x87, 0xed, 0x08, 0x1a, 0xdf, 0xed, + 0x61, 0x0a, 0x00, 0xf0, 0xc7, 0xf8, 0x87, 0xed, 0x10, 0x1a, 0xf2, 0xee, + 0x00, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0x90, 0xed, 0x0b, 0x1a, 0x5b, 0x1c, + 0x20, 0xee, 0x01, 0x1a, 0x04, 0x2b, 0x87, 0xed, 0x18, 0x1a, 0xce, 0xdb, + 0x00, 0x23, 0x01, 0x27, 0x9f, 0x40, 0xff, 0xb2, 0x01, 0xeb, 0x83, 0x0c, + 0x00, 0xee, 0x10, 0x7a, 0x0c, 0xf5, 0x0a, 0x7c, 0xb8, 0xee, 0x40, 0x0a, + 0xdf, 0xed, 0x52, 0x0a, 0x9f, 0xed, 0x52, 0x1a, 0xdf, 0xed, 0x52, 0x1a, + 0x5b, 0x1c, 0x60, 0xee, 0x20, 0x0a, 0x20, 0xee, 0x01, 0x1a, 0x20, 0xee, + 0x21, 0x0a, 0x03, 0x2b, 0xcc, 0xed, 0x00, 0x0a, 0x8c, 0xed, 0x03, 0x1a, + 0x8c, 0xed, 0x06, 0x0a, 0xdf, 0xd3, 0x00, 0x23, 0x9c, 0x46, 0x01, 0xeb, + 0x83, 0x07, 0x5b, 0x1c, 0xc7, 0xf8, 0x24, 0xc0, 0x7c, 0x64, 0x08, 0x2b, + 0xc7, 0xf8, 0x64, 0xc0, 0xc7, 0xf8, 0x84, 0x40, 0xf3, 0xd3, 0x00, 0x23, + 0x01, 0xeb, 0x83, 0x07, 0x5b, 0x1c, 0x0f, 0x2b, 0xc7, 0xf8, 0xa4, 0xc0, + 0xf8, 0xd3, 0x00, 0x78, 0x08, 0x77, 0xa9, 0x69, 0x91, 0xf8, 0x4d, 0x00, + 0xe9, 0x69, 0x48, 0x77, 0xa8, 0x69, 0x90, 0xf8, 0x4e, 0x10, 0xe8, 0x69, + 0x81, 0x77, 0xa9, 0x69, 0x91, 0xf8, 0x4f, 0x00, 0xe9, 0x69, 0xc8, 0x77, + 0xa8, 0x69, 0x90, 0xf8, 0x50, 0x10, 0xe8, 0x69, 0x80, 0xf8, 0x20, 0x10, + 0xa9, 0x69, 0x91, 0xf8, 0x72, 0x00, 0xe9, 0x69, 0x81, 0xf8, 0x21, 0x00, + 0xa8, 0x69, 0x90, 0xf8, 0x72, 0x10, 0xe8, 0x69, 0x80, 0xf8, 0x22, 0x10, + 0x00, 0x27, 0x28, 0x6a, 0x04, 0x60, 0x44, 0x60, 0x07, 0x72, 0x02, 0x20, + 0x29, 0x6a, 0x48, 0x72, 0xff, 0x23, 0x29, 0x6a, 0x88, 0x72, 0x29, 0x6a, + 0xc8, 0x72, 0x04, 0x20, 0x29, 0x6a, 0x0c, 0x73, 0x29, 0x6a, 0x4c, 0x73, + 0x29, 0x6a, 0x8c, 0x73, 0x29, 0x6a, 0xcc, 0x73, 0x29, 0x6a, 0x8c, 0x74, + 0x29, 0x6a, 0xc8, 0x74, 0x28, 0x6a, 0x84, 0x82, 0x83, 0x75, 0x6f, 0xf0, + 0x06, 0x00, 0x29, 0x6a, 0x88, 0x76, 0x07, 0x20, 0x29, 0x6a, 0xc8, 0x76, + 0x08, 0x20, 0x29, 0x6a, 0x0c, 0x77, 0x29, 0x6a, 0x4c, 0x77, 0x29, 0x6a, + 0x88, 0x77, 0x29, 0x6a, 0xcc, 0x77, 0x28, 0x6a, 0x40, 0xf8, 0x20, 0x4f, + 0x04, 0x61, 0x44, 0x61, 0x84, 0x61, 0xc4, 0x61, 0x07, 0x73, 0x29, 0x6a, + 0x81, 0xf8, 0x2d, 0x40, 0x28, 0x6a, 0x44, 0x62, 0xc4, 0x75, 0x28, 0x6a, + 0x84, 0x62, 0x04, 0x76, 0x1a, 0xb1, 0x28, 0x46, 0x00, 0xf0, 0xc6, 0xf9, + 0x04, 0x46, 0x16, 0xb1, 0x28, 0x46, 0x01, 0xf0, 0x83, 0xf8, 0x02, 0x20, + 0x28, 0x71, 0x28, 0x6a, 0x07, 0x74, 0x28, 0x6a, 0x47, 0x74, 0x20, 0x46, + 0xf2, 0xbd, 0x00, 0x00, 0x9a, 0x99, 0x19, 0x42, 0x00, 0x00, 0x00, 0x44, + 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x42, 0x02, 0x2b, 0x87, 0xc1, + 0x02, 0x2b, 0x07, 0xc1, 0x02, 0x2b, 0x07, 0xc0, 0x60, 0xee, 0x20, 0x0a, + 0x90, 0xed, 0x0b, 0x1a, 0x20, 0xee, 0x81, 0x1a, 0x70, 0x47, 0x2d, 0xe9, + 0xf0, 0x41, 0x04, 0x46, 0x0e, 0x46, 0x21, 0x6a, 0xd1, 0xf8, 0x00, 0x80, + 0x4f, 0x68, 0x00, 0x25, 0x0d, 0x60, 0x4d, 0x60, 0x08, 0x7c, 0x30, 0xb9, + 0x8a, 0x75, 0x01, 0x21, 0x22, 0x6a, 0x11, 0x74, 0x20, 0x46, 0x01, 0xf0, + 0xc5, 0xf8, 0x21, 0x6a, 0x08, 0x7c, 0x01, 0x28, 0x20, 0xd1, 0x20, 0x79, + 0x04, 0x28, 0x14, 0xd0, 0xe6, 0xb9, 0x03, 0x22, 0x22, 0x71, 0xc8, 0x7f, + 0x20, 0xb9, 0x4a, 0x7f, 0x09, 0x7f, 0x20, 0x46, 0x01, 0xf0, 0x0c, 0xfd, + 0x20, 0x6a, 0x42, 0x7f, 0x01, 0x7f, 0x20, 0x46, 0x01, 0xf0, 0x5a, 0xfc, + 0x20, 0x46, 0x01, 0xf0, 0x11, 0xfb, 0x04, 0x20, 0x07, 0xe0, 0x01, 0x2e, + 0x06, 0xd1, 0x05, 0x20, 0x20, 0x71, 0x20, 0x46, 0x01, 0xf0, 0x92, 0xfb, + 0x06, 0x20, 0x20, 0x71, 0x20, 0x6a, 0x01, 0x7c, 0x02, 0x29, 0x08, 0xd1, + 0x20, 0x46, 0x01, 0xf0, 0x66, 0xf9, 0x21, 0x6a, 0x03, 0x20, 0x08, 0x74, + 0x20, 0x46, 0x01, 0xf0, 0x93, 0xf8, 0x20, 0x6a, 0x01, 0x7c, 0x03, 0x29, + 0x62, 0xd1, 0x80, 0x8a, 0x00, 0x28, 0x62, 0xd0, 0x20, 0x79, 0x04, 0x28, + 0x28, 0xd0, 0x00, 0x2e, 0x5a, 0xd1, 0x20, 0x46, 0x01, 0xf0, 0xdd, 0xfa, + 0x00, 0x28, 0x55, 0xd0, 0x03, 0x20, 0x00, 0xf0, 0x0d, 0xf9, 0x13, 0xd0, + 0x00, 0x22, 0x00, 0xf0, 0xf5, 0xf8, 0x00, 0xf1, 0x0c, 0x06, 0x23, 0xfa, + 0x06, 0xf6, 0xf6, 0x07, 0x08, 0xd4, 0x00, 0xf1, 0x14, 0x06, 0xf3, 0x40, + 0xdb, 0x07, 0x03, 0xd4, 0x52, 0x1c, 0xd3, 0xb2, 0x04, 0x2b, 0xee, 0xd3, + 0x00, 0xf0, 0xeb, 0xf8, 0x20, 0x46, 0x02, 0xf0, 0x3d, 0xfb, 0x00, 0xf0, + 0xf0, 0xf8, 0x20, 0x46, 0x01, 0xf0, 0xc8, 0xfa, 0x04, 0x20, 0x32, 0xe0, + 0x01, 0x2e, 0x31, 0xd1, 0x05, 0x20, 0x20, 0x71, 0x20, 0x46, 0x01, 0xf0, + 0x23, 0xfe, 0x20, 0x46, 0x02, 0xf0, 0x94, 0xfb, 0x20, 0x46, 0x02, 0xf0, + 0x55, 0xfd, 0x20, 0x46, 0x02, 0xf0, 0x3f, 0xfe, 0x20, 0x46, 0x02, 0xf0, + 0x98, 0xfe, 0x20, 0x6a, 0x81, 0x8a, 0x01, 0x29, 0x04, 0xbf, 0x20, 0x46, + 0x02, 0xf0, 0x3c, 0xfc, 0x20, 0x46, 0x02, 0xf0, 0x61, 0xff, 0x20, 0x46, + 0x02, 0xf0, 0xc7, 0xff, 0x20, 0x46, 0x03, 0xf0, 0x49, 0xf8, 0x20, 0x46, + 0x03, 0xf0, 0x56, 0xfa, 0x20, 0x46, 0x03, 0xf0, 0xd9, 0xfb, 0x20, 0x46, + 0x03, 0xf0, 0x2c, 0xfc, 0x00, 0xf0, 0xbd, 0xf8, 0x20, 0x6a, 0x81, 0x8a, + 0x4a, 0x1e, 0x82, 0x82, 0x06, 0x20, 0x20, 0x71, 0x21, 0x6a, 0x88, 0x8a, + 0x60, 0xb9, 0x20, 0x6a, 0x00, 0x7c, 0x03, 0x28, 0x18, 0xbf, 0x02, 0x28, + 0x06, 0xd1, 0x20, 0x46, 0x01, 0xf0, 0xed, 0xf8, 0x21, 0x6a, 0x0d, 0x74, + 0x07, 0x20, 0x20, 0x71, 0x20, 0x6a, 0xa2, 0x69, 0x01, 0x68, 0x13, 0x68, + 0x48, 0xea, 0x01, 0x01, 0x03, 0xea, 0x01, 0x04, 0x03, 0xea, 0x08, 0x03, + 0x9c, 0x42, 0x79, 0xe0, 0x2d, 0xe9, 0xf0, 0x41, 0x04, 0x46, 0x00, 0x25, + 0x20, 0x6a, 0x06, 0x68, 0x47, 0x68, 0x05, 0x60, 0x45, 0x60, 0x88, 0x46, + 0x40, 0x7c, 0x28, 0xb9, 0x20, 0x46, 0x01, 0xf0, 0x17, 0xf9, 0x21, 0x6a, + 0x01, 0x20, 0x48, 0x74, 0x20, 0x79, 0x09, 0x28, 0x2b, 0xd0, 0xb8, 0xf1, + 0x00, 0x0f, 0x58, 0xd1, 0x20, 0x46, 0x01, 0xf0, 0x4e, 0xfa, 0x00, 0x28, + 0x53, 0xd0, 0x08, 0x20, 0x00, 0xf0, 0x7e, 0xf8, 0x15, 0xd0, 0x00, 0x22, + 0x00, 0xf0, 0x66, 0xf8, 0x00, 0xf1, 0x0c, 0x0c, 0x23, 0xfa, 0x0c, 0xfe, + 0x5f, 0xea, 0xce, 0x78, 0x09, 0xd4, 0x00, 0xf1, 0x14, 0x0c, 0x23, 0xfa, + 0x0c, 0xf3, 0xdb, 0x07, 0x03, 0xd4, 0x52, 0x1c, 0xd3, 0xb2, 0x04, 0x2b, + 0xec, 0xd3, 0x00, 0xf0, 0x5a, 0xf8, 0x20, 0x46, 0x02, 0xf0, 0xac, 0xfa, + 0x00, 0xf0, 0x5f, 0xf8, 0x20, 0x46, 0x01, 0xf0, 0x37, 0xfa, 0x09, 0x20, + 0x2e, 0xe0, 0xb8, 0xf1, 0x01, 0x0f, 0x2c, 0xd1, 0x0a, 0x20, 0x20, 0x71, + 0x20, 0x46, 0x02, 0xf0, 0xf1, 0xfa, 0x21, 0x6a, 0x08, 0x7e, 0x10, 0xbb, + 0x20, 0x46, 0x01, 0xf0, 0x8b, 0xfd, 0x20, 0x46, 0x02, 0xf0, 0xfc, 0xfa, + 0x20, 0x46, 0x02, 0xf0, 0xbd, 0xfc, 0x20, 0x46, 0x02, 0xf0, 0xa7, 0xfd, + 0x20, 0x46, 0x02, 0xf0, 0x00, 0xfe, 0x20, 0x46, 0x02, 0xf0, 0xd0, 0xfe, + 0x20, 0x46, 0x02, 0xf0, 0x36, 0xff, 0x20, 0x46, 0x02, 0xf0, 0xb8, 0xff, + 0x20, 0x46, 0x03, 0xf0, 0xc5, 0xf9, 0x20, 0x46, 0x03, 0xf0, 0x48, 0xfb, + 0x20, 0x46, 0x03, 0xf0, 0x9b, 0xfb, 0x00, 0xf0, 0x2c, 0xf8, 0x0b, 0x20, + 0x20, 0x71, 0x20, 0x6a, 0xa2, 0x69, 0x01, 0x68, 0x13, 0x68, 0x31, 0x43, + 0x03, 0xea, 0x01, 0x04, 0x1e, 0x40, 0xb4, 0x42, 0x06, 0xd1, 0x43, 0x68, + 0x52, 0x68, 0x3b, 0x43, 0x13, 0x40, 0x3a, 0x40, 0x93, 0x42, 0x00, 0xd0, + 0x01, 0x25, 0x01, 0x60, 0x41, 0x68, 0x0f, 0x43, 0x47, 0x60, 0x28, 0x46, + 0xbd, 0xe8, 0xf0, 0x81, 0xc8, 0x7c, 0x4b, 0x6a, 0x50, 0xfa, 0x82, 0xf0, + 0x00, 0xf0, 0x03, 0x00, 0x70, 0x47, 0x42, 0x1c, 0xca, 0x74, 0x00, 0x07, + 0xa1, 0x68, 0x01, 0xf2, 0x8c, 0x41, 0x40, 0xf0, 0x80, 0x40, 0x08, 0x60, + 0x70, 0x47, 0x20, 0x46, 0x01, 0xf0, 0xde, 0xb9, 0x21, 0x6a, 0x1b, 0x4a, + 0x20, 0x71, 0x48, 0x6a, 0x10, 0x42, 0x70, 0x47, 0x00, 0x79, 0x70, 0x47, + 0x10, 0xb5, 0x04, 0x46, 0x0c, 0x20, 0x20, 0x71, 0xc0, 0x21, 0xa0, 0x68, + 0x00, 0xf2, 0x84, 0x40, 0x01, 0x60, 0x00, 0x21, 0x20, 0x6a, 0x41, 0x62, + 0xc1, 0x75, 0x00, 0x20, 0x21, 0x6a, 0x88, 0x74, 0x22, 0x6a, 0x10, 0x7c, + 0x28, 0xb1, 0x20, 0x46, 0x01, 0xf0, 0x21, 0xf8, 0x21, 0x6a, 0x00, 0x20, + 0x08, 0x74, 0x21, 0x6a, 0x48, 0x7c, 0x70, 0xb1, 0xa0, 0x68, 0x0a, 0x4a, + 0x00, 0xf2, 0x8c, 0x40, 0x02, 0x60, 0x00, 0x22, 0x0a, 0x73, 0x21, 0x6a, + 0x4a, 0x73, 0x21, 0x6a, 0x8a, 0x73, 0x21, 0x6a, 0xca, 0x73, 0x21, 0x6a, + 0x4a, 0x74, 0x0d, 0x20, 0x20, 0x71, 0x00, 0x20, 0x10, 0xbd, 0x00, 0x00, + 0x00, 0xf0, 0xf0, 0x00, 0xaa, 0xaa, 0xaa, 0x0a, 0x2d, 0xe9, 0xf8, 0x43, + 0x07, 0x46, 0x00, 0x24, 0x38, 0x6a, 0xd0, 0xf8, 0x00, 0x80, 0x46, 0x68, + 0x04, 0x60, 0x01, 0x23, 0x44, 0x60, 0x03, 0x72, 0x01, 0x21, 0xf8, 0x69, + 0x02, 0x7f, 0x00, 0xf0, 0x60, 0xf8, 0xf8, 0x69, 0x42, 0x7f, 0x02, 0x21, + 0x00, 0xf0, 0x5b, 0xf8, 0xf8, 0x69, 0x82, 0x7f, 0x03, 0x21, 0x00, 0xf0, + 0x56, 0xf8, 0xf8, 0x69, 0xc2, 0x7f, 0x04, 0x21, 0x00, 0xf0, 0x51, 0xf8, + 0xf8, 0x69, 0x90, 0xf8, 0x20, 0x20, 0x05, 0x21, 0x00, 0xf0, 0x4b, 0xf8, + 0x01, 0x25, 0xa1, 0x46, 0x5f, 0xfa, 0x89, 0xf2, 0xe9, 0xb2, 0x38, 0x46, + 0x01, 0xf0, 0xb4, 0xfa, 0x09, 0xf1, 0x01, 0x09, 0x5f, 0xfa, 0x89, 0xf0, + 0x08, 0x28, 0xf3, 0xd3, 0x6d, 0x1c, 0xe9, 0xb2, 0x05, 0x29, 0xee, 0xd3, + 0x00, 0x25, 0xea, 0xb2, 0x05, 0x21, 0x38, 0x46, 0x01, 0xf0, 0xa4, 0xfa, + 0x6d, 0x1c, 0xe8, 0xb2, 0x0f, 0x28, 0xf6, 0xd3, 0x38, 0x46, 0x02, 0xf0, + 0x78, 0xfe, 0x38, 0x46, 0x02, 0xf0, 0xfa, 0xfe, 0x38, 0x46, 0x03, 0xf0, + 0x07, 0xf9, 0x38, 0x46, 0x03, 0xf0, 0x8a, 0xfa, 0x38, 0x46, 0x03, 0xf0, + 0xdd, 0xfa, 0x39, 0x6a, 0x0c, 0x72, 0x38, 0x46, 0x01, 0xf0, 0x4c, 0xf9, + 0x38, 0x6a, 0xba, 0x69, 0x01, 0x68, 0x13, 0x68, 0x48, 0xea, 0x01, 0x01, + 0x03, 0xea, 0x01, 0x07, 0x03, 0xea, 0x08, 0x03, 0x9f, 0x42, 0x06, 0xd1, + 0x43, 0x68, 0x52, 0x68, 0x33, 0x43, 0x13, 0x40, 0x32, 0x40, 0x93, 0x42, + 0x00, 0xd0, 0x01, 0x24, 0x01, 0x60, 0x41, 0x68, 0x0e, 0x43, 0x46, 0x60, + 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0x38, 0x46, 0x01, 0xf0, 0x60, 0xbb, + 0x00, 0x6a, 0x00, 0x21, 0x01, 0x60, 0x41, 0x60, 0x00, 0x20, 0x70, 0x47, + 0x2d, 0xe9, 0xf0, 0x41, 0x05, 0x46, 0x01, 0x20, 0x68, 0x72, 0x00, 0x24, + 0x4a, 0x78, 0x2a, 0x70, 0x88, 0x78, 0x68, 0x70, 0xca, 0x78, 0xaa, 0x70, + 0x08, 0x79, 0xe8, 0x70, 0x4a, 0x79, 0x2a, 0x71, 0x8b, 0x79, 0x6b, 0x71, + 0x08, 0x78, 0x30, 0xbb, 0xc8, 0x68, 0xe8, 0x60, 0x0a, 0x69, 0x2a, 0x61, + 0x48, 0x6a, 0x68, 0x62, 0x8a, 0x6b, 0xaa, 0x63, 0x08, 0x6c, 0xe8, 0x64, + 0x00, 0x20, 0x01, 0xeb, 0x80, 0x02, 0x05, 0xeb, 0x80, 0x06, 0x93, 0x6a, + 0xb3, 0x62, 0x4f, 0xf4, 0xd2, 0x73, 0xca, 0x6b, 0x43, 0x43, 0x05, 0xf1, + 0x3c, 0x06, 0x13, 0x44, 0x46, 0xf8, 0x20, 0x30, 0x40, 0x1c, 0x04, 0x28, + 0xed, 0xd3, 0x00, 0x20, 0x01, 0xeb, 0x80, 0x02, 0x05, 0xeb, 0x80, 0x06, + 0x53, 0x69, 0x73, 0x61, 0x40, 0x1c, 0x04, 0x28, 0xf6, 0xd3, 0x00, 0x20, + 0xa8, 0x71, 0xe8, 0x71, 0x28, 0x72, 0xab, 0x78, 0x2a, 0x7a, 0x00, 0xf0, + 0xf6, 0xf8, 0x2a, 0x72, 0xf9, 0xd3, 0x00, 0x20, 0x2b, 0x78, 0xaa, 0x79, + 0x00, 0xf0, 0xef, 0xf8, 0xaa, 0x71, 0xf9, 0xd3, 0x00, 0x20, 0x6b, 0x78, + 0xea, 0x79, 0xc3, 0x40, 0x03, 0xf0, 0x01, 0x03, 0x9a, 0x18, 0xea, 0x71, + 0x40, 0x1c, 0xc2, 0xb2, 0x03, 0x2a, 0xf4, 0xd3, 0x08, 0x7a, 0x30, 0xb1, + 0x01, 0x28, 0x06, 0xd1, 0x08, 0x78, 0x43, 0x1e, 0x9b, 0x41, 0xdb, 0x0f, + 0x02, 0xe0, 0x01, 0x23, 0x00, 0xe0, 0x00, 0x23, 0xc8, 0x79, 0x30, 0xb1, + 0x01, 0x28, 0x06, 0xd1, 0x08, 0x78, 0x42, 0x1e, 0x92, 0x41, 0xd2, 0x0f, + 0x02, 0xe0, 0x01, 0x22, 0x00, 0xe0, 0x00, 0x22, 0x48, 0x7a, 0x30, 0xb1, + 0x01, 0x28, 0x06, 0xd1, 0x08, 0x78, 0x46, 0x1e, 0xb6, 0x41, 0xf6, 0x0f, + 0x02, 0xe0, 0x01, 0x26, 0x00, 0xe0, 0x00, 0x26, 0x00, 0x2b, 0x44, 0xd0, + 0x00, 0x20, 0xa9, 0x78, 0xc1, 0x40, 0xcb, 0x07, 0x3c, 0xd5, 0x05, 0xeb, + 0x80, 0x01, 0xcb, 0x6b, 0x1c, 0x60, 0x00, 0x23, 0xcf, 0x6b, 0x7b, 0x60, + 0x98, 0x46, 0xcf, 0x6b, 0xbb, 0x60, 0x00, 0xf0, 0xa3, 0xf8, 0xc7, 0xf8, + 0x0c, 0x80, 0x9f, 0xb2, 0x0c, 0x2f, 0xf8, 0xd3, 0x00, 0x23, 0xcf, 0x6b, + 0x3c, 0x37, 0x1f, 0xfa, 0x83, 0xfe, 0x47, 0xf8, 0x2e, 0x80, 0x5b, 0x1c, + 0x9f, 0xb2, 0x24, 0x2f, 0xf5, 0xd3, 0x00, 0x23, 0xcf, 0x6b, 0x1f, 0xfa, + 0x83, 0xfc, 0x07, 0xeb, 0x8c, 0x0e, 0xaf, 0x6b, 0xff, 0x6e, 0xce, 0xf8, + 0xcc, 0x70, 0x5b, 0x1c, 0x9f, 0xb2, 0x24, 0x2f, 0xf2, 0xd3, 0x00, 0x23, + 0x4f, 0xf0, 0x7e, 0x58, 0x00, 0xf0, 0x80, 0xf8, 0xc7, 0xf8, 0x5c, 0x81, + 0x9f, 0xb2, 0x09, 0x2f, 0xf8, 0xd3, 0x00, 0x23, 0x98, 0x46, 0x00, 0xf0, + 0x77, 0xf8, 0xc7, 0xf8, 0x80, 0x81, 0x9f, 0xb2, 0x09, 0x2f, 0xf8, 0xd3, + 0x40, 0x1c, 0x04, 0x28, 0xbb, 0xd3, 0xe9, 0x6c, 0x0c, 0x74, 0x02, 0x20, + 0xe9, 0x6c, 0x4c, 0x74, 0x00, 0x27, 0xe9, 0x6c, 0x08, 0x75, 0xe9, 0x6c, + 0x48, 0x75, 0x01, 0x20, 0xe9, 0x6c, 0x88, 0x75, 0xe9, 0x6c, 0xc8, 0x75, + 0xff, 0x20, 0xe9, 0x6c, 0xcc, 0x76, 0xe9, 0x6c, 0x8c, 0x83, 0xe9, 0x6c, + 0x88, 0x77, 0x01, 0x20, 0xe9, 0x6c, 0x4c, 0x62, 0xe9, 0x6c, 0x81, 0xf8, + 0x20, 0x00, 0xe9, 0x6c, 0x81, 0xf8, 0x21, 0x40, 0xe9, 0x6c, 0x81, 0xf8, + 0x22, 0x40, 0xe9, 0x6c, 0x81, 0xf8, 0x23, 0x00, 0xe8, 0x6c, 0x84, 0x65, + 0xa9, 0x6b, 0xe8, 0x6c, 0xd1, 0xf8, 0x90, 0x30, 0xc3, 0x65, 0x00, 0x20, + 0xa9, 0x78, 0xc1, 0x40, 0xcb, 0x07, 0x0f, 0xd5, 0xeb, 0x6c, 0x43, 0xf8, + 0x20, 0x40, 0xe9, 0x6c, 0x01, 0xeb, 0x80, 0x03, 0x9f, 0x62, 0xe9, 0x6c, + 0x01, 0xf1, 0x38, 0x03, 0x43, 0xf8, 0x20, 0x70, 0xe9, 0x6c, 0x01, 0xeb, + 0x80, 0x03, 0x9f, 0x64, 0x40, 0x1c, 0x04, 0x28, 0xe8, 0xd3, 0xe9, 0x6c, + 0xe8, 0x78, 0x48, 0x76, 0xe9, 0x79, 0xe8, 0x6c, 0x03, 0x29, 0x08, 0xbf, + 0x69, 0x79, 0x03, 0xd0, 0x02, 0x29, 0x0c, 0xbf, 0x29, 0x79, 0xe9, 0x78, + 0x81, 0x76, 0x00, 0x20, 0xa9, 0x78, 0xc1, 0x40, 0xcb, 0x07, 0x03, 0xd4, + 0x40, 0x1c, 0x04, 0x28, 0xf8, 0xd3, 0x01, 0xe0, 0xe9, 0x6c, 0x08, 0x76, + 0x1a, 0xb1, 0x28, 0x46, 0x00, 0xf0, 0x40, 0xfa, 0x04, 0x46, 0x16, 0xb1, + 0x28, 0x46, 0x03, 0xf0, 0x03, 0xfb, 0x02, 0x20, 0x68, 0x72, 0xe8, 0x6c, + 0xc7, 0x74, 0xe8, 0x6c, 0x87, 0x74, 0x20, 0x46, 0xbd, 0xe8, 0xf0, 0x81, + 0xcf, 0x6b, 0x1f, 0xfa, 0x83, 0xfc, 0x07, 0xeb, 0x8c, 0x07, 0x5b, 0x1c, + 0x70, 0x47, 0xc3, 0x40, 0x03, 0xf0, 0x01, 0x03, 0x40, 0x1c, 0x9a, 0x18, + 0x04, 0x28, 0x70, 0x47, 0xf8, 0xb5, 0x84, 0xb0, 0x0d, 0x46, 0x69, 0x46, + 0x00, 0x23, 0x00, 0x24, 0x00, 0x26, 0x00, 0x27, 0x81, 0xe8, 0xd8, 0x00, + 0x00, 0x21, 0x04, 0x46, 0xa0, 0x78, 0xc8, 0x40, 0xc3, 0x07, 0x06, 0xd5, + 0xe0, 0x6c, 0x50, 0xf8, 0x21, 0x30, 0x4d, 0xf8, 0x21, 0x30, 0x40, 0xf8, + 0x21, 0x70, 0x49, 0x1c, 0x04, 0x29, 0xf1, 0xd3, 0xe0, 0x6c, 0xc1, 0x7c, + 0x31, 0xb9, 0x82, 0x77, 0x20, 0x46, 0x03, 0xf0, 0xeb, 0xfa, 0xe0, 0x6c, + 0x01, 0x21, 0xc1, 0x74, 0xe1, 0x6c, 0x88, 0x8b, 0x00, 0x28, 0x79, 0xd0, + 0x60, 0x7a, 0x01, 0x27, 0x04, 0x28, 0x3f, 0xd0, 0x00, 0x2d, 0x70, 0xd1, + 0x20, 0x46, 0x03, 0xf0, 0x67, 0xfc, 0x00, 0x28, 0x6b, 0xd0, 0x03, 0x20, + 0x60, 0x72, 0x24, 0x20, 0xe1, 0x6c, 0x4a, 0x7d, 0x02, 0x2a, 0x01, 0xbf, + 0x8a, 0x7d, 0x01, 0x2a, 0xca, 0x7d, 0x01, 0x2a, 0x00, 0xf0, 0x74, 0xf9, + 0x04, 0xbf, 0xca, 0x7d, 0x01, 0x2a, 0x00, 0xf0, 0x7d, 0xf9, 0xe2, 0x6c, + 0x63, 0x78, 0x11, 0x7d, 0x23, 0xfa, 0x01, 0xf5, 0xed, 0x07, 0x1c, 0xd5, + 0x55, 0x7d, 0xeb, 0x40, 0xdb, 0x07, 0x18, 0xd5, 0xe3, 0x79, 0x01, 0x2b, + 0x13, 0xd8, 0x50, 0x7d, 0x07, 0xfa, 0x01, 0xf1, 0x87, 0x40, 0x60, 0x6a, + 0x3f, 0x01, 0x01, 0xf0, 0x07, 0x01, 0x07, 0xf0, 0x70, 0x07, 0x00, 0xf5, + 0xcc, 0x70, 0x0f, 0x43, 0x00, 0xf0, 0x41, 0xf9, 0x20, 0x46, 0x03, 0xf0, + 0x4b, 0xfc, 0x04, 0x20, 0x36, 0xe0, 0x8d, 0x42, 0xe9, 0xd1, 0x40, 0x1e, + 0xca, 0xd1, 0xe6, 0xe7, 0x01, 0x2d, 0x30, 0xd1, 0x05, 0x20, 0x60, 0x72, + 0x20, 0x46, 0x04, 0xf0, 0xa5, 0xfa, 0x20, 0x46, 0x04, 0xf0, 0x74, 0xfd, + 0x20, 0x46, 0x04, 0xf0, 0xe3, 0xf8, 0x20, 0x46, 0x03, 0xf0, 0x1c, 0xff, + 0x20, 0x46, 0x03, 0xf0, 0x1f, 0xfe, 0x20, 0x46, 0x03, 0xf0, 0xdd, 0xfc, + 0x20, 0x46, 0x05, 0xf0, 0xef, 0xf9, 0x20, 0x46, 0x05, 0xf0, 0x44, 0xfa, + 0x20, 0x46, 0x05, 0xf0, 0x65, 0xf9, 0x20, 0x46, 0x05, 0xf0, 0xee, 0xf8, + 0x20, 0x46, 0x05, 0xf0, 0x81, 0xf8, 0x20, 0x46, 0x04, 0xf0, 0x08, 0xff, + 0x20, 0x46, 0x03, 0xf0, 0x28, 0xfc, 0x00, 0xf0, 0x41, 0xf9, 0xe0, 0x6c, + 0x81, 0x8b, 0x4a, 0x1e, 0x82, 0x83, 0x06, 0x20, 0x60, 0x72, 0xe1, 0x6c, + 0x88, 0x8b, 0xe8, 0xb9, 0x60, 0x6a, 0xbf, 0x49, 0x00, 0xf5, 0xc2, 0x70, + 0x01, 0x60, 0x02, 0x21, 0xe0, 0x6c, 0x46, 0x74, 0xe0, 0x6c, 0x01, 0x75, + 0xe0, 0x6c, 0x41, 0x75, 0x01, 0x21, 0xe0, 0x6c, 0x81, 0x75, 0xe0, 0x6c, + 0xc1, 0x75, 0xff, 0x21, 0xe0, 0x6c, 0xc6, 0x76, 0xe0, 0x6c, 0x86, 0x83, + 0xe0, 0x6c, 0x81, 0x77, 0x07, 0x21, 0xe0, 0x6c, 0x46, 0x62, 0xe0, 0x6c, + 0xc6, 0x74, 0x61, 0x72, 0x00, 0x21, 0x00, 0x20, 0xa2, 0x78, 0xca, 0x40, + 0xd3, 0x07, 0x0f, 0xd5, 0xe2, 0x6c, 0xa6, 0x6b, 0x5d, 0xf8, 0x21, 0x30, + 0x52, 0xf8, 0x21, 0x50, 0x36, 0x68, 0x1d, 0x43, 0x06, 0xea, 0x05, 0x07, + 0x33, 0x40, 0x9f, 0x42, 0x42, 0xf8, 0x21, 0x50, 0x18, 0xbf, 0x01, 0x20, + 0x49, 0x1c, 0x04, 0x29, 0xe8, 0xd3, 0x05, 0xb0, 0xf0, 0xbd, 0x2d, 0xe9, + 0xff, 0x41, 0x04, 0x46, 0x88, 0x46, 0x68, 0x46, 0x00, 0x21, 0x00, 0x22, + 0x00, 0x23, 0x00, 0x26, 0x80, 0xe8, 0x4e, 0x00, 0x00, 0x25, 0x00, 0x20, + 0xa1, 0x78, 0xc1, 0x40, 0xca, 0x07, 0x02, 0xd5, 0xe1, 0x6c, 0x00, 0xf0, + 0xa1, 0xf9, 0x40, 0x1c, 0x04, 0x28, 0xf5, 0xd3, 0xe1, 0x6c, 0x88, 0x7c, + 0x28, 0xb9, 0x20, 0x46, 0x03, 0xf0, 0x48, 0xfa, 0xe1, 0x6c, 0x01, 0x20, + 0x88, 0x74, 0x01, 0x27, 0x60, 0x7a, 0x09, 0x28, 0x41, 0xd0, 0xb8, 0xf1, + 0x00, 0x0f, 0x40, 0xd1, 0x20, 0x46, 0x03, 0xf0, 0x93, 0xfb, 0x00, 0x28, + 0x00, 0xf0, 0x7f, 0x80, 0x08, 0x20, 0x60, 0x72, 0x24, 0x20, 0xe1, 0x6c, + 0x4a, 0x7d, 0x02, 0x2a, 0x01, 0xbf, 0x8a, 0x7d, 0x01, 0x2a, 0xca, 0x7d, + 0x01, 0x2a, 0x00, 0xf0, 0x9f, 0xf8, 0x04, 0xbf, 0xca, 0x7d, 0x01, 0x2a, + 0x00, 0xf0, 0xa8, 0xf8, 0xe1, 0x6c, 0x63, 0x78, 0x0a, 0x7d, 0x23, 0xfa, + 0x02, 0xf6, 0xf6, 0x07, 0x1c, 0xd5, 0x4e, 0x7d, 0xf3, 0x40, 0xdb, 0x07, + 0x18, 0xd5, 0xe3, 0x79, 0x01, 0x2b, 0x13, 0xd8, 0x48, 0x7d, 0x07, 0xfa, + 0x02, 0xf2, 0x87, 0x40, 0x60, 0x6a, 0x3f, 0x01, 0x02, 0xf0, 0x07, 0x02, + 0x07, 0xf0, 0x70, 0x07, 0x00, 0xf5, 0xcc, 0x70, 0x17, 0x43, 0x00, 0xf0, + 0x6c, 0xf8, 0x20, 0x46, 0x03, 0xf0, 0x76, 0xfb, 0x09, 0x20, 0x49, 0xe0, + 0x96, 0x42, 0xe9, 0xd1, 0x40, 0x1e, 0xca, 0xd1, 0xe6, 0xe7, 0xb8, 0xf1, + 0x01, 0x0f, 0x42, 0xd1, 0x0a, 0x20, 0x60, 0x72, 0x20, 0x46, 0x03, 0xf0, + 0x8d, 0xfb, 0x20, 0x46, 0x03, 0xf0, 0xac, 0xfb, 0x20, 0x46, 0x04, 0xf0, + 0x11, 0xfc, 0xe1, 0x6c, 0x20, 0x31, 0x88, 0x78, 0x00, 0x28, 0x30, 0xd1, + 0x09, 0x78, 0x01, 0x29, 0x1c, 0xd1, 0x20, 0x46, 0x03, 0xf0, 0x3e, 0xfe, + 0x20, 0x46, 0x05, 0xf0, 0x1f, 0xf8, 0x20, 0x46, 0x04, 0xf0, 0x8a, 0xfc, + 0x20, 0x46, 0x05, 0xf0, 0x69, 0xf9, 0xe0, 0x6c, 0x90, 0xf8, 0x23, 0x10, + 0x01, 0x29, 0x0b, 0xd1, 0x20, 0x46, 0x04, 0xf0, 0xad, 0xf9, 0x20, 0x46, + 0x05, 0xf0, 0x06, 0xf9, 0x20, 0x46, 0x03, 0xf0, 0xee, 0xfb, 0x20, 0x46, + 0x04, 0xf0, 0x28, 0xfe, 0x20, 0x46, 0x03, 0xf0, 0x27, 0xfd, 0x20, 0x46, + 0x04, 0xf0, 0x98, 0xff, 0x20, 0x46, 0x03, 0xf0, 0xdf, 0xff, 0x20, 0x46, + 0x05, 0xf0, 0x70, 0xf8, 0x20, 0x46, 0x03, 0xf0, 0x3c, 0xfb, 0x00, 0xf0, + 0x55, 0xf8, 0x0b, 0x20, 0x60, 0x72, 0x00, 0x20, 0xa1, 0x78, 0xc1, 0x40, + 0xca, 0x07, 0x0f, 0xd5, 0xe1, 0x6c, 0xa6, 0x6b, 0x5d, 0xf8, 0x20, 0x20, + 0x51, 0xf8, 0x20, 0x30, 0x36, 0x68, 0x13, 0x43, 0x06, 0xea, 0x03, 0x07, + 0x32, 0x40, 0x97, 0x42, 0x41, 0xf8, 0x20, 0x30, 0x18, 0xbf, 0x01, 0x25, + 0x40, 0x1c, 0x04, 0x28, 0xe8, 0xd3, 0x28, 0x46, 0x04, 0xb0, 0xbd, 0xe8, + 0xf0, 0x81, 0x07, 0x60, 0xe0, 0x6c, 0x81, 0x7d, 0xc0, 0x7d, 0x80, 0x00, + 0x01, 0xf0, 0x01, 0x01, 0x00, 0xf0, 0x04, 0x00, 0x01, 0x43, 0x60, 0x6a, + 0x00, 0xf5, 0x30, 0x70, 0x01, 0x60, 0x20, 0x46, 0x03, 0xf0, 0x0b, 0xbb, + 0x08, 0xd1, 0x0a, 0x7d, 0x52, 0x1c, 0x03, 0x23, 0xb2, 0xfb, 0xf3, 0xf3, + 0x03, 0xeb, 0x43, 0x03, 0xd2, 0x1a, 0x0a, 0x75, 0xe1, 0x6c, 0x8a, 0x7d, + 0x01, 0x2a, 0x70, 0x47, 0x08, 0xd1, 0x4a, 0x7d, 0x52, 0x1c, 0x03, 0x23, + 0xb2, 0xfb, 0xf3, 0xf3, 0x03, 0xeb, 0x43, 0x03, 0xd2, 0x1a, 0x4a, 0x75, + 0xe1, 0x6c, 0xca, 0x7d, 0x01, 0x2a, 0x03, 0xd1, 0x8a, 0x7d, 0x82, 0xf0, + 0x01, 0x02, 0x8a, 0x75, 0xe1, 0x6c, 0xca, 0x7d, 0x82, 0xf0, 0x01, 0x02, + 0xca, 0x75, 0x70, 0x47, 0xe1, 0x6c, 0x00, 0x20, 0x48, 0x74, 0x04, 0xeb, + 0x80, 0x01, 0x07, 0xfa, 0x00, 0xf3, 0x89, 0x6a, 0x01, 0xf5, 0xca, 0x71, + 0x03, 0xf0, 0x0f, 0x03, 0x0a, 0x68, 0x12, 0x09, 0x40, 0x1c, 0x43, 0xea, + 0x02, 0x12, 0x04, 0x28, 0x0a, 0x60, 0xee, 0xdb, 0x70, 0x47, 0x40, 0x7a, + 0x70, 0x47, 0x10, 0xb5, 0x0c, 0x21, 0x42, 0x6a, 0x41, 0x72, 0x02, 0xf1, + 0x10, 0x03, 0xc0, 0x21, 0x19, 0x60, 0xc3, 0x6c, 0xd9, 0x7c, 0x00, 0x29, + 0x04, 0xbf, 0x99, 0x7c, 0x00, 0x29, 0x1c, 0xd0, 0x02, 0xf5, 0xc2, 0x72, + 0x0f, 0x4c, 0x14, 0x60, 0x00, 0x21, 0x59, 0x74, 0x02, 0x22, 0xc1, 0x6c, + 0x0a, 0x75, 0xff, 0x23, 0xc1, 0x6c, 0x4a, 0x75, 0x01, 0x22, 0xc1, 0x6c, + 0x8a, 0x75, 0xc1, 0x6c, 0xca, 0x75, 0x00, 0x22, 0xc1, 0x6c, 0xca, 0x76, + 0xc1, 0x6c, 0x8a, 0x83, 0x8b, 0x77, 0xc1, 0x6c, 0x4a, 0x62, 0xca, 0x74, + 0x00, 0x21, 0xc2, 0x6c, 0x91, 0x74, 0x0d, 0x21, 0x41, 0x72, 0x00, 0x20, + 0x10, 0xbd, 0x00, 0x00, 0xaa, 0xaa, 0x02, 0x00, 0xf8, 0xb5, 0x84, 0xb0, + 0x05, 0x46, 0x68, 0x46, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, + 0x80, 0xe8, 0x1e, 0x00, 0x00, 0x26, 0x00, 0x20, 0xa9, 0x78, 0xc1, 0x40, + 0xca, 0x07, 0x02, 0xd5, 0xe9, 0x6c, 0x00, 0xf0, 0x59, 0xf8, 0x40, 0x1c, + 0x04, 0x28, 0xf5, 0xd3, 0xe9, 0x6c, 0x01, 0x20, 0x08, 0x74, 0xaa, 0x6b, + 0x10, 0x7e, 0xe8, 0xb9, 0x00, 0x27, 0xa9, 0x79, 0xf8, 0xb2, 0x88, 0x42, + 0x1b, 0xd2, 0xe9, 0x6c, 0x00, 0x20, 0x48, 0x74, 0x05, 0xeb, 0x80, 0x01, + 0x01, 0x23, 0x89, 0x6a, 0x01, 0xf5, 0xca, 0x71, 0x83, 0x40, 0x0a, 0x68, + 0x12, 0x09, 0x03, 0xf0, 0x0f, 0x03, 0x40, 0x1c, 0x43, 0xea, 0x02, 0x12, + 0x04, 0x28, 0x0a, 0x60, 0xee, 0xdb, 0x28, 0x46, 0x04, 0xf0, 0x40, 0xfd, + 0x7f, 0x1c, 0xe2, 0xe7, 0x28, 0x46, 0x04, 0xf0, 0x3b, 0xfd, 0x28, 0x46, + 0x04, 0xf0, 0xae, 0xfe, 0x28, 0x46, 0x04, 0xf0, 0x15, 0xff, 0x28, 0x46, + 0x04, 0xf0, 0x86, 0xff, 0x28, 0x46, 0x04, 0xf0, 0xef, 0xff, 0x28, 0x46, + 0x05, 0xf0, 0x04, 0xf8, 0x28, 0x46, 0x05, 0xf0, 0x59, 0xf8, 0xe9, 0x6c, + 0x0c, 0x74, 0x28, 0x46, 0x03, 0xf0, 0x47, 0xfa, 0x00, 0x20, 0xa9, 0x78, + 0xc1, 0x40, 0xca, 0x07, 0x0c, 0xd5, 0xe9, 0x6c, 0xab, 0x6b, 0x51, 0xf8, + 0x20, 0x20, 0x1f, 0x68, 0x5d, 0xf8, 0x20, 0x30, 0x3a, 0x42, 0x18, 0xbf, + 0x01, 0x26, 0x1a, 0x43, 0x41, 0xf8, 0x20, 0x20, 0x40, 0x1c, 0x04, 0x28, + 0xeb, 0xd3, 0x30, 0x46, 0x05, 0xb0, 0xf0, 0xbd, 0x51, 0xf8, 0x20, 0x20, + 0x4d, 0xf8, 0x20, 0x20, 0x41, 0xf8, 0x20, 0x30, 0x70, 0x47, 0x30, 0xb5, + 0x00, 0x21, 0x00, 0x24, 0x00, 0x25, 0x82, 0x78, 0xca, 0x40, 0xd3, 0x07, + 0x06, 0xd5, 0xc2, 0x6c, 0x02, 0xeb, 0x81, 0x02, 0x14, 0x60, 0x94, 0x62, + 0x95, 0x63, 0x94, 0x64, 0x49, 0x1c, 0x04, 0x29, 0xf1, 0xd3, 0x00, 0x20, + 0x30, 0xbd, 0x21, 0xb9, 0xc0, 0x6c, 0x92, 0xed, 0x00, 0x0a, 0x80, 0xed, + 0x17, 0x0a, 0x00, 0x20, 0x70, 0x47, 0x11, 0xb1, 0x01, 0x29, 0x03, 0xd0, + 0x05, 0xe0, 0xc0, 0x6c, 0xc1, 0x6d, 0x01, 0xe0, 0xc0, 0x6c, 0x81, 0x6d, + 0x11, 0x60, 0x00, 0x20, 0x70, 0x47, 0xf8, 0xb5, 0x05, 0x46, 0x01, 0x20, + 0xe8, 0x71, 0x00, 0x24, 0x4a, 0x78, 0x2a, 0x70, 0x48, 0x79, 0x28, 0x71, + 0x8a, 0x78, 0x6a, 0x70, 0xc8, 0x78, 0xa8, 0x70, 0x0a, 0x79, 0xea, 0x70, + 0x08, 0x78, 0xa8, 0xb9, 0xc8, 0x68, 0xa8, 0x60, 0x0a, 0x69, 0xea, 0x60, + 0x48, 0x69, 0x28, 0x61, 0x8a, 0x6a, 0x6a, 0x62, 0xc8, 0x6a, 0xe8, 0x62, + 0x00, 0x20, 0x0a, 0x6b, 0xaa, 0x62, 0x01, 0xeb, 0x80, 0x02, 0x05, 0xeb, + 0x80, 0x06, 0x93, 0x69, 0x73, 0x61, 0x40, 0x1c, 0x04, 0x28, 0xf6, 0xd3, + 0x00, 0x20, 0x68, 0x71, 0xa8, 0x71, 0x2b, 0x79, 0xaa, 0x79, 0x00, 0xf0, + 0x6f, 0xf8, 0x04, 0x28, 0xaa, 0x71, 0xf8, 0xd3, 0x00, 0x20, 0x2b, 0x78, + 0x6a, 0x79, 0x00, 0xf0, 0x67, 0xf8, 0x03, 0x28, 0x6a, 0x71, 0xf8, 0xd3, + 0xc8, 0x79, 0x30, 0xb1, 0x01, 0x28, 0x06, 0xd1, 0x08, 0x78, 0x42, 0x1e, + 0x92, 0x41, 0xd2, 0x0f, 0x02, 0xe0, 0x01, 0x22, 0x00, 0xe0, 0x00, 0x22, + 0x88, 0x79, 0x30, 0xb1, 0x01, 0x28, 0x06, 0xd1, 0x08, 0x78, 0x46, 0x1e, + 0xb6, 0x41, 0xf6, 0x0f, 0x02, 0xe0, 0x01, 0x26, 0x00, 0xe0, 0x00, 0x26, + 0x08, 0x7a, 0x30, 0xb1, 0x01, 0x28, 0x06, 0xd1, 0x08, 0x78, 0x47, 0x1e, + 0xbf, 0x41, 0xff, 0x0f, 0x02, 0xe0, 0x01, 0x27, 0x00, 0xe0, 0x00, 0x27, + 0xb2, 0xb1, 0x68, 0x6a, 0x41, 0x7a, 0x80, 0x7a, 0x41, 0x18, 0xc9, 0x05, + 0x4f, 0xea, 0x11, 0x6c, 0x00, 0x20, 0xeb, 0x6a, 0x43, 0xf8, 0x20, 0x40, + 0x00, 0xee, 0x10, 0xca, 0xea, 0x6a, 0x02, 0xeb, 0x80, 0x03, 0x40, 0x1c, + 0xb8, 0xee, 0x40, 0x0a, 0x04, 0x28, 0x83, 0xed, 0x04, 0x0a, 0xf0, 0xd3, + 0xa9, 0x6a, 0x0c, 0x71, 0x28, 0x46, 0xa9, 0x6a, 0x4c, 0x71, 0xa9, 0x6a, + 0x8c, 0x71, 0xa9, 0x6a, 0xcc, 0x71, 0xa9, 0x6a, 0x8c, 0x70, 0xa9, 0x6a, + 0xcc, 0x70, 0xa9, 0x6a, 0x0c, 0x70, 0xab, 0x6a, 0x5c, 0x70, 0x05, 0xf0, + 0x20, 0xf8, 0x17, 0xb1, 0x28, 0x46, 0x04, 0xf0, 0xed, 0xff, 0x1e, 0xb1, + 0x28, 0x46, 0x00, 0xf0, 0x61, 0xf8, 0x04, 0x46, 0x02, 0x20, 0x69, 0x6a, + 0xe8, 0x71, 0x08, 0x79, 0x10, 0xb1, 0x68, 0x79, 0x02, 0x28, 0x01, 0xd2, + 0x0c, 0x21, 0xe9, 0x71, 0x20, 0x46, 0xf2, 0xbd, 0xc3, 0x40, 0x03, 0xf0, + 0x01, 0x03, 0x40, 0x1c, 0x9a, 0x18, 0x70, 0x47, 0xf8, 0xb5, 0x06, 0x46, + 0x00, 0x24, 0xb0, 0x6a, 0x05, 0x78, 0x04, 0x70, 0x0f, 0x46, 0xb2, 0x6a, + 0x50, 0x78, 0x28, 0xb9, 0x30, 0x46, 0x04, 0xf0, 0xc9, 0xff, 0xb1, 0x6a, + 0x01, 0x20, 0x48, 0x70, 0xf0, 0x79, 0x09, 0x28, 0x0b, 0xd0, 0xb7, 0xb9, + 0x30, 0x46, 0x04, 0xf0, 0xd0, 0xff, 0x90, 0xb1, 0x08, 0x20, 0xf0, 0x71, + 0x30, 0x46, 0x04, 0xf0, 0xe1, 0xff, 0x09, 0x20, 0x0a, 0xe0, 0x01, 0x2f, + 0x09, 0xd1, 0x0a, 0x20, 0xf0, 0x71, 0x30, 0x46, 0x05, 0xf0, 0x78, 0xf8, + 0x30, 0x46, 0x05, 0xf0, 0x63, 0xf9, 0x0b, 0x20, 0xf0, 0x71, 0x70, 0x6a, + 0x82, 0x79, 0xb0, 0x6a, 0x01, 0x78, 0x45, 0xea, 0x01, 0x03, 0x13, 0x40, + 0x2a, 0x40, 0x93, 0x42, 0x18, 0xbf, 0x01, 0x24, 0x0d, 0x43, 0x05, 0x70, + 0x20, 0x46, 0xf2, 0xbd, 0xc0, 0x79, 0x70, 0x47, 0x0d, 0x21, 0x82, 0x6a, + 0xc1, 0x71, 0x51, 0x78, 0x41, 0xb1, 0x01, 0x69, 0x00, 0x23, 0x41, 0xf8, + 0x0c, 0x3f, 0x93, 0x70, 0x82, 0x6a, 0xd3, 0x70, 0x82, 0x6a, 0x53, 0x70, + 0x0e, 0x21, 0xc1, 0x71, 0x00, 0x20, 0x70, 0x47, 0x70, 0xb5, 0x04, 0x46, + 0x00, 0x25, 0xa0, 0x6a, 0x06, 0x78, 0x05, 0x70, 0x01, 0x22, 0xa3, 0x6a, + 0xda, 0x71, 0x20, 0x46, 0x05, 0xf0, 0x32, 0xf9, 0xa0, 0x6a, 0xc5, 0x71, + 0xa0, 0x6a, 0x62, 0x6a, 0x01, 0x78, 0x93, 0x79, 0x19, 0x42, 0x18, 0xbf, + 0x01, 0x25, 0x0e, 0x43, 0x06, 0x70, 0x28, 0x46, 0x70, 0xbd, 0x80, 0x6a, + 0x00, 0x21, 0x01, 0x70, 0x00, 0x20, 0x70, 0x47, 0x01, 0x46, 0x00, 0x20, + 0x91, 0xed, 0x00, 0x1a, 0xb4, 0xee, 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x48, 0xbf, 0x81, 0xed, 0x00, 0x0a, 0x06, 0xd4, 0xb4, 0xee, 0x60, 0x1a, + 0xf1, 0xee, 0x10, 0xfa, 0x02, 0xd5, 0xc1, 0xed, 0x00, 0x0a, 0x01, 0x20, + 0x70, 0x47, 0x10, 0xb5, 0x03, 0x46, 0x00, 0x20, 0x1c, 0x56, 0xa1, 0x42, + 0xb8, 0xbf, 0x19, 0x70, 0x02, 0xdb, 0x94, 0x42, 0x01, 0xda, 0x1a, 0x70, + 0x01, 0x20, 0x10, 0xbd, 0x02, 0x46, 0x82, 0xea, 0x92, 0x03, 0x83, 0xea, + 0xd2, 0x03, 0x40, 0x08, 0x83, 0xea, 0x12, 0x13, 0x40, 0xea, 0xc3, 0x10, + 0xc0, 0xb2, 0x70, 0x47, 0x0b, 0x46, 0x50, 0xf8, 0x23, 0x30, 0x13, 0x60, + 0x09, 0xe0, 0x00, 0xeb, 0x83, 0x03, 0xd2, 0xed, 0x00, 0x0a, 0x93, 0xed, + 0x00, 0x1a, 0x00, 0xee, 0x80, 0x1a, 0x82, 0xed, 0x00, 0x1a, 0x49, 0x1e, + 0x4b, 0xb2, 0x00, 0x2b, 0xf1, 0xd5, 0x70, 0x47, 0xd0, 0xed, 0x01, 0x0a, + 0x90, 0xed, 0x00, 0x0a, 0xd0, 0xed, 0x03, 0x1a, 0x90, 0xed, 0x02, 0x1a, + 0x90, 0xed, 0x04, 0x2a, 0x81, 0xed, 0x02, 0x0a, 0x20, 0xee, 0xa0, 0x3a, + 0x63, 0xee, 0x20, 0x3a, 0x60, 0xee, 0x00, 0x2a, 0x23, 0xee, 0xa0, 0x5a, + 0x65, 0xee, 0x20, 0x5a, 0x25, 0xee, 0xa0, 0x6a, 0xdf, 0xed, 0x3c, 0x6a, + 0x9f, 0xed, 0x3c, 0x7a, 0x66, 0xee, 0x26, 0x6a, 0x25, 0xee, 0x07, 0x7a, + 0xdf, 0xed, 0x3a, 0x7a, 0x61, 0xee, 0xa1, 0x4a, 0x47, 0xee, 0x21, 0x6a, + 0x63, 0xee, 0x27, 0x7a, 0x47, 0xee, 0xa4, 0x6a, 0xb1, 0xee, 0x04, 0x4a, + 0x64, 0xee, 0xa1, 0x7a, 0x47, 0xee, 0x84, 0x6a, 0xb1, 0xee, 0x0c, 0x6a, + 0x26, 0xee, 0x86, 0x6a, 0x81, 0xed, 0x0d, 0x6a, 0xb3, 0xee, 0x05, 0x6a, + 0xf3, 0xee, 0x0c, 0x6a, 0x65, 0xee, 0x86, 0x5a, 0x22, 0xee, 0x80, 0x6a, + 0x63, 0xee, 0xa6, 0x6a, 0xb1, 0xee, 0x08, 0x7a, 0x46, 0xee, 0xa1, 0x5a, + 0xf1, 0xee, 0x00, 0x6a, 0x62, 0xee, 0xa6, 0x6a, 0x20, 0xee, 0x87, 0x7a, + 0x47, 0xee, 0x24, 0x5a, 0xf2, 0xee, 0x0a, 0x7a, 0x00, 0x20, 0x65, 0xee, + 0xa7, 0x7a, 0xdf, 0xed, 0x23, 0x5a, 0x25, 0xee, 0x25, 0x5a, 0x63, 0xee, + 0x25, 0x5a, 0x05, 0xee, 0xa1, 0x5a, 0x04, 0xee, 0x84, 0x5a, 0x81, 0xed, + 0x09, 0x5a, 0xf2, 0xee, 0x08, 0x4a, 0xb2, 0xee, 0x00, 0x5a, 0x63, 0xee, + 0xa4, 0x3a, 0x20, 0xee, 0x85, 0x5a, 0x45, 0xee, 0x21, 0x3a, 0x61, 0xee, + 0x20, 0x5a, 0x66, 0xee, 0x24, 0x4a, 0xc1, 0xed, 0x07, 0x3a, 0x44, 0xee, + 0xa0, 0x5a, 0x46, 0xee, 0x81, 0x5a, 0xdf, 0xed, 0x14, 0x3a, 0x05, 0xee, + 0xa3, 0x2a, 0x81, 0xed, 0x06, 0x2a, 0xb0, 0xee, 0x08, 0x2a, 0x43, 0xee, + 0x02, 0x1a, 0xc1, 0xed, 0x05, 0x1a, 0x60, 0xee, 0x04, 0x1a, 0x01, 0xee, + 0xa0, 0x1a, 0x81, 0xed, 0x04, 0x1a, 0xb0, 0xee, 0x00, 0x1a, 0x42, 0xee, + 0x81, 0x0a, 0x08, 0x63, 0xc1, 0xed, 0x0b, 0x7a, 0x88, 0x62, 0x08, 0x62, + 0xc1, 0xed, 0x03, 0x0a, 0x48, 0x60, 0x08, 0x60, 0x70, 0x47, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0x43, 0x00, 0x00, 0xaa, 0x43, 0x00, 0x00, 0xf0, 0x42, + 0x00, 0x00, 0x5c, 0x42, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x9c, + 0x00, 0xee, 0x10, 0x2a, 0xb8, 0xee, 0x40, 0x1a, 0x00, 0xee, 0x90, 0x1a, + 0x21, 0x46, 0xe5, 0x18, 0xb1, 0xee, 0x41, 0x0a, 0xf8, 0xee, 0x60, 0x0a, + 0x01, 0xee, 0x90, 0x1a, 0x6d, 0x06, 0x31, 0xee, 0x60, 0x1a, 0xf8, 0xee, + 0x61, 0x1a, 0x2d, 0x0e, 0x81, 0xee, 0x21, 0x1a, 0x00, 0x21, 0x14, 0xe0, + 0xce, 0xb2, 0x01, 0xee, 0x90, 0x6a, 0xb8, 0xee, 0x61, 0x2a, 0xf0, 0xee, + 0x40, 0x1a, 0x00, 0xeb, 0x82, 0x06, 0x42, 0xee, 0x01, 0x1a, 0xaa, 0x1a, + 0xc6, 0xed, 0x00, 0x1a, 0x00, 0xeb, 0x82, 0x02, 0xf1, 0xee, 0x61, 0x1a, + 0xc2, 0xed, 0x00, 0x1a, 0x49, 0x1c, 0xca, 0xb2, 0xa2, 0x42, 0xe7, 0xd3, + 0x19, 0x46, 0x01, 0xee, 0x10, 0x1a, 0xb1, 0xee, 0x60, 0x0a, 0xb8, 0xee, + 0x41, 0x1a, 0xc0, 0xee, 0x81, 0x0a, 0x00, 0x21, 0x16, 0xe0, 0xce, 0xb2, + 0x0a, 0x19, 0x01, 0xee, 0x10, 0x6a, 0xd2, 0xb2, 0xf8, 0xee, 0x41, 0x1a, + 0xb0, 0xee, 0x40, 0x1a, 0x00, 0xeb, 0x82, 0x06, 0x01, 0xee, 0xa0, 0x1a, + 0xaa, 0x1a, 0x86, 0xed, 0x00, 0x1a, 0x00, 0xeb, 0x82, 0x02, 0xb1, 0xee, + 0x41, 0x1a, 0x82, 0xed, 0x00, 0x1a, 0x49, 0x1c, 0xca, 0xb2, 0x9a, 0x42, + 0xe5, 0xd3, 0xe1, 0x18, 0x00, 0x22, 0x40, 0xf8, 0x21, 0x20, 0x70, 0xbd, + 0x2d, 0xe9, 0xf0, 0x41, 0x02, 0x46, 0x4f, 0xf0, 0x11, 0x38, 0x93, 0x69, + 0x10, 0x78, 0x46, 0x1c, 0x58, 0x6f, 0x53, 0x69, 0x00, 0x21, 0x01, 0x27, + 0xa8, 0xfb, 0x06, 0x45, 0x17, 0xfb, 0x06, 0x55, 0x20, 0x18, 0x03, 0xf8, + 0x1c, 0x0f, 0x69, 0x41, 0x53, 0x69, 0x04, 0x04, 0x24, 0x0e, 0x03, 0xf8, + 0x1d, 0x4f, 0x04, 0x0c, 0x53, 0x69, 0x03, 0xf8, 0x1e, 0x4f, 0x04, 0x0e, + 0x53, 0x69, 0x03, 0xf8, 0x1f, 0x4f, 0x43, 0xf2, 0x6a, 0x56, 0x50, 0x69, + 0x00, 0xf8, 0x20, 0x1f, 0x0c, 0x21, 0x50, 0x69, 0x00, 0xf8, 0x17, 0x1f, + 0x08, 0x21, 0x50, 0x69, 0x00, 0xf8, 0x17, 0x1f, 0x90, 0x68, 0x11, 0x78, + 0x00, 0xf2, 0x9c, 0x43, 0x00, 0xf2, 0x6c, 0x45, 0x1c, 0x68, 0x24, 0xf0, + 0x60, 0x44, 0x44, 0xea, 0x41, 0x74, 0x1c, 0x60, 0x00, 0xf5, 0x99, 0x61, + 0x4f, 0xf4, 0x00, 0x33, 0x0b, 0x60, 0x40, 0xf2, 0xff, 0x14, 0x00, 0xf5, + 0x85, 0x63, 0x2c, 0x60, 0x00, 0xf5, 0x93, 0x65, 0x1e, 0x60, 0xff, 0x24, + 0x00, 0xf5, 0x98, 0x63, 0x2c, 0x60, 0x49, 0xf6, 0x30, 0x74, 0xdf, 0xf8, + 0xa8, 0x64, 0x1e, 0x60, 0x0c, 0x60, 0x00, 0xf2, 0xc4, 0x45, 0x4f, 0xf4, + 0x7f, 0x21, 0x29, 0x60, 0x00, 0xf2, 0xbc, 0x41, 0x00, 0xf0, 0x12, 0xf8, + 0x00, 0xf2, 0xb4, 0x41, 0x00, 0xf0, 0x0e, 0xf8, 0x00, 0xf5, 0x97, 0x61, + 0x00, 0xf0, 0x0a, 0xf8, 0x00, 0xf5, 0x96, 0x60, 0x12, 0x78, 0x02, 0xf0, + 0x0f, 0x02, 0x42, 0xf0, 0x08, 0x02, 0x02, 0x60, 0xbd, 0xe8, 0xf0, 0x81, + 0x13, 0x78, 0x03, 0xf0, 0x0f, 0x03, 0x43, 0xf0, 0x08, 0x03, 0x0b, 0x60, + 0x70, 0x47, 0x00, 0x00, 0x38, 0xb5, 0x04, 0x46, 0x20, 0x6a, 0x81, 0x7d, + 0x08, 0x29, 0x4b, 0xd2, 0x07, 0x29, 0x46, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, + 0x04, 0x0c, 0x14, 0x1c, 0x24, 0x2c, 0x34, 0x3c, 0x00, 0xf0, 0xb9, 0xf8, + 0x13, 0x89, 0x83, 0x82, 0x49, 0x69, 0x41, 0x62, 0x12, 0x78, 0x36, 0xe0, + 0x00, 0xf0, 0xb1, 0xf8, 0x53, 0x89, 0x83, 0x82, 0x89, 0x69, 0x41, 0x62, + 0x52, 0x78, 0x2e, 0xe0, 0x00, 0xf0, 0xa9, 0xf8, 0x93, 0x89, 0x83, 0x82, + 0xc9, 0x69, 0x41, 0x62, 0x92, 0x78, 0x26, 0xe0, 0x00, 0xf0, 0xa1, 0xf8, + 0xd3, 0x89, 0x83, 0x82, 0x09, 0x6a, 0x41, 0x62, 0xd2, 0x78, 0x1e, 0xe0, + 0x00, 0xf0, 0x99, 0xf8, 0x13, 0x8a, 0x83, 0x82, 0x49, 0x6a, 0x41, 0x62, + 0x12, 0x79, 0x16, 0xe0, 0x00, 0xf0, 0x91, 0xf8, 0x53, 0x8a, 0x83, 0x82, + 0x89, 0x6a, 0x41, 0x62, 0x52, 0x79, 0x0e, 0xe0, 0x00, 0xf0, 0x89, 0xf8, + 0x93, 0x8a, 0x83, 0x82, 0xc9, 0x6a, 0x41, 0x62, 0x92, 0x79, 0x06, 0xe0, + 0x00, 0xf0, 0x81, 0xf8, 0xd3, 0x8a, 0x83, 0x82, 0x09, 0x6b, 0x41, 0x62, + 0xd2, 0x79, 0xc2, 0x75, 0x07, 0xe0, 0x00, 0x21, 0x81, 0x82, 0x04, 0xe0, + 0x00, 0x22, 0x42, 0x62, 0xc2, 0x75, 0x21, 0x6a, 0x8a, 0x82, 0xa0, 0x69, + 0x81, 0x7a, 0x20, 0x6a, 0x81, 0x74, 0x21, 0x6a, 0x08, 0x7c, 0x01, 0x28, + 0x47, 0xd1, 0xa0, 0x68, 0x00, 0xf2, 0x9c, 0x40, 0x01, 0x23, 0x02, 0x68, + 0x8a, 0x62, 0xa2, 0x69, 0x55, 0x7a, 0x68, 0x1e, 0x83, 0x40, 0x0b, 0x62, + 0x06, 0x25, 0x52, 0x7a, 0x8a, 0x74, 0x20, 0x6a, 0xa1, 0x68, 0x80, 0x7c, + 0x01, 0xf5, 0x91, 0x61, 0x0a, 0x68, 0x22, 0xf4, 0x7f, 0x02, 0x42, 0xea, + 0x00, 0x42, 0x0a, 0x60, 0x06, 0x21, 0x20, 0x6a, 0x02, 0x7f, 0x52, 0x1c, + 0x06, 0x23, 0xb2, 0xfb, 0xf3, 0xf3, 0x05, 0xfb, 0x13, 0x22, 0x02, 0x77, + 0x22, 0x6a, 0x10, 0x7f, 0x38, 0xb1, 0x52, 0x6a, 0x19, 0x30, 0xc2, 0x40, + 0xd0, 0x07, 0x04, 0xd4, 0x49, 0x1e, 0xec, 0xd1, 0x0c, 0xe0, 0x02, 0x20, + 0x10, 0x74, 0x20, 0x6a, 0x01, 0x7f, 0x05, 0x29, 0x07, 0xbf, 0x0f, 0x22, + 0x82, 0x77, 0x08, 0x21, 0x81, 0x77, 0x21, 0x6a, 0x00, 0x20, 0x48, 0x77, + 0xa0, 0x68, 0xca, 0x49, 0x00, 0xf2, 0xe4, 0x42, 0x00, 0xf2, 0x9c, 0x40, + 0x11, 0x60, 0x03, 0x68, 0x5b, 0x09, 0x5b, 0x01, 0x43, 0xf0, 0x84, 0x03, + 0x03, 0x60, 0x20, 0x6a, 0x01, 0x7c, 0x03, 0x29, 0x1c, 0xd1, 0x40, 0x6a, + 0xc2, 0x49, 0x08, 0x42, 0x14, 0xd1, 0xc2, 0x4a, 0x10, 0x42, 0x0d, 0xd1, + 0xc1, 0x4a, 0x10, 0x42, 0x06, 0xd1, 0xc1, 0x49, 0x08, 0x42, 0x0b, 0xd0, + 0x03, 0x21, 0x20, 0x46, 0x00, 0xf0, 0x3c, 0xfc, 0x02, 0x21, 0x20, 0x46, + 0x00, 0xf0, 0x38, 0xfc, 0x01, 0x21, 0x20, 0x46, 0x00, 0xf0, 0x34, 0xfc, + 0x20, 0x46, 0xbd, 0xe8, 0x32, 0x40, 0x57, 0xe0, 0x31, 0xbd, 0xa1, 0x69, + 0x01, 0xf1, 0x34, 0x02, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46, 0x20, 0x6a, + 0x01, 0x7c, 0x02, 0x29, 0x18, 0xbf, 0x01, 0x29, 0x1b, 0xd1, 0xa2, 0x68, + 0x81, 0x6a, 0x02, 0xf2, 0x9c, 0x42, 0x20, 0x46, 0x11, 0x60, 0x00, 0xf0, + 0x9e, 0xfb, 0x20, 0x6a, 0x6f, 0xf0, 0x06, 0x01, 0x81, 0x76, 0x07, 0x21, + 0x20, 0x6a, 0xc1, 0x76, 0x00, 0x21, 0x20, 0x6a, 0x01, 0x77, 0x20, 0x6a, + 0x41, 0x77, 0x08, 0x21, 0x20, 0x6a, 0x81, 0x77, 0x00, 0x21, 0x20, 0x6a, + 0xc1, 0x77, 0x20, 0x6a, 0x01, 0x62, 0x20, 0x6a, 0x01, 0x7c, 0x03, 0x29, + 0x1c, 0xbf, 0x20, 0x79, 0x0c, 0x28, 0x1c, 0xd1, 0x03, 0x21, 0x20, 0x46, + 0x00, 0xf0, 0x97, 0xfc, 0x02, 0x21, 0x20, 0x46, 0x00, 0xf0, 0x93, 0xfc, + 0x01, 0x21, 0x20, 0x46, 0x00, 0xf0, 0x8f, 0xfc, 0x21, 0x6a, 0x88, 0x8a, + 0x40, 0xb9, 0x00, 0x22, 0x4a, 0x62, 0xc8, 0x75, 0xff, 0x21, 0x20, 0x6a, + 0x81, 0x75, 0x20, 0x6a, 0x82, 0x82, 0x82, 0x74, 0xa1, 0x68, 0x94, 0x48, + 0x01, 0xf2, 0x8c, 0x41, 0x08, 0x60, 0x10, 0xbd, 0x81, 0x69, 0x0a, 0x7a, + 0x01, 0x6a, 0x8a, 0x74, 0x82, 0x69, 0x01, 0x6a, 0xd3, 0x68, 0x4b, 0x62, + 0x12, 0x7c, 0xca, 0x75, 0xf0, 0xb5, 0x81, 0x68, 0x8b, 0x4b, 0x01, 0xf2, + 0x8c, 0x42, 0x9f, 0xed, 0x82, 0x0a, 0x13, 0x60, 0x83, 0x69, 0xc4, 0x69, + 0x9d, 0x6f, 0x25, 0x60, 0x01, 0xf5, 0x91, 0x65, 0x04, 0x6a, 0xa0, 0x7c, + 0x2e, 0x68, 0x26, 0xf4, 0x7f, 0x06, 0x46, 0xea, 0x00, 0x46, 0x2e, 0x60, + 0x65, 0x6a, 0x2e, 0x02, 0x68, 0x00, 0x45, 0xea, 0x95, 0x27, 0x06, 0xf4, + 0x80, 0x56, 0x00, 0xf0, 0x40, 0x00, 0xbf, 0x03, 0x06, 0x43, 0x07, 0xf4, + 0x80, 0x47, 0x3e, 0x43, 0xef, 0x08, 0x47, 0xea, 0xc5, 0x17, 0x07, 0xf4, + 0x80, 0x77, 0x3e, 0x43, 0x05, 0xf0, 0x04, 0x00, 0x06, 0x43, 0xc5, 0xf3, + 0xc0, 0x00, 0x06, 0x43, 0x46, 0xf4, 0x22, 0x46, 0x46, 0xf0, 0x8a, 0x06, + 0x16, 0x60, 0x65, 0x6a, 0xe8, 0x01, 0x40, 0xea, 0x05, 0x20, 0x40, 0xea, + 0x85, 0x10, 0x40, 0xea, 0x45, 0x10, 0x28, 0x43, 0x40, 0xea, 0x55, 0x00, + 0x40, 0xea, 0x95, 0x00, 0x40, 0xea, 0xd5, 0x00, 0xee, 0x02, 0x00, 0xf4, + 0x80, 0x10, 0x06, 0xf4, 0x80, 0x26, 0xaf, 0x00, 0x30, 0x43, 0x07, 0xf4, + 0x80, 0x67, 0x6d, 0x09, 0x38, 0x43, 0x05, 0xf0, 0x10, 0x05, 0x05, 0x43, + 0x64, 0x48, 0x05, 0x43, 0x03, 0xf1, 0xd4, 0x00, 0x15, 0x60, 0x01, 0xf1, + 0x1c, 0x03, 0x02, 0x88, 0x00, 0xee, 0x90, 0x2a, 0xf8, 0xee, 0x60, 0x0a, + 0x60, 0xee, 0x80, 0x0a, 0xfd, 0xee, 0xe0, 0x0a, 0xc3, 0xed, 0x00, 0x0a, + 0xdf, 0xed, 0x53, 0x0a, 0x05, 0x88, 0x01, 0xee, 0x10, 0x5a, 0xb8, 0xee, + 0x41, 0x1a, 0x21, 0xee, 0x20, 0x1a, 0x01, 0xf1, 0x20, 0x02, 0xbd, 0xee, + 0xc1, 0x1a, 0x82, 0xed, 0x00, 0x1a, 0x01, 0xf1, 0x24, 0x05, 0x83, 0x88, + 0x00, 0xf0, 0xaf, 0xf8, 0x01, 0xf1, 0x28, 0x03, 0x82, 0x88, 0x01, 0xee, + 0x10, 0x2a, 0x00, 0xf0, 0xb3, 0xf8, 0x83, 0xed, 0x00, 0x1a, 0x01, 0xf1, + 0x2c, 0x02, 0x05, 0x89, 0x01, 0xee, 0x90, 0x5a, 0x00, 0xf0, 0x98, 0xf8, + 0xc2, 0xed, 0x00, 0x1a, 0x01, 0xf1, 0x30, 0x05, 0x03, 0x89, 0x01, 0xee, + 0x10, 0x3a, 0x00, 0xf0, 0xa1, 0xf8, 0x85, 0xed, 0x00, 0x1a, 0x0b, 0x1d, + 0x42, 0x88, 0x01, 0xee, 0x90, 0x2a, 0x00, 0xf0, 0x87, 0xf8, 0xc3, 0xed, + 0x00, 0x1a, 0x01, 0xf1, 0x08, 0x02, 0x45, 0x88, 0x01, 0xee, 0x10, 0x5a, + 0x00, 0xf0, 0x90, 0xf8, 0x82, 0xed, 0x00, 0x1a, 0x01, 0xf1, 0x0c, 0x05, + 0xc3, 0x88, 0x00, 0xf0, 0x7e, 0xf8, 0xc2, 0x88, 0x01, 0xee, 0x10, 0x2a, + 0xb8, 0xee, 0x41, 0x1a, 0x21, 0xee, 0x20, 0x1a, 0x01, 0xf1, 0x10, 0x03, + 0xbd, 0xee, 0xc1, 0x1a, 0x83, 0xed, 0x00, 0x1a, 0x01, 0xf1, 0x14, 0x02, + 0x45, 0x89, 0x01, 0xee, 0x90, 0x5a, 0xf8, 0xee, 0x61, 0x1a, 0x21, 0xee, + 0x80, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, 0x82, 0xed, 0x00, 0x0a, 0x01, 0xf1, + 0x18, 0x05, 0x43, 0x89, 0x01, 0xee, 0x10, 0x3a, 0xb8, 0xee, 0x41, 0x1a, + 0x61, 0xee, 0x20, 0x0a, 0xfd, 0xee, 0xe0, 0x0a, 0xc5, 0xed, 0x00, 0x0a, + 0xa3, 0x7a, 0x62, 0x7a, 0xdb, 0x00, 0x02, 0xf0, 0x07, 0x02, 0x03, 0xf0, + 0x38, 0x03, 0x1a, 0x43, 0xe3, 0x7a, 0x9b, 0x01, 0x03, 0xf4, 0xe0, 0x73, + 0x1a, 0x43, 0x01, 0xf2, 0x0c, 0x43, 0x42, 0xf4, 0x92, 0x72, 0x1a, 0x60, + 0x01, 0xf2, 0xec, 0x41, 0xc2, 0x7f, 0x1c, 0x4b, 0x92, 0x00, 0x02, 0xf0, + 0x0c, 0x02, 0x42, 0xf0, 0x08, 0x02, 0x0a, 0x60, 0x82, 0x8b, 0x00, 0xee, + 0x10, 0x2a, 0xb8, 0xee, 0x40, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, + 0x10, 0x2a, 0x03, 0xea, 0x02, 0x13, 0x43, 0xf4, 0x00, 0x33, 0x0b, 0x60, + 0x80, 0x8b, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xb1, 0xee, + 0x40, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x80, 0x04, + 0x40, 0xf0, 0x00, 0x40, 0x08, 0x60, 0xf0, 0xbd, 0x00, 0x00, 0x80, 0x47, + 0x00, 0x00, 0x80, 0xc7, 0xc0, 0xba, 0xae, 0x2b, 0x98, 0x73, 0xce, 0x07, + 0x00, 0x10, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x40, 0x40, 0x00, + 0x00, 0x80, 0x80, 0x00, 0xaa, 0xaa, 0xaa, 0x0a, 0x20, 0x08, 0x28, 0x00, + 0xf0, 0xff, 0x01, 0x00, 0xf8, 0xee, 0x61, 0x1a, 0x61, 0xee, 0x80, 0x1a, + 0xfd, 0xee, 0xe1, 0x1a, 0x70, 0x47, 0x01, 0xee, 0x90, 0x3a, 0xf8, 0xee, + 0x61, 0x1a, 0x61, 0xee, 0x80, 0x1a, 0xfd, 0xee, 0xe1, 0x1a, 0xc5, 0xed, + 0x00, 0x1a, 0x70, 0x47, 0xb8, 0xee, 0x41, 0x1a, 0x21, 0xee, 0x20, 0x1a, + 0xbd, 0xee, 0xc1, 0x1a, 0x70, 0x47, 0x01, 0x46, 0x01, 0x20, 0x89, 0x68, + 0x01, 0xf2, 0x84, 0x41, 0x09, 0x68, 0x0a, 0x09, 0x42, 0xea, 0x91, 0x12, + 0xd1, 0x07, 0x48, 0xbf, 0x00, 0x20, 0x70, 0x47, 0x80, 0x68, 0x00, 0xf2, + 0x84, 0x40, 0x30, 0x21, 0x01, 0x60, 0x70, 0x47, 0x10, 0xb5, 0x82, 0x68, + 0x01, 0x78, 0x02, 0xf2, 0xcc, 0x42, 0x4f, 0xf0, 0x7e, 0x43, 0x13, 0x60, + 0x49, 0x00, 0xc0, 0x68, 0x02, 0x23, 0x8b, 0x40, 0x03, 0x24, 0x40, 0xf8, + 0x5c, 0x3f, 0x04, 0xfa, 0x01, 0xf1, 0x01, 0x60, 0x00, 0x20, 0x10, 0x60, + 0x10, 0xbd, 0x00, 0x00, 0x49, 0x1e, 0x04, 0x29, 0x21, 0xd8, 0xdf, 0xe8, + 0x01, 0xf0, 0x03, 0x09, 0x0f, 0x15, 0x1b, 0x00, 0xc0, 0x69, 0x00, 0xeb, + 0x82, 0x01, 0x81, 0xed, 0x09, 0x0a, 0x70, 0x47, 0xc0, 0x69, 0x00, 0xeb, + 0x82, 0x01, 0x81, 0xed, 0x11, 0x0a, 0x70, 0x47, 0xc0, 0x69, 0x00, 0xeb, + 0x82, 0x01, 0x81, 0xed, 0x19, 0x0a, 0x70, 0x47, 0xc0, 0x69, 0x00, 0xeb, + 0x82, 0x01, 0x81, 0xed, 0x21, 0x0a, 0x70, 0x47, 0xc0, 0x69, 0x00, 0xeb, + 0x82, 0x01, 0x81, 0xed, 0x29, 0x0a, 0x70, 0x47, 0x49, 0x1e, 0x04, 0x29, + 0x9f, 0xed, 0x21, 0x0a, 0x23, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, 0x03, 0x09, + 0x0f, 0x15, 0x1b, 0x00, 0xc0, 0x69, 0x00, 0xeb, 0x82, 0x01, 0x91, 0xed, + 0x09, 0x0a, 0x16, 0xe0, 0xc0, 0x69, 0x00, 0xeb, 0x82, 0x01, 0x91, 0xed, + 0x11, 0x0a, 0x10, 0xe0, 0xc0, 0x69, 0x00, 0xeb, 0x82, 0x01, 0x91, 0xed, + 0x19, 0x0a, 0x0a, 0xe0, 0xc0, 0x69, 0x00, 0xeb, 0x82, 0x01, 0x91, 0xed, + 0x21, 0x0a, 0x04, 0xe0, 0xc0, 0x69, 0x00, 0xeb, 0x82, 0x01, 0x91, 0xed, + 0x29, 0x0a, 0x08, 0xf0, 0x3f, 0xbb, 0x70, 0x47, 0xf8, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x68, 0x1e, 0x03, 0x28, 0x02, 0xd9, 0x00, 0x1f, 0x02, 0xd0, + 0x03, 0xe0, 0x08, 0x26, 0x02, 0xe0, 0x0f, 0x26, 0x00, 0xe0, 0x00, 0x26, + 0x00, 0x27, 0x07, 0xe0, 0x9f, 0xed, 0x05, 0x0a, 0xfa, 0xb2, 0x29, 0x46, + 0x20, 0x46, 0xff, 0xf7, 0x99, 0xff, 0x7f, 0x1c, 0xf8, 0xb2, 0xb0, 0x42, + 0xf4, 0xdb, 0xf1, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x46, + 0x00, 0x21, 0x20, 0x6a, 0x02, 0x7f, 0x52, 0x1e, 0x04, 0x2a, 0x29, 0xd8, + 0xdf, 0xe8, 0x02, 0xf0, 0x03, 0x08, 0x10, 0x18, 0x20, 0x00, 0xa1, 0x68, + 0x01, 0xf5, 0x8d, 0x61, 0x09, 0x68, 0x1f, 0xe0, 0xa1, 0x68, 0x01, 0xf2, + 0x64, 0x41, 0x09, 0x68, 0xe2, 0x69, 0x02, 0xf1, 0x1d, 0x03, 0x1a, 0xe0, + 0xa1, 0x68, 0x01, 0xf5, 0x8c, 0x61, 0x09, 0x68, 0xe2, 0x69, 0x02, 0xf1, + 0x1e, 0x03, 0x12, 0xe0, 0xa1, 0x68, 0x01, 0xf2, 0x5c, 0x41, 0x09, 0x68, + 0xe2, 0x69, 0x02, 0xf1, 0x1f, 0x03, 0x0a, 0xe0, 0xa1, 0x68, 0x01, 0xf5, + 0x8b, 0x61, 0x09, 0x68, 0xe2, 0x69, 0x02, 0xf1, 0x20, 0x03, 0x02, 0xe0, + 0xe2, 0x69, 0x02, 0xf1, 0x1c, 0x03, 0xc2, 0x7f, 0x52, 0x1c, 0xc2, 0x77, + 0x20, 0x6a, 0x90, 0xf9, 0x1b, 0x20, 0x90, 0xf9, 0x1a, 0x50, 0xaa, 0x18, + 0x02, 0xeb, 0xd2, 0x72, 0x05, 0x6a, 0x52, 0x10, 0x8d, 0x42, 0x38, 0xbf, + 0xc2, 0x76, 0x04, 0xd3, 0xa9, 0x42, 0x24, 0xbf, 0xc2, 0x76, 0x20, 0x6a, + 0x82, 0x76, 0x20, 0x6a, 0x90, 0xf9, 0x1a, 0x10, 0x90, 0xf9, 0x1b, 0x20, + 0x8a, 0x42, 0x05, 0xd0, 0xa5, 0x69, 0x95, 0xf8, 0x51, 0x60, 0xc5, 0x7f, + 0xae, 0x42, 0x2c, 0xd2, 0x6f, 0xf0, 0x06, 0x05, 0xa9, 0x42, 0x18, 0xbf, + 0x07, 0x2a, 0x1a, 0xd1, 0x1a, 0x78, 0x0f, 0x2a, 0x10, 0xd2, 0x52, 0x1c, + 0x1a, 0x70, 0xd2, 0xb2, 0x23, 0x6a, 0x19, 0x7f, 0x20, 0x46, 0x00, 0xf0, + 0x45, 0xf9, 0x20, 0x6a, 0x00, 0x22, 0x42, 0x77, 0x20, 0x46, 0x21, 0x6a, + 0x09, 0x7f, 0xff, 0xf7, 0x71, 0xff, 0x09, 0xe0, 0x03, 0x7f, 0x01, 0x68, + 0x01, 0x22, 0x16, 0x33, 0x9a, 0x40, 0x11, 0x43, 0x01, 0x60, 0x41, 0x7f, + 0x49, 0x1c, 0x41, 0x77, 0x00, 0x20, 0x21, 0x6a, 0xc8, 0x77, 0x07, 0x20, + 0x21, 0x6a, 0xc8, 0x76, 0x20, 0x6a, 0x85, 0x76, 0x0d, 0xe0, 0x89, 0x18, + 0x01, 0xeb, 0xd1, 0x71, 0xc9, 0x05, 0x09, 0x16, 0x42, 0x7f, 0x00, 0xee, + 0x10, 0x1a, 0x01, 0x7f, 0xb8, 0xee, 0xc0, 0x0a, 0x20, 0x46, 0xff, 0xf7, + 0xff, 0xfe, 0x20, 0x6a, 0x41, 0x7f, 0x80, 0x7f, 0x81, 0x42, 0x22, 0xd1, + 0x06, 0x21, 0x06, 0x25, 0x20, 0x6a, 0x02, 0x7f, 0x52, 0x1c, 0x06, 0x23, + 0xb2, 0xfb, 0xf3, 0xf3, 0x05, 0xfb, 0x13, 0x22, 0x02, 0x77, 0x22, 0x6a, + 0x10, 0x7f, 0x38, 0xb1, 0x52, 0x6a, 0x19, 0x30, 0xc2, 0x40, 0xd0, 0x07, + 0x04, 0xd4, 0x49, 0x1e, 0xec, 0xd1, 0x70, 0xbd, 0x02, 0x20, 0x10, 0x74, + 0x20, 0x6a, 0x01, 0x7f, 0x05, 0x29, 0x07, 0xbf, 0x0f, 0x22, 0x82, 0x77, + 0x08, 0x21, 0x81, 0x77, 0x21, 0x6a, 0x00, 0x20, 0x48, 0x77, 0x70, 0xbd, + 0x70, 0xb5, 0x49, 0x1e, 0x16, 0x01, 0x04, 0x29, 0x04, 0x46, 0x06, 0xf0, + 0x70, 0x05, 0x00, 0xf2, 0x86, 0x80, 0xdf, 0xe8, 0x01, 0xf0, 0x03, 0x1f, + 0x37, 0x4f, 0x67, 0x00, 0xe0, 0x78, 0xc3, 0x07, 0x7d, 0xd5, 0x01, 0x21, + 0x20, 0x46, 0xff, 0xf7, 0xe7, 0xfe, 0x61, 0x69, 0x11, 0xf8, 0x0b, 0x2f, + 0x00, 0xf0, 0x8b, 0xf8, 0xac, 0xbf, 0x08, 0x30, 0x40, 0x42, 0x00, 0xf0, + 0x76, 0xf8, 0x11, 0xf8, 0x0b, 0x2f, 0x00, 0xf0, 0x7a, 0xf8, 0x41, 0xf0, + 0x10, 0x01, 0x00, 0xf0, 0x69, 0xf8, 0x01, 0xf0, 0xef, 0x01, 0x63, 0xe0, + 0x02, 0x21, 0xff, 0xf7, 0xcf, 0xfe, 0x61, 0x69, 0x11, 0xf8, 0x0c, 0x2f, + 0x00, 0xf0, 0x73, 0xf8, 0xac, 0xbf, 0x08, 0x30, 0x40, 0x42, 0x00, 0xf0, + 0x5e, 0xf8, 0x11, 0xf8, 0x0c, 0x2f, 0x00, 0xf0, 0x62, 0xf8, 0x41, 0xf0, + 0x08, 0x01, 0x00, 0xf0, 0x51, 0xf8, 0x01, 0xf0, 0xf7, 0x01, 0x4b, 0xe0, + 0x03, 0x21, 0xff, 0xf7, 0xb7, 0xfe, 0x61, 0x69, 0x11, 0xf8, 0x0d, 0x2f, + 0x00, 0xf0, 0x5b, 0xf8, 0xac, 0xbf, 0x08, 0x30, 0x40, 0x42, 0x00, 0xf0, + 0x46, 0xf8, 0x11, 0xf8, 0x0d, 0x2f, 0x00, 0xf0, 0x4a, 0xf8, 0x41, 0xf0, + 0x04, 0x01, 0x00, 0xf0, 0x39, 0xf8, 0x01, 0xf0, 0xfb, 0x01, 0x33, 0xe0, + 0x04, 0x21, 0xff, 0xf7, 0x9f, 0xfe, 0x61, 0x69, 0x11, 0xf8, 0x0e, 0x2f, + 0x00, 0xf0, 0x43, 0xf8, 0xac, 0xbf, 0x08, 0x30, 0x40, 0x42, 0x00, 0xf0, + 0x2e, 0xf8, 0x11, 0xf8, 0x0e, 0x2f, 0x00, 0xf0, 0x32, 0xf8, 0x41, 0xf0, + 0x02, 0x01, 0x00, 0xf0, 0x21, 0xf8, 0x01, 0xf0, 0xfd, 0x01, 0x1b, 0xe0, + 0x05, 0x21, 0xff, 0xf7, 0x87, 0xfe, 0x61, 0x69, 0x11, 0xf8, 0x0f, 0x2f, + 0x00, 0xf0, 0x2b, 0xf8, 0xac, 0xbf, 0x08, 0x30, 0x40, 0x42, 0x02, 0xf0, + 0x0f, 0x02, 0x16, 0x43, 0x0e, 0x70, 0x00, 0xf0, 0x0f, 0x00, 0x61, 0x69, + 0x11, 0xf8, 0x0f, 0x2f, 0x00, 0xf0, 0x15, 0xf8, 0x41, 0xf0, 0x01, 0x01, + 0x00, 0xf0, 0x04, 0xf8, 0x01, 0xf0, 0xfe, 0x01, 0x01, 0x70, 0x70, 0xbd, + 0x01, 0x70, 0x60, 0x69, 0x10, 0xf8, 0x0a, 0x1f, 0x70, 0x47, 0x02, 0xf0, + 0x8f, 0x02, 0x15, 0x43, 0x0d, 0x70, 0x00, 0xf0, 0x0f, 0x00, 0x61, 0x69, + 0x70, 0x47, 0x02, 0xf0, 0xf0, 0x02, 0x10, 0x43, 0x08, 0x70, 0x60, 0x69, + 0x10, 0xf8, 0x0a, 0x1f, 0x70, 0x47, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, + 0x10, 0x0a, 0x40, 0xb2, 0x01, 0x28, 0x70, 0x47, 0x12, 0x01, 0x49, 0x1e, + 0x02, 0xf0, 0x70, 0x03, 0x04, 0x29, 0x43, 0xf0, 0x01, 0x03, 0x19, 0xd8, + 0xdf, 0xe8, 0x01, 0xf0, 0x03, 0x09, 0x0c, 0x0f, 0x13, 0x00, 0xc1, 0x78, + 0xca, 0x07, 0x11, 0xd5, 0x40, 0x69, 0x40, 0x1d, 0x07, 0xe0, 0x40, 0x69, + 0x80, 0x1d, 0x04, 0xe0, 0x40, 0x69, 0xc0, 0x1d, 0x01, 0xe0, 0x40, 0x69, + 0x08, 0x30, 0x03, 0x70, 0x70, 0x47, 0x40, 0x69, 0x42, 0xf0, 0x01, 0x02, + 0x00, 0xf8, 0x09, 0x2f, 0x70, 0x47, 0xc1, 0x78, 0xca, 0x07, 0x05, 0xd5, + 0x41, 0x69, 0x11, 0xf8, 0x05, 0x2f, 0x02, 0xf0, 0xfe, 0x02, 0x0a, 0x70, + 0x41, 0x69, 0x11, 0xf8, 0x06, 0x2f, 0x02, 0xf0, 0xfe, 0x02, 0x0a, 0x70, + 0x41, 0x69, 0x11, 0xf8, 0x07, 0x2f, 0x02, 0xf0, 0xfe, 0x02, 0x0a, 0x70, + 0x41, 0x69, 0x11, 0xf8, 0x08, 0x2f, 0x02, 0xf0, 0xfe, 0x02, 0x0a, 0x70, + 0x40, 0x69, 0x10, 0xf8, 0x09, 0x1f, 0x01, 0xf0, 0xfe, 0x01, 0x01, 0x70, + 0x70, 0x47, 0x00, 0x00, 0x49, 0x1e, 0x04, 0x29, 0x02, 0xf0, 0x0f, 0x02, + 0x52, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, 0x03, 0x15, 0x24, 0x33, 0x42, 0x00, + 0xc1, 0x78, 0xcb, 0x07, 0x4a, 0xd5, 0x41, 0x69, 0x01, 0xf8, 0x11, 0x2f, + 0x41, 0x69, 0x11, 0xf8, 0x10, 0x2f, 0x42, 0xf0, 0x02, 0x02, 0x0a, 0x70, + 0x40, 0x69, 0x10, 0xf8, 0x10, 0x1f, 0x01, 0xf0, 0xfd, 0x01, 0x3a, 0xe0, + 0x41, 0x69, 0x01, 0xf8, 0x12, 0x2f, 0x41, 0x69, 0x11, 0xf8, 0x10, 0x2f, + 0x42, 0xf0, 0x04, 0x02, 0x0a, 0x70, 0x40, 0x69, 0x10, 0xf8, 0x10, 0x1f, + 0x01, 0xf0, 0xfb, 0x01, 0x2b, 0xe0, 0x41, 0x69, 0x01, 0xf8, 0x13, 0x2f, + 0x41, 0x69, 0x11, 0xf8, 0x10, 0x2f, 0x42, 0xf0, 0x08, 0x02, 0x0a, 0x70, + 0x40, 0x69, 0x10, 0xf8, 0x10, 0x1f, 0x01, 0xf0, 0xf7, 0x01, 0x1c, 0xe0, + 0x41, 0x69, 0x01, 0xf8, 0x14, 0x2f, 0x41, 0x69, 0x11, 0xf8, 0x10, 0x2f, + 0x42, 0xf0, 0x10, 0x02, 0x0a, 0x70, 0x40, 0x69, 0x10, 0xf8, 0x10, 0x1f, + 0x01, 0xf0, 0xef, 0x01, 0x0d, 0xe0, 0x41, 0x69, 0x01, 0xf8, 0x15, 0x2f, + 0x41, 0x69, 0x11, 0xf8, 0x10, 0x2f, 0x42, 0xf0, 0x01, 0x02, 0x0a, 0x70, + 0x40, 0x69, 0x10, 0xf8, 0x10, 0x1f, 0x01, 0xf0, 0xfe, 0x01, 0x01, 0x70, + 0x70, 0x47, 0x00, 0x00, 0x01, 0x29, 0x64, 0xd0, 0x02, 0xd3, 0x03, 0x29, + 0x01, 0xd0, 0x30, 0xd3, 0x70, 0x47, 0x42, 0x69, 0x47, 0x21, 0x02, 0xf8, + 0x0d, 0x1f, 0x41, 0x69, 0x11, 0xf8, 0x0a, 0x2f, 0x42, 0xf0, 0x04, 0x02, + 0x0a, 0x70, 0x41, 0x69, 0x11, 0xf8, 0x0a, 0x2f, 0x02, 0xf0, 0xfb, 0x02, + 0x0a, 0x70, 0x3f, 0x21, 0x42, 0x69, 0x02, 0xf8, 0x0d, 0x1f, 0x41, 0x69, + 0x11, 0xf8, 0x0a, 0x2f, 0x42, 0xf0, 0x04, 0x02, 0x0a, 0x70, 0x41, 0x69, + 0x11, 0xf8, 0x0a, 0x2f, 0x02, 0xf0, 0xfb, 0x02, 0x0a, 0x70, 0x0f, 0x21, + 0x42, 0x69, 0x02, 0xf8, 0x13, 0x1f, 0x41, 0x69, 0x11, 0xf8, 0x10, 0x2f, + 0x42, 0xf0, 0x08, 0x02, 0x0a, 0x70, 0x40, 0x69, 0x10, 0xf8, 0x10, 0x1f, + 0x01, 0xf0, 0xf7, 0x01, 0x61, 0xe0, 0x41, 0x69, 0x47, 0x22, 0x01, 0xf8, + 0x0c, 0x2f, 0x41, 0x69, 0x11, 0xf8, 0x0a, 0x2f, 0x42, 0xf0, 0x08, 0x02, + 0x0a, 0x70, 0x41, 0x69, 0x11, 0xf8, 0x0a, 0x2f, 0x02, 0xf0, 0xf7, 0x02, + 0x0a, 0x70, 0x3f, 0x21, 0x42, 0x69, 0x02, 0xf8, 0x0c, 0x1f, 0x41, 0x69, + 0x11, 0xf8, 0x0a, 0x2f, 0x42, 0xf0, 0x08, 0x02, 0x0a, 0x70, 0x41, 0x69, + 0x11, 0xf8, 0x0a, 0x2f, 0x02, 0xf0, 0xf7, 0x02, 0x0a, 0x70, 0x0f, 0x21, + 0x42, 0x69, 0x02, 0xf8, 0x12, 0x1f, 0x41, 0x69, 0x11, 0xf8, 0x10, 0x2f, + 0x42, 0xf0, 0x04, 0x02, 0x0a, 0x70, 0x40, 0x69, 0x10, 0xf8, 0x10, 0x1f, + 0x01, 0xf0, 0xfb, 0x01, 0x31, 0xe0, 0xc1, 0x78, 0xca, 0x07, 0x2f, 0xd5, + 0x42, 0x69, 0x47, 0x21, 0x02, 0xf8, 0x0b, 0x1f, 0x41, 0x69, 0x11, 0xf8, + 0x0a, 0x2f, 0x42, 0xf0, 0x10, 0x02, 0x0a, 0x70, 0x41, 0x69, 0x11, 0xf8, + 0x0a, 0x2f, 0x02, 0xf0, 0xef, 0x02, 0x0a, 0x70, 0x3f, 0x21, 0x42, 0x69, + 0x02, 0xf8, 0x0b, 0x1f, 0x41, 0x69, 0x11, 0xf8, 0x0a, 0x2f, 0x42, 0xf0, + 0x10, 0x02, 0x0a, 0x70, 0x41, 0x69, 0x11, 0xf8, 0x0a, 0x2f, 0x02, 0xf0, + 0xef, 0x02, 0x0a, 0x70, 0x0f, 0x21, 0x42, 0x69, 0x02, 0xf8, 0x11, 0x1f, + 0x41, 0x69, 0x11, 0xf8, 0x10, 0x2f, 0x42, 0xf0, 0x02, 0x02, 0x0a, 0x70, + 0x40, 0x69, 0x10, 0xf8, 0x10, 0x1f, 0x01, 0xf0, 0xfd, 0x01, 0x01, 0x70, + 0x70, 0x47, 0x10, 0xb5, 0x01, 0x29, 0x04, 0x46, 0x1b, 0xd0, 0x2b, 0xd3, + 0x03, 0x29, 0x01, 0xd0, 0x0b, 0xd3, 0x10, 0xbd, 0x04, 0x22, 0xff, 0xf7, + 0x0d, 0xfe, 0x03, 0x22, 0x03, 0x21, 0x00, 0xf0, 0x23, 0xf8, 0xe0, 0x69, + 0x82, 0x7f, 0x03, 0x21, 0x17, 0xe0, 0x04, 0x22, 0x02, 0x21, 0xff, 0xf7, + 0x01, 0xfe, 0x03, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x17, 0xf8, 0xe0, 0x69, + 0x42, 0x7f, 0x02, 0x21, 0x0b, 0xe0, 0xe0, 0x78, 0xc1, 0x07, 0x0d, 0xd5, + 0x04, 0x22, 0x00, 0xf0, 0x0c, 0xf8, 0x03, 0x22, 0x00, 0xf0, 0x09, 0xf8, + 0xe0, 0x69, 0x02, 0x7f, 0x01, 0x21, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, + 0xff, 0xf7, 0xda, 0xbe, 0x10, 0xbd, 0x01, 0x21, 0x20, 0x46, 0xff, 0xf7, + 0xe3, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, + 0x04, 0x46, 0x8c, 0xb0, 0x22, 0x6a, 0xd0, 0x7c, 0x51, 0x6a, 0x00, 0xf1, + 0x0b, 0x03, 0x21, 0xfa, 0x03, 0xf5, 0xee, 0x07, 0x04, 0xd4, 0x13, 0x30, + 0xc1, 0x40, 0xcb, 0x07, 0x40, 0xf1, 0x5f, 0x81, 0x92, 0x7c, 0x01, 0x20, + 0x00, 0x21, 0x52, 0x1c, 0x2a, 0xf0, 0x1c, 0xfd, 0x00, 0x94, 0xcd, 0xe9, + 0x0a, 0x01, 0x00, 0x26, 0x8d, 0xf8, 0x09, 0x60, 0x9f, 0xed, 0xab, 0x8a, + 0x00, 0x24, 0x00, 0x98, 0x42, 0xf2, 0xd8, 0x71, 0xe5, 0x22, 0x01, 0xf1, + 0xdb, 0x03, 0x62, 0x43, 0xe4, 0x26, 0x9d, 0x18, 0x66, 0x43, 0x80, 0x68, + 0x33, 0x44, 0xed, 0x1a, 0xd3, 0x26, 0x00, 0xeb, 0x85, 0x03, 0xd2, 0x25, + 0x66, 0x43, 0x03, 0xf5, 0xbe, 0x73, 0x65, 0x43, 0x93, 0xed, 0x00, 0x0a, + 0x42, 0xf6, 0xdc, 0x73, 0x03, 0xf1, 0xc9, 0x08, 0x08, 0xeb, 0x06, 0x07, + 0xa8, 0x44, 0xa7, 0xeb, 0x08, 0x07, 0x41, 0xf6, 0x14, 0x18, 0x4f, 0xf0, + 0xcd, 0x0e, 0xf8, 0xee, 0xc0, 0x0a, 0x00, 0xeb, 0x87, 0x07, 0x4f, 0xf0, + 0xcc, 0x0c, 0x0e, 0xfb, 0x04, 0xfe, 0xb6, 0xee, 0x00, 0x0a, 0x07, 0xf5, + 0xd0, 0x77, 0x0c, 0xfb, 0x04, 0xfc, 0x00, 0xee, 0x88, 0x0a, 0xd7, 0xed, + 0x00, 0x0a, 0x08, 0xf1, 0xc3, 0x07, 0x07, 0xeb, 0x0e, 0x09, 0x67, 0x44, + 0xa9, 0xeb, 0x07, 0x07, 0x4f, 0xf0, 0xd9, 0x09, 0xb8, 0xee, 0xe0, 0x1a, + 0x00, 0xeb, 0x87, 0x07, 0x09, 0xfb, 0x04, 0xf9, 0xf6, 0xee, 0x00, 0x0a, + 0x07, 0xf5, 0x9a, 0x77, 0x41, 0xee, 0x08, 0x0a, 0x97, 0xed, 0x00, 0x1a, + 0x4f, 0xf4, 0x01, 0x57, 0x07, 0xf1, 0xcf, 0x0a, 0xd8, 0x27, 0x67, 0x43, + 0x0a, 0xeb, 0x09, 0x0b, 0xba, 0x44, 0xab, 0xeb, 0x0a, 0x0a, 0xf8, 0xee, + 0xc1, 0x1a, 0x00, 0xeb, 0x8a, 0x0a, 0xb6, 0xee, 0x00, 0x1a, 0x0a, 0xf5, + 0xac, 0x7a, 0x01, 0xeb, 0x02, 0x0b, 0x01, 0xee, 0x88, 0x1a, 0x0b, 0xf5, + 0xe0, 0x72, 0xda, 0xed, 0x00, 0x1a, 0x4f, 0xf0, 0xe4, 0x0a, 0x0a, 0xfb, + 0x04, 0xfa, 0x51, 0x44, 0x01, 0xf2, 0xbf, 0x11, 0x52, 0x1a, 0xb8, 0xee, + 0xe1, 0x2a, 0x00, 0xeb, 0x82, 0x01, 0xf6, 0xee, 0x00, 0x1a, 0x01, 0xf5, + 0xbe, 0x71, 0x42, 0xee, 0x08, 0x1a, 0x91, 0xed, 0x00, 0x2a, 0x99, 0x19, + 0x2b, 0x44, 0x01, 0xf5, 0xce, 0x72, 0x03, 0xf2, 0x9b, 0x15, 0x52, 0x1b, + 0xf8, 0xee, 0xc2, 0x2a, 0x00, 0xeb, 0x82, 0x06, 0xb6, 0xee, 0x00, 0x2a, + 0x06, 0xf5, 0xd0, 0x76, 0x08, 0xeb, 0x0e, 0x01, 0x08, 0xeb, 0x0c, 0x03, + 0x02, 0xee, 0x88, 0x2a, 0x01, 0xf5, 0xc8, 0x72, 0x03, 0xf2, 0x8f, 0x15, + 0xd6, 0xed, 0x00, 0x2a, 0x52, 0x1b, 0xb8, 0xee, 0xe2, 0x3a, 0x00, 0xeb, + 0x82, 0x06, 0x4f, 0xf4, 0x01, 0x51, 0x4f, 0xf4, 0x01, 0x53, 0xf6, 0xee, + 0x00, 0x2a, 0x06, 0xf5, 0x9a, 0x76, 0x49, 0x44, 0xdb, 0x19, 0x43, 0xee, + 0x08, 0x2a, 0x01, 0xf5, 0xd4, 0x72, 0x03, 0xf2, 0xa7, 0x15, 0x96, 0xed, + 0x00, 0x3a, 0x52, 0x1b, 0xf8, 0xee, 0xc3, 0x3a, 0x00, 0xeb, 0x82, 0x01, + 0xb6, 0xee, 0x00, 0x3a, 0x01, 0xf5, 0xac, 0x71, 0x03, 0xee, 0x88, 0x3a, + 0xd1, 0xed, 0x00, 0x3a, 0x8d, 0xed, 0x06, 0x1a, 0xb4, 0xee, 0x41, 0x0a, + 0xb8, 0xee, 0xe3, 0x4a, 0xf1, 0xee, 0x10, 0xfa, 0xf6, 0xee, 0x00, 0x3a, + 0x41, 0xbf, 0xf4, 0xee, 0x61, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xf4, 0xee, + 0x41, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xee, 0x08, 0x3a, 0xcd, 0xed, + 0x07, 0x2a, 0x25, 0xd5, 0xb4, 0xee, 0x63, 0x1a, 0xf1, 0xee, 0x10, 0xfa, + 0x58, 0xbf, 0x00, 0x21, 0x1b, 0xd5, 0xb4, 0xee, 0x62, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x58, 0xbf, 0x00, 0x21, 0x14, 0xd5, 0xf4, 0xee, 0x42, 0x2a, + 0xf1, 0xee, 0x10, 0xfa, 0x58, 0xbf, 0x00, 0x21, 0x0d, 0xd5, 0xb4, 0xee, + 0x43, 0x2a, 0xf1, 0xee, 0x10, 0xfa, 0x58, 0xbf, 0x00, 0x21, 0x06, 0xd5, + 0xf4, 0xee, 0x63, 0x2a, 0xf1, 0xee, 0x10, 0xfa, 0x54, 0xbf, 0x00, 0x21, + 0x01, 0x21, 0x8d, 0xf8, 0x0a, 0x10, 0x07, 0xe0, 0xf4, 0xee, 0x41, 0x1a, + 0x00, 0x21, 0xf1, 0xee, 0x10, 0xfa, 0x8d, 0xf8, 0x0a, 0x10, 0x02, 0xd5, + 0xb0, 0xee, 0x41, 0x4a, 0x01, 0xe0, 0xb0, 0xee, 0x61, 0x4a, 0xb4, 0xee, + 0x62, 0x2a, 0x8d, 0xed, 0x08, 0x4a, 0xf1, 0xee, 0x10, 0xfa, 0xb4, 0xee, + 0x41, 0x0a, 0x4c, 0xbf, 0xb0, 0xee, 0x42, 0x4a, 0xb0, 0xee, 0x62, 0x4a, + 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xbf, 0xf4, 0xee, 0x61, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x8d, 0xed, 0x09, 0x4a, 0x0a, 0xd5, 0xb4, 0xee, 0x43, 0x2a, + 0xf1, 0xee, 0x10, 0xfa, 0x42, 0xbf, 0xf4, 0xee, 0x63, 0x2a, 0xf1, 0xee, + 0x10, 0xfa, 0x01, 0x21, 0x00, 0xd4, 0x00, 0x21, 0x8d, 0xf8, 0x0b, 0x10, + 0xdf, 0x22, 0x43, 0xf2, 0x3e, 0x71, 0xde, 0x23, 0xd6, 0x31, 0x62, 0x43, + 0x63, 0x43, 0x0a, 0x44, 0x0b, 0x44, 0xd2, 0x1a, 0x00, 0xeb, 0x82, 0x00, + 0x00, 0xf5, 0xf2, 0x70, 0x00, 0x68, 0x8d, 0xf8, 0x08, 0x40, 0xdd, 0xe9, + 0x0a, 0x23, 0xc1, 0x17, 0x82, 0x1a, 0x61, 0xeb, 0x03, 0x03, 0xcd, 0xe9, + 0x04, 0x23, 0x00, 0x98, 0x02, 0xa9, 0x00, 0xf0, 0x0f, 0xf8, 0x00, 0x98, + 0x02, 0xa9, 0x00, 0xf0, 0xbd, 0xf8, 0x64, 0x1c, 0x08, 0x2c, 0xff, 0xf4, + 0xb0, 0xae, 0x0c, 0xb0, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf1, 0x8f, + 0x00, 0x00, 0x80, 0x37, 0xf8, 0xb5, 0x04, 0x46, 0x2d, 0xed, 0x04, 0x8b, + 0x20, 0x6a, 0xc2, 0x7c, 0x0b, 0x78, 0x01, 0x2a, 0x04, 0xd0, 0x48, 0xd3, + 0x03, 0x2a, 0x2f, 0xd0, 0x17, 0xd3, 0x44, 0xe0, 0x00, 0xf0, 0x9a, 0xf8, + 0x05, 0xf5, 0xd4, 0x73, 0x05, 0xf5, 0x94, 0x76, 0x08, 0x25, 0x5c, 0x37, + 0x12, 0x0b, 0x00, 0xf0, 0x8d, 0xf8, 0x9f, 0xed, 0x42, 0x8a, 0xdf, 0xed, + 0x42, 0x8a, 0x08, 0xbf, 0x97, 0xed, 0x11, 0x0a, 0x4d, 0xd0, 0x38, 0x78, + 0xd7, 0xed, 0x11, 0x0a, 0x43, 0xe0, 0x00, 0xf0, 0x83, 0xf8, 0x05, 0xf5, + 0xe4, 0x73, 0x05, 0xf5, 0xa4, 0x76, 0x09, 0x25, 0x5c, 0x37, 0x52, 0x0b, + 0x00, 0xf0, 0x76, 0xf8, 0x9f, 0xed, 0x38, 0x8a, 0xdf, 0xed, 0x38, 0x8a, + 0x08, 0xbf, 0x97, 0xed, 0x12, 0x0a, 0x36, 0xd0, 0x78, 0x78, 0xd7, 0xed, + 0x12, 0x0a, 0x2c, 0xe0, 0x00, 0xf0, 0x6c, 0xf8, 0x05, 0xf5, 0xf4, 0x73, + 0x05, 0xf5, 0xb4, 0x76, 0x0a, 0x25, 0x5c, 0x37, 0x92, 0x0b, 0x00, 0xf0, + 0x5f, 0xf8, 0xb2, 0xee, 0x00, 0x8a, 0xfa, 0xee, 0x00, 0x8a, 0x08, 0xbf, + 0x97, 0xed, 0x13, 0x0a, 0x1f, 0xd0, 0xb8, 0x78, 0xd7, 0xed, 0x13, 0x0a, + 0x15, 0xe0, 0x00, 0xf0, 0x55, 0xf8, 0x05, 0xf5, 0x02, 0x73, 0x05, 0xf5, + 0xc4, 0x76, 0x0b, 0x25, 0x5c, 0x37, 0xd2, 0x0b, 0x00, 0xf0, 0x48, 0xf8, + 0xb0, 0xee, 0x00, 0x8a, 0xf8, 0xee, 0x00, 0x8a, 0x08, 0xbf, 0x97, 0xed, + 0x14, 0x0a, 0x08, 0xd0, 0xf8, 0x78, 0xd7, 0xed, 0x14, 0x0a, 0x00, 0xee, + 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0x88, 0x78, + 0x48, 0xb3, 0xd1, 0xed, 0x04, 0x0a, 0x91, 0xed, 0x05, 0x1a, 0x30, 0xee, + 0x81, 0x1a, 0xf6, 0xee, 0x00, 0x1a, 0x61, 0xee, 0x21, 0x1a, 0xc3, 0xed, + 0x00, 0x1a, 0xe2, 0xb1, 0xd1, 0xe9, 0x02, 0x01, 0xbf, 0xee, 0x00, 0x9a, + 0x20, 0xee, 0x09, 0x9a, 0x2d, 0xf0, 0x0a, 0xfd, 0x01, 0xee, 0x10, 0x0a, + 0xd6, 0xed, 0x00, 0x9a, 0x49, 0xee, 0x01, 0x9a, 0xc6, 0xed, 0x00, 0x9a, + 0xf0, 0xee, 0x68, 0x0a, 0xb0, 0xee, 0x48, 0x0a, 0x30, 0x46, 0xfe, 0xf7, + 0x79, 0xfe, 0x21, 0x6a, 0x4a, 0x68, 0x00, 0xfa, 0x05, 0xf5, 0x15, 0x43, + 0x4d, 0x60, 0xbd, 0xec, 0x04, 0x8b, 0xf1, 0xbd, 0x00, 0x00, 0x00, 0x43, + 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0xc2, + 0x01, 0x28, 0x02, 0xf0, 0x01, 0x02, 0x70, 0x47, 0xe5, 0x69, 0xa7, 0x69, + 0x42, 0x6a, 0x40, 0x7c, 0x05, 0xeb, 0x83, 0x05, 0x70, 0x47, 0x00, 0x00, + 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x08, 0x8b, 0x89, 0x46, 0x88, 0xb0, + 0x99, 0xf8, 0x00, 0xa0, 0x04, 0x46, 0xca, 0xf1, 0x07, 0x03, 0x22, 0x6a, + 0xd1, 0x7c, 0x01, 0x29, 0xdb, 0xb2, 0x0a, 0xf1, 0x01, 0x00, 0x05, 0xd0, + 0x03, 0xd3, 0x03, 0x29, 0x00, 0xf0, 0xb8, 0x80, 0x5e, 0xd3, 0x18, 0xe1, + 0x51, 0x6a, 0xd5, 0x7d, 0x09, 0x0d, 0x00, 0xf0, 0xa5, 0xfa, 0x04, 0xe0, + 0xe7, 0x69, 0x07, 0xf5, 0x94, 0x76, 0x00, 0xf0, 0xa7, 0xfa, 0x00, 0xf0, + 0x92, 0xfa, 0xf7, 0xdb, 0x00, 0xf0, 0x71, 0xfa, 0x95, 0xed, 0x00, 0x2a, + 0x00, 0xf0, 0x84, 0xfa, 0xdf, 0xed, 0x62, 0x0a, 0x71, 0xee, 0x21, 0x1a, + 0x01, 0xee, 0xa0, 0x0a, 0x20, 0xee, 0x02, 0x8a, 0x00, 0xf0, 0x86, 0xfa, + 0x07, 0xe0, 0x05, 0xf5, 0x94, 0x7e, 0x4f, 0xfa, 0x8c, 0xf6, 0x0e, 0xeb, + 0x86, 0x07, 0x00, 0xf0, 0x6a, 0xfa, 0x00, 0xf0, 0x5c, 0xfa, 0xf4, 0xdb, + 0x02, 0xf1, 0x0c, 0x06, 0x00, 0xf0, 0x8d, 0xfa, 0x01, 0x27, 0xd5, 0xed, + 0x00, 0x0a, 0x01, 0x93, 0x20, 0xee, 0x20, 0x9a, 0x05, 0xeb, 0x8a, 0x03, + 0x03, 0xf1, 0x24, 0x00, 0x00, 0x90, 0x07, 0x96, 0x05, 0xf1, 0x1c, 0x03, + 0x03, 0x93, 0x02, 0xf1, 0x30, 0x00, 0x00, 0xf0, 0x23, 0xfa, 0x00, 0xf1, + 0x24, 0x06, 0x05, 0x96, 0x02, 0xf1, 0x2c, 0x03, 0x21, 0x35, 0x04, 0x93, + 0x02, 0x95, 0x4f, 0xf4, 0x00, 0x06, 0xa0, 0x69, 0x52, 0x7c, 0x00, 0xf1, + 0xe4, 0x03, 0x01, 0x2a, 0xd3, 0xed, 0x05, 0x8a, 0x4f, 0xf0, 0xff, 0x35, + 0x03, 0xd1, 0x64, 0x30, 0xd0, 0xed, 0x1f, 0x9a, 0x2c, 0xe1, 0x10, 0xf8, + 0x64, 0x2f, 0xd0, 0xed, 0x1f, 0x0a, 0x21, 0xe1, 0xd5, 0x7d, 0x51, 0x6a, + 0x6d, 0x08, 0x49, 0x0d, 0x00, 0xf0, 0x46, 0xfa, 0x04, 0xe0, 0xe7, 0x69, + 0x07, 0xf5, 0xa4, 0x76, 0x00, 0xf0, 0x48, 0xfa, 0x00, 0xf0, 0x33, 0xfa, + 0xf7, 0xdb, 0x00, 0xf0, 0x12, 0xfa, 0x95, 0xed, 0x01, 0x2a, 0x00, 0xf0, + 0x25, 0xfa, 0xdf, 0xed, 0x34, 0x0a, 0x00, 0xf0, 0x13, 0xfa, 0x95, 0xed, + 0x00, 0x1a, 0x20, 0xee, 0x01, 0x8a, 0x00, 0xf0, 0x27, 0xfa, 0x07, 0xe0, + 0x05, 0xf5, 0xa4, 0x7e, 0x4f, 0xfa, 0x8c, 0xf6, 0x0e, 0xeb, 0x86, 0x07, + 0x00, 0xf0, 0x0b, 0xfa, 0x00, 0xf0, 0xfd, 0xf9, 0xf4, 0xdb, 0x02, 0xf1, + 0x0d, 0x06, 0x00, 0xf0, 0x2e, 0xfa, 0xd5, 0xed, 0x01, 0x0a, 0x95, 0xed, + 0x00, 0x1a, 0x01, 0x93, 0x02, 0x27, 0x05, 0xeb, 0x8a, 0x03, 0x03, 0xf1, + 0x44, 0x00, 0x00, 0x90, 0x07, 0x96, 0x05, 0xf1, 0x1d, 0x03, 0x03, 0x93, + 0x02, 0xf1, 0x34, 0x00, 0x06, 0x90, 0x20, 0xee, 0x20, 0x0a, 0x00, 0xf0, + 0xc2, 0xf9, 0x00, 0xf1, 0x44, 0x06, 0x00, 0xf0, 0xcd, 0xf9, 0x20, 0xee, + 0x01, 0x9a, 0xd3, 0xed, 0x06, 0x8a, 0x4f, 0xf0, 0x80, 0x76, 0x08, 0xbf, + 0xd3, 0xed, 0x00, 0x9a, 0xa6, 0xd0, 0x64, 0x30, 0xd3, 0xed, 0x00, 0x0a, + 0x42, 0x78, 0xc9, 0xe0, 0xd5, 0x7d, 0x51, 0x6a, 0xad, 0x08, 0x89, 0x0d, + 0x00, 0xf0, 0xee, 0xf9, 0x04, 0xe0, 0xe7, 0x69, 0x07, 0xf5, 0xb4, 0x76, + 0x00, 0xf0, 0xf0, 0xf9, 0x00, 0xf0, 0xdb, 0xf9, 0xf7, 0xdb, 0x00, 0xf0, + 0xba, 0xf9, 0x95, 0xed, 0x02, 0x2a, 0x00, 0xf0, 0xcd, 0xf9, 0xdf, 0xed, + 0xcb, 0x0a, 0x00, 0xf0, 0xbb, 0xf9, 0x95, 0xed, 0x01, 0x1a, 0xd5, 0xed, + 0x00, 0x1a, 0x20, 0xee, 0x01, 0x1a, 0x21, 0xee, 0x21, 0x8a, 0x00, 0xf0, + 0xcb, 0xf9, 0x0b, 0xe0, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x43, + 0x05, 0xf5, 0xb4, 0x7e, 0x4f, 0xfa, 0x8c, 0xf6, 0x0e, 0xeb, 0x86, 0x07, + 0x00, 0xf0, 0xab, 0xf9, 0x00, 0xf0, 0x9d, 0xf9, 0xf4, 0xdb, 0x02, 0xf1, + 0x0e, 0x06, 0x00, 0xf0, 0xce, 0xf9, 0xd5, 0xed, 0x02, 0x0a, 0x95, 0xed, + 0x01, 0x1a, 0x20, 0xee, 0x20, 0x0a, 0x04, 0x27, 0x20, 0xee, 0x01, 0x1a, + 0xd5, 0xed, 0x00, 0x1a, 0x01, 0x93, 0x21, 0xee, 0x21, 0x9a, 0x05, 0xeb, + 0x8a, 0x03, 0x03, 0xf1, 0x64, 0x00, 0x00, 0x90, 0x07, 0x96, 0x05, 0xf1, + 0x1e, 0x03, 0x03, 0x93, 0x02, 0xf1, 0x38, 0x00, 0x00, 0xf0, 0x5c, 0xf9, + 0x00, 0xf1, 0x64, 0x06, 0x00, 0xf0, 0x68, 0xf9, 0xd3, 0xed, 0x07, 0x8a, + 0x4f, 0xf0, 0x00, 0x76, 0x08, 0xbf, 0xd3, 0xed, 0x01, 0x9a, 0x71, 0xd0, + 0x64, 0x30, 0xd3, 0xed, 0x01, 0x0a, 0x82, 0x78, 0x66, 0xe0, 0xd5, 0x7d, + 0x51, 0x6a, 0xed, 0x08, 0xc9, 0x0d, 0x00, 0xf0, 0x8b, 0xf9, 0x04, 0xe0, + 0xe7, 0x69, 0x07, 0xf5, 0xc4, 0x76, 0x00, 0xf0, 0x8d, 0xf9, 0x00, 0xf0, + 0x78, 0xf9, 0xf7, 0xdb, 0x00, 0xf0, 0x57, 0xf9, 0x95, 0xed, 0x03, 0x2a, + 0x00, 0xf0, 0x6a, 0xf9, 0xf2, 0xee, 0x00, 0x0a, 0x00, 0xf0, 0x58, 0xf9, + 0x95, 0xed, 0x02, 0x1a, 0xd5, 0xed, 0x00, 0x1a, 0x20, 0xee, 0x01, 0x1a, + 0x95, 0xed, 0x01, 0x0a, 0x21, 0xee, 0x00, 0x0a, 0x20, 0xee, 0x21, 0x8a, + 0x00, 0xf0, 0x64, 0xf9, 0x07, 0xe0, 0x05, 0xf5, 0xc4, 0x7e, 0x4f, 0xfa, + 0x8c, 0xf6, 0x0e, 0xeb, 0x86, 0x07, 0x00, 0xf0, 0x48, 0xf9, 0x00, 0xf0, + 0x3a, 0xf9, 0xf4, 0xdb, 0x02, 0xf1, 0x0f, 0x06, 0x00, 0xf0, 0x6b, 0xf9, + 0xd5, 0xed, 0x03, 0x0a, 0x95, 0xed, 0x02, 0x1a, 0x20, 0xee, 0x20, 0x0a, + 0x20, 0xee, 0x01, 0x1a, 0x95, 0xed, 0x01, 0x0a, 0xd5, 0xed, 0x00, 0x0a, + 0x01, 0x93, 0x08, 0x27, 0x05, 0xeb, 0x8a, 0x03, 0x03, 0xf1, 0x84, 0x00, + 0x00, 0x90, 0x07, 0x96, 0x05, 0xf1, 0x1f, 0x03, 0x03, 0x93, 0x02, 0xf1, + 0x3c, 0x00, 0x06, 0x90, 0x21, 0xee, 0x00, 0x0a, 0x00, 0xf0, 0xf7, 0xf8, + 0x00, 0xf1, 0x84, 0x06, 0x00, 0xf0, 0x02, 0xf9, 0x20, 0xee, 0x20, 0x9a, + 0xd3, 0xed, 0x08, 0x8a, 0x4f, 0xf0, 0x80, 0x66, 0x08, 0xbf, 0xd3, 0xed, + 0x02, 0x9a, 0x09, 0xd0, 0x64, 0x30, 0xd3, 0xed, 0x02, 0x0a, 0xc2, 0x78, + 0x00, 0xee, 0x10, 0x2a, 0xb8, 0xee, 0x40, 0x0a, 0x60, 0xee, 0x20, 0x9a, + 0x99, 0xf8, 0x03, 0x00, 0x00, 0x28, 0x18, 0xbf, 0x00, 0x29, 0x00, 0xf0, + 0xcf, 0x80, 0x00, 0x98, 0x99, 0xed, 0x06, 0x0a, 0xd9, 0xed, 0x07, 0x0a, + 0x30, 0xee, 0x48, 0x0a, 0x70, 0xee, 0xc9, 0x0a, 0x70, 0xee, 0x20, 0x0a, + 0xb6, 0xee, 0x00, 0x1a, 0xd0, 0xed, 0x00, 0xba, 0x20, 0xee, 0x81, 0xaa, + 0x00, 0xf0, 0xd0, 0xf8, 0xb0, 0xee, 0x40, 0xba, 0x49, 0xee, 0x8a, 0xba, + 0x00, 0xf0, 0xca, 0xf8, 0xdf, 0xed, 0xb4, 0x9a, 0xb4, 0xee, 0x69, 0x0a, + 0x4f, 0xf0, 0x00, 0x0b, 0xf1, 0xee, 0x10, 0xfa, 0xa4, 0xbf, 0xf1, 0xee, + 0x0c, 0xba, 0x4f, 0xf0, 0x01, 0x0b, 0x00, 0xf0, 0xbb, 0xf8, 0xf9, 0xee, + 0x0c, 0xaa, 0xb4, 0xee, 0x6a, 0x0a, 0x00, 0x98, 0xf1, 0xee, 0x10, 0xfa, + 0x44, 0xbf, 0xf0, 0xee, 0x6a, 0xba, 0x4f, 0xf0, 0x01, 0x0b, 0xc0, 0xed, + 0x00, 0xba, 0x00, 0x99, 0x91, 0xed, 0x00, 0x0a, 0x07, 0xf0, 0x3a, 0xfc, + 0x3b, 0xee, 0x40, 0x0a, 0xb5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x08, 0xbf, 0xbb, 0xf1, 0x00, 0x0f, 0x1f, 0xbf, 0x01, 0x20, 0x07, 0x99, + 0x08, 0x70, 0xbb, 0xf1, 0x00, 0x0f, 0x17, 0xd0, 0x99, 0xf8, 0x01, 0x00, + 0xa0, 0xb9, 0x01, 0x21, 0x89, 0xf8, 0x01, 0x10, 0x01, 0x20, 0x07, 0x99, + 0x08, 0x70, 0x03, 0x98, 0x03, 0x99, 0x00, 0x78, 0x40, 0x1c, 0x08, 0x70, + 0xc0, 0xb2, 0x10, 0x28, 0x06, 0xd3, 0x03, 0x99, 0x0f, 0x20, 0x08, 0x70, + 0x20, 0x6a, 0x02, 0x68, 0x16, 0x43, 0x06, 0x60, 0x00, 0x98, 0x90, 0xed, + 0x00, 0x0a, 0xb0, 0xee, 0xc0, 0x0a, 0x00, 0xf0, 0x74, 0xf8, 0x63, 0xdb, + 0x03, 0x98, 0x01, 0x78, 0x0f, 0x29, 0x5f, 0xd1, 0x39, 0xee, 0x48, 0x0a, + 0xb5, 0xee, 0x40, 0x0a, 0x06, 0x98, 0xf1, 0xee, 0x10, 0xfa, 0x1a, 0xbf, + 0xf0, 0xee, 0xca, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0xb7, 0xee, 0x00, 0x0a, + 0xd0, 0xed, 0x00, 0x0a, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x48, 0xbf, 0x80, 0xed, 0x00, 0x0a, 0xf4, 0xee, 0x40, 0x8a, 0xf1, 0xee, + 0x10, 0xfa, 0x43, 0xd5, 0x21, 0x79, 0x05, 0x29, 0x06, 0xd1, 0x20, 0x6a, + 0x81, 0x8a, 0x06, 0x29, 0x02, 0xd2, 0x41, 0x68, 0x0f, 0x43, 0x47, 0x60, + 0xb8, 0xf1, 0x00, 0x0f, 0x36, 0xd0, 0x00, 0x98, 0x00, 0xf0, 0x41, 0xf8, + 0x09, 0xdb, 0x05, 0x98, 0xd0, 0xed, 0x00, 0x0a, 0xf4, 0xee, 0x6a, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, 0x01, 0x21, 0x00, 0xd4, 0x00, 0x21, + 0xb4, 0xee, 0x6a, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x05, 0xd5, 0x05, 0x98, + 0x00, 0xf0, 0x2d, 0xf8, 0xa8, 0xbf, 0x01, 0x22, 0x00, 0xda, 0x00, 0x22, + 0x01, 0x98, 0x82, 0x45, 0xb4, 0xbf, 0x01, 0x23, 0x00, 0x23, 0x68, 0x42, + 0x51, 0xb1, 0x04, 0x9c, 0x01, 0x21, 0x21, 0x70, 0x1c, 0x00, 0x02, 0x9c, + 0x26, 0x78, 0x14, 0xbf, 0x29, 0x46, 0x01, 0x46, 0x31, 0x44, 0x21, 0x70, + 0x42, 0xb1, 0x01, 0x21, 0x04, 0x9a, 0x11, 0x70, 0x03, 0xb9, 0x28, 0x46, + 0x02, 0x99, 0x0a, 0x78, 0x80, 0x18, 0x08, 0x70, 0x08, 0xb0, 0xbd, 0xec, + 0x08, 0x8b, 0xbd, 0xe8, 0xf1, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, + 0x06, 0x90, 0x01, 0x9b, 0x05, 0xeb, 0x83, 0x00, 0x70, 0x47, 0x90, 0xed, + 0x00, 0x0a, 0xb4, 0xee, 0x69, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x70, 0x47, + 0xb0, 0xee, 0x6b, 0x0a, 0x07, 0xf0, 0x8e, 0xbb, 0x05, 0x96, 0x02, 0xf1, + 0x2d, 0x03, 0x22, 0x35, 0x04, 0x93, 0x02, 0x95, 0x01, 0x25, 0xa0, 0x69, + 0x52, 0x7c, 0x00, 0xf1, 0xe4, 0x03, 0x01, 0x2a, 0x70, 0x47, 0x4f, 0xfa, + 0x8a, 0xfc, 0xe5, 0x69, 0x70, 0x47, 0x4f, 0xfa, 0x8c, 0xf7, 0x46, 0xb2, + 0xb7, 0x42, 0x70, 0x47, 0x71, 0xee, 0x21, 0x1a, 0x01, 0xee, 0xa0, 0x0a, + 0x20, 0xee, 0x02, 0x0a, 0x70, 0x47, 0x0c, 0xf1, 0x01, 0x0c, 0x97, 0xed, + 0x00, 0x1a, 0x30, 0xee, 0x01, 0x0a, 0x70, 0x47, 0x01, 0xee, 0x10, 0xca, + 0xb8, 0xee, 0xc1, 0x1a, 0xf9, 0xee, 0x00, 0x1a, 0x70, 0x47, 0x6f, 0xb2, + 0x4f, 0xfa, 0x8a, 0xf6, 0xb7, 0x42, 0x70, 0x47, 0x9f, 0xed, 0x36, 0x0a, + 0x4f, 0xf0, 0x00, 0x0c, 0x70, 0x47, 0x00, 0x00, 0x05, 0xf0, 0x01, 0x08, + 0x01, 0xf0, 0x01, 0x01, 0x9f, 0xed, 0x31, 0x0a, 0x00, 0x25, 0x70, 0x47, + 0x6f, 0xb2, 0x06, 0xeb, 0x87, 0x06, 0x6d, 0x1c, 0xd6, 0xed, 0x00, 0x0a, + 0x30, 0xee, 0x20, 0x0a, 0x70, 0x47, 0x40, 0xb2, 0x01, 0xee, 0x10, 0x0a, + 0xb8, 0xee, 0xc1, 0x1a, 0xf9, 0xee, 0x00, 0x1a, 0x71, 0xee, 0x21, 0x1a, + 0x01, 0xee, 0xa0, 0x0a, 0x70, 0x47, 0x00, 0x00, 0x70, 0xb5, 0x01, 0x6a, + 0xcb, 0x7c, 0x4a, 0x6a, 0x0b, 0x33, 0xda, 0x40, 0xd2, 0x07, 0x02, 0xd4, + 0x0b, 0x7a, 0x01, 0x2b, 0x3b, 0xd1, 0x00, 0x22, 0x9f, 0xed, 0x1f, 0x0a, + 0xcb, 0x7c, 0x5b, 0x1e, 0x03, 0x2b, 0x1d, 0xd8, 0xdf, 0xe8, 0x03, 0xf0, + 0x14, 0x0f, 0x0a, 0x02, 0xc4, 0x69, 0x04, 0xeb, 0x82, 0x03, 0x03, 0xf5, + 0xd4, 0x75, 0xd5, 0xed, 0x18, 0x0a, 0x0e, 0xe0, 0x00, 0xf0, 0x2e, 0xf8, + 0xd5, 0xed, 0x10, 0x0a, 0x09, 0xe0, 0x00, 0xf0, 0x29, 0xf8, 0xd5, 0xed, + 0x08, 0x0a, 0x04, 0xe0, 0xc3, 0x69, 0x03, 0xeb, 0x82, 0x04, 0xd4, 0xed, + 0x6a, 0x0a, 0x60, 0xee, 0x80, 0x0a, 0x01, 0xe0, 0xdf, 0xed, 0x0c, 0x0a, + 0x41, 0xf2, 0xac, 0x23, 0xce, 0x25, 0xc5, 0x33, 0x55, 0x43, 0xcd, 0x26, + 0x1d, 0x44, 0x56, 0x43, 0x84, 0x68, 0x33, 0x44, 0xed, 0x1a, 0x04, 0xeb, + 0x85, 0x04, 0x84, 0x34, 0x52, 0x1c, 0xfd, 0xee, 0xe0, 0x0a, 0x08, 0x2a, + 0xc4, 0xed, 0x00, 0x0a, 0xc6, 0xd3, 0x70, 0xbd, 0x01, 0x00, 0xe0, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x47, 0xc3, 0x69, 0x03, 0xeb, + 0x82, 0x04, 0x04, 0xf5, 0xd4, 0x75, 0x70, 0x47, 0x02, 0x6a, 0x00, 0x21, + 0x11, 0x76, 0x81, 0x69, 0x91, 0xf8, 0xf3, 0x20, 0x01, 0x2a, 0x0a, 0xd1, + 0x82, 0x68, 0x02, 0xf5, 0x9e, 0x62, 0x12, 0x68, 0xd1, 0xf8, 0xf4, 0x10, + 0x8a, 0x42, 0x02, 0xd3, 0x00, 0x6a, 0x01, 0x22, 0x02, 0x76, 0x70, 0x47, + 0x2d, 0xe9, 0xf0, 0x44, 0x04, 0x46, 0x2d, 0xed, 0x04, 0x8b, 0x25, 0x6a, + 0x95, 0xf8, 0x24, 0x00, 0xc1, 0x07, 0xbf, 0xee, 0x00, 0x8a, 0x21, 0xd5, + 0xa2, 0x68, 0x02, 0xf5, 0x86, 0x62, 0x01, 0x20, 0x16, 0x68, 0xaa, 0x7c, + 0x00, 0xf0, 0x99, 0xfa, 0x00, 0x27, 0xa3, 0x69, 0x30, 0x1a, 0x67, 0xeb, + 0x01, 0x01, 0x03, 0xf1, 0x60, 0x02, 0x6b, 0x7c, 0x92, 0xed, 0x07, 0x0a, + 0x01, 0x2b, 0x00, 0xf0, 0xda, 0xfa, 0xe6, 0x69, 0x20, 0xee, 0x08, 0x9a, + 0x2d, 0xf0, 0x70, 0xf9, 0x00, 0xee, 0x10, 0x0a, 0xd6, 0xed, 0x01, 0x8a, + 0x49, 0xee, 0x00, 0x8a, 0xc6, 0xed, 0x01, 0x8a, 0x95, 0xf8, 0x24, 0x00, + 0x81, 0x07, 0x20, 0xd5, 0xa0, 0x68, 0x00, 0xf2, 0x2c, 0x40, 0x00, 0x21, + 0x06, 0x68, 0xaa, 0x7c, 0x01, 0x20, 0x52, 0x1c, 0x29, 0xf0, 0x86, 0xff, + 0x00, 0x27, 0x30, 0x1a, 0xa2, 0x69, 0x6b, 0x7c, 0x67, 0xeb, 0x01, 0x01, + 0x60, 0x32, 0x01, 0x2b, 0x92, 0xed, 0x08, 0x0a, 0x01, 0xd0, 0x00, 0xf0, + 0x7b, 0xfb, 0x00, 0xf0, 0x68, 0xf8, 0x00, 0xee, 0x10, 0x0a, 0xd6, 0xed, + 0x02, 0x0a, 0x48, 0xee, 0x80, 0x0a, 0xc6, 0xed, 0x02, 0x0a, 0x95, 0xf8, + 0x24, 0x00, 0x41, 0x07, 0x20, 0xd5, 0xa0, 0x68, 0x00, 0xf5, 0x8a, 0x61, + 0x00, 0xf2, 0x54, 0x40, 0x00, 0xf0, 0x44, 0xf8, 0x0a, 0xf1, 0x0b, 0x02, + 0x29, 0xf0, 0x60, 0xff, 0x36, 0x1a, 0x8f, 0x41, 0x00, 0xf0, 0x68, 0xfb, + 0x00, 0xf0, 0x41, 0xf8, 0x92, 0xed, 0x09, 0x0a, 0x02, 0xd0, 0x92, 0x78, + 0x00, 0xf0, 0x57, 0xfb, 0x00, 0xf0, 0x43, 0xf8, 0x00, 0xee, 0x10, 0x0a, + 0xd6, 0xed, 0x03, 0x0a, 0x48, 0xee, 0x80, 0x0a, 0xc6, 0xed, 0x03, 0x0a, + 0x95, 0xf8, 0x24, 0x00, 0x01, 0x07, 0x21, 0xd5, 0xa0, 0x68, 0x00, 0xf5, + 0x89, 0x61, 0x00, 0xf2, 0x4c, 0x40, 0x00, 0xf0, 0x1f, 0xf8, 0x0a, 0xf1, + 0x09, 0x02, 0x29, 0xf0, 0x3b, 0xff, 0x36, 0x1a, 0x8f, 0x41, 0x00, 0xf0, + 0x43, 0xfb, 0x00, 0xf0, 0x1c, 0xf8, 0x92, 0xed, 0x0a, 0x0a, 0x02, 0xd0, + 0xd2, 0x78, 0x00, 0xf0, 0x32, 0xfb, 0xe4, 0x69, 0x00, 0xf0, 0x61, 0xfa, + 0x00, 0xee, 0x10, 0x0a, 0xd4, 0xed, 0x04, 0x0a, 0x48, 0xee, 0x00, 0x0a, + 0xc4, 0xed, 0x04, 0x0a, 0xbd, 0xec, 0x04, 0x8b, 0xbd, 0xe8, 0xf0, 0x84, + 0x0e, 0x68, 0x07, 0x68, 0x95, 0xf8, 0x12, 0xa0, 0x01, 0x20, 0x00, 0x21, + 0x70, 0x47, 0x49, 0x08, 0x4f, 0xea, 0x30, 0x00, 0x30, 0x18, 0xa2, 0x69, + 0x6b, 0x7c, 0x79, 0x41, 0x60, 0x32, 0x01, 0x2b, 0x70, 0x47, 0xe6, 0x69, + 0x60, 0xee, 0x08, 0x8a, 0x2d, 0xf0, 0xde, 0xb8, 0xf0, 0xb5, 0x02, 0x6a, + 0x51, 0x6a, 0xcb, 0x03, 0x33, 0xd5, 0x81, 0x69, 0x01, 0xf1, 0x54, 0x03, + 0x1c, 0x78, 0x59, 0x78, 0x00, 0xf0, 0xf4, 0xf8, 0x2b, 0xd0, 0xc5, 0x69, + 0x9f, 0xed, 0x6e, 0x0a, 0x03, 0xe0, 0x05, 0xf5, 0x94, 0x76, 0x00, 0xf0, + 0xe2, 0xf8, 0x5e, 0x78, 0xa6, 0x42, 0xf8, 0xda, 0x00, 0xf0, 0xeb, 0xf8, + 0xdf, 0xed, 0x69, 0x0a, 0x30, 0xee, 0x20, 0x0a, 0x9f, 0xed, 0x67, 0x1a, + 0x81, 0xee, 0x00, 0x0a, 0x00, 0x21, 0x05, 0xeb, 0x81, 0x03, 0x49, 0x1c, + 0xd3, 0xed, 0x42, 0x0a, 0x60, 0xee, 0x80, 0x0a, 0x02, 0x29, 0xc3, 0xed, + 0x42, 0x0a, 0xf4, 0xd3, 0x00, 0x21, 0x05, 0xf5, 0x94, 0x73, 0x00, 0xf0, + 0xbd, 0xf8, 0xd5, 0xed, 0x01, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0x85, 0xed, + 0x01, 0x0a, 0x51, 0x6a, 0x8b, 0x03, 0x33, 0xd5, 0x81, 0x69, 0x01, 0xf1, + 0x54, 0x03, 0x9c, 0x78, 0xd9, 0x78, 0x00, 0xf0, 0xbd, 0xf8, 0x2b, 0xd0, + 0xc5, 0x69, 0x9f, 0xed, 0x53, 0x0a, 0x03, 0xe0, 0x05, 0xf5, 0xa4, 0x76, + 0x00, 0xf0, 0xab, 0xf8, 0xde, 0x78, 0xa6, 0x42, 0xf8, 0xda, 0x00, 0xf0, + 0xb4, 0xf8, 0xdf, 0xed, 0xc5, 0x0a, 0x30, 0xee, 0x20, 0x0a, 0x9f, 0xed, + 0xc3, 0x1a, 0x81, 0xee, 0x00, 0x0a, 0x00, 0x21, 0x05, 0xeb, 0x81, 0x03, + 0x49, 0x1c, 0xd3, 0xed, 0x44, 0x0a, 0x60, 0xee, 0x80, 0x0a, 0x02, 0x29, + 0xc3, 0xed, 0x44, 0x0a, 0xf4, 0xd3, 0x00, 0x21, 0x05, 0xf5, 0xa4, 0x73, + 0x00, 0xf0, 0x86, 0xf8, 0xd5, 0xed, 0x02, 0x0a, 0x80, 0xee, 0x80, 0x0a, + 0x85, 0xed, 0x02, 0x0a, 0x51, 0x6a, 0x4b, 0x03, 0x33, 0xd5, 0x81, 0x69, + 0x01, 0xf1, 0x54, 0x03, 0x1c, 0x79, 0x59, 0x79, 0x00, 0xf0, 0x86, 0xf8, + 0x2b, 0xd0, 0xc5, 0x69, 0x9f, 0xed, 0x37, 0x0a, 0x03, 0xe0, 0x05, 0xf5, + 0xb4, 0x76, 0x00, 0xf0, 0x74, 0xf8, 0x5e, 0x79, 0xa6, 0x42, 0xf8, 0xda, + 0x00, 0xf0, 0x7d, 0xf8, 0xdf, 0xed, 0xaa, 0x0a, 0x30, 0xee, 0x20, 0x0a, + 0x9f, 0xed, 0xa8, 0x1a, 0x81, 0xee, 0x00, 0x0a, 0x00, 0x21, 0x05, 0xeb, + 0x81, 0x03, 0x49, 0x1c, 0xd3, 0xed, 0x46, 0x0a, 0x60, 0xee, 0x80, 0x0a, + 0x02, 0x29, 0xc3, 0xed, 0x46, 0x0a, 0xf4, 0xd3, 0x00, 0x21, 0x05, 0xf5, + 0xb4, 0x73, 0x00, 0xf0, 0x4f, 0xf8, 0xd5, 0xed, 0x03, 0x0a, 0x80, 0xee, + 0x80, 0x0a, 0x85, 0xed, 0x03, 0x0a, 0x51, 0x6a, 0x0a, 0x03, 0x3f, 0xd5, + 0x81, 0x69, 0x01, 0xf1, 0x54, 0x02, 0x93, 0x79, 0xd1, 0x79, 0xc9, 0x1a, + 0x49, 0x1c, 0xc9, 0xb2, 0x00, 0x29, 0x35, 0xd0, 0xc4, 0x69, 0x9f, 0xed, + 0x1b, 0x0a, 0x09, 0xe0, 0x04, 0xf5, 0xc4, 0x70, 0x00, 0xeb, 0x83, 0x05, + 0x5b, 0x1c, 0xd5, 0xed, 0x00, 0x0a, 0x30, 0xee, 0x20, 0x0a, 0xdb, 0xb2, + 0xd0, 0x79, 0x98, 0x42, 0xf2, 0xda, 0x00, 0xf0, 0x3e, 0xf8, 0xf2, 0xee, + 0x00, 0x0a, 0x30, 0xee, 0x20, 0x0a, 0xb2, 0xee, 0x00, 0x1a, 0x81, 0xee, + 0x00, 0x0a, 0x00, 0x20, 0x04, 0xeb, 0x80, 0x01, 0x40, 0x1c, 0xd1, 0xed, + 0x48, 0x0a, 0x60, 0xee, 0x80, 0x0a, 0x02, 0x28, 0xc1, 0xed, 0x48, 0x0a, + 0xf4, 0xd3, 0x00, 0x20, 0x04, 0xf5, 0xc4, 0x71, 0x00, 0x22, 0x41, 0xf8, + 0x20, 0x20, 0x40, 0x1c, 0x08, 0x28, 0xfa, 0xd3, 0xd4, 0xed, 0x04, 0x0a, + 0x80, 0xee, 0x80, 0x0a, 0x84, 0xed, 0x04, 0x0a, 0xf0, 0xbd, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x24, 0x43, 0xf8, + 0x21, 0x40, 0x49, 0x1c, 0x08, 0x29, 0xfa, 0xd3, 0x70, 0x47, 0x06, 0xeb, + 0x84, 0x07, 0x64, 0x1c, 0xd7, 0xed, 0x00, 0x0a, 0x30, 0xee, 0x20, 0x0a, + 0xe4, 0xb2, 0x70, 0x47, 0x09, 0x1b, 0x49, 0x1c, 0xc9, 0xb2, 0x00, 0x29, + 0x70, 0x47, 0x00, 0xee, 0x90, 0x1a, 0xf8, 0xee, 0x60, 0x0a, 0x80, 0xee, + 0x20, 0x0a, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x04, 0x8b, + 0x05, 0x46, 0x8a, 0xb0, 0x2a, 0x6a, 0x0f, 0xf2, 0x10, 0x4b, 0x00, 0x92, + 0x01, 0x20, 0x92, 0x7c, 0x00, 0xf0, 0xdb, 0xf8, 0x06, 0x46, 0x89, 0x46, + 0x00, 0x24, 0xbf, 0xee, 0x00, 0x8a, 0x0d, 0xf1, 0x10, 0x08, 0x00, 0x98, + 0x41, 0x6a, 0x04, 0xf1, 0x0a, 0x02, 0xd1, 0x40, 0xc8, 0x07, 0x40, 0xf1, + 0xaa, 0x80, 0x00, 0x99, 0x48, 0x7c, 0xa9, 0x69, 0x01, 0xf1, 0xb0, 0x02, + 0xc4, 0xb9, 0x92, 0xed, 0x02, 0x0a, 0xd2, 0xed, 0x01, 0x0a, 0x92, 0xed, + 0x00, 0x1a, 0x01, 0x28, 0x60, 0xee, 0x08, 0x8a, 0x20, 0xee, 0x88, 0x9a, + 0x61, 0xee, 0x08, 0x9a, 0x05, 0xd0, 0x91, 0xf8, 0x6a, 0x00, 0x00, 0xee, + 0x10, 0x0a, 0x00, 0xf0, 0xa9, 0xf8, 0xa9, 0x68, 0x01, 0xf5, 0x86, 0x61, + 0x08, 0x68, 0x18, 0xe0, 0x92, 0xed, 0x05, 0x0a, 0xd2, 0xed, 0x04, 0x0a, + 0x60, 0xee, 0x08, 0x8a, 0x92, 0xed, 0x03, 0x0a, 0x01, 0x28, 0x20, 0xee, + 0x88, 0x9a, 0x60, 0xee, 0x08, 0x9a, 0x06, 0xd0, 0x01, 0xf1, 0x6a, 0x00, + 0x41, 0x78, 0x00, 0xee, 0x10, 0x1a, 0x00, 0xf0, 0x8f, 0xf8, 0xa8, 0x68, + 0x00, 0xf2, 0x2c, 0x40, 0x00, 0x68, 0x00, 0x21, 0x80, 0x1b, 0x61, 0xeb, + 0x09, 0x01, 0xcd, 0xe9, 0x02, 0x01, 0xd5, 0xf8, 0x08, 0xa0, 0x00, 0x27, + 0x44, 0xb9, 0x40, 0xf6, 0xcc, 0x50, 0xd1, 0x21, 0xd0, 0x22, 0xca, 0x30, + 0x00, 0xf0, 0x72, 0xf8, 0x4c, 0x30, 0x07, 0xe0, 0x40, 0xf6, 0x58, 0x10, + 0xbf, 0x21, 0xbe, 0x22, 0xb8, 0x30, 0x00, 0xf0, 0x69, 0xf8, 0x34, 0x30, + 0x00, 0x68, 0x00, 0x21, 0x80, 0x1b, 0x61, 0xeb, 0x09, 0x01, 0x2c, 0xf0, + 0x5b, 0xff, 0x00, 0xee, 0x10, 0x0a, 0x0b, 0xeb, 0x87, 0x00, 0x08, 0xeb, + 0x87, 0x01, 0xd0, 0xed, 0x00, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0x7f, 0x1c, + 0xb1, 0xee, 0x40, 0x0a, 0x06, 0x2f, 0x81, 0xed, 0x00, 0x0a, 0xd5, 0xd3, + 0xe8, 0x69, 0x98, 0xed, 0x01, 0x0a, 0x9d, 0xed, 0x04, 0x1a, 0x00, 0xeb, + 0x84, 0x01, 0x01, 0xf1, 0xe0, 0x07, 0xf2, 0xee, 0x04, 0x0a, 0x69, 0xee, + 0xa0, 0x0a, 0x30, 0xee, 0x01, 0x1a, 0xd7, 0xed, 0x00, 0x1a, 0x40, 0xee, + 0xc1, 0x1a, 0xc7, 0xed, 0x00, 0x1a, 0xdd, 0xed, 0x04, 0x0a, 0x97, 0xed, + 0x02, 0x1a, 0x30, 0xee, 0x60, 0x0a, 0x00, 0xee, 0x09, 0x1a, 0x87, 0xed, + 0x02, 0x1a, 0xdd, 0xe9, 0x02, 0x01, 0x2c, 0xf0, 0x27, 0xff, 0x00, 0xee, + 0x10, 0x0a, 0xdf, 0xed, 0x13, 0x0a, 0x97, 0xed, 0x04, 0x1a, 0x00, 0xee, + 0x60, 0x1a, 0x87, 0xed, 0x04, 0x1a, 0xd8, 0xed, 0x03, 0x0a, 0x98, 0xed, + 0x02, 0x1a, 0x9f, 0xed, 0x0e, 0x0a, 0x30, 0xee, 0xc1, 0x1a, 0x28, 0xee, + 0x80, 0x0a, 0xd7, 0xed, 0x06, 0x0a, 0x40, 0xee, 0x01, 0x0a, 0xc7, 0xed, + 0x06, 0x0a, 0x38, 0x6a, 0x38, 0x62, 0x64, 0x1c, 0x01, 0x2c, 0x7f, 0xf6, + 0x4a, 0xaf, 0x0a, 0xb0, 0xbd, 0xec, 0x04, 0x8b, 0xbd, 0xe8, 0xf1, 0x8f, + 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x36, 0x79, 0x43, 0x7a, 0x43, 0x01, 0x44, 0x02, 0x44, + 0x89, 0x1a, 0x0a, 0xeb, 0x81, 0x00, 0x70, 0x47, 0xb8, 0xee, 0x40, 0x0a, + 0x69, 0xee, 0x80, 0x9a, 0x29, 0xee, 0x00, 0x9a, 0x68, 0xee, 0x80, 0x8a, + 0x70, 0x47, 0x00, 0x21, 0x52, 0x1c, 0x29, 0xf0, 0x11, 0xbd, 0x2d, 0xe9, + 0xf0, 0x41, 0x06, 0x46, 0x2d, 0xed, 0x04, 0x8b, 0x37, 0x6a, 0xba, 0x7c, + 0x01, 0x20, 0xff, 0xf7, 0xf2, 0xff, 0x04, 0x46, 0x97, 0xf8, 0x24, 0x00, + 0x0d, 0x46, 0xc1, 0x06, 0xbf, 0xee, 0x00, 0x8a, 0x16, 0xd5, 0xb2, 0x68, + 0x02, 0xf5, 0x88, 0x62, 0x00, 0xf0, 0x3c, 0xf8, 0x92, 0xed, 0x09, 0x0a, + 0x00, 0xf0, 0x2f, 0xf8, 0xd6, 0xf8, 0x1c, 0x80, 0x20, 0xee, 0x08, 0x9a, + 0x2c, 0xf0, 0xc4, 0xfe, 0x00, 0xee, 0x10, 0x0a, 0xd8, 0xed, 0x05, 0x8a, + 0x49, 0xee, 0x00, 0x8a, 0xc8, 0xed, 0x05, 0x8a, 0x97, 0xf8, 0x24, 0x00, + 0x81, 0x06, 0x14, 0xd5, 0xb2, 0x68, 0x02, 0xf2, 0x3c, 0x42, 0x00, 0xf0, + 0x21, 0xf8, 0x92, 0xed, 0x0a, 0x0a, 0x01, 0xd0, 0x00, 0xf0, 0xdc, 0xf8, + 0xf4, 0x69, 0x00, 0xf0, 0x0c, 0xf8, 0x00, 0xee, 0x10, 0x0a, 0xd4, 0xed, + 0x06, 0x0a, 0x48, 0xee, 0x00, 0x0a, 0xc4, 0xed, 0x06, 0x0a, 0xbd, 0xec, + 0x04, 0x8b, 0xbd, 0xe8, 0xf0, 0x81, 0x20, 0xee, 0x08, 0x8a, 0x2c, 0xf0, + 0x9b, 0xbe, 0x06, 0xd0, 0x12, 0x78, 0x08, 0xee, 0x90, 0x2a, 0xf8, 0xee, + 0x68, 0x8a, 0x28, 0xee, 0x80, 0x0a, 0x70, 0x47, 0x00, 0x21, 0x10, 0x68, + 0xb2, 0x69, 0x7b, 0x7c, 0x00, 0x1b, 0xa9, 0x41, 0x68, 0x32, 0x01, 0x2b, + 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x44, 0x06, 0x46, 0x2d, 0xed, 0x02, 0x8b, + 0x37, 0x6a, 0x97, 0xf8, 0x24, 0x00, 0x01, 0x06, 0xbf, 0xee, 0x00, 0x8a, + 0x2a, 0xd5, 0xb0, 0x68, 0x00, 0xf5, 0x84, 0x61, 0x00, 0xf2, 0x24, 0x40, + 0x00, 0xf0, 0x86, 0xf8, 0x0a, 0xf1, 0x11, 0x02, 0x29, 0xf0, 0x9e, 0xfc, + 0x00, 0xf0, 0xa6, 0xf8, 0x00, 0xf0, 0x8c, 0xf8, 0xb3, 0x69, 0x03, 0xf1, + 0x6c, 0x02, 0x7b, 0x7c, 0x92, 0xed, 0x0a, 0x0a, 0x01, 0x2b, 0x02, 0xd0, + 0x12, 0x78, 0x00, 0xf0, 0x92, 0xf8, 0xf3, 0x69, 0x7a, 0x7a, 0x00, 0xf0, + 0x87, 0xf8, 0x00, 0xee, 0x10, 0x0a, 0xd4, 0xed, 0x8a, 0x0a, 0x48, 0xee, + 0x80, 0x0a, 0xc4, 0xed, 0x8a, 0x0a, 0x03, 0x21, 0x78, 0x7a, 0x00, 0xf0, + 0x6a, 0xf8, 0x78, 0x72, 0x37, 0x6a, 0x78, 0x6a, 0xc1, 0x05, 0x29, 0xd5, + 0xb0, 0x68, 0x00, 0xf5, 0x83, 0x61, 0x00, 0xf2, 0x1c, 0x40, 0x00, 0xf0, + 0x57, 0xf8, 0x0a, 0xf1, 0x0f, 0x02, 0x29, 0xf0, 0x6f, 0xfc, 0x00, 0xf0, + 0x77, 0xf8, 0x00, 0xf0, 0x5d, 0xf8, 0xb2, 0x69, 0x7b, 0x7c, 0x92, 0xed, + 0x26, 0x0a, 0x01, 0x2b, 0x03, 0xd0, 0x92, 0xf8, 0x6d, 0x20, 0x00, 0xf0, + 0x64, 0xf8, 0xf3, 0x69, 0xba, 0x7a, 0x00, 0xf0, 0x59, 0xf8, 0x00, 0xee, + 0x10, 0x0a, 0xd4, 0xed, 0x8d, 0x0a, 0x48, 0xee, 0x80, 0x0a, 0xc4, 0xed, + 0x8d, 0x0a, 0x03, 0x21, 0xb8, 0x7a, 0x00, 0xf0, 0x3c, 0xf8, 0xb8, 0x72, + 0x37, 0x6a, 0x78, 0x6a, 0x81, 0x05, 0x2b, 0xd5, 0xb0, 0x68, 0x00, 0xf5, + 0x82, 0x61, 0x00, 0xf2, 0x14, 0x40, 0x00, 0xf0, 0x29, 0xf8, 0x0a, 0xf1, + 0x0d, 0x02, 0x29, 0xf0, 0x41, 0xfc, 0x00, 0xf0, 0x49, 0xf8, 0x00, 0xf0, + 0x2f, 0xf8, 0xb2, 0x69, 0x7b, 0x7c, 0x92, 0xed, 0x27, 0x0a, 0x01, 0x2b, + 0x03, 0xd0, 0x92, 0xf8, 0x6e, 0x20, 0x00, 0xf0, 0x36, 0xf8, 0xf3, 0x69, + 0xfa, 0x7a, 0x03, 0xeb, 0x82, 0x04, 0xff, 0xf7, 0x62, 0xff, 0x00, 0xee, + 0x10, 0x0a, 0xd4, 0xed, 0x90, 0x0a, 0x48, 0xee, 0x00, 0x0a, 0xc4, 0xed, + 0x90, 0x0a, 0x03, 0x21, 0xf8, 0x7a, 0x00, 0xf0, 0x0c, 0xf8, 0xf8, 0x72, + 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf0, 0x84, 0x0c, 0x68, 0x05, 0x68, + 0x97, 0xf8, 0x12, 0xa0, 0x01, 0x20, 0x00, 0x21, 0x70, 0x47, 0x40, 0x1c, + 0xb0, 0xfb, 0xf1, 0xf1, 0x01, 0xeb, 0x41, 0x01, 0x40, 0x1a, 0x70, 0x47, + 0x49, 0x08, 0x4f, 0xea, 0x30, 0x00, 0x20, 0x18, 0x69, 0x41, 0x4f, 0xf4, + 0x80, 0x72, 0x00, 0x23, 0x0c, 0xf0, 0xc2, 0xbc, 0x03, 0xeb, 0x82, 0x04, + 0x60, 0xee, 0x08, 0x8a, 0x2c, 0xf0, 0xd2, 0xbd, 0x52, 0x78, 0x00, 0xee, + 0x90, 0x2a, 0xf8, 0xee, 0x60, 0x0a, 0x20, 0xee, 0x80, 0x0a, 0x70, 0x47, + 0x24, 0x1a, 0x8d, 0x41, 0x01, 0x20, 0x00, 0x21, 0x52, 0x46, 0x29, 0xf0, + 0xef, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x48, 0x46, 0x00, 0x00, 0x48, 0x46, + 0x00, 0xa0, 0x0c, 0x46, 0x00, 0xa0, 0x0c, 0x46, 0x00, 0x60, 0xd1, 0x45, + 0x00, 0x60, 0xd1, 0x45, 0x38, 0xb5, 0x04, 0x46, 0x20, 0x6a, 0x41, 0x6a, + 0xca, 0x02, 0x12, 0xd5, 0x00, 0x7b, 0x01, 0x28, 0x0f, 0xd1, 0xe3, 0x69, + 0x1a, 0x7f, 0x01, 0x21, 0x00, 0xf0, 0x58, 0xf8, 0x00, 0x25, 0xea, 0xb2, + 0x01, 0x21, 0x00, 0xf0, 0x50, 0xf8, 0x00, 0xf0, 0x4a, 0xf8, 0xf8, 0xd3, + 0x20, 0x6a, 0x00, 0x21, 0x01, 0x73, 0x20, 0x6a, 0x41, 0x6a, 0x8a, 0x02, + 0x12, 0xd5, 0x40, 0x7b, 0x01, 0x28, 0x0f, 0xd1, 0xe0, 0x69, 0x42, 0x7f, + 0x02, 0x21, 0x00, 0xf0, 0x41, 0xf8, 0x00, 0x25, 0xea, 0xb2, 0x02, 0x21, + 0x00, 0xf0, 0x39, 0xf8, 0x00, 0xf0, 0x33, 0xf8, 0xf8, 0xd3, 0x20, 0x6a, + 0x00, 0x21, 0x41, 0x73, 0x20, 0x6a, 0x41, 0x6a, 0x4a, 0x02, 0x12, 0xd5, + 0x80, 0x7b, 0x01, 0x28, 0x0f, 0xd1, 0xe0, 0x69, 0x82, 0x7f, 0x03, 0x21, + 0x00, 0xf0, 0x2a, 0xf8, 0x00, 0x25, 0xea, 0xb2, 0x03, 0x21, 0x00, 0xf0, + 0x22, 0xf8, 0x00, 0xf0, 0x1c, 0xf8, 0xf8, 0xd3, 0x20, 0x6a, 0x00, 0x21, + 0x81, 0x73, 0x20, 0x6a, 0x41, 0x6a, 0x0a, 0x02, 0x12, 0xd5, 0xc0, 0x7b, + 0x01, 0x28, 0x0f, 0xd1, 0xe0, 0x69, 0xc2, 0x7f, 0x04, 0x21, 0x00, 0xf0, + 0x13, 0xf8, 0x00, 0x25, 0xea, 0xb2, 0x04, 0x21, 0x00, 0xf0, 0x0b, 0xf8, + 0x00, 0xf0, 0x05, 0xf8, 0xf8, 0xd3, 0x20, 0x6a, 0x00, 0x21, 0xc1, 0x73, + 0x31, 0xbd, 0x6d, 0x1c, 0xe8, 0xb2, 0x08, 0x28, 0x70, 0x47, 0x20, 0x46, + 0xfe, 0xf7, 0x28, 0xbc, 0x20, 0x46, 0xfe, 0xf7, 0x17, 0xbd, 0x10, 0xb5, + 0x04, 0x46, 0xe0, 0x78, 0xc1, 0x07, 0x7d, 0xd5, 0x20, 0x6a, 0x10, 0xf8, + 0x17, 0x1f, 0xca, 0x07, 0x1b, 0xd5, 0x21, 0x69, 0x18, 0x31, 0x09, 0x78, + 0x40, 0x7d, 0xe2, 0x69, 0x01, 0x28, 0x01, 0xf0, 0x3f, 0x01, 0x0b, 0xd1, + 0x92, 0xf9, 0x21, 0x00, 0x81, 0x42, 0xb8, 0xbf, 0x49, 0x1c, 0x05, 0xdb, + 0x88, 0x42, 0x03, 0xda, 0x48, 0x1e, 0x82, 0xf8, 0x21, 0x00, 0x01, 0xe0, + 0x82, 0xf8, 0x21, 0x10, 0x20, 0x6a, 0x90, 0xf8, 0x2c, 0x10, 0x01, 0x29, + 0x03, 0xd0, 0x20, 0x6a, 0x01, 0x7a, 0x01, 0x29, 0x1a, 0xd1, 0xa0, 0x69, + 0xe3, 0x69, 0x90, 0xf9, 0x71, 0x20, 0x90, 0xf9, 0x70, 0x10, 0x03, 0xf1, + 0x21, 0x00, 0xfd, 0xf7, 0xac, 0xfe, 0x21, 0x6a, 0x4a, 0x68, 0x42, 0xea, + 0x00, 0x12, 0x4a, 0x60, 0xe0, 0x69, 0x90, 0xf8, 0x21, 0x10, 0x20, 0x69, + 0x01, 0xf0, 0x3f, 0x01, 0x00, 0xf8, 0x18, 0x1f, 0x00, 0x21, 0x20, 0x6a, + 0x80, 0xf8, 0x2c, 0x10, 0x20, 0x6a, 0x00, 0xf1, 0x17, 0x01, 0x0a, 0x78, + 0x12, 0xf0, 0x0e, 0x0f, 0x18, 0xd0, 0x20, 0x69, 0x1c, 0x30, 0x00, 0x78, + 0x89, 0x7d, 0xe2, 0x69, 0x01, 0x29, 0x00, 0xf0, 0x3f, 0x00, 0x08, 0xd1, + 0x92, 0xf9, 0x22, 0x10, 0x88, 0x42, 0xb8, 0xbf, 0x40, 0x1c, 0x02, 0xdb, + 0x81, 0x42, 0xb8, 0xbf, 0x40, 0x1e, 0x82, 0xf8, 0x22, 0x00, 0x20, 0x6a, + 0x90, 0xf8, 0x2d, 0x10, 0x01, 0x29, 0x03, 0xd0, 0x20, 0x6a, 0x01, 0x7a, + 0x01, 0x29, 0x19, 0xd1, 0xa0, 0x69, 0x90, 0xf9, 0x71, 0x20, 0x90, 0xf9, + 0x70, 0x10, 0xe0, 0x69, 0x22, 0x30, 0xfd, 0xf7, 0x6e, 0xfe, 0x21, 0x6a, + 0x4a, 0x68, 0x42, 0xea, 0x40, 0x12, 0x4a, 0x60, 0xe0, 0x69, 0x90, 0xf8, + 0x22, 0x10, 0x20, 0x69, 0x01, 0xf0, 0x3f, 0x01, 0x00, 0xf8, 0x1c, 0x1f, + 0x00, 0x21, 0x20, 0x6a, 0x80, 0xf8, 0x2d, 0x10, 0x10, 0xbd, 0x00, 0x00, + 0x70, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x05, 0x46, 0x82, 0xb0, 0x28, 0x6a, + 0xdf, 0xf8, 0x90, 0x2a, 0x41, 0x6a, 0x11, 0x42, 0x03, 0xd1, 0x00, 0x7a, + 0x01, 0x28, 0x40, 0xf0, 0x98, 0x81, 0xe9, 0x69, 0xf6, 0xee, 0x00, 0x0a, + 0xb0, 0xee, 0x00, 0x0a, 0x08, 0x1d, 0xfd, 0xf7, 0x2f, 0xfe, 0x29, 0x6a, + 0x0a, 0x68, 0x42, 0xea, 0x00, 0x72, 0x00, 0xf0, 0xec, 0xf9, 0x08, 0x30, + 0xfd, 0xf7, 0x26, 0xfe, 0x29, 0x6a, 0x0a, 0x68, 0x42, 0xea, 0x40, 0x72, + 0x00, 0xf0, 0xe3, 0xf9, 0x0c, 0x30, 0xfd, 0xf7, 0x1d, 0xfe, 0x29, 0x6a, + 0x0a, 0x68, 0x42, 0xea, 0x80, 0x72, 0x00, 0xf0, 0xda, 0xf9, 0x10, 0x30, + 0xfd, 0xf7, 0x14, 0xfe, 0x29, 0x6a, 0x0a, 0x68, 0x42, 0xea, 0xc0, 0x72, + 0x0a, 0x60, 0x08, 0x24, 0x9f, 0xed, 0xb9, 0x8a, 0xe9, 0x69, 0x9f, 0xed, + 0xb9, 0x0a, 0x00, 0x20, 0x05, 0xe0, 0x00, 0xf0, 0x91, 0xf9, 0xd2, 0xed, + 0x4a, 0x0a, 0x30, 0xee, 0x20, 0x0a, 0x00, 0xf0, 0x87, 0xf9, 0xf6, 0xdb, + 0x60, 0xb2, 0x00, 0xee, 0x90, 0x0a, 0xf8, 0xee, 0xe0, 0x0a, 0xb9, 0xee, + 0x00, 0x1a, 0x70, 0xee, 0x81, 0x8a, 0xdf, 0xed, 0xca, 0x0a, 0x08, 0xee, + 0xa0, 0x0a, 0xd1, 0xed, 0x00, 0x1a, 0x20, 0xee, 0x21, 0x0a, 0x20, 0xee, + 0x08, 0x0a, 0x8d, 0xed, 0x00, 0x0a, 0xdf, 0xed, 0xc5, 0x0a, 0x9f, 0xed, + 0xc5, 0x0a, 0x00, 0xf0, 0xcd, 0xfc, 0x29, 0x6a, 0x0a, 0x68, 0x42, 0xea, + 0x00, 0x12, 0x00, 0xf0, 0x9b, 0xf9, 0x00, 0xf2, 0xf4, 0x40, 0x00, 0xf0, + 0x6f, 0xf9, 0x05, 0xe0, 0x00, 0xf0, 0x62, 0xf9, 0xd2, 0xed, 0x52, 0x0a, + 0x30, 0xee, 0x20, 0x0a, 0x00, 0xf0, 0x58, 0xf9, 0xf6, 0xdb, 0x9f, 0xed, + 0xba, 0x1a, 0x08, 0xee, 0x81, 0x0a, 0xd1, 0xed, 0x01, 0x0a, 0xd1, 0xed, + 0x00, 0x1a, 0x20, 0xee, 0x20, 0x0a, 0x60, 0xee, 0x21, 0x1a, 0x61, 0xee, + 0x88, 0x1a, 0xcd, 0xed, 0x00, 0x1a, 0xdf, 0xed, 0xb3, 0x0a, 0x9f, 0xed, + 0xb3, 0x0a, 0x00, 0xf0, 0xa3, 0xfc, 0x29, 0x6a, 0x0a, 0x68, 0x42, 0xea, + 0x40, 0x12, 0x00, 0xf0, 0x71, 0xf9, 0x00, 0xf2, 0xfc, 0x40, 0x00, 0xf0, + 0x45, 0xf9, 0x05, 0xe0, 0x00, 0xf0, 0x38, 0xf9, 0xd2, 0xed, 0x5a, 0x0a, + 0x30, 0xee, 0x20, 0x0a, 0x00, 0xf0, 0x2e, 0xf9, 0xf6, 0xdb, 0x9f, 0xed, + 0xa8, 0x1a, 0x08, 0xee, 0x81, 0x0a, 0xd1, 0xed, 0x02, 0x0a, 0x91, 0xed, + 0x01, 0x1a, 0xd1, 0xed, 0x00, 0x1a, 0x20, 0xee, 0x20, 0x0a, 0x20, 0xee, + 0x01, 0x1a, 0x61, 0xee, 0x21, 0x1a, 0x61, 0xee, 0x88, 0x1a, 0xcd, 0xed, + 0x00, 0x1a, 0xdf, 0xed, 0x9f, 0x0a, 0x9f, 0xed, 0x9f, 0x0a, 0x00, 0xf0, + 0x75, 0xfc, 0x29, 0x6a, 0x0a, 0x68, 0x42, 0xea, 0x80, 0x12, 0x00, 0xf0, + 0x43, 0xf9, 0x00, 0xf2, 0x04, 0x50, 0x00, 0xf0, 0x17, 0xf9, 0x05, 0xe0, + 0x00, 0xf0, 0x0a, 0xf9, 0xd2, 0xed, 0x62, 0x0a, 0x30, 0xee, 0x20, 0x0a, + 0x00, 0xf0, 0x00, 0xf9, 0xf6, 0xdb, 0xb2, 0xee, 0x00, 0x1a, 0x08, 0xee, + 0x81, 0x0a, 0xd1, 0xed, 0x03, 0x0a, 0x91, 0xed, 0x02, 0x1a, 0x20, 0xee, + 0x20, 0x0a, 0x20, 0xee, 0x01, 0x1a, 0x91, 0xed, 0x01, 0x0a, 0xd1, 0xed, + 0x00, 0x0a, 0x21, 0xee, 0x00, 0x0a, 0x60, 0xee, 0x20, 0x0a, 0x60, 0xee, + 0x88, 0x0a, 0xcd, 0xed, 0x00, 0x0a, 0xdf, 0xed, 0x88, 0x0a, 0x9f, 0xed, + 0x88, 0x0a, 0x00, 0xf0, 0x43, 0xfc, 0x29, 0x6a, 0x0a, 0x68, 0x42, 0xea, + 0xc0, 0x12, 0x00, 0xf0, 0xe3, 0xf8, 0x00, 0xf2, 0x0c, 0x51, 0x62, 0xb2, + 0x00, 0xf0, 0xbd, 0xf8, 0x7f, 0xf5, 0x40, 0xaf, 0x00, 0xf2, 0xf4, 0x42, + 0x00, 0x23, 0x00, 0xf2, 0xfc, 0x46, 0x13, 0x60, 0x00, 0xf2, 0x04, 0x50, + 0x33, 0x60, 0x03, 0x60, 0x0b, 0x60, 0x0f, 0x24, 0x61, 0xb2, 0xe8, 0x69, + 0x00, 0xee, 0x10, 0x1a, 0xb8, 0xee, 0xc0, 0x0a, 0xfa, 0xee, 0x00, 0x0a, + 0x70, 0xee, 0x20, 0x0a, 0xb6, 0xee, 0x00, 0x1a, 0x30, 0xee, 0x81, 0x1a, + 0x90, 0xed, 0x04, 0x0a, 0xd0, 0xed, 0x03, 0x0a, 0x21, 0xee, 0x00, 0x0a, + 0x60, 0xee, 0x20, 0x0a, 0x90, 0xed, 0x02, 0x0a, 0x90, 0xed, 0x00, 0x1a, + 0x00, 0xf0, 0x99, 0xf8, 0xdf, 0xed, 0x6c, 0x0a, 0x9f, 0xed, 0x6c, 0x0a, + 0x00, 0xf0, 0x08, 0xfc, 0x29, 0x6a, 0x0a, 0x68, 0x42, 0xea, 0x00, 0x22, + 0x00, 0xf0, 0xa8, 0xf8, 0x00, 0xf2, 0x14, 0x50, 0x61, 0xb2, 0xbd, 0xee, + 0xc0, 0x0a, 0x00, 0x29, 0x80, 0xed, 0x00, 0x0a, 0xce, 0xd5, 0x00, 0x22, + 0x02, 0x60, 0x01, 0x26, 0x9f, 0xed, 0x62, 0x8a, 0xe8, 0x69, 0xd0, 0xed, + 0x00, 0x0a, 0x74, 0xb2, 0x00, 0xeb, 0x84, 0x01, 0x68, 0x46, 0x91, 0xed, + 0x42, 0x0a, 0x00, 0xf0, 0xb9, 0xfb, 0xfd, 0xf7, 0xfd, 0xfc, 0x29, 0x6a, + 0x0a, 0x68, 0x10, 0x43, 0x08, 0x60, 0x76, 0x1e, 0xa8, 0x68, 0x9d, 0xed, + 0x00, 0x0a, 0x00, 0xf2, 0x9c, 0x50, 0x00, 0xf0, 0x73, 0xf8, 0xd0, 0xed, + 0x01, 0x0a, 0x00, 0xf0, 0x57, 0xf8, 0x68, 0x46, 0x91, 0xed, 0x44, 0x0a, + 0x00, 0xf0, 0xae, 0xfb, 0xfd, 0xf7, 0xe6, 0xfc, 0x29, 0x6a, 0x0a, 0x68, + 0x42, 0xea, 0x40, 0x02, 0x00, 0xf0, 0x9e, 0xf8, 0x00, 0xf2, 0xa4, 0x50, + 0x00, 0xf0, 0x5e, 0xf8, 0xd0, 0xed, 0x02, 0x0a, 0x00, 0xf0, 0x42, 0xf8, + 0x91, 0xed, 0x46, 0x0a, 0x00, 0xf0, 0xae, 0xfb, 0x29, 0x6a, 0x0a, 0x68, + 0x42, 0xea, 0x80, 0x02, 0x00, 0xf0, 0x8c, 0xf8, 0x00, 0xf2, 0xac, 0x50, + 0x00, 0xf0, 0x4c, 0xf8, 0xd0, 0xed, 0x03, 0x0a, 0x00, 0xf0, 0x30, 0xf8, + 0x91, 0xed, 0x48, 0x0a, 0x60, 0xee, 0x20, 0x0a, 0x90, 0xed, 0x02, 0x0a, + 0x00, 0xf0, 0x33, 0xf8, 0xdf, 0xed, 0x3c, 0x0a, 0x9f, 0xed, 0xd3, 0x0a, + 0x00, 0xf0, 0xa2, 0xfb, 0x29, 0x6a, 0x0a, 0x68, 0x42, 0xea, 0xc0, 0x02, + 0x0a, 0x60, 0x72, 0xb2, 0xa8, 0x68, 0x9d, 0xed, 0x00, 0x0a, 0x00, 0xf2, + 0xb4, 0x51, 0x00, 0xf0, 0x1a, 0xf8, 0x9f, 0xd5, 0x00, 0xf2, 0x9c, 0x52, + 0x00, 0x23, 0x00, 0xf2, 0xa4, 0x55, 0x13, 0x60, 0x00, 0xf2, 0xac, 0x50, + 0x2b, 0x60, 0x03, 0x60, 0x0b, 0x60, 0x02, 0xb0, 0xbd, 0xec, 0x02, 0x8b, + 0x70, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, 0x00, 0x00, + 0x90, 0xed, 0x00, 0x1a, 0x00, 0xeb, 0x84, 0x01, 0x70, 0x47, 0xbd, 0xee, + 0xc0, 0x0a, 0x00, 0x2a, 0x81, 0xed, 0x00, 0x0a, 0x70, 0x47, 0x20, 0xee, + 0x80, 0x0a, 0xd0, 0xed, 0x01, 0x0a, 0x60, 0xee, 0x20, 0x0a, 0x20, 0xee, + 0x81, 0x1a, 0x21, 0xee, 0x08, 0x1a, 0x8d, 0xed, 0x00, 0x1a, 0x70, 0x47, + 0xbd, 0xee, 0xc0, 0x0a, 0x80, 0xed, 0x00, 0x0a, 0xe8, 0x69, 0x70, 0x47, + 0x42, 0xb2, 0x63, 0xb2, 0x9a, 0x42, 0x70, 0x47, 0x01, 0xeb, 0x82, 0x02, + 0x40, 0x1c, 0x70, 0x47, 0x0a, 0x60, 0x64, 0x1e, 0xa8, 0x68, 0x9d, 0xed, + 0x00, 0x0a, 0x70, 0x47, 0xbd, 0xee, 0xc0, 0x0a, 0x80, 0xed, 0x00, 0x0a, + 0x9f, 0xed, 0xa9, 0x0a, 0xe9, 0x69, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x44, 0xf0, 0xff, 0x7f, 0xcd, 0xf0, 0xff, 0x7f, 0x4d, + 0x00, 0x00, 0x00, 0x43, 0xc0, 0xff, 0x7f, 0xcc, 0xc0, 0xff, 0x7f, 0x4c, + 0x00, 0x00, 0x00, 0x42, 0x00, 0xff, 0x7f, 0xcb, 0x00, 0xff, 0x7f, 0x4b, + 0x00, 0xfc, 0x7f, 0xca, 0x00, 0xfc, 0x7f, 0x4a, 0x00, 0xf0, 0x7f, 0xc9, + 0x00, 0xf0, 0x7f, 0x49, 0x00, 0x00, 0x80, 0xc7, 0x00, 0xe0, 0xff, 0xc8, + 0x0a, 0x60, 0xa8, 0x68, 0x9d, 0xed, 0x00, 0x0a, 0x70, 0x47, 0x0a, 0x60, + 0xf6, 0xee, 0x00, 0x0a, 0xe8, 0x69, 0xb0, 0xee, 0x00, 0x0a, 0x70, 0x47, + 0x2d, 0xe9, 0xf8, 0x43, 0x2d, 0xed, 0x08, 0x8b, 0xb8, 0xb0, 0x05, 0x46, + 0x07, 0xa8, 0x44, 0x21, 0x0b, 0xf0, 0x52, 0xfc, 0x00, 0x24, 0x9f, 0xed, + 0x8d, 0x8a, 0xdf, 0xed, 0x8d, 0x8a, 0x9f, 0xed, 0x8d, 0x9a, 0xdf, 0xed, + 0x8d, 0x9a, 0x9f, 0xed, 0x8d, 0xaa, 0xdf, 0xed, 0x8d, 0xaa, 0x9f, 0xed, + 0x8d, 0xba, 0x0d, 0xf1, 0x1c, 0x08, 0x0d, 0xf1, 0x60, 0x09, 0x02, 0xae, + 0x28, 0x6a, 0x41, 0x6a, 0x04, 0xf1, 0x0a, 0x02, 0xd1, 0x40, 0xcb, 0x07, + 0x03, 0xd4, 0x00, 0x7a, 0x01, 0x28, 0x40, 0xf0, 0xef, 0x80, 0xa8, 0x69, + 0xc8, 0x30, 0x2c, 0xb9, 0x41, 0x7a, 0x00, 0x91, 0x03, 0x7a, 0x42, 0x88, + 0x01, 0x88, 0x04, 0xe0, 0xc1, 0x7a, 0x00, 0x91, 0x83, 0x7a, 0xc2, 0x88, + 0x81, 0x88, 0x07, 0xa8, 0xfd, 0xf7, 0xda, 0xfc, 0xe8, 0x69, 0x00, 0xeb, + 0x84, 0x01, 0x01, 0xf1, 0xe0, 0x00, 0x0f, 0x27, 0x02, 0x68, 0x02, 0x92, + 0x81, 0x68, 0x71, 0x60, 0x02, 0x69, 0xb2, 0x60, 0x81, 0x69, 0xf1, 0x60, + 0x29, 0xa9, 0x00, 0x6a, 0x30, 0x61, 0x02, 0xa8, 0xfd, 0xf7, 0x2a, 0xfc, + 0x28, 0xaa, 0x98, 0xed, 0x10, 0x0a, 0x00, 0xf0, 0xf5, 0xf8, 0x08, 0xeb, + 0x87, 0x01, 0x18, 0xa8, 0x00, 0xeb, 0x87, 0x02, 0x91, 0xed, 0x00, 0x0a, + 0x00, 0xf0, 0xec, 0xf8, 0x08, 0xeb, 0x87, 0x00, 0x90, 0xed, 0x00, 0x0a, + 0x00, 0xf0, 0xd2, 0xf8, 0x74, 0xb9, 0xdf, 0xed, 0xb4, 0x0a, 0x9f, 0xed, + 0xb4, 0x0a, 0x00, 0xf0, 0xe7, 0xf8, 0x29, 0x6a, 0x0a, 0x68, 0x42, 0xea, + 0xc0, 0x32, 0x00, 0xf0, 0xea, 0xf8, 0x00, 0xf2, 0x6c, 0x50, 0x0d, 0xe0, + 0xdf, 0xed, 0xae, 0x0a, 0x9f, 0xed, 0xae, 0x0a, 0x00, 0xf0, 0xd8, 0xf8, + 0x29, 0x6a, 0x0a, 0x68, 0x42, 0xea, 0x80, 0x42, 0x00, 0xf0, 0xdb, 0xf8, + 0x00, 0xf2, 0x84, 0x50, 0x7f, 0x1e, 0x00, 0x2f, 0x80, 0xed, 0x00, 0x0a, + 0xcd, 0xdc, 0x18, 0xaa, 0x9d, 0xed, 0x07, 0x0a, 0x00, 0xf0, 0xbe, 0xf8, + 0x0f, 0x27, 0x19, 0xa8, 0x00, 0xeb, 0x87, 0x01, 0x09, 0xeb, 0x87, 0x02, + 0x08, 0xa8, 0x91, 0xed, 0x00, 0x0a, 0xd2, 0xed, 0x00, 0x0a, 0x00, 0xeb, + 0x87, 0x01, 0x08, 0xeb, 0x87, 0x02, 0x70, 0xee, 0x60, 0x0a, 0x91, 0xed, + 0x00, 0x0a, 0x92, 0xed, 0x00, 0x1a, 0x00, 0xf0, 0x98, 0xf8, 0x04, 0xd1, + 0xfd, 0xf7, 0x92, 0xfb, 0x00, 0xf0, 0xd3, 0xf8, 0x03, 0xe0, 0xfd, 0xf7, + 0x8d, 0xfb, 0x00, 0xf0, 0xc1, 0xf8, 0x09, 0xeb, 0x87, 0x01, 0x80, 0xed, + 0x00, 0x0a, 0x91, 0xed, 0x00, 0x0a, 0x00, 0xf0, 0x81, 0xf8, 0x44, 0xb9, + 0x00, 0xf0, 0x96, 0xf8, 0x00, 0xf0, 0xae, 0xf8, 0x00, 0xf0, 0x99, 0xf8, + 0x00, 0xf2, 0x74, 0x50, 0x0b, 0xe0, 0xf0, 0xee, 0x68, 0x0a, 0xb0, 0xee, + 0x48, 0x0a, 0x00, 0xf0, 0x8d, 0xf8, 0x00, 0xf0, 0x9b, 0xf8, 0x00, 0xf0, + 0x8c, 0xf8, 0x00, 0xf2, 0x8c, 0x50, 0x7f, 0x1e, 0x00, 0x2f, 0x80, 0xed, + 0x00, 0x0a, 0xbc, 0xdc, 0x99, 0xed, 0x01, 0x0a, 0xdd, 0xed, 0x18, 0x0a, + 0x9d, 0xed, 0x07, 0x1a, 0x70, 0xee, 0x60, 0x0a, 0x98, 0xed, 0x01, 0x0a, + 0x00, 0xf0, 0x5f, 0xf8, 0x04, 0xd1, 0xfd, 0xf7, 0x59, 0xfb, 0x00, 0xf0, + 0x9a, 0xf8, 0x03, 0xe0, 0xfd, 0xf7, 0x54, 0xfb, 0x00, 0xf0, 0x88, 0xf8, + 0x80, 0xed, 0x00, 0x0a, 0x99, 0xed, 0x01, 0x0a, 0x00, 0xf0, 0x4a, 0xf8, + 0x9c, 0xb9, 0x00, 0xf0, 0x5f, 0xf8, 0x00, 0xf0, 0x77, 0xf8, 0x00, 0x22, + 0xa8, 0x68, 0x9d, 0xed, 0x01, 0x0a, 0x00, 0xf2, 0x74, 0x51, 0xbd, 0xee, + 0xc0, 0x0a, 0x00, 0xf2, 0x6c, 0x53, 0x81, 0xed, 0x00, 0x0a, 0x1a, 0x60, + 0x00, 0xf2, 0x7c, 0x50, 0x16, 0xe0, 0xf0, 0xee, 0x68, 0x0a, 0xb0, 0xee, + 0x48, 0x0a, 0x00, 0xf0, 0x4b, 0xf8, 0x00, 0xf0, 0x59, 0xf8, 0x00, 0x22, + 0xa8, 0x68, 0x9d, 0xed, 0x01, 0x0a, 0x00, 0xf2, 0x8c, 0x51, 0xbd, 0xee, + 0xc0, 0x0a, 0x00, 0xf2, 0x84, 0x53, 0x81, 0xed, 0x00, 0x0a, 0x1a, 0x60, + 0x00, 0xf2, 0x94, 0x50, 0x02, 0x60, 0x0a, 0x60, 0x64, 0x1c, 0x01, 0x2c, + 0x7f, 0xf6, 0x02, 0xaf, 0x38, 0xb0, 0xbd, 0xec, 0x08, 0x8b, 0xbd, 0xe8, + 0xf1, 0x83, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x48, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xff, 0x49, 0x00, 0x80, 0xff, 0xc9, 0x00, 0xe0, 0xff, 0x4a, + 0x00, 0xe0, 0xff, 0xca, 0x00, 0x00, 0x7c, 0x47, 0x00, 0x00, 0x7c, 0xc7, + 0x00, 0x00, 0x80, 0x47, 0x20, 0xee, 0x0b, 0x0a, 0x8d, 0xed, 0x01, 0x0a, + 0x70, 0x47, 0x30, 0xee, 0x41, 0x1a, 0xc0, 0xee, 0x81, 0x0a, 0x60, 0xee, + 0x8b, 0x0a, 0xcd, 0xed, 0x01, 0x0a, 0x00, 0x2c, 0xf0, 0xee, 0x6a, 0x0a, + 0xb0, 0xee, 0x4a, 0x0a, 0x01, 0xa8, 0x70, 0x47, 0x0d, 0x21, 0x29, 0xa8, + 0xfd, 0xf7, 0x18, 0xbb, 0xf0, 0xee, 0x69, 0x0a, 0xb0, 0xee, 0x49, 0x0a, + 0x01, 0xa8, 0xfd, 0xf7, 0xe3, 0xba, 0xa8, 0x68, 0x9d, 0xed, 0x01, 0x0a, + 0xbd, 0xee, 0xc0, 0x0a, 0x70, 0x47, 0x0a, 0x60, 0xa8, 0x68, 0x9d, 0xed, + 0x01, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, 0x70, 0x47, 0x29, 0x6a, 0x0a, 0x68, + 0x42, 0xea, 0x00, 0x52, 0x0a, 0x60, 0x70, 0x47, 0x29, 0x6a, 0x0a, 0x68, + 0x42, 0xea, 0x40, 0x42, 0x0a, 0x60, 0x70, 0x47, 0x29, 0x6a, 0x0a, 0x68, + 0x42, 0xea, 0xc0, 0x42, 0x0a, 0x60, 0xa8, 0x68, 0x9d, 0xed, 0x01, 0x0a, + 0xbd, 0xee, 0xc0, 0x0a, 0x00, 0xf2, 0x94, 0x50, 0x70, 0x47, 0x29, 0x6a, + 0x0a, 0x68, 0x42, 0xea, 0x00, 0x42, 0x0a, 0x60, 0xa8, 0x68, 0x9d, 0xed, + 0x01, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, 0x00, 0xf2, 0x7c, 0x50, 0x70, 0x47, + 0x10, 0xb5, 0x04, 0x46, 0x2d, 0xed, 0x02, 0x8b, 0x20, 0x6a, 0x90, 0xf8, + 0x24, 0x10, 0xca, 0x06, 0x9f, 0xed, 0xbd, 0x8a, 0x02, 0xd4, 0x00, 0x7a, + 0x01, 0x28, 0x16, 0xd1, 0xe1, 0x69, 0xdf, 0xed, 0xbb, 0x0a, 0x9f, 0xed, + 0xbb, 0x0a, 0x01, 0xf1, 0x14, 0x00, 0xfd, 0xf7, 0x99, 0xfa, 0x21, 0x6a, + 0x0a, 0x68, 0x42, 0xea, 0x40, 0x22, 0x0a, 0x60, 0x00, 0x22, 0xe1, 0x69, + 0xa0, 0x68, 0x91, 0xed, 0x05, 0x0a, 0x00, 0xf2, 0x54, 0x50, 0x00, 0xf0, + 0x29, 0xf8, 0x20, 0x6a, 0x90, 0xf8, 0x24, 0x10, 0x8a, 0x06, 0x02, 0xd4, + 0x00, 0x7a, 0x01, 0x28, 0x15, 0xd1, 0xe0, 0x69, 0xdf, 0xed, 0xb7, 0x0a, + 0x9f, 0xed, 0xb7, 0x0a, 0x18, 0x30, 0xfd, 0xf7, 0x7b, 0xfa, 0x21, 0x6a, + 0x0a, 0x68, 0x42, 0xea, 0x80, 0x22, 0x0a, 0x60, 0x00, 0x22, 0xe1, 0x69, + 0xa0, 0x68, 0x91, 0xed, 0x06, 0x0a, 0x00, 0xf2, 0x5c, 0x50, 0x00, 0xf0, + 0x0b, 0xf8, 0xbd, 0xec, 0x02, 0x8b, 0x10, 0xbd, 0x00, 0xc0, 0x7f, 0xcc, + 0x00, 0xc0, 0x7f, 0x4c, 0x00, 0x00, 0x7f, 0xcb, 0x00, 0x00, 0x7f, 0x4b, + 0x20, 0xee, 0x08, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, 0x80, 0xed, 0x00, 0x0a, + 0x02, 0x60, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x43, 0x2d, 0xed, 0x04, 0x8b, + 0x04, 0x46, 0x82, 0xb0, 0x20, 0x6a, 0x41, 0x6a, 0x0a, 0x06, 0x05, 0xd4, + 0x03, 0x7a, 0x01, 0x2b, 0x04, 0xd1, 0x01, 0x22, 0x01, 0x27, 0x0c, 0xe0, + 0x01, 0x22, 0x00, 0xe0, 0x00, 0x22, 0x40, 0xf2, 0x01, 0x13, 0x19, 0x42, + 0xf6, 0xd1, 0x03, 0x7a, 0x01, 0x2b, 0x08, 0xbf, 0x01, 0x27, 0x07, 0xd0, + 0x00, 0x27, 0x40, 0xf2, 0x03, 0x23, 0x19, 0x42, 0x02, 0xd1, 0x00, 0x7a, + 0x01, 0x28, 0x01, 0xd1, 0x01, 0x26, 0x00, 0xe0, 0x00, 0x26, 0x00, 0x2a, + 0x9f, 0xed, 0x82, 0x8a, 0x4f, 0xf0, 0x01, 0x08, 0xf7, 0xee, 0x00, 0x8a, + 0xbf, 0xee, 0x00, 0x9a, 0x44, 0xd0, 0x07, 0x25, 0x00, 0x20, 0x00, 0x90, + 0x81, 0x46, 0xe1, 0x69, 0x01, 0xeb, 0x89, 0x02, 0xdf, 0xed, 0x89, 0x0a, + 0x9f, 0xed, 0x89, 0x0a, 0x02, 0xf5, 0x0a, 0x70, 0xfd, 0xf7, 0x1a, 0xfa, + 0x00, 0xf0, 0x30, 0xf9, 0x08, 0xfa, 0x09, 0xf1, 0xe0, 0x69, 0x9d, 0xed, + 0x00, 0x1a, 0xeb, 0xb2, 0x0b, 0x42, 0x00, 0xeb, 0x89, 0x01, 0x14, 0xbf, + 0xb0, 0xee, 0x49, 0x0a, 0xb0, 0xee, 0x68, 0x0a, 0xd1, 0xed, 0x8a, 0x0a, + 0x09, 0xf1, 0x01, 0x09, 0x00, 0xee, 0x20, 0x1a, 0xb9, 0xf1, 0x03, 0x0f, + 0x8d, 0xed, 0x00, 0x1a, 0xd9, 0xd3, 0x9d, 0xed, 0x00, 0x0a, 0xd0, 0xed, + 0x00, 0x0a, 0x00, 0xf0, 0xb3, 0xf8, 0x00, 0xf0, 0xe1, 0xf8, 0x00, 0xf0, + 0x0d, 0xf9, 0x6d, 0x1e, 0xa0, 0x68, 0x9d, 0xed, 0x00, 0x0a, 0x00, 0xf2, + 0x2c, 0x52, 0x00, 0xf0, 0xa1, 0xf8, 0xc3, 0xd5, 0x00, 0xf0, 0x99, 0xf8, + 0x49, 0x7a, 0x01, 0xf0, 0x07, 0x01, 0x41, 0xf0, 0x04, 0x01, 0x01, 0x60, + 0x00, 0x2f, 0x45, 0xd0, 0x07, 0x27, 0x00, 0x20, 0x00, 0x90, 0x00, 0x25, + 0xe0, 0x69, 0x00, 0xeb, 0x85, 0x01, 0xdf, 0xed, 0x68, 0x0a, 0x9f, 0xed, + 0x68, 0x0a, 0x01, 0xf5, 0x0d, 0x70, 0xfd, 0xf7, 0xd3, 0xf9, 0x00, 0xf0, + 0xe3, 0xf8, 0x08, 0xfa, 0x05, 0xf1, 0xe0, 0x69, 0x9d, 0xed, 0x00, 0x1a, + 0xfb, 0xb2, 0x0b, 0x42, 0x00, 0xeb, 0x85, 0x01, 0x14, 0xbf, 0xb0, 0xee, + 0x49, 0x0a, 0xb0, 0xee, 0x68, 0x0a, 0xd1, 0xed, 0x8d, 0x0a, 0x6d, 0x1c, + 0x00, 0xee, 0x20, 0x1a, 0x03, 0x2d, 0x8d, 0xed, 0x00, 0x1a, 0xdb, 0xd3, + 0x9d, 0xed, 0x00, 0x0a, 0xd0, 0xed, 0x01, 0x0a, 0x90, 0xed, 0x00, 0x1a, + 0x00, 0xf0, 0x78, 0xf8, 0x00, 0xf0, 0x9a, 0xf8, 0x00, 0xf0, 0xc0, 0xf8, + 0x7f, 0x1e, 0xa0, 0x68, 0x9d, 0xed, 0x00, 0x0a, 0x00, 0xf2, 0x34, 0x52, + 0x00, 0xf0, 0x5a, 0xf8, 0xc3, 0xd5, 0x00, 0xf0, 0x52, 0xf8, 0x89, 0x7a, + 0xc9, 0x00, 0x01, 0xf0, 0x38, 0x01, 0x41, 0xf0, 0x20, 0x01, 0x01, 0x60, + 0x00, 0x2e, 0x43, 0xd0, 0x07, 0x26, 0x00, 0x20, 0x00, 0x90, 0x00, 0x27, + 0xe0, 0x69, 0x00, 0xeb, 0x87, 0x01, 0xdf, 0xed, 0x46, 0x0a, 0x9f, 0xed, + 0x46, 0x0a, 0x01, 0xf5, 0x10, 0x70, 0xfd, 0xf7, 0x8b, 0xf9, 0x00, 0xf0, + 0x95, 0xf8, 0x08, 0xfa, 0x07, 0xf1, 0xe0, 0x69, 0x9d, 0xed, 0x00, 0x1a, + 0xf3, 0xb2, 0x0b, 0x42, 0x00, 0xeb, 0x87, 0x01, 0x14, 0xbf, 0xb0, 0xee, + 0x49, 0x0a, 0xb0, 0xee, 0x68, 0x0a, 0xd1, 0xed, 0x90, 0x0a, 0x7f, 0x1c, + 0x00, 0xee, 0x20, 0x1a, 0x03, 0x2f, 0x8d, 0xed, 0x00, 0x1a, 0xdb, 0xd3, + 0x9d, 0xed, 0x00, 0x0a, 0xd0, 0xed, 0x02, 0x0a, 0x90, 0xed, 0x00, 0x1a, + 0x00, 0xf0, 0x44, 0xf8, 0x00, 0xf0, 0x74, 0xf8, 0x76, 0x1e, 0xa0, 0x68, + 0x9d, 0xed, 0x00, 0x0a, 0x00, 0xf2, 0x3c, 0x52, 0x00, 0xf0, 0x14, 0xf8, + 0xc5, 0xd5, 0x00, 0xf0, 0x0c, 0xf8, 0xc9, 0x7a, 0x89, 0x01, 0x01, 0xf4, + 0xe0, 0x71, 0x41, 0xf4, 0x80, 0x71, 0x01, 0x60, 0x02, 0xb0, 0xbd, 0xec, + 0x04, 0x8b, 0xbd, 0xe8, 0xf1, 0x83, 0x00, 0x23, 0x13, 0x60, 0x00, 0xf2, + 0x0c, 0x40, 0x70, 0x47, 0xbd, 0xee, 0xc0, 0x0a, 0x82, 0xed, 0x00, 0x0a, + 0x70, 0x47, 0x00, 0x00, 0x60, 0xee, 0x20, 0x0a, 0x60, 0xee, 0x88, 0x0a, + 0xcd, 0xed, 0x00, 0x0a, 0xdf, 0xed, 0x1e, 0x0a, 0x9f, 0xed, 0x1e, 0x0a, + 0x70, 0x47, 0x00, 0x00, 0x60, 0xee, 0x20, 0x0a, 0x20, 0xee, 0x81, 0x1a, + 0x21, 0xee, 0x08, 0x1a, 0x8d, 0xed, 0x00, 0x1a, 0xdf, 0xed, 0x19, 0x0a, + 0x9f, 0xed, 0x19, 0x0a, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc7, + 0x00, 0xc0, 0xff, 0xbd, 0x00, 0xc0, 0xff, 0x3d, 0x60, 0xee, 0x20, 0x0a, + 0x90, 0xed, 0x01, 0x0a, 0x20, 0xee, 0x80, 0x0a, 0x20, 0xee, 0x01, 0x1a, + 0x21, 0xee, 0x08, 0x1a, 0x8d, 0xed, 0x00, 0x1a, 0xdf, 0xed, 0x0f, 0x0a, + 0x9f, 0xed, 0x0f, 0x0a, 0x68, 0x46, 0xfd, 0xf7, 0x13, 0xb9, 0x00, 0x00, + 0x00, 0x80, 0xff, 0xbd, 0x00, 0x80, 0xff, 0x3d, 0x80, 0xff, 0xff, 0xc3, + 0x80, 0xff, 0xff, 0x43, 0x00, 0xfe, 0xff, 0xc2, 0x00, 0xfe, 0xff, 0x42, + 0x00, 0xf8, 0xff, 0xc1, 0x00, 0xf8, 0xff, 0x41, 0x80, 0xff, 0xff, 0xcb, + 0x80, 0xff, 0xff, 0x4b, 0x00, 0xfe, 0xff, 0xca, 0x00, 0xfe, 0xff, 0x4a, + 0x00, 0xf8, 0xff, 0xc9, 0x00, 0xf8, 0xff, 0x49, 0x0f, 0xf0, 0x0f, 0x00, + 0x21, 0x6a, 0x0a, 0x68, 0x42, 0xea, 0x80, 0x32, 0x0a, 0x60, 0x70, 0x47, + 0x21, 0x6a, 0x0a, 0x68, 0x42, 0xea, 0x40, 0x32, 0x0a, 0x60, 0x70, 0x47, + 0x21, 0x6a, 0x0a, 0x68, 0x42, 0xea, 0x00, 0x32, 0x0a, 0x60, 0x70, 0x47, + 0x30, 0xb5, 0x40, 0x6a, 0x00, 0xf5, 0xc6, 0x72, 0x36, 0x21, 0x00, 0xf5, + 0xdc, 0x74, 0x11, 0x60, 0x43, 0xf2, 0x33, 0x03, 0x00, 0xf5, 0xda, 0x72, + 0x23, 0x60, 0x0d, 0x21, 0x11, 0x60, 0x00, 0xf5, 0xd4, 0x73, 0x42, 0xf6, + 0x33, 0x51, 0x00, 0xf5, 0xd2, 0x72, 0x19, 0x60, 0x0d, 0x24, 0x00, 0xf5, + 0xd8, 0x75, 0x14, 0x60, 0x00, 0xf5, 0xd6, 0x70, 0x29, 0x60, 0x04, 0x60, + 0x30, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x83, 0x6b, 0xc2, 0x6c, 0x95, 0x7f, + 0x59, 0x1d, 0x8c, 0x7f, 0xa5, 0x42, 0x23, 0xd3, 0x27, 0x1d, 0xbd, 0x42, + 0x20, 0xd2, 0x2c, 0x1b, 0xe4, 0xb2, 0x03, 0x2c, 0x18, 0xd8, 0xdf, 0xe8, + 0x04, 0xf0, 0x02, 0x07, 0x0c, 0x11, 0x24, 0x33, 0x1c, 0x8a, 0x94, 0x83, + 0x1b, 0x68, 0x0d, 0xe0, 0x24, 0x33, 0x5c, 0x8a, 0x94, 0x83, 0x5b, 0x68, + 0x08, 0xe0, 0x24, 0x33, 0x9c, 0x8a, 0x94, 0x83, 0x9b, 0x68, 0x03, 0xe0, + 0x24, 0x33, 0xdc, 0x8a, 0x94, 0x83, 0xdb, 0x68, 0x53, 0x62, 0x06, 0xe0, + 0x00, 0x24, 0x94, 0x83, 0x54, 0x62, 0x02, 0xe0, 0x00, 0x24, 0x54, 0x62, + 0x94, 0x83, 0x09, 0x78, 0xd1, 0x76, 0xbd, 0xe8, 0xb0, 0x40, 0x07, 0xe0, + 0x81, 0x6b, 0x0a, 0x79, 0xc1, 0x6c, 0xca, 0x76, 0x82, 0x6b, 0x91, 0x68, + 0xc2, 0x6c, 0x51, 0x62, 0x2d, 0xe9, 0xf0, 0x47, 0xc1, 0x6c, 0x42, 0x6a, + 0xc9, 0x7e, 0x52, 0xf8, 0x14, 0x3f, 0x23, 0xf4, 0x7f, 0x03, 0x43, 0xea, + 0x01, 0x43, 0x13, 0x60, 0x00, 0x21, 0xc2, 0x6c, 0x51, 0x74, 0x00, 0xeb, + 0x81, 0x02, 0x93, 0x6a, 0x03, 0xf5, 0xca, 0x73, 0x01, 0x22, 0x1c, 0x68, + 0x02, 0xfa, 0x01, 0xf5, 0x24, 0x09, 0x05, 0xf0, 0x0f, 0x05, 0x49, 0x1c, + 0x45, 0xea, 0x04, 0x14, 0x04, 0x29, 0x1c, 0x60, 0xed, 0xdb, 0x9f, 0xed, + 0x8d, 0x0a, 0xc1, 0x6c, 0x4b, 0x6a, 0x9c, 0x00, 0x5d, 0x00, 0x04, 0xf0, + 0x40, 0x04, 0x05, 0xf0, 0x10, 0x05, 0x2c, 0x43, 0x03, 0xf0, 0x04, 0x01, + 0x1e, 0x02, 0x0c, 0x43, 0x06, 0xf4, 0x80, 0x76, 0x5d, 0x02, 0x34, 0x43, + 0x05, 0xf4, 0x80, 0x45, 0x9b, 0x02, 0x2c, 0x43, 0x03, 0xf4, 0x80, 0x33, + 0x23, 0x43, 0x44, 0x6a, 0x82, 0x49, 0x04, 0xf5, 0xc2, 0x74, 0x0b, 0x43, + 0x23, 0x60, 0x81, 0x6b, 0x4b, 0x7c, 0x0c, 0x7c, 0x8d, 0x7c, 0x4e, 0x7d, + 0x0f, 0x7d, 0x91, 0xf8, 0x16, 0xc0, 0x91, 0xf8, 0x0f, 0xe0, 0x91, 0xf8, + 0x0e, 0x80, 0x41, 0x6a, 0x01, 0xf5, 0x6f, 0x79, 0x79, 0x49, 0xd9, 0xf8, + 0x00, 0xa0, 0x4f, 0xea, 0xc8, 0x08, 0x01, 0xea, 0x0a, 0x01, 0x08, 0xf0, + 0x08, 0x08, 0x4f, 0xea, 0x0e, 0x1e, 0x48, 0xea, 0x01, 0x01, 0x0e, 0xf0, + 0x10, 0x0e, 0x4f, 0xea, 0x8c, 0x1c, 0x4e, 0xea, 0x01, 0x01, 0x0c, 0xf0, + 0x40, 0x0c, 0xff, 0x01, 0x4c, 0xea, 0x01, 0x01, 0x07, 0xf0, 0x80, 0x07, + 0x36, 0x02, 0x0f, 0x43, 0x06, 0xf4, 0x80, 0x76, 0xad, 0x02, 0x3e, 0x43, + 0x05, 0xf4, 0x80, 0x65, 0xe4, 0x02, 0x35, 0x43, 0x04, 0xf4, 0x00, 0x64, + 0x1b, 0x03, 0x2c, 0x43, 0x03, 0xf4, 0x80, 0x53, 0x23, 0x43, 0xc9, 0xf8, + 0x00, 0x30, 0x81, 0x6b, 0xb1, 0xf8, 0x5c, 0x30, 0x41, 0x6a, 0x00, 0xee, + 0x90, 0x3a, 0xf8, 0xee, 0x60, 0x0a, 0x60, 0xee, 0x80, 0x0a, 0x01, 0xf5, + 0x8c, 0x71, 0xfd, 0xee, 0xe0, 0x0a, 0xc1, 0xed, 0x00, 0x0a, 0xdf, 0xed, + 0x58, 0x0a, 0x81, 0x6b, 0xb1, 0xf8, 0x5c, 0x30, 0x41, 0x6a, 0x01, 0xee, + 0x10, 0x3a, 0xb8, 0xee, 0x41, 0x1a, 0x21, 0xee, 0x20, 0x1a, 0x01, 0xf5, + 0x8e, 0x71, 0xbd, 0xee, 0xc1, 0x1a, 0x81, 0xed, 0x00, 0x1a, 0x83, 0x6b, + 0xb3, 0xf8, 0x5e, 0x10, 0x43, 0x6a, 0x01, 0xee, 0x10, 0x1a, 0xb8, 0xee, + 0x41, 0x1a, 0x21, 0xee, 0x00, 0x0a, 0x03, 0xf5, 0x94, 0x73, 0xbd, 0xee, + 0xc0, 0x0a, 0x83, 0xed, 0x00, 0x0a, 0x81, 0x6b, 0xb1, 0xf8, 0x5e, 0x30, + 0x41, 0x6a, 0x00, 0xee, 0x10, 0x3a, 0xb8, 0xee, 0x40, 0x0a, 0x20, 0xee, + 0x20, 0x0a, 0x01, 0xf5, 0x96, 0x71, 0xbd, 0xee, 0xc0, 0x0a, 0x81, 0xed, + 0x00, 0x0a, 0x83, 0x6b, 0x99, 0x79, 0x43, 0x6a, 0x89, 0x01, 0x01, 0xf0, + 0xc0, 0x01, 0x03, 0xf5, 0x6e, 0x73, 0x41, 0xf0, 0x80, 0x01, 0x19, 0x60, + 0x81, 0x6b, 0x8b, 0x7f, 0x41, 0x6a, 0x9b, 0x02, 0x03, 0xf4, 0x40, 0x63, + 0x01, 0xf5, 0xc4, 0x71, 0x43, 0xf4, 0x00, 0x63, 0x0b, 0x60, 0x83, 0x6b, + 0x46, 0x6a, 0x03, 0xf1, 0x78, 0x01, 0x06, 0xf5, 0x34, 0x76, 0xcb, 0x78, + 0x4c, 0x68, 0x0d, 0x78, 0x37, 0x68, 0x33, 0x49, 0x0f, 0x40, 0x05, 0xf0, + 0x01, 0x05, 0x3d, 0x43, 0x24, 0x04, 0x04, 0xf4, 0xf8, 0x14, 0x1b, 0x02, + 0x2c, 0x43, 0x03, 0xf4, 0xf8, 0x53, 0x23, 0x43, 0x43, 0xf0, 0xa0, 0x63, + 0x33, 0x60, 0xdf, 0xed, 0x28, 0x0a, 0x83, 0x6b, 0xd9, 0x6f, 0x8a, 0x40, + 0x00, 0xee, 0x10, 0x2a, 0xc2, 0x68, 0xb8, 0xee, 0x40, 0x0a, 0x20, 0xee, + 0x20, 0x0a, 0x02, 0xf5, 0x00, 0x62, 0xfc, 0xee, 0xc0, 0x0a, 0xc2, 0xed, + 0x00, 0x0a, 0xf6, 0xee, 0x00, 0x0a, 0xc1, 0x68, 0x20, 0xee, 0x20, 0x0a, + 0x01, 0xf6, 0x04, 0x01, 0x00, 0xf0, 0x3e, 0xf8, 0x02, 0xf6, 0x08, 0x02, + 0xfc, 0xee, 0xc0, 0x1a, 0xc2, 0xed, 0x00, 0x1a, 0x20, 0xee, 0x20, 0x0a, + 0xc1, 0x68, 0x01, 0xf6, 0x0c, 0x01, 0x00, 0xf0, 0x31, 0xf8, 0x02, 0xf5, + 0x01, 0x62, 0xbc, 0xee, 0xc0, 0x0a, 0x82, 0xed, 0x00, 0x0a, 0x81, 0x6b, + 0x91, 0xf8, 0x8b, 0x20, 0x41, 0x6a, 0x92, 0x04, 0x02, 0xf4, 0x40, 0x22, + 0x01, 0xf5, 0xc2, 0x71, 0x42, 0xf4, 0x00, 0x22, 0x0a, 0x60, 0x82, 0x6b, + 0xb2, 0xf8, 0x88, 0x10, 0x42, 0x6a, 0x02, 0xf5, 0x2c, 0x72, 0x49, 0x01, + 0x11, 0x60, 0x81, 0x6b, 0x40, 0x6a, 0xb1, 0xf8, 0x88, 0x20, 0x52, 0x42, + 0x00, 0xf5, 0x2d, 0x70, 0x52, 0x01, 0x02, 0x60, 0xbd, 0xe8, 0xf0, 0x87, + 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, 0x80, 0xc7, 0x00, 0x40, 0x1c, 0x47, + 0xa8, 0x82, 0x02, 0x00, 0x27, 0xe2, 0xff, 0xff, 0xfe, 0xe0, 0xe0, 0x00, + 0xbc, 0xee, 0xc0, 0x1a, 0x81, 0xed, 0x00, 0x1a, 0x20, 0xee, 0x20, 0x0a, + 0xc2, 0x68, 0x70, 0x47, 0x10, 0xb5, 0x01, 0x46, 0x01, 0x20, 0x00, 0x22, + 0x8b, 0x78, 0xd3, 0x40, 0xdc, 0x07, 0x09, 0xd5, 0x01, 0xeb, 0x82, 0x03, + 0x9c, 0x6a, 0x54, 0xf8, 0x10, 0x3f, 0x1c, 0x09, 0x44, 0xea, 0x93, 0x14, + 0xe3, 0x07, 0x03, 0xd4, 0x52, 0x1c, 0x04, 0x2a, 0xee, 0xd3, 0x10, 0xbd, + 0x00, 0x20, 0x10, 0xbd, 0x00, 0x21, 0x82, 0x78, 0xca, 0x40, 0xd3, 0x07, + 0x05, 0xd5, 0x00, 0xeb, 0x81, 0x02, 0x93, 0x6a, 0x30, 0x22, 0x43, 0xf8, + 0x10, 0x2f, 0x49, 0x1c, 0x04, 0x29, 0xf2, 0xd3, 0x70, 0x47, 0x10, 0xb5, + 0xc1, 0x68, 0x01, 0xf1, 0x60, 0x02, 0x4a, 0xf6, 0xaa, 0x23, 0x13, 0x60, + 0x4f, 0xf6, 0xff, 0x74, 0x14, 0x60, 0x6f, 0xf0, 0x00, 0x72, 0x00, 0x69, + 0x00, 0xf2, 0xcc, 0x40, 0x02, 0x60, 0x41, 0xf8, 0x5c, 0x3f, 0x0c, 0x60, + 0x00, 0x21, 0x01, 0x60, 0x10, 0xbd, 0x00, 0x00, 0xc2, 0x6c, 0x00, 0x21, + 0x82, 0xf8, 0x22, 0x10, 0x81, 0x6b, 0x91, 0xf8, 0x8b, 0x20, 0x01, 0x2a, + 0x00, 0xd0, 0x70, 0x47, 0x10, 0xb5, 0x00, 0x21, 0x00, 0xf0, 0xa9, 0xfa, + 0x0e, 0xd5, 0x00, 0xeb, 0x81, 0x02, 0x93, 0x6a, 0x03, 0xf5, 0x2e, 0x73, + 0x1a, 0x68, 0x83, 0x6b, 0xd3, 0xf8, 0x8c, 0x40, 0xa2, 0x42, 0x03, 0xd3, + 0xc3, 0x6c, 0x01, 0x22, 0x83, 0xf8, 0x22, 0x20, 0x49, 0x1c, 0x04, 0x29, + 0xea, 0xd3, 0x10, 0xbd, 0xc2, 0x6c, 0x01, 0x21, 0x82, 0xf8, 0x20, 0x10, + 0x81, 0x6b, 0x91, 0xf8, 0x78, 0x20, 0x01, 0x2a, 0x00, 0xd0, 0x70, 0x47, + 0xf0, 0xb5, 0xc2, 0x6c, 0x00, 0x21, 0x82, 0xf8, 0x21, 0x10, 0xc1, 0x68, + 0x01, 0xf2, 0xfc, 0x71, 0x0a, 0x68, 0x00, 0x21, 0x00, 0xf0, 0x7f, 0xfa, + 0x06, 0xd5, 0x00, 0xf1, 0x28, 0x02, 0x52, 0xf8, 0x21, 0x30, 0x03, 0xf5, + 0x35, 0x73, 0x1a, 0x68, 0x49, 0x1c, 0x04, 0x29, 0xf2, 0xd3, 0x00, 0x21, + 0x46, 0xf6, 0x21, 0x15, 0x00, 0x22, 0x4f, 0xf0, 0xff, 0x33, 0x00, 0x24, + 0xfe, 0x35, 0x86, 0x78, 0xe6, 0x40, 0xf7, 0x07, 0x19, 0xd5, 0x40, 0xf2, + 0x1f, 0x16, 0x4f, 0xf4, 0x8f, 0x77, 0x4e, 0x43, 0x07, 0xfb, 0x01, 0xfc, + 0x00, 0xf1, 0x28, 0x07, 0x2e, 0x44, 0xac, 0x44, 0x57, 0xf8, 0x24, 0x70, + 0xa6, 0xeb, 0x0c, 0x06, 0x07, 0xeb, 0x86, 0x06, 0x06, 0xf5, 0x40, 0x77, + 0x3e, 0x68, 0x96, 0x42, 0x28, 0xbf, 0x32, 0x46, 0x9e, 0x42, 0x98, 0xbf, + 0x33, 0x46, 0x64, 0x1c, 0x04, 0x2c, 0xde, 0xd3, 0x84, 0x6b, 0x54, 0xf8, + 0x80, 0x5f, 0xd2, 0x1a, 0xab, 0x42, 0x24, 0xbf, 0x63, 0x68, 0x93, 0x42, + 0x05, 0xd3, 0xc2, 0x6c, 0x92, 0xf8, 0x21, 0x30, 0x5b, 0x1c, 0x82, 0xf8, + 0x21, 0x30, 0x49, 0x1c, 0x20, 0x29, 0xc5, 0xd3, 0xc1, 0x6c, 0x80, 0x6b, + 0x90, 0xf8, 0x7a, 0x30, 0x20, 0x31, 0x4a, 0x78, 0x9a, 0x42, 0x3c, 0xbf, + 0x00, 0x20, 0x08, 0x70, 0xf0, 0xbd, 0x2d, 0xe9, 0xf0, 0x4b, 0x2d, 0xed, + 0x06, 0x8b, 0x06, 0x46, 0x90, 0xb0, 0xf4, 0x6c, 0x94, 0xf8, 0x24, 0x00, + 0xc2, 0x07, 0x40, 0xf1, 0x20, 0x81, 0x00, 0xf0, 0x24, 0xfa, 0xb2, 0x6b, + 0xa5, 0x7c, 0x02, 0xf1, 0x3c, 0x03, 0x01, 0x2d, 0x93, 0xed, 0x05, 0x8a, + 0xd3, 0xed, 0x04, 0x8a, 0x93, 0xed, 0x03, 0x9a, 0x0a, 0xd0, 0x1b, 0x78, + 0x00, 0xee, 0x10, 0x3a, 0xb8, 0xee, 0x40, 0x0a, 0x20, 0xee, 0x09, 0x9a, + 0x60, 0xee, 0x28, 0x8a, 0x20, 0xee, 0x08, 0x8a, 0x12, 0x7e, 0x00, 0x2a, + 0x07, 0xbf, 0x94, 0xf8, 0x11, 0xb0, 0x01, 0x22, 0x94, 0xf8, 0x18, 0xb0, + 0x32, 0x7a, 0x00, 0xee, 0x10, 0x2a, 0x00, 0x27, 0xf8, 0xee, 0x40, 0x9a, + 0x04, 0x46, 0x0d, 0x46, 0x4f, 0xea, 0x07, 0x18, 0x00, 0x20, 0x4d, 0xf8, + 0x08, 0x00, 0x01, 0xa9, 0x00, 0x22, 0x41, 0xf8, 0x08, 0x20, 0x02, 0xa8, + 0x00, 0x21, 0x40, 0xf8, 0x08, 0x10, 0x0d, 0xeb, 0x08, 0x02, 0xd1, 0x60, + 0xb1, 0x78, 0xf9, 0x40, 0xc8, 0x07, 0x39, 0xd5, 0x06, 0xeb, 0x87, 0x01, + 0xd1, 0xf8, 0x28, 0x90, 0x09, 0xf5, 0x90, 0x71, 0x00, 0xf0, 0xe7, 0xf8, + 0x00, 0xee, 0x10, 0x0a, 0x0d, 0xeb, 0x08, 0x00, 0x80, 0xee, 0x29, 0x0a, + 0x80, 0xed, 0x00, 0x0a, 0x09, 0xf5, 0x92, 0x70, 0x00, 0x23, 0x02, 0x68, + 0x10, 0x1b, 0x63, 0xeb, 0x05, 0x01, 0x2b, 0xf0, 0x8f, 0xfc, 0x0d, 0xf1, + 0x04, 0x0c, 0x0a, 0xee, 0x10, 0x0a, 0xc4, 0x44, 0x8a, 0xee, 0x29, 0xaa, + 0x09, 0xf5, 0x98, 0x71, 0x8c, 0xed, 0x00, 0xaa, 0x00, 0xf0, 0xc9, 0xf8, + 0x02, 0xaa, 0x00, 0xee, 0x10, 0x0a, 0x42, 0x44, 0x80, 0xee, 0x29, 0x0a, + 0x09, 0xf5, 0x9a, 0x71, 0x82, 0xed, 0x00, 0x0a, 0x00, 0xf0, 0xbd, 0xf8, + 0x00, 0xee, 0x10, 0x0a, 0x0d, 0xeb, 0x08, 0x03, 0x80, 0xee, 0x29, 0x0a, + 0x83, 0xed, 0x03, 0x0a, 0x7f, 0x1c, 0x04, 0x2f, 0xae, 0xd3, 0xb1, 0x6b, + 0x08, 0x7e, 0x00, 0x28, 0x3b, 0xd1, 0x00, 0x21, 0x06, 0xeb, 0x81, 0x02, + 0x01, 0xad, 0x0d, 0xeb, 0x01, 0x14, 0x05, 0xeb, 0x01, 0x15, 0xd3, 0x6b, + 0x94, 0xed, 0x00, 0x0a, 0xd5, 0xed, 0x00, 0x0a, 0x70, 0xee, 0x20, 0x0a, + 0x93, 0xed, 0x00, 0x0a, 0x00, 0xee, 0x89, 0x0a, 0x01, 0xad, 0x83, 0xed, + 0x00, 0x0a, 0x05, 0xeb, 0x01, 0x15, 0xd3, 0x6b, 0xd4, 0xed, 0x00, 0x0a, + 0x95, 0xed, 0x00, 0x0a, 0x30, 0xee, 0xc0, 0x0a, 0xd3, 0xed, 0x01, 0x0a, + 0x40, 0xee, 0x28, 0x0a, 0x03, 0xac, 0xc3, 0xed, 0x01, 0x0a, 0x02, 0xab, + 0x03, 0xeb, 0x01, 0x13, 0x04, 0xeb, 0x01, 0x10, 0xd2, 0x6b, 0x93, 0xed, + 0x00, 0x0a, 0xd0, 0xed, 0x00, 0x0a, 0x70, 0xee, 0x60, 0x0a, 0x92, 0xed, + 0x02, 0x0a, 0x49, 0x1c, 0x00, 0xee, 0x88, 0x0a, 0x04, 0x29, 0x82, 0xed, + 0x02, 0x0a, 0xc5, 0xd3, 0x65, 0xe0, 0x00, 0x22, 0x0d, 0xeb, 0x0b, 0x15, + 0x5a, 0x45, 0x2c, 0xd0, 0x0d, 0xeb, 0x0b, 0x13, 0x0d, 0xeb, 0x02, 0x14, + 0x93, 0xed, 0x00, 0x0a, 0xd4, 0xed, 0x00, 0x0a, 0x01, 0xab, 0x70, 0xee, + 0x20, 0x0a, 0x0d, 0xeb, 0x0b, 0x17, 0x03, 0xeb, 0x02, 0x13, 0xc5, 0xed, + 0x00, 0x0a, 0x0d, 0xeb, 0x0b, 0x14, 0x97, 0xed, 0x01, 0x0a, 0x00, 0xf0, + 0x4f, 0xf8, 0x93, 0xed, 0x02, 0x0a, 0xc4, 0xed, 0x01, 0x0a, 0x02, 0xab, + 0x03, 0xeb, 0x02, 0x13, 0x00, 0xf0, 0x46, 0xf8, 0x93, 0xed, 0x03, 0x0a, + 0xc4, 0xed, 0x02, 0x0a, 0x03, 0xab, 0x03, 0xeb, 0x02, 0x10, 0xd0, 0xed, + 0x00, 0x0a, 0x70, 0xee, 0x20, 0x0a, 0xc4, 0xed, 0x03, 0x0a, 0x52, 0x1c, + 0x04, 0x2a, 0xcd, 0xd3, 0x06, 0xeb, 0x8b, 0x00, 0x0d, 0xeb, 0x0b, 0x13, + 0x0d, 0xeb, 0x0b, 0x14, 0xc2, 0x6b, 0x93, 0xed, 0x00, 0x0a, 0xd4, 0xed, + 0x01, 0x0a, 0x70, 0xee, 0x20, 0x0a, 0x92, 0xed, 0x00, 0x0a, 0x00, 0xee, + 0x89, 0x0a, 0x82, 0xed, 0x00, 0x0a, 0x0d, 0xeb, 0x0b, 0x11, 0xc2, 0x6b, + 0xd3, 0xed, 0x00, 0x0a, 0x94, 0xed, 0x01, 0x0a, 0x30, 0xee, 0xc0, 0x0a, + 0xd2, 0xed, 0x01, 0x0a, 0x40, 0xee, 0x28, 0x0a, 0xc2, 0xed, 0x01, 0x0a, + 0x0d, 0xeb, 0x0b, 0x12, 0xc0, 0x6b, 0x92, 0xed, 0x02, 0x0a, 0xd1, 0xed, + 0x03, 0x0a, 0x70, 0xee, 0x60, 0x0a, 0x90, 0xed, 0x02, 0x0a, 0x00, 0xee, + 0x88, 0x0a, 0x80, 0xed, 0x02, 0x0a, 0x10, 0xb0, 0xbd, 0xec, 0x06, 0x8b, + 0xbd, 0xe8, 0xf0, 0x8b, 0xd3, 0xed, 0x00, 0x0a, 0x0d, 0xeb, 0x0b, 0x13, + 0x70, 0xee, 0x20, 0x0a, 0x70, 0x47, 0x08, 0x68, 0x00, 0x21, 0x00, 0x1b, + 0xa9, 0x41, 0x2b, 0xf0, 0xb3, 0xbb, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, + 0x2d, 0xed, 0x02, 0x8b, 0x07, 0x46, 0x84, 0xb0, 0xfc, 0x6c, 0x94, 0xf8, + 0x24, 0x00, 0x42, 0x07, 0x40, 0xf1, 0xd9, 0x80, 0x00, 0xf0, 0xe5, 0xf8, + 0xba, 0x6b, 0xa3, 0x7c, 0x92, 0xed, 0x18, 0x8a, 0x01, 0x2b, 0x03, 0xd0, + 0x92, 0xf8, 0x3d, 0x30, 0x00, 0xf0, 0x87, 0xfa, 0x52, 0x7e, 0x00, 0xf0, + 0x5c, 0xfa, 0x00, 0xf0, 0x73, 0xfa, 0x0f, 0xd5, 0x07, 0xeb, 0x85, 0x01, + 0x8a, 0x6a, 0x52, 0xf8, 0x38, 0x0f, 0x00, 0x21, 0x00, 0xf0, 0x64, 0xfa, + 0x00, 0xf0, 0x6f, 0xfa, 0x06, 0xeb, 0x85, 0x03, 0x80, 0xee, 0x20, 0x0a, + 0x83, 0xed, 0x00, 0x0a, 0x6d, 0x1c, 0x04, 0x2d, 0xe9, 0xd3, 0x38, 0x46, + 0x81, 0x6b, 0x4a, 0x7e, 0x01, 0x2a, 0x04, 0xd1, 0x00, 0x21, 0x00, 0xf0, + 0x6d, 0xfa, 0x04, 0x29, 0xfb, 0xd3, 0x22, 0x46, 0x22, 0xe0, 0x81, 0x78, + 0xd1, 0x40, 0xcb, 0x07, 0x1d, 0xd5, 0xc3, 0x6c, 0x99, 0x7d, 0x1f, 0x7d, + 0xdb, 0x7d, 0x49, 0x00, 0x01, 0xeb, 0x87, 0x01, 0x00, 0xf1, 0x3c, 0x07, + 0x06, 0xeb, 0x82, 0x05, 0x59, 0x18, 0x57, 0xf8, 0x22, 0x30, 0x95, 0xed, + 0x00, 0x0a, 0xc9, 0xb2, 0x03, 0xf1, 0x0c, 0x07, 0x07, 0xeb, 0x81, 0x05, + 0x0c, 0x33, 0xd5, 0xed, 0x00, 0x0a, 0x03, 0xeb, 0x81, 0x01, 0x48, 0xee, + 0x40, 0x0a, 0xc1, 0xed, 0x00, 0x0a, 0x52, 0x1c, 0x42, 0x45, 0xda, 0xdb, + 0x82, 0x6b, 0x91, 0x7b, 0x00, 0x29, 0xb6, 0xee, 0x00, 0x0a, 0x3b, 0xd1, + 0x21, 0x46, 0x37, 0xe0, 0x00, 0xf0, 0x83, 0xf8, 0x33, 0xd5, 0x00, 0x22, + 0x43, 0x78, 0xd3, 0x40, 0xde, 0x07, 0x2b, 0xd5, 0x00, 0x23, 0xdf, 0xed, + 0x39, 0x0a, 0x00, 0x27, 0x03, 0xeb, 0x82, 0x06, 0x00, 0xf1, 0x3c, 0x05, + 0x55, 0xf8, 0x21, 0xc0, 0x06, 0xeb, 0x47, 0x05, 0x0c, 0xf1, 0x0c, 0x0e, + 0xed, 0xb2, 0x0e, 0xeb, 0x85, 0x05, 0x7f, 0x1c, 0x95, 0xed, 0x00, 0x1a, + 0x01, 0x2f, 0x70, 0xee, 0x81, 0x0a, 0xed, 0xd9, 0x0c, 0xf1, 0x0c, 0x07, + 0xf5, 0xb2, 0x07, 0xeb, 0x85, 0x05, 0x00, 0xf0, 0x57, 0xf8, 0xb6, 0x1c, + 0x55, 0xf8, 0x21, 0x70, 0x07, 0xf1, 0x0c, 0x05, 0xf6, 0xb2, 0x05, 0xeb, + 0x86, 0x06, 0x5b, 0x1c, 0x01, 0x2b, 0xc6, 0xed, 0x00, 0x0a, 0xd4, 0xd9, + 0x52, 0x1c, 0x02, 0x2a, 0xcc, 0xd9, 0x49, 0x1c, 0x41, 0x45, 0xc5, 0xdb, + 0x82, 0x6b, 0xd1, 0x7b, 0x00, 0x29, 0x3c, 0xd1, 0x39, 0xe0, 0x81, 0x78, + 0xe1, 0x40, 0xca, 0x07, 0x34, 0xd5, 0x00, 0x21, 0x42, 0x78, 0xca, 0x40, + 0xd3, 0x07, 0x2c, 0xd5, 0x00, 0x22, 0x53, 0x00, 0xdf, 0xed, 0x18, 0x0a, + 0x00, 0x26, 0x03, 0xeb, 0x81, 0x03, 0x00, 0xf1, 0x3c, 0x07, 0xf5, 0x18, + 0x57, 0xf8, 0x24, 0x70, 0x07, 0xf1, 0x0c, 0x0c, 0x5f, 0xfa, 0x85, 0xfe, + 0x0c, 0xeb, 0x8e, 0x05, 0x76, 0x1c, 0x95, 0xed, 0x00, 0x1a, 0x01, 0x2e, + 0x70, 0xee, 0x81, 0x0a, 0xed, 0xd9, 0x07, 0xf1, 0x0c, 0x06, 0xdf, 0xb2, + 0x06, 0xeb, 0x87, 0x05, 0x00, 0xf0, 0x16, 0xf8, 0x5b, 0x1c, 0x55, 0xf8, + 0x24, 0x60, 0x06, 0xf1, 0x0c, 0x07, 0xdb, 0xb2, 0x07, 0xeb, 0x83, 0x03, + 0x52, 0x1c, 0x01, 0x2a, 0xc3, 0xed, 0x00, 0x0a, 0xd3, 0xd9, 0x49, 0x1c, + 0x02, 0x29, 0xcb, 0xd9, 0x64, 0x1c, 0x44, 0x45, 0xc3, 0xdb, 0x81, 0xe1, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xee, 0x80, 0x0a, 0xc5, 0xed, 0x00, 0x0a, + 0x00, 0xf1, 0x3c, 0x05, 0x70, 0x47, 0x82, 0x78, 0xca, 0x40, 0xd3, 0x07, + 0x70, 0x47, 0xe2, 0x7e, 0x01, 0x20, 0x00, 0x21, 0x52, 0x1c, 0x28, 0xf0, + 0xe5, 0xb8, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, + 0x07, 0x46, 0x84, 0xb0, 0xfc, 0x6c, 0x94, 0xf8, 0x24, 0x00, 0x02, 0x07, + 0x40, 0xf1, 0x61, 0x81, 0xe2, 0x7e, 0x00, 0xf0, 0xb4, 0xfd, 0xba, 0x6b, + 0xa3, 0x7c, 0x92, 0xed, 0x19, 0x8a, 0x01, 0x2b, 0x03, 0xd0, 0x92, 0xf8, + 0x3e, 0x30, 0x00, 0xf0, 0x8c, 0xf9, 0x92, 0x7e, 0x00, 0xf0, 0x61, 0xf9, + 0x00, 0xf0, 0x78, 0xf9, 0x11, 0xd5, 0x07, 0xeb, 0x85, 0x01, 0x89, 0x6a, + 0x01, 0xf1, 0x58, 0x00, 0x88, 0x31, 0x00, 0x68, 0x09, 0x68, 0x00, 0xf0, + 0x67, 0xf9, 0x00, 0xf0, 0x72, 0xf9, 0x06, 0xeb, 0x85, 0x02, 0x80, 0xee, + 0x20, 0x0a, 0x82, 0xed, 0x00, 0x0a, 0x6d, 0x1c, 0x03, 0x2d, 0xe7, 0xd9, + 0x38, 0x46, 0x81, 0x6b, 0x8a, 0x7e, 0x01, 0x2a, 0x04, 0xd1, 0x00, 0x21, + 0x00, 0xf0, 0x70, 0xf9, 0x03, 0x29, 0xfb, 0xd9, 0x23, 0x46, 0x0c, 0x22, + 0x25, 0xe0, 0x81, 0x78, 0xd9, 0x40, 0xcf, 0x07, 0x20, 0xd5, 0xc7, 0x6c, + 0x7d, 0x7d, 0x39, 0x7d, 0xad, 0x00, 0x12, 0xfb, 0x01, 0x51, 0xbd, 0x7d, + 0xff, 0x7d, 0x01, 0xeb, 0x45, 0x01, 0x00, 0xf1, 0x3c, 0x05, 0x79, 0x18, + 0x55, 0xf8, 0x23, 0x70, 0x06, 0xeb, 0x83, 0x05, 0xc9, 0xb2, 0x95, 0xed, + 0x00, 0x0a, 0x07, 0xf1, 0x3c, 0x0c, 0x0c, 0xeb, 0x81, 0x05, 0x3c, 0x37, + 0xd5, 0xed, 0x00, 0x0a, 0x07, 0xeb, 0x81, 0x01, 0x48, 0xee, 0x00, 0x0a, + 0xc1, 0xed, 0x00, 0x0a, 0x5b, 0x1c, 0x43, 0x45, 0xd7, 0xdb, 0x83, 0x6b, + 0x99, 0x7d, 0x00, 0x29, 0x5b, 0xd1, 0x21, 0x46, 0x57, 0xe0, 0x83, 0x78, + 0xcb, 0x40, 0xde, 0x07, 0x52, 0xd5, 0x00, 0x23, 0x46, 0x78, 0xde, 0x40, + 0xf7, 0x07, 0x4a, 0xd5, 0x00, 0x26, 0x00, 0x27, 0x4f, 0xea, 0x46, 0x0c, + 0x02, 0xfb, 0x03, 0xcc, 0x9f, 0xed, 0x7a, 0x0a, 0x4f, 0xf0, 0x00, 0x0e, + 0xbc, 0x44, 0x45, 0x78, 0x25, 0xfa, 0x0e, 0xf5, 0xed, 0x07, 0x0e, 0xd5, + 0x00, 0xf1, 0x3c, 0x05, 0x55, 0xf8, 0x21, 0x50, 0x05, 0xf1, 0x3c, 0x0a, + 0x0c, 0xeb, 0x8e, 0x05, 0xed, 0xb2, 0x0a, 0xeb, 0x85, 0x05, 0xd5, 0xed, + 0x00, 0x0a, 0x30, 0xee, 0x20, 0x0a, 0x0e, 0xf1, 0x01, 0x0e, 0xbe, 0xf1, + 0x02, 0x0f, 0xe6, 0xd9, 0x4f, 0xf0, 0x00, 0x0e, 0x45, 0x78, 0x25, 0xfa, + 0x0e, 0xf5, 0xed, 0x07, 0x14, 0xd5, 0x00, 0xf1, 0x3c, 0x05, 0x55, 0xf8, + 0x21, 0x50, 0x90, 0xf8, 0x07, 0x90, 0x05, 0xf1, 0x3c, 0x0a, 0x0c, 0xeb, + 0x8e, 0x05, 0xed, 0xb2, 0x00, 0xee, 0x90, 0x9a, 0x0a, 0xeb, 0x85, 0x05, + 0xf8, 0xee, 0x60, 0x0a, 0xc0, 0xee, 0x20, 0x0a, 0xc5, 0xed, 0x00, 0x0a, + 0x0e, 0xf1, 0x01, 0x0e, 0xbe, 0xf1, 0x02, 0x0f, 0xe0, 0xd9, 0x7f, 0x1c, + 0x01, 0x2f, 0xb9, 0xd9, 0x76, 0x1c, 0x01, 0x2e, 0xb5, 0xd9, 0x5b, 0x1c, + 0x02, 0x2b, 0xad, 0xd9, 0x49, 0x1c, 0x41, 0x45, 0xa5, 0xdb, 0x83, 0x6b, + 0x19, 0x7d, 0x00, 0x29, 0xf6, 0xee, 0x00, 0x0a, 0x4e, 0xd1, 0x21, 0x46, + 0x4a, 0xe0, 0x83, 0x78, 0xcb, 0x40, 0xde, 0x07, 0x45, 0xd5, 0x00, 0x23, + 0x46, 0x78, 0xde, 0x40, 0xf7, 0x07, 0x3d, 0xd5, 0x00, 0x26, 0x47, 0x78, + 0xf7, 0x40, 0xfd, 0x07, 0x35, 0xd5, 0x00, 0x27, 0x4f, 0xea, 0x86, 0x0c, + 0x02, 0xfb, 0x03, 0xcc, 0x9f, 0xed, 0x47, 0x0a, 0x4f, 0xf0, 0x00, 0x0e, + 0xbc, 0x44, 0x00, 0xf1, 0x3c, 0x05, 0x0c, 0xeb, 0x4e, 0x0a, 0x55, 0xf8, + 0x21, 0x50, 0x05, 0xf1, 0x3c, 0x09, 0x5f, 0xfa, 0x8a, 0xfa, 0x09, 0xeb, + 0x8a, 0x0b, 0x0e, 0xf1, 0x01, 0x0e, 0x9b, 0xed, 0x00, 0x1a, 0xbe, 0xf1, + 0x01, 0x0f, 0x30, 0xee, 0x01, 0x0a, 0xea, 0xd9, 0x05, 0xf1, 0x3c, 0x0e, + 0x5f, 0xfa, 0x8c, 0xf5, 0x0e, 0xeb, 0x85, 0x05, 0x00, 0xf0, 0x70, 0xf8, + 0x0c, 0xf1, 0x02, 0x0c, 0x55, 0xf8, 0x21, 0xe0, 0x0e, 0xf1, 0x3c, 0x05, + 0x5f, 0xfa, 0x8c, 0xfc, 0x05, 0xeb, 0x8c, 0x05, 0x7f, 0x1c, 0x01, 0x2f, + 0x85, 0xed, 0x00, 0x0a, 0xca, 0xd9, 0x76, 0x1c, 0x02, 0x2e, 0xc2, 0xd9, + 0x5b, 0x1c, 0x02, 0x2b, 0xba, 0xd9, 0x49, 0x1c, 0x41, 0x45, 0xb2, 0xdb, + 0x83, 0x6b, 0x59, 0x7d, 0x00, 0x29, 0x4a, 0xd1, 0x47, 0xe0, 0x81, 0x78, + 0xe1, 0x40, 0xcb, 0x07, 0x42, 0xd5, 0x00, 0x21, 0x43, 0x78, 0xcb, 0x40, + 0xde, 0x07, 0x3a, 0xd5, 0x00, 0x23, 0x46, 0x78, 0xde, 0x40, 0xf7, 0x07, + 0x32, 0xd5, 0x00, 0x26, 0x9f, 0x00, 0x02, 0xfb, 0x01, 0x77, 0x9f, 0xed, + 0x1f, 0x0a, 0x4f, 0xf0, 0x00, 0x0c, 0x07, 0xeb, 0x46, 0x07, 0x00, 0xf1, + 0x3c, 0x05, 0x0c, 0xeb, 0x07, 0x09, 0x55, 0xf8, 0x24, 0xe0, 0x0e, 0xf1, + 0x3c, 0x05, 0x5f, 0xfa, 0x89, 0xf9, 0x05, 0xeb, 0x89, 0x05, 0x0c, 0xf1, + 0x01, 0x0c, 0x95, 0xed, 0x00, 0x1a, 0xbc, 0xf1, 0x01, 0x0f, 0x30, 0xee, + 0x01, 0x0a, 0xea, 0xd9, 0x0e, 0xf1, 0x3c, 0x0c, 0x5f, 0xfa, 0x87, 0xfe, + 0x0c, 0xeb, 0x8e, 0x05, 0x00, 0xf0, 0x1e, 0xf8, 0x7f, 0x1c, 0x55, 0xf8, + 0x24, 0x50, 0x3c, 0x35, 0xff, 0xb2, 0x05, 0xeb, 0x87, 0x07, 0x76, 0x1c, + 0x01, 0x2e, 0x87, 0xed, 0x00, 0x0a, 0xcd, 0xd9, 0x5b, 0x1c, 0x02, 0x2b, + 0xc5, 0xd9, 0x49, 0x1c, 0x02, 0x29, 0xbd, 0xd9, 0x64, 0x1c, 0x44, 0x45, + 0xb5, 0xdb, 0x00, 0xbf, 0x04, 0xb0, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, + 0xf1, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xee, 0x20, 0x0a, + 0x85, 0xed, 0x00, 0x0a, 0x00, 0xf1, 0x3c, 0x05, 0x70, 0x47, 0x2a, 0xb9, + 0x4f, 0xf0, 0x01, 0x09, 0x00, 0x24, 0x4f, 0xf0, 0x04, 0x08, 0x06, 0xe0, + 0x22, 0x7e, 0x97, 0xf8, 0x08, 0x90, 0x14, 0x46, 0x52, 0x1c, 0x5f, 0xfa, + 0x82, 0xf8, 0x00, 0x25, 0x6e, 0x46, 0x82, 0x46, 0x8b, 0x46, 0x70, 0x47, + 0xb0, 0xeb, 0x0a, 0x00, 0x61, 0xeb, 0x0b, 0x01, 0x2b, 0xf0, 0x22, 0xb9, + 0x00, 0x20, 0x46, 0xf8, 0x25, 0x00, 0xb9, 0x78, 0xe9, 0x40, 0xc8, 0x07, + 0x70, 0x47, 0x00, 0xee, 0x10, 0x0a, 0x48, 0x46, 0x00, 0xee, 0x90, 0x0a, + 0xf8, 0xee, 0x60, 0x0a, 0x70, 0x47, 0x00, 0xee, 0x10, 0x3a, 0xb8, 0xee, + 0x40, 0x0a, 0x20, 0xee, 0x08, 0x8a, 0x70, 0x47, 0x82, 0x78, 0xca, 0x40, + 0xd3, 0x07, 0x11, 0xd5, 0xc2, 0x6c, 0x12, 0x7e, 0x91, 0x42, 0x0d, 0xd0, + 0x06, 0xeb, 0x82, 0x03, 0x06, 0xeb, 0x81, 0x07, 0x93, 0xed, 0x00, 0x0a, + 0xd7, 0xed, 0x00, 0x0a, 0x06, 0xeb, 0x82, 0x02, 0x70, 0xee, 0x20, 0x0a, + 0xc2, 0xed, 0x00, 0x0a, 0x49, 0x1c, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, + 0x2d, 0xed, 0x02, 0x8b, 0x07, 0x46, 0x86, 0xb0, 0xfc, 0x6c, 0x94, 0xf8, + 0x24, 0x00, 0xc2, 0x06, 0x40, 0xf1, 0xa0, 0x81, 0xff, 0xf7, 0x27, 0xfe, + 0xba, 0x6b, 0xa3, 0x7c, 0x92, 0xed, 0x1a, 0x8a, 0x01, 0x2b, 0x03, 0xd0, + 0x92, 0xf8, 0x3f, 0x30, 0xff, 0xf7, 0xc9, 0xff, 0xd2, 0x7e, 0x2a, 0xb9, + 0x01, 0x22, 0x4f, 0xf0, 0x00, 0x0a, 0x4f, 0xf0, 0x04, 0x0b, 0x05, 0xe0, + 0x22, 0x7e, 0x92, 0x46, 0x52, 0x1c, 0x5f, 0xfa, 0x82, 0xfb, 0x3a, 0x7a, + 0x8d, 0xf8, 0x00, 0x20, 0x4f, 0xf0, 0x00, 0x08, 0x01, 0xae, 0x04, 0x46, + 0x0d, 0x46, 0x00, 0x20, 0x46, 0xf8, 0x28, 0x00, 0xb9, 0x78, 0x21, 0xfa, + 0x08, 0xf1, 0xc8, 0x07, 0x32, 0xd5, 0x07, 0xeb, 0x88, 0x01, 0xd1, 0xf8, + 0x28, 0x90, 0x09, 0xf1, 0xb8, 0x02, 0x00, 0x21, 0x10, 0x68, 0x00, 0xf0, + 0x79, 0xf9, 0x9d, 0xf8, 0x00, 0x30, 0x08, 0xee, 0x90, 0x3a, 0x00, 0xee, + 0x10, 0x0a, 0xf8, 0xee, 0x68, 0x8a, 0x06, 0xeb, 0x88, 0x02, 0x80, 0xee, + 0x28, 0x0a, 0x82, 0xed, 0x00, 0x0a, 0xb8, 0x6b, 0x81, 0x79, 0x01, 0x29, + 0x16, 0xd1, 0x09, 0xf5, 0x61, 0x70, 0xb7, 0xee, 0x00, 0x1a, 0xd0, 0xed, + 0x00, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x60, 0x08, 0x30, 0xee, 0x81, 0x1a, + 0x01, 0xee, 0x90, 0x0a, 0x80, 0xee, 0x01, 0x0a, 0xf8, 0xee, 0x61, 0x1a, + 0x06, 0xeb, 0x88, 0x01, 0x60, 0xee, 0x21, 0x1a, 0xc1, 0xed, 0x00, 0x1a, + 0x08, 0xf1, 0x01, 0x08, 0xb8, 0xf1, 0x03, 0x0f, 0xbf, 0xd9, 0x38, 0x46, + 0x81, 0x6b, 0xca, 0x7e, 0x01, 0x2a, 0x18, 0xd1, 0x00, 0x21, 0xff, 0xf7, + 0xbc, 0xfd, 0x11, 0xd5, 0xc2, 0x6c, 0x12, 0x7e, 0x91, 0x42, 0x0d, 0xd0, + 0x06, 0xeb, 0x82, 0x03, 0x06, 0xeb, 0x81, 0x04, 0x93, 0xed, 0x00, 0x0a, + 0xd4, 0xed, 0x00, 0x0a, 0x06, 0xeb, 0x82, 0x02, 0x70, 0xee, 0x20, 0x0a, + 0xc2, 0xed, 0x00, 0x0a, 0x49, 0x1c, 0x03, 0x29, 0xe7, 0xd9, 0x53, 0x46, + 0x0c, 0x22, 0x24, 0xe0, 0x81, 0x78, 0xd9, 0x40, 0xcc, 0x07, 0x1f, 0xd5, + 0xc4, 0x6c, 0x65, 0x7d, 0x21, 0x7d, 0xa7, 0x7d, 0xe4, 0x7d, 0xad, 0x00, + 0x12, 0xfb, 0x01, 0x51, 0x00, 0xf1, 0x3c, 0x05, 0x01, 0xeb, 0x47, 0x01, + 0x55, 0xf8, 0x23, 0x70, 0x61, 0x18, 0xc9, 0xb2, 0x07, 0xf1, 0xcc, 0x04, + 0x06, 0xeb, 0x83, 0x05, 0x04, 0xeb, 0x81, 0x07, 0x95, 0xed, 0x00, 0x0a, + 0xd7, 0xed, 0x00, 0x0a, 0x04, 0xeb, 0x81, 0x01, 0x48, 0xee, 0x00, 0x0a, + 0xc1, 0xed, 0x00, 0x0a, 0x5b, 0x1c, 0x5b, 0x45, 0xd8, 0xdb, 0x83, 0x6b, + 0x99, 0x7c, 0x00, 0x29, 0x56, 0xd1, 0x51, 0x46, 0x52, 0xe0, 0x83, 0x78, + 0xcb, 0x40, 0xdc, 0x07, 0x4d, 0xd5, 0x00, 0x23, 0x44, 0x78, 0xdc, 0x40, + 0xe5, 0x07, 0x45, 0xd5, 0x00, 0x24, 0x00, 0x25, 0x66, 0x00, 0x00, 0xf0, + 0xe5, 0xf8, 0x90, 0xf8, 0x01, 0xc0, 0x2c, 0xfa, 0x07, 0xfc, 0x5f, 0xea, + 0xcc, 0x7e, 0x0f, 0xd5, 0x00, 0xf1, 0x3c, 0x0c, 0x5c, 0xf8, 0x21, 0xe0, + 0x06, 0xeb, 0x87, 0x0c, 0x0e, 0xf1, 0xcc, 0x08, 0x5f, 0xfa, 0x8c, 0xfc, + 0x08, 0xeb, 0x8c, 0x09, 0xd9, 0xed, 0x00, 0x0a, 0x30, 0xee, 0x20, 0x0a, + 0x7f, 0x1c, 0x02, 0x2f, 0xe5, 0xd9, 0x00, 0x27, 0x90, 0xf8, 0x01, 0xc0, + 0x2c, 0xfa, 0x07, 0xfc, 0x5f, 0xea, 0xcc, 0x7e, 0x15, 0xd5, 0x00, 0xf1, + 0x3c, 0x0c, 0x5c, 0xf8, 0x21, 0xe0, 0x06, 0xeb, 0x87, 0x0c, 0x0e, 0xf1, + 0xcc, 0x08, 0x90, 0xf8, 0x07, 0xe0, 0x5f, 0xfa, 0x8c, 0xfc, 0x00, 0xee, + 0x90, 0xea, 0x08, 0xeb, 0x8c, 0x09, 0xf8, 0xee, 0x60, 0x0a, 0xc0, 0xee, + 0x20, 0x0a, 0xc9, 0xed, 0x00, 0x0a, 0x7f, 0x1c, 0x02, 0x2f, 0xdf, 0xd9, + 0x6d, 0x1c, 0x01, 0x2d, 0xbe, 0xd9, 0x64, 0x1c, 0x01, 0x2c, 0xba, 0xd9, + 0x5b, 0x1c, 0x02, 0x2b, 0xb2, 0xd9, 0x49, 0x1c, 0x59, 0x45, 0xaa, 0xdb, + 0x83, 0x6b, 0x19, 0x7c, 0x00, 0x29, 0xf6, 0xee, 0x00, 0x0a, 0x45, 0xd1, + 0x51, 0x46, 0x41, 0xe0, 0x83, 0x78, 0xcb, 0x40, 0xdc, 0x07, 0x3c, 0xd5, + 0x00, 0x23, 0x44, 0x78, 0xdc, 0x40, 0xe5, 0x07, 0x34, 0xd5, 0x00, 0x24, + 0x45, 0x78, 0xe5, 0x40, 0xee, 0x07, 0x2c, 0xd5, 0x00, 0x25, 0xa6, 0x00, + 0x00, 0xf0, 0x84, 0xf8, 0x00, 0xf1, 0x3c, 0x0c, 0x06, 0xeb, 0x47, 0x08, + 0x5c, 0xf8, 0x21, 0xe0, 0x0e, 0xf1, 0xcc, 0x0c, 0x5f, 0xfa, 0x88, 0xf8, + 0x0c, 0xeb, 0x88, 0x09, 0x7f, 0x1c, 0x99, 0xed, 0x00, 0x1a, 0x01, 0x2f, + 0x30, 0xee, 0x01, 0x0a, 0xec, 0xd9, 0xf7, 0xb2, 0x0c, 0xeb, 0x87, 0x07, + 0x20, 0xee, 0x20, 0x0a, 0x87, 0xed, 0x00, 0x0a, 0x00, 0xf1, 0x3c, 0x07, + 0xb6, 0x1c, 0x57, 0xf8, 0x21, 0xe0, 0x0e, 0xf1, 0xcc, 0x07, 0xf6, 0xb2, + 0x07, 0xeb, 0x86, 0x06, 0x6d, 0x1c, 0x01, 0x2d, 0x86, 0xed, 0x00, 0x0a, + 0xd3, 0xd9, 0x64, 0x1c, 0x02, 0x2c, 0xcb, 0xd9, 0x5b, 0x1c, 0x02, 0x2b, + 0xc3, 0xd9, 0x49, 0x1c, 0x59, 0x45, 0xbb, 0xdb, 0x83, 0x6b, 0x59, 0x7c, + 0x00, 0x29, 0x4b, 0xd1, 0x48, 0xe0, 0x81, 0x78, 0x21, 0xfa, 0x0a, 0xf1, + 0xcb, 0x07, 0x41, 0xd5, 0x00, 0x21, 0x43, 0x78, 0xcb, 0x40, 0xdc, 0x07, + 0x39, 0xd5, 0x00, 0x23, 0x44, 0x78, 0xdc, 0x40, 0xe5, 0x07, 0x31, 0xd5, + 0x00, 0x24, 0x9d, 0x00, 0x02, 0xfb, 0x01, 0x55, 0x9f, 0xed, 0x20, 0x0a, + 0x00, 0x26, 0x05, 0xeb, 0x44, 0x05, 0x00, 0xf1, 0x3c, 0x07, 0x06, 0xeb, + 0x05, 0x0e, 0x57, 0xf8, 0x2a, 0xc0, 0x0c, 0xf1, 0xcc, 0x07, 0x5f, 0xfa, + 0x8e, 0xfe, 0x07, 0xeb, 0x8e, 0x08, 0x76, 0x1c, 0x98, 0xed, 0x00, 0x1a, + 0x01, 0x2e, 0x30, 0xee, 0x01, 0x0a, 0xec, 0xd9, 0xee, 0xb2, 0x07, 0xeb, + 0x86, 0x06, 0x20, 0xee, 0x20, 0x0a, 0x00, 0xf1, 0x3c, 0x07, 0x86, 0xed, + 0x00, 0x0a, 0x6d, 0x1c, 0x57, 0xf8, 0x2a, 0x70, 0x07, 0xf1, 0xcc, 0x06, + 0xed, 0xb2, 0x06, 0xeb, 0x85, 0x05, 0x64, 0x1c, 0x01, 0x2c, 0x85, 0xed, + 0x00, 0x0a, 0xce, 0xd9, 0x5b, 0x1c, 0x02, 0x2b, 0xc6, 0xd9, 0x49, 0x1c, + 0x02, 0x29, 0xbe, 0xd9, 0x0a, 0xf1, 0x01, 0x0a, 0xda, 0x45, 0xb4, 0xdb, + 0x06, 0xb0, 0xfc, 0xe5, 0x02, 0xfb, 0x03, 0x66, 0x9f, 0xed, 0x02, 0x0a, + 0x00, 0x27, 0xae, 0x19, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1b, 0xa9, 0x41, 0x2a, 0xf0, 0x38, 0xbf, 0x2d, 0xe9, 0xf8, 0x4f, + 0x2d, 0xed, 0x02, 0x8b, 0x06, 0x46, 0xce, 0xb0, 0xf7, 0x6c, 0x97, 0xf8, + 0x24, 0x00, 0x82, 0x06, 0x40, 0xf1, 0x34, 0x82, 0xfa, 0x7e, 0x00, 0xf0, + 0x34, 0xfa, 0x04, 0x46, 0xb0, 0x6b, 0xba, 0x7c, 0x0d, 0x46, 0x00, 0xf1, + 0x40, 0x01, 0x01, 0x2a, 0x91, 0xed, 0x0c, 0x8a, 0x02, 0xd0, 0x09, 0x78, + 0x00, 0xf0, 0x56, 0xfc, 0x00, 0x7f, 0x38, 0xb9, 0x00, 0x21, 0x04, 0x22, + 0x4f, 0xf0, 0x01, 0x0a, 0x8d, 0xf8, 0x00, 0x10, 0x02, 0x92, 0x07, 0xe0, + 0x39, 0x7e, 0x8d, 0xf8, 0x00, 0x10, 0x49, 0x1c, 0xc9, 0xb2, 0x02, 0x91, + 0x96, 0xf8, 0x08, 0xa0, 0x00, 0x20, 0x01, 0x90, 0x01, 0x99, 0x0c, 0x20, + 0x41, 0x43, 0x00, 0x27, 0x03, 0x91, 0x01, 0x98, 0x00, 0xeb, 0x40, 0x08, + 0x4f, 0xf4, 0x87, 0x40, 0xb8, 0x44, 0x00, 0xf1, 0xbb, 0x01, 0x5f, 0xfa, + 0x88, 0xf8, 0x4f, 0xf0, 0x00, 0x09, 0x04, 0x91, 0x03, 0x99, 0x29, 0xa8, + 0x24, 0x22, 0x01, 0x44, 0x02, 0xfb, 0x09, 0xf2, 0x01, 0xeb, 0x87, 0x03, + 0x00, 0x20, 0x98, 0x50, 0x05, 0xa8, 0x03, 0x99, 0x01, 0x44, 0x01, 0xeb, + 0x87, 0x00, 0x00, 0x23, 0x83, 0x50, 0xb1, 0x78, 0x21, 0xfa, 0x09, 0xf1, + 0xc8, 0x07, 0x62, 0xd5, 0x06, 0xeb, 0x89, 0x01, 0x8b, 0x6a, 0x04, 0x98, + 0xc5, 0x21, 0x11, 0xfb, 0x08, 0xf1, 0x01, 0x44, 0x84, 0x46, 0xc4, 0x20, + 0x10, 0xfb, 0x08, 0xf0, 0x60, 0x44, 0x09, 0x1a, 0x03, 0xeb, 0x81, 0x01, + 0x01, 0xf5, 0x08, 0x71, 0x44, 0xf6, 0x64, 0x2c, 0x08, 0x68, 0xd1, 0x21, + 0x0c, 0xf1, 0xc7, 0x0e, 0x11, 0xfb, 0x08, 0xf1, 0x71, 0x44, 0x4f, 0xf0, + 0xd0, 0x0e, 0x0c, 0xf1, 0xc7, 0x0c, 0x1e, 0xfb, 0x08, 0xfe, 0xe6, 0x44, + 0x4f, 0xf0, 0xdd, 0x0c, 0x1c, 0xfb, 0x08, 0xfc, 0xa1, 0xeb, 0x0e, 0x01, + 0x48, 0xf6, 0xa3, 0x7e, 0x0e, 0xf1, 0xd3, 0x0b, 0xdc, 0x44, 0x4f, 0xf0, + 0xdc, 0x0b, 0x0e, 0xf1, 0xd3, 0x0e, 0x1b, 0xfb, 0x08, 0xfb, 0x03, 0xeb, + 0x81, 0x01, 0xf3, 0x44, 0x01, 0xf5, 0x11, 0x71, 0xac, 0xeb, 0x0b, 0x0c, + 0x03, 0xeb, 0x8c, 0x03, 0x09, 0x68, 0x03, 0xf5, 0x65, 0x73, 0xf7, 0xee, + 0x00, 0x0a, 0x93, 0xed, 0x00, 0x0a, 0xdd, 0xf8, 0x0c, 0xc0, 0x29, 0xab, + 0x63, 0x44, 0x03, 0xeb, 0x87, 0x0e, 0xb8, 0xee, 0x40, 0x0a, 0x96, 0x44, + 0x70, 0xee, 0x20, 0x8a, 0xce, 0xed, 0x00, 0x8a, 0x05, 0xab, 0xdd, 0xf8, + 0x0c, 0xc0, 0x63, 0x44, 0x03, 0xeb, 0x87, 0x03, 0x00, 0x1b, 0x03, 0xeb, + 0x02, 0x0b, 0xff, 0xf7, 0x4a, 0xff, 0x00, 0xf0, 0xc9, 0xfb, 0x00, 0xf0, + 0xc2, 0xfb, 0x80, 0xee, 0x28, 0x0a, 0x8b, 0xed, 0x00, 0x0a, 0x09, 0xf1, + 0x01, 0x09, 0xb9, 0xf1, 0x03, 0x0f, 0x7f, 0xf6, 0x81, 0xaf, 0x7f, 0x1c, + 0x03, 0x2f, 0xff, 0xf4, 0x70, 0xaf, 0x01, 0x98, 0x40, 0x1c, 0x03, 0x28, + 0x01, 0x90, 0xff, 0xf4, 0x65, 0xaf, 0x00, 0x23, 0x0c, 0x22, 0x4f, 0xf0, + 0x24, 0x0c, 0xb0, 0x78, 0xd8, 0x40, 0xc1, 0x07, 0x34, 0xd5, 0x24, 0x25, + 0x00, 0x24, 0x5d, 0x43, 0x70, 0x78, 0xe0, 0x40, 0xc1, 0x07, 0x2a, 0xd5, + 0x4f, 0xf0, 0x00, 0x0e, 0x02, 0xfb, 0x04, 0xf7, 0x05, 0xa8, 0x28, 0x44, + 0x38, 0x44, 0x00, 0xeb, 0x8e, 0x01, 0x91, 0xed, 0x00, 0x0a, 0xb5, 0xee, + 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x15, 0xd0, 0xf0, 0x6c, 0x90, 0xf8, + 0x18, 0x80, 0x0d, 0xf1, 0xa4, 0x09, 0x1c, 0xfb, 0x08, 0xf8, 0xc8, 0x44, + 0x90, 0xf8, 0x19, 0x90, 0x80, 0x7e, 0x12, 0xfb, 0x09, 0xf9, 0xc1, 0x44, + 0x09, 0xeb, 0x80, 0x00, 0xd0, 0xed, 0x00, 0x0a, 0x20, 0xee, 0x20, 0x0a, + 0x81, 0xed, 0x00, 0x0a, 0x0e, 0xf1, 0x01, 0x0e, 0xbe, 0xf1, 0x03, 0x0f, + 0xd8, 0xd3, 0x64, 0x1c, 0x03, 0x2c, 0xcd, 0xd3, 0x5b, 0x1c, 0x03, 0x2b, + 0xc3, 0xd9, 0xb0, 0x6b, 0x01, 0x7f, 0x01, 0x29, 0x3f, 0xd1, 0x00, 0x23, + 0x24, 0x27, 0x70, 0x78, 0xd8, 0x40, 0xc1, 0x07, 0x36, 0xd5, 0x00, 0x25, + 0x02, 0xfb, 0x03, 0xf4, 0x70, 0x78, 0xe8, 0x40, 0xc1, 0x07, 0x2c, 0xd5, + 0x4f, 0xf0, 0x00, 0x0c, 0xb0, 0x78, 0x20, 0xfa, 0x0c, 0xf0, 0xc1, 0x07, + 0x20, 0xd5, 0xf0, 0x6c, 0x00, 0x7e, 0x84, 0x45, 0x1c, 0xd0, 0x0d, 0xf1, + 0x14, 0x0e, 0xa6, 0x44, 0x0d, 0xf1, 0x14, 0x08, 0x78, 0x43, 0x0e, 0xeb, + 0x85, 0x01, 0xa0, 0x44, 0x01, 0x44, 0x08, 0xeb, 0x85, 0x09, 0x48, 0x44, + 0x0d, 0xf1, 0x14, 0x0e, 0x90, 0xed, 0x00, 0x0a, 0xa6, 0x44, 0x0e, 0xeb, + 0x85, 0x08, 0x07, 0xfb, 0x0c, 0xf0, 0x40, 0x44, 0xd0, 0xed, 0x00, 0x0a, + 0x70, 0xee, 0x20, 0x0a, 0xc1, 0xed, 0x00, 0x0a, 0x0c, 0xf1, 0x01, 0x0c, + 0xbc, 0xf1, 0x03, 0x0f, 0xd4, 0xd9, 0x6d, 0x1c, 0x03, 0x2d, 0xcb, 0xd3, + 0x5b, 0x1c, 0x03, 0x2b, 0xc1, 0xd3, 0xb0, 0x6b, 0x03, 0x7b, 0x9d, 0xf8, + 0x00, 0x10, 0x01, 0x2b, 0x47, 0xd0, 0x08, 0x46, 0x24, 0x23, 0x41, 0xe0, + 0xb4, 0x78, 0xc4, 0x40, 0xe5, 0x07, 0x3c, 0xd5, 0x00, 0x24, 0x03, 0xfb, + 0x00, 0xf5, 0x77, 0x78, 0xe7, 0x40, 0xff, 0x07, 0x32, 0xd5, 0x9f, 0xed, + 0xb5, 0x0a, 0x4f, 0xf0, 0x00, 0x0c, 0x02, 0xfb, 0x04, 0xf7, 0x0d, 0xf1, + 0x14, 0x0e, 0xae, 0x44, 0xbe, 0x44, 0x0e, 0xeb, 0x8c, 0x08, 0x0c, 0xf1, + 0x01, 0x0c, 0xd8, 0xed, 0x00, 0x0a, 0xbc, 0xf1, 0x03, 0x0f, 0x30, 0xee, + 0x20, 0x0a, 0xf0, 0xd3, 0x4f, 0xf0, 0x00, 0x0c, 0x0d, 0xf1, 0x14, 0x0e, + 0xae, 0x44, 0xbe, 0x44, 0x0e, 0xeb, 0x8c, 0x08, 0xd8, 0xed, 0x00, 0x0a, + 0xf5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x09, 0xd0, 0x96, 0xf8, + 0x07, 0x90, 0x00, 0xee, 0x90, 0x9a, 0xf8, 0xee, 0x60, 0x0a, 0xc0, 0xee, + 0x20, 0x0a, 0xc8, 0xed, 0x00, 0x0a, 0x0c, 0xf1, 0x01, 0x0c, 0xbc, 0xf1, + 0x03, 0x0f, 0xe3, 0xd3, 0x64, 0x1c, 0x03, 0x2c, 0xc5, 0xd3, 0x40, 0x1c, + 0x02, 0x9c, 0xa0, 0x42, 0xba, 0xdb, 0xb3, 0x6b, 0x58, 0x7f, 0x78, 0xb9, + 0xf3, 0x6c, 0x1d, 0x7e, 0x24, 0x20, 0x05, 0xac, 0x45, 0x43, 0x60, 0x19, + 0x5c, 0x7e, 0x12, 0xfb, 0x04, 0xf2, 0x02, 0x44, 0x98, 0x7e, 0x02, 0xeb, + 0x80, 0x03, 0x93, 0xed, 0x00, 0x0a, 0x38, 0xe0, 0x00, 0x24, 0x9f, 0xed, + 0x8e, 0x0a, 0x08, 0x46, 0x24, 0x23, 0x2a, 0xe0, 0xb5, 0x78, 0xc5, 0x40, + 0xef, 0x07, 0x25, 0xd5, 0x00, 0x25, 0x03, 0xfb, 0x00, 0xf7, 0x96, 0xf8, + 0x01, 0xc0, 0x2c, 0xfa, 0x05, 0xfc, 0x5f, 0xea, 0xcc, 0x7e, 0x18, 0xd5, + 0x4f, 0xf0, 0x00, 0x0c, 0x02, 0xfb, 0x05, 0xfe, 0x0d, 0xf1, 0x14, 0x08, + 0xb8, 0x44, 0xf0, 0x44, 0x08, 0xeb, 0x8c, 0x09, 0x0c, 0xf1, 0x01, 0x0c, + 0xd9, 0xed, 0x00, 0x0a, 0xf5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x1c, 0xbf, 0x30, 0xee, 0x20, 0x0a, 0x64, 0x1c, 0xbc, 0xf1, 0x03, 0x0f, + 0xea, 0xd3, 0x6d, 0x1c, 0x03, 0x2d, 0xdc, 0xd3, 0x40, 0x1c, 0x02, 0x9d, + 0xa8, 0x42, 0xd1, 0xdb, 0xe4, 0xb2, 0x00, 0xee, 0x90, 0x4a, 0x00, 0xf0, + 0x90, 0xfa, 0x0b, 0x46, 0x0c, 0x20, 0x24, 0x22, 0x22, 0xe0, 0xb4, 0x78, + 0xdc, 0x40, 0xe5, 0x07, 0x1d, 0xd5, 0x00, 0x24, 0x02, 0xfb, 0x03, 0xf5, + 0x77, 0x78, 0xe7, 0x40, 0xff, 0x07, 0x13, 0xd5, 0x4f, 0xf0, 0x00, 0x0c, + 0x00, 0xfb, 0x04, 0xf7, 0x0d, 0xf1, 0x14, 0x0e, 0xae, 0x44, 0xbe, 0x44, + 0x0e, 0xeb, 0x8c, 0x08, 0x00, 0xf0, 0x65, 0xfa, 0x1c, 0xbf, 0x70, 0xee, + 0xc0, 0x0a, 0xc8, 0xed, 0x00, 0x0a, 0xbc, 0xf1, 0x03, 0x0f, 0xef, 0xd3, + 0x64, 0x1c, 0x03, 0x2c, 0xe4, 0xd3, 0x5b, 0x1c, 0x02, 0x9c, 0xa3, 0x42, + 0xd9, 0xdb, 0x28, 0xe0, 0xb3, 0x78, 0xcb, 0x40, 0xdc, 0x07, 0x23, 0xd5, + 0x00, 0x24, 0x06, 0xeb, 0x81, 0x03, 0x75, 0x78, 0xe5, 0x40, 0xef, 0x07, + 0x19, 0xd5, 0x00, 0x25, 0x04, 0xeb, 0x44, 0x0c, 0x0d, 0xf1, 0x14, 0x0e, + 0x02, 0xfb, 0x01, 0xf8, 0xdf, 0x6b, 0xac, 0x44, 0xc6, 0x44, 0x5f, 0xfa, + 0x8c, 0xfc, 0x00, 0xfb, 0x04, 0xf8, 0x07, 0xeb, 0x8c, 0x07, 0xc6, 0x44, + 0x0e, 0xeb, 0x85, 0x0c, 0xd7, 0xed, 0x57, 0x0a, 0x00, 0xf0, 0x2c, 0xfa, + 0xc7, 0xed, 0x57, 0x0a, 0xe6, 0xd3, 0x64, 0x1c, 0x03, 0x2c, 0xde, 0xd3, + 0x49, 0x1c, 0x02, 0x9b, 0x99, 0x42, 0xd3, 0xdb, 0x4e, 0xb0, 0xff, 0xf7, + 0xac, 0xbb, 0x01, 0x20, 0x00, 0x21, 0x11, 0x32, 0x27, 0xf0, 0x1c, 0xbb, + 0x2d, 0xe9, 0xf0, 0x47, 0x07, 0x46, 0x2d, 0xed, 0x02, 0x8b, 0xf8, 0x6c, + 0x90, 0xf8, 0x24, 0x10, 0x8a, 0x06, 0x77, 0xd5, 0xb9, 0x6b, 0xca, 0x7c, + 0x01, 0x2a, 0x73, 0xd1, 0x01, 0x21, 0x80, 0xf8, 0x23, 0x10, 0x00, 0x21, + 0xf8, 0x6c, 0x81, 0x65, 0x01, 0x20, 0xfa, 0x6c, 0xd4, 0x7e, 0x04, 0xf1, + 0x11, 0x02, 0x27, 0xf0, 0x01, 0xfb, 0x3a, 0x7a, 0x01, 0x23, 0x03, 0xfa, + 0x04, 0xf4, 0x54, 0x43, 0x08, 0xee, 0x10, 0x4a, 0xdf, 0xed, 0x31, 0x8a, + 0x00, 0x25, 0x44, 0xf6, 0x64, 0x22, 0x4f, 0xf4, 0x87, 0x43, 0x00, 0x26, + 0x02, 0xf1, 0xc7, 0x0a, 0x03, 0xf1, 0xbb, 0x09, 0x04, 0x46, 0x88, 0x46, + 0xb8, 0x78, 0xf0, 0x40, 0xc1, 0x07, 0x23, 0xd5, 0x07, 0xeb, 0x86, 0x00, + 0xc5, 0x22, 0x81, 0x6a, 0xc4, 0x20, 0x6a, 0x43, 0x68, 0x43, 0x4a, 0x44, + 0x48, 0x44, 0x12, 0x1a, 0x01, 0xeb, 0x82, 0x03, 0x03, 0xf5, 0x08, 0x73, + 0xd1, 0x22, 0x18, 0x68, 0xd0, 0x23, 0x6a, 0x43, 0x6b, 0x43, 0x52, 0x44, + 0x53, 0x44, 0xd2, 0x1a, 0x01, 0xeb, 0x82, 0x01, 0x01, 0xf5, 0x11, 0x71, + 0x00, 0x1b, 0x09, 0x68, 0x61, 0xeb, 0x08, 0x01, 0x2a, 0xf0, 0x9c, 0xfc, + 0x00, 0xee, 0x10, 0x0a, 0x70, 0xee, 0x28, 0x8a, 0x76, 0x1c, 0x04, 0x2e, + 0xd4, 0xd3, 0x6d, 0x1c, 0x09, 0x2d, 0x20, 0x46, 0x41, 0x46, 0xc4, 0xd3, + 0x9f, 0xed, 0x13, 0x0a, 0xf8, 0x6c, 0x28, 0xee, 0x80, 0x0a, 0xf8, 0xee, + 0x48, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0x80, 0xed, 0x16, 0x0a, 0x01, 0x21, + 0xf8, 0x6c, 0x80, 0xf8, 0x23, 0x10, 0xb9, 0x6b, 0xc8, 0x7c, 0x01, 0x28, + 0x0e, 0xd1, 0xf8, 0x6c, 0x00, 0xf1, 0x58, 0x01, 0x91, 0xed, 0x00, 0x0a, + 0xd1, 0xed, 0x01, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x44, 0xbf, 0x00, 0x21, 0x80, 0xf8, 0x23, 0x10, 0xbd, 0xec, 0x02, 0x8b, + 0xbd, 0xe8, 0xf0, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x37, + 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, 0x07, 0x46, 0xaa, 0xb0, + 0xfe, 0x6c, 0x96, 0xf8, 0x24, 0x00, 0x42, 0x06, 0x40, 0xf1, 0x7e, 0x81, + 0xf2, 0x7e, 0xff, 0xf7, 0x62, 0xff, 0x04, 0x46, 0x0d, 0x46, 0xb8, 0x6b, + 0xb1, 0x7c, 0x90, 0xed, 0x1d, 0x8a, 0x01, 0x29, 0x03, 0xd0, 0x90, 0xf8, + 0x41, 0x10, 0x00, 0xf0, 0x85, 0xf9, 0x90, 0xf8, 0x20, 0x00, 0x38, 0xb9, + 0x00, 0x21, 0x04, 0x22, 0x4f, 0xf0, 0x01, 0x0a, 0x8d, 0xf8, 0x04, 0x10, + 0x03, 0x92, 0x07, 0xe0, 0x31, 0x7e, 0x8d, 0xf8, 0x04, 0x10, 0x49, 0x1c, + 0xc9, 0xb2, 0x03, 0x91, 0x97, 0xf8, 0x08, 0xa0, 0x00, 0x20, 0x02, 0x90, + 0x24, 0x26, 0x02, 0x99, 0x0c, 0x20, 0x41, 0x43, 0x4f, 0xf0, 0x00, 0x08, + 0x04, 0x91, 0x02, 0x98, 0x00, 0xeb, 0x40, 0x0b, 0xc3, 0x44, 0x5f, 0xfa, + 0x8b, 0xfb, 0x4f, 0xf0, 0x00, 0x09, 0x04, 0x99, 0x05, 0xa8, 0x01, 0x44, + 0x06, 0xfb, 0x09, 0xf2, 0x01, 0xeb, 0x88, 0x03, 0x00, 0x20, 0x98, 0x50, + 0xb9, 0x78, 0x21, 0xfa, 0x09, 0xf1, 0xc8, 0x07, 0x3d, 0xd5, 0x45, 0xf2, + 0xb4, 0x13, 0xdd, 0x20, 0x03, 0xf1, 0xd3, 0x0c, 0x10, 0xfb, 0x0b, 0xf0, + 0x60, 0x44, 0x07, 0xeb, 0x89, 0x01, 0x4f, 0xf0, 0xdc, 0x0c, 0xd3, 0x33, + 0x1c, 0xfb, 0x0b, 0xfc, 0x89, 0x6a, 0x63, 0x44, 0x45, 0xf6, 0x70, 0x1c, + 0x0c, 0xf1, 0xdf, 0x0e, 0xc0, 0x1a, 0xe9, 0x23, 0x13, 0xfb, 0x0b, 0xf3, + 0x73, 0x44, 0x4f, 0xf0, 0xe8, 0x0e, 0x0c, 0xf1, 0xdf, 0x0c, 0x1e, 0xfb, + 0x0b, 0xfe, 0x01, 0xeb, 0x80, 0x00, 0xe6, 0x44, 0x00, 0xf5, 0x1a, 0x70, + 0xa3, 0xeb, 0x0e, 0x03, 0x01, 0xeb, 0x83, 0x01, 0x00, 0x68, 0x01, 0xf5, + 0x23, 0x71, 0x05, 0xab, 0x09, 0x68, 0xdd, 0xf8, 0x10, 0xc0, 0x63, 0x44, + 0x03, 0xeb, 0x88, 0x03, 0x1a, 0x44, 0x00, 0x92, 0xff, 0xf7, 0xa6, 0xfc, + 0x00, 0xf0, 0x26, 0xf9, 0x00, 0x98, 0x00, 0xf0, 0x1e, 0xf9, 0x80, 0xed, + 0x00, 0x0a, 0x09, 0xf1, 0x01, 0x09, 0xb9, 0xf1, 0x03, 0x0f, 0xae, 0xd9, + 0x08, 0xf1, 0x01, 0x08, 0xb8, 0xf1, 0x03, 0x0f, 0xa1, 0xd3, 0x02, 0x98, + 0x40, 0x1c, 0x03, 0x28, 0x02, 0x90, 0x96, 0xd3, 0xb8, 0x6b, 0x90, 0xf8, + 0x20, 0x10, 0x01, 0x29, 0x36, 0xd1, 0x00, 0x21, 0x78, 0x78, 0xc8, 0x40, + 0xc2, 0x07, 0x2e, 0xd5, 0x0c, 0x22, 0x00, 0x23, 0x4a, 0x43, 0x00, 0x24, + 0xb8, 0x78, 0xe0, 0x40, 0xc5, 0x07, 0x20, 0xd5, 0xf8, 0x6c, 0x05, 0x7e, + 0xac, 0x42, 0x1c, 0xd0, 0x0d, 0xf1, 0x14, 0x0c, 0x94, 0x44, 0x0d, 0xf1, + 0x14, 0x0e, 0x75, 0x43, 0x0c, 0xeb, 0x83, 0x00, 0x96, 0x44, 0x28, 0x44, + 0x0e, 0xeb, 0x83, 0x08, 0x45, 0x44, 0x0d, 0xf1, 0x14, 0x0c, 0x95, 0xed, + 0x00, 0x0a, 0x94, 0x44, 0x0c, 0xeb, 0x83, 0x0e, 0x06, 0xfb, 0x04, 0xf5, + 0x75, 0x44, 0xd5, 0xed, 0x00, 0x0a, 0x70, 0xee, 0x20, 0x0a, 0xc0, 0xed, + 0x00, 0x0a, 0x64, 0x1c, 0x03, 0x2c, 0xd7, 0xd9, 0x5b, 0x1c, 0x03, 0x2b, + 0xd3, 0xd3, 0x49, 0x1c, 0x03, 0x29, 0xc9, 0xd3, 0xb8, 0x6b, 0x42, 0x7b, + 0x9d, 0xf8, 0x04, 0x10, 0x01, 0x2a, 0x40, 0xd0, 0x08, 0x46, 0x3b, 0xe0, + 0xba, 0x78, 0xc2, 0x40, 0xd3, 0x07, 0x36, 0xd5, 0x00, 0x22, 0x06, 0xfb, + 0x00, 0xf3, 0x7c, 0x78, 0xd4, 0x40, 0xe5, 0x07, 0x2c, 0xd5, 0x0c, 0x24, + 0x9f, 0xed, 0x51, 0x0a, 0x00, 0x25, 0x54, 0x43, 0x0d, 0xf1, 0x14, 0x0c, + 0x9c, 0x44, 0xa4, 0x44, 0x0c, 0xeb, 0x85, 0x0e, 0x6d, 0x1c, 0xde, 0xed, + 0x00, 0x0a, 0x03, 0x2d, 0x30, 0xee, 0x20, 0x0a, 0xf2, 0xd3, 0x00, 0x25, + 0x0d, 0xf1, 0x14, 0x0c, 0x9c, 0x44, 0xa4, 0x44, 0x0c, 0xeb, 0x85, 0x0e, + 0xde, 0xed, 0x00, 0x0a, 0xf5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x09, 0xd0, 0x97, 0xf8, 0x07, 0x80, 0x00, 0xee, 0x90, 0x8a, 0xf8, 0xee, + 0x60, 0x0a, 0xc0, 0xee, 0x20, 0x0a, 0xce, 0xed, 0x00, 0x0a, 0x6d, 0x1c, + 0x03, 0x2d, 0xe5, 0xd3, 0x52, 0x1c, 0x03, 0x2a, 0xcb, 0xd3, 0x40, 0x1c, + 0x03, 0x9a, 0x90, 0x42, 0xc0, 0xdb, 0xbb, 0x6b, 0x93, 0xf8, 0x21, 0x00, + 0x78, 0xb9, 0xfa, 0x6c, 0x13, 0x7e, 0x05, 0xa8, 0x16, 0xfb, 0x03, 0xf6, + 0x83, 0x19, 0x54, 0x7e, 0x92, 0x7e, 0x0c, 0x20, 0x44, 0x43, 0x18, 0x19, + 0x00, 0xeb, 0x82, 0x03, 0x93, 0xed, 0x00, 0x0a, 0x01, 0xe0, 0x9f, 0xed, + 0x2e, 0x0a, 0x0b, 0x46, 0x0c, 0x20, 0x24, 0x22, 0x22, 0xe0, 0xbc, 0x78, + 0xdc, 0x40, 0xe5, 0x07, 0x1d, 0xd5, 0x00, 0x24, 0x02, 0xfb, 0x03, 0xf5, + 0x7e, 0x78, 0xe6, 0x40, 0xf6, 0x07, 0x13, 0xd5, 0x4f, 0xf0, 0x00, 0x0c, + 0x00, 0xfb, 0x04, 0xf6, 0x0d, 0xf1, 0x14, 0x0e, 0xae, 0x44, 0xb6, 0x44, + 0x0e, 0xeb, 0x8c, 0x08, 0x00, 0xf0, 0x49, 0xf8, 0x1c, 0xbf, 0x70, 0xee, + 0xc0, 0x0a, 0xc8, 0xed, 0x00, 0x0a, 0xbc, 0xf1, 0x03, 0x0f, 0xef, 0xd3, + 0x64, 0x1c, 0x03, 0x2c, 0xe4, 0xd3, 0x5b, 0x1c, 0x03, 0x9c, 0xa3, 0x42, + 0xd9, 0xdb, 0x28, 0xe0, 0xbb, 0x78, 0xcb, 0x40, 0xdc, 0x07, 0x23, 0xd5, + 0x00, 0x24, 0x07, 0xeb, 0x81, 0x03, 0x7d, 0x78, 0xe5, 0x40, 0xee, 0x07, + 0x19, 0xd5, 0x00, 0x25, 0x04, 0xeb, 0x44, 0x0c, 0x0d, 0xf1, 0x14, 0x0e, + 0x02, 0xfb, 0x01, 0xf8, 0xde, 0x6b, 0xac, 0x44, 0xc6, 0x44, 0x5f, 0xfa, + 0x8c, 0xfc, 0x00, 0xfb, 0x04, 0xf8, 0x06, 0xeb, 0x8c, 0x06, 0xc6, 0x44, + 0x0e, 0xeb, 0x85, 0x0c, 0xd6, 0xed, 0x60, 0x0a, 0x00, 0xf0, 0x10, 0xf8, + 0xc6, 0xed, 0x60, 0x0a, 0xe6, 0xd3, 0x64, 0x1c, 0x03, 0x2c, 0xde, 0xd3, + 0x49, 0x1c, 0x03, 0x9b, 0x99, 0x42, 0xd3, 0xdb, 0x2a, 0xb0, 0xff, 0xf7, + 0x90, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0xed, 0x00, 0x0a, + 0x6d, 0x1c, 0x48, 0xee, 0x40, 0x0a, 0x03, 0x2d, 0x70, 0x47, 0x0c, 0xf1, + 0x01, 0x0c, 0xd8, 0xed, 0x00, 0x0a, 0xf5, 0xee, 0x40, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x70, 0x47, 0x00, 0xee, 0x10, 0x1a, 0xb8, 0xee, 0x40, 0x0a, + 0x20, 0xee, 0x08, 0x8a, 0x70, 0x47, 0xf8, 0xee, 0x60, 0x0a, 0x80, 0xee, + 0x20, 0x0a, 0x70, 0x47, 0x00, 0xee, 0x10, 0x0a, 0x50, 0x46, 0x00, 0xee, + 0x90, 0x0a, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x06, 0x8b, + 0xba, 0xb0, 0x04, 0x46, 0x09, 0xa8, 0x44, 0x21, 0x09, 0xf0, 0x4e, 0xfc, + 0xe1, 0x6c, 0x91, 0xf8, 0x24, 0x00, 0xc2, 0x07, 0x03, 0xd4, 0x08, 0x7c, + 0x01, 0x28, 0x40, 0xf0, 0x27, 0x81, 0xa2, 0x6b, 0x10, 0x7e, 0x18, 0xb9, + 0x4f, 0xf0, 0x00, 0x09, 0x04, 0x25, 0x06, 0xe0, 0x0d, 0x7e, 0xa9, 0x46, + 0x6d, 0x1c, 0xed, 0xb2, 0xa9, 0x45, 0x80, 0xf2, 0x19, 0x81, 0xa2, 0x6b, + 0x10, 0x7e, 0x04, 0xeb, 0x89, 0x01, 0x00, 0x28, 0xd0, 0x7f, 0x0c, 0xbf, + 0x4f, 0x69, 0x27, 0x69, 0x10, 0xb9, 0xf7, 0xee, 0x00, 0x8a, 0x0a, 0xe0, + 0x01, 0x28, 0x0e, 0xbf, 0x92, 0xed, 0x1b, 0x0a, 0xc8, 0x6b, 0x90, 0xed, + 0x46, 0x0a, 0xf7, 0xee, 0x00, 0x0a, 0xc0, 0xee, 0x80, 0x8a, 0xc8, 0x6b, + 0x02, 0x68, 0x02, 0x92, 0x02, 0xa8, 0xca, 0x6b, 0x53, 0x68, 0x43, 0x60, + 0x00, 0x22, 0x82, 0x60, 0x0d, 0xf1, 0x24, 0x08, 0xc9, 0x6b, 0x8a, 0x68, + 0x05, 0x92, 0x00, 0x21, 0x01, 0x61, 0x0f, 0x26, 0x2b, 0xa9, 0xfb, 0xf7, + 0x27, 0xfc, 0xa0, 0x6b, 0x54, 0x30, 0x9f, 0xed, 0xc2, 0x8a, 0x41, 0x79, + 0x00, 0x91, 0x03, 0x79, 0x42, 0x88, 0x01, 0x88, 0x09, 0xa8, 0xfb, 0xf7, + 0xb7, 0xfc, 0x2a, 0xaa, 0x98, 0xed, 0x10, 0x0a, 0x00, 0xf0, 0x03, 0xf9, + 0x07, 0xf2, 0xdc, 0x50, 0x00, 0x90, 0x08, 0xeb, 0x86, 0x01, 0x1a, 0xa8, + 0x00, 0xeb, 0x86, 0x02, 0x91, 0xed, 0x00, 0x0a, 0x00, 0xf0, 0xf7, 0xf8, + 0x08, 0xeb, 0x86, 0x00, 0xdf, 0xed, 0xb4, 0x0a, 0x90, 0xed, 0x00, 0x0a, + 0x00, 0xf0, 0xd4, 0xf8, 0x9f, 0xed, 0xb2, 0x0a, 0x01, 0xa8, 0xfb, 0xf7, + 0xbb, 0xfb, 0xe1, 0x6c, 0x51, 0xf8, 0x29, 0x20, 0x02, 0x43, 0x41, 0xf8, + 0x29, 0x20, 0x01, 0x28, 0x07, 0xd1, 0xe0, 0x6c, 0x00, 0xeb, 0x89, 0x00, + 0x01, 0x22, 0x81, 0x6a, 0xb2, 0x40, 0x11, 0x43, 0x81, 0x62, 0x76, 0x1e, + 0x00, 0x98, 0x00, 0xf0, 0xc2, 0xf8, 0x00, 0x2e, 0x80, 0xed, 0x00, 0x0a, + 0xd1, 0xdc, 0x1a, 0xaa, 0x9d, 0xed, 0x09, 0x0a, 0x00, 0xf0, 0xcd, 0xf8, + 0x07, 0xf2, 0xe4, 0x51, 0x07, 0xf2, 0xec, 0x52, 0x4f, 0xf0, 0x0f, 0x0a, + 0x08, 0x91, 0x07, 0x92, 0x9f, 0xed, 0x9e, 0x9a, 0xdf, 0xed, 0x9e, 0x9a, + 0x9f, 0xed, 0x9e, 0xaa, 0xdf, 0xed, 0xd3, 0xaa, 0x1a, 0xae, 0x1b, 0xa8, + 0x00, 0xeb, 0x8a, 0x01, 0x06, 0xeb, 0x8a, 0x02, 0x0a, 0xa8, 0x91, 0xed, + 0x00, 0x0a, 0xd2, 0xed, 0x00, 0x0a, 0x00, 0xeb, 0x8a, 0x01, 0x08, 0xeb, + 0x8a, 0x02, 0x70, 0xee, 0x60, 0x0a, 0x91, 0xed, 0x00, 0x0a, 0x92, 0xed, + 0x00, 0x1a, 0x00, 0xf0, 0x97, 0xf8, 0x00, 0xf0, 0xa8, 0xf8, 0x01, 0x21, + 0x01, 0x28, 0x01, 0xfa, 0x0a, 0xfb, 0x09, 0xd1, 0xe0, 0x6c, 0x00, 0xf1, + 0x38, 0x01, 0x38, 0x30, 0x51, 0xf8, 0x29, 0x20, 0x4b, 0xea, 0x02, 0x02, + 0x40, 0xf8, 0x29, 0x20, 0x06, 0xeb, 0x8a, 0x01, 0x07, 0x98, 0x00, 0xf0, + 0x7c, 0xf8, 0x80, 0xed, 0x00, 0x0a, 0xf0, 0xee, 0x69, 0x0a, 0x91, 0xed, + 0x00, 0x0a, 0x00, 0xf0, 0x6d, 0xf8, 0xb0, 0xee, 0x49, 0x0a, 0x01, 0xa8, + 0xfb, 0xf7, 0x54, 0xfb, 0x00, 0xf0, 0x8d, 0xf8, 0x09, 0xd1, 0xe0, 0x6c, + 0x00, 0xf1, 0x48, 0x01, 0x48, 0x30, 0x51, 0xf8, 0x29, 0x20, 0x4b, 0xea, + 0x02, 0x01, 0x40, 0xf8, 0x29, 0x10, 0xaa, 0xf1, 0x01, 0x0a, 0x08, 0x98, + 0x00, 0xf0, 0x5d, 0xf8, 0xba, 0xf1, 0x00, 0x0f, 0x80, 0xed, 0x00, 0x0a, + 0xaf, 0xdc, 0x96, 0xed, 0x01, 0x0a, 0xdd, 0xed, 0x1a, 0x0a, 0x9d, 0xed, + 0x09, 0x1a, 0x70, 0xee, 0x60, 0x0a, 0x98, 0xed, 0x01, 0x0a, 0x00, 0xf0, + 0x51, 0xf8, 0x00, 0xf0, 0x62, 0xf8, 0x01, 0x28, 0x05, 0xd1, 0xe0, 0x6c, + 0x00, 0xf1, 0x38, 0x01, 0x38, 0x30, 0x00, 0xf0, 0x34, 0xf8, 0x07, 0xf2, + 0xec, 0x58, 0x00, 0xf0, 0x3e, 0xf8, 0x88, 0xed, 0x00, 0x0a, 0xb0, 0xee, + 0x49, 0x0a, 0xd6, 0xed, 0x01, 0x0a, 0x68, 0xee, 0xa0, 0x0a, 0x60, 0xee, + 0x88, 0x0a, 0xcd, 0xed, 0x01, 0x0a, 0xf0, 0xee, 0x69, 0x0a, 0x01, 0xa8, + 0xfb, 0xf7, 0x12, 0xfb, 0x00, 0xf0, 0x4b, 0xf8, 0x05, 0xd1, 0xe0, 0x6c, + 0x00, 0xf1, 0x48, 0x01, 0x48, 0x30, 0x00, 0xf0, 0x16, 0xf8, 0x07, 0xf2, + 0xe4, 0x57, 0x00, 0xf0, 0x20, 0xf8, 0x87, 0xed, 0x00, 0x0a, 0x00, 0x20, + 0x00, 0x99, 0x08, 0x60, 0xc8, 0xf8, 0x00, 0x00, 0x38, 0x60, 0x09, 0xf1, + 0x01, 0x00, 0x5f, 0xfa, 0x80, 0xf9, 0xe3, 0xe6, 0x3a, 0xb0, 0xbd, 0xec, + 0x06, 0x8b, 0xbd, 0xe8, 0xf1, 0x8f, 0x51, 0xf8, 0x29, 0x20, 0x42, 0xf0, + 0x01, 0x02, 0x40, 0xf8, 0x29, 0x20, 0x70, 0x47, 0x28, 0xee, 0x80, 0x0a, + 0x20, 0xee, 0x08, 0x0a, 0x8d, 0xed, 0x01, 0x0a, 0x70, 0x47, 0x9d, 0xed, + 0x01, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, 0x70, 0x47, 0x30, 0xee, 0x41, 0x1a, + 0xc0, 0xee, 0x81, 0x0a, 0x60, 0xee, 0x88, 0x0a, 0xcd, 0xed, 0x01, 0x0a, + 0xf0, 0xee, 0x6a, 0x0a, 0xb0, 0xee, 0x4a, 0x0a, 0x01, 0xa8, 0xfb, 0xf7, + 0xd1, 0xba, 0x0d, 0x21, 0x2b, 0xa8, 0xfb, 0xf7, 0xfb, 0xba, 0xe1, 0x6c, + 0x51, 0xf8, 0x29, 0x20, 0x42, 0xea, 0x40, 0x02, 0x41, 0xf8, 0x29, 0x20, + 0x70, 0x47, 0xe1, 0x6c, 0x51, 0xf8, 0x29, 0x20, 0x42, 0xea, 0x80, 0x02, + 0x41, 0xf8, 0x29, 0x20, 0x01, 0x28, 0x70, 0x47, 0x2d, 0xe9, 0xfe, 0x4f, + 0x00, 0xf0, 0xb0, 0xf9, 0x42, 0x07, 0x02, 0xd4, 0x08, 0x7c, 0x01, 0x28, + 0x52, 0xd1, 0xba, 0x6b, 0x50, 0x7e, 0x10, 0xb9, 0x00, 0x26, 0x04, 0x24, + 0x05, 0xe0, 0x0c, 0x7e, 0x26, 0x46, 0x64, 0x1c, 0xe4, 0xb2, 0xa6, 0x42, + 0x46, 0xda, 0xb9, 0x6b, 0x48, 0x7e, 0x07, 0xeb, 0x86, 0x05, 0x00, 0x28, + 0x0c, 0xbf, 0xa8, 0x6a, 0x78, 0x6a, 0x01, 0x90, 0x4f, 0xf0, 0x02, 0x0b, + 0x4f, 0xf0, 0x01, 0x08, 0x01, 0x98, 0x00, 0xf5, 0xf0, 0x70, 0x4f, 0xf0, + 0x01, 0x09, 0x00, 0x90, 0x4f, 0xea, 0x48, 0x00, 0x00, 0xeb, 0x8b, 0x0a, + 0xca, 0x44, 0xe9, 0x6b, 0x4f, 0xfa, 0x8a, 0xfa, 0x01, 0xeb, 0x8a, 0x02, + 0xdf, 0xed, 0xbd, 0x0a, 0x9f, 0xed, 0xbd, 0x0a, 0x02, 0xf1, 0x0c, 0x00, + 0xfb, 0xf7, 0x82, 0xfa, 0xf9, 0x6c, 0x51, 0xf8, 0x26, 0x20, 0x42, 0xea, + 0x00, 0x12, 0x41, 0xf8, 0x26, 0x20, 0xdf, 0xed, 0xb8, 0x0a, 0xe8, 0x6b, + 0x00, 0xeb, 0x8a, 0x01, 0x00, 0x98, 0x91, 0xed, 0x03, 0x0a, 0xa9, 0xf1, + 0x01, 0x09, 0x00, 0xf0, 0x89, 0xf8, 0xc0, 0xed, 0x00, 0x0a, 0xd7, 0xd5, + 0xb8, 0xf1, 0x01, 0x08, 0xce, 0xd5, 0xbb, 0xf1, 0x01, 0x0b, 0xc9, 0xd5, + 0x00, 0x99, 0x00, 0x20, 0x76, 0x1c, 0x08, 0x60, 0xf6, 0xb2, 0xb6, 0xe7, + 0xbd, 0xe8, 0xf7, 0x8f, 0x00, 0x00, 0x80, 0x47, 0x00, 0xf0, 0x7f, 0xcd, + 0x00, 0xf0, 0x7f, 0x4d, 0x00, 0xf8, 0xff, 0x4b, 0x00, 0xf8, 0xff, 0xcb, + 0x00, 0x00, 0x7f, 0x46, 0x2d, 0xe9, 0xf8, 0x4f, 0x06, 0x46, 0xf1, 0x6c, + 0x91, 0xf8, 0x24, 0x00, 0x02, 0x07, 0x02, 0xd4, 0x08, 0x7c, 0x01, 0x28, + 0x5b, 0xd1, 0xb2, 0x6b, 0x90, 0x7e, 0x18, 0xb9, 0x04, 0x20, 0x00, 0x25, + 0x00, 0x90, 0x07, 0xe0, 0x08, 0x7e, 0x05, 0x46, 0x40, 0x1c, 0xc0, 0xb2, + 0x00, 0x90, 0x00, 0x98, 0x85, 0x42, 0x4c, 0xda, 0xb1, 0x6b, 0x88, 0x7e, + 0x00, 0x28, 0x06, 0xbf, 0x06, 0xeb, 0x85, 0x01, 0x8c, 0x6a, 0x74, 0x6a, + 0x4f, 0xf0, 0x02, 0x0b, 0x04, 0xf5, 0xf4, 0x74, 0x02, 0x27, 0x4f, 0xf0, + 0x01, 0x08, 0x4f, 0xf0, 0x01, 0x09, 0x00, 0xf0, 0xac, 0xf8, 0x06, 0xf1, + 0x3c, 0x00, 0x0a, 0xeb, 0x48, 0x0a, 0x50, 0xf8, 0x25, 0x10, 0xca, 0x44, + 0x4f, 0xfa, 0x8a, 0xfa, 0x01, 0xf1, 0x3c, 0x02, 0xdf, 0xed, 0xb4, 0x0a, + 0x9f, 0xed, 0xb4, 0x0a, 0x02, 0xeb, 0x8a, 0x00, 0xfb, 0xf7, 0x12, 0xfa, + 0xf1, 0x6c, 0x51, 0xf8, 0x25, 0x20, 0x42, 0xea, 0x40, 0x12, 0x41, 0xf8, + 0x25, 0x20, 0x06, 0xf1, 0x3c, 0x00, 0xdf, 0xed, 0x7f, 0x0a, 0x50, 0xf8, + 0x25, 0x10, 0x01, 0xf1, 0x3c, 0x02, 0x02, 0xeb, 0x8a, 0x00, 0xa9, 0xf1, + 0x01, 0x09, 0x90, 0xed, 0x00, 0x0a, 0x00, 0xf0, 0x15, 0xf8, 0xc4, 0xed, + 0x00, 0x0a, 0xd0, 0xd5, 0xb8, 0xf1, 0x01, 0x08, 0xcb, 0xd5, 0x7f, 0x1e, + 0xc7, 0xd5, 0xbb, 0xf1, 0x01, 0x0b, 0xc3, 0xd5, 0x00, 0x20, 0x6d, 0x1c, + 0x20, 0x60, 0xed, 0xb2, 0xaf, 0xe7, 0xbd, 0xe8, 0xf1, 0x8f, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0xc6, 0x60, 0xee, 0x20, 0x0a, 0x4f, 0xfa, 0x89, 0xf1, + 0xfd, 0xee, 0xe0, 0x0a, 0x00, 0x29, 0x70, 0x47, 0x2d, 0xe9, 0xfe, 0x4f, + 0x06, 0x46, 0xf1, 0x6c, 0x91, 0xf8, 0x24, 0x00, 0xc2, 0x06, 0x02, 0xd4, + 0x08, 0x7c, 0x01, 0x28, 0x57, 0xd1, 0xb2, 0x6b, 0xd0, 0x7e, 0x18, 0xb9, + 0x04, 0x20, 0x00, 0x25, 0x01, 0x90, 0x07, 0xe0, 0x08, 0x7e, 0x05, 0x46, + 0x40, 0x1c, 0xc0, 0xb2, 0x01, 0x90, 0x01, 0x98, 0x85, 0x42, 0x48, 0xda, + 0xb1, 0x6b, 0xc8, 0x7e, 0x06, 0xeb, 0x85, 0x04, 0x00, 0x28, 0x0c, 0xbf, + 0xa0, 0x6a, 0x70, 0x6a, 0x00, 0xf5, 0xf8, 0x70, 0x4f, 0xf0, 0x02, 0x0b, + 0x00, 0x90, 0x02, 0x27, 0x4f, 0xf0, 0x01, 0x08, 0x4f, 0xf0, 0x01, 0x09, + 0x00, 0xf0, 0x37, 0xf8, 0x0a, 0xeb, 0x48, 0x0a, 0xca, 0x44, 0xe1, 0x6b, + 0x4f, 0xfa, 0x8a, 0xfa, 0x01, 0xeb, 0x8a, 0x02, 0xf5, 0xee, 0x00, 0x0a, + 0x9f, 0xed, 0x7c, 0x0a, 0x02, 0xf1, 0xcc, 0x00, 0xfb, 0xf7, 0xa0, 0xf9, + 0xf1, 0x6c, 0x51, 0xf8, 0x25, 0x20, 0x42, 0xea, 0x80, 0x12, 0x41, 0xf8, + 0x25, 0x20, 0xa9, 0xf1, 0x01, 0x09, 0xe0, 0x6b, 0x00, 0xeb, 0x8a, 0x01, + 0x00, 0x98, 0x91, 0xed, 0x33, 0x0a, 0x4f, 0xfa, 0x89, 0xf1, 0xbf, 0xee, + 0xc8, 0x0a, 0x00, 0x29, 0x80, 0xed, 0x00, 0x0a, 0xd6, 0xd5, 0xb8, 0xf1, + 0x01, 0x08, 0xd1, 0xd5, 0x7f, 0x1e, 0xcd, 0xd5, 0xbb, 0xf1, 0x01, 0x0b, + 0xc9, 0xd5, 0x00, 0x20, 0x00, 0x99, 0x6d, 0x1c, 0x08, 0x60, 0xed, 0xb2, + 0xb3, 0xe7, 0xbd, 0xe8, 0xf7, 0x8f, 0x4f, 0xf0, 0x0c, 0x0a, 0xb8, 0x00, + 0x0a, 0xfb, 0x0b, 0x0a, 0x70, 0x47, 0x00, 0x00, 0x41, 0x6a, 0x80, 0x6b, + 0x90, 0xed, 0x11, 0x0a, 0xdf, 0xed, 0x31, 0x0a, 0x01, 0xf5, 0xfc, 0x71, + 0x60, 0xee, 0x20, 0x0a, 0xfd, 0xee, 0xe0, 0x0a, 0xc1, 0xed, 0x00, 0x0a, + 0x90, 0xed, 0x11, 0x1a, 0xbf, 0xee, 0xc8, 0x1a, 0x81, 0xed, 0x00, 0x1a, + 0x00, 0x20, 0x08, 0x60, 0x70, 0x47, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, + 0x00, 0xf0, 0x4e, 0xf8, 0x82, 0x06, 0x02, 0xd4, 0x08, 0x7c, 0x01, 0x28, + 0x3f, 0xd1, 0xba, 0x6b, 0x10, 0x7f, 0x10, 0xb9, 0x00, 0x25, 0x04, 0x24, + 0x05, 0xe0, 0x0c, 0x7e, 0x25, 0x46, 0x64, 0x1c, 0xe4, 0xb2, 0xa5, 0x42, + 0x33, 0xda, 0xb9, 0x6b, 0x08, 0x7f, 0x07, 0xeb, 0x85, 0x08, 0x00, 0x28, + 0x0c, 0xbf, 0xd8, 0xf8, 0x28, 0x90, 0xd7, 0xf8, 0x24, 0x90, 0x4f, 0xf0, + 0x02, 0x0a, 0x09, 0xf5, 0x04, 0x79, 0x02, 0x26, 0x00, 0xf0, 0x8e, 0xf8, + 0xf5, 0xee, 0x00, 0x0a, 0x9f, 0xed, 0x43, 0x0a, 0x02, 0xf5, 0xae, 0x70, + 0xfb, 0xf7, 0x2c, 0xf9, 0xf9, 0x6c, 0x51, 0xf8, 0x25, 0x20, 0x42, 0xea, + 0xc0, 0x12, 0x41, 0xf8, 0x25, 0x20, 0x76, 0x1e, 0xd8, 0xf8, 0x3c, 0x00, + 0x00, 0xeb, 0x8b, 0x01, 0x70, 0xb2, 0x91, 0xed, 0x57, 0x0a, 0xbf, 0xee, + 0xc8, 0x0a, 0x00, 0x28, 0x89, 0xed, 0x00, 0x0a, 0xe0, 0xd5, 0xba, 0xf1, + 0x01, 0x0a, 0xdc, 0xd5, 0x00, 0xf0, 0x76, 0xf8, 0xc9, 0xe7, 0xbd, 0xe8, + 0xf1, 0x8f, 0x00, 0x00, 0x00, 0xfc, 0x7f, 0xbe, 0x00, 0xfc, 0x7f, 0x3e, + 0x00, 0x00, 0x80, 0xc7, 0x07, 0x46, 0xf9, 0x6c, 0x91, 0xf8, 0x24, 0x00, + 0x70, 0x47, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0xff, 0xf7, 0xf6, 0xff, + 0x42, 0x06, 0x02, 0xd4, 0x08, 0x7c, 0x01, 0x28, 0x45, 0xd1, 0xba, 0x6b, + 0x92, 0xf8, 0x20, 0x00, 0x10, 0xb9, 0x00, 0x25, 0x04, 0x24, 0x05, 0xe0, + 0x0c, 0x7e, 0x25, 0x46, 0x64, 0x1c, 0xe4, 0xb2, 0xa5, 0x42, 0x38, 0xda, + 0xb9, 0x6b, 0x91, 0xf8, 0x20, 0x00, 0x07, 0xeb, 0x85, 0x08, 0x00, 0x28, + 0x0c, 0xbf, 0xd8, 0xf8, 0x28, 0x90, 0xd7, 0xf8, 0x24, 0x90, 0x4f, 0xf0, + 0x02, 0x0a, 0x09, 0xf5, 0x06, 0x79, 0x02, 0x26, 0x00, 0xf0, 0x34, 0xf8, + 0xdf, 0xed, 0x14, 0x0a, 0x9f, 0xed, 0x14, 0x0a, 0x02, 0xf5, 0xc0, 0x70, + 0xfb, 0xf7, 0xd2, 0xf8, 0xf9, 0x6c, 0x51, 0xf8, 0x25, 0x20, 0x42, 0xea, + 0x00, 0x22, 0x41, 0xf8, 0x25, 0x20, 0xdf, 0xed, 0x11, 0x0a, 0xd8, 0xf8, + 0x3c, 0x00, 0x00, 0xeb, 0x8b, 0x01, 0x76, 0x1e, 0x91, 0xed, 0x60, 0x0a, + 0x60, 0xee, 0x20, 0x0a, 0x70, 0xb2, 0xfd, 0xee, 0xe0, 0x0a, 0x00, 0x28, + 0xc9, 0xed, 0x00, 0x0a, 0xdc, 0xd5, 0xba, 0xf1, 0x01, 0x0a, 0xd8, 0xd5, + 0x00, 0xf0, 0x18, 0xf8, 0xc4, 0xe7, 0xbd, 0xe8, 0xf1, 0x8f, 0x00, 0x00, + 0x00, 0xfe, 0xff, 0xc2, 0x00, 0xfe, 0xff, 0x42, 0xc0, 0xff, 0x7f, 0x40, + 0x80, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x80, 0xc7, 0x0a, 0xeb, 0x4a, 0x0b, + 0xb3, 0x44, 0xd8, 0xf8, 0x3c, 0x10, 0x4f, 0xfa, 0x8b, 0xfb, 0x01, 0xeb, + 0x8b, 0x02, 0x70, 0x47, 0x00, 0x20, 0x6d, 0x1c, 0xc9, 0xf8, 0x00, 0x00, + 0xed, 0xb2, 0x70, 0x47, 0x10, 0xb5, 0x42, 0x6a, 0x01, 0x69, 0x13, 0x68, + 0x01, 0xf1, 0x14, 0x04, 0xc3, 0xf3, 0x11, 0x03, 0x23, 0x60, 0x12, 0x7a, + 0x02, 0xf0, 0x1f, 0x02, 0x41, 0xf8, 0x10, 0x2f, 0xbd, 0xe8, 0x10, 0x40, + 0x3e, 0xe0, 0x10, 0xb5, 0x01, 0x46, 0x01, 0x20, 0x00, 0x22, 0x0b, 0x79, + 0xd3, 0x40, 0xdc, 0x07, 0x08, 0xd5, 0x01, 0xeb, 0x82, 0x03, 0x5c, 0x69, + 0x54, 0xf8, 0x08, 0x3f, 0x43, 0xea, 0x53, 0x03, 0xdb, 0x07, 0x03, 0xd4, + 0x52, 0x1c, 0x04, 0x2a, 0xef, 0xd3, 0x10, 0xbd, 0x00, 0x20, 0x10, 0xbd, + 0x00, 0x69, 0x00, 0x21, 0x40, 0xf8, 0x04, 0x1f, 0x01, 0x22, 0x02, 0x60, + 0x70, 0x47, 0x42, 0x79, 0x81, 0x6a, 0x02, 0x2a, 0x08, 0xd1, 0x42, 0x78, + 0x52, 0x1c, 0x0a, 0x71, 0x81, 0x78, 0x82, 0x6a, 0x49, 0x1c, 0x51, 0x71, + 0x00, 0x21, 0x10, 0xe0, 0x03, 0x2a, 0x09, 0xd1, 0x42, 0x78, 0x52, 0x1c, + 0x0a, 0x71, 0x81, 0x78, 0x82, 0x6a, 0x49, 0x1c, 0x51, 0x71, 0xc1, 0x78, + 0x49, 0x1c, 0x04, 0xe0, 0x00, 0x22, 0x0a, 0x71, 0x00, 0x21, 0x82, 0x6a, + 0x51, 0x71, 0x80, 0x6a, 0x81, 0x71, 0x70, 0x47, 0x10, 0xb5, 0x81, 0x6a, + 0x4c, 0x79, 0x0a, 0x79, 0x89, 0x79, 0x00, 0x69, 0x24, 0x02, 0x02, 0xf0, + 0x07, 0x03, 0x04, 0xf4, 0xe0, 0x64, 0x12, 0x04, 0x23, 0x43, 0x02, 0xf4, + 0xe0, 0x22, 0x09, 0x06, 0x1a, 0x43, 0x01, 0xf0, 0xe0, 0x61, 0x0a, 0x43, + 0x62, 0xf0, 0x8f, 0x32, 0x40, 0xf8, 0x0c, 0x2f, 0x10, 0xbd, 0xf8, 0xb5, + 0x04, 0x46, 0x2d, 0xed, 0x02, 0x8b, 0x62, 0x6a, 0x53, 0x7a, 0x97, 0x7a, + 0xa0, 0x6a, 0x05, 0x79, 0x41, 0x79, 0x86, 0x79, 0xfb, 0x18, 0xdb, 0x05, + 0x57, 0x79, 0x1b, 0x0e, 0x01, 0x2f, 0x40, 0xd1, 0xd2, 0x79, 0x00, 0xee, + 0x10, 0x3a, 0x83, 0x78, 0x9a, 0x42, 0xb8, 0xee, 0x40, 0x8a, 0x17, 0xd2, + 0x01, 0x71, 0x00, 0x21, 0xa0, 0x6a, 0x45, 0x71, 0x00, 0xf0, 0x36, 0xf8, + 0x02, 0xeb, 0x83, 0x07, 0x10, 0x31, 0x87, 0xed, 0x00, 0x8a, 0x43, 0x79, + 0x02, 0xeb, 0x83, 0x07, 0x87, 0xed, 0x00, 0x8a, 0x82, 0x79, 0x01, 0xeb, + 0x82, 0x00, 0x80, 0xed, 0x00, 0x8a, 0x20, 0x46, 0xff, 0xf7, 0xb6, 0xff, + 0x61, 0x6a, 0xa0, 0x6a, 0xca, 0x79, 0xc1, 0x78, 0x8a, 0x42, 0x1a, 0xd2, + 0x06, 0x71, 0x00, 0x21, 0xa0, 0x6a, 0x85, 0x71, 0x00, 0xf0, 0x18, 0xf8, + 0x02, 0xeb, 0x83, 0x05, 0x10, 0x31, 0x85, 0xed, 0x00, 0x8a, 0x43, 0x79, + 0x02, 0xeb, 0x83, 0x05, 0x85, 0xed, 0x00, 0x8a, 0x80, 0x79, 0x01, 0xeb, + 0x80, 0x02, 0x20, 0x46, 0x82, 0xed, 0x00, 0x8a, 0xbd, 0xec, 0x02, 0x8b, + 0xbd, 0xe8, 0xf2, 0x40, 0x94, 0xe7, 0xbd, 0xec, 0x02, 0x8b, 0xf1, 0xbd, + 0xa0, 0x6a, 0x81, 0x70, 0xa0, 0x6a, 0xc1, 0x70, 0xa0, 0x6a, 0xe1, 0x6a, + 0x03, 0x79, 0x01, 0xf1, 0x10, 0x02, 0x70, 0x47, 0x70, 0xb5, 0x41, 0x6a, + 0x0a, 0x79, 0x01, 0x2a, 0x40, 0xf0, 0xa6, 0x80, 0x4c, 0x7a, 0x89, 0x7a, + 0x09, 0x19, 0xc9, 0x05, 0x00, 0x22, 0x00, 0x23, 0x09, 0x0e, 0x00, 0x24, + 0x05, 0x79, 0xe5, 0x40, 0xee, 0x07, 0x09, 0xd5, 0x00, 0xeb, 0x84, 0x05, + 0x6d, 0x69, 0x05, 0xf1, 0x20, 0x06, 0x24, 0x35, 0x36, 0x68, 0x2d, 0x68, + 0xb2, 0x18, 0xeb, 0x18, 0x64, 0x1c, 0x04, 0x2c, 0xee, 0xd3, 0x00, 0xee, + 0x10, 0x2a, 0x82, 0x6a, 0x44, 0x6a, 0x52, 0x79, 0x94, 0xed, 0x03, 0x1a, + 0x84, 0x79, 0x00, 0xee, 0x90, 0x3a, 0xc3, 0x6a, 0xb8, 0xee, 0xc0, 0x0a, + 0x01, 0xee, 0x90, 0x4a, 0x03, 0xf1, 0x10, 0x05, 0x20, 0xee, 0x01, 0x0a, + 0xf8, 0xee, 0x61, 0x1a, 0x05, 0xeb, 0x82, 0x06, 0xc0, 0xee, 0x21, 0x1a, + 0x00, 0xf0, 0x77, 0xf8, 0x31, 0xee, 0x80, 0x0a, 0x82, 0xed, 0x00, 0x0a, + 0xb8, 0xee, 0xe0, 0x0a, 0x84, 0x6a, 0xa2, 0x79, 0x44, 0x6a, 0xc3, 0x6a, + 0xd4, 0xed, 0x03, 0x0a, 0x84, 0x79, 0x01, 0xee, 0x10, 0x4a, 0x03, 0xf1, + 0x10, 0x05, 0x20, 0xee, 0x20, 0x0a, 0xb8, 0xee, 0x41, 0x1a, 0x05, 0xeb, + 0x82, 0x06, 0x80, 0xee, 0x01, 0x1a, 0x00, 0xf0, 0x5c, 0xf8, 0x31, 0xee, + 0x00, 0x0a, 0x82, 0xed, 0x00, 0x0a, 0x00, 0xee, 0x90, 0x1a, 0x84, 0x6a, + 0x41, 0x6a, 0x62, 0x79, 0xc3, 0x6a, 0x03, 0xf1, 0x10, 0x04, 0x04, 0xeb, + 0x82, 0x05, 0x4c, 0x7a, 0x95, 0xed, 0x00, 0x0a, 0x00, 0xf0, 0x5d, 0xf8, + 0xf8, 0xee, 0x60, 0x0a, 0x0e, 0xd5, 0x00, 0xf0, 0x76, 0xf8, 0x5a, 0x79, + 0x00, 0xf0, 0x4e, 0xf8, 0x4b, 0x79, 0x52, 0xf8, 0x23, 0x20, 0x00, 0x2a, + 0x46, 0xbf, 0x8a, 0x78, 0x52, 0x1c, 0x00, 0x22, 0x8a, 0x70, 0x08, 0xe0, + 0x00, 0xf0, 0x52, 0xf8, 0x05, 0xd5, 0x00, 0xf0, 0x59, 0xf8, 0x5a, 0x79, + 0x00, 0xf0, 0x35, 0xf8, 0x93, 0x70, 0x41, 0x79, 0x03, 0x29, 0x25, 0xd1, + 0x81, 0x6a, 0xc3, 0x6a, 0x8a, 0x79, 0x03, 0xf1, 0x10, 0x01, 0x01, 0xeb, + 0x82, 0x04, 0x41, 0x6a, 0x94, 0xed, 0x00, 0x0a, 0x4c, 0x7a, 0x00, 0xf0, + 0x32, 0xf8, 0x0e, 0xd5, 0x00, 0xf0, 0x4d, 0xf8, 0x9a, 0x79, 0x00, 0xf0, + 0x25, 0xf8, 0x8b, 0x79, 0x52, 0xf8, 0x23, 0x20, 0x00, 0x2a, 0x46, 0xbf, + 0xca, 0x78, 0x52, 0x1c, 0x00, 0x22, 0xca, 0x70, 0x08, 0xe0, 0x00, 0xf0, + 0x29, 0xf8, 0x05, 0xd5, 0x00, 0xf0, 0x30, 0xf8, 0x9a, 0x79, 0x00, 0xf0, + 0x0c, 0xf8, 0xd3, 0x70, 0x00, 0x21, 0x00, 0x69, 0x40, 0xf8, 0x04, 0x1f, + 0x70, 0xbd, 0x10, 0x33, 0x96, 0xed, 0x00, 0x0a, 0x03, 0xeb, 0x82, 0x02, + 0x70, 0x47, 0x01, 0xeb, 0x82, 0x01, 0x00, 0x23, 0xc1, 0xed, 0x00, 0x0a, + 0x82, 0x6a, 0x70, 0x47, 0x01, 0xeb, 0x82, 0x01, 0xc1, 0xed, 0x00, 0x0a, + 0x81, 0x6a, 0xc2, 0x6a, 0x70, 0x47, 0x01, 0xee, 0x10, 0x4a, 0xb8, 0xee, + 0x41, 0x1a, 0xb4, 0xee, 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x70, 0x47, + 0x8c, 0x7a, 0x01, 0xee, 0x10, 0x4a, 0xb8, 0xee, 0x41, 0x1a, 0xb4, 0xee, + 0x40, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x70, 0x47, 0x53, 0xf8, 0x22, 0x50, + 0xc9, 0x7a, 0x69, 0x18, 0x43, 0xf8, 0x22, 0x10, 0xc2, 0x6a, 0x83, 0x6a, + 0x02, 0xf1, 0x10, 0x01, 0x70, 0x47, 0x53, 0xf8, 0x22, 0x50, 0xc9, 0x7a, + 0x6d, 0x1a, 0x43, 0xf8, 0x22, 0x50, 0xc2, 0x6a, 0x83, 0x6a, 0x02, 0xf1, + 0x10, 0x01, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46, 0xa0, 0x6a, 0xc1, 0x79, + 0x01, 0x29, 0x1e, 0xbf, 0x60, 0x6a, 0x01, 0x79, 0x01, 0x29, 0x40, 0xf0, + 0x85, 0x80, 0xe1, 0x68, 0x00, 0x20, 0x01, 0xf8, 0x39, 0x0f, 0xe0, 0x6a, + 0x41, 0x68, 0x7f, 0x29, 0x04, 0xdd, 0x7f, 0x21, 0x41, 0x60, 0x00, 0xf0, + 0x96, 0xf8, 0x03, 0xe0, 0x00, 0x29, 0x44, 0xbf, 0x00, 0x21, 0x41, 0x60, + 0xe0, 0x6a, 0x01, 0x79, 0xe0, 0x68, 0x01, 0xf0, 0x7f, 0x01, 0x00, 0xf8, + 0x2e, 0x1f, 0xe0, 0x6a, 0x81, 0x68, 0x7f, 0x29, 0x04, 0xdd, 0x7f, 0x21, + 0x81, 0x60, 0x00, 0xf0, 0x82, 0xf8, 0x03, 0xe0, 0x00, 0x29, 0x44, 0xbf, + 0x00, 0x21, 0x81, 0x60, 0xe0, 0x6a, 0x01, 0x7a, 0xe0, 0x68, 0x01, 0xf0, + 0x7f, 0x01, 0x00, 0xf8, 0x2f, 0x1f, 0xe0, 0x6a, 0xc1, 0x68, 0x7f, 0x29, + 0x04, 0xdd, 0x7f, 0x21, 0xc1, 0x60, 0x00, 0xf0, 0x6e, 0xf8, 0x03, 0xe0, + 0x00, 0x29, 0x44, 0xbf, 0x00, 0x21, 0xc1, 0x60, 0xe0, 0x6a, 0x01, 0x7b, + 0xe0, 0x68, 0x01, 0xf0, 0x7f, 0x01, 0x00, 0xf8, 0x30, 0x1f, 0x01, 0x21, + 0xe0, 0x68, 0x00, 0xf8, 0x39, 0x1f, 0x60, 0x6a, 0x41, 0x7a, 0x82, 0x7a, + 0x00, 0xee, 0x10, 0x1a, 0xe1, 0x6a, 0xf8, 0xee, 0x40, 0x0a, 0x01, 0xee, + 0x10, 0x2a, 0xb8, 0xee, 0x41, 0x0a, 0x01, 0xf1, 0x14, 0x00, 0xfa, 0xf7, + 0x81, 0xfe, 0x00, 0xf0, 0x38, 0xf8, 0xa1, 0x68, 0x90, 0xed, 0x05, 0x0a, + 0x11, 0xf8, 0xdc, 0x2f, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, + 0x02, 0xf0, 0xe0, 0x02, 0x00, 0xf0, 0x1f, 0x00, 0x10, 0x43, 0x08, 0x70, + 0x00, 0xf0, 0x2e, 0xf8, 0x01, 0xf1, 0x18, 0x00, 0xfa, 0xf7, 0x6a, 0xfe, + 0x00, 0xf0, 0x21, 0xf8, 0x90, 0xed, 0x06, 0x0a, 0x00, 0xf0, 0x15, 0xf8, + 0x00, 0xf8, 0xdb, 0x1f, 0x00, 0xf0, 0x20, 0xf8, 0x01, 0xf1, 0x1c, 0x00, + 0xfa, 0xf7, 0x5c, 0xfe, 0x00, 0xf0, 0x13, 0xf8, 0x90, 0xed, 0x07, 0x0a, + 0x00, 0xf0, 0x07, 0xf8, 0x00, 0xf8, 0xda, 0x1f, 0x20, 0x46, 0xbd, 0xe8, + 0x10, 0x40, 0x22, 0xe6, 0x10, 0xbd, 0xa0, 0x68, 0xbd, 0xee, 0xc0, 0x0a, + 0x10, 0xee, 0x10, 0x1a, 0x01, 0xf0, 0x1f, 0x01, 0x70, 0x47, 0xa1, 0x6a, + 0x0a, 0x78, 0x42, 0xea, 0x40, 0x02, 0x0a, 0x70, 0xe0, 0x6a, 0x70, 0x47, + 0x60, 0x6a, 0x41, 0x7a, 0x80, 0x7a, 0x00, 0xee, 0x10, 0x1a, 0xe1, 0x6a, + 0xf8, 0xee, 0x40, 0x0a, 0x01, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x41, 0x0a, + 0x70, 0x47, 0xa0, 0x6a, 0x01, 0x78, 0x41, 0xf0, 0x01, 0x01, 0x01, 0x70, + 0x70, 0x47, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x9c, 0x05, 0x9d, 0x06, 0x9e, + 0x05, 0x60, 0x02, 0x61, 0x81, 0x60, 0x02, 0xf1, 0x90, 0x05, 0xe0, 0x32, + 0x02, 0x63, 0x05, 0x62, 0x01, 0xf5, 0x98, 0x72, 0x42, 0x62, 0x01, 0xf1, + 0x28, 0x05, 0x01, 0xf5, 0xe2, 0x71, 0x03, 0xf5, 0x13, 0x62, 0x41, 0x63, + 0x82, 0x62, 0x03, 0xf5, 0x7c, 0x61, 0x04, 0xf1, 0x38, 0x02, 0x81, 0x63, + 0xc2, 0x61, 0x46, 0x60, 0x45, 0x61, 0xc4, 0x60, 0x04, 0xf5, 0x9c, 0x71, + 0x04, 0xf5, 0xcc, 0x72, 0x83, 0x61, 0xc1, 0x62, 0xc2, 0x63, 0x70, 0xbd, + 0x2d, 0xe9, 0xfb, 0x4f, 0x80, 0x46, 0x00, 0xf0, 0x65, 0xfa, 0x08, 0xf1, + 0x28, 0x00, 0x00, 0xf0, 0x9f, 0xfa, 0x08, 0xf5, 0x98, 0x70, 0x00, 0xf0, + 0x27, 0xfb, 0x08, 0xf5, 0xe2, 0x70, 0x00, 0xf0, 0x8b, 0xfb, 0x9d, 0xf8, + 0x08, 0x00, 0xdf, 0xf8, 0x68, 0xb7, 0x88, 0xf8, 0x0f, 0x00, 0x08, 0xf5, + 0xaa, 0x75, 0x9d, 0xf8, 0x08, 0x00, 0x10, 0x28, 0x08, 0xf2, 0x35, 0x19, + 0x08, 0xf1, 0x5c, 0x07, 0x08, 0xf1, 0x3c, 0x04, 0x08, 0xf1, 0x84, 0x06, + 0x08, 0xf1, 0x26, 0x0a, 0x51, 0xd1, 0x00, 0xf0, 0x7f, 0xf9, 0x00, 0xf0, + 0x7f, 0xf9, 0x4f, 0xf6, 0xf7, 0x72, 0x00, 0xf0, 0xc4, 0xf9, 0x00, 0x23, + 0xdf, 0xf8, 0x30, 0x17, 0xdf, 0xf8, 0x30, 0x27, 0xe1, 0x60, 0xc4, 0xf8, + 0x10, 0xb0, 0x62, 0x61, 0xc4, 0xf8, 0x18, 0xb0, 0x00, 0x21, 0xe1, 0x61, + 0x39, 0x70, 0x00, 0xf0, 0x37, 0xf9, 0x7b, 0x70, 0xdf, 0xf8, 0x18, 0x17, + 0x01, 0xeb, 0x40, 0x00, 0xb0, 0xf8, 0x18, 0x21, 0x3a, 0x81, 0xb0, 0xf8, + 0x20, 0x11, 0x79, 0x81, 0xb0, 0xf8, 0x28, 0x21, 0xba, 0x81, 0xb0, 0xf8, + 0x30, 0x11, 0xf9, 0x81, 0xb0, 0xf8, 0x38, 0x21, 0x3a, 0x82, 0xb0, 0xf8, + 0x40, 0x11, 0x79, 0x82, 0x64, 0x21, 0xb0, 0xf8, 0x48, 0x21, 0xba, 0x82, + 0xfb, 0x82, 0x13, 0x22, 0x89, 0xf8, 0x00, 0x20, 0x01, 0x23, 0xeb, 0x76, + 0xa9, 0x76, 0x69, 0x76, 0x2b, 0x76, 0x6b, 0x77, 0x2b, 0x77, 0x04, 0x22, + 0x89, 0xf8, 0x1e, 0x20, 0x18, 0x21, 0x29, 0x60, 0x1d, 0x22, 0x1c, 0x23, + 0xaa, 0x60, 0x00, 0x21, 0x6b, 0x60, 0xe9, 0x60, 0xb0, 0xf8, 0x38, 0x21, + 0x2a, 0x82, 0xb0, 0xf8, 0x40, 0x11, 0x69, 0x82, 0xb0, 0xf8, 0x48, 0x01, + 0xe0, 0xe0, 0x0f, 0x28, 0x53, 0xd1, 0x00, 0xf0, 0x2b, 0xf9, 0x00, 0xf0, + 0x2b, 0xf9, 0x4f, 0xf6, 0xdf, 0x72, 0x00, 0xf0, 0x70, 0xf9, 0x01, 0x23, + 0xdf, 0xf8, 0x94, 0x16, 0xdf, 0xf8, 0x94, 0x26, 0xe1, 0x60, 0x22, 0x61, + 0xc4, 0xf8, 0x14, 0xb0, 0x00, 0x22, 0xdf, 0xf8, 0x7c, 0x16, 0xa1, 0x61, + 0xe2, 0x61, 0x0f, 0x21, 0xdf, 0xf8, 0x74, 0x26, 0x39, 0x70, 0x79, 0x70, + 0x00, 0xf0, 0xde, 0xf8, 0x02, 0xeb, 0x40, 0x00, 0xb0, 0xf8, 0xe0, 0x10, + 0x39, 0x81, 0xb0, 0xf8, 0xe8, 0x20, 0x7a, 0x81, 0xb0, 0xf8, 0xf0, 0x10, + 0xb9, 0x81, 0xb0, 0xf8, 0xf8, 0x20, 0xfa, 0x81, 0xb0, 0xf8, 0x00, 0x11, + 0x39, 0x82, 0xb0, 0xf8, 0x08, 0x21, 0x7a, 0x82, 0x00, 0x22, 0xb0, 0xf8, + 0x10, 0x11, 0xb9, 0x82, 0xfa, 0x82, 0x13, 0x21, 0x89, 0xf8, 0x00, 0x10, + 0x64, 0x22, 0xeb, 0x76, 0xaa, 0x76, 0x6a, 0x76, 0x2b, 0x76, 0x6b, 0x77, + 0x2b, 0x77, 0x04, 0x21, 0x89, 0xf8, 0x1e, 0x10, 0x18, 0x22, 0x2a, 0x60, + 0x1d, 0x21, 0x1c, 0x23, 0xa9, 0x60, 0x00, 0x22, 0x6b, 0x60, 0xea, 0x60, + 0xb0, 0xf8, 0x00, 0x11, 0x29, 0x82, 0xb0, 0xf8, 0x08, 0x21, 0x6a, 0x82, + 0xb0, 0xf8, 0x10, 0x01, 0x8a, 0xe0, 0x08, 0x28, 0x23, 0xd1, 0x00, 0xf0, + 0xd5, 0xf8, 0x00, 0xf0, 0x47, 0xf9, 0xb0, 0xf8, 0xa8, 0x20, 0x3a, 0x81, + 0xb0, 0xf8, 0xb0, 0x10, 0x79, 0x81, 0xb0, 0xf8, 0xb8, 0x20, 0xba, 0x81, + 0xb0, 0xf8, 0xc0, 0x10, 0xf9, 0x81, 0xb0, 0xf8, 0xc8, 0x20, 0x3a, 0x82, + 0xb0, 0xf8, 0xd0, 0x10, 0x79, 0x82, 0x64, 0x21, 0xb0, 0xf8, 0xd8, 0x20, + 0x00, 0xf0, 0x73, 0xf8, 0xb0, 0xf8, 0xc8, 0x20, 0x2a, 0x82, 0xb0, 0xf8, + 0xd0, 0x10, 0x69, 0x82, 0xb0, 0xf8, 0xd8, 0x00, 0x64, 0xe0, 0x07, 0x28, + 0x27, 0xd1, 0x00, 0xf0, 0xaf, 0xf8, 0x00, 0xf0, 0xd3, 0xf8, 0x32, 0x23, + 0x73, 0x70, 0x00, 0xf0, 0x7e, 0xf8, 0xb0, 0xf8, 0x70, 0x10, 0x39, 0x81, + 0xb0, 0xf8, 0x78, 0x20, 0x7a, 0x81, 0xb0, 0xf8, 0x80, 0x10, 0xb9, 0x81, + 0xb0, 0xf8, 0x88, 0x20, 0xfa, 0x81, 0xb0, 0xf8, 0x90, 0x10, 0x39, 0x82, + 0xb0, 0xf8, 0x98, 0x20, 0x7a, 0x82, 0x00, 0x22, 0xb0, 0xf8, 0xa0, 0x10, + 0x00, 0xf0, 0xa1, 0xf8, 0xb0, 0xf8, 0x90, 0x10, 0x29, 0x82, 0xb0, 0xf8, + 0x98, 0x20, 0x6a, 0x82, 0xb0, 0xf8, 0xa0, 0x00, 0x3a, 0xe0, 0x06, 0x28, + 0x01, 0x98, 0x1b, 0xd1, 0x00, 0xf0, 0x87, 0xfa, 0x00, 0xf0, 0xf6, 0xf8, + 0x02, 0x8f, 0x3a, 0x81, 0xb0, 0xf8, 0x40, 0x10, 0x79, 0x81, 0x30, 0xf8, + 0x48, 0x2f, 0xba, 0x81, 0x01, 0x89, 0xf9, 0x81, 0x02, 0x8a, 0x3a, 0x82, + 0x01, 0x8b, 0x79, 0x82, 0x64, 0x21, 0x02, 0x8c, 0x00, 0xf0, 0x27, 0xf8, + 0x02, 0x8a, 0x2a, 0x82, 0x01, 0x8b, 0x69, 0x82, 0x00, 0x8c, 0x1b, 0xe0, + 0x00, 0xf0, 0x6b, 0xfa, 0x00, 0xf0, 0x8c, 0xf8, 0x71, 0x70, 0x00, 0xf0, + 0x38, 0xf8, 0x01, 0x88, 0x39, 0x81, 0x02, 0x89, 0x7a, 0x81, 0x01, 0x8a, + 0xb9, 0x81, 0x02, 0x8b, 0xfa, 0x81, 0x01, 0x8c, 0x39, 0x82, 0x02, 0x8d, + 0x7a, 0x82, 0x00, 0x22, 0x01, 0x8e, 0x00, 0xf0, 0x62, 0xf8, 0x01, 0x8c, + 0x29, 0x82, 0x02, 0x8d, 0x6a, 0x82, 0x00, 0x8e, 0xa8, 0x82, 0x00, 0x21, + 0xe9, 0x82, 0xbd, 0xe8, 0xf7, 0x8f, 0xba, 0x82, 0xfb, 0x82, 0x13, 0x22, + 0x89, 0xf8, 0x00, 0x20, 0x01, 0x23, 0xeb, 0x76, 0xa9, 0x76, 0x69, 0x76, + 0x2b, 0x76, 0x6b, 0x77, 0x2b, 0x77, 0x04, 0x22, 0x89, 0xf8, 0x1e, 0x20, + 0x18, 0x21, 0x29, 0x60, 0x1d, 0x23, 0x00, 0x21, 0x6b, 0x60, 0xab, 0x60, + 0xe9, 0x60, 0x70, 0x47, 0xb9, 0x70, 0xf9, 0x70, 0x39, 0x71, 0x79, 0x71, + 0xb9, 0x71, 0xf9, 0x71, 0x70, 0x47, 0xb1, 0x70, 0xf1, 0x70, 0x31, 0x72, + 0x71, 0x72, 0xb1, 0x72, 0xf1, 0x72, 0xdf, 0xf8, 0xa0, 0x34, 0xdf, 0xf8, + 0xa0, 0x14, 0xdf, 0xf8, 0xa0, 0x24, 0x21, 0x60, 0x63, 0x60, 0xa2, 0x60, + 0x01, 0x23, 0xdf, 0xf8, 0x84, 0x14, 0xdf, 0xf8, 0x84, 0x24, 0xe1, 0x60, + 0x22, 0x61, 0xc4, 0xf8, 0x14, 0xb0, 0x00, 0x22, 0xdf, 0xf8, 0x68, 0x14, + 0xa1, 0x61, 0xe2, 0x61, 0x0f, 0x21, 0xdf, 0xf8, 0x64, 0x24, 0x39, 0x70, + 0x79, 0x70, 0xb9, 0x70, 0xf9, 0x70, 0x39, 0x71, 0x79, 0x71, 0xb9, 0x71, + 0xf9, 0x71, 0x02, 0xeb, 0x40, 0x00, 0x70, 0x47, 0x01, 0x98, 0x00, 0xe2, + 0x00, 0x21, 0x88, 0xf8, 0x1f, 0x10, 0x06, 0x22, 0x88, 0xf8, 0x1e, 0x20, + 0x0c, 0x21, 0x08, 0x23, 0x8a, 0xf8, 0x00, 0x10, 0x8a, 0xf8, 0x01, 0x30, + 0x70, 0x47, 0xb9, 0x82, 0xfa, 0x82, 0x13, 0x21, 0x89, 0xf8, 0x00, 0x10, + 0x64, 0x22, 0xeb, 0x76, 0xaa, 0x76, 0x6a, 0x76, 0x2b, 0x76, 0x6b, 0x77, + 0x2b, 0x77, 0x04, 0x21, 0x89, 0xf8, 0x1e, 0x10, 0x18, 0x22, 0x2a, 0x60, + 0x1d, 0x23, 0x00, 0x22, 0x6b, 0x60, 0xab, 0x60, 0xea, 0x60, 0x70, 0x47, + 0x00, 0x21, 0x88, 0xf8, 0x1f, 0x10, 0x06, 0x22, 0x88, 0xf8, 0x1e, 0x20, + 0x0c, 0x21, 0x08, 0x23, 0x8a, 0xf8, 0x00, 0x10, 0x8a, 0xf8, 0x01, 0x30, + 0x4f, 0xf6, 0xdf, 0x72, 0xa8, 0xf8, 0x24, 0x20, 0x13, 0x21, 0x8a, 0xf8, + 0x0c, 0x10, 0x05, 0x22, 0x8a, 0xf8, 0x0b, 0x20, 0x64, 0x21, 0x31, 0x74, + 0x71, 0x74, 0xb1, 0x74, 0xb1, 0x73, 0xf1, 0x73, 0x31, 0x73, 0x71, 0x73, + 0x19, 0x22, 0x32, 0x71, 0x71, 0x71, 0xb1, 0x71, 0xf1, 0x71, 0x32, 0x70, + 0x70, 0x47, 0xa8, 0xf8, 0x24, 0x20, 0x13, 0x21, 0x8a, 0xf8, 0x0c, 0x10, + 0x05, 0x22, 0x8a, 0xf8, 0x0b, 0x20, 0x0a, 0x21, 0x31, 0x74, 0x71, 0x74, + 0xb1, 0x74, 0x64, 0x22, 0xb2, 0x73, 0xf2, 0x73, 0x64, 0x21, 0x0a, 0x22, + 0x32, 0x73, 0x72, 0x73, 0x32, 0x71, 0x72, 0x71, 0xb2, 0x71, 0xf2, 0x71, + 0x32, 0x70, 0x72, 0x70, 0xb2, 0x70, 0xf2, 0x70, 0x31, 0x72, 0x71, 0x72, + 0xb1, 0x72, 0xf1, 0x72, 0xdf, 0xf8, 0x80, 0x33, 0xdf, 0xf8, 0x80, 0x13, + 0xdf, 0xf8, 0x80, 0x23, 0x21, 0x60, 0x63, 0x60, 0xa2, 0x60, 0x70, 0x47, + 0x00, 0x21, 0x88, 0xf8, 0x1f, 0x10, 0x06, 0x22, 0x88, 0xf8, 0x1e, 0x20, + 0x0c, 0x21, 0x08, 0x23, 0x8a, 0xf8, 0x00, 0x10, 0x8a, 0xf8, 0x01, 0x30, + 0x4f, 0xf6, 0xf7, 0x72, 0xa8, 0xf8, 0x24, 0x20, 0x13, 0x21, 0x8a, 0xf8, + 0x0c, 0x10, 0x05, 0x22, 0x8a, 0xf8, 0x0b, 0x20, 0x64, 0x21, 0x31, 0x74, + 0x71, 0x74, 0xb1, 0x74, 0xb1, 0x73, 0xf1, 0x73, 0x31, 0x73, 0x71, 0x73, + 0x19, 0x22, 0x32, 0x71, 0x71, 0x71, 0xb1, 0x71, 0xf1, 0x71, 0x32, 0x70, + 0x71, 0x70, 0xb1, 0x70, 0xf1, 0x70, 0x31, 0x72, 0x71, 0x72, 0xb1, 0x72, + 0xf1, 0x72, 0xdf, 0xf8, 0x18, 0x33, 0xdf, 0xf8, 0x18, 0x13, 0xdf, 0xf8, + 0x18, 0x23, 0x21, 0x60, 0x63, 0x60, 0xa2, 0x60, 0x00, 0x23, 0xdf, 0xf8, + 0xf0, 0x12, 0xdf, 0xf8, 0xf0, 0x22, 0xe1, 0x60, 0xc4, 0xf8, 0x10, 0xb0, + 0x62, 0x61, 0xc4, 0xf8, 0x18, 0xb0, 0x00, 0x21, 0xe1, 0x61, 0x39, 0x70, + 0xb9, 0x70, 0xf9, 0x70, 0x39, 0x71, 0x79, 0x71, 0xb9, 0x71, 0xf9, 0x71, + 0x7b, 0x70, 0xdf, 0xf8, 0xd0, 0x12, 0x01, 0xeb, 0x40, 0x00, 0x70, 0x47, + 0x30, 0xb5, 0x4f, 0xf0, 0xff, 0x33, 0x03, 0x60, 0x6f, 0xf0, 0x70, 0x44, + 0x00, 0x23, 0x44, 0x60, 0x83, 0x72, 0x00, 0x24, 0x03, 0x23, 0x44, 0x72, + 0x03, 0x72, 0x84, 0x73, 0x01, 0x23, 0x02, 0x24, 0x43, 0x73, 0x03, 0x73, + 0x84, 0x74, 0x05, 0x25, 0x03, 0x23, 0x00, 0x24, 0xc5, 0x72, 0xc3, 0x74, + 0x04, 0x74, 0x01, 0x23, 0x01, 0x24, 0x00, 0x25, 0x43, 0x74, 0x04, 0x75, + 0xc5, 0x76, 0x85, 0x76, 0x45, 0x76, 0xff, 0x23, 0x03, 0x24, 0x04, 0x25, + 0x01, 0x2a, 0x83, 0x75, 0x43, 0x75, 0x44, 0x77, 0x05, 0x77, 0x01, 0x62, + 0x08, 0xd1, 0x00, 0x21, 0x01, 0x74, 0x04, 0x72, 0x01, 0x22, 0x02, 0x21, + 0xc4, 0x74, 0x42, 0x74, 0x81, 0x74, 0x30, 0xbd, 0x32, 0xb9, 0x01, 0x22, + 0x02, 0x21, 0x05, 0x72, 0x02, 0x74, 0x41, 0x74, 0x83, 0x74, 0xc3, 0x74, + 0x30, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x00, 0x21, 0x01, 0x60, 0x01, 0x22, + 0x8d, 0x49, 0x42, 0x60, 0x13, 0x23, 0xc1, 0x60, 0x03, 0x72, 0x0f, 0x22, + 0x00, 0xf1, 0x4c, 0x01, 0x02, 0x74, 0x0c, 0x23, 0xcb, 0x70, 0x8b, 0x70, + 0x4b, 0x70, 0x0b, 0x70, 0x06, 0x24, 0x08, 0x23, 0x0b, 0x71, 0x05, 0x22, + 0x02, 0x23, 0x4c, 0x71, 0xca, 0x72, 0x8b, 0x72, 0x4a, 0x72, 0x0b, 0x72, + 0xca, 0x73, 0x8b, 0x73, 0x4a, 0x73, 0x0b, 0x73, 0x00, 0xf1, 0x70, 0x01, + 0x20, 0x22, 0x8a, 0x70, 0x9f, 0xed, 0x66, 0x0a, 0x28, 0x22, 0x0a, 0x70, + 0x18, 0x23, 0x4f, 0xf0, 0x7c, 0x52, 0x8a, 0x60, 0x81, 0xed, 0x03, 0x0a, + 0x81, 0xed, 0x04, 0x0a, 0x81, 0xed, 0x09, 0x0a, 0x81, 0xed, 0x0a, 0x0a, + 0x81, 0xed, 0x0b, 0x0a, 0x4b, 0x70, 0x9f, 0xed, 0x6f, 0x0a, 0x7c, 0x4a, + 0x7c, 0x4b, 0xca, 0x61, 0x81, 0xed, 0x0c, 0x0a, 0x81, 0xed, 0x0d, 0x0a, + 0x00, 0x24, 0xdf, 0xed, 0x6b, 0x0a, 0x79, 0x4a, 0x4c, 0x60, 0x9f, 0xed, + 0x6a, 0x0a, 0xc1, 0xed, 0x05, 0x0a, 0xc1, 0xed, 0x06, 0x0a, 0x0c, 0x62, + 0x8a, 0x63, 0xcb, 0x63, 0x81, 0xed, 0x10, 0x0a, 0x81, 0xed, 0x11, 0x0a, + 0x81, 0xed, 0x12, 0x0a, 0xcc, 0x64, 0x0c, 0x65, 0x4c, 0x65, 0x00, 0xf1, + 0xc8, 0x01, 0xa6, 0x23, 0x4b, 0x80, 0x50, 0x22, 0x4b, 0x23, 0x8b, 0x81, + 0x0a, 0x80, 0x55, 0x23, 0x04, 0x22, 0x0b, 0x82, 0x4a, 0x72, 0x0a, 0x72, + 0x5f, 0x23, 0x9f, 0xed, 0x5b, 0x0a, 0xcc, 0x80, 0x8c, 0x80, 0xcc, 0x72, + 0x8c, 0x72, 0xcc, 0x81, 0x4c, 0x82, 0xcc, 0x82, 0x8b, 0x82, 0x81, 0xed, + 0x06, 0x0a, 0x81, 0xed, 0x07, 0x0a, 0x81, 0xed, 0x08, 0x0a, 0x81, 0xed, + 0x09, 0x0a, 0x01, 0x22, 0x80, 0xf8, 0xf3, 0x20, 0x4f, 0xf4, 0x00, 0x63, + 0x0b, 0x85, 0x42, 0xf2, 0x10, 0x71, 0x40, 0xf8, 0xf4, 0x1f, 0xb6, 0xee, + 0x04, 0x0a, 0x80, 0xed, 0x01, 0x0a, 0x80, 0xed, 0x02, 0x0a, 0x80, 0xed, + 0x03, 0x0a, 0x80, 0xed, 0x04, 0x0a, 0x10, 0xbd, 0x10, 0xb5, 0x00, 0x21, + 0x01, 0x60, 0x01, 0x22, 0x13, 0x21, 0x01, 0x71, 0xc2, 0x71, 0x00, 0x21, + 0x7d, 0x22, 0xc1, 0x73, 0x81, 0x73, 0x41, 0x73, 0x01, 0x73, 0x81, 0x74, + 0x41, 0x74, 0x01, 0x74, 0x81, 0x75, 0x41, 0x75, 0x01, 0x75, 0xc1, 0x76, + 0x81, 0x76, 0x41, 0x76, 0x01, 0x76, 0x41, 0x77, 0x01, 0x77, 0x80, 0xf8, + 0x20, 0x10, 0x82, 0x60, 0x01, 0x23, 0x00, 0xf1, 0x44, 0x01, 0x83, 0x71, + 0xc3, 0x74, 0xc3, 0x77, 0x83, 0x77, 0x80, 0xf8, 0x21, 0x30, 0x4f, 0xf0, + 0x87, 0x42, 0x0a, 0x60, 0x40, 0xf2, 0x4c, 0x44, 0x40, 0x4b, 0x41, 0x4a, + 0x4b, 0x60, 0x8a, 0x60, 0x00, 0x23, 0x4f, 0xf4, 0x16, 0x72, 0xcb, 0x60, + 0x0a, 0x82, 0x05, 0x23, 0x03, 0x22, 0x4b, 0x75, 0x0a, 0x75, 0x4f, 0xf4, + 0xaf, 0x63, 0x4f, 0xf4, 0x96, 0x72, 0x4b, 0x83, 0x0a, 0x83, 0x9f, 0xed, + 0x2a, 0x0a, 0x38, 0x4a, 0x38, 0x4b, 0x4a, 0x62, 0x8b, 0x62, 0x4c, 0x82, + 0x37, 0x4a, 0x38, 0x4b, 0x81, 0xed, 0x07, 0x0a, 0x81, 0xed, 0x08, 0x0a, + 0xca, 0x62, 0x0b, 0x63, 0x78, 0x30, 0x11, 0x21, 0xc1, 0x70, 0x08, 0x22, + 0x01, 0x21, 0x82, 0x70, 0x01, 0x70, 0x4f, 0xf4, 0x7a, 0x62, 0x4f, 0xf4, + 0x7a, 0x71, 0x82, 0x60, 0xc1, 0x60, 0x01, 0x22, 0x4f, 0xf4, 0x80, 0x61, + 0xc2, 0x74, 0x01, 0x82, 0x0e, 0x23, 0x42, 0xf2, 0x10, 0x72, 0x2b, 0x49, + 0x43, 0x60, 0x42, 0x61, 0x81, 0x61, 0x10, 0xbd, 0x78, 0xcc, 0x2b, 0x32, + 0x4f, 0xf4, 0x80, 0x31, 0x01, 0x60, 0x02, 0x22, 0x00, 0x23, 0xc2, 0x71, + 0x83, 0x71, 0x43, 0x71, 0x03, 0x71, 0xc3, 0x72, 0x83, 0x72, 0x43, 0x72, + 0x03, 0x72, 0xc3, 0x60, 0x70, 0x47, 0x21, 0x49, 0x88, 0x42, 0x01, 0xd2, + 0x00, 0x20, 0x70, 0x47, 0x1f, 0x49, 0x88, 0x42, 0x01, 0xd2, 0x01, 0x20, + 0x70, 0x47, 0x1e, 0x49, 0x88, 0x42, 0x01, 0xd2, 0x02, 0x20, 0x70, 0x47, + 0x03, 0x20, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x37, 0x86, 0xb5, + 0x00, 0xe7, 0xdb, 0x2e, 0xff, 0xe6, 0x5b, 0x2e, 0xc1, 0x37, 0x06, 0x36, + 0x60, 0x70, 0x89, 0x30, 0x9f, 0xf7, 0xf0, 0x00, 0x9f, 0xf3, 0xff, 0x00, + 0x9f, 0x17, 0x10, 0x00, 0x34, 0x25, 0x00, 0x02, 0x9f, 0x03, 0xf0, 0x00, + 0x9f, 0xf7, 0xff, 0x00, 0x0c, 0x02, 0xc0, 0x00, 0x08, 0x00, 0x80, 0x40, + 0x0e, 0x03, 0xe0, 0x00, 0x0b, 0xec, 0x2f, 0xad, 0x78, 0xcc, 0x2b, 0xb2, + 0x95, 0xbf, 0xd6, 0xb3, 0xcd, 0xbc, 0x8c, 0x2b, 0x52, 0x25, 0x34, 0x28, + 0x95, 0xbf, 0xd6, 0x33, 0x00, 0x00, 0x40, 0x40, 0x00, 0xec, 0x2f, 0x2d, + 0x00, 0xec, 0x2f, 0xad, 0x9d, 0x3a, 0xa4, 0x3b, 0xc1, 0xc6, 0x2d, 0x00, + 0x01, 0x09, 0x3d, 0x00, 0x41, 0x4b, 0x4c, 0x00, 0x70, 0xb5, 0x04, 0x9c, + 0x05, 0x9d, 0x06, 0x9e, 0x05, 0x60, 0x81, 0x60, 0x46, 0x60, 0x28, 0x31, + 0x41, 0x61, 0xc4, 0x60, 0x04, 0xf1, 0x38, 0x01, 0x02, 0x61, 0x83, 0x61, + 0xc1, 0x61, 0x70, 0xbd, 0x2d, 0xe9, 0xf0, 0x47, 0x04, 0x46, 0x15, 0x46, + 0x00, 0xf0, 0x5b, 0xf8, 0x04, 0xf1, 0x28, 0x00, 0x00, 0xf0, 0x7c, 0xf8, + 0xe5, 0x73, 0x04, 0xf1, 0x26, 0x03, 0x00, 0x25, 0xe5, 0x77, 0x4f, 0xf6, + 0xff, 0x7a, 0x03, 0x25, 0xa5, 0x77, 0x04, 0xf1, 0x5c, 0x00, 0x0a, 0x25, + 0x1d, 0x70, 0x5d, 0x70, 0x04, 0xf1, 0x3c, 0x01, 0x04, 0xf1, 0x84, 0x02, + 0xa4, 0xf8, 0x24, 0xa0, 0x13, 0x24, 0x05, 0x25, 0x1c, 0x73, 0xdd, 0x72, + 0x64, 0x23, 0x4f, 0xf4, 0x00, 0x66, 0x4f, 0xf4, 0x80, 0x67, 0xdf, 0xf8, + 0x20, 0xc2, 0xdf, 0xf8, 0x20, 0xe2, 0xdf, 0xf8, 0x20, 0x82, 0xdf, 0xf8, + 0x20, 0x92, 0x13, 0x74, 0x53, 0x74, 0x93, 0x74, 0x93, 0x73, 0xd3, 0x73, + 0x13, 0x73, 0x53, 0x73, 0x13, 0x71, 0x53, 0x71, 0x93, 0x71, 0xd3, 0x71, + 0x13, 0x70, 0x53, 0x70, 0x93, 0x70, 0xd3, 0x70, 0x13, 0x72, 0x53, 0x72, + 0x93, 0x72, 0xd3, 0x72, 0x00, 0x22, 0xc1, 0xf8, 0x00, 0x90, 0xc1, 0xf8, + 0x04, 0x80, 0xc1, 0xf8, 0x08, 0xe0, 0xc1, 0xf8, 0x0c, 0xc0, 0x0a, 0x61, + 0x4a, 0x61, 0x8a, 0x61, 0xca, 0x61, 0x07, 0x81, 0x47, 0x81, 0x86, 0x81, + 0xc6, 0x81, 0x02, 0x70, 0x42, 0x70, 0x82, 0x70, 0xc2, 0x70, 0x02, 0x71, + 0x42, 0x71, 0x82, 0x71, 0xc2, 0x71, 0x02, 0x82, 0x42, 0x82, 0x82, 0x82, + 0xc2, 0x82, 0xbd, 0xe8, 0xf0, 0x87, 0x10, 0xb5, 0x4f, 0xf0, 0xff, 0x32, + 0x02, 0x60, 0x6f, 0xf0, 0x70, 0x43, 0x05, 0x22, 0x02, 0x72, 0x43, 0x60, + 0x03, 0x22, 0xc2, 0x74, 0x01, 0x23, 0x01, 0x22, 0x42, 0x74, 0x03, 0x73, + 0xff, 0x22, 0x82, 0x75, 0x42, 0x75, 0x02, 0x75, 0x00, 0x24, 0xc4, 0x72, + 0x84, 0x72, 0x44, 0x72, 0x84, 0x73, 0x44, 0x73, 0x02, 0x23, 0x04, 0x74, + 0xc4, 0x76, 0x84, 0x76, 0x44, 0x76, 0x44, 0x77, 0x01, 0x22, 0x83, 0x74, + 0x02, 0x77, 0x01, 0x62, 0x10, 0xbd, 0x00, 0x00, 0x30, 0xb5, 0x00, 0x21, + 0x01, 0x60, 0x41, 0x60, 0x13, 0x23, 0x5a, 0x49, 0xc1, 0x60, 0x03, 0x72, + 0x0e, 0x22, 0x00, 0xf1, 0x34, 0x01, 0x02, 0x74, 0x0c, 0x23, 0x00, 0x22, + 0x0a, 0x76, 0xcb, 0x76, 0x8b, 0x76, 0x4b, 0x76, 0x08, 0x22, 0x06, 0x23, + 0x0a, 0x77, 0x4b, 0x77, 0x00, 0xf1, 0x54, 0x02, 0x05, 0x23, 0xd3, 0x70, + 0x02, 0x24, 0x00, 0x23, 0x94, 0x70, 0x53, 0x70, 0x13, 0x70, 0x20, 0x24, + 0x02, 0x23, 0x93, 0x71, 0x13, 0x71, 0x94, 0x77, 0x18, 0x23, 0x28, 0x24, + 0x53, 0x77, 0x14, 0x77, 0x00, 0x23, 0x49, 0x4c, 0x13, 0x62, 0x54, 0x62, + 0x93, 0x62, 0x93, 0x63, 0x13, 0x64, 0xd3, 0x64, 0x13, 0x65, 0x9f, 0xed, + 0x3c, 0x0a, 0x45, 0x4c, 0x45, 0x4b, 0xd4, 0x63, 0x53, 0x65, 0x82, 0xed, + 0x0b, 0x0a, 0x82, 0xed, 0x11, 0x0a, 0x82, 0xed, 0x12, 0x0a, 0x05, 0x25, + 0xdf, 0xed, 0x36, 0x0a, 0x40, 0x4c, 0x00, 0x23, 0x9f, 0xed, 0x35, 0x0a, + 0xd5, 0x71, 0x55, 0x71, 0xc2, 0xed, 0x0c, 0x0a, 0xc2, 0xed, 0x0d, 0x0a, + 0x94, 0x65, 0xd3, 0x65, 0x04, 0x24, 0x13, 0x66, 0x53, 0x66, 0x82, 0xed, + 0x1a, 0x0a, 0x82, 0xed, 0x1b, 0x0a, 0x82, 0xed, 0x1c, 0x0a, 0x00, 0xf1, + 0xc8, 0x02, 0xd4, 0x72, 0x94, 0x72, 0x53, 0x80, 0x00, 0x24, 0x54, 0x72, + 0x13, 0x80, 0x4b, 0x24, 0xd4, 0x81, 0x14, 0x23, 0x55, 0x24, 0x93, 0x80, + 0x54, 0x82, 0x29, 0x25, 0x00, 0x23, 0x5f, 0x24, 0x9f, 0xed, 0x24, 0x0a, + 0xd5, 0x80, 0x13, 0x72, 0x93, 0x81, 0x13, 0x82, 0xd4, 0x82, 0x93, 0x82, + 0x93, 0x61, 0x82, 0xed, 0x07, 0x0a, 0x82, 0xed, 0x08, 0x0a, 0x82, 0xed, + 0x09, 0x0a, 0x80, 0xf8, 0xf3, 0x30, 0x42, 0xf2, 0x10, 0x74, 0x4f, 0xf4, + 0x00, 0x63, 0x13, 0x85, 0x00, 0xf1, 0xf4, 0x02, 0xb6, 0xee, 0x04, 0x0a, + 0x14, 0x60, 0x82, 0xed, 0x01, 0x0a, 0x82, 0xed, 0x02, 0x0a, 0x82, 0xed, + 0x03, 0x0a, 0x82, 0xed, 0x04, 0x0a, 0x17, 0x4a, 0x15, 0x4c, 0x42, 0x61, + 0x84, 0x61, 0x13, 0x4a, 0x11, 0x4c, 0xc2, 0x61, 0x04, 0x62, 0x00, 0x22, + 0x42, 0x62, 0x82, 0x62, 0xc2, 0x62, 0x02, 0x63, 0x4f, 0xf4, 0x80, 0x60, + 0x0a, 0x70, 0x4a, 0x70, 0x8a, 0x70, 0xca, 0x70, 0x0a, 0x71, 0x4a, 0x71, + 0x8a, 0x71, 0xca, 0x71, 0x08, 0x81, 0x48, 0x81, 0x8b, 0x81, 0xcb, 0x81, + 0x0a, 0x82, 0x4a, 0x82, 0x8a, 0x82, 0xca, 0x82, 0x30, 0xbd, 0x00, 0x00, + 0x78, 0xcc, 0x2b, 0x32, 0x00, 0xe7, 0xdb, 0x2e, 0xff, 0xe6, 0x5b, 0x2e, + 0xc1, 0x37, 0x06, 0x36, 0x2e, 0x0b, 0xc0, 0x00, 0x0e, 0x03, 0xc0, 0x00, + 0x0c, 0x03, 0xc0, 0x00, 0x08, 0x03, 0x80, 0x78, 0x2e, 0xeb, 0xe0, 0x00, + 0xf4, 0x04, 0x35, 0x3f, 0x0b, 0xec, 0x2f, 0xad, 0x95, 0xbf, 0xd6, 0xb3, + 0x78, 0xcc, 0x2b, 0xb2, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x78, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x70, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x01, 0x22, 0x40, 0x1e, + 0x82, 0x40, 0x50, 0x1e, 0x40, 0xb2, 0xc1, 0x42, 0xbc, 0xbf, 0x01, 0x46, + 0x49, 0x42, 0x4a, 0xb2, 0x90, 0x42, 0xb8, 0xbf, 0x01, 0x46, 0x48, 0xb2, + 0x70, 0x47, 0xdf, 0xf8, 0x84, 0x1a, 0x08, 0x56, 0x70, 0x47, 0xdf, 0xf8, + 0x7c, 0x2a, 0x11, 0x54, 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, 0x3a, 0xf8, + 0x00, 0xf0, 0x62, 0xf9, 0xbd, 0xe8, 0x10, 0x40, 0x7f, 0x22, 0x00, 0x21, + 0xca, 0x30, 0xcf, 0xe7, 0x10, 0xb5, 0x00, 0xf0, 0x2f, 0xf8, 0x00, 0xf0, + 0x57, 0xf9, 0xbd, 0xe8, 0x10, 0x40, 0x7f, 0x22, 0x00, 0x21, 0xcd, 0x30, + 0xc4, 0xe7, 0xdf, 0xf8, 0x4c, 0x1a, 0x51, 0xf8, 0x20, 0x00, 0xca, 0x30, + 0x00, 0x78, 0x00, 0xf0, 0x7f, 0x00, 0x42, 0x06, 0x48, 0xbf, 0x60, 0xf0, + 0x7f, 0x00, 0x40, 0xb2, 0x70, 0x47, 0xdf, 0xf8, 0x30, 0x1a, 0x51, 0xf8, + 0x20, 0x00, 0xcd, 0x30, 0x00, 0x78, 0x00, 0xf0, 0x7f, 0x00, 0x42, 0x06, + 0x48, 0xbf, 0x60, 0xf0, 0x7f, 0x00, 0x40, 0xb2, 0x70, 0x47, 0x10, 0xb5, + 0x00, 0xf0, 0x08, 0xf8, 0x00, 0xf0, 0x30, 0xf9, 0xbd, 0xe8, 0x10, 0x40, + 0x7f, 0x22, 0x00, 0x21, 0xcc, 0x30, 0x9d, 0xe7, 0x04, 0x46, 0x07, 0x20, + 0xa8, 0xe7, 0x10, 0xb5, 0xff, 0xf7, 0xfa, 0xff, 0x00, 0xf0, 0x22, 0xf9, + 0xbd, 0xe8, 0x10, 0x40, 0x7f, 0x22, 0x00, 0x21, 0xcf, 0x30, 0x8f, 0xe7, + 0xdf, 0xf8, 0xe0, 0x19, 0x51, 0xf8, 0x20, 0x00, 0xcc, 0x30, 0x00, 0x78, + 0x00, 0xf0, 0x7f, 0x00, 0x42, 0x06, 0x48, 0xbf, 0x60, 0xf0, 0x7f, 0x00, + 0x40, 0xb2, 0x70, 0x47, 0xdf, 0xf8, 0xc4, 0x19, 0x51, 0xf8, 0x20, 0x00, + 0xcf, 0x30, 0x00, 0x78, 0x00, 0xf0, 0x7f, 0x00, 0x42, 0x06, 0x48, 0xbf, + 0x60, 0xf0, 0x7f, 0x00, 0x40, 0xb2, 0x70, 0x47, 0x10, 0xb5, 0xff, 0xf7, + 0xd3, 0xff, 0x00, 0xf0, 0xfb, 0xf8, 0xbd, 0xe8, 0x10, 0x40, 0x7f, 0x22, + 0x00, 0x21, 0xcb, 0x30, 0x68, 0xe7, 0x10, 0xb5, 0xff, 0xf7, 0xc8, 0xff, + 0x00, 0xf0, 0xf0, 0xf8, 0xbd, 0xe8, 0x10, 0x40, 0x7f, 0x22, 0x00, 0x21, + 0xce, 0x30, 0x5d, 0xe7, 0xdf, 0xf8, 0x7c, 0x19, 0x51, 0xf8, 0x20, 0x00, + 0xcb, 0x30, 0x00, 0x78, 0x00, 0xf0, 0x7f, 0x00, 0x42, 0x06, 0x48, 0xbf, + 0x60, 0xf0, 0x7f, 0x00, 0x40, 0xb2, 0x70, 0x47, 0xdf, 0xf8, 0x60, 0x19, + 0x51, 0xf8, 0x20, 0x00, 0xce, 0x30, 0x00, 0x78, 0x00, 0xf0, 0x7f, 0x00, + 0x42, 0x06, 0x48, 0xbf, 0x60, 0xf0, 0x7f, 0x00, 0x40, 0xb2, 0x70, 0x47, + 0xdf, 0xf8, 0x44, 0x19, 0x51, 0xf8, 0x20, 0x00, 0xc3, 0x30, 0x00, 0x78, + 0x00, 0xf0, 0x3f, 0x00, 0x82, 0x06, 0x48, 0xbf, 0x60, 0xf0, 0x3f, 0x00, + 0x40, 0xb2, 0x70, 0x47, 0xdf, 0xf8, 0x28, 0x19, 0x51, 0xf8, 0x20, 0x00, + 0xc5, 0x30, 0x00, 0x78, 0x00, 0xf0, 0x3f, 0x00, 0x82, 0x06, 0x48, 0xbf, + 0x60, 0xf0, 0x3f, 0x00, 0x40, 0xb2, 0x70, 0x47, 0xdf, 0xf8, 0x0c, 0x19, + 0x51, 0xf8, 0x20, 0x00, 0xc4, 0x30, 0x00, 0x78, 0x00, 0xf0, 0x3f, 0x00, + 0x82, 0x06, 0x48, 0xbf, 0x60, 0xf0, 0x3f, 0x00, 0x40, 0xb2, 0x70, 0x47, + 0xdf, 0xf8, 0xf0, 0x18, 0x51, 0xf8, 0x20, 0x00, 0xc6, 0x30, 0x00, 0x78, + 0x00, 0xf0, 0x3f, 0x00, 0x82, 0x06, 0x48, 0xbf, 0x60, 0xf0, 0x3f, 0x00, + 0x40, 0xb2, 0x70, 0x47, 0x70, 0xb5, 0x00, 0xf0, 0x30, 0xf8, 0x00, 0xf0, + 0x0e, 0xf8, 0x00, 0xf0, 0x23, 0xf8, 0x04, 0xf1, 0xc5, 0x00, 0xff, 0xf7, + 0xff, 0xfe, 0xeb, 0xb2, 0x04, 0xf1, 0xc6, 0x00, 0xbd, 0xe8, 0x70, 0x40, + 0x3f, 0x22, 0x00, 0xf0, 0xb1, 0xbf, 0x06, 0x46, 0x29, 0x46, 0x06, 0x20, + 0x00, 0xe7, 0x70, 0xb5, 0x00, 0xf0, 0x19, 0xf8, 0xff, 0xf7, 0xf7, 0xff, + 0x00, 0xf0, 0x0c, 0xf8, 0x04, 0xf1, 0xc3, 0x00, 0xff, 0xf7, 0xe8, 0xfe, + 0xeb, 0xb2, 0x04, 0xf1, 0xc4, 0x00, 0xbd, 0xe8, 0x70, 0x40, 0x3f, 0x22, + 0x00, 0xf0, 0x9a, 0xbf, 0x05, 0x46, 0xdf, 0xf8, 0x80, 0x08, 0x50, 0xf8, + 0x24, 0x40, 0xf3, 0xb2, 0x3f, 0x22, 0x00, 0x21, 0x70, 0x47, 0x04, 0x46, + 0x15, 0x46, 0x06, 0x20, 0xe0, 0xe6, 0xdf, 0xf8, 0x68, 0x18, 0x51, 0xf8, + 0x20, 0x00, 0xef, 0x30, 0x00, 0x78, 0x00, 0xf0, 0x1f, 0x00, 0xc2, 0x06, + 0x48, 0xbf, 0x60, 0xf0, 0x1f, 0x00, 0x40, 0xb2, 0x70, 0x47, 0xdf, 0xf8, + 0x4c, 0x18, 0x51, 0xf8, 0x20, 0x00, 0xf2, 0x30, 0x00, 0x78, 0x00, 0xf0, + 0x1f, 0x00, 0xc2, 0x06, 0x48, 0xbf, 0x60, 0xf0, 0x1f, 0x00, 0x40, 0xb2, + 0x70, 0x47, 0xdf, 0xf8, 0x30, 0x18, 0x51, 0xf8, 0x20, 0x00, 0xf0, 0x30, + 0x00, 0x78, 0x00, 0xf0, 0x1f, 0x00, 0xc2, 0x06, 0x48, 0xbf, 0x60, 0xf0, + 0x1f, 0x00, 0x40, 0xb2, 0x70, 0x47, 0xdf, 0xf8, 0x14, 0x18, 0x51, 0xf8, + 0x20, 0x00, 0xf3, 0x30, 0x00, 0x78, 0x00, 0xf0, 0x1f, 0x00, 0xc2, 0x06, + 0x48, 0xbf, 0x60, 0xf0, 0x1f, 0x00, 0x40, 0xb2, 0x70, 0x47, 0xdf, 0xf8, + 0xf8, 0x17, 0x51, 0xf8, 0x20, 0x00, 0xf1, 0x30, 0x00, 0x78, 0x00, 0xf0, + 0x1f, 0x00, 0xc2, 0x06, 0x48, 0xbf, 0x60, 0xf0, 0x1f, 0x00, 0x40, 0xb2, + 0x70, 0x47, 0xdf, 0xf8, 0xdc, 0x17, 0x51, 0xf8, 0x20, 0x00, 0xf4, 0x30, + 0x00, 0x78, 0x00, 0xf0, 0x1f, 0x00, 0xc2, 0x06, 0x48, 0xbf, 0x60, 0xf0, + 0x1f, 0x00, 0x40, 0xb2, 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, 0x2f, 0xf8, + 0x00, 0xf0, 0x06, 0xf8, 0xbd, 0xe8, 0x10, 0x40, 0x1f, 0x22, 0x00, 0x21, + 0x01, 0xf0, 0xa6, 0xb8, 0xc3, 0xb2, 0xdf, 0xf8, 0xa8, 0x07, 0x50, 0xf8, + 0x24, 0x00, 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, 0x1e, 0xf8, 0xff, 0xf7, + 0xf5, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x1f, 0x22, 0x00, 0x21, 0xf3, 0x30, + 0x62, 0xe6, 0x10, 0xb5, 0x00, 0xf0, 0x13, 0xf8, 0xff, 0xf7, 0xea, 0xff, + 0xbd, 0xe8, 0x10, 0x40, 0x1f, 0x22, 0x00, 0x21, 0xf4, 0x30, 0x57, 0xe6, + 0x10, 0xb5, 0x00, 0xf0, 0x08, 0xf8, 0xff, 0xf7, 0xdf, 0xff, 0xbd, 0xe8, + 0x10, 0x40, 0x1f, 0x22, 0x00, 0x21, 0x01, 0xf0, 0x74, 0xb8, 0x04, 0x46, + 0x05, 0x20, 0x57, 0xe6, 0x10, 0xb5, 0xff, 0xf7, 0xfa, 0xff, 0xff, 0xf7, + 0xd1, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x1f, 0x22, 0x00, 0x21, 0xf0, 0x30, + 0x3e, 0xe6, 0x10, 0xb5, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xf7, 0xc6, 0xff, + 0xbd, 0xe8, 0x10, 0x40, 0x1f, 0x22, 0x00, 0x21, 0xf1, 0x30, 0x33, 0xe6, + 0x70, 0xb5, 0x04, 0x46, 0x15, 0x46, 0x1e, 0x46, 0xff, 0xf7, 0xaf, 0xff, + 0x29, 0x46, 0x20, 0x46, 0xff, 0xf7, 0xbc, 0xff, 0x31, 0x46, 0x20, 0x46, + 0xbd, 0xe8, 0x70, 0x40, 0xc1, 0xe7, 0x70, 0xb5, 0x04, 0x46, 0x15, 0x46, + 0x1e, 0x46, 0xff, 0xf7, 0xc7, 0xff, 0x29, 0x46, 0x20, 0x46, 0xff, 0xf7, + 0xd1, 0xff, 0x31, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0xd6, 0xe7, + 0x38, 0xb5, 0x00, 0xf0, 0x0e, 0xf8, 0xfa, 0x35, 0x23, 0x09, 0xf0, 0x22, + 0x04, 0x21, 0x00, 0xf0, 0xe8, 0xfe, 0x23, 0x46, 0x28, 0x46, 0x01, 0xb0, + 0xbd, 0xe8, 0x30, 0x40, 0x0f, 0x22, 0x00, 0xf0, 0xbf, 0xbe, 0x0c, 0x46, + 0xdf, 0xf8, 0xc8, 0x16, 0x51, 0xf8, 0x20, 0x50, 0x70, 0x47, 0xdf, 0xf8, + 0xc0, 0x16, 0x51, 0xf8, 0x20, 0x10, 0x11, 0xf8, 0xfa, 0x0f, 0x09, 0x78, + 0x00, 0xf0, 0xf0, 0x00, 0x01, 0xf0, 0x0f, 0x01, 0x08, 0x43, 0x70, 0x47, + 0x10, 0xb5, 0x00, 0xf0, 0xdc, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, + 0x14, 0xe0, 0x10, 0xb5, 0xc9, 0x00, 0x92, 0x00, 0x02, 0x9c, 0x01, 0xf0, + 0x08, 0x01, 0x02, 0xf0, 0x04, 0x02, 0x5b, 0x00, 0x11, 0x43, 0x03, 0xf0, + 0x02, 0x03, 0x19, 0x43, 0x04, 0xf0, 0x01, 0x04, 0x44, 0xea, 0x01, 0x03, + 0x00, 0xf0, 0xc5, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0xf0, 0x22, 0x04, 0x21, + 0xfa, 0x30, 0xd1, 0xe5, 0x13, 0x46, 0xdf, 0xf8, 0x64, 0x26, 0x52, 0xf8, + 0x20, 0x00, 0x11, 0xb1, 0x01, 0x29, 0x03, 0xd0, 0x70, 0x47, 0x01, 0x22, + 0xdd, 0x30, 0x02, 0xe0, 0x01, 0x22, 0x00, 0x21, 0xed, 0x30, 0xc1, 0xe5, + 0xdf, 0xf8, 0x44, 0x36, 0x02, 0x46, 0x53, 0xf8, 0x22, 0x20, 0x00, 0x20, + 0x11, 0xb1, 0x01, 0x29, 0x02, 0xd0, 0x70, 0x47, 0xdd, 0x32, 0x00, 0xe0, + 0xed, 0x32, 0x10, 0x78, 0x00, 0xf0, 0xc8, 0xbe, 0x18, 0xb5, 0xdf, 0xf8, + 0x24, 0x16, 0x51, 0xf8, 0x20, 0x00, 0x00, 0xf1, 0x73, 0x02, 0x11, 0x78, + 0x8d, 0xf8, 0x00, 0x10, 0x0d, 0xf1, 0x02, 0x02, 0x00, 0xf1, 0x74, 0x01, + 0x09, 0x78, 0x8d, 0xf8, 0x01, 0x10, 0x00, 0xf1, 0x75, 0x01, 0x76, 0x30, + 0x09, 0x78, 0x8d, 0xf8, 0x02, 0x10, 0x00, 0x21, 0x00, 0x78, 0x8d, 0xf8, + 0x03, 0x00, 0x4b, 0x42, 0x49, 0x1c, 0xd4, 0x5c, 0x03, 0x29, 0x44, 0xea, + 0x00, 0x20, 0xf8, 0xd3, 0x12, 0xbd, 0x38, 0xb5, 0xff, 0xf7, 0x88, 0xff, + 0x05, 0xf1, 0x70, 0x04, 0x00, 0xf0, 0x1f, 0xf8, 0x00, 0xf0, 0x95, 0xfe, + 0x00, 0xf0, 0x8c, 0xfb, 0x00, 0xf0, 0x94, 0xfe, 0x05, 0xf1, 0x73, 0x00, + 0x05, 0xf1, 0x74, 0x02, 0x01, 0x78, 0x13, 0x78, 0x05, 0xf1, 0x75, 0x00, + 0x01, 0x23, 0x01, 0x78, 0x15, 0xf8, 0x76, 0x2f, 0x00, 0xf0, 0x84, 0xfe, + 0x01, 0x23, 0x00, 0xf0, 0x09, 0xf8, 0x20, 0x46, 0x01, 0xb0, 0xbd, 0xe8, + 0x30, 0x40, 0x00, 0x23, 0x10, 0x22, 0x04, 0x21, 0x68, 0xe5, 0x00, 0x23, + 0x01, 0x22, 0x00, 0x21, 0x20, 0x46, 0x63, 0xe5, 0x38, 0xb5, 0xff, 0xf7, + 0x5c, 0xff, 0x70, 0x35, 0x01, 0xf0, 0xae, 0xff, 0x00, 0xf0, 0x34, 0xfe, + 0x23, 0x46, 0x28, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x0c, 0x22, + 0x02, 0x21, 0x53, 0xe5, 0x10, 0xb5, 0x00, 0xf0, 0x3e, 0xff, 0xbd, 0xe8, + 0x10, 0x40, 0x00, 0x23, 0x20, 0x22, 0x05, 0x21, 0x70, 0x30, 0x49, 0xe5, + 0x10, 0xb5, 0x00, 0xf0, 0x34, 0xff, 0x11, 0xb1, 0x01, 0x29, 0x04, 0xd0, + 0x10, 0xbd, 0xc1, 0x30, 0x1a, 0xb9, 0x0f, 0x22, 0x09, 0xe0, 0xc2, 0x30, + 0x12, 0xb1, 0x01, 0x2a, 0x03, 0xd0, 0x10, 0xbd, 0x0f, 0x22, 0x00, 0x21, + 0x01, 0xe0, 0xf0, 0x22, 0x04, 0x21, 0xbd, 0xe8, 0x10, 0x40, 0x31, 0xe5, + 0x38, 0xb5, 0x01, 0x29, 0x04, 0x46, 0x15, 0x46, 0x06, 0xd1, 0xff, 0xf7, + 0xdb, 0xfd, 0x28, 0x70, 0x20, 0x46, 0xff, 0xf7, 0xa5, 0xfd, 0x05, 0xe0, + 0xff, 0xf7, 0xc6, 0xfd, 0x28, 0x70, 0x20, 0x46, 0xff, 0xf7, 0x90, 0xfd, + 0x68, 0x70, 0x20, 0x46, 0xff, 0xf7, 0x1d, 0xff, 0xa8, 0x70, 0x31, 0xbd, + 0x38, 0xb5, 0x15, 0x46, 0x04, 0x46, 0x95, 0xf9, 0x00, 0x00, 0x01, 0x29, + 0x01, 0x46, 0x20, 0x46, 0x07, 0xd1, 0xff, 0xf7, 0xa6, 0xfd, 0x95, 0xf9, + 0x01, 0x10, 0x20, 0x46, 0xff, 0xf7, 0x6f, 0xfd, 0x06, 0xe0, 0xff, 0xf7, + 0x93, 0xfd, 0x95, 0xf9, 0x01, 0x10, 0x20, 0x46, 0xff, 0xf7, 0x59, 0xfd, + 0xa9, 0x78, 0x20, 0x46, 0xbd, 0xe8, 0x34, 0x40, 0xe6, 0xe6, 0xdf, 0xf8, + 0xbc, 0x24, 0x52, 0xf8, 0x20, 0x00, 0x04, 0x21, 0x00, 0xf8, 0x80, 0x1f, + 0x70, 0x47, 0x00, 0x00, 0x38, 0xb5, 0x00, 0xf0, 0x5b, 0xf8, 0x00, 0xf0, + 0x53, 0xf8, 0x14, 0xd8, 0xdf, 0xe8, 0x05, 0xf0, 0x02, 0x06, 0x0a, 0x0e, + 0x01, 0xf1, 0x90, 0x02, 0x91, 0x31, 0x0a, 0xe0, 0x01, 0xf1, 0x92, 0x02, + 0x93, 0x31, 0x06, 0xe0, 0x01, 0xf1, 0x94, 0x02, 0x95, 0x31, 0x02, 0xe0, + 0x01, 0xf1, 0x96, 0x02, 0x97, 0x31, 0x00, 0xf0, 0x36, 0xf8, 0x2c, 0xe0, + 0x38, 0xb5, 0x0d, 0x46, 0x04, 0x46, 0x00, 0x21, 0xff, 0xf7, 0xde, 0xff, + 0x00, 0xf0, 0x84, 0xf8, 0x68, 0x80, 0x02, 0x21, 0x00, 0xf0, 0x82, 0xf8, + 0xa8, 0x80, 0x03, 0x21, 0x00, 0xf0, 0x7e, 0xf8, 0xe8, 0x80, 0x31, 0xbd, + 0x38, 0xb5, 0x00, 0xf0, 0x2d, 0xf8, 0x00, 0xf0, 0x25, 0xf8, 0x14, 0xd8, + 0xdf, 0xe8, 0x05, 0xf0, 0x02, 0x06, 0x0a, 0x0e, 0x01, 0xf1, 0x98, 0x02, + 0x99, 0x31, 0x0a, 0xe0, 0x01, 0xf1, 0x9a, 0x02, 0x9b, 0x31, 0x06, 0xe0, + 0x01, 0xf1, 0x9c, 0x02, 0x9d, 0x31, 0x02, 0xe0, 0x01, 0xf1, 0x9e, 0x02, + 0x9f, 0x31, 0x00, 0xf0, 0x08, 0xf8, 0x9d, 0xf8, 0x01, 0x00, 0x9d, 0xf8, + 0x00, 0x10, 0x01, 0xeb, 0x00, 0x20, 0x80, 0xb2, 0x32, 0xbd, 0x12, 0x78, + 0x8d, 0xf8, 0x00, 0x20, 0x09, 0x78, 0x8d, 0xf8, 0x01, 0x10, 0x70, 0x47, + 0xdf, 0xf8, 0xf8, 0x13, 0x51, 0xf8, 0x24, 0x10, 0x03, 0x2d, 0x70, 0x47, + 0x04, 0x46, 0x0d, 0x46, 0x02, 0x22, 0x00, 0x21, 0x68, 0x46, 0xf4, 0xf7, + 0x75, 0xbe, 0x7c, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x12, 0xb1, 0x01, 0x2a, + 0x0d, 0xd0, 0x73, 0xbd, 0x00, 0x21, 0xff, 0xf7, 0x91, 0xff, 0x00, 0xf0, + 0x37, 0xf8, 0xa8, 0x80, 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, 0xb8, 0xff, + 0x68, 0x80, 0x01, 0x21, 0x29, 0xe0, 0x02, 0x22, 0x00, 0x21, 0x68, 0x46, + 0xf4, 0xf7, 0x5c, 0xfe, 0x01, 0xf0, 0x43, 0xfd, 0x06, 0xf1, 0x94, 0x02, + 0x10, 0x78, 0x8d, 0xf8, 0x00, 0x00, 0x02, 0x22, 0x06, 0xf1, 0x95, 0x00, + 0x00, 0xf0, 0xc9, 0xf8, 0x28, 0x80, 0x00, 0x21, 0x68, 0x46, 0xf4, 0xf7, + 0x4b, 0xfe, 0x06, 0xf1, 0x96, 0x00, 0x00, 0x78, 0x8d, 0xf8, 0x00, 0x00, + 0x16, 0xf8, 0x97, 0x0f, 0x9d, 0xf8, 0x00, 0x10, 0x8d, 0xf8, 0x01, 0x00, + 0x01, 0xeb, 0x00, 0x20, 0xa8, 0x80, 0x02, 0x21, 0x20, 0x46, 0xff, 0xf7, + 0x8d, 0xff, 0x68, 0x80, 0x03, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x88, 0xff, + 0xe8, 0x80, 0x73, 0xbd, 0x28, 0x80, 0x01, 0x21, 0x20, 0x46, 0x53, 0xe7, + 0x10, 0xb5, 0x00, 0xf0, 0xfc, 0xfe, 0x04, 0xf1, 0x89, 0x00, 0x8a, 0x34, + 0x03, 0x2a, 0x10, 0xd8, 0xdf, 0xe8, 0x02, 0xf0, 0x02, 0x05, 0x08, 0x0b, + 0x0f, 0x22, 0x00, 0x21, 0x08, 0xe0, 0xf0, 0x22, 0x04, 0x21, 0x05, 0xe0, + 0x0f, 0x22, 0x00, 0x21, 0x01, 0xe0, 0xf0, 0x22, 0x04, 0x21, 0x20, 0x46, + 0xf9, 0xe6, 0x10, 0xbd, 0x38, 0xb5, 0x15, 0x46, 0x04, 0x46, 0x00, 0x22, + 0xff, 0xf7, 0xe0, 0xff, 0x29, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0x38, 0x40, + 0x01, 0x22, 0xd9, 0xe7, 0x38, 0xb5, 0x15, 0x46, 0x04, 0x46, 0x02, 0x22, + 0xff, 0xf7, 0xd4, 0xff, 0x29, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0x38, 0x40, + 0x03, 0x22, 0xcd, 0xe7, 0x0b, 0x46, 0xbb, 0x49, 0x51, 0xf8, 0x20, 0x00, + 0x03, 0x2a, 0x14, 0xd8, 0xdf, 0xe8, 0x02, 0xf0, 0x02, 0x06, 0x0a, 0x0e, + 0xff, 0x22, 0x00, 0x21, 0x85, 0x30, 0x0a, 0xe0, 0xff, 0x22, 0x00, 0x21, + 0x86, 0x30, 0x06, 0xe0, 0xff, 0x22, 0x00, 0x21, 0x87, 0x30, 0x02, 0xe0, + 0xff, 0x22, 0x00, 0x21, 0x88, 0x30, 0xff, 0xf7, 0xfb, 0xbb, 0x70, 0x47, + 0x38, 0xb5, 0x14, 0x46, 0xac, 0x4a, 0x52, 0xf8, 0x20, 0x50, 0x03, 0x2b, + 0x0f, 0xd8, 0xdf, 0xe8, 0x03, 0xf0, 0x02, 0x04, 0x06, 0x08, 0x81, 0x35, + 0x04, 0xe0, 0x82, 0x35, 0x02, 0xe0, 0x83, 0x35, 0x00, 0xe0, 0x84, 0x35, + 0x0b, 0x46, 0x70, 0x22, 0x04, 0x21, 0x00, 0xf0, 0x95, 0xbc, 0x31, 0xbd, + 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0x00, 0x23, 0xff, 0xf7, + 0xe1, 0xff, 0x01, 0x23, 0x00, 0xf0, 0x0a, 0xf8, 0x02, 0x23, 0x00, 0xf0, + 0x07, 0xf8, 0x32, 0x46, 0x29, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0x70, 0x40, + 0x03, 0x23, 0xd3, 0xe7, 0x32, 0x46, 0x29, 0x46, 0x20, 0x46, 0xcf, 0xe7, + 0x38, 0xb5, 0x00, 0xf0, 0x1d, 0xf8, 0x05, 0xf1, 0x8b, 0x00, 0xff, 0xf7, + 0xc3, 0xfb, 0x23, 0x0a, 0x05, 0xf1, 0x8c, 0x00, 0x01, 0xb0, 0xbd, 0xe8, + 0x30, 0x40, 0xff, 0x22, 0x00, 0xf0, 0x74, 0xbc, 0x38, 0xb5, 0x00, 0xf0, + 0x0d, 0xf8, 0x05, 0xf1, 0x8d, 0x00, 0xff, 0xf7, 0xb3, 0xfb, 0x23, 0x0a, + 0x05, 0xf1, 0x8e, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0xff, 0x22, + 0x00, 0xf0, 0x64, 0xbc, 0x0c, 0x46, 0xdf, 0xf8, 0xf4, 0x1a, 0x51, 0xf8, + 0x20, 0x50, 0xe3, 0xb2, 0xff, 0x22, 0x00, 0x21, 0x70, 0x47, 0x00, 0x78, + 0x9d, 0xf8, 0x00, 0x10, 0x8d, 0xf8, 0x01, 0x00, 0x01, 0xeb, 0x00, 0x20, + 0x70, 0x47, 0xdf, 0xf8, 0xd4, 0x2a, 0x52, 0xf8, 0x20, 0x00, 0x00, 0xf1, + 0x81, 0x03, 0x1a, 0x78, 0x0a, 0x70, 0x00, 0xf1, 0x85, 0x03, 0x00, 0xf1, + 0x82, 0x02, 0x12, 0x78, 0x4a, 0x70, 0x1a, 0x78, 0x8a, 0x70, 0x00, 0xf1, + 0x89, 0x03, 0x00, 0xf1, 0x86, 0x02, 0x12, 0x78, 0xca, 0x70, 0x1a, 0x78, + 0x0a, 0x71, 0x00, 0xf1, 0x8c, 0x03, 0x00, 0xf1, 0x8b, 0x02, 0x12, 0x78, + 0x4a, 0x71, 0x1a, 0x78, 0x8a, 0x71, 0x00, 0xf1, 0x8d, 0x02, 0x8e, 0x30, + 0x12, 0x78, 0xca, 0x71, 0x00, 0x78, 0x08, 0x72, 0x70, 0x47, 0x10, 0xb5, + 0xdf, 0xf8, 0x80, 0x2a, 0x52, 0xf8, 0x20, 0x00, 0x0a, 0x78, 0x00, 0xf1, + 0x81, 0x03, 0x00, 0xf1, 0x82, 0x04, 0x1a, 0x70, 0x00, 0xf1, 0x85, 0x03, + 0x4a, 0x78, 0x22, 0x70, 0x00, 0xf1, 0x86, 0x04, 0x8a, 0x78, 0x1a, 0x70, + 0x00, 0xf1, 0x89, 0x03, 0xca, 0x78, 0x22, 0x70, 0x00, 0xf1, 0x8b, 0x04, + 0x0a, 0x79, 0x1a, 0x70, 0x00, 0xf1, 0x8c, 0x03, 0x4a, 0x79, 0x22, 0x70, + 0x00, 0xf1, 0x8d, 0x04, 0x8a, 0x79, 0x1a, 0x70, 0xca, 0x79, 0x22, 0x70, + 0x09, 0x7a, 0x00, 0xf8, 0x8e, 0x1f, 0x10, 0xbd, 0x38, 0xb5, 0x01, 0x2a, + 0x0c, 0x46, 0x34, 0xd1, 0xff, 0xf7, 0x3e, 0xfd, 0x13, 0xb1, 0x01, 0x2b, + 0x17, 0xd0, 0x31, 0xbd, 0x00, 0xf0, 0x2e, 0xf8, 0x05, 0xf1, 0xe4, 0x00, + 0xff, 0xf7, 0x38, 0xfb, 0x00, 0xf0, 0x28, 0xf8, 0x05, 0xf1, 0xe5, 0x00, + 0xff, 0xf7, 0x32, 0xfb, 0x00, 0xf0, 0x22, 0xf8, 0x05, 0xf1, 0xe8, 0x00, + 0xff, 0xf7, 0x2c, 0xfb, 0x00, 0xf0, 0x1c, 0xf8, 0x05, 0xf1, 0xe9, 0x00, + 0x15, 0xe0, 0x00, 0xf0, 0x17, 0xf8, 0x05, 0xf1, 0xd4, 0x00, 0xff, 0xf7, + 0x21, 0xfb, 0x00, 0xf0, 0x11, 0xf8, 0x05, 0xf1, 0xd5, 0x00, 0xff, 0xf7, + 0x1b, 0xfb, 0x00, 0xf0, 0x0b, 0xf8, 0x05, 0xf1, 0xd8, 0x00, 0xff, 0xf7, + 0x15, 0xfb, 0x00, 0xf0, 0x05, 0xf8, 0x05, 0xf1, 0xd9, 0x00, 0x01, 0xf0, + 0x79, 0xbd, 0x31, 0xbd, 0x23, 0x46, 0x1f, 0x22, 0x00, 0x21, 0x70, 0x47, + 0x10, 0xb5, 0xdf, 0xf8, 0xb4, 0x39, 0x53, 0xf8, 0x20, 0x40, 0x01, 0xeb, + 0x42, 0x00, 0x03, 0x28, 0x5f, 0xd8, 0xdf, 0xe8, 0x00, 0xf0, 0x02, 0x19, + 0x30, 0x47, 0x00, 0xf0, 0x5f, 0xf8, 0x04, 0xf1, 0xd5, 0x00, 0xff, 0xf7, + 0xf7, 0xfa, 0x00, 0xf0, 0x59, 0xf8, 0x04, 0xf1, 0xd6, 0x00, 0xff, 0xf7, + 0xf1, 0xfa, 0x00, 0xf0, 0x53, 0xf8, 0x04, 0xf1, 0xd9, 0x00, 0xff, 0xf7, + 0xeb, 0xfa, 0x00, 0xf0, 0x4d, 0xf8, 0x04, 0xf1, 0xda, 0x00, 0x43, 0xe0, + 0x00, 0xf0, 0x48, 0xf8, 0x04, 0xf1, 0xd4, 0x00, 0xff, 0xf7, 0xe0, 0xfa, + 0x00, 0xf0, 0x42, 0xf8, 0x04, 0xf1, 0xd7, 0x00, 0xff, 0xf7, 0xda, 0xfa, + 0x00, 0xf0, 0x3c, 0xf8, 0x04, 0xf1, 0xd8, 0x00, 0xff, 0xf7, 0xd4, 0xfa, + 0x00, 0xf0, 0x36, 0xf8, 0x04, 0xf1, 0xdb, 0x00, 0x2c, 0xe0, 0x00, 0xf0, + 0x31, 0xf8, 0x04, 0xf1, 0xe5, 0x00, 0xff, 0xf7, 0xc9, 0xfa, 0x00, 0xf0, + 0x2b, 0xf8, 0x04, 0xf1, 0xe6, 0x00, 0xff, 0xf7, 0xc3, 0xfa, 0x00, 0xf0, + 0x25, 0xf8, 0x04, 0xf1, 0xe9, 0x00, 0xff, 0xf7, 0xbd, 0xfa, 0x00, 0xf0, + 0x1f, 0xf8, 0x04, 0xf1, 0xea, 0x00, 0x15, 0xe0, 0x00, 0xf0, 0x1a, 0xf8, + 0x04, 0xf1, 0xe4, 0x00, 0xff, 0xf7, 0xb2, 0xfa, 0x00, 0xf0, 0x14, 0xf8, + 0x04, 0xf1, 0xe7, 0x00, 0xff, 0xf7, 0xac, 0xfa, 0x00, 0xf0, 0x0e, 0xf8, + 0x04, 0xf1, 0xe8, 0x00, 0xff, 0xf7, 0xa6, 0xfa, 0x00, 0xf0, 0x08, 0xf8, + 0x04, 0xf1, 0xeb, 0x00, 0x6b, 0xe5, 0x10, 0xbd, 0xd4, 0x75, 0x02, 0x21, + 0x40, 0x9a, 0x04, 0x02, 0x00, 0x23, 0x1f, 0x22, 0x00, 0x21, 0x70, 0x47, + 0x2d, 0xe9, 0xf8, 0x4f, 0x81, 0x46, 0x0e, 0x46, 0xdf, 0xf8, 0xc8, 0x08, + 0x49, 0x46, 0x50, 0xf8, 0x21, 0x80, 0x30, 0x78, 0x17, 0x46, 0x08, 0xf1, + 0x08, 0x05, 0x08, 0xb9, 0x28, 0x78, 0x30, 0x70, 0x08, 0xf1, 0xfc, 0x01, + 0x1c, 0x46, 0x08, 0x78, 0x70, 0x71, 0x08, 0xf1, 0xef, 0x0a, 0x48, 0x46, + 0xff, 0xf7, 0x3c, 0xfb, 0x70, 0x70, 0x08, 0xf1, 0xf2, 0x0b, 0x48, 0x46, + 0xff, 0xf7, 0x52, 0xfb, 0xb0, 0x70, 0x48, 0x46, 0xff, 0xf7, 0x40, 0xfb, + 0xf0, 0x70, 0x48, 0x46, 0xff, 0xf7, 0x3c, 0xfb, 0x30, 0x71, 0x08, 0xf1, + 0x29, 0x01, 0x9a, 0xf8, 0x00, 0x00, 0xb0, 0x71, 0x00, 0x23, 0x9b, 0xf8, + 0x00, 0x00, 0xf0, 0x71, 0x03, 0x22, 0x08, 0xf1, 0x28, 0x00, 0x00, 0x78, + 0x30, 0x72, 0x08, 0x78, 0x70, 0x72, 0x08, 0xf1, 0x2b, 0x01, 0x08, 0xf1, + 0x2a, 0x00, 0x00, 0x78, 0xb0, 0x72, 0x08, 0x78, 0xf0, 0x72, 0x00, 0x21, + 0x08, 0xf1, 0x2c, 0x00, 0x00, 0x78, 0x30, 0x73, 0x00, 0xf0, 0x2b, 0xfb, + 0x01, 0x2c, 0x0c, 0xbf, 0x01, 0x23, 0x00, 0x23, 0x08, 0xf1, 0x20, 0x00, + 0x80, 0x22, 0x07, 0x21, 0xff, 0xf7, 0x46, 0xfa, 0x00, 0x21, 0x48, 0x46, + 0x00, 0xf0, 0xf5, 0xf9, 0x01, 0x2f, 0x21, 0xd1, 0x00, 0xf0, 0x46, 0xf8, + 0x08, 0xf1, 0x24, 0x00, 0xff, 0xf7, 0x3a, 0xfa, 0x00, 0x21, 0x48, 0x46, + 0x00, 0xf0, 0x7e, 0xfa, 0x0a, 0x21, 0x48, 0x46, 0x00, 0xf0, 0x3e, 0xf9, + 0x01, 0x23, 0x80, 0x22, 0x07, 0x21, 0x01, 0xf0, 0x4e, 0xfc, 0x01, 0x23, + 0x80, 0x22, 0x07, 0x21, 0x01, 0xf0, 0x2d, 0xf9, 0x00, 0x22, 0x00, 0x21, + 0x48, 0x46, 0xff, 0xf7, 0x30, 0xfb, 0x00, 0x22, 0x00, 0x21, 0x48, 0x46, + 0xff, 0xf7, 0x14, 0xfb, 0x00, 0xf0, 0x28, 0xf8, 0x08, 0xf1, 0xca, 0x00, + 0xff, 0xf7, 0x18, 0xfa, 0x00, 0xf0, 0x22, 0xf8, 0x08, 0xf1, 0xcb, 0x00, + 0xff, 0xf7, 0x12, 0xfa, 0x00, 0xf0, 0x1c, 0xf8, 0x08, 0xf1, 0xcc, 0x00, + 0xff, 0xf7, 0x0c, 0xfa, 0x00, 0xf0, 0x16, 0xf8, 0x08, 0xf1, 0xcd, 0x00, + 0xff, 0xf7, 0x06, 0xfa, 0x00, 0xf0, 0x10, 0xf8, 0x08, 0xf1, 0xce, 0x00, + 0xff, 0xf7, 0x00, 0xfa, 0x08, 0xf1, 0xcf, 0x00, 0x01, 0xb0, 0xbd, 0xe8, + 0xf0, 0x4f, 0x00, 0x23, 0x7f, 0x22, 0xb1, 0xe2, 0x01, 0x23, 0x10, 0x22, + 0x04, 0x21, 0x70, 0x47, 0x00, 0x23, 0x7f, 0x22, 0x00, 0x21, 0x70, 0x47, + 0x70, 0xb5, 0x00, 0xf0, 0xaa, 0xfe, 0x01, 0x2a, 0x1b, 0xd1, 0x01, 0xf0, + 0xbd, 0xfa, 0x95, 0xf9, 0x02, 0x20, 0x95, 0xf9, 0x01, 0x10, 0x20, 0x46, + 0xff, 0xf7, 0xef, 0xfa, 0x95, 0xf9, 0x04, 0x20, 0x95, 0xf9, 0x03, 0x10, + 0x20, 0x46, 0xff, 0xf7, 0xd1, 0xfa, 0x68, 0x79, 0x06, 0xf1, 0xfc, 0x01, + 0x06, 0xf1, 0xef, 0x02, 0x08, 0x70, 0x06, 0xf1, 0xf2, 0x01, 0xa8, 0x79, + 0x10, 0x70, 0xe8, 0x79, 0x08, 0x70, 0x06, 0xf1, 0x28, 0x01, 0x28, 0x7a, + 0x08, 0x70, 0x06, 0xf1, 0x29, 0x02, 0x68, 0x7a, 0x10, 0x70, 0x06, 0xf1, + 0x2a, 0x01, 0xa8, 0x7a, 0x08, 0x70, 0x06, 0xf1, 0x2b, 0x02, 0xe8, 0x7a, + 0x10, 0x70, 0x06, 0xf1, 0x2c, 0x01, 0x28, 0x7b, 0x08, 0x70, 0x01, 0x21, + 0x20, 0x46, 0x00, 0xf0, 0x6a, 0xf9, 0x00, 0x23, 0x80, 0x22, 0x07, 0x21, + 0x06, 0xf1, 0x20, 0x00, 0xff, 0xf7, 0xb0, 0xf9, 0x28, 0x78, 0x06, 0xf8, + 0x08, 0x0f, 0x70, 0xbd, 0xdf, 0xf8, 0xf8, 0x36, 0x53, 0xf8, 0x20, 0x00, + 0x17, 0x29, 0x5e, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, 0x0c, 0x11, 0x16, 0x1b, + 0x20, 0x25, 0x2a, 0x2f, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, + 0x34, 0x39, 0x3e, 0x43, 0x48, 0x4d, 0x52, 0x57, 0x13, 0x78, 0x1f, 0x22, + 0x00, 0x21, 0xd4, 0x30, 0x49, 0xe0, 0x13, 0x78, 0x1f, 0x22, 0x00, 0x21, + 0xd5, 0x30, 0x44, 0xe0, 0x13, 0x78, 0x1f, 0x22, 0x00, 0x21, 0xd6, 0x30, + 0x3f, 0xe0, 0x13, 0x78, 0x1f, 0x22, 0x00, 0x21, 0xd7, 0x30, 0x3a, 0xe0, + 0x13, 0x78, 0x1f, 0x22, 0x00, 0x21, 0xd8, 0x30, 0x35, 0xe0, 0x13, 0x78, + 0x1f, 0x22, 0x00, 0x21, 0xd9, 0x30, 0x30, 0xe0, 0x13, 0x78, 0x1f, 0x22, + 0x00, 0x21, 0xda, 0x30, 0x2b, 0xe0, 0x13, 0x78, 0x1f, 0x22, 0x00, 0x21, + 0xdb, 0x30, 0x26, 0xe0, 0x13, 0x78, 0x1f, 0x22, 0x00, 0x21, 0xe4, 0x30, + 0x21, 0xe0, 0x13, 0x78, 0x1f, 0x22, 0x00, 0x21, 0xe5, 0x30, 0x1c, 0xe0, + 0x13, 0x78, 0x1f, 0x22, 0x00, 0x21, 0xe6, 0x30, 0x17, 0xe0, 0x13, 0x78, + 0x1f, 0x22, 0x00, 0x21, 0xe7, 0x30, 0x12, 0xe0, 0x13, 0x78, 0x1f, 0x22, + 0x00, 0x21, 0xe8, 0x30, 0x0d, 0xe0, 0x13, 0x78, 0x1f, 0x22, 0x00, 0x21, + 0xe9, 0x30, 0x08, 0xe0, 0x13, 0x78, 0x1f, 0x22, 0x00, 0x21, 0xea, 0x30, + 0x03, 0xe0, 0x13, 0x78, 0x1f, 0x22, 0x00, 0x21, 0xeb, 0x30, 0xff, 0xf7, + 0x47, 0xb9, 0x70, 0x47, 0xdf, 0xf8, 0x2c, 0x26, 0x52, 0xf8, 0x20, 0x20, + 0x00, 0x20, 0x17, 0x29, 0x2f, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, 0x0c, 0x0e, + 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x1c, 0x1e, 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0xd4, 0x32, + 0x1c, 0xe0, 0xd5, 0x32, 0x1a, 0xe0, 0xd6, 0x32, 0x18, 0xe0, 0xd7, 0x32, + 0x16, 0xe0, 0xd8, 0x32, 0x14, 0xe0, 0xd9, 0x32, 0x12, 0xe0, 0xda, 0x32, + 0x10, 0xe0, 0xdb, 0x32, 0x0e, 0xe0, 0xe4, 0x32, 0x0c, 0xe0, 0xe5, 0x32, + 0x0a, 0xe0, 0xe6, 0x32, 0x08, 0xe0, 0xe7, 0x32, 0x06, 0xe0, 0xe8, 0x32, + 0x04, 0xe0, 0xe9, 0x32, 0x02, 0xe0, 0xea, 0x32, 0x00, 0xe0, 0xeb, 0x32, + 0x10, 0x78, 0x00, 0xf0, 0x1f, 0x00, 0x70, 0x47, 0x5e, 0xb5, 0x14, 0x46, + 0x9d, 0xf8, 0x18, 0x20, 0x8d, 0xf8, 0x00, 0x20, 0x80, 0x2a, 0x24, 0xbf, + 0x7f, 0x26, 0x8d, 0xf8, 0x00, 0x60, 0xa4, 0x00, 0x04, 0xeb, 0x01, 0x14, + 0x1c, 0x19, 0x6a, 0x46, 0xe1, 0xb2, 0xff, 0xf7, 0x4f, 0xff, 0x57, 0xbd, + 0x92, 0x00, 0x02, 0xeb, 0x01, 0x12, 0x9a, 0x18, 0xd1, 0xb2, 0xad, 0xe7, + 0xdf, 0xf8, 0x88, 0x25, 0x52, 0xf8, 0x20, 0x00, 0x00, 0xf8, 0xfc, 0x1f, + 0x70, 0x47, 0x38, 0xb5, 0x00, 0xf0, 0x23, 0xf8, 0x69, 0xb9, 0x13, 0x46, + 0x1f, 0x22, 0x05, 0xf1, 0xe0, 0x00, 0xff, 0xf7, 0xe3, 0xf8, 0x23, 0x46, + 0x05, 0xf1, 0xe1, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x1f, 0x22, + 0x94, 0xe1, 0x31, 0xbd, 0x38, 0xb5, 0x00, 0xf0, 0x10, 0xf8, 0x69, 0xb9, + 0x13, 0x46, 0x1f, 0x22, 0x05, 0xf1, 0xd0, 0x00, 0xff, 0xf7, 0xd0, 0xf8, + 0x23, 0x46, 0x05, 0xf1, 0xd1, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, + 0x1f, 0x22, 0x81, 0xe1, 0x31, 0xbd, 0x1c, 0x46, 0xdf, 0xf8, 0x2c, 0x35, + 0x53, 0xf8, 0x20, 0x50, 0x70, 0x47, 0x13, 0x46, 0x0a, 0x46, 0x00, 0x21, + 0xe2, 0xe7, 0x13, 0x46, 0x0a, 0x46, 0x00, 0xf0, 0x34, 0xbb, 0xdf, 0xf8, + 0x14, 0x15, 0x51, 0xf8, 0x20, 0x00, 0xd0, 0x30, 0x04, 0xe0, 0xdf, 0xf8, + 0x08, 0x15, 0x51, 0xf8, 0x20, 0x00, 0xd1, 0x30, 0x00, 0x78, 0x00, 0xf0, + 0x1f, 0x00, 0x70, 0x47, 0xdf, 0xf8, 0xf4, 0x14, 0x51, 0xf8, 0x20, 0x00, + 0xe0, 0x30, 0xf5, 0xe7, 0xdf, 0xf8, 0xe8, 0x14, 0x51, 0xf8, 0x20, 0x00, + 0xe1, 0x30, 0xef, 0xe7, 0xdf, 0xf8, 0xdc, 0x14, 0x51, 0xf8, 0x20, 0x00, + 0x00, 0xf1, 0x0b, 0x02, 0x0c, 0x30, 0x11, 0x78, 0x00, 0x78, 0x01, 0xf0, + 0x7f, 0x01, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0xeb, 0x01, 0x20, 0x80, 0xb2, + 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, 0x77, 0xfa, 0xbd, 0xe8, 0x10, 0x40, + 0x0b, 0x46, 0x08, 0x22, 0x03, 0x21, 0x09, 0x30, 0xff, 0xf7, 0x82, 0xb8, + 0xf8, 0xb5, 0x04, 0x46, 0xdf, 0xf8, 0xa0, 0x04, 0x21, 0x46, 0x50, 0xf8, + 0x21, 0x50, 0x00, 0x22, 0x8d, 0xf8, 0x00, 0x20, 0x20, 0x46, 0x00, 0xf0, + 0x3b, 0xfa, 0x05, 0xf1, 0x80, 0x06, 0x00, 0x01, 0x40, 0xf0, 0x06, 0x00, + 0x30, 0x70, 0x8f, 0x35, 0x00, 0xf0, 0x19, 0xf8, 0x00, 0xf0, 0x17, 0xf8, + 0x01, 0x20, 0xf4, 0xf7, 0x66, 0xfb, 0x28, 0x78, 0x29, 0x78, 0xc0, 0x07, + 0xc1, 0xf3, 0x40, 0x07, 0x01, 0xd4, 0x01, 0x2f, 0xf7, 0xd1, 0x00, 0x23, + 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0xfd, 0xfb, 0x3a, 0x46, 0x20, 0x46, + 0xbd, 0xe8, 0xf8, 0x40, 0x01, 0x21, 0xf4, 0xf7, 0x41, 0xbc, 0x9d, 0xf8, + 0x00, 0x00, 0x40, 0x1c, 0x8d, 0xf8, 0x00, 0x00, 0x70, 0x47, 0x10, 0xb5, + 0x00, 0xf0, 0x37, 0xfa, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x08, 0x22, + 0x03, 0x21, 0x0b, 0xe0, 0x10, 0xb5, 0x01, 0x24, 0x04, 0xfa, 0x01, 0xf1, + 0x00, 0xf0, 0x2b, 0xfa, 0xbd, 0xe8, 0x10, 0x40, 0x4b, 0x1e, 0xdb, 0xb2, + 0x03, 0x22, 0x00, 0x21, 0x2a, 0x30, 0xff, 0xf7, 0x35, 0xb8, 0x10, 0xb5, + 0x00, 0xf0, 0x1f, 0xfa, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x04, 0x22, + 0x02, 0x21, 0xf3, 0xe7, 0x38, 0xb5, 0x01, 0x25, 0xdf, 0xf8, 0xf4, 0x23, + 0x52, 0xf8, 0x20, 0x40, 0x8d, 0x40, 0x6d, 0x1e, 0x10, 0x29, 0x10, 0xd2, + 0xeb, 0xb2, 0xff, 0x22, 0x00, 0x21, 0x04, 0xf1, 0x2b, 0x00, 0xff, 0xf7, + 0x1b, 0xf8, 0x2d, 0x0a, 0x05, 0xf0, 0x7f, 0x03, 0x04, 0xf1, 0x2c, 0x00, + 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x7f, 0x22, 0xca, 0xe0, 0x31, 0xbd, + 0xdf, 0xf8, 0xc0, 0x13, 0x51, 0xf8, 0x20, 0x20, 0x02, 0xf1, 0x2b, 0x01, + 0x2c, 0x32, 0x09, 0x78, 0x12, 0x78, 0x00, 0x20, 0x02, 0xf0, 0x7f, 0x02, + 0x6c, 0xe0, 0x10, 0xb5, 0x00, 0xf0, 0xed, 0xf9, 0xbd, 0xe8, 0x10, 0x40, + 0x0b, 0x46, 0x1f, 0x22, 0x00, 0x21, 0x23, 0x30, 0xfe, 0xf7, 0xf8, 0xbf, + 0x10, 0xb5, 0x00, 0xf0, 0xe2, 0xf9, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, + 0x0f, 0x22, 0x00, 0x21, 0x84, 0xe0, 0x10, 0xb5, 0x00, 0xf0, 0xd9, 0xf9, + 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x0f, 0x22, 0x00, 0x21, 0x07, 0xe0, + 0x10, 0xb5, 0x00, 0xf0, 0xd0, 0xf9, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, + 0xf0, 0x22, 0x04, 0x21, 0x25, 0x30, 0xfe, 0xf7, 0xdb, 0xbf, 0x10, 0xb5, + 0x00, 0xf0, 0xc5, 0xf9, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x07, 0x22, + 0x00, 0x21, 0x07, 0xe0, 0x10, 0xb5, 0x00, 0xf0, 0xbc, 0xf9, 0xbd, 0xe8, + 0x10, 0x40, 0x0b, 0x46, 0x70, 0x22, 0x04, 0x21, 0x26, 0x30, 0xfe, 0xf7, + 0xc7, 0xbf, 0xdf, 0xf8, 0x30, 0x13, 0x51, 0xf8, 0x20, 0x00, 0x26, 0x30, + 0x19, 0xe1, 0xdf, 0xf8, 0x24, 0x13, 0x51, 0xf8, 0x20, 0x00, 0x26, 0x30, + 0x00, 0x78, 0xc0, 0xf3, 0x02, 0x10, 0x70, 0x47, 0x38, 0xb5, 0xff, 0xf7, + 0xb0, 0xf9, 0x01, 0x20, 0x00, 0xfa, 0x04, 0xf4, 0xa4, 0xb2, 0x64, 0x1e, + 0xe3, 0xb2, 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x28, 0x00, 0xfe, 0xf7, + 0xa9, 0xff, 0x24, 0x04, 0x23, 0x0e, 0x05, 0xf1, 0x29, 0x00, 0x01, 0xb0, + 0xbd, 0xe8, 0x30, 0x40, 0xff, 0x22, 0x59, 0xe0, 0xdf, 0xf8, 0xe0, 0x12, + 0x51, 0xf8, 0x20, 0x20, 0x02, 0xf1, 0x28, 0x01, 0x29, 0x32, 0x09, 0x78, + 0x12, 0x78, 0x00, 0x20, 0x51, 0xea, 0x02, 0x21, 0x01, 0xe0, 0x40, 0x1c, + 0x49, 0x08, 0xfc, 0xd1, 0xc0, 0xb2, 0x70, 0x47, 0x09, 0x29, 0x00, 0xd3, + 0x70, 0x47, 0x10, 0xb5, 0x01, 0x24, 0x04, 0xfa, 0x01, 0xf3, 0x00, 0xf0, + 0x72, 0xf9, 0xbd, 0xe8, 0x10, 0x40, 0x5b, 0x1e, 0xdb, 0xb2, 0xff, 0x22, + 0x00, 0x21, 0x27, 0x30, 0xfe, 0xf7, 0x7c, 0xbf, 0xdf, 0xf8, 0x98, 0x22, + 0x01, 0x46, 0x52, 0xf8, 0x21, 0x10, 0x27, 0x31, 0x00, 0x20, 0x09, 0x78, + 0x00, 0x29, 0xdd, 0xe7, 0x10, 0xb5, 0x00, 0xf0, 0x5c, 0xf9, 0xbd, 0xe8, + 0x10, 0x40, 0x0b, 0x46, 0x10, 0x22, 0x04, 0x21, 0x24, 0x30, 0xfe, 0xf7, + 0x67, 0xbf, 0x38, 0xb5, 0xff, 0xf7, 0x5f, 0xf9, 0x00, 0x23, 0x03, 0x22, + 0x00, 0x21, 0x05, 0xf1, 0x08, 0x00, 0xfe, 0xf7, 0x5d, 0xff, 0x23, 0x46, + 0x05, 0xf1, 0x11, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x7f, 0x22, + 0x0e, 0xe0, 0x38, 0xb5, 0xff, 0xf7, 0x4d, 0xf9, 0xf6, 0x35, 0x01, 0x23, + 0x08, 0x22, 0x03, 0x21, 0x00, 0xf0, 0x27, 0xf8, 0x23, 0x46, 0x28, 0x46, + 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x07, 0x22, 0x00, 0x21, 0xfe, 0xf7, + 0x43, 0xbf, 0x38, 0xb5, 0xff, 0xf7, 0x3c, 0xf9, 0x14, 0x35, 0x01, 0xf0, + 0x8d, 0xf9, 0x00, 0xf0, 0x13, 0xf8, 0x00, 0x23, 0x04, 0x22, 0x02, 0x21, + 0x00, 0xf0, 0x11, 0xf8, 0x20, 0x24, 0x01, 0x23, 0x01, 0xf0, 0x83, 0xf9, + 0x01, 0x23, 0x00, 0xf0, 0x08, 0xf8, 0x01, 0xf0, 0x7d, 0xf9, 0x00, 0xf0, + 0x03, 0xf8, 0x64, 0x1e, 0xf3, 0xd1, 0x31, 0xbd, 0x00, 0x23, 0x02, 0x22, + 0x01, 0x21, 0x28, 0x46, 0xfe, 0xf7, 0x22, 0xbf, 0x10, 0xb5, 0x00, 0xf0, + 0x29, 0xf8, 0x18, 0xbf, 0x01, 0x23, 0x14, 0x34, 0x04, 0x22, 0x02, 0x21, + 0x00, 0xf0, 0x2a, 0xf8, 0xff, 0xf7, 0xad, 0xf9, 0x01, 0x23, 0xff, 0xf7, + 0xab, 0xf9, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x23, 0x01, 0x22, + 0xc6, 0xe7, 0x10, 0xb5, 0x00, 0xf0, 0x14, 0xf8, 0x18, 0xbf, 0x01, 0x23, + 0x14, 0x34, 0x04, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x15, 0xf8, 0x00, 0xf0, + 0x10, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0x0e, 0xf8, 0x20, 0x46, 0xbd, 0xe8, + 0x10, 0x40, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, 0xfe, 0xf7, 0xf6, 0xbe, + 0x63, 0x4a, 0x52, 0xf8, 0x20, 0x40, 0x0b, 0x00, 0x70, 0x47, 0x00, 0x23, + 0x02, 0x22, 0x01, 0x21, 0x20, 0x46, 0xfe, 0xf7, 0xeb, 0xbe, 0x00, 0x78, + 0x00, 0xf0, 0x01, 0x00, 0x70, 0x47, 0x10, 0xb5, 0x5b, 0x4a, 0x52, 0xf8, + 0x20, 0x00, 0x00, 0x23, 0xff, 0x29, 0x19, 0xd0, 0x40, 0xf2, 0xff, 0x34, + 0xa1, 0x42, 0x17, 0xd0, 0x40, 0xf6, 0xff, 0x74, 0xa1, 0x42, 0x15, 0xd0, + 0x41, 0xf6, 0xff, 0x74, 0xa1, 0x42, 0x13, 0xd0, 0x43, 0xf6, 0xff, 0x74, + 0xa1, 0x42, 0x11, 0xd0, 0x47, 0xf6, 0xff, 0x74, 0xa1, 0x42, 0x0f, 0xd0, + 0x4f, 0xf6, 0xff, 0x74, 0xa1, 0x42, 0x08, 0xbf, 0x07, 0x23, 0x0a, 0xe0, + 0x01, 0x23, 0x08, 0xe0, 0x02, 0x23, 0x06, 0xe0, 0x03, 0x23, 0x04, 0xe0, + 0x04, 0x23, 0x02, 0xe0, 0x05, 0x23, 0x00, 0xe0, 0x06, 0x23, 0xbd, 0xe8, + 0x10, 0x40, 0x0e, 0x22, 0x01, 0x21, 0x15, 0x30, 0xfe, 0xf7, 0xb4, 0xbe, + 0x10, 0xb5, 0x00, 0xf0, 0x9e, 0xf8, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, + 0x07, 0x22, 0x00, 0x21, 0x07, 0xe0, 0x3e, 0x49, 0x51, 0xf8, 0x20, 0x00, + 0x16, 0x30, 0x00, 0x78, 0x00, 0xf0, 0x07, 0x00, 0x70, 0x47, 0x16, 0x30, + 0xfe, 0xf7, 0xa0, 0xbe, 0x38, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x16, 0x30, + 0x00, 0x78, 0xc0, 0xf3, 0xc1, 0x00, 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, + 0x82, 0xf8, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x80, 0x22, 0x07, 0x21, + 0xeb, 0xe7, 0x30, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x16, 0x30, 0x1f, 0xe0, + 0x2d, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x16, 0x30, 0x0f, 0xe0, 0x10, 0xb5, + 0x00, 0xf0, 0x6f, 0xf8, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x40, 0x22, + 0x06, 0x21, 0x03, 0xe0, 0x00, 0x78, 0xc0, 0xf3, 0x80, 0x10, 0x70, 0x47, + 0x58, 0x30, 0xfe, 0xf7, 0x75, 0xbe, 0x00, 0x78, 0xc0, 0xf3, 0x40, 0x10, + 0x70, 0x47, 0x21, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x00, 0xf1, 0x1a, 0x02, + 0x19, 0x30, 0x3d, 0xe0, 0x00, 0x78, 0xc0, 0x09, 0x70, 0x47, 0x1c, 0x49, + 0x51, 0xf8, 0x20, 0x00, 0x18, 0x30, 0xe5, 0xe7, 0x1c, 0xb5, 0x00, 0x21, + 0x8d, 0xf8, 0x00, 0x10, 0x04, 0x46, 0xff, 0xf7, 0xcc, 0xff, 0x00, 0xf0, + 0x10, 0xf8, 0xff, 0xf7, 0xac, 0xff, 0x00, 0xf0, 0x0c, 0xf8, 0xff, 0xf7, + 0xb3, 0xff, 0x00, 0xf0, 0x08, 0xf8, 0xff, 0xf7, 0xc5, 0xff, 0x00, 0xf0, + 0x04, 0xf8, 0xff, 0xf7, 0xe4, 0xff, 0x00, 0xf0, 0xd7, 0xba, 0x8d, 0xf8, + 0x00, 0x00, 0x20, 0x46, 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, 0x2f, 0xf8, + 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x30, 0x22, 0x04, 0x21, 0x80, 0x30, + 0xfe, 0xf7, 0x3a, 0xbe, 0x05, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x80, 0x30, + 0x00, 0x78, 0xc0, 0xf3, 0x01, 0x10, 0x70, 0x47, 0x00, 0x78, 0xc0, 0xf3, + 0x00, 0x10, 0x70, 0x47, 0x40, 0x9a, 0x04, 0x02, 0x11, 0x78, 0x00, 0x78, + 0x40, 0xea, 0x01, 0x20, 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, 0x11, 0xf8, + 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x0f, 0x22, 0x00, 0x21, 0x07, 0xe0, + 0x10, 0xb5, 0x00, 0xf0, 0x08, 0xf8, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, + 0xf0, 0x22, 0x04, 0x21, 0xdc, 0x30, 0xfe, 0xf7, 0x13, 0xbe, 0xdf, 0xf8, + 0x70, 0x46, 0x54, 0xf8, 0x20, 0x00, 0x70, 0x47, 0x10, 0xb5, 0xff, 0xf7, + 0xf8, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x38, 0x22, 0x03, 0x21, + 0xd2, 0x30, 0xfe, 0xf7, 0x03, 0xbe, 0xe2, 0x30, 0xfe, 0xf7, 0x00, 0xbe, + 0x10, 0xb5, 0xff, 0xf7, 0xea, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, + 0xff, 0x22, 0x00, 0x21, 0xd3, 0x30, 0xfe, 0xf7, 0xf5, 0xbd, 0x10, 0xb5, + 0xff, 0xf7, 0xdf, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x01, 0x22, + 0x00, 0x21, 0x07, 0xe0, 0x10, 0xb5, 0xff, 0xf7, 0xd6, 0xff, 0xbd, 0xe8, + 0x10, 0x40, 0x0b, 0x46, 0x04, 0x22, 0x02, 0x21, 0xc0, 0x30, 0xfe, 0xf7, + 0xe1, 0xbd, 0x10, 0xb5, 0xff, 0xf7, 0xcb, 0xff, 0xbd, 0xe8, 0x10, 0x40, + 0x0b, 0x46, 0x80, 0x22, 0x07, 0x21, 0xef, 0x30, 0xfe, 0xf7, 0xd6, 0xbd, + 0x10, 0xb5, 0xff, 0xf7, 0xc0, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, + 0x80, 0x22, 0x07, 0x21, 0xf2, 0x30, 0xfe, 0xf7, 0xcb, 0xbd, 0x10, 0xb5, + 0xff, 0xf7, 0xb5, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0xc0, 0x22, + 0x06, 0x21, 0xbb, 0xe7, 0x10, 0xb5, 0xff, 0xf7, 0xac, 0xff, 0xbd, 0xe8, + 0x10, 0x40, 0x0b, 0x46, 0xc0, 0x22, 0x06, 0x21, 0xb5, 0xe7, 0x10, 0xb5, + 0xff, 0xf7, 0xa3, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x02, 0x22, + 0x01, 0x21, 0xc0, 0x1c, 0xfe, 0xf7, 0xae, 0xbd, 0x10, 0xb5, 0xff, 0xf7, + 0x98, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x01, 0x22, 0x00, 0x21, + 0xf3, 0xe7, 0x10, 0xb5, 0xff, 0xf7, 0x8f, 0xff, 0xbd, 0xe8, 0x10, 0x40, + 0x0b, 0x46, 0x10, 0x22, 0x04, 0x21, 0x40, 0x1c, 0xfe, 0xf7, 0x9a, 0xbd, + 0xdf, 0xf8, 0x7c, 0x15, 0x51, 0xf8, 0x20, 0x00, 0x40, 0x1c, 0x61, 0xe7, + 0x10, 0xb5, 0xff, 0xf7, 0x7e, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, + 0x1f, 0x22, 0x00, 0x21, 0x0e, 0x30, 0xfe, 0xf7, 0x89, 0xbd, 0x00, 0x29, + 0x08, 0xbf, 0xff, 0xf7, 0xab, 0xbc, 0x00, 0x21, 0xff, 0xf7, 0x95, 0xbc, + 0xdf, 0xf8, 0x4c, 0x15, 0x51, 0xf8, 0x20, 0x00, 0xf6, 0x30, 0xff, 0xf7, + 0xd4, 0xbe, 0xc0, 0x43, 0xc3, 0xb2, 0xff, 0x22, 0x00, 0x21, 0xdf, 0xf8, + 0x6c, 0x0b, 0xfe, 0xf7, 0x73, 0xbd, 0x01, 0x46, 0x00, 0x20, 0x08, 0x29, + 0x00, 0xd3, 0x70, 0x47, 0x10, 0xb5, 0xdf, 0xf8, 0x58, 0x3b, 0x1a, 0x78, + 0x01, 0x24, 0x04, 0xfa, 0x01, 0xf1, 0x0a, 0x42, 0x08, 0xbf, 0x01, 0x20, + 0x10, 0xbd, 0x10, 0xb5, 0x04, 0x00, 0x20, 0x00, 0xc0, 0xb2, 0xff, 0xf7, + 0xce, 0xfe, 0x20, 0x00, 0xc0, 0xb2, 0xff, 0xf7, 0xae, 0xfe, 0x10, 0xbd, + 0x10, 0xb5, 0x00, 0xf0, 0x0c, 0xf8, 0x12, 0x34, 0x1f, 0x22, 0xfe, 0xf7, + 0xea, 0xff, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x01, 0x23, 0x20, 0x22, + 0x05, 0x21, 0xfe, 0xf7, 0x49, 0xbd, 0x0b, 0x46, 0xdf, 0xf8, 0xd8, 0x14, + 0x51, 0xf8, 0x20, 0x40, 0x70, 0x47, 0x10, 0xb5, 0xff, 0xf7, 0x2d, 0xff, + 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x08, 0x22, 0x03, 0x21, 0x10, 0x30, + 0xfe, 0xf7, 0x38, 0xbd, 0x10, 0xb5, 0xff, 0xf7, 0x22, 0xff, 0xbd, 0xe8, + 0x10, 0x40, 0x0b, 0x46, 0x0c, 0x22, 0x02, 0x21, 0xfb, 0x30, 0xfe, 0xf7, + 0x2d, 0xbd, 0x38, 0xb5, 0x00, 0xf0, 0x2d, 0xf8, 0xff, 0xf7, 0x01, 0xfe, + 0x01, 0x23, 0xff, 0xf7, 0xfe, 0xfd, 0x20, 0x46, 0xff, 0xf7, 0xbf, 0xff, + 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, 0x1a, 0xe0, 0x10, 0xb5, 0x04, 0x46, + 0xff, 0xf7, 0xed, 0xff, 0xdf, 0xf8, 0x7c, 0x04, 0x50, 0xf8, 0x24, 0x10, + 0x11, 0xf8, 0x21, 0x0f, 0xc0, 0xf3, 0x80, 0x10, 0x10, 0xbd, 0x38, 0xb5, + 0x00, 0xf0, 0x11, 0xf8, 0x00, 0xf0, 0x5d, 0xff, 0x01, 0x23, 0x00, 0xf0, + 0x5a, 0xff, 0x20, 0x46, 0xff, 0xf7, 0xa3, 0xff, 0x00, 0x23, 0x01, 0x22, + 0x00, 0x21, 0xff, 0xf7, 0xdc, 0xfd, 0x20, 0x46, 0xbd, 0xe8, 0x32, 0x40, + 0x99, 0xe7, 0x04, 0x46, 0xdf, 0xf8, 0x40, 0x04, 0x21, 0x46, 0x50, 0xf8, + 0x21, 0x50, 0x20, 0x35, 0x00, 0x23, 0x70, 0x47, 0xf8, 0xb5, 0x00, 0xf0, + 0x2f, 0xf8, 0x00, 0xf0, 0x06, 0xf8, 0x2b, 0x46, 0x1f, 0x22, 0x00, 0x21, + 0x06, 0xf1, 0x2e, 0x00, 0x20, 0xe0, 0x01, 0x23, 0x40, 0x22, 0x06, 0x21, + 0x38, 0x46, 0xfe, 0xf7, 0xe3, 0xbc, 0xdf, 0xf8, 0x10, 0x24, 0x52, 0xf8, + 0x20, 0x00, 0x08, 0x29, 0x09, 0xda, 0x10, 0xf8, 0x04, 0x3f, 0x03, 0xf0, + 0xc7, 0x03, 0x03, 0xeb, 0xc1, 0x03, 0xdb, 0xb2, 0xff, 0x22, 0xff, 0xf7, + 0x8d, 0xbd, 0x70, 0x47, 0xf8, 0xb5, 0x00, 0xf0, 0x0d, 0xf8, 0xff, 0xf7, + 0xe4, 0xff, 0x2b, 0x46, 0x1f, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x22, 0x00, + 0xfe, 0xf7, 0xc6, 0xfc, 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x40, 0xb0, 0xe7, + 0x04, 0x46, 0x0d, 0x46, 0xdf, 0xf8, 0xc8, 0x03, 0x21, 0x46, 0x50, 0xf8, + 0x21, 0x60, 0x06, 0xf1, 0x20, 0x07, 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, + 0x38, 0x46, 0xfe, 0xf7, 0xb3, 0xbc, 0x70, 0xb5, 0x0d, 0x46, 0x04, 0x46, + 0x16, 0x46, 0x00, 0x21, 0xff, 0xf7, 0xfe, 0xfe, 0x20, 0x46, 0xff, 0xf7, + 0x0f, 0xff, 0x30, 0x70, 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, 0xff, 0xfe, + 0x29, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0xcc, 0xe7, 0x01, 0x21, + 0xee, 0xe6, 0x00, 0x00, 0xf8, 0xb5, 0x05, 0x46, 0x0c, 0x46, 0xdf, 0x48, + 0x2d, 0xed, 0x02, 0x8b, 0x29, 0x46, 0x50, 0xf8, 0x21, 0x60, 0x20, 0x36, + 0x00, 0x23, 0x00, 0xf0, 0x30, 0xf8, 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, + 0x00, 0xf0, 0x2d, 0xf8, 0x9f, 0xed, 0xbe, 0x8a, 0x00, 0x26, 0x16, 0xe0, + 0x7f, 0x1c, 0xf9, 0xb2, 0x28, 0x46, 0xff, 0xf7, 0x8d, 0xff, 0x28, 0x46, + 0xff, 0xf7, 0x60, 0xff, 0x10, 0xb9, 0xf8, 0xb2, 0x1f, 0x28, 0xf3, 0xd3, + 0xff, 0xb2, 0x00, 0xee, 0x10, 0x7a, 0xb8, 0xee, 0x40, 0x0a, 0x30, 0xee, + 0x08, 0x8a, 0x28, 0x46, 0xff, 0xf7, 0x0d, 0xff, 0x76, 0x1c, 0xf0, 0xb2, + 0xa0, 0x42, 0x02, 0xd2, 0x00, 0x27, 0x00, 0x21, 0xe4, 0xe7, 0x00, 0xee, + 0x10, 0x4a, 0x00, 0xf0, 0xbb, 0xf8, 0x10, 0xee, 0x10, 0x0a, 0xbd, 0xec, + 0x02, 0x8b, 0xc0, 0xb2, 0xf2, 0xbd, 0x04, 0x22, 0x02, 0x21, 0x30, 0x46, + 0xfe, 0xf7, 0x5a, 0xbc, 0x2d, 0xe9, 0xf8, 0x43, 0x80, 0x46, 0x89, 0x46, + 0xbd, 0x48, 0x41, 0x46, 0x50, 0xf8, 0x21, 0x40, 0x04, 0xf1, 0x22, 0x06, + 0x17, 0x46, 0x31, 0x78, 0x1d, 0x46, 0x6a, 0x46, 0x01, 0xf0, 0x1f, 0x01, + 0x40, 0x46, 0xff, 0xf7, 0x94, 0xff, 0x40, 0x46, 0xff, 0xf7, 0xe1, 0xfe, + 0x49, 0x46, 0x40, 0x46, 0xff, 0xf7, 0xa4, 0xff, 0x38, 0x70, 0x20, 0x34, + 0x01, 0x23, 0x04, 0x22, 0x02, 0x21, 0xff, 0xf7, 0x4b, 0xfd, 0x01, 0x23, + 0x20, 0x22, 0x05, 0x21, 0xff, 0xf7, 0x46, 0xfd, 0x30, 0x78, 0x00, 0xf0, + 0x1f, 0x00, 0x28, 0x70, 0x00, 0x27, 0x00, 0x24, 0x07, 0xe0, 0x40, 0x46, + 0xff, 0xf7, 0x0c, 0xff, 0x3f, 0x18, 0x40, 0x46, 0xff, 0xf7, 0xc3, 0xfe, + 0x64, 0x1c, 0xe0, 0xb2, 0x48, 0x45, 0xf4, 0xd3, 0x78, 0xb2, 0x38, 0xb9, + 0x28, 0x78, 0x40, 0x1c, 0x28, 0x70, 0xc0, 0xb2, 0x20, 0x28, 0x0a, 0xd3, + 0x1f, 0x20, 0x07, 0xe0, 0x7f, 0xb2, 0x4f, 0xfa, 0x89, 0xf0, 0x87, 0x42, + 0x03, 0xd1, 0x28, 0x78, 0x08, 0xb1, 0x40, 0x1e, 0x28, 0x70, 0x29, 0x78, + 0x40, 0x46, 0xff, 0xf7, 0x39, 0xff, 0x01, 0x21, 0x40, 0x46, 0xff, 0xf7, + 0x59, 0xfe, 0xbd, 0xe8, 0xf1, 0x83, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x43, + 0x80, 0x46, 0x89, 0x46, 0x92, 0x48, 0x2d, 0xed, 0x02, 0x8b, 0x41, 0x46, + 0x50, 0xf8, 0x21, 0x70, 0x16, 0x46, 0x1c, 0x46, 0x31, 0x46, 0x40, 0x46, + 0xff, 0xf7, 0x58, 0xff, 0x20, 0x70, 0x20, 0x37, 0x01, 0x23, 0x04, 0x22, + 0x02, 0x21, 0xff, 0xf7, 0x07, 0xff, 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, + 0xff, 0xf7, 0x02, 0xff, 0x49, 0x46, 0x40, 0x46, 0xff, 0xf7, 0x01, 0xff, + 0x9f, 0xed, 0x6b, 0x8a, 0x00, 0x25, 0x06, 0xf0, 0x7f, 0x09, 0x00, 0x24, + 0x1b, 0xe0, 0x7f, 0x1e, 0xf9, 0xb2, 0x40, 0x46, 0xff, 0xf7, 0x06, 0xff, + 0x40, 0x46, 0xff, 0xf7, 0xb7, 0xfe, 0x01, 0x28, 0x02, 0xd1, 0xf8, 0xb2, + 0x00, 0x28, 0xf2, 0xd1, 0xf8, 0xb2, 0x00, 0xee, 0x10, 0x0a, 0xff, 0xb2, + 0xb8, 0xee, 0x40, 0x0a, 0xaf, 0x42, 0x30, 0xee, 0x08, 0x8a, 0x28, 0xbf, + 0x3d, 0x46, 0x40, 0x46, 0xff, 0xf7, 0x5f, 0xfe, 0x64, 0x1c, 0xe0, 0xb2, + 0x48, 0x45, 0x02, 0xda, 0x1f, 0x27, 0x1f, 0x21, 0xdf, 0xe7, 0x30, 0x06, + 0x05, 0xd4, 0x00, 0xee, 0x10, 0x6a, 0x00, 0xf0, 0x0b, 0xf8, 0x10, 0xee, + 0x10, 0x5a, 0xe9, 0xb2, 0x40, 0x46, 0xff, 0xf7, 0xdd, 0xfe, 0xbd, 0xec, + 0x02, 0x8b, 0xe8, 0xb2, 0xbd, 0xe8, 0xf2, 0x83, 0xb8, 0xee, 0x40, 0x0a, + 0x88, 0xee, 0x00, 0x0a, 0xf6, 0xee, 0x00, 0x0a, 0x30, 0xee, 0x20, 0x0a, + 0xbd, 0xee, 0xc0, 0x0a, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46, 0xf4, 0xf7, + 0x9d, 0xf8, 0x78, 0xb9, 0x06, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x6f, 0xfd, + 0x06, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x74, 0xfd, 0x00, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0x80, 0xfd, 0x66, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x8a, 0xfd, + 0x00, 0x20, 0x10, 0xbd, 0x1c, 0xb5, 0x04, 0x46, 0xf4, 0xf7, 0x86, 0xf8, + 0x78, 0xb9, 0x0e, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x58, 0xfd, 0x0e, 0x21, + 0x20, 0x46, 0xff, 0xf7, 0x5d, 0xfd, 0x06, 0x21, 0x20, 0x46, 0xff, 0xf7, + 0x69, 0xfd, 0xee, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x73, 0xfd, 0x00, 0x20, + 0x8d, 0xf8, 0x00, 0x00, 0x9d, 0xf8, 0x00, 0x00, 0x16, 0xbd, 0xdf, 0xf8, + 0xb8, 0x1b, 0x51, 0xf8, 0x20, 0x00, 0x08, 0x30, 0x00, 0x78, 0x70, 0x47, + 0x10, 0xb5, 0xff, 0xf7, 0x50, 0xfd, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, + 0x03, 0x22, 0x00, 0x21, 0x08, 0x30, 0xfe, 0xf7, 0x5b, 0xbb, 0x7c, 0xb5, + 0x00, 0xf0, 0x15, 0xf8, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x06, 0xf1, + 0xa8, 0x00, 0xfe, 0xf7, 0x51, 0xfb, 0x2d, 0x36, 0x2b, 0x46, 0x1f, 0x22, + 0x00, 0xf0, 0x3e, 0xf9, 0x20, 0x46, 0xff, 0xf7, 0x38, 0xfe, 0x30, 0x78, + 0x00, 0xf0, 0x1f, 0x00, 0x8d, 0xf8, 0x00, 0x00, 0x73, 0xbd, 0x04, 0x46, + 0x0d, 0x46, 0xdf, 0xf8, 0x60, 0x0b, 0x21, 0x46, 0x50, 0xf8, 0x21, 0x60, + 0x70, 0x47, 0x70, 0xb5, 0x01, 0x29, 0x04, 0x46, 0x07, 0xbf, 0x02, 0x25, + 0x00, 0x26, 0x01, 0x25, 0x03, 0x26, 0xf4, 0xf7, 0x33, 0xf8, 0x01, 0x28, + 0x03, 0xd0, 0x29, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x78, 0xf9, 0x31, 0x46, + 0x20, 0x46, 0xff, 0xf7, 0x5c, 0xfd, 0x31, 0x46, 0x20, 0x46, 0xff, 0xf7, + 0x61, 0xfd, 0x00, 0x22, 0x00, 0x21, 0x20, 0x46, 0xfe, 0xf7, 0x4c, 0xfd, + 0x00, 0x22, 0x01, 0x21, 0x20, 0x46, 0xfe, 0xf7, 0x47, 0xfd, 0x2b, 0x46, + 0x03, 0x22, 0x00, 0x21, 0xdf, 0xf8, 0xac, 0x06, 0xfe, 0xf7, 0x12, 0xfb, + 0xbd, 0xe8, 0x70, 0x40, 0x64, 0x20, 0xf3, 0xf7, 0x0c, 0xbe, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0x47, 0xf6, 0xff, 0x79, + 0x83, 0x46, 0x0c, 0x46, 0x15, 0x46, 0x98, 0x46, 0xdf, 0xf8, 0xe4, 0xaa, + 0x4f, 0x46, 0x00, 0x26, 0xf1, 0xb2, 0x58, 0x46, 0xff, 0xf7, 0x93, 0xfb, + 0x0a, 0x20, 0xf3, 0xf7, 0xf6, 0xfd, 0x08, 0x20, 0x00, 0x90, 0x01, 0x23, + 0x4a, 0x46, 0x06, 0x21, 0x58, 0x46, 0xf3, 0xf7, 0xab, 0xfd, 0xdf, 0xf8, + 0xc4, 0x1a, 0x08, 0x18, 0x82, 0x45, 0xbc, 0xbf, 0x82, 0x46, 0x26, 0x70, + 0xb8, 0x42, 0xbc, 0xbf, 0x07, 0x46, 0x2e, 0x70, 0x76, 0x1c, 0xf0, 0xb2, + 0x80, 0x28, 0xe1, 0xd3, 0x0a, 0x98, 0xc8, 0xf8, 0x00, 0xa0, 0x07, 0x60, + 0xbd, 0xe8, 0xf1, 0x8f, 0x40, 0x9a, 0x04, 0x02, 0x2d, 0xe9, 0xf8, 0x4f, + 0x84, 0xb0, 0x00, 0x21, 0xad, 0xf8, 0x04, 0x10, 0x82, 0x46, 0xdf, 0xf8, + 0x80, 0x1a, 0x53, 0x46, 0x51, 0xf8, 0x23, 0x90, 0x09, 0xf1, 0x08, 0x01, + 0x08, 0x78, 0x8d, 0xf8, 0x06, 0x00, 0x50, 0x46, 0xff, 0xf7, 0x81, 0xfb, + 0x00, 0x23, 0x00, 0xf0, 0x66, 0xf8, 0x02, 0xa8, 0x00, 0x90, 0x03, 0xab, + 0x0d, 0xf1, 0x05, 0x02, 0x01, 0xa9, 0x50, 0x46, 0xff, 0xf7, 0xae, 0xff, + 0x03, 0x98, 0x02, 0x99, 0x00, 0x28, 0x48, 0xbf, 0x40, 0x42, 0x00, 0x29, + 0x48, 0xbf, 0x49, 0x42, 0x01, 0x24, 0x88, 0x42, 0x07, 0xda, 0x9d, 0xf8, + 0x05, 0x00, 0x8d, 0xf8, 0x04, 0x00, 0x00, 0x24, 0x02, 0x98, 0x03, 0x9e, + 0x01, 0xe0, 0x03, 0x98, 0x02, 0x9e, 0x9d, 0xf8, 0x04, 0x10, 0x86, 0x1b, + 0x50, 0x46, 0x06, 0xeb, 0xd6, 0x76, 0xff, 0xf7, 0x34, 0xfb, 0x76, 0x10, + 0x00, 0x25, 0x6e, 0xb3, 0x31, 0x46, 0x50, 0x46, 0x00, 0xf0, 0x3f, 0xf8, + 0x00, 0x27, 0xb0, 0xf5, 0x80, 0x7f, 0x25, 0xdb, 0x83, 0x46, 0x2c, 0xb1, + 0x01, 0x21, 0x50, 0x46, 0xff, 0xf7, 0x68, 0xfb, 0x6d, 0x1c, 0x04, 0xe0, + 0x01, 0x21, 0x50, 0x46, 0xff, 0xf7, 0x77, 0xfb, 0x6d, 0x1e, 0x50, 0x46, + 0xff, 0xf7, 0x1d, 0xfd, 0x31, 0x46, 0x50, 0x46, 0x00, 0xf0, 0x27, 0xf8, + 0xd8, 0x46, 0x83, 0x46, 0x7f, 0x1c, 0xbb, 0xf5, 0x80, 0x7f, 0x05, 0xdb, + 0xc3, 0x45, 0x03, 0xda, 0x78, 0xb2, 0x7f, 0x28, 0xe1, 0xd1, 0x05, 0xe0, + 0xd8, 0x45, 0x03, 0xda, 0x00, 0x2c, 0x14, 0xbf, 0x6d, 0x1e, 0x6d, 0x1c, + 0x9d, 0xf8, 0x06, 0x30, 0x00, 0xf0, 0x0b, 0xf8, 0x50, 0x46, 0xff, 0xf7, + 0x20, 0xfb, 0x6d, 0xb2, 0x00, 0xee, 0x10, 0x5a, 0xb8, 0xee, 0xc0, 0x0a, + 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x03, 0x22, 0x00, 0x21, 0x09, 0xf1, + 0x08, 0x00, 0xfe, 0xf7, 0x55, 0xba, 0x38, 0xb5, 0x0c, 0x46, 0x08, 0x25, + 0x00, 0x95, 0x01, 0x23, 0x47, 0xf6, 0xff, 0x72, 0x06, 0x21, 0xf3, 0xf7, + 0x07, 0xfd, 0xdf, 0xf8, 0x7c, 0x19, 0x08, 0x18, 0x00, 0x1b, 0x48, 0xbf, + 0x40, 0x42, 0x32, 0xbd, 0xdf, 0xf8, 0x70, 0x19, 0x09, 0x56, 0xf8, 0xb5, + 0x0d, 0x46, 0x2e, 0x00, 0x44, 0xbf, 0x49, 0x42, 0x4e, 0xb2, 0x04, 0x46, + 0x00, 0x27, 0x0f, 0xe0, 0x0a, 0xdd, 0x01, 0x21, 0x20, 0x46, 0xff, 0xf7, + 0x11, 0xfb, 0x05, 0xe0, 0x00, 0x2d, 0xf7, 0xd5, 0x01, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0x1f, 0xfb, 0x20, 0x46, 0xff, 0xf7, 0xc6, 0xfc, 0x7f, 0x1c, + 0x78, 0xb2, 0xb0, 0x42, 0xf2, 0xdb, 0xf1, 0xbd, 0xf8, 0xb5, 0xff, 0xf7, + 0xde, 0xfe, 0x16, 0xf8, 0x08, 0x7f, 0x00, 0x23, 0x03, 0x22, 0x00, 0xf0, + 0x0d, 0xf8, 0x29, 0x46, 0x20, 0x46, 0xff, 0xf7, 0xb0, 0xfa, 0x3b, 0x46, + 0x30, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x40, 0x03, 0x22, 0xff, 0xf7, + 0xc9, 0xba, 0x0f, 0x22, 0x00, 0x21, 0x30, 0x46, 0xfe, 0xf7, 0x0a, 0xba, + 0xf8, 0xb5, 0x86, 0xb0, 0x07, 0x46, 0x00, 0x21, 0xff, 0xf7, 0x77, 0xf9, + 0x01, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x73, 0xf9, 0x00, 0x26, 0x00, 0x24, + 0x03, 0xad, 0x38, 0x46, 0xff, 0xf7, 0x5c, 0xf9, 0x00, 0xf0, 0x7f, 0x01, + 0x29, 0x55, 0x00, 0x0a, 0x00, 0xf0, 0x7f, 0x00, 0x0d, 0xf8, 0x04, 0x00, + 0x64, 0x1c, 0x0a, 0x2c, 0xf1, 0xd3, 0x00, 0x21, 0x38, 0x46, 0xff, 0xf7, + 0x5e, 0xf9, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0xab, 0x5c, 0x14, 0x2b, + 0x86, 0xbf, 0x1d, 0xf8, 0x02, 0x70, 0x14, 0x2f, 0x01, 0x20, 0x6e, 0x2b, + 0x3a, 0xbf, 0x1d, 0xf8, 0x02, 0x30, 0x6e, 0x2b, 0x01, 0x21, 0x52, 0x1c, + 0x0a, 0x2a, 0xef, 0xd3, 0x08, 0x42, 0x0f, 0xd0, 0x00, 0x20, 0x29, 0x5c, + 0x14, 0x29, 0x9c, 0xbf, 0x80, 0x39, 0x29, 0x54, 0x1d, 0xf8, 0x00, 0x10, + 0x14, 0x29, 0x9c, 0xbf, 0x80, 0x39, 0x0d, 0xf8, 0x00, 0x10, 0x40, 0x1c, + 0x0a, 0x28, 0xf0, 0xd3, 0x00, 0x21, 0x68, 0x5c, 0x1d, 0xf8, 0x01, 0x20, + 0x30, 0x18, 0x86, 0x18, 0x49, 0x1c, 0x0a, 0x29, 0xf7, 0xd3, 0x14, 0x20, + 0xb6, 0xfb, 0xf0, 0xf0, 0xc1, 0xb2, 0x80, 0x29, 0x28, 0xbf, 0x80, 0x38, + 0xc0, 0xb2, 0x07, 0xb0, 0xf0, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x0f, 0x46, + 0xdf, 0xf8, 0x3c, 0x18, 0xdf, 0xf8, 0x48, 0xa8, 0x51, 0xf8, 0x20, 0x40, + 0xf3, 0xf7, 0xaa, 0xfe, 0x3d, 0x46, 0x01, 0x28, 0x04, 0xbf, 0x01, 0x2f, + 0x02, 0x27, 0x57, 0x44, 0x04, 0xf1, 0xdc, 0x06, 0x3b, 0x78, 0xff, 0xf7, + 0x8e, 0xff, 0xfb, 0x78, 0xf0, 0x22, 0x04, 0x21, 0xff, 0xf7, 0x3b, 0xfd, + 0x04, 0xf1, 0xec, 0x06, 0xbb, 0x79, 0xff, 0xf7, 0x84, 0xff, 0x7b, 0x7a, + 0xf0, 0x22, 0x04, 0x21, 0xff, 0xf7, 0x31, 0xfd, 0x04, 0xf1, 0xfc, 0x06, + 0x3b, 0x7b, 0x01, 0x22, 0xff, 0xf7, 0x7a, 0xff, 0xfb, 0x7b, 0xff, 0xf7, + 0x26, 0xfd, 0x04, 0xf1, 0xd2, 0x08, 0xbb, 0x7c, 0x01, 0x22, 0x00, 0xf0, + 0xc0, 0xfb, 0x04, 0xf1, 0xe2, 0x09, 0x7b, 0x7d, 0x01, 0x22, 0x00, 0xf0, + 0xbf, 0xfb, 0x3b, 0x7e, 0x38, 0x22, 0x03, 0x21, 0x40, 0x46, 0xfe, 0xf7, + 0x73, 0xf9, 0xfb, 0x7e, 0x38, 0x22, 0x03, 0x21, 0x48, 0x46, 0xfe, 0xf7, + 0x6d, 0xf9, 0xbb, 0x7f, 0xff, 0x22, 0x00, 0x21, 0x04, 0xf1, 0xd3, 0x00, + 0xfe, 0xf7, 0x66, 0xf9, 0x07, 0xf1, 0x21, 0x06, 0xff, 0x22, 0x33, 0x78, + 0x00, 0x21, 0x04, 0xf1, 0xe3, 0x00, 0xfe, 0xf7, 0x5d, 0xf9, 0x04, 0xf1, + 0xc0, 0x0b, 0xf3, 0x78, 0x00, 0xf0, 0x60, 0xf8, 0xb3, 0x79, 0x04, 0x22, + 0x02, 0x21, 0x00, 0xf0, 0x58, 0xf8, 0x73, 0x7a, 0x00, 0xf0, 0x53, 0xf8, + 0x33, 0x7b, 0x08, 0x22, 0x03, 0x21, 0x00, 0xf0, 0x50, 0xf8, 0xf3, 0x7b, + 0x80, 0x22, 0x07, 0x21, 0x04, 0xf1, 0xef, 0x00, 0xfe, 0xf7, 0x44, 0xf9, + 0xb3, 0x7c, 0x80, 0x22, 0x07, 0x21, 0x04, 0xf1, 0xf2, 0x00, 0xfe, 0xf7, + 0x3d, 0xf9, 0x04, 0xf1, 0x02, 0x0b, 0x73, 0x7d, 0x00, 0xf0, 0x3b, 0xf8, + 0x33, 0x7e, 0x10, 0x22, 0x04, 0x21, 0x00, 0xf0, 0x38, 0xf8, 0xf3, 0x7e, + 0x20, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x33, 0xf8, 0xb3, 0x7f, 0x00, 0xf0, + 0x33, 0xf8, 0x17, 0xf8, 0x42, 0x3f, 0x04, 0x22, 0x02, 0x21, 0x04, 0xf1, + 0xf7, 0x00, 0xfe, 0xf7, 0x23, 0xf9, 0x0a, 0xeb, 0x05, 0x00, 0x00, 0xf1, + 0x45, 0x05, 0xc0, 0x22, 0x2b, 0x78, 0x06, 0x21, 0x40, 0x46, 0xfe, 0xf7, + 0x19, 0xf9, 0xeb, 0x78, 0xc0, 0x22, 0x06, 0x21, 0x48, 0x46, 0xfe, 0xf7, + 0x13, 0xf9, 0x7b, 0x7a, 0x08, 0x22, 0x03, 0x21, 0x00, 0xf0, 0x13, 0xf8, + 0xe4, 0x1c, 0x3b, 0x7b, 0x04, 0x22, 0x02, 0x21, 0xff, 0xf7, 0x1a, 0xfa, + 0xfb, 0x7b, 0xff, 0xf7, 0x15, 0xfa, 0xbb, 0x7c, 0x20, 0x46, 0x01, 0xb0, + 0xbd, 0xe8, 0xf0, 0x4f, 0x01, 0x22, 0xff, 0xf7, 0xb7, 0xb9, 0x02, 0x22, + 0x01, 0x21, 0x58, 0x46, 0xfe, 0xf7, 0xf8, 0xb8, 0x01, 0x22, 0x00, 0x21, + 0x58, 0x46, 0xfe, 0xf7, 0xf3, 0xb8, 0xfe, 0xf7, 0xf1, 0xb8, 0x00, 0x78, + 0x02, 0x40, 0xca, 0x40, 0xd0, 0xb2, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, + 0x38, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x82, 0xb0, 0x04, 0x46, 0x00, 0x20, + 0x00, 0x90, 0x9f, 0xed, 0xbe, 0x8a, 0x00, 0x25, 0x08, 0xe0, 0x69, 0x46, + 0x0b, 0x20, 0xf3, 0xf7, 0xbb, 0xff, 0x9d, 0xed, 0x00, 0x0a, 0x38, 0xee, + 0x00, 0x8a, 0x6d, 0x1c, 0xe8, 0xb2, 0xa0, 0x42, 0xf3, 0xd3, 0x00, 0xee, + 0x10, 0x4a, 0xb8, 0xee, 0x40, 0x0a, 0x02, 0xb0, 0x88, 0xee, 0x00, 0x0a, + 0xbd, 0xec, 0x02, 0x8b, 0x31, 0xbd, 0xdf, 0xf8, 0x70, 0x16, 0x51, 0xf8, + 0x20, 0x00, 0x2d, 0x30, 0xff, 0xf7, 0x14, 0xb8, 0x10, 0xb5, 0xc0, 0xf3, + 0x03, 0x22, 0xdf, 0xf8, 0x70, 0x46, 0x42, 0xf0, 0x40, 0x03, 0x23, 0x70, + 0x22, 0x70, 0x22, 0x70, 0x60, 0x70, 0xa1, 0x70, 0x42, 0xf0, 0x60, 0x02, + 0x09, 0x0a, 0xe1, 0x70, 0x23, 0x70, 0x22, 0x70, 0x10, 0xbd, 0x30, 0xb5, + 0xdf, 0xf8, 0x50, 0x26, 0x51, 0x7e, 0x01, 0x23, 0x03, 0xfa, 0x00, 0xf0, + 0x08, 0x43, 0xdf, 0xf8, 0x48, 0x36, 0x50, 0x76, 0x1c, 0x78, 0x51, 0x7e, + 0x0c, 0x19, 0x1c, 0x70, 0x15, 0x78, 0x65, 0x19, 0x15, 0x70, 0x10, 0x78, + 0x04, 0x19, 0x1c, 0x70, 0x30, 0xbd, 0xf0, 0xb5, 0xdf, 0xf8, 0x2c, 0x36, + 0x88, 0xb0, 0x1f, 0x78, 0x07, 0xea, 0x00, 0x06, 0x81, 0xea, 0x07, 0x02, + 0x87, 0x43, 0x16, 0x40, 0x08, 0x40, 0x00, 0x25, 0x00, 0x24, 0x38, 0x43, + 0xdf, 0xf8, 0xf0, 0x25, 0x0b, 0xe0, 0xf7, 0x07, 0x07, 0xd5, 0xef, 0xb2, + 0x52, 0xf8, 0x27, 0x10, 0x0e, 0x31, 0xe7, 0xb2, 0x4d, 0xf8, 0x27, 0x10, + 0x64, 0x1c, 0x6d, 0x1c, 0x76, 0x08, 0x37, 0x00, 0xf1, 0xd1, 0xef, 0xf3, + 0x10, 0x82, 0x72, 0xb6, 0xc5, 0x43, 0x9d, 0x70, 0x18, 0x70, 0xdf, 0xf8, + 0xe8, 0x55, 0x2e, 0x78, 0x18, 0x78, 0x86, 0x19, 0x2e, 0x70, 0x00, 0x20, + 0x0a, 0xe0, 0x5d, 0xf8, 0x26, 0x60, 0x1e, 0x27, 0x37, 0x70, 0x40, 0x1c, + 0x95, 0xf8, 0x00, 0xc0, 0x36, 0x78, 0xb4, 0x44, 0x85, 0xf8, 0x00, 0xc0, + 0xc6, 0xb2, 0xe7, 0xb2, 0xbe, 0x42, 0xf0, 0xd3, 0x82, 0xf3, 0x10, 0x88, + 0x00, 0x20, 0x98, 0x70, 0x29, 0x78, 0x98, 0x78, 0x41, 0x18, 0x29, 0x70, + 0x08, 0xb0, 0xf0, 0xbd, 0x10, 0xb5, 0xdf, 0xf8, 0x98, 0x15, 0xdf, 0xf8, + 0xa4, 0x25, 0x48, 0x7e, 0x13, 0x78, 0x0c, 0x78, 0x1c, 0x19, 0x0c, 0x70, + 0x09, 0x78, 0xcb, 0x18, 0x13, 0x70, 0x10, 0xbd, 0x38, 0xb5, 0x0d, 0x00, + 0x04, 0x46, 0x18, 0xbf, 0x01, 0x21, 0xff, 0xf7, 0x84, 0xfa, 0x20, 0x46, + 0x00, 0x2d, 0xbd, 0xe8, 0x34, 0x40, 0x14, 0xbf, 0x1e, 0x21, 0x00, 0x21, + 0xff, 0xf7, 0xa0, 0xba, 0xf8, 0xb5, 0x8e, 0xb0, 0x04, 0x46, 0x03, 0xa8, + 0x0f, 0xf2, 0xa4, 0x51, 0x10, 0x22, 0xf3, 0xf7, 0x4d, 0xff, 0x07, 0xa8, + 0x0f, 0xf2, 0xa8, 0x51, 0x1c, 0x22, 0xf3, 0xf7, 0x47, 0xff, 0x0f, 0xf2, + 0xbc, 0x51, 0x0a, 0x68, 0x00, 0x92, 0x03, 0xad, 0x02, 0x95, 0x07, 0xab, + 0xdf, 0xf8, 0x2c, 0x55, 0x01, 0x93, 0x40, 0x20, 0x28, 0x70, 0x60, 0x21, + 0x29, 0x70, 0x28, 0x70, 0x50, 0x23, 0x2b, 0x70, 0x00, 0x27, 0x0b, 0xe0, + 0x01, 0xa8, 0x00, 0xeb, 0x84, 0x01, 0xbb, 0xb2, 0x51, 0xf8, 0x04, 0x2c, + 0x32, 0xf8, 0x13, 0x10, 0xb8, 0xb2, 0xff, 0xf7, 0x45, 0xff, 0x7f, 0x1c, + 0x69, 0x46, 0x01, 0xeb, 0x44, 0x02, 0xb8, 0xb2, 0x32, 0xf8, 0x02, 0x3c, + 0x98, 0x42, 0xeb, 0xd3, 0x40, 0x20, 0x28, 0x70, 0x00, 0x21, 0x29, 0x70, + 0x01, 0x22, 0xaa, 0x71, 0xa9, 0x71, 0x10, 0x21, 0x29, 0x72, 0xdf, 0xf8, + 0xf4, 0x14, 0x0a, 0x78, 0x28, 0x7a, 0x82, 0x18, 0x01, 0x2c, 0x16, 0xd1, + 0x0f, 0xf2, 0x50, 0x50, 0xdf, 0xf8, 0xb4, 0x34, 0xd0, 0xe9, 0x00, 0x45, + 0xcd, 0xe9, 0x00, 0x45, 0x00, 0x20, 0x53, 0xf8, 0x20, 0x50, 0x1d, 0xf8, + 0x00, 0x60, 0x05, 0xf1, 0x3a, 0x07, 0x40, 0x1c, 0x3e, 0x70, 0x05, 0xf8, + 0x41, 0x6f, 0x2d, 0x78, 0xaa, 0x18, 0x08, 0x28, 0xf1, 0xd3, 0x0a, 0x70, + 0x0f, 0xb0, 0xf0, 0xbd, 0x10, 0xb5, 0x00, 0x23, 0x0b, 0x70, 0xdf, 0xf8, + 0xa0, 0x44, 0x23, 0x78, 0x13, 0x70, 0x01, 0x22, 0x02, 0xfa, 0x00, 0xf0, + 0x03, 0x42, 0x04, 0xd0, 0x0a, 0x70, 0x00, 0x21, 0xc0, 0xb2, 0xff, 0xf7, + 0x2a, 0xff, 0x20, 0x78, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x80, 0x08, 0x48, + 0x05, 0x80, 0x08, 0x48, 0x01, 0x29, 0x05, 0xd1, 0x11, 0x46, 0x01, 0x22, + 0x02, 0xfa, 0x00, 0xf0, 0xc0, 0xb2, 0x1a, 0xe7, 0x70, 0x47, 0xf8, 0xb5, + 0x06, 0x46, 0x0c, 0x46, 0xdf, 0xf8, 0x3c, 0x04, 0x31, 0x46, 0x50, 0xf8, + 0x21, 0x50, 0x05, 0xf1, 0x77, 0x07, 0x00, 0xf0, 0xf1, 0xf9, 0x01, 0x23, + 0x00, 0xf0, 0xef, 0xf9, 0x30, 0x46, 0xff, 0xf7, 0x3e, 0xfa, 0x05, 0xf1, + 0x7b, 0x00, 0x05, 0xf1, 0x7a, 0x01, 0x00, 0x78, 0x09, 0x78, 0x05, 0xf1, + 0x79, 0x02, 0x41, 0xea, 0x00, 0x21, 0x12, 0x78, 0x15, 0xf8, 0x78, 0x3f, + 0x42, 0xea, 0x01, 0x22, 0x43, 0xea, 0x02, 0x23, 0x23, 0x60, 0xf1, 0xbd, + 0xdf, 0xf8, 0x28, 0x14, 0x01, 0xeb, 0x80, 0x01, 0x08, 0x68, 0x70, 0x47, + 0xdf, 0xf8, 0x20, 0x24, 0x02, 0xeb, 0x80, 0x02, 0x07, 0x21, 0x11, 0x70, + 0x70, 0x47, 0x10, 0xb5, 0x84, 0x00, 0x04, 0xf1, 0x90, 0x44, 0x04, 0xf5, + 0x52, 0x74, 0x77, 0x21, 0x21, 0x70, 0xff, 0xf7, 0x14, 0xfa, 0x07, 0x22, + 0x22, 0x70, 0x10, 0xbd, 0xdf, 0xf8, 0xfc, 0x03, 0x01, 0x78, 0x41, 0xf0, + 0x10, 0x01, 0x01, 0x70, 0x01, 0xf0, 0xef, 0x01, 0x01, 0x70, 0x70, 0x47, + 0xdf, 0xf8, 0xec, 0x03, 0x00, 0x78, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, + 0xdf, 0xf8, 0xa4, 0x13, 0x51, 0xf8, 0x20, 0x10, 0x11, 0xf8, 0x70, 0x2f, + 0x09, 0x78, 0x01, 0xea, 0x52, 0x01, 0x00, 0x20, 0x01, 0xf0, 0x01, 0x01, + 0x01, 0x29, 0x08, 0xbf, 0x01, 0x20, 0x70, 0x47, 0xdf, 0xf8, 0xc4, 0x13, + 0x09, 0x68, 0x00, 0x20, 0x09, 0x0c, 0x11, 0xf0, 0x07, 0x01, 0x02, 0xd0, + 0x05, 0x29, 0x38, 0xbf, 0x01, 0x20, 0x70, 0x47, 0x70, 0xb5, 0x04, 0x46, + 0x00, 0xf0, 0x13, 0xf8, 0x15, 0x46, 0x00, 0xf0, 0x15, 0xf8, 0x00, 0x21, + 0x20, 0x46, 0xfe, 0xf7, 0x49, 0xfe, 0x00, 0x21, 0x20, 0x46, 0xfe, 0xf7, + 0x0d, 0xff, 0x29, 0x46, 0x20, 0x46, 0xfe, 0xf7, 0x7d, 0xff, 0x07, 0x20, + 0x06, 0xf8, 0x2a, 0x0f, 0x70, 0xbd, 0xd0, 0x48, 0x21, 0x46, 0x50, 0xf8, + 0x21, 0x60, 0x70, 0x47, 0x00, 0x23, 0x10, 0x22, 0x04, 0x21, 0x06, 0xf1, + 0x24, 0x00, 0xfd, 0xf7, 0x25, 0xbf, 0x10, 0xb5, 0xff, 0xf7, 0x0f, 0xf9, + 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x80, 0x22, 0x07, 0x21, 0x20, 0x30, + 0xfd, 0xf7, 0x1a, 0xbf, 0x01, 0x46, 0x01, 0x20, 0x07, 0x29, 0xd4, 0x4a, + 0x17, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, + 0x10, 0x12, 0x10, 0x68, 0x0c, 0xe0, 0x50, 0x68, 0x0a, 0xe0, 0x90, 0x68, + 0x08, 0xe0, 0xd0, 0x68, 0x06, 0xe0, 0x10, 0x69, 0x04, 0xe0, 0x50, 0x69, + 0x02, 0xe0, 0x90, 0x69, 0x00, 0xe0, 0xd0, 0x69, 0xc0, 0x0e, 0x00, 0xf0, + 0x01, 0x00, 0x70, 0x47, 0x10, 0xb5, 0xc7, 0x4a, 0x52, 0xf8, 0x20, 0x40, + 0x60, 0x1c, 0x19, 0xb1, 0x00, 0xf0, 0x2f, 0xf9, 0x00, 0x23, 0x04, 0xe0, + 0x00, 0x23, 0x01, 0x22, 0xfd, 0xf7, 0xee, 0xfe, 0x01, 0x23, 0xfe, 0xf7, + 0x83, 0xf9, 0x14, 0xf8, 0x20, 0x0f, 0xbf, 0x49, 0x00, 0xf0, 0xff, 0xf8, + 0x10, 0xbd, 0x70, 0xb5, 0xbb, 0x4b, 0x53, 0xf8, 0x20, 0x30, 0x03, 0xf1, + 0x20, 0x04, 0x10, 0x44, 0x24, 0x78, 0x04, 0xf0, 0x01, 0x04, 0x04, 0x70, + 0x03, 0xf1, 0x11, 0x05, 0x03, 0xf1, 0x18, 0x06, 0x2c, 0x78, 0x04, 0x72, + 0x03, 0xf1, 0x13, 0x05, 0x03, 0xf1, 0x12, 0x04, 0x24, 0x78, 0x04, 0x74, + 0x2c, 0x78, 0x04, 0x76, 0x03, 0xf1, 0x15, 0x05, 0x03, 0xf1, 0x14, 0x04, + 0x24, 0x78, 0x80, 0xf8, 0x20, 0x40, 0x2c, 0x78, 0x00, 0xf1, 0x28, 0x05, + 0x2c, 0x70, 0x03, 0xf1, 0x16, 0x04, 0x24, 0x78, 0x04, 0xf0, 0x0f, 0x04, + 0x2c, 0x72, 0x03, 0xf1, 0x17, 0x04, 0x24, 0x78, 0x2c, 0x74, 0x34, 0x78, + 0x04, 0xf0, 0x0f, 0x04, 0x2c, 0x76, 0x03, 0xf1, 0x19, 0x04, 0x1a, 0x33, + 0x24, 0x78, 0x00, 0xf8, 0x48, 0x4f, 0x01, 0x29, 0x1b, 0x78, 0x03, 0x72, + 0x0b, 0xd1, 0xa0, 0x48, 0x00, 0x78, 0x02, 0xf1, 0x58, 0x01, 0x00, 0xf0, + 0x03, 0x00, 0x08, 0x70, 0x9d, 0x48, 0x00, 0x78, 0x00, 0xf0, 0x03, 0x00, + 0x48, 0x70, 0x70, 0xbd, 0xf8, 0xb5, 0x05, 0x46, 0x01, 0x2a, 0x0e, 0x46, + 0x97, 0x4c, 0x99, 0x4f, 0x99, 0x48, 0x21, 0xd1, 0x00, 0x23, 0x00, 0xf0, + 0xce, 0xf8, 0x00, 0xf0, 0xd9, 0xf8, 0x94, 0x4f, 0x6d, 0xb1, 0x00, 0x23, + 0x10, 0x22, 0x04, 0x21, 0xff, 0xf7, 0xa2, 0xf9, 0x06, 0xf1, 0x58, 0x05, + 0x03, 0x22, 0x2b, 0x78, 0xfe, 0xf7, 0x1b, 0xf9, 0x6b, 0x78, 0x03, 0x22, + 0x13, 0xe0, 0xfe, 0xf7, 0x85, 0xfc, 0xff, 0xf7, 0x95, 0xf9, 0x00, 0x23, + 0x03, 0x22, 0x00, 0xf0, 0xc3, 0xf8, 0x02, 0x23, 0x03, 0x22, 0x00, 0x21, + 0x20, 0x46, 0x08, 0xe0, 0x6e, 0x1e, 0xb6, 0x41, 0xf3, 0x0f, 0x00, 0xf0, + 0xa9, 0xf8, 0xf3, 0x0f, 0x01, 0x22, 0x00, 0x21, 0x38, 0x46, 0xfd, 0xf7, + 0x67, 0xfe, 0x20, 0x78, 0x82, 0x49, 0x0a, 0x78, 0x00, 0xf0, 0x03, 0x00, + 0x80, 0x18, 0x08, 0x70, 0xf1, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x06, 0x46, + 0x77, 0x48, 0x50, 0xf8, 0x26, 0x50, 0x0c, 0x46, 0x17, 0x46, 0x00, 0xf0, + 0xa5, 0xf8, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x20, 0x00, + 0xfd, 0xf7, 0x4e, 0xfe, 0x68, 0x1c, 0x3e, 0x44, 0x00, 0x2c, 0x05, 0xf1, + 0x15, 0x07, 0x05, 0xf1, 0x14, 0x08, 0x05, 0xf1, 0x13, 0x09, 0x05, 0xf1, + 0x12, 0x0a, 0x05, 0xf1, 0x11, 0x0b, 0x22, 0xd1, 0x00, 0x23, 0x00, 0xf0, + 0x79, 0xf8, 0x00, 0x23, 0xff, 0x22, 0xff, 0xf7, 0x42, 0xfd, 0x00, 0x23, + 0x00, 0xf0, 0x55, 0xf8, 0x00, 0x23, 0x00, 0xf0, 0x78, 0xf8, 0x00, 0x23, + 0x00, 0xf0, 0x70, 0xf8, 0x00, 0x23, 0xff, 0x22, 0x00, 0xf0, 0x78, 0xf8, + 0x00, 0x23, 0x00, 0xf0, 0x5e, 0xf8, 0x00, 0x23, 0x00, 0xf0, 0x55, 0xf8, + 0x00, 0x23, 0x00, 0xf0, 0x4c, 0xf8, 0x00, 0x23, 0xff, 0x22, 0x00, 0xf0, + 0x43, 0xf8, 0x00, 0x23, 0x25, 0xe0, 0x00, 0xf0, 0x56, 0xf8, 0x33, 0x7a, + 0xff, 0x22, 0xff, 0xf7, 0x20, 0xfd, 0x33, 0x7c, 0x00, 0xf0, 0x33, 0xf8, + 0x33, 0x7e, 0x00, 0xf0, 0x56, 0xf8, 0x96, 0xf8, 0x20, 0x30, 0x00, 0xf0, + 0x4d, 0xf8, 0x06, 0xf1, 0x28, 0x04, 0xff, 0x22, 0x23, 0x78, 0x00, 0xf0, + 0x53, 0xf8, 0x23, 0x7a, 0x00, 0xf0, 0x39, 0xf8, 0x23, 0x7c, 0x00, 0xf0, + 0x30, 0xf8, 0x23, 0x7e, 0x00, 0xf0, 0x27, 0xf8, 0x06, 0xf1, 0x48, 0x04, + 0xff, 0x22, 0x23, 0x78, 0x00, 0xf0, 0x1c, 0xf8, 0x23, 0x7a, 0xff, 0x22, + 0x00, 0x21, 0x05, 0xf1, 0x1a, 0x00, 0xfd, 0xf7, 0xf1, 0xfd, 0x20, 0x35, + 0x33, 0x78, 0x00, 0xf0, 0x3e, 0xf8, 0x28, 0x78, 0x46, 0x49, 0x00, 0xf0, + 0x02, 0xf8, 0xbd, 0xe8, 0xf1, 0x8f, 0x0a, 0x78, 0x00, 0xf0, 0x01, 0x00, + 0x80, 0x18, 0x08, 0x70, 0x70, 0x47, 0xff, 0x22, 0x00, 0x21, 0x50, 0x46, + 0xfd, 0xf7, 0xdc, 0xbd, 0x00, 0x21, 0x05, 0xf1, 0x19, 0x00, 0xfd, 0xf7, + 0xd7, 0xbd, 0x0f, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x18, 0x00, 0xfd, 0xf7, + 0xd1, 0xbd, 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x17, 0x00, 0xfd, 0xf7, + 0xcb, 0xbd, 0x0f, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x16, 0x00, 0xfd, 0xf7, + 0xc5, 0xbd, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0xfd, 0xf7, 0xc0, 0xbd, + 0xff, 0x22, 0x00, 0x21, 0x40, 0x46, 0xfd, 0xf7, 0xbb, 0xbd, 0xff, 0x22, + 0x00, 0x21, 0x48, 0x46, 0xfd, 0xf7, 0xb6, 0xbd, 0x00, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x38, 0x46, 0xfd, 0xf7, 0xb0, 0xbd, 0x00, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x28, 0x46, 0xfd, 0xf7, 0xaa, 0xbd, 0x38, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x11, 0x46, 0xfd, 0xf7, 0xaf, 0xfe, 0x09, 0x4a, 0x01, 0x46, + 0x52, 0xf8, 0x24, 0x00, 0x00, 0x2d, 0xcb, 0xb2, 0x03, 0xd1, 0x3f, 0x22, + 0x00, 0x21, 0xc3, 0x30, 0x02, 0xe0, 0x3f, 0x22, 0x00, 0x21, 0xc5, 0x30, + 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0xfd, 0xf7, 0x91, 0xbd, 0x00, 0x00, + 0x40, 0x9a, 0x04, 0x02, 0x01, 0x80, 0xff, 0xff, 0x01, 0xc0, 0xff, 0xff, + 0xd4, 0x75, 0x02, 0x21, 0x54, 0x8f, 0x04, 0x02, 0x32, 0x40, 0x08, 0x48, + 0x07, 0x80, 0x08, 0x48, 0x45, 0x76, 0x02, 0x21, 0x20, 0x80, 0x08, 0x48, + 0x46, 0x76, 0x02, 0x21, 0x47, 0x76, 0x02, 0x21, 0x48, 0x76, 0x02, 0x21, + 0xc8, 0x03, 0x00, 0x48, 0x49, 0x03, 0x00, 0x48, 0x00, 0x00, 0x01, 0x48, + 0x24, 0x03, 0x01, 0x48, 0x30, 0x00, 0x00, 0x48, 0x48, 0x04, 0x00, 0x48, + 0x20, 0x9a, 0x04, 0x02, 0x49, 0x76, 0x02, 0x21, 0x00, 0x80, 0x07, 0x48, + 0x26, 0x00, 0x06, 0x48, 0x02, 0x80, 0x07, 0x48, 0x01, 0x80, 0x07, 0x48, + 0x4a, 0x76, 0x02, 0x21, 0x4b, 0x76, 0x02, 0x21, 0x00, 0x00, 0x1d, 0x10, + 0x0e, 0x01, 0x00, 0x00, 0x1e, 0x10, 0x0e, 0x01, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x1d, 0x10, 0x0e, 0x01, 0x02, 0x11, 0x07, 0x90, 0x01, 0x23, + 0x04, 0x80, 0x1e, 0x10, 0x0e, 0x01, 0x05, 0x11, 0x01, 0x90, 0x01, 0x23, + 0x0a, 0x80, 0x00, 0x00, 0x0d, 0x00, 0x07, 0x00, 0x1d, 0x25, 0x1f, 0x2b, + 0x29, 0x35, 0x2f, 0x3d, 0xfe, 0xf7, 0xa6, 0xba, 0xfe, 0xf7, 0x4c, 0xbb, + 0xfd, 0xf7, 0x68, 0xbf, 0xfd, 0xf7, 0x76, 0xbf, 0x10, 0xb5, 0x04, 0x46, + 0x21, 0x88, 0x20, 0x79, 0xfe, 0xf7, 0x68, 0xf9, 0x61, 0x88, 0x20, 0x79, + 0xbd, 0xe8, 0x10, 0x40, 0xfe, 0xf7, 0x72, 0xb9, 0x10, 0xb5, 0x04, 0x46, + 0x22, 0x78, 0x61, 0x78, 0x60, 0x79, 0xfe, 0xf7, 0xdd, 0xf8, 0x23, 0x78, + 0xa2, 0x78, 0xe1, 0x78, 0x60, 0x79, 0xfe, 0xf7, 0x25, 0xf9, 0x22, 0x78, + 0x21, 0x79, 0x60, 0x79, 0xbd, 0xe8, 0x10, 0x40, 0xfe, 0xf7, 0x02, 0xb9, + 0xf8, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0x1f, 0x46, 0xfe, 0xf7, + 0x1d, 0xf8, 0x30, 0x60, 0x29, 0x46, 0x20, 0x46, 0xfe, 0xf7, 0x46, 0xf8, + 0x38, 0x60, 0xf1, 0xbd, 0x83, 0x78, 0x42, 0x78, 0x01, 0x78, 0xc0, 0x78, + 0xfe, 0xf7, 0x0a, 0xbc, 0xfe, 0xf7, 0xbc, 0xbb, 0x1c, 0xb5, 0x9d, 0xf8, + 0x10, 0x40, 0x00, 0x94, 0xfe, 0xf7, 0xee, 0xfb, 0x13, 0xbd, 0xfe, 0xf7, + 0xb1, 0xb9, 0xfe, 0xf7, 0xed, 0xb9, 0xfe, 0xf7, 0xfb, 0xbb, 0xfe, 0xf7, + 0xff, 0xbb, 0xfe, 0xf7, 0x30, 0xbc, 0xfe, 0xf7, 0x32, 0xbc, 0xfe, 0xf7, + 0x34, 0xbc, 0xfe, 0xf7, 0x38, 0xbc, 0xfe, 0xf7, 0x3f, 0xbc, 0xfe, 0xf7, + 0x43, 0xbc, 0xfe, 0xf7, 0x63, 0xbc, 0x70, 0x47, 0x80, 0xb5, 0x00, 0x91, + 0x83, 0x78, 0x42, 0x78, 0x01, 0x78, 0xc0, 0x78, 0xfe, 0xf7, 0xce, 0xfb, + 0x01, 0xbd, 0xfe, 0xf7, 0x2d, 0xbb, 0xfe, 0xf7, 0x4e, 0xbf, 0xfd, 0xf7, + 0xe3, 0xbe, 0x10, 0xb5, 0x04, 0x46, 0xa0, 0x79, 0x30, 0xb9, 0x94, 0xf9, + 0x02, 0x20, 0x94, 0xf9, 0x01, 0x10, 0xe0, 0x79, 0xfd, 0xf7, 0xd7, 0xfd, + 0xa0, 0x79, 0x01, 0x28, 0x07, 0xd1, 0x21, 0x56, 0x94, 0xf9, 0x02, 0x20, + 0xe0, 0x79, 0xbd, 0xe8, 0x10, 0x40, 0xfd, 0xf7, 0xb5, 0xbd, 0x10, 0xbd, + 0x10, 0xb5, 0x04, 0x46, 0xa0, 0x79, 0x18, 0xb9, 0x00, 0xf0, 0x0c, 0xf8, + 0xfd, 0xf7, 0x91, 0xfe, 0xa0, 0x79, 0x01, 0x28, 0x05, 0xd1, 0x00, 0xf0, + 0x05, 0xf8, 0xbd, 0xe8, 0x10, 0x40, 0xfd, 0xf7, 0x79, 0xbe, 0x10, 0xbd, + 0x94, 0xf9, 0x05, 0x30, 0x94, 0xf9, 0x04, 0x20, 0x94, 0xf9, 0x03, 0x10, + 0xe0, 0x79, 0x70, 0x47, 0x83, 0x78, 0x42, 0x78, 0x01, 0x78, 0xc0, 0x78, + 0xfd, 0xf7, 0x54, 0xbf, 0x13, 0x00, 0x08, 0xbf, 0xfd, 0xf7, 0x26, 0xbd, + 0x01, 0x2a, 0x08, 0xbf, 0xfd, 0xf7, 0x2d, 0xbd, 0x70, 0x47, 0x38, 0xb5, + 0x04, 0x46, 0x10, 0x00, 0x0d, 0x46, 0x08, 0xd1, 0x20, 0x46, 0xfd, 0xf7, + 0x19, 0xfd, 0x29, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0x34, 0x40, 0xfd, 0xf7, + 0xde, 0xbc, 0x01, 0x2a, 0x08, 0xd1, 0x20, 0x46, 0xfd, 0xf7, 0x19, 0xfd, + 0x29, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0x34, 0x40, 0xfd, 0xf7, 0xe1, 0xbc, + 0x31, 0xbd, 0x80, 0xb5, 0x00, 0x22, 0x0b, 0x00, 0x02, 0xd1, 0xfd, 0xf7, + 0x17, 0xfd, 0x03, 0xe0, 0x01, 0x29, 0x02, 0xd1, 0xfd, 0xf7, 0x20, 0xfd, + 0x02, 0x46, 0x10, 0x46, 0x02, 0xbd, 0x13, 0x00, 0x08, 0xbf, 0xfd, 0xf7, + 0xc0, 0xbc, 0x01, 0x2a, 0x08, 0xbf, 0xfd, 0xf7, 0xca, 0xbc, 0x70, 0x47, + 0x80, 0xb5, 0x00, 0x22, 0x0b, 0x00, 0x02, 0xd1, 0xfd, 0xf7, 0xce, 0xfc, + 0x03, 0xe0, 0x01, 0x29, 0x02, 0xd1, 0xfd, 0xf7, 0xd7, 0xfc, 0x02, 0x46, + 0x10, 0x46, 0x02, 0xbd, 0x10, 0xb5, 0x04, 0x46, 0xa0, 0x79, 0x18, 0xb9, + 0x21, 0x56, 0xe0, 0x79, 0xfd, 0xf7, 0x73, 0xfc, 0xa0, 0x79, 0x01, 0x28, + 0x06, 0xd1, 0x94, 0xf9, 0x00, 0x10, 0xe0, 0x79, 0xbd, 0xe8, 0x10, 0x40, + 0xfd, 0xf7, 0x74, 0xbc, 0x10, 0xbd, 0x80, 0xb5, 0x00, 0x22, 0x0b, 0x00, + 0x02, 0xd1, 0xfd, 0xf7, 0x78, 0xfc, 0x03, 0xe0, 0x01, 0x29, 0x02, 0xd1, + 0xfd, 0xf7, 0x81, 0xfc, 0x02, 0x46, 0x10, 0x46, 0x02, 0xbd, 0xfe, 0xf7, + 0xae, 0xbd, 0x38, 0xb5, 0x04, 0x46, 0x15, 0x46, 0xfe, 0xf7, 0x47, 0xfd, + 0x29, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0x34, 0x40, 0xfe, 0xf7, 0x74, 0xbd, + 0x10, 0xb5, 0x04, 0x46, 0x00, 0x21, 0xfe, 0xf7, 0x8b, 0xfd, 0x20, 0x46, + 0xfe, 0xf7, 0xbd, 0xfe, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x01, 0x21, + 0xfe, 0xf7, 0x82, 0xbd, 0x70, 0xb5, 0x05, 0x46, 0x0c, 0x4c, 0x28, 0x46, + 0xfe, 0xf7, 0xb2, 0xfd, 0x06, 0x46, 0x01, 0x20, 0xf2, 0xf7, 0x16, 0xff, + 0x64, 0x1e, 0x0e, 0xb9, 0x00, 0x2c, 0xf4, 0xd1, 0x70, 0xbd, 0x38, 0xb5, + 0x05, 0x46, 0x05, 0x4c, 0x28, 0x46, 0xfe, 0xf7, 0xa3, 0xfd, 0x64, 0x1e, + 0x08, 0xb9, 0x00, 0x2c, 0xf8, 0xd1, 0x31, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x42, 0x0f, 0x00, 0xfe, 0xf7, 0x89, 0xbd, 0x82, 0xb0, 0x02, 0x9b, + 0x02, 0xb0, 0xf2, 0xf7, 0x87, 0xbe, 0xf8, 0xb5, 0x00, 0xf0, 0x17, 0xf8, + 0x04, 0xe0, 0x29, 0x46, 0x20, 0x46, 0xfe, 0xf7, 0xcb, 0xfc, 0x7f, 0x1c, + 0xf8, 0xb2, 0xb0, 0x42, 0xf7, 0xd3, 0xf1, 0xbd, 0xf8, 0xb5, 0x00, 0xf0, + 0x0a, 0xf8, 0x04, 0xe0, 0x29, 0x46, 0x20, 0x46, 0xfe, 0xf7, 0xd3, 0xfc, + 0x7f, 0x1c, 0xf8, 0xb2, 0xb0, 0x42, 0xf7, 0xd3, 0xf1, 0xbd, 0x04, 0x46, + 0x0d, 0x46, 0x16, 0x46, 0x00, 0x27, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46, + 0xfe, 0xf7, 0x8f, 0xfc, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0xff, 0xf7, + 0x89, 0xb9, 0xfd, 0xf7, 0xe8, 0xbb, 0xff, 0xf7, 0xf1, 0xb8, 0xfd, 0xf7, + 0xe8, 0xbb, 0xff, 0xf7, 0xbb, 0xb9, 0xff, 0xf7, 0x9f, 0xb9, 0x09, 0x78, + 0xfe, 0xf7, 0x94, 0xbb, 0xfe, 0xf7, 0xae, 0xbb, 0x89, 0x79, 0xfe, 0xf7, + 0x03, 0xbc, 0xfe, 0xf7, 0x19, 0xbc, 0xc9, 0x79, 0xfe, 0xf7, 0x28, 0xbc, + 0xfe, 0xf7, 0x38, 0xbc, 0x09, 0x79, 0xfe, 0xf7, 0xd6, 0xbb, 0x49, 0x79, + 0xfe, 0xf7, 0xdc, 0xbb, 0xfe, 0xf7, 0xe5, 0xbb, 0xfe, 0xf7, 0xe9, 0xbb, + 0x49, 0x78, 0xfe, 0xf7, 0x5a, 0xbb, 0x89, 0x78, 0xfe, 0xf7, 0x60, 0xbb, + 0xc9, 0x78, 0xfe, 0xf7, 0x6c, 0xbb, 0xfe, 0xf7, 0x9c, 0xbb, 0xfe, 0xf7, + 0xae, 0xbb, 0xfe, 0xf7, 0xa3, 0xbb, 0xfe, 0xf7, 0xb3, 0xbb, 0xfe, 0xf7, + 0x86, 0xbe, 0x01, 0x23, 0x02, 0xf0, 0x26, 0xbe, 0x38, 0xb5, 0x84, 0xb0, + 0x9d, 0xf8, 0x2c, 0x40, 0x9d, 0xf8, 0x28, 0x50, 0x03, 0x94, 0x02, 0x95, + 0x9d, 0xf8, 0x24, 0x40, 0x9d, 0xf8, 0x20, 0x50, 0x01, 0x94, 0x00, 0x95, + 0x02, 0xf0, 0x76, 0xfd, 0x05, 0xb0, 0x30, 0xbd, 0xfd, 0xf7, 0x6a, 0xbd, + 0xfe, 0xf7, 0x71, 0xbc, 0xfe, 0xf7, 0x5a, 0xbc, 0x80, 0xb5, 0x00, 0x22, + 0x0b, 0x00, 0x02, 0xd1, 0xfd, 0xf7, 0x34, 0xfc, 0x03, 0xe0, 0x01, 0x29, + 0x02, 0xd1, 0xfd, 0xf7, 0x3d, 0xfc, 0x02, 0x46, 0x10, 0x46, 0x02, 0xbd, + 0x80, 0xb5, 0x00, 0x22, 0x0b, 0x00, 0x02, 0xd1, 0xfd, 0xf7, 0x42, 0xfc, + 0x03, 0xe0, 0x01, 0x29, 0x02, 0xd1, 0xfd, 0xf7, 0x4b, 0xfc, 0x02, 0x46, + 0x10, 0x46, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0x22, 0x0b, 0x00, 0x02, 0xd1, + 0xfd, 0xf7, 0x87, 0xfc, 0x03, 0xe0, 0x01, 0x29, 0x02, 0xd1, 0xfd, 0xf7, + 0x90, 0xfc, 0x02, 0x46, 0x10, 0x46, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0x22, + 0x0b, 0x00, 0x02, 0xd1, 0xfd, 0xf7, 0x95, 0xfc, 0x03, 0xe0, 0x01, 0x29, + 0x02, 0xd1, 0xfd, 0xf7, 0x9e, 0xfc, 0x02, 0x46, 0x10, 0x46, 0x02, 0xbd, + 0x80, 0xb5, 0x00, 0x22, 0x0b, 0x00, 0x02, 0xd1, 0xfd, 0xf7, 0xa3, 0xfc, + 0x03, 0xe0, 0x01, 0x29, 0x02, 0xd1, 0xfd, 0xf7, 0xac, 0xfc, 0x02, 0x46, + 0x10, 0x46, 0x02, 0xbd, 0xfd, 0xf7, 0xd0, 0xbd, 0xfd, 0xf7, 0xde, 0xbd, + 0xfd, 0xf7, 0xa1, 0xbd, 0xfd, 0xf7, 0x7c, 0xbd, 0xfe, 0xf7, 0x8e, 0xba, + 0xfe, 0xf7, 0x9d, 0xba, 0xfe, 0xf7, 0xb5, 0xbd, 0x0b, 0x00, 0x04, 0xbf, + 0x11, 0x46, 0xfe, 0xf7, 0x42, 0xbd, 0x01, 0x29, 0x04, 0xbf, 0x11, 0x46, + 0xfe, 0xf7, 0x48, 0xbd, 0x70, 0x47, 0x1c, 0xb5, 0x9d, 0xf8, 0x10, 0x40, + 0x00, 0x94, 0xfd, 0xf7, 0x2c, 0xfd, 0x13, 0xbd, 0xfd, 0xf7, 0x7b, 0xbf, + 0xfd, 0xf7, 0xa1, 0xbf, 0xfd, 0xf7, 0xde, 0xbd, 0xfd, 0xf7, 0xf4, 0xbd, + 0xfd, 0xf7, 0x0f, 0xbe, 0xfd, 0xf7, 0x16, 0xbe, 0xfd, 0xf7, 0x30, 0xbe, + 0xfd, 0xf7, 0x77, 0xbe, 0xfd, 0xf7, 0xbc, 0xbe, 0xfd, 0xf7, 0xd4, 0xbe, + 0xfd, 0xf7, 0xde, 0xbe, 0xf8, 0xb5, 0xff, 0xf7, 0x22, 0xff, 0x26, 0xfa, + 0x07, 0xf0, 0xc0, 0x07, 0x04, 0xd5, 0xfa, 0xb2, 0x29, 0x46, 0x20, 0x46, + 0xfd, 0xf7, 0xde, 0xfe, 0x7f, 0x1c, 0xf8, 0xb2, 0x04, 0x28, 0xf2, 0xd3, + 0xf1, 0xbd, 0xfd, 0xf7, 0xf3, 0xbe, 0xfd, 0xf7, 0x09, 0xbf, 0xfd, 0xf7, + 0x1f, 0xbf, 0xfd, 0xf7, 0x2d, 0xbf, 0xfe, 0xf7, 0x82, 0xbd, 0xfe, 0xf7, + 0x8b, 0xbd, 0xfe, 0xf7, 0x9e, 0xbd, 0xfe, 0xf7, 0xa7, 0xbd, 0xfe, 0xf7, + 0x2a, 0xbe, 0xfe, 0xf7, 0x3c, 0xbe, 0xfe, 0xf7, 0xd5, 0xbe, 0xfe, 0xf7, + 0x7d, 0xbe, 0xfd, 0xf7, 0xd6, 0xbc, 0xfe, 0xf7, 0x34, 0xbf, 0xfe, 0xf7, + 0x49, 0xbf, 0xfe, 0xf7, 0x8a, 0xbc, 0xfe, 0xf7, 0x60, 0xbf, 0xfe, 0xf7, + 0x65, 0xbf, 0xfe, 0xf7, 0x6e, 0xbf, 0xfe, 0xf7, 0x8c, 0xbf, 0x03, 0xf0, + 0xe0, 0xb9, 0xfe, 0xf7, 0x6e, 0xbb, 0xfe, 0xf7, 0x3f, 0xbd, 0xff, 0xf7, + 0xcc, 0xb9, 0xff, 0xf7, 0xcc, 0xb9, 0xff, 0xf7, 0xd1, 0xb9, 0xff, 0xf7, + 0xf0, 0xb9, 0xff, 0xf7, 0xe3, 0xba, 0xff, 0xf7, 0xf9, 0xba, 0xff, 0xf7, + 0x1a, 0xba, 0xff, 0xf7, 0x5f, 0xba, 0xff, 0xf7, 0x7b, 0xba, 0xff, 0xf7, + 0x69, 0xba, 0xff, 0xf7, 0x63, 0xbb, 0xff, 0xf7, 0x84, 0xbb, 0x00, 0x29, + 0x11, 0x46, 0x08, 0xbf, 0xfe, 0xf7, 0xaf, 0xbc, 0xfe, 0xf7, 0xb6, 0xbc, + 0x02, 0xf0, 0x9f, 0xbf, 0x00, 0x29, 0x11, 0x46, 0x08, 0xbf, 0xfd, 0xf7, + 0x43, 0xbc, 0xfd, 0xf7, 0x1a, 0xbc, 0xff, 0xf7, 0xed, 0xbc, 0x00, 0x29, + 0x11, 0x46, 0x08, 0xbf, 0xfd, 0xf7, 0x53, 0xbc, 0xfd, 0xf7, 0x2d, 0xbc, + 0xff, 0xf7, 0xdb, 0xba, 0xff, 0xf7, 0x72, 0xbb, 0x2d, 0xe9, 0xf8, 0x43, + 0x90, 0x46, 0x00, 0x24, 0x08, 0xf1, 0x42, 0x06, 0x07, 0x46, 0x88, 0xf8, + 0x89, 0x40, 0x01, 0x25, 0x96, 0xf9, 0x04, 0x00, 0x90, 0xbb, 0x38, 0x46, + 0xff, 0xf7, 0x18, 0xfb, 0x01, 0x28, 0xa1, 0x46, 0x06, 0xd1, 0x98, 0xf8, + 0x89, 0x00, 0x40, 0xf0, 0x01, 0x00, 0xa9, 0x46, 0x88, 0xf8, 0x89, 0x00, + 0xff, 0xf7, 0x1c, 0xfb, 0x01, 0x28, 0x06, 0xd1, 0x98, 0xf8, 0x89, 0x00, + 0x40, 0xf0, 0x02, 0x00, 0x88, 0xf8, 0x89, 0x00, 0x1a, 0xe0, 0xb9, 0xf1, + 0x00, 0x0f, 0x17, 0xd1, 0x38, 0x46, 0x03, 0xf0, 0x66, 0xfc, 0x80, 0x46, + 0x00, 0x27, 0x98, 0xf8, 0x0b, 0x00, 0x01, 0x21, 0xb9, 0x40, 0x08, 0x42, + 0x03, 0xd0, 0xf8, 0xb2, 0xff, 0xf7, 0x3c, 0xfb, 0x05, 0x40, 0x7f, 0x1c, + 0xf8, 0xb2, 0x08, 0x28, 0xf1, 0xd3, 0x1d, 0xb9, 0x30, 0x88, 0x40, 0x1c, + 0x01, 0x24, 0x30, 0x80, 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0x02, 0x46, + 0x01, 0x21, 0x00, 0x20, 0x04, 0xf0, 0xa4, 0xb9, 0x10, 0xb5, 0x04, 0x46, + 0x08, 0x46, 0xff, 0xf7, 0xb1, 0xfa, 0xc4, 0xf8, 0x80, 0x00, 0x10, 0xbd, + 0xff, 0xf7, 0xb2, 0xba, 0xff, 0xf7, 0xb7, 0xba, 0xff, 0xf7, 0xc2, 0xba, + 0xff, 0xf7, 0xca, 0xba, 0xf8, 0xb5, 0x04, 0x46, 0x0e, 0x46, 0x03, 0xf0, + 0x34, 0xfc, 0x00, 0x25, 0x00, 0x21, 0x00, 0x22, 0xc3, 0x7a, 0x01, 0x27, + 0x97, 0x40, 0x3b, 0x42, 0x02, 0xd0, 0x01, 0x2e, 0x11, 0x46, 0x03, 0xd0, + 0x52, 0x1c, 0xd3, 0xb2, 0x08, 0x2b, 0xf3, 0xd3, 0xc9, 0xb2, 0x8c, 0x42, + 0x08, 0xbf, 0x01, 0x25, 0x28, 0x46, 0xf2, 0xbd, 0x10, 0xb5, 0x04, 0x46, + 0xff, 0xf7, 0xc0, 0xfd, 0x20, 0x46, 0xff, 0xf7, 0x3e, 0xfd, 0x20, 0x46, + 0xbd, 0xe8, 0x10, 0x40, 0x50, 0xe5, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x00, 0x26, 0x01, 0x21, 0x20, 0x46, 0xff, 0xf7, 0xda, 0xfe, + 0x20, 0x46, 0xff, 0xf7, 0xd5, 0xfe, 0xf1, 0xb2, 0x76, 0x1c, 0x68, 0x54, + 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, 0xd0, 0xfe, 0xf0, 0xb2, 0x08, 0x28, + 0xee, 0xd3, 0x70, 0xbd, 0x10, 0xb5, 0x05, 0xf0, 0x36, 0xf8, 0x04, 0x46, + 0xdf, 0xf8, 0xa4, 0x13, 0x00, 0x20, 0x08, 0x70, 0x42, 0xf6, 0xd0, 0x71, + 0x60, 0x6c, 0x05, 0xf0, 0xc7, 0xfa, 0xe0, 0x6b, 0x20, 0x21, 0x00, 0xf2, + 0x7c, 0x50, 0x05, 0xf0, 0xc1, 0xfa, 0xe0, 0x6b, 0x20, 0x21, 0x00, 0xf2, + 0x9c, 0x50, 0x05, 0xf0, 0xbb, 0xfa, 0xe0, 0x6b, 0x20, 0x21, 0x00, 0xf2, + 0xbc, 0x50, 0x05, 0xf0, 0xb5, 0xfa, 0xe0, 0x6b, 0x20, 0x21, 0x00, 0xf2, + 0x1c, 0x60, 0x05, 0xf0, 0xaf, 0xfa, 0xe0, 0x6b, 0x20, 0x21, 0x00, 0xf2, + 0xfc, 0x50, 0x05, 0xf0, 0xa9, 0xfa, 0xe0, 0x6b, 0xbd, 0xe8, 0x10, 0x40, + 0x20, 0x21, 0x00, 0xf2, 0xdc, 0x50, 0x05, 0xf0, 0xa1, 0xba, 0x2d, 0xe9, + 0xff, 0x47, 0x0d, 0x46, 0x00, 0x21, 0x02, 0x91, 0x81, 0x46, 0x04, 0xf0, + 0xfe, 0xff, 0x06, 0x46, 0x05, 0xf1, 0x88, 0x0a, 0xf0, 0x6b, 0x00, 0xf5, + 0x3e, 0x78, 0x08, 0xf5, 0xa9, 0x77, 0x48, 0x46, 0x3c, 0x78, 0x85, 0xf8, + 0x00, 0x90, 0x21, 0x46, 0xff, 0xf7, 0x33, 0xfd, 0x28, 0x75, 0x22, 0x46, + 0x49, 0x46, 0x68, 0x46, 0x05, 0xf0, 0x28, 0xfe, 0x9d, 0xf8, 0x01, 0x10, + 0x69, 0x75, 0x05, 0xf1, 0xac, 0x04, 0x9d, 0xf8, 0x02, 0x20, 0xaa, 0x75, + 0x40, 0x22, 0x9d, 0xf8, 0x03, 0x10, 0xe9, 0x75, 0x08, 0xf1, 0x10, 0x01, + 0x9d, 0xf8, 0x04, 0x00, 0x28, 0x76, 0x9d, 0xf8, 0x05, 0x00, 0x68, 0x76, + 0x9d, 0xf8, 0x06, 0x00, 0xa8, 0x76, 0x05, 0xf1, 0x48, 0x00, 0xf3, 0xf7, + 0xaf, 0xf8, 0x08, 0xf1, 0x04, 0x00, 0x05, 0xf1, 0x40, 0x01, 0xd0, 0xe9, + 0x00, 0x23, 0xc1, 0xe9, 0x00, 0x23, 0x08, 0xf5, 0x94, 0x71, 0x24, 0x22, + 0x05, 0xf1, 0x1c, 0x00, 0xf3, 0xf7, 0xa0, 0xf8, 0x78, 0x79, 0x8a, 0xf8, + 0x00, 0x00, 0x08, 0xf5, 0xee, 0x78, 0xb9, 0x79, 0x8a, 0xf8, 0x01, 0x10, + 0xf8, 0x79, 0x8a, 0xf8, 0x02, 0x00, 0x39, 0x7a, 0x8a, 0xf8, 0x03, 0x10, + 0x02, 0xa9, 0x98, 0xf8, 0x04, 0x00, 0x20, 0x77, 0xb0, 0x6b, 0x90, 0xf8, + 0x7c, 0x01, 0xf2, 0xf7, 0xcd, 0xfd, 0xaa, 0xf8, 0x04, 0x00, 0xf0, 0x6b, + 0x90, 0xf8, 0x58, 0x15, 0x21, 0x70, 0xf0, 0x6b, 0x90, 0xf8, 0x59, 0x15, + 0x61, 0x70, 0xf0, 0x6b, 0xd0, 0xf8, 0x5c, 0x15, 0x61, 0x60, 0x00, 0xf2, + 0x41, 0x50, 0x02, 0x78, 0x40, 0x78, 0x79, 0x7a, 0x02, 0xeb, 0x40, 0x02, + 0x02, 0xeb, 0x81, 0x02, 0xea, 0x76, 0xf0, 0x6b, 0x90, 0xf8, 0x3a, 0x15, + 0x21, 0x76, 0xf0, 0x6b, 0x90, 0xf8, 0x40, 0x15, 0x61, 0x76, 0xf0, 0x6b, + 0x90, 0xf8, 0x2e, 0x15, 0xa1, 0x76, 0xf0, 0x6b, 0x90, 0xf8, 0x2f, 0x15, + 0xe1, 0x76, 0x48, 0x46, 0xf2, 0xf7, 0x1a, 0xfd, 0xa0, 0x60, 0x48, 0x46, + 0xf2, 0xf7, 0x1c, 0xfd, 0xe0, 0x60, 0xd8, 0xf8, 0x00, 0x00, 0x20, 0x61, + 0x02, 0x98, 0x0c, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf1, 0x4f, + 0x2d, 0xed, 0x02, 0x8b, 0x0e, 0x46, 0x00, 0xf0, 0x4f, 0xf9, 0x80, 0x46, + 0x00, 0x27, 0xd8, 0xf8, 0x44, 0x10, 0xd8, 0xf8, 0x38, 0x00, 0xd0, 0xf8, + 0x00, 0x41, 0x80, 0x48, 0x90, 0xf8, 0x00, 0xb0, 0x5a, 0x46, 0xcc, 0x20, + 0x42, 0x43, 0x01, 0xeb, 0x02, 0x09, 0x08, 0x21, 0x09, 0xf1, 0x8e, 0x00, + 0x05, 0xf0, 0x32, 0xff, 0x08, 0x21, 0x09, 0xf1, 0x96, 0x00, 0x05, 0xf0, + 0x2d, 0xff, 0x24, 0x0d, 0x05, 0x2e, 0x04, 0xf0, 0x01, 0x04, 0x9f, 0xed, + 0x74, 0x8a, 0x00, 0xf2, 0x8d, 0x80, 0xdf, 0xe8, 0x06, 0xf0, 0x68, 0x03, + 0x74, 0x79, 0x6f, 0x86, 0xd8, 0xf8, 0x3c, 0x00, 0x00, 0xf2, 0x1c, 0x6a, + 0xd0, 0xf8, 0x5c, 0x04, 0x08, 0xee, 0x10, 0x0a, 0xda, 0xf8, 0x08, 0x00, + 0xda, 0xf8, 0x04, 0x10, 0x81, 0x42, 0x07, 0xd3, 0x03, 0x2e, 0x02, 0xbf, + 0xd8, 0xf8, 0x3c, 0x20, 0x92, 0xf9, 0x28, 0x35, 0x01, 0x2b, 0x49, 0xd1, + 0x14, 0xb1, 0xbb, 0xf1, 0x1e, 0x0f, 0x45, 0xd2, 0xa0, 0xeb, 0x01, 0x0b, + 0x9d, 0xf8, 0x08, 0x00, 0x49, 0x46, 0xff, 0xf7, 0x1c, 0xff, 0x07, 0x46, + 0xd8, 0xf8, 0x3c, 0x00, 0xc1, 0x68, 0xd0, 0xf8, 0x64, 0x02, 0xc9, 0xf8, + 0x04, 0x50, 0xc9, 0xf8, 0x10, 0xb0, 0x09, 0xf1, 0xb4, 0x05, 0x89, 0xf8, + 0x01, 0x60, 0xc9, 0xf8, 0x08, 0x10, 0xc9, 0xf8, 0x0c, 0x00, 0x85, 0xed, + 0x03, 0x8a, 0x0a, 0xf1, 0x18, 0x02, 0x0a, 0xf1, 0x10, 0x01, 0x48, 0x46, + 0x00, 0xf0, 0x2d, 0xf9, 0x03, 0x2e, 0x01, 0xbf, 0xd8, 0xf8, 0x3c, 0x00, + 0x00, 0xf2, 0xdd, 0x41, 0x91, 0xf9, 0x4b, 0x20, 0x01, 0x2a, 0x0f, 0xd1, + 0x09, 0x78, 0xc9, 0xf8, 0x08, 0x10, 0x00, 0xf2, 0xfc, 0x40, 0x90, 0xe8, + 0x4c, 0x00, 0x09, 0xf1, 0xa0, 0x01, 0x81, 0xe8, 0x4c, 0x00, 0xd8, 0xf8, + 0x3c, 0x00, 0xd0, 0xf8, 0x18, 0x15, 0x29, 0x60, 0x45, 0x49, 0x08, 0x78, + 0x40, 0x1c, 0x08, 0x70, 0xc0, 0xb2, 0x1e, 0x28, 0x02, 0xd3, 0x0c, 0xb9, + 0x00, 0x20, 0x08, 0x70, 0x38, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, + 0xf2, 0x8f, 0xd8, 0xf8, 0x3c, 0x00, 0x90, 0xed, 0xbd, 0x8a, 0x00, 0xf2, + 0xbc, 0x5a, 0x9b, 0xe7, 0xd8, 0xf8, 0x3c, 0x00, 0x00, 0xf2, 0xdc, 0x5a, + 0x96, 0xe7, 0xd8, 0xf8, 0x3c, 0x00, 0x00, 0xf2, 0xfc, 0x5a, 0x91, 0xe7, + 0xd8, 0xf8, 0x3c, 0x00, 0x90, 0xed, 0xbd, 0x0a, 0x00, 0xf2, 0x7c, 0x5a, + 0xd0, 0xf8, 0x5c, 0x04, 0x00, 0xee, 0x90, 0x0a, 0x30, 0xee, 0x20, 0x8a, + 0x84, 0xe7, 0xd8, 0xf8, 0x3c, 0x10, 0x01, 0xf2, 0x9c, 0x5a, 0x7f, 0xe7, + 0x4f, 0xf4, 0x00, 0x47, 0xd4, 0xe7, 0x2d, 0xe9, 0xff, 0x47, 0x80, 0x46, + 0x8a, 0x46, 0x04, 0xf0, 0xb2, 0xfe, 0x06, 0x46, 0x28, 0x4c, 0xf0, 0x6b, + 0x22, 0x78, 0x71, 0x6c, 0x00, 0xf2, 0x1c, 0x69, 0xcc, 0x20, 0x42, 0x43, + 0x88, 0x18, 0x41, 0xf2, 0xe8, 0x73, 0xc7, 0x18, 0x6e, 0x22, 0x6f, 0xf0, + 0x27, 0x00, 0x01, 0x92, 0x00, 0x90, 0x00, 0x25, 0x02, 0x95, 0x06, 0x23, + 0x00, 0x22, 0x01, 0x21, 0x50, 0x46, 0xf2, 0xf7, 0xef, 0xfc, 0x01, 0x00, + 0x2e, 0xd4, 0xd9, 0xf8, 0x0c, 0x20, 0x22, 0xfa, 0x01, 0xf0, 0xc3, 0x07, + 0x28, 0xd4, 0xf0, 0x6b, 0x00, 0x7d, 0x08, 0xb1, 0xc0, 0x06, 0x23, 0xd5, + 0x01, 0x23, 0x03, 0xfa, 0x01, 0xf1, 0x11, 0x43, 0xc9, 0xf8, 0x0c, 0x10, + 0x09, 0xf1, 0x18, 0x02, 0x09, 0xf1, 0x10, 0x01, 0x38, 0x46, 0x00, 0xf0, + 0xa4, 0xf8, 0x39, 0x46, 0x40, 0x46, 0xff, 0xf7, 0x74, 0xfe, 0x05, 0x46, + 0x00, 0x20, 0x38, 0x61, 0x78, 0x70, 0x78, 0x60, 0xf0, 0x6b, 0xc1, 0x68, + 0xb9, 0x60, 0xd0, 0xf8, 0x64, 0x02, 0xf8, 0x60, 0x20, 0x78, 0x40, 0x1c, + 0x20, 0x70, 0xc0, 0xb2, 0x1e, 0x28, 0x24, 0xbf, 0x00, 0x20, 0x20, 0x70, + 0x28, 0x46, 0x04, 0xb0, 0xbd, 0xe8, 0xf0, 0x87, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x76, 0x02, 0x21, 0x4d, 0x76, 0x02, 0x21, 0x2d, 0xe9, 0xf0, 0x41, + 0x80, 0x46, 0x00, 0xf0, 0x3c, 0xf8, 0x00, 0x26, 0x01, 0x2f, 0x08, 0xbf, + 0xc0, 0x6b, 0x11, 0xd0, 0x39, 0x00, 0x03, 0xd1, 0xc0, 0x6b, 0x00, 0xf2, + 0xbc, 0x54, 0x0d, 0xe0, 0x02, 0x2f, 0x03, 0xd1, 0xc0, 0x6b, 0x00, 0xf2, + 0xfc, 0x54, 0x07, 0xe0, 0xc0, 0x6b, 0x04, 0x2f, 0x08, 0xbf, 0x00, 0xf2, + 0xdc, 0x54, 0x01, 0xd0, 0x00, 0xf2, 0x1c, 0x64, 0x04, 0xf1, 0x18, 0x01, + 0x40, 0x46, 0xff, 0xf7, 0xeb, 0xfd, 0x2d, 0xb1, 0x26, 0x60, 0x40, 0x46, + 0xff, 0xf7, 0xc4, 0xfc, 0x60, 0x60, 0x13, 0xe0, 0x40, 0x46, 0xff, 0xf7, + 0xbf, 0xfc, 0xa0, 0x60, 0x39, 0x46, 0x22, 0x68, 0x40, 0x46, 0xff, 0xf7, + 0xb9, 0xfe, 0x06, 0x46, 0xa0, 0x68, 0x60, 0x60, 0x04, 0xf1, 0x10, 0x01, + 0x40, 0x46, 0xff, 0xf7, 0xd3, 0xfd, 0x20, 0x68, 0x40, 0x1c, 0x20, 0x60, + 0x30, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x0f, 0x46, 0x15, 0x46, 0x04, 0xf0, + 0x18, 0xbe, 0xf8, 0xb5, 0x04, 0x46, 0xff, 0xf7, 0xf8, 0xff, 0x00, 0x26, + 0x03, 0x2f, 0x14, 0xd1, 0xc0, 0x6b, 0x00, 0xf2, 0x7c, 0x57, 0x00, 0x2d, + 0x20, 0x46, 0x0a, 0xd0, 0xff, 0xf7, 0x98, 0xfc, 0x00, 0xf0, 0x28, 0xf8, + 0x00, 0x22, 0x03, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x91, 0xfe, 0x06, 0x46, + 0x0e, 0xe0, 0xff, 0xf7, 0x8d, 0xfc, 0x78, 0x60, 0x1a, 0xe0, 0x05, 0x2f, + 0x18, 0xd1, 0xc0, 0x6b, 0x00, 0xf2, 0x9c, 0x57, 0x00, 0x2d, 0x20, 0x46, + 0x08, 0xd0, 0xff, 0xf7, 0x81, 0xfc, 0x78, 0x60, 0x07, 0xf1, 0x10, 0x01, + 0x20, 0x46, 0xff, 0xf7, 0x9d, 0xfd, 0x09, 0xe0, 0xff, 0xf7, 0x78, 0xfc, + 0x00, 0xf0, 0x08, 0xf8, 0x00, 0x22, 0x05, 0x21, 0x20, 0x46, 0xff, 0xf7, + 0x71, 0xfe, 0x06, 0x46, 0x30, 0x46, 0xf2, 0xbd, 0xb8, 0x60, 0x07, 0xf1, + 0x18, 0x01, 0x20, 0x46, 0x8a, 0xe5, 0x70, 0xb5, 0x00, 0x23, 0xc4, 0x18, + 0xcd, 0x5c, 0x04, 0xf8, 0x8e, 0x5f, 0xd6, 0x5c, 0x26, 0x72, 0x5b, 0x1c, + 0x08, 0x2b, 0xf6, 0xd3, 0x70, 0xbd, 0x00, 0x00, 0x10, 0xee, 0x10, 0x0a, + 0xf4, 0x46, 0x00, 0xf0, 0x03, 0xf8, 0x00, 0xee, 0x10, 0x0a, 0x60, 0x47, + 0xc0, 0xf3, 0xc7, 0x52, 0x7e, 0x3a, 0x09, 0xdd, 0x18, 0x2a, 0x0c, 0xda, + 0x6f, 0xf0, 0x7f, 0x41, 0xd1, 0x40, 0x20, 0xea, 0x51, 0x00, 0x40, 0x18, + 0x88, 0x43, 0x70, 0x47, 0x00, 0xf0, 0x00, 0x40, 0x08, 0xbf, 0x40, 0xf0, + 0x7e, 0x50, 0x70, 0x47, 0x00, 0x78, 0x02, 0x40, 0xca, 0x40, 0xd0, 0xb2, + 0x70, 0x47, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, + 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x70, + 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0xd0, 0xb5, 0xdf, 0xf8, 0x4c, 0x6a, + 0x37, 0x68, 0x04, 0x46, 0x10, 0x46, 0x19, 0x46, 0x4f, 0xf4, 0x7a, 0x72, + 0x00, 0x23, 0x07, 0xeb, 0x04, 0x17, 0x05, 0xf0, 0x93, 0xfd, 0x47, 0xf8, + 0xe4, 0x0f, 0xdf, 0xf8, 0x38, 0x0a, 0x50, 0xf8, 0x24, 0x10, 0x0a, 0x6a, + 0x7a, 0x60, 0x4b, 0x6a, 0xbb, 0x60, 0x91, 0xf8, 0x38, 0x10, 0x39, 0x73, + 0x50, 0xf8, 0x24, 0x00, 0x32, 0x68, 0x90, 0xf8, 0x39, 0x10, 0x02, 0xeb, + 0x04, 0x12, 0x82, 0xf8, 0xf1, 0x10, 0xd0, 0xbd, 0xdf, 0xf8, 0x04, 0x1a, + 0x0b, 0x68, 0x02, 0x78, 0x83, 0xf8, 0x50, 0x24, 0x0b, 0x68, 0x42, 0x78, + 0x83, 0xf8, 0x51, 0x24, 0x0b, 0x68, 0x82, 0x78, 0x83, 0xf8, 0x52, 0x24, + 0x09, 0x68, 0xc0, 0x78, 0x81, 0xf8, 0x53, 0x04, 0x70, 0x47, 0x10, 0xb5, + 0xdf, 0xf8, 0xdc, 0x19, 0x0a, 0x68, 0x92, 0xf8, 0x50, 0x34, 0x03, 0x70, + 0x0c, 0x68, 0x94, 0xf8, 0x51, 0x24, 0x42, 0x70, 0x0b, 0x68, 0x93, 0xf8, + 0x52, 0x24, 0x82, 0x70, 0x09, 0x68, 0x91, 0xf8, 0x53, 0x24, 0xc2, 0x70, + 0x10, 0xbd, 0x38, 0xb5, 0x05, 0x46, 0x00, 0x24, 0x29, 0x00, 0x30, 0xd0, + 0x00, 0x20, 0x06, 0xf0, 0xe3, 0xf9, 0x01, 0x20, 0x06, 0xf0, 0xe0, 0xf9, + 0x07, 0xf0, 0xad, 0xfa, 0x28, 0x46, 0x07, 0xf0, 0xad, 0xfd, 0x04, 0x00, + 0x23, 0xd1, 0x00, 0x20, 0x05, 0xf0, 0x0e, 0xfe, 0x04, 0x00, 0x1e, 0xd1, + 0xdf, 0xf8, 0x8c, 0x59, 0x28, 0x68, 0xd0, 0xf8, 0x5e, 0x20, 0xd0, 0xf8, + 0x62, 0x30, 0x00, 0x20, 0xff, 0xf7, 0x93, 0xff, 0x00, 0x21, 0x00, 0x20, + 0x05, 0xf0, 0x18, 0xff, 0x01, 0x20, 0x05, 0xf0, 0xfb, 0xfd, 0x04, 0x00, + 0x0b, 0xd1, 0x28, 0x68, 0xd0, 0xf8, 0x89, 0x20, 0xd0, 0xf8, 0x8d, 0x30, + 0x01, 0x20, 0xff, 0xf7, 0x82, 0xff, 0x00, 0x21, 0x01, 0x20, 0x05, 0xf0, + 0x07, 0xff, 0x20, 0x46, 0x32, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, 0x00, 0x28, + 0x4f, 0xf0, 0x00, 0x08, 0x64, 0xd0, 0x00, 0x20, 0x07, 0xf0, 0xd0, 0xfa, + 0x01, 0x20, 0x07, 0xf0, 0xcd, 0xfa, 0xdf, 0xf8, 0x38, 0x79, 0xdf, 0xf8, + 0x38, 0x59, 0x39, 0x68, 0xdf, 0xf8, 0x28, 0x69, 0x91, 0xf8, 0x85, 0x00, + 0x08, 0xb3, 0x31, 0x68, 0xd1, 0xf8, 0x5e, 0x20, 0xd1, 0xf8, 0x62, 0x30, + 0x00, 0x20, 0x07, 0xf0, 0xef, 0xf8, 0x5f, 0xea, 0x00, 0x08, 0x1c, 0xd1, + 0x00, 0xf0, 0x9b, 0xf8, 0x00, 0x22, 0x00, 0xf0, 0xc3, 0xf8, 0x5f, 0xea, + 0x00, 0x08, 0x02, 0xbf, 0x2c, 0x68, 0xe0, 0x78, 0x01, 0x28, 0x10, 0xd1, + 0x39, 0x68, 0x33, 0x68, 0x93, 0xf8, 0x79, 0x20, 0xd1, 0xe9, 0x00, 0x01, + 0x00, 0xf0, 0x4c, 0xf9, 0xc4, 0xe9, 0x02, 0x01, 0x05, 0xe0, 0x07, 0xf0, + 0xed, 0xfd, 0x01, 0x21, 0x00, 0x20, 0x05, 0xf0, 0xc7, 0xfe, 0x79, 0x68, + 0x91, 0xf8, 0x85, 0x00, 0x08, 0xb3, 0x31, 0x68, 0xd1, 0xf8, 0x89, 0x20, + 0xd1, 0xf8, 0x8d, 0x30, 0x01, 0x20, 0x07, 0xf0, 0xc3, 0xf8, 0x5f, 0xea, + 0x00, 0x08, 0x1d, 0xd1, 0x00, 0xf0, 0x69, 0xf8, 0x01, 0x22, 0x00, 0xf0, + 0x97, 0xf8, 0x5f, 0xea, 0x00, 0x08, 0x02, 0xbf, 0x2d, 0x68, 0x28, 0x79, + 0x01, 0x28, 0x11, 0xd1, 0x78, 0x68, 0x33, 0x68, 0x93, 0xf8, 0xa4, 0x20, + 0xd0, 0xe9, 0x00, 0x01, 0x00, 0xf0, 0x20, 0xf9, 0xc5, 0xe9, 0x04, 0x01, + 0x06, 0xe0, 0x01, 0x20, 0x07, 0xf0, 0xc0, 0xfd, 0x01, 0x21, 0x01, 0x20, + 0x05, 0xf0, 0x9a, 0xfe, 0x40, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x2d, 0xe9, + 0xf0, 0x41, 0xdf, 0xf8, 0x6c, 0x68, 0x05, 0x46, 0x30, 0x68, 0x90, 0xf8, + 0xa5, 0x70, 0x90, 0xf8, 0x7a, 0x80, 0x00, 0x24, 0x29, 0x00, 0x07, 0xf0, + 0x01, 0x07, 0x23, 0xd0, 0x02, 0x20, 0x07, 0xf0, 0xde, 0xfd, 0x04, 0x00, + 0x1e, 0xd1, 0x00, 0xf0, 0x3a, 0xf8, 0x00, 0x29, 0x08, 0xbf, 0x00, 0x28, + 0x07, 0xd0, 0x5f, 0xea, 0xc8, 0x70, 0x04, 0xd5, 0x00, 0x20, 0x07, 0xf0, + 0xd0, 0xfd, 0x04, 0x00, 0x0b, 0xd1, 0x00, 0xf0, 0x26, 0xf8, 0x00, 0x29, + 0x08, 0xbf, 0x00, 0x28, 0x06, 0xd0, 0x01, 0x2f, 0x04, 0xd1, 0x01, 0x20, + 0x07, 0xf0, 0xc3, 0xfd, 0x04, 0x46, 0x1c, 0xb9, 0x03, 0x20, 0x07, 0xf0, + 0xbe, 0xfd, 0x04, 0x46, 0x30, 0x68, 0x90, 0xf8, 0xa5, 0x60, 0x06, 0xf0, + 0x02, 0x06, 0x6d, 0xb1, 0x90, 0xf8, 0x7a, 0x00, 0x81, 0x07, 0x03, 0xd5, + 0x01, 0x21, 0x00, 0x20, 0x07, 0xf0, 0x88, 0xf9, 0x02, 0x2e, 0x03, 0xd1, + 0x01, 0x21, 0x01, 0x20, 0x07, 0xf0, 0x82, 0xf9, 0x20, 0x46, 0xbd, 0xe8, + 0xf0, 0x81, 0x32, 0x68, 0xd2, 0xf8, 0x89, 0x00, 0xd2, 0xf8, 0x8d, 0x10, + 0x70, 0x47, 0x32, 0x68, 0xd2, 0xf8, 0x5e, 0x00, 0xd2, 0xf8, 0x62, 0x10, + 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46, 0x07, 0xf0, 0x52, 0xff, 0xf0, 0xb9, + 0x20, 0x46, 0x08, 0xf0, 0x87, 0xfc, 0x20, 0x46, 0x08, 0xf0, 0xd4, 0xfc, + 0xb8, 0xb9, 0x20, 0x00, 0x06, 0xd0, 0x02, 0x20, 0x05, 0xf0, 0xfd, 0xfc, + 0x88, 0xb9, 0x06, 0xf0, 0x91, 0xf8, 0x70, 0xb9, 0x20, 0x46, 0x07, 0xf0, + 0x4d, 0xff, 0x50, 0xb9, 0x01, 0xf0, 0x3a, 0xfa, 0x20, 0x46, 0x07, 0xf0, + 0x26, 0xff, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x21, 0x09, 0xf0, + 0x2f, 0xb8, 0x10, 0xbd, 0x2d, 0xe9, 0xf0, 0x47, 0x17, 0x00, 0x16, 0x46, + 0x18, 0xbf, 0x01, 0x27, 0x02, 0x2e, 0x86, 0xb0, 0x29, 0xda, 0x81, 0x46, + 0x8a, 0x46, 0x00, 0xf0, 0xbb, 0xfb, 0x04, 0xac, 0x80, 0x46, 0x01, 0x94, + 0x02, 0xad, 0x00, 0x95, 0x4a, 0x46, 0x53, 0x46, 0x38, 0x46, 0x07, 0xf0, + 0x07, 0xfa, 0x4a, 0x46, 0x53, 0x46, 0x30, 0x46, 0xff, 0xf7, 0x77, 0xfe, + 0x41, 0x46, 0x38, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0x41, 0x46, 0x38, 0x46, + 0xc0, 0x46, 0xc0, 0x46, 0x00, 0xf0, 0x68, 0xf8, 0x5f, 0xea, 0x00, 0x09, + 0x03, 0xd1, 0x38, 0x46, 0x09, 0xf0, 0x62, 0xfb, 0x07, 0xe0, 0x00, 0x22, + 0x00, 0x23, 0x30, 0x46, 0xff, 0xf7, 0x61, 0xfe, 0x01, 0xe0, 0x4f, 0xf6, + 0x53, 0x79, 0x48, 0x46, 0x53, 0xe0, 0x2d, 0xe9, 0xf0, 0x47, 0x88, 0x46, + 0x5f, 0xea, 0x08, 0x07, 0x18, 0xbf, 0x01, 0x27, 0x45, 0x46, 0x02, 0x2d, + 0x86, 0xb0, 0x04, 0x46, 0x44, 0xda, 0x21, 0x46, 0x38, 0x46, 0x06, 0xf0, + 0x7a, 0xff, 0x06, 0x00, 0x33, 0xd1, 0xdf, 0xf8, 0xec, 0x06, 0x50, 0xf8, + 0x25, 0x20, 0x92, 0xf8, 0x39, 0x50, 0xa5, 0xfb, 0x04, 0x69, 0x4f, 0xf4, + 0x7a, 0x7a, 0xaa, 0xfb, 0x06, 0x45, 0x1a, 0xfb, 0x09, 0x55, 0x20, 0x46, + 0x29, 0x46, 0x52, 0x46, 0x00, 0xf0, 0x3c, 0xf8, 0x06, 0x46, 0x04, 0xa8, + 0x01, 0x90, 0x22, 0x46, 0x02, 0xa8, 0x00, 0x90, 0x2b, 0x46, 0x38, 0x46, + 0x07, 0xf0, 0xb8, 0xf9, 0x22, 0x46, 0x2b, 0x46, 0x40, 0x46, 0xff, 0xf7, + 0x28, 0xfe, 0x31, 0x46, 0x38, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0x31, 0x46, + 0x38, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0x00, 0xf0, 0x19, 0xf8, 0x06, 0x00, + 0x05, 0xd1, 0x22, 0x46, 0x2b, 0x46, 0x38, 0x46, 0x06, 0xf0, 0xa8, 0xff, + 0x06, 0x46, 0x1e, 0xb9, 0x38, 0x46, 0x09, 0xf0, 0x0d, 0xfb, 0x07, 0xe0, + 0x00, 0x22, 0x00, 0x23, 0x40, 0x46, 0xff, 0xf7, 0x0c, 0xfe, 0x01, 0xe0, + 0x4f, 0xf6, 0x53, 0x76, 0x30, 0x46, 0x06, 0xb0, 0xbd, 0xe8, 0xf0, 0x87, + 0x01, 0x20, 0x9d, 0xf8, 0x08, 0x10, 0x01, 0x90, 0xdd, 0xe9, 0x04, 0x23, + 0x00, 0x91, 0x38, 0x46, 0x06, 0xf0, 0x98, 0xbd, 0x00, 0x23, 0x05, 0xf0, + 0x99, 0xbb, 0x30, 0xb5, 0x03, 0x46, 0x00, 0x20, 0xdf, 0xf8, 0x5c, 0x46, + 0x1d, 0x00, 0x08, 0xbf, 0x23, 0x68, 0x02, 0xd0, 0x01, 0x2b, 0x0a, 0xd1, + 0x63, 0x68, 0x58, 0x33, 0x1c, 0x6d, 0x0c, 0x60, 0x93, 0xed, 0x00, 0x0a, + 0xbc, 0xee, 0xc0, 0x0a, 0x82, 0xed, 0x00, 0x0a, 0x30, 0xbd, 0x4f, 0xf6, + 0x53, 0x70, 0x30, 0xbd, 0xf8, 0xb5, 0x05, 0x46, 0x0e, 0x46, 0x17, 0x46, + 0x09, 0xf0, 0x5e, 0xfd, 0x04, 0x00, 0x04, 0xd1, 0x3a, 0x46, 0x31, 0x46, + 0x28, 0x46, 0x06, 0xf0, 0xd1, 0xfe, 0x20, 0x46, 0xf2, 0xbd, 0x30, 0xb5, + 0xdf, 0xf8, 0xec, 0x35, 0x1c, 0x68, 0x00, 0x22, 0x0d, 0x00, 0x04, 0xf1, + 0xe4, 0x03, 0x02, 0xd1, 0x19, 0x68, 0x5b, 0x7b, 0x03, 0xe0, 0x01, 0x29, + 0x05, 0xd1, 0x19, 0x69, 0x5b, 0x7f, 0xb1, 0xfb, 0xf3, 0xf3, 0x03, 0x60, + 0x01, 0xe0, 0x4f, 0xf6, 0x53, 0x72, 0x10, 0x46, 0x30, 0xbd, 0x70, 0xb5, + 0x04, 0x46, 0x0d, 0x46, 0x00, 0xf0, 0xa6, 0xfe, 0x06, 0x46, 0xe0, 0xb2, + 0x0a, 0xf0, 0xd9, 0xf8, 0x00, 0xee, 0x10, 0x0a, 0xf8, 0xee, 0x40, 0x0a, + 0xb0, 0xee, 0x00, 0x0a, 0x0a, 0xf0, 0xf0, 0xf8, 0xbc, 0xee, 0xc0, 0x0a, + 0x10, 0xee, 0x10, 0x0a, 0xb6, 0xfb, 0xf0, 0xf0, 0x28, 0x60, 0x00, 0x20, + 0x70, 0xbd, 0x10, 0xb5, 0x0c, 0x46, 0x00, 0xf0, 0x01, 0xf8, 0x06, 0xe0, + 0xc0, 0xb2, 0x07, 0xf0, 0xf9, 0xb9, 0x10, 0xb5, 0x0c, 0x46, 0x00, 0xf0, + 0x0a, 0xf8, 0xdf, 0xf8, 0x74, 0x15, 0x0a, 0x68, 0x02, 0xeb, 0x00, 0x10, + 0xd0, 0xf8, 0xe4, 0x10, 0x21, 0x60, 0x00, 0x20, 0x10, 0xbd, 0xc0, 0xb2, + 0x07, 0xf0, 0xff, 0xb9, 0x80, 0xb5, 0x00, 0x21, 0x20, 0xb1, 0x01, 0xf0, + 0x1d, 0xf9, 0x08, 0xf0, 0x52, 0xfe, 0x01, 0x46, 0x08, 0x46, 0x02, 0xbd, + 0x7c, 0xb5, 0x04, 0x46, 0x08, 0x2c, 0x0d, 0x46, 0x09, 0xd2, 0x69, 0x46, + 0xff, 0xf7, 0xd5, 0xff, 0x06, 0x46, 0x00, 0x99, 0xe0, 0xb2, 0x0a, 0xf0, + 0xcf, 0xfc, 0x28, 0x60, 0x01, 0xe0, 0x4f, 0xf6, 0x52, 0x76, 0x30, 0x46, + 0x76, 0xbd, 0x7c, 0xb5, 0x0d, 0x46, 0x04, 0x46, 0x69, 0x46, 0xff, 0xf7, + 0xcc, 0xff, 0x06, 0x46, 0x00, 0x99, 0xe0, 0xb2, 0x09, 0xf0, 0x1b, 0xfc, + 0x28, 0x60, 0x30, 0x46, 0x76, 0xbd, 0x80, 0xb5, 0xff, 0xf7, 0xbe, 0xff, + 0x02, 0xe0, 0x80, 0xb5, 0xff, 0xf7, 0xcb, 0xff, 0xbd, 0xe8, 0x02, 0x40, + 0x07, 0xf0, 0xbe, 0xbb, 0x10, 0xb5, 0x04, 0x46, 0x01, 0xf0, 0xe8, 0xf8, + 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x08, 0xf0, 0x75, 0xbe, 0x80, 0xb5, + 0x01, 0xf0, 0xe0, 0xf8, 0xbd, 0xe8, 0x01, 0x40, 0x08, 0xf0, 0x71, 0xbe, + 0x10, 0xb5, 0x04, 0x46, 0x0a, 0xf0, 0xdd, 0xfd, 0x03, 0xe0, 0x10, 0xb5, + 0x04, 0x46, 0x0a, 0xf0, 0xda, 0xfd, 0x00, 0xee, 0x10, 0x0a, 0xbb, 0xee, + 0x62, 0x0a, 0x84, 0xed, 0x00, 0x0a, 0x00, 0x20, 0x10, 0xbd, 0x10, 0xb5, + 0xdf, 0xf8, 0xd0, 0x44, 0x20, 0x78, 0x20, 0xb1, 0x00, 0xf0, 0x05, 0xf8, + 0x60, 0x70, 0x00, 0x20, 0x20, 0x70, 0x60, 0x78, 0x10, 0xbd, 0x10, 0xb5, + 0x00, 0xf0, 0x1d, 0xf8, 0x00, 0x24, 0x20, 0xb9, 0xff, 0x22, 0x00, 0x21, + 0xdf, 0xf8, 0xb0, 0x04, 0x03, 0xe0, 0xff, 0x22, 0x00, 0x21, 0xdf, 0xf8, + 0xac, 0x04, 0xff, 0xf7, 0xff, 0xfc, 0x01, 0x28, 0x08, 0xbf, 0x01, 0x24, + 0x20, 0x46, 0x10, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x08, 0xf8, 0xdf, 0xf8, + 0x98, 0x14, 0x08, 0x60, 0x01, 0xbd, 0xdf, 0xf8, 0x90, 0x04, 0x00, 0x68, + 0x70, 0x47, 0x04, 0x21, 0x00, 0x20, 0x0a, 0x68, 0x12, 0x0e, 0x01, 0x2a, + 0x18, 0xbf, 0x01, 0x20, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, 0x07, 0x46, + 0xdf, 0xf8, 0x70, 0x04, 0xd0, 0xf8, 0x00, 0xb0, 0x01, 0x25, 0x88, 0x46, + 0x92, 0x46, 0x0a, 0xf0, 0xf7, 0xfe, 0x47, 0xf8, 0x2b, 0x50, 0xcb, 0xf1, + 0x00, 0x0b, 0x81, 0x46, 0x00, 0x26, 0x00, 0x24, 0x07, 0xeb, 0x8b, 0x07, + 0x78, 0x68, 0x01, 0x28, 0x0e, 0xd0, 0x6c, 0xb9, 0x49, 0x46, 0x50, 0x46, + 0x0a, 0xf0, 0x35, 0xff, 0x08, 0xb1, 0x01, 0x24, 0x00, 0x25, 0xb8, 0xf1, + 0x00, 0x0f, 0x01, 0xd0, 0xc0, 0x47, 0x06, 0x46, 0x00, 0x2e, 0xed, 0xd0, + 0x00, 0x20, 0x78, 0x60, 0x28, 0x46, 0xbd, 0xe8, 0xf2, 0x8f, 0xfe, 0xb5, + 0xff, 0xf7, 0x9d, 0xff, 0x04, 0x46, 0xdf, 0xf8, 0x18, 0x04, 0xdf, 0xf8, + 0xe0, 0x63, 0x05, 0x68, 0xdf, 0xf8, 0x10, 0x04, 0x70, 0x60, 0x21, 0x00, + 0x04, 0xd0, 0x00, 0x68, 0x4f, 0xf4, 0x00, 0x71, 0x05, 0xf0, 0x36, 0xfa, + 0xdf, 0xf8, 0x00, 0x04, 0xdf, 0xf8, 0xcc, 0x23, 0x00, 0x68, 0x30, 0x60, + 0x00, 0xf5, 0x72, 0x71, 0x11, 0x60, 0x00, 0x21, 0xdf, 0xf8, 0xb8, 0x23, + 0xb0, 0x23, 0x4b, 0x43, 0x03, 0x44, 0x03, 0xf5, 0x84, 0x77, 0x42, 0xf8, + 0x21, 0x70, 0x49, 0x1c, 0x04, 0x29, 0xf5, 0xd3, 0x21, 0x00, 0x1c, 0xbf, + 0x4f, 0xf4, 0x8b, 0x61, 0x04, 0xf0, 0xd8, 0xfc, 0x29, 0x46, 0x20, 0x46, + 0x00, 0xf0, 0x8c, 0xfd, 0x03, 0x22, 0x06, 0x21, 0x0a, 0xf0, 0x44, 0xff, + 0x20, 0x46, 0x07, 0xf0, 0xda, 0xfc, 0x20, 0x46, 0x0a, 0xf0, 0x62, 0xff, + 0x20, 0x46, 0x00, 0xf0, 0x9c, 0xff, 0x03, 0x22, 0x11, 0x21, 0x0a, 0xf0, + 0x37, 0xff, 0x0f, 0xf2, 0xe0, 0x32, 0xff, 0x21, 0x03, 0x20, 0x01, 0xf0, + 0x38, 0xf8, 0x0b, 0xf0, 0xd3, 0xf8, 0x0b, 0xf0, 0xa9, 0xf9, 0x20, 0x46, + 0x0b, 0xf0, 0xba, 0xfa, 0x20, 0x46, 0x0b, 0xf0, 0xec, 0xfa, 0x20, 0x46, + 0x0b, 0xf0, 0xe4, 0xfb, 0x03, 0x22, 0x09, 0x21, 0x0a, 0xf0, 0x20, 0xff, + 0x20, 0x46, 0xff, 0xf7, 0x62, 0xfd, 0x03, 0x22, 0x09, 0x21, 0x0a, 0xf0, + 0x19, 0xff, 0x20, 0x46, 0xf2, 0xf7, 0x80, 0xf9, 0x03, 0x22, 0x12, 0x21, + 0x0a, 0xf0, 0x12, 0xff, 0x20, 0x46, 0xff, 0xf7, 0xaa, 0xfd, 0x03, 0x22, + 0x07, 0x21, 0x0a, 0xf0, 0x0b, 0xff, 0x0b, 0xf0, 0x9e, 0xfc, 0x03, 0x22, + 0x1a, 0x21, 0x0a, 0xf0, 0x05, 0xff, 0x0b, 0xf0, 0xfd, 0xfe, 0x03, 0x22, + 0x13, 0x21, 0x0a, 0xf0, 0xff, 0xfe, 0x0b, 0xf0, 0x1c, 0xff, 0x03, 0x22, + 0x13, 0x21, 0x0a, 0xf0, 0xf9, 0xfe, 0x0b, 0xf0, 0xc7, 0xff, 0x03, 0x22, + 0x15, 0x21, 0x0a, 0xf0, 0xf3, 0xfe, 0x01, 0x21, 0x7c, 0x20, 0x0c, 0xf0, + 0x95, 0xfb, 0x0b, 0xf0, 0x53, 0xff, 0x03, 0x22, 0x14, 0x21, 0x0a, 0xf0, + 0xe9, 0xfe, 0x06, 0xf1, 0x08, 0x01, 0x00, 0x20, 0x0a, 0xf0, 0x1e, 0xfc, + 0x03, 0x00, 0x05, 0xd0, 0x0f, 0xf2, 0x4c, 0x32, 0x00, 0x21, 0x02, 0x20, + 0x00, 0xf0, 0xe3, 0xff, 0x0c, 0xf0, 0xda, 0xfe, 0x03, 0x22, 0x16, 0x21, + 0x0a, 0xf0, 0xd6, 0xfe, 0x0d, 0xf0, 0x33, 0xf9, 0x20, 0x46, 0x0d, 0xf0, + 0x4b, 0xfa, 0x4b, 0xf2, 0x04, 0x13, 0x98, 0x42, 0x03, 0xd1, 0x03, 0x22, + 0x05, 0x21, 0x18, 0x46, 0x01, 0xe0, 0x03, 0x22, 0x0e, 0x21, 0x0a, 0xf0, + 0xc5, 0xfe, 0xc0, 0x46, 0xc0, 0x46, 0x0d, 0xf0, 0x35, 0xfd, 0x0d, 0xf0, + 0x77, 0xff, 0x20, 0x46, 0xff, 0xf7, 0x5b, 0xfc, 0x03, 0x22, 0x17, 0x21, + 0x0a, 0xf0, 0xb8, 0xfe, 0x20, 0x46, 0x02, 0xf0, 0xbd, 0xfb, 0x03, 0x22, + 0x08, 0x21, 0x0a, 0xf0, 0xb1, 0xfe, 0x20, 0x00, 0x31, 0xd0, 0x6e, 0x1e, + 0xb6, 0x41, 0xf6, 0x0f, 0x00, 0x96, 0x2b, 0x46, 0x0f, 0xf2, 0xac, 0x22, + 0xff, 0x21, 0x00, 0xf0, 0x2a, 0xf9, 0xff, 0xf7, 0xc8, 0xfe, 0x08, 0xb1, + 0x0d, 0xf0, 0xee, 0xff, 0x02, 0x21, 0x28, 0x46, 0x0e, 0xf0, 0x57, 0xfb, + 0x00, 0x21, 0x30, 0x46, 0x0e, 0xf0, 0x53, 0xfb, 0x01, 0x23, 0xff, 0x22, + 0x00, 0x21, 0xdf, 0xf8, 0x60, 0x02, 0xff, 0xf7, 0xd6, 0xfb, 0x06, 0xe0, + 0x28, 0xb1, 0x01, 0x46, 0x03, 0x22, 0x4f, 0xf6, 0x58, 0x70, 0x0a, 0xf0, + 0x89, 0xfe, 0x01, 0xa9, 0x30, 0x46, 0x0e, 0xf0, 0x55, 0xfb, 0x03, 0x22, + 0x03, 0x21, 0x0a, 0xf0, 0x81, 0xfe, 0x9d, 0xf8, 0x04, 0x00, 0x01, 0x28, + 0xec, 0xd1, 0x0f, 0xf2, 0xa0, 0x22, 0xff, 0x21, 0x03, 0x20, 0x00, 0xf0, + 0x7e, 0xff, 0x20, 0x46, 0x0c, 0xf0, 0x38, 0xff, 0x20, 0x46, 0xff, 0xf7, + 0x3f, 0xfe, 0x03, 0x22, 0x0f, 0x21, 0x0a, 0xf0, 0x6d, 0xfe, 0x0b, 0xf0, + 0x71, 0xff, 0x03, 0x22, 0x1e, 0x21, 0x0a, 0xf0, 0x67, 0xfe, 0x0e, 0xf0, + 0x8d, 0xfb, 0x04, 0x46, 0x03, 0x22, 0x10, 0x21, 0x0a, 0xf0, 0x60, 0xfe, + 0x20, 0x46, 0xfe, 0xbd, 0x1c, 0xb5, 0x0a, 0xf0, 0xe7, 0xff, 0x1c, 0x24, + 0x18, 0xb9, 0x00, 0x21, 0x0f, 0xf0, 0xf6, 0xf9, 0x04, 0x46, 0xdf, 0xf8, + 0xd4, 0x11, 0x08, 0x68, 0x8d, 0xf8, 0x00, 0x40, 0x00, 0x28, 0x0c, 0xbf, + 0xc0, 0x20, 0xc1, 0x20, 0x8d, 0xf8, 0x03, 0x00, 0x00, 0x21, 0x8d, 0xf8, + 0x01, 0x10, 0x8d, 0xf8, 0x02, 0x10, 0x00, 0x98, 0x16, 0xbd, 0x01, 0x46, + 0x02, 0x29, 0xdf, 0xf8, 0xbc, 0x01, 0x04, 0xd0, 0x0b, 0xd3, 0x04, 0x29, + 0x07, 0xd0, 0x03, 0xd3, 0x70, 0x47, 0xdf, 0xf8, 0xb0, 0x01, 0x70, 0x47, + 0xdf, 0xf8, 0xac, 0x01, 0x70, 0x47, 0xdf, 0xf8, 0xac, 0x01, 0x70, 0x47, + 0x2d, 0xe9, 0xf0, 0x47, 0x88, 0x46, 0x17, 0x46, 0xff, 0xf7, 0xe7, 0xff, + 0x00, 0x24, 0xb9, 0x46, 0x4f, 0xf6, 0x63, 0x7a, 0x05, 0x46, 0xdf, 0xf8, + 0x94, 0x61, 0xb9, 0xf1, 0x04, 0x0f, 0x03, 0xda, 0x72, 0xb6, 0x30, 0x68, + 0x40, 0x1c, 0x30, 0x60, 0x14, 0xb9, 0xff, 0xf7, 0xbb, 0xff, 0x04, 0x46, + 0x29, 0x68, 0xa9, 0xb1, 0xb9, 0xf1, 0x04, 0x0f, 0x04, 0xda, 0x30, 0x68, + 0x40, 0x1e, 0x30, 0x60, 0x00, 0xd1, 0x62, 0xb6, 0xa1, 0x42, 0x18, 0xd0, + 0x5f, 0xea, 0x08, 0x00, 0x0b, 0xd0, 0xb7, 0xf5, 0x7a, 0x7f, 0x0b, 0xdb, + 0x01, 0x20, 0x0f, 0xf0, 0xe5, 0xfa, 0xa7, 0xf5, 0x7a, 0x77, 0x12, 0xe0, + 0x2c, 0x60, 0x4f, 0xf0, 0x00, 0x0a, 0x50, 0x46, 0xbd, 0xe8, 0xf0, 0x87, + 0x00, 0x2f, 0x0a, 0xd4, 0x01, 0x20, 0x0f, 0xf0, 0xd5, 0xfa, 0x7f, 0x1e, + 0x05, 0xe0, 0x03, 0x22, 0x4f, 0xf6, 0x65, 0x71, 0x01, 0x20, 0x0e, 0xf0, + 0x6b, 0xfa, 0x00, 0x2f, 0xc7, 0xd5, 0xec, 0xe7, 0x70, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0xff, 0xf7, 0x87, 0xff, 0x06, 0x46, 0x20, 0x46, 0xff, 0xf7, + 0x9e, 0xff, 0xdf, 0xf8, 0x0c, 0x41, 0x01, 0x68, 0xb1, 0x42, 0x08, 0xd0, + 0x00, 0xf0, 0x0d, 0xf8, 0x03, 0x22, 0x4f, 0xf6, 0x66, 0x71, 0x01, 0x20, + 0x0e, 0xf0, 0x52, 0xfa, 0x01, 0xe0, 0x00, 0x21, 0x01, 0x60, 0x00, 0xf0, + 0x02, 0xf8, 0x00, 0x20, 0x70, 0xbd, 0x04, 0x2d, 0x04, 0xda, 0x20, 0x68, + 0x40, 0x1e, 0x20, 0x60, 0x00, 0xd1, 0x62, 0xb6, 0x70, 0x47, 0x7c, 0xb5, + 0xff, 0xf7, 0xf3, 0xfd, 0x06, 0x46, 0xff, 0xf7, 0x10, 0xfe, 0x04, 0x46, + 0x01, 0x2e, 0xdf, 0xf8, 0xc8, 0x50, 0xdf, 0xf8, 0xac, 0x00, 0x21, 0xd1, + 0x00, 0x23, 0xff, 0x22, 0x00, 0x21, 0xff, 0xf7, 0xf8, 0xfa, 0x28, 0x68, + 0x00, 0x2c, 0x0c, 0xbf, 0xdf, 0xf8, 0xb0, 0x60, 0xdf, 0xf8, 0xb0, 0x60, + 0xb0, 0xf1, 0x55, 0x3f, 0x05, 0xd1, 0x01, 0x23, 0x80, 0x22, 0x07, 0x21, + 0x30, 0x46, 0xff, 0xf7, 0xe8, 0xfa, 0x00, 0x23, 0x08, 0x22, 0x03, 0x21, + 0x30, 0x46, 0xff, 0xf7, 0xe2, 0xfa, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, + 0x30, 0x46, 0xff, 0xf7, 0xdc, 0xfa, 0x04, 0xe0, 0x01, 0x78, 0x00, 0x91, + 0x00, 0x99, 0x00, 0x29, 0xfa, 0xd0, 0x28, 0x68, 0xb0, 0xf1, 0x55, 0x3f, + 0x07, 0xd1, 0x00, 0x21, 0x29, 0x60, 0x20, 0x46, 0x0a, 0x21, 0x0e, 0xf0, + 0x42, 0xfa, 0x30, 0xbf, 0xfd, 0xe7, 0x73, 0xbd, 0x24, 0x65, 0x02, 0x21, + 0x5c, 0x75, 0x02, 0x21, 0xc8, 0x74, 0x02, 0x21, 0x18, 0x76, 0x02, 0x21, + 0xb7, 0x21, 0x03, 0x20, 0x00, 0xf0, 0x7f, 0xbe, 0x4f, 0xf4, 0x7a, 0x72, + 0x00, 0x23, 0x05, 0xf0, 0x67, 0xb8, 0x00, 0x00, 0xc8, 0x74, 0x02, 0x21, + 0x24, 0x90, 0x00, 0x21, 0x10, 0x02, 0x00, 0x47, 0x11, 0x02, 0x00, 0x47, + 0xe8, 0x75, 0x03, 0x21, 0x04, 0x05, 0x00, 0x01, 0x74, 0x04, 0x00, 0x01, + 0x12, 0x02, 0x00, 0x47, 0x00, 0x00, 0x50, 0x46, 0x00, 0x00, 0x51, 0x46, + 0x00, 0x00, 0x52, 0x46, 0x00, 0x00, 0x53, 0x46, 0x14, 0x76, 0x02, 0x21, + 0xe4, 0x75, 0x03, 0x21, 0xc6, 0x00, 0x00, 0x47, 0x22, 0x00, 0x00, 0x47, + 0x43, 0x50, 0x55, 0x25, 0x64, 0x3a, 0x20, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x69, 0x6e, 0x67, 0x20, 0x43, 0x50, 0x55, 0x25, 0x64, 0x0a, 0x00, 0x00, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x48, 0x61, 0x6c, + 0x53, 0x79, 0x73, 0x5f, 0x49, 0x6e, 0x69, 0x74, 0x28, 0x29, 0x0a, 0x00, + 0x52, 0x43, 0x20, 0x54, 0x75, 0x6e, 0x65, 0x72, 0x20, 0x43, 0x61, 0x6c, + 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, + 0x78, 0x0a, 0x00, 0x00, 0x4c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x54, 0x58, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x0a, 0x00, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x78, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x70, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0xfe, 0xb5, 0xdf, 0xf8, + 0x0c, 0x16, 0xdf, 0xf8, 0x0c, 0x56, 0x0a, 0x68, 0x02, 0xf5, 0x7c, 0x71, + 0x00, 0x24, 0x69, 0x60, 0x88, 0xb1, 0x00, 0x20, 0x00, 0x27, 0x00, 0x26, + 0x01, 0xeb, 0x40, 0x02, 0xdf, 0xf8, 0xf4, 0x35, 0x13, 0x80, 0x16, 0x83, + 0x0b, 0x18, 0x40, 0x1c, 0x83, 0xf8, 0x30, 0x70, 0x96, 0x87, 0x0c, 0x28, + 0x83, 0xf8, 0x54, 0x40, 0xf0, 0xd3, 0x00, 0x26, 0x30, 0x46, 0x00, 0xf0, + 0xff, 0xfc, 0xff, 0x28, 0x0f, 0xd0, 0xf0, 0xb2, 0x00, 0xf0, 0xbb, 0xf9, + 0xf0, 0xb2, 0x00, 0xf0, 0x6c, 0xfa, 0xf0, 0xb2, 0x00, 0xf0, 0x9a, 0xfa, + 0xf0, 0xb2, 0x00, 0xf0, 0x95, 0xf8, 0x04, 0x46, 0xf0, 0xb2, 0x00, 0xf0, + 0x81, 0xf9, 0x76, 0x1c, 0x08, 0x2e, 0xe7, 0xd3, 0x05, 0xf1, 0x08, 0x00, + 0x0f, 0xf2, 0x65, 0x11, 0x01, 0x90, 0x00, 0x91, 0x00, 0x23, 0x01, 0x22, + 0x4f, 0xf4, 0x7a, 0x71, 0x0f, 0xf2, 0xa0, 0x50, 0x0f, 0xf0, 0xf2, 0xf9, + 0x28, 0x60, 0x00, 0xf0, 0xe6, 0xf8, 0x20, 0x46, 0xfe, 0xbd, 0x70, 0xb5, + 0xdf, 0xf8, 0x84, 0x15, 0x51, 0xf8, 0x20, 0x40, 0xdf, 0xf8, 0x74, 0x15, + 0x49, 0x68, 0x00, 0x25, 0x00, 0x29, 0x2f, 0xd0, 0x01, 0xeb, 0x40, 0x01, + 0x08, 0x28, 0x0d, 0x83, 0x2b, 0x46, 0x0f, 0xdb, 0x7f, 0x22, 0x00, 0x21, + 0x04, 0xf1, 0xb7, 0x00, 0xff, 0xf7, 0x92, 0xff, 0x04, 0xf1, 0xb4, 0x06, + 0x00, 0xf0, 0x24, 0xf8, 0x03, 0x23, 0x07, 0x22, 0x00, 0x21, 0x04, 0xf1, + 0xc1, 0x00, 0x0e, 0xe0, 0x7f, 0x22, 0x00, 0x21, 0x04, 0xf1, 0x43, 0x00, + 0xff, 0xf7, 0x82, 0xff, 0x04, 0xf1, 0x40, 0x06, 0x00, 0xf0, 0x14, 0xf8, + 0x03, 0x23, 0x07, 0x22, 0x00, 0x21, 0x04, 0xf1, 0x4d, 0x00, 0xff, 0xf7, + 0x77, 0xff, 0x00, 0x23, 0x00, 0xf0, 0x0b, 0xf8, 0x00, 0xf0, 0x4d, 0xf9, + 0x30, 0x46, 0xff, 0xf7, 0x6f, 0xff, 0x01, 0xe0, 0x4f, 0xf6, 0x0a, 0x75, + 0x28, 0x46, 0x70, 0xbd, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x30, 0x46, + 0x64, 0xe7, 0x70, 0xb5, 0x04, 0x46, 0xdf, 0xf8, 0xfc, 0x04, 0x25, 0x46, + 0x50, 0xf8, 0x25, 0x60, 0x11, 0xb9, 0x20, 0x46, 0x00, 0xf0, 0xa3, 0xf8, + 0x20, 0x46, 0x00, 0xf0, 0x36, 0xf9, 0x08, 0x2d, 0x10, 0xdb, 0x00, 0x23, + 0x7f, 0x22, 0x00, 0x21, 0x06, 0xf1, 0xb7, 0x00, 0xff, 0xf7, 0x4e, 0xff, + 0x06, 0xf1, 0xb4, 0x04, 0x00, 0xf0, 0x19, 0xfa, 0x00, 0x23, 0x07, 0x22, + 0x00, 0x21, 0x06, 0xf1, 0xc1, 0x00, 0x0f, 0xe0, 0x00, 0x23, 0x7f, 0x22, + 0x00, 0x21, 0x06, 0xf1, 0x43, 0x00, 0xff, 0xf7, 0x3d, 0xff, 0x06, 0xf1, + 0x40, 0x04, 0x00, 0xf0, 0x08, 0xfa, 0x00, 0x23, 0x07, 0x22, 0x00, 0x21, + 0x06, 0xf1, 0x4d, 0x00, 0xff, 0xf7, 0x32, 0xff, 0x20, 0x46, 0xbd, 0xe8, + 0x70, 0x40, 0xe9, 0xe1, 0xf8, 0xb5, 0xdf, 0xf8, 0x88, 0x54, 0x04, 0x46, + 0x68, 0x68, 0x00, 0xf1, 0x54, 0x01, 0x54, 0x30, 0x0f, 0x5d, 0x01, 0x22, + 0x02, 0x55, 0x20, 0x46, 0xff, 0xf7, 0x77, 0xff, 0x20, 0x46, 0x00, 0xf0, + 0xb9, 0xf8, 0x06, 0x46, 0x31, 0x46, 0x20, 0x46, 0xff, 0xf7, 0xb3, 0xff, + 0x68, 0x68, 0x00, 0xf1, 0x54, 0x01, 0x30, 0x46, 0x0f, 0x55, 0xf2, 0xbd, + 0x10, 0xb5, 0x04, 0x46, 0x00, 0xf0, 0x1d, 0xfa, 0x01, 0x28, 0x20, 0x46, + 0xbd, 0xe8, 0x10, 0x40, 0x0c, 0xbf, 0x00, 0x21, 0x01, 0x21, 0x0e, 0xe2, + 0x38, 0xb5, 0xff, 0xf7, 0x48, 0xfc, 0x04, 0x46, 0x00, 0x25, 0xe8, 0xb2, + 0x00, 0xf0, 0x60, 0xf9, 0x01, 0x28, 0x16, 0xd1, 0x08, 0x2d, 0x18, 0xd3, + 0xbc, 0xb1, 0xe8, 0xb2, 0x00, 0xf0, 0x05, 0xfa, 0x01, 0x28, 0x1c, 0xd0, + 0xe8, 0xb2, 0x00, 0xf0, 0x3a, 0xf8, 0xe8, 0xb2, 0x00, 0xf0, 0x91, 0xf9, + 0xe8, 0xb2, 0x00, 0xf0, 0xbf, 0xf9, 0xe8, 0xb2, 0xff, 0xf7, 0x3f, 0xff, + 0xe8, 0xb2, 0xff, 0xf7, 0xd3, 0xff, 0x6d, 0x1c, 0x0c, 0x2d, 0xe0, 0xd3, + 0x31, 0xbd, 0x28, 0x46, 0x00, 0xf0, 0x0c, 0xfc, 0xff, 0x28, 0xf6, 0xd0, + 0xe8, 0xb2, 0x00, 0xf0, 0xe8, 0xf9, 0x01, 0x28, 0xe2, 0xd1, 0x00, 0x21, + 0xe8, 0xb2, 0xff, 0xf7, 0x6e, 0xff, 0xe8, 0xb2, 0x00, 0xf0, 0x92, 0xf8, + 0xe6, 0xe7, 0x80, 0xb5, 0x00, 0x20, 0x00, 0x90, 0x00, 0x23, 0xdf, 0xf8, + 0xc4, 0x03, 0x00, 0x68, 0x00, 0x22, 0x03, 0x21, 0x0a, 0xe0, 0x80, 0xb5, + 0x0e, 0xf0, 0x69, 0xfd, 0x02, 0x46, 0x00, 0x21, 0xdf, 0xf8, 0xac, 0x03, + 0x00, 0x68, 0x00, 0x91, 0x00, 0x23, 0x01, 0x21, 0x0f, 0xf0, 0x14, 0xf9, + 0x01, 0xbd, 0x38, 0xb5, 0xdf, 0xf8, 0xa0, 0x13, 0xdf, 0xf8, 0x94, 0x43, + 0x51, 0xf8, 0x20, 0x30, 0x00, 0x21, 0xad, 0xf8, 0x00, 0x10, 0x62, 0x68, + 0x00, 0x2a, 0x2f, 0xd0, 0x08, 0x28, 0xac, 0xbf, 0x03, 0xf1, 0xb4, 0x04, + 0x03, 0xf1, 0x40, 0x04, 0x24, 0x78, 0xc4, 0xf3, 0x00, 0x14, 0x3c, 0xb3, + 0x08, 0x28, 0x03, 0xdb, 0x03, 0xf1, 0xb5, 0x04, 0xb6, 0x33, 0x02, 0xe0, + 0x03, 0xf1, 0x41, 0x04, 0x42, 0x33, 0x25, 0x78, 0x1c, 0x78, 0x04, 0xf0, + 0x0f, 0x04, 0x44, 0xea, 0x05, 0x14, 0x02, 0xeb, 0x40, 0x05, 0x23, 0x05, + 0xac, 0x87, 0x48, 0xbf, 0x44, 0xf4, 0x70, 0x44, 0x2b, 0x8b, 0xe4, 0x1a, + 0x02, 0x44, 0xad, 0xf8, 0x00, 0x40, 0x92, 0xf8, 0x54, 0x00, 0x00, 0x28, + 0x19, 0xbf, 0xbd, 0xf8, 0x00, 0x20, 0x2a, 0x83, 0xbd, 0xf8, 0x00, 0x00, + 0x28, 0x80, 0x01, 0xe0, 0x4f, 0xf6, 0x0a, 0x71, 0x08, 0x46, 0x32, 0xbd, + 0xc6, 0x49, 0x49, 0x68, 0x02, 0x46, 0x31, 0xf9, 0x12, 0x20, 0x49, 0xb1, + 0x46, 0xf2, 0xf4, 0x51, 0x89, 0x1a, 0xc5, 0x48, 0x01, 0xfb, 0x02, 0x02, + 0x42, 0xf2, 0x10, 0x73, 0x92, 0xfb, 0xf3, 0xf0, 0x00, 0xb2, 0x70, 0x47, + 0x2d, 0xe9, 0xf8, 0x43, 0x05, 0x46, 0xbe, 0x48, 0x2e, 0x46, 0x50, 0xf8, + 0x26, 0x80, 0x00, 0x27, 0x01, 0x24, 0xb9, 0x46, 0x01, 0x20, 0x0a, 0xf0, + 0x4b, 0xfe, 0x08, 0x2e, 0xac, 0xbf, 0x08, 0xf1, 0xb4, 0x00, 0x08, 0xf1, + 0x40, 0x00, 0x00, 0x78, 0xc0, 0xf3, 0x00, 0x10, 0x00, 0xb1, 0x00, 0x24, + 0x09, 0xf1, 0x01, 0x09, 0xb9, 0xf5, 0x7a, 0x7f, 0x04, 0xd2, 0x00, 0x2c, + 0xea, 0xd1, 0x38, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0x05, 0xf5, 0x36, 0x45, + 0xaf, 0x1c, 0xf8, 0xe7, 0x70, 0xb5, 0x04, 0x46, 0xab, 0x49, 0x26, 0x46, + 0x51, 0xf8, 0x26, 0x50, 0x00, 0xf0, 0x15, 0xf8, 0x20, 0x46, 0x00, 0xf0, + 0xd6, 0xf8, 0x08, 0x2e, 0x04, 0xdb, 0x00, 0xf0, 0x0a, 0xf8, 0x05, 0xf1, + 0xb4, 0x00, 0x03, 0xe0, 0x00, 0xf0, 0x05, 0xf8, 0x05, 0xf1, 0x40, 0x00, + 0xbd, 0xe8, 0x70, 0x40, 0x24, 0xe6, 0x01, 0x23, 0x02, 0x22, 0x01, 0x21, + 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, 0xe3, 0xf8, 0x05, 0xdb, 0x00, 0x23, + 0x02, 0x22, 0x01, 0x21, 0x04, 0xf1, 0xb4, 0x00, 0x04, 0xe0, 0x00, 0x23, + 0x02, 0x22, 0x01, 0x21, 0x04, 0xf1, 0x40, 0x00, 0x16, 0xe1, 0x2d, 0xe9, + 0xf0, 0x41, 0x00, 0xf0, 0xa7, 0xf8, 0x4f, 0xd0, 0x08, 0x2c, 0x1c, 0xdb, + 0x05, 0xf1, 0xb9, 0x08, 0x00, 0xf0, 0x63, 0xf8, 0x00, 0xf0, 0x5c, 0xf8, + 0x00, 0xf0, 0x55, 0xf8, 0x00, 0xf0, 0x4e, 0xf8, 0x00, 0xf0, 0x47, 0xf8, + 0x0f, 0x23, 0x0f, 0x22, 0x00, 0x21, 0x05, 0xf1, 0xc0, 0x00, 0xff, 0xf7, + 0xf7, 0xfd, 0x05, 0xf1, 0xc7, 0x01, 0x40, 0x20, 0x05, 0xf1, 0xc8, 0x03, + 0x08, 0x70, 0x0b, 0x22, 0x1a, 0x70, 0xc3, 0x35, 0x21, 0xe0, 0x05, 0xf1, + 0x45, 0x08, 0x00, 0xf0, 0x46, 0xf8, 0x00, 0xf0, 0x3f, 0xf8, 0x00, 0xf0, + 0x38, 0xf8, 0x00, 0xf0, 0x31, 0xf8, 0x00, 0xf0, 0x2a, 0xf8, 0x0f, 0x23, + 0x0f, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x4c, 0x00, 0xff, 0xf7, 0xda, 0xfd, + 0x40, 0x23, 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x53, 0x00, 0xff, 0xf7, + 0xd3, 0xfd, 0x0b, 0x23, 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x54, 0x00, + 0xff, 0xf7, 0xcc, 0xfd, 0x4f, 0x35, 0x03, 0x23, 0x1c, 0x22, 0x00, 0xf0, + 0x5e, 0xf8, 0x02, 0x23, 0xe0, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x5a, 0xf8, + 0x79, 0x68, 0x21, 0x44, 0x01, 0x20, 0x81, 0xf8, 0x30, 0x00, 0x01, 0xe0, + 0x4f, 0xf6, 0x0a, 0x76, 0x30, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x01, 0x23, + 0x02, 0x22, 0x01, 0x21, 0x40, 0x46, 0xb1, 0xe5, 0x00, 0x23, 0x10, 0x22, + 0x04, 0x21, 0x40, 0x46, 0xac, 0xe5, 0x00, 0x23, 0x08, 0x22, 0x03, 0x21, + 0x40, 0x46, 0xa7, 0xe5, 0x00, 0x23, 0x04, 0x22, 0x02, 0x21, 0x40, 0x46, + 0xa2, 0xe5, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x40, 0x46, 0x9d, 0xe5, + 0x5a, 0x49, 0x49, 0x68, 0x02, 0x46, 0x00, 0x20, 0x00, 0x29, 0x1f, 0xbf, + 0x89, 0x18, 0x91, 0xf8, 0x30, 0x10, 0x00, 0x29, 0x01, 0x20, 0x70, 0x47, + 0xf8, 0xb5, 0x00, 0xf0, 0x29, 0xf8, 0x20, 0xd0, 0x08, 0x2c, 0xac, 0xbf, + 0xb9, 0x35, 0x45, 0x35, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, + 0x1d, 0xf8, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x18, 0xf8, + 0x01, 0x23, 0x10, 0x22, 0x04, 0x21, 0x00, 0xf0, 0x13, 0xf8, 0x01, 0x23, + 0x04, 0x22, 0x00, 0xf0, 0x0e, 0xf8, 0x01, 0x23, 0x08, 0x22, 0x03, 0x21, + 0x00, 0xf0, 0x0a, 0xf8, 0x79, 0x68, 0x21, 0x44, 0x81, 0xf8, 0x30, 0x60, + 0x01, 0xe0, 0x4f, 0xf6, 0x0a, 0x76, 0x30, 0x46, 0xf2, 0xbd, 0x02, 0x21, + 0x28, 0x46, 0x65, 0xe5, 0x04, 0x46, 0x40, 0x48, 0x3d, 0x4f, 0x50, 0xf8, + 0x24, 0x50, 0x78, 0x68, 0x00, 0x26, 0x00, 0x28, 0x70, 0x47, 0x38, 0xb5, + 0x00, 0xf0, 0x1f, 0xf8, 0x07, 0xdb, 0x04, 0xf1, 0xb9, 0x05, 0x00, 0xf0, + 0x15, 0xf8, 0x00, 0xf0, 0x1d, 0xf8, 0xb4, 0x34, 0x06, 0xe0, 0x04, 0xf1, + 0x45, 0x05, 0x00, 0xf0, 0x0d, 0xf8, 0x00, 0xf0, 0x15, 0xf8, 0x40, 0x34, + 0x00, 0xf0, 0x17, 0xf8, 0x20, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, + 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x3f, 0xe5, 0x01, 0x23, 0x80, 0x22, + 0x07, 0x21, 0x28, 0x46, 0x3a, 0xe5, 0x2b, 0x49, 0x51, 0xf8, 0x20, 0x40, + 0x08, 0x28, 0x70, 0x47, 0x00, 0x23, 0x80, 0x22, 0x07, 0x21, 0x28, 0x46, + 0x30, 0xe5, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x20, 0x46, 0x2b, 0xe5, + 0x10, 0xb5, 0x04, 0x46, 0x22, 0x48, 0x21, 0x46, 0x50, 0xf8, 0x21, 0x00, + 0x08, 0x29, 0x03, 0xdb, 0xff, 0xf7, 0xfd, 0xfe, 0xb4, 0x30, 0x02, 0xe0, + 0xff, 0xf7, 0xf9, 0xfe, 0x40, 0x30, 0xff, 0xf7, 0x1b, 0xfd, 0x20, 0x46, + 0xbd, 0xe8, 0x10, 0x40, 0xf5, 0xe6, 0x10, 0xb5, 0xff, 0xf7, 0xd9, 0xff, + 0x0c, 0xdb, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x04, 0xf1, 0xb4, 0x00, + 0xff, 0xf7, 0x0c, 0xfd, 0x01, 0x23, 0x80, 0x22, 0x07, 0x21, 0x04, 0xf1, + 0xb9, 0x00, 0x0b, 0xe0, 0x01, 0x23, 0x80, 0x22, 0x07, 0x21, 0x04, 0xf1, + 0x45, 0x00, 0xff, 0xf7, 0xff, 0xfc, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, + 0x04, 0xf1, 0x40, 0x00, 0xbd, 0xe8, 0x10, 0x40, 0xf6, 0xe4, 0x07, 0x4a, + 0x53, 0x68, 0x18, 0x44, 0x80, 0xf8, 0x54, 0x10, 0x70, 0x47, 0x04, 0x49, + 0x4a, 0x68, 0x10, 0x44, 0x90, 0xf8, 0x54, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x24, 0x65, 0x02, 0x21, 0x70, 0x72, 0x02, 0x21, 0xae, 0xd6, 0xff, 0xff, + 0x34, 0x1f, 0x00, 0x02, 0xa8, 0x27, 0x5d, 0x00, 0x54, 0x65, 0x6d, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, + 0x00, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x64, 0x04, 0xdf, 0xf8, 0x64, 0x24, + 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, 0x11, 0x68, 0x08, 0x40, 0xcb, 0xe1, + 0xdf, 0xf8, 0x50, 0x04, 0xdf, 0xf8, 0x50, 0x24, 0x01, 0x68, 0xd1, 0xf8, + 0xb8, 0x00, 0x11, 0x68, 0x08, 0x40, 0x00, 0x04, 0x00, 0x0e, 0x70, 0x47, + 0xdf, 0xf8, 0x38, 0x04, 0xdf, 0xf8, 0x38, 0x24, 0x01, 0x68, 0xd1, 0xf8, + 0xb8, 0x00, 0x11, 0x68, 0x08, 0x40, 0x00, 0x0c, 0x00, 0xf0, 0x03, 0x00, + 0x70, 0x47, 0xdf, 0xf8, 0x20, 0x14, 0x09, 0x68, 0x0a, 0x18, 0xe0, 0x20, + 0x92, 0xf8, 0xbc, 0x30, 0x43, 0x43, 0xc8, 0x18, 0xc4, 0x30, 0x70, 0x47, + 0xdf, 0xf8, 0x08, 0x14, 0x09, 0x68, 0x0a, 0x18, 0xed, 0x20, 0x92, 0xf8, + 0xbc, 0x30, 0x43, 0x43, 0xc8, 0x18, 0x00, 0xf2, 0x44, 0x40, 0x70, 0x47, + 0x0d, 0xf0, 0x0d, 0xbb, 0xdf, 0xf8, 0xec, 0x03, 0x01, 0x68, 0x08, 0x69, + 0x70, 0x47, 0x80, 0xb5, 0x00, 0xe0, 0x80, 0xb5, 0xc0, 0xb2, 0xff, 0xf7, + 0xe7, 0xff, 0xd0, 0xf8, 0x7d, 0x00, 0x02, 0xbd, 0x80, 0xb5, 0xf7, 0xe7, + 0x80, 0xb5, 0x00, 0x21, 0x08, 0x28, 0x03, 0xd2, 0x00, 0xf0, 0x66, 0xf8, + 0xd0, 0xf8, 0x7d, 0x10, 0x08, 0x46, 0x02, 0xbd, 0x1c, 0xb5, 0x69, 0x46, + 0x0c, 0xf0, 0x47, 0xfe, 0x00, 0x24, 0x48, 0xb9, 0x00, 0x98, 0xff, 0x28, + 0x06, 0xd0, 0x0f, 0xf0, 0xbb, 0xf9, 0x01, 0x46, 0x00, 0x98, 0x0f, 0xf0, + 0x92, 0xfa, 0x04, 0x46, 0x20, 0x46, 0x16, 0xbd, 0xc0, 0xb2, 0x0f, 0xf0, + 0x9b, 0xba, 0x38, 0xb5, 0x04, 0x46, 0x69, 0x46, 0x0c, 0xf0, 0x31, 0xfe, + 0x00, 0x25, 0xd0, 0xb9, 0x00, 0x98, 0xff, 0x28, 0x17, 0xd0, 0xdf, 0xf8, + 0x7c, 0x13, 0x0a, 0x68, 0xe4, 0xb2, 0x10, 0x19, 0x90, 0xf8, 0xbc, 0x10, + 0x9d, 0xf8, 0x00, 0x40, 0x70, 0x20, 0x44, 0x43, 0x10, 0x19, 0x00, 0xf5, + 0x32, 0x60, 0x01, 0x44, 0x00, 0x98, 0x01, 0xf1, 0x57, 0x04, 0x0f, 0xf0, + 0x93, 0xf9, 0x00, 0x28, 0x0c, 0xbf, 0x25, 0x79, 0x25, 0x78, 0x28, 0x46, + 0x32, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x26, 0xf8, 0xd0, 0xf8, 0x89, 0x00, + 0x02, 0xbd, 0x7c, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x00, 0xf0, 0x1e, 0xf8, + 0x06, 0x46, 0x01, 0x20, 0x28, 0x60, 0x69, 0x46, 0x20, 0x46, 0xff, 0xf7, + 0x2d, 0xf9, 0x00, 0x98, 0x68, 0x60, 0x00, 0x99, 0xe9, 0x60, 0xd6, 0xf8, + 0xe1, 0x00, 0xa8, 0x60, 0xd6, 0xf8, 0xdd, 0x00, 0x28, 0x61, 0x73, 0xbd, + 0x80, 0xb5, 0x00, 0xf0, 0x09, 0xf8, 0xd0, 0xf8, 0xdd, 0x00, 0x02, 0xbd, + 0x80, 0xb5, 0x00, 0xf0, 0x03, 0xf8, 0xd0, 0xf8, 0xe5, 0x00, 0x02, 0xbd, + 0xc0, 0xb2, 0x73, 0xe7, 0x2d, 0xe9, 0xf8, 0x4f, 0x82, 0x46, 0x8c, 0xb0, + 0x0c, 0x46, 0xc0, 0xb2, 0xff, 0xf7, 0x61, 0xff, 0x80, 0x46, 0x00, 0x20, + 0x20, 0x60, 0x69, 0x46, 0x50, 0x46, 0xff, 0xf7, 0x18, 0xf9, 0xd8, 0xf8, + 0x1c, 0x00, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xdf, 0xed, + 0xa5, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0x0f, 0xf0, 0x67, 0xfa, 0xbc, 0xee, + 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x9a, 0xaf, 0x48, 0x81, 0x45, 0x2c, 0xbf, + 0xdf, 0xf8, 0xb8, 0x92, 0x4f, 0xea, 0x59, 0x09, 0x00, 0x27, 0x03, 0xad, + 0x01, 0xae, 0x32, 0x21, 0x79, 0x43, 0x08, 0xeb, 0x01, 0x0b, 0x9b, 0xf8, + 0x44, 0x00, 0x40, 0xb3, 0x8d, 0xf8, 0x16, 0x70, 0x05, 0xa9, 0x5f, 0xfa, + 0x8a, 0xf0, 0x0f, 0xf0, 0xfa, 0xfa, 0xdb, 0xf8, 0x4a, 0x10, 0x00, 0x9b, + 0x06, 0x9a, 0x00, 0x98, 0x9a, 0x1a, 0x01, 0xeb, 0xd1, 0x71, 0x48, 0x44, + 0x02, 0xeb, 0x61, 0x02, 0x90, 0x42, 0x88, 0xbf, 0x10, 0x46, 0x46, 0xf8, + 0x27, 0x00, 0xdb, 0xf8, 0x4a, 0x20, 0x00, 0x9b, 0x06, 0x99, 0x00, 0x98, + 0x59, 0x1a, 0x02, 0xeb, 0xd2, 0x72, 0xa0, 0xeb, 0x09, 0x00, 0xa1, 0xeb, + 0x62, 0x01, 0x88, 0x42, 0x38, 0xbf, 0x08, 0x46, 0x45, 0xf8, 0x27, 0x00, + 0x01, 0xe0, 0x46, 0xf8, 0x27, 0x00, 0x7f, 0x1c, 0x01, 0x2f, 0xca, 0xd9, + 0x01, 0x98, 0x00, 0x28, 0x1c, 0xbf, 0x70, 0x68, 0x00, 0x28, 0x19, 0xd0, + 0x69, 0x68, 0x01, 0x9a, 0x91, 0x42, 0x3c, 0xbf, 0x03, 0x9b, 0x83, 0x42, + 0x12, 0xd2, 0x8b, 0x42, 0x04, 0xd3, 0x03, 0x91, 0x6b, 0x60, 0x01, 0x99, + 0x01, 0x90, 0x71, 0x60, 0x01, 0x98, 0x69, 0x68, 0x88, 0x42, 0x07, 0xd3, + 0x70, 0x68, 0x01, 0x99, 0x88, 0x42, 0x38, 0xbf, 0x08, 0x46, 0x01, 0x90, + 0x00, 0x20, 0x70, 0x60, 0x00, 0x21, 0x56, 0xf8, 0x21, 0x00, 0x78, 0xb1, + 0x27, 0x68, 0x55, 0xf8, 0x21, 0x20, 0x04, 0xeb, 0x87, 0x07, 0x83, 0x1a, + 0xfb, 0x60, 0x10, 0x18, 0x22, 0x1d, 0x23, 0x68, 0x40, 0x08, 0x42, 0xf8, + 0x23, 0x00, 0x20, 0x68, 0x40, 0x1c, 0x20, 0x60, 0x49, 0x1c, 0x01, 0x29, + 0xe9, 0xd9, 0x0d, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x80, 0xb5, 0x00, 0xe0, + 0x80, 0xb5, 0xc0, 0xb2, 0xff, 0xf7, 0xcb, 0xfe, 0xd0, 0xf8, 0x93, 0x00, + 0x02, 0xbd, 0x80, 0xb5, 0xff, 0xf7, 0x5a, 0xff, 0xd0, 0xf8, 0xa7, 0x00, + 0x02, 0xbd, 0x80, 0xb5, 0xff, 0xf7, 0x54, 0xff, 0x00, 0x68, 0x02, 0xbd, + 0x6a, 0x4a, 0x01, 0xe0, 0x69, 0x4a, 0x00, 0x21, 0x42, 0xf8, 0x20, 0x10, + 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46, 0xff, 0xf7, 0x47, 0xff, 0x01, 0x46, + 0x64, 0x48, 0x50, 0xf8, 0x24, 0x00, 0x00, 0xb9, 0x88, 0x68, 0x10, 0xbd, + 0x01, 0x46, 0x00, 0x20, 0x02, 0x29, 0x07, 0xd2, 0x5b, 0x4a, 0xc9, 0xb2, + 0x13, 0x68, 0x70, 0x20, 0x41, 0x43, 0x19, 0x44, 0xd1, 0xf8, 0x28, 0x0b, + 0x70, 0x47, 0x00, 0x22, 0x80, 0xb5, 0x08, 0x29, 0x38, 0xbf, 0x02, 0x28, + 0x03, 0xd2, 0xc8, 0xb2, 0x0f, 0xf0, 0x70, 0xf9, 0x02, 0x46, 0x10, 0x46, + 0x02, 0xbd, 0x01, 0x46, 0x00, 0x20, 0x02, 0x29, 0x07, 0xd2, 0x4f, 0x4a, + 0xc9, 0xb2, 0x13, 0x68, 0x70, 0x20, 0x41, 0x43, 0x19, 0x44, 0xd1, 0xf8, + 0x38, 0x0b, 0x70, 0x47, 0x01, 0x46, 0x00, 0x20, 0x02, 0x29, 0x07, 0xd2, + 0x48, 0x4a, 0xc9, 0xb2, 0x13, 0x68, 0x70, 0x20, 0x41, 0x43, 0x19, 0x44, + 0xd1, 0xf8, 0x3c, 0x0b, 0x70, 0x47, 0x1c, 0xb5, 0x04, 0x46, 0x00, 0x20, + 0x8d, 0xf8, 0x00, 0x00, 0x0f, 0xf0, 0x5e, 0xf9, 0x01, 0x28, 0x05, 0xd1, + 0xe0, 0xb2, 0x0f, 0xf0, 0x54, 0xf9, 0x8d, 0xf8, 0x00, 0x00, 0x14, 0xe0, + 0xff, 0x21, 0x01, 0x91, 0x20, 0x46, 0x01, 0xa9, 0x0c, 0xf0, 0xe1, 0xfc, + 0x01, 0x98, 0xff, 0x28, 0x0b, 0xd0, 0x00, 0x21, 0x8d, 0xf8, 0x02, 0x10, + 0x8d, 0xf8, 0x01, 0x10, 0x0d, 0xf1, 0x01, 0x03, 0x0d, 0xf1, 0x02, 0x02, + 0x69, 0x46, 0x0f, 0xf0, 0x90, 0xfa, 0x9d, 0xf8, 0x00, 0x00, 0x16, 0xbd, + 0x30, 0x48, 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, 0x00, 0xf0, 0xff, 0x00, + 0x70, 0x47, 0x2d, 0x48, 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, 0xc0, 0xf3, + 0x07, 0x20, 0x70, 0x47, 0x1e, 0xe6, 0x27, 0xe6, 0x32, 0xe6, 0x10, 0xb5, + 0xff, 0xf7, 0x1a, 0xfe, 0x04, 0x46, 0xff, 0xf7, 0x21, 0xfe, 0x04, 0x43, + 0xff, 0xf7, 0x2a, 0xfe, 0x20, 0x43, 0x10, 0xbd, 0x38, 0xb5, 0x00, 0x24, + 0x00, 0x25, 0x28, 0x46, 0x00, 0xf0, 0x1f, 0xf8, 0xff, 0x28, 0x02, 0xd0, + 0x01, 0x20, 0xa8, 0x40, 0x04, 0x43, 0x6d, 0x1c, 0x08, 0x2d, 0xf4, 0xd3, + 0x20, 0x46, 0x32, 0xbd, 0x08, 0x28, 0x01, 0xd2, 0x1e, 0x49, 0x07, 0xe0, + 0xff, 0x20, 0x70, 0x47, 0x08, 0x28, 0x01, 0xd2, 0x1c, 0x49, 0x01, 0xe0, + 0xff, 0x20, 0x70, 0x47, 0x51, 0xf8, 0x20, 0x00, 0x70, 0x47, 0x02, 0x28, + 0x01, 0xd2, 0x19, 0x49, 0xf8, 0xe7, 0xff, 0x20, 0x70, 0x47, 0x08, 0x28, + 0x01, 0xd2, 0x17, 0x49, 0xf2, 0xe7, 0xff, 0x20, 0x70, 0x47, 0x00, 0x00, + 0xae, 0x47, 0x61, 0x3f, 0x04, 0x28, 0x01, 0xd2, 0x13, 0x49, 0xe9, 0xe7, + 0xff, 0x20, 0x70, 0x47, 0x04, 0x28, 0x01, 0xd2, 0x11, 0x49, 0xe3, 0xe7, + 0xff, 0x20, 0x70, 0x47, 0x10, 0xb9, 0x10, 0x48, 0x00, 0x68, 0x70, 0x47, + 0xff, 0x20, 0x70, 0x47, 0x04, 0x28, 0x01, 0xd2, 0x0d, 0x49, 0xd7, 0xe7, + 0xff, 0x20, 0x70, 0x47, 0x5c, 0x75, 0x02, 0x21, 0x58, 0x75, 0x02, 0x21, + 0x21, 0x12, 0x0a, 0x00, 0x10, 0x09, 0x05, 0x00, 0xd4, 0x73, 0x02, 0x21, + 0xb0, 0x74, 0x03, 0x21, 0xd0, 0x74, 0x03, 0x21, 0xa8, 0x74, 0x03, 0x21, + 0xf0, 0x74, 0x03, 0x21, 0x10, 0x75, 0x03, 0x21, 0x20, 0x75, 0x03, 0x21, + 0x30, 0x75, 0x03, 0x21, 0x34, 0x75, 0x03, 0x21, 0x01, 0xf0, 0x2e, 0xbb, + 0x01, 0xf0, 0x41, 0xbb, 0xdf, 0xf8, 0x24, 0x16, 0xdb, 0x20, 0x08, 0x60, + 0x70, 0x47, 0x7f, 0xb5, 0x06, 0x46, 0xdf, 0xf8, 0x1c, 0x56, 0xdf, 0xf8, + 0x1c, 0x16, 0xdf, 0xf8, 0x1c, 0x26, 0x00, 0x20, 0x68, 0x70, 0xa8, 0x70, + 0x68, 0x63, 0x01, 0x2e, 0x08, 0x68, 0xa8, 0x62, 0xea, 0x62, 0x07, 0xd1, + 0x03, 0x22, 0x02, 0x70, 0x00, 0x21, 0x81, 0x70, 0xc1, 0x70, 0x42, 0x70, + 0x01, 0x20, 0x00, 0xe0, 0x02, 0x20, 0x28, 0x70, 0x30, 0x46, 0x0f, 0xf2, + 0xb1, 0x51, 0x07, 0xf0, 0x6d, 0xfe, 0x04, 0x00, 0x63, 0xd1, 0x76, 0xb1, + 0xe8, 0x6a, 0xc1, 0x68, 0x86, 0x68, 0x43, 0x68, 0x50, 0xf8, 0x14, 0x2b, + 0x02, 0x90, 0x01, 0x91, 0x00, 0x96, 0x0f, 0xf2, 0x14, 0x61, 0x0f, 0xf2, + 0xf0, 0x50, 0x0f, 0xf0, 0xdf, 0xfa, 0x00, 0x20, 0x00, 0x90, 0x01, 0x21, + 0xdf, 0xf8, 0xc0, 0x65, 0x06, 0xf5, 0x14, 0x63, 0x06, 0xf5, 0xa0, 0x72, + 0x4f, 0xf4, 0x00, 0x60, 0x0f, 0xf0, 0xe6, 0xfa, 0xe8, 0x60, 0x06, 0xf1, + 0xf0, 0x03, 0x00, 0x20, 0x00, 0x90, 0x32, 0x46, 0x01, 0x21, 0x80, 0x20, + 0x0f, 0xf0, 0xdc, 0xfa, 0x68, 0x60, 0x05, 0x22, 0x06, 0xf5, 0x19, 0x60, + 0xdf, 0xf8, 0x94, 0x15, 0x02, 0x90, 0x01, 0x91, 0x00, 0x92, 0x00, 0x23, + 0xc8, 0x22, 0x0f, 0xf2, 0xd0, 0x51, 0x0f, 0xf2, 0x95, 0x40, 0x0d, 0xf0, + 0x35, 0xfe, 0x28, 0x61, 0x05, 0x22, 0x06, 0xf1, 0x80, 0x00, 0xdf, 0xf8, + 0x78, 0x15, 0x02, 0x90, 0x01, 0x91, 0x00, 0x92, 0x00, 0x23, 0x4f, 0xf4, + 0x18, 0x72, 0x49, 0xa1, 0x0f, 0xf2, 0x25, 0x10, 0x0d, 0xf0, 0x24, 0xfe, + 0xa8, 0x60, 0x05, 0xf1, 0x38, 0x01, 0x01, 0x20, 0x0f, 0xf0, 0xe4, 0xfa, + 0x28, 0x63, 0x1b, 0x22, 0x28, 0x69, 0x00, 0x21, 0x0e, 0xf0, 0xbb, 0xfa, + 0xa8, 0x68, 0x1a, 0x22, 0x00, 0x21, 0x0e, 0xf0, 0xb6, 0xfa, 0x28, 0x69, + 0x00, 0x28, 0x1c, 0xbf, 0xa8, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x28, 0x6b, + 0x08, 0xb9, 0x4f, 0xf6, 0x0b, 0x74, 0x20, 0x46, 0x04, 0xb0, 0x70, 0xbd, + 0xdf, 0xf8, 0x0c, 0x15, 0x08, 0x6b, 0x00, 0xb1, 0x01, 0x20, 0x70, 0x47, + 0x10, 0xb5, 0x0a, 0xf0, 0x99, 0xf8, 0xdf, 0xf8, 0xfc, 0x44, 0x61, 0x78, + 0x01, 0x29, 0x08, 0xbf, 0x00, 0x28, 0x08, 0xd1, 0x02, 0xe0, 0x01, 0x20, + 0x0d, 0xf0, 0xc5, 0xfe, 0xe0, 0x68, 0x0f, 0xf0, 0x0b, 0xfd, 0x00, 0x28, + 0xf7, 0xd1, 0xbd, 0xe8, 0x10, 0x40, 0x07, 0xf0, 0xd5, 0xbe, 0x08, 0xb4, + 0x2d, 0xe9, 0xf8, 0x41, 0xdf, 0xf8, 0xcc, 0x54, 0x88, 0x46, 0xa9, 0x6a, + 0x06, 0x46, 0x14, 0x46, 0x48, 0x78, 0x2a, 0x78, 0x10, 0x42, 0x30, 0xd0, + 0x08, 0x78, 0xb0, 0x42, 0x2d, 0xd3, 0xc8, 0x78, 0x00, 0x28, 0x1c, 0xbf, + 0x88, 0x78, 0x40, 0x45, 0x27, 0xd1, 0x0a, 0xf0, 0x6d, 0xf8, 0x08, 0xb1, + 0x00, 0x27, 0x0a, 0xe0, 0x68, 0x78, 0x01, 0x28, 0xfa, 0xd1, 0x28, 0x6b, + 0x4f, 0xf0, 0xff, 0x31, 0x0f, 0xf0, 0x12, 0xfc, 0x01, 0x27, 0x01, 0x28, + 0x14, 0xd1, 0xfe, 0xf7, 0x1e, 0xff, 0x02, 0x46, 0x05, 0xeb, 0x86, 0x00, + 0x41, 0x46, 0x40, 0x69, 0x0f, 0xf0, 0x3c, 0xfa, 0x07, 0xa9, 0x20, 0x46, + 0x0f, 0xf0, 0x92, 0xfd, 0x4f, 0xb1, 0x28, 0x6b, 0x00, 0x23, 0x00, 0x22, + 0x00, 0x21, 0x0f, 0xf0, 0xae, 0xfa, 0x02, 0xe0, 0x68, 0x6b, 0x40, 0x1c, + 0x68, 0x63, 0xbd, 0xe8, 0xf1, 0x01, 0x5d, 0xf8, 0x08, 0xfb, 0xdf, 0xf8, + 0x50, 0x14, 0x8a, 0x6a, 0x10, 0x70, 0x70, 0x47, 0xdf, 0xf8, 0x44, 0x24, + 0x92, 0x6a, 0xd0, 0x70, 0x91, 0x70, 0x70, 0x47, 0xdf, 0xf8, 0x38, 0x14, + 0x8a, 0x6a, 0x50, 0x70, 0x70, 0x47, 0x00, 0x00, 0x43, 0x4c, 0x49, 0x00, + 0x2d, 0xe9, 0xf0, 0x4f, 0xdf, 0xf8, 0x24, 0x54, 0xdf, 0xf8, 0x38, 0xa4, + 0x0f, 0xf2, 0xb8, 0x4b, 0x0f, 0xf2, 0x78, 0x49, 0x01, 0x20, 0xa8, 0x70, + 0x8f, 0xb0, 0x50, 0x21, 0x50, 0x46, 0x03, 0xf0, 0x1f, 0xfc, 0x00, 0x24, + 0x00, 0x26, 0x0d, 0xf1, 0x14, 0x08, 0x1a, 0xe0, 0x0f, 0xf2, 0xdc, 0x40, + 0x0f, 0xf0, 0xfc, 0xf9, 0x00, 0xf0, 0x40, 0xf9, 0x64, 0xb9, 0x06, 0xe0, + 0x05, 0xaa, 0x51, 0x46, 0x00, 0xf0, 0x41, 0xf9, 0xa9, 0x6a, 0x05, 0x98, + 0x08, 0x70, 0x48, 0x46, 0x29, 0x78, 0x49, 0x1e, 0x0f, 0xf0, 0xec, 0xf9, + 0x50, 0x21, 0x50, 0x46, 0x03, 0xf0, 0x02, 0xfc, 0x00, 0x24, 0x9d, 0xf8, + 0x08, 0x60, 0x68, 0x68, 0x4f, 0xf0, 0xff, 0x32, 0x02, 0xa9, 0x0f, 0xf0, + 0x3a, 0xfb, 0xdf, 0xf8, 0xb8, 0x13, 0x0a, 0x68, 0xdb, 0x2a, 0xf4, 0xd1, + 0x01, 0x28, 0xf2, 0xd1, 0x9d, 0xf8, 0x08, 0x00, 0x10, 0xb9, 0x00, 0xf0, + 0x19, 0xf9, 0xea, 0xe7, 0x08, 0x28, 0x18, 0xbf, 0x7f, 0x28, 0x06, 0xd1, + 0xa1, 0xb2, 0x00, 0x29, 0xe3, 0xd0, 0x0f, 0xf0, 0x33, 0xfd, 0x64, 0x1e, + 0xdf, 0xe7, 0x0f, 0xf0, 0x2f, 0xfd, 0xa0, 0xb2, 0x50, 0x28, 0x05, 0xd2, + 0x9d, 0xf8, 0x08, 0x00, 0xa1, 0xb2, 0x64, 0x1c, 0x0a, 0xf8, 0x01, 0x00, + 0x9d, 0xf8, 0x08, 0x00, 0x0a, 0x28, 0x04, 0xd0, 0x0d, 0x28, 0xce, 0xd1, + 0x0a, 0x20, 0x0f, 0xf0, 0x1d, 0xfd, 0xa4, 0xb2, 0x01, 0x2c, 0x09, 0xd1, + 0x9d, 0xf8, 0x08, 0x00, 0x0a, 0x28, 0x08, 0xbf, 0x0d, 0x2e, 0xbd, 0xd0, + 0x29, 0x78, 0x0f, 0xf2, 0xbc, 0x30, 0xb6, 0xe7, 0x00, 0xf0, 0xe4, 0xf8, + 0x20, 0xb9, 0xdf, 0xf8, 0x60, 0x03, 0x0f, 0xf0, 0x9f, 0xf9, 0xac, 0xe7, + 0x3d, 0x21, 0x50, 0x46, 0x0f, 0xf0, 0x14, 0xfd, 0x04, 0x00, 0x04, 0xd1, + 0x50, 0x46, 0x0f, 0xf0, 0x1b, 0xfd, 0x44, 0x1e, 0x01, 0xe0, 0xa0, 0xeb, + 0x0a, 0x04, 0x00, 0x26, 0x06, 0xe0, 0x1a, 0xf8, 0x06, 0x00, 0x0f, 0xf0, + 0x1b, 0xfd, 0x0a, 0xf8, 0x06, 0x00, 0x76, 0x1c, 0xa6, 0x42, 0xf6, 0xd1, + 0x00, 0x26, 0x00, 0xe0, 0x76, 0x1c, 0x0b, 0x20, 0x70, 0x43, 0x50, 0x44, + 0x90, 0xf8, 0x50, 0x70, 0xff, 0x2f, 0x07, 0xd0, 0x00, 0xf1, 0x51, 0x01, + 0x22, 0x46, 0x50, 0x46, 0x0f, 0xf0, 0x0c, 0xfd, 0x00, 0x28, 0xef, 0xd1, + 0xaa, 0xa1, 0x50, 0x46, 0x0f, 0xf0, 0x1a, 0xfd, 0x06, 0x46, 0x00, 0xf0, + 0xad, 0xf8, 0x00, 0x24, 0x06, 0xb9, 0x00, 0xb9, 0x01, 0x24, 0x00, 0x2f, + 0x00, 0xf0, 0x9e, 0x80, 0x01, 0x2f, 0x00, 0xf0, 0x92, 0x80, 0x02, 0x2f, + 0x00, 0xf0, 0x7d, 0x80, 0x0c, 0x2f, 0x64, 0xd0, 0x0d, 0x2f, 0x57, 0xd0, + 0x0e, 0x2f, 0x50, 0xd0, 0x0f, 0x2f, 0x49, 0xd0, 0x10, 0x2f, 0x3b, 0xd0, + 0x1b, 0x2f, 0x35, 0xd0, 0x27, 0x2f, 0x23, 0xd0, 0x41, 0x2f, 0x7f, 0xf4, + 0x4f, 0xaf, 0x00, 0x2c, 0x6a, 0xd1, 0x00, 0x20, 0x00, 0x90, 0x6a, 0x46, + 0x00, 0xf0, 0x98, 0xf8, 0x00, 0x98, 0x02, 0x28, 0x09, 0xd1, 0xaa, 0x49, + 0x0b, 0x68, 0xd3, 0xf8, 0x3b, 0x00, 0xd3, 0xf8, 0x3f, 0x10, 0x00, 0x22, + 0x04, 0xf0, 0x8a, 0xfc, 0x49, 0xe7, 0xc0, 0xb2, 0x0f, 0xf0, 0x99, 0xfd, + 0x00, 0x98, 0x00, 0x21, 0xc0, 0xb2, 0x0f, 0xf0, 0x57, 0xfd, 0x00, 0x98, + 0xc0, 0xb2, 0x0f, 0xf0, 0xb2, 0xfd, 0x3c, 0xe7, 0x00, 0x2c, 0x49, 0xd1, + 0x00, 0xf0, 0x79, 0xf8, 0x00, 0xf0, 0x73, 0xf8, 0xd8, 0xf8, 0x04, 0x10, + 0x05, 0x98, 0x0f, 0xf2, 0x1c, 0x32, 0xc9, 0xb2, 0xc0, 0xb2, 0xff, 0xf7, + 0xb4, 0xfe, 0x2c, 0xe7, 0x00, 0x2c, 0x39, 0xd1, 0xba, 0xa0, 0x78, 0xe7, + 0x00, 0x2c, 0x35, 0xd1, 0x01, 0xaa, 0x00, 0xf0, 0x65, 0xf8, 0x01, 0x46, + 0x6a, 0x46, 0x0a, 0x20, 0x00, 0xf0, 0x64, 0xf8, 0x58, 0x46, 0x6c, 0xe7, + 0x00, 0x2c, 0x29, 0xd1, 0x6a, 0x46, 0x51, 0x46, 0xf5, 0xe7, 0x00, 0x2c, + 0x24, 0xd1, 0x6a, 0x46, 0x51, 0x46, 0xf0, 0xe7, 0x00, 0x2c, 0x1f, 0xd1, + 0x01, 0xaa, 0x00, 0xf0, 0x4f, 0xf8, 0x01, 0x46, 0x6a, 0x46, 0x0a, 0x20, + 0x00, 0xf0, 0x4e, 0xf8, 0x07, 0xe7, 0x00, 0x2c, 0x14, 0xd1, 0x04, 0xaa, + 0x51, 0x46, 0x00, 0xf0, 0x40, 0xf8, 0x01, 0x46, 0x03, 0xaa, 0x00, 0xf0, + 0x3c, 0xf8, 0x04, 0x98, 0x03, 0x9a, 0x00, 0x21, 0xcd, 0xe9, 0x00, 0x01, + 0x02, 0xf0, 0x03, 0x02, 0x03, 0x99, 0x08, 0x46, 0x10, 0xf0, 0xf8, 0xf8, + 0xf1, 0xe6, 0x00, 0x2c, 0x7f, 0xf4, 0xe6, 0xae, 0x00, 0xf0, 0x2d, 0xf8, + 0x00, 0xf0, 0x27, 0xf8, 0x05, 0x98, 0xd8, 0xf8, 0x04, 0x10, 0x01, 0x28, + 0xc9, 0xb2, 0x02, 0xd1, 0xff, 0xf7, 0xb0, 0xfe, 0xe1, 0xe6, 0x00, 0x20, + 0xfa, 0xe7, 0x00, 0x2c, 0xec, 0xd1, 0x00, 0xf0, 0x1c, 0xf8, 0x05, 0x98, + 0xc0, 0xb2, 0xff, 0xf7, 0xab, 0xfe, 0xd6, 0xe6, 0x00, 0x2c, 0x3f, 0xf4, + 0xcd, 0xae, 0x6b, 0x48, 0x0f, 0xf0, 0xc2, 0xf8, 0xd4, 0xe6, 0x00, 0x00, + 0x5f, 0xf0, 0x04, 0x02, 0x7b, 0xa1, 0x50, 0x46, 0x0f, 0xf0, 0x50, 0xbc, + 0x29, 0x78, 0x49, 0x1e, 0x48, 0x46, 0x0f, 0xf0, 0xb5, 0xb8, 0x01, 0x46, + 0x06, 0xaa, 0x10, 0x20, 0x04, 0xe0, 0x05, 0xaa, 0x51, 0x46, 0x0a, 0x20, + 0x00, 0xe0, 0x00, 0x00, 0xf8, 0xb5, 0x06, 0x46, 0x08, 0x00, 0x15, 0x46, + 0x72, 0xa7, 0x04, 0xd1, 0x38, 0x46, 0x0f, 0xf0, 0xa3, 0xf8, 0x00, 0x24, + 0x2d, 0xe0, 0x00, 0xbf, 0x74, 0xa1, 0x0f, 0xf0, 0x47, 0xfc, 0x04, 0x00, + 0x27, 0xd0, 0x64, 0x1c, 0x0a, 0x2e, 0x04, 0xd1, 0x20, 0x46, 0x10, 0xf0, + 0xb3, 0xfc, 0x28, 0x60, 0x1f, 0xe0, 0x10, 0x2e, 0x1a, 0xd1, 0x21, 0x46, + 0x00, 0x22, 0x02, 0xe0, 0x37, 0x38, 0x00, 0xeb, 0x02, 0x12, 0x11, 0xf8, + 0x01, 0x0b, 0x78, 0xb1, 0xa0, 0xf1, 0x30, 0x03, 0x0a, 0x2b, 0x38, 0xbf, + 0x18, 0x46, 0xf4, 0xd3, 0xa0, 0xf1, 0x61, 0x03, 0x06, 0x2b, 0x38, 0xbf, + 0x57, 0x38, 0xee, 0xd3, 0xa0, 0xf1, 0x41, 0x03, 0x06, 0x2b, 0xe9, 0xd3, + 0x2a, 0x60, 0x02, 0xe0, 0x38, 0x46, 0x0f, 0xf0, 0x73, 0xf8, 0x20, 0x46, + 0xf2, 0xbd, 0x00, 0x00, 0x1c, 0xb5, 0x37, 0x4c, 0x01, 0x20, 0x60, 0x70, + 0xe0, 0x68, 0x4f, 0xf0, 0xff, 0x32, 0x69, 0x46, 0x0f, 0xf0, 0xc1, 0xf9, + 0x01, 0x28, 0xf7, 0xd1, 0x9d, 0xf8, 0x00, 0x00, 0x0a, 0x28, 0x03, 0xd1, + 0x01, 0x21, 0x0d, 0x20, 0x07, 0xf0, 0x9a, 0xfc, 0x9d, 0xf8, 0x00, 0x00, + 0x01, 0x21, 0x07, 0xf0, 0x95, 0xfc, 0xe9, 0xe7, 0x2d, 0xe9, 0xf0, 0x41, + 0x0d, 0x46, 0x90, 0x46, 0x09, 0xf0, 0x6a, 0xfe, 0x27, 0x4f, 0x04, 0x46, + 0x78, 0x78, 0x01, 0x28, 0x17, 0xd1, 0x00, 0x26, 0x46, 0x45, 0x25, 0xd2, + 0xf8, 0x68, 0x3c, 0xb1, 0x00, 0x23, 0x00, 0x22, 0x29, 0x46, 0x0f, 0xf0, + 0x40, 0xf9, 0x01, 0x28, 0x08, 0xd0, 0x1b, 0xe0, 0x00, 0x23, 0x4f, 0xf0, + 0xff, 0x32, 0x29, 0x46, 0x0f, 0xf0, 0xb5, 0xf8, 0x01, 0x28, 0x13, 0xd1, + 0x6d, 0x1c, 0x76, 0x1c, 0xe8, 0xe7, 0x00, 0x26, 0x0c, 0xe0, 0x28, 0x78, + 0x0a, 0x28, 0x03, 0xd1, 0x01, 0x21, 0x0d, 0x20, 0x07, 0xf0, 0x68, 0xfc, + 0x15, 0xf8, 0x01, 0x0b, 0x01, 0x21, 0x07, 0xf0, 0x63, 0xfc, 0x76, 0x1c, + 0x46, 0x45, 0xf0, 0xd3, 0x30, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x00, 0x01, 0xb5, 0x82, 0xb0, 0x00, 0x20, 0x00, 0x90, + 0x0b, 0x48, 0x81, 0x78, 0x01, 0x29, 0x0f, 0xd1, 0x40, 0x68, 0x00, 0x23, + 0x6a, 0x46, 0x02, 0xa9, 0x0f, 0xf0, 0x0d, 0xf9, 0x00, 0x98, 0x38, 0xb1, + 0x0f, 0x48, 0x4f, 0xf0, 0x80, 0x51, 0x01, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, + 0xbf, 0xf3, 0x6f, 0x8f, 0x07, 0xbd, 0x00, 0x00, 0xc0, 0x04, 0x00, 0x02, + 0xe8, 0x42, 0x00, 0x21, 0x70, 0x04, 0x00, 0x01, 0xa8, 0x03, 0x00, 0x01, + 0x10, 0x45, 0x03, 0x21, 0xd8, 0xd4, 0x01, 0x21, 0xe8, 0xc2, 0x01, 0x21, + 0x14, 0x42, 0x00, 0x21, 0x00, 0x89, 0x04, 0x02, 0x5c, 0x75, 0x02, 0x21, + 0x5c, 0x89, 0x04, 0x02, 0x04, 0xed, 0x00, 0xe0, 0x25, 0x73, 0x20, 0x46, + 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x20, 0x76, 0x25, 0x64, 0x2e, + 0x25, 0x64, 0x2e, 0x25, 0x64, 0x2e, 0x25, 0x64, 0x20, 0x25, 0x73, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x44, 0x52, 0x56, 0x39, 0x30, 0x34, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x50, 0x52, 0x49, 0x4e, 0x54, 0x46, 0x00, 0x00, + 0x0a, 0x4f, 0x4b, 0x0a, 0x25, 0x64, 0x3e, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x0a, 0x25, 0x64, 0x3e, 0x20, 0x00, 0x00, 0x00, 0x68, 0x65, 0x6c, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x2c, 0x3a, 0x2e, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x20, 0x4e, 0x4f, 0x54, 0x20, + 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x0a, 0x00, 0x00, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x64, 0x65, 0x62, + 0x75, 0x67, 0x20, 0x68, 0x65, 0x6c, 0x70, 0x20, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x4f, 0x47, 0x20, + 0x54, 0x45, 0x53, 0x54, 0x0a, 0x00, 0x00, 0x00, 0x55, 0x6e, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x21, + 0x0a, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x43, 0x80, 0x46, 0x0d, 0x46, + 0x98, 0xf9, 0x0c, 0x00, 0xf0, 0xf7, 0x24, 0xfb, 0x81, 0x46, 0x98, 0xf9, + 0x0d, 0x00, 0xf0, 0xf7, 0x1f, 0xfb, 0x81, 0x44, 0x98, 0xf9, 0x13, 0x00, + 0xf0, 0xf7, 0x1a, 0xfb, 0x07, 0x46, 0x98, 0xf9, 0x0e, 0x00, 0xf0, 0xf7, + 0x15, 0xfb, 0x04, 0x46, 0x98, 0xf9, 0x0f, 0x00, 0xf0, 0xf7, 0x10, 0xfb, + 0x04, 0x19, 0x98, 0xf9, 0x10, 0x00, 0xf0, 0xf7, 0x0b, 0xfb, 0x06, 0x46, + 0x98, 0xf9, 0x11, 0x00, 0xf0, 0xf7, 0x06, 0xfb, 0xb9, 0x44, 0xa1, 0x19, + 0x0f, 0x18, 0x98, 0xf9, 0x12, 0x00, 0xf0, 0xf7, 0xff, 0xfa, 0x38, 0x18, + 0x40, 0x00, 0x00, 0xeb, 0x89, 0x00, 0xe8, 0x80, 0x98, 0xf9, 0x0d, 0x10, + 0x98, 0xf9, 0x0c, 0x00, 0x98, 0xf9, 0x0f, 0x20, 0x09, 0x18, 0x98, 0xf9, + 0x13, 0x00, 0x08, 0x18, 0x98, 0xf9, 0x0e, 0x10, 0x52, 0x18, 0x98, 0xf9, + 0x10, 0x10, 0x51, 0x18, 0x98, 0xf9, 0x11, 0x20, 0x8a, 0x18, 0x98, 0xf9, + 0x12, 0x10, 0x51, 0x18, 0x49, 0x00, 0x01, 0xeb, 0x80, 0x01, 0x29, 0x81, + 0x98, 0xf9, 0x0c, 0x20, 0x98, 0xf9, 0x13, 0x10, 0x98, 0xf9, 0x0d, 0x00, + 0x98, 0xf9, 0x10, 0x30, 0x52, 0x1a, 0x12, 0x1a, 0x98, 0xf9, 0x0e, 0x10, + 0x98, 0xf9, 0x0f, 0x00, 0x09, 0x1a, 0x98, 0xf9, 0x11, 0x00, 0xc9, 0x18, + 0x98, 0xf9, 0x12, 0x30, 0x09, 0x1a, 0xc9, 0x18, 0x49, 0x00, 0x01, 0xeb, + 0x82, 0x01, 0x69, 0x81, 0xbd, 0xe8, 0xf1, 0x83, 0x2d, 0xe9, 0xf8, 0x4b, + 0x0d, 0x46, 0xd7, 0xb0, 0x90, 0x46, 0x69, 0x79, 0x8d, 0xf8, 0x0d, 0x10, + 0x00, 0x24, 0x98, 0xf8, 0x05, 0x10, 0x6e, 0x6a, 0x00, 0x27, 0x00, 0x29, + 0xc6, 0xf3, 0x03, 0x29, 0x66, 0xd0, 0x04, 0x46, 0x46, 0xf4, 0x00, 0x40, + 0x40, 0xf0, 0x01, 0x00, 0x68, 0x62, 0x08, 0xf1, 0x24, 0x03, 0x34, 0xa8, + 0x00, 0x90, 0x2a, 0x46, 0x00, 0x21, 0x20, 0x46, 0x03, 0xf0, 0x35, 0xf9, + 0xc0, 0x22, 0x41, 0x46, 0x04, 0xa8, 0xf0, 0xf7, 0x59, 0xff, 0x29, 0x7e, + 0x00, 0xf0, 0xee, 0xfa, 0x5f, 0xea, 0x09, 0x70, 0x48, 0xbf, 0x01, 0x27, + 0x00, 0xf0, 0x7e, 0xf8, 0x09, 0xf0, 0xf7, 0x0b, 0x3b, 0x46, 0x01, 0x22, + 0x59, 0x46, 0x20, 0x46, 0x10, 0xf0, 0xd9, 0xfd, 0x00, 0xf0, 0x7b, 0xf8, + 0x28, 0x79, 0x9d, 0xf8, 0x0d, 0x10, 0x00, 0x28, 0x0c, 0xbf, 0x9d, 0xf9, + 0x34, 0x90, 0x9d, 0xf9, 0x37, 0x90, 0x01, 0x20, 0x00, 0x90, 0x34, 0xab, + 0x08, 0xf1, 0x24, 0x02, 0x20, 0x46, 0x03, 0xf0, 0x3c, 0xf9, 0x00, 0xf0, + 0x61, 0xf8, 0x3b, 0x46, 0x00, 0x22, 0x59, 0x46, 0x20, 0x46, 0x10, 0xf0, + 0xbe, 0xfd, 0x00, 0xf0, 0x60, 0xf8, 0x28, 0x79, 0x00, 0x28, 0x0c, 0xbf, + 0x9d, 0xf9, 0x34, 0x70, 0x9d, 0xf9, 0x37, 0x70, 0x34, 0xaa, 0x08, 0xf1, + 0x24, 0x01, 0x20, 0x46, 0x03, 0xf0, 0x5c, 0xf9, 0x20, 0x46, 0xfd, 0xf7, + 0x23, 0xfc, 0x00, 0xf0, 0xb0, 0xfa, 0x31, 0x06, 0x6e, 0x62, 0x0d, 0xd4, + 0x28, 0x79, 0x00, 0x28, 0x0c, 0xbf, 0x9d, 0xf9, 0xd0, 0x00, 0x9d, 0xf9, + 0xd3, 0x00, 0xa9, 0xeb, 0x00, 0x04, 0xc7, 0x1b, 0xbc, 0x42, 0x03, 0xdd, + 0x3c, 0x46, 0x01, 0xe0, 0xa9, 0xeb, 0x07, 0x04, 0x28, 0x79, 0x00, 0xb1, + 0x64, 0x42, 0x20, 0xb2, 0x00, 0x28, 0x95, 0xf8, 0x24, 0x00, 0x48, 0xbf, + 0x00, 0x24, 0x41, 0x06, 0x21, 0xd4, 0x98, 0xf9, 0x14, 0x00, 0xf0, 0xf7, + 0x3d, 0xfa, 0x01, 0x46, 0x98, 0xf9, 0x14, 0x00, 0x20, 0xb1, 0x95, 0xf9, + 0x1f, 0x20, 0x49, 0xb2, 0x91, 0x42, 0x01, 0xdb, 0x00, 0x24, 0x12, 0xe0, + 0x24, 0xb2, 0x00, 0xee, 0x10, 0x4a, 0xb8, 0xee, 0xc0, 0x0a, 0xdf, 0xed, + 0x09, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0x00, 0xee, 0x90, 0x0a, 0xf8, 0xee, + 0xe0, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, + 0x10, 0x4a, 0x20, 0xb2, 0x58, 0xb0, 0xbd, 0xe8, 0xf0, 0x8b, 0x00, 0x00, + 0x00, 0x00, 0xc8, 0x42, 0x04, 0x20, 0x02, 0x21, 0x03, 0xaa, 0x02, 0x90, + 0x01, 0x91, 0x00, 0x92, 0x70, 0x47, 0x00, 0x23, 0x04, 0xaa, 0x29, 0x46, + 0x20, 0x46, 0x60, 0xe2, 0x2d, 0xe9, 0xfe, 0x43, 0x15, 0x46, 0x0a, 0x46, + 0x01, 0x46, 0x68, 0x46, 0x03, 0xf0, 0x1c, 0xfc, 0x00, 0x24, 0x55, 0xb1, + 0x9d, 0xf9, 0x01, 0x00, 0xf0, 0xf7, 0xfe, 0xf9, 0x04, 0x46, 0x9d, 0xf9, + 0x01, 0x00, 0xf0, 0xf7, 0xf9, 0xf9, 0x44, 0x43, 0xa4, 0x00, 0x9d, 0xf9, + 0x02, 0x00, 0xf0, 0xf7, 0xf3, 0xf9, 0x05, 0x46, 0x9d, 0xf9, 0x02, 0x00, + 0xf0, 0xf7, 0xee, 0xf9, 0x45, 0x43, 0x9d, 0xf9, 0x03, 0x00, 0xf0, 0xf7, + 0xe9, 0xf9, 0x07, 0x46, 0x9d, 0xf9, 0x03, 0x00, 0xf0, 0xf7, 0xe4, 0xf9, + 0x47, 0x43, 0x9d, 0xf9, 0x04, 0x00, 0xf0, 0xf7, 0xdf, 0xf9, 0x80, 0x46, + 0x9d, 0xf9, 0x04, 0x00, 0xf0, 0xf7, 0xda, 0xf9, 0x10, 0xfb, 0x08, 0xf8, + 0x9d, 0xf9, 0x05, 0x00, 0xf0, 0xf7, 0xd4, 0xf9, 0x81, 0x46, 0x9d, 0xf9, + 0x05, 0x00, 0xf0, 0xf7, 0xcf, 0xf9, 0x10, 0xfb, 0x09, 0xf9, 0x9d, 0xf9, + 0x06, 0x00, 0xf0, 0xf7, 0xc9, 0xf9, 0x06, 0x46, 0x2c, 0x19, 0x9d, 0xf9, + 0x06, 0x00, 0x3c, 0x19, 0x44, 0x44, 0xf0, 0xf7, 0xc1, 0xf9, 0x4c, 0x44, + 0x10, 0xfb, 0x06, 0x44, 0xa0, 0x00, 0xbd, 0xe8, 0xfe, 0x83, 0x00, 0x00, + 0x02, 0x46, 0x00, 0x20, 0x12, 0x79, 0x4a, 0xb9, 0x03, 0x29, 0x10, 0xd8, + 0xdf, 0xe8, 0x01, 0xf0, 0x02, 0x04, 0x02, 0x04, 0x08, 0x20, 0x70, 0x47, + 0x02, 0x20, 0x70, 0x47, 0x03, 0x29, 0x06, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, + 0x02, 0x04, 0x02, 0x04, 0x04, 0x20, 0x70, 0x47, 0x01, 0x20, 0x70, 0x47, + 0x2d, 0xe9, 0xff, 0x47, 0x04, 0x46, 0x89, 0x46, 0x90, 0x46, 0x9a, 0x46, + 0x00, 0x25, 0x5f, 0xea, 0x09, 0x00, 0x36, 0xd1, 0x15, 0xb1, 0x01, 0x2d, + 0x07, 0xd0, 0x10, 0xe0, 0x98, 0xf9, 0x00, 0x10, 0x00, 0xf0, 0x7e, 0xf8, + 0x98, 0xf9, 0x02, 0x10, 0x05, 0xe0, 0x98, 0xf9, 0x01, 0x10, 0x00, 0xf0, + 0x77, 0xf8, 0x98, 0xf9, 0x03, 0x10, 0x52, 0x46, 0x20, 0x46, 0xfd, 0xf7, + 0xae, 0xfa, 0x00, 0xf0, 0x11, 0xfb, 0x00, 0xf0, 0x0c, 0xfb, 0x00, 0x27, + 0x01, 0x2d, 0x08, 0xbf, 0x02, 0x27, 0x00, 0x26, 0xf1, 0x19, 0x6b, 0x46, + 0x01, 0xaa, 0xc9, 0xb2, 0x00, 0xf0, 0x0a, 0xfb, 0x01, 0x98, 0x08, 0xf1, + 0x24, 0x02, 0x40, 0x00, 0xf1, 0x19, 0x22, 0xf8, 0x11, 0x00, 0x76, 0x1c, + 0x00, 0x9b, 0xc0, 0x1a, 0x22, 0xf8, 0x11, 0x00, 0x02, 0x2e, 0xeb, 0xd3, + 0x6d, 0x1c, 0x02, 0x2d, 0xc7, 0xd3, 0xbd, 0xe8, 0xff, 0x87, 0x8d, 0xf8, + 0x0e, 0xa0, 0x15, 0xb1, 0x01, 0x2d, 0x14, 0xd0, 0xf4, 0xe7, 0x00, 0x26, + 0x0e, 0xe0, 0x98, 0xf9, 0x02, 0x00, 0x00, 0xf0, 0x3e, 0xf8, 0x00, 0xf0, + 0xe3, 0xfa, 0x00, 0xf0, 0xde, 0xfa, 0x00, 0xf0, 0xe2, 0xfa, 0x00, 0xf0, + 0x3f, 0xf8, 0xe5, 0xd2, 0x00, 0x2e, 0xf0, 0xd1, 0x98, 0xf9, 0x00, 0x00, + 0xef, 0xe7, 0x02, 0x26, 0x98, 0xf9, 0x01, 0x00, 0x02, 0xe0, 0xfb, 0xd0, + 0x98, 0xf9, 0x03, 0x00, 0x00, 0xf0, 0x27, 0xf8, 0x00, 0xf0, 0xcc, 0xfa, + 0x00, 0xf0, 0xc7, 0xfa, 0x00, 0xf0, 0xcb, 0xfa, 0x00, 0xf0, 0x28, 0xf8, + 0xf1, 0xd9, 0x03, 0x26, 0x98, 0xf9, 0x03, 0x00, 0x00, 0xf0, 0x19, 0xf8, + 0x00, 0xf0, 0xbe, 0xfa, 0x00, 0xf0, 0xb9, 0xfa, 0x00, 0xf0, 0xbd, 0xfa, + 0x01, 0x98, 0x08, 0xf1, 0x24, 0x01, 0x40, 0x00, 0x21, 0xf8, 0x16, 0x00, + 0x00, 0x9a, 0x80, 0x1a, 0x21, 0xf8, 0x16, 0x00, 0x76, 0x1c, 0x03, 0x2e, + 0xb6, 0xd8, 0x02, 0x2e, 0x08, 0xbf, 0x98, 0xf9, 0x01, 0x00, 0xe5, 0xd0, + 0xe2, 0xe7, 0x8d, 0xf8, 0x08, 0x00, 0x02, 0xa8, 0xfd, 0xf7, 0x54, 0xba, + 0x52, 0x46, 0x20, 0x46, 0xfd, 0xf7, 0x08, 0xba, 0x01, 0x98, 0x08, 0xf1, + 0x24, 0x01, 0x40, 0x00, 0x21, 0xf8, 0x16, 0x00, 0x00, 0x9a, 0x80, 0x1a, + 0x21, 0xf8, 0x16, 0x00, 0x76, 0x1c, 0x02, 0x2e, 0x70, 0x47, 0x1c, 0xb5, + 0x14, 0x46, 0x06, 0x22, 0x8d, 0xf8, 0x03, 0x20, 0x8d, 0xf8, 0x02, 0x10, + 0x8d, 0xf8, 0x05, 0x00, 0x00, 0x21, 0x94, 0x22, 0x00, 0xf0, 0x1a, 0xf8, + 0x00, 0xf0, 0x13, 0xf8, 0x01, 0x21, 0x95, 0x22, 0x00, 0xf0, 0x14, 0xf8, + 0x00, 0xf0, 0x0d, 0xf8, 0x02, 0x21, 0x84, 0x22, 0x00, 0xf0, 0x0e, 0xf8, + 0x00, 0xf0, 0x07, 0xf8, 0x03, 0x21, 0x85, 0x22, 0x00, 0xf0, 0x08, 0xf8, + 0x00, 0xf0, 0x01, 0xf8, 0x13, 0xbd, 0x8d, 0xf8, 0x01, 0x00, 0x68, 0x46, + 0xfd, 0xf7, 0x46, 0xb9, 0x8d, 0xf8, 0x00, 0x10, 0x8d, 0xf8, 0x04, 0x20, + 0x20, 0x46, 0x19, 0xe7, 0xfe, 0xb5, 0x0d, 0x46, 0x16, 0x46, 0x04, 0x46, + 0x1f, 0x46, 0x2a, 0x46, 0x00, 0x21, 0xff, 0xf7, 0xca, 0xff, 0x00, 0x22, + 0x00, 0x20, 0x01, 0x92, 0x00, 0x90, 0x2b, 0x46, 0x32, 0x46, 0x00, 0x21, + 0x20, 0x46, 0x02, 0xf0, 0xfd, 0xff, 0x32, 0x46, 0x39, 0x46, 0x20, 0x46, + 0x03, 0xb0, 0xbd, 0xe8, 0xf0, 0x40, 0x03, 0xf0, 0xe2, 0xb9, 0xf8, 0xb5, + 0x16, 0x46, 0x04, 0x46, 0x0d, 0x46, 0x1f, 0x46, 0x32, 0x1d, 0xff, 0xf7, + 0xb0, 0xff, 0x33, 0x7a, 0x07, 0xf1, 0x24, 0x02, 0x00, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0x08, 0xff, 0x72, 0x6a, 0x51, 0x0e, 0x01, 0xf0, 0x01, 0x01, + 0x81, 0xf0, 0x01, 0x0c, 0x07, 0xf1, 0x48, 0x01, 0x13, 0x0e, 0xb1, 0xf8, + 0x00, 0xe0, 0x03, 0xf0, 0x01, 0x03, 0x90, 0x0e, 0xd2, 0x0d, 0x02, 0xf0, + 0x01, 0x02, 0x82, 0xf0, 0x01, 0x02, 0x1e, 0xfb, 0x02, 0xf2, 0x0a, 0x80, + 0x83, 0xf0, 0x01, 0x03, 0x00, 0xf0, 0x01, 0x00, 0x4a, 0x88, 0x80, 0xf0, + 0x01, 0x00, 0x12, 0xfb, 0x0c, 0xfc, 0x8a, 0x88, 0xa1, 0xf8, 0x02, 0xc0, + 0x12, 0xfb, 0x03, 0xf2, 0xcb, 0x88, 0x8a, 0x80, 0x13, 0xfb, 0x00, 0xf0, + 0xc8, 0x80, 0x07, 0xf1, 0x24, 0x03, 0xb6, 0xf9, 0x16, 0x20, 0x29, 0x46, + 0x20, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x40, 0x03, 0xf0, 0x33, 0xb9, + 0x2d, 0xe9, 0xf0, 0x47, 0x88, 0xb0, 0x00, 0x27, 0x10, 0x9d, 0x02, 0x2d, + 0x81, 0x46, 0x0c, 0x46, 0x90, 0x46, 0x9a, 0x46, 0x11, 0xd1, 0x04, 0xf1, + 0x24, 0x00, 0xff, 0xf7, 0x3b, 0xfd, 0x94, 0xf8, 0x37, 0x00, 0x84, 0xf8, + 0x50, 0x00, 0x00, 0x20, 0x21, 0x18, 0x22, 0x18, 0x91, 0xf8, 0x30, 0x10, + 0x82, 0xf8, 0x51, 0x10, 0x40, 0x1c, 0x07, 0x28, 0xf6, 0xd3, 0x12, 0x9e, + 0x0e, 0x21, 0x04, 0xa8, 0x02, 0xf0, 0xc8, 0xfe, 0x61, 0x78, 0x8d, 0xf8, + 0x11, 0x10, 0x31, 0x00, 0x22, 0x78, 0x8d, 0xf8, 0x10, 0x20, 0x08, 0xd1, + 0xe0, 0x78, 0x8d, 0xf8, 0x13, 0x00, 0xe0, 0x7d, 0x8d, 0xf8, 0x1a, 0x00, + 0x20, 0x7e, 0x8d, 0xf8, 0x1b, 0x00, 0x98, 0xf8, 0x24, 0x00, 0x81, 0x07, + 0x51, 0xd4, 0x9d, 0xf8, 0x4c, 0x00, 0x03, 0x90, 0x02, 0x96, 0x01, 0x95, + 0xcd, 0xf8, 0x00, 0xa0, 0x04, 0xab, 0x98, 0xf8, 0x08, 0x10, 0x08, 0xf1, + 0x28, 0x02, 0x48, 0x46, 0x10, 0xf0, 0xf4, 0xfb, 0x01, 0x2d, 0x01, 0x46, + 0x14, 0xd1, 0x9d, 0xf8, 0x14, 0x00, 0x00, 0x28, 0x1c, 0xbf, 0x9d, 0xf8, + 0x12, 0x00, 0x00, 0x28, 0x02, 0xd0, 0x11, 0xf0, 0x03, 0x0f, 0x09, 0xd0, + 0x60, 0x78, 0x01, 0x27, 0x01, 0x28, 0x1f, 0xbf, 0x98, 0xf8, 0x35, 0x20, + 0x90, 0x42, 0x11, 0x98, 0x01, 0x28, 0x20, 0xd1, 0x9d, 0xf8, 0x12, 0x00, + 0xa0, 0x70, 0x01, 0x2e, 0x04, 0xbf, 0x9d, 0xf8, 0x13, 0x00, 0xe0, 0x70, + 0x9d, 0xf8, 0x14, 0x00, 0x20, 0x71, 0xbd, 0xf8, 0x16, 0x00, 0xe0, 0x81, + 0x9d, 0xf8, 0x18, 0x00, 0x60, 0x75, 0x9d, 0xf8, 0x19, 0x00, 0xa0, 0x75, + 0x05, 0xd1, 0x9d, 0xf8, 0x1a, 0x00, 0xe0, 0x75, 0x9d, 0xf8, 0x1b, 0x00, + 0x20, 0x76, 0x9d, 0xf8, 0x1c, 0x00, 0x60, 0x76, 0x9d, 0xf8, 0x1d, 0x00, + 0xa0, 0x76, 0xc8, 0x07, 0x02, 0xd5, 0x7f, 0x22, 0x62, 0x75, 0xa2, 0x75, + 0x88, 0x07, 0x02, 0xd5, 0x7f, 0x21, 0x61, 0x76, 0xa1, 0x76, 0x02, 0x2d, + 0x10, 0xd1, 0x98, 0xf8, 0x08, 0x10, 0x00, 0x22, 0x48, 0x46, 0xff, 0xf7, + 0xd9, 0xfd, 0x20, 0x61, 0x98, 0xf8, 0x24, 0x00, 0xc1, 0x06, 0x05, 0xd4, + 0x22, 0x46, 0x41, 0x46, 0x48, 0x46, 0xff, 0xf7, 0x17, 0xfd, 0xa0, 0x81, + 0x38, 0x46, 0x08, 0xb0, 0xbd, 0xe8, 0xf0, 0x87, 0x2d, 0xe9, 0xff, 0x41, + 0x0d, 0x46, 0x04, 0x46, 0x29, 0x7e, 0x16, 0x46, 0x1f, 0x46, 0xfd, 0xf7, + 0xe3, 0xf9, 0x3b, 0x46, 0x32, 0x46, 0x29, 0x46, 0x20, 0x46, 0x00, 0xf0, + 0x1c, 0xf8, 0x80, 0x46, 0x00, 0x20, 0x01, 0x21, 0x02, 0x23, 0x03, 0x90, + 0x02, 0x91, 0x01, 0x91, 0x00, 0x93, 0x2a, 0x46, 0x3b, 0x46, 0x31, 0x46, + 0x20, 0x46, 0xff, 0xf7, 0x43, 0xff, 0x96, 0xf9, 0x14, 0x10, 0x20, 0x46, + 0xf0, 0xf7, 0xc4, 0xf8, 0x00, 0xf0, 0x03, 0xf8, 0x40, 0x46, 0x00, 0xf0, + 0x96, 0xba, 0x69, 0x7e, 0x20, 0x46, 0xfd, 0xf7, 0xc1, 0xb9, 0x2d, 0xe9, + 0xf0, 0x4f, 0x0d, 0x46, 0xcf, 0xb0, 0x0d, 0xa9, 0x16, 0x46, 0x00, 0x22, + 0xc1, 0xe9, 0x00, 0x22, 0x0b, 0xa9, 0xad, 0xf8, 0x24, 0x20, 0xc1, 0xe9, + 0x00, 0x22, 0x8d, 0xf8, 0x1d, 0x20, 0x08, 0x92, 0x86, 0xf8, 0xbc, 0x20, + 0x98, 0x46, 0x69, 0x6a, 0xc1, 0xf3, 0x01, 0x71, 0x01, 0xf1, 0x01, 0x0a, + 0x95, 0xf8, 0x21, 0x10, 0x0a, 0x06, 0x03, 0xd5, 0x01, 0x21, 0x08, 0x91, + 0x86, 0xf8, 0xbc, 0x10, 0x81, 0x46, 0xf0, 0xf7, 0xf1, 0xf8, 0x38, 0x22, + 0x29, 0x46, 0x0f, 0xa8, 0xf0, 0xf7, 0x3c, 0xfc, 0xc8, 0x21, 0x1d, 0xa8, + 0x02, 0xf0, 0xf2, 0xfd, 0x00, 0x20, 0x0a, 0x90, 0x95, 0xf8, 0x24, 0x00, + 0x00, 0xf0, 0x01, 0x00, 0x80, 0xf0, 0x01, 0x0b, 0x01, 0x20, 0xbb, 0xf1, + 0x00, 0x0f, 0x8d, 0xf8, 0x1c, 0x00, 0x0f, 0xd0, 0x28, 0x79, 0x00, 0x28, + 0x0c, 0xbf, 0x96, 0xf9, 0x24, 0x00, 0x96, 0xf9, 0x27, 0x00, 0x30, 0x75, + 0x31, 0x46, 0x6a, 0x79, 0x48, 0x46, 0x10, 0xf0, 0x4d, 0xfc, 0x00, 0xf0, + 0xe8, 0xf8, 0x04, 0xe0, 0x69, 0x79, 0x48, 0x46, 0xfd, 0xf7, 0x79, 0xf8, + 0x30, 0x75, 0x06, 0xf1, 0x24, 0x02, 0x29, 0x1d, 0x48, 0x46, 0x02, 0xf0, + 0xcd, 0xfd, 0x95, 0xf8, 0x24, 0x00, 0x41, 0x07, 0x48, 0xbf, 0x4f, 0xf0, + 0x00, 0x08, 0x00, 0x20, 0x8d, 0xf8, 0x1e, 0x00, 0x00, 0x24, 0x96, 0xe0, + 0xb5, 0xf9, 0x16, 0x30, 0x06, 0xf1, 0x24, 0x02, 0x29, 0x1d, 0x48, 0x46, + 0xff, 0xf7, 0x6e, 0xfe, 0x27, 0xe0, 0x08, 0x99, 0x81, 0xf0, 0x01, 0x01, + 0x1b, 0xea, 0x01, 0x0f, 0x21, 0xd0, 0x07, 0xab, 0x2a, 0x46, 0x0d, 0xa9, + 0x0b, 0xa8, 0x00, 0xf0, 0xa4, 0xf9, 0x20, 0x46, 0xb0, 0xfb, 0xfa, 0xf1, + 0x0a, 0xfb, 0x11, 0x00, 0xa8, 0xb9, 0x01, 0x20, 0x06, 0x90, 0x72, 0x1d, + 0x69, 0x79, 0x05, 0x91, 0xcd, 0xf8, 0x10, 0x80, 0x03, 0x92, 0x0b, 0xa9, + 0x28, 0x79, 0x02, 0x90, 0x0d, 0xaa, 0x01, 0x91, 0x00, 0x92, 0x0d, 0xf1, + 0x1d, 0x03, 0x32, 0x46, 0x05, 0xf1, 0x10, 0x01, 0x48, 0x46, 0x10, 0xf0, + 0xc3, 0xfd, 0x7f, 0x1c, 0x08, 0x2f, 0x19, 0xd2, 0x01, 0x2f, 0xc9, 0xd0, + 0xb8, 0x1e, 0x05, 0x28, 0xcf, 0xd2, 0x33, 0x46, 0x2a, 0x46, 0xf9, 0xb2, + 0x48, 0x46, 0xff, 0xf7, 0x52, 0xfe, 0x02, 0x2f, 0x04, 0xbf, 0x70, 0x79, + 0x00, 0x28, 0xec, 0xd1, 0x96, 0xf9, 0x32, 0x00, 0x00, 0xf1, 0x1e, 0x01, + 0x3d, 0x29, 0xe6, 0xd3, 0x40, 0x42, 0x86, 0xf8, 0x32, 0x00, 0xe2, 0xe7, + 0x08, 0x98, 0x08, 0xb9, 0x00, 0xf0, 0x7f, 0xf8, 0x06, 0xf1, 0x32, 0x02, + 0x54, 0x85, 0x29, 0x7b, 0x00, 0x29, 0x3c, 0xd0, 0x00, 0x20, 0x8d, 0xf8, + 0x1e, 0x00, 0x73, 0x79, 0x01, 0x2b, 0x42, 0xd1, 0xad, 0xf8, 0x24, 0x00, + 0x14, 0x2c, 0x96, 0xf9, 0x14, 0x10, 0x8d, 0xf8, 0x0c, 0x10, 0xa8, 0xbf, + 0x01, 0x20, 0x96, 0xf8, 0x24, 0x30, 0x8d, 0xf8, 0x0d, 0x30, 0x96, 0xf8, + 0x25, 0x10, 0x8d, 0xf8, 0x0e, 0x10, 0x96, 0xf8, 0x26, 0x10, 0x8d, 0xf8, + 0x0f, 0x10, 0x96, 0xf8, 0x27, 0x30, 0x8d, 0xf8, 0x10, 0x30, 0x0a, 0x23, + 0x11, 0x78, 0x8d, 0xf8, 0x11, 0x10, 0x51, 0x78, 0x8d, 0xf8, 0x12, 0x10, + 0x91, 0x78, 0x8d, 0xf8, 0x13, 0x10, 0xd1, 0x78, 0x8d, 0xf8, 0x14, 0x10, + 0x11, 0x79, 0x8d, 0xf8, 0x15, 0x10, 0x01, 0x22, 0x03, 0xa9, 0x02, 0x92, + 0x01, 0x91, 0x00, 0x93, 0x0a, 0xaa, 0x14, 0x23, 0x1d, 0xa9, 0x03, 0xf0, + 0x69, 0xf8, 0x01, 0x28, 0x8d, 0xf8, 0x1e, 0x00, 0x16, 0xd0, 0x64, 0x1c, + 0xa4, 0xb2, 0x28, 0x8a, 0x84, 0x42, 0x11, 0xda, 0x05, 0xf1, 0x10, 0x01, + 0x48, 0x46, 0x10, 0xf0, 0xbc, 0xfc, 0x01, 0x27, 0x5e, 0xe7, 0xa1, 0x42, + 0x04, 0xda, 0xbd, 0xf8, 0x24, 0x00, 0x40, 0x1c, 0xad, 0xf8, 0x24, 0x00, + 0xbd, 0xf8, 0x24, 0x00, 0x05, 0x28, 0xe8, 0xd3, 0x08, 0x98, 0x58, 0xb9, + 0x95, 0xf8, 0x20, 0x10, 0x0b, 0xa8, 0xef, 0xf7, 0x90, 0xff, 0x70, 0x70, + 0x0d, 0xa8, 0x95, 0xf8, 0x20, 0x10, 0xef, 0xf7, 0x8a, 0xff, 0x30, 0x70, + 0x38, 0x22, 0x0f, 0xa9, 0x28, 0x46, 0xf0, 0xf7, 0x45, 0xfb, 0x9d, 0xf8, + 0x1e, 0x00, 0x01, 0x28, 0x09, 0xd1, 0x68, 0x6a, 0x81, 0x02, 0x06, 0xd5, + 0x43, 0x46, 0x32, 0x46, 0x05, 0xf1, 0x10, 0x01, 0x48, 0x46, 0x00, 0xf0, + 0x87, 0xf8, 0x00, 0x20, 0x4f, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x06, 0xf1, + 0x24, 0x02, 0x29, 0x1d, 0x48, 0x46, 0x02, 0xf0, 0x82, 0xbf, 0x20, 0x46, + 0xfc, 0xf7, 0x21, 0xbf, 0x20, 0x46, 0xfd, 0xf7, 0x1e, 0xb9, 0x6b, 0x46, + 0x01, 0xaa, 0xf1, 0xb2, 0x20, 0x46, 0xfc, 0xf7, 0xe7, 0xbe, 0x2d, 0xe9, + 0xf0, 0x4f, 0x87, 0xb0, 0x4f, 0xf0, 0x01, 0x0a, 0x13, 0x9f, 0x12, 0x9c, + 0xd3, 0x46, 0x03, 0xf1, 0x24, 0x08, 0x01, 0x2f, 0xd8, 0xf8, 0x00, 0x60, + 0x04, 0xbf, 0x4f, 0xf0, 0x00, 0x0b, 0x98, 0xf8, 0x11, 0xa0, 0xb1, 0x46, + 0x02, 0x2c, 0x04, 0xbf, 0x46, 0xf0, 0x10, 0x06, 0xc8, 0xf8, 0x00, 0x60, + 0x05, 0x97, 0x01, 0x26, 0x55, 0x46, 0x8d, 0xf8, 0x11, 0x00, 0x8d, 0xf8, + 0x10, 0x10, 0x17, 0x46, 0x06, 0x93, 0x01, 0xe0, 0x6d, 0x1c, 0xed, 0xb2, + 0x9d, 0xf8, 0x10, 0x00, 0xa8, 0x42, 0x3c, 0xdb, 0x7d, 0x70, 0x3d, 0x70, + 0x05, 0x98, 0x01, 0x28, 0x03, 0xd1, 0x55, 0x45, 0x0c, 0xbf, 0x01, 0x26, + 0x00, 0x26, 0x01, 0x20, 0x03, 0x90, 0x02, 0x96, 0xcd, 0xf8, 0x04, 0xb0, + 0x00, 0x94, 0x9d, 0xf8, 0x44, 0x30, 0x06, 0x9a, 0x9d, 0xf8, 0x11, 0x00, + 0x39, 0x46, 0xff, 0xf7, 0xb1, 0xfd, 0x6a, 0x1e, 0xd1, 0xb2, 0x10, 0x9b, + 0x4f, 0xf0, 0x06, 0x0c, 0x1c, 0xfb, 0x01, 0xf1, 0x19, 0x44, 0x97, 0xf9, + 0x15, 0x30, 0x0b, 0x70, 0x97, 0xf9, 0x16, 0x30, 0x5b, 0x42, 0x4b, 0x70, + 0x97, 0xf9, 0x17, 0x30, 0x8b, 0x70, 0x97, 0xf9, 0x18, 0x30, 0x5b, 0x42, + 0xcb, 0x70, 0x97, 0xf9, 0x19, 0x30, 0x0b, 0x71, 0x97, 0xf9, 0x1a, 0x30, + 0x5b, 0x42, 0x4b, 0x71, 0x05, 0x99, 0x01, 0x29, 0x08, 0xbf, 0x01, 0x28, + 0xc0, 0xd1, 0x02, 0x2d, 0x24, 0xbf, 0x7a, 0x70, 0x3a, 0x70, 0x78, 0x78, + 0x02, 0x28, 0x80, 0x41, 0xc0, 0x43, 0xc0, 0x0f, 0x78, 0x71, 0xc8, 0xf8, + 0x00, 0x90, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x2d, 0xe9, 0xf8, 0x4f, + 0x15, 0x46, 0x84, 0xb0, 0x83, 0x46, 0x95, 0xf9, 0x01, 0x80, 0x95, 0xf9, + 0x00, 0x00, 0x80, 0x44, 0x0c, 0x46, 0x1e, 0x46, 0x58, 0x46, 0xfc, 0xf7, + 0xb8, 0xff, 0x81, 0x46, 0x60, 0x69, 0x09, 0xf1, 0x20, 0x01, 0x42, 0x00, + 0x01, 0xf0, 0x7f, 0x01, 0x4c, 0xbf, 0x02, 0x27, 0x01, 0x27, 0x58, 0x46, + 0xfc, 0xf7, 0xad, 0xff, 0x8d, 0xf8, 0x0e, 0x60, 0x4f, 0xf0, 0x00, 0x0a, + 0x03, 0x24, 0x00, 0x26, 0x02, 0x97, 0x05, 0xf1, 0xb0, 0x00, 0x02, 0x21, + 0x01, 0x90, 0x00, 0x91, 0x03, 0xaa, 0x9d, 0xf8, 0x0e, 0x30, 0x0d, 0xf1, + 0x0d, 0x01, 0x58, 0x46, 0x10, 0xf0, 0x0c, 0xfc, 0x9d, 0xf9, 0x0d, 0x00, + 0x9d, 0xf9, 0x0c, 0x10, 0x36, 0x18, 0x64, 0x1e, 0x8a, 0x44, 0xe9, 0xd1, + 0x76, 0xb2, 0x76, 0x1c, 0x03, 0x21, 0x96, 0xfb, 0xf1, 0xf1, 0x8d, 0xf8, + 0x0d, 0x10, 0x03, 0x22, 0x4f, 0xfa, 0x8a, 0xf1, 0x49, 0x1c, 0x91, 0xfb, + 0xf2, 0xf2, 0x8d, 0xf8, 0x0c, 0x20, 0x01, 0x23, 0x9d, 0xf8, 0x0d, 0x20, + 0x9d, 0xf8, 0x0c, 0x10, 0x85, 0xf8, 0xbb, 0x30, 0x8a, 0x18, 0x52, 0xb2, + 0x4f, 0xfa, 0x88, 0xf1, 0x8a, 0x42, 0x58, 0x46, 0x06, 0xda, 0x49, 0x46, + 0xfc, 0xf7, 0x71, 0xff, 0x00, 0x20, 0x85, 0xf8, 0xbb, 0x00, 0x05, 0xe0, + 0x9d, 0xf8, 0x0c, 0x00, 0x68, 0x70, 0x9d, 0xf8, 0x0d, 0x10, 0x29, 0x70, + 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0xf8, 0xb5, 0x14, 0x46, 0x0e, 0x46, + 0x94, 0xf8, 0x20, 0x10, 0x1d, 0x46, 0xef, 0xf7, 0x82, 0xfe, 0x07, 0x46, + 0x94, 0xf8, 0x20, 0x10, 0x30, 0x46, 0xef, 0xf7, 0x7c, 0xfe, 0x01, 0x46, + 0x60, 0x6a, 0x42, 0x03, 0x14, 0xd5, 0x28, 0x78, 0x90, 0xb1, 0xc8, 0x19, + 0x94, 0xf8, 0x21, 0x10, 0xc1, 0xf3, 0x02, 0x11, 0x88, 0x42, 0x0b, 0xd3, + 0x00, 0x20, 0x28, 0x70, 0x94, 0xf8, 0x21, 0x00, 0x21, 0x7f, 0x62, 0x7f, + 0x00, 0xf0, 0x0f, 0x00, 0x41, 0x18, 0x80, 0x18, 0x21, 0x77, 0x60, 0x77, + 0xf1, 0xbd, 0x2d, 0xe9, 0xff, 0x41, 0x0d, 0x46, 0x05, 0xf1, 0x08, 0x06, + 0x00, 0x23, 0x80, 0x46, 0x14, 0x46, 0x33, 0x70, 0x00, 0x27, 0x00, 0xf0, + 0x47, 0xf8, 0xfd, 0xf7, 0x4a, 0xf8, 0x00, 0xf0, 0x43, 0xf8, 0xfc, 0xf7, + 0xc7, 0xff, 0x00, 0xf0, 0x3f, 0xf8, 0xfd, 0xf7, 0x54, 0xf8, 0x00, 0xf0, + 0x3b, 0xf8, 0xfd, 0xf7, 0x47, 0xf8, 0x00, 0xf0, 0x37, 0xf8, 0xfd, 0xf7, + 0x4a, 0xf8, 0x7f, 0x1c, 0xf8, 0xb2, 0x02, 0x28, 0xe7, 0xd3, 0x1f, 0x21, + 0x00, 0x20, 0x02, 0x91, 0x01, 0x90, 0x00, 0x90, 0x00, 0xf0, 0x31, 0xf8, + 0x0f, 0x20, 0x00, 0x21, 0x01, 0x22, 0x00, 0xf0, 0x29, 0xf8, 0x0f, 0x20, + 0x00, 0x21, 0x02, 0x22, 0x00, 0xf0, 0x24, 0xf8, 0xf0, 0x7e, 0xc1, 0x06, + 0x09, 0xd5, 0x02, 0x23, 0xc0, 0xf3, 0x41, 0x00, 0x83, 0x40, 0x5b, 0xb2, + 0x22, 0x46, 0x29, 0x46, 0x40, 0x46, 0x00, 0xf0, 0x9c, 0xf8, 0xf3, 0x7e, + 0x31, 0x78, 0xdb, 0x08, 0x03, 0xf0, 0x01, 0x03, 0x04, 0xf1, 0x24, 0x02, + 0x40, 0x46, 0x03, 0xf0, 0xa9, 0xf8, 0xe0, 0x78, 0xe0, 0x81, 0x08, 0xb1, + 0x01, 0x20, 0x60, 0x71, 0x00, 0x20, 0x04, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, + 0x00, 0x22, 0xf9, 0xb2, 0x40, 0x46, 0x70, 0x47, 0x02, 0x90, 0x01, 0x91, + 0x00, 0x92, 0x00, 0x23, 0x22, 0x46, 0x29, 0x46, 0x40, 0x46, 0xff, 0xe7, + 0x2d, 0xe9, 0xf8, 0x4f, 0x88, 0xb0, 0x14, 0x00, 0x9d, 0xf9, 0x4c, 0xa0, + 0x9d, 0xf9, 0x50, 0x20, 0x4f, 0xf0, 0x00, 0x09, 0xaa, 0xeb, 0x02, 0x06, + 0x52, 0x44, 0xc8, 0x46, 0x4f, 0xfa, 0x82, 0xfa, 0x18, 0xbf, 0x04, 0xf1, + 0x24, 0x08, 0x06, 0x93, 0x0b, 0xb1, 0x03, 0xf5, 0xd0, 0x78, 0x12, 0x9d, + 0x83, 0x46, 0x0f, 0x46, 0x19, 0xe0, 0x39, 0x7a, 0x72, 0xb2, 0x58, 0x46, + 0xfc, 0xf7, 0xeb, 0xff, 0x03, 0xa9, 0x01, 0x20, 0x01, 0x91, 0x04, 0xaa, + 0x02, 0x90, 0x00, 0x92, 0x05, 0xab, 0x39, 0x7a, 0x07, 0xf1, 0x28, 0x02, + 0x58, 0x46, 0x10, 0xf0, 0x38, 0xf9, 0x9d, 0xf8, 0x0c, 0x10, 0x89, 0x45, + 0x02, 0xd2, 0x07, 0x98, 0x89, 0x46, 0x46, 0x73, 0x76, 0x1c, 0x68, 0xb2, + 0x40, 0x44, 0x07, 0x90, 0x70, 0xb2, 0x82, 0x45, 0x0f, 0xdb, 0x45, 0xb1, + 0x02, 0x2d, 0xdc, 0xd0, 0x3f, 0xbf, 0x72, 0xb2, 0x39, 0x7a, 0x58, 0x46, + 0xfc, 0xf7, 0xbe, 0xff, 0xda, 0xe7, 0x39, 0x7a, 0x72, 0xb2, 0x58, 0x46, + 0xfc, 0xf7, 0xbf, 0xff, 0xd4, 0xe7, 0x58, 0x46, 0x39, 0x46, 0x2a, 0x46, + 0x00, 0x23, 0x04, 0xb1, 0xe3, 0x1c, 0x06, 0x9c, 0x14, 0xb1, 0x23, 0x46, + 0x03, 0xf2, 0x2a, 0x23, 0x0b, 0xb1, 0x83, 0xf8, 0x00, 0x90, 0xb8, 0xf1, + 0x00, 0x0f, 0x04, 0xd0, 0x07, 0x9b, 0x93, 0xf9, 0x0d, 0x30, 0x00, 0xf0, + 0x03, 0xf8, 0x09, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x10, 0xb5, 0x14, 0x46, + 0x1a, 0x46, 0x23, 0x00, 0x03, 0xd0, 0x02, 0x2c, 0x06, 0xd0, 0x05, 0xd3, + 0x10, 0xbd, 0x09, 0x7a, 0xbd, 0xe8, 0x10, 0x40, 0xfc, 0xf7, 0x97, 0xbf, + 0x09, 0x7a, 0x01, 0x2c, 0x03, 0xd1, 0xbd, 0xe8, 0x10, 0x40, 0xfc, 0xf7, + 0x89, 0xbf, 0xbd, 0xe8, 0x10, 0x40, 0xfc, 0xf7, 0x8e, 0xbf, 0x2d, 0xe9, + 0xf8, 0x4f, 0x0f, 0x46, 0x8a, 0xb0, 0x39, 0x7a, 0x82, 0x46, 0x14, 0x46, + 0x99, 0x46, 0xfc, 0xf7, 0x9f, 0xfe, 0x05, 0x46, 0x39, 0x7a, 0x50, 0x46, + 0xfc, 0xf7, 0xb6, 0xfe, 0x06, 0x46, 0x39, 0x7a, 0x50, 0x46, 0xfc, 0xf7, + 0xcd, 0xfe, 0xa5, 0xeb, 0x09, 0x01, 0x4a, 0xb2, 0x12, 0xf1, 0x1f, 0x0f, + 0x4d, 0x44, 0xb8, 0xbf, 0x6f, 0xf0, 0x1e, 0x01, 0x6d, 0xb2, 0x08, 0x95, + 0x1f, 0x2d, 0xc4, 0xbf, 0x1f, 0x23, 0x08, 0x93, 0x09, 0xeb, 0xd9, 0x73, + 0xa6, 0xeb, 0x63, 0x02, 0x8d, 0xf8, 0x0d, 0x20, 0x6f, 0xf0, 0x0e, 0x05, + 0x9d, 0xf9, 0x0d, 0x20, 0xaa, 0x42, 0x06, 0xeb, 0x63, 0x06, 0xb8, 0xbf, + 0x8d, 0xf8, 0x0d, 0x50, 0x76, 0xb2, 0x07, 0x96, 0x0f, 0x2e, 0xc4, 0xbf, + 0x0f, 0x26, 0x07, 0x96, 0xa0, 0xeb, 0x63, 0x02, 0x8d, 0xf8, 0x0c, 0x20, + 0x00, 0xeb, 0x63, 0x00, 0x9d, 0xf9, 0x0c, 0x20, 0xaa, 0x42, 0xb8, 0xbf, + 0x8d, 0xf8, 0x0c, 0x50, 0x45, 0xb2, 0x09, 0x94, 0x0f, 0x2d, 0x09, 0x98, + 0x4f, 0xf0, 0x00, 0x08, 0xc8, 0xbf, 0x0f, 0x25, 0x0c, 0x46, 0x00, 0xf1, + 0x31, 0x09, 0x00, 0xe0, 0x64, 0x1c, 0x08, 0x98, 0x61, 0xb2, 0x88, 0x42, + 0x38, 0xdb, 0x39, 0x7a, 0x62, 0xb2, 0x50, 0x46, 0xfc, 0xf7, 0x31, 0xff, + 0x9d, 0xf9, 0x0d, 0x60, 0x24, 0xe0, 0x39, 0x7a, 0x4f, 0xfa, 0x8b, 0xf2, + 0x50, 0x46, 0xfc, 0xf7, 0x2a, 0xff, 0x04, 0xa9, 0x01, 0x20, 0x01, 0x91, + 0x05, 0xaa, 0x02, 0x90, 0x00, 0x92, 0x06, 0xab, 0x39, 0x7a, 0x07, 0xf1, + 0x28, 0x02, 0x50, 0x46, 0x10, 0xf0, 0x77, 0xf8, 0x9d, 0xf8, 0x10, 0x10, + 0x88, 0x45, 0x06, 0xd2, 0x88, 0x46, 0x89, 0xf8, 0x00, 0x40, 0x89, 0xf8, + 0x01, 0x60, 0x89, 0xf8, 0x02, 0xb0, 0x0b, 0xf1, 0x01, 0x0b, 0x4f, 0xfa, + 0x8b, 0xf0, 0x85, 0x42, 0xdb, 0xda, 0x76, 0x1c, 0x07, 0x98, 0x71, 0xb2, + 0x88, 0x42, 0xc9, 0xdb, 0x39, 0x7a, 0x72, 0xb2, 0x50, 0x46, 0xfc, 0xf7, + 0xf9, 0xfe, 0x9d, 0xf9, 0x0c, 0xb0, 0xee, 0xe7, 0x09, 0x98, 0x80, 0xf8, + 0x03, 0x80, 0x0b, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, 0x0d, 0xf8, 0x01, 0x70, + 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, + 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x70, 0x47, + 0x01, 0x46, 0x00, 0x20, 0x02, 0xe0, 0x4a, 0x1e, 0x40, 0x1c, 0x11, 0x40, + 0xca, 0xb2, 0x00, 0x2a, 0xf9, 0xd1, 0xc0, 0xb2, 0x70, 0x47, 0x2d, 0xe9, + 0xf0, 0x41, 0x00, 0xf0, 0x39, 0xf8, 0x00, 0x26, 0x00, 0x27, 0x6c, 0x20, + 0x78, 0x43, 0x08, 0xeb, 0x00, 0x05, 0x28, 0x46, 0x10, 0xf0, 0xa4, 0xfe, + 0x08, 0xb1, 0xe8, 0x7a, 0x06, 0x43, 0x7f, 0x1c, 0x03, 0x2f, 0xf2, 0xdb, + 0x01, 0x20, 0x00, 0xfa, 0x04, 0xf4, 0x34, 0x40, 0xe0, 0xb2, 0x00, 0xb1, + 0x01, 0x20, 0xbd, 0xe8, 0xf0, 0x81, 0x2d, 0xe9, 0xf8, 0x43, 0x00, 0xf0, + 0x1d, 0xf8, 0x00, 0x27, 0x00, 0x26, 0x6c, 0x25, 0x75, 0x43, 0x08, 0xeb, + 0x05, 0x09, 0x48, 0x46, 0x10, 0xf0, 0x88, 0xfe, 0x00, 0x28, 0x1f, 0xbf, + 0x99, 0xf8, 0x0b, 0x00, 0x01, 0x21, 0xa1, 0x40, 0x08, 0x42, 0x03, 0xd0, + 0x18, 0xf8, 0x05, 0x00, 0x01, 0x28, 0x03, 0xd0, 0x76, 0x1c, 0x03, 0x2e, + 0xe9, 0xdb, 0x00, 0xe0, 0x01, 0x27, 0x38, 0x46, 0xbd, 0xe8, 0xf2, 0x83, + 0x04, 0x46, 0xb1, 0x48, 0x01, 0x68, 0x01, 0xf6, 0x2d, 0x48, 0x70, 0x47, + 0xf8, 0xb5, 0x00, 0xf0, 0x39, 0xf8, 0x00, 0xf0, 0x4f, 0xf8, 0x10, 0xb1, + 0x97, 0xf8, 0x4f, 0x01, 0x05, 0x43, 0x76, 0x1c, 0x01, 0x2e, 0xf6, 0xdd, + 0xe8, 0xb2, 0xf2, 0xbd, 0xa7, 0x48, 0x01, 0x68, 0x01, 0xf6, 0x0a, 0x42, + 0x10, 0x68, 0x51, 0x68, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46, 0xff, 0xf7, + 0xe7, 0xff, 0x01, 0x21, 0x01, 0xfa, 0x04, 0xf4, 0x20, 0x40, 0x18, 0xbf, + 0x01, 0x20, 0x10, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x28, + 0x18, 0xbf, 0x00, 0x20, 0x02, 0xbd, 0xf8, 0xb5, 0x00, 0xf0, 0x12, 0xf8, + 0xf0, 0xb2, 0x48, 0x21, 0x48, 0x43, 0x27, 0x18, 0x07, 0xf5, 0xa2, 0x70, + 0x11, 0xf0, 0x24, 0xfa, 0x20, 0xb9, 0x76, 0x1c, 0xf0, 0xb2, 0x02, 0x28, + 0xf2, 0xdb, 0x01, 0xe0, 0x97, 0xf8, 0x44, 0x51, 0x28, 0x46, 0xf2, 0xbd, + 0x90, 0x48, 0x01, 0x68, 0x01, 0xf6, 0x2d, 0x44, 0x00, 0x25, 0x00, 0x26, + 0x70, 0x47, 0xf8, 0xb5, 0xff, 0xf7, 0xf6, 0xff, 0x00, 0xf0, 0x0c, 0xf8, + 0x28, 0xb1, 0x07, 0xf5, 0xc2, 0x70, 0x01, 0x68, 0x8d, 0x42, 0x38, 0xbf, + 0x0d, 0x46, 0x76, 0x1c, 0x01, 0x2e, 0xf3, 0xdd, 0x28, 0x46, 0xf2, 0xbd, + 0x48, 0x21, 0x71, 0x43, 0x67, 0x18, 0x07, 0xf5, 0xa2, 0x70, 0x11, 0xf0, + 0xfb, 0xb9, 0x00, 0x00, 0x38, 0xb5, 0x1d, 0x46, 0x00, 0x24, 0x2c, 0x60, + 0x09, 0xb1, 0x88, 0x42, 0x02, 0xd2, 0x4b, 0xf6, 0x13, 0x04, 0x28, 0xe0, + 0x13, 0x00, 0x04, 0xd1, 0xac, 0x60, 0x6c, 0x60, 0xb0, 0xfb, 0xf1, 0xf0, + 0x1e, 0xe0, 0x00, 0xee, 0x10, 0x0a, 0x00, 0xee, 0x90, 0x1a, 0xb8, 0xee, + 0x40, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x01, 0x2a, 0x80, 0xee, 0x20, 0x0a, + 0x05, 0xd1, 0x01, 0x21, 0xac, 0x60, 0x69, 0x60, 0xf7, 0xee, 0x08, 0x0a, + 0x04, 0xe0, 0x01, 0x20, 0xa8, 0x60, 0x6c, 0x60, 0xdf, 0xed, 0x6c, 0x0a, + 0x80, 0xee, 0x20, 0x0a, 0xfd, 0xf7, 0x14, 0xf9, 0xbc, 0xee, 0xc0, 0x0a, + 0x10, 0xee, 0x10, 0x0a, 0x11, 0xf0, 0x10, 0xfa, 0x28, 0x60, 0x20, 0x46, + 0x32, 0xbd, 0x2d, 0xe9, 0xf0, 0x47, 0x65, 0x4b, 0x1c, 0x68, 0x00, 0x25, + 0x04, 0xf6, 0x2d, 0x43, 0x05, 0x70, 0x0d, 0x70, 0x00, 0x24, 0x14, 0x70, + 0x01, 0x25, 0x2b, 0x26, 0x66, 0x43, 0x1e, 0x44, 0x06, 0xf5, 0x5d, 0x77, + 0x97, 0xf8, 0x00, 0xc0, 0xbc, 0xf1, 0x01, 0x0f, 0x56, 0xd1, 0x4f, 0xf0, + 0x00, 0x0c, 0x05, 0xfa, 0x04, 0xfa, 0x1f, 0xe0, 0x06, 0xeb, 0x0c, 0x0e, + 0x9e, 0xf8, 0x7a, 0xe3, 0xae, 0xf1, 0x20, 0x08, 0xb8, 0xf1, 0x10, 0x0f, + 0x05, 0xd2, 0x90, 0xf8, 0x00, 0x90, 0x4a, 0xea, 0x09, 0x09, 0x80, 0xf8, + 0x00, 0x90, 0xae, 0xf1, 0x30, 0x0e, 0xbe, 0xf1, 0x10, 0x0f, 0x09, 0xd2, + 0x90, 0xf8, 0x00, 0xe0, 0x04, 0xf1, 0x02, 0x08, 0x05, 0xfa, 0x08, 0xf8, + 0x48, 0xea, 0x0e, 0x0e, 0x80, 0xf8, 0x00, 0xe0, 0x0c, 0xf1, 0x01, 0x0c, + 0x97, 0xf8, 0x01, 0xe0, 0xf4, 0x45, 0xdb, 0xd3, 0x6c, 0x27, 0x67, 0x43, + 0x00, 0x26, 0x1f, 0x44, 0x24, 0xe0, 0x07, 0xeb, 0x06, 0x0c, 0x9c, 0xf8, + 0x1b, 0xc0, 0xbc, 0xf1, 0x10, 0x0f, 0x0b, 0xd2, 0x4f, 0xea, 0x9c, 0x08, + 0x91, 0xf8, 0x00, 0xe0, 0x04, 0xeb, 0x48, 0x09, 0x05, 0xfa, 0x09, 0xf9, + 0x49, 0xea, 0x0e, 0x0e, 0x81, 0xf8, 0x00, 0xe0, 0xac, 0xf1, 0x10, 0x0c, + 0xbc, 0xf1, 0x10, 0x0f, 0x0b, 0xd2, 0x4f, 0xea, 0x9c, 0x0c, 0x92, 0xf8, + 0x00, 0xe0, 0x04, 0xeb, 0x4c, 0x0c, 0x05, 0xfa, 0x0c, 0xfc, 0x4c, 0xea, + 0x0e, 0x0e, 0x82, 0xf8, 0x00, 0xe0, 0x76, 0x1c, 0x97, 0xf8, 0x05, 0xc0, + 0x66, 0x45, 0xd6, 0xd3, 0x64, 0x1c, 0x01, 0x2c, 0x9b, 0xd9, 0xbd, 0xe8, + 0xf0, 0x87, 0x2d, 0xe9, 0xf0, 0x41, 0x2c, 0x4d, 0x2c, 0x4c, 0x28, 0x68, + 0xd0, 0xf8, 0xb8, 0x60, 0x36, 0x0c, 0xf1, 0x07, 0x19, 0xd5, 0x00, 0xf5, + 0x32, 0x67, 0x38, 0x69, 0xf9, 0x68, 0xb0, 0xfb, 0xf1, 0xf0, 0x11, 0xf0, + 0x8e, 0xf9, 0x80, 0x46, 0x97, 0xf8, 0x2e, 0x30, 0x07, 0x22, 0x00, 0x21, + 0x00, 0xf0, 0x2e, 0xf8, 0x43, 0x46, 0x30, 0x22, 0x04, 0x21, 0x00, 0xf0, + 0x29, 0xf8, 0x01, 0x23, 0x4f, 0xf4, 0x80, 0x72, 0x08, 0x21, 0x00, 0xf0, + 0x23, 0xf8, 0xb0, 0x07, 0x1e, 0xd5, 0x29, 0x68, 0x01, 0xf5, 0x39, 0x65, + 0x28, 0x69, 0xe9, 0x68, 0xb0, 0xfb, 0xf1, 0xf0, 0x11, 0xf0, 0x71, 0xf9, + 0x06, 0x46, 0x95, 0xf8, 0x2e, 0x30, 0x4f, 0xf4, 0xe0, 0x42, 0x0c, 0x21, + 0x00, 0xf0, 0x10, 0xf8, 0x33, 0x46, 0x4f, 0xf4, 0x40, 0x32, 0x10, 0x21, + 0x00, 0xf0, 0x0a, 0xf8, 0x20, 0x46, 0xbd, 0xe8, 0xf0, 0x41, 0x01, 0x23, + 0x4f, 0xf4, 0x80, 0x12, 0x14, 0x21, 0x58, 0xe6, 0xbd, 0xe8, 0xf0, 0x81, + 0x20, 0x46, 0x54, 0xe6, 0x10, 0xb5, 0x04, 0x46, 0xe3, 0xb2, 0xff, 0x22, + 0x00, 0x21, 0x08, 0x48, 0xff, 0xf7, 0x44, 0xfe, 0x23, 0x0a, 0xbd, 0xe8, + 0x10, 0x40, 0xff, 0x22, 0x00, 0x21, 0x05, 0x48, 0x3c, 0xe6, 0x00, 0x00, + 0xab, 0xaa, 0xaa, 0x3f, 0x5c, 0x75, 0x02, 0x21, 0x28, 0x00, 0x00, 0x48, + 0x8f, 0x08, 0x00, 0x47, 0x90, 0x08, 0x00, 0x47, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, 0x0d, 0xf8, 0x01, 0x70, + 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, + 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x70, 0x47, + 0x2d, 0xe9, 0xf8, 0x4f, 0x84, 0xb0, 0x05, 0x46, 0x4f, 0xf0, 0x00, 0x08, + 0x8d, 0xf8, 0x06, 0x80, 0xad, 0xf8, 0x04, 0x80, 0x01, 0x20, 0x11, 0xf0, + 0x47, 0xf9, 0x47, 0x1e, 0xbf, 0x41, 0xff, 0x0f, 0x38, 0x46, 0xef, 0xf7, + 0x94, 0xfc, 0x00, 0x2d, 0x0a, 0xd0, 0xdf, 0xf8, 0x64, 0x43, 0x20, 0x68, + 0x00, 0xf6, 0x2d, 0x49, 0x0b, 0xf0, 0x32, 0xff, 0x05, 0x00, 0x08, 0xbf, + 0x4f, 0xf6, 0x77, 0x78, 0x00, 0xf0, 0x50, 0x81, 0x8d, 0xf8, 0x07, 0x80, + 0x00, 0x26, 0xdf, 0xf8, 0x48, 0x83, 0xf0, 0xb2, 0x58, 0xf8, 0x20, 0xa0, + 0x01, 0x23, 0x4f, 0xf4, 0x80, 0x42, 0x0e, 0x21, 0x0a, 0xf5, 0x86, 0x60, + 0xff, 0xf7, 0xbd, 0xff, 0x0a, 0xf2, 0xac, 0x4a, 0x01, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x50, 0x46, 0xff, 0xf7, 0xb5, 0xff, 0x76, 0x1c, 0xf0, 0xb2, + 0x03, 0x28, 0xe8, 0xdb, 0x03, 0x20, 0x02, 0xf0, 0x60, 0xfe, 0x03, 0xf0, + 0x0e, 0xf9, 0x5f, 0xea, 0x00, 0x08, 0x5e, 0xd1, 0x48, 0x46, 0x10, 0xf0, + 0x01, 0xf9, 0x5f, 0xea, 0x00, 0x08, 0x58, 0xd1, 0x48, 0x46, 0x10, 0xf0, + 0x15, 0xf9, 0x5f, 0xea, 0x00, 0x08, 0x52, 0xd1, 0x09, 0xf5, 0xa2, 0x76, + 0x30, 0x46, 0x10, 0xf0, 0xef, 0xfc, 0x5f, 0xea, 0x00, 0x08, 0x4a, 0xd1, + 0x30, 0x46, 0x10, 0xf0, 0x03, 0xfd, 0x5f, 0xea, 0x00, 0x08, 0x44, 0xd1, + 0x10, 0xf0, 0x26, 0xf9, 0x10, 0xf0, 0x20, 0xfd, 0x21, 0x68, 0x08, 0x69, + 0x09, 0xf5, 0x5d, 0x7a, 0x09, 0xf5, 0xea, 0x7b, 0xcd, 0xf8, 0x00, 0xb0, + 0x2b, 0x46, 0x52, 0x46, 0x49, 0x46, 0x10, 0xf0, 0x1d, 0xf9, 0x5f, 0xea, + 0x00, 0x08, 0x30, 0xd1, 0x48, 0x46, 0x10, 0xf0, 0x80, 0xfc, 0x5f, 0xea, + 0x00, 0x08, 0x2a, 0xd1, 0x58, 0x46, 0x10, 0xf0, 0x60, 0xfc, 0x21, 0x68, + 0x08, 0x69, 0x2a, 0x46, 0x31, 0x46, 0x10, 0xf0, 0x07, 0xfd, 0x5f, 0xea, + 0x00, 0x08, 0x1e, 0xd1, 0x48, 0x46, 0x11, 0xf0, 0x56, 0xf8, 0x5f, 0xea, + 0x00, 0x08, 0x18, 0xd1, 0x09, 0xf5, 0x05, 0x75, 0x28, 0x46, 0x11, 0xf0, + 0x33, 0xf8, 0x28, 0x46, 0x11, 0xf0, 0x13, 0xf8, 0x21, 0x68, 0x08, 0x69, + 0x51, 0x46, 0x11, 0xf0, 0xdf, 0xf8, 0x5f, 0xea, 0x00, 0x08, 0x08, 0xd1, + 0x09, 0xf5, 0x75, 0x70, 0x4a, 0x46, 0x40, 0x78, 0x59, 0x46, 0x00, 0xf0, + 0x50, 0xf9, 0x5f, 0xea, 0x00, 0x08, 0x40, 0xf0, 0xab, 0x80, 0x09, 0xf5, + 0x75, 0x74, 0x29, 0x46, 0x20, 0x78, 0x11, 0xf0, 0x7c, 0xf9, 0x00, 0x2f, + 0x80, 0x46, 0x00, 0xf0, 0x91, 0x80, 0xb8, 0xf1, 0x00, 0x0f, 0x03, 0xd1, + 0x20, 0x78, 0x02, 0x28, 0x18, 0xbf, 0x01, 0x28, 0x40, 0xf0, 0x88, 0x80, + 0x00, 0x25, 0x00, 0x26, 0x87, 0x4f, 0x02, 0xac, 0xf0, 0xb2, 0xff, 0xf7, + 0xd4, 0xfd, 0x98, 0xb1, 0xf0, 0xb2, 0x57, 0xf8, 0x20, 0xa0, 0x07, 0x23, + 0x38, 0x22, 0x03, 0x21, 0x0a, 0xf1, 0xd2, 0x00, 0xff, 0xf7, 0x1a, 0xff, + 0x07, 0x23, 0x38, 0x22, 0x03, 0x21, 0x0a, 0xf1, 0xe2, 0x00, 0xff, 0xf7, + 0x13, 0xff, 0xe8, 0xb2, 0x6d, 0x1c, 0x26, 0x54, 0x76, 0x1c, 0xf0, 0xb2, + 0x08, 0x28, 0xe3, 0xd3, 0xe8, 0xb2, 0x01, 0x28, 0x62, 0xd9, 0x00, 0x21, + 0x00, 0x22, 0x0c, 0xe0, 0xa1, 0x54, 0x09, 0xe0, 0x43, 0x1e, 0x9a, 0x42, + 0xfa, 0xd2, 0x0d, 0xf1, 0x08, 0x0c, 0x94, 0x44, 0xa1, 0x5c, 0x9c, 0xf8, + 0x01, 0x30, 0xa3, 0x54, 0x52, 0x1c, 0xeb, 0xb2, 0x9a, 0x42, 0xf1, 0xdb, + 0x4f, 0xf4, 0xfa, 0x70, 0x08, 0xf0, 0xd8, 0xfc, 0x00, 0x26, 0xb2, 0x46, + 0x5f, 0xfa, 0x8a, 0xf0, 0xff, 0xf7, 0x9b, 0xfd, 0xf8, 0xb1, 0x5f, 0xfa, + 0x8a, 0xf0, 0x57, 0xf8, 0x20, 0x50, 0xf0, 0xb2, 0x0e, 0x35, 0x21, 0x5c, + 0x57, 0xf8, 0x21, 0xb0, 0x05, 0x23, 0x00, 0xf0, 0x73, 0xf8, 0x4f, 0xf4, + 0x7a, 0x70, 0x08, 0xf0, 0xc1, 0xfc, 0x0b, 0xf1, 0x0e, 0x0b, 0x04, 0x23, + 0x00, 0xf0, 0x66, 0xf8, 0x4f, 0xf4, 0x7a, 0x70, 0x08, 0xf0, 0xb8, 0xfc, + 0x00, 0x23, 0x00, 0xf0, 0x63, 0xf8, 0x00, 0x23, 0x00, 0xf0, 0x5c, 0xf8, + 0x76, 0x1c, 0x0a, 0xf1, 0x01, 0x0a, 0x5f, 0xfa, 0x8a, 0xf0, 0x08, 0x28, + 0xd4, 0xd3, 0x4f, 0xf4, 0xfa, 0x70, 0x08, 0xf0, 0xa7, 0xfc, 0x00, 0x24, + 0xe0, 0xb2, 0xff, 0xf7, 0x6c, 0xfd, 0x80, 0xb1, 0xe0, 0xb2, 0x57, 0xf8, + 0x20, 0x50, 0x00, 0x23, 0x38, 0x22, 0x03, 0x21, 0x05, 0xf1, 0xd2, 0x00, + 0xff, 0xf7, 0xb2, 0xfe, 0x00, 0x23, 0x38, 0x22, 0x03, 0x21, 0x05, 0xf1, + 0xe2, 0x00, 0xff, 0xf7, 0xab, 0xfe, 0x64, 0x1c, 0xe0, 0xb2, 0x08, 0x28, + 0xe6, 0xd3, 0x01, 0xe0, 0x40, 0xf6, 0x11, 0x48, 0x9d, 0xf8, 0x07, 0x50, + 0x00, 0x27, 0xf8, 0xb2, 0xff, 0xf7, 0x4d, 0xfd, 0x00, 0xb1, 0x6d, 0x1c, + 0x7f, 0x1c, 0xf8, 0xb2, 0x08, 0x28, 0xf6, 0xd3, 0xe9, 0xb2, 0x48, 0x46, + 0x00, 0xf0, 0x2f, 0xf8, 0xb8, 0xf1, 0x00, 0x0f, 0x1c, 0xd1, 0x01, 0xaa, + 0x0d, 0xf1, 0x05, 0x01, 0x0d, 0xf1, 0x06, 0x00, 0xff, 0xf7, 0xb5, 0xfd, + 0x9d, 0xf8, 0x06, 0x30, 0x37, 0x48, 0x00, 0xf0, 0x1d, 0xf8, 0x9d, 0xf8, + 0x05, 0x30, 0x36, 0x48, 0x00, 0xf0, 0x18, 0xf8, 0x9d, 0xf8, 0x04, 0x30, + 0x34, 0x48, 0x00, 0xf0, 0x13, 0xf8, 0xff, 0xf7, 0x16, 0xfe, 0x09, 0xf5, + 0x75, 0x70, 0x40, 0x88, 0xff, 0xf7, 0x5a, 0xfe, 0x40, 0x46, 0x05, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x1f, 0x22, 0x00, 0x21, 0x58, 0x46, 0x6b, 0xe6, + 0x1f, 0x22, 0x00, 0x21, 0x28, 0x46, 0x67, 0xe6, 0xff, 0x22, 0x00, 0x21, + 0x64, 0xe6, 0xf8, 0xb5, 0x00, 0xf5, 0x5c, 0x72, 0x10, 0x68, 0x05, 0x0e, + 0x06, 0x02, 0x00, 0x0a, 0x00, 0xf0, 0x01, 0x04, 0xc0, 0xf3, 0x41, 0x00, + 0x36, 0x0e, 0x84, 0xf0, 0x01, 0x04, 0x40, 0x1c, 0xd5, 0xb1, 0x08, 0x29, + 0x18, 0xd1, 0xc0, 0xb2, 0xfb, 0xf7, 0xde, 0xfd, 0x00, 0x27, 0x26, 0xfa, + 0x07, 0xf0, 0xc0, 0x07, 0x04, 0xd4, 0x1c, 0xb1, 0x01, 0x21, 0xf8, 0xb2, + 0xfb, 0xf7, 0xc4, 0xfd, 0x01, 0x21, 0xb9, 0x40, 0x0d, 0x42, 0x1e, 0xbf, + 0x00, 0x2c, 0xf8, 0xb2, 0xfb, 0xf7, 0x51, 0xfd, 0x7f, 0x1c, 0xf8, 0xb2, + 0x08, 0x28, 0xea, 0xd3, 0xf1, 0xbd, 0xf8, 0xb5, 0x05, 0x46, 0x00, 0x26, + 0x0b, 0x4c, 0x21, 0x68, 0xf2, 0xb2, 0x48, 0x23, 0x5a, 0x43, 0x8b, 0x18, + 0x03, 0xf6, 0x71, 0x57, 0x38, 0x46, 0x10, 0xf0, 0x1b, 0xff, 0x00, 0x28, + 0x1f, 0xbf, 0xf8, 0x7a, 0x01, 0x21, 0xa9, 0x40, 0x08, 0x42, 0x03, 0xd1, + 0x76, 0x1c, 0xf0, 0xb2, 0x02, 0x28, 0xea, 0xdb, 0x38, 0x46, 0xf2, 0xbd, + 0x5c, 0x75, 0x02, 0x21, 0x8c, 0x9e, 0x04, 0x02, 0x40, 0x9a, 0x04, 0x02, + 0x07, 0x02, 0x00, 0x47, 0x08, 0x02, 0x00, 0x47, 0x09, 0x02, 0x00, 0x47, + 0x00, 0x78, 0x02, 0x40, 0xca, 0x40, 0xd0, 0xb2, 0x70, 0x47, 0x30, 0xb5, + 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, 0x0d, 0xf8, + 0x01, 0x70, 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x68, 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, + 0x30, 0xbd, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, 0x04, 0x46, 0x8b, 0x46, 0xdf, 0xf8, + 0x08, 0x6b, 0x07, 0x20, 0x00, 0x21, 0x70, 0x70, 0x31, 0x70, 0x00, 0x23, + 0xdf, 0xf8, 0xfc, 0x7a, 0x00, 0xf0, 0xa6, 0xf8, 0x01, 0x20, 0x08, 0xf0, + 0xc7, 0xfb, 0x01, 0x23, 0x00, 0xf0, 0xa0, 0xf8, 0xdf, 0xf8, 0xec, 0x7a, + 0x23, 0x46, 0x03, 0x22, 0x00, 0xf0, 0xca, 0xfb, 0x38, 0x78, 0xdf, 0xf8, + 0xe4, 0x7a, 0xdf, 0xf8, 0xe4, 0x8a, 0x39, 0x78, 0xdf, 0xf8, 0xe0, 0x5a, + 0x00, 0xf0, 0x03, 0x00, 0x40, 0x18, 0x38, 0x70, 0x00, 0x23, 0xd8, 0xf8, + 0x1c, 0x40, 0x20, 0x78, 0x00, 0xf0, 0x8c, 0xf8, 0x20, 0x78, 0x79, 0x78, + 0xdf, 0xf8, 0xc8, 0x4a, 0x00, 0xf0, 0x01, 0x00, 0x40, 0x18, 0x78, 0x70, + 0x08, 0xf0, 0xd5, 0xfd, 0xc3, 0xb2, 0x3f, 0x22, 0x00, 0xf0, 0x7f, 0xf8, + 0x20, 0x78, 0x79, 0x78, 0x00, 0xf0, 0x3f, 0x00, 0x40, 0x18, 0x78, 0x70, + 0x06, 0x23, 0x0f, 0x22, 0x00, 0xf0, 0xf7, 0xf9, 0x28, 0x78, 0x79, 0x78, + 0x00, 0xf0, 0x0f, 0x00, 0x40, 0x18, 0x78, 0x70, 0x00, 0x23, 0x80, 0x22, + 0x07, 0x21, 0x00, 0xf0, 0x5f, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0x5a, 0xf8, + 0x02, 0x20, 0x08, 0xf0, 0x83, 0xfb, 0x00, 0x23, 0x00, 0xf0, 0x54, 0xf8, + 0x20, 0x78, 0x79, 0x78, 0xc0, 0xf3, 0x80, 0x10, 0x41, 0x18, 0x79, 0x70, + 0x4f, 0xf4, 0x7a, 0x70, 0x08, 0xf0, 0x76, 0xfb, 0x00, 0x25, 0x58, 0xf8, + 0x25, 0x40, 0xe8, 0xb2, 0xff, 0xf7, 0xe1, 0xfb, 0x00, 0x28, 0x3a, 0xd0, + 0x00, 0x23, 0x00, 0xf0, 0x4b, 0xf8, 0x01, 0x23, 0x40, 0x22, 0x06, 0x21, + 0xe0, 0x1d, 0xff, 0xf7, 0x72, 0xff, 0xe8, 0xb2, 0xff, 0xf7, 0xef, 0xfb, + 0x04, 0xf1, 0x04, 0x09, 0x18, 0xb1, 0x01, 0x23, 0x00, 0xf0, 0x34, 0xf8, + 0x04, 0xe0, 0x02, 0x23, 0x00, 0xf0, 0x30, 0xf8, 0x01, 0x20, 0x30, 0x70, + 0x0b, 0xeb, 0xc5, 0x0a, 0x04, 0xf1, 0x02, 0x09, 0x9a, 0xf8, 0x00, 0x30, + 0x07, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x26, 0xf8, 0x0b, 0xf1, 0x01, 0x00, + 0xff, 0x22, 0x10, 0xf8, 0x35, 0x30, 0x00, 0x21, 0xe0, 0x1c, 0xff, 0xf7, + 0x50, 0xff, 0x9a, 0xf8, 0x02, 0x30, 0x70, 0x22, 0x00, 0xf0, 0x17, 0xf8, + 0x99, 0xf8, 0x00, 0x00, 0x39, 0x78, 0xc0, 0xf3, 0x02, 0x10, 0x41, 0x18, + 0x39, 0x70, 0x20, 0x46, 0x00, 0xf0, 0x44, 0xfb, 0x00, 0xe0, 0x75, 0x70, + 0x6d, 0x1c, 0x07, 0x2d, 0xb9, 0xd9, 0x00, 0x20, 0xbd, 0xe8, 0xf2, 0x8f, + 0x40, 0x22, 0x06, 0x21, 0x20, 0x46, 0x34, 0xe7, 0x30, 0x22, 0x04, 0x21, + 0x48, 0x46, 0x30, 0xe7, 0x04, 0x22, 0x02, 0x21, 0x38, 0x46, 0x2c, 0xe7, + 0x01, 0x22, 0x00, 0x21, 0x20, 0x46, 0x28, 0xe7, 0xf8, 0xb5, 0xdf, 0xf8, + 0x94, 0x69, 0x04, 0x46, 0x30, 0x78, 0x00, 0x25, 0x00, 0x28, 0x5e, 0xd0, + 0x01, 0x21, 0x31, 0x72, 0x00, 0x20, 0xdf, 0xf8, 0x90, 0x79, 0x00, 0xf0, + 0x5a, 0xf8, 0x70, 0x78, 0x57, 0xf8, 0x20, 0x00, 0x00, 0x23, 0x40, 0x22, + 0x06, 0x21, 0xc0, 0x1d, 0xff, 0xf7, 0x11, 0xff, 0x70, 0x78, 0x57, 0xf8, + 0x20, 0x00, 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, 0xc0, 0x1d, 0xff, 0xf7, + 0x08, 0xff, 0x70, 0x78, 0x57, 0xf8, 0x20, 0x00, 0x01, 0x23, 0x10, 0x22, + 0x04, 0x21, 0xc0, 0x1d, 0xff, 0xf7, 0xff, 0xfe, 0xdf, 0xf8, 0x5c, 0x79, + 0x73, 0x78, 0x4f, 0xf4, 0xe0, 0x62, 0x00, 0xf0, 0xd0, 0xf8, 0x01, 0x23, + 0x4f, 0xf4, 0x00, 0x52, 0x0d, 0x21, 0x00, 0xf0, 0xcb, 0xf8, 0x01, 0x23, + 0x4f, 0xf4, 0x80, 0x42, 0x0e, 0x21, 0x00, 0xf0, 0xc5, 0xf8, 0x00, 0x20, + 0x00, 0x21, 0xc2, 0xb2, 0x40, 0x1c, 0x32, 0x44, 0xc3, 0xb2, 0x07, 0x2b, + 0x91, 0x77, 0xf8, 0xd9, 0x00, 0x27, 0xf8, 0xb2, 0x30, 0x44, 0xc0, 0x7a, + 0x01, 0x00, 0x13, 0xd0, 0x70, 0x72, 0xb7, 0x72, 0x21, 0x46, 0x00, 0xf0, + 0x41, 0xf8, 0x21, 0x46, 0x01, 0x20, 0x00, 0xf0, 0xb4, 0xf8, 0x00, 0xf0, + 0x2b, 0xf9, 0x05, 0x46, 0x21, 0x46, 0x00, 0x20, 0x00, 0xf0, 0x36, 0xf8, + 0x21, 0x46, 0x00, 0x20, 0x00, 0xf0, 0xa9, 0xf8, 0x7f, 0x1c, 0xf8, 0xb2, + 0x03, 0x28, 0xe2, 0xd3, 0x01, 0x20, 0x00, 0xf0, 0x02, 0xf8, 0x28, 0x46, + 0xf2, 0xbd, 0x38, 0xb5, 0x04, 0x00, 0x0c, 0xbf, 0x00, 0x21, 0x01, 0x21, + 0x08, 0x46, 0x00, 0x22, 0x00, 0xf0, 0xe6, 0xfb, 0x4f, 0xf4, 0x7a, 0x70, + 0x08, 0xf0, 0xa6, 0xfa, 0xc4, 0xb1, 0x00, 0x24, 0xdf, 0xf8, 0xa4, 0x58, + 0x69, 0x78, 0xe0, 0xb2, 0x88, 0x42, 0x05, 0xd1, 0x28, 0x78, 0x00, 0x28, + 0x1c, 0xbf, 0x28, 0x7a, 0x00, 0x28, 0x07, 0xd1, 0xe0, 0xb2, 0xff, 0xf7, + 0x06, 0xfb, 0x18, 0xb9, 0x00, 0x21, 0xe0, 0xb2, 0x00, 0xf0, 0xac, 0xfb, + 0x64, 0x1c, 0xe0, 0xb2, 0x08, 0x28, 0xe9, 0xd3, 0x00, 0x20, 0x32, 0xbd, + 0x2d, 0xe9, 0xf8, 0x4f, 0x00, 0x28, 0x81, 0x46, 0x8a, 0x46, 0xdf, 0xf8, + 0x84, 0x58, 0xdf, 0xf8, 0x84, 0x68, 0xdf, 0xf8, 0x84, 0x88, 0x4f, 0xf0, + 0x6c, 0x0b, 0x3d, 0xd0, 0x00, 0x27, 0x58, 0xf8, 0x27, 0x40, 0x0b, 0xfb, + 0x07, 0xf0, 0x50, 0x44, 0x10, 0xf0, 0x96, 0xf9, 0x10, 0xb3, 0x04, 0xf5, + 0x40, 0x74, 0x06, 0xf1, 0x08, 0x01, 0x20, 0x68, 0xc0, 0xf3, 0x03, 0x20, + 0x41, 0xf8, 0x27, 0x00, 0x06, 0xf1, 0x14, 0x01, 0x20, 0x68, 0xc0, 0xf3, + 0x01, 0x30, 0x41, 0xf8, 0x27, 0x00, 0x4b, 0x46, 0x4f, 0xf4, 0x70, 0x62, + 0x08, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x72, 0xfe, 0x01, 0x23, 0x4f, 0xf4, + 0x40, 0x52, 0x0c, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x6b, 0xfe, 0x30, 0x68, + 0x01, 0x21, 0xb9, 0x40, 0x08, 0x43, 0x30, 0x60, 0x00, 0x23, 0x28, 0x68, + 0x00, 0xf0, 0x07, 0x00, 0x70, 0x60, 0x00, 0xf0, 0x32, 0xf8, 0x00, 0xf0, + 0x2f, 0xf8, 0x00, 0x23, 0x00, 0xf0, 0x2d, 0xf8, 0x00, 0xf0, 0x2a, 0xf8, + 0x7f, 0x1c, 0x03, 0x2f, 0xc3, 0xdb, 0x0e, 0xe7, 0x00, 0x24, 0x58, 0xf8, + 0x24, 0x70, 0x73, 0x68, 0x00, 0xf0, 0x21, 0xf8, 0x0b, 0xfb, 0x04, 0xf0, + 0x50, 0x44, 0x10, 0xf0, 0x55, 0xf9, 0x90, 0xb1, 0x06, 0xf1, 0x08, 0x00, + 0x07, 0xf5, 0x40, 0x77, 0x50, 0xf8, 0x24, 0x30, 0x4f, 0xf4, 0x70, 0x62, + 0x00, 0xf0, 0x0d, 0xf8, 0x06, 0xf1, 0x14, 0x00, 0x4f, 0xf4, 0x40, 0x52, + 0x50, 0xf8, 0x24, 0x30, 0x0c, 0x21, 0x00, 0xf0, 0x05, 0xf8, 0x64, 0x1c, + 0x03, 0x2c, 0xde, 0xdb, 0xdb, 0xe7, 0x08, 0x21, 0x38, 0x46, 0x2d, 0xe6, + 0x33, 0x68, 0x07, 0x22, 0x00, 0x21, 0x28, 0x46, 0x28, 0xe6, 0x2d, 0xe9, + 0xf8, 0x43, 0x02, 0x46, 0x88, 0x46, 0x6c, 0x26, 0xdf, 0xf8, 0x9c, 0x97, + 0xdf, 0xf8, 0x9c, 0x47, 0xdf, 0xf8, 0x8c, 0x07, 0x52, 0xb3, 0x01, 0x68, + 0xc1, 0xf3, 0xc0, 0x01, 0x21, 0x60, 0x00, 0x23, 0x08, 0x22, 0x03, 0x21, + 0xff, 0xf7, 0x14, 0xfe, 0x00, 0x27, 0x00, 0xf0, 0x3c, 0xf8, 0xb8, 0xb1, + 0x05, 0xf5, 0x8e, 0x65, 0x21, 0x1d, 0x28, 0x68, 0xc0, 0xf3, 0x40, 0x60, + 0x41, 0xf8, 0x27, 0x00, 0x01, 0x23, 0x00, 0xf0, 0x37, 0xf8, 0x28, 0x68, + 0x04, 0xf1, 0x10, 0x01, 0xc0, 0xf3, 0x00, 0x60, 0x41, 0xf8, 0x27, 0x00, + 0x01, 0x23, 0x4f, 0xf0, 0x80, 0x72, 0x18, 0x21, 0x00, 0xf0, 0x2d, 0xf8, + 0x7f, 0x1c, 0x03, 0x2f, 0xe1, 0xdb, 0x00, 0x20, 0xbd, 0xe8, 0xf2, 0x83, + 0x23, 0x68, 0x08, 0x22, 0x03, 0x21, 0xff, 0xf7, 0xed, 0xfd, 0x00, 0x27, + 0x00, 0xf0, 0x15, 0xf8, 0x78, 0xb1, 0x20, 0x1d, 0x05, 0xf5, 0x8e, 0x65, + 0x50, 0xf8, 0x27, 0x30, 0x00, 0xf0, 0x14, 0xf8, 0x04, 0xf1, 0x10, 0x00, + 0x4f, 0xf0, 0x80, 0x72, 0x50, 0xf8, 0x27, 0x30, 0x18, 0x21, 0x00, 0xf0, + 0x0e, 0xf8, 0x7f, 0x1c, 0x03, 0x2f, 0xe9, 0xdb, 0xdf, 0xe7, 0x59, 0xf8, + 0x27, 0x50, 0x06, 0xfb, 0x07, 0xf0, 0x40, 0x44, 0x10, 0xf0, 0xda, 0xb8, + 0x4f, 0xf0, 0x00, 0x72, 0x19, 0x21, 0x28, 0x46, 0xc8, 0xe5, 0x38, 0xb5, + 0xdf, 0xf8, 0xd0, 0x26, 0x52, 0xf8, 0x20, 0x50, 0x00, 0x24, 0x39, 0xb1, + 0xad, 0x1d, 0x00, 0x23, 0x00, 0xf0, 0x0a, 0xf8, 0x01, 0x23, 0x00, 0xf0, + 0x07, 0xf8, 0x03, 0xe0, 0x15, 0xf8, 0x05, 0x4f, 0x04, 0xf0, 0x01, 0x04, + 0x20, 0x46, 0x32, 0xbd, 0x01, 0x22, 0x00, 0x21, 0x28, 0x46, 0xa6, 0xe5, + 0x2d, 0xe9, 0xf8, 0x43, 0x0f, 0xf2, 0x90, 0x71, 0xdf, 0xf8, 0x88, 0x56, + 0x84, 0xb0, 0xd1, 0xe9, 0x00, 0x23, 0x6e, 0x78, 0xdf, 0xf8, 0x8c, 0x96, + 0x02, 0xa8, 0x4f, 0xf0, 0x00, 0x08, 0xc0, 0xe9, 0x00, 0x23, 0x00, 0x27, + 0x07, 0xeb, 0x47, 0x00, 0xa9, 0x7a, 0x28, 0x44, 0x01, 0x44, 0xf8, 0xb2, + 0x81, 0xf8, 0x26, 0x80, 0x59, 0xf8, 0x27, 0x40, 0xff, 0xf7, 0xed, 0xf9, + 0x08, 0xb9, 0xb7, 0x42, 0x0e, 0xd1, 0x05, 0xf1, 0x0e, 0x00, 0xc3, 0x5d, + 0xff, 0x2b, 0x08, 0xbf, 0x01, 0x20, 0x07, 0xd0, 0x00, 0x21, 0x0d, 0xf8, + 0x07, 0x10, 0x07, 0x22, 0xe0, 0x1d, 0xff, 0xf7, 0x78, 0xfd, 0x01, 0xe0, + 0x0d, 0xf8, 0x07, 0x00, 0x7f, 0x1c, 0x08, 0x2f, 0xdc, 0xd3, 0x0d, 0xf8, + 0x06, 0x80, 0x05, 0xf1, 0x0e, 0x01, 0x8a, 0x5d, 0xff, 0x2a, 0x04, 0xd1, + 0x59, 0xf8, 0x26, 0x00, 0x00, 0x23, 0x00, 0xf0, 0xce, 0xf8, 0x00, 0x24, + 0x00, 0x26, 0x1d, 0xf8, 0x06, 0x00, 0x20, 0xb1, 0x59, 0xf8, 0x26, 0x00, + 0xe3, 0xb2, 0x00, 0xf0, 0xc4, 0xf8, 0x76, 0x1c, 0x08, 0x2e, 0xf4, 0xd3, + 0x01, 0x20, 0xff, 0xf7, 0x96, 0xfe, 0x00, 0x26, 0xf0, 0xb2, 0x1d, 0xf8, + 0x00, 0x00, 0x18, 0xb1, 0x01, 0x21, 0xf0, 0xb2, 0xff, 0xf7, 0x8d, 0xff, + 0x76, 0x1c, 0xf0, 0xb2, 0x08, 0x28, 0xf3, 0xd3, 0x68, 0x68, 0x08, 0xf0, + 0x39, 0xf9, 0x00, 0x26, 0x1d, 0xf8, 0x06, 0x00, 0xb8, 0xb1, 0x00, 0x21, + 0xf0, 0xb2, 0xff, 0xf7, 0x7e, 0xff, 0x06, 0xeb, 0x46, 0x01, 0xaa, 0x7a, + 0x29, 0x44, 0x11, 0x44, 0x00, 0xf0, 0x01, 0x00, 0x91, 0xf8, 0x26, 0x30, + 0xa0, 0x40, 0x03, 0x43, 0x81, 0xf8, 0x26, 0x30, 0x05, 0xf1, 0x1e, 0x01, + 0x05, 0xf1, 0x1e, 0x03, 0x8a, 0x5d, 0x10, 0x43, 0x98, 0x55, 0x76, 0x1c, + 0x08, 0x2e, 0xe1, 0xd3, 0x00, 0x20, 0xff, 0xf7, 0x64, 0xfe, 0x64, 0x1c, + 0xe0, 0xb2, 0x05, 0x28, 0xba, 0xd3, 0x00, 0x21, 0xdf, 0xf8, 0xac, 0x45, + 0x1d, 0xf8, 0x01, 0x00, 0x38, 0xb1, 0x05, 0xf1, 0x1e, 0x02, 0x50, 0x5c, + 0x14, 0xf8, 0x10, 0x30, 0x05, 0xf1, 0x16, 0x02, 0x53, 0x54, 0x49, 0x1c, + 0x08, 0x29, 0xf1, 0xd3, 0x00, 0x27, 0x1d, 0xf8, 0x07, 0x00, 0x00, 0x28, + 0x6a, 0xd0, 0x05, 0xf1, 0x1e, 0x01, 0xc8, 0x5d, 0x00, 0x28, 0x18, 0xbf, + 0x1f, 0x28, 0x56, 0xd1, 0x00, 0x21, 0x4f, 0xf0, 0x7f, 0x0c, 0xff, 0x22, + 0xff, 0x23, 0x78, 0x1c, 0x0e, 0xe0, 0x05, 0xf1, 0x1e, 0x00, 0x10, 0xf8, + 0x0e, 0x00, 0x00, 0x28, 0x18, 0xbf, 0x1f, 0x28, 0x04, 0xd0, 0xae, 0xeb, + 0x07, 0x02, 0x71, 0x46, 0x4f, 0xf0, 0x08, 0x0e, 0x0e, 0xf1, 0x01, 0x00, + 0x4f, 0xfa, 0x80, 0xfe, 0xbe, 0xf1, 0x08, 0x0f, 0xeb, 0xdb, 0x78, 0x1e, + 0x0e, 0xe0, 0x05, 0xf1, 0x1e, 0x00, 0x10, 0xf8, 0x0e, 0x00, 0x00, 0x28, + 0x18, 0xbf, 0x1f, 0x28, 0x04, 0xd0, 0xa7, 0xeb, 0x0e, 0x03, 0xf4, 0x46, + 0x4f, 0xf0, 0xff, 0x3e, 0xae, 0xf1, 0x01, 0x00, 0x4f, 0xfa, 0x80, 0xfe, + 0xbe, 0xf1, 0x00, 0x0f, 0xeb, 0xd5, 0xd8, 0xb2, 0xff, 0x28, 0x0e, 0xd0, + 0xd0, 0xb2, 0xde, 0xb2, 0xb0, 0x42, 0x0a, 0xd1, 0x05, 0xf1, 0x1e, 0x02, + 0x05, 0xf1, 0x1e, 0x03, 0x51, 0x5c, 0x13, 0xf8, 0x0c, 0x00, 0x01, 0x43, + 0x14, 0xf8, 0x11, 0x00, 0x10, 0xe0, 0xd8, 0xb2, 0xd6, 0xb2, 0xb0, 0x42, + 0x04, 0xd2, 0x05, 0xf1, 0x16, 0x00, 0x10, 0xf8, 0x0c, 0x00, 0x07, 0xe0, + 0xd2, 0xb2, 0xdb, 0xb2, 0x9a, 0x42, 0x3a, 0xbf, 0x05, 0xf1, 0x16, 0x02, + 0x50, 0x5c, 0xff, 0x20, 0x05, 0xf1, 0x16, 0x01, 0xc8, 0x55, 0x05, 0xf1, + 0x16, 0x00, 0xc3, 0x5d, 0xff, 0x2b, 0x03, 0xd1, 0x02, 0xa8, 0x4b, 0xf6, + 0x17, 0x08, 0xc3, 0x5d, 0x59, 0xf8, 0x27, 0x00, 0x00, 0xf0, 0x07, 0xf8, + 0x7f, 0x1c, 0x08, 0x2f, 0x8d, 0xd3, 0x40, 0x46, 0x05, 0xb0, 0xbd, 0xe8, + 0xf0, 0x83, 0x07, 0x22, 0x00, 0x21, 0xc0, 0x1d, 0x93, 0xe4, 0x7c, 0xb5, + 0x04, 0x46, 0xdf, 0xf8, 0x84, 0x04, 0xdf, 0xf8, 0x94, 0x24, 0x05, 0x68, + 0x45, 0xf4, 0x00, 0x46, 0x25, 0xf4, 0x00, 0x45, 0x01, 0x95, 0x00, 0x96, + 0x23, 0x46, 0xff, 0x21, 0x03, 0x20, 0xfd, 0xf7, 0xa8, 0xfe, 0x00, 0x23, + 0x32, 0x46, 0x29, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x02, 0xf8, 0x00, 0x20, + 0x76, 0xbd, 0x30, 0xb4, 0x00, 0x28, 0x09, 0xd1, 0xef, 0xf3, 0x10, 0x84, + 0x72, 0xb6, 0xdf, 0xf8, 0x48, 0x54, 0x2a, 0x60, 0x29, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x1a, 0xe0, 0x01, 0x28, 0x0a, 0xd1, 0xef, 0xf3, 0x10, 0x84, + 0x72, 0xb6, 0xdf, 0xf8, 0x30, 0x54, 0x2a, 0x60, 0x00, 0xbf, 0x29, 0x60, + 0x84, 0xf3, 0x10, 0x88, 0x0d, 0xe0, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0xdf, 0xf8, 0x18, 0x54, 0x2a, 0x60, 0x00, 0x28, 0x02, 0xd0, 0x40, 0x1e, + 0x00, 0xbf, 0xfa, 0xe7, 0x29, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbc, + 0x70, 0x47, 0xdf, 0xf8, 0xe4, 0x03, 0x70, 0x47, 0x38, 0xb5, 0x00, 0xf0, + 0x44, 0xf8, 0x10, 0xb9, 0x4b, 0xf6, 0x15, 0x04, 0x10, 0xe0, 0xdf, 0xf8, + 0xe0, 0x03, 0x29, 0x78, 0x50, 0xf8, 0x21, 0x00, 0x81, 0x1c, 0xc0, 0x1c, + 0x0a, 0x78, 0x02, 0xf0, 0x07, 0x02, 0x6a, 0x70, 0x00, 0x78, 0xa8, 0x70, + 0x08, 0x78, 0xc0, 0xf3, 0x02, 0x10, 0xe8, 0x70, 0x20, 0x46, 0x32, 0xbd, + 0xf8, 0xb5, 0x00, 0xf0, 0x2a, 0xf8, 0x10, 0xb9, 0x4b, 0xf6, 0x15, 0x04, + 0x23, 0xe0, 0x6b, 0x78, 0x03, 0x2b, 0x05, 0xdc, 0xa8, 0x78, 0x03, 0x28, + 0x02, 0xda, 0xe8, 0x78, 0x04, 0x28, 0x02, 0xdd, 0x4b, 0xf6, 0x16, 0x04, + 0x17, 0xe0, 0xdf, 0xf8, 0x94, 0x03, 0x29, 0x78, 0x50, 0xf8, 0x21, 0x60, + 0xb7, 0x1c, 0x07, 0x22, 0x00, 0xf0, 0x16, 0xf8, 0xab, 0x78, 0xff, 0x22, + 0x00, 0x21, 0xf0, 0x1c, 0xff, 0xf7, 0x11, 0xfc, 0xeb, 0x78, 0x70, 0x22, + 0x04, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x0b, 0xfc, 0x30, 0x46, 0x00, 0xf0, + 0x0b, 0xf8, 0x20, 0x46, 0xf2, 0xbd, 0x05, 0x46, 0x00, 0x24, 0x28, 0x78, + 0xff, 0xf7, 0x65, 0xb8, 0x00, 0x21, 0x38, 0x46, 0xff, 0xf7, 0xfd, 0xbb, + 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, 0x82, 0xb0, 0x81, 0x46, + 0x08, 0xf0, 0x1b, 0xfa, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, + 0xdf, 0xed, 0xc8, 0x0a, 0xb3, 0xee, 0x09, 0x1a, 0x00, 0xee, 0x20, 0x1a, + 0xb6, 0xee, 0x00, 0x0a, 0x31, 0xee, 0x00, 0x0a, 0x09, 0xf1, 0x20, 0x0a, + 0xbc, 0xee, 0xc0, 0x8a, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x50, 0x46, + 0xff, 0xf7, 0xdd, 0xfb, 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x32, 0x00, + 0xff, 0xf7, 0xd2, 0xfb, 0x06, 0x46, 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, + 0x31, 0x00, 0xff, 0xf7, 0xcb, 0xfb, 0x0f, 0x22, 0x00, 0x21, 0x40, 0xea, + 0x06, 0x20, 0xb0, 0xfa, 0x80, 0xf5, 0x09, 0xf1, 0x36, 0x00, 0xff, 0xf7, + 0xc1, 0xfb, 0x06, 0x46, 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x35, 0x00, + 0xff, 0xf7, 0xba, 0xfb, 0xff, 0x22, 0x00, 0x21, 0x40, 0xea, 0x06, 0x20, + 0xb0, 0xfa, 0x80, 0xf7, 0x09, 0xf1, 0x39, 0x00, 0xff, 0xf7, 0xb0, 0xfb, + 0xff, 0x22, 0x00, 0x21, 0xc5, 0xf1, 0x20, 0x05, 0xc7, 0xf1, 0x20, 0x07, + 0xb0, 0xfa, 0x80, 0xf6, 0x09, 0xf1, 0x34, 0x00, 0xff, 0xf7, 0xa4, 0xfb, + 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x33, 0x00, 0xff, 0xf7, 0x9e, 0xfb, + 0x83, 0x46, 0x0f, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x38, 0x00, 0xff, 0xf7, + 0x97, 0xfb, 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x37, 0x00, 0xff, 0xf7, + 0x91, 0xfb, 0x80, 0x46, 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x3a, 0x00, + 0xff, 0xf7, 0x8a, 0xfb, 0xc6, 0xf1, 0x20, 0x06, 0x04, 0x46, 0x79, 0x19, + 0x71, 0x18, 0x18, 0xee, 0x10, 0x0a, 0x02, 0xe0, 0x76, 0x1c, 0x79, 0x19, + 0x71, 0x18, 0x81, 0x42, 0x09, 0xd2, 0x10, 0x2d, 0x38, 0xbf, 0x6d, 0x1c, + 0xf7, 0xd3, 0x08, 0x2f, 0x38, 0xbf, 0x7f, 0x1c, 0xf3, 0xd3, 0x06, 0x2e, + 0xf0, 0xd3, 0x58, 0x46, 0x00, 0xf0, 0x69, 0xf8, 0x8d, 0xf8, 0x00, 0x00, + 0x40, 0x46, 0x00, 0xf0, 0x64, 0xf8, 0x83, 0x46, 0x20, 0x46, 0x00, 0xf0, + 0x60, 0xf8, 0x80, 0x46, 0x01, 0x24, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, + 0x50, 0x46, 0x04, 0xfa, 0x05, 0xf5, 0xff, 0xf7, 0x62, 0xfb, 0x6d, 0x1e, + 0x2b, 0x04, 0x1b, 0x0e, 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x12, 0x00, + 0xff, 0xf7, 0x59, 0xfb, 0xeb, 0xb2, 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, + 0x11, 0x00, 0x04, 0xfa, 0x07, 0xf7, 0xff, 0xf7, 0x50, 0xfb, 0x7f, 0x1e, + 0x3b, 0x04, 0x1b, 0x0e, 0x0f, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x16, 0x00, + 0xff, 0xf7, 0x47, 0xfb, 0xfb, 0xb2, 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, + 0x15, 0x00, 0xff, 0xf7, 0x40, 0xfb, 0x04, 0xfa, 0x06, 0xf6, 0x76, 0x1e, + 0xf3, 0xb2, 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x19, 0x00, 0xff, 0xf7, + 0x36, 0xfb, 0x00, 0x23, 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x14, 0x00, + 0xff, 0xf7, 0x2f, 0xfb, 0x9d, 0xf8, 0x00, 0x30, 0xff, 0x22, 0x00, 0x21, + 0x09, 0xf1, 0x13, 0x00, 0xff, 0xf7, 0x27, 0xfb, 0x00, 0x23, 0x0f, 0x22, + 0x00, 0x21, 0x09, 0xf1, 0x18, 0x00, 0xff, 0xf7, 0x20, 0xfb, 0x5b, 0x46, + 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x17, 0x00, 0xff, 0xf7, 0x19, 0xfb, + 0x02, 0xb0, 0x43, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0x09, 0xf1, 0x1a, 0x00, + 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, 0xff, 0x22, 0x00, 0x21, 0xff, 0xf7, + 0x0c, 0xbb, 0x70, 0xb5, 0x01, 0x46, 0x00, 0x20, 0x00, 0x22, 0x54, 0x00, + 0x01, 0x23, 0x64, 0x1c, 0x03, 0xfa, 0x04, 0xf4, 0x55, 0x00, 0xab, 0x40, + 0x21, 0xfa, 0x02, 0xf5, 0xee, 0x07, 0x02, 0xd5, 0x23, 0x43, 0x18, 0x43, + 0x03, 0xe0, 0xe4, 0x43, 0x24, 0xea, 0x03, 0x03, 0x18, 0x40, 0x52, 0x1c, + 0x04, 0x2a, 0xea, 0xd3, 0xc0, 0xb2, 0x70, 0xbd, 0x70, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x11, 0xf0, 0x67, 0xf8, 0x06, 0x68, 0x17, 0x20, 0x10, 0xf0, + 0x63, 0xfa, 0x36, 0x0c, 0x01, 0x28, 0x06, 0xf0, 0x01, 0x06, 0x0b, 0xd1, + 0x20, 0x46, 0xfe, 0xf7, 0x44, 0xff, 0x06, 0x43, 0x06, 0xd0, 0x29, 0x46, + 0x20, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x4b, 0x4a, 0xfb, 0xf7, 0x47, 0xba, + 0x29, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0xfb, 0xf7, 0xa4, 0xb9, + 0x2d, 0xe9, 0xf0, 0x41, 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0xfc, 0xf7, + 0x0e, 0xfc, 0x01, 0x28, 0x26, 0xd1, 0x00, 0x27, 0xdf, 0xf8, 0xd0, 0x80, + 0x01, 0x2e, 0x05, 0xd1, 0x08, 0xf1, 0x3e, 0x02, 0x01, 0x21, 0xf8, 0xb2, + 0xfb, 0xf7, 0xa7, 0xf9, 0xf8, 0xb2, 0xfe, 0xf7, 0x1e, 0xff, 0x00, 0x28, + 0x0c, 0xbf, 0x21, 0x46, 0x29, 0x46, 0xf8, 0xb2, 0xff, 0xf7, 0xc2, 0xff, + 0x7f, 0x1c, 0xf8, 0xb2, 0x08, 0x28, 0xe9, 0xd3, 0x17, 0x20, 0x10, 0xf0, + 0x27, 0xfa, 0x02, 0x46, 0x08, 0xf1, 0x3e, 0x01, 0x28, 0x46, 0xfb, 0xf7, + 0xd9, 0xf9, 0x01, 0x2d, 0x02, 0xd1, 0xbd, 0xe8, 0xf0, 0x41, 0x01, 0xe0, + 0xbd, 0xe8, 0xf0, 0x81, 0x2d, 0xe9, 0xf0, 0x41, 0x17, 0x20, 0x10, 0xf0, + 0x15, 0xfa, 0x04, 0x46, 0x00, 0x27, 0x2b, 0x4d, 0xdf, 0xf8, 0x80, 0x80, + 0xf8, 0xb2, 0xfe, 0xf7, 0xf6, 0xfe, 0x01, 0x28, 0x06, 0xd1, 0x00, 0xf0, + 0x5f, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0x57, 0xf8, 0x00, 0xf0, 0x4e, 0xf8, + 0x7f, 0x1c, 0x08, 0x2f, 0xf0, 0xd3, 0x23, 0x4f, 0x01, 0x20, 0x07, 0xf0, + 0x75, 0xfe, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x20, 0x48, 0xff, 0xf7, + 0x7c, 0xfa, 0x00, 0x23, 0x01, 0x22, 0xff, 0xf7, 0x77, 0xfe, 0x38, 0x78, + 0x00, 0xf0, 0x3b, 0xf8, 0x00, 0x27, 0xf8, 0xb2, 0xfe, 0xf7, 0xd5, 0xfe, + 0x01, 0x28, 0x09, 0xd0, 0x00, 0xf0, 0x3e, 0xf8, 0x0c, 0xb1, 0x00, 0x23, + 0x00, 0xe0, 0x01, 0x23, 0x00, 0xf0, 0x33, 0xf8, 0x00, 0xf0, 0x2a, 0xf8, + 0x7f, 0x1c, 0x08, 0x2f, 0xed, 0xd3, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x00, + 0xcd, 0xcc, 0xcc, 0x3d, 0xd8, 0x46, 0x00, 0x21, 0x3d, 0x09, 0x00, 0x47, + 0x00, 0x80, 0x07, 0x48, 0x38, 0x76, 0x02, 0x21, 0x20, 0x9a, 0x04, 0x02, + 0x25, 0x40, 0x07, 0x48, 0x03, 0x80, 0x07, 0x48, 0x10, 0x06, 0x00, 0x48, + 0xf4, 0x73, 0x02, 0x21, 0x8c, 0x9e, 0x04, 0x02, 0xac, 0x74, 0x02, 0x21, + 0x70, 0x47, 0x00, 0x21, 0xcc, 0x1e, 0x00, 0x02, 0x16, 0x47, 0x00, 0x21, + 0x41, 0x76, 0x02, 0x21, 0x00, 0x40, 0x07, 0x48, 0x01, 0x40, 0x07, 0x48, + 0x30, 0x78, 0x29, 0x78, 0x00, 0xf0, 0x01, 0x00, 0x40, 0x18, 0x28, 0x70, + 0x70, 0x47, 0x01, 0x22, 0x00, 0x21, 0x30, 0x46, 0xff, 0xf7, 0x2f, 0xba, + 0x58, 0xf8, 0x27, 0x60, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x70, 0x1c, + 0xff, 0xf7, 0x27, 0xba, 0x2d, 0xe9, 0xf8, 0x43, 0x07, 0x46, 0x0e, 0x46, + 0xfc, 0xf7, 0x65, 0xfb, 0x00, 0x25, 0x01, 0x28, 0x3d, 0xd1, 0xa8, 0x46, + 0x00, 0x24, 0x4f, 0xf0, 0x01, 0x09, 0xe0, 0xb2, 0xfe, 0xf7, 0x7b, 0xfe, + 0x01, 0x28, 0x05, 0xd1, 0x09, 0xfa, 0x04, 0xf0, 0x40, 0xea, 0x08, 0x00, + 0x5f, 0xfa, 0x80, 0xf8, 0x64, 0x1c, 0xe0, 0xb2, 0x08, 0x28, 0xf0, 0xd3, + 0xff, 0x2f, 0x18, 0xbf, 0x47, 0x45, 0x0c, 0xd1, 0x30, 0x00, 0x02, 0xd1, + 0x00, 0x22, 0x00, 0x21, 0x03, 0xe0, 0x01, 0x2e, 0x1f, 0xd1, 0x00, 0x22, + 0x01, 0x21, 0x00, 0x20, 0xff, 0xf7, 0x2a, 0xff, 0x1a, 0xe0, 0x00, 0x24, + 0x28, 0xfa, 0x04, 0xf0, 0xc0, 0x07, 0x0f, 0xd5, 0x09, 0xfa, 0x04, 0xf0, + 0x07, 0x42, 0x0b, 0xd0, 0x30, 0x00, 0x03, 0xd0, 0x01, 0x2e, 0x06, 0xd1, + 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0xe0, 0xb2, 0xff, 0xf7, 0xf6, 0xfe, + 0x00, 0xe0, 0x01, 0x25, 0x64, 0x1c, 0xe0, 0xb2, 0x08, 0x28, 0xe7, 0xd3, + 0x00, 0xe0, 0x01, 0x25, 0x28, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x80, 0xb5, 0x11, 0xf0, + 0xb3, 0xfd, 0x00, 0x20, 0x02, 0xbd, 0x38, 0xb5, 0x04, 0x46, 0x04, 0xf1, + 0x34, 0x05, 0x01, 0x20, 0xa8, 0x70, 0x39, 0xb1, 0x08, 0x68, 0x20, 0x60, + 0x8a, 0x68, 0xea, 0x60, 0x48, 0x68, 0x68, 0x60, 0xc9, 0x68, 0xa9, 0x60, + 0x00, 0x20, 0x28, 0x70, 0x00, 0x21, 0xe8, 0x68, 0x69, 0x70, 0x00, 0x22, + 0x02, 0x60, 0x00, 0x20, 0xea, 0x68, 0x51, 0x60, 0xe9, 0x68, 0x88, 0x60, + 0xe9, 0x68, 0xc8, 0x60, 0xe9, 0x68, 0x08, 0x61, 0xdf, 0xf8, 0xa8, 0x0b, + 0xa2, 0x68, 0x40, 0xf8, 0x22, 0x40, 0xe1, 0x68, 0x20, 0x69, 0xee, 0xf7, + 0x65, 0xfa, 0xe9, 0x69, 0x60, 0x69, 0xee, 0xf7, 0x66, 0xfa, 0x22, 0x6a, + 0xe1, 0x69, 0xa0, 0x69, 0xee, 0xf7, 0x64, 0xfa, 0xa1, 0x6a, 0x60, 0x6a, + 0xee, 0xf7, 0x66, 0xfa, 0x02, 0x20, 0xa8, 0x70, 0x00, 0x20, 0x32, 0xbd, + 0x2d, 0xe9, 0xf0, 0x4f, 0xcd, 0xb0, 0x04, 0x46, 0x00, 0x20, 0x94, 0xf8, + 0x34, 0x10, 0x01, 0x29, 0x04, 0xd1, 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, + 0xba, 0xff, 0x73, 0xe2, 0x02, 0x29, 0x04, 0xf1, 0x34, 0x06, 0x40, 0xf0, + 0x60, 0x82, 0x02, 0x90, 0x62, 0x68, 0x8d, 0xf8, 0x04, 0x20, 0x71, 0x68, + 0x03, 0x91, 0x01, 0xf5, 0x80, 0x71, 0x04, 0x91, 0xd6, 0xf8, 0x08, 0xb0, + 0x9b, 0xf8, 0x15, 0x00, 0x77, 0x78, 0x00, 0x28, 0x0b, 0xf5, 0x16, 0x78, + 0x00, 0xf0, 0x49, 0x82, 0x03, 0x98, 0x05, 0x68, 0x04, 0x21, 0xb1, 0x70, + 0x03, 0x98, 0x00, 0xf1, 0x77, 0x01, 0x06, 0x91, 0x02, 0xa9, 0x06, 0x98, + 0x40, 0x78, 0xee, 0xf7, 0x9b, 0xfb, 0x0b, 0xf2, 0x42, 0x21, 0x01, 0x2f, + 0x18, 0xbf, 0x02, 0x2f, 0x48, 0x82, 0x34, 0xd1, 0x70, 0x68, 0x00, 0xf1, + 0xb8, 0x09, 0x4f, 0xf0, 0x00, 0x0a, 0x09, 0xeb, 0x0a, 0x00, 0x01, 0x78, + 0x00, 0x29, 0x1e, 0xbf, 0x09, 0xeb, 0x0a, 0x01, 0x8a, 0x7a, 0x00, 0x2a, + 0x17, 0xd0, 0x00, 0x21, 0x01, 0xe0, 0x52, 0x08, 0x49, 0x1c, 0xd3, 0x07, + 0xfb, 0xd5, 0x09, 0xf1, 0x14, 0x02, 0x09, 0xeb, 0x0a, 0x0e, 0x12, 0xf8, + 0x0a, 0x30, 0xd4, 0xf8, 0x00, 0xc0, 0x00, 0x78, 0x9e, 0xf8, 0x0a, 0x20, + 0xc9, 0xb2, 0x60, 0x44, 0xfb, 0xf7, 0x49, 0xfc, 0x01, 0x20, 0xee, 0xf7, + 0x0d, 0xfa, 0x0a, 0xf1, 0x01, 0x0a, 0xba, 0xf1, 0x0a, 0x0f, 0xd8, 0xd3, + 0x68, 0x06, 0x04, 0xd5, 0x9d, 0xf8, 0x04, 0x00, 0x10, 0x21, 0xfb, 0xf7, + 0x16, 0xfc, 0x01, 0x2f, 0x01, 0xd0, 0x03, 0x2f, 0x32, 0xd1, 0x9d, 0xf8, + 0x04, 0x00, 0xfb, 0xf7, 0xfb, 0xfc, 0xfc, 0x21, 0x0b, 0xf5, 0xac, 0x70, + 0x00, 0xf0, 0xca, 0xff, 0xb0, 0x68, 0x90, 0xf9, 0xde, 0x94, 0x4f, 0xf4, + 0x79, 0x71, 0x00, 0xf5, 0x16, 0x70, 0x00, 0xf0, 0xc1, 0xff, 0xb0, 0x68, + 0x80, 0xf8, 0xde, 0x94, 0x00, 0x20, 0x04, 0x99, 0x01, 0xf1, 0x2f, 0x02, + 0x00, 0x92, 0x08, 0xeb, 0x00, 0x01, 0x01, 0xf2, 0x13, 0x21, 0x3f, 0x22, + 0xca, 0x71, 0x00, 0x23, 0x4b, 0x72, 0x40, 0x1c, 0x00, 0x9a, 0x13, 0x7d, + 0x0b, 0x70, 0x01, 0x28, 0x00, 0x9a, 0xd3, 0x7c, 0x0b, 0x71, 0xee, 0xd9, + 0x6f, 0xf0, 0xc7, 0x00, 0xa8, 0xf8, 0xe6, 0x02, 0x00, 0x21, 0xb0, 0x68, + 0x80, 0xf8, 0xdc, 0x14, 0xe9, 0x06, 0x03, 0x98, 0x00, 0xf1, 0x56, 0x09, + 0x2a, 0xd4, 0x01, 0x2f, 0x1c, 0xbf, 0x17, 0x2f, 0x06, 0x2f, 0x25, 0xd1, + 0x28, 0x06, 0x0f, 0xd5, 0x9b, 0xf8, 0x15, 0x10, 0x02, 0x29, 0x0c, 0xbf, + 0x01, 0x21, 0x00, 0x21, 0x01, 0x22, 0x20, 0x46, 0x10, 0xf0, 0xf9, 0xff, + 0x20, 0x46, 0x11, 0xf0, 0xf9, 0xf8, 0x01, 0x20, 0xee, 0xf7, 0xae, 0xf9, + 0x06, 0x99, 0x0d, 0xf1, 0x06, 0x00, 0x00, 0x90, 0x05, 0xab, 0x0a, 0x78, + 0x99, 0xf9, 0x20, 0x10, 0x9d, 0xf8, 0x04, 0x00, 0x12, 0xf0, 0x36, 0xf8, + 0x9d, 0xf8, 0x07, 0x00, 0x0b, 0xf5, 0xa9, 0x71, 0x08, 0x72, 0x9d, 0xf8, + 0x15, 0x00, 0x48, 0x72, 0x00, 0xf0, 0x54, 0xfc, 0x02, 0xd1, 0xe9, 0x07, + 0x28, 0xd4, 0x03, 0xe0, 0x01, 0x28, 0x25, 0xd1, 0xe9, 0x05, 0x23, 0xd4, + 0x01, 0x2f, 0x18, 0xbf, 0x04, 0x2f, 0x1f, 0xd1, 0x02, 0x28, 0x0b, 0xf1, + 0x18, 0x00, 0x00, 0x90, 0x0c, 0xbf, 0x01, 0x21, 0x00, 0x21, 0x03, 0x9a, + 0x9d, 0xf8, 0x04, 0x00, 0x00, 0x23, 0x10, 0x32, 0x12, 0xf0, 0xcc, 0xfa, + 0x00, 0xf0, 0x3e, 0xfe, 0x08, 0xf1, 0x78, 0x01, 0x0b, 0xf1, 0x64, 0x00, + 0xee, 0xf7, 0xbd, 0xfb, 0x0b, 0xf1, 0x60, 0x00, 0x08, 0xf1, 0x81, 0x03, + 0x81, 0x78, 0x00, 0x78, 0x08, 0xf1, 0x80, 0x02, 0x10, 0x70, 0x19, 0x70, + 0x05, 0xf0, 0x0a, 0x00, 0x02, 0x28, 0x00, 0xf0, 0x8f, 0x80, 0x17, 0x2f, + 0x1c, 0xbf, 0x01, 0x2f, 0x05, 0x2f, 0x1e, 0xd1, 0x00, 0xf0, 0x1c, 0xfc, + 0x10, 0xd1, 0x28, 0x07, 0x0e, 0xd5, 0x03, 0x99, 0x9d, 0xf8, 0x04, 0x00, + 0x01, 0xf1, 0x31, 0x0a, 0x9a, 0xf9, 0x06, 0x10, 0xee, 0xf7, 0xc6, 0xf9, + 0x9a, 0xf8, 0x00, 0x10, 0x9d, 0xf8, 0x04, 0x00, 0xfb, 0xf7, 0xc6, 0xfa, + 0xa8, 0x07, 0x03, 0xd4, 0x9b, 0xf8, 0x15, 0x10, 0x02, 0x29, 0x05, 0xd0, + 0xa8, 0x05, 0x6d, 0xd4, 0x9b, 0xf8, 0x15, 0x10, 0x01, 0x29, 0x69, 0xd1, + 0x0b, 0xf2, 0x42, 0x20, 0xb0, 0xf9, 0x12, 0xa0, 0xa0, 0xf8, 0x00, 0xa0, + 0x0b, 0xf5, 0x11, 0x70, 0x03, 0x99, 0x00, 0x90, 0x01, 0xf1, 0xdc, 0x02, + 0xb9, 0xf9, 0x00, 0x30, 0x00, 0xf0, 0xe5, 0xfb, 0x0b, 0xf2, 0x46, 0x20, + 0x00, 0x90, 0x64, 0x21, 0x03, 0x98, 0xb9, 0xf9, 0x02, 0x30, 0x00, 0xf1, + 0xe2, 0x02, 0x00, 0xf0, 0xdb, 0xfb, 0x0b, 0xf5, 0x12, 0x70, 0x00, 0x90, + 0x64, 0x21, 0x03, 0x98, 0x99, 0xf9, 0x04, 0x30, 0x00, 0xf1, 0xe8, 0x02, + 0x00, 0xf0, 0xd0, 0xfb, 0x0b, 0xf2, 0x4a, 0x20, 0x00, 0x90, 0x64, 0x21, + 0x03, 0x98, 0x99, 0xf8, 0x05, 0x30, 0x00, 0xf1, 0xee, 0x02, 0x00, 0xf0, + 0xc5, 0xfb, 0x06, 0x99, 0x0b, 0xf5, 0x13, 0x70, 0x00, 0x90, 0x50, 0x46, + 0xcb, 0x7a, 0x03, 0x99, 0x01, 0xf1, 0xf4, 0x02, 0x64, 0x21, 0xee, 0xf7, + 0x61, 0xfb, 0x0b, 0xf2, 0x4e, 0x20, 0x03, 0x99, 0x00, 0x90, 0x01, 0xf1, + 0xfa, 0x02, 0x32, 0x23, 0x00, 0xf0, 0xaf, 0xfb, 0x0b, 0xf5, 0x14, 0x70, + 0x03, 0x99, 0x00, 0x90, 0x01, 0xf1, 0x88, 0x02, 0x0a, 0x23, 0x0a, 0x21, + 0x00, 0xf0, 0xa6, 0xfb, 0x0b, 0xf2, 0x52, 0x20, 0x03, 0x99, 0x00, 0x90, + 0x01, 0xf1, 0x8e, 0x02, 0x4f, 0xf4, 0xfa, 0x43, 0x0a, 0x21, 0x00, 0xf0, + 0x9b, 0xfb, 0x03, 0x98, 0xc1, 0x68, 0x8b, 0xf8, 0x52, 0x11, 0x17, 0x2f, + 0xb3, 0x69, 0x72, 0x69, 0x0c, 0xbf, 0x01, 0x21, 0x00, 0x21, 0x20, 0x46, + 0x11, 0xf0, 0xf8, 0xfb, 0x00, 0xf0, 0x9a, 0xfd, 0x00, 0xf0, 0x92, 0xfb, + 0x18, 0xd1, 0x04, 0x98, 0x01, 0x68, 0x0a, 0x05, 0x17, 0xd4, 0x00, 0x21, + 0x00, 0xf8, 0x8c, 0x1f, 0x41, 0x70, 0x9d, 0xf8, 0x04, 0x00, 0xfb, 0xf7, + 0xf6, 0xf9, 0x00, 0x21, 0x00, 0x22, 0x00, 0x28, 0x02, 0xd5, 0x40, 0x42, + 0x02, 0x46, 0x01, 0xe0, 0xc8, 0xbf, 0x01, 0x46, 0x08, 0xf5, 0x46, 0x70, + 0x01, 0x70, 0x42, 0x70, 0x00, 0xf0, 0x76, 0xfb, 0x05, 0xd1, 0x68, 0x07, + 0x00, 0xf1, 0xac, 0x80, 0x01, 0x2f, 0x18, 0xbf, 0x07, 0x2f, 0x40, 0xf0, + 0xa7, 0x80, 0x01, 0x20, 0x8b, 0xf8, 0x14, 0x00, 0x01, 0x22, 0x00, 0xf0, + 0x62, 0xfb, 0x00, 0xf0, 0x6b, 0xfd, 0x03, 0x98, 0x41, 0x68, 0x04, 0x98, + 0x02, 0x68, 0x06, 0x92, 0x0d, 0x0c, 0xb2, 0x68, 0x92, 0xf9, 0xde, 0x04, + 0x01, 0xf0, 0x0f, 0x07, 0x05, 0xf0, 0x0f, 0x05, 0x00, 0x28, 0x02, 0xbf, + 0x0a, 0x2f, 0x03, 0x27, 0x02, 0x25, 0x08, 0x0a, 0x00, 0xf0, 0x0f, 0x09, + 0x48, 0x09, 0x09, 0x09, 0x00, 0xf0, 0x01, 0x08, 0x01, 0xf0, 0x01, 0x01, + 0x05, 0x91, 0x36, 0x22, 0x04, 0x98, 0x00, 0xf1, 0x28, 0x01, 0x08, 0xa8, + 0xee, 0xf7, 0xa2, 0xfc, 0x70, 0x68, 0x90, 0xf8, 0x5c, 0x11, 0x01, 0xf0, + 0xdf, 0x01, 0x80, 0xf8, 0x5c, 0x11, 0x01, 0x22, 0x04, 0x98, 0x00, 0xf1, + 0x2f, 0x01, 0x00, 0x91, 0x4a, 0x74, 0x00, 0x99, 0x08, 0x78, 0x40, 0xf0, + 0x02, 0x00, 0x08, 0x70, 0x9d, 0xf8, 0x39, 0x10, 0xdd, 0xf8, 0x10, 0xa0, + 0x07, 0x94, 0x04, 0x95, 0x8d, 0xf8, 0x05, 0x90, 0x44, 0x46, 0xdd, 0xf8, + 0x14, 0x80, 0x0d, 0x46, 0x91, 0x46, 0x17, 0xe0, 0x28, 0x46, 0x01, 0xe0, + 0x9d, 0xf8, 0x05, 0x00, 0x00, 0x99, 0x88, 0x74, 0x4f, 0x45, 0xbc, 0xbf, + 0x40, 0xf6, 0x06, 0x60, 0xca, 0xf8, 0x00, 0x00, 0x07, 0x98, 0x00, 0xf0, + 0xa9, 0xfb, 0x02, 0x90, 0x10, 0x28, 0x04, 0xbf, 0x00, 0x21, 0x02, 0x91, + 0x09, 0xf1, 0x01, 0x00, 0x5f, 0xfa, 0x80, 0xf9, 0x04, 0x99, 0xc9, 0x19, + 0x49, 0x45, 0x1a, 0xdb, 0x02, 0x98, 0x00, 0x28, 0xf4, 0xd1, 0xb8, 0xf1, + 0x00, 0x0f, 0x8b, 0xf8, 0x14, 0x90, 0x0b, 0xd0, 0x09, 0xf1, 0x01, 0x01, + 0x64, 0x22, 0x51, 0x43, 0x28, 0x46, 0xb1, 0xfb, 0xf7, 0xf2, 0x50, 0x43, + 0x64, 0x23, 0xb0, 0xfb, 0xf3, 0xf0, 0xd3, 0xe7, 0x00, 0x2c, 0xcd, 0xd0, + 0xb9, 0x45, 0xcd, 0xd1, 0x00, 0x98, 0x85, 0x74, 0xd4, 0xe7, 0x70, 0x68, + 0x90, 0xf8, 0x5c, 0x11, 0x41, 0xf0, 0x20, 0x01, 0x80, 0xf8, 0x5c, 0x11, + 0x00, 0x22, 0x00, 0xf0, 0xdc, 0xfa, 0x00, 0xf0, 0xe5, 0xfc, 0x36, 0x22, + 0x9b, 0xf8, 0x14, 0x00, 0x40, 0xf0, 0x10, 0x00, 0x8b, 0xf8, 0x14, 0x00, + 0x08, 0xa9, 0x06, 0x98, 0xca, 0xf8, 0x00, 0x00, 0x0a, 0xf1, 0x28, 0x00, + 0xee, 0xf7, 0x30, 0xfc, 0xb1, 0x68, 0x00, 0x20, 0xc1, 0xf8, 0xe8, 0x04, + 0xb1, 0x68, 0x81, 0xf8, 0xe3, 0x04, 0xb1, 0x68, 0x81, 0xf8, 0xe4, 0x04, + 0x03, 0x9a, 0x02, 0x98, 0xd2, 0xf8, 0xd8, 0x10, 0x88, 0x43, 0x02, 0x90, + 0x02, 0x98, 0x10, 0xb1, 0x11, 0x78, 0x8a, 0x06, 0x01, 0xd5, 0x06, 0x20, + 0xb0, 0x70, 0x02, 0x98, 0x04, 0xe0, 0x03, 0x29, 0x04, 0xd1, 0x20, 0x46, + 0x00, 0xf0, 0x48, 0xfb, 0xf1, 0x68, 0x41, 0xe2, 0x05, 0x29, 0x06, 0xd1, + 0x0a, 0x21, 0xb1, 0x70, 0x0b, 0x22, 0xb2, 0x70, 0x30, 0x70, 0x70, 0x70, + 0x3b, 0xe2, 0x06, 0x29, 0x07, 0xd1, 0x0c, 0x21, 0xb1, 0x70, 0x0d, 0x22, + 0xf1, 0x68, 0xb2, 0x70, 0x30, 0x70, 0x70, 0x70, 0x2e, 0xe2, 0x07, 0x29, + 0xf2, 0xd1, 0x04, 0x90, 0x0e, 0x20, 0xd4, 0xf8, 0x04, 0x80, 0xb0, 0x70, + 0x01, 0x22, 0x00, 0xf0, 0x85, 0xfa, 0x04, 0x99, 0x08, 0x43, 0x04, 0x90, + 0x70, 0x78, 0x04, 0x99, 0x19, 0x28, 0x41, 0xf0, 0x04, 0x01, 0x24, 0xd1, + 0xe6, 0x6a, 0x37, 0x78, 0x0a, 0x2f, 0x1d, 0xd8, 0x20, 0x6b, 0x07, 0x70, + 0x00, 0x25, 0x0d, 0xe0, 0x52, 0x08, 0x49, 0x1c, 0xd3, 0x07, 0xfb, 0xd5, + 0xb2, 0x1c, 0xc9, 0xb2, 0x12, 0xf8, 0x15, 0x20, 0xfb, 0xf7, 0xf7, 0xf9, + 0x21, 0x6b, 0x4a, 0x1c, 0x50, 0x55, 0x6d, 0x1c, 0xbd, 0x42, 0x14, 0xda, + 0xb0, 0x1c, 0x73, 0x1c, 0x10, 0xf8, 0x15, 0x20, 0x20, 0x68, 0x13, 0xf8, + 0x15, 0x30, 0x00, 0x21, 0x18, 0x44, 0xe7, 0xe7, 0x04, 0x91, 0x00, 0x20, + 0x93, 0xe1, 0x1a, 0x28, 0x06, 0xd1, 0x5f, 0xfa, 0x88, 0xf0, 0xfb, 0xf7, + 0x6d, 0xf9, 0x21, 0x6b, 0x08, 0x60, 0xd8, 0xe1, 0x18, 0x28, 0x24, 0xd1, + 0xe6, 0x6a, 0x37, 0x78, 0x0a, 0x2f, 0x00, 0xf2, 0x56, 0x81, 0x00, 0x25, + 0x0e, 0xe0, 0x4f, 0xea, 0x5c, 0x0c, 0x49, 0x1c, 0x5f, 0xea, 0xcc, 0x7e, + 0xf9, 0xd5, 0x06, 0xf1, 0x02, 0x0c, 0xd2, 0x78, 0x1c, 0xf8, 0x03, 0x30, + 0xc9, 0xb2, 0xfb, 0xf7, 0xc2, 0xf9, 0x6d, 0x1c, 0xbd, 0x42, 0xe4, 0xda, + 0x05, 0xeb, 0x45, 0x03, 0x06, 0xf1, 0x01, 0x0e, 0xf2, 0x18, 0x20, 0x68, + 0x1e, 0xf8, 0x03, 0x90, 0x92, 0xf8, 0x03, 0xc0, 0x00, 0x21, 0x48, 0x44, + 0xe4, 0xe7, 0x0d, 0x28, 0x40, 0xf0, 0x9b, 0x80, 0xb0, 0x68, 0x40, 0x7d, + 0x00, 0x25, 0x00, 0x28, 0x00, 0xf0, 0x90, 0x80, 0xd4, 0xf8, 0x04, 0x90, + 0x02, 0x28, 0x4f, 0xf0, 0x01, 0x0a, 0x08, 0xd1, 0x70, 0x68, 0x90, 0xf8, + 0x30, 0x10, 0x5f, 0xfa, 0x89, 0xf0, 0xfb, 0xf7, 0xdb, 0xf8, 0x4f, 0xf0, + 0x02, 0x0a, 0x60, 0x21, 0x05, 0xa8, 0x00, 0xf0, 0x33, 0xfd, 0xc0, 0x21, + 0x1d, 0xa8, 0x00, 0xf0, 0x2f, 0xfd, 0x70, 0x68, 0x90, 0xf8, 0x68, 0x11, + 0x27, 0x6b, 0x03, 0x95, 0x01, 0x29, 0x18, 0xbf, 0x00, 0x21, 0x01, 0x91, + 0xcd, 0xf8, 0x08, 0xa0, 0x05, 0xa9, 0x00, 0x91, 0x00, 0xf1, 0x18, 0x03, + 0xe0, 0x6a, 0x01, 0x78, 0x1d, 0xaa, 0x5f, 0xfa, 0x89, 0xf0, 0xfe, 0xf7, + 0x3e, 0xf8, 0xb0, 0x68, 0x41, 0x7d, 0x02, 0x29, 0x12, 0xd1, 0x70, 0x68, + 0x90, 0xf8, 0x31, 0x10, 0x5f, 0xfa, 0x89, 0xf0, 0xfb, 0xf7, 0xb0, 0xf8, + 0x70, 0x68, 0xd0, 0xf8, 0x00, 0x11, 0x0a, 0x05, 0x06, 0xd4, 0x00, 0xf0, + 0xf1, 0xf9, 0x71, 0x68, 0x05, 0x46, 0x00, 0x20, 0x81, 0xf8, 0x8d, 0x01, + 0x5f, 0xfa, 0x89, 0xf0, 0xfb, 0xf7, 0xf0, 0xf8, 0x00, 0x23, 0x00, 0x26, + 0x9c, 0x46, 0x3a, 0x46, 0x06, 0x20, 0x00, 0xfb, 0x0c, 0xf0, 0xc0, 0xf1, + 0x5a, 0x07, 0x7f, 0xb2, 0x05, 0xa9, 0x02, 0xf1, 0x01, 0x0e, 0xc9, 0x5d, + 0x02, 0xf8, 0x1c, 0x10, 0x00, 0x1d, 0x0d, 0xf1, 0x15, 0x01, 0x40, 0xb2, + 0xcf, 0x5d, 0x0e, 0xf8, 0x1c, 0x70, 0x0d, 0xf1, 0x14, 0x0e, 0x02, 0xeb, + 0x4c, 0x09, 0x09, 0xf1, 0x22, 0x07, 0x1e, 0xf8, 0x00, 0xa0, 0x87, 0xf8, + 0x00, 0xa0, 0x0c, 0xf1, 0x01, 0x0c, 0x09, 0x5c, 0x79, 0x70, 0x05, 0xaf, + 0x38, 0x44, 0x10, 0xf9, 0x02, 0x1d, 0x90, 0xf9, 0x01, 0x00, 0x76, 0x18, + 0x1b, 0x18, 0xbc, 0xf1, 0x10, 0x0f, 0xd3, 0xdb, 0x0a, 0x20, 0x16, 0xfb, + 0x00, 0xf1, 0xce, 0x10, 0x13, 0xfb, 0x00, 0xf0, 0x01, 0xeb, 0x16, 0x71, + 0xc3, 0x10, 0x09, 0x11, 0x00, 0xeb, 0x13, 0x70, 0x49, 0x1d, 0x0a, 0x26, + 0x00, 0x11, 0x91, 0xfb, 0xf6, 0xf1, 0x40, 0x1f, 0x02, 0xf8, 0x20, 0x1f, + 0x90, 0xfb, 0xf6, 0xf0, 0x50, 0x70, 0x00, 0xe0, 0x02, 0x25, 0x04, 0x98, + 0x05, 0x43, 0x04, 0x95, 0x13, 0xe1, 0x0c, 0x28, 0x04, 0xd1, 0x00, 0x21, + 0x20, 0x46, 0x00, 0xf0, 0x9e, 0xfb, 0x65, 0xe0, 0x12, 0x28, 0x08, 0xd1, + 0x70, 0x68, 0x90, 0xf8, 0x7c, 0x01, 0x04, 0xa9, 0xee, 0xf7, 0x2c, 0xf8, + 0x21, 0x6b, 0x08, 0x80, 0x01, 0xe1, 0x0e, 0x28, 0x27, 0xd1, 0xb0, 0x68, + 0x65, 0x68, 0x41, 0x7d, 0x00, 0x27, 0x02, 0x29, 0x1c, 0xd1, 0x20, 0x6b, + 0x4f, 0xf4, 0xb6, 0x71, 0x00, 0xf0, 0x92, 0xfc, 0x70, 0x68, 0x23, 0x6b, + 0xe1, 0x6a, 0x00, 0xf1, 0x28, 0x02, 0xe8, 0xb2, 0x12, 0xf0, 0x69, 0xfe, + 0x70, 0x68, 0xd0, 0xf8, 0x00, 0x11, 0x0a, 0x05, 0x06, 0xd4, 0x00, 0xf0, + 0x6d, 0xf9, 0x71, 0x68, 0x07, 0x46, 0x00, 0x20, 0x81, 0xf8, 0x8d, 0x01, + 0xe8, 0xb2, 0xfb, 0xf7, 0x6d, 0xf8, 0x00, 0xe0, 0x02, 0x27, 0x04, 0x98, + 0x07, 0x43, 0x04, 0x97, 0xd7, 0xe0, 0x13, 0x28, 0x25, 0xd1, 0xe0, 0x6a, + 0x47, 0x78, 0x05, 0x78, 0x4f, 0xf0, 0x00, 0x09, 0x0e, 0xe0, 0x04, 0x98, + 0x40, 0xf0, 0x04, 0x00, 0x07, 0xe0, 0x09, 0xeb, 0x05, 0x02, 0xd2, 0xb2, + 0x20, 0x46, 0x10, 0xf0, 0xc7, 0xfd, 0x04, 0x99, 0x08, 0x43, 0x04, 0x90, + 0x09, 0xf1, 0x01, 0x09, 0xb9, 0x45, 0xe5, 0xda, 0xb9, 0xf1, 0x08, 0x0f, + 0xeb, 0xd2, 0xe0, 0x6a, 0x81, 0x1c, 0xb0, 0x68, 0x09, 0xeb, 0xc9, 0x02, + 0x8b, 0x18, 0x41, 0x7d, 0x02, 0x29, 0x0c, 0xbf, 0x01, 0x21, 0x00, 0x21, + 0xe3, 0xe7, 0x14, 0x28, 0x0a, 0xd1, 0xe0, 0x6a, 0x01, 0x78, 0x42, 0x1c, + 0x5f, 0xfa, 0x88, 0xf0, 0x11, 0xf0, 0xeb, 0xfc, 0x04, 0x99, 0x08, 0x43, + 0x04, 0x90, 0xa2, 0xe0, 0x15, 0x28, 0x26, 0xd1, 0xe2, 0x6a, 0x57, 0x88, + 0x10, 0x88, 0x75, 0x69, 0x04, 0x2f, 0x1e, 0xd8, 0xb2, 0x69, 0x38, 0x23, + 0xb2, 0xfb, 0xf3, 0xf3, 0x9b, 0xb2, 0x3e, 0x18, 0xb3, 0x42, 0x16, 0xdb, + 0x4f, 0xf0, 0x00, 0x0a, 0x4f, 0xf0, 0x38, 0x09, 0x06, 0x46, 0xba, 0x45, + 0x10, 0xda, 0x0a, 0xeb, 0x06, 0x00, 0x09, 0xfb, 0x00, 0xf0, 0x23, 0x6b, + 0x29, 0x18, 0x09, 0xfb, 0x0a, 0xfc, 0x38, 0x22, 0x03, 0xeb, 0x0c, 0x00, + 0xee, 0xf7, 0x52, 0xfa, 0x0a, 0xf1, 0x01, 0x0a, 0xed, 0xe7, 0x04, 0x91, + 0x79, 0xe0, 0x1b, 0x28, 0x2c, 0xd1, 0xe6, 0x6a, 0x30, 0x79, 0x40, 0xb1, + 0x02, 0x28, 0x06, 0xdc, 0x00, 0x21, 0xff, 0x20, 0xfb, 0xf7, 0x7b, 0xf8, + 0x30, 0x79, 0xfb, 0xf7, 0x7c, 0xf8, 0xfb, 0xf7, 0x78, 0xf8, 0x01, 0x46, + 0xb0, 0x78, 0x08, 0x40, 0x1c, 0xbf, 0x00, 0x21, 0xfb, 0xf7, 0x6f, 0xf8, + 0x00, 0x27, 0x01, 0x21, 0xb0, 0x78, 0xb9, 0x40, 0x08, 0x42, 0x04, 0xd0, + 0xf0, 0x78, 0x01, 0x40, 0xf8, 0xb2, 0xfb, 0xf7, 0x6a, 0xf8, 0x7f, 0x1c, + 0xf9, 0xb2, 0x08, 0x29, 0xf1, 0xd3, 0x71, 0x78, 0x30, 0x78, 0xfb, 0xf7, + 0x5c, 0xf8, 0xfb, 0xf7, 0x5c, 0xf8, 0x21, 0x6b, 0x08, 0x70, 0x4a, 0xe0, + 0x1d, 0x28, 0x04, 0xd1, 0x5f, 0xfa, 0x88, 0xf0, 0xfb, 0xf7, 0x0e, 0xf9, + 0x43, 0xe0, 0x1e, 0x28, 0x5c, 0xd1, 0xb0, 0x68, 0x23, 0x6b, 0x00, 0xf5, + 0x09, 0x71, 0x0a, 0x8e, 0x1a, 0x80, 0x22, 0x6b, 0x0e, 0x78, 0x96, 0x70, + 0x22, 0x6b, 0x90, 0xf8, 0x59, 0x31, 0xd3, 0x70, 0x22, 0x6b, 0x0b, 0x7d, + 0x13, 0x71, 0x00, 0xf1, 0x98, 0x02, 0x26, 0x6b, 0xd3, 0x88, 0xf3, 0x80, + 0x26, 0x6b, 0x13, 0x89, 0x33, 0x81, 0x26, 0x6b, 0x13, 0x78, 0xb3, 0x72, + 0x26, 0x6b, 0x53, 0x78, 0xf3, 0x72, 0x26, 0x6b, 0xd3, 0x89, 0xb3, 0x81, + 0x23, 0x6b, 0x89, 0x88, 0xd9, 0x81, 0x23, 0x6b, 0x11, 0x7d, 0x19, 0x74, + 0x23, 0x6b, 0x92, 0xf8, 0x24, 0x10, 0x59, 0x74, 0x23, 0x6b, 0x92, 0xf8, + 0x25, 0x10, 0x99, 0x74, 0x23, 0x6b, 0x92, 0xf8, 0x26, 0x10, 0xd9, 0x74, + 0x92, 0xf8, 0x27, 0x10, 0x22, 0x6b, 0x11, 0x75, 0x00, 0x21, 0x42, 0x18, + 0x23, 0x6b, 0x92, 0xf8, 0xc8, 0x20, 0x03, 0xf1, 0x15, 0x06, 0x72, 0x54, + 0x49, 0x1c, 0x08, 0x29, 0xf5, 0xd3, 0x00, 0x22, 0x00, 0xf0, 0x72, 0xf8, + 0x04, 0x99, 0x08, 0x43, 0x04, 0xf1, 0x34, 0x01, 0x04, 0x90, 0x4b, 0x68, + 0x04, 0x9a, 0xd3, 0xf8, 0xd8, 0x00, 0x82, 0x43, 0x04, 0x92, 0x00, 0x20, + 0x0f, 0x22, 0x08, 0x70, 0x48, 0x70, 0x8a, 0x70, 0x04, 0x98, 0xc9, 0x68, + 0xca, 0x68, 0x52, 0x1c, 0xca, 0x60, 0x4d, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x1f, 0x28, 0xe2, 0xd1, 0xb0, 0x68, 0x00, 0xf5, 0x16, 0x71, 0x20, 0x6b, + 0xb1, 0xf8, 0x14, 0x23, 0x02, 0x80, 0x01, 0xf5, 0xf8, 0x72, 0x20, 0x6b, + 0x13, 0x78, 0x83, 0x70, 0x20, 0x6b, 0x53, 0x78, 0xc3, 0x70, 0x00, 0x20, + 0x01, 0xf2, 0x13, 0x23, 0x27, 0x6b, 0x1e, 0x5c, 0x3d, 0x1d, 0x00, 0x28, + 0x2e, 0x54, 0x0c, 0xbf, 0x16, 0x56, 0x92, 0xf9, 0x01, 0x60, 0x27, 0x6b, + 0x1b, 0x5c, 0x07, 0x44, 0x40, 0x1c, 0x9e, 0x1b, 0x01, 0x28, 0xbe, 0x71, + 0xec, 0xd9, 0x23, 0x6b, 0x92, 0xf8, 0x50, 0x00, 0x18, 0x72, 0x23, 0x6b, + 0x92, 0xf8, 0x51, 0x00, 0x58, 0x72, 0x23, 0x6b, 0x92, 0xf8, 0x52, 0x00, + 0x98, 0x72, 0x92, 0xf8, 0x53, 0x00, 0x22, 0x6b, 0xd0, 0x72, 0x00, 0x20, + 0x0a, 0x18, 0x23, 0x6b, 0x92, 0xf8, 0x4c, 0x22, 0x03, 0xf1, 0x0c, 0x06, + 0x32, 0x54, 0x40, 0x1c, 0x08, 0x28, 0xf5, 0xd3, 0x00, 0x20, 0x22, 0x6b, + 0x01, 0xeb, 0x80, 0x06, 0x02, 0xf1, 0x14, 0x03, 0xd6, 0xf8, 0xa4, 0x20, + 0x43, 0xf8, 0x20, 0x20, 0x40, 0x1c, 0x01, 0x28, 0xf3, 0xd9, 0x00, 0x20, + 0x22, 0x6b, 0x01, 0xeb, 0x80, 0x06, 0x02, 0xeb, 0x80, 0x03, 0xd6, 0xf8, + 0xb0, 0x20, 0xda, 0x61, 0x40, 0x1c, 0x10, 0x28, 0xf4, 0xd3, 0x8a, 0xe7, + 0x03, 0x21, 0x5f, 0xfa, 0x88, 0xf0, 0xfb, 0xf7, 0x70, 0xba, 0x64, 0x21, + 0x50, 0x46, 0xed, 0xf7, 0xa5, 0xbf, 0x9d, 0xf8, 0x04, 0x00, 0x05, 0x21, + 0xfb, 0xf7, 0x67, 0xba, 0x9b, 0xf8, 0x15, 0x00, 0x02, 0x28, 0x70, 0x47, + 0x01, 0x21, 0x80, 0xf8, 0x8d, 0x11, 0xb0, 0x68, 0x71, 0x68, 0x00, 0xf5, + 0xae, 0x62, 0x60, 0x68, 0x01, 0xf5, 0xc6, 0x71, 0xc0, 0xb2, 0xed, 0xf7, + 0x70, 0xbf, 0x10, 0xb5, 0x03, 0x46, 0x00, 0x20, 0x03, 0xf1, 0x34, 0x04, + 0x05, 0x29, 0x0c, 0xbf, 0x00, 0x2a, 0x52, 0xea, 0x01, 0x03, 0x05, 0xd0, + 0x01, 0x29, 0x18, 0xbf, 0x06, 0x29, 0x04, 0xd1, 0x00, 0x2a, 0x40, 0xd1, + 0x21, 0x70, 0x62, 0x70, 0x10, 0xbd, 0x02, 0x29, 0x0f, 0xd1, 0x01, 0x2a, + 0x18, 0xbf, 0x17, 0x2a, 0xf6, 0xd0, 0x03, 0x2a, 0x18, 0xbf, 0x06, 0x2a, + 0xf2, 0xd0, 0x02, 0x2a, 0x1c, 0xbf, 0x04, 0x2a, 0x05, 0x2a, 0xed, 0xd0, + 0x07, 0x2a, 0x2c, 0xd1, 0xea, 0xe7, 0x03, 0x29, 0x0a, 0xd1, 0x01, 0x2a, + 0x18, 0xbf, 0x11, 0x2a, 0xe4, 0xd0, 0x08, 0x2a, 0x1c, 0xbf, 0x09, 0x2a, + 0x0a, 0x2a, 0xdf, 0xd0, 0x0b, 0x2a, 0xf0, 0xe7, 0x07, 0x29, 0x1c, 0xd1, + 0x0c, 0x2a, 0x18, 0xbf, 0x0d, 0x2a, 0xd7, 0xd0, 0x12, 0x2a, 0x18, 0xbf, + 0x0e, 0x2a, 0xd3, 0xd0, 0x13, 0x2a, 0x18, 0xbf, 0x14, 0x2a, 0xcf, 0xd0, + 0x15, 0x2a, 0x18, 0xbf, 0x19, 0x2a, 0xcb, 0xd0, 0x18, 0x2a, 0x18, 0xbf, + 0x1a, 0x2a, 0xc7, 0xd0, 0x1b, 0x2a, 0x18, 0xbf, 0x1c, 0x2a, 0xc3, 0xd0, + 0x1d, 0x2a, 0x1c, 0xbf, 0x1e, 0x2a, 0x1f, 0x2a, 0xbe, 0xd0, 0xe0, 0x68, + 0x01, 0x68, 0x41, 0xf0, 0x02, 0x01, 0x01, 0x60, 0x02, 0x20, 0x10, 0xbd, + 0x70, 0xb5, 0x00, 0xf1, 0x34, 0x06, 0xa0, 0xb0, 0x75, 0x78, 0x12, 0x49, + 0x68, 0x46, 0x80, 0x22, 0xee, 0xf7, 0xec, 0xf8, 0x36, 0x78, 0x00, 0x24, + 0x07, 0x2e, 0x03, 0xd1, 0x20, 0x2d, 0xb8, 0xbf, 0x5d, 0xf8, 0x25, 0x40, + 0x20, 0x46, 0x20, 0xb0, 0x70, 0xbd, 0x30, 0xb5, 0x01, 0x46, 0x00, 0x20, + 0x00, 0x22, 0x07, 0x4b, 0xd4, 0xb2, 0x53, 0xf8, 0x24, 0x40, 0x65, 0x68, + 0x8d, 0x42, 0x04, 0xd0, 0x52, 0x1c, 0xd4, 0xb2, 0x04, 0x2c, 0xf5, 0xd3, + 0x30, 0xbd, 0x20, 0x46, 0x30, 0xbd, 0x00, 0x00, 0x88, 0x75, 0x02, 0x21, + 0x3c, 0x8c, 0x04, 0x02, 0x2d, 0xe9, 0xfe, 0x4f, 0x00, 0x21, 0x02, 0x91, + 0x83, 0x46, 0x00, 0xf0, 0x11, 0xfa, 0x58, 0x46, 0x00, 0xf0, 0x5a, 0xfa, + 0x0b, 0xf1, 0x38, 0x04, 0x4f, 0xf0, 0x01, 0x09, 0x20, 0x68, 0x61, 0x68, + 0xd0, 0xf8, 0x00, 0x71, 0x78, 0x03, 0x48, 0x7d, 0x48, 0xbf, 0x4f, 0xf0, + 0x00, 0x09, 0x00, 0x28, 0x0b, 0xf1, 0x35, 0x05, 0x00, 0xf0, 0x4f, 0x81, + 0xdb, 0xf8, 0x04, 0x60, 0x08, 0x20, 0x68, 0x70, 0x01, 0x22, 0x03, 0x21, + 0xf0, 0xb2, 0xfb, 0xf7, 0xac, 0xf9, 0x00, 0xf0, 0x49, 0xf9, 0x6f, 0xf0, + 0xc7, 0x08, 0x78, 0x06, 0x0e, 0xd4, 0x28, 0x78, 0x01, 0x28, 0x18, 0xbf, + 0x11, 0x28, 0x09, 0xd1, 0x20, 0x68, 0x90, 0xf8, 0x7c, 0x01, 0x02, 0xa9, + 0xed, 0xf7, 0xd8, 0xfd, 0x80, 0x46, 0x60, 0x68, 0xa0, 0xf8, 0x6c, 0x85, + 0x78, 0x07, 0x3f, 0xd4, 0x28, 0x78, 0x01, 0x28, 0x18, 0xbf, 0x0a, 0x28, + 0x3a, 0xd1, 0x40, 0x46, 0x00, 0xee, 0x10, 0x0a, 0x60, 0x68, 0xb0, 0xf9, + 0x3e, 0x15, 0x00, 0xee, 0x90, 0x1a, 0xb8, 0xee, 0xc0, 0x0a, 0xf8, 0xee, + 0xe0, 0x0a, 0x30, 0xee, 0x60, 0x0a, 0xb0, 0xee, 0xc0, 0x0a, 0x20, 0x68, + 0x90, 0xf8, 0x7e, 0x11, 0x00, 0xee, 0x90, 0x1a, 0xf8, 0xee, 0x60, 0x0a, + 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x02, 0xda, 0x28, 0x78, + 0x0a, 0x28, 0x1b, 0xd1, 0x01, 0x22, 0x02, 0x21, 0xf0, 0xb2, 0xfb, 0xf7, + 0x27, 0xf9, 0x00, 0xf0, 0x09, 0xf9, 0x60, 0x68, 0x00, 0xf2, 0x2d, 0x53, + 0x00, 0xf2, 0x2c, 0x52, 0x20, 0x68, 0x90, 0xf8, 0x7d, 0x11, 0xf0, 0xb2, + 0x11, 0xf0, 0xf2, 0xfa, 0x60, 0x68, 0xa0, 0xf8, 0x3e, 0x85, 0x00, 0x22, + 0x02, 0x21, 0xf0, 0xb2, 0xfb, 0xf7, 0x12, 0xf9, 0x00, 0xf0, 0xf4, 0xf8, + 0xf8, 0x06, 0x2c, 0xd5, 0x28, 0x78, 0x01, 0x28, 0x18, 0xbf, 0x0f, 0x28, + 0x27, 0xd1, 0xb8, 0x0a, 0x00, 0xf0, 0x01, 0x00, 0x80, 0xf0, 0x01, 0x0c, + 0x60, 0x68, 0x00, 0x7d, 0x79, 0x0a, 0x01, 0xf0, 0x01, 0x01, 0x3a, 0x0a, + 0x3b, 0x0b, 0x81, 0xf0, 0x01, 0x01, 0x02, 0xf0, 0x01, 0x02, 0x03, 0xf0, + 0x07, 0x03, 0x10, 0xb1, 0x10, 0x28, 0x80, 0x41, 0xc0, 0x0f, 0x01, 0x90, + 0xcd, 0xf8, 0x00, 0xc0, 0x58, 0x46, 0x12, 0xf0, 0x63, 0xfe, 0x61, 0x68, + 0x91, 0xf8, 0x41, 0x05, 0x08, 0xb1, 0x00, 0xf0, 0xcf, 0xf8, 0x61, 0x68, + 0x91, 0xf8, 0x42, 0x05, 0x08, 0xb1, 0x00, 0xf0, 0xc9, 0xf8, 0xb8, 0x06, + 0x13, 0xd5, 0x28, 0x78, 0x01, 0x28, 0x18, 0xbf, 0x10, 0x28, 0x0e, 0xd1, + 0x61, 0x68, 0xd1, 0xf8, 0x64, 0x04, 0x50, 0xb1, 0x58, 0x46, 0x13, 0xf0, + 0x87, 0xf8, 0x00, 0xf0, 0xb5, 0xf8, 0x62, 0x68, 0x92, 0xf8, 0x53, 0x04, + 0x08, 0xb1, 0x00, 0xf0, 0xb3, 0xf8, 0x60, 0x68, 0x41, 0x7d, 0x02, 0x29, + 0x23, 0xd1, 0x39, 0x05, 0x21, 0xd4, 0x29, 0x78, 0x01, 0x29, 0x18, 0xbf, + 0x16, 0x29, 0x1c, 0xd1, 0xd0, 0xf8, 0x64, 0x04, 0x04, 0x28, 0x18, 0xd3, + 0x20, 0x68, 0x01, 0x21, 0x80, 0xf8, 0x95, 0x11, 0x61, 0x68, 0x20, 0x68, + 0x01, 0xf5, 0xae, 0x62, 0x00, 0xf5, 0xc6, 0x71, 0xf0, 0xb2, 0x00, 0x20, + 0xc0, 0x46, 0x00, 0xf0, 0x91, 0xf8, 0x60, 0x68, 0x00, 0xf5, 0xae, 0x60, + 0x01, 0x78, 0x40, 0x78, 0x09, 0x1a, 0x49, 0xb2, 0xf0, 0xb2, 0xfa, 0xf7, + 0xf6, 0xfc, 0x60, 0x68, 0x41, 0x7d, 0x02, 0x29, 0x15, 0xd1, 0xf9, 0x07, + 0x13, 0xd4, 0x29, 0x78, 0x01, 0x29, 0x18, 0xbf, 0x08, 0x29, 0x0e, 0xd1, + 0x21, 0x68, 0xb1, 0xf8, 0x4a, 0x21, 0x00, 0x92, 0x00, 0xf5, 0x3e, 0x73, + 0x00, 0xf5, 0x1b, 0x72, 0x01, 0xf5, 0x88, 0x71, 0xf0, 0xb2, 0x13, 0xf0, + 0xb1, 0xfb, 0x00, 0xf0, 0x6d, 0xf8, 0x60, 0x68, 0x41, 0x7d, 0x02, 0x29, + 0x29, 0xd1, 0xb8, 0x07, 0x27, 0xd4, 0x28, 0x78, 0x01, 0x28, 0x18, 0xbf, + 0x09, 0x28, 0x22, 0xd1, 0x01, 0x20, 0xb9, 0xf1, 0x00, 0x0f, 0x11, 0xd1, + 0x21, 0x68, 0xd1, 0xf8, 0x00, 0x21, 0x13, 0x03, 0x58, 0xbf, 0x02, 0x20, + 0x01, 0x22, 0x81, 0xf8, 0x54, 0x21, 0x61, 0x68, 0x91, 0xf8, 0x68, 0x22, + 0xd1, 0x07, 0x03, 0xd5, 0x23, 0x68, 0x00, 0x22, 0x83, 0xf8, 0x54, 0x21, + 0x4f, 0xf0, 0x00, 0x0a, 0x81, 0x46, 0x06, 0xe0, 0x58, 0x46, 0x15, 0xf0, + 0x4f, 0xf9, 0x00, 0xf0, 0x43, 0xf8, 0x0a, 0xf1, 0x01, 0x0a, 0xca, 0x45, + 0xf6, 0xdb, 0x60, 0x68, 0x41, 0x7d, 0x01, 0x29, 0x0e, 0xd1, 0xb9, 0x07, + 0x0c, 0xd4, 0x29, 0x78, 0x01, 0x29, 0x18, 0xbf, 0x09, 0x29, 0x07, 0xd1, + 0x00, 0xf5, 0x3e, 0x72, 0x20, 0x68, 0x00, 0xf1, 0x18, 0x01, 0xf0, 0xb2, + 0x15, 0xf0, 0xbd, 0xfd, 0x38, 0x07, 0x0a, 0xd5, 0x28, 0x78, 0x01, 0x28, + 0x18, 0xbf, 0x0b, 0x28, 0x05, 0xd1, 0x01, 0x21, 0x58, 0x46, 0x00, 0xf0, + 0x28, 0xf8, 0x00, 0xf0, 0x1f, 0xf8, 0x00, 0x22, 0x03, 0x21, 0xf0, 0xb2, + 0xfb, 0xf7, 0x7b, 0xf8, 0x00, 0xf0, 0x18, 0xf8, 0x41, 0x46, 0xf0, 0xb2, + 0xfa, 0xf7, 0xd5, 0xff, 0x00, 0xf0, 0x12, 0xf8, 0x20, 0x68, 0x02, 0x9b, + 0x00, 0xf1, 0xd8, 0x02, 0x11, 0x68, 0x8b, 0x43, 0x02, 0x93, 0x02, 0x98, + 0x18, 0xb1, 0x92, 0xf8, 0x28, 0x00, 0x01, 0x06, 0x01, 0xd5, 0x09, 0x20, + 0x68, 0x70, 0x02, 0x98, 0xbd, 0xe8, 0xfe, 0x8f, 0x02, 0x99, 0x08, 0x43, + 0x02, 0x90, 0x70, 0x47, 0x02, 0xa9, 0x58, 0x46, 0x89, 0xe0, 0x2d, 0xe9, + 0xf0, 0x41, 0x86, 0xb0, 0x04, 0x46, 0x08, 0x46, 0xe2, 0x6b, 0x51, 0x7d, + 0x00, 0x25, 0x00, 0x29, 0x7a, 0xd0, 0x60, 0xb3, 0xa3, 0x6b, 0x03, 0xf5, + 0xb2, 0x70, 0x02, 0xf5, 0xac, 0x6e, 0x06, 0x79, 0x01, 0x2e, 0x03, 0xf2, + 0x53, 0x16, 0x0c, 0xbf, 0x01, 0x27, 0x00, 0x27, 0x96, 0xf8, 0x00, 0xc0, + 0x02, 0x97, 0xbc, 0xf1, 0x01, 0x0f, 0x18, 0xbf, 0xac, 0x46, 0x02, 0xf2, + 0x59, 0x58, 0x02, 0xf5, 0xab, 0x62, 0x03, 0xf1, 0x28, 0x07, 0xcd, 0xf8, + 0x14, 0xe0, 0xcd, 0xf8, 0x10, 0x80, 0x03, 0x92, 0xcd, 0xf8, 0x04, 0xc0, + 0x00, 0x97, 0x03, 0x68, 0x60, 0x68, 0x72, 0x7b, 0xc0, 0xb2, 0x15, 0xf0, + 0x37, 0xfe, 0xe0, 0x6b, 0xd0, 0xf8, 0x64, 0x14, 0xc0, 0xf8, 0x5c, 0x15, + 0x4d, 0xe0, 0xe0, 0x6a, 0xd4, 0xf8, 0x30, 0xc0, 0x03, 0x7a, 0x02, 0xf5, + 0xac, 0x62, 0x01, 0x2b, 0xa3, 0x6b, 0x93, 0xf8, 0x53, 0x71, 0x05, 0x92, + 0x0c, 0xbf, 0x01, 0x26, 0x00, 0x26, 0x01, 0x2f, 0x0c, 0xf1, 0x01, 0x02, + 0x18, 0xbf, 0x00, 0x27, 0x28, 0x33, 0x04, 0x92, 0x00, 0x93, 0xcd, 0xf8, + 0x0c, 0xc0, 0x02, 0x96, 0x01, 0x97, 0x43, 0x68, 0x02, 0x78, 0x60, 0x68, + 0xc0, 0xb2, 0x15, 0xf0, 0x11, 0xfe, 0xa0, 0x6b, 0xd0, 0xf8, 0x00, 0x01, + 0x01, 0x07, 0x09, 0xd4, 0x22, 0x6b, 0xe3, 0x6b, 0x11, 0x78, 0x83, 0xf8, + 0x58, 0x15, 0x21, 0x6b, 0x4a, 0x78, 0xe1, 0x6b, 0x81, 0xf8, 0x59, 0x25, + 0xe1, 0x6b, 0xd1, 0xf8, 0x64, 0x24, 0xc1, 0xf8, 0x5c, 0x25, 0x49, 0x7d, + 0x02, 0x29, 0x16, 0xd1, 0x00, 0x05, 0x14, 0xd4, 0xa0, 0x6b, 0x01, 0x21, + 0x80, 0xf8, 0x8d, 0x11, 0xe1, 0x6b, 0xa0, 0x6b, 0x01, 0xf5, 0xae, 0x62, + 0x00, 0xf5, 0xc6, 0x71, 0x60, 0x68, 0xc0, 0xb2, 0x00, 0x20, 0xc0, 0x46, + 0xa1, 0x6b, 0x05, 0x46, 0x00, 0x20, 0x81, 0xf8, 0x8d, 0x01, 0x00, 0xe0, + 0x02, 0x25, 0x28, 0x46, 0x06, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, 0xf8, 0xb5, + 0x04, 0x46, 0x0d, 0x46, 0xa0, 0x6b, 0xd0, 0xf8, 0x00, 0x11, 0x01, 0x26, + 0x48, 0x03, 0x48, 0xbf, 0x02, 0x26, 0x00, 0x27, 0x06, 0xe0, 0x20, 0x46, + 0x15, 0xf0, 0x6a, 0xf8, 0x29, 0x68, 0x08, 0x43, 0x28, 0x60, 0x7f, 0x1c, + 0x78, 0xb2, 0xb0, 0x42, 0xf5, 0xdb, 0xf1, 0xbd, 0xf8, 0xb5, 0x04, 0x46, + 0xe0, 0x6b, 0x41, 0x7d, 0x02, 0x29, 0x02, 0xbf, 0x00, 0xf2, 0xdc, 0x41, + 0x91, 0xf9, 0x02, 0x00, 0x00, 0x28, 0x3e, 0xd1, 0x94, 0xf8, 0x36, 0x20, + 0x65, 0x68, 0x06, 0x2a, 0x29, 0xdb, 0x08, 0x56, 0x38, 0xbb, 0x01, 0x22, + 0x0a, 0x70, 0xe8, 0xb2, 0xfa, 0xf7, 0x3c, 0xfd, 0xe8, 0xb2, 0xfa, 0xf7, + 0x3b, 0xfd, 0x01, 0x20, 0xed, 0xf7, 0x78, 0xfa, 0xe0, 0x6b, 0x00, 0xf1, + 0xbc, 0x06, 0xe9, 0xb2, 0x30, 0x46, 0xfa, 0xf7, 0x27, 0xfd, 0x00, 0x20, + 0x00, 0x90, 0x00, 0x27, 0x69, 0x46, 0xe8, 0xb2, 0xfa, 0xf7, 0xd4, 0xfc, + 0xf9, 0xb2, 0x7f, 0x1c, 0x00, 0x98, 0x06, 0xeb, 0x81, 0x02, 0xfb, 0xb2, + 0x03, 0x2b, 0x50, 0x66, 0xf2, 0xd3, 0xe1, 0x6b, 0x00, 0x20, 0xc1, 0xf8, + 0xe8, 0x04, 0xfa, 0xf7, 0x1d, 0xfd, 0xfa, 0xf7, 0x1d, 0xfd, 0xe1, 0x6b, + 0xd1, 0xf8, 0xe8, 0x24, 0x10, 0x18, 0xc1, 0xf8, 0xe8, 0x04, 0x00, 0x21, + 0xe8, 0xb2, 0xfa, 0xf7, 0x15, 0xfd, 0x01, 0x28, 0x08, 0xbf, 0xfa, 0xf7, + 0x0d, 0xfd, 0xf1, 0xbd, 0xc2, 0x6b, 0x51, 0x7d, 0x02, 0x29, 0x00, 0xd0, + 0x70, 0x47, 0x10, 0xb5, 0x02, 0xf2, 0xda, 0x43, 0x93, 0xf9, 0x04, 0x10, + 0x99, 0xb9, 0x00, 0x24, 0x1c, 0x80, 0xa2, 0xf8, 0x1c, 0x15, 0xdc, 0x71, + 0xc2, 0x6b, 0x82, 0xf8, 0xe2, 0x14, 0xc2, 0x6b, 0x82, 0xf8, 0xe4, 0x14, + 0xc2, 0x6b, 0x82, 0xf8, 0x1f, 0x15, 0xc2, 0x6b, 0x82, 0xf8, 0xe0, 0x14, + 0xc0, 0x6b, 0x80, 0xf8, 0x20, 0x15, 0x10, 0xbd, 0x00, 0x22, 0x15, 0xf0, + 0x9d, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x13, 0x46, 0x03, 0xf1, 0x14, 0x02, + 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x82, 0xe8, 0xf0, 0x00, + 0x03, 0xf1, 0x24, 0x02, 0xc2, 0xe9, 0x00, 0x45, 0x9c, 0x80, 0xdc, 0x80, + 0x1c, 0x81, 0x5d, 0x81, 0x0a, 0x79, 0x01, 0x46, 0x03, 0xf1, 0x0c, 0x00, + 0xbd, 0xe8, 0xf8, 0x40, 0x86, 0xe3, 0xf8, 0xb5, 0x07, 0x46, 0x06, 0x9e, + 0x18, 0x78, 0x0d, 0x46, 0x14, 0x00, 0x18, 0xbf, 0x65, 0x79, 0x30, 0x70, + 0x59, 0x78, 0x71, 0x70, 0x29, 0x46, 0x98, 0x78, 0xb0, 0x70, 0x38, 0x46, + 0xda, 0x78, 0xf2, 0x70, 0xfa, 0xf7, 0x79, 0xfa, 0x94, 0xb1, 0x61, 0x6a, + 0x0a, 0x04, 0x0f, 0xd4, 0x94, 0xf9, 0x22, 0x20, 0x20, 0x79, 0x28, 0xb9, + 0x21, 0x56, 0x10, 0x46, 0x88, 0x42, 0x07, 0xda, 0x08, 0x46, 0x05, 0xe0, + 0x94, 0xf9, 0x03, 0x00, 0x82, 0x42, 0xbc, 0xbf, 0x10, 0x46, 0x40, 0x42, + 0x86, 0xf8, 0x34, 0x00, 0x32, 0x46, 0x29, 0x46, 0x38, 0x46, 0xbd, 0xe8, + 0xf8, 0x40, 0x00, 0xf0, 0x22, 0xbc, 0xfe, 0xb5, 0x8d, 0xf8, 0x07, 0x00, + 0x8d, 0xf8, 0x06, 0x10, 0x08, 0x9c, 0x1f, 0x78, 0x17, 0x70, 0x02, 0xf1, + 0x8c, 0x06, 0x5d, 0x78, 0x55, 0x70, 0x01, 0x29, 0x9f, 0x78, 0x97, 0x70, + 0x08, 0xbf, 0xa2, 0xf1, 0x8c, 0x06, 0xdd, 0x78, 0xd5, 0x70, 0x93, 0xf9, + 0x0d, 0x20, 0x8d, 0xf8, 0x00, 0x20, 0x9d, 0x7b, 0x8d, 0xf8, 0x01, 0x50, + 0xda, 0x7b, 0x8d, 0xf8, 0x02, 0x20, 0x1a, 0x7c, 0x8d, 0xf8, 0x03, 0x20, + 0x5a, 0x7c, 0x8d, 0xf8, 0x04, 0x20, 0x9a, 0x7c, 0x8d, 0xf8, 0x05, 0x20, + 0x2c, 0xb9, 0xc1, 0xf1, 0x01, 0x01, 0xca, 0xb2, 0x96, 0xf9, 0x34, 0x10, + 0x02, 0xe0, 0x0a, 0x46, 0x93, 0xf9, 0x34, 0x10, 0xfa, 0xf7, 0x0f, 0xfa, + 0x68, 0x46, 0xfa, 0xf7, 0x87, 0xfc, 0xf7, 0xbd, 0x7c, 0xb5, 0x16, 0x46, + 0x01, 0x22, 0x00, 0x92, 0x0d, 0x46, 0x04, 0x46, 0x33, 0x46, 0x2a, 0x46, + 0x00, 0x21, 0xff, 0xf7, 0xbe, 0xff, 0x01, 0x22, 0x00, 0x92, 0x33, 0x46, + 0x2a, 0x46, 0x01, 0x21, 0x20, 0x46, 0xff, 0xf7, 0xb6, 0xff, 0x73, 0xbd, + 0x00, 0xee, 0x90, 0x0a, 0xf8, 0xee, 0xe0, 0x0a, 0x20, 0xee, 0x80, 0x0a, + 0xb5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xf6, 0xee, 0x00, 0x0a, + 0x06, 0xd5, 0xc9, 0xb2, 0x00, 0x29, 0x14, 0xbf, 0xb1, 0xee, 0x40, 0x0a, + 0xfe, 0xee, 0x00, 0x0a, 0x30, 0xee, 0x20, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, + 0x10, 0xee, 0x10, 0x0a, 0x70, 0x47, 0x01, 0x46, 0x00, 0x20, 0x4a, 0x79, + 0x09, 0x79, 0x39, 0xb9, 0xd1, 0x07, 0x48, 0xbf, 0x08, 0x20, 0x91, 0x07, + 0x09, 0xd5, 0x40, 0xf0, 0x02, 0x00, 0x70, 0x47, 0xd1, 0x07, 0x48, 0xbf, + 0x04, 0x20, 0x91, 0x07, 0x48, 0xbf, 0x40, 0xf0, 0x01, 0x00, 0x70, 0x47, + 0x2d, 0xe9, 0xfa, 0x4f, 0x83, 0x46, 0x0f, 0xf6, 0xe8, 0x00, 0x8f, 0xb0, + 0x91, 0x46, 0x19, 0x79, 0x03, 0x68, 0x8d, 0xf8, 0x0c, 0x10, 0x08, 0xaa, + 0x58, 0x46, 0x13, 0x60, 0x00, 0x27, 0xed, 0xf7, 0x2f, 0xfa, 0x00, 0x21, + 0x88, 0x46, 0x0e, 0x90, 0xad, 0xf8, 0x0e, 0x10, 0x89, 0xf8, 0x47, 0x10, + 0x00, 0x20, 0x10, 0x99, 0x00, 0x90, 0x4c, 0x7a, 0x64, 0x09, 0x04, 0xf0, + 0x01, 0x04, 0x00, 0x26, 0x08, 0xad, 0xbe, 0x42, 0x0e, 0xbf, 0xe9, 0x5d, + 0xa9, 0x5d, 0x01, 0xf0, 0x3f, 0x01, 0x01, 0x22, 0xb2, 0x40, 0xd2, 0xb2, + 0x58, 0x46, 0xfa, 0xf7, 0x2f, 0xfb, 0x76, 0x1c, 0x04, 0x2e, 0xf0, 0xd3, + 0x9d, 0xf8, 0x3c, 0x00, 0xe0, 0xb9, 0x03, 0x2f, 0x3a, 0xd8, 0xdf, 0xe8, + 0x07, 0xf0, 0x02, 0x07, 0x0c, 0x11, 0x9d, 0xf8, 0x0c, 0x20, 0x99, 0xf9, + 0x00, 0x10, 0x0d, 0xe0, 0x9d, 0xf8, 0x0c, 0x20, 0x99, 0xf9, 0x02, 0x10, + 0x08, 0xe0, 0x9d, 0xf8, 0x0c, 0x20, 0x99, 0xf9, 0x01, 0x10, 0x03, 0xe0, + 0x9d, 0xf8, 0x0c, 0x20, 0x99, 0xf9, 0x03, 0x10, 0x58, 0x46, 0xfa, 0xf7, + 0x78, 0xf9, 0x1f, 0xe0, 0x03, 0x2f, 0x1d, 0xd8, 0xdf, 0xe8, 0x07, 0xf0, + 0x02, 0x09, 0x0e, 0x13, 0x00, 0xf0, 0xef, 0xf8, 0x99, 0xf9, 0x00, 0x20, + 0x8d, 0xf8, 0x10, 0x20, 0x0f, 0xe0, 0x00, 0xf0, 0xe8, 0xf8, 0x99, 0xf9, + 0x02, 0x10, 0x08, 0xe0, 0x00, 0xf0, 0xe3, 0xf8, 0x99, 0xf9, 0x01, 0x10, + 0x03, 0xe0, 0x00, 0xf0, 0xde, 0xf8, 0x99, 0xf9, 0x03, 0x10, 0x8d, 0xf8, + 0x10, 0x10, 0x04, 0xa8, 0xfa, 0xf7, 0x96, 0xf9, 0x58, 0x46, 0xfa, 0xf7, + 0x02, 0xfb, 0x58, 0x46, 0xed, 0xf7, 0xca, 0xf9, 0x00, 0x26, 0x09, 0xeb, + 0x47, 0x03, 0xbd, 0xf8, 0x68, 0x10, 0x8d, 0xf8, 0x0d, 0x60, 0xb2, 0x46, + 0x0b, 0x93, 0xb1, 0xb9, 0x58, 0x46, 0xfa, 0xf7, 0xf2, 0xf8, 0x06, 0xab, + 0x07, 0xaa, 0xf9, 0xb2, 0x58, 0x46, 0xfa, 0xf7, 0xbb, 0xf8, 0x07, 0x98, + 0x0b, 0x9a, 0x41, 0x00, 0x91, 0x84, 0x06, 0x98, 0x0b, 0x9a, 0x09, 0x1a, + 0x91, 0x84, 0x77, 0xe0, 0xbd, 0xf8, 0x68, 0xa0, 0x00, 0x27, 0x00, 0x26, + 0x09, 0xe0, 0x00, 0x9d, 0xcd, 0xf8, 0x28, 0x90, 0x0d, 0x94, 0x0c, 0x97, + 0x81, 0x46, 0x05, 0xe0, 0xed, 0xf7, 0xc2, 0xf8, 0x76, 0x1c, 0xb9, 0x46, + 0x0a, 0xf1, 0x01, 0x0a, 0xbd, 0xf8, 0x68, 0x10, 0x1f, 0xfa, 0x8a, 0xf0, + 0x88, 0x42, 0x45, 0xd2, 0x58, 0x46, 0xfa, 0xf7, 0xc8, 0xf8, 0x58, 0x46, + 0xed, 0xf7, 0x90, 0xf9, 0x07, 0x46, 0xed, 0xf7, 0xb6, 0xf8, 0x04, 0x00, + 0x02, 0xbf, 0x0a, 0x99, 0x91, 0xf9, 0x46, 0x00, 0x00, 0x28, 0x15, 0xd1, + 0x00, 0x21, 0xad, 0xf8, 0x24, 0x10, 0x09, 0xa8, 0x02, 0x90, 0x0d, 0xf1, + 0x0e, 0x02, 0x0d, 0xf1, 0x0d, 0x01, 0x01, 0x92, 0x00, 0x91, 0xad, 0x1d, + 0x0c, 0x98, 0x10, 0x9b, 0x0a, 0x9a, 0xc1, 0xb2, 0x58, 0x46, 0x00, 0xf0, + 0x86, 0xfa, 0xbd, 0xf8, 0x24, 0x00, 0x80, 0x44, 0x9d, 0xf8, 0x0d, 0x10, + 0x01, 0x29, 0x04, 0xd1, 0x0d, 0x98, 0x10, 0xb1, 0x0a, 0x98, 0x80, 0xf8, + 0x87, 0x10, 0x00, 0x2c, 0xb6, 0xd1, 0x0a, 0x98, 0x90, 0xf9, 0x87, 0x10, + 0x01, 0x29, 0xb1, 0xd0, 0xb9, 0x45, 0x07, 0xd2, 0x9d, 0xf8, 0x6c, 0x00, + 0x00, 0x28, 0xb7, 0xd1, 0x58, 0x46, 0xfa, 0xf7, 0x8c, 0xfa, 0xb5, 0xe7, + 0x32, 0xb2, 0x52, 0x42, 0x01, 0x21, 0x58, 0x46, 0xed, 0xf7, 0x5a, 0xf9, + 0xdd, 0xf8, 0x28, 0x90, 0x00, 0x95, 0x36, 0xb2, 0xd9, 0xf8, 0x3c, 0x00, + 0x0d, 0x9c, 0x0c, 0x9f, 0x30, 0x18, 0xc9, 0xf8, 0x3c, 0x00, 0x09, 0xeb, + 0x87, 0x00, 0x01, 0x6f, 0x76, 0x18, 0x06, 0x67, 0x1f, 0xfa, 0x8a, 0xf1, + 0xbd, 0xf8, 0x68, 0x00, 0x81, 0x42, 0xff, 0xf4, 0x7c, 0xaf, 0x0b, 0x98, + 0x00, 0x21, 0x81, 0x84, 0x99, 0xf9, 0x87, 0x00, 0x01, 0x28, 0x03, 0xd0, + 0x7f, 0x1c, 0x04, 0x2f, 0xff, 0xf4, 0x0d, 0xaf, 0x99, 0xf9, 0x46, 0x00, + 0x20, 0xbb, 0x10, 0x98, 0x41, 0x7a, 0xbd, 0xf8, 0x68, 0x00, 0xc1, 0xf3, + 0x81, 0x03, 0x9b, 0x1c, 0x00, 0x28, 0x18, 0xbf, 0x00, 0x2c, 0x19, 0xd0, + 0x00, 0x98, 0xdb, 0xb2, 0x81, 0x00, 0x18, 0xfb, 0x03, 0xf0, 0x4a, 0x46, + 0x89, 0xb2, 0x80, 0xb2, 0x00, 0xf0, 0x83, 0xfa, 0x99, 0xf9, 0x47, 0x00, + 0x01, 0x28, 0x0b, 0xd1, 0x01, 0x21, 0x89, 0xf8, 0x87, 0x10, 0x00, 0x20, + 0x00, 0x21, 0x09, 0xf1, 0x24, 0x02, 0x22, 0xf8, 0x10, 0x10, 0x40, 0x1c, + 0x04, 0x28, 0xfa, 0xd3, 0x58, 0x46, 0xed, 0xf7, 0x03, 0xf9, 0xb9, 0xf8, + 0x5e, 0x20, 0x90, 0x44, 0xa9, 0xf8, 0x5e, 0x80, 0x0e, 0x99, 0x40, 0x1a, + 0x11, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x9d, 0xf8, 0x0c, 0x10, 0x8d, 0xf8, + 0x16, 0x10, 0x70, 0x47, 0x2d, 0xe9, 0xfc, 0x41, 0x06, 0x46, 0x0c, 0x46, + 0x17, 0x46, 0x8d, 0xf8, 0x07, 0x60, 0xf9, 0xf7, 0xcd, 0xff, 0xb8, 0x42, + 0x1b, 0xd0, 0x21, 0x46, 0x30, 0x46, 0xfa, 0xf7, 0x86, 0xf8, 0x05, 0x46, + 0x21, 0x46, 0x30, 0x46, 0xfa, 0xf7, 0xb9, 0xf8, 0x01, 0x2f, 0x80, 0x46, + 0x02, 0xd1, 0x00, 0xf0, 0x17, 0xf8, 0x01, 0xe0, 0x00, 0xf0, 0x0d, 0xf8, + 0x3a, 0x46, 0x21, 0x46, 0x30, 0x46, 0xf9, 0xf7, 0xb3, 0xff, 0x17, 0xb9, + 0x00, 0xf0, 0x0c, 0xf8, 0x01, 0xe0, 0x00, 0xf0, 0x02, 0xf8, 0xbd, 0xe8, + 0xf3, 0x81, 0x8d, 0xf8, 0x06, 0x40, 0x8d, 0xf8, 0x00, 0x50, 0x68, 0x46, + 0xfa, 0xf7, 0x8a, 0xb8, 0x22, 0x46, 0x41, 0x46, 0x30, 0x46, 0xfa, 0xf7, + 0x46, 0xb8, 0xb0, 0xb5, 0x93, 0xf9, 0x00, 0x00, 0x3e, 0x30, 0x7d, 0x28, + 0x24, 0xbf, 0x00, 0x20, 0x98, 0x84, 0x93, 0xf9, 0x01, 0x00, 0x3e, 0x30, + 0x7d, 0x28, 0x24, 0xbf, 0x00, 0x20, 0x18, 0x85, 0x93, 0xf9, 0x02, 0x00, + 0x3e, 0x30, 0x7d, 0x28, 0x24, 0xbf, 0x00, 0x20, 0xd8, 0x84, 0x93, 0xf9, + 0x03, 0x00, 0x3e, 0x30, 0x7d, 0x28, 0x03, 0xeb, 0x41, 0x05, 0x24, 0xbf, + 0x00, 0x20, 0x58, 0x85, 0xb3, 0xf8, 0x24, 0xc0, 0xd8, 0x8c, 0x1c, 0x8d, + 0xaf, 0x8a, 0x84, 0x44, 0x58, 0x8d, 0xa4, 0x44, 0x60, 0x44, 0x07, 0x44, + 0xaf, 0x82, 0x58, 0x18, 0xb5, 0xf9, 0x14, 0x40, 0xd4, 0x42, 0x05, 0xda, + 0x02, 0x7b, 0x52, 0x1c, 0x02, 0x73, 0x00, 0x23, 0xab, 0x82, 0x06, 0xe0, + 0xa2, 0x42, 0x04, 0xda, 0x02, 0x7b, 0x53, 0x1e, 0x03, 0x73, 0x00, 0x24, + 0xac, 0x82, 0x3f, 0x22, 0x01, 0x29, 0x04, 0xd0, 0x02, 0x29, 0x16, 0xbf, + 0x03, 0x29, 0x1f, 0x22, 0x0f, 0x22, 0x90, 0xf9, 0x0c, 0x10, 0x8a, 0x42, + 0xb8, 0xbf, 0x11, 0x46, 0x01, 0x73, 0x52, 0x42, 0x90, 0xf9, 0x0c, 0x10, + 0x91, 0x42, 0xa8, 0xbf, 0x0a, 0x46, 0x02, 0x73, 0xb0, 0xbd, 0x70, 0xb5, + 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0x00, 0xf0, 0x4f, 0xf9, 0xa8, 0x79, + 0x30, 0xb1, 0x00, 0x23, 0x06, 0xf1, 0x0c, 0x02, 0x00, 0x21, 0x20, 0x46, + 0x00, 0xf0, 0xd4, 0xf9, 0xe8, 0x79, 0x38, 0xb1, 0x06, 0xf1, 0x0c, 0x02, + 0x20, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x00, 0x23, 0x01, 0x21, 0xc9, 0xe1, + 0x70, 0xbd, 0xf0, 0xb5, 0x96, 0x88, 0x90, 0x8c, 0xd3, 0x88, 0x14, 0x89, + 0x55, 0x89, 0x86, 0x19, 0xd0, 0x8c, 0x96, 0x80, 0x37, 0xb2, 0xc3, 0x18, + 0x10, 0x8d, 0xd3, 0x80, 0x04, 0x19, 0x50, 0x8d, 0x14, 0x81, 0x45, 0x19, + 0x08, 0x46, 0x40, 0x42, 0xb9, 0x42, 0x55, 0x81, 0x02, 0xda, 0x16, 0x78, + 0x76, 0x1e, 0x04, 0xe0, 0x36, 0xb2, 0x86, 0x42, 0x04, 0xda, 0x16, 0x78, + 0x76, 0x1c, 0x16, 0x70, 0x00, 0x27, 0x97, 0x80, 0x1f, 0xb2, 0xb9, 0x42, + 0x05, 0xda, 0x93, 0x78, 0x5b, 0x1c, 0x00, 0x26, 0x93, 0x70, 0xd6, 0x80, + 0x07, 0xe0, 0x1b, 0xb2, 0x83, 0x42, 0x04, 0xda, 0x93, 0x78, 0x5e, 0x1e, + 0x00, 0x27, 0x96, 0x70, 0xd7, 0x80, 0x26, 0xb2, 0xb1, 0x42, 0x05, 0xda, + 0x53, 0x78, 0x5c, 0x1e, 0x00, 0x26, 0x54, 0x70, 0x16, 0x81, 0x07, 0xe0, + 0x24, 0xb2, 0x84, 0x42, 0x04, 0xda, 0x53, 0x78, 0x5b, 0x1c, 0x00, 0x24, + 0x53, 0x70, 0x14, 0x81, 0x2b, 0xb2, 0x99, 0x42, 0x05, 0xda, 0xd0, 0x78, + 0x40, 0x1c, 0x00, 0x21, 0xd0, 0x70, 0x51, 0x81, 0x07, 0xe0, 0x2d, 0xb2, + 0x85, 0x42, 0x04, 0xda, 0xd0, 0x78, 0x41, 0x1e, 0x00, 0x23, 0xd1, 0x70, + 0x53, 0x81, 0x92, 0xf9, 0x00, 0x00, 0x40, 0x28, 0xa8, 0xbf, 0x3f, 0x20, + 0x10, 0x70, 0x6f, 0xf0, 0x3e, 0x00, 0x92, 0xf9, 0x00, 0x30, 0x83, 0x42, + 0xb8, 0xbf, 0x03, 0x46, 0x13, 0x70, 0x92, 0xf9, 0x01, 0x30, 0x40, 0x2b, + 0xa8, 0xbf, 0x3f, 0x23, 0x53, 0x70, 0x92, 0xf9, 0x01, 0x30, 0x83, 0x42, + 0xb8, 0xbf, 0x03, 0x46, 0x53, 0x70, 0x92, 0xf9, 0x02, 0x30, 0x40, 0x2b, + 0xa8, 0xbf, 0x3f, 0x23, 0x93, 0x70, 0x92, 0xf9, 0x02, 0x30, 0x83, 0x42, + 0xb8, 0xbf, 0x03, 0x46, 0x93, 0x70, 0x92, 0xf9, 0x03, 0x30, 0x40, 0x2b, + 0xa8, 0xbf, 0x3f, 0x23, 0xd3, 0x70, 0x92, 0xf9, 0x03, 0x30, 0x83, 0x42, + 0xa8, 0xbf, 0x18, 0x46, 0xd0, 0x70, 0xf0, 0xbd, 0x2d, 0xe9, 0xfc, 0x41, + 0x07, 0x46, 0x09, 0x98, 0x08, 0x9e, 0x00, 0x90, 0x0c, 0x46, 0x11, 0x46, + 0x98, 0x46, 0x33, 0x46, 0x42, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x0f, 0xf8, + 0x00, 0x25, 0x01, 0x2f, 0x08, 0xd1, 0x9d, 0xf9, 0x28, 0x30, 0x00, 0x95, + 0x42, 0x46, 0x31, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x35, 0xf8, 0x05, 0x46, + 0x28, 0x46, 0xbd, 0xe8, 0xf6, 0x81, 0xf0, 0xb5, 0x05, 0x9c, 0x00, 0x25, + 0x04, 0xe0, 0x05, 0xfb, 0x02, 0x66, 0x67, 0x5d, 0x87, 0x55, 0x6d, 0x1c, + 0x0e, 0x68, 0x9d, 0x42, 0xf7, 0xd3, 0x76, 0x1c, 0x96, 0x42, 0x28, 0xbf, + 0x00, 0x26, 0x0e, 0x60, 0xf0, 0xbd, 0xf0, 0xb5, 0x04, 0x46, 0x00, 0x20, + 0x00, 0x27, 0x04, 0xe0, 0xab, 0x1b, 0x83, 0x42, 0xa8, 0xbf, 0x18, 0x46, + 0x7f, 0x1c, 0x8f, 0x42, 0x11, 0xd2, 0x00, 0x23, 0x93, 0x42, 0xf5, 0xd2, + 0x02, 0xfb, 0x07, 0x3c, 0x14, 0xf9, 0x0c, 0xc0, 0x2b, 0xb1, 0x65, 0x45, + 0xb8, 0xbf, 0x65, 0x46, 0x66, 0x45, 0x02, 0xdd, 0x00, 0xe0, 0x65, 0x46, + 0x66, 0x46, 0x5b, 0x1c, 0xee, 0xe7, 0xf0, 0xbd, 0x38, 0xb5, 0x1d, 0x46, + 0xff, 0xf7, 0xdd, 0xff, 0x00, 0x24, 0x01, 0x46, 0x8d, 0x42, 0x04, 0x98, + 0xa8, 0xbf, 0x01, 0x24, 0x60, 0xb1, 0x38, 0x30, 0x90, 0xf9, 0x13, 0x20, + 0x8a, 0x42, 0x02, 0xda, 0x03, 0x88, 0xc1, 0x74, 0x43, 0x75, 0x90, 0xf9, + 0x14, 0x20, 0x8a, 0x42, 0xb8, 0xbf, 0x01, 0x75, 0x20, 0x46, 0x32, 0xbd, + 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0x31, 0x46, 0x28, 0x46, + 0xf9, 0xf7, 0x35, 0xff, 0x60, 0x70, 0x31, 0x46, 0x28, 0x46, 0xf9, 0xf7, + 0xf7, 0xff, 0xa0, 0x70, 0x31, 0x46, 0x28, 0x46, 0xfa, 0xf7, 0x00, 0xf8, + 0xe0, 0x70, 0x31, 0x46, 0x28, 0x46, 0xfa, 0xf7, 0x09, 0xf8, 0x20, 0x71, + 0x31, 0x46, 0x28, 0x46, 0xfa, 0xf7, 0x12, 0xf8, 0x60, 0x71, 0x31, 0x46, + 0x28, 0x46, 0xfa, 0xf7, 0x1b, 0xf8, 0xa0, 0x71, 0x70, 0xbd, 0x02, 0x46, + 0x00, 0x20, 0x0a, 0x40, 0x8a, 0x42, 0x08, 0xbf, 0x01, 0x20, 0x70, 0x47, + 0x70, 0xb5, 0x04, 0x46, 0x20, 0x25, 0x00, 0x26, 0x4f, 0xf4, 0x1d, 0x71, + 0x20, 0x46, 0xff, 0xf7, 0xf0, 0xff, 0x01, 0x28, 0x06, 0xd0, 0x40, 0xf2, + 0x8b, 0x11, 0x20, 0x46, 0xff, 0xf7, 0xe9, 0xff, 0x01, 0x28, 0x05, 0xd1, + 0x76, 0x1c, 0x14, 0x2d, 0xa8, 0xbf, 0xa4, 0x0a, 0x0a, 0x3d, 0x03, 0xe0, + 0x0a, 0x2d, 0xc8, 0xbf, 0x64, 0x08, 0x6d, 0x1e, 0x6d, 0xb2, 0x0a, 0x2d, + 0xe4, 0xda, 0x36, 0x06, 0x70, 0x0e, 0x70, 0xbd, 0x38, 0xb5, 0x14, 0x46, + 0x84, 0xb0, 0x94, 0xf9, 0x01, 0x30, 0xad, 0xf8, 0x06, 0x30, 0x94, 0xf9, + 0x00, 0x50, 0xad, 0xf8, 0x04, 0x50, 0x01, 0x25, 0x94, 0xf9, 0x03, 0x20, + 0xad, 0xf8, 0x02, 0x20, 0x94, 0xf9, 0x02, 0x30, 0xad, 0xf8, 0x00, 0x30, + 0x8d, 0xf8, 0x08, 0x50, 0x09, 0x79, 0xf9, 0xf7, 0xd8, 0xfe, 0x8d, 0xf8, + 0x09, 0x00, 0x68, 0x46, 0x13, 0xf0, 0x72, 0xff, 0x9d, 0xf8, 0x0b, 0x10, + 0x21, 0x73, 0x9d, 0xf8, 0x0c, 0x10, 0x61, 0x73, 0x9d, 0xf8, 0x0a, 0x10, + 0xe1, 0x74, 0x84, 0xf8, 0x40, 0x00, 0x05, 0xb0, 0x30, 0xbd, 0x2d, 0xe9, + 0xfc, 0x41, 0x14, 0x46, 0x04, 0xf1, 0x45, 0x05, 0x80, 0x46, 0x95, 0xf9, + 0x01, 0x00, 0x19, 0x46, 0xe0, 0xb9, 0x0a, 0x9e, 0x08, 0x9f, 0x40, 0x46, + 0xfa, 0xf7, 0x6e, 0xf8, 0x38, 0x70, 0x00, 0x23, 0x2b, 0x70, 0x8d, 0xf8, + 0x00, 0x30, 0x6a, 0x46, 0x21, 0x46, 0x40, 0x46, 0x00, 0xf0, 0x10, 0xf8, + 0x20, 0x6e, 0x9d, 0xf8, 0x00, 0x10, 0x41, 0x18, 0x21, 0x66, 0x30, 0x88, + 0x9d, 0xf8, 0x00, 0x10, 0x41, 0x18, 0x31, 0x80, 0x20, 0x46, 0x41, 0x46, + 0xfa, 0xf7, 0x9e, 0xf8, 0xbd, 0xe8, 0xf3, 0x81, 0x2d, 0xe9, 0xf8, 0x43, + 0x89, 0x46, 0x09, 0xf1, 0x45, 0x05, 0x80, 0x46, 0x95, 0xf9, 0x01, 0x00, + 0x14, 0x46, 0x00, 0x26, 0xe8, 0xb9, 0x00, 0x27, 0x69, 0x46, 0x40, 0x46, + 0xfa, 0xf7, 0x40, 0xf8, 0x03, 0x2f, 0x03, 0xd2, 0x00, 0x98, 0x09, 0xeb, + 0x87, 0x01, 0x48, 0x66, 0x00, 0x98, 0xff, 0xf7, 0x71, 0xff, 0x56, 0xfa, + 0x80, 0xf6, 0x40, 0x46, 0xfa, 0xf7, 0x34, 0xf8, 0x03, 0x2f, 0x03, 0xd2, + 0x29, 0x78, 0xb8, 0x40, 0x08, 0x43, 0x28, 0x70, 0x7f, 0x1c, 0x06, 0x2f, + 0xe4, 0xd3, 0x70, 0x00, 0x20, 0x70, 0xbd, 0xe8, 0xf1, 0x83, 0x13, 0x46, + 0x0a, 0x46, 0x01, 0x46, 0x03, 0xf1, 0x0c, 0x00, 0x2e, 0xe7, 0x88, 0x42, + 0x05, 0xd3, 0x51, 0x6d, 0x01, 0x20, 0x49, 0x1c, 0x82, 0xf8, 0x47, 0x00, + 0x51, 0x65, 0x70, 0x47, 0x2d, 0xe9, 0xff, 0x41, 0x16, 0x46, 0x02, 0xaa, + 0x00, 0x24, 0xc2, 0xe9, 0x00, 0x44, 0x01, 0x2b, 0x8d, 0xf8, 0x07, 0x00, + 0x8d, 0xf8, 0x06, 0x10, 0x52, 0xd1, 0x0a, 0x46, 0x01, 0x46, 0x02, 0xa8, + 0xff, 0xf7, 0x14, 0xff, 0x01, 0x25, 0x02, 0xac, 0x67, 0x57, 0x70, 0x57, + 0xb8, 0x42, 0x4f, 0xf0, 0x01, 0x08, 0x16, 0xda, 0x4f, 0xf0, 0xff, 0x38, + 0x13, 0xe0, 0x30, 0x79, 0x8d, 0xf8, 0x03, 0x00, 0x71, 0x79, 0x8d, 0xf8, + 0x04, 0x10, 0x8d, 0xf8, 0x05, 0x70, 0x06, 0xe0, 0x30, 0x79, 0x8d, 0xf8, + 0x03, 0x00, 0x8d, 0xf8, 0x04, 0x70, 0x8d, 0xf8, 0x05, 0x10, 0x68, 0x46, + 0xf9, 0xf7, 0xb8, 0xfd, 0x47, 0x44, 0x71, 0x57, 0x78, 0xb2, 0x88, 0x42, + 0x26, 0xd0, 0x6a, 0x1e, 0x94, 0xf9, 0x06, 0x10, 0x05, 0x2a, 0xf5, 0xd8, + 0xdf, 0xe8, 0x02, 0xf0, 0x06, 0x0b, 0x14, 0x1a, 0x05, 0x04, 0xef, 0xe7, + 0xdb, 0xe7, 0xe3, 0xe7, 0x8d, 0xf8, 0x00, 0x70, 0xff, 0xf7, 0x7d, 0xfd, + 0xe8, 0xe7, 0xe0, 0x78, 0x8d, 0xf8, 0x01, 0x70, 0x8d, 0xf8, 0x02, 0x00, + 0x68, 0x46, 0xf9, 0xf7, 0x82, 0xfd, 0xdf, 0xe7, 0xb1, 0x78, 0x8d, 0xf8, + 0x01, 0x10, 0x8d, 0xf8, 0x02, 0x70, 0xf5, 0xe7, 0x62, 0x79, 0x8d, 0xf8, + 0x03, 0x70, 0x8d, 0xf8, 0x04, 0x20, 0xce, 0xe7, 0x6d, 0x1c, 0x06, 0x2d, + 0x16, 0xdc, 0xb3, 0xe7, 0x96, 0xf9, 0x01, 0x00, 0x8d, 0xf8, 0x00, 0x00, + 0xb1, 0x78, 0x8d, 0xf8, 0x01, 0x10, 0xf0, 0x78, 0x8d, 0xf8, 0x02, 0x00, + 0x30, 0x79, 0x8d, 0xf8, 0x03, 0x00, 0x70, 0x79, 0x8d, 0xf8, 0x04, 0x00, + 0xb0, 0x79, 0x8d, 0xf8, 0x05, 0x00, 0x68, 0x46, 0xfa, 0xf7, 0x16, 0xf8, + 0xbd, 0xe8, 0xff, 0x81, 0x70, 0xb5, 0x8a, 0x88, 0x82, 0x80, 0xcb, 0x88, + 0xc3, 0x80, 0x0a, 0x89, 0x02, 0x81, 0x4b, 0x89, 0x43, 0x81, 0x0a, 0x78, + 0x02, 0x70, 0x4b, 0x78, 0x43, 0x70, 0x8a, 0x78, 0x82, 0x70, 0x02, 0x22, + 0xcb, 0x78, 0xc3, 0x70, 0x01, 0xeb, 0x42, 0x03, 0x00, 0xeb, 0x42, 0x05, + 0x9c, 0x8a, 0xac, 0x82, 0x8b, 0x18, 0x86, 0x18, 0x1c, 0x7b, 0x34, 0x73, + 0x52, 0x1c, 0x06, 0x2a, 0xf2, 0xdd, 0x70, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, + 0x04, 0x46, 0x0d, 0x46, 0x90, 0x46, 0x1f, 0x46, 0x00, 0x26, 0x29, 0x46, + 0xf0, 0xb2, 0x88, 0x42, 0x05, 0xd0, 0xc1, 0xf1, 0x01, 0x01, 0x88, 0x42, + 0x08, 0xbf, 0x01, 0x2f, 0x11, 0xd1, 0x98, 0xf9, 0x0d, 0x20, 0xf1, 0xb2, + 0x20, 0x46, 0xf9, 0xf7, 0x5e, 0xff, 0x98, 0xf9, 0x0e, 0x20, 0xf1, 0xb2, + 0x20, 0x46, 0xf9, 0xf7, 0x51, 0xff, 0x98, 0xf9, 0x0f, 0x20, 0xf1, 0xb2, + 0x20, 0x46, 0xf9, 0xf7, 0x54, 0xff, 0x76, 0x1c, 0xf0, 0xb2, 0x01, 0x28, + 0xdf, 0xd9, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x00, 0x94, 0x95, 0x84, 0x85, + 0x00, 0x22, 0xec, 0xf7, 0xed, 0xbb, 0x00, 0x00, 0x13, 0xf0, 0x00, 0x4c, + 0x03, 0xd5, 0x5b, 0x42, 0x52, 0x42, 0x63, 0xf1, 0x00, 0x03, 0x9c, 0xea, + 0x21, 0x0c, 0x00, 0xf0, 0x17, 0x80, 0x10, 0xb5, 0x64, 0x46, 0x03, 0xd3, + 0x49, 0x42, 0x40, 0x42, 0x61, 0xf1, 0x00, 0x01, 0x00, 0xf0, 0x0e, 0xf8, + 0x64, 0x00, 0x04, 0xd3, 0x49, 0x42, 0x40, 0x42, 0x61, 0xf1, 0x00, 0x01, + 0x24, 0x42, 0x03, 0xd5, 0x5b, 0x42, 0x52, 0x42, 0x63, 0xf1, 0x00, 0x03, + 0x10, 0xbd, 0x00, 0x00, 0xd3, 0xbb, 0xd9, 0xb1, 0xb2, 0xf5, 0x80, 0x3f, + 0x5b, 0xd2, 0x02, 0x2a, 0x1e, 0xd9, 0x8c, 0x46, 0xb1, 0xfb, 0xf2, 0xf1, + 0x02, 0xfb, 0x11, 0xc3, 0x1b, 0x04, 0x43, 0xea, 0x10, 0x43, 0xb3, 0xfb, + 0xf2, 0xfc, 0x02, 0xfb, 0x1c, 0x33, 0x80, 0xb2, 0x40, 0xea, 0x03, 0x43, + 0xb3, 0xfb, 0xf2, 0xf0, 0x02, 0xfb, 0x10, 0x32, 0x40, 0xea, 0x0c, 0x40, + 0x00, 0x23, 0x70, 0x47, 0x02, 0x2a, 0x05, 0xd9, 0x84, 0x46, 0xb0, 0xfb, + 0xf2, 0xf0, 0x02, 0xfb, 0x10, 0xc2, 0x70, 0x47, 0x4a, 0xb1, 0x05, 0xd1, + 0x00, 0xf0, 0x01, 0x02, 0x49, 0x08, 0x5f, 0xea, 0x30, 0x00, 0x70, 0x47, + 0x00, 0x22, 0x00, 0x23, 0x70, 0x47, 0xec, 0xf7, 0x67, 0xbb, 0x0b, 0x00, + 0x02, 0x00, 0x00, 0x21, 0x00, 0x20, 0x70, 0x47, 0xf7, 0xd3, 0x00, 0x22, + 0x00, 0x23, 0x70, 0x47, 0x90, 0x42, 0x71, 0xeb, 0x03, 0x0c, 0xf2, 0xd3, + 0x70, 0xb5, 0xb1, 0xfa, 0x81, 0xf4, 0xb3, 0xfa, 0x83, 0xf5, 0x2c, 0x1b, + 0xa3, 0x40, 0xc4, 0xf1, 0x20, 0x05, 0x32, 0xfa, 0x05, 0xf6, 0x33, 0x43, + 0xa2, 0x40, 0x5f, 0xf0, 0x00, 0x46, 0xe6, 0x40, 0x02, 0xe0, 0x5b, 0x08, + 0x5f, 0xea, 0x32, 0x02, 0x84, 0x1a, 0x71, 0xeb, 0x03, 0x05, 0x24, 0xbf, + 0x20, 0x46, 0x29, 0x46, 0x76, 0x41, 0xf4, 0xd3, 0x02, 0x00, 0x0b, 0x00, + 0x30, 0x00, 0x00, 0x21, 0x70, 0xbd, 0x70, 0xb5, 0xb1, 0xfa, 0x81, 0xf4, + 0xb2, 0xfa, 0x82, 0xf5, 0xc4, 0xf1, 0x20, 0x04, 0x64, 0x19, 0xb4, 0xf1, + 0x20, 0x06, 0xda, 0xd3, 0xb2, 0x40, 0x5f, 0xf0, 0x00, 0x44, 0xf4, 0x40, + 0x00, 0x25, 0x02, 0xe0, 0x52, 0x08, 0x5f, 0xea, 0x33, 0x03, 0xc6, 0x1a, + 0x71, 0xeb, 0x02, 0x0e, 0x24, 0xbf, 0x30, 0x46, 0x71, 0x46, 0x64, 0x41, + 0x6d, 0x41, 0xf3, 0xd3, 0x02, 0x00, 0x0b, 0x00, 0x20, 0x00, 0x29, 0x00, + 0x70, 0xbd, 0x00, 0x00, 0x00, 0x78, 0x02, 0x40, 0xca, 0x40, 0xd0, 0xb2, + 0x70, 0x47, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, + 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x70, + 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0xdf, 0xf8, 0xe0, 0x0c, 0x01, 0x68, + 0xd1, 0xf8, 0xb8, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x70, 0x47, 0xdf, 0xf8, + 0xd0, 0x0c, 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, 0xc0, 0xf3, 0x07, 0x20, + 0x70, 0x47, 0xdf, 0xf8, 0xc4, 0x2c, 0x52, 0xf8, 0x20, 0x00, 0x01, 0x29, + 0x03, 0xd1, 0x00, 0x21, 0x80, 0xf8, 0x50, 0x10, 0x70, 0x47, 0x01, 0x22, + 0x80, 0xf8, 0x50, 0x20, 0x70, 0x47, 0x70, 0xb5, 0x05, 0x46, 0x00, 0xf0, + 0xdd, 0xfb, 0x28, 0x46, 0x00, 0xf0, 0x12, 0xf8, 0x04, 0x00, 0x0d, 0xd1, + 0xdf, 0xf8, 0x98, 0x0c, 0x2e, 0x46, 0x50, 0xf8, 0x26, 0x00, 0x01, 0xf0, + 0xef, 0xf8, 0xc0, 0x1c, 0xff, 0xf7, 0xc1, 0xff, 0x00, 0x21, 0x28, 0x46, + 0x00, 0xf0, 0x1c, 0xf9, 0x20, 0x46, 0x70, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, + 0xdf, 0xf8, 0x74, 0x1c, 0xdf, 0xf8, 0x68, 0x5c, 0xdf, 0xf8, 0x68, 0x6c, + 0x80, 0x46, 0x51, 0xf8, 0x28, 0x10, 0x00, 0x24, 0x01, 0xf1, 0x74, 0x09, + 0x29, 0x68, 0x02, 0x28, 0x4f, 0xf4, 0x7a, 0x77, 0x13, 0xd1, 0x91, 0xf8, + 0x5a, 0x30, 0x00, 0xf0, 0xe3, 0xfa, 0x99, 0xf8, 0x00, 0x00, 0xb1, 0x68, + 0x00, 0xf0, 0x86, 0xf8, 0xb2, 0x68, 0xd0, 0xf8, 0x56, 0x10, 0x4f, 0x43, + 0x42, 0xf8, 0x34, 0x7f, 0x90, 0xf8, 0x5b, 0x00, 0xd0, 0x75, 0xb1, 0x68, + 0x71, 0xe0, 0x02, 0x00, 0x2a, 0xd1, 0x00, 0x20, 0x00, 0x90, 0x00, 0xf0, + 0x88, 0xf8, 0x28, 0x68, 0x90, 0xf8, 0x85, 0x30, 0x00, 0xf0, 0xc8, 0xfa, + 0x99, 0xf8, 0x00, 0x00, 0x31, 0x68, 0x00, 0xf0, 0x71, 0xf8, 0xd2, 0xf8, + 0x81, 0x00, 0x47, 0x43, 0x30, 0x68, 0x47, 0x63, 0x00, 0x20, 0x00, 0xf0, + 0x99, 0xf8, 0x04, 0x00, 0x5b, 0xd1, 0x00, 0x99, 0x00, 0x20, 0x01, 0xf0, + 0x95, 0xfb, 0x28, 0x68, 0x32, 0x68, 0x90, 0xf8, 0x86, 0x10, 0x82, 0xf8, + 0x4b, 0x10, 0x01, 0x20, 0x37, 0x68, 0x00, 0xf0, 0x60, 0xf8, 0xd2, 0xf8, + 0x5e, 0x00, 0xd2, 0xf8, 0x62, 0x10, 0x2b, 0xe0, 0x01, 0x28, 0x2d, 0xd1, + 0x00, 0x94, 0x01, 0x20, 0x00, 0xf0, 0x5b, 0xf8, 0x28, 0x68, 0x90, 0xf8, + 0xb0, 0x30, 0x00, 0xf0, 0x9b, 0xfa, 0x99, 0xf8, 0x00, 0x00, 0x71, 0x68, + 0x00, 0xf0, 0x44, 0xf8, 0xd2, 0xf8, 0xac, 0x00, 0x47, 0x43, 0x70, 0x68, + 0x47, 0x63, 0x01, 0x20, 0x00, 0xf0, 0x6c, 0xf8, 0x04, 0x00, 0x2e, 0xd1, + 0x00, 0x99, 0x01, 0x20, 0x01, 0xf0, 0x68, 0xfb, 0x28, 0x68, 0x90, 0xf8, + 0xb1, 0x10, 0x70, 0x68, 0x80, 0xf8, 0x4b, 0x10, 0x01, 0x20, 0x77, 0x68, + 0x00, 0xf0, 0x33, 0xf8, 0xd2, 0xf8, 0x89, 0x00, 0xd2, 0xf8, 0x8d, 0x10, + 0x01, 0xf0, 0xf3, 0xf9, 0xb8, 0x60, 0x18, 0xe0, 0x03, 0x28, 0x16, 0xd1, + 0x91, 0xf8, 0x29, 0x3c, 0x00, 0xf0, 0x70, 0xfa, 0x99, 0xf8, 0x00, 0x00, + 0xf1, 0x68, 0x00, 0xf0, 0x13, 0xf8, 0xf2, 0x68, 0xd0, 0xf8, 0x25, 0x1c, + 0x4f, 0x43, 0x42, 0xf8, 0x34, 0x7f, 0x90, 0xf8, 0x2a, 0x0c, 0xd0, 0x75, + 0xf1, 0x68, 0x01, 0xf1, 0x4c, 0x00, 0x04, 0x71, 0x04, 0x60, 0x56, 0xf8, + 0x28, 0x00, 0x41, 0x6b, 0x81, 0x67, 0x47, 0xe2, 0x00, 0xf0, 0x3f, 0x00, + 0x81, 0xf8, 0x30, 0x00, 0x28, 0x68, 0x70, 0x47, 0x00, 0xf0, 0x3f, 0x00, + 0x81, 0xf8, 0x30, 0x00, 0x69, 0x46, 0x2a, 0x68, 0x70, 0x47, 0x00, 0x21, + 0x87, 0xf8, 0x50, 0x00, 0xf9, 0x64, 0x2a, 0x68, 0x70, 0x47, 0x3e, 0xb5, + 0x03, 0x46, 0xdf, 0xf8, 0x04, 0x0b, 0xdf, 0xf8, 0x0c, 0x5b, 0x00, 0x68, + 0x00, 0x24, 0x19, 0x00, 0x0c, 0xbf, 0x90, 0xf8, 0x85, 0x10, 0x90, 0xf8, + 0xb0, 0x10, 0x0a, 0x00, 0x42, 0x69, 0x08, 0xbf, 0x01, 0x21, 0x08, 0x46, + 0xb2, 0xfb, 0xf0, 0xf0, 0xa8, 0x42, 0x09, 0xd3, 0x01, 0x90, 0x00, 0x91, + 0x01, 0x20, 0xdf, 0xf8, 0xe4, 0x2a, 0xb7, 0x21, 0xfb, 0xf7, 0x71, 0xfc, + 0x4b, 0xf2, 0x16, 0x74, 0x20, 0x46, 0x3e, 0xbd, 0x70, 0xb5, 0x0a, 0x46, + 0xdf, 0xf8, 0xbc, 0x1a, 0x09, 0x68, 0x00, 0x23, 0x04, 0x00, 0x26, 0xd0, + 0x01, 0x28, 0x22, 0xd1, 0x91, 0xf8, 0xb0, 0x00, 0x13, 0x60, 0x04, 0x00, + 0x4c, 0x69, 0x00, 0xbf, 0x10, 0xa6, 0x08, 0xbf, 0x01, 0x20, 0xb4, 0xfb, + 0xf0, 0xf4, 0x00, 0x25, 0x56, 0xf8, 0x35, 0x00, 0xb4, 0xfb, 0xf0, 0xf1, + 0x00, 0xfb, 0x11, 0x40, 0x18, 0xb9, 0x11, 0xb1, 0x48, 0x1e, 0x01, 0x42, + 0x03, 0xd0, 0x6d, 0x1c, 0x04, 0x2d, 0xf1, 0xd3, 0x03, 0xe0, 0x06, 0xeb, + 0xc5, 0x00, 0x41, 0x68, 0x11, 0x60, 0x10, 0x68, 0x08, 0xb9, 0x4b, 0xf2, + 0x15, 0x73, 0x18, 0x46, 0x70, 0xbd, 0x91, 0xf8, 0x85, 0x00, 0xd9, 0xe7, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x60, 0xf9, 0xff, 0x00, 0xaf, 0x00, 0x00, + 0x00, 0x66, 0xfd, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x78, 0xff, 0xff, + 0x24, 0xf4, 0x00, 0x00, 0x78, 0x97, 0xfe, 0xff, 0x2d, 0xe9, 0xf8, 0x4f, + 0x06, 0x46, 0xdf, 0xf8, 0x40, 0x0a, 0xb2, 0x46, 0x50, 0xf8, 0x2a, 0x40, + 0x0d, 0x46, 0x67, 0x1c, 0x2b, 0x46, 0x80, 0x22, 0x07, 0x21, 0x00, 0xf0, + 0xa5, 0xff, 0x2b, 0x46, 0x00, 0xf0, 0xa0, 0xff, 0x2b, 0x46, 0x20, 0x22, + 0x05, 0x21, 0x00, 0xf0, 0x9d, 0xff, 0x2b, 0x46, 0x10, 0x22, 0x04, 0x21, + 0x00, 0xf0, 0x98, 0xff, 0x2b, 0x46, 0x04, 0x22, 0x02, 0x21, 0x00, 0xf0, + 0x93, 0xff, 0x2b, 0x46, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0x8e, 0xff, + 0x2b, 0x46, 0x08, 0x22, 0x03, 0x21, 0x04, 0xf1, 0x9d, 0x00, 0xff, 0xf7, + 0x74, 0xfe, 0x04, 0xf1, 0x8c, 0x07, 0x2b, 0x46, 0x02, 0x22, 0x01, 0x21, + 0x00, 0xf0, 0x80, 0xff, 0x00, 0xf0, 0xf4, 0xfc, 0xa0, 0x1c, 0xff, 0xf7, + 0x68, 0xfe, 0x30, 0x46, 0x00, 0xf0, 0x11, 0xf9, 0x04, 0xf1, 0x6d, 0x08, + 0x00, 0x23, 0x00, 0xf0, 0x9b, 0xf9, 0x01, 0x23, 0x00, 0xf0, 0x98, 0xf9, + 0x00, 0x23, 0x80, 0x22, 0x07, 0x21, 0x00, 0xf0, 0x95, 0xf9, 0x00, 0xf0, + 0x40, 0xff, 0x00, 0xf0, 0x91, 0xf9, 0x00, 0x20, 0x20, 0x70, 0xff, 0x21, + 0x21, 0x70, 0x00, 0x23, 0x00, 0xf0, 0xeb, 0xf8, 0x01, 0x23, 0x00, 0xf0, + 0xe8, 0xf8, 0x00, 0x23, 0x80, 0x22, 0x07, 0x21, 0x00, 0xf0, 0x45, 0xfa, + 0x00, 0xf0, 0x2d, 0xff, 0x00, 0xf0, 0x41, 0xfa, 0x01, 0x23, 0x40, 0x22, + 0x06, 0x21, 0x04, 0xf1, 0x75, 0x00, 0xff, 0xf7, 0x3a, 0xfe, 0x03, 0x23, + 0x0c, 0x22, 0x02, 0x21, 0x04, 0xf1, 0x26, 0x00, 0xff, 0xf7, 0x33, 0xfe, + 0x20, 0x23, 0xff, 0x22, 0x00, 0x21, 0x04, 0xf1, 0x77, 0x00, 0xff, 0xf7, + 0x2c, 0xfe, 0xa1, 0x23, 0xff, 0x22, 0x00, 0x21, 0x04, 0xf1, 0x78, 0x00, + 0xff, 0xf7, 0x25, 0xfe, 0x07, 0x23, 0xff, 0x22, 0x00, 0x21, 0x04, 0xf1, + 0x79, 0x00, 0xff, 0xf7, 0x1e, 0xfe, 0x04, 0xf1, 0x0f, 0x06, 0x02, 0x23, + 0x00, 0xf0, 0xbc, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0xa3, 0xfc, 0x04, 0xf1, + 0x18, 0x06, 0x06, 0x23, 0xe0, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x9e, 0xfc, + 0x03, 0x23, 0x18, 0x22, 0x03, 0x21, 0x00, 0xf0, 0x99, 0xfc, 0x08, 0x23, + 0x7f, 0x22, 0x00, 0x21, 0x04, 0xf1, 0x76, 0x00, 0xff, 0xf7, 0x03, 0xfe, + 0x04, 0xf1, 0x11, 0x09, 0x00, 0xf0, 0x35, 0xf9, 0x04, 0xf1, 0x10, 0x06, + 0x08, 0x23, 0x00, 0xf0, 0x9d, 0xf8, 0x06, 0x23, 0x00, 0xf0, 0x84, 0xfc, + 0x01, 0x23, 0x03, 0x22, 0x00, 0xf0, 0x33, 0xf9, 0x00, 0x23, 0x04, 0x22, + 0x02, 0x21, 0x00, 0xf0, 0x27, 0xf9, 0x04, 0xf1, 0x89, 0x06, 0x01, 0x23, + 0x30, 0x22, 0x00, 0xf0, 0x76, 0xfc, 0x00, 0xf0, 0x78, 0xfc, 0x03, 0x23, + 0x18, 0x22, 0x03, 0x21, 0x04, 0xf1, 0x23, 0x00, 0xff, 0xf7, 0xdf, 0xfd, + 0x01, 0x23, 0x04, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x69, 0xfc, 0xe6, 0x1c, + 0x01, 0xf0, 0xed, 0xf9, 0x00, 0xf0, 0x04, 0xff, 0x0a, 0x23, 0x0f, 0x22, + 0x00, 0x21, 0x04, 0xf1, 0x92, 0x00, 0xff, 0xf7, 0xce, 0xfd, 0x00, 0xf0, + 0x73, 0xf8, 0x04, 0xf1, 0x8b, 0x0b, 0x01, 0x23, 0x04, 0x22, 0x02, 0x21, + 0x01, 0xf0, 0x60, 0xf8, 0x00, 0xf0, 0xa9, 0xfe, 0x01, 0xf0, 0x5c, 0xf8, + 0x00, 0x23, 0xe0, 0x22, 0x05, 0x21, 0x01, 0xf0, 0x57, 0xf8, 0x01, 0x23, + 0x30, 0x22, 0x04, 0x21, 0x00, 0xf0, 0xca, 0xfe, 0x00, 0xf0, 0xeb, 0xf8, + 0x04, 0xf1, 0x0e, 0x07, 0x00, 0xf0, 0xc1, 0xfe, 0x20, 0x23, 0x00, 0xf0, + 0x17, 0xfb, 0x0f, 0x23, 0xf0, 0x22, 0x04, 0x21, 0x04, 0xf1, 0x21, 0x00, + 0xff, 0xf7, 0xa7, 0xfd, 0x00, 0xf0, 0x2e, 0xfc, 0x04, 0xf1, 0x20, 0x00, + 0xff, 0xf7, 0xa1, 0xfd, 0x00, 0xf0, 0xd1, 0xf8, 0x04, 0xf1, 0x87, 0x00, + 0xff, 0xf7, 0x9b, 0xfd, 0x00, 0x23, 0xc0, 0x22, 0x06, 0x21, 0x04, 0xf1, + 0x0b, 0x00, 0xff, 0xf7, 0x94, 0xfd, 0x2b, 0x46, 0x40, 0x22, 0x06, 0x21, + 0x00, 0xf0, 0x2f, 0xf8, 0x2b, 0x46, 0x20, 0x22, 0x05, 0x21, 0x00, 0xf0, + 0x2a, 0xf8, 0x01, 0xf0, 0x9e, 0xf9, 0x00, 0xf0, 0xb5, 0xfe, 0x04, 0xf1, + 0x72, 0x07, 0x00, 0xf0, 0x29, 0xf8, 0x00, 0xf0, 0x18, 0xfc, 0x00, 0xf0, + 0x91, 0xfe, 0x00, 0x23, 0x40, 0x22, 0x06, 0x21, 0x00, 0xf0, 0xb6, 0xf8, + 0x01, 0xf0, 0x1a, 0xf8, 0x00, 0xf0, 0xb2, 0xf8, 0xae, 0x34, 0x00, 0xf0, + 0x4a, 0xf8, 0x00, 0xf0, 0x70, 0xf9, 0x00, 0xf0, 0xf7, 0xfb, 0x00, 0xf0, + 0x6c, 0xf9, 0xdf, 0xf8, 0xd8, 0x17, 0x51, 0xf8, 0x2a, 0x20, 0x68, 0x1e, + 0x80, 0x41, 0xc0, 0x0f, 0xd0, 0x62, 0xbd, 0xe8, 0xf1, 0x8f, 0x80, 0x22, + 0x07, 0x21, 0x04, 0xf1, 0x6f, 0x00, 0x5c, 0xe5, 0x0f, 0x22, 0x00, 0x21, + 0x30, 0x46, 0x58, 0xe5, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x38, 0x46, + 0x53, 0xe5, 0x38, 0xb5, 0xdf, 0xf8, 0xa8, 0x17, 0x51, 0xf8, 0x20, 0x40, + 0x65, 0x1c, 0x00, 0xf0, 0xe4, 0xfb, 0x01, 0xf0, 0x0c, 0xf8, 0x00, 0xf0, + 0x2e, 0xfe, 0x01, 0xf0, 0x08, 0xf8, 0x04, 0xf1, 0x8d, 0x05, 0x00, 0xf0, + 0x1a, 0xf8, 0x01, 0xf0, 0x02, 0xf8, 0x00, 0xf0, 0xc7, 0xfb, 0x00, 0xf0, + 0xfe, 0xff, 0x04, 0xf1, 0x8b, 0x05, 0x00, 0xf0, 0xf7, 0xff, 0x01, 0x23, + 0x00, 0xf0, 0xf5, 0xff, 0x9d, 0x34, 0x00, 0xf0, 0x64, 0xf8, 0x00, 0xf0, + 0x30, 0xf9, 0x20, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x00, 0x23, + 0x01, 0x22, 0x01, 0xf0, 0x68, 0xb9, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, + 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x43, 0xdf, 0xf8, 0x48, 0x07, 0xdf, 0xf8, + 0x3c, 0x77, 0xc6, 0x68, 0xdf, 0xf8, 0x38, 0x57, 0x06, 0xf1, 0xae, 0x08, + 0x00, 0xf0, 0x49, 0xf8, 0x00, 0xf0, 0x52, 0xf8, 0x06, 0xf1, 0x03, 0x09, + 0x01, 0x23, 0x01, 0x22, 0x00, 0xf0, 0x4f, 0xf8, 0x3a, 0x68, 0x02, 0xf6, + 0x0a, 0x43, 0x18, 0x68, 0x59, 0x68, 0xeb, 0x68, 0xc3, 0xe9, 0x04, 0x01, + 0xc3, 0xe9, 0x00, 0x01, 0x92, 0xf8, 0x12, 0x0c, 0x83, 0xf8, 0x38, 0x00, + 0x03, 0x20, 0x00, 0xf0, 0x6d, 0xfa, 0x04, 0x00, 0x1c, 0xd1, 0x38, 0x68, + 0x90, 0xf8, 0x14, 0x3c, 0x72, 0x36, 0x20, 0x22, 0x05, 0x21, 0x00, 0xf0, + 0x83, 0xfb, 0x38, 0x68, 0x90, 0xf8, 0x13, 0x3c, 0x10, 0x22, 0x00, 0xf0, + 0x7c, 0xfb, 0x38, 0x68, 0x90, 0xf8, 0x12, 0x3c, 0xfc, 0x22, 0x02, 0x21, + 0x00, 0xf0, 0x24, 0xf8, 0xe9, 0x68, 0x03, 0x20, 0x03, 0xf0, 0x74, 0xfe, + 0x03, 0x20, 0x00, 0xf0, 0x6b, 0xf9, 0x04, 0x46, 0x64, 0xb9, 0x03, 0x20, + 0x00, 0xf0, 0x78, 0xfb, 0x04, 0x46, 0x3c, 0xb9, 0x00, 0xf0, 0x02, 0xfe, + 0x00, 0xf0, 0x12, 0xf8, 0x00, 0xf0, 0xfe, 0xfd, 0x00, 0xf0, 0x0a, 0xf8, + 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, + 0x70, 0x47, 0x01, 0x23, 0x08, 0x22, 0x03, 0x21, 0x48, 0x46, 0xc4, 0xe4, + 0x20, 0x22, 0x05, 0x21, 0x40, 0x46, 0xc0, 0xe4, 0x3f, 0x22, 0x00, 0x21, + 0x48, 0x46, 0xbc, 0xe4, 0x2d, 0xe9, 0xfe, 0x4f, 0x81, 0x46, 0x8a, 0x46, + 0x00, 0x20, 0x01, 0x90, 0x90, 0x46, 0xdf, 0xf8, 0x40, 0x1c, 0xdf, 0xf8, + 0x64, 0x56, 0x91, 0xf8, 0x2c, 0x00, 0x00, 0x90, 0x48, 0x46, 0x2c, 0x68, + 0x04, 0xf1, 0x2c, 0x06, 0x51, 0x46, 0xf2, 0x7d, 0x37, 0x78, 0x00, 0xf0, + 0x62, 0xff, 0x4f, 0xf0, 0x00, 0x0b, 0xba, 0x1c, 0x4b, 0xf1, 0x00, 0x03, + 0xff, 0xf7, 0x16, 0xfc, 0x72, 0x78, 0x00, 0x23, 0x52, 0x00, 0xff, 0xf7, + 0x11, 0xfc, 0x00, 0x99, 0xc4, 0xf8, 0x3b, 0x90, 0x01, 0x26, 0x07, 0x46, + 0x06, 0xfa, 0x01, 0xf1, 0xc4, 0xf8, 0x3f, 0xa0, 0xb7, 0xfb, 0xf1, 0xfb, + 0x28, 0x68, 0x0f, 0xf2, 0x88, 0x0a, 0x4f, 0xf4, 0x7a, 0x71, 0xb7, 0xfb, + 0xf1, 0xf1, 0x01, 0x61, 0x04, 0x25, 0xfb, 0xf7, 0xf7, 0xf9, 0x00, 0xf0, + 0x6c, 0xfd, 0xdf, 0xf8, 0xdc, 0x0b, 0xff, 0xf7, 0x7e, 0xfc, 0xdd, 0xf8, + 0x04, 0x90, 0x00, 0x9c, 0xdf, 0xf8, 0xd0, 0x0b, 0x83, 0x45, 0x14, 0xd3, + 0x64, 0x1c, 0xe3, 0xb2, 0x03, 0x22, 0x00, 0x21, 0xdf, 0xf8, 0xc4, 0x0b, + 0xff, 0xf7, 0x6f, 0xfc, 0x06, 0xfa, 0x04, 0xf0, 0x04, 0x2c, 0xb7, 0xfb, + 0xf0, 0xfb, 0x06, 0xd3, 0x52, 0x46, 0xb7, 0x21, 0x03, 0x20, 0xfb, 0xf7, + 0xee, 0xf9, 0x4b, 0xf2, 0x0f, 0x79, 0x6d, 0x1e, 0xe4, 0xd1, 0xb8, 0xf1, + 0x01, 0x0f, 0x4d, 0x46, 0x04, 0xd1, 0x02, 0x20, 0xff, 0xf7, 0x05, 0xff, + 0x00, 0xf0, 0x1a, 0xf8, 0x02, 0xf0, 0xff, 0xfe, 0x3d, 0xb9, 0x01, 0x20, + 0x01, 0xf0, 0xb3, 0xfe, 0x00, 0x21, 0x01, 0x20, 0x02, 0xf0, 0xbe, 0xff, + 0x05, 0x46, 0x28, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, 0x41, 0x72, 0x6d, 0x20, + 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x6f, 0x20, + 0x66, 0x61, 0x73, 0x74, 0x0a, 0x00, 0x00, 0x00, 0x70, 0xb5, 0xdf, 0xf8, + 0x7c, 0x05, 0xdf, 0xf8, 0x70, 0x65, 0x84, 0x68, 0x30, 0x68, 0xdf, 0xf8, + 0x6c, 0x55, 0x90, 0xf8, 0x43, 0x10, 0xa8, 0x68, 0x80, 0xf8, 0x38, 0x10, + 0x32, 0x68, 0xd2, 0xf8, 0x3b, 0x00, 0xd2, 0xf8, 0x3f, 0x10, 0xaa, 0x68, + 0xc2, 0xe9, 0x04, 0x01, 0xc2, 0xe9, 0x00, 0x01, 0x02, 0x20, 0x00, 0xf0, + 0x91, 0xf9, 0xe0, 0xb9, 0x30, 0x68, 0x90, 0xf8, 0x43, 0x10, 0x72, 0x34, + 0x01, 0x29, 0x03, 0xd1, 0x00, 0xf0, 0xcb, 0xfe, 0x01, 0x23, 0x02, 0xe0, + 0x00, 0xf0, 0x12, 0xf8, 0x00, 0x23, 0x10, 0x22, 0x04, 0x21, 0x00, 0xf0, + 0x10, 0xf8, 0xa9, 0x68, 0x02, 0x20, 0x03, 0xf0, 0x9d, 0xfd, 0x02, 0x20, + 0x00, 0xf0, 0x94, 0xf8, 0x18, 0xb9, 0xbd, 0xe8, 0x70, 0x40, 0x02, 0x20, + 0xa0, 0xe2, 0x70, 0xbd, 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0xfd, 0xbb, 0xdf, 0xf8, 0x14, 0x0d, 0xc1, 0x68, 0x02, 0xe0, + 0xdf, 0xf8, 0xf0, 0x04, 0x81, 0x68, 0xd1, 0xe9, 0x04, 0x01, 0x70, 0x47, + 0xf8, 0xb5, 0x06, 0x46, 0x03, 0x20, 0x0d, 0xf0, 0xcd, 0xfe, 0xdf, 0xf8, + 0xdc, 0x54, 0x04, 0x46, 0x37, 0x46, 0x55, 0xf8, 0x27, 0x00, 0xb0, 0x21, + 0xff, 0xf7, 0x36, 0xfb, 0x55, 0xf8, 0x27, 0x00, 0x00, 0xf1, 0x85, 0x01, + 0x00, 0x22, 0x0a, 0x70, 0xc2, 0x62, 0xff, 0x20, 0xc8, 0x77, 0x30, 0x46, + 0x55, 0xf8, 0x27, 0x10, 0x03, 0xf0, 0x40, 0xfd, 0x55, 0xf8, 0x27, 0x00, + 0x00, 0x21, 0x81, 0x66, 0xc1, 0x67, 0x30, 0x00, 0x18, 0xbf, 0x01, 0x2e, + 0xdf, 0xf8, 0x40, 0x1d, 0x08, 0xd1, 0x28, 0x69, 0x10, 0xbb, 0x1c, 0xb1, + 0x01, 0xf1, 0xd8, 0x00, 0x28, 0x61, 0xf1, 0xbd, 0x29, 0x61, 0xf1, 0xbd, + 0x02, 0x2e, 0x07, 0xd1, 0x1c, 0xb1, 0x01, 0xf5, 0x90, 0x70, 0x68, 0x61, + 0xf1, 0xbd, 0x48, 0x31, 0x69, 0x61, 0xf1, 0xbd, 0x03, 0x2e, 0x07, 0xd1, + 0x1c, 0xb1, 0x01, 0xf5, 0xb4, 0x70, 0xa8, 0x61, 0xf1, 0xbd, 0x90, 0x31, + 0xa9, 0x61, 0xf1, 0xbd, 0xbd, 0xe8, 0xf8, 0x40, 0x03, 0x22, 0x4b, 0xf2, + 0x03, 0x71, 0x01, 0x20, 0x08, 0xf0, 0xa8, 0xbc, 0xf1, 0xbd, 0xf8, 0xb5, + 0x00, 0xf0, 0xe6, 0xff, 0x23, 0x78, 0x05, 0xf1, 0x13, 0x06, 0x3f, 0x22, + 0xff, 0xf7, 0x41, 0xfe, 0x05, 0xf1, 0x12, 0x07, 0x63, 0x78, 0x00, 0xf0, + 0x01, 0xf9, 0x23, 0x79, 0x3f, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x15, 0x00, + 0xff, 0xf7, 0x91, 0xfb, 0x63, 0x79, 0x3f, 0x22, 0x00, 0x21, 0x05, 0xf1, + 0x14, 0x00, 0xff, 0xf7, 0x8a, 0xfb, 0xa3, 0x79, 0x3f, 0x22, 0x00, 0x21, + 0x05, 0xf1, 0x16, 0x00, 0xff, 0xf7, 0x83, 0xfb, 0xa3, 0x78, 0x40, 0x22, + 0x06, 0x21, 0x00, 0xf0, 0x0d, 0xfa, 0xe3, 0x78, 0x38, 0x46, 0x01, 0xb0, + 0xbd, 0xe8, 0xf0, 0x40, 0x40, 0x22, 0x06, 0x21, 0xff, 0xf7, 0x75, 0xbb, + 0x2d, 0xe9, 0xf8, 0x46, 0x07, 0x46, 0xdf, 0xf8, 0xe8, 0x13, 0xdf, 0xf8, + 0xe0, 0xa3, 0x3e, 0x46, 0x51, 0xf8, 0x26, 0x50, 0x02, 0x20, 0x05, 0xf0, + 0xcc, 0xf9, 0x5a, 0xf8, 0x26, 0x00, 0x01, 0x6f, 0x00, 0x24, 0x01, 0x29, + 0x07, 0xd1, 0x43, 0x6f, 0xdb, 0xb2, 0x3f, 0x22, 0x00, 0x21, 0x05, 0xf1, + 0x74, 0x00, 0xff, 0xf7, 0x5a, 0xfb, 0x5a, 0xf8, 0x26, 0x00, 0x90, 0xed, + 0x0d, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xdf, 0xed, 0xc3, 0x0a, 0x60, 0xee, + 0x20, 0x0a, 0xfc, 0xee, 0xe0, 0x0a, 0x10, 0xee, 0x90, 0x0a, 0x0d, 0xf0, + 0xf3, 0xfd, 0x03, 0x46, 0xc0, 0xb2, 0xff, 0x28, 0x0c, 0xbf, 0x00, 0x23, + 0x5b, 0x1c, 0xdb, 0xb2, 0x70, 0x22, 0x04, 0x21, 0x00, 0xf0, 0x46, 0xfc, + 0x5a, 0xf8, 0x26, 0x10, 0x91, 0xf8, 0xac, 0x00, 0x10, 0xb1, 0x38, 0x46, + 0x0a, 0xf0, 0x2f, 0xff, 0x5a, 0xf8, 0x26, 0x00, 0x90, 0xf8, 0x3d, 0x30, + 0xff, 0x22, 0x00, 0x21, 0xa8, 0x1d, 0xff, 0xf7, 0x2e, 0xfb, 0x5a, 0xf8, + 0x26, 0x00, 0x90, 0xf8, 0x3e, 0x30, 0xff, 0x22, 0x00, 0x21, 0xe8, 0x1d, + 0xff, 0xf7, 0x25, 0xfb, 0x5a, 0xf8, 0x26, 0x00, 0x90, 0xf8, 0x3f, 0x30, + 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x08, 0x00, 0xff, 0xf7, 0x1b, 0xfb, + 0x5a, 0xf8, 0x26, 0x00, 0x90, 0xf8, 0x40, 0x30, 0xff, 0x22, 0x00, 0x21, + 0x05, 0xf1, 0x09, 0x00, 0xff, 0xf7, 0x11, 0xfb, 0x5a, 0xf8, 0x26, 0x00, + 0x90, 0xf8, 0x42, 0x30, 0x07, 0x22, 0x00, 0x21, 0x68, 0x1d, 0xff, 0xf7, + 0x08, 0xfb, 0x5a, 0xf8, 0x26, 0x00, 0x90, 0xf8, 0x41, 0x30, 0xff, 0x22, + 0x00, 0x21, 0x28, 0x1d, 0xff, 0xf7, 0xff, 0xfa, 0x01, 0x23, 0x10, 0x22, + 0x04, 0x21, 0x05, 0xf1, 0x6b, 0x00, 0xff, 0xf7, 0xf8, 0xfa, 0x5a, 0xf8, + 0x26, 0x20, 0x92, 0xf8, 0x3a, 0x10, 0x05, 0xf1, 0x68, 0x07, 0x05, 0xf1, + 0x6c, 0x00, 0x19, 0xb9, 0x00, 0xf0, 0x83, 0xfd, 0x00, 0x23, 0x05, 0xe0, + 0x00, 0xf0, 0x90, 0xfd, 0x5a, 0xf8, 0x26, 0x00, 0x90, 0xf8, 0x3a, 0x30, + 0x00, 0xf0, 0x4c, 0xf8, 0x00, 0xf0, 0xa0, 0xfd, 0x05, 0xf1, 0x1b, 0x09, + 0x00, 0xf0, 0x89, 0xfd, 0x00, 0x23, 0x00, 0x22, 0x0a, 0x21, 0x02, 0x20, + 0x05, 0xf0, 0x45, 0xf9, 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x1a, 0x00, + 0xff, 0xf7, 0xcc, 0xfa, 0x07, 0x46, 0x07, 0x22, 0x00, 0x21, 0x48, 0x46, + 0xff, 0xf7, 0xc6, 0xfa, 0x07, 0x43, 0x05, 0xd0, 0x00, 0xf0, 0xaa, 0xfb, + 0x00, 0x28, 0xed, 0xd0, 0x4b, 0xf2, 0x14, 0x74, 0x01, 0x23, 0x00, 0xf0, + 0x80, 0xfd, 0x04, 0xbb, 0x5a, 0xf8, 0x26, 0x10, 0x91, 0xf8, 0x84, 0x20, + 0x01, 0x2a, 0x0c, 0xbf, 0x01, 0x23, 0x02, 0x23, 0x05, 0xf1, 0x95, 0x00, + 0x03, 0x22, 0x00, 0xf0, 0xce, 0xfb, 0x5a, 0xf8, 0x26, 0x00, 0x90, 0xf8, + 0x44, 0x30, 0x1f, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x1f, 0x00, 0xff, 0xf7, + 0xa8, 0xfa, 0x5a, 0xf8, 0x26, 0x00, 0x90, 0xf8, 0x43, 0x30, 0x0f, 0x22, + 0x00, 0x21, 0x05, 0xf1, 0x96, 0x00, 0xff, 0xf7, 0x9e, 0xfa, 0x02, 0x20, + 0x05, 0xf0, 0x7d, 0xf9, 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x86, 0x12, 0x23, + 0x3f, 0x22, 0x00, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x92, 0xba, 0x00, 0x00, + 0x2d, 0xe9, 0xf9, 0x47, 0x80, 0x46, 0x87, 0x4d, 0x60, 0xa0, 0x82, 0xb0, + 0x55, 0xf8, 0x28, 0x40, 0x50, 0xf8, 0x28, 0x60, 0xd4, 0xe9, 0x04, 0x01, + 0x00, 0xf0, 0x3d, 0xfd, 0x00, 0x22, 0x91, 0x42, 0x01, 0xd8, 0xb0, 0x42, + 0x03, 0xd3, 0x01, 0x27, 0x84, 0xf8, 0x84, 0x70, 0x01, 0xe0, 0x84, 0xf8, + 0x84, 0x20, 0x04, 0xf1, 0x38, 0x00, 0x86, 0x64, 0xc4, 0xe9, 0x00, 0x22, + 0x01, 0x78, 0x4e, 0x1e, 0x86, 0x70, 0x9d, 0xf8, 0x08, 0x00, 0x00, 0xf0, + 0xb4, 0xfe, 0x82, 0x46, 0x55, 0xf8, 0x28, 0x00, 0x00, 0x90, 0x00, 0x23, + 0x9d, 0xf8, 0x08, 0x00, 0x00, 0x9e, 0x55, 0xf8, 0x20, 0x10, 0xd1, 0xf8, + 0x34, 0x90, 0xd6, 0xe9, 0x04, 0x47, 0x20, 0x46, 0x39, 0x46, 0x4a, 0x46, + 0xff, 0xf7, 0xd0, 0xf9, 0x06, 0x46, 0x20, 0x46, 0x39, 0x46, 0x4a, 0x46, + 0x00, 0xf0, 0x0f, 0xfd, 0x14, 0x46, 0x4f, 0xea, 0x4a, 0x02, 0x4f, 0xea, + 0xda, 0x73, 0xa2, 0xfb, 0x04, 0x01, 0x03, 0xfb, 0x04, 0x11, 0x4a, 0x46, + 0x00, 0xf0, 0x03, 0xfd, 0x00, 0x27, 0x40, 0x1c, 0x61, 0xf1, 0xff, 0x31, + 0x49, 0x08, 0x4f, 0xea, 0x30, 0x00, 0x00, 0x99, 0x50, 0x45, 0x04, 0xbf, + 0x00, 0x20, 0x76, 0x1c, 0x81, 0xf8, 0x3d, 0x00, 0x02, 0x0a, 0x55, 0xf8, + 0x28, 0x10, 0x81, 0xf8, 0x3e, 0x20, 0x02, 0x0c, 0x55, 0xf8, 0x28, 0x10, + 0x81, 0xf8, 0x3f, 0x20, 0x00, 0x0e, 0x55, 0xf8, 0x28, 0x10, 0xdf, 0xf8, + 0x90, 0x2c, 0x81, 0xf8, 0x40, 0x00, 0x30, 0x04, 0x55, 0xf8, 0x28, 0x10, + 0x00, 0x0e, 0x00, 0xf0, 0x07, 0x00, 0x81, 0xf8, 0x42, 0x00, 0x00, 0x23, + 0x55, 0xf8, 0x28, 0x00, 0x80, 0xf8, 0x41, 0x60, 0x00, 0x24, 0x55, 0xf8, + 0x28, 0x10, 0xd1, 0xe9, 0x04, 0x01, 0xff, 0xf7, 0x8b, 0xf9, 0x06, 0x46, + 0x9d, 0xf8, 0x08, 0x00, 0x00, 0x28, 0x18, 0xbf, 0x01, 0x28, 0x89, 0x46, + 0x0e, 0xd0, 0x02, 0x28, 0x08, 0xbf, 0x6c, 0x69, 0x0b, 0xd0, 0x03, 0x28, + 0x08, 0xbf, 0xac, 0x69, 0x07, 0xd0, 0x03, 0x22, 0x4b, 0xf2, 0x03, 0x71, + 0x01, 0x20, 0x08, 0xf0, 0xff, 0xfa, 0x01, 0xe0, 0x2c, 0x69, 0x09, 0x27, + 0xa4, 0x46, 0xbe, 0x46, 0x00, 0x24, 0x00, 0x21, 0x00, 0x23, 0x00, 0xe0, + 0x64, 0x1c, 0x74, 0x45, 0x0c, 0xeb, 0xc4, 0x07, 0x0a, 0xd0, 0x3a, 0x88, + 0x99, 0x45, 0x01, 0xd8, 0x96, 0x42, 0xf5, 0xd3, 0x78, 0x88, 0x49, 0x45, + 0xf2, 0xd3, 0x01, 0xd8, 0xb0, 0x42, 0xef, 0xd3, 0x55, 0xf8, 0x28, 0x00, + 0x3a, 0x79, 0x80, 0xf8, 0x44, 0x20, 0x55, 0xf8, 0x28, 0x00, 0x79, 0x79, + 0x80, 0xf8, 0x43, 0x10, 0x55, 0xf8, 0x28, 0x00, 0xb9, 0x79, 0x80, 0xf8, + 0x47, 0x10, 0x55, 0xf8, 0x28, 0x00, 0xf9, 0x79, 0x80, 0xf8, 0x45, 0x10, + 0x00, 0x20, 0x04, 0xb0, 0xbd, 0xe8, 0xf0, 0x87, 0x9a, 0xab, 0x8b, 0x31, + 0xd0, 0x59, 0x99, 0x00, 0xd0, 0x59, 0x99, 0x00, 0xd0, 0x59, 0x99, 0x00, + 0xe0, 0x79, 0xaf, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0x07, 0x46, 0x21, 0x48, + 0x50, 0xf8, 0x27, 0x60, 0x0c, 0x46, 0x00, 0x23, 0x00, 0x22, 0x42, 0xf2, + 0x10, 0x71, 0x20, 0x46, 0x05, 0xf0, 0x23, 0xf8, 0x06, 0xf1, 0xa7, 0x08, + 0x01, 0x23, 0x0f, 0x22, 0x00, 0x21, 0xff, 0xf7, 0xeb, 0xfc, 0x0f, 0x23, + 0xf0, 0x22, 0x04, 0x21, 0xff, 0xf7, 0xe6, 0xfc, 0x14, 0x48, 0x50, 0xf8, + 0x27, 0x10, 0x91, 0xf8, 0x4b, 0x30, 0x06, 0xf1, 0x87, 0x08, 0x04, 0x22, + 0x02, 0x21, 0xff, 0xf7, 0xdb, 0xfc, 0x00, 0xf0, 0x34, 0xf8, 0xff, 0xf7, + 0xd7, 0xfc, 0xa6, 0x36, 0x00, 0xf0, 0x29, 0xf8, 0x00, 0xf0, 0x1e, 0xf8, + 0x00, 0xf0, 0x22, 0xf8, 0x00, 0x25, 0x30, 0x78, 0xc0, 0xf3, 0x00, 0x10, + 0x30, 0xb1, 0x20, 0x46, 0x05, 0xf0, 0xcd, 0xf8, 0x00, 0x28, 0xf6, 0xd0, + 0x4b, 0xf2, 0x08, 0x75, 0x20, 0x46, 0x05, 0xf0, 0x53, 0xf8, 0x28, 0x46, + 0xbd, 0xe8, 0xf0, 0x81, 0x5c, 0x75, 0x02, 0x21, 0xc8, 0x74, 0x02, 0x21, + 0x5c, 0x9d, 0x04, 0x02, 0x90, 0xd0, 0x03, 0x00, 0x54, 0x93, 0x04, 0x02, + 0x01, 0x23, 0x02, 0x22, 0x01, 0x21, 0x70, 0x47, 0xf0, 0x22, 0x04, 0x21, + 0x30, 0x46, 0xff, 0xf7, 0x6e, 0xb9, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, + 0x30, 0x46, 0xff, 0xf7, 0x68, 0xb9, 0x00, 0x23, 0x08, 0x22, 0x03, 0x21, + 0x70, 0x47, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, + 0x81, 0x46, 0xdf, 0xf8, 0x10, 0x0c, 0x92, 0xb0, 0xcb, 0x46, 0x50, 0xf8, + 0x2b, 0x50, 0xdf, 0xf8, 0xcc, 0x87, 0x02, 0x20, 0x04, 0xf0, 0xb7, 0xff, + 0x00, 0x23, 0xc0, 0x22, 0x06, 0x21, 0x05, 0xf1, 0x0b, 0x00, 0xff, 0xf7, + 0x4c, 0xf9, 0x05, 0xf1, 0x88, 0x01, 0x10, 0x91, 0x05, 0xf1, 0x0a, 0x00, + 0x0f, 0x90, 0x00, 0x24, 0x58, 0xf8, 0x2b, 0x00, 0xc1, 0x6c, 0x01, 0x29, + 0x40, 0xf0, 0x06, 0x81, 0x00, 0x95, 0x06, 0xa8, 0x24, 0x21, 0xfe, 0xf7, + 0x49, 0xfb, 0x00, 0x98, 0x11, 0x30, 0x05, 0x90, 0xff, 0xf7, 0xcd, 0xff, + 0xff, 0xf7, 0x33, 0xf9, 0x00, 0x98, 0x00, 0x23, 0x04, 0x22, 0x02, 0x21, + 0x87, 0x30, 0xff, 0xf7, 0x2c, 0xf9, 0x00, 0xf0, 0x40, 0xfa, 0x00, 0xf0, + 0xfb, 0xf9, 0x00, 0xf0, 0x42, 0xfa, 0x00, 0x98, 0x14, 0x30, 0x04, 0x90, + 0x00, 0xf0, 0x2c, 0xfa, 0x00, 0x98, 0x16, 0x30, 0x03, 0x90, 0x00, 0xf0, + 0x27, 0xfa, 0x58, 0xf8, 0x2b, 0x00, 0x90, 0xf8, 0x8f, 0x00, 0x01, 0x00, + 0x00, 0xee, 0x10, 0x1a, 0xb8, 0xee, 0x40, 0x0a, 0xf7, 0xee, 0x00, 0x0a, + 0x70, 0xee, 0x20, 0x0a, 0x9f, 0xed, 0x20, 0x1a, 0x20, 0xee, 0x81, 0x8a, + 0x04, 0xd1, 0x0f, 0x20, 0x04, 0x21, 0xdf, 0xed, 0x1e, 0x8a, 0x16, 0xe0, + 0x01, 0x28, 0x04, 0xd1, 0x1f, 0x20, 0x02, 0x21, 0xdf, 0xed, 0x1b, 0x8a, + 0x0f, 0xe0, 0x02, 0x28, 0x07, 0xd1, 0x2f, 0x20, 0xdf, 0xed, 0x19, 0x8a, + 0x8d, 0xf8, 0x18, 0x00, 0x8d, 0xf8, 0x19, 0x40, 0x09, 0xe0, 0x03, 0x28, + 0x0b, 0xd1, 0x3e, 0x20, 0x04, 0x21, 0xdf, 0xed, 0x15, 0x8a, 0x8d, 0xf8, + 0x18, 0x00, 0x8d, 0xf8, 0x19, 0x10, 0x8d, 0xf8, 0x1c, 0x40, 0x01, 0x23, + 0x2c, 0xe0, 0x04, 0x28, 0x06, 0xd1, 0x30, 0x20, 0xdf, 0xed, 0xd5, 0x8a, + 0x8d, 0xf8, 0x18, 0x00, 0x0c, 0x21, 0x07, 0xe0, 0x05, 0x28, 0x17, 0xd1, + 0x3f, 0x20, 0xdf, 0xed, 0xd2, 0x8a, 0x8d, 0xf8, 0x18, 0x00, 0x10, 0x21, + 0x8d, 0xf8, 0x19, 0x10, 0x8d, 0xf8, 0x1c, 0x40, 0x00, 0x23, 0x00, 0x26, + 0x15, 0xe0, 0x00, 0xbf, 0x52, 0x49, 0x1d, 0x39, 0x0f, 0x30, 0x8c, 0x2d, + 0x0f, 0x30, 0x0c, 0x2e, 0x17, 0x48, 0x52, 0x2e, 0x0f, 0x30, 0x8c, 0x2e, + 0x3f, 0x20, 0xdf, 0xed, 0xc7, 0x8a, 0x8d, 0xf8, 0x18, 0x00, 0x8d, 0xf8, + 0x19, 0x00, 0x8d, 0xf8, 0x1c, 0x00, 0x00, 0x23, 0x1e, 0x46, 0x00, 0x98, + 0x12, 0x30, 0x02, 0x90, 0x00, 0xf0, 0xbf, 0xf9, 0x00, 0x98, 0x13, 0x30, + 0x01, 0x90, 0x33, 0x46, 0x00, 0xf0, 0xb9, 0xf9, 0x06, 0xa9, 0x48, 0x46, + 0xff, 0xf7, 0x03, 0xfd, 0x9f, 0xed, 0xbb, 0x0a, 0x28, 0xee, 0x00, 0x0a, + 0x58, 0xf8, 0x2b, 0x00, 0x88, 0xee, 0x80, 0x0a, 0xf2, 0xee, 0x0c, 0x0a, + 0xc0, 0xee, 0x20, 0x0a, 0x90, 0xed, 0x0d, 0x0a, 0xb8, 0xee, 0x40, 0x0a, + 0x20, 0xee, 0x80, 0x0a, 0xec, 0xf7, 0x1e, 0xfa, 0x00, 0xf0, 0x6d, 0xf9, + 0x88, 0xee, 0x00, 0x0a, 0x09, 0xf0, 0x58, 0xfe, 0xf0, 0xee, 0x40, 0x0a, + 0xb0, 0xee, 0x00, 0x0a, 0x03, 0xf0, 0xa8, 0xfd, 0xdf, 0xed, 0xac, 0x0a, + 0x20, 0xee, 0x20, 0x0a, 0xec, 0xf7, 0x0c, 0xfa, 0x00, 0xf0, 0x5b, 0xf9, + 0x88, 0xee, 0x00, 0x0a, 0x00, 0x9e, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, + 0x10, 0x0a, 0x0d, 0x36, 0xc3, 0xb2, 0x70, 0x22, 0xff, 0xf7, 0x03, 0xff, + 0xb9, 0xf1, 0x03, 0x0f, 0x23, 0xd0, 0x00, 0x23, 0x00, 0x22, 0xdf, 0xf8, + 0x38, 0x1a, 0x02, 0x20, 0x04, 0xf0, 0xd9, 0xfe, 0xff, 0xf7, 0xf2, 0xfe, + 0xff, 0xf7, 0xf6, 0xfe, 0xff, 0xf7, 0xf7, 0xfe, 0x4b, 0xf2, 0x07, 0x7a, + 0x00, 0xf0, 0x80, 0xf9, 0x00, 0x28, 0x77, 0xd1, 0x00, 0xf0, 0x7c, 0xf9, + 0x00, 0x28, 0xf7, 0xd1, 0x4c, 0xb9, 0x00, 0x9f, 0x0e, 0x37, 0x00, 0xf0, + 0x49, 0xf9, 0x01, 0x28, 0x73, 0xd1, 0x00, 0xf0, 0x45, 0xf9, 0x01, 0x28, + 0xf7, 0xd1, 0x00, 0xf0, 0x2e, 0xf9, 0x04, 0x98, 0x00, 0xf0, 0x80, 0xf9, + 0x03, 0x98, 0x00, 0xf0, 0x7d, 0xf9, 0x02, 0x98, 0x00, 0xf0, 0x7a, 0xf9, + 0x01, 0x98, 0x00, 0xf0, 0x77, 0xf9, 0x05, 0x98, 0x00, 0xf0, 0x25, 0xf9, + 0xff, 0xf7, 0x3d, 0xf8, 0xff, 0xf7, 0x13, 0xfb, 0xff, 0xf7, 0xc8, 0xfe, + 0x00, 0xf0, 0x4d, 0xf9, 0x00, 0xf0, 0x08, 0xf9, 0x00, 0xf0, 0x4f, 0xf9, + 0x7c, 0xb9, 0x58, 0xf8, 0x2b, 0x00, 0x10, 0xf8, 0x8f, 0x1f, 0x41, 0x75, + 0x58, 0xf8, 0x2b, 0x00, 0x00, 0xf1, 0x88, 0x01, 0x48, 0x46, 0xff, 0xf7, + 0x80, 0xfc, 0x48, 0x46, 0xec, 0xf7, 0x0c, 0xfa, 0x04, 0x46, 0x00, 0x2c, + 0x40, 0xf0, 0xa0, 0x80, 0x00, 0x23, 0x00, 0xf0, 0x1d, 0xf9, 0xff, 0xf7, + 0xf2, 0xfa, 0xa8, 0x1c, 0xff, 0xf7, 0x17, 0xf8, 0x00, 0xf0, 0x40, 0xf9, + 0x05, 0xf1, 0x65, 0x00, 0xff, 0xf7, 0x11, 0xf8, 0x01, 0x22, 0x00, 0x21, + 0x05, 0xf1, 0x20, 0x00, 0xff, 0xf7, 0x06, 0xf8, 0x8d, 0xf8, 0x00, 0x00, + 0x00, 0xf0, 0x32, 0xf9, 0x00, 0xf0, 0x0c, 0xf9, 0xff, 0xf7, 0xdb, 0xfa, + 0x00, 0xf0, 0xfe, 0xf8, 0x05, 0xf1, 0x17, 0x06, 0xff, 0xf7, 0x95, 0xfe, + 0xff, 0xf7, 0x8a, 0xfe, 0x05, 0xf1, 0x1e, 0x07, 0x00, 0xf0, 0x07, 0xf9, + 0xff, 0xf7, 0x5d, 0xfd, 0x00, 0xf0, 0x17, 0xf9, 0xff, 0xf7, 0x83, 0xfe, + 0x00, 0xf0, 0x0e, 0xf9, 0xb8, 0xb1, 0x00, 0xf0, 0xcf, 0xf8, 0x00, 0x28, + 0xf8, 0xd0, 0x4b, 0xf2, 0x05, 0x74, 0x14, 0xe0, 0x00, 0xf0, 0xc8, 0xf8, + 0x00, 0x28, 0x3f, 0xf4, 0x7f, 0xaf, 0x54, 0x46, 0x84, 0xe7, 0x00, 0xf0, + 0xc1, 0xf8, 0x00, 0x28, 0x83, 0xd0, 0x54, 0x46, 0x89, 0xe7, 0x00, 0xf0, + 0xbb, 0xf8, 0x00, 0x28, 0xeb, 0xd1, 0x00, 0xf0, 0xc2, 0xf8, 0x00, 0x28, + 0xf7, 0xd1, 0x00, 0xf0, 0xb0, 0xf8, 0x9d, 0xf8, 0x00, 0x30, 0x01, 0x22, + 0x00, 0x21, 0x00, 0xf0, 0xd1, 0xf8, 0x00, 0xf0, 0xc0, 0xf8, 0x01, 0x22, + 0x00, 0x21, 0x05, 0xf1, 0x1d, 0x00, 0xfe, 0xf7, 0xbd, 0xff, 0x03, 0x46, + 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, 0xba, 0xf8, 0xff, 0x22, 0x00, 0x21, + 0x05, 0xf1, 0x1c, 0x00, 0xfe, 0xf7, 0xb2, 0xff, 0x03, 0x46, 0xff, 0x22, + 0x00, 0x21, 0x05, 0xf1, 0x1c, 0x00, 0xfe, 0xf7, 0xb0, 0xff, 0x00, 0xf0, + 0xdd, 0xf8, 0xff, 0xf7, 0x35, 0xfe, 0x00, 0xf0, 0xa7, 0xf8, 0x00, 0xf0, + 0x8e, 0xf8, 0xff, 0xf7, 0x35, 0xfe, 0x00, 0x23, 0x00, 0xf0, 0xb4, 0xf8, + 0xff, 0xf7, 0x09, 0xfd, 0x00, 0xf0, 0xc3, 0xf8, 0xff, 0xf7, 0x2f, 0xfe, + 0x00, 0xf0, 0xba, 0xf8, 0x30, 0xb1, 0x00, 0xf0, 0x7b, 0xf8, 0x00, 0x28, + 0xf8, 0xd0, 0x4b, 0xf2, 0x05, 0x74, 0x08, 0xe0, 0x3c, 0xb9, 0x00, 0xf0, + 0x7e, 0xf8, 0x20, 0xb1, 0x00, 0xf0, 0x70, 0xf8, 0x00, 0x28, 0xf8, 0xd0, + 0xf3, 0xe7, 0x00, 0xf0, 0x72, 0xf8, 0xff, 0xf7, 0x15, 0xfe, 0x00, 0xf0, + 0x7c, 0xf8, 0x00, 0xf0, 0x62, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0x80, 0xf8, + 0xe4, 0xbb, 0x58, 0xf8, 0x2b, 0x00, 0xd0, 0xf8, 0xa8, 0x10, 0x0a, 0x20, + 0xb1, 0xfb, 0xf0, 0xf1, 0x00, 0x23, 0x00, 0x22, 0x02, 0x20, 0x04, 0xf0, + 0xe0, 0xfd, 0x20, 0x22, 0x05, 0x21, 0x05, 0xf1, 0x26, 0x00, 0xfe, 0xf7, + 0x67, 0xff, 0x01, 0x28, 0x05, 0xd0, 0x00, 0xf0, 0x4b, 0xf8, 0x00, 0x28, + 0xf3, 0xd0, 0x4b, 0xf2, 0x01, 0x74, 0x00, 0xf0, 0x42, 0xf8, 0xfc, 0xb9, + 0x5f, 0xea, 0x09, 0x00, 0x18, 0xbf, 0x01, 0x28, 0x1a, 0xd1, 0x02, 0x21, + 0xff, 0xf7, 0x96, 0xfd, 0x00, 0x28, 0x02, 0xbf, 0x58, 0xf8, 0x2b, 0x00, + 0x90, 0xf8, 0x50, 0x10, 0x01, 0x29, 0x0b, 0xd1, 0x48, 0x46, 0x0a, 0xf0, + 0xa4, 0xfb, 0x00, 0x21, 0x48, 0x46, 0x0a, 0xf0, 0x63, 0xfb, 0x04, 0x46, + 0x48, 0x46, 0x0a, 0xf0, 0xbe, 0xfb, 0x03, 0xe0, 0x48, 0x46, 0x0a, 0xf0, + 0x15, 0xfd, 0x04, 0x46, 0x02, 0x20, 0x04, 0xf0, 0x20, 0xfe, 0x12, 0xb0, + 0x20, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, 0x00, 0xbf, + 0x13, 0x3c, 0xaf, 0x2e, 0x17, 0x48, 0xd2, 0x2e, 0x7e, 0x56, 0xf2, 0x2e, + 0x6f, 0x12, 0x03, 0x3b, 0x00, 0x00, 0x80, 0x3d, 0x58, 0xf8, 0x2b, 0x00, + 0x90, 0xf8, 0x90, 0x30, 0x10, 0x98, 0x7f, 0x22, 0x70, 0x47, 0xb0, 0xee, + 0x40, 0x8a, 0xb0, 0xee, 0x00, 0x0a, 0xec, 0xf7, 0xa9, 0xb8, 0x02, 0x20, + 0x04, 0xf0, 0xec, 0xbd, 0x02, 0x20, 0x04, 0xf0, 0x5c, 0xbe, 0x01, 0x23, + 0x08, 0x22, 0x03, 0x21, 0x70, 0x47, 0x01, 0x23, 0x80, 0x22, 0x07, 0x21, + 0x70, 0x47, 0x02, 0x22, 0x01, 0x21, 0x30, 0x46, 0xfe, 0xf7, 0x08, 0xbf, + 0x80, 0x22, 0x07, 0x21, 0x38, 0x46, 0xfe, 0xf7, 0x03, 0xbf, 0x3f, 0x22, + 0x00, 0x21, 0x38, 0x46, 0xfe, 0xf7, 0xfe, 0xbe, 0x05, 0xf1, 0x1d, 0x00, + 0xfe, 0xf7, 0xff, 0xbe, 0x40, 0x22, 0x06, 0x21, 0x05, 0xf1, 0x8a, 0x00, + 0xfe, 0xf7, 0xf9, 0xbe, 0x05, 0xf1, 0x20, 0x00, 0xfe, 0xf7, 0xf5, 0xbe, + 0x01, 0x23, 0x40, 0x22, 0x06, 0x21, 0xfe, 0xf7, 0xf0, 0xbe, 0x01, 0x23, + 0x40, 0x22, 0x06, 0x21, 0x38, 0x46, 0xfe, 0xf7, 0xea, 0xbe, 0x58, 0xf8, + 0x2b, 0x00, 0x90, 0xf8, 0x8f, 0x30, 0x0f, 0x98, 0x1f, 0x22, 0x00, 0x21, + 0xfe, 0xf7, 0xe1, 0xbe, 0x01, 0x22, 0x00, 0x21, 0x30, 0x46, 0xfe, 0xf7, + 0xd7, 0xbe, 0x00, 0x23, 0x00, 0x22, 0x42, 0xf2, 0x10, 0x71, 0x02, 0x20, + 0x04, 0xf0, 0x43, 0xbd, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x70, 0x47, + 0x00, 0x23, 0x80, 0x22, 0x07, 0x21, 0x30, 0x46, 0xfe, 0xf7, 0xcb, 0xbe, + 0x00, 0x23, 0x40, 0x22, 0x06, 0x21, 0xfe, 0xf7, 0xc6, 0xbe, 0xf0, 0xb5, + 0x00, 0x23, 0x01, 0x2a, 0x27, 0xd8, 0xdf, 0xf8, 0xe0, 0x66, 0x37, 0x68, + 0x17, 0x44, 0x7a, 0x78, 0x82, 0xb9, 0xdf, 0xf8, 0xd8, 0x46, 0x6f, 0xf0, + 0x01, 0x05, 0x00, 0x19, 0x69, 0x41, 0x01, 0x27, 0xb9, 0x42, 0xdf, 0xf8, + 0xcc, 0x66, 0x18, 0xd3, 0x01, 0xd8, 0xb0, 0x42, 0x15, 0xd3, 0x4b, 0xf2, + 0x02, 0x73, 0x12, 0xe0, 0xdf, 0xf8, 0xbc, 0x46, 0x4f, 0xf0, 0xff, 0x35, + 0x00, 0x19, 0x69, 0x41, 0x01, 0x27, 0xb9, 0x42, 0xdf, 0xf8, 0xb0, 0x66, + 0x07, 0xd3, 0x01, 0xd8, 0xb0, 0x42, 0x04, 0xd3, 0x4b, 0xf2, 0x0e, 0x73, + 0x01, 0xe0, 0x4b, 0xf2, 0x03, 0x73, 0x18, 0x46, 0xf0, 0xbd, 0x00, 0x00, + 0x24, 0x73, 0x03, 0x21, 0x19, 0x00, 0x00, 0x47, 0x01, 0x65, 0xcd, 0x1d, + 0x17, 0x00, 0x00, 0x47, 0x2d, 0xe9, 0xf1, 0x4f, 0x84, 0xb0, 0xdf, 0xf8, + 0x68, 0x16, 0xdf, 0xf8, 0x2c, 0x92, 0x00, 0x90, 0x14, 0x46, 0x51, 0xf8, + 0x20, 0x10, 0x02, 0x91, 0x01, 0x91, 0x1d, 0x46, 0x9d, 0xf8, 0x38, 0x20, + 0x20, 0x46, 0x29, 0x46, 0x00, 0xf0, 0x35, 0xf9, 0x82, 0x46, 0x9d, 0xf8, + 0x10, 0x00, 0x8b, 0x46, 0x00, 0xf0, 0xb8, 0xfe, 0x00, 0x27, 0x00, 0x26, + 0x01, 0x28, 0xb0, 0x46, 0x40, 0xf0, 0xbc, 0x80, 0x00, 0xf0, 0xfc, 0xf8, + 0x06, 0x00, 0x40, 0xf0, 0xf2, 0x80, 0x00, 0x98, 0x59, 0xf8, 0x20, 0x00, + 0x01, 0x23, 0xc0, 0xe9, 0x04, 0x45, 0x9d, 0xf8, 0x38, 0x10, 0x80, 0xf8, + 0x38, 0x10, 0x00, 0x98, 0x59, 0xf8, 0x20, 0x00, 0xc0, 0xe9, 0x00, 0x87, + 0x10, 0xf8, 0x38, 0x1f, 0x4a, 0x1e, 0x82, 0x70, 0x10, 0x22, 0x01, 0x9c, + 0x6b, 0x34, 0x04, 0x21, 0xff, 0xf7, 0x4f, 0xfa, 0x00, 0x99, 0x59, 0xf8, + 0x21, 0x20, 0x01, 0x9d, 0x01, 0x98, 0x92, 0xf8, 0x3a, 0x10, 0x68, 0x35, + 0x6c, 0x30, 0x19, 0xb9, 0x00, 0xf0, 0xd9, 0xf8, 0x00, 0x23, 0x06, 0xe0, + 0x00, 0xf0, 0xe6, 0xf8, 0x00, 0x98, 0x59, 0xf8, 0x20, 0x10, 0x91, 0xf8, + 0x3a, 0x30, 0x3f, 0x22, 0x00, 0xf0, 0xf8, 0xf8, 0x00, 0x9a, 0x59, 0xf8, + 0x22, 0x50, 0x00, 0xf0, 0xea, 0xf8, 0xa8, 0x60, 0xc5, 0xe9, 0x00, 0xab, + 0xdd, 0xf8, 0x08, 0x90, 0x09, 0xf1, 0x6e, 0x05, 0x00, 0xf0, 0xcc, 0xf8, + 0x00, 0xf0, 0xe9, 0xf8, 0x00, 0xf0, 0xc8, 0xf8, 0xff, 0xf7, 0x23, 0xfa, + 0x00, 0xf0, 0xd3, 0xf8, 0x09, 0xf1, 0x6d, 0x09, 0x00, 0x23, 0x20, 0x22, + 0x05, 0x21, 0xff, 0xf7, 0x53, 0xf9, 0x00, 0xf0, 0xc4, 0xf8, 0x01, 0x23, + 0x10, 0x22, 0x04, 0x21, 0xff, 0xf7, 0x13, 0xfa, 0x0f, 0x23, 0xff, 0x22, + 0x00, 0xf0, 0xd0, 0xf8, 0xff, 0xf7, 0x0a, 0xfa, 0x01, 0x23, 0x20, 0x22, + 0x05, 0x21, 0xff, 0xf7, 0x41, 0xf9, 0xff, 0xf7, 0xf0, 0xfe, 0xff, 0xf7, + 0x3d, 0xf9, 0xfe, 0xf7, 0x18, 0xfe, 0x9d, 0xf8, 0x10, 0x40, 0xdf, 0xf8, + 0x70, 0x95, 0x80, 0x46, 0xf8, 0xb2, 0x00, 0xf0, 0x4a, 0xfc, 0xa0, 0x42, + 0x15, 0xd1, 0x00, 0xf0, 0x59, 0xf9, 0x12, 0xd5, 0xf8, 0xb2, 0x59, 0xf8, + 0x20, 0x00, 0x00, 0xf1, 0x70, 0x0a, 0x00, 0x23, 0x00, 0xf0, 0x8b, 0xf8, + 0x01, 0x23, 0x00, 0xf0, 0x88, 0xf8, 0xff, 0xf7, 0x80, 0xfc, 0x00, 0xf0, + 0x86, 0xf8, 0xff, 0xf7, 0xca, 0xfe, 0x00, 0xf0, 0x82, 0xf8, 0x00, 0xf0, + 0x3f, 0xf9, 0xe1, 0xd1, 0xfe, 0xf7, 0xeb, 0xfd, 0x80, 0x46, 0x00, 0x27, + 0xdf, 0xf8, 0x28, 0x95, 0xf8, 0xb2, 0x00, 0xf0, 0x0f, 0xfc, 0xa0, 0x42, + 0x19, 0xd1, 0x00, 0xf0, 0x35, 0xf9, 0x16, 0xd5, 0xf8, 0xb2, 0x59, 0xf8, + 0x20, 0xa0, 0x0a, 0xf1, 0x41, 0x0b, 0xff, 0xf7, 0xf5, 0xfe, 0x00, 0xf0, + 0x63, 0xf8, 0xff, 0xf7, 0xf8, 0xf8, 0x00, 0xf0, 0x5f, 0xf8, 0x0a, 0xf1, + 0x03, 0x0a, 0xff, 0xf7, 0xf2, 0xf8, 0x00, 0xf0, 0x5e, 0xf8, 0xff, 0xf7, + 0xe7, 0xfe, 0x00, 0xf0, 0x5a, 0xf8, 0x00, 0xf0, 0x17, 0xf9, 0xdd, 0xd1, + 0x01, 0x23, 0x10, 0x22, 0x04, 0x21, 0x00, 0xf0, 0x74, 0xf8, 0x3a, 0xe0, + 0x00, 0x98, 0x59, 0xf8, 0x20, 0x10, 0x01, 0x91, 0x91, 0xf8, 0x85, 0x00, + 0x00, 0x28, 0x30, 0xd0, 0x00, 0xf0, 0x38, 0xf8, 0x06, 0x00, 0x22, 0xd1, + 0x01, 0x99, 0x0f, 0x98, 0xc1, 0xe9, 0x04, 0x45, 0x01, 0x99, 0x9d, 0xf8, + 0x38, 0x20, 0x81, 0xf8, 0x38, 0x20, 0x01, 0x28, 0x05, 0xd1, 0x9d, 0xf8, + 0x10, 0x00, 0xff, 0xf7, 0x05, 0xfb, 0x06, 0x00, 0x0b, 0xd1, 0x00, 0x98, + 0x59, 0xf8, 0x20, 0x10, 0x9d, 0xf8, 0x10, 0x00, 0x02, 0xf0, 0x1e, 0xff, + 0x9d, 0xf8, 0x10, 0x00, 0xff, 0xf7, 0x14, 0xfa, 0x06, 0x46, 0x86, 0xb9, + 0x9d, 0xf8, 0x10, 0x00, 0xff, 0xf7, 0x20, 0xfc, 0x06, 0x46, 0x56, 0xb9, + 0x00, 0x99, 0x59, 0xf8, 0x21, 0x40, 0x00, 0xf0, 0x34, 0xf8, 0xa0, 0x60, + 0xc4, 0xe9, 0x00, 0xab, 0x01, 0xe0, 0xc1, 0xe9, 0x00, 0x87, 0x30, 0x46, + 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0x00, 0xc8, 0x74, 0x02, 0x21, + 0x9d, 0xf8, 0x10, 0x20, 0x20, 0x46, 0x29, 0x46, 0xa3, 0xe6, 0x01, 0x23, + 0x02, 0x22, 0x01, 0x21, 0xfe, 0xf7, 0x65, 0xbd, 0x58, 0x46, 0xfe, 0xf7, + 0x62, 0xbd, 0x04, 0x22, 0x02, 0x21, 0x50, 0x46, 0xfe, 0xf7, 0x5d, 0xbd, + 0x00, 0x23, 0x10, 0x22, 0x04, 0x21, 0x70, 0x47, 0x00, 0x23, 0x02, 0x22, + 0x01, 0x21, 0xfe, 0xf7, 0x54, 0xbd, 0x00, 0x23, 0x80, 0x22, 0x07, 0x21, + 0x48, 0x46, 0xfe, 0xf7, 0x4e, 0xbd, 0x00, 0x23, 0x20, 0x22, 0x05, 0x21, + 0x20, 0x46, 0xfe, 0xf7, 0x48, 0xbd, 0x50, 0x46, 0x59, 0x46, 0x4f, 0xf4, + 0x7a, 0x72, 0x00, 0x23, 0xfe, 0xf7, 0xb8, 0xbc, 0x00, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x28, 0x46, 0xfe, 0xf7, 0x3b, 0xbd, 0x80, 0xb5, 0x00, 0xf0, + 0x71, 0xfb, 0x02, 0xe0, 0x80, 0xb5, 0x00, 0xf0, 0x84, 0xfb, 0xdf, 0xf8, + 0xe0, 0x13, 0x51, 0xf8, 0x20, 0x00, 0x80, 0x68, 0x02, 0xbd, 0x00, 0x00, + 0xe4, 0x81, 0x04, 0x02, 0x00, 0xee, 0x10, 0x1a, 0xdf, 0xf8, 0xc8, 0x13, + 0x51, 0xf8, 0x20, 0x00, 0x00, 0xee, 0x90, 0x2a, 0xb8, 0xee, 0x40, 0x0a, + 0xf8, 0xee, 0x60, 0x0a, 0x80, 0xed, 0x15, 0x0a, 0xc0, 0xed, 0x16, 0x0a, + 0x70, 0x47, 0x30, 0xb5, 0x04, 0x46, 0x8c, 0x42, 0xdf, 0xf8, 0xa8, 0x03, + 0x08, 0xbf, 0x03, 0x21, 0x09, 0xd0, 0xb4, 0xeb, 0x51, 0x0f, 0x03, 0xd1, + 0x03, 0x21, 0x18, 0x30, 0x52, 0x08, 0x02, 0xe0, 0x01, 0x21, 0x30, 0x30, + 0x92, 0x08, 0x1a, 0x60, 0x00, 0x22, 0x1c, 0x68, 0x01, 0xe0, 0x08, 0x30, + 0x52, 0x1c, 0x8a, 0x42, 0x02, 0xd0, 0x05, 0x68, 0xac, 0x42, 0xf8, 0xd3, + 0x30, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, 0x06, 0x46, 0x89, 0x46, 0xfe, 0xf7, + 0x04, 0xfd, 0x80, 0x46, 0x00, 0x27, 0x34, 0x46, 0xdf, 0xf8, 0x5c, 0x53, + 0x00, 0xf0, 0x52, 0xf8, 0x1b, 0xd5, 0xf8, 0xb2, 0x00, 0xf0, 0x24, 0xfb, + 0xb0, 0x42, 0x16, 0xd1, 0x55, 0xf8, 0x24, 0x10, 0x48, 0x6a, 0x90, 0xb1, + 0xf8, 0xb2, 0xff, 0xf7, 0xa7, 0xff, 0x01, 0x46, 0xf8, 0xb2, 0x03, 0xf0, + 0x15, 0xfe, 0x55, 0xf8, 0x24, 0x10, 0x49, 0x6a, 0x6b, 0x46, 0x4a, 0x46, + 0xff, 0xf7, 0xbd, 0xff, 0x42, 0x79, 0x01, 0x79, 0xf8, 0xb2, 0x03, 0xf0, + 0xc7, 0xfd, 0x00, 0xf0, 0x2f, 0xf8, 0xdd, 0xd1, 0xfe, 0xf7, 0xe3, 0xfc, + 0x80, 0x46, 0x00, 0x27, 0x00, 0xf0, 0x2c, 0xf8, 0x1a, 0xd5, 0xf8, 0xb2, + 0x00, 0xf0, 0x15, 0xfb, 0xb0, 0x42, 0x15, 0xd1, 0x55, 0xf8, 0x24, 0x10, + 0x08, 0x6a, 0x88, 0xb1, 0xf8, 0xb2, 0xff, 0xf7, 0x85, 0xff, 0x01, 0x46, + 0xf8, 0xb2, 0x02, 0xf0, 0x4c, 0xfd, 0x55, 0xf8, 0x24, 0x10, 0x09, 0x6a, + 0x6b, 0x46, 0x4a, 0x46, 0xff, 0xf7, 0x97, 0xff, 0x81, 0x79, 0xf8, 0xb2, + 0x02, 0xf0, 0x10, 0xfb, 0x00, 0xf0, 0x0a, 0xf8, 0xde, 0xd1, 0x4f, 0xf4, + 0x7a, 0x71, 0x30, 0x46, 0xa1, 0xfb, 0x09, 0x23, 0x00, 0xf0, 0x0a, 0xf8, + 0xbd, 0xe8, 0xf2, 0x83, 0x7f, 0x1c, 0xf8, 0xb2, 0x08, 0x28, 0x70, 0x47, + 0x28, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x43, + 0x8b, 0xb0, 0x19, 0x46, 0x80, 0x46, 0x00, 0x23, 0x10, 0x46, 0x03, 0x93, + 0x04, 0x93, 0x08, 0x93, 0x06, 0x93, 0x05, 0x93, 0x4f, 0xf4, 0x7a, 0x72, + 0xfe, 0xf7, 0x00, 0xfc, 0x00, 0x24, 0x05, 0xaf, 0x0a, 0x94, 0x09, 0x94, + 0x07, 0x94, 0x81, 0x46, 0x01, 0x97, 0x06, 0xad, 0x00, 0x95, 0x09, 0xab, + 0x04, 0xaa, 0x49, 0x46, 0x40, 0x46, 0x03, 0xf0, 0xc1, 0xfd, 0x07, 0xab, + 0x08, 0xa8, 0x01, 0x93, 0x00, 0x90, 0x0a, 0xab, 0x03, 0xaa, 0x49, 0x46, + 0x40, 0x46, 0x02, 0xf0, 0x0f, 0xfd, 0x06, 0x98, 0x0d, 0xf1, 0x0a, 0x02, + 0x02, 0xa9, 0xc0, 0xb2, 0x03, 0xf0, 0x07, 0xfd, 0x08, 0x98, 0x00, 0xf0, + 0x77, 0xf8, 0x91, 0x4d, 0x9d, 0xf8, 0x08, 0x00, 0x9d, 0xf8, 0x09, 0x10, + 0x55, 0xf8, 0x28, 0x20, 0x88, 0x42, 0x38, 0xbf, 0x08, 0x46, 0x82, 0xf8, + 0x29, 0x00, 0x0d, 0xf1, 0x0a, 0x02, 0x05, 0x98, 0x02, 0xa9, 0xc0, 0xb2, + 0x03, 0xf0, 0xf1, 0xfc, 0x07, 0x98, 0x00, 0xf0, 0x61, 0xf8, 0x9d, 0xf8, + 0x09, 0x00, 0x9d, 0xf8, 0x08, 0x10, 0x55, 0xf8, 0x28, 0x20, 0x88, 0x42, + 0x88, 0xbf, 0x08, 0x46, 0x82, 0xf8, 0x28, 0x00, 0x4b, 0xf2, 0x04, 0x77, + 0x55, 0xf8, 0x28, 0x20, 0x92, 0xf8, 0x85, 0x00, 0x02, 0x28, 0x18, 0xbf, + 0x01, 0x28, 0x35, 0xd1, 0x04, 0x98, 0x03, 0x99, 0x08, 0x43, 0x08, 0xbf, + 0x3c, 0x46, 0x03, 0xd0, 0x04, 0x98, 0x50, 0x62, 0x03, 0x99, 0x11, 0x62, + 0x04, 0x98, 0x03, 0x99, 0x88, 0x42, 0x2c, 0xbf, 0x50, 0x6a, 0x10, 0x6a, + 0xb9, 0xfb, 0xf0, 0xf0, 0x69, 0x49, 0x82, 0xf8, 0x39, 0x00, 0x55, 0xf8, + 0x28, 0x00, 0x51, 0xf8, 0x28, 0x60, 0x90, 0xf8, 0x29, 0x00, 0x6d, 0x36, + 0x01, 0x28, 0x06, 0xd1, 0x00, 0x23, 0x0c, 0x22, 0x02, 0x21, 0xff, 0xf7, + 0xa7, 0xfa, 0x01, 0x23, 0x08, 0xe0, 0x02, 0x28, 0x0c, 0xbf, 0x01, 0x23, + 0x03, 0x23, 0x0c, 0x22, 0x02, 0x21, 0xff, 0xf7, 0x9d, 0xfa, 0x00, 0x23, + 0xff, 0xf7, 0x9e, 0xfa, 0x00, 0xf0, 0x1f, 0xf8, 0xff, 0xf7, 0xaa, 0xfe, + 0xff, 0xf7, 0x94, 0xfa, 0x55, 0xf8, 0x28, 0x10, 0x91, 0xf8, 0x85, 0x00, + 0x03, 0x28, 0x0b, 0xd1, 0x03, 0x98, 0x08, 0xb9, 0x3c, 0x46, 0x07, 0xe0, + 0x08, 0x62, 0x00, 0x22, 0x08, 0x6a, 0x4a, 0x62, 0xb9, 0xfb, 0xf0, 0xf0, + 0x81, 0xf8, 0x39, 0x00, 0x20, 0x46, 0x0b, 0xb0, 0xbd, 0xe8, 0xf0, 0x83, + 0x0d, 0xf1, 0x09, 0x01, 0xc0, 0xb2, 0x02, 0xf0, 0x80, 0xba, 0x00, 0x23, + 0x40, 0x22, 0x06, 0x21, 0x30, 0x46, 0xfe, 0xf7, 0xe4, 0xbb, 0x00, 0x00, + 0x40, 0x42, 0x0f, 0x00, 0x38, 0xb5, 0x00, 0xf0, 0x21, 0xf8, 0xe3, 0xb2, + 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x55, 0x00, 0xfe, 0xf7, 0xd7, 0xfb, + 0x23, 0x04, 0x1b, 0x0e, 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x56, 0x00, + 0xfe, 0xf7, 0xcf, 0xfb, 0x23, 0x02, 0x1b, 0x0e, 0xff, 0x22, 0x00, 0x21, + 0x05, 0xf1, 0x57, 0x00, 0xfe, 0xf7, 0xc7, 0xfb, 0x23, 0x0e, 0x05, 0xf1, + 0x58, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0xff, 0x22, 0x00, 0x21, + 0xfe, 0xf7, 0xbd, 0xbb, 0x0c, 0x46, 0x33, 0x49, 0x51, 0xf8, 0x20, 0x50, + 0x70, 0x47, 0x31, 0x49, 0x51, 0xf8, 0x20, 0x10, 0x01, 0xf1, 0x55, 0x00, + 0x01, 0xf1, 0x56, 0x02, 0x00, 0x78, 0x12, 0x78, 0x01, 0xf1, 0x57, 0x03, + 0x58, 0x31, 0x1b, 0x78, 0x09, 0x78, 0x40, 0xea, 0x02, 0x20, 0x40, 0xea, + 0x03, 0x40, 0x40, 0xea, 0x01, 0x60, 0x70, 0x47, 0x38, 0xb5, 0x00, 0x24, + 0x08, 0x38, 0x03, 0x28, 0x2d, 0x4d, 0x19, 0xd8, 0xdf, 0xe8, 0x00, 0xf0, + 0x02, 0x04, 0x0b, 0x14, 0xa9, 0x68, 0x10, 0xe0, 0x00, 0x20, 0x00, 0xf0, + 0xd9, 0xfb, 0x01, 0x28, 0x0e, 0xd0, 0x29, 0x68, 0x05, 0xe0, 0x01, 0x20, + 0x00, 0xf0, 0xd2, 0xfb, 0x01, 0x28, 0x07, 0xd0, 0x69, 0x68, 0x91, 0xf8, + 0x85, 0x00, 0x01, 0xe0, 0xe9, 0x68, 0xc8, 0x6a, 0x00, 0xb1, 0x01, 0x24, + 0x20, 0x46, 0x32, 0xbd, 0x0b, 0x46, 0x1e, 0x49, 0x51, 0xf8, 0x20, 0x20, + 0xd1, 0x6a, 0x01, 0x29, 0x00, 0xd0, 0x70, 0x47, 0x10, 0xb5, 0x11, 0x4c, + 0x54, 0xf8, 0x20, 0x00, 0xbd, 0xe8, 0x10, 0x40, 0x02, 0x22, 0x20, 0x30, + 0xfe, 0xf7, 0x6f, 0xbb, 0x03, 0x28, 0x0b, 0x46, 0x14, 0xd8, 0xdf, 0xe8, + 0x00, 0xf0, 0x02, 0x06, 0x0a, 0x0e, 0x10, 0x22, 0x04, 0x21, 0x13, 0x48, + 0x0a, 0xe0, 0x10, 0x22, 0x04, 0x21, 0x12, 0x48, 0x06, 0xe0, 0x10, 0x22, + 0x04, 0x21, 0x11, 0x48, 0x02, 0xe0, 0x10, 0x22, 0x04, 0x21, 0x10, 0x48, + 0xfe, 0xf7, 0x57, 0xbb, 0x70, 0x47, 0x00, 0x00, 0x5c, 0x9d, 0x04, 0x02, + 0xa0, 0x86, 0x01, 0x00, 0x18, 0x76, 0x02, 0x21, 0x00, 0x99, 0xce, 0x58, + 0x01, 0x67, 0x31, 0xa7, 0x00, 0xd8, 0x94, 0x11, 0x01, 0x50, 0xd6, 0xdc, + 0x00, 0x96, 0x04, 0x02, 0xe0, 0x99, 0x04, 0x02, 0xc8, 0x74, 0x02, 0x21, + 0x6c, 0x55, 0x00, 0x21, 0x26, 0x00, 0x30, 0x47, 0x26, 0x00, 0x40, 0x47, + 0x26, 0x00, 0x09, 0x48, 0x26, 0x00, 0x06, 0x48, 0x00, 0x78, 0x02, 0x40, + 0xca, 0x40, 0xd0, 0xb2, 0x70, 0x47, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, + 0x72, 0xb6, 0x05, 0x78, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, + 0x29, 0x43, 0x01, 0x70, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0xf8, 0xb5, + 0xdf, 0xf8, 0xec, 0x46, 0x21, 0x68, 0x01, 0x20, 0x81, 0xf8, 0x85, 0x00, + 0x61, 0x68, 0x81, 0xf8, 0x85, 0x00, 0x68, 0x46, 0xf8, 0xf7, 0x25, 0xfd, + 0x9d, 0xf8, 0x00, 0x20, 0x9d, 0xf8, 0x01, 0x00, 0x9d, 0xf8, 0x03, 0x30, + 0x82, 0x18, 0x9d, 0xf8, 0x02, 0x00, 0x81, 0x18, 0x59, 0x18, 0x18, 0x18, + 0x63, 0x68, 0x24, 0x68, 0xc9, 0xb2, 0xd2, 0xb2, 0xc0, 0xb2, 0x1a, 0xb9, + 0x03, 0x22, 0x84, 0xf8, 0x85, 0x20, 0x04, 0xe0, 0x02, 0x2a, 0x04, 0xbf, + 0x03, 0x22, 0x83, 0xf8, 0x85, 0x20, 0x18, 0xb9, 0x02, 0x20, 0x84, 0xf8, + 0x85, 0x00, 0x03, 0xe0, 0x02, 0x28, 0x08, 0xbf, 0x83, 0xf8, 0x85, 0x00, + 0x21, 0xb9, 0x00, 0x20, 0x84, 0xf8, 0x85, 0x00, 0x01, 0x21, 0x05, 0xe0, + 0x04, 0x29, 0x05, 0xd1, 0x01, 0x20, 0x84, 0xf8, 0x85, 0x00, 0x00, 0x21, + 0x83, 0xf8, 0x85, 0x10, 0xdf, 0xf8, 0x74, 0x06, 0x00, 0x68, 0xd0, 0xf8, + 0x5e, 0x60, 0xd0, 0xf8, 0x62, 0x70, 0x00, 0x2f, 0x02, 0xbf, 0x00, 0x2e, + 0x00, 0x21, 0x84, 0xf8, 0x85, 0x10, 0xd0, 0xf8, 0x89, 0x40, 0xd0, 0xf8, + 0x8d, 0x50, 0x00, 0x2d, 0x02, 0xbf, 0x00, 0x2c, 0x00, 0x20, 0x83, 0xf8, + 0x85, 0x00, 0xf1, 0xbd, 0xf8, 0xb5, 0x04, 0x46, 0xdf, 0xf8, 0x44, 0x06, + 0x26, 0x46, 0x50, 0xf8, 0x26, 0x50, 0x00, 0x23, 0x10, 0x22, 0x04, 0x21, + 0xe8, 0x1c, 0xff, 0xf7, 0x8e, 0xff, 0x05, 0xf1, 0x6b, 0x07, 0x00, 0x23, + 0x00, 0xf0, 0x18, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0x15, 0xf8, 0xdf, 0xf8, + 0x24, 0x16, 0x0a, 0x68, 0x32, 0x44, 0x6c, 0x35, 0x50, 0x78, 0x00, 0x28, + 0x0c, 0xbf, 0x00, 0x23, 0x01, 0x23, 0x10, 0x22, 0x04, 0x21, 0x00, 0xf0, + 0x59, 0xfa, 0x20, 0x46, 0x00, 0xf0, 0x01, 0xfa, 0x20, 0x46, 0xbd, 0xe8, + 0xf2, 0x40, 0x09, 0xe1, 0x10, 0x22, 0x04, 0x21, 0x38, 0x46, 0x6c, 0xe7, + 0x2d, 0xe9, 0xfc, 0x42, 0xdf, 0xf8, 0xec, 0x15, 0x1d, 0x46, 0x86, 0x46, + 0x0b, 0x68, 0xf4, 0x46, 0x63, 0x44, 0x14, 0x46, 0x58, 0x78, 0x00, 0x22, + 0x18, 0xbb, 0x01, 0x23, 0x9d, 0x42, 0xdf, 0xf8, 0xd8, 0x25, 0x75, 0xd8, + 0x28, 0xbf, 0x94, 0x42, 0x72, 0xd2, 0x9d, 0x42, 0xdf, 0xf8, 0xcc, 0x05, + 0x79, 0xd8, 0x28, 0xbf, 0x84, 0x42, 0x76, 0xd2, 0x00, 0x23, 0x9d, 0x42, + 0xdf, 0xf8, 0xc0, 0x25, 0x71, 0xd8, 0x94, 0x42, 0x6f, 0xd2, 0x9d, 0x42, + 0xdf, 0xf8, 0xb8, 0x05, 0x79, 0xd8, 0x84, 0x42, 0x77, 0xd2, 0x9d, 0x42, + 0xdf, 0xf8, 0xb0, 0x25, 0x02, 0xd8, 0x94, 0x42, 0xc0, 0xf0, 0x8a, 0x80, + 0x7d, 0xe0, 0x6e, 0x01, 0x2f, 0x01, 0x69, 0x00, 0xbe, 0xf1, 0x00, 0x0f, + 0x46, 0xea, 0xd4, 0x66, 0x47, 0xea, 0x14, 0x77, 0x41, 0xea, 0xd4, 0x71, + 0x3a, 0xd1, 0xdf, 0xf8, 0x70, 0x25, 0xd2, 0xf8, 0x00, 0xe0, 0xde, 0xf8, + 0x71, 0x20, 0xde, 0xf8, 0x75, 0x30, 0xab, 0x42, 0x08, 0xbf, 0xa2, 0x42, + 0x3e, 0xd0, 0xde, 0xf8, 0x71, 0x20, 0xde, 0xf8, 0x75, 0x30, 0x8b, 0x42, + 0x08, 0xbf, 0xb2, 0xeb, 0x44, 0x0f, 0x40, 0xd0, 0xde, 0xf8, 0x71, 0x20, + 0xde, 0xf8, 0x75, 0x30, 0xa9, 0x00, 0x41, 0xea, 0x94, 0x71, 0x8b, 0x42, + 0x08, 0xbf, 0xb2, 0xeb, 0x84, 0x0f, 0x42, 0xd0, 0xde, 0xf8, 0x71, 0x20, + 0xde, 0xf8, 0x75, 0x30, 0xe9, 0x00, 0x41, 0xea, 0x54, 0x71, 0x8b, 0x42, + 0x08, 0xbf, 0xb2, 0xeb, 0xc4, 0x0f, 0x44, 0xd0, 0xde, 0xf8, 0x71, 0x00, + 0xde, 0xf8, 0x75, 0x10, 0xb9, 0x42, 0x08, 0xbf, 0xb0, 0xeb, 0x04, 0x1f, + 0x46, 0xd0, 0xde, 0xf8, 0x71, 0x00, 0xde, 0xf8, 0x75, 0x10, 0x47, 0xe0, + 0xbe, 0xf1, 0x01, 0x0f, 0x4a, 0xd1, 0xdf, 0xf8, 0xf4, 0x24, 0x13, 0x68, + 0x03, 0xf1, 0x9c, 0x0e, 0xde, 0xf8, 0x00, 0x20, 0xde, 0xf8, 0x04, 0x30, + 0xab, 0x42, 0x08, 0xbf, 0xa2, 0x42, 0x01, 0xd1, 0x01, 0x22, 0x3b, 0xe0, + 0xde, 0xf8, 0x00, 0x20, 0xde, 0xf8, 0x04, 0x30, 0x8b, 0x42, 0x08, 0xbf, + 0xb2, 0xeb, 0x44, 0x0f, 0x01, 0xd1, 0x02, 0x22, 0x30, 0xe0, 0xde, 0xf8, + 0x00, 0x20, 0xde, 0xf8, 0x04, 0x30, 0xa9, 0x00, 0x41, 0xea, 0x94, 0x71, + 0x8b, 0x42, 0x08, 0xbf, 0xb2, 0xeb, 0x84, 0x0f, 0x01, 0xd1, 0x04, 0x22, + 0x22, 0xe0, 0xde, 0xf8, 0x00, 0x20, 0xde, 0xf8, 0x04, 0x30, 0xe9, 0x00, + 0x41, 0xea, 0x54, 0x71, 0x8b, 0x42, 0x08, 0xbf, 0xb2, 0xeb, 0xc4, 0x0f, + 0x01, 0xd1, 0x08, 0x22, 0x14, 0xe0, 0xde, 0xf8, 0x00, 0x00, 0xde, 0xf8, + 0x04, 0x10, 0xb9, 0x42, 0x08, 0xbf, 0xb0, 0xeb, 0x04, 0x1f, 0x01, 0xd1, + 0x10, 0x22, 0x09, 0xe0, 0xde, 0xf8, 0x00, 0x00, 0xde, 0xf8, 0x04, 0x10, + 0xb1, 0x42, 0x06, 0xbf, 0xb0, 0xeb, 0x44, 0x1f, 0x20, 0x22, 0x40, 0x22, + 0x08, 0x98, 0x09, 0x9b, 0xdf, 0xf8, 0x54, 0x14, 0x02, 0x70, 0x51, 0xf8, + 0x2c, 0x20, 0xc2, 0xe9, 0x06, 0x45, 0x00, 0x78, 0xa4, 0xfb, 0x00, 0x97, + 0x05, 0xfb, 0x00, 0x77, 0xc3, 0xe9, 0x00, 0x97, 0xbd, 0xe8, 0xf3, 0x82, + 0x1c, 0xb5, 0x04, 0x46, 0x6b, 0x46, 0x0d, 0xf1, 0x01, 0x02, 0x0d, 0xf1, + 0x02, 0x01, 0x0d, 0xf1, 0x03, 0x00, 0x00, 0xf0, 0x77, 0xf9, 0x04, 0x2c, + 0x04, 0xd2, 0x9d, 0xf8, 0x01, 0x00, 0x28, 0xb1, 0x01, 0x20, 0x16, 0xbd, + 0x00, 0xf0, 0x5b, 0xf9, 0x18, 0xbf, 0x00, 0x20, 0x16, 0xbd, 0x1c, 0xb5, + 0x04, 0x46, 0x0d, 0xf1, 0x02, 0x03, 0x0d, 0xf1, 0x03, 0x02, 0x69, 0x46, + 0x0d, 0xf1, 0x01, 0x00, 0x00, 0xf0, 0x60, 0xf9, 0x04, 0x2c, 0x04, 0xd2, + 0x9d, 0xf8, 0x01, 0x00, 0x28, 0xb1, 0x01, 0x20, 0x16, 0xbd, 0x00, 0xf0, + 0x44, 0xf9, 0x18, 0xbf, 0x00, 0x20, 0x16, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, + 0xdf, 0xf8, 0xe0, 0x73, 0x39, 0x68, 0x04, 0x46, 0xdf, 0xf8, 0xd4, 0x03, + 0x26, 0x46, 0x89, 0x19, 0x50, 0xf8, 0x26, 0x80, 0x48, 0x78, 0x00, 0x25, + 0x00, 0x28, 0x08, 0xf1, 0x6c, 0x0b, 0x08, 0xf1, 0x6b, 0x09, 0x08, 0xf1, + 0x03, 0x0a, 0x3f, 0xd1, 0x01, 0x23, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, + 0xc7, 0xf8, 0x00, 0xf0, 0xc2, 0xf8, 0x00, 0xf0, 0xcf, 0xf8, 0x00, 0xf0, + 0xc8, 0xf8, 0x00, 0xf0, 0xc1, 0xf8, 0x08, 0xf1, 0x69, 0x04, 0x00, 0x23, + 0x3f, 0x22, 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x3c, 0xfe, 0x00, 0x23, + 0x00, 0xf0, 0xad, 0xf8, 0x38, 0x68, 0x80, 0x19, 0xc1, 0x78, 0x01, 0x29, + 0x40, 0xf0, 0xa0, 0x80, 0x00, 0x23, 0x02, 0x22, 0x00, 0xf0, 0xaa, 0xf8, + 0x00, 0xf0, 0xa5, 0xf8, 0x00, 0x23, 0x00, 0xf0, 0xb2, 0xf8, 0x01, 0x23, + 0x00, 0xf0, 0xaa, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0x98, 0xf8, 0x39, 0x68, + 0x89, 0x19, 0x08, 0x7e, 0x00, 0x28, 0x0c, 0xbf, 0x01, 0x23, 0x00, 0x23, + 0x04, 0x22, 0x02, 0x21, 0x58, 0x46, 0xff, 0xf7, 0x18, 0xfe, 0x38, 0x68, + 0x80, 0x19, 0x3f, 0x22, 0x03, 0x7e, 0x00, 0x21, 0x20, 0x46, 0x79, 0xe0, + 0x01, 0x23, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0x87, 0xf8, 0x00, 0x23, + 0x00, 0xf0, 0x82, 0xf8, 0xdf, 0xf8, 0x20, 0x03, 0x00, 0x68, 0x44, 0xbb, + 0x00, 0xf0, 0x72, 0xf8, 0xdf, 0xf8, 0x34, 0x23, 0x02, 0x23, 0x9e, 0x42, + 0x2d, 0xd8, 0x28, 0xbf, 0x94, 0x42, 0x2a, 0xd2, 0x00, 0xf0, 0x68, 0xf8, + 0xdf, 0xf8, 0x24, 0x23, 0x01, 0x23, 0x9e, 0x42, 0x2e, 0xd8, 0x28, 0xbf, + 0x94, 0x42, 0x2b, 0xd2, 0x00, 0xf0, 0x5e, 0xf8, 0xdf, 0xf8, 0x14, 0x23, + 0x9e, 0x42, 0x2f, 0xd8, 0x28, 0xbf, 0x94, 0x42, 0x2c, 0xd2, 0xd0, 0xf8, + 0x71, 0x20, 0xd0, 0xf8, 0x75, 0x30, 0xc1, 0x4c, 0x01, 0x26, 0xb3, 0x42, + 0x30, 0xd3, 0x2e, 0xd8, 0xa2, 0x42, 0x2d, 0xd3, 0x2b, 0xe0, 0x01, 0x2c, + 0x2a, 0xd1, 0x50, 0xf8, 0x9c, 0x4f, 0x46, 0x68, 0xb7, 0x4a, 0x02, 0x23, + 0x9e, 0x42, 0x04, 0xd3, 0x01, 0xd8, 0x94, 0x42, 0x01, 0xd3, 0x06, 0x25, + 0x1e, 0xe0, 0x04, 0x68, 0x46, 0x68, 0xb3, 0x4a, 0x01, 0x23, 0x9e, 0x42, + 0x04, 0xd3, 0x01, 0xd8, 0x94, 0x42, 0x01, 0xd3, 0x04, 0x25, 0x13, 0xe0, + 0x04, 0x68, 0x46, 0x68, 0xae, 0x4a, 0x9e, 0x42, 0x04, 0xd3, 0x01, 0xd8, + 0x94, 0x42, 0x01, 0xd3, 0x03, 0x25, 0x09, 0xe0, 0x02, 0x68, 0x43, 0x68, + 0xaa, 0x48, 0x01, 0x21, 0x8b, 0x42, 0x03, 0xd3, 0x01, 0xd8, 0x82, 0x42, + 0x00, 0xd3, 0x02, 0x25, 0x2b, 0x46, 0x70, 0x22, 0x04, 0x21, 0x08, 0xf1, + 0x6a, 0x00, 0xff, 0xf7, 0xa8, 0xfd, 0x00, 0xf0, 0x2d, 0xf8, 0x00, 0xf0, + 0x26, 0xf8, 0x00, 0xf0, 0x1f, 0xf8, 0x00, 0x23, 0x3f, 0x22, 0x00, 0x21, + 0x08, 0xf1, 0x69, 0x00, 0xff, 0xf7, 0x9b, 0xfd, 0x00, 0x23, 0x20, 0x22, + 0x05, 0x21, 0x48, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, 0x92, 0xe5, + 0xbd, 0xe8, 0xf1, 0x8f, 0xd0, 0xf8, 0x71, 0x40, 0xd0, 0xf8, 0x75, 0x60, + 0x70, 0x47, 0x20, 0x22, 0x05, 0x21, 0x48, 0x46, 0x87, 0xe5, 0x01, 0x23, + 0x20, 0x22, 0x05, 0x21, 0x50, 0x46, 0x82, 0xe5, 0x00, 0x23, 0x04, 0x22, + 0x02, 0x21, 0x58, 0x46, 0x7d, 0xe5, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, + 0x48, 0x46, 0x78, 0xe5, 0x01, 0x23, 0x02, 0x22, 0x01, 0x21, 0x48, 0x46, + 0x73, 0xe5, 0x7c, 0xb5, 0x06, 0x46, 0x7e, 0x49, 0x7e, 0x4c, 0x32, 0x46, + 0x51, 0xf8, 0x22, 0x50, 0x68, 0x46, 0xf8, 0xf7, 0xaa, 0xfa, 0x6c, 0x35, + 0x30, 0x00, 0x1e, 0xd1, 0x9d, 0xf8, 0x02, 0x00, 0x01, 0x28, 0x03, 0xd1, + 0x00, 0xf0, 0x3f, 0xf8, 0x00, 0x20, 0x02, 0xe0, 0x00, 0xf0, 0x40, 0xf8, + 0x01, 0x20, 0x21, 0x68, 0x81, 0xf8, 0x20, 0x00, 0x00, 0xf0, 0x31, 0xf8, + 0x06, 0xd1, 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x32, 0xf8, + 0x00, 0x20, 0x02, 0xe0, 0x00, 0xf0, 0x35, 0xf8, 0x01, 0x20, 0x21, 0x68, + 0x81, 0xf8, 0x22, 0x00, 0x73, 0xbd, 0x01, 0x2e, 0x1e, 0xd1, 0x9d, 0xf8, + 0x03, 0x00, 0x01, 0x28, 0x03, 0xd1, 0x00, 0xf0, 0x23, 0xf8, 0x00, 0x20, + 0x02, 0xe0, 0x00, 0xf0, 0x1a, 0xf8, 0x01, 0x20, 0x21, 0x68, 0x81, 0xf8, + 0x21, 0x00, 0x9d, 0xf8, 0x01, 0x00, 0x01, 0x28, 0x03, 0xd1, 0x00, 0xf0, + 0x1a, 0xf8, 0x00, 0x20, 0x05, 0xe0, 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, + 0x00, 0xf0, 0x0c, 0xf8, 0x01, 0x20, 0x21, 0x68, 0x81, 0xf8, 0x23, 0x00, + 0x73, 0xbd, 0x9d, 0xf8, 0x00, 0x00, 0x01, 0x28, 0x70, 0x47, 0x01, 0x23, + 0x40, 0x22, 0x06, 0x21, 0x28, 0x46, 0x1c, 0xe5, 0x00, 0x23, 0x40, 0x22, + 0x06, 0x21, 0x28, 0x46, 0x17, 0xe5, 0x00, 0x23, 0x20, 0x22, 0x05, 0x21, + 0x28, 0x46, 0x12, 0xe5, 0xf8, 0xb5, 0x06, 0x46, 0x0d, 0x46, 0x17, 0x46, + 0x1c, 0x46, 0x68, 0x46, 0xf8, 0xf7, 0x4b, 0xfa, 0x9d, 0xf8, 0x02, 0x00, + 0x01, 0x28, 0x0c, 0xbf, 0x00, 0x20, 0x01, 0x20, 0x30, 0x70, 0xff, 0xf7, + 0xdc, 0xff, 0x0c, 0xbf, 0x00, 0x20, 0x01, 0x20, 0x38, 0x70, 0x9d, 0xf8, + 0x03, 0x00, 0x01, 0x28, 0x0c, 0xbf, 0x00, 0x20, 0x01, 0x20, 0x28, 0x70, + 0x9d, 0xf8, 0x01, 0x00, 0x01, 0x28, 0x0c, 0xbf, 0x00, 0x20, 0x01, 0x20, + 0x20, 0x70, 0xf1, 0xbd, 0x10, 0xb5, 0x3d, 0x4c, 0x20, 0x68, 0x00, 0x21, + 0x41, 0x70, 0xc1, 0x70, 0x81, 0x70, 0x01, 0x71, 0x37, 0x49, 0x0b, 0x68, + 0x93, 0xf8, 0x79, 0x20, 0x02, 0x76, 0x08, 0x68, 0x23, 0x68, 0x90, 0xf8, + 0xa4, 0x20, 0x5a, 0x76, 0x00, 0x20, 0x21, 0x68, 0x00, 0xf0, 0x07, 0xf8, + 0x20, 0xb9, 0x21, 0x68, 0xbd, 0xe8, 0x10, 0x40, 0x01, 0x20, 0x00, 0xe0, + 0x10, 0xbd, 0x38, 0xb5, 0x00, 0x24, 0x00, 0x28, 0x2b, 0x48, 0x03, 0x68, + 0x4f, 0xf6, 0x5a, 0x72, 0x1f, 0xd1, 0x93, 0xf8, 0x7a, 0x50, 0x05, 0xf0, + 0x07, 0x05, 0x01, 0x2d, 0x06, 0xd0, 0x02, 0x2d, 0x06, 0xd0, 0x04, 0x2d, + 0x08, 0xd0, 0x05, 0x2d, 0x05, 0xd0, 0x08, 0xe0, 0x4c, 0x70, 0x07, 0xe0, + 0x01, 0x22, 0x4a, 0x70, 0x04, 0xe0, 0x4c, 0x70, 0x01, 0x20, 0xc8, 0x70, + 0x00, 0xe0, 0x14, 0x46, 0x77, 0x22, 0x00, 0x21, 0x28, 0x48, 0xff, 0xf7, + 0xa9, 0xfc, 0x1d, 0x49, 0x0a, 0x68, 0x90, 0x77, 0x1e, 0xe0, 0x93, 0xf8, + 0xa5, 0x50, 0x05, 0xf0, 0x07, 0x05, 0x01, 0x2d, 0x06, 0xd0, 0x02, 0x2d, + 0x06, 0xd0, 0x04, 0x2d, 0x08, 0xd0, 0x05, 0x2d, 0x05, 0xd0, 0x08, 0xe0, + 0x8c, 0x70, 0x07, 0xe0, 0x01, 0x22, 0x8a, 0x70, 0x04, 0xe0, 0x8c, 0x70, + 0x01, 0x20, 0x08, 0x71, 0x00, 0xe0, 0x14, 0x46, 0x77, 0x22, 0x00, 0x21, + 0x19, 0x48, 0xff, 0xf7, 0x89, 0xfc, 0x0d, 0x49, 0x0a, 0x68, 0xd0, 0x77, + 0x20, 0x46, 0x32, 0xbd, 0x0a, 0x4a, 0x12, 0x68, 0x01, 0x46, 0x00, 0x20, + 0x0b, 0x00, 0x08, 0xbf, 0x51, 0x78, 0x02, 0xd0, 0x01, 0x29, 0x03, 0xd1, + 0x91, 0x78, 0x01, 0x29, 0x08, 0xbf, 0x01, 0x20, 0x70, 0x47, 0x00, 0x00, + 0xc8, 0x74, 0x02, 0x21, 0x5c, 0x75, 0x02, 0x21, 0x5c, 0x9d, 0x04, 0x02, + 0x18, 0x76, 0x02, 0x21, 0x00, 0x67, 0x31, 0xa7, 0x00, 0x38, 0xc9, 0x4d, + 0x80, 0xb3, 0x98, 0xd3, 0xc0, 0x59, 0xcc, 0x69, 0x70, 0x16, 0x73, 0x1a, + 0x01, 0x1a, 0x71, 0x18, 0x01, 0x86, 0x3b, 0xa1, 0x01, 0xbc, 0xa0, 0x65, + 0x01, 0x8d, 0x38, 0x0c, 0x6c, 0x00, 0x30, 0x47, 0x6c, 0x00, 0x40, 0x47, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x70, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x38, 0xb5, 0x99, 0x49, 0x51, 0xf8, 0x20, 0x40, + 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x04, 0xf1, 0xb2, 0x00, 0xff, 0xf7, + 0xe7, 0xff, 0x00, 0xf0, 0xc5, 0xf8, 0x04, 0xf1, 0xb0, 0x05, 0x00, 0x23, + 0x08, 0x22, 0x03, 0x21, 0x28, 0x46, 0xff, 0xf7, 0xdd, 0xff, 0x00, 0xf0, + 0xbb, 0xf8, 0x01, 0x23, 0x04, 0x22, 0x02, 0x21, 0x28, 0x46, 0xff, 0xf7, + 0xd5, 0xff, 0x00, 0xf0, 0xb3, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0xa7, 0xf8, + 0x00, 0xf0, 0xae, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0xa6, 0xf8, 0x4f, 0xf4, + 0xfa, 0x50, 0x03, 0xf0, 0xab, 0xfe, 0x01, 0x23, 0x04, 0x22, 0x02, 0x21, + 0x04, 0xf1, 0x95, 0x00, 0xff, 0xf7, 0xc0, 0xff, 0xbd, 0xe8, 0x32, 0x40, + 0x0f, 0x20, 0x03, 0xf0, 0x9f, 0xbe, 0x2d, 0xe9, 0xf0, 0x47, 0x80, 0x46, + 0x7c, 0x48, 0x41, 0x46, 0x50, 0xf8, 0x21, 0x40, 0x02, 0x20, 0x0c, 0xf0, + 0x1d, 0xfa, 0x81, 0x46, 0x04, 0xf1, 0x95, 0x00, 0x00, 0x25, 0x01, 0x78, + 0x00, 0x26, 0xc1, 0xf3, 0x80, 0x01, 0x39, 0xb1, 0x00, 0x23, 0x04, 0x22, + 0x02, 0x21, 0xff, 0xf7, 0xa3, 0xff, 0x0f, 0x20, 0x03, 0xf0, 0x84, 0xfe, + 0x00, 0x23, 0x00, 0xf0, 0x74, 0xf8, 0x00, 0xf0, 0x7b, 0xf8, 0x00, 0x23, + 0x00, 0xf0, 0x73, 0xf8, 0x4f, 0xf4, 0xfa, 0x50, 0x03, 0xf0, 0x78, 0xfe, + 0x08, 0x23, 0x1f, 0x22, 0x00, 0x21, 0x04, 0xf1, 0x90, 0x00, 0xff, 0xf7, + 0x8d, 0xff, 0x04, 0xf1, 0x94, 0x07, 0x4c, 0xf2, 0x50, 0x3a, 0x38, 0x78, + 0xc0, 0xf3, 0xc0, 0x00, 0x28, 0xb9, 0x00, 0xf0, 0xc7, 0xf8, 0x76, 0x1c, + 0x56, 0x45, 0xf6, 0xd1, 0x01, 0xe0, 0x56, 0x45, 0x41, 0xd1, 0x38, 0x78, + 0x60, 0xb9, 0x93, 0x34, 0x01, 0x23, 0x00, 0xf0, 0x4a, 0xf8, 0x64, 0x20, + 0x03, 0xf0, 0x58, 0xfe, 0x00, 0x23, 0x00, 0xf0, 0x44, 0xf8, 0x64, 0x20, + 0x03, 0xf0, 0x52, 0xfe, 0x38, 0x78, 0xc0, 0xf3, 0xc0, 0x00, 0x70, 0xbb, + 0x38, 0x78, 0xc0, 0xf3, 0x40, 0x10, 0x10, 0xb1, 0x4b, 0xf2, 0x02, 0x45, + 0x32, 0xe0, 0x38, 0x78, 0xc0, 0xf3, 0x40, 0x00, 0x10, 0xb1, 0x4b, 0xf2, + 0x05, 0x45, 0x2b, 0xe0, 0x38, 0x78, 0xc0, 0xf3, 0x80, 0x10, 0x10, 0xb1, + 0x4b, 0xf2, 0x01, 0x45, 0x24, 0xe0, 0x38, 0x78, 0xc0, 0x07, 0x48, 0xbf, + 0x4b, 0xf2, 0x06, 0x45, 0x1e, 0xd4, 0x38, 0x78, 0xc0, 0xf3, 0x80, 0x00, + 0x10, 0xb1, 0x4b, 0xf2, 0x04, 0x45, 0x17, 0xe0, 0x38, 0x78, 0xc0, 0xf3, + 0x00, 0x10, 0x28, 0xb1, 0xb9, 0xf1, 0x00, 0x0f, 0x05, 0xd0, 0x4b, 0xf2, + 0x03, 0x45, 0x0d, 0xe0, 0x4b, 0xf2, 0x0b, 0x45, 0x0a, 0xe0, 0x42, 0xf2, + 0x28, 0x30, 0x03, 0xf0, 0x1b, 0xfe, 0x40, 0x46, 0x03, 0x28, 0x03, 0xd0, + 0x02, 0x21, 0x00, 0xf0, 0x15, 0xf8, 0x05, 0x46, 0x28, 0x46, 0xbd, 0xe8, + 0xf0, 0x87, 0x10, 0x22, 0x04, 0x21, 0x20, 0x46, 0x28, 0xe7, 0x01, 0x22, + 0x00, 0x21, 0x60, 0x1c, 0x24, 0xe7, 0x80, 0x22, 0x07, 0x21, 0x04, 0xf1, + 0x92, 0x00, 0x1f, 0xe7, 0x4f, 0xf4, 0xfa, 0x60, 0x03, 0xf0, 0x00, 0xbe, + 0x2d, 0xe9, 0xf0, 0x41, 0x0e, 0x46, 0x2d, 0x49, 0x00, 0x25, 0x00, 0x27, + 0x51, 0xf8, 0x20, 0x80, 0x02, 0x2e, 0x01, 0xd0, 0x30, 0x00, 0x33, 0xd1, + 0x08, 0xf1, 0xb0, 0x04, 0x20, 0x78, 0xc0, 0xf3, 0x80, 0x00, 0x58, 0xb3, + 0x00, 0x23, 0x04, 0x22, 0x02, 0x21, 0xff, 0xf7, 0xda, 0xff, 0x00, 0xf0, + 0x47, 0xf8, 0x01, 0x23, 0x08, 0x22, 0x03, 0x21, 0xff, 0xf7, 0xd3, 0xff, + 0x08, 0xf1, 0xb1, 0x04, 0x00, 0xf0, 0x3e, 0xf8, 0x21, 0x78, 0x20, 0x78, + 0x49, 0x08, 0x00, 0xf0, 0x01, 0x00, 0x01, 0xf0, 0x01, 0x02, 0x02, 0x43, + 0x02, 0xd0, 0x7f, 0x1c, 0x32, 0x2f, 0xf1, 0xd3, 0x32, 0x2f, 0x0d, 0xd1, + 0x01, 0xf0, 0x01, 0x01, 0x08, 0x42, 0x18, 0xbf, 0x4b, 0xf2, 0x09, 0x45, + 0x23, 0xd1, 0x00, 0x28, 0x0c, 0xbf, 0x4b, 0xf2, 0x07, 0x45, 0x4b, 0xf2, + 0x08, 0x45, 0x1c, 0xe0, 0x02, 0x2e, 0x01, 0xd0, 0x01, 0x2e, 0x18, 0xd1, + 0x08, 0xf1, 0xb2, 0x00, 0x01, 0x78, 0xc9, 0x07, 0x13, 0xd5, 0x00, 0x23, + 0x01, 0x22, 0x00, 0x21, 0xff, 0xf7, 0xd0, 0xfe, 0x00, 0x26, 0x00, 0xf0, + 0x11, 0xf8, 0x08, 0xf1, 0xb3, 0x00, 0x00, 0x78, 0xc0, 0x09, 0x02, 0xd1, + 0x76, 0x1c, 0x32, 0x2e, 0xf5, 0xd3, 0x32, 0x2e, 0x08, 0xbf, 0x4b, 0xf2, + 0x0a, 0x45, 0x28, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x5c, 0x9d, 0x04, 0x02, + 0x01, 0x20, 0x03, 0xf0, 0x9d, 0xbd, 0x00, 0x00, 0xdf, 0xf8, 0x64, 0x0c, + 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, 0x08, 0xe0, 0xdf, 0xf8, 0x58, 0x0c, + 0xdf, 0xf8, 0x58, 0x2c, 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, 0x11, 0x68, + 0x08, 0x40, 0x00, 0xf0, 0xff, 0x00, 0x70, 0x47, 0xdf, 0xf8, 0x40, 0x0c, + 0xdf, 0xf8, 0x40, 0x2c, 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, 0x11, 0x68, + 0x08, 0x40, 0x00, 0x04, 0x00, 0x0e, 0x70, 0x47, 0xdf, 0xf8, 0x28, 0x0c, + 0xdf, 0xf8, 0x28, 0x2c, 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, 0x11, 0x68, + 0x08, 0x40, 0x00, 0x0c, 0x00, 0xf0, 0x03, 0x00, 0x70, 0x47, 0xdf, 0xf8, + 0x10, 0x1c, 0x09, 0x68, 0x0a, 0x18, 0xe0, 0x20, 0x92, 0xf8, 0xbc, 0x30, + 0x43, 0x43, 0xc8, 0x18, 0xc4, 0x30, 0x70, 0x47, 0xdf, 0xf8, 0xf8, 0x1b, + 0x09, 0x68, 0x0a, 0x18, 0xed, 0x20, 0x92, 0xf8, 0xbc, 0x30, 0x43, 0x43, + 0xc8, 0x18, 0x00, 0xf2, 0x44, 0x40, 0x70, 0x47, 0x00, 0x78, 0x02, 0x40, + 0xca, 0x40, 0xd0, 0xb2, 0x70, 0x47, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, + 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, 0x0d, 0xf8, 0x01, 0x70, 0x07, 0xe0, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x00, 0xf0, + 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x70, 0x47, 0x7c, 0xb5, + 0xdf, 0xf8, 0xa8, 0x1b, 0xdf, 0xf8, 0xa8, 0x5b, 0x09, 0x78, 0xdf, 0xf8, + 0xa8, 0x6b, 0xdf, 0xf8, 0xa8, 0x4b, 0x01, 0xf0, 0x03, 0x01, 0x29, 0x77, + 0x71, 0x78, 0x01, 0xf0, 0x03, 0x01, 0x69, 0x77, 0xdf, 0xf8, 0x80, 0x1b, + 0x0b, 0x68, 0x5a, 0x69, 0x4f, 0xf4, 0x7a, 0x71, 0x4a, 0x43, 0x2a, 0x60, + 0x10, 0xb3, 0x01, 0x23, 0x80, 0x22, 0x07, 0x21, 0x00, 0xf0, 0x66, 0xff, + 0x00, 0x20, 0x01, 0xf0, 0xe4, 0xf8, 0x28, 0x62, 0x01, 0xf0, 0x65, 0xf8, + 0xdf, 0xf8, 0x48, 0x0e, 0xff, 0xf7, 0xbd, 0xff, 0x01, 0x23, 0x04, 0x22, + 0x02, 0x21, 0x01, 0xf0, 0x54, 0xf8, 0x01, 0xf0, 0x4f, 0xf8, 0x30, 0x78, + 0x00, 0xf0, 0x01, 0x00, 0x8d, 0xf8, 0x00, 0x00, 0x02, 0xb0, 0x30, 0x46, + 0xbd, 0xe8, 0x70, 0x40, 0x01, 0x23, 0x01, 0x22, 0x00, 0xf0, 0x93, 0xbd, + 0x20, 0x78, 0xc0, 0x09, 0x0c, 0xbf, 0x01, 0x20, 0x00, 0x20, 0x01, 0xf0, + 0xc2, 0xf8, 0x28, 0x62, 0x73, 0xbd, 0x00, 0x28, 0x00, 0xd1, 0x70, 0x47, + 0x80, 0xb5, 0x01, 0x20, 0x01, 0xf0, 0xb9, 0xf8, 0xdf, 0xf8, 0x20, 0x1b, + 0x08, 0x63, 0x00, 0x23, 0xbd, 0xe8, 0x00, 0x50, 0x80, 0x22, 0x07, 0x21, + 0xdf, 0xf8, 0x0c, 0x0b, 0x8d, 0xe7, 0xdf, 0xf8, 0xf4, 0x0a, 0xdf, 0xf8, + 0x08, 0x3b, 0x01, 0x68, 0xc8, 0x69, 0x4f, 0xf4, 0x7a, 0x72, 0xb0, 0xfb, + 0xf2, 0xf0, 0x41, 0x1e, 0x83, 0xf8, 0x34, 0x10, 0x00, 0x20, 0x70, 0x47, + 0x2d, 0xe9, 0xf1, 0x4f, 0x86, 0xb0, 0x00, 0x20, 0x00, 0x90, 0x00, 0x24, + 0xff, 0xf7, 0x42, 0xff, 0x01, 0x90, 0x01, 0x98, 0xe0, 0x40, 0xc1, 0x07, + 0x40, 0xf1, 0xe5, 0x80, 0xe0, 0xb2, 0xff, 0xf7, 0x52, 0xff, 0x05, 0x46, + 0xdf, 0xf8, 0xa4, 0x0d, 0x5f, 0xfa, 0x84, 0xf9, 0x05, 0xf1, 0x93, 0x07, + 0x50, 0xf8, 0x39, 0x60, 0x3b, 0x68, 0xdf, 0xf8, 0x98, 0x2d, 0x00, 0xf0, + 0xb4, 0xfc, 0x00, 0xf0, 0x3b, 0xff, 0x00, 0xf0, 0xf6, 0xfc, 0x00, 0xf0, + 0xed, 0xfc, 0xdf, 0xf8, 0x80, 0x0d, 0x3b, 0x68, 0xdf, 0xf8, 0x7c, 0x2d, + 0x00, 0xeb, 0xc9, 0x01, 0x05, 0xf1, 0x6f, 0x07, 0x4e, 0x68, 0x00, 0xf0, + 0xa2, 0xfc, 0x00, 0xf0, 0x29, 0xff, 0x00, 0xf0, 0xe4, 0xfc, 0x00, 0xf0, + 0xdb, 0xfc, 0xdf, 0xf8, 0x64, 0x0d, 0x50, 0xf8, 0x29, 0x90, 0x7b, 0x7f, + 0x4f, 0xf4, 0x40, 0x52, 0x0c, 0x21, 0x00, 0xf0, 0x96, 0xfc, 0x05, 0xf1, + 0x8f, 0x08, 0x4f, 0xf4, 0x40, 0x72, 0x98, 0xf8, 0x02, 0x30, 0x08, 0x21, + 0x00, 0xf0, 0x8d, 0xfc, 0x98, 0xf8, 0x03, 0x30, 0x30, 0x22, 0x04, 0x21, + 0x09, 0xf1, 0x14, 0x00, 0xff, 0xf7, 0x36, 0xff, 0x98, 0xf8, 0x00, 0x30, + 0x4f, 0xf0, 0x40, 0x52, 0x1c, 0x21, 0x00, 0xf0, 0x97, 0xfe, 0x09, 0xf1, + 0x20, 0x0b, 0x98, 0xf8, 0x01, 0x30, 0x00, 0xf0, 0x8c, 0xfc, 0x3b, 0x7f, + 0x4f, 0xf4, 0x80, 0x52, 0x0c, 0x21, 0x00, 0xf0, 0x8b, 0xfe, 0x09, 0xf1, + 0x04, 0x06, 0xbb, 0x7f, 0x4f, 0xf4, 0x40, 0x52, 0x0c, 0x21, 0x00, 0xf0, + 0xf3, 0xfe, 0x09, 0xf1, 0x10, 0x0a, 0xfb, 0x7f, 0x4f, 0xf0, 0x40, 0x72, + 0x18, 0x21, 0x00, 0xf0, 0x81, 0xfe, 0xbb, 0x7e, 0x30, 0x22, 0x04, 0x21, + 0x00, 0xf0, 0x74, 0xfc, 0xdf, 0xf8, 0xf8, 0x09, 0x90, 0xf8, 0x34, 0x30, + 0x09, 0xf1, 0x1c, 0x0b, 0x4f, 0xf4, 0x7f, 0x02, 0x10, 0x21, 0x00, 0xf0, + 0x69, 0xfc, 0x98, 0xf8, 0x08, 0x30, 0x07, 0x22, 0x00, 0xf0, 0x72, 0xfc, + 0x3d, 0x35, 0x07, 0x22, 0xeb, 0x78, 0x00, 0x21, 0x09, 0xf1, 0x0c, 0x00, + 0xff, 0xf7, 0xf6, 0xfe, 0x09, 0xf1, 0x08, 0x08, 0x2b, 0x79, 0x4f, 0xf0, + 0xe0, 0x42, 0x1c, 0x21, 0x00, 0xf0, 0x4e, 0xfc, 0x6b, 0x79, 0x4f, 0xf0, + 0xe0, 0x62, 0x00, 0xf0, 0x50, 0xfe, 0xfb, 0x78, 0x00, 0xf0, 0x51, 0xfe, + 0x3b, 0x79, 0x4f, 0xf0, 0xe0, 0x42, 0x1c, 0x21, 0x00, 0xf0, 0x46, 0xfc, + 0x7b, 0x79, 0x4f, 0xf0, 0xe0, 0x62, 0x18, 0x21, 0x00, 0xf0, 0xb2, 0xfe, + 0x2b, 0x78, 0x4f, 0xf4, 0xe0, 0x62, 0x00, 0xf0, 0x34, 0xfc, 0x6b, 0x78, + 0x00, 0xf0, 0x19, 0xfc, 0x00, 0xf0, 0x38, 0xfe, 0xab, 0x78, 0x07, 0x22, + 0x00, 0x21, 0x09, 0xf1, 0x18, 0x00, 0xff, 0xf7, 0xc9, 0xfe, 0x3b, 0x78, + 0x70, 0x22, 0x04, 0x21, 0x00, 0xf0, 0x2a, 0xfc, 0x7b, 0x78, 0x00, 0xf0, + 0x08, 0xfc, 0x00, 0xf0, 0x0e, 0xfc, 0xbb, 0x78, 0x4f, 0xf4, 0xe0, 0x02, + 0x14, 0x21, 0x00, 0xf0, 0x27, 0xfe, 0x01, 0x23, 0x4f, 0xf4, 0x80, 0x72, + 0x08, 0x21, 0x00, 0xf0, 0x1b, 0xfe, 0x01, 0x23, 0x4f, 0xf4, 0x80, 0x12, + 0x14, 0x21, 0x09, 0xf1, 0x0c, 0x00, 0xff, 0xf7, 0xab, 0xfe, 0x01, 0x23, + 0x4f, 0xf4, 0x80, 0x72, 0x08, 0x21, 0x00, 0xf0, 0x0b, 0xfc, 0x01, 0x23, + 0x4f, 0xf4, 0x80, 0x52, 0x0c, 0x21, 0x09, 0xf1, 0x14, 0x00, 0xff, 0xf7, + 0x9d, 0xfe, 0x00, 0x21, 0xe0, 0xb2, 0x00, 0xf0, 0x3c, 0xfe, 0x01, 0x21, + 0xe0, 0xb2, 0x00, 0xf0, 0x38, 0xfe, 0x64, 0x1c, 0xe0, 0xb2, 0x08, 0x28, + 0x7f, 0xf4, 0x11, 0xaf, 0x9d, 0xf8, 0x18, 0x00, 0xb0, 0xb1, 0xdf, 0xf8, + 0xe0, 0x18, 0x0a, 0x68, 0xd2, 0xf8, 0xb8, 0x00, 0xc0, 0xf3, 0x07, 0x24, + 0x00, 0x98, 0x00, 0x25, 0x24, 0xfa, 0x05, 0xf1, 0xc9, 0x07, 0x44, 0xbf, + 0xe8, 0xb2, 0x12, 0xf0, 0x6d, 0xfe, 0x6d, 0x1c, 0xe9, 0xb2, 0x08, 0x29, + 0x01, 0xd0, 0x00, 0x28, 0xf2, 0xd0, 0x00, 0x90, 0xff, 0xf7, 0x2a, 0xfe, + 0x02, 0x90, 0x00, 0x24, 0x00, 0x98, 0x32, 0x25, 0x00, 0x28, 0x40, 0xf0, + 0xa8, 0x81, 0x02, 0x98, 0xe0, 0x40, 0xc1, 0x07, 0x40, 0xf1, 0x9e, 0x81, + 0x00, 0xf0, 0xe3, 0xfb, 0x07, 0x46, 0x4f, 0xf0, 0x00, 0x08, 0xdf, 0xf8, + 0x64, 0x0c, 0x00, 0xeb, 0xc4, 0x01, 0x01, 0x91, 0x51, 0xf8, 0x28, 0x90, + 0xdf, 0xf8, 0x58, 0x1c, 0x08, 0x68, 0x00, 0xeb, 0x84, 0x02, 0x00, 0x21, + 0x93, 0x6a, 0x6f, 0xf0, 0x7f, 0x42, 0x00, 0xf0, 0xa0, 0xfb, 0x09, 0xf1, + 0x04, 0x06, 0x00, 0xf0, 0xe6, 0xfd, 0x00, 0xf0, 0x23, 0xfe, 0x00, 0xf0, + 0xc2, 0xfd, 0x00, 0xf0, 0x1f, 0xfe, 0x00, 0xf0, 0xc5, 0xfb, 0x00, 0xf0, + 0x1b, 0xfe, 0x05, 0xfb, 0x08, 0xf0, 0x38, 0x44, 0x09, 0xf1, 0x40, 0x0a, + 0xd0, 0xf8, 0x25, 0x60, 0xdf, 0xf8, 0x84, 0x2d, 0x33, 0x46, 0x06, 0x21, + 0x00, 0xf0, 0xa4, 0xfd, 0x09, 0xf1, 0x54, 0x09, 0x33, 0x46, 0xdf, 0xf8, + 0x74, 0x2d, 0x06, 0x21, 0x00, 0xf0, 0x96, 0xfd, 0x00, 0xf0, 0xa5, 0xfd, + 0x00, 0xf0, 0x98, 0xfd, 0x00, 0xf0, 0xa1, 0xfd, 0x00, 0xf0, 0x8e, 0xfd, + 0x00, 0xf0, 0xa4, 0xfb, 0x00, 0xf0, 0x90, 0xfd, 0x00, 0xf0, 0xa0, 0xfb, + 0x00, 0xf0, 0x86, 0xfd, 0x00, 0xf0, 0xb5, 0xfd, 0x00, 0xf0, 0x88, 0xfd, + 0x00, 0xf0, 0xb1, 0xfd, 0x00, 0xf0, 0x7e, 0xfd, 0x08, 0xf1, 0x01, 0x08, + 0xb8, 0xf1, 0x01, 0x0f, 0xad, 0xdd, 0xdf, 0xf8, 0x34, 0x0d, 0x50, 0xf8, + 0x24, 0x90, 0x3d, 0x46, 0x05, 0xf1, 0x82, 0x07, 0x09, 0xf1, 0x04, 0x08, + 0xfb, 0x78, 0x4f, 0xf0, 0x40, 0x42, 0x1e, 0x21, 0x00, 0xf0, 0x62, 0xfb, + 0x3b, 0x78, 0x4f, 0xf4, 0x40, 0x42, 0x0e, 0x21, 0x00, 0xf0, 0x5c, 0xfb, + 0x05, 0xf1, 0x5f, 0x06, 0x4f, 0xf4, 0x40, 0x02, 0x73, 0x7f, 0x16, 0x21, + 0x00, 0xf0, 0x54, 0xfb, 0x09, 0xf1, 0x0c, 0x0a, 0x73, 0x7f, 0x00, 0xf0, + 0x5a, 0xfd, 0x73, 0x7f, 0x4f, 0xf4, 0x60, 0x22, 0x11, 0x21, 0x09, 0xf1, + 0x08, 0x00, 0xff, 0xf7, 0xe7, 0xfd, 0x05, 0xf1, 0xcd, 0x0b, 0x4f, 0xf4, + 0x60, 0x12, 0x9b, 0xf8, 0x01, 0x30, 0x13, 0x21, 0x00, 0xf0, 0x3e, 0xfb, + 0x9b, 0xf8, 0x00, 0x30, 0x00, 0xf0, 0x21, 0xfb, 0x00, 0xf0, 0x38, 0xfb, + 0x7b, 0x78, 0x4f, 0xf4, 0x40, 0x72, 0x00, 0xf0, 0x32, 0xfb, 0x3b, 0x79, + 0x60, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x2e, 0xfb, 0xbb, 0x78, 0x18, 0x22, + 0x03, 0x21, 0x00, 0xf0, 0x29, 0xfb, 0xbb, 0x79, 0x00, 0xf0, 0x51, 0xfd, + 0x20, 0x46, 0xff, 0xf7, 0x9e, 0xfd, 0x4f, 0xf4, 0x40, 0x22, 0x90, 0xf8, + 0x92, 0x30, 0x12, 0x21, 0x00, 0xf0, 0x2a, 0xfd, 0xdf, 0xf8, 0x54, 0x07, + 0x90, 0xf8, 0x34, 0x30, 0xff, 0x22, 0x00, 0x21, 0x09, 0xf1, 0x10, 0x00, + 0xff, 0xf7, 0xb2, 0xfd, 0x01, 0x23, 0x4f, 0xf0, 0x80, 0x72, 0x18, 0x21, + 0x00, 0xf0, 0x0c, 0xfb, 0x00, 0xf0, 0x42, 0xfb, 0x00, 0xf0, 0x08, 0xfb, + 0x01, 0x23, 0x4f, 0xf0, 0x80, 0x52, 0x1c, 0x21, 0x00, 0xf0, 0x10, 0xfd, + 0x01, 0x23, 0x4f, 0xf4, 0x00, 0x02, 0x17, 0x21, 0x00, 0xf0, 0x0a, 0xfd, + 0x01, 0x23, 0x4f, 0xf4, 0x00, 0x32, 0x11, 0x21, 0x00, 0xf0, 0x04, 0xfd, + 0xdf, 0xf8, 0x7c, 0x0d, 0x50, 0xf8, 0x24, 0xa0, 0x33, 0x7f, 0x18, 0x22, + 0x03, 0x21, 0x00, 0xf0, 0xfb, 0xfc, 0xf3, 0x7e, 0x00, 0xf0, 0x07, 0xfd, + 0xb3, 0x7e, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0xf3, 0xfc, 0x73, 0x7e, + 0x00, 0xf0, 0x0d, 0xfd, 0xb0, 0x79, 0x01, 0x28, 0x0c, 0xbf, 0x01, 0x23, + 0x00, 0x23, 0x4f, 0xf4, 0x80, 0x72, 0x08, 0x21, 0x00, 0xf0, 0xe6, 0xfc, + 0x2d, 0x35, 0x09, 0xf1, 0x08, 0x0b, 0x6b, 0x79, 0x07, 0x22, 0x00, 0x21, + 0x00, 0xf0, 0xd6, 0xfa, 0x2b, 0x78, 0x4f, 0xf4, 0xe0, 0x62, 0x08, 0x21, + 0x00, 0xf0, 0xd0, 0xfa, 0x6b, 0x78, 0x38, 0x22, 0x03, 0x21, 0x00, 0xf0, + 0xcb, 0xfa, 0x09, 0xf1, 0x14, 0x05, 0x73, 0x79, 0x07, 0x22, 0x00, 0x21, + 0x28, 0x46, 0xff, 0xf7, 0x5d, 0xfd, 0x33, 0x78, 0x4f, 0xf4, 0xe0, 0x62, + 0x08, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x56, 0xfd, 0x73, 0x78, 0x70, 0x22, + 0x04, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x50, 0xfd, 0x7b, 0x79, 0x00, 0xf0, + 0xc5, 0xfa, 0x00, 0xf0, 0xe6, 0xfd, 0x0a, 0xf1, 0x0c, 0x00, 0xff, 0xf7, + 0x47, 0xfd, 0x00, 0x27, 0x32, 0x25, 0x01, 0x98, 0x50, 0xf8, 0x27, 0x60, + 0x00, 0xf0, 0xbd, 0xfa, 0x80, 0x46, 0x00, 0x23, 0x04, 0x22, 0x02, 0x21, + 0x00, 0xf0, 0x86, 0xfa, 0x05, 0xfb, 0x07, 0xf0, 0x40, 0x44, 0x00, 0xf1, + 0x2a, 0x08, 0x01, 0x22, 0x98, 0xf8, 0x01, 0x30, 0x00, 0xf0, 0xa4, 0xfa, + 0x98, 0xf8, 0x00, 0x30, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0x02, 0xfd, + 0x7f, 0x1c, 0x01, 0x2f, 0xe1, 0xdd, 0x00, 0xf0, 0xa2, 0xfa, 0x07, 0x46, + 0xdf, 0xf8, 0x9c, 0x0c, 0xdf, 0xf8, 0x9c, 0x2c, 0x50, 0xf8, 0x24, 0x90, + 0x07, 0xf1, 0xbb, 0x06, 0x09, 0xf1, 0x38, 0x08, 0x33, 0x78, 0x10, 0x21, + 0x00, 0xf0, 0x76, 0xfa, 0x73, 0x78, 0x4f, 0xf6, 0xfc, 0x72, 0x02, 0x21, + 0x00, 0xf0, 0x70, 0xfa, 0xb3, 0x78, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, + 0x6b, 0xfa, 0xf3, 0x78, 0x01, 0x22, 0x00, 0xf0, 0x80, 0xfa, 0x09, 0xf1, + 0x3c, 0x08, 0x33, 0x79, 0x4f, 0xf4, 0xff, 0x02, 0x0f, 0x21, 0x00, 0xf0, + 0x5f, 0xfa, 0x73, 0x79, 0x4f, 0xf4, 0xf8, 0x42, 0x0a, 0x21, 0x00, 0xf0, + 0x59, 0xfa, 0xb3, 0x79, 0x4f, 0xf4, 0xfc, 0x72, 0x03, 0x21, 0x00, 0xf0, + 0x53, 0xfa, 0xf3, 0x79, 0x00, 0xf0, 0x68, 0xfa, 0x33, 0x7a, 0x6f, 0xf0, + 0x7e, 0x42, 0x00, 0x21, 0x09, 0xf1, 0x40, 0x00, 0xff, 0xf7, 0xe8, 0xfc, + 0x97, 0xf8, 0x8d, 0x30, 0x01, 0x22, 0x00, 0xf0, 0x65, 0xfc, 0x00, 0xf0, + 0x5e, 0xfa, 0x07, 0x46, 0x02, 0x22, 0x97, 0xf8, 0x8e, 0x30, 0x01, 0x21, + 0x00, 0xf0, 0x42, 0xfc, 0x97, 0xf8, 0x8e, 0x00, 0x01, 0x28, 0x0b, 0xd1, + 0x09, 0xf1, 0x04, 0x09, 0x00, 0x20, 0x07, 0xeb, 0x40, 0x01, 0x40, 0x1c, + 0xb1, 0xf8, 0x8f, 0x20, 0x29, 0xf8, 0x02, 0x2b, 0x0a, 0x28, 0xf6, 0xd1, + 0x64, 0x1c, 0xe4, 0xb2, 0x08, 0x2c, 0x7f, 0xf4, 0x58, 0xae, 0x9d, 0xf8, + 0x18, 0x00, 0x00, 0x28, 0x00, 0xf0, 0x54, 0x81, 0xff, 0xf7, 0x6e, 0xfc, + 0x04, 0x46, 0x00, 0x98, 0x00, 0x25, 0x50, 0xb9, 0x24, 0xfa, 0x05, 0xf1, + 0xc9, 0x07, 0x44, 0xbf, 0xe8, 0xb2, 0x12, 0xf0, 0x02, 0xfe, 0x6d, 0x1c, + 0xe9, 0xb2, 0x08, 0x29, 0xf3, 0xd1, 0x00, 0x25, 0x04, 0x94, 0x00, 0x28, + 0x40, 0xf0, 0x3d, 0x81, 0x04, 0x99, 0xe9, 0x40, 0xca, 0x07, 0x40, 0xf1, + 0x33, 0x81, 0x03, 0x90, 0xe8, 0xb2, 0x06, 0xf0, 0x4f, 0xfb, 0x04, 0x00, + 0x03, 0xd1, 0x4f, 0xf6, 0x77, 0x70, 0x03, 0x90, 0x27, 0xe1, 0xdf, 0xf8, + 0x94, 0x1b, 0xdf, 0xf8, 0x94, 0x0b, 0x5f, 0xfa, 0x85, 0xf9, 0x51, 0xf8, + 0x29, 0x70, 0x50, 0xf8, 0x29, 0x10, 0x00, 0x91, 0x00, 0xf0, 0xf7, 0xf9, + 0x00, 0xf0, 0xe7, 0xf9, 0x00, 0xf0, 0xf3, 0xf9, 0x00, 0xf0, 0xdf, 0xf9, + 0x00, 0xf0, 0xef, 0xf9, 0x00, 0xf0, 0xd7, 0xf9, 0x07, 0xf1, 0x8c, 0x08, + 0x00, 0xf0, 0xe9, 0xf9, 0x00, 0xf0, 0xde, 0xf9, 0x07, 0xf1, 0x9c, 0x06, + 0x00, 0xf0, 0xe3, 0xf9, 0x00, 0xf0, 0x50, 0xfc, 0x07, 0xf1, 0xac, 0x0a, + 0x00, 0xf0, 0xdd, 0xf9, 0x00, 0xf0, 0xe0, 0xfb, 0x00, 0xf0, 0x0d, 0xfa, + 0x00, 0xf0, 0xc9, 0xf9, 0x00, 0xf0, 0x09, 0xfa, 0x00, 0xf0, 0xc1, 0xf9, + 0x00, 0xf0, 0x05, 0xfa, 0x00, 0xf0, 0xb9, 0xf9, 0x00, 0xf0, 0x01, 0xfa, + 0x00, 0xf0, 0xc2, 0xf9, 0x00, 0xf0, 0xfd, 0xf9, 0x00, 0xf0, 0x36, 0xfc, + 0x00, 0xf0, 0xf9, 0xf9, 0x00, 0xf0, 0xc8, 0xfb, 0x04, 0xf2, 0x0c, 0x7b, + 0x40, 0xf2, 0xff, 0x32, 0xbb, 0xf8, 0x00, 0x30, 0x00, 0x21, 0x07, 0xf1, + 0x48, 0x00, 0xff, 0xf7, 0x4f, 0xfc, 0xb4, 0xf8, 0x61, 0x37, 0x00, 0xf0, + 0x86, 0xf9, 0x07, 0xf1, 0x84, 0x00, 0xff, 0xf7, 0x47, 0xfc, 0xbb, 0xf8, + 0x02, 0x10, 0x02, 0x91, 0x00, 0x21, 0xbb, 0xf8, 0x04, 0x20, 0x02, 0x9b, + 0x01, 0x92, 0x40, 0xf2, 0xff, 0x32, 0xbb, 0xf8, 0x06, 0xb0, 0x00, 0xf0, + 0x94, 0xf9, 0x01, 0x9b, 0x00, 0xf0, 0x71, 0xf9, 0x00, 0xf0, 0x8b, 0xf9, + 0x00, 0xf0, 0x6c, 0xf9, 0x00, 0xf0, 0x83, 0xf9, 0x02, 0x9b, 0x40, 0xf2, + 0xff, 0x32, 0x00, 0xf0, 0xa4, 0xf9, 0x01, 0x9b, 0x40, 0xf2, 0xff, 0x32, + 0x00, 0xf0, 0x9a, 0xf9, 0x00, 0xf0, 0x5e, 0xf9, 0x00, 0xf0, 0x90, 0xfb, + 0xdf, 0xf8, 0xa8, 0x0a, 0x50, 0xf8, 0x29, 0x00, 0x50, 0xf8, 0x28, 0x3f, + 0x02, 0x99, 0x01, 0x9a, 0x03, 0xf0, 0x40, 0x43, 0x0b, 0x43, 0x43, 0xea, + 0x82, 0x23, 0x43, 0xea, 0x0b, 0x53, 0x4f, 0xf0, 0xff, 0x32, 0x00, 0x21, + 0xff, 0xf7, 0x0e, 0xfc, 0x04, 0xf2, 0xa9, 0x7b, 0x9b, 0xf8, 0x06, 0x30, + 0x00, 0xf0, 0x8e, 0xfb, 0x94, 0xf8, 0x0b, 0x37, 0x4f, 0xf4, 0x40, 0x32, + 0x10, 0x21, 0x07, 0xf1, 0x48, 0x00, 0xff, 0xf7, 0xff, 0xfb, 0x04, 0xf2, + 0x54, 0x74, 0x4f, 0xf4, 0x40, 0x32, 0x23, 0x7b, 0x10, 0x21, 0x07, 0xf1, + 0x84, 0x00, 0xff, 0xf7, 0xf5, 0xfb, 0x9b, 0xf8, 0x07, 0x30, 0x00, 0x98, + 0x4f, 0xf4, 0x60, 0x42, 0x0d, 0x21, 0xff, 0xf7, 0xed, 0xfb, 0x9b, 0xf8, + 0x08, 0x30, 0x00, 0x98, 0x00, 0xf0, 0x2f, 0xf9, 0xff, 0xf7, 0xe6, 0xfb, + 0x9b, 0xf8, 0x09, 0x30, 0x00, 0x98, 0x4f, 0xf4, 0x60, 0x12, 0x13, 0x21, + 0xff, 0xf7, 0xde, 0xfb, 0x23, 0x78, 0x00, 0xf0, 0x1e, 0xf9, 0x00, 0xf0, + 0x34, 0xf9, 0x63, 0x78, 0x00, 0xf0, 0x19, 0xf9, 0x00, 0xf0, 0x2b, 0xf9, + 0xa3, 0x78, 0x00, 0xf0, 0x14, 0xf9, 0x00, 0xf0, 0x22, 0xf9, 0x9b, 0xf8, + 0x00, 0x30, 0x00, 0xf0, 0x0e, 0xf9, 0x00, 0xf0, 0x29, 0xf9, 0x9b, 0xf8, + 0x01, 0x30, 0x00, 0xf0, 0x08, 0xf9, 0x00, 0xf0, 0x9b, 0xfb, 0x9b, 0xf8, + 0x02, 0x30, 0x00, 0xf0, 0x02, 0xf9, 0x00, 0xf0, 0x2b, 0xfb, 0xe3, 0x78, + 0x00, 0xf0, 0xf9, 0xf8, 0x00, 0xf0, 0x13, 0xf9, 0x23, 0x79, 0x00, 0xf0, + 0xf4, 0xf8, 0x00, 0xf0, 0x0a, 0xf9, 0x63, 0x79, 0x00, 0xf0, 0xef, 0xf8, + 0x00, 0xf0, 0x01, 0xf9, 0x9b, 0xf8, 0x03, 0x30, 0x00, 0xf0, 0xe9, 0xf8, + 0x00, 0xf0, 0x08, 0xf9, 0x9b, 0xf8, 0x04, 0x30, 0x00, 0xf0, 0xe3, 0xf8, + 0x00, 0xf0, 0x7a, 0xfb, 0x9b, 0xf8, 0x05, 0x30, 0x00, 0xf0, 0xdd, 0xf8, + 0x00, 0xf0, 0x0a, 0xfb, 0x00, 0xf0, 0x03, 0xf9, 0x38, 0x1d, 0xff, 0xf7, + 0x97, 0xfb, 0x00, 0x98, 0x00, 0xf0, 0x2f, 0xfc, 0x2c, 0x30, 0xff, 0xf7, + 0x91, 0xfb, 0x00, 0xf0, 0x27, 0xf9, 0x07, 0xf1, 0x18, 0x00, 0xff, 0xf7, + 0x8b, 0xfb, 0x00, 0xf0, 0x21, 0xf9, 0x07, 0xf1, 0x28, 0x00, 0xff, 0xf7, + 0x85, 0xfb, 0x00, 0xf0, 0x1b, 0xf9, 0x07, 0xf1, 0x38, 0x00, 0xff, 0xf7, + 0x7f, 0xfb, 0xdf, 0xf8, 0x50, 0x09, 0x50, 0xf8, 0x29, 0x00, 0x01, 0x23, + 0x4f, 0xf0, 0x80, 0x52, 0x1c, 0x21, 0x00, 0xf5, 0xda, 0x70, 0xff, 0xf7, + 0x73, 0xfb, 0x03, 0x98, 0x6d, 0x1c, 0xe9, 0xb2, 0x08, 0x29, 0x7f, 0xf4, + 0xc0, 0xae, 0x00, 0x90, 0xff, 0xf7, 0x38, 0xfb, 0x80, 0x46, 0x00, 0x98, + 0xdf, 0xf8, 0x38, 0x59, 0xdf, 0xf8, 0x90, 0x92, 0xa9, 0x4f, 0x00, 0x26, + 0x00, 0x28, 0x40, 0xf0, 0x93, 0x80, 0x28, 0xfa, 0x06, 0xf0, 0xc0, 0x07, + 0x40, 0xf1, 0x89, 0x80, 0xf0, 0xb2, 0xd9, 0xf8, 0x00, 0x10, 0x55, 0xf8, + 0x20, 0x40, 0x70, 0x22, 0x12, 0xfb, 0x00, 0xf2, 0x0a, 0x44, 0x02, 0xf5, + 0x32, 0x6a, 0x04, 0xf1, 0x14, 0x0b, 0xda, 0xf8, 0x14, 0x30, 0xdf, 0xf8, + 0x04, 0x29, 0x04, 0x21, 0x00, 0xf0, 0xac, 0xf8, 0x00, 0xf0, 0xb2, 0xf8, + 0x00, 0xf0, 0xc6, 0xf8, 0x01, 0x23, 0x4f, 0xf0, 0x00, 0x52, 0x1d, 0x21, + 0x00, 0xf0, 0xa2, 0xf8, 0xda, 0xf8, 0x10, 0x30, 0xdf, 0xf8, 0xe4, 0x28, + 0x04, 0xf1, 0xe8, 0x0b, 0x05, 0x21, 0x00, 0xf0, 0x99, 0xf8, 0x00, 0xf0, + 0x9f, 0xf8, 0x00, 0xf0, 0xaf, 0xf8, 0x00, 0xf0, 0x93, 0xf8, 0x00, 0xf0, + 0xaf, 0xf8, 0x0a, 0xf1, 0x22, 0x0a, 0x20, 0x22, 0x9a, 0xf8, 0x04, 0x30, + 0x05, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x22, 0xfb, 0x9a, 0xf8, 0x03, 0x30, + 0x10, 0x22, 0x04, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x1b, 0xfb, 0x9a, 0xf8, + 0x00, 0x30, 0x07, 0x22, 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x14, 0xfb, + 0x04, 0xf1, 0x04, 0x0b, 0x9a, 0xf8, 0x07, 0x30, 0x4f, 0xf0, 0xe0, 0x72, + 0x16, 0x21, 0x00, 0xf0, 0x71, 0xf8, 0x9a, 0xf8, 0x0c, 0x30, 0x00, 0xf0, + 0x4e, 0xf8, 0x00, 0xf0, 0x6b, 0xf8, 0x9a, 0xf8, 0x05, 0x30, 0x4f, 0xf4, + 0x80, 0x42, 0x0e, 0x21, 0x00, 0xf0, 0x64, 0xf8, 0x9a, 0xf8, 0x09, 0x30, + 0x00, 0xf0, 0x5d, 0xf8, 0x9a, 0xf8, 0x0a, 0x30, 0x4f, 0xf4, 0x40, 0x62, + 0x0a, 0x21, 0x00, 0xf0, 0x59, 0xf8, 0x9a, 0xf8, 0x08, 0x30, 0x60, 0x22, + 0x05, 0x21, 0x00, 0xf0, 0x53, 0xf8, 0x9a, 0xf8, 0x0b, 0x30, 0x0c, 0x22, + 0x00, 0xf0, 0x58, 0xf8, 0x9a, 0xf8, 0x06, 0x30, 0x03, 0x22, 0x00, 0x21, + 0x00, 0xf0, 0x48, 0xf8, 0x97, 0xf8, 0x34, 0x30, 0x4f, 0xf0, 0x7f, 0x42, + 0x18, 0x21, 0x04, 0xf1, 0x08, 0x00, 0xff, 0xf7, 0xd9, 0xfa, 0x02, 0x23, + 0x4f, 0xf4, 0x40, 0x52, 0x0c, 0x21, 0x04, 0xf1, 0x2c, 0x00, 0xff, 0xf7, + 0xd1, 0xfa, 0x76, 0x1c, 0xf0, 0xb2, 0x02, 0x28, 0x7f, 0xf4, 0x6d, 0xaf, + 0x01, 0xf0, 0xf0, 0xfc, 0x00, 0x98, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x5b, 0x46, 0x40, 0xf2, 0xff, 0x32, 0x00, 0x21, 0x70, 0x47, 0x4f, 0xf0, + 0x7f, 0x52, 0x16, 0x21, 0x70, 0x47, 0x4f, 0xf4, 0x7f, 0x32, 0x0a, 0x21, + 0x70, 0x47, 0x4f, 0xf4, 0xe0, 0x22, 0x10, 0x21, 0x70, 0x47, 0x01, 0x21, + 0x30, 0x1d, 0xff, 0xf7, 0xb1, 0xba, 0x09, 0xf1, 0x24, 0x00, 0xff, 0xf7, + 0xad, 0xba, 0x07, 0xf1, 0x70, 0x00, 0xff, 0xf7, 0xa9, 0xba, 0x07, 0xf1, + 0x60, 0x00, 0xff, 0xf7, 0xa5, 0xba, 0x07, 0xf1, 0x50, 0x00, 0xff, 0xf7, + 0xa1, 0xba, 0x08, 0x21, 0x40, 0x46, 0xff, 0xf7, 0x9d, 0xba, 0x4f, 0xf4, + 0x40, 0x52, 0x0c, 0x21, 0x58, 0x46, 0xff, 0xf7, 0x97, 0xba, 0x00, 0x23, + 0x4f, 0xf0, 0x00, 0x42, 0x1f, 0x21, 0x70, 0x47, 0x00, 0x23, 0x04, 0x22, + 0x02, 0x21, 0x58, 0x46, 0xff, 0xf7, 0x8c, 0xba, 0x00, 0x21, 0x30, 0x46, + 0xff, 0xf7, 0x88, 0xba, 0x07, 0x22, 0x00, 0x21, 0x40, 0x46, 0xff, 0xf7, + 0x83, 0xba, 0x20, 0x46, 0xff, 0xf7, 0x66, 0xba, 0x01, 0x23, 0x10, 0x22, + 0x04, 0x21, 0x70, 0x47, 0x01, 0x23, 0x08, 0x22, 0x03, 0x21, 0x58, 0x46, + 0xff, 0xf7, 0x76, 0xba, 0x01, 0x23, 0x4f, 0xf0, 0x00, 0x62, 0x1b, 0x21, + 0x30, 0x46, 0xff, 0xf7, 0x6f, 0xba, 0x01, 0x23, 0x4f, 0xf0, 0x80, 0x52, + 0x1c, 0x21, 0x30, 0x46, 0xff, 0xf7, 0x68, 0xba, 0x01, 0x23, 0x4f, 0xf0, + 0x00, 0x72, 0x19, 0x21, 0x70, 0x47, 0x01, 0x23, 0x4f, 0xf0, 0x80, 0x42, + 0x1e, 0x21, 0x70, 0x47, 0x00, 0x28, 0x00, 0xd1, 0x70, 0x47, 0x10, 0xb5, + 0x00, 0xf0, 0xe4, 0xfa, 0xdf, 0xf8, 0x24, 0x07, 0x22, 0x4c, 0xff, 0xf7, + 0x4a, 0xfa, 0x00, 0xf0, 0xdd, 0xfa, 0xdf, 0xf8, 0x1c, 0x07, 0xff, 0xf7, + 0x44, 0xfa, 0x00, 0xf0, 0xd7, 0xfa, 0xdf, 0xf8, 0x14, 0x07, 0xff, 0xf7, + 0x3e, 0xfa, 0x00, 0xf0, 0xd1, 0xfa, 0xdf, 0xf8, 0x0c, 0x07, 0xff, 0xf7, + 0x38, 0xfa, 0x12, 0x48, 0x00, 0x68, 0x81, 0x69, 0x00, 0xee, 0x10, 0x1a, + 0xc1, 0x69, 0x00, 0xee, 0x90, 0x1a, 0xb8, 0xee, 0x40, 0x0a, 0xf8, 0xee, + 0x60, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0xea, 0xf7, 0xd1, 0xfa, 0xbd, 0xee, + 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x20, 0x75, 0xe0, 0x22, 0x23, 0x7d, + 0x08, 0x48, 0x05, 0x21, 0xff, 0xf7, 0x1d, 0xfa, 0x94, 0xf8, 0x34, 0x30, + 0xdf, 0xf8, 0xcc, 0x06, 0xbd, 0xe8, 0x10, 0x40, 0xff, 0x22, 0x00, 0x21, + 0xff, 0xf7, 0x13, 0xba, 0x5c, 0x75, 0x02, 0x21, 0x58, 0x75, 0x02, 0x21, + 0x17, 0x00, 0x00, 0x47, 0x34, 0x73, 0x03, 0x21, 0x2d, 0x04, 0x00, 0x47, + 0x19, 0x00, 0x00, 0x47, 0x24, 0x73, 0x03, 0x21, 0x2d, 0xe9, 0xf8, 0x4f, + 0x80, 0x46, 0x00, 0x20, 0x5f, 0xea, 0x08, 0x01, 0x00, 0x90, 0xdf, 0xf8, + 0x98, 0x96, 0x29, 0xd0, 0xdf, 0xf8, 0x94, 0x46, 0x00, 0x23, 0x40, 0x22, + 0x06, 0x21, 0x00, 0xf0, 0x93, 0xf9, 0x00, 0xf0, 0x70, 0xf9, 0x00, 0xf0, + 0x8f, 0xf9, 0xd9, 0xf8, 0x00, 0x00, 0x90, 0xf8, 0x2a, 0x30, 0x00, 0xf0, + 0x87, 0xf9, 0xd9, 0xf8, 0x00, 0x00, 0x90, 0xf8, 0x2b, 0x30, 0x02, 0x22, + 0x01, 0x21, 0x00, 0xf0, 0x81, 0xf9, 0xd9, 0xf8, 0x00, 0x00, 0xdf, 0xf8, + 0x64, 0x46, 0x90, 0xf8, 0x2c, 0x30, 0x0f, 0x22, 0x00, 0xf0, 0x77, 0xf9, + 0xd9, 0xf8, 0x00, 0x00, 0x90, 0xf8, 0x2d, 0x30, 0x70, 0x22, 0x04, 0x21, + 0x00, 0xf0, 0x70, 0xf9, 0xff, 0xf7, 0x9a, 0xf9, 0x05, 0x46, 0x4f, 0xf0, + 0x00, 0x0a, 0xdf, 0xf8, 0x40, 0x46, 0x25, 0xfa, 0x0a, 0xf0, 0xc0, 0x07, + 0x2b, 0xd5, 0x5f, 0xfa, 0x8a, 0xf0, 0x54, 0xf8, 0x20, 0xb0, 0xff, 0xf7, + 0xa4, 0xf9, 0x06, 0x46, 0x0b, 0xf2, 0x2c, 0x77, 0x00, 0xf0, 0x39, 0xf9, + 0x00, 0xf0, 0x26, 0xf9, 0x00, 0xf0, 0x59, 0xf9, 0x00, 0xf0, 0x22, 0xf9, + 0x16, 0xf8, 0xcb, 0x3f, 0x00, 0xf0, 0x40, 0xf9, 0x73, 0x78, 0x02, 0x22, + 0x01, 0x21, 0x00, 0xf0, 0x19, 0xf9, 0xf3, 0x78, 0x07, 0x22, 0x00, 0x21, + 0x0b, 0xf5, 0xe6, 0x60, 0xff, 0xf7, 0xae, 0xf9, 0x70, 0x78, 0x01, 0x28, + 0x03, 0xd1, 0x00, 0xf0, 0x22, 0xf9, 0x00, 0xf0, 0x0b, 0xf9, 0x00, 0xf0, + 0x16, 0xf9, 0x00, 0xf0, 0x07, 0xf9, 0x0a, 0xf1, 0x01, 0x0a, 0x5f, 0xfa, + 0x8a, 0xf0, 0x08, 0x28, 0xc9, 0xd1, 0xff, 0xf7, 0x51, 0xf9, 0x83, 0x46, + 0x00, 0x27, 0x2b, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x59, 0xd5, 0xf8, 0xb2, + 0xff, 0xf7, 0x78, 0xf9, 0x06, 0x46, 0xdf, 0xf8, 0xbc, 0x05, 0xfc, 0xb2, + 0x50, 0xf8, 0x24, 0x50, 0x05, 0xf1, 0x51, 0x0a, 0x00, 0xf0, 0xfd, 0xf8, + 0x00, 0xf0, 0x1e, 0xfa, 0x00, 0xf0, 0x1d, 0xf9, 0x00, 0xf0, 0x1a, 0xfa, + 0x16, 0xf8, 0xab, 0x3f, 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x14, 0xfa, + 0x73, 0x78, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0x0f, 0xfa, 0xf3, 0x78, + 0x07, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x52, 0x00, 0xff, 0xf7, 0x67, 0xf9, + 0x70, 0x78, 0x01, 0x28, 0x02, 0xd1, 0x00, 0x23, 0x00, 0xf0, 0x00, 0xfa, + 0x00, 0xf0, 0xd9, 0xf8, 0x00, 0xf0, 0xfe, 0xf9, 0xf8, 0xb2, 0xff, 0xf7, + 0x49, 0xf9, 0x05, 0x46, 0xdf, 0xf8, 0x60, 0x05, 0x50, 0xf8, 0x24, 0xa0, + 0x0a, 0xf2, 0xf2, 0x34, 0x00, 0xf0, 0xcf, 0xf8, 0x00, 0xf0, 0xee, 0xf8, + 0x00, 0xf0, 0xf3, 0xf8, 0x15, 0xf8, 0xb3, 0x3f, 0x00, 0xf0, 0xe6, 0xf8, + 0x6b, 0x78, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0xe3, 0xf8, 0xeb, 0x78, + 0x0a, 0xf2, 0xf3, 0x3a, 0x07, 0x22, 0x00, 0x21, 0x00, 0xf0, 0xde, 0xf9, + 0x68, 0x78, 0x01, 0x28, 0x03, 0xd1, 0x00, 0xf0, 0xba, 0xf8, 0x00, 0xf0, + 0xd5, 0xf8, 0x00, 0xf0, 0xae, 0xf8, 0x00, 0xf0, 0xd1, 0xf8, 0x7f, 0x1c, + 0xf8, 0xb2, 0x08, 0x28, 0x9d, 0xd1, 0xff, 0xf7, 0x03, 0xf9, 0x82, 0x46, + 0x00, 0x26, 0xdf, 0xf8, 0x08, 0x55, 0x2a, 0xfa, 0x06, 0xf0, 0xc0, 0x07, + 0x2f, 0xd5, 0xf0, 0xb2, 0xd9, 0xf8, 0x00, 0x10, 0x55, 0xf8, 0x20, 0x70, + 0x70, 0x22, 0x12, 0xfb, 0x00, 0xf2, 0x0a, 0x44, 0x02, 0xf5, 0x32, 0x6b, + 0x07, 0xf2, 0xf2, 0x34, 0x00, 0xf0, 0x93, 0xf8, 0x00, 0xf0, 0xb2, 0xf8, + 0x00, 0xf0, 0xb7, 0xf8, 0x1b, 0xf8, 0x5f, 0x3f, 0x00, 0xf0, 0xaa, 0xf8, + 0x9b, 0xf8, 0x01, 0x30, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0xa6, 0xf8, + 0x9b, 0xf8, 0x03, 0x30, 0x07, 0xf2, 0xf3, 0x37, 0x07, 0x22, 0x00, 0xf0, + 0x99, 0xf8, 0x9b, 0xf8, 0x01, 0x00, 0x01, 0x28, 0x03, 0xd1, 0x00, 0xf0, + 0x7c, 0xf8, 0x00, 0xf0, 0x97, 0xf8, 0x00, 0xf0, 0x70, 0xf8, 0x00, 0xf0, + 0x93, 0xf8, 0x76, 0x1c, 0xf0, 0xb2, 0x02, 0x28, 0xc7, 0xd1, 0xb8, 0xf1, + 0x00, 0x0f, 0x4d, 0xd0, 0xff, 0xf7, 0xa4, 0xf8, 0xdd, 0xf8, 0x00, 0x80, + 0xdf, 0xf8, 0x44, 0x64, 0x07, 0x46, 0x00, 0x24, 0x27, 0xfa, 0x04, 0xf0, + 0xc0, 0x07, 0x3b, 0xd5, 0xe0, 0xb2, 0x05, 0xf0, 0x95, 0xff, 0x4f, 0xf0, + 0x00, 0x08, 0x10, 0xb9, 0x4f, 0xf6, 0x77, 0x78, 0x2f, 0xe0, 0xe1, 0xb2, + 0x56, 0xf8, 0x21, 0x90, 0x42, 0xf2, 0xc1, 0x71, 0x45, 0x18, 0x01, 0x22, + 0x2b, 0x78, 0x00, 0xf0, 0x59, 0xf8, 0x09, 0xf1, 0x04, 0x0a, 0x6b, 0x78, + 0x00, 0xf0, 0x5d, 0xf8, 0xab, 0x78, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, + 0x3b, 0xf8, 0xeb, 0x78, 0x00, 0xf0, 0x47, 0xf8, 0x2b, 0x79, 0x4f, 0xf4, + 0x40, 0x72, 0x08, 0x21, 0x00, 0xf0, 0x2c, 0xf8, 0x6b, 0x79, 0x03, 0x22, + 0x00, 0xf0, 0x42, 0xf8, 0xab, 0x79, 0x1c, 0x22, 0x02, 0x21, 0x00, 0xf0, + 0x23, 0xf8, 0xeb, 0x79, 0xe0, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x1e, 0xf8, + 0xab, 0x7d, 0x4f, 0xf0, 0x40, 0x72, 0x00, 0xf0, 0x18, 0xf8, 0xb8, 0xf1, + 0x00, 0x0f, 0x03, 0xd1, 0x64, 0x1c, 0xe0, 0xb2, 0x08, 0x28, 0xbb, 0xd1, + 0xcd, 0xf8, 0x00, 0x80, 0x00, 0x98, 0xbd, 0xe8, 0xf2, 0x8f, 0x00, 0x00, + 0x31, 0x04, 0x00, 0x47, 0x9c, 0x91, 0x04, 0x02, 0xfe, 0xff, 0xff, 0x01, + 0x20, 0x96, 0x04, 0x02, 0x38, 0x46, 0xff, 0xf7, 0x99, 0xb8, 0x18, 0x21, + 0x48, 0x46, 0xff, 0xf7, 0x95, 0xb8, 0x4f, 0xf4, 0xe0, 0x42, 0x0c, 0x21, + 0x50, 0x46, 0xff, 0xf7, 0x8f, 0xb8, 0x00, 0x23, 0x10, 0x22, 0x04, 0x21, + 0x70, 0x47, 0x00, 0x23, 0x20, 0x22, 0x05, 0x21, 0x70, 0x47, 0x00, 0x23, + 0x08, 0x22, 0x03, 0x21, 0x70, 0x47, 0x04, 0x22, 0x02, 0x21, 0x50, 0x46, + 0xff, 0xf7, 0x7e, 0xb8, 0x00, 0x21, 0x48, 0x46, 0xff, 0xf7, 0x7a, 0xb8, + 0x01, 0x22, 0x00, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x75, 0xb8, 0x01, 0x22, + 0x00, 0x21, 0x50, 0x46, 0xff, 0xf7, 0x70, 0xb8, 0x00, 0x21, 0x38, 0x46, + 0xff, 0xf7, 0x63, 0xb8, 0x01, 0x22, 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, + 0x5e, 0xb8, 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, 0x70, 0x47, 0x01, 0x23, + 0x20, 0x22, 0x05, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x54, 0xb8, 0x70, 0xb5, + 0x0c, 0x46, 0xdf, 0xf8, 0x5c, 0x13, 0x01, 0xeb, 0xc0, 0x03, 0x53, 0xf8, + 0x24, 0x50, 0xff, 0xf7, 0x2e, 0xf8, 0x32, 0x21, 0x4c, 0x43, 0x01, 0x19, + 0x01, 0xf1, 0x3a, 0x04, 0x01, 0x22, 0xa3, 0x7a, 0x00, 0x21, 0x28, 0x1d, + 0xff, 0xf7, 0x48, 0xf8, 0x05, 0xf1, 0x50, 0x06, 0x23, 0x78, 0x4f, 0xf4, + 0x80, 0x12, 0x14, 0x21, 0x00, 0xf0, 0x18, 0xf8, 0x63, 0x78, 0x10, 0x22, + 0x04, 0x21, 0x05, 0xf1, 0x54, 0x00, 0xff, 0xf7, 0x39, 0xf8, 0xa3, 0x78, + 0x30, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x4f, 0xf0, 0x80, 0x52, 0x1c, 0x21, + 0xff, 0xf7, 0x30, 0xb8, 0xdc, 0x91, 0x04, 0x02, 0x60, 0x75, 0x02, 0x21, + 0x00, 0x23, 0x4f, 0xf0, 0x00, 0x52, 0x1d, 0x21, 0x30, 0x46, 0xff, 0xf7, + 0x25, 0xb8, 0x2d, 0xe9, 0xf8, 0x4f, 0x00, 0x29, 0x40, 0xf0, 0x9a, 0x80, + 0x04, 0x46, 0x01, 0x23, 0xf0, 0x22, 0x04, 0x21, 0xb8, 0x48, 0xff, 0xf7, + 0x10, 0xf8, 0x01, 0x23, 0xf0, 0x22, 0x04, 0x21, 0xb6, 0x48, 0xff, 0xf7, + 0x0a, 0xf8, 0x01, 0x23, 0xf0, 0x22, 0x04, 0x21, 0xb4, 0x48, 0xff, 0xf7, + 0x04, 0xf8, 0x01, 0x2c, 0x04, 0xd1, 0x00, 0xf0, 0x95, 0xf8, 0xb2, 0x48, + 0xfe, 0xf7, 0xfd, 0xff, 0xb1, 0x4e, 0xdf, 0xf8, 0xc8, 0xb2, 0x35, 0x68, + 0x05, 0xf1, 0x22, 0x08, 0x01, 0x23, 0x08, 0x22, 0x03, 0x21, 0x40, 0x46, + 0xfe, 0xf7, 0xf1, 0xff, 0x77, 0x68, 0x07, 0xf1, 0x22, 0x0a, 0x01, 0x23, + 0x00, 0xf0, 0x8a, 0xf8, 0xb6, 0x68, 0x06, 0xf1, 0x22, 0x09, 0x01, 0x23, + 0x08, 0x22, 0x03, 0x21, 0x48, 0x46, 0xfe, 0xf7, 0xe2, 0xff, 0x01, 0x23, + 0x02, 0x22, 0x01, 0x21, 0x48, 0x46, 0xfe, 0xf7, 0xdc, 0xff, 0xff, 0xf7, + 0x7c, 0xff, 0x58, 0x46, 0xfe, 0xf7, 0xd7, 0xff, 0x20, 0x22, 0x05, 0x21, + 0x58, 0x46, 0xfe, 0xf7, 0xcd, 0xff, 0x8d, 0xf8, 0x00, 0x00, 0x00, 0x23, + 0x80, 0x22, 0x07, 0x21, 0x58, 0x46, 0xfe, 0xf7, 0xca, 0xff, 0x24, 0x35, + 0x00, 0xf0, 0x5c, 0xf8, 0x28, 0x46, 0xfe, 0xf7, 0xc4, 0xff, 0x24, 0x37, + 0x00, 0x23, 0x01, 0x22, 0xff, 0xf7, 0x58, 0xff, 0x24, 0x36, 0x00, 0xf0, + 0x55, 0xf8, 0x01, 0x22, 0x00, 0x21, 0x28, 0x46, 0xfe, 0xf7, 0xb2, 0xff, + 0x8d, 0xf8, 0x00, 0x00, 0x01, 0x22, 0x00, 0x21, 0x38, 0x46, 0xfe, 0xf7, + 0xab, 0xff, 0x8d, 0xf8, 0x00, 0x00, 0x01, 0x22, 0x00, 0x21, 0x30, 0x46, + 0xfe, 0xf7, 0xa4, 0xff, 0x8d, 0xf8, 0x00, 0x00, 0x00, 0xf0, 0x49, 0xf8, + 0x40, 0x46, 0xfe, 0xf7, 0xa2, 0xff, 0x00, 0xf0, 0x44, 0xf8, 0x00, 0xf0, + 0x3f, 0xf8, 0x00, 0xf0, 0x40, 0xf8, 0x48, 0x46, 0xfe, 0xf7, 0x99, 0xff, + 0x24, 0xb3, 0x00, 0xf0, 0xb2, 0xf8, 0x28, 0x46, 0xfe, 0xf7, 0x93, 0xff, + 0x00, 0xf0, 0xad, 0xf8, 0xff, 0xf7, 0x29, 0xff, 0x00, 0xf0, 0xa9, 0xf8, + 0x00, 0xf0, 0x27, 0xf8, 0x00, 0xf0, 0x2d, 0xf8, 0x28, 0x46, 0xfe, 0xf7, + 0x86, 0xff, 0x00, 0xf0, 0x28, 0xf8, 0xff, 0xf7, 0x1c, 0xff, 0x00, 0xf0, + 0x24, 0xf8, 0x00, 0xf0, 0x1a, 0xf8, 0x09, 0xe0, 0x02, 0x20, 0x08, 0xf0, + 0xce, 0xf9, 0x01, 0x21, 0x02, 0x20, 0x08, 0xf0, 0x8d, 0xf9, 0x02, 0x20, + 0x08, 0xf0, 0xe9, 0xf9, 0x00, 0x20, 0xbd, 0xe8, 0xf2, 0x8f, 0x00, 0x00, + 0xc0, 0xff, 0xff, 0x3f, 0xc0, 0x97, 0x04, 0x02, 0x00, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x70, 0x47, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x30, 0x46, + 0xfe, 0xf7, 0x61, 0xbf, 0x08, 0x22, 0x03, 0x21, 0x50, 0x46, 0xfe, 0xf7, + 0x5c, 0xbf, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x70, 0x47, 0x2d, 0xe9, + 0xf8, 0x43, 0x00, 0x21, 0x01, 0x20, 0xff, 0xf7, 0x36, 0xff, 0x05, 0x00, + 0x5b, 0x48, 0x86, 0x68, 0xd0, 0xf8, 0x04, 0x90, 0xd0, 0xf8, 0x00, 0x80, + 0x32, 0xd1, 0x00, 0x20, 0x59, 0x4f, 0x00, 0xf0, 0x66, 0xf8, 0x38, 0x63, + 0x4f, 0xf6, 0x57, 0x75, 0x64, 0x24, 0x08, 0xf1, 0x25, 0x00, 0x01, 0x78, + 0x01, 0xf0, 0x07, 0x01, 0x8d, 0xf8, 0x02, 0x10, 0x09, 0xf1, 0x25, 0x00, + 0x01, 0x78, 0x01, 0xf0, 0x07, 0x01, 0x8d, 0xf8, 0x01, 0x10, 0x06, 0xf1, + 0x25, 0x00, 0x01, 0x78, 0x01, 0xf0, 0x07, 0x01, 0x8d, 0xf8, 0x00, 0x10, + 0x9d, 0xf8, 0x00, 0x00, 0x05, 0x28, 0x01, 0xbf, 0x9d, 0xf8, 0x02, 0x00, + 0x04, 0x28, 0x9d, 0xf8, 0x01, 0x00, 0x04, 0x28, 0x05, 0xd0, 0x01, 0x20, + 0x02, 0xf0, 0x74, 0xfc, 0x64, 0x1e, 0xda, 0xd1, 0x04, 0xe0, 0x01, 0x20, + 0x00, 0xf0, 0x39, 0xf8, 0x00, 0x25, 0x38, 0x63, 0xff, 0xf7, 0xaa, 0xff, + 0x08, 0xf1, 0x24, 0x00, 0xfe, 0xf7, 0x11, 0xff, 0xff, 0xf7, 0xa4, 0xff, + 0x09, 0xf1, 0x24, 0x00, 0xfe, 0xf7, 0x0b, 0xff, 0xff, 0xf7, 0x9e, 0xff, + 0x06, 0xf1, 0x24, 0x00, 0xfe, 0xf7, 0x05, 0xff, 0xff, 0xf7, 0xa7, 0xff, + 0x33, 0x48, 0xfe, 0xf7, 0x00, 0xff, 0x28, 0x46, 0xbd, 0xe8, 0xf2, 0x83, + 0x01, 0x46, 0x00, 0x20, 0xdd, 0xe6, 0x10, 0xb5, 0x2f, 0x48, 0x84, 0x68, + 0x22, 0x34, 0x00, 0x23, 0xff, 0xf7, 0x90, 0xfe, 0xff, 0xf7, 0x73, 0xfe, + 0xff, 0xf7, 0x8e, 0xfe, 0x00, 0x23, 0x04, 0x22, 0x02, 0x21, 0xff, 0xf7, + 0x89, 0xfe, 0x00, 0xf0, 0x04, 0xf8, 0xff, 0xf7, 0x85, 0xfe, 0x00, 0x20, + 0x10, 0xbd, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, 0x70, 0x47, 0x10, 0xb5, + 0x16, 0x4a, 0x25, 0x49, 0x12, 0x68, 0x01, 0x23, 0x4f, 0xf4, 0x7a, 0x74, + 0x18, 0xb1, 0x10, 0x69, 0x44, 0x43, 0x08, 0x78, 0x02, 0xe0, 0x50, 0x69, + 0x44, 0x43, 0x48, 0x78, 0x83, 0x40, 0xb4, 0xfb, 0xf3, 0xf0, 0x10, 0xbd, + 0x80, 0x98, 0x04, 0x02, 0xc0, 0x98, 0x04, 0x02, 0x00, 0x00, 0xff, 0x3f, + 0xa0, 0x9a, 0x04, 0x02, 0x80, 0x9a, 0x04, 0x02, 0xc0, 0x99, 0x04, 0x02, + 0xcc, 0x9e, 0x04, 0x02, 0xf0, 0xff, 0xff, 0x0f, 0xe0, 0xff, 0xff, 0x1f, + 0x36, 0x04, 0x00, 0x47, 0x34, 0x04, 0x00, 0x47, 0x38, 0x04, 0x00, 0x47, + 0x3a, 0x04, 0x00, 0x47, 0x1b, 0x00, 0x00, 0x47, 0x5c, 0x75, 0x02, 0x21, + 0x6f, 0x00, 0x09, 0x48, 0x70, 0x00, 0x09, 0x48, 0xa0, 0x95, 0x04, 0x02, + 0x40, 0x99, 0x04, 0x02, 0xc0, 0x95, 0x04, 0x02, 0xec, 0x9e, 0x04, 0x02, + 0x9c, 0x91, 0x04, 0x02, 0x39, 0x04, 0x00, 0x47, 0x35, 0x04, 0x00, 0x47, + 0x37, 0x04, 0x00, 0x47, 0x2d, 0x04, 0x00, 0x47, 0x5c, 0x9d, 0x04, 0x02, + 0x19, 0x00, 0x00, 0x47, 0x24, 0x73, 0x03, 0x21, 0x50, 0x73, 0x03, 0x21, + 0x2d, 0xe9, 0xfc, 0x41, 0x04, 0x46, 0x88, 0x46, 0x20, 0x20, 0x02, 0xf0, + 0xff, 0xf9, 0x22, 0x20, 0x02, 0xf0, 0xfc, 0xf9, 0x20, 0x20, 0x02, 0xf0, + 0x9d, 0xf9, 0x22, 0x20, 0x02, 0xf0, 0x9a, 0xf9, 0x00, 0x25, 0x00, 0x2c, + 0x77, 0x4e, 0x37, 0xd0, 0x77, 0x48, 0x75, 0x60, 0xb5, 0x60, 0xf5, 0x60, + 0x35, 0x61, 0x4f, 0xf4, 0xe1, 0x32, 0x01, 0x6b, 0xb1, 0xfb, 0xf2, 0xf4, + 0x00, 0x2c, 0x47, 0xd0, 0x00, 0xf0, 0xcc, 0xf8, 0x71, 0x4f, 0x38, 0x68, + 0x00, 0x90, 0x44, 0xf0, 0x00, 0x44, 0x00, 0x99, 0x49, 0x08, 0x49, 0x00, + 0x00, 0x91, 0xb8, 0xf1, 0x00, 0x0f, 0x00, 0x98, 0x38, 0x60, 0x18, 0xbf, + 0xc6, 0xf8, 0x14, 0x80, 0x6a, 0x48, 0x00, 0x90, 0x40, 0xf2, 0x87, 0x10, + 0x00, 0x99, 0x39, 0x60, 0xfc, 0x60, 0x38, 0x61, 0x20, 0x20, 0x02, 0xf0, + 0x6d, 0xf9, 0x04, 0x21, 0x20, 0x20, 0x02, 0xf0, 0xd4, 0xf9, 0x20, 0x20, + 0x02, 0xf0, 0xb7, 0xf9, 0x38, 0x68, 0x00, 0x90, 0x00, 0x99, 0x41, 0xf0, + 0x01, 0x01, 0x00, 0x91, 0x00, 0x99, 0x39, 0x60, 0xb0, 0x69, 0x48, 0xb9, + 0x03, 0x21, 0x00, 0x91, 0x06, 0xf1, 0x1c, 0x03, 0x00, 0x22, 0x00, 0x21, + 0x01, 0x20, 0x07, 0xf0, 0x41, 0xfc, 0xb0, 0x61, 0x09, 0x20, 0x58, 0x49, + 0x08, 0x60, 0x22, 0x20, 0x02, 0xf0, 0x4c, 0xf9, 0x04, 0x21, 0x22, 0x20, + 0x02, 0xf0, 0xb3, 0xf9, 0x22, 0x20, 0x02, 0xf0, 0x96, 0xf9, 0x28, 0x46, + 0xbd, 0xe8, 0xf6, 0x81, 0x4b, 0xf6, 0x01, 0x15, 0xf9, 0xe7, 0x70, 0xb5, + 0x20, 0x20, 0x02, 0xf0, 0x46, 0xf9, 0x4e, 0x4d, 0x48, 0x4e, 0x28, 0x68, + 0x08, 0x24, 0xc1, 0x07, 0x07, 0xd5, 0xa8, 0x69, 0x71, 0x69, 0x09, 0xb1, + 0xc0, 0xb2, 0x88, 0x47, 0x28, 0x68, 0x64, 0x1e, 0xf5, 0xd1, 0x00, 0x21, + 0x82, 0x07, 0x03, 0xd5, 0x71, 0x68, 0x49, 0x1c, 0x71, 0x60, 0x02, 0x21, + 0x42, 0x07, 0x04, 0xd5, 0xb3, 0x68, 0x5b, 0x1c, 0xb3, 0x60, 0x41, 0xf0, + 0x04, 0x01, 0x02, 0x07, 0x04, 0xd5, 0xf3, 0x68, 0x5b, 0x1c, 0xf3, 0x60, + 0x41, 0xf0, 0x08, 0x01, 0xc0, 0x06, 0x04, 0xd5, 0x32, 0x69, 0x52, 0x1c, + 0x32, 0x61, 0x41, 0xf0, 0x10, 0x01, 0x28, 0x68, 0x20, 0xea, 0x01, 0x01, + 0x29, 0x60, 0x70, 0xbd, 0x1c, 0xb5, 0x00, 0x20, 0x00, 0x90, 0x36, 0x49, + 0x2f, 0x4c, 0x08, 0x68, 0x01, 0x07, 0x44, 0xbf, 0x01, 0x22, 0x22, 0x70, + 0xc0, 0x07, 0x16, 0xd5, 0x21, 0x78, 0x01, 0x29, 0x13, 0xd1, 0x00, 0x20, + 0x20, 0x70, 0x06, 0xf0, 0x23, 0xfc, 0x01, 0x28, 0x0d, 0xd0, 0xa0, 0x69, + 0x69, 0x46, 0x07, 0xf0, 0xfd, 0xfc, 0x00, 0x98, 0x38, 0xb1, 0x2b, 0x48, + 0x4f, 0xf0, 0x80, 0x51, 0x01, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, + 0x6f, 0x8f, 0x13, 0xbd, 0xf8, 0xb5, 0x05, 0x46, 0x0f, 0x46, 0x01, 0x24, + 0x1d, 0x4e, 0x4f, 0xf0, 0x8c, 0x41, 0x48, 0x68, 0xc0, 0xf3, 0xc0, 0x00, + 0x00, 0x90, 0x00, 0x98, 0x90, 0xb1, 0x38, 0x00, 0x0e, 0xd0, 0x02, 0xf0, + 0xcb, 0xf9, 0x00, 0x28, 0xf1, 0xd1, 0x06, 0xf0, 0xfd, 0xfb, 0x02, 0x28, + 0xed, 0xd1, 0xb0, 0x69, 0x4f, 0xf0, 0xff, 0x31, 0x07, 0xf0, 0x70, 0xfd, + 0x00, 0x28, 0xe6, 0xd1, 0x00, 0x24, 0x09, 0xe0, 0xef, 0xf3, 0x10, 0x80, + 0x72, 0xb6, 0x0a, 0x68, 0x12, 0x0a, 0x45, 0xea, 0x02, 0x25, 0x0d, 0x60, + 0x80, 0xf3, 0x10, 0x88, 0x20, 0x46, 0xf2, 0xbd, 0x81, 0xb0, 0x11, 0x48, + 0x00, 0x68, 0xc0, 0xf3, 0x08, 0x00, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, + 0xf7, 0xd1, 0x0a, 0x49, 0x08, 0x68, 0xc0, 0xf3, 0xc0, 0x10, 0x00, 0x90, + 0x00, 0x98, 0x01, 0x28, 0xf7, 0xd1, 0x01, 0xb0, 0x70, 0x47, 0x00, 0x00, + 0x18, 0x70, 0x02, 0x21, 0x24, 0x73, 0x03, 0x21, 0x04, 0x00, 0x10, 0x46, + 0x00, 0x03, 0x00, 0x20, 0x08, 0x00, 0x00, 0x46, 0x08, 0x00, 0x10, 0x46, + 0x04, 0x00, 0x00, 0x46, 0x04, 0xed, 0x00, 0xe0, 0x0c, 0x00, 0x00, 0x46, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, + 0x0d, 0xf8, 0x01, 0x70, 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, + 0x72, 0xb6, 0x05, 0x68, 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, + 0x29, 0x43, 0x70, 0x47, 0xdf, 0xf8, 0x40, 0x09, 0x01, 0x68, 0xd1, 0xf8, + 0xb8, 0x00, 0xc0, 0xf3, 0x07, 0x20, 0x70, 0x47, 0xdf, 0xf8, 0x30, 0x19, + 0x09, 0x68, 0x0a, 0x18, 0xe0, 0x20, 0x92, 0xf8, 0xbc, 0x30, 0x43, 0x43, + 0xc8, 0x18, 0xc4, 0x30, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, 0xdf, 0xf8, + 0x18, 0x09, 0xdf, 0xf8, 0x18, 0x69, 0x01, 0x68, 0xdf, 0xf8, 0x14, 0xa9, + 0xd1, 0xf8, 0xb8, 0x00, 0x31, 0x68, 0xdf, 0xf8, 0x10, 0x89, 0x08, 0x40, + 0x04, 0x04, 0xdf, 0xf8, 0x0c, 0x09, 0x00, 0x90, 0x24, 0x0e, 0x00, 0x27, + 0x24, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x40, 0xf1, 0x05, 0x81, 0xdd, 0xf8, + 0x00, 0xc0, 0xdf, 0xf8, 0xf8, 0x18, 0x5f, 0xfa, 0x87, 0xf9, 0x51, 0xf8, + 0x29, 0x50, 0x5c, 0xf8, 0x29, 0x00, 0x03, 0x23, 0x4f, 0xf4, 0x70, 0x62, + 0x08, 0x21, 0x00, 0xf5, 0xfa, 0x70, 0xff, 0xf7, 0xb0, 0xff, 0x00, 0x23, + 0x10, 0x22, 0x04, 0x21, 0x00, 0xf0, 0xb1, 0xf9, 0x00, 0x23, 0x02, 0x22, + 0x01, 0x21, 0xa8, 0x1d, 0xff, 0xf7, 0x9c, 0xff, 0x00, 0x23, 0x80, 0x22, + 0x07, 0x21, 0xa8, 0x1c, 0xff, 0xf7, 0x96, 0xff, 0x00, 0x23, 0x80, 0x22, + 0x07, 0x21, 0x00, 0xf0, 0xa0, 0xf9, 0x00, 0x23, 0x40, 0x22, 0x06, 0x21, + 0x05, 0xf1, 0x12, 0x00, 0xff, 0xf7, 0x8a, 0xff, 0x05, 0xf1, 0x1a, 0x0b, + 0x01, 0x23, 0x80, 0x22, 0x07, 0x21, 0x00, 0xf0, 0x44, 0xf9, 0x00, 0x23, + 0x01, 0x22, 0x00, 0x21, 0x68, 0x1c, 0xff, 0xf7, 0x7d, 0xff, 0x00, 0x23, + 0x20, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x87, 0xf9, 0x00, 0x23, 0x01, 0x22, + 0x00, 0xf0, 0x82, 0xf9, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, + 0x30, 0xf9, 0x19, 0x23, 0x3e, 0x22, 0x00, 0xf0, 0x2b, 0xf9, 0x05, 0x23, + 0x1f, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x11, 0x00, 0xff, 0xf7, 0x64, 0xff, + 0x24, 0x23, 0x3f, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x0e, 0x00, 0xff, 0xf7, + 0x5d, 0xff, 0x05, 0xf1, 0x70, 0x0b, 0x01, 0x23, 0x02, 0x22, 0x00, 0xf0, + 0x17, 0xf9, 0x3f, 0x23, 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x73, 0x00, + 0xff, 0xf7, 0x50, 0xff, 0x00, 0x23, 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, + 0x74, 0x00, 0xff, 0xf7, 0x49, 0xff, 0x11, 0x23, 0xff, 0x22, 0x00, 0x21, + 0x05, 0xf1, 0x71, 0x00, 0xff, 0xf7, 0x42, 0xff, 0x01, 0x23, 0xff, 0x22, + 0x00, 0x21, 0x05, 0xf1, 0x72, 0x00, 0xff, 0xf7, 0x3b, 0xff, 0x3f, 0x23, + 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x77, 0x00, 0xff, 0xf7, 0x34, 0xff, + 0x00, 0x23, 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x78, 0x00, 0xff, 0xf7, + 0x2d, 0xff, 0x11, 0x23, 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x75, 0x00, + 0xff, 0xf7, 0x26, 0xff, 0x01, 0x23, 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, + 0x76, 0x00, 0xff, 0xf7, 0x1f, 0xff, 0x0c, 0x23, 0x1f, 0x22, 0x00, 0x21, + 0x05, 0xf1, 0x27, 0x00, 0xff, 0xf7, 0x18, 0xff, 0x04, 0x23, 0x0f, 0x22, + 0x00, 0x21, 0x05, 0xf1, 0x26, 0x00, 0xff, 0xf7, 0x11, 0xff, 0x04, 0x23, + 0x3f, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x31, 0x00, 0xff, 0xf7, 0x0a, 0xff, + 0x04, 0x23, 0x3f, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x35, 0x00, 0xff, 0xf7, + 0x03, 0xff, 0x11, 0x23, 0x3f, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x33, 0x00, + 0xff, 0xf7, 0xfc, 0xfe, 0x11, 0x23, 0x3f, 0x22, 0x00, 0x21, 0x05, 0xf1, + 0x37, 0x00, 0xff, 0xf7, 0xf5, 0xfe, 0x00, 0x23, 0x0f, 0x22, 0x00, 0x21, + 0x05, 0xf1, 0x29, 0x00, 0xff, 0xf7, 0xee, 0xfe, 0x03, 0x23, 0x03, 0x22, + 0x00, 0x21, 0x05, 0xf1, 0x3d, 0x00, 0xff, 0xf7, 0xe7, 0xfe, 0x00, 0x23, + 0x00, 0xf0, 0xb4, 0xfb, 0xf8, 0xb2, 0x00, 0xf0, 0xb6, 0xf8, 0x01, 0x23, + 0x10, 0x22, 0x04, 0x21, 0x00, 0xf0, 0x9d, 0xf8, 0x00, 0x23, 0x00, 0xf0, + 0xaa, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0xa7, 0xf8, 0xf8, 0xb2, 0xff, 0xf7, + 0xf5, 0xfe, 0x05, 0x46, 0x5a, 0xf8, 0x39, 0x00, 0x95, 0xf8, 0x52, 0x30, + 0x4f, 0xf0, 0x7f, 0x42, 0x18, 0x21, 0x20, 0x30, 0x0a, 0xeb, 0xc9, 0x0b, + 0xff, 0xf7, 0xcf, 0xfe, 0xdb, 0xf8, 0x04, 0x00, 0x95, 0xf8, 0x84, 0x30, + 0x4f, 0xf0, 0x7f, 0x42, 0x18, 0x21, 0x20, 0x30, 0xff, 0xf7, 0xc5, 0xfe, + 0x5a, 0xf8, 0x39, 0x00, 0x00, 0xf0, 0x7f, 0xf8, 0xdb, 0xf8, 0x04, 0x00, + 0x00, 0xf0, 0x7b, 0xf8, 0x7f, 0x1c, 0xf8, 0xb2, 0x08, 0x28, 0x7f, 0xf4, + 0xf1, 0xae, 0xdf, 0xf8, 0xd4, 0x86, 0xd8, 0xf8, 0x00, 0x00, 0xd0, 0xf8, + 0xb8, 0x10, 0x30, 0x68, 0x08, 0x40, 0x00, 0x0c, 0x00, 0xf0, 0x03, 0x00, + 0x00, 0x24, 0x00, 0x90, 0x00, 0x98, 0xe0, 0x40, 0xc1, 0x07, 0x57, 0xd5, + 0xdf, 0xf8, 0xc8, 0x26, 0xdf, 0xf8, 0xc8, 0x16, 0xe0, 0xb2, 0x52, 0xf8, + 0x20, 0x90, 0x51, 0xf8, 0x20, 0x50, 0xd8, 0xf8, 0x00, 0x20, 0x70, 0x21, + 0x48, 0x43, 0x10, 0x44, 0x00, 0xf5, 0x32, 0x60, 0x05, 0xf2, 0xf2, 0x37, + 0x10, 0xf8, 0x5f, 0x6f, 0x90, 0xf8, 0x01, 0xa0, 0x90, 0xf8, 0x03, 0xb0, + 0x01, 0x23, 0x00, 0xf0, 0x50, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0x43, 0xf8, + 0x00, 0x23, 0x20, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x40, 0xf8, 0x33, 0x46, + 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x3b, 0xf8, 0x53, 0x46, 0x02, 0x22, + 0x01, 0x21, 0x00, 0xf0, 0x36, 0xf8, 0x05, 0xf2, 0xf3, 0x35, 0x5b, 0x46, + 0x07, 0x22, 0x00, 0xf0, 0x79, 0xf8, 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, + 0x00, 0xf0, 0x2b, 0xf8, 0x00, 0x23, 0x00, 0xf0, 0x30, 0xf8, 0xba, 0xf1, + 0x01, 0x0f, 0x0c, 0xbf, 0x00, 0x23, 0x01, 0x23, 0x00, 0xf0, 0x1f, 0xf8, + 0x09, 0xf1, 0xa4, 0x05, 0x01, 0x23, 0x4f, 0xf4, 0x78, 0x72, 0x05, 0x21, + 0x28, 0x46, 0xff, 0xf7, 0x5c, 0xfe, 0x00, 0x23, 0x4f, 0xf4, 0xf8, 0x42, + 0x0a, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x55, 0xfe, 0x01, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x4f, 0xfe, 0x64, 0x1c, 0xe0, 0xb2, + 0x02, 0x28, 0x9f, 0xd1, 0xbd, 0xe8, 0xf1, 0x8f, 0x01, 0x21, 0x58, 0x46, + 0x3c, 0xe6, 0x08, 0x22, 0x03, 0x21, 0x38, 0x46, 0x38, 0xe6, 0x01, 0x23, + 0x4f, 0xf0, 0x80, 0x72, 0x18, 0x21, 0x34, 0x30, 0x3b, 0xe6, 0x10, 0x22, + 0x04, 0x21, 0x38, 0x46, 0x2e, 0xe6, 0x10, 0x22, 0x04, 0x21, 0x40, 0x46, + 0x2a, 0xe6, 0x10, 0xb5, 0x04, 0x46, 0xff, 0xf7, 0x49, 0xfe, 0x90, 0xf8, + 0xd3, 0x10, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x38, 0xb5, 0xdf, 0xf8, + 0xcc, 0x25, 0x52, 0xf8, 0x20, 0x40, 0x01, 0x29, 0x04, 0xf1, 0x79, 0x05, + 0x05, 0xd1, 0x00, 0x23, 0x03, 0x22, 0x00, 0xf0, 0x23, 0xf8, 0x01, 0x23, + 0x08, 0xe0, 0x02, 0x29, 0x07, 0xbf, 0x01, 0x23, 0x03, 0x22, 0x03, 0x23, + 0x03, 0x22, 0x00, 0xf0, 0x19, 0xf8, 0x00, 0x23, 0x04, 0x22, 0x02, 0x21, + 0x00, 0xf0, 0x15, 0xf8, 0x70, 0x34, 0x00, 0x23, 0x00, 0xf0, 0x67, 0xfa, + 0x00, 0x23, 0x08, 0x22, 0x03, 0x21, 0x00, 0xf0, 0x64, 0xfa, 0x01, 0x23, + 0x00, 0xf0, 0x5f, 0xfa, 0x20, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, + 0x01, 0x23, 0x08, 0x22, 0x03, 0x21, 0xf1, 0xe5, 0x00, 0x21, 0x28, 0x46, + 0xee, 0xe5, 0xdf, 0xf8, 0x68, 0x25, 0x52, 0xf8, 0x20, 0x00, 0x10, 0xf8, + 0x79, 0x2f, 0x00, 0x78, 0x12, 0xf0, 0x03, 0x02, 0xc0, 0xf3, 0x80, 0x00, + 0x02, 0xd1, 0x08, 0xb1, 0x01, 0x20, 0x04, 0xe0, 0x01, 0x2a, 0x06, 0xbf, + 0x00, 0x28, 0x02, 0x20, 0x04, 0x20, 0x08, 0x70, 0x70, 0x47, 0x70, 0xb5, + 0x0c, 0x46, 0xdf, 0xf8, 0x38, 0x15, 0x51, 0xf8, 0x20, 0x60, 0x15, 0x46, + 0x2b, 0x46, 0x3f, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x31, 0x00, 0xff, 0xf7, + 0xcb, 0xfd, 0x23, 0x46, 0x3f, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x33, 0x00, + 0xff, 0xf7, 0xc4, 0xfd, 0x2b, 0x46, 0x3f, 0x22, 0x00, 0x21, 0x06, 0xf1, + 0x35, 0x00, 0xff, 0xf7, 0xbd, 0xfd, 0x23, 0x46, 0x06, 0xf1, 0x37, 0x00, + 0xbd, 0xe8, 0x70, 0x40, 0x3f, 0x22, 0xff, 0xe7, 0x00, 0x21, 0xb3, 0xe5, + 0x2d, 0xe9, 0xfe, 0x4f, 0x81, 0x46, 0xff, 0xf7, 0xc9, 0xfd, 0x02, 0x90, + 0x00, 0x25, 0xdf, 0xf8, 0xe4, 0x64, 0xdf, 0xf8, 0xec, 0x84, 0x02, 0x98, + 0xe8, 0x40, 0xc1, 0x07, 0x40, 0xf1, 0x83, 0x80, 0xe8, 0xb2, 0xfd, 0xf7, + 0x6c, 0xff, 0x48, 0x45, 0x7d, 0xd1, 0xe8, 0xb2, 0xff, 0xf7, 0xbe, 0xfd, + 0x07, 0x46, 0xe8, 0xb2, 0xfd, 0xf7, 0x63, 0xff, 0x81, 0x46, 0x69, 0x46, + 0xe8, 0xb2, 0xf6, 0xf7, 0x7c, 0xfd, 0x00, 0x98, 0x4f, 0xf4, 0x7a, 0x71, + 0xb0, 0xfb, 0xf1, 0xf4, 0xb8, 0x68, 0x0a, 0x46, 0xb0, 0xfb, 0xf2, 0xf2, + 0x52, 0x00, 0x21, 0x46, 0xe8, 0xb2, 0x00, 0xf0, 0x96, 0xf8, 0x82, 0x46, + 0x00, 0x20, 0x58, 0xf8, 0x30, 0x10, 0x8c, 0x42, 0x02, 0xd2, 0x40, 0x1c, + 0x04, 0x28, 0xf8, 0xd9, 0x05, 0x28, 0x08, 0xbf, 0x04, 0x20, 0x08, 0xeb, + 0xc0, 0x00, 0xe9, 0xb2, 0x56, 0xf8, 0x21, 0xb0, 0x03, 0x79, 0x3f, 0x22, + 0x00, 0x21, 0x0b, 0xf1, 0x0e, 0x00, 0xff, 0xf7, 0x6d, 0xfd, 0x00, 0xf0, + 0x58, 0xf8, 0x08, 0xf1, 0x28, 0x01, 0x08, 0xb1, 0x08, 0xf1, 0xd0, 0x01, + 0x01, 0x98, 0x00, 0x22, 0x51, 0xf8, 0x32, 0x30, 0x83, 0x42, 0x3c, 0xbf, + 0x52, 0x1c, 0x08, 0x2a, 0xf8, 0xd3, 0x00, 0xf0, 0x41, 0xf8, 0x0b, 0xf1, + 0x29, 0x00, 0xff, 0xf7, 0x57, 0xfd, 0x00, 0xf0, 0x42, 0xf8, 0x08, 0xf1, + 0x98, 0x01, 0x08, 0xb1, 0x08, 0xf5, 0xa0, 0x71, 0x01, 0x98, 0x00, 0x22, + 0x51, 0xf8, 0x32, 0x30, 0x83, 0x42, 0x3c, 0xbf, 0x52, 0x1c, 0x08, 0x2a, + 0xf8, 0xd3, 0x00, 0xf0, 0x2b, 0xf8, 0x0b, 0xf1, 0x26, 0x00, 0xff, 0xf7, + 0x41, 0xfd, 0x00, 0xf0, 0x2c, 0xf8, 0x08, 0xf1, 0x60, 0x01, 0x08, 0xb1, + 0x08, 0xf5, 0x84, 0x71, 0x01, 0x98, 0x00, 0x22, 0x51, 0xf8, 0x32, 0x30, + 0x83, 0x42, 0x3c, 0xbf, 0x52, 0x1c, 0x08, 0x2a, 0xf8, 0xd3, 0x01, 0xeb, + 0xc2, 0x00, 0x1f, 0x22, 0x83, 0x88, 0xdb, 0xb2, 0x00, 0x21, 0x0b, 0xf1, + 0x27, 0x00, 0xff, 0xf7, 0x27, 0xfd, 0xba, 0x68, 0x53, 0x46, 0x21, 0x46, + 0xe8, 0xb2, 0x00, 0xf0, 0x65, 0xf8, 0x6d, 0x1c, 0xe8, 0xb2, 0x08, 0x28, + 0x7f, 0xf4, 0x73, 0xaf, 0xbd, 0xe8, 0xf7, 0x8f, 0x01, 0xeb, 0xc2, 0x00, + 0x0f, 0x22, 0x83, 0x88, 0xdb, 0xb2, 0x00, 0x21, 0x70, 0x47, 0xb8, 0x68, + 0x01, 0x90, 0x0f, 0x20, 0x0a, 0xf0, 0x68, 0xbb, 0xf8, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0xff, 0xf7, 0x2b, 0xfd, 0x06, 0x46, 0x69, 0x46, 0x20, 0x46, + 0xf6, 0xf7, 0xed, 0xfc, 0x00, 0x98, 0x4f, 0xf4, 0x7a, 0x71, 0xb0, 0xfb, + 0xf1, 0xf7, 0xb0, 0x68, 0x0a, 0x46, 0xb0, 0xfb, 0xf2, 0xf2, 0x52, 0x00, + 0x39, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x07, 0xf8, 0x03, 0x46, 0x2a, 0x46, + 0x39, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x34, 0xf8, 0xf1, 0xbd, 0x38, 0xb5, + 0xdd, 0x4c, 0x0a, 0xb1, 0xc8, 0x2a, 0x16, 0xd9, 0xa2, 0xf1, 0xc9, 0x03, + 0x64, 0x2b, 0x38, 0xbf, 0x38, 0x34, 0x10, 0xd3, 0xa2, 0xf2, 0x2d, 0x13, + 0x64, 0x2b, 0x0b, 0xd3, 0xa2, 0xf2, 0x91, 0x13, 0xc8, 0x2b, 0x38, 0xbf, + 0xa8, 0x34, 0x06, 0xd3, 0xa2, 0xf2, 0x59, 0x22, 0xc8, 0x2a, 0x38, 0xbf, + 0xe0, 0x34, 0x00, 0xd3, 0x70, 0x34, 0x00, 0x22, 0x23, 0x68, 0x8b, 0x42, + 0x03, 0xd3, 0x08, 0x34, 0x52, 0x1c, 0x07, 0x2a, 0xf8, 0xd3, 0x07, 0x2a, + 0xc7, 0x4d, 0x55, 0xf8, 0x20, 0x00, 0x08, 0xbf, 0x08, 0x3c, 0x1f, 0x22, + 0x23, 0x79, 0x00, 0x21, 0x11, 0x30, 0xff, 0xf7, 0xbf, 0xfc, 0x20, 0x79, + 0x32, 0xbd, 0x00, 0x00, 0x00, 0xee, 0x10, 0x1a, 0x00, 0xee, 0x90, 0x2a, + 0xf8, 0xee, 0x60, 0x0a, 0x9f, 0xed, 0xa7, 0x1a, 0xb8, 0xee, 0x40, 0x0a, + 0xdf, 0xed, 0xa6, 0x1a, 0x60, 0xee, 0x81, 0x0a, 0x20, 0xee, 0x21, 0x0a, + 0x9f, 0xed, 0xa4, 0x2a, 0xf4, 0xee, 0x42, 0x0a, 0x9f, 0xed, 0xa3, 0x2a, + 0xdf, 0xed, 0xa3, 0x1a, 0x9f, 0xed, 0xa3, 0x4a, 0xdf, 0xed, 0xa3, 0x4a, + 0xf1, 0xee, 0x10, 0xfa, 0x40, 0xee, 0x02, 0x1a, 0x9f, 0xed, 0xa1, 0x2a, + 0x71, 0xee, 0x82, 0x2a, 0x9f, 0xed, 0xa0, 0x5a, 0x4c, 0xbf, 0x9f, 0xed, + 0xa0, 0x1a, 0x9f, 0xed, 0xa0, 0x1a, 0x9f, 0xed, 0xa0, 0x0a, 0x81, 0xee, + 0xa2, 0x3a, 0x61, 0xee, 0x82, 0x1a, 0xc1, 0xee, 0xa2, 0x1a, 0x02, 0xee, + 0x90, 0x3a, 0xf8, 0xee, 0x62, 0x2a, 0x42, 0xee, 0x84, 0x4a, 0xdf, 0xed, + 0x9a, 0x2a, 0x34, 0xee, 0x85, 0x5a, 0xb1, 0xee, 0x00, 0x4a, 0x20, 0xee, + 0x80, 0x0a, 0x60, 0xee, 0xa2, 0x0a, 0x60, 0xee, 0x82, 0x0a, 0xb7, 0xee, + 0x00, 0x2a, 0x82, 0xee, 0x20, 0x2a, 0x23, 0xee, 0x01, 0x1a, 0x35, 0xee, + 0x02, 0x2a, 0x20, 0xee, 0x00, 0x3a, 0xf0, 0xee, 0x00, 0x3a, 0x61, 0xee, + 0x82, 0x1a, 0x10, 0xb5, 0x61, 0xee, 0x83, 0x1a, 0xc1, 0xee, 0x81, 0x0a, + 0x2d, 0xed, 0x04, 0x8b, 0x23, 0xee, 0x23, 0x8a, 0x23, 0xee, 0x04, 0x3a, + 0x20, 0xee, 0xa0, 0x4a, 0x00, 0xee, 0xe3, 0x4a, 0xc8, 0xee, 0x01, 0x8a, + 0x80, 0xee, 0x01, 0x1a, 0x01, 0xee, 0x01, 0x4a, 0xbd, 0xee, 0x00, 0x1a, + 0x28, 0xee, 0xa8, 0x0a, 0x34, 0xee, 0x01, 0x1a, 0x82, 0xb0, 0x04, 0x46, + 0x03, 0xee, 0x41, 0x0a, 0xe8, 0xf7, 0x4e, 0xfa, 0x30, 0xee, 0x68, 0x0a, + 0x80, 0xee, 0x08, 0x0a, 0xdf, 0xed, 0x75, 0x0a, 0x80, 0xee, 0x20, 0x0a, + 0x9f, 0xed, 0x79, 0x8a, 0x30, 0xee, 0x08, 0x9a, 0x9f, 0xed, 0x78, 0x0a, + 0x89, 0xee, 0x00, 0x0a, 0xe8, 0xf7, 0xfc, 0xfa, 0xdf, 0xed, 0x75, 0x8a, + 0x20, 0xee, 0x28, 0x0a, 0xdf, 0xed, 0x74, 0x0a, 0x70, 0xee, 0x20, 0x9a, + 0x39, 0xee, 0x40, 0x0a, 0x9f, 0xed, 0x72, 0x1a, 0x80, 0xee, 0x01, 0x0a, + 0xf6, 0xf7, 0x48, 0xf9, 0xdf, 0xed, 0x6f, 0x0a, 0x40, 0xee, 0x20, 0x9a, + 0x68, 0x46, 0xf6, 0xf7, 0x31, 0xfc, 0x01, 0xa8, 0xf6, 0xf7, 0x33, 0xfc, + 0x9d, 0xed, 0x01, 0x0a, 0xdd, 0xed, 0x00, 0x0a, 0xc0, 0xee, 0x20, 0x0a, + 0x89, 0xee, 0xa0, 0x0a, 0x30, 0xee, 0x08, 0x8a, 0x9f, 0xed, 0x63, 0x1a, + 0x88, 0xee, 0x01, 0x0a, 0xe8, 0xf7, 0xd2, 0xfa, 0xb0, 0xee, 0x40, 0x9a, + 0x09, 0xee, 0x68, 0x8a, 0x9f, 0xed, 0x60, 0x0a, 0x88, 0xee, 0x00, 0x0a, + 0xf6, 0xf7, 0x24, 0xf9, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, + 0xc2, 0xb2, 0xbd, 0xee, 0xc9, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0xc1, 0xb2, + 0x20, 0x46, 0xff, 0xf7, 0x1c, 0xfe, 0x02, 0xb0, 0xbd, 0xec, 0x04, 0x8b, + 0x10, 0xbd, 0x1c, 0xb5, 0x0c, 0x46, 0x69, 0x46, 0xff, 0xf7, 0xfd, 0xfd, + 0x9d, 0xf8, 0x00, 0x00, 0xb4, 0xfb, 0xf0, 0xf0, 0x40, 0x08, 0x16, 0xbd, + 0x2d, 0xe9, 0xf8, 0x4f, 0x0a, 0x9c, 0xdd, 0xf8, 0x2c, 0xa0, 0x80, 0x46, + 0x8b, 0x46, 0x16, 0x46, 0x1f, 0x46, 0xff, 0xf7, 0xf5, 0xfb, 0x81, 0x46, + 0x00, 0x20, 0x30, 0x60, 0x4f, 0xf0, 0xff, 0x31, 0x39, 0x60, 0x00, 0x25, + 0x29, 0xfa, 0x05, 0xf0, 0xc0, 0x07, 0x14, 0xd5, 0xe8, 0xb2, 0xfd, 0xf7, + 0x98, 0xfd, 0x40, 0x45, 0x0f, 0xd1, 0x59, 0x46, 0xe8, 0xb2, 0xff, 0xf7, + 0xd6, 0xff, 0x32, 0x68, 0xe9, 0xb2, 0x82, 0x42, 0x3c, 0xbf, 0x30, 0x60, + 0x21, 0x60, 0x3b, 0x68, 0x98, 0x42, 0x3c, 0xbf, 0x38, 0x60, 0xca, 0xf8, + 0x00, 0x10, 0x6d, 0x1c, 0xe8, 0xb2, 0x08, 0x28, 0xe2, 0xd1, 0xbd, 0xe8, + 0xf1, 0x8f, 0x10, 0xb5, 0x3c, 0x49, 0x51, 0xf8, 0x20, 0x40, 0x01, 0x23, + 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0x13, 0xf8, 0x01, 0x23, 0x02, 0x22, + 0x01, 0x21, 0x04, 0xf1, 0x3c, 0x00, 0xff, 0xf7, 0xa5, 0xfb, 0x01, 0x23, + 0x80, 0x22, 0x07, 0x21, 0x00, 0xf0, 0x07, 0xf8, 0x20, 0x46, 0xbd, 0xe8, + 0x10, 0x40, 0x01, 0x23, 0x30, 0xe0, 0x04, 0x22, 0x02, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0x96, 0xbb, 0x2d, 0x4a, 0x52, 0xf8, 0x20, 0x20, 0x10, 0x78, + 0xc0, 0xf3, 0x40, 0x00, 0x08, 0x70, 0x02, 0xf1, 0x3c, 0x00, 0x00, 0x78, + 0xc0, 0xf3, 0x40, 0x00, 0x48, 0x70, 0x10, 0x78, 0xc0, 0x09, 0x88, 0x70, + 0x10, 0x78, 0xc0, 0xf3, 0x80, 0x00, 0xc8, 0x70, 0x70, 0x47, 0x38, 0xb5, + 0x0c, 0x46, 0x22, 0x49, 0x51, 0xf8, 0x20, 0x50, 0xa3, 0x78, 0x80, 0x22, + 0x07, 0x21, 0xff, 0xf7, 0x86, 0xfd, 0x23, 0x78, 0x02, 0x22, 0x01, 0x21, + 0xff, 0xf7, 0x81, 0xfd, 0x63, 0x78, 0x00, 0xf0, 0x3f, 0xf8, 0xe3, 0x78, + 0x28, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x04, 0x22, 0x02, 0x21, + 0xff, 0xf7, 0x66, 0xbb, 0x00, 0x00, 0x7a, 0x44, 0x00, 0x24, 0x74, 0x49, + 0x20, 0xbc, 0x3e, 0x4d, 0xc8, 0xcf, 0x31, 0xb3, 0x33, 0x33, 0xd0, 0x43, + 0xe0, 0xfe, 0xbd, 0x2b, 0xdc, 0x24, 0xb4, 0x2a, 0x00, 0x80, 0x0a, 0x44, + 0xcc, 0xbc, 0x8c, 0x2c, 0x20, 0x11, 0x6a, 0x51, 0xd9, 0x8c, 0x2f, 0x52, + 0xdb, 0x0f, 0xc9, 0x40, 0xdb, 0x0f, 0x49, 0x41, 0x7d, 0x1d, 0x90, 0xa9, + 0xdc, 0x24, 0xb4, 0x29, 0x7d, 0x1d, 0x90, 0x29, 0xdf, 0xf3, 0xbe, 0x27, + 0x5c, 0x75, 0x02, 0x21, 0x58, 0x75, 0x02, 0x21, 0x9c, 0x91, 0x04, 0x02, + 0x3c, 0x09, 0x00, 0x47, 0x20, 0x96, 0x04, 0x02, 0x00, 0x96, 0x04, 0x02, + 0xcc, 0x9e, 0x04, 0x02, 0xc4, 0x9e, 0x04, 0x02, 0x1c, 0x85, 0x04, 0x02, + 0xe8, 0x87, 0x04, 0x02, 0x02, 0x22, 0x01, 0x21, 0x05, 0xf1, 0x3c, 0x00, + 0xff, 0xf7, 0x2a, 0xbb, 0x00, 0x20, 0x2d, 0x3a, 0x1f, 0x2a, 0x3f, 0xbf, + 0xdf, 0xf8, 0x70, 0x25, 0x51, 0x18, 0xdf, 0xf8, 0x70, 0x35, 0x99, 0x42, + 0x28, 0xbf, 0x4b, 0xf2, 0x06, 0x70, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46, + 0x0c, 0x22, 0xdf, 0xf8, 0x60, 0x35, 0x54, 0x43, 0x1a, 0x19, 0x02, 0x28, + 0x01, 0xf1, 0x54, 0x03, 0x13, 0xd1, 0xdf, 0xf8, 0x54, 0x05, 0x00, 0x68, + 0xd0, 0xf8, 0x52, 0x40, 0x00, 0xee, 0x10, 0x4a, 0xb8, 0xee, 0x40, 0x0a, + 0x83, 0xed, 0x00, 0x0a, 0x90, 0xf8, 0x51, 0x00, 0x00, 0xee, 0x10, 0x0a, + 0xb8, 0xee, 0x40, 0x0a, 0x83, 0xed, 0x01, 0x0a, 0x03, 0xe0, 0x14, 0x68, + 0x1c, 0x60, 0x50, 0x68, 0x58, 0x60, 0x12, 0x7a, 0x81, 0xf8, 0x46, 0x20, + 0x10, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x43, 0x0c, 0x46, 0x04, 0xf1, + 0x54, 0x09, 0x2d, 0xed, 0x10, 0x8b, 0x06, 0x46, 0xd9, 0xf8, 0x2c, 0x20, + 0xdf, 0xf8, 0x08, 0x85, 0x03, 0x28, 0xd4, 0xe9, 0x04, 0x01, 0x4f, 0xf4, + 0x7a, 0x73, 0x08, 0xbf, 0x08, 0xf1, 0x60, 0x08, 0xa3, 0xfb, 0x02, 0x57, + 0x8f, 0x42, 0x05, 0xd3, 0x01, 0xd8, 0x85, 0x42, 0x02, 0xd3, 0x98, 0xed, + 0x16, 0x8a, 0x01, 0xe0, 0x98, 0xed, 0x15, 0x8a, 0xe9, 0xf7, 0x48, 0xf9, + 0x00, 0xee, 0x10, 0x0a, 0x9f, 0xed, 0x82, 0xaa, 0x60, 0xee, 0x0a, 0x0a, + 0x20, 0xee, 0xa0, 0x1a, 0xf6, 0xee, 0x00, 0xda, 0x61, 0xee, 0x20, 0x0a, + 0xdf, 0xed, 0xee, 0x1a, 0x94, 0xf8, 0x43, 0x00, 0x60, 0xee, 0xa1, 0x1a, + 0x28, 0xee, 0x2d, 0x2a, 0x61, 0xee, 0x82, 0x1a, 0xd8, 0xed, 0x17, 0x2a, + 0x00, 0xee, 0x90, 0x0a, 0x61, 0xee, 0xa2, 0x2a, 0xf8, 0xee, 0x60, 0x0a, + 0x62, 0xee, 0xa0, 0xaa, 0xc9, 0xed, 0x02, 0xaa, 0xdf, 0xed, 0xe4, 0x1a, + 0x94, 0xed, 0x0d, 0x1a, 0xd9, 0xed, 0x01, 0x0a, 0xf8, 0xee, 0x41, 0x8a, + 0x80, 0xee, 0x28, 0xba, 0x60, 0xee, 0xa1, 0x1a, 0x9f, 0xed, 0xdf, 0x0a, + 0x81, 0xee, 0x80, 0x0a, 0xe9, 0xf7, 0x38, 0xf9, 0xf7, 0xee, 0x00, 0x0a, + 0x80, 0xee, 0x80, 0x8a, 0x68, 0xee, 0x08, 0x0a, 0x9f, 0xed, 0xda, 0x1a, + 0xb3, 0xee, 0x09, 0x0a, 0x00, 0xee, 0x81, 0x0a, 0xe8, 0xf7, 0x96, 0xf8, + 0xf1, 0xee, 0x04, 0x0a, 0xb1, 0xee, 0x00, 0x1a, 0x30, 0xee, 0x20, 0x0a, + 0xd8, 0xed, 0x01, 0x0a, 0x98, 0xed, 0x06, 0xca, 0xd8, 0xed, 0x00, 0xca, + 0x28, 0xee, 0x01, 0x1a, 0xc0, 0xee, 0x01, 0xba, 0x9f, 0xed, 0x5a, 0x1a, + 0x80, 0xee, 0x81, 0x1a, 0x99, 0xed, 0x00, 0x8a, 0x21, 0xee, 0x2a, 0x1a, + 0x88, 0xee, 0x2b, 0x0a, 0x88, 0xee, 0x01, 0x1a, 0x20, 0xee, 0x0a, 0x0a, + 0x21, 0xee, 0x0b, 0x1a, 0x20, 0xee, 0x01, 0x1a, 0xf7, 0xee, 0x00, 0x1a, + 0xc1, 0xee, 0x81, 0x0a, 0xb4, 0xee, 0x60, 0xca, 0xf1, 0xee, 0x10, 0xfa, + 0x48, 0xbf, 0xf0, 0xee, 0x4c, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xf7, 0xee, + 0x00, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0x20, 0xee, 0x2a, 0x0a, 0x88, 0xee, + 0x00, 0x0a, 0x20, 0xee, 0x0b, 0x0a, 0x60, 0xee, 0x0a, 0x9a, 0x98, 0xed, + 0x02, 0x0a, 0xf4, 0xee, 0x40, 0x9a, 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, + 0xf0, 0xee, 0x40, 0x9a, 0x39, 0xee, 0xec, 0x0a, 0x80, 0xee, 0x2c, 0x0a, + 0xf5, 0xf7, 0x68, 0xff, 0xb0, 0xee, 0x40, 0x9a, 0xf7, 0xee, 0x00, 0x0a, + 0x79, 0xee, 0x20, 0x0a, 0x9f, 0xed, 0xe3, 0x0a, 0x60, 0xee, 0xac, 0x0a, + 0x29, 0xee, 0x80, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x44, 0xbf, 0xbf, 0xee, 0x00, 0x1a, 0x39, 0xee, 0x01, 0x9a, 0xb7, 0xee, + 0x00, 0x0a, 0x39, 0xee, 0x00, 0x0a, 0x60, 0xee, 0x2c, 0x9a, 0xdf, 0xed, + 0x30, 0x0a, 0xc9, 0xee, 0xa0, 0xca, 0x6c, 0xee, 0xaa, 0x0a, 0xc8, 0xee, + 0x20, 0x0a, 0x98, 0xed, 0x0e, 0xda, 0x98, 0xed, 0x0f, 0xea, 0x60, 0xee, + 0x8b, 0xea, 0xb0, 0xee, 0x4d, 0x0a, 0x03, 0x2e, 0x0f, 0xbf, 0xcd, 0xee, + 0x0e, 0x0a, 0xf7, 0xee, 0x00, 0x0a, 0x7e, 0xee, 0x20, 0x0a, 0xcd, 0xee, + 0x20, 0x0a, 0xb4, 0xee, 0x6e, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, + 0xf0, 0xee, 0x40, 0xea, 0xf4, 0xee, 0x60, 0xea, 0xf1, 0xee, 0x10, 0xfa, + 0x48, 0xbf, 0xf0, 0xee, 0x60, 0xea, 0x8d, 0xee, 0x2e, 0xfa, 0x03, 0x2e, + 0x04, 0xbf, 0x9f, 0xed, 0xc4, 0x0a, 0x30, 0xee, 0x4f, 0xfa, 0xb0, 0xee, + 0x4f, 0x0a, 0xe8, 0xf7, 0xbd, 0xf8, 0xff, 0xee, 0x00, 0x0a, 0x30, 0xee, + 0x20, 0x8a, 0xb0, 0xee, 0x4f, 0x0a, 0x06, 0xf0, 0x33, 0xfb, 0xb7, 0xee, + 0x00, 0x1a, 0xf7, 0xee, 0x00, 0x0a, 0x30, 0xee, 0x01, 0x0a, 0x7e, 0xee, + 0x20, 0x0a, 0x70, 0xee, 0xc8, 0x1a, 0x70, 0xee, 0xc0, 0x0a, 0xcd, 0xee, + 0x21, 0x1a, 0xcd, 0xee, 0x20, 0x0a, 0x71, 0xee, 0xa0, 0x0a, 0x60, 0xee, + 0xad, 0x0a, 0xf4, 0xee, 0x6e, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x58, 0xbf, + 0xb0, 0xee, 0x40, 0x8a, 0x03, 0x2e, 0x09, 0xd1, 0x9f, 0xed, 0xad, 0x0a, + 0x30, 0xee, 0x48, 0x0a, 0x8d, 0xee, 0x00, 0x0a, 0x08, 0xe0, 0x00, 0xbf, + 0xdb, 0x0f, 0xc9, 0x40, 0xf7, 0xee, 0x00, 0x0a, 0x78, 0xee, 0x20, 0x0a, + 0x8d, 0xee, 0x20, 0x0a, 0xb0, 0xee, 0x00, 0x3a, 0x60, 0xee, 0x2a, 0x0a, + 0x6c, 0xee, 0xa0, 0x0a, 0xc0, 0xee, 0x8b, 0xaa, 0xca, 0xee, 0xab, 0x0a, + 0x60, 0xee, 0x8a, 0x0a, 0x60, 0xee, 0x80, 0x0a, 0xf7, 0xee, 0x00, 0x1a, + 0xf7, 0xee, 0x00, 0x3a, 0x2a, 0xee, 0xab, 0x1a, 0xc1, 0xee, 0xa0, 0x0a, + 0xb4, 0xee, 0x60, 0xca, 0xf1, 0xee, 0x10, 0xfa, 0x61, 0xee, 0x0a, 0x1a, + 0x21, 0xee, 0x03, 0x1a, 0x21, 0xee, 0x0a, 0x1a, 0x61, 0xee, 0x80, 0x1a, + 0x21, 0xee, 0x00, 0x0a, 0x83, 0xee, 0x80, 0xaa, 0x98, 0xed, 0x07, 0x0a, + 0xd8, 0xed, 0x03, 0xca, 0xb7, 0xee, 0x00, 0x2a, 0xc2, 0xee, 0x21, 0x1a, + 0x21, 0xee, 0xa0, 0x2a, 0x70, 0xee, 0xe1, 0x2a, 0x48, 0xbf, 0xf0, 0xee, + 0x4c, 0x0a, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, + 0xf0, 0xee, 0x40, 0x0a, 0x82, 0xee, 0x22, 0xba, 0x98, 0xed, 0x09, 0x0a, + 0x98, 0xed, 0x05, 0xca, 0xb4, 0xee, 0x4b, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x48, 0xbf, 0xb0, 0xee, 0x40, 0xba, 0x98, 0xed, 0x0a, 0x0a, 0xb4, 0xee, + 0x40, 0xba, 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, 0xb0, 0xee, 0x40, 0xba, + 0x98, 0xed, 0x0c, 0x0a, 0xb4, 0xee, 0x4a, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x48, 0xbf, 0xb0, 0xee, 0x40, 0xaa, 0x98, 0xed, 0x0d, 0x0a, 0xb4, 0xee, + 0x40, 0xaa, 0x2c, 0xee, 0x2c, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0xf4, 0xee, + 0x41, 0x0a, 0x48, 0xbf, 0xb0, 0xee, 0x40, 0xaa, 0xf1, 0xee, 0x10, 0xfa, + 0x80, 0xee, 0x8c, 0x0a, 0x05, 0xd5, 0xf5, 0xf7, 0x75, 0xfe, 0x01, 0x25, + 0xf0, 0xee, 0x40, 0xba, 0x08, 0xe0, 0xf5, 0xf7, 0x6f, 0xfe, 0x70, 0xee, + 0x6c, 0xba, 0x3c, 0xee, 0xab, 0x0a, 0x00, 0x25, 0x20, 0xee, 0x0c, 0x0a, + 0x88, 0x34, 0x84, 0xed, 0x04, 0x0a, 0xd8, 0xed, 0x04, 0xca, 0x98, 0xed, + 0x08, 0xca, 0x6c, 0xee, 0x2c, 0x0a, 0xb4, 0xee, 0x60, 0xba, 0xf1, 0xee, + 0x10, 0xfa, 0x8b, 0xee, 0x0c, 0x0a, 0x05, 0xd5, 0xf5, 0xf7, 0x56, 0xfe, + 0x01, 0x27, 0xb0, 0xee, 0x40, 0xba, 0x08, 0xe0, 0xf5, 0xf7, 0x50, 0xfe, + 0x30, 0xee, 0x6c, 0xba, 0x3c, 0xee, 0x8b, 0x0a, 0x00, 0x27, 0x20, 0xee, + 0x0c, 0x0a, 0x84, 0xed, 0x05, 0x0a, 0x03, 0x2e, 0x98, 0xed, 0x0b, 0x0a, + 0x8a, 0xee, 0x00, 0x0a, 0x06, 0xd1, 0xf5, 0xf7, 0x3f, 0xfe, 0xd8, 0xed, + 0x04, 0x0a, 0x30, 0xee, 0x60, 0xaa, 0x05, 0xe0, 0xf5, 0xf7, 0x38, 0xfe, + 0xff, 0xee, 0x00, 0x0a, 0x30, 0xee, 0x20, 0xaa, 0xdf, 0xed, 0x4e, 0x0a, + 0xf4, 0xee, 0x60, 0xba, 0x9f, 0xed, 0x4d, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0xa8, 0xbf, 0xf0, 0xee, 0x40, 0xba, 0xb4, 0xee, 0x60, 0xba, 0xf1, 0xee, + 0x10, 0xfa, 0xa8, 0xbf, 0xb0, 0xee, 0x40, 0xba, 0xb4, 0xee, 0x60, 0xaa, + 0xf1, 0xee, 0x10, 0xfa, 0xa8, 0xbf, 0xb0, 0xee, 0x40, 0xaa, 0xb4, 0xee, + 0x60, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0xd9, 0xf8, 0x28, 0x00, 0xa8, 0xbf, + 0xb0, 0xee, 0x40, 0x8a, 0x01, 0x28, 0x0d, 0xd1, 0x28, 0xee, 0xa9, 0x0a, + 0xd9, 0xed, 0x06, 0x0a, 0x10, 0xe0, 0x00, 0xbf, 0x83, 0xf9, 0x22, 0x3e, + 0xdb, 0x0f, 0x49, 0x40, 0x00, 0x00, 0x34, 0x43, 0x00, 0x00, 0x00, 0x42, + 0x02, 0x2e, 0x18, 0xbf, 0x03, 0x2e, 0x06, 0xd1, 0x28, 0xee, 0xa9, 0x0a, + 0xdf, 0xed, 0x34, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0x05, 0xe0, 0x28, 0xee, + 0xa9, 0x0a, 0x9f, 0xed, 0x32, 0x1a, 0x20, 0xee, 0x01, 0x0a, 0xd8, 0xed, + 0x12, 0x0a, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x5d, 0xbf, + 0xd8, 0xed, 0x13, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0xb0, 0xee, 0x60, 0x0a, 0xd8, 0xed, 0x11, 0x0a, 0x80, 0xee, 0x20, 0x0a, + 0xf5, 0xf7, 0xdc, 0xfd, 0xbf, 0xee, 0x00, 0x1a, 0x30, 0xee, 0x01, 0x0a, + 0xbd, 0xee, 0xeb, 0x1a, 0x11, 0xee, 0x10, 0x0a, 0x20, 0x70, 0xbd, 0xee, + 0xcb, 0x1a, 0x11, 0xee, 0x10, 0x0a, 0x60, 0x70, 0xfd, 0xee, 0xca, 0x0a, + 0xfd, 0xee, 0xc8, 0x1a, 0x10, 0xee, 0x90, 0x1a, 0x11, 0xee, 0x90, 0x0a, + 0x21, 0x71, 0x60, 0x71, 0xa0, 0x71, 0xa5, 0x70, 0xfd, 0xee, 0xc9, 0x0a, + 0xbd, 0xee, 0xc0, 0x1a, 0xe7, 0x70, 0x10, 0xee, 0x90, 0x0a, 0x11, 0xee, + 0x10, 0x1a, 0xfc, 0xee, 0xea, 0x1a, 0xe0, 0x71, 0x21, 0x72, 0xc4, 0xed, + 0x08, 0x1a, 0xf7, 0xee, 0x00, 0x0a, 0x7a, 0xee, 0x20, 0x0a, 0x98, 0xed, + 0x0b, 0x1a, 0xd8, 0xed, 0x10, 0x1a, 0x40, 0xee, 0x81, 0x1a, 0xc4, 0xed, + 0x06, 0x1a, 0xd8, 0xed, 0x11, 0x0a, 0xb0, 0xee, 0x60, 0x1a, 0x00, 0xee, + 0x20, 0x1a, 0x84, 0xed, 0x03, 0x1a, 0xbd, 0xec, 0x10, 0x8b, 0xbd, 0xe8, + 0xf1, 0x83, 0x00, 0x00, 0x33, 0x33, 0x93, 0x3f, 0x00, 0x00, 0x80, 0x42, + 0x01, 0x00, 0x7c, 0x42, 0x00, 0x00, 0x7c, 0x42, 0xff, 0xeb, 0x2f, 0x2d, + 0x1f, 0x6a, 0xc0, 0x2f, 0xa0, 0x15, 0xff, 0xff, 0x01, 0xf9, 0x15, 0x00, + 0x64, 0x1f, 0x00, 0x02, 0x5c, 0x75, 0x02, 0x21, 0x88, 0x48, 0x00, 0x21, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, 0x70, 0x4c, 0x71, 0x4a, + 0x20, 0x68, 0x13, 0x68, 0x50, 0xf8, 0xb8, 0x1f, 0x19, 0x40, 0x0d, 0x04, + 0x01, 0x68, 0x01, 0xea, 0x03, 0x00, 0x2d, 0x0e, 0x00, 0xf0, 0xff, 0x09, + 0x00, 0x27, 0x25, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x18, 0xd5, 0x20, 0x68, + 0xf9, 0xb2, 0x01, 0x44, 0xe0, 0x23, 0x91, 0xf8, 0xbc, 0x20, 0x5a, 0x43, + 0x83, 0x18, 0x03, 0xf1, 0xc4, 0x08, 0x08, 0xf1, 0x98, 0x06, 0xf8, 0xb2, + 0x31, 0x78, 0x00, 0xf0, 0x99, 0xf8, 0x71, 0x78, 0xf8, 0xb2, 0x00, 0xf0, + 0x81, 0xf8, 0x08, 0xf1, 0x9b, 0x01, 0xf8, 0xb2, 0x00, 0xf0, 0x3c, 0xf8, + 0x7f, 0x1c, 0xf8, 0xb2, 0x08, 0x28, 0xde, 0xdb, 0x00, 0x25, 0x29, 0xfa, + 0x05, 0xf0, 0xc0, 0x07, 0x15, 0xd5, 0x21, 0x68, 0xea, 0xb2, 0x64, 0x23, + 0x5a, 0x43, 0x8b, 0x18, 0x03, 0xf5, 0xff, 0x67, 0xe8, 0xb2, 0x39, 0x78, + 0x00, 0xf0, 0x73, 0xf8, 0x79, 0x78, 0xe8, 0xb2, 0x00, 0xf0, 0x56, 0xf8, + 0x00, 0x23, 0x07, 0xf1, 0x34, 0x02, 0x39, 0x1d, 0xe8, 0xb2, 0x00, 0xf0, + 0x06, 0xf8, 0x6d, 0x1c, 0xe8, 0xb2, 0x08, 0x28, 0xe1, 0xdb, 0xbd, 0xe8, + 0xf1, 0x83, 0x10, 0xb5, 0x00, 0xf0, 0x38, 0xf8, 0x0c, 0xbf, 0x18, 0x30, + 0x78, 0x30, 0x00, 0x23, 0x31, 0xf8, 0x13, 0x40, 0x20, 0xf8, 0x02, 0x4b, + 0x5b, 0x1c, 0x18, 0x2b, 0xf8, 0xd1, 0x00, 0x21, 0x32, 0xf8, 0x11, 0x30, + 0x20, 0xf8, 0x02, 0x3b, 0x49, 0x1c, 0x18, 0x29, 0xf8, 0xd1, 0x10, 0xbd, + 0x3e, 0x4a, 0x52, 0xf8, 0x20, 0x00, 0x48, 0x30, 0x00, 0x22, 0x31, 0xf8, + 0x12, 0x30, 0x20, 0xf8, 0x02, 0x3b, 0x52, 0x1c, 0x18, 0x2a, 0xf8, 0xd1, + 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, 0x14, 0xf8, 0x0c, 0xbf, 0x18, 0x30, + 0x78, 0x30, 0x00, 0x23, 0x30, 0xf9, 0x02, 0x4b, 0x21, 0xf8, 0x13, 0x40, + 0x5b, 0x1c, 0x18, 0x2b, 0xf8, 0xd1, 0x00, 0x21, 0x30, 0xf9, 0x02, 0x3b, + 0x22, 0xf8, 0x11, 0x30, 0x49, 0x1c, 0x18, 0x29, 0xf8, 0xd1, 0x10, 0xbd, + 0x2d, 0x4c, 0x54, 0xf8, 0x20, 0x00, 0x00, 0x2b, 0x70, 0x47, 0x10, 0xb5, + 0x00, 0xf0, 0x10, 0xf8, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x10, 0x22, + 0x04, 0x21, 0x07, 0xe0, 0x10, 0xb5, 0x00, 0xf0, 0x07, 0xf8, 0xbd, 0xe8, + 0x10, 0x40, 0x0b, 0x46, 0x06, 0x22, 0x01, 0x21, 0x14, 0x30, 0x4b, 0xe7, + 0x21, 0x4c, 0x54, 0xf8, 0x20, 0x00, 0x70, 0x47, 0x10, 0xb5, 0x1e, 0x4c, + 0x54, 0xf8, 0x20, 0x00, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x03, 0x22, + 0x00, 0x21, 0x40, 0x30, 0x3c, 0xe7, 0x10, 0xb5, 0xff, 0xf7, 0xee, 0xff, + 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x01, 0x22, 0x00, 0x21, 0xe5, 0xe7, + 0x10, 0xb5, 0x14, 0x4c, 0x54, 0xf8, 0x20, 0x00, 0xbd, 0xe8, 0x10, 0x40, + 0x0b, 0x46, 0x4f, 0xf4, 0x80, 0x52, 0x0c, 0x21, 0x28, 0x30, 0x27, 0xe7, + 0x0f, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x14, 0x30, 0x70, 0x47, 0x0e, 0x49, + 0x51, 0xf8, 0x20, 0x00, 0x00, 0x1d, 0x00, 0x68, 0xc0, 0xf3, 0x81, 0x50, + 0x70, 0x47, 0x10, 0xb5, 0x09, 0x4c, 0x54, 0xf8, 0x20, 0x00, 0xbd, 0xe8, + 0x10, 0x40, 0x0b, 0x46, 0x4f, 0xf4, 0x40, 0x02, 0x16, 0x21, 0x00, 0x1d, + 0x0e, 0xe7, 0x00, 0x00, 0x5c, 0x75, 0x02, 0x21, 0x58, 0x75, 0x02, 0x21, + 0x20, 0x96, 0x04, 0x02, 0x80, 0x98, 0x04, 0x02, 0xc0, 0x97, 0x04, 0x02, + 0x10, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0xb0, 0xee, 0x60, 0x8a, 0x18, 0xee, + 0x10, 0x0a, 0x40, 0x00, 0x1e, 0xbf, 0xf7, 0xee, 0x00, 0x0a, 0xb4, 0xee, + 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x82, 0xb0, 0x00, 0xf0, 0xba, 0x81, + 0xbf, 0xee, 0x00, 0x1a, 0xb4, 0xee, 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x07, 0xd1, 0x00, 0x16, 0x40, 0x1c, 0x18, 0xee, 0x10, 0x1a, 0x02, 0xd1, + 0x49, 0x02, 0x00, 0xf0, 0xab, 0x81, 0x10, 0xee, 0x10, 0x0a, 0x40, 0x00, + 0x00, 0x16, 0x40, 0x1c, 0x00, 0xf0, 0xf3, 0x80, 0x10, 0xee, 0x10, 0x0a, + 0x40, 0x00, 0x00, 0xf0, 0xee, 0x80, 0x18, 0xee, 0x10, 0x0a, 0x40, 0x00, + 0x00, 0x16, 0x40, 0x1c, 0x00, 0xf0, 0xe7, 0x80, 0x18, 0xee, 0x10, 0x1a, + 0x48, 0x00, 0x08, 0xbf, 0xf0, 0xee, 0x48, 0x8a, 0x0f, 0xd0, 0x00, 0x0e, + 0xc0, 0xf1, 0x96, 0x00, 0x18, 0x28, 0xa8, 0xbf, 0x01, 0xf0, 0x00, 0x41, + 0x05, 0xda, 0x00, 0x28, 0xc4, 0xbf, 0x21, 0xfa, 0x00, 0xf2, 0x02, 0xfa, + 0x00, 0xf1, 0x08, 0xee, 0x90, 0x1a, 0x10, 0xee, 0x10, 0x0a, 0xc0, 0x0f, + 0x1c, 0xbf, 0xb4, 0xee, 0x68, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x05, 0xd0, + 0xaf, 0xf3, 0x00, 0x80, 0x02, 0xb0, 0x9f, 0xed, 0xb9, 0x0a, 0x75, 0xe1, + 0x10, 0xee, 0x10, 0x1a, 0x21, 0xf0, 0x00, 0x40, 0xb0, 0xf5, 0x00, 0x0f, + 0x06, 0xd2, 0x00, 0x21, 0x00, 0x91, 0x60, 0xb1, 0x68, 0x46, 0xe8, 0xf7, + 0x73, 0xfe, 0x08, 0xe0, 0xc0, 0x0d, 0x21, 0xf0, 0xff, 0x41, 0x7e, 0x38, + 0x41, 0xf0, 0x7c, 0x51, 0x00, 0x90, 0x00, 0xee, 0x10, 0x1a, 0x10, 0xee, + 0x10, 0x0a, 0xc0, 0x0f, 0x21, 0xd0, 0x10, 0xee, 0x10, 0x0a, 0x20, 0xf0, + 0x00, 0x40, 0x00, 0xee, 0x10, 0x0a, 0x18, 0xee, 0x90, 0x1a, 0x48, 0x00, + 0x08, 0xbf, 0xf0, 0xee, 0x68, 0x0a, 0x0f, 0xd0, 0x00, 0x0e, 0xc0, 0xf1, + 0x97, 0x00, 0x18, 0x28, 0xa8, 0xbf, 0x01, 0xf0, 0x00, 0x41, 0x05, 0xda, + 0x00, 0x28, 0xc4, 0xbf, 0x21, 0xfa, 0x00, 0xf2, 0x02, 0xfa, 0x00, 0xf1, + 0x00, 0xee, 0x90, 0x1a, 0xf4, 0xee, 0x60, 0x8a, 0xf1, 0xee, 0x10, 0xfa, + 0x01, 0xd1, 0x00, 0x24, 0x00, 0xe0, 0x01, 0x24, 0xdf, 0xed, 0x9c, 0x0a, + 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x06, 0xd5, 0x00, 0x98, + 0xb0, 0xee, 0x00, 0x1a, 0x40, 0x1e, 0x20, 0xee, 0x01, 0x0a, 0x00, 0x90, + 0xff, 0xee, 0x00, 0x0a, 0x70, 0xee, 0x20, 0x0a, 0xb7, 0xee, 0x00, 0x1a, + 0x30, 0xee, 0x01, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0x20, 0xee, 0x00, 0x1a, + 0xdf, 0xed, 0x90, 0x1a, 0x9f, 0xed, 0x90, 0x2a, 0x01, 0xee, 0x21, 0x2a, + 0xdf, 0xed, 0x8f, 0x2a, 0x42, 0xee, 0x01, 0x2a, 0x62, 0xee, 0x81, 0x2a, + 0x72, 0xee, 0xe0, 0x2a, 0x22, 0xee, 0x80, 0x0a, 0x30, 0xee, 0x80, 0x0a, + 0xdd, 0xed, 0x00, 0x0a, 0xb8, 0xee, 0xe0, 0x1a, 0xdf, 0xed, 0x88, 0x1a, + 0xb0, 0xee, 0x41, 0x2a, 0x00, 0xee, 0x21, 0x2a, 0x62, 0xee, 0x08, 0x0a, + 0xdf, 0xed, 0x85, 0x2a, 0xf4, 0xee, 0x62, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x38, 0xd4, 0x9f, 0xed, 0x83, 0x3a, 0xf4, 0xee, 0x43, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x2e, 0xda, 0x10, 0xee, 0x90, 0x0a, 0xc0, 0x0f, 0x06, 0xd0, + 0xfe, 0xee, 0x00, 0x1a, 0x70, 0xee, 0xa1, 0x0a, 0xfd, 0xee, 0xe0, 0x1a, + 0x05, 0xe0, 0xb6, 0xee, 0x00, 0x2a, 0x30, 0xee, 0x82, 0x2a, 0xfd, 0xee, + 0xc2, 0x1a, 0x11, 0xee, 0x90, 0x0a, 0x21, 0xee, 0x08, 0x1a, 0xf8, 0xee, + 0xe1, 0x1a, 0x20, 0xee, 0x08, 0x0a, 0x31, 0xee, 0x61, 0x1a, 0xdf, 0xed, + 0x73, 0x2a, 0xf7, 0xee, 0x00, 0x0a, 0x01, 0xee, 0x22, 0x0a, 0xe8, 0xf7, + 0xfb, 0xfd, 0x10, 0xee, 0x10, 0x0a, 0x41, 0x00, 0x0a, 0xd0, 0x10, 0xee, + 0x10, 0x1a, 0x48, 0x00, 0x00, 0x16, 0x40, 0x1c, 0x06, 0xd1, 0x49, 0x02, + 0x04, 0xd1, 0x9f, 0xed, 0x6a, 0x0a, 0x01, 0xe0, 0x9f, 0xed, 0x69, 0x0a, + 0x00, 0x2c, 0x00, 0xf0, 0xb7, 0x80, 0x02, 0xb0, 0xb1, 0xee, 0x40, 0x0a, + 0xb4, 0xe0, 0x10, 0xee, 0x10, 0x1a, 0x49, 0x00, 0x08, 0x16, 0x40, 0x1c, + 0x02, 0xd1, 0x09, 0x02, 0x40, 0xf0, 0xaa, 0x80, 0x18, 0xee, 0x10, 0x1a, + 0x49, 0x00, 0x08, 0x16, 0x40, 0x1c, 0x05, 0xd1, 0x09, 0x02, 0x18, 0xbf, + 0xb0, 0xee, 0x48, 0x0a, 0x40, 0xf0, 0x9e, 0x80, 0x18, 0xee, 0x10, 0x1a, + 0x49, 0x00, 0x01, 0x20, 0x09, 0x16, 0x49, 0x1c, 0x3b, 0xd0, 0x18, 0xee, + 0x10, 0x2a, 0x51, 0x00, 0x08, 0xbf, 0xf0, 0xee, 0x48, 0x0a, 0x0f, 0xd0, + 0x09, 0x0e, 0xc1, 0xf1, 0x96, 0x01, 0x18, 0x29, 0xa8, 0xbf, 0x02, 0xf0, + 0x00, 0x42, 0x05, 0xda, 0x00, 0x29, 0xc4, 0xbf, 0x22, 0xfa, 0x01, 0xf3, + 0x03, 0xfa, 0x01, 0xf2, 0x00, 0xee, 0x90, 0x2a, 0xb4, 0xee, 0x60, 0x8a, + 0xf1, 0xee, 0x10, 0xfa, 0x18, 0xbf, 0x00, 0x20, 0x10, 0xee, 0x90, 0x2a, + 0x51, 0x00, 0x08, 0xbf, 0xb0, 0xee, 0x60, 0x1a, 0x0f, 0xd0, 0x09, 0x0e, + 0xc1, 0xf1, 0x97, 0x01, 0x18, 0x29, 0xa8, 0xbf, 0x02, 0xf0, 0x00, 0x42, + 0x05, 0xda, 0x00, 0x29, 0xc4, 0xbf, 0x22, 0xfa, 0x01, 0xf3, 0x03, 0xfa, + 0x01, 0xf2, 0x01, 0xee, 0x10, 0x2a, 0x30, 0xb1, 0xf4, 0xee, 0x41, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x0c, 0xbf, 0x00, 0x20, 0x01, 0x20, 0x10, 0xee, + 0x10, 0x2a, 0x51, 0x00, 0x09, 0x16, 0x49, 0x1c, 0x0a, 0xd1, 0x52, 0x02, + 0x08, 0xd1, 0x10, 0xee, 0x10, 0x1a, 0xc9, 0x0f, 0x1a, 0xd1, 0x18, 0xee, + 0x10, 0x0a, 0xc0, 0x0f, 0x41, 0xd0, 0x37, 0xe0, 0x18, 0xee, 0x10, 0x2a, + 0x51, 0x00, 0x09, 0x16, 0x49, 0x1c, 0x15, 0xd1, 0x52, 0x02, 0x13, 0xd1, + 0x10, 0xee, 0x10, 0x1a, 0x21, 0xf0, 0x00, 0x40, 0xb0, 0xf5, 0x00, 0x0f, + 0x16, 0xd2, 0x00, 0x21, 0x00, 0x91, 0xb0, 0xb1, 0x68, 0x46, 0xe8, 0xf7, + 0x41, 0xfd, 0x12, 0xe0, 0x18, 0xee, 0x10, 0x1a, 0xc9, 0x0f, 0x21, 0xd0, + 0xe0, 0xb1, 0x05, 0xe0, 0xb0, 0xb9, 0x18, 0xee, 0x10, 0x1a, 0xc9, 0x0f, + 0x1a, 0xd1, 0xa8, 0xb1, 0x02, 0xb0, 0x9f, 0xed, 0x20, 0x0a, 0x25, 0xe0, + 0xc0, 0x0d, 0x7e, 0x38, 0x00, 0x90, 0x18, 0xee, 0x10, 0x0a, 0xc0, 0x0f, + 0x00, 0x98, 0x02, 0xd1, 0x00, 0x28, 0x10, 0xdc, 0x06, 0xe0, 0x00, 0x28, + 0x04, 0xdc, 0x0c, 0xe0, 0x10, 0xee, 0x10, 0x0a, 0xc0, 0x0f, 0xe4, 0xe7, + 0x02, 0xb0, 0x9f, 0xed, 0x14, 0x0a, 0x0f, 0xe0, 0x18, 0xb1, 0x02, 0xb0, + 0x9f, 0xed, 0x13, 0x0a, 0x0a, 0xe0, 0x02, 0xb0, 0x9f, 0xed, 0x0e, 0x0a, + 0x06, 0xe0, 0x00, 0xbf, 0xff, 0xff, 0xff, 0x7f, 0xb7, 0xee, 0x00, 0x0a, + 0x02, 0xb0, 0x00, 0xbf, 0xbd, 0xec, 0x02, 0x8b, 0x10, 0xbd, 0x00, 0x00, + 0xf3, 0x04, 0x35, 0x3f, 0x15, 0x02, 0x99, 0x3e, 0x11, 0xae, 0xcc, 0x3e, + 0xc0, 0xaa, 0x2a, 0x3f, 0x3b, 0xaa, 0xb8, 0x3f, 0x00, 0x00, 0x00, 0xc7, + 0x01, 0x00, 0x00, 0x47, 0x18, 0x72, 0x31, 0x3f, 0x00, 0x00, 0x80, 0x7f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0xff, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, + 0x0d, 0xf8, 0x01, 0x70, 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, + 0x72, 0xb6, 0x05, 0x68, 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, + 0x29, 0x43, 0x70, 0x47, 0xdf, 0xf8, 0x10, 0x05, 0x01, 0x68, 0xd1, 0xf8, + 0xb8, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x70, 0x47, 0xdf, 0xf8, 0x00, 0x15, + 0x09, 0x68, 0x0a, 0x18, 0xed, 0x20, 0x92, 0xf8, 0xbc, 0x30, 0x43, 0x43, + 0xc8, 0x18, 0x00, 0xf2, 0x44, 0x40, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, + 0xdf, 0xf8, 0xe4, 0x04, 0x2d, 0xed, 0x02, 0x8b, 0x02, 0x68, 0xdf, 0xf8, + 0xe0, 0x04, 0x00, 0x68, 0x82, 0xb0, 0xd2, 0xf8, 0xb8, 0x10, 0x08, 0x40, + 0x00, 0xf0, 0xff, 0x00, 0x00, 0x24, 0x00, 0x25, 0x00, 0x90, 0x00, 0x98, + 0xe8, 0x40, 0xc1, 0x07, 0x40, 0xf1, 0x33, 0x81, 0xe8, 0xb2, 0xe8, 0xf7, + 0xae, 0xfe, 0x04, 0x00, 0x40, 0xf0, 0x32, 0x81, 0xe8, 0xb2, 0xff, 0xf7, + 0xd3, 0xff, 0xdf, 0xf8, 0xb0, 0x04, 0x5f, 0xfa, 0x85, 0xf9, 0x50, 0xf8, + 0x29, 0x60, 0x00, 0x23, 0x07, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x12, 0x00, + 0xff, 0xf7, 0xa4, 0xff, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x06, 0xf1, + 0x1d, 0x00, 0xff, 0xf7, 0x9d, 0xff, 0x01, 0xf0, 0x1a, 0xfa, 0x00, 0xee, + 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x8a, 0x9f, 0xed, 0xb6, 0x0a, 0x80, 0xee, + 0x08, 0x0a, 0xf7, 0xee, 0x00, 0x0a, 0xc0, 0xee, 0x80, 0x0a, 0x9f, 0xed, + 0xb3, 0x1a, 0x30, 0xee, 0x81, 0x1a, 0xf7, 0xee, 0x00, 0x1a, 0xc1, 0xee, + 0x81, 0x1a, 0x9f, 0xed, 0xb0, 0x0a, 0x31, 0xee, 0x80, 0x0a, 0xdf, 0xed, + 0xaf, 0x0a, 0xc0, 0xee, 0x80, 0x0a, 0x9f, 0xed, 0xae, 0x1a, 0x80, 0xee, + 0x81, 0x1a, 0xdf, 0xed, 0xad, 0x1a, 0xbf, 0xee, 0x00, 0x0a, 0x01, 0xee, + 0x21, 0x0a, 0xdf, 0xed, 0xab, 0x0a, 0xc0, 0xee, 0x80, 0x0a, 0x9f, 0xed, + 0xaa, 0x1a, 0x20, 0xee, 0x81, 0x1a, 0xf7, 0xee, 0x00, 0x1a, 0xc1, 0xee, + 0x81, 0x1a, 0x9f, 0xed, 0xc0, 0x2a, 0x31, 0xee, 0x82, 0x2a, 0x9f, 0xed, + 0xa1, 0x0a, 0x22, 0xee, 0x00, 0x0a, 0xf5, 0xf7, 0xfb, 0xf9, 0x00, 0x24, + 0xb5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x63, 0xd4, 0xdf, 0xed, + 0xb9, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x5c, 0xda, + 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0xc3, 0xb2, 0x3f, 0x22, + 0x00, 0x21, 0x06, 0xf1, 0x10, 0x00, 0xff, 0xf7, 0x47, 0xff, 0xbb, 0xee, + 0x09, 0x0a, 0x38, 0xee, 0x00, 0x0a, 0xdf, 0xed, 0xaf, 0x0a, 0x20, 0xee, + 0x00, 0x1a, 0xdf, 0xed, 0xae, 0x1a, 0xc0, 0xee, 0x20, 0x0a, 0xc1, 0xee, + 0x21, 0x1a, 0x70, 0xee, 0xe1, 0x1a, 0x9f, 0xed, 0xab, 0x2a, 0xb3, 0xee, + 0x00, 0x0a, 0x01, 0xee, 0x82, 0x0a, 0xf5, 0xf7, 0xcb, 0xf9, 0xb5, 0xee, + 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x37, 0xd4, 0xdf, 0xed, 0xa5, 0x0a, + 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x30, 0xda, 0xbd, 0xee, + 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x7a, 0xfb, 0xb2, 0x1f, 0x22, 0x00, 0x21, + 0x06, 0xf1, 0x20, 0x00, 0xff, 0xf7, 0x18, 0xff, 0xfb, 0xb2, 0x1f, 0x22, + 0x00, 0x21, 0x06, 0xf1, 0x25, 0x00, 0xff, 0xf7, 0x11, 0xff, 0x00, 0xf0, + 0x37, 0xf9, 0x06, 0xf1, 0x23, 0x00, 0xff, 0xf7, 0x0b, 0xff, 0x06, 0xf1, + 0x30, 0x07, 0x00, 0x23, 0x04, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x2a, 0xf9, + 0x00, 0x23, 0x10, 0x22, 0x00, 0xf0, 0x25, 0xf9, 0x01, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x06, 0xf1, 0x11, 0x00, 0xff, 0xf7, 0xf9, 0xfe, 0xe8, 0xb2, + 0x00, 0xf0, 0x7e, 0xf8, 0x04, 0xe0, 0x4b, 0xf2, 0x03, 0x34, 0x01, 0xe0, + 0x4b, 0xf2, 0x05, 0x34, 0xdf, 0xf8, 0x30, 0x03, 0x50, 0xf8, 0x29, 0x90, + 0xe8, 0xb2, 0xff, 0xf7, 0x0b, 0xff, 0x09, 0xf2, 0xf2, 0x3a, 0x10, 0xf8, + 0xb3, 0x8f, 0x47, 0x78, 0x90, 0xf8, 0x03, 0xb0, 0x01, 0x23, 0x00, 0xf0, + 0x63, 0xf8, 0x01, 0x23, 0x08, 0x22, 0x03, 0x21, 0x00, 0xf0, 0x60, 0xf8, + 0x00, 0x23, 0x20, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x5b, 0xf8, 0x43, 0x46, + 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x56, 0xf8, 0x3b, 0x46, 0x02, 0x22, + 0x01, 0x21, 0x00, 0xf0, 0x51, 0xf8, 0x09, 0xf2, 0xf3, 0x39, 0x5b, 0x46, + 0x07, 0x22, 0x00, 0x21, 0x48, 0x46, 0xff, 0xf7, 0xc3, 0xfe, 0x01, 0x23, + 0x20, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x44, 0xf8, 0x00, 0x23, 0x00, 0xf0, + 0x3f, 0xf8, 0x01, 0x2f, 0x0c, 0xbf, 0x00, 0x23, 0x01, 0x23, 0x08, 0x22, + 0x03, 0x21, 0x00, 0xf0, 0x39, 0xf8, 0x7c, 0xbb, 0x10, 0x23, 0x1f, 0x22, + 0x00, 0x21, 0xb0, 0x1c, 0xff, 0xf7, 0xac, 0xfe, 0x00, 0xf0, 0xd2, 0xf8, + 0x06, 0xf1, 0x08, 0x00, 0xff, 0xf7, 0xa6, 0xfe, 0x06, 0xf1, 0x33, 0x07, + 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0xc5, 0xf8, 0x00, 0x23, + 0x80, 0x22, 0x07, 0x21, 0x00, 0xf0, 0xc0, 0xf8, 0x01, 0x23, 0x10, 0x22, + 0x04, 0x21, 0xa1, 0x48, 0xff, 0xf7, 0x94, 0xfe, 0x01, 0x23, 0x04, 0x22, + 0x02, 0x21, 0x9e, 0x48, 0xff, 0xf7, 0x8e, 0xfe, 0x00, 0x23, 0x20, 0x22, + 0x05, 0x21, 0x06, 0xf1, 0x09, 0x00, 0xff, 0xf7, 0x87, 0xfe, 0x6d, 0x1c, + 0xe8, 0xb2, 0x08, 0x28, 0x7f, 0xf4, 0xc3, 0xae, 0x02, 0xb0, 0x20, 0x46, + 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, 0x10, 0x22, 0x04, 0x21, + 0x50, 0x46, 0x77, 0xe6, 0x10, 0xb5, 0x04, 0x46, 0xff, 0xf7, 0x96, 0xfe, + 0xd7, 0x30, 0x42, 0x78, 0x01, 0x78, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, + 0x56, 0xe0, 0x10, 0xb5, 0x8c, 0x4b, 0x53, 0xf8, 0x20, 0x40, 0x04, 0xf1, + 0x40, 0x03, 0x18, 0x78, 0x1b, 0x78, 0x00, 0xf0, 0x01, 0x00, 0xc3, 0xf3, + 0x01, 0x13, 0x13, 0xb9, 0x08, 0xb1, 0x01, 0x20, 0x04, 0xe0, 0x01, 0x2b, + 0x06, 0xbf, 0x00, 0x28, 0x02, 0x20, 0x04, 0x20, 0x08, 0x70, 0x20, 0x78, + 0xc0, 0xf3, 0x80, 0x00, 0x00, 0x28, 0x0c, 0xbf, 0x04, 0x20, 0x02, 0x20, + 0x10, 0x70, 0x10, 0xbd, 0x38, 0xb5, 0x0c, 0x46, 0x7c, 0x49, 0x51, 0xf8, + 0x20, 0x50, 0x00, 0xf0, 0x6f, 0xf8, 0x28, 0x46, 0xff, 0xf7, 0x44, 0xfe, + 0x02, 0x2c, 0x04, 0xd1, 0x01, 0x23, 0x00, 0xf0, 0x25, 0xf8, 0x00, 0x23, + 0x03, 0xe0, 0x00, 0x23, 0x00, 0xf0, 0x20, 0xf8, 0x01, 0x23, 0x02, 0x22, + 0x01, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x34, 0xfe, 0x05, 0xf1, 0x10, 0x00, + 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x07, 0x23, 0x07, 0x22, 0x00, 0x21, + 0x2a, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x9a, 0x99, 0x99, 0x3f, + 0x49, 0x92, 0x24, 0x3f, 0x00, 0xe0, 0x88, 0x45, 0x00, 0xe0, 0x6e, 0x45, + 0xae, 0x47, 0xb1, 0x40, 0xae, 0x47, 0x91, 0x40, 0xcd, 0xcc, 0xd8, 0x41, + 0x04, 0x22, 0x02, 0x21, 0x28, 0x46, 0x15, 0xe6, 0xf8, 0xb5, 0x04, 0x46, + 0x15, 0x46, 0x60, 0x48, 0x22, 0x46, 0x50, 0xf8, 0x22, 0x60, 0x01, 0x29, + 0x06, 0xf1, 0x40, 0x07, 0x04, 0xd1, 0x00, 0x23, 0x00, 0xf0, 0x2c, 0xf8, + 0x01, 0x23, 0x06, 0xe0, 0x02, 0x29, 0x0c, 0xbf, 0x01, 0x23, 0x03, 0x23, + 0x00, 0xf0, 0x24, 0xf8, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, + 0x21, 0xf8, 0x41, 0x36, 0x00, 0xf0, 0x20, 0xf8, 0x30, 0x46, 0xff, 0xf7, + 0xf5, 0xfd, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x30, 0x46, 0xff, 0xf7, + 0xef, 0xfd, 0x29, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0xf4, 0x40, 0x9b, 0xe7, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x1c, 0xeb, 0xbc, 0x01, 0x00, 0x7c, 0x42, + 0x00, 0x80, 0x0a, 0x43, 0x00, 0x20, 0x7d, 0x46, 0x00, 0x00, 0xc8, 0x42, + 0x01, 0x00, 0xf8, 0x41, 0x30, 0x22, 0x04, 0x21, 0x38, 0x46, 0xd7, 0xe5, + 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x70, 0x47, 0x1c, 0xb5, 0x0c, 0x46, + 0x6a, 0x46, 0x0d, 0xf1, 0x01, 0x01, 0xff, 0xf7, 0x60, 0xff, 0x9d, 0xf8, + 0x01, 0x00, 0x9d, 0xf8, 0x00, 0x10, 0xb4, 0xfb, 0xf0, 0xf0, 0xb0, 0xfb, + 0xf1, 0xf0, 0x16, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x0a, 0x9c, 0xdd, 0xf8, + 0x2c, 0xa0, 0x80, 0x46, 0x8b, 0x46, 0x16, 0x46, 0x1f, 0x46, 0xff, 0xf7, + 0xd3, 0xfd, 0x81, 0x46, 0x00, 0x20, 0x30, 0x60, 0x4f, 0xf0, 0xff, 0x31, + 0x39, 0x60, 0x00, 0x25, 0x29, 0xfa, 0x05, 0xf0, 0xc0, 0x07, 0x14, 0xd5, + 0xe8, 0xb2, 0xfc, 0xf7, 0xd9, 0xfc, 0x40, 0x45, 0x0f, 0xd1, 0x59, 0x46, + 0xe8, 0xb2, 0xff, 0xf7, 0xd1, 0xff, 0x32, 0x68, 0xe9, 0xb2, 0x82, 0x42, + 0x3c, 0xbf, 0x30, 0x60, 0x21, 0x60, 0x3b, 0x68, 0x98, 0x42, 0x3c, 0xbf, + 0x38, 0x60, 0xca, 0xf8, 0x00, 0x10, 0x6d, 0x1c, 0xe8, 0xb2, 0x08, 0x28, + 0xe2, 0xd1, 0xbd, 0xe8, 0xf1, 0x8f, 0x70, 0xb5, 0x04, 0x46, 0x00, 0x25, + 0x1f, 0x4e, 0x01, 0x20, 0xa8, 0x40, 0x04, 0x42, 0x05, 0xd0, 0x56, 0xf8, + 0x25, 0x00, 0xff, 0xf7, 0xaf, 0xff, 0xff, 0xf7, 0x8e, 0xfd, 0x6d, 0x1c, + 0x08, 0x2d, 0xf2, 0xd1, 0x70, 0xbd, 0x10, 0xb5, 0x00, 0x22, 0x17, 0x4b, + 0x01, 0x24, 0x94, 0x40, 0x20, 0x42, 0x05, 0xd0, 0x53, 0xf8, 0x22, 0x40, + 0x24, 0x68, 0x04, 0xf0, 0x01, 0x04, 0x8c, 0x54, 0x52, 0x1c, 0x08, 0x2a, + 0xf2, 0xd1, 0x10, 0xbd, 0xf8, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x00, 0x26, + 0x0d, 0x4f, 0x01, 0x20, 0xb0, 0x40, 0x04, 0x42, 0x06, 0xd0, 0xab, 0x5d, + 0x57, 0xf8, 0x26, 0x00, 0x01, 0x22, 0x00, 0x21, 0xff, 0xf7, 0x69, 0xfd, + 0x76, 0x1c, 0x08, 0x2e, 0xf1, 0xd1, 0xf1, 0xbd, 0x5c, 0x75, 0x02, 0x21, + 0x58, 0x75, 0x02, 0x21, 0x20, 0x99, 0x04, 0x02, 0xc0, 0x95, 0x04, 0x02, + 0x3b, 0x09, 0x00, 0x47, 0xe0, 0x99, 0x04, 0x02, 0xc0, 0x9a, 0x04, 0x02, + 0x2d, 0xe9, 0xf8, 0x43, 0x0d, 0x46, 0xf5, 0xf7, 0xe6, 0xfa, 0x00, 0x24, + 0x00, 0x28, 0x71, 0xd0, 0xdf, 0xf8, 0xd8, 0x13, 0xdf, 0xf8, 0xd8, 0x83, + 0x08, 0x78, 0xa1, 0x46, 0x00, 0x26, 0x00, 0x27, 0x48, 0xb9, 0x01, 0x22, + 0x0a, 0x70, 0x9c, 0x21, 0x40, 0x46, 0xfa, 0xf7, 0x3b, 0xf8, 0x9c, 0x21, + 0x28, 0x46, 0xfa, 0xf7, 0x79, 0xfd, 0x40, 0x46, 0x10, 0xf0, 0xa7, 0xfc, + 0x01, 0x20, 0x00, 0xf0, 0x63, 0xf9, 0x08, 0xeb, 0xc4, 0x05, 0x01, 0x22, + 0x05, 0xf1, 0x14, 0x01, 0x00, 0xf0, 0x98, 0xf8, 0x98, 0xb9, 0x02, 0x20, + 0x00, 0xf0, 0x58, 0xf9, 0x02, 0x22, 0x05, 0xf1, 0x14, 0x01, 0x00, 0xf0, + 0x8f, 0xf8, 0x50, 0xb9, 0xa9, 0x8a, 0x95, 0xed, 0x06, 0x0a, 0xea, 0x8a, + 0x89, 0x44, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x1a, 0xb6, 0x18, + 0xcf, 0x19, 0x64, 0x1c, 0x10, 0x2c, 0x01, 0xd2, 0x00, 0x28, 0xdb, 0xd0, + 0x04, 0x00, 0x08, 0xf1, 0x94, 0x05, 0x29, 0xd1, 0x4f, 0xea, 0x19, 0x10, + 0x28, 0x80, 0x36, 0x09, 0xf8, 0x10, 0x07, 0xeb, 0x10, 0x77, 0x6e, 0x80, + 0x3f, 0x11, 0xaf, 0x80, 0x00, 0x26, 0x68, 0x88, 0x10, 0xf0, 0x0c, 0xfd, + 0x28, 0x88, 0x10, 0xf0, 0xf4, 0xfc, 0xf6, 0xf7, 0x49, 0xfa, 0x05, 0x46, + 0x25, 0xfa, 0x06, 0xf0, 0xc0, 0x07, 0x06, 0xd5, 0xf0, 0xb2, 0xf6, 0xf7, + 0xdc, 0xf9, 0x01, 0x46, 0xf0, 0xb2, 0x10, 0xf0, 0x6d, 0xff, 0x76, 0x1c, + 0xf0, 0xb2, 0x08, 0x28, 0xf0, 0xdb, 0x00, 0xbf, 0xc9, 0xa2, 0x00, 0x21, + 0x03, 0x20, 0xf6, 0xf7, 0x5e, 0xfb, 0x05, 0xe0, 0x4f, 0xf4, 0x00, 0x60, + 0x28, 0x80, 0x68, 0x80, 0x00, 0x20, 0xa8, 0x80, 0x21, 0x46, 0x40, 0x46, + 0x10, 0xf0, 0x4f, 0xfc, 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0x80, 0xb5, + 0x00, 0xf0, 0x09, 0xf8, 0x00, 0xf0, 0x0f, 0xfa, 0x02, 0xbd, 0x80, 0xb5, + 0x00, 0xf0, 0x03, 0xf8, 0x00, 0xf0, 0xf4, 0xf9, 0x02, 0xbd, 0x00, 0x92, + 0x0b, 0x46, 0x02, 0x46, 0x04, 0x21, 0xb6, 0x48, 0x70, 0x47, 0x70, 0xb5, + 0x08, 0x46, 0x14, 0x46, 0x00, 0x25, 0xb2, 0x49, 0x13, 0xb1, 0x01, 0x2b, + 0x09, 0xd0, 0x0b, 0xe0, 0x14, 0x26, 0x22, 0x68, 0xb2, 0x42, 0x0a, 0xd3, + 0x32, 0x46, 0xe7, 0xf7, 0xe9, 0xfd, 0x26, 0x60, 0x07, 0xe0, 0x94, 0x31, + 0x08, 0x26, 0xf4, 0xe7, 0x4f, 0xf6, 0x2a, 0x75, 0x01, 0xe0, 0x4f, 0xf6, + 0x26, 0x75, 0x28, 0x46, 0x70, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x00, 0x24, + 0x01, 0x29, 0x01, 0xd1, 0xab, 0xa2, 0x02, 0xe0, 0x4f, 0xf6, 0x27, 0x74, + 0xb0, 0xa2, 0x00, 0x21, 0x03, 0x20, 0xf6, 0xf7, 0x14, 0xfb, 0x20, 0x46, + 0x10, 0xbd, 0x10, 0xf0, 0x9d, 0xbc, 0x10, 0xf0, 0xb0, 0xbc, 0x00, 0x00, + 0x2d, 0xe9, 0xf0, 0x41, 0x2d, 0xed, 0x04, 0x8b, 0x82, 0xb0, 0x80, 0x46, + 0x0d, 0x46, 0x17, 0x46, 0x10, 0xf0, 0x3f, 0xfc, 0x01, 0x20, 0x10, 0xf0, + 0x38, 0xfc, 0x00, 0x20, 0x10, 0xf0, 0x24, 0xfc, 0x06, 0x20, 0x00, 0xf0, + 0xc7, 0xfc, 0x38, 0x46, 0x10, 0xf0, 0x38, 0xfc, 0x00, 0x24, 0x00, 0x26, + 0x06, 0x20, 0x00, 0xf0, 0xbf, 0xfc, 0x38, 0x46, 0x10, 0xf0, 0x46, 0xfc, + 0x01, 0x28, 0x04, 0xd0, 0x76, 0x1c, 0xb6, 0xf5, 0xfa, 0x6f, 0xf3, 0xd3, + 0x01, 0x24, 0x00, 0x2c, 0x9f, 0xed, 0x80, 0x8a, 0xf6, 0xee, 0x00, 0x8a, + 0x40, 0xd1, 0xb8, 0x07, 0x40, 0xd5, 0x10, 0xf0, 0x52, 0xfc, 0x00, 0xee, + 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x9a, 0x10, 0xf0, 0x4e, 0xfc, 0x00, 0xee, + 0x10, 0x0a, 0x82, 0x48, 0x02, 0x68, 0x11, 0x69, 0x4f, 0xf4, 0x7a, 0x70, + 0xb8, 0xee, 0x40, 0x0a, 0x41, 0x43, 0x39, 0xee, 0x00, 0x0a, 0x00, 0xee, + 0x90, 0x1a, 0x01, 0x21, 0x01, 0xfa, 0x08, 0xf8, 0x01, 0xee, 0x10, 0x8a, + 0xbf, 0xee, 0x08, 0x2a, 0xf8, 0xee, 0x60, 0x0a, 0xb8, 0xee, 0xc1, 0x1a, + 0x00, 0xee, 0x28, 0x2a, 0xc0, 0xee, 0x81, 0x0a, 0xdf, 0xed, 0x6b, 0x1a, + 0x9f, 0xed, 0x6b, 0x0a, 0x60, 0xee, 0xa1, 0x1a, 0x00, 0xee, 0xc0, 0x2a, + 0x81, 0xee, 0x82, 0x9a, 0x29, 0xee, 0x08, 0x0a, 0xf4, 0xf7, 0xca, 0xfe, + 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x28, 0x80, 0xb0, 0xee, + 0x49, 0x0a, 0x02, 0x21, 0x28, 0x46, 0x00, 0xf0, 0x77, 0xf8, 0x04, 0x46, + 0x00, 0x2c, 0x49, 0xd1, 0xf8, 0x07, 0x26, 0xd5, 0x10, 0xf0, 0x03, 0xfc, + 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x9a, 0x10, 0xf0, 0x03, 0xfc, + 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x39, 0xee, 0x00, 0x0a, + 0xf6, 0xee, 0x00, 0x0a, 0x40, 0xee, 0x28, 0x0a, 0x9f, 0xed, 0x55, 0x0a, + 0xc0, 0xee, 0x80, 0x8a, 0x28, 0xee, 0x88, 0x0a, 0xf4, 0xf7, 0xa0, 0xfe, + 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x68, 0x80, 0xb0, 0xee, + 0x68, 0x0a, 0x01, 0x21, 0xa8, 0x1c, 0x00, 0xf0, 0x4d, 0xf8, 0x04, 0x46, + 0x04, 0xbb, 0x04, 0x20, 0xf5, 0xf7, 0xae, 0xfe, 0x01, 0x28, 0x02, 0xd1, + 0x29, 0x1d, 0x04, 0x20, 0x06, 0xe0, 0x0a, 0x20, 0xf5, 0xf7, 0xa6, 0xfe, + 0x01, 0x28, 0x05, 0xd1, 0x29, 0x1d, 0x0a, 0x20, 0xe7, 0xf7, 0xee, 0xfc, + 0x04, 0x46, 0x0d, 0xe0, 0x69, 0x46, 0x40, 0xf6, 0xff, 0x70, 0xe7, 0xf7, + 0x0c, 0xfc, 0x04, 0x46, 0xbd, 0xf9, 0x00, 0x00, 0x00, 0xee, 0x10, 0x0a, + 0xb8, 0xee, 0xc0, 0x0a, 0x85, 0xed, 0x01, 0x0a, 0x01, 0x20, 0x10, 0xf0, + 0x79, 0xfb, 0x00, 0x20, 0x10, 0xf0, 0x87, 0xfb, 0x02, 0xb0, 0x20, 0x46, + 0xbd, 0xec, 0x04, 0x8b, 0xbd, 0xe8, 0xf0, 0x81, 0x80, 0xb5, 0x3b, 0x49, + 0x09, 0x68, 0xc0, 0x07, 0x08, 0x69, 0x4f, 0xf4, 0x7a, 0x72, 0x02, 0xfb, + 0x00, 0xf2, 0x00, 0xee, 0x10, 0x2a, 0xb8, 0xee, 0x40, 0x0a, 0x4c, 0xbf, + 0xdf, 0xed, 0x2e, 0x0a, 0xdf, 0xed, 0x2e, 0x0a, 0x80, 0xee, 0x20, 0x0a, + 0x05, 0xf0, 0x72, 0xfa, 0xbc, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, + 0x08, 0xf0, 0x51, 0xff, 0xc0, 0xb2, 0x02, 0xbd, 0x30, 0xb5, 0x02, 0x46, + 0x00, 0x20, 0x8c, 0x07, 0x29, 0x4b, 0x0d, 0xd5, 0x1d, 0x78, 0x00, 0xee, + 0x90, 0x5a, 0x00, 0xf0, 0x2b, 0xf8, 0x05, 0xd4, 0x5c, 0x78, 0x00, 0xee, + 0x90, 0x4a, 0x00, 0xf0, 0x15, 0xf8, 0x01, 0xd5, 0x10, 0x80, 0x02, 0x20, + 0xc9, 0x07, 0x0e, 0xd5, 0x9c, 0x78, 0x00, 0xee, 0x90, 0x4a, 0x00, 0xf0, + 0x1b, 0xf8, 0x05, 0xd4, 0xd9, 0x78, 0x00, 0xee, 0x90, 0x1a, 0x00, 0xf0, + 0x05, 0xf8, 0x02, 0xd5, 0x00, 0x20, 0x10, 0x80, 0x02, 0x20, 0x30, 0xbd, + 0xf8, 0xee, 0x60, 0x0a, 0x9f, 0xed, 0x14, 0x1a, 0x80, 0xee, 0x81, 0x1a, + 0xf7, 0xee, 0x00, 0x1a, 0x71, 0xee, 0xc1, 0x1a, 0xb4, 0xee, 0x61, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x70, 0x47, 0x00, 0x00, 0xf8, 0xee, 0x60, 0x0a, + 0x9f, 0xed, 0x0c, 0x1a, 0x80, 0xee, 0x81, 0x1a, 0xf7, 0xee, 0x00, 0x1a, + 0x71, 0xee, 0x21, 0x1a, 0xf4, 0xee, 0x40, 0x1a, 0xf1, 0xee, 0x10, 0xfa, + 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x06, 0x68, 0x53, 0x35, + 0xfe, 0x2f, 0x01, 0x33, 0x66, 0x66, 0x78, 0x43, 0x28, 0x6b, 0x6e, 0x4d, + 0x28, 0x6b, 0xee, 0x4d, 0x00, 0x00, 0xc8, 0x42, 0x42, 0x76, 0x02, 0x21, + 0x0c, 0x67, 0x02, 0x21, 0xa8, 0x55, 0x00, 0x21, 0x5c, 0x75, 0x02, 0x21, + 0x52, 0x63, 0x54, 0x75, 0x6e, 0x65, 0x72, 0x43, 0x61, 0x6c, 0x20, 0x44, + 0x6f, 0x6e, 0x65, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x52, 0x63, 0x54, 0x75, + 0x6e, 0x65, 0x72, 0x20, 0x43, 0x74, 0x72, 0x6c, 0x20, 0x2d, 0x20, 0x74, + 0x65, 0x73, 0x74, 0x20, 0x63, 0x6d, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x52, 0x63, 0x54, 0x75, 0x6e, 0x65, 0x72, 0x20, 0x43, 0x74, 0x72, 0x6c, + 0x20, 0x2d, 0x20, 0x62, 0x61, 0x64, 0x20, 0x63, 0x6d, 0x64, 0x0a, 0x00, + 0x04, 0xf0, 0x29, 0xba, 0x70, 0xb5, 0x14, 0x48, 0x14, 0x49, 0x00, 0x68, + 0xb0, 0xfb, 0xf1, 0xf4, 0x4f, 0xf4, 0x7a, 0x72, 0xb0, 0xfb, 0xf2, 0xf5, + 0x04, 0xf0, 0x58, 0xfc, 0x6d, 0x1e, 0x02, 0x28, 0x01, 0xd0, 0x00, 0xf0, + 0x2d, 0xf8, 0xef, 0xf3, 0x10, 0x86, 0x01, 0x20, 0x80, 0xf3, 0x10, 0x88, + 0x04, 0xf0, 0x11, 0xfa, 0x0a, 0x49, 0x0b, 0x4a, 0x09, 0x68, 0x12, 0x68, + 0x86, 0xf3, 0x10, 0x88, 0x52, 0x01, 0x44, 0xbf, 0x40, 0x1c, 0x29, 0x46, + 0x6d, 0x1a, 0x4f, 0xf4, 0x7a, 0x72, 0xb5, 0xfb, 0xf4, 0xf1, 0x02, 0xfb, + 0x00, 0x10, 0x70, 0xbd, 0x1c, 0x76, 0x02, 0x21, 0x40, 0x42, 0x0f, 0x00, + 0x18, 0xe0, 0x00, 0xe0, 0x04, 0xed, 0x00, 0xe0, 0x10, 0xb5, 0x04, 0x46, + 0x04, 0xf0, 0x2e, 0xfc, 0x02, 0x28, 0x01, 0xd0, 0x00, 0xf0, 0x04, 0xf8, + 0x04, 0xf0, 0xed, 0xf9, 0x00, 0x1b, 0x10, 0xbd, 0x03, 0x22, 0x4f, 0xf6, + 0x59, 0x71, 0x01, 0x20, 0x03, 0xf0, 0xdc, 0xbc, 0x88, 0x42, 0x01, 0xd2, + 0x08, 0x1a, 0x70, 0x47, 0x4f, 0xf0, 0xff, 0x32, 0x10, 0x1a, 0x08, 0x18, + 0x70, 0x47, 0x38, 0xb5, 0x04, 0x46, 0x08, 0x46, 0xff, 0xf7, 0xe0, 0xff, + 0x00, 0x25, 0x84, 0x42, 0x38, 0xbf, 0x01, 0x25, 0x28, 0x46, 0x32, 0xbd, + 0x38, 0xb5, 0x00, 0x24, 0x99, 0x42, 0x15, 0x46, 0x38, 0xbf, 0x4f, 0xf6, + 0x2d, 0x74, 0x5a, 0x19, 0x91, 0x42, 0x38, 0xbf, 0x4f, 0xf6, 0x2e, 0x74, + 0x05, 0xd3, 0x24, 0xb9, 0x41, 0x19, 0x04, 0x98, 0x1a, 0x46, 0xe7, 0xf7, + 0xf9, 0xfb, 0x20, 0x46, 0x32, 0xbd, 0x38, 0xb5, 0x00, 0x24, 0x99, 0x42, + 0x15, 0x46, 0x38, 0xbf, 0x4f, 0xf6, 0x2d, 0x74, 0x5a, 0x19, 0x91, 0x42, + 0x38, 0xbf, 0x4f, 0xf6, 0x2e, 0x74, 0x05, 0xd3, 0x24, 0xb9, 0x04, 0x99, + 0x1a, 0x46, 0x28, 0x44, 0xe7, 0xf7, 0xe4, 0xfb, 0x20, 0x46, 0x32, 0xbd, + 0x80, 0xb5, 0x01, 0x20, 0xf5, 0xf7, 0xa1, 0xf8, 0x16, 0xa2, 0xff, 0x21, + 0x03, 0x20, 0xf6, 0xf7, 0x1e, 0xf9, 0x11, 0xf0, 0x01, 0xf8, 0x08, 0x48, + 0x08, 0x4a, 0x01, 0x6b, 0x11, 0x60, 0x03, 0x20, 0x15, 0xa2, 0xff, 0x21, + 0xf6, 0xf7, 0x13, 0xf9, 0x04, 0xf0, 0xfe, 0xf8, 0x00, 0x20, 0x12, 0xf0, + 0x4b, 0xff, 0x30, 0xbf, 0xfd, 0xe7, 0x00, 0x00, 0x24, 0x73, 0x03, 0x21, + 0x1c, 0x76, 0x02, 0x21, 0x70, 0xb5, 0x04, 0x00, 0x0d, 0x46, 0x16, 0x46, + 0x0b, 0xd0, 0xf5, 0xf7, 0x46, 0xf8, 0x29, 0x46, 0x03, 0xf0, 0xb1, 0xfc, + 0x32, 0x46, 0x21, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x01, 0x20, 0x03, 0xf0, + 0x6d, 0xbc, 0x70, 0xbd, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, + 0x6e, 0x67, 0x20, 0x4d, 0x41, 0x49, 0x4e, 0x28, 0x29, 0x0a, 0x00, 0x00, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x52, 0x54, 0x4f, + 0x53, 0x0a, 0x00, 0x00, 0x38, 0xb5, 0x04, 0x46, 0x00, 0x25, 0x29, 0x46, + 0x20, 0x46, 0x00, 0xf0, 0x05, 0xf8, 0x6d, 0x1c, 0x8a, 0x2d, 0xf8, 0xd3, + 0x00, 0x20, 0x32, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, 0x07, 0x46, 0x08, 0x46, + 0x9f, 0x49, 0x00, 0xeb, 0x80, 0x03, 0xcc, 0x18, 0x01, 0x25, 0x26, 0x78, + 0x16, 0xf0, 0x03, 0x02, 0x1c, 0xbf, 0x00, 0x21, 0x00, 0xf0, 0xe9, 0xf8, + 0x00, 0x2f, 0x4d, 0xd0, 0xf0, 0x06, 0x4b, 0xd5, 0x06, 0xf0, 0x03, 0x01, + 0x01, 0x29, 0x08, 0xbf, 0x08, 0x25, 0x04, 0xd0, 0x06, 0xf0, 0x03, 0x00, + 0x02, 0x28, 0x08, 0xbf, 0x02, 0x25, 0xa7, 0x78, 0x94, 0xf8, 0x01, 0x80, + 0x39, 0x46, 0x28, 0x46, 0x00, 0xf0, 0x45, 0xf9, 0x04, 0x46, 0x01, 0x20, + 0x00, 0xfa, 0x05, 0xf5, 0x6d, 0x1e, 0xbd, 0x40, 0x77, 0x09, 0x07, 0xf0, + 0x01, 0x07, 0x3a, 0x46, 0x29, 0x46, 0x00, 0xfa, 0x04, 0xf4, 0x89, 0x48, + 0x00, 0xeb, 0x88, 0x09, 0x48, 0x46, 0x00, 0xf0, 0x29, 0xf9, 0x64, 0x1e, + 0x0c, 0xb1, 0x00, 0xf0, 0x26, 0xf8, 0x06, 0xf0, 0x0c, 0x00, 0x04, 0x28, + 0x83, 0x48, 0x0c, 0xbf, 0x01, 0x27, 0x00, 0x27, 0x00, 0xeb, 0x88, 0x09, + 0x3a, 0x46, 0x29, 0x46, 0x48, 0x46, 0x00, 0xf0, 0x17, 0xf9, 0x0c, 0xb1, + 0x00, 0xf0, 0x15, 0xf8, 0x06, 0xf0, 0x0c, 0x06, 0x76, 0x1e, 0x7c, 0x48, + 0xb6, 0x41, 0x00, 0xeb, 0x88, 0x07, 0xf2, 0x0f, 0x29, 0x46, 0x38, 0x46, + 0x00, 0xf0, 0x08, 0xf9, 0x24, 0xb1, 0xf2, 0x0f, 0x21, 0x46, 0x38, 0x1d, + 0x00, 0xf0, 0x02, 0xf9, 0x00, 0x20, 0xbd, 0xe8, 0xf2, 0x83, 0x3a, 0x46, + 0x21, 0x46, 0x09, 0xf1, 0x04, 0x00, 0xf9, 0xe0, 0x00, 0x28, 0x07, 0xd4, + 0x01, 0x22, 0x00, 0xf0, 0x1f, 0x01, 0x6f, 0x4b, 0x8a, 0x40, 0x40, 0x09, + 0x43, 0xf8, 0x20, 0x20, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x41, 0x00, 0x21, + 0x8a, 0x28, 0x3d, 0xd2, 0x65, 0x4a, 0x00, 0xeb, 0x80, 0x03, 0xd7, 0x18, + 0x3a, 0x78, 0xd6, 0x06, 0x36, 0xd5, 0x02, 0xf0, 0x03, 0x01, 0x01, 0x29, + 0x08, 0xbf, 0x08, 0x25, 0x04, 0xd0, 0x02, 0xf0, 0x03, 0x02, 0x02, 0x2a, + 0x04, 0xd1, 0x02, 0x25, 0x00, 0xf0, 0x98, 0xf8, 0x06, 0x46, 0x01, 0xe0, + 0x01, 0x25, 0x01, 0x26, 0x97, 0xf8, 0x01, 0x80, 0xbf, 0x78, 0x39, 0x46, + 0x28, 0x46, 0x00, 0xf0, 0xd4, 0xf8, 0x01, 0x23, 0x5a, 0x4a, 0x52, 0xf8, + 0x28, 0x10, 0x03, 0xfa, 0x05, 0xfc, 0xac, 0xf1, 0x01, 0x0c, 0x0c, 0xea, + 0x06, 0x0c, 0x0c, 0xfa, 0x07, 0xfc, 0x0c, 0xea, 0x01, 0x01, 0x42, 0xf8, + 0x28, 0x10, 0x2d, 0x1a, 0x40, 0xb1, 0x02, 0xeb, 0x88, 0x02, 0xee, 0x40, + 0x54, 0x68, 0x83, 0x40, 0x34, 0x40, 0x5b, 0x1e, 0x1c, 0x40, 0x54, 0x60, + 0xf9, 0x40, 0x08, 0xb1, 0xac, 0x40, 0x21, 0x43, 0x08, 0x46, 0xbd, 0xe8, + 0xf0, 0x81, 0x00, 0x28, 0x07, 0xd4, 0x01, 0x22, 0x00, 0xf0, 0x1f, 0x01, + 0x48, 0x4b, 0x8a, 0x40, 0x40, 0x09, 0x43, 0xf8, 0x20, 0x20, 0x70, 0x47, + 0x00, 0x28, 0x0b, 0xd4, 0x01, 0x22, 0x00, 0xf0, 0x1f, 0x01, 0x44, 0x4b, + 0x8a, 0x40, 0x40, 0x09, 0x43, 0xf8, 0x20, 0x20, 0xbf, 0xf3, 0x4f, 0x8f, + 0xbf, 0xf3, 0x6f, 0x8f, 0x70, 0x47, 0x09, 0x01, 0x00, 0x28, 0x02, 0xd4, + 0x3e, 0x4a, 0x11, 0x54, 0x70, 0x47, 0x3e, 0x4b, 0x00, 0xf0, 0x0f, 0x00, + 0x18, 0x44, 0x00, 0xf8, 0x04, 0x1c, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x01, + 0x04, 0xf0, 0xff, 0x04, 0x20, 0x00, 0x18, 0xbf, 0x01, 0x20, 0x12, 0xf0, + 0x2b, 0xfe, 0xef, 0xf3, 0x10, 0x81, 0x72, 0xb6, 0xef, 0xf3, 0x11, 0x80, + 0x08, 0xb1, 0x84, 0x42, 0x01, 0xd2, 0x84, 0xf3, 0x11, 0x88, 0x81, 0xf3, + 0x10, 0x88, 0x10, 0xbd, 0x80, 0xf3, 0x11, 0x88, 0x70, 0x47, 0x70, 0xb5, + 0x8a, 0x28, 0x0c, 0x46, 0x25, 0xd2, 0x00, 0xeb, 0x80, 0x05, 0x22, 0x4e, + 0x70, 0x5d, 0x10, 0xf0, 0x03, 0x0f, 0x1e, 0xd0, 0xf4, 0xf7, 0x17, 0xff, + 0x00, 0x28, 0x0c, 0xbf, 0x27, 0x49, 0x28, 0x49, 0x72, 0x5d, 0x70, 0x19, + 0x02, 0xf0, 0x03, 0x02, 0xc0, 0x78, 0x02, 0x2a, 0x0c, 0xbf, 0x04, 0xf0, + 0x03, 0x04, 0x04, 0xf0, 0xff, 0x04, 0xef, 0xf3, 0x10, 0x82, 0x01, 0x23, + 0x83, 0xf3, 0x10, 0x88, 0x51, 0xf8, 0x20, 0x50, 0x2d, 0x0a, 0x44, 0xea, + 0x05, 0x24, 0x41, 0xf8, 0x20, 0x40, 0x82, 0xf3, 0x10, 0x88, 0x70, 0xbd, + 0x38, 0xb5, 0x04, 0x46, 0x00, 0x20, 0x8a, 0x2c, 0x18, 0xd2, 0x04, 0xeb, + 0x84, 0x04, 0x0c, 0x4d, 0x29, 0x5d, 0x11, 0xf0, 0x03, 0x0f, 0x11, 0xd0, + 0xf4, 0xf7, 0xeb, 0xfe, 0x00, 0x28, 0x0c, 0xbf, 0x11, 0x48, 0x12, 0x48, + 0x29, 0x19, 0x2a, 0x5d, 0xc9, 0x78, 0x50, 0xf8, 0x21, 0x00, 0x02, 0xf0, + 0x03, 0x02, 0x02, 0x2a, 0x0c, 0xbf, 0x03, 0x22, 0xff, 0x22, 0x10, 0x40, + 0x32, 0xbd, 0x00, 0x00, 0x24, 0x44, 0x00, 0x21, 0x4c, 0x00, 0x80, 0x46, + 0x98, 0x00, 0x80, 0x46, 0xe4, 0x00, 0x80, 0x46, 0x80, 0xe2, 0x00, 0xe0, + 0x7c, 0x01, 0x80, 0x46, 0x00, 0xe1, 0x00, 0xe0, 0x80, 0xe1, 0x00, 0xe0, + 0x00, 0xe4, 0x00, 0xe0, 0x18, 0xed, 0x00, 0xe0, 0x00, 0x00, 0x20, 0x41, + 0x00, 0x00, 0x20, 0x44, 0xef, 0xf3, 0x05, 0x80, 0x00, 0xb1, 0x01, 0x20, + 0xc0, 0xb2, 0x70, 0x47, 0x01, 0x2a, 0x07, 0xbf, 0x02, 0x68, 0x22, 0xea, + 0x01, 0x01, 0x03, 0x68, 0x19, 0x43, 0x01, 0x60, 0x70, 0x47, 0x02, 0x46, + 0x00, 0x20, 0xc1, 0xf1, 0x20, 0x01, 0x91, 0x42, 0x38, 0xbf, 0x50, 0x1a, + 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x12, 0x48, 0x01, 0x68, 0x41, 0xf0, + 0x80, 0x71, 0x01, 0x60, 0x10, 0x48, 0x11, 0x49, 0x02, 0x68, 0x00, 0x92, + 0x00, 0x9a, 0x12, 0xf0, 0x70, 0x4f, 0x0b, 0xd0, 0x00, 0x9a, 0x93, 0x01, + 0x08, 0xd4, 0x00, 0x22, 0x42, 0x60, 0x01, 0x22, 0x03, 0x68, 0x43, 0xf0, + 0x01, 0x03, 0x03, 0x60, 0x0a, 0x70, 0x03, 0xe0, 0x08, 0x78, 0x08, 0xb9, + 0x00, 0xf0, 0x02, 0xf8, 0x00, 0x20, 0x02, 0xbd, 0x03, 0x22, 0x4b, 0xf2, + 0x01, 0x51, 0x01, 0x20, 0x03, 0xf0, 0xb4, 0xba, 0xfc, 0xed, 0x00, 0xe0, + 0x00, 0x10, 0x00, 0xe0, 0x3c, 0x76, 0x02, 0x21, 0xba, 0x48, 0x00, 0x6b, + 0x70, 0x47, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, + 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, + 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x38, 0xb5, 0x04, 0x01, 0xb2, 0x4d, + 0x28, 0x5d, 0x08, 0xb1, 0x00, 0xf0, 0x5e, 0xf8, 0x01, 0x21, 0x29, 0x55, + 0x31, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, 0x00, 0xf0, 0x52, 0xf8, 0x1e, 0x46, + 0x2b, 0x78, 0x01, 0x2b, 0x88, 0x46, 0x17, 0x46, 0x01, 0xd0, 0x00, 0xf0, + 0x4f, 0xf8, 0xa9, 0x48, 0xa9, 0x4a, 0x6f, 0x70, 0x80, 0x45, 0x88, 0xbf, + 0x80, 0x46, 0xa4, 0x48, 0x01, 0x6b, 0xa1, 0xfb, 0x08, 0x01, 0x00, 0x23, + 0xfa, 0xf7, 0xf0, 0xf8, 0xa9, 0x68, 0x08, 0x60, 0x02, 0x21, 0xa8, 0x68, + 0x40, 0xf8, 0x0c, 0x1f, 0xff, 0x00, 0xa8, 0x68, 0x47, 0xf0, 0x60, 0x07, + 0x40, 0xf8, 0x08, 0x7f, 0x20, 0x46, 0x00, 0xf0, 0x57, 0xf8, 0x01, 0x2e, + 0x04, 0xbf, 0x20, 0x46, 0x00, 0xf0, 0x58, 0xf8, 0x00, 0xf0, 0x21, 0xf8, + 0x02, 0x20, 0x28, 0x70, 0xbd, 0xe8, 0xf0, 0x81, 0x38, 0xb5, 0x00, 0xf0, + 0x20, 0xf8, 0x2b, 0x78, 0x01, 0x2b, 0x01, 0xd0, 0x00, 0xf0, 0x20, 0xf8, + 0x00, 0x21, 0x69, 0x70, 0x00, 0x20, 0xa9, 0x68, 0x08, 0x60, 0x02, 0x22, + 0xa8, 0x68, 0x40, 0xf8, 0x0c, 0x2f, 0x64, 0x21, 0xa8, 0x68, 0x40, 0xf8, + 0x08, 0x1f, 0x20, 0x46, 0x00, 0xf0, 0x34, 0xf8, 0x00, 0xf0, 0x03, 0xf8, + 0x02, 0x20, 0x28, 0x70, 0x31, 0xbd, 0xa8, 0x68, 0x01, 0x23, 0x10, 0x22, + 0x04, 0x21, 0x08, 0x30, 0x91, 0xe7, 0x04, 0x46, 0x82, 0x48, 0x00, 0xeb, + 0x04, 0x15, 0x70, 0x47, 0x03, 0x22, 0x4f, 0xf6, 0x01, 0x71, 0x01, 0x20, + 0x03, 0xf0, 0x32, 0xba, 0x70, 0xb5, 0xff, 0xf7, 0xf2, 0xff, 0x00, 0x22, + 0xa8, 0x68, 0x01, 0x1d, 0x0e, 0x68, 0x40, 0xf8, 0x08, 0x2f, 0x68, 0x68, + 0xff, 0xf7, 0x9c, 0xfe, 0x20, 0x46, 0x00, 0xf0, 0x0f, 0xf8, 0x01, 0x20, + 0x28, 0x70, 0x30, 0x46, 0x70, 0xbd, 0x38, 0xb5, 0x04, 0x01, 0x73, 0x4d, + 0x29, 0x5d, 0x01, 0x29, 0x18, 0xbf, 0xff, 0xf7, 0xe5, 0xff, 0x00, 0x20, + 0x28, 0x55, 0x31, 0xbd, 0x6e, 0x49, 0x01, 0xeb, 0x00, 0x12, 0x50, 0x68, + 0xff, 0xf7, 0x28, 0xbe, 0x6b, 0x49, 0x01, 0xeb, 0x00, 0x12, 0x50, 0x68, + 0xff, 0xf7, 0x73, 0xbe, 0x68, 0x49, 0x01, 0xeb, 0x00, 0x12, 0x50, 0x68, + 0xff, 0xf7, 0x78, 0xbe, 0x80, 0xb5, 0x06, 0x21, 0x0f, 0x20, 0xff, 0xf7, + 0x82, 0xfe, 0x06, 0x21, 0x10, 0x20, 0xff, 0xf7, 0x7e, 0xfe, 0x06, 0x21, + 0x11, 0x20, 0xff, 0xf7, 0x7a, 0xfe, 0x06, 0x21, 0x12, 0x20, 0xff, 0xf7, + 0x76, 0xfe, 0x06, 0x21, 0x13, 0x20, 0xff, 0xf7, 0x72, 0xfe, 0x06, 0x21, + 0x14, 0x20, 0xff, 0xf7, 0x6e, 0xfe, 0x06, 0x21, 0x15, 0x20, 0xff, 0xf7, + 0x6a, 0xfe, 0x06, 0x21, 0x16, 0x20, 0xff, 0xf7, 0x66, 0xfe, 0x06, 0x21, + 0x17, 0x20, 0xff, 0xf7, 0x62, 0xfe, 0x06, 0x21, 0x18, 0x20, 0xff, 0xf7, + 0x5e, 0xfe, 0x06, 0x21, 0x19, 0x20, 0xff, 0xf7, 0x5a, 0xfe, 0x06, 0x21, + 0x1a, 0x20, 0xff, 0xf7, 0x56, 0xfe, 0x06, 0x21, 0x1b, 0x20, 0xff, 0xf7, + 0x52, 0xfe, 0x06, 0x21, 0x1c, 0x20, 0xff, 0xf7, 0x4e, 0xfe, 0x06, 0x21, + 0x1d, 0x20, 0xff, 0xf7, 0x4a, 0xfe, 0xbd, 0xe8, 0x04, 0x40, 0x06, 0x21, + 0x1e, 0x20, 0xff, 0xf7, 0x44, 0xbe, 0x44, 0x49, 0x01, 0xeb, 0x00, 0x10, + 0x82, 0x68, 0x52, 0xf8, 0x14, 0x0f, 0x00, 0xf0, 0x01, 0x00, 0x70, 0x47, + 0x3f, 0x49, 0x01, 0xeb, 0x00, 0x10, 0x82, 0x68, 0x52, 0xf8, 0x04, 0x0f, + 0x70, 0x47, 0x3c, 0x4a, 0x02, 0xeb, 0x00, 0x10, 0xc1, 0x60, 0x70, 0x47, + 0x38, 0xb5, 0x04, 0x00, 0x00, 0x25, 0xff, 0xf7, 0xf7, 0xfe, 0x39, 0x49, + 0xb0, 0xfb, 0xf1, 0xf0, 0x00, 0xfb, 0x04, 0xf0, 0x06, 0x21, 0xb0, 0xfb, + 0xf1, 0xf1, 0x00, 0x20, 0x88, 0x42, 0x02, 0xd2, 0x00, 0xbf, 0x40, 0x1c, + 0xfa, 0xe7, 0x31, 0xbd, 0x38, 0xb5, 0x04, 0x46, 0x2e, 0x49, 0x01, 0xeb, + 0x04, 0x15, 0x68, 0x68, 0xff, 0xf7, 0xb3, 0xfd, 0x68, 0x78, 0x10, 0xb9, + 0x20, 0x46, 0xff, 0xf7, 0x81, 0xff, 0xe8, 0x68, 0x10, 0xb1, 0xbd, 0xe8, + 0x32, 0x40, 0x00, 0x47, 0x31, 0xbd, 0x00, 0x20, 0xea, 0xe7, 0x01, 0x20, + 0xe8, 0xe7, 0x02, 0x20, 0xe6, 0xe7, 0x03, 0x20, 0xe4, 0xe7, 0x04, 0x20, + 0xe2, 0xe7, 0x05, 0x20, 0xe0, 0xe7, 0x06, 0x20, 0xde, 0xe7, 0x07, 0x20, + 0xdc, 0xe7, 0x08, 0x20, 0xda, 0xe7, 0x09, 0x20, 0xd8, 0xe7, 0x0a, 0x20, + 0xd6, 0xe7, 0x0b, 0x20, 0xd4, 0xe7, 0x0c, 0x20, 0xd2, 0xe7, 0x0d, 0x20, + 0xd0, 0xe7, 0x0e, 0x20, 0xce, 0xe7, 0x0f, 0x20, 0xcc, 0xe7, 0x70, 0xb5, + 0x18, 0x4c, 0xa5, 0x68, 0x0f, 0x20, 0xff, 0xf7, 0xc0, 0xfe, 0x21, 0x78, + 0x01, 0x29, 0x01, 0xd0, 0xff, 0xf7, 0x20, 0xff, 0x01, 0x20, 0x60, 0x70, + 0x00, 0x21, 0x05, 0xf1, 0x0c, 0x00, 0x29, 0x60, 0x02, 0x22, 0x05, 0xf1, + 0x08, 0x06, 0x02, 0x60, 0x6e, 0x21, 0x31, 0x60, 0x0f, 0x20, 0xff, 0xf7, + 0x35, 0xff, 0x01, 0x23, 0x10, 0x22, 0x04, 0x21, 0x30, 0x46, 0xff, 0xf7, + 0x98, 0xfe, 0x02, 0x20, 0x09, 0x49, 0x20, 0x70, 0x2d, 0x1d, 0x0d, 0x60, + 0x70, 0xbd, 0x07, 0x48, 0x01, 0x68, 0x08, 0x68, 0x70, 0x47, 0x00, 0x00, + 0x24, 0x73, 0x03, 0x21, 0x14, 0x41, 0x00, 0x21, 0x00, 0x12, 0x7a, 0x00, + 0x40, 0x42, 0x0f, 0x00, 0x04, 0x42, 0x00, 0x21, 0x10, 0x76, 0x02, 0x21, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, + 0x0d, 0xf8, 0x01, 0x70, 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, + 0x72, 0xb6, 0x05, 0x68, 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, + 0x29, 0x43, 0x70, 0x47, 0xf8, 0xb5, 0x8a, 0x4c, 0x8a, 0x4d, 0xa0, 0x78, + 0x8a, 0x4e, 0x85, 0xf8, 0x50, 0x00, 0x00, 0x27, 0xe8, 0x19, 0x31, 0x78, + 0x01, 0x70, 0x01, 0x23, 0x72, 0x78, 0x02, 0x74, 0x08, 0x22, 0xb1, 0x78, + 0x80, 0xf8, 0x20, 0x10, 0x7f, 0x1c, 0xf1, 0x78, 0x00, 0xf8, 0x30, 0x1f, + 0x31, 0x79, 0x01, 0x74, 0x20, 0x46, 0x03, 0x21, 0xff, 0xf7, 0xca, 0xff, + 0x00, 0x23, 0x08, 0x22, 0x03, 0x21, 0x00, 0xf0, 0xe0, 0xf8, 0x10, 0x2f, + 0xe4, 0xd1, 0xf1, 0xbd, 0x00, 0x28, 0x00, 0xd1, 0x70, 0x47, 0x10, 0xb5, + 0x02, 0x23, 0x3f, 0x22, 0x00, 0x21, 0x78, 0x48, 0x78, 0x4c, 0xff, 0xf7, + 0xb7, 0xff, 0x02, 0x23, 0x3f, 0x22, 0x00, 0x21, 0x76, 0x48, 0xff, 0xf7, + 0xb1, 0xff, 0x08, 0x23, 0x3f, 0x22, 0x00, 0x21, 0x74, 0x48, 0xff, 0xf7, + 0xab, 0xff, 0x03, 0x23, 0x4f, 0xf4, 0x70, 0x12, 0x12, 0x21, 0x00, 0xf0, + 0x16, 0xf8, 0x0a, 0x23, 0x4f, 0xf4, 0x7c, 0x32, 0x0c, 0x21, 0x00, 0xf0, + 0x10, 0xf8, 0x0a, 0x23, 0x4f, 0xf4, 0x7c, 0x62, 0x06, 0x21, 0x00, 0xf0, + 0x0a, 0xf8, 0x0c, 0x23, 0x3f, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x05, 0xf8, + 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x20, 0x08, 0xf0, 0x69, 0xbb, 0x20, 0x46, + 0x95, 0xe7, 0x00, 0x28, 0x00, 0xd1, 0x70, 0x47, 0xf8, 0xb5, 0x00, 0x24, + 0x62, 0x4d, 0x55, 0xf8, 0x24, 0x60, 0x30, 0x36, 0x05, 0x23, 0x4f, 0xf0, + 0x70, 0x62, 0x18, 0x21, 0x00, 0xf0, 0x8b, 0xf8, 0x05, 0x23, 0x4f, 0xf4, + 0x7c, 0x12, 0x10, 0x21, 0x00, 0xf0, 0x85, 0xf8, 0x05, 0x23, 0x4f, 0xf4, + 0x7c, 0x52, 0x08, 0x21, 0x00, 0xf0, 0x7f, 0xf8, 0x0a, 0x23, 0x3f, 0x22, + 0x00, 0x21, 0x00, 0xf0, 0x7a, 0xf8, 0x64, 0x1c, 0x08, 0x2c, 0xe2, 0xd3, + 0x54, 0x4e, 0x00, 0x24, 0x56, 0xf8, 0x24, 0x50, 0x6c, 0x35, 0x05, 0x23, + 0x00, 0xf0, 0x87, 0xf8, 0x05, 0x23, 0x00, 0xf0, 0x73, 0xf8, 0x05, 0x23, + 0x00, 0xf0, 0x6b, 0xf8, 0x0a, 0x23, 0x00, 0xf0, 0xa5, 0xf8, 0x64, 0x1c, + 0x08, 0x2c, 0xed, 0xd3, 0x00, 0x24, 0x4b, 0x4e, 0x56, 0xf8, 0x24, 0x50, + 0x40, 0x35, 0x03, 0x23, 0x00, 0xf0, 0x73, 0xf8, 0x03, 0x23, 0x00, 0xf0, + 0x5f, 0xf8, 0x02, 0x23, 0x00, 0xf0, 0x57, 0xf8, 0x08, 0x23, 0x00, 0xf0, + 0x91, 0xf8, 0x64, 0x1c, 0x01, 0x2c, 0xed, 0xd9, 0x42, 0x4c, 0x43, 0x4d, + 0x43, 0x4e, 0x44, 0x4f, 0x31, 0x20, 0xff, 0xf7, 0x81, 0xfc, 0x06, 0x21, + 0x31, 0x20, 0xff, 0xf7, 0xe8, 0xfc, 0x32, 0x20, 0xff, 0xf7, 0x7a, 0xfc, + 0x01, 0x21, 0x32, 0x20, 0xff, 0xf7, 0xe1, 0xfc, 0x33, 0x20, 0xff, 0xf7, + 0x73, 0xfc, 0x01, 0x21, 0x33, 0x20, 0xff, 0xf7, 0xda, 0xfc, 0x01, 0x23, + 0x00, 0xf0, 0x3f, 0xf8, 0x01, 0x23, 0x00, 0xf0, 0x44, 0xf8, 0x01, 0x23, + 0x00, 0xf0, 0x3d, 0xf8, 0x00, 0xf0, 0x48, 0xf8, 0x01, 0x23, 0x02, 0x22, + 0x01, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x18, 0xff, 0x31, 0x20, 0xff, 0xf7, + 0xb7, 0xfc, 0x32, 0x20, 0xff, 0xf7, 0xb4, 0xfc, 0x33, 0x20, 0xff, 0xf7, + 0xb1, 0xfc, 0x31, 0x20, 0xff, 0xf7, 0xa3, 0xfc, 0x32, 0x20, 0xff, 0xf7, + 0xa0, 0xfc, 0x33, 0x20, 0xff, 0xf7, 0x9d, 0xfc, 0x00, 0x23, 0x00, 0xf0, + 0x1c, 0xf8, 0x00, 0x23, 0x00, 0xf0, 0x21, 0xf8, 0x00, 0x23, 0x00, 0xf0, + 0x1a, 0xf8, 0x00, 0xf0, 0x25, 0xf8, 0x38, 0x46, 0x01, 0xb0, 0xbd, 0xe8, + 0xf0, 0x40, 0x01, 0x23, 0x02, 0x22, 0x01, 0x21, 0xf2, 0xe6, 0x30, 0x46, + 0xf9, 0xe6, 0x4f, 0xf4, 0x7c, 0x62, 0x06, 0x21, 0x28, 0x46, 0xf4, 0xe6, + 0x4f, 0xf4, 0x7c, 0x32, 0x0c, 0x21, 0x28, 0x46, 0xef, 0xe6, 0x20, 0x22, + 0x05, 0x21, 0x20, 0x46, 0xe2, 0xe6, 0x08, 0x22, 0x03, 0x21, 0x30, 0x46, + 0xde, 0xe6, 0x08, 0x22, 0x03, 0x21, 0x28, 0x46, 0xda, 0xe6, 0x4f, 0xf4, + 0x70, 0x12, 0x12, 0x21, 0x28, 0x46, 0xde, 0xe6, 0x01, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x38, 0x46, 0xd0, 0xe6, 0x00, 0x00, 0x11, 0x04, 0x00, 0x47, + 0x3c, 0x71, 0x02, 0x21, 0x0d, 0x04, 0x00, 0x47, 0xb7, 0x09, 0x00, 0x47, + 0xc0, 0x06, 0x00, 0x48, 0xb8, 0x09, 0x00, 0x47, 0xb9, 0x09, 0x00, 0x47, + 0x20, 0x96, 0x04, 0x02, 0xc0, 0x97, 0x04, 0x02, 0xcc, 0x9e, 0x04, 0x02, + 0x21, 0x00, 0x00, 0x47, 0x22, 0x00, 0x00, 0x47, 0xc6, 0x00, 0x00, 0x47, + 0x16, 0x04, 0x00, 0x47, 0x3f, 0x22, 0x00, 0x21, 0x28, 0x46, 0xb8, 0xe6, + 0x80, 0xb5, 0xff, 0xf7, 0xc7, 0xfe, 0xbd, 0xe8, 0x08, 0x40, 0x01, 0x22, + 0x4f, 0xf6, 0x54, 0x71, 0x07, 0xe0, 0x80, 0xb5, 0xff, 0xf7, 0xbe, 0xfe, + 0xbd, 0xe8, 0x08, 0x40, 0x03, 0x22, 0x4f, 0xf6, 0x55, 0x71, 0x01, 0x20, + 0x02, 0xf0, 0xc8, 0xbf, 0x80, 0xb5, 0xff, 0xf7, 0xb3, 0xfe, 0xbd, 0xe8, + 0x08, 0x40, 0x03, 0x22, 0x4f, 0xf6, 0x56, 0x71, 0xf3, 0xe7, 0x00, 0x00, + 0x7c, 0xb5, 0x00, 0x24, 0x00, 0x28, 0x40, 0xd0, 0x23, 0x48, 0x01, 0x78, + 0xc1, 0xf3, 0x80, 0x11, 0x11, 0xb9, 0x4b, 0xf2, 0x01, 0x34, 0x38, 0xe0, + 0x01, 0x7b, 0xc1, 0xf3, 0x80, 0x11, 0x11, 0xb9, 0x4b, 0xf2, 0x02, 0x34, + 0x31, 0xe0, 0x03, 0x78, 0x00, 0x7b, 0x03, 0xf0, 0x3f, 0x03, 0x00, 0xf0, + 0x3f, 0x00, 0x83, 0x42, 0x05, 0xd0, 0x00, 0x90, 0xb3, 0x21, 0x18, 0x4a, + 0x02, 0x20, 0xf5, 0xf7, 0x26, 0xfc, 0x17, 0x49, 0x17, 0x4a, 0x08, 0x68, + 0x13, 0x68, 0x00, 0xf1, 0xb8, 0x01, 0x08, 0x68, 0x18, 0x40, 0x0b, 0x68, + 0x11, 0x68, 0x14, 0x4a, 0x0b, 0x40, 0x05, 0x04, 0x03, 0xf0, 0xff, 0x03, + 0x43, 0xea, 0x15, 0x60, 0x00, 0x21, 0xef, 0xf3, 0x10, 0x85, 0x20, 0xfa, + 0x01, 0xf3, 0xdb, 0x07, 0x08, 0xd5, 0x52, 0xf8, 0x21, 0x30, 0x72, 0xb6, + 0x1e, 0x78, 0x06, 0xf0, 0xef, 0x06, 0x1e, 0x70, 0x85, 0xf3, 0x10, 0x88, + 0x49, 0x1c, 0x08, 0x29, 0xef, 0xdb, 0x20, 0x46, 0x76, 0xbd, 0x02, 0x48, + 0x00, 0x78, 0x00, 0xf0, 0x3f, 0x00, 0x70, 0x47, 0x58, 0x04, 0x00, 0x47, + 0x18, 0x93, 0x04, 0x02, 0x5c, 0x75, 0x02, 0x21, 0x58, 0x75, 0x02, 0x21, + 0x00, 0x96, 0x04, 0x02, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x78, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x70, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0xf8, 0xb5, 0x07, 0x46, + 0x00, 0x24, 0x1f, 0x2f, 0x63, 0xd8, 0x84, 0x4d, 0x89, 0xa2, 0x1d, 0x2f, + 0x24, 0xbf, 0x2c, 0x7d, 0x04, 0xf0, 0x01, 0x04, 0x23, 0x46, 0xff, 0x21, + 0x03, 0x20, 0xf5, 0xf7, 0xd2, 0xfb, 0xa4, 0xb1, 0x1d, 0x2f, 0x04, 0xd1, + 0x2c, 0x7a, 0x68, 0x7a, 0xa9, 0x7a, 0xea, 0x7a, 0x48, 0xe0, 0x1e, 0x2f, + 0x04, 0xd1, 0x2c, 0x7b, 0x68, 0x7b, 0xa9, 0x7b, 0xea, 0x7b, 0x41, 0xe0, + 0x1f, 0x2f, 0x04, 0xd1, 0x2c, 0x7c, 0x68, 0x7c, 0xa9, 0x7c, 0xea, 0x7c, + 0x3a, 0xe0, 0xfb, 0xb2, 0x1f, 0x22, 0x00, 0x21, 0x28, 0x46, 0xff, 0xf7, + 0xc5, 0xff, 0x00, 0xf0, 0xc5, 0xf8, 0x00, 0x26, 0x05, 0x24, 0x6f, 0x4f, + 0x4f, 0xf4, 0xfa, 0x60, 0x00, 0x22, 0x39, 0x78, 0xc9, 0x07, 0x02, 0xd4, + 0xb9, 0x79, 0xc9, 0x07, 0x02, 0xd4, 0x8d, 0xf8, 0x00, 0x20, 0x07, 0xe0, + 0x01, 0x26, 0x0b, 0xe0, 0x00, 0xbf, 0x9d, 0xf8, 0x00, 0x10, 0x49, 0x1c, + 0x8d, 0xf8, 0x00, 0x10, 0x9d, 0xf8, 0x00, 0x10, 0x10, 0x29, 0xf5, 0xd3, + 0x40, 0x1e, 0xe8, 0xd1, 0x38, 0x78, 0xc0, 0x07, 0x02, 0xd5, 0x00, 0xf0, + 0xa3, 0xf8, 0x02, 0xe0, 0xb8, 0x79, 0xc0, 0x07, 0x08, 0xd4, 0x64, 0x1e, + 0xda, 0xd1, 0x2e, 0xb9, 0x03, 0x22, 0x4f, 0xf6, 0x79, 0x71, 0x01, 0x20, + 0x02, 0xf0, 0xfc, 0xfe, 0x2c, 0x79, 0xe8, 0x78, 0xa9, 0x78, 0x6a, 0x78, + 0x44, 0xea, 0x00, 0x24, 0x44, 0xea, 0x01, 0x44, 0x44, 0xea, 0x02, 0x64, + 0x05, 0xe0, 0x3b, 0x46, 0x5c, 0xa2, 0xff, 0x21, 0x01, 0x20, 0xf5, 0xf7, + 0x74, 0xfb, 0x20, 0x46, 0xf2, 0xbd, 0xf8, 0xb5, 0xf4, 0xf7, 0x8d, 0xfa, + 0x4e, 0x4e, 0x4f, 0x4c, 0x31, 0x68, 0x41, 0xf2, 0x07, 0x07, 0x4f, 0xf6, + 0x1a, 0x75, 0xca, 0x5d, 0xd2, 0x09, 0x22, 0x73, 0xc8, 0xb1, 0x0b, 0x20, + 0xff, 0xf7, 0x7e, 0xff, 0x00, 0x0e, 0xe0, 0x71, 0x07, 0xd1, 0x1f, 0x20, + 0xff, 0xf7, 0x78, 0xff, 0x00, 0x0e, 0x04, 0xbf, 0x01, 0x21, 0x21, 0x73, + 0xa0, 0x71, 0x20, 0x70, 0x31, 0x68, 0x43, 0x4b, 0xca, 0x5d, 0x22, 0x72, + 0x1a, 0x78, 0x62, 0x72, 0xc9, 0x5d, 0x81, 0x42, 0x01, 0xd0, 0x20, 0x7b, + 0x50, 0xb3, 0x30, 0x68, 0x00, 0xf5, 0x81, 0x50, 0x00, 0x25, 0x01, 0x79, + 0x01, 0xf0, 0x0f, 0x01, 0x61, 0x70, 0x02, 0x78, 0x02, 0xf0, 0x0f, 0x02, + 0x11, 0x43, 0x81, 0xf0, 0xff, 0x01, 0x61, 0x70, 0x01, 0x79, 0x09, 0x09, + 0xa1, 0x70, 0x02, 0x78, 0x41, 0xea, 0x12, 0x11, 0x81, 0xf0, 0xff, 0x01, + 0xa1, 0x70, 0x81, 0x78, 0xc1, 0xf3, 0x01, 0x11, 0x81, 0xf0, 0x03, 0x01, + 0xe1, 0x70, 0x81, 0x78, 0xc9, 0x09, 0x21, 0x71, 0x81, 0xf0, 0x01, 0x01, + 0x80, 0x78, 0x21, 0x71, 0xc0, 0xf3, 0x80, 0x10, 0x60, 0x71, 0x80, 0xf0, + 0x01, 0x00, 0x60, 0x71, 0x28, 0x46, 0xf2, 0xbd, 0x25, 0x48, 0x28, 0x4a, + 0x70, 0xb5, 0x01, 0x68, 0x24, 0x48, 0x51, 0xf8, 0xb8, 0x3f, 0x16, 0x68, + 0x85, 0x78, 0x33, 0x40, 0x03, 0xf0, 0xff, 0x03, 0x00, 0x24, 0x2b, 0x43, + 0xab, 0x42, 0x11, 0xd1, 0x0b, 0x68, 0x16, 0x68, 0x45, 0x78, 0x33, 0x40, + 0x1b, 0x04, 0x55, 0xea, 0x13, 0x63, 0xab, 0x42, 0x08, 0xd1, 0x0b, 0x68, + 0xc1, 0x78, 0x33, 0x40, 0x1b, 0x0c, 0x03, 0xf0, 0x03, 0x03, 0x0b, 0x43, + 0x8b, 0x42, 0x09, 0xd0, 0x00, 0x7b, 0x4f, 0xf6, 0x19, 0x71, 0x00, 0x28, + 0x0f, 0xbf, 0x0c, 0x46, 0x01, 0x22, 0x01, 0x20, 0x02, 0xf0, 0x68, 0xfe, + 0x20, 0x46, 0x70, 0xbd, 0x1c, 0xb5, 0x0d, 0x4c, 0x00, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, 0xf6, 0xfe, 0x00, 0x22, 0x00, 0x92, + 0x03, 0xe0, 0x00, 0xbf, 0x00, 0x98, 0x40, 0x1c, 0x00, 0x90, 0x00, 0x98, + 0x10, 0x28, 0xf8, 0xd3, 0x20, 0x46, 0x02, 0xb0, 0xbd, 0xe8, 0x10, 0x40, + 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0xe3, 0xe6, 0x92, 0x01, 0x00, 0x47, + 0x8b, 0x01, 0x00, 0x47, 0x5c, 0x75, 0x02, 0x21, 0xfc, 0x40, 0x00, 0x21, + 0x04, 0x00, 0x00, 0x47, 0x58, 0x75, 0x02, 0x21, 0x6f, 0x76, 0x65, 0x72, + 0x72, 0x69, 0x64, 0x65, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x20, + 0x25, 0x64, 0x0a, 0x00, 0x45, 0x46, 0x55, 0x53, 0x45, 0x5f, 0x52, 0x65, + 0x61, 0x64, 0x46, 0x75, 0x73, 0x65, 0x3a, 0x20, 0x62, 0x61, 0x64, 0x20, + 0x61, 0x64, 0x64, 0x72, 0x20, 0x25, 0x58, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x38, 0xb5, 0x00, 0xf0, 0x1f, 0xf8, 0x4f, 0xf4, + 0x80, 0x72, 0x08, 0x21, 0x28, 0x46, 0xff, 0xf7, 0xe9, 0xff, 0x23, 0x46, + 0x28, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x4f, 0xf4, 0x00, 0x72, + 0x09, 0x21, 0xdf, 0xe7, 0x38, 0xb5, 0x00, 0xf0, 0x0d, 0xf8, 0x10, 0x22, + 0x04, 0x21, 0x28, 0x46, 0xff, 0xf7, 0xd8, 0xff, 0x23, 0x46, 0x28, 0x46, + 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x20, 0x22, 0x05, 0x21, 0xcf, 0xe7, + 0xdf, 0xf8, 0xa4, 0x55, 0x05, 0xeb, 0xc0, 0x00, 0x1c, 0x46, 0x50, 0xf8, + 0x21, 0x50, 0x13, 0x46, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x43, 0x87, 0xb0, + 0x05, 0x46, 0x0e, 0x9c, 0x89, 0x46, 0x16, 0x46, 0x1f, 0x46, 0xc0, 0xb2, + 0x12, 0xf0, 0x33, 0xf9, 0x00, 0x21, 0x01, 0x22, 0x8d, 0xf8, 0x01, 0x10, + 0x8d, 0xf8, 0x00, 0x20, 0x8d, 0xf8, 0x03, 0x20, 0x01, 0x96, 0x80, 0x46, + 0x02, 0x97, 0x8d, 0xf8, 0x0c, 0x90, 0x8d, 0xf8, 0x0d, 0x90, 0x8d, 0xf8, + 0x18, 0x40, 0x8d, 0xf8, 0x02, 0x80, 0x00, 0xf0, 0xe6, 0xf8, 0x04, 0x00, + 0x05, 0xd1, 0x00, 0x23, 0x03, 0x22, 0x41, 0x46, 0xe8, 0xb2, 0x12, 0xf0, + 0x25, 0xf9, 0x20, 0x46, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x83, 0x30, 0xb5, + 0x87, 0xb0, 0x01, 0x25, 0x02, 0x93, 0x8d, 0xf8, 0x02, 0x10, 0x00, 0x23, + 0x0a, 0x9c, 0x01, 0x92, 0x8d, 0xf8, 0x03, 0x30, 0x8d, 0xf8, 0x00, 0x50, + 0x00, 0xf0, 0x17, 0xf8, 0x04, 0xf0, 0xa4, 0xfa, 0x07, 0xb0, 0x30, 0xbd, + 0x5c, 0xb5, 0x87, 0xb0, 0x01, 0x26, 0x01, 0x92, 0x8d, 0xf8, 0x02, 0x10, + 0x00, 0x22, 0x0c, 0x9c, 0x02, 0x93, 0x8d, 0xf8, 0x03, 0x20, 0x00, 0xf0, + 0x04, 0xf8, 0x12, 0xf0, 0x57, 0xf9, 0x09, 0xb0, 0x50, 0xbd, 0x8d, 0xf8, + 0x00, 0x60, 0x8d, 0xf8, 0x18, 0x40, 0x69, 0x46, 0xc0, 0xb2, 0x70, 0x47, + 0x2d, 0xe9, 0xf8, 0x41, 0x05, 0x46, 0x87, 0xb0, 0x2e, 0x68, 0x69, 0x7a, + 0x8d, 0xf8, 0x01, 0x10, 0x29, 0x7a, 0x8d, 0xf8, 0x00, 0x10, 0x69, 0x46, + 0xa8, 0x7a, 0x8d, 0xf8, 0x03, 0x00, 0xe8, 0x68, 0x01, 0x90, 0x28, 0x69, + 0x02, 0x90, 0x28, 0x7d, 0x8d, 0xf8, 0x0c, 0x00, 0x68, 0x7d, 0x8d, 0xf8, + 0x0d, 0x00, 0xa8, 0x7d, 0x8d, 0xf8, 0x18, 0x00, 0xf0, 0xb2, 0x6a, 0x68, + 0x8d, 0xf8, 0x02, 0x20, 0x12, 0xf0, 0x3a, 0xfa, 0x04, 0x00, 0x25, 0xd1, + 0x28, 0x68, 0xf5, 0xf7, 0xff, 0xf8, 0x9d, 0xf8, 0x02, 0x80, 0x43, 0x46, + 0x1c, 0x22, 0x53, 0x43, 0x38, 0x21, 0xdf, 0xf8, 0x90, 0x24, 0x48, 0x43, + 0x10, 0x44, 0x9d, 0xf8, 0x00, 0x20, 0xc7, 0x18, 0x01, 0x2a, 0x0d, 0xd1, + 0x18, 0x44, 0x69, 0x46, 0x1c, 0x22, 0xe6, 0xf7, 0xaf, 0xfc, 0x02, 0x20, + 0x38, 0x76, 0x00, 0x23, 0x03, 0x22, 0x41, 0x46, 0xf0, 0xb2, 0x12, 0xf0, + 0xb3, 0xf8, 0x05, 0xe0, 0x00, 0x20, 0x38, 0x76, 0x41, 0x46, 0x28, 0x68, + 0x00, 0xf0, 0x60, 0xfb, 0x5f, 0xe0, 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, + 0xc0, 0xb2, 0x12, 0xf0, 0x96, 0xf8, 0x01, 0x46, 0x2a, 0x46, 0x20, 0x46, + 0xbd, 0xe8, 0x38, 0x40, 0x2d, 0xe9, 0xf8, 0x41, 0x87, 0xb0, 0x05, 0x46, + 0x0c, 0x46, 0x90, 0x46, 0xf5, 0xf7, 0xc8, 0xf8, 0x38, 0x21, 0xdf, 0xf8, + 0x2c, 0x24, 0x48, 0x43, 0x1c, 0x23, 0x10, 0x44, 0x63, 0x43, 0xc1, 0x18, + 0x27, 0x46, 0x0a, 0x7e, 0x02, 0x2a, 0x0d, 0xd1, 0x08, 0x78, 0x58, 0xb1, + 0x8f, 0x70, 0xe8, 0xb2, 0x12, 0xf0, 0xec, 0xf9, 0x04, 0x46, 0x00, 0x23, + 0x03, 0x22, 0xf9, 0xb2, 0xe8, 0xb2, 0x12, 0xf0, 0x7f, 0xf8, 0x32, 0xe0, + 0x00, 0x23, 0x00, 0x22, 0xf9, 0xb2, 0xe8, 0xb2, 0xff, 0xf7, 0x12, 0xff, + 0xee, 0xb2, 0x00, 0x23, 0x00, 0x22, 0xf9, 0xb2, 0xe8, 0xb2, 0xff, 0xf7, + 0xf9, 0xfe, 0xdf, 0xf8, 0xdc, 0x03, 0x00, 0xeb, 0xc6, 0x0e, 0xfe, 0xb2, + 0x5e, 0xf8, 0x26, 0x00, 0x00, 0x23, 0x00, 0xf0, 0x24, 0xf8, 0x00, 0x20, + 0xad, 0xf8, 0x00, 0x00, 0x8d, 0xf8, 0x18, 0x80, 0x8d, 0xf8, 0x02, 0x40, + 0x00, 0xf0, 0x17, 0xf8, 0x04, 0x00, 0x08, 0xd1, 0x01, 0x21, 0x8d, 0xf8, + 0x01, 0x10, 0x00, 0x22, 0x8d, 0xf8, 0x00, 0x20, 0x00, 0xf0, 0x0d, 0xf8, + 0x04, 0x46, 0xf9, 0xb2, 0xe8, 0xb2, 0x12, 0xf0, 0x53, 0xfb, 0xf9, 0xb2, + 0x28, 0x46, 0x00, 0xf0, 0xff, 0xfa, 0x20, 0x46, 0x08, 0xb0, 0xbd, 0xe8, + 0xf0, 0x81, 0x69, 0x46, 0xe8, 0xb2, 0x12, 0xf0, 0xa9, 0xb9, 0x4f, 0xf4, + 0x80, 0x52, 0x0c, 0x21, 0xb8, 0xe6, 0x38, 0xb5, 0x0c, 0x46, 0xdf, 0xf8, + 0x7c, 0x13, 0x51, 0xf8, 0x20, 0x50, 0x13, 0x46, 0x2d, 0x1d, 0x4f, 0xf0, + 0x00, 0x72, 0x19, 0x21, 0x28, 0x46, 0xff, 0xf7, 0xab, 0xfe, 0x23, 0x46, + 0x28, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x4f, 0xf0, 0x80, 0x72, + 0x18, 0x21, 0xa1, 0xe6, 0x10, 0xb5, 0x04, 0x46, 0xc0, 0xb2, 0x12, 0xf0, + 0x14, 0xf8, 0x01, 0x46, 0xe0, 0xb2, 0xbd, 0xe8, 0x10, 0x40, 0x12, 0xf0, + 0x5d, 0xbb, 0x5c, 0xb5, 0x87, 0xb0, 0x0c, 0x9c, 0x8d, 0xf8, 0x02, 0x10, + 0x01, 0x26, 0x01, 0x92, 0x02, 0x93, 0xff, 0xf7, 0x16, 0xff, 0x12, 0xf0, + 0x57, 0xfb, 0x09, 0xb0, 0x50, 0xbd, 0x18, 0xb5, 0x87, 0xb0, 0x00, 0x24, + 0x8d, 0xf8, 0x02, 0x10, 0x8d, 0xf8, 0x18, 0x20, 0x8d, 0xf8, 0x00, 0x40, + 0x69, 0x46, 0xc0, 0xb2, 0x12, 0xf0, 0x48, 0xfb, 0x08, 0xb0, 0x10, 0xbd, + 0x18, 0xb5, 0x87, 0xb0, 0x00, 0xf0, 0x0c, 0xf8, 0x04, 0xf0, 0x8e, 0xf9, + 0x08, 0xb0, 0x10, 0xbd, 0x18, 0xb5, 0x87, 0xb0, 0x00, 0xf0, 0x04, 0xf8, + 0x12, 0xf0, 0x4a, 0xf8, 0x08, 0xb0, 0x10, 0xbd, 0x00, 0x24, 0x8d, 0xf8, + 0x02, 0x10, 0x8d, 0xf8, 0x18, 0x20, 0x8d, 0xf8, 0x00, 0x40, 0x8d, 0xf8, + 0x03, 0x40, 0x69, 0x46, 0xc0, 0xb2, 0x70, 0x47, 0xf8, 0xb5, 0xf4, 0xf7, + 0xed, 0xff, 0x05, 0x46, 0xe0, 0x21, 0xaf, 0x48, 0xf8, 0xf7, 0x8a, 0xfd, + 0x00, 0x24, 0x00, 0x26, 0x25, 0xfa, 0x06, 0xf0, 0xc0, 0x07, 0x0f, 0xd5, + 0x00, 0x27, 0x01, 0x22, 0x39, 0x46, 0x30, 0x46, 0xff, 0xf7, 0x30, 0xff, + 0x04, 0x46, 0xf9, 0xb2, 0x30, 0x46, 0x00, 0xf0, 0x7f, 0xfa, 0x7f, 0x1c, + 0x01, 0x2f, 0x01, 0xd8, 0x00, 0x2c, 0xf0, 0xd0, 0x76, 0x1c, 0x08, 0x2e, + 0x01, 0xd2, 0x00, 0x2c, 0xe6, 0xd0, 0x20, 0x46, 0xf2, 0xbd, 0x2d, 0xe9, + 0xf8, 0x46, 0xf4, 0xf7, 0xc7, 0xff, 0x00, 0x26, 0x81, 0x46, 0x00, 0x27, + 0x9d, 0x4d, 0x29, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x32, 0xd5, 0x00, 0x24, + 0xfe, 0xb2, 0x9b, 0x48, 0x00, 0x68, 0x81, 0x19, 0xed, 0x23, 0x91, 0xf8, + 0xbc, 0x20, 0x29, 0x68, 0x5a, 0x43, 0x10, 0x44, 0x00, 0xf2, 0x44, 0x4a, + 0x01, 0xeb, 0x86, 0x00, 0xe1, 0xb2, 0x82, 0x6a, 0xf8, 0xb2, 0x12, 0xf0, + 0xd9, 0xfa, 0xe1, 0xb2, 0xf8, 0xb2, 0x11, 0xf0, 0x75, 0xff, 0x70, 0xb1, + 0x32, 0x21, 0x61, 0x43, 0x51, 0x44, 0x08, 0x7d, 0x48, 0xb1, 0xd1, 0xf8, + 0x19, 0x20, 0x01, 0x20, 0x00, 0x90, 0x00, 0x23, 0x21, 0x46, 0x38, 0x46, + 0xff, 0xf7, 0x6f, 0xff, 0x04, 0xe0, 0x01, 0x22, 0x21, 0x46, 0x38, 0x46, + 0xff, 0xf7, 0x77, 0xff, 0x64, 0x1c, 0x01, 0x2c, 0x01, 0xd8, 0x00, 0x28, + 0xcf, 0xd0, 0x06, 0x46, 0x7f, 0x1c, 0x08, 0x2f, 0x01, 0xd2, 0x00, 0x2e, + 0xc3, 0xd0, 0x30, 0x46, 0xbd, 0xe8, 0xf2, 0x86, 0x2d, 0xe9, 0xf0, 0x41, + 0x8a, 0xb0, 0xf4, 0xf7, 0x71, 0xff, 0x06, 0x46, 0xf4, 0xf7, 0x7e, 0xff, + 0x00, 0x24, 0xad, 0xf8, 0x08, 0x40, 0x02, 0xad, 0x00, 0x27, 0x26, 0xfa, + 0x07, 0xf0, 0xc0, 0x07, 0x4f, 0xd5, 0x01, 0xa9, 0x38, 0x46, 0x01, 0xf0, + 0x30, 0xfc, 0x04, 0x46, 0x01, 0x98, 0xf4, 0xf7, 0x98, 0xff, 0x00, 0x2c, + 0x45, 0xd1, 0x01, 0x99, 0xff, 0x29, 0x18, 0xbf, 0xff, 0x28, 0x40, 0xd0, + 0x68, 0x5c, 0x00, 0x28, 0x3d, 0xd1, 0x6d, 0x49, 0x09, 0x68, 0x01, 0xaa, + 0xf8, 0xb2, 0x13, 0x78, 0x08, 0x44, 0x70, 0x24, 0x63, 0x43, 0x90, 0xf8, + 0xbc, 0x00, 0x19, 0x44, 0x01, 0xf5, 0x32, 0x61, 0x01, 0xeb, 0x80, 0x08, + 0xd8, 0xf8, 0x37, 0x20, 0x3a, 0xb1, 0x01, 0x20, 0x00, 0x90, 0x00, 0x23, + 0x01, 0x98, 0x00, 0x21, 0xff, 0xf7, 0x2e, 0xfe, 0x04, 0xe0, 0x01, 0x98, + 0x01, 0x22, 0x00, 0x21, 0xff, 0xf7, 0x3e, 0xff, 0x04, 0x00, 0x1c, 0xd1, + 0xd8, 0xf8, 0x47, 0x00, 0x78, 0xb1, 0x04, 0x90, 0x01, 0x21, 0x8d, 0xf8, + 0x0c, 0x10, 0x8d, 0xf8, 0x0e, 0x10, 0x00, 0x22, 0x8d, 0xf8, 0x24, 0x10, + 0x05, 0x92, 0x03, 0xa9, 0x01, 0x98, 0xc0, 0xb2, 0x11, 0xf0, 0x7a, 0xff, + 0x04, 0xe0, 0x01, 0x98, 0x01, 0x22, 0x01, 0x21, 0xff, 0xf7, 0x24, 0xff, + 0x04, 0x00, 0x02, 0xd1, 0x01, 0x99, 0x01, 0x20, 0x68, 0x54, 0x7f, 0x1c, + 0x08, 0x2f, 0x01, 0xd2, 0x00, 0x2c, 0xa6, 0xd0, 0x20, 0x46, 0x0a, 0xb0, + 0xbd, 0xe8, 0xf0, 0x81, 0x7c, 0xb5, 0xf4, 0xf7, 0x18, 0xff, 0x00, 0x24, + 0x05, 0x46, 0x00, 0x26, 0x25, 0xfa, 0x06, 0xf0, 0xc0, 0x07, 0x24, 0xd5, + 0x00, 0x24, 0x44, 0x48, 0x00, 0x68, 0x81, 0x19, 0xe0, 0x23, 0x91, 0xf8, + 0xbc, 0x20, 0x5a, 0x43, 0x10, 0x44, 0x32, 0x21, 0xc4, 0x30, 0x61, 0x43, + 0x01, 0x44, 0x91, 0xf8, 0x25, 0x00, 0x48, 0xb1, 0xd1, 0xf8, 0x2a, 0x20, + 0x01, 0x20, 0x00, 0x90, 0x00, 0x23, 0x21, 0x46, 0x30, 0x46, 0xff, 0xf7, + 0xca, 0xfd, 0x04, 0xe0, 0x01, 0x22, 0x21, 0x46, 0x30, 0x46, 0xff, 0xf7, + 0xe5, 0xfe, 0x64, 0x1c, 0x01, 0x2c, 0x01, 0xdc, 0x00, 0x28, 0xdc, 0xd0, + 0x04, 0x46, 0x76, 0x1c, 0x08, 0x2e, 0x01, 0xda, 0x00, 0x2c, 0xd1, 0xd0, + 0x20, 0x46, 0x76, 0xbd, 0x78, 0xb5, 0x85, 0xb0, 0xf4, 0xf7, 0xe0, 0xfe, + 0x00, 0x24, 0x05, 0x46, 0x00, 0x26, 0x25, 0xfa, 0x06, 0xf0, 0xc0, 0x07, + 0x21, 0xd5, 0x00, 0xf0, 0xed, 0xf8, 0x04, 0x00, 0x1d, 0xd1, 0x00, 0x98, + 0xff, 0x28, 0x13, 0xd0, 0x25, 0x49, 0x08, 0x68, 0xf2, 0xb2, 0x02, 0x44, + 0x70, 0x24, 0x92, 0xf8, 0xbc, 0x10, 0x9d, 0xf8, 0x00, 0x20, 0x62, 0x43, + 0x10, 0x44, 0x00, 0xf5, 0x32, 0x60, 0x00, 0xeb, 0x81, 0x00, 0xd0, 0xf8, + 0x37, 0x20, 0xd0, 0xf8, 0x47, 0x30, 0x01, 0xe0, 0x00, 0x22, 0x00, 0x23, + 0x00, 0x99, 0x30, 0x46, 0x00, 0xf0, 0x0d, 0xf9, 0x04, 0x46, 0x76, 0x1c, + 0x08, 0x2e, 0x01, 0xd2, 0x00, 0x2c, 0xd4, 0xd0, 0x20, 0x46, 0x00, 0x26, + 0x00, 0x24, 0xe0, 0xb9, 0x25, 0xfa, 0x06, 0xf1, 0xc9, 0x07, 0x15, 0xd5, + 0x00, 0xf0, 0xbe, 0xf8, 0x90, 0xb9, 0x00, 0x98, 0xff, 0x28, 0x04, 0xd0, + 0x01, 0x46, 0x30, 0x46, 0x00, 0xf0, 0xd3, 0xf8, 0x0a, 0xe0, 0x01, 0xa8, + 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x80, 0xe8, 0x1e, 0x00, 0xf0, 0xb2, + 0x03, 0xf0, 0xcf, 0xff, 0x00, 0xf0, 0x48, 0xfd, 0x76, 0x1c, 0x08, 0x2e, + 0xe1, 0xd3, 0x06, 0xb0, 0x70, 0xbd, 0x00, 0x00, 0xdc, 0x91, 0x04, 0x02, + 0x14, 0x5f, 0x02, 0x21, 0xa0, 0x98, 0x04, 0x02, 0x60, 0x75, 0x02, 0x21, + 0x5c, 0x75, 0x02, 0x21, 0x2d, 0xe9, 0xf8, 0x4f, 0x83, 0x46, 0x0e, 0x46, + 0x90, 0x46, 0x99, 0x46, 0xf3, 0xf7, 0xb7, 0xfe, 0x00, 0x25, 0x00, 0x24, + 0x01, 0x2e, 0xa2, 0x46, 0x0a, 0xd1, 0x01, 0x28, 0x5d, 0xd1, 0x4a, 0x46, + 0x41, 0x46, 0x5f, 0xfa, 0x8b, 0xf0, 0x11, 0xf0, 0x8e, 0xff, 0x00, 0xf0, + 0x1e, 0xfd, 0x53, 0xe0, 0x0a, 0x9e, 0x00, 0x27, 0x38, 0x46, 0xf4, 0xf7, + 0x8b, 0xfe, 0x2b, 0xfa, 0x07, 0xf1, 0xc9, 0x07, 0x2c, 0xd5, 0xff, 0x28, + 0x2a, 0xd0, 0x69, 0x46, 0x38, 0x46, 0x01, 0xf0, 0x1e, 0xfb, 0x04, 0x00, + 0x0f, 0xd1, 0x00, 0x98, 0xff, 0x28, 0x0d, 0xd0, 0x49, 0x46, 0xc0, 0xb2, + 0x11, 0xf0, 0x64, 0xff, 0x04, 0x46, 0x00, 0x98, 0x08, 0xb9, 0x01, 0x25, + 0x03, 0xe0, 0x01, 0x28, 0x08, 0xbf, 0x4f, 0xf0, 0x01, 0x0a, 0x3c, 0xb9, + 0x4a, 0x46, 0x41, 0x46, 0xf8, 0xb2, 0x11, 0xf0, 0x64, 0xff, 0x00, 0xf0, + 0xf4, 0xfc, 0x04, 0x46, 0x00, 0x2c, 0x08, 0xbf, 0x01, 0x2e, 0x07, 0xd1, + 0x00, 0x9c, 0xf8, 0xb2, 0x03, 0xf0, 0x70, 0xff, 0x20, 0x46, 0x00, 0xf0, + 0xf6, 0xfc, 0x04, 0x46, 0x7f, 0x1c, 0x08, 0x2f, 0x01, 0xd2, 0x00, 0x2c, + 0xc6, 0xd0, 0x20, 0x46, 0x00, 0x24, 0xa8, 0xb9, 0x69, 0x46, 0x20, 0x46, + 0x01, 0xf0, 0xeb, 0xfa, 0x68, 0xb9, 0x00, 0x99, 0x11, 0xb9, 0x29, 0x00, + 0x05, 0xd1, 0x08, 0xe0, 0x01, 0x29, 0x06, 0xd1, 0x5f, 0xea, 0x0a, 0x01, + 0x03, 0xd0, 0x00, 0x99, 0x20, 0x46, 0x00, 0xf0, 0x4e, 0xf8, 0x64, 0x1c, + 0x08, 0x2c, 0xe8, 0xd3, 0x04, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x8f, + 0x7c, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x00, 0x26, 0x00, 0xf0, 0x24, 0xf8, + 0x00, 0x28, 0x04, 0xbf, 0x00, 0x99, 0xa1, 0x42, 0x08, 0xd1, 0xf0, 0xb2, + 0x03, 0xf0, 0x27, 0xff, 0x03, 0x46, 0x00, 0x99, 0x2a, 0x46, 0x30, 0x46, + 0x00, 0xf0, 0x55, 0xf8, 0x76, 0x1c, 0x08, 0x2e, 0x01, 0xd2, 0x00, 0x28, + 0xea, 0xd0, 0x00, 0x25, 0x68, 0xb9, 0x69, 0x46, 0x28, 0x46, 0x01, 0xf0, + 0xb6, 0xfa, 0x00, 0x28, 0x01, 0xbf, 0x00, 0x99, 0xa1, 0x42, 0x28, 0x46, + 0x00, 0xf0, 0x21, 0xf8, 0x6d, 0x1c, 0x08, 0x2d, 0xf0, 0xd3, 0x76, 0xbd, + 0x69, 0x46, 0x30, 0x46, 0x01, 0xf0, 0xa7, 0xba, 0x70, 0xb5, 0xf4, 0xf7, + 0xd5, 0xfd, 0x05, 0x46, 0x00, 0x26, 0x00, 0x20, 0x25, 0xfa, 0x06, 0xf1, + 0xc9, 0x07, 0x08, 0xd5, 0xff, 0xf7, 0xf0, 0xff, 0x28, 0xb9, 0x00, 0x99, + 0xff, 0x29, 0x1c, 0xbf, 0x30, 0x46, 0x00, 0xf0, 0x06, 0xf8, 0x76, 0x1c, + 0x08, 0x2e, 0x01, 0xd2, 0x00, 0x28, 0xed, 0xd0, 0x62, 0xbd, 0x78, 0xb5, + 0x85, 0xb0, 0x05, 0x46, 0x0e, 0x46, 0x69, 0x46, 0x30, 0x46, 0x03, 0xf0, + 0x19, 0xfe, 0x04, 0x00, 0x06, 0xd1, 0x9d, 0xf8, 0x00, 0x10, 0x01, 0xaa, + 0x28, 0x46, 0x03, 0xf0, 0x63, 0xfe, 0x04, 0x46, 0x64, 0xb9, 0x01, 0xa9, + 0x30, 0x46, 0x03, 0xf0, 0xd6, 0xfc, 0x02, 0x99, 0xe8, 0xb2, 0x03, 0xf0, + 0xec, 0xfe, 0xff, 0x2e, 0x02, 0xd0, 0x00, 0xf0, 0x63, 0xfc, 0x04, 0x46, + 0x20, 0x46, 0x06, 0xb0, 0x70, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x08, 0x46, + 0x1e, 0x46, 0x15, 0x46, 0x31, 0x46, 0xc0, 0xb2, 0x11, 0xf0, 0xb2, 0xfe, + 0x40, 0xb9, 0x32, 0x46, 0x29, 0x46, 0xe0, 0xb2, 0x11, 0xf0, 0xbb, 0xfe, + 0xbd, 0xe8, 0x70, 0x40, 0x00, 0xf0, 0x49, 0xbc, 0x70, 0xbd, 0x2d, 0xe9, + 0xfc, 0x41, 0x06, 0x46, 0x0d, 0x46, 0x90, 0x46, 0x1f, 0x46, 0xf3, 0xf7, + 0xca, 0xfd, 0x00, 0x24, 0x01, 0x2d, 0x09, 0xd1, 0x01, 0x28, 0x2e, 0xd1, + 0x41, 0x46, 0xf0, 0xb2, 0x11, 0xf0, 0xb2, 0xfe, 0x00, 0xf0, 0x32, 0xfc, + 0x04, 0x46, 0x26, 0xe0, 0x00, 0x25, 0x28, 0x46, 0xf4, 0xf7, 0xa2, 0xfd, + 0x26, 0xfa, 0x05, 0xf1, 0xc9, 0x07, 0x19, 0xd5, 0xff, 0x28, 0x17, 0xd0, + 0x41, 0x46, 0xe8, 0xb2, 0x11, 0xf0, 0xa0, 0xfe, 0x00, 0xf0, 0x20, 0xfc, + 0x04, 0x00, 0x08, 0xbf, 0x01, 0x2f, 0x0d, 0xd1, 0x00, 0x20, 0x00, 0x90, + 0x69, 0x46, 0x28, 0x46, 0x01, 0xf0, 0x29, 0xfa, 0x04, 0x00, 0x05, 0xd1, + 0x00, 0x98, 0xff, 0x28, 0x02, 0xd0, 0x00, 0xf0, 0x18, 0xfc, 0x04, 0x46, + 0x6d, 0x1c, 0x08, 0x2d, 0x01, 0xd2, 0x00, 0x2c, 0xd9, 0xd0, 0x20, 0x46, + 0xbd, 0xe8, 0xf6, 0x81, 0x78, 0xb5, 0x87, 0xb0, 0x0c, 0x46, 0x00, 0x26, + 0x05, 0x46, 0x8d, 0xf8, 0x02, 0x40, 0x8d, 0xf8, 0x01, 0x60, 0x69, 0x46, + 0xe8, 0xb2, 0x11, 0xf0, 0xee, 0xff, 0x9d, 0xf8, 0x00, 0x00, 0x06, 0x43, + 0x9d, 0xf8, 0x01, 0x00, 0x40, 0x1c, 0x8d, 0xf8, 0x01, 0x00, 0xc0, 0xb2, + 0x01, 0x28, 0xf0, 0xdd, 0xf6, 0xb2, 0x2e, 0xb9, 0x00, 0x23, 0x00, 0x22, + 0x21, 0x46, 0xe8, 0xb2, 0x11, 0xf0, 0x2c, 0xfd, 0x08, 0xb0, 0x70, 0xbd, + 0x00, 0x68, 0x02, 0x40, 0x22, 0xfa, 0x01, 0xf0, 0x70, 0x47, 0x30, 0xb5, + 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, + 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, + 0x30, 0xbd, 0xdf, 0xf8, 0x4c, 0x08, 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, + 0x18, 0xe0, 0xdf, 0xf8, 0x40, 0x08, 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, + 0xc0, 0xf3, 0x07, 0x20, 0x70, 0x47, 0xdf, 0xf8, 0x30, 0x08, 0x01, 0x68, + 0xd1, 0xf8, 0xb8, 0x00, 0xc0, 0xf3, 0x01, 0x40, 0x70, 0x47, 0xdf, 0xf8, + 0x20, 0x08, 0xdf, 0xf8, 0x20, 0x28, 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, + 0x11, 0x68, 0x08, 0x40, 0x00, 0xf0, 0xff, 0x00, 0x70, 0x47, 0xdf, 0xf8, + 0x08, 0x08, 0xdf, 0xf8, 0x08, 0x28, 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, + 0x11, 0x68, 0x08, 0x40, 0x00, 0x04, 0x00, 0x0e, 0x70, 0x47, 0xdf, 0xf8, + 0xf0, 0x07, 0xdf, 0xf8, 0xf0, 0x27, 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, + 0x11, 0x68, 0x08, 0x40, 0x00, 0x0c, 0x00, 0xf0, 0x03, 0x00, 0x70, 0x47, + 0x00, 0x23, 0x00, 0x22, 0xfe, 0xf7, 0xe5, 0xbe, 0x2d, 0xe9, 0xf8, 0x43, + 0x05, 0x46, 0x00, 0x24, 0x28, 0x00, 0x08, 0xd0, 0x12, 0xf0, 0xe9, 0xf8, + 0x12, 0xf0, 0xeb, 0xf8, 0x01, 0x28, 0x18, 0xbf, 0x4b, 0xf2, 0x04, 0x14, + 0x64, 0xd1, 0xff, 0xf7, 0xd2, 0xff, 0x06, 0x46, 0xff, 0xf7, 0xc3, 0xff, + 0x07, 0x46, 0xff, 0xf7, 0xd8, 0xff, 0x80, 0x46, 0xdf, 0xf8, 0xa4, 0x97, + 0x02, 0x22, 0x49, 0x46, 0x30, 0x46, 0x00, 0xf0, 0x4e, 0xfb, 0x02, 0x22, + 0x09, 0xf1, 0x20, 0x01, 0x38, 0x46, 0x00, 0xf0, 0x48, 0xfb, 0x02, 0x22, + 0x09, 0xf1, 0x40, 0x01, 0x40, 0x46, 0x00, 0xf0, 0x42, 0xfb, 0x08, 0x22, + 0xdf, 0xf8, 0x80, 0x17, 0x01, 0x20, 0x00, 0xf0, 0x3c, 0xfb, 0x00, 0x21, + 0x30, 0x46, 0x00, 0xf0, 0xda, 0xf8, 0x00, 0x21, 0x38, 0x46, 0x00, 0xf0, + 0xea, 0xf8, 0x00, 0x21, 0x40, 0x46, 0x00, 0xf0, 0xfa, 0xf8, 0x00, 0x26, + 0xdf, 0xf8, 0x60, 0x77, 0x57, 0xf8, 0x26, 0x80, 0x00, 0x23, 0x4f, 0xf0, + 0xff, 0x32, 0x00, 0x21, 0x08, 0xf1, 0x18, 0x00, 0xff, 0xf7, 0x69, 0xff, + 0x00, 0x23, 0x4f, 0xf0, 0xff, 0x32, 0x00, 0x21, 0x08, 0xf1, 0x2c, 0x00, + 0xff, 0xf7, 0x61, 0xff, 0x76, 0x1c, 0x08, 0x2e, 0xea, 0xd3, 0xdf, 0xf8, + 0x38, 0x67, 0x30, 0x68, 0x00, 0xf0, 0x1c, 0xf8, 0x70, 0x68, 0x00, 0xf0, + 0x19, 0xf8, 0xff, 0xf7, 0x78, 0xff, 0x01, 0x21, 0x00, 0xf0, 0x4d, 0xfb, + 0x85, 0xb1, 0xef, 0xf3, 0x10, 0x80, 0x72, 0xb6, 0xdf, 0xf8, 0x18, 0x17, + 0x0a, 0x78, 0xff, 0x23, 0x0b, 0x70, 0x80, 0xf3, 0x10, 0x88, 0x01, 0x22, + 0x7c, 0x21, 0xdf, 0xf8, 0x0c, 0x07, 0x00, 0xf0, 0xd8, 0xf8, 0x04, 0x46, + 0x00, 0xf0, 0x6d, 0xbb, 0x00, 0x23, 0x4f, 0xf0, 0xff, 0x32, 0x00, 0x21, + 0x18, 0x30, 0x36, 0xe7, 0x2d, 0xe9, 0xf0, 0x41, 0x04, 0x46, 0x0d, 0x46, + 0x16, 0x46, 0xff, 0xf7, 0x60, 0xff, 0x00, 0xf0, 0x53, 0xf8, 0x18, 0xbf, + 0x4b, 0xf2, 0x01, 0x18, 0x1e, 0xd1, 0xdf, 0xf8, 0xdc, 0x76, 0x01, 0x2d, + 0x0c, 0xbf, 0xbc, 0x73, 0xfc, 0x73, 0x01, 0x2e, 0x16, 0xd1, 0x01, 0x2d, + 0x0c, 0xbf, 0x25, 0x46, 0x00, 0x25, 0x04, 0x20, 0xfe, 0xf7, 0x43, 0xfe, + 0x00, 0xf0, 0x43, 0xf8, 0x38, 0x78, 0x20, 0x40, 0xa8, 0x42, 0x06, 0xd0, + 0x04, 0x20, 0xfe, 0xf7, 0x18, 0xff, 0x00, 0x28, 0xf6, 0xd0, 0x4b, 0xf2, + 0x02, 0x18, 0x04, 0x20, 0xfe, 0xf7, 0xb1, 0xfe, 0x2b, 0xe0, 0x2d, 0xe9, + 0xf0, 0x41, 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0xff, 0xf7, 0x27, 0xff, + 0x00, 0xf0, 0x26, 0xf8, 0x18, 0xbf, 0x4b, 0xf2, 0x01, 0x18, 0x1e, 0xd1, + 0xdf, 0xf8, 0x84, 0x76, 0x01, 0x2d, 0x0c, 0xbf, 0x3c, 0x72, 0x7c, 0x72, + 0x01, 0x2e, 0x16, 0xd1, 0x01, 0x2d, 0x0c, 0xbf, 0x25, 0x46, 0x00, 0x25, + 0x04, 0x20, 0xfe, 0xf7, 0x16, 0xfe, 0x00, 0xf0, 0x16, 0xf8, 0x38, 0x78, + 0x20, 0x40, 0xa8, 0x42, 0x06, 0xd0, 0x04, 0x20, 0xfe, 0xf7, 0xeb, 0xfe, + 0x00, 0x28, 0xf6, 0xd0, 0x4b, 0xf2, 0x02, 0x18, 0x04, 0x20, 0xfe, 0xf7, + 0x84, 0xfe, 0x40, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x20, 0x40, 0x4f, 0xf0, + 0x00, 0x08, 0xa0, 0x42, 0x70, 0x47, 0xc8, 0x21, 0x04, 0x20, 0x1b, 0xe7, + 0x2d, 0xe9, 0xf0, 0x41, 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0xff, 0xf7, + 0x08, 0xff, 0xff, 0xf7, 0xef, 0xff, 0x18, 0xbf, 0x4b, 0xf2, 0x01, 0x18, + 0x20, 0xd1, 0xdf, 0xf8, 0x1c, 0x76, 0x01, 0x2d, 0x0c, 0xbf, 0x3c, 0x75, + 0x7c, 0x75, 0x01, 0x2e, 0x18, 0xd1, 0x01, 0x2d, 0x0c, 0xbf, 0x25, 0x46, + 0x00, 0x25, 0x04, 0x20, 0xfe, 0xf7, 0xdf, 0xfd, 0xff, 0xf7, 0xdf, 0xff, + 0x38, 0x78, 0x00, 0xf0, 0x03, 0x00, 0x20, 0x40, 0xa8, 0x42, 0x06, 0xd0, + 0x04, 0x20, 0xfe, 0xf7, 0xb2, 0xfe, 0x00, 0x28, 0xf4, 0xd0, 0x4b, 0xf2, + 0x02, 0x18, 0x04, 0x20, 0xfe, 0xf7, 0x4b, 0xfe, 0xc5, 0xe7, 0x70, 0xb5, + 0x04, 0x46, 0x0d, 0x46, 0xff, 0xf7, 0xcf, 0xfe, 0x00, 0x26, 0x20, 0x40, + 0xa0, 0x42, 0x18, 0xbf, 0x4b, 0xf2, 0x01, 0x16, 0x05, 0xd1, 0xdf, 0xf8, + 0xc4, 0x05, 0x01, 0x2d, 0x0c, 0xbf, 0x04, 0x70, 0x44, 0x70, 0x30, 0x46, + 0x70, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0xff, 0xf7, 0xaf, 0xfe, + 0x00, 0x26, 0x20, 0x40, 0xa0, 0x42, 0x18, 0xbf, 0x4b, 0xf2, 0x01, 0x16, + 0x05, 0xd1, 0xdf, 0xf8, 0xa0, 0x05, 0x01, 0x2d, 0x0c, 0xbf, 0x04, 0x70, + 0x44, 0x70, 0x30, 0x46, 0x70, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, + 0xff, 0xf7, 0xb3, 0xfe, 0x00, 0x26, 0x20, 0x40, 0xa0, 0x42, 0x18, 0xbf, + 0x4b, 0xf2, 0x01, 0x16, 0x05, 0xd1, 0xdf, 0xf8, 0x7c, 0x05, 0x01, 0x2d, + 0x0c, 0xbf, 0x04, 0x70, 0x44, 0x70, 0x30, 0x46, 0x70, 0xbd, 0x2d, 0xe9, + 0xf0, 0x4e, 0x82, 0x46, 0x14, 0x46, 0x00, 0x26, 0x41, 0xf0, 0x80, 0x49, + 0x00, 0x27, 0x40, 0xf6, 0xb8, 0x35, 0x06, 0x20, 0xfe, 0xf7, 0xb2, 0xfc, + 0x83, 0x46, 0x00, 0xf0, 0x37, 0xf8, 0x58, 0xb1, 0x58, 0x46, 0x80, 0xf3, + 0x11, 0x88, 0x01, 0x20, 0xfe, 0xf7, 0x6c, 0xfe, 0x7f, 0x1c, 0xaf, 0x42, + 0xef, 0xd3, 0x4b, 0xf2, 0x0e, 0x16, 0x21, 0xe0, 0xca, 0xf8, 0x00, 0x90, + 0x58, 0x46, 0x80, 0xf3, 0x11, 0x88, 0x01, 0x2c, 0x1f, 0xd1, 0x00, 0xf0, + 0x21, 0xf8, 0x04, 0x00, 0x04, 0xd0, 0x01, 0x20, 0xfe, 0xf7, 0x58, 0xfe, + 0x6d, 0x1e, 0xf6, 0xd1, 0x4f, 0xf0, 0x00, 0x42, 0x1f, 0x21, 0x50, 0x46, + 0xff, 0xf7, 0x30, 0xfe, 0x38, 0xb1, 0xdf, 0xf8, 0x08, 0x15, 0x50, 0x46, + 0x00, 0xf0, 0x21, 0xf8, 0x06, 0x00, 0x03, 0xd1, 0x07, 0xe0, 0x34, 0xb1, + 0x4b, 0xf2, 0x02, 0x16, 0x02, 0x22, 0x31, 0x46, 0x01, 0x20, 0x01, 0xf0, + 0xe9, 0xff, 0x30, 0x46, 0xbd, 0xe8, 0xf0, 0x8e, 0x4f, 0xf0, 0x80, 0x42, + 0x1e, 0x21, 0x50, 0x46, 0x16, 0xe6, 0xdf, 0xf8, 0xdc, 0x34, 0xff, 0xe7, + 0x53, 0xf8, 0x20, 0x00, 0xad, 0xe7, 0xdf, 0xf8, 0xd4, 0x34, 0xf9, 0xe7, + 0x0a, 0x46, 0x01, 0x46, 0xdf, 0xf8, 0xa4, 0x04, 0xa5, 0xe7, 0x80, 0xb5, + 0x02, 0x68, 0xd2, 0x0f, 0x0a, 0x70, 0x00, 0xf1, 0x50, 0x03, 0x00, 0xf1, + 0x14, 0x02, 0x12, 0x68, 0x4a, 0x70, 0x1a, 0x68, 0x02, 0xf0, 0xff, 0x02, + 0x8a, 0x60, 0x00, 0xf0, 0x02, 0xf8, 0x00, 0x20, 0x02, 0xbd, 0x1f, 0xb5, + 0x03, 0x46, 0x88, 0x68, 0x02, 0x90, 0x03, 0x20, 0x4a, 0x78, 0x01, 0x92, + 0x0c, 0x78, 0xdf, 0xf8, 0x94, 0x24, 0x00, 0x94, 0xb1, 0x21, 0xf4, 0xf7, + 0x3c, 0xfc, 0x1f, 0xbd, 0x0a, 0x46, 0x29, 0x21, 0xcd, 0xe7, 0x0a, 0x46, + 0x2b, 0x21, 0xca, 0xe7, 0x0a, 0x46, 0x2c, 0x21, 0xc7, 0xe7, 0x0a, 0x46, + 0x12, 0x21, 0xc4, 0xe7, 0x0a, 0x46, 0x11, 0x21, 0xc1, 0xe7, 0x02, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x4b, 0xf2, 0x0f, 0x10, 0x70, 0x47, + 0x70, 0xb5, 0x00, 0xf0, 0x19, 0xf8, 0x0d, 0xda, 0x02, 0x29, 0x0b, 0xd2, + 0x00, 0xf0, 0x1b, 0xf8, 0x00, 0xf0, 0x1f, 0xf8, 0x00, 0xf0, 0x0a, 0xf8, + 0x00, 0xf0, 0x12, 0xf8, 0x30, 0x46, 0xfe, 0xf7, 0xf6, 0xfb, 0x01, 0xe0, + 0x4b, 0xf2, 0x01, 0x15, 0x28, 0x46, 0x70, 0xbd, 0x01, 0x21, 0x01, 0xfa, + 0x04, 0xf4, 0x44, 0xea, 0x00, 0x01, 0x70, 0x47, 0x00, 0x25, 0x08, 0x28, + 0x04, 0x46, 0x70, 0x47, 0x30, 0x46, 0xfe, 0xf7, 0x24, 0xbc, 0xdf, 0xf8, + 0xd8, 0x23, 0x02, 0xeb, 0x01, 0x11, 0x8e, 0x6a, 0x70, 0x47, 0x30, 0x46, + 0xfe, 0xf7, 0x46, 0xbc, 0x2d, 0xe9, 0xf0, 0x41, 0x00, 0x29, 0x07, 0xbf, + 0x08, 0x26, 0xdf, 0xf8, 0xc4, 0x83, 0x02, 0x26, 0xdf, 0xf8, 0xc0, 0x83, + 0x04, 0x46, 0x15, 0x46, 0x00, 0x27, 0x09, 0xe0, 0x24, 0xfa, 0x07, 0xf0, + 0xc0, 0x07, 0x04, 0xd5, 0x58, 0xf8, 0x27, 0x00, 0x2b, 0x46, 0xff, 0xf7, + 0x58, 0xfe, 0x7f, 0x1c, 0xb7, 0x42, 0xf3, 0xd3, 0x00, 0x20, 0xbd, 0xe8, + 0xf0, 0x81, 0x02, 0x46, 0x08, 0x2a, 0x4b, 0xf2, 0x01, 0x10, 0x05, 0xd2, + 0xdf, 0xf8, 0x84, 0x03, 0x00, 0xeb, 0x02, 0x12, 0x00, 0x20, 0xd1, 0x60, + 0x70, 0x47, 0x02, 0x46, 0x02, 0x2a, 0x4b, 0xf2, 0x01, 0x10, 0x05, 0xd2, + 0xdf, 0xf8, 0x68, 0x03, 0x00, 0xeb, 0x02, 0x12, 0x00, 0x20, 0xd1, 0x64, + 0x70, 0x47, 0x10, 0xb5, 0xdf, 0xf8, 0x5c, 0x43, 0xa0, 0x68, 0xfe, 0xf7, + 0x5a, 0xfb, 0xe0, 0x68, 0x00, 0xb1, 0x0a, 0xe0, 0x10, 0xbd, 0x10, 0xb5, + 0xdf, 0xf8, 0x48, 0x43, 0xa0, 0x69, 0xfe, 0xf7, 0x50, 0xfb, 0xe0, 0x69, + 0x00, 0xb1, 0x00, 0xe0, 0x10, 0xbd, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x47, + 0x10, 0xb5, 0xdf, 0xf8, 0x30, 0x43, 0xa0, 0x6a, 0xfe, 0xf7, 0x43, 0xfb, + 0xe0, 0x6a, 0x00, 0xb1, 0xf3, 0xe7, 0x10, 0xbd, 0x10, 0xb5, 0xdf, 0xf8, + 0x1c, 0x43, 0xa0, 0x6b, 0xfe, 0xf7, 0x39, 0xfb, 0xe0, 0x6b, 0x00, 0xb1, + 0xe9, 0xe7, 0x10, 0xbd, 0x10, 0xb5, 0xdf, 0xf8, 0x08, 0x43, 0xa0, 0x6c, + 0xfe, 0xf7, 0x2f, 0xfb, 0xe0, 0x6c, 0x00, 0xb1, 0xdf, 0xe7, 0x10, 0xbd, + 0x10, 0xb5, 0xbd, 0x4c, 0xa0, 0x6d, 0xfe, 0xf7, 0x26, 0xfb, 0xe0, 0x6d, + 0x00, 0xb1, 0xd6, 0xe7, 0x10, 0xbd, 0x10, 0xb5, 0xb8, 0x4c, 0xa0, 0x6e, + 0xfe, 0xf7, 0x1d, 0xfb, 0xe0, 0x6e, 0x00, 0xb1, 0xcd, 0xe7, 0x10, 0xbd, + 0x10, 0xb5, 0xb4, 0x4c, 0xa0, 0x6f, 0xfe, 0xf7, 0x14, 0xfb, 0xe0, 0x6f, + 0x00, 0xb1, 0xc4, 0xe7, 0x10, 0xbd, 0x10, 0xb5, 0xae, 0x4c, 0xa0, 0x68, + 0xfe, 0xf7, 0x0b, 0xfb, 0xe0, 0x68, 0x00, 0xb1, 0xbb, 0xe7, 0x10, 0xbd, + 0x10, 0xb5, 0xaa, 0x4c, 0xa0, 0x6a, 0xfe, 0xf7, 0x02, 0xfb, 0xe0, 0x6a, + 0x00, 0xb1, 0xb2, 0xe7, 0x10, 0xbd, 0x10, 0xb5, 0xa5, 0x4c, 0xa0, 0x6c, + 0xfe, 0xf7, 0xf9, 0xfa, 0xe0, 0x6c, 0x00, 0xb1, 0xa9, 0xe7, 0x10, 0xbd, + 0x10, 0xb5, 0xa1, 0x4c, 0xa0, 0x69, 0xfe, 0xf7, 0xf0, 0xfa, 0xe0, 0x69, + 0x00, 0xb1, 0xa0, 0xe7, 0x10, 0xbd, 0x10, 0xb5, 0x9c, 0x4c, 0xa0, 0x6b, + 0xfe, 0xf7, 0xe7, 0xfa, 0xe0, 0x6b, 0x00, 0xb1, 0x97, 0xe7, 0x10, 0xbd, + 0x10, 0xb5, 0x98, 0x4c, 0xa0, 0x6d, 0xfe, 0xf7, 0xde, 0xfa, 0xe0, 0x6d, + 0x00, 0xb1, 0x8e, 0xe7, 0x10, 0xbd, 0x2d, 0xe9, 0xf0, 0x47, 0x04, 0x46, + 0xff, 0xf7, 0xff, 0xfc, 0x80, 0x46, 0xff, 0xf7, 0xf6, 0xfc, 0x07, 0x46, + 0xff, 0xf7, 0x01, 0xfd, 0x81, 0x46, 0x9e, 0x48, 0x0f, 0xf2, 0x80, 0x2a, + 0x01, 0x68, 0x9d, 0x48, 0x21, 0x60, 0x01, 0x26, 0x43, 0xf6, 0xfc, 0x71, + 0x11, 0xf0, 0x4c, 0xfe, 0x60, 0x60, 0x00, 0x25, 0x28, 0xfa, 0x05, 0xf0, + 0xc0, 0x07, 0x0d, 0xd5, 0x5a, 0xf8, 0x25, 0x00, 0x00, 0xf2, 0xfc, 0x71, + 0x0a, 0x68, 0x44, 0xf8, 0x36, 0x20, 0x40, 0xf2, 0xfc, 0x71, 0x11, 0xf0, + 0x3b, 0xfe, 0x21, 0x1d, 0x41, 0xf8, 0x36, 0x00, 0x76, 0x1c, 0x6d, 0x1c, + 0x08, 0x2d, 0xe9, 0xd1, 0x00, 0x25, 0x0f, 0xf2, 0x5c, 0x28, 0x27, 0xfa, + 0x05, 0xf0, 0xc0, 0x07, 0x0d, 0xd5, 0x58, 0xf8, 0x25, 0x00, 0x00, 0xf6, + 0xfc, 0x71, 0x0a, 0x68, 0x44, 0xf8, 0x36, 0x20, 0x40, 0xf6, 0xfc, 0x71, + 0x11, 0xf0, 0x22, 0xfe, 0x21, 0x1d, 0x41, 0xf8, 0x36, 0x00, 0x76, 0x1c, + 0x6d, 0x1c, 0x08, 0x2d, 0xe9, 0xd1, 0x0f, 0xf2, 0x4c, 0x28, 0x00, 0x25, + 0x41, 0xf6, 0xfc, 0x77, 0x29, 0xfa, 0x05, 0xf0, 0xc0, 0x07, 0x0a, 0xd5, + 0x58, 0xf8, 0x25, 0x00, 0x3a, 0x58, 0x44, 0xf8, 0x36, 0x20, 0x39, 0x46, + 0x11, 0xf0, 0x0a, 0xfe, 0x21, 0x1d, 0x41, 0xf8, 0x36, 0x00, 0x76, 0x1c, + 0x6d, 0x1c, 0x02, 0x2d, 0xec, 0xd1, 0xbd, 0xe8, 0xf0, 0x87, 0xf8, 0xb5, + 0x04, 0x46, 0xff, 0xf7, 0x9e, 0xfc, 0x06, 0x46, 0xff, 0xf7, 0x95, 0xfc, + 0x05, 0x46, 0xff, 0xf7, 0xa0, 0xfc, 0x01, 0x46, 0x23, 0x68, 0x67, 0x68, + 0x01, 0x20, 0x00, 0x22, 0xbb, 0x42, 0x34, 0xd1, 0x00, 0x23, 0x52, 0x1c, + 0x26, 0xfa, 0x03, 0xf7, 0xff, 0x07, 0x07, 0xd5, 0x04, 0xf1, 0x04, 0x0c, + 0x54, 0xf8, 0x32, 0x70, 0x5c, 0xf8, 0x32, 0xe0, 0x77, 0x45, 0x26, 0xd1, + 0x5b, 0x1c, 0xdf, 0xb2, 0x08, 0x2f, 0xee, 0xd1, 0x00, 0x23, 0x52, 0x1c, + 0x25, 0xfa, 0x03, 0xf6, 0xf7, 0x07, 0x06, 0xd5, 0x27, 0x1d, 0x54, 0xf8, + 0x32, 0x60, 0x57, 0xf8, 0x32, 0x70, 0xbe, 0x42, 0x15, 0xd1, 0x5b, 0x1c, + 0xde, 0xb2, 0x08, 0x2e, 0xef, 0xd1, 0x00, 0x23, 0x52, 0x1c, 0x21, 0xfa, + 0x03, 0xf5, 0xee, 0x07, 0x06, 0xd5, 0x26, 0x1d, 0x54, 0xf8, 0x32, 0x50, + 0x56, 0xf8, 0x32, 0x70, 0xbd, 0x42, 0x04, 0xd1, 0x5b, 0x1c, 0xdd, 0xb2, + 0x02, 0x2d, 0xef, 0xd1, 0xf2, 0xbd, 0x00, 0x20, 0xf2, 0xbd, 0x2d, 0xe9, + 0xf0, 0x41, 0x04, 0x46, 0x0d, 0x46, 0x90, 0x46, 0x00, 0x27, 0x19, 0xe0, + 0xb0, 0x68, 0xfe, 0xf7, 0x77, 0xfa, 0x14, 0xe0, 0x00, 0x2c, 0x05, 0xeb, + 0x07, 0x16, 0xf7, 0xd0, 0x30, 0x68, 0x01, 0x28, 0xf4, 0xd1, 0xb0, 0x68, + 0x21, 0x46, 0xfe, 0xf7, 0xa0, 0xfa, 0xb0, 0x68, 0xfe, 0xf7, 0x0c, 0xfa, + 0x71, 0x68, 0xb0, 0x68, 0xfe, 0xf7, 0x73, 0xfa, 0xb0, 0x68, 0xfe, 0xf7, + 0x56, 0xfa, 0x7f, 0x1c, 0x47, 0x45, 0xe7, 0xd3, 0xbd, 0xe8, 0xf0, 0x81, + 0x01, 0x21, 0xca, 0x20, 0x0a, 0xe6, 0x01, 0x21, 0xcb, 0x20, 0x07, 0xe6, + 0x01, 0x21, 0xcc, 0x20, 0x04, 0xe6, 0x02, 0x28, 0x00, 0xd3, 0x0d, 0xe0, + 0x00, 0x28, 0x0c, 0xbf, 0x69, 0x20, 0x6a, 0x20, 0x06, 0xe0, 0x02, 0x28, + 0x00, 0xd3, 0x05, 0xe0, 0x00, 0x28, 0x0c, 0xbf, 0x6b, 0x20, 0x6c, 0x20, + 0x01, 0x21, 0xf3, 0xe5, 0x4b, 0xf2, 0x01, 0x10, 0x70, 0x47, 0x2d, 0xe9, + 0xf8, 0x43, 0x05, 0x46, 0x0e, 0x46, 0xff, 0xf7, 0x22, 0xfc, 0x00, 0x24, + 0x28, 0x40, 0xa8, 0x42, 0x18, 0xbf, 0x4b, 0xf2, 0x01, 0x14, 0x26, 0xd1, + 0x01, 0x2e, 0x0c, 0xbf, 0x00, 0x26, 0x01, 0x26, 0x00, 0x27, 0xdf, 0xf8, + 0x9c, 0x80, 0x25, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x18, 0xd5, 0x58, 0xf8, + 0x27, 0x00, 0x00, 0xf1, 0x24, 0x09, 0x33, 0x46, 0x4f, 0xf4, 0x80, 0x12, + 0x14, 0x21, 0x48, 0x46, 0xff, 0xf7, 0xe1, 0xfb, 0x33, 0x46, 0x4f, 0xf0, + 0x80, 0x72, 0x18, 0x21, 0x48, 0x46, 0xff, 0xf7, 0xda, 0xfb, 0x33, 0x46, + 0x4f, 0xf0, 0x80, 0x52, 0x1c, 0x21, 0x48, 0x46, 0xff, 0xf7, 0xd3, 0xfb, + 0x7f, 0x1c, 0x08, 0x2f, 0xdf, 0xd3, 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x83, + 0x00, 0x00, 0x00, 0x00, 0x5c, 0x75, 0x02, 0x21, 0x58, 0x75, 0x02, 0x21, + 0x14, 0x8a, 0x00, 0x21, 0x74, 0x8a, 0x00, 0x21, 0xe0, 0x96, 0x04, 0x02, + 0xdc, 0x9e, 0x04, 0x02, 0x98, 0x00, 0x00, 0x47, 0x00, 0x00, 0xb0, 0x46, + 0x0a, 0x06, 0x00, 0x47, 0x08, 0x06, 0x00, 0x47, 0x0c, 0x06, 0x00, 0x47, + 0x1b, 0x06, 0x00, 0x47, 0x13, 0x06, 0x00, 0x47, 0x23, 0x06, 0x00, 0x47, + 0x98, 0x75, 0x02, 0x21, 0xa0, 0x99, 0x04, 0x02, 0xd4, 0x9e, 0x04, 0x02, + 0x00, 0x1f, 0x00, 0x02, 0xfc, 0x3f, 0xa0, 0x46, 0x00, 0x00, 0xa0, 0x46, + 0xc0, 0x97, 0x04, 0x02, 0x00, 0x00, 0x02, 0x60, 0x00, 0x00, 0x12, 0x60, + 0x00, 0x00, 0x22, 0x60, 0x00, 0x00, 0x32, 0x60, 0x00, 0x00, 0x42, 0x60, + 0x00, 0x00, 0x52, 0x60, 0x00, 0x00, 0x62, 0x60, 0x00, 0x00, 0x72, 0x60, + 0x00, 0x00, 0x82, 0x60, 0x00, 0x00, 0x92, 0x60, 0x00, 0x00, 0xa2, 0x60, + 0x00, 0x00, 0xb2, 0x60, 0x00, 0x00, 0xc2, 0x60, 0x00, 0x00, 0xd2, 0x60, + 0x00, 0x00, 0xe2, 0x60, 0x00, 0x00, 0xf2, 0x60, 0x00, 0x00, 0x02, 0x61, + 0x00, 0x00, 0x12, 0x61, 0x00, 0x68, 0x02, 0x40, 0x22, 0xfa, 0x01, 0xf0, + 0x70, 0x47, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, + 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, + 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x15, 0x46, + 0x1e, 0x46, 0x4f, 0xf4, 0x52, 0x70, 0x28, 0x60, 0x00, 0x22, 0x32, 0x70, + 0xa1, 0xb1, 0x20, 0x46, 0x00, 0xf0, 0x22, 0xf8, 0x01, 0x28, 0x09, 0xd1, + 0xdf, 0xf8, 0x70, 0x04, 0x21, 0x46, 0x50, 0xf8, 0x21, 0x20, 0x52, 0xf8, + 0x08, 0x1f, 0xc1, 0xf3, 0x09, 0x01, 0x0d, 0xe0, 0x02, 0x28, 0x12, 0xd1, + 0x20, 0x46, 0x00, 0xf0, 0x2e, 0xf8, 0x0d, 0xe0, 0xdf, 0xf8, 0x54, 0x04, + 0x00, 0xeb, 0x84, 0x00, 0x01, 0x78, 0x40, 0x78, 0x41, 0xea, 0x00, 0x21, + 0x29, 0x60, 0x20, 0x46, 0x00, 0xf0, 0xf6, 0xf9, 0x00, 0xf0, 0x7f, 0x00, + 0x30, 0x70, 0x70, 0xbd, 0xdf, 0xf8, 0x30, 0x14, 0x51, 0xf8, 0x20, 0x00, + 0x23, 0xe1, 0xdf, 0xf8, 0x30, 0x14, 0x08, 0x5c, 0x70, 0x47, 0x38, 0xb5, + 0x0b, 0x46, 0xdf, 0xf8, 0x1c, 0x14, 0xdf, 0xf8, 0x20, 0x54, 0x51, 0xf8, + 0x20, 0x40, 0x19, 0x00, 0x18, 0xbf, 0x01, 0x21, 0x29, 0x54, 0x20, 0x46, + 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x4f, 0xf0, 0x00, 0x42, 0x1f, 0x21, + 0xa5, 0xe7, 0x80, 0xb5, 0xdf, 0xf8, 0xf4, 0x33, 0x53, 0xf8, 0x20, 0x00, + 0x4f, 0xf4, 0xfe, 0x42, 0x08, 0x21, 0x0c, 0x30, 0xff, 0xf7, 0x96, 0xff, + 0xc0, 0xb2, 0x02, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0xff, 0xf7, + 0xd1, 0xff, 0x00, 0x26, 0x01, 0x28, 0x10, 0xd1, 0x2b, 0x46, 0xdf, 0xf8, + 0xcc, 0x03, 0x25, 0x46, 0x50, 0xf8, 0x25, 0x00, 0x40, 0xf2, 0xff, 0x32, + 0x00, 0x21, 0x08, 0x30, 0xff, 0xf7, 0x85, 0xff, 0x01, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0xc7, 0xff, 0x01, 0xe0, 0x4b, 0xf6, 0x01, 0x26, 0x30, 0x46, + 0x70, 0xbd, 0xdf, 0xf8, 0xb0, 0x13, 0x81, 0xb0, 0x51, 0xf8, 0x20, 0x00, + 0x14, 0x30, 0x00, 0x68, 0x00, 0x90, 0x00, 0x98, 0x40, 0x0b, 0x00, 0xf0, + 0x01, 0x00, 0x01, 0xb0, 0x70, 0x47, 0xdf, 0xf8, 0x88, 0x13, 0x51, 0xf8, + 0x20, 0x00, 0x08, 0x30, 0x00, 0x68, 0xc0, 0xf3, 0x09, 0x00, 0x70, 0x47, + 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0xff, 0xf7, 0x9d, 0xff, 0x68, 0x70, + 0x01, 0x23, 0xdf, 0xf8, 0x70, 0x03, 0x02, 0x5d, 0xaa, 0x70, 0x2b, 0x70, + 0x20, 0x46, 0xff, 0xf7, 0xe8, 0xff, 0xa8, 0x80, 0x00, 0x20, 0x32, 0xbd, + 0x38, 0xb5, 0x00, 0x24, 0x03, 0x29, 0x0b, 0x46, 0x08, 0xd0, 0xdf, 0xf8, + 0x48, 0x53, 0x55, 0xf8, 0x20, 0x00, 0x03, 0x22, 0x00, 0x21, 0xff, 0xf7, + 0x46, 0xff, 0x01, 0xe0, 0x4b, 0xf6, 0x01, 0x24, 0x20, 0x46, 0x32, 0xbd, + 0x2d, 0xe9, 0xf8, 0x4f, 0xdf, 0xf8, 0x3c, 0xa3, 0xdf, 0xf8, 0x3c, 0x13, + 0xda, 0xf8, 0x00, 0x70, 0x0d, 0x68, 0xd7, 0xf8, 0xb8, 0x00, 0xdf, 0xf8, + 0x34, 0x13, 0x05, 0x40, 0x38, 0x69, 0x88, 0x42, 0x05, 0xf0, 0xff, 0x05, + 0x4f, 0xf0, 0x00, 0x09, 0x28, 0xbf, 0x02, 0x20, 0x05, 0xd2, 0xdf, 0xf8, + 0x20, 0x13, 0x88, 0x42, 0x80, 0x41, 0xc0, 0x43, 0xc0, 0x0f, 0x00, 0xee, + 0x10, 0x0a, 0xf8, 0xee, 0x40, 0x0a, 0xb0, 0xee, 0x00, 0x0a, 0xfd, 0xf7, + 0x77, 0xf8, 0x38, 0x69, 0x00, 0xee, 0x90, 0x0a, 0xf8, 0xee, 0x60, 0x0a, + 0x9f, 0xed, 0x9d, 0x1a, 0x60, 0xee, 0x81, 0x0a, 0x80, 0xee, 0x80, 0x0a, + 0x03, 0xf0, 0x14, 0xf9, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x6a, + 0xf6, 0xb2, 0x0a, 0x2e, 0x38, 0xbf, 0x0a, 0x26, 0x02, 0xd3, 0x10, 0x2e, + 0x28, 0xbf, 0x0f, 0x26, 0x00, 0x24, 0x25, 0xfa, 0x04, 0xf0, 0xc0, 0x07, + 0x54, 0xd5, 0x01, 0x21, 0xe0, 0xb2, 0xff, 0xf7, 0xa7, 0xff, 0x5f, 0xea, + 0x00, 0x09, 0x54, 0xd1, 0xa6, 0x48, 0xe7, 0xb2, 0x50, 0xf8, 0x27, 0x80, + 0x08, 0xf1, 0x10, 0x0b, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, + 0x50, 0xf8, 0x1e, 0x23, 0xfc, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x4b, 0xf8, + 0x33, 0x46, 0x00, 0xf0, 0x45, 0xf8, 0x08, 0xf1, 0x14, 0x0b, 0x02, 0x23, + 0x00, 0xf0, 0x40, 0xf8, 0x33, 0x46, 0x4f, 0xf4, 0x70, 0x42, 0x0c, 0x21, + 0x00, 0xf0, 0x3d, 0xf8, 0xd1, 0x23, 0x4f, 0xf4, 0x7f, 0x02, 0x10, 0x21, + 0x00, 0xf0, 0x37, 0xf8, 0xda, 0xf8, 0x00, 0x00, 0xc1, 0x19, 0xed, 0x23, + 0x91, 0xf8, 0xbc, 0x20, 0x5a, 0x43, 0x10, 0x44, 0x00, 0xf2, 0x44, 0x47, + 0xe0, 0xb2, 0x97, 0xf8, 0xe9, 0x10, 0xc9, 0x1c, 0xc9, 0xb2, 0x00, 0xf0, + 0x2c, 0xf8, 0x97, 0xf8, 0xe9, 0x10, 0x49, 0x1c, 0xc9, 0xb2, 0xe0, 0xb2, + 0x00, 0xf0, 0x32, 0xf8, 0x40, 0xf2, 0x47, 0x33, 0x40, 0xf2, 0xff, 0x32, + 0x00, 0x21, 0x08, 0xf1, 0x08, 0x00, 0xff, 0xf7, 0xb2, 0xfe, 0x00, 0x21, + 0xe0, 0xb2, 0xff, 0xf7, 0xf4, 0xfe, 0xe0, 0xb2, 0xff, 0xf7, 0xe8, 0xfe, + 0x01, 0x28, 0x04, 0xd1, 0x64, 0x1c, 0xe0, 0xb2, 0x08, 0x28, 0xa2, 0xdb, + 0x01, 0xe0, 0x4b, 0xf6, 0x01, 0x29, 0x48, 0x46, 0xbd, 0xe8, 0xf2, 0x8f, + 0x4f, 0xf4, 0x70, 0x62, 0x08, 0x21, 0x58, 0x46, 0x99, 0xe6, 0x00, 0x68, + 0x00, 0xf0, 0x03, 0x00, 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, 0x06, 0xf8, + 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0xff, 0x22, 0x00, 0x21, 0x0c, 0xe0, + 0x71, 0x4c, 0x54, 0xf8, 0x20, 0x00, 0x70, 0x47, 0x10, 0xb5, 0xff, 0xf7, + 0xf9, 0xff, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x4f, 0xf4, 0x7f, 0x42, + 0x08, 0x21, 0x00, 0x1d, 0x7d, 0xe6, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x41, + 0x6d, 0x49, 0x2d, 0xed, 0x06, 0x8b, 0x0a, 0x68, 0xd2, 0xf8, 0xb8, 0x50, + 0x00, 0x26, 0x00, 0x28, 0x05, 0xf0, 0xff, 0x05, 0xf2, 0xee, 0x0c, 0x9a, + 0x00, 0xf0, 0x8e, 0x80, 0x00, 0x24, 0x9f, 0xed, 0x5a, 0x8a, 0x69, 0x4f, + 0xdf, 0xed, 0x59, 0x8a, 0x40, 0xf6, 0xff, 0x78, 0x9f, 0xed, 0x58, 0xaa, + 0xb2, 0xee, 0x04, 0x9a, 0xa4, 0xf5, 0x51, 0x70, 0x04, 0x28, 0x38, 0xbf, + 0xdf, 0xed, 0x55, 0xaa, 0x14, 0xd3, 0x00, 0xf0, 0x7f, 0xf8, 0x20, 0xee, + 0x0a, 0x0a, 0xb1, 0xee, 0x04, 0x1a, 0x80, 0xee, 0x01, 0x0a, 0x03, 0xf0, + 0x55, 0xf8, 0xf0, 0xee, 0x40, 0xaa, 0x9f, 0xed, 0x4f, 0x0a, 0xf4, 0xee, + 0x40, 0xaa, 0xf1, 0xee, 0x10, 0xfa, 0xa8, 0xbf, 0xf0, 0xee, 0x4a, 0xaa, + 0xdf, 0xed, 0x4b, 0x0a, 0x6a, 0xee, 0xa0, 0x0a, 0xb1, 0xee, 0x04, 0x1a, + 0x20, 0xee, 0x81, 0x0a, 0xe5, 0xf7, 0x00, 0xfc, 0xf3, 0xee, 0x04, 0x0a, + 0x20, 0xee, 0x20, 0x0a, 0x30, 0xee, 0x69, 0x0a, 0xbb, 0xee, 0x04, 0x1a, + 0xc0, 0xee, 0x01, 0x0a, 0xb0, 0xee, 0x49, 0x0a, 0xfc, 0xf7, 0x88, 0xff, + 0xdf, 0xed, 0x40, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xf2, 0xf7, 0x0a, 0xfc, + 0xfc, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x90, 0x0a, 0x40, 0x45, 0x00, 0xd8, + 0x01, 0xd3, 0xb0, 0xee, 0x68, 0x0a, 0xbc, 0xee, 0xc0, 0x0a, 0xfc, 0xee, + 0xea, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0xb6, 0xf5, 0x48, 0x6f, 0x08, 0xbf, + 0x40, 0x46, 0x10, 0xee, 0x90, 0x1a, 0x09, 0x03, 0x01, 0xf4, 0xfe, 0x21, + 0x08, 0x43, 0x00, 0x21, 0x25, 0xfa, 0x01, 0xf2, 0xd2, 0x07, 0x44, 0xbf, + 0x57, 0xf8, 0x21, 0x30, 0xf0, 0x50, 0x49, 0x1c, 0x08, 0x29, 0xf5, 0xdb, + 0x36, 0x1d, 0x64, 0x1c, 0xb4, 0xf5, 0x52, 0x7f, 0x79, 0xee, 0x88, 0x9a, + 0x9a, 0xd3, 0xdf, 0xed, 0x25, 0x9a, 0x78, 0x24, 0x00, 0xf0, 0x1e, 0xf8, + 0x20, 0xee, 0x28, 0x0a, 0xf2, 0xf7, 0xd6, 0xfb, 0xbc, 0xee, 0xc0, 0x0a, + 0x00, 0x21, 0x10, 0xee, 0x10, 0x0a, 0x25, 0xfa, 0x01, 0xf2, 0xd2, 0x07, + 0x44, 0xbf, 0x57, 0xf8, 0x21, 0x30, 0xf0, 0x50, 0x49, 0x1c, 0x08, 0x29, + 0xf5, 0xdb, 0x36, 0x1d, 0x64, 0x1e, 0x79, 0xee, 0x88, 0x9a, 0xe5, 0xd1, + 0xbd, 0xec, 0x06, 0x8b, 0xbd, 0xe8, 0xf0, 0x81, 0xac, 0xc5, 0xa7, 0x37, + 0xb3, 0xee, 0x04, 0x0a, 0xc9, 0xee, 0x80, 0x0a, 0xb0, 0xee, 0x49, 0x0a, + 0xfc, 0xf7, 0x2c, 0xbf, 0x1c, 0x4a, 0x52, 0xf8, 0x20, 0x00, 0x40, 0xf2, + 0xbf, 0x32, 0x91, 0x42, 0x88, 0xbf, 0x11, 0x46, 0x00, 0xeb, 0x81, 0x00, + 0x02, 0x68, 0x12, 0x48, 0x00, 0xea, 0x02, 0x20, 0x40, 0xea, 0x01, 0x50, + 0xc2, 0xf3, 0x06, 0x31, 0x08, 0x43, 0x70, 0x47, 0x09, 0x4a, 0x52, 0xf8, + 0x20, 0x00, 0x40, 0xf8, 0x24, 0x1f, 0x70, 0x47, 0xcd, 0xcc, 0x4c, 0xbd, + 0x00, 0xf0, 0x7f, 0x45, 0x00, 0x00, 0x80, 0x42, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x80, 0x42, 0x00, 0x00, 0x80, 0x3c, 0x00, 0x00, 0x80, 0x45, + 0xa0, 0x98, 0x04, 0x02, 0xb3, 0x01, 0x00, 0x47, 0xe4, 0x75, 0x02, 0x21, + 0xc0, 0x99, 0x04, 0x02, 0x00, 0xff, 0x0f, 0x00, 0x5c, 0x75, 0x02, 0x21, + 0x58, 0x75, 0x02, 0x21, 0x41, 0x42, 0x0f, 0x00, 0x21, 0xa1, 0x07, 0x00, + 0x40, 0x98, 0x04, 0x02, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0xdf, 0xf8, 0xb4, 0x32, + 0x19, 0x68, 0x00, 0x22, 0x31, 0xb3, 0xdf, 0xf8, 0xb0, 0x12, 0x0b, 0x68, + 0x03, 0xf0, 0xff, 0x03, 0x03, 0x60, 0x0b, 0x69, 0x03, 0xf0, 0x07, 0x03, + 0x43, 0x60, 0x4b, 0x68, 0x03, 0xf0, 0xff, 0x03, 0x83, 0x60, 0x4b, 0x69, + 0x03, 0xf0, 0x07, 0x03, 0xc3, 0x60, 0x8b, 0x68, 0x03, 0xf0, 0x03, 0x03, + 0x03, 0x61, 0x8b, 0x69, 0x03, 0xf0, 0x07, 0x03, 0x43, 0x61, 0xcb, 0x68, + 0x03, 0xf0, 0x1f, 0x03, 0x83, 0x61, 0xcb, 0x69, 0x03, 0xf0, 0xff, 0x03, + 0xc3, 0x61, 0x09, 0x6a, 0x01, 0xf0, 0x07, 0x01, 0x01, 0x62, 0x01, 0xe0, + 0x4f, 0xf6, 0x0a, 0x72, 0x10, 0x46, 0x70, 0x47, 0xdf, 0xf8, 0x54, 0x12, + 0x09, 0x68, 0x00, 0x20, 0x59, 0xb1, 0x08, 0x60, 0x0f, 0x22, 0x07, 0x23, + 0x88, 0x60, 0x08, 0x61, 0x8a, 0x61, 0x48, 0x60, 0xc8, 0x60, 0x48, 0x61, + 0xc8, 0x61, 0x0b, 0x62, 0x70, 0x47, 0x4f, 0xf6, 0x0a, 0x70, 0x70, 0x47, + 0x38, 0xb5, 0xdf, 0xf8, 0x2c, 0x12, 0x04, 0x46, 0x08, 0x68, 0x00, 0x25, + 0x00, 0x28, 0x32, 0xd0, 0x23, 0x68, 0xdf, 0xf8, 0x20, 0x02, 0xff, 0x22, + 0x00, 0xf0, 0x32, 0xf8, 0x63, 0x68, 0xdf, 0xf8, 0x18, 0x02, 0x00, 0xf0, + 0x2c, 0xf8, 0xa3, 0x68, 0xdf, 0xf8, 0x10, 0x02, 0xff, 0x22, 0x00, 0xf0, + 0x27, 0xf8, 0xe3, 0x68, 0xdf, 0xf8, 0x08, 0x02, 0x00, 0xf0, 0x21, 0xf8, + 0x23, 0x69, 0xdf, 0xf8, 0x04, 0x02, 0x03, 0x22, 0x00, 0xf0, 0x1c, 0xf8, + 0x63, 0x69, 0xdf, 0xf8, 0xfc, 0x01, 0x00, 0xf0, 0x16, 0xf8, 0xa3, 0x69, + 0xdf, 0xf8, 0xf4, 0x01, 0x1f, 0x22, 0x00, 0xf0, 0x11, 0xf8, 0xe3, 0x69, + 0xdf, 0xf8, 0xec, 0x01, 0xff, 0x22, 0x00, 0xf0, 0x0b, 0xf8, 0x23, 0x6a, + 0xdf, 0xf8, 0xe4, 0x01, 0x00, 0xf0, 0x05, 0xf8, 0x01, 0xe0, 0x4f, 0xf6, + 0x0a, 0x75, 0x28, 0x46, 0x32, 0xbd, 0x07, 0x22, 0x00, 0x21, 0x6b, 0xe7, + 0x10, 0xb5, 0x04, 0x46, 0xf2, 0xf7, 0x09, 0xfe, 0x00, 0x28, 0x23, 0x46, + 0x4f, 0xf0, 0xff, 0x32, 0x07, 0xbf, 0x00, 0x21, 0xdf, 0xf8, 0xbc, 0x01, + 0x00, 0x21, 0xdf, 0xf8, 0xbc, 0x01, 0x0a, 0xe0, 0x10, 0xb5, 0x00, 0x28, + 0xdf, 0xf8, 0xb4, 0x41, 0x14, 0xbf, 0x01, 0x23, 0x00, 0x23, 0x4f, 0xf4, + 0x80, 0x72, 0x08, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x4f, 0xff, 0x00, 0x20, + 0x10, 0xbd, 0x38, 0xb5, 0xf2, 0xf7, 0xc3, 0xfd, 0x00, 0x28, 0x59, 0xd0, + 0x0f, 0xf2, 0xa4, 0x12, 0xff, 0x21, 0x03, 0x20, 0xf3, 0xf7, 0x9d, 0xfe, + 0xdf, 0xf8, 0x88, 0x01, 0x54, 0x4c, 0x00, 0x68, 0x0f, 0xf2, 0xa0, 0x12, + 0xdf, 0xf8, 0x80, 0x51, 0x20, 0x60, 0x00, 0xf1, 0x24, 0x01, 0x61, 0x60, + 0x0b, 0x46, 0xff, 0x21, 0x03, 0x20, 0xf3, 0xf7, 0x8c, 0xfe, 0x00, 0x20, + 0xff, 0xf7, 0xd2, 0xff, 0x02, 0x23, 0x03, 0x22, 0x00, 0x21, 0x56, 0x48, + 0xff, 0xf7, 0x28, 0xff, 0x20, 0x68, 0xff, 0xf7, 0x63, 0xff, 0x20, 0x68, + 0xff, 0xf7, 0x74, 0xff, 0x20, 0x68, 0xff, 0xf7, 0x2d, 0xff, 0x0f, 0xf2, + 0x80, 0x12, 0xff, 0x21, 0x03, 0x20, 0xf3, 0xf7, 0x74, 0xfe, 0x20, 0x68, + 0x41, 0x68, 0x00, 0x91, 0x2a, 0x46, 0x03, 0x68, 0x00, 0xf0, 0x25, 0xf8, + 0x20, 0x68, 0xc1, 0x68, 0x00, 0x91, 0x05, 0xf1, 0x2c, 0x02, 0x83, 0x68, + 0x00, 0xf0, 0x1d, 0xf8, 0x20, 0x68, 0x41, 0x69, 0x00, 0x91, 0x05, 0xf1, + 0x58, 0x02, 0x03, 0x69, 0x00, 0xf0, 0x15, 0xf8, 0x20, 0x68, 0xc1, 0x69, + 0x00, 0x91, 0x05, 0xf1, 0x84, 0x02, 0x83, 0x69, 0x00, 0xf0, 0x0d, 0xf8, + 0x20, 0x68, 0x0f, 0xf2, 0x50, 0x12, 0x03, 0x6a, 0xff, 0x21, 0x03, 0x20, + 0xf3, 0xf7, 0x4d, 0xfe, 0xbd, 0xe8, 0x32, 0x40, 0x01, 0x20, 0x91, 0xe7, + 0x31, 0xbd, 0xff, 0x21, 0x03, 0x20, 0xf3, 0xf7, 0x44, 0xbe, 0x38, 0x49, + 0x0a, 0x68, 0x82, 0xf4, 0x80, 0x72, 0x10, 0x43, 0x0a, 0x60, 0x01, 0xe0, + 0x40, 0xea, 0x01, 0x20, 0x40, 0xf0, 0x80, 0x50, 0x70, 0xe7, 0x38, 0xb5, + 0x04, 0x46, 0x0d, 0x46, 0x31, 0x48, 0x00, 0xea, 0x05, 0x20, 0x20, 0x43, + 0xff, 0xf7, 0x68, 0xff, 0x2d, 0x0c, 0x44, 0xea, 0x05, 0x20, 0xbd, 0xe8, + 0x32, 0x40, 0x61, 0xe7, 0x2d, 0xe9, 0xfc, 0x41, 0x00, 0xf0, 0x2e, 0xf8, + 0x00, 0x24, 0x80, 0xb1, 0x18, 0x4e, 0x00, 0xf0, 0x23, 0xf8, 0xfd, 0xf7, + 0xe2, 0xfc, 0x04, 0x00, 0x09, 0xd1, 0x00, 0x20, 0xff, 0xf7, 0x62, 0xff, + 0x30, 0x68, 0xff, 0xf7, 0x0d, 0xff, 0x04, 0x46, 0x01, 0x20, 0xff, 0xf7, + 0x5b, 0xff, 0x10, 0xe0, 0x2d, 0xe9, 0xfc, 0x41, 0x00, 0xf0, 0x16, 0xf8, + 0x00, 0x24, 0x50, 0xb1, 0x0c, 0x4e, 0x30, 0x68, 0xff, 0xf7, 0xba, 0xfe, + 0x04, 0x00, 0x04, 0xd1, 0x00, 0xf0, 0x06, 0xf8, 0xfd, 0xf7, 0xb0, 0xfc, + 0x04, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0xf6, 0x81, 0x00, 0x97, 0x43, 0x46, + 0x30, 0x68, 0x2a, 0x46, 0x24, 0x21, 0x70, 0x47, 0x05, 0x46, 0x88, 0x46, + 0x17, 0x46, 0xf2, 0xf7, 0x10, 0xbd, 0x00, 0x00, 0xdc, 0x75, 0x02, 0x21, + 0x04, 0x00, 0x40, 0x46, 0x14, 0x00, 0x40, 0x46, 0x08, 0x00, 0x40, 0x46, + 0x18, 0x00, 0x40, 0x46, 0x0c, 0x00, 0x40, 0x46, 0x1c, 0x00, 0x40, 0x46, + 0x10, 0x00, 0x40, 0x46, 0x20, 0x00, 0x40, 0x46, 0x24, 0x00, 0x40, 0x46, + 0x28, 0x00, 0x40, 0x46, 0x2c, 0x00, 0x40, 0x46, 0x00, 0x00, 0x40, 0x46, + 0x24, 0x65, 0x02, 0x21, 0xc0, 0x89, 0x04, 0x02, 0x28, 0x76, 0x02, 0x21, + 0x00, 0xff, 0xff, 0x00, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x5f, 0x49, 0x6e, + 0x69, 0x74, 0x28, 0x29, 0x0a, 0x00, 0x00, 0x00, 0x20, 0x20, 0x70, 0x54, + 0x65, 0x6c, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, + 0x20, 0x30, 0x78, 0x25, 0x30, 0x38, 0x58, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x54, 0x53, 0x20, 0x6d, 0x61, 0x73, 0x6b, + 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x58, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x70, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, 0xdf, 0xf8, 0xac, 0x55, + 0x06, 0x46, 0x2e, 0x70, 0xfe, 0xf7, 0x68, 0xfa, 0x04, 0x00, 0x04, 0xd1, + 0xfb, 0xf7, 0xa9, 0xfc, 0xfc, 0xf7, 0x2e, 0xff, 0x04, 0x46, 0x64, 0xb9, + 0x11, 0xf0, 0xfa, 0xf8, 0x04, 0x00, 0x03, 0xd1, 0x30, 0x46, 0xfe, 0xf7, + 0x75, 0xff, 0x04, 0x46, 0x1c, 0xb9, 0x30, 0x46, 0x11, 0xf0, 0xa6, 0xf9, + 0x04, 0x46, 0x0f, 0xf2, 0x51, 0x41, 0x00, 0x20, 0xff, 0xf7, 0x9b, 0xf9, + 0x0f, 0xf2, 0x59, 0x41, 0x01, 0x20, 0xff, 0xf7, 0x96, 0xf9, 0x05, 0xf1, + 0x14, 0x01, 0x01, 0x20, 0x03, 0xf0, 0x10, 0xf8, 0xa8, 0x60, 0xf3, 0xf7, + 0x33, 0xfc, 0x06, 0x46, 0x28, 0x78, 0x0f, 0xf2, 0x51, 0x21, 0x00, 0x28, + 0x51, 0xd0, 0x00, 0x27, 0x4f, 0xf0, 0x03, 0x08, 0x00, 0x20, 0xff, 0xf7, + 0x76, 0xf9, 0x26, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x03, 0xd5, 0x01, 0x21, + 0x38, 0x46, 0xff, 0xf7, 0x25, 0xf9, 0x7f, 0x1c, 0xff, 0xb2, 0xb8, 0x45, + 0xf3, 0xda, 0x06, 0x20, 0xfd, 0xf7, 0x1d, 0xfe, 0x0f, 0xf2, 0xfd, 0x21, + 0x06, 0x20, 0xfd, 0xf7, 0x06, 0xff, 0x00, 0x20, 0xe8, 0x60, 0x28, 0x61, + 0x00, 0x26, 0xdf, 0xf8, 0x10, 0x25, 0xdf, 0xf8, 0x10, 0x35, 0x53, 0xf8, + 0x26, 0x00, 0x50, 0xf8, 0x08, 0xcf, 0x01, 0x27, 0x00, 0x21, 0xb7, 0x40, + 0x5f, 0xea, 0xcc, 0x7c, 0x06, 0xd5, 0xd5, 0xf8, 0x0c, 0xc0, 0x47, 0xea, + 0x0c, 0x0c, 0x01, 0x21, 0xc5, 0xf8, 0x0c, 0xc0, 0x00, 0x68, 0xc0, 0xf3, + 0x00, 0x20, 0x20, 0xb1, 0x28, 0x69, 0x07, 0x43, 0x41, 0xf4, 0x80, 0x71, + 0x2f, 0x61, 0x52, 0xf8, 0x26, 0x00, 0xef, 0xf3, 0x10, 0x87, 0x72, 0xb6, + 0x50, 0xf8, 0x30, 0xcf, 0xdf, 0xf8, 0xcc, 0xe4, 0x0e, 0xea, 0x0c, 0x0c, + 0x4c, 0xea, 0x01, 0x21, 0x01, 0x60, 0x87, 0xf3, 0x10, 0x88, 0x76, 0x1c, + 0x08, 0x2e, 0xd2, 0xdb, 0x20, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x04, 0x27, + 0x4f, 0xf0, 0x07, 0x08, 0x01, 0x20, 0xac, 0xe7, 0x01, 0x21, 0xff, 0xf7, + 0x0c, 0xb8, 0x00, 0x21, 0xff, 0xf7, 0x09, 0xb8, 0x01, 0x21, 0xff, 0xf7, + 0x1a, 0xb8, 0x00, 0x21, 0xff, 0xf7, 0x17, 0xb8, 0x01, 0x21, 0xff, 0xf7, + 0x28, 0xb8, 0x00, 0x21, 0xff, 0xf7, 0x25, 0xb8, 0x01, 0x29, 0x0c, 0xbf, + 0x01, 0x22, 0x00, 0x22, 0x01, 0x21, 0x01, 0xfa, 0x00, 0xf0, 0xfe, 0xf7, + 0x61, 0xbf, 0x01, 0x29, 0x0c, 0xbf, 0x01, 0x22, 0x00, 0x22, 0x01, 0x23, + 0x00, 0x21, 0x03, 0xfa, 0x00, 0xf0, 0xfe, 0xf7, 0x57, 0xbf, 0x01, 0x29, + 0x0c, 0xbf, 0x01, 0x22, 0x00, 0x22, 0x01, 0x21, 0x01, 0xfa, 0x00, 0xf0, + 0xfe, 0xf7, 0x7b, 0xbf, 0x01, 0x29, 0x0c, 0xbf, 0x01, 0x22, 0x00, 0x22, + 0x01, 0x23, 0x00, 0x21, 0x03, 0xfa, 0x00, 0xf0, 0xfe, 0xf7, 0x71, 0xbf, + 0xf8, 0xb5, 0x0d, 0x46, 0x04, 0x46, 0x16, 0x46, 0x1f, 0x46, 0x01, 0x21, + 0x11, 0xf0, 0x62, 0xf9, 0x78, 0xb9, 0x20, 0x46, 0x11, 0xf0, 0x20, 0xf9, + 0x58, 0xb9, 0x20, 0x46, 0x11, 0xf0, 0x23, 0xf9, 0x38, 0xb9, 0x3b, 0x46, + 0x32, 0x46, 0x29, 0x46, 0x20, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x40, + 0xd3, 0xe7, 0xf2, 0xbd, 0x38, 0xb5, 0x05, 0x46, 0xff, 0xf7, 0xd8, 0xff, + 0x04, 0x46, 0x28, 0x46, 0x11, 0xf0, 0x22, 0xf9, 0x04, 0xb9, 0x04, 0x46, + 0x00, 0x21, 0x28, 0x46, 0x11, 0xf0, 0x42, 0xf9, 0x20, 0x46, 0x32, 0xbd, + 0x10, 0xb5, 0x0c, 0x46, 0x01, 0x2c, 0x4f, 0xf6, 0x51, 0x71, 0x18, 0xbf, + 0x00, 0x24, 0x12, 0xb1, 0x07, 0x2a, 0x07, 0xd0, 0x0b, 0xe0, 0x01, 0x21, + 0x22, 0x46, 0x01, 0xfa, 0x00, 0xf0, 0xfe, 0xf7, 0x6d, 0xff, 0x03, 0xe0, + 0x19, 0x68, 0x22, 0x46, 0xff, 0xf7, 0x5d, 0xf8, 0x01, 0x46, 0x08, 0x46, + 0x10, 0xbd, 0x80, 0xb5, 0x01, 0x29, 0x4f, 0xf6, 0x51, 0x73, 0x18, 0xbf, + 0x00, 0x21, 0x12, 0xb1, 0x07, 0x2a, 0x08, 0xd0, 0x0a, 0xe0, 0x0a, 0x46, + 0x01, 0x23, 0x00, 0x21, 0x03, 0xfa, 0x00, 0xf0, 0xfe, 0xf7, 0x54, 0xff, + 0x01, 0xe0, 0xff, 0xf7, 0x49, 0xf8, 0x03, 0x46, 0x18, 0x46, 0x02, 0xbd, + 0xff, 0xf7, 0x74, 0xb8, 0x10, 0xb5, 0x00, 0x24, 0x01, 0x2a, 0x18, 0xbf, + 0x00, 0x22, 0x0b, 0x00, 0x0c, 0xbf, 0x00, 0x21, 0x01, 0x29, 0x02, 0xd1, + 0x11, 0xf0, 0xb8, 0xf9, 0x01, 0xe0, 0x4f, 0xf6, 0x51, 0x74, 0x20, 0x46, + 0x10, 0xbd, 0x70, 0xb5, 0x00, 0x22, 0x09, 0xb3, 0x08, 0x28, 0x1c, 0xd2, + 0xdf, 0xf8, 0x4c, 0x33, 0x53, 0xf8, 0x20, 0x30, 0x53, 0xf8, 0x08, 0x4f, + 0xe4, 0x07, 0x05, 0xd4, 0xdf, 0xf8, 0x34, 0x43, 0xe5, 0x68, 0xc5, 0x40, + 0xee, 0x07, 0x01, 0xd5, 0x0a, 0x60, 0x11, 0xe0, 0x1b, 0x68, 0xdb, 0x05, + 0x03, 0xd4, 0x24, 0x69, 0xc4, 0x40, 0xe0, 0x07, 0x02, 0xd5, 0x01, 0x23, + 0x0b, 0x60, 0x07, 0xe0, 0xff, 0x20, 0x08, 0x60, 0x04, 0xe0, 0x4f, 0xf6, + 0x52, 0x72, 0x01, 0xe0, 0x4f, 0xf6, 0x0a, 0x72, 0x10, 0x46, 0x70, 0xbd, + 0x2d, 0xe9, 0xf8, 0x4f, 0xbe, 0x4d, 0x68, 0x78, 0x00, 0x28, 0x67, 0xd1, + 0x01, 0x21, 0x69, 0x70, 0x01, 0x23, 0x69, 0x68, 0x01, 0x22, 0x06, 0x20, + 0xfd, 0xf7, 0x09, 0xfd, 0xf3, 0xf7, 0xf8, 0xfa, 0x29, 0x78, 0xbb, 0x4a, + 0xdf, 0xf8, 0xec, 0x92, 0x00, 0x29, 0x19, 0xbf, 0x00, 0x26, 0x4f, 0xf0, + 0x03, 0x0a, 0x04, 0x26, 0x4f, 0xf0, 0x07, 0x0a, 0x00, 0x24, 0x31, 0x46, + 0x00, 0xe0, 0x49, 0x1c, 0x8a, 0x45, 0x13, 0xd3, 0x20, 0xfa, 0x01, 0xf3, + 0xdb, 0x07, 0xf8, 0xd5, 0x59, 0xf8, 0x21, 0x70, 0x57, 0xf8, 0x48, 0x3f, + 0x52, 0xf8, 0x21, 0x70, 0x07, 0xf5, 0xd8, 0x77, 0x03, 0xf0, 0x30, 0x03, + 0x3f, 0x68, 0x07, 0xf0, 0x03, 0x07, 0x3b, 0x43, 0x1c, 0x43, 0xe8, 0xd0, + 0x00, 0x2c, 0x83, 0x46, 0x34, 0xd1, 0x01, 0x20, 0xfd, 0xf7, 0xc4, 0xfd, + 0x28, 0x78, 0xa7, 0x4f, 0xdf, 0xf8, 0x9c, 0x82, 0x18, 0xb1, 0x00, 0xf0, + 0x93, 0xf8, 0x40, 0x46, 0x02, 0xe0, 0x00, 0xf0, 0x8f, 0xf8, 0x38, 0x46, + 0xff, 0xf7, 0x4e, 0xfe, 0x9e, 0x49, 0x00, 0x20, 0x00, 0xe0, 0x76, 0x1c, + 0xb2, 0x45, 0x0c, 0xd3, 0x2b, 0xfa, 0x06, 0xf2, 0xd2, 0x07, 0xf8, 0xd5, + 0x59, 0xf8, 0x26, 0x30, 0x53, 0xf8, 0x48, 0x2f, 0x51, 0xf8, 0x26, 0x30, + 0x00, 0xf0, 0x82, 0xf8, 0xef, 0xd0, 0x28, 0xb9, 0x06, 0x20, 0xfd, 0xf7, + 0x17, 0xfd, 0x00, 0x21, 0x69, 0x70, 0x09, 0xe0, 0x28, 0x78, 0x18, 0xb1, + 0x00, 0xf0, 0x72, 0xf8, 0x40, 0x46, 0x02, 0xe0, 0x00, 0xf0, 0x6e, 0xf8, + 0x38, 0x46, 0x79, 0xe0, 0xbd, 0xe8, 0xf1, 0x8f, 0x2d, 0xe9, 0xf8, 0x4f, + 0xf3, 0xf7, 0x94, 0xfa, 0x85, 0x4d, 0xdf, 0xf8, 0x24, 0xa2, 0xdf, 0xf8, + 0x24, 0xb2, 0x01, 0x46, 0x28, 0x78, 0x00, 0x28, 0x19, 0xbf, 0x00, 0x26, + 0x03, 0x27, 0x04, 0x26, 0x07, 0x27, 0x00, 0x24, 0x30, 0x46, 0x00, 0xe0, + 0x40, 0x1c, 0x87, 0x42, 0x13, 0xd3, 0x21, 0xfa, 0x00, 0xf2, 0xd2, 0x07, + 0xf8, 0xd5, 0x5b, 0xf8, 0x20, 0x30, 0x53, 0xf8, 0x48, 0x2f, 0x5a, 0xf8, + 0x20, 0x30, 0x03, 0xf5, 0xd8, 0x73, 0x02, 0xf0, 0x30, 0x02, 0x1b, 0x68, + 0x03, 0xf0, 0x03, 0x03, 0x1a, 0x43, 0x14, 0x43, 0xe8, 0xd0, 0x00, 0x2c, + 0x00, 0x91, 0x35, 0xd1, 0x01, 0x20, 0xfd, 0xf7, 0x5f, 0xfd, 0x28, 0x78, + 0xdf, 0xf8, 0xd0, 0x81, 0xdf, 0xf8, 0xd0, 0x91, 0x18, 0xb1, 0x00, 0xf0, + 0x2d, 0xf8, 0x48, 0x46, 0x02, 0xe0, 0x00, 0xf0, 0x29, 0xf8, 0x40, 0x46, + 0xff, 0xf7, 0xe8, 0xfd, 0x00, 0x99, 0x00, 0x20, 0x00, 0xe0, 0x76, 0x1c, + 0xb7, 0x42, 0x0c, 0xd3, 0x21, 0xfa, 0x06, 0xf2, 0xd2, 0x07, 0xf8, 0xd5, + 0x5b, 0xf8, 0x26, 0x30, 0x53, 0xf8, 0x48, 0x2f, 0x5a, 0xf8, 0x26, 0x30, + 0x00, 0xf0, 0x1c, 0xf8, 0xef, 0xd0, 0x28, 0xb9, 0x06, 0x20, 0xfd, 0xf7, + 0xb1, 0xfc, 0x00, 0x21, 0x69, 0x70, 0x09, 0xe0, 0x28, 0x78, 0x18, 0xb1, + 0x00, 0xf0, 0x0c, 0xf8, 0x48, 0x46, 0x02, 0xe0, 0x00, 0xf0, 0x08, 0xf8, + 0x40, 0x46, 0x13, 0xe0, 0xbd, 0xe8, 0xf1, 0x8f, 0x00, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x70, 0x47, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x70, 0x47, + 0x03, 0xf5, 0xd8, 0x73, 0x02, 0xf0, 0x30, 0x02, 0x1c, 0x68, 0x04, 0xf0, + 0x03, 0x04, 0x22, 0x43, 0x10, 0x43, 0x70, 0x47, 0x01, 0xb0, 0xbd, 0xe8, + 0xf0, 0x4f, 0xab, 0xe5, 0x1c, 0xb5, 0x00, 0x20, 0x00, 0x90, 0x69, 0x46, + 0x47, 0x4c, 0xa0, 0x68, 0x02, 0xf0, 0xda, 0xfe, 0x01, 0x21, 0x09, 0xe0, + 0x1c, 0xb5, 0x00, 0x20, 0x00, 0x90, 0x6a, 0x46, 0x42, 0x4c, 0xa0, 0x68, + 0x00, 0x21, 0x03, 0xf0, 0x09, 0xf8, 0x00, 0x21, 0x00, 0x98, 0xa1, 0x70, + 0x38, 0xb1, 0x46, 0x48, 0x4f, 0xf0, 0x80, 0x51, 0x01, 0x60, 0xbf, 0xf3, + 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x13, 0xbd, 0x80, 0xb5, 0x01, 0x00, + 0x38, 0x48, 0x80, 0x68, 0x08, 0xbf, 0x4f, 0xf0, 0xff, 0x31, 0x02, 0xf0, + 0x53, 0xff, 0x01, 0x28, 0x18, 0xbf, 0x00, 0x20, 0x02, 0xbd, 0x38, 0xb5, + 0x05, 0x20, 0xfd, 0xf7, 0x1f, 0xfb, 0x31, 0x4d, 0x04, 0x46, 0xa8, 0x68, + 0x03, 0xf0, 0x16, 0xf8, 0x38, 0xb9, 0xa8, 0x78, 0x28, 0xb1, 0xa8, 0x68, + 0x00, 0x23, 0x00, 0x22, 0x00, 0x21, 0x02, 0xf0, 0xf0, 0xfd, 0x20, 0x46, + 0x80, 0xf3, 0x11, 0x88, 0x00, 0x20, 0x32, 0xbd, 0xf8, 0xb5, 0x17, 0x46, + 0x0e, 0x46, 0x00, 0x25, 0x00, 0x24, 0x01, 0x22, 0x00, 0x21, 0x01, 0x28, + 0x8d, 0xf8, 0x00, 0x10, 0x31, 0xd1, 0x38, 0x78, 0x20, 0xb1, 0x01, 0x28, + 0x0c, 0xbf, 0x8d, 0xf8, 0x00, 0x00, 0x00, 0x22, 0x78, 0x78, 0x08, 0xb9, + 0x01, 0x21, 0x02, 0xe0, 0x01, 0x28, 0x18, 0xbf, 0x00, 0x22, 0xb8, 0x78, + 0x08, 0xb9, 0x01, 0x24, 0x01, 0xe0, 0x01, 0x28, 0x1a, 0xd1, 0xca, 0xb1, + 0x00, 0x29, 0x6b, 0x46, 0x04, 0xd0, 0x06, 0x22, 0x30, 0x46, 0x10, 0xf0, + 0x88, 0xfe, 0x04, 0xe0, 0x06, 0x22, 0x01, 0x21, 0x30, 0x46, 0x10, 0xf0, + 0xac, 0xfe, 0x05, 0x00, 0x1e, 0xd1, 0x00, 0x2c, 0x9d, 0xf8, 0x00, 0x10, + 0x14, 0xbf, 0x01, 0x22, 0x00, 0x22, 0x30, 0x46, 0xff, 0xf7, 0x5e, 0xfe, + 0x05, 0x46, 0x13, 0xe0, 0x4f, 0xf6, 0x6b, 0x75, 0x10, 0xe0, 0x02, 0x28, + 0x03, 0xd1, 0x38, 0x68, 0x07, 0x49, 0x48, 0x60, 0x0a, 0xe0, 0x03, 0x28, + 0x06, 0xd1, 0x38, 0x78, 0x10, 0xf0, 0x37, 0xfe, 0x78, 0x78, 0x10, 0xf0, + 0x31, 0xfe, 0x01, 0xe0, 0x4f, 0xf6, 0x6a, 0x75, 0x28, 0x46, 0xf2, 0xbd, + 0x70, 0x43, 0x00, 0x21, 0xc0, 0x99, 0x04, 0x02, 0x60, 0x99, 0x04, 0x02, + 0xff, 0xfe, 0xfe, 0xff, 0x80, 0x98, 0x04, 0x02, 0xa0, 0x98, 0x04, 0x02, + 0x44, 0x01, 0x00, 0x47, 0x43, 0x01, 0x00, 0x47, 0x04, 0xed, 0x00, 0xe0, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x38, 0xb5, 0x00, 0x24, 0xdf, 0xf8, 0x48, 0x54, + 0x50, 0x22, 0x62, 0x43, 0x2a, 0x44, 0x02, 0xf1, 0x20, 0x01, 0x01, 0x20, + 0x02, 0xf0, 0x36, 0xfd, 0x45, 0xf8, 0x24, 0x00, 0x64, 0x1c, 0x08, 0x2c, + 0xf2, 0xd3, 0x31, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, 0xdf, 0xf8, 0x24, 0x84, + 0xdf, 0xf8, 0x24, 0x94, 0x04, 0x46, 0x58, 0xf8, 0x24, 0x00, 0x00, 0xf0, + 0xb1, 0xf9, 0xdf, 0xf8, 0x1c, 0x14, 0x51, 0xf8, 0x24, 0x60, 0x00, 0xf0, + 0x4d, 0xf8, 0x00, 0x25, 0x59, 0xf8, 0x24, 0x00, 0x00, 0xeb, 0x85, 0x11, + 0x01, 0xf1, 0x0c, 0x07, 0x34, 0x21, 0x38, 0x46, 0xf6, 0xf7, 0xea, 0xfe, + 0x6d, 0x1c, 0x4f, 0xf4, 0x80, 0x00, 0x41, 0x2d, 0xb8, 0x61, 0xef, 0xd3, + 0xdf, 0xf8, 0xf0, 0x13, 0x51, 0xf8, 0x24, 0x20, 0x4f, 0xf4, 0xe6, 0x20, + 0x42, 0xf8, 0xd8, 0x0f, 0x00, 0x23, 0x31, 0x68, 0xdf, 0xf8, 0xe0, 0x03, + 0x01, 0x40, 0x41, 0xf4, 0x7f, 0x41, 0x41, 0xf0, 0x0d, 0x01, 0x31, 0x60, + 0x00, 0x22, 0x58, 0xf8, 0x24, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x43, + 0x67, 0xe0, 0xf8, 0xb5, 0x00, 0xf0, 0x45, 0xf8, 0x00, 0xf0, 0x7c, 0xf9, + 0x00, 0xf0, 0x18, 0xf8, 0x00, 0x20, 0xdf, 0xf8, 0xa8, 0x13, 0x00, 0x27, + 0x51, 0xf8, 0x25, 0x20, 0x83, 0x01, 0x40, 0x1c, 0xd7, 0x50, 0x41, 0x28, + 0xf8, 0xd3, 0x30, 0x68, 0x40, 0xf4, 0x7f, 0x40, 0x40, 0xf0, 0x03, 0x00, + 0x30, 0x60, 0x00, 0x23, 0x54, 0xf8, 0x25, 0x00, 0x01, 0xb0, 0xbd, 0xe8, + 0xf0, 0x40, 0x47, 0xe0, 0xdf, 0xf8, 0x7c, 0x13, 0x51, 0xf8, 0x25, 0x60, + 0x18, 0x36, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x30, 0x46, 0x7b, 0xe7, + 0xf8, 0xb5, 0x00, 0xf0, 0x1c, 0xf8, 0x00, 0xf0, 0x53, 0xf9, 0xff, 0xf7, + 0xef, 0xff, 0x00, 0x20, 0xd5, 0x49, 0x00, 0x27, 0x51, 0xf8, 0x25, 0x20, + 0x02, 0xeb, 0x80, 0x13, 0x40, 0x1c, 0x41, 0x28, 0x9f, 0x60, 0xf7, 0xd3, + 0x30, 0x68, 0x40, 0xf4, 0x7f, 0x40, 0x40, 0xf0, 0x10, 0x00, 0x30, 0x60, + 0x00, 0x23, 0x54, 0xf8, 0x25, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x40, + 0x1e, 0xe0, 0xc9, 0x4c, 0x05, 0x46, 0x54, 0xf8, 0x25, 0x00, 0x70, 0x47, + 0x38, 0xb5, 0x00, 0xf0, 0x2d, 0xf9, 0xc7, 0x48, 0x50, 0xf8, 0x24, 0x00, + 0x00, 0x23, 0x06, 0xe0, 0x38, 0xb5, 0x00, 0xf0, 0x25, 0xf9, 0xc3, 0x48, + 0x50, 0xf8, 0x24, 0x00, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x18, 0x30, + 0xff, 0xf7, 0x44, 0xff, 0x55, 0xf8, 0x24, 0x00, 0x01, 0xb0, 0xbd, 0xe8, + 0x30, 0x40, 0x00, 0x23, 0x00, 0x22, 0x00, 0x21, 0x02, 0xf0, 0xc3, 0xbc, + 0x70, 0xb5, 0x00, 0xf0, 0x0f, 0xf9, 0xb8, 0x49, 0x51, 0xf8, 0x24, 0x00, + 0x50, 0xf8, 0x18, 0x6f, 0x55, 0xf8, 0x24, 0x00, 0x00, 0x23, 0x00, 0x22, + 0x00, 0x21, 0x02, 0xf0, 0xb4, 0xfc, 0x06, 0xf0, 0x01, 0x00, 0x70, 0xbd, + 0x2d, 0xe9, 0xf8, 0x4f, 0x41, 0x29, 0x8a, 0x46, 0x61, 0xd2, 0xdf, 0xf8, + 0xb0, 0x82, 0x81, 0x46, 0x58, 0xf8, 0x29, 0x00, 0x1c, 0x46, 0x15, 0x46, + 0x00, 0xf0, 0xf6, 0xf8, 0xa9, 0x49, 0x51, 0xf8, 0x29, 0x60, 0x56, 0xf8, + 0x18, 0x7f, 0x04, 0x20, 0xfd, 0xf7, 0xbc, 0xf9, 0x83, 0x46, 0xff, 0xf7, + 0x8e, 0xff, 0xa3, 0x48, 0x50, 0xf8, 0x29, 0x10, 0x60, 0x68, 0x01, 0xeb, + 0x8a, 0x12, 0x02, 0xf1, 0x0c, 0x01, 0x22, 0x68, 0xc2, 0xea, 0x00, 0x43, + 0x0b, 0x60, 0xa0, 0x68, 0xa0, 0x4b, 0x80, 0xb2, 0x48, 0x60, 0x2a, 0x68, + 0x12, 0x04, 0x0a, 0x61, 0x6a, 0x68, 0xa8, 0x68, 0x03, 0xea, 0x82, 0x03, + 0x43, 0xea, 0x00, 0x53, 0x28, 0x68, 0xc0, 0xf3, 0x01, 0x40, 0x03, 0x43, + 0x4b, 0x61, 0xea, 0x68, 0x28, 0x69, 0x98, 0x4b, 0x03, 0xea, 0x82, 0x13, + 0x43, 0xea, 0x00, 0x63, 0xa8, 0x68, 0xc0, 0xf3, 0x05, 0x30, 0x03, 0x43, + 0x8b, 0x61, 0x6a, 0x69, 0xa8, 0x69, 0x93, 0x4b, 0x03, 0xea, 0x82, 0x23, + 0x43, 0xea, 0x00, 0x73, 0x28, 0x69, 0xc0, 0xf3, 0x09, 0x20, 0x03, 0x43, + 0xcb, 0x61, 0x4f, 0xf6, 0x01, 0x72, 0xa8, 0x69, 0xc0, 0xf3, 0x0d, 0x10, + 0x08, 0x62, 0x13, 0x46, 0x00, 0x21, 0x30, 0x46, 0xff, 0xf7, 0xce, 0xfe, + 0x58, 0x46, 0x80, 0xf3, 0x11, 0x88, 0xf8, 0x07, 0x01, 0xd4, 0xff, 0xf7, + 0x46, 0xff, 0x58, 0xf8, 0x29, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, + 0x81, 0xe7, 0xbd, 0xe8, 0xf1, 0x8f, 0x41, 0x29, 0x00, 0xd3, 0x70, 0x47, + 0x10, 0xb5, 0x79, 0x4c, 0x54, 0xf8, 0x20, 0x00, 0x00, 0xeb, 0x81, 0x11, + 0x01, 0xf1, 0x0c, 0x00, 0x04, 0x68, 0x24, 0x04, 0x24, 0x14, 0x1c, 0x60, + 0x01, 0x68, 0x09, 0x14, 0x59, 0x60, 0x41, 0x68, 0x09, 0x04, 0x09, 0x14, + 0x99, 0x60, 0x03, 0x69, 0x41, 0x69, 0x9b, 0x08, 0x43, 0xea, 0x81, 0x73, + 0x9b, 0x13, 0x13, 0x60, 0x41, 0x69, 0x09, 0x03, 0x89, 0x13, 0x51, 0x60, + 0x43, 0x69, 0x81, 0x69, 0x9b, 0x09, 0x43, 0xea, 0x81, 0x63, 0x9b, 0x13, + 0x93, 0x60, 0x81, 0x69, 0x09, 0x02, 0x89, 0x13, 0xd1, 0x60, 0x83, 0x69, + 0xc1, 0x69, 0x9b, 0x0a, 0x43, 0xea, 0x81, 0x53, 0x9b, 0x13, 0x13, 0x61, + 0xc1, 0x69, 0x09, 0x01, 0x89, 0x13, 0x51, 0x61, 0x01, 0x6a, 0xc0, 0x69, + 0x80, 0x0b, 0x40, 0xea, 0x81, 0x40, 0x80, 0x13, 0x90, 0x61, 0x10, 0xbd, + 0xf8, 0xb5, 0x8a, 0xb0, 0x04, 0x46, 0x0d, 0x46, 0x17, 0x46, 0x1e, 0x46, + 0x1c, 0x21, 0x03, 0xa8, 0xf6, 0xf7, 0x9c, 0xfd, 0x69, 0x46, 0x00, 0x20, + 0x00, 0x22, 0x00, 0x23, 0x81, 0xe8, 0x0d, 0x00, 0x06, 0x97, 0x01, 0x96, + 0x6b, 0x46, 0x03, 0xaa, 0x29, 0x46, 0x20, 0x46, 0xff, 0xf7, 0x40, 0xff, + 0x0b, 0xb0, 0xf0, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x41, 0x29, 0x0f, 0x46, + 0x31, 0xd2, 0xdf, 0xf8, 0x2c, 0x81, 0x82, 0x46, 0x58, 0xf8, 0x2a, 0x00, + 0x99, 0x46, 0x15, 0x46, 0x00, 0xf0, 0x34, 0xf8, 0x48, 0x49, 0x51, 0xf8, + 0x2a, 0x40, 0x54, 0xf8, 0x18, 0x6f, 0x04, 0x20, 0xfd, 0xf7, 0xfa, 0xf8, + 0x83, 0x46, 0x00, 0xf0, 0x20, 0xf8, 0x42, 0x48, 0x50, 0xf8, 0x2a, 0x10, + 0xbf, 0x01, 0xad, 0xb2, 0x1f, 0xfa, 0x89, 0xf0, 0x45, 0xea, 0x00, 0x45, + 0xcd, 0x51, 0x4f, 0xf6, 0x01, 0x72, 0x13, 0x46, 0x00, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0x3c, 0xfe, 0x58, 0x46, 0x80, 0xf3, 0x11, 0x88, 0xf0, 0x07, + 0x01, 0xd4, 0x00, 0xf0, 0x08, 0xf8, 0x58, 0xf8, 0x2a, 0x00, 0x01, 0xb0, + 0xbd, 0xe8, 0xf0, 0x4f, 0xef, 0xe6, 0xbd, 0xe8, 0xf1, 0x8f, 0x00, 0x23, + 0x01, 0x22, 0x00, 0x21, 0x20, 0x46, 0x27, 0xe6, 0x2e, 0x4d, 0x04, 0x46, + 0x55, 0xf8, 0x24, 0x00, 0x4f, 0xf4, 0x7a, 0x71, 0x02, 0xf0, 0xf6, 0xbc, + 0x41, 0x29, 0x00, 0xd3, 0x70, 0x47, 0x10, 0xb5, 0x29, 0x4c, 0x54, 0xf8, + 0x20, 0x00, 0x89, 0x01, 0x40, 0x58, 0x10, 0x80, 0x00, 0x0c, 0x18, 0x80, + 0x10, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, 0xdf, 0xf8, 0x8c, 0x80, 0x04, 0x46, + 0x0d, 0x46, 0x58, 0xf8, 0x24, 0x00, 0xff, 0xf7, 0xe5, 0xff, 0x21, 0x49, + 0x51, 0xf8, 0x24, 0x70, 0x57, 0xf8, 0x18, 0x6f, 0x04, 0x20, 0xfd, 0xf7, + 0xab, 0xf8, 0x81, 0x46, 0x00, 0xf0, 0x20, 0xf8, 0x00, 0x20, 0x1a, 0x49, + 0x51, 0xf8, 0x24, 0x20, 0x02, 0xeb, 0x80, 0x13, 0x35, 0xf9, 0x10, 0x20, + 0x9a, 0x60, 0x40, 0x1c, 0x41, 0x28, 0xf5, 0xd3, 0x4f, 0xf6, 0x01, 0x72, + 0x13, 0x46, 0x00, 0x21, 0x38, 0x46, 0xff, 0xf7, 0xeb, 0xfd, 0x48, 0x46, + 0x80, 0xf3, 0x11, 0x88, 0xf0, 0x07, 0x01, 0xd4, 0x00, 0xf0, 0x06, 0xf8, + 0x58, 0xf8, 0x24, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x43, 0x9e, 0xe6, + 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x38, 0x46, 0xd8, 0xe5, 0x70, 0xb5, + 0x00, 0x22, 0x07, 0x4b, 0x53, 0xf8, 0x20, 0x40, 0x04, 0xeb, 0x82, 0x15, + 0xae, 0x68, 0x21, 0xf8, 0x12, 0x60, 0x52, 0x1c, 0x41, 0x2a, 0xf5, 0xd3, + 0x70, 0xbd, 0x00, 0x00, 0x34, 0x43, 0x02, 0x21, 0x60, 0x98, 0x04, 0x02, + 0xa0, 0x98, 0x04, 0x02, 0x80, 0x98, 0x04, 0x02, 0x92, 0x00, 0xff, 0xff, + 0xfc, 0xff, 0x0f, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x0f, + 0x18, 0x22, 0x4f, 0x4b, 0x50, 0x43, 0x18, 0x44, 0x10, 0x29, 0x40, 0x68, + 0x01, 0xd2, 0x08, 0x30, 0x70, 0x47, 0x0c, 0x30, 0x70, 0x47, 0x70, 0x47, + 0x70, 0xb5, 0x00, 0x24, 0xf1, 0xf7, 0x91, 0xff, 0xe2, 0xb2, 0x18, 0x23, + 0x46, 0x49, 0x5a, 0x43, 0x8d, 0x18, 0x6e, 0x69, 0x86, 0x42, 0x19, 0xd1, + 0x69, 0x68, 0x00, 0x20, 0x41, 0xf8, 0x08, 0x0f, 0x00, 0x22, 0x69, 0x68, + 0x41, 0xf8, 0x0c, 0x0f, 0x69, 0x68, 0x41, 0xf8, 0x10, 0x0f, 0x69, 0x68, + 0x41, 0xf8, 0x14, 0x0f, 0x69, 0x68, 0x08, 0x60, 0x68, 0x68, 0x40, 0xf8, + 0x04, 0x2f, 0xe9, 0x68, 0xa8, 0x68, 0xfd, 0xf7, 0x28, 0xf8, 0xa8, 0x68, + 0xfd, 0xf7, 0x0b, 0xf8, 0x64, 0x1c, 0xe0, 0xb2, 0x08, 0x28, 0xd7, 0xdb, + 0x70, 0xbd, 0x38, 0xb5, 0x0c, 0x46, 0xff, 0xf7, 0xc5, 0xff, 0x05, 0x46, + 0x06, 0x20, 0xfd, 0xf7, 0x25, 0xf8, 0x63, 0x00, 0x29, 0x68, 0x01, 0x22, + 0x03, 0xf0, 0x1e, 0x03, 0x9a, 0x40, 0x91, 0x43, 0x29, 0x60, 0xbd, 0xe8, + 0x32, 0x40, 0xfd, 0xf7, 0x2f, 0xb8, 0x3e, 0xb5, 0x08, 0x28, 0x05, 0x46, + 0x34, 0xda, 0x18, 0x21, 0x27, 0x4a, 0x48, 0x43, 0x14, 0x18, 0xa0, 0x68, + 0xfc, 0xf7, 0xa1, 0xff, 0xf1, 0xf7, 0x49, 0xff, 0x61, 0x69, 0x81, 0x42, + 0x0c, 0xbf, 0x01, 0x20, 0x00, 0x20, 0x0f, 0xf0, 0x39, 0xfe, 0x8d, 0xf8, + 0x00, 0x50, 0x60, 0x68, 0x50, 0xf8, 0x04, 0x1b, 0x01, 0xf0, 0x3f, 0x01, + 0x01, 0x91, 0x3f, 0x29, 0x00, 0x68, 0x02, 0x90, 0x11, 0xd1, 0xb0, 0xf1, + 0x3f, 0x3f, 0x4f, 0xf6, 0x5c, 0x71, 0x05, 0xd1, 0x02, 0x22, 0x00, 0x20, + 0x00, 0xf0, 0x5e, 0xfb, 0x30, 0xbf, 0xfd, 0xe7, 0x03, 0x22, 0x00, 0x20, + 0x00, 0xf0, 0x58, 0xfb, 0x00, 0x20, 0x0f, 0xf0, 0x1b, 0xfe, 0x21, 0x69, + 0x68, 0x46, 0x88, 0x47, 0x61, 0x68, 0x00, 0x20, 0x08, 0x60, 0x37, 0xbd, + 0x02, 0x22, 0x4f, 0xf6, 0x04, 0x71, 0x00, 0x20, 0x00, 0xf0, 0x48, 0xfb, + 0x37, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x00, 0x26, 0x08, 0x2c, 0x0d, 0x46, + 0x0a, 0xda, 0x06, 0x20, 0xfc, 0xf7, 0xd0, 0xff, 0x18, 0x21, 0x05, 0x4a, + 0x4c, 0x43, 0x11, 0x19, 0x0d, 0x61, 0x80, 0xf3, 0x11, 0x88, 0x01, 0xe0, + 0x4f, 0xf6, 0x02, 0x76, 0x30, 0x46, 0x70, 0xbd, 0x48, 0x49, 0x00, 0x21, + 0xdf, 0xf8, 0x2c, 0x16, 0x00, 0x20, 0xc8, 0x60, 0x70, 0x47, 0x2d, 0xe9, + 0xfe, 0x4f, 0x89, 0x46, 0xdf, 0xf8, 0x20, 0x16, 0xdf, 0xf8, 0x18, 0x66, + 0x8b, 0x68, 0x73, 0x60, 0x00, 0x28, 0x09, 0x68, 0xb1, 0x60, 0x00, 0xf0, + 0xa1, 0x81, 0xdf, 0xf8, 0x10, 0x06, 0xf0, 0x60, 0x01, 0x46, 0x41, 0xf2, + 0x38, 0x02, 0x18, 0x46, 0xe4, 0xf7, 0x58, 0xfa, 0x72, 0x68, 0xb1, 0x68, + 0x10, 0x69, 0x48, 0x60, 0x00, 0x24, 0x4f, 0xf0, 0x30, 0x08, 0x00, 0x25, + 0x70, 0x68, 0x20, 0x44, 0x90, 0xf8, 0xbc, 0xa0, 0xe0, 0xb2, 0x00, 0xf0, + 0xab, 0xfa, 0xb1, 0x68, 0x00, 0x78, 0x21, 0x44, 0x81, 0xf8, 0x40, 0x01, + 0xb0, 0x68, 0x00, 0xf5, 0x56, 0x71, 0x0d, 0x60, 0x00, 0xf0, 0xaa, 0xfa, + 0x30, 0xb1, 0x4c, 0xf2, 0x9c, 0x32, 0x81, 0x58, 0xb0, 0x68, 0x00, 0xf5, + 0x56, 0x72, 0x11, 0x60, 0xba, 0xf1, 0x04, 0x0f, 0xb0, 0x68, 0x00, 0xf1, + 0x08, 0x01, 0x01, 0xeb, 0x84, 0x00, 0x80, 0xf0, 0xdd, 0x80, 0x71, 0x68, + 0xed, 0x22, 0x12, 0xfb, 0x0a, 0xf2, 0x0a, 0x44, 0xd2, 0xf8, 0xc1, 0x14, + 0x01, 0x60, 0xe0, 0xb2, 0x00, 0xf0, 0x96, 0xfa, 0x07, 0x46, 0xe0, 0xb2, + 0x00, 0xf0, 0xa2, 0xfa, 0x07, 0xf2, 0x01, 0x72, 0xb3, 0x68, 0x01, 0x46, + 0x10, 0x68, 0x28, 0x33, 0x43, 0xf8, 0x24, 0x00, 0x42, 0xf2, 0xc1, 0x70, + 0x38, 0x18, 0x42, 0xf2, 0xbd, 0x73, 0x90, 0xf8, 0x02, 0xb0, 0xd6, 0xf8, + 0x08, 0xc0, 0xbb, 0xf1, 0x00, 0x0f, 0x18, 0xbf, 0x4f, 0xf0, 0x01, 0x0b, + 0xfb, 0x18, 0x0c, 0xeb, 0x84, 0x0c, 0xd3, 0xf8, 0x00, 0xe0, 0x2e, 0xfa, + 0x0b, 0xfe, 0xcc, 0xf8, 0x7c, 0xe0, 0xd6, 0xf8, 0x08, 0xe0, 0x90, 0xf8, + 0x00, 0xc0, 0xa6, 0x44, 0x8e, 0xf8, 0x9c, 0xc0, 0x42, 0xf2, 0xe0, 0x7e, + 0xd3, 0xf8, 0x00, 0xc0, 0xb3, 0x68, 0x03, 0xeb, 0x84, 0x03, 0x03, 0xf5, + 0x88, 0x73, 0xbe, 0x44, 0xc3, 0xf8, 0x00, 0xc0, 0xd6, 0xf8, 0x08, 0xc0, + 0x43, 0x78, 0xa4, 0x44, 0x8c, 0xf8, 0xa4, 0x30, 0xd6, 0xf8, 0x08, 0xc0, + 0x83, 0x78, 0xa4, 0x44, 0x8c, 0xf8, 0xac, 0x30, 0xd6, 0xf8, 0x08, 0xc0, + 0xc3, 0x78, 0xa4, 0x44, 0x8c, 0xf8, 0xb4, 0x30, 0xb3, 0x68, 0xbe, 0xf8, + 0x00, 0xb0, 0x03, 0xeb, 0x44, 0x0c, 0x0c, 0xf5, 0x5f, 0x7c, 0x23, 0x44, + 0xac, 0xf8, 0x00, 0xb0, 0xbe, 0xf8, 0x02, 0xb0, 0xac, 0xf8, 0x10, 0xb0, + 0xbe, 0xf8, 0x04, 0xb0, 0xac, 0xf8, 0x20, 0xb0, 0x9e, 0xf8, 0x06, 0xc0, + 0x83, 0xf8, 0xac, 0xc3, 0xb3, 0x68, 0x9e, 0xf8, 0x07, 0xe0, 0x23, 0x44, + 0x83, 0xf8, 0xb4, 0xe3, 0xae, 0x46, 0xb3, 0x68, 0x90, 0xf8, 0x04, 0xc0, + 0x23, 0x44, 0x83, 0xf8, 0x5c, 0xc3, 0xb3, 0x68, 0x90, 0xf8, 0x05, 0xc0, + 0x23, 0x44, 0x83, 0xf8, 0x64, 0xc3, 0xb3, 0x68, 0x90, 0xf8, 0x06, 0xc0, + 0x23, 0x44, 0x83, 0xf8, 0x6c, 0xc3, 0x04, 0xeb, 0x44, 0x0c, 0xb3, 0x68, + 0xc0, 0x79, 0x23, 0x44, 0x83, 0xf8, 0x74, 0x03, 0x38, 0x46, 0xb7, 0x68, + 0x00, 0xeb, 0x0e, 0x03, 0x67, 0x44, 0x77, 0x44, 0x93, 0xf8, 0x05, 0xb7, + 0x87, 0xf8, 0xc0, 0xb0, 0xb7, 0x68, 0x93, 0xf8, 0x5a, 0x37, 0x67, 0x44, + 0x77, 0x44, 0x0e, 0xf1, 0x01, 0x0e, 0xbe, 0xf1, 0x03, 0x0f, 0x87, 0xf8, + 0xd8, 0x30, 0xea, 0xd3, 0x13, 0x68, 0xb2, 0x68, 0x02, 0xeb, 0x84, 0x02, + 0xc2, 0xf8, 0xf0, 0x30, 0x00, 0x23, 0x4f, 0xf0, 0xe0, 0x0e, 0x1e, 0xfb, + 0x0a, 0xfe, 0xb7, 0x68, 0x07, 0xeb, 0x44, 0x02, 0x77, 0x68, 0xbe, 0x44, + 0x32, 0x27, 0x5f, 0x43, 0x77, 0x44, 0x1a, 0x44, 0x97, 0xf8, 0x03, 0x71, + 0x82, 0xf8, 0x48, 0x71, 0x5b, 0x1c, 0x01, 0x2b, 0xeb, 0xd9, 0xaa, 0x46, + 0x08, 0xfb, 0x0a, 0xf2, 0x83, 0x18, 0xd3, 0xf8, 0x01, 0x20, 0xb3, 0x68, + 0x03, 0xeb, 0x44, 0x13, 0x03, 0xeb, 0x8a, 0x03, 0x03, 0xf5, 0xac, 0x77, + 0x0a, 0xf1, 0x01, 0x0a, 0xba, 0xf1, 0x08, 0x0f, 0x3a, 0x60, 0xed, 0xd3, + 0x00, 0x20, 0x08, 0xfb, 0x00, 0xf3, 0xca, 0x58, 0xb3, 0x68, 0x03, 0xeb, + 0x44, 0x13, 0x03, 0xeb, 0x80, 0x03, 0x03, 0xf5, 0x16, 0x73, 0x40, 0x1c, + 0x08, 0x28, 0x1a, 0x60, 0xf1, 0xd3, 0x09, 0xe0, 0x05, 0x60, 0xb0, 0x68, + 0x00, 0xf1, 0x28, 0x01, 0x41, 0xf8, 0x24, 0x50, 0xb0, 0x68, 0x00, 0xeb, + 0x84, 0x01, 0xcd, 0x67, 0x64, 0x1c, 0x08, 0x2c, 0xff, 0xf4, 0xf2, 0xae, + 0x00, 0xf0, 0xdc, 0xf9, 0xb1, 0x68, 0x03, 0x78, 0x01, 0xf5, 0x9c, 0x72, + 0x13, 0x60, 0xb2, 0x68, 0xc1, 0x68, 0x02, 0xf5, 0x9e, 0x73, 0x19, 0x60, + 0x72, 0x68, 0x11, 0x6a, 0xb2, 0x68, 0x02, 0xf5, 0x98, 0x73, 0x19, 0x60, + 0x81, 0x68, 0xb0, 0x68, 0x00, 0xf5, 0x9a, 0x72, 0x11, 0x60, 0x00, 0xf0, + 0x86, 0xf9, 0x00, 0xf0, 0xff, 0x00, 0x08, 0x67, 0x00, 0xf0, 0x81, 0xf9, + 0xc0, 0xf3, 0x07, 0x20, 0x48, 0x67, 0x00, 0xf0, 0x7c, 0xf9, 0xc0, 0xf3, + 0x01, 0x40, 0x88, 0x67, 0x00, 0x21, 0x70, 0x20, 0x72, 0x68, 0xb4, 0x68, + 0x48, 0x43, 0x02, 0x44, 0x02, 0xf5, 0x33, 0x63, 0x1a, 0x68, 0x04, 0xf1, + 0x48, 0x03, 0x43, 0xf8, 0x21, 0x20, 0x72, 0x68, 0x13, 0x18, 0xd3, 0xf8, + 0x3c, 0x2b, 0xb3, 0x68, 0x03, 0xeb, 0x81, 0x04, 0x22, 0x65, 0x72, 0x68, + 0x13, 0x18, 0xd3, 0xf8, 0x38, 0x2b, 0xb3, 0x68, 0x03, 0xeb, 0x81, 0x04, + 0xa2, 0x65, 0x72, 0x68, 0x02, 0x44, 0x92, 0xf8, 0x45, 0x3b, 0xb2, 0x68, + 0x0a, 0x44, 0x82, 0xf8, 0xbc, 0x30, 0x72, 0x68, 0x53, 0x18, 0x10, 0x44, + 0x93, 0xf8, 0xbc, 0x20, 0x00, 0xeb, 0x82, 0x04, 0xb2, 0x68, 0xd4, 0xf8, + 0x67, 0x0b, 0x02, 0xeb, 0x81, 0x03, 0x49, 0x1c, 0x01, 0x29, 0x18, 0x66, + 0xcb, 0xd9, 0x72, 0x68, 0xd2, 0xf8, 0x5e, 0x00, 0xd2, 0xf8, 0x62, 0x10, + 0xb4, 0x68, 0x4f, 0xf4, 0x7a, 0x72, 0x00, 0x23, 0xf7, 0xf7, 0x0e, 0xf8, + 0xa0, 0x66, 0x4f, 0xf4, 0x7a, 0x72, 0x74, 0x68, 0xd4, 0xf8, 0x89, 0x00, + 0xd4, 0xf8, 0x8d, 0x10, 0xb4, 0x68, 0x00, 0x23, 0xf7, 0xf7, 0x02, 0xf8, + 0xe0, 0x66, 0x00, 0x24, 0xb1, 0x68, 0xbb, 0x48, 0x08, 0x60, 0x10, 0xf0, + 0x06, 0xf9, 0x10, 0xf0, 0x10, 0xf9, 0x01, 0x28, 0x18, 0xbf, 0x48, 0xf2, + 0x01, 0x04, 0x00, 0x2c, 0x40, 0xf0, 0x10, 0x81, 0x00, 0x20, 0xdf, 0xf8, + 0xd4, 0xa2, 0x00, 0x21, 0x86, 0x46, 0x00, 0x22, 0x4f, 0xf0, 0xff, 0x08, + 0x0a, 0xf1, 0x08, 0x04, 0x5f, 0xfa, 0x82, 0xfc, 0x52, 0x1c, 0xd5, 0xb2, + 0x44, 0xf8, 0x2c, 0x80, 0x08, 0x2d, 0xf7, 0xdb, 0x00, 0x22, 0x0a, 0xf1, + 0x28, 0x04, 0x5f, 0xfa, 0x82, 0xfc, 0x52, 0x1c, 0xd5, 0xb2, 0x44, 0xf8, + 0x2c, 0x80, 0x08, 0x2d, 0xf7, 0xdb, 0xca, 0xf8, 0x00, 0x80, 0xca, 0xf8, + 0x04, 0x80, 0x00, 0x22, 0x0a, 0xf1, 0x48, 0x04, 0x5f, 0xfa, 0x82, 0xfc, + 0x52, 0x1c, 0xd5, 0xb2, 0x44, 0xf8, 0x2c, 0x80, 0x08, 0x2d, 0xf7, 0xdb, + 0x00, 0x22, 0x0a, 0xf1, 0x68, 0x04, 0x5f, 0xfa, 0x82, 0xfc, 0x52, 0x1c, + 0xd5, 0xb2, 0x44, 0xf8, 0x2c, 0x80, 0x04, 0x2d, 0xf7, 0xd3, 0x00, 0x22, + 0x0a, 0xf1, 0x78, 0x04, 0x5f, 0xfa, 0x82, 0xfc, 0x52, 0x1c, 0xd5, 0xb2, + 0x44, 0xf8, 0x2c, 0x80, 0x04, 0x2d, 0xf7, 0xd3, 0xca, 0xf8, 0x88, 0x80, + 0x00, 0x22, 0x0a, 0xf1, 0x8c, 0x04, 0x02, 0x94, 0xd7, 0xb2, 0x44, 0xf8, + 0x27, 0x80, 0x52, 0x1c, 0xd4, 0xb2, 0x04, 0x2c, 0xf5, 0xd3, 0x72, 0x68, + 0xcc, 0x46, 0x00, 0x25, 0x81, 0x46, 0x01, 0x23, 0x02, 0xf6, 0x18, 0x34, + 0xd2, 0xf8, 0xb8, 0x70, 0xef, 0x40, 0xff, 0x07, 0x16, 0xd5, 0x67, 0x5d, + 0x67, 0x45, 0x13, 0xd1, 0xbe, 0xf1, 0x04, 0x0f, 0x0d, 0xd2, 0x03, 0xfa, + 0x09, 0xf7, 0x39, 0x43, 0x0a, 0xf1, 0x28, 0x07, 0x47, 0xf8, 0x25, 0xe0, + 0x0a, 0xf1, 0x78, 0x07, 0x47, 0xf8, 0x2e, 0x50, 0x0e, 0xf1, 0x01, 0x0e, + 0x06, 0xe0, 0x4f, 0xf6, 0x67, 0x70, 0x03, 0xe0, 0x0a, 0xf1, 0x28, 0x07, + 0x47, 0xf8, 0x25, 0x80, 0x6d, 0x1c, 0x08, 0x2d, 0x09, 0xf1, 0x01, 0x09, + 0x01, 0xd0, 0x00, 0x28, 0xd8, 0xd0, 0x02, 0xf1, 0xb8, 0x07, 0x4f, 0xf0, + 0x00, 0x0e, 0x00, 0x25, 0x01, 0x97, 0x50, 0xbb, 0xdd, 0xf8, 0x04, 0xb0, + 0xdb, 0xf8, 0x00, 0x70, 0x4f, 0xf4, 0x80, 0x7b, 0x0b, 0xfa, 0x05, 0xfb, + 0x17, 0xea, 0x0b, 0x0f, 0x16, 0xd0, 0x67, 0x5d, 0x67, 0x45, 0x13, 0xd1, + 0xbe, 0xf1, 0x04, 0x0f, 0x0d, 0xd2, 0x03, 0xfa, 0x09, 0xf7, 0x39, 0x43, + 0x0a, 0xf1, 0x08, 0x07, 0x47, 0xf8, 0x25, 0xe0, 0x0a, 0xf1, 0x68, 0x07, + 0x47, 0xf8, 0x2e, 0x50, 0x0e, 0xf1, 0x01, 0x0e, 0x06, 0xe0, 0x4f, 0xf6, + 0x67, 0x70, 0x03, 0xe0, 0x0a, 0xf1, 0x08, 0x07, 0x47, 0xf8, 0x25, 0x80, + 0x6d, 0x1c, 0x08, 0x2d, 0x09, 0xf1, 0x01, 0x09, 0xd3, 0xd1, 0x04, 0x46, + 0x00, 0x20, 0x4d, 0x46, 0x86, 0x46, 0x4f, 0xf6, 0x67, 0x79, 0x2c, 0xbb, + 0xdd, 0xf8, 0x04, 0xb0, 0xdb, 0xf8, 0x00, 0x70, 0x4f, 0xf4, 0x80, 0x3b, + 0x0b, 0xfa, 0x0e, 0xfb, 0x17, 0xea, 0x0b, 0x0f, 0x12, 0xd0, 0x02, 0xeb, + 0x0e, 0x07, 0x97, 0xf8, 0x00, 0x7c, 0x67, 0x45, 0x0c, 0xd1, 0x48, 0xb9, + 0x03, 0xfa, 0x05, 0xf0, 0x01, 0x43, 0x00, 0x20, 0x4a, 0xf8, 0x2e, 0x00, + 0xca, 0xf8, 0x88, 0xe0, 0x01, 0x20, 0x03, 0xe0, 0x4c, 0x46, 0x01, 0xe0, + 0x4a, 0xf8, 0x2e, 0x80, 0x6d, 0x1c, 0x0e, 0xf1, 0x01, 0x0e, 0xbe, 0xf1, + 0x02, 0x0f, 0xd8, 0xd1, 0x00, 0x27, 0x0d, 0x46, 0xbb, 0x46, 0xe4, 0xb9, + 0xcd, 0xf8, 0x04, 0xc0, 0x5f, 0xfa, 0x8b, 0xf0, 0xf3, 0xf7, 0xb5, 0xff, + 0x58, 0xb3, 0x70, 0x68, 0x2c, 0x21, 0x01, 0xfb, 0x0b, 0xf1, 0x01, 0x44, + 0x01, 0x98, 0x91, 0xf8, 0x44, 0x2e, 0x82, 0x42, 0x21, 0xd1, 0x04, 0x2f, + 0x08, 0xd2, 0x0a, 0xf1, 0x48, 0x00, 0x40, 0xf8, 0x2b, 0x70, 0x02, 0x99, + 0x41, 0xf8, 0x27, 0xb0, 0x7f, 0x1c, 0x1a, 0xe0, 0x4c, 0x46, 0x70, 0x68, + 0x10, 0xf8, 0xb4, 0x1f, 0x8d, 0xf8, 0x00, 0x10, 0x42, 0x78, 0x8d, 0xf8, + 0x01, 0x20, 0x81, 0x78, 0x8d, 0xf8, 0x02, 0x10, 0xc0, 0x78, 0x8d, 0xf8, + 0x03, 0x00, 0x68, 0x46, 0xf1, 0xf7, 0x68, 0xf9, 0x04, 0xb9, 0x35, 0x60, + 0x20, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, 0x0a, 0xf1, 0x48, 0x00, 0x40, 0xf8, + 0x2b, 0x80, 0x0b, 0xf1, 0x01, 0x0b, 0xbb, 0xf1, 0x08, 0x0f, 0xc5, 0xd1, + 0xdf, 0xe7, 0x71, 0x68, 0xd1, 0xf8, 0xb8, 0x00, 0xb1, 0x68, 0x70, 0x47, + 0x02, 0x46, 0x20, 0x48, 0xc1, 0x68, 0x00, 0x20, 0x19, 0xb1, 0x88, 0x18, + 0x4d, 0xf2, 0xcc, 0x31, 0x08, 0x44, 0x70, 0x47, 0x1b, 0x48, 0xc1, 0x68, + 0x00, 0x20, 0x11, 0xb1, 0x41, 0xf2, 0x38, 0x00, 0x08, 0x44, 0x70, 0x47, + 0x02, 0x46, 0x17, 0x48, 0xc1, 0x68, 0x00, 0x20, 0x49, 0xb1, 0x88, 0x18, + 0x90, 0xf8, 0xbc, 0x20, 0x42, 0xf2, 0xe8, 0x70, 0x42, 0x43, 0x88, 0x18, + 0x42, 0xf6, 0x48, 0x41, 0x08, 0x44, 0x70, 0x47, 0x02, 0x46, 0x0f, 0x48, + 0xc1, 0x68, 0x00, 0x20, 0x49, 0xb1, 0x88, 0x18, 0x90, 0xf8, 0xbc, 0x20, + 0x40, 0xf2, 0x04, 0x70, 0x42, 0x43, 0x88, 0x18, 0x41, 0xf2, 0x38, 0x01, + 0x08, 0x44, 0x70, 0x47, 0x07, 0x48, 0xc1, 0x68, 0x00, 0x20, 0x11, 0xb1, + 0x4c, 0xf6, 0xe8, 0x30, 0x08, 0x44, 0x70, 0x47, 0x03, 0x48, 0xc1, 0x68, + 0x00, 0x20, 0x11, 0xb1, 0x4d, 0xf2, 0xb4, 0x30, 0x08, 0x44, 0x70, 0x47, + 0x58, 0x75, 0x02, 0x21, 0xd8, 0x03, 0x00, 0x02, 0x17, 0x0c, 0x7f, 0xc0, + 0x11, 0xdd, 0xaa, 0x55, 0xa8, 0x74, 0x03, 0x21, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, + 0x11, 0x40, 0x29, 0x43, 0x01, 0x70, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0xf8, 0xb5, 0x0c, 0x46, 0x05, 0x00, 0x17, 0x46, 0x47, 0x4e, 0x48, 0x49, + 0x03, 0xd0, 0x02, 0x28, 0x1a, 0xd0, 0x14, 0xd3, 0x00, 0xe0, 0x0c, 0x60, + 0x03, 0x2f, 0x1b, 0xd1, 0xf2, 0xf7, 0x5c, 0xfc, 0x40, 0xb1, 0x00, 0x94, + 0x2b, 0x46, 0x32, 0x46, 0xff, 0x21, 0x01, 0x20, 0xf2, 0xf7, 0x71, 0xfc, + 0xf2, 0xf7, 0x58, 0xfc, 0xbd, 0xe8, 0xf2, 0x40, 0x00, 0x20, 0x0f, 0xf0, + 0xa7, 0xba, 0x02, 0x2f, 0x4c, 0x60, 0xe9, 0xd1, 0x01, 0x20, 0x03, 0xe0, + 0x02, 0x2f, 0x8c, 0x60, 0x38, 0x46, 0xe3, 0xd1, 0x00, 0xf0, 0x3b, 0xf8, + 0xf2, 0xf7, 0x40, 0xfc, 0x70, 0xb1, 0x38, 0x00, 0x08, 0xbf, 0x03, 0x20, + 0x03, 0xd0, 0x01, 0x2f, 0x0c, 0xbf, 0x02, 0x20, 0x01, 0x20, 0x00, 0x94, + 0x2b, 0x46, 0x06, 0xf1, 0x4c, 0x02, 0xff, 0x21, 0xf2, 0xf7, 0x4d, 0xfc, + 0xf1, 0xbd, 0x10, 0xb5, 0x0b, 0x46, 0x00, 0x24, 0x10, 0xb1, 0x01, 0x28, + 0x04, 0xd0, 0x09, 0xe0, 0xff, 0x22, 0x00, 0x21, 0x28, 0x48, 0x02, 0xe0, + 0xff, 0x22, 0x00, 0x21, 0x27, 0x48, 0xff, 0xf7, 0xa5, 0xff, 0x01, 0xe0, + 0x4f, 0xf6, 0x09, 0x74, 0x20, 0x46, 0x10, 0xbd, 0x02, 0x46, 0x00, 0x20, + 0x61, 0xb1, 0x21, 0x4b, 0x12, 0xb1, 0x01, 0x2a, 0x02, 0xd0, 0x04, 0xe0, + 0x1a, 0x78, 0x00, 0xe0, 0x5a, 0x78, 0x0a, 0x70, 0x70, 0x47, 0x4f, 0xf6, + 0x09, 0x70, 0x70, 0x47, 0x4f, 0xf6, 0x0a, 0x70, 0x70, 0x47, 0x10, 0xb5, + 0x04, 0x46, 0xf1, 0xf7, 0x66, 0xfb, 0xef, 0xf3, 0x10, 0x81, 0x72, 0xb6, + 0x01, 0x2c, 0x17, 0x4a, 0x0e, 0xd1, 0x30, 0xb9, 0x10, 0x78, 0x40, 0xf0, + 0x08, 0x03, 0x13, 0x70, 0x00, 0xf0, 0x2e, 0xf8, 0x0f, 0xe0, 0x50, 0x78, + 0x40, 0xf0, 0x08, 0x03, 0x53, 0x70, 0x00, 0xf0, 0x27, 0xf8, 0x10, 0xe0, + 0x02, 0x2c, 0x0f, 0xd1, 0x38, 0xb9, 0x10, 0x78, 0x40, 0xf0, 0x04, 0x03, + 0x13, 0x70, 0x00, 0xf0, 0x17, 0xf8, 0x10, 0x70, 0x06, 0xe0, 0x50, 0x78, + 0x40, 0xf0, 0x04, 0x03, 0x53, 0x70, 0x00, 0xf0, 0x0f, 0xf8, 0x50, 0x70, + 0x81, 0xf3, 0x10, 0x88, 0x10, 0xbd, 0x00, 0x00, 0xa8, 0x8d, 0x04, 0x02, + 0x34, 0x75, 0x02, 0x21, 0x00, 0x02, 0x00, 0x47, 0x01, 0x02, 0x00, 0x47, + 0x43, 0x01, 0x00, 0x47, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0xf0, + 0xfb, 0x00, 0x70, 0x47, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0xf0, + 0xf7, 0x00, 0x70, 0x47, 0x7f, 0xb5, 0xf2, 0xf7, 0xbf, 0xfa, 0x05, 0x46, + 0xf2, 0xf7, 0xbd, 0xfa, 0x00, 0x24, 0x05, 0x43, 0x00, 0x26, 0x25, 0xfa, + 0x06, 0xf0, 0xc0, 0x07, 0x09, 0xd5, 0x69, 0x46, 0x30, 0x46, 0x10, 0xf0, + 0xef, 0xfc, 0x04, 0x00, 0x03, 0xd1, 0x69, 0x46, 0x30, 0x46, 0x10, 0xf0, + 0x0e, 0xff, 0x76, 0x1c, 0x08, 0x2e, 0x01, 0xd2, 0x00, 0x2c, 0xec, 0xd0, + 0xf1, 0xf7, 0xdf, 0xfa, 0x80, 0xb1, 0x01, 0xf0, 0x8b, 0xf9, 0xf2, 0xf7, + 0x91, 0xfa, 0x05, 0x46, 0x00, 0x26, 0x4c, 0xb9, 0x25, 0xfa, 0x06, 0xf0, + 0xc0, 0x07, 0x44, 0xbf, 0x30, 0x46, 0x01, 0xf0, 0xb3, 0xf9, 0x76, 0x1c, + 0x08, 0x2e, 0xf5, 0xd3, 0x20, 0x46, 0x04, 0xb0, 0x70, 0xbd, 0x00, 0x00, + 0x2d, 0xe9, 0xf8, 0x43, 0xb8, 0xb0, 0x04, 0x46, 0x0a, 0xaa, 0x0d, 0xf1, + 0x2a, 0x01, 0x00, 0xf0, 0x7b, 0xf9, 0x00, 0x28, 0x40, 0xf0, 0xbd, 0x80, + 0x00, 0x27, 0xb9, 0x46, 0x00, 0x25, 0x0d, 0xf1, 0x2c, 0x08, 0x10, 0xe0, + 0x04, 0xf1, 0x0c, 0x00, 0x50, 0xf8, 0x25, 0x20, 0x63, 0x79, 0x20, 0x68, + 0x10, 0xf0, 0x15, 0xfa, 0x48, 0xf8, 0x25, 0x00, 0x04, 0xf1, 0x0c, 0x01, + 0x81, 0x44, 0x51, 0xf8, 0x25, 0x20, 0xd7, 0x19, 0x6d, 0x1c, 0xa0, 0x68, + 0x21, 0x79, 0x85, 0x42, 0xea, 0xd3, 0x00, 0x26, 0x00, 0x25, 0x97, 0xfb, + 0xf0, 0xf2, 0x01, 0x29, 0x99, 0xfb, 0xf0, 0xf9, 0x04, 0xf1, 0x21, 0x07, + 0x08, 0xd1, 0x38, 0x78, 0x28, 0xb1, 0x20, 0x68, 0x11, 0x46, 0x10, 0xf0, + 0xd1, 0xfa, 0x06, 0x46, 0x00, 0xe0, 0x7e, 0x78, 0x61, 0x79, 0x01, 0x29, + 0x08, 0xd1, 0x38, 0x78, 0x28, 0xb1, 0x20, 0x68, 0x49, 0x46, 0x10, 0xf0, + 0xc5, 0xfa, 0x05, 0x46, 0x00, 0xe0, 0x7d, 0x78, 0x0e, 0xa8, 0x09, 0x90, + 0x0a, 0x21, 0x00, 0x22, 0x03, 0x23, 0x08, 0x91, 0x07, 0x92, 0x06, 0x93, + 0x4f, 0xf4, 0x40, 0x73, 0xa0, 0x69, 0x05, 0x90, 0x04, 0x92, 0x03, 0x92, + 0x02, 0x93, 0x01, 0x92, 0x00, 0x92, 0xb7, 0xee, 0x00, 0x1a, 0x20, 0x68, + 0xd4, 0xed, 0x07, 0x0a, 0x9f, 0xed, 0x37, 0x0a, 0x00, 0x23, 0x01, 0x21, + 0x10, 0xf0, 0x28, 0xfb, 0x16, 0xa8, 0x02, 0x90, 0x01, 0x96, 0x00, 0x21, + 0x00, 0x91, 0xbd, 0xf8, 0x2a, 0x30, 0x94, 0xf8, 0x20, 0x20, 0x21, 0x79, + 0x20, 0x68, 0x10, 0xf0, 0xef, 0xf9, 0x1a, 0xa8, 0x02, 0x90, 0x01, 0x95, + 0x00, 0x21, 0x00, 0x91, 0xbd, 0xf8, 0x28, 0x30, 0x94, 0xf8, 0x20, 0x20, + 0x61, 0x79, 0x20, 0x68, 0x10, 0xf0, 0xe2, 0xf9, 0x00, 0x27, 0x18, 0x25, + 0x0e, 0xa9, 0x05, 0xfb, 0x07, 0xf2, 0x11, 0x44, 0x01, 0xf1, 0x40, 0x03, + 0xa0, 0x68, 0x07, 0x93, 0x87, 0x42, 0x80, 0x41, 0x00, 0x22, 0x06, 0x92, + 0x01, 0x23, 0xa1, 0x79, 0x05, 0x91, 0x04, 0x92, 0x03, 0x93, 0xc0, 0x0f, + 0x02, 0x92, 0x01, 0x90, 0x00, 0x90, 0x01, 0x22, 0x04, 0xf1, 0x0c, 0x00, + 0x16, 0xa9, 0x50, 0xf8, 0x27, 0x30, 0x20, 0x68, 0x10, 0xf0, 0xdb, 0xf9, + 0x7f, 0x1c, 0x01, 0x2f, 0xde, 0xd9, 0x00, 0x27, 0x0e, 0xa9, 0x05, 0xfb, + 0x07, 0xf2, 0x11, 0x44, 0x01, 0xf1, 0x70, 0x03, 0xa0, 0x68, 0x07, 0x93, + 0x87, 0x42, 0x80, 0x41, 0x00, 0x26, 0x06, 0x96, 0x00, 0x22, 0xe1, 0x79, + 0x05, 0x91, 0x01, 0x23, 0x04, 0x92, 0x03, 0x93, 0xc0, 0x0f, 0x02, 0x96, + 0x01, 0x90, 0x00, 0x90, 0x1a, 0xa9, 0x58, 0xf8, 0x27, 0x30, 0x20, 0x68, + 0x10, 0xf0, 0xbb, 0xf9, 0x7f, 0x1c, 0x01, 0x2f, 0xe0, 0xd9, 0x20, 0x68, + 0x0e, 0xa9, 0xc0, 0x46, 0xc0, 0x46, 0x20, 0x68, 0x00, 0x23, 0x0e, 0xaa, + 0x03, 0x21, 0x10, 0xf0, 0x78, 0xff, 0x39, 0xb0, 0xbd, 0xe8, 0xf0, 0x83, + 0x00, 0x00, 0x00, 0x00, 0x0a, 0x46, 0x03, 0x21, 0x11, 0xf0, 0xc4, 0xb9, + 0x2d, 0xe9, 0xf0, 0x4d, 0x06, 0x46, 0x8e, 0xb0, 0x0d, 0x46, 0x30, 0x68, + 0x03, 0x21, 0x11, 0xf0, 0x56, 0xfa, 0x04, 0x46, 0x4f, 0xf4, 0x40, 0x72, + 0x21, 0x46, 0x01, 0x20, 0x10, 0xf0, 0x27, 0xfb, 0x8d, 0xf8, 0x14, 0x00, + 0x0d, 0xf1, 0x12, 0x02, 0x04, 0xa9, 0x30, 0x46, 0x00, 0xf0, 0x9a, 0xf8, + 0xbd, 0xf8, 0x10, 0x20, 0x31, 0x79, 0x30, 0x68, 0x10, 0xf0, 0x27, 0xf9, + 0xa8, 0x61, 0x21, 0x46, 0x01, 0x20, 0x10, 0xf0, 0x36, 0xfb, 0x28, 0x60, + 0x06, 0xa9, 0xb0, 0x68, 0x68, 0x60, 0x07, 0xa8, 0x96, 0xf8, 0x20, 0x20, + 0x03, 0x90, 0x08, 0xab, 0x02, 0x91, 0x01, 0x93, 0x10, 0x46, 0x2f, 0x68, + 0xbd, 0xf8, 0x12, 0x30, 0xbd, 0xf8, 0x10, 0x10, 0x00, 0x97, 0x10, 0xf0, + 0x49, 0xfc, 0x09, 0x95, 0x00, 0x27, 0x03, 0x94, 0x6e, 0xe0, 0x01, 0x28, + 0x04, 0xbf, 0x70, 0x79, 0x01, 0x28, 0x68, 0xd1, 0xa1, 0x68, 0x30, 0x68, + 0x10, 0xf0, 0xf2, 0xf9, 0x40, 0xb2, 0x40, 0x42, 0xc3, 0xb2, 0x59, 0xe0, + 0x09, 0x98, 0x00, 0xeb, 0x87, 0x04, 0x06, 0xeb, 0x87, 0x00, 0xc1, 0x68, + 0xa1, 0x60, 0xc2, 0x68, 0x73, 0x79, 0x31, 0x79, 0x30, 0x68, 0x10, 0xf0, + 0x08, 0xf9, 0x20, 0x61, 0xb8, 0x1c, 0x8d, 0xf8, 0x08, 0x00, 0xfa, 0xb2, + 0x03, 0x99, 0x01, 0x20, 0x10, 0xf0, 0xff, 0xfa, 0x8b, 0x46, 0x82, 0x46, + 0x9d, 0xf8, 0x08, 0x20, 0x03, 0x99, 0x01, 0x20, 0x10, 0xf0, 0xf7, 0xfa, + 0x0d, 0x46, 0x80, 0x46, 0x0c, 0xa9, 0x0a, 0xa8, 0x00, 0x91, 0x01, 0x90, + 0x9d, 0xf8, 0x08, 0x30, 0x03, 0x99, 0xfa, 0xb2, 0x01, 0x20, 0x10, 0xf0, + 0xff, 0xfa, 0x9d, 0xed, 0x08, 0x0a, 0x50, 0x46, 0x59, 0x46, 0x10, 0xf0, + 0x73, 0xfb, 0x84, 0xed, 0x07, 0x0a, 0x40, 0x46, 0x9d, 0xed, 0x07, 0x0a, + 0x29, 0x46, 0x10, 0xf0, 0x6b, 0xfb, 0x84, 0xed, 0x09, 0x0a, 0xdd, 0xe9, + 0x0c, 0x01, 0x9d, 0xed, 0x06, 0x0a, 0x10, 0xf0, 0x63, 0xfb, 0x84, 0xed, + 0x0b, 0x0a, 0xdd, 0xe9, 0x0a, 0x01, 0x9d, 0xed, 0x06, 0x0a, 0x10, 0xf0, + 0x5b, 0xfb, 0xff, 0xee, 0x00, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0x84, 0xed, + 0x0d, 0x0a, 0x30, 0x79, 0x00, 0x28, 0x04, 0xbf, 0x71, 0x79, 0x01, 0x29, + 0x9d, 0xd1, 0x21, 0x69, 0x30, 0x68, 0x10, 0xf0, 0x95, 0xf9, 0x03, 0x46, + 0x30, 0x68, 0x04, 0xf1, 0x34, 0x02, 0x04, 0xf1, 0x2c, 0x01, 0x10, 0xf0, + 0xad, 0xf9, 0x7f, 0x1c, 0xb0, 0x68, 0x87, 0x42, 0x9a, 0xd3, 0x9d, 0xf8, + 0x14, 0x00, 0x0e, 0xb0, 0xbd, 0xe8, 0xf0, 0x8d, 0xf8, 0xb5, 0x02, 0x91, + 0x03, 0x92, 0x41, 0x69, 0x01, 0x91, 0x01, 0x21, 0x90, 0xf8, 0x20, 0x20, + 0x00, 0x92, 0x43, 0x79, 0x02, 0x79, 0x00, 0x68, 0x10, 0xf0, 0x42, 0xf8, + 0x05, 0xb0, 0x00, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, 0x0a, 0x9c, 0x81, 0x46, + 0x00, 0x2c, 0x1c, 0xbf, 0x09, 0x98, 0x00, 0x28, 0x0d, 0x46, 0x90, 0x46, + 0x1e, 0x46, 0x00, 0xf0, 0xc1, 0x80, 0x08, 0x9f, 0x20, 0x63, 0xa5, 0x22, + 0x4f, 0xea, 0x88, 0x01, 0x0b, 0xf0, 0x24, 0xfc, 0x21, 0x6b, 0x01, 0xeb, + 0x88, 0x00, 0x00, 0x1f, 0x4f, 0xea, 0xd0, 0x08, 0x00, 0x21, 0x04, 0xf1, + 0x34, 0x02, 0x2b, 0x78, 0x13, 0x70, 0x28, 0x78, 0x80, 0xb1, 0x6b, 0x78, + 0x53, 0x70, 0x68, 0x78, 0x60, 0xb1, 0xab, 0x78, 0x93, 0x70, 0xa8, 0x78, + 0x40, 0xb1, 0xeb, 0x78, 0xd3, 0x70, 0xe8, 0x78, 0x20, 0xb1, 0x09, 0x1d, + 0x12, 0x1d, 0x2d, 0x1d, 0x10, 0x29, 0xea, 0xd3, 0x00, 0x20, 0x06, 0x2f, + 0x88, 0xbf, 0x06, 0x27, 0x04, 0xf1, 0x44, 0x05, 0x84, 0xf8, 0x43, 0x00, + 0xe7, 0x62, 0xaf, 0x60, 0xe8, 0x60, 0xc7, 0xf1, 0x07, 0x07, 0x20, 0x1d, + 0x00, 0x21, 0x01, 0x61, 0x04, 0xf1, 0x18, 0x00, 0x00, 0x21, 0x01, 0x61, + 0x24, 0x61, 0xa7, 0x61, 0x64, 0x62, 0x00, 0x20, 0x28, 0x62, 0x00, 0x21, + 0x29, 0x61, 0x68, 0x61, 0xa9, 0x61, 0xe8, 0x61, 0x69, 0x62, 0x04, 0xf1, + 0x6c, 0x00, 0x32, 0x46, 0x01, 0x70, 0x41, 0x70, 0x4f, 0xea, 0xc8, 0x00, + 0x49, 0x46, 0x11, 0xf0, 0x71, 0xfa, 0x20, 0x60, 0x11, 0xf0, 0xa4, 0xfa, + 0xdf, 0xf8, 0x9c, 0x68, 0xf0, 0x6c, 0x40, 0x1c, 0xf0, 0x64, 0xa1, 0x46, + 0xb0, 0x6a, 0xc8, 0xbb, 0xb4, 0x62, 0xf0, 0x6c, 0x01, 0x28, 0x3d, 0xd1, + 0xdf, 0xf8, 0xa0, 0x78, 0x38, 0x46, 0x11, 0xf0, 0xd9, 0xfa, 0x07, 0xf1, + 0x14, 0x00, 0x11, 0xf0, 0xd5, 0xfa, 0x07, 0xf1, 0x28, 0x00, 0x11, 0xf0, + 0xd1, 0xfa, 0x07, 0xf1, 0x3c, 0x00, 0x11, 0xf0, 0xcd, 0xfa, 0x07, 0xf1, + 0x50, 0x00, 0x11, 0xf0, 0xc9, 0xfa, 0x07, 0xf1, 0x64, 0x00, 0x11, 0xf0, + 0xc5, 0xfa, 0x07, 0xf1, 0x78, 0x00, 0x11, 0xf0, 0xc1, 0xfa, 0x06, 0xf1, + 0x7c, 0x00, 0x11, 0xf0, 0xbd, 0xfa, 0x06, 0xf1, 0x90, 0x07, 0x38, 0x46, + 0x11, 0xf0, 0xb8, 0xfa, 0x30, 0x46, 0x11, 0xf0, 0xb5, 0xfa, 0x06, 0xf1, + 0x14, 0x00, 0x11, 0xf0, 0xb1, 0xfa, 0x06, 0xf1, 0x38, 0x00, 0x11, 0xf0, + 0xad, 0xfa, 0x06, 0xf1, 0x7c, 0x00, 0xf0, 0x62, 0x37, 0x63, 0x07, 0xe0, + 0xb0, 0x6d, 0x28, 0xb9, 0xe0, 0x6a, 0xb1, 0x6a, 0xca, 0x6a, 0x90, 0x42, + 0x28, 0xbf, 0xb4, 0x62, 0xb0, 0x6e, 0xdf, 0xf8, 0x24, 0x38, 0x40, 0x1c, + 0xb0, 0x66, 0x28, 0x60, 0x01, 0x22, 0xe0, 0x6a, 0x71, 0x6d, 0x82, 0x40, + 0x11, 0x43, 0x71, 0x65, 0x00, 0xeb, 0x80, 0x02, 0x21, 0x1d, 0x03, 0xeb, + 0x82, 0x00, 0x11, 0xf0, 0x9a, 0xfa, 0x11, 0xf0, 0x51, 0xfa, 0xb0, 0x6d, + 0x80, 0xb1, 0xb0, 0x6a, 0xc1, 0x6a, 0xe0, 0x6a, 0x81, 0x42, 0x0b, 0xd2, + 0xdf, 0xf8, 0xf0, 0x27, 0x4f, 0xf0, 0x80, 0x51, 0x11, 0x60, 0xbf, 0xf3, + 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x01, 0xe0, 0x4f, 0xf0, 0x00, 0x09, + 0x48, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0x70, 0xb5, 0x04, 0x00, 0x2b, 0xd0, + 0xdf, 0xf8, 0xac, 0x57, 0x68, 0x6f, 0x40, 0x1c, 0x68, 0x67, 0x00, 0x20, + 0x2e, 0x6d, 0xa9, 0x6a, 0x81, 0xf8, 0x6d, 0x00, 0xaa, 0x6a, 0x10, 0x1d, + 0x11, 0xf0, 0x99, 0xfa, 0x30, 0xb9, 0xa8, 0x6a, 0x69, 0x6d, 0xc0, 0x6a, + 0x01, 0x22, 0x82, 0x40, 0x91, 0x43, 0x69, 0x65, 0xa4, 0x19, 0xa8, 0x6a, + 0x44, 0x60, 0xb4, 0x42, 0xa8, 0x6a, 0x04, 0xd2, 0x01, 0x1d, 0x28, 0x6b, + 0x11, 0xf0, 0x6d, 0xfa, 0x07, 0xe0, 0x01, 0x1d, 0xe8, 0x6a, 0x11, 0xf0, + 0x68, 0xfa, 0xe8, 0x6e, 0x84, 0x42, 0x38, 0xbf, 0xec, 0x66, 0x00, 0xf0, + 0x47, 0xf9, 0x40, 0xb9, 0xdf, 0xf8, 0x74, 0x17, 0x4f, 0xf0, 0x80, 0x50, + 0x08, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x70, 0xbd, + 0x2d, 0xe9, 0xf0, 0x41, 0xdf, 0xf8, 0x3c, 0x67, 0x05, 0x46, 0xb0, 0x6a, + 0x85, 0x42, 0x08, 0xbf, 0x00, 0x20, 0x21, 0xd0, 0x11, 0xf0, 0xea, 0xf9, + 0x6c, 0x69, 0xd6, 0xf8, 0x2c, 0x80, 0x37, 0x6b, 0x11, 0xf0, 0xf0, 0xf9, + 0x44, 0x45, 0x18, 0xbf, 0xbc, 0x42, 0x0b, 0xd0, 0x06, 0xf1, 0x38, 0x01, + 0x8c, 0x42, 0x0a, 0xd1, 0xa8, 0x6a, 0x28, 0xb9, 0x95, 0xf8, 0x6c, 0x00, + 0x01, 0x28, 0x18, 0xbf, 0x03, 0x20, 0x09, 0xd1, 0x02, 0x20, 0xbd, 0xe8, + 0xf0, 0x81, 0x06, 0xf1, 0x14, 0x00, 0x84, 0x42, 0x16, 0xbf, 0x00, 0x2c, + 0x04, 0x20, 0x01, 0x20, 0xbd, 0xe8, 0xf0, 0x81, 0x38, 0xb5, 0x04, 0x46, + 0x11, 0xf0, 0xc4, 0xf9, 0xdf, 0xf8, 0xdc, 0x56, 0x04, 0xb9, 0xac, 0x6a, + 0x20, 0x1d, 0x11, 0xf0, 0x38, 0xfa, 0x70, 0xb9, 0xe1, 0x6a, 0xdf, 0xf8, + 0xe8, 0x26, 0x01, 0xeb, 0x81, 0x03, 0x9b, 0x00, 0xd0, 0x58, 0x30, 0xb9, + 0x68, 0x6d, 0x01, 0x22, 0x02, 0xfa, 0x01, 0xf1, 0x20, 0xea, 0x01, 0x01, + 0x69, 0x65, 0xa0, 0x6a, 0x18, 0xb1, 0x04, 0xf1, 0x18, 0x00, 0x11, 0xf0, + 0x22, 0xfa, 0x21, 0x1d, 0x05, 0xf1, 0x38, 0x00, 0x11, 0xf0, 0xf5, 0xf9, + 0x94, 0xf8, 0x6c, 0x00, 0x01, 0x28, 0x04, 0xbf, 0x00, 0x21, 0x84, 0xf8, + 0x6c, 0x10, 0x11, 0xf0, 0xa5, 0xf9, 0xa8, 0x6d, 0x28, 0xb1, 0x11, 0xf0, + 0x95, 0xf9, 0x00, 0xf0, 0x51, 0xfb, 0x11, 0xf0, 0x9d, 0xf9, 0xa9, 0x6a, + 0x8c, 0x42, 0x15, 0xd1, 0xa8, 0x6d, 0x48, 0xb1, 0xdf, 0xf8, 0x8c, 0x06, + 0x4f, 0xf0, 0x80, 0x51, 0x01, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, + 0x6f, 0x8f, 0x31, 0xbd, 0xa8, 0x6b, 0xe9, 0x6c, 0x88, 0x42, 0x02, 0xd1, + 0x00, 0x20, 0xa8, 0x62, 0x31, 0xbd, 0xbd, 0xe8, 0x31, 0x40, 0xa7, 0xe1, + 0x31, 0xbd, 0x01, 0x46, 0xdf, 0xf8, 0x40, 0x26, 0x4b, 0x69, 0x00, 0x20, + 0x02, 0xf1, 0x38, 0x0c, 0x63, 0x45, 0x04, 0xd1, 0x89, 0x6a, 0x91, 0x42, + 0x01, 0xd0, 0x01, 0xb9, 0x01, 0x20, 0x70, 0x47, 0x38, 0xb5, 0xdf, 0xf8, + 0x24, 0x56, 0x04, 0x46, 0xa8, 0x6a, 0x84, 0x42, 0x18, 0xbf, 0x00, 0x2c, + 0x29, 0xd0, 0x11, 0xf0, 0x5d, 0xf9, 0x20, 0x46, 0xff, 0xf7, 0xe3, 0xff, + 0xf8, 0xb1, 0x20, 0x1d, 0x11, 0xf0, 0xd1, 0xf9, 0xe0, 0x6a, 0x69, 0x6d, + 0xdf, 0xf8, 0x18, 0x36, 0x01, 0x22, 0x82, 0x40, 0x11, 0x43, 0x69, 0x65, + 0x00, 0xeb, 0x80, 0x02, 0x21, 0x1d, 0x03, 0xeb, 0x82, 0x00, 0x11, 0xf0, + 0x9a, 0xf9, 0xe0, 0x6a, 0xa9, 0x6a, 0xca, 0x6a, 0x90, 0x42, 0x08, 0xd3, + 0xdf, 0xf8, 0xf8, 0x15, 0x4f, 0xf0, 0x80, 0x50, 0x08, 0x60, 0xbf, 0xf3, + 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0xbd, 0xe8, 0x31, 0x40, 0x11, 0xf0, + 0x41, 0xb9, 0x31, 0xbd, 0xf8, 0xb5, 0x04, 0x46, 0x00, 0x25, 0xef, 0xf3, + 0x11, 0x86, 0x30, 0x20, 0x80, 0xf3, 0x11, 0x88, 0xbf, 0xf3, 0x4f, 0x8f, + 0xbf, 0xf3, 0x6f, 0x8f, 0x20, 0x46, 0xff, 0xf7, 0xae, 0xff, 0xf8, 0xb1, + 0xdf, 0xf8, 0x9c, 0x75, 0x78, 0x6f, 0xb0, 0xb9, 0xe0, 0x6a, 0xb9, 0x6a, + 0xca, 0x6a, 0x90, 0x42, 0x28, 0xbf, 0x01, 0x25, 0x20, 0x1d, 0x11, 0xf0, + 0x92, 0xf9, 0xe0, 0x6a, 0x79, 0x6d, 0xdf, 0xf8, 0x9c, 0x35, 0x01, 0x22, + 0x82, 0x40, 0x11, 0x43, 0x79, 0x65, 0x00, 0xeb, 0x80, 0x02, 0x21, 0x1d, + 0x03, 0xeb, 0x82, 0x00, 0x02, 0xe0, 0x04, 0xf1, 0x18, 0x01, 0x38, 0x46, + 0x11, 0xf0, 0x57, 0xf9, 0x86, 0xf3, 0x11, 0x88, 0x28, 0x46, 0xf2, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x86, 0xb0, 0x00, 0x21, 0x05, 0x91, + 0x04, 0x91, 0x03, 0xaa, 0x04, 0xa9, 0x05, 0xa8, 0x11, 0xf0, 0x8f, 0xf9, + 0x05, 0x98, 0x04, 0x99, 0xdf, 0xf8, 0x38, 0x45, 0x02, 0x90, 0x00, 0x22, + 0x00, 0x92, 0x01, 0x91, 0x00, 0x23, 0x03, 0x9a, 0x12, 0xa1, 0x0f, 0xf2, + 0xc9, 0x40, 0xff, 0xf7, 0xe3, 0xfd, 0x20, 0x67, 0xd8, 0xb1, 0x00, 0xf0, + 0xef, 0xfb, 0x01, 0x28, 0x17, 0xd1, 0x30, 0x20, 0x80, 0xf3, 0x11, 0x88, + 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x4f, 0xf0, 0xff, 0x31, + 0xe1, 0x66, 0x01, 0x20, 0xa0, 0x65, 0x00, 0x21, 0x21, 0x65, 0xfc, 0xf7, + 0xf8, 0xf9, 0xa0, 0x6a, 0xc1, 0x6a, 0xa0, 0x6a, 0x40, 0x6d, 0x11, 0xf0, + 0x59, 0xf9, 0x11, 0xf0, 0xad, 0xf8, 0x06, 0xb0, 0x10, 0xbd, 0x00, 0x00, + 0x49, 0x44, 0x4c, 0x45, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0xd4, 0x04, + 0x41, 0x6f, 0x49, 0x1c, 0x41, 0x67, 0x70, 0x47, 0x70, 0xb5, 0x11, 0xf0, + 0xb7, 0xf8, 0xdf, 0xf8, 0xc4, 0x64, 0x70, 0x6f, 0x40, 0x1e, 0x70, 0x67, + 0x00, 0x24, 0x70, 0x6f, 0x00, 0x25, 0x00, 0x28, 0x3d, 0xd1, 0xf0, 0x6c, + 0xf8, 0xb9, 0x3a, 0xe0, 0xf0, 0x68, 0xc4, 0x68, 0x04, 0xf1, 0x18, 0x00, + 0x11, 0xf0, 0x1f, 0xf9, 0x20, 0x1d, 0x11, 0xf0, 0x1c, 0xf9, 0xe0, 0x6a, + 0x71, 0x6d, 0xdf, 0xf8, 0xb0, 0x34, 0x01, 0x22, 0x82, 0x40, 0x11, 0x43, + 0x71, 0x65, 0x00, 0xeb, 0x80, 0x02, 0x21, 0x1d, 0x03, 0xeb, 0x82, 0x00, + 0x11, 0xf0, 0xe5, 0xf8, 0xe0, 0x6a, 0xb1, 0x6a, 0xca, 0x6a, 0x90, 0x42, + 0x24, 0xbf, 0x01, 0x21, 0x31, 0x66, 0x30, 0x68, 0x00, 0x28, 0xdd, 0xd1, + 0x0c, 0xb1, 0x00, 0xf0, 0x43, 0xfa, 0xf4, 0x6d, 0x3c, 0xb1, 0x00, 0xf0, + 0x56, 0xf8, 0x08, 0xb1, 0x01, 0x20, 0x30, 0x66, 0x64, 0x1e, 0xf8, 0xd1, + 0xf5, 0x65, 0x30, 0x6e, 0x48, 0xb1, 0xdf, 0xf8, 0x68, 0x14, 0x4f, 0xf0, + 0x80, 0x50, 0x01, 0x25, 0x08, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, + 0x6f, 0x8f, 0x11, 0xf0, 0x79, 0xf8, 0x28, 0x46, 0x70, 0xbd, 0x00, 0xe0, + 0x00, 0x00, 0xdf, 0xf8, 0x28, 0x04, 0x00, 0x6d, 0x70, 0x47, 0xdf, 0xf8, + 0x9c, 0x06, 0x00, 0x6f, 0x70, 0x47, 0x70, 0xb5, 0xdf, 0xf8, 0x14, 0x54, + 0x69, 0x6f, 0x49, 0x1c, 0x69, 0x67, 0x04, 0x46, 0xff, 0xf7, 0x62, 0xfe, + 0x02, 0x28, 0x25, 0xd1, 0x20, 0x1d, 0x11, 0xf0, 0xce, 0xf8, 0x11, 0xf0, + 0x51, 0xf8, 0xa0, 0x6a, 0x01, 0x26, 0x28, 0xb1, 0x04, 0xf1, 0x18, 0x00, + 0x11, 0xf0, 0xc5, 0xf8, 0x84, 0xf8, 0x6d, 0x60, 0x11, 0xf0, 0x52, 0xf8, + 0xe0, 0x6a, 0x69, 0x6d, 0xdf, 0xf8, 0xf8, 0x33, 0x06, 0xfa, 0x00, 0xf2, + 0x11, 0x43, 0x69, 0x65, 0x00, 0xeb, 0x80, 0x02, 0x21, 0x1d, 0x03, 0xeb, + 0x82, 0x00, 0x11, 0xf0, 0x8a, 0xf8, 0xa8, 0x6a, 0xc1, 0x6a, 0xe0, 0x6a, + 0x81, 0x42, 0x02, 0xd2, 0x2e, 0x66, 0x00, 0xe0, 0x00, 0x26, 0xff, 0xf7, + 0x73, 0xff, 0x30, 0x46, 0x70, 0xbd, 0xf8, 0xb5, 0xdf, 0xf8, 0xa8, 0x73, + 0x78, 0x6f, 0x00, 0x26, 0x00, 0x28, 0x49, 0xd1, 0x3c, 0x6d, 0x64, 0x1c, + 0x3c, 0x65, 0x08, 0xd1, 0xf8, 0x6a, 0x39, 0x6b, 0xf9, 0x62, 0x38, 0x63, + 0x78, 0x6e, 0x40, 0x1c, 0x78, 0x66, 0x00, 0xf0, 0xd5, 0xf9, 0xf8, 0x6e, + 0x84, 0x42, 0x2b, 0xd3, 0x1d, 0xe0, 0x28, 0x1d, 0x11, 0xf0, 0x8b, 0xf8, + 0xa8, 0x6a, 0x18, 0xb1, 0x05, 0xf1, 0x18, 0x00, 0x11, 0xf0, 0x85, 0xf8, + 0xe8, 0x6a, 0x79, 0x6d, 0xdf, 0xf8, 0x80, 0x33, 0x01, 0x22, 0x82, 0x40, + 0x11, 0x43, 0x79, 0x65, 0x00, 0xeb, 0x80, 0x02, 0x29, 0x1d, 0x03, 0xeb, + 0x82, 0x00, 0x11, 0xf0, 0x4e, 0xf8, 0xe8, 0x6a, 0xb9, 0x6a, 0xca, 0x6a, + 0x90, 0x42, 0x28, 0xbf, 0x01, 0x26, 0xf8, 0x6a, 0x00, 0x68, 0x30, 0xb1, + 0xf8, 0x6a, 0xc1, 0x68, 0xcd, 0x68, 0x68, 0x68, 0x84, 0x42, 0xd8, 0xd2, + 0x01, 0xe0, 0x4f, 0xf0, 0xff, 0x30, 0xf8, 0x66, 0xb8, 0x6a, 0xdf, 0xf8, + 0x40, 0x13, 0xc0, 0x6a, 0x00, 0xeb, 0x80, 0x02, 0x92, 0x00, 0x89, 0x58, + 0xf8, 0x6d, 0x02, 0x29, 0x28, 0xbf, 0x01, 0x26, 0x28, 0xb9, 0x02, 0xe0, + 0xf8, 0x6d, 0x40, 0x1c, 0xf8, 0x65, 0x11, 0xf0, 0x6f, 0xf8, 0x38, 0x6e, + 0x00, 0xb1, 0x01, 0x26, 0x30, 0x46, 0xf2, 0xbd, 0x10, 0xb5, 0xbd, 0x4c, + 0x60, 0x6f, 0x10, 0xb1, 0x01, 0x21, 0x21, 0x66, 0x10, 0xbd, 0x20, 0x66, + 0xa0, 0x6a, 0xc1, 0x6a, 0xa2, 0x6a, 0x50, 0x6d, 0x11, 0xf0, 0x50, 0xf8, + 0xfc, 0xf7, 0x0f, 0xf9, 0xa1, 0x6f, 0x81, 0x42, 0x04, 0xd2, 0xa2, 0x6a, + 0x53, 0x6e, 0xc3, 0x18, 0x59, 0x1a, 0x51, 0x66, 0xa0, 0x67, 0xa0, 0x6a, + 0x00, 0x6b, 0xa1, 0x6a, 0x0a, 0x68, 0x90, 0x42, 0x05, 0xd3, 0xa0, 0x6a, + 0x00, 0xf1, 0x34, 0x01, 0xa0, 0x6a, 0x11, 0xf0, 0x42, 0xf8, 0x61, 0x6d, + 0xb1, 0x48, 0xb1, 0xfa, 0x81, 0xf1, 0x49, 0x42, 0x01, 0xeb, 0x81, 0x02, + 0x00, 0xeb, 0x82, 0x00, 0x00, 0xf5, 0x1b, 0x70, 0x00, 0xf1, 0x08, 0x02, + 0x41, 0x68, 0x49, 0x68, 0x41, 0x60, 0x91, 0x42, 0x04, 0xbf, 0x49, 0x68, + 0x41, 0x60, 0x40, 0x68, 0xc1, 0x68, 0xa1, 0x62, 0xa0, 0x6a, 0xc1, 0x6a, + 0xa0, 0x6a, 0x40, 0x6d, 0xbd, 0xe8, 0x10, 0x40, 0x11, 0xf0, 0x1c, 0xb8, + 0x70, 0xb5, 0xdf, 0xf8, 0xe8, 0x44, 0xa2, 0x6a, 0x0d, 0x46, 0x02, 0xf1, + 0x18, 0x01, 0x10, 0xf0, 0xe4, 0xff, 0x26, 0x6d, 0xa1, 0x6a, 0x00, 0x20, + 0x81, 0xf8, 0x6d, 0x00, 0xa0, 0x6a, 0x00, 0x1d, 0x10, 0xf0, 0xf5, 0xff, + 0x30, 0xb9, 0xa0, 0x6a, 0x61, 0x6d, 0xc0, 0x6a, 0x01, 0x22, 0x82, 0x40, + 0x91, 0x43, 0x61, 0x65, 0x15, 0xf1, 0x01, 0x0f, 0x00, 0xd1, 0x41, 0xe0, + 0xa0, 0x6a, 0xad, 0x19, 0x45, 0x60, 0xb5, 0x42, 0xa0, 0x6a, 0x00, 0xd2, + 0x42, 0xe0, 0x01, 0x1d, 0xe0, 0x6a, 0x10, 0xf0, 0xc4, 0xff, 0xe0, 0x6e, + 0x85, 0x42, 0x38, 0xbf, 0xe5, 0x66, 0x70, 0xbd, 0x70, 0xb5, 0xdf, 0xf8, + 0x8c, 0x44, 0x15, 0x46, 0xa2, 0x6a, 0x41, 0xf0, 0x00, 0x41, 0x91, 0x61, + 0xa3, 0x6a, 0x03, 0xf1, 0x18, 0x01, 0x10, 0xf0, 0xa4, 0xff, 0x26, 0x6d, + 0xa1, 0x6a, 0x00, 0x20, 0x81, 0xf8, 0x6d, 0x00, 0xa0, 0x6a, 0x00, 0x1d, + 0x10, 0xf0, 0xc3, 0xff, 0x30, 0xb9, 0xa0, 0x6a, 0x61, 0x6d, 0xc0, 0x6a, + 0x01, 0x22, 0x82, 0x40, 0x91, 0x43, 0x61, 0x65, 0x15, 0xf1, 0x01, 0x0f, + 0x00, 0xd1, 0x0f, 0xe0, 0xa0, 0x6a, 0xad, 0x19, 0x45, 0x60, 0xb5, 0x42, + 0xa0, 0x6a, 0x00, 0xd2, 0x10, 0xe0, 0x01, 0x1d, 0xe0, 0x6a, 0x10, 0xf0, + 0x92, 0xff, 0xe0, 0x6e, 0x85, 0x42, 0x38, 0xbf, 0xe5, 0x66, 0x70, 0xbd, + 0xa0, 0x6a, 0x01, 0x1d, 0x04, 0xf1, 0x38, 0x00, 0xbd, 0xe8, 0x70, 0x40, + 0x10, 0xf0, 0x77, 0xbf, 0x01, 0x1d, 0x20, 0x6b, 0xbd, 0xe8, 0x70, 0x40, + 0x10, 0xf0, 0x7f, 0xbf, 0x38, 0xb5, 0x14, 0x46, 0x63, 0x4a, 0x93, 0x6a, + 0x0d, 0x46, 0x03, 0xf1, 0x18, 0x01, 0x10, 0xf0, 0x68, 0xff, 0x0c, 0xb1, + 0x4f, 0xf0, 0xff, 0x35, 0x21, 0x46, 0x28, 0x46, 0xbd, 0xe8, 0x34, 0x40, + 0x00, 0xf0, 0xbf, 0xb9, 0x38, 0xb5, 0xc1, 0x68, 0x5a, 0x4c, 0xcd, 0x68, + 0x05, 0xf1, 0x18, 0x00, 0x10, 0xf0, 0x7f, 0xff, 0x60, 0x6f, 0x80, 0xb9, + 0x28, 0x1d, 0x10, 0xf0, 0x7a, 0xff, 0xe8, 0x6a, 0x61, 0x6d, 0xdf, 0xf8, + 0xd0, 0x33, 0x01, 0x22, 0x82, 0x40, 0x11, 0x43, 0x61, 0x65, 0x00, 0xeb, + 0x80, 0x02, 0x29, 0x1d, 0x03, 0xeb, 0x82, 0x00, 0x02, 0xe0, 0x05, 0xf1, + 0x18, 0x01, 0x20, 0x46, 0x10, 0xf0, 0x3f, 0xff, 0xa0, 0x6a, 0xc1, 0x6a, + 0xe8, 0x6a, 0x81, 0x42, 0x02, 0xd2, 0x01, 0x20, 0x20, 0x66, 0x32, 0xbd, + 0x00, 0x20, 0x32, 0xbd, 0x38, 0xb5, 0x41, 0xf0, 0x00, 0x41, 0x01, 0x60, + 0xc4, 0x68, 0x44, 0x4d, 0x10, 0xf0, 0x55, 0xff, 0x20, 0x1d, 0x10, 0xf0, + 0x52, 0xff, 0xe0, 0x6a, 0x69, 0x6d, 0xdf, 0xf8, 0x80, 0x33, 0x01, 0x22, + 0x82, 0x40, 0x11, 0x43, 0x69, 0x65, 0x00, 0xeb, 0x80, 0x02, 0x21, 0x1d, + 0x03, 0xeb, 0x82, 0x00, 0x10, 0xf0, 0x1b, 0xff, 0xa8, 0x6a, 0xc1, 0x6a, + 0xe0, 0x6a, 0x81, 0x42, 0x3c, 0xbf, 0x01, 0x21, 0x29, 0x66, 0x31, 0xbd, + 0xdf, 0xf8, 0x50, 0x13, 0x4a, 0x6e, 0x02, 0x60, 0x09, 0x6d, 0x41, 0x60, + 0x70, 0x47, 0xf8, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x10, 0xf0, 0xb4, 0xfe, + 0xdf, 0xf8, 0x38, 0x13, 0x0a, 0x6d, 0x63, 0x68, 0x8f, 0x6a, 0x97, 0xf8, + 0x6d, 0x00, 0xd6, 0x1a, 0x20, 0xb1, 0x88, 0x6a, 0x00, 0x22, 0x80, 0xf8, + 0x6d, 0x20, 0x16, 0xe0, 0x28, 0x68, 0x10, 0xf1, 0x01, 0x0f, 0x0e, 0xd0, + 0x4f, 0x6e, 0xd4, 0xf8, 0x00, 0xc0, 0x67, 0x45, 0x01, 0xd0, 0x9a, 0x42, + 0x0b, 0xd2, 0x86, 0x42, 0x07, 0xd2, 0x86, 0x1b, 0x2e, 0x60, 0x48, 0x6e, + 0x20, 0x60, 0x09, 0x6d, 0x61, 0x60, 0x00, 0x24, 0x02, 0xe0, 0x00, 0x20, + 0x28, 0x60, 0x01, 0x24, 0x10, 0xf0, 0x98, 0xfe, 0x20, 0x46, 0xf2, 0xbd, + 0xdf, 0xf8, 0xe4, 0x12, 0x01, 0x20, 0x08, 0x66, 0x70, 0x47, 0x00, 0x00, + 0xf8, 0xb5, 0x1f, 0x4c, 0x1d, 0x4e, 0xdf, 0xf8, 0xd4, 0x72, 0x4f, 0xf0, + 0x80, 0x55, 0x0e, 0xe0, 0x10, 0xf0, 0x7a, 0xfe, 0x38, 0x6a, 0xc1, 0x68, + 0x08, 0x1d, 0x10, 0xf0, 0xf0, 0xfe, 0xf8, 0x6c, 0x40, 0x1e, 0xf8, 0x64, + 0x78, 0x6b, 0x40, 0x1e, 0x78, 0x63, 0x10, 0xf0, 0x79, 0xfe, 0x78, 0x6b, + 0x00, 0x28, 0xed, 0xd1, 0x31, 0x68, 0x02, 0x29, 0x04, 0xd3, 0x25, 0x60, + 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x10, 0xf0, 0xf5, 0xfe, + 0xf1, 0xe7, 0x04, 0x29, 0x06, 0xda, 0x10, 0xb9, 0xdf, 0xf8, 0x88, 0x02, + 0x80, 0x6a, 0x00, 0xeb, 0x81, 0x00, 0x42, 0x65, 0x70, 0x47, 0x00, 0x00, + 0xc8, 0x65, 0x02, 0x21, 0x02, 0x46, 0x00, 0x20, 0x04, 0x29, 0x06, 0xda, + 0x12, 0xb9, 0xdf, 0xf8, 0x6c, 0x02, 0x82, 0x6a, 0x02, 0xeb, 0x81, 0x00, + 0x40, 0x6d, 0x70, 0x47, 0xc8, 0x68, 0x02, 0x21, 0x04, 0xed, 0x00, 0xe0, + 0xdf, 0xf8, 0x54, 0x12, 0xc8, 0x6a, 0x00, 0x68, 0x10, 0xb9, 0x4f, 0xf0, + 0xff, 0x32, 0x03, 0xe0, 0xc8, 0x6a, 0xc2, 0x68, 0xd0, 0x68, 0x42, 0x68, + 0xca, 0x66, 0x70, 0x47, 0xdf, 0xf8, 0x38, 0x02, 0x80, 0x6a, 0x70, 0x47, + 0xdf, 0xf8, 0x30, 0x12, 0x88, 0x6d, 0x08, 0xb9, 0x01, 0x20, 0x70, 0x47, + 0x48, 0x6f, 0x08, 0xb9, 0x02, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, + 0x70, 0xb5, 0x04, 0x46, 0x00, 0x20, 0x00, 0x2c, 0x42, 0xd0, 0xe1, 0x6a, + 0xdf, 0xf8, 0x0c, 0x52, 0xaa, 0x6a, 0xd3, 0x6a, 0x99, 0x42, 0x35, 0xd2, + 0xa0, 0x69, 0x00, 0x28, 0x04, 0xd4, 0xa8, 0x6a, 0xc2, 0x6a, 0xc2, 0xf1, + 0x07, 0x02, 0xa2, 0x61, 0x01, 0xeb, 0x81, 0x03, 0xdf, 0xf8, 0xf0, 0x61, + 0x62, 0x69, 0x06, 0xeb, 0x83, 0x01, 0x8a, 0x42, 0x20, 0xd1, 0x20, 0x1d, + 0x10, 0xf0, 0x7f, 0xfe, 0x60, 0xb9, 0xe1, 0x6a, 0x01, 0xeb, 0x81, 0x02, + 0x92, 0x00, 0xb0, 0x58, 0x30, 0xb9, 0x68, 0x6d, 0x01, 0x22, 0x02, 0xfa, + 0x01, 0xf1, 0x20, 0xea, 0x01, 0x01, 0x69, 0x65, 0x01, 0x22, 0xa8, 0x6a, + 0xc0, 0x6a, 0xe0, 0x62, 0x82, 0x40, 0x69, 0x6d, 0x11, 0x43, 0x69, 0x65, + 0x00, 0xeb, 0x80, 0x03, 0x21, 0x1d, 0x06, 0xeb, 0x83, 0x00, 0x10, 0xf0, + 0x3a, 0xfe, 0x08, 0xe0, 0xa8, 0x6a, 0xc1, 0x6a, 0xe1, 0x62, 0x04, 0xe0, + 0xe1, 0x6c, 0xaa, 0x6a, 0xd3, 0x6a, 0x99, 0x42, 0x00, 0xd2, 0x01, 0x20, + 0x70, 0xbd, 0x38, 0xb5, 0x04, 0x46, 0x00, 0x21, 0x84, 0xb3, 0x20, 0x6d, + 0xe2, 0x6a, 0xe3, 0x6c, 0x40, 0x1e, 0x9a, 0x42, 0x20, 0x65, 0x29, 0xd0, + 0x40, 0xbb, 0x20, 0x1d, 0x10, 0xf0, 0x47, 0xfe, 0xdf, 0xf8, 0x6c, 0x51, + 0x70, 0xb9, 0xe1, 0x6a, 0x01, 0xeb, 0x81, 0x02, 0x92, 0x00, 0xa8, 0x58, + 0x40, 0xb9, 0xdf, 0xf8, 0x58, 0x01, 0x42, 0x6d, 0x01, 0x23, 0x03, 0xfa, + 0x01, 0xf1, 0x22, 0xea, 0x01, 0x01, 0x41, 0x65, 0x01, 0x23, 0xe2, 0x6c, + 0xe2, 0x62, 0xc2, 0xf1, 0x07, 0x00, 0xa0, 0x61, 0x93, 0x40, 0xdf, 0xf8, + 0x38, 0x01, 0x41, 0x6d, 0x19, 0x43, 0x41, 0x65, 0x02, 0xeb, 0x82, 0x00, + 0x21, 0x1d, 0x05, 0xeb, 0x80, 0x00, 0x10, 0xf0, 0xfa, 0xfd, 0x01, 0x21, + 0x08, 0x46, 0x32, 0xbd, 0x38, 0xb5, 0x04, 0x00, 0x3d, 0xd0, 0xe0, 0x6c, + 0x81, 0x42, 0x38, 0xbf, 0x01, 0x46, 0xe0, 0x6a, 0x88, 0x42, 0x36, 0xd0, + 0x22, 0x6d, 0x01, 0x2a, 0x33, 0xd1, 0xa2, 0x69, 0xdf, 0xf8, 0x00, 0x51, + 0xe1, 0x62, 0x00, 0x2a, 0x5c, 0xbf, 0xc1, 0xf1, 0x07, 0x01, 0xa1, 0x61, + 0x61, 0x69, 0x00, 0xeb, 0x80, 0x02, 0x05, 0xeb, 0x82, 0x02, 0x91, 0x42, + 0x23, 0xd1, 0x20, 0x1d, 0x10, 0xf0, 0xff, 0xfd, 0x70, 0xb9, 0xe1, 0x6a, + 0x01, 0xeb, 0x81, 0x02, 0x92, 0x00, 0xa8, 0x58, 0x40, 0xb9, 0xdf, 0xf8, + 0xcc, 0x00, 0x42, 0x6d, 0x01, 0x23, 0x03, 0xfa, 0x01, 0xf1, 0x22, 0xea, + 0x01, 0x01, 0x41, 0x65, 0xe0, 0x6a, 0xdf, 0xf8, 0xb8, 0x10, 0x4a, 0x6d, + 0x01, 0x23, 0x83, 0x40, 0x1a, 0x43, 0x4a, 0x65, 0x21, 0x1d, 0x00, 0xeb, + 0x80, 0x02, 0x05, 0xeb, 0x82, 0x00, 0xbd, 0xe8, 0x34, 0x40, 0x10, 0xf0, + 0xb6, 0xbd, 0x31, 0xbd, 0xdf, 0xf8, 0x94, 0x10, 0x88, 0x6a, 0x80, 0x69, + 0x8a, 0x6a, 0x89, 0x6a, 0xcb, 0x6a, 0xc3, 0xf1, 0x07, 0x03, 0x93, 0x61, + 0x70, 0x47, 0xdf, 0xf8, 0x80, 0x10, 0x88, 0x6a, 0x18, 0xb1, 0x88, 0x6a, + 0x02, 0x6d, 0x52, 0x1c, 0x02, 0x65, 0x88, 0x6a, 0x70, 0x47, 0xf8, 0xb5, + 0x1a, 0x4d, 0x2f, 0x6d, 0x0c, 0x46, 0xa9, 0x6a, 0x06, 0x46, 0x00, 0x20, + 0x81, 0xf8, 0x6d, 0x00, 0xaa, 0x6a, 0x10, 0x1d, 0x10, 0xf0, 0xbb, 0xfd, + 0x30, 0xb9, 0xa8, 0x6a, 0x69, 0x6d, 0xc0, 0x6a, 0x01, 0x22, 0x82, 0x40, + 0x91, 0x43, 0x69, 0x65, 0x16, 0xf1, 0x01, 0x0f, 0x08, 0xd1, 0x3c, 0xb1, + 0xa8, 0x6a, 0x01, 0x1d, 0x05, 0xf1, 0x38, 0x00, 0xbd, 0xe8, 0xf4, 0x40, + 0x10, 0xf0, 0x7f, 0xbd, 0xa8, 0x6a, 0xf6, 0x19, 0x46, 0x60, 0xbe, 0x42, + 0xa8, 0x6a, 0x05, 0xd2, 0x01, 0x1d, 0x28, 0x6b, 0xbd, 0xe8, 0xf4, 0x40, + 0x10, 0xf0, 0x81, 0xbd, 0x01, 0x1d, 0xe8, 0x6a, 0x10, 0xf0, 0x7d, 0xfd, + 0xe8, 0x6e, 0x86, 0x42, 0x38, 0xbf, 0xee, 0x66, 0xf1, 0xbd, 0x00, 0x00, + 0xc8, 0x65, 0x02, 0x21, 0xc8, 0x68, 0x02, 0x21, 0xfb, 0xf7, 0xf2, 0xbd, + 0xff, 0xf7, 0xdf, 0xba, 0x70, 0xb5, 0x06, 0x46, 0x05, 0x20, 0xfb, 0xf7, + 0xf8, 0xfc, 0x05, 0x20, 0xfb, 0xf7, 0x32, 0xfd, 0xff, 0xf7, 0x99, 0xfc, + 0x00, 0x25, 0xc6, 0xe9, 0x00, 0x05, 0x61, 0xbd, 0xe0, 0xb5, 0x06, 0x46, + 0x05, 0x20, 0xfb, 0xf7, 0xd1, 0xfd, 0x07, 0x46, 0x05, 0x20, 0xfb, 0xf7, + 0x64, 0xfd, 0xff, 0xf7, 0x8a, 0xfc, 0xc6, 0xe9, 0x00, 0x07, 0xc1, 0xbd, + 0x38, 0xb5, 0x86, 0xb0, 0x00, 0xf0, 0x68, 0xf9, 0xdf, 0xf8, 0x50, 0x53, + 0xa8, 0x68, 0x00, 0x24, 0xb8, 0xb1, 0x05, 0x94, 0x04, 0x94, 0x03, 0xaa, + 0x04, 0xa9, 0x05, 0xa8, 0x10, 0xf0, 0x84, 0xfd, 0x05, 0x98, 0x04, 0x99, + 0x02, 0x90, 0x06, 0x22, 0x00, 0x92, 0x01, 0x91, 0x00, 0x23, 0x03, 0x9a, + 0x0f, 0xf2, 0x30, 0x31, 0x0f, 0xf2, 0x91, 0x00, 0xff, 0xf7, 0xd2, 0xf9, + 0xe8, 0x60, 0x00, 0xb1, 0x01, 0x24, 0x20, 0x46, 0x07, 0xb0, 0x30, 0xbd, + 0x2d, 0xe9, 0xf8, 0x43, 0x09, 0x9c, 0x05, 0x46, 0x0e, 0x46, 0x91, 0x46, + 0x98, 0x46, 0x64, 0xb1, 0x08, 0x9f, 0x00, 0xf0, 0x3d, 0xf9, 0x25, 0x60, + 0xa6, 0x61, 0xc4, 0xf8, 0x1c, 0x90, 0xc4, 0xf8, 0x20, 0x80, 0x67, 0x62, + 0x20, 0x1d, 0x00, 0x21, 0x01, 0x61, 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x83, + 0xf8, 0xb5, 0xdf, 0xf8, 0xe0, 0x72, 0xbc, 0x68, 0x05, 0x46, 0x84, 0xb0, + 0x1e, 0x46, 0x00, 0x20, 0xc4, 0xb1, 0x06, 0x29, 0x00, 0x91, 0x01, 0x92, + 0x02, 0x95, 0x0d, 0xda, 0xff, 0xf7, 0x76, 0xfe, 0x02, 0x28, 0xb8, 0x68, + 0x07, 0xbf, 0x0a, 0x9a, 0x00, 0x23, 0x00, 0x23, 0x00, 0x22, 0x69, 0x46, + 0x00, 0xf0, 0x99, 0xfe, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x23, 0x32, 0x46, + 0x69, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x13, 0xff, 0x05, 0xb0, 0xf0, 0xbd, + 0xa6, 0x48, 0xc0, 0x68, 0x70, 0x47, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x43, + 0x89, 0xb0, 0xdf, 0xf8, 0x90, 0x82, 0xa2, 0x4f, 0x4f, 0xf0, 0x80, 0x59, + 0x39, 0x68, 0x08, 0x68, 0x10, 0xb9, 0x01, 0x24, 0x00, 0x25, 0x02, 0xe0, + 0xc8, 0x68, 0x05, 0x68, 0x00, 0x24, 0xff, 0xf7, 0xbb, 0xfb, 0x68, 0x46, + 0x00, 0xf0, 0x96, 0xf8, 0x06, 0x46, 0x00, 0x98, 0x00, 0x28, 0x3d, 0xd1, + 0x44, 0xbb, 0xae, 0x42, 0x2b, 0xd3, 0xff, 0xf7, 0xb5, 0xfb, 0x38, 0x68, + 0xc1, 0x68, 0xcc, 0x68, 0x20, 0x1d, 0x10, 0xf0, 0xe4, 0xfc, 0xe0, 0x69, + 0x01, 0x28, 0x17, 0xd1, 0xa1, 0x69, 0x2b, 0x46, 0x32, 0x46, 0x49, 0x19, + 0x20, 0x46, 0x00, 0xf0, 0xbe, 0xf8, 0x00, 0x28, 0x1c, 0xbf, 0xb8, 0x68, + 0x00, 0x28, 0x0b, 0xd0, 0x00, 0x21, 0x01, 0x91, 0x02, 0x95, 0x03, 0x94, + 0xff, 0xf7, 0x24, 0xfe, 0xb8, 0x68, 0x00, 0x23, 0x00, 0x22, 0x01, 0xa9, + 0x00, 0xf0, 0x4b, 0xfe, 0x61, 0x6a, 0x20, 0x46, 0x88, 0x47, 0x1e, 0xe0, + 0x78, 0x68, 0x01, 0x68, 0x4c, 0x1e, 0xa4, 0x41, 0xe4, 0x0f, 0xb8, 0x68, + 0x22, 0x46, 0xa9, 0x1b, 0x01, 0xf0, 0xf6, 0xf8, 0xff, 0xf7, 0x84, 0xfb, + 0x88, 0xb9, 0xc8, 0xf8, 0x00, 0x90, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, + 0x6f, 0x8f, 0x0a, 0xe0, 0xff, 0xf7, 0x7a, 0xfb, 0x07, 0xe0, 0x02, 0x99, + 0xa1, 0x61, 0x03, 0x46, 0x02, 0x46, 0x09, 0x18, 0x20, 0x46, 0x00, 0xf0, + 0x8a, 0xf8, 0xb8, 0x68, 0x00, 0x22, 0x01, 0xa9, 0x00, 0xf0, 0x01, 0xff, + 0x00, 0x28, 0x9d, 0xd0, 0x01, 0x98, 0x00, 0x28, 0x03, 0xd5, 0x04, 0x99, + 0x03, 0x98, 0x02, 0x9a, 0x90, 0x47, 0x01, 0x98, 0x00, 0x28, 0xee, 0xd4, + 0x03, 0x9c, 0x60, 0x69, 0x10, 0xb1, 0x20, 0x1d, 0x10, 0xf0, 0x8f, 0xfc, + 0x68, 0x46, 0x00, 0xf0, 0x2f, 0xf8, 0x01, 0x99, 0x09, 0x29, 0xe2, 0xd8, + 0xdf, 0xe8, 0x01, 0xf0, 0x07, 0x07, 0x07, 0x05, 0x06, 0x05, 0x07, 0x07, + 0x05, 0x06, 0xda, 0xe7, 0xd1, 0xe7, 0x02, 0x99, 0x02, 0x46, 0xa0, 0x69, + 0x0b, 0x46, 0x41, 0x18, 0x20, 0x46, 0x00, 0xf0, 0x5c, 0xf8, 0x00, 0x28, + 0xcf, 0xd0, 0x61, 0x6a, 0x20, 0x46, 0x88, 0x47, 0xe0, 0x69, 0x01, 0x28, + 0xc9, 0xd1, 0x02, 0x99, 0xa2, 0x69, 0xb8, 0x68, 0x51, 0x18, 0x00, 0x28, + 0xc3, 0xd0, 0x00, 0x22, 0x05, 0x92, 0x06, 0x91, 0x07, 0x94, 0xff, 0xf7, + 0xb9, 0xfd, 0xb8, 0x68, 0x00, 0x23, 0x00, 0x22, 0x05, 0xa9, 0x00, 0xf0, + 0xe0, 0xfd, 0xb6, 0xe7, 0x2d, 0xe9, 0xf0, 0x41, 0x84, 0xb0, 0x04, 0x46, + 0xff, 0xf7, 0x71, 0xfb, 0x4b, 0x4e, 0x80, 0x46, 0x30, 0x69, 0x80, 0x45, + 0x0d, 0xd3, 0x00, 0x21, 0x21, 0x60, 0xc6, 0xf8, 0x10, 0x80, 0x40, 0x46, + 0x04, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, 0x78, 0x60, 0x3f, 0x61, 0x39, 0x1d, + 0x30, 0x68, 0x10, 0xf0, 0x2a, 0xfc, 0x31, 0x68, 0x08, 0x68, 0xf8, 0xb1, + 0xc8, 0x68, 0x05, 0x68, 0xc7, 0x68, 0x38, 0x1d, 0x10, 0xf0, 0x3b, 0xfc, + 0x79, 0x6a, 0x38, 0x46, 0x88, 0x47, 0xf8, 0x69, 0x01, 0x28, 0xf0, 0xd1, + 0xb8, 0x69, 0x40, 0x19, 0x85, 0x42, 0xe6, 0xd3, 0xb0, 0x68, 0x00, 0x28, + 0xe9, 0xd0, 0x00, 0x21, 0x00, 0x91, 0x01, 0x95, 0x02, 0x97, 0xff, 0xf7, + 0x7d, 0xfd, 0xb0, 0x68, 0x00, 0x23, 0x00, 0x22, 0x69, 0x46, 0x00, 0xf0, + 0xa4, 0xfd, 0xdc, 0xe7, 0x70, 0x68, 0x71, 0x60, 0x30, 0x60, 0x01, 0x21, + 0xca, 0xe7, 0x10, 0xb5, 0x00, 0x24, 0x8a, 0x42, 0x41, 0x60, 0x00, 0x61, + 0x07, 0xd3, 0x81, 0x69, 0xd2, 0x1a, 0x8a, 0x42, 0x07, 0xd2, 0x29, 0x4a, + 0x01, 0x1d, 0x50, 0x68, 0x08, 0xe0, 0x9a, 0x42, 0x03, 0xd2, 0x99, 0x42, + 0x01, 0xd3, 0x01, 0x24, 0x04, 0xe0, 0x01, 0x1d, 0x23, 0x48, 0x00, 0x68, + 0x10, 0xf0, 0xe9, 0xfb, 0x20, 0x46, 0x10, 0xbd, 0x1c, 0xb5, 0x10, 0xf0, + 0x83, 0xfb, 0x1f, 0x4c, 0xa0, 0x68, 0xe0, 0xb9, 0x04, 0xf1, 0x14, 0x00, + 0x10, 0xf0, 0xc2, 0xfb, 0x04, 0xf1, 0x28, 0x00, 0x10, 0xf0, 0xbe, 0xfb, + 0x04, 0xf1, 0x14, 0x00, 0x04, 0xf1, 0x28, 0x01, 0x00, 0x22, 0x20, 0x60, + 0x61, 0x60, 0x00, 0x92, 0x04, 0xf1, 0x3c, 0x03, 0x04, 0xf1, 0x8c, 0x02, + 0x10, 0x21, 0x10, 0x20, 0x00, 0xf0, 0xfc, 0xfc, 0xa0, 0x60, 0x10, 0xb1, + 0x14, 0xa1, 0x00, 0xf0, 0xfe, 0xff, 0xbd, 0xe8, 0x13, 0x40, 0x10, 0xf0, + 0x6b, 0xbb, 0x10, 0xb5, 0x04, 0x46, 0x10, 0xf0, 0x5b, 0xfb, 0x24, 0x6a, + 0x10, 0xf0, 0x64, 0xfb, 0x20, 0x46, 0x10, 0xbd, 0x38, 0xb5, 0x84, 0xb0, + 0x1c, 0x46, 0x03, 0x92, 0x01, 0x90, 0x22, 0x46, 0x05, 0x4c, 0xa0, 0x68, + 0x02, 0x91, 0x4f, 0xf0, 0xff, 0x35, 0x00, 0x95, 0x00, 0x23, 0x69, 0x46, + 0x00, 0xf0, 0x43, 0xfd, 0x05, 0xb0, 0x30, 0xbd, 0x00, 0x58, 0x02, 0x21, + 0x04, 0xed, 0x00, 0xe0, 0x54, 0x6d, 0x72, 0x20, 0x53, 0x76, 0x63, 0x00, + 0x54, 0x6d, 0x72, 0x51, 0x00, 0x00, 0x00, 0x00, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, 0x0d, 0xf8, 0x01, 0x70, + 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, + 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x70, 0x47, + 0x2d, 0xe9, 0xf0, 0x41, 0xac, 0x4c, 0xdf, 0xf8, 0xb4, 0x82, 0x20, 0x68, + 0xd0, 0xf8, 0xb8, 0x50, 0x05, 0xf0, 0xff, 0x05, 0xff, 0x27, 0x00, 0x26, + 0x25, 0xfa, 0x06, 0xf0, 0xc0, 0x07, 0x15, 0xd5, 0x20, 0x68, 0xf1, 0xb2, + 0x01, 0x44, 0x91, 0xf8, 0xbc, 0x20, 0xed, 0x21, 0x11, 0xfb, 0x02, 0xf2, + 0x10, 0x44, 0x4f, 0xf0, 0xe0, 0x52, 0x90, 0xf8, 0xc0, 0x34, 0x58, 0xf8, + 0x26, 0x00, 0xbb, 0x42, 0x98, 0xbf, 0x1f, 0x46, 0x1a, 0x21, 0x00, 0x1d, + 0xff, 0xf7, 0xc9, 0xff, 0x76, 0x1c, 0x08, 0x2e, 0xe2, 0xd3, 0x04, 0x2f, + 0x06, 0xd2, 0x3b, 0x46, 0xbd, 0xe8, 0xf0, 0x41, 0x60, 0x22, 0x05, 0x21, + 0x97, 0x48, 0xb3, 0xe7, 0xbd, 0xe8, 0xf0, 0x81, 0x70, 0x47, 0x70, 0xb5, + 0x01, 0x28, 0x0c, 0x46, 0x33, 0xd8, 0x94, 0x49, 0x94, 0x4a, 0x51, 0xf8, + 0x20, 0x50, 0x52, 0xf8, 0x20, 0x60, 0x23, 0x7b, 0x4f, 0xf4, 0x80, 0x72, + 0x08, 0x21, 0x00, 0xf0, 0x29, 0xf8, 0x63, 0x7b, 0x70, 0x22, 0x04, 0x21, + 0x05, 0xf1, 0x08, 0x00, 0xff, 0xf7, 0xa3, 0xff, 0x06, 0xf1, 0x14, 0x05, + 0xa3, 0x68, 0x8b, 0x4a, 0x04, 0x21, 0x00, 0xf0, 0x1b, 0xf8, 0x00, 0x23, + 0x04, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x16, 0xf8, 0x01, 0x23, 0x08, 0x22, + 0x03, 0x21, 0x00, 0xf0, 0x11, 0xf8, 0x63, 0x68, 0x6f, 0xf0, 0x7f, 0x42, + 0x00, 0x21, 0x06, 0xf1, 0x18, 0x00, 0xff, 0xf7, 0x8a, 0xff, 0x28, 0x46, + 0xbd, 0xe8, 0x70, 0x40, 0x01, 0x23, 0x4f, 0xf0, 0x00, 0x52, 0x1d, 0x21, + 0x81, 0xe7, 0x70, 0xbd, 0x28, 0x46, 0x7e, 0xe7, 0x10, 0xb5, 0x76, 0x4c, + 0x54, 0xf8, 0x20, 0x00, 0xbd, 0xe8, 0x10, 0x40, 0x01, 0x23, 0xff, 0xe7, + 0x4f, 0xf4, 0x80, 0x32, 0x10, 0x21, 0x0c, 0x30, 0x71, 0xe7, 0x38, 0xb5, + 0x71, 0x4d, 0x04, 0x46, 0x55, 0xf8, 0x24, 0x00, 0x01, 0x23, 0x80, 0x22, + 0x07, 0x21, 0x08, 0x30, 0xff, 0xf7, 0x67, 0xff, 0x01, 0x23, 0x80, 0x22, + 0x07, 0x21, 0x6a, 0x48, 0xff, 0xf7, 0x58, 0xff, 0x6a, 0x48, 0x50, 0xf8, + 0x24, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x01, 0x23, 0x10, 0x22, + 0x04, 0x21, 0x56, 0xe7, 0x70, 0xb5, 0x15, 0x46, 0x66, 0x4a, 0x64, 0x4b, + 0x52, 0xf8, 0x20, 0x40, 0x53, 0xf8, 0x21, 0x10, 0x04, 0xf1, 0x10, 0x02, + 0x00, 0x26, 0x13, 0x68, 0xc3, 0xf3, 0x02, 0x12, 0x23, 0x68, 0xdb, 0x07, + 0x03, 0xd4, 0x02, 0x2a, 0x18, 0xbf, 0x01, 0x2a, 0x02, 0xd1, 0x4b, 0xf6, + 0x01, 0x36, 0x1d, 0xe0, 0x10, 0x22, 0x22, 0x60, 0x28, 0x31, 0x26, 0x60, + 0x01, 0x22, 0x41, 0xf8, 0x20, 0x20, 0x41, 0xf8, 0x20, 0x60, 0x6f, 0xf0, + 0x7f, 0x42, 0xa9, 0x78, 0x28, 0x88, 0x09, 0x02, 0x41, 0xea, 0x00, 0x41, + 0x21, 0x60, 0x00, 0x21, 0x6b, 0x68, 0x20, 0x1d, 0xff, 0xf7, 0x29, 0xff, + 0xa8, 0x78, 0x29, 0x88, 0x00, 0x02, 0x40, 0xea, 0x01, 0x40, 0x40, 0xf0, + 0x01, 0x00, 0x20, 0x60, 0x30, 0x46, 0x70, 0xbd, 0x4b, 0x49, 0x51, 0xf8, + 0x20, 0x00, 0x10, 0x30, 0x00, 0x68, 0x80, 0xe0, 0x10, 0xb5, 0x48, 0x4a, + 0x52, 0xf8, 0x20, 0x00, 0x00, 0xf1, 0x10, 0x04, 0x11, 0xb1, 0x21, 0x68, + 0xc9, 0x07, 0xfc, 0xd4, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0xff, 0xf7, + 0x0a, 0xff, 0x20, 0x68, 0xc0, 0x07, 0x01, 0xd5, 0x00, 0x20, 0x10, 0xbd, + 0x02, 0x20, 0x10, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, 0x3c, 0x4b, 0x3a, 0x4d, + 0x55, 0xf8, 0x21, 0x10, 0x80, 0x46, 0x53, 0xf8, 0x28, 0x40, 0x04, 0xf1, + 0x10, 0x03, 0x00, 0x20, 0x1d, 0x68, 0x1b, 0x68, 0xc5, 0xf3, 0x02, 0x15, + 0x02, 0x2d, 0x14, 0xbf, 0x01, 0x2d, 0x4b, 0xf6, 0x02, 0x30, 0x01, 0xf5, + 0x2a, 0x75, 0x1b, 0x0a, 0x55, 0xf8, 0x28, 0x50, 0xb3, 0xeb, 0x15, 0x2f, + 0x15, 0x46, 0x18, 0xbf, 0x00, 0x23, 0x04, 0xf1, 0x28, 0x02, 0x2b, 0x60, + 0x04, 0xf1, 0x2c, 0x03, 0x12, 0x68, 0x1e, 0x68, 0xb7, 0x03, 0x96, 0x03, + 0x57, 0xea, 0x92, 0x47, 0xb6, 0x0b, 0x46, 0xea, 0x87, 0x46, 0xbf, 0x13, + 0xc5, 0xe9, 0x02, 0x67, 0x04, 0xf1, 0x30, 0x02, 0x04, 0xf1, 0x34, 0x03, + 0x16, 0x68, 0x1a, 0x68, 0x93, 0x03, 0xb2, 0x03, 0x53, 0xea, 0x96, 0x43, + 0x92, 0x0b, 0x42, 0xea, 0x83, 0x42, 0x9b, 0x13, 0xc5, 0xe9, 0x04, 0x23, + 0x01, 0xf1, 0xa8, 0x06, 0x01, 0xf5, 0x94, 0x77, 0x56, 0xf8, 0x28, 0x20, + 0x57, 0xf8, 0x28, 0x60, 0x37, 0x03, 0x16, 0x03, 0x57, 0xea, 0x12, 0x57, + 0x36, 0x0b, 0x46, 0xea, 0x07, 0x56, 0x3f, 0x13, 0xc5, 0xe9, 0x06, 0x67, + 0x01, 0xf5, 0xd4, 0x72, 0x01, 0xf5, 0x0a, 0x71, 0x52, 0xf8, 0x28, 0x20, + 0x51, 0xf8, 0x28, 0x60, 0x13, 0x0d, 0x14, 0x03, 0x43, 0xea, 0x06, 0x31, + 0x24, 0x0b, 0x44, 0xea, 0x01, 0x54, 0x09, 0x13, 0xc5, 0xe9, 0x08, 0x41, + 0xbd, 0xe8, 0xf0, 0x81, 0x07, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x00, 0x68, + 0x00, 0x0a, 0x00, 0xf0, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, + 0x5c, 0x75, 0x02, 0x21, 0xc0, 0x97, 0x04, 0x02, 0x18, 0x00, 0x00, 0x47, + 0xcc, 0x9e, 0x04, 0x02, 0xe4, 0x9e, 0x04, 0x02, 0xf0, 0xff, 0xff, 0x0f, + 0x60, 0x99, 0x04, 0x02, 0x2d, 0xe9, 0xf2, 0x4f, 0x82, 0xb0, 0x80, 0x46, + 0xf0, 0xf7, 0x98, 0xff, 0x00, 0x24, 0x81, 0x46, 0x00, 0x25, 0x00, 0x26, + 0x29, 0xfa, 0x06, 0xf0, 0xc1, 0x07, 0x06, 0xf1, 0x01, 0x0a, 0x30, 0xd5, + 0x01, 0xa9, 0x30, 0x46, 0xfd, 0xf7, 0x59, 0xfc, 0x04, 0x00, 0x32, 0xd1, + 0x01, 0x98, 0x40, 0x45, 0x27, 0xd1, 0x6a, 0x46, 0x41, 0x46, 0x30, 0x46, + 0x00, 0xf0, 0x76, 0xf8, 0x04, 0x00, 0x28, 0xd1, 0x00, 0x9f, 0x30, 0x46, + 0xf0, 0xf7, 0xf4, 0xfd, 0x06, 0x46, 0x40, 0x46, 0xf0, 0xf7, 0x35, 0xff, + 0x83, 0x46, 0x40, 0x46, 0xf0, 0xf7, 0x3e, 0xff, 0x7f, 0x42, 0xb0, 0x42, + 0x13, 0xd3, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xdf, 0xed, + 0x2e, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xe1, 0xf7, 0x51, 0xfe, 0xbd, 0xee, + 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0xc7, 0x42, 0xa8, 0xbf, 0xb8, 0x42, + 0x05, 0xdb, 0x56, 0x46, 0x07, 0xe0, 0xb3, 0x45, 0x38, 0xbf, 0x4b, 0xf6, + 0x04, 0x34, 0x01, 0x25, 0x03, 0xe0, 0x56, 0x46, 0x0c, 0xb9, 0x08, 0x2e, + 0xbc, 0xd3, 0x02, 0x98, 0x05, 0x70, 0x20, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, + 0xf8, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x82, 0xb0, 0x06, 0x46, 0x00, 0x20, + 0x01, 0x90, 0x0c, 0x46, 0x15, 0x46, 0x69, 0x46, 0x30, 0x46, 0xfd, 0xf7, + 0x0e, 0xfc, 0x9f, 0xed, 0x19, 0x8a, 0x00, 0x27, 0x10, 0xbb, 0x00, 0x98, + 0xff, 0x28, 0x08, 0xbf, 0x4b, 0xf6, 0x05, 0x30, 0x1c, 0xd0, 0xf0, 0xf7, + 0x9d, 0xfd, 0x08, 0xee, 0x90, 0x0a, 0x00, 0x98, 0x21, 0x46, 0x00, 0xf0, + 0x52, 0xf8, 0x08, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x68, 0x0a, 0xf8, 0xee, + 0x48, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0xe2, 0xf7, 0x6f, 0xfd, 0xef, 0xf7, + 0x69, 0xfc, 0xbd, 0xee, 0xc0, 0x0a, 0x00, 0x99, 0x10, 0xee, 0x10, 0x7a, + 0x01, 0xaa, 0x30, 0x46, 0x00, 0xf0, 0x0e, 0xf8, 0x01, 0x99, 0x69, 0x60, + 0x85, 0xed, 0x02, 0x8a, 0x2c, 0x73, 0x6f, 0x73, 0x02, 0xb0, 0xbd, 0xec, + 0x02, 0x8b, 0xf2, 0xbd, 0xae, 0x47, 0xe1, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0xf8, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0x21, 0x46, 0x28, 0x46, + 0xf0, 0xf7, 0xb5, 0xfe, 0x07, 0x46, 0x28, 0x46, 0xf0, 0xf7, 0xa4, 0xfe, + 0x05, 0x46, 0x69, 0x46, 0x20, 0x46, 0xef, 0xf7, 0xf5, 0xfe, 0x9d, 0xed, + 0x00, 0x0a, 0x00, 0xee, 0x90, 0x7a, 0xb8, 0xee, 0x40, 0x0a, 0xf8, 0xee, + 0xe0, 0x0a, 0x30, 0xee, 0x20, 0x0a, 0x00, 0xee, 0x90, 0x5a, 0xf8, 0xee, + 0x60, 0x0a, 0x04, 0x46, 0x80, 0xee, 0x20, 0x0a, 0xef, 0xf7, 0x2e, 0xfc, + 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x45, 0x43, 0x00, 0x98, + 0x2d, 0x1a, 0xef, 0x1b, 0x37, 0x60, 0x20, 0x46, 0xf2, 0xbd, 0x00, 0x29, + 0x08, 0xbf, 0xf0, 0xf7, 0xa3, 0xbe, 0xf0, 0xf7, 0x94, 0xbe, 0x00, 0x00, + 0x06, 0x21, 0x11, 0x4a, 0x01, 0xe0, 0x06, 0x21, 0x10, 0x4a, 0x48, 0x43, + 0x10, 0x44, 0x27, 0xe0, 0x0f, 0x49, 0x00, 0xeb, 0x40, 0x00, 0x08, 0x44, + 0x22, 0xe0, 0x0e, 0x49, 0x01, 0xeb, 0x40, 0x01, 0x08, 0x78, 0x70, 0x47, + 0x0c, 0x48, 0x00, 0x78, 0xff, 0xe7, 0x00, 0xf0, 0x01, 0x00, 0x70, 0x47, + 0x0a, 0x49, 0x08, 0x70, 0x70, 0x47, 0x09, 0x4a, 0x10, 0x70, 0x51, 0x70, + 0x08, 0x0a, 0x90, 0x70, 0x09, 0x0c, 0xd1, 0x70, 0x70, 0x47, 0x00, 0x00, + 0x2a, 0x02, 0x00, 0x47, 0x2d, 0x02, 0x00, 0x47, 0xaa, 0x02, 0x00, 0x47, + 0x8a, 0x02, 0x00, 0x47, 0xc2, 0x02, 0x00, 0x47, 0x23, 0x02, 0x00, 0x47, + 0x01, 0x46, 0x08, 0x78, 0x4a, 0x78, 0x89, 0x78, 0x40, 0xea, 0x02, 0x20, + 0x40, 0xea, 0x01, 0x40, 0x02, 0x02, 0x48, 0xbf, 0x40, 0xf0, 0x7f, 0x40, + 0x70, 0x47, 0x00, 0x00, 0x10, 0xee, 0x10, 0x0a, 0x73, 0x46, 0x00, 0xf0, + 0x03, 0xf8, 0x00, 0xee, 0x10, 0x0a, 0x18, 0x47, 0xc0, 0xf3, 0xc7, 0x52, + 0x7e, 0x3a, 0x09, 0xdd, 0x18, 0x2a, 0x0e, 0xda, 0x6f, 0xf0, 0x7f, 0x41, + 0xd1, 0x40, 0x00, 0x42, 0x58, 0xbf, 0x40, 0x18, 0x88, 0x43, 0x70, 0x47, + 0xc0, 0x42, 0x18, 0xbf, 0x4f, 0xf0, 0x7e, 0x50, 0x28, 0xbf, 0x4f, 0xf0, + 0x00, 0x40, 0x70, 0x47, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, + 0x0d, 0x46, 0x82, 0x46, 0xae, 0x78, 0x4b, 0x4c, 0xf0, 0xf7, 0x8e, 0xfe, + 0x81, 0x46, 0x38, 0x20, 0x00, 0xfb, 0x09, 0xf0, 0x1c, 0x21, 0x48, 0x4a, + 0x11, 0xfb, 0x06, 0xf1, 0x02, 0x44, 0x57, 0x18, 0x23, 0x18, 0x19, 0x44, + 0x01, 0xf1, 0x08, 0x08, 0x38, 0x46, 0x29, 0x46, 0x00, 0xf0, 0x7b, 0xf8, + 0x28, 0x78, 0x04, 0xeb, 0x49, 0x04, 0x50, 0xb9, 0x00, 0x21, 0x79, 0x60, + 0xb8, 0x60, 0x29, 0x7e, 0x29, 0xb9, 0xa0, 0x5d, 0x18, 0xb1, 0x38, 0x46, + 0x41, 0x46, 0x00, 0xf0, 0x6c, 0xf8, 0x3b, 0x48, 0x01, 0x68, 0x01, 0xeb, + 0x0a, 0x02, 0xe0, 0x20, 0x92, 0xf8, 0xbc, 0x30, 0x43, 0x43, 0xc8, 0x18, + 0x4f, 0xf0, 0x00, 0x09, 0xd0, 0xf8, 0x57, 0x11, 0x38, 0x78, 0x39, 0x61, + 0x49, 0x08, 0x79, 0x61, 0x28, 0xb1, 0x78, 0x68, 0xe1, 0xf7, 0x4a, 0xfd, + 0x5f, 0xea, 0x00, 0x09, 0x35, 0xd1, 0x30, 0x48, 0x97, 0xed, 0x02, 0x0a, + 0x2f, 0x4a, 0x00, 0xeb, 0xca, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xdf, 0xed, + 0x27, 0x0a, 0xb8, 0x78, 0x60, 0xee, 0x20, 0x0a, 0x9f, 0xed, 0x25, 0x1a, + 0x80, 0xee, 0x81, 0x1a, 0x5a, 0xf8, 0x20, 0x00, 0xbc, 0xee, 0xc1, 0x1a, + 0x11, 0xee, 0x10, 0x3a, 0x10, 0x21, 0x10, 0x30, 0xff, 0xf7, 0x96, 0xff, + 0xb8, 0x78, 0x5a, 0xf8, 0x20, 0xb0, 0x7b, 0x68, 0x5b, 0x42, 0x6f, 0xf0, + 0x7f, 0x42, 0x00, 0x21, 0x58, 0x46, 0xff, 0xf7, 0x8b, 0xff, 0x01, 0x23, + 0x4f, 0xf0, 0x00, 0x62, 0x1b, 0x21, 0x58, 0x46, 0xff, 0xf7, 0x84, 0xff, + 0xb8, 0x78, 0x3b, 0x78, 0x5a, 0xf8, 0x20, 0x00, 0x4f, 0xf0, 0x80, 0x62, + 0x1a, 0x21, 0xff, 0xf7, 0x7b, 0xff, 0x28, 0x7e, 0x01, 0x28, 0x05, 0xd1, + 0x40, 0x46, 0x39, 0x46, 0x00, 0xf0, 0x17, 0xf8, 0x01, 0x21, 0xa1, 0x55, + 0x48, 0x46, 0xbd, 0xe8, 0xf2, 0x8f, 0x10, 0xb5, 0x0c, 0x46, 0xf0, 0xf7, + 0x0f, 0xfe, 0x01, 0x46, 0x38, 0x22, 0x20, 0x46, 0x09, 0x4b, 0xa4, 0x78, + 0x51, 0x43, 0x5a, 0x18, 0x1c, 0x21, 0x4c, 0x43, 0x11, 0x19, 0x00, 0xf0, + 0x02, 0xf8, 0x00, 0x20, 0x10, 0xbd, 0x1c, 0x22, 0xe2, 0xf7, 0xc8, 0xb9, + 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, 0xb4, 0x43, 0x44, 0x5d, 0x02, 0x21, + 0xf4, 0x5f, 0x02, 0x21, 0x5c, 0x75, 0x02, 0x21, 0x9c, 0x91, 0x04, 0x02, + 0x00, 0x00, 0xff, 0xff, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x78, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x70, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x80, 0x4a, 0x52, 0xf8, + 0x20, 0x00, 0x40, 0xf8, 0xa0, 0x1f, 0x70, 0x47, 0x7e, 0x4a, 0x52, 0xf8, + 0x20, 0x00, 0x41, 0xf0, 0x80, 0x01, 0x00, 0xf8, 0xe1, 0x1f, 0x70, 0x47, + 0x10, 0xb5, 0x00, 0xbf, 0x8d, 0xa3, 0x1c, 0x5c, 0x0c, 0x70, 0x00, 0xbf, + 0x90, 0xa1, 0x08, 0x5c, 0x10, 0x70, 0x10, 0xbd, 0x16, 0x28, 0x3a, 0xbf, + 0x0f, 0xf2, 0x48, 0x22, 0x10, 0x5c, 0x00, 0x20, 0x08, 0x70, 0x70, 0x47, + 0x70, 0xb5, 0x72, 0x4e, 0x56, 0xf8, 0x20, 0x60, 0x1d, 0x46, 0x14, 0x46, + 0x0b, 0x46, 0x1f, 0x22, 0x00, 0x21, 0x06, 0xf5, 0x7c, 0x70, 0xff, 0xf7, + 0xc5, 0xff, 0x06, 0xf2, 0xf1, 0x36, 0x23, 0x46, 0xfc, 0x22, 0x02, 0x21, + 0x30, 0x46, 0xff, 0xf7, 0xbd, 0xff, 0x85, 0xf0, 0x01, 0x03, 0x01, 0x22, + 0x00, 0x21, 0x30, 0x46, 0xff, 0xf7, 0xb6, 0xff, 0x2b, 0x46, 0x30, 0x46, + 0xbd, 0xe8, 0x70, 0x40, 0x02, 0x22, 0x01, 0x21, 0xae, 0xe7, 0x30, 0xb5, + 0x60, 0x4c, 0x54, 0xf8, 0x20, 0x00, 0x00, 0xf5, 0x7c, 0x75, 0x00, 0xf2, + 0xf1, 0x30, 0x2c, 0x78, 0x04, 0xf0, 0x1f, 0x04, 0x0c, 0x70, 0x01, 0x78, + 0x89, 0x08, 0x11, 0x70, 0x00, 0x78, 0xc0, 0xf3, 0x40, 0x00, 0x18, 0x70, + 0x30, 0xbd, 0x56, 0x49, 0x51, 0xf8, 0x20, 0x00, 0xa0, 0x30, 0x00, 0x68, + 0xc0, 0xf3, 0x80, 0x00, 0x70, 0x47, 0x54, 0x49, 0x51, 0xf8, 0x20, 0x00, + 0x74, 0x30, 0x00, 0x68, 0x00, 0x0e, 0x00, 0xf0, 0x0f, 0x00, 0x70, 0x47, + 0x38, 0xb5, 0x0c, 0x00, 0x14, 0xbf, 0x21, 0x21, 0x22, 0x21, 0x01, 0x22, + 0xfc, 0xf7, 0x0d, 0xfa, 0x05, 0x46, 0x14, 0xb1, 0x01, 0x20, 0xfb, 0xf7, + 0x39, 0xf8, 0x28, 0x46, 0x32, 0xbd, 0x00, 0x29, 0x19, 0xbf, 0x00, 0x22, + 0x26, 0x21, 0x01, 0x22, 0x27, 0x21, 0xfc, 0xf7, 0xfe, 0xb9, 0x38, 0xb5, + 0x44, 0x4d, 0x04, 0x46, 0x55, 0xf8, 0x24, 0x00, 0x00, 0xf0, 0x11, 0xf8, + 0x3f, 0x48, 0x50, 0xf8, 0x24, 0x00, 0x00, 0xf0, 0x0c, 0xf8, 0x3c, 0x48, + 0x50, 0xf8, 0x24, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0xa5, 0x23, + 0xff, 0x22, 0x00, 0x21, 0x00, 0xf2, 0xff, 0x30, 0x5a, 0xe7, 0xa5, 0x23, + 0xff, 0x22, 0x00, 0x21, 0x00, 0xf2, 0xff, 0x30, 0x54, 0xe7, 0x00, 0x00, + 0x2d, 0xe9, 0xfc, 0x41, 0x05, 0x46, 0x34, 0x48, 0x0f, 0xf2, 0xdc, 0x08, + 0x00, 0xf0, 0x34, 0xf8, 0x01, 0xae, 0x08, 0x78, 0x8d, 0xf8, 0x04, 0x00, + 0x00, 0x24, 0x2d, 0x48, 0x00, 0xf0, 0x2c, 0xf8, 0x00, 0x27, 0x08, 0x78, + 0x70, 0x70, 0x29, 0x48, 0x00, 0xf0, 0x26, 0xf8, 0x08, 0x78, 0xb0, 0x70, + 0xf3, 0x5d, 0xa5, 0x2b, 0x09, 0xd0, 0xa5, 0x22, 0x00, 0x92, 0x03, 0x21, + 0x42, 0x46, 0x01, 0x20, 0xf0, 0xf7, 0x21, 0xfe, 0xf0, 0xf7, 0x08, 0xfe, + 0x64, 0x1c, 0x7f, 0x1c, 0x03, 0x2f, 0xef, 0xd3, 0x20, 0x48, 0x50, 0xf8, + 0x25, 0x10, 0x0b, 0x68, 0x20, 0x48, 0x83, 0x42, 0x09, 0xd0, 0x00, 0x90, + 0x5f, 0xf0, 0x03, 0x01, 0x26, 0xa2, 0x01, 0x20, 0xf0, 0xf7, 0x0d, 0xfe, + 0xf0, 0xf7, 0xf4, 0xfd, 0x64, 0x1c, 0xe0, 0xb2, 0xbd, 0xe8, 0xf6, 0x81, + 0x50, 0xf8, 0x25, 0x10, 0x01, 0xf2, 0xff, 0x31, 0x70, 0x47, 0x70, 0xb5, + 0x16, 0x4a, 0x52, 0xf8, 0x20, 0x50, 0x0c, 0x46, 0x28, 0x46, 0xfc, 0xf7, + 0x9e, 0xf9, 0x06, 0x46, 0x21, 0x46, 0x28, 0x46, 0xfc, 0xf7, 0xab, 0xf9, + 0x30, 0x46, 0x70, 0xbd, 0x10, 0x49, 0x51, 0xf8, 0x20, 0x00, 0xef, 0xf3, + 0x10, 0x81, 0x72, 0xb6, 0x50, 0xf8, 0x1c, 0x2f, 0x00, 0x23, 0x03, 0x60, + 0x81, 0xf3, 0x10, 0x88, 0x70, 0x47, 0x0a, 0x49, 0x51, 0xf8, 0x20, 0x00, + 0x1c, 0x30, 0x00, 0x68, 0x70, 0x47, 0x00, 0x00, 0xcc, 0x9e, 0x04, 0x02, + 0xf4, 0x9e, 0x04, 0x02, 0xec, 0x9e, 0x04, 0x02, 0xbc, 0x9e, 0x04, 0x02, + 0xfc, 0x9e, 0x04, 0x02, 0xfe, 0xca, 0xad, 0xab, 0xd4, 0x9e, 0x04, 0x02, + 0xdc, 0x9e, 0x04, 0x02, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x20, 0x76, 0x65, + 0x72, 0x20, 0x64, 0x38, 0x3a, 0x20, 0x25, 0x58, 0x20, 0x21, 0x3d, 0x20, + 0x25, 0x58, 0x0a, 0x00, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x20, 0x76, 0x65, + 0x72, 0x20, 0x64, 0x33, 0x32, 0x3a, 0x20, 0x25, 0x58, 0x20, 0x21, 0x3d, + 0x20, 0x25, 0x58, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, + 0x04, 0x05, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x08, 0x09, + 0x0a, 0x0b, 0x0b, 0x0c, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x00, 0x00, + 0x0e, 0xb4, 0xc0, 0xb5, 0x02, 0x46, 0x03, 0xa8, 0x00, 0x21, 0x01, 0x90, + 0x00, 0x91, 0x01, 0xab, 0x01, 0x21, 0x04, 0x48, 0x78, 0x44, 0x0c, 0x30, + 0x0f, 0xf0, 0x24, 0xff, 0x06, 0xbc, 0x5d, 0xf8, 0x10, 0xfb, 0x00, 0xbf, + 0x4f, 0xad, 0x02, 0x00, 0x70, 0xb5, 0x1c, 0x00, 0x2a, 0xd0, 0x00, 0x29, + 0x0c, 0xbf, 0x24, 0x60, 0x22, 0x60, 0x04, 0x9d, 0xe0, 0x63, 0x21, 0x64, + 0x04, 0xf1, 0x44, 0x06, 0x0f, 0xf0, 0x5e, 0xfe, 0xe2, 0x6b, 0x20, 0x6c, + 0x21, 0x68, 0x42, 0x43, 0x88, 0x18, 0xa0, 0x60, 0x00, 0x21, 0xa1, 0x63, + 0x20, 0x68, 0xe2, 0x6b, 0x60, 0x60, 0x52, 0x1e, 0x20, 0x6c, 0x21, 0x68, + 0x42, 0x43, 0x88, 0x18, 0xe0, 0x60, 0x4f, 0xf0, 0xff, 0x30, 0x30, 0x70, + 0x70, 0x70, 0x04, 0xf1, 0x10, 0x00, 0x0f, 0xf0, 0x8b, 0xfe, 0x04, 0xf1, + 0x24, 0x00, 0x0f, 0xf0, 0x87, 0xfe, 0x0f, 0xf0, 0x4b, 0xfe, 0x35, 0x72, + 0x20, 0x46, 0x70, 0xbd, 0x70, 0xb5, 0x0c, 0x00, 0x05, 0x46, 0x32, 0xd0, + 0x24, 0x60, 0x01, 0x20, 0x00, 0x21, 0xe0, 0x63, 0x21, 0x64, 0x04, 0xf1, + 0x44, 0x06, 0x0f, 0xf0, 0x2f, 0xfe, 0xe2, 0x6b, 0x20, 0x6c, 0x21, 0x68, + 0x42, 0x43, 0x88, 0x18, 0xa0, 0x60, 0x00, 0x21, 0xa1, 0x63, 0x20, 0x68, + 0xe2, 0x6b, 0x60, 0x60, 0x52, 0x1e, 0x20, 0x6c, 0x21, 0x68, 0x42, 0x43, + 0x88, 0x18, 0xe0, 0x60, 0x4f, 0xf0, 0xff, 0x30, 0x30, 0x70, 0x70, 0x70, + 0x04, 0xf1, 0x10, 0x00, 0x0f, 0xf0, 0x5c, 0xfe, 0x04, 0xf1, 0x24, 0x00, + 0x0f, 0xf0, 0x58, 0xfe, 0x0f, 0xf0, 0x1c, 0xfe, 0x35, 0x72, 0x00, 0x20, + 0xa0, 0x60, 0x00, 0x21, 0x21, 0x60, 0x00, 0x22, 0xe2, 0x60, 0x00, 0x23, + 0x20, 0x46, 0x00, 0xf0, 0x02, 0xf8, 0x20, 0x46, 0x70, 0xbd, 0x2d, 0xe9, + 0xf7, 0x4f, 0x06, 0x46, 0x8a, 0x46, 0x9b, 0x46, 0x00, 0x24, 0x06, 0xf1, + 0x44, 0x07, 0xdf, 0xf8, 0x58, 0x85, 0x4f, 0xf0, 0x80, 0x59, 0x33, 0xe0, + 0x02, 0x98, 0x00, 0x28, 0x51, 0xd0, 0x1c, 0xb9, 0x68, 0x46, 0xfe, 0xf7, + 0x2f, 0xff, 0x01, 0x24, 0x0f, 0xf0, 0xf8, 0xfd, 0xfe, 0xf7, 0x2a, 0xfd, + 0x0f, 0xf0, 0xe8, 0xfd, 0x97, 0xf9, 0x00, 0x00, 0x10, 0xf1, 0x01, 0x0f, + 0x04, 0xbf, 0x00, 0x21, 0x39, 0x70, 0x97, 0xf9, 0x01, 0x00, 0x10, 0xf1, + 0x01, 0x0f, 0x04, 0xbf, 0x00, 0x21, 0x79, 0x70, 0x0f, 0xf0, 0xe4, 0xfd, + 0x02, 0xa9, 0x68, 0x46, 0xfe, 0xf7, 0x1b, 0xff, 0x00, 0x28, 0x47, 0xd1, + 0x0f, 0xf0, 0xd0, 0xfd, 0xb0, 0x6b, 0xf1, 0x6b, 0x88, 0x42, 0x14, 0xbf, + 0x00, 0x25, 0x01, 0x25, 0x0f, 0xf0, 0xd4, 0xfd, 0x4d, 0xbb, 0x30, 0x46, + 0x00, 0xf0, 0x2f, 0xfa, 0xfe, 0xf7, 0x08, 0xfd, 0x0f, 0xf0, 0xc0, 0xfd, + 0xb0, 0x6b, 0xf1, 0x6b, 0x88, 0x42, 0x02, 0xd3, 0xbb, 0xf1, 0x02, 0x0f, + 0xc2, 0xd1, 0x5a, 0x46, 0x51, 0x46, 0x30, 0x46, 0x00, 0xf0, 0xd8, 0xf9, + 0x71, 0x6a, 0x29, 0xb1, 0x06, 0xf1, 0x24, 0x00, 0xfe, 0xf7, 0xa2, 0xfe, + 0x08, 0xb9, 0x06, 0xe0, 0x28, 0xb1, 0xc8, 0xf8, 0x00, 0x90, 0xbf, 0xf3, + 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x0f, 0xf0, 0xaf, 0xfd, 0x01, 0x20, + 0x1c, 0xe0, 0x0f, 0xf0, 0xab, 0xfd, 0x00, 0x20, 0x18, 0xe0, 0x02, 0x99, + 0x06, 0xf1, 0x10, 0x00, 0xfe, 0xf7, 0x0c, 0xfe, 0x30, 0x46, 0x00, 0xf0, + 0x00, 0xfa, 0xfe, 0xf7, 0xd9, 0xfc, 0x00, 0x28, 0xce, 0xd1, 0xc8, 0xf8, + 0x00, 0x90, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0xc7, 0xe7, + 0x30, 0x46, 0x00, 0xf0, 0xf2, 0xf9, 0xfe, 0xf7, 0xcb, 0xfc, 0xe4, 0xe7, + 0x03, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0xf8, 0xb5, 0x06, 0x46, 0x14, 0x46, + 0xef, 0xf3, 0x11, 0x85, 0x30, 0x20, 0x80, 0xf3, 0x11, 0x88, 0xbf, 0xf3, + 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0xb2, 0x6b, 0xf0, 0x6b, 0x82, 0x42, + 0x01, 0xd3, 0x02, 0x2b, 0x1a, 0xd1, 0x96, 0xf9, 0x45, 0x70, 0x1a, 0x46, + 0x30, 0x46, 0x00, 0xf0, 0x8d, 0xf9, 0x17, 0xf1, 0x01, 0x0f, 0x0c, 0xd1, + 0x70, 0x6a, 0x68, 0xb1, 0x06, 0xf1, 0x24, 0x00, 0xfe, 0xf7, 0x54, 0xfe, + 0x00, 0x28, 0x18, 0xbf, 0x00, 0x2c, 0x05, 0xd0, 0x01, 0x20, 0x20, 0x60, + 0x02, 0xe0, 0x7f, 0x1c, 0x86, 0xf8, 0x45, 0x70, 0x01, 0x20, 0x00, 0xe0, + 0x00, 0x20, 0x85, 0xf3, 0x11, 0x88, 0xf2, 0xbd, 0x38, 0xb5, 0x0c, 0x46, + 0xef, 0xf3, 0x11, 0x85, 0x30, 0x21, 0x81, 0xf3, 0x11, 0x88, 0xbf, 0xf3, + 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x81, 0x6b, 0xc2, 0x6b, 0x91, 0x42, + 0x17, 0xd2, 0x90, 0xf9, 0x45, 0x20, 0x49, 0x1c, 0x12, 0xf1, 0x01, 0x0f, + 0x81, 0x63, 0x0b, 0xd1, 0x41, 0x6a, 0x61, 0xb1, 0x24, 0x30, 0xfe, 0xf7, + 0x29, 0xfe, 0x00, 0x28, 0x18, 0xbf, 0x00, 0x2c, 0x05, 0xd0, 0x01, 0x20, + 0x20, 0x60, 0x02, 0xe0, 0x52, 0x1c, 0x80, 0xf8, 0x45, 0x20, 0x01, 0x20, + 0x00, 0xe0, 0x00, 0x20, 0x85, 0xf3, 0x11, 0x88, 0x32, 0xbd, 0x2d, 0xe9, + 0xf6, 0x47, 0x06, 0x46, 0x82, 0xb0, 0x8a, 0x46, 0x00, 0x24, 0x06, 0xf1, + 0x44, 0x07, 0xdf, 0xf8, 0x9c, 0x83, 0x4f, 0xf0, 0x80, 0x59, 0x04, 0xe0, + 0x30, 0x46, 0x00, 0xf0, 0x80, 0xf9, 0xfe, 0xf7, 0x59, 0xfc, 0x0f, 0xf0, + 0x11, 0xfd, 0xb5, 0x6b, 0x2d, 0xb9, 0x03, 0x98, 0x50, 0xb9, 0x0f, 0xf0, + 0x17, 0xfd, 0x00, 0x20, 0xef, 0xe0, 0x51, 0x46, 0x30, 0x46, 0x00, 0xf0, + 0x5d, 0xf9, 0x6d, 0x1e, 0xb5, 0x63, 0xd8, 0xe0, 0x1c, 0xb9, 0x68, 0x46, + 0xfe, 0xf7, 0x3e, 0xfe, 0x01, 0x24, 0x0f, 0xf0, 0x07, 0xfd, 0xfe, 0xf7, + 0x39, 0xfc, 0x0f, 0xf0, 0xf7, 0xfc, 0x78, 0x57, 0x10, 0xf1, 0x01, 0x0f, + 0x04, 0xbf, 0x00, 0x21, 0x39, 0x70, 0x97, 0xf9, 0x01, 0x00, 0x10, 0xf1, + 0x01, 0x0f, 0x04, 0xbf, 0x00, 0x21, 0x79, 0x70, 0x0f, 0xf0, 0xf4, 0xfc, + 0x03, 0xa9, 0x68, 0x46, 0xfe, 0xf7, 0x2b, 0xfe, 0xe0, 0xb9, 0x0f, 0xf0, + 0xe1, 0xfc, 0xb0, 0x6b, 0x45, 0x1e, 0xad, 0x41, 0x0f, 0xf0, 0xe8, 0xfc, + 0xed, 0x0f, 0x00, 0x2d, 0xc0, 0xd0, 0x03, 0x99, 0x06, 0xf1, 0x24, 0x00, + 0xfe, 0xf7, 0x48, 0xfd, 0x30, 0x46, 0x00, 0xf0, 0x3c, 0xf9, 0xfe, 0xf7, + 0x15, 0xfc, 0x00, 0x28, 0xb9, 0xd1, 0xc8, 0xf8, 0x00, 0x90, 0xbf, 0xf3, + 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0xb2, 0xe7, 0x30, 0x46, 0x00, 0xf0, + 0x2e, 0xf9, 0xfe, 0xf7, 0x07, 0xfc, 0x0f, 0xf0, 0xbf, 0xfc, 0xb0, 0x6b, + 0x45, 0x1e, 0xad, 0x41, 0x0f, 0xf0, 0xc6, 0xfc, 0xed, 0x0f, 0x00, 0x2d, + 0xa3, 0xd0, 0xaa, 0xe7, 0x2d, 0xe9, 0xf3, 0x47, 0x06, 0x46, 0x00, 0x24, + 0x82, 0xb0, 0xa2, 0x46, 0x06, 0xf1, 0x44, 0x07, 0xdf, 0xf8, 0xbc, 0x82, + 0x4f, 0xf0, 0x80, 0x59, 0x04, 0xe0, 0x30, 0x46, 0x00, 0xf0, 0x11, 0xf9, + 0xfe, 0xf7, 0xea, 0xfb, 0x0f, 0xf0, 0xa2, 0xfc, 0xb0, 0x6b, 0x20, 0xb9, + 0x03, 0x98, 0x50, 0xb9, 0x0f, 0xf0, 0xa8, 0xfc, 0x6f, 0xe0, 0x40, 0x1e, + 0xb0, 0x63, 0x30, 0x68, 0x10, 0xb9, 0xfe, 0xf7, 0x3e, 0xff, 0xb0, 0x60, + 0x69, 0xe0, 0x1c, 0xb9, 0x68, 0x46, 0xfe, 0xf7, 0xcf, 0xfd, 0x01, 0x24, + 0x0f, 0xf0, 0x98, 0xfc, 0xfe, 0xf7, 0xca, 0xfb, 0x0f, 0xf0, 0x88, 0xfc, + 0x97, 0xf9, 0x00, 0x00, 0x10, 0xf1, 0x01, 0x0f, 0x04, 0xbf, 0x00, 0x21, + 0x39, 0x70, 0x97, 0xf9, 0x01, 0x00, 0x10, 0xf1, 0x01, 0x0f, 0x04, 0xbf, + 0x00, 0x21, 0x79, 0x70, 0x0f, 0xf0, 0x84, 0xfc, 0x03, 0xa9, 0x68, 0x46, + 0xfe, 0xf7, 0xbb, 0xfd, 0x30, 0xbb, 0x0f, 0xf0, 0x71, 0xfc, 0xb0, 0x6b, + 0x45, 0x1e, 0xad, 0x41, 0x0f, 0xf0, 0x78, 0xfc, 0xed, 0x0f, 0x00, 0x2d, + 0xbf, 0xd0, 0x30, 0x68, 0x38, 0xb9, 0x0f, 0xf0, 0x65, 0xfc, 0xb0, 0x68, + 0xfe, 0xf7, 0x3e, 0xfe, 0x82, 0x46, 0x0f, 0xf0, 0x6b, 0xfc, 0x03, 0x99, + 0x06, 0xf1, 0x24, 0x00, 0xfe, 0xf7, 0xce, 0xfc, 0x30, 0x46, 0x00, 0xf0, + 0xc2, 0xf8, 0xfe, 0xf7, 0x9b, 0xfb, 0x00, 0x28, 0xae, 0xd1, 0xc8, 0xf8, + 0x00, 0x90, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0xa7, 0xe7, + 0x30, 0x46, 0x00, 0xf0, 0xb4, 0xf8, 0xfe, 0xf7, 0x8d, 0xfb, 0x0f, 0xf0, + 0x45, 0xfc, 0xb0, 0x6b, 0x45, 0x1e, 0xad, 0x41, 0x0f, 0xf0, 0x4c, 0xfc, + 0xed, 0x0f, 0x00, 0x2d, 0x98, 0xd0, 0xba, 0xf1, 0x00, 0x0f, 0x0e, 0xd0, + 0x0f, 0xf0, 0x38, 0xfc, 0x70, 0x6a, 0x00, 0x28, 0x1d, 0xbf, 0x30, 0x6b, + 0x01, 0x68, 0xc1, 0xf1, 0x07, 0x01, 0x00, 0x21, 0xb0, 0x68, 0xfe, 0xf7, + 0x89, 0xfe, 0x0f, 0xf0, 0x37, 0xfc, 0x00, 0x20, 0x0f, 0xe0, 0x30, 0x69, + 0x50, 0xb1, 0x06, 0xf1, 0x10, 0x00, 0xfe, 0xf7, 0x17, 0xfd, 0x28, 0xb1, + 0xc8, 0xf8, 0x00, 0x90, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, + 0x0f, 0xf0, 0x26, 0xfc, 0x01, 0x20, 0x04, 0xb0, 0xbd, 0xe8, 0xf0, 0x87, + 0x2d, 0xe9, 0xf0, 0x41, 0x07, 0x46, 0x14, 0x46, 0xef, 0xf3, 0x11, 0x88, + 0x30, 0x20, 0x80, 0xf3, 0x11, 0x88, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, + 0x6f, 0x8f, 0xbd, 0x6b, 0xdd, 0xb1, 0x97, 0xf9, 0x44, 0x60, 0x38, 0x46, + 0x00, 0xf0, 0x5a, 0xf8, 0x6d, 0x1e, 0x16, 0xf1, 0x01, 0x0f, 0xbd, 0x63, + 0x0c, 0xd1, 0x38, 0x69, 0x68, 0xb1, 0x07, 0xf1, 0x10, 0x00, 0xfe, 0xf7, + 0xeb, 0xfc, 0x00, 0x28, 0x18, 0xbf, 0x00, 0x2c, 0x05, 0xd0, 0x01, 0x20, + 0x20, 0x60, 0x02, 0xe0, 0x76, 0x1c, 0x87, 0xf8, 0x44, 0x60, 0x01, 0x20, + 0x00, 0xe0, 0x00, 0x20, 0x88, 0xf3, 0x11, 0x88, 0xbd, 0xe8, 0xf0, 0x81, + 0x10, 0xb5, 0x04, 0x46, 0x0f, 0xf0, 0xe2, 0xfb, 0xa4, 0x6b, 0xff, 0xe7, + 0x0f, 0xf0, 0xea, 0xfb, 0x20, 0x46, 0x10, 0xbd, 0xf8, 0xb5, 0x06, 0x46, + 0x15, 0x46, 0xb4, 0x6b, 0x32, 0x6c, 0x00, 0x27, 0x42, 0xb9, 0x30, 0x68, + 0x30, 0xbb, 0xb0, 0x68, 0xfe, 0xf7, 0xf5, 0xfd, 0x00, 0x21, 0x07, 0x46, + 0xb1, 0x60, 0x1f, 0xe0, 0x65, 0xb9, 0x70, 0x68, 0xe1, 0xf7, 0x98, 0xfd, + 0x70, 0x68, 0x31, 0x6c, 0xb2, 0x68, 0x08, 0x44, 0x90, 0x42, 0x70, 0x60, + 0x14, 0xd3, 0x30, 0x68, 0x70, 0x60, 0x11, 0xe0, 0xf0, 0x68, 0xe1, 0xf7, + 0x8b, 0xfd, 0x30, 0x6c, 0xf1, 0x68, 0x40, 0x42, 0x01, 0x44, 0xf1, 0x60, + 0x32, 0x68, 0x91, 0x42, 0x02, 0xd2, 0xb1, 0x68, 0x08, 0x44, 0xf0, 0x60, + 0x02, 0x2d, 0x01, 0xd1, 0x04, 0xb1, 0x64, 0x1e, 0x64, 0x1c, 0xb4, 0x63, + 0x38, 0x46, 0xf2, 0xbd, 0x18, 0xb4, 0x02, 0x6c, 0x0b, 0x46, 0x62, 0xb1, + 0xc1, 0x68, 0x84, 0x68, 0x11, 0x44, 0xc1, 0x60, 0xa1, 0x42, 0x24, 0xbf, + 0x01, 0x68, 0xc1, 0x60, 0xc1, 0x68, 0x18, 0x46, 0x18, 0xbc, 0xe1, 0xf7, + 0x67, 0xbd, 0x11, 0xbc, 0x70, 0x47, 0xf8, 0xb5, 0x05, 0x46, 0x0f, 0xf0, + 0x91, 0xfb, 0x05, 0xf1, 0x44, 0x06, 0x96, 0xf9, 0x01, 0x40, 0x01, 0x2c, + 0x0a, 0xdb, 0x68, 0x6a, 0x40, 0xb1, 0x05, 0xf1, 0x24, 0x00, 0xfe, 0xf7, + 0x79, 0xfc, 0x08, 0xb1, 0xfe, 0xf7, 0xf8, 0xfc, 0x64, 0x1e, 0xf4, 0xd1, + 0x4f, 0xf0, 0xff, 0x37, 0x77, 0x70, 0x0f, 0xf0, 0x87, 0xfb, 0x0f, 0xf0, + 0x79, 0xfb, 0x96, 0xf9, 0x00, 0x40, 0x01, 0x2c, 0x0a, 0xdb, 0x28, 0x69, + 0x40, 0xb1, 0x05, 0xf1, 0x10, 0x00, 0xfe, 0xf7, 0x63, 0xfc, 0x08, 0xb1, + 0xfe, 0xf7, 0xe2, 0xfc, 0x64, 0x1e, 0xf4, 0xd1, 0x37, 0x70, 0xbd, 0xe8, + 0xf1, 0x40, 0x0f, 0xf0, 0x71, 0xbb, 0x30, 0xb4, 0x0b, 0x4c, 0x00, 0x23, + 0x25, 0x46, 0x2a, 0x68, 0x42, 0xb1, 0xaa, 0x68, 0x5b, 0x1c, 0x2a, 0xb1, + 0x5b, 0x1c, 0x10, 0x35, 0x0a, 0x2b, 0xf6, 0xd3, 0x30, 0xbc, 0x70, 0x47, + 0x44, 0xf8, 0x33, 0x10, 0x04, 0xeb, 0xc3, 0x01, 0x48, 0x60, 0x30, 0xbc, + 0x70, 0x47, 0x00, 0x00, 0x04, 0xed, 0x00, 0xe0, 0xa0, 0x71, 0x02, 0x21, + 0xf8, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0x0f, 0xf0, 0x44, 0xfb, + 0x04, 0xf1, 0x38, 0x07, 0x97, 0xf9, 0x0c, 0x00, 0x10, 0xf1, 0x01, 0x0f, + 0x04, 0xbf, 0x00, 0x21, 0x39, 0x73, 0x97, 0xf9, 0x0d, 0x00, 0x10, 0xf1, + 0x01, 0x0f, 0x04, 0xbf, 0x00, 0x21, 0x79, 0x73, 0x0f, 0xf0, 0x3e, 0xfb, + 0x38, 0x68, 0x28, 0xb9, 0x32, 0x46, 0x29, 0x46, 0x04, 0xf1, 0x24, 0x00, + 0xfe, 0xf7, 0x0c, 0xfc, 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x40, 0x90, 0xe7, + 0x03, 0xb5, 0x81, 0xb0, 0x02, 0x46, 0x00, 0x20, 0x00, 0x90, 0x02, 0xab, + 0x01, 0x21, 0x03, 0x48, 0x78, 0x44, 0x08, 0x30, 0x0f, 0xf0, 0xcc, 0xfb, + 0x03, 0xb0, 0x00, 0xbd, 0xa3, 0xa6, 0x02, 0x00, 0x80, 0xb5, 0x8d, 0xf8, + 0x00, 0x00, 0x01, 0x22, 0x69, 0x46, 0x01, 0x20, 0xf0, 0xf7, 0x38, 0xfc, + 0x01, 0x28, 0x02, 0xd1, 0x9d, 0xf8, 0x00, 0x00, 0x02, 0xbd, 0x4f, 0xf0, + 0xff, 0x30, 0x02, 0xbd, 0xc9, 0xb2, 0x02, 0x78, 0x8a, 0x42, 0x1a, 0xb1, + 0x1c, 0xbf, 0x10, 0xf8, 0x01, 0x2f, 0xf9, 0xe7, 0x18, 0xbf, 0x00, 0x20, + 0x70, 0x47, 0x00, 0x00, 0x00, 0xf1, 0x01, 0x03, 0x10, 0xf8, 0x01, 0x1b, + 0x11, 0xb1, 0x10, 0xf8, 0x01, 0x1b, 0xfb, 0xe7, 0xc0, 0x1a, 0x70, 0x47, + 0xa0, 0xf1, 0x41, 0x01, 0x1a, 0x29, 0x38, 0xbf, 0x20, 0x30, 0x70, 0x47, + 0x04, 0xe0, 0x10, 0xf8, 0x01, 0x3b, 0x6b, 0xb1, 0x49, 0x1c, 0x52, 0x1e, + 0x52, 0xb1, 0x0b, 0x78, 0x90, 0xf8, 0x00, 0xc0, 0x9c, 0x45, 0xf4, 0xd0, + 0x02, 0xd2, 0x4f, 0xf0, 0xff, 0x30, 0x70, 0x47, 0x01, 0x20, 0x70, 0x47, + 0x00, 0x20, 0x70, 0x47, 0x30, 0xb4, 0x00, 0xe0, 0x40, 0x1c, 0x03, 0x78, + 0x4b, 0xb1, 0x0c, 0x46, 0x22, 0x78, 0x00, 0x2a, 0xf8, 0xd0, 0x14, 0xf8, + 0x01, 0x5b, 0xab, 0x42, 0xf8, 0xd1, 0x30, 0xbc, 0x70, 0x47, 0x30, 0xbc, + 0x00, 0x20, 0x70, 0x47, 0x00, 0x78, 0x02, 0x40, 0xca, 0x40, 0xd0, 0xb2, + 0x70, 0x47, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, + 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x70, + 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x04, 0x46, 0xdf, 0xf8, 0x7c, 0x04, + 0x21, 0x46, 0x50, 0xf8, 0x21, 0x50, 0x70, 0x47, 0x70, 0xb5, 0x0c, 0x46, + 0xdf, 0xf8, 0x6c, 0x14, 0x51, 0xf8, 0x20, 0x60, 0x02, 0x20, 0xfa, 0xf7, + 0x90, 0xfa, 0x00, 0x23, 0x00, 0x22, 0x21, 0x46, 0x02, 0x20, 0xfa, 0xf7, + 0x94, 0xfa, 0x00, 0x25, 0x30, 0x36, 0x02, 0x20, 0xfa, 0xf7, 0x63, 0xfb, + 0x10, 0xb9, 0x30, 0x78, 0x00, 0x28, 0xf8, 0xd1, 0x30, 0x78, 0x08, 0xb1, + 0x4b, 0xf2, 0x0c, 0x75, 0x02, 0x20, 0xfa, 0xf7, 0xf8, 0xfa, 0x28, 0x46, + 0x70, 0xbd, 0x10, 0xb5, 0xdf, 0xf8, 0x2c, 0x44, 0x54, 0xf8, 0x20, 0x00, + 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x23, 0x0e, 0x22, 0x01, 0x21, 0x28, 0x30, + 0xbd, 0xe7, 0x38, 0xb5, 0xff, 0xf7, 0xc9, 0xff, 0x00, 0x23, 0x03, 0x22, + 0x00, 0x21, 0x05, 0xf1, 0x2e, 0x00, 0xff, 0xf7, 0xb4, 0xff, 0x0a, 0x23, + 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x2d, 0x00, 0xff, 0xf7, 0xad, 0xff, + 0x20, 0x46, 0xff, 0xf7, 0xe0, 0xff, 0x01, 0x23, 0x80, 0x22, 0x07, 0x21, + 0x05, 0xf1, 0x28, 0x00, 0xff, 0xf7, 0xa3, 0xff, 0x20, 0x46, 0xbd, 0xe8, + 0x34, 0x40, 0x64, 0x21, 0xb2, 0xe7, 0x00, 0x00, 0x70, 0xb5, 0x05, 0x46, + 0x00, 0x24, 0x19, 0xbb, 0xef, 0xf3, 0x10, 0x86, 0x72, 0xb6, 0x00, 0xf0, + 0x6d, 0xf8, 0x04, 0x00, 0x07, 0xd1, 0x02, 0x21, 0x28, 0x46, 0x00, 0xf0, + 0xf3, 0xf8, 0x04, 0x00, 0x18, 0xbf, 0x4b, 0xf2, 0x12, 0x74, 0x86, 0xf3, + 0x10, 0x88, 0xdf, 0xf8, 0xb0, 0x03, 0x29, 0x46, 0x50, 0xf8, 0x21, 0x20, + 0x92, 0xed, 0x0d, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xdf, 0xed, 0xcc, 0x0a, + 0xc0, 0xee, 0x80, 0x0a, 0xff, 0xee, 0xcb, 0x0a, 0x10, 0xee, 0x90, 0x0a, + 0xfa, 0xf7, 0x16, 0xfb, 0xef, 0xf3, 0x10, 0x86, 0x72, 0xb6, 0x64, 0xb9, + 0x28, 0x46, 0x00, 0xf0, 0x47, 0xf8, 0x04, 0x46, 0x3c, 0xb9, 0x01, 0x21, + 0x28, 0x46, 0x00, 0xf0, 0xcd, 0xf8, 0x04, 0x00, 0x18, 0xbf, 0x4b, 0xf2, + 0x13, 0x74, 0x86, 0xf3, 0x10, 0x88, 0x20, 0x46, 0x70, 0xbd, 0x38, 0xb5, + 0x00, 0xf0, 0x1b, 0xf8, 0x04, 0xf1, 0x24, 0x05, 0x01, 0x23, 0x02, 0x22, + 0x01, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x55, 0xff, 0x00, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x4f, 0xff, 0x04, 0xf1, 0x22, 0x01, + 0x00, 0x20, 0x08, 0x70, 0x01, 0xb0, 0x04, 0xf1, 0x23, 0x00, 0xbd, 0xe8, + 0x30, 0x40, 0x03, 0x23, 0x18, 0x22, 0x03, 0x21, 0x41, 0xe7, 0xc8, 0x49, + 0x51, 0xf8, 0x20, 0x40, 0x70, 0x47, 0x10, 0xb5, 0xff, 0xf7, 0xf9, 0xff, + 0x24, 0x34, 0x00, 0xf0, 0x0c, 0xf8, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, + 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x30, 0xe7, 0x20, 0x78, 0x00, 0xf0, + 0x01, 0x00, 0x8d, 0xf8, 0x00, 0x00, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, + 0x20, 0x46, 0x26, 0xe7, 0x2d, 0xe9, 0xf8, 0x4d, 0x80, 0x46, 0xb9, 0x48, + 0x87, 0xb0, 0x45, 0x46, 0x50, 0xf8, 0x25, 0x10, 0x06, 0x91, 0x01, 0xf1, + 0x2f, 0x07, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x38, 0x46, 0xff, 0xf7, + 0x16, 0xff, 0x4b, 0xf2, 0x0c, 0x76, 0x4c, 0xf2, 0x50, 0x34, 0x00, 0xf0, + 0x50, 0xf9, 0x01, 0x22, 0x00, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x06, 0xff, + 0x10, 0xb1, 0x64, 0x1e, 0xf5, 0xd1, 0x61, 0xe0, 0xab, 0x48, 0x50, 0xf8, + 0x25, 0x10, 0x48, 0x6b, 0x4f, 0xf4, 0x7a, 0x72, 0xb0, 0xfb, 0xf2, 0xf4, + 0x6a, 0x46, 0x02, 0xa9, 0x40, 0x46, 0x00, 0xf0, 0x80, 0xf8, 0x00, 0xf0, + 0x57, 0xf8, 0x07, 0x46, 0x0d, 0x46, 0x32, 0x22, 0x00, 0x26, 0xa2, 0xfb, + 0x04, 0x01, 0x12, 0xfb, 0x06, 0x11, 0x00, 0x23, 0x4f, 0xf4, 0x7a, 0x72, + 0xf4, 0xf7, 0xac, 0xfa, 0x82, 0x46, 0x8b, 0x46, 0x00, 0xf0, 0x46, 0xf8, + 0xa2, 0x1a, 0x66, 0xeb, 0x03, 0x03, 0x5b, 0x45, 0x06, 0xd8, 0x28, 0xbf, + 0x52, 0x45, 0x03, 0xd2, 0xb8, 0x1c, 0x45, 0xf1, 0x00, 0x01, 0x02, 0xe0, + 0x78, 0x1c, 0x65, 0xf1, 0xff, 0x31, 0xa4, 0xfb, 0x00, 0x23, 0x04, 0xfb, + 0x01, 0x33, 0x54, 0x1e, 0x63, 0xf1, 0x00, 0x05, 0x06, 0x9b, 0x20, 0x04, + 0x03, 0xf1, 0x4e, 0x01, 0x00, 0x0e, 0x08, 0x70, 0x21, 0x0c, 0x03, 0xf1, + 0x4f, 0x00, 0x03, 0xf1, 0x50, 0x02, 0x01, 0x70, 0x20, 0x0e, 0x10, 0x70, + 0x03, 0xf1, 0x52, 0x07, 0x03, 0xf1, 0x51, 0x00, 0x2a, 0x0c, 0x05, 0x70, + 0x28, 0x0a, 0x38, 0x70, 0x03, 0xf1, 0x54, 0x07, 0x03, 0xf1, 0x53, 0x00, + 0x04, 0xa9, 0x02, 0x70, 0x28, 0x0e, 0x38, 0x70, 0x6a, 0x46, 0x03, 0xf1, + 0x4d, 0x00, 0x04, 0x70, 0x40, 0x46, 0x00, 0xf0, 0x32, 0xf8, 0xdd, 0xe9, + 0x00, 0x01, 0x8d, 0x42, 0x0c, 0xbf, 0x84, 0x42, 0x4b, 0xf2, 0x0d, 0x76, + 0x30, 0x46, 0x08, 0xb0, 0xbd, 0xe8, 0xf0, 0x8d, 0xdd, 0xe9, 0x02, 0x01, + 0x22, 0x46, 0x00, 0x23, 0xf4, 0xf7, 0x5c, 0xba, 0xf8, 0xb5, 0x0d, 0x46, + 0x73, 0x49, 0x51, 0xf8, 0x20, 0x70, 0x07, 0xf1, 0x22, 0x04, 0x00, 0x21, + 0x21, 0x70, 0x00, 0xf0, 0xd0, 0xf8, 0x69, 0x00, 0x41, 0xf0, 0x01, 0x01, + 0x21, 0x70, 0x4b, 0xf2, 0x0c, 0x76, 0x4c, 0xf2, 0x50, 0x34, 0x07, 0xf1, + 0x25, 0x00, 0x00, 0x78, 0x28, 0x40, 0xa8, 0x42, 0x04, 0xd0, 0x00, 0xf0, + 0xc0, 0xf8, 0x64, 0x1e, 0xf5, 0xd1, 0x00, 0xe0, 0x00, 0x26, 0x30, 0x46, + 0xf2, 0xbd, 0x2d, 0xe9, 0xff, 0x4e, 0x0f, 0x46, 0x62, 0x49, 0x51, 0xf8, + 0x20, 0x60, 0xff, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x45, 0x00, 0xff, 0xf7, + 0x69, 0xfe, 0x04, 0x46, 0xff, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x46, 0x00, + 0xff, 0xf7, 0x62, 0xfe, 0x44, 0xea, 0x00, 0x24, 0x00, 0x21, 0xff, 0x22, + 0x06, 0xf1, 0x47, 0x00, 0xff, 0xf7, 0x5a, 0xfe, 0x05, 0x46, 0xff, 0x22, + 0x00, 0x21, 0x06, 0xf1, 0x48, 0x00, 0xff, 0xf7, 0x53, 0xfe, 0x81, 0x46, + 0xff, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x49, 0x00, 0xff, 0xf7, 0x4c, 0xfe, + 0x8d, 0xf8, 0x00, 0x00, 0xff, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x4a, 0x00, + 0xff, 0xf7, 0x44, 0xfe, 0x82, 0x46, 0xff, 0x22, 0x00, 0x21, 0x06, 0xf1, + 0x4b, 0x00, 0xff, 0xf7, 0x3d, 0xfe, 0x02, 0x46, 0x44, 0xea, 0x05, 0x40, + 0x40, 0xea, 0x09, 0x64, 0x9d, 0xf8, 0x00, 0x00, 0x40, 0xea, 0x0a, 0x21, + 0x41, 0xea, 0x02, 0x45, 0xff, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x4c, 0x00, + 0xff, 0xf7, 0x2c, 0xfe, 0x55, 0xea, 0x00, 0x61, 0xc7, 0xe9, 0x00, 0x41, + 0xff, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x4d, 0x00, 0xff, 0xf7, 0x22, 0xfe, + 0x04, 0x46, 0xff, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x4e, 0x00, 0xff, 0xf7, + 0x1b, 0xfe, 0x44, 0xea, 0x00, 0x24, 0x00, 0x21, 0xff, 0x22, 0x06, 0xf1, + 0x4f, 0x00, 0xff, 0xf7, 0x13, 0xfe, 0x07, 0x46, 0xff, 0x22, 0x00, 0x21, + 0x06, 0xf1, 0x50, 0x00, 0xff, 0xf7, 0x0c, 0xfe, 0x05, 0x46, 0xff, 0x22, + 0x00, 0x21, 0x06, 0xf1, 0x51, 0x00, 0xff, 0xf7, 0x05, 0xfe, 0x83, 0x46, + 0xff, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x52, 0x00, 0xff, 0xf7, 0xfe, 0xfd, + 0x81, 0x46, 0xff, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x53, 0x00, 0xff, 0xf7, + 0xf7, 0xfd, 0x02, 0x46, 0x44, 0xea, 0x07, 0x40, 0x40, 0xea, 0x05, 0x64, + 0x4b, 0xea, 0x09, 0x21, 0x41, 0xea, 0x02, 0x45, 0xff, 0x22, 0x00, 0x21, + 0x06, 0xf1, 0x54, 0x00, 0xff, 0xf7, 0xe8, 0xfd, 0x02, 0x9a, 0x55, 0xea, + 0x00, 0x61, 0xc2, 0xe9, 0x00, 0x41, 0xbd, 0xe8, 0xff, 0x8e, 0x00, 0x00, + 0x00, 0x24, 0x74, 0x4b, 0x7c, 0xb5, 0x00, 0xf0, 0x23, 0xf8, 0xff, 0xf7, + 0xad, 0xfe, 0x01, 0x23, 0x00, 0xf0, 0x24, 0xf8, 0x00, 0xf0, 0x13, 0xf8, + 0x07, 0x20, 0x20, 0x70, 0x4c, 0xf2, 0x50, 0x34, 0x05, 0xf1, 0x25, 0x01, + 0x08, 0x78, 0x00, 0xf0, 0x03, 0x00, 0x03, 0x28, 0x04, 0xd0, 0x00, 0xf0, + 0x0c, 0xf8, 0x64, 0x1e, 0xf4, 0xd1, 0x00, 0xe0, 0x00, 0x26, 0x30, 0x46, + 0x76, 0xbd, 0x05, 0xf1, 0x22, 0x04, 0x00, 0x20, 0x20, 0x70, 0x4f, 0xf6, + 0x57, 0x76, 0x01, 0x20, 0xfa, 0xf7, 0x5e, 0xb9, 0x05, 0x49, 0x51, 0xf8, + 0x20, 0x50, 0x05, 0xf1, 0x24, 0x04, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, + 0x20, 0x46, 0xff, 0xf7, 0xb2, 0xbd, 0x00, 0x00, 0x5c, 0x9d, 0x04, 0x02, + 0xc8, 0x74, 0x02, 0x21, 0xe0, 0xb5, 0x03, 0x20, 0x00, 0x21, 0x01, 0x90, + 0x00, 0x91, 0xdf, 0xf8, 0x78, 0x39, 0x0f, 0xf6, 0xa8, 0x22, 0xdf, 0xf8, + 0x74, 0x19, 0xdf, 0xf8, 0x74, 0x09, 0x0f, 0xf0, 0xe5, 0xff, 0x00, 0x20, + 0x0e, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0xdf, 0xf8, 0x68, 0x09, 0x06, 0x7c, + 0x94, 0xb0, 0xd0, 0xe9, 0x00, 0x49, 0x05, 0x7b, 0x90, 0xf8, 0x08, 0x80, + 0xfd, 0xf7, 0xe3, 0xff, 0x0e, 0x90, 0x47, 0x46, 0xef, 0xf7, 0x43, 0xfe, + 0x00, 0xea, 0x08, 0x08, 0xef, 0xf7, 0x3e, 0xfe, 0x05, 0x40, 0xef, 0xf7, + 0x3d, 0xfe, 0x06, 0x40, 0x02, 0x96, 0xef, 0xf7, 0x45, 0xfe, 0x07, 0x40, + 0x05, 0x97, 0x2b, 0x46, 0x02, 0x98, 0x00, 0x90, 0x42, 0x46, 0x20, 0x46, + 0x49, 0x46, 0x10, 0xf0, 0x3b, 0xfe, 0x06, 0x00, 0x03, 0xa8, 0x4f, 0xf0, + 0x00, 0x0b, 0xc0, 0xe9, 0x00, 0xbb, 0x06, 0xd1, 0x03, 0xa9, 0x28, 0x46, + 0xf9, 0xf7, 0x3f, 0xfb, 0x28, 0x46, 0xf9, 0xf7, 0x2a, 0xfb, 0x00, 0x23, + 0xdf, 0xf8, 0x04, 0x29, 0x00, 0x20, 0x00, 0x27, 0x47, 0xf6, 0x30, 0x6c, + 0x94, 0x44, 0x0c, 0xeb, 0xc3, 0x01, 0x47, 0xf6, 0x10, 0x6c, 0xc1, 0xe9, + 0x00, 0x00, 0x94, 0x44, 0x4c, 0xf8, 0x23, 0x70, 0x5b, 0x1c, 0x08, 0x2b, + 0xf0, 0xd3, 0x00, 0x23, 0x47, 0xf6, 0xb4, 0x6e, 0x96, 0x44, 0x0e, 0xeb, + 0xc3, 0x01, 0xcd, 0xf8, 0x2c, 0xe0, 0xc1, 0xe9, 0x00, 0x00, 0x5b, 0x1c, + 0x08, 0x2b, 0xf3, 0xd3, 0xdf, 0xf8, 0xc8, 0x18, 0x07, 0x91, 0xcd, 0xf8, + 0x18, 0xc0, 0xbe, 0xbb, 0xdf, 0xf8, 0xb4, 0x18, 0x0a, 0x69, 0x8e, 0x68, + 0xcb, 0x68, 0x0d, 0x92, 0xd1, 0xe9, 0x00, 0x01, 0x0c, 0x93, 0x4f, 0xf0, + 0xff, 0x33, 0xdf, 0xf8, 0xac, 0x28, 0x02, 0x40, 0x0b, 0x40, 0x08, 0xbf, + 0x00, 0x2a, 0xdc, 0x46, 0x03, 0xd1, 0x00, 0x29, 0x08, 0xbf, 0x00, 0x28, + 0x09, 0xd1, 0xcd, 0xe9, 0x00, 0x01, 0x0f, 0xf6, 0x0c, 0x12, 0xff, 0x21, + 0x03, 0x20, 0xef, 0xf7, 0xf6, 0xfe, 0x4f, 0xf6, 0x17, 0x7c, 0x0c, 0x99, + 0x0d, 0x98, 0x0e, 0x43, 0x06, 0x43, 0x07, 0xd1, 0x0f, 0xf6, 0x04, 0x12, + 0xff, 0x21, 0x03, 0x20, 0xef, 0xf7, 0xe9, 0xfe, 0x4f, 0xf6, 0x16, 0x7c, + 0x5f, 0xea, 0x0c, 0x06, 0x06, 0xd0, 0x06, 0x99, 0x07, 0x98, 0x00, 0x96, + 0xff, 0x23, 0x13, 0x22, 0x00, 0xf0, 0x2a, 0xf9, 0x40, 0x46, 0xfc, 0xf7, + 0xd9, 0xf9, 0x28, 0x46, 0xfc, 0xf7, 0xdc, 0xf9, 0x02, 0x98, 0xfc, 0xf7, + 0xdf, 0xf9, 0x00, 0x21, 0x28, 0x46, 0xfb, 0xf7, 0x7e, 0xfc, 0x4e, 0xb9, + 0x08, 0xa9, 0x28, 0x46, 0x10, 0xf0, 0x8b, 0xff, 0x28, 0x46, 0x10, 0xf0, + 0x9f, 0xff, 0x06, 0x46, 0x4f, 0xf0, 0x01, 0x0b, 0xcd, 0xe9, 0x0c, 0x49, + 0xcd, 0xf8, 0x00, 0x80, 0x00, 0x20, 0xa8, 0x46, 0x34, 0x46, 0x81, 0x46, + 0x00, 0x2c, 0x08, 0xbf, 0x00, 0x28, 0x73, 0xd1, 0xdf, 0xf8, 0x0c, 0x08, + 0x5f, 0xfa, 0x89, 0xf1, 0x08, 0x44, 0x00, 0x21, 0x05, 0x7e, 0x05, 0xf0, + 0x1f, 0x06, 0x01, 0x20, 0x32, 0x46, 0x10, 0xf0, 0xb9, 0xff, 0xcd, 0xe9, + 0x10, 0x01, 0x0e, 0x2e, 0x06, 0xd1, 0x08, 0xa9, 0x40, 0x46, 0x10, 0xf0, + 0x95, 0xff, 0x04, 0x46, 0x4f, 0xf0, 0x00, 0x0b, 0x13, 0x2d, 0x51, 0xd2, + 0x24, 0x22, 0xdf, 0xf8, 0xdc, 0x17, 0x12, 0xfb, 0x06, 0xf2, 0x8f, 0x18, + 0x78, 0x68, 0x00, 0x28, 0x48, 0xd0, 0xdd, 0xe9, 0x0c, 0x23, 0xdd, 0xe9, + 0x10, 0x01, 0x10, 0x40, 0x19, 0x40, 0x08, 0xbf, 0x00, 0x28, 0x3f, 0xd0, + 0x00, 0x2c, 0x3d, 0xd1, 0xdf, 0xf8, 0xb8, 0x07, 0x50, 0xf8, 0x26, 0x00, + 0x00, 0x25, 0xc1, 0x07, 0x48, 0xbf, 0x00, 0x9d, 0x81, 0x07, 0x48, 0xbf, + 0x48, 0xea, 0x05, 0x05, 0x42, 0x07, 0x44, 0xbf, 0x02, 0x99, 0x0d, 0x43, + 0x00, 0x07, 0x48, 0xbf, 0x05, 0x9d, 0x39, 0x6a, 0x7a, 0x68, 0x28, 0x46, + 0x90, 0x47, 0x04, 0x46, 0xdf, 0xf8, 0x80, 0x07, 0x01, 0x7d, 0x00, 0x27, + 0x01, 0x29, 0x4f, 0xf0, 0x00, 0x0a, 0x0e, 0xd1, 0x40, 0x7d, 0x28, 0xb9, + 0x4f, 0xf6, 0x71, 0x7a, 0x01, 0x27, 0x0f, 0xf6, 0x78, 0x03, 0x02, 0xe0, + 0x01, 0x27, 0x0f, 0xf6, 0x68, 0x03, 0x0f, 0xf6, 0x54, 0x02, 0x00, 0xf0, + 0xaa, 0xfa, 0x07, 0xb1, 0x54, 0x46, 0x00, 0x2c, 0x51, 0xd1, 0x0b, 0x98, + 0x2a, 0x46, 0x31, 0x46, 0x00, 0xf0, 0x82, 0xf8, 0x2a, 0x46, 0x31, 0x46, + 0xdf, 0xf8, 0x48, 0x07, 0x00, 0xf0, 0x7c, 0xf8, 0x09, 0xf0, 0x56, 0xff, + 0x09, 0xf1, 0x01, 0x09, 0x5f, 0xfa, 0x89, 0xf1, 0x13, 0x29, 0x87, 0xdb, + 0x01, 0x21, 0x40, 0x46, 0xfb, 0xf7, 0xef, 0xfb, 0xbb, 0xf1, 0x00, 0x0f, + 0x03, 0xd0, 0x08, 0xa9, 0x40, 0x46, 0x10, 0xf0, 0x2b, 0xff, 0xef, 0xf7, + 0x1c, 0xfd, 0xfc, 0xf7, 0x38, 0xf9, 0xef, 0xf7, 0x17, 0xfd, 0xfc, 0xf7, + 0x3a, 0xf9, 0xef, 0xf7, 0x15, 0xfd, 0xfc, 0xf7, 0x3c, 0xf9, 0x03, 0xa9, + 0x40, 0x46, 0xf9, 0xf7, 0x3b, 0xfa, 0x10, 0xf0, 0xab, 0xfd, 0x04, 0xb9, + 0x04, 0x46, 0x0e, 0x98, 0xf9, 0xf7, 0xac, 0xfc, 0xdf, 0xf8, 0xf0, 0x16, + 0xdf, 0xf8, 0xf0, 0x26, 0x08, 0x60, 0xdd, 0xe9, 0x0c, 0x31, 0x00, 0x90, + 0x01, 0x94, 0xff, 0x21, 0x03, 0x20, 0xef, 0xf7, 0x16, 0xfe, 0x61, 0x1e, + 0xdf, 0xf8, 0xb4, 0x06, 0x89, 0x41, 0xc9, 0x0f, 0x41, 0x75, 0xbf, 0xf3, + 0x5f, 0x8f, 0x00, 0x22, 0x02, 0x75, 0x01, 0x20, 0x00, 0xf0, 0x74, 0xf8, + 0x15, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0xb9, 0x46, 0x00, 0x27, 0x25, 0xfa, + 0x07, 0xf0, 0xc0, 0x07, 0x22, 0xd5, 0x14, 0x21, 0x00, 0x20, 0x01, 0x91, + 0x00, 0x90, 0x01, 0xab, 0x0f, 0xaa, 0x39, 0x46, 0x30, 0x46, 0x00, 0xf0, + 0xe6, 0xf8, 0xb9, 0xf1, 0x00, 0x0f, 0x1c, 0xbf, 0x50, 0x46, 0xcd, 0xf8, + 0x3c, 0xa0, 0x01, 0x23, 0xbb, 0x40, 0x00, 0x28, 0x04, 0xbf, 0x0f, 0x98, + 0xb0, 0xf1, 0x00, 0x4f, 0x00, 0xd0, 0x18, 0xb9, 0x00, 0x20, 0x00, 0x90, + 0x13, 0x22, 0x01, 0xe0, 0x00, 0x90, 0x32, 0x46, 0x06, 0x99, 0x07, 0x98, + 0x00, 0xf0, 0x2a, 0xf8, 0x7f, 0x1c, 0x08, 0x2f, 0xd5, 0xd3, 0x00, 0x94, + 0x33, 0x46, 0x0f, 0xf2, 0xe8, 0x62, 0xff, 0x21, 0x01, 0x20, 0xef, 0xf7, + 0xd2, 0xfd, 0x8b, 0xe7, 0x2d, 0xe9, 0xf0, 0x43, 0x06, 0x46, 0x89, 0x46, + 0x90, 0x46, 0x00, 0x27, 0x28, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x0e, 0xd5, + 0x06, 0xeb, 0xc7, 0x00, 0x00, 0x21, 0xd0, 0xe9, 0x00, 0x45, 0x01, 0x20, + 0x4a, 0x46, 0x10, 0xf0, 0xcb, 0xfe, 0x06, 0xeb, 0xc7, 0x02, 0x20, 0x43, + 0x29, 0x43, 0xc2, 0xe9, 0x00, 0x01, 0x7f, 0x1c, 0x08, 0x2f, 0xe9, 0xd3, + 0xbd, 0xe8, 0xf0, 0x83, 0x2d, 0xe9, 0xf8, 0x43, 0x08, 0x9e, 0x04, 0x46, + 0x88, 0x46, 0x15, 0x46, 0x99, 0x46, 0x00, 0x27, 0x29, 0xfa, 0x07, 0xf0, + 0xc0, 0x07, 0x0c, 0xd5, 0x13, 0x2d, 0x08, 0xd0, 0x01, 0x20, 0x00, 0x21, + 0x2a, 0x46, 0x10, 0xf0, 0xad, 0xfe, 0x04, 0xeb, 0xc7, 0x02, 0xc2, 0xe9, + 0x00, 0x01, 0x48, 0xf8, 0x27, 0x60, 0x7f, 0x1c, 0x08, 0x2f, 0xeb, 0xd3, + 0xbd, 0xe8, 0xf1, 0x83, 0xf8, 0xb5, 0x04, 0x46, 0x47, 0xf6, 0xf4, 0x66, + 0xdf, 0xf8, 0xb0, 0x75, 0x31, 0x46, 0x38, 0x46, 0x0d, 0xf0, 0xb0, 0xf8, + 0x00, 0x25, 0x24, 0xb9, 0xb9, 0x59, 0x88, 0x42, 0x02, 0xd0, 0x01, 0x25, + 0x00, 0xe0, 0xb8, 0x51, 0x28, 0x46, 0xf2, 0xbd, 0x70, 0xb5, 0xdf, 0xf8, + 0x8c, 0x65, 0x33, 0x7d, 0x83, 0xb9, 0xdd, 0xe9, 0x04, 0x45, 0xb0, 0x60, + 0xc6, 0xe9, 0x00, 0x45, 0xf1, 0x60, 0x00, 0x20, 0x32, 0x61, 0x70, 0x75, + 0x01, 0x21, 0x31, 0x75, 0xdf, 0xf8, 0x64, 0x05, 0x0f, 0xf0, 0x0e, 0xff, + 0x00, 0x20, 0x70, 0xbd, 0x4f, 0xf6, 0x18, 0x70, 0x70, 0xbd, 0x70, 0xb5, + 0x04, 0x9c, 0x05, 0x9d, 0xdf, 0xf8, 0x64, 0x65, 0x30, 0x73, 0xf4, 0x80, + 0xb5, 0x60, 0x32, 0x60, 0x31, 0x61, 0xb3, 0x80, 0x06, 0xf1, 0x2c, 0x00, + 0xbd, 0xe8, 0x70, 0x40, 0x0f, 0xf0, 0xcb, 0xbe, 0xf8, 0xb5, 0xdf, 0xf8, + 0x60, 0xc5, 0x00, 0xf0, 0x1b, 0xf8, 0x48, 0x69, 0x20, 0xb1, 0xdf, 0xf8, + 0x24, 0x05, 0x0f, 0xf0, 0xca, 0xfe, 0x01, 0xe0, 0x4f, 0xf6, 0x27, 0x75, + 0x28, 0x46, 0xf2, 0xbd, 0xf8, 0xb5, 0xdf, 0xf8, 0x44, 0xc5, 0x00, 0xf0, + 0x0b, 0xf8, 0x88, 0x69, 0x20, 0xb1, 0xdf, 0xf8, 0x04, 0x05, 0x0f, 0xf0, + 0xd0, 0xfe, 0x01, 0xe0, 0x4f, 0xf6, 0x27, 0x75, 0x28, 0x46, 0xf2, 0xbd, + 0x06, 0x9e, 0x07, 0x9c, 0x08, 0x9f, 0xcc, 0xf8, 0x14, 0x10, 0xcc, 0xf8, + 0x00, 0x20, 0xcc, 0xf8, 0x04, 0x30, 0x24, 0x21, 0xdf, 0xf8, 0xf8, 0x34, + 0x8c, 0xf8, 0x10, 0x00, 0x4a, 0x43, 0x99, 0x18, 0xcc, 0xf8, 0x0c, 0x60, + 0xcc, 0xf8, 0x08, 0x70, 0xac, 0xf8, 0x18, 0x40, 0x00, 0x25, 0x70, 0x47, + 0x80, 0xb5, 0xdf, 0xf8, 0xc0, 0x04, 0x0f, 0xf0, 0xf6, 0xfe, 0x00, 0x20, + 0x02, 0xbd, 0x80, 0xb5, 0xe4, 0x22, 0xdf, 0xf8, 0xe8, 0x14, 0xe0, 0xf7, + 0xcd, 0xff, 0x00, 0x20, 0x02, 0xbd, 0xf8, 0xb5, 0x1e, 0x46, 0x24, 0x23, + 0xdf, 0xf8, 0xb8, 0x74, 0x04, 0x46, 0x5c, 0x43, 0x3c, 0x44, 0x15, 0x46, + 0x08, 0x46, 0x22, 0x69, 0x4f, 0xf6, 0x2a, 0x71, 0x52, 0xb1, 0x21, 0x6a, + 0x06, 0x9b, 0x00, 0x91, 0x29, 0x46, 0x01, 0x25, 0x24, 0x69, 0x32, 0x46, + 0x05, 0xfa, 0x00, 0xf0, 0xa0, 0x47, 0x01, 0x46, 0x08, 0x46, 0xf2, 0xbd, + 0x10, 0xb5, 0xdf, 0xf8, 0x74, 0x34, 0x1a, 0x7d, 0x22, 0xb9, 0x00, 0x24, + 0x04, 0x70, 0x58, 0x7d, 0x08, 0x70, 0x10, 0xbd, 0x01, 0x21, 0x01, 0x70, + 0x10, 0xbd, 0xf8, 0xb5, 0xdf, 0xf8, 0x80, 0x54, 0xdf, 0xf8, 0x68, 0x14, + 0x2e, 0x68, 0x24, 0x22, 0x84, 0xb0, 0x72, 0x43, 0x00, 0x24, 0x8f, 0x18, + 0x03, 0x94, 0x78, 0x69, 0xa0, 0xb1, 0x2c, 0x8b, 0xa9, 0x68, 0x22, 0x46, + 0x05, 0xf1, 0x1c, 0x00, 0xe0, 0xf7, 0x8e, 0xff, 0x39, 0x6a, 0x00, 0xf0, + 0x4e, 0xf8, 0x23, 0x46, 0x00, 0x92, 0x01, 0x20, 0xec, 0x68, 0x69, 0x68, + 0x7f, 0x69, 0x05, 0xf1, 0x1c, 0x02, 0xa0, 0x40, 0xb8, 0x47, 0x04, 0x46, + 0x0c, 0x2e, 0x06, 0xd1, 0x00, 0x20, 0x11, 0xf0, 0x31, 0xf9, 0xc0, 0xf1, + 0x01, 0x00, 0xc0, 0xb2, 0x50, 0xb1, 0x03, 0x98, 0x01, 0x90, 0x05, 0xf1, + 0x1c, 0x01, 0x00, 0x91, 0x23, 0x46, 0x69, 0x69, 0x28, 0x7c, 0x32, 0x46, + 0x0b, 0xf0, 0xfc, 0xff, 0x05, 0xb0, 0xf0, 0xbd, 0xf8, 0xb5, 0xdf, 0xf8, + 0x14, 0x44, 0xdf, 0xf8, 0xf8, 0x23, 0x25, 0x68, 0x24, 0x23, 0x84, 0xb0, + 0x6b, 0x43, 0x00, 0x20, 0xd6, 0x18, 0x03, 0x90, 0xb1, 0x69, 0x89, 0xb1, + 0x27, 0x8b, 0xa1, 0x68, 0x3a, 0x46, 0x04, 0xf1, 0x1c, 0x00, 0xe0, 0xf7, + 0x55, 0xff, 0x31, 0x6a, 0x00, 0xf0, 0x15, 0xf8, 0x00, 0x92, 0x61, 0x68, + 0xe0, 0x68, 0xb6, 0x69, 0x3b, 0x46, 0x04, 0xf1, 0x1c, 0x02, 0xb0, 0x47, + 0x03, 0x99, 0x01, 0x91, 0x04, 0xf1, 0x1c, 0x02, 0x00, 0x92, 0x03, 0x46, + 0x61, 0x69, 0x20, 0x7c, 0x2a, 0x46, 0x0b, 0xf0, 0xd8, 0xff, 0x05, 0xb0, + 0xf0, 0xbd, 0x02, 0x91, 0x4f, 0xf4, 0x80, 0x70, 0x01, 0x90, 0x03, 0xaa, + 0x70, 0x47, 0xf8, 0xb5, 0x00, 0x25, 0xdf, 0xf8, 0x98, 0x43, 0x54, 0xf8, + 0x25, 0x00, 0x60, 0xb9, 0x2b, 0x46, 0x04, 0xf1, 0x70, 0x02, 0xff, 0x21, + 0x01, 0x20, 0xef, 0xf7, 0x6e, 0xfc, 0x03, 0x22, 0x4f, 0xf6, 0x0f, 0x71, + 0x01, 0x20, 0xfc, 0xf7, 0xdf, 0xff, 0x6d, 0x1c, 0x13, 0x2d, 0xec, 0xd3, + 0xdf, 0xf8, 0x68, 0x63, 0x00, 0x25, 0x24, 0x27, 0x6f, 0x43, 0xf0, 0x59, + 0xa0, 0xb1, 0x54, 0xf8, 0x25, 0x10, 0x00, 0x20, 0x01, 0x29, 0x06, 0xd0, + 0x02, 0x29, 0x07, 0xd0, 0x04, 0x29, 0x08, 0xbf, 0xef, 0xf7, 0x38, 0xfb, + 0x04, 0xe0, 0xef, 0xf7, 0x34, 0xfb, 0x01, 0xe0, 0xef, 0xf7, 0x30, 0xfb, + 0xf1, 0x19, 0xf2, 0x59, 0x09, 0x6a, 0x90, 0x47, 0x6d, 0x1c, 0x13, 0x2d, + 0xe3, 0xd3, 0xe4, 0x21, 0xdf, 0xf8, 0x44, 0x03, 0xf3, 0xf7, 0xc6, 0xf8, + 0xc3, 0x48, 0x00, 0x21, 0x01, 0x75, 0x41, 0x75, 0x01, 0x21, 0x81, 0x75, + 0xf1, 0xbd, 0xc0, 0x48, 0x80, 0x7d, 0x70, 0x47, 0x70, 0xb5, 0xc2, 0x4c, + 0xc2, 0x49, 0x25, 0x68, 0x24, 0x22, 0x6a, 0x43, 0x8e, 0x18, 0xb0, 0x68, + 0x38, 0xb1, 0x33, 0x6a, 0xa2, 0x68, 0xe1, 0x88, 0xa0, 0x88, 0xb6, 0x68, + 0xb0, 0x47, 0x03, 0x46, 0x01, 0xe0, 0x4f, 0xf6, 0x28, 0x73, 0x21, 0x69, + 0x20, 0x7b, 0x2a, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x0b, 0xf0, 0x61, 0xbf, + 0x38, 0xb5, 0x0c, 0x46, 0x11, 0x46, 0x1a, 0x46, 0x24, 0x23, 0xb4, 0x4d, + 0x58, 0x43, 0x05, 0x44, 0xe8, 0x68, 0x20, 0xb1, 0x20, 0x46, 0x2b, 0x6a, + 0xec, 0x68, 0xa0, 0x47, 0x32, 0xbd, 0x4f, 0xf6, 0x29, 0x70, 0x32, 0xbd, + 0xf8, 0xb5, 0x04, 0x46, 0xab, 0x4f, 0x0d, 0x46, 0x16, 0x46, 0x07, 0xf1, + 0x2c, 0x00, 0x0f, 0xf0, 0x29, 0xfe, 0x00, 0x07, 0x02, 0xd5, 0x4f, 0xf6, + 0x2f, 0x70, 0xf2, 0xbd, 0x00, 0x96, 0x2b, 0x46, 0x22, 0x46, 0x13, 0x21, + 0x07, 0xf1, 0x18, 0x00, 0xf9, 0xf7, 0xb9, 0xfa, 0xf2, 0xbd, 0x80, 0xb5, + 0x00, 0x92, 0x0b, 0x46, 0x02, 0x46, 0x13, 0x21, 0xa7, 0x48, 0xf9, 0xf7, + 0x9b, 0xfa, 0x02, 0xbd, 0x19, 0xb1, 0x9c, 0x48, 0x40, 0x6b, 0x11, 0xf0, + 0xc5, 0xb9, 0x70, 0x47, 0x70, 0xb5, 0x04, 0x46, 0x00, 0x25, 0x0f, 0xf2, + 0x18, 0x36, 0x24, 0xfa, 0x05, 0xf0, 0xc0, 0x07, 0x08, 0xd5, 0x28, 0x46, + 0xef, 0xf7, 0xda, 0xfa, 0xff, 0x28, 0x03, 0xd0, 0x2b, 0x46, 0x32, 0x46, + 0x00, 0xf0, 0x21, 0xf8, 0x6d, 0x1c, 0x08, 0x2d, 0xef, 0xd3, 0x4f, 0xf4, + 0xfa, 0x70, 0xfd, 0xf7, 0x88, 0xfa, 0x2b, 0x46, 0x0f, 0xf2, 0xfc, 0x22, + 0x00, 0xf0, 0x15, 0xf8, 0x01, 0x22, 0xe1, 0xb2, 0x02, 0x20, 0x11, 0xf0, + 0xbf, 0xf8, 0x38, 0xb1, 0x01, 0x22, 0x21, 0x46, 0x02, 0x20, 0x11, 0xf0, + 0xe1, 0xf8, 0x01, 0x20, 0xfd, 0xf7, 0x75, 0xfa, 0x02, 0x22, 0x21, 0x46, + 0x02, 0x20, 0x11, 0xf0, 0xd9, 0xf8, 0x00, 0x20, 0x70, 0xbd, 0xff, 0x21, + 0x03, 0x20, 0xef, 0xf7, 0xae, 0xbb, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x46, + 0x4f, 0xea, 0x04, 0x03, 0xb2, 0xa2, 0xff, 0xf7, 0xf4, 0xff, 0x01, 0x20, + 0xfd, 0xf7, 0x5f, 0xfa, 0x00, 0x25, 0x00, 0x26, 0x24, 0xfa, 0x06, 0xf0, + 0xc0, 0x07, 0x0a, 0xd5, 0x30, 0x46, 0xef, 0xf7, 0x9b, 0xfa, 0xff, 0x28, + 0x05, 0xd0, 0x06, 0x2e, 0x16, 0xbf, 0x07, 0x2e, 0x4f, 0xf6, 0x51, 0x75, + 0x00, 0x25, 0x76, 0x1c, 0x07, 0x2e, 0xed, 0xd9, 0x01, 0x22, 0xe1, 0xb2, + 0x03, 0x20, 0x11, 0xf0, 0x87, 0xf8, 0x38, 0xb1, 0x01, 0x22, 0x21, 0x46, + 0x03, 0x20, 0x11, 0xf0, 0xa9, 0xf8, 0x01, 0x20, 0xfd, 0xf7, 0x3d, 0xfa, + 0x02, 0x22, 0x21, 0x46, 0x03, 0x20, 0x11, 0xf0, 0xa1, 0xf8, 0x28, 0x46, + 0x70, 0xbd, 0x2d, 0xe9, 0xf8, 0x41, 0x89, 0xb0, 0x88, 0x46, 0x16, 0x46, + 0x1d, 0x46, 0x09, 0xf0, 0x81, 0xfc, 0x04, 0x46, 0x14, 0x21, 0x04, 0xa8, + 0xf2, 0xf7, 0xf2, 0xff, 0x02, 0xa8, 0x00, 0x27, 0xc0, 0xe9, 0x00, 0x77, + 0xcd, 0xe9, 0x00, 0x77, 0x84, 0xb9, 0x64, 0x49, 0x64, 0x4a, 0x65, 0x48, + 0x05, 0x91, 0x06, 0x92, 0x04, 0x90, 0x64, 0x49, 0x64, 0x4a, 0x07, 0x91, + 0x08, 0x92, 0x64, 0x49, 0x64, 0x4a, 0x02, 0x91, 0x03, 0x92, 0x64, 0x49, + 0x64, 0x4a, 0x11, 0xe0, 0x05, 0x2c, 0x11, 0xd1, 0x63, 0x49, 0x64, 0x4a, + 0x64, 0x48, 0x05, 0x91, 0x06, 0x92, 0x04, 0x90, 0x63, 0x49, 0x64, 0x4a, + 0x07, 0x91, 0x08, 0x92, 0x63, 0x49, 0x64, 0x4a, 0x02, 0x91, 0x03, 0x92, + 0x63, 0x49, 0x64, 0x4a, 0x00, 0x91, 0x01, 0x92, 0x1d, 0xb1, 0x02, 0x2d, + 0x0f, 0xd0, 0x0b, 0xd3, 0x0f, 0xe0, 0x04, 0xa9, 0x14, 0x24, 0x30, 0x68, + 0xa0, 0x42, 0x0d, 0xd3, 0x22, 0x46, 0x40, 0x46, 0xe0, 0xf7, 0xee, 0xfd, + 0x34, 0x60, 0x09, 0xe0, 0x02, 0xa9, 0x08, 0x24, 0xf3, 0xe7, 0x69, 0x46, + 0xfb, 0xe7, 0x4f, 0xf6, 0x2a, 0x77, 0x01, 0xe0, 0x4f, 0xf6, 0x26, 0x77, + 0x38, 0x46, 0x0a, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, 0x2d, 0xe9, 0xf8, 0x41, + 0x85, 0xb0, 0x88, 0x46, 0x16, 0x46, 0x1f, 0x46, 0x09, 0xf0, 0x2a, 0xfc, + 0x00, 0x25, 0x04, 0x46, 0xff, 0xb9, 0x14, 0x21, 0x68, 0x46, 0xf2, 0xf7, + 0x99, 0xff, 0xd4, 0xb1, 0x06, 0x2c, 0x18, 0xbf, 0x07, 0x2c, 0x0b, 0xd1, + 0x68, 0x46, 0x09, 0xf0, 0x04, 0xfc, 0x06, 0x2c, 0x14, 0xbf, 0x4f, 0xf6, + 0x51, 0x71, 0x4b, 0xf2, 0x02, 0x11, 0x68, 0x46, 0x09, 0xf0, 0xff, 0xfb, + 0x30, 0x68, 0x14, 0x28, 0x0a, 0xd3, 0x14, 0x22, 0x69, 0x46, 0x40, 0x46, + 0xe0, 0xf7, 0xb6, 0xfd, 0x14, 0x20, 0x30, 0x60, 0x04, 0xe0, 0x4f, 0xf6, + 0x2a, 0x75, 0x01, 0xe0, 0x4f, 0xf6, 0x26, 0x75, 0x28, 0x46, 0x06, 0xb0, + 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x20, 0x61, 0xb9, 0x01, 0x99, 0x13, 0x78, + 0x99, 0x42, 0x0a, 0xd3, 0x00, 0x21, 0x01, 0xe0, 0x51, 0x54, 0x49, 0x1c, + 0x99, 0x42, 0xfb, 0xd3, 0x00, 0x99, 0x0b, 0x60, 0x70, 0x47, 0x4f, 0xf6, + 0x27, 0x70, 0x70, 0x47, 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x11, 0xf0, + 0x27, 0xf9, 0x10, 0xb1, 0x12, 0x48, 0x04, 0x75, 0x45, 0x75, 0x31, 0xbd, + 0x38, 0xb5, 0x2c, 0x4c, 0x04, 0x9d, 0x04, 0x40, 0x18, 0xbf, 0x01, 0x24, + 0x1c, 0x70, 0x40, 0xf6, 0x08, 0x01, 0x29, 0x4b, 0x03, 0x40, 0x18, 0xbf, + 0x01, 0x23, 0x08, 0x40, 0x13, 0x70, 0x18, 0xbf, 0x01, 0x20, 0x28, 0x70, + 0x31, 0xbd, 0x00, 0x00, 0x80, 0x93, 0x04, 0x02, 0x00, 0x44, 0x00, 0x21, + 0x47, 0xfa, 0x02, 0x02, 0x40, 0x75, 0x02, 0x21, 0x50, 0x76, 0x02, 0x21, + 0x80, 0xf4, 0x02, 0x21, 0x00, 0x21, 0xfc, 0xff, 0xd4, 0x43, 0x00, 0x21, + 0x58, 0x7d, 0x04, 0x02, 0x70, 0x8a, 0x04, 0x02, 0xc4, 0xf4, 0x02, 0x21, + 0xc0, 0xf4, 0x02, 0x21, 0xbc, 0x8a, 0x04, 0x02, 0x0c, 0x5b, 0x02, 0x21, + 0x28, 0x5c, 0x02, 0x21, 0x60, 0xf4, 0x02, 0x21, 0xec, 0x43, 0x00, 0x21, + 0xbe, 0xba, 0x01, 0x00, 0xed, 0xfe, 0x01, 0x00, 0xef, 0xbe, 0x01, 0x00, + 0xad, 0xba, 0x01, 0x00, 0xad, 0xda, 0x01, 0x00, 0xfe, 0xca, 0x01, 0x00, + 0x0d, 0xf0, 0x01, 0x00, 0xad, 0xde, 0x01, 0x00, 0xce, 0xfa, 0x01, 0x00, + 0xbe, 0xba, 0x02, 0x00, 0xed, 0xfe, 0x02, 0x00, 0xef, 0xbe, 0x02, 0x00, + 0xad, 0xba, 0x02, 0x00, 0xad, 0xda, 0x02, 0x00, 0xfe, 0xca, 0x02, 0x00, + 0x0d, 0xf0, 0x02, 0x00, 0xad, 0xde, 0x02, 0x00, 0xce, 0xfa, 0x02, 0x00, + 0xf0, 0x4e, 0x02, 0x00, 0x06, 0x00, 0x04, 0x00, 0x21, 0x76, 0x65, 0x72, + 0x3a, 0x20, 0x63, 0x61, 0x6c, 0x4d, 0x61, 0x73, 0x6b, 0x20, 0x25, 0x78, + 0x0a, 0x00, 0x00, 0x00, 0x63, 0x68, 0x61, 0x6e, 0x4d, 0x61, 0x73, 0x6b, + 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x0a, 0x00, 0x69, 0x6e, 0x69, 0x74, + 0x3a, 0x20, 0x6f, 0x62, 0x6a, 0x49, 0x64, 0x20, 0x30, 0x78, 0x25, 0x58, + 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x58, 0x0a, 0x00, 0x00, 0x00, + 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x6c, 0x30, 0x3a, 0x20, 0x63, 0x68, + 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x54, 0x65, 0x73, 0x74, + 0x43, 0x61, 0x6c, 0x30, 0x3a, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x0a, 0x00, + 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x6c, 0x31, 0x3a, 0x20, 0x63, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x20, 0x30, 0x78, 0x25, 0x58, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x69, 0x74, 0x3a, 0x20, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x20, 0x25, 0x73, 0x0a, 0x00, 0x50, 0x41, 0x53, 0x53, + 0x00, 0x00, 0x00, 0x00, 0x46, 0x41, 0x49, 0x4c, 0x00, 0x00, 0x00, 0x00, + 0xcf, 0xff, 0x01, 0x02, 0xe7, 0xf9, 0x01, 0x02, 0x59, 0x00, 0x02, 0x02, + 0xf7, 0xfe, 0x01, 0x02, 0x69, 0xff, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x2d, 0xe9, 0xf8, 0x4f, 0x84, 0xb0, 0x0b, 0xb1, 0x00, 0x24, 0x1c, 0x60, + 0x04, 0x46, 0xa0, 0x46, 0x01, 0xe0, 0x08, 0xf1, 0x01, 0x08, 0x98, 0xf8, + 0x00, 0x00, 0xa0, 0xf1, 0x09, 0x03, 0x05, 0x2b, 0xf7, 0xd3, 0x20, 0x28, + 0xf5, 0xd0, 0x2d, 0x28, 0x16, 0xbf, 0x2b, 0x28, 0x18, 0xf8, 0x01, 0x5b, + 0x2b, 0x25, 0x00, 0x2a, 0x01, 0x91, 0x03, 0xd4, 0x01, 0x2a, 0x01, 0xd0, + 0x25, 0x2a, 0x03, 0xdb, 0x00, 0x29, 0x59, 0xd0, 0x0c, 0x60, 0x57, 0xe0, + 0x00, 0x2a, 0x0c, 0xdd, 0x10, 0x2a, 0x04, 0xbf, 0x98, 0xf8, 0x00, 0x00, + 0x30, 0x28, 0x02, 0xbf, 0x98, 0xf8, 0x01, 0x00, 0x40, 0xf0, 0x20, 0x00, + 0x78, 0x28, 0x11, 0xd1, 0x0c, 0xe0, 0x98, 0xf8, 0x00, 0x00, 0x30, 0x28, + 0x18, 0xbf, 0x0a, 0x22, 0x0a, 0xd1, 0x98, 0xf8, 0x01, 0x00, 0x40, 0xf0, + 0x20, 0x00, 0x78, 0x28, 0x03, 0xd1, 0x10, 0x22, 0x08, 0xf1, 0x02, 0x08, + 0x00, 0xe0, 0x08, 0x22, 0xcd, 0xf8, 0x0c, 0x80, 0x01, 0xe0, 0x08, 0xf1, + 0x01, 0x08, 0x98, 0xf8, 0x00, 0x00, 0x30, 0x28, 0xf9, 0xd0, 0x07, 0x4e, + 0x7e, 0x44, 0x18, 0x36, 0x4f, 0xf0, 0x00, 0x09, 0x06, 0xf1, 0x28, 0x00, + 0xcd, 0xf8, 0x08, 0x80, 0xca, 0x46, 0x8d, 0xf8, 0x00, 0x00, 0x17, 0x46, + 0x0c, 0xe0, 0x00, 0xbf, 0xb4, 0x8a, 0x02, 0x00, 0x9d, 0xf8, 0x00, 0x10, + 0x40, 0x1a, 0xca, 0x46, 0x5f, 0xfa, 0x80, 0xfb, 0x07, 0xfb, 0x09, 0xb9, + 0x08, 0xf1, 0x01, 0x08, 0x98, 0xf8, 0x00, 0x10, 0xa1, 0xf1, 0x41, 0x00, + 0x1a, 0x28, 0x38, 0xbf, 0x20, 0x31, 0x3a, 0x46, 0x06, 0xf1, 0x28, 0x00, + 0x10, 0xf0, 0xfc, 0xff, 0x00, 0x28, 0xe7, 0xd1, 0x03, 0x99, 0x41, 0x45, + 0x04, 0xd1, 0x01, 0x98, 0x00, 0xb1, 0x04, 0x60, 0x00, 0x20, 0x20, 0xe0, + 0x02, 0x99, 0xf0, 0x5d, 0xa8, 0xeb, 0x01, 0x01, 0x08, 0x1a, 0x00, 0x28, + 0x10, 0xd4, 0x06, 0xdc, 0xb9, 0xeb, 0x0b, 0x01, 0x03, 0xd3, 0xb1, 0xfb, + 0xf7, 0xf0, 0x50, 0x45, 0x08, 0xd0, 0xaf, 0xf3, 0x00, 0x80, 0x04, 0x98, + 0x08, 0xb1, 0x01, 0x21, 0x01, 0x60, 0x4f, 0xf0, 0xff, 0x39, 0x03, 0xe0, + 0x2d, 0x2d, 0x08, 0xbf, 0xc9, 0xf1, 0x00, 0x09, 0x01, 0x98, 0x08, 0xb1, + 0xc0, 0xf8, 0x00, 0x80, 0x48, 0x46, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0xff, 0xe7, 0x00, 0x23, 0x0a, 0x22, 0x00, 0x21, 0x58, 0xe7, 0x00, 0x00, + 0x80, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, + 0x40, 0x8a, 0xed, 0xf7, 0x4a, 0xfa, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, + 0x40, 0x0a, 0xdf, 0xed, 0x06, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0x9f, 0xed, + 0x05, 0x1a, 0x20, 0xee, 0x01, 0x1a, 0x88, 0xee, 0x01, 0x0a, 0xbd, 0xec, + 0x02, 0x8b, 0x01, 0xbd, 0x28, 0x6b, 0x6e, 0x4e, 0x00, 0x00, 0x00, 0x3d, + 0x2d, 0xe9, 0xf0, 0x41, 0x17, 0x46, 0x80, 0x46, 0x86, 0xb0, 0x38, 0x88, + 0x0d, 0x9c, 0xad, 0xf8, 0x10, 0x00, 0x0e, 0x46, 0x3a, 0x88, 0xad, 0xf8, + 0x12, 0x20, 0x1d, 0x46, 0x8d, 0xf8, 0x14, 0x80, 0x04, 0xa8, 0xec, 0xf7, + 0xb1, 0xff, 0x06, 0x21, 0x00, 0x22, 0x01, 0x2e, 0x8d, 0xf8, 0x05, 0x80, + 0x8d, 0xf8, 0x03, 0x10, 0x8d, 0xf8, 0x02, 0x20, 0x08, 0xbf, 0x04, 0x20, + 0x05, 0xd0, 0x08, 0x20, 0x01, 0x2c, 0x8d, 0xf8, 0x01, 0x00, 0x02, 0xd1, + 0x0a, 0x20, 0x8d, 0xf8, 0x01, 0x00, 0x01, 0x2e, 0x8d, 0xf8, 0x00, 0x20, + 0x8d, 0xf8, 0x0d, 0x80, 0x8d, 0xf8, 0x0b, 0x10, 0x8d, 0xf8, 0x0a, 0x20, + 0x03, 0xd1, 0x01, 0x20, 0x8d, 0xf8, 0x09, 0x00, 0x07, 0xe0, 0x02, 0x20, + 0x8d, 0xf8, 0x09, 0x00, 0x01, 0x2c, 0x04, 0xbf, 0x05, 0x22, 0x8d, 0xf8, + 0x09, 0x20, 0x01, 0x21, 0x8d, 0xf8, 0x08, 0x10, 0x78, 0x7a, 0x02, 0x28, + 0x23, 0xd1, 0x02, 0x2d, 0x04, 0xd1, 0x03, 0x21, 0x8d, 0xf8, 0x03, 0x10, + 0x8d, 0xf8, 0x0b, 0x10, 0x01, 0x2c, 0xb8, 0x7a, 0xa0, 0xf1, 0x1c, 0x01, + 0x8d, 0xf8, 0x04, 0x10, 0xb8, 0x7a, 0xa0, 0xf1, 0x20, 0x01, 0x8d, 0xf8, + 0x0c, 0x10, 0x23, 0xd1, 0xb8, 0x7a, 0x01, 0x28, 0x06, 0xd1, 0xe4, 0x21, + 0xe1, 0x22, 0x8d, 0xf8, 0x04, 0x10, 0x8d, 0xf8, 0x0c, 0x20, 0x19, 0xe0, + 0xc6, 0x21, 0xd2, 0x22, 0x8d, 0xf8, 0x0c, 0x10, 0x8d, 0xf8, 0x04, 0x20, + 0x12, 0xe0, 0x0c, 0x98, 0xba, 0x7a, 0x02, 0xeb, 0x80, 0x02, 0xa2, 0xf1, + 0x20, 0x03, 0x00, 0x22, 0x02, 0x2d, 0x8d, 0xf8, 0x04, 0x30, 0x8d, 0xf8, + 0x0c, 0x20, 0x05, 0xd1, 0x01, 0x28, 0x12, 0xbf, 0x00, 0x28, 0x03, 0x20, + 0x8d, 0xf8, 0x03, 0x00, 0x68, 0x46, 0xec, 0xf7, 0x53, 0xff, 0x02, 0xa8, + 0xec, 0xf7, 0x50, 0xff, 0x40, 0x46, 0xed, 0xf7, 0x6b, 0xf9, 0x06, 0xb0, + 0xbd, 0xe8, 0xf0, 0x81, 0x2d, 0xe9, 0xf0, 0x47, 0x89, 0x46, 0x08, 0x9f, + 0x09, 0x9c, 0x0a, 0x9d, 0x80, 0x46, 0x92, 0x46, 0x1e, 0x46, 0x00, 0x21, + 0xed, 0xf7, 0x27, 0xf8, 0xba, 0xf1, 0x02, 0x0f, 0x38, 0x70, 0x20, 0xd0, + 0x40, 0x42, 0x20, 0x70, 0x70, 0x7a, 0x02, 0x28, 0x03, 0xd1, 0x97, 0xf9, + 0x00, 0x10, 0x49, 0x42, 0x29, 0x70, 0x4a, 0x46, 0x94, 0xf9, 0x00, 0x10, + 0x40, 0x46, 0xec, 0xf7, 0xb9, 0xff, 0x49, 0x46, 0x40, 0x46, 0xec, 0xf7, + 0xd8, 0xff, 0x20, 0x70, 0x70, 0x7a, 0x02, 0x28, 0x07, 0xd1, 0x95, 0xf9, + 0x00, 0x10, 0x4a, 0x46, 0x40, 0x46, 0xbd, 0xe8, 0xf0, 0x47, 0xec, 0xf7, + 0xda, 0xbf, 0xbd, 0xe8, 0xf0, 0x87, 0x49, 0x46, 0x40, 0x46, 0xec, 0xf7, + 0xc6, 0xff, 0x20, 0x70, 0x70, 0x7a, 0x02, 0x28, 0xf5, 0xd1, 0x49, 0x46, + 0x40, 0x46, 0xec, 0xf7, 0xd5, 0xff, 0x28, 0x70, 0xef, 0xe7, 0xf8, 0xb5, + 0x0f, 0x46, 0x04, 0x46, 0x78, 0x68, 0xa1, 0x68, 0x88, 0x42, 0x16, 0x46, + 0x1d, 0x46, 0x05, 0xd2, 0x20, 0x7c, 0x98, 0x42, 0x0c, 0xd3, 0x40, 0x1b, + 0x20, 0x74, 0x09, 0xe0, 0x30, 0x46, 0xdf, 0xf7, 0x8d, 0xfe, 0x21, 0x7c, + 0x3f, 0x30, 0x6a, 0x18, 0x90, 0x42, 0x24, 0xbf, 0x69, 0x18, 0x21, 0x74, + 0x78, 0x7a, 0x02, 0x28, 0x13, 0xd1, 0x78, 0x68, 0xe1, 0x68, 0x88, 0x42, + 0x05, 0xd2, 0x20, 0x7c, 0xa8, 0x42, 0x0c, 0xd3, 0x61, 0x7c, 0x4d, 0x1b, + 0x08, 0xe0, 0x30, 0x46, 0xdf, 0xf7, 0x76, 0xfe, 0x61, 0x7c, 0x3f, 0x30, + 0x6a, 0x18, 0x90, 0x42, 0x01, 0xd3, 0x6d, 0x18, 0x65, 0x74, 0xf1, 0xbd, + 0x70, 0xb5, 0x4e, 0x7a, 0x84, 0x68, 0x4d, 0x68, 0x02, 0x2e, 0x0e, 0xd0, + 0x01, 0x2b, 0x04, 0xd1, 0xa5, 0x42, 0x06, 0xd2, 0x01, 0x7c, 0x52, 0x18, + 0x05, 0xe0, 0x03, 0x68, 0x5d, 0x1b, 0xac, 0x42, 0xf8, 0xd3, 0x01, 0x7c, + 0x8a, 0x1a, 0x02, 0x74, 0x70, 0xbd, 0x03, 0x7c, 0xa5, 0x42, 0x2c, 0xbf, + 0x9b, 0x1a, 0xd3, 0x18, 0x03, 0x74, 0x45, 0x68, 0x49, 0x68, 0xc4, 0x68, + 0x43, 0x7c, 0x6d, 0x1a, 0xac, 0x42, 0x2c, 0xbf, 0x9a, 0x1a, 0xd2, 0x18, + 0x42, 0x74, 0x70, 0xbd, 0x30, 0xb5, 0x84, 0x68, 0x4d, 0x68, 0x01, 0x2a, + 0x0f, 0xd1, 0xa5, 0x42, 0x03, 0xd2, 0x02, 0x7c, 0x0a, 0xb1, 0x52, 0x1e, + 0x02, 0x74, 0x4a, 0x7a, 0x02, 0x2a, 0x24, 0xd1, 0x49, 0x68, 0xc2, 0x68, + 0x91, 0x42, 0x20, 0xd2, 0x01, 0x7c, 0xd9, 0xb9, 0x30, 0xbd, 0x4a, 0x7a, + 0x01, 0x2a, 0x0c, 0xd1, 0x01, 0x2b, 0x02, 0xd1, 0xa5, 0x42, 0x16, 0xd3, + 0x03, 0xe0, 0x01, 0x68, 0x4d, 0x1b, 0xac, 0x42, 0x11, 0xd3, 0x02, 0x7c, + 0x51, 0x1e, 0x01, 0x74, 0x30, 0xbd, 0xa5, 0x42, 0x02, 0xd3, 0x02, 0x7c, + 0x53, 0x1e, 0x03, 0x74, 0x43, 0x68, 0x49, 0x68, 0xc2, 0x68, 0x5b, 0x1a, + 0x9a, 0x42, 0x02, 0xd3, 0x42, 0x7c, 0x51, 0x1e, 0x41, 0x74, 0x30, 0xbd, + 0x2d, 0xe9, 0xf0, 0x4f, 0x8b, 0xb0, 0x16, 0x46, 0x15, 0x9d, 0xf7, 0x7a, + 0x02, 0x2d, 0x83, 0x46, 0x88, 0x46, 0x9a, 0x46, 0x0d, 0xd1, 0xb8, 0xf1, + 0x01, 0x0f, 0x04, 0xd1, 0x00, 0x24, 0x00, 0x94, 0x01, 0x23, 0x00, 0x22, + 0x03, 0xe0, 0x01, 0x22, 0x00, 0x92, 0x00, 0x23, 0x00, 0x21, 0xed, 0xf7, + 0x76, 0xf8, 0x00, 0x21, 0x8d, 0xf8, 0x0e, 0x10, 0x8d, 0xf8, 0x0d, 0x10, + 0x53, 0x46, 0x70, 0x7a, 0x01, 0x95, 0x02, 0x28, 0x08, 0xbf, 0x01, 0x27, + 0x00, 0x97, 0x32, 0x46, 0x41, 0x46, 0x58, 0x46, 0xff, 0xf7, 0x86, 0xfe, + 0x0d, 0xf1, 0x0d, 0x00, 0x0d, 0xf1, 0x0e, 0x01, 0x03, 0xaa, 0x02, 0x90, + 0x01, 0x91, 0x00, 0x92, 0x33, 0x46, 0x52, 0x46, 0x41, 0x46, 0x58, 0x46, + 0xff, 0xf7, 0xfe, 0xfe, 0x34, 0x7a, 0xba, 0xf1, 0x02, 0x0f, 0x03, 0xd0, + 0x00, 0x21, 0xad, 0xf8, 0x20, 0x10, 0x12, 0xe0, 0x02, 0x2d, 0x10, 0xd1, + 0x9d, 0xf8, 0x0e, 0x00, 0x00, 0xf0, 0x0e, 0xf9, 0x8d, 0xf8, 0x20, 0x00, + 0x70, 0x7a, 0x02, 0x28, 0x04, 0xd1, 0x9d, 0xf8, 0x0d, 0x00, 0x00, 0xf0, + 0x05, 0xf9, 0x00, 0xe0, 0x00, 0x20, 0x8d, 0xf8, 0x21, 0x00, 0x00, 0x21, + 0x01, 0x2d, 0x06, 0x91, 0x07, 0x91, 0x89, 0x46, 0x44, 0xd1, 0x58, 0x46, + 0xed, 0xf7, 0x81, 0xf8, 0x81, 0x46, 0x01, 0x21, 0x58, 0x46, 0xed, 0xf7, + 0x7a, 0xf8, 0x3b, 0xe0, 0x9d, 0xf9, 0x0c, 0x00, 0x9d, 0xf9, 0x21, 0x10, + 0x09, 0x18, 0x49, 0x42, 0x8d, 0xf8, 0x0d, 0x10, 0x1f, 0xe0, 0x9d, 0xf9, + 0x0c, 0x20, 0x23, 0x46, 0x31, 0x46, 0x04, 0xa8, 0xff, 0xf7, 0x03, 0xff, + 0xb1, 0x7a, 0x91, 0xea, 0x07, 0x0f, 0x00, 0xf0, 0xc9, 0x80, 0x9d, 0xf9, + 0x20, 0x00, 0x9d, 0xf8, 0x0c, 0x10, 0x40, 0x1a, 0x8d, 0xf8, 0x0e, 0x00, + 0x70, 0x7a, 0x02, 0x28, 0x09, 0xd1, 0xb0, 0x7a, 0x00, 0x28, 0xdd, 0xd0, + 0x9d, 0xf9, 0x21, 0x00, 0x9d, 0xf8, 0x0c, 0x10, 0x40, 0x1a, 0x8d, 0xf8, + 0x0d, 0x00, 0x42, 0x46, 0x9d, 0xf9, 0x0e, 0x10, 0x58, 0x46, 0xec, 0xf7, + 0x7d, 0xfe, 0x70, 0x7a, 0x02, 0x28, 0x05, 0xd1, 0x9d, 0xf9, 0x0d, 0x10, + 0x42, 0x46, 0x58, 0x46, 0xec, 0xf7, 0xa5, 0xfe, 0x58, 0x46, 0xed, 0xf7, + 0x28, 0xf8, 0x64, 0x10, 0x9c, 0xb3, 0x58, 0x46, 0xec, 0xf7, 0x23, 0xfe, + 0x00, 0xf0, 0xb6, 0xf8, 0xbd, 0xf8, 0x26, 0x00, 0xbd, 0xf8, 0x24, 0x10, + 0xbd, 0xf8, 0x28, 0x20, 0x04, 0x90, 0x06, 0x91, 0x07, 0x92, 0xba, 0xf1, + 0x01, 0x0f, 0xbd, 0xf8, 0x2a, 0x00, 0x05, 0x90, 0x33, 0x88, 0x40, 0xf0, + 0x84, 0x80, 0xd6, 0xf8, 0x04, 0xc0, 0x8c, 0x45, 0x24, 0xbf, 0x04, 0x99, + 0xb1, 0xeb, 0x93, 0x0f, 0x02, 0xd2, 0x31, 0x7a, 0x8c, 0x42, 0x01, 0xd0, + 0x00, 0x21, 0x00, 0xe0, 0x01, 0x21, 0x94, 0x45, 0x28, 0xbf, 0xb0, 0xeb, + 0x93, 0x0f, 0x05, 0xd2, 0x30, 0x7a, 0x84, 0x42, 0x04, 0xbf, 0x72, 0x7a, + 0x02, 0x2a, 0x01, 0xd0, 0x00, 0x29, 0x9a, 0xd0, 0x00, 0x21, 0xad, 0xf8, + 0x20, 0x10, 0x58, 0x46, 0xec, 0xf7, 0xef, 0xfd, 0x00, 0xf0, 0x82, 0xf8, + 0xbd, 0xf8, 0x26, 0x00, 0x04, 0x90, 0x3b, 0x46, 0xbd, 0xf8, 0x2a, 0x00, + 0x05, 0x90, 0x52, 0x46, 0xbd, 0xf8, 0x24, 0x00, 0x06, 0x90, 0x31, 0x46, + 0xbd, 0xf8, 0x28, 0x00, 0x07, 0x90, 0x04, 0xa8, 0xff, 0xf7, 0xe2, 0xfe, + 0x01, 0x2d, 0x07, 0xd1, 0x00, 0x21, 0x58, 0x46, 0xec, 0xf7, 0xeb, 0xff, + 0x49, 0x46, 0x58, 0x46, 0xec, 0xf7, 0xeb, 0xff, 0x9d, 0xf9, 0x0c, 0x20, + 0x01, 0x2f, 0x04, 0xbf, 0x70, 0x7a, 0x01, 0x28, 0xc2, 0xf1, 0x3f, 0x01, + 0x06, 0xd1, 0x9d, 0xf8, 0x20, 0x40, 0xcb, 0xb2, 0xa3, 0x42, 0x2b, 0xd2, + 0x8d, 0xf8, 0x20, 0x10, 0x70, 0x7a, 0x02, 0x28, 0x12, 0xd1, 0xb0, 0x7a, + 0x01, 0x28, 0x12, 0xd1, 0x9d, 0xf8, 0x20, 0x40, 0xcb, 0xb2, 0xa3, 0x42, + 0x38, 0xbf, 0x8d, 0xf8, 0x20, 0x10, 0x02, 0xf1, 0x3f, 0x00, 0x9d, 0xf8, + 0x21, 0x40, 0xc3, 0xb2, 0xa3, 0x42, 0x38, 0xbf, 0x8d, 0xf8, 0x21, 0x00, + 0x70, 0x7a, 0x02, 0x28, 0x10, 0xd1, 0xb0, 0x7a, 0x70, 0xb9, 0x3f, 0x32, + 0x9d, 0xf8, 0x20, 0x00, 0xd3, 0xb2, 0x83, 0x42, 0x38, 0xbf, 0x8d, 0xf8, + 0x20, 0x20, 0x9d, 0xf8, 0x21, 0x20, 0xc8, 0xb2, 0x90, 0x42, 0x38, 0xbf, + 0x8d, 0xf8, 0x21, 0x10, 0x9d, 0xf8, 0x20, 0x20, 0x14, 0x99, 0xba, 0xf1, + 0x02, 0x0f, 0x14, 0xd0, 0x0a, 0x70, 0x9d, 0xf8, 0x21, 0x00, 0x48, 0x70, + 0x17, 0xe0, 0x3b, 0x46, 0x22, 0x46, 0x31, 0x46, 0x04, 0xa8, 0xff, 0xf7, + 0x67, 0xfe, 0x31, 0xe7, 0x9d, 0xf9, 0x0c, 0x00, 0x9d, 0xf9, 0x20, 0x10, + 0x09, 0x18, 0x49, 0x42, 0x8d, 0xf8, 0x0e, 0x10, 0x34, 0xe7, 0x08, 0x78, + 0x12, 0x1a, 0x8a, 0x70, 0x48, 0x78, 0x9d, 0xf8, 0x21, 0x20, 0x12, 0x1a, + 0xca, 0x70, 0x0b, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x9d, 0xf8, 0x0c, 0x10, + 0x08, 0x18, 0x40, 0xb2, 0xdf, 0xf7, 0xba, 0xbc, 0x00, 0x22, 0x09, 0xa9, + 0x58, 0x46, 0xec, 0xf7, 0x45, 0xbf, 0x2d, 0xe9, 0xf8, 0x4f, 0x84, 0xb0, + 0x82, 0x46, 0x9d, 0xf9, 0x40, 0x70, 0x0e, 0x46, 0x93, 0x46, 0x99, 0x46, + 0xec, 0xf7, 0x6c, 0xfe, 0xb9, 0xf1, 0x01, 0x0f, 0x4f, 0xf0, 0x00, 0x08, + 0x08, 0xd1, 0x00, 0x97, 0x01, 0x23, 0x43, 0xf6, 0xff, 0x72, 0x06, 0x21, + 0x50, 0x46, 0xdf, 0xf7, 0xf1, 0xfc, 0x80, 0x46, 0x0e, 0x9c, 0x00, 0x21, + 0x8d, 0xf8, 0x0c, 0x10, 0xad, 0xf8, 0x0e, 0x10, 0x04, 0xb1, 0x21, 0x70, + 0x00, 0x2e, 0x4c, 0xd0, 0x0f, 0x9d, 0x01, 0x2d, 0x33, 0x46, 0x02, 0xd1, + 0x0b, 0x2e, 0x28, 0xbf, 0x0a, 0x23, 0x2a, 0x46, 0x59, 0x46, 0x50, 0x46, + 0x00, 0xf0, 0x44, 0xf9, 0x8d, 0xf8, 0x3c, 0x50, 0x0a, 0x21, 0x11, 0xfb, + 0x06, 0xf6, 0x05, 0x46, 0x8d, 0xf8, 0x0d, 0x90, 0x9d, 0xf8, 0x0d, 0x10, + 0x01, 0x29, 0x0d, 0xd1, 0x9d, 0xf8, 0x3c, 0x00, 0x01, 0x90, 0x0d, 0xf1, + 0x0e, 0x01, 0x00, 0x91, 0x02, 0x97, 0x03, 0xab, 0x5a, 0x46, 0x41, 0x46, + 0x50, 0x46, 0x00, 0xf0, 0x9f, 0xfa, 0x0c, 0xe0, 0xe8, 0xb2, 0xff, 0xf7, + 0xe7, 0xfc, 0xf2, 0xee, 0x04, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xbd, 0xee, + 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0xad, 0xf8, 0x0e, 0x00, 0x71, 0x1d, + 0xbd, 0xf9, 0x0e, 0x00, 0x81, 0x42, 0x07, 0xda, 0x01, 0x23, 0x00, 0x22, + 0x59, 0x46, 0x50, 0x46, 0x00, 0xf0, 0x1d, 0xf9, 0x6d, 0x1e, 0x09, 0xe0, + 0x71, 0x1f, 0x88, 0x42, 0x0e, 0xda, 0x02, 0x23, 0x01, 0x22, 0x59, 0x46, + 0x50, 0x46, 0x00, 0xf0, 0x12, 0xf9, 0xad, 0x1c, 0xe8, 0xb2, 0x21, 0x28, + 0xc6, 0xdb, 0xbd, 0xf9, 0x0e, 0x00, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x00, 0x2c, 0xf8, 0xd0, 0x25, 0x70, 0xf6, 0xe7, 0x2d, 0xe9, 0xf0, 0x4f, + 0x90, 0x46, 0x89, 0x46, 0x87, 0xb0, 0x98, 0xf9, 0x0c, 0x10, 0x11, 0x9d, + 0x8d, 0xf8, 0x0d, 0x10, 0x1e, 0x46, 0x00, 0x24, 0x01, 0x2d, 0x71, 0x78, + 0x37, 0x78, 0x08, 0xbf, 0xa1, 0x46, 0x8f, 0x42, 0x28, 0xbf, 0x0f, 0x46, + 0x27, 0xb9, 0x00, 0x20, 0xb0, 0x70, 0xf7, 0x70, 0x30, 0x71, 0x6c, 0xe0, + 0x12, 0x99, 0x8d, 0xf8, 0x0c, 0x00, 0x01, 0x29, 0x13, 0xd1, 0x04, 0xa8, + 0x01, 0x90, 0x02, 0x95, 0x05, 0xa8, 0x00, 0x90, 0x06, 0xab, 0x9d, 0xf8, + 0x0c, 0x00, 0x49, 0x46, 0x00, 0xf0, 0x6d, 0xf8, 0x9d, 0xf8, 0x10, 0x00, + 0xf0, 0x70, 0x9d, 0xf8, 0x11, 0x00, 0xb0, 0x72, 0x9d, 0xf8, 0x12, 0x00, + 0xf0, 0x72, 0xbb, 0x46, 0x9d, 0xf9, 0x0d, 0x10, 0xdd, 0xf8, 0x40, 0xa0, + 0x02, 0x91, 0x0a, 0x20, 0x01, 0x95, 0x00, 0x94, 0x53, 0x46, 0x01, 0x22, + 0x39, 0x46, 0x10, 0xfb, 0x0b, 0xfb, 0x9d, 0xf8, 0x0c, 0x00, 0xff, 0xf7, + 0x42, 0xff, 0xab, 0xf1, 0x05, 0x0b, 0x58, 0x45, 0xb8, 0xbf, 0x02, 0x24, + 0x0a, 0xdb, 0x00, 0xf0, 0x3f, 0xf8, 0x9d, 0xf8, 0x10, 0x00, 0x30, 0x71, + 0x9d, 0xf8, 0x11, 0x00, 0x30, 0x73, 0x9d, 0xf8, 0x12, 0x00, 0x70, 0x73, + 0x9d, 0xf8, 0x0c, 0x00, 0xec, 0xf7, 0xa4, 0xfd, 0x9d, 0xf9, 0x0d, 0x00, + 0x02, 0x90, 0x00, 0x21, 0x00, 0x91, 0x01, 0x95, 0x53, 0x46, 0x9d, 0xf8, + 0x0c, 0x00, 0x00, 0x22, 0x39, 0x46, 0xff, 0xf7, 0x20, 0xff, 0x58, 0x45, + 0xb8, 0xbf, 0x44, 0xf0, 0x01, 0x04, 0x0a, 0xdb, 0x00, 0xf0, 0x1e, 0xf8, + 0x9d, 0xf8, 0x10, 0x00, 0xb0, 0x70, 0x9d, 0xf8, 0x11, 0x00, 0x30, 0x72, + 0x9d, 0xf8, 0x12, 0x00, 0x70, 0x72, 0x9d, 0xf8, 0x0c, 0x00, 0xec, 0xf7, + 0x83, 0xfd, 0x4c, 0xb9, 0x31, 0x79, 0xb2, 0x78, 0xf0, 0x78, 0x52, 0x18, + 0x12, 0x04, 0x00, 0xeb, 0x52, 0x40, 0x17, 0xfb, 0x00, 0xf0, 0x00, 0xe0, + 0x00, 0x20, 0xf0, 0x80, 0x07, 0xb0, 0x20, 0x46, 0xbd, 0xe8, 0xf0, 0x8f, + 0x04, 0xa8, 0x01, 0x90, 0x05, 0xa9, 0x00, 0x91, 0x02, 0x95, 0x06, 0xab, + 0x9d, 0xf8, 0x0c, 0x00, 0x42, 0x46, 0x49, 0x46, 0xff, 0xe7, 0x2d, 0xe9, + 0xf8, 0x43, 0x86, 0xb0, 0x88, 0x46, 0x10, 0x9c, 0x81, 0x46, 0x17, 0x46, + 0x1e, 0x46, 0x03, 0xa9, 0xec, 0xf7, 0x1c, 0xfe, 0x02, 0xaa, 0x41, 0x46, + 0x48, 0x46, 0xec, 0xf7, 0x1b, 0xfe, 0x01, 0x2c, 0x04, 0xbf, 0x48, 0x46, + 0xec, 0xf7, 0x53, 0xfe, 0x0e, 0x9d, 0x01, 0x20, 0xb8, 0x72, 0x01, 0x94, + 0x00, 0x96, 0x00, 0xf0, 0x42, 0xf8, 0x00, 0x20, 0xb8, 0x72, 0x01, 0x94, + 0x00, 0x95, 0x00, 0xf0, 0x3c, 0xf8, 0x02, 0xaa, 0x41, 0x46, 0x48, 0x46, + 0xec, 0xf7, 0x06, 0xfe, 0x03, 0xa9, 0x48, 0x46, 0xec, 0xf7, 0xfe, 0xfd, + 0x01, 0x2c, 0x04, 0xbf, 0x48, 0x46, 0xec, 0xf7, 0x3a, 0xfe, 0x30, 0x78, + 0x2a, 0x78, 0x0f, 0x99, 0x82, 0x42, 0x2c, 0xbf, 0x08, 0x70, 0x0a, 0x70, + 0x01, 0x2c, 0x10, 0xd1, 0x68, 0x78, 0x32, 0x78, 0x90, 0x42, 0x39, 0xbf, + 0x08, 0x70, 0x48, 0x70, 0x0a, 0x70, 0x4a, 0x70, 0x28, 0x78, 0x72, 0x78, + 0x90, 0x42, 0x0e, 0xd3, 0x0b, 0x78, 0x70, 0x78, 0xc3, 0x18, 0x0b, 0x70, + 0x0c, 0xe0, 0x08, 0x78, 0x48, 0x70, 0x02, 0x2c, 0x08, 0xd1, 0x6a, 0x78, + 0x73, 0x78, 0x9a, 0x42, 0xf2, 0xd2, 0x10, 0x18, 0x01, 0xe0, 0x0a, 0x78, + 0x80, 0x18, 0x08, 0x70, 0x0b, 0x78, 0x48, 0x78, 0x1b, 0x1a, 0x8b, 0x70, + 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x83, 0x01, 0x23, 0x3a, 0x46, 0x41, 0x46, + 0x48, 0x46, 0x2d, 0xe5, 0x10, 0xb5, 0x1c, 0x46, 0x01, 0x2a, 0x08, 0xbf, + 0x64, 0x00, 0xe3, 0xb2, 0x01, 0x22, 0x00, 0xf0, 0x02, 0xf8, 0xe0, 0xb2, + 0x10, 0xbd, 0x10, 0xb5, 0x04, 0x46, 0x08, 0x00, 0x11, 0x46, 0x1a, 0x46, + 0x20, 0x46, 0x02, 0xd0, 0xec, 0xf7, 0xde, 0xfc, 0x01, 0xe0, 0xec, 0xf7, + 0xce, 0xfc, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0xec, 0xf7, 0xd7, 0xbd, + 0x38, 0xb5, 0x15, 0x46, 0x91, 0xf9, 0x00, 0x10, 0x04, 0x46, 0x01, 0x22, + 0xec, 0xf7, 0x18, 0xfc, 0x95, 0xf9, 0x00, 0x10, 0x20, 0x46, 0xbd, 0xe8, + 0x38, 0x40, 0x01, 0x22, 0xec, 0xf7, 0x41, 0xbc, 0x70, 0xb5, 0x0d, 0x46, + 0x04, 0x46, 0x95, 0xf9, 0x14, 0x10, 0x16, 0x46, 0xec, 0xf7, 0x08, 0xfc, + 0x95, 0xf9, 0x14, 0x10, 0x32, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0x70, 0x40, + 0xec, 0xf7, 0x31, 0xbc, 0x24, 0x31, 0x7c, 0xb5, 0x00, 0x23, 0x00, 0x24, + 0xdd, 0xb2, 0x5b, 0x1c, 0x0d, 0x44, 0xde, 0xb2, 0x08, 0x2e, 0x2c, 0x73, + 0xf8, 0xd3, 0x13, 0x78, 0x0b, 0x70, 0x54, 0x78, 0x4c, 0x70, 0x93, 0x78, + 0x8b, 0x70, 0xd2, 0x78, 0xca, 0x70, 0x8d, 0xf8, 0x07, 0x00, 0x00, 0x20, + 0x00, 0x90, 0xad, 0xf8, 0x04, 0x00, 0x8d, 0xf8, 0x06, 0x00, 0x68, 0x46, + 0xec, 0xf7, 0x66, 0xfe, 0x01, 0x21, 0x8d, 0xf8, 0x06, 0x10, 0x68, 0x46, + 0xec, 0xf7, 0x60, 0xfe, 0x73, 0xbd, 0x1c, 0xb5, 0x04, 0x46, 0x48, 0x89, + 0xad, 0xf8, 0x00, 0x00, 0x68, 0x46, 0x49, 0x89, 0x00, 0xf0, 0x04, 0xf9, + 0x00, 0x22, 0x06, 0x21, 0x20, 0x46, 0xec, 0xf7, 0x7e, 0xfd, 0x01, 0x22, + 0xe4, 0x21, 0x00, 0xf0, 0x0d, 0xf8, 0x02, 0x22, 0xe0, 0x21, 0x00, 0xf0, + 0x09, 0xf8, 0x04, 0x22, 0xe1, 0x21, 0x00, 0xf0, 0x05, 0xf8, 0x08, 0x22, + 0xe5, 0x21, 0x00, 0xf0, 0x01, 0xf8, 0x13, 0xbd, 0x20, 0x46, 0xec, 0xf7, + 0x57, 0xbd, 0x1c, 0xb5, 0x91, 0xf9, 0x0c, 0x40, 0x53, 0x7b, 0xe4, 0x1a, + 0x8d, 0xf8, 0x01, 0x40, 0x92, 0xf9, 0x0d, 0x20, 0x91, 0xf9, 0x0d, 0x30, + 0x52, 0x42, 0xd2, 0x1a, 0x8d, 0xf8, 0x00, 0x20, 0x0d, 0xf1, 0x01, 0x01, + 0x6a, 0x46, 0xff, 0xf7, 0x85, 0xff, 0x13, 0xbd, 0x80, 0xb5, 0x00, 0x93, + 0x13, 0x46, 0x01, 0x22, 0x03, 0xe0, 0x80, 0xb5, 0x00, 0x93, 0x13, 0x46, + 0x00, 0x22, 0x00, 0xf0, 0x01, 0xf8, 0x01, 0xbd, 0x2d, 0xe9, 0xfe, 0x43, + 0x81, 0x46, 0x0d, 0x46, 0x0a, 0x9e, 0x00, 0x20, 0x28, 0x70, 0x98, 0x46, + 0x14, 0x46, 0x41, 0x46, 0x48, 0x46, 0xdf, 0xf7, 0x3b, 0xfc, 0x00, 0x27, + 0x0a, 0xe0, 0x41, 0x46, 0x48, 0x46, 0xdf, 0xf7, 0x42, 0xfc, 0x28, 0x78, + 0x30, 0x18, 0x28, 0x70, 0x00, 0xe0, 0x76, 0x1e, 0x47, 0xfa, 0x86, 0xf7, + 0x78, 0xb2, 0x20, 0x28, 0x23, 0xda, 0xf3, 0xb2, 0x01, 0x22, 0x21, 0x46, + 0x48, 0x46, 0xff, 0xf7, 0x44, 0xff, 0x48, 0x46, 0xec, 0xf7, 0x29, 0xfb, + 0x69, 0x46, 0x48, 0x46, 0xec, 0xf7, 0x02, 0xfd, 0xbd, 0xf8, 0x00, 0x00, + 0xbd, 0xf8, 0x02, 0x10, 0xbd, 0xf8, 0x04, 0x20, 0x08, 0x18, 0xbd, 0xf8, + 0x06, 0x10, 0x10, 0x18, 0x08, 0x18, 0x80, 0xb2, 0x00, 0x28, 0xd6, 0xd0, + 0xf3, 0xb2, 0x00, 0x22, 0x21, 0x46, 0x48, 0x46, 0xff, 0xf7, 0x29, 0xff, + 0xf0, 0xb2, 0x02, 0x28, 0xd5, 0xd2, 0xbd, 0xe8, 0xf7, 0x83, 0xf0, 0xb5, + 0x05, 0x98, 0x06, 0x9c, 0x92, 0xf9, 0x0e, 0x60, 0x27, 0x56, 0x07, 0x9d, + 0x09, 0x99, 0xbe, 0x42, 0xa4, 0xbf, 0x2f, 0x56, 0xbe, 0x42, 0x09, 0xda, + 0x56, 0x69, 0xb7, 0x04, 0x33, 0xd4, 0x03, 0xf1, 0xb3, 0x06, 0x37, 0x78, + 0x36, 0x79, 0x3e, 0x44, 0x02, 0x2e, 0x2c, 0xd2, 0x08, 0x98, 0x00, 0x24, + 0x0c, 0x70, 0x00, 0x28, 0x10, 0x7d, 0x0d, 0xd1, 0x81, 0x06, 0x08, 0xd4, + 0x93, 0xf8, 0x30, 0x00, 0x93, 0xf8, 0x31, 0x10, 0x41, 0x1a, 0x93, 0xf8, + 0x37, 0x00, 0x41, 0x18, 0x0f, 0xe0, 0x93, 0xf9, 0x24, 0x10, 0x0c, 0xe0, + 0x81, 0x06, 0x08, 0xd4, 0x93, 0xf8, 0x37, 0x40, 0x93, 0xf8, 0x31, 0x00, + 0x93, 0xf8, 0x30, 0x10, 0x24, 0x1a, 0x61, 0x1a, 0x01, 0xe0, 0x93, 0xf9, + 0x27, 0x10, 0x50, 0x69, 0x44, 0x04, 0x19, 0xd4, 0x93, 0xf9, 0x14, 0x00, + 0x4d, 0xb2, 0x85, 0x42, 0x12, 0xdb, 0x49, 0xb2, 0x88, 0x42, 0x12, 0xda, + 0x07, 0xe0, 0x01, 0x26, 0x0e, 0x70, 0x29, 0x5c, 0x20, 0x5c, 0x08, 0x1a, + 0x40, 0xb2, 0x02, 0x28, 0x03, 0xdb, 0x18, 0x7d, 0x40, 0x1c, 0x18, 0x75, + 0x05, 0xe0, 0x10, 0xf1, 0x01, 0x0f, 0x02, 0xda, 0x18, 0x7d, 0x41, 0x1e, + 0x19, 0x75, 0x50, 0x7c, 0x01, 0x06, 0x07, 0xd4, 0x92, 0xf9, 0x12, 0x00, + 0x93, 0xf9, 0x14, 0x10, 0x88, 0x42, 0xb8, 0xbf, 0x08, 0x46, 0x18, 0x75, + 0xf0, 0xbd, 0x90, 0xf9, 0x14, 0x20, 0x91, 0xf9, 0x0f, 0x10, 0x91, 0x42, + 0xa6, 0xbf, 0x49, 0x42, 0x8a, 0x42, 0x01, 0x75, 0x70, 0x47, 0x3e, 0xb5, + 0x0d, 0x46, 0x04, 0x46, 0x01, 0x22, 0x94, 0x21, 0xec, 0xf7, 0x80, 0xfc, + 0x02, 0x22, 0x95, 0x21, 0xff, 0xf7, 0x22, 0xff, 0x04, 0x22, 0x84, 0x21, + 0xff, 0xf7, 0x1e, 0xff, 0x08, 0x22, 0x85, 0x21, 0xff, 0xf7, 0x1a, 0xff, + 0xa8, 0x88, 0xad, 0xf8, 0x00, 0x00, 0x68, 0x46, 0x69, 0x88, 0x00, 0xf0, + 0x01, 0xf8, 0x37, 0xbd, 0xad, 0xf8, 0x02, 0x10, 0x8d, 0xf8, 0x04, 0x40, + 0xec, 0xf7, 0x2e, 0xba, 0xf0, 0xb5, 0x85, 0xb0, 0x06, 0x27, 0x01, 0x92, + 0x02, 0x93, 0x0b, 0x9c, 0x9d, 0xf9, 0x30, 0x50, 0x0a, 0x9e, 0x04, 0x95, + 0x0a, 0x46, 0x03, 0x96, 0x00, 0x97, 0x43, 0xf6, 0xff, 0x73, 0x21, 0x46, + 0xdf, 0xf7, 0x70, 0xfa, 0x05, 0xb0, 0xf0, 0xbd, 0x2d, 0xe9, 0xfe, 0x4f, + 0x83, 0x46, 0x0e, 0x46, 0x17, 0x46, 0x1c, 0x46, 0xec, 0xf7, 0x74, 0xfb, + 0x01, 0x2c, 0x4f, 0xf0, 0x00, 0x08, 0x09, 0xd1, 0x04, 0x20, 0x00, 0x90, + 0x01, 0x23, 0x43, 0xf6, 0xff, 0x72, 0x06, 0x21, 0x58, 0x46, 0xdf, 0xf7, + 0xf9, 0xf9, 0x80, 0x46, 0xdd, 0xf8, 0x38, 0x90, 0xdd, 0xf8, 0x34, 0xa0, + 0x00, 0x20, 0x38, 0x70, 0x4b, 0x46, 0x52, 0x46, 0x39, 0x46, 0x58, 0x46, + 0xff, 0xf7, 0xee, 0xfe, 0x0c, 0x9d, 0x01, 0x2c, 0x08, 0xd1, 0x00, 0xf0, + 0x2e, 0xf8, 0x3b, 0x46, 0x01, 0x22, 0x41, 0x46, 0x58, 0x46, 0xff, 0xf7, + 0xbf, 0xff, 0x05, 0xe0, 0x38, 0x78, 0xff, 0xf7, 0x07, 0xfa, 0x00, 0xf0, + 0x28, 0xf8, 0x39, 0x70, 0x58, 0x46, 0xec, 0xf7, 0x45, 0xfb, 0x00, 0x20, + 0x30, 0x70, 0x4b, 0x46, 0x52, 0x46, 0x31, 0x46, 0x58, 0x46, 0xff, 0xf7, + 0xd6, 0xfe, 0x01, 0x2c, 0x08, 0xd1, 0x00, 0xf0, 0x12, 0xf8, 0x33, 0x46, + 0x00, 0x22, 0x41, 0x46, 0x58, 0x46, 0xff, 0xf7, 0xa3, 0xff, 0x05, 0xe0, + 0x30, 0x78, 0xff, 0xf7, 0xeb, 0xf9, 0x00, 0xf0, 0x0c, 0xf8, 0x31, 0x70, + 0x58, 0x46, 0xbd, 0xe8, 0xfe, 0x4f, 0xec, 0xf7, 0x27, 0xbb, 0x04, 0x20, + 0x00, 0x21, 0x02, 0x90, 0x00, 0x91, 0x01, 0x95, 0x70, 0x47, 0xf6, 0xee, + 0x00, 0x0a, 0x30, 0xee, 0x20, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, + 0x10, 0x1a, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, 0x9a, 0x46, 0x88, 0xb0, + 0x89, 0x46, 0x9a, 0xf8, 0x00, 0x10, 0x18, 0x9c, 0xdd, 0xf8, 0x58, 0x80, + 0x8d, 0xf8, 0x18, 0x10, 0xd9, 0xf8, 0x14, 0x30, 0x13, 0x9e, 0x12, 0x9f, + 0x07, 0x92, 0x59, 0x00, 0x4c, 0xbf, 0x02, 0x25, 0x01, 0x25, 0x83, 0x46, + 0x01, 0x22, 0x04, 0x21, 0xec, 0xf7, 0xd0, 0xfb, 0x01, 0x22, 0x04, 0x21, + 0x58, 0x46, 0xec, 0xf7, 0xcd, 0xfb, 0x49, 0x46, 0x58, 0x46, 0xff, 0xf7, + 0x52, 0xfe, 0x07, 0x98, 0x00, 0xf1, 0x24, 0x02, 0x49, 0x46, 0x58, 0x46, + 0xff, 0xf7, 0x6d, 0xfe, 0x01, 0x20, 0xdf, 0xf7, 0xc0, 0xf9, 0x9d, 0xf8, + 0x18, 0x00, 0x02, 0x95, 0x02, 0x23, 0x07, 0x99, 0x00, 0x93, 0x01, 0xf1, + 0xb0, 0x02, 0x01, 0x92, 0x39, 0x18, 0x32, 0x18, 0x43, 0x46, 0x58, 0x46, + 0xff, 0xf7, 0x60, 0xff, 0x15, 0x98, 0x01, 0x2c, 0x24, 0xd1, 0x04, 0x90, + 0xcd, 0xf8, 0x14, 0x80, 0x4a, 0x46, 0x9d, 0xf8, 0x50, 0x00, 0x17, 0x9c, + 0x03, 0x90, 0x02, 0x96, 0x01, 0x97, 0x58, 0x46, 0x9d, 0xf8, 0x18, 0x10, + 0x07, 0x9b, 0x00, 0x91, 0x21, 0x46, 0xff, 0xf7, 0xaa, 0xfe, 0x07, 0x98, + 0x49, 0x46, 0xff, 0xf7, 0x08, 0xff, 0x07, 0x99, 0x22, 0x46, 0x58, 0x46, + 0xff, 0xf7, 0xe6, 0xfd, 0x99, 0xf8, 0x10, 0x10, 0x06, 0xa8, 0xdf, 0xf7, + 0xd4, 0xfb, 0x9d, 0xf8, 0x18, 0x00, 0x8a, 0xf8, 0x00, 0x00, 0x0d, 0xe0, + 0x9d, 0xf8, 0x18, 0x20, 0x99, 0xf9, 0x0e, 0x10, 0xbb, 0x56, 0x99, 0x42, + 0xa4, 0xbf, 0xb2, 0x56, 0x91, 0x42, 0xa7, 0xbf, 0x00, 0x21, 0x01, 0x70, + 0x01, 0x22, 0x02, 0x70, 0x09, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0x00, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, + 0x0d, 0xf8, 0x01, 0x70, 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, + 0x72, 0xb6, 0x05, 0x68, 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, + 0x29, 0x43, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x43, 0x80, 0x46, 0x00, 0x24, + 0x00, 0x26, 0x00, 0x27, 0x00, 0x25, 0x6c, 0x20, 0x68, 0x43, 0x00, 0xf0, + 0x2f, 0xf8, 0x28, 0xb1, 0x99, 0xf8, 0x0b, 0x00, 0x00, 0xea, 0x06, 0x01, + 0x0f, 0x43, 0x06, 0x43, 0x6d, 0x1c, 0x03, 0x2d, 0xf1, 0xdb, 0xff, 0xb2, + 0x0f, 0xb1, 0x4b, 0xf6, 0x01, 0x04, 0x1c, 0xe0, 0x2d, 0xe9, 0xf8, 0x43, + 0x80, 0x46, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x6c, 0x20, + 0x78, 0x43, 0x00, 0xf0, 0x15, 0xf8, 0x28, 0xb1, 0x99, 0xf8, 0x10, 0x00, + 0x6d, 0x1c, 0x03, 0x28, 0x08, 0xbf, 0x76, 0x1c, 0x7f, 0x1c, 0x03, 0x2f, + 0xf1, 0xdb, 0xf0, 0xb2, 0x00, 0x28, 0x1f, 0xbf, 0xf6, 0xb2, 0xed, 0xb2, + 0xae, 0x42, 0x4b, 0xf6, 0x06, 0x04, 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x83, + 0x08, 0xeb, 0x00, 0x09, 0x48, 0x46, 0x65, 0xe3, 0x00, 0x23, 0x07, 0x22, + 0x00, 0x21, 0xdf, 0xf8, 0x18, 0x07, 0xaa, 0xe7, 0x2d, 0xe9, 0xf8, 0x4f, + 0x8e, 0xb0, 0x06, 0x46, 0x1c, 0x46, 0x00, 0x20, 0x8d, 0xf8, 0x04, 0x00, + 0x89, 0x46, 0x94, 0xf8, 0xc7, 0x37, 0xdf, 0xf8, 0xfc, 0x06, 0x4f, 0xf4, + 0x40, 0x32, 0x10, 0x21, 0xff, 0xf7, 0x99, 0xff, 0x24, 0x22, 0x00, 0x21, + 0x05, 0xa8, 0xde, 0xf7, 0xe9, 0xff, 0x4f, 0xf0, 0x00, 0x08, 0x00, 0x25, + 0x4f, 0xf0, 0x07, 0x0a, 0x00, 0x27, 0x6c, 0x20, 0x78, 0x43, 0x09, 0xeb, + 0x00, 0x0b, 0x58, 0x46, 0x00, 0xf0, 0x3c, 0xfb, 0x98, 0xb1, 0x4f, 0xf4, + 0xc2, 0x71, 0x04, 0xf5, 0xc0, 0x70, 0x79, 0x43, 0x42, 0x5c, 0xdb, 0xf8, + 0x5d, 0x10, 0x01, 0x2a, 0x08, 0xbf, 0x89, 0x00, 0x0c, 0x22, 0x05, 0xa8, + 0x7a, 0x43, 0x83, 0x18, 0x00, 0x22, 0x30, 0x46, 0xef, 0xf7, 0x16, 0xfd, + 0x80, 0x46, 0x7f, 0x1c, 0x03, 0x2f, 0x02, 0xda, 0xb8, 0xf1, 0x00, 0x0f, + 0xdd, 0xd0, 0xb8, 0xf1, 0x00, 0x0f, 0x04, 0x94, 0x43, 0xd1, 0x05, 0x9b, + 0x07, 0x22, 0x00, 0x21, 0x00, 0xf0, 0xf1, 0xfa, 0x05, 0xac, 0x70, 0x22, + 0xe3, 0x68, 0x04, 0x21, 0x00, 0xf0, 0xeb, 0xfa, 0xa3, 0x69, 0x4f, 0xf4, + 0xe0, 0x62, 0x08, 0x21, 0x00, 0xf0, 0xe5, 0xfa, 0x04, 0x9c, 0x00, 0x26, + 0xb0, 0x00, 0x00, 0xf1, 0x90, 0x40, 0x00, 0xf1, 0x08, 0x0b, 0xa0, 0x19, + 0x00, 0xf2, 0xaf, 0x77, 0x4f, 0xf4, 0x80, 0x72, 0x3b, 0x78, 0x08, 0x21, + 0x00, 0xf0, 0xde, 0xfa, 0x3b, 0x7a, 0x70, 0x22, 0x04, 0x21, 0x00, 0xf0, + 0xd9, 0xfa, 0x3b, 0x7c, 0x07, 0x22, 0x00, 0x21, 0x00, 0xf0, 0xd4, 0xfa, + 0x38, 0x78, 0x20, 0xb1, 0x38, 0x7c, 0x01, 0x25, 0x50, 0x45, 0x38, 0xbf, + 0x82, 0x46, 0x76, 0x1c, 0x08, 0x2e, 0xdd, 0xd3, 0x2b, 0x46, 0xdf, 0xf8, + 0x24, 0x56, 0x04, 0x94, 0x08, 0x22, 0x03, 0x21, 0x28, 0x46, 0xff, 0xf7, + 0x21, 0xff, 0x53, 0x46, 0x07, 0x22, 0x00, 0x21, 0x28, 0x46, 0xff, 0xf7, + 0x1b, 0xff, 0xb8, 0xf1, 0x00, 0x0f, 0x40, 0xf0, 0xa2, 0x82, 0xcd, 0xf8, + 0x08, 0x90, 0x00, 0x25, 0xaa, 0x46, 0x00, 0x24, 0x00, 0x26, 0xa9, 0x46, + 0x02, 0x98, 0x6c, 0x21, 0x71, 0x43, 0x47, 0x18, 0x38, 0x46, 0x00, 0xf0, + 0xc7, 0xfa, 0x60, 0xb3, 0xdf, 0xf8, 0xe4, 0x05, 0xf9, 0x7b, 0x50, 0xf8, + 0x26, 0xb0, 0x01, 0x29, 0x0c, 0xbf, 0x01, 0x23, 0x00, 0x23, 0x0b, 0xf5, + 0x8e, 0x60, 0x4f, 0xf0, 0x00, 0x72, 0x19, 0x21, 0xff, 0xf7, 0x01, 0xff, + 0x3b, 0x7c, 0x03, 0x2b, 0x3b, 0xd0, 0x4f, 0xf4, 0xe0, 0x22, 0x10, 0x21, + 0x0b, 0xf5, 0x40, 0x70, 0xff, 0xf7, 0xf7, 0xfe, 0x39, 0x7c, 0x01, 0x20, + 0x00, 0xfa, 0x01, 0xf1, 0x78, 0x7c, 0x0d, 0x43, 0x01, 0x28, 0x18, 0xbf, + 0x02, 0x28, 0x04, 0xd1, 0x01, 0x28, 0x41, 0xea, 0x09, 0x09, 0x08, 0xbf, + 0x0c, 0x43, 0xb8, 0x7c, 0x08, 0xb1, 0x41, 0xea, 0x0a, 0x0a, 0x76, 0x1c, + 0x03, 0x2e, 0xc7, 0xdb, 0x2e, 0x46, 0x5f, 0xfa, 0x89, 0xf5, 0x05, 0xb1, + 0x01, 0x25, 0xdf, 0xf8, 0x80, 0x75, 0x2b, 0x46, 0x40, 0x22, 0x06, 0x21, + 0x38, 0x46, 0xff, 0xf7, 0xcb, 0xfe, 0x5f, 0xfa, 0x8a, 0xf3, 0x38, 0x22, + 0x03, 0x21, 0x38, 0x46, 0xff, 0xf7, 0xc4, 0xfe, 0xdf, 0xf8, 0x64, 0xa5, + 0xf3, 0xb2, 0x07, 0x22, 0x00, 0x21, 0x50, 0x46, 0xff, 0xf7, 0xbc, 0xfe, + 0x1d, 0xb9, 0x07, 0x23, 0x08, 0xe0, 0x00, 0x26, 0xdf, 0xe7, 0xe3, 0xb2, + 0x38, 0x22, 0x03, 0x21, 0x50, 0x46, 0xff, 0xf7, 0xb1, 0xfe, 0x00, 0x23, + 0x07, 0x22, 0x00, 0x21, 0x38, 0x46, 0xff, 0xf7, 0xab, 0xfe, 0x00, 0x20, + 0x00, 0x90, 0x00, 0x9a, 0x02, 0x99, 0x6c, 0x20, 0x42, 0x43, 0x8d, 0x18, + 0x28, 0x46, 0x00, 0xf0, 0x5f, 0xfa, 0x00, 0x28, 0x00, 0xf0, 0xfb, 0x81, + 0x00, 0x98, 0x01, 0x21, 0x81, 0x40, 0x05, 0x91, 0x04, 0x99, 0x91, 0xf8, + 0xc7, 0x07, 0x05, 0x99, 0x08, 0x42, 0x02, 0xd1, 0x00, 0x98, 0x02, 0x28, + 0x4f, 0xd1, 0x00, 0x9f, 0xf8, 0xb2, 0x00, 0x28, 0x0c, 0xbf, 0x40, 0x24, + 0x20, 0x24, 0x00, 0x26, 0x1b, 0xe0, 0x08, 0xf5, 0x8c, 0x58, 0x00, 0xf0, + 0x14, 0xfa, 0x40, 0x46, 0xff, 0xf7, 0x8b, 0xfe, 0x4b, 0x46, 0x1f, 0x22, + 0x00, 0x21, 0x40, 0x46, 0x0c, 0xe0, 0x01, 0x28, 0xf1, 0xd1, 0x00, 0xf0, + 0x08, 0xfa, 0x08, 0xf5, 0x78, 0x60, 0xff, 0xf7, 0x7e, 0xfe, 0x4b, 0x46, + 0x3f, 0x22, 0x00, 0x21, 0x08, 0xf5, 0x88, 0x50, 0xff, 0xf7, 0x77, 0xfe, + 0x76, 0x1c, 0xa6, 0x42, 0x80, 0xf0, 0xa5, 0x80, 0xb0, 0x00, 0x00, 0xf1, + 0x90, 0x48, 0xa8, 0x19, 0xf9, 0xb2, 0x90, 0xf8, 0x1b, 0x90, 0x02, 0x29, + 0x09, 0xd1, 0xa9, 0xf1, 0x20, 0x09, 0xb9, 0xf1, 0x1f, 0x0f, 0x26, 0xbf, + 0x01, 0x23, 0x4f, 0xf0, 0x1f, 0x09, 0x00, 0x23, 0xcd, 0xe7, 0xb9, 0xf1, + 0x40, 0x0f, 0xa6, 0xbf, 0x01, 0x23, 0x4f, 0xf0, 0x3f, 0x09, 0x00, 0x23, + 0xf8, 0xb2, 0x00, 0x28, 0xcf, 0xd1, 0x00, 0xf0, 0xda, 0xf9, 0x08, 0xf5, + 0x20, 0x60, 0xff, 0xf7, 0x50, 0xfe, 0x4b, 0x46, 0x3f, 0x22, 0x00, 0x21, + 0x08, 0xf5, 0x50, 0x60, 0xd0, 0xe7, 0x80, 0x46, 0xdf, 0xf8, 0x60, 0x04, + 0x00, 0x68, 0x00, 0xf0, 0x03, 0x0a, 0x5f, 0xfa, 0x88, 0xf1, 0x42, 0x46, + 0x4f, 0xf4, 0xc2, 0x70, 0x00, 0x29, 0x04, 0x99, 0x0c, 0xbf, 0x4f, 0xf0, + 0xc0, 0x09, 0x4f, 0xf0, 0x60, 0x09, 0x42, 0x43, 0x88, 0x18, 0x00, 0x24, + 0x03, 0x90, 0x48, 0xe0, 0x07, 0xf5, 0x78, 0x6b, 0x00, 0xf0, 0xb5, 0xf9, + 0x00, 0xf0, 0xc4, 0xf9, 0x00, 0xf0, 0xbc, 0xf9, 0x07, 0xf5, 0x60, 0x67, + 0x73, 0x78, 0x1f, 0x22, 0x00, 0xf0, 0xc4, 0xf9, 0x73, 0x78, 0x4f, 0xf4, + 0x78, 0x72, 0x05, 0x21, 0x00, 0xf0, 0xbb, 0xf9, 0x73, 0x78, 0x4f, 0xf4, + 0xf8, 0x42, 0x0a, 0x21, 0x00, 0xf0, 0xb5, 0xf9, 0x73, 0x78, 0x4f, 0xf4, + 0x78, 0x22, 0x0f, 0x21, 0x00, 0xf0, 0xaf, 0xf9, 0x73, 0x78, 0x4f, 0xf0, + 0xf8, 0x72, 0x14, 0x21, 0x00, 0xf0, 0xa9, 0xf9, 0x73, 0x78, 0x4f, 0xf0, + 0x78, 0x52, 0x19, 0x21, 0x00, 0xf0, 0xa3, 0xf9, 0x73, 0x78, 0x1f, 0x22, + 0x00, 0x21, 0x00, 0xf0, 0x99, 0xf9, 0x73, 0x78, 0x4f, 0xf4, 0x78, 0x72, + 0x05, 0x21, 0x00, 0xf0, 0x93, 0xf9, 0x03, 0x99, 0x91, 0xf8, 0x80, 0x01, + 0x00, 0x28, 0x05, 0x98, 0x0c, 0xbf, 0x2a, 0xea, 0x00, 0x0a, 0x40, 0xea, + 0x0a, 0x0a, 0x53, 0x46, 0x03, 0x22, 0x00, 0x21, 0xdf, 0xf8, 0xac, 0x03, + 0xff, 0xf7, 0xeb, 0xfd, 0x64, 0x1c, 0x4c, 0x45, 0x19, 0xd2, 0x03, 0x98, + 0x00, 0xeb, 0x44, 0x06, 0x5f, 0xfa, 0x88, 0xf0, 0x71, 0x78, 0xa7, 0x00, + 0x20, 0x29, 0x9b, 0x41, 0xdb, 0x43, 0xdb, 0x0f, 0x00, 0x28, 0x07, 0xf1, + 0x90, 0x47, 0xa5, 0xd1, 0x07, 0xf5, 0x20, 0x6b, 0x00, 0xf0, 0x5b, 0xf9, + 0x00, 0xf0, 0x6a, 0xf9, 0x00, 0xf0, 0x62, 0xf9, 0x07, 0xf5, 0xe0, 0x67, + 0xa4, 0xe7, 0xd8, 0x48, 0x00, 0x99, 0x50, 0xf8, 0x21, 0x90, 0x4f, 0xf0, + 0x00, 0x0a, 0x05, 0xeb, 0x0a, 0x00, 0xc3, 0x7c, 0x08, 0x2b, 0x28, 0xbf, + 0x1f, 0x23, 0x09, 0xeb, 0x8a, 0x00, 0x1f, 0x22, 0x00, 0x21, 0x00, 0xf5, + 0x41, 0x70, 0xff, 0xf7, 0xba, 0xfd, 0x0a, 0xf1, 0x01, 0x0a, 0xba, 0xf1, + 0x08, 0x0f, 0xec, 0xd3, 0x18, 0x9e, 0x00, 0x24, 0x28, 0x19, 0xc0, 0x7c, + 0x08, 0x28, 0x0a, 0xd2, 0x06, 0xeb, 0xc4, 0x01, 0x09, 0xeb, 0x80, 0x00, + 0xcb, 0x78, 0x20, 0x22, 0x05, 0x21, 0x00, 0xf5, 0x41, 0x70, 0xff, 0xf7, + 0xa4, 0xfd, 0x64, 0x1c, 0x08, 0x2c, 0xed, 0xd3, 0x18, 0x96, 0x4f, 0xf0, + 0x00, 0x08, 0xe8, 0x7a, 0xef, 0xf7, 0x94, 0xfa, 0x2b, 0x78, 0x01, 0x2b, + 0x06, 0x46, 0x09, 0xf5, 0x40, 0x7a, 0xc8, 0xbf, 0x4b, 0xf6, 0x0a, 0x08, + 0x07, 0xdc, 0x03, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x1a, 0xf9, 0x68, 0x79, + 0x10, 0xb9, 0x4b, 0xf6, 0x14, 0x08, 0x9d, 0xe0, 0x68, 0x7a, 0x42, 0x1e, + 0x10, 0x42, 0x1a, 0xd1, 0xc8, 0xb1, 0x09, 0xf5, 0x88, 0x67, 0xeb, 0x78, + 0x00, 0xf0, 0x1d, 0xf9, 0xab, 0x78, 0x4f, 0xf4, 0x70, 0x62, 0x08, 0x21, + 0x00, 0xf0, 0x15, 0xf9, 0x2b, 0x79, 0x4f, 0xf4, 0xf8, 0x12, 0x10, 0x21, + 0x00, 0xf0, 0x0f, 0xf9, 0x73, 0x1e, 0x00, 0xf0, 0x09, 0xf9, 0x28, 0x78, + 0x01, 0x28, 0x0c, 0xbf, 0x01, 0x23, 0xab, 0x7a, 0x02, 0xe0, 0x4b, 0xf6, + 0x0d, 0x08, 0x7b, 0xe0, 0x4f, 0xf0, 0x00, 0x42, 0x1f, 0x21, 0x00, 0xf0, + 0xfe, 0xf8, 0xeb, 0x79, 0x09, 0xf2, 0x44, 0x47, 0x5b, 0x1e, 0x00, 0xf0, + 0xfa, 0xf8, 0x28, 0x78, 0x01, 0x28, 0x07, 0xd1, 0x6b, 0x78, 0x5b, 0x1e, + 0xf8, 0x22, 0x03, 0x21, 0x09, 0xf5, 0x94, 0x60, 0xff, 0xf7, 0x51, 0xfd, + 0xab, 0x79, 0x4f, 0xf4, 0x7f, 0x42, 0x08, 0x21, 0x00, 0xf0, 0xe7, 0xf8, + 0x6b, 0x79, 0x5b, 0x1e, 0x4f, 0xf4, 0x7f, 0x02, 0x10, 0x21, 0x00, 0xf0, + 0xe0, 0xf8, 0x00, 0x23, 0x4f, 0xf0, 0x40, 0x42, 0x1e, 0x21, 0x00, 0xf0, + 0xda, 0xf8, 0x09, 0xf5, 0x89, 0x66, 0x95, 0xf8, 0x65, 0x30, 0xe0, 0x22, + 0x05, 0x21, 0x00, 0xf0, 0xc0, 0xf8, 0x2b, 0x7a, 0x5b, 0x1e, 0x1f, 0x22, + 0x00, 0x21, 0x00, 0xf0, 0xba, 0xf8, 0x2b, 0x7a, 0x5b, 0x1e, 0x00, 0xf0, + 0xc5, 0xf8, 0x01, 0x23, 0x4f, 0xf4, 0x60, 0x42, 0x0d, 0x21, 0x00, 0xf0, + 0xb0, 0xf8, 0x00, 0x23, 0x04, 0x22, 0x02, 0x21, 0x00, 0xf0, 0xad, 0xf8, + 0x01, 0x23, 0x08, 0x22, 0x03, 0x21, 0x00, 0xf0, 0xa8, 0xf8, 0x6b, 0x7a, + 0x5b, 0x1e, 0x4f, 0xf4, 0xf8, 0x52, 0x08, 0x21, 0x00, 0xf0, 0x9f, 0xf8, + 0xe8, 0x79, 0x29, 0x7a, 0xc0, 0x00, 0xb0, 0xfb, 0xf1, 0xf2, 0x01, 0xfb, + 0x12, 0x00, 0x03, 0x00, 0x18, 0xbf, 0x01, 0x23, 0xdb, 0xb2, 0x00, 0xf0, + 0x8e, 0xf8, 0x00, 0xf0, 0x90, 0xf8, 0x01, 0x23, 0x4f, 0xf4, 0x80, 0x62, + 0x0a, 0x21, 0x09, 0xf5, 0x8e, 0x60, 0xff, 0xf7, 0xfe, 0xfc, 0x68, 0x7b, + 0x2b, 0x7b, 0x43, 0xea, 0x00, 0x23, 0x4f, 0xf6, 0xff, 0x72, 0x00, 0x21, + 0x09, 0xf2, 0x34, 0x40, 0xff, 0xf7, 0xf3, 0xfc, 0x09, 0xf5, 0x87, 0x64, + 0x20, 0x68, 0xc0, 0xf3, 0x00, 0x20, 0x08, 0xb1, 0x4b, 0xf6, 0x0f, 0x08, + 0xb8, 0xf1, 0x00, 0x0f, 0x61, 0xd1, 0x09, 0xf5, 0x86, 0x64, 0x01, 0x23, + 0x4f, 0xf4, 0x00, 0x52, 0x0d, 0x21, 0x00, 0xf0, 0x82, 0xf8, 0xa8, 0x7b, + 0xc0, 0xf3, 0x40, 0x03, 0x40, 0x22, 0x06, 0x21, 0x00, 0xf0, 0x65, 0xf8, + 0x28, 0x78, 0x00, 0x28, 0x06, 0xbf, 0xab, 0x7b, 0x03, 0xf0, 0x01, 0x03, + 0x00, 0x23, 0x80, 0x22, 0x07, 0x21, 0x00, 0xf0, 0x5a, 0xf8, 0x28, 0x78, + 0x00, 0x28, 0x06, 0xbf, 0xab, 0x7b, 0xdb, 0x09, 0x00, 0x23, 0x4f, 0xf4, + 0x00, 0x42, 0x0f, 0x21, 0x00, 0xf0, 0x65, 0xf8, 0xa8, 0x7b, 0xc0, 0xf3, + 0x80, 0x16, 0x33, 0x46, 0x4f, 0xf0, 0x80, 0x52, 0x1c, 0x21, 0x00, 0xf0, + 0x5c, 0xf8, 0x3e, 0xb1, 0xa8, 0x7b, 0xc0, 0xf3, 0x83, 0x03, 0x4f, 0xf0, + 0x70, 0x62, 0x18, 0x21, 0x00, 0xf0, 0x53, 0xf8, 0x01, 0x23, 0x04, 0x22, + 0x02, 0x21, 0x00, 0xf0, 0x4e, 0xf8, 0x00, 0x98, 0xd0, 0xb9, 0x02, 0x9d, + 0xe8, 0x7a, 0x00, 0x23, 0x01, 0x21, 0x99, 0x40, 0x08, 0x42, 0x03, 0xd1, + 0x5b, 0x1c, 0x08, 0x2b, 0xf8, 0xd3, 0x05, 0xe0, 0x4f, 0xf4, 0xe0, 0x62, + 0x08, 0x21, 0x3d, 0x48, 0xff, 0xf7, 0x99, 0xfc, 0x02, 0x95, 0x00, 0x23, + 0x08, 0x22, 0x03, 0x21, 0x39, 0x48, 0xff, 0xf7, 0x92, 0xfc, 0x01, 0x20, + 0x8d, 0xf8, 0x04, 0x00, 0x00, 0x98, 0x40, 0x1c, 0x03, 0x28, 0x00, 0x90, + 0x03, 0xda, 0xb8, 0xf1, 0x00, 0x0f, 0x3f, 0xf4, 0xd4, 0xad, 0xb8, 0xf1, + 0x00, 0x0f, 0x02, 0xbf, 0x9d, 0xf8, 0x04, 0x00, 0x00, 0x28, 0x4b, 0xf6, + 0x08, 0x08, 0x40, 0x46, 0x0f, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x4f, 0xf4, + 0x80, 0x32, 0x10, 0x21, 0x70, 0x47, 0x30, 0x46, 0x73, 0xe4, 0x50, 0x46, + 0x71, 0xe4, 0x4f, 0xf0, 0x90, 0x40, 0x6e, 0xe4, 0x03, 0x98, 0x10, 0xf8, + 0x14, 0x30, 0x4f, 0xf4, 0xe0, 0x52, 0x0a, 0x21, 0x58, 0x46, 0x66, 0xe4, + 0x4f, 0xf0, 0xf8, 0x52, 0x18, 0x21, 0x38, 0x46, 0x61, 0xe4, 0xff, 0x22, + 0x00, 0x21, 0x38, 0x46, 0x5d, 0xe4, 0x20, 0x46, 0x5b, 0xe4, 0x38, 0xb5, + 0x04, 0x46, 0x00, 0x25, 0x04, 0xeb, 0xc5, 0x00, 0x0f, 0x22, 0x03, 0x79, + 0x1f, 0x48, 0x00, 0x21, 0x00, 0xeb, 0x85, 0x00, 0xff, 0xf7, 0x4f, 0xfc, + 0x6d, 0x1c, 0x08, 0x2d, 0xf2, 0xd3, 0x31, 0xbd, 0x02, 0x46, 0x00, 0x20, + 0xd1, 0x79, 0x00, 0x29, 0x1e, 0xbf, 0xd1, 0x7a, 0x00, 0x29, 0x01, 0x20, + 0x70, 0x47, 0x38, 0xb5, 0x00, 0xf2, 0xcf, 0x34, 0x15, 0x4d, 0x23, 0x78, + 0x4f, 0xf0, 0x00, 0x42, 0x1f, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x37, 0xfc, + 0x63, 0x88, 0x12, 0x4a, 0x5b, 0x1e, 0x08, 0x21, 0x28, 0x46, 0xff, 0xf7, + 0x30, 0xfc, 0x63, 0x78, 0x0f, 0x48, 0x4f, 0xf0, 0xe0, 0x42, 0x1c, 0x21, + 0xff, 0xf7, 0x29, 0xfc, 0x23, 0x79, 0x1f, 0x22, 0x00, 0x21, 0x28, 0x46, + 0xff, 0xf7, 0x23, 0xfc, 0x00, 0x20, 0x32, 0xbd, 0x10, 0x06, 0x00, 0x48, + 0x20, 0x00, 0x00, 0x47, 0x8c, 0x9e, 0x04, 0x02, 0x83, 0x01, 0x00, 0x47, + 0x84, 0x01, 0x00, 0x47, 0x00, 0x12, 0x00, 0x48, 0xf0, 0x05, 0x00, 0x48, + 0xf0, 0x06, 0x00, 0x48, 0x00, 0xff, 0xff, 0x00, 0x28, 0x00, 0x00, 0x48, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, + 0x0d, 0xf8, 0x01, 0x70, 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, + 0x72, 0xb6, 0x05, 0x68, 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, + 0x29, 0x43, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x43, 0x80, 0x46, 0x00, 0x24, + 0x00, 0x26, 0x00, 0x27, 0x00, 0x25, 0x48, 0x20, 0x68, 0x43, 0x00, 0xf0, + 0x2f, 0xf8, 0x28, 0xb1, 0x99, 0xf8, 0x0b, 0x00, 0x00, 0xea, 0x06, 0x01, + 0x0f, 0x43, 0x06, 0x43, 0x6d, 0x1c, 0x01, 0x2d, 0xf1, 0xdd, 0xff, 0xb2, + 0x0f, 0xb1, 0x4b, 0xf6, 0x02, 0x04, 0x1c, 0xe0, 0x2d, 0xe9, 0xf8, 0x43, + 0x80, 0x46, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x48, 0x20, + 0x78, 0x43, 0x00, 0xf0, 0x15, 0xf8, 0x28, 0xb1, 0x99, 0xf8, 0x0f, 0x00, + 0x6d, 0x1c, 0x03, 0x28, 0x08, 0xbf, 0x76, 0x1c, 0x7f, 0x1c, 0x01, 0x2f, + 0xf1, 0xdd, 0xf0, 0xb2, 0x00, 0x28, 0x1f, 0xbf, 0xf6, 0xb2, 0xed, 0xb2, + 0xae, 0x42, 0x4b, 0xf6, 0x07, 0x04, 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x83, + 0x08, 0xeb, 0x00, 0x09, 0x48, 0x46, 0x51, 0xe3, 0x00, 0x23, 0x03, 0x22, + 0x00, 0x21, 0xdf, 0xf8, 0xe8, 0x06, 0xaa, 0xe7, 0x2d, 0xe9, 0xf0, 0x4f, + 0x82, 0x46, 0x17, 0x46, 0x07, 0xf2, 0x94, 0x70, 0x8b, 0xb0, 0x83, 0x7e, + 0xdf, 0xf8, 0xd0, 0x46, 0xdf, 0xf8, 0xd0, 0x86, 0x0e, 0x46, 0x0c, 0x22, + 0x02, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x99, 0xff, 0x97, 0xf8, 0x94, 0x37, + 0x4f, 0xf4, 0x7f, 0x42, 0x08, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x91, 0xff, + 0xff, 0x23, 0x4f, 0xf4, 0x7f, 0x42, 0x08, 0x21, 0x40, 0x46, 0xff, 0xf7, + 0x8a, 0xff, 0x18, 0x22, 0x00, 0x21, 0x05, 0xa8, 0xde, 0xf7, 0xde, 0xfb, + 0x00, 0x24, 0x8d, 0xf8, 0x00, 0x40, 0x4f, 0xf0, 0x70, 0x09, 0x00, 0x25, + 0x48, 0x20, 0x68, 0x43, 0x4f, 0xf4, 0xc2, 0x71, 0x06, 0xeb, 0x00, 0x0b, + 0x04, 0x91, 0x58, 0x46, 0x00, 0xf0, 0x16, 0xfb, 0x90, 0xb1, 0x04, 0x98, + 0x68, 0x43, 0x38, 0x44, 0x90, 0xf8, 0x0c, 0x16, 0x01, 0x29, 0xdb, 0xf8, + 0x3c, 0x10, 0x08, 0xbf, 0x89, 0x00, 0x0c, 0x22, 0x05, 0xa8, 0x6a, 0x43, + 0x83, 0x18, 0x00, 0x22, 0x50, 0x46, 0xef, 0xf7, 0x09, 0xf9, 0x04, 0x46, + 0x6d, 0x1c, 0x01, 0x2d, 0x01, 0xdc, 0x00, 0x2c, 0xdc, 0xd0, 0x00, 0x2c, + 0x01, 0x96, 0x02, 0x97, 0x4d, 0xd1, 0xdf, 0xf8, 0x44, 0x56, 0x05, 0x9b, + 0x07, 0x22, 0x00, 0xf0, 0x37, 0xfb, 0x08, 0x9b, 0x70, 0x22, 0x04, 0x21, + 0x00, 0xf0, 0x33, 0xfb, 0x02, 0x9e, 0x9d, 0xf8, 0x00, 0xa0, 0x00, 0x27, + 0xb8, 0x00, 0x00, 0xf1, 0x90, 0x40, 0x00, 0xf1, 0x08, 0x0b, 0xf0, 0x19, + 0x00, 0xf2, 0x96, 0x75, 0x4f, 0xf0, 0x80, 0x72, 0x2b, 0x78, 0x18, 0x21, + 0x00, 0xf0, 0xa9, 0xfa, 0x2b, 0x7a, 0x4f, 0xf4, 0xe0, 0x02, 0x14, 0x21, + 0x00, 0xf0, 0xa3, 0xfa, 0x2b, 0x7c, 0x4f, 0xf4, 0xe0, 0x22, 0x00, 0xf0, + 0x9d, 0xfa, 0x28, 0x78, 0x28, 0xb1, 0x28, 0x7c, 0x48, 0x45, 0x4f, 0xf0, + 0x01, 0x0a, 0x38, 0xbf, 0x81, 0x46, 0x7f, 0x1c, 0x08, 0x2f, 0xdb, 0xd3, + 0x30, 0x46, 0x00, 0xf2, 0x94, 0x70, 0x02, 0x96, 0x81, 0x7e, 0x03, 0x29, + 0x05, 0xd0, 0x43, 0x78, 0xff, 0x22, 0x00, 0x21, 0x40, 0x46, 0xff, 0xf7, + 0x18, 0xff, 0xdf, 0xf8, 0xc8, 0x65, 0x53, 0x46, 0x80, 0x22, 0x07, 0x21, + 0x30, 0x46, 0xff, 0xf7, 0x07, 0xff, 0x4b, 0x46, 0x70, 0x22, 0x04, 0x21, + 0x30, 0x46, 0xff, 0xf7, 0x01, 0xff, 0x00, 0x2c, 0x40, 0xf0, 0x66, 0x82, + 0x00, 0x27, 0x01, 0x9e, 0xdf, 0xf8, 0xa4, 0xa5, 0x4f, 0xf0, 0x00, 0x0b, + 0x00, 0x25, 0xb8, 0x46, 0xdf, 0xf8, 0x9c, 0x05, 0x50, 0xf8, 0x28, 0x00, + 0x01, 0x23, 0x03, 0xfa, 0x08, 0xf3, 0x4f, 0xf4, 0x7f, 0x42, 0x08, 0x21, + 0xff, 0xf7, 0xf3, 0xfe, 0x48, 0x20, 0x00, 0xfb, 0x08, 0xf0, 0x06, 0xeb, + 0x00, 0x09, 0x48, 0x46, 0x00, 0xf0, 0x8c, 0xfa, 0x00, 0x28, 0x1c, 0xbf, + 0x99, 0xf8, 0x0f, 0x10, 0x03, 0x29, 0x22, 0xd0, 0x4a, 0x1c, 0x99, 0xf8, + 0x10, 0x00, 0x42, 0xea, 0x0b, 0x0b, 0x00, 0xb1, 0x15, 0x43, 0x99, 0xf8, + 0x11, 0x00, 0x00, 0xb1, 0x17, 0x43, 0x00, 0x29, 0x18, 0xbf, 0x02, 0x29, + 0x06, 0xd1, 0x99, 0xf8, 0x12, 0x30, 0x0f, 0x22, 0x00, 0x21, 0x50, 0x46, + 0xff, 0xf7, 0xc6, 0xfe, 0x99, 0xf8, 0x0f, 0x00, 0x01, 0x28, 0x18, 0xbf, + 0x02, 0x28, 0x06, 0xd1, 0x99, 0xf8, 0x12, 0x30, 0xf0, 0x22, 0x04, 0x21, + 0x50, 0x46, 0xff, 0xf7, 0xb9, 0xfe, 0x08, 0xf1, 0x01, 0x08, 0xb8, 0xf1, + 0x01, 0x0f, 0xbd, 0xdd, 0x01, 0x96, 0xeb, 0xb2, 0x03, 0xb1, 0x01, 0x23, + 0xdf, 0xf8, 0x14, 0x55, 0x10, 0x22, 0x04, 0x21, 0x28, 0x46, 0xff, 0xf7, + 0xa9, 0xfe, 0x5f, 0xfa, 0x8b, 0xf3, 0x03, 0x22, 0x00, 0x21, 0x28, 0x46, + 0xff, 0xf7, 0xa2, 0xfe, 0xfb, 0xb2, 0x0c, 0x22, 0x02, 0x21, 0x28, 0x46, + 0xff, 0xf7, 0x9c, 0xfe, 0x00, 0x20, 0x00, 0x90, 0x00, 0x9a, 0x01, 0x99, + 0x48, 0x20, 0x42, 0x43, 0x88, 0x18, 0x00, 0xf0, 0x3d, 0xfa, 0x00, 0x28, + 0x00, 0xf0, 0xf0, 0x81, 0x00, 0x98, 0x01, 0x21, 0x81, 0x40, 0x03, 0x91, + 0x02, 0x99, 0x01, 0xf2, 0x94, 0x70, 0x82, 0x7e, 0x03, 0x98, 0x02, 0x42, + 0x5f, 0xd0, 0x00, 0x9c, 0x01, 0x99, 0x22, 0x46, 0x48, 0x20, 0x42, 0x43, + 0x4f, 0xf0, 0x00, 0x0a, 0x8d, 0x18, 0x05, 0xeb, 0x0a, 0x01, 0xe0, 0xb2, + 0xcf, 0x7e, 0x20, 0x2f, 0xa6, 0xbf, 0x01, 0x23, 0x1f, 0x27, 0x00, 0x23, + 0x4f, 0xea, 0x8a, 0x06, 0x00, 0x28, 0x06, 0xf1, 0x90, 0x46, 0x4f, 0xf4, + 0x80, 0x32, 0x0a, 0xd1, 0x10, 0x21, 0x06, 0xf5, 0xb0, 0x50, 0xff, 0xf7, + 0x70, 0xfe, 0x3b, 0x46, 0x1f, 0x22, 0x00, 0x21, 0x06, 0xf5, 0xc8, 0x50, + 0x09, 0xe0, 0x10, 0x21, 0x06, 0xf5, 0xdc, 0x50, 0xff, 0xf7, 0x65, 0xfe, + 0x3b, 0x46, 0x1f, 0x22, 0x00, 0x21, 0x06, 0xf5, 0xe8, 0x50, 0xff, 0xf7, + 0x5e, 0xfe, 0x0a, 0xf1, 0x01, 0x0a, 0xba, 0xf1, 0x1f, 0x0f, 0xd2, 0xd9, + 0xdf, 0xf8, 0x50, 0x04, 0x00, 0x99, 0x50, 0xf8, 0x21, 0xa0, 0x01, 0x98, + 0x48, 0x26, 0x71, 0x43, 0x00, 0x27, 0x44, 0x18, 0xe0, 0x19, 0xc3, 0x7c, + 0x08, 0x2b, 0x28, 0xbf, 0x1f, 0x23, 0x0a, 0xeb, 0x87, 0x00, 0x1f, 0x22, + 0x00, 0x21, 0x00, 0xf5, 0x41, 0x70, 0xff, 0xf7, 0x42, 0xfe, 0x7f, 0x1c, + 0x08, 0x2f, 0xef, 0xd3, 0x00, 0x99, 0x01, 0x98, 0x4e, 0x43, 0x06, 0x44, + 0x00, 0x24, 0xf0, 0x7a, 0xee, 0xf7, 0x34, 0xff, 0x33, 0x78, 0x01, 0x2b, + 0x05, 0x46, 0x0a, 0xf5, 0x4a, 0x77, 0x7d, 0xdd, 0x4b, 0xf6, 0x0c, 0x04, + 0x52, 0xe1, 0x00, 0x9a, 0x04, 0x98, 0x02, 0x99, 0xdd, 0xf8, 0x00, 0xa0, + 0x42, 0x43, 0x88, 0x18, 0x00, 0xf2, 0x8c, 0x44, 0xdf, 0xf8, 0xf0, 0x03, + 0x07, 0x68, 0x5f, 0xfa, 0x8a, 0xf1, 0x00, 0x29, 0x07, 0xf0, 0x03, 0x07, + 0x0c, 0xbf, 0xc0, 0x26, 0x60, 0x26, 0x4f, 0xf0, 0x00, 0x08, 0x46, 0xe0, + 0x09, 0xf5, 0xdc, 0x5b, 0x00, 0xf0, 0x7e, 0xf9, 0x00, 0xf0, 0x74, 0xf9, + 0x00, 0xf0, 0x7d, 0xf9, 0x09, 0xf5, 0xd0, 0x59, 0x6b, 0x78, 0x1f, 0x22, + 0x00, 0x21, 0x00, 0xf0, 0x78, 0xf9, 0x6b, 0x78, 0x4f, 0xf4, 0x78, 0x72, + 0x05, 0x21, 0x00, 0xf0, 0x72, 0xf9, 0x6b, 0x78, 0x4f, 0xf4, 0xf8, 0x42, + 0x0a, 0x21, 0x00, 0xf0, 0x6c, 0xf9, 0x6b, 0x78, 0x4f, 0xf4, 0x78, 0x22, + 0x0f, 0x21, 0x00, 0xf0, 0x66, 0xf9, 0x6b, 0x78, 0x4f, 0xf0, 0xf8, 0x72, + 0x14, 0x21, 0x00, 0xf0, 0x60, 0xf9, 0x6b, 0x78, 0x4f, 0xf0, 0x78, 0x52, + 0x19, 0x21, 0x00, 0xf0, 0x5a, 0xf9, 0x6b, 0x78, 0x1f, 0x22, 0x00, 0x21, + 0x00, 0xf0, 0x53, 0xf9, 0x6b, 0x78, 0x4f, 0xf4, 0x78, 0x72, 0x05, 0x21, + 0x00, 0xf0, 0x4d, 0xf9, 0x94, 0xf8, 0x80, 0x01, 0x00, 0x28, 0x03, 0x98, + 0x0c, 0xbf, 0x87, 0x43, 0x07, 0x43, 0x3b, 0x46, 0x03, 0x22, 0x00, 0x21, + 0xd4, 0x48, 0xff, 0xf7, 0xd2, 0xfd, 0x08, 0xf1, 0x01, 0x08, 0xb0, 0x45, + 0xbf, 0xf4, 0x74, 0xaf, 0x4f, 0xea, 0x88, 0x00, 0x04, 0xeb, 0x48, 0x05, + 0x00, 0xf1, 0x90, 0x49, 0x68, 0x78, 0x1f, 0x28, 0x94, 0xbf, 0x00, 0x23, + 0x01, 0x23, 0x5f, 0xfa, 0x8a, 0xf1, 0x00, 0x29, 0xa6, 0xd1, 0x09, 0xf5, + 0xb0, 0x5b, 0x00, 0xf0, 0x25, 0xf9, 0x00, 0xf0, 0x1b, 0xf9, 0x00, 0xf0, + 0x24, 0xf9, 0x09, 0xf5, 0x98, 0x59, 0xa5, 0xe7, 0x03, 0x22, 0x00, 0x21, + 0x00, 0xf0, 0x18, 0xf9, 0x70, 0x79, 0x10, 0xb9, 0x4b, 0xf6, 0x14, 0x04, + 0xce, 0xe0, 0x71, 0x7a, 0x4a, 0x1e, 0x11, 0x42, 0x53, 0xd1, 0x00, 0x29, + 0x51, 0xd0, 0x0a, 0xf5, 0x4c, 0x7b, 0xf3, 0x78, 0xff, 0x22, 0x00, 0x21, + 0x00, 0xf0, 0x0b, 0xf9, 0x33, 0x79, 0x1f, 0x22, 0x00, 0x21, 0x0a, 0xf5, + 0x4d, 0x70, 0xff, 0xf7, 0x96, 0xfd, 0x33, 0x79, 0x5b, 0x1c, 0x1f, 0x22, + 0x00, 0x21, 0x0a, 0xf5, 0x4e, 0x70, 0xff, 0xf7, 0x8e, 0xfd, 0x33, 0x79, + 0x9b, 0x1c, 0x1f, 0x22, 0x00, 0x21, 0x0a, 0xf5, 0x4f, 0x70, 0xff, 0xf7, + 0x86, 0xfd, 0x33, 0x79, 0xdb, 0x1c, 0x1f, 0x22, 0x00, 0x21, 0x0a, 0xf5, + 0x50, 0x70, 0xff, 0xf7, 0x7e, 0xfd, 0x33, 0x79, 0x1b, 0x1d, 0x1f, 0x22, + 0x00, 0x21, 0x0a, 0xf5, 0x51, 0x70, 0xff, 0xf7, 0x76, 0xfd, 0x33, 0x79, + 0x5b, 0x1d, 0x1f, 0x22, 0x00, 0x21, 0x0a, 0xf5, 0x52, 0x70, 0xff, 0xf7, + 0x6e, 0xfd, 0x33, 0x79, 0x9b, 0x1d, 0x1f, 0x22, 0x00, 0x21, 0x0a, 0xf5, + 0x53, 0x70, 0xff, 0xf7, 0x66, 0xfd, 0x33, 0x79, 0xdb, 0x1d, 0x1f, 0x22, + 0x00, 0x21, 0x0a, 0xf5, 0x54, 0x70, 0xff, 0xf7, 0x5e, 0xfd, 0x6b, 0x1e, + 0x4f, 0xf4, 0xf8, 0x52, 0x08, 0x21, 0x00, 0xf0, 0xc6, 0xf8, 0x30, 0x78, + 0x01, 0x28, 0x0c, 0xbf, 0x01, 0x23, 0xb3, 0x7a, 0x02, 0xe0, 0x4b, 0xf6, + 0x0e, 0x04, 0x73, 0xe0, 0x4f, 0xf4, 0x00, 0x42, 0x0f, 0x21, 0x00, 0xf0, + 0xb8, 0xf8, 0xf3, 0x79, 0x5b, 0x1e, 0x4f, 0xf4, 0x7f, 0x02, 0x00, 0xf0, + 0xb1, 0xf8, 0x30, 0x78, 0x01, 0x28, 0x08, 0xd1, 0x73, 0x78, 0x5b, 0x1e, + 0x4f, 0xf4, 0xf8, 0x52, 0x08, 0x21, 0x0a, 0xf5, 0x5e, 0x70, 0xff, 0xf7, + 0x38, 0xfd, 0xb3, 0x79, 0x4f, 0xf0, 0x7f, 0x42, 0x18, 0x21, 0x00, 0xf0, + 0xa0, 0xf8, 0x73, 0x79, 0x0a, 0xf5, 0x55, 0x75, 0x5b, 0x1e, 0xff, 0x22, + 0x00, 0xf0, 0x10, 0xf9, 0x00, 0x23, 0x4f, 0xf4, 0x40, 0x42, 0x0e, 0x21, + 0x00, 0xf0, 0x0b, 0xf9, 0x96, 0xf8, 0x44, 0x30, 0x4f, 0xf4, 0x60, 0x02, + 0x15, 0x21, 0x00, 0xf0, 0x04, 0xf9, 0x33, 0x7a, 0x5b, 0x1e, 0x4f, 0xf4, + 0xf8, 0x12, 0x10, 0x21, 0x00, 0xf0, 0xfd, 0xf8, 0x33, 0x7a, 0x5b, 0x1e, + 0x4f, 0xf4, 0xf8, 0x52, 0x08, 0x21, 0x00, 0xf0, 0xf6, 0xf8, 0x01, 0x23, + 0x4f, 0xf0, 0x60, 0x42, 0x1d, 0x21, 0x00, 0xf0, 0xf0, 0xf8, 0x00, 0x23, + 0x04, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x6e, 0xf8, 0x01, 0x23, 0x08, 0x22, + 0x03, 0x21, 0x00, 0xf0, 0x69, 0xf8, 0x73, 0x7a, 0x5b, 0x1e, 0x4f, 0xf0, + 0xf8, 0x52, 0x18, 0x21, 0x00, 0xf0, 0xdf, 0xf8, 0xf0, 0x79, 0x31, 0x7a, + 0xc0, 0x00, 0xb0, 0xfb, 0xf1, 0xf2, 0x01, 0xfb, 0x12, 0x00, 0x03, 0x00, + 0x18, 0xbf, 0x01, 0x23, 0xdb, 0xb2, 0x4f, 0xf4, 0x00, 0x52, 0x0d, 0x21, + 0x00, 0xf0, 0xcf, 0xf8, 0x70, 0x7b, 0x33, 0x7b, 0x5e, 0x4a, 0x43, 0xea, + 0x00, 0x23, 0x10, 0x21, 0x00, 0xf0, 0x4a, 0xf8, 0x38, 0x68, 0xc0, 0xf3, + 0x00, 0x40, 0x08, 0xb1, 0x4b, 0xf6, 0x10, 0x04, 0x84, 0xbb, 0xb0, 0x7b, + 0xc0, 0xf3, 0x40, 0x03, 0x40, 0x22, 0x06, 0x21, 0x00, 0xf0, 0x3c, 0xf8, + 0x30, 0x78, 0x00, 0x28, 0x06, 0xbf, 0xb3, 0x7b, 0x03, 0xf0, 0x01, 0x03, + 0x00, 0x23, 0x80, 0x22, 0x07, 0x21, 0x00, 0xf0, 0x31, 0xf8, 0x30, 0x78, + 0x00, 0x28, 0x06, 0xbf, 0xb3, 0x7b, 0xdb, 0x09, 0x00, 0x23, 0x02, 0x22, + 0x01, 0x21, 0x38, 0x46, 0xff, 0xf7, 0xbd, 0xfc, 0xb0, 0x7b, 0xc0, 0xf3, + 0x80, 0x15, 0x2b, 0x46, 0x4f, 0xf4, 0x80, 0x52, 0x0c, 0x21, 0x38, 0x46, + 0xff, 0xf7, 0xb3, 0xfc, 0x45, 0xb1, 0xb0, 0x7b, 0xc0, 0xf3, 0x83, 0x03, + 0x4f, 0xf4, 0x70, 0x62, 0x08, 0x21, 0x38, 0x46, 0xff, 0xf7, 0xa9, 0xfc, + 0x00, 0x98, 0x40, 0x1c, 0x01, 0x28, 0x00, 0x90, 0x02, 0xdc, 0x00, 0x2c, + 0x3f, 0xf4, 0xfe, 0xad, 0x20, 0x46, 0x0b, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x14, 0xf8, 0x18, 0x30, 0x4f, 0xf4, 0xe0, 0x52, 0x0a, 0x21, 0x70, 0x47, + 0x50, 0x46, 0x94, 0xe4, 0x4f, 0xf4, 0x80, 0x32, 0x10, 0x21, 0x58, 0x46, + 0x8f, 0xe4, 0x48, 0x46, 0x8d, 0xe4, 0x2d, 0xe9, 0xf0, 0x41, 0x80, 0x46, + 0x00, 0x27, 0x31, 0x4c, 0x31, 0x4d, 0x2c, 0x20, 0x78, 0x43, 0x40, 0x44, + 0x55, 0xf8, 0x27, 0x60, 0x43, 0x78, 0x0a, 0x36, 0x01, 0x22, 0x00, 0x21, + 0x30, 0x46, 0xff, 0xf7, 0x73, 0xfc, 0x30, 0x78, 0x21, 0x78, 0x00, 0xf0, + 0x01, 0x00, 0x7f, 0x1c, 0x40, 0x18, 0x08, 0x2f, 0x20, 0x70, 0xea, 0xd3, + 0xbd, 0xe8, 0xf0, 0x81, 0x38, 0xb5, 0x04, 0x46, 0x00, 0x25, 0x2c, 0x20, + 0x68, 0x43, 0x20, 0x44, 0x03, 0x22, 0x83, 0x78, 0x22, 0x48, 0x00, 0x21, + 0x00, 0xeb, 0x85, 0x00, 0xff, 0xf7, 0x63, 0xfc, 0x6d, 0x1c, 0x08, 0x2d, + 0xf1, 0xd3, 0x31, 0xbd, 0x02, 0x46, 0x00, 0x20, 0xd1, 0x79, 0x00, 0x29, + 0x1e, 0xbf, 0xd1, 0x7a, 0x00, 0x29, 0x01, 0x20, 0x70, 0x47, 0x38, 0xb5, + 0x00, 0xf2, 0xca, 0x34, 0x18, 0x4d, 0x23, 0x78, 0x4f, 0xf0, 0x00, 0x42, + 0x1f, 0x21, 0x00, 0xf0, 0x32, 0xf8, 0x63, 0x88, 0x15, 0x4a, 0x5b, 0x1e, + 0x08, 0x21, 0x00, 0xf0, 0x2c, 0xf8, 0x63, 0x78, 0x13, 0x48, 0x4f, 0xf0, + 0xe0, 0x62, 0x18, 0x21, 0xff, 0xf7, 0x3f, 0xfc, 0x23, 0x79, 0x1f, 0x22, + 0x00, 0xf0, 0x20, 0xf8, 0x00, 0x20, 0x32, 0xbd, 0x38, 0x01, 0x00, 0x48, + 0x3c, 0x01, 0x00, 0x48, 0x04, 0x00, 0x00, 0x48, 0x20, 0x00, 0x00, 0x47, + 0x86, 0x01, 0x00, 0x47, 0x04, 0x9f, 0x04, 0x02, 0x85, 0x01, 0x00, 0x47, + 0x80, 0x1d, 0x00, 0x48, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x76, 0x02, 0x21, + 0x40, 0x9a, 0x04, 0x02, 0xb8, 0x00, 0x00, 0x48, 0xe0, 0x06, 0x00, 0x48, + 0x00, 0xff, 0xff, 0x00, 0x28, 0x00, 0x00, 0x48, 0x00, 0x21, 0x28, 0x46, + 0x17, 0xe4, 0x00, 0x00, 0xb0, 0xfa, 0x80, 0xf0, 0xc0, 0xf1, 0x1f, 0x00, + 0x70, 0x47, 0x01, 0x46, 0xb1, 0xfa, 0x81, 0xf0, 0xc0, 0xf1, 0x1f, 0x00, + 0x01, 0x22, 0x82, 0x40, 0x52, 0x1e, 0x0a, 0x42, 0x18, 0xbf, 0x40, 0x1c, + 0x70, 0x47, 0x70, 0xb5, 0x03, 0x46, 0x00, 0x20, 0x00, 0x24, 0x00, 0x25, + 0x06, 0xe0, 0x53, 0xf8, 0x25, 0x60, 0xb0, 0x42, 0x3c, 0xbf, 0x30, 0x46, + 0x2c, 0x46, 0x6d, 0x1c, 0x8d, 0x42, 0xf6, 0xd3, 0x02, 0xb1, 0x14, 0x60, + 0x70, 0xbd, 0x02, 0x46, 0xb2, 0xfb, 0xf1, 0xf0, 0x41, 0x43, 0x91, 0x42, + 0x18, 0xbf, 0x40, 0x1c, 0x70, 0x47, 0x06, 0xe0, 0xb0, 0xfb, 0xf1, 0xf3, + 0x0a, 0x46, 0x01, 0xfb, 0x13, 0x00, 0x01, 0x46, 0x10, 0x46, 0x00, 0x29, + 0xf6, 0xd1, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46, 0x08, 0x48, 0x00, 0x78, + 0xa0, 0x28, 0x05, 0xd0, 0x03, 0x22, 0x4f, 0xf6, 0x72, 0x71, 0x01, 0x20, + 0xfa, 0xf7, 0x16, 0xfe, 0x01, 0x20, 0x04, 0x2c, 0x82, 0xbf, 0xa4, 0x1f, + 0x02, 0x2c, 0x00, 0x20, 0x10, 0xbd, 0x00, 0xbf, 0x05, 0x00, 0x00, 0x47, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x86, 0xb0, 0x06, 0x46, + 0x89, 0x46, 0x18, 0x22, 0x00, 0x21, 0x68, 0x46, 0xde, 0xf7, 0x0c, 0xf8, + 0x00, 0x24, 0x00, 0x25, 0x4f, 0xf0, 0x2b, 0x0b, 0x0b, 0xfb, 0x05, 0xf0, + 0x19, 0xf8, 0x00, 0x10, 0x01, 0x29, 0x0c, 0xd1, 0x48, 0x44, 0x0c, 0x22, + 0xd0, 0xf8, 0x27, 0x10, 0x6a, 0x43, 0x0d, 0xeb, 0x02, 0x03, 0x00, 0x22, + 0x30, 0x46, 0xee, 0xf7, 0x45, 0xfd, 0x04, 0x00, 0x04, 0xd1, 0x6d, 0x1c, + 0x01, 0x2d, 0x01, 0xdc, 0x00, 0x2c, 0xe7, 0xd0, 0x00, 0x2c, 0x66, 0xd1, + 0x00, 0x9b, 0x35, 0x48, 0x00, 0xf0, 0x6e, 0xf8, 0x03, 0x9b, 0x34, 0x48, + 0x00, 0xf0, 0x6a, 0xf8, 0x00, 0x25, 0x0b, 0xfb, 0x05, 0xf0, 0x09, 0xeb, + 0x00, 0x06, 0x30, 0x78, 0x01, 0x28, 0x53, 0xd1, 0x00, 0x27, 0xf0, 0x19, + 0x83, 0x79, 0x2e, 0x48, 0x00, 0xeb, 0x87, 0x08, 0x40, 0x2b, 0xe8, 0xb2, + 0x04, 0xdb, 0x08, 0xb9, 0x01, 0x23, 0x08, 0xe0, 0x01, 0x23, 0x10, 0xe0, + 0x40, 0xb9, 0x3f, 0x22, 0x00, 0x21, 0x40, 0x46, 0xff, 0xf7, 0xa6, 0xff, + 0x00, 0x23, 0x80, 0x22, 0x07, 0x21, 0x09, 0xe0, 0x4f, 0xf4, 0x7c, 0x52, + 0x08, 0x21, 0x40, 0x46, 0xff, 0xf7, 0x9c, 0xff, 0x00, 0x23, 0x4f, 0xf4, + 0x00, 0x42, 0x0f, 0x21, 0x40, 0x46, 0xff, 0xf7, 0x95, 0xff, 0x7f, 0x1c, + 0x20, 0x2f, 0xd8, 0xd3, 0xa8, 0x00, 0x00, 0xf1, 0x90, 0x47, 0x73, 0x78, + 0x07, 0xf5, 0xd4, 0x6a, 0x5b, 0x1e, 0xff, 0x22, 0x00, 0x21, 0x50, 0x46, + 0xff, 0xf7, 0x86, 0xff, 0x33, 0x79, 0x5b, 0x1e, 0x4f, 0xf4, 0x78, 0x02, + 0x13, 0x21, 0x50, 0x46, 0xff, 0xf7, 0x7e, 0xff, 0x73, 0x79, 0x5b, 0x1e, + 0x4f, 0xf4, 0xf8, 0x52, 0x08, 0x21, 0x50, 0x46, 0xff, 0xf7, 0x76, 0xff, + 0xf3, 0x78, 0x07, 0xf5, 0xd5, 0x67, 0x5b, 0x1e, 0xff, 0x22, 0x00, 0x21, + 0x38, 0x46, 0xff, 0xf7, 0x6d, 0xff, 0xb3, 0x78, 0x4f, 0xf4, 0x7f, 0x42, + 0x08, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x66, 0xff, 0x6d, 0x1c, 0x01, 0x2d, + 0xa1, 0xdd, 0x20, 0x46, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0x00, + 0xa0, 0x06, 0x00, 0x48, 0xa4, 0x06, 0x00, 0x48, 0x20, 0x06, 0x00, 0x48, + 0x4f, 0xf4, 0xe0, 0x22, 0x10, 0x21, 0x53, 0xe7, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, + 0x11, 0x40, 0x29, 0x43, 0x01, 0x70, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0x80, 0xb5, 0xea, 0xf7, 0x06, 0xf8, 0x00, 0x20, 0x02, 0xbd, 0x2d, 0xe9, + 0xf8, 0x4f, 0x83, 0x46, 0x0d, 0x46, 0xee, 0xf7, 0x51, 0xfc, 0x06, 0x46, + 0xee, 0xf7, 0x75, 0xfc, 0x07, 0x46, 0xee, 0xf7, 0x8e, 0xfc, 0x04, 0x46, + 0x30, 0x46, 0xe9, 0xf7, 0xf4, 0xff, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, + 0x83, 0x48, 0x84, 0x4e, 0xff, 0xf7, 0xd6, 0xff, 0x01, 0x2f, 0x4f, 0xf0, + 0x00, 0x08, 0x01, 0xd1, 0x01, 0x23, 0x00, 0xe0, 0x02, 0x23, 0x0c, 0x22, + 0x02, 0x21, 0x30, 0x46, 0xff, 0xf7, 0xca, 0xff, 0x00, 0x27, 0xfb, 0xb2, + 0x03, 0x22, 0x00, 0x21, 0x30, 0x46, 0xff, 0xf7, 0xc3, 0xff, 0x64, 0x20, + 0xf7, 0xf7, 0x76, 0xfb, 0x7f, 0x1c, 0xf9, 0xb2, 0x8b, 0x45, 0xf2, 0xd2, + 0x76, 0x4a, 0xdf, 0xf8, 0xdc, 0xa1, 0x94, 0x42, 0x2c, 0xbf, 0x00, 0x23, + 0x01, 0x23, 0x70, 0x22, 0x04, 0x21, 0x30, 0x46, 0xff, 0xf7, 0xb0, 0xff, + 0x30, 0x78, 0x72, 0x49, 0x0a, 0x78, 0x00, 0x95, 0xc0, 0xf3, 0x02, 0x10, + 0x82, 0x18, 0x00, 0x24, 0x0a, 0x70, 0xa1, 0x46, 0xe5, 0xb2, 0x5a, 0xf8, + 0x25, 0x60, 0xe0, 0xb2, 0xee, 0xf7, 0x1f, 0xfc, 0x00, 0x28, 0x00, 0xf0, + 0xbc, 0x80, 0xf7, 0xf7, 0x84, 0xfd, 0x00, 0xf0, 0x3f, 0x03, 0xff, 0x22, + 0x00, 0x21, 0x06, 0xf1, 0xf9, 0x00, 0xff, 0xf7, 0x93, 0xff, 0x59, 0x46, + 0xe0, 0xb2, 0xea, 0xf7, 0x6e, 0xfb, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, + 0xb0, 0x1c, 0xff, 0xf7, 0x89, 0xff, 0x00, 0x23, 0x04, 0x22, 0x02, 0x21, + 0xf0, 0x1c, 0xff, 0xf7, 0x83, 0xff, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, + 0x06, 0xf1, 0x09, 0x00, 0xff, 0xf7, 0x7c, 0xff, 0x00, 0x23, 0x02, 0x22, + 0x01, 0x21, 0x06, 0xf1, 0x0a, 0x00, 0xff, 0xf7, 0x75, 0xff, 0x06, 0xf1, + 0xc7, 0x07, 0x18, 0x23, 0x1f, 0x22, 0x00, 0xf0, 0xac, 0xf8, 0x01, 0x23, + 0x20, 0x22, 0x05, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x69, 0xff, 0xee, 0xf7, + 0xdf, 0xfb, 0x4f, 0x4f, 0x4f, 0x4a, 0xc0, 0x19, 0x41, 0xeb, 0x09, 0x01, + 0x00, 0x23, 0xf1, 0xf7, 0x35, 0xfb, 0x40, 0x1c, 0x06, 0xf1, 0x12, 0x08, + 0xc3, 0xb2, 0x1f, 0x22, 0x00, 0x21, 0x40, 0x46, 0xff, 0xf7, 0x56, 0xff, + 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, 0x40, 0x46, 0xff, 0xf7, 0x50, 0xff, + 0x12, 0x23, 0x1f, 0x22, 0x00, 0x21, 0x06, 0xf1, 0x22, 0x00, 0xff, 0xf7, + 0x49, 0xff, 0x06, 0xf1, 0x20, 0x07, 0x01, 0x23, 0x40, 0x22, 0x06, 0x21, + 0x38, 0x46, 0xff, 0xf7, 0x41, 0xff, 0x00, 0x23, 0x80, 0x22, 0x07, 0x21, + 0x38, 0x46, 0xff, 0xf7, 0x3b, 0xff, 0x10, 0x23, 0x1f, 0x22, 0x00, 0x21, + 0x06, 0xf1, 0x2d, 0x00, 0xff, 0xf7, 0x34, 0xff, 0x00, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x06, 0xf1, 0xa8, 0x00, 0xff, 0xf7, 0x2d, 0xff, 0x2c, 0x20, + 0x45, 0x43, 0xbb, 0xf1, 0x02, 0x0f, 0x18, 0xbf, 0xbb, 0xf1, 0x01, 0x0f, + 0x05, 0xd1, 0x00, 0x98, 0x41, 0x5d, 0xe0, 0xb2, 0x00, 0xf0, 0x60, 0xf8, + 0x04, 0xe0, 0x00, 0x98, 0x41, 0x5d, 0xe0, 0xb2, 0x00, 0xf0, 0x5a, 0xf8, + 0x5f, 0xea, 0x00, 0x08, 0x35, 0xd1, 0x06, 0xf1, 0x15, 0x00, 0x77, 0x1c, + 0x05, 0x78, 0x00, 0x23, 0x00, 0xf0, 0x4c, 0xf8, 0x01, 0x23, 0x00, 0xf0, + 0x49, 0xf8, 0x01, 0x20, 0xf7, 0xf7, 0xc0, 0xfa, 0x05, 0x20, 0xf7, 0xf7, + 0xca, 0xf9, 0xc5, 0xf3, 0x42, 0x00, 0x02, 0x21, 0x08, 0x30, 0x81, 0x40, + 0x00, 0x23, 0x00, 0x22, 0x05, 0x20, 0xf7, 0xf7, 0xca, 0xf9, 0x00, 0x25, + 0x06, 0xf1, 0x18, 0x00, 0x00, 0x78, 0xc0, 0xf3, 0x00, 0x10, 0x48, 0xb1, + 0x01, 0x20, 0xf7, 0xf7, 0xa9, 0xfa, 0x06, 0xf1, 0x21, 0x00, 0x00, 0x78, + 0xc0, 0xf3, 0x40, 0x10, 0x00, 0xb1, 0x01, 0x25, 0x05, 0x20, 0xf7, 0xf7, + 0x8a, 0xfa, 0x08, 0xb1, 0x28, 0x00, 0x0f, 0xd0, 0x28, 0x00, 0xe7, 0xd0, + 0x05, 0x20, 0xf7, 0xf7, 0x22, 0xfa, 0x64, 0x1c, 0xe0, 0xb2, 0x08, 0x28, + 0x03, 0xd2, 0xb8, 0xf1, 0x00, 0x0f, 0x3f, 0xf4, 0x33, 0xaf, 0x40, 0x46, + 0xbd, 0xe8, 0xf2, 0x8f, 0x40, 0xf6, 0x0a, 0x48, 0xee, 0xe7, 0x00, 0x00, + 0x01, 0x80, 0x08, 0x48, 0x05, 0x80, 0x08, 0x48, 0xd9, 0xdf, 0x3d, 0x00, + 0x40, 0x9a, 0x04, 0x02, 0x40, 0x76, 0x02, 0x21, 0x00, 0x65, 0xcd, 0x1d, + 0x00, 0xca, 0x9a, 0x3b, 0x01, 0x22, 0x00, 0x21, 0x38, 0x46, 0xbf, 0xe6, + 0x10, 0xb5, 0x04, 0x46, 0x03, 0x21, 0xe9, 0xf7, 0x09, 0xfc, 0x00, 0x21, + 0x20, 0x46, 0xe9, 0xf7, 0x14, 0xfc, 0x01, 0x21, 0x20, 0x46, 0xe9, 0xf7, + 0xf8, 0xfb, 0x0f, 0x21, 0x20, 0x46, 0xe9, 0xf7, 0x15, 0xfc, 0x00, 0x21, + 0x20, 0x46, 0xe9, 0xf7, 0x62, 0xfc, 0x1f, 0x21, 0x20, 0x46, 0xe9, 0xf7, + 0x36, 0xfc, 0x0f, 0x21, 0x20, 0x46, 0xe9, 0xf7, 0x3d, 0xfc, 0x0f, 0x21, + 0x20, 0x46, 0xe9, 0xf7, 0x42, 0xfc, 0x0f, 0x21, 0x20, 0x46, 0xe9, 0xf7, + 0x47, 0xfc, 0x00, 0x21, 0x20, 0x46, 0xe9, 0xf7, 0x57, 0xfc, 0x10, 0x21, + 0x20, 0x46, 0xe9, 0xf7, 0x6d, 0xfc, 0x08, 0x21, 0x20, 0x46, 0xe9, 0xf7, + 0x93, 0xfc, 0x20, 0x46, 0xe9, 0xf7, 0x0d, 0xff, 0x00, 0x21, 0x20, 0x46, + 0xe9, 0xf7, 0xa8, 0xfc, 0x00, 0x20, 0x10, 0xbd, 0x80, 0xb5, 0x4f, 0xf4, + 0x8c, 0x61, 0xdf, 0xf8, 0x10, 0x08, 0xf0, 0xf7, 0xed, 0xfc, 0xef, 0xf7, + 0x69, 0xfc, 0x00, 0x20, 0x02, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, 0x04, 0x46, + 0x18, 0x21, 0x65, 0x68, 0xdf, 0xf8, 0xf8, 0x67, 0xdf, 0xf8, 0xf8, 0x87, + 0x69, 0x43, 0x58, 0x20, 0x68, 0x43, 0x08, 0xeb, 0x00, 0x07, 0x70, 0x18, + 0x00, 0xf5, 0xcc, 0x72, 0xa2, 0x61, 0x00, 0xf5, 0xfc, 0x70, 0xe7, 0x62, + 0xe0, 0x61, 0xdf, 0xf8, 0xe0, 0x17, 0x22, 0x68, 0x51, 0xf8, 0x22, 0x00, + 0x38, 0x60, 0x21, 0x68, 0x79, 0x60, 0x00, 0x21, 0x60, 0x68, 0xb8, 0x60, + 0xa1, 0x62, 0x40, 0xf2, 0x3c, 0x60, 0x68, 0x43, 0x26, 0x63, 0x40, 0x44, + 0xbe, 0x63, 0x00, 0xf5, 0xb8, 0x60, 0x60, 0x63, 0xf8, 0x63, 0x4f, 0xf4, + 0x16, 0x71, 0xf0, 0xf7, 0xb9, 0xfc, 0xdf, 0xf8, 0xb0, 0x27, 0x11, 0x68, + 0xfa, 0x6b, 0x41, 0xf2, 0x01, 0x00, 0x0b, 0x5c, 0x53, 0x75, 0x2c, 0x20, + 0x23, 0x68, 0x43, 0x43, 0xc8, 0x18, 0xf9, 0x6b, 0x90, 0xf8, 0x41, 0x0e, + 0x88, 0x75, 0x41, 0xf6, 0xb0, 0x62, 0x14, 0x20, 0x68, 0x43, 0x40, 0x44, + 0x10, 0x44, 0xa0, 0x63, 0x38, 0x64, 0x4f, 0xf4, 0xb6, 0x72, 0x14, 0x20, + 0x60, 0x62, 0x06, 0xf5, 0x16, 0x70, 0x39, 0x6c, 0x21, 0x62, 0xe0, 0x63, + 0x78, 0x64, 0x4f, 0xf4, 0x8c, 0x61, 0x08, 0xf5, 0xb0, 0x70, 0xb8, 0x64, + 0xf9, 0x64, 0x00, 0x20, 0xa0, 0x60, 0x6a, 0x43, 0xdf, 0xf8, 0x5c, 0x07, + 0xa0, 0x65, 0x78, 0x61, 0x42, 0x44, 0x60, 0x69, 0x00, 0xf1, 0x0d, 0x01, + 0x39, 0x65, 0x43, 0xf2, 0x48, 0x21, 0xdf, 0xf8, 0x4c, 0x07, 0x20, 0x65, + 0xf8, 0x60, 0xdf, 0xf8, 0x48, 0x07, 0x60, 0x65, 0x38, 0x61, 0xdf, 0xf8, + 0x44, 0x07, 0xe0, 0x65, 0xb8, 0x61, 0xdf, 0xf8, 0x40, 0x07, 0x20, 0x66, + 0xf8, 0x61, 0xdf, 0xf8, 0x3c, 0x07, 0x00, 0x6b, 0x60, 0x66, 0x38, 0x62, + 0x43, 0xf2, 0x28, 0x20, 0x30, 0x18, 0xa0, 0x66, 0x78, 0x62, 0x70, 0x18, + 0xe0, 0x66, 0xb8, 0x62, 0x4c, 0x20, 0x68, 0x43, 0x40, 0x44, 0x00, 0xf5, + 0xf8, 0x51, 0x42, 0xf2, 0x30, 0x00, 0x10, 0x44, 0x38, 0x63, 0xf9, 0x62, + 0x00, 0x21, 0xf8, 0x6b, 0x80, 0xf8, 0xde, 0x14, 0xe8, 0xb2, 0xee, 0xf7, + 0x71, 0xfa, 0x01, 0x28, 0x04, 0xbf, 0xf9, 0x6b, 0x81, 0xf8, 0xde, 0x04, + 0x00, 0x20, 0x78, 0x65, 0x12, 0x20, 0xff, 0xf7, 0x1b, 0xfd, 0x18, 0xb1, + 0x78, 0x6d, 0x40, 0xf0, 0x02, 0x00, 0x78, 0x65, 0x38, 0x46, 0xbd, 0xe8, + 0xf0, 0x41, 0x00, 0x21, 0xef, 0xf7, 0xc3, 0xbb, 0x2d, 0xe9, 0xfe, 0x4f, + 0x80, 0x46, 0x8b, 0x46, 0x2c, 0x20, 0xdf, 0xf8, 0xb4, 0x16, 0x91, 0x46, + 0x00, 0xfb, 0x08, 0xf0, 0x01, 0x90, 0x1e, 0x46, 0x0a, 0x68, 0x10, 0x44, + 0x4f, 0xf0, 0x00, 0x0a, 0x90, 0xf8, 0x41, 0x4e, 0xeb, 0xf7, 0xc5, 0xfe, + 0xbb, 0xf1, 0x00, 0x0f, 0x04, 0xbf, 0x04, 0xf0, 0x01, 0x01, 0x91, 0xea, + 0x00, 0x0f, 0x00, 0xf0, 0xea, 0x80, 0x01, 0x27, 0x04, 0xf0, 0x06, 0x00, + 0xbb, 0xf1, 0x00, 0x0f, 0x00, 0x90, 0xdf, 0xf8, 0x6c, 0x56, 0x16, 0xd0, + 0x00, 0x2c, 0x18, 0xbf, 0x01, 0x2c, 0x12, 0xd1, 0xdf, 0xf8, 0x68, 0x06, + 0x01, 0x9a, 0x01, 0x68, 0x0a, 0x44, 0xd2, 0xf8, 0x45, 0x7e, 0xb8, 0xb2, + 0x40, 0xb1, 0x5f, 0xfa, 0x88, 0xf0, 0xf0, 0xf7, 0x6e, 0xf9, 0x80, 0x68, + 0x05, 0xeb, 0x40, 0x01, 0xa1, 0xf8, 0x94, 0x70, 0x00, 0x27, 0xb9, 0xf1, + 0x00, 0x0f, 0x11, 0xd1, 0x00, 0x98, 0x24, 0xf0, 0x06, 0x01, 0x08, 0xb9, + 0x02, 0x20, 0x02, 0xe0, 0x06, 0x28, 0x09, 0xd1, 0x00, 0x20, 0x01, 0x43, + 0x00, 0x98, 0x06, 0x28, 0x0c, 0xbf, 0x04, 0x20, 0x00, 0x20, 0x00, 0x2e, + 0x40, 0xea, 0x01, 0x04, 0x40, 0xf0, 0x9f, 0x80, 0xc5, 0xf8, 0x00, 0xa0, + 0xa8, 0x22, 0x6b, 0x68, 0x0c, 0x98, 0xdf, 0xf8, 0x28, 0x16, 0x0b, 0x43, + 0x6b, 0x60, 0x05, 0xf1, 0x75, 0x06, 0xea, 0x75, 0x38, 0x21, 0xb1, 0x71, + 0x4f, 0xf0, 0xff, 0x0c, 0xfe, 0x22, 0x86, 0xf8, 0x00, 0xc0, 0x32, 0x71, + 0x41, 0xf2, 0x7c, 0x52, 0xe9, 0x6b, 0x41, 0xf0, 0x00, 0x41, 0x41, 0xf0, + 0x04, 0x01, 0xe9, 0x63, 0x6f, 0xf0, 0x03, 0x03, 0x05, 0xf1, 0xdc, 0x01, + 0x05, 0xf1, 0x50, 0x0e, 0xca, 0x83, 0x0b, 0x84, 0x08, 0x23, 0xdf, 0xf8, + 0xec, 0x25, 0x4a, 0x62, 0x05, 0xf2, 0x23, 0x12, 0x13, 0x70, 0x81, 0x23, + 0x93, 0x73, 0x82, 0xf8, 0x05, 0x90, 0x0d, 0x23, 0x93, 0x71, 0x05, 0x23, + 0x85, 0xf8, 0x74, 0x31, 0x6f, 0xf0, 0x05, 0x03, 0x38, 0xb3, 0x01, 0x20, + 0x8e, 0xf8, 0x04, 0x00, 0x86, 0xf8, 0x0a, 0xc0, 0x1c, 0x20, 0x8e, 0xf8, + 0x00, 0x00, 0x0a, 0x26, 0x44, 0xf2, 0x10, 0x20, 0xae, 0xf8, 0x02, 0x00, + 0x8e, 0xf8, 0x13, 0x60, 0x4f, 0xf6, 0xf0, 0x70, 0xae, 0xf8, 0x22, 0x00, + 0x4f, 0xf4, 0xfa, 0x66, 0x32, 0x20, 0x8e, 0xf8, 0x15, 0x00, 0xae, 0xf8, + 0x1c, 0x00, 0x4e, 0x82, 0x3c, 0x20, 0x8e, 0xf8, 0x1e, 0x00, 0x8b, 0x82, + 0x40, 0xf6, 0x2e, 0x10, 0x08, 0x83, 0x4b, 0x83, 0x04, 0x21, 0x85, 0xf8, + 0x44, 0x11, 0x11, 0x72, 0x3e, 0xe0, 0x0d, 0x98, 0x10, 0xb1, 0x45, 0x20, + 0x8e, 0xf8, 0x00, 0x00, 0x39, 0x20, 0xb0, 0x71, 0x4f, 0xf0, 0x19, 0x0c, + 0x14, 0x20, 0xae, 0xf8, 0x10, 0x00, 0x8e, 0xf8, 0x0b, 0xc0, 0x32, 0x20, + 0x8e, 0xf8, 0x13, 0x00, 0xae, 0xf8, 0x0c, 0x00, 0xae, 0xf8, 0x0e, 0x00, + 0x45, 0xf6, 0x48, 0x0c, 0x1e, 0x20, 0x8e, 0xf8, 0x15, 0x00, 0xa1, 0xf8, + 0x06, 0xc0, 0x4f, 0xf6, 0xff, 0x70, 0xae, 0xf8, 0x1c, 0x00, 0x4f, 0xf0, + 0x32, 0x0e, 0x86, 0xf8, 0x0d, 0xe0, 0x45, 0xf6, 0x3c, 0x26, 0x0e, 0x80, + 0x6f, 0xf0, 0x09, 0x06, 0x4e, 0x80, 0x0e, 0x81, 0x05, 0xf1, 0x84, 0x06, + 0x30, 0x80, 0x70, 0x80, 0x41, 0xf2, 0xeb, 0x60, 0xb0, 0x80, 0x6f, 0xf0, + 0x02, 0x00, 0xf0, 0x80, 0xb3, 0x81, 0x43, 0xf2, 0xbd, 0x10, 0x70, 0x81, + 0x0f, 0x20, 0xdf, 0xf8, 0x08, 0x35, 0x4b, 0x62, 0x10, 0x72, 0x05, 0x21, + 0x51, 0x72, 0xa0, 0x07, 0x07, 0xd5, 0x37, 0xb1, 0x4f, 0xf4, 0x80, 0x72, + 0x29, 0x46, 0x40, 0x46, 0x00, 0xf0, 0x16, 0xfa, 0x82, 0x46, 0x60, 0x07, + 0x07, 0xd5, 0x37, 0xb1, 0x98, 0x22, 0x05, 0xf5, 0x80, 0x71, 0x40, 0x46, + 0x00, 0xf0, 0x0c, 0xfa, 0x82, 0x46, 0x50, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, + 0x1c, 0xb5, 0x00, 0xf0, 0x19, 0xf8, 0x12, 0xbf, 0x4f, 0xf4, 0x80, 0x71, + 0x04, 0xf5, 0x80, 0x74, 0x98, 0x21, 0x02, 0x46, 0x20, 0x46, 0xf6, 0xf7, + 0x68, 0xfd, 0x16, 0xbd, 0x1c, 0xb5, 0x00, 0xf0, 0x0b, 0xf8, 0x12, 0xbf, + 0x4f, 0xf4, 0x80, 0x71, 0x04, 0xf5, 0x80, 0x74, 0x98, 0x21, 0x02, 0x46, + 0x20, 0x46, 0xf6, 0xf7, 0x45, 0xfd, 0x16, 0xbd, 0x0b, 0x46, 0x04, 0x99, + 0xdf, 0xf8, 0x60, 0x44, 0x00, 0x92, 0x00, 0x29, 0x70, 0x47, 0x10, 0xb5, + 0x04, 0x46, 0x0f, 0xf2, 0x90, 0x42, 0x23, 0x68, 0x0c, 0x21, 0x03, 0x20, + 0xec, 0xf7, 0x85, 0xfe, 0x00, 0x21, 0xa1, 0x60, 0xe0, 0x6a, 0xa1, 0x6a, + 0xef, 0xf7, 0x87, 0xfa, 0x90, 0xb9, 0x62, 0x68, 0xdf, 0xf8, 0x68, 0x14, + 0x88, 0x5c, 0x00, 0x28, 0x14, 0xbf, 0x17, 0x22, 0x01, 0x22, 0x02, 0x21, + 0x20, 0x46, 0x00, 0xf0, 0x3b, 0xf9, 0x28, 0xb9, 0xf6, 0xf7, 0xc4, 0xfc, + 0xa0, 0x64, 0x20, 0x46, 0x00, 0xf0, 0x3a, 0xf9, 0x00, 0xb1, 0xe0, 0x60, + 0x00, 0x20, 0x10, 0xbd, 0x78, 0xb5, 0x0e, 0x46, 0x85, 0xb0, 0x00, 0x24, + 0x05, 0x46, 0x34, 0x60, 0x00, 0xf0, 0x88, 0xf9, 0xf6, 0xf7, 0xb2, 0xfc, + 0x05, 0xf1, 0x48, 0x02, 0x11, 0x68, 0x40, 0x1a, 0x50, 0x60, 0x95, 0xf8, + 0x46, 0x00, 0x2b, 0x68, 0x06, 0x28, 0x06, 0xd1, 0x0f, 0xf2, 0x34, 0x42, + 0x0c, 0x21, 0x03, 0x20, 0xec, 0xf7, 0x4d, 0xfe, 0x0b, 0xe0, 0x29, 0x69, + 0x02, 0x91, 0x0c, 0x21, 0xea, 0x68, 0x01, 0x92, 0x00, 0x90, 0x03, 0x20, + 0xdf, 0xf8, 0xfc, 0x23, 0xec, 0xf7, 0x41, 0xfe, 0xec, 0x68, 0x95, 0xf8, + 0x46, 0x00, 0x06, 0x28, 0x05, 0xd0, 0x00, 0x22, 0x05, 0x21, 0x28, 0x46, + 0x00, 0xf0, 0x00, 0xf9, 0x04, 0x43, 0x2c, 0xb1, 0xec, 0x60, 0x28, 0x46, + 0x00, 0xf0, 0x80, 0xf8, 0x30, 0x60, 0x28, 0xb9, 0x69, 0x69, 0x48, 0x7a, + 0x10, 0xb1, 0x28, 0x46, 0x00, 0xf0, 0x27, 0xf8, 0x29, 0x6a, 0x14, 0x22, + 0x68, 0x46, 0xde, 0xf7, 0xdf, 0xf8, 0xa8, 0x69, 0x02, 0x99, 0x81, 0x60, + 0xea, 0x68, 0xdf, 0xf8, 0xb0, 0x13, 0x42, 0x61, 0x00, 0x20, 0x6a, 0x68, + 0x88, 0x54, 0x01, 0x20, 0x06, 0xb0, 0x70, 0xbd, 0x70, 0xb5, 0x04, 0x46, + 0x00, 0x25, 0xdf, 0xf8, 0x98, 0x63, 0x24, 0xfa, 0x05, 0xf0, 0xc0, 0x07, + 0x06, 0xd5, 0x28, 0x46, 0xec, 0xf7, 0x21, 0xfd, 0xff, 0x28, 0x1c, 0xbf, + 0x01, 0x21, 0x31, 0x54, 0x6d, 0x1c, 0x08, 0x2d, 0xf1, 0xd3, 0x70, 0xbd, + 0x00, 0xbf, 0x2d, 0xe9, 0xf8, 0x41, 0x04, 0x46, 0x85, 0xb0, 0x00, 0x26, + 0xc4, 0xf8, 0xcc, 0x60, 0xa6, 0x60, 0x01, 0x22, 0x03, 0x21, 0x00, 0xf0, + 0xbf, 0xf8, 0x05, 0x00, 0x0f, 0xf2, 0x90, 0x38, 0x22, 0xd1, 0x60, 0x69, + 0x01, 0x7b, 0x01, 0x29, 0x0c, 0xbf, 0x01, 0x27, 0x00, 0x27, 0x06, 0xf0, + 0xf5, 0xfe, 0x01, 0x28, 0x18, 0xbf, 0x00, 0x20, 0x07, 0x42, 0x15, 0xd1, + 0x20, 0x46, 0x00, 0xf0, 0xb1, 0xf8, 0x05, 0x46, 0x20, 0x46, 0x00, 0xf0, + 0x07, 0xf9, 0x94, 0xf8, 0x46, 0x00, 0x00, 0x90, 0x42, 0x46, 0x23, 0x68, + 0x0c, 0x21, 0x04, 0x20, 0xec, 0xf7, 0xd5, 0xfd, 0x25, 0xb9, 0x94, 0xf8, + 0x46, 0x00, 0x09, 0x28, 0xdd, 0xd1, 0x0f, 0xe0, 0x94, 0xf8, 0x46, 0x00, + 0x09, 0x28, 0x05, 0xd0, 0x00, 0x22, 0x05, 0x21, 0x20, 0x46, 0x00, 0xf0, + 0x8f, 0xf8, 0x05, 0x43, 0x25, 0xb1, 0xe5, 0x60, 0x20, 0x46, 0x00, 0xf0, + 0x0f, 0xf8, 0x06, 0x46, 0x21, 0x6a, 0x14, 0x22, 0x68, 0x46, 0xde, 0xf7, + 0x75, 0xf8, 0xe0, 0x69, 0x02, 0x99, 0x81, 0x60, 0xe2, 0x68, 0x42, 0x61, + 0x30, 0x46, 0x06, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, 0x10, 0xb5, 0x04, 0x46, + 0x01, 0x20, 0xa0, 0x60, 0x00, 0x21, 0x00, 0x20, 0xe2, 0x68, 0xca, 0x40, + 0xd3, 0x07, 0x03, 0xd4, 0x49, 0x1c, 0x20, 0x29, 0xf8, 0xd3, 0x63, 0xe0, + 0x01, 0x20, 0x00, 0xfa, 0x01, 0xf1, 0x01, 0x29, 0x59, 0xd0, 0x02, 0x29, + 0x54, 0xd0, 0x04, 0x29, 0x4f, 0xd0, 0x08, 0x29, 0x4a, 0xd0, 0x10, 0x29, + 0x21, 0xd0, 0x20, 0x29, 0x40, 0xd0, 0x40, 0x29, 0x3b, 0xd0, 0x80, 0x29, + 0x36, 0xd0, 0xb1, 0xf5, 0x80, 0x7f, 0x30, 0xd0, 0xb1, 0xf5, 0x00, 0x7f, + 0x2a, 0xd0, 0xb1, 0xf5, 0x80, 0x6f, 0x24, 0xd0, 0xb1, 0xf5, 0x00, 0x6f, + 0x1e, 0xd0, 0xb1, 0xf5, 0x80, 0x5f, 0x18, 0xd0, 0xb1, 0xf5, 0x00, 0x5f, + 0x12, 0xd0, 0xb1, 0xf5, 0x80, 0x4f, 0x0c, 0xd0, 0xb1, 0xf5, 0x80, 0x3f, + 0x06, 0xd0, 0xb1, 0xf5, 0x80, 0x2f, 0x24, 0xd0, 0x32, 0xe0, 0x40, 0xf6, + 0x05, 0x40, 0x31, 0xe0, 0x40, 0xf6, 0x12, 0x40, 0x2e, 0xe0, 0x40, 0xf6, + 0x0f, 0x40, 0x2b, 0xe0, 0x40, 0xf6, 0x0e, 0x40, 0x28, 0xe0, 0x40, 0xf6, + 0x0d, 0x40, 0x25, 0xe0, 0x40, 0xf6, 0x0c, 0x40, 0x22, 0xe0, 0x40, 0xf6, + 0x0b, 0x40, 0x1f, 0xe0, 0x40, 0xf6, 0x0a, 0x40, 0x1c, 0xe0, 0x40, 0xf6, + 0x09, 0x40, 0x19, 0xe0, 0x40, 0xf6, 0x08, 0x40, 0x16, 0xe0, 0x40, 0xf6, + 0x07, 0x40, 0x13, 0xe0, 0x40, 0xf6, 0x06, 0x40, 0x10, 0xe0, 0x40, 0xf6, + 0x14, 0x40, 0x0d, 0xe0, 0x40, 0xf6, 0x04, 0x40, 0x0a, 0xe0, 0x40, 0xf6, + 0x03, 0x40, 0x07, 0xe0, 0x40, 0xf6, 0x02, 0x40, 0x04, 0xe0, 0x40, 0xf6, + 0x01, 0x40, 0x01, 0xe0, 0x4f, 0xf4, 0x41, 0x60, 0x20, 0x61, 0x01, 0x46, + 0x01, 0x22, 0x01, 0x20, 0xfa, 0xf7, 0xb0, 0xf8, 0x20, 0x69, 0x10, 0xbd, + 0x2c, 0x30, 0x01, 0x76, 0x42, 0x76, 0x00, 0x68, 0xef, 0xf7, 0xad, 0xbe, + 0x2d, 0xe9, 0xfc, 0x41, 0x06, 0x46, 0x00, 0x22, 0x01, 0x21, 0x00, 0xf0, + 0x66, 0xf8, 0x00, 0x28, 0x3e, 0xd1, 0xf4, 0x6a, 0x67, 0x68, 0x00, 0x21, + 0xad, 0xf8, 0x00, 0x10, 0x00, 0xf0, 0x42, 0xf8, 0x00, 0x28, 0x35, 0xd1, + 0x6a, 0x46, 0x0d, 0xf1, 0x01, 0x01, 0xf8, 0xb2, 0xea, 0xf7, 0x09, 0xfe, + 0x80, 0x46, 0x04, 0xf1, 0x34, 0x00, 0x01, 0x78, 0x07, 0x29, 0x04, 0xbf, + 0x40, 0x78, 0x1b, 0x28, 0x04, 0xd1, 0xe1, 0x6a, 0x08, 0x78, 0x08, 0xb1, + 0x01, 0x24, 0x03, 0xe0, 0x00, 0xf0, 0x2e, 0xf8, 0x00, 0x24, 0xe8, 0xb9, + 0x9d, 0xf8, 0x00, 0x00, 0x80, 0x45, 0x1c, 0xbf, 0x01, 0x20, 0xdd, 0xf7, + 0xaf, 0xfb, 0xf0, 0x6a, 0xef, 0xf7, 0x3e, 0xf9, 0x05, 0x00, 0x01, 0xd1, + 0x0c, 0xb1, 0x0a, 0xe0, 0x14, 0xb9, 0x00, 0xf0, 0x17, 0xf8, 0x40, 0xb9, + 0x9d, 0xf8, 0x00, 0x20, 0x9d, 0xf8, 0x01, 0x10, 0xf8, 0xb2, 0xea, 0xf7, + 0xe0, 0xfd, 0x00, 0xf0, 0x11, 0xf8, 0x00, 0x22, 0x00, 0xf0, 0x0f, 0xf8, + 0x28, 0xb1, 0x03, 0x22, 0x4f, 0xf6, 0x70, 0x71, 0x01, 0x20, 0xfa, 0xf7, + 0x59, 0xf8, 0x28, 0x46, 0xbd, 0xe8, 0xf6, 0x81, 0x01, 0x22, 0x01, 0x21, + 0x30, 0x46, 0x16, 0xe0, 0x01, 0x22, 0x00, 0x21, 0x30, 0x46, 0x12, 0xe0, + 0x10, 0xb5, 0x00, 0xf1, 0x2c, 0x04, 0x20, 0x68, 0x90, 0xf8, 0x36, 0x00, + 0xa0, 0x76, 0x10, 0xbd, 0xc0, 0x6a, 0xef, 0xf7, 0xa1, 0xbe, 0x38, 0x4a, + 0x13, 0x68, 0x2c, 0x21, 0x48, 0x43, 0x18, 0x44, 0x90, 0xf8, 0x41, 0x0e, + 0x70, 0x47, 0x10, 0xb5, 0x13, 0x46, 0x00, 0x22, 0x00, 0x2b, 0x14, 0xbf, + 0x43, 0x6f, 0x03, 0x6f, 0xdc, 0xb2, 0x01, 0x2c, 0x0c, 0xd0, 0x40, 0x69, + 0x02, 0x69, 0x21, 0xb1, 0x01, 0x21, 0xd8, 0xb2, 0xeb, 0xf7, 0x7c, 0xfd, + 0x03, 0xe0, 0x11, 0x46, 0xd8, 0xb2, 0xeb, 0xf7, 0xbd, 0xfd, 0x02, 0x46, + 0x10, 0x46, 0x10, 0xbd, 0x24, 0x48, 0x70, 0x47, 0x2d, 0xe9, 0xfe, 0x43, + 0x88, 0x46, 0x2c, 0x21, 0x91, 0x46, 0x04, 0x46, 0x4c, 0x43, 0x23, 0x4a, + 0x12, 0x68, 0x11, 0x19, 0x00, 0x20, 0x91, 0xf8, 0x41, 0x5e, 0xed, 0x08, + 0x15, 0x2d, 0x28, 0xbf, 0x40, 0xf6, 0x03, 0x40, 0x02, 0xf6, 0x2d, 0x47, + 0x00, 0x26, 0x1d, 0xe0, 0x38, 0x19, 0x71, 0x08, 0x00, 0xeb, 0x81, 0x00, + 0x00, 0xf5, 0x06, 0x73, 0x71, 0x00, 0x01, 0xf0, 0x02, 0x01, 0x1a, 0x68, + 0x49, 0x1c, 0xc9, 0x00, 0x22, 0xfa, 0x01, 0xf0, 0x8d, 0xf8, 0x04, 0x00, + 0x01, 0xa9, 0x30, 0x01, 0x00, 0x91, 0x00, 0xf0, 0x10, 0x00, 0xc2, 0x40, + 0x01, 0x23, 0x02, 0xf0, 0xff, 0x02, 0x49, 0x46, 0x40, 0x46, 0xf6, 0xf7, + 0x3a, 0xfb, 0x76, 0x1c, 0xae, 0x42, 0x01, 0xda, 0x00, 0x28, 0xdd, 0xd0, + 0xbd, 0xe8, 0xfe, 0x83, 0x80, 0xb5, 0xc0, 0xb2, 0xed, 0xf7, 0x0c, 0xff, + 0x28, 0xb9, 0x04, 0x48, 0xb0, 0xf8, 0x34, 0x11, 0xc9, 0x01, 0xa0, 0xf8, + 0x34, 0x11, 0x01, 0xbd, 0xa8, 0xf6, 0x02, 0x21, 0xac, 0x57, 0x00, 0x21, + 0x48, 0xf5, 0x02, 0x21, 0x40, 0x9a, 0x04, 0x02, 0x5c, 0x75, 0x02, 0x21, + 0xdd, 0x9a, 0x02, 0x02, 0x79, 0xe0, 0x01, 0x02, 0x7d, 0xe0, 0x01, 0x02, + 0x81, 0xe0, 0x01, 0x02, 0x9d, 0xe0, 0x01, 0x02, 0x24, 0x73, 0x03, 0x21, + 0x20, 0x1a, 0x03, 0x00, 0x10, 0x18, 0x04, 0x00, 0x30, 0x18, 0x04, 0x00, + 0x20, 0x76, 0x02, 0x21, 0x90, 0x1e, 0x00, 0x02, 0x53, 0x65, 0x72, 0x64, + 0x65, 0x73, 0x3a, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x6c, 0x61, + 0x6e, 0x65, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x69, 0x74, + 0x3a, 0x20, 0x6c, 0x61, 0x6e, 0x65, 0x25, 0x64, 0x2c, 0x20, 0x46, 0x47, + 0x5f, 0x44, 0x4f, 0x4e, 0x45, 0x0a, 0x00, 0x00, 0x20, 0x6c, 0x61, 0x6e, + 0x65, 0x25, 0x64, 0x2c, 0x20, 0x66, 0x73, 0x6d, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x38, 0xb5, 0x04, 0x46, + 0x12, 0xb1, 0xfe, 0x29, 0xa8, 0xbf, 0x11, 0x7a, 0x08, 0x00, 0x1b, 0xd0, + 0x0a, 0x29, 0x19, 0xd2, 0xdf, 0xf8, 0xac, 0x2b, 0x02, 0xeb, 0x81, 0x03, + 0x1d, 0x1f, 0x20, 0x46, 0x29, 0x78, 0xea, 0xf7, 0x14, 0xfc, 0xa9, 0x78, + 0x20, 0x46, 0xea, 0xf7, 0x12, 0xfc, 0x69, 0x78, 0x20, 0x46, 0xea, 0xf7, + 0x10, 0xfc, 0xe9, 0x78, 0x20, 0x46, 0xea, 0xf7, 0x0e, 0xfc, 0x20, 0x46, + 0xbd, 0xe8, 0x32, 0x40, 0xea, 0xf7, 0x0b, 0xbc, 0x31, 0xbd, 0xf8, 0xb5, + 0x01, 0x29, 0x05, 0x46, 0x4f, 0xf0, 0xff, 0x37, 0xdf, 0xf8, 0x70, 0x4b, + 0x1b, 0xd1, 0x00, 0xf0, 0x1f, 0xf8, 0x06, 0x46, 0xa8, 0x6b, 0x90, 0xf8, + 0x79, 0x10, 0xfe, 0x29, 0x10, 0xd1, 0xe8, 0x6b, 0xc1, 0x68, 0x60, 0x68, + 0x81, 0x42, 0x04, 0xbf, 0x61, 0x88, 0x8e, 0x42, 0x04, 0xd0, 0x22, 0x46, + 0xff, 0x21, 0x28, 0x46, 0x00, 0xf0, 0x1f, 0xf8, 0xe8, 0x6b, 0xc7, 0x68, + 0x66, 0x80, 0x04, 0xe0, 0x6a, 0x20, 0x20, 0x70, 0x01, 0xe0, 0x0f, 0x21, + 0x21, 0x70, 0x67, 0x60, 0x20, 0x78, 0xf2, 0xbd, 0x01, 0x46, 0x88, 0x6b, + 0x89, 0x68, 0x00, 0xf1, 0x50, 0x03, 0x18, 0x79, 0x1a, 0x78, 0x03, 0xeb, + 0x41, 0x03, 0x00, 0x01, 0x00, 0xf4, 0x70, 0x60, 0xb3, 0xf8, 0x44, 0x10, + 0x10, 0x43, 0x0a, 0x00, 0x18, 0xbf, 0x08, 0x46, 0x70, 0x47, 0x2d, 0xe9, + 0xf6, 0x4f, 0x89, 0xb0, 0x81, 0x6b, 0x01, 0xf1, 0x50, 0x02, 0x02, 0xf1, + 0x2b, 0x01, 0x00, 0x24, 0x0b, 0x78, 0xc3, 0xf3, 0x01, 0x13, 0x8d, 0xf8, + 0x05, 0x30, 0x4f, 0xf0, 0x01, 0x08, 0x09, 0x7a, 0x01, 0xf0, 0x0f, 0x01, + 0x06, 0x91, 0xc3, 0x6b, 0x03, 0x94, 0x03, 0xf5, 0xac, 0x75, 0x05, 0x95, + 0x12, 0x79, 0x02, 0xf0, 0x0f, 0x02, 0x08, 0x92, 0xff, 0xf7, 0xce, 0xff, + 0x05, 0x9a, 0x07, 0x90, 0x02, 0x94, 0x02, 0xf1, 0xc4, 0x05, 0x08, 0x98, + 0x02, 0x99, 0x08, 0xfa, 0x01, 0xf1, 0xc2, 0xb2, 0x0a, 0x42, 0x79, 0xd0, + 0x02, 0x99, 0xdf, 0xf8, 0xb0, 0x0a, 0x01, 0xeb, 0x41, 0x01, 0x4f, 0xf0, + 0x00, 0x0a, 0x47, 0x18, 0x07, 0x98, 0x08, 0xfa, 0x0a, 0xf1, 0x89, 0xb2, + 0x08, 0x42, 0x66, 0xd0, 0x00, 0x26, 0x28, 0x8c, 0x08, 0xfa, 0x06, 0xf1, + 0x08, 0x42, 0x5d, 0xd0, 0x4f, 0xf0, 0x00, 0x09, 0x05, 0x98, 0x00, 0xf1, + 0xe6, 0x01, 0x04, 0x91, 0x08, 0xfa, 0x09, 0xf3, 0x09, 0x78, 0x19, 0x42, + 0x4d, 0xd0, 0x72, 0x1c, 0x06, 0x98, 0x8d, 0xf8, 0x04, 0x20, 0x09, 0xf1, + 0x01, 0x0b, 0x70, 0xb1, 0x00, 0x21, 0x00, 0x91, 0x9d, 0xf8, 0x05, 0x20, + 0x9d, 0xf8, 0x04, 0x00, 0x00, 0x23, 0x5f, 0xfa, 0x8b, 0xf1, 0x02, 0xf0, + 0x43, 0xfa, 0x06, 0x99, 0x88, 0x42, 0x00, 0xd3, 0xb8, 0xbb, 0x00, 0x21, + 0xea, 0x8b, 0x08, 0xfa, 0x01, 0xf3, 0x1a, 0x42, 0x2e, 0xd0, 0x9d, 0xf8, + 0x24, 0x20, 0x03, 0x9b, 0x4f, 0xf0, 0x00, 0x0c, 0x04, 0x98, 0x40, 0x78, + 0x08, 0xfa, 0x0c, 0xfe, 0x10, 0xea, 0x0e, 0x0f, 0x19, 0xd0, 0x20, 0x46, + 0x44, 0x1c, 0xc0, 0xb2, 0x82, 0x42, 0x14, 0xd1, 0x38, 0x78, 0x68, 0x70, + 0x7b, 0x78, 0xab, 0x70, 0x0a, 0xf1, 0x01, 0x03, 0xb8, 0x78, 0xe8, 0x70, + 0x2b, 0x72, 0x48, 0x1c, 0x28, 0x70, 0x85, 0xf8, 0x04, 0xc0, 0x85, 0xf8, + 0x05, 0xc0, 0x2b, 0x46, 0x9d, 0xf8, 0x04, 0x00, 0xa8, 0x71, 0x85, 0xf8, + 0x07, 0xb0, 0x0c, 0xf1, 0x01, 0x0c, 0x5f, 0xfa, 0x8c, 0xf0, 0x08, 0x28, + 0xd8, 0xd3, 0x8d, 0xf8, 0x24, 0x20, 0x03, 0x93, 0x49, 0x1c, 0x10, 0x29, + 0xc8, 0xd3, 0x09, 0xf1, 0x01, 0x09, 0xb9, 0xf1, 0x08, 0x0f, 0xa3, 0xd3, + 0x76, 0x1c, 0x10, 0x2e, 0x99, 0xd3, 0x0a, 0xf1, 0x01, 0x0a, 0xba, 0xf1, + 0x08, 0x0f, 0x8d, 0xd9, 0x02, 0x98, 0x40, 0x1c, 0x03, 0x28, 0x02, 0x90, + 0xff, 0xf4, 0x79, 0xaf, 0x0a, 0x98, 0x00, 0xb1, 0x04, 0x70, 0x03, 0x98, + 0x0b, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x2d, 0xe9, 0xf0, 0x4f, 0x04, 0x46, + 0x87, 0xb0, 0x88, 0x46, 0xa1, 0x6b, 0x17, 0x46, 0x01, 0xf1, 0x50, 0x02, + 0x05, 0x92, 0x4f, 0xf0, 0x00, 0x0a, 0xe1, 0x6b, 0x01, 0xf5, 0xac, 0x72, + 0x05, 0x99, 0x06, 0x92, 0x01, 0xf1, 0x22, 0x06, 0xf2, 0x79, 0xfe, 0x2a, + 0x1c, 0xbf, 0x41, 0x46, 0xff, 0xf7, 0xf9, 0xfe, 0xdf, 0xf8, 0x74, 0x19, + 0x8d, 0xf8, 0x0c, 0x70, 0x07, 0xeb, 0xc7, 0x02, 0x01, 0xeb, 0x02, 0x0b, + 0x06, 0x99, 0x5f, 0xea, 0x08, 0x02, 0x01, 0xf1, 0xc4, 0x07, 0x0c, 0xd1, + 0x9d, 0xf8, 0x0c, 0x10, 0xc0, 0xb2, 0x81, 0x42, 0x06, 0xd2, 0x0b, 0xf5, + 0x6f, 0x7a, 0x09, 0x22, 0x51, 0x46, 0x38, 0x46, 0xdd, 0xf7, 0x94, 0xfd, + 0xae, 0xe0, 0x06, 0x99, 0x75, 0x7a, 0x96, 0xf8, 0x11, 0x90, 0x01, 0xf1, + 0xe6, 0x02, 0x04, 0x92, 0xb2, 0xf9, 0x04, 0x20, 0xad, 0xf8, 0x0e, 0x20, + 0xf1, 0x79, 0xfe, 0x29, 0x0a, 0xd0, 0x9d, 0xf8, 0x0c, 0x10, 0xc0, 0xb2, + 0x81, 0x42, 0x05, 0xd2, 0x09, 0x22, 0x59, 0x46, 0x38, 0x46, 0xdd, 0xf7, + 0x7b, 0xfd, 0xda, 0x46, 0x30, 0x88, 0x38, 0x84, 0x4f, 0xf0, 0x01, 0x0b, + 0x05, 0x99, 0x91, 0xf8, 0x21, 0x00, 0x04, 0x99, 0x08, 0x70, 0x05, 0x98, + 0x41, 0x88, 0xf9, 0x83, 0x05, 0x98, 0x41, 0x78, 0x04, 0x98, 0x41, 0x70, + 0xe8, 0x07, 0x0b, 0xd5, 0xbd, 0xf9, 0x0e, 0x00, 0x22, 0x46, 0x01, 0x21, + 0xdd, 0xf7, 0xd6, 0xfa, 0x38, 0x71, 0x78, 0x71, 0x0b, 0xfa, 0x00, 0xf0, + 0x04, 0x99, 0x48, 0x70, 0x68, 0x07, 0x0d, 0xd5, 0xa1, 0x6b, 0x01, 0xf5, + 0xba, 0x70, 0x00, 0xf0, 0x7b, 0xf8, 0x03, 0x7c, 0x00, 0xf0, 0x72, 0xf8, + 0xb8, 0x71, 0x40, 0x1e, 0x0b, 0xfa, 0x00, 0xf0, 0x38, 0x84, 0x0a, 0xe0, + 0x5f, 0xea, 0xc9, 0x60, 0x07, 0xd5, 0xa1, 0x6b, 0xb8, 0x79, 0x91, 0xf8, + 0x74, 0x11, 0x81, 0x42, 0x38, 0xbf, 0x01, 0x46, 0xb9, 0x71, 0x05, 0x9a, + 0xb9, 0x79, 0x92, 0xf9, 0x05, 0x00, 0x41, 0x18, 0xb9, 0x71, 0x29, 0x07, + 0x16, 0xd5, 0xa0, 0x6b, 0x6f, 0xf0, 0x1d, 0x03, 0x00, 0xf2, 0x87, 0x10, + 0x00, 0x21, 0x64, 0x22, 0x00, 0x93, 0x02, 0x91, 0x01, 0x92, 0x01, 0x21, + 0x43, 0x78, 0x02, 0x78, 0xbd, 0xf9, 0x0e, 0x00, 0xdd, 0xf7, 0xae, 0xfa, + 0xf8, 0x71, 0x40, 0x1e, 0x04, 0x99, 0x0b, 0xfa, 0x00, 0xf0, 0x08, 0x70, + 0xa8, 0x07, 0x0d, 0xd5, 0xa1, 0x6b, 0x01, 0xf5, 0xb8, 0x70, 0x00, 0xf0, + 0x41, 0xf8, 0x43, 0x7d, 0x00, 0xf0, 0x38, 0xf8, 0x38, 0x70, 0x40, 0x1e, + 0x0b, 0xfa, 0x00, 0xf0, 0xf8, 0x83, 0x0a, 0xe0, 0x5f, 0xea, 0x89, 0x60, + 0x07, 0xd5, 0xa1, 0x6b, 0x38, 0x78, 0x91, 0xf8, 0x70, 0x11, 0x81, 0x42, + 0x38, 0xbf, 0x01, 0x46, 0x39, 0x70, 0xf0, 0x79, 0xfe, 0x28, 0x08, 0xbf, + 0xb8, 0xf1, 0x01, 0x0f, 0x0c, 0xd1, 0x01, 0x21, 0x20, 0x46, 0xff, 0xf7, + 0x48, 0xfe, 0x9d, 0xf8, 0x0c, 0x10, 0x81, 0x42, 0x04, 0xd2, 0x00, 0x22, + 0x20, 0x46, 0xff, 0xf7, 0x7c, 0xfe, 0x82, 0x46, 0xa0, 0x6b, 0xd0, 0xf8, + 0x00, 0x11, 0xc8, 0x04, 0x0a, 0xd5, 0x00, 0x21, 0x00, 0x91, 0x03, 0x23, + 0x06, 0x98, 0x00, 0xf1, 0xcb, 0x02, 0x00, 0xf1, 0xca, 0x01, 0x20, 0x46, + 0x02, 0xf0, 0x2d, 0xf9, 0x50, 0x46, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x02, 0x78, 0xbd, 0xf9, 0x0e, 0x00, 0x01, 0x21, 0xdd, 0xf7, 0x60, 0xba, + 0x64, 0x23, 0x00, 0x22, 0x01, 0x93, 0x6f, 0xf0, 0x1d, 0x01, 0x02, 0x92, + 0x00, 0x91, 0x70, 0x47, 0x38, 0xb5, 0x1c, 0x46, 0xff, 0xf7, 0x07, 0xff, + 0x00, 0x25, 0x20, 0xb1, 0x09, 0x22, 0x21, 0x46, 0xdd, 0xf7, 0xc8, 0xfc, + 0x00, 0xe0, 0x04, 0x25, 0x28, 0x46, 0x32, 0xbd, 0xf0, 0xb5, 0x05, 0x46, + 0x89, 0xb0, 0xea, 0x6b, 0xa8, 0x6b, 0x53, 0x7d, 0x90, 0xf8, 0x79, 0x10, + 0x6c, 0x68, 0x00, 0x26, 0x02, 0x2b, 0x18, 0xbf, 0x90, 0xf8, 0xaa, 0x10, + 0x02, 0xf5, 0x07, 0x77, 0x3a, 0x46, 0xe0, 0xb2, 0xff, 0xf7, 0xd6, 0xfd, + 0x39, 0x46, 0xe0, 0xb2, 0xea, 0xf7, 0xe6, 0xf9, 0x39, 0x46, 0xe0, 0xb2, + 0xea, 0xf7, 0xe5, 0xf9, 0x39, 0x46, 0xe0, 0xb2, 0xea, 0xf7, 0xcf, 0xf9, + 0x39, 0x46, 0xe0, 0xb2, 0xea, 0xf7, 0xd0, 0xf9, 0x39, 0x46, 0xe0, 0xb2, + 0xea, 0xf7, 0xd1, 0xf9, 0x39, 0x46, 0xe0, 0xb2, 0xea, 0xf7, 0xdc, 0xf9, + 0x39, 0x46, 0xe0, 0xb2, 0xea, 0xf7, 0xdb, 0xf9, 0x39, 0x46, 0xe0, 0xb2, + 0xea, 0xf7, 0xda, 0xf9, 0xe0, 0xb2, 0xea, 0xf7, 0xe2, 0xf9, 0xaf, 0x6b, + 0xf8, 0x7d, 0xc0, 0xf3, 0x40, 0x10, 0xc0, 0xb1, 0x0d, 0x21, 0x05, 0xa8, + 0xef, 0xf7, 0x4e, 0xfe, 0xf9, 0x7d, 0xe8, 0x6b, 0x03, 0x96, 0x89, 0x09, + 0x49, 0x1c, 0xc9, 0xb2, 0x04, 0x91, 0x00, 0x23, 0x90, 0xf8, 0x22, 0x12, + 0x02, 0x91, 0x18, 0x30, 0x01, 0x90, 0x00, 0x96, 0x05, 0xaa, 0x07, 0xf1, + 0x10, 0x01, 0xe0, 0xb2, 0x01, 0xf0, 0x28, 0xfd, 0x06, 0x46, 0x30, 0x46, + 0x09, 0xb0, 0xf0, 0xbd, 0xf8, 0xb5, 0x8e, 0xb0, 0x1f, 0x46, 0x15, 0x9a, + 0xdf, 0xf8, 0xec, 0x46, 0x52, 0x8b, 0x65, 0x6a, 0x01, 0x23, 0x83, 0x40, + 0x1a, 0x42, 0x5a, 0xd0, 0x26, 0x6a, 0x38, 0x2e, 0x57, 0xd3, 0x8d, 0xf8, + 0x01, 0x10, 0x8d, 0xf8, 0x00, 0x00, 0x0a, 0x22, 0x39, 0x78, 0x8d, 0xf8, + 0x05, 0x10, 0x07, 0xf1, 0xb0, 0x01, 0x78, 0x78, 0x8d, 0xf8, 0x06, 0x00, + 0x78, 0x79, 0x8d, 0xf8, 0x04, 0x00, 0xf8, 0x88, 0xad, 0xf8, 0x14, 0x00, + 0x38, 0x89, 0xad, 0xf8, 0x16, 0x00, 0x78, 0x89, 0xad, 0xf8, 0x18, 0x00, + 0xb8, 0x89, 0xad, 0xf8, 0x1a, 0x00, 0xf8, 0x89, 0xad, 0xf8, 0x1c, 0x00, + 0x38, 0x69, 0x08, 0x90, 0x38, 0x7d, 0x8d, 0xf8, 0x07, 0x00, 0xf8, 0x69, + 0x09, 0x90, 0x38, 0x6a, 0x0a, 0x90, 0x97, 0xf8, 0x24, 0x00, 0x8d, 0xf8, + 0x08, 0x00, 0x97, 0xf8, 0x25, 0x00, 0x8d, 0xf8, 0x09, 0x00, 0x97, 0xf8, + 0x26, 0x00, 0x8d, 0xf8, 0x0a, 0x00, 0x97, 0xf8, 0x27, 0x00, 0x8d, 0xf8, + 0x0b, 0x00, 0xb7, 0xf8, 0x5c, 0x00, 0xad, 0xf8, 0x1e, 0x00, 0x0b, 0xa8, + 0xdd, 0xf7, 0x2e, 0xfc, 0x00, 0x20, 0x39, 0x18, 0x0d, 0xeb, 0x00, 0x02, + 0x91, 0xf8, 0x30, 0x10, 0x11, 0x73, 0x40, 0x1c, 0x08, 0x28, 0xf6, 0xd3, + 0x38, 0x20, 0x69, 0x1c, 0x41, 0x43, 0x8e, 0x42, 0xe3, 0x69, 0x38, 0xbf, + 0x00, 0x25, 0x68, 0x43, 0x38, 0x22, 0x69, 0x46, 0x18, 0x44, 0xdd, 0xf7, + 0x07, 0xfc, 0x6d, 0x1c, 0x65, 0x62, 0x0f, 0xb0, 0xf0, 0xbd, 0xf8, 0xb5, + 0x92, 0xf8, 0x2b, 0x50, 0x44, 0x79, 0xad, 0x09, 0x05, 0xf0, 0x01, 0x05, + 0x00, 0x26, 0x85, 0xf0, 0x01, 0x05, 0x54, 0xb3, 0x94, 0x7c, 0x03, 0xf1, + 0xce, 0x07, 0x3c, 0xb1, 0xb0, 0xf9, 0x0c, 0x40, 0xb7, 0xf9, 0x00, 0xc0, + 0xa4, 0x45, 0xbc, 0xbf, 0x01, 0x26, 0x3c, 0x80, 0x14, 0x8a, 0x34, 0xb1, + 0xc4, 0x89, 0xb7, 0xf8, 0x02, 0xc0, 0xa4, 0x45, 0x3c, 0xbf, 0x01, 0x26, + 0x7c, 0x80, 0x14, 0x7d, 0x03, 0xf1, 0xd4, 0x07, 0x34, 0xb1, 0x04, 0x69, + 0xd7, 0xf8, 0x00, 0xc0, 0xa4, 0x45, 0x3c, 0xbf, 0x01, 0x26, 0x3c, 0x60, + 0x2e, 0x43, 0x08, 0xd0, 0x00, 0x93, 0x13, 0x46, 0x0a, 0x46, 0x01, 0x46, + 0x01, 0x20, 0x00, 0xf0, 0x15, 0xf8, 0x87, 0xed, 0x01, 0x0a, 0xf1, 0xbd, + 0x30, 0xb1, 0x92, 0xf9, 0x26, 0x00, 0x92, 0xf9, 0x27, 0x10, 0x88, 0x42, + 0x07, 0xdd, 0x05, 0xe0, 0x92, 0xf9, 0x27, 0x00, 0x92, 0xf9, 0x26, 0x10, + 0x88, 0x42, 0x00, 0xda, 0x08, 0x46, 0xdc, 0xf7, 0x11, 0xbf, 0x00, 0x00, + 0x2d, 0xe9, 0xf0, 0x41, 0x2d, 0xed, 0x0c, 0x8b, 0x0e, 0x46, 0x12, 0x9d, + 0x1f, 0x46, 0x9f, 0xed, 0x90, 0x8a, 0x00, 0xb1, 0x2e, 0x1d, 0xf0, 0x88, + 0x31, 0x89, 0x00, 0xf0, 0x28, 0xf9, 0x96, 0xf9, 0x14, 0x00, 0xf1, 0x89, + 0xf8, 0xee, 0x40, 0xca, 0xb8, 0xee, 0x60, 0xda, 0x00, 0xf0, 0x1f, 0xf9, + 0xb6, 0xf9, 0x0c, 0x00, 0x96, 0xf9, 0x30, 0x80, 0xb8, 0xee, 0xc0, 0xca, + 0xf8, 0xee, 0x60, 0x8a, 0x00, 0xee, 0x10, 0x0a, 0xd6, 0xed, 0x04, 0x0a, + 0x96, 0xf9, 0x31, 0x10, 0xb8, 0xee, 0xc0, 0x9a, 0xf8, 0xee, 0x60, 0x9a, + 0x40, 0x46, 0x00, 0xf0, 0x0a, 0xf9, 0xb8, 0xee, 0xc0, 0xaa, 0xf8, 0xee, + 0xe0, 0xaa, 0x00, 0x24, 0xf9, 0x7f, 0x01, 0x23, 0xa3, 0x40, 0x13, 0xea, + 0x01, 0x00, 0x18, 0xbf, 0x01, 0x20, 0x32, 0x46, 0x39, 0x46, 0xff, 0xf7, + 0xb1, 0xff, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x00, 0x2c, + 0x0c, 0xbf, 0xb0, 0xee, 0x40, 0xba, 0xf0, 0xee, 0x40, 0xba, 0x64, 0x1c, + 0x01, 0x2c, 0xe7, 0xd9, 0xb8, 0x89, 0x05, 0xf1, 0xd4, 0x03, 0x88, 0xb1, + 0xb3, 0xf9, 0x18, 0x10, 0x00, 0xf0, 0xea, 0xf8, 0x8c, 0xee, 0x80, 0x0a, + 0xff, 0xee, 0x00, 0x0a, 0x70, 0xee, 0x20, 0x0a, 0xb0, 0xee, 0xe0, 0x0a, + 0x00, 0xee, 0x90, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x20, 0xee, 0x80, 0x8a, + 0xf8, 0x89, 0x38, 0xb1, 0xb3, 0xf9, 0x1a, 0x10, 0x00, 0xf0, 0xd6, 0xf8, + 0x8d, 0xee, 0x00, 0x0a, 0x00, 0xf0, 0xd9, 0xf8, 0xb8, 0x7d, 0x28, 0xb1, + 0xb3, 0xf9, 0x1c, 0x10, 0x00, 0xf0, 0xcc, 0xf8, 0x00, 0xf0, 0xcf, 0xf8, + 0xf8, 0x7d, 0x70, 0xb1, 0x97, 0xf8, 0x20, 0x10, 0x00, 0xee, 0x10, 0x1a, + 0xb8, 0xee, 0x40, 0x0a, 0xb4, 0xee, 0x4c, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x48, 0xbf, 0xb0, 0xee, 0x40, 0xca, 0x00, 0xf0, 0xbe, 0xf8, 0xb8, 0x8b, + 0x70, 0xb1, 0x97, 0xf9, 0x1e, 0x10, 0x00, 0xf0, 0xb3, 0xf8, 0xb4, 0xee, + 0x40, 0xba, 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, 0xb0, 0xee, 0x40, 0xba, + 0x8b, 0xee, 0x00, 0x0a, 0x00, 0xf0, 0xaf, 0xf8, 0x78, 0x7d, 0x38, 0xb1, + 0xb3, 0xf9, 0x22, 0x10, 0x00, 0xf0, 0xa2, 0xf8, 0x8b, 0xee, 0x80, 0x0a, + 0x00, 0xf0, 0xa5, 0xf8, 0xfa, 0x7c, 0x00, 0x2a, 0x40, 0xd0, 0xb3, 0xf9, + 0x1e, 0x10, 0x08, 0x46, 0x00, 0xee, 0x10, 0x0a, 0xb3, 0xf9, 0x20, 0x00, + 0x04, 0x46, 0xb8, 0xee, 0xc0, 0x0a, 0xdf, 0xed, 0x3f, 0x0a, 0x01, 0xee, + 0x10, 0x4a, 0x80, 0xee, 0x20, 0x0a, 0xb8, 0xee, 0xc1, 0x1a, 0xdf, 0xed, + 0x3b, 0x1a, 0xc1, 0xee, 0x21, 0x0a, 0x9f, 0xed, 0x3a, 0x1a, 0xb8, 0xf1, + 0x00, 0x0f, 0x08, 0xbf, 0xb0, 0xee, 0x41, 0xaa, 0xca, 0xee, 0x8a, 0x1a, + 0xf4, 0xee, 0x61, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x03, 0xd5, 0x40, 0xb1, + 0xb0, 0xee, 0x60, 0x0a, 0x0a, 0xe0, 0xf4, 0xee, 0x40, 0x1a, 0xf1, 0xee, + 0x10, 0xfa, 0x03, 0xd5, 0x21, 0xb9, 0xb0, 0xee, 0x41, 0x0a, 0x01, 0xe0, + 0xb0, 0xee, 0x61, 0x0a, 0x81, 0xee, 0x80, 0x0a, 0xbf, 0xee, 0x00, 0x1a, + 0x00, 0xee, 0x90, 0x2a, 0x30, 0xee, 0x01, 0x0a, 0xf8, 0xee, 0x60, 0x0a, + 0xb0, 0xee, 0xc0, 0x0a, 0x00, 0xee, 0x80, 0x8a, 0x38, 0x8a, 0x05, 0xf1, + 0xce, 0x02, 0xb7, 0xee, 0x00, 0x0a, 0x80, 0xb1, 0x54, 0x88, 0x00, 0xee, + 0x90, 0x4a, 0x00, 0x2c, 0xf8, 0xee, 0x60, 0x0a, 0x08, 0xbf, 0xf0, 0xee, + 0x40, 0x0a, 0xc8, 0xee, 0xa0, 0x0a, 0xff, 0xee, 0x00, 0x1a, 0x01, 0xee, + 0x10, 0x0a, 0x00, 0xf0, 0x35, 0xf8, 0xb9, 0x7c, 0x89, 0xb1, 0xb2, 0xf9, + 0x00, 0x20, 0x00, 0xee, 0x90, 0x2a, 0x00, 0x2a, 0xf8, 0xee, 0xe0, 0x0a, + 0x08, 0xbf, 0xf0, 0xee, 0x40, 0x0a, 0xc9, 0xee, 0x20, 0x0a, 0xff, 0xee, + 0x00, 0x1a, 0x01, 0xee, 0x10, 0x1a, 0x00, 0xf0, 0x21, 0xf8, 0x38, 0x7d, + 0x88, 0xb1, 0x19, 0x68, 0x00, 0xee, 0x90, 0x1a, 0xf8, 0xee, 0x60, 0x0a, + 0x09, 0xb9, 0xf0, 0xee, 0x40, 0x0a, 0x00, 0xee, 0x10, 0x0a, 0xc9, 0xee, + 0xa0, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xf0, 0xee, 0xe0, 0x0a, 0x00, 0xee, + 0x20, 0x8a, 0xb0, 0xee, 0x48, 0x0a, 0xbd, 0xec, 0x0c, 0x8b, 0xbd, 0xe8, + 0xf0, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x42, + 0x00, 0x00, 0x80, 0x00, 0x70, 0xee, 0xa1, 0x1a, 0xb8, 0xee, 0x41, 0x1a, + 0xf0, 0xee, 0xe1, 0x0a, 0x01, 0xee, 0x20, 0x8a, 0x70, 0x47, 0x00, 0xee, + 0x10, 0x0a, 0x00, 0xee, 0x90, 0x1a, 0x70, 0x47, 0x00, 0xee, 0x10, 0x1a, + 0xb8, 0xee, 0xc0, 0x0a, 0x70, 0x47, 0x8c, 0xee, 0x00, 0x0a, 0xff, 0xee, + 0x00, 0x0a, 0x70, 0xee, 0x20, 0x0a, 0xb0, 0xee, 0xe0, 0x0a, 0x00, 0xee, + 0x90, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x00, 0xee, 0x80, 0x8a, 0x70, 0x47, + 0x2d, 0xe9, 0xf1, 0x4f, 0x2d, 0xed, 0x02, 0x8b, 0x8a, 0xb0, 0x0d, 0x46, + 0x18, 0x9e, 0x71, 0x8b, 0x01, 0x24, 0x84, 0x40, 0x0c, 0x40, 0x18, 0xbf, + 0x01, 0x24, 0x06, 0x94, 0xa6, 0x46, 0x30, 0x8a, 0x00, 0xb1, 0x01, 0x24, + 0x06, 0xf1, 0x2e, 0x07, 0xf9, 0x88, 0x29, 0xb9, 0x3f, 0x89, 0x07, 0xb1, + 0x01, 0x27, 0x8d, 0xf8, 0x04, 0x70, 0x02, 0xe0, 0x01, 0x21, 0x8d, 0xf8, + 0x04, 0x10, 0x4f, 0xf0, 0x01, 0x09, 0xb1, 0x7c, 0x00, 0x29, 0x0e, 0xbf, + 0xcd, 0xf8, 0x1c, 0xe0, 0x01, 0x27, 0x07, 0x97, 0xdd, 0xf8, 0x58, 0x80, + 0x98, 0xf8, 0x05, 0xe0, 0x17, 0x9f, 0xcd, 0xf8, 0x20, 0xe0, 0xd7, 0xf8, + 0x24, 0xe0, 0x8d, 0xf8, 0x10, 0x50, 0x5f, 0xea, 0x0e, 0x7c, 0x9d, 0xf8, + 0x10, 0xc0, 0x48, 0xbf, 0x4f, 0xf0, 0x00, 0x09, 0x02, 0x25, 0xbc, 0xf1, + 0x01, 0x0f, 0x8d, 0xf8, 0x12, 0x50, 0x03, 0xd0, 0x01, 0x25, 0x8d, 0xf8, + 0x12, 0x50, 0xa9, 0x46, 0x19, 0x9d, 0x8d, 0xf8, 0x13, 0x20, 0x00, 0x2b, + 0x05, 0xf1, 0xd4, 0x0b, 0x3f, 0xd0, 0x07, 0x98, 0x20, 0x43, 0xc0, 0xb2, + 0xe8, 0xb1, 0xbc, 0xf1, 0x01, 0x0f, 0x1a, 0xd1, 0x14, 0xb1, 0x2e, 0xf0, + 0x02, 0x00, 0x78, 0x62, 0x07, 0x98, 0x18, 0xb1, 0x78, 0x6a, 0x20, 0xf0, + 0x10, 0x00, 0x78, 0x62, 0x00, 0x20, 0x9d, 0xf8, 0x12, 0x10, 0x03, 0x90, + 0x00, 0x91, 0x01, 0x24, 0x9d, 0xf8, 0x30, 0x00, 0x02, 0x94, 0x01, 0x94, + 0x4b, 0x46, 0x00, 0xf0, 0xf6, 0xf8, 0x78, 0x6a, 0x40, 0xf0, 0x12, 0x00, + 0x78, 0x62, 0x05, 0xf1, 0xce, 0x01, 0x08, 0x98, 0x38, 0xb1, 0xb8, 0xf8, + 0x0c, 0x00, 0x08, 0x80, 0xd8, 0xf8, 0x10, 0x20, 0xb8, 0xf8, 0x0e, 0x00, + 0x01, 0xe0, 0x08, 0x80, 0x00, 0x22, 0xcb, 0xf8, 0x00, 0x20, 0x48, 0x80, + 0xc0, 0x22, 0x9d, 0xf8, 0x13, 0x00, 0x68, 0x70, 0x41, 0x46, 0x28, 0x1d, + 0xdd, 0xf7, 0xf4, 0xf9, 0x00, 0xf0, 0xd1, 0xf8, 0x8b, 0xed, 0x01, 0x0a, + 0xb9, 0xe0, 0xad, 0xf8, 0x14, 0x00, 0x8d, 0xf8, 0x11, 0x10, 0x00, 0xf0, + 0xd2, 0xf8, 0x00, 0x21, 0x00, 0x20, 0x31, 0x82, 0x00, 0xf0, 0xb4, 0xf8, + 0x00, 0x2c, 0xb0, 0xee, 0x40, 0x8a, 0x4f, 0xf0, 0x01, 0x0a, 0x4f, 0xd0, + 0xbd, 0xf8, 0x14, 0x00, 0xdb, 0xed, 0x01, 0x0a, 0x00, 0xee, 0x10, 0x0a, + 0x00, 0xf0, 0xac, 0xf8, 0x06, 0xd4, 0x06, 0x99, 0x9d, 0xf8, 0x04, 0x00, + 0x01, 0x43, 0xc9, 0xb2, 0x00, 0x29, 0x3f, 0xd0, 0x9d, 0xf8, 0x10, 0x00, + 0x01, 0x28, 0x15, 0xd1, 0x78, 0x6a, 0x20, 0xf0, 0x02, 0x00, 0x78, 0x62, + 0x00, 0x21, 0x03, 0x91, 0xcd, 0xf8, 0x08, 0xa0, 0xcd, 0xf8, 0x04, 0xa0, + 0x4b, 0x46, 0x9d, 0xf8, 0x12, 0x10, 0x9d, 0xf8, 0x30, 0x00, 0x00, 0x91, + 0x00, 0xf0, 0x9d, 0xf8, 0x78, 0x6a, 0x40, 0xf0, 0x02, 0x00, 0x78, 0x62, + 0xbd, 0xf8, 0x14, 0x00, 0x32, 0x8b, 0x30, 0x82, 0xb8, 0xf8, 0x0e, 0x10, + 0x91, 0x42, 0x01, 0xd2, 0x06, 0x98, 0x50, 0xb1, 0x9d, 0xf8, 0x11, 0x00, + 0xb0, 0x74, 0x00, 0xf0, 0x8e, 0xf8, 0x00, 0x20, 0x00, 0xf0, 0x72, 0xf8, + 0xb0, 0xee, 0x40, 0x8a, 0x01, 0xe0, 0x4f, 0xf0, 0x00, 0x0a, 0x9d, 0xf8, + 0x10, 0x00, 0x01, 0x28, 0x0a, 0xd1, 0x98, 0xf9, 0x32, 0x00, 0xdc, 0xf7, + 0xdb, 0xfc, 0x96, 0xf8, 0x2e, 0x10, 0x88, 0x42, 0x06, 0xd3, 0x4f, 0xf0, + 0x00, 0x0a, 0x03, 0xe0, 0x9d, 0xf8, 0x10, 0x00, 0x00, 0x28, 0x30, 0xd0, + 0x07, 0x99, 0x1a, 0xea, 0x01, 0x0f, 0x2c, 0xd0, 0x9d, 0xf8, 0x11, 0x10, + 0xdb, 0xed, 0x01, 0x0a, 0x00, 0xee, 0x10, 0x1a, 0x00, 0xf0, 0x54, 0xf8, + 0x01, 0xd4, 0x06, 0x98, 0x08, 0xb3, 0x78, 0x6a, 0x20, 0xf0, 0x10, 0x00, + 0x78, 0x62, 0x00, 0x21, 0x03, 0x91, 0x01, 0x20, 0x9d, 0xf8, 0x12, 0x10, + 0x02, 0x90, 0x01, 0x90, 0x00, 0x91, 0x4b, 0x46, 0x9d, 0xf8, 0x30, 0x00, + 0x00, 0xf0, 0x4f, 0xf8, 0x78, 0x6a, 0x40, 0xf0, 0x10, 0x00, 0x78, 0x62, + 0x2b, 0x46, 0x9d, 0xf8, 0x11, 0x00, 0xb0, 0x74, 0x32, 0x46, 0x39, 0x46, + 0x40, 0x46, 0xff, 0xf7, 0x4a, 0xfd, 0x00, 0xf0, 0x3a, 0xf8, 0xb0, 0xee, + 0x40, 0x8a, 0xbd, 0xf8, 0x14, 0x00, 0x30, 0x82, 0x9d, 0xf8, 0x11, 0x10, + 0xb1, 0x74, 0x06, 0x98, 0x38, 0xb1, 0xb8, 0xf8, 0x0e, 0x00, 0x31, 0x8b, + 0x88, 0x42, 0x16, 0xd3, 0x08, 0x98, 0x18, 0xb9, 0x13, 0xe0, 0xba, 0xf1, + 0x00, 0x0f, 0x10, 0xd0, 0x9b, 0xed, 0x01, 0x0a, 0xb4, 0xee, 0x40, 0x8a, + 0xf1, 0xee, 0x10, 0xfa, 0x09, 0xd5, 0xc0, 0x22, 0x41, 0x46, 0x28, 0x1d, + 0xdd, 0xf7, 0x3a, 0xf9, 0x8b, 0xed, 0x01, 0x8a, 0x9d, 0xf8, 0x13, 0x00, + 0x68, 0x70, 0x0a, 0xb0, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf1, 0x8f, + 0xb0, 0x74, 0x00, 0x95, 0x33, 0x46, 0x3a, 0x46, 0x41, 0x46, 0x5f, 0xe5, + 0xb8, 0xee, 0x40, 0x0a, 0x70, 0xee, 0x20, 0x0a, 0xb4, 0xee, 0x60, 0x8a, + 0xf1, 0xee, 0x10, 0xfa, 0x70, 0x47, 0x00, 0x95, 0x33, 0x46, 0x3a, 0x46, + 0x41, 0x46, 0x00, 0x20, 0x50, 0xe5, 0x3a, 0x46, 0x41, 0x46, 0xe9, 0xf7, + 0x61, 0xbe, 0x2b, 0x46, 0x32, 0x46, 0x39, 0x46, 0x40, 0x46, 0xfe, 0xe4, + 0x10, 0xb5, 0xdf, 0xf8, 0xf8, 0x06, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, + 0x00, 0x24, 0x80, 0xe8, 0x1e, 0x00, 0x10, 0xbd, 0x84, 0x3d, 0x00, 0x21, + 0xb4, 0x3d, 0x00, 0x21, 0xa8, 0x3d, 0x00, 0x21, 0x40, 0x39, 0x00, 0x21, + 0x18, 0x39, 0x00, 0x21, 0x2d, 0xe9, 0xf0, 0x4f, 0x8a, 0x46, 0x15, 0x46, + 0xe9, 0xb0, 0x80, 0x46, 0xdf, 0xf8, 0xc8, 0x26, 0x00, 0x20, 0x09, 0x90, + 0x10, 0x70, 0x1c, 0x46, 0xd8, 0xf8, 0x3c, 0x10, 0x48, 0x7d, 0xd8, 0xf8, + 0x04, 0x70, 0xd8, 0xf8, 0x38, 0x90, 0x02, 0x28, 0x0c, 0xbf, 0x01, 0x26, + 0x00, 0x26, 0x01, 0xf5, 0xac, 0x72, 0x09, 0xf1, 0x18, 0x03, 0x98, 0x31, + 0x09, 0xf1, 0x50, 0x0b, 0x06, 0x92, 0x01, 0x93, 0x02, 0x91, 0xd6, 0xb9, + 0x58, 0x22, 0x59, 0x46, 0x18, 0xa8, 0xdd, 0xf7, 0xc7, 0xf8, 0x99, 0xf8, + 0xa8, 0x10, 0x8d, 0xf8, 0x84, 0x10, 0x00, 0x22, 0xd8, 0xf8, 0x38, 0x00, + 0x90, 0xf8, 0xa9, 0x10, 0x8d, 0xf8, 0x85, 0x10, 0x1b, 0x92, 0x00, 0x21, + 0x01, 0x22, 0xad, 0xf8, 0x70, 0x20, 0x8d, 0xf8, 0x74, 0x10, 0x8d, 0xf8, + 0x77, 0x10, 0x0d, 0xf1, 0x60, 0x0b, 0x00, 0x20, 0x8d, 0xf8, 0x13, 0x00, + 0x09, 0x21, 0x0b, 0xa8, 0xef, 0xf7, 0x74, 0xfa, 0x07, 0xa8, 0xdc, 0xf7, + 0x45, 0xfd, 0x02, 0x98, 0x90, 0xf9, 0xba, 0x90, 0xc0, 0x21, 0xef, 0xf7, + 0xad, 0xff, 0x02, 0x99, 0x00, 0x20, 0x81, 0xf8, 0xba, 0x00, 0x01, 0x98, + 0x41, 0x6a, 0xc8, 0x02, 0x16, 0xd5, 0xf8, 0xb2, 0xe9, 0xf7, 0xb9, 0xfd, + 0xb5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x47, 0xbf, 0xfe, 0xee, + 0x00, 0x0a, 0x30, 0xee, 0x20, 0x0a, 0xb6, 0xee, 0x00, 0x1a, 0x30, 0xee, + 0x01, 0x0a, 0x02, 0x99, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, + 0x81, 0xf8, 0xba, 0x00, 0x01, 0x98, 0x41, 0x6a, 0x48, 0x02, 0x44, 0xbf, + 0x02, 0x99, 0x81, 0xf8, 0xba, 0x90, 0x02, 0x98, 0x90, 0xf9, 0xba, 0x10, + 0xf8, 0xb2, 0xe9, 0xf7, 0x9a, 0xfd, 0xf8, 0xb2, 0xe9, 0xf7, 0x8a, 0xfd, + 0x06, 0x99, 0x0f, 0x70, 0x01, 0x22, 0x01, 0x21, 0x12, 0x92, 0xb9, 0x40, + 0xad, 0xf8, 0x20, 0x10, 0xbb, 0xf8, 0x1a, 0x20, 0xbd, 0xf8, 0x20, 0x10, + 0x0a, 0x42, 0x08, 0xd0, 0x29, 0x00, 0x06, 0xd0, 0x20, 0x00, 0x04, 0xd0, + 0xdf, 0xf8, 0xbc, 0x25, 0x95, 0x61, 0xd5, 0x61, 0x14, 0x62, 0xf8, 0xb2, + 0xe9, 0xf7, 0x83, 0xfe, 0x17, 0x90, 0x0b, 0xf1, 0x24, 0x00, 0xc0, 0x7a, + 0xc2, 0x06, 0x00, 0xf0, 0x07, 0x01, 0x06, 0xd5, 0x01, 0x29, 0x04, 0xd9, + 0x98, 0xf8, 0x54, 0x20, 0x93, 0x07, 0x48, 0xbf, 0x89, 0x1e, 0x80, 0x06, + 0x03, 0xd5, 0xc9, 0xb2, 0xf8, 0xb2, 0xe9, 0xf7, 0x6c, 0xfe, 0x01, 0x98, + 0x41, 0x6a, 0x0a, 0x91, 0x01, 0x20, 0x01, 0x99, 0x4a, 0x6a, 0x60, 0xf3, + 0x52, 0x42, 0x4a, 0x62, 0x31, 0x00, 0x01, 0x98, 0x18, 0xd0, 0x40, 0x6a, + 0x40, 0xf0, 0x12, 0x00, 0x01, 0x07, 0x01, 0x99, 0x48, 0xbf, 0x40, 0xf0, + 0x04, 0x00, 0x48, 0x62, 0x01, 0x9a, 0x02, 0x99, 0xf8, 0xb2, 0xfd, 0xf7, + 0x79, 0xf8, 0x2e, 0xa8, 0x02, 0x99, 0x01, 0x9a, 0x00, 0x90, 0x01, 0xf1, + 0x24, 0x03, 0x00, 0x21, 0xf8, 0xb2, 0xef, 0xf7, 0x06, 0xfa, 0x03, 0xe0, + 0x41, 0x6a, 0x21, 0xf0, 0x02, 0x01, 0x41, 0x62, 0x00, 0x21, 0x0b, 0xf1, + 0x24, 0x05, 0x8d, 0xf8, 0x12, 0x10, 0x2c, 0x78, 0x95, 0xf8, 0x01, 0x90, + 0xe9, 0xf7, 0x37, 0xfe, 0xdf, 0xf8, 0x20, 0x15, 0x88, 0x42, 0x80, 0x41, + 0xc0, 0x43, 0xc0, 0x0f, 0x14, 0x90, 0x69, 0x79, 0xfe, 0x29, 0x05, 0xd1, + 0x00, 0x22, 0x31, 0x46, 0x40, 0x46, 0xff, 0xf7, 0x3a, 0xfa, 0x04, 0xe0, + 0x14, 0x98, 0x10, 0xb1, 0x2c, 0x7b, 0x95, 0xf8, 0x0d, 0x90, 0x31, 0x46, + 0x40, 0x46, 0xff, 0xf7, 0x42, 0xf9, 0xa0, 0x42, 0xb8, 0xbf, 0x04, 0x46, + 0x48, 0x45, 0xb8, 0xbf, 0x81, 0x46, 0x06, 0x99, 0xcd, 0xf8, 0x4c, 0x80, + 0x8d, 0xf8, 0x11, 0x60, 0xcd, 0xf8, 0x14, 0xb0, 0xba, 0xf1, 0x01, 0x0f, + 0x04, 0xbf, 0x00, 0x24, 0xa1, 0x46, 0xcd, 0xf8, 0x58, 0x90, 0x01, 0xf1, + 0xc4, 0x02, 0x01, 0x9e, 0xdd, 0xf8, 0x08, 0xb0, 0x9d, 0xf8, 0x13, 0x80, + 0x07, 0x92, 0x15, 0x94, 0xa1, 0x46, 0x18, 0xe0, 0x15, 0x98, 0xaa, 0xeb, + 0x00, 0x00, 0x05, 0x28, 0x11, 0xd2, 0x06, 0xe0, 0x00, 0x28, 0xf7, 0xd0, + 0x6c, 0xb1, 0x5f, 0xfa, 0x88, 0xf0, 0x05, 0x28, 0x09, 0xd2, 0x05, 0x98, + 0x07, 0x9a, 0x01, 0x90, 0x00, 0x96, 0x5b, 0x46, 0x5f, 0xfa, 0x89, 0xf1, + 0xf8, 0xb2, 0xff, 0xf7, 0x55, 0xfb, 0x09, 0xf1, 0x01, 0x09, 0x16, 0x98, + 0x5f, 0xfa, 0x89, 0xfa, 0x82, 0x45, 0x80, 0xf2, 0x9f, 0x80, 0x01, 0x21, + 0x8d, 0xf8, 0x12, 0x10, 0x5f, 0xfa, 0x89, 0xf2, 0x9d, 0xf8, 0x11, 0x10, + 0x13, 0x98, 0xff, 0xf7, 0xe8, 0xf9, 0x13, 0x98, 0xff, 0xf7, 0xe8, 0xfa, + 0x09, 0x90, 0x9d, 0xf8, 0x11, 0x00, 0x88, 0xb3, 0x70, 0x6a, 0xc1, 0x03, + 0x17, 0xd4, 0x00, 0x28, 0x1b, 0xd5, 0x07, 0x99, 0x9d, 0xf8, 0x34, 0x00, + 0x0a, 0x7a, 0x90, 0x42, 0x0f, 0xd1, 0x89, 0x79, 0x9d, 0xf8, 0x32, 0x00, + 0x81, 0x42, 0x21, 0xbf, 0x07, 0x99, 0x08, 0x78, 0x9d, 0xf8, 0x2c, 0x20, + 0x90, 0x42, 0x04, 0xd3, 0x9d, 0xf8, 0x2e, 0x00, 0x8a, 0x78, 0x90, 0x42, + 0x05, 0xd0, 0x32, 0x46, 0x59, 0x46, 0xf8, 0xb2, 0xfc, 0xf7, 0xd8, 0xff, + 0x05, 0xe0, 0x2e, 0xaa, 0x0b, 0xf1, 0x24, 0x01, 0xf8, 0xb2, 0xef, 0xf7, + 0xcf, 0xf9, 0x07, 0x99, 0x09, 0x22, 0x0b, 0xa8, 0xdc, 0xf7, 0x8c, 0xff, + 0x5a, 0x46, 0x31, 0x46, 0xf8, 0xb2, 0xe9, 0xf7, 0xce, 0xfc, 0x19, 0xe0, + 0xc0, 0x21, 0x58, 0x46, 0xef, 0xf7, 0x3c, 0xf9, 0x96, 0xf8, 0x23, 0x00, + 0xc1, 0x07, 0x0c, 0xd4, 0x01, 0x20, 0x51, 0xab, 0x03, 0x90, 0x02, 0x90, + 0x01, 0x90, 0x00, 0x93, 0x5a, 0x46, 0x33, 0x46, 0x10, 0x21, 0xf8, 0xb2, + 0xec, 0xf7, 0x51, 0xfc, 0x04, 0xe0, 0x5a, 0x46, 0x31, 0x46, 0xf8, 0xb2, + 0xe9, 0xf7, 0xa8, 0xfd, 0x05, 0x98, 0xbd, 0xf8, 0x20, 0x20, 0x41, 0x8b, + 0x9b, 0xf8, 0x05, 0x40, 0x11, 0x42, 0x15, 0x99, 0x14, 0xbf, 0x44, 0xf0, + 0x01, 0x00, 0x20, 0x46, 0x8a, 0x45, 0x08, 0xbf, 0x01, 0x23, 0x01, 0xd0, + 0x00, 0x23, 0x00, 0xb3, 0x05, 0x99, 0x06, 0x98, 0x02, 0x91, 0x03, 0x90, + 0x01, 0x96, 0xcd, 0xf8, 0x00, 0xb0, 0x5f, 0xfa, 0x89, 0xf2, 0x9d, 0xf8, + 0x11, 0x10, 0xf8, 0xb2, 0xff, 0xf7, 0xd2, 0xfc, 0x8c, 0xb1, 0x9d, 0xf8, + 0x11, 0x00, 0x60, 0xb1, 0x96, 0xf8, 0x24, 0x00, 0x81, 0x06, 0x08, 0xd4, + 0x2e, 0xa8, 0x00, 0x90, 0x0b, 0xf1, 0x24, 0x03, 0x32, 0x46, 0x00, 0x21, + 0xf8, 0xb2, 0xef, 0xf7, 0x12, 0xf9, 0x08, 0xf1, 0x01, 0x08, 0x05, 0x98, + 0x41, 0x8b, 0x48, 0x0a, 0xc9, 0x05, 0x00, 0xf0, 0x01, 0x00, 0x7f, 0xf5, + 0x4f, 0xaf, 0x00, 0x28, 0x3f, 0xf4, 0x53, 0xaf, 0x00, 0x2c, 0x7f, 0xf4, + 0x50, 0xaf, 0x58, 0xe7, 0x9d, 0xf8, 0x12, 0x00, 0xdd, 0xf8, 0x4c, 0x90, + 0xdd, 0xf8, 0x24, 0xa0, 0x06, 0x9c, 0x8d, 0xf8, 0x10, 0x70, 0x00, 0x28, + 0x8d, 0xf8, 0x13, 0x80, 0x00, 0xf0, 0x81, 0x80, 0x62, 0x78, 0x9d, 0xf8, + 0x11, 0x10, 0x48, 0x46, 0xff, 0xf7, 0x3f, 0xf9, 0x48, 0x46, 0xff, 0xf7, + 0x77, 0xf8, 0x04, 0xf1, 0xc4, 0x08, 0x04, 0xf1, 0xe8, 0x02, 0x98, 0xf8, + 0x08, 0x10, 0x11, 0x70, 0xa9, 0x79, 0x51, 0xb3, 0x98, 0xf8, 0x08, 0x30, + 0x02, 0x2b, 0x04, 0xbf, 0x6b, 0x79, 0xfe, 0x2b, 0x23, 0xd1, 0xb2, 0xf9, + 0x02, 0x00, 0xad, 0xf8, 0x00, 0x00, 0x01, 0xf0, 0x0f, 0x00, 0x00, 0xeb, + 0x80, 0x00, 0xa0, 0xf1, 0x28, 0x0a, 0x97, 0x7b, 0x05, 0x98, 0x09, 0x09, + 0xa7, 0xeb, 0x41, 0x07, 0xc1, 0x7f, 0x48, 0x08, 0x18, 0xbf, 0x01, 0x20, + 0x05, 0x99, 0x22, 0x1d, 0xff, 0xf7, 0x10, 0xfb, 0xbd, 0xf9, 0x00, 0x10, + 0x0f, 0xfa, 0x8a, 0xf2, 0x8a, 0x42, 0x45, 0xdb, 0xff, 0xb2, 0x87, 0x42, + 0x42, 0xd3, 0x03, 0x20, 0x88, 0xf8, 0x08, 0x00, 0x3e, 0xe0, 0x69, 0x79, + 0xfe, 0x29, 0x3b, 0xd1, 0xb2, 0xf9, 0x10, 0x30, 0xb8, 0xf8, 0x0c, 0x10, + 0x9b, 0xb2, 0x99, 0x42, 0x16, 0xda, 0x98, 0xf8, 0x08, 0x10, 0x89, 0xb3, + 0xa0, 0x4a, 0x11, 0x44, 0xcb, 0x7a, 0x29, 0x8a, 0x08, 0x40, 0x5b, 0x1c, + 0xd9, 0xb2, 0x09, 0x29, 0x28, 0xd2, 0x57, 0x5c, 0x12, 0x99, 0xa7, 0xf1, + 0x01, 0x08, 0x01, 0xfa, 0x08, 0xfe, 0x1f, 0xfa, 0x8e, 0xf1, 0x01, 0x42, + 0xf1, 0xd0, 0x1a, 0xe0, 0xb2, 0xf9, 0x12, 0x20, 0x92, 0xb2, 0x8a, 0x42, + 0x18, 0xda, 0x98, 0xf8, 0x08, 0x10, 0xa9, 0xb1, 0x6a, 0x8a, 0x10, 0x40, + 0x91, 0x4a, 0x11, 0x44, 0xcb, 0x7a, 0x5b, 0x1e, 0xd9, 0xb2, 0x09, 0x29, + 0x0c, 0xd2, 0x57, 0x5c, 0x12, 0x99, 0xa7, 0xf1, 0x01, 0x08, 0x01, 0xfa, + 0x08, 0xfe, 0x1f, 0xfa, 0x8e, 0xf1, 0x01, 0x42, 0xf1, 0xd0, 0x04, 0xf1, + 0xc4, 0x00, 0x07, 0x72, 0x48, 0x46, 0xff, 0xf7, 0xc9, 0xf9, 0x82, 0x46, + 0x22, 0xe0, 0xd9, 0xf8, 0x38, 0x00, 0xd0, 0xf8, 0x00, 0x11, 0xc8, 0x04, + 0x16, 0xd5, 0x9d, 0xf8, 0x10, 0x00, 0xe9, 0xf7, 0xb4, 0xfb, 0x8d, 0xf8, + 0x0a, 0x00, 0x9d, 0xf8, 0x10, 0x00, 0xe9, 0xf7, 0xb3, 0xfb, 0x8d, 0xf8, + 0x0b, 0x00, 0x03, 0x23, 0x00, 0x20, 0x00, 0x90, 0x0d, 0xf1, 0x0b, 0x02, + 0x0d, 0xf1, 0x0a, 0x01, 0x48, 0x46, 0x01, 0xf0, 0xb8, 0xfa, 0x05, 0xe0, + 0x69, 0x79, 0x9d, 0xf8, 0x10, 0x00, 0x00, 0x22, 0xfe, 0xf7, 0x8e, 0xff, + 0x9d, 0xf8, 0x11, 0x00, 0x28, 0xb1, 0x9d, 0xf8, 0x10, 0x00, 0x32, 0x46, + 0x59, 0x46, 0xfc, 0xf7, 0xaf, 0xfe, 0x0a, 0x98, 0x70, 0x62, 0x17, 0x99, + 0x01, 0xf0, 0x07, 0x01, 0x8d, 0xf8, 0x12, 0x10, 0xe8, 0x7a, 0x00, 0xf0, + 0x60, 0x00, 0x20, 0x28, 0x04, 0xbf, 0x9d, 0xf8, 0x10, 0x00, 0xe9, 0xf7, + 0x78, 0xfc, 0x30, 0x7b, 0x8d, 0xf8, 0x18, 0x00, 0x31, 0x8a, 0x31, 0x73, + 0x9d, 0xf8, 0x11, 0x00, 0x00, 0x28, 0x56, 0xd0, 0x0a, 0x9a, 0x71, 0x6a, + 0x14, 0x98, 0x02, 0xf4, 0x80, 0x22, 0x11, 0x43, 0x20, 0xb1, 0x0a, 0x98, + 0x82, 0x03, 0x58, 0xbf, 0x41, 0xf4, 0x80, 0x21, 0x71, 0x62, 0x00, 0x27, + 0x05, 0x98, 0x9d, 0xf8, 0x10, 0x80, 0x00, 0xf1, 0x24, 0x05, 0x32, 0x46, + 0x59, 0x46, 0x40, 0x46, 0xfc, 0xf7, 0x7e, 0xfe, 0x5a, 0x46, 0x31, 0x46, + 0x40, 0x46, 0xe9, 0xf7, 0x80, 0xfb, 0x94, 0xf9, 0x18, 0x00, 0x9b, 0xf9, + 0x14, 0x10, 0x95, 0xf9, 0x08, 0x20, 0x40, 0x1a, 0x90, 0x42, 0x04, 0xdb, + 0x7f, 0x1c, 0x69, 0x7a, 0xf8, 0xb2, 0x88, 0x42, 0xe7, 0xd3, 0x8d, 0xf8, + 0x10, 0x80, 0x9b, 0xf8, 0x00, 0x10, 0x9b, 0xf8, 0x01, 0x00, 0xd9, 0xf8, + 0x3c, 0x20, 0x81, 0x42, 0xb4, 0xbf, 0x41, 0x1a, 0x09, 0x1a, 0x00, 0x20, + 0x82, 0xf8, 0x76, 0x04, 0xd9, 0xf8, 0x38, 0x00, 0x00, 0xf5, 0x94, 0x72, + 0x53, 0x7a, 0x18, 0x06, 0x4b, 0xd5, 0x10, 0x78, 0x08, 0xb9, 0x02, 0x20, + 0x03, 0xe0, 0xc9, 0xb2, 0x81, 0x42, 0x05, 0xd2, 0x01, 0x20, 0xd9, 0xf8, + 0x3c, 0x10, 0x81, 0xf8, 0x76, 0x04, 0x3e, 0xe0, 0x90, 0x78, 0x00, 0x28, + 0x3b, 0xd0, 0xd9, 0xf8, 0x3c, 0x00, 0x02, 0x21, 0x80, 0xf8, 0x76, 0x14, + 0x35, 0xe0, 0x36, 0x48, 0x01, 0x21, 0x01, 0x70, 0xd9, 0xf8, 0x38, 0x20, + 0x02, 0xf1, 0xa8, 0x00, 0x41, 0x78, 0x00, 0x78, 0x09, 0x1a, 0x01, 0x29, + 0x29, 0xd0, 0x96, 0xf8, 0x23, 0x00, 0xc1, 0x07, 0x0d, 0xd4, 0x01, 0x20, + 0x03, 0x90, 0x02, 0x90, 0x01, 0x90, 0x51, 0xab, 0x00, 0x93, 0x33, 0x46, + 0x9d, 0xf8, 0x10, 0x00, 0x5a, 0x46, 0x10, 0x21, 0xec, 0xf7, 0xc1, 0xfa, + 0x05, 0xe0, 0x9d, 0xf8, 0x10, 0x00, 0x5a, 0x46, 0x31, 0x46, 0xe9, 0xf7, + 0x17, 0xfc, 0xbb, 0xf8, 0x0e, 0x00, 0x9d, 0xf8, 0x10, 0x30, 0x03, 0x90, + 0x9b, 0xf8, 0x01, 0x10, 0x02, 0x91, 0xff, 0x21, 0x9b, 0xf8, 0x00, 0x20, + 0x01, 0x92, 0x60, 0x78, 0x20, 0x4a, 0x00, 0x90, 0x03, 0x20, 0xeb, 0xf7, + 0xfe, 0xfa, 0x0a, 0x98, 0x70, 0x62, 0xe9, 0x7a, 0x01, 0xf0, 0xa0, 0x01, + 0x20, 0x29, 0x05, 0xd1, 0x9d, 0xf8, 0x12, 0x10, 0x9d, 0xf8, 0x10, 0x00, + 0xe9, 0xf7, 0xd5, 0xfb, 0x9d, 0xf8, 0x18, 0x00, 0x30, 0x73, 0xc4, 0x34, + 0x9d, 0xf8, 0x13, 0x10, 0x21, 0x77, 0x9b, 0xf8, 0x05, 0x00, 0x00, 0x28, + 0x04, 0xbf, 0xba, 0xf1, 0x00, 0x0f, 0x4f, 0xf4, 0x80, 0x3a, 0x68, 0x46, + 0xdc, 0xf7, 0x44, 0xfa, 0x01, 0x98, 0x0e, 0x90, 0x0e, 0xa8, 0xdc, 0xf7, + 0x1b, 0xfa, 0x11, 0x98, 0xa0, 0x61, 0x69, 0xb0, 0x50, 0x46, 0xbd, 0xe8, + 0xf0, 0x8f, 0x00, 0x20, 0x09, 0x29, 0x05, 0xd2, 0x08, 0x4b, 0x03, 0xeb, + 0x81, 0x01, 0x13, 0x68, 0x0b, 0x60, 0x70, 0x47, 0x04, 0x20, 0x70, 0x47, + 0x30, 0x39, 0x00, 0x21, 0x3e, 0x76, 0x02, 0x21, 0x18, 0x39, 0x00, 0x21, + 0xc1, 0x05, 0xd9, 0x01, 0x1c, 0x91, 0x04, 0x02, 0x84, 0x3d, 0x00, 0x21, + 0x2d, 0xe9, 0xfc, 0x41, 0x1f, 0x46, 0x08, 0x9e, 0x00, 0x23, 0x0d, 0x46, + 0x90, 0x46, 0x8d, 0xf8, 0x00, 0x30, 0x04, 0x46, 0x6a, 0x46, 0x0c, 0x21, + 0xe9, 0xf7, 0x79, 0xfb, 0x33, 0x46, 0x00, 0xf0, 0x0c, 0xf8, 0x38, 0x70, + 0x73, 0x1c, 0x00, 0xf0, 0x08, 0xf8, 0x78, 0x70, 0x20, 0x46, 0x9d, 0xf8, + 0x00, 0x10, 0xe9, 0xf7, 0x6e, 0xfb, 0xbd, 0xe8, 0xf3, 0x81, 0x42, 0x46, + 0x29, 0x46, 0x20, 0x46, 0xe9, 0xf7, 0x69, 0xbb, 0xe9, 0xf7, 0x69, 0xbb, + 0x10, 0xb5, 0x04, 0x46, 0x11, 0xb1, 0x01, 0x29, 0x06, 0xd0, 0x10, 0xbd, + 0x08, 0x22, 0x08, 0x21, 0xe9, 0xf7, 0x34, 0xfb, 0x02, 0x22, 0x04, 0xe0, + 0x04, 0x22, 0x04, 0x21, 0xe9, 0xf7, 0x2e, 0xfb, 0x01, 0x22, 0x20, 0x46, + 0xbd, 0xe8, 0x10, 0x40, 0x11, 0x46, 0xe9, 0xf7, 0x29, 0xbb, 0x11, 0xb1, + 0x01, 0x29, 0x03, 0xd0, 0x70, 0x47, 0x0f, 0x22, 0xfc, 0x21, 0x01, 0xe0, + 0x0f, 0x22, 0xfd, 0x21, 0xe9, 0xf7, 0x20, 0xbb, 0x2d, 0xe9, 0xf0, 0x41, + 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0x98, 0x46, 0x00, 0x27, 0xdf, 0xf8, + 0x88, 0x0b, 0x00, 0xeb, 0x86, 0x03, 0xf8, 0xb2, 0x08, 0xeb, 0xc5, 0x02, + 0x19, 0x5c, 0x0a, 0x44, 0x01, 0xeb, 0x05, 0x11, 0xc9, 0xb2, 0x20, 0x46, + 0xe9, 0xf7, 0x2f, 0xf9, 0x7f, 0x1c, 0xfa, 0xb2, 0x04, 0x2a, 0xec, 0xd3, + 0xbd, 0xe8, 0xf0, 0x81, 0xf8, 0xb5, 0x84, 0xb0, 0x97, 0x1c, 0x0a, 0x9e, + 0x0b, 0x9c, 0x00, 0x92, 0x01, 0x97, 0x15, 0x1d, 0x02, 0x95, 0x97, 0x1d, + 0x03, 0x97, 0x00, 0x22, 0x06, 0xeb, 0xc0, 0x00, 0xdf, 0xf8, 0x40, 0x6b, + 0x06, 0xeb, 0x81, 0x05, 0xae, 0x5c, 0x5d, 0xf8, 0x22, 0x50, 0x2d, 0x88, + 0x87, 0x5d, 0xab, 0x42, 0x2c, 0xbf, 0xe7, 0x19, 0x3f, 0x1b, 0x52, 0x1c, + 0x87, 0x55, 0x04, 0x2a, 0xee, 0xd3, 0x05, 0xb0, 0xf0, 0xbd, 0x02, 0xeb, + 0xc0, 0x00, 0x0a, 0x46, 0x52, 0x42, 0x02, 0x44, 0x08, 0x44, 0x53, 0x70, + 0x83, 0x70, 0x53, 0x71, 0x83, 0x71, 0x70, 0x47, 0xff, 0xb5, 0x00, 0xf0, + 0x2a, 0xf8, 0x02, 0xeb, 0xc0, 0x00, 0x00, 0xf0, 0x1c, 0xf8, 0xb5, 0x18, + 0x20, 0x2d, 0x34, 0xbf, 0xb2, 0x18, 0x1f, 0x22, 0x64, 0x1c, 0x04, 0x2c, + 0x3a, 0x70, 0xf4, 0xd3, 0xff, 0xbd, 0xd8, 0xb5, 0x84, 0xb0, 0x02, 0xeb, + 0xc0, 0x00, 0x00, 0xf0, 0x16, 0xf8, 0x00, 0xf0, 0x0a, 0xf8, 0x96, 0x42, + 0x34, 0xbf, 0x92, 0x1b, 0x00, 0x22, 0x64, 0x1c, 0x04, 0x2c, 0x3a, 0x70, + 0xf5, 0xd3, 0x05, 0xb0, 0xd0, 0xbd, 0xdf, 0xf8, 0xc0, 0x2a, 0x1e, 0x78, + 0x02, 0xeb, 0x81, 0x07, 0x3a, 0x5d, 0x82, 0x5c, 0x5d, 0xf8, 0x24, 0x70, + 0x70, 0x47, 0x09, 0x9e, 0x00, 0x96, 0x74, 0x1c, 0x01, 0x94, 0xb7, 0x1c, + 0xf6, 0x1c, 0x02, 0x97, 0x03, 0x96, 0x00, 0x24, 0x70, 0x47, 0x2d, 0xe9, + 0xf6, 0x4f, 0x8b, 0x46, 0x8d, 0xb0, 0x09, 0xae, 0x19, 0x99, 0x81, 0x46, + 0x18, 0x98, 0x44, 0x88, 0x09, 0x91, 0x01, 0xaf, 0x19, 0x99, 0xcd, 0xf8, + 0x14, 0xd0, 0x4a, 0x1c, 0x72, 0x60, 0x64, 0x1e, 0x19, 0x99, 0x8a, 0x1c, + 0xb2, 0x60, 0x03, 0xeb, 0xcb, 0x08, 0x19, 0x99, 0xca, 0x1c, 0xf2, 0x60, + 0x05, 0xa9, 0x0d, 0xf1, 0x02, 0x02, 0x4a, 0x60, 0x8f, 0x60, 0x0d, 0xf1, + 0x06, 0x02, 0xca, 0x60, 0xe4, 0x03, 0x9d, 0xf8, 0x38, 0x20, 0x9d, 0xf8, + 0x38, 0x10, 0x07, 0x78, 0x52, 0x42, 0x41, 0x44, 0x42, 0x44, 0x24, 0x0c, + 0x7f, 0x00, 0x04, 0x91, 0x03, 0x92, 0x65, 0xe0, 0x00, 0x2a, 0x58, 0xd5, + 0x56, 0xf8, 0x2c, 0x10, 0x08, 0x78, 0x00, 0x28, 0x53, 0xd0, 0x56, 0xf8, + 0x2c, 0x00, 0x90, 0xf8, 0x00, 0xe0, 0x96, 0x44, 0x80, 0xf8, 0x00, 0xe0, + 0x4b, 0xe0, 0x03, 0x98, 0x41, 0x78, 0x2f, 0x29, 0x1e, 0xbf, 0x04, 0x98, + 0x81, 0x78, 0x2f, 0x29, 0x07, 0xd0, 0x03, 0x98, 0x41, 0x79, 0x2f, 0x29, + 0x1e, 0xbf, 0x04, 0x98, 0x81, 0x79, 0x2f, 0x29, 0x49, 0xd1, 0x9d, 0xf8, + 0x38, 0xa0, 0x00, 0x25, 0xdf, 0xf8, 0xf4, 0x09, 0x00, 0xeb, 0x8a, 0x01, + 0x02, 0x91, 0x49, 0x5d, 0x18, 0xf8, 0x01, 0x20, 0x2f, 0x2a, 0x07, 0xd1, + 0x56, 0xf8, 0x25, 0x20, 0x01, 0xeb, 0x0b, 0x11, 0xc9, 0xb2, 0x48, 0x46, + 0xe9, 0xf7, 0x63, 0xf8, 0x6d, 0x1c, 0x04, 0x2d, 0xea, 0xd3, 0x00, 0xf0, + 0x82, 0xfb, 0x48, 0x46, 0xe9, 0xf7, 0x4f, 0xf8, 0x69, 0x46, 0x48, 0x46, + 0xe9, 0xf7, 0x28, 0xfa, 0x9d, 0xf9, 0x68, 0x20, 0x4f, 0xf0, 0x00, 0x0c, + 0x05, 0xab, 0x02, 0x98, 0x10, 0xf8, 0x0c, 0x00, 0x18, 0xf8, 0x00, 0x10, + 0x2f, 0x29, 0x0e, 0xd1, 0x53, 0xf8, 0x2c, 0x10, 0x09, 0x88, 0x00, 0x2a, + 0x02, 0xdd, 0xa1, 0x42, 0xb3, 0xdb, 0x01, 0xe0, 0x8c, 0x42, 0xa9, 0xdb, + 0x56, 0xf8, 0x2c, 0x10, 0x09, 0x78, 0x08, 0xf8, 0x00, 0x10, 0x0c, 0xf1, + 0x01, 0x0c, 0xbc, 0xf1, 0x04, 0x0f, 0xe4, 0xd3, 0x8d, 0xf8, 0x68, 0x20, + 0x7f, 0x1e, 0x19, 0x98, 0x00, 0xf0, 0x04, 0xf8, 0xf8, 0xb2, 0x00, 0x28, + 0xa5, 0xd1, 0x3d, 0xe1, 0x01, 0x78, 0x20, 0x29, 0x24, 0xbf, 0x1f, 0x22, + 0x02, 0x70, 0x41, 0x78, 0x20, 0x29, 0x24, 0xbf, 0x1f, 0x22, 0x42, 0x70, + 0x81, 0x78, 0x20, 0x29, 0x24, 0xbf, 0x1f, 0x22, 0x82, 0x70, 0xc1, 0x78, + 0x20, 0x29, 0x24, 0xbf, 0x1f, 0x22, 0xc2, 0x70, 0x70, 0x47, 0x2d, 0xe9, + 0xf8, 0x4f, 0x0a, 0x9c, 0x0b, 0x9d, 0x4f, 0xf0, 0x00, 0x0a, 0x04, 0xeb, + 0xc1, 0x08, 0x05, 0xeb, 0xc1, 0x07, 0x8d, 0xf8, 0x00, 0xa0, 0x00, 0x26, + 0x03, 0xeb, 0xc1, 0x0b, 0x04, 0x46, 0x0d, 0x46, 0x91, 0x46, 0xdf, 0xf8, + 0x18, 0x09, 0x00, 0xeb, 0x89, 0x02, 0xf3, 0xb2, 0x4a, 0xf0, 0x40, 0x00, + 0xd1, 0x5c, 0x1b, 0xf8, 0x01, 0x20, 0x2f, 0x2a, 0x06, 0xd1, 0x7b, 0x18, + 0x01, 0x22, 0x1a, 0x74, 0x1f, 0x22, 0x8d, 0xf8, 0x00, 0x20, 0x08, 0xe0, + 0x18, 0xf8, 0x01, 0x30, 0x2f, 0x2b, 0x06, 0xd1, 0x00, 0x22, 0x8d, 0xf8, + 0x00, 0x20, 0x01, 0x23, 0x7b, 0x54, 0x82, 0x46, 0x0a, 0xe0, 0x07, 0xeb, + 0x01, 0x0e, 0x9a, 0x18, 0x00, 0x20, 0x78, 0x54, 0x12, 0x04, 0x8e, 0xf8, + 0x10, 0x00, 0x52, 0x0c, 0x8d, 0xf8, 0x00, 0x20, 0x01, 0xeb, 0x05, 0x11, + 0x6a, 0x46, 0xc9, 0xb2, 0x20, 0x46, 0xe8, 0xf7, 0xd6, 0xff, 0x76, 0x1c, + 0xf2, 0xb2, 0x04, 0x2a, 0xcb, 0xd3, 0x50, 0x46, 0xbd, 0xe8, 0xf2, 0x8f, + 0x2d, 0xe9, 0xfc, 0x41, 0x04, 0x46, 0x88, 0x46, 0x16, 0x46, 0x1f, 0x46, + 0x00, 0x25, 0x01, 0x97, 0x00, 0x96, 0x43, 0x46, 0x00, 0x22, 0xe9, 0xb2, + 0x20, 0x46, 0xff, 0xf7, 0xa8, 0xff, 0x01, 0x97, 0x00, 0x96, 0x43, 0x46, + 0x01, 0x22, 0xe9, 0xb2, 0x20, 0x46, 0xff, 0xf7, 0xa0, 0xff, 0x6d, 0x1c, + 0xe8, 0xb2, 0x02, 0x28, 0xeb, 0xd3, 0xbd, 0xe8, 0xf3, 0x81, 0x2d, 0xe9, + 0xf0, 0x4f, 0x89, 0x46, 0x16, 0x46, 0x19, 0x46, 0x80, 0x46, 0x01, 0x23, + 0x01, 0x22, 0x8f, 0xb0, 0xb9, 0xf8, 0x02, 0x40, 0xe8, 0xf7, 0x40, 0xff, + 0x49, 0x46, 0x40, 0x46, 0x00, 0xf0, 0xe2, 0xfc, 0x00, 0x23, 0x00, 0xf0, + 0xc7, 0xf8, 0x01, 0x23, 0x00, 0x22, 0x03, 0x21, 0x40, 0x46, 0xe9, 0xf7, + 0x84, 0xf9, 0x02, 0x23, 0x00, 0xf0, 0xbe, 0xf8, 0x03, 0x23, 0x00, 0x22, + 0x03, 0x21, 0x40, 0x46, 0x64, 0x1e, 0xe9, 0xf7, 0x7a, 0xf9, 0x4f, 0xf0, + 0x00, 0x0b, 0xe4, 0x03, 0x00, 0x25, 0xea, 0xb2, 0x00, 0x21, 0x40, 0x46, + 0xe8, 0xf7, 0x67, 0xff, 0xea, 0xb2, 0x01, 0x21, 0x40, 0x46, 0xe8, 0xf7, + 0x62, 0xff, 0x6d, 0x1c, 0xe8, 0xb2, 0x01, 0x28, 0xf1, 0xd9, 0x0a, 0x96, + 0x00, 0x25, 0xdd, 0xf8, 0x60, 0xa0, 0x00, 0x26, 0xe9, 0xb2, 0x40, 0x46, + 0xff, 0xf7, 0x0c, 0xfe, 0xf1, 0xb2, 0x40, 0x46, 0xff, 0xf7, 0x1f, 0xfe, + 0xeb, 0xb2, 0xf2, 0xb2, 0x1f, 0x21, 0x40, 0x46, 0xe8, 0xf7, 0x49, 0xff, + 0x10, 0x23, 0x00, 0xf0, 0x87, 0xf8, 0x10, 0x27, 0x06, 0xab, 0xf2, 0xb2, + 0xe9, 0xb2, 0x40, 0x46, 0xff, 0xf7, 0x1a, 0xfe, 0x00, 0xf0, 0x81, 0xfa, + 0x40, 0x46, 0xe8, 0xf7, 0x4e, 0xff, 0x04, 0xa9, 0x40, 0x46, 0xe9, 0xf7, + 0x27, 0xf9, 0x7f, 0x10, 0xf8, 0xb2, 0x06, 0xa9, 0x01, 0x90, 0x00, 0x91, + 0x23, 0x0c, 0x04, 0xaa, 0xf1, 0xb2, 0xe8, 0xb2, 0xff, 0xf7, 0x22, 0xfe, + 0x00, 0x2f, 0xe3, 0xd1, 0x2f, 0x23, 0x0b, 0xaa, 0x00, 0xf0, 0x67, 0xf8, + 0x00, 0xf0, 0x5d, 0xf8, 0xff, 0xf7, 0x44, 0xfe, 0x4f, 0xf0, 0xff, 0x30, + 0x00, 0xf0, 0x51, 0xf8, 0x0b, 0xab, 0x00, 0xf0, 0x5f, 0xf8, 0x00, 0xf0, + 0x52, 0xf8, 0xff, 0xf7, 0x4a, 0xfe, 0x2f, 0x23, 0x00, 0xf0, 0x54, 0xf8, + 0x01, 0x20, 0x00, 0xf0, 0x44, 0xf8, 0x06, 0xab, 0x00, 0xf0, 0x52, 0xf8, + 0x0b, 0xa8, 0x00, 0x90, 0xcd, 0xf8, 0x04, 0xa0, 0x06, 0xab, 0xf2, 0xb2, + 0xe9, 0xb2, 0x40, 0x46, 0xff, 0xf7, 0x0b, 0xff, 0x40, 0xea, 0x0b, 0x0b, + 0x0a, 0x98, 0x01, 0x28, 0x0e, 0xd1, 0x0f, 0xf6, 0xdc, 0x00, 0x00, 0x88, + 0xad, 0xf8, 0x08, 0x00, 0x02, 0xa9, 0x00, 0x91, 0xcd, 0xf8, 0x04, 0xa0, + 0x4b, 0x46, 0xf2, 0xb2, 0xe9, 0xb2, 0x40, 0x46, 0x00, 0xf0, 0x16, 0xfb, + 0xeb, 0xb2, 0xf2, 0xb2, 0x00, 0x21, 0x40, 0x46, 0xe8, 0xf7, 0xe9, 0xfe, + 0xea, 0xb2, 0xf1, 0xb2, 0x40, 0x46, 0xe8, 0xf7, 0xe6, 0xfe, 0x76, 0x1c, + 0xf0, 0xb2, 0x01, 0x28, 0x88, 0xd9, 0x6d, 0x1c, 0xe9, 0xb2, 0x01, 0x29, + 0x83, 0xd9, 0x0a, 0x98, 0x01, 0x28, 0x04, 0xbf, 0x50, 0x46, 0x00, 0xf0, + 0x9a, 0xfb, 0x53, 0x46, 0x0b, 0xaa, 0x06, 0xa9, 0x40, 0x46, 0xff, 0xf7, + 0x21, 0xff, 0x58, 0x46, 0x0f, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x03, 0xa9, + 0x02, 0x90, 0x01, 0x91, 0xcd, 0xf8, 0x00, 0x90, 0x70, 0x47, 0x03, 0xa8, + 0x00, 0x90, 0x4b, 0x46, 0x06, 0xaa, 0xf1, 0xb2, 0xe8, 0xb2, 0x70, 0x47, + 0x06, 0xaa, 0xf1, 0xb2, 0xe8, 0xb2, 0xd2, 0xe5, 0xf2, 0xb2, 0xe9, 0xb2, + 0x40, 0x46, 0x10, 0xe6, 0x00, 0x22, 0x02, 0x21, 0x40, 0x46, 0xe9, 0xf7, + 0xbe, 0xb8, 0x00, 0x00, 0x2d, 0xe9, 0xf2, 0x4f, 0x96, 0xb0, 0x00, 0x21, + 0x80, 0x46, 0x8d, 0xf8, 0x28, 0x10, 0x14, 0x46, 0x1d, 0x46, 0x68, 0x46, + 0xdb, 0xf7, 0x50, 0xff, 0x40, 0x46, 0xdb, 0xf7, 0x6f, 0xff, 0x9d, 0xf8, + 0x58, 0x00, 0x01, 0x28, 0x0c, 0xd0, 0x40, 0x46, 0xe9, 0xf7, 0xc7, 0xf8, + 0x8d, 0xf8, 0x28, 0x00, 0x00, 0x21, 0x40, 0x46, 0xe9, 0xf7, 0xc3, 0xf8, + 0x01, 0x21, 0x40, 0x46, 0xe9, 0xf7, 0xc3, 0xf8, 0x08, 0x94, 0xdd, 0xf8, + 0x80, 0xa0, 0x61, 0x78, 0xca, 0x08, 0x00, 0x24, 0x02, 0xf0, 0x01, 0x02, + 0x0a, 0xf1, 0x70, 0x07, 0x12, 0x92, 0x8d, 0xf8, 0x14, 0x40, 0x00, 0x20, + 0x78, 0x70, 0x3c, 0x70, 0x0d, 0xf1, 0x4c, 0x09, 0x06, 0xae, 0x21, 0xfa, + 0x00, 0xf2, 0x02, 0xf0, 0x01, 0x02, 0x49, 0xf8, 0x20, 0x20, 0x01, 0x28, + 0x0c, 0xbf, 0x02, 0x23, 0x03, 0x46, 0x33, 0x54, 0x14, 0x19, 0x40, 0x1c, + 0x02, 0x28, 0xf0, 0xd9, 0xc1, 0xf3, 0x03, 0x10, 0x00, 0x21, 0x07, 0x90, + 0x09, 0x91, 0x00, 0x26, 0x8d, 0xf8, 0x15, 0x50, 0x40, 0x46, 0xdb, 0xf7, + 0x31, 0xff, 0x59, 0xf8, 0x26, 0x50, 0x4f, 0xf0, 0x00, 0x0b, 0x4d, 0xb1, + 0x06, 0xa8, 0x10, 0xf8, 0x06, 0xb0, 0x59, 0x46, 0x40, 0x46, 0xe9, 0xf7, + 0x72, 0xf8, 0x87, 0xf8, 0x00, 0xb0, 0x01, 0xe0, 0x00, 0x2c, 0x3a, 0xd1, + 0x9d, 0xf8, 0x15, 0x20, 0x08, 0x99, 0xcd, 0xf8, 0x00, 0xa0, 0x0a, 0xab, + 0x40, 0x46, 0xff, 0xf7, 0xb8, 0xfe, 0x83, 0x46, 0x9d, 0xf8, 0x15, 0x00, + 0x08, 0x99, 0x00, 0x90, 0xcd, 0xf8, 0x04, 0xa0, 0x01, 0x23, 0x0a, 0xaa, + 0x40, 0x46, 0x00, 0xf0, 0x85, 0xf9, 0x40, 0xea, 0x0b, 0x0b, 0x08, 0x98, + 0xc0, 0x79, 0x10, 0xf0, 0x0f, 0x0f, 0x15, 0xd0, 0x81, 0x09, 0x00, 0xf0, + 0x1f, 0x00, 0x02, 0x90, 0x49, 0x1c, 0xc9, 0xb2, 0x9d, 0xf8, 0x15, 0x00, + 0x04, 0x91, 0x00, 0x22, 0x03, 0x92, 0x00, 0x90, 0xcd, 0xf8, 0x04, 0xa0, + 0x00, 0x23, 0x08, 0x99, 0x0a, 0xaa, 0x40, 0x46, 0x00, 0xf0, 0xe8, 0xfa, + 0x40, 0xea, 0x0b, 0x0b, 0x78, 0x78, 0x18, 0xb9, 0x00, 0xf0, 0xac, 0xf8, + 0x00, 0xf0, 0xb0, 0xf8, 0x78, 0x78, 0x40, 0x1c, 0x78, 0x70, 0x01, 0x23, + 0x01, 0x22, 0x0a, 0xf1, 0x48, 0x01, 0x40, 0x46, 0x00, 0xf0, 0xa6, 0xf8, + 0x1b, 0xf0, 0xc0, 0x0f, 0x06, 0xd0, 0x78, 0x78, 0xe1, 0xb2, 0x88, 0x42, + 0x1e, 0xd2, 0xcd, 0xf8, 0x24, 0xb0, 0x65, 0xe0, 0xe6, 0xb9, 0xd9, 0xf8, + 0x04, 0x00, 0xc8, 0xb1, 0x07, 0x9a, 0x07, 0x98, 0xc2, 0xf1, 0x1f, 0x02, + 0x00, 0x21, 0xd2, 0xb2, 0x00, 0x23, 0x0a, 0xf1, 0x4c, 0x05, 0x5f, 0xfa, + 0x83, 0xfc, 0x15, 0xf8, 0x0c, 0x50, 0xaa, 0x42, 0xac, 0xbf, 0x85, 0x42, + 0x01, 0x21, 0x5b, 0x1c, 0xdd, 0xb2, 0x10, 0x2d, 0xf1, 0xd3, 0x00, 0x29, + 0x07, 0x90, 0x49, 0xd1, 0x04, 0x26, 0x47, 0xe0, 0x0c, 0xb1, 0x00, 0x2d, + 0x4b, 0xd0, 0x12, 0x98, 0x04, 0x26, 0x00, 0x28, 0x40, 0xd1, 0x78, 0x78, + 0x01, 0x28, 0x3d, 0xd9, 0x00, 0xf0, 0x6c, 0xf8, 0x00, 0xf0, 0xa5, 0xf8, + 0x9d, 0xf8, 0x14, 0x10, 0x40, 0x46, 0xe8, 0xf7, 0xf0, 0xff, 0x9d, 0xf8, + 0x14, 0x00, 0x38, 0x70, 0x07, 0x9a, 0x09, 0x99, 0x00, 0x23, 0x0a, 0xeb, + 0x03, 0x00, 0x00, 0xf1, 0x4c, 0x05, 0x28, 0x7d, 0x00, 0x28, 0x18, 0xbf, + 0x1f, 0x28, 0x1f, 0xd1, 0x00, 0xee, 0x10, 0x0a, 0x28, 0x78, 0x10, 0x38, + 0x00, 0xee, 0x90, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x9f, 0xed, 0x25, 0x1a, + 0xf3, 0xee, 0x00, 0x1a, 0xb8, 0xee, 0x40, 0x0a, 0x40, 0xee, 0x81, 0x1a, + 0xd0, 0xb2, 0x30, 0xee, 0x61, 0x0a, 0x00, 0xee, 0x90, 0x0a, 0xb0, 0xee, + 0xc0, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x44, 0xbf, 0x8b, 0x46, 0x10, 0x23, 0x5b, 0x1c, 0xdb, 0xb2, + 0x10, 0x2b, 0xd2, 0xd3, 0x07, 0x92, 0x09, 0x91, 0x59, 0xf8, 0x26, 0x00, + 0x18, 0xb1, 0x06, 0xa9, 0x88, 0x5d, 0x8d, 0xf8, 0x14, 0x00, 0x76, 0x1c, + 0xf6, 0xb2, 0x02, 0x2e, 0x7f, 0xf6, 0x2e, 0xaf, 0x9d, 0xf8, 0x58, 0x00, + 0x01, 0x28, 0x03, 0xd0, 0x00, 0x21, 0x40, 0x46, 0xe8, 0xf7, 0xbf, 0xff, + 0x40, 0x46, 0xdb, 0xf7, 0x63, 0xfe, 0x78, 0x60, 0x40, 0x46, 0xdb, 0xf7, + 0x65, 0xfe, 0xb8, 0x60, 0x08, 0xb1, 0x4b, 0xf4, 0x80, 0x5b, 0x68, 0x46, + 0xdb, 0xf7, 0x36, 0xfe, 0x01, 0x98, 0x0e, 0x90, 0x0e, 0xa8, 0xdb, 0xf7, + 0x0d, 0xfe, 0x11, 0x98, 0xf8, 0x60, 0x17, 0xb0, 0x58, 0x46, 0xbd, 0xe8, + 0xf0, 0x8f, 0x00, 0x00, 0x71, 0x3d, 0xaa, 0x3f, 0x01, 0x23, 0x01, 0x22, + 0x0a, 0xf1, 0x5c, 0x01, 0x40, 0x46, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x43, + 0x01, 0x2b, 0x80, 0x46, 0x0d, 0x46, 0x16, 0x46, 0x0e, 0xd1, 0xe8, 0xf7, + 0x6e, 0xfd, 0x28, 0x70, 0x40, 0x46, 0xe8, 0xf7, 0x6c, 0xfd, 0x68, 0x70, + 0x40, 0x46, 0xe8, 0xf7, 0x6a, 0xfd, 0xa8, 0x70, 0x40, 0x46, 0xe8, 0xf7, + 0x68, 0xfd, 0xe8, 0x70, 0x01, 0x2e, 0x1a, 0xd1, 0x00, 0x26, 0x00, 0x27, + 0x00, 0x24, 0x00, 0xf0, 0x46, 0xf8, 0x05, 0xeb, 0x00, 0x09, 0xe3, 0xb2, + 0xfa, 0xb2, 0xf1, 0xb2, 0x40, 0x46, 0xe8, 0xf7, 0x4a, 0xfd, 0x89, 0xf8, + 0x04, 0x00, 0x64, 0x1c, 0xe0, 0xb2, 0x04, 0x28, 0xef, 0xd3, 0x7f, 0x1c, + 0xf9, 0xb2, 0x02, 0x29, 0xea, 0xd3, 0x76, 0x1c, 0xf0, 0xb2, 0x02, 0x28, + 0xe5, 0xd3, 0xbd, 0xe8, 0xf1, 0x83, 0x2d, 0xe9, 0xfc, 0x41, 0x01, 0x2b, + 0x80, 0x46, 0x0d, 0x46, 0x16, 0x46, 0x08, 0xd1, 0x6a, 0x78, 0x29, 0x78, + 0xe8, 0xf7, 0x33, 0xfd, 0xea, 0x78, 0xa9, 0x78, 0x40, 0x46, 0xe8, 0xf7, + 0x30, 0xfd, 0x01, 0x2e, 0x19, 0xd1, 0x00, 0x26, 0x00, 0x27, 0x00, 0x24, + 0x00, 0xf0, 0x17, 0xf8, 0x28, 0x44, 0xe3, 0xb2, 0x01, 0x79, 0x00, 0x91, + 0xfa, 0xb2, 0xf1, 0xb2, 0x40, 0x46, 0xe8, 0xf7, 0x0f, 0xfd, 0x64, 0x1c, + 0xe0, 0xb2, 0x04, 0x28, 0xf0, 0xd3, 0x7f, 0x1c, 0xf9, 0xb2, 0x02, 0x29, + 0xeb, 0xd3, 0x76, 0x1c, 0xf0, 0xb2, 0x02, 0x28, 0xe6, 0xd3, 0xbd, 0xe8, + 0xf3, 0x81, 0xb8, 0x00, 0x00, 0xeb, 0xc6, 0x00, 0x20, 0x18, 0xc0, 0xb2, + 0x70, 0x47, 0x2d, 0xe9, 0xfc, 0x4d, 0x5d, 0x88, 0x9d, 0xf9, 0x2c, 0x40, + 0x6d, 0x1e, 0xed, 0x03, 0x2d, 0x0c, 0x01, 0x2c, 0xac, 0xbf, 0x01, 0x26, + 0x1f, 0x26, 0x82, 0x46, 0x8b, 0x46, 0x90, 0x46, 0x01, 0x27, 0xc6, 0xf1, + 0x20, 0x03, 0xdb, 0xb2, 0xf2, 0xb2, 0x59, 0x46, 0x50, 0x46, 0xe8, 0xf7, + 0x0c, 0xfd, 0x00, 0xf0, 0x2c, 0xf8, 0x50, 0x46, 0xe8, 0xf7, 0xf9, 0xfc, + 0x00, 0x21, 0x50, 0x46, 0xe8, 0xf7, 0xd0, 0xfe, 0x01, 0x2c, 0x0b, 0xd1, + 0xa8, 0x42, 0x0f, 0xdb, 0x0a, 0x98, 0xff, 0xb2, 0x20, 0x2f, 0x58, 0x44, + 0x14, 0xd1, 0x01, 0x2c, 0xac, 0xbf, 0x1f, 0x26, 0x01, 0x26, 0x0b, 0xe0, + 0x4f, 0xf0, 0xff, 0x32, 0x94, 0x42, 0x01, 0xd1, 0x85, 0x42, 0xef, 0xda, + 0x7f, 0x1c, 0xa6, 0x19, 0xf8, 0xb2, 0x20, 0x28, 0xd5, 0xd3, 0xe9, 0xe7, + 0x01, 0x21, 0x80, 0xf8, 0x22, 0x10, 0x02, 0xe0, 0x00, 0x22, 0x80, 0xf8, + 0x22, 0x20, 0x88, 0xf8, 0x00, 0x60, 0xbd, 0xe8, 0xf3, 0x8d, 0x01, 0x20, + 0xdb, 0xf7, 0xb3, 0xbc, 0x2d, 0xe9, 0xfe, 0x4f, 0x0d, 0x9c, 0x8a, 0x46, + 0x90, 0x46, 0x1e, 0x46, 0x81, 0x46, 0x00, 0x23, 0x01, 0x22, 0x04, 0xf1, + 0x48, 0x01, 0xff, 0xf7, 0x41, 0xff, 0x01, 0x2e, 0x4f, 0xf0, 0x00, 0x0b, + 0x09, 0xd0, 0x01, 0x23, 0x01, 0x22, 0x41, 0x46, 0x48, 0x46, 0xe8, 0xf7, + 0x5d, 0xfc, 0x51, 0x46, 0x48, 0x46, 0x00, 0xf0, 0xff, 0xf9, 0x00, 0x21, + 0x48, 0x46, 0xe8, 0xf7, 0xa0, 0xfc, 0x00, 0xf0, 0xe9, 0xf9, 0x00, 0xf0, + 0xdd, 0xf9, 0x00, 0xf0, 0xf0, 0xf9, 0x0c, 0x9e, 0x00, 0x27, 0x00, 0xf0, + 0x64, 0xf8, 0xf8, 0xb2, 0x38, 0xb9, 0x00, 0xf0, 0xd8, 0xf9, 0x08, 0x21, + 0x48, 0x46, 0xe8, 0xf7, 0x8e, 0xfc, 0x00, 0x23, 0x0b, 0xe0, 0x01, 0x28, + 0x0b, 0xd1, 0x00, 0x22, 0x04, 0x21, 0x48, 0x46, 0xe8, 0xf7, 0x74, 0xfe, + 0x02, 0x21, 0x48, 0x46, 0xe8, 0xf7, 0x81, 0xfc, 0x01, 0x23, 0x00, 0xf0, + 0xcf, 0xf9, 0x01, 0x20, 0x01, 0x90, 0x00, 0x94, 0x53, 0x46, 0x0d, 0xf1, + 0x09, 0x02, 0xf9, 0xb2, 0x48, 0x46, 0xff, 0xf7, 0x6c, 0xff, 0x4f, 0xf0, + 0xff, 0x30, 0x01, 0x90, 0x00, 0x94, 0x53, 0x46, 0x02, 0xaa, 0xf9, 0xb2, + 0x48, 0x46, 0xff, 0xf7, 0x62, 0xff, 0xf8, 0xb2, 0x20, 0x18, 0x20, 0x30, + 0x81, 0x78, 0x01, 0x29, 0x1a, 0xbf, 0x00, 0x78, 0x01, 0x28, 0x4b, 0xf0, + 0x80, 0x0b, 0x9d, 0xf8, 0x09, 0x00, 0x9d, 0xf8, 0x08, 0x10, 0x0d, 0x18, + 0x2d, 0x04, 0x6d, 0x0c, 0x01, 0x2e, 0x0e, 0xd1, 0x0f, 0xf2, 0x84, 0x30, + 0x00, 0x88, 0xad, 0xf8, 0x0a, 0x00, 0x01, 0x94, 0x0d, 0xf1, 0x0a, 0x01, + 0x00, 0x91, 0xeb, 0xb2, 0x52, 0x46, 0xf9, 0xb2, 0x48, 0x46, 0x00, 0xf0, + 0xb3, 0xf8, 0xc5, 0xf1, 0x20, 0x03, 0xdb, 0xb2, 0xea, 0xb2, 0xf9, 0xb2, + 0x48, 0x46, 0xe8, 0xf7, 0x5c, 0xfc, 0x7f, 0x1c, 0xf8, 0xb2, 0x02, 0x28, + 0xa3, 0xd3, 0x00, 0xf0, 0x08, 0xf8, 0x01, 0x22, 0x41, 0x46, 0x48, 0x46, + 0xe8, 0xf7, 0xec, 0xfb, 0x58, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, 0x00, 0x23, + 0x01, 0x22, 0x04, 0xf1, 0x48, 0x01, 0x48, 0x46, 0xef, 0xe6, 0x08, 0x18, + 0x00, 0x21, 0x01, 0x2a, 0x40, 0xb2, 0x08, 0xbf, 0x01, 0x21, 0x88, 0x42, + 0xb8, 0xbf, 0x08, 0x46, 0x1f, 0x28, 0xc8, 0xbf, 0x1f, 0x20, 0xc0, 0xb2, + 0x70, 0x47, 0xff, 0xb5, 0x9e, 0x1c, 0x01, 0x96, 0x00, 0x93, 0x9e, 0x1d, + 0x0a, 0x9d, 0x03, 0x96, 0x05, 0xeb, 0xc0, 0x05, 0x1f, 0x1d, 0x01, 0x23, + 0x59, 0x48, 0x02, 0x97, 0x16, 0x00, 0x00, 0xeb, 0x81, 0x01, 0x12, 0xd1, + 0x00, 0x22, 0x8e, 0x5c, 0xaf, 0x19, 0x00, 0x20, 0x87, 0xf8, 0x24, 0x00, + 0x5d, 0xf8, 0x22, 0x40, 0x20, 0x88, 0x20, 0xb1, 0x2e, 0x44, 0x01, 0x20, + 0x00, 0x23, 0x86, 0xf8, 0x24, 0x00, 0x52, 0x1c, 0x04, 0x2a, 0xee, 0xd3, + 0x17, 0xe0, 0x01, 0x2a, 0x14, 0xd1, 0x09, 0x98, 0x00, 0x22, 0x8e, 0x5c, + 0xac, 0x19, 0x00, 0x27, 0x84, 0xf8, 0x24, 0x70, 0x5d, 0xf8, 0x22, 0x40, + 0x27, 0x88, 0x87, 0x42, 0x04, 0xd2, 0x2e, 0x44, 0x01, 0x24, 0x00, 0x23, + 0x86, 0xf8, 0x24, 0x40, 0x52, 0x1c, 0x04, 0x2a, 0xed, 0xd3, 0x00, 0xe0, + 0x00, 0x23, 0x18, 0x46, 0x04, 0xb0, 0xf0, 0xbd, 0x2d, 0xe9, 0xf0, 0x4f, + 0x85, 0xb0, 0x81, 0x46, 0x58, 0x88, 0x0e, 0x9c, 0x8a, 0x46, 0x41, 0x1e, + 0x93, 0x46, 0xad, 0xf8, 0x08, 0x10, 0x6f, 0xf0, 0x02, 0x08, 0x00, 0x27, + 0x02, 0xe0, 0x08, 0xbf, 0x4f, 0xf0, 0x03, 0x08, 0x00, 0x25, 0x36, 0x4a, + 0x02, 0xeb, 0x8b, 0x00, 0xe9, 0xb2, 0x6d, 0x1c, 0x46, 0x5c, 0x06, 0xeb, + 0x0a, 0x16, 0xf1, 0xb2, 0x48, 0x46, 0xe8, 0xf7, 0xb1, 0xfb, 0x00, 0x22, + 0x41, 0x46, 0xff, 0xf7, 0x90, 0xff, 0x8d, 0xf8, 0x00, 0x00, 0x6a, 0x46, + 0xf1, 0xb2, 0x48, 0x46, 0xe8, 0xf7, 0xcf, 0xfb, 0xe8, 0xb2, 0x04, 0x28, + 0xe5, 0xd3, 0xff, 0xf7, 0xee, 0xfe, 0x48, 0x46, 0xe8, 0xf7, 0xbb, 0xfb, + 0x03, 0xa9, 0x48, 0x46, 0xe8, 0xf7, 0x94, 0xfd, 0x0f, 0x98, 0xbd, 0xf8, + 0x08, 0x10, 0x01, 0x90, 0x00, 0x91, 0x03, 0xab, 0xfa, 0xb2, 0x59, 0x46, + 0x50, 0x46, 0xff, 0xf7, 0x80, 0xff, 0xf9, 0xb2, 0x7f, 0x1c, 0x60, 0x54, + 0xf8, 0xb2, 0x01, 0x28, 0xc7, 0xd9, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x2d, 0xe9, 0xf8, 0x4f, 0x52, 0x88, 0x0a, 0x9f, 0x0b, 0x9c, 0x55, 0x1e, + 0x6f, 0xf0, 0x02, 0x0a, 0x00, 0x26, 0x80, 0x46, 0x89, 0x46, 0x9b, 0x46, + 0x02, 0xe0, 0x08, 0xbf, 0x4f, 0xf0, 0x03, 0x0a, 0x01, 0x22, 0x51, 0x46, + 0x58, 0x46, 0xff, 0xf7, 0x54, 0xff, 0xc0, 0xf1, 0x20, 0x03, 0x02, 0x46, + 0xdb, 0xb2, 0x49, 0x46, 0x40, 0x46, 0xe8, 0xf7, 0x94, 0xfb, 0xff, 0xf7, + 0xb4, 0xfe, 0x40, 0x46, 0xe8, 0xf7, 0x81, 0xfb, 0x00, 0x21, 0x40, 0x46, + 0xe8, 0xf7, 0x58, 0xfd, 0x02, 0x46, 0x00, 0x94, 0xab, 0xb2, 0xf1, 0xb2, + 0x48, 0x46, 0x00, 0xf0, 0x0b, 0xf8, 0xf1, 0xb2, 0x76, 0x1c, 0x78, 0x54, + 0xf0, 0xb2, 0x01, 0x28, 0xd9, 0xd9, 0xbd, 0xe8, 0xf1, 0x8f, 0x00, 0x00, + 0x68, 0x40, 0x00, 0x21, 0x30, 0xb5, 0x03, 0x9d, 0x04, 0x46, 0x2c, 0x44, + 0x01, 0x20, 0x44, 0x34, 0x0d, 0x00, 0x06, 0xd1, 0x1a, 0xb1, 0x01, 0x21, + 0x00, 0x20, 0x21, 0x70, 0x30, 0xbd, 0x22, 0x70, 0x30, 0xbd, 0x01, 0x29, + 0x07, 0xd1, 0x9a, 0x42, 0x02, 0xd2, 0x00, 0x20, 0xa1, 0x70, 0x30, 0xbd, + 0x00, 0x22, 0xa2, 0x70, 0x30, 0xbd, 0x00, 0x20, 0x30, 0xbd, 0x70, 0x47, + 0x2d, 0xe9, 0xfc, 0x47, 0xdd, 0xf8, 0x2c, 0x80, 0x0c, 0x46, 0x92, 0x46, + 0x1d, 0x46, 0x81, 0x46, 0x01, 0x23, 0x01, 0x22, 0x08, 0xf1, 0x48, 0x01, + 0xff, 0xf7, 0xc2, 0xfd, 0x01, 0x2d, 0x06, 0xd0, 0x00, 0x23, 0x01, 0x22, + 0x51, 0x46, 0x48, 0x46, 0xe8, 0xf7, 0xe0, 0xfa, 0x03, 0xe0, 0x00, 0x21, + 0x48, 0x46, 0xe8, 0xf7, 0x70, 0xfd, 0x0e, 0x9e, 0x0c, 0x9a, 0x51, 0x46, + 0x48, 0x46, 0xe8, 0xf7, 0x68, 0xfd, 0x21, 0x46, 0x48, 0x46, 0x00, 0xf0, + 0x77, 0xf8, 0x00, 0xf0, 0x5b, 0xf8, 0x00, 0xf0, 0x63, 0xf8, 0x00, 0xf0, + 0x6c, 0xf8, 0x00, 0x23, 0x00, 0xf0, 0x64, 0xf8, 0x00, 0xf0, 0x57, 0xf8, + 0x10, 0x21, 0x48, 0x46, 0xe8, 0xf7, 0x37, 0xfd, 0x01, 0x20, 0x36, 0x01, + 0xdb, 0xf7, 0x04, 0xfb, 0x10, 0x36, 0x10, 0x24, 0x00, 0x25, 0x76, 0xb2, + 0x00, 0x27, 0x1c, 0xe0, 0x9c, 0xb1, 0x64, 0x1e, 0x10, 0xe0, 0x48, 0x46, + 0xe8, 0xf7, 0x0b, 0xfb, 0x6b, 0x46, 0x01, 0xaa, 0x00, 0x21, 0x48, 0x46, + 0xe8, 0xf7, 0xd4, 0xfa, 0x01, 0x98, 0x00, 0x99, 0xb0, 0xeb, 0x51, 0x0f, + 0x38, 0xbf, 0x1f, 0x2c, 0xec, 0xd2, 0x64, 0x1c, 0xe4, 0xb2, 0xe1, 0xb2, + 0x48, 0x46, 0xe8, 0xf7, 0x14, 0xfd, 0x10, 0x2f, 0xa8, 0xbf, 0x65, 0x19, + 0x7f, 0x1c, 0xb7, 0x42, 0xe3, 0xdb, 0xa6, 0xf1, 0x10, 0x00, 0x00, 0xeb, + 0xd0, 0x70, 0xc0, 0x03, 0x00, 0x0c, 0xa6, 0xf1, 0x10, 0x01, 0x10, 0xfa, + 0x85, 0xf0, 0xc9, 0xb2, 0x90, 0xfb, 0xf1, 0xf1, 0xc9, 0xb2, 0x48, 0x46, + 0xe8, 0xf7, 0xfd, 0xfc, 0x48, 0x46, 0xe8, 0xf7, 0x0a, 0xfd, 0x88, 0xf8, + 0x72, 0x00, 0x01, 0x23, 0x01, 0x22, 0x08, 0xf1, 0x48, 0x01, 0x48, 0x46, + 0xff, 0xf7, 0x8b, 0xfd, 0x01, 0x22, 0x51, 0x46, 0x48, 0x46, 0xe8, 0xf7, + 0x79, 0xfa, 0x00, 0x20, 0xbd, 0xe8, 0xf6, 0x87, 0x0e, 0x22, 0x00, 0x21, + 0x48, 0x46, 0xe8, 0xf7, 0xaf, 0xbc, 0x00, 0x22, 0x08, 0x21, 0x48, 0x46, + 0xe8, 0xf7, 0xa4, 0xbc, 0x00, 0x23, 0x00, 0x22, 0x02, 0x21, 0x48, 0x46, + 0xe8, 0xf7, 0xb5, 0xbc, 0x01, 0x22, 0x1f, 0x21, 0x48, 0x46, 0xe8, 0xf7, + 0xa4, 0xba, 0x01, 0x22, 0xfd, 0x21, 0x48, 0x46, 0xe8, 0xf7, 0x9a, 0xbc, + 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0xe8, 0xf7, 0x87, 0xfc, 0x69, 0x88, + 0x20, 0x46, 0xe8, 0xf7, 0xa6, 0xfc, 0xa9, 0x88, 0x20, 0x46, 0xbd, 0xe8, + 0x34, 0x40, 0xe8, 0xf7, 0xa2, 0xbc, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x01, 0x01, 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x28, 0x46, 0x00, 0xf0, + 0x06, 0xf8, 0x29, 0x78, 0x20, 0x46, 0xbd, 0xe8, 0x34, 0x40, 0xe8, 0xf7, + 0xf9, 0xbb, 0x01, 0x7a, 0x42, 0x7a, 0x22, 0xb9, 0x00, 0x29, 0x14, 0xbf, + 0x55, 0x21, 0x50, 0x21, 0x03, 0xe0, 0x00, 0x29, 0x0c, 0xbf, 0xa0, 0x21, + 0xaa, 0x21, 0x01, 0x70, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x43, 0x04, 0x46, + 0x0d, 0x46, 0x90, 0x46, 0x99, 0x46, 0x00, 0x26, 0x00, 0x27, 0x06, 0xe0, + 0x42, 0x46, 0x29, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x0b, 0xf8, 0x36, 0x18, + 0x7f, 0x1c, 0xf8, 0xb2, 0x48, 0x45, 0xf5, 0xd3, 0xb6, 0xb2, 0x96, 0xfb, + 0xf9, 0xf0, 0xc0, 0xb2, 0xbd, 0xe8, 0xf2, 0x83, 0x2d, 0xe9, 0xf8, 0x4f, + 0x0d, 0x46, 0x88, 0xb0, 0x80, 0x46, 0x28, 0x78, 0x16, 0x46, 0xc2, 0x09, + 0x04, 0xd0, 0x00, 0x21, 0x40, 0x46, 0xe8, 0xf7, 0xcc, 0xfa, 0x0c, 0xe0, + 0xc0, 0xf3, 0x80, 0x11, 0x19, 0xb1, 0x40, 0x46, 0xe8, 0xf7, 0xc5, 0xfa, + 0x0c, 0xe0, 0xc0, 0xf3, 0x40, 0x10, 0x28, 0xb1, 0x40, 0x46, 0xe8, 0xf7, + 0xd5, 0xfa, 0x82, 0x46, 0x00, 0x21, 0x05, 0xe0, 0x01, 0x21, 0x40, 0x46, + 0xe8, 0xf7, 0xce, 0xfa, 0x82, 0x46, 0x01, 0x21, 0x40, 0x46, 0xe8, 0xf7, + 0xea, 0xfa, 0x81, 0x46, 0xe8, 0x88, 0xad, 0xf8, 0x18, 0x00, 0x06, 0xa8, + 0xa9, 0x88, 0xad, 0xf8, 0x1a, 0x10, 0x8d, 0xf8, 0x1c, 0x80, 0xe8, 0xf7, + 0xe9, 0xf9, 0x00, 0x24, 0x8d, 0xf8, 0x09, 0x80, 0x8d, 0xf8, 0x04, 0x40, + 0x8d, 0xf8, 0x06, 0x40, 0x06, 0x22, 0x8d, 0xf8, 0x07, 0x20, 0x01, 0x22, + 0xa9, 0x7a, 0x68, 0x7a, 0x49, 0x00, 0xc1, 0xf1, 0x03, 0x01, 0x09, 0x1a, + 0x8a, 0x40, 0x8d, 0xf8, 0x05, 0x20, 0x01, 0x2e, 0xe8, 0x7a, 0x05, 0xd1, + 0x01, 0x28, 0x1a, 0xbf, 0x03, 0x28, 0xe4, 0x20, 0xe5, 0x20, 0x04, 0xe0, + 0x01, 0x28, 0x16, 0xbf, 0x03, 0x28, 0xe1, 0x20, 0xe0, 0x20, 0x8d, 0xf8, + 0x08, 0x00, 0x00, 0x27, 0x01, 0xa8, 0xe8, 0xf7, 0xcd, 0xf9, 0x8d, 0xf8, + 0x17, 0x80, 0x68, 0x7a, 0x8d, 0xf8, 0x16, 0x00, 0x2f, 0xe0, 0xa8, 0x7a, + 0x28, 0xb9, 0x6a, 0x7a, 0x4f, 0xfa, 0x8b, 0xf1, 0x40, 0x46, 0xe8, 0xf7, + 0x4d, 0xfa, 0xa8, 0x7a, 0x01, 0x28, 0x32, 0xd1, 0x6a, 0x7a, 0x4f, 0xfa, + 0x8b, 0xf1, 0x40, 0x46, 0xe8, 0xf7, 0x75, 0xfa, 0x2b, 0xe0, 0x00, 0x28, + 0x14, 0xbf, 0x02, 0x28, 0x14, 0x46, 0x01, 0x28, 0x18, 0xbf, 0x03, 0x28, + 0x0d, 0xd1, 0x64, 0x1c, 0x0a, 0xe0, 0x01, 0x2e, 0xf3, 0xd1, 0x00, 0x28, + 0x14, 0xbf, 0x02, 0x28, 0x1c, 0x46, 0x01, 0x28, 0x18, 0xbf, 0x03, 0x28, + 0x01, 0xd1, 0x64, 0x1e, 0x64, 0xb2, 0xa4, 0xeb, 0x09, 0x00, 0x3f, 0x28, + 0x18, 0xbf, 0x10, 0xf1, 0x3f, 0x0f, 0x42, 0xd0, 0x7f, 0x1c, 0x69, 0x88, + 0xb8, 0xb2, 0x88, 0x42, 0x3d, 0xd2, 0xe8, 0x7a, 0x02, 0x28, 0xa4, 0xeb, + 0x09, 0x0b, 0xc6, 0xd2, 0x8d, 0xf8, 0x10, 0xb0, 0x04, 0xa8, 0xe8, 0xf7, + 0x5f, 0xfa, 0x40, 0x46, 0xe8, 0xf7, 0xcb, 0xfb, 0x40, 0x46, 0xe8, 0xf7, + 0xc8, 0xf9, 0x03, 0xab, 0x6a, 0x46, 0x00, 0x21, 0x40, 0x46, 0xe8, 0xf7, + 0x91, 0xf9, 0x00, 0x99, 0xe8, 0x7a, 0x62, 0x1e, 0x63, 0x1c, 0x00, 0x29, + 0x52, 0xb2, 0x5b, 0xb2, 0xc9, 0xd0, 0x01, 0x2e, 0x0e, 0xd1, 0x00, 0x28, + 0x18, 0xbf, 0x02, 0x28, 0x02, 0xd1, 0x00, 0x2c, 0xc8, 0xbf, 0x14, 0x46, + 0x01, 0x28, 0x18, 0xbf, 0x03, 0x28, 0x12, 0xd1, 0x00, 0x2c, 0x10, 0xd5, + 0x64, 0x1c, 0x0d, 0xe0, 0x00, 0x28, 0x18, 0xbf, 0x02, 0x28, 0x02, 0xd1, + 0x00, 0x2c, 0x48, 0xbf, 0x1c, 0x46, 0x01, 0x28, 0x18, 0xbf, 0x03, 0x28, + 0x03, 0xd1, 0x00, 0x2c, 0x01, 0xdd, 0x64, 0x1e, 0x64, 0xb2, 0xe8, 0x7a, + 0x02, 0x28, 0x05, 0xd2, 0x8d, 0xf8, 0x10, 0xa0, 0x04, 0xa8, 0xe8, 0xf7, + 0x23, 0xfa, 0x03, 0xe0, 0x51, 0x46, 0x40, 0x46, 0xdb, 0xf7, 0xec, 0xf9, + 0x20, 0x46, 0xdb, 0xf7, 0xd9, 0xf8, 0x09, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x2d, 0xe9, 0xfc, 0x47, 0x14, 0x46, 0xdd, 0xf8, 0x28, 0xa0, 0x00, 0x25, + 0x81, 0x46, 0x1f, 0x46, 0xe5, 0x72, 0x4f, 0xfa, 0x81, 0xf8, 0x00, 0x21, + 0x8d, 0xf8, 0x00, 0x10, 0xe0, 0x7a, 0x02, 0x28, 0x06, 0x46, 0x04, 0xd2, + 0x61, 0x7a, 0x01, 0x22, 0x48, 0x46, 0xee, 0xf7, 0x47, 0xf9, 0x01, 0x23, + 0x01, 0x22, 0x21, 0x46, 0x48, 0x46, 0xff, 0xf7, 0xe4, 0xfe, 0x8d, 0xf8, + 0x00, 0x00, 0x01, 0x23, 0x9d, 0xf8, 0x00, 0x00, 0xb8, 0x55, 0x00, 0x22, + 0x21, 0x46, 0x48, 0x46, 0xff, 0xf7, 0xd9, 0xfe, 0x8d, 0xf8, 0x00, 0x00, + 0x9d, 0xf9, 0x00, 0x00, 0x40, 0x42, 0x0a, 0xf8, 0x06, 0x00, 0xe1, 0x7a, + 0x02, 0x29, 0x04, 0xd2, 0x61, 0x7a, 0x00, 0x22, 0x48, 0x46, 0xee, 0xf7, + 0x27, 0xf9, 0x9d, 0xf9, 0x00, 0x00, 0x40, 0x45, 0xe0, 0x7a, 0xbe, 0xbf, + 0xb9, 0x57, 0x41, 0x45, 0x01, 0x25, 0x40, 0x1c, 0xe0, 0x72, 0xc0, 0xb2, + 0x04, 0x28, 0xc6, 0xd3, 0x28, 0x46, 0xbd, 0xe8, 0xf6, 0x87, 0xf8, 0xb5, + 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0xe8, 0xf7, 0x4b, 0xfa, 0x00, 0x27, + 0x0e, 0xe0, 0x01, 0x21, 0x20, 0x46, 0xe8, 0xf7, 0x9d, 0xfa, 0x05, 0xe0, + 0x30, 0x00, 0xf8, 0xd0, 0x01, 0x21, 0x20, 0x46, 0xe8, 0xf7, 0x94, 0xfa, + 0x20, 0x46, 0xe8, 0xf7, 0x2a, 0xfb, 0x7f, 0x1c, 0x78, 0xb2, 0xa8, 0x42, + 0xf2, 0xdb, 0xf1, 0xbd, 0x2d, 0xe9, 0xf2, 0x4f, 0x2d, 0xed, 0x02, 0x8b, + 0x84, 0xb0, 0x83, 0x46, 0x00, 0x20, 0x8d, 0xf8, 0x0c, 0x00, 0x81, 0x46, + 0x00, 0x25, 0xb5, 0xee, 0x00, 0x8a, 0xaa, 0x46, 0xc5, 0xf1, 0x10, 0x06, + 0x06, 0xe0, 0x11, 0x28, 0xf9, 0xd3, 0x4f, 0xf0, 0x01, 0x09, 0x2e, 0x46, + 0xa5, 0xf1, 0x10, 0x0a, 0x00, 0x27, 0xb8, 0x46, 0x04, 0x24, 0x04, 0x20, + 0x02, 0x90, 0x01, 0x23, 0x02, 0x20, 0x01, 0x90, 0x4a, 0x46, 0x03, 0xa8, + 0x00, 0x90, 0x5f, 0xfa, 0x8a, 0xf1, 0x58, 0x46, 0xfb, 0xf7, 0x97, 0xfb, + 0x9d, 0xf9, 0x0c, 0x10, 0x3f, 0x18, 0x64, 0x1e, 0x88, 0x44, 0xec, 0xd1, + 0x0f, 0xfa, 0x88, 0xf8, 0x00, 0xee, 0x10, 0x8a, 0xb8, 0xee, 0xc0, 0x0a, + 0xf6, 0xee, 0x00, 0x0a, 0x40, 0xee, 0x08, 0x0a, 0x06, 0x99, 0xf6, 0xb2, + 0xbd, 0xee, 0xe0, 0x0a, 0x3f, 0xb2, 0x10, 0xee, 0x10, 0x0a, 0x01, 0xee, + 0x10, 0x7a, 0x88, 0x55, 0xb8, 0xee, 0xc1, 0x1a, 0xf6, 0xee, 0x00, 0x1a, + 0x41, 0xee, 0x08, 0x1a, 0x06, 0x99, 0xfd, 0xee, 0xe1, 0x1a, 0x11, 0xee, + 0x90, 0x0a, 0x5f, 0xea, 0x09, 0x02, 0x01, 0xeb, 0x46, 0x02, 0x08, 0xbf, + 0x40, 0x42, 0x50, 0x84, 0x6d, 0x1c, 0xe8, 0xb2, 0x21, 0x28, 0xb8, 0xd3, + 0x58, 0x46, 0xe8, 0xf7, 0xdb, 0xf9, 0x04, 0xb0, 0xbd, 0xec, 0x02, 0x8b, + 0xbd, 0xe8, 0xf1, 0x8f, 0x2d, 0xe9, 0xf4, 0x4f, 0x84, 0xb0, 0x82, 0x46, + 0x0f, 0x46, 0x99, 0x46, 0xe8, 0xf7, 0xcd, 0xfa, 0x8d, 0xf8, 0x04, 0x00, + 0x39, 0x46, 0x10, 0xf0, 0x0f, 0x00, 0x18, 0xbf, 0x01, 0x20, 0x38, 0x72, + 0x4f, 0xf0, 0x00, 0x08, 0x50, 0x46, 0xff, 0xf7, 0x10, 0xfe, 0x00, 0x25, + 0x00, 0x24, 0x01, 0x2d, 0x88, 0xf0, 0x01, 0x08, 0x39, 0xd1, 0x01, 0x24, + 0x66, 0xb2, 0x76, 0x42, 0x4f, 0xfa, 0x86, 0xfb, 0x09, 0xeb, 0x0b, 0x00, + 0x5f, 0xfa, 0x88, 0xf2, 0x90, 0xf9, 0x18, 0x11, 0x50, 0x46, 0xff, 0xf7, + 0x5c, 0xff, 0x50, 0x46, 0xe8, 0xf7, 0x99, 0xfa, 0x7e, 0x70, 0x02, 0xa9, + 0x00, 0x91, 0x03, 0xab, 0x9d, 0xf8, 0x10, 0x10, 0x3a, 0x46, 0x50, 0x46, + 0xff, 0xf7, 0x08, 0xff, 0x79, 0x7a, 0x01, 0x29, 0x04, 0xbf, 0x76, 0x42, + 0x4f, 0xfa, 0x86, 0xfb, 0x00, 0x21, 0x0d, 0xf1, 0x0c, 0x0c, 0x42, 0x23, + 0x09, 0xeb, 0x4b, 0x02, 0x4b, 0x43, 0x13, 0x44, 0x03, 0xf1, 0x20, 0x02, + 0x1c, 0xf8, 0x01, 0x30, 0x13, 0x70, 0x02, 0xab, 0x5e, 0x5c, 0x56, 0x70, + 0x49, 0x1c, 0x04, 0x29, 0xef, 0xdb, 0x01, 0x28, 0x07, 0xd0, 0x64, 0x1c, + 0x60, 0xb2, 0x11, 0x28, 0x03, 0xda, 0x00, 0x2d, 0xc4, 0xd1, 0x26, 0x46, + 0xc4, 0xe7, 0x50, 0x46, 0xe8, 0xf7, 0x7a, 0xf9, 0x6d, 0x1c, 0x01, 0x2d, + 0xb6, 0xdd, 0x9d, 0xf8, 0x04, 0x10, 0x50, 0x46, 0xe8, 0xf7, 0xc6, 0xf9, + 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x7f, 0xb5, 0x04, 0x46, 0x10, 0x88, + 0xad, 0xf8, 0x02, 0x00, 0x0d, 0x46, 0x50, 0x88, 0xad, 0xf8, 0x04, 0x00, + 0x1e, 0x46, 0x91, 0x88, 0xad, 0xf8, 0x06, 0x10, 0x06, 0xf5, 0x84, 0x71, + 0x2a, 0x78, 0x8d, 0xf8, 0x09, 0x20, 0x20, 0x46, 0x6a, 0x78, 0x8d, 0xf8, + 0x0a, 0x20, 0xff, 0xf7, 0x21, 0xff, 0xaa, 0x78, 0x33, 0x46, 0x69, 0x46, + 0x20, 0x46, 0xff, 0xf7, 0x7b, 0xff, 0x7f, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, + 0x07, 0x46, 0x08, 0x98, 0xdf, 0xf8, 0x58, 0x99, 0x6f, 0xf0, 0x00, 0x48, + 0x4f, 0xf0, 0x00, 0x0c, 0x00, 0x26, 0xf4, 0xb2, 0x0a, 0x25, 0x09, 0xeb, + 0x4c, 0x0e, 0x15, 0xfb, 0x04, 0xf4, 0xa6, 0x44, 0x00, 0x24, 0xd5, 0x07, + 0x04, 0xd5, 0x9e, 0xf8, 0x00, 0x50, 0xec, 0x1b, 0x48, 0xbf, 0x64, 0x42, + 0x95, 0x07, 0x07, 0xd5, 0x9e, 0xf8, 0x01, 0x50, 0xb5, 0xeb, 0x01, 0x0e, + 0x48, 0xbf, 0xce, 0xf1, 0x00, 0x0e, 0x74, 0x44, 0xa0, 0x45, 0x03, 0xdb, + 0x1e, 0x70, 0xa0, 0x46, 0x80, 0xf8, 0x00, 0xc0, 0x76, 0x1c, 0xf4, 0xb2, + 0x07, 0x2c, 0xdc, 0xd3, 0x0c, 0xf1, 0x01, 0x0c, 0xbc, 0xf1, 0x05, 0x0f, + 0xd6, 0xd3, 0x40, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0xfe, 0xb5, 0x04, 0x46, + 0x01, 0x25, 0x01, 0x26, 0x01, 0xaf, 0x00, 0x97, 0x0d, 0xf1, 0x05, 0x03, + 0x22, 0x46, 0xf1, 0xb2, 0xe8, 0xb2, 0xff, 0xf7, 0xbd, 0xff, 0xdf, 0xf8, + 0xe0, 0x78, 0x2a, 0x06, 0x07, 0xeb, 0x12, 0x51, 0xf2, 0xb2, 0x01, 0xeb, + 0x42, 0x03, 0x9d, 0xf8, 0x04, 0x10, 0x9d, 0xf8, 0x05, 0x20, 0x76, 0x1c, + 0x01, 0xeb, 0x02, 0x17, 0x07, 0xeb, 0x00, 0x27, 0xf0, 0xb2, 0x09, 0x28, + 0x23, 0xf8, 0x12, 0x7c, 0xe0, 0xd3, 0x6d, 0x1c, 0xe9, 0xb2, 0x11, 0x29, + 0xdb, 0xd3, 0xf7, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, 0xdf, 0xf8, 0xa8, 0x68, + 0x80, 0x46, 0x30, 0x78, 0x17, 0x46, 0xb8, 0x42, 0x0d, 0x46, 0x1c, 0x46, + 0x03, 0xd0, 0x38, 0x46, 0xff, 0xf7, 0xca, 0xff, 0x37, 0x70, 0xdf, 0xf8, + 0x8c, 0x08, 0x00, 0xeb, 0x08, 0x11, 0x01, 0xeb, 0x45, 0x02, 0x32, 0xf8, + 0x12, 0x0c, 0x14, 0xb1, 0xc0, 0xf3, 0x03, 0x11, 0x21, 0x70, 0x06, 0x99, + 0x11, 0xb1, 0x00, 0xf0, 0x0f, 0x02, 0x0a, 0x70, 0x00, 0x0a, 0xbd, 0xe8, + 0xf0, 0x81, 0x2d, 0xe9, 0xf3, 0x4f, 0x8f, 0xb0, 0x80, 0x6b, 0x15, 0x46, + 0x00, 0xf5, 0xb6, 0x71, 0x0f, 0x9a, 0x05, 0x91, 0x00, 0xf5, 0x94, 0x70, + 0xd1, 0x6b, 0x04, 0x90, 0x01, 0xf2, 0x2c, 0x54, 0x01, 0xf5, 0x3e, 0x7b, + 0x00, 0xf1, 0x2b, 0x01, 0x9a, 0x46, 0x0a, 0x22, 0x09, 0xa8, 0xdb, 0xf7, + 0x9f, 0xfb, 0x0f, 0x98, 0x01, 0x22, 0x00, 0x26, 0x8d, 0xf8, 0x27, 0x20, + 0x24, 0x34, 0x47, 0x68, 0x5f, 0xea, 0x0a, 0x01, 0x15, 0xd0, 0x01, 0xa8, + 0x00, 0x90, 0x0d, 0xf1, 0x05, 0x03, 0x10, 0x98, 0x29, 0x78, 0x00, 0x78, + 0x52, 0x46, 0xff, 0xf7, 0xb1, 0xff, 0x9d, 0xf8, 0x05, 0x00, 0xa0, 0x70, + 0x9d, 0xf8, 0x04, 0x10, 0xe1, 0x70, 0x9d, 0xf8, 0x05, 0x00, 0x20, 0x70, + 0x9d, 0xf8, 0x04, 0x10, 0x61, 0x70, 0x0a, 0x21, 0x23, 0x78, 0xdf, 0xf8, + 0xec, 0x27, 0x94, 0xf8, 0x01, 0xa0, 0x1a, 0x98, 0x4b, 0x43, 0x13, 0x44, + 0x03, 0xeb, 0x4a, 0x03, 0x93, 0xf8, 0x00, 0xe0, 0xcd, 0xf8, 0x0c, 0xe0, + 0x93, 0xf8, 0x01, 0x80, 0xa3, 0x78, 0x11, 0xfb, 0x03, 0xf1, 0x11, 0x44, + 0xe2, 0x78, 0x10, 0x9b, 0x01, 0xeb, 0x42, 0x01, 0x0a, 0x78, 0x0d, 0x92, + 0x91, 0xf8, 0x01, 0x90, 0x1a, 0x70, 0x49, 0x78, 0x29, 0x70, 0xb0, 0xb9, + 0x10, 0x98, 0x01, 0x78, 0x8d, 0xf8, 0x1e, 0x10, 0x06, 0xa9, 0x2a, 0x78, + 0x8d, 0xf8, 0x1f, 0x20, 0xf8, 0xb2, 0xe8, 0xf7, 0x83, 0xf8, 0x06, 0xa9, + 0xf8, 0xb2, 0xe8, 0xf7, 0x84, 0xf8, 0x30, 0x46, 0x11, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0x0c, 0x9d, 0x05, 0x94, 0xcd, 0xf8, 0x10, 0xa0, 0x03, 0x98, + 0x0d, 0x99, 0x40, 0x1a, 0x40, 0xb2, 0xda, 0xf7, 0x97, 0xfe, 0x00, 0x28, + 0xef, 0xd0, 0x10, 0x99, 0x03, 0x98, 0x91, 0xf9, 0x00, 0x20, 0x12, 0x1a, + 0x52, 0xb2, 0x01, 0x2a, 0xac, 0xbf, 0x01, 0x21, 0x4f, 0xf0, 0xff, 0x31, + 0x50, 0xfa, 0x81, 0xf0, 0x03, 0x90, 0x0f, 0x98, 0x00, 0xf0, 0x76, 0xf8, + 0x04, 0x46, 0x03, 0x98, 0x8d, 0xf8, 0x1e, 0x00, 0x00, 0xf0, 0x6b, 0xf8, + 0x82, 0x46, 0x06, 0xa9, 0xf8, 0xb2, 0xe8, 0xf7, 0x53, 0xf8, 0x00, 0xf0, + 0x64, 0xf8, 0x4a, 0xea, 0x04, 0x04, 0x20, 0x43, 0x06, 0x43, 0x05, 0x98, + 0x81, 0x7e, 0xc8, 0x07, 0x13, 0xd5, 0x00, 0xf0, 0x5a, 0xf8, 0x04, 0x46, + 0x01, 0x21, 0x06, 0x20, 0x01, 0x91, 0x0b, 0xf5, 0xd0, 0x72, 0x02, 0x90, + 0x00, 0x92, 0x5b, 0x46, 0x04, 0x99, 0x09, 0xaa, 0xf8, 0xb2, 0x02, 0xf0, + 0x55, 0xf9, 0x00, 0xf0, 0x4a, 0xf8, 0x04, 0x43, 0x26, 0x43, 0x0c, 0x95, + 0x05, 0x9c, 0xdd, 0xf8, 0x10, 0xa0, 0x2e, 0xe0, 0xa0, 0x7a, 0x42, 0x07, + 0x58, 0xfa, 0x81, 0xf8, 0x05, 0xd5, 0x49, 0x42, 0x0f, 0x98, 0x49, 0xb2, + 0x00, 0xf0, 0x3e, 0xf8, 0x06, 0x43, 0x8d, 0xf8, 0x1f, 0x80, 0x00, 0xf0, + 0x34, 0xf8, 0x05, 0x46, 0x06, 0xa9, 0xf8, 0xb2, 0xe8, 0xf7, 0x21, 0xf8, + 0x00, 0xf0, 0x2d, 0xf8, 0x05, 0x43, 0xa0, 0x7e, 0x2e, 0x43, 0x81, 0x07, + 0x13, 0xd5, 0x00, 0xf0, 0x26, 0xf8, 0x05, 0x46, 0x06, 0x20, 0x01, 0x21, + 0x0b, 0xf5, 0xd0, 0x72, 0x02, 0x90, 0x01, 0x91, 0x00, 0x92, 0x5b, 0x46, + 0x09, 0xaa, 0x51, 0x46, 0xf8, 0xb2, 0x02, 0xf0, 0x21, 0xf9, 0x00, 0xf0, + 0x16, 0xf8, 0x05, 0x43, 0x2e, 0x43, 0xa8, 0xeb, 0x09, 0x00, 0x40, 0xb2, + 0xda, 0xf7, 0x22, 0xfe, 0x00, 0x28, 0x3f, 0xf4, 0x7e, 0xaf, 0x0c, 0x98, + 0x90, 0xf9, 0x00, 0x10, 0xa1, 0xeb, 0x08, 0x01, 0x49, 0xb2, 0x01, 0x29, + 0xac, 0xbf, 0x01, 0x21, 0x4f, 0xf0, 0xff, 0x31, 0xbc, 0xe7, 0x00, 0x22, + 0x02, 0x21, 0xf8, 0xb2, 0xe8, 0xf7, 0x8a, 0xbb, 0x2d, 0xe9, 0xf8, 0x4f, + 0x2d, 0xed, 0x02, 0x8b, 0xd0, 0xb0, 0x42, 0x68, 0x8d, 0xf8, 0x08, 0x20, + 0x00, 0x25, 0x82, 0x6b, 0x02, 0xf5, 0xb6, 0x73, 0x02, 0xf5, 0x94, 0x74, + 0x03, 0x93, 0x08, 0x94, 0x4f, 0xf0, 0x01, 0x0a, 0xd2, 0xf8, 0x00, 0x01, + 0x42, 0x03, 0x03, 0x98, 0x80, 0x7a, 0x48, 0xbf, 0xaa, 0x46, 0x0d, 0xf1, + 0x06, 0x0b, 0x00, 0x09, 0x8d, 0xf8, 0x06, 0x00, 0x8b, 0xf8, 0x01, 0x00, + 0xdf, 0xed, 0x6b, 0x0a, 0x03, 0x98, 0xc2, 0x7a, 0x8d, 0xf8, 0x09, 0x10, + 0x00, 0xee, 0x10, 0x2a, 0xb8, 0xee, 0x40, 0x0a, 0x80, 0xee, 0x20, 0x8a, + 0x00, 0x24, 0x4f, 0xf0, 0x8c, 0x08, 0x09, 0xaa, 0x08, 0xfb, 0x04, 0xf3, + 0xd6, 0x18, 0x8c, 0x21, 0x30, 0x46, 0xee, 0xf7, 0x8d, 0xf9, 0x00, 0x96, + 0x33, 0x46, 0x9d, 0xf8, 0x08, 0x00, 0x00, 0x22, 0xe1, 0xb2, 0xed, 0xf7, + 0x60, 0xfc, 0x96, 0xf9, 0x34, 0x90, 0x01, 0x21, 0xb0, 0xee, 0x48, 0x0a, + 0x48, 0x46, 0xed, 0xf7, 0xd3, 0xfc, 0x01, 0xa9, 0x01, 0x27, 0x08, 0x55, + 0xf0, 0x19, 0x01, 0x21, 0x90, 0xf9, 0x0c, 0x00, 0xb0, 0xee, 0x48, 0x0a, + 0xed, 0xf7, 0xc8, 0xfc, 0x04, 0xa9, 0x01, 0xeb, 0xc4, 0x02, 0xd0, 0x55, + 0x7f, 0x1c, 0x08, 0x2f, 0xf0, 0xd3, 0x08, 0x98, 0x90, 0xf9, 0x1a, 0x10, + 0x49, 0x45, 0xbc, 0xbf, 0x90, 0xf9, 0x1b, 0x30, 0x99, 0x45, 0x13, 0xda, + 0x01, 0xa8, 0x10, 0xf8, 0x04, 0xe0, 0x9d, 0xf8, 0x09, 0x00, 0x10, 0xfb, + 0x0e, 0x9e, 0x4f, 0xfa, 0x8e, 0xf0, 0x83, 0x42, 0xb8, 0xbf, 0xa3, 0xeb, + 0x09, 0x00, 0x03, 0xdb, 0x88, 0x42, 0x03, 0xda, 0xa9, 0xeb, 0x01, 0x00, + 0x0b, 0xf8, 0x04, 0x00, 0x64, 0x1c, 0x02, 0x2c, 0xb5, 0xd3, 0x9b, 0xf9, + 0x01, 0x00, 0x9d, 0xf9, 0x06, 0x10, 0x88, 0x42, 0xb4, 0xbf, 0x08, 0x91, + 0x08, 0x90, 0x9d, 0xf9, 0x09, 0x60, 0xab, 0x46, 0x25, 0xe0, 0x00, 0x2c, + 0x64, 0xd0, 0x0a, 0x21, 0x48, 0x46, 0xe7, 0xf7, 0x44, 0xfe, 0x09, 0xa8, + 0x08, 0xfb, 0x04, 0xf1, 0x42, 0x18, 0xcd, 0xf8, 0x00, 0xa0, 0x13, 0x46, + 0xe1, 0xb2, 0x48, 0x46, 0xed, 0xf7, 0x39, 0xfc, 0x00, 0xf0, 0x62, 0xf8, + 0x07, 0x46, 0x0f, 0x21, 0x48, 0x46, 0xe7, 0xf7, 0x32, 0xfe, 0x00, 0xf0, + 0x5b, 0xf8, 0x07, 0x43, 0x3d, 0x43, 0x64, 0x1c, 0x02, 0x2c, 0xe0, 0xd3, + 0x8d, 0xf8, 0x08, 0x90, 0x00, 0xf0, 0x52, 0xf8, 0x05, 0x43, 0x0b, 0xf1, + 0x01, 0x0b, 0x08, 0x98, 0x83, 0x45, 0x43, 0xda, 0x03, 0x99, 0x88, 0x7a, + 0xc1, 0x07, 0x18, 0xd5, 0x9d, 0xf9, 0x04, 0x00, 0x9d, 0xf8, 0x58, 0x10, + 0x83, 0x45, 0xb4, 0xbf, 0x9d, 0xf9, 0x09, 0x00, 0x00, 0x20, 0x40, 0x18, + 0x8d, 0xf8, 0x58, 0x00, 0x09, 0xa9, 0x9d, 0xf9, 0x05, 0x00, 0x91, 0xf8, + 0xc0, 0x20, 0x83, 0x45, 0xb4, 0xbf, 0x9d, 0xf9, 0x09, 0x00, 0x00, 0x20, + 0x80, 0x18, 0x81, 0xf8, 0xc0, 0x00, 0x03, 0x98, 0x81, 0x7a, 0x88, 0x07, + 0x1a, 0xd5, 0x01, 0x20, 0x00, 0x21, 0x04, 0xaa, 0x02, 0x44, 0x12, 0xf9, + 0x31, 0x30, 0x9b, 0x45, 0x0c, 0xda, 0x09, 0xaa, 0x02, 0x44, 0x08, 0xfb, + 0x01, 0xf4, 0x22, 0x44, 0x92, 0xf9, 0x0c, 0x30, 0x00, 0x2b, 0xcc, 0xbf, + 0x34, 0x46, 0x74, 0x42, 0xe3, 0x18, 0x13, 0x73, 0x49, 0x1c, 0x02, 0x29, + 0xe9, 0xd3, 0x40, 0x1c, 0x08, 0x28, 0xe5, 0xd3, 0x00, 0x24, 0x01, 0xe0, + 0x8d, 0xf8, 0x08, 0x90, 0x9d, 0xf8, 0x08, 0x90, 0x05, 0x21, 0x95, 0xe7, + 0x50, 0xb0, 0x28, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, + 0x00, 0x00, 0x7a, 0x44, 0x00, 0x22, 0x02, 0x21, 0x48, 0x46, 0xe8, 0xf7, + 0x8b, 0xba, 0x00, 0x00, 0x2d, 0xe9, 0xf3, 0x4f, 0x81, 0xb0, 0x00, 0x20, + 0x2d, 0xed, 0x02, 0x8b, 0x8c, 0xb0, 0x82, 0x46, 0x02, 0x90, 0x93, 0x46, + 0x0f, 0x98, 0x41, 0x68, 0x0f, 0x98, 0x8d, 0xf8, 0x05, 0x10, 0x99, 0x46, + 0x0f, 0x99, 0x80, 0x6b, 0xc9, 0x6b, 0x01, 0xf5, 0x3e, 0x72, 0x00, 0xf5, + 0xb6, 0x75, 0x06, 0x92, 0x01, 0xf2, 0x2c, 0x56, 0x01, 0xf5, 0xac, 0x71, + 0x00, 0x24, 0x00, 0xf1, 0x50, 0x03, 0x06, 0x98, 0x0a, 0x91, 0x00, 0xf5, + 0xa7, 0x77, 0x04, 0x93, 0x39, 0x57, 0x05, 0x91, 0xf1, 0x75, 0xb4, 0x75, + 0x74, 0x75, 0x97, 0xf9, 0x0c, 0x00, 0xda, 0xf7, 0xe1, 0xfc, 0x80, 0x46, + 0x97, 0xf9, 0x0b, 0x00, 0xda, 0xf7, 0xdc, 0xfc, 0x4f, 0xfa, 0x88, 0xf1, + 0x42, 0xb2, 0x91, 0x42, 0xb8, 0xbf, 0x42, 0x46, 0x06, 0xdb, 0x02, 0x46, + 0x4f, 0xfa, 0x88, 0xf8, 0x40, 0xb2, 0xb8, 0xbf, 0x80, 0x46, 0x40, 0x46, + 0xeb, 0x79, 0xd9, 0x07, 0x4c, 0xbf, 0x8d, 0xf8, 0x0c, 0x00, 0x8d, 0xf8, + 0x0c, 0x20, 0x99, 0x07, 0x4c, 0xbf, 0x8d, 0xf8, 0x07, 0x00, 0x8d, 0xf8, + 0x07, 0x20, 0x9d, 0xf8, 0x05, 0x00, 0xe7, 0xf7, 0x95, 0xfe, 0x80, 0x46, + 0x9d, 0xf8, 0x05, 0x00, 0xe7, 0xf7, 0x95, 0xfe, 0x8d, 0xf8, 0x04, 0x00, + 0x9d, 0xf8, 0x05, 0x00, 0xe7, 0xf7, 0x94, 0xfe, 0x8d, 0xf8, 0x06, 0x00, + 0x86, 0xf8, 0x14, 0x80, 0x9d, 0xf8, 0x04, 0x00, 0xb0, 0x70, 0x9d, 0xf8, + 0x06, 0x10, 0xf1, 0x70, 0x9d, 0xf8, 0x05, 0x00, 0xe7, 0xf7, 0x8e, 0xfe, + 0xb0, 0x73, 0x9d, 0xf8, 0x05, 0x00, 0xe7, 0xf7, 0x8b, 0xfe, 0xf0, 0x73, + 0x97, 0xf9, 0x5f, 0x10, 0x97, 0xf9, 0x5e, 0x00, 0x00, 0xee, 0x10, 0x1a, + 0x00, 0x28, 0xb8, 0xee, 0xc0, 0x0a, 0x0e, 0xbf, 0xdf, 0xed, 0x03, 0x0a, + 0x00, 0xee, 0x90, 0x0a, 0xf8, 0xee, 0xe0, 0x0a, 0x02, 0xe0, 0x00, 0xbf, + 0x00, 0x00, 0x80, 0x00, 0x06, 0xf1, 0x24, 0x07, 0x80, 0xee, 0x20, 0x8a, + 0x87, 0xed, 0x01, 0x8a, 0x02, 0xa9, 0x28, 0x7c, 0xda, 0xf7, 0x7e, 0xfe, + 0xad, 0xf8, 0x0e, 0x00, 0x06, 0xf1, 0x20, 0x01, 0xbd, 0xf8, 0x0e, 0x00, + 0x30, 0x82, 0x00, 0x91, 0x04, 0x98, 0xc3, 0x7a, 0x0f, 0x98, 0x81, 0x6b, + 0xbd, 0xf9, 0x0e, 0x00, 0x01, 0xf1, 0xee, 0x02, 0x64, 0x21, 0xda, 0xf7, + 0x67, 0xff, 0x04, 0x98, 0x06, 0xf1, 0x22, 0x01, 0x00, 0x91, 0x90, 0xf8, + 0x32, 0x30, 0x0f, 0x98, 0x81, 0x6b, 0xbd, 0xf9, 0x0e, 0x00, 0x01, 0xf1, + 0xf4, 0x02, 0x64, 0x21, 0xda, 0xf7, 0x58, 0xff, 0xb6, 0xf9, 0x20, 0x00, + 0xb6, 0xf9, 0x22, 0x10, 0x00, 0xee, 0x10, 0x0a, 0x0a, 0x98, 0xb8, 0xee, + 0xc0, 0x0a, 0xdf, 0xed, 0xbb, 0x0a, 0x01, 0xee, 0x10, 0x1a, 0x10, 0xf8, + 0xc6, 0x1f, 0x01, 0x29, 0x80, 0xee, 0x20, 0x0a, 0xb8, 0xee, 0xc1, 0x1a, + 0xdf, 0xed, 0xb5, 0x1a, 0x18, 0xbf, 0x02, 0x29, 0xc1, 0xee, 0x21, 0x0a, + 0x04, 0xd1, 0x40, 0x78, 0x41, 0x1e, 0x89, 0x41, 0xc9, 0x0f, 0x00, 0xe0, + 0x00, 0x21, 0x1a, 0x98, 0xfa, 0x78, 0xbb, 0x78, 0x7a, 0x70, 0x3b, 0x70, + 0x00, 0xb1, 0x01, 0x21, 0x1b, 0x98, 0x00, 0x28, 0x14, 0xbf, 0x6a, 0x7a, + 0xea, 0x78, 0x10, 0x00, 0x08, 0xbf, 0x01, 0x22, 0x5f, 0xea, 0x09, 0x00, + 0x14, 0xbf, 0x00, 0x94, 0xcd, 0xf8, 0x00, 0xb0, 0x5f, 0xea, 0x89, 0x70, + 0x4e, 0xbf, 0x04, 0x94, 0x9d, 0xf8, 0x40, 0x00, 0x04, 0x90, 0x70, 0x68, + 0x13, 0x46, 0xb0, 0xfb, 0xf3, 0xfe, 0x52, 0x1e, 0x03, 0xfb, 0x1e, 0x03, + 0xd2, 0xb2, 0x93, 0x42, 0x40, 0xf0, 0x2e, 0x81, 0x00, 0x28, 0x00, 0xf0, + 0x2b, 0x81, 0x05, 0x98, 0x95, 0xf9, 0x01, 0x30, 0x9d, 0xf8, 0x04, 0x20, + 0x98, 0x42, 0xa2, 0xbf, 0x9d, 0xf9, 0x0c, 0x00, 0x95, 0xf9, 0x05, 0x30, + 0x98, 0x42, 0x21, 0xda, 0x2b, 0x7e, 0x9a, 0x42, 0x01, 0xd2, 0x00, 0x98, + 0x40, 0xb9, 0x5f, 0xea, 0x09, 0x00, 0x0b, 0xd0, 0x10, 0x2a, 0x3e, 0xbf, + 0xb8, 0x78, 0x06, 0x28, 0x9a, 0x42, 0x05, 0xd2, 0x51, 0x1c, 0x8d, 0xf8, + 0x04, 0x10, 0xb8, 0x78, 0x40, 0x1c, 0x2b, 0xe0, 0x00, 0x29, 0x1c, 0xbf, + 0x04, 0x98, 0x00, 0x28, 0x35, 0xd0, 0x29, 0x79, 0x88, 0x45, 0x32, 0xd3, + 0x6a, 0x7e, 0x90, 0x45, 0x2f, 0xd2, 0x08, 0xf1, 0x01, 0x08, 0x2b, 0xe0, + 0x95, 0xf9, 0x02, 0x00, 0x05, 0x9b, 0x98, 0x42, 0xa2, 0xbf, 0x95, 0xf9, + 0x06, 0x00, 0x9d, 0xf9, 0x07, 0x30, 0x98, 0x42, 0x21, 0xda, 0x2b, 0x7a, + 0x93, 0x42, 0x01, 0xd2, 0x00, 0x98, 0x40, 0xb9, 0x5f, 0xea, 0x09, 0x00, + 0x0e, 0xd0, 0x06, 0x2a, 0x0c, 0xd3, 0xb8, 0x78, 0x50, 0xb1, 0x93, 0x42, + 0x08, 0xd2, 0x50, 0x1e, 0x8d, 0xf8, 0x04, 0x00, 0xb9, 0x78, 0x48, 0x1e, + 0xb8, 0x70, 0x4f, 0xf0, 0x01, 0x0a, 0x0a, 0xe0, 0x00, 0x29, 0x1c, 0xbf, + 0x04, 0x98, 0x00, 0x28, 0x05, 0xd0, 0x28, 0x79, 0x40, 0x45, 0x02, 0xd2, + 0xa8, 0xf1, 0x01, 0x08, 0x01, 0x24, 0x5f, 0xea, 0x09, 0x00, 0x65, 0xd0, + 0x54, 0xea, 0x0a, 0x00, 0x62, 0xd1, 0x4f, 0xea, 0xd9, 0x00, 0x00, 0xf0, + 0x01, 0x00, 0xc0, 0xf1, 0x01, 0x01, 0xdd, 0xf8, 0x18, 0xc0, 0xc9, 0xb2, + 0x00, 0x22, 0x03, 0x46, 0xb4, 0xee, 0x40, 0x8a, 0x9d, 0xf8, 0x06, 0x00, + 0xf1, 0xee, 0x10, 0xfa, 0x04, 0xd4, 0x9c, 0xf8, 0xe0, 0xe1, 0xbe, 0xf1, + 0x07, 0x0f, 0x1d, 0xd1, 0x5f, 0xea, 0x89, 0x7e, 0x0b, 0xd5, 0x9a, 0x42, + 0x09, 0xd1, 0x95, 0xf8, 0x04, 0xb0, 0x5f, 0xfa, 0x88, 0xfe, 0xf3, 0x45, + 0x03, 0xd2, 0xa8, 0xf1, 0x01, 0x08, 0x01, 0x24, 0x02, 0x22, 0x5f, 0xea, + 0xc9, 0x7e, 0x35, 0xd5, 0x8a, 0x42, 0x33, 0xd1, 0x95, 0xf8, 0x1b, 0xb0, + 0x83, 0x45, 0x2f, 0xd2, 0x04, 0x28, 0x2d, 0xd9, 0xf8, 0x78, 0x58, 0xb3, + 0x40, 0x1e, 0x25, 0xe0, 0xf4, 0xee, 0x48, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x24, 0xd5, 0x5f, 0xea, 0x89, 0x7e, 0x0f, 0xd5, 0x9a, 0x42, 0x0d, 0xd1, + 0x95, 0xf8, 0x04, 0xb0, 0x5f, 0xfa, 0x88, 0xfe, 0xde, 0x45, 0x07, 0xd3, + 0x95, 0xf8, 0x19, 0xb0, 0xde, 0x45, 0x03, 0xd2, 0x08, 0xf1, 0x01, 0x08, + 0x01, 0x24, 0x02, 0x22, 0x5f, 0xea, 0xc9, 0x7e, 0x0e, 0xd5, 0x8a, 0x42, + 0x0c, 0xd1, 0x95, 0xf8, 0x1c, 0xe0, 0x70, 0x45, 0x3e, 0xbf, 0x08, 0x28, + 0xf8, 0x78, 0x04, 0x28, 0x04, 0xd2, 0x40, 0x1c, 0xf8, 0x70, 0x4f, 0xf0, + 0x01, 0x0a, 0x02, 0x22, 0x52, 0x1c, 0xd2, 0xb2, 0x02, 0x2a, 0xa7, 0xd3, + 0x9d, 0xf8, 0x05, 0x00, 0x01, 0x22, 0x02, 0x21, 0xe8, 0xf7, 0xc4, 0xf8, + 0x02, 0x99, 0x9d, 0xf8, 0x04, 0x20, 0x8d, 0xf8, 0x22, 0x20, 0x08, 0x43, + 0xba, 0xf1, 0x00, 0x0f, 0x02, 0x90, 0x8d, 0xf8, 0x1c, 0x80, 0x33, 0xd0, + 0x00, 0x98, 0x00, 0x28, 0x08, 0xbf, 0x5f, 0xea, 0x09, 0x00, 0x2d, 0xd0, + 0xa8, 0x7a, 0x5f, 0xea, 0x09, 0x01, 0x08, 0xd0, 0x00, 0x90, 0x00, 0x23, + 0x0f, 0x98, 0x0d, 0xf1, 0x06, 0x02, 0x01, 0xa9, 0xff, 0xf7, 0x1d, 0xfc, + 0x11, 0xe0, 0x58, 0xb1, 0x9d, 0xf9, 0x04, 0x10, 0x96, 0xf9, 0x02, 0x00, + 0x09, 0x1a, 0x0f, 0x98, 0x49, 0xb2, 0xff, 0xf7, 0x11, 0xfd, 0x02, 0x99, + 0x08, 0x43, 0x02, 0x90, 0x07, 0xa9, 0x9d, 0xf8, 0x05, 0x00, 0xe7, 0xf7, + 0xf1, 0xfc, 0x9d, 0xf8, 0x05, 0x00, 0xe7, 0xf7, 0xf0, 0xfc, 0xb0, 0x70, + 0x9d, 0xf8, 0x05, 0x00, 0xe7, 0xf7, 0xf0, 0xfc, 0xf0, 0x70, 0x01, 0x21, + 0xf0, 0x69, 0xb1, 0x75, 0x40, 0x1c, 0xf0, 0x61, 0x00, 0xf0, 0x30, 0xf8, + 0x02, 0x99, 0x08, 0x43, 0x02, 0x90, 0xa4, 0xb1, 0x04, 0x98, 0x00, 0x28, + 0x08, 0xbf, 0xb9, 0xf1, 0x00, 0x0f, 0x0e, 0xd0, 0x9d, 0xf8, 0x05, 0x00, + 0x07, 0xa9, 0xe7, 0xf7, 0xcc, 0xfc, 0x9d, 0xf8, 0x05, 0x00, 0xe7, 0xf7, + 0xcb, 0xfc, 0x30, 0x75, 0x01, 0x21, 0xb0, 0x69, 0x71, 0x75, 0x40, 0x1c, + 0xb0, 0x61, 0x00, 0xf0, 0x15, 0xf8, 0x02, 0x99, 0x08, 0x43, 0x02, 0x90, + 0x70, 0x68, 0x40, 0x1c, 0x70, 0x60, 0x02, 0x98, 0x0c, 0xb0, 0xbd, 0xec, + 0x02, 0x8b, 0xbd, 0xe8, 0xfe, 0x8f, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x42, + 0x10, 0x40, 0x00, 0x21, 0x50, 0x71, 0x03, 0x21, 0x23, 0x90, 0x00, 0x21, + 0x00, 0x22, 0x9d, 0xf8, 0x05, 0x00, 0x02, 0x21, 0xe8, 0xf7, 0x4c, 0xb8, + 0x2d, 0xe9, 0xff, 0x47, 0x06, 0x46, 0x00, 0x20, 0x00, 0x90, 0x69, 0x46, + 0xb0, 0x6b, 0x74, 0x68, 0x00, 0xf5, 0xb6, 0x79, 0xf0, 0x6b, 0x00, 0xf2, + 0x2c, 0x55, 0x00, 0xf5, 0x3e, 0x78, 0x99, 0xf8, 0x10, 0x00, 0xda, 0xf7, + 0xbb, 0xfc, 0x82, 0x46, 0xa5, 0xf8, 0x10, 0xa0, 0xe0, 0xb2, 0xe7, 0xf7, + 0xa1, 0xfc, 0xa8, 0x73, 0x00, 0x27, 0xe0, 0xb2, 0xe7, 0xf7, 0x9e, 0xfc, + 0xe8, 0x73, 0xe0, 0xb2, 0xe7, 0xf7, 0x86, 0xfc, 0x28, 0x75, 0xe0, 0xb2, + 0xe7, 0xf7, 0x87, 0xfc, 0xa8, 0x70, 0xe0, 0xb2, 0xe7, 0xf7, 0x88, 0xfc, + 0xe8, 0x70, 0xa8, 0x7b, 0xe9, 0x7b, 0x28, 0x73, 0x69, 0x73, 0x99, 0xf8, + 0x00, 0x00, 0xf8, 0xb9, 0x32, 0x46, 0x00, 0x21, 0x50, 0x46, 0xda, 0xf7, + 0xb7, 0xfc, 0x01, 0x00, 0x18, 0xd4, 0xa8, 0x68, 0x00, 0x28, 0x1e, 0xbf, + 0xaa, 0x7b, 0xc8, 0xb2, 0x90, 0x42, 0x11, 0xd0, 0xa9, 0x73, 0xe9, 0x73, + 0x8d, 0xf8, 0x08, 0x10, 0x8d, 0xf8, 0x09, 0x10, 0xe0, 0xb2, 0x01, 0xa9, + 0xe7, 0xf7, 0x6a, 0xfc, 0x01, 0xa9, 0xe0, 0xb2, 0xe7, 0xf7, 0x69, 0xfc, + 0xe0, 0xb2, 0xe7, 0xf7, 0x7e, 0xfc, 0x01, 0x27, 0x88, 0xf8, 0x5b, 0x71, + 0xa8, 0x68, 0x40, 0x1c, 0xa8, 0x60, 0x00, 0x98, 0x04, 0xb0, 0xbd, 0xe8, + 0xf0, 0x87, 0x00, 0x00, 0x01, 0x46, 0x48, 0x78, 0x0a, 0x78, 0x89, 0x78, + 0x80, 0x00, 0x00, 0xeb, 0xc2, 0x00, 0x08, 0x18, 0xc0, 0xb2, 0x70, 0x47, + 0x2d, 0xe9, 0xfe, 0x43, 0x88, 0x46, 0x04, 0x46, 0x5f, 0xea, 0x08, 0x00, + 0x16, 0x46, 0x1d, 0x46, 0x8d, 0xf8, 0x07, 0x40, 0x0c, 0xbf, 0x05, 0x27, + 0x0a, 0x27, 0x20, 0x46, 0xe7, 0xf7, 0xb8, 0xfa, 0xb0, 0x42, 0x27, 0xd0, + 0x39, 0x46, 0x20, 0x46, 0xe7, 0xf7, 0x15, 0xfb, 0x41, 0x46, 0x20, 0x46, + 0xe7, 0xf7, 0x84, 0xfb, 0x07, 0x46, 0x41, 0x46, 0x20, 0x46, 0xe7, 0xf7, + 0xa0, 0xfb, 0x01, 0x2e, 0x81, 0x46, 0x04, 0xd1, 0x00, 0xf0, 0x1d, 0xf8, + 0x00, 0xf0, 0x16, 0xf8, 0x01, 0xe0, 0x00, 0xf0, 0x1d, 0xf8, 0x32, 0x46, + 0x41, 0x46, 0x20, 0x46, 0xe7, 0xf7, 0x98, 0xfa, 0x26, 0xb9, 0x00, 0xf0, + 0x10, 0xf8, 0x00, 0xf0, 0x09, 0xf8, 0x01, 0xe0, 0x00, 0xf0, 0x10, 0xf8, + 0x29, 0x46, 0x20, 0x46, 0xe7, 0xf7, 0xf1, 0xfa, 0xbd, 0xe8, 0xf7, 0x83, + 0x42, 0x46, 0x49, 0x46, 0x20, 0x46, 0xe7, 0xf7, 0x54, 0xbb, 0x42, 0x46, + 0x49, 0x46, 0x20, 0x46, 0xe7, 0xf7, 0x1e, 0xbb, 0x8d, 0xf8, 0x06, 0x80, + 0x8d, 0xf8, 0x00, 0x70, 0x68, 0x46, 0xe7, 0xf7, 0x5f, 0xbb, 0x80, 0x78, + 0x03, 0x28, 0x18, 0xbf, 0x01, 0x28, 0x02, 0xd1, 0x4f, 0xf0, 0xff, 0x30, + 0x70, 0x47, 0x01, 0x20, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x83, 0x78, + 0x02, 0x78, 0x00, 0x21, 0x02, 0x2b, 0x0a, 0xd3, 0x43, 0x78, 0x03, 0xeb, + 0x42, 0x02, 0x03, 0x2a, 0x1a, 0xd8, 0xdf, 0xe8, 0x02, 0xf0, 0x02, 0x15, + 0x0f, 0x14, 0xc0, 0x78, 0x0c, 0xe0, 0x12, 0xb1, 0x01, 0x2a, 0x02, 0xd0, + 0x10, 0xe0, 0xc0, 0x78, 0x01, 0xe0, 0xc0, 0x78, 0x01, 0x21, 0xe7, 0xf7, + 0x4c, 0xfb, 0x08, 0xe0, 0xc0, 0x78, 0x01, 0x21, 0xe7, 0xf7, 0x0f, 0xfb, + 0x03, 0xe0, 0x01, 0x21, 0xc0, 0x78, 0xe7, 0xf7, 0x21, 0xfb, 0x01, 0x46, + 0x08, 0x46, 0x02, 0xbd, 0x1c, 0xb5, 0x11, 0xfb, 0x02, 0xf1, 0x82, 0x78, + 0x02, 0x2a, 0x0b, 0xd3, 0x03, 0x78, 0x44, 0x78, 0x04, 0xeb, 0x43, 0x04, + 0x03, 0x2c, 0x1e, 0xd8, 0xdf, 0xe8, 0x04, 0xf0, 0x02, 0x10, 0x12, 0x18, + 0x00, 0x22, 0x0e, 0xe0, 0x8d, 0xf8, 0x00, 0x10, 0xc1, 0x78, 0x8d, 0xf8, + 0x07, 0x10, 0x02, 0x78, 0x8d, 0xf8, 0x06, 0x20, 0x68, 0x46, 0xe7, 0xf7, + 0x0f, 0xfb, 0x13, 0xbd, 0x00, 0x22, 0x06, 0xe0, 0x01, 0x22, 0xc0, 0x78, + 0x49, 0xb2, 0xe7, 0xf7, 0xbf, 0xfa, 0x13, 0xbd, 0x01, 0x22, 0xc0, 0x78, + 0x49, 0xb2, 0xe7, 0xf7, 0xea, 0xfa, 0x13, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, + 0x86, 0xb0, 0x0d, 0x46, 0x10, 0x9e, 0x12, 0x9c, 0x00, 0x21, 0x8d, 0xf8, + 0x09, 0x10, 0x17, 0x46, 0x90, 0xf8, 0x04, 0x80, 0x01, 0x88, 0xad, 0xf8, + 0x10, 0x10, 0x99, 0x46, 0x00, 0xf0, 0x59, 0xf8, 0x06, 0xf5, 0xd6, 0x71, + 0x91, 0xf9, 0x07, 0x20, 0x91, 0xf9, 0x00, 0x00, 0x94, 0xf8, 0x84, 0x40, + 0x82, 0x18, 0x91, 0xf9, 0x01, 0x00, 0x10, 0x1a, 0xc0, 0xb2, 0xb0, 0xf1, + 0x0a, 0x06, 0xf6, 0xb2, 0xb8, 0xbf, 0x00, 0x26, 0x04, 0xb9, 0x00, 0x26, + 0x38, 0x46, 0x11, 0x9f, 0x8d, 0xf8, 0x08, 0x60, 0x4f, 0xf0, 0x00, 0x0a, + 0x8d, 0xf8, 0x0a, 0x00, 0x04, 0xe0, 0x9d, 0xf8, 0x08, 0x00, 0x40, 0x1c, + 0x8d, 0xf8, 0x08, 0x00, 0x9d, 0xf8, 0x08, 0x00, 0x40, 0x28, 0x2c, 0xd2, + 0x01, 0x46, 0x4a, 0x46, 0x00, 0xf0, 0x36, 0xf9, 0x03, 0xa8, 0x01, 0x90, + 0x00, 0x94, 0x9d, 0xf8, 0x0a, 0x10, 0xe8, 0x78, 0x3b, 0x46, 0x42, 0x46, + 0x00, 0xf0, 0x2e, 0xf8, 0x83, 0x46, 0x9d, 0xf8, 0x08, 0x00, 0xb0, 0x42, + 0x08, 0xbf, 0xda, 0x46, 0x00, 0x2c, 0x18, 0xbf, 0x01, 0x2c, 0x06, 0xd1, + 0x0d, 0xf1, 0x09, 0x02, 0x02, 0xa9, 0x58, 0x46, 0x00, 0xf0, 0x39, 0xfd, + 0x0b, 0xe0, 0x02, 0x2c, 0xd5, 0xd1, 0x0d, 0xf1, 0x09, 0x00, 0x00, 0x90, + 0x02, 0xab, 0x03, 0x9a, 0x59, 0x46, 0x50, 0x46, 0x00, 0xf0, 0x41, 0xfd, + 0xda, 0x46, 0x01, 0x28, 0xc9, 0xd1, 0x9d, 0xf8, 0x09, 0x00, 0xff, 0xe7, + 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x40, 0x88, 0xad, 0xf8, 0x12, 0x00, + 0x04, 0xa8, 0xe9, 0x78, 0x8d, 0xf8, 0x14, 0x10, 0xe7, 0xf7, 0xaa, 0xb9, + 0x2d, 0xe9, 0xff, 0x41, 0x05, 0x46, 0x14, 0x46, 0x0a, 0x98, 0x00, 0x22, + 0x18, 0xb1, 0x02, 0x28, 0x03, 0xd0, 0x02, 0xd3, 0x04, 0xe0, 0xea, 0x22, + 0x02, 0xe0, 0xd4, 0x22, 0x03, 0xb9, 0xc1, 0x22, 0x06, 0x23, 0x8d, 0xf8, + 0x09, 0x10, 0x8d, 0xf8, 0x0b, 0x30, 0x8d, 0xf8, 0x0c, 0x20, 0x8d, 0xf8, + 0x0d, 0x50, 0x02, 0xa8, 0x00, 0x26, 0x8d, 0xf8, 0x08, 0x60, 0x8d, 0xf8, + 0x0a, 0x60, 0xe7, 0xf7, 0x95, 0xf9, 0xb0, 0x46, 0x00, 0x27, 0x0d, 0xe0, + 0x28, 0x46, 0xe7, 0xf7, 0xd4, 0xf9, 0x6b, 0x46, 0x01, 0xaa, 0x00, 0x21, + 0x28, 0x46, 0xe7, 0xf7, 0x9d, 0xf9, 0x01, 0x98, 0x00, 0x99, 0x86, 0x19, + 0x88, 0x44, 0x7f, 0x1c, 0xf8, 0xb2, 0xa0, 0x42, 0xee, 0xd3, 0x0b, 0x98, + 0xb6, 0xfb, 0xf4, 0xf1, 0x10, 0xb1, 0xb8, 0xfb, 0xf4, 0xf2, 0x02, 0x60, + 0x08, 0x46, 0x04, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, 0x2d, 0xe9, 0xf0, 0x4f, + 0x87, 0xb0, 0x89, 0x46, 0x00, 0x21, 0x05, 0x46, 0x93, 0x46, 0xdd, 0xf8, + 0x40, 0x80, 0x8d, 0xf8, 0x0c, 0x10, 0x9a, 0x46, 0x58, 0x46, 0xff, 0xf7, + 0xde, 0xfe, 0x07, 0x46, 0x28, 0x7d, 0xee, 0x7c, 0x46, 0xea, 0x00, 0x26, + 0x74, 0x0a, 0x04, 0xf0, 0x03, 0x04, 0x01, 0x07, 0x89, 0xf8, 0x84, 0x40, + 0x05, 0xd5, 0x98, 0xf9, 0xe6, 0x01, 0x10, 0xb9, 0x00, 0x21, 0x89, 0xf8, + 0x84, 0x10, 0x8d, 0xf8, 0x0d, 0xa0, 0x29, 0x88, 0xad, 0xf8, 0x14, 0x10, + 0x6a, 0x88, 0xad, 0xf8, 0x16, 0x20, 0x9b, 0xf8, 0x03, 0x00, 0x8d, 0xf8, + 0x18, 0x00, 0x05, 0xa8, 0xe7, 0xf7, 0x3a, 0xf9, 0x58, 0x46, 0xe7, 0xf7, + 0x65, 0xf9, 0x8d, 0xf8, 0x0e, 0x00, 0x01, 0x20, 0x01, 0x90, 0xcd, 0xf8, + 0x08, 0x90, 0xcd, 0xf8, 0x00, 0x80, 0x3b, 0x46, 0x9d, 0xf8, 0x0d, 0x20, + 0x59, 0x46, 0x28, 0x46, 0xff, 0xf7, 0x0a, 0xff, 0x82, 0x46, 0x00, 0x20, + 0x01, 0x90, 0x7f, 0x42, 0x9d, 0xf8, 0x0d, 0x20, 0xcd, 0xf8, 0x08, 0x90, + 0xcd, 0xf8, 0x00, 0x80, 0x7b, 0xb2, 0x59, 0x46, 0x28, 0x46, 0xff, 0xf7, + 0xfb, 0xfe, 0x80, 0x46, 0x00, 0x20, 0xf2, 0x07, 0x04, 0x90, 0x26, 0xd4, + 0x08, 0xeb, 0x0a, 0x07, 0x7f, 0x10, 0x00, 0x2c, 0x18, 0xbf, 0x01, 0x2c, + 0x09, 0xd1, 0x03, 0xa9, 0x01, 0x91, 0x04, 0xa8, 0xf9, 0xb2, 0x02, 0x90, + 0x00, 0x91, 0x00, 0xf0, 0x52, 0xf8, 0x00, 0xf0, 0xd5, 0xfc, 0x02, 0x2c, + 0x09, 0xd1, 0x04, 0xa8, 0x03, 0xa9, 0x02, 0x90, 0x01, 0x91, 0xff, 0xb2, + 0x00, 0x97, 0x00, 0xf0, 0x46, 0xf8, 0x00, 0xf0, 0x3d, 0xfd, 0x9d, 0xf8, + 0x0e, 0x10, 0x58, 0x46, 0xe7, 0xf7, 0x46, 0xf9, 0x00, 0x24, 0xb1, 0x07, + 0x15, 0xd4, 0x04, 0x98, 0x98, 0xb1, 0x68, 0x7c, 0x01, 0x24, 0xaa, 0xeb, + 0x08, 0x01, 0x88, 0x42, 0x04, 0xda, 0x4f, 0xf0, 0xff, 0x30, 0x8d, 0xf8, + 0x0c, 0x00, 0x08, 0xe0, 0xa8, 0xeb, 0x0a, 0x01, 0x88, 0x42, 0xb2, 0xbf, + 0x8d, 0xf8, 0x0c, 0x40, 0x00, 0x22, 0x8d, 0xf8, 0x0c, 0x20, 0x58, 0x46, + 0xff, 0xf7, 0x02, 0xfe, 0x06, 0x46, 0xda, 0xf7, 0x18, 0xf9, 0x07, 0x46, + 0x9b, 0xf8, 0x03, 0x00, 0xda, 0xf7, 0xea, 0xf9, 0x1f, 0xb1, 0x00, 0x20, + 0x8d, 0xf8, 0x0c, 0x00, 0x12, 0xe0, 0x09, 0xeb, 0x06, 0x01, 0x81, 0xf8, + 0x10, 0xa0, 0x81, 0xf8, 0x20, 0x80, 0xc2, 0x44, 0x2a, 0x7c, 0x92, 0x45, + 0x03, 0xdb, 0x04, 0x99, 0x01, 0xb1, 0x04, 0xb1, 0x20, 0xb1, 0x00, 0x20, + 0x8d, 0xf8, 0x0c, 0x00, 0x89, 0xf8, 0x63, 0x00, 0x9d, 0xf9, 0x0c, 0x00, + 0xfc, 0xe6, 0x4a, 0x46, 0x9d, 0xf8, 0x0d, 0x30, 0x29, 0x46, 0x58, 0x46, + 0x70, 0x47, 0xf9, 0xb2, 0x28, 0x46, 0x5f, 0xe6, 0x00, 0x00, 0x00, 0x00, + 0x2d, 0xe9, 0xf1, 0x4f, 0x16, 0x46, 0x84, 0xb0, 0x89, 0x46, 0x9a, 0x46, + 0x30, 0x46, 0xe7, 0xf7, 0xcd, 0xf8, 0x8d, 0xf8, 0x08, 0x00, 0x00, 0x27, + 0xb1, 0x78, 0x08, 0x25, 0x03, 0x29, 0x26, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, + 0x02, 0x1d, 0x20, 0x23, 0x02, 0x24, 0x4f, 0xf0, 0x01, 0x08, 0x9d, 0xf8, + 0x38, 0x30, 0x31, 0x78, 0xf0, 0x78, 0x01, 0x22, 0xff, 0xf7, 0xc0, 0xfd, + 0x00, 0xf0, 0xc5, 0xf8, 0x00, 0x90, 0x30, 0x46, 0xff, 0xf7, 0x12, 0xfe, + 0x83, 0x46, 0x00, 0xf0, 0xae, 0xf8, 0x27, 0xd8, 0xdf, 0xe8, 0x02, 0xf0, + 0x02, 0x0f, 0x16, 0x1d, 0xad, 0xf8, 0x04, 0x70, 0x1c, 0xe0, 0x01, 0x24, + 0xa0, 0x46, 0xe4, 0xe7, 0x08, 0x24, 0xb8, 0x46, 0xe8, 0xe7, 0x04, 0x24, + 0xfb, 0xe7, 0x00, 0x24, 0xf9, 0xe7, 0x01, 0x21, 0x02, 0x25, 0x8d, 0xf8, + 0x04, 0x70, 0x8d, 0xf8, 0x05, 0x10, 0x0b, 0xe0, 0x01, 0x20, 0x04, 0x25, + 0x8d, 0xf8, 0x04, 0x00, 0x8d, 0xf8, 0x05, 0x70, 0x04, 0xe0, 0x01, 0x25, + 0x8d, 0xf8, 0x04, 0x50, 0x8d, 0xf8, 0x05, 0x50, 0x8d, 0xf8, 0x06, 0x40, + 0x00, 0xf0, 0x8b, 0xf8, 0x64, 0x20, 0xc0, 0x46, 0xc0, 0x46, 0x00, 0x9c, + 0x00, 0xf0, 0x8f, 0xf8, 0x04, 0x99, 0x04, 0x43, 0x08, 0x7b, 0x40, 0xb9, + 0x04, 0x98, 0xcd, 0xf8, 0x00, 0xa0, 0x2b, 0x46, 0x32, 0x46, 0x49, 0x46, + 0xff, 0xf7, 0xdc, 0xfe, 0x07, 0x46, 0x30, 0x46, 0xff, 0xf7, 0x6e, 0xfd, + 0x05, 0x46, 0xbb, 0xf1, 0x00, 0x0f, 0x09, 0xf8, 0x05, 0x70, 0x02, 0xd4, + 0x59, 0x46, 0x01, 0x22, 0x04, 0xe0, 0xcb, 0xf1, 0x00, 0x0b, 0x59, 0x46, + 0x4f, 0xf0, 0xff, 0x32, 0xc9, 0xb2, 0x30, 0x46, 0xff, 0xf7, 0xe6, 0xfd, + 0x00, 0xf0, 0x6b, 0xf8, 0x04, 0x43, 0x00, 0xf0, 0x58, 0xf8, 0x23, 0xd8, + 0xdf, 0xe8, 0x02, 0xf0, 0x02, 0x06, 0x0f, 0x18, 0x00, 0x21, 0xad, 0xf8, + 0x04, 0x10, 0x0e, 0xe0, 0x00, 0x20, 0x01, 0x21, 0x8d, 0xf8, 0x04, 0x00, + 0x8d, 0xf8, 0x05, 0x10, 0x8d, 0xf8, 0x06, 0x00, 0x10, 0xe0, 0x01, 0x20, + 0x00, 0x21, 0x8d, 0xf8, 0x04, 0x00, 0x8d, 0xf8, 0x05, 0x10, 0x8d, 0xf8, + 0x06, 0x10, 0x07, 0xe0, 0x01, 0x20, 0x00, 0x22, 0x8d, 0xf8, 0x04, 0x00, + 0x8d, 0xf8, 0x05, 0x00, 0x8d, 0xf8, 0x06, 0x20, 0x00, 0xf0, 0x39, 0xf8, + 0x00, 0xf0, 0x41, 0xf8, 0x9d, 0xf8, 0x08, 0x10, 0x04, 0x43, 0x00, 0x2f, + 0x08, 0x46, 0x02, 0xdd, 0x1f, 0x28, 0x38, 0xbf, 0x49, 0x1c, 0x00, 0x2f, + 0x02, 0xd5, 0x02, 0x28, 0x28, 0xbf, 0x49, 0x1e, 0xc8, 0xb2, 0x00, 0x28, + 0x14, 0xbf, 0x1f, 0x28, 0x44, 0xf4, 0x80, 0x74, 0x00, 0xf0, 0x27, 0xf8, + 0x30, 0x46, 0xe7, 0xf7, 0x19, 0xf8, 0x09, 0xeb, 0x05, 0x01, 0x00, 0x22, + 0x81, 0xf8, 0x50, 0x00, 0x00, 0x21, 0xf0, 0x78, 0xe7, 0xf7, 0xfe, 0xfc, + 0x04, 0x43, 0xb8, 0xf1, 0x00, 0x0f, 0x06, 0xd0, 0x9d, 0xf8, 0x38, 0x30, + 0x31, 0x78, 0xf0, 0x78, 0x00, 0x22, 0xff, 0xf7, 0x0d, 0xfd, 0x20, 0x46, + 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x31, 0x78, 0x70, 0x78, 0x00, 0xeb, + 0x41, 0x02, 0x03, 0x2a, 0x70, 0x47, 0xf0, 0x78, 0x8d, 0xf8, 0x07, 0x00, + 0x01, 0xa8, 0xe7, 0xf7, 0x5b, 0xb8, 0xc9, 0xb2, 0x30, 0x46, 0xe7, 0xf7, + 0x17, 0xb8, 0xf0, 0x78, 0x00, 0x22, 0x00, 0x21, 0xe7, 0xf7, 0xda, 0xbc, + 0x2d, 0xe9, 0xf0, 0x4f, 0x8b, 0x46, 0x8b, 0xb0, 0x99, 0x46, 0x9b, 0xf8, + 0x13, 0x30, 0x06, 0x93, 0x16, 0x46, 0x80, 0x46, 0x01, 0x22, 0xff, 0xf7, + 0xf0, 0xff, 0x05, 0x46, 0x40, 0x46, 0xda, 0xf7, 0xb7, 0xf8, 0x68, 0x46, + 0xda, 0xf7, 0x92, 0xf8, 0x01, 0x20, 0x86, 0xf8, 0x63, 0x00, 0x06, 0x21, + 0x04, 0xa8, 0xec, 0xf7, 0xb7, 0xfd, 0x8d, 0xf8, 0x15, 0x80, 0x00, 0x27, + 0x8d, 0xf8, 0x10, 0x70, 0x04, 0xa8, 0xe6, 0xf7, 0xa7, 0xff, 0x7f, 0x1c, + 0xf8, 0xb2, 0x04, 0x28, 0xf6, 0xd3, 0xd9, 0xf7, 0xda, 0xff, 0x07, 0x00, + 0x0c, 0xd1, 0x06, 0x98, 0x01, 0x07, 0x09, 0xd5, 0x06, 0xf1, 0x70, 0x02, + 0x10, 0x69, 0x28, 0xb1, 0x32, 0x46, 0x59, 0x46, 0x40, 0x46, 0x00, 0xf0, + 0x5d, 0xfa, 0x05, 0x43, 0x00, 0x20, 0x8d, 0xf8, 0x08, 0x00, 0x06, 0x99, + 0x48, 0x07, 0x51, 0xd4, 0x00, 0x24, 0x4f, 0x46, 0x00, 0xf0, 0x4b, 0xfa, + 0xe1, 0xb2, 0x40, 0x46, 0xda, 0xf7, 0x2b, 0xfa, 0x4f, 0xf0, 0x00, 0x09, + 0x4f, 0xf0, 0x00, 0x0a, 0x8d, 0xf8, 0x0c, 0x40, 0x8d, 0xf8, 0x0d, 0x90, + 0x8d, 0xf8, 0x0e, 0xa0, 0x8d, 0xf8, 0x0f, 0x80, 0xd9, 0xf7, 0xaf, 0xff, + 0xe0, 0xb9, 0x4f, 0xea, 0x89, 0x01, 0xbb, 0xf8, 0x0e, 0x00, 0x01, 0xeb, + 0xc4, 0x01, 0x51, 0x44, 0xc8, 0x40, 0xc0, 0x07, 0x12, 0xd5, 0x9d, 0xf8, + 0x08, 0x10, 0x00, 0x91, 0x3b, 0x46, 0x03, 0xaa, 0x31, 0x46, 0x58, 0x46, + 0xff, 0xf7, 0xae, 0xfe, 0x00, 0x95, 0x00, 0x22, 0x05, 0x46, 0x00, 0x21, + 0x40, 0x46, 0xe7, 0xf7, 0x6b, 0xfc, 0x28, 0x43, 0x00, 0x9d, 0x05, 0x43, + 0x00, 0xf0, 0x0d, 0xfa, 0xd4, 0xd3, 0x09, 0xf1, 0x01, 0x09, 0xb9, 0xf1, + 0x01, 0x0f, 0xcd, 0xd9, 0x00, 0xf0, 0x0b, 0xfa, 0xe1, 0xb2, 0x40, 0x46, + 0xda, 0xf7, 0xf1, 0xf9, 0x64, 0x1c, 0x01, 0x2c, 0xbc, 0xd9, 0xd9, 0xf7, + 0x7e, 0xff, 0x07, 0x00, 0x08, 0xd1, 0x06, 0x98, 0x41, 0x06, 0x05, 0xd5, + 0x32, 0x46, 0x59, 0x46, 0x40, 0x46, 0x00, 0xf0, 0x97, 0xf9, 0x05, 0x43, + 0x06, 0x98, 0xc1, 0x06, 0x0c, 0xd5, 0xd9, 0xf7, 0x6e, 0xff, 0x07, 0x00, + 0x04, 0xbf, 0x96, 0xf9, 0x63, 0x00, 0x01, 0x28, 0x04, 0xd1, 0x32, 0x46, + 0x59, 0x46, 0x40, 0x46, 0x00, 0xf0, 0x25, 0xf8, 0x56, 0xf8, 0x70, 0x0f, + 0x14, 0x9c, 0x3f, 0x18, 0x37, 0x60, 0x40, 0x46, 0xda, 0xf7, 0x2c, 0xf8, + 0x70, 0x60, 0x40, 0x46, 0xda, 0xf7, 0x2e, 0xf8, 0xf1, 0x68, 0xb0, 0x60, + 0x41, 0x18, 0xf1, 0x60, 0x84, 0x42, 0x38, 0xbf, 0x45, 0xf4, 0x80, 0x65, + 0x68, 0x46, 0xd9, 0xf7, 0xfb, 0xff, 0x01, 0x98, 0x07, 0x90, 0x07, 0xa8, + 0xd9, 0xf7, 0xd2, 0xff, 0x0a, 0x98, 0x31, 0x69, 0xb0, 0x61, 0x49, 0x1c, + 0x31, 0x61, 0x28, 0x46, 0x0b, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x2d, 0xe9, + 0xf0, 0x4f, 0x0f, 0x46, 0x8d, 0xb0, 0x79, 0x7d, 0x03, 0x91, 0x81, 0x46, + 0x90, 0x46, 0xe7, 0xf7, 0x6c, 0xf9, 0x08, 0xf1, 0x60, 0x06, 0x82, 0x46, + 0x30, 0x89, 0x28, 0xb9, 0x03, 0x98, 0x0a, 0xfa, 0x00, 0xf1, 0x31, 0x81, + 0x31, 0x89, 0x71, 0x81, 0x48, 0x46, 0xe6, 0xf7, 0x2a, 0xff, 0x96, 0xf9, + 0x0c, 0x10, 0x40, 0x1a, 0x70, 0x70, 0x00, 0x24, 0x00, 0xf0, 0x92, 0xf8, + 0x96, 0xf9, 0x0d, 0x10, 0x40, 0x1a, 0xb0, 0x70, 0x48, 0x46, 0x00, 0xf0, + 0xd0, 0xf8, 0x48, 0x46, 0xe6, 0xf7, 0x21, 0xff, 0xe0, 0xb2, 0x05, 0xa9, + 0x09, 0xaa, 0x01, 0xeb, 0x80, 0x03, 0x02, 0xeb, 0x80, 0x02, 0xe1, 0xb2, + 0x48, 0x46, 0xe6, 0xf7, 0xe5, 0xfe, 0x64, 0x1c, 0xe0, 0xb2, 0x04, 0x28, + 0xf0, 0xd3, 0x09, 0xac, 0x61, 0x68, 0xe0, 0x68, 0x41, 0x18, 0x05, 0xad, + 0x04, 0x91, 0xd5, 0xf8, 0x04, 0xb0, 0xe8, 0x68, 0xbf, 0x7d, 0x83, 0x44, + 0x00, 0xf0, 0x6f, 0xf8, 0x7f, 0x00, 0xf8, 0xb2, 0x02, 0x90, 0x00, 0x20, + 0x00, 0x90, 0xcd, 0xf8, 0x04, 0x80, 0x08, 0xf1, 0x61, 0x03, 0x04, 0x99, + 0x5a, 0x46, 0x48, 0x46, 0x00, 0xf0, 0x66, 0xf8, 0x00, 0xf0, 0x5f, 0xf8, + 0x01, 0x20, 0xff, 0xb2, 0x00, 0x90, 0x02, 0x97, 0xcd, 0xf8, 0x04, 0x80, + 0x05, 0x9a, 0xa8, 0x68, 0x09, 0x99, 0x82, 0x18, 0xa0, 0x68, 0x41, 0x18, + 0x08, 0xf1, 0x62, 0x03, 0x48, 0x46, 0x00, 0xf0, 0x53, 0xf8, 0x00, 0xf0, + 0x4c, 0xf8, 0xb6, 0xf9, 0x08, 0x00, 0x96, 0xf9, 0x01, 0x10, 0x09, 0x18, + 0x96, 0xf9, 0x02, 0x00, 0x0f, 0x18, 0x38, 0xb2, 0x00, 0x28, 0x48, 0xbf, + 0x00, 0x27, 0x37, 0x81, 0x48, 0x46, 0xe6, 0xf7, 0xca, 0xfe, 0x00, 0xf0, + 0x36, 0xf8, 0xf0, 0x73, 0x48, 0x46, 0xe7, 0xf7, 0xf8, 0xf8, 0x30, 0x70, + 0xb9, 0xb2, 0xb6, 0xf9, 0x0a, 0x20, 0x03, 0x98, 0xba, 0x1a, 0xc1, 0x40, + 0x12, 0xb2, 0x01, 0x23, 0x03, 0xfa, 0x00, 0xf0, 0x00, 0x2a, 0x00, 0xb2, + 0x01, 0xdd, 0x82, 0x42, 0x01, 0xe0, 0x40, 0x42, 0x90, 0x42, 0xac, 0xbf, + 0x01, 0x20, 0x00, 0x20, 0xca, 0xb2, 0x1f, 0x2a, 0x28, 0xbf, 0x1f, 0x21, + 0xca, 0xb2, 0x92, 0x45, 0x18, 0xbf, 0x00, 0x28, 0x06, 0xd0, 0xc9, 0xb2, + 0x48, 0x46, 0xe7, 0xf7, 0xc6, 0xf8, 0x00, 0xf0, 0x12, 0xf8, 0x77, 0x81, + 0x48, 0x46, 0xe7, 0xf7, 0xd0, 0xf8, 0x30, 0x70, 0x48, 0x46, 0xe6, 0xf7, + 0x98, 0xfe, 0x00, 0xf0, 0x04, 0xf8, 0xf0, 0x73, 0x0d, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0xb0, 0x73, 0x48, 0x46, 0xe6, 0xf7, 0x92, 0xbe, 0x00, 0x22, + 0x00, 0x21, 0x48, 0x46, 0xe7, 0xf7, 0x5c, 0xbb, 0xf8, 0xb5, 0x08, 0x9d, + 0x93, 0xf9, 0x00, 0x40, 0xc5, 0xf1, 0x64, 0x06, 0x56, 0x43, 0x64, 0x27, + 0x49, 0x00, 0xb6, 0xfb, 0xf7, 0xf7, 0xb9, 0x42, 0x38, 0xbf, 0x64, 0x1c, + 0x64, 0x35, 0x6a, 0x43, 0x64, 0x25, 0xb2, 0xfb, 0xf5, 0xf2, 0x8a, 0x42, + 0x07, 0x9a, 0x06, 0x99, 0x38, 0xbf, 0x64, 0x1e, 0x6c, 0x32, 0x0d, 0x00, + 0x0c, 0xbf, 0x12, 0x78, 0x52, 0x78, 0x1c, 0x70, 0x63, 0xb2, 0x01, 0xb0, + 0xbd, 0xe8, 0xf0, 0x40, 0x38, 0xb5, 0x9c, 0x18, 0x00, 0x25, 0x64, 0xb2, + 0x1f, 0x2c, 0x4f, 0xf4, 0x80, 0x72, 0xc8, 0xbf, 0x1f, 0x24, 0x02, 0xdc, + 0x00, 0x2c, 0x01, 0xd5, 0x00, 0x24, 0x15, 0x46, 0xc4, 0xf1, 0x20, 0x02, + 0x00, 0x29, 0xd2, 0xb2, 0xe1, 0xb2, 0x02, 0xd1, 0xe6, 0xf7, 0x4d, 0xfe, + 0x01, 0xe0, 0xe6, 0xf7, 0x4c, 0xfe, 0x28, 0x46, 0x32, 0xbd, 0x1c, 0xb5, + 0x04, 0x46, 0x00, 0x22, 0x03, 0x21, 0xe7, 0xf7, 0x48, 0xf8, 0x0f, 0x22, + 0x94, 0x21, 0x20, 0x46, 0xe7, 0xf7, 0x30, 0xf8, 0x00, 0x22, 0x01, 0x21, + 0x00, 0xf0, 0x1a, 0xf8, 0x01, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x16, 0xf8, + 0x02, 0x22, 0x04, 0x21, 0x00, 0xf0, 0x12, 0xf8, 0x03, 0x22, 0x08, 0x21, + 0x00, 0xf0, 0x0e, 0xf8, 0x4f, 0xf4, 0x80, 0x50, 0xad, 0xf8, 0x00, 0x00, + 0x4f, 0xf4, 0x80, 0x41, 0xad, 0xf8, 0x02, 0x10, 0x8d, 0xf8, 0x04, 0x40, + 0x68, 0x46, 0xe6, 0xf7, 0xdb, 0xfd, 0x13, 0xbd, 0x20, 0x46, 0xe7, 0xf7, + 0x09, 0xb8, 0x2d, 0xe9, 0xf8, 0x4f, 0x83, 0x46, 0x0e, 0x46, 0x17, 0x46, + 0x98, 0x46, 0x30, 0x46, 0xff, 0xf7, 0xfa, 0xfa, 0x82, 0x46, 0x0b, 0xeb, + 0x0a, 0x00, 0x4f, 0xf0, 0x00, 0x09, 0x90, 0xf8, 0x50, 0x50, 0xb0, 0x78, + 0x01, 0x28, 0x07, 0xd8, 0x31, 0x78, 0xf0, 0x78, 0x43, 0x46, 0x01, 0x22, + 0xff, 0xf7, 0xf4, 0xfa, 0x01, 0x24, 0x00, 0xe0, 0x00, 0x24, 0x00, 0x2f, + 0x29, 0x46, 0x03, 0xdd, 0x1f, 0x2d, 0x04, 0xd2, 0x49, 0x1c, 0x02, 0xe0, + 0x01, 0xd5, 0x05, 0xb1, 0x49, 0x1e, 0xc8, 0xb2, 0x00, 0x28, 0x14, 0xbf, + 0x1f, 0x28, 0x4f, 0xf4, 0x80, 0x79, 0xff, 0xf7, 0xe2, 0xfd, 0x30, 0x46, + 0xe6, 0xf7, 0xd4, 0xfd, 0x0b, 0xeb, 0x0a, 0x01, 0x81, 0xf8, 0x50, 0x00, + 0x2c, 0xb1, 0x31, 0x78, 0xf0, 0x78, 0x43, 0x46, 0x00, 0x22, 0xff, 0xf7, + 0xd1, 0xfa, 0x48, 0x46, 0xbd, 0xe8, 0xf2, 0x8f, 0x2d, 0xe9, 0xf8, 0x4f, + 0x84, 0xb0, 0x93, 0x46, 0x0d, 0xf1, 0x0a, 0x02, 0x80, 0x46, 0x89, 0x46, + 0x00, 0x26, 0x16, 0x80, 0x0d, 0xf1, 0x0a, 0x01, 0x0b, 0xf1, 0x50, 0x00, + 0xda, 0xf7, 0x0d, 0xf8, 0x8d, 0xf8, 0x08, 0x60, 0x00, 0x27, 0x0b, 0xeb, + 0x07, 0x00, 0x0d, 0xf1, 0x0a, 0x01, 0x90, 0xf9, 0x64, 0x00, 0xcc, 0x57, + 0x0b, 0xeb, 0x07, 0x02, 0x04, 0x1b, 0x82, 0xf8, 0x66, 0x40, 0x00, 0xf0, + 0x46, 0xf8, 0xf9, 0xb2, 0x40, 0x46, 0xda, 0xf7, 0x26, 0xf8, 0x00, 0x25, + 0x4f, 0xf0, 0x00, 0x0a, 0x8d, 0xf8, 0x0c, 0x70, 0x8d, 0xf8, 0x0d, 0x50, + 0x8d, 0xf8, 0x0e, 0xa0, 0x8d, 0xf8, 0x0f, 0x80, 0xa9, 0x00, 0xb9, 0xf8, + 0x0e, 0x00, 0x01, 0xeb, 0xc7, 0x01, 0x51, 0x44, 0xc8, 0x40, 0xc0, 0x07, + 0x10, 0xd5, 0x9d, 0xf8, 0x08, 0x30, 0x62, 0xb2, 0x03, 0xa9, 0x58, 0x46, + 0xff, 0xf7, 0x81, 0xff, 0x00, 0x96, 0x00, 0x22, 0x06, 0x46, 0x00, 0x21, + 0x40, 0x46, 0xe7, 0xf7, 0x6d, 0xfa, 0x30, 0x43, 0x00, 0x9e, 0x06, 0x43, + 0x00, 0xf0, 0x0f, 0xf8, 0xda, 0xd3, 0x6d, 0x1c, 0x02, 0x2d, 0xd5, 0xd3, + 0x00, 0xf0, 0x0f, 0xf8, 0xf9, 0xb2, 0x40, 0x46, 0xd9, 0xf7, 0xf5, 0xff, + 0x7f, 0x1c, 0x02, 0x2f, 0xb9, 0xd3, 0x30, 0x46, 0x66, 0xe5, 0x0a, 0xf1, + 0x01, 0x0a, 0x5f, 0xfa, 0x8a, 0xf0, 0x04, 0x28, 0x70, 0x47, 0x00, 0x20, + 0x01, 0x90, 0x00, 0x90, 0x01, 0x23, 0x01, 0x22, 0x70, 0x47, 0x00, 0x20, + 0x02, 0xa9, 0x01, 0x90, 0x00, 0x91, 0x01, 0x23, 0x00, 0x22, 0x70, 0x47, + 0x2d, 0xe9, 0xfe, 0x4f, 0x0c, 0x46, 0x00, 0x21, 0xad, 0xf8, 0x00, 0x10, + 0x82, 0x46, 0x15, 0x46, 0x88, 0x46, 0x89, 0x46, 0xe6, 0x7c, 0x69, 0x46, + 0x05, 0xf1, 0x50, 0x00, 0xd9, 0xf7, 0x9f, 0xff, 0x00, 0x20, 0xcd, 0xf8, + 0x04, 0xd0, 0x1d, 0xf9, 0x00, 0x10, 0x88, 0x44, 0x29, 0x18, 0x40, 0x1c, + 0x91, 0xf9, 0x64, 0x30, 0x02, 0x28, 0x99, 0x44, 0xf3, 0xd3, 0x4f, 0xfa, + 0x88, 0xf0, 0x00, 0xeb, 0xd0, 0x70, 0x41, 0x10, 0x4f, 0xfa, 0x89, 0xf0, + 0x00, 0xeb, 0xd0, 0x70, 0x42, 0x10, 0x30, 0x06, 0x47, 0xbf, 0x8e, 0x1a, + 0x4f, 0xfa, 0x82, 0xf8, 0xa1, 0xf1, 0x10, 0x06, 0x4f, 0xfa, 0x81, 0xf8, + 0x50, 0x46, 0xe6, 0xf7, 0x74, 0xff, 0x07, 0x46, 0x70, 0xb2, 0xd9, 0xf7, + 0x93, 0xfc, 0xe1, 0x7d, 0x01, 0xf0, 0x0f, 0x01, 0x81, 0x42, 0x05, 0xd2, + 0x76, 0xb2, 0x00, 0x2e, 0xcc, 0xbf, 0x01, 0x20, 0xff, 0x20, 0xc7, 0x19, + 0xf8, 0xb2, 0x1f, 0x28, 0x0b, 0xd2, 0x00, 0xf0, 0x4f, 0xf8, 0x06, 0x46, + 0xf9, 0xb2, 0x50, 0x46, 0xe6, 0xf7, 0x4b, 0xff, 0x00, 0xf0, 0x48, 0xf8, + 0x40, 0xea, 0x06, 0x09, 0x01, 0xe0, 0x4f, 0xf4, 0x80, 0x79, 0x50, 0x46, + 0xe6, 0xf7, 0x51, 0xff, 0x05, 0xf8, 0x60, 0x0f, 0x02, 0x94, 0x00, 0x24, + 0x01, 0x98, 0x07, 0x57, 0x00, 0x2c, 0xa7, 0xeb, 0x08, 0x07, 0x50, 0x46, + 0x04, 0xd1, 0xe6, 0xf7, 0x10, 0xfd, 0x06, 0x46, 0x6f, 0x70, 0x03, 0xe0, + 0xe6, 0xf7, 0x0f, 0xfd, 0x06, 0x46, 0xaf, 0x70, 0x78, 0xb2, 0xd9, 0xf7, + 0x5d, 0xfc, 0x02, 0x99, 0xca, 0x7d, 0x12, 0x09, 0x82, 0x42, 0x15, 0xd2, + 0x7f, 0xb2, 0x00, 0x2f, 0x4c, 0xbf, 0x4f, 0xf0, 0xff, 0x3b, 0x4f, 0xf0, + 0x01, 0x0b, 0x00, 0xf0, 0x1b, 0xf8, 0x07, 0x46, 0x5b, 0x46, 0x32, 0x46, + 0xe1, 0xb2, 0x50, 0x46, 0xff, 0xf7, 0x8a, 0xfe, 0x07, 0x43, 0x00, 0xf0, + 0x11, 0xf8, 0x07, 0x43, 0x47, 0xea, 0x09, 0x09, 0x64, 0x1c, 0x02, 0x2c, + 0xce, 0xd3, 0x50, 0x46, 0xe6, 0xf7, 0xe5, 0xfc, 0xa8, 0x73, 0x50, 0x46, + 0xe6, 0xf7, 0xe5, 0xfc, 0xe8, 0x73, 0x48, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, + 0x00, 0x22, 0x00, 0x21, 0x50, 0x46, 0xe7, 0xf7, 0xab, 0xb9, 0x03, 0x46, + 0x00, 0x20, 0x6b, 0xb1, 0x12, 0x78, 0x12, 0xb9, 0x0a, 0x78, 0x02, 0x2a, + 0x01, 0xd2, 0x01, 0x20, 0x70, 0x47, 0x05, 0x2a, 0x02, 0xd3, 0x12, 0x1f, + 0x0a, 0x70, 0x70, 0x47, 0x08, 0x70, 0x70, 0x47, 0x09, 0x78, 0x11, 0x70, + 0x70, 0x47, 0x30, 0xb5, 0x00, 0x24, 0x52, 0x08, 0x91, 0x42, 0x03, 0x9d, + 0x28, 0xbf, 0x82, 0x42, 0x03, 0xd2, 0x8a, 0x42, 0x28, 0xbf, 0x90, 0x42, + 0x11, 0xd3, 0x80, 0x1a, 0x48, 0xbf, 0x40, 0x42, 0x89, 0x1a, 0x1c, 0x78, + 0x2c, 0x70, 0x48, 0xbf, 0x49, 0x42, 0x88, 0x42, 0x11, 0xda, 0x18, 0x78, + 0x00, 0x28, 0x07, 0xbf, 0x00, 0x21, 0x29, 0x70, 0x40, 0x1e, 0x28, 0x70, + 0x09, 0xe0, 0x91, 0x42, 0x08, 0xd3, 0x18, 0x78, 0x02, 0x28, 0x02, 0xd3, + 0x80, 0x1e, 0x18, 0x70, 0x02, 0xe0, 0x1c, 0x70, 0x2c, 0x70, 0x01, 0x24, + 0x20, 0x46, 0x30, 0xbd, 0x10, 0xb5, 0x04, 0x46, 0x00, 0x20, 0x52, 0x08, + 0x91, 0x42, 0x28, 0xbf, 0xa2, 0x42, 0x03, 0xd2, 0x8a, 0x42, 0x0e, 0xd3, + 0x94, 0x42, 0x14, 0xd3, 0x01, 0x20, 0xa4, 0x1a, 0x48, 0xbf, 0x64, 0x42, + 0x89, 0x1a, 0x48, 0xbf, 0x49, 0x42, 0x8c, 0x42, 0x0b, 0xda, 0x19, 0x78, + 0x49, 0xb1, 0x49, 0x1e, 0x03, 0xe0, 0x19, 0x78, 0x02, 0x29, 0x02, 0xd3, + 0x89, 0x1e, 0x19, 0x70, 0x10, 0xbd, 0x18, 0x70, 0x01, 0x20, 0x10, 0xbd, + 0x2d, 0xe9, 0xf3, 0x4f, 0x85, 0xb0, 0x00, 0x24, 0x8d, 0xf8, 0x0c, 0x40, + 0x02, 0x94, 0x82, 0x46, 0x06, 0x99, 0x91, 0xf8, 0x04, 0xb0, 0x91, 0x46, + 0x98, 0x46, 0xff, 0xf7, 0xa2, 0xf9, 0x05, 0x46, 0x50, 0x46, 0xe6, 0xf7, + 0x49, 0xfc, 0x04, 0x90, 0x99, 0xf8, 0x84, 0x60, 0x9d, 0xf8, 0x40, 0x10, + 0x2a, 0x46, 0x50, 0x46, 0xff, 0xf7, 0xc8, 0xf9, 0x00, 0x27, 0xe1, 0xb2, + 0x50, 0x46, 0xe6, 0xf7, 0x61, 0xfc, 0x02, 0xa8, 0x01, 0x90, 0x00, 0x96, + 0x01, 0x23, 0x00, 0xf0, 0x47, 0xf8, 0x20, 0xb1, 0x64, 0x1c, 0xe0, 0xb2, + 0x20, 0x28, 0xf0, 0xd3, 0x00, 0xe0, 0x27, 0x46, 0x6d, 0x42, 0x9d, 0xf8, + 0x40, 0x10, 0x8d, 0xf8, 0x00, 0xb0, 0x6a, 0xb2, 0x50, 0x46, 0xff, 0xf7, + 0xad, 0xf9, 0x9d, 0xf8, 0x0c, 0x40, 0x9d, 0xf8, 0x00, 0xb0, 0x00, 0x25, + 0xe9, 0xb2, 0x50, 0x46, 0xe6, 0xf7, 0x42, 0xfc, 0x02, 0xa8, 0x01, 0x90, + 0x00, 0x96, 0x00, 0x23, 0x00, 0xf0, 0x28, 0xf8, 0x20, 0xb9, 0x2c, 0x46, + 0x6d, 0x1c, 0xe8, 0xb2, 0x20, 0x28, 0xef, 0xd3, 0x04, 0xa9, 0x7f, 0xb2, + 0x91, 0xf9, 0x00, 0x10, 0x11, 0x98, 0x64, 0xb2, 0xcf, 0x1b, 0x64, 0x1a, + 0xe1, 0x1b, 0x49, 0xb2, 0x01, 0xeb, 0xd1, 0x71, 0x49, 0x10, 0x01, 0x70, + 0xe0, 0x19, 0x40, 0xb2, 0xd9, 0xf7, 0x70, 0xfb, 0x06, 0x99, 0x8a, 0x7c, + 0x82, 0x42, 0x02, 0xd2, 0x12, 0x98, 0x01, 0x21, 0x01, 0x60, 0x50, 0x46, + 0xff, 0xf7, 0xf2, 0xf8, 0x48, 0x44, 0x00, 0xf8, 0x30, 0x7f, 0x04, 0x74, + 0xff, 0xf7, 0x0a, 0xba, 0x9a, 0xf8, 0x03, 0x00, 0x5a, 0x46, 0x41, 0x46, + 0xff, 0xf7, 0x10, 0xba, 0x2d, 0xe9, 0xf8, 0x4f, 0x84, 0xb0, 0x0e, 0x79, + 0xdd, 0xf8, 0x38, 0xa0, 0x04, 0x46, 0x90, 0x46, 0x9b, 0x46, 0xff, 0xf7, + 0x32, 0xf9, 0x05, 0x46, 0x20, 0x46, 0xe6, 0xf7, 0xd9, 0xfb, 0x98, 0xf8, + 0x84, 0x70, 0x00, 0x21, 0x8d, 0xf8, 0x08, 0x10, 0x03, 0x91, 0x81, 0x46, + 0x6d, 0x42, 0x6a, 0xb2, 0x51, 0x46, 0x20, 0x46, 0xff, 0xf7, 0x54, 0xf9, + 0x8d, 0xf8, 0x08, 0x90, 0x04, 0xe0, 0x9d, 0xf8, 0x08, 0x10, 0x49, 0x1c, + 0x8d, 0xf8, 0x08, 0x10, 0x9d, 0xf8, 0x08, 0x00, 0x20, 0x28, 0x18, 0xd2, + 0x01, 0x46, 0x20, 0x46, 0xe6, 0xf7, 0xe2, 0xfb, 0x03, 0xa8, 0x01, 0x90, + 0x00, 0x97, 0x00, 0x23, 0xe0, 0x78, 0x32, 0x46, 0x00, 0xf0, 0x23, 0xf8, + 0x9d, 0xf8, 0x08, 0x10, 0x03, 0x9a, 0x49, 0x45, 0x08, 0xbf, 0x82, 0x46, + 0x01, 0x46, 0x02, 0xab, 0x50, 0x46, 0xff, 0xf7, 0x2b, 0xff, 0x01, 0x28, + 0xdd, 0xd1, 0x20, 0x46, 0x9d, 0xf9, 0x08, 0x20, 0x0f, 0x99, 0x10, 0x9c, + 0xa2, 0xeb, 0x09, 0x02, 0x0a, 0x70, 0xff, 0xf7, 0x9b, 0xf8, 0x40, 0x44, + 0x9d, 0xf9, 0x08, 0x10, 0x00, 0xf8, 0x30, 0x1f, 0x9d, 0xf9, 0x08, 0x20, + 0x02, 0x74, 0x00, 0x20, 0x20, 0x60, 0xff, 0xf7, 0x8d, 0xbb, 0x59, 0x46, + 0xff, 0xf7, 0xb6, 0xb9, 0x2d, 0xe9, 0xf0, 0x41, 0x2d, 0xed, 0x04, 0x8b, + 0x08, 0xee, 0x90, 0x0a, 0x0c, 0x46, 0x15, 0x46, 0x9f, 0xed, 0x20, 0x8a, + 0xfa, 0xee, 0x65, 0x8a, 0x00, 0x26, 0xf0, 0xb2, 0x01, 0xf0, 0xa7, 0xfc, + 0xff, 0xee, 0x00, 0x0a, 0x30, 0xee, 0x20, 0x9a, 0x00, 0x27, 0x04, 0xeb, + 0x07, 0x18, 0x9f, 0xed, 0x1a, 0x0a, 0xd8, 0xed, 0x02, 0x0a, 0x79, 0xee, + 0x20, 0x0a, 0x78, 0xee, 0xe0, 0x0a, 0x20, 0xee, 0x80, 0x0a, 0xda, 0xf7, + 0xc9, 0xf8, 0xd8, 0xed, 0x00, 0x0a, 0xf0, 0xee, 0x40, 0x9a, 0x79, 0xee, + 0x20, 0x0a, 0x38, 0xee, 0xe0, 0x0a, 0xd9, 0xf7, 0xe1, 0xfa, 0x06, 0xeb, + 0xc7, 0x00, 0x05, 0xeb, 0x80, 0x01, 0x98, 0xed, 0x03, 0x1a, 0xd1, 0xed, + 0x00, 0x0a, 0x20, 0xee, 0x80, 0x0a, 0x20, 0xee, 0x29, 0x0a, 0x7f, 0x1c, + 0x80, 0xee, 0x01, 0x1a, 0x02, 0x2f, 0x31, 0xee, 0x08, 0x8a, 0xd4, 0xd3, + 0x76, 0x1c, 0x08, 0x2e, 0xc9, 0xd3, 0xb0, 0xee, 0x48, 0x0a, 0xbd, 0xec, + 0x04, 0x8b, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xdb, 0x0f, 0x49, 0x40, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, + 0xd8, 0xb0, 0x89, 0x46, 0x01, 0x20, 0x65, 0x99, 0x11, 0x90, 0x16, 0x46, + 0x08, 0x68, 0x98, 0x46, 0x42, 0x03, 0x44, 0xbf, 0x00, 0x20, 0x11, 0x90, + 0x98, 0xf9, 0x4d, 0x01, 0x8d, 0xf8, 0x01, 0x00, 0x00, 0x27, 0x9f, 0xed, + 0xd6, 0x8a, 0x08, 0xf1, 0x04, 0x02, 0x02, 0xeb, 0x87, 0x03, 0x38, 0x01, + 0x08, 0xa9, 0x0c, 0x18, 0x93, 0xed, 0x00, 0x0a, 0x20, 0xee, 0x08, 0x0a, + 0x08, 0xf1, 0x08, 0x03, 0x84, 0xed, 0x00, 0x0a, 0x79, 0x42, 0x53, 0xf8, + 0x21, 0x20, 0x09, 0xab, 0x7f, 0x1c, 0x1a, 0x50, 0x08, 0xf1, 0x08, 0x00, + 0x00, 0xeb, 0x81, 0x01, 0xd4, 0xed, 0x00, 0x0a, 0x91, 0xed, 0x00, 0x0a, + 0x20, 0xee, 0x08, 0x0a, 0x84, 0xed, 0x02, 0x0a, 0x9f, 0xed, 0xc5, 0x0a, + 0x94, 0xed, 0x02, 0x1a, 0x30, 0xee, 0xc1, 0x1a, 0x21, 0xee, 0x00, 0x0a, + 0xda, 0xf7, 0x5c, 0xf8, 0x01, 0x2f, 0x84, 0xed, 0x03, 0x0a, 0xd0, 0xd9, + 0x64, 0x99, 0x00, 0x20, 0x81, 0xf8, 0x86, 0x00, 0x20, 0x21, 0x9d, 0xf9, + 0x01, 0x70, 0x8d, 0xf8, 0x00, 0x70, 0x12, 0xa8, 0xec, 0xf7, 0xd4, 0xf8, + 0x20, 0x21, 0x1a, 0xa8, 0xec, 0xf7, 0xd0, 0xf8, 0x54, 0x21, 0x2d, 0xa8, + 0xec, 0xf7, 0xcc, 0xf8, 0x0b, 0x21, 0x04, 0xa8, 0xec, 0xf7, 0xc8, 0xf8, + 0x2c, 0x21, 0x22, 0xa8, 0xec, 0xf7, 0xc4, 0xf8, 0x00, 0x22, 0x08, 0xf5, + 0xb6, 0x75, 0x03, 0x92, 0xcd, 0xf8, 0x04, 0x90, 0x02, 0x96, 0x9f, 0xed, + 0xae, 0x8a, 0xa8, 0x7c, 0x00, 0x28, 0x54, 0xd0, 0x6f, 0xf0, 0x1f, 0x04, + 0x08, 0xf1, 0x10, 0x02, 0x08, 0xa9, 0x20, 0xb2, 0xff, 0xf7, 0x3c, 0xff, + 0xb4, 0xee, 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, 0xb0, 0xee, + 0x40, 0x8a, 0x64, 0x1c, 0x21, 0x2c, 0xef, 0xdb, 0x85, 0xed, 0x0a, 0x8a, + 0x28, 0x68, 0xd0, 0xb9, 0xa8, 0x7c, 0x02, 0x28, 0x0c, 0xd1, 0x01, 0x98, + 0x41, 0x78, 0x00, 0xee, 0x10, 0x1a, 0xb8, 0xee, 0x40, 0x0a, 0xf2, 0xee, + 0x04, 0x0a, 0xc0, 0xee, 0x20, 0x0a, 0xc5, 0xed, 0x05, 0x0a, 0x2e, 0xe0, + 0x9d, 0xf9, 0x01, 0x00, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0xc0, 0x0a, + 0x88, 0xee, 0x00, 0x0a, 0x85, 0xed, 0x05, 0x0a, 0x23, 0xe0, 0x01, 0x98, + 0x02, 0x9a, 0xc1, 0x78, 0x00, 0xf0, 0xf2, 0xfa, 0x9f, 0xed, 0x91, 0x1a, + 0x00, 0xf0, 0xe7, 0xfa, 0x71, 0xee, 0x21, 0x1a, 0x00, 0xf0, 0xdc, 0xfa, + 0x08, 0xf5, 0xbd, 0x71, 0x10, 0xee, 0x10, 0x0a, 0xc8, 0x54, 0x9f, 0xed, + 0x8b, 0x1a, 0x01, 0x98, 0x01, 0x79, 0x02, 0x9a, 0x00, 0xf0, 0xde, 0xfa, + 0x00, 0xf0, 0xd5, 0xfa, 0x71, 0xee, 0xc1, 0x1a, 0x00, 0xf0, 0xca, 0xfa, + 0x08, 0xf5, 0xbe, 0x71, 0x10, 0xee, 0x10, 0x0a, 0xc8, 0x54, 0x6f, 0xf0, + 0x04, 0x06, 0x01, 0x98, 0x00, 0xf1, 0x21, 0x01, 0x07, 0x91, 0x0d, 0xf1, + 0x48, 0x09, 0x00, 0x24, 0x1a, 0xa8, 0x10, 0x90, 0x08, 0xf1, 0x10, 0x02, + 0x60, 0x1e, 0x06, 0xeb, 0x40, 0x10, 0x00, 0xf0, 0xcb, 0xfa, 0x10, 0x98, + 0x00, 0xeb, 0x84, 0x01, 0x64, 0x1c, 0x08, 0x2c, 0x81, 0xed, 0x00, 0x0a, + 0xee, 0xd3, 0x00, 0x24, 0xa6, 0xf1, 0x0a, 0x0a, 0x60, 0xe0, 0x42, 0xa8, + 0x78, 0xee, 0x68, 0x0a, 0x00, 0xeb, 0x84, 0x01, 0x30, 0xee, 0x80, 0x0a, + 0x81, 0xed, 0x00, 0x0a, 0x52, 0xe0, 0x4f, 0xf0, 0x00, 0x0b, 0xab, 0xf1, + 0x01, 0x00, 0x0a, 0xeb, 0x40, 0x10, 0x00, 0xf0, 0xab, 0xfa, 0x09, 0xeb, + 0x8b, 0x00, 0x0b, 0xf1, 0x01, 0x0b, 0xbb, 0xf1, 0x08, 0x0f, 0x80, 0xed, + 0x00, 0x0a, 0xf0, 0xd3, 0x12, 0x98, 0x20, 0xf0, 0x00, 0x40, 0x2d, 0xa9, + 0x99, 0xed, 0x01, 0x8a, 0x00, 0xee, 0x10, 0x0a, 0x01, 0xeb, 0x84, 0x02, + 0x38, 0xee, 0x40, 0x0a, 0x82, 0xed, 0x00, 0x0a, 0x02, 0x20, 0x09, 0xeb, + 0x80, 0x02, 0x10, 0x9b, 0x92, 0xed, 0x00, 0x0a, 0x03, 0xeb, 0x80, 0x02, + 0x2d, 0xa9, 0xd2, 0xed, 0x00, 0x0a, 0x01, 0xeb, 0x84, 0x03, 0x30, 0xee, + 0x60, 0x0a, 0xb0, 0xee, 0xc0, 0x0a, 0x93, 0xed, 0x00, 0x1a, 0x01, 0xeb, + 0x84, 0x01, 0x40, 0x1c, 0x31, 0xee, 0x40, 0x1a, 0x08, 0x28, 0x81, 0xed, + 0x00, 0x1a, 0xe4, 0xd3, 0xb6, 0xb9, 0xaa, 0xf1, 0x20, 0x00, 0x00, 0xf0, + 0x73, 0xfa, 0x0a, 0xf1, 0x20, 0x00, 0xf0, 0xee, 0x40, 0x8a, 0x00, 0xf0, + 0x6d, 0xfa, 0x07, 0x99, 0x88, 0x7a, 0x00, 0x28, 0xab, 0xd1, 0x42, 0xa9, + 0x78, 0xee, 0x28, 0x0a, 0x01, 0xeb, 0x84, 0x00, 0x30, 0xee, 0xc0, 0x0a, + 0x80, 0xed, 0x00, 0x0a, 0x64, 0x1c, 0xe4, 0xb2, 0x0a, 0xf1, 0x01, 0x0a, + 0x06, 0xf1, 0x0b, 0x00, 0x82, 0x45, 0xa4, 0xdb, 0x9f, 0xed, 0x3f, 0x0a, + 0xdf, 0xed, 0x3e, 0x0a, 0x00, 0x20, 0x2d, 0xa9, 0x01, 0xeb, 0x80, 0x02, + 0x92, 0xed, 0x00, 0x1a, 0xb5, 0xee, 0x40, 0x1a, 0xf1, 0xee, 0x10, 0xfa, + 0xc8, 0xbf, 0x30, 0xee, 0x01, 0x0a, 0x40, 0x1c, 0x0b, 0x28, 0xf1, 0xd3, + 0x0a, 0x20, 0x01, 0xeb, 0x80, 0x02, 0x92, 0xed, 0x00, 0x1a, 0xb5, 0xee, + 0x40, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0xc8, 0xbf, 0x70, 0xee, 0x81, 0x0a, + 0x40, 0x1c, 0x15, 0x28, 0xf1, 0xd3, 0x03, 0x99, 0xf4, 0xee, 0x40, 0x0a, + 0x22, 0xa8, 0xf1, 0xee, 0x10, 0xfa, 0x00, 0xeb, 0x81, 0x02, 0xb8, 0xbf, + 0xb0, 0xee, 0x60, 0x0a, 0x82, 0xed, 0x00, 0x0a, 0x04, 0xa8, 0x03, 0x99, + 0x46, 0x54, 0x76, 0x1c, 0x03, 0x98, 0x40, 0x1c, 0xc0, 0xb2, 0x06, 0x2e, + 0x03, 0x90, 0xff, 0xf6, 0x4a, 0xaf, 0x9d, 0xed, 0x22, 0x0a, 0x00, 0x26, + 0x01, 0x20, 0x22, 0xa9, 0x01, 0xeb, 0x80, 0x02, 0xd2, 0xed, 0x00, 0x0a, + 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xbf, 0xb0, 0xee, + 0x60, 0x0a, 0x06, 0x46, 0x40, 0x1c, 0x0b, 0x28, 0xf0, 0xd3, 0x02, 0x99, + 0x0a, 0x79, 0x08, 0xf2, 0x71, 0x14, 0x00, 0x20, 0xa0, 0x54, 0x68, 0x72, + 0x28, 0x71, 0x08, 0xf2, 0x77, 0x13, 0x02, 0x99, 0x0a, 0x79, 0x7f, 0x20, + 0x98, 0x54, 0x9f, 0xed, 0x12, 0x1a, 0x00, 0x20, 0x68, 0x73, 0xa8, 0x72, + 0x9f, 0xed, 0x0e, 0x0a, 0x01, 0x98, 0x41, 0x7f, 0x07, 0x98, 0x00, 0xee, + 0x90, 0x1a, 0x81, 0x7a, 0xf8, 0xee, 0x60, 0x0a, 0x01, 0x29, 0xc0, 0xee, + 0x81, 0x0a, 0x13, 0xd1, 0x01, 0x98, 0xc1, 0x7e, 0x02, 0x98, 0x02, 0x79, + 0xa1, 0x54, 0x01, 0x98, 0x81, 0x7e, 0x02, 0x98, 0x02, 0x79, 0x99, 0x54, + 0x86, 0xe0, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x3d, 0xdb, 0x0f, 0x49, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x42, 0x02, 0x9a, 0x00, 0x21, + 0x6f, 0xf0, 0x09, 0x0c, 0x0d, 0xf1, 0x02, 0x0e, 0x0d, 0xf1, 0x0c, 0x09, + 0x42, 0xa8, 0x00, 0xeb, 0x81, 0x00, 0xbc, 0xf1, 0x0a, 0x0f, 0x90, 0xed, + 0x00, 0x1a, 0x31, 0xee, 0x40, 0x0a, 0x07, 0xda, 0x43, 0xa8, 0x00, 0xeb, + 0x81, 0x00, 0xd0, 0xed, 0x00, 0x1a, 0x71, 0xee, 0xc1, 0x1a, 0x01, 0xe0, + 0xdf, 0xed, 0xd0, 0x1a, 0x39, 0xb1, 0xf4, 0xee, 0x60, 0x1a, 0xf1, 0xee, + 0x10, 0xfa, 0x48, 0xbf, 0xbc, 0xf1, 0x00, 0x0f, 0x11, 0xd5, 0x68, 0x7b, + 0xb6, 0xee, 0x00, 0x0a, 0x31, 0xee, 0x00, 0x0a, 0x00, 0xf0, 0x01, 0x0a, + 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0xba, 0x09, 0xf8, 0x0a, 0xb0, + 0x0e, 0xf8, 0x0a, 0xc0, 0x40, 0x1c, 0x68, 0x73, 0x1b, 0xe0, 0xb4, 0xee, + 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x02, 0xd5, 0xbc, 0xf1, 0x00, 0x0f, + 0x02, 0xd5, 0xbc, 0xf1, 0x0a, 0x0f, 0x10, 0xd1, 0x68, 0x7a, 0x70, 0xb9, + 0xb6, 0xee, 0x00, 0x0a, 0x31, 0xee, 0x00, 0x0a, 0x10, 0x79, 0xbd, 0xee, + 0xc0, 0x0a, 0x10, 0xee, 0x10, 0xaa, 0x04, 0xf8, 0x00, 0xa0, 0x85, 0xf8, + 0x04, 0xc0, 0x01, 0x20, 0x68, 0x72, 0x0c, 0xf1, 0x01, 0x0c, 0x49, 0x1c, + 0xbc, 0xf1, 0x0b, 0x0f, 0xb0, 0xee, 0x41, 0x0a, 0xc9, 0xb2, 0xab, 0xdb, + 0x02, 0x92, 0x68, 0x7b, 0x92, 0xf8, 0x04, 0xc0, 0x00, 0xf0, 0x01, 0x01, + 0xc1, 0xf1, 0x01, 0x01, 0x01, 0x28, 0xc9, 0xb2, 0x04, 0xeb, 0x0c, 0x02, + 0x0e, 0xd9, 0x92, 0xf9, 0x00, 0xa0, 0x19, 0xf9, 0x01, 0x00, 0xdd, 0xf8, + 0x04, 0xc0, 0xaa, 0xeb, 0x00, 0x0a, 0x9c, 0xf9, 0x1c, 0x00, 0x82, 0x45, + 0xbc, 0xbf, 0xc1, 0xf1, 0x01, 0x01, 0xc9, 0xb2, 0x19, 0xf8, 0x01, 0x00, + 0x90, 0x71, 0x1e, 0xf8, 0x01, 0x10, 0xa9, 0x72, 0xf6, 0xb2, 0x65, 0x98, + 0x00, 0x68, 0x01, 0x04, 0x1d, 0xd5, 0x95, 0xf9, 0x41, 0x10, 0x95, 0xf9, + 0x40, 0x20, 0x00, 0xee, 0x10, 0x1a, 0x00, 0xee, 0x90, 0x2a, 0xb8, 0xee, + 0xc0, 0x0a, 0xf8, 0xee, 0xe0, 0x0a, 0xc0, 0xee, 0x20, 0x0a, 0xb0, 0xee, + 0xe0, 0x0a, 0xb5, 0xee, 0x00, 0x1a, 0xb4, 0xee, 0x41, 0x0a, 0x00, 0x0c, + 0xf1, 0xee, 0x10, 0xfa, 0x00, 0xf0, 0x03, 0x00, 0x03, 0xd5, 0x04, 0xa9, + 0x8a, 0x5d, 0x10, 0x1a, 0x88, 0x55, 0x04, 0xa8, 0x01, 0x99, 0x80, 0x57, + 0x4e, 0x7a, 0x7a, 0x1c, 0xb1, 0x06, 0x09, 0xd4, 0x01, 0x9e, 0x96, 0xf9, + 0x1e, 0x10, 0x81, 0x42, 0xb8, 0xbf, 0x17, 0x46, 0xc8, 0x42, 0x2d, 0xda, + 0x7f, 0x1e, 0x2b, 0xe0, 0x01, 0x99, 0x91, 0xf9, 0x1f, 0x10, 0x88, 0x42, + 0xc8, 0xbf, 0x08, 0x46, 0x49, 0x42, 0x88, 0x42, 0xb8, 0xbf, 0x08, 0x46, + 0x98, 0xf8, 0x02, 0x10, 0x40, 0x18, 0x88, 0xf8, 0x02, 0x00, 0x40, 0xb2, + 0x01, 0x9e, 0x96, 0xf9, 0x1e, 0x10, 0x88, 0x42, 0x03, 0xdb, 0x00, 0x20, + 0x17, 0x46, 0x88, 0xf8, 0x02, 0x00, 0x01, 0x98, 0x90, 0xf9, 0x1e, 0x10, + 0x98, 0xf9, 0x02, 0x00, 0x49, 0x42, 0x81, 0x42, 0x03, 0xdb, 0x00, 0x21, + 0x7f, 0x1e, 0x88, 0xf8, 0x02, 0x10, 0x01, 0x98, 0x41, 0x7a, 0x48, 0x06, + 0x44, 0xbf, 0x00, 0x21, 0x88, 0xf8, 0x02, 0x10, 0x02, 0x98, 0x01, 0x79, + 0x07, 0x98, 0x0c, 0x44, 0x01, 0x78, 0x94, 0xf9, 0x00, 0x60, 0x71, 0xb3, + 0xdd, 0xf8, 0x04, 0xc0, 0x28, 0x68, 0x9c, 0xf8, 0x21, 0xe0, 0x01, 0x46, + 0x71, 0x45, 0x88, 0xbf, 0x71, 0x46, 0x00, 0xee, 0x10, 0x1a, 0xb8, 0xee, + 0x40, 0x0a, 0x08, 0xb9, 0xb7, 0xee, 0x00, 0x0a, 0x94, 0xf9, 0x02, 0x00, + 0x00, 0x28, 0x0c, 0xbf, 0x00, 0xee, 0x90, 0x6a, 0x00, 0xee, 0x90, 0x0a, + 0xf8, 0xee, 0xe0, 0x0a, 0x80, 0xee, 0x80, 0x1a, 0x70, 0xee, 0xc1, 0x0a, + 0x01, 0xee, 0x10, 0x6a, 0xb8, 0xee, 0xc1, 0x1a, 0x81, 0xee, 0x00, 0x0a, + 0xb6, 0xee, 0x00, 0x1a, 0x30, 0xee, 0x01, 0x0a, 0x30, 0xee, 0x80, 0x0a, + 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0xa0, 0x70, 0x11, 0x98, + 0xf8, 0xb1, 0x02, 0x99, 0x0c, 0x79, 0x08, 0xf2, 0x73, 0x10, 0x06, 0x5d, + 0x4c, 0x78, 0x06, 0x55, 0x02, 0x98, 0x01, 0x79, 0x5c, 0x5c, 0x41, 0x78, + 0x5c, 0x54, 0x08, 0xf5, 0xbd, 0x73, 0x02, 0x98, 0x01, 0x79, 0x5b, 0x5c, + 0x02, 0x99, 0x4c, 0x78, 0x08, 0xf5, 0xbd, 0x70, 0x03, 0x55, 0x08, 0xf5, + 0xbe, 0x70, 0x02, 0x99, 0x0b, 0x79, 0xc0, 0x5c, 0x02, 0x9b, 0x5c, 0x78, + 0x08, 0xf5, 0xbe, 0x71, 0x08, 0x55, 0x02, 0x9b, 0x5c, 0x78, 0x01, 0x98, + 0x98, 0xf8, 0xe0, 0xc1, 0x90, 0xf9, 0x1b, 0x10, 0x90, 0xf9, 0x1a, 0x00, + 0x44, 0x44, 0x04, 0xf2, 0x73, 0x14, 0x94, 0xf9, 0x07, 0x30, 0x94, 0xf9, + 0x00, 0x60, 0x99, 0x42, 0xa8, 0xbf, 0x19, 0x46, 0x94, 0xf9, 0x09, 0x30, + 0x83, 0x42, 0xa8, 0xbf, 0x18, 0x46, 0x94, 0xf9, 0x04, 0x30, 0x07, 0x9c, + 0xa4, 0x7a, 0x01, 0x2c, 0x04, 0xbf, 0x7f, 0xb2, 0x7f, 0x42, 0xbc, 0xf1, + 0x07, 0x0f, 0x0f, 0xbf, 0x98, 0xf9, 0x4d, 0x71, 0xdd, 0xf8, 0x04, 0x80, + 0x98, 0xf9, 0x1c, 0xc0, 0xbc, 0xf1, 0x7f, 0x0f, 0x24, 0xd0, 0x95, 0xf9, + 0x0a, 0x50, 0x15, 0xf1, 0x0a, 0x0f, 0x01, 0x9d, 0xed, 0x79, 0x0c, 0xbf, + 0x9e, 0x46, 0x0c, 0xeb, 0x03, 0x0e, 0xed, 0x07, 0xa6, 0xeb, 0x0c, 0x08, + 0x48, 0xbf, 0x4f, 0xf0, 0x00, 0x0e, 0x09, 0xd4, 0xf5, 0x1a, 0xb5, 0xeb, + 0x4c, 0x0f, 0x05, 0xda, 0x9e, 0x19, 0x06, 0xeb, 0xd6, 0x76, 0x4f, 0xea, + 0x66, 0x08, 0xc6, 0x46, 0x4f, 0xfa, 0x88, 0xf3, 0x99, 0x42, 0xc8, 0xbf, + 0x19, 0x46, 0x4f, 0xfa, 0x8e, 0xf3, 0x98, 0x42, 0xb8, 0xbf, 0x18, 0x46, + 0x7f, 0xb2, 0x8f, 0x42, 0xc8, 0xbf, 0x0f, 0x46, 0x64, 0x99, 0x87, 0x42, + 0xb8, 0xbf, 0x07, 0x46, 0x01, 0x2c, 0x91, 0xf9, 0x86, 0x00, 0x08, 0xbf, + 0x7f, 0x42, 0x00, 0x28, 0x1c, 0xbf, 0x91, 0xf9, 0x46, 0x10, 0x01, 0x29, + 0x0f, 0xd1, 0x9d, 0xf9, 0x01, 0x10, 0x78, 0xb2, 0x88, 0x42, 0x05, 0xda, + 0x9d, 0xf8, 0x00, 0x00, 0x41, 0x1e, 0x8d, 0xf8, 0x00, 0x10, 0x04, 0xe0, + 0x7f, 0xb2, 0xb9, 0x42, 0xb8, 0xbf, 0x8d, 0xf8, 0x00, 0x20, 0x9d, 0xf9, + 0x00, 0x00, 0x40, 0x28, 0xa8, 0xbf, 0x3f, 0x20, 0x04, 0xda, 0x10, 0xf1, + 0x3f, 0x0f, 0x03, 0xda, 0x6f, 0xf0, 0x3e, 0x00, 0x8d, 0xf8, 0x00, 0x00, + 0x9d, 0xf9, 0x00, 0x00, 0x58, 0xb0, 0xf5, 0xe1, 0x00, 0x00, 0x00, 0x00, + 0xb6, 0xee, 0x00, 0x2a, 0x00, 0xee, 0x21, 0x2a, 0xbd, 0xee, 0xc2, 0x0a, + 0x70, 0x47, 0x80, 0xee, 0x81, 0x1a, 0xf7, 0xee, 0x00, 0x1a, 0x88, 0xee, + 0x00, 0x0a, 0x70, 0x47, 0x95, 0xed, 0x05, 0x0a, 0x13, 0x79, 0x00, 0xee, + 0x90, 0x1a, 0xf8, 0xee, 0x60, 0x0a, 0x70, 0x47, 0x08, 0xf1, 0x10, 0x02, + 0x08, 0xa9, 0x00, 0xb2, 0x0e, 0xe4, 0x00, 0x00, 0x2d, 0xe9, 0xfc, 0x4b, + 0x2d, 0xed, 0x02, 0x8b, 0x8c, 0xb0, 0x80, 0x46, 0x0e, 0x46, 0x17, 0x46, + 0x1c, 0x46, 0x04, 0xa8, 0x64, 0xa1, 0x20, 0x22, 0xd9, 0xf7, 0xba, 0xfb, + 0x00, 0x25, 0xb5, 0xee, 0x00, 0x8a, 0x0d, 0xf1, 0x10, 0x09, 0x94, 0xf8, + 0x4c, 0x01, 0xa8, 0xb1, 0x04, 0xf1, 0x0c, 0x02, 0x31, 0x7a, 0x00, 0xee, + 0x10, 0x0a, 0x50, 0x5d, 0x41, 0x18, 0x49, 0xb2, 0x04, 0xeb, 0x81, 0x03, + 0x20, 0x1d, 0xb8, 0xee, 0x40, 0x0a, 0xd3, 0xed, 0x4a, 0x0a, 0x00, 0xeb, + 0x85, 0x01, 0x80, 0xee, 0x80, 0x0a, 0x81, 0xed, 0x00, 0x0a, 0x02, 0xe0, + 0x22, 0x1d, 0x42, 0xf8, 0x25, 0x00, 0x04, 0xf1, 0x0c, 0x02, 0x96, 0xf9, + 0x08, 0x10, 0x53, 0x57, 0x59, 0x18, 0x0c, 0x20, 0x41, 0x43, 0x03, 0x20, + 0xc9, 0xb2, 0x04, 0xf1, 0x10, 0x02, 0x00, 0xeb, 0xc5, 0x03, 0x02, 0xeb, + 0x83, 0x03, 0x42, 0x18, 0x04, 0xeb, 0x42, 0x0b, 0x40, 0x1c, 0xbb, 0xf9, + 0x50, 0x20, 0x00, 0xee, 0x10, 0x2a, 0xb8, 0xee, 0xc0, 0x0a, 0x08, 0x28, + 0x83, 0xed, 0x00, 0x0a, 0xeb, 0xd3, 0x04, 0xeb, 0x41, 0x00, 0xb0, 0xf9, + 0x60, 0x10, 0xb0, 0xf9, 0x62, 0xe0, 0xb0, 0xf9, 0x64, 0x20, 0xb0, 0xf9, + 0x66, 0x30, 0xad, 0xf8, 0x06, 0x10, 0xad, 0xf8, 0x04, 0xe0, 0xad, 0xf8, + 0x02, 0x20, 0xad, 0xf8, 0x00, 0x30, 0x40, 0x46, 0x94, 0xf8, 0x4c, 0x11, + 0x8d, 0xf8, 0x08, 0x10, 0x39, 0x79, 0xe5, 0xf7, 0xfc, 0xff, 0x8d, 0xf8, + 0x09, 0x00, 0x68, 0x46, 0x00, 0xf0, 0x96, 0xf8, 0x9d, 0xf9, 0x0a, 0x10, + 0x04, 0xf1, 0x10, 0x02, 0x00, 0xee, 0x10, 0x1a, 0x02, 0xeb, 0x45, 0x12, + 0xb8, 0xee, 0xc0, 0x0a, 0x82, 0xed, 0x00, 0x0a, 0x04, 0xeb, 0x45, 0x10, + 0x9d, 0xf9, 0x0b, 0x10, 0x00, 0xee, 0x10, 0x1a, 0xb8, 0xee, 0xc0, 0x0a, + 0x80, 0xed, 0x05, 0x0a, 0x04, 0xf1, 0x10, 0x03, 0x9d, 0xf9, 0x0c, 0x10, + 0x00, 0xee, 0x10, 0x1a, 0xb8, 0xee, 0xc0, 0x0a, 0x80, 0xed, 0x06, 0x0a, + 0x00, 0x20, 0x00, 0xeb, 0xc5, 0x01, 0x09, 0xeb, 0x80, 0x02, 0x40, 0x1c, + 0x92, 0xed, 0x00, 0x0a, 0x03, 0xeb, 0x81, 0x02, 0x20, 0xee, 0x08, 0x0a, + 0xd2, 0xed, 0x00, 0x0a, 0x04, 0xf1, 0x10, 0x02, 0x02, 0xeb, 0x81, 0x01, + 0x60, 0xee, 0x20, 0x0a, 0x03, 0x28, 0xc1, 0xed, 0x00, 0x0a, 0xe8, 0xd3, + 0x03, 0x21, 0x01, 0xeb, 0xc5, 0x00, 0x94, 0xf8, 0x4c, 0x21, 0x04, 0xf1, + 0x10, 0x03, 0x00, 0xee, 0x10, 0x2a, 0x03, 0xeb, 0x80, 0x02, 0xb8, 0xee, + 0x40, 0x0a, 0xd2, 0xed, 0x00, 0x0a, 0x04, 0xf1, 0x10, 0x02, 0x02, 0xeb, + 0x80, 0x03, 0x80, 0xee, 0x80, 0x0a, 0x83, 0xed, 0x00, 0x0a, 0x09, 0xeb, + 0x81, 0x03, 0x02, 0xeb, 0x80, 0x00, 0xd3, 0xed, 0x00, 0x0a, 0x60, 0xee, + 0x88, 0x0a, 0x49, 0x1c, 0x20, 0xee, 0x80, 0x0a, 0x08, 0x29, 0x80, 0xed, + 0x00, 0x0a, 0xda, 0xd3, 0x6d, 0x1c, 0x02, 0x2d, 0xff, 0xf4, 0x45, 0xaf, + 0x0c, 0xb0, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf3, 0x8b, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x80, 0x40, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0xc0, 0xb2, 0x01, 0xee, + 0x10, 0x0a, 0x01, 0xee, 0x90, 0x1a, 0xb5, 0xee, 0x40, 0x0a, 0xb8, 0xee, + 0x41, 0x1a, 0xf8, 0xee, 0x61, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x21, 0xee, + 0x21, 0x1a, 0x4c, 0xbf, 0xfe, 0xee, 0x00, 0x0a, 0xf6, 0xee, 0x00, 0x0a, + 0x80, 0xee, 0x01, 0x0a, 0x30, 0xee, 0x20, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, + 0x10, 0xee, 0x10, 0x0a, 0x40, 0xb2, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, + 0x2d, 0xed, 0x02, 0x8b, 0x06, 0x46, 0x84, 0xb0, 0xb6, 0xf9, 0x06, 0x10, + 0x03, 0x91, 0xb6, 0xf9, 0x04, 0x20, 0x03, 0x99, 0x02, 0x92, 0x30, 0x7a, + 0xb6, 0xf9, 0x02, 0x30, 0xb6, 0xf9, 0x00, 0xe0, 0x8d, 0xf8, 0x00, 0x00, + 0x5b, 0x42, 0xc0, 0xeb, 0x80, 0x10, 0x81, 0x42, 0x02, 0x99, 0xb4, 0xbf, + 0x00, 0x24, 0x01, 0x24, 0x81, 0x42, 0x1b, 0xb2, 0xb4, 0xbf, 0x00, 0x25, + 0x01, 0x25, 0xce, 0xf1, 0x00, 0x0e, 0x83, 0x42, 0x0f, 0xfa, 0x8e, 0xfe, + 0x03, 0xeb, 0x0e, 0x01, 0xad, 0xf8, 0x02, 0x10, 0xb4, 0xbf, 0x4f, 0xf0, + 0x00, 0x08, 0x4f, 0xf0, 0x01, 0x08, 0xbd, 0xf8, 0x02, 0xc0, 0x02, 0x99, + 0x8c, 0x44, 0x03, 0x99, 0x86, 0x45, 0x61, 0x44, 0xb4, 0xbf, 0x4f, 0xf0, + 0x00, 0x09, 0x4f, 0xf0, 0x01, 0x09, 0x0f, 0xfa, 0x81, 0xfc, 0xae, 0xeb, + 0x03, 0x01, 0xad, 0xf8, 0x06, 0x10, 0x28, 0x19, 0x02, 0x99, 0x00, 0xee, + 0x10, 0xca, 0xbd, 0xf8, 0x06, 0xc0, 0x8c, 0x44, 0x03, 0x99, 0xac, 0xeb, + 0x01, 0x01, 0x40, 0x44, 0xb8, 0xee, 0xc0, 0x8a, 0x0f, 0xfa, 0x81, 0xfc, + 0x48, 0x44, 0x00, 0xee, 0x10, 0xca, 0xc0, 0xb2, 0xb8, 0xee, 0xc0, 0x0a, + 0xa8, 0xb9, 0x00, 0xf0, 0x87, 0xf8, 0x00, 0xf0, 0x7f, 0xf8, 0xff, 0xf7, + 0x85, 0xff, 0xf0, 0x72, 0xbd, 0xf8, 0x02, 0x40, 0x02, 0x9b, 0x03, 0x9a, + 0x31, 0x7a, 0xe4, 0x1a, 0xa4, 0x1a, 0x24, 0xb2, 0x00, 0xee, 0x10, 0x4a, + 0x04, 0x20, 0x00, 0xf0, 0x7a, 0xf8, 0x00, 0x27, 0x65, 0xe0, 0x03, 0x99, + 0x59, 0x1a, 0xad, 0xf8, 0x04, 0x10, 0x01, 0x28, 0x02, 0x99, 0xae, 0xeb, + 0x01, 0x01, 0xad, 0xf8, 0x02, 0x10, 0x3d, 0xd1, 0x02, 0x98, 0x1b, 0x18, + 0x34, 0xb1, 0xbd, 0xf9, 0x02, 0xb0, 0xbd, 0xf9, 0x06, 0x20, 0x9a, 0x46, + 0x03, 0x27, 0x1c, 0xe0, 0x03, 0x98, 0x86, 0x44, 0x35, 0xb1, 0xbd, 0xf9, + 0x04, 0xb0, 0xbd, 0xf9, 0x06, 0x20, 0xf2, 0x46, 0x04, 0x27, 0x12, 0xe0, + 0x02, 0x99, 0x08, 0x1a, 0xb8, 0xf1, 0x00, 0x0f, 0x05, 0xd0, 0xbd, 0xf9, + 0x02, 0xb0, 0xf2, 0x46, 0x02, 0x46, 0x01, 0x27, 0x07, 0xe0, 0xb9, 0xf1, + 0x00, 0x0f, 0x04, 0xd0, 0xbd, 0xf9, 0x04, 0xb0, 0x9a, 0x46, 0x02, 0x46, + 0x02, 0x27, 0x12, 0xb2, 0x9d, 0xf8, 0x00, 0x10, 0x00, 0xee, 0x10, 0x2a, + 0x00, 0xf0, 0x3e, 0xf8, 0xb0, 0x72, 0x0f, 0xfa, 0x8a, 0xfa, 0x31, 0x7a, + 0x00, 0xee, 0x10, 0xaa, 0x00, 0xf0, 0x36, 0xf8, 0xf0, 0x72, 0x0f, 0xfa, + 0x8b, 0xfb, 0x31, 0x7a, 0x02, 0x20, 0x00, 0xee, 0x10, 0xba, 0x17, 0xe0, + 0x00, 0xf0, 0x28, 0xf8, 0x00, 0xf0, 0x20, 0xf8, 0x07, 0x27, 0xff, 0xf7, + 0x25, 0xff, 0x58, 0xea, 0x04, 0x04, 0xf0, 0x72, 0x03, 0xd1, 0x31, 0x7a, + 0xbd, 0xf9, 0x04, 0x20, 0x05, 0xe0, 0x59, 0xea, 0x05, 0x05, 0x08, 0xd1, + 0x31, 0x7a, 0xbd, 0xf9, 0x02, 0x20, 0x02, 0x20, 0x00, 0xee, 0x10, 0x2a, + 0x00, 0xf0, 0x15, 0xf8, 0x01, 0xe0, 0x96, 0xf9, 0x09, 0x00, 0x30, 0x73, + 0x04, 0xb0, 0xf8, 0xb2, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, + 0xb0, 0x72, 0x04, 0x20, 0x31, 0x7a, 0xb0, 0xee, 0x48, 0x0a, 0x70, 0x47, + 0x9d, 0xf8, 0x00, 0x10, 0x04, 0x20, 0xfd, 0xe6, 0x02, 0x20, 0xb8, 0xee, + 0xc0, 0x0a, 0xf9, 0xe6, 0xf0, 0xb5, 0x9d, 0xf9, 0x18, 0x00, 0x91, 0xf9, + 0x08, 0x10, 0x05, 0x9a, 0x41, 0x18, 0x0c, 0x20, 0x41, 0x43, 0x00, 0x20, + 0x50, 0xfa, 0x81, 0xf4, 0x03, 0xeb, 0x44, 0x04, 0x16, 0x18, 0xb4, 0xf8, + 0x50, 0x50, 0x96, 0xf9, 0x2c, 0x70, 0x40, 0x1c, 0xef, 0x19, 0x0c, 0x28, + 0xa4, 0xf8, 0x50, 0x70, 0xf0, 0xd3, 0xf0, 0xbd, 0x2d, 0xe9, 0xfa, 0x4f, + 0xad, 0xf5, 0x63, 0x7d, 0x00, 0x21, 0x83, 0xf8, 0x31, 0x12, 0x91, 0x46, + 0x9d, 0xf8, 0xc0, 0x13, 0x10, 0x91, 0x01, 0x29, 0xe3, 0x99, 0x8c, 0xbf, + 0xcb, 0x8a, 0x8b, 0x8a, 0xad, 0xf8, 0x12, 0x30, 0x80, 0x46, 0xe4, 0x99, + 0x4f, 0xf4, 0x0d, 0x72, 0x56, 0xa8, 0xd9, 0xf7, 0xab, 0xf9, 0xee, 0x99, + 0x8c, 0x22, 0x11, 0xa8, 0xd9, 0xf7, 0xa6, 0xf9, 0xe3, 0x98, 0x00, 0xf1, + 0x28, 0x01, 0x0c, 0x91, 0x0d, 0xa8, 0xca, 0x79, 0x41, 0x46, 0xeb, 0xf7, + 0xfb, 0xfe, 0x87, 0x21, 0x34, 0xa8, 0xeb, 0xf7, 0x53, 0xfb, 0x00, 0x20, + 0x06, 0x90, 0x05, 0xa9, 0x0f, 0xf2, 0xf4, 0x30, 0x02, 0x68, 0x0a, 0x60, + 0x48, 0x46, 0xeb, 0xf7, 0xfc, 0xfb, 0x8d, 0xf8, 0x1d, 0x00, 0x8d, 0xf8, + 0x21, 0x80, 0x06, 0x20, 0x8d, 0xf8, 0x1f, 0x00, 0x00, 0x25, 0x99, 0xf8, + 0x03, 0x00, 0x50, 0xb1, 0x9d, 0xf8, 0xbc, 0x03, 0x01, 0x90, 0x00, 0x95, + 0x00, 0xf0, 0xf0, 0xf9, 0x00, 0x22, 0xc9, 0xb2, 0x40, 0x46, 0xd8, 0xf7, + 0xd2, 0xff, 0x99, 0xf8, 0x04, 0x10, 0x40, 0x46, 0xe5, 0xf7, 0xd7, 0xfd, + 0x8d, 0xf8, 0x0d, 0x00, 0x1c, 0xaf, 0x99, 0xf8, 0x09, 0x00, 0xc0, 0xf3, + 0x40, 0x00, 0x0f, 0x90, 0x4b, 0x46, 0x38, 0x7f, 0x40, 0x1c, 0x38, 0x77, + 0x8d, 0xf8, 0x0c, 0x50, 0x11, 0xa9, 0xe4, 0x9a, 0x40, 0x46, 0x00, 0xf0, + 0x7a, 0xff, 0x11, 0xaa, 0x49, 0x46, 0x40, 0x46, 0xeb, 0xf7, 0x1a, 0xfb, + 0xad, 0xf8, 0x10, 0x50, 0x00, 0x24, 0xad, 0xf8, 0x0e, 0x50, 0x04, 0xe0, + 0xbd, 0xf8, 0x0e, 0x00, 0x40, 0x1c, 0xad, 0xf8, 0x0e, 0x00, 0xbd, 0xf8, + 0x0e, 0x00, 0xbd, 0xf8, 0x12, 0x10, 0x88, 0x42, 0x80, 0xf0, 0x15, 0x81, + 0x00, 0x20, 0x78, 0x86, 0x82, 0x46, 0xbd, 0xf8, 0x10, 0x10, 0x49, 0x1c, + 0xad, 0xf8, 0x10, 0x10, 0x4f, 0xf0, 0x01, 0x0b, 0x40, 0xe0, 0x00, 0x2c, + 0x08, 0xbf, 0x00, 0x2d, 0x40, 0xf0, 0x92, 0x80, 0xc6, 0xbb, 0xbd, 0xf8, + 0x68, 0x60, 0xe3, 0x98, 0x42, 0x7a, 0xd3, 0x08, 0x03, 0xf0, 0x01, 0x03, + 0x83, 0xf0, 0x01, 0x03, 0x91, 0x08, 0x01, 0xf0, 0x01, 0x01, 0x81, 0xf0, + 0x01, 0x01, 0x10, 0x09, 0x52, 0x08, 0x02, 0xf0, 0x01, 0x02, 0x82, 0xf0, + 0x01, 0x02, 0x16, 0xfb, 0x02, 0xf2, 0xad, 0xf8, 0x68, 0x20, 0x00, 0xf0, + 0x01, 0x00, 0xbd, 0xf8, 0x6a, 0x20, 0x12, 0xfb, 0x03, 0xf2, 0xad, 0xf8, + 0x6a, 0x20, 0x80, 0xf0, 0x01, 0x00, 0xbd, 0xf8, 0x6c, 0x20, 0x12, 0xfb, + 0x01, 0xf1, 0xad, 0xf8, 0x6c, 0x10, 0x11, 0xab, 0xbd, 0xf8, 0x6e, 0x10, + 0x11, 0xfb, 0x00, 0xf0, 0xad, 0xf8, 0x6e, 0x00, 0x5f, 0xfa, 0x8b, 0xf1, + 0xe3, 0x98, 0xb0, 0xf9, 0x10, 0x20, 0x40, 0x46, 0xeb, 0xf7, 0x05, 0xfd, + 0x9d, 0xf8, 0x08, 0xa0, 0x0b, 0xf1, 0x01, 0x0b, 0x10, 0x99, 0x5f, 0xfa, + 0x8b, 0xf0, 0x49, 0x1c, 0x88, 0x42, 0x53, 0xd2, 0x5f, 0xfa, 0x8b, 0xf1, + 0x0a, 0xf1, 0x01, 0x00, 0x01, 0x29, 0x8d, 0xf8, 0x08, 0x00, 0x05, 0xad, + 0x2e, 0xd1, 0x00, 0x20, 0x8d, 0xf8, 0x1e, 0x00, 0x00, 0x26, 0x00, 0xf0, + 0x7a, 0xf9, 0xf0, 0xb2, 0x04, 0x28, 0xfa, 0xd3, 0x00, 0xf0, 0x69, 0xf9, + 0x06, 0x46, 0x97, 0xf9, 0x1a, 0x00, 0x08, 0xb9, 0x00, 0xf0, 0x4b, 0xf9, + 0xd8, 0xf7, 0xc7, 0xfc, 0x00, 0xf0, 0x52, 0xf9, 0x08, 0xb1, 0x01, 0x24, + 0x03, 0xe0, 0x00, 0x2c, 0x08, 0xbf, 0x00, 0x2d, 0x08, 0xd0, 0xbd, 0xf8, + 0x12, 0x00, 0xad, 0xf8, 0x0e, 0x00, 0x9d, 0xf8, 0xc0, 0x03, 0x00, 0xf1, + 0x01, 0x0b, 0xc9, 0xe7, 0x00, 0x2e, 0xc7, 0xd1, 0xe3, 0x98, 0xb0, 0xf9, + 0x10, 0x10, 0x11, 0xaa, 0x40, 0x46, 0xeb, 0xf7, 0x30, 0xfd, 0xbd, 0xe7, + 0x8d, 0xf8, 0x1e, 0xb0, 0x00, 0x26, 0x00, 0xf0, 0x4c, 0xf9, 0xf0, 0xb2, + 0x04, 0x28, 0xfa, 0xd3, 0x00, 0xf0, 0x3b, 0xf9, 0x06, 0x46, 0x97, 0xf9, + 0x1a, 0x00, 0x08, 0xb9, 0x00, 0xf0, 0x1d, 0xf9, 0xd8, 0xf7, 0x99, 0xfc, + 0x00, 0xf0, 0x24, 0xf9, 0x00, 0x28, 0x3f, 0xf4, 0x6a, 0xaf, 0x01, 0x24, + 0xbd, 0xf8, 0x12, 0x00, 0xad, 0xf8, 0x0e, 0x00, 0xbd, 0xf8, 0x10, 0x00, + 0xb8, 0x81, 0x34, 0xb1, 0xee, 0x99, 0xe4, 0x9b, 0x00, 0x91, 0x0d, 0xa8, + 0x01, 0x90, 0x00, 0xf0, 0x01, 0xf9, 0x78, 0x8e, 0xbd, 0xf8, 0xc8, 0x10, + 0x81, 0x42, 0x38, 0xbf, 0xad, 0xf8, 0xc8, 0x00, 0x10, 0x98, 0x01, 0x28, + 0x0d, 0xd9, 0x00, 0x2d, 0x04, 0xbf, 0xba, 0xf1, 0x06, 0x0f, 0x00, 0x2c, + 0x4b, 0xd1, 0x11, 0xaa, 0x49, 0x46, 0x40, 0x46, 0xeb, 0xf7, 0xd9, 0xfc, + 0x00, 0xf0, 0x01, 0xf9, 0x06, 0xe0, 0xbd, 0xf8, 0x10, 0x10, 0xad, 0xf8, + 0xc0, 0x12, 0x54, 0xea, 0x05, 0x00, 0x3c, 0xd1, 0x0c, 0x99, 0xc8, 0x7a, + 0x00, 0x28, 0x3f, 0xf4, 0x1f, 0xaf, 0xbd, 0xf8, 0x0e, 0x10, 0x00, 0x20, + 0x0f, 0x29, 0x9d, 0xf9, 0x44, 0x10, 0x8d, 0xf8, 0x24, 0x10, 0x28, 0xbf, + 0x01, 0x20, 0x9d, 0xf8, 0x45, 0x10, 0x8d, 0xf8, 0x25, 0x10, 0x01, 0x22, + 0x9d, 0xf8, 0x46, 0x10, 0x8d, 0xf8, 0x26, 0x10, 0x09, 0x23, 0x9d, 0xf8, + 0x47, 0x10, 0x8d, 0xf8, 0x27, 0x10, 0x02, 0x92, 0x00, 0x93, 0x0f, 0x23, + 0x9d, 0xf8, 0x52, 0x10, 0x8d, 0xf8, 0x28, 0x10, 0x06, 0xaa, 0x9d, 0xf8, + 0x53, 0x10, 0x8d, 0xf8, 0x29, 0x10, 0x9d, 0xf8, 0x54, 0x10, 0x8d, 0xf8, + 0x2a, 0x10, 0x9d, 0xf8, 0x55, 0x10, 0x8d, 0xf8, 0x2b, 0x10, 0x9d, 0xf8, + 0x56, 0x10, 0x8d, 0xf8, 0x2c, 0x10, 0x09, 0xa9, 0x01, 0x91, 0x34, 0xa9, + 0xeb, 0xf7, 0x36, 0xfd, 0x01, 0x28, 0x8d, 0xf8, 0x0c, 0x00, 0x7f, 0xf4, + 0xe5, 0xae, 0x78, 0x7f, 0x40, 0x1c, 0x78, 0x77, 0xb8, 0x8d, 0x40, 0x1c, + 0xb8, 0x85, 0xe3, 0x98, 0x42, 0x79, 0x02, 0xf0, 0x01, 0x01, 0x52, 0x08, + 0x02, 0xf0, 0x01, 0x02, 0x04, 0xbb, 0x97, 0xf9, 0x1a, 0x00, 0x01, 0x28, + 0x04, 0xd1, 0x3a, 0xb9, 0x01, 0x20, 0x8d, 0xf8, 0x0c, 0x00, 0x17, 0xe0, + 0x00, 0x28, 0xf9, 0xd1, 0x00, 0x29, 0xf7, 0xd0, 0xe4, 0x99, 0xe3, 0x9b, + 0x00, 0x91, 0x11, 0xa8, 0x01, 0x90, 0x34, 0xaa, 0x49, 0x46, 0x03, 0xa8, + 0x00, 0xf0, 0x45, 0xfd, 0x9d, 0xf8, 0x0c, 0x00, 0x30, 0xb9, 0xee, 0x98, + 0xe4, 0x9b, 0x00, 0x90, 0x0d, 0xa9, 0x01, 0x91, 0x00, 0xf0, 0x74, 0xf8, + 0x9d, 0xf9, 0x44, 0x40, 0x9d, 0xf9, 0x45, 0x60, 0x9d, 0xf9, 0x46, 0xa0, + 0x9d, 0xf9, 0x47, 0xb0, 0x99, 0xf8, 0x04, 0x20, 0x9d, 0xf9, 0x0d, 0x10, + 0x40, 0x46, 0xe5, 0xf7, 0x46, 0xfc, 0x99, 0xf8, 0x03, 0x00, 0x58, 0xb1, + 0x9d, 0xf8, 0xbc, 0x03, 0x01, 0x90, 0x00, 0x21, 0x00, 0x91, 0x00, 0xf0, + 0x65, 0xf8, 0x01, 0x22, 0xc9, 0xb2, 0x40, 0x46, 0xd8, 0xf7, 0x47, 0xfe, + 0x00, 0x2d, 0x3a, 0xd1, 0x0f, 0x98, 0x0f, 0x99, 0x94, 0xfb, 0xf0, 0xf0, + 0x8d, 0xf8, 0x44, 0x00, 0x96, 0xfb, 0xf1, 0xf1, 0x0f, 0x98, 0x8d, 0xf8, + 0x45, 0x10, 0x9a, 0xfb, 0xf0, 0xf0, 0x8d, 0xf8, 0x46, 0x00, 0xab, 0xab, + 0x0f, 0x98, 0x9d, 0xf9, 0x46, 0x10, 0x9b, 0xfb, 0xf0, 0xf0, 0x8d, 0xf8, + 0x47, 0x00, 0xdb, 0x1c, 0x9d, 0xf8, 0x44, 0x00, 0x9d, 0xf9, 0x47, 0x20, + 0x8d, 0xf8, 0xaf, 0x02, 0x99, 0x70, 0xda, 0x70, 0x9d, 0xf9, 0x45, 0x00, + 0x58, 0x70, 0x10, 0x9b, 0x01, 0x2b, 0x14, 0xd9, 0x9d, 0xf8, 0x57, 0x30, + 0x8d, 0xf8, 0x70, 0x30, 0x00, 0x23, 0x11, 0xac, 0xdd, 0xb2, 0x2c, 0x44, + 0x5b, 0x1c, 0x26, 0x7b, 0x84, 0xf8, 0x2d, 0x60, 0xdc, 0xb2, 0x07, 0x2c, + 0xf5, 0xd3, 0x38, 0x72, 0x9d, 0xf8, 0xaf, 0x02, 0x78, 0x72, 0xba, 0x72, + 0xf9, 0x72, 0x11, 0xaa, 0x0c, 0x98, 0xc1, 0x79, 0x40, 0x46, 0xeb, 0xf7, + 0xd4, 0xfd, 0xe4, 0x98, 0x4f, 0xf4, 0x0d, 0x72, 0x56, 0xa9, 0xd8, 0xf7, + 0xa5, 0xff, 0xee, 0x98, 0x8c, 0x22, 0x11, 0xa9, 0xd8, 0xf7, 0xa0, 0xff, + 0x00, 0xf0, 0x1d, 0xf8, 0x0d, 0xf5, 0x65, 0x7d, 0xbd, 0xe8, 0xf0, 0x8f, + 0x94, 0x95, 0x84, 0x85, 0x4a, 0x46, 0x11, 0xa9, 0x40, 0x46, 0x00, 0xf0, + 0x3e, 0xbd, 0x11, 0xaa, 0x49, 0x46, 0x40, 0x46, 0x00, 0xf0, 0x09, 0xbd, + 0x01, 0x23, 0x99, 0xf8, 0x01, 0x10, 0xc1, 0xf1, 0x01, 0x01, 0x70, 0x47, + 0x05, 0x46, 0xee, 0x9a, 0x4b, 0x46, 0x56, 0xa9, 0x11, 0xa8, 0x00, 0xf0, + 0x5c, 0xbd, 0xe4, 0x9a, 0x4b, 0x46, 0x11, 0xa9, 0x40, 0x46, 0x00, 0xf0, + 0x94, 0xbd, 0x0c, 0x98, 0xe3, 0x9a, 0x01, 0x78, 0x01, 0x91, 0x4b, 0x46, + 0xd0, 0x8c, 0x00, 0x90, 0x11, 0xaa, 0x00, 0x21, 0x40, 0x46, 0xeb, 0xf7, + 0xf1, 0xb9, 0xf0, 0xb2, 0x8d, 0xf8, 0x1c, 0x60, 0x76, 0x1c, 0x29, 0x5c, + 0x8d, 0xf8, 0x20, 0x10, 0x07, 0xa8, 0xe5, 0xf7, 0x17, 0xbb, 0x38, 0xb5, + 0x0c, 0x46, 0x15, 0x46, 0x43, 0xb9, 0x21, 0x00, 0x08, 0xd1, 0x29, 0x78, + 0xb9, 0xb1, 0x4b, 0x1e, 0x2b, 0x70, 0x01, 0x22, 0x00, 0x21, 0x0f, 0xe0, + 0x21, 0x00, 0xf6, 0xd1, 0x69, 0x78, 0x21, 0xb1, 0x49, 0x1e, 0x69, 0x70, + 0x01, 0x22, 0x00, 0x21, 0x10, 0xe0, 0x29, 0x78, 0x1f, 0x29, 0x0f, 0xd2, + 0x49, 0x1c, 0x29, 0x70, 0x01, 0x22, 0x01, 0x21, 0xe5, 0xf7, 0x2f, 0xfc, + 0x08, 0xe0, 0x69, 0x78, 0x1f, 0x29, 0x05, 0xd2, 0x49, 0x1c, 0x69, 0x70, + 0x01, 0x22, 0x01, 0x21, 0xe5, 0xf7, 0x32, 0xfc, 0x95, 0xf9, 0x01, 0x10, + 0x95, 0xf9, 0x00, 0x00, 0x08, 0x1a, 0x01, 0x2c, 0x04, 0xbf, 0x40, 0xb2, + 0x40, 0x42, 0x40, 0xb2, 0x32, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, + 0x2d, 0xed, 0x02, 0x8b, 0x82, 0xb0, 0xdf, 0xed, 0x6a, 0x0a, 0xdd, 0xf8, + 0x40, 0x80, 0x0e, 0x9d, 0x11, 0x9e, 0xdd, 0xf8, 0x3c, 0x90, 0x8d, 0xf8, + 0x04, 0x00, 0x00, 0xee, 0x10, 0x8a, 0xb8, 0xee, 0x40, 0x0a, 0x00, 0x24, + 0x80, 0xee, 0x20, 0x8a, 0x00, 0x27, 0x88, 0x46, 0x92, 0x46, 0x9b, 0x46, + 0x27, 0xe0, 0x00, 0x95, 0x5b, 0x46, 0x9d, 0xf8, 0x04, 0x00, 0x52, 0x46, + 0x41, 0x46, 0xe5, 0xf7, 0xf1, 0xfb, 0x51, 0x46, 0x00, 0xee, 0x10, 0x0a, + 0x00, 0xee, 0x90, 0x1a, 0xb8, 0xee, 0x40, 0x0a, 0xf8, 0xee, 0x60, 0x0a, + 0x80, 0xee, 0x20, 0x0a, 0xf6, 0xee, 0x00, 0x0a, 0x78, 0xee, 0x20, 0x0a, + 0x04, 0x19, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x5f, 0xbf, + 0xb6, 0xee, 0x00, 0x1a, 0x31, 0xee, 0x48, 0x1a, 0xb4, 0xee, 0x41, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, 0x30, 0x60, 0x7f, 0x1c, 0xf8, 0xb2, + 0x48, 0x45, 0xd4, 0xd3, 0x02, 0xb0, 0x20, 0x46, 0xf6, 0xe4, 0x00, 0x00, + 0x2d, 0xe9, 0xfe, 0x4f, 0x88, 0xb0, 0x15, 0x9e, 0x33, 0x7a, 0xdd, 0xf8, + 0x58, 0x90, 0x14, 0x9a, 0xcb, 0x18, 0x5b, 0xb2, 0x09, 0xeb, 0x83, 0x0a, + 0xda, 0xf8, 0x28, 0x31, 0x23, 0xf0, 0x00, 0x43, 0x00, 0xee, 0x10, 0x3a, + 0x52, 0xb1, 0x9d, 0xf8, 0x28, 0x20, 0x01, 0x2a, 0x06, 0xd1, 0xdf, 0xed, + 0x3d, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x6c, 0xd5, + 0x06, 0xf1, 0x29, 0x02, 0x07, 0x92, 0x00, 0x27, 0x92, 0xf8, 0x01, 0x80, + 0x74, 0x89, 0x75, 0x7e, 0xf2, 0x79, 0x8d, 0xf8, 0x15, 0x00, 0x66, 0x08, + 0x52, 0x08, 0x06, 0x96, 0x04, 0x96, 0x02, 0xf0, 0x01, 0x02, 0x09, 0xf5, + 0xb6, 0x76, 0x8b, 0x46, 0x18, 0x46, 0x8d, 0xf8, 0x14, 0x20, 0x1e, 0xe0, + 0x47, 0x46, 0x1b, 0xe0, 0x04, 0xa8, 0x07, 0x99, 0x03, 0x90, 0x5b, 0x46, + 0x08, 0x78, 0x02, 0x90, 0x01, 0x95, 0x06, 0x21, 0x9d, 0xf8, 0x14, 0x20, + 0x9d, 0xf8, 0x15, 0x00, 0x00, 0x92, 0x22, 0x46, 0xff, 0xf7, 0x6e, 0xff, + 0x04, 0x99, 0x06, 0x9a, 0x91, 0x42, 0xe9, 0xd0, 0xf1, 0x61, 0x32, 0x68, + 0x31, 0x6a, 0xb2, 0x61, 0x49, 0x1c, 0xfa, 0xb2, 0x31, 0x62, 0x72, 0x62, + 0x7f, 0x1c, 0xf9, 0xb2, 0x41, 0x45, 0xdf, 0xd3, 0x00, 0xee, 0x10, 0x0a, + 0x09, 0x9e, 0xbb, 0xf1, 0x00, 0x0f, 0xf8, 0xee, 0x40, 0x0a, 0x0b, 0xd1, + 0x9d, 0xf8, 0x28, 0x00, 0x01, 0x28, 0x04, 0xd0, 0x24, 0x21, 0x09, 0xf5, + 0x94, 0x70, 0xeb, 0xf7, 0x37, 0xf8, 0x86, 0xed, 0x00, 0x0a, 0x0b, 0xe0, + 0x17, 0x98, 0x96, 0xed, 0x00, 0x0a, 0x40, 0x78, 0xb8, 0xee, 0x40, 0x0a, + 0x70, 0xee, 0xc0, 0x0a, 0x01, 0x28, 0x08, 0xbf, 0xf1, 0xee, 0x60, 0x0a, + 0x00, 0xee, 0x10, 0x4a, 0xb8, 0xee, 0x40, 0x0a, 0x80, 0xee, 0x80, 0x0a, + 0x00, 0xee, 0x90, 0x5a, 0xf8, 0xee, 0x60, 0x0a, 0x80, 0xee, 0x20, 0x0a, + 0xdf, 0xed, 0x07, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0x8a, 0xed, 0x4a, 0x0a, + 0x01, 0xe0, 0x9a, 0xed, 0x4a, 0x0a, 0x0b, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x00, 0x00, 0xc8, 0x42, 0xac, 0xc5, 0x27, 0x37, 0x00, 0x00, 0x80, 0x42, + 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x04, 0x8b, 0x9a, 0xb0, 0x44, 0x68, + 0x81, 0x6b, 0xc0, 0x6b, 0x01, 0xf5, 0x94, 0x76, 0x01, 0xf5, 0x80, 0x71, + 0x00, 0xf5, 0x3e, 0x7a, 0x12, 0x91, 0x00, 0x7d, 0x10, 0x28, 0x05, 0xd2, + 0x01, 0x00, 0x18, 0xbf, 0x01, 0x21, 0x8d, 0xf8, 0x12, 0x10, 0x02, 0xe0, + 0x00, 0x23, 0x8d, 0xf8, 0x12, 0x30, 0x01, 0x22, 0x01, 0x21, 0xe0, 0xb2, + 0xe5, 0xf7, 0xf2, 0xfe, 0x05, 0x46, 0xf0, 0x89, 0xad, 0xf8, 0x2c, 0x00, + 0x0b, 0xa8, 0xb1, 0x89, 0xad, 0xf8, 0x2e, 0x10, 0x8d, 0xf8, 0x30, 0x40, + 0xe5, 0xf7, 0xca, 0xf9, 0xe0, 0xb2, 0xd8, 0xf7, 0xd1, 0xfa, 0x17, 0xa8, + 0xd8, 0xf7, 0xac, 0xfa, 0x01, 0x20, 0x12, 0x99, 0x11, 0x90, 0x08, 0x68, + 0x42, 0x03, 0x0b, 0xd5, 0x00, 0x20, 0x11, 0x90, 0x96, 0xf8, 0x2c, 0x00, + 0xc0, 0xf1, 0x01, 0x00, 0x86, 0xf8, 0x2c, 0x00, 0x06, 0xf1, 0x2b, 0x00, + 0xd8, 0xf7, 0x8f, 0xfc, 0x0a, 0x22, 0x06, 0xf1, 0x2b, 0x01, 0x06, 0xa8, + 0xd8, 0xf7, 0xf6, 0xfd, 0xb0, 0x7c, 0x10, 0xf0, 0x0f, 0x00, 0x18, 0xbf, + 0x01, 0x20, 0x8d, 0xf8, 0x18, 0x00, 0x0a, 0xf5, 0xa6, 0x71, 0x9d, 0xf8, + 0x19, 0x00, 0x00, 0x28, 0x0c, 0xbf, 0x0a, 0x20, 0x05, 0x20, 0x8d, 0xf8, + 0x1a, 0x00, 0x4f, 0xf0, 0x01, 0x08, 0x9d, 0xf8, 0x19, 0x00, 0x88, 0x71, + 0x00, 0xf0, 0xc5, 0xfa, 0x0a, 0xf5, 0xa6, 0x71, 0xf7, 0xee, 0x00, 0x8a, + 0x48, 0x70, 0x00, 0x21, 0x00, 0xf0, 0xc3, 0xfa, 0x8d, 0xf8, 0x29, 0x00, + 0x00, 0xf0, 0xbe, 0xfa, 0x8d, 0xf8, 0x28, 0x00, 0x00, 0x20, 0xc0, 0x46, + 0xc0, 0x46, 0x00, 0xf0, 0xcd, 0xfa, 0x00, 0x21, 0x00, 0x91, 0x40, 0xea, + 0x05, 0x07, 0x9d, 0xf8, 0x19, 0x10, 0xcd, 0xf8, 0x04, 0x80, 0xc1, 0xf1, + 0x01, 0x01, 0x01, 0x23, 0x00, 0x22, 0xc9, 0xb2, 0xe0, 0xb2, 0xd8, 0xf7, + 0x24, 0xfc, 0x00, 0xf0, 0xbb, 0xfa, 0x0a, 0xf5, 0xd0, 0x72, 0x00, 0x92, + 0x05, 0x46, 0xcd, 0xf8, 0x08, 0x80, 0xcd, 0xf8, 0x04, 0x80, 0x00, 0xf0, + 0x87, 0xfa, 0x00, 0xf0, 0xaf, 0xfa, 0x3d, 0x43, 0x40, 0xea, 0x05, 0x09, + 0xd8, 0x21, 0x0a, 0xf1, 0x50, 0x00, 0xea, 0xf7, 0x6f, 0xff, 0x00, 0x20, + 0x8a, 0xf8, 0x4c, 0x01, 0x96, 0xf8, 0x20, 0x00, 0x01, 0x06, 0x0b, 0xd5, + 0xe5, 0xf7, 0xc3, 0xfb, 0x00, 0xf0, 0xa7, 0xfa, 0xdf, 0xed, 0x0a, 0x0a, + 0x80, 0xee, 0x80, 0x0a, 0x9f, 0xed, 0x09, 0x1a, 0x60, 0xee, 0x01, 0x8a, + 0x96, 0xf8, 0x20, 0x00, 0x20, 0xf0, 0x80, 0x00, 0x00, 0xf0, 0x99, 0xfa, + 0xf2, 0xee, 0x04, 0x0a, 0x00, 0x21, 0x80, 0xee, 0x20, 0x9a, 0x8d, 0xf8, + 0x13, 0x10, 0x2b, 0xe0, 0x28, 0x6b, 0x6e, 0x4e, 0x00, 0x00, 0x00, 0x3d, + 0x9d, 0xf9, 0x10, 0x00, 0x9a, 0xf9, 0x0c, 0x10, 0x88, 0x42, 0xc8, 0xbf, + 0x08, 0x46, 0x8a, 0xf8, 0x0c, 0x00, 0x9a, 0xf9, 0x0d, 0x10, 0x9d, 0xf9, + 0x11, 0x00, 0x88, 0x42, 0xc8, 0xbf, 0x08, 0x46, 0x8a, 0xf8, 0x0d, 0x00, + 0x0f, 0xe0, 0x9a, 0xf8, 0x4c, 0x01, 0x40, 0x1c, 0x8a, 0xf8, 0x4c, 0x01, + 0xc0, 0xb2, 0x01, 0x28, 0xe4, 0xd1, 0x9d, 0xf8, 0x10, 0x00, 0x8a, 0xf8, + 0x0c, 0x00, 0x9d, 0xf8, 0x11, 0x10, 0x8a, 0xf8, 0x0d, 0x10, 0x9d, 0xf8, + 0x13, 0x00, 0x40, 0x1c, 0x8d, 0xf8, 0x13, 0x00, 0x9d, 0xf8, 0x13, 0x00, + 0x31, 0x7e, 0x88, 0x42, 0x08, 0xf1, 0x01, 0x05, 0x80, 0xf0, 0x17, 0x81, + 0x00, 0x22, 0xad, 0xf8, 0x10, 0x20, 0x9a, 0xf9, 0x01, 0x00, 0x9a, 0xf9, + 0x00, 0x70, 0x9d, 0xf8, 0x12, 0x30, 0x00, 0x92, 0xc7, 0x1b, 0x9d, 0xf8, + 0x19, 0x00, 0xcd, 0xf8, 0x08, 0xa0, 0x06, 0xa9, 0x01, 0x28, 0x03, 0x91, + 0x04, 0xbf, 0x7f, 0xb2, 0x7f, 0x42, 0x01, 0x96, 0x09, 0xaa, 0x79, 0xb2, + 0xe0, 0xb2, 0xff, 0xf7, 0x5f, 0xfe, 0x00, 0xf0, 0x35, 0xfa, 0x83, 0x46, + 0x00, 0xf0, 0x04, 0xfa, 0x06, 0x20, 0x01, 0x21, 0xa8, 0x46, 0x02, 0x90, + 0x01, 0x91, 0x0a, 0xf5, 0xd0, 0x75, 0x00, 0x95, 0x00, 0xf0, 0xfe, 0xf9, + 0x00, 0xf0, 0x26, 0xfa, 0x00, 0xf0, 0xf1, 0xf9, 0xd8, 0xf7, 0x1b, 0xf9, + 0x38, 0xb9, 0x7f, 0xb2, 0x01, 0x97, 0x00, 0x95, 0x00, 0xf0, 0x21, 0xfa, + 0xe0, 0xb2, 0xff, 0xf7, 0x49, 0xfb, 0x0f, 0xf2, 0xb4, 0x60, 0x0f, 0xf2, + 0xb4, 0x61, 0x00, 0x88, 0x09, 0x88, 0xad, 0xf8, 0x14, 0x00, 0x0d, 0xf1, + 0x11, 0x02, 0x04, 0xab, 0xad, 0xf8, 0x16, 0x10, 0x0d, 0x92, 0x0e, 0x93, + 0x00, 0x20, 0x0d, 0xab, 0x53, 0xf8, 0x20, 0x50, 0x0f, 0x95, 0x10, 0x90, + 0x25, 0x46, 0x01, 0x24, 0x37, 0xe0, 0x7f, 0xb2, 0x01, 0x97, 0x0a, 0xf5, + 0xd0, 0x70, 0x00, 0x90, 0x00, 0xf0, 0xff, 0xf9, 0xe8, 0xb2, 0xff, 0xf7, + 0x27, 0xfb, 0x27, 0xe0, 0x60, 0xb2, 0x01, 0x28, 0x0f, 0xdd, 0xb5, 0xee, + 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x78, 0xb2, 0x01, 0xdd, 0x00, 0x28, + 0x06, 0xd4, 0xb5, 0xee, 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x02, 0xd5, + 0x00, 0x28, 0x00, 0xdd, 0x89, 0x46, 0x00, 0xf0, 0xb3, 0xf9, 0x06, 0x20, + 0x01, 0x21, 0x00, 0xf0, 0xb9, 0xf9, 0xe8, 0xb2, 0xff, 0xf7, 0x24, 0xfb, + 0x00, 0xf0, 0xd3, 0xf9, 0x40, 0xea, 0x09, 0x09, 0xd8, 0xf7, 0xcd, 0xf8, + 0x00, 0x28, 0x08, 0xf1, 0x01, 0x08, 0xce, 0xd0, 0x34, 0x7a, 0x64, 0x1c, + 0x0f, 0x98, 0x01, 0x78, 0x49, 0x1c, 0x01, 0x70, 0x64, 0x1c, 0x10, 0x98, + 0x0d, 0xf1, 0x16, 0x01, 0x0a, 0x5c, 0x8d, 0xf8, 0x0c, 0x20, 0x61, 0xb2, + 0x96, 0xf9, 0x08, 0x00, 0x88, 0x42, 0x47, 0xdb, 0x13, 0x46, 0x9d, 0xf8, + 0x19, 0x10, 0x52, 0x46, 0xe8, 0xb2, 0xff, 0xf7, 0x60, 0xfd, 0x9a, 0xf9, + 0x01, 0x00, 0x9a, 0xf9, 0x00, 0x70, 0xc7, 0x1b, 0x9d, 0xf8, 0x19, 0x00, + 0x01, 0x28, 0x04, 0xbf, 0x7f, 0xb2, 0x7f, 0x42, 0x00, 0xf0, 0xa5, 0xf9, + 0x83, 0x46, 0x06, 0xa8, 0x00, 0x21, 0x03, 0x90, 0x00, 0x91, 0xcd, 0xf8, + 0x08, 0xa0, 0x01, 0x96, 0x09, 0xaa, 0x9d, 0xf8, 0x12, 0x30, 0x79, 0xb2, + 0xe8, 0xb2, 0xff, 0xf7, 0xc3, 0xfd, 0xb0, 0xee, 0x40, 0x8a, 0x00, 0xf0, + 0x92, 0xf9, 0x00, 0xf0, 0x62, 0xf9, 0x96, 0xf8, 0x20, 0x00, 0x00, 0x28, + 0x49, 0xf4, 0x00, 0x61, 0x98, 0xd0, 0x10, 0x9b, 0x96, 0xf9, 0x08, 0x00, + 0x05, 0xaa, 0x28, 0xee, 0x28, 0x0a, 0x12, 0xf9, 0x03, 0xc0, 0x00, 0xee, + 0x90, 0xca, 0xf8, 0xee, 0xe0, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xb4, 0xee, + 0x49, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xa8, 0xbf, 0x44, 0x1c, 0x96, 0xda, + 0x62, 0xb2, 0x82, 0x42, 0x93, 0xd1, 0x91, 0xe7, 0x0f, 0x98, 0x90, 0xf9, + 0x00, 0x70, 0x2c, 0x46, 0x10, 0x9d, 0x1f, 0xe0, 0x9d, 0xf8, 0x0c, 0x30, + 0x9d, 0xf8, 0x19, 0x10, 0xc3, 0xf1, 0x01, 0x03, 0xdb, 0xb2, 0x52, 0x46, + 0xe0, 0xb2, 0xff, 0xf7, 0x0e, 0xfd, 0x00, 0xf0, 0x63, 0xf9, 0x40, 0xea, + 0x09, 0x09, 0x00, 0xf0, 0x31, 0xf9, 0xd8, 0xf7, 0x56, 0xf8, 0x71, 0x7a, + 0xca, 0x07, 0x08, 0xf1, 0x01, 0x08, 0x06, 0xd5, 0x28, 0xb9, 0x00, 0xf0, + 0x43, 0xf9, 0x00, 0xf0, 0x53, 0xf9, 0x40, 0xea, 0x09, 0x09, 0x7f, 0x1e, + 0x78, 0xb2, 0x00, 0x28, 0xdc, 0xdc, 0x68, 0x1c, 0x02, 0x28, 0xff, 0xf4, + 0x40, 0xaf, 0x9d, 0xf9, 0x10, 0x00, 0x40, 0x42, 0x8d, 0xf8, 0x10, 0x00, + 0xd8, 0xf7, 0x3b, 0xf8, 0x00, 0x28, 0x3f, 0xf4, 0xd0, 0xae, 0x30, 0x7e, + 0x8d, 0xf8, 0x13, 0x00, 0xdb, 0xe6, 0xd8, 0xf7, 0x32, 0xf8, 0x00, 0x28, + 0x03, 0x90, 0x55, 0xd1, 0x0a, 0xf5, 0xd0, 0x71, 0x00, 0x91, 0x53, 0x46, + 0x06, 0xaa, 0x31, 0x46, 0xe0, 0xb2, 0xff, 0xf7, 0x73, 0xf8, 0x12, 0x99, + 0x00, 0x20, 0x00, 0xf0, 0x05, 0xf9, 0xe0, 0xb2, 0x0a, 0xf5, 0xa6, 0x77, + 0xfe, 0xf7, 0xc6, 0xfc, 0xb8, 0x70, 0x00, 0xf0, 0x21, 0xf9, 0x83, 0x46, + 0x9d, 0xf8, 0x19, 0x20, 0x97, 0xf9, 0x02, 0x10, 0xe0, 0xb2, 0xe5, 0xf7, + 0x70, 0xf8, 0x00, 0xf0, 0x17, 0xf9, 0x00, 0xf0, 0xe2, 0xf8, 0x11, 0x98, + 0x68, 0xb1, 0x9d, 0xf8, 0x19, 0x20, 0x97, 0xf9, 0x02, 0x10, 0xc2, 0xf1, + 0x01, 0x02, 0xd2, 0xb2, 0xe0, 0xb2, 0xe5, 0xf7, 0x60, 0xf8, 0x00, 0xf0, + 0x07, 0xf9, 0x40, 0xea, 0x09, 0x09, 0x9d, 0xf8, 0x19, 0x10, 0xc1, 0xf1, + 0x01, 0x01, 0xc9, 0xb2, 0x00, 0xf0, 0xe9, 0xf8, 0xf8, 0x70, 0x00, 0xf0, + 0xe0, 0xf8, 0xb8, 0x70, 0x11, 0x98, 0x20, 0xb1, 0x01, 0x21, 0x8d, 0xf8, + 0x1e, 0x10, 0x8d, 0xf8, 0x1f, 0x10, 0x00, 0xf0, 0xc3, 0xf8, 0x00, 0xf0, + 0xdd, 0xf8, 0x00, 0xf0, 0xed, 0xf8, 0x40, 0xea, 0x09, 0x09, 0xe8, 0xb2, + 0xc0, 0x46, 0xc0, 0x46, 0xe0, 0xb2, 0xd8, 0xf7, 0xaf, 0xf8, 0x38, 0x61, + 0xe0, 0xb2, 0xd8, 0xf7, 0xb1, 0xf8, 0x78, 0x61, 0x0a, 0xf2, 0xe5, 0x15, + 0x0a, 0xf5, 0x09, 0x78, 0x95, 0xf9, 0x01, 0x00, 0x00, 0x28, 0x5a, 0xd1, + 0x00, 0x21, 0x88, 0xf8, 0x0c, 0x10, 0x14, 0x21, 0xb0, 0x79, 0x40, 0x1c, + 0x10, 0xfb, 0x01, 0xf1, 0xad, 0xf8, 0x00, 0x10, 0x95, 0xf9, 0x04, 0x00, + 0x28, 0xb9, 0x95, 0xf9, 0x05, 0x00, 0x47, 0x1e, 0xbf, 0x41, 0xff, 0x0f, + 0x00, 0xe0, 0x00, 0x27, 0x06, 0xf1, 0x2c, 0x00, 0x0a, 0xf5, 0xa6, 0x71, + 0x00, 0x7a, 0x4a, 0x69, 0x40, 0x09, 0x00, 0xf0, 0x01, 0x0b, 0x70, 0x8c, + 0x90, 0x42, 0x80, 0x41, 0xc0, 0x0f, 0x01, 0x90, 0x00, 0x26, 0xe5, 0xf7, + 0x69, 0xfa, 0x00, 0xb1, 0x01, 0x26, 0xbd, 0xf8, 0x00, 0x00, 0xb8, 0xf8, + 0x00, 0x10, 0x01, 0x9a, 0x88, 0x42, 0x89, 0x41, 0x32, 0x43, 0xc9, 0x0f, + 0x47, 0xea, 0x02, 0x03, 0x0b, 0x43, 0x1b, 0xea, 0x03, 0x0f, 0x24, 0xd0, + 0x0f, 0xb1, 0x49, 0xf0, 0x10, 0x09, 0x0a, 0x43, 0xd2, 0xb2, 0xf2, 0xb1, + 0x01, 0x98, 0x18, 0xb1, 0x2a, 0x78, 0x42, 0xf0, 0x10, 0x02, 0x2a, 0x70, + 0x1e, 0xb1, 0x28, 0x78, 0x40, 0xf0, 0x20, 0x00, 0x28, 0x70, 0x19, 0xb1, + 0x28, 0x78, 0x40, 0xf0, 0x80, 0x00, 0x28, 0x70, 0x0e, 0x43, 0x0a, 0xd0, + 0x01, 0x20, 0x88, 0xf8, 0x0c, 0x00, 0x00, 0x22, 0x03, 0x21, 0xe0, 0xb2, + 0xe5, 0xf7, 0x52, 0xfc, 0x00, 0x20, 0x88, 0xf8, 0x0c, 0x00, 0x49, 0xf4, + 0x80, 0x69, 0x00, 0x21, 0x00, 0x91, 0x01, 0x20, 0x9d, 0xf8, 0x19, 0x10, + 0x01, 0x90, 0xc1, 0xf1, 0x01, 0x01, 0x01, 0x23, 0x01, 0x22, 0xc9, 0xb2, + 0xe0, 0xb2, 0xd8, 0xf7, 0xd6, 0xf9, 0x68, 0x46, 0xd8, 0xf7, 0x14, 0xf8, + 0x01, 0x98, 0x13, 0x90, 0x0a, 0xf5, 0xa6, 0x75, 0x13, 0xa8, 0xd7, 0xf7, + 0xe9, 0xff, 0x29, 0x6a, 0x16, 0x98, 0xa8, 0x61, 0x49, 0x1c, 0x29, 0x62, + 0x03, 0x98, 0xe9, 0x8b, 0x41, 0x18, 0xe9, 0x83, 0x17, 0x98, 0x00, 0x99, + 0x09, 0x1a, 0xc8, 0xf8, 0x08, 0x10, 0xe0, 0xb2, 0x00, 0x21, 0xe4, 0xf7, + 0xc4, 0xff, 0x28, 0x71, 0x00, 0xf0, 0x3a, 0xf8, 0x68, 0x71, 0x29, 0x79, + 0x9d, 0xf8, 0x29, 0x20, 0x8a, 0x1a, 0xea, 0x71, 0x52, 0xb2, 0x9d, 0xf8, + 0x28, 0x10, 0x40, 0x1a, 0x28, 0x72, 0x52, 0x1c, 0x02, 0x2a, 0x84, 0xbf, + 0x01, 0x20, 0x68, 0x72, 0x95, 0xf9, 0x08, 0x00, 0x40, 0x1c, 0x02, 0x28, + 0x84, 0xbf, 0x01, 0x20, 0xa8, 0x72, 0x1a, 0xb0, 0x48, 0x46, 0xbd, 0xec, + 0x04, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, 0x40, 0xea, 0x0b, 0x00, 0x40, 0xea, + 0x09, 0x09, 0x70, 0x47, 0x5f, 0xfa, 0x88, 0xf0, 0xe4, 0xf7, 0x31, 0xbf, + 0x53, 0x46, 0x06, 0xaa, 0x31, 0x46, 0xe0, 0xb2, 0xff, 0xf7, 0x6e, 0xb9, + 0x0a, 0xf5, 0xd0, 0x72, 0x02, 0x90, 0x01, 0x91, 0x00, 0x92, 0x53, 0x46, + 0x06, 0xaa, 0x31, 0x46, 0x70, 0x47, 0xe0, 0xb2, 0x9d, 0xf8, 0x19, 0x10, + 0xe4, 0xf7, 0x87, 0xbf, 0x01, 0x21, 0xe0, 0xb2, 0xe4, 0xf7, 0x83, 0xbf, + 0x06, 0x20, 0x01, 0x21, 0x0a, 0xf5, 0xd0, 0x72, 0x02, 0x90, 0x01, 0x91, + 0x00, 0x92, 0x53, 0x46, 0x06, 0xaa, 0x31, 0x46, 0xe0, 0xb2, 0xff, 0xf7, + 0x4f, 0xb9, 0x00, 0x22, 0x01, 0x21, 0xe8, 0xb2, 0xe5, 0xf7, 0xd0, 0xbb, + 0x00, 0x22, 0x01, 0x21, 0xe0, 0xb2, 0xe5, 0xf7, 0xcb, 0xbb, 0xb0, 0xee, + 0x48, 0x0a, 0x53, 0x46, 0x06, 0xaa, 0x31, 0x46, 0x70, 0x47, 0x00, 0xee, + 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x70, 0x47, 0x70, 0xb5, 0x40, 0x79, + 0x1d, 0x46, 0xc0, 0xf3, 0x81, 0x03, 0x03, 0xeb, 0x83, 0x03, 0x2c, 0x78, + 0x1e, 0x00, 0x20, 0xd0, 0x01, 0x2c, 0x1e, 0xd1, 0x01, 0xf5, 0xd0, 0x76, + 0x96, 0xf9, 0x02, 0x00, 0x00, 0x28, 0x04, 0xbf, 0x31, 0x56, 0x00, 0x29, + 0x15, 0xd0, 0x92, 0xf9, 0x02, 0x10, 0x01, 0xf1, 0x3e, 0x04, 0x7d, 0x2c, + 0x38, 0xbf, 0x1a, 0x46, 0x08, 0xd3, 0x92, 0xf9, 0x00, 0x10, 0x01, 0xf1, + 0x3e, 0x00, 0x7d, 0x28, 0x06, 0xd2, 0x96, 0xf9, 0x00, 0x00, 0x1a, 0x46, + 0x00, 0xf0, 0x36, 0xf8, 0x04, 0x46, 0x00, 0xe0, 0x00, 0x24, 0x2c, 0x70, + 0x70, 0xbd, 0xfe, 0xb5, 0x04, 0x46, 0x16, 0x46, 0x22, 0x78, 0x8d, 0xf8, + 0x04, 0x20, 0x1d, 0x46, 0x22, 0xbb, 0x09, 0x9f, 0x08, 0x46, 0x00, 0xf0, + 0x95, 0xf8, 0x03, 0x46, 0x00, 0x97, 0x0f, 0x22, 0x09, 0x21, 0x30, 0x46, + 0xeb, 0xf7, 0x02, 0xf8, 0x01, 0x28, 0x8d, 0xf8, 0x04, 0x00, 0x05, 0xd1, + 0x08, 0x99, 0x01, 0xab, 0x3a, 0x46, 0x28, 0x46, 0xff, 0xf7, 0xb6, 0xff, + 0x9d, 0xf8, 0x04, 0x10, 0x01, 0x29, 0x07, 0xf1, 0x4a, 0x00, 0x06, 0xd1, + 0x01, 0x8a, 0x02, 0x78, 0x49, 0x1c, 0x52, 0x1c, 0x01, 0x82, 0x02, 0x70, + 0x02, 0xe0, 0x41, 0x8a, 0x49, 0x1c, 0x41, 0x82, 0x9d, 0xf8, 0x04, 0x00, + 0x20, 0x70, 0xf7, 0xbd, 0x30, 0xb5, 0x03, 0x46, 0x00, 0x20, 0x02, 0xf1, + 0x64, 0x04, 0xc2, 0xf1, 0x64, 0x02, 0x5c, 0x43, 0x5a, 0x43, 0x64, 0x25, + 0x00, 0x2b, 0x24, 0xb2, 0x12, 0xb2, 0x11, 0xfb, 0x05, 0xf1, 0x04, 0xd5, + 0xa1, 0x42, 0x07, 0xdb, 0x8a, 0x42, 0x04, 0xda, 0x30, 0xbd, 0x91, 0x42, + 0xa8, 0xbf, 0x8c, 0x42, 0x00, 0xdb, 0x01, 0x20, 0x30, 0xbd, 0x38, 0xb5, + 0x14, 0x46, 0x4d, 0x7a, 0xe5, 0xf7, 0xd2, 0xf8, 0x6d, 0x09, 0x01, 0x28, + 0x1c, 0xbf, 0x94, 0xf9, 0x47, 0x10, 0x01, 0x29, 0x05, 0xf0, 0x01, 0x05, + 0x13, 0xd1, 0x94, 0xf9, 0x00, 0x00, 0x00, 0x28, 0x04, 0xbf, 0x94, 0xf9, + 0x01, 0x00, 0x00, 0x28, 0x07, 0xd1, 0x94, 0xf9, 0x02, 0x00, 0x00, 0x28, + 0x04, 0xbf, 0x94, 0xf9, 0x03, 0x00, 0x00, 0x28, 0x03, 0xd0, 0x15, 0xb1, + 0x01, 0x20, 0x84, 0xf8, 0x87, 0x00, 0x31, 0xbd, 0x10, 0xb5, 0x0c, 0x46, + 0x01, 0x23, 0x84, 0xf8, 0x30, 0x32, 0x00, 0x22, 0x03, 0x21, 0xe5, 0xf7, + 0x1b, 0xfb, 0x00, 0x22, 0x84, 0xf8, 0x30, 0x22, 0x10, 0xbd, 0x2d, 0xe9, + 0xf8, 0x43, 0x0c, 0x46, 0x15, 0x46, 0x81, 0x46, 0x09, 0x9f, 0x94, 0xf9, + 0x86, 0x60, 0xa8, 0x79, 0x98, 0x46, 0x28, 0xb1, 0x01, 0x23, 0x3a, 0x46, + 0x00, 0x21, 0x48, 0x46, 0xeb, 0xf7, 0x7c, 0xf8, 0xe8, 0x79, 0x28, 0xb1, + 0x01, 0x23, 0x3a, 0x46, 0x01, 0x21, 0x48, 0x46, 0xeb, 0xf7, 0x74, 0xf8, + 0x08, 0x99, 0x20, 0x46, 0xeb, 0xf7, 0xe8, 0xf8, 0x76, 0x1c, 0x84, 0xf8, + 0x86, 0x60, 0x01, 0x20, 0x88, 0xf8, 0x31, 0x02, 0xbd, 0xe8, 0xf1, 0x83, + 0x41, 0x7a, 0x02, 0x20, 0x00, 0x22, 0x01, 0xe0, 0x40, 0x00, 0x52, 0x1c, + 0xb2, 0xeb, 0x91, 0x1f, 0xfa, 0xdb, 0x40, 0xb2, 0x70, 0x47, 0x70, 0xb5, + 0x0c, 0x46, 0x00, 0x21, 0x00, 0xf1, 0x46, 0x06, 0x75, 0x56, 0x95, 0xb9, + 0xd4, 0xf8, 0x6c, 0x41, 0x7c, 0xb1, 0x5b, 0x7a, 0x9c, 0x06, 0x0c, 0xd5, + 0x96, 0xf9, 0x41, 0x50, 0x01, 0x2d, 0x08, 0xbf, 0x01, 0x21, 0x06, 0xd0, + 0x2a, 0xb1, 0xdb, 0x06, 0x03, 0xd5, 0x11, 0x46, 0x00, 0xf0, 0x03, 0xf8, + 0x01, 0x46, 0x08, 0x46, 0x70, 0xbd, 0xf8, 0xb5, 0x05, 0x46, 0x0e, 0x46, + 0x00, 0x24, 0x01, 0x27, 0x05, 0xf1, 0x0c, 0x01, 0x06, 0xf1, 0x0c, 0x02, + 0xc8, 0x5d, 0xd3, 0x5d, 0xc0, 0x1a, 0x40, 0xb2, 0xd7, 0xf7, 0x40, 0xfd, + 0x04, 0x28, 0x0e, 0xd8, 0xf8, 0x1e, 0x04, 0x28, 0x06, 0xd2, 0x05, 0xf1, + 0x0c, 0x01, 0xc8, 0x57, 0xd7, 0xf7, 0x36, 0xfd, 0x07, 0x28, 0x04, 0xd2, + 0x7f, 0x1c, 0x07, 0x2f, 0xe6, 0xdb, 0x20, 0x46, 0xf2, 0xbd, 0x01, 0x24, + 0xfb, 0xe7, 0xf8, 0xb5, 0x0d, 0x46, 0x04, 0x46, 0x95, 0xf9, 0x46, 0x00, + 0x16, 0x46, 0x1f, 0x46, 0x88, 0xb9, 0xe5, 0xf7, 0x85, 0xf8, 0x79, 0x7a, + 0x8a, 0x06, 0x0c, 0xd5, 0x58, 0xb1, 0x95, 0xf9, 0x88, 0x00, 0x40, 0xb9, + 0x31, 0x46, 0x20, 0x46, 0xff, 0xf7, 0x70, 0xff, 0x95, 0xf8, 0x88, 0x00, + 0x40, 0x1c, 0x85, 0xf8, 0x88, 0x00, 0xf1, 0xbd, 0x01, 0xff, 0x00, 0x00, + 0x00, 0x01, 0xfe, 0xb5, 0x0d, 0x46, 0x16, 0x46, 0x05, 0xf1, 0x08, 0x07, + 0x00, 0x22, 0x3a, 0x70, 0x04, 0x46, 0x00, 0x21, 0xe4, 0xf7, 0x20, 0xff, + 0x01, 0x90, 0x01, 0x22, 0x00, 0x20, 0x02, 0x92, 0x00, 0xf0, 0x20, 0xf8, + 0x39, 0x78, 0x20, 0x46, 0xe4, 0xf7, 0x32, 0xff, 0x01, 0x21, 0x02, 0x91, + 0x01, 0x90, 0x00, 0x91, 0x00, 0xf0, 0x17, 0xf8, 0x39, 0x78, 0x20, 0x46, + 0xe4, 0xf7, 0x44, 0xff, 0x01, 0x90, 0x01, 0x21, 0x02, 0x20, 0x02, 0x91, + 0x00, 0xf0, 0x0c, 0xf8, 0xfb, 0x7e, 0x39, 0x78, 0xdb, 0x08, 0x03, 0xf0, + 0x01, 0x03, 0x06, 0xf5, 0xd0, 0x72, 0x20, 0x46, 0xeb, 0xf7, 0x6a, 0xf8, + 0x00, 0x20, 0xfe, 0xbd, 0x00, 0x90, 0x33, 0x46, 0x00, 0x22, 0x29, 0x46, + 0x20, 0x46, 0xe7, 0xf7, 0xcd, 0xbf, 0x00, 0x00, 0x38, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0xe4, 0xf7, 0x35, 0xff, 0x29, 0x46, 0x20, 0x46, 0xbd, 0xe8, + 0x34, 0x40, 0xe4, 0xf7, 0x2d, 0xbf, 0x2d, 0xe9, 0xf8, 0x43, 0x81, 0x46, + 0x0d, 0x46, 0x08, 0x9e, 0x00, 0x20, 0x28, 0x70, 0x90, 0x46, 0x1c, 0x46, + 0x22, 0x46, 0x31, 0x46, 0x48, 0x46, 0xd7, 0xf7, 0x67, 0xfe, 0x00, 0x27, + 0x20, 0x00, 0x04, 0xd0, 0x01, 0x21, 0x48, 0x46, 0xe4, 0xf7, 0xce, 0xfe, + 0x03, 0xe0, 0x01, 0x21, 0x48, 0x46, 0xe4, 0xf7, 0xcb, 0xfe, 0x48, 0x46, + 0xe4, 0xf7, 0x5f, 0xff, 0x48, 0x46, 0xe4, 0xf7, 0x11, 0xff, 0x40, 0x46, + 0xd7, 0xf7, 0x46, 0xfd, 0x48, 0x46, 0xe4, 0xf7, 0x0d, 0xff, 0x50, 0xb9, + 0x31, 0x46, 0x48, 0x46, 0xd7, 0xf7, 0x57, 0xfe, 0x7f, 0x1c, 0x78, 0xb2, + 0x7f, 0x28, 0x2f, 0x70, 0xde, 0xd1, 0xbd, 0xe8, 0xf1, 0x83, 0x24, 0xb1, + 0x00, 0x21, 0x48, 0x46, 0xe4, 0xf7, 0xac, 0xfe, 0x03, 0xe0, 0x00, 0x21, + 0x48, 0x46, 0xe4, 0xf7, 0xa9, 0xfe, 0x48, 0x46, 0xbd, 0xe8, 0xf2, 0x43, + 0xe4, 0xf7, 0x3b, 0xbf, 0x80, 0xb5, 0x00, 0x93, 0x01, 0x23, 0x02, 0xe0, + 0x80, 0xb5, 0x00, 0x93, 0x00, 0x23, 0xff, 0xf7, 0xb6, 0xff, 0x01, 0xbd, + 0x2d, 0xe9, 0xf0, 0x4f, 0x85, 0xb0, 0x0f, 0x9c, 0x9d, 0xf9, 0x40, 0x60, + 0x80, 0x46, 0x89, 0x46, 0x17, 0x46, 0x1d, 0x46, 0xe4, 0xf7, 0x36, 0xfe, + 0x01, 0x2c, 0x4f, 0xf0, 0x00, 0x0a, 0x43, 0xf6, 0xff, 0x7b, 0x07, 0xd1, + 0x00, 0x96, 0x01, 0x23, 0x5a, 0x46, 0x06, 0x21, 0x40, 0x46, 0xd7, 0xf7, + 0xbb, 0xfc, 0x82, 0x46, 0x00, 0x20, 0x28, 0x70, 0x11, 0x9b, 0x0e, 0x9a, + 0x29, 0x46, 0x40, 0x46, 0xff, 0xf7, 0xd4, 0xff, 0x01, 0x2c, 0x09, 0xd1, + 0x04, 0x96, 0x00, 0x20, 0x03, 0x90, 0x02, 0x95, 0x01, 0x21, 0x06, 0x22, + 0x01, 0x91, 0x00, 0x92, 0x00, 0xf0, 0x1c, 0xf8, 0x40, 0x46, 0xe4, 0xf7, + 0x11, 0xfe, 0x00, 0x20, 0x38, 0x70, 0x11, 0x9b, 0x0e, 0x9a, 0x39, 0x46, + 0x40, 0x46, 0xff, 0xf7, 0xc1, 0xff, 0x01, 0x2c, 0x08, 0xd1, 0x04, 0x96, + 0x00, 0x20, 0x06, 0x22, 0x03, 0x90, 0x01, 0x90, 0x00, 0x92, 0x02, 0x97, + 0x00, 0xf0, 0x06, 0xf8, 0x40, 0x46, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, + 0xe4, 0xf7, 0xf8, 0xbd, 0x5b, 0x46, 0x52, 0x46, 0x49, 0x46, 0x40, 0x46, + 0xd7, 0xf7, 0xe4, 0xbc, 0x2d, 0xe9, 0xf8, 0x4f, 0x84, 0xb0, 0x0e, 0x46, + 0x0e, 0x9f, 0x0f, 0x9c, 0x02, 0x2e, 0x80, 0x46, 0x93, 0x46, 0x9a, 0x46, + 0x05, 0xd1, 0x01, 0x2c, 0x14, 0xbf, 0x39, 0x7a, 0xaa, 0x21, 0xe4, 0xf7, + 0x35, 0xfe, 0x16, 0x49, 0x13, 0x9d, 0xdd, 0xf8, 0x48, 0x90, 0x40, 0x46, + 0x51, 0xf8, 0x20, 0x20, 0x52, 0x1c, 0x41, 0xf8, 0x20, 0x20, 0xe4, 0xf7, + 0xd4, 0xfe, 0x68, 0x72, 0x59, 0x46, 0x40, 0x46, 0xff, 0xf7, 0x38, 0xff, + 0x03, 0x95, 0x04, 0x20, 0x9d, 0xf8, 0x40, 0x10, 0x02, 0x90, 0x01, 0x91, + 0xcd, 0xf8, 0x00, 0xa0, 0x4b, 0x46, 0x11, 0x9a, 0x31, 0x46, 0x40, 0x46, + 0xff, 0xf7, 0x80, 0xff, 0x02, 0x2e, 0x04, 0xd1, 0x7a, 0x7a, 0x41, 0x46, + 0x20, 0x46, 0xd7, 0xf7, 0x20, 0xfd, 0x40, 0x46, 0x05, 0xb0, 0xbd, 0xe8, + 0xf0, 0x4f, 0xe4, 0xf7, 0x59, 0xbe, 0x00, 0x00, 0x14, 0x74, 0x02, 0x21, + 0x62, 0xf3, 0x0f, 0x22, 0x62, 0xf3, 0x1f, 0x42, 0x00, 0xb5, 0x00, 0xbf, + 0x13, 0x00, 0x96, 0x46, 0x94, 0x46, 0x10, 0x39, 0x28, 0xbf, 0xa0, 0xe8, + 0x0c, 0x50, 0xfa, 0xd8, 0x5f, 0xea, 0x41, 0x7c, 0x28, 0xbf, 0x0c, 0xc0, + 0x48, 0xbf, 0x40, 0xf8, 0x04, 0x2b, 0xc9, 0x07, 0x28, 0xbf, 0x20, 0xf8, + 0x02, 0x2b, 0x48, 0xbf, 0x00, 0xf8, 0x01, 0x2b, 0x00, 0xbd, 0x00, 0x00, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x2d, 0xe9, 0xff, 0x4f, 0x01, 0x21, 0xad, 0xf5, + 0xa0, 0x6d, 0xaf, 0xb0, 0x05, 0x46, 0x02, 0x91, 0x00, 0x20, 0x4f, 0xf6, + 0xff, 0x71, 0x03, 0x90, 0xad, 0xf8, 0x34, 0x00, 0xad, 0xf8, 0x02, 0x10, + 0x80, 0x46, 0x04, 0xa8, 0xdf, 0xf8, 0xe8, 0x1c, 0x24, 0x22, 0xd8, 0xf7, + 0x67, 0xf8, 0x4f, 0xf4, 0xb0, 0x61, 0x0f, 0xa8, 0xea, 0xf7, 0x1c, 0xfa, + 0xdd, 0xf8, 0xc0, 0x05, 0x40, 0x21, 0xea, 0xf7, 0x59, 0xff, 0x00, 0x26, + 0x00, 0x21, 0x01, 0x95, 0x8d, 0xf8, 0x00, 0x60, 0x01, 0x9b, 0x1d, 0x1d, + 0xc1, 0xeb, 0x01, 0x16, 0xdf, 0xf8, 0xbc, 0x2c, 0xa8, 0x5d, 0x00, 0x28, + 0x1f, 0xbf, 0x02, 0xf5, 0xa2, 0x62, 0x32, 0xf8, 0x11, 0x00, 0x00, 0x28, + 0x8d, 0xf8, 0x00, 0x10, 0x49, 0x1c, 0x08, 0x29, 0xec, 0xd3, 0x00, 0x25, + 0x9d, 0xf8, 0x00, 0x10, 0xdf, 0xf8, 0x98, 0x0c, 0x8d, 0x42, 0x00, 0xeb, + 0x45, 0x03, 0x05, 0xd2, 0xb3, 0xf8, 0x10, 0x05, 0x41, 0x1e, 0x89, 0x41, + 0xc9, 0x0f, 0x00, 0xe0, 0x00, 0x21, 0x0e, 0x22, 0x0f, 0xa8, 0x6a, 0x43, + 0x02, 0x44, 0x01, 0x9f, 0x02, 0xf2, 0x12, 0x56, 0xc5, 0xeb, 0x05, 0x12, + 0x3c, 0x1d, 0xa0, 0x5c, 0x90, 0xb1, 0xb3, 0xf8, 0x10, 0x05, 0x00, 0x28, + 0x08, 0xbf, 0x00, 0x29, 0x0c, 0xd0, 0x02, 0x9c, 0x05, 0xf1, 0x29, 0x03, + 0x9b, 0xb2, 0xa4, 0xb2, 0xa3, 0x42, 0x4b, 0xf6, 0x01, 0x77, 0xc0, 0xf0, + 0xc1, 0x80, 0x31, 0xb1, 0x28, 0x20, 0x12, 0xe0, 0x01, 0x20, 0x00, 0x21, + 0x30, 0x70, 0x31, 0x81, 0x59, 0xe1, 0xbd, 0xf8, 0x02, 0x30, 0x5b, 0x1c, + 0xad, 0xf8, 0x34, 0x30, 0x43, 0x08, 0xc4, 0x07, 0xbd, 0xf8, 0x02, 0x40, + 0x48, 0xbf, 0x5b, 0x1c, 0x23, 0x44, 0xad, 0xf8, 0x02, 0x30, 0xdd, 0xf8, + 0xc0, 0x35, 0x23, 0xf8, 0x15, 0x00, 0xdf, 0xf8, 0x18, 0x0c, 0x03, 0x68, + 0x18, 0x69, 0x01, 0x9b, 0x13, 0x44, 0xd3, 0xf8, 0x05, 0x20, 0xb0, 0xfb, + 0xf2, 0xfe, 0xdd, 0xf8, 0xc0, 0x05, 0x30, 0xf8, 0x15, 0x20, 0x02, 0x98, + 0xad, 0xf8, 0x12, 0x20, 0xad, 0xf8, 0x16, 0x00, 0x00, 0x22, 0xad, 0xf8, + 0x14, 0xe0, 0x8d, 0xf8, 0x10, 0x20, 0x00, 0x20, 0x0a, 0x90, 0x07, 0xab, + 0x23, 0xf8, 0x12, 0x00, 0x52, 0x1c, 0x02, 0x2a, 0xfa, 0xd9, 0x00, 0x22, + 0x01, 0x23, 0x0e, 0x93, 0x01, 0x24, 0xd3, 0x1c, 0x04, 0xfa, 0x03, 0xf3, + 0xbd, 0xf8, 0x14, 0x40, 0x1f, 0xfa, 0x83, 0xf9, 0x4c, 0x45, 0x38, 0xbf, + 0x23, 0x46, 0x0d, 0xf1, 0x22, 0x04, 0x24, 0xf8, 0x12, 0x30, 0x52, 0x1c, + 0x02, 0x2a, 0xeb, 0xd9, 0x0d, 0xf1, 0x22, 0x02, 0xbd, 0xf8, 0x18, 0x30, + 0x32, 0xf8, 0x13, 0xc0, 0x9d, 0xf8, 0x10, 0x20, 0x0a, 0xb9, 0x4f, 0xea, + 0x4c, 0x0c, 0xbd, 0xf8, 0x12, 0x20, 0x1f, 0xe0, 0x07, 0xac, 0x0c, 0xfb, + 0x19, 0x2c, 0x24, 0xf8, 0x13, 0x90, 0x1f, 0xfa, 0x8c, 0xf2, 0xbd, 0xf8, + 0x18, 0x30, 0x5b, 0x1c, 0xad, 0xf8, 0x18, 0x30, 0x9c, 0xb2, 0x9b, 0xb2, + 0x02, 0x2c, 0x04, 0xac, 0x04, 0xeb, 0x43, 0x04, 0x88, 0xbf, 0x38, 0x46, + 0xa4, 0x8b, 0xad, 0xf8, 0x1a, 0x40, 0x0d, 0xf1, 0x22, 0x04, 0x34, 0xf8, + 0x13, 0xc0, 0x9d, 0xf8, 0x10, 0x30, 0x0b, 0xb9, 0x4f, 0xea, 0x4c, 0x0c, + 0xba, 0xb1, 0xb0, 0xb9, 0x1f, 0xfa, 0x8c, 0xf3, 0x92, 0xfb, 0xf3, 0xf4, + 0x03, 0xfb, 0x14, 0x23, 0x03, 0xb1, 0x64, 0x1c, 0xbd, 0xf8, 0x1a, 0x90, + 0xbd, 0xf8, 0x18, 0x30, 0xa4, 0xb2, 0xa1, 0x45, 0xce, 0xdb, 0x07, 0xaa, + 0x22, 0xf8, 0x13, 0x40, 0xbd, 0xf8, 0x1a, 0x20, 0x14, 0x1b, 0xad, 0xf8, + 0x1a, 0x40, 0x00, 0x22, 0x00, 0x28, 0x0d, 0xf1, 0x1c, 0x0c, 0x14, 0xd1, + 0xbd, 0xf8, 0x28, 0x30, 0x3c, 0xf8, 0x12, 0x40, 0xe3, 0x18, 0xad, 0xf8, + 0x28, 0x30, 0x02, 0xf1, 0x03, 0x09, 0x3c, 0xf8, 0x12, 0x40, 0xbd, 0xf8, + 0x2a, 0x30, 0x04, 0xfa, 0x09, 0xf4, 0x52, 0x1c, 0xe3, 0x18, 0x02, 0x2a, + 0xad, 0xf8, 0x2a, 0x30, 0xea, 0xd9, 0x00, 0x28, 0x03, 0x90, 0x0e, 0xd1, + 0x02, 0x98, 0x30, 0x81, 0x02, 0x9a, 0xbd, 0xf8, 0x28, 0x00, 0x10, 0x18, + 0x02, 0x90, 0x40, 0x1e, 0x70, 0x81, 0x80, 0xb2, 0x31, 0x28, 0x38, 0xbf, + 0x00, 0x20, 0x06, 0xd3, 0x03, 0x97, 0xa2, 0xe0, 0x4f, 0xea, 0x0e, 0x42, + 0x40, 0x1c, 0x4f, 0xea, 0x52, 0x4e, 0x1f, 0xfa, 0x8e, 0xf2, 0x01, 0x2a, + 0xf6, 0xd8, 0xbd, 0xf8, 0x18, 0x20, 0xd2, 0x1c, 0x92, 0xb2, 0x80, 0xb2, + 0x82, 0x42, 0x88, 0xbf, 0x02, 0x46, 0x72, 0x80, 0x00, 0x29, 0xdd, 0xf8, + 0xc0, 0x05, 0x10, 0xf8, 0x15, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xb0, 0x80, + 0xdd, 0xf8, 0xc0, 0x25, 0x02, 0xeb, 0x45, 0x03, 0x18, 0x82, 0xbd, 0xf8, + 0x34, 0x00, 0x40, 0xf0, 0xcf, 0x80, 0x00, 0x22, 0x00, 0x27, 0x07, 0xab, + 0x33, 0xf8, 0x11, 0x40, 0x0d, 0xf1, 0x22, 0x03, 0x33, 0xf8, 0x11, 0x30, + 0x49, 0x1c, 0x02, 0x29, 0x03, 0xfb, 0x04, 0x77, 0xf3, 0xd9, 0xdd, 0xf8, + 0xc0, 0x15, 0x31, 0xf8, 0x15, 0x30, 0x9d, 0xf8, 0x10, 0x10, 0x71, 0xb9, + 0xb1, 0x88, 0x01, 0xeb, 0x53, 0x03, 0x0a, 0xe0, 0x0d, 0xf1, 0x3c, 0x0e, + 0x00, 0x21, 0x1f, 0xfa, 0x88, 0xf4, 0x2e, 0xf8, 0x14, 0x10, 0x08, 0xf1, + 0x01, 0x08, 0x52, 0x1c, 0x5b, 0x1c, 0x99, 0xb2, 0xbc, 0xb2, 0xa1, 0x42, + 0xf0, 0xd3, 0xdf, 0xf8, 0x2c, 0x3a, 0x59, 0x19, 0x91, 0xf8, 0x20, 0x15, + 0xf1, 0x80, 0x01, 0xb9, 0x7f, 0x00, 0xdd, 0xf8, 0xc0, 0x15, 0x21, 0xf8, + 0x15, 0x70, 0x00, 0x27, 0x0d, 0xf1, 0x22, 0x01, 0x4f, 0xf0, 0x00, 0x0c, + 0x31, 0xf8, 0x17, 0xe0, 0x15, 0xe0, 0x4f, 0xf0, 0x00, 0x09, 0x1f, 0xfa, + 0x81, 0xfb, 0x2a, 0xf8, 0x1b, 0x90, 0x49, 0x1c, 0x08, 0xf1, 0x01, 0x08, + 0x1f, 0xfa, 0x88, 0xf9, 0xa1, 0x45, 0xf2, 0xdb, 0x94, 0xb2, 0xa6, 0x45, + 0x88, 0x46, 0x2c, 0xbf, 0x00, 0x22, 0xa2, 0xeb, 0x0e, 0x02, 0x0c, 0xf1, + 0x01, 0x0c, 0x07, 0xac, 0x1f, 0xfa, 0x8c, 0xf1, 0x34, 0xf8, 0x17, 0x40, + 0xa1, 0x42, 0x1d, 0xd2, 0x0e, 0x99, 0xfc, 0x1c, 0x01, 0xfa, 0x04, 0xf4, + 0xa4, 0xb2, 0x91, 0x46, 0x41, 0x46, 0x0d, 0xe0, 0x1f, 0xfa, 0x80, 0xf8, + 0x33, 0xf8, 0x18, 0x80, 0x0d, 0xf1, 0x3c, 0x0a, 0x1f, 0xfa, 0x81, 0xfb, + 0x2a, 0xf8, 0x1b, 0x80, 0x40, 0x1c, 0x49, 0x1c, 0x09, 0xf1, 0x01, 0x09, + 0x1f, 0xfa, 0x89, 0xf8, 0xf0, 0x45, 0xed, 0xd3, 0xf0, 0x46, 0x0d, 0xf1, + 0x3c, 0x0a, 0xcd, 0xe7, 0x7f, 0x1c, 0x02, 0x2f, 0xba, 0xd9, 0x00, 0x20, + 0x30, 0x70, 0x6d, 0x1c, 0x08, 0x2d, 0xff, 0xf4, 0x6f, 0xae, 0x1f, 0xfa, + 0x88, 0xf1, 0x08, 0x46, 0xb0, 0xf5, 0x22, 0x7f, 0x07, 0xd2, 0xc1, 0xf5, + 0x22, 0x71, 0x0f, 0xaa, 0x49, 0x00, 0x02, 0xeb, 0x40, 0x00, 0xea, 0xf7, + 0xa1, 0xfd, 0xff, 0xad, 0xff, 0x35, 0x03, 0x98, 0x00, 0x21, 0x4f, 0xf0, + 0x0e, 0x08, 0x53, 0x35, 0x80, 0xb9, 0xdd, 0xf8, 0xc0, 0x05, 0x0f, 0xaa, + 0x08, 0xfb, 0x01, 0xf3, 0x1a, 0x44, 0x02, 0xf2, 0x12, 0x52, 0x00, 0xeb, + 0x41, 0x03, 0x56, 0x89, 0x1e, 0x84, 0x49, 0x1c, 0x12, 0x78, 0x1a, 0x86, + 0x08, 0x29, 0xf0, 0xd3, 0x9d, 0xf8, 0xc8, 0x05, 0x01, 0x28, 0x1d, 0xd1, + 0x9d, 0xf8, 0xc4, 0x75, 0x00, 0x26, 0x01, 0x99, 0x08, 0x68, 0xf0, 0x40, + 0xc0, 0x07, 0x12, 0xd5, 0x03, 0x98, 0x00, 0x24, 0x50, 0xb9, 0x08, 0xfb, + 0x04, 0xf0, 0x2b, 0x18, 0x22, 0x46, 0x39, 0x46, 0x30, 0x46, 0x00, 0xf0, + 0x57, 0xfb, 0x64, 0x1c, 0x08, 0x2c, 0xf4, 0xd3, 0x0f, 0xaa, 0x39, 0x46, + 0x30, 0x46, 0x00, 0xf0, 0x86, 0xfb, 0x76, 0x1c, 0x08, 0x2e, 0xe4, 0xd3, + 0x03, 0x98, 0x0d, 0xf5, 0xa0, 0x6d, 0x33, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0xbd, 0xf8, 0x2a, 0x00, 0x31, 0x70, 0x80, 0x44, 0xdd, 0xf8, 0xc0, 0x05, + 0x00, 0x22, 0x20, 0xf8, 0x15, 0x20, 0xa2, 0xe7, 0x2d, 0xe9, 0xf8, 0x4f, + 0x88, 0xb0, 0x05, 0x46, 0xf3, 0xf7, 0xc8, 0xfe, 0x4f, 0xf0, 0x00, 0x09, + 0x5f, 0xea, 0x00, 0x08, 0x08, 0xbf, 0x4f, 0xf6, 0x77, 0x79, 0x00, 0xf0, + 0x4e, 0x81, 0x00, 0x24, 0xaa, 0x46, 0xdf, 0xf8, 0xbc, 0xb8, 0x8d, 0xf8, + 0x00, 0x50, 0x5b, 0xf8, 0x2a, 0x00, 0xdf, 0xf8, 0xb4, 0x28, 0x07, 0x90, + 0x30, 0x21, 0x61, 0x43, 0x08, 0xeb, 0x01, 0x05, 0x00, 0xeb, 0x84, 0x00, + 0xd5, 0xf8, 0x29, 0x30, 0x00, 0x21, 0x00, 0xf5, 0xa0, 0x70, 0xff, 0xf7, + 0xa7, 0xfd, 0x07, 0x98, 0xd5, 0xf8, 0x0a, 0x30, 0x1c, 0x26, 0x06, 0xfb, + 0x04, 0x06, 0x6f, 0xf0, 0x7f, 0x42, 0x00, 0x21, 0x06, 0xf1, 0x14, 0x00, + 0xff, 0xf7, 0x9a, 0xfd, 0x37, 0x46, 0xab, 0x7b, 0x03, 0x22, 0x00, 0xf0, + 0xb3, 0xfa, 0x10, 0x36, 0x00, 0x23, 0x4f, 0xf0, 0x00, 0x52, 0x1d, 0x21, + 0x00, 0xf0, 0xbe, 0xfb, 0x01, 0x23, 0x4f, 0xf0, 0x80, 0x52, 0x00, 0xf0, + 0xb8, 0xfb, 0x05, 0xf1, 0x21, 0x06, 0x4f, 0xf4, 0x70, 0x72, 0x33, 0x78, + 0x06, 0x21, 0x00, 0xf0, 0xa0, 0xfa, 0x73, 0x78, 0x3c, 0x22, 0x02, 0x21, + 0x00, 0xf0, 0x9b, 0xfa, 0x33, 0x7b, 0x4f, 0xf4, 0x80, 0x32, 0x10, 0x21, + 0x00, 0xf0, 0x95, 0xfa, 0xb0, 0x78, 0xad, 0xf8, 0x0c, 0x00, 0xf0, 0x78, + 0xad, 0xf8, 0x0e, 0x00, 0x30, 0x79, 0x00, 0xf0, 0x99, 0xfa, 0x70, 0x79, + 0xad, 0xf8, 0x0a, 0x00, 0x22, 0x46, 0xb0, 0x79, 0xad, 0xf8, 0x08, 0x00, + 0xf1, 0x79, 0xad, 0xf8, 0x06, 0x10, 0x9d, 0xf8, 0x00, 0x10, 0x07, 0x91, + 0x01, 0x21, 0x07, 0x98, 0x00, 0xf0, 0xca, 0xfa, 0x8d, 0xf8, 0x10, 0x40, + 0x04, 0xa9, 0xd5, 0xf8, 0x0f, 0x00, 0x05, 0x90, 0x64, 0x1c, 0xd5, 0xf8, + 0x1b, 0x00, 0x06, 0x90, 0xe8, 0x7f, 0x8d, 0xf8, 0x11, 0x00, 0x9d, 0xf8, + 0x00, 0x00, 0x00, 0xf0, 0x0b, 0xfb, 0x08, 0x2c, 0x8f, 0xd3, 0x08, 0xf5, + 0xc0, 0x72, 0x07, 0x98, 0x01, 0x21, 0x00, 0xf0, 0xe8, 0xfa, 0x5b, 0xf8, + 0x2a, 0x50, 0x00, 0x26, 0x08, 0xeb, 0xc6, 0x00, 0x00, 0xf5, 0xd2, 0x67, + 0x05, 0xeb, 0x86, 0x04, 0x04, 0xf5, 0x80, 0x74, 0xfb, 0x79, 0x4f, 0xf0, + 0xe0, 0x42, 0x1c, 0x21, 0x00, 0xf0, 0xd0, 0xfa, 0x00, 0xf0, 0x49, 0xfa, + 0x00, 0xf0, 0xcc, 0xfa, 0x00, 0xf0, 0x40, 0xfa, 0x00, 0xf0, 0xc8, 0xfa, + 0x3b, 0x79, 0x4f, 0xf4, 0xe0, 0x22, 0x10, 0x21, 0x00, 0xf0, 0xc2, 0xfa, + 0x00, 0xf0, 0x31, 0xfa, 0x00, 0xf0, 0xbe, 0xfa, 0xbb, 0x78, 0x00, 0xf0, + 0xb8, 0xfa, 0x7b, 0x78, 0x70, 0x22, 0x04, 0x21, 0x00, 0xf0, 0xb6, 0xfa, + 0x3b, 0x78, 0x07, 0x22, 0x00, 0xf0, 0xb5, 0xfa, 0x76, 0x1c, 0x08, 0x2e, + 0xd0, 0xd3, 0x08, 0xf5, 0xda, 0x65, 0x5b, 0xf8, 0x2a, 0x40, 0x2b, 0x78, + 0x7f, 0x22, 0x00, 0x21, 0x04, 0xf1, 0xfc, 0x00, 0xff, 0xf7, 0x06, 0xfd, + 0xd8, 0xf8, 0xd1, 0x36, 0x00, 0xf0, 0x09, 0xfa, 0x04, 0xf5, 0x90, 0x70, + 0xff, 0xf7, 0xfe, 0xfc, 0xd8, 0xf8, 0xd5, 0x36, 0x00, 0xf0, 0x01, 0xfa, + 0x04, 0xf5, 0x92, 0x70, 0xff, 0xf7, 0xf6, 0xfc, 0x6b, 0x7a, 0x01, 0x22, + 0x00, 0x21, 0x04, 0xf1, 0xf8, 0x00, 0xff, 0xf7, 0xef, 0xfc, 0xab, 0x7a, + 0xff, 0x22, 0x00, 0x21, 0x04, 0xf1, 0xe4, 0x00, 0xff, 0xf7, 0xe8, 0xfc, + 0x6b, 0x7b, 0x3f, 0x22, 0x00, 0x21, 0x04, 0xf1, 0xf0, 0x00, 0xff, 0xf7, + 0xe1, 0xfc, 0xab, 0x7b, 0x3f, 0x22, 0x00, 0x21, 0x04, 0xf1, 0xf4, 0x00, + 0xff, 0xf7, 0xda, 0xfc, 0x04, 0xf5, 0x9e, 0x76, 0xeb, 0x7b, 0xff, 0x22, + 0x00, 0xf0, 0x0e, 0xfb, 0x2b, 0x7c, 0x4f, 0xf4, 0x7f, 0x42, 0x08, 0x21, + 0x00, 0xf0, 0xfe, 0xfa, 0x6b, 0x7c, 0x4f, 0xf4, 0x7f, 0x02, 0x10, 0x21, + 0x00, 0xf0, 0xf8, 0xfa, 0x04, 0xf5, 0x9c, 0x76, 0xab, 0x7c, 0x07, 0x22, + 0x00, 0xf0, 0xfc, 0xfa, 0xeb, 0x7c, 0x70, 0x22, 0x04, 0x21, 0x00, 0xf0, + 0xed, 0xfa, 0x2b, 0x7d, 0x00, 0xf0, 0xc5, 0xf9, 0x00, 0xf0, 0xe8, 0xfa, + 0x6b, 0x7d, 0x00, 0xf0, 0xc5, 0xf9, 0x00, 0xf0, 0xe3, 0xfa, 0xab, 0x7d, + 0x4f, 0xf4, 0xe0, 0x22, 0x10, 0x21, 0x00, 0xf0, 0xdd, 0xfa, 0xeb, 0x7d, + 0x00, 0xf0, 0xbf, 0xf9, 0x00, 0xf0, 0xd8, 0xfa, 0x2b, 0x7e, 0x00, 0xf0, + 0xbf, 0xf9, 0x00, 0xf0, 0xd3, 0xfa, 0x6b, 0x7e, 0x4f, 0xf0, 0xe0, 0x42, + 0x00, 0xf0, 0xcd, 0xfa, 0x00, 0x26, 0x04, 0xeb, 0x86, 0x00, 0x00, 0xf5, + 0x94, 0x7b, 0x08, 0xeb, 0x86, 0x00, 0x00, 0xf2, 0xea, 0x67, 0xdf, 0xf8, + 0x74, 0x26, 0x7b, 0x88, 0x10, 0x21, 0x58, 0x46, 0xff, 0xf7, 0x8e, 0xfc, + 0x3b, 0x88, 0x40, 0xf2, 0xff, 0x32, 0x00, 0x21, 0x58, 0x46, 0xff, 0xf7, + 0x87, 0xfc, 0x76, 0x1c, 0x04, 0x2e, 0xe6, 0xd3, 0xdf, 0xf8, 0x54, 0x06, + 0x50, 0xf8, 0x2a, 0x00, 0xeb, 0x7a, 0x00, 0xf5, 0xf8, 0x74, 0x03, 0x22, + 0x00, 0xf0, 0x1b, 0xfa, 0x2b, 0x7b, 0x70, 0x22, 0x04, 0x21, 0x00, 0xf0, + 0x13, 0xfa, 0x98, 0xf8, 0xfa, 0x36, 0x00, 0xf0, 0x0c, 0xfa, 0x48, 0x46, + 0x72, 0xe1, 0x2d, 0xe9, 0xf8, 0x4f, 0x88, 0xb0, 0x05, 0x46, 0xf3, 0xf7, + 0x59, 0xfd, 0x4f, 0xf0, 0x00, 0x0b, 0x5f, 0xea, 0x00, 0x0a, 0x08, 0xbf, + 0x4f, 0xf6, 0x77, 0x7b, 0x00, 0xf0, 0x63, 0x81, 0x00, 0x24, 0xa9, 0x46, + 0xdf, 0xf8, 0x0c, 0x66, 0x8d, 0xf8, 0x00, 0x50, 0x56, 0xf8, 0x29, 0x00, + 0xdf, 0xf8, 0xf4, 0x25, 0x04, 0x90, 0x30, 0x21, 0x61, 0x43, 0x0a, 0xeb, + 0x01, 0x05, 0x00, 0xeb, 0x84, 0x00, 0xd5, 0xf8, 0x2a, 0x30, 0x00, 0x21, + 0x00, 0xf5, 0xb0, 0x70, 0xff, 0xf7, 0x48, 0xfc, 0x04, 0x98, 0xd5, 0xf8, + 0x0b, 0x30, 0x00, 0xeb, 0x44, 0x18, 0x6f, 0xf0, 0x7f, 0x42, 0x00, 0x21, + 0x08, 0xf1, 0x14, 0x00, 0xff, 0xf7, 0x3c, 0xfc, 0xeb, 0x7b, 0x03, 0x22, + 0x00, 0xf0, 0x6a, 0xf9, 0x08, 0xf1, 0x10, 0x07, 0x00, 0x23, 0x4f, 0xf0, + 0x00, 0x52, 0x1d, 0x21, 0x00, 0xf0, 0x4f, 0xf9, 0x01, 0x23, 0x4f, 0xf0, + 0x80, 0x52, 0x1c, 0x21, 0x00, 0xf0, 0x49, 0xf9, 0x05, 0xf1, 0x21, 0x07, + 0xff, 0x22, 0x3b, 0x78, 0x00, 0x21, 0x08, 0xf1, 0x1c, 0x00, 0xff, 0xf7, + 0x21, 0xfc, 0x7b, 0x78, 0x3c, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x3f, 0xf9, + 0xbb, 0x78, 0x4f, 0xf4, 0x70, 0x72, 0x06, 0x21, 0x00, 0xf0, 0x39, 0xf9, + 0x7b, 0x7b, 0x4f, 0xf4, 0x80, 0x32, 0x00, 0xf0, 0x33, 0xf9, 0xf8, 0x78, + 0xad, 0xf8, 0x0c, 0x00, 0x38, 0x79, 0xad, 0xf8, 0x0e, 0x00, 0x78, 0x79, + 0x00, 0xf0, 0x34, 0xf9, 0xb8, 0x79, 0xad, 0xf8, 0x0a, 0x00, 0x22, 0x46, + 0xf8, 0x79, 0xad, 0xf8, 0x08, 0x00, 0x39, 0x7a, 0xad, 0xf8, 0x06, 0x10, + 0x9d, 0xf8, 0x00, 0x10, 0x04, 0x91, 0x00, 0x21, 0x04, 0x98, 0x00, 0xf0, + 0x65, 0xf9, 0x8d, 0xf8, 0x14, 0x40, 0x05, 0xa9, 0x28, 0x69, 0x06, 0x90, + 0x64, 0x1c, 0xe8, 0x69, 0x07, 0x90, 0x95, 0xf8, 0x20, 0x00, 0x8d, 0xf8, + 0x15, 0x00, 0x9d, 0xf8, 0x00, 0x00, 0x00, 0xf0, 0xef, 0xf9, 0x08, 0x2c, + 0x8a, 0xd3, 0x0a, 0xf2, 0x81, 0x12, 0x04, 0x98, 0x00, 0x21, 0x00, 0xf0, + 0x84, 0xf9, 0x56, 0xf8, 0x29, 0x40, 0x00, 0x25, 0x04, 0xeb, 0x85, 0x00, + 0x00, 0xf5, 0x90, 0x78, 0x0a, 0xeb, 0xc5, 0x00, 0x00, 0xf2, 0x91, 0x67, + 0x4f, 0xf0, 0xe0, 0x42, 0xfb, 0x79, 0x1c, 0x21, 0x00, 0xf0, 0xf1, 0xf8, + 0x00, 0xf0, 0xe5, 0xf8, 0x00, 0xf0, 0xed, 0xf8, 0x00, 0xf0, 0xdc, 0xf8, + 0x00, 0xf0, 0xe9, 0xf8, 0x3b, 0x79, 0x4f, 0xf4, 0xe0, 0x22, 0x00, 0xf0, + 0xe3, 0xf8, 0x00, 0xf0, 0xce, 0xf8, 0x00, 0xf0, 0xe0, 0xf8, 0xbb, 0x78, + 0x00, 0xf0, 0xc5, 0xf8, 0x00, 0xf0, 0xdb, 0xf8, 0x7b, 0x78, 0x70, 0x22, + 0x04, 0x21, 0x00, 0xf0, 0xd6, 0xf8, 0x3b, 0x78, 0x07, 0x22, 0x00, 0xf0, + 0xe1, 0xf8, 0x6d, 0x1c, 0x08, 0x2d, 0xcf, 0xd3, 0x56, 0xf8, 0x29, 0x00, + 0x04, 0x90, 0x0a, 0xf2, 0xd1, 0x66, 0x07, 0x46, 0x33, 0x78, 0x7f, 0x22, + 0x00, 0x21, 0x07, 0xf5, 0x8e, 0x70, 0xff, 0xf7, 0x9f, 0xfb, 0xda, 0xf8, + 0xd2, 0x36, 0x00, 0xf0, 0xa2, 0xf8, 0x07, 0xf5, 0xa2, 0x70, 0xff, 0xf7, + 0x97, 0xfb, 0xda, 0xf8, 0xd6, 0x36, 0x00, 0xf0, 0x9a, 0xf8, 0x07, 0xf5, + 0xa0, 0x70, 0xff, 0xf7, 0x8f, 0xfb, 0x73, 0x7a, 0x01, 0x22, 0x00, 0x21, + 0x07, 0xf5, 0x8c, 0x70, 0xff, 0xf7, 0x88, 0xfb, 0xb3, 0x7a, 0xff, 0x22, + 0x00, 0x21, 0x07, 0xf5, 0x82, 0x70, 0xff, 0xf7, 0x81, 0xfb, 0x73, 0x7b, + 0x3f, 0x22, 0x00, 0x21, 0x07, 0xf5, 0x88, 0x70, 0xff, 0xf7, 0x7a, 0xfb, + 0xb3, 0x7b, 0x3f, 0x22, 0x00, 0x21, 0x07, 0xf5, 0x8a, 0x70, 0xff, 0xf7, + 0x73, 0xfb, 0x0a, 0xf2, 0xfb, 0x64, 0x07, 0xf5, 0xc0, 0x75, 0x23, 0x78, + 0x00, 0xf0, 0xa2, 0xf8, 0x63, 0x78, 0x00, 0xf0, 0x8f, 0xf8, 0x07, 0xf5, + 0xae, 0x75, 0xf3, 0x7b, 0x00, 0xf0, 0x9a, 0xf8, 0x33, 0x7c, 0x4f, 0xf4, + 0x7f, 0x42, 0x08, 0x21, 0x00, 0xf0, 0x87, 0xf8, 0x73, 0x7c, 0x00, 0xf0, + 0x81, 0xf8, 0xba, 0xf8, 0xfe, 0x36, 0x4f, 0xf6, 0xff, 0x72, 0x00, 0x21, + 0x07, 0xf5, 0xc4, 0x70, 0xff, 0xf7, 0x52, 0xfb, 0x07, 0xf5, 0xac, 0x75, + 0xb3, 0x7c, 0x07, 0x22, 0x00, 0xf0, 0x83, 0xf8, 0xf3, 0x7c, 0x70, 0x22, + 0x04, 0x21, 0x00, 0xf0, 0x70, 0xf8, 0x33, 0x7d, 0x00, 0xf0, 0x4f, 0xf8, + 0x00, 0xf0, 0x6b, 0xf8, 0x73, 0x7d, 0x00, 0xf0, 0x4f, 0xf8, 0x00, 0xf0, + 0x66, 0xf8, 0xb3, 0x7d, 0x4f, 0xf4, 0xe0, 0x22, 0x00, 0xf0, 0x60, 0xf8, + 0xf3, 0x7d, 0x00, 0xf0, 0x4a, 0xf8, 0x00, 0xf0, 0x5c, 0xf8, 0x33, 0x7e, + 0x00, 0xf0, 0x4a, 0xf8, 0x00, 0xf0, 0x57, 0xf8, 0x73, 0x7e, 0x4f, 0xf0, + 0xe0, 0x42, 0x1c, 0x21, 0x00, 0xf0, 0x51, 0xf8, 0x00, 0x25, 0x04, 0x98, + 0xdf, 0xf8, 0x94, 0x23, 0x00, 0xeb, 0x85, 0x00, 0x00, 0xf5, 0xa4, 0x78, + 0x0a, 0xeb, 0x85, 0x00, 0x00, 0xf2, 0xeb, 0x67, 0x10, 0x21, 0x7b, 0x88, + 0x00, 0xf0, 0x3b, 0xf8, 0x3b, 0x88, 0x40, 0xf2, 0xff, 0x32, 0x00, 0xf0, + 0x45, 0xf8, 0x6d, 0x1c, 0x04, 0x2d, 0xe8, 0xd3, 0xdd, 0x48, 0x50, 0xf8, + 0x29, 0x00, 0xf3, 0x7a, 0x00, 0xf5, 0xd8, 0x75, 0x03, 0x22, 0x00, 0xf0, + 0x3e, 0xf8, 0x33, 0x7b, 0x70, 0x22, 0x04, 0x21, 0x00, 0xf0, 0x2b, 0xf8, + 0xa3, 0x78, 0x00, 0xf0, 0x0a, 0xf8, 0x00, 0xf0, 0x26, 0xf8, 0x58, 0x46, + 0x09, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x4f, 0xf0, 0xff, 0x32, 0x00, 0x21, + 0x70, 0x47, 0x4f, 0xf4, 0xe0, 0x62, 0x08, 0x21, 0x70, 0x47, 0xfb, 0x78, + 0x4f, 0xf4, 0xe0, 0x42, 0x0c, 0x21, 0x70, 0x47, 0x7b, 0x79, 0x4f, 0xf4, + 0xe0, 0x02, 0x14, 0x21, 0x70, 0x47, 0xbb, 0x79, 0x4f, 0xf0, 0xe0, 0x62, + 0x18, 0x21, 0x70, 0x47, 0x00, 0x21, 0x38, 0x46, 0xff, 0xf7, 0xde, 0xba, + 0x10, 0x21, 0x40, 0x46, 0xff, 0xf7, 0xda, 0xba, 0x4f, 0xf4, 0x7f, 0x02, + 0x10, 0x21, 0x28, 0x46, 0xff, 0xf7, 0xd4, 0xba, 0x00, 0xb1, 0x01, 0x20, + 0x8d, 0xf8, 0x04, 0x00, 0x01, 0xab, 0x70, 0x47, 0x00, 0x21, 0x40, 0x46, + 0xff, 0xf7, 0xca, 0xba, 0xff, 0x22, 0x00, 0x21, 0x28, 0x46, 0xff, 0xf7, + 0xc5, 0xba, 0xf8, 0xb5, 0x05, 0x46, 0x0e, 0x46, 0x30, 0x00, 0x17, 0x46, + 0xab, 0x4c, 0x04, 0xd1, 0x4f, 0xf4, 0xa5, 0x61, 0x20, 0x46, 0xe9, 0xf7, + 0xff, 0xfc, 0x00, 0x20, 0x05, 0xe0, 0x37, 0xf8, 0x10, 0x20, 0x81, 0x19, + 0x24, 0xf8, 0x11, 0x20, 0x40, 0x1c, 0xa8, 0x42, 0xf7, 0xd3, 0x00, 0x20, + 0xf2, 0xbd, 0x70, 0xb5, 0x00, 0x21, 0xa1, 0x4a, 0x30, 0xf8, 0x11, 0x30, + 0x02, 0xeb, 0x41, 0x04, 0x45, 0x18, 0xa4, 0xf8, 0x10, 0x35, 0x56, 0x18, + 0x2b, 0x7c, 0x86, 0xf8, 0x20, 0x35, 0x49, 0x1c, 0x08, 0x29, 0xf1, 0xd3, + 0x00, 0x20, 0x70, 0xbd, 0x13, 0x46, 0x01, 0x22, 0xff, 0xf7, 0xa4, 0xba, + 0x13, 0x46, 0x00, 0x22, 0xff, 0xf7, 0xa0, 0xba, 0x38, 0xb5, 0x01, 0x29, + 0x0c, 0xbf, 0x9e, 0x49, 0x9e, 0x49, 0x1d, 0x46, 0x51, 0xf8, 0x20, 0x00, + 0x2b, 0x89, 0x00, 0xeb, 0x82, 0x04, 0x4f, 0xf0, 0x7c, 0x52, 0x18, 0x21, + 0x00, 0xf0, 0x20, 0xf8, 0x6b, 0x89, 0x4f, 0xf4, 0x7c, 0x12, 0x10, 0x21, + 0x00, 0xf0, 0x1a, 0xf8, 0x2b, 0x78, 0x01, 0x22, 0x00, 0xf0, 0x19, 0xf8, + 0xeb, 0x88, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0x11, 0xf8, 0xab, 0x88, + 0x04, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x0c, 0xf8, 0x6b, 0x88, 0x20, 0x46, + 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x70, 0x22, 0x04, 0x21, 0xff, 0xf7, + 0x65, 0xba, 0x4f, 0xf4, 0xe0, 0x62, 0x08, 0x21, 0x20, 0x46, 0xff, 0xf7, + 0x5f, 0xba, 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x5b, 0xba, 0x70, 0xb5, + 0x14, 0x46, 0x83, 0x4a, 0x52, 0xf8, 0x20, 0x50, 0x00, 0x26, 0x01, 0x29, + 0x1c, 0xbf, 0x81, 0x49, 0x51, 0xf8, 0x20, 0x50, 0x34, 0xf9, 0x16, 0x30, + 0x05, 0xeb, 0x86, 0x00, 0x4f, 0xf6, 0xff, 0x72, 0x00, 0x21, 0x00, 0xf5, + 0x80, 0x70, 0xff, 0xf7, 0x45, 0xfa, 0x76, 0x1c, 0xb6, 0xf5, 0x22, 0x7f, + 0xf0, 0xd3, 0x70, 0xbd, 0xf8, 0xb5, 0x0c, 0x46, 0x6f, 0x49, 0x51, 0xf8, + 0x20, 0x00, 0x25, 0x78, 0x1c, 0x21, 0x11, 0xfb, 0x05, 0x05, 0xa0, 0x68, + 0x00, 0xf0, 0xb0, 0xf8, 0x06, 0x46, 0x05, 0xf1, 0x10, 0x07, 0x63, 0x68, + 0x6f, 0xf0, 0x7f, 0x42, 0xff, 0xf7, 0x4a, 0xff, 0x33, 0x46, 0x00, 0xf0, + 0x5c, 0xf8, 0x01, 0x23, 0x4f, 0xf0, 0x00, 0x62, 0x1b, 0x21, 0xff, 0xf7, + 0x42, 0xff, 0x63, 0x78, 0x4f, 0xf0, 0x80, 0x62, 0x1a, 0x21, 0xff, 0xf7, + 0x3c, 0xff, 0x63, 0x78, 0x28, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x40, + 0x40, 0xe0, 0x38, 0xb5, 0x0c, 0x46, 0x5b, 0x49, 0x51, 0xf8, 0x20, 0x20, + 0x21, 0x78, 0x1c, 0x20, 0x10, 0xfb, 0x01, 0x21, 0x01, 0xf1, 0x10, 0x00, + 0x02, 0x68, 0x92, 0x0e, 0x02, 0xf0, 0x01, 0x02, 0x62, 0x70, 0x05, 0x68, + 0x51, 0xf8, 0x0c, 0x0f, 0x80, 0xb2, 0x00, 0xf0, 0x61, 0xf8, 0xa0, 0x60, + 0x25, 0xf0, 0x7f, 0x45, 0x28, 0x02, 0x48, 0xbf, 0x45, 0xf0, 0x7f, 0x45, + 0x65, 0x60, 0x31, 0xbd, 0x70, 0xb5, 0x00, 0xf0, 0x4e, 0xf8, 0x63, 0x68, + 0x05, 0xeb, 0x40, 0x15, 0x05, 0xf1, 0x10, 0x06, 0x6f, 0xf0, 0x7f, 0x42, + 0x00, 0xf0, 0x26, 0xf8, 0xa0, 0x68, 0x00, 0xf0, 0x65, 0xf8, 0x03, 0x46, + 0x00, 0xf0, 0x19, 0xf8, 0x01, 0x23, 0x4f, 0xf0, 0x00, 0x62, 0x1b, 0x21, + 0x00, 0xf0, 0x10, 0xf8, 0x63, 0x78, 0x4f, 0xf0, 0x80, 0x62, 0x1a, 0x21, + 0x00, 0xf0, 0x0a, 0xf8, 0x63, 0x78, 0x28, 0x46, 0xbd, 0xe8, 0x70, 0x40, + 0x4f, 0xf4, 0x80, 0x62, 0x0a, 0x21, 0xff, 0xf7, 0xd1, 0xb9, 0x1c, 0x21, + 0x30, 0x46, 0xff, 0xf7, 0xcd, 0xb9, 0x4f, 0xf6, 0xff, 0x72, 0x00, 0x21, + 0x05, 0xf1, 0x0c, 0x00, 0xff, 0xf7, 0xc6, 0xb9, 0x00, 0x21, 0x30, 0x46, + 0xff, 0xf7, 0xc2, 0xb9, 0x38, 0xb5, 0x00, 0xf0, 0x18, 0xf8, 0x05, 0xeb, + 0x40, 0x15, 0x05, 0xf1, 0x0c, 0x01, 0x08, 0x68, 0x80, 0xb2, 0x00, 0xf0, + 0x17, 0xf8, 0xa0, 0x60, 0x55, 0xf8, 0x10, 0x0f, 0x80, 0x0e, 0x00, 0xf0, + 0x01, 0x00, 0x60, 0x70, 0x28, 0x68, 0x20, 0xf0, 0x7f, 0x40, 0x01, 0x02, + 0x48, 0xbf, 0x40, 0xf0, 0x7f, 0x40, 0x60, 0x60, 0x31, 0xbd, 0x0c, 0x46, + 0x27, 0x49, 0x51, 0xf8, 0x20, 0x50, 0x20, 0x78, 0x70, 0x47, 0x00, 0x00, + 0x00, 0xee, 0x10, 0x0a, 0x80, 0xb5, 0xb8, 0xee, 0x40, 0x0a, 0xdf, 0xed, + 0x1b, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0x9f, 0xed, 0x1a, 0x1a, 0x20, 0xee, + 0x01, 0x0a, 0xe4, 0xf7, 0x6f, 0xfb, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, + 0x10, 0x0a, 0x4f, 0xf4, 0xb4, 0x72, 0x90, 0xfb, 0xf2, 0xf2, 0x4f, 0xf4, + 0xb4, 0x71, 0x01, 0xfb, 0x12, 0x00, 0x02, 0xbd, 0x4f, 0xf4, 0xb4, 0x72, + 0x90, 0xfb, 0xf2, 0xf2, 0x4f, 0xf4, 0xb4, 0x71, 0x01, 0xfb, 0x12, 0x00, + 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xdf, 0xed, 0x0b, 0x0a, + 0x60, 0xee, 0x20, 0x0a, 0x9f, 0xed, 0x07, 0x1a, 0x80, 0xee, 0x81, 0x1a, + 0xbc, 0xee, 0xc1, 0x1a, 0x11, 0xee, 0x10, 0x0a, 0x70, 0x47, 0x00, 0x00, + 0xf8, 0x93, 0x04, 0x02, 0xf8, 0x2d, 0x02, 0x21, 0x5c, 0x75, 0x02, 0x21, + 0x00, 0x00, 0xb4, 0x43, 0x00, 0x00, 0x80, 0x37, 0x00, 0x00, 0x80, 0x47, + 0x80, 0x96, 0x04, 0x02, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xff, 0x03, + 0xc0, 0x96, 0x04, 0x02, 0xe0, 0x97, 0x04, 0x02, 0x20, 0x98, 0x04, 0x02, + 0xa0, 0x96, 0x04, 0x02, 0x00, 0x98, 0x04, 0x02, 0x00, 0x21, 0x01, 0x60, + 0x41, 0x60, 0x81, 0x60, 0xc1, 0x60, 0x01, 0x61, 0x70, 0x47, 0x00, 0x21, + 0x01, 0x60, 0x41, 0x60, 0x70, 0x47, 0xb1, 0xf1, 0x00, 0x4f, 0x08, 0xbf, + 0x00, 0x21, 0x01, 0x60, 0xc2, 0x68, 0x52, 0x1c, 0xc2, 0x60, 0x21, 0xb9, + 0x01, 0x69, 0x49, 0x1c, 0x01, 0x61, 0x64, 0x21, 0x41, 0x60, 0x70, 0x47, + 0x06, 0xf0, 0x50, 0xb8, 0x06, 0xf0, 0x53, 0xb8, 0xb0, 0xfa, 0x80, 0xf0, + 0xc0, 0xf1, 0x1f, 0x00, 0x70, 0x47, 0x01, 0x21, 0x01, 0xfa, 0x00, 0xf0, + 0x70, 0x47, 0x00, 0x00, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x78, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x70, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x38, 0xb5, 0x04, 0x46, + 0x3f, 0x4d, 0x23, 0x46, 0x01, 0x22, 0x00, 0x21, 0x28, 0x46, 0xff, 0xf7, + 0xe9, 0xff, 0x23, 0x46, 0x28, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, + 0x08, 0x22, 0x03, 0x21, 0xe0, 0xe7, 0x03, 0x46, 0x01, 0x22, 0x00, 0x21, + 0x02, 0xe0, 0x03, 0x46, 0x06, 0x22, 0x01, 0x21, 0x35, 0x48, 0xd7, 0xe7, + 0x38, 0xb5, 0x04, 0x46, 0xe0, 0x07, 0x32, 0x4d, 0x05, 0xd5, 0x01, 0x23, + 0x02, 0x22, 0x01, 0x21, 0x28, 0x46, 0xff, 0xf7, 0xcd, 0xff, 0xa0, 0x07, + 0x07, 0xd5, 0x28, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x01, 0x23, + 0x04, 0x22, 0x02, 0x21, 0xc2, 0xe7, 0x31, 0xbd, 0x01, 0x46, 0x00, 0x20, + 0x27, 0x4a, 0xcb, 0x07, 0x44, 0xbf, 0x10, 0x78, 0xc0, 0xf3, 0x40, 0x00, + 0x89, 0x07, 0x03, 0xd5, 0x11, 0x78, 0xc1, 0xf3, 0x80, 0x01, 0x08, 0x43, + 0x80, 0xf0, 0x01, 0x00, 0x70, 0x47, 0x22, 0x49, 0x08, 0x78, 0x49, 0x78, + 0x01, 0xf0, 0x0f, 0x01, 0x0c, 0xe0, 0x20, 0x49, 0x48, 0x78, 0x09, 0x78, + 0x01, 0xf0, 0x0f, 0x01, 0x06, 0xe0, 0x1e, 0x49, 0x00, 0xe0, 0x1e, 0x49, + 0x48, 0x78, 0x09, 0x78, 0x01, 0xf0, 0x07, 0x01, 0x40, 0xea, 0x01, 0x20, + 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46, 0xe3, 0xb2, 0xff, 0x22, 0x00, 0x21, + 0x18, 0x48, 0xff, 0xf7, 0x93, 0xff, 0x23, 0x0a, 0xbd, 0xe8, 0x10, 0x40, + 0x0f, 0x22, 0x00, 0x21, 0x15, 0x48, 0x8b, 0xe7, 0x14, 0x48, 0x01, 0x78, + 0x40, 0x78, 0x01, 0xf0, 0x0f, 0x01, 0xe7, 0xe7, 0x10, 0xb5, 0x04, 0x46, + 0xe3, 0xb2, 0xff, 0x22, 0x00, 0x21, 0x10, 0x48, 0xff, 0xf7, 0x7e, 0xff, + 0x23, 0x0a, 0xbd, 0xe8, 0x10, 0x40, 0x0f, 0x22, 0x00, 0x21, 0x0d, 0x48, + 0x76, 0xe7, 0x0c, 0x48, 0x01, 0x78, 0x40, 0x78, 0x01, 0xf0, 0x0f, 0x01, + 0xd2, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x50, 0x47, 0x19, 0x00, 0x00, 0x47, + 0x05, 0x00, 0x50, 0x47, 0x07, 0x00, 0x50, 0x47, 0x09, 0x00, 0x50, 0x47, + 0x0b, 0x00, 0x50, 0x47, 0x02, 0x00, 0x50, 0x47, 0x01, 0x00, 0x50, 0x47, + 0x04, 0x00, 0x50, 0x47, 0x03, 0x00, 0x50, 0x47, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, 0x0d, 0xf8, 0x01, 0x70, + 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, + 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x70, 0x47, + 0xdf, 0xf8, 0x64, 0x19, 0x51, 0xf8, 0x20, 0x00, 0x00, 0x68, 0xc0, 0xf3, + 0xc1, 0x00, 0x70, 0x47, 0xdf, 0xf8, 0x58, 0x29, 0x91, 0x42, 0x34, 0xbf, + 0x9f, 0xed, 0xbd, 0x0a, 0x9f, 0xed, 0xbd, 0x0a, 0x80, 0xed, 0x01, 0x0a, + 0x70, 0x47, 0x2d, 0xe9, 0xf3, 0x4f, 0x85, 0xb0, 0xdf, 0xf8, 0x38, 0x19, + 0x00, 0x90, 0x15, 0x46, 0x51, 0xf8, 0x20, 0x70, 0x38, 0x68, 0xc0, 0xf3, + 0xc1, 0x00, 0x04, 0x90, 0x38, 0x68, 0x00, 0xf0, 0x01, 0x0a, 0x38, 0x68, + 0xc0, 0xf3, 0x40, 0x00, 0x03, 0x90, 0x38, 0x68, 0xc0, 0xf3, 0x80, 0x00, + 0x02, 0x90, 0x9d, 0xf8, 0x14, 0x00, 0xee, 0xf7, 0x70, 0xfd, 0x80, 0x46, + 0xdf, 0xf8, 0x0c, 0x19, 0x00, 0x98, 0x51, 0xf8, 0x20, 0x60, 0x56, 0xf8, + 0x04, 0x0f, 0xc0, 0xf3, 0xc1, 0x00, 0x01, 0x90, 0x30, 0x68, 0x34, 0x68, + 0xc0, 0xf3, 0x41, 0x1b, 0xa4, 0x0f, 0x30, 0x68, 0x00, 0x2d, 0xc0, 0xf3, + 0x01, 0x29, 0x42, 0xd0, 0x06, 0x9d, 0x04, 0x99, 0x2b, 0x78, 0x99, 0x42, + 0x01, 0xd0, 0x00, 0xf0, 0x96, 0xf8, 0x6b, 0x78, 0x9a, 0x45, 0x03, 0xd0, + 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x91, 0xf8, 0xab, 0x78, 0x03, 0x98, + 0x98, 0x42, 0x03, 0xd0, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, 0x89, 0xf8, + 0xeb, 0x78, 0x02, 0x98, 0x98, 0x42, 0x03, 0xd0, 0x04, 0x22, 0x02, 0x21, + 0x00, 0xf0, 0x81, 0xf8, 0x6b, 0x79, 0x01, 0x98, 0x98, 0x42, 0x01, 0xd0, + 0x00, 0xf0, 0x75, 0xf8, 0xeb, 0x79, 0x9b, 0x45, 0x03, 0xd0, 0x60, 0x22, + 0x05, 0x21, 0x00, 0xf0, 0x20, 0xf9, 0xab, 0x79, 0x9c, 0x42, 0x04, 0xd0, + 0x4f, 0xf0, 0x40, 0x42, 0x1e, 0x21, 0x00, 0xf0, 0x18, 0xf9, 0x2b, 0x79, + 0x99, 0x45, 0x01, 0xd0, 0x00, 0xf0, 0x10, 0xf9, 0xb8, 0xf1, 0x00, 0x0f, + 0x5a, 0xd0, 0x9d, 0xf8, 0x14, 0x00, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, + 0x00, 0x21, 0xee, 0xf7, 0x20, 0xbd, 0xdf, 0xf8, 0x64, 0x08, 0x00, 0x9a, + 0x01, 0x68, 0x0a, 0x44, 0xed, 0x20, 0x92, 0xf8, 0xbc, 0x30, 0x43, 0x43, + 0xc8, 0x18, 0x00, 0xf2, 0x44, 0x40, 0x00, 0xf1, 0x78, 0x05, 0x04, 0x99, + 0xeb, 0x78, 0x99, 0x42, 0x01, 0xd0, 0x00, 0xf0, 0x46, 0xf8, 0x2b, 0x78, + 0x9a, 0x45, 0x03, 0xd0, 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x41, 0xf8, + 0x6b, 0x78, 0x03, 0x98, 0x98, 0x42, 0x03, 0xd0, 0x02, 0x22, 0x01, 0x21, + 0x00, 0xf0, 0x39, 0xf8, 0xab, 0x78, 0x02, 0x98, 0x98, 0x42, 0x03, 0xd0, + 0x04, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x31, 0xf8, 0x2b, 0x7b, 0x01, 0x98, + 0x98, 0x42, 0x01, 0xd0, 0x00, 0xf0, 0x25, 0xf8, 0xab, 0x7b, 0x9b, 0x45, + 0x03, 0xd0, 0x60, 0x22, 0x05, 0x21, 0x00, 0xf0, 0xd0, 0xf8, 0x6b, 0x7b, + 0x9c, 0x42, 0x04, 0xd0, 0x4f, 0xf0, 0x40, 0x42, 0x1e, 0x21, 0x00, 0xf0, + 0xc8, 0xf8, 0xeb, 0x7a, 0x99, 0x45, 0x01, 0xd0, 0x00, 0xf0, 0xc0, 0xf8, + 0x29, 0x79, 0x88, 0x45, 0x1c, 0xbf, 0x9d, 0xf8, 0x14, 0x00, 0xee, 0xf7, + 0xd4, 0xfc, 0x9d, 0xf8, 0x14, 0x00, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, + 0x04, 0xf0, 0xb4, 0xbd, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x18, 0x22, + 0x03, 0x21, 0x30, 0x46, 0x0d, 0xe7, 0x18, 0x22, 0x03, 0x21, 0x38, 0x46, + 0x09, 0xe7, 0x70, 0xb5, 0x04, 0x46, 0xdf, 0xf8, 0x98, 0x07, 0x25, 0x46, + 0x50, 0xf8, 0x25, 0x00, 0x4b, 0x1e, 0x0e, 0x46, 0x9b, 0x41, 0xdb, 0x0f, + 0x01, 0x22, 0x00, 0x21, 0x14, 0x30, 0xff, 0xf7, 0xfa, 0xfe, 0x86, 0xb9, + 0xdf, 0xf8, 0x84, 0x17, 0x0a, 0x68, 0x64, 0x20, 0x45, 0x43, 0x50, 0x19, + 0x00, 0xf5, 0xff, 0x60, 0x00, 0xf1, 0x34, 0x02, 0x01, 0x1d, 0x20, 0x46, + 0xbd, 0xe8, 0x70, 0x40, 0x00, 0x23, 0xee, 0xf7, 0x1c, 0xbc, 0x70, 0xbd, + 0x10, 0xb5, 0xdf, 0xf8, 0x64, 0x17, 0x51, 0xf8, 0x20, 0x40, 0x24, 0x1d, + 0x00, 0x23, 0x01, 0x22, 0x00, 0xf0, 0x49, 0xf8, 0x00, 0xf0, 0x16, 0xf9, + 0x00, 0xf0, 0x46, 0xf8, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x23, + 0x04, 0x22, 0x22, 0xe0, 0x70, 0xb5, 0xdf, 0xf8, 0x40, 0x67, 0x04, 0x46, + 0xdf, 0xf8, 0x34, 0x07, 0x50, 0xf8, 0x24, 0x50, 0x30, 0x68, 0x20, 0x44, + 0x2d, 0x1d, 0x90, 0xf8, 0xa4, 0x30, 0x01, 0x22, 0x00, 0x21, 0x28, 0x46, + 0xff, 0xf7, 0xc1, 0xfe, 0x32, 0x68, 0x22, 0x44, 0x01, 0x21, 0x92, 0xf8, + 0xac, 0x30, 0x02, 0x22, 0x28, 0x46, 0xff, 0xf7, 0xb8, 0xfe, 0x30, 0x68, + 0x20, 0x44, 0x04, 0x22, 0x90, 0xf8, 0xb4, 0x30, 0x28, 0x46, 0xbd, 0xe8, + 0x70, 0x40, 0x02, 0x21, 0xad, 0xe6, 0x10, 0xb5, 0xdf, 0xf8, 0xf0, 0x16, + 0x51, 0xf8, 0x20, 0x40, 0x00, 0x23, 0x4f, 0xf4, 0x40, 0x72, 0x08, 0x21, + 0x00, 0xf0, 0x10, 0xf8, 0x00, 0x23, 0x03, 0x22, 0x00, 0xf0, 0x0b, 0xf8, + 0x01, 0x23, 0x1c, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x07, 0xf8, 0x20, 0x46, + 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x23, 0xe0, 0x22, 0x2a, 0xe0, 0x00, 0x21, + 0x20, 0x46, 0x90, 0xe6, 0x70, 0xb5, 0x04, 0x46, 0xdf, 0xf8, 0xb4, 0x06, + 0xdf, 0xf8, 0xb4, 0x56, 0x50, 0xf8, 0x24, 0x60, 0x28, 0x68, 0x20, 0x44, + 0x4f, 0xf4, 0x40, 0x72, 0x90, 0xf8, 0x5c, 0x33, 0x00, 0xf0, 0x20, 0xf8, + 0x2a, 0x68, 0x22, 0x44, 0x00, 0x21, 0x92, 0xf8, 0x64, 0x33, 0x03, 0x22, + 0x00, 0xf0, 0x19, 0xf8, 0x28, 0x68, 0x20, 0x44, 0x1c, 0x22, 0x90, 0xf8, + 0x6c, 0x33, 0x02, 0x21, 0x00, 0xf0, 0x11, 0xf8, 0x28, 0x68, 0x20, 0x44, + 0xe0, 0x22, 0x90, 0xf8, 0x74, 0x33, 0x30, 0x46, 0xbd, 0xe8, 0x70, 0x40, + 0x05, 0x21, 0x66, 0xe6, 0x86, 0x37, 0x54, 0x36, 0x05, 0xc6, 0xa9, 0x34, + 0x4f, 0xf4, 0x40, 0x72, 0x08, 0x21, 0x30, 0x46, 0x5d, 0xe6, 0x10, 0xb5, + 0xdf, 0xf8, 0x58, 0x16, 0x51, 0xf8, 0x20, 0x40, 0x00, 0xf0, 0x24, 0xf8, + 0x04, 0xf1, 0x50, 0x00, 0xff, 0xf7, 0x53, 0xfe, 0x00, 0xf0, 0x1e, 0xf8, + 0x04, 0xf1, 0x60, 0x00, 0xff, 0xf7, 0x4d, 0xfe, 0x00, 0xf0, 0x18, 0xf8, + 0x04, 0xf1, 0x70, 0x00, 0xff, 0xf7, 0x47, 0xfe, 0x00, 0xf0, 0x12, 0xf8, + 0x04, 0xf1, 0x8c, 0x00, 0xff, 0xf7, 0x41, 0xfe, 0x00, 0xf0, 0x0c, 0xf8, + 0x04, 0xf1, 0x9c, 0x00, 0xff, 0xf7, 0x3b, 0xfe, 0x04, 0xf1, 0xac, 0x00, + 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x23, 0x4f, 0xf0, 0x00, 0x42, 0x47, 0xe0, + 0x00, 0x23, 0x4f, 0xf0, 0x00, 0x42, 0x1f, 0x21, 0x70, 0x47, 0x70, 0xb5, + 0x04, 0x46, 0xdf, 0xf8, 0xf8, 0x05, 0xdf, 0xf8, 0xf0, 0x65, 0x50, 0xf8, + 0x24, 0x50, 0x30, 0x68, 0x04, 0xeb, 0x44, 0x04, 0x20, 0x44, 0x4f, 0xf0, + 0x00, 0x42, 0x90, 0xf8, 0xc0, 0x30, 0x1f, 0x21, 0x05, 0xf1, 0x50, 0x00, + 0xff, 0xf7, 0x19, 0xfe, 0x31, 0x68, 0x21, 0x44, 0x4f, 0xf0, 0x00, 0x42, + 0x91, 0xf8, 0xc1, 0x30, 0x1f, 0x21, 0x05, 0xf1, 0x60, 0x00, 0xff, 0xf7, + 0x0e, 0xfe, 0x00, 0xf0, 0x23, 0xf8, 0x90, 0xf8, 0xc2, 0x30, 0x1f, 0x21, + 0x05, 0xf1, 0x70, 0x00, 0xff, 0xf7, 0x05, 0xfe, 0x00, 0xf0, 0x1a, 0xf8, + 0x90, 0xf8, 0xd8, 0x30, 0x1f, 0x21, 0x05, 0xf1, 0x8c, 0x00, 0xff, 0xf7, + 0xfc, 0xfd, 0x00, 0xf0, 0x11, 0xf8, 0x90, 0xf8, 0xd9, 0x30, 0x1f, 0x21, + 0x05, 0xf1, 0x9c, 0x00, 0xff, 0xf7, 0xf3, 0xfd, 0x00, 0xf0, 0x08, 0xf8, + 0x90, 0xf8, 0xda, 0x30, 0x05, 0xf1, 0xac, 0x00, 0xbd, 0xe8, 0x70, 0x40, + 0x1f, 0x21, 0xe8, 0xe5, 0x30, 0x68, 0x20, 0x44, 0x4f, 0xf0, 0x00, 0x42, + 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, 0x1b, 0xf8, 0xf1, 0xf7, 0x50, 0xff, + 0x38, 0xb9, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x23, 0x02, 0x22, + 0x01, 0x21, 0x02, 0xf0, 0xbc, 0xbf, 0x10, 0xbd, 0x38, 0xb5, 0x05, 0x46, + 0x00, 0xf0, 0x0c, 0xf8, 0xf1, 0xf7, 0x5a, 0xff, 0x00, 0xf0, 0x07, 0xf8, + 0x28, 0x46, 0x02, 0xf0, 0xda, 0xff, 0x04, 0xb9, 0x04, 0x46, 0x20, 0x46, + 0x32, 0xbd, 0x04, 0x46, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, 0x70, 0x47, + 0x10, 0xb5, 0x04, 0x46, 0x2d, 0xed, 0x02, 0x8b, 0xdf, 0xf8, 0x1c, 0x05, + 0x82, 0xb0, 0x81, 0x42, 0x0c, 0xbf, 0x9f, 0xed, 0xab, 0x8a, 0x9f, 0xed, + 0xab, 0x8a, 0x68, 0x46, 0xe4, 0xf7, 0xf8, 0xfa, 0xef, 0xf7, 0xe9, 0xff, + 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x9f, 0xed, 0xa6, 0x1a, + 0x81, 0xee, 0x00, 0x1a, 0xf7, 0xee, 0x00, 0x1a, 0xc1, 0xee, 0x81, 0x1a, + 0x9f, 0xed, 0xa3, 0x2a, 0x31, 0xee, 0x82, 0x2a, 0xb7, 0xee, 0x00, 0x0a, + 0x80, 0xee, 0x02, 0x0a, 0x9f, 0xed, 0xa0, 0x1a, 0x30, 0xee, 0x01, 0x1a, + 0xdf, 0xed, 0x9f, 0x1a, 0xc1, 0xee, 0x81, 0x1a, 0x9f, 0xed, 0x9e, 0x2a, + 0xdf, 0xed, 0x9e, 0x0a, 0x81, 0xee, 0x82, 0x2a, 0x9d, 0xed, 0x00, 0x0a, + 0x78, 0xee, 0x20, 0x0a, 0x80, 0xee, 0x02, 0x0a, 0x9f, 0xed, 0x9a, 0x1a, + 0x00, 0xee, 0x80, 0x1a, 0xdf, 0xed, 0x99, 0x0a, 0x81, 0xee, 0x20, 0x0a, + 0xd6, 0xf7, 0x78, 0xf9, 0x00, 0xf0, 0xc8, 0xf8, 0x08, 0xd5, 0x00, 0x21, + 0x89, 0xb2, 0x20, 0x46, 0x00, 0xf0, 0xd5, 0xf9, 0x02, 0xb0, 0xbd, 0xec, + 0x02, 0x8b, 0x10, 0xbd, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x1a, + 0x88, 0xb2, 0xb0, 0xf5, 0x80, 0x7f, 0xef, 0xd3, 0xff, 0x21, 0xed, 0xe7, + 0xf8, 0xb5, 0x07, 0x46, 0x06, 0x98, 0x0d, 0x46, 0x1e, 0x46, 0x3c, 0x46, + 0x48, 0xb3, 0x00, 0x2a, 0x07, 0xbf, 0x00, 0x21, 0x01, 0x22, 0x01, 0x21, + 0x00, 0x22, 0x20, 0x46, 0xf0, 0xf7, 0x29, 0xfa, 0x00, 0x21, 0x38, 0x46, + 0x02, 0xf0, 0xa4, 0xfd, 0x07, 0x46, 0x00, 0xee, 0x10, 0x5a, 0x00, 0xee, + 0x90, 0x7a, 0xb8, 0xee, 0x40, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x80, 0xee, + 0x20, 0x0a, 0xe3, 0xf7, 0x9d, 0xff, 0x00, 0x20, 0xbd, 0xee, 0xc0, 0x0a, + 0x00, 0x90, 0x10, 0xee, 0x10, 0x1a, 0x07, 0xfb, 0x11, 0x55, 0x00, 0x23, + 0x2a, 0x46, 0x31, 0x46, 0x20, 0x46, 0xf0, 0xf7, 0xfc, 0xf8, 0x05, 0x46, + 0x09, 0xe0, 0x00, 0x21, 0x20, 0x46, 0xf0, 0xf7, 0x98, 0xf9, 0x05, 0x46, + 0x00, 0x22, 0x00, 0x21, 0x20, 0x46, 0xf0, 0xf7, 0xfe, 0xf9, 0x28, 0x46, + 0xf2, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0xdb, 0xb2, 0x2d, 0xed, 0x02, 0x8b, + 0x03, 0x2b, 0x04, 0x46, 0xb0, 0xee, 0x40, 0x8a, 0x0d, 0x46, 0x16, 0x46, + 0x07, 0xda, 0x0f, 0xf2, 0x50, 0x47, 0xfa, 0x5c, 0x01, 0x21, 0xa1, 0x40, + 0x01, 0x20, 0x07, 0xf0, 0x75, 0xf8, 0x08, 0x9b, 0xb0, 0xee, 0x48, 0x0a, + 0xbd, 0xec, 0x02, 0x8b, 0x32, 0x46, 0x29, 0x46, 0x20, 0x46, 0x01, 0xb0, + 0xbd, 0xe8, 0xf0, 0x40, 0xf8, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x8e, 0xb0, + 0x05, 0x46, 0xb0, 0xee, 0x40, 0x8a, 0x0c, 0x46, 0x17, 0x46, 0x1e, 0x46, + 0xe5, 0xf7, 0xcb, 0xf8, 0x40, 0xf2, 0x2b, 0x31, 0xb0, 0xfb, 0xf1, 0xf1, + 0x01, 0x22, 0x8d, 0xf8, 0x04, 0x20, 0x03, 0x23, 0x00, 0x22, 0x8f, 0x42, + 0x88, 0xbf, 0x0f, 0x46, 0x03, 0x97, 0x8d, 0xf8, 0x18, 0x30, 0x05, 0x92, + 0x9f, 0xed, 0xc7, 0x0a, 0xdd, 0xed, 0x03, 0x0a, 0x00, 0x95, 0xf8, 0xee, + 0x60, 0x0a, 0x60, 0xee, 0x88, 0x0a, 0x02, 0x94, 0x80, 0xee, 0x80, 0x0a, + 0xf4, 0xf7, 0x5a, 0xfb, 0xbc, 0xee, 0xc0, 0x0a, 0x8d, 0xed, 0x04, 0x0a, + 0x68, 0x46, 0x07, 0xf0, 0x59, 0xfa, 0x04, 0x00, 0x06, 0xd1, 0x0a, 0x21, + 0x28, 0x46, 0x07, 0xf0, 0xc7, 0xfa, 0x40, 0x1e, 0x01, 0x28, 0x08, 0xd9, + 0xbc, 0xb9, 0x07, 0xa9, 0x68, 0x46, 0x07, 0xf0, 0xc3, 0xfa, 0x40, 0xb1, + 0x40, 0x1e, 0x02, 0x28, 0x02, 0xd8, 0x4f, 0xf4, 0xc1, 0x64, 0x0c, 0xe0, + 0x40, 0xf2, 0x04, 0x64, 0x09, 0xe0, 0x44, 0xb9, 0x9d, 0xed, 0x0b, 0x0a, + 0x00, 0xf0, 0x0a, 0xf8, 0x94, 0xbf, 0x40, 0xf2, 0x02, 0x64, 0x86, 0xed, + 0x00, 0x0a, 0x0e, 0xb0, 0x20, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xf2, 0xbd, + 0xb5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x70, 0x47, 0x38, 0xb5, + 0x0d, 0x46, 0x04, 0x46, 0x00, 0x21, 0x00, 0xf0, 0x24, 0xf9, 0x29, 0x78, + 0x20, 0x46, 0xbd, 0xe8, 0x34, 0x40, 0x37, 0xe1, 0x2d, 0xe9, 0xfc, 0x41, + 0x04, 0x46, 0x90, 0x46, 0x01, 0x25, 0x0e, 0x46, 0x00, 0xf0, 0x44, 0xf9, + 0xb7, 0x49, 0x88, 0x45, 0x37, 0x46, 0x05, 0xd1, 0x01, 0x28, 0x31, 0xd1, + 0x30, 0xb1, 0xd7, 0xf8, 0x0d, 0x00, 0x05, 0xe0, 0xb3, 0x49, 0x88, 0x45, + 0x15, 0xd1, 0x00, 0xbb, 0xd7, 0xf8, 0x01, 0x00, 0x00, 0x90, 0x20, 0x46, + 0x9d, 0xf8, 0x00, 0x10, 0x00, 0xf0, 0x01, 0xf9, 0x9d, 0xf8, 0x01, 0x10, + 0x20, 0x46, 0x00, 0xf0, 0x15, 0xf9, 0xbd, 0xf8, 0x02, 0x10, 0x20, 0x46, + 0x00, 0xf0, 0xdb, 0xf8, 0x28, 0x46, 0xbd, 0xe8, 0xf6, 0x81, 0xa8, 0x49, + 0x88, 0x45, 0x08, 0xbf, 0x37, 0x1d, 0xdd, 0xd0, 0xa2, 0x49, 0x88, 0x45, + 0x0c, 0xd1, 0x30, 0xb9, 0x06, 0xf1, 0x08, 0x07, 0xde, 0xe7, 0x01, 0x28, + 0x06, 0xd1, 0x37, 0x1d, 0xd3, 0xe7, 0x01, 0x28, 0x08, 0xbf, 0x06, 0xf1, + 0x08, 0x07, 0xce, 0xd0, 0x00, 0x25, 0xe5, 0xe7, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x66, 0x86, 0x3f, 0x00, 0x00, 0x00, 0x42, 0x9a, 0x99, 0x99, 0x3f, + 0x49, 0x92, 0x24, 0x3f, 0x00, 0xe0, 0x88, 0x45, 0x00, 0xe0, 0x6e, 0x45, + 0x66, 0x66, 0xe6, 0x3e, 0x66, 0x66, 0xe6, 0xbe, 0x29, 0x5c, 0x8f, 0x3d, + 0x2d, 0xe9, 0xf8, 0x43, 0x2d, 0xed, 0x02, 0x8b, 0x91, 0x49, 0x82, 0xb0, + 0x02, 0x46, 0x51, 0xf8, 0x22, 0x80, 0x08, 0xf1, 0x1d, 0x09, 0x69, 0x46, + 0x99, 0xf8, 0x00, 0x40, 0xe4, 0xf7, 0x48, 0xf9, 0x00, 0x25, 0x04, 0xf0, + 0x01, 0x04, 0x74, 0xb1, 0x00, 0x99, 0x8a, 0x48, 0x8a, 0x4a, 0x41, 0x18, + 0x91, 0x42, 0x22, 0xbf, 0x00, 0x98, 0x89, 0x49, 0x88, 0x42, 0x02, 0xd2, + 0x52, 0x26, 0x01, 0x27, 0x03, 0xe0, 0x42, 0x26, 0x00, 0xe0, 0x0e, 0x26, + 0x02, 0x27, 0x33, 0x46, 0xff, 0x22, 0x00, 0x21, 0x08, 0xf1, 0x1e, 0x00, + 0xff, 0xf7, 0x18, 0xfc, 0x33, 0x46, 0xff, 0x22, 0x00, 0x21, 0x08, 0xf1, + 0x1f, 0x00, 0xff, 0xf7, 0x11, 0xfc, 0x3b, 0x46, 0x06, 0x22, 0x01, 0x21, + 0x48, 0x46, 0xff, 0xf7, 0x0b, 0xfc, 0x00, 0xee, 0x10, 0x4a, 0xb8, 0xee, + 0x40, 0x8a, 0xef, 0xf7, 0x48, 0xfe, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, + 0x40, 0x0a, 0xfb, 0xee, 0x09, 0x0a, 0x70, 0xee, 0x20, 0x8a, 0x00, 0x98, + 0x73, 0x49, 0x9f, 0xed, 0x5a, 0x0a, 0x9f, 0xed, 0x5a, 0x1a, 0x01, 0xee, + 0x90, 0x6a, 0x08, 0xee, 0x00, 0x1a, 0xf8, 0xee, 0x61, 0x1a, 0xb3, 0xee, + 0x00, 0x2a, 0x88, 0x42, 0x21, 0xee, 0x21, 0x0a, 0x68, 0xee, 0x02, 0x0a, + 0x06, 0xd2, 0x9f, 0xed, 0x53, 0x1a, 0x70, 0xee, 0x81, 0x0a, 0x30, 0xee, + 0x80, 0x0a, 0x05, 0xe0, 0xdf, 0xed, 0x50, 0x1a, 0x70, 0xee, 0xa1, 0x1a, + 0x31, 0xee, 0x80, 0x0a, 0xe3, 0xf7, 0x3a, 0xfe, 0xf0, 0xee, 0x40, 0x0a, + 0xb3, 0xee, 0x0c, 0x1a, 0x9f, 0xed, 0x4b, 0x0a, 0x08, 0xee, 0x01, 0x0a, + 0xdf, 0xed, 0x4a, 0x2a, 0x68, 0xee, 0xa8, 0x1a, 0x9f, 0xed, 0x49, 0x2a, + 0xc8, 0xee, 0xa2, 0x2a, 0xb7, 0xee, 0x00, 0x1a, 0x81, 0xee, 0x82, 0x2a, + 0x32, 0xee, 0x81, 0x1a, 0x32, 0xee, 0x41, 0x1a, 0x70, 0xee, 0x60, 0x0a, + 0x01, 0xee, 0x20, 0x0a, 0xe3, 0xf7, 0x1c, 0xfe, 0xff, 0xf7, 0x10, 0xff, + 0x4b, 0xf2, 0x04, 0x30, 0x03, 0xd5, 0x05, 0x46, 0x9f, 0xed, 0x3e, 0x0a, + 0x09, 0xe0, 0xdf, 0xed, 0x3e, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0xa4, 0xbf, 0x05, 0x46, 0x9f, 0xed, 0x3b, 0x0a, 0xbd, 0xee, + 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0xc3, 0xb2, 0x3f, 0x22, 0x00, 0x21, + 0x08, 0xf1, 0x21, 0x00, 0xff, 0xf7, 0x9e, 0xfb, 0x02, 0xb0, 0x28, 0x46, + 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x83, 0x52, 0xe7, 0x38, 0xb5, + 0x00, 0xf0, 0x2d, 0xf8, 0x23, 0x0a, 0x03, 0x22, 0x00, 0x21, 0x05, 0xf1, + 0x19, 0x00, 0xff, 0xf7, 0x8d, 0xfb, 0xe3, 0xb2, 0x05, 0xf1, 0x1a, 0x00, + 0x1a, 0xe0, 0x36, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x00, 0xf1, 0x19, 0x02, + 0x1a, 0x30, 0x11, 0x78, 0x00, 0x78, 0x01, 0xf0, 0x03, 0x01, 0x00, 0xeb, + 0x01, 0x20, 0x80, 0xb2, 0x70, 0x47, 0x38, 0xb5, 0x00, 0xf0, 0x11, 0xf8, + 0x23, 0x46, 0xff, 0x22, 0x00, 0x21, 0x05, 0xf1, 0x14, 0x00, 0xff, 0xf7, + 0x71, 0xfb, 0x23, 0x46, 0x05, 0xf1, 0x16, 0x00, 0x01, 0xb0, 0xbd, 0xe8, + 0x30, 0x40, 0xff, 0x22, 0x00, 0x21, 0xff, 0xf7, 0x67, 0xbb, 0x0c, 0x46, + 0x24, 0x49, 0x51, 0xf8, 0x20, 0x50, 0x70, 0x47, 0x10, 0xb5, 0x22, 0x4c, + 0x54, 0xf8, 0x20, 0x00, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0xff, 0x22, + 0x00, 0x21, 0x18, 0x30, 0xff, 0xf7, 0x56, 0xbb, 0x00, 0x00, 0x7a, 0x44, + 0x1b, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x18, 0x30, 0x00, 0x78, 0x70, 0x47, + 0x18, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x1d, 0x30, 0x00, 0x78, 0x00, 0xf0, + 0x01, 0x00, 0x70, 0x47, 0xcd, 0xcc, 0xcc, 0x3d, 0x33, 0x33, 0xf3, 0xbe, + 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x0e, 0x42, 0x00, 0x00, 0x44, 0x42, + 0x00, 0x80, 0x0a, 0x43, 0x00, 0x20, 0x7d, 0x46, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x7c, 0x42, 0x00, 0x00, 0x7c, 0x42, 0x80, 0x98, 0x04, 0x02, + 0x80, 0xee, 0x36, 0x00, 0xc0, 0x97, 0x04, 0x02, 0x5c, 0x75, 0x02, 0x21, + 0x80, 0x9a, 0x04, 0x02, 0x60, 0x75, 0x02, 0x21, 0xa0, 0x9a, 0x04, 0x02, + 0x80, 0x1a, 0x06, 0x00, 0xb0, 0x1e, 0x04, 0x00, 0xe0, 0x93, 0x04, 0x00, + 0x68, 0x24, 0x05, 0x00, 0x20, 0x99, 0x04, 0x02, 0x7f, 0xb0, 0xed, 0xff, + 0xff, 0x9e, 0x24, 0x00, 0x81, 0x4f, 0x12, 0x00, 0x01, 0x6a, 0x18, 0x00, + 0x38, 0xb5, 0x0c, 0x46, 0xeb, 0xf7, 0x00, 0xfa, 0x00, 0x25, 0x10, 0xb1, + 0x01, 0x28, 0x0e, 0xd1, 0x01, 0x25, 0x29, 0x46, 0x20, 0x46, 0xe3, 0xf7, + 0x38, 0xff, 0x04, 0x00, 0x05, 0xd0, 0x23, 0x46, 0x04, 0xa2, 0x06, 0x21, + 0x01, 0x20, 0xe5, 0xf7, 0x40, 0xf9, 0x20, 0x46, 0x32, 0xbd, 0x4f, 0xf6, + 0x53, 0x74, 0xf4, 0xe7, 0x42, 0x42, 0x46, 0x3a, 0x20, 0x52, 0x65, 0x70, + 0x72, 0x6f, 0x67, 0x4c, 0x6f, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x58, + 0x20, 0x0a, 0x00, 0x00, 0x01, 0x02, 0x04, 0x00, 0x10, 0xb5, 0x03, 0x46, + 0x00, 0x24, 0x08, 0x46, 0x01, 0x2b, 0x19, 0x46, 0x01, 0xd1, 0x01, 0x2a, + 0x00, 0xe0, 0x00, 0x2b, 0x02, 0xd1, 0xe9, 0xf7, 0xb4, 0xfb, 0x01, 0xe0, + 0x4b, 0xf2, 0x11, 0x74, 0x20, 0x46, 0x10, 0xbd, 0x1f, 0xb5, 0x23, 0x4c, + 0x04, 0xf5, 0x03, 0x71, 0x01, 0x20, 0xf4, 0xf7, 0xc3, 0xfb, 0xa0, 0x60, + 0x20, 0xb9, 0x03, 0x22, 0x4f, 0xf6, 0x6f, 0x71, 0x01, 0xf0, 0xb3, 0xfb, + 0x00, 0x20, 0x4f, 0xf0, 0xff, 0x31, 0x1c, 0x4a, 0x02, 0xeb, 0x00, 0x12, + 0x40, 0x1c, 0x0c, 0x28, 0xd1, 0x60, 0xc2, 0xf8, 0xc8, 0x10, 0xf6, 0xd3, + 0x04, 0xf5, 0xce, 0x70, 0x17, 0x49, 0x02, 0x90, 0x05, 0x22, 0x01, 0x91, + 0x00, 0x92, 0x00, 0x23, 0x40, 0xf2, 0xee, 0x22, 0x14, 0xa1, 0x0f, 0xf2, + 0x59, 0x00, 0xf2, 0xf7, 0xdb, 0xfe, 0x60, 0x60, 0x20, 0xb9, 0x03, 0x22, + 0x4f, 0xf6, 0x0b, 0x71, 0x01, 0xf0, 0x91, 0xfb, 0x00, 0x20, 0x00, 0x90, + 0x04, 0xf5, 0xa6, 0x73, 0x04, 0xf1, 0x0c, 0x02, 0x10, 0x21, 0x14, 0x20, + 0xf4, 0xf7, 0x60, 0xfb, 0x20, 0x60, 0x20, 0xb9, 0x03, 0x22, 0x4f, 0xf6, + 0x1d, 0x71, 0x01, 0xf0, 0x80, 0xfb, 0xf5, 0xf7, 0x57, 0xf9, 0xbd, 0xe8, + 0x1f, 0x40, 0x05, 0xf0, 0x0b, 0xbb, 0x00, 0x00, 0xd4, 0x45, 0x02, 0x21, + 0x74, 0x28, 0x02, 0x21, 0x88, 0xac, 0x01, 0x21, 0x43, 0x54, 0x52, 0x4c, + 0x00, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0x99, 0xb0, 0x02, 0x22, + 0x00, 0x21, 0x00, 0x20, 0xf3, 0xf7, 0x4d, 0xfb, 0xf3, 0xf7, 0x45, 0xf9, + 0x00, 0x22, 0x00, 0x21, 0xf3, 0xf7, 0x47, 0xfb, 0xf3, 0xf7, 0x12, 0xfd, + 0x01, 0x22, 0x00, 0x21, 0xf3, 0xf7, 0x41, 0xfb, 0xdf, 0xf8, 0x9c, 0x08, + 0xdf, 0xf8, 0x9c, 0x58, 0x00, 0x69, 0x4f, 0xf4, 0x7a, 0x61, 0x07, 0xf0, + 0xe9, 0xf8, 0x4f, 0xf0, 0x00, 0x08, 0x29, 0x46, 0x5f, 0xfa, 0x88, 0xf0, + 0xf2, 0xf7, 0xd5, 0xf8, 0x08, 0xf1, 0x01, 0x08, 0x5f, 0xfa, 0x88, 0xf0, + 0x08, 0x28, 0xf4, 0xdb, 0xdf, 0xf8, 0x78, 0x18, 0xdf, 0xf8, 0x78, 0x28, + 0x0b, 0x68, 0x01, 0xf0, 0x0a, 0xfb, 0x00, 0x20, 0x05, 0xe0, 0x02, 0x20, + 0xf2, 0xf7, 0x4f, 0xff, 0xbd, 0xf8, 0x00, 0x00, 0x40, 0x1c, 0xad, 0xf8, + 0x00, 0x00, 0xbd, 0xf8, 0x00, 0x00, 0x64, 0x28, 0x07, 0xd2, 0xf5, 0xf7, + 0x4e, 0xfc, 0x00, 0x28, 0xef, 0xd0, 0x05, 0xf0, 0xb0, 0xfd, 0x00, 0x28, + 0xeb, 0xd0, 0xbd, 0xf8, 0x00, 0x00, 0x64, 0x28, 0x04, 0xd1, 0x03, 0x22, + 0x4f, 0xf6, 0x69, 0x71, 0x01, 0xf0, 0x1f, 0xfb, 0xdf, 0xf8, 0x34, 0x28, + 0x01, 0xf0, 0xe3, 0xfa, 0xdf, 0xf8, 0x30, 0x28, 0x01, 0xf0, 0xdf, 0xfa, + 0x02, 0x20, 0xf2, 0xf7, 0x2a, 0xff, 0xe3, 0xf7, 0xb2, 0xff, 0x01, 0x21, + 0xf2, 0xf7, 0x1d, 0xfc, 0x18, 0xb1, 0x01, 0x46, 0x03, 0x22, 0x01, 0xf0, + 0x0a, 0xfb, 0xe3, 0xf7, 0x80, 0xff, 0x30, 0xb1, 0xdf, 0xf8, 0x0c, 0x28, + 0x01, 0xf0, 0xcb, 0xfa, 0x01, 0x20, 0xe5, 0xf7, 0xa7, 0xf8, 0x07, 0xf0, + 0x78, 0xf9, 0xdf, 0xf8, 0x00, 0x88, 0x08, 0xf5, 0xc3, 0x71, 0x08, 0xf5, + 0xd0, 0x72, 0x0d, 0x91, 0x0b, 0x92, 0x08, 0xf5, 0xcc, 0x71, 0x08, 0xf5, + 0xc8, 0x72, 0x11, 0x91, 0x10, 0x92, 0x08, 0xf5, 0xf0, 0x71, 0x08, 0xf5, + 0xc6, 0x72, 0x0c, 0x91, 0x0f, 0x92, 0x08, 0xf5, 0xc2, 0x75, 0x4f, 0xf0, + 0x01, 0x09, 0x04, 0xe0, 0x01, 0x22, 0x4f, 0xf6, 0x25, 0x71, 0x01, 0xf0, + 0xe0, 0xfa, 0xdf, 0xf8, 0xc8, 0x07, 0x00, 0x68, 0x4f, 0xf0, 0xff, 0x32, + 0x07, 0xa9, 0xf4, 0xf7, 0xf8, 0xfb, 0x20, 0xb9, 0x02, 0x22, 0x4f, 0xf6, + 0x20, 0x71, 0x01, 0xf0, 0xd2, 0xfa, 0x9d, 0xf8, 0x1c, 0x00, 0x00, 0x28, + 0xe8, 0xd1, 0x9d, 0xf8, 0x20, 0x00, 0x8d, 0xf8, 0x14, 0x00, 0x00, 0x21, + 0x04, 0x91, 0x8a, 0x46, 0x9d, 0xf8, 0x14, 0x20, 0x09, 0x99, 0xcd, 0xf8, + 0x38, 0x90, 0x08, 0x2a, 0x8d, 0xf8, 0x0c, 0x90, 0x06, 0x91, 0x26, 0xda, + 0xdf, 0xf8, 0x84, 0x07, 0x50, 0xf8, 0x32, 0x30, 0x99, 0x42, 0x1d, 0xd2, + 0x00, 0x1d, 0x50, 0xf8, 0x32, 0x20, 0x02, 0xeb, 0x01, 0x12, 0x10, 0x7a, + 0x98, 0xb9, 0x10, 0x68, 0x93, 0x89, 0x47, 0x88, 0xbb, 0x42, 0x0b, 0xd0, + 0x03, 0x88, 0x53, 0x81, 0x04, 0x1d, 0x43, 0x88, 0x93, 0x81, 0x00, 0x27, + 0x03, 0x88, 0xad, 0xf8, 0x0e, 0x30, 0x82, 0xf8, 0x08, 0x90, 0x0a, 0xe0, + 0x4f, 0xf6, 0x08, 0x77, 0x07, 0xe0, 0x4f, 0xf6, 0x06, 0x77, 0x04, 0xe0, + 0x4f, 0xf6, 0x05, 0x77, 0x01, 0xe0, 0x4f, 0xf6, 0x04, 0x77, 0xbd, 0xf8, + 0x0e, 0x00, 0x02, 0x28, 0x18, 0xbf, 0x08, 0x28, 0x2c, 0xd0, 0x98, 0xf8, + 0x00, 0x00, 0xbd, 0xf8, 0x0e, 0x30, 0x08, 0xf1, 0x04, 0x02, 0x00, 0x01, + 0x13, 0x52, 0x08, 0xf1, 0x08, 0x00, 0x98, 0xf8, 0x00, 0x20, 0x9d, 0xf8, + 0x20, 0x30, 0x12, 0x01, 0x83, 0x54, 0x08, 0xf1, 0x0c, 0x00, 0x98, 0xf8, + 0x00, 0x20, 0x12, 0x01, 0x81, 0x50, 0x08, 0xf1, 0x10, 0x01, 0x98, 0xf8, + 0x00, 0x00, 0x0a, 0x9a, 0x00, 0x01, 0x0a, 0x50, 0x98, 0xf8, 0x00, 0x00, + 0xdf, 0xf8, 0xec, 0x26, 0x40, 0x1c, 0x88, 0xf8, 0x00, 0x00, 0xc0, 0xb2, + 0x0c, 0x28, 0x28, 0xbf, 0x88, 0xf8, 0x00, 0xa0, 0xbd, 0xf8, 0x0e, 0x30, + 0x01, 0xf0, 0x2d, 0xfa, 0x00, 0x2f, 0x41, 0xf0, 0xb3, 0x81, 0x08, 0xf2, + 0x89, 0x11, 0x08, 0xf5, 0xc4, 0x72, 0x12, 0x91, 0x01, 0x92, 0x08, 0xf2, + 0x8f, 0x11, 0xbd, 0xf8, 0x0e, 0x00, 0x08, 0xf2, 0x8b, 0x12, 0x4a, 0x28, + 0x02, 0x91, 0x00, 0x92, 0x01, 0xf2, 0x89, 0x81, 0xdf, 0xe8, 0x10, 0xf0, + 0x4b, 0x00, 0x53, 0x00, 0x5f, 0x00, 0x74, 0x00, 0x7b, 0x00, 0x83, 0x00, + 0xc6, 0x00, 0xcd, 0x00, 0xd5, 0x00, 0x0d, 0x01, 0x82, 0x01, 0xbc, 0x01, + 0x42, 0x02, 0x57, 0x02, 0x32, 0x01, 0x4b, 0x01, 0x84, 0x02, 0xce, 0x02, + 0xf1, 0x02, 0x1e, 0x03, 0x7a, 0x03, 0xc4, 0x03, 0xf8, 0x03, 0x4f, 0x04, + 0x26, 0x04, 0x7d, 0x05, 0x8a, 0x05, 0x3d, 0x05, 0x55, 0x05, 0x5b, 0x05, + 0xa3, 0x05, 0xaf, 0x05, 0xc1, 0x05, 0xc5, 0x05, 0xd4, 0x05, 0xf7, 0x05, + 0xb5, 0x05, 0x33, 0x06, 0xdf, 0x05, 0x6b, 0x06, 0x87, 0x09, 0x55, 0x01, + 0x6e, 0x01, 0xaa, 0x03, 0xb5, 0x03, 0xc0, 0x06, 0xe9, 0x07, 0x03, 0x08, + 0x64, 0x08, 0x9b, 0x06, 0xa8, 0x06, 0x97, 0x08, 0x8e, 0x00, 0x12, 0x08, + 0xb1, 0x07, 0x7a, 0x05, 0x1d, 0x02, 0x1e, 0x03, 0x7d, 0x09, 0x73, 0x09, + 0xee, 0x06, 0x4f, 0x07, 0x6d, 0x02, 0x49, 0x08, 0xe1, 0x04, 0x06, 0x05, + 0xa3, 0x04, 0xc8, 0x04, 0x22, 0x05, 0x28, 0x05, 0x2c, 0x05, 0x33, 0x05, + 0xb4, 0x08, 0x7d, 0x05, 0x8a, 0x05, 0xc5, 0xf8, 0x00, 0xa0, 0x01, 0x99, + 0x20, 0x68, 0x08, 0x60, 0x08, 0x20, 0x2e, 0x68, 0x77, 0xe2, 0x20, 0x68, + 0x61, 0x68, 0x22, 0x69, 0xe6, 0x68, 0xa3, 0x68, 0xcd, 0xe9, 0x00, 0x01, + 0x31, 0x46, 0x18, 0x46, 0xf5, 0xf7, 0xc6, 0xf9, 0x2c, 0xe0, 0x0d, 0xf1, + 0x01, 0x01, 0x68, 0x46, 0xf5, 0xf7, 0x4c, 0xfa, 0x9d, 0xf8, 0x00, 0x00, + 0x01, 0x28, 0x18, 0xbf, 0x00, 0x20, 0x28, 0x70, 0xca, 0x46, 0x9d, 0xf8, + 0x01, 0x00, 0x01, 0x28, 0x18, 0xbf, 0x00, 0x20, 0x68, 0x70, 0x00, 0x26, + 0x02, 0x20, 0xf7, 0xe0, 0x28, 0x46, 0xf5, 0xf7, 0x16, 0xfa, 0x06, 0x46, + 0xca, 0x46, 0xe4, 0x20, 0xf0, 0xe0, 0xf5, 0xf7, 0x09, 0xfa, 0x00, 0x26, + 0x00, 0x28, 0x40, 0xf0, 0xe1, 0x87, 0x00, 0xf0, 0xde, 0xbf, 0x20, 0x7a, + 0x61, 0x68, 0x01, 0x28, 0x20, 0x68, 0x0c, 0xbf, 0x01, 0x22, 0x00, 0x22, + 0x05, 0xf0, 0x95, 0xfa, 0x00, 0xf0, 0x7f, 0xbf, 0x20, 0x7d, 0xc5, 0xf8, + 0x00, 0xa0, 0x01, 0x28, 0x60, 0x68, 0x0c, 0xbf, 0x01, 0x26, 0x00, 0x26, + 0x00, 0x28, 0x1c, 0xbf, 0x20, 0x68, 0x10, 0xf0, 0x11, 0x0f, 0x04, 0xd0, + 0x61, 0x68, 0x32, 0x46, 0x05, 0xf0, 0x81, 0xfa, 0x28, 0x60, 0xa0, 0x68, + 0x40, 0xb1, 0x20, 0x68, 0x40, 0x06, 0x05, 0xd5, 0x28, 0x68, 0x18, 0xb9, + 0xa1, 0x68, 0x01, 0xf0, 0x64, 0xf9, 0x28, 0x60, 0xe0, 0x68, 0x00, 0x28, + 0x1c, 0xbf, 0x20, 0x68, 0x10, 0xf0, 0x26, 0x0f, 0x05, 0xd0, 0x28, 0x68, + 0x18, 0xb9, 0xe1, 0x68, 0x01, 0xf0, 0x57, 0xf9, 0x28, 0x60, 0x20, 0x69, + 0x40, 0xb1, 0x20, 0x68, 0x00, 0x07, 0x05, 0xd5, 0x28, 0x68, 0x18, 0xb9, + 0x21, 0x69, 0x01, 0xf0, 0x4c, 0xf9, 0x28, 0x60, 0x28, 0x68, 0xbb, 0xe1, + 0x01, 0x98, 0x05, 0xf0, 0x43, 0xfb, 0x01, 0xf0, 0x83, 0xf9, 0x24, 0x20, + 0x9e, 0xe0, 0x01, 0x98, 0x05, 0xf0, 0x1a, 0xfb, 0x01, 0xf0, 0x7c, 0xf9, + 0x5c, 0x21, 0x01, 0xf0, 0xb0, 0xb8, 0x01, 0xf0, 0x2c, 0xf9, 0x20, 0x78, + 0x08, 0xb9, 0x00, 0x26, 0x11, 0xe0, 0x01, 0x28, 0x08, 0xbf, 0x01, 0x26, + 0x0d, 0xd0, 0x02, 0x28, 0x07, 0xd1, 0x06, 0xf0, 0x11, 0xfd, 0x02, 0x26, + 0x38, 0xb9, 0x4f, 0xf6, 0x2a, 0x70, 0x28, 0x60, 0x03, 0xe0, 0x4f, 0xf6, + 0x2a, 0x71, 0x03, 0x26, 0x29, 0x60, 0x28, 0x68, 0xa0, 0xb9, 0xd4, 0xf8, + 0x01, 0x00, 0x13, 0x28, 0x04, 0xd2, 0x01, 0xf0, 0x08, 0xf9, 0xf5, 0xf7, + 0x9e, 0xf9, 0x0a, 0xe0, 0x30, 0x28, 0x06, 0xd3, 0x36, 0x28, 0x04, 0xd8, + 0x01, 0xf0, 0xff, 0xf8, 0x05, 0xf0, 0xce, 0xfa, 0x01, 0xe0, 0x4f, 0xf6, + 0x2a, 0x70, 0x28, 0x60, 0x28, 0x68, 0x20, 0xb9, 0x04, 0x98, 0x00, 0x1d, + 0xca, 0x46, 0x00, 0xf0, 0x56, 0xbd, 0x04, 0x21, 0x22, 0xe0, 0x01, 0xf0, + 0xf4, 0xf8, 0xd4, 0xf8, 0x01, 0x00, 0x13, 0x28, 0x12, 0xd3, 0x30, 0x28, + 0x01, 0xd3, 0x36, 0x28, 0x0e, 0xd9, 0x20, 0x78, 0x10, 0xb1, 0x06, 0xf0, + 0xd9, 0xfc, 0x48, 0xb1, 0xd4, 0xf8, 0x01, 0x00, 0xf0, 0x28, 0x08, 0xd1, + 0x22, 0x78, 0x01, 0x98, 0x04, 0xa9, 0x07, 0xf0, 0xdb, 0xfa, 0x01, 0xe0, + 0x4f, 0xf6, 0x2a, 0x70, 0x28, 0x60, 0x28, 0x68, 0x00, 0x28, 0x03, 0xbf, + 0xca, 0x46, 0x04, 0x99, 0x09, 0x1d, 0x04, 0x21, 0x00, 0xf0, 0x36, 0xbd, + 0x26, 0x78, 0x6b, 0x46, 0x02, 0xaa, 0x01, 0xa9, 0x30, 0x46, 0x07, 0xf0, + 0xc6, 0xfc, 0x2e, 0x71, 0xca, 0x46, 0x12, 0x98, 0x01, 0x99, 0x01, 0x60, + 0x08, 0xf5, 0xc7, 0x71, 0x9d, 0xf8, 0x00, 0x00, 0x88, 0xf8, 0x8d, 0x01, + 0x00, 0x26, 0x02, 0x98, 0x08, 0x60, 0x00, 0x21, 0x29, 0x60, 0x0e, 0x20, + 0x20, 0xe0, 0x20, 0x78, 0x62, 0x79, 0xd4, 0xf8, 0x01, 0x10, 0x07, 0xf0, + 0x53, 0xfc, 0x01, 0xf0, 0xd2, 0xf8, 0x00, 0xf0, 0xbb, 0xbe, 0xe4, 0xf7, + 0x23, 0xfd, 0x01, 0x46, 0x20, 0x78, 0xc5, 0xf8, 0x00, 0xa0, 0x01, 0x40, + 0x00, 0x20, 0x21, 0xfa, 0x00, 0xf2, 0xd2, 0x07, 0x03, 0xd4, 0x40, 0x1c, + 0x08, 0x28, 0xf8, 0xd3, 0x02, 0xe0, 0x01, 0x99, 0xf1, 0xf7, 0xc3, 0xfd, + 0x28, 0x68, 0x01, 0xf0, 0xe4, 0xf8, 0x86, 0x20, 0x01, 0xf0, 0x0d, 0xb8, + 0xe4, 0xf7, 0x0a, 0xfd, 0x06, 0x46, 0x20, 0x78, 0xc5, 0xf8, 0x00, 0xa0, + 0x06, 0x40, 0x26, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x03, 0xd5, 0x61, 0x1c, + 0x38, 0x46, 0xf1, 0xf7, 0x74, 0xfd, 0x7f, 0x1c, 0x08, 0x2f, 0xf4, 0xd3, + 0x28, 0x68, 0xff, 0xe0, 0x06, 0xf0, 0x70, 0xfc, 0x01, 0x46, 0x20, 0x78, + 0x00, 0x26, 0x02, 0x28, 0x08, 0xbf, 0x01, 0x29, 0x07, 0xd1, 0xc5, 0xf8, + 0x00, 0xa0, 0xe9, 0xf7, 0x93, 0xfc, 0x01, 0x9a, 0x10, 0x60, 0x51, 0x60, + 0x26, 0xe0, 0x03, 0x28, 0x08, 0xbf, 0x01, 0x29, 0x09, 0xd1, 0xc5, 0xf8, + 0x00, 0xa0, 0xe9, 0xf7, 0x83, 0xfc, 0x01, 0x9a, 0x10, 0x60, 0x51, 0x60, + 0xc5, 0xf8, 0x00, 0xa0, 0x18, 0xe0, 0x01, 0x28, 0x04, 0xd0, 0x20, 0xb1, + 0x4b, 0xf2, 0x03, 0x70, 0x28, 0x60, 0xab, 0xe0, 0x01, 0x26, 0x31, 0x46, + 0x68, 0x46, 0xe3, 0xf7, 0x74, 0xfc, 0x28, 0x60, 0x01, 0x9a, 0x00, 0x9b, + 0x4f, 0xf4, 0x7a, 0x70, 0xa0, 0xfb, 0x03, 0x01, 0x10, 0x60, 0x51, 0x60, + 0x28, 0x68, 0x08, 0xb1, 0x00, 0xf0, 0x9a, 0xb8, 0xca, 0x46, 0x97, 0xe0, + 0x06, 0xf0, 0x36, 0xfc, 0x21, 0x78, 0x02, 0x46, 0x03, 0x29, 0x4b, 0xf2, + 0x03, 0x70, 0x3f, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, 0x22, 0x2f, 0x02, 0x0e, + 0x01, 0x2a, 0x39, 0xd1, 0xd4, 0xf8, 0x01, 0x00, 0xd4, 0xf8, 0x05, 0x10, + 0xe9, 0xf7, 0x8e, 0xfb, 0x28, 0x60, 0xc5, 0xf8, 0x00, 0xa0, 0x30, 0xe0, + 0x01, 0x2a, 0x2d, 0xd1, 0xd4, 0xf8, 0x01, 0x00, 0xd4, 0xf8, 0x05, 0x10, + 0xbd, 0x4a, 0x13, 0x68, 0x03, 0xf6, 0x0a, 0x4c, 0xcc, 0xf8, 0x00, 0x00, + 0xcc, 0xf8, 0x04, 0x10, 0x11, 0x68, 0x81, 0xf8, 0x12, 0x9c, 0xe9, 0xf7, + 0x10, 0xfb, 0x1b, 0xe0, 0x01, 0xf0, 0x0e, 0xf8, 0x28, 0x60, 0xc0, 0xb9, + 0x01, 0xf0, 0x46, 0xf8, 0x00, 0x21, 0xe3, 0xf7, 0xa4, 0xfb, 0x28, 0x60, + 0x00, 0x24, 0x00, 0x20, 0x0b, 0xe0, 0x01, 0xf0, 0x01, 0xf8, 0x28, 0x60, + 0x58, 0xb9, 0x01, 0xf0, 0x39, 0xf8, 0x01, 0x21, 0xe3, 0xf7, 0x97, 0xfb, + 0x28, 0x60, 0x01, 0x24, 0x01, 0x20, 0x01, 0xf0, 0xad, 0xf9, 0x00, 0xe0, + 0x28, 0x60, 0x28, 0x68, 0x80, 0xb9, 0xe4, 0xf7, 0x71, 0xfc, 0x04, 0x46, + 0x00, 0x26, 0x24, 0xfa, 0x06, 0xf0, 0xc0, 0x07, 0x44, 0xbf, 0xf0, 0xb2, + 0xff, 0xf7, 0x0c, 0xfb, 0x76, 0x1c, 0x08, 0x2e, 0xf5, 0xd3, 0xef, 0xf7, + 0x8b, 0xfe, 0x28, 0x60, 0x28, 0x68, 0x01, 0xf0, 0x34, 0xf8, 0x00, 0xf0, + 0x67, 0xbf, 0x22, 0x78, 0x03, 0x2a, 0x1c, 0xd8, 0xdf, 0xe8, 0x02, 0xf0, + 0x0b, 0x12, 0x02, 0x08, 0xe9, 0xf7, 0xfc, 0xfb, 0x01, 0x22, 0xe9, 0xf7, + 0x35, 0xfb, 0x14, 0xe0, 0xe9, 0xf7, 0xcb, 0xfa, 0x11, 0xe0, 0x00, 0x21, + 0x68, 0x46, 0xe3, 0xf7, 0xf0, 0xfb, 0x00, 0x98, 0x00, 0x21, 0x05, 0xe0, + 0x01, 0x21, 0x68, 0x46, 0xe3, 0xf7, 0xe9, 0xfb, 0x00, 0x98, 0x01, 0x21, + 0xe3, 0xf7, 0x59, 0xfb, 0x01, 0xe0, 0x4b, 0xf2, 0x03, 0x70, 0x28, 0x60, + 0x28, 0x68, 0x3f, 0xe0, 0x20, 0x78, 0x00, 0x23, 0x01, 0x28, 0x04, 0xd0, + 0x20, 0xb1, 0x4b, 0xf2, 0x03, 0x70, 0x28, 0x60, 0x08, 0xe0, 0x01, 0x23, + 0x01, 0x9a, 0x0f, 0x99, 0x18, 0x46, 0xe3, 0xf7, 0xa8, 0xfb, 0x28, 0x60, + 0x00, 0xb9, 0xca, 0x46, 0x2e, 0x68, 0x0c, 0x20, 0x86, 0xe3, 0x20, 0x78, + 0x00, 0x23, 0x01, 0x28, 0x04, 0xd0, 0x20, 0xb1, 0x4b, 0xf2, 0x03, 0x70, + 0x28, 0x60, 0x0a, 0xe0, 0x01, 0x23, 0xd4, 0xf8, 0x01, 0x20, 0xd4, 0xf8, + 0x05, 0x10, 0x18, 0x46, 0xe3, 0xf7, 0xaa, 0xfb, 0x28, 0x60, 0x00, 0xb9, + 0xca, 0x46, 0x2e, 0x68, 0x40, 0xe3, 0xc5, 0xf8, 0x00, 0xa0, 0x20, 0x78, + 0x8d, 0xf8, 0x00, 0x00, 0x61, 0x78, 0x8d, 0xf8, 0x01, 0x10, 0x00, 0xf0, + 0x73, 0xff, 0xe3, 0xf7, 0x9d, 0xf9, 0xea, 0xf7, 0x7c, 0xfc, 0x00, 0x20, + 0xea, 0xf7, 0xf7, 0xfe, 0x01, 0x20, 0xea, 0xf7, 0xf4, 0xfe, 0x28, 0x68, + 0x00, 0xf0, 0x8a, 0xbd, 0xe3, 0xf7, 0x65, 0xfc, 0x00, 0x28, 0x40, 0xf0, + 0x00, 0x87, 0x00, 0x24, 0x2c, 0x60, 0x00, 0x26, 0x08, 0xeb, 0x86, 0x00, + 0xff, 0x21, 0x00, 0xf5, 0xc8, 0x77, 0xf1, 0x40, 0xc8, 0x07, 0x0d, 0xd5, + 0xf0, 0xb2, 0xea, 0xf7, 0xd4, 0xfd, 0x08, 0xeb, 0x06, 0x01, 0x81, 0xf8, + 0x88, 0x01, 0x69, 0x46, 0x30, 0x46, 0xe3, 0xf7, 0xea, 0xfb, 0x00, 0x98, + 0x38, 0x60, 0x04, 0xe0, 0x08, 0xeb, 0x06, 0x02, 0x82, 0xf8, 0x88, 0x41, + 0x3c, 0x60, 0x76, 0x1c, 0x08, 0x2e, 0xe1, 0xd1, 0x00, 0x26, 0x08, 0xeb, + 0x86, 0x00, 0xff, 0x21, 0x00, 0xf5, 0xdc, 0x77, 0xf1, 0x40, 0xc8, 0x07, + 0x0d, 0xd5, 0xf0, 0xb2, 0xea, 0xf7, 0x9e, 0xfd, 0x08, 0xeb, 0x06, 0x01, + 0x81, 0xf8, 0xb0, 0x01, 0x69, 0x46, 0x30, 0x46, 0xe3, 0xf7, 0xb8, 0xfb, + 0x00, 0x98, 0x38, 0x60, 0x04, 0xe0, 0x08, 0xeb, 0x06, 0x02, 0x82, 0xf8, + 0xb0, 0x41, 0x3c, 0x60, 0x76, 0x1c, 0x08, 0x2e, 0xe1, 0xd1, 0x2e, 0x68, + 0x54, 0x20, 0x04, 0x90, 0x00, 0xf0, 0xc7, 0xbd, 0x27, 0x78, 0xe4, 0xf7, + 0xb8, 0xfb, 0x00, 0xea, 0x07, 0x06, 0x00, 0x20, 0x28, 0x71, 0x00, 0x27, + 0x26, 0xfa, 0x07, 0xf1, 0xc9, 0x07, 0x12, 0xd5, 0xa0, 0x78, 0x30, 0xb1, + 0x00, 0xf0, 0x01, 0xff, 0x38, 0x46, 0x61, 0x78, 0xef, 0xf7, 0x79, 0xfa, + 0x04, 0xe0, 0x61, 0x78, 0x01, 0x22, 0x38, 0x46, 0xef, 0xf7, 0x94, 0xfb, + 0x29, 0x79, 0x09, 0xfa, 0x07, 0xf2, 0x11, 0x43, 0x29, 0x71, 0x7f, 0x1c, + 0x08, 0x2f, 0xe5, 0xd3, 0x84, 0xe0, 0x00, 0xf0, 0x19, 0xff, 0x07, 0x46, + 0xe4, 0xf7, 0xb0, 0xfb, 0x00, 0x26, 0xff, 0x28, 0x1d, 0xd0, 0x60, 0x78, + 0x02, 0x28, 0x07, 0xda, 0x8d, 0xf8, 0x4a, 0x00, 0x12, 0xa9, 0xf8, 0xb2, + 0xf3, 0xf7, 0x91, 0xfd, 0x06, 0x46, 0x01, 0xe0, 0x4b, 0xf2, 0x04, 0x06, + 0x20, 0x78, 0x28, 0x71, 0x76, 0xb9, 0x9d, 0xf8, 0x4a, 0x00, 0x00, 0x99, + 0x68, 0x71, 0x14, 0x98, 0x08, 0x60, 0x9d, 0xf8, 0x48, 0x10, 0x02, 0x98, + 0x88, 0xf8, 0x8a, 0x11, 0x13, 0x99, 0x01, 0x60, 0x00, 0xe0, 0x28, 0x71, + 0x2e, 0x60, 0x0e, 0xb1, 0x00, 0xf0, 0x04, 0xba, 0xca, 0x46, 0x01, 0xe2, + 0x26, 0x78, 0xe4, 0xf7, 0x69, 0xfb, 0x00, 0xea, 0x06, 0x07, 0x00, 0x20, + 0xbd, 0xf8, 0x0e, 0x60, 0x28, 0x71, 0x83, 0x46, 0x27, 0xfa, 0x0b, 0xf1, + 0xc9, 0x07, 0x40, 0xd5, 0x60, 0x78, 0x02, 0x28, 0x07, 0xdb, 0x00, 0x90, + 0x5b, 0x46, 0xdf, 0xf8, 0xec, 0x2c, 0xff, 0x21, 0x01, 0x20, 0xe4, 0xf7, + 0x6e, 0xfc, 0xa0, 0x78, 0xf0, 0xb1, 0x00, 0xf0, 0xa4, 0xfe, 0x58, 0x46, + 0x61, 0x78, 0xef, 0xf7, 0x2f, 0xfa, 0x1c, 0xe0, 0x24, 0x73, 0x03, 0x21, + 0x23, 0xbe, 0x02, 0x02, 0x58, 0x75, 0x02, 0x21, 0x34, 0x8d, 0x04, 0x02, + 0x48, 0x8d, 0x04, 0x02, 0x5c, 0x8d, 0x04, 0x02, 0x78, 0x8d, 0x04, 0x02, + 0x74, 0x28, 0x02, 0x21, 0xd4, 0x45, 0x02, 0x21, 0x88, 0x8e, 0x04, 0x02, + 0x98, 0x8d, 0x04, 0x02, 0x5c, 0x75, 0x02, 0x21, 0x61, 0x78, 0x01, 0x22, + 0x58, 0x46, 0xef, 0xf7, 0x27, 0xfb, 0x13, 0x2e, 0x08, 0xbf, 0x00, 0x28, + 0x06, 0xd1, 0x61, 0x78, 0x21, 0xb9, 0xd4, 0xf8, 0x07, 0x10, 0x58, 0x46, + 0xef, 0xf7, 0x0c, 0xfd, 0x29, 0x79, 0x09, 0xfa, 0x0b, 0xf2, 0x11, 0x43, + 0x29, 0x71, 0x0b, 0xf1, 0x01, 0x0b, 0xbb, 0xf1, 0x01, 0x0f, 0x01, 0xd8, + 0x00, 0x28, 0xb3, 0xd0, 0xad, 0xf8, 0x0e, 0x60, 0x00, 0xf0, 0xd6, 0xfe, + 0x00, 0xf0, 0x00, 0xbe, 0x00, 0xf0, 0x90, 0xfe, 0x07, 0x46, 0xe4, 0xf7, + 0x36, 0xfb, 0x61, 0x78, 0x00, 0x26, 0x0b, 0x46, 0x02, 0x2b, 0x06, 0xdb, + 0x0f, 0xf6, 0x48, 0x42, 0x00, 0xf0, 0x8f, 0xfe, 0x4b, 0xf2, 0x04, 0x06, + 0x18, 0xe0, 0xff, 0x28, 0x16, 0xd0, 0x8d, 0xf8, 0x4a, 0x10, 0xf8, 0xb2, + 0x12, 0xa9, 0x01, 0xf0, 0xd0, 0xfb, 0x06, 0x00, 0x20, 0x78, 0x28, 0x71, + 0x0c, 0xd1, 0x9d, 0xf8, 0x4a, 0x00, 0x9d, 0xf8, 0x48, 0x10, 0x68, 0x71, + 0x88, 0xf8, 0x8a, 0x11, 0x00, 0x98, 0x14, 0x99, 0x01, 0x60, 0x02, 0x98, + 0x13, 0x99, 0x01, 0x60, 0x2e, 0x60, 0x0e, 0xb1, 0x00, 0xf0, 0x78, 0xb9, + 0xca, 0x46, 0x75, 0xe1, 0xe3, 0x78, 0x03, 0xb1, 0x01, 0x23, 0x61, 0x78, + 0x01, 0xb1, 0x01, 0x21, 0xa2, 0x78, 0x20, 0x78, 0xef, 0xf7, 0x3d, 0xfd, + 0x71, 0xe1, 0xa0, 0x7a, 0x00, 0xb1, 0x01, 0x20, 0x61, 0x78, 0x01, 0xb1, + 0x01, 0x21, 0xd4, 0xf8, 0x06, 0x30, 0xd4, 0xf8, 0x02, 0x20, 0x00, 0x90, + 0x20, 0x78, 0xef, 0xf7, 0x41, 0xfc, 0x62, 0xe1, 0x27, 0x78, 0x94, 0xf8, + 0x01, 0xb0, 0xe4, 0xf7, 0xbf, 0xfa, 0x00, 0xea, 0x07, 0x06, 0x00, 0x20, + 0x28, 0x71, 0x85, 0xf8, 0x05, 0xb0, 0x00, 0x27, 0x26, 0xfa, 0x07, 0xf1, + 0xc9, 0x07, 0x1e, 0xd5, 0xa2, 0x78, 0x8d, 0xf8, 0x50, 0x20, 0x12, 0x97, + 0xcd, 0xf8, 0x4c, 0xb0, 0xa0, 0x68, 0x15, 0x90, 0xe0, 0x78, 0x8d, 0xf8, + 0x51, 0x00, 0x60, 0x68, 0x16, 0x90, 0x21, 0x7b, 0x8d, 0xf8, 0x5c, 0x10, + 0x8d, 0xf8, 0x5d, 0x10, 0x09, 0xfa, 0x07, 0xf1, 0x28, 0x79, 0x8d, 0xf8, + 0x5e, 0xa0, 0x08, 0x43, 0x28, 0x71, 0x8d, 0xf8, 0x52, 0x90, 0x12, 0xa8, + 0xef, 0xf7, 0x94, 0xf9, 0x10, 0xb9, 0x7f, 0x1c, 0x08, 0x2f, 0xd9, 0xd3, + 0x28, 0x60, 0x7d, 0xe1, 0x00, 0xf0, 0x12, 0xfe, 0x07, 0x46, 0xe4, 0xf7, + 0xaf, 0xfa, 0x00, 0x26, 0x94, 0xf8, 0x01, 0xb0, 0xff, 0x28, 0x1e, 0xd0, + 0xa1, 0x78, 0x8d, 0xf8, 0x49, 0x10, 0x8d, 0xf8, 0x4a, 0xb0, 0x12, 0xa9, + 0xf8, 0xb2, 0x01, 0xf0, 0x20, 0xfd, 0x06, 0x46, 0x20, 0x78, 0x9d, 0xf8, + 0x48, 0x10, 0x68, 0x71, 0x85, 0xf8, 0x04, 0xb0, 0xa0, 0x78, 0x88, 0xf8, + 0x8a, 0x01, 0x88, 0xf8, 0x8b, 0x11, 0x0f, 0x98, 0x14, 0x99, 0x01, 0x60, + 0x10, 0x98, 0x13, 0x99, 0x01, 0x60, 0x9d, 0xf8, 0x54, 0x00, 0x88, 0xf8, + 0x94, 0x01, 0x2e, 0x60, 0x06, 0xb9, 0xca, 0x46, 0x11, 0x20, 0xb7, 0xe1, + 0x00, 0xf0, 0xe4, 0xfd, 0x07, 0x46, 0xe4, 0xf7, 0x81, 0xfa, 0x00, 0x26, + 0xff, 0x28, 0x18, 0xd0, 0x60, 0x78, 0x8d, 0xf8, 0x4a, 0x00, 0x12, 0xa9, + 0xf8, 0xb2, 0x01, 0xf0, 0x0f, 0xfe, 0x06, 0x00, 0x20, 0x78, 0x28, 0x71, + 0x9d, 0xf8, 0x4a, 0x00, 0x68, 0x71, 0x0c, 0xd1, 0x9d, 0xf8, 0x48, 0x00, + 0x00, 0x99, 0x88, 0xf8, 0x8a, 0x01, 0x14, 0x98, 0x08, 0x60, 0x02, 0x99, + 0x13, 0x98, 0x08, 0x60, 0x01, 0xe0, 0xff, 0x21, 0x29, 0x71, 0x2e, 0x60, + 0x0e, 0xb1, 0x00, 0xf0, 0xd3, 0xb8, 0xca, 0x46, 0xd0, 0xe0, 0x26, 0x78, + 0x61, 0x78, 0x01, 0x91, 0xd3, 0x46, 0xe4, 0xf7, 0x33, 0xfa, 0x06, 0x40, + 0x02, 0x96, 0x85, 0xf8, 0x04, 0xa0, 0x00, 0x26, 0x01, 0x99, 0x69, 0x71, + 0x02, 0x98, 0xf0, 0x40, 0xc1, 0x07, 0x2b, 0xd5, 0x29, 0x79, 0x01, 0x9a, + 0x8d, 0xf8, 0x4a, 0x20, 0x09, 0xfa, 0x06, 0xf0, 0x01, 0x43, 0x00, 0x27, + 0x29, 0x71, 0xd3, 0x46, 0x8d, 0xf8, 0x49, 0xb0, 0x12, 0xa9, 0xf0, 0xb2, + 0x01, 0xf0, 0xbb, 0xfc, 0x10, 0xb9, 0x9d, 0xf8, 0x48, 0x10, 0x0f, 0x43, + 0x0b, 0xf1, 0x01, 0x0b, 0x5f, 0xfa, 0x8b, 0xf2, 0x02, 0x2a, 0xef, 0xdb, + 0x5f, 0xea, 0x00, 0x0b, 0x0e, 0xd1, 0xff, 0xb2, 0x9f, 0xb9, 0xa0, 0x78, + 0xd8, 0xb1, 0xd4, 0xf8, 0x03, 0x30, 0xd4, 0xf8, 0x07, 0x20, 0x01, 0x99, + 0xcd, 0xf8, 0x00, 0x90, 0x30, 0x46, 0xef, 0xf7, 0xd4, 0xf9, 0x83, 0x46, + 0x76, 0x1c, 0x08, 0x2e, 0x05, 0xd2, 0xbb, 0xf1, 0x00, 0x0f, 0xc9, 0xd0, + 0x01, 0xe0, 0x4b, 0xf2, 0x06, 0x0b, 0xbb, 0xf1, 0x00, 0x0f, 0x08, 0xbf, + 0xca, 0x46, 0xc5, 0xf8, 0x00, 0xb0, 0x5e, 0x46, 0xda, 0xe0, 0x01, 0x99, + 0x01, 0x22, 0x30, 0x46, 0xef, 0xf7, 0xcb, 0xf9, 0xe7, 0xe7, 0x26, 0x78, + 0xe4, 0xf7, 0xe2, 0xf9, 0x00, 0xf0, 0x1f, 0xfd, 0x00, 0xf0, 0x0e, 0xfd, + 0x16, 0xd5, 0x00, 0x27, 0x00, 0xf0, 0x2c, 0xfd, 0x0f, 0xd0, 0x8d, 0xf8, + 0x00, 0x70, 0x09, 0xfa, 0x06, 0xf2, 0xa0, 0x78, 0x6b, 0x79, 0x8d, 0xf8, + 0x01, 0x00, 0x19, 0x43, 0xd4, 0xf8, 0x07, 0x00, 0x01, 0x90, 0x00, 0xf0, + 0x6d, 0xfd, 0xfe, 0xf7, 0x2d, 0xfb, 0x7f, 0x1c, 0x08, 0x2f, 0xe9, 0xd3, + 0x00, 0xf0, 0x22, 0xfd, 0xe2, 0xdb, 0x00, 0xf0, 0x59, 0xfd, 0xaf, 0xe0, + 0x26, 0x78, 0xe4, 0xf7, 0xbd, 0xf9, 0x00, 0xf0, 0xfa, 0xfc, 0x00, 0xf0, + 0xe9, 0xfc, 0x0c, 0xd5, 0x00, 0x27, 0x00, 0xf0, 0x07, 0xfd, 0x05, 0xd0, + 0x00, 0xf0, 0xf7, 0xfc, 0xfe, 0xf7, 0x4a, 0xfb, 0x00, 0xf0, 0xe2, 0xfc, + 0x7f, 0x1c, 0x08, 0x2f, 0xf3, 0xd3, 0x00, 0xf0, 0x07, 0xfd, 0xec, 0xdb, + 0x3c, 0xe0, 0x26, 0x78, 0xe4, 0xf7, 0xa5, 0xf9, 0x00, 0xf0, 0xe1, 0xfc, + 0x00, 0xf0, 0xd0, 0xfc, 0x16, 0xd5, 0x00, 0x27, 0x00, 0xf0, 0xee, 0xfc, + 0x0f, 0xd0, 0xa2, 0x78, 0x8d, 0xf8, 0x01, 0x20, 0x8d, 0xf8, 0x00, 0x70, + 0x09, 0xfa, 0x06, 0xf2, 0xd4, 0xf8, 0x07, 0x00, 0x6b, 0x79, 0x01, 0x90, + 0x19, 0x43, 0x00, 0xf0, 0x2f, 0xfd, 0xfe, 0xf7, 0xa7, 0xfa, 0x7f, 0x1c, + 0x08, 0x2f, 0xe9, 0xd3, 0x00, 0xf0, 0xe4, 0xfc, 0xe2, 0xdb, 0x00, 0xf0, + 0x1b, 0xfd, 0x71, 0xe0, 0x26, 0x78, 0xe4, 0xf7, 0x80, 0xf9, 0x00, 0xf0, + 0xbc, 0xfc, 0x00, 0xf0, 0xab, 0xfc, 0x0c, 0xd5, 0x00, 0x27, 0x00, 0xf0, + 0xc9, 0xfc, 0x05, 0xd0, 0x00, 0xf0, 0xb9, 0xfc, 0xfe, 0xf7, 0xb7, 0xfa, + 0x00, 0xf0, 0xa4, 0xfc, 0x7f, 0x1c, 0x08, 0x2f, 0xf3, 0xd3, 0x00, 0xf0, + 0xc9, 0xfc, 0xec, 0xdb, 0x00, 0xf0, 0x00, 0xfd, 0x0f, 0x20, 0xbb, 0xe0, + 0x21, 0x88, 0x60, 0x88, 0x22, 0x1d, 0xfe, 0xf7, 0xf8, 0xf9, 0xe4, 0xe2, + 0x20, 0x46, 0xfe, 0xf7, 0x0c, 0xfa, 0xe0, 0xe2, 0x94, 0xf8, 0x7c, 0x20, + 0x01, 0x99, 0x20, 0x46, 0xfe, 0xf7, 0x18, 0xfa, 0x05, 0xe0, 0x94, 0xf8, + 0x7c, 0x20, 0x01, 0x99, 0x20, 0x46, 0xfe, 0xf7, 0x15, 0xfa, 0x00, 0xf0, + 0x13, 0xfd, 0x44, 0x20, 0xa0, 0xe0, 0x21, 0x88, 0x11, 0xf4, 0x70, 0x4f, + 0x03, 0xd0, 0x4b, 0xf2, 0x01, 0x60, 0x28, 0x60, 0x0c, 0xe0, 0x01, 0x98, + 0xd5, 0xf7, 0x45, 0xfc, 0x0b, 0x99, 0x20, 0x88, 0xd5, 0xf7, 0x07, 0xfc, + 0x20, 0x88, 0xc5, 0xf8, 0x00, 0xa0, 0xa8, 0xf8, 0xa2, 0x01, 0xca, 0x46, + 0x2e, 0x68, 0x20, 0x20, 0x88, 0xe0, 0x01, 0x98, 0xd5, 0xf7, 0x6a, 0xfc, + 0x00, 0xf0, 0xcb, 0xfc, 0x1c, 0xe0, 0x21, 0x88, 0x11, 0xf4, 0x70, 0x6f, + 0x0f, 0xd0, 0x08, 0x26, 0xf0, 0xb2, 0xea, 0xf7, 0x15, 0xf9, 0x09, 0xfa, + 0x06, 0xf7, 0x28, 0xb9, 0x21, 0x88, 0x39, 0x42, 0x1c, 0xbf, 0x21, 0xea, + 0x07, 0x07, 0x27, 0x80, 0x76, 0x1c, 0x0c, 0x2e, 0xf0, 0xd3, 0x20, 0x88, + 0xd5, 0xf7, 0x66, 0xfc, 0x28, 0x60, 0x20, 0x88, 0xa8, 0x80, 0x28, 0x68, + 0x00, 0xf0, 0xd7, 0xfc, 0x06, 0x20, 0x63, 0xe0, 0x06, 0xf0, 0x79, 0xfc, + 0xe3, 0xe2, 0x19, 0x28, 0x03, 0xd0, 0x49, 0x28, 0x05, 0xd1, 0x01, 0x20, + 0x00, 0xe0, 0x00, 0x20, 0xe3, 0xf7, 0x1c, 0xf9, 0x16, 0xe0, 0x4f, 0xf6, + 0x25, 0x70, 0x13, 0xe0, 0x1a, 0x28, 0xcd, 0xf8, 0x10, 0xa0, 0x02, 0xd0, + 0x4a, 0x28, 0x08, 0xd0, 0x0a, 0xe0, 0x01, 0x20, 0xe2, 0xf7, 0xe1, 0xfe, + 0x28, 0x60, 0x01, 0x20, 0xe3, 0xf7, 0x0a, 0xf9, 0x04, 0xe0, 0xe3, 0xf7, + 0x10, 0xf9, 0x01, 0xe0, 0x4f, 0xf6, 0x25, 0x70, 0x28, 0x60, 0x04, 0x21, + 0x2e, 0x68, 0x04, 0x91, 0xee, 0xe2, 0x00, 0xf0, 0x4d, 0xfc, 0x01, 0x22, + 0xf0, 0xf7, 0x8e, 0xfd, 0x28, 0x60, 0x06, 0x46, 0x08, 0xb1, 0x00, 0xf0, + 0x63, 0xba, 0xca, 0x46, 0x60, 0xe2, 0x00, 0xf0, 0x41, 0xfc, 0x00, 0x22, + 0xf0, 0xf7, 0x82, 0xfd, 0x57, 0xe2, 0x20, 0x68, 0x06, 0xf0, 0x30, 0xf8, + 0x28, 0x60, 0x20, 0xb9, 0x05, 0xf0, 0xc6, 0xfe, 0xe4, 0xf7, 0x3c, 0xf9, + 0xca, 0x46, 0x2e, 0x68, 0x4e, 0xe2, 0x20, 0x68, 0x07, 0xf0, 0x95, 0xf8, + 0x47, 0xe2, 0x22, 0x68, 0x03, 0xa9, 0x04, 0xf1, 0x08, 0x00, 0x02, 0x91, + 0x01, 0x90, 0xe3, 0x88, 0x06, 0x99, 0x9d, 0xf8, 0x14, 0x00, 0x00, 0x93, + 0xa3, 0x88, 0x07, 0xf0, 0x92, 0xf8, 0x38, 0xe2, 0x20, 0x68, 0x01, 0x9b, + 0xe2, 0x88, 0xa1, 0x88, 0x07, 0xf0, 0x56, 0xf8, 0x00, 0xf0, 0x72, 0xfc, + 0xe0, 0x88, 0x00, 0x1d, 0x9b, 0xe3, 0x20, 0x78, 0x05, 0x28, 0x18, 0xbf, + 0xe4, 0xf7, 0x03, 0xfa, 0x60, 0x78, 0xff, 0x28, 0x18, 0xbf, 0xe4, 0xf7, + 0x09, 0xfa, 0xa0, 0x79, 0xff, 0x28, 0x07, 0xd0, 0xd4, 0xf8, 0x02, 0x10, + 0x01, 0x28, 0x18, 0xbf, 0x00, 0x20, 0xc9, 0xb2, 0xe4, 0xf7, 0xf8, 0xf9, + 0xca, 0x46, 0x00, 0x26, 0x6a, 0xe2, 0x60, 0x89, 0x40, 0xf2, 0x01, 0x11, + 0x88, 0x42, 0x31, 0xd2, 0x8d, 0xf8, 0x0d, 0xa0, 0x20, 0x68, 0x13, 0x28, + 0x07, 0xd2, 0x00, 0xf0, 0x3a, 0xfc, 0xf4, 0xf7, 0x49, 0xfc, 0x28, 0x60, + 0x8d, 0xf8, 0x0c, 0xa0, 0x13, 0xe0, 0x9d, 0xf8, 0x14, 0x00, 0x06, 0x28, + 0x18, 0xbf, 0x07, 0x28, 0x04, 0xd0, 0x00, 0xf0, 0x2c, 0xfc, 0x04, 0xf0, + 0x85, 0xfc, 0x03, 0xe0, 0x00, 0xf0, 0x27, 0xfc, 0x04, 0xf0, 0xb4, 0xfc, + 0x28, 0x60, 0x8d, 0xf8, 0x0c, 0xa0, 0x8d, 0xf8, 0x0d, 0x90, 0x20, 0x68, + 0x0c, 0x28, 0x18, 0xbf, 0x33, 0x28, 0x46, 0xd1, 0x9d, 0xf8, 0x0d, 0x00, + 0x05, 0xf0, 0xf0, 0xfd, 0x00, 0x28, 0x40, 0xd0, 0x00, 0x22, 0x8d, 0xf8, + 0x0c, 0x90, 0xca, 0x46, 0x04, 0x92, 0x3a, 0xe0, 0x4f, 0xf6, 0x61, 0x70, + 0x06, 0x21, 0x28, 0x60, 0x34, 0xe0, 0x05, 0xf0, 0xbf, 0xff, 0x00, 0x28, + 0x2b, 0xd0, 0x60, 0x89, 0x40, 0xf2, 0x01, 0x11, 0x88, 0x42, 0x1e, 0xd2, + 0x20, 0x68, 0x13, 0x28, 0x04, 0xd2, 0x00, 0xf0, 0xfc, 0xfb, 0xf4, 0xf7, + 0x1b, 0xfc, 0x05, 0xe0, 0x36, 0x28, 0x07, 0xd8, 0x00, 0xf0, 0xf5, 0xfb, + 0x04, 0xf0, 0xa8, 0xfc, 0x28, 0x60, 0x8d, 0xf8, 0x0c, 0xa0, 0x1a, 0xe0, + 0xa5, 0xf8, 0x04, 0xa0, 0x20, 0x46, 0x00, 0xf0, 0xfb, 0xfc, 0x28, 0x60, + 0x00, 0xb9, 0xca, 0x46, 0xa9, 0x88, 0x8d, 0xf8, 0x0c, 0x90, 0x89, 0x1d, + 0x0c, 0xe0, 0x4f, 0xf6, 0x61, 0x70, 0x28, 0x60, 0xa5, 0xf8, 0x04, 0xa0, + 0x06, 0x20, 0x04, 0x90, 0x05, 0xe0, 0x4f, 0xf6, 0x60, 0x71, 0x29, 0x60, + 0xa8, 0x80, 0x06, 0x21, 0x04, 0x91, 0x2e, 0x68, 0x1d, 0xe3, 0x61, 0x79, + 0x01, 0xb1, 0x01, 0x21, 0x20, 0x68, 0x27, 0x79, 0x01, 0x24, 0x09, 0x26, + 0x31, 0xb9, 0xc0, 0xb2, 0x05, 0xf0, 0x1e, 0xfe, 0x04, 0x46, 0x66, 0x1c, + 0xb4, 0x42, 0x1d, 0xd2, 0x01, 0xaa, 0x69, 0x46, 0x20, 0x46, 0x05, 0xf0, + 0x3a, 0xfe, 0x00, 0x98, 0x13, 0x28, 0x06, 0xd2, 0x01, 0x98, 0x00, 0xea, + 0x07, 0x01, 0x00, 0x98, 0xf4, 0xf7, 0x32, 0xfd, 0x09, 0xe0, 0x36, 0x28, + 0x04, 0xd2, 0x01, 0x99, 0x39, 0x40, 0x04, 0xf0, 0xf0, 0xfd, 0x02, 0xe0, + 0x01, 0x98, 0x05, 0xf0, 0xf1, 0xfe, 0x20, 0x46, 0x05, 0xf0, 0x2f, 0xfe, + 0x64, 0x1c, 0xdf, 0xe7, 0x00, 0xf0, 0x8b, 0xfb, 0x74, 0xe1, 0xe0, 0x78, + 0xa2, 0x78, 0x01, 0x28, 0x20, 0x78, 0x0c, 0xbf, 0x61, 0x78, 0x18, 0x21, + 0x07, 0xf0, 0x30, 0xf8, 0x28, 0x60, 0x06, 0x46, 0xca, 0x46, 0x67, 0xe1, + 0x18, 0x21, 0x8d, 0xf8, 0x01, 0x10, 0x8d, 0xf8, 0x00, 0xa0, 0x6a, 0x46, + 0x20, 0x78, 0x0d, 0xf1, 0x01, 0x01, 0x07, 0xf0, 0x35, 0xf8, 0x0d, 0x99, + 0x08, 0x60, 0xca, 0x46, 0x9d, 0xf8, 0x01, 0x00, 0x9d, 0xf8, 0x00, 0x10, + 0x28, 0x70, 0x69, 0x70, 0x06, 0x21, 0x0d, 0x98, 0x06, 0x68, 0xc4, 0xe2, + 0x00, 0xf0, 0x47, 0xfb, 0x28, 0xb9, 0x40, 0xf6, 0x01, 0x40, 0x28, 0x60, + 0xa5, 0xf8, 0x04, 0xa0, 0x21, 0xe0, 0x00, 0xf0, 0x50, 0xfb, 0x07, 0x46, + 0xfe, 0x6a, 0xf1, 0x6a, 0x60, 0x78, 0x08, 0x70, 0x0c, 0x22, 0xf1, 0x6a, + 0xd4, 0xf8, 0x03, 0x00, 0x48, 0x60, 0x81, 0xf8, 0x08, 0x90, 0x07, 0x21, + 0x38, 0x46, 0xf7, 0xf7, 0x93, 0xfb, 0x38, 0x46, 0xf7, 0xf7, 0x96, 0xfb, + 0xc5, 0xf8, 0x00, 0xa0, 0x18, 0xb1, 0x38, 0x46, 0xf7, 0xf7, 0x10, 0xfb, + 0x28, 0x60, 0x30, 0x6b, 0x01, 0x78, 0x29, 0x71, 0x30, 0x6b, 0x41, 0x78, + 0x69, 0x71, 0x06, 0x20, 0x2e, 0x68, 0xa2, 0xe1, 0x20, 0x21, 0x28, 0x46, + 0xe8, 0xf7, 0x7a, 0xfa, 0x00, 0xf0, 0x15, 0xfb, 0x20, 0xb9, 0x0b, 0x98, + 0x40, 0xf6, 0x01, 0x41, 0x01, 0x60, 0x50, 0xe0, 0x00, 0xf0, 0x1f, 0xfb, + 0x06, 0x46, 0x1e, 0x22, 0xf4, 0x6a, 0x07, 0x21, 0xf7, 0xf7, 0x6c, 0xfb, + 0x30, 0x46, 0xf7, 0xf7, 0x6f, 0xfb, 0x00, 0x28, 0x3e, 0xd1, 0x0b, 0x98, + 0xc0, 0xf8, 0x00, 0xa0, 0x20, 0x6b, 0x01, 0x88, 0x29, 0x80, 0x80, 0x78, + 0xa8, 0x70, 0x21, 0x6b, 0xc8, 0x78, 0xe8, 0x70, 0x21, 0x6b, 0x08, 0x79, + 0x28, 0x71, 0x20, 0x6b, 0xc1, 0x88, 0xa8, 0xf8, 0x89, 0x11, 0x02, 0x89, + 0xa8, 0xf8, 0x8b, 0x21, 0x80, 0x7a, 0x88, 0xf8, 0x8d, 0x01, 0x21, 0x6b, + 0xc8, 0x7a, 0x88, 0xf8, 0x8e, 0x01, 0x20, 0x6b, 0x81, 0x89, 0xa8, 0xf8, + 0x8f, 0x11, 0xc2, 0x89, 0xa8, 0xf8, 0x91, 0x21, 0x00, 0x7c, 0x11, 0x9a, + 0x88, 0xf8, 0x93, 0x01, 0x21, 0x6b, 0x48, 0x7c, 0x88, 0xf8, 0x94, 0x01, + 0x21, 0x6b, 0x88, 0x7c, 0x88, 0xf8, 0x95, 0x01, 0x21, 0x6b, 0xc8, 0x7c, + 0x88, 0xf8, 0x96, 0x01, 0x21, 0x6b, 0x08, 0x7d, 0x88, 0xf8, 0x97, 0x01, + 0x20, 0x6b, 0x00, 0xf1, 0x15, 0x01, 0x08, 0x68, 0x10, 0x60, 0x48, 0x68, + 0x50, 0x60, 0x04, 0xe0, 0x30, 0x46, 0xf7, 0xf7, 0xab, 0xfa, 0x0b, 0x99, + 0x08, 0x60, 0x20, 0x21, 0x0b, 0x98, 0x0b, 0x9a, 0x5d, 0xe0, 0x60, 0x21, + 0x28, 0x46, 0xe8, 0xf7, 0x19, 0xfa, 0x00, 0xf0, 0xb4, 0xfa, 0x20, 0xb9, + 0x0c, 0x98, 0x40, 0xf6, 0x01, 0x41, 0x01, 0x60, 0x4e, 0xe0, 0x00, 0xf0, + 0xbe, 0xfa, 0x06, 0x46, 0x1f, 0x22, 0xf4, 0x6a, 0x07, 0x21, 0xf7, 0xf7, + 0x0b, 0xfb, 0x30, 0x46, 0xf7, 0xf7, 0x0e, 0xfb, 0x00, 0x28, 0x3c, 0xd1, + 0x0c, 0x98, 0xc0, 0xf8, 0x00, 0xa0, 0x26, 0x6b, 0x30, 0x88, 0x28, 0x80, + 0xb1, 0x1c, 0x0d, 0x98, 0x0a, 0x78, 0x02, 0x70, 0x4a, 0x78, 0x42, 0x70, + 0x02, 0x22, 0x01, 0x98, 0x31, 0x1d, 0xd5, 0xf7, 0xf7, 0xfa, 0xb0, 0x1d, + 0x08, 0xf5, 0xc5, 0x71, 0x02, 0x78, 0x0a, 0x70, 0x42, 0x78, 0x4a, 0x70, + 0x30, 0x7a, 0x10, 0x9a, 0x88, 0xf8, 0x8c, 0x01, 0x21, 0x6b, 0x48, 0x7a, + 0x88, 0xf8, 0x8d, 0x01, 0x21, 0x6b, 0x88, 0x7a, 0x88, 0xf8, 0x8e, 0x01, + 0x21, 0x6b, 0xc8, 0x7a, 0x88, 0xf8, 0x8f, 0x01, 0x20, 0x6b, 0x00, 0xf1, + 0x0c, 0x01, 0xd1, 0xe9, 0x00, 0x31, 0xc2, 0xe9, 0x00, 0x31, 0x00, 0xf1, + 0x14, 0x01, 0x11, 0x9a, 0xd1, 0xe9, 0x00, 0x31, 0xc2, 0xe9, 0x00, 0x31, + 0x40, 0x22, 0x00, 0xf1, 0x1c, 0x01, 0x0b, 0x98, 0xd5, 0xf7, 0xcc, 0xfa, + 0x04, 0xe0, 0x30, 0x46, 0xf7, 0xf7, 0x4c, 0xfa, 0x0c, 0x99, 0x08, 0x60, + 0x60, 0x21, 0x0c, 0x98, 0x0c, 0x9a, 0x06, 0x68, 0x04, 0x91, 0x10, 0x68, + 0xe1, 0xe0, 0x08, 0xf5, 0xc4, 0x76, 0x00, 0x20, 0x30, 0x60, 0x28, 0x60, + 0x21, 0x68, 0xf9, 0x40, 0xc9, 0x07, 0x26, 0xd5, 0xf9, 0x1e, 0x03, 0x29, + 0x1b, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, 0x0f, 0x02, 0x14, 0x08, 0xe3, 0xf7, + 0xc6, 0xfe, 0x03, 0x21, 0x07, 0xf0, 0xe2, 0xfa, 0x11, 0xe0, 0xe3, 0xf7, + 0xc1, 0xfe, 0x4f, 0xf4, 0x7a, 0x61, 0x07, 0xf0, 0xa3, 0xfd, 0x0a, 0xe0, + 0xe3, 0xf7, 0xc6, 0xfe, 0xf7, 0xf7, 0xbc, 0xf9, 0x0c, 0xe0, 0xe3, 0xf7, + 0xb3, 0xfe, 0x4f, 0xf4, 0x7a, 0x61, 0x08, 0xf0, 0x5e, 0xf8, 0x30, 0xb1, + 0x31, 0x68, 0x09, 0xfa, 0x07, 0xf2, 0x11, 0x43, 0x31, 0x60, 0x28, 0x60, + 0x00, 0x20, 0x7f, 0x1c, 0x06, 0x2f, 0xd1, 0xd9, 0x28, 0x68, 0x00, 0x28, + 0x5e, 0xd1, 0xca, 0x46, 0x5c, 0xe0, 0x21, 0x78, 0x8d, 0xf8, 0x00, 0x10, + 0x68, 0x46, 0xe6, 0xf7, 0x43, 0xf9, 0x28, 0x60, 0x9d, 0xf8, 0x00, 0x00, + 0x28, 0x71, 0x9d, 0xf8, 0x01, 0x00, 0x68, 0x71, 0x9d, 0xf8, 0x02, 0x00, + 0x88, 0xf8, 0x8a, 0x01, 0x9d, 0xf8, 0x03, 0x00, 0x88, 0xf8, 0x8b, 0x01, + 0x28, 0x68, 0x00, 0xf0, 0x4e, 0xfa, 0x08, 0x21, 0x81, 0xe1, 0x22, 0x78, + 0x8d, 0xf8, 0x00, 0x20, 0x60, 0x78, 0x8d, 0xf8, 0x01, 0x00, 0x00, 0xf0, + 0xdf, 0xf9, 0xe6, 0xf7, 0x3f, 0xf9, 0x28, 0x60, 0x00, 0xf0, 0x3f, 0xfa, + 0x04, 0x20, 0x68, 0xe1, 0x26, 0x68, 0x16, 0xf1, 0x03, 0x0f, 0x0a, 0xd1, + 0x00, 0x20, 0xe5, 0xf7, 0xa6, 0xfe, 0x01, 0x20, 0xe5, 0xf7, 0xa3, 0xfe, + 0x00, 0x20, 0x28, 0x60, 0x6f, 0xf0, 0x02, 0x00, 0x16, 0xe0, 0x16, 0xf1, + 0x02, 0x0f, 0x0c, 0xd1, 0xdf, 0xf8, 0xfc, 0x06, 0x01, 0x68, 0x01, 0xf6, + 0x2d, 0x40, 0xe5, 0xf7, 0x2b, 0xfe, 0x28, 0x60, 0x6f, 0xf0, 0x01, 0x01, + 0x01, 0x98, 0x01, 0x60, 0x0f, 0xe0, 0x16, 0xf1, 0x01, 0x0f, 0x06, 0xd1, + 0x00, 0x20, 0x28, 0x60, 0xe6, 0xf7, 0xf7, 0xf8, 0x01, 0x99, 0x08, 0x60, + 0x05, 0xe0, 0x30, 0x46, 0xe6, 0xf7, 0xad, 0xf8, 0x28, 0x60, 0x01, 0x98, + 0x06, 0x60, 0xca, 0x46, 0x28, 0x68, 0x08, 0xb1, 0x4f, 0xf0, 0x00, 0x0a, + 0x06, 0x46, 0x08, 0x20, 0x31, 0xe1, 0x61, 0x78, 0x24, 0x78, 0x01, 0xea, + 0x04, 0x02, 0x00, 0x20, 0x8c, 0x43, 0x11, 0x00, 0x05, 0xd0, 0x01, 0x21, + 0x10, 0x46, 0xe6, 0xf7, 0x03, 0xfb, 0xc0, 0xb2, 0x28, 0xb9, 0x3c, 0xb1, + 0x00, 0x21, 0x20, 0x46, 0xe6, 0xf7, 0xfc, 0xfa, 0xc0, 0xb2, 0x10, 0xb1, + 0x06, 0x46, 0x01, 0xe0, 0x00, 0xb9, 0xca, 0x46, 0x00, 0x20, 0x16, 0xe1, + 0x4f, 0xf4, 0x01, 0x71, 0x28, 0x46, 0xe8, 0xf7, 0x03, 0xf9, 0x00, 0xf0, + 0x9e, 0xf9, 0x18, 0xb9, 0x40, 0xf6, 0x01, 0x40, 0x28, 0x60, 0x1d, 0xe0, + 0x00, 0xf0, 0xa9, 0xf9, 0x06, 0x46, 0x10, 0x20, 0xf4, 0x6a, 0xe1, 0x6a, + 0x08, 0x70, 0x0d, 0x22, 0xe0, 0x6a, 0x80, 0xf8, 0x01, 0x90, 0x07, 0x21, + 0x30, 0x46, 0xf7, 0xf7, 0xef, 0xf9, 0x30, 0x46, 0xf7, 0xf7, 0xf2, 0xf9, + 0xc5, 0xf8, 0x00, 0xa0, 0x18, 0xb1, 0x30, 0x46, 0xf7, 0xf7, 0x6c, 0xf9, + 0x28, 0x60, 0x21, 0x6b, 0x01, 0x98, 0x60, 0x22, 0xd5, 0xf7, 0xe2, 0xf9, + 0x2e, 0x68, 0x4f, 0xf4, 0x01, 0x70, 0x04, 0x90, 0x28, 0x68, 0x00, 0x28, + 0x00, 0xd1, 0xca, 0x46, 0xf1, 0xe0, 0xe2, 0xf7, 0x2a, 0xfe, 0x90, 0xb1, + 0xc5, 0xf8, 0x00, 0xa0, 0xca, 0x46, 0x20, 0x68, 0xee, 0xf7, 0x22, 0xfb, + 0x01, 0x99, 0x0f, 0xf2, 0x4c, 0x62, 0x08, 0x60, 0x01, 0x99, 0x23, 0x68, + 0x08, 0x68, 0x00, 0x90, 0xff, 0x21, 0x03, 0x20, 0xe3, 0xf7, 0xf9, 0xfe, + 0x02, 0xe0, 0x4f, 0xf6, 0x76, 0x71, 0x29, 0x60, 0x08, 0x22, 0x2e, 0x68, + 0x04, 0x92, 0xd4, 0xe0, 0x21, 0x78, 0x00, 0x26, 0x04, 0x29, 0x00, 0xf2, + 0xb2, 0x80, 0xdf, 0xe8, 0x01, 0xf0, 0xa2, 0x5d, 0x2b, 0x16, 0x03, 0x00, + 0xe3, 0xf7, 0xc8, 0xfd, 0x67, 0x78, 0xf8, 0x40, 0xc0, 0x07, 0x04, 0xd5, + 0x38, 0x46, 0xf0, 0xf7, 0x03, 0xfd, 0x01, 0x46, 0x01, 0xe0, 0x4f, 0xf6, + 0x52, 0x76, 0x20, 0x78, 0x28, 0x71, 0x6f, 0x71, 0x88, 0xf8, 0x8a, 0x11, + 0x9b, 0xe0, 0xe3, 0xf7, 0xb5, 0xfd, 0x67, 0x78, 0xf8, 0x40, 0xc0, 0x07, + 0x08, 0xd5, 0xa1, 0x78, 0x38, 0x46, 0x11, 0xb1, 0xf0, 0xf7, 0xd8, 0xfc, + 0x04, 0xe0, 0xf0, 0xf7, 0xcd, 0xfc, 0x01, 0xe0, 0x4f, 0xf6, 0x52, 0x76, + 0x20, 0x78, 0x28, 0x71, 0x6f, 0x71, 0x86, 0xe0, 0xe3, 0xf7, 0xa0, 0xfd, + 0x67, 0x78, 0x94, 0xf8, 0x02, 0xb0, 0xf8, 0x40, 0xc0, 0x07, 0x0d, 0xd5, + 0xbb, 0xf1, 0x40, 0x0f, 0x07, 0xd8, 0x6b, 0x46, 0x0d, 0xf1, 0x02, 0x02, + 0x59, 0x46, 0x38, 0x46, 0xf0, 0xf7, 0xec, 0xfd, 0x04, 0xe0, 0x4b, 0xf6, + 0x02, 0x26, 0x01, 0xe0, 0x4f, 0xf6, 0x52, 0x76, 0x20, 0x78, 0x28, 0x71, + 0x6f, 0x71, 0x88, 0xf8, 0x8a, 0xb1, 0xbd, 0xf9, 0x02, 0x10, 0xbd, 0xf8, + 0x02, 0x00, 0x88, 0xf8, 0x8b, 0x01, 0x09, 0x04, 0x09, 0x0e, 0x88, 0xf8, + 0x8c, 0x11, 0xbd, 0xf9, 0x00, 0x10, 0xbd, 0xf8, 0x00, 0x00, 0x88, 0xf8, + 0x8d, 0x01, 0x09, 0x04, 0x09, 0x0e, 0x88, 0xf8, 0x8e, 0x11, 0x54, 0xe0, + 0xe3, 0xf7, 0x6e, 0xfd, 0x61, 0x78, 0x8d, 0xf8, 0x00, 0x10, 0xe1, 0x1c, + 0xa2, 0x78, 0x8d, 0xf8, 0x01, 0x20, 0x0d, 0xf1, 0x02, 0x02, 0x0b, 0x78, + 0x13, 0x70, 0x4b, 0x78, 0x53, 0x70, 0x61, 0x1d, 0x01, 0xaa, 0x0b, 0x78, + 0x13, 0x70, 0x4b, 0x78, 0x9d, 0xf8, 0x00, 0x10, 0x53, 0x70, 0xc8, 0x40, + 0xc0, 0x07, 0x1e, 0xd5, 0x9d, 0xf8, 0x01, 0x00, 0x40, 0x28, 0x04, 0xd9, + 0xff, 0x28, 0x05, 0xd0, 0x4b, 0xf6, 0x02, 0x26, 0x17, 0xe0, 0x07, 0x46, + 0xff, 0x2f, 0x10, 0xd1, 0x01, 0x27, 0x4f, 0xf0, 0x40, 0x0b, 0xf8, 0xb2, + 0x83, 0x45, 0x0e, 0xdb, 0xbd, 0xf9, 0x04, 0x30, 0xbd, 0xf9, 0x02, 0x20, + 0x9d, 0xf8, 0x00, 0x00, 0xf9, 0xb2, 0xf0, 0xf7, 0x51, 0xfd, 0x7f, 0x1c, + 0xf1, 0xe7, 0xbb, 0x46, 0xef, 0xe7, 0x4f, 0xf6, 0x52, 0x76, 0x20, 0x78, + 0x9d, 0xf8, 0x00, 0x10, 0x28, 0x71, 0x69, 0x71, 0x9d, 0xf8, 0x01, 0x00, + 0x88, 0xf8, 0x8a, 0x01, 0x0f, 0xe0, 0x60, 0x1c, 0x61, 0x1c, 0x02, 0x68, + 0x00, 0x92, 0x00, 0x20, 0x22, 0x78, 0x2a, 0x71, 0x12, 0x9b, 0x0a, 0x5c, + 0x1a, 0x54, 0x40, 0x1c, 0x04, 0x28, 0xf9, 0xd3, 0x01, 0xe0, 0x4f, 0xf6, + 0x25, 0x76, 0x2e, 0x60, 0x06, 0xb9, 0xca, 0x46, 0x2e, 0x60, 0x1a, 0x20, + 0x07, 0xe0, 0x01, 0x98, 0x06, 0xf0, 0xf2, 0xf9, 0x06, 0x00, 0x08, 0xbf, + 0xca, 0x46, 0x2e, 0x60, 0x05, 0x20, 0x04, 0x90, 0x0b, 0xe0, 0x20, 0x78, + 0x06, 0xf0, 0xed, 0xf9, 0x06, 0x00, 0x08, 0xbf, 0xca, 0x46, 0x2e, 0x60, + 0x04, 0x21, 0x04, 0x91, 0x01, 0xe0, 0xcd, 0xf8, 0x38, 0xa0, 0x9d, 0xf8, + 0x0c, 0x00, 0x00, 0x28, 0x13, 0xd0, 0x0e, 0x98, 0x08, 0xb9, 0x05, 0x23, + 0x04, 0xe0, 0xba, 0xf1, 0x00, 0x0f, 0x0c, 0xbf, 0x04, 0x23, 0x00, 0x23, + 0x04, 0x98, 0xbd, 0xf8, 0x0e, 0x10, 0x01, 0x90, 0x00, 0x95, 0x32, 0x46, + 0x05, 0xa8, 0x00, 0xf0, 0xd2, 0xf8, 0x07, 0x46, 0x00, 0x2f, 0x3e, 0xf4, + 0xc8, 0xad, 0x01, 0x22, 0x39, 0x46, 0xfe, 0xf7, 0xc2, 0xbd, 0x00, 0x00, + 0xc8, 0x8e, 0x04, 0x02, 0x53, 0x45, 0x54, 0x5f, 0x4f, 0x52, 0x58, 0x5f, + 0x4e, 0x43, 0x4f, 0x3a, 0x20, 0x6e, 0x63, 0x6f, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x2b, 0xfa, 0x06, 0xf0, + 0xc0, 0x07, 0x70, 0x47, 0x9d, 0xf8, 0x49, 0x00, 0x02, 0x99, 0x88, 0xf8, + 0x8a, 0x01, 0x13, 0x98, 0x08, 0x60, 0x00, 0x99, 0x14, 0x98, 0x08, 0x60, + 0x70, 0x47, 0x00, 0xea, 0x06, 0x0b, 0xa5, 0xf8, 0x04, 0xa0, 0x00, 0x26, + 0x70, 0x47, 0x28, 0x79, 0x6b, 0x79, 0x8d, 0xf8, 0x48, 0x70, 0x09, 0xfa, + 0x06, 0xf2, 0x10, 0x43, 0x19, 0x43, 0x28, 0x71, 0x69, 0x71, 0xf0, 0xb2, + 0x12, 0xa9, 0x70, 0x47, 0x62, 0x78, 0x09, 0xfa, 0x07, 0xf1, 0x0a, 0x42, + 0x70, 0x47, 0xd4, 0xf8, 0x03, 0x30, 0xd4, 0xf8, 0x07, 0x20, 0xcd, 0xf8, + 0x00, 0x90, 0x70, 0x47, 0x76, 0x1c, 0xf0, 0xb2, 0x08, 0x28, 0x70, 0x47, + 0xa0, 0x78, 0x8d, 0xf8, 0x02, 0x00, 0xe0, 0x78, 0x8d, 0xf8, 0x03, 0x00, + 0x68, 0x46, 0x70, 0x47, 0x21, 0x78, 0x01, 0xb1, 0x01, 0x21, 0xd4, 0xf8, + 0x01, 0x00, 0x70, 0x47, 0xd4, 0xf8, 0x0d, 0x00, 0xc0, 0xb2, 0xfe, 0xf7, + 0x7b, 0xbc, 0xd4, 0xf8, 0x05, 0x10, 0x00, 0x96, 0x04, 0xab, 0x01, 0x9a, + 0x70, 0x47, 0x4f, 0xf4, 0x7f, 0x72, 0x04, 0x92, 0xc5, 0xf8, 0x00, 0xa0, + 0x70, 0x47, 0x20, 0x78, 0xe1, 0xf7, 0x18, 0xbe, 0x20, 0x78, 0xfd, 0xf7, + 0xa5, 0xbe, 0x20, 0x68, 0x32, 0x46, 0x04, 0xf0, 0x0e, 0xb9, 0xff, 0x21, + 0x03, 0x20, 0xe3, 0xf7, 0x8e, 0xbd, 0xff, 0x21, 0x03, 0x20, 0xe3, 0xf7, + 0x8a, 0xbd, 0x20, 0x78, 0x01, 0x22, 0x01, 0x21, 0x05, 0xf0, 0xd0, 0xb9, + 0x00, 0x21, 0x29, 0x60, 0xca, 0x46, 0x00, 0x26, 0x70, 0x47, 0x00, 0x20, + 0x28, 0x60, 0xca, 0x46, 0x00, 0x26, 0x70, 0x47, 0xd4, 0xf8, 0x03, 0x00, + 0x02, 0x90, 0x69, 0x71, 0x69, 0x46, 0x28, 0x79, 0x10, 0x43, 0x28, 0x71, + 0xf0, 0xb2, 0x70, 0x47, 0x4f, 0xf4, 0x7a, 0x72, 0x00, 0x23, 0xd4, 0xf8, + 0x01, 0x00, 0xd4, 0xf8, 0x05, 0x10, 0xe7, 0xf7, 0x55, 0xbf, 0xd4, 0xf8, + 0x06, 0x00, 0x22, 0x68, 0x04, 0xf1, 0x0c, 0x01, 0x02, 0x91, 0x63, 0x89, + 0x06, 0x99, 0x01, 0x93, 0x00, 0x90, 0xa3, 0x88, 0x9d, 0xf8, 0x14, 0x00, + 0x70, 0x47, 0x01, 0x20, 0xf1, 0xf7, 0xce, 0xb8, 0x28, 0x60, 0x00, 0xb9, + 0xca, 0x46, 0x06, 0x46, 0x70, 0x47, 0xf0, 0xb5, 0x85, 0xb0, 0x00, 0x22, + 0x00, 0x23, 0x00, 0x92, 0x8d, 0xf8, 0x04, 0x30, 0x02, 0xac, 0x90, 0xe8, + 0xe0, 0x00, 0x84, 0xe8, 0xe0, 0x00, 0xa3, 0x4c, 0x20, 0x68, 0x6a, 0x46, + 0x01, 0xa9, 0xf3, 0xf7, 0xaa, 0xf8, 0x00, 0x98, 0x38, 0xb1, 0xa0, 0x48, + 0x4f, 0xf0, 0x80, 0x51, 0x01, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, + 0x6f, 0x8f, 0x05, 0xb0, 0xf0, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x06, 0x46, + 0x90, 0x46, 0x0b, 0x9a, 0x34, 0x78, 0x75, 0x68, 0x90, 0x1d, 0x08, 0x2c, + 0x89, 0x46, 0x9a, 0x46, 0x2e, 0xda, 0x96, 0x49, 0x51, 0xf8, 0x34, 0x30, + 0x9d, 0x42, 0x26, 0xd2, 0x09, 0x1d, 0x51, 0xf8, 0x34, 0x30, 0x03, 0xeb, + 0x05, 0x17, 0x79, 0x68, 0x81, 0x42, 0x1b, 0xd3, 0x38, 0x68, 0x79, 0x89, + 0x01, 0x80, 0xbb, 0x89, 0x43, 0x80, 0xa0, 0xf8, 0x04, 0xa0, 0x80, 0x1d, + 0x0a, 0x99, 0xd4, 0xf7, 0xcb, 0xff, 0xbf, 0xf3, 0x5f, 0x8f, 0x06, 0x20, + 0xed, 0xf7, 0x14, 0xfd, 0x83, 0x46, 0x00, 0x20, 0x38, 0x72, 0x29, 0x46, + 0x20, 0x46, 0xf0, 0xf7, 0xe0, 0xfc, 0x58, 0x46, 0x80, 0xf3, 0x11, 0x88, + 0x00, 0x24, 0x07, 0xe0, 0x4f, 0xf6, 0x07, 0x74, 0x04, 0xe0, 0x4f, 0xf6, + 0x05, 0x74, 0x01, 0xe0, 0x4f, 0xf6, 0x04, 0x74, 0x7b, 0x4d, 0xa8, 0x68, + 0x4f, 0xf0, 0xff, 0x31, 0xf3, 0xf7, 0x26, 0xf9, 0x01, 0x28, 0x2a, 0xd1, + 0x7a, 0x48, 0x41, 0x78, 0x33, 0x78, 0x00, 0xeb, 0x01, 0x12, 0xc2, 0xf8, + 0xc4, 0x30, 0x41, 0x78, 0x00, 0xeb, 0x01, 0x12, 0x71, 0x68, 0xc2, 0xf8, + 0xc8, 0x10, 0x42, 0x78, 0x00, 0xeb, 0x02, 0x13, 0xa3, 0xf8, 0xce, 0xa0, + 0x41, 0x78, 0x00, 0xeb, 0x01, 0x12, 0xc2, 0xf8, 0xd0, 0x80, 0x41, 0x78, + 0x00, 0xeb, 0x01, 0x12, 0xa2, 0xf8, 0xcc, 0x90, 0x41, 0x78, 0x49, 0x1c, + 0x41, 0x70, 0xc9, 0xb2, 0x0c, 0x29, 0x24, 0xbf, 0x00, 0x21, 0x41, 0x70, + 0xa8, 0x68, 0x00, 0x23, 0x00, 0x22, 0x00, 0x21, 0xf2, 0xf7, 0xad, 0xff, + 0x04, 0xe0, 0x00, 0x22, 0x4f, 0xf6, 0x70, 0x71, 0xff, 0xf7, 0x65, 0xff, + 0x20, 0x46, 0xbd, 0xe8, 0xf2, 0x8f, 0x1f, 0xb5, 0x00, 0xf0, 0x29, 0xf8, + 0x0c, 0xbf, 0x00, 0x23, 0x04, 0x23, 0x1b, 0xe0, 0x7f, 0xb5, 0x00, 0xf0, + 0x3d, 0xf8, 0x00, 0xf0, 0x36, 0xf8, 0x0c, 0xbf, 0x00, 0x23, 0x04, 0x23, + 0x29, 0xe0, 0x7f, 0xb5, 0x00, 0xf0, 0x34, 0xf8, 0x00, 0xf0, 0x2d, 0xf8, + 0x0c, 0xbf, 0x00, 0x23, 0x04, 0x23, 0x80, 0x1d, 0x01, 0x90, 0x22, 0x46, + 0x25, 0x21, 0x20, 0xe0, 0x1f, 0xb5, 0x00, 0xf0, 0x0c, 0xf8, 0x0c, 0xbf, + 0x00, 0x23, 0x04, 0x23, 0x00, 0x90, 0x02, 0x60, 0x04, 0x24, 0x01, 0x94, + 0x21, 0x21, 0x02, 0xa8, 0xff, 0xf7, 0x5d, 0xff, 0x1f, 0xbd, 0x8d, 0xf8, + 0x08, 0x00, 0x1a, 0x00, 0x4a, 0x48, 0x03, 0x91, 0x70, 0x47, 0x7f, 0xb5, + 0x00, 0xf0, 0x12, 0xf8, 0x00, 0xf0, 0x0b, 0xf8, 0x0c, 0xbf, 0x00, 0x23, + 0x04, 0x23, 0x80, 0x1d, 0x01, 0x90, 0x22, 0x46, 0x23, 0x21, 0x02, 0xa8, + 0xff, 0xf7, 0x47, 0xff, 0x7f, 0xbd, 0x00, 0x2c, 0xb5, 0xf8, 0x88, 0x01, + 0x00, 0x96, 0x70, 0x47, 0x09, 0x9a, 0x3d, 0x4d, 0x03, 0x91, 0x8d, 0xf8, + 0x08, 0x00, 0x05, 0xf5, 0xc2, 0x76, 0x1c, 0x46, 0xa5, 0xf8, 0x88, 0x21, + 0x34, 0x60, 0x05, 0xf5, 0xc5, 0x70, 0x08, 0x99, 0xd4, 0xf7, 0x20, 0xbf, + 0x7f, 0xb5, 0xff, 0xf7, 0xed, 0xff, 0xff, 0xf7, 0xe6, 0xff, 0x0c, 0xbf, + 0x00, 0x23, 0x04, 0x23, 0x80, 0x1d, 0x01, 0x90, 0x22, 0x46, 0x25, 0x21, + 0xd9, 0xe7, 0x00, 0x00, 0x7c, 0xb5, 0x01, 0x68, 0x00, 0x24, 0x82, 0x29, + 0x30, 0xd0, 0x85, 0x29, 0x23, 0xd0, 0x87, 0x29, 0x2c, 0xd0, 0xbc, 0x29, + 0x0a, 0xd0, 0xc0, 0x29, 0x44, 0xd1, 0xd0, 0xf8, 0x06, 0x10, 0x00, 0xf1, + 0x0c, 0x02, 0x80, 0x88, 0xf0, 0xf7, 0x40, 0xf9, 0x04, 0x46, 0x3d, 0xe0, + 0x81, 0x88, 0x01, 0x29, 0x38, 0xd1, 0xd0, 0xf8, 0x06, 0x20, 0xc1, 0x68, + 0xd2, 0xb2, 0x08, 0x2a, 0x08, 0xda, 0x11, 0xf1, 0x01, 0x0f, 0x31, 0xd0, + 0xd0, 0xf8, 0x06, 0x20, 0xd0, 0xb2, 0xeb, 0xf7, 0x1d, 0xfe, 0x2b, 0xe0, + 0x4f, 0xf6, 0x6b, 0x74, 0x28, 0xe0, 0x19, 0x4d, 0x80, 0x88, 0x05, 0xf5, + 0xc5, 0x72, 0x69, 0x46, 0x06, 0xf0, 0x10, 0xf8, 0x00, 0x98, 0xa5, 0xf8, + 0x88, 0x01, 0x1d, 0xe0, 0x81, 0x88, 0x00, 0x25, 0x00, 0x26, 0xca, 0x07, + 0x03, 0xd5, 0x01, 0x25, 0x89, 0x07, 0x48, 0xbf, 0x01, 0x26, 0x01, 0x68, + 0x82, 0x29, 0x31, 0x46, 0x28, 0x46, 0x02, 0xd1, 0xf4, 0xf7, 0x34, 0xf9, + 0x01, 0xe0, 0x04, 0xf0, 0xf5, 0xfa, 0x00, 0x96, 0x4f, 0xea, 0x05, 0x03, + 0x1b, 0xa2, 0xff, 0x21, 0x03, 0x20, 0xe3, 0xf7, 0x06, 0xfc, 0x01, 0xe0, + 0x4f, 0xf6, 0x6a, 0x74, 0x20, 0x46, 0x76, 0xbd, 0x5c, 0x75, 0x02, 0x21, + 0xd4, 0x45, 0x02, 0x21, 0x04, 0xed, 0x00, 0xe0, 0x88, 0x8e, 0x04, 0x02, + 0x74, 0x28, 0x02, 0x21, 0xf8, 0x29, 0x02, 0x21, 0x70, 0xb5, 0x05, 0x00, + 0x04, 0x46, 0x18, 0xbf, 0x01, 0x25, 0xe3, 0xf7, 0xc3, 0xfa, 0x02, 0x2c, + 0x06, 0x46, 0x0b, 0xda, 0x00, 0x24, 0x26, 0xfa, 0x04, 0xf0, 0xc0, 0x07, + 0x03, 0xd5, 0x29, 0x46, 0x20, 0x46, 0x07, 0xf0, 0x1f, 0xfe, 0x64, 0x1c, + 0x08, 0x2c, 0xf4, 0xd3, 0x70, 0xbd, 0x00, 0x00, 0x45, 0x46, 0x55, 0x53, + 0x45, 0x5f, 0x47, 0x45, 0x54, 0x5b, 0x25, 0x58, 0x5d, 0x20, 0x30, 0x78, + 0x25, 0x78, 0x0a, 0x00, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x20, 0x25, 0x64, + 0x2c, 0x20, 0x50, 0x61, 0x73, 0x73, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, + 0x00, 0x78, 0x02, 0x40, 0xca, 0x40, 0xd0, 0xb2, 0x70, 0x47, 0x30, 0xb5, + 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, + 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, + 0x30, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x4f, 0x2d, 0xed, 0x10, 0x8a, + 0xdf, 0xf8, 0xe8, 0x43, 0xe2, 0xf7, 0xf3, 0xfa, 0x54, 0xf8, 0x20, 0x00, + 0xdf, 0xf8, 0xe0, 0x33, 0x4f, 0xf0, 0xff, 0x32, 0x00, 0x21, 0xff, 0xf7, + 0xe0, 0xff, 0xdf, 0xf8, 0xd8, 0x43, 0x4f, 0xf0, 0x11, 0x30, 0x20, 0x60, + 0x00, 0xf0, 0x54, 0xf8, 0xe2, 0xf7, 0xe1, 0xfa, 0x60, 0xb9, 0xdf, 0xf8, + 0xc8, 0x53, 0x1f, 0x20, 0x28, 0x60, 0x01, 0x26, 0x30, 0x46, 0xed, 0xf7, + 0xaf, 0xff, 0x45, 0xf8, 0x26, 0x00, 0x76, 0x1c, 0x1f, 0x2e, 0xf7, 0xd9, + 0xe2, 0xf7, 0xd1, 0xfa, 0xdf, 0xf8, 0xac, 0x53, 0x29, 0x46, 0xf0, 0xf7, + 0x4f, 0xff, 0x28, 0x78, 0x20, 0xb9, 0xe2, 0xf7, 0xc8, 0xfa, 0x18, 0x21, + 0xf0, 0xf7, 0x33, 0xff, 0x3a, 0x20, 0xef, 0xf7, 0x38, 0xfd, 0xe2, 0xf7, + 0xc0, 0xfa, 0x20, 0xb9, 0xdf, 0xf8, 0x8c, 0x13, 0x3f, 0x20, 0x08, 0x60, + 0x03, 0xe0, 0xdf, 0xf8, 0x88, 0x03, 0x3f, 0x22, 0x02, 0x60, 0x00, 0x21, + 0xdf, 0xf8, 0x80, 0x03, 0x41, 0x60, 0x81, 0x60, 0xc1, 0x60, 0x01, 0x61, + 0x01, 0x23, 0x03, 0x22, 0xff, 0xf7, 0xa1, 0xff, 0xe2, 0xf7, 0xa9, 0xfa, + 0x18, 0xb9, 0xdf, 0xf8, 0x6c, 0x13, 0x08, 0x60, 0x02, 0xe0, 0xda, 0x48, + 0x00, 0x22, 0x02, 0x60, 0xe2, 0xf7, 0x9f, 0xfa, 0xd8, 0x4d, 0x20, 0xb9, + 0x28, 0x78, 0x40, 0xf0, 0x01, 0x00, 0x28, 0x70, 0x03, 0xe0, 0x68, 0x78, + 0x40, 0xf0, 0x01, 0x00, 0x68, 0x70, 0x4f, 0xf0, 0x33, 0x30, 0x20, 0x60, + 0x30, 0xbf, 0xfd, 0xe7, 0x2d, 0xe9, 0xf0, 0x4f, 0x2d, 0xed, 0x10, 0x8a, + 0xcf, 0x4c, 0xef, 0xf3, 0x10, 0x80, 0x20, 0x60, 0xef, 0xf3, 0x13, 0x80, + 0x60, 0x60, 0xef, 0xf3, 0x11, 0x80, 0xa0, 0x60, 0xef, 0xf3, 0x14, 0x80, + 0xe0, 0x60, 0xef, 0xf3, 0x08, 0x80, 0x20, 0x61, 0xef, 0xf3, 0x09, 0x80, + 0xc7, 0x49, 0x60, 0x61, 0x00, 0x20, 0x51, 0xf8, 0x20, 0x20, 0x04, 0xeb, + 0x80, 0x03, 0x40, 0x1c, 0x08, 0x28, 0x9a, 0x61, 0xf7, 0xd3, 0x00, 0x20, + 0xc2, 0x49, 0x51, 0xf8, 0x20, 0x20, 0x04, 0xeb, 0x80, 0x03, 0x40, 0x1c, + 0x08, 0x28, 0x9a, 0x63, 0xf7, 0xd3, 0xbf, 0x49, 0x00, 0x20, 0x51, 0xf8, + 0x20, 0x20, 0x04, 0xeb, 0x80, 0x03, 0x40, 0x1c, 0x08, 0x28, 0x9a, 0x65, + 0xf7, 0xd3, 0x00, 0x20, 0xba, 0x49, 0x51, 0xf8, 0x20, 0x20, 0x04, 0xeb, + 0x80, 0x03, 0x40, 0x1c, 0x08, 0x28, 0x9a, 0x67, 0xf7, 0xd3, 0xb7, 0x49, + 0x00, 0x20, 0x51, 0xf8, 0x20, 0x20, 0x04, 0xeb, 0x80, 0x03, 0x40, 0x1c, + 0x08, 0x28, 0xc3, 0xf8, 0x98, 0x20, 0xf6, 0xd3, 0x00, 0x20, 0xb2, 0x49, + 0x0a, 0x5c, 0x23, 0x18, 0x40, 0x1c, 0xf0, 0x28, 0x83, 0xf8, 0xb8, 0x20, + 0xf8, 0xd3, 0xaf, 0x49, 0x0a, 0x68, 0x04, 0xf5, 0xd4, 0x70, 0x02, 0x60, + 0x4b, 0x68, 0x43, 0x60, 0x8a, 0x68, 0x82, 0x60, 0xcb, 0x68, 0xc3, 0x60, + 0x0a, 0x69, 0x02, 0x61, 0x00, 0x22, 0x4b, 0x69, 0x43, 0x61, 0xa8, 0x4b, + 0x9d, 0x5c, 0xa6, 0x18, 0x52, 0x1c, 0x0c, 0x2a, 0x86, 0xf8, 0xc0, 0x51, + 0xf8, 0xd3, 0x4a, 0x6a, 0x42, 0x62, 0x8b, 0x6a, 0x83, 0x62, 0xca, 0x6a, + 0xc2, 0x62, 0x0b, 0x6b, 0x03, 0x63, 0x4a, 0x6b, 0x42, 0x63, 0x8b, 0x6b, + 0x83, 0x63, 0xca, 0x6b, 0xc2, 0x63, 0x0a, 0x6c, 0x02, 0x64, 0x4a, 0x6c, + 0x42, 0x64, 0x8a, 0x6c, 0x82, 0x64, 0xc9, 0x6c, 0x9a, 0x4a, 0xc1, 0x64, + 0x00, 0x21, 0x52, 0xf8, 0x21, 0x30, 0x04, 0xeb, 0x81, 0x05, 0x49, 0x1c, + 0x04, 0x29, 0xc5, 0xf8, 0xf8, 0x31, 0xf6, 0xd3, 0x00, 0x21, 0x95, 0x4a, + 0x52, 0xf8, 0x21, 0x30, 0x04, 0xeb, 0x81, 0x05, 0x49, 0x1c, 0x04, 0x29, + 0xc5, 0xf8, 0x08, 0x32, 0xf6, 0xd9, 0x91, 0x49, 0x91, 0x4e, 0x0a, 0x68, + 0x91, 0x49, 0x42, 0x67, 0x04, 0xf2, 0x96, 0x25, 0x0b, 0x68, 0x83, 0x67, + 0x4a, 0x68, 0xc2, 0x67, 0x04, 0xf5, 0x0a, 0x70, 0x8a, 0x68, 0x02, 0x60, + 0xc9, 0x68, 0x41, 0x60, 0x8b, 0x49, 0x0a, 0x68, 0x82, 0x60, 0x4b, 0x68, + 0xc3, 0x60, 0x8a, 0x68, 0x02, 0x61, 0xcb, 0x68, 0x43, 0x61, 0x09, 0x69, + 0x81, 0x61, 0x87, 0x49, 0x0a, 0x78, 0x02, 0x77, 0x4b, 0x78, 0x43, 0x77, + 0x8a, 0x78, 0x82, 0x77, 0x0b, 0x7a, 0xc3, 0x77, 0x04, 0xf5, 0x12, 0x70, + 0x4a, 0x7a, 0x02, 0x70, 0x20, 0x22, 0x89, 0x7a, 0x41, 0x70, 0x80, 0x48, + 0x01, 0x68, 0x80, 0x48, 0xc4, 0xf8, 0x4a, 0x12, 0x01, 0x68, 0x7f, 0x48, + 0xc4, 0xf8, 0x4e, 0x12, 0x01, 0x68, 0x7e, 0x48, 0xc4, 0xf8, 0x52, 0x12, + 0x01, 0x68, 0x7d, 0x48, 0xc4, 0xf8, 0x56, 0x12, 0x01, 0x68, 0x7c, 0x48, + 0xc4, 0xf8, 0x5a, 0x12, 0x01, 0x68, 0x7b, 0x48, 0xc4, 0xf8, 0x5e, 0x12, + 0x01, 0x68, 0x7a, 0x48, 0xc4, 0xf8, 0x62, 0x12, 0x01, 0x68, 0x79, 0x48, + 0xc4, 0xf8, 0x66, 0x12, 0x01, 0x68, 0x78, 0x48, 0xc4, 0xf8, 0x6a, 0x12, + 0x01, 0x68, 0x77, 0x48, 0xc4, 0xf8, 0x6e, 0x12, 0x01, 0x68, 0x76, 0x48, + 0xc4, 0xf8, 0x72, 0x12, 0x01, 0x68, 0x75, 0x48, 0xc4, 0xf8, 0x76, 0x12, + 0x01, 0x68, 0x74, 0x48, 0xc4, 0xf8, 0x7a, 0x12, 0x01, 0x68, 0x73, 0x48, + 0xc4, 0xf8, 0x7e, 0x12, 0x01, 0x68, 0x72, 0x48, 0xc4, 0xf8, 0x82, 0x12, + 0x01, 0x68, 0x71, 0x48, 0xc4, 0xf8, 0x86, 0x12, 0x01, 0x68, 0x70, 0x48, + 0xc4, 0xf8, 0x8a, 0x12, 0x01, 0x68, 0x6f, 0x48, 0xc4, 0xf8, 0x8e, 0x12, + 0x01, 0x68, 0xc4, 0xf8, 0x92, 0x12, 0x05, 0x21, 0x30, 0x68, 0x26, 0x30, + 0xff, 0xf7, 0x6c, 0xfe, 0x28, 0x70, 0x20, 0x22, 0x70, 0x68, 0x05, 0x21, + 0x26, 0x30, 0xff, 0xf7, 0x65, 0xfe, 0x68, 0x70, 0x20, 0x22, 0xb0, 0x68, + 0x05, 0x21, 0x26, 0x30, 0xff, 0xf7, 0x5e, 0xfe, 0xa8, 0x70, 0x20, 0x22, + 0xf0, 0x68, 0x05, 0x21, 0x26, 0x30, 0xff, 0xf7, 0x57, 0xfe, 0xe8, 0x70, + 0x00, 0x20, 0xe2, 0xf7, 0x7f, 0xfd, 0x0a, 0x21, 0x90, 0xfb, 0xf1, 0xf0, + 0xa8, 0x80, 0x01, 0x20, 0xe2, 0xf7, 0x78, 0xfd, 0x0a, 0x21, 0x90, 0xfb, + 0xf1, 0xf0, 0xe8, 0x80, 0x02, 0x20, 0xe2, 0xf7, 0x71, 0xfd, 0x0a, 0x21, + 0x90, 0xfb, 0xf1, 0xf0, 0x28, 0x81, 0x03, 0x20, 0xe2, 0xf7, 0x6a, 0xfd, + 0x0a, 0x21, 0x90, 0xfb, 0xf1, 0xf0, 0x68, 0x81, 0x04, 0x20, 0xe2, 0xf7, + 0x63, 0xfd, 0x0a, 0x21, 0x90, 0xfb, 0xf1, 0xf0, 0xa8, 0x81, 0x05, 0x20, + 0xe2, 0xf7, 0x5c, 0xfd, 0x0a, 0x21, 0x90, 0xfb, 0xf1, 0xf0, 0xe8, 0x81, + 0x06, 0x20, 0xe2, 0xf7, 0x55, 0xfd, 0x0a, 0x21, 0x90, 0xfb, 0xf1, 0xf0, + 0x28, 0x82, 0x07, 0x20, 0xe2, 0xf7, 0x4e, 0xfd, 0x0a, 0x21, 0x90, 0xfb, + 0xf1, 0xf0, 0x68, 0x82, 0x08, 0x20, 0xe2, 0xf7, 0x47, 0xfd, 0x0a, 0x21, + 0x90, 0xfb, 0xf1, 0xf0, 0xa8, 0x82, 0x09, 0x20, 0xe2, 0xf7, 0x40, 0xfd, + 0x0a, 0x21, 0x90, 0xfb, 0xf1, 0xf0, 0xe8, 0x82, 0x0a, 0x20, 0xe2, 0xf7, + 0x39, 0xfd, 0x0a, 0x21, 0x90, 0xfb, 0xf1, 0xf0, 0x28, 0x83, 0x0b, 0x20, + 0xe2, 0xf7, 0x32, 0xfd, 0x0a, 0x21, 0x90, 0xfb, 0xf1, 0xf0, 0x0b, 0x4a, + 0x68, 0x83, 0xc4, 0xf8, 0xb2, 0x22, 0xbd, 0xec, 0x10, 0x8a, 0xbd, 0xe8, + 0xf0, 0x4f, 0x70, 0x47, 0x28, 0xb9, 0x31, 0x49, 0x4f, 0xf0, 0x00, 0x40, + 0x08, 0x60, 0x30, 0xbf, 0xfd, 0xe7, 0x70, 0x47, 0x98, 0x9e, 0x04, 0x02, + 0x00, 0x00, 0xab, 0xab, 0x98, 0x03, 0x00, 0x02, 0x54, 0x69, 0x02, 0x21, + 0x3d, 0x76, 0x02, 0x21, 0x00, 0x00, 0x70, 0x41, 0x00, 0x00, 0x70, 0x44, + 0x00, 0x00, 0x40, 0x46, 0x04, 0x00, 0x00, 0x41, 0x04, 0x00, 0x00, 0x44, + 0x43, 0x01, 0x00, 0x47, 0x7c, 0x40, 0x02, 0x21, 0x00, 0xe1, 0x00, 0xe0, + 0x80, 0xe1, 0x00, 0xe0, 0x00, 0xe2, 0x00, 0xe0, 0x80, 0xe2, 0x00, 0xe0, + 0x00, 0xe3, 0x00, 0xe0, 0x00, 0xe4, 0x00, 0xe0, 0x00, 0xed, 0x00, 0xe0, + 0x18, 0xed, 0x00, 0xe0, 0x50, 0xed, 0x00, 0xe0, 0x60, 0xed, 0x00, 0xe0, + 0x88, 0xed, 0x00, 0xe0, 0x5c, 0x9d, 0x04, 0x02, 0x10, 0xe0, 0x00, 0xe0, + 0x34, 0xef, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x47, 0x00, 0x00, 0xb0, 0x46, + 0x00, 0x20, 0x82, 0x60, 0x00, 0x20, 0x92, 0x60, 0x00, 0x20, 0xa2, 0x60, + 0x00, 0x20, 0xb2, 0x60, 0x00, 0x20, 0xc2, 0x60, 0x00, 0x20, 0xd2, 0x60, + 0x00, 0x20, 0xe2, 0x60, 0x00, 0x20, 0xf2, 0x60, 0x00, 0x20, 0x02, 0x60, + 0x00, 0x20, 0x12, 0x60, 0x00, 0x20, 0x22, 0x60, 0x00, 0x20, 0x32, 0x60, + 0x00, 0x20, 0x42, 0x60, 0x00, 0x20, 0x52, 0x60, 0x00, 0x20, 0x62, 0x60, + 0x00, 0x20, 0x72, 0x60, 0x00, 0x20, 0x02, 0x61, 0x00, 0x20, 0x12, 0x61, + 0x04, 0xed, 0x00, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x02, 0x46, 0x00, 0x20, + 0x02, 0x29, 0x00, 0xdb, 0x70, 0x47, 0x30, 0xb5, 0x1c, 0x4b, 0x1c, 0x68, + 0x22, 0x44, 0xed, 0x23, 0x92, 0xf8, 0xbc, 0x50, 0x5d, 0x43, 0x32, 0x22, + 0x63, 0x19, 0x51, 0x43, 0x19, 0x44, 0x91, 0xf8, 0x77, 0x44, 0x01, 0x2c, + 0x08, 0xbf, 0x01, 0x20, 0x30, 0xbd, 0x38, 0xb5, 0x04, 0x46, 0x00, 0x21, + 0xff, 0xf7, 0xe4, 0xff, 0x00, 0x25, 0x28, 0xb9, 0x01, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0xde, 0xff, 0x00, 0xb1, 0x01, 0x25, 0x28, 0x46, 0x32, 0xbd, + 0x70, 0xb5, 0x14, 0x46, 0x0c, 0x4a, 0x02, 0xeb, 0xc0, 0x00, 0x1d, 0x46, + 0x50, 0xf8, 0x21, 0x60, 0x23, 0x46, 0x4f, 0xf4, 0xe0, 0x02, 0x14, 0x21, + 0x30, 0x46, 0xff, 0xf7, 0xbd, 0xff, 0x01, 0x2c, 0x07, 0xd1, 0x2b, 0x46, + 0x30, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x4f, 0xf4, 0x40, 0x32, 0x10, 0x21, + 0xb2, 0xe7, 0x70, 0xbd, 0x5c, 0x75, 0x02, 0x21, 0xdc, 0x91, 0x04, 0x02, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x10, 0xb5, 0x90, 0x4b, 0x1c, 0x68, 0x70, 0x22, + 0x50, 0x43, 0x22, 0x18, 0x88, 0x78, 0x02, 0xf5, 0x32, 0x62, 0x18, 0xb9, + 0x50, 0x69, 0x08, 0x61, 0x00, 0x20, 0x02, 0xe0, 0x10, 0x69, 0x08, 0x61, + 0x40, 0x08, 0x48, 0x61, 0x10, 0xbd, 0x88, 0x49, 0x51, 0xf8, 0x20, 0x00, + 0x18, 0x30, 0x00, 0x68, 0x20, 0xf0, 0x7f, 0x40, 0x01, 0x02, 0x48, 0xbf, + 0x40, 0xf0, 0x7f, 0x40, 0x70, 0x47, 0x82, 0x49, 0x51, 0xf8, 0x20, 0x00, + 0xec, 0x30, 0x00, 0x68, 0x20, 0xf0, 0x7f, 0x40, 0x01, 0x02, 0x48, 0xbf, + 0x40, 0xf0, 0x7f, 0x40, 0x70, 0x47, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x4b, + 0x81, 0x46, 0x0d, 0x46, 0xe2, 0xf7, 0xdb, 0xff, 0x04, 0x46, 0x38, 0x21, + 0xaa, 0x78, 0x78, 0x4f, 0x61, 0x43, 0x1c, 0x20, 0x79, 0x18, 0x42, 0x43, + 0x88, 0x18, 0x06, 0x1d, 0x00, 0xf1, 0x3c, 0x08, 0x30, 0x46, 0x29, 0x46, + 0x00, 0xf0, 0x9d, 0xf8, 0x28, 0x78, 0x07, 0xeb, 0x44, 0x07, 0x58, 0xb9, + 0x00, 0x21, 0x71, 0x60, 0xb1, 0x60, 0x28, 0x7e, 0x30, 0xb9, 0xa9, 0x78, + 0x78, 0x5c, 0x18, 0xb1, 0x30, 0x46, 0x41, 0x46, 0x00, 0xf0, 0x8d, 0xf8, + 0x31, 0x46, 0x48, 0x46, 0xff, 0xf7, 0xaa, 0xff, 0x30, 0x78, 0x00, 0x24, + 0x40, 0xb1, 0xb0, 0x78, 0x01, 0x28, 0x05, 0xd1, 0x71, 0x69, 0x70, 0x68, + 0xd3, 0xf7, 0x90, 0xfe, 0x04, 0x00, 0x4b, 0xd1, 0x60, 0x48, 0x50, 0xf8, + 0x29, 0x90, 0xb0, 0x78, 0x73, 0x68, 0x00, 0x28, 0x09, 0xf1, 0xe8, 0x0b, + 0x6f, 0xf0, 0x7f, 0x42, 0x0b, 0xd1, 0x00, 0x21, 0x09, 0xf1, 0x18, 0x00, + 0xff, 0xf7, 0x80, 0xff, 0x01, 0x23, 0x4f, 0xf0, 0x00, 0x52, 0x1d, 0x21, + 0x09, 0xf1, 0x14, 0x00, 0x08, 0xe0, 0x00, 0x21, 0x09, 0xf1, 0xec, 0x00, + 0xff, 0xf7, 0x74, 0xff, 0x01, 0x23, 0x08, 0x22, 0x03, 0x21, 0x58, 0x46, + 0xff, 0xf7, 0x6e, 0xff, 0x96, 0xed, 0x02, 0x0a, 0xb8, 0xee, 0x40, 0x0a, + 0xdf, 0xed, 0x4a, 0x0a, 0x60, 0xee, 0x20, 0x0a, 0x9f, 0xed, 0x49, 0x1a, + 0xb1, 0x78, 0x4c, 0x4a, 0x80, 0xee, 0x81, 0x1a, 0xbc, 0xee, 0xc1, 0x0a, + 0x01, 0x29, 0x10, 0xee, 0x10, 0x3a, 0x07, 0xbf, 0x10, 0x21, 0x09, 0xf1, + 0xf4, 0x00, 0x10, 0x21, 0x09, 0xf1, 0x20, 0x00, 0xff, 0xf7, 0x52, 0xff, + 0xb1, 0x78, 0x29, 0xb9, 0x01, 0x23, 0x10, 0x22, 0x04, 0x21, 0x09, 0xf1, + 0x04, 0x00, 0x03, 0xe0, 0x33, 0x78, 0x02, 0x22, 0x01, 0x21, 0x58, 0x46, + 0xff, 0xf7, 0x44, 0xff, 0x28, 0x7e, 0x01, 0x28, 0x06, 0xd1, 0x40, 0x46, + 0x31, 0x46, 0x00, 0xf0, 0x2a, 0xf8, 0xa8, 0x78, 0x01, 0x21, 0x39, 0x54, + 0x20, 0x46, 0xbd, 0xe8, 0xf0, 0x8b, 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, + 0xe2, 0xf7, 0x4d, 0xff, 0x01, 0x46, 0x38, 0x22, 0xa8, 0x78, 0x31, 0x4b, + 0x51, 0x43, 0x5a, 0x18, 0x06, 0x46, 0x1c, 0x21, 0x4e, 0x43, 0x91, 0x19, + 0x0e, 0x1d, 0x21, 0x46, 0x00, 0xf0, 0x14, 0xf8, 0x30, 0x70, 0xa8, 0x78, + 0x00, 0x28, 0x20, 0x46, 0x02, 0xd1, 0xff, 0xf7, 0x3e, 0xff, 0x01, 0xe0, + 0xff, 0xf7, 0x47, 0xff, 0x70, 0x60, 0x31, 0x46, 0x28, 0x46, 0x00, 0xf0, + 0x02, 0xf8, 0x00, 0x20, 0x70, 0xbd, 0x1c, 0x22, 0xd4, 0xf7, 0xe6, 0xba, + 0x20, 0x4a, 0x52, 0xf8, 0x21, 0x10, 0x20, 0xb9, 0x51, 0xf8, 0x04, 0x0f, + 0xc0, 0xf3, 0x00, 0x10, 0x70, 0x47, 0x51, 0xf8, 0xe8, 0x0f, 0xc0, 0xf3, + 0x40, 0x00, 0x70, 0x47, 0x18, 0xb5, 0x87, 0xb0, 0x01, 0x22, 0x0c, 0x46, + 0x8d, 0xf8, 0x02, 0x20, 0x69, 0x46, 0xff, 0xf7, 0x07, 0xff, 0x05, 0x99, + 0x20, 0x46, 0xd3, 0xf7, 0xf3, 0xfd, 0x08, 0xb0, 0x10, 0xbd, 0x15, 0x4b, + 0x18, 0x70, 0x59, 0x70, 0x08, 0x12, 0x98, 0x70, 0x09, 0x14, 0xd9, 0x70, + 0x1a, 0x71, 0x10, 0x12, 0x58, 0x71, 0x12, 0x14, 0x9a, 0x71, 0x70, 0x47, + 0x1c, 0xb5, 0x04, 0x46, 0x08, 0x46, 0x6a, 0x46, 0x0d, 0xf1, 0x01, 0x01, + 0xf2, 0xf7, 0x16, 0xf9, 0x0a, 0x48, 0x04, 0x70, 0x9d, 0xf8, 0x01, 0x10, + 0x41, 0x70, 0x9d, 0xf8, 0x00, 0x20, 0x82, 0x70, 0x13, 0xbd, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, 0xb4, 0x43, 0x5c, 0x75, 0x02, 0x21, + 0xcc, 0x9e, 0x04, 0x02, 0xd4, 0x6a, 0x02, 0x21, 0x00, 0x00, 0xff, 0xff, + 0x23, 0x02, 0x00, 0x47, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x2d, 0xe9, 0xf8, 0x4e, + 0x0f, 0x46, 0x89, 0xb0, 0x83, 0x46, 0x78, 0x78, 0xdf, 0xf8, 0xf8, 0xa2, + 0xdf, 0xf8, 0xf8, 0x92, 0x00, 0x90, 0x58, 0x46, 0xba, 0x78, 0x02, 0x92, + 0xe2, 0xf7, 0xba, 0xfe, 0x00, 0x9a, 0x1c, 0x21, 0x4a, 0x43, 0x04, 0x46, + 0x70, 0x23, 0x02, 0x99, 0x63, 0x43, 0x38, 0x20, 0x41, 0x43, 0x0a, 0xeb, + 0x03, 0x05, 0x4b, 0x44, 0x0d, 0x44, 0x19, 0x44, 0x15, 0x44, 0x11, 0x44, + 0x01, 0xf1, 0x10, 0x02, 0x01, 0x92, 0x28, 0x46, 0x3e, 0x78, 0x39, 0x46, + 0x00, 0xf0, 0x55, 0xf9, 0x02, 0x99, 0x09, 0xeb, 0x84, 0x00, 0x00, 0xeb, + 0x41, 0x07, 0x28, 0x78, 0x88, 0xb9, 0x00, 0x21, 0x69, 0x60, 0xa8, 0x60, + 0x08, 0x21, 0x28, 0x7e, 0x29, 0x73, 0x69, 0x73, 0x00, 0x28, 0x02, 0xbf, + 0x00, 0x98, 0x39, 0x5c, 0x01, 0x29, 0x04, 0xd1, 0x01, 0x99, 0x00, 0xf0, + 0x3d, 0xf9, 0x00, 0x20, 0x28, 0x76, 0x58, 0x46, 0xe2, 0xf7, 0x86, 0xfe, + 0x04, 0x46, 0xa8, 0x78, 0x8d, 0xf8, 0x0a, 0x00, 0x02, 0xa9, 0x58, 0x46, + 0x00, 0xf0, 0x16, 0xfa, 0x9d, 0x49, 0x09, 0x68, 0x01, 0xeb, 0x0b, 0x03, + 0xed, 0x22, 0x93, 0xf8, 0xbc, 0xc0, 0xab, 0x78, 0x12, 0xfb, 0x0c, 0xfc, + 0x01, 0xeb, 0x0c, 0x02, 0x32, 0x21, 0x4b, 0x43, 0xd2, 0x18, 0xd2, 0xf8, + 0x69, 0x14, 0x29, 0x61, 0x49, 0x08, 0x00, 0x28, 0x69, 0x61, 0x49, 0xd1, + 0x70, 0x22, 0xa9, 0x78, 0x54, 0x43, 0x0a, 0xeb, 0x04, 0x02, 0x0c, 0x46, + 0x38, 0x23, 0x5c, 0x43, 0x13, 0x19, 0x6a, 0x78, 0x82, 0xf0, 0x01, 0x0c, + 0x1c, 0x22, 0x12, 0xfb, 0x0c, 0xfc, 0x01, 0x2e, 0x13, 0xf8, 0x0c, 0x40, + 0x2d, 0xd1, 0x58, 0x46, 0x00, 0xf0, 0xff, 0xf9, 0x01, 0x2c, 0x01, 0x46, + 0x0f, 0xd1, 0xe8, 0x78, 0x10, 0xb9, 0x68, 0x68, 0x09, 0x18, 0x69, 0x60, + 0x69, 0x68, 0x03, 0x98, 0x08, 0x1a, 0x68, 0x60, 0x69, 0x69, 0xd3, 0xf7, + 0x2f, 0xfd, 0x18, 0xb3, 0x4b, 0xf2, 0x05, 0x00, 0x20, 0xe0, 0x6a, 0x68, + 0x00, 0x2a, 0x54, 0xbf, 0x4f, 0xf4, 0xfa, 0x64, 0x7c, 0x4c, 0x12, 0x1b, + 0x03, 0x92, 0xe8, 0x78, 0x08, 0xb9, 0x89, 0x18, 0x03, 0x91, 0x01, 0x21, + 0x8d, 0xf8, 0x08, 0x10, 0x00, 0x21, 0xaa, 0x78, 0x8d, 0xf8, 0x0a, 0x20, + 0x04, 0x91, 0x00, 0xf0, 0xa1, 0xf8, 0x6c, 0x60, 0x08, 0xe0, 0x01, 0x2c, + 0x06, 0xd0, 0x8d, 0xf8, 0x08, 0x00, 0xa9, 0x78, 0x8d, 0xf8, 0x0a, 0x10, + 0x00, 0xf0, 0x96, 0xf8, 0x04, 0x00, 0x29, 0xd1, 0x28, 0x7e, 0x01, 0x28, + 0x0d, 0xd1, 0x70, 0x22, 0xa8, 0x78, 0x12, 0xfb, 0x0b, 0xf2, 0x38, 0x21, + 0x4a, 0x44, 0x48, 0x43, 0x11, 0x18, 0x6a, 0x78, 0x1c, 0x20, 0x42, 0x43, + 0x88, 0x18, 0x69, 0x68, 0x41, 0x61, 0x66, 0x48, 0xa9, 0x78, 0x2b, 0x78, + 0x00, 0xeb, 0xcb, 0x06, 0x56, 0xf8, 0x21, 0x00, 0x69, 0x78, 0x11, 0xb9, + 0x01, 0x22, 0x40, 0x30, 0x02, 0xe0, 0x01, 0x22, 0x00, 0x21, 0x54, 0x30, + 0xff, 0xf7, 0x22, 0xff, 0x28, 0x78, 0x00, 0x28, 0x60, 0xd0, 0x69, 0x69, + 0x68, 0x68, 0xd3, 0xf7, 0xdf, 0xfc, 0x04, 0x00, 0x5a, 0xd1, 0xa8, 0x78, + 0x56, 0xf8, 0x20, 0x40, 0x68, 0x78, 0x6b, 0x68, 0x00, 0x28, 0x6f, 0xf0, + 0xff, 0x02, 0x0a, 0xd1, 0x08, 0x21, 0x04, 0xf1, 0x44, 0x00, 0xff, 0xf7, + 0x0b, 0xff, 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, 0x04, 0xf1, 0x40, 0x00, + 0x09, 0xe0, 0x08, 0x21, 0x04, 0xf1, 0x58, 0x00, 0xff, 0xf7, 0x00, 0xff, + 0x01, 0x23, 0x20, 0x22, 0x05, 0x21, 0x04, 0xf1, 0x54, 0x00, 0xff, 0xf7, + 0xf9, 0xfe, 0x28, 0x46, 0xd3, 0xf7, 0xa6, 0xfc, 0x04, 0x00, 0x35, 0xd1, + 0xa8, 0x78, 0x56, 0xf8, 0x20, 0x40, 0x68, 0x78, 0x6b, 0x7b, 0x00, 0x28, + 0x0c, 0xbf, 0x44, 0x34, 0x58, 0x34, 0xf0, 0x22, 0x04, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0xe6, 0xfe, 0x2b, 0x7b, 0x0f, 0x22, 0x00, 0x21, 0x20, 0x46, + 0xff, 0xf7, 0xe0, 0xfe, 0x28, 0x46, 0xd3, 0xf7, 0x97, 0xfc, 0x04, 0x00, + 0x1c, 0xd1, 0x95, 0xed, 0x02, 0x0a, 0xa8, 0x78, 0xb8, 0xee, 0x40, 0x0a, + 0xdf, 0xed, 0x31, 0x0a, 0x60, 0xee, 0x20, 0x0a, 0x9f, 0xed, 0x30, 0x1a, + 0x69, 0x78, 0x56, 0xf8, 0x20, 0x00, 0x34, 0x4a, 0x80, 0xee, 0x81, 0x1a, + 0xbc, 0xee, 0xc1, 0x0a, 0x00, 0x29, 0x10, 0xee, 0x10, 0x3a, 0x07, 0xbf, + 0x10, 0x21, 0x4c, 0x30, 0x10, 0x21, 0x60, 0x30, 0xff, 0xf7, 0xbe, 0xfe, + 0x28, 0x7e, 0x01, 0x28, 0x06, 0xd1, 0x01, 0x98, 0x29, 0x46, 0x00, 0xf0, + 0x42, 0xf8, 0x00, 0x99, 0x01, 0x20, 0x78, 0x54, 0x20, 0x46, 0x0a, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8e, 0x02, 0xa9, 0x28, 0x7e, 0x8d, 0xf8, 0x20, 0x00, + 0x58, 0x46, 0x00, 0xf0, 0x97, 0xb8, 0xf0, 0xb5, 0x0d, 0x46, 0x87, 0xb0, + 0x6f, 0x78, 0xac, 0x78, 0x06, 0x46, 0xe2, 0xf7, 0x79, 0xfd, 0x70, 0x23, + 0x18, 0x4a, 0xa6, 0x46, 0x01, 0x46, 0x59, 0x43, 0x53, 0x18, 0x38, 0x22, + 0x12, 0xfb, 0x0e, 0xfe, 0x1c, 0x21, 0x03, 0xeb, 0x0e, 0x02, 0x4f, 0x43, + 0xd1, 0x19, 0x00, 0xf0, 0x1b, 0xf8, 0x8d, 0xf8, 0x02, 0x40, 0x69, 0x46, + 0x30, 0x46, 0x00, 0xf0, 0xfb, 0xf8, 0x04, 0x00, 0x0f, 0xd1, 0x9d, 0xf8, + 0x00, 0x00, 0x60, 0xb1, 0x68, 0x68, 0x01, 0x99, 0x08, 0x18, 0x68, 0x60, + 0xe8, 0x78, 0x30, 0xb9, 0xa9, 0x78, 0x30, 0x46, 0x00, 0xf0, 0x01, 0xf9, + 0x69, 0x68, 0x08, 0x1a, 0x68, 0x60, 0x20, 0x46, 0x07, 0xb0, 0xf0, 0xbd, + 0x28, 0x46, 0x1c, 0x22, 0xd4, 0xf7, 0x0e, 0xb9, 0x00, 0x00, 0x80, 0x47, + 0x00, 0x00, 0xb4, 0x43, 0x40, 0x56, 0x02, 0x21, 0x30, 0x48, 0x02, 0x21, + 0x5c, 0x75, 0x02, 0x21, 0x30, 0xf8, 0xff, 0xff, 0xdc, 0x91, 0x04, 0x02, + 0x00, 0x00, 0xff, 0xff, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x38, 0xb5, 0x12, 0x4a, + 0x02, 0xeb, 0xc0, 0x00, 0x4f, 0xf6, 0xff, 0x75, 0x50, 0xf8, 0x21, 0x40, + 0x00, 0x23, 0x2a, 0x46, 0x00, 0x21, 0x04, 0xf1, 0x38, 0x00, 0xff, 0xf7, + 0xe3, 0xff, 0x00, 0x23, 0x2a, 0x46, 0x00, 0x21, 0x04, 0xf1, 0x3c, 0x00, + 0xff, 0xf7, 0xdc, 0xff, 0x2c, 0x34, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, + 0x20, 0x46, 0xff, 0xf7, 0xd5, 0xff, 0x20, 0x46, 0x01, 0xb0, 0xbd, 0xe8, + 0x30, 0x40, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0xcc, 0xe7, 0x00, 0x00, + 0xdc, 0x91, 0x04, 0x02, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x5f, 0x4b, 0x03, 0xeb, + 0xc0, 0x00, 0x40, 0xf8, 0x21, 0x20, 0x70, 0x47, 0x5c, 0x4a, 0x02, 0xeb, + 0xc0, 0x00, 0x50, 0xf8, 0x21, 0x00, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x47, + 0x81, 0x46, 0x0e, 0x46, 0xe2, 0xf7, 0xe4, 0xfc, 0x04, 0x46, 0xb1, 0x78, + 0x56, 0x4a, 0x57, 0x4d, 0x1c, 0x20, 0x41, 0x43, 0x38, 0x20, 0x60, 0x43, + 0x02, 0x44, 0x57, 0x18, 0x2b, 0x18, 0x19, 0x44, 0x01, 0xf1, 0x08, 0x08, + 0x38, 0x46, 0x31, 0x46, 0x00, 0xf0, 0x7c, 0xf8, 0x38, 0x78, 0x05, 0xeb, + 0x44, 0x05, 0x68, 0xb9, 0x00, 0x21, 0x38, 0x7e, 0x79, 0x60, 0xb9, 0x60, + 0x00, 0x28, 0x02, 0xbf, 0xb0, 0x78, 0x29, 0x5c, 0x01, 0x29, 0x03, 0xd1, + 0x38, 0x46, 0x41, 0x46, 0x00, 0xf0, 0x6a, 0xf8, 0xb9, 0x78, 0x48, 0x46, + 0xff, 0xf7, 0xcc, 0xff, 0x38, 0x61, 0x40, 0x08, 0x39, 0x78, 0x78, 0x61, + 0x00, 0x24, 0x29, 0xb1, 0x01, 0x46, 0x78, 0x68, 0xd3, 0xf7, 0x9e, 0xfb, + 0x04, 0x00, 0x3a, 0xd1, 0x3f, 0x48, 0xb9, 0x78, 0x00, 0xeb, 0xc9, 0x09, + 0x00, 0x23, 0x59, 0xf8, 0x21, 0x00, 0x00, 0xf1, 0x04, 0x0a, 0x02, 0x22, + 0x01, 0x21, 0x50, 0x46, 0xff, 0xf7, 0x9e, 0xff, 0x7b, 0x68, 0x39, 0x4a, + 0x06, 0x21, 0x50, 0x46, 0xff, 0xf7, 0x98, 0xff, 0x01, 0x23, 0x10, 0x22, + 0x04, 0x21, 0x50, 0x46, 0xff, 0xf7, 0x92, 0xff, 0x97, 0xed, 0x02, 0x0a, + 0xb8, 0x78, 0xb8, 0xee, 0x40, 0x0a, 0xdf, 0xed, 0x2b, 0x0a, 0x60, 0xee, + 0x20, 0x0a, 0x9f, 0xed, 0x2a, 0x1a, 0x80, 0xee, 0x81, 0x1a, 0x59, 0xf8, + 0x20, 0x00, 0x2d, 0x4a, 0xbc, 0xee, 0xc1, 0x1a, 0x11, 0xee, 0x10, 0x3a, + 0x10, 0x21, 0x14, 0x30, 0xff, 0xf7, 0x7a, 0xff, 0xb8, 0x78, 0x59, 0xf8, + 0x20, 0x00, 0x3b, 0x78, 0x04, 0x22, 0x02, 0x21, 0x00, 0x1d, 0xff, 0xf7, + 0x71, 0xff, 0x30, 0x7e, 0x01, 0x28, 0x06, 0xd1, 0x40, 0x46, 0x39, 0x46, + 0x00, 0xf0, 0x18, 0xf8, 0xb0, 0x78, 0x01, 0x21, 0x29, 0x54, 0x20, 0x46, + 0xbd, 0xe8, 0xf0, 0x87, 0x10, 0xb5, 0x0c, 0x46, 0xe2, 0xf7, 0x64, 0xfc, + 0x01, 0x46, 0x38, 0x22, 0x20, 0x46, 0x16, 0x4b, 0xa4, 0x78, 0x51, 0x43, + 0x5a, 0x18, 0x1c, 0x21, 0x4c, 0x43, 0x11, 0x19, 0x00, 0xf0, 0x02, 0xf8, + 0x00, 0x20, 0x10, 0xbd, 0x1c, 0x22, 0xd4, 0xf7, 0x17, 0xb8, 0x38, 0xb5, + 0x0d, 0x46, 0xe2, 0xf7, 0x4f, 0xfc, 0x0e, 0x4a, 0x02, 0xeb, 0x40, 0x01, + 0x00, 0x24, 0x4b, 0x5d, 0x01, 0x2b, 0x0a, 0xd1, 0x38, 0x21, 0x48, 0x43, + 0x11, 0x18, 0x1c, 0x22, 0x55, 0x43, 0x4a, 0x19, 0x02, 0xf1, 0x08, 0x01, + 0x08, 0x78, 0x00, 0xb1, 0x4c, 0x68, 0x20, 0x46, 0x32, 0xbd, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, 0xb4, 0x43, 0x30, 0x72, 0x02, 0x21, + 0xd4, 0x60, 0x02, 0x21, 0x2c, 0x5e, 0x02, 0x21, 0xdc, 0x91, 0x04, 0x02, + 0xc0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x10, 0xb5, 0x1b, 0x4c, + 0xb0, 0x21, 0x20, 0x46, 0xe6, 0xf7, 0xa2, 0xf9, 0x19, 0x4a, 0x13, 0x68, + 0x23, 0x60, 0x10, 0xbd, 0x80, 0xb5, 0x18, 0x48, 0x18, 0x49, 0x09, 0x1a, + 0x00, 0xf0, 0x38, 0xf8, 0x13, 0x4a, 0x50, 0x60, 0x01, 0xbd, 0x13, 0x21, + 0x15, 0x48, 0xee, 0xf7, 0xce, 0xb9, 0x13, 0x21, 0x13, 0x48, 0xee, 0xf7, + 0x2c, 0xba, 0x10, 0xb5, 0x12, 0x48, 0x13, 0x4c, 0x00, 0x68, 0x4d, 0xf2, + 0xd8, 0x31, 0x42, 0x58, 0x22, 0x60, 0x00, 0xf0, 0x23, 0xf8, 0x60, 0x60, + 0x10, 0xbd, 0x0e, 0x48, 0x41, 0x68, 0x00, 0x68, 0x81, 0x42, 0x01, 0xd1, + 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x01, 0x21, 0x0a, 0x48, + 0x00, 0xf0, 0x38, 0xb9, 0x01, 0x21, 0x08, 0x48, 0x00, 0xf0, 0x46, 0xb9, + 0xf8, 0x73, 0x03, 0x21, 0xfc, 0xff, 0x04, 0x02, 0x00, 0x00, 0x00, 0x02, + 0xfc, 0xff, 0x04, 0x02, 0x00, 0x74, 0x03, 0x21, 0x64, 0x75, 0x02, 0x21, + 0x98, 0x74, 0x03, 0x21, 0xa0, 0x74, 0x03, 0x21, 0x01, 0x23, 0x00, 0x22, + 0xf0, 0xb5, 0x00, 0x25, 0x12, 0x4e, 0x10, 0xe0, 0x47, 0x5d, 0x3c, 0x09, + 0x44, 0xea, 0x02, 0x14, 0x12, 0x0f, 0x56, 0xf8, 0x22, 0x20, 0x54, 0x40, + 0x07, 0xf0, 0x0f, 0x02, 0x42, 0xea, 0x04, 0x12, 0x24, 0x0f, 0x56, 0xf8, + 0x24, 0x40, 0x62, 0x40, 0x6d, 0x1c, 0x8d, 0x42, 0xec, 0xd3, 0x63, 0xb1, + 0x04, 0x20, 0x11, 0x0f, 0x56, 0xf8, 0x21, 0x10, 0x81, 0xea, 0x02, 0x11, + 0x0a, 0x0f, 0x56, 0xf8, 0x22, 0x20, 0x40, 0x1e, 0x82, 0xea, 0x01, 0x12, + 0xf3, 0xd1, 0x10, 0x46, 0xf0, 0xbd, 0x00, 0x00, 0x5c, 0x91, 0x04, 0x02, + 0x38, 0xb5, 0x00, 0xe0, 0x38, 0xb5, 0x55, 0x4c, 0x04, 0xeb, 0x80, 0x05, + 0x00, 0x23, 0xa8, 0x68, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x00, 0x22, + 0x00, 0x21, 0xf1, 0xf7, 0x88, 0xbf, 0x38, 0xb5, 0x00, 0xf0, 0x0b, 0xf8, + 0x01, 0x28, 0x18, 0xbf, 0x00, 0x20, 0x32, 0xbd, 0x38, 0xb5, 0x00, 0xf0, + 0x04, 0xf8, 0x01, 0x28, 0x18, 0xbf, 0x00, 0x20, 0x32, 0xbd, 0x48, 0x4c, + 0x04, 0xeb, 0x80, 0x05, 0x4f, 0xf4, 0x7a, 0x72, 0x51, 0x43, 0xa8, 0x68, + 0xb1, 0xfb, 0xf2, 0xf1, 0xf2, 0xf7, 0xbc, 0xb8, 0x42, 0x49, 0x08, 0x70, + 0x70, 0x47, 0x41, 0x49, 0x48, 0x70, 0x70, 0x47, 0xf8, 0xb5, 0x3f, 0x4c, + 0x04, 0xf1, 0x28, 0x01, 0x01, 0x20, 0xf1, 0xf7, 0x29, 0xff, 0x00, 0x25, + 0x60, 0x60, 0x10, 0xb9, 0x4f, 0xf6, 0x6f, 0x75, 0x1d, 0xe0, 0x00, 0x26, + 0x50, 0x27, 0x30, 0x46, 0xe2, 0xf7, 0x76, 0xfb, 0xff, 0x28, 0x13, 0xd0, + 0x07, 0xfb, 0x06, 0xf0, 0x20, 0x44, 0x00, 0xf1, 0x78, 0x01, 0x01, 0x20, + 0xf1, 0xf7, 0x14, 0xff, 0x04, 0xeb, 0x86, 0x01, 0x88, 0x60, 0x00, 0x21, + 0xf2, 0xf7, 0x94, 0xf8, 0x01, 0x21, 0x30, 0x46, 0xee, 0xf7, 0x26, 0xf8, + 0x00, 0xb1, 0x05, 0x46, 0x76, 0x1c, 0x08, 0x2e, 0xe3, 0xd3, 0x28, 0x46, + 0xf2, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x00, 0x20, 0x16, 0x46, 0x08, 0x2e, + 0x1d, 0x46, 0x26, 0x4a, 0x03, 0xd1, 0x13, 0x78, 0x01, 0x2b, 0x1d, 0xd1, + 0x03, 0xe0, 0x0a, 0x2e, 0x18, 0xbf, 0x09, 0x2e, 0x0b, 0xd0, 0x50, 0x78, + 0x48, 0xb9, 0x50, 0x68, 0x4f, 0xf4, 0x7a, 0x71, 0xf2, 0xf7, 0x72, 0xf8, + 0x01, 0x28, 0x02, 0xd0, 0x4f, 0xf6, 0x70, 0x70, 0x70, 0xbd, 0x29, 0x46, + 0x30, 0x46, 0x00, 0xf0, 0x48, 0xf8, 0x01, 0x46, 0x01, 0x20, 0x00, 0xf0, + 0x31, 0xf8, 0x01, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x31, 0xe0, + 0x70, 0xbd, 0xf8, 0xb5, 0x06, 0x46, 0x15, 0x46, 0x00, 0x27, 0x28, 0x46, + 0x08, 0x28, 0x19, 0x46, 0x10, 0x4c, 0x02, 0xd1, 0x22, 0x78, 0x01, 0x2a, + 0x1a, 0xd1, 0x00, 0xf0, 0x30, 0xf8, 0x01, 0x46, 0x00, 0x20, 0x00, 0xf0, + 0x19, 0xf8, 0x01, 0x46, 0x30, 0x46, 0x00, 0xf0, 0x1b, 0xf8, 0x0a, 0x2d, + 0x18, 0xbf, 0x09, 0x2d, 0x07, 0x46, 0x0b, 0xd0, 0x60, 0x78, 0x48, 0xb9, + 0x60, 0x68, 0x00, 0x23, 0x00, 0x22, 0x00, 0x21, 0xf1, 0xf7, 0xef, 0xfe, + 0x01, 0x28, 0x18, 0xbf, 0x4f, 0xf6, 0x78, 0x77, 0x38, 0x46, 0xf2, 0xbd, + 0xc0, 0x3a, 0x02, 0x21, 0x18, 0xb1, 0x09, 0xb9, 0x03, 0x20, 0x70, 0x47, + 0x02, 0x20, 0x70, 0x47, 0x02, 0x29, 0x04, 0xbf, 0x01, 0x21, 0xed, 0xf7, + 0xbc, 0xbf, 0x03, 0x29, 0x04, 0xbf, 0x01, 0x21, 0xed, 0xf7, 0xb4, 0xbf, + 0x01, 0x21, 0xed, 0xf7, 0xb7, 0xbf, 0x02, 0x46, 0x01, 0x20, 0x92, 0x1f, + 0x01, 0x2a, 0x01, 0xd8, 0x01, 0xb1, 0x08, 0x78, 0x70, 0x47, 0x38, 0xb5, + 0x04, 0x46, 0x00, 0x21, 0x00, 0xf0, 0x4b, 0xf9, 0x05, 0x46, 0x01, 0x21, + 0x20, 0x46, 0x00, 0xf0, 0x46, 0xf9, 0x45, 0xea, 0x80, 0x05, 0xed, 0xb2, + 0x35, 0xb1, 0x03, 0x2d, 0x02, 0xd0, 0x0c, 0x2d, 0x02, 0xd0, 0x03, 0xe0, + 0x01, 0x20, 0x32, 0xbd, 0x00, 0x20, 0x32, 0xbd, 0x02, 0x20, 0x32, 0xbd, + 0x38, 0xb5, 0x04, 0x46, 0xef, 0xf7, 0x1e, 0xff, 0x00, 0x25, 0x00, 0x2c, + 0x1c, 0xbf, 0x00, 0x78, 0x00, 0x28, 0x07, 0xd0, 0xff, 0xf7, 0xcc, 0xfe, + 0xff, 0xf7, 0xce, 0xfe, 0x01, 0x28, 0x18, 0xbf, 0x4b, 0xf6, 0x01, 0x65, + 0x28, 0x46, 0x32, 0xbd, 0x10, 0xb5, 0x05, 0x4a, 0x11, 0x68, 0x04, 0x46, + 0x04, 0x48, 0xff, 0xf7, 0xd5, 0xfe, 0x60, 0x60, 0x03, 0x48, 0x01, 0x68, + 0x21, 0x60, 0x10, 0xbd, 0x20, 0x04, 0x00, 0x20, 0x00, 0x00, 0x30, 0x4d, + 0x24, 0x04, 0x00, 0x20, 0x01, 0x46, 0x01, 0x20, 0x0a, 0x68, 0x49, 0x68, + 0x8a, 0x42, 0x18, 0xbf, 0x00, 0x20, 0x70, 0x47, 0x06, 0x22, 0x1a, 0x49, + 0x42, 0x43, 0x11, 0x44, 0xc0, 0xb2, 0xee, 0xf7, 0x6b, 0xba, 0x10, 0xb5, + 0x04, 0x46, 0xff, 0xf7, 0xf5, 0xff, 0x50, 0xb9, 0x01, 0x21, 0x20, 0x46, + 0x00, 0xf0, 0x28, 0xf8, 0x28, 0xb9, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, + 0x40, 0xf2, 0x47, 0x31, 0x23, 0xe0, 0x10, 0xbd, 0x70, 0xb5, 0x05, 0x46, + 0x06, 0x22, 0x0d, 0x49, 0x6a, 0x43, 0x8e, 0x18, 0x30, 0x78, 0x80, 0xb1, + 0xb1, 0x88, 0xe8, 0xb2, 0xee, 0xf7, 0x1a, 0xfa, 0x04, 0x00, 0x0c, 0xd1, + 0x71, 0x78, 0xe8, 0xb2, 0xee, 0xf7, 0x5a, 0xfa, 0x00, 0x21, 0xe8, 0xb2, + 0xee, 0xf7, 0xef, 0xf9, 0x00, 0x20, 0x30, 0x70, 0x01, 0xe0, 0x4f, 0xf6, + 0x6c, 0x74, 0x20, 0x46, 0x70, 0xbd, 0x00, 0x00, 0xd8, 0x72, 0x02, 0x21, + 0xc0, 0xb2, 0xee, 0xf7, 0x49, 0xba, 0xc0, 0xb2, 0xee, 0xf7, 0x00, 0xba, + 0x38, 0xb5, 0x05, 0x46, 0x21, 0xb9, 0x01, 0x21, 0xed, 0xf7, 0x27, 0xff, + 0x04, 0x46, 0x0b, 0xe0, 0x01, 0x21, 0xed, 0xf7, 0x25, 0xff, 0x04, 0x00, + 0x06, 0xd1, 0xe8, 0xb2, 0xee, 0xf7, 0x0d, 0xfa, 0x01, 0x28, 0x18, 0xbf, + 0x4f, 0xf6, 0x18, 0x74, 0x20, 0x46, 0x32, 0xbd, 0x1c, 0xb5, 0x04, 0x46, + 0xc0, 0xb2, 0xee, 0xf7, 0xc0, 0xf9, 0x01, 0x00, 0x18, 0xbf, 0x01, 0x21, + 0x00, 0xf0, 0x03, 0xf8, 0x9d, 0xf8, 0x00, 0x00, 0x16, 0xbd, 0x6b, 0x46, + 0x01, 0xaa, 0xc9, 0xb2, 0xe0, 0xb2, 0xee, 0xf7, 0x7e, 0xb9, 0xc0, 0xb2, + 0xee, 0xf7, 0xb0, 0xbb, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x78, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x70, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x10, 0xb5, 0x00, 0xf0, + 0x88, 0xf8, 0x03, 0xd1, 0x30, 0x22, 0x04, 0x21, 0xc0, 0x1c, 0x0a, 0xe0, + 0x01, 0x29, 0x03, 0xd1, 0x30, 0x22, 0x04, 0x21, 0x40, 0x1d, 0x04, 0xe0, + 0x02, 0x29, 0x03, 0xd1, 0x30, 0x22, 0x04, 0x21, 0x0b, 0x30, 0x27, 0xe0, + 0x10, 0xbd, 0x5d, 0x4a, 0x52, 0xf8, 0x20, 0x00, 0x0b, 0x00, 0x08, 0xbf, + 0xc0, 0x1c, 0x06, 0xd0, 0x01, 0x29, 0x08, 0xbf, 0x40, 0x1d, 0x02, 0xd0, + 0x02, 0x29, 0x02, 0xd1, 0x0b, 0x30, 0x00, 0x78, 0x75, 0xe0, 0x00, 0x20, + 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, 0x61, 0xf8, 0x03, 0xd1, 0x0f, 0x22, + 0x00, 0x21, 0xc0, 0x1c, 0x0a, 0xe0, 0x01, 0x29, 0x03, 0xd1, 0x0f, 0x22, + 0x00, 0x21, 0x40, 0x1d, 0x04, 0xe0, 0x02, 0x29, 0x03, 0xd1, 0x0f, 0x22, + 0x00, 0x21, 0x0b, 0x30, 0x00, 0xe0, 0x10, 0xbd, 0xbd, 0xe8, 0x10, 0x40, + 0xb2, 0xe7, 0x38, 0xb5, 0x14, 0x46, 0x47, 0x4a, 0x52, 0xf8, 0x20, 0x50, + 0x08, 0x00, 0x04, 0xd1, 0x23, 0x46, 0x3f, 0x22, 0x00, 0x21, 0x28, 0x1d, + 0x11, 0xe0, 0x01, 0x29, 0x08, 0xd1, 0x05, 0x20, 0xf5, 0xf7, 0x2a, 0xf8, + 0x78, 0xb1, 0x23, 0x46, 0x3f, 0x22, 0x00, 0x21, 0xa8, 0x1d, 0x06, 0xe0, + 0x02, 0x29, 0x08, 0xd1, 0x23, 0x46, 0x3f, 0x22, 0x00, 0x21, 0x05, 0xf1, + 0x0a, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x90, 0xe7, 0x31, 0xbd, + 0x38, 0xb5, 0x36, 0x4a, 0x52, 0xf8, 0x20, 0x40, 0x08, 0x00, 0x08, 0xbf, + 0x24, 0x1d, 0x0a, 0xd0, 0x01, 0x29, 0x05, 0xd1, 0x05, 0x20, 0xf5, 0xf7, + 0x0b, 0xf8, 0x48, 0xb1, 0xa4, 0x1d, 0x02, 0xe0, 0x02, 0x29, 0x04, 0xd1, + 0x0a, 0x34, 0x25, 0x78, 0x05, 0xf0, 0x3f, 0x05, 0x00, 0xe0, 0x40, 0x25, + 0xe8, 0xb2, 0x32, 0xbd, 0x10, 0xb5, 0x00, 0xf0, 0x0c, 0xf8, 0x03, 0xd1, + 0x01, 0x22, 0x00, 0x21, 0xc0, 0x1d, 0x04, 0xe0, 0x01, 0x29, 0x03, 0xd1, + 0x01, 0x22, 0x00, 0x21, 0x09, 0x30, 0xb1, 0xe7, 0x10, 0xbd, 0x13, 0x46, + 0x21, 0x4a, 0x52, 0xf8, 0x20, 0x00, 0x0c, 0x00, 0x70, 0x47, 0x1f, 0x4a, + 0x52, 0xf8, 0x20, 0x00, 0x33, 0x30, 0x00, 0x29, 0x00, 0x78, 0x02, 0xd1, + 0xc0, 0xf3, 0x81, 0x00, 0x70, 0x47, 0xc0, 0xf3, 0x01, 0x10, 0x70, 0x47, + 0x10, 0xb5, 0xff, 0xf7, 0xea, 0xff, 0x03, 0xd1, 0x1f, 0x22, 0x00, 0x21, + 0x80, 0x1c, 0x04, 0xe0, 0x01, 0x29, 0x03, 0xd1, 0x01, 0x22, 0x00, 0x21, + 0x08, 0x30, 0x8f, 0xe7, 0x10, 0xbd, 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, + 0x14, 0x20, 0xf4, 0xf7, 0xc7, 0xff, 0x50, 0xb1, 0x2b, 0x46, 0x0d, 0x48, + 0x50, 0xf8, 0x24, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x3f, 0x22, + 0x00, 0x21, 0x80, 0x1d, 0x32, 0xe7, 0x31, 0xbd, 0x38, 0xb5, 0x04, 0x46, + 0x14, 0x20, 0xf4, 0xf7, 0xb5, 0xff, 0x00, 0x25, 0x30, 0xb1, 0x04, 0x48, + 0x50, 0xf8, 0x24, 0x10, 0x11, 0xf8, 0x06, 0x5f, 0x05, 0xf0, 0x3f, 0x05, + 0x28, 0x46, 0x32, 0xbd, 0x20, 0x99, 0x04, 0x02, 0x19, 0xb1, 0x02, 0x29, + 0x05, 0xd0, 0x02, 0xd3, 0x05, 0xe0, 0xe1, 0xf7, 0x92, 0xbf, 0xe1, 0xf7, + 0xdc, 0xbf, 0xe2, 0xf7, 0x9d, 0xb8, 0x00, 0x20, 0x70, 0x47, 0x70, 0xb5, + 0x04, 0x46, 0x0d, 0x46, 0xff, 0xf7, 0xee, 0xff, 0x06, 0x46, 0x29, 0x46, + 0x20, 0x46, 0x00, 0xf0, 0x04, 0xf8, 0x00, 0xb1, 0x76, 0x08, 0x30, 0x46, + 0x70, 0xbd, 0x80, 0xb5, 0xff, 0xf7, 0xe2, 0xff, 0xdf, 0xf8, 0xf8, 0x19, + 0x88, 0x42, 0x80, 0x41, 0xc0, 0x43, 0xc0, 0x0f, 0x02, 0xbd, 0x03, 0x28, + 0x02, 0xd0, 0x04, 0x28, 0x03, 0xd0, 0x04, 0xe0, 0x4f, 0xf4, 0x4b, 0x70, + 0x70, 0x47, 0x7f, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x70, 0xb5, + 0x2d, 0xed, 0x02, 0x8b, 0x11, 0x46, 0x07, 0x9d, 0x9d, 0xed, 0x06, 0x8a, + 0x1c, 0x46, 0xff, 0xf7, 0xd2, 0xff, 0x00, 0xf0, 0x14, 0xf8, 0xd2, 0xf7, + 0xd5, 0xff, 0x00, 0xf0, 0x6b, 0xfa, 0x28, 0x80, 0x00, 0x26, 0x20, 0x46, + 0xff, 0xf7, 0xdf, 0xff, 0x29, 0x88, 0x88, 0x42, 0x88, 0xbf, 0x08, 0x46, + 0x28, 0x80, 0x28, 0x88, 0x14, 0x28, 0xb8, 0xbf, 0x4b, 0xf2, 0x01, 0x26, + 0x26, 0xe0, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xf8, 0xee, + 0x48, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0x70, 0x47, 0x70, 0xb5, 0x2d, 0xed, + 0x02, 0x8b, 0x11, 0x46, 0x1c, 0x46, 0x9d, 0xed, 0x06, 0x8a, 0xff, 0xf7, + 0xaa, 0xff, 0xff, 0xf7, 0xec, 0xff, 0xf1, 0xf7, 0x2b, 0xfa, 0x00, 0xf0, + 0x43, 0xfa, 0x00, 0x26, 0x81, 0xb2, 0x07, 0x9d, 0x14, 0x29, 0xb8, 0xbf, + 0x14, 0x20, 0x28, 0x80, 0x20, 0x46, 0xff, 0xf7, 0xb2, 0xff, 0x29, 0x88, + 0x88, 0x42, 0x38, 0xbf, 0x4b, 0xf2, 0x01, 0x26, 0xbd, 0xec, 0x02, 0x8b, + 0x30, 0x46, 0x70, 0xbd, 0x2d, 0xe9, 0xfe, 0x43, 0x88, 0x46, 0x91, 0x46, + 0x0a, 0x9d, 0x04, 0x46, 0x1e, 0x46, 0x49, 0x46, 0xff, 0xf7, 0x87, 0xff, + 0x07, 0x46, 0x31, 0x46, 0x20, 0x46, 0xff, 0xf7, 0x82, 0xff, 0x06, 0x46, + 0x0b, 0x99, 0x00, 0x91, 0x02, 0xa8, 0x01, 0x90, 0x2b, 0x46, 0x4a, 0x46, + 0x41, 0x46, 0x20, 0x46, 0xff, 0xf7, 0xc4, 0xff, 0x04, 0x00, 0x23, 0xd1, + 0x28, 0x46, 0xff, 0xf7, 0x8a, 0xff, 0x80, 0x46, 0x31, 0x46, 0x38, 0x46, + 0xf4, 0xf7, 0xfd, 0xfe, 0xb6, 0xfb, 0xf0, 0xf6, 0xb7, 0xfb, 0xf0, 0xf5, + 0xbd, 0xf8, 0x08, 0x00, 0x29, 0x46, 0xf4, 0xf7, 0xec, 0xfe, 0x07, 0x46, + 0x31, 0x46, 0x14, 0x20, 0xf4, 0xf7, 0xe7, 0xfe, 0x87, 0x42, 0x38, 0xbf, + 0x07, 0x46, 0x0c, 0x98, 0x0d, 0x99, 0x7d, 0x43, 0x7e, 0x43, 0xa8, 0x45, + 0x05, 0x80, 0x2c, 0xbf, 0xb0, 0x45, 0x4b, 0xf2, 0x01, 0x24, 0x0e, 0x80, + 0x20, 0x46, 0xbd, 0xe8, 0xfe, 0x83, 0x10, 0xb5, 0x14, 0x46, 0xff, 0xf7, + 0x4a, 0xff, 0xb0, 0xfb, 0xf4, 0xf0, 0x10, 0xbd, 0x80, 0xb5, 0x11, 0xb1, + 0x02, 0x29, 0x04, 0xd0, 0x07, 0xe0, 0x69, 0x46, 0xe1, 0xf7, 0x56, 0xf8, + 0x05, 0xe0, 0x69, 0x46, 0xe1, 0xf7, 0x65, 0xf8, 0x01, 0xe0, 0x00, 0x20, + 0x00, 0x90, 0x00, 0x98, 0x02, 0xbd, 0xf8, 0xb5, 0x0e, 0x46, 0x05, 0x46, + 0x14, 0x46, 0x19, 0x46, 0xff, 0xf7, 0xe8, 0xff, 0x01, 0x2e, 0x07, 0x46, + 0x0e, 0xd1, 0x28, 0x46, 0xe1, 0xf7, 0xcd, 0xff, 0x05, 0x46, 0x38, 0x1b, + 0x00, 0xee, 0x10, 0x0a, 0x00, 0xee, 0x90, 0x5a, 0x00, 0xf0, 0x8d, 0xf8, + 0x00, 0xf0, 0xbe, 0xf9, 0x68, 0x43, 0x03, 0xe0, 0x31, 0x46, 0x28, 0x46, + 0xff, 0xf7, 0xd2, 0xff, 0x04, 0x19, 0xe0, 0x1b, 0xf2, 0xbd, 0x80, 0xb5, + 0xf4, 0xf7, 0x7d, 0xfe, 0x40, 0x1e, 0xc0, 0xb2, 0x02, 0xbd, 0x02, 0x46, + 0x49, 0x00, 0x01, 0xfb, 0x01, 0xf0, 0x48, 0x43, 0x04, 0x2a, 0x08, 0xbf, + 0x48, 0x43, 0x70, 0x47, 0x70, 0xb5, 0x15, 0x46, 0x06, 0x9e, 0x04, 0x9a, + 0x31, 0x70, 0x72, 0x71, 0x03, 0x2d, 0x05, 0x9c, 0x73, 0x80, 0x0c, 0xbf, + 0x00, 0x22, 0x01, 0x22, 0x72, 0x70, 0xff, 0xf7, 0x06, 0xff, 0x00, 0xb1, + 0x01, 0x20, 0x30, 0x71, 0x28, 0x46, 0x71, 0x88, 0xff, 0xf7, 0xe1, 0xff, + 0x34, 0x73, 0xb0, 0x60, 0x70, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, 0x80, 0x46, + 0x1d, 0x46, 0x07, 0x9b, 0x08, 0x98, 0x0d, 0x9c, 0x18, 0x43, 0x0f, 0x46, + 0x03, 0xd1, 0x00, 0x21, 0x60, 0x70, 0xa1, 0x70, 0x49, 0xe0, 0x0c, 0x9e, + 0x0a, 0x98, 0x09, 0x99, 0xdd, 0xf8, 0x18, 0xc0, 0x22, 0x70, 0x5f, 0xea, + 0x0c, 0x02, 0x18, 0xbf, 0x01, 0x22, 0xa2, 0x70, 0x1a, 0x00, 0x18, 0xbf, + 0x01, 0x22, 0x62, 0x70, 0x02, 0x00, 0x18, 0xbf, 0x01, 0x22, 0x08, 0x00, + 0x18, 0xbf, 0x01, 0x20, 0xa0, 0x74, 0x62, 0x74, 0xb8, 0x68, 0xff, 0xf7, + 0xb0, 0xff, 0xe0, 0x74, 0x66, 0x61, 0x39, 0x78, 0x0b, 0x98, 0x02, 0x29, + 0x06, 0xd1, 0x01, 0x00, 0x08, 0xbf, 0x01, 0x20, 0x02, 0xd0, 0x01, 0x28, + 0x08, 0xbf, 0x00, 0x20, 0x20, 0x74, 0x38, 0x78, 0x01, 0x28, 0x14, 0xd1, + 0x40, 0x46, 0xe1, 0xf7, 0x56, 0xff, 0x06, 0x46, 0x00, 0xee, 0x10, 0x5a, + 0x00, 0xee, 0x90, 0x6a, 0x00, 0xf0, 0x17, 0xf8, 0xbd, 0xee, 0xc0, 0x0a, + 0x39, 0x7b, 0x10, 0xee, 0x10, 0x0a, 0x46, 0x43, 0x40, 0x46, 0x00, 0xf0, + 0x3c, 0xf8, 0xad, 0x1b, 0x45, 0x19, 0x39, 0x78, 0x40, 0x46, 0xff, 0xf7, + 0x8f, 0xfe, 0x01, 0x46, 0x28, 0x46, 0x00, 0xf0, 0x0c, 0xf8, 0xc4, 0xe9, + 0x02, 0x01, 0xbd, 0xe8, 0xf0, 0x81, 0xb8, 0xee, 0xc0, 0x0a, 0xf8, 0xee, + 0x60, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0xe0, 0xf7, 0xef, 0xbc, 0x0a, 0x46, + 0x00, 0x23, 0x41, 0x02, 0xd0, 0x1a, 0x63, 0xeb, 0x01, 0x01, 0x00, 0xb5, + 0xd3, 0x0f, 0x52, 0x00, 0xe6, 0xf7, 0x92, 0xfa, 0x00, 0xf0, 0x10, 0xf8, + 0x00, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0xdf, 0xed, 0x88, 0x0a, 0x20, 0xee, + 0x20, 0x0a, 0xe0, 0xf7, 0xd9, 0xfc, 0x10, 0xee, 0x10, 0x0a, 0x06, 0xf0, + 0x5f, 0xfb, 0x00, 0xf0, 0x01, 0xf8, 0x04, 0xbd, 0x09, 0x06, 0x41, 0xea, + 0x10, 0x21, 0x00, 0x06, 0x00, 0x0e, 0x40, 0xea, 0x01, 0x20, 0x09, 0x16, + 0x70, 0x47, 0x10, 0xb5, 0x4c, 0x07, 0xe1, 0xf7, 0x06, 0xff, 0x64, 0x17, + 0x44, 0x43, 0x64, 0x42, 0xe0, 0x10, 0x10, 0xbd, 0x80, 0xb5, 0x2d, 0xed, + 0x02, 0x8b, 0x08, 0xee, 0x10, 0x1a, 0xe1, 0xf7, 0xfa, 0xfe, 0x00, 0xee, + 0x10, 0x0a, 0xf8, 0xee, 0xc8, 0x0a, 0xb2, 0xee, 0x00, 0x1a, 0x60, 0xee, + 0x81, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0xe0, 0xf7, + 0xab, 0xfc, 0x00, 0xf0, 0xe5, 0xf8, 0xbd, 0xec, 0x02, 0x8b, 0x00, 0xf0, + 0x07, 0x00, 0x02, 0xbd, 0xdf, 0xf8, 0xa0, 0x26, 0x11, 0x54, 0x70, 0x47, + 0x30, 0xb5, 0xdf, 0xf8, 0x98, 0x46, 0x0f, 0xf2, 0xfc, 0x65, 0x20, 0x5c, + 0xd1, 0xed, 0x00, 0x1a, 0x92, 0xed, 0x00, 0x1a, 0x43, 0x43, 0x5b, 0x42, + 0x0f, 0xf2, 0x08, 0x70, 0x03, 0xf0, 0x07, 0x03, 0x05, 0xeb, 0x83, 0x04, + 0x00, 0xeb, 0x83, 0x03, 0x94, 0xed, 0x00, 0x0a, 0xd3, 0xed, 0x00, 0x0a, + 0x21, 0xee, 0xa0, 0x2a, 0x01, 0xee, 0x00, 0x2a, 0x21, 0xee, 0x80, 0x0a, + 0x01, 0xee, 0x60, 0x0a, 0x81, 0xed, 0x00, 0x0a, 0x82, 0xed, 0x00, 0x2a, + 0x30, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x2d, 0xed, 0x04, 0x8b, 0x08, 0xee, + 0x10, 0x3a, 0x08, 0x9c, 0x06, 0x9b, 0xdd, 0xed, 0x07, 0x8a, 0x22, 0x70, + 0x63, 0x70, 0xff, 0xf7, 0xfd, 0xfd, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, + 0x40, 0x9a, 0xb8, 0xee, 0x48, 0x0a, 0xdf, 0xed, 0x4d, 0x0a, 0x60, 0xee, + 0x20, 0x0a, 0x60, 0xee, 0x89, 0x0a, 0x9f, 0xed, 0x4b, 0x1a, 0x20, 0xee, + 0x81, 0x1a, 0x9f, 0xed, 0x4a, 0x0a, 0x21, 0xee, 0x00, 0x0a, 0xe0, 0xf7, + 0x57, 0xfc, 0xbd, 0xee, 0xc0, 0x0a, 0xf8, 0xee, 0xe8, 0x0a, 0x10, 0xee, + 0x10, 0x0a, 0x9f, 0xed, 0x45, 0x0a, 0x20, 0xee, 0x80, 0x0a, 0x60, 0x80, + 0x80, 0xee, 0x09, 0x0a, 0xb1, 0xee, 0x40, 0x0a, 0xe0, 0xf7, 0x46, 0xfc, + 0xbd, 0xee, 0xc0, 0x0a, 0x84, 0xed, 0x01, 0x0a, 0xbd, 0xec, 0x04, 0x8b, + 0x10, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0x4f, 0xf0, 0x00, 0x0b, + 0x2d, 0xed, 0x04, 0x8b, 0xb0, 0xee, 0x60, 0x8a, 0x17, 0x9f, 0x0e, 0x98, + 0xdd, 0xf8, 0x3c, 0x80, 0xdd, 0xf8, 0x40, 0x90, 0x11, 0x9d, 0x12, 0x9e, + 0xdd, 0xf8, 0x4c, 0xa0, 0xdd, 0xf8, 0x50, 0xc0, 0xdd, 0xf8, 0x54, 0xe0, + 0x16, 0x9c, 0x87, 0xf8, 0x34, 0xb0, 0x39, 0x70, 0xc7, 0xf8, 0x08, 0x90, + 0x11, 0x00, 0x18, 0xbf, 0x01, 0x21, 0x79, 0x70, 0xc7, 0xf8, 0x0c, 0xa0, + 0x19, 0x00, 0x18, 0xbf, 0x01, 0x21, 0xb9, 0x70, 0x87, 0xf8, 0x10, 0xc0, + 0x01, 0x00, 0x18, 0xbf, 0x01, 0x21, 0x5f, 0xea, 0x08, 0x00, 0x18, 0xbf, + 0x01, 0x20, 0xf9, 0x70, 0x38, 0x71, 0x87, 0xf8, 0x12, 0xe0, 0xfc, 0x74, + 0x19, 0xf4, 0x40, 0x3f, 0xf0, 0xee, 0x41, 0x8a, 0x3d, 0x75, 0x7e, 0x75, + 0x0f, 0xd0, 0xd3, 0xf7, 0x05, 0xfd, 0xf0, 0xee, 0x40, 0x0a, 0xb8, 0xee, + 0x00, 0x1a, 0xbb, 0xee, 0x08, 0x0a, 0x00, 0xee, 0x81, 0x0a, 0xd2, 0xf7, + 0x9b, 0xfd, 0x00, 0xf0, 0x31, 0xf8, 0x78, 0x74, 0x01, 0xe0, 0x87, 0xf8, + 0x11, 0xb0, 0x9f, 0xed, 0xbb, 0x9a, 0x28, 0xee, 0x09, 0x0a, 0xf1, 0xf7, + 0x0d, 0xf8, 0xbc, 0xee, 0xc0, 0x0a, 0x87, 0xed, 0x06, 0x0a, 0x28, 0xee, + 0x89, 0x0a, 0xd2, 0xf7, 0x87, 0xfd, 0xdf, 0xed, 0xb4, 0x0a, 0x06, 0xf0, + 0x8f, 0xfa, 0xbc, 0xee, 0xc0, 0x0a, 0x87, 0xed, 0x07, 0x0a, 0xa6, 0xe1, + 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0xdf, 0xed, 0xaf, 0x0a, 0x20, 0xee, + 0x20, 0x0a, 0xf0, 0xf7, 0xf3, 0xff, 0x00, 0xf0, 0x0b, 0xf8, 0x02, 0xbd, + 0x00, 0x00, 0x80, 0xd3, 0xbd, 0x37, 0x86, 0x35, 0x00, 0x00, 0x7a, 0x44, + 0x00, 0x00, 0x80, 0x3a, 0x00, 0x00, 0x80, 0x4b, 0xbd, 0xee, 0xc0, 0x0a, + 0x10, 0xee, 0x10, 0x0a, 0x70, 0x47, 0x48, 0x68, 0x02, 0x40, 0x12, 0xf4, + 0x40, 0x1f, 0x01, 0xd0, 0x01, 0x20, 0x70, 0x47, 0x12, 0xf4, 0xfe, 0x4f, + 0x01, 0xd0, 0x02, 0x20, 0x70, 0x47, 0x10, 0x03, 0x01, 0xd5, 0x04, 0x20, + 0x70, 0x47, 0x50, 0x03, 0x01, 0xd5, 0x05, 0x20, 0x70, 0x47, 0x00, 0x20, + 0x70, 0x47, 0x49, 0x68, 0x00, 0x20, 0x4a, 0x03, 0x48, 0xbf, 0x01, 0x20, + 0x70, 0x47, 0x49, 0x68, 0x00, 0x20, 0x0a, 0x03, 0x48, 0xbf, 0x01, 0x20, + 0x70, 0x47, 0x08, 0x68, 0xc0, 0xf3, 0x0d, 0x40, 0x70, 0x47, 0x10, 0xb5, + 0x0b, 0x68, 0x94, 0x00, 0xe3, 0x40, 0x03, 0xf0, 0x0f, 0x03, 0x02, 0x28, + 0x9a, 0xbf, 0x01, 0xeb, 0x82, 0x00, 0x80, 0x68, 0x00, 0x20, 0x5b, 0x00, + 0xbd, 0xe8, 0x10, 0x40, 0xc3, 0xf1, 0x12, 0x03, 0xc1, 0x17, 0x1a, 0x46, + 0x03, 0xf0, 0x74, 0xb8, 0xf8, 0xb5, 0x1e, 0x46, 0x06, 0x9c, 0x07, 0x9d, + 0xb2, 0x42, 0x07, 0xd1, 0xff, 0xf7, 0xe3, 0xff, 0xc4, 0xe9, 0x00, 0x01, + 0x00, 0x20, 0xc5, 0xe9, 0x00, 0x00, 0xf1, 0xbd, 0x96, 0x42, 0x02, 0xd2, + 0x13, 0x46, 0x32, 0x46, 0x1e, 0x46, 0x0b, 0x68, 0x4f, 0xea, 0x82, 0x0c, + 0x4f, 0xea, 0x86, 0x0e, 0x23, 0xfa, 0x0c, 0xf7, 0x23, 0xfa, 0x0e, 0xf3, + 0x01, 0x28, 0x07, 0xf0, 0x0f, 0x07, 0x03, 0xf0, 0x0f, 0x03, 0x02, 0xd0, + 0x02, 0x28, 0x0d, 0xd0, 0x1a, 0xe0, 0x0f, 0xf2, 0xc0, 0x40, 0x94, 0x46, + 0x50, 0xf8, 0x2c, 0x00, 0x06, 0x44, 0xb2, 0x1a, 0x52, 0x1e, 0x01, 0xeb, + 0xc2, 0x01, 0x08, 0x6a, 0x4e, 0x6a, 0x0f, 0xe0, 0x10, 0x00, 0x04, 0xd1, + 0x01, 0x2e, 0x09, 0xd1, 0x88, 0x6b, 0xce, 0x6b, 0x08, 0xe0, 0x02, 0x2a, + 0x08, 0xbf, 0x03, 0x2e, 0x02, 0xd1, 0x08, 0x6c, 0x4e, 0x6c, 0x01, 0xe0, + 0x00, 0x20, 0x00, 0x26, 0xc7, 0xf1, 0x12, 0x07, 0xff, 0x1a, 0xc1, 0x17, + 0x3a, 0x46, 0x03, 0xf0, 0x2b, 0xf8, 0xc4, 0xe9, 0x00, 0x01, 0x3a, 0x46, + 0x30, 0x46, 0xf1, 0x17, 0x03, 0xf0, 0x24, 0xf8, 0xc5, 0xe9, 0x00, 0x01, + 0xf1, 0xbd, 0xf0, 0xb5, 0x1d, 0x46, 0x0e, 0x68, 0x93, 0x00, 0xde, 0x40, + 0x01, 0x28, 0x06, 0xf0, 0x0f, 0x06, 0x02, 0xd0, 0x02, 0x28, 0x02, 0xd0, + 0x06, 0xe0, 0x2a, 0xb9, 0x01, 0xe0, 0x01, 0xeb, 0xc2, 0x01, 0x88, 0x69, + 0xcc, 0x69, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x24, 0x76, 0x00, 0xc6, 0xf1, + 0x12, 0x06, 0xc1, 0x17, 0x32, 0x46, 0x05, 0x9f, 0x03, 0xf0, 0x04, 0xf8, + 0xc5, 0xe9, 0x00, 0x01, 0x32, 0x46, 0x20, 0x46, 0xe1, 0x17, 0x02, 0xf0, + 0xfd, 0xff, 0xc7, 0xe9, 0x00, 0x01, 0xf0, 0xbd, 0x80, 0xb5, 0x2d, 0xed, + 0x02, 0x8b, 0xb0, 0xee, 0x40, 0x8a, 0x06, 0xf0, 0xc7, 0xf9, 0x00, 0xee, + 0x10, 0x0a, 0x20, 0xee, 0x08, 0x0a, 0xbd, 0xec, 0x02, 0x8b, 0x01, 0xbd, + 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x06, 0x8b, 0x82, 0xb0, 0x05, 0x46, + 0x0c, 0x46, 0xe1, 0xf7, 0x1c, 0xfc, 0x08, 0xee, 0x90, 0x0a, 0x28, 0x46, + 0xe1, 0xf7, 0x26, 0xfd, 0x9f, 0xed, 0xc6, 0x8a, 0xb8, 0xee, 0x68, 0x0a, + 0xdf, 0xed, 0xc5, 0x9a, 0x20, 0xee, 0x08, 0x0a, 0x09, 0xee, 0x10, 0x0a, + 0x20, 0xee, 0x29, 0x0a, 0xf0, 0xf7, 0x02, 0xff, 0xdf, 0xed, 0xc1, 0xaa, + 0xb4, 0xee, 0x6a, 0x0a, 0x9f, 0xed, 0xc0, 0xaa, 0xf1, 0xee, 0x10, 0xfa, + 0xa8, 0xbf, 0xb0, 0xee, 0x4a, 0x0a, 0xff, 0xf7, 0x0f, 0xff, 0xb8, 0xee, + 0x49, 0x0a, 0x20, 0x80, 0x20, 0xee, 0x08, 0x0a, 0x20, 0xee, 0x29, 0x0a, + 0xf0, 0xf7, 0xec, 0xfe, 0xb4, 0xee, 0x6a, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0xa8, 0xbf, 0xb0, 0xee, 0x4a, 0x0a, 0xff, 0xf7, 0xfd, 0xfe, 0x60, 0x80, + 0xea, 0x46, 0xcd, 0xed, 0x00, 0x8a, 0x8a, 0xed, 0x01, 0x9a, 0x00, 0x25, + 0x0f, 0xf2, 0x98, 0x36, 0x0f, 0xf2, 0x90, 0x3b, 0x0f, 0xf2, 0x84, 0x38, + 0x0f, 0xf2, 0x78, 0x39, 0xf4, 0xee, 0x00, 0x8a, 0x0a, 0xeb, 0x85, 0x00, + 0x09, 0xeb, 0x85, 0x01, 0x90, 0xed, 0x00, 0x0a, 0xd1, 0xed, 0x00, 0x0a, + 0xb8, 0xee, 0x40, 0x9a, 0x69, 0xee, 0x20, 0x0a, 0x60, 0xee, 0x88, 0x0a, + 0x20, 0xee, 0xa8, 0x0a, 0xf0, 0xf7, 0xc0, 0xfe, 0x04, 0xeb, 0x45, 0x07, + 0xff, 0xf7, 0xd6, 0xfe, 0x38, 0x81, 0x08, 0xeb, 0x85, 0x00, 0x90, 0xed, + 0x00, 0x0a, 0x29, 0xee, 0x00, 0x0a, 0x20, 0xee, 0x08, 0x0a, 0x20, 0xee, + 0x28, 0x0a, 0xf0, 0xf7, 0xaf, 0xfe, 0xff, 0xf7, 0xc7, 0xfe, 0xb8, 0x80, + 0x60, 0x19, 0x1b, 0xf8, 0x05, 0x10, 0x81, 0x73, 0x72, 0x5d, 0x02, 0x73, + 0x6d, 0x1c, 0x01, 0x2d, 0xd0, 0xd9, 0x02, 0xb0, 0x00, 0x20, 0xbd, 0xec, + 0x06, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x4f, + 0x00, 0x00, 0x80, 0x4e, 0x2d, 0xe9, 0xf0, 0x47, 0x2d, 0xed, 0x04, 0x8b, + 0xdd, 0xf8, 0x34, 0xa0, 0x0e, 0x9e, 0x0f, 0x9f, 0x9d, 0xed, 0x0c, 0x8a, + 0x14, 0x46, 0x98, 0x46, 0xff, 0xf7, 0xf5, 0xfc, 0x00, 0xf0, 0x88, 0xf8, + 0x00, 0xf0, 0x35, 0xf8, 0x09, 0xee, 0x10, 0x0a, 0xff, 0xf7, 0xe7, 0xfc, + 0x00, 0xf0, 0x26, 0xf8, 0x00, 0xf0, 0x3c, 0xf8, 0x20, 0xee, 0x20, 0x8a, + 0xd3, 0xf7, 0xac, 0xfb, 0x00, 0xf0, 0x2b, 0xf8, 0xc0, 0xee, 0x01, 0x8a, + 0xd3, 0xf7, 0xa6, 0xfb, 0x01, 0xee, 0x90, 0x0a, 0xb8, 0xee, 0x49, 0x2a, + 0x81, 0xee, 0x82, 0x0a, 0x68, 0xee, 0x28, 0x1a, 0x61, 0xee, 0xa8, 0x1a, + 0xca, 0xed, 0x00, 0x1a, 0x68, 0xee, 0x00, 0x0a, 0x60, 0xee, 0xa8, 0x1a, + 0xc6, 0xed, 0x00, 0x1a, 0x60, 0xee, 0x80, 0x1a, 0xc7, 0xed, 0x00, 0x1a, + 0xbd, 0xec, 0x04, 0x8b, 0xbd, 0xe8, 0xf0, 0x87, 0x81, 0x46, 0x18, 0xee, + 0x10, 0x0a, 0xf4, 0xf7, 0x3a, 0xbb, 0xbd, 0xec, 0x04, 0x8b, 0xbd, 0xe8, + 0xf1, 0x8f, 0x05, 0x46, 0x41, 0x46, 0x20, 0x46, 0xb7, 0xe4, 0x00, 0x21, + 0x09, 0xf1, 0x01, 0x02, 0x00, 0xee, 0x10, 0x0a, 0x01, 0x20, 0xb8, 0xee, + 0x68, 0x1a, 0x02, 0xf0, 0x11, 0xbf, 0x00, 0x00, 0x01, 0x24, 0x84, 0x40, + 0x00, 0xee, 0x10, 0x4a, 0xb8, 0xee, 0x40, 0x0a, 0xf8, 0xee, 0x48, 0x0a, + 0x80, 0xee, 0x20, 0x0a, 0x01, 0x20, 0x00, 0x21, 0x6a, 0x1c, 0xdf, 0xed, + 0x5d, 0x0a, 0x02, 0xf0, 0xff, 0xbe, 0x00, 0x00, 0x38, 0xb5, 0x2d, 0xed, + 0x02, 0x8b, 0x08, 0xee, 0x10, 0x2a, 0xff, 0xf7, 0x94, 0xfc, 0x00, 0xf0, + 0x27, 0xf8, 0x04, 0x46, 0xff, 0xf7, 0xcb, 0xff, 0x05, 0x46, 0x01, 0x20, + 0x00, 0x21, 0x62, 0x1c, 0x02, 0xf0, 0xec, 0xfe, 0xd3, 0xf7, 0x4e, 0xfb, + 0x01, 0x22, 0x02, 0xfa, 0x05, 0xf5, 0x01, 0xee, 0x10, 0x5a, 0xb8, 0xee, + 0x41, 0x1a, 0xf8, 0xee, 0x48, 0x1a, 0x00, 0xee, 0x10, 0x0a, 0xf8, 0xee, + 0x68, 0x0a, 0x81, 0xee, 0x21, 0x1a, 0x9f, 0xed, 0x49, 0x2a, 0x80, 0xee, + 0x20, 0x0a, 0x21, 0xee, 0x02, 0x2a, 0x22, 0xee, 0x00, 0x2a, 0xbd, 0xec, + 0x02, 0x8b, 0x22, 0xee, 0x00, 0x0a, 0x31, 0xbd, 0x08, 0xee, 0x90, 0x0a, + 0xff, 0xf7, 0x61, 0xbc, 0x10, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x08, 0xee, + 0x10, 0x2a, 0xff, 0xf7, 0x60, 0xfc, 0xff, 0xf7, 0xf3, 0xff, 0x42, 0x1c, + 0x01, 0x20, 0x00, 0x21, 0x02, 0xf0, 0xbc, 0xfe, 0xd3, 0xf7, 0x1e, 0xfb, + 0x00, 0xee, 0x10, 0x0a, 0xf8, 0xee, 0x68, 0x0a, 0xc0, 0xee, 0x20, 0x8a, + 0xff, 0xf7, 0x8b, 0xff, 0x01, 0x24, 0x84, 0x40, 0x00, 0xee, 0x10, 0x4a, + 0xff, 0xf7, 0x9f, 0xfb, 0xdf, 0xed, 0x31, 0x0a, 0x20, 0xee, 0x20, 0x0a, + 0x20, 0xee, 0x28, 0x0a, 0xbd, 0xec, 0x02, 0x8b, 0x10, 0xbd, 0x00, 0x00, + 0x38, 0xb5, 0x00, 0x25, 0x14, 0x46, 0x01, 0x29, 0x2d, 0xed, 0x02, 0x8b, + 0x18, 0xbf, 0x00, 0x2c, 0xb0, 0xee, 0x40, 0x8a, 0x41, 0xd0, 0xff, 0xf7, + 0x35, 0xfb, 0x00, 0xee, 0x10, 0x0a, 0x00, 0xee, 0x90, 0x4a, 0xf8, 0xee, + 0x60, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0xdf, 0xed, + 0x22, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xd3, 0xf7, 0x73, 0xf9, 0xb0, 0xee, + 0x00, 0x1a, 0x60, 0xee, 0x01, 0x0a, 0xf8, 0xee, 0x00, 0x1a, 0xf1, 0xee, + 0x60, 0x8a, 0x70, 0xee, 0xa1, 0x0a, 0xb7, 0xee, 0x00, 0x2a, 0x28, 0xee, + 0xa8, 0x0a, 0x00, 0xee, 0x88, 0x2a, 0xf1, 0xee, 0x00, 0x2a, 0x02, 0xee, + 0x62, 0x0a, 0xd2, 0xf7, 0x63, 0xfa, 0xf1, 0xee, 0x68, 0x0a, 0x70, 0xee, + 0xc0, 0x0a, 0xb6, 0xee, 0x00, 0x1a, 0xb7, 0xee, 0x00, 0x0a, 0x00, 0xee, + 0xc1, 0x0a, 0xd3, 0xf7, 0x77, 0xfa, 0xd2, 0xf7, 0x15, 0xfb, 0xbd, 0xee, + 0xc0, 0x0a, 0x6f, 0xf0, 0x02, 0x04, 0x10, 0xee, 0x10, 0x0a, 0x20, 0x1a, + 0x03, 0xd4, 0x08, 0x28, 0xac, 0xbf, 0x07, 0x25, 0x05, 0x46, 0xbd, 0xec, + 0x02, 0x8b, 0xe8, 0xb2, 0x32, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x7a, 0x44, + 0xbd, 0x37, 0x06, 0x34, 0x01, 0xf0, 0x7f, 0x45, 0x00, 0xf0, 0x7f, 0x45, + 0x00, 0x00, 0x80, 0x27, 0xdb, 0x0f, 0xc9, 0x40, 0x41, 0x42, 0x0f, 0x00, + 0xb4, 0x75, 0x02, 0x21, 0x70, 0xb5, 0x04, 0x46, 0x20, 0x00, 0x2d, 0xed, + 0x02, 0x8b, 0x0d, 0x46, 0xd6, 0xb2, 0x24, 0xd0, 0x80, 0xee, 0x80, 0x0a, + 0xd3, 0xf7, 0x26, 0xf9, 0x01, 0x20, 0xe4, 0x1c, 0xb0, 0xee, 0x40, 0x8a, + 0x00, 0xfa, 0x04, 0xf4, 0x00, 0xee, 0x10, 0x4a, 0xb8, 0xee, 0xc0, 0x0a, + 0xf7, 0xee, 0x00, 0x0a, 0xc0, 0xee, 0x80, 0x0a, 0xb7, 0xee, 0x00, 0x1a, + 0x31, 0xee, 0x60, 0x0a, 0xd3, 0xf7, 0x12, 0xf9, 0x00, 0xee, 0x90, 0x5a, + 0x88, 0xee, 0x00, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x80, 0xee, 0x20, 0x0a, + 0xf0, 0xf7, 0x48, 0xfd, 0xff, 0xf7, 0x60, 0xfd, 0x86, 0x19, 0xbd, 0xec, + 0x02, 0x8b, 0xb0, 0xb2, 0x70, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, + 0xf3, 0x04, 0x35, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xf3, 0x04, 0x35, 0xbf, + 0x00, 0x00, 0x80, 0xbf, 0xf3, 0x04, 0x35, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0xf3, 0x04, 0x35, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xf3, 0x04, 0x35, 0x3f, + 0x00, 0x00, 0x80, 0x3f, 0xf3, 0x04, 0x35, 0x3f, 0x00, 0x00, 0x00, 0x80, + 0xf3, 0x04, 0x35, 0xbf, 0x00, 0x00, 0x80, 0xbf, 0xf3, 0x04, 0x35, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xbd, 0x37, 0x86, 0x35, 0xbd, 0x37, 0x86, 0x35, + 0xac, 0xc5, 0xa7, 0x36, 0xbd, 0x37, 0x06, 0x36, 0x00, 0x03, 0x00, 0x00, + 0x03, 0x03, 0x00, 0x00, 0x00, 0x68, 0x02, 0x40, 0x22, 0xfa, 0x01, 0xf0, + 0x70, 0x47, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, + 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, + 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x2d, 0xe9, 0xfe, 0x4f, 0x8b, 0x46, + 0xdf, 0xf8, 0x48, 0x1a, 0xdf, 0xf8, 0x90, 0x6a, 0x80, 0x46, 0x51, 0xf8, + 0x28, 0xa0, 0x16, 0x20, 0xf4, 0xf7, 0x02, 0xfa, 0xdf, 0xf8, 0x84, 0x1a, + 0x70, 0x70, 0x5f, 0xfa, 0x88, 0xf3, 0x0a, 0x68, 0x13, 0x44, 0xed, 0x21, + 0x93, 0xf8, 0xbc, 0xc0, 0x93, 0xf8, 0xbc, 0x30, 0x11, 0xfb, 0x0c, 0xfc, + 0x02, 0xeb, 0x0c, 0x01, 0x01, 0xf2, 0x44, 0x41, 0xd1, 0xf8, 0x7d, 0x40, + 0xd1, 0xf8, 0x89, 0x90, 0x01, 0xf1, 0xc4, 0x05, 0xe0, 0x21, 0x4b, 0x43, + 0xd1, 0x18, 0xd1, 0xf8, 0x57, 0x71, 0x18, 0xb1, 0x50, 0x46, 0x00, 0xf0, + 0xfd, 0xfc, 0x05, 0xe0, 0xda, 0xf8, 0x00, 0x00, 0x40, 0xf0, 0x01, 0x00, + 0xca, 0xf8, 0x00, 0x00, 0x0a, 0xf1, 0x04, 0x00, 0x47, 0xf0, 0x00, 0x47, + 0x01, 0x68, 0x2a, 0x7a, 0x2b, 0x78, 0xdf, 0xf8, 0x2c, 0xea, 0xd2, 0x05, + 0x01, 0xf0, 0x7f, 0x41, 0x02, 0xf4, 0x00, 0x02, 0x11, 0x43, 0xea, 0x79, + 0x12, 0x05, 0x02, 0xf4, 0xe0, 0x02, 0x11, 0x43, 0xaa, 0x79, 0x12, 0x04, + 0x02, 0xf4, 0x70, 0x22, 0x11, 0x43, 0x6a, 0x79, 0xd2, 0x03, 0x02, 0xf4, + 0x00, 0x42, 0x11, 0x43, 0x2a, 0x79, 0x12, 0x03, 0x02, 0xf4, 0xe0, 0x42, + 0x11, 0x43, 0xea, 0x78, 0x12, 0x02, 0x02, 0xf4, 0x70, 0x62, 0x11, 0x43, + 0xaa, 0x78, 0xd2, 0x01, 0x02, 0xf0, 0x80, 0x02, 0x11, 0x43, 0x6a, 0x78, + 0x12, 0x01, 0x02, 0xf0, 0x70, 0x02, 0x11, 0x43, 0x03, 0xf0, 0x0f, 0x03, + 0x19, 0x43, 0x01, 0x60, 0x0a, 0xf1, 0x08, 0x00, 0x0a, 0xf1, 0x0c, 0x01, + 0x07, 0x60, 0x44, 0xf0, 0x00, 0x44, 0x0a, 0xf1, 0x10, 0x02, 0x0c, 0x60, + 0x49, 0xf0, 0x00, 0x40, 0x0a, 0xf1, 0x14, 0x01, 0x10, 0x60, 0x0a, 0x68, + 0xdf, 0xf8, 0xb0, 0x09, 0x02, 0x43, 0x0a, 0x60, 0x0a, 0xf1, 0x18, 0x01, + 0x0a, 0x68, 0xbb, 0xf8, 0x00, 0x30, 0xbb, 0xf8, 0x02, 0x40, 0x02, 0xf0, + 0xf0, 0x22, 0x0e, 0xea, 0x03, 0x40, 0x02, 0x43, 0xc4, 0xf3, 0x0b, 0x04, + 0x22, 0x43, 0x0a, 0x60, 0x0a, 0xf1, 0x34, 0x00, 0x00, 0x90, 0x0a, 0xf5, + 0x9a, 0x71, 0xdf, 0xf8, 0x84, 0x09, 0x01, 0x91, 0x00, 0x24, 0x00, 0xeb, + 0x48, 0x09, 0x5d, 0xf8, 0x24, 0x00, 0x01, 0x68, 0x0b, 0xeb, 0x04, 0x02, + 0x09, 0xeb, 0x04, 0x07, 0x93, 0x7b, 0x09, 0xf8, 0x04, 0x30, 0x00, 0x23, + 0x15, 0x7b, 0x3d, 0x74, 0x01, 0xf0, 0xc0, 0x21, 0xdf, 0xf8, 0x5c, 0x59, + 0x05, 0xeb, 0x48, 0x07, 0x3b, 0x55, 0x0b, 0xeb, 0x44, 0x03, 0x95, 0x7b, + 0x12, 0x7b, 0x2d, 0x07, 0x05, 0xf0, 0x40, 0x55, 0x29, 0x43, 0x1d, 0x89, + 0x0e, 0xea, 0x05, 0x47, 0x12, 0x03, 0x39, 0x43, 0x02, 0xf4, 0x40, 0x52, + 0x11, 0x43, 0x9a, 0x88, 0xc2, 0xf3, 0x0b, 0x02, 0x64, 0x1c, 0x11, 0x43, + 0x02, 0x2c, 0x01, 0x60, 0xd3, 0xd3, 0xa0, 0x20, 0x00, 0xfb, 0x08, 0xf0, + 0x00, 0x25, 0x06, 0xeb, 0xc8, 0x07, 0x34, 0x18, 0x4f, 0xf0, 0x50, 0x09, + 0x03, 0x21, 0x00, 0x91, 0x00, 0x22, 0x09, 0xfb, 0x05, 0xf1, 0x61, 0x18, + 0x01, 0xf1, 0xa4, 0x03, 0x00, 0x21, 0x01, 0x20, 0xf0, 0xf7, 0x5e, 0xfe, + 0x07, 0xeb, 0x85, 0x01, 0x6d, 0x1c, 0x02, 0x2d, 0x48, 0x62, 0xed, 0xd3, + 0x00, 0x25, 0x09, 0xfb, 0x05, 0xf0, 0x20, 0x18, 0x00, 0xf2, 0xa4, 0x51, + 0x01, 0x20, 0xf0, 0xf7, 0x7f, 0xfe, 0x07, 0xeb, 0x85, 0x01, 0x6d, 0x1c, + 0x02, 0x2d, 0x48, 0x66, 0xf1, 0xd3, 0x41, 0x20, 0xeb, 0xf7, 0x14, 0xfc, + 0x01, 0x21, 0x01, 0xfa, 0x08, 0xf4, 0x44, 0xea, 0x00, 0x01, 0x41, 0x20, + 0xeb, 0xf7, 0xe1, 0xfb, 0x42, 0x20, 0xeb, 0xf7, 0x09, 0xfc, 0x44, 0xea, + 0x00, 0x01, 0x42, 0x20, 0xeb, 0xf7, 0xd9, 0xfb, 0x30, 0x78, 0xa8, 0xb9, + 0x41, 0x20, 0xeb, 0xf7, 0x43, 0xfb, 0x42, 0x20, 0xeb, 0xf7, 0x40, 0xfb, + 0x06, 0x21, 0x41, 0x20, 0xeb, 0xf7, 0xa7, 0xfb, 0x06, 0x21, 0x42, 0x20, + 0xeb, 0xf7, 0xa3, 0xfb, 0x41, 0x20, 0xeb, 0xf7, 0x86, 0xfb, 0x42, 0x20, + 0xeb, 0xf7, 0x83, 0xfb, 0x01, 0x21, 0x31, 0x70, 0x70, 0x78, 0x10, 0xb1, + 0x50, 0x46, 0x00, 0xf0, 0x18, 0xfc, 0xbd, 0xe8, 0xf7, 0x8f, 0x0b, 0x46, + 0x11, 0x46, 0xdf, 0xf8, 0x54, 0x28, 0x80, 0xb5, 0x02, 0xeb, 0xc0, 0x00, + 0x1b, 0x09, 0x00, 0xeb, 0x83, 0x03, 0x58, 0x6e, 0xf0, 0xf7, 0xc0, 0xff, + 0x08, 0xb9, 0x02, 0x20, 0x02, 0xbd, 0x00, 0x20, 0x02, 0xbd, 0x38, 0xb5, + 0xdf, 0xf8, 0x30, 0x58, 0x05, 0xeb, 0xc0, 0x00, 0x0c, 0x46, 0x24, 0x09, + 0x00, 0xeb, 0x84, 0x04, 0x00, 0x23, 0x60, 0x6e, 0x00, 0x22, 0x00, 0x21, + 0xf0, 0xf7, 0x5f, 0xfe, 0x40, 0x1e, 0xdf, 0xf8, 0x2c, 0x28, 0x80, 0x41, + 0x4f, 0xf0, 0x80, 0x51, 0xc0, 0x0f, 0x11, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, + 0xbf, 0xf3, 0x6f, 0x8f, 0x32, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x81, 0x46, + 0xdf, 0xf8, 0xa8, 0x07, 0x50, 0xf8, 0x29, 0x80, 0x0e, 0x46, 0x00, 0x24, + 0x35, 0x09, 0x01, 0x2d, 0x08, 0xbf, 0x08, 0xf5, 0x80, 0x78, 0x08, 0xf1, + 0x28, 0x00, 0x93, 0x46, 0x00, 0x68, 0xc0, 0x0f, 0x9a, 0x46, 0x18, 0xbf, + 0x4b, 0xf2, 0x03, 0x24, 0x2a, 0xd1, 0xdf, 0xf8, 0xcc, 0x77, 0x07, 0xeb, + 0xc9, 0x02, 0x02, 0xeb, 0x85, 0x03, 0x00, 0x21, 0x58, 0x6a, 0xf0, 0xf7, + 0x7d, 0xff, 0x07, 0xeb, 0x49, 0x01, 0x48, 0x19, 0x04, 0x75, 0x06, 0x71, + 0xdf, 0xf8, 0xc8, 0x07, 0x00, 0xeb, 0xc9, 0x01, 0x41, 0xf8, 0x25, 0xa0, + 0x78, 0x78, 0x10, 0xb1, 0x40, 0x46, 0x00, 0xf0, 0xa9, 0xfb, 0x06, 0x20, + 0xeb, 0xf7, 0x3e, 0xfb, 0x06, 0x46, 0x5a, 0x46, 0x29, 0x46, 0x48, 0x46, + 0x00, 0xf0, 0x0b, 0xf8, 0x30, 0x46, 0x80, 0xf3, 0x11, 0x88, 0x78, 0x78, + 0x10, 0xb1, 0x40, 0x46, 0x00, 0xf0, 0xa5, 0xfb, 0x20, 0x46, 0xbd, 0xe8, + 0xf2, 0x8f, 0x2d, 0xe9, 0xf8, 0x4f, 0xdf, 0xf8, 0x20, 0x37, 0x53, 0xf8, + 0x20, 0x80, 0x01, 0x29, 0x08, 0xbf, 0x08, 0xf5, 0x80, 0x78, 0x14, 0x46, + 0x08, 0xf1, 0x20, 0x02, 0x13, 0x68, 0x03, 0xf0, 0x40, 0x43, 0x13, 0x60, + 0x08, 0xf1, 0x28, 0x03, 0xdf, 0xf8, 0x68, 0x27, 0x1b, 0x68, 0xa5, 0x78, + 0x66, 0x78, 0x6d, 0x07, 0x13, 0x40, 0x22, 0x78, 0x05, 0xf0, 0x00, 0x55, + 0x12, 0x06, 0x2b, 0x43, 0x02, 0xf0, 0x40, 0x72, 0x13, 0x43, 0xa5, 0x68, + 0xdf, 0xf8, 0x4c, 0x27, 0x15, 0x40, 0xb6, 0x07, 0x2b, 0x43, 0x06, 0xf0, + 0x80, 0x46, 0x08, 0xf1, 0x28, 0x05, 0x33, 0x43, 0x2b, 0x60, 0x08, 0xf1, + 0x2c, 0x03, 0xdf, 0xf8, 0x38, 0x27, 0x1d, 0x68, 0x26, 0x7c, 0xb6, 0x05, + 0x15, 0x40, 0x62, 0x7c, 0x06, 0xf4, 0x40, 0x06, 0x12, 0x03, 0x35, 0x43, + 0x02, 0xf4, 0xe0, 0x42, 0x15, 0x43, 0xa2, 0x7c, 0x92, 0x02, 0x02, 0xf4, + 0x40, 0x62, 0x15, 0x43, 0x45, 0xf0, 0x40, 0x75, 0x1d, 0x60, 0x08, 0xf1, + 0x30, 0x03, 0x04, 0xf1, 0x98, 0x05, 0x1e, 0x68, 0xe7, 0x7c, 0x6a, 0x89, + 0x06, 0xf0, 0x7f, 0x46, 0x46, 0xea, 0x07, 0x46, 0x16, 0x43, 0x1e, 0x60, + 0xdf, 0xf8, 0xd8, 0x36, 0x26, 0x7d, 0x03, 0xeb, 0x40, 0x02, 0x53, 0x5c, + 0x9e, 0x42, 0x01, 0xbf, 0x66, 0x7d, 0x52, 0x18, 0x13, 0x7c, 0x9e, 0x42, + 0x15, 0xd0, 0xdf, 0xf8, 0xc4, 0x66, 0x06, 0xeb, 0x40, 0x03, 0x01, 0x22, + 0x5a, 0x54, 0x08, 0xf1, 0x34, 0x01, 0x0a, 0x68, 0x23, 0x7d, 0x1b, 0x07, + 0x22, 0xf0, 0x30, 0x22, 0x03, 0xf0, 0x40, 0x53, 0x1a, 0x43, 0x63, 0x7d, + 0x1b, 0x03, 0x03, 0xf4, 0x40, 0x53, 0x1a, 0x43, 0x0a, 0x60, 0x08, 0xf1, + 0x38, 0x01, 0x04, 0xf1, 0x28, 0x06, 0x0a, 0x68, 0xa3, 0x69, 0xdf, 0xf8, + 0xa4, 0xc6, 0x0b, 0x60, 0x08, 0xf1, 0x3c, 0x01, 0x04, 0xf1, 0x22, 0x07, + 0x0a, 0x68, 0x09, 0x68, 0x08, 0xf1, 0x40, 0x01, 0x0a, 0x68, 0x22, 0xf0, + 0x00, 0x42, 0x0a, 0x60, 0x08, 0xf1, 0x44, 0x01, 0x0a, 0x68, 0x22, 0xf0, + 0x00, 0x42, 0x0a, 0x60, 0x08, 0xf1, 0x48, 0x01, 0x0a, 0x68, 0xe3, 0x78, + 0x02, 0xf4, 0x40, 0x42, 0x42, 0xea, 0xc3, 0x72, 0x23, 0x79, 0x9b, 0x07, + 0x03, 0xf0, 0x80, 0x43, 0x1a, 0x43, 0x33, 0x7a, 0x1b, 0x07, 0x03, 0xf0, + 0x40, 0x53, 0x1a, 0x43, 0x73, 0x7a, 0xdb, 0x06, 0x03, 0xf0, 0x00, 0x63, + 0x1a, 0x43, 0x33, 0x7b, 0x9b, 0x06, 0x03, 0xf0, 0x80, 0x63, 0x1a, 0x43, + 0x73, 0x89, 0x0c, 0xea, 0x03, 0x43, 0x1a, 0x43, 0x94, 0xf8, 0x20, 0x30, + 0x1b, 0x03, 0x03, 0xf4, 0x40, 0x53, 0x1a, 0x43, 0x94, 0xf8, 0x21, 0x30, + 0xdb, 0x02, 0x03, 0xf4, 0x00, 0x63, 0x1a, 0x43, 0xbb, 0x78, 0x9b, 0x02, + 0x03, 0xf4, 0x80, 0x63, 0x1a, 0x43, 0x3b, 0x88, 0xc3, 0xf3, 0x09, 0x03, + 0x1a, 0x43, 0x0a, 0x60, 0xdf, 0xf8, 0x10, 0x16, 0x51, 0xf8, 0x20, 0x00, + 0x94, 0xf8, 0x20, 0x10, 0x2c, 0x30, 0x01, 0x29, 0x08, 0xbf, 0x33, 0x79, + 0x03, 0xd0, 0x31, 0x7a, 0x01, 0x29, 0x04, 0xd1, 0x33, 0x7d, 0x07, 0x22, + 0x00, 0x21, 0xff, 0xf7, 0x82, 0xfd, 0x08, 0xf1, 0x4c, 0x01, 0xdf, 0xf8, + 0xec, 0x05, 0x0a, 0x68, 0xe3, 0x68, 0x02, 0x40, 0xdf, 0xf8, 0xe4, 0x05, + 0x00, 0xea, 0x03, 0x40, 0x73, 0x7b, 0x1b, 0x02, 0x02, 0x43, 0x03, 0xf4, + 0xe0, 0x63, 0x1a, 0x43, 0xfb, 0x78, 0x03, 0xf0, 0x07, 0x03, 0x1a, 0x43, + 0x40, 0xf6, 0x08, 0x00, 0x02, 0x43, 0x08, 0xf1, 0x50, 0x00, 0x0a, 0x60, + 0x04, 0xf1, 0x50, 0x07, 0x01, 0x68, 0x32, 0x68, 0x02, 0x60, 0x08, 0xf1, + 0x54, 0x00, 0x08, 0xf1, 0x58, 0x02, 0x03, 0x68, 0x31, 0x69, 0x01, 0x60, + 0x04, 0xf1, 0x70, 0x0c, 0x13, 0x68, 0xb1, 0x7e, 0x70, 0x7e, 0x00, 0xf0, + 0xf9, 0xf8, 0x30, 0x7e, 0x01, 0xf0, 0x80, 0x41, 0x00, 0x07, 0x0b, 0x43, + 0x39, 0x78, 0x00, 0xf0, 0x40, 0x50, 0x89, 0x06, 0x03, 0x43, 0x78, 0x78, + 0x01, 0xf0, 0x40, 0x61, 0x00, 0x06, 0x0b, 0x43, 0x00, 0xf0, 0x80, 0x70, + 0x03, 0x43, 0xb8, 0x78, 0x00, 0xf0, 0xdf, 0xf8, 0xf8, 0x78, 0x00, 0xf0, + 0xd7, 0xf8, 0xd6, 0xe9, 0x08, 0x01, 0x00, 0x0e, 0x40, 0xea, 0x01, 0x20, + 0x80, 0xb2, 0x03, 0x43, 0x13, 0x60, 0x08, 0xf1, 0x5c, 0x02, 0x13, 0x68, + 0xb9, 0x7a, 0x78, 0x7a, 0x03, 0xf0, 0x70, 0x73, 0x89, 0x07, 0x43, 0xea, + 0xc0, 0x73, 0x38, 0x7a, 0x00, 0xf0, 0xd2, 0xf8, 0x38, 0x7e, 0x80, 0x06, + 0x00, 0xf0, 0x40, 0x60, 0x03, 0x43, 0xb8, 0x7e, 0x00, 0xf0, 0xbf, 0xf8, + 0xf8, 0x7e, 0xd7, 0xe9, 0x04, 0xab, 0x00, 0xf0, 0xb5, 0xf8, 0x4f, 0xea, + 0x1a, 0x60, 0x40, 0xea, 0x0b, 0x20, 0x80, 0xb2, 0x03, 0x43, 0x13, 0x60, + 0x08, 0xf1, 0x60, 0x02, 0x13, 0x68, 0x9c, 0xf8, 0x02, 0x10, 0x9c, 0xf8, + 0x01, 0x00, 0x00, 0xf0, 0xaf, 0xf8, 0x9c, 0xf8, 0x00, 0x00, 0x00, 0xf0, + 0xb1, 0xf8, 0x9c, 0xf8, 0x10, 0x00, 0x80, 0x06, 0x00, 0xf0, 0x40, 0x60, + 0x03, 0x43, 0x9c, 0xf8, 0x11, 0x00, 0x00, 0x06, 0x00, 0xf0, 0x80, 0x70, + 0x03, 0x43, 0x9c, 0xf8, 0x12, 0x00, 0x00, 0xf0, 0x96, 0xf8, 0x9c, 0xf8, + 0x13, 0x00, 0xdc, 0xe9, 0x02, 0x49, 0x00, 0xf0, 0x8b, 0xf8, 0x20, 0x0e, + 0x40, 0xea, 0x09, 0x20, 0x80, 0xb2, 0x03, 0x43, 0x08, 0xf1, 0x64, 0x0e, + 0x13, 0x60, 0xde, 0xf8, 0x00, 0x00, 0x9c, 0xf8, 0x19, 0x10, 0x00, 0xf0, + 0x70, 0x70, 0x40, 0xea, 0xc1, 0x70, 0x9c, 0xf8, 0x1a, 0x10, 0x89, 0x07, + 0x01, 0xf0, 0x80, 0x41, 0x08, 0x43, 0x9c, 0xf8, 0x18, 0x10, 0x09, 0x07, + 0x01, 0xf0, 0x40, 0x51, 0x08, 0x43, 0x29, 0x78, 0x89, 0x06, 0x01, 0xf0, + 0x40, 0x61, 0x08, 0x43, 0xa9, 0x78, 0x49, 0x05, 0x01, 0xf4, 0x00, 0x11, + 0x08, 0x43, 0xe9, 0x78, 0xdc, 0xe9, 0x08, 0x23, 0x09, 0x04, 0x01, 0xf4, + 0xf8, 0x11, 0x08, 0x43, 0x00, 0x90, 0x10, 0x0e, 0x40, 0xea, 0x03, 0x20, + 0x00, 0x99, 0x80, 0xb2, 0x08, 0x43, 0xce, 0xf8, 0x00, 0x00, 0x08, 0xf1, + 0x68, 0x03, 0x18, 0x68, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x90, 0xd6, 0xe9, + 0x08, 0x01, 0x00, 0x9e, 0x46, 0xea, 0x00, 0x26, 0x08, 0xf1, 0x6c, 0x00, + 0x1e, 0x60, 0x01, 0x68, 0x01, 0xf0, 0xff, 0x01, 0x41, 0xea, 0x0a, 0x21, + 0x01, 0x60, 0x08, 0xf1, 0x70, 0x00, 0x01, 0x68, 0x01, 0xf0, 0xff, 0x01, + 0x41, 0xea, 0x04, 0x21, 0x01, 0x60, 0x08, 0xf1, 0x74, 0x00, 0x01, 0x68, + 0x01, 0xf0, 0xff, 0x01, 0x41, 0xea, 0x02, 0x21, 0x01, 0x60, 0x08, 0xf1, + 0x78, 0x00, 0x01, 0x68, 0x6b, 0x7a, 0x2a, 0x7a, 0x01, 0xf0, 0xc0, 0x41, + 0x1b, 0x06, 0x41, 0xea, 0xc2, 0x71, 0xea, 0x68, 0x03, 0xf0, 0xf8, 0x53, + 0x19, 0x43, 0x22, 0xf0, 0x7f, 0x42, 0x11, 0x43, 0x01, 0x60, 0x08, 0xf1, + 0x7c, 0x00, 0x01, 0x23, 0x01, 0x68, 0x7a, 0x68, 0x02, 0x60, 0x08, 0xf1, + 0x80, 0x00, 0x01, 0x68, 0xfa, 0x69, 0x02, 0x60, 0x08, 0xf1, 0x84, 0x00, + 0x01, 0x68, 0xdc, 0xf8, 0x14, 0x20, 0x02, 0x60, 0x08, 0xf1, 0x88, 0x00, + 0x01, 0x68, 0x6a, 0x68, 0x02, 0x60, 0x08, 0xf1, 0x28, 0x00, 0x01, 0xb0, + 0xbd, 0xe8, 0xf0, 0x4f, 0x4f, 0xf0, 0x00, 0x42, 0x1f, 0x21, 0x64, 0xe4, + 0x00, 0x04, 0x00, 0xf4, 0xf8, 0x10, 0x03, 0x43, 0x70, 0x47, 0x40, 0x05, + 0x00, 0xf4, 0x00, 0x10, 0x03, 0x43, 0x70, 0x47, 0x03, 0xf0, 0x30, 0x73, + 0x89, 0x07, 0x43, 0xea, 0xc0, 0x73, 0x70, 0x47, 0x01, 0xf0, 0x80, 0x41, + 0x00, 0x07, 0x0b, 0x43, 0x00, 0xf0, 0x40, 0x50, 0x03, 0x43, 0x70, 0x47, + 0x2d, 0xe9, 0xf0, 0x47, 0xdf, 0xf8, 0x4c, 0x43, 0x80, 0x46, 0xbf, 0x48, + 0x00, 0x26, 0x0d, 0x09, 0x11, 0x46, 0x04, 0xeb, 0xc8, 0x02, 0x02, 0xeb, + 0x85, 0x03, 0x50, 0xf8, 0x28, 0x90, 0x58, 0x6a, 0x01, 0x2d, 0x08, 0xbf, + 0x09, 0xf5, 0x80, 0x79, 0xf0, 0xf7, 0x34, 0xfd, 0x09, 0xf1, 0x28, 0x07, + 0xe0, 0xb9, 0x04, 0xeb, 0x48, 0x00, 0x28, 0x44, 0x01, 0x21, 0x01, 0x75, + 0x60, 0x78, 0x10, 0xb1, 0x48, 0x46, 0x00, 0xf0, 0x63, 0xf9, 0x00, 0x23, + 0x4f, 0xf0, 0x00, 0x42, 0x1f, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x23, 0xfc, + 0x60, 0x78, 0x10, 0xb1, 0x48, 0x46, 0x00, 0xf0, 0x64, 0xf9, 0x64, 0x21, + 0x38, 0x68, 0xc0, 0x0f, 0x01, 0xd0, 0x49, 0x1e, 0xfa, 0xd1, 0x02, 0x26, + 0xdf, 0xf8, 0xf8, 0x02, 0x00, 0xeb, 0x48, 0x00, 0x41, 0x5d, 0x01, 0x29, + 0x23, 0xd1, 0x00, 0x22, 0x42, 0x55, 0x09, 0xf1, 0x34, 0x0a, 0xdf, 0xf8, + 0xe0, 0x02, 0xda, 0xf8, 0x00, 0x10, 0x00, 0xeb, 0x48, 0x00, 0x21, 0xf0, + 0x30, 0x22, 0x41, 0x5d, 0x09, 0x07, 0x01, 0xf0, 0x40, 0x51, 0x28, 0x44, + 0x0a, 0x43, 0x01, 0x7c, 0x60, 0x78, 0x09, 0x03, 0x01, 0xf4, 0x40, 0x51, + 0x41, 0xea, 0x02, 0x05, 0x10, 0xb1, 0x48, 0x46, 0x00, 0xf0, 0x2c, 0xf9, + 0xca, 0xf8, 0x00, 0x50, 0x60, 0x78, 0x10, 0xb1, 0x48, 0x46, 0x00, 0xf0, + 0x32, 0xf9, 0x38, 0x68, 0xc0, 0x0f, 0x18, 0xbf, 0x01, 0x26, 0x30, 0x46, + 0xbd, 0xe8, 0xf0, 0x87, 0x38, 0xb5, 0x00, 0xf0, 0x23, 0xf8, 0x08, 0xbf, + 0x04, 0xf5, 0x80, 0x74, 0x10, 0xb1, 0x20, 0x46, 0x00, 0xf0, 0x14, 0xf9, + 0x04, 0xf1, 0x90, 0x02, 0x4f, 0xf4, 0x00, 0x11, 0x11, 0x60, 0x68, 0x78, + 0x00, 0xb1, 0x1c, 0xe0, 0x31, 0xbd, 0x38, 0xb5, 0x00, 0xf0, 0x10, 0xf8, + 0x08, 0xbf, 0x04, 0xf5, 0x80, 0x74, 0x10, 0xb1, 0x20, 0x46, 0x00, 0xf0, + 0x01, 0xf9, 0x04, 0xf1, 0x90, 0x02, 0x4f, 0xf4, 0x80, 0x11, 0x11, 0x60, + 0x68, 0x78, 0x00, 0xb1, 0x09, 0xe0, 0x31, 0xbd, 0x7a, 0x4a, 0xdf, 0xf8, + 0x34, 0x52, 0x52, 0xf8, 0x20, 0x40, 0x68, 0x78, 0x09, 0x09, 0x01, 0x29, + 0x70, 0x47, 0x20, 0x46, 0xbd, 0xe8, 0x32, 0x40, 0xf7, 0xe0, 0xdf, 0xf8, + 0x58, 0x22, 0x52, 0xf8, 0x20, 0x00, 0x09, 0x09, 0x01, 0xd1, 0x8c, 0x30, + 0x70, 0x47, 0x00, 0xf5, 0xc6, 0x70, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, + 0x80, 0x46, 0xdf, 0xf8, 0x00, 0x72, 0x0c, 0x46, 0x07, 0xeb, 0x48, 0x00, + 0x05, 0x19, 0xac, 0xb0, 0x29, 0x79, 0xdf, 0xf8, 0x0c, 0x02, 0x8d, 0xf8, + 0x00, 0x10, 0x00, 0xeb, 0xc8, 0x02, 0x40, 0x46, 0x52, 0xf8, 0x24, 0x90, + 0xff, 0xf7, 0xdf, 0xff, 0x82, 0x46, 0x00, 0x22, 0x62, 0x48, 0x01, 0x92, + 0x50, 0xf8, 0x28, 0xb0, 0x78, 0x78, 0x18, 0xb1, 0x00, 0xf0, 0x8a, 0xf8, + 0x00, 0xbf, 0x00, 0xbf, 0x4f, 0xf0, 0x00, 0x40, 0x00, 0x2c, 0x07, 0xbf, + 0x0b, 0xf1, 0x8c, 0x01, 0x08, 0x60, 0x0b, 0xf5, 0xc6, 0x72, 0x10, 0x60, + 0x78, 0x78, 0x10, 0xb1, 0x00, 0x23, 0x00, 0xf0, 0x7a, 0xf8, 0x9d, 0xf8, + 0x00, 0x00, 0x90, 0xb1, 0x01, 0x28, 0x15, 0xd0, 0x02, 0x28, 0x18, 0xd0, + 0x03, 0x28, 0x1b, 0xd0, 0x04, 0x28, 0x1e, 0xd0, 0x10, 0x28, 0x21, 0xd0, + 0x11, 0x28, 0x24, 0xd0, 0x12, 0x28, 0x27, 0xd0, 0x13, 0x28, 0x2a, 0xd0, + 0x14, 0x28, 0x2d, 0xd0, 0x31, 0xe0, 0x00, 0xf0, 0x5c, 0xf8, 0x05, 0xf0, + 0x19, 0xfd, 0x2b, 0xe0, 0x00, 0xf0, 0x57, 0xf8, 0x01, 0x20, 0xc0, 0x46, + 0x26, 0xe0, 0x00, 0xf0, 0x52, 0xf8, 0x01, 0x20, 0xc0, 0x46, 0x21, 0xe0, + 0x00, 0xf0, 0x4d, 0xf8, 0x01, 0x20, 0xc0, 0x46, 0x1c, 0xe0, 0x00, 0xf0, + 0x48, 0xf8, 0x01, 0x20, 0xc0, 0x46, 0x17, 0xe0, 0x00, 0xf0, 0x43, 0xf8, + 0x01, 0x20, 0xc0, 0x46, 0x12, 0xe0, 0x00, 0xf0, 0x3e, 0xf8, 0x01, 0x20, + 0xc0, 0x46, 0x0d, 0xe0, 0x00, 0xf0, 0x39, 0xf8, 0x01, 0x20, 0xc0, 0x46, + 0x08, 0xe0, 0x00, 0xf0, 0x34, 0xf8, 0x01, 0x20, 0xc0, 0x46, 0x03, 0xe0, + 0x00, 0xf0, 0x2f, 0xf8, 0x01, 0x20, 0xc0, 0x46, 0x06, 0x46, 0x28, 0x7d, + 0x00, 0x28, 0x04, 0xbf, 0xf6, 0xb2, 0x00, 0x2e, 0x10, 0xd1, 0x78, 0x78, + 0x18, 0xb1, 0x00, 0xf0, 0x27, 0xf8, 0x00, 0xbf, 0x00, 0xbf, 0x02, 0xaa, + 0x21, 0x46, 0x40, 0x46, 0xff, 0xf7, 0xc1, 0xfc, 0x78, 0x78, 0xa8, 0xb1, + 0x00, 0x23, 0x00, 0xf0, 0x1c, 0xf8, 0x11, 0xe0, 0x07, 0xeb, 0xc8, 0x00, + 0x00, 0xeb, 0x84, 0x02, 0x01, 0xa9, 0x50, 0x6a, 0xf0, 0xf7, 0x72, 0xfb, + 0x01, 0x98, 0x38, 0xb1, 0x3a, 0x48, 0x4f, 0xf0, 0x80, 0x51, 0x01, 0x60, + 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x2d, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0x02, 0xab, 0x52, 0x46, 0x49, 0x46, 0x40, 0x46, 0x70, 0x47, + 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x58, 0x46, 0xff, 0xf7, 0xf7, 0xba, + 0x38, 0xb5, 0x41, 0x20, 0xea, 0xf7, 0x57, 0xff, 0x04, 0x46, 0x00, 0x25, + 0x24, 0xfa, 0x05, 0xf0, 0xc0, 0x07, 0x03, 0xd5, 0x00, 0x21, 0x28, 0x46, + 0xff, 0xf7, 0x42, 0xff, 0x6d, 0x1c, 0x08, 0x2d, 0xf4, 0xd3, 0x31, 0xbd, + 0x38, 0xb5, 0x42, 0x20, 0xea, 0xf7, 0x45, 0xff, 0x04, 0x46, 0x00, 0x25, + 0x24, 0xfa, 0x05, 0xf0, 0xc0, 0x07, 0x03, 0xd5, 0x01, 0x21, 0x28, 0x46, + 0xff, 0xf7, 0x30, 0xff, 0x6d, 0x1c, 0x08, 0x2d, 0xf4, 0xd3, 0x31, 0xbd, + 0x04, 0x49, 0x51, 0xf8, 0x20, 0x10, 0x51, 0xf8, 0x14, 0x2f, 0x18, 0x48, + 0x02, 0x43, 0x0a, 0x60, 0x70, 0x47, 0x00, 0x00, 0x80, 0x99, 0x04, 0x02, + 0x38, 0xb5, 0x00, 0xf0, 0x17, 0xf8, 0x40, 0xf4, 0x80, 0x73, 0x2a, 0x46, + 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, 0xbd, 0xfa, 0x00, 0xbf, 0x00, 0xbf, + 0x31, 0xbd, 0x38, 0xb5, 0x00, 0xf0, 0x0a, 0xf8, 0x20, 0xf4, 0x80, 0x73, + 0x2a, 0x46, 0x20, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x00, 0x21, + 0xff, 0xf7, 0xad, 0xba, 0x00, 0xf1, 0x2c, 0x04, 0x40, 0xf2, 0xff, 0x35, + 0x2a, 0x46, 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x9f, 0xba, 0x00, 0x00, + 0xd0, 0x1d, 0x02, 0x21, 0x5c, 0x75, 0x02, 0x21, 0x00, 0x00, 0xff, 0x0f, + 0x00, 0x00, 0x88, 0x08, 0xb4, 0x73, 0x02, 0x21, 0x78, 0x75, 0x02, 0x21, + 0x04, 0xed, 0x00, 0xe0, 0xf0, 0x71, 0x02, 0x21, 0x0f, 0x00, 0xc0, 0x9c, + 0xf0, 0xff, 0x3f, 0x00, 0xff, 0x83, 0x00, 0xfc, 0x00, 0x00, 0xff, 0x03, + 0xc0, 0x98, 0x04, 0x02, 0xf0, 0xf0, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x3f, + 0x80, 0x99, 0x04, 0x02, 0x49, 0x08, 0x49, 0x00, 0xa0, 0xf1, 0x20, 0x03, + 0x4f, 0xf0, 0x80, 0x7c, 0x99, 0x61, 0x1a, 0x60, 0xc3, 0xf8, 0x1c, 0xc0, + 0x6f, 0xf0, 0x02, 0x02, 0x0f, 0xf2, 0x0d, 0x01, 0x59, 0x61, 0x40, 0xf8, + 0x24, 0x2d, 0x20, 0x38, 0x70, 0x47, 0x00, 0x00, 0x30, 0x20, 0x80, 0xf3, + 0x11, 0x88, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0xfe, 0xe7, + 0x80, 0xb5, 0x20, 0x48, 0x01, 0x68, 0x41, 0xf4, 0x70, 0x01, 0x01, 0x60, + 0x02, 0x68, 0x42, 0xf0, 0x70, 0x42, 0x02, 0x60, 0x00, 0xf0, 0x3e, 0xf8, + 0x1b, 0x49, 0x00, 0x20, 0x08, 0x60, 0x05, 0xf0, 0x9f, 0xfd, 0x1a, 0x48, + 0x01, 0x68, 0x41, 0xf0, 0x40, 0x41, 0x01, 0x60, 0x05, 0xf0, 0x88, 0xfd, + 0x00, 0x20, 0x02, 0xbd, 0x30, 0x20, 0x80, 0xf3, 0x11, 0x88, 0xbf, 0xf3, + 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x11, 0x48, 0x01, 0x68, 0x49, 0x1c, + 0x01, 0x60, 0x70, 0x47, 0x0e, 0x49, 0x08, 0x68, 0x40, 0x1e, 0x08, 0x60, + 0x08, 0xbf, 0x80, 0xf3, 0x11, 0x88, 0x70, 0x47, 0x80, 0xb5, 0x30, 0x20, + 0x80, 0xf3, 0x11, 0x88, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, + 0xee, 0xf7, 0xb7, 0xff, 0x18, 0xb1, 0x07, 0x49, 0x4f, 0xf0, 0x80, 0x50, + 0x08, 0x60, 0x00, 0x22, 0x82, 0xf3, 0x11, 0x88, 0x01, 0xbd, 0x00, 0x00, + 0x20, 0xed, 0x00, 0xe0, 0xa4, 0x55, 0x00, 0x21, 0x34, 0xef, 0x00, 0xe0, + 0x04, 0xed, 0x00, 0xe0, 0x07, 0x48, 0x08, 0x4b, 0xdf, 0xf8, 0x20, 0xc0, + 0x00, 0x21, 0x01, 0x60, 0x81, 0x60, 0x19, 0x68, 0xa1, 0xfb, 0x0c, 0xc2, + 0x52, 0x0a, 0x52, 0x1e, 0x42, 0x60, 0x07, 0x21, 0x01, 0x60, 0x70, 0x47, + 0x10, 0xe0, 0x00, 0xe0, 0x1c, 0x76, 0x02, 0x21, 0x98, 0x6e, 0x12, 0x83, + 0x4f, 0xf0, 0xff, 0x32, 0x00, 0xf1, 0x08, 0x01, 0x82, 0x60, 0x41, 0x60, + 0xc1, 0x60, 0x00, 0xf1, 0x08, 0x02, 0x02, 0x61, 0x00, 0x21, 0x01, 0x60, + 0x70, 0x47, 0x42, 0x68, 0x4a, 0x60, 0x93, 0x68, 0x8b, 0x60, 0xd2, 0xf8, + 0x08, 0xc0, 0xcc, 0xf8, 0x04, 0x10, 0x91, 0x60, 0x08, 0x61, 0x01, 0x68, + 0x49, 0x1c, 0x01, 0x60, 0x70, 0x47, 0x30, 0xb4, 0x0a, 0x68, 0x12, 0xf1, + 0x01, 0x0f, 0x08, 0xbf, 0x03, 0x69, 0x07, 0xd0, 0x00, 0xf1, 0x08, 0x03, + 0x00, 0xe0, 0x23, 0x46, 0x5c, 0x68, 0x25, 0x68, 0xaa, 0x42, 0xfa, 0xd2, + 0x5a, 0x68, 0x4a, 0x60, 0x91, 0x60, 0x8b, 0x60, 0x59, 0x60, 0x08, 0x61, + 0x01, 0x68, 0x49, 0x1c, 0x01, 0x60, 0x30, 0xbc, 0x70, 0x47, 0x43, 0x68, + 0x01, 0x69, 0x82, 0x68, 0x9a, 0x60, 0x83, 0x68, 0x42, 0x68, 0x5a, 0x60, + 0x4a, 0x68, 0x82, 0x42, 0x04, 0xbf, 0x83, 0x68, 0x4b, 0x60, 0x00, 0x22, + 0x02, 0x61, 0x08, 0x68, 0x40, 0x1e, 0x08, 0x60, 0x08, 0x68, 0x70, 0x47, + 0x02, 0xf0, 0x0c, 0xbf, 0x40, 0xea, 0x01, 0x41, 0x00, 0x20, 0xed, 0xf7, + 0x48, 0xb8, 0x02, 0xf0, 0x05, 0xbf, 0x00, 0x20, 0xfd, 0xf7, 0xb8, 0xbc, + 0x70, 0x47, 0x07, 0x4b, 0x03, 0x60, 0x07, 0x48, 0x08, 0x60, 0x64, 0x21, + 0x11, 0x60, 0x70, 0x47, 0x05, 0x4b, 0x03, 0x60, 0x05, 0x48, 0x08, 0x60, + 0xf0, 0x21, 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, 0x48, 0x6b, 0x02, 0x21, + 0xf8, 0xd7, 0x01, 0x21, 0xb8, 0x6b, 0x02, 0x21, 0x18, 0xd1, 0x01, 0x21, + 0x2d, 0xe9, 0xf1, 0x4f, 0xb2, 0xb0, 0x91, 0x46, 0x04, 0x91, 0x0d, 0xf1, + 0x42, 0x01, 0x3c, 0x9a, 0x21, 0x91, 0x4a, 0x70, 0x00, 0x21, 0x0d, 0xf1, + 0x95, 0x02, 0x1e, 0x46, 0x0d, 0x91, 0x2f, 0x92, 0x0b, 0xe0, 0x19, 0xf8, + 0x01, 0x1b, 0x04, 0x98, 0x32, 0x9a, 0x90, 0x47, 0x00, 0x28, 0x04, 0x90, + 0x00, 0xf0, 0xa0, 0x85, 0x0d, 0x98, 0x40, 0x1c, 0x0d, 0x90, 0x99, 0xf8, + 0x00, 0x00, 0x50, 0xb1, 0x25, 0x28, 0xee, 0xd1, 0x00, 0x21, 0x00, 0x22, + 0x07, 0x91, 0x08, 0x92, 0x09, 0x91, 0x0a, 0x92, 0x0b, 0x91, 0x0c, 0x92, + 0x04, 0xe0, 0x0d, 0x98, 0x00, 0xf0, 0x8e, 0xbd, 0x41, 0xf0, 0x01, 0x01, + 0x19, 0xf8, 0x01, 0x0f, 0x20, 0x28, 0xf9, 0xd0, 0x23, 0x28, 0x0c, 0xd0, + 0x2b, 0x28, 0x04, 0xd0, 0x2d, 0x28, 0x05, 0xd0, 0x30, 0x28, 0x09, 0xd0, + 0x0b, 0xe0, 0x41, 0xf0, 0x02, 0x01, 0xef, 0xe7, 0x41, 0xf0, 0x04, 0x01, + 0xec, 0xe7, 0x41, 0xf0, 0x08, 0x01, 0xe9, 0xe7, 0x41, 0xf0, 0x10, 0x01, + 0xe6, 0xe7, 0x2a, 0x28, 0x0d, 0xd1, 0x32, 0x68, 0x52, 0xf8, 0x04, 0x0b, + 0x32, 0x60, 0x00, 0x28, 0x0f, 0x90, 0x03, 0xd5, 0x40, 0x42, 0x0f, 0x90, + 0x41, 0xf0, 0x04, 0x01, 0x09, 0xf1, 0x01, 0x09, 0x14, 0xe0, 0x0f, 0x92, + 0xdf, 0xf8, 0x18, 0x3c, 0x0a, 0xe0, 0x0f, 0x98, 0x98, 0x42, 0x05, 0xda, + 0x00, 0xeb, 0x80, 0x04, 0x02, 0xeb, 0x44, 0x02, 0x30, 0x3a, 0x0f, 0x92, + 0x09, 0xf1, 0x01, 0x09, 0x99, 0xf8, 0x00, 0x20, 0xa2, 0xf1, 0x30, 0x00, + 0x0a, 0x28, 0xee, 0xd3, 0x99, 0xf8, 0x00, 0x00, 0x2e, 0x28, 0x03, 0xd0, + 0x4f, 0xf0, 0xff, 0x32, 0x0e, 0x92, 0x27, 0xe0, 0x19, 0xf8, 0x01, 0x0f, + 0x2a, 0x28, 0x07, 0xd1, 0x30, 0x68, 0x50, 0xf8, 0x04, 0x2b, 0x30, 0x60, + 0x0e, 0x92, 0x09, 0xf1, 0x01, 0x09, 0x1b, 0xe0, 0x2d, 0x28, 0x0c, 0xbf, + 0x09, 0xf1, 0x01, 0x09, 0x00, 0x20, 0x00, 0x22, 0x0e, 0x92, 0xdf, 0xf8, + 0xbc, 0x4b, 0x0b, 0xe0, 0x40, 0xb9, 0x0e, 0x9a, 0xa2, 0x42, 0x05, 0xda, + 0x02, 0xeb, 0x82, 0x05, 0x03, 0xeb, 0x45, 0x03, 0x30, 0x3b, 0x0e, 0x93, + 0x09, 0xf1, 0x01, 0x09, 0x99, 0xf8, 0x00, 0x30, 0xa3, 0xf1, 0x30, 0x02, + 0x0a, 0x2a, 0xed, 0xd3, 0xad, 0xf8, 0x40, 0x10, 0x0f, 0xf6, 0xfc, 0x30, + 0x99, 0xf8, 0x00, 0x10, 0xf0, 0xf7, 0xa2, 0xfb, 0x08, 0xb1, 0x19, 0xf8, + 0x01, 0x0b, 0x8d, 0xf8, 0x42, 0x00, 0x9d, 0xf8, 0x42, 0x00, 0x68, 0x28, + 0x05, 0xd1, 0x99, 0xf8, 0x00, 0x00, 0x68, 0x28, 0x0c, 0xd1, 0x62, 0x21, + 0x06, 0xe0, 0x6c, 0x28, 0x04, 0xbf, 0x99, 0xf8, 0x00, 0x00, 0x6c, 0x28, + 0x04, 0xd1, 0x71, 0x21, 0x8d, 0xf8, 0x42, 0x10, 0x09, 0xf1, 0x01, 0x09, + 0x12, 0xa8, 0x06, 0x90, 0x19, 0xf8, 0x01, 0xab, 0xba, 0xf1, 0x25, 0x01, + 0x26, 0xd0, 0x20, 0x39, 0x02, 0x29, 0x40, 0xf2, 0xb1, 0x81, 0x13, 0x39, + 0x00, 0xf0, 0x2b, 0x84, 0x0b, 0x39, 0x00, 0xf0, 0xb1, 0x84, 0x49, 0x1e, + 0x00, 0xf0, 0x67, 0x84, 0x49, 0x1e, 0x02, 0x29, 0x40, 0xf2, 0xa4, 0x81, + 0x09, 0x1f, 0x00, 0xf0, 0x60, 0x84, 0x49, 0x1f, 0x00, 0xf0, 0x24, 0x81, + 0x49, 0x1e, 0x00, 0xf0, 0x18, 0x84, 0x49, 0x1e, 0x00, 0xf0, 0xcf, 0x80, + 0xc9, 0x1e, 0x0d, 0xd0, 0x89, 0x1e, 0x00, 0xf0, 0x10, 0x84, 0xc9, 0x1e, + 0x00, 0xf0, 0x0d, 0x84, 0x00, 0xf0, 0x9d, 0xbc, 0x25, 0x23, 0x8d, 0xf8, + 0x48, 0x30, 0x01, 0x21, 0x00, 0xf0, 0xa2, 0xbc, 0x30, 0x68, 0x50, 0xf8, + 0x04, 0x4b, 0x30, 0x60, 0x00, 0x2c, 0x05, 0x94, 0x40, 0xf0, 0xa5, 0x80, + 0x21, 0x99, 0x48, 0x78, 0x00, 0x28, 0x00, 0xf0, 0x9c, 0x80, 0x4f, 0xf0, + 0xff, 0x34, 0x0f, 0xf6, 0x70, 0x30, 0x05, 0xf0, 0xeb, 0xfb, 0x20, 0x1a, + 0x40, 0xf0, 0xb0, 0x84, 0x00, 0xf0, 0x8b, 0xbc, 0x6d, 0x1e, 0x40, 0xf0, + 0xa2, 0x84, 0x32, 0x97, 0x07, 0x9d, 0x0d, 0xf1, 0x48, 0x08, 0x75, 0xb1, + 0x32, 0x9f, 0x18, 0xf8, 0x01, 0x2b, 0x02, 0xa9, 0x38, 0x46, 0x00, 0xf0, + 0x5d, 0xfd, 0x00, 0x28, 0x01, 0xd4, 0x6d, 0x1e, 0xf5, 0xd1, 0x00, 0x28, + 0x32, 0x97, 0x40, 0xf0, 0x97, 0x84, 0x0a, 0x9d, 0x30, 0x20, 0x00, 0x2d, + 0x8d, 0xf8, 0x04, 0x00, 0x0c, 0xdd, 0x32, 0x9f, 0x01, 0x23, 0x01, 0xaa, + 0x02, 0xa9, 0x38, 0x46, 0x00, 0xf0, 0x58, 0xfd, 0x00, 0x28, 0x40, 0xf0, + 0x87, 0x84, 0x6d, 0x1e, 0xf4, 0xd1, 0x32, 0x97, 0xdd, 0xf8, 0x14, 0x80, + 0x08, 0x9d, 0x75, 0xb1, 0x32, 0x9f, 0x18, 0xf8, 0x01, 0x2b, 0x02, 0xa9, + 0x38, 0x46, 0x00, 0xf0, 0x37, 0xfd, 0x00, 0x28, 0x01, 0xd4, 0x6d, 0x1e, + 0xf5, 0xd1, 0x00, 0x28, 0x32, 0x97, 0x40, 0xf0, 0x71, 0x84, 0x0b, 0x9d, + 0x30, 0x20, 0x00, 0x2d, 0x8d, 0xf8, 0x04, 0x00, 0x0c, 0xdd, 0x32, 0x9f, + 0x01, 0x23, 0x01, 0xaa, 0x02, 0xa9, 0x38, 0x46, 0x00, 0xf0, 0x32, 0xfd, + 0x00, 0x28, 0x40, 0xf0, 0x61, 0x84, 0x6d, 0x1e, 0xf4, 0xd1, 0x32, 0x97, + 0x05, 0x98, 0x08, 0x99, 0x09, 0x9d, 0x00, 0xeb, 0x01, 0x08, 0x75, 0xb1, + 0x32, 0x9f, 0x18, 0xf8, 0x01, 0x2b, 0x02, 0xa9, 0x38, 0x46, 0x00, 0xf0, + 0x0f, 0xfd, 0x00, 0x28, 0x01, 0xd4, 0x6d, 0x1e, 0xf5, 0xd1, 0x00, 0x28, + 0x32, 0x97, 0x40, 0xf0, 0x49, 0x84, 0x0c, 0x9d, 0x30, 0x20, 0x00, 0x2d, + 0x8d, 0xf8, 0x04, 0x00, 0x0c, 0xdd, 0x32, 0x9f, 0x01, 0x23, 0x01, 0xaa, + 0x02, 0xa9, 0x38, 0x46, 0x00, 0xf0, 0x0a, 0xfd, 0x00, 0x28, 0x40, 0xf0, + 0x39, 0x84, 0x6d, 0x1e, 0xf4, 0xd1, 0x32, 0x97, 0x9d, 0xf8, 0x40, 0x00, + 0x41, 0x07, 0x7f, 0xf5, 0x94, 0xae, 0x20, 0x20, 0x00, 0x2c, 0x8d, 0xf8, + 0x04, 0x00, 0x7f, 0xf7, 0x8e, 0xae, 0x32, 0x9d, 0x01, 0x23, 0x01, 0xaa, + 0x02, 0xa9, 0x28, 0x46, 0x00, 0xf0, 0xf2, 0xfc, 0x00, 0x28, 0x40, 0xf0, + 0x21, 0x84, 0x64, 0x1e, 0xf4, 0xd1, 0x32, 0x95, 0x7f, 0xe6, 0x0f, 0xf6, + 0x58, 0x20, 0x05, 0x90, 0xf5, 0xe3, 0x0e, 0x9d, 0x00, 0x2d, 0x04, 0xd5, + 0x20, 0x46, 0xf0, 0xf7, 0xad, 0xfa, 0x04, 0x46, 0x07, 0xe0, 0x2a, 0x46, + 0x20, 0x46, 0x02, 0xf0, 0x0d, 0xfb, 0x00, 0x28, 0x14, 0xbf, 0x04, 0x1b, + 0x2c, 0x46, 0x08, 0x94, 0xe3, 0xe3, 0x31, 0x68, 0x51, 0xf8, 0x04, 0x0b, + 0x31, 0x60, 0x20, 0xf0, 0x00, 0x04, 0x00, 0x21, 0x21, 0xf0, 0xff, 0x35, + 0x12, 0xab, 0xcd, 0xe9, 0x02, 0x45, 0x05, 0x93, 0xdd, 0xe9, 0x02, 0x23, + 0x06, 0x99, 0x3c, 0x24, 0x13, 0xb9, 0x0a, 0xb9, 0x0e, 0x98, 0x98, 0xb1, + 0x02, 0xf0, 0x0f, 0x05, 0x30, 0x35, 0x64, 0x1e, 0xef, 0xb2, 0x3a, 0x2f, + 0xa8, 0xbf, 0x27, 0x35, 0x12, 0x09, 0x42, 0xea, 0x03, 0x72, 0x1b, 0x09, + 0x0d, 0x55, 0x08, 0xbf, 0x00, 0x2a, 0x03, 0xd0, 0x05, 0x98, 0x0d, 0x19, + 0xa8, 0x42, 0xeb, 0xd3, 0x08, 0x19, 0x05, 0x90, 0xc4, 0xf1, 0x3c, 0x02, + 0x0e, 0x98, 0x08, 0x92, 0x82, 0x42, 0x09, 0xda, 0xbd, 0xf8, 0x40, 0x10, + 0x82, 0x1a, 0x4f, 0xf6, 0xef, 0x70, 0x01, 0x40, 0x0a, 0x92, 0xad, 0xf8, + 0x40, 0x10, 0xa8, 0xe3, 0x00, 0x28, 0x40, 0xf1, 0xa6, 0x83, 0x9d, 0xf8, + 0x40, 0x00, 0x00, 0xf0, 0x14, 0x00, 0x10, 0x28, 0x40, 0xf0, 0x9f, 0x83, + 0x0f, 0x9b, 0x07, 0x99, 0x0a, 0x98, 0x5b, 0x1a, 0x1b, 0x1a, 0x9a, 0x1a, + 0x00, 0x2a, 0x40, 0xf3, 0x96, 0x83, 0xf4, 0xe2, 0x21, 0x99, 0x48, 0x78, + 0x20, 0xb1, 0x4f, 0xf0, 0xff, 0x34, 0x0f, 0xf6, 0x38, 0x10, 0xfa, 0xe6, + 0x9d, 0xf8, 0x42, 0x00, 0x62, 0x28, 0x53, 0xd0, 0x68, 0x28, 0x15, 0xd0, + 0x6a, 0x28, 0x36, 0xd0, 0x6c, 0x28, 0x06, 0xd0, 0x71, 0x28, 0x3c, 0xd0, + 0x74, 0x28, 0x25, 0xd0, 0x7a, 0x28, 0x18, 0xd0, 0x53, 0xe0, 0x31, 0x68, + 0x51, 0xf8, 0x04, 0x0b, 0x31, 0x60, 0x00, 0x28, 0x57, 0xd1, 0x4f, 0xf0, + 0xff, 0x34, 0x0f, 0xf6, 0x18, 0x10, 0xde, 0xe6, 0x31, 0x68, 0x51, 0xf8, + 0x04, 0x0b, 0x31, 0x60, 0x20, 0xb9, 0x4f, 0xf0, 0xff, 0x34, 0x0f, 0xf6, + 0x04, 0x10, 0xd4, 0xe6, 0x0d, 0x99, 0x01, 0x80, 0x63, 0xe3, 0x31, 0x68, + 0x51, 0xf8, 0x04, 0x0b, 0x31, 0x60, 0x00, 0x28, 0x3f, 0xd1, 0x4f, 0xf0, + 0xff, 0x34, 0x0f, 0xf6, 0xe8, 0x00, 0xc6, 0xe6, 0x31, 0x68, 0x51, 0xf8, + 0x04, 0x0b, 0x31, 0x60, 0x00, 0x28, 0x34, 0xd1, 0x4f, 0xf0, 0xff, 0x34, + 0x0f, 0xf6, 0xd0, 0x00, 0xbb, 0xe6, 0x31, 0x68, 0x51, 0xf8, 0x04, 0x0b, + 0x31, 0x60, 0x70, 0xb9, 0x4f, 0xf0, 0xff, 0x34, 0x0f, 0xf6, 0xbc, 0x00, + 0xb1, 0xe6, 0x31, 0x68, 0x51, 0xf8, 0x04, 0x0b, 0x31, 0x60, 0x20, 0xb9, + 0x4f, 0xf0, 0xff, 0x34, 0x0f, 0xf6, 0xa8, 0x00, 0xa7, 0xe6, 0x0d, 0x9a, + 0xd3, 0x17, 0xc0, 0xe9, 0x00, 0x23, 0x34, 0xe3, 0x31, 0x68, 0x51, 0xf8, + 0x04, 0x0b, 0x31, 0x60, 0x20, 0xb9, 0x4f, 0xf0, 0xff, 0x34, 0x0f, 0xf6, + 0x8c, 0x00, 0x98, 0xe6, 0x0d, 0x99, 0x01, 0x70, 0x27, 0xe3, 0x31, 0x68, + 0x51, 0xf8, 0x04, 0x0b, 0x31, 0x60, 0x20, 0xb9, 0x4f, 0xf0, 0xff, 0x34, + 0x0f, 0xf6, 0x70, 0x00, 0x8b, 0xe6, 0x0d, 0x99, 0x01, 0x60, 0x1a, 0xe3, + 0x32, 0x68, 0xd2, 0x1d, 0x22, 0xf0, 0x07, 0x02, 0x32, 0x60, 0xd2, 0xe9, + 0x00, 0x01, 0x08, 0x32, 0x32, 0x60, 0xcd, 0xe9, 0x02, 0x01, 0xc8, 0x0f, + 0x02, 0xd0, 0x07, 0x98, 0x2d, 0x21, 0x0a, 0xe0, 0xbd, 0xf8, 0x40, 0x00, + 0x81, 0x07, 0x02, 0xd5, 0x07, 0x98, 0x2b, 0x21, 0x03, 0xe0, 0xc0, 0x07, + 0x05, 0xd5, 0x07, 0x98, 0x20, 0x21, 0x12, 0xaa, 0x11, 0x54, 0x40, 0x1c, + 0x07, 0x90, 0xdd, 0xe9, 0x02, 0x23, 0x07, 0x99, 0x12, 0xa8, 0xcd, 0xe9, + 0x22, 0x23, 0x08, 0x44, 0x0e, 0x99, 0x05, 0x90, 0x00, 0x29, 0x25, 0xac, + 0x02, 0xd5, 0x06, 0x21, 0x0e, 0x91, 0x05, 0xe0, 0x01, 0xbf, 0x4a, 0xf0, + 0x20, 0x01, 0x67, 0x29, 0x01, 0x22, 0x0e, 0x92, 0xdd, 0xe9, 0x02, 0x23, + 0x59, 0x00, 0x49, 0x15, 0x49, 0x1c, 0x0d, 0xd1, 0x1a, 0x03, 0x0b, 0xd0, + 0xaa, 0xf1, 0x61, 0x05, 0x03, 0x21, 0x1a, 0x2d, 0x08, 0x91, 0x02, 0xd2, + 0x0f, 0xf6, 0x18, 0x01, 0x10, 0xe0, 0x0f, 0xf6, 0x18, 0x01, 0x0d, 0xe0, + 0x59, 0x00, 0x49, 0x15, 0x49, 0x1c, 0x0d, 0xd1, 0x1a, 0x03, 0x0b, 0xd1, + 0xaa, 0xf1, 0x61, 0x05, 0x03, 0x21, 0x1a, 0x2d, 0x08, 0x91, 0x17, 0xd3, + 0x0f, 0xf6, 0x00, 0x01, 0x03, 0x22, 0xd1, 0xf7, 0x49, 0xfe, 0xc0, 0xe2, + 0xdd, 0xe9, 0x02, 0x01, 0xcd, 0xe9, 0x30, 0x01, 0xdd, 0xe9, 0x30, 0x23, + 0x23, 0xf0, 0x00, 0x43, 0xb3, 0xf5, 0x80, 0x1f, 0x0d, 0xd2, 0x00, 0x25, + 0x00, 0x2b, 0x08, 0xbf, 0x00, 0x2a, 0x00, 0x95, 0x03, 0xd1, 0x1e, 0xe0, + 0x0f, 0xf2, 0xcc, 0x71, 0xe6, 0xe7, 0x6a, 0x46, 0x05, 0xf0, 0x24, 0xfa, + 0x0f, 0xe0, 0xdf, 0xf8, 0xf4, 0x06, 0xdf, 0xf8, 0xf4, 0x16, 0x00, 0xeb, + 0x13, 0x50, 0x00, 0x90, 0xdd, 0xe9, 0x30, 0x23, 0x19, 0x40, 0x4f, 0xf0, + 0xff, 0x30, 0xdf, 0xf8, 0xe4, 0x36, 0x10, 0x40, 0x19, 0x43, 0x00, 0x9d, + 0xdf, 0xf8, 0xdc, 0x36, 0x47, 0xf2, 0x97, 0x52, 0x55, 0x43, 0x95, 0xfb, + 0xf3, 0xf5, 0xcd, 0xe9, 0x02, 0x01, 0x20, 0xf0, 0x00, 0x02, 0x31, 0xf0, + 0x00, 0x43, 0x08, 0xbf, 0x00, 0x2a, 0x02, 0xd1, 0x00, 0x27, 0x00, 0x25, + 0xac, 0xe0, 0xdd, 0xe9, 0x22, 0x23, 0x23, 0xf0, 0x00, 0x43, 0xcd, 0xe9, + 0x22, 0x23, 0x00, 0x95, 0x2a, 0x46, 0xd2, 0xf1, 0x07, 0x02, 0x04, 0xdd, + 0xdd, 0xe9, 0x22, 0x01, 0x00, 0xf0, 0x22, 0xfb, 0x0b, 0xe0, 0x52, 0x42, + 0x00, 0x20, 0xdf, 0xf8, 0x98, 0x16, 0x00, 0xf0, 0x1b, 0xfb, 0x02, 0x46, + 0x0b, 0x46, 0xdd, 0xe9, 0x22, 0x01, 0x05, 0xf0, 0x1b, 0xfa, 0x4a, 0xf0, + 0x20, 0x0b, 0x04, 0x46, 0xbb, 0xf1, 0x66, 0x0f, 0x06, 0xbf, 0x00, 0x98, + 0x00, 0xf1, 0x0a, 0x08, 0x4f, 0xf0, 0x06, 0x08, 0x0e, 0x98, 0x80, 0x44, + 0xb8, 0xf1, 0x14, 0x0f, 0xc8, 0xbf, 0x4f, 0xf0, 0x14, 0x08, 0x30, 0x20, + 0x0d, 0x46, 0x8d, 0xf8, 0x94, 0x00, 0x0d, 0xf1, 0x95, 0x07, 0xb8, 0xf1, + 0x00, 0x0f, 0x36, 0xdd, 0x20, 0x46, 0x29, 0x46, 0x05, 0xf0, 0x20, 0xfb, + 0x01, 0x46, 0x0a, 0x46, 0x07, 0xf1, 0x08, 0x03, 0x04, 0x20, 0x0a, 0x27, + 0xb2, 0xfb, 0xf7, 0xf7, 0x07, 0xeb, 0x87, 0x0e, 0xa2, 0xeb, 0x4e, 0x02, + 0x30, 0x32, 0x03, 0xf8, 0x01, 0x2c, 0x0a, 0x22, 0xb7, 0xfb, 0xf2, 0xf2, + 0x02, 0xeb, 0x82, 0x0e, 0xa7, 0xeb, 0x4e, 0x07, 0x30, 0x37, 0x40, 0x1e, + 0x03, 0xf8, 0x02, 0x7d, 0xe9, 0xd1, 0xa8, 0xf1, 0x08, 0x08, 0xb8, 0xf1, + 0x00, 0x0f, 0x03, 0xf1, 0x08, 0x07, 0xd6, 0xdd, 0x08, 0x46, 0x05, 0xf0, + 0x0f, 0xfb, 0x02, 0x46, 0x0b, 0x46, 0x20, 0x46, 0x29, 0x46, 0x05, 0xf0, + 0x17, 0xfb, 0x00, 0x22, 0xdf, 0xf8, 0xf0, 0x35, 0x05, 0xf0, 0x84, 0xfb, + 0x04, 0x46, 0x0d, 0x46, 0xc8, 0xe7, 0x2f, 0x98, 0x3f, 0x1a, 0x0d, 0xf1, + 0x95, 0x04, 0x04, 0xe0, 0x00, 0x98, 0x40, 0x1e, 0x7f, 0x1e, 0x00, 0x90, + 0x64, 0x1c, 0x20, 0x78, 0x30, 0x28, 0xf7, 0xd0, 0xbb, 0xf1, 0x66, 0x0f, + 0x02, 0xd1, 0x00, 0x98, 0x40, 0x1c, 0x04, 0xe0, 0xbb, 0xf1, 0x65, 0x0f, + 0x0c, 0xbf, 0x01, 0x20, 0x00, 0x20, 0x0e, 0x99, 0x40, 0x18, 0x87, 0x42, + 0xb8, 0xbf, 0x78, 0x1e, 0x00, 0x28, 0x1d, 0xd4, 0xb8, 0x42, 0x04, 0xda, + 0x21, 0x5c, 0x34, 0x29, 0xc8, 0xbf, 0x39, 0x21, 0x00, 0xdc, 0x30, 0x21, + 0x02, 0x46, 0x63, 0x1e, 0x9d, 0x18, 0x00, 0xe0, 0x40, 0x1e, 0x15, 0xf8, + 0x01, 0x79, 0x52, 0x1e, 0x8f, 0x42, 0xf9, 0xd0, 0x39, 0x29, 0x02, 0xd1, + 0xa1, 0x5c, 0x49, 0x1c, 0xa1, 0x54, 0x00, 0x2a, 0x04, 0xd5, 0x00, 0x99, + 0x49, 0x1c, 0x1c, 0x46, 0x40, 0x1c, 0x00, 0x91, 0x07, 0x46, 0x00, 0x9d, + 0xdd, 0xf8, 0x38, 0x80, 0x38, 0xb2, 0x00, 0x28, 0x02, 0xdc, 0x01, 0x27, + 0x0f, 0xf2, 0x18, 0x64, 0x4a, 0xf0, 0x20, 0x00, 0x66, 0x28, 0x08, 0xbf, + 0x6d, 0x1c, 0x17, 0xd0, 0x67, 0x28, 0x0f, 0xfa, 0x85, 0xfb, 0x5a, 0xd1, + 0x1b, 0xf1, 0x04, 0x0f, 0x43, 0xdb, 0xc3, 0x45, 0x41, 0xda, 0x9d, 0xf8, + 0x40, 0x00, 0x6d, 0x1c, 0x01, 0x07, 0x03, 0xd4, 0x38, 0xb2, 0x40, 0x45, + 0xb8, 0xbf, 0x80, 0x46, 0x28, 0xb2, 0xb8, 0xeb, 0x00, 0x08, 0x48, 0xbf, + 0x4f, 0xf0, 0x00, 0x08, 0x0f, 0xfa, 0x85, 0xfa, 0xba, 0xf1, 0x00, 0x0f, + 0x00, 0xf3, 0xaa, 0x80, 0x08, 0x98, 0x41, 0x1c, 0x08, 0x91, 0x30, 0x22, + 0x05, 0x99, 0x0a, 0x54, 0xb8, 0xf1, 0x00, 0x0f, 0x03, 0xdc, 0x9d, 0xf8, + 0x40, 0x00, 0x01, 0x07, 0x05, 0xd5, 0x08, 0x98, 0x41, 0x1c, 0x08, 0x91, + 0x2e, 0x22, 0x05, 0x99, 0x0a, 0x54, 0x18, 0xeb, 0x0a, 0x0f, 0xb8, 0xbf, + 0xc8, 0xf1, 0x00, 0x05, 0x2d, 0xb2, 0x68, 0x42, 0x0b, 0x90, 0xa8, 0x44, + 0x3a, 0xb2, 0x90, 0x45, 0xb8, 0xbf, 0x47, 0x46, 0x05, 0x9b, 0x08, 0x98, + 0x3f, 0xb2, 0x09, 0x97, 0x3a, 0x46, 0x21, 0x46, 0x18, 0x44, 0xd1, 0xf7, + 0x09, 0xfd, 0xa8, 0xeb, 0x07, 0x00, 0x0c, 0x90, 0xc8, 0xe0, 0x38, 0xb2, + 0x40, 0x45, 0x04, 0xda, 0x9d, 0xf8, 0x40, 0x10, 0x0a, 0x07, 0x58, 0xbf, + 0x80, 0x46, 0xb8, 0xf1, 0x01, 0x08, 0x48, 0xbf, 0x4f, 0xf0, 0x00, 0x08, + 0xba, 0xf1, 0x67, 0x0f, 0x0c, 0xbf, 0x4f, 0xf0, 0x65, 0x0a, 0x4f, 0xf0, + 0x45, 0x0a, 0x08, 0x98, 0x41, 0x1c, 0x08, 0x91, 0xb8, 0xf1, 0x00, 0x0f, + 0x05, 0x99, 0x14, 0xf8, 0x01, 0x2b, 0x0a, 0x54, 0x03, 0xdc, 0x9d, 0xf8, + 0x40, 0x00, 0x01, 0x07, 0x1b, 0xd5, 0x08, 0x98, 0x41, 0x1c, 0x08, 0x91, + 0x2e, 0x22, 0x05, 0x99, 0x0a, 0x54, 0xb8, 0xf1, 0x00, 0x0f, 0x12, 0xdd, + 0x7f, 0x1e, 0x38, 0xb2, 0x80, 0x45, 0x05, 0x98, 0x08, 0x9b, 0xb8, 0xbf, + 0x47, 0x46, 0x3a, 0xb2, 0x21, 0x46, 0x18, 0x44, 0xd1, 0xf7, 0xce, 0xfc, + 0x08, 0x98, 0x3f, 0xb2, 0x38, 0x18, 0x08, 0x90, 0xa8, 0xeb, 0x07, 0x00, + 0x0b, 0x90, 0x05, 0x98, 0x08, 0x99, 0x08, 0x44, 0xbb, 0xf1, 0x00, 0x0f, + 0x80, 0xf8, 0x00, 0xa0, 0x03, 0xd4, 0x2b, 0x22, 0x42, 0x70, 0x81, 0x1c, + 0x04, 0xe0, 0x2d, 0x21, 0x41, 0x70, 0x5d, 0x46, 0x81, 0x1c, 0x6d, 0x42, + 0x00, 0x20, 0x22, 0xaa, 0x0a, 0x24, 0x09, 0xe0, 0x2b, 0x46, 0x93, 0xfb, + 0xf4, 0xf5, 0x05, 0xeb, 0x85, 0x07, 0xa3, 0xeb, 0x47, 0x03, 0x02, 0xf8, + 0x01, 0x3b, 0x40, 0x1c, 0x2d, 0xb2, 0x00, 0x2d, 0xf2, 0xdc, 0x01, 0x28, + 0x06, 0xdc, 0x4a, 0xf0, 0x20, 0x02, 0x65, 0x2a, 0x04, 0xbf, 0x30, 0x22, + 0x01, 0xf8, 0x01, 0x2b, 0x00, 0x28, 0x22, 0xaa, 0x08, 0xd1, 0x30, 0x20, + 0x01, 0xf8, 0x01, 0x0b, 0x06, 0xe0, 0x40, 0x1e, 0x13, 0x5c, 0x30, 0x33, + 0x01, 0xf8, 0x01, 0x3b, 0x00, 0x28, 0xf8, 0xdc, 0x05, 0x9a, 0x08, 0x98, + 0x10, 0x44, 0x09, 0x1a, 0x09, 0x91, 0x4b, 0xe0, 0x38, 0xb2, 0x29, 0xb2, + 0x88, 0x42, 0x1d, 0xda, 0x05, 0x98, 0x08, 0x9b, 0x3a, 0xb2, 0x21, 0x46, + 0x18, 0x44, 0xd1, 0xf7, 0x7d, 0xfc, 0x08, 0x99, 0x3f, 0xb2, 0x79, 0x18, + 0xaa, 0xeb, 0x07, 0x07, 0xb8, 0xf1, 0x00, 0x0f, 0x08, 0x91, 0x0b, 0x97, + 0x03, 0xdc, 0x9d, 0xf8, 0x40, 0x00, 0x02, 0x07, 0x05, 0xd5, 0x05, 0x9a, + 0x2e, 0x20, 0x50, 0x54, 0x09, 0x99, 0x49, 0x1c, 0x09, 0x91, 0xcd, 0xf8, + 0x30, 0x80, 0x29, 0xe0, 0x05, 0x98, 0x08, 0x9b, 0x2a, 0xb2, 0x21, 0x46, + 0x18, 0x44, 0xd1, 0xf7, 0x5f, 0xfc, 0x08, 0x98, 0x7f, 0x1b, 0x50, 0x44, + 0xb8, 0xf1, 0x00, 0x0f, 0x08, 0x90, 0x03, 0xdc, 0x9d, 0xf8, 0x40, 0x10, + 0x0a, 0x07, 0x04, 0xd5, 0x41, 0x1c, 0x08, 0x91, 0x2e, 0x22, 0x05, 0x99, + 0x0a, 0x54, 0x38, 0xb2, 0x80, 0x45, 0x05, 0x98, 0x08, 0x9b, 0xb8, 0xbf, + 0x47, 0x46, 0x3a, 0xb2, 0x04, 0xeb, 0x0a, 0x01, 0x18, 0x44, 0xd1, 0xf7, + 0x43, 0xfc, 0x08, 0x98, 0x3f, 0xb2, 0x38, 0x18, 0xa8, 0xeb, 0x07, 0x07, + 0x08, 0x90, 0x0b, 0x97, 0x9d, 0xf8, 0x40, 0x00, 0x00, 0xf0, 0x14, 0x00, + 0x10, 0x28, 0x40, 0xf0, 0xae, 0x80, 0x07, 0x9a, 0x08, 0x99, 0x0b, 0x98, + 0x8a, 0x18, 0x09, 0x99, 0x82, 0x18, 0x0c, 0x98, 0x8a, 0x18, 0x82, 0x18, + 0x0f, 0x98, 0x82, 0x42, 0x80, 0xf2, 0xa1, 0x80, 0x82, 0x1a, 0x0a, 0x92, + 0x9d, 0xe0, 0x9d, 0xf8, 0x42, 0x00, 0x62, 0x28, 0x08, 0xd0, 0x68, 0x28, + 0x0c, 0xd0, 0x6a, 0x28, 0x10, 0xd0, 0x6c, 0x28, 0x18, 0xd0, 0x71, 0x28, + 0x0c, 0xd0, 0x15, 0xe0, 0x31, 0x68, 0x51, 0xf8, 0x04, 0x0b, 0x31, 0x60, + 0xc0, 0xb2, 0x13, 0xe0, 0x31, 0x68, 0x51, 0xf8, 0x04, 0x0b, 0x31, 0x60, + 0x80, 0xb2, 0x0d, 0xe0, 0x32, 0x68, 0xd2, 0x1d, 0x22, 0xf0, 0x07, 0x02, + 0x32, 0x60, 0xd2, 0xe9, 0x00, 0x01, 0x08, 0x32, 0x32, 0x60, 0x04, 0xe0, + 0x31, 0x68, 0x51, 0xf8, 0x04, 0x0b, 0x31, 0x60, 0x00, 0x21, 0xcd, 0xe9, + 0x02, 0x01, 0x9d, 0xf8, 0x40, 0x00, 0x01, 0x07, 0x51, 0xd5, 0xdd, 0xe9, + 0x02, 0x23, 0x00, 0x2b, 0x08, 0xbf, 0x00, 0x2a, 0x4b, 0xd0, 0x4a, 0xf0, + 0x20, 0x00, 0x78, 0x28, 0x47, 0xd1, 0x07, 0x98, 0x12, 0xa9, 0x30, 0x22, + 0x0a, 0x54, 0x40, 0x1c, 0x43, 0x1c, 0x07, 0x93, 0x01, 0xf8, 0x00, 0xa0, + 0x3d, 0xe0, 0x9d, 0xf8, 0x42, 0x00, 0x62, 0x28, 0x08, 0xd0, 0x68, 0x28, + 0x0c, 0xd0, 0x6a, 0x28, 0x10, 0xd0, 0x6c, 0x28, 0x18, 0xd0, 0x71, 0x28, + 0x0c, 0xd0, 0x15, 0xe0, 0x31, 0x68, 0x51, 0xf8, 0x04, 0x0b, 0x31, 0x60, + 0x40, 0xb2, 0x13, 0xe0, 0x31, 0x68, 0x51, 0xf8, 0x04, 0x0b, 0x31, 0x60, + 0x00, 0xb2, 0x0d, 0xe0, 0x32, 0x68, 0xd2, 0x1d, 0x22, 0xf0, 0x07, 0x02, + 0x32, 0x60, 0xd2, 0xe9, 0x00, 0x01, 0x08, 0x32, 0x32, 0x60, 0x04, 0xe0, + 0x31, 0x68, 0x51, 0xf8, 0x04, 0x0b, 0x31, 0x60, 0xc1, 0x17, 0xcd, 0xe9, + 0x02, 0x01, 0x00, 0x29, 0x02, 0xd5, 0x07, 0x98, 0x2d, 0x21, 0x0a, 0xe0, + 0xbd, 0xf8, 0x40, 0x00, 0x81, 0x07, 0x02, 0xd5, 0x07, 0x98, 0x2b, 0x21, + 0x03, 0xe0, 0xc0, 0x07, 0x05, 0xd5, 0x07, 0x98, 0x20, 0x21, 0x12, 0xaa, + 0x11, 0x54, 0x40, 0x1c, 0x07, 0x90, 0x12, 0xa8, 0x07, 0x99, 0x01, 0x44, + 0x05, 0x91, 0x02, 0xa8, 0x51, 0x46, 0x00, 0xf0, 0x3e, 0xf8, 0x14, 0xe0, + 0x01, 0x20, 0x07, 0x90, 0x30, 0x68, 0x50, 0xf8, 0x04, 0x1b, 0x30, 0x60, + 0x8d, 0xf8, 0x48, 0x10, 0x0b, 0xe0, 0x25, 0x21, 0x01, 0x22, 0xba, 0xf1, + 0x00, 0x0f, 0x8d, 0xf8, 0x48, 0x10, 0x07, 0x92, 0x03, 0xd0, 0x8d, 0xf8, + 0x49, 0xa0, 0x02, 0x21, 0x07, 0x91, 0x0f, 0x9a, 0x07, 0x98, 0x0a, 0x99, + 0x0c, 0x9c, 0x12, 0x1a, 0x08, 0x98, 0x52, 0x1a, 0x0b, 0x99, 0x12, 0x1a, + 0x09, 0x98, 0x52, 0x1a, 0x12, 0x1a, 0x9d, 0xf8, 0x40, 0x00, 0x14, 0x1b, + 0x41, 0x07, 0x3f, 0xf5, 0x67, 0xab, 0x20, 0x20, 0x00, 0x2c, 0x8d, 0xf8, + 0x04, 0x00, 0x7f, 0xf7, 0x61, 0xab, 0x32, 0x9f, 0x25, 0x46, 0x01, 0x23, + 0x01, 0xaa, 0x02, 0xa9, 0x38, 0x46, 0x00, 0xf0, 0xd1, 0xf8, 0x00, 0x28, + 0x3f, 0xf4, 0x52, 0xab, 0x4f, 0xf0, 0xff, 0x30, 0x33, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0x2d, 0xe9, 0xfc, 0x43, 0x07, 0x46, 0x6f, 0x29, 0x3e, 0x69, + 0x08, 0xbf, 0x08, 0x24, 0x05, 0xd0, 0x41, 0xf0, 0x20, 0x00, 0x78, 0x28, + 0x14, 0xbf, 0x0a, 0x24, 0x10, 0x24, 0x3c, 0x25, 0xd7, 0xe9, 0x00, 0x23, + 0x64, 0x29, 0x18, 0xbf, 0x69, 0x29, 0x90, 0x46, 0x99, 0x46, 0x05, 0xd1, + 0x00, 0x2b, 0x03, 0xd5, 0xd8, 0xf1, 0x00, 0x08, 0x69, 0xeb, 0x49, 0x09, + 0xb9, 0xf1, 0x00, 0x0f, 0x08, 0xbf, 0xb8, 0xf1, 0x00, 0x0f, 0x0c, 0xd1, + 0x38, 0x6b, 0x50, 0xb9, 0x08, 0x2c, 0x39, 0xd1, 0x97, 0xf8, 0x38, 0x00, + 0x01, 0x07, 0x35, 0xd5, 0x30, 0x20, 0x3b, 0x25, 0x86, 0xf8, 0x3b, 0x00, + 0x30, 0xe0, 0x8d, 0xf8, 0x00, 0x10, 0x40, 0x46, 0x49, 0x46, 0x22, 0x46, + 0xe3, 0x17, 0xe4, 0xf7, 0x59, 0xfa, 0x30, 0x32, 0xd0, 0xb2, 0x6d, 0x1e, + 0x3a, 0x28, 0x01, 0x95, 0x04, 0xdb, 0x9d, 0xf8, 0x00, 0x00, 0xa0, 0xf1, + 0x51, 0x01, 0x8a, 0x18, 0x72, 0x55, 0x40, 0x46, 0x49, 0x46, 0x22, 0x46, + 0xe3, 0x17, 0xe4, 0xf7, 0x47, 0xfa, 0x80, 0x46, 0x5f, 0xea, 0x01, 0x09, + 0x08, 0xbf, 0xb8, 0xf1, 0x00, 0x0f, 0x03, 0xd0, 0xf8, 0x68, 0x71, 0x19, + 0x88, 0x42, 0xdc, 0xd3, 0x08, 0x2c, 0x09, 0xd1, 0x97, 0xf8, 0x38, 0x00, + 0x01, 0x07, 0x05, 0xd5, 0x70, 0x5d, 0x30, 0x28, 0x02, 0xd0, 0x6d, 0x1e, + 0x30, 0x20, 0x70, 0x55, 0xc5, 0xf1, 0x3c, 0x02, 0xba, 0x61, 0x71, 0x19, + 0xf9, 0x60, 0x38, 0x6b, 0x82, 0x42, 0x08, 0xda, 0x82, 0x1a, 0x3a, 0x62, + 0x4f, 0xf6, 0xef, 0x70, 0x39, 0x8f, 0x01, 0x40, 0x39, 0x87, 0xbd, 0xe8, + 0xf3, 0x83, 0x00, 0x28, 0x0e, 0xd5, 0x97, 0xf8, 0x38, 0x00, 0x00, 0xf0, + 0x14, 0x00, 0x10, 0x28, 0x08, 0xd1, 0x7b, 0x6b, 0x79, 0x69, 0x38, 0x6a, + 0x5b, 0x1a, 0x1b, 0x1a, 0x9a, 0x1a, 0x00, 0x2a, 0xc8, 0xbf, 0x3a, 0x62, + 0xbd, 0xe8, 0xf3, 0x83, 0x2d, 0xe9, 0xd0, 0x43, 0x06, 0x46, 0x0f, 0x46, + 0x14, 0x46, 0x4f, 0xf0, 0x00, 0x08, 0xdf, 0xf8, 0x54, 0x90, 0x12, 0xe0, + 0xe0, 0x07, 0x07, 0xd5, 0x42, 0x46, 0x4b, 0x46, 0x30, 0x46, 0x39, 0x46, + 0x05, 0xf0, 0xac, 0xf8, 0x06, 0x46, 0x0f, 0x46, 0x40, 0x46, 0x49, 0x46, + 0x42, 0x46, 0x4b, 0x46, 0x05, 0xf0, 0xa4, 0xf8, 0x64, 0x10, 0x80, 0x46, + 0x89, 0x46, 0x00, 0x2c, 0xea, 0xd1, 0x30, 0x46, 0x39, 0x46, 0xbd, 0xe8, + 0xd0, 0x83, 0x00, 0x00, 0xcb, 0xcc, 0xcc, 0x0c, 0x02, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0x0f, 0x80, 0x00, 0x00, 0xe0, 0x3f, 0xa0, 0x86, 0x01, 0x00, + 0x00, 0x00, 0xf0, 0x3f, 0x84, 0xd7, 0x97, 0x41, 0x00, 0x00, 0x24, 0x40, + 0x10, 0xb5, 0x03, 0x46, 0x0c, 0x46, 0x11, 0x46, 0xa0, 0x68, 0x98, 0x47, + 0xa0, 0x60, 0x20, 0xb1, 0xe0, 0x6a, 0x40, 0x1c, 0xe0, 0x62, 0x00, 0x20, + 0x10, 0xbd, 0x4f, 0xf0, 0xff, 0x30, 0x10, 0xbd, 0xf8, 0xb5, 0x05, 0x46, + 0x0e, 0x46, 0x17, 0x46, 0x1c, 0x46, 0x00, 0x20, 0x5c, 0xb1, 0x17, 0xf8, + 0x01, 0x1b, 0xb0, 0x68, 0xa8, 0x47, 0xb0, 0x60, 0x30, 0xb1, 0xf0, 0x6a, + 0x40, 0x1c, 0xf0, 0x62, 0x00, 0x20, 0x64, 0x1e, 0xf3, 0xd1, 0xf2, 0xbd, + 0x4f, 0xf0, 0xff, 0x30, 0xf2, 0xbd, 0x00, 0x00, 0x68, 0x6a, 0x6c, 0x74, + 0x7a, 0x4c, 0x00, 0x00, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x66, 0x5f, 0x73, + 0x3a, 0x20, 0x25, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x00, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x66, 0x3a, 0x20, + 0x62, 0x61, 0x64, 0x20, 0x25, 0x6e, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x00, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x66, 0x5f, 0x73, + 0x3a, 0x20, 0x62, 0x61, 0x64, 0x20, 0x25, 0x73, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6e, 0x61, 0x6e, 0x00, 0x4e, 0x41, 0x4e, 0x00, 0x69, 0x6e, 0x66, 0x00, + 0x49, 0x4e, 0x46, 0x00, 0x30, 0x00, 0x00, 0x00, 0x7f, 0xb5, 0x1d, 0x46, + 0x0c, 0x46, 0x29, 0x68, 0x1c, 0x29, 0x43, 0xd0, 0x65, 0x60, 0x22, 0x60, + 0x00, 0x21, 0x21, 0x76, 0xe1, 0x61, 0x21, 0x61, 0x2a, 0x69, 0x09, 0x9b, + 0x02, 0x92, 0xa9, 0x68, 0x01, 0x91, 0x00, 0x93, 0xea, 0x68, 0x69, 0x68, + 0x23, 0x46, 0xed, 0xf7, 0x5f, 0xfd, 0xa0, 0x60, 0x28, 0xb9, 0x03, 0x22, + 0x4f, 0xf6, 0x0b, 0x71, 0x01, 0x20, 0xed, 0xf7, 0xe5, 0xfa, 0x2a, 0x68, + 0xa0, 0x68, 0x00, 0x21, 0xee, 0xf7, 0xf5, 0xf9, 0xa0, 0x68, 0x22, 0x46, + 0x01, 0x21, 0xee, 0xf7, 0xf0, 0xf9, 0x68, 0x69, 0x05, 0xf0, 0xd2, 0xf8, + 0xe0, 0x60, 0x28, 0xb9, 0x03, 0x22, 0x4f, 0xf6, 0x1c, 0x71, 0x01, 0x20, + 0xed, 0xf7, 0xd0, 0xfa, 0xa8, 0x69, 0x98, 0xb1, 0x01, 0x90, 0x23, 0x46, + 0x0f, 0xf2, 0x39, 0x10, 0x08, 0x9e, 0x00, 0x90, 0x00, 0x22, 0xe8, 0x69, + 0x31, 0x46, 0xee, 0xf7, 0x69, 0xfb, 0x20, 0x61, 0x28, 0xb9, 0x03, 0x22, + 0x4f, 0xf6, 0x1e, 0x71, 0x01, 0x20, 0xed, 0xf7, 0xbb, 0xfa, 0x66, 0x61, + 0x00, 0x20, 0x04, 0xb0, 0x70, 0xbd, 0x7c, 0xb5, 0x04, 0x46, 0x25, 0x68, + 0x29, 0x68, 0x88, 0x47, 0xe0, 0x68, 0x1a, 0x21, 0x05, 0xf0, 0x03, 0xf9, + 0x25, 0x21, 0xe0, 0x68, 0x05, 0xf0, 0x0c, 0xf9, 0x4f, 0xf0, 0xff, 0x30, + 0x00, 0x90, 0x00, 0x23, 0xe0, 0x68, 0x01, 0x22, 0x4f, 0xf4, 0xfe, 0x41, + 0x05, 0xf0, 0xa4, 0xf8, 0x06, 0x46, 0x30, 0x05, 0x05, 0xd5, 0x4f, 0xf4, + 0x00, 0x61, 0x21, 0x62, 0x20, 0x46, 0xaa, 0x68, 0x90, 0x47, 0xb0, 0x05, + 0x13, 0xd5, 0x4f, 0xf4, 0x00, 0x71, 0x20, 0x69, 0x21, 0x62, 0x70, 0xb1, + 0x00, 0x21, 0x00, 0x91, 0x00, 0x23, 0x00, 0x22, 0x03, 0x21, 0xee, 0xf7, + 0x47, 0xfb, 0xe0, 0x68, 0x02, 0x21, 0x05, 0xf0, 0xda, 0xf8, 0xe0, 0x68, + 0x01, 0x21, 0x05, 0xf0, 0xe3, 0xf8, 0x70, 0x05, 0x0c, 0xd5, 0x4f, 0xf4, + 0x80, 0x61, 0x20, 0x69, 0x21, 0x62, 0x38, 0xb1, 0xe0, 0x68, 0x01, 0x21, + 0x05, 0xf0, 0xcb, 0xf8, 0xe0, 0x68, 0x02, 0x21, 0x05, 0xf0, 0xd4, 0xf8, + 0xf0, 0x04, 0x05, 0xd5, 0x4f, 0xf4, 0x80, 0x51, 0x21, 0x62, 0x20, 0x46, + 0xea, 0x68, 0x90, 0x47, 0x70, 0x04, 0x05, 0xd5, 0x4f, 0xf4, 0x80, 0x41, + 0x21, 0x62, 0x20, 0x46, 0xea, 0x68, 0x90, 0x47, 0xb0, 0x04, 0x05, 0xd5, + 0x4f, 0xf4, 0x00, 0x51, 0x21, 0x62, 0x20, 0x46, 0x2a, 0x69, 0x90, 0x47, + 0xf0, 0x05, 0xad, 0xd5, 0x4f, 0xf4, 0x80, 0x71, 0x21, 0x62, 0x08, 0x21, + 0xe0, 0x68, 0x05, 0xf0, 0xb3, 0xf8, 0xe0, 0x68, 0x04, 0x21, 0x05, 0xf0, + 0xa2, 0xf8, 0xed, 0xf7, 0xff, 0xfe, 0x00, 0xf0, 0xaa, 0xf8, 0x41, 0xf6, + 0x12, 0x21, 0x08, 0x40, 0x12, 0x28, 0x04, 0xbf, 0x00, 0x20, 0x20, 0x76, + 0xed, 0xf7, 0xfa, 0xfe, 0x20, 0x69, 0x30, 0xb1, 0x00, 0x21, 0x00, 0x91, + 0x00, 0x23, 0x62, 0x69, 0x04, 0x21, 0xee, 0xf7, 0xf5, 0xfa, 0x69, 0x68, + 0x20, 0x46, 0x88, 0x47, 0xe0, 0x68, 0x08, 0x21, 0x05, 0xf0, 0x85, 0xf8, + 0x04, 0x21, 0x80, 0xe7, 0x10, 0xb5, 0xee, 0xf7, 0x40, 0xfc, 0x04, 0x46, + 0x00, 0x21, 0xe0, 0x68, 0x05, 0xf0, 0x7b, 0xf8, 0x00, 0xf0, 0x12, 0x00, + 0x12, 0x28, 0x06, 0xd1, 0xe0, 0x68, 0xbd, 0xe8, 0x10, 0x40, 0x4f, 0xf4, + 0x80, 0x71, 0x05, 0xf0, 0x7d, 0xb8, 0x10, 0xbd, 0x80, 0xb5, 0x00, 0xf0, + 0x0c, 0xf8, 0x00, 0x7e, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x07, 0xf8, + 0x00, 0x6a, 0x02, 0xbd, 0x01, 0x21, 0x01, 0x76, 0x80, 0x68, 0xed, 0xf7, + 0x1e, 0xbf, 0x80, 0xb5, 0xee, 0xf7, 0x48, 0xf9, 0xbd, 0xe8, 0x04, 0x40, + 0x01, 0x21, 0xee, 0xf7, 0x25, 0xb9, 0x10, 0xb5, 0x00, 0xf0, 0x1b, 0xf8, + 0xe0, 0x68, 0xbd, 0xe8, 0x10, 0x40, 0x4f, 0xf4, 0x00, 0x61, 0x05, 0xf0, + 0x5b, 0xb8, 0x10, 0xb5, 0x00, 0xf0, 0x11, 0xf8, 0xe0, 0x68, 0xbd, 0xe8, + 0x10, 0x40, 0x4f, 0xf4, 0x80, 0x51, 0x05, 0xf0, 0x51, 0xb8, 0x10, 0xb5, + 0x00, 0xf0, 0x07, 0xf8, 0xe0, 0x68, 0xbd, 0xe8, 0x10, 0x40, 0x4f, 0xf4, + 0x80, 0x41, 0x05, 0xf0, 0x47, 0xb8, 0x04, 0x46, 0xd2, 0xe7, 0x10, 0xb5, + 0xff, 0xf7, 0xfb, 0xff, 0x05, 0x20, 0xed, 0xf7, 0x22, 0xfd, 0xe0, 0x68, + 0xbd, 0xe8, 0x10, 0x40, 0x4f, 0xf4, 0x00, 0x51, 0x05, 0xf0, 0x38, 0xb8, + 0xc0, 0x68, 0x4f, 0xf4, 0x89, 0x71, 0x05, 0xf0, 0x33, 0xb8, 0x10, 0xb5, + 0x04, 0x46, 0xa0, 0x68, 0x90, 0xb1, 0xed, 0xf7, 0x7f, 0xfe, 0x20, 0x46, + 0xff, 0xf7, 0xb8, 0xff, 0xe0, 0x68, 0x4f, 0xf4, 0xa0, 0x61, 0x05, 0xf0, + 0x18, 0xf8, 0xe0, 0x68, 0x4f, 0xf4, 0x00, 0x71, 0x05, 0xf0, 0x20, 0xf8, + 0xe0, 0x69, 0x40, 0x1c, 0xe0, 0x61, 0x54, 0xe0, 0x10, 0xbd, 0x10, 0xb5, + 0x04, 0x46, 0xa0, 0x68, 0xa0, 0xb1, 0xed, 0xf7, 0x67, 0xfe, 0xe0, 0x69, + 0x40, 0x1e, 0xe0, 0x61, 0x0d, 0xd1, 0x00, 0xf0, 0x0e, 0xf8, 0xc0, 0x06, + 0x04, 0xd5, 0xe0, 0x68, 0x4f, 0xf4, 0xa0, 0x61, 0x05, 0xf0, 0x08, 0xf8, + 0xe0, 0x68, 0x4f, 0xf4, 0x00, 0x71, 0x04, 0xf0, 0xf6, 0xff, 0x3a, 0xe0, + 0x10, 0xbd, 0xe0, 0x68, 0x00, 0x21, 0x04, 0xf0, 0xf0, 0xbf, 0x10, 0xb5, + 0x04, 0x46, 0xa0, 0x68, 0x68, 0xb1, 0xed, 0xf7, 0x49, 0xfe, 0x20, 0x46, + 0xff, 0xf7, 0x82, 0xff, 0xe0, 0x68, 0x4f, 0xf4, 0xa2, 0x61, 0x04, 0xf0, + 0xe2, 0xff, 0xe0, 0x68, 0x4f, 0xf4, 0x08, 0x71, 0x21, 0xe0, 0x10, 0xbd, + 0x70, 0xb5, 0x04, 0x46, 0x10, 0x25, 0xa0, 0x68, 0x60, 0x26, 0x98, 0xb1, + 0xed, 0xf7, 0x34, 0xfe, 0xe0, 0x69, 0x18, 0xb9, 0x4f, 0xf4, 0x18, 0x76, + 0x4f, 0xf4, 0xa2, 0x65, 0xe0, 0x68, 0x31, 0x46, 0x04, 0xf0, 0xcb, 0xff, + 0xe0, 0x68, 0x29, 0x46, 0x04, 0xf0, 0xd4, 0xff, 0xbd, 0xe8, 0x70, 0x40, + 0xed, 0xf7, 0x28, 0xbe, 0x70, 0xbd, 0x10, 0xb5, 0x04, 0x46, 0xed, 0xf7, + 0x1d, 0xfe, 0xe0, 0x68, 0x40, 0x21, 0x04, 0xf0, 0xc7, 0xff, 0xbd, 0xe8, + 0x10, 0x40, 0xed, 0xf7, 0x1b, 0xbe, 0x38, 0xb5, 0x04, 0x46, 0xa0, 0x68, + 0x50, 0xb1, 0x4f, 0xf0, 0xff, 0x35, 0x00, 0x95, 0x00, 0x23, 0xe0, 0x68, + 0x00, 0x22, 0x04, 0x21, 0x04, 0xf0, 0x58, 0xff, 0x40, 0x07, 0xf4, 0xd5, + 0x00, 0x20, 0x32, 0xbd, 0x80, 0xb5, 0x82, 0x68, 0x00, 0x21, 0x1a, 0xb1, + 0xc0, 0x68, 0x04, 0xf0, 0x9e, 0xff, 0x01, 0x46, 0xc8, 0xb2, 0x02, 0xbd, + 0x01, 0x46, 0x00, 0x20, 0x89, 0x68, 0x01, 0xb1, 0x01, 0x20, 0x70, 0x47, + 0x2d, 0xe9, 0xfe, 0x4f, 0x00, 0x24, 0x4f, 0xf0, 0x01, 0x08, 0xdf, 0xf8, + 0x84, 0x5a, 0xdf, 0xf8, 0x84, 0xba, 0x4f, 0xf0, 0x24, 0x09, 0xdf, 0xf8, + 0xbc, 0x0a, 0xdf, 0xf8, 0xbc, 0x2a, 0x01, 0x68, 0xd1, 0xf8, 0xb8, 0x00, + 0x11, 0x68, 0x08, 0x40, 0x06, 0x04, 0x36, 0x0e, 0x2b, 0xe0, 0xdf, 0xf8, + 0xa4, 0x0a, 0xdf, 0xf8, 0xa4, 0x2a, 0x00, 0x68, 0x00, 0x26, 0xb8, 0x30, + 0x06, 0x2c, 0x22, 0xd8, 0xdf, 0xe8, 0x04, 0xf0, 0x04, 0x1c, 0x1c, 0x05, + 0x04, 0x1c, 0x15, 0x00, 0xe3, 0xe7, 0x00, 0x21, 0xdf, 0xf8, 0x88, 0x0a, + 0xca, 0xb2, 0x50, 0xf8, 0x22, 0x20, 0xff, 0x2a, 0x04, 0xd1, 0x49, 0x1c, + 0xcb, 0xb2, 0x08, 0x2b, 0xf6, 0xdb, 0x0e, 0xe0, 0x08, 0xfa, 0x01, 0xf6, + 0x0b, 0xe0, 0x01, 0x68, 0x16, 0x68, 0x0e, 0x40, 0x36, 0x0c, 0x06, 0xf0, + 0x03, 0x06, 0x04, 0xe0, 0x01, 0x68, 0x16, 0x68, 0x0e, 0x40, 0x06, 0xf0, + 0xff, 0x06, 0x4f, 0xf0, 0x00, 0x0a, 0x51, 0x46, 0x00, 0xf0, 0x2d, 0xfc, + 0x07, 0x46, 0xff, 0x2f, 0x30, 0xd0, 0x00, 0xf0, 0x52, 0xfa, 0x62, 0x43, + 0x0a, 0x44, 0x09, 0xfb, 0x07, 0xf3, 0xd1, 0x18, 0x09, 0xfb, 0x04, 0xf2, + 0x5a, 0x44, 0x50, 0x68, 0x00, 0xb3, 0x26, 0xfa, 0x0a, 0xf0, 0xc0, 0x07, + 0x1c, 0xd5, 0x28, 0x19, 0x02, 0x79, 0x01, 0x92, 0x05, 0xeb, 0x84, 0x00, + 0xa0, 0x22, 0x03, 0x69, 0x62, 0x43, 0x28, 0x20, 0x00, 0x93, 0x5a, 0x44, + 0x78, 0x43, 0x10, 0x44, 0x00, 0xf1, 0xfc, 0x03, 0x0f, 0xf6, 0x50, 0x22, + 0xdf, 0xf8, 0x04, 0x0a, 0xff, 0xf7, 0xcc, 0xfd, 0xe8, 0x68, 0x07, 0xeb, + 0x84, 0x07, 0x08, 0xfa, 0x07, 0xf7, 0x07, 0x43, 0xef, 0x60, 0x03, 0xe0, + 0x00, 0x20, 0x88, 0x60, 0xc8, 0x60, 0x08, 0x61, 0x0a, 0xf1, 0x01, 0x0a, + 0xba, 0xf1, 0x08, 0x0f, 0xc3, 0xd3, 0x64, 0x1c, 0x07, 0x2c, 0x92, 0xd3, + 0x00, 0x20, 0xbd, 0xe8, 0xfe, 0x8f, 0x2d, 0xe9, 0xf8, 0x43, 0x80, 0x46, + 0x0d, 0x46, 0x08, 0x98, 0x09, 0x99, 0x16, 0x46, 0xdf, 0xf8, 0xc4, 0x29, + 0x02, 0xeb, 0x08, 0x12, 0xa6, 0xf1, 0x30, 0x07, 0x16, 0x60, 0x55, 0x60, + 0x13, 0x81, 0x50, 0x81, 0xd1, 0x60, 0x00, 0x24, 0x00, 0xf0, 0x03, 0xfa, + 0x7a, 0x43, 0x24, 0x20, 0x0a, 0x44, 0x60, 0x43, 0x02, 0xeb, 0x00, 0x09, + 0x48, 0x46, 0xff, 0xf7, 0x55, 0xff, 0x01, 0x28, 0x03, 0xd0, 0x64, 0x1c, + 0x04, 0x2c, 0xef, 0xd3, 0x02, 0xe0, 0x48, 0x46, 0xff, 0xf7, 0x8f, 0xfe, + 0x04, 0x2c, 0x09, 0xd3, 0x32, 0x46, 0x29, 0x46, 0x40, 0x46, 0x01, 0xb0, + 0xbd, 0xe8, 0xf0, 0x43, 0x4f, 0xf6, 0x24, 0x73, 0xfc, 0xf7, 0x70, 0xb8, + 0xbd, 0xe8, 0xf1, 0x83, 0x2d, 0xe9, 0xf0, 0x47, 0x00, 0xf0, 0x25, 0xf8, + 0x01, 0x46, 0xff, 0x29, 0x4f, 0xf0, 0x00, 0x09, 0x0b, 0xd0, 0x00, 0xf0, + 0x43, 0xf8, 0x08, 0xbf, 0x00, 0x21, 0x00, 0xf0, 0x09, 0xf8, 0x01, 0x28, + 0x03, 0xd1, 0x20, 0x46, 0xff, 0xf7, 0x77, 0xfe, 0x01, 0xe0, 0x4f, 0xf6, + 0x24, 0x79, 0x32, 0xe0, 0xc2, 0xf8, 0x00, 0xa0, 0xc2, 0xf8, 0x04, 0x80, + 0xd5, 0x60, 0x57, 0x61, 0x90, 0x20, 0xdf, 0xf8, 0x30, 0x39, 0x46, 0x43, + 0x24, 0x22, 0x98, 0x19, 0x51, 0x43, 0x44, 0x18, 0x20, 0x46, 0xff, 0xf7, + 0x15, 0xbf, 0x90, 0x46, 0x08, 0x9f, 0x04, 0x46, 0x0d, 0x46, 0xa8, 0xf1, + 0x30, 0x06, 0x9a, 0x46, 0x39, 0x46, 0xf0, 0xb2, 0x00, 0xf0, 0x88, 0xbb, + 0x2d, 0xe9, 0xf0, 0x47, 0xff, 0xf7, 0xf1, 0xff, 0x01, 0x46, 0xff, 0x29, + 0x4f, 0xf0, 0x00, 0x09, 0x0b, 0xd0, 0x00, 0xf0, 0x0f, 0xf8, 0x08, 0xbf, + 0x00, 0x21, 0xff, 0xf7, 0xd5, 0xff, 0x01, 0x28, 0x03, 0xd1, 0x20, 0x46, + 0xff, 0xf7, 0x4d, 0xfe, 0x01, 0xe0, 0x4f, 0xf6, 0x24, 0x79, 0x48, 0x46, + 0xbd, 0xe8, 0xf0, 0x87, 0x18, 0x22, 0xdf, 0xf8, 0xd4, 0xc8, 0x0a, 0x9b, + 0x09, 0x98, 0x54, 0x43, 0x0c, 0xeb, 0x04, 0x02, 0x03, 0x2e, 0x10, 0x82, + 0x93, 0x60, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x41, 0x18, 0x25, 0xa2, 0xf1, + 0x30, 0x0e, 0x00, 0x26, 0xdf, 0xf8, 0xb4, 0x88, 0x06, 0x9f, 0x07, 0x9c, + 0xdd, 0xf8, 0x20, 0xc0, 0x68, 0x43, 0x40, 0x44, 0xbe, 0xf1, 0x03, 0x0f, + 0x47, 0x61, 0xc1, 0x60, 0x42, 0x60, 0x08, 0xbf, 0x00, 0x27, 0x03, 0x60, + 0xc0, 0xf8, 0x08, 0xc0, 0x04, 0x82, 0x90, 0x21, 0xdf, 0xf8, 0x84, 0x28, + 0x01, 0xfb, 0x0e, 0xf0, 0x11, 0x18, 0x24, 0x20, 0x47, 0x43, 0xcc, 0x19, + 0xff, 0xf7, 0xa8, 0xff, 0x01, 0x28, 0x03, 0xd1, 0x20, 0x46, 0xff, 0xf7, + 0x1e, 0xfe, 0x01, 0xe0, 0x4f, 0xf6, 0x24, 0x76, 0x30, 0x46, 0xbd, 0xe8, + 0xf0, 0x81, 0x2d, 0xe9, 0xf5, 0x4f, 0x81, 0xb0, 0x0e, 0x46, 0xdf, 0xf7, + 0x64, 0xfb, 0x04, 0x46, 0xdf, 0xf7, 0xcc, 0xfb, 0x00, 0xf0, 0x8e, 0xf8, + 0x01, 0x98, 0xe8, 0x40, 0xc1, 0x07, 0x36, 0xd5, 0x9d, 0xf8, 0x08, 0x00, + 0x00, 0x90, 0x00, 0x27, 0x03, 0x2d, 0x16, 0xd1, 0x26, 0xfa, 0x07, 0xf0, + 0xc0, 0x07, 0x29, 0xd5, 0x38, 0x46, 0xdf, 0xf7, 0x7e, 0xfb, 0xff, 0x28, + 0x24, 0xd0, 0x50, 0x46, 0xff, 0xf7, 0x94, 0xfe, 0xd8, 0xb1, 0x00, 0x98, + 0x01, 0x28, 0x50, 0x46, 0x02, 0xd1, 0xff, 0xf7, 0x4b, 0xfe, 0x1c, 0xe0, + 0xff, 0xf7, 0x35, 0xfe, 0x19, 0xe0, 0x24, 0xfa, 0x07, 0xf0, 0xc0, 0x07, + 0x12, 0xd5, 0x00, 0xf0, 0x18, 0xf8, 0xff, 0x28, 0x0e, 0xd0, 0x00, 0xf0, + 0x6d, 0xf8, 0x30, 0xb1, 0x00, 0x98, 0x01, 0x28, 0x58, 0x46, 0x05, 0xd1, + 0xff, 0xf7, 0x36, 0xfe, 0x04, 0xe0, 0x4f, 0xf6, 0x24, 0x79, 0x07, 0xe0, + 0xff, 0xf7, 0x1d, 0xfe, 0x7f, 0x1c, 0x07, 0x2f, 0xcc, 0xd9, 0x6d, 0x1c, + 0x07, 0x2d, 0xc1, 0xd3, 0x4b, 0xe0, 0x39, 0x46, 0xe8, 0xb2, 0xe5, 0xe2, + 0x2d, 0xe9, 0xf5, 0x4f, 0x81, 0xb0, 0x0e, 0x46, 0xdf, 0xf7, 0x17, 0xfb, + 0x04, 0x46, 0xdf, 0xf7, 0x7f, 0xfb, 0x00, 0xf0, 0x41, 0xf8, 0x01, 0x98, + 0xe8, 0x40, 0xc1, 0x07, 0x36, 0xd5, 0x9d, 0xf8, 0x08, 0x00, 0x00, 0x90, + 0x00, 0x27, 0x03, 0x2d, 0x16, 0xd1, 0x26, 0xfa, 0x07, 0xf0, 0xc0, 0x07, + 0x29, 0xd5, 0x38, 0x46, 0xdf, 0xf7, 0x31, 0xfb, 0xff, 0x28, 0x24, 0xd0, + 0x50, 0x46, 0xff, 0xf7, 0x47, 0xfe, 0xd8, 0xb1, 0x00, 0x98, 0x01, 0x28, + 0x50, 0x46, 0x02, 0xd1, 0xff, 0xf7, 0xb5, 0xfd, 0x1c, 0xe0, 0xff, 0xf7, + 0xca, 0xfd, 0x19, 0xe0, 0x24, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x12, 0xd5, + 0xff, 0xf7, 0xcb, 0xff, 0xff, 0x28, 0x0e, 0xd0, 0x00, 0xf0, 0x20, 0xf8, + 0x30, 0xb1, 0x00, 0x98, 0x01, 0x28, 0x58, 0x46, 0x05, 0xd1, 0xff, 0xf7, + 0xa0, 0xfd, 0x04, 0xe0, 0x4f, 0xf6, 0x24, 0x79, 0x07, 0xe0, 0xff, 0xf7, + 0xb2, 0xfd, 0x7f, 0x1c, 0x07, 0x2f, 0xcc, 0xd9, 0x6d, 0x1c, 0x07, 0x2d, + 0xc1, 0xd3, 0x48, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, 0x34, 0x40, 0xdf, 0xf8, + 0x28, 0x87, 0x4f, 0xf0, 0x00, 0x09, 0x06, 0x40, 0x00, 0x25, 0x08, 0xf5, + 0xd8, 0x7a, 0x70, 0x47, 0x90, 0x21, 0x69, 0x43, 0x24, 0x22, 0x41, 0x44, + 0x50, 0x43, 0x01, 0xeb, 0x00, 0x0b, 0x58, 0x46, 0xff, 0xf7, 0x08, 0xbe, + 0xf8, 0xb5, 0x1e, 0x46, 0x24, 0x23, 0xdf, 0xf8, 0xa8, 0x76, 0x04, 0x46, + 0x30, 0x3c, 0x5c, 0x43, 0x3c, 0x44, 0x15, 0x46, 0x08, 0x46, 0x22, 0x69, + 0x4f, 0xf6, 0x2a, 0x71, 0x52, 0xb1, 0x21, 0x6a, 0x06, 0x9b, 0x00, 0x91, + 0x29, 0x46, 0x01, 0x25, 0x24, 0x69, 0x32, 0x46, 0x05, 0xfa, 0x00, 0xf0, + 0xa0, 0x47, 0x01, 0x46, 0x08, 0x46, 0xf2, 0xbd, 0x70, 0xb5, 0x04, 0x46, + 0x58, 0x21, 0xe3, 0xf7, 0x7d, 0xfd, 0x00, 0x25, 0x00, 0x26, 0x31, 0x46, + 0xff, 0xf7, 0x78, 0xff, 0xff, 0x28, 0x0d, 0xd0, 0x03, 0x2d, 0x08, 0xbf, + 0x00, 0x20, 0x00, 0xf0, 0x36, 0xf8, 0x61, 0x19, 0xc6, 0xeb, 0xc6, 0x02, + 0x11, 0x44, 0x81, 0xf8, 0x20, 0x00, 0x40, 0x06, 0x00, 0xf0, 0x24, 0xf8, + 0x76, 0x1c, 0x07, 0x2e, 0xe9, 0xd9, 0x6d, 0x1c, 0x07, 0x2d, 0xe5, 0xd3, + 0x00, 0x20, 0x70, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x20, 0x21, 0xe3, 0xf7, + 0x5b, 0xfd, 0x00, 0x25, 0x00, 0x26, 0x31, 0x46, 0xff, 0xf7, 0x56, 0xff, + 0xff, 0x28, 0x07, 0xd0, 0x03, 0x2d, 0x08, 0xbf, 0x00, 0x20, 0x00, 0xf0, + 0x14, 0xf8, 0xc0, 0x06, 0x00, 0xf0, 0x08, 0xf8, 0x76, 0x1c, 0x07, 0x2e, + 0xef, 0xd9, 0x6d, 0x1c, 0x07, 0x2d, 0xeb, 0xd3, 0x00, 0x20, 0x70, 0xbd, + 0x06, 0xd5, 0x04, 0xeb, 0x86, 0x00, 0x01, 0x22, 0x01, 0x68, 0xaa, 0x40, + 0x11, 0x43, 0x01, 0x60, 0x70, 0x47, 0x90, 0x22, 0xdf, 0xf8, 0x38, 0x16, + 0x6a, 0x43, 0x24, 0x23, 0x0a, 0x44, 0x58, 0x43, 0x10, 0x44, 0xff, 0xf7, + 0x91, 0xbd, 0x02, 0x46, 0x00, 0x20, 0x00, 0x23, 0x07, 0x2a, 0x3d, 0xbf, + 0xdf, 0xf8, 0xc4, 0x35, 0x03, 0xeb, 0x82, 0x02, 0x13, 0x69, 0x4f, 0xf6, + 0x2f, 0x70, 0x0b, 0x60, 0x70, 0x47, 0x2d, 0xe9, 0xfc, 0x41, 0x00, 0x92, + 0x0b, 0x46, 0xdf, 0xf8, 0xac, 0x85, 0x02, 0x46, 0x1c, 0x21, 0x08, 0xf1, + 0x10, 0x00, 0xe9, 0xf7, 0x14, 0xfa, 0x04, 0x00, 0x20, 0xd1, 0x00, 0x26, + 0x00, 0x27, 0xff, 0xf7, 0x6d, 0xfe, 0xff, 0x28, 0x14, 0xd0, 0x03, 0x2e, + 0x08, 0xbf, 0x00, 0x20, 0x00, 0xf0, 0x19, 0xf8, 0x72, 0x43, 0x24, 0x23, + 0x0a, 0x44, 0x58, 0x43, 0x15, 0x18, 0x28, 0x46, 0xff, 0xf7, 0x6c, 0xfd, + 0x30, 0xb1, 0x08, 0xf1, 0x10, 0x00, 0x50, 0xf8, 0x26, 0x10, 0x28, 0x46, + 0x41, 0x61, 0xc0, 0x46, 0x7f, 0x1c, 0x07, 0x2f, 0xe3, 0xd9, 0x76, 0x1c, + 0x07, 0x2e, 0xdf, 0xd3, 0x20, 0x46, 0xbd, 0xe8, 0xf6, 0x81, 0x90, 0x22, + 0xdf, 0xf8, 0xa4, 0x15, 0x70, 0x47, 0xf8, 0xb5, 0x0d, 0x46, 0xa0, 0xf1, + 0x30, 0x04, 0x00, 0x26, 0x01, 0x20, 0xb0, 0x40, 0x05, 0x42, 0x0f, 0xd0, + 0x00, 0xf0, 0xc6, 0xf9, 0xff, 0xf7, 0xef, 0xff, 0x62, 0x43, 0x24, 0x23, + 0x0a, 0x44, 0x58, 0x43, 0x17, 0x18, 0x38, 0x46, 0xff, 0xf7, 0x42, 0xfd, + 0x10, 0xb1, 0xb8, 0x68, 0x01, 0xf0, 0xec, 0xf8, 0x76, 0x1c, 0x08, 0x2e, + 0xe8, 0xd3, 0xf1, 0xbd, 0x80, 0xb5, 0x00, 0x92, 0x0b, 0x46, 0x02, 0x46, + 0x1c, 0x21, 0xdf, 0xf8, 0x68, 0x05, 0xe9, 0xf7, 0xaf, 0xf9, 0x02, 0xbd, + 0x2d, 0xe9, 0xf0, 0x41, 0x80, 0x46, 0x24, 0x27, 0xd8, 0xf8, 0x04, 0x10, + 0xdf, 0xf8, 0xf0, 0x54, 0x4e, 0x6a, 0x30, 0x3e, 0x77, 0x43, 0x01, 0x24, + 0xe8, 0x59, 0x58, 0xb1, 0x09, 0x6a, 0xf0, 0xb2, 0x00, 0xf0, 0xb8, 0xf9, + 0xff, 0x28, 0x14, 0xd0, 0xe9, 0x19, 0xea, 0x59, 0x09, 0x6a, 0x04, 0xfa, + 0x00, 0xf0, 0x90, 0x47, 0xd8, 0xf8, 0x04, 0x20, 0xdf, 0xf8, 0xc0, 0x04, + 0x13, 0x6a, 0xc1, 0x68, 0x03, 0xeb, 0x86, 0x03, 0x9c, 0x40, 0x31, 0xea, + 0x04, 0x04, 0xc4, 0x60, 0x04, 0xbf, 0x01, 0x21, 0x01, 0x70, 0xbd, 0xe8, + 0xf0, 0x81, 0xdf, 0xf8, 0xa4, 0x04, 0x00, 0x78, 0x70, 0x47, 0x70, 0xb5, + 0x05, 0x46, 0x24, 0x26, 0x69, 0x68, 0xdf, 0xf8, 0x98, 0x34, 0x48, 0x6a, + 0xa0, 0xf1, 0x30, 0x02, 0xd2, 0xb2, 0x16, 0xfb, 0x02, 0xf6, 0x1e, 0x44, + 0x00, 0x24, 0x70, 0x68, 0x78, 0xb1, 0x09, 0x6a, 0x10, 0x46, 0x00, 0xf0, + 0x87, 0xf9, 0xff, 0x28, 0x07, 0xd0, 0x31, 0x6a, 0x73, 0x68, 0x01, 0x22, + 0x02, 0xfa, 0x00, 0xf0, 0x98, 0x47, 0x04, 0x46, 0x01, 0xe0, 0x4f, 0xf6, + 0x52, 0x74, 0xdf, 0xf8, 0xc4, 0x04, 0x01, 0x78, 0x01, 0x29, 0x10, 0xd1, + 0x40, 0x78, 0x0f, 0xf2, 0xc4, 0x42, 0x00, 0x28, 0x07, 0xbf, 0x4f, 0xf6, + 0x71, 0x74, 0x0f, 0xf2, 0xd4, 0x43, 0x00, 0x24, 0x0f, 0xf2, 0xc4, 0x43, + 0xff, 0x21, 0x03, 0x20, 0xdf, 0xf7, 0x9b, 0xfa, 0x02, 0xe0, 0xb4, 0xf1, + 0x00, 0x4f, 0x0b, 0xd0, 0x54, 0xb1, 0x28, 0x46, 0xff, 0xf7, 0x6f, 0xfc, + 0x28, 0x46, 0xff, 0xf7, 0x9a, 0xfc, 0x02, 0x22, 0x21, 0x46, 0x02, 0x20, + 0xec, 0xf7, 0x02, 0xfe, 0xdf, 0xf8, 0x7c, 0x14, 0x4f, 0xf0, 0x80, 0x50, + 0x08, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x70, 0xbd, + 0x2d, 0xe9, 0xf8, 0x4f, 0x80, 0x46, 0x01, 0x21, 0xd8, 0xf8, 0x04, 0x00, + 0xdf, 0xf8, 0x44, 0x74, 0x44, 0x6a, 0x00, 0x6a, 0x01, 0xfa, 0x00, 0xf0, + 0x30, 0x3c, 0x6f, 0xea, 0x00, 0x09, 0x90, 0x21, 0x24, 0x25, 0xdf, 0xf8, + 0x34, 0x04, 0x61, 0x43, 0x03, 0x2c, 0x00, 0xeb, 0x01, 0x0a, 0x21, 0xd0, + 0xff, 0x20, 0x38, 0x62, 0x00, 0x26, 0x00, 0xf0, 0x0f, 0xf9, 0xff, 0x28, + 0x07, 0xd0, 0x29, 0xfa, 0x00, 0xf1, 0xc9, 0x07, 0x03, 0xd5, 0x68, 0x43, + 0x50, 0x44, 0xff, 0xf7, 0x00, 0xfc, 0x76, 0x1c, 0x08, 0x2e, 0xf0, 0xd3, + 0x00, 0x26, 0x00, 0xf0, 0xff, 0xf8, 0xff, 0x28, 0x07, 0xd0, 0x29, 0xfa, + 0x00, 0xf1, 0xc9, 0x07, 0x03, 0xd5, 0x68, 0x43, 0x50, 0x44, 0xff, 0xf7, + 0x60, 0xfc, 0x76, 0x1c, 0x08, 0x2e, 0xf0, 0xd3, 0xdf, 0xf8, 0x8c, 0x13, + 0x05, 0xfb, 0x04, 0xf2, 0x8e, 0x18, 0xb0, 0x68, 0x40, 0xb1, 0x33, 0x6a, + 0xfa, 0x6a, 0x79, 0x8d, 0x38, 0x8d, 0xd6, 0xf8, 0x08, 0xc0, 0xe0, 0x47, + 0x06, 0x46, 0x01, 0xe0, 0x4f, 0xf6, 0x28, 0x76, 0x03, 0x2c, 0x13, 0xd0, + 0x4f, 0xf0, 0x00, 0x0b, 0x59, 0x46, 0x00, 0xf0, 0xda, 0xf8, 0xff, 0x28, + 0x07, 0xd0, 0x29, 0xfa, 0x00, 0xf1, 0xc9, 0x07, 0x03, 0xd5, 0x68, 0x43, + 0x50, 0x44, 0xff, 0xf7, 0xe2, 0xfb, 0x0b, 0xf1, 0x01, 0x0b, 0xbb, 0xf1, + 0x08, 0x0f, 0xed, 0xd3, 0x79, 0x6a, 0xd8, 0xf8, 0x04, 0x00, 0x42, 0x6a, + 0x33, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, 0x02, 0x20, 0xfb, 0xf7, + 0x75, 0xbd, 0x38, 0xb5, 0x0c, 0x46, 0x11, 0x46, 0x1a, 0x46, 0x30, 0x38, + 0x24, 0x23, 0xdf, 0xf8, 0x1c, 0x53, 0x58, 0x43, 0x05, 0x44, 0xe8, 0x68, + 0x20, 0xb1, 0x20, 0x46, 0x2b, 0x6a, 0xec, 0x68, 0xa0, 0x47, 0x32, 0xbd, + 0x4f, 0xf6, 0x29, 0x70, 0x32, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x04, 0x46, + 0x84, 0xb0, 0x60, 0x68, 0x41, 0x6a, 0xa1, 0xf1, 0x30, 0x00, 0x00, 0x26, + 0x5f, 0xfa, 0x80, 0xf8, 0x03, 0x96, 0xf9, 0xf7, 0xff, 0xfa, 0xc0, 0x04, + 0x06, 0xd5, 0xde, 0xf7, 0x34, 0xf9, 0x00, 0x28, 0x14, 0xbf, 0x02, 0x27, + 0x00, 0x27, 0x05, 0xe0, 0xde, 0xf7, 0x2d, 0xf9, 0x00, 0x28, 0x0c, 0xbf, + 0x06, 0x27, 0x07, 0x27, 0x3a, 0x46, 0x18, 0x20, 0xdf, 0xf8, 0x18, 0x13, + 0x42, 0x43, 0x4f, 0xf0, 0x24, 0x0c, 0x8d, 0x18, 0xad, 0x4a, 0x1c, 0xfb, + 0x08, 0xfc, 0xff, 0x23, 0x02, 0xeb, 0x0c, 0x09, 0x6b, 0x60, 0x01, 0xf1, + 0xc0, 0x0a, 0xd9, 0xf8, 0x14, 0x00, 0xf8, 0xb1, 0x60, 0x68, 0x01, 0x6a, + 0x40, 0x46, 0x00, 0xf0, 0x95, 0xf8, 0x06, 0x46, 0xff, 0x2e, 0x15, 0xd0, + 0xb5, 0xf8, 0x10, 0xb0, 0xa9, 0x68, 0x5a, 0x46, 0x50, 0x46, 0xd0, 0xf7, + 0x7b, 0xfc, 0xd9, 0xf8, 0x20, 0x00, 0x00, 0xf0, 0x61, 0xf8, 0x01, 0x20, + 0x00, 0x92, 0xb0, 0x40, 0x29, 0x68, 0xd9, 0xf8, 0x14, 0x60, 0x5b, 0x46, + 0x52, 0x46, 0xb0, 0x47, 0x06, 0x46, 0x01, 0xe0, 0x4f, 0xf6, 0x52, 0x76, + 0xb8, 0xf1, 0x03, 0x0f, 0x06, 0xd1, 0x01, 0x20, 0x00, 0xf0, 0x1a, 0xfe, + 0xc0, 0xf1, 0x01, 0x00, 0xc0, 0xb2, 0x50, 0xb1, 0x03, 0x98, 0x01, 0x90, + 0xcd, 0xf8, 0x00, 0xa0, 0x33, 0x46, 0x61, 0x68, 0x4a, 0x6a, 0xe9, 0x68, + 0x38, 0x46, 0xfb, 0xf7, 0x10, 0xfd, 0x13, 0xe1, 0x2d, 0xe9, 0xf8, 0x43, + 0x04, 0x46, 0x84, 0xb0, 0x60, 0x68, 0x46, 0x6a, 0x00, 0x25, 0x03, 0x95, + 0xde, 0xf7, 0xd5, 0xf8, 0x30, 0x3e, 0x00, 0x28, 0x0c, 0xbf, 0xa8, 0x46, + 0x4f, 0xf0, 0x02, 0x08, 0x18, 0x21, 0x9b, 0x48, 0x83, 0x4b, 0x11, 0xfb, + 0x08, 0xf1, 0x47, 0x18, 0x24, 0x21, 0x4e, 0x43, 0xff, 0x22, 0x9e, 0x19, + 0x7a, 0x60, 0x00, 0xf1, 0xc0, 0x09, 0xb0, 0x69, 0x80, 0xb1, 0x3d, 0x8a, + 0xb9, 0x68, 0x2a, 0x46, 0x48, 0x46, 0xd0, 0xf7, 0x2f, 0xfc, 0x30, 0x6a, + 0x00, 0xf0, 0x16, 0xf8, 0x00, 0x92, 0x2b, 0x46, 0x39, 0x68, 0x78, 0x69, + 0xb5, 0x69, 0x4a, 0x46, 0xa8, 0x47, 0x05, 0x46, 0x03, 0x98, 0x01, 0x90, + 0xcd, 0xf8, 0x00, 0x90, 0x2b, 0x46, 0x61, 0x68, 0x4a, 0x6a, 0xf9, 0x68, + 0x40, 0x46, 0xfb, 0xf7, 0xf9, 0xfc, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x83, + 0x02, 0x90, 0x4f, 0xf4, 0x80, 0x71, 0x01, 0x91, 0x03, 0xaa, 0x70, 0x47, + 0x31, 0x46, 0xe0, 0xb2, 0x00, 0xe0, 0x00, 0x00, 0x80, 0xb5, 0xff, 0x22, + 0x06, 0x28, 0x15, 0xd8, 0xdf, 0xe8, 0x00, 0xf0, 0x04, 0x0c, 0x0c, 0x08, + 0x04, 0x0c, 0x10, 0x00, 0x08, 0x46, 0xdf, 0xf7, 0x45, 0xf8, 0x0a, 0xe0, + 0x08, 0x46, 0xdf, 0xf7, 0x56, 0xf8, 0x06, 0xe0, 0x08, 0x46, 0xdf, 0xf7, + 0x43, 0xf8, 0x02, 0xe0, 0x08, 0x46, 0xdf, 0xf7, 0x48, 0xf8, 0x02, 0x46, + 0x10, 0x46, 0x02, 0xbd, 0x80, 0xb5, 0xff, 0x22, 0x06, 0x28, 0x15, 0xd8, + 0xdf, 0xe8, 0x00, 0xf0, 0x04, 0x0c, 0x0c, 0x08, 0x04, 0x0c, 0x10, 0x00, + 0x08, 0x46, 0xdf, 0xf7, 0x47, 0xf8, 0x0a, 0xe0, 0x08, 0x46, 0xdf, 0xf7, + 0x55, 0xf8, 0x06, 0xe0, 0x08, 0x46, 0xdf, 0xf7, 0x45, 0xf8, 0x02, 0xe0, + 0x08, 0x46, 0xdf, 0xf7, 0x47, 0xf8, 0x02, 0x46, 0x10, 0x46, 0x02, 0xbd, + 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x00, 0xf0, 0x63, 0xff, 0x10, 0xb1, + 0x62, 0x48, 0x04, 0x70, 0x45, 0x70, 0x31, 0xbd, 0x2d, 0xe9, 0xfe, 0x4f, + 0x82, 0xb0, 0x04, 0x46, 0x0d, 0x46, 0xdd, 0xf8, 0x38, 0xb0, 0xdf, 0xf8, + 0x7c, 0x81, 0x20, 0x21, 0x40, 0x46, 0xe2, 0xf7, 0x87, 0xfd, 0x01, 0xa8, + 0x00, 0x90, 0x0d, 0xf1, 0x05, 0x03, 0x0d, 0xf1, 0x06, 0x02, 0x20, 0x46, + 0x29, 0x46, 0xef, 0xf7, 0x25, 0xfe, 0x40, 0x46, 0xff, 0xf7, 0x5c, 0xfd, + 0x00, 0x26, 0x04, 0x46, 0x00, 0x25, 0x4f, 0xf0, 0x01, 0x09, 0x0c, 0xe0, + 0x01, 0x22, 0x50, 0x46, 0xff, 0xf7, 0xb4, 0xfc, 0x04, 0x00, 0x38, 0xd1, + 0x76, 0x1c, 0x7f, 0x1c, 0x08, 0x2f, 0x05, 0xd3, 0x34, 0xe0, 0x03, 0x28, + 0x32, 0xd0, 0x09, 0xfa, 0x05, 0xfa, 0x00, 0x27, 0x58, 0xf8, 0x27, 0x20, + 0x12, 0xea, 0x0a, 0x0f, 0x27, 0xd0, 0x9d, 0xf8, 0x06, 0x00, 0x00, 0x23, + 0x00, 0x28, 0x18, 0xbf, 0x1a, 0xf0, 0x11, 0x0f, 0x09, 0xfa, 0x07, 0xf1, + 0x03, 0xd0, 0x03, 0x98, 0x08, 0x42, 0x18, 0xbf, 0x01, 0x23, 0x9d, 0xf8, + 0x05, 0x00, 0x00, 0x28, 0x18, 0xbf, 0x1a, 0xf0, 0x26, 0x0f, 0x03, 0xd0, + 0x04, 0x98, 0x08, 0x42, 0x18, 0xbf, 0x01, 0x23, 0x9d, 0xf8, 0x04, 0x00, + 0x00, 0x28, 0x1c, 0xbf, 0x1a, 0xf0, 0x42, 0x0f, 0x1b, 0xea, 0x01, 0x0f, + 0xc8, 0xd1, 0x00, 0x2b, 0xc6, 0xd1, 0x22, 0xea, 0x0a, 0x02, 0x48, 0xf8, + 0x27, 0x20, 0x00, 0x2c, 0xc7, 0xd0, 0x1c, 0xb9, 0x6d, 0x1c, 0xe8, 0xb2, + 0x07, 0x28, 0xc6, 0xdb, 0x1e, 0xb3, 0x14, 0xbb, 0x00, 0x25, 0x01, 0xe0, + 0x03, 0x28, 0x1a, 0xd0, 0x00, 0x26, 0x58, 0xf8, 0x26, 0x00, 0xe8, 0x40, + 0xc1, 0x07, 0x10, 0xd5, 0x31, 0x46, 0xe8, 0xb2, 0xff, 0xf7, 0x4a, 0xff, + 0xff, 0x28, 0x0a, 0xd0, 0xea, 0xb2, 0x90, 0x23, 0x20, 0x49, 0x5a, 0x43, + 0x24, 0x24, 0x8b, 0x18, 0x60, 0x43, 0x18, 0x44, 0xff, 0xf7, 0xa5, 0xfa, + 0x04, 0x46, 0x34, 0xb9, 0x76, 0x1c, 0x08, 0x2e, 0xe5, 0xd3, 0x6d, 0x1c, + 0xe8, 0xb2, 0x07, 0x28, 0xde, 0xdb, 0x20, 0x46, 0x05, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0x00, 0x00, 0x10, 0x8b, 0x00, 0x21, 0xf4, 0x71, 0x04, 0x02, + 0x70, 0xb5, 0x00, 0x20, 0x00, 0x24, 0x18, 0x4d, 0x01, 0xe0, 0x03, 0x29, + 0x10, 0xd0, 0x00, 0x26, 0x55, 0xf8, 0x26, 0x10, 0xe1, 0x40, 0xcb, 0x07, + 0x07, 0xd5, 0x01, 0x20, 0x00, 0xfa, 0x06, 0xf1, 0x00, 0x22, 0xa0, 0x40, + 0xff, 0xf7, 0x32, 0xfc, 0x10, 0xb9, 0x76, 0x1c, 0x08, 0x2e, 0xef, 0xd3, + 0x64, 0x1c, 0xe1, 0xb2, 0x07, 0x29, 0xe8, 0xdb, 0x70, 0xbd, 0x00, 0x00, + 0x5c, 0x75, 0x02, 0x21, 0x58, 0x75, 0x02, 0x21, 0xf0, 0x74, 0x03, 0x21, + 0x47, 0xfa, 0x02, 0x02, 0x54, 0x6a, 0x02, 0x21, 0x20, 0x33, 0x02, 0x21, + 0xc0, 0x52, 0x02, 0x21, 0x80, 0x54, 0x02, 0x21, 0x20, 0x8b, 0x00, 0x21, + 0x3a, 0x76, 0x02, 0x21, 0x04, 0xed, 0x00, 0xe0, 0x34, 0x74, 0x02, 0x21, + 0x54, 0x72, 0x61, 0x63, 0x6b, 0x3a, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x20, 0x25, 0x73, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x50, 0x41, 0x53, 0x53, + 0x00, 0x00, 0x00, 0x00, 0x46, 0x41, 0x49, 0x4c, 0x00, 0x00, 0x00, 0x00, + 0xc9, 0x02, 0x03, 0x02, 0x27, 0x03, 0x03, 0x02, 0xc5, 0x03, 0x03, 0x02, + 0xc7, 0x04, 0x03, 0x02, 0x95, 0x05, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x2d, 0xe9, 0xf0, 0x47, 0x87, 0x4c, 0xdf, 0xf8, 0x20, 0xa2, 0x80, 0x46, + 0x89, 0x46, 0x00, 0x26, 0x04, 0xf1, 0xb0, 0x05, 0x28, 0xfa, 0x06, 0xf0, + 0xc0, 0x07, 0x25, 0xd5, 0x30, 0x46, 0xde, 0xf7, 0x1f, 0xff, 0x07, 0x46, + 0xff, 0x2f, 0x1f, 0xd0, 0x00, 0x20, 0x09, 0xf8, 0x07, 0x00, 0x29, 0x46, + 0x30, 0x46, 0x04, 0xf0, 0x21, 0xfa, 0x20, 0xb1, 0x01, 0x46, 0x03, 0x22, + 0x02, 0x20, 0xec, 0xf7, 0x7f, 0xfb, 0x0c, 0x21, 0x4f, 0xf4, 0x58, 0x72, + 0x78, 0x48, 0x79, 0x43, 0x7a, 0x43, 0x08, 0x44, 0x2c, 0x21, 0x4a, 0x44, + 0x4f, 0x43, 0x13, 0x1d, 0xe1, 0x19, 0x05, 0x60, 0x43, 0x60, 0x81, 0x60, + 0xda, 0xf8, 0x00, 0x20, 0x42, 0xf8, 0x26, 0x00, 0x76, 0x1c, 0x08, 0x2e, + 0xd2, 0xd3, 0xbd, 0xe8, 0xf0, 0x87, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, + 0x02, 0x8b, 0x82, 0xb0, 0x00, 0x24, 0x00, 0x27, 0xb2, 0xee, 0x04, 0x8a, + 0xdf, 0xf8, 0x9c, 0x91, 0x00, 0x90, 0x8a, 0x46, 0x00, 0x98, 0xf8, 0x40, + 0xc1, 0x07, 0x57, 0xd5, 0x38, 0x46, 0xde, 0xf7, 0xe3, 0xfe, 0x05, 0x46, + 0x2c, 0x20, 0x68, 0x43, 0x09, 0xeb, 0x00, 0x08, 0x40, 0x46, 0xf9, 0xf7, + 0xcc, 0xf8, 0x4f, 0xf4, 0x58, 0x71, 0x69, 0x43, 0x0a, 0xeb, 0x01, 0x06, + 0x32, 0x1d, 0x09, 0xf1, 0xb0, 0x01, 0x38, 0x46, 0x04, 0xf0, 0xe1, 0xf9, + 0x04, 0x46, 0x21, 0x46, 0x40, 0x46, 0xf9, 0xf7, 0xc0, 0xf8, 0x00, 0x2c, + 0x3a, 0xd1, 0x01, 0x20, 0x0a, 0xf8, 0x05, 0x00, 0x35, 0x1d, 0x05, 0xf5, + 0x57, 0x76, 0x96, 0xf8, 0x00, 0xb0, 0x05, 0xeb, 0x8b, 0x00, 0x90, 0xed, + 0x07, 0x0a, 0xd0, 0xed, 0x47, 0x0a, 0x90, 0xed, 0x87, 0x1a, 0xc0, 0xee, + 0x80, 0x8a, 0x80, 0xee, 0x01, 0x0a, 0xd0, 0xf7, 0xab, 0xfb, 0x20, 0xee, + 0x08, 0x0a, 0x88, 0xed, 0x05, 0x0a, 0xb0, 0xee, 0x68, 0x0a, 0xd0, 0xf7, + 0xa3, 0xfb, 0x20, 0xee, 0x08, 0x0a, 0x88, 0xed, 0x06, 0x0a, 0x08, 0xf1, + 0x1c, 0x00, 0xdd, 0xf7, 0xa9, 0xfe, 0x05, 0xeb, 0x0b, 0x00, 0x90, 0xf8, + 0x1c, 0x03, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x88, 0xed, + 0x08, 0x0a, 0x08, 0xf1, 0x24, 0x00, 0xdd, 0xf7, 0xa0, 0xfe, 0x70, 0x78, + 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x88, 0xed, 0x0a, 0x0a, + 0x7f, 0x1c, 0x08, 0x2f, 0x01, 0xd2, 0x00, 0x2c, 0x9e, 0xd0, 0x02, 0xb0, + 0x20, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, 0x80, 0xb5, + 0x00, 0xf0, 0x09, 0xf8, 0xe8, 0xf7, 0x3b, 0xfe, 0x02, 0xbd, 0x80, 0xb5, + 0x00, 0xf0, 0x03, 0xf8, 0xe8, 0xf7, 0x20, 0xfe, 0x02, 0xbd, 0x00, 0x92, + 0x0b, 0x46, 0x02, 0x46, 0x20, 0x21, 0x2d, 0x48, 0x70, 0x47, 0xf8, 0xb5, + 0x0c, 0x46, 0x15, 0x46, 0x1f, 0x46, 0xf9, 0xf7, 0x73, 0xf8, 0xde, 0xf7, + 0x69, 0xfe, 0x00, 0x26, 0xff, 0x28, 0x1a, 0xd0, 0x2c, 0x21, 0x23, 0x4a, + 0x48, 0x43, 0x11, 0x18, 0x1f, 0xb1, 0x02, 0x2f, 0x0b, 0xd0, 0x0a, 0xd3, + 0x0b, 0xe0, 0x14, 0x27, 0x28, 0x68, 0xb8, 0x42, 0x0a, 0xd3, 0x3a, 0x46, + 0x20, 0x46, 0xd0, 0xf7, 0x09, 0xfa, 0x2f, 0x60, 0x09, 0xe0, 0x2c, 0x27, + 0xf4, 0xe7, 0x4f, 0xf6, 0x2a, 0x76, 0x04, 0xe0, 0x4f, 0xf6, 0x26, 0x76, + 0x01, 0xe0, 0x4f, 0xf6, 0x2b, 0x76, 0x30, 0x46, 0xf2, 0xbd, 0x70, 0xb5, + 0x04, 0x46, 0x0d, 0x46, 0x00, 0x26, 0x24, 0xfa, 0x06, 0xf0, 0xc0, 0x07, + 0x0a, 0xd5, 0x30, 0x46, 0xde, 0xf7, 0x3c, 0xfe, 0xff, 0x28, 0x05, 0xd0, + 0x00, 0xeb, 0x40, 0x00, 0x29, 0x18, 0x30, 0x46, 0x04, 0xf0, 0x58, 0xfa, + 0x76, 0x1c, 0x08, 0x2e, 0xed, 0xd3, 0x70, 0xbd, 0x38, 0xb5, 0x04, 0x46, + 0x00, 0x20, 0x00, 0x25, 0x24, 0xfa, 0x05, 0xf1, 0xca, 0x07, 0x04, 0xd5, + 0x07, 0x49, 0x28, 0x46, 0x04, 0xf0, 0x30, 0xf9, 0x10, 0xb9, 0x6d, 0x1c, + 0x08, 0x2d, 0xf3, 0xd3, 0x32, 0xbd, 0x00, 0x00, 0xb0, 0x47, 0x00, 0x21, + 0x88, 0x04, 0x00, 0x01, 0x08, 0x73, 0x02, 0x21, 0x60, 0x48, 0x00, 0x21, + 0xf8, 0xb5, 0x05, 0x46, 0x0e, 0x46, 0x00, 0x24, 0x00, 0x27, 0x25, 0xfa, + 0x07, 0xf0, 0xc0, 0x07, 0x0c, 0xd5, 0x38, 0x46, 0xde, 0xf7, 0x0a, 0xfe, + 0xff, 0x28, 0x07, 0xd0, 0x00, 0xeb, 0x40, 0x00, 0x31, 0x18, 0x38, 0x46, + 0x04, 0xf0, 0x1e, 0xfa, 0x04, 0x00, 0x02, 0xd1, 0x7f, 0x1c, 0x08, 0x2f, + 0xeb, 0xd3, 0x20, 0x46, 0xf2, 0xbd, 0x00, 0x00, 0xd2, 0xb2, 0x20, 0x3a, + 0x22, 0xbf, 0x00, 0xfa, 0x02, 0xf1, 0x00, 0x20, 0x70, 0x47, 0x52, 0x42, + 0xd0, 0x41, 0xd2, 0xf1, 0x20, 0x02, 0x91, 0x40, 0x41, 0x40, 0xd0, 0x40, + 0x90, 0x40, 0x41, 0x40, 0x70, 0x47, 0x00, 0x00, 0x2d, 0xe9, 0xfe, 0x4f, + 0x12, 0x20, 0xf1, 0xf7, 0x31, 0xfc, 0x04, 0x46, 0xdc, 0xf7, 0xbb, 0xff, + 0x00, 0x27, 0xdf, 0xf8, 0xa0, 0x16, 0xdf, 0xf8, 0xa0, 0x66, 0x88, 0x42, + 0x80, 0x41, 0xc0, 0x43, 0xc0, 0x0f, 0x8d, 0xf8, 0x08, 0x00, 0xb8, 0x46, + 0xdc, 0xf7, 0xad, 0xff, 0xdf, 0xf8, 0x8c, 0x16, 0x88, 0x42, 0x26, 0xbf, + 0x9d, 0xf8, 0x08, 0x00, 0x80, 0xf0, 0x01, 0x09, 0xb9, 0x46, 0xba, 0x46, + 0x00, 0x25, 0x00, 0x94, 0xe8, 0xb2, 0xde, 0xf7, 0x0f, 0xfe, 0x01, 0x28, + 0x0c, 0xbf, 0x01, 0x24, 0x00, 0x24, 0x28, 0x46, 0xde, 0xf7, 0xcb, 0xfd, + 0x00, 0x2c, 0x18, 0xbf, 0xff, 0x28, 0x32, 0xd0, 0xd0, 0x22, 0xdf, 0xf8, + 0x5c, 0x16, 0x42, 0x43, 0x8c, 0x18, 0x00, 0x23, 0x23, 0x61, 0xe9, 0xb2, + 0x21, 0x60, 0x60, 0x60, 0xa3, 0x62, 0x66, 0x61, 0x82, 0x46, 0x96, 0xf8, + 0x0e, 0xb0, 0x20, 0x46, 0xf1, 0xf7, 0x3b, 0xfe, 0xe0, 0x6a, 0xc1, 0x6b, + 0x48, 0x7d, 0x01, 0x28, 0x00, 0x98, 0x08, 0xbf, 0x4f, 0xf0, 0x01, 0x08, + 0x10, 0xb1, 0x58, 0xea, 0x0b, 0x00, 0x04, 0xd0, 0x02, 0x20, 0x01, 0x21, + 0x20, 0x67, 0x61, 0x67, 0x05, 0xe0, 0xdd, 0xf7, 0xd2, 0xfd, 0xc0, 0x1c, + 0x20, 0x67, 0x02, 0x20, 0x60, 0x67, 0x20, 0x46, 0xf1, 0xf7, 0x21, 0xfe, + 0xe0, 0x6a, 0xc1, 0x6b, 0x48, 0x7d, 0x01, 0x28, 0x08, 0xbf, 0x4f, 0xf0, + 0x01, 0x08, 0x28, 0x46, 0xf2, 0xf7, 0xaf, 0xf9, 0x00, 0xf0, 0x06, 0x00, + 0x02, 0x28, 0x14, 0xbf, 0x04, 0x28, 0x47, 0xf0, 0x01, 0x07, 0x6d, 0x1c, + 0x08, 0x2d, 0xb1, 0xd3, 0x00, 0x26, 0xf0, 0xb2, 0xde, 0xf7, 0xc0, 0xfd, + 0x01, 0x28, 0x0c, 0xbf, 0x01, 0x24, 0x00, 0x24, 0x30, 0x46, 0xde, 0xf7, + 0x7c, 0xfd, 0x00, 0x2c, 0x1a, 0xbf, 0xff, 0x28, 0x01, 0x21, 0x00, 0x21, + 0x9d, 0xf8, 0x08, 0x00, 0x00, 0x90, 0xcd, 0xf8, 0x04, 0x90, 0x43, 0x46, + 0xfa, 0xb2, 0x30, 0x46, 0xf1, 0xf7, 0x9c, 0xfe, 0x76, 0x1c, 0x08, 0x2e, + 0xe3, 0xd3, 0x50, 0x46, 0xf2, 0xf7, 0xe2, 0xf9, 0xbd, 0xe8, 0xfe, 0x4f, + 0x01, 0x20, 0xdc, 0xf7, 0xac, 0xbf, 0x2d, 0xe9, 0xf8, 0x4f, 0x01, 0x46, + 0xdf, 0xf8, 0x84, 0x05, 0x00, 0x7a, 0x00, 0x25, 0x84, 0xb0, 0xaa, 0x46, + 0x08, 0xb1, 0x05, 0x28, 0x01, 0xd3, 0x40, 0xf6, 0x03, 0x45, 0x00, 0x23, + 0x03, 0x91, 0x02, 0x90, 0x04, 0xe0, 0x0b, 0xfa, 0x03, 0xf1, 0x41, 0xea, + 0x0a, 0x0a, 0x5b, 0x1c, 0x83, 0x42, 0x4f, 0xf0, 0x01, 0x0b, 0xf6, 0xd3, + 0x00, 0x2d, 0x40, 0xf0, 0x8e, 0x80, 0x03, 0x9c, 0x1a, 0xea, 0x04, 0x04, + 0x00, 0xf0, 0x81, 0x80, 0xf1, 0xf7, 0xb8, 0xfd, 0xa1, 0x46, 0x4f, 0xf0, + 0x00, 0x08, 0x00, 0x26, 0x00, 0x24, 0x29, 0xfa, 0x06, 0xf0, 0xc0, 0x07, + 0x24, 0xd5, 0x30, 0x46, 0xde, 0xf7, 0x31, 0xfd, 0x07, 0x46, 0xf0, 0xb2, + 0xde, 0xf7, 0x6a, 0xfd, 0x01, 0x28, 0x1b, 0xd1, 0xff, 0x2f, 0x19, 0xd0, + 0xd0, 0x21, 0xdf, 0xf8, 0x20, 0x05, 0x4f, 0x43, 0xc5, 0x19, 0x00, 0x20, + 0xa8, 0x60, 0x28, 0x61, 0xe8, 0x60, 0xa8, 0x69, 0xf8, 0xf7, 0xff, 0xfe, + 0xa9, 0x69, 0x68, 0x6b, 0x14, 0x22, 0xd0, 0xf7, 0xbd, 0xf8, 0x28, 0x46, + 0xf1, 0xf7, 0x71, 0xff, 0x05, 0x00, 0x04, 0xbf, 0x0b, 0xfa, 0x06, 0xf0, + 0x40, 0xea, 0x08, 0x08, 0x04, 0xb9, 0x2c, 0x46, 0x76, 0x1c, 0x08, 0x2e, + 0xd1, 0xd3, 0x25, 0x46, 0x44, 0x46, 0x23, 0x46, 0x0f, 0xf2, 0xf4, 0x42, + 0x0c, 0x21, 0x03, 0x20, 0xde, 0xf7, 0xeb, 0xfd, 0x00, 0x2d, 0x40, 0xd1, + 0x00, 0x20, 0x01, 0x90, 0x4f, 0xf0, 0x07, 0x08, 0x81, 0x46, 0x24, 0xfa, + 0x00, 0xf1, 0xc9, 0x07, 0x05, 0xd5, 0x40, 0x45, 0x98, 0xbf, 0x80, 0x46, + 0x48, 0x45, 0x28, 0xbf, 0x81, 0x46, 0x40, 0x1c, 0x08, 0x28, 0xf2, 0xd3, + 0x2a, 0xe0, 0x24, 0xfa, 0x06, 0xf0, 0xc0, 0x07, 0x23, 0xd5, 0x30, 0x46, + 0xde, 0xf7, 0xe5, 0xfc, 0xd0, 0x22, 0xdf, 0xf8, 0x98, 0x14, 0x50, 0x43, + 0x0f, 0x18, 0x01, 0xa9, 0x38, 0x46, 0xf1, 0xf7, 0x5f, 0xff, 0xa0, 0xb1, + 0x0b, 0xfa, 0x06, 0xf0, 0x84, 0x43, 0x01, 0x99, 0xb8, 0x69, 0xf8, 0xf7, + 0xba, 0xfe, 0xb9, 0x69, 0x78, 0x6b, 0x14, 0x22, 0xd0, 0xf7, 0x74, 0xf8, + 0x01, 0x98, 0xdf, 0xf8, 0x70, 0x24, 0x00, 0x90, 0x33, 0x46, 0x0c, 0x21, + 0x03, 0x20, 0xde, 0xf7, 0xb0, 0xfd, 0x05, 0xb9, 0x01, 0x9d, 0x76, 0x1c, + 0xb1, 0x45, 0x00, 0xd2, 0x46, 0x46, 0x00, 0x2c, 0xd1, 0xd1, 0x02, 0x98, + 0x0a, 0xfa, 0x00, 0xfa, 0x40, 0xf2, 0x01, 0x11, 0x8a, 0x45, 0xff, 0xf4, + 0x6f, 0xaf, 0x2b, 0x46, 0x0f, 0xf2, 0x60, 0x42, 0x0c, 0x21, 0x03, 0x20, + 0xde, 0xf7, 0x99, 0xfd, 0x28, 0x46, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x2d, 0xe9, 0xf8, 0x4f, 0x0f, 0xf2, 0x60, 0x42, 0x33, 0x21, 0x04, 0x20, + 0xde, 0xf7, 0x8d, 0xfd, 0x00, 0x24, 0x00, 0x27, 0x0f, 0xf2, 0x64, 0x48, + 0xdf, 0xf8, 0x04, 0xb4, 0xf8, 0xb2, 0xde, 0xf7, 0xd7, 0xfc, 0x01, 0x28, + 0x0c, 0xbf, 0x01, 0x25, 0x00, 0x25, 0x38, 0x46, 0xde, 0xf7, 0x93, 0xfc, + 0x81, 0x46, 0xb9, 0xf1, 0xff, 0x0f, 0x9b, 0xf8, 0x0c, 0x00, 0x14, 0xbf, + 0x4f, 0xf0, 0x01, 0x0a, 0x4f, 0xf0, 0x00, 0x0a, 0x01, 0x28, 0x0c, 0xbf, + 0x01, 0x26, 0x00, 0x26, 0xf8, 0xf7, 0x78, 0xfe, 0x40, 0x1e, 0x80, 0x41, + 0x86, 0xf0, 0x01, 0x01, 0x06, 0xea, 0xd0, 0x76, 0x0a, 0xea, 0x05, 0x05, + 0x0e, 0x43, 0x35, 0x42, 0x40, 0xd0, 0x3b, 0x46, 0x42, 0x46, 0x33, 0x21, + 0x04, 0x20, 0xde, 0xf7, 0x5c, 0xfd, 0xd0, 0x21, 0xdf, 0xf8, 0xb0, 0x03, + 0x01, 0xfb, 0x09, 0xf1, 0x45, 0x18, 0x00, 0x22, 0xe8, 0x69, 0x42, 0x60, + 0x14, 0x22, 0x68, 0x6b, 0xe9, 0x69, 0x00, 0xf5, 0x16, 0x76, 0x30, 0x46, + 0xd0, 0xf7, 0x16, 0xf8, 0xa8, 0x69, 0xc1, 0x68, 0x31, 0xb1, 0x00, 0x68, + 0x20, 0xb9, 0x28, 0x46, 0xf1, 0xf7, 0x40, 0xff, 0x2c, 0x69, 0x01, 0xe0, + 0x40, 0xf6, 0x0f, 0x44, 0xe8, 0x69, 0x21, 0x46, 0xf8, 0xf7, 0x37, 0xfe, + 0xe9, 0x69, 0x14, 0x22, 0x30, 0x46, 0xd0, 0xf7, 0x01, 0xf8, 0x84, 0xb1, + 0x40, 0xf6, 0x0b, 0x40, 0x84, 0x42, 0x1a, 0xbf, 0x40, 0xf6, 0x05, 0x41, + 0x8c, 0x42, 0x00, 0x24, 0x07, 0xd0, 0x00, 0x94, 0x3b, 0x46, 0x0f, 0xf2, + 0xbc, 0x32, 0x33, 0x21, 0x03, 0x20, 0xde, 0xf7, 0x24, 0xfd, 0x01, 0x20, + 0xed, 0xf7, 0xfc, 0xf8, 0x7f, 0x1c, 0x08, 0x2f, 0x96, 0xd3, 0x0f, 0xf2, + 0xc4, 0x32, 0x33, 0x21, 0x04, 0x20, 0xde, 0xf7, 0x18, 0xfd, 0x20, 0x46, + 0xbd, 0xe8, 0xf2, 0x8f, 0x3e, 0xb5, 0x06, 0x9d, 0x00, 0x95, 0x01, 0x24, + 0x03, 0xe0, 0x3e, 0xb5, 0x06, 0x9d, 0x00, 0x95, 0x00, 0x24, 0x01, 0x94, + 0x00, 0xf0, 0x01, 0xf8, 0x3e, 0xbd, 0x2d, 0xe9, 0xf0, 0x47, 0x89, 0x46, + 0x17, 0x46, 0x1c, 0x46, 0xf8, 0xf7, 0x10, 0xfe, 0x80, 0x46, 0xde, 0xf7, + 0x14, 0xfc, 0x05, 0x46, 0x5f, 0xfa, 0x88, 0xf0, 0xde, 0xf7, 0x4c, 0xfc, + 0x00, 0x26, 0x01, 0x28, 0x74, 0xd1, 0xff, 0x2d, 0x72, 0xd0, 0xd0, 0x20, + 0xb8, 0x49, 0x45, 0x43, 0x09, 0x98, 0x4d, 0x19, 0x1c, 0xb1, 0x02, 0x2c, + 0x32, 0xd0, 0x0e, 0xd3, 0x62, 0xe0, 0x00, 0x28, 0x0c, 0xbf, 0xe9, 0x69, + 0xa9, 0x69, 0x14, 0x24, 0x38, 0x68, 0xa0, 0x42, 0x5d, 0xd3, 0x48, 0x46, + 0x22, 0x46, 0xcf, 0xf7, 0x99, 0xff, 0x3c, 0x60, 0x5c, 0xe0, 0x28, 0x68, + 0x00, 0x22, 0x01, 0x21, 0xc0, 0xb2, 0x00, 0xf0, 0x21, 0xf9, 0x04, 0x46, + 0x04, 0xf1, 0x2c, 0x08, 0x28, 0x46, 0xd8, 0xf8, 0x00, 0xa0, 0xf1, 0xf7, + 0xf7, 0xff, 0x20, 0x46, 0xf1, 0xf7, 0xf4, 0xff, 0xa6, 0x4c, 0x95, 0xf8, + 0x46, 0x00, 0x20, 0x70, 0x4f, 0xf4, 0xb6, 0x72, 0x98, 0xf8, 0x1a, 0x10, + 0x61, 0x70, 0x20, 0x1d, 0xda, 0xf8, 0x30, 0x10, 0xcf, 0xf7, 0x88, 0xff, + 0x21, 0x46, 0x4f, 0xf4, 0xb8, 0x74, 0xd3, 0xe7, 0xe9, 0x6a, 0xc9, 0x6b, + 0x02, 0x00, 0x3a, 0x68, 0x12, 0xbf, 0x4f, 0xf4, 0x16, 0x74, 0x01, 0xf5, + 0x16, 0x71, 0x4f, 0xf4, 0x79, 0x74, 0x10, 0x3a, 0xa2, 0x42, 0xc5, 0xd2, + 0x97, 0x4b, 0x5d, 0x68, 0xa8, 0x45, 0x0a, 0xd1, 0xd3, 0xf8, 0x08, 0xc0, + 0xbc, 0xf1, 0x00, 0x0f, 0x18, 0xbf, 0x4f, 0xf0, 0x01, 0x0c, 0x5f, 0xfa, + 0x8c, 0xf5, 0xa8, 0x42, 0x00, 0xd0, 0x1e, 0x60, 0x1d, 0x68, 0x05, 0xfb, + 0x02, 0xfc, 0x6d, 0x1c, 0x1d, 0x60, 0x64, 0x45, 0xc3, 0xf8, 0x04, 0x80, + 0x98, 0x60, 0xab, 0xd3, 0xa4, 0xeb, 0x0c, 0x04, 0x94, 0x42, 0x88, 0xbf, + 0x14, 0x46, 0x94, 0x42, 0x61, 0x44, 0xa3, 0xd2, 0x1e, 0x60, 0xa1, 0xe7, + 0x4f, 0xf6, 0x2a, 0x76, 0x04, 0xe0, 0x4f, 0xf6, 0x26, 0x76, 0x01, 0xe0, + 0x4f, 0xf6, 0x2b, 0x76, 0x30, 0x46, 0xbd, 0xe8, 0xf0, 0x87, 0x1c, 0xb5, + 0x04, 0x04, 0x04, 0xd5, 0x00, 0xf0, 0x15, 0xf8, 0xe8, 0xf7, 0x39, 0xfb, + 0x16, 0xbd, 0x01, 0x24, 0x01, 0xe0, 0x1c, 0xb5, 0x00, 0x24, 0x00, 0x94, + 0xf1, 0xf7, 0xbc, 0xfd, 0x16, 0xbd, 0x1c, 0xb5, 0x04, 0x04, 0x04, 0xd5, + 0x00, 0xf0, 0x05, 0xf8, 0xe8, 0xf7, 0x14, 0xfb, 0x16, 0xbd, 0x01, 0x24, + 0x09, 0xe0, 0x00, 0x92, 0x0b, 0x46, 0xa0, 0xf5, 0x00, 0x42, 0x92, 0xb2, + 0x14, 0x21, 0x6b, 0x48, 0x70, 0x47, 0x1c, 0xb5, 0x00, 0x24, 0x00, 0x94, + 0xf1, 0xf7, 0xb2, 0xfd, 0x16, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x1e, 0x00, + 0x0c, 0x46, 0x4f, 0xf0, 0x00, 0x08, 0x32, 0xd0, 0x17, 0x46, 0x38, 0x78, + 0xde, 0xf7, 0x9c, 0xfb, 0x01, 0x28, 0x18, 0xd1, 0x38, 0x78, 0xde, 0xf7, + 0x5a, 0xfb, 0xff, 0x28, 0x53, 0xd0, 0xd0, 0x21, 0x5f, 0x4a, 0x0a, 0x9d, + 0x48, 0x43, 0x62, 0x49, 0x02, 0xeb, 0x00, 0x09, 0x08, 0x78, 0x02, 0x2c, + 0x4c, 0xd0, 0x6f, 0xd3, 0x04, 0x2c, 0x52, 0xd0, 0x6c, 0xd2, 0x78, 0x78, + 0x08, 0x28, 0x05, 0xdb, 0x40, 0xf6, 0x02, 0x48, 0x3f, 0xe0, 0x4f, 0xf6, + 0x2b, 0x78, 0x3c, 0xe0, 0x02, 0x2e, 0x0e, 0xd9, 0x38, 0x78, 0x08, 0x70, + 0x00, 0xf0, 0x61, 0xf8, 0xba, 0x78, 0x79, 0x78, 0x82, 0x46, 0xf1, 0xf7, + 0xe9, 0xfe, 0x04, 0x00, 0x1a, 0xd1, 0xda, 0xf8, 0x2c, 0x40, 0x04, 0x2e, + 0x02, 0xd2, 0x40, 0xf6, 0x03, 0x48, 0x28, 0xe0, 0x97, 0xf8, 0x03, 0xb0, + 0x50, 0x46, 0xf1, 0xf7, 0x43, 0xff, 0x36, 0x1f, 0xb0, 0x42, 0xf4, 0xd1, + 0x02, 0x46, 0xe0, 0x6a, 0x39, 0x1d, 0xcf, 0xf7, 0xc5, 0xfe, 0xbb, 0xf1, + 0x01, 0x0f, 0x18, 0xd1, 0x50, 0x46, 0xf1, 0xf7, 0xd3, 0xfe, 0x04, 0x46, + 0x9c, 0xb1, 0x48, 0x46, 0xf1, 0xf7, 0x4e, 0xfe, 0x5f, 0xea, 0x00, 0x08, + 0x0d, 0xd1, 0x64, 0xb1, 0xd9, 0xf8, 0x0c, 0x00, 0x04, 0x43, 0xc9, 0xf8, + 0x0c, 0x40, 0x48, 0x46, 0xf1, 0xf7, 0x42, 0xfe, 0x00, 0x90, 0x04, 0x20, + 0x28, 0x60, 0x00, 0x98, 0x38, 0x60, 0x40, 0x46, 0xbd, 0xe8, 0xf2, 0x8f, + 0x00, 0xf0, 0x25, 0xf8, 0x06, 0x46, 0xf1, 0xf7, 0xb5, 0xfe, 0x04, 0x00, + 0xf5, 0xd0, 0x30, 0x46, 0xe0, 0xe7, 0x00, 0x22, 0x00, 0xf0, 0x1c, 0xf8, + 0x04, 0x46, 0x48, 0x46, 0xf1, 0xf7, 0x04, 0xff, 0x20, 0x46, 0xf1, 0xf7, + 0x01, 0xff, 0x02, 0x20, 0x28, 0x60, 0x99, 0xf8, 0x46, 0x10, 0x8d, 0xf8, + 0x00, 0x10, 0x94, 0xf8, 0x46, 0x00, 0x9d, 0xf8, 0x00, 0x10, 0x8d, 0xf8, + 0x01, 0x00, 0x39, 0x70, 0x9d, 0xf8, 0x01, 0x10, 0x79, 0x70, 0xd8, 0xe7, + 0x4f, 0xf6, 0x27, 0x78, 0xd5, 0xe7, 0x01, 0x22, 0x01, 0x21, 0x0b, 0xe0, + 0x10, 0xb5, 0xde, 0xf7, 0xd4, 0xfa, 0x00, 0x24, 0xff, 0x28, 0x03, 0xd0, + 0xd0, 0x21, 0x1c, 0x4a, 0x48, 0x43, 0x14, 0x18, 0x20, 0x46, 0x10, 0xbd, + 0x2d, 0xe9, 0xf8, 0x43, 0x0e, 0x46, 0x90, 0x46, 0xff, 0xf7, 0xee, 0xff, + 0x04, 0x46, 0xd0, 0x20, 0x1a, 0x4d, 0x10, 0xfb, 0x06, 0xf0, 0x2f, 0x18, + 0xb8, 0xf1, 0x00, 0x0f, 0x4f, 0xf0, 0x00, 0x09, 0x0f, 0xd0, 0xd0, 0x22, + 0x21, 0x46, 0x38, 0x46, 0xcf, 0xf7, 0x5a, 0xfe, 0x58, 0x20, 0x46, 0x43, + 0xa8, 0x19, 0x00, 0xf5, 0xd0, 0x76, 0xe1, 0x6a, 0x58, 0x22, 0x30, 0x46, + 0xcf, 0xf7, 0x50, 0xfe, 0xfe, 0x62, 0x04, 0xb1, 0xb9, 0x46, 0x48, 0x46, + 0xbd, 0xe8, 0xf2, 0x83, 0x04, 0x49, 0x08, 0xb1, 0xc8, 0x7a, 0x70, 0x47, + 0x88, 0x7a, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x05, 0xd9, 0x01, + 0x8c, 0x57, 0x00, 0x21, 0x01, 0x36, 0x6e, 0x01, 0x50, 0x64, 0x03, 0x21, + 0x1c, 0x94, 0x04, 0x02, 0xe0, 0x6f, 0x03, 0x21, 0xa0, 0x57, 0x00, 0x21, + 0x43, 0x76, 0x02, 0x21, 0x90, 0x6d, 0x03, 0x21, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x3a, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x53, 0x65, 0x72, 0x64, 0x65, 0x73, 0x49, 0x6e, 0x69, 0x74, 0x3a, 0x20, + 0x65, 0x72, 0x72, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x00, + 0x53, 0x65, 0x72, 0x64, 0x65, 0x73, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x3a, + 0x20, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x0a, 0x00, 0x53, 0x65, 0x72, 0x64, + 0x65, 0x73, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x3a, 0x20, 0x6c, 0x61, 0x6e, + 0x65, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x72, 0x64, + 0x65, 0x73, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x3a, 0x20, 0x6c, 0x61, 0x6e, + 0x65, 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x30, 0x78, 0x25, + 0x78, 0x0a, 0x00, 0x00, 0x53, 0x65, 0x72, 0x64, 0x65, 0x73, 0x54, 0x72, + 0x61, 0x63, 0x6b, 0x3a, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x00, 0x00, 0x00, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x70, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x80, 0xb5, 0xdd, 0xf7, 0x3e, 0xfa, 0x30, 0xb1, + 0x00, 0x20, 0x00, 0x21, 0xa3, 0x4a, 0x11, 0x54, 0x40, 0x1c, 0x06, 0x28, + 0xfb, 0xd3, 0x0f, 0xf2, 0x1d, 0x21, 0xbd, 0xe8, 0x04, 0x40, 0x02, 0x20, + 0xe9, 0xf7, 0x35, 0xbf, 0x10, 0xb5, 0x01, 0x46, 0x9d, 0x48, 0x02, 0x68, + 0x01, 0x20, 0x0c, 0x23, 0x43, 0x43, 0xd4, 0x58, 0x8c, 0x42, 0x02, 0xd0, + 0x40, 0x1c, 0x09, 0x28, 0xf7, 0xd3, 0x10, 0xbd, 0xf8, 0xb5, 0x07, 0x46, + 0x0c, 0x46, 0x16, 0x46, 0x00, 0xf0, 0x4c, 0xf9, 0x00, 0x25, 0x60, 0xb1, + 0x93, 0x48, 0x01, 0x68, 0x0c, 0x22, 0x7a, 0x43, 0x88, 0x18, 0x09, 0x2f, + 0x05, 0xd2, 0x81, 0x68, 0x31, 0x42, 0x1e, 0xbf, 0x40, 0x68, 0x20, 0x42, + 0x01, 0x25, 0x28, 0x46, 0xf2, 0xbd, 0x70, 0xb5, 0x8b, 0x4b, 0x1c, 0x68, + 0x0c, 0x25, 0x45, 0x43, 0x66, 0x59, 0x0e, 0x60, 0x89, 0x49, 0x51, 0xf8, + 0x20, 0x00, 0x10, 0x60, 0x70, 0xbd, 0x87, 0x4a, 0x00, 0x21, 0x42, 0xf8, + 0x20, 0x10, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, 0xdf, 0xf8, 0x08, 0xa2, + 0x84, 0xb0, 0x81, 0x46, 0xda, 0xf8, 0x00, 0x50, 0xda, 0xf8, 0x04, 0x00, + 0x02, 0x90, 0x8b, 0x46, 0x14, 0x46, 0x00, 0xf0, 0x1b, 0xf9, 0x00, 0x28, + 0x4f, 0xf0, 0x00, 0x08, 0x14, 0xd0, 0xb9, 0xf1, 0x09, 0x0f, 0x28, 0xbf, + 0x4f, 0xf6, 0x64, 0x78, 0x80, 0xf0, 0x8f, 0x80, 0x0c, 0x21, 0x03, 0x94, + 0x01, 0xfb, 0x09, 0xf1, 0x01, 0x91, 0x6a, 0x18, 0x00, 0x92, 0x91, 0x68, + 0x03, 0x98, 0x01, 0x42, 0x1c, 0xbf, 0x51, 0x68, 0x11, 0xea, 0x0b, 0x0f, + 0x00, 0xf0, 0x7f, 0x80, 0x02, 0x98, 0x6d, 0x4e, 0x07, 0x68, 0xff, 0x43, + 0x3c, 0x46, 0x3d, 0x0a, 0xdd, 0xf7, 0xef, 0xf9, 0x3f, 0x0c, 0x00, 0x28, + 0xe3, 0xb2, 0x14, 0xd1, 0xff, 0x22, 0x00, 0x21, 0x69, 0x48, 0xff, 0xf7, + 0x6f, 0xff, 0xeb, 0xb2, 0xff, 0x22, 0x00, 0x21, 0x67, 0x48, 0xff, 0xf7, + 0x69, 0xff, 0xfb, 0xb2, 0xff, 0x22, 0x00, 0x21, 0x65, 0x48, 0xff, 0xf7, + 0x63, 0xff, 0x34, 0x46, 0x75, 0x1c, 0xb6, 0x1c, 0x13, 0xe0, 0xff, 0x22, + 0x00, 0x21, 0x62, 0x48, 0xff, 0xf7, 0x5a, 0xff, 0xeb, 0xb2, 0xff, 0x22, + 0x00, 0x21, 0x60, 0x48, 0xff, 0xf7, 0x54, 0xff, 0xfb, 0xb2, 0xff, 0x22, + 0x00, 0x21, 0x5e, 0x48, 0xff, 0xf7, 0x4e, 0xff, 0xf4, 0x1c, 0x35, 0x1d, + 0x76, 0x1d, 0x20, 0x78, 0x48, 0xb9, 0x84, 0xf8, 0x00, 0x90, 0x03, 0x98, + 0x00, 0xf0, 0x47, 0xf8, 0x28, 0x70, 0x58, 0x46, 0x00, 0xf0, 0x43, 0xf8, + 0x30, 0x70, 0x00, 0x20, 0x01, 0xf0, 0xc2, 0xf9, 0x10, 0xb1, 0x00, 0x20, + 0x01, 0xf0, 0xcc, 0xf9, 0x02, 0x99, 0x4b, 0x4f, 0x08, 0x68, 0x30, 0xb1, + 0x00, 0xf0, 0xdc, 0xfa, 0x00, 0xf0, 0x3a, 0xf8, 0x00, 0xf0, 0xc8, 0xfa, + 0x10, 0xe0, 0xda, 0xf8, 0x00, 0x00, 0x01, 0x99, 0x42, 0x58, 0x36, 0x2a, + 0x3a, 0xbf, 0x57, 0xf8, 0x29, 0x00, 0x4b, 0xea, 0x00, 0x00, 0xec, 0xf7, + 0x09, 0xfd, 0x47, 0xf8, 0x29, 0x00, 0x00, 0x20, 0xec, 0xf7, 0x70, 0xf9, + 0x00, 0x20, 0x01, 0xf0, 0x9f, 0xf9, 0x10, 0xb1, 0x00, 0x20, 0x01, 0xf0, + 0xe5, 0xf9, 0x20, 0x78, 0x28, 0xb1, 0x84, 0xf8, 0x00, 0x80, 0x85, 0xf8, + 0x00, 0x80, 0x86, 0xf8, 0x00, 0x80, 0x00, 0x98, 0x01, 0x68, 0x36, 0x29, + 0x3d, 0xbf, 0x57, 0xf8, 0x29, 0x00, 0x20, 0xea, 0x0b, 0x00, 0x47, 0xf8, + 0x29, 0x00, 0x47, 0xf8, 0x29, 0x80, 0x40, 0x46, 0x05, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0xb0, 0xfa, 0x80, 0xf0, 0xc0, 0xf1, 0x1f, 0x00, 0xc0, 0xb2, + 0x70, 0x47, 0x00, 0x00, 0x31, 0x48, 0x01, 0x68, 0x49, 0x1c, 0x01, 0x60, + 0x00, 0xbe, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x46, 0xe8, 0xf7, 0xa2, 0xfa, + 0x00, 0x28, 0x20, 0x46, 0x0b, 0xd0, 0xec, 0xf7, 0xcf, 0xf9, 0x60, 0xb1, + 0x2a, 0x49, 0x4f, 0xf0, 0x80, 0x50, 0x08, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, + 0xbf, 0xf3, 0x6f, 0x8f, 0x10, 0xbd, 0xbd, 0xe8, 0x10, 0x40, 0xec, 0xf7, + 0x8d, 0xb9, 0x10, 0xbd, 0x1f, 0xb5, 0x18, 0x21, 0x8d, 0xf8, 0x00, 0x10, + 0x00, 0x23, 0x8d, 0xf8, 0x01, 0x30, 0x0d, 0xf1, 0x01, 0x02, 0x69, 0x46, + 0x01, 0x20, 0x01, 0xf0, 0x3f, 0xf9, 0x1e, 0x49, 0x08, 0x78, 0x9d, 0xf8, + 0x00, 0x20, 0x01, 0x24, 0x90, 0x42, 0x1d, 0xd1, 0x02, 0xaa, 0x01, 0xa9, + 0x20, 0x46, 0xff, 0xf7, 0x04, 0xff, 0x01, 0x98, 0x13, 0x28, 0x05, 0xd2, + 0x02, 0x99, 0x01, 0xf0, 0xff, 0x01, 0xee, 0xf7, 0xfd, 0xfd, 0x09, 0xe0, + 0x36, 0x28, 0x04, 0xd2, 0x02, 0x99, 0xc9, 0xb2, 0xfe, 0xf7, 0xbb, 0xfe, + 0x02, 0xe0, 0x02, 0x98, 0xff, 0xf7, 0xbc, 0xff, 0x20, 0x46, 0xff, 0xf7, + 0xfa, 0xfe, 0x64, 0x1c, 0x09, 0x2c, 0xe1, 0xd3, 0x1f, 0xbd, 0x00, 0x00, + 0x0a, 0x02, 0x00, 0x47, 0x8c, 0x04, 0x00, 0x01, 0x90, 0x73, 0x02, 0x21, + 0x3d, 0x05, 0x00, 0x47, 0x3e, 0x05, 0x00, 0x47, 0x3f, 0x05, 0x00, 0x47, + 0x41, 0x05, 0x00, 0x47, 0x42, 0x05, 0x00, 0x47, 0x43, 0x05, 0x00, 0x47, + 0x24, 0x76, 0x02, 0x21, 0x04, 0xed, 0x00, 0xe0, 0xc4, 0x02, 0x00, 0x47, + 0x01, 0x46, 0x00, 0x20, 0x06, 0x4a, 0x91, 0x42, 0x03, 0xd1, 0x06, 0x4b, + 0x01, 0x21, 0x19, 0x60, 0x70, 0x47, 0x4f, 0xf6, 0x60, 0x70, 0x70, 0x47, + 0x02, 0x48, 0x00, 0x68, 0x70, 0x47, 0x00, 0x00, 0xdb, 0xd1, 0x0a, 0x00, + 0xa0, 0x03, 0x00, 0x02, 0xc9, 0xb2, 0x83, 0x07, 0x06, 0xd0, 0x52, 0x1e, + 0x22, 0xd3, 0x10, 0xf8, 0x01, 0x3b, 0x99, 0x42, 0xf7, 0xd1, 0x1f, 0xe0, + 0x08, 0x3a, 0x13, 0xd3, 0x02, 0xf1, 0x04, 0x02, 0x41, 0xea, 0x01, 0x21, + 0x41, 0xea, 0x01, 0x41, 0x50, 0xf8, 0x04, 0x3b, 0x12, 0x1f, 0x21, 0xbf, + 0x4b, 0x40, 0xa3, 0xf1, 0x01, 0x3c, 0x2c, 0xea, 0x03, 0x0c, 0x1c, 0xf0, + 0x80, 0x3f, 0xf3, 0xd0, 0xc9, 0xb2, 0x00, 0x1f, 0x08, 0x32, 0x10, 0xf8, + 0x01, 0x3b, 0x52, 0x1e, 0x28, 0xbf, 0x91, 0xea, 0x03, 0x0f, 0xf8, 0xd8, + 0x18, 0xbf, 0x01, 0x20, 0x40, 0x1e, 0x70, 0x47, 0x10, 0xee, 0x10, 0x0a, + 0xb5, 0xee, 0x40, 0x0a, 0x4f, 0xf0, 0x80, 0x7c, 0x1c, 0xeb, 0x40, 0x0f, + 0x42, 0xd2, 0xf1, 0xee, 0x10, 0xfa, 0xdf, 0xf8, 0xa4, 0xc0, 0xdc, 0xec, + 0x09, 0x0a, 0x45, 0xdd, 0x5f, 0xea, 0xd0, 0x5c, 0x2b, 0xd0, 0xac, 0xf1, + 0x7e, 0x0c, 0xa0, 0xeb, 0xcc, 0x50, 0x00, 0xee, 0x10, 0x0a, 0xb4, 0xee, + 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xbf, 0xac, 0xf1, 0x01, 0x0c, + 0x20, 0xee, 0x21, 0x0a, 0x00, 0xee, 0x90, 0xca, 0xf8, 0xee, 0xe0, 0x0a, + 0x70, 0xee, 0x41, 0x5a, 0x30, 0xee, 0x01, 0x6a, 0x85, 0xee, 0x86, 0x6a, + 0x66, 0xee, 0x06, 0x6a, 0x02, 0xee, 0xa6, 0x3a, 0x43, 0xee, 0x26, 0x3a, + 0xb0, 0xee, 0x65, 0x0a, 0x03, 0xee, 0xe6, 0x0a, 0x20, 0xee, 0x06, 0x6a, + 0x04, 0xee, 0xe0, 0x6a, 0x35, 0xee, 0xc6, 0x0a, 0x04, 0xee, 0x20, 0x0a, + 0x70, 0x47, 0x20, 0xee, 0x02, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x4f, 0xea, + 0xd0, 0x5c, 0xac, 0xf1, 0x7e, 0x0c, 0xa0, 0xeb, 0xcc, 0x50, 0xac, 0xf1, + 0x17, 0x0c, 0xca, 0xe7, 0x07, 0xd8, 0x00, 0x42, 0x44, 0xbf, 0x6f, 0xf0, + 0x00, 0x40, 0x00, 0xee, 0x10, 0x0a, 0xaf, 0xf3, 0x00, 0x80, 0x70, 0x47, + 0xf6, 0xdb, 0x6f, 0xf0, 0x00, 0x00, 0xc0, 0x05, 0x00, 0xee, 0x10, 0x0a, + 0x70, 0x47, 0x00, 0x00, 0x50, 0x90, 0x04, 0x02, 0x01, 0x00, 0x10, 0xee, + 0x10, 0x0a, 0xc0, 0xf3, 0xc7, 0x52, 0x0a, 0xd4, 0xd2, 0xb3, 0xff, 0x2a, + 0x37, 0xd0, 0x52, 0x18, 0xff, 0x2a, 0x4c, 0xd2, 0x00, 0xeb, 0xc1, 0x51, + 0x00, 0xee, 0x10, 0x1a, 0x70, 0x47, 0x49, 0x42, 0x32, 0xb3, 0xff, 0x2a, + 0x2b, 0xd0, 0x91, 0x42, 0x04, 0xd2, 0xa0, 0xeb, 0xc1, 0x51, 0x00, 0xee, + 0x10, 0x1a, 0x70, 0x47, 0x52, 0x1e, 0x89, 0x1a, 0xa0, 0xeb, 0xc2, 0x50, + 0x00, 0xee, 0x10, 0x0a, 0x19, 0x29, 0x18, 0xd8, 0xc1, 0xf1, 0x7f, 0x01, + 0xc9, 0x05, 0x00, 0xee, 0x90, 0x1a, 0xf1, 0xee, 0x10, 0x1a, 0x21, 0xf0, + 0x1f, 0x00, 0x20, 0xf4, 0xf8, 0x50, 0xe1, 0xee, 0x10, 0x0a, 0x20, 0xee, + 0x20, 0x0a, 0xf1, 0xee, 0x10, 0x0a, 0xe1, 0xee, 0x10, 0x1a, 0x00, 0x09, + 0x25, 0xd2, 0x70, 0x47, 0xc0, 0x42, 0xe5, 0xd1, 0x70, 0x47, 0x00, 0xf0, + 0x00, 0x40, 0x00, 0xee, 0x10, 0x0a, 0x70, 0x47, 0xc0, 0x42, 0xfc, 0xd0, + 0x7f, 0x29, 0x06, 0xd8, 0x7f, 0x31, 0xc9, 0x05, 0x00, 0xee, 0x90, 0x1a, + 0x20, 0xee, 0x20, 0x0a, 0x70, 0x47, 0x4f, 0xf0, 0xfe, 0x40, 0x00, 0xee, + 0x90, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0x7f, 0x39, 0x10, 0xee, 0x10, 0x0a, + 0xc0, 0xf3, 0xc7, 0x52, 0xaf, 0xe7, 0xc1, 0x0d, 0x41, 0xf0, 0xff, 0x01, + 0xc9, 0x05, 0x00, 0xee, 0x10, 0x1a, 0xaf, 0xf3, 0x00, 0x80, 0x70, 0x47, + 0x70, 0xb5, 0xb6, 0xb0, 0x04, 0x46, 0x0a, 0xa9, 0x00, 0xf0, 0xd8, 0xf8, + 0x00, 0x28, 0x67, 0xd1, 0x20, 0x79, 0x01, 0x28, 0x05, 0xd1, 0xa1, 0x68, + 0x20, 0x68, 0xfc, 0xf7, 0x09, 0xf8, 0x05, 0x46, 0x00, 0xe0, 0x00, 0x25, + 0x0c, 0xa8, 0x09, 0x90, 0x0a, 0x21, 0x00, 0x22, 0x03, 0x23, 0x08, 0x91, + 0x07, 0x92, 0x06, 0x93, 0x4f, 0xf4, 0x80, 0x73, 0x20, 0x69, 0x05, 0x90, + 0x04, 0x92, 0x01, 0x20, 0x03, 0x92, 0x02, 0x93, 0x01, 0x90, 0x00, 0x92, + 0xb7, 0xee, 0x00, 0x1a, 0x20, 0x68, 0xd4, 0xed, 0x05, 0x0a, 0x9f, 0xed, + 0x24, 0x0a, 0x00, 0x23, 0x01, 0x21, 0xfc, 0xf7, 0x6b, 0xf8, 0x14, 0xa8, + 0x00, 0x21, 0x02, 0x90, 0x01, 0x95, 0x00, 0x91, 0xbd, 0xf8, 0x28, 0x30, + 0x22, 0x7e, 0x21, 0x79, 0x20, 0x68, 0xfb, 0xf7, 0x33, 0xff, 0x1c, 0xa8, + 0x07, 0x90, 0x00, 0x21, 0x01, 0x20, 0x01, 0x22, 0x06, 0x91, 0x05, 0x91, + 0x04, 0x91, 0x03, 0x90, 0x02, 0x91, 0x01, 0x92, 0x00, 0x90, 0x14, 0xa9, + 0xa3, 0x68, 0x20, 0x68, 0xfb, 0xf7, 0x3b, 0xff, 0x01, 0x25, 0x00, 0x26, + 0xe9, 0xb2, 0x18, 0x22, 0x1c, 0xa8, 0x51, 0x43, 0x42, 0x18, 0x00, 0x23, + 0x01, 0x21, 0x07, 0x92, 0x06, 0x93, 0x05, 0x96, 0x04, 0x93, 0x03, 0x91, + 0x02, 0x93, 0x01, 0x93, 0x00, 0x93, 0x01, 0x22, 0x20, 0x68, 0x14, 0xa9, + 0xfb, 0xf7, 0x25, 0xff, 0x6d, 0x1c, 0xe8, 0xb2, 0x04, 0x28, 0xe7, 0xdb, + 0x20, 0x68, 0x0c, 0xa9, 0xc0, 0x46, 0xc0, 0x46, 0x20, 0x68, 0x00, 0x23, + 0x0c, 0xaa, 0x02, 0x21, 0xfc, 0xf7, 0xe1, 0xfc, 0x36, 0xb0, 0x70, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x0a, 0x46, 0x02, 0x21, 0xfc, 0xf7, 0x2e, 0xbf, + 0xf8, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x07, 0x46, 0x88, 0xb0, 0x0c, 0x46, + 0x38, 0x68, 0x02, 0x21, 0xfc, 0xf7, 0xbf, 0xff, 0x05, 0x46, 0x4f, 0xf4, + 0x80, 0x72, 0x29, 0x46, 0x01, 0x20, 0xfc, 0xf7, 0x90, 0xf8, 0x06, 0x46, + 0x02, 0xa9, 0x38, 0x46, 0x00, 0xf0, 0x50, 0xf8, 0xbd, 0xf8, 0x08, 0x20, + 0x39, 0x79, 0x38, 0x68, 0xfb, 0xf7, 0x93, 0xfe, 0xa0, 0x60, 0x29, 0x46, + 0x01, 0x20, 0xfc, 0xf7, 0xa2, 0xf8, 0x20, 0x60, 0xb8, 0x68, 0x60, 0x60, + 0x22, 0x68, 0xbd, 0xf8, 0x08, 0x10, 0x38, 0x7e, 0xfc, 0xf7, 0x28, 0xfa, + 0x22, 0x68, 0xbd, 0xf8, 0x08, 0x10, 0x38, 0x7e, 0xb0, 0xee, 0x40, 0x8a, + 0xfc, 0xf7, 0x54, 0xfa, 0xf0, 0xee, 0x40, 0x8a, 0x00, 0x22, 0x29, 0x46, + 0x01, 0x20, 0xfc, 0xf7, 0x8e, 0xf8, 0xb0, 0xee, 0x48, 0x0a, 0xfc, 0xf7, + 0x19, 0xf9, 0x84, 0xed, 0x03, 0x0a, 0x04, 0xa8, 0x06, 0xa9, 0x01, 0x90, + 0x00, 0x91, 0x01, 0x23, 0x00, 0x22, 0x29, 0x46, 0x01, 0x20, 0xfc, 0xf7, + 0x93, 0xf8, 0xdd, 0xe9, 0x06, 0x01, 0xb0, 0xee, 0x68, 0x0a, 0xfc, 0xf7, + 0x07, 0xf9, 0x84, 0xed, 0x05, 0x0a, 0xdd, 0xe9, 0x04, 0x01, 0xb0, 0xee, + 0x68, 0x0a, 0xfc, 0xf7, 0xff, 0xf8, 0xd4, 0xed, 0x05, 0x0a, 0x84, 0xed, + 0x06, 0x0a, 0x60, 0xee, 0xa0, 0x0a, 0x40, 0xee, 0x00, 0x0a, 0xc4, 0xed, + 0x04, 0x0a, 0x08, 0xb0, 0x30, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xf2, 0xbd, + 0xe0, 0xb5, 0x01, 0x91, 0xc1, 0x68, 0x00, 0x91, 0x03, 0x7e, 0x02, 0x79, + 0x00, 0x68, 0x01, 0x21, 0xfb, 0xf7, 0xda, 0xfd, 0x0e, 0xbd, 0x00, 0x00, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x38, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x08, 0xee, + 0x10, 0x0a, 0x08, 0xee, 0x90, 0x1a, 0x00, 0xf0, 0x5f, 0xf8, 0xb8, 0xee, + 0x68, 0x0a, 0xdf, 0xed, 0x17, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0xbb, 0xee, + 0xed, 0x8a, 0x04, 0x46, 0x20, 0xee, 0x08, 0x0a, 0x03, 0xf0, 0x10, 0xfc, + 0x05, 0x46, 0x00, 0xf0, 0x23, 0xf8, 0x24, 0x20, 0xe7, 0xf7, 0x38, 0xff, + 0x2b, 0x46, 0x4f, 0xf0, 0xff, 0x32, 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, + 0xcf, 0xff, 0x00, 0x21, 0x24, 0x20, 0xe7, 0xf7, 0x98, 0xff, 0xbd, 0xec, + 0x02, 0x8b, 0xbd, 0xe8, 0x31, 0x40, 0x00, 0xbf, 0x80, 0xb5, 0x00, 0xf0, + 0x39, 0xf8, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x00, 0x1d, 0xff, 0xf7, + 0xbd, 0xff, 0xbd, 0xe8, 0x02, 0x40, 0x24, 0x20, 0xe7, 0xf7, 0x6b, 0xbf, + 0x00, 0x00, 0x7a, 0x44, 0x10, 0xb5, 0x00, 0xf0, 0x29, 0xf8, 0x04, 0x46, + 0x24, 0x20, 0xe7, 0xf7, 0x6d, 0xff, 0x20, 0x1d, 0xbd, 0xe8, 0x10, 0x40, + 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0xa7, 0xe7, 0x80, 0xb5, 0x00, 0xf0, + 0x1b, 0xf8, 0xef, 0xf3, 0x10, 0x81, 0x72, 0xb6, 0x50, 0xf8, 0x04, 0x2f, + 0x42, 0xf0, 0x02, 0x03, 0x03, 0x60, 0x22, 0xf0, 0x02, 0x02, 0x02, 0x60, + 0x81, 0xf3, 0x10, 0x88, 0x01, 0xbd, 0x80, 0xb5, 0x03, 0x22, 0x4f, 0xf6, + 0x62, 0x71, 0x01, 0x20, 0xeb, 0xf7, 0xd8, 0xfa, 0xbd, 0xe8, 0x02, 0x40, + 0x00, 0x20, 0xfa, 0xf7, 0x99, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0xdc, 0xf7, + 0x9e, 0xfe, 0x00, 0xbf, 0x01, 0xa1, 0x51, 0xf8, 0x20, 0x00, 0x02, 0xbd, + 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x44, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, 0x0d, 0xf8, 0x01, 0x70, + 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, + 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x70, 0x47, + 0x10, 0xb5, 0xdc, 0xf7, 0x78, 0xfe, 0xdf, 0xf8, 0x8c, 0x46, 0x58, 0xb9, + 0x4f, 0xf0, 0x00, 0x50, 0xe0, 0x60, 0x4f, 0xf0, 0x80, 0x70, 0xdf, 0xf8, + 0x80, 0x16, 0x61, 0x61, 0x20, 0x61, 0xdf, 0xf8, 0x7c, 0x16, 0x0a, 0xe0, + 0x4f, 0xf0, 0x04, 0x50, 0xe0, 0x60, 0x4f, 0xf0, 0x00, 0x70, 0xdf, 0xf8, + 0x70, 0x16, 0x61, 0x61, 0x20, 0x61, 0xdf, 0xf8, 0x6c, 0x16, 0xa1, 0x61, + 0x10, 0xbd, 0x70, 0xb5, 0xdc, 0xf7, 0x59, 0xfe, 0x04, 0x46, 0xdf, 0xf8, + 0x60, 0x06, 0x50, 0xf8, 0x24, 0x50, 0xff, 0xf7, 0xd7, 0xff, 0x6c, 0xb1, + 0x00, 0x24, 0xdf, 0xf8, 0x54, 0x66, 0x06, 0xeb, 0xc4, 0x01, 0x56, 0xf8, + 0x34, 0x00, 0x4a, 0x68, 0x01, 0x46, 0xcf, 0xf7, 0xbb, 0xf9, 0x64, 0x1c, + 0x14, 0x2c, 0xf4, 0xd3, 0xdf, 0xf8, 0x20, 0x46, 0xe1, 0x68, 0x62, 0x69, + 0x52, 0x1a, 0x08, 0x46, 0xcf, 0xf7, 0xb0, 0xf9, 0xdf, 0xf8, 0x2c, 0x36, + 0x4f, 0xf0, 0xff, 0x32, 0x00, 0x21, 0x28, 0x46, 0xff, 0xf7, 0xa7, 0xff, + 0x20, 0x69, 0xa2, 0x69, 0x12, 0x1a, 0x01, 0x46, 0xcf, 0xf7, 0xa2, 0xf9, + 0xbd, 0xe8, 0x70, 0x40, 0x0f, 0x21, 0xdf, 0xf8, 0x10, 0x06, 0xe1, 0xf7, + 0x65, 0xbb, 0x7c, 0xb5, 0xdc, 0xf7, 0x23, 0xfe, 0x04, 0x46, 0xff, 0xf7, + 0xa5, 0xff, 0xdf, 0xf8, 0xdc, 0x05, 0xc1, 0x68, 0x42, 0x69, 0x41, 0x60, + 0x82, 0x60, 0xa4, 0xb9, 0x0b, 0x24, 0xdf, 0xf8, 0xf0, 0x55, 0xdf, 0xf8, + 0xf0, 0x65, 0x68, 0x7a, 0xc0, 0x09, 0x02, 0xd0, 0x01, 0x23, 0x00, 0xf0, + 0xa3, 0xf9, 0x70, 0x79, 0xc0, 0x09, 0x01, 0xd0, 0x00, 0xf0, 0x0e, 0xf9, + 0x64, 0x1e, 0xf2, 0xd1, 0x00, 0xf0, 0xf8, 0xf8, 0x7c, 0xe0, 0x0b, 0x24, + 0xdf, 0xf8, 0xcc, 0x55, 0xdf, 0xf8, 0xcc, 0x65, 0x68, 0x7a, 0xc0, 0x09, + 0x02, 0xd0, 0x01, 0x23, 0x00, 0xf0, 0x8a, 0xf9, 0x70, 0x79, 0xc0, 0x09, + 0x01, 0xd0, 0x00, 0xf0, 0xf9, 0xf8, 0x64, 0x1e, 0xf2, 0xd1, 0x00, 0xf0, + 0xe3, 0xf8, 0x00, 0xf0, 0xe6, 0xf8, 0xdf, 0xf8, 0xac, 0x05, 0xdf, 0xf8, + 0xac, 0x45, 0xdf, 0xf8, 0x88, 0x55, 0xff, 0xf7, 0x5a, 0xff, 0x00, 0xf0, + 0xdc, 0xf8, 0xdf, 0xf8, 0xa0, 0x05, 0xff, 0xf7, 0x54, 0xff, 0x00, 0xf0, + 0xd6, 0xf8, 0xdf, 0xf8, 0x98, 0x05, 0xff, 0xf7, 0x4e, 0xff, 0x00, 0xf0, + 0xd0, 0xf8, 0xdf, 0xf8, 0x90, 0x05, 0xff, 0xf7, 0x48, 0xff, 0x00, 0xf0, + 0xca, 0xf8, 0xdf, 0xf8, 0x88, 0x05, 0xff, 0xf7, 0x42, 0xff, 0x00, 0xf0, + 0xc4, 0xf8, 0xdf, 0xf8, 0x80, 0x05, 0xff, 0xf7, 0x3c, 0xff, 0x00, 0xf0, + 0xbe, 0xf8, 0xdf, 0xf8, 0x78, 0x05, 0xff, 0xf7, 0x36, 0xff, 0x00, 0xf0, + 0xb8, 0xf8, 0xdf, 0xf8, 0x70, 0x05, 0xff, 0xf7, 0x30, 0xff, 0x00, 0xf0, + 0xba, 0xf8, 0x00, 0xf0, 0xb0, 0xf8, 0x00, 0xf0, 0xb9, 0xf8, 0x00, 0xf0, + 0xac, 0xf8, 0xdf, 0xf8, 0x5c, 0x05, 0xdf, 0xf8, 0x5c, 0x45, 0xff, 0xf7, + 0x22, 0xff, 0x00, 0xf0, 0xac, 0xf8, 0x00, 0xf0, 0xa2, 0xf8, 0x00, 0xf0, + 0xab, 0xf8, 0x01, 0x23, 0x02, 0x22, 0x01, 0x21, 0xdf, 0xf8, 0x44, 0x05, + 0xff, 0xf7, 0x0c, 0xff, 0x02, 0x24, 0x55, 0xf8, 0x34, 0x60, 0x00, 0x23, + 0x4f, 0xf4, 0x80, 0x72, 0x08, 0x21, 0x00, 0xf0, 0x96, 0xf8, 0x01, 0x23, + 0x00, 0xf0, 0x91, 0xf8, 0x00, 0x23, 0x00, 0xf0, 0x8e, 0xf8, 0x01, 0x23, + 0x4f, 0xf4, 0x80, 0x52, 0x0c, 0x21, 0x06, 0xf1, 0x08, 0x00, 0xff, 0xf7, + 0xfe, 0xfe, 0x64, 0x1c, 0x14, 0x2c, 0xe6, 0xd3, 0xdc, 0xf7, 0x85, 0xfd, + 0x90, 0xb9, 0x01, 0x21, 0x25, 0x20, 0xe7, 0xf7, 0x36, 0xfe, 0x01, 0x21, + 0x26, 0x20, 0xe7, 0xf7, 0x32, 0xfe, 0x25, 0x20, 0xe7, 0xf7, 0xc4, 0xfd, + 0x26, 0x20, 0xe7, 0xf7, 0xc1, 0xfd, 0x25, 0x20, 0xe7, 0xf7, 0x0f, 0xfe, + 0x26, 0x20, 0x39, 0xe0, 0x01, 0x21, 0x27, 0x20, 0xe7, 0xf7, 0x23, 0xfe, + 0x01, 0x21, 0x28, 0x20, 0xe7, 0xf7, 0x1f, 0xfe, 0x27, 0x20, 0xe7, 0xf7, + 0xb1, 0xfd, 0x28, 0x20, 0xe7, 0xf7, 0xae, 0xfd, 0x27, 0x20, 0xe7, 0xf7, + 0xfc, 0xfd, 0x28, 0x20, 0xe7, 0xf7, 0xf9, 0xfd, 0x01, 0x21, 0x29, 0x20, + 0xe7, 0xf7, 0x0f, 0xfe, 0x01, 0x21, 0x2a, 0x20, 0xe7, 0xf7, 0x0b, 0xfe, + 0x01, 0x21, 0x2b, 0x20, 0xe7, 0xf7, 0x07, 0xfe, 0x01, 0x21, 0x2c, 0x20, + 0xe7, 0xf7, 0x03, 0xfe, 0x29, 0x20, 0xe7, 0xf7, 0x95, 0xfd, 0x2a, 0x20, + 0xe7, 0xf7, 0x92, 0xfd, 0x2b, 0x20, 0xe7, 0xf7, 0x8f, 0xfd, 0x2c, 0x20, + 0xe7, 0xf7, 0x8c, 0xfd, 0x29, 0x20, 0xe7, 0xf7, 0xda, 0xfd, 0x2a, 0x20, + 0xe7, 0xf7, 0xd7, 0xfd, 0x2b, 0x20, 0xe7, 0xf7, 0xd4, 0xfd, 0x2c, 0x20, + 0xe7, 0xf7, 0xd1, 0xfd, 0xdf, 0xf8, 0x68, 0x44, 0x0f, 0xf2, 0x95, 0x11, + 0x00, 0x91, 0x04, 0xf1, 0x10, 0x00, 0x01, 0x90, 0x4f, 0xf4, 0x7a, 0x70, + 0xa1, 0x68, 0x41, 0x43, 0xb1, 0xfb, 0xf0, 0xf1, 0x00, 0x23, 0x01, 0x22, + 0x0f, 0xf2, 0x60, 0x40, 0xec, 0xf7, 0xf8, 0xf9, 0xe0, 0x60, 0x28, 0xb9, + 0x03, 0x22, 0x4f, 0xf6, 0x1e, 0x71, 0x01, 0x20, 0xeb, 0xf7, 0x4a, 0xf9, + 0xeb, 0xf7, 0x51, 0xfe, 0x00, 0x21, 0x00, 0x91, 0x02, 0x46, 0xe0, 0x68, + 0x00, 0x23, 0x01, 0x21, 0xec, 0xf7, 0xfe, 0xf9, 0x00, 0x20, 0x76, 0xbd, + 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, 0x30, 0x46, 0x72, 0xe6, 0x01, 0x23, + 0x01, 0x22, 0x00, 0x21, 0x70, 0x47, 0x01, 0x22, 0x00, 0x21, 0x30, 0x46, + 0x73, 0xe6, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, 0x20, 0x46, 0x6e, 0xe6, + 0x01, 0x23, 0x80, 0x22, 0x07, 0x21, 0x28, 0x46, 0x60, 0xe6, 0x00, 0x23, + 0x00, 0x22, 0x00, 0x21, 0x0f, 0xf2, 0x65, 0x10, 0xec, 0xf7, 0x3e, 0xbb, + 0x25, 0x20, 0x0c, 0xe0, 0x26, 0x20, 0x0a, 0xe0, 0x27, 0x20, 0x08, 0xe0, + 0x28, 0x20, 0x06, 0xe0, 0x29, 0x20, 0x04, 0xe0, 0x2a, 0x20, 0x02, 0xe0, + 0x2b, 0x20, 0x00, 0xe0, 0x2c, 0x20, 0x2d, 0xe9, 0xfc, 0x41, 0x00, 0x27, + 0xdf, 0xf8, 0x74, 0x63, 0x8d, 0xf8, 0x00, 0x00, 0x00, 0x24, 0x25, 0x28, + 0xa0, 0x46, 0xb0, 0x73, 0xdf, 0xf8, 0x6c, 0x53, 0x08, 0xd0, 0x26, 0x28, + 0x0b, 0xd0, 0x27, 0x28, 0x19, 0xd0, 0x28, 0x28, 0x1c, 0xd0, 0x2b, 0x28, + 0x2c, 0xd0, 0x3d, 0xe0, 0x00, 0x23, 0x00, 0xf0, 0x5b, 0xf8, 0x25, 0x20, + 0x23, 0xe0, 0x2c, 0x78, 0xdf, 0xf8, 0x44, 0x03, 0x00, 0xf0, 0x4c, 0xf8, + 0xa4, 0x09, 0x20, 0x00, 0x05, 0xd0, 0x00, 0x23, 0xc0, 0x22, 0x06, 0x21, + 0xff, 0xf7, 0xbf, 0xff, 0x27, 0x46, 0x26, 0x20, 0x13, 0xe0, 0x00, 0x23, + 0x00, 0xf0, 0x42, 0xf8, 0x27, 0x20, 0x0e, 0xe0, 0xca, 0x4d, 0xc9, 0x48, + 0x2c, 0x78, 0x00, 0xf0, 0x37, 0xf8, 0xa4, 0x09, 0x20, 0x00, 0x05, 0xd0, + 0x00, 0x23, 0xc0, 0x22, 0x06, 0x21, 0xff, 0xf7, 0xaa, 0xff, 0x27, 0x46, + 0x28, 0x20, 0xe7, 0xf7, 0xe9, 0xfc, 0x11, 0xe0, 0xa9, 0x78, 0xea, 0x78, + 0xce, 0x48, 0xc9, 0x01, 0x41, 0xea, 0x52, 0x01, 0xd2, 0x03, 0x01, 0x40, + 0x02, 0xf4, 0x60, 0x32, 0x11, 0x43, 0xa1, 0xf5, 0x40, 0x21, 0xb1, 0xf5, + 0x00, 0x5f, 0x38, 0xbf, 0x4f, 0xf0, 0x01, 0x08, 0x58, 0xea, 0x07, 0x00, + 0x0e, 0xd1, 0x03, 0x22, 0x48, 0xf2, 0x01, 0x51, 0x01, 0x20, 0xeb, 0xf7, + 0xb3, 0xf8, 0x70, 0x68, 0x40, 0x1c, 0x70, 0x60, 0x44, 0xb9, 0xbd, 0xe8, + 0xf6, 0x41, 0x00, 0x20, 0xfa, 0xf7, 0x70, 0xbb, 0x38, 0x00, 0x1c, 0xbf, + 0xbf, 0x00, 0xb7, 0x73, 0xbd, 0xe8, 0xf3, 0x81, 0x00, 0x23, 0x80, 0x22, + 0x07, 0x21, 0xd9, 0xe5, 0x80, 0x22, 0x07, 0x21, 0xb8, 0x48, 0xd5, 0xe5, + 0x80, 0x22, 0x07, 0x21, 0xb7, 0x48, 0xd1, 0xe5, 0x2d, 0xe9, 0xff, 0x41, + 0x00, 0xf0, 0x82, 0xf8, 0x05, 0x46, 0xdc, 0xf7, 0x38, 0xfc, 0x00, 0xf0, + 0x83, 0xf8, 0x01, 0xd1, 0x00, 0xf0, 0x88, 0xf8, 0x00, 0xf0, 0x8e, 0xf8, + 0x02, 0xd1, 0x3b, 0x46, 0x00, 0xf0, 0x85, 0xf8, 0x9d, 0xf8, 0x00, 0x00, + 0x00, 0x28, 0x0f, 0xd0, 0x00, 0xf0, 0x45, 0xf8, 0x06, 0xd1, 0x01, 0x28, + 0xc4, 0xbf, 0x00, 0x21, 0x71, 0x70, 0x00, 0xf0, 0x31, 0xf8, 0x05, 0xe0, + 0x02, 0x28, 0x04, 0xbf, 0x03, 0x21, 0x71, 0x70, 0x00, 0xf0, 0x3d, 0xf8, + 0xbd, 0xe8, 0xff, 0x81, 0x2d, 0xe9, 0xff, 0x41, 0x00, 0xf0, 0x5a, 0xf8, + 0x05, 0x46, 0xdc, 0xf7, 0x10, 0xfc, 0x00, 0xf0, 0x5b, 0xf8, 0x01, 0xd1, + 0x00, 0xf0, 0x60, 0xf8, 0x00, 0xf0, 0x66, 0xf8, 0x02, 0xd1, 0x3b, 0x46, + 0x00, 0xf0, 0x5d, 0xf8, 0x9d, 0xf8, 0x00, 0x00, 0x00, 0x28, 0x0f, 0xd0, + 0x00, 0xf0, 0x1d, 0xf8, 0x06, 0xd1, 0x01, 0x28, 0xc4, 0xbf, 0x00, 0x21, + 0x71, 0x70, 0x00, 0xf0, 0x09, 0xf8, 0x05, 0xe0, 0x02, 0x28, 0x04, 0xbf, + 0x03, 0x21, 0x71, 0x70, 0x00, 0xf0, 0x15, 0xf8, 0xbd, 0xe8, 0xff, 0x81, + 0x05, 0xf1, 0x0c, 0x00, 0x71, 0x78, 0x50, 0xf8, 0x21, 0x00, 0x68, 0x60, + 0x05, 0xf1, 0x14, 0x01, 0x70, 0x78, 0x51, 0xf8, 0x20, 0x10, 0xa9, 0x60, + 0x70, 0x47, 0x70, 0x78, 0x40, 0x1c, 0x70, 0x70, 0x01, 0x2c, 0x70, 0x78, + 0x70, 0x47, 0x70, 0x78, 0x02, 0x28, 0x0f, 0xdd, 0x70, 0x78, 0xc0, 0x1e, + 0x14, 0x28, 0x09, 0xd2, 0x6b, 0x49, 0x51, 0xf8, 0x30, 0x20, 0x6a, 0x60, + 0x09, 0x1d, 0x51, 0xf8, 0x30, 0x00, 0x82, 0x18, 0xaa, 0x60, 0x01, 0xe0, + 0x00, 0x21, 0x71, 0x70, 0x70, 0x78, 0x01, 0x28, 0x0b, 0xdc, 0x05, 0xf1, + 0x0c, 0x01, 0x70, 0x78, 0x51, 0xf8, 0x20, 0x10, 0x69, 0x60, 0x05, 0xf1, + 0x14, 0x00, 0x71, 0x78, 0x50, 0xf8, 0x21, 0x00, 0xa8, 0x60, 0x70, 0x47, + 0x00, 0x21, 0x01, 0x91, 0x8d, 0xf8, 0x00, 0x10, 0xdc, 0xf7, 0xdb, 0xbb, + 0x04, 0x46, 0x59, 0x48, 0x6c, 0x4e, 0x50, 0xf8, 0x25, 0x80, 0x70, 0x78, + 0x01, 0x28, 0x70, 0x47, 0xd8, 0xf8, 0x00, 0x70, 0x56, 0x4b, 0x4f, 0xf0, + 0xff, 0x32, 0x00, 0x21, 0x40, 0x46, 0x3e, 0xe5, 0x01, 0x98, 0x69, 0x49, + 0x4b, 0x4d, 0x02, 0xe0, 0x01, 0x98, 0x40, 0x1c, 0x01, 0x90, 0x01, 0x98, + 0x72, 0x68, 0x90, 0x42, 0x17, 0xd2, 0x68, 0x68, 0x72, 0xb6, 0x0a, 0x68, + 0x52, 0x1c, 0x0a, 0x60, 0x03, 0x68, 0x02, 0x93, 0x02, 0x9a, 0x02, 0x60, + 0x08, 0x68, 0x40, 0x1e, 0x08, 0x60, 0x00, 0xd1, 0x62, 0xb6, 0x68, 0x68, + 0x02, 0x1d, 0x6a, 0x60, 0x10, 0x46, 0xaa, 0x68, 0x90, 0x42, 0xe3, 0xd3, + 0x01, 0x20, 0x8d, 0xf8, 0x00, 0x00, 0x70, 0x78, 0x01, 0x28, 0x70, 0x47, + 0x38, 0xb5, 0x00, 0x92, 0x0b, 0x46, 0x51, 0x4c, 0x02, 0x46, 0x08, 0x21, + 0x20, 0x1d, 0xe7, 0xf7, 0x1a, 0xfb, 0x05, 0x46, 0xa2, 0x68, 0x4f, 0xf4, + 0x7a, 0x70, 0x00, 0x21, 0x42, 0x43, 0x00, 0x91, 0xb2, 0xfb, 0xf0, 0xf2, + 0xe0, 0x68, 0x00, 0x23, 0x04, 0x21, 0xec, 0xf7, 0x7d, 0xf8, 0x28, 0x46, + 0x32, 0xbd, 0x80, 0xb5, 0x00, 0x92, 0x0b, 0x46, 0x02, 0x46, 0x08, 0x21, + 0x48, 0x48, 0xe7, 0xf7, 0xed, 0xfa, 0x02, 0xbd, 0x41, 0x49, 0x0a, 0x78, + 0x02, 0x70, 0x00, 0x20, 0x70, 0x47, 0x1c, 0xb5, 0x3e, 0x4c, 0x21, 0x78, + 0x02, 0x00, 0x0c, 0xd1, 0x01, 0x29, 0x19, 0xd1, 0x00, 0x20, 0x00, 0x90, + 0x00, 0x23, 0xe0, 0x68, 0x00, 0x22, 0x03, 0x21, 0xec, 0xf7, 0x5e, 0xf8, + 0x00, 0x21, 0x21, 0x70, 0x0e, 0xe0, 0x01, 0x28, 0x08, 0xbf, 0x00, 0x29, + 0x0a, 0xd1, 0x20, 0x70, 0xeb, 0xf7, 0x9f, 0xfc, 0x00, 0x21, 0x02, 0x46, + 0x00, 0x91, 0x00, 0x23, 0xe0, 0x68, 0x01, 0x21, 0xec, 0xf7, 0x4c, 0xf8, + 0x00, 0x20, 0x16, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, 0x06, 0x46, 0x0f, 0x46, + 0x90, 0x46, 0xdc, 0xf7, 0x54, 0xfb, 0x1d, 0x4d, 0x1a, 0x4c, 0x1e, 0xb1, + 0x02, 0x2e, 0x13, 0xd0, 0x05, 0xd3, 0x18, 0xe0, 0x08, 0xb9, 0x01, 0x23, + 0x03, 0xe0, 0x01, 0x23, 0x06, 0xe0, 0x20, 0xb9, 0x02, 0x23, 0xc0, 0x22, + 0x06, 0x21, 0x20, 0x46, 0x03, 0xe0, 0x02, 0x23, 0xc0, 0x22, 0x06, 0x21, + 0x28, 0x46, 0xbd, 0xe8, 0xf0, 0x41, 0xa5, 0xe4, 0x0f, 0x22, 0x0c, 0x49, + 0x40, 0x46, 0xce, 0xf7, 0xab, 0xfe, 0x0f, 0x20, 0x38, 0x60, 0xbd, 0xe8, + 0xf0, 0x81, 0x00, 0x00, 0x74, 0x74, 0x02, 0x21, 0x00, 0x00, 0x04, 0x20, + 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x04, 0x21, 0x00, 0x00, 0x05, 0x02, + 0x98, 0x9e, 0x04, 0x02, 0x1c, 0x8b, 0x04, 0x02, 0x00, 0x00, 0xab, 0xab, + 0x68, 0x75, 0x02, 0x21, 0x3f, 0x00, 0x00, 0x47, 0x3a, 0x00, 0x00, 0x47, + 0xe4, 0x00, 0x00, 0x47, 0xdf, 0x00, 0x00, 0x47, 0x50, 0x01, 0x09, 0x4c, + 0x7c, 0x02, 0x09, 0x4c, 0x54, 0x01, 0x09, 0x4c, 0x58, 0x01, 0x09, 0x4c, + 0x5c, 0x01, 0x09, 0x4c, 0x60, 0x01, 0x09, 0x4c, 0x64, 0x01, 0x09, 0x4c, + 0x68, 0x01, 0x09, 0x4c, 0x6c, 0x01, 0x09, 0x4c, 0x74, 0x02, 0x09, 0x4c, + 0x80, 0x02, 0x09, 0x4c, 0x52, 0x06, 0x00, 0x47, 0xc0, 0x40, 0x00, 0x21, + 0xfc, 0xff, 0xff, 0x7f, 0xed, 0x00, 0x00, 0x47, 0x48, 0x00, 0x00, 0x47, + 0x14, 0x76, 0x02, 0x21, 0xc4, 0x40, 0x00, 0x21, 0x50, 0x61, 0x72, 0x69, + 0x74, 0x79, 0x53, 0x63, 0x72, 0x75, 0x62, 0x54, 0x6d, 0x72, 0x00, 0x00, + 0x70, 0xb5, 0x0c, 0x46, 0x00, 0x25, 0x09, 0x49, 0x00, 0x2a, 0x22, 0x68, + 0x0e, 0xbf, 0x08, 0x26, 0x08, 0x31, 0x04, 0x26, 0xb2, 0x42, 0x03, 0xd3, + 0x32, 0x46, 0xce, 0xf7, 0x51, 0xfe, 0x02, 0xe0, 0x4f, 0xf6, 0x68, 0x75, + 0x00, 0x26, 0x26, 0x60, 0x28, 0x46, 0x70, 0xbd, 0xb0, 0x40, 0x00, 0x21, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, + 0x0d, 0xf8, 0x01, 0x70, 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, + 0x72, 0xb6, 0x05, 0x68, 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, + 0x29, 0x43, 0x70, 0x47, 0xdf, 0xf8, 0xd4, 0x13, 0x09, 0x68, 0x0a, 0x18, + 0xe0, 0x20, 0x92, 0xf8, 0xbc, 0x30, 0x43, 0x43, 0xc8, 0x18, 0xc4, 0x30, + 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, 0x04, 0x46, 0xdf, 0xf8, 0xbc, 0x03, + 0x27, 0x46, 0x50, 0xf8, 0x27, 0x60, 0x0d, 0x46, 0x01, 0x23, 0x4f, 0xf4, + 0x80, 0x12, 0x14, 0x21, 0x30, 0x1d, 0xff, 0xf7, 0xd4, 0xff, 0x00, 0x23, + 0x4f, 0xf4, 0x80, 0x72, 0x08, 0x21, 0x06, 0xf1, 0x14, 0x00, 0xff, 0xf7, + 0xcc, 0xff, 0xe6, 0x48, 0x50, 0xf8, 0x27, 0x60, 0x06, 0xf1, 0x0c, 0x09, + 0x00, 0x23, 0x4f, 0xf0, 0x40, 0x52, 0x1c, 0x21, 0x48, 0x46, 0xff, 0xf7, + 0xc0, 0xff, 0xe9, 0x68, 0x01, 0x22, 0x00, 0xf0, 0x06, 0xf9, 0x03, 0x46, + 0x06, 0xf1, 0x20, 0x08, 0xdd, 0x4a, 0x00, 0x21, 0x00, 0xf0, 0x6f, 0xf8, + 0xdc, 0x48, 0x50, 0xf8, 0x27, 0x70, 0x3d, 0x37, 0x03, 0x23, 0x03, 0x22, + 0x00, 0x21, 0x38, 0x46, 0xff, 0xf7, 0xa2, 0xff, 0x01, 0x23, 0x10, 0x22, + 0x04, 0x21, 0x38, 0x46, 0xff, 0xf7, 0x9c, 0xff, 0x06, 0xf1, 0x08, 0x0b, + 0x2b, 0x78, 0x4f, 0xf4, 0x7c, 0x12, 0x10, 0x21, 0x00, 0xf0, 0x79, 0xf9, + 0x6b, 0x78, 0x4f, 0xf0, 0x7c, 0x52, 0x18, 0x21, 0x00, 0xf0, 0xde, 0xf8, + 0x37, 0x1d, 0xab, 0x78, 0x4f, 0xf0, 0x70, 0x62, 0x18, 0x21, 0x00, 0xf0, + 0xd5, 0xf8, 0x06, 0xf1, 0x1c, 0x0a, 0xeb, 0x78, 0x4f, 0xf4, 0x7f, 0x42, + 0x08, 0x21, 0x50, 0x46, 0xff, 0xf7, 0x87, 0xff, 0x2b, 0x79, 0x4f, 0xf0, + 0xf8, 0x52, 0x00, 0xf0, 0x3b, 0xf8, 0x03, 0x23, 0x7f, 0x22, 0x00, 0x21, + 0x00, 0xf0, 0x59, 0xf9, 0x06, 0xf1, 0x18, 0x08, 0x03, 0x23, 0x4f, 0xf0, + 0x40, 0x52, 0x1c, 0x21, 0x00, 0xf0, 0x2f, 0xf8, 0x03, 0x23, 0x4f, 0xf0, + 0x40, 0x72, 0x00, 0xf0, 0x29, 0xf8, 0x6b, 0x69, 0x70, 0x22, 0x04, 0x21, + 0x00, 0xf0, 0xb0, 0xf8, 0xab, 0x69, 0x4f, 0xf4, 0xe0, 0x62, 0x08, 0x21, + 0x48, 0x46, 0xff, 0xf7, 0x64, 0xff, 0xeb, 0x69, 0xff, 0x22, 0x00, 0x21, + 0x50, 0x46, 0xff, 0xf7, 0x5e, 0xff, 0x2b, 0x6a, 0xff, 0x22, 0x00, 0x21, + 0x48, 0x46, 0xff, 0xf7, 0x58, 0xff, 0x2b, 0x69, 0x4f, 0xf6, 0xff, 0x72, + 0x00, 0x21, 0x06, 0xf1, 0x14, 0x00, 0xff, 0xf7, 0x50, 0xff, 0xa9, 0x68, + 0x00, 0xf0, 0x96, 0xf8, 0x03, 0x46, 0x40, 0x46, 0x01, 0xb0, 0xbd, 0xe8, + 0xf0, 0x4f, 0x88, 0xe0, 0x18, 0x21, 0x40, 0x46, 0x43, 0xe7, 0x38, 0xb5, + 0xa4, 0x4d, 0x04, 0x46, 0x55, 0xf8, 0x24, 0x00, 0x00, 0x23, 0x00, 0xf0, + 0x2a, 0xf8, 0x9e, 0x48, 0x50, 0xf8, 0x24, 0x00, 0x01, 0xb0, 0xbd, 0xe8, + 0x30, 0x40, 0x01, 0x23, 0x4f, 0xf4, 0x00, 0x22, 0x13, 0x21, 0x1c, 0x30, + 0x2f, 0xe7, 0x1c, 0xb5, 0x97, 0x49, 0x51, 0xf8, 0x20, 0x20, 0x52, 0xf8, + 0x1c, 0x1f, 0xc9, 0x0c, 0x01, 0xf0, 0x01, 0x01, 0x8d, 0xf8, 0x00, 0x10, + 0x9d, 0xf8, 0x00, 0x10, 0x81, 0xf0, 0x01, 0x01, 0x8d, 0xf8, 0x00, 0x10, + 0x9d, 0xf8, 0x00, 0x10, 0x01, 0x29, 0x05, 0xd1, 0x90, 0x4c, 0x54, 0xf8, + 0x20, 0x00, 0xff, 0x23, 0x00, 0xf0, 0x03, 0xf8, 0x9d, 0xf8, 0x00, 0x00, + 0x16, 0xbd, 0x4f, 0xf4, 0x7f, 0x42, 0x08, 0x21, 0x50, 0x30, 0x0c, 0xe7, + 0x10, 0xb5, 0x86, 0x4c, 0x54, 0xf8, 0x20, 0x00, 0xbd, 0xe8, 0x10, 0x40, + 0x0b, 0x46, 0x4f, 0xf0, 0x80, 0x72, 0x18, 0x21, 0x14, 0x30, 0x00, 0xe7, + 0x10, 0xb5, 0x83, 0x4c, 0x54, 0xf8, 0x20, 0x00, 0xbd, 0xe8, 0x10, 0x40, + 0x0b, 0x46, 0x4f, 0xf0, 0x80, 0x72, 0x18, 0x21, 0xbc, 0x30, 0xf4, 0xe6, + 0xf8, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x79, 0x48, 0x6b, 0x78, 0x21, 0x46, + 0x50, 0xf8, 0x21, 0x60, 0x06, 0xf1, 0x14, 0x07, 0x4f, 0xf4, 0x7c, 0x12, + 0x10, 0x21, 0x00, 0xf0, 0x2b, 0xf8, 0xab, 0x78, 0x4f, 0xf0, 0xf8, 0x52, + 0x18, 0x21, 0x06, 0xf1, 0x20, 0x00, 0xff, 0xf7, 0xde, 0xfe, 0xab, 0x88, + 0x4f, 0xf6, 0xff, 0x72, 0x00, 0x21, 0x00, 0xf0, 0x1d, 0xf8, 0xeb, 0x88, + 0x6f, 0x4a, 0x15, 0x21, 0x06, 0xf1, 0x1c, 0x00, 0xff, 0xf7, 0xd1, 0xfe, + 0xa9, 0x68, 0x4f, 0xf4, 0x80, 0x62, 0x00, 0xf0, 0x16, 0xf8, 0x03, 0x46, + 0x66, 0x4a, 0x00, 0x21, 0x00, 0xf0, 0x0e, 0xf8, 0xe9, 0x68, 0x00, 0xf0, + 0x0d, 0xf8, 0x03, 0x46, 0x06, 0xf1, 0x18, 0x00, 0x01, 0xb0, 0xbd, 0xe8, + 0xf0, 0x40, 0x64, 0x4a, 0x00, 0x21, 0xba, 0xe6, 0x38, 0x46, 0xb8, 0xe6, + 0x30, 0x46, 0xb6, 0xe6, 0x40, 0x22, 0x20, 0x46, 0x28, 0xe0, 0x70, 0xb5, + 0x0c, 0x46, 0x5c, 0x49, 0x51, 0xf8, 0x20, 0x50, 0x63, 0x78, 0x05, 0xf1, + 0xb8, 0x06, 0x4f, 0xf0, 0x80, 0x52, 0x1c, 0x21, 0xff, 0xf7, 0xee, 0xff, + 0xa3, 0x78, 0x4f, 0xf0, 0x7c, 0x72, 0x14, 0x21, 0xff, 0xf7, 0xe8, 0xff, + 0xe3, 0x78, 0x4f, 0xf0, 0x80, 0x52, 0x1c, 0x21, 0x05, 0xf1, 0xbc, 0x00, + 0xff, 0xf7, 0x99, 0xfe, 0xc0, 0x35, 0x23, 0x79, 0x4f, 0xf4, 0xf8, 0x32, + 0x0c, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x91, 0xfe, 0x63, 0x79, 0x28, 0x46, + 0xbd, 0xe8, 0x70, 0x40, 0x1f, 0x22, 0xcd, 0xe7, 0x38, 0xb5, 0x0c, 0x46, + 0x15, 0x46, 0xff, 0xf7, 0x97, 0xfe, 0xc1, 0x69, 0x4f, 0xf4, 0x7a, 0x70, + 0x4c, 0x43, 0x45, 0x43, 0xb4, 0xfb, 0xf5, 0xf0, 0x32, 0xbd, 0x00, 0x00, + 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, 0x04, 0x46, 0x08, 0xee, + 0x10, 0x1a, 0x15, 0x46, 0x00, 0x26, 0xdf, 0xf8, 0x00, 0xa1, 0xdf, 0xf8, + 0xf0, 0x80, 0x01, 0x20, 0xb0, 0x40, 0x04, 0x42, 0x3f, 0xd0, 0xf0, 0xb2, + 0x58, 0xf8, 0x20, 0x90, 0xff, 0xf7, 0x78, 0xfe, 0xf8, 0xee, 0x48, 0x0a, + 0xc1, 0x69, 0x00, 0xee, 0x10, 0x1a, 0xb8, 0xee, 0x40, 0x0a, 0x20, 0xee, + 0x80, 0x0a, 0xdf, 0xed, 0x2b, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0x9f, 0xed, + 0x2a, 0x1a, 0xb4, 0xee, 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xa8, 0xbf, + 0x09, 0x27, 0x0e, 0xda, 0x0b, 0x20, 0x0a, 0xeb, 0xc0, 0x02, 0x0a, 0xeb, + 0xc0, 0x01, 0xd2, 0xed, 0x00, 0x0a, 0x4f, 0x68, 0xf4, 0xee, 0x40, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x01, 0xda, 0x40, 0x1e, 0xf1, 0xd1, 0x09, 0xf1, + 0xb8, 0x0b, 0x2b, 0x46, 0x4f, 0xf0, 0x80, 0x52, 0x1c, 0x21, 0x00, 0xf0, + 0x16, 0xf8, 0x01, 0x23, 0x4f, 0xf0, 0x7c, 0x72, 0x14, 0x21, 0x00, 0xf0, + 0x10, 0xf8, 0x3b, 0x46, 0x4f, 0xf4, 0xf8, 0x32, 0x0c, 0x21, 0x09, 0xf1, + 0xc0, 0x00, 0xff, 0xf7, 0x2c, 0xfe, 0x76, 0x1c, 0xf0, 0xb2, 0x08, 0x28, + 0xb7, 0xd1, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf1, 0x8f, 0x58, 0x46, + 0x21, 0xe6, 0x70, 0xb5, 0x0c, 0x46, 0x15, 0x46, 0x1e, 0x46, 0xef, 0xf7, + 0xbf, 0xfe, 0x11, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x00, 0xf1, 0xb8, 0x01, + 0xc0, 0x30, 0x0a, 0x68, 0x12, 0x0f, 0x02, 0xf0, 0x01, 0x02, 0x32, 0x70, + 0x09, 0x68, 0xc1, 0xf3, 0x05, 0x51, 0x29, 0x60, 0x00, 0x68, 0xc0, 0xf3, + 0x04, 0x30, 0x20, 0x60, 0x70, 0xbd, 0x00, 0x00, 0x00, 0x24, 0x74, 0x49, + 0x9b, 0x71, 0x4b, 0x45, 0x5c, 0x75, 0x02, 0x21, 0x20, 0x96, 0x04, 0x02, + 0x60, 0x96, 0x04, 0x02, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x96, 0x04, 0x02, + 0x40, 0x96, 0x04, 0x02, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x03, 0x00, + 0xf4, 0x8e, 0x04, 0x02, 0x10, 0xb5, 0x0c, 0x46, 0x11, 0x46, 0x1a, 0x46, + 0x00, 0xf0, 0xf0, 0x03, 0x30, 0x2b, 0x06, 0xd2, 0x13, 0x46, 0x0a, 0x46, + 0x21, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0xed, 0xf7, 0x49, 0xbd, 0x06, 0xd1, + 0x13, 0x46, 0x0a, 0x46, 0x21, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0xfd, 0xf7, + 0x4a, 0xbf, 0x80, 0x2b, 0x0c, 0xd1, 0x3a, 0x4b, 0x00, 0xf0, 0x0f, 0x00, + 0x53, 0xf8, 0x30, 0x30, 0x1b, 0xb1, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, + 0x18, 0x47, 0x4f, 0xf6, 0x29, 0x70, 0x10, 0xbd, 0x4f, 0xf6, 0x2c, 0x70, + 0x10, 0xbd, 0x01, 0x46, 0x00, 0x20, 0x32, 0x4a, 0x91, 0x42, 0x03, 0xd1, + 0x31, 0x4b, 0x01, 0x21, 0x19, 0x71, 0x70, 0x47, 0x4f, 0xf6, 0x5e, 0x70, + 0x70, 0x47, 0x2d, 0xe9, 0xfc, 0x47, 0x0a, 0x9c, 0x82, 0x46, 0x88, 0x46, + 0x15, 0x46, 0x1e, 0x46, 0xfe, 0xf7, 0x86, 0xff, 0x4f, 0xf0, 0x00, 0x09, + 0x01, 0x27, 0xb8, 0xb9, 0x27, 0x48, 0x01, 0x79, 0x01, 0x29, 0x21, 0xd1, + 0x01, 0x68, 0x0a, 0x29, 0x28, 0xbf, 0x4f, 0xf6, 0x5f, 0x79, 0x3b, 0xd2, + 0x00, 0xeb, 0xc1, 0x01, 0x8d, 0x60, 0x02, 0x68, 0x00, 0xeb, 0xc2, 0x03, + 0x9e, 0x81, 0x01, 0x68, 0x00, 0xeb, 0xc1, 0x02, 0xd4, 0x81, 0x03, 0x68, + 0x5b, 0x1c, 0x03, 0x60, 0x05, 0xf0, 0xf0, 0x03, 0x0b, 0x9a, 0x30, 0x2b, + 0x50, 0x46, 0x41, 0x46, 0x09, 0xd2, 0x01, 0x92, 0x00, 0x94, 0x33, 0x46, + 0x2a, 0x46, 0xed, 0xf7, 0xa6, 0xfb, 0x09, 0xe0, 0x4f, 0xf6, 0x5d, 0x79, + 0x1c, 0xe0, 0x07, 0xd1, 0x01, 0x92, 0x00, 0x94, 0x33, 0x46, 0x2a, 0x46, + 0xfd, 0xf7, 0xc1, 0xfb, 0x00, 0x27, 0x13, 0xe0, 0x05, 0xf0, 0xf0, 0x00, + 0x80, 0x28, 0x0d, 0xd1, 0x0d, 0x48, 0x05, 0xf0, 0x0f, 0x05, 0x50, 0xf8, + 0x35, 0x30, 0x23, 0xb1, 0x21, 0x46, 0x30, 0x46, 0x98, 0x47, 0x81, 0x46, + 0x04, 0xe0, 0x4f, 0xf6, 0x29, 0x79, 0x01, 0xe0, 0x4f, 0xf6, 0x2c, 0x79, + 0x0c, 0x98, 0x07, 0x70, 0x48, 0x46, 0xbd, 0xe8, 0xf6, 0x87, 0x00, 0x00, + 0xbc, 0x8b, 0x04, 0x02, 0x69, 0x20, 0xec, 0x14, 0xe4, 0x70, 0x02, 0x21, + 0xc0, 0x8b, 0x04, 0x02, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, + 0x05, 0x78, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, + 0x01, 0x70, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, 0x30, 0xb5, 0x03, 0x46, + 0x00, 0x20, 0x01, 0x2b, 0x0d, 0xdc, 0x50, 0x4c, 0x18, 0x29, 0x04, 0xeb, + 0x43, 0x05, 0x03, 0xda, 0x04, 0xf8, 0x13, 0x10, 0x6a, 0x70, 0x30, 0xbd, + 0x18, 0x21, 0x04, 0xf8, 0x13, 0x10, 0x68, 0x70, 0x30, 0xbd, 0x0d, 0xe0, + 0x30, 0xb5, 0x03, 0x46, 0x00, 0x20, 0x01, 0x2b, 0x08, 0xdc, 0x46, 0x4c, + 0x14, 0xf8, 0x13, 0x50, 0x0d, 0x70, 0x04, 0xeb, 0x43, 0x01, 0x4b, 0x78, + 0x13, 0x70, 0x30, 0xbd, 0x4b, 0xf6, 0x01, 0x50, 0x30, 0xbd, 0x00, 0x00, + 0x4b, 0xa1, 0x1c, 0xb5, 0x00, 0xf0, 0x3f, 0xf8, 0x00, 0x24, 0x20, 0xb9, + 0x9d, 0xf8, 0x00, 0x00, 0x18, 0x28, 0xb8, 0xbf, 0x01, 0x24, 0x20, 0x46, + 0x16, 0xbd, 0x00, 0x00, 0x1c, 0xb5, 0x00, 0xbf, 0x44, 0xa1, 0x00, 0xf0, + 0x30, 0xf8, 0x04, 0x00, 0x29, 0xd1, 0x9d, 0xf8, 0x00, 0x00, 0x18, 0x28, + 0x22, 0xda, 0x00, 0xf0, 0x73, 0xf8, 0x61, 0xb9, 0x18, 0xb9, 0xdb, 0xb2, + 0xff, 0x22, 0x31, 0x48, 0x17, 0xe0, 0x01, 0x28, 0xdb, 0xb2, 0x19, 0xbf, + 0xff, 0x22, 0x2f, 0x48, 0xff, 0x22, 0x2f, 0x48, 0x0f, 0xe0, 0x20, 0xb9, + 0xdb, 0xb2, 0xff, 0x22, 0x00, 0x21, 0x2d, 0x48, 0x09, 0xe0, 0x01, 0x28, + 0xdb, 0xb2, 0x03, 0xd1, 0xff, 0x22, 0x00, 0x21, 0x2a, 0x48, 0x02, 0xe0, + 0xff, 0x22, 0x00, 0x21, 0x29, 0x48, 0xff, 0xf7, 0x91, 0xff, 0x04, 0xe0, + 0x4b, 0xf6, 0x02, 0x54, 0x01, 0xe0, 0x4b, 0xf6, 0x01, 0x54, 0x20, 0x46, + 0x16, 0xbd, 0x0b, 0x88, 0xad, 0xf8, 0x00, 0x30, 0x0d, 0xf1, 0x01, 0x02, + 0x69, 0x46, 0xa3, 0xe7, 0x1c, 0xb5, 0x00, 0xbf, 0x27, 0xa1, 0xff, 0xf7, + 0xf4, 0xff, 0x04, 0x00, 0x29, 0xd1, 0x9d, 0xf8, 0x00, 0x00, 0x18, 0x28, + 0x22, 0xda, 0x00, 0xf0, 0x37, 0xf8, 0x61, 0xb9, 0x18, 0xb9, 0xdb, 0xb2, + 0xff, 0x22, 0x16, 0x48, 0x17, 0xe0, 0x01, 0x28, 0xdb, 0xb2, 0x19, 0xbf, + 0xff, 0x22, 0x15, 0x48, 0xff, 0x22, 0x13, 0x48, 0x0f, 0xe0, 0x20, 0xb9, + 0xdb, 0xb2, 0xff, 0x22, 0x00, 0x21, 0x0c, 0x48, 0x09, 0xe0, 0x01, 0x28, + 0xdb, 0xb2, 0x03, 0xd1, 0xff, 0x22, 0x00, 0x21, 0x0a, 0x48, 0x02, 0xe0, + 0xff, 0x22, 0x00, 0x21, 0x07, 0x48, 0xff, 0xf7, 0x55, 0xff, 0x04, 0xe0, + 0x4b, 0xf6, 0x02, 0x54, 0x01, 0xe0, 0x4b, 0xf6, 0x01, 0x54, 0x20, 0x46, + 0x16, 0xbd, 0x00, 0x00, 0xbc, 0x40, 0x00, 0x21, 0xa2, 0x09, 0x00, 0x47, + 0xa4, 0x09, 0x00, 0x47, 0xa3, 0x09, 0x00, 0x47, 0xa5, 0x09, 0x00, 0x47, + 0xa6, 0x09, 0x00, 0x47, 0xa7, 0x09, 0x00, 0x47, 0x03, 0x46, 0xd8, 0x08, + 0x03, 0xf0, 0x07, 0x03, 0x01, 0x22, 0x9d, 0xf8, 0x01, 0x10, 0x02, 0xfa, + 0x03, 0xf3, 0x70, 0x47, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x00, 0xf0, 0xa1, 0x32, 0x00, 0x01, + 0xdf, 0xf8, 0x00, 0xf0, 0xa1, 0x33, 0x00, 0x01, 0xdf, 0xf8, 0x00, 0xf0, + 0x85, 0x39, 0x00, 0x01, 0xdf, 0xf8, 0x00, 0xf0, 0x8d, 0x39, 0x00, 0x01, + 0xdf, 0xf8, 0x00, 0xf0, 0x95, 0x39, 0x00, 0x01, 0xdf, 0xf8, 0x00, 0xf0, + 0xdb, 0x34, 0x00, 0x01, 0xdf, 0xf8, 0x00, 0xf0, 0x37, 0x39, 0x00, 0x01, + 0x2d, 0xe9, 0xfe, 0x43, 0x81, 0x46, 0x88, 0x46, 0x00, 0x26, 0xdf, 0xf8, + 0x20, 0x76, 0x29, 0xfa, 0x06, 0xf0, 0xc0, 0x07, 0x1a, 0xd5, 0x30, 0x46, + 0xdc, 0xf7, 0xe4, 0xfe, 0x04, 0x46, 0xb4, 0x21, 0xdf, 0xf8, 0x0c, 0x06, + 0x61, 0x43, 0x45, 0x18, 0xb4, 0x21, 0x28, 0x46, 0xe1, 0xf7, 0xa0, 0xf9, + 0xf0, 0xb2, 0x28, 0x60, 0x6c, 0x60, 0x00, 0x20, 0x68, 0x62, 0xa8, 0x60, + 0x85, 0xf8, 0x3e, 0x00, 0xaf, 0x61, 0xc5, 0xf8, 0x34, 0x80, 0x28, 0x46, + 0x02, 0xf0, 0x60, 0xfc, 0x76, 0x1c, 0x08, 0x2e, 0xdd, 0xd3, 0xb9, 0xf1, + 0x00, 0x0f, 0x10, 0xd0, 0x07, 0xf1, 0x28, 0x00, 0x0f, 0xf2, 0x25, 0x51, + 0x01, 0x90, 0x00, 0x91, 0x4b, 0x46, 0x01, 0x22, 0x64, 0x21, 0x0f, 0xf2, + 0xd8, 0x50, 0xeb, 0xf7, 0xd5, 0xfb, 0x38, 0x62, 0x01, 0x20, 0x00, 0xf0, + 0xa4, 0xfa, 0x07, 0xf1, 0x54, 0x01, 0x01, 0x20, 0xec, 0xf7, 0x5e, 0xfa, + 0x78, 0x62, 0x40, 0xb9, 0x03, 0xb0, 0xbd, 0xe8, 0xf0, 0x43, 0x03, 0x22, + 0x4f, 0xf6, 0x6f, 0x71, 0x02, 0x20, 0xea, 0xf7, 0x1b, 0xbb, 0xbd, 0xe8, + 0xf7, 0x83, 0x2d, 0xe9, 0xf8, 0x41, 0x85, 0xb0, 0x04, 0x46, 0x00, 0x25, + 0x02, 0x94, 0x74, 0xb3, 0x00, 0x20, 0x00, 0xf0, 0x88, 0xfa, 0x2a, 0xe0, + 0x32, 0x7a, 0x00, 0x21, 0x03, 0x91, 0x04, 0x91, 0x00, 0x20, 0x01, 0x23, + 0x02, 0x9f, 0x83, 0x40, 0x1f, 0x42, 0x08, 0xd0, 0x03, 0x9f, 0x1f, 0x43, + 0x03, 0x97, 0x49, 0x1c, 0x04, 0x9f, 0x3b, 0x43, 0x91, 0x42, 0x04, 0x93, + 0x02, 0xd2, 0x40, 0x1c, 0x08, 0x28, 0xee, 0xd3, 0x02, 0xa9, 0x02, 0x20, + 0x00, 0xf0, 0x4a, 0xf8, 0x02, 0xa9, 0x02, 0x20, 0x00, 0xf0, 0x70, 0xf8, + 0x02, 0x98, 0x78, 0xb1, 0x70, 0x7a, 0x01, 0x28, 0xdc, 0xd1, 0x02, 0xa9, + 0x03, 0x20, 0x00, 0xf0, 0x3d, 0xf8, 0x02, 0xa9, 0x03, 0x20, 0x00, 0xf0, + 0x63, 0xf8, 0x02, 0x98, 0xdf, 0xf8, 0x1c, 0x65, 0x00, 0x28, 0xcf, 0xd1, + 0x00, 0x27, 0x0f, 0xf2, 0x34, 0x58, 0x24, 0xfa, 0x07, 0xf0, 0xc0, 0x07, + 0x21, 0xd5, 0x00, 0xf0, 0x58, 0xf9, 0xb4, 0x22, 0xdf, 0xf8, 0x04, 0x15, + 0x50, 0x43, 0x0e, 0x18, 0x3b, 0x46, 0x70, 0x6c, 0x01, 0x90, 0x03, 0x20, + 0xf1, 0x69, 0x0a, 0x68, 0x00, 0x92, 0x02, 0x21, 0x42, 0x46, 0xdc, 0xf7, + 0x4e, 0xff, 0x30, 0x46, 0x02, 0xf0, 0x22, 0xff, 0xf2, 0x69, 0x01, 0x46, + 0x10, 0x68, 0x00, 0xb9, 0x11, 0x60, 0x35, 0xb9, 0xd6, 0xf8, 0xa8, 0x00, + 0x40, 0x1c, 0xc6, 0xf8, 0xa8, 0x00, 0xf0, 0x69, 0x05, 0x68, 0x7f, 0x1c, + 0x08, 0x2f, 0xd6, 0xd3, 0x14, 0xb1, 0x01, 0x20, 0x00, 0xf0, 0x27, 0xfa, + 0x28, 0x46, 0x06, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, 0x2d, 0xe9, 0xf0, 0x41, + 0x80, 0x46, 0x0e, 0x46, 0x00, 0x27, 0x01, 0x24, 0xb0, 0x68, 0xbc, 0x40, + 0x20, 0x42, 0x1a, 0xd0, 0x00, 0xf0, 0x21, 0xf9, 0xb4, 0x22, 0xdf, 0xf8, + 0x98, 0x14, 0x50, 0x43, 0x0d, 0x18, 0xb8, 0xf1, 0x02, 0x0f, 0x04, 0xbf, + 0xe8, 0x69, 0xf7, 0xf7, 0x14, 0xf8, 0x41, 0x46, 0x28, 0x46, 0x02, 0xf0, + 0x50, 0xfc, 0x40, 0xb1, 0xe9, 0x69, 0x08, 0x60, 0xe4, 0x43, 0xb0, 0x68, + 0x20, 0x40, 0xb0, 0x60, 0x31, 0x68, 0x0c, 0x40, 0x34, 0x60, 0x7f, 0x1c, + 0x08, 0x2f, 0xdc, 0xd3, 0xbd, 0xe8, 0xf0, 0x81, 0x2d, 0xe9, 0xfc, 0x47, + 0x80, 0x46, 0x0c, 0x46, 0x00, 0x20, 0x00, 0x90, 0xa6, 0x68, 0xdf, 0xf8, + 0x4c, 0xa4, 0x2a, 0xe0, 0x00, 0x27, 0x01, 0x25, 0xbd, 0x40, 0x2e, 0x42, + 0x22, 0xd0, 0x00, 0xf0, 0xf2, 0xf8, 0xb4, 0x22, 0xdf, 0xf8, 0x38, 0x14, + 0x50, 0x43, 0x01, 0xeb, 0x00, 0x09, 0x6a, 0x46, 0x41, 0x46, 0x48, 0x46, + 0x02, 0xf0, 0x86, 0xfc, 0xa0, 0xb1, 0xed, 0x43, 0x2e, 0x40, 0xb8, 0xf1, + 0x03, 0x0f, 0x1c, 0xbf, 0x9a, 0xf8, 0x09, 0x00, 0x00, 0x28, 0x01, 0xd0, + 0x00, 0x98, 0x28, 0xb1, 0xa0, 0x68, 0x28, 0x40, 0xa0, 0x60, 0x21, 0x68, + 0x0d, 0x40, 0x25, 0x60, 0xd9, 0xf8, 0x1c, 0x10, 0x00, 0x98, 0x08, 0x60, + 0x7f, 0x1c, 0x08, 0x2f, 0xd5, 0xd3, 0x00, 0x2e, 0xd2, 0xd1, 0xbd, 0xe8, + 0xf3, 0x87, 0x2d, 0xe9, 0xfc, 0x41, 0xf6, 0xf7, 0xdb, 0xff, 0x05, 0x46, + 0xdc, 0xf7, 0xca, 0xfd, 0x00, 0x24, 0xff, 0x28, 0x0c, 0xd1, 0x4f, 0xf6, + 0x2b, 0x74, 0x00, 0x94, 0x2b, 0x46, 0x0f, 0xf2, 0x08, 0x42, 0x34, 0x21, + 0x01, 0x20, 0xdc, 0xf7, 0xbc, 0xfe, 0x20, 0x46, 0xbd, 0xe8, 0xf6, 0x81, + 0xb4, 0x21, 0xdf, 0xf8, 0xbc, 0x23, 0x48, 0x43, 0x16, 0x18, 0x96, 0xf8, + 0x3e, 0x00, 0x10, 0xb1, 0x40, 0xf2, 0x0b, 0x24, 0xe9, 0xe7, 0xf0, 0x69, + 0x01, 0x69, 0x31, 0xb1, 0x00, 0x68, 0xdf, 0xf8, 0x9c, 0x73, 0x00, 0x28, + 0x4f, 0xf6, 0x70, 0x78, 0x02, 0xd0, 0x40, 0xf2, 0x05, 0x24, 0xdc, 0xe7, + 0x30, 0x6a, 0xf6, 0xf7, 0x96, 0xff, 0x31, 0x6a, 0x01, 0x20, 0x48, 0x60, + 0x4f, 0xf0, 0xff, 0x31, 0x78, 0x6a, 0xec, 0xf7, 0xcb, 0xfa, 0x01, 0x28, + 0x18, 0xbf, 0x44, 0x46, 0x10, 0xd1, 0x1c, 0xb9, 0x30, 0x46, 0x02, 0xf0, + 0xb8, 0xfc, 0x04, 0x46, 0x44, 0x45, 0x09, 0xd0, 0x78, 0x6a, 0x00, 0x23, + 0x00, 0x22, 0x00, 0x21, 0xec, 0xf7, 0x6d, 0xf9, 0x01, 0x28, 0x18, 0xbf, + 0x4f, 0xf6, 0x78, 0x74, 0xdf, 0xf8, 0x50, 0x13, 0x4f, 0xf0, 0x80, 0x50, + 0x08, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0xd6, 0xf8, + 0xac, 0x00, 0x31, 0x6a, 0x40, 0x1c, 0xc6, 0xf8, 0xac, 0x00, 0xc8, 0x6a, + 0x08, 0xb1, 0x00, 0x2c, 0xcc, 0xd0, 0x00, 0x20, 0x00, 0x2c, 0x86, 0xf8, + 0x3e, 0x00, 0xac, 0xd0, 0x44, 0x45, 0x1e, 0xbf, 0x40, 0xf2, 0x0e, 0x20, + 0x84, 0x42, 0xb4, 0xf1, 0x00, 0x4f, 0x9c, 0xd1, 0x00, 0x24, 0xa2, 0xe7, + 0x7c, 0xb5, 0x00, 0xf0, 0x15, 0xf8, 0xdc, 0xf7, 0x5b, 0xfd, 0x06, 0x9a, + 0x00, 0x92, 0x01, 0x21, 0x07, 0xe0, 0x7c, 0xb5, 0x00, 0xf0, 0x0c, 0xf8, + 0xdc, 0xf7, 0x52, 0xfd, 0x06, 0x9a, 0x00, 0x92, 0x00, 0x21, 0x01, 0x91, + 0x33, 0x46, 0x2a, 0x46, 0x21, 0x46, 0x00, 0xf0, 0x06, 0xf8, 0x76, 0xbd, + 0x0c, 0x46, 0x15, 0x46, 0x1e, 0x46, 0xf6, 0xf7, 0x51, 0xbf, 0xf8, 0xb5, + 0x0c, 0x46, 0x15, 0x46, 0x07, 0x99, 0xb2, 0x4f, 0xb4, 0x22, 0x00, 0x26, + 0x50, 0x43, 0x38, 0x44, 0x00, 0x29, 0x14, 0xbf, 0xc1, 0x69, 0x01, 0x6a, + 0x1b, 0xb1, 0x02, 0x2b, 0x0b, 0xd0, 0x0a, 0xd3, 0x10, 0xe0, 0x14, 0x27, + 0x28, 0x68, 0xb8, 0x42, 0x0f, 0xd3, 0x3a, 0x46, 0x20, 0x46, 0xce, 0xf7, + 0xe3, 0xf8, 0x2f, 0x60, 0x0b, 0xe0, 0x2f, 0x68, 0xa7, 0xf1, 0x14, 0x02, + 0x1d, 0x2a, 0xf1, 0xd3, 0x30, 0x27, 0xef, 0xe7, 0x4f, 0xf6, 0x2a, 0x76, + 0x01, 0xe0, 0x4f, 0xf6, 0x26, 0x76, 0x30, 0x46, 0xf2, 0xbd, 0x80, 0xb5, + 0x00, 0xf0, 0x09, 0xf8, 0xe6, 0xf7, 0xd7, 0xfc, 0x02, 0xbd, 0x80, 0xb5, + 0x00, 0xf0, 0x03, 0xf8, 0xe6, 0xf7, 0xbc, 0xfc, 0x02, 0xbd, 0x00, 0x92, + 0x0b, 0x46, 0x02, 0x46, 0x20, 0x21, 0x96, 0x48, 0x70, 0x47, 0x38, 0x46, + 0xdc, 0xf7, 0x04, 0xbd, 0x2d, 0xe9, 0xf8, 0x43, 0xa2, 0xb0, 0x88, 0x46, + 0x00, 0x21, 0x01, 0x91, 0x15, 0x46, 0xf6, 0xf7, 0x09, 0xff, 0x81, 0x46, + 0xdc, 0xf7, 0xf8, 0xfc, 0x06, 0x46, 0xff, 0x2e, 0x03, 0xd1, 0x4f, 0xf6, + 0x2b, 0x70, 0x01, 0x90, 0x4f, 0xe0, 0x4b, 0x46, 0x9e, 0xa2, 0x02, 0x21, + 0x03, 0x20, 0xdc, 0xf7, 0xea, 0xfd, 0xb4, 0x21, 0x87, 0x48, 0x2a, 0x9f, + 0x71, 0x43, 0x44, 0x18, 0xb8, 0xf1, 0x00, 0x0f, 0x10, 0xd0, 0xfe, 0xf7, + 0x2f, 0xfc, 0x18, 0xb9, 0x4f, 0xf4, 0x03, 0x70, 0x01, 0x90, 0x32, 0xe0, + 0xb8, 0xf1, 0x09, 0x0f, 0x1d, 0xd8, 0xdf, 0xe8, 0x08, 0xf0, 0x05, 0x19, + 0x3a, 0x45, 0x53, 0x5b, 0x4f, 0x62, 0x6e, 0x7a, 0x01, 0x21, 0x29, 0x60, + 0x0a, 0x20, 0x00, 0x22, 0x68, 0x60, 0xaa, 0x60, 0xea, 0x60, 0x10, 0x21, + 0x39, 0x60, 0x18, 0x21, 0xe0, 0x69, 0x14, 0x30, 0xe0, 0xf7, 0x48, 0xfa, + 0x20, 0x6a, 0x18, 0x21, 0x14, 0x30, 0xe0, 0xf7, 0x43, 0xfa, 0x1c, 0xe0, + 0x94, 0xf8, 0x3e, 0x00, 0x00, 0x28, 0x68, 0xd1, 0x61, 0x6a, 0xa0, 0x6a, + 0xff, 0xf7, 0xa8, 0xfd, 0x01, 0x28, 0x12, 0xd1, 0x20, 0x46, 0x02, 0xf0, + 0x90, 0xfc, 0x01, 0x90, 0x01, 0xa9, 0x04, 0x20, 0x38, 0x60, 0x08, 0x68, + 0x28, 0x60, 0x01, 0x98, 0x38, 0xb1, 0x01, 0x98, 0x7f, 0xa2, 0x00, 0x90, + 0x4b, 0x46, 0x02, 0x21, 0x01, 0x20, 0xdc, 0xf7, 0xa0, 0xfd, 0x01, 0x98, + 0x23, 0xb0, 0xbd, 0xe8, 0xf0, 0x83, 0x29, 0x78, 0x07, 0x29, 0x03, 0xdb, + 0x40, 0xf2, 0x0b, 0x21, 0x01, 0x91, 0xec, 0xe7, 0x20, 0x46, 0x02, 0xf0, + 0x31, 0xfd, 0xdb, 0xe7, 0x20, 0x46, 0x02, 0xf0, 0x32, 0xfd, 0x01, 0x20, + 0x38, 0x60, 0x04, 0xf1, 0x3d, 0x01, 0x08, 0x78, 0x28, 0x70, 0xe6, 0xe7, + 0xa0, 0x6a, 0xff, 0xf7, 0x7b, 0xfd, 0xcd, 0xe7, 0x18, 0x20, 0x38, 0x60, + 0x18, 0x22, 0x55, 0x49, 0x28, 0x46, 0xce, 0xf7, 0x37, 0xf8, 0xda, 0xe7, + 0x18, 0x21, 0x39, 0x60, 0x4e, 0x43, 0x52, 0x4b, 0x18, 0x22, 0x99, 0x19, + 0xf4, 0xe7, 0xa0, 0x6a, 0x02, 0xa9, 0xff, 0xf7, 0x6b, 0xfd, 0x08, 0x20, + 0x38, 0x60, 0x02, 0xa9, 0x08, 0x68, 0x28, 0x60, 0x48, 0x68, 0x68, 0x60, + 0xc7, 0xe7, 0xa0, 0x6a, 0x02, 0xa9, 0xff, 0xf7, 0x63, 0xfd, 0x80, 0x20, + 0x38, 0x60, 0x80, 0x22, 0x02, 0xa9, 0x28, 0x46, 0xce, 0xf7, 0x18, 0xf8, + 0xbb, 0xe7, 0x28, 0x78, 0x8d, 0xf8, 0x00, 0x00, 0x01, 0x46, 0xa0, 0x6a, + 0xff, 0xf7, 0x58, 0xfd, 0x01, 0x20, 0x38, 0x60, 0x9d, 0xf8, 0x00, 0x00, + 0xc6, 0xe7, 0x4f, 0xf6, 0x27, 0x70, 0x6f, 0xe7, 0x38, 0xb5, 0x0c, 0x46, + 0xdc, 0xf7, 0x4a, 0xfc, 0xb4, 0x21, 0x37, 0x4b, 0x48, 0x43, 0x00, 0x22, + 0x1d, 0x18, 0x00, 0x92, 0x21, 0x46, 0xa8, 0x6a, 0xff, 0xf7, 0x46, 0xfd, + 0x28, 0x6d, 0x69, 0x46, 0xec, 0xf7, 0xd6, 0xf8, 0x00, 0x98, 0x38, 0xb1, + 0x30, 0x48, 0x4f, 0xf0, 0x80, 0x51, 0x01, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, + 0xbf, 0xf3, 0x6f, 0x8f, 0x31, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x41, + 0xeb, 0xf7, 0xb7, 0xfa, 0x80, 0x46, 0x00, 0x27, 0x27, 0x4c, 0x2b, 0x4d, + 0x28, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x09, 0xd5, 0x2e, 0x78, 0xff, 0xf7, + 0x1a, 0xff, 0xb4, 0x22, 0x50, 0x43, 0x20, 0x44, 0x31, 0x46, 0x80, 0x6a, + 0xff, 0xf7, 0x24, 0xfd, 0x7f, 0x1c, 0x08, 0x2f, 0xee, 0xd3, 0x28, 0x78, + 0x80, 0xf0, 0x01, 0x00, 0x28, 0x70, 0xbd, 0xe8, 0xf0, 0x81, 0x1c, 0xb5, + 0x19, 0x4c, 0x20, 0xb9, 0x00, 0x90, 0x00, 0x23, 0x00, 0x22, 0x03, 0x21, + 0x06, 0xe0, 0xea, 0xf7, 0x86, 0xfd, 0x02, 0x46, 0x00, 0x20, 0x00, 0x90, + 0x00, 0x23, 0x01, 0x21, 0x20, 0x6a, 0xeb, 0xf7, 0x33, 0xf9, 0x13, 0xbd, + 0x2d, 0xe9, 0xf0, 0x41, 0x04, 0x46, 0x0f, 0x48, 0xc0, 0x69, 0x0d, 0x46, + 0x00, 0x26, 0x00, 0xb1, 0x05, 0x46, 0x00, 0x27, 0xdf, 0xf8, 0x30, 0x80, + 0x24, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x08, 0xd5, 0xff, 0xf7, 0xe5, 0xfe, + 0xff, 0x28, 0x0a, 0xd0, 0xb4, 0x21, 0x48, 0x43, 0x40, 0x44, 0x02, 0x6a, + 0xd5, 0x62, 0x7f, 0x1c, 0x08, 0x2f, 0xef, 0xd3, 0x30, 0x46, 0xbd, 0xe8, + 0xf0, 0x81, 0x4f, 0xf6, 0x2b, 0x76, 0xf9, 0xe7, 0x38, 0x3e, 0x00, 0x21, + 0xc0, 0x6a, 0x03, 0x21, 0x04, 0xed, 0x00, 0xe0, 0xdc, 0x3e, 0x00, 0x21, + 0x28, 0x1b, 0x03, 0x21, 0x22, 0x90, 0x00, 0x21, 0x41, 0x64, 0x63, 0x4f, + 0x76, 0x72, 0x6c, 0x00, 0x41, 0x64, 0x63, 0x52, 0x78, 0x3a, 0x20, 0x63, + 0x68, 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x58, 0x2c, + 0x20, 0x25, 0x64, 0x20, 0x6d, 0x73, 0x0a, 0x00, 0x41, 0x64, 0x63, 0x52, + 0x78, 0x54, 0x72, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x65, + 0x72, 0x72, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x41, 0x64, 0x63, 0x52, + 0x78, 0x5f, 0x43, 0x74, 0x72, 0x6c, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, + 0x0a, 0x00, 0x00, 0x00, 0x41, 0x64, 0x63, 0x52, 0x78, 0x5f, 0x43, 0x74, + 0x72, 0x6c, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, + 0x72, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x2d, 0xe9, 0xf8, 0x43, + 0x80, 0x46, 0x89, 0x46, 0x00, 0x27, 0xdf, 0xf8, 0x04, 0x45, 0x28, 0xfa, + 0x07, 0xf0, 0xc0, 0x07, 0x18, 0xd5, 0x38, 0x46, 0xdc, 0xf7, 0x9b, 0xfb, + 0x05, 0x46, 0xd4, 0x21, 0xdf, 0xf8, 0xf0, 0x04, 0x69, 0x43, 0x46, 0x18, + 0xd4, 0x21, 0x30, 0x46, 0xe0, 0xf7, 0x48, 0xfe, 0xf8, 0xb2, 0x30, 0x60, + 0x75, 0x60, 0x00, 0x20, 0x74, 0x61, 0x86, 0xf8, 0x37, 0x00, 0xc6, 0xf8, + 0x2c, 0x90, 0x30, 0x46, 0x02, 0xf0, 0x72, 0xfd, 0x7f, 0x1c, 0x01, 0x2f, + 0xdf, 0xd9, 0xbd, 0xe8, 0xf1, 0x83, 0x7f, 0xb5, 0xdf, 0xf8, 0xb8, 0x64, + 0x31, 0x7c, 0x05, 0x46, 0x00, 0x24, 0x51, 0xb9, 0x0d, 0x20, 0xe6, 0xf7, + 0xbe, 0xfd, 0x0d, 0x20, 0xe6, 0xf7, 0x3d, 0xfd, 0x0f, 0xf2, 0x3d, 0x41, + 0x0d, 0x20, 0xe6, 0xf7, 0x26, 0xfe, 0x00, 0x20, 0x25, 0xfa, 0x00, 0xf1, + 0xc9, 0x07, 0x03, 0xd4, 0x40, 0x1c, 0x01, 0x28, 0xf8, 0xd9, 0x61, 0xe0, + 0xdc, 0xf7, 0x63, 0xfb, 0x00, 0x28, 0x5d, 0xd1, 0x30, 0x7c, 0x58, 0xb9, + 0x0f, 0xf2, 0x8c, 0x42, 0x36, 0x21, 0x03, 0x20, 0xdc, 0xf7, 0x49, 0xfc, + 0x01, 0x23, 0x01, 0x22, 0x01, 0x21, 0x0d, 0x20, 0xe6, 0xf7, 0x27, 0xfd, + 0xdf, 0xf8, 0x64, 0x54, 0xa8, 0x69, 0xf6, 0xf7, 0x36, 0xfd, 0x05, 0xf1, + 0x37, 0x04, 0x20, 0x78, 0x20, 0xb9, 0x28, 0x46, 0x02, 0xf0, 0xe7, 0xfd, + 0x10, 0xb9, 0x0b, 0xe0, 0x40, 0xf2, 0x19, 0x30, 0xa9, 0x69, 0x0f, 0xf2, + 0x6c, 0x42, 0x08, 0x60, 0x00, 0x90, 0x03, 0x21, 0x2b, 0x68, 0x03, 0x20, + 0xdc, 0xf7, 0x29, 0xfc, 0x00, 0x20, 0x02, 0x90, 0x0f, 0xf2, 0x6c, 0x46, + 0x13, 0xe0, 0x02, 0xa9, 0x28, 0x46, 0x02, 0xf0, 0x6b, 0xfe, 0x70, 0xb1, + 0xa9, 0x69, 0x02, 0x98, 0x08, 0x60, 0x00, 0x22, 0x28, 0x6c, 0x02, 0x99, + 0x22, 0x70, 0x01, 0x90, 0x00, 0x91, 0x32, 0x46, 0x2b, 0x68, 0x03, 0x21, + 0x03, 0x20, 0xdc, 0xf7, 0x10, 0xfc, 0x60, 0x78, 0x01, 0x28, 0xe8, 0xd0, + 0x69, 0x69, 0x08, 0x7c, 0x10, 0xb9, 0x0d, 0x20, 0xe6, 0xf7, 0x4c, 0xfd, + 0x28, 0x46, 0x03, 0xf0, 0xc5, 0xf8, 0xaa, 0x69, 0x01, 0x46, 0x10, 0x68, + 0x00, 0xb9, 0x11, 0x60, 0xa8, 0x69, 0x04, 0x68, 0x44, 0xb9, 0x05, 0xf1, + 0xc4, 0x00, 0x4f, 0xf0, 0xff, 0x31, 0x81, 0x60, 0xc1, 0x60, 0x01, 0x68, + 0x49, 0x1c, 0x01, 0x60, 0x20, 0x46, 0x04, 0xb0, 0x70, 0xbd, 0x2d, 0xe9, + 0xfc, 0x47, 0x04, 0x46, 0xf6, 0xf7, 0xfa, 0xfc, 0x82, 0x46, 0xdc, 0xf7, + 0xf8, 0xfa, 0xff, 0x28, 0x08, 0xbf, 0x4f, 0xf6, 0x2b, 0x74, 0x09, 0xd0, + 0xd4, 0x21, 0xdf, 0xf8, 0xa4, 0x23, 0x48, 0x43, 0x16, 0x18, 0x96, 0xf8, + 0x37, 0x00, 0x10, 0xb1, 0x40, 0xf2, 0x19, 0x34, 0x74, 0xe0, 0xb0, 0x69, + 0x01, 0x69, 0x09, 0xb1, 0x00, 0x68, 0x10, 0xb1, 0x40, 0xf2, 0x1b, 0x34, + 0x6c, 0xe0, 0x02, 0x20, 0x86, 0xf8, 0x37, 0x00, 0x01, 0xaa, 0x30, 0x6a, + 0x0f, 0xf2, 0xd4, 0x38, 0x01, 0x21, 0xcf, 0xf7, 0x17, 0xfc, 0x00, 0x28, + 0x06, 0xf1, 0xc8, 0x07, 0x52, 0xd1, 0xd7, 0xf8, 0x08, 0x90, 0x9d, 0xed, + 0x01, 0x0a, 0xdf, 0xf8, 0x58, 0x53, 0xf0, 0xee, 0x00, 0x0a, 0x20, 0xee, + 0x20, 0x0a, 0xcd, 0xf7, 0xb5, 0xff, 0xb2, 0xee, 0x04, 0x1a, 0x20, 0xee, + 0x01, 0x1a, 0x95, 0xed, 0x07, 0x0a, 0xb4, 0xee, 0x40, 0x1a, 0xf1, 0xee, + 0x10, 0xfa, 0x27, 0xdb, 0xa8, 0x69, 0x81, 0x45, 0x03, 0xd3, 0x69, 0x69, + 0x20, 0x46, 0x00, 0xf0, 0x6f, 0xf9, 0x00, 0x20, 0xb8, 0x60, 0xe6, 0xf7, + 0xf7, 0xf9, 0x78, 0x60, 0xf0, 0x69, 0xf6, 0xf7, 0x94, 0xfc, 0xf1, 0x69, + 0x01, 0x20, 0x48, 0x60, 0x30, 0x46, 0x02, 0xf0, 0x88, 0xfe, 0x04, 0x46, + 0x38, 0x68, 0x40, 0x1c, 0x38, 0x60, 0xf1, 0x69, 0x88, 0x69, 0x08, 0xb1, + 0x00, 0x2c, 0xed, 0xd0, 0x2c, 0xb3, 0x40, 0xf2, 0x1e, 0x30, 0x84, 0x42, + 0x18, 0xbf, 0xb4, 0xf1, 0x00, 0x4f, 0x1b, 0xd1, 0x00, 0x24, 0x1c, 0xe0, + 0x19, 0xf1, 0x01, 0x0f, 0x04, 0xbf, 0x78, 0x68, 0x10, 0xf1, 0x01, 0x0f, + 0xdc, 0xd0, 0x78, 0x68, 0x10, 0xb9, 0x00, 0x21, 0xb9, 0x60, 0xd4, 0xe7, + 0xe6, 0xf7, 0xcc, 0xf9, 0x01, 0x46, 0x78, 0x68, 0xe6, 0xf7, 0x0c, 0xfa, + 0xb8, 0x60, 0xcf, 0xe7, 0x40, 0xf2, 0x17, 0x30, 0x00, 0x90, 0x00, 0xf0, + 0x0a, 0xf8, 0xc9, 0xe7, 0x00, 0x94, 0x00, 0xf0, 0x06, 0xf8, 0x00, 0x20, + 0x86, 0xf8, 0x37, 0x00, 0x20, 0x46, 0xbd, 0xe8, 0xf6, 0x87, 0x53, 0x46, + 0x42, 0x46, 0x36, 0x21, 0x01, 0x20, 0xdc, 0xf7, 0x5a, 0xbb, 0x7c, 0xb5, + 0x00, 0xf0, 0x1d, 0xf8, 0xdc, 0xf7, 0x65, 0xfa, 0x06, 0x9a, 0x00, 0x92, + 0x01, 0x21, 0x01, 0x91, 0x00, 0xf0, 0x01, 0xf8, 0x76, 0xbd, 0x33, 0x46, + 0x2a, 0x46, 0x21, 0x46, 0x14, 0xe0, 0xfe, 0xb5, 0x00, 0xf0, 0x0d, 0xf8, + 0xdc, 0xf7, 0x55, 0xfa, 0x00, 0x27, 0xff, 0x28, 0x05, 0xd0, 0x08, 0x9a, + 0x00, 0x92, 0x01, 0x97, 0xff, 0xf7, 0xef, 0xff, 0x07, 0x46, 0x38, 0x46, + 0xfe, 0xbd, 0x0c, 0x46, 0x15, 0x46, 0x1e, 0x46, 0xf6, 0xf7, 0x44, 0xbc, + 0xf8, 0xb5, 0x0c, 0x46, 0x15, 0x46, 0x07, 0x99, 0x90, 0x4f, 0xd4, 0x22, + 0x00, 0x26, 0x50, 0x43, 0x38, 0x44, 0x00, 0x29, 0x14, 0xbf, 0x81, 0x69, + 0xc1, 0x69, 0x1b, 0xb1, 0x02, 0x2b, 0x0b, 0xd0, 0x0a, 0xd3, 0x10, 0xe0, + 0x14, 0x27, 0x28, 0x68, 0xb8, 0x42, 0x0f, 0xd3, 0x3a, 0x46, 0x20, 0x46, + 0xcd, 0xf7, 0xd6, 0xfd, 0x2f, 0x60, 0x0b, 0xe0, 0x2f, 0x68, 0xa7, 0xf1, + 0x14, 0x02, 0x09, 0x2a, 0xf1, 0xd3, 0x1c, 0x27, 0xef, 0xe7, 0x4f, 0xf6, + 0x2a, 0x76, 0x01, 0xe0, 0x4f, 0xf6, 0x26, 0x76, 0x30, 0x46, 0xf2, 0xbd, + 0x80, 0xb5, 0x00, 0xf0, 0x09, 0xf8, 0xe6, 0xf7, 0xca, 0xf9, 0x02, 0xbd, + 0x80, 0xb5, 0x00, 0xf0, 0x03, 0xf8, 0xe6, 0xf7, 0xaf, 0xf9, 0x02, 0xbd, + 0x00, 0x92, 0x0b, 0x46, 0x02, 0x46, 0x20, 0x21, 0x74, 0x48, 0x70, 0x47, + 0x2d, 0xe9, 0xfc, 0x41, 0x0c, 0x46, 0x00, 0x21, 0x00, 0x91, 0x15, 0x46, + 0xf6, 0xf7, 0x00, 0xfc, 0x06, 0x46, 0xdc, 0xf7, 0xfe, 0xf9, 0x07, 0x46, + 0xff, 0x2f, 0x03, 0xd1, 0x4f, 0xf6, 0x2b, 0x70, 0x00, 0x90, 0x40, 0xe0, + 0x4f, 0xea, 0x06, 0x03, 0x88, 0xa2, 0x03, 0x21, 0x03, 0x20, 0xdc, 0xf7, + 0xe0, 0xfa, 0x08, 0x9e, 0xa4, 0xb1, 0xfe, 0xf7, 0x2b, 0xf9, 0x10, 0xb9, + 0x40, 0xf2, 0x1a, 0x30, 0x36, 0xe0, 0xd4, 0x20, 0x63, 0x49, 0x78, 0x43, + 0x01, 0xeb, 0x00, 0x08, 0x06, 0x2c, 0x08, 0xf1, 0x20, 0x02, 0x5c, 0xd8, + 0xdf, 0xe8, 0x04, 0xf0, 0x04, 0x0f, 0x2e, 0x3e, 0x4c, 0x54, 0x48, 0x00, + 0x01, 0x21, 0x29, 0x60, 0x0c, 0x20, 0x68, 0x60, 0x05, 0x22, 0x00, 0x20, + 0xaa, 0x60, 0xe8, 0x60, 0x10, 0x21, 0x31, 0x60, 0x17, 0xe0, 0xd0, 0x7d, + 0xc0, 0xb9, 0x10, 0x68, 0x00, 0x21, 0xcf, 0xf7, 0x97, 0xf9, 0x01, 0x28, + 0x0f, 0xd1, 0x40, 0x46, 0x02, 0xf0, 0xb0, 0xfe, 0x00, 0x90, 0x04, 0x20, + 0x30, 0x60, 0x00, 0x98, 0x28, 0x60, 0x00, 0x98, 0x28, 0xb1, 0x00, 0x9b, + 0x70, 0xa2, 0x03, 0x21, 0x01, 0x20, 0xdc, 0xf7, 0xa6, 0xfa, 0x00, 0x98, + 0xbd, 0xe8, 0xf6, 0x81, 0x40, 0xf2, 0x19, 0x30, 0x00, 0x90, 0xf2, 0xe7, + 0x28, 0x78, 0x07, 0x28, 0xa8, 0xbf, 0x4f, 0xf4, 0x46, 0x70, 0xf7, 0xda, + 0x02, 0x28, 0x16, 0xbf, 0x03, 0x28, 0x01, 0x22, 0x00, 0x22, 0x01, 0x46, + 0x40, 0x46, 0x02, 0xf0, 0xb7, 0xfe, 0xd6, 0xe7, 0x40, 0x46, 0x02, 0xf0, + 0xb9, 0xfe, 0x01, 0x20, 0x30, 0x60, 0x08, 0xf1, 0x36, 0x01, 0x08, 0x78, + 0x28, 0x70, 0xde, 0xe7, 0x10, 0x68, 0xcf, 0xf7, 0xf1, 0xf9, 0xc8, 0xe7, + 0x18, 0x20, 0x30, 0x60, 0x18, 0x22, 0x38, 0x49, 0x28, 0x46, 0xcd, 0xf7, + 0x35, 0xfd, 0xd2, 0xe7, 0x18, 0x21, 0x31, 0x60, 0x4f, 0x43, 0x35, 0x4b, + 0x18, 0x22, 0xd9, 0x19, 0xf4, 0xe7, 0x4f, 0xf6, 0x27, 0x71, 0x00, 0x91, + 0xc1, 0xe7, 0x38, 0xb5, 0x0c, 0x46, 0xdc, 0xf7, 0x7a, 0xf9, 0xd4, 0x21, + 0x2c, 0x4b, 0x48, 0x43, 0x00, 0x22, 0x1d, 0x18, 0x00, 0x92, 0x21, 0x46, + 0x28, 0x6a, 0xcf, 0xf7, 0x8d, 0xfa, 0xe8, 0x6c, 0x69, 0x46, 0xeb, 0xf7, + 0xf7, 0xfd, 0x00, 0x98, 0x38, 0xb1, 0x28, 0x48, 0x4f, 0xf0, 0x80, 0x51, + 0x01, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x31, 0xbd, + 0x10, 0xb5, 0x0c, 0x46, 0xdc, 0xf7, 0x5d, 0xf9, 0xd4, 0x22, 0x1e, 0x4b, + 0x50, 0x43, 0x18, 0x44, 0x21, 0x46, 0x00, 0x6a, 0xbd, 0xe8, 0x10, 0x40, + 0xcf, 0xf7, 0x70, 0xba, 0x19, 0x48, 0x00, 0xf1, 0xb4, 0x02, 0x11, 0x7a, + 0x13, 0x68, 0x00, 0x68, 0x49, 0x1c, 0x11, 0x72, 0x5b, 0x1c, 0x13, 0x60, + 0xc9, 0xb2, 0xc0, 0xb2, 0xeb, 0xf7, 0x5a, 0xbb, 0x2d, 0xe9, 0xf0, 0x41, + 0x04, 0x46, 0x10, 0x48, 0x40, 0x69, 0x0d, 0x46, 0x00, 0x26, 0x00, 0xb1, + 0x05, 0x46, 0x00, 0x27, 0xdf, 0xf8, 0x34, 0x80, 0x24, 0xfa, 0x07, 0xf0, + 0xc0, 0x07, 0x09, 0xd5, 0x38, 0x46, 0xdc, 0xf7, 0x32, 0xf9, 0xff, 0x28, + 0x0a, 0xd0, 0xd4, 0x21, 0x48, 0x43, 0x40, 0x44, 0xc2, 0x69, 0x95, 0x61, + 0x7f, 0x1c, 0x01, 0x2f, 0xee, 0xd9, 0x30, 0x46, 0xbd, 0xe8, 0xf0, 0x81, + 0x4f, 0xf6, 0x2b, 0x76, 0xf9, 0xe7, 0x00, 0x00, 0xc0, 0x3d, 0x00, 0x21, + 0x50, 0x72, 0x03, 0x21, 0x1c, 0x3e, 0x00, 0x21, 0x40, 0x58, 0x03, 0x21, + 0x04, 0xed, 0x00, 0xe0, 0x41, 0x64, 0x63, 0x4f, 0x72, 0x78, 0x3a, 0x20, + 0x75, 0x73, 0x65, 0x20, 0x72, 0x61, 0x6d, 0x70, 0x20, 0x74, 0x69, 0x6d, + 0x65, 0x72, 0x0a, 0x00, 0x41, 0x64, 0x63, 0x4f, 0x72, 0x78, 0x3a, 0x20, + 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x78, + 0x0a, 0x00, 0x00, 0x00, 0x41, 0x64, 0x63, 0x4f, 0x72, 0x78, 0x3a, 0x20, + 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x78, + 0x2c, 0x20, 0x25, 0x64, 0x20, 0x6d, 0x73, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x64, 0x63, 0x4f, 0x72, 0x78, 0x54, 0x72, 0x3a, 0x20, 0x63, 0x68, + 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x78, 0x0a, 0x00, + 0x41, 0x64, 0x63, 0x4f, 0x72, 0x78, 0x5f, 0x43, 0x74, 0x72, 0x6c, 0x3a, + 0x20, 0x63, 0x68, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x41, 0x64, 0x63, 0x4f, + 0x72, 0x78, 0x5f, 0x43, 0x74, 0x72, 0x6c, 0x3a, 0x20, 0x65, 0x72, 0x72, + 0x20, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, + 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0x2d, 0xe9, 0xf8, 0x43, 0x80, 0x46, 0x89, 0x46, 0x00, 0x27, 0xdf, 0xf8, + 0xbc, 0x44, 0x28, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x17, 0xd5, 0x00, 0xf0, + 0x71, 0xf9, 0x05, 0x46, 0xd4, 0x21, 0xdf, 0xf8, 0xac, 0x04, 0x69, 0x43, + 0x46, 0x18, 0xd4, 0x21, 0x30, 0x46, 0xe0, 0xf7, 0x5f, 0xfb, 0xf8, 0xb2, + 0x30, 0x60, 0x75, 0x60, 0x00, 0x20, 0x74, 0x61, 0x86, 0xf8, 0x37, 0x00, + 0xc6, 0xf8, 0x2c, 0x90, 0x30, 0x46, 0x02, 0xf0, 0xcd, 0xfe, 0x7f, 0x1c, + 0x08, 0x2f, 0xe0, 0xd3, 0xbd, 0xe8, 0xf1, 0x83, 0x2d, 0xe9, 0xf1, 0x4f, + 0x82, 0xb0, 0x00, 0x20, 0xdd, 0xf8, 0x08, 0xa0, 0xdf, 0xf8, 0x6c, 0x94, + 0x01, 0x90, 0x4f, 0xf0, 0xd4, 0x08, 0x01, 0x26, 0xba, 0xf1, 0x00, 0x0f, + 0x54, 0xd0, 0xdf, 0xf8, 0x58, 0x14, 0xc9, 0x7b, 0x00, 0x20, 0x00, 0x24, + 0x00, 0x22, 0x06, 0xfa, 0x02, 0xf3, 0x1a, 0xea, 0x03, 0x0f, 0x03, 0xd0, + 0x1c, 0x43, 0x40, 0x1c, 0x88, 0x42, 0x02, 0xd2, 0x52, 0x1c, 0x08, 0x2a, + 0xf3, 0xd3, 0x00, 0x25, 0x06, 0xfa, 0x05, 0xf7, 0x3c, 0x42, 0x18, 0xd0, + 0x28, 0x46, 0xdc, 0xf7, 0x65, 0xf8, 0x08, 0xfb, 0x00, 0xfb, 0x09, 0xf1, + 0x18, 0x00, 0x50, 0xf8, 0x0b, 0x00, 0xf6, 0xf7, 0x4e, 0xfa, 0x09, 0xeb, + 0x0b, 0x00, 0x02, 0xf0, 0x38, 0xff, 0x40, 0xb1, 0x09, 0xf1, 0x18, 0x01, + 0xff, 0x43, 0x51, 0xf8, 0x0b, 0x20, 0x3c, 0x40, 0x10, 0x60, 0x07, 0xea, + 0x0a, 0x0a, 0x6d, 0x1c, 0x08, 0x2d, 0xdf, 0xd3, 0x00, 0x20, 0x00, 0x90, + 0x00, 0x2c, 0xc5, 0xd0, 0x00, 0x27, 0x06, 0xfa, 0x07, 0xfb, 0x14, 0xea, + 0x0b, 0x0f, 0x13, 0xd0, 0x00, 0xf0, 0x08, 0xf9, 0x08, 0xfb, 0x00, 0xf5, + 0x69, 0x46, 0x09, 0xeb, 0x05, 0x00, 0x02, 0xf0, 0x54, 0xff, 0x48, 0xb1, + 0x09, 0xf1, 0x18, 0x01, 0x6f, 0xea, 0x0b, 0x00, 0x04, 0x40, 0x00, 0xea, + 0x0a, 0x0a, 0x4a, 0x59, 0x00, 0x98, 0x10, 0x60, 0x7f, 0x1c, 0x08, 0x2f, + 0xe3, 0xd3, 0xdf, 0xe7, 0x02, 0x9c, 0x01, 0x9e, 0x0f, 0xf2, 0xc0, 0x3a, + 0x00, 0x27, 0x24, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x21, 0xd5, 0x00, 0xf0, + 0xe7, 0xf8, 0x08, 0xfb, 0x00, 0xf0, 0x09, 0xeb, 0x00, 0x05, 0x3b, 0x46, + 0x28, 0x6c, 0x01, 0x90, 0x03, 0x20, 0xa9, 0x69, 0x0a, 0x68, 0x00, 0x92, + 0x04, 0x21, 0x52, 0x46, 0xdc, 0xf7, 0x09, 0xf9, 0x28, 0x46, 0x03, 0xf0, + 0xa4, 0xf9, 0xaa, 0x69, 0x01, 0x46, 0x10, 0x68, 0x00, 0xb9, 0x11, 0x60, + 0x3e, 0xb9, 0xa8, 0x69, 0x06, 0x68, 0x26, 0xb9, 0xd5, 0xf8, 0xc4, 0x00, + 0x40, 0x1c, 0xc5, 0xf8, 0xc4, 0x00, 0x7f, 0x1c, 0x08, 0x2f, 0xd6, 0xd3, + 0x30, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, 0x00, 0x00, 0x2d, 0xe9, 0xfc, 0x41, + 0xf6, 0xf7, 0xfc, 0xf9, 0x05, 0x46, 0xdb, 0xf7, 0xf1, 0xff, 0xd4, 0x22, + 0xdf, 0xf8, 0x3c, 0x13, 0x42, 0x43, 0x8e, 0x18, 0xf3, 0x69, 0x9f, 0x69, + 0x07, 0xb1, 0x01, 0x27, 0xff, 0x28, 0x08, 0xbf, 0x4f, 0xf6, 0x2b, 0x74, + 0x4a, 0xd0, 0x96, 0xf8, 0x37, 0x00, 0x10, 0xb1, 0x40, 0xf2, 0x14, 0x44, + 0x44, 0xe0, 0xb0, 0x69, 0x01, 0x69, 0x09, 0xb1, 0x00, 0x68, 0x10, 0xb1, + 0x40, 0xf2, 0x16, 0x44, 0x3c, 0xe0, 0x02, 0x20, 0x86, 0xf8, 0x37, 0x00, + 0xf9, 0xb2, 0xdf, 0xf8, 0x04, 0x83, 0x29, 0xb1, 0x30, 0x68, 0x58, 0xf8, + 0x20, 0x00, 0x01, 0x23, 0x00, 0xf0, 0x33, 0xf8, 0xf0, 0x69, 0xf6, 0xf7, + 0xb6, 0xf9, 0xf1, 0x69, 0x01, 0x20, 0x48, 0x60, 0x30, 0x46, 0x02, 0xf0, + 0x92, 0xff, 0x04, 0x46, 0xd6, 0xf8, 0xc8, 0x00, 0xf1, 0x69, 0x40, 0x1c, + 0xc6, 0xf8, 0xc8, 0x00, 0x88, 0x69, 0x08, 0xb1, 0x00, 0x2c, 0xeb, 0xd0, + 0xff, 0xb2, 0x2f, 0xb1, 0x30, 0x68, 0x58, 0xf8, 0x20, 0x00, 0x00, 0x23, + 0x00, 0xf0, 0x17, 0xf8, 0x7c, 0xb1, 0x40, 0xf2, 0x19, 0x40, 0x84, 0x42, + 0x14, 0xbf, 0xb4, 0xf1, 0x00, 0x4f, 0x00, 0x24, 0x07, 0xd0, 0x00, 0x94, + 0x4f, 0xea, 0x05, 0x03, 0xb3, 0xa2, 0x35, 0x21, 0x01, 0x20, 0xdc, 0xf7, + 0x94, 0xf8, 0x00, 0x20, 0x86, 0xf8, 0x37, 0x00, 0x20, 0x46, 0xbd, 0xe8, + 0xf6, 0x81, 0x01, 0x22, 0x00, 0x21, 0x30, 0x30, 0xcc, 0xe6, 0x7c, 0xb5, + 0x00, 0xf0, 0x15, 0xf8, 0xdb, 0xf7, 0x8c, 0xff, 0x06, 0x9a, 0x00, 0x92, + 0x01, 0x21, 0x07, 0xe0, 0x7c, 0xb5, 0x00, 0xf0, 0x0c, 0xf8, 0xdb, 0xf7, + 0x83, 0xff, 0x06, 0x9a, 0x00, 0x92, 0x00, 0x21, 0x01, 0x91, 0x33, 0x46, + 0x2a, 0x46, 0x21, 0x46, 0x00, 0xf0, 0x06, 0xf8, 0x76, 0xbd, 0x0c, 0x46, + 0x15, 0x46, 0x1e, 0x46, 0xf6, 0xf7, 0x7c, 0xb9, 0xf8, 0xb5, 0x0c, 0x46, + 0x15, 0x46, 0x07, 0x99, 0x8f, 0x4f, 0xd4, 0x22, 0x00, 0x26, 0x50, 0x43, + 0x38, 0x44, 0x00, 0x29, 0x14, 0xbf, 0x81, 0x69, 0xc1, 0x69, 0x1b, 0xb1, + 0x02, 0x2b, 0x0b, 0xd0, 0x0a, 0xd3, 0x10, 0xe0, 0x14, 0x27, 0x28, 0x68, + 0xb8, 0x42, 0x0f, 0xd3, 0x3a, 0x46, 0x20, 0x46, 0xcd, 0xf7, 0x0e, 0xfb, + 0x2f, 0x60, 0x0b, 0xe0, 0x2f, 0x68, 0xa7, 0xf1, 0x14, 0x02, 0x09, 0x2a, + 0xf1, 0xd3, 0x1c, 0x27, 0xef, 0xe7, 0x4f, 0xf6, 0x2a, 0x76, 0x01, 0xe0, + 0x4f, 0xf6, 0x26, 0x76, 0x30, 0x46, 0xf2, 0xbd, 0x80, 0xb5, 0x00, 0xf0, + 0x09, 0xf8, 0xe5, 0xf7, 0x02, 0xff, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, + 0x03, 0xf8, 0xe5, 0xf7, 0xe7, 0xfe, 0x02, 0xbd, 0x00, 0x92, 0x0b, 0x46, + 0x02, 0x46, 0x20, 0x21, 0x73, 0x48, 0x70, 0x47, 0x38, 0x46, 0xdb, 0xf7, + 0x35, 0xbf, 0x00, 0x00, 0x2d, 0xe9, 0xfc, 0x41, 0x0c, 0x46, 0x00, 0x21, + 0x00, 0x91, 0x15, 0x46, 0xf6, 0xf7, 0x34, 0xf9, 0x06, 0x46, 0xdb, 0xf7, + 0x29, 0xff, 0x07, 0x46, 0xff, 0x2f, 0x03, 0xd1, 0x4f, 0xf6, 0x2b, 0x70, + 0x00, 0x90, 0x40, 0xe0, 0x4f, 0xea, 0x06, 0x03, 0x79, 0xa2, 0x04, 0x21, + 0x03, 0x20, 0xdc, 0xf7, 0x14, 0xf8, 0x08, 0x9e, 0xa4, 0xb1, 0xfd, 0xf7, + 0x5f, 0xfe, 0x10, 0xb9, 0x40, 0xf2, 0x15, 0x40, 0x36, 0xe0, 0xd4, 0x20, + 0x60, 0x49, 0x78, 0x43, 0x01, 0xeb, 0x00, 0x08, 0x06, 0x2c, 0x08, 0xf1, + 0x20, 0x02, 0x5c, 0xd8, 0xdf, 0xe8, 0x04, 0xf0, 0x04, 0x0f, 0x2e, 0x3e, + 0x4c, 0x54, 0x48, 0x00, 0x01, 0x21, 0x29, 0x60, 0x0c, 0x20, 0x68, 0x60, + 0x05, 0x22, 0x00, 0x20, 0xaa, 0x60, 0xe8, 0x60, 0x10, 0x21, 0x31, 0x60, + 0x17, 0xe0, 0xd0, 0x7d, 0xc0, 0xb9, 0x10, 0x68, 0x00, 0x21, 0xce, 0xf7, + 0xcb, 0xfe, 0x01, 0x28, 0x0f, 0xd1, 0x40, 0x46, 0x03, 0xf0, 0x1d, 0xf8, + 0x00, 0x90, 0x04, 0x20, 0x30, 0x60, 0x00, 0x98, 0x28, 0x60, 0x00, 0x98, + 0x28, 0xb1, 0x00, 0x9b, 0x61, 0xa2, 0x04, 0x21, 0x01, 0x20, 0xdb, 0xf7, + 0xda, 0xff, 0x00, 0x98, 0xbd, 0xe8, 0xf6, 0x81, 0x40, 0xf2, 0x14, 0x40, + 0x00, 0x90, 0xf2, 0xe7, 0x28, 0x78, 0x07, 0x28, 0xa8, 0xbf, 0x40, 0xf2, + 0x13, 0x40, 0xf7, 0xda, 0x02, 0x28, 0x16, 0xbf, 0x03, 0x28, 0x01, 0x22, + 0x00, 0x22, 0x01, 0x46, 0x40, 0x46, 0x03, 0xf0, 0x22, 0xf8, 0xd6, 0xe7, + 0x40, 0x46, 0x03, 0xf0, 0x24, 0xf8, 0x01, 0x20, 0x30, 0x60, 0x08, 0xf1, + 0x36, 0x01, 0x08, 0x78, 0x28, 0x70, 0xde, 0xe7, 0x10, 0x68, 0xce, 0xf7, + 0x25, 0xff, 0xc8, 0xe7, 0x18, 0x20, 0x30, 0x60, 0x18, 0x22, 0x36, 0x49, + 0x28, 0x46, 0xcd, 0xf7, 0x69, 0xfa, 0xd2, 0xe7, 0x18, 0x21, 0x31, 0x60, + 0x4f, 0x43, 0x33, 0x4b, 0x18, 0x22, 0xd9, 0x19, 0xf4, 0xe7, 0x4f, 0xf6, + 0x27, 0x71, 0x00, 0x91, 0xc1, 0xe7, 0x38, 0xb5, 0x0c, 0x46, 0xdb, 0xf7, + 0xa5, 0xfe, 0xff, 0x28, 0x18, 0xd0, 0xd4, 0x21, 0x28, 0x4b, 0x48, 0x43, + 0x00, 0x22, 0x1d, 0x18, 0x00, 0x92, 0x21, 0x46, 0x28, 0x6a, 0xce, 0xf7, + 0xbf, 0xff, 0xe8, 0x6c, 0x69, 0x46, 0xeb, 0xf7, 0x29, 0xfb, 0x00, 0x98, + 0x70, 0xb1, 0x25, 0x48, 0x4f, 0xf0, 0x80, 0x51, 0x01, 0x60, 0xbf, 0xf3, + 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x31, 0xbd, 0x01, 0x22, 0x4f, 0xf6, + 0x2b, 0x71, 0x01, 0x20, 0xe9, 0xf7, 0xf4, 0xfa, 0x31, 0xbd, 0x10, 0xb5, + 0x0c, 0x46, 0xdb, 0xf7, 0x7f, 0xfe, 0xd4, 0x22, 0x16, 0x4b, 0x50, 0x43, + 0x18, 0x44, 0x21, 0x46, 0x00, 0x6a, 0xbd, 0xe8, 0x10, 0x40, 0xce, 0xf7, + 0x9b, 0xbf, 0x2d, 0xe9, 0xf0, 0x41, 0x04, 0x46, 0x0f, 0x48, 0x40, 0x69, + 0x0d, 0x46, 0x00, 0x26, 0x00, 0xb1, 0x05, 0x46, 0x00, 0x27, 0xdf, 0xf8, + 0x34, 0x80, 0x24, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x08, 0xd5, 0xff, 0xf7, + 0x2b, 0xff, 0xff, 0x28, 0x0a, 0xd0, 0xd4, 0x21, 0x48, 0x43, 0x40, 0x44, + 0xc2, 0x69, 0x95, 0x61, 0x7f, 0x1c, 0x08, 0x2f, 0xef, 0xd3, 0x30, 0x46, + 0xbd, 0xe8, 0xf0, 0x81, 0x4f, 0xf6, 0x2b, 0x76, 0xf9, 0xe7, 0x00, 0x00, + 0xf4, 0x3e, 0x00, 0x21, 0x00, 0x61, 0x03, 0x21, 0xc0, 0x99, 0x04, 0x02, + 0xf8, 0x3f, 0x00, 0x21, 0x10, 0x4f, 0x03, 0x21, 0x04, 0xed, 0x00, 0xe0, + 0x41, 0x64, 0x63, 0x54, 0x78, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, + 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x58, 0x2c, 0x20, 0x25, 0x64, 0x20, + 0x6d, 0x73, 0x0a, 0x00, 0x41, 0x64, 0x63, 0x54, 0x78, 0x54, 0x72, 0x3a, + 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, + 0x78, 0x0a, 0x00, 0x00, 0x41, 0x64, 0x63, 0x54, 0x78, 0x6c, 0x62, 0x5f, + 0x43, 0x74, 0x72, 0x6c, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x0a, 0x00, + 0x41, 0x64, 0x63, 0x54, 0x78, 0x6c, 0x62, 0x5f, 0x43, 0x74, 0x72, 0x6c, + 0x3a, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x00, + 0x2d, 0xe9, 0xf8, 0x43, 0x81, 0x46, 0x0f, 0x46, 0x00, 0x25, 0x9f, 0x4c, + 0xdf, 0xf8, 0x7c, 0x82, 0x29, 0xfa, 0x05, 0xf0, 0xc0, 0x07, 0x20, 0xd5, + 0x28, 0x46, 0xdb, 0xf7, 0x07, 0xfe, 0x06, 0x46, 0x00, 0x20, 0xb8, 0x55, + 0x08, 0xf5, 0xd8, 0x71, 0x44, 0xf8, 0x36, 0x10, 0x3a, 0x1d, 0x21, 0x1d, + 0x02, 0xeb, 0x86, 0x20, 0x41, 0xf8, 0x36, 0x00, 0x4f, 0xf4, 0x80, 0x61, + 0xe0, 0xf7, 0xb6, 0xf8, 0x6c, 0x21, 0x01, 0xfb, 0x06, 0xf0, 0x40, 0x44, + 0xe0, 0xf7, 0xb0, 0xf8, 0xf0, 0xb2, 0xe1, 0xf7, 0x95, 0xff, 0x01, 0x46, + 0x28, 0x46, 0x00, 0xf0, 0x1f, 0xf9, 0x6d, 0x1c, 0x08, 0x2d, 0xd7, 0xd3, + 0xbd, 0xe8, 0xf1, 0x83, 0x80, 0xb5, 0x00, 0xf0, 0x09, 0xf8, 0xe5, 0xf7, + 0x9c, 0xfd, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x03, 0xf8, 0xe5, 0xf7, + 0x81, 0xfd, 0x02, 0xbd, 0x00, 0x92, 0x0b, 0x46, 0x02, 0x46, 0x40, 0x21, + 0x82, 0x48, 0x70, 0x47, 0x2d, 0xe9, 0xf1, 0x4f, 0x82, 0xb0, 0x00, 0x24, + 0x89, 0x46, 0x01, 0x94, 0xe5, 0xf7, 0x1a, 0xfd, 0x00, 0x26, 0xdf, 0xf8, + 0xf8, 0xa1, 0xdf, 0xf8, 0xec, 0x81, 0x02, 0x98, 0xf0, 0x40, 0xc1, 0x07, + 0x71, 0xd5, 0x30, 0x46, 0xdb, 0xf7, 0xbe, 0xfd, 0x83, 0x46, 0xbb, 0xf1, + 0xff, 0x0f, 0x6a, 0xd0, 0x09, 0xeb, 0x8b, 0x20, 0x07, 0x1d, 0x4f, 0xf4, + 0x80, 0x61, 0x38, 0x46, 0xe0, 0xf7, 0x72, 0xf8, 0x6c, 0x20, 0x00, 0xfb, + 0x0b, 0xf0, 0x08, 0xeb, 0x00, 0x05, 0x28, 0x46, 0xf5, 0xf7, 0x9b, 0xff, + 0x01, 0x21, 0x30, 0x46, 0x03, 0xf0, 0xad, 0xf8, 0x01, 0xa9, 0x30, 0x46, + 0xda, 0xf7, 0x6c, 0xfd, 0xda, 0xf8, 0x0c, 0x00, 0x01, 0x99, 0x88, 0x42, + 0x30, 0x46, 0x06, 0xd2, 0x03, 0xf0, 0xcb, 0xf9, 0x01, 0x21, 0x30, 0x46, + 0x03, 0xf0, 0x6f, 0xfb, 0x07, 0xe0, 0x03, 0xf0, 0xc4, 0xf9, 0x3a, 0x46, + 0x08, 0xf5, 0xd8, 0x71, 0x30, 0x46, 0x03, 0xf0, 0xf2, 0xf9, 0x04, 0x00, + 0x2c, 0xd1, 0x01, 0x20, 0x09, 0xf8, 0x0b, 0x00, 0x00, 0x20, 0x07, 0xeb, + 0x80, 0x01, 0x05, 0xeb, 0x80, 0x03, 0x0a, 0x6b, 0x5a, 0x64, 0x40, 0x1c, + 0x03, 0x28, 0xf6, 0xd3, 0xb8, 0x6c, 0x28, 0x65, 0xf9, 0x6c, 0x69, 0x65, + 0x38, 0x6d, 0xa8, 0x65, 0x79, 0x6d, 0xe9, 0x65, 0x05, 0xf1, 0x64, 0x01, + 0xb8, 0x6d, 0x28, 0x66, 0x07, 0xf5, 0x77, 0x70, 0x82, 0x88, 0x0a, 0x80, + 0x00, 0x68, 0x48, 0x60, 0x00, 0x20, 0x07, 0xeb, 0x80, 0x01, 0x05, 0xeb, + 0x80, 0x02, 0x0b, 0x78, 0x13, 0x75, 0x40, 0x1c, 0x4b, 0x78, 0x53, 0x75, + 0x0c, 0x28, 0x89, 0x78, 0x91, 0x75, 0xf2, 0xd3, 0x00, 0x94, 0x33, 0x46, + 0x77, 0xa2, 0x06, 0x21, 0x03, 0x20, 0xdb, 0xf7, 0x50, 0xfe, 0x21, 0x46, + 0x28, 0x46, 0xf5, 0xf7, 0x48, 0xff, 0x00, 0x21, 0x30, 0x46, 0x03, 0xf0, + 0x56, 0xf8, 0x76, 0x1c, 0x08, 0x2e, 0x86, 0xd3, 0x20, 0x46, 0xbd, 0xe8, + 0xfe, 0x8f, 0xf8, 0xb5, 0x0c, 0x46, 0x15, 0x46, 0x1f, 0x46, 0xf5, 0xf7, + 0x4b, 0xff, 0xdb, 0xf7, 0x41, 0xfd, 0x00, 0x26, 0xff, 0x28, 0x1a, 0xd0, + 0x6c, 0x21, 0x36, 0x4a, 0x48, 0x43, 0x11, 0x18, 0x1f, 0xb1, 0x02, 0x2f, + 0x0b, 0xd0, 0x0a, 0xd3, 0x0b, 0xe0, 0x14, 0x27, 0x28, 0x68, 0xb8, 0x42, + 0x0a, 0xd3, 0x3a, 0x46, 0x20, 0x46, 0xcd, 0xf7, 0xe1, 0xf8, 0x2f, 0x60, + 0x09, 0xe0, 0x6c, 0x27, 0xf4, 0xe7, 0x4f, 0xf6, 0x2a, 0x76, 0x04, 0xe0, + 0x4f, 0xf6, 0x26, 0x76, 0x01, 0xe0, 0x4f, 0xf6, 0x2b, 0x76, 0x30, 0x46, + 0xf2, 0xbd, 0x2d, 0xe9, 0xf0, 0x47, 0x08, 0x9f, 0x0a, 0x9e, 0x98, 0x46, + 0xcc, 0xb2, 0x00, 0x25, 0x63, 0x1e, 0x3d, 0x60, 0x03, 0xd0, 0x5b, 0x1e, + 0x01, 0x2b, 0x06, 0xd9, 0x39, 0xe0, 0x41, 0xf2, 0x04, 0x01, 0x30, 0x46, + 0xdf, 0xf7, 0xcc, 0xff, 0x35, 0xe0, 0x00, 0x21, 0x00, 0x23, 0x20, 0xfa, + 0x03, 0xfc, 0x5f, 0xea, 0xcc, 0x7c, 0x44, 0xbf, 0x49, 0x1c, 0x99, 0x46, + 0x5b, 0x1c, 0x08, 0x2b, 0xf5, 0xd3, 0x01, 0x29, 0x22, 0xd1, 0x92, 0x46, + 0x48, 0x46, 0xdb, 0xf7, 0xf9, 0xfc, 0x02, 0x2c, 0x06, 0xeb, 0x80, 0x26, + 0x12, 0xd1, 0xb8, 0xf1, 0x30, 0x0f, 0x18, 0xbf, 0x40, 0xf6, 0x0a, 0x15, + 0x19, 0xd1, 0x30, 0x22, 0x51, 0x46, 0x30, 0x1d, 0xcd, 0xf7, 0x9e, 0xf8, + 0x01, 0x23, 0x32, 0x1d, 0x0c, 0x49, 0x48, 0x46, 0x03, 0xf0, 0x32, 0xfb, + 0x05, 0x46, 0x0c, 0xe0, 0x30, 0x22, 0x31, 0x1d, 0x50, 0x46, 0xcd, 0xf7, + 0x91, 0xf8, 0x30, 0x20, 0x38, 0x60, 0x04, 0xe0, 0x40, 0xf6, 0x0b, 0x15, + 0x01, 0xe0, 0x4f, 0xf6, 0x27, 0x75, 0x28, 0x46, 0xbd, 0xe8, 0xf0, 0x87, + 0x54, 0x74, 0x02, 0x21, 0xc0, 0x8b, 0x00, 0x21, 0x70, 0x8d, 0x00, 0x21, + 0xf4, 0x8a, 0x00, 0x21, 0x7f, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0xc0, 0xb2, + 0xe1, 0xf7, 0x6c, 0xfe, 0x06, 0x46, 0x02, 0xa9, 0x20, 0x46, 0xda, 0xf7, + 0x89, 0xfc, 0xae, 0x42, 0x4b, 0xd1, 0x02, 0xa9, 0x20, 0x46, 0x03, 0xf0, + 0x09, 0xf9, 0x00, 0x28, 0x3a, 0xd0, 0x1b, 0x22, 0x06, 0x21, 0x20, 0x46, + 0x02, 0xf0, 0x48, 0xff, 0x1b, 0x22, 0x07, 0x21, 0x20, 0x46, 0x02, 0xf0, + 0x43, 0xff, 0x02, 0x98, 0x03, 0xa9, 0x03, 0xf0, 0xbe, 0xfe, 0x05, 0x46, + 0x0d, 0xf1, 0x05, 0x00, 0x00, 0x90, 0x01, 0xab, 0x03, 0x98, 0x0d, 0xf1, + 0x06, 0x02, 0x0d, 0xf1, 0x07, 0x01, 0x03, 0xf0, 0xdb, 0xfe, 0x9d, 0xf8, + 0x06, 0x20, 0x06, 0x21, 0x00, 0xf0, 0x29, 0xf8, 0x9d, 0xf8, 0x07, 0x20, + 0x00, 0xf0, 0x24, 0xf8, 0x9d, 0xf8, 0x05, 0x20, 0x00, 0x21, 0x00, 0xf0, + 0x20, 0xf8, 0x9d, 0xf8, 0x04, 0x00, 0x40, 0xea, 0x80, 0x01, 0xc9, 0xb2, + 0x20, 0x46, 0x02, 0xf0, 0x6e, 0xff, 0x2a, 0x46, 0x06, 0x21, 0x20, 0x46, + 0x02, 0xf0, 0xe0, 0xfe, 0x2a, 0x46, 0x07, 0x21, 0x20, 0x46, 0x02, 0xf0, + 0xdb, 0xfe, 0x7f, 0xbd, 0x07, 0x22, 0x00, 0xf0, 0x09, 0xf8, 0x00, 0x22, + 0x00, 0x21, 0x00, 0xf0, 0x06, 0xf8, 0x00, 0x21, 0x20, 0x46, 0x02, 0xf0, + 0x58, 0xff, 0x7f, 0xbd, 0x08, 0x21, 0x20, 0x46, 0x02, 0xf0, 0x39, 0xbf, + 0x54, 0x78, 0x48, 0x52, 0x4d, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, + 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x58, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xf3, 0xc7, 0x52, 0x7e, 0x3a, 0x1d, 0xdd, 0xc1, 0x17, 0x00, 0x02, + 0xd2, 0xf1, 0x20, 0x02, 0x40, 0xf0, 0x00, 0x40, 0x03, 0xdd, 0xd0, 0x40, + 0x08, 0x44, 0x48, 0x40, 0x70, 0x47, 0x20, 0x32, 0x0a, 0xdd, 0x20, 0xfa, + 0x02, 0xf3, 0xc2, 0xf1, 0x20, 0x02, 0x90, 0x40, 0x48, 0x40, 0x4b, 0x40, + 0x40, 0x1a, 0x63, 0xeb, 0x01, 0x01, 0x70, 0x47, 0x41, 0x32, 0x03, 0xd0, + 0xc8, 0x43, 0x80, 0xf0, 0x00, 0x41, 0x70, 0x47, 0x00, 0x20, 0x00, 0x21, + 0x70, 0x47, 0x00, 0x00, 0x10, 0xee, 0x10, 0x0a, 0xf5, 0xee, 0x40, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x0b, 0xd6, 0x18, 0xb9, 0x04, 0xbf, 0xb0, 0xee, + 0x60, 0x0a, 0x06, 0xe0, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0xb8, 0xbf, 0xb0, 0xee, 0x60, 0x0a, 0x70, 0x47, 0xcb, 0x17, 0xc0, 0x18, + 0x59, 0x41, 0x58, 0x40, 0x59, 0x40, 0xdb, 0x07, 0xb1, 0xb1, 0xb1, 0xfa, + 0x81, 0xf2, 0x41, 0x40, 0x90, 0x40, 0xc2, 0xf1, 0x20, 0x02, 0x61, 0xfa, + 0x02, 0xf1, 0x81, 0xea, 0x00, 0x00, 0x18, 0xbf, 0x40, 0xf0, 0x01, 0x00, + 0x02, 0xf1, 0x9d, 0x01, 0x02, 0x06, 0x43, 0xea, 0xc1, 0x51, 0x72, 0xf1, + 0x00, 0x42, 0x41, 0xeb, 0x10, 0x20, 0x70, 0x47, 0x58, 0xb1, 0xb0, 0xfa, + 0x80, 0xf2, 0x90, 0x40, 0xc2, 0xf1, 0x9d, 0x02, 0x01, 0x06, 0x43, 0xea, + 0xc2, 0x52, 0x71, 0xf1, 0x00, 0x41, 0x42, 0xeb, 0x10, 0x20, 0x70, 0x47, + 0xc2, 0x6b, 0x52, 0x1e, 0x91, 0x42, 0x3a, 0xbf, 0x40, 0x6b, 0x09, 0x18, + 0x81, 0x6b, 0x08, 0x46, 0x70, 0x47, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x41, + 0x0c, 0x46, 0x04, 0xf1, 0x28, 0x05, 0x8a, 0xb0, 0x80, 0x46, 0xe8, 0x68, + 0x29, 0x7e, 0xcd, 0xf8, 0x24, 0x80, 0x00, 0x28, 0xaa, 0x78, 0x08, 0x92, + 0x0c, 0xbf, 0x4f, 0xf4, 0x80, 0x70, 0x00, 0x20, 0x49, 0x1e, 0x89, 0x41, + 0x00, 0x23, 0x07, 0x93, 0xc9, 0x0f, 0x27, 0x7f, 0x06, 0x97, 0x03, 0x23, + 0x2a, 0x6a, 0x02, 0x90, 0x00, 0x27, 0x05, 0x92, 0x04, 0x93, 0x03, 0x97, + 0x01, 0x91, 0xb7, 0xee, 0x00, 0x1a, 0xa8, 0x7e, 0x00, 0x90, 0x9f, 0xed, + 0x6c, 0x0a, 0x6b, 0x7e, 0xa8, 0x68, 0xd4, 0xed, 0x08, 0x0a, 0x00, 0x22, + 0x01, 0x21, 0xf9, 0xf7, 0x99, 0xfc, 0x08, 0xf1, 0x20, 0x01, 0x02, 0x91, + 0x01, 0x97, 0x00, 0x21, 0x6a, 0x78, 0x00, 0x92, 0xa3, 0x8c, 0x2a, 0x78, + 0xa8, 0x68, 0xf9, 0xf7, 0x61, 0xfb, 0x28, 0x7e, 0x18, 0xb3, 0x61, 0x69, + 0xa8, 0x68, 0xf9, 0xf7, 0x05, 0xfc, 0x28, 0x77, 0x08, 0xf1, 0x30, 0x01, + 0x02, 0x91, 0x01, 0x90, 0x00, 0x97, 0xe3, 0x8c, 0x2a, 0x78, 0xa8, 0x68, + 0x01, 0x21, 0xf9, 0xf7, 0x4f, 0xfb, 0x28, 0x7e, 0x88, 0xb1, 0x08, 0xf1, + 0x88, 0x01, 0x07, 0x91, 0x06, 0x97, 0x01, 0x21, 0x05, 0x97, 0x04, 0x97, + 0x03, 0x91, 0x02, 0x97, 0x01, 0x91, 0x00, 0x91, 0x63, 0x69, 0xa8, 0x68, + 0x00, 0x22, 0x08, 0xf1, 0x30, 0x01, 0xf9, 0xf7, 0x54, 0xfb, 0x00, 0x26, + 0x1e, 0xe0, 0x04, 0xeb, 0x80, 0x02, 0x01, 0x21, 0x53, 0x68, 0x22, 0x18, + 0x10, 0x7c, 0x08, 0xb1, 0x01, 0x20, 0x5b, 0x42, 0xfa, 0xb2, 0x4f, 0xf0, + 0x18, 0x0c, 0x1c, 0xfb, 0x02, 0xf2, 0x42, 0x44, 0x40, 0x32, 0x07, 0x92, + 0x06, 0x96, 0x05, 0x90, 0x04, 0x96, 0x01, 0x22, 0x03, 0x92, 0x02, 0x96, + 0x01, 0x91, 0x00, 0x91, 0x08, 0xf1, 0x20, 0x01, 0xa8, 0x68, 0xf9, 0xf7, + 0x34, 0xfb, 0x7f, 0x1c, 0x69, 0x69, 0xf8, 0xb2, 0xc9, 0xb2, 0x88, 0x42, + 0x0a, 0xd2, 0xf9, 0xb2, 0x20, 0x46, 0xff, 0xf7, 0x6b, 0xff, 0x21, 0x78, + 0x88, 0x42, 0xd4, 0xd3, 0x00, 0x21, 0x00, 0x20, 0x00, 0x23, 0xd9, 0xe7, + 0xa8, 0x68, 0x41, 0x46, 0x0a, 0xb0, 0xbd, 0xe8, 0xf0, 0x41, 0xf9, 0xf7, + 0x93, 0xbc, 0x00, 0x00, 0xf8, 0xb5, 0x0d, 0x46, 0x2d, 0xed, 0x02, 0x8b, + 0x04, 0x46, 0x05, 0xf1, 0x2c, 0x07, 0xaa, 0xb0, 0xc0, 0xb2, 0x00, 0x21, + 0x05, 0xf5, 0xbc, 0x76, 0x78, 0x60, 0x39, 0x70, 0xb2, 0x61, 0x01, 0x20, + 0x38, 0x75, 0xb9, 0x60, 0x03, 0x20, 0x38, 0x61, 0x02, 0x21, 0xf9, 0x60, + 0x28, 0x78, 0x03, 0x28, 0x94, 0xbf, 0x00, 0x20, 0x01, 0x20, 0x78, 0x75, + 0x00, 0x20, 0xb8, 0x75, 0x29, 0x78, 0x03, 0x29, 0x98, 0xbf, 0x01, 0x20, + 0xf8, 0x75, 0xa8, 0x69, 0xb0, 0xf5, 0x80, 0x4f, 0x00, 0xee, 0x10, 0x0a, + 0x38, 0xbf, 0x9f, 0xed, 0x1e, 0x8a, 0x11, 0xd3, 0xf8, 0xee, 0x40, 0x8a, + 0x9f, 0xed, 0x1c, 0x0a, 0x88, 0xee, 0x80, 0x0a, 0xea, 0xf7, 0x5a, 0xfc, + 0xbc, 0xee, 0xc0, 0x8a, 0xb8, 0xee, 0x48, 0x0a, 0x88, 0xee, 0x80, 0x0a, + 0xea, 0xf7, 0x52, 0xfc, 0xbc, 0xee, 0xc0, 0x0a, 0x87, 0xed, 0x08, 0x8a, + 0x87, 0xed, 0x07, 0x0a, 0x00, 0x20, 0xc5, 0xf8, 0xf4, 0x00, 0x48, 0x21, + 0x05, 0xf5, 0x80, 0x70, 0xdf, 0xf7, 0x8a, 0xf8, 0x30, 0x21, 0x05, 0xf5, + 0xa4, 0x70, 0xdf, 0xf7, 0x85, 0xf8, 0x00, 0x20, 0xc6, 0xe9, 0x00, 0x00, + 0xc6, 0xe9, 0x02, 0x00, 0xc6, 0xe9, 0x04, 0x00, 0x29, 0x46, 0x68, 0x46, + 0xff, 0xf7, 0x0c, 0xff, 0x2b, 0x46, 0x6a, 0x46, 0x00, 0x21, 0x20, 0x46, + 0xfa, 0xf7, 0x85, 0xf8, 0x2a, 0xb0, 0xbd, 0xec, 0x02, 0x8b, 0xf2, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x7f, 0x46, + 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, 0x0e, 0x46, 0x88, 0xb0, + 0x00, 0x21, 0xfa, 0xf7, 0xc7, 0xfa, 0x00, 0x28, 0x83, 0x46, 0x40, 0xf0, + 0xc5, 0x80, 0x06, 0xf5, 0xbc, 0x7a, 0xda, 0xf8, 0x18, 0x90, 0xd6, 0xf8, + 0xf4, 0x00, 0xc9, 0xf8, 0x04, 0x00, 0x06, 0xf1, 0x28, 0x04, 0x31, 0x78, + 0x89, 0xf8, 0x08, 0x10, 0x06, 0xa9, 0x20, 0x78, 0x03, 0x91, 0x05, 0xaa, + 0x04, 0xab, 0x02, 0x92, 0x01, 0x93, 0x02, 0x46, 0x21, 0x6a, 0x00, 0x91, + 0x00, 0x27, 0xf3, 0x8c, 0xb1, 0x8c, 0xf9, 0xf7, 0x63, 0xfd, 0x94, 0xed, + 0x09, 0x0a, 0xdd, 0xed, 0x04, 0x0a, 0x9d, 0xed, 0x06, 0x1a, 0xb8, 0xee, + 0x40, 0x0a, 0xc0, 0xee, 0x80, 0x0a, 0xcd, 0xed, 0x04, 0x0a, 0x81, 0xee, + 0x00, 0x1a, 0xdd, 0xed, 0x05, 0x0a, 0x8d, 0xed, 0x06, 0x1a, 0x80, 0xee, + 0x80, 0x0a, 0x8d, 0xed, 0x05, 0x0a, 0xbf, 0xee, 0x00, 0x8a, 0x0b, 0xe0, + 0x05, 0xeb, 0x80, 0x01, 0x40, 0x1c, 0x91, 0xed, 0x03, 0x0a, 0x20, 0xee, + 0x08, 0x0a, 0x81, 0xed, 0x03, 0x0a, 0xb8, 0x42, 0xf4, 0xd3, 0x7f, 0x1c, + 0x30, 0x78, 0x87, 0x42, 0x1c, 0xd2, 0x0c, 0x21, 0x79, 0x43, 0x4f, 0xf0, + 0x00, 0x08, 0x09, 0xeb, 0x01, 0x05, 0x10, 0xe0, 0x18, 0x22, 0x7a, 0x43, + 0x32, 0x44, 0x02, 0xeb, 0xc8, 0x03, 0x9d, 0xed, 0x04, 0x0a, 0xd3, 0xe9, + 0x40, 0x01, 0xf9, 0xf7, 0x95, 0xfc, 0x05, 0xeb, 0x88, 0x02, 0x08, 0xf1, + 0x01, 0x08, 0x82, 0xed, 0x03, 0x0a, 0x30, 0x78, 0x80, 0x45, 0xeb, 0xd3, + 0x00, 0x20, 0xdc, 0xe7, 0x35, 0x46, 0x00, 0x27, 0x4e, 0x46, 0x20, 0xe0, + 0x05, 0xeb, 0x07, 0x10, 0x00, 0xf5, 0xa4, 0x78, 0x9d, 0xed, 0x05, 0x0a, + 0xd8, 0xe9, 0x00, 0x01, 0x06, 0xeb, 0xc7, 0x09, 0xf9, 0xf7, 0x7a, 0xfc, + 0x89, 0xed, 0x0c, 0x0a, 0xd8, 0xe9, 0x02, 0x01, 0x9d, 0xed, 0x05, 0x0a, + 0xf9, 0xf7, 0x72, 0xfc, 0x20, 0xee, 0x08, 0x0a, 0x89, 0xed, 0x0d, 0x0a, + 0x23, 0x7f, 0xa0, 0x68, 0x09, 0xf1, 0x34, 0x02, 0x09, 0xf1, 0x30, 0x01, + 0xf9, 0xf7, 0xd0, 0xfa, 0x7f, 0x1c, 0x28, 0x78, 0x87, 0x42, 0xdb, 0xd3, + 0xda, 0xe9, 0x00, 0x01, 0x9d, 0xed, 0x04, 0x0a, 0xf9, 0xf7, 0x5c, 0xfc, + 0x86, 0xed, 0x12, 0x0a, 0xda, 0xe9, 0x02, 0x01, 0x9d, 0xed, 0x04, 0x0a, + 0xf9, 0xf7, 0x54, 0xfc, 0x86, 0xed, 0x13, 0x0a, 0xda, 0xe9, 0x04, 0x01, + 0x9d, 0xed, 0x06, 0x0a, 0xf9, 0xf7, 0x4c, 0xfc, 0x86, 0xed, 0x14, 0x0a, + 0xa0, 0x68, 0xdb, 0xf7, 0x81, 0xf8, 0x00, 0xee, 0x10, 0x0a, 0xa0, 0x68, + 0xb8, 0xee, 0x40, 0x8a, 0x00, 0x21, 0xf9, 0xf7, 0xe6, 0xf8, 0xd5, 0xed, + 0x01, 0x0a, 0xf8, 0xee, 0xe0, 0x0a, 0xc0, 0xee, 0x88, 0x0a, 0xc6, 0xed, + 0x00, 0x0a, 0x86, 0xed, 0x15, 0x8a, 0x00, 0xee, 0x10, 0x0a, 0xa8, 0x8c, + 0x01, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xb8, 0xee, 0x41, 0x1a, + 0x80, 0xee, 0x01, 0x1a, 0x88, 0xee, 0x01, 0x1a, 0x86, 0xed, 0x16, 0x1a, + 0x08, 0xb0, 0x58, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, + 0xf8, 0xf7, 0xc2, 0xbf, 0x2d, 0xe9, 0xfe, 0x4f, 0x0f, 0x46, 0x91, 0x46, + 0x4f, 0xf4, 0x80, 0x72, 0x49, 0x46, 0x01, 0x20, 0xf9, 0xf7, 0x5f, 0xfb, + 0x07, 0xf1, 0x2c, 0x04, 0x00, 0x28, 0x20, 0x70, 0x07, 0xf1, 0xd8, 0x08, + 0x06, 0xd1, 0x49, 0x46, 0x01, 0x20, 0xf9, 0xf7, 0x76, 0xfb, 0x10, 0xb9, + 0x03, 0x20, 0x20, 0x70, 0xd7, 0xe0, 0xa0, 0x62, 0x20, 0x7d, 0xf0, 0xb1, + 0x00, 0x26, 0x17, 0xe0, 0xf1, 0xb2, 0x38, 0x46, 0xff, 0xf7, 0xf6, 0xfd, + 0x39, 0x78, 0x81, 0x42, 0x0f, 0xd3, 0x07, 0xf1, 0xb0, 0x02, 0x07, 0xf1, + 0xa8, 0x01, 0x02, 0xeb, 0x00, 0x12, 0x01, 0xeb, 0x00, 0x10, 0x01, 0x92, + 0x00, 0x90, 0x03, 0x23, 0xf2, 0xb2, 0x49, 0x46, 0x01, 0x20, 0xf9, 0xf7, + 0x6f, 0xfb, 0x76, 0x1c, 0x21, 0x69, 0xf0, 0xb2, 0xc9, 0xb2, 0x88, 0x42, + 0xe2, 0xd3, 0x00, 0x25, 0x18, 0x26, 0x27, 0xe0, 0x5f, 0xfa, 0x8b, 0xf1, + 0x38, 0x46, 0xff, 0xf7, 0xd5, 0xfd, 0x39, 0x78, 0x88, 0x42, 0x16, 0xd2, + 0x07, 0xeb, 0xca, 0x02, 0x06, 0xfb, 0x00, 0xf3, 0x1a, 0x44, 0x02, 0xf1, + 0x60, 0x01, 0x06, 0xfb, 0x0a, 0xfc, 0x01, 0x91, 0xbc, 0x44, 0x0c, 0xeb, + 0xc0, 0x00, 0x00, 0xf1, 0x60, 0x01, 0x00, 0x91, 0x5f, 0xfa, 0x8b, 0xf3, + 0xea, 0xb2, 0x49, 0x46, 0x01, 0x20, 0xf9, 0xf7, 0x47, 0xfb, 0x0b, 0xf1, + 0x01, 0x0b, 0x21, 0x69, 0x5f, 0xfa, 0x8b, 0xf0, 0xc9, 0xb2, 0x88, 0x42, + 0xd8, 0xd3, 0x6d, 0x1c, 0x21, 0x69, 0xe8, 0xb2, 0xc9, 0xb2, 0x88, 0x42, + 0x15, 0xd2, 0xe9, 0xb2, 0x38, 0x46, 0xff, 0xf7, 0xa9, 0xfd, 0x82, 0x46, + 0x38, 0x78, 0x82, 0x45, 0xf1, 0xd2, 0xea, 0xb2, 0x49, 0x46, 0x01, 0x20, + 0xf9, 0xf7, 0x17, 0xfb, 0x07, 0xf1, 0x60, 0x02, 0x02, 0xeb, 0x4a, 0x13, + 0x05, 0xf1, 0x01, 0x0b, 0xc3, 0xe9, 0x00, 0x01, 0xdd, 0xe7, 0x20, 0x7d, + 0x30, 0xb1, 0x03, 0x22, 0x49, 0x46, 0x01, 0x20, 0xf9, 0xf7, 0x07, 0xfb, + 0xc8, 0xe9, 0x04, 0x01, 0x07, 0xf1, 0xe0, 0x00, 0x00, 0x90, 0x43, 0x46, + 0x00, 0x22, 0x49, 0x46, 0x01, 0x20, 0xf9, 0xf7, 0x64, 0xfb, 0xe0, 0x7d, + 0x00, 0x28, 0x5a, 0xd0, 0x4f, 0xf0, 0x00, 0x09, 0x13, 0xe0, 0x06, 0xfb, + 0x09, 0xf0, 0x38, 0x18, 0x00, 0xeb, 0xcc, 0x0e, 0xde, 0xe9, 0x40, 0x01, + 0xde, 0xe9, 0x18, 0x23, 0x80, 0x18, 0x59, 0x41, 0xce, 0xe9, 0x40, 0x01, + 0x0c, 0xf1, 0x01, 0x0c, 0x38, 0x78, 0x84, 0x45, 0xed, 0xd3, 0x09, 0xf1, + 0x01, 0x09, 0x38, 0x78, 0x81, 0x45, 0x4f, 0xf0, 0x00, 0x0c, 0x18, 0xd2, + 0xf4, 0xe7, 0x07, 0xeb, 0x0c, 0x10, 0x00, 0xf1, 0xa8, 0x05, 0x00, 0xf5, + 0xa4, 0x7e, 0xd5, 0xe9, 0x00, 0x01, 0xde, 0xe9, 0x00, 0x23, 0x10, 0x18, + 0x59, 0x41, 0xce, 0xe9, 0x00, 0x01, 0xde, 0xe9, 0x02, 0x62, 0xd5, 0xe9, + 0x02, 0x01, 0x30, 0x18, 0x51, 0x41, 0xce, 0xe9, 0x02, 0x01, 0x0c, 0xf1, + 0x01, 0x0c, 0x38, 0x78, 0x84, 0x45, 0xe4, 0xd3, 0x07, 0xf5, 0xbc, 0x70, + 0xd8, 0xe9, 0x00, 0x69, 0xd0, 0xe9, 0x00, 0x23, 0x96, 0x19, 0x43, 0xeb, + 0x09, 0x09, 0xc0, 0xe9, 0x00, 0x69, 0xd0, 0xe9, 0x02, 0xab, 0xd8, 0xe9, + 0x02, 0x23, 0x1a, 0xeb, 0x02, 0x02, 0x4b, 0xeb, 0x03, 0x03, 0xc0, 0xe9, + 0x02, 0x23, 0xd0, 0xe9, 0x04, 0x61, 0xd8, 0xe9, 0x04, 0x23, 0xb2, 0x18, + 0x4b, 0x41, 0xc0, 0xe9, 0x04, 0x23, 0xd8, 0xf8, 0x1c, 0x10, 0xa0, 0x6a, + 0x41, 0x18, 0xc8, 0xf8, 0x1c, 0x10, 0x39, 0x78, 0xe0, 0x68, 0x49, 0x1e, + 0x88, 0x42, 0x02, 0xd2, 0x40, 0x1c, 0xe0, 0x60, 0x1e, 0xe0, 0xa1, 0x68, + 0x20, 0x69, 0x41, 0x18, 0xa1, 0x60, 0x3a, 0x78, 0x91, 0x42, 0x10, 0xd3, + 0x01, 0x20, 0x20, 0x75, 0x00, 0x21, 0xa1, 0x60, 0x03, 0x20, 0x20, 0x61, + 0x02, 0x21, 0xe1, 0x60, 0x38, 0x78, 0x03, 0x28, 0x94, 0xbf, 0x00, 0x20, + 0x01, 0x20, 0x60, 0x75, 0x00, 0x20, 0xa0, 0x75, 0x0a, 0xe0, 0x00, 0x21, + 0x21, 0x75, 0x04, 0x20, 0xa1, 0x68, 0x20, 0x61, 0xc9, 0x1c, 0xe1, 0x60, + 0x00, 0x20, 0x01, 0x21, 0x60, 0x75, 0xa1, 0x75, 0x39, 0x78, 0xe0, 0x68, + 0x88, 0x42, 0x07, 0xd2, 0xa2, 0x68, 0x20, 0x69, 0x82, 0x18, 0x8a, 0x42, + 0x80, 0x41, 0xc0, 0x43, 0xc0, 0x0f, 0x00, 0xe0, 0x01, 0x20, 0xe0, 0x75, + 0xb9, 0x69, 0xd8, 0xf8, 0x1c, 0x00, 0x88, 0x42, 0x07, 0xd2, 0x20, 0x78, + 0x28, 0xb9, 0x02, 0x98, 0x39, 0x46, 0xff, 0xf7, 0xed, 0xfc, 0x00, 0x20, + 0x00, 0xe0, 0x01, 0x20, 0xbd, 0xe8, 0xfe, 0x8f, 0x0a, 0x46, 0x00, 0x21, + 0xf9, 0xf7, 0x35, 0xbe, 0x00, 0x21, 0xf9, 0xf7, 0x44, 0xbe, 0x00, 0x00, + 0xef, 0xf3, 0x09, 0x80, 0xbf, 0xf3, 0x6f, 0x8f, 0x26, 0x4b, 0x1a, 0x68, + 0x1e, 0xf0, 0x10, 0x0f, 0x08, 0xbf, 0x20, 0xed, 0x10, 0x8a, 0x20, 0xe9, + 0xf0, 0x4f, 0x10, 0x60, 0x09, 0xb4, 0x4f, 0xf0, 0x30, 0x00, 0x80, 0xf3, + 0x11, 0x88, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0xe9, 0xf7, + 0xcb, 0xfa, 0x4f, 0xf0, 0x00, 0x00, 0x80, 0xf3, 0x11, 0x88, 0x09, 0xbc, + 0x19, 0x68, 0x08, 0x68, 0xb0, 0xe8, 0xf0, 0x4f, 0x1e, 0xf0, 0x10, 0x0f, + 0x08, 0xbf, 0xb0, 0xec, 0x10, 0x8a, 0x80, 0xf3, 0x09, 0x88, 0xbf, 0xf3, + 0x6f, 0x8f, 0x70, 0x47, 0x12, 0x4b, 0x19, 0x68, 0x08, 0x68, 0xb0, 0xe8, + 0xf0, 0x4f, 0x80, 0xf3, 0x09, 0x88, 0xbf, 0xf3, 0x6f, 0x8f, 0x4f, 0xf0, + 0x00, 0x00, 0x80, 0xf3, 0x11, 0x88, 0x70, 0x47, 0x0c, 0x48, 0x00, 0x68, + 0x00, 0x68, 0x80, 0xf3, 0x08, 0x88, 0x4f, 0xf0, 0x00, 0x00, 0x80, 0xf3, + 0x14, 0x88, 0x62, 0xb6, 0x61, 0xb6, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, + 0x6f, 0x8f, 0x00, 0xdf, 0xdf, 0xf8, 0x14, 0x00, 0x01, 0x68, 0x41, 0xf4, + 0x70, 0x01, 0x01, 0x60, 0x70, 0x47, 0x00, 0x00, 0xf0, 0x65, 0x02, 0x21, + 0x08, 0xed, 0x00, 0xe0, 0x88, 0xed, 0x00, 0xe0, 0x80, 0xb5, 0x00, 0xb9, + 0x06, 0xa0, 0x05, 0x49, 0x0b, 0x68, 0x1b, 0xb1, 0x22, 0x22, 0x00, 0x21, + 0x98, 0x47, 0x01, 0xe0, 0x04, 0xf0, 0xd2, 0xf9, 0x22, 0x20, 0x02, 0xbd, + 0x34, 0x76, 0x02, 0x21, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, + 0x6e, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x3a, 0x20, + 0x62, 0x61, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x00, + 0x10, 0xb5, 0x14, 0x46, 0x00, 0xf0, 0x02, 0xf8, 0x22, 0x60, 0x10, 0xbd, + 0xc1, 0xf3, 0x0a, 0x53, 0x43, 0xb1, 0x4a, 0x00, 0x12, 0xf5, 0x00, 0x1f, + 0x28, 0xd2, 0xa3, 0xf2, 0xfe, 0x32, 0xa1, 0xeb, 0x02, 0x51, 0x70, 0x47, + 0x50, 0xea, 0x41, 0x0c, 0x20, 0xd0, 0x01, 0xf0, 0x00, 0x4c, 0x31, 0xea, + 0x0c, 0x01, 0xb1, 0xfa, 0x81, 0xf2, 0x04, 0xbf, 0xb0, 0xfa, 0x80, 0xf3, + 0xd2, 0x18, 0x0b, 0x3a, 0xb2, 0xf1, 0x20, 0x03, 0x2c, 0xbf, 0x00, 0xfa, + 0x03, 0xf1, 0x91, 0x40, 0x41, 0xea, 0x0c, 0x01, 0x3e, 0xbf, 0xc2, 0xf1, + 0x20, 0x0c, 0x20, 0xfa, 0x0c, 0xf3, 0x19, 0x43, 0x90, 0x40, 0x52, 0x42, + 0x40, 0xf2, 0xfd, 0x33, 0xd2, 0x1a, 0x01, 0xeb, 0x03, 0x51, 0x70, 0x47, + 0x00, 0x22, 0x70, 0x47, 0xf0, 0xb5, 0x40, 0xf2, 0xff, 0x75, 0x81, 0xea, + 0x03, 0x0c, 0x0c, 0xf0, 0x00, 0x4c, 0x15, 0xea, 0x11, 0x54, 0x1d, 0xbf, + 0x15, 0xea, 0x13, 0x57, 0xac, 0x42, 0xaf, 0x42, 0xe5, 0xe0, 0xbc, 0x41, + 0xc1, 0xf3, 0x13, 0x01, 0xc3, 0xf3, 0x13, 0x03, 0x80, 0x1a, 0x99, 0x41, + 0x43, 0xf4, 0x80, 0x13, 0x04, 0xd2, 0x64, 0x1e, 0x40, 0x00, 0x49, 0x41, + 0x80, 0x18, 0x59, 0x41, 0xc9, 0x02, 0x41, 0xea, 0x50, 0x51, 0xb1, 0xfb, + 0xf3, 0xf6, 0x03, 0xfb, 0x16, 0x11, 0xa2, 0xfb, 0x06, 0x75, 0xd7, 0xeb, + 0xc0, 0x20, 0xa9, 0x41, 0x02, 0xd2, 0x76, 0x1e, 0x80, 0x18, 0x59, 0x41, + 0xc9, 0x02, 0x41, 0xea, 0x50, 0x51, 0xb1, 0xfb, 0xf3, 0xfe, 0x03, 0xfb, + 0x1e, 0x11, 0xa2, 0xfb, 0x0e, 0x75, 0xd7, 0xeb, 0xc0, 0x20, 0xa9, 0x41, + 0x03, 0xd2, 0xae, 0xf1, 0x01, 0x0e, 0x80, 0x18, 0x59, 0x41, 0x89, 0x02, + 0x41, 0xea, 0x90, 0x51, 0x76, 0x05, 0x46, 0xea, 0x8e, 0x2e, 0xb1, 0xfb, + 0xf3, 0xf6, 0x03, 0xfb, 0x16, 0x11, 0xa2, 0xfb, 0x06, 0x75, 0xd7, 0xeb, + 0x80, 0x20, 0xa9, 0x41, 0x02, 0xd2, 0x76, 0x1e, 0x80, 0x18, 0x59, 0x41, + 0xc9, 0x02, 0x41, 0xea, 0x50, 0x51, 0x4e, 0xea, 0x06, 0x0e, 0xb1, 0xfb, + 0xf3, 0xf6, 0x03, 0xfb, 0x16, 0x11, 0xa2, 0xfb, 0x06, 0x75, 0xd7, 0xeb, + 0xc0, 0x20, 0xa9, 0x41, 0x02, 0xd2, 0x76, 0x1e, 0x80, 0x18, 0x59, 0x41, + 0xc9, 0x02, 0x41, 0xea, 0x50, 0x51, 0xb1, 0xfb, 0xf3, 0xf7, 0x03, 0xfb, + 0x17, 0x11, 0xa2, 0xfb, 0x07, 0x35, 0xd3, 0xeb, 0xc0, 0x20, 0xa9, 0x41, + 0x67, 0xf1, 0x00, 0x07, 0x0c, 0xbf, 0x00, 0x42, 0x47, 0xf0, 0x01, 0x07, + 0x66, 0xf3, 0xd5, 0x27, 0x4f, 0xea, 0x1e, 0x31, 0xb8, 0x08, 0x14, 0xf5, + 0x80, 0x64, 0x12, 0xdd, 0xbd, 0x07, 0x75, 0xf1, 0x00, 0x42, 0x50, 0xeb, + 0x0e, 0x50, 0x51, 0xeb, 0x04, 0x51, 0x11, 0xf5, 0x80, 0x1f, 0x5c, 0xbf, + 0x41, 0xea, 0x0c, 0x01, 0xf0, 0xbd, 0x4c, 0xf0, 0x7f, 0x61, 0x41, 0xf0, + 0xe0, 0x41, 0x00, 0x20, 0xf0, 0xbd, 0xbd, 0x07, 0x6d, 0x08, 0x40, 0xea, + 0x0e, 0x50, 0x41, 0xf4, 0x80, 0x11, 0xd4, 0xf1, 0x01, 0x04, 0xb4, 0xf1, + 0x20, 0x06, 0x0a, 0xda, 0xc4, 0xf1, 0x20, 0x06, 0x02, 0x00, 0xe0, 0x40, + 0x01, 0xfa, 0x06, 0xf3, 0xe1, 0x40, 0x18, 0x43, 0xb2, 0x40, 0x15, 0x43, + 0x0e, 0xe0, 0x34, 0x2c, 0x13, 0xdc, 0xc6, 0xf1, 0x20, 0x04, 0x45, 0xea, + 0x40, 0x05, 0x6d, 0x08, 0x20, 0xfa, 0x06, 0xf2, 0x15, 0x43, 0x21, 0xfa, + 0x06, 0xf0, 0xa1, 0x40, 0x0d, 0x43, 0x00, 0x21, 0x75, 0xf1, 0x00, 0x42, + 0x50, 0xf1, 0x00, 0x00, 0x51, 0xeb, 0x0c, 0x01, 0xf0, 0xbd, 0x00, 0x20, + 0x5f, 0xea, 0x0c, 0x01, 0xf0, 0xbd, 0xcf, 0xb9, 0x92, 0x18, 0x5b, 0x41, + 0xb3, 0xfa, 0x83, 0xf7, 0x04, 0xbf, 0xb2, 0xfa, 0x82, 0xf6, 0xbf, 0x19, + 0x0b, 0x3f, 0xb7, 0xf1, 0x20, 0x06, 0x2f, 0xbf, 0x02, 0xfa, 0x06, 0xf3, + 0xbb, 0x40, 0xc7, 0xf1, 0x20, 0x06, 0x22, 0xfa, 0x06, 0xf6, 0x38, 0xbf, + 0x33, 0x43, 0xba, 0x40, 0x1c, 0xb1, 0xe4, 0x19, 0x64, 0x1e, 0x33, 0xe7, + 0x7f, 0x42, 0x31, 0xf0, 0x00, 0x41, 0xb1, 0xfa, 0x81, 0xf4, 0x04, 0xbf, + 0xb0, 0xfa, 0x80, 0xf6, 0xa4, 0x19, 0x0b, 0x3c, 0xb4, 0xf1, 0x20, 0x06, + 0x2f, 0xbf, 0x00, 0xfa, 0x06, 0xf1, 0xa1, 0x40, 0xc4, 0xf1, 0x20, 0x06, + 0x20, 0xfa, 0x06, 0xf6, 0x38, 0xbf, 0x31, 0x43, 0xa0, 0x40, 0x3c, 0x1b, + 0x1a, 0xe7, 0xac, 0x42, 0x1a, 0xbf, 0x05, 0xea, 0x13, 0x57, 0xaf, 0x42, + 0x12, 0xe0, 0x50, 0xea, 0x41, 0x06, 0x1c, 0xbf, 0x52, 0xea, 0x43, 0x06, + 0xbf, 0xe7, 0x50, 0xea, 0x41, 0x07, 0x30, 0x46, 0x61, 0x46, 0x1c, 0xbf, + 0x41, 0xea, 0x05, 0x51, 0xf0, 0xbd, 0x52, 0xea, 0x43, 0x0c, 0x08, 0xbf, + 0xc1, 0x43, 0xf0, 0xbd, 0x00, 0x20, 0x4f, 0xf4, 0x00, 0x16, 0x16, 0xeb, + 0x41, 0x0f, 0x98, 0xbf, 0x16, 0xeb, 0x43, 0x0f, 0x08, 0xbf, 0x16, 0xeb, + 0x41, 0x0f, 0x24, 0xbf, 0xc1, 0x43, 0x05, 0xe0, 0x16, 0xeb, 0x43, 0x0f, + 0x0c, 0xbf, 0x61, 0x46, 0x4c, 0xea, 0x05, 0x51, 0xf0, 0xbd, 0x00, 0x00, + 0x40, 0x0d, 0x49, 0x18, 0x40, 0xea, 0x81, 0x20, 0x0c, 0xd2, 0x49, 0x0d, + 0xa1, 0xf5, 0x80, 0x61, 0x49, 0x1c, 0x40, 0xf0, 0x00, 0x40, 0x05, 0xdb, + 0xd1, 0xf1, 0x1f, 0x01, 0x54, 0xbf, 0xc8, 0x40, 0xc0, 0x17, 0x70, 0x47, + 0x00, 0x20, 0x70, 0x47, 0x01, 0x46, 0x48, 0xb1, 0xb0, 0xfa, 0x80, 0xf1, + 0x88, 0x40, 0xc9, 0x1c, 0xc1, 0xf5, 0x84, 0x61, 0x09, 0x05, 0x01, 0xeb, + 0xd0, 0x21, 0x40, 0x05, 0x70, 0x47, 0x00, 0x00, 0x70, 0xb4, 0x4f, 0xf0, + 0x00, 0x45, 0x91, 0xea, 0x03, 0x0f, 0x44, 0xf1, 0x45, 0x80, 0x6b, 0x40, + 0x84, 0x1a, 0x71, 0xeb, 0x03, 0x06, 0x03, 0xd2, 0x00, 0x1b, 0xb1, 0x41, + 0x12, 0x19, 0x73, 0x41, 0x4f, 0xf4, 0x00, 0x1c, 0x1c, 0xeb, 0x41, 0x0f, + 0x34, 0xbf, 0x7c, 0xeb, 0x43, 0x04, 0x42, 0xe0, 0x0c, 0x0d, 0xa4, 0xeb, + 0x13, 0x56, 0x35, 0x2e, 0x4f, 0xdc, 0x45, 0xea, 0xc3, 0x23, 0xdb, 0x0a, + 0x45, 0xea, 0xc1, 0x21, 0xc9, 0x12, 0xb6, 0xf1, 0x20, 0x05, 0x0d, 0xdd, + 0x63, 0xfa, 0x05, 0xf6, 0xeb, 0x40, 0x86, 0xea, 0x03, 0x05, 0x12, 0x42, + 0x18, 0xbf, 0x45, 0xf0, 0x01, 0x05, 0xc0, 0x18, 0x51, 0xf1, 0x00, 0x01, + 0x0c, 0xd2, 0x13, 0xe0, 0x62, 0xfa, 0x06, 0xf5, 0xf2, 0x40, 0x55, 0x40, + 0xf3, 0x41, 0x5a, 0x40, 0xb3, 0x40, 0xf3, 0x40, 0x5a, 0x40, 0x80, 0x18, + 0x59, 0x41, 0x07, 0xd3, 0x49, 0x08, 0x5f, 0xea, 0x30, 0x00, 0x5f, 0xea, + 0x35, 0x05, 0x28, 0xbf, 0x45, 0xf0, 0x01, 0x05, 0x01, 0xf5, 0x80, 0x11, + 0x42, 0x08, 0x75, 0xf1, 0x00, 0x42, 0x50, 0xf1, 0x00, 0x00, 0x41, 0xeb, + 0x04, 0x51, 0x4e, 0x00, 0x16, 0xf5, 0x00, 0x1f, 0x70, 0xbc, 0x38, 0xbf, + 0x70, 0x47, 0x00, 0x20, 0x09, 0x0d, 0x09, 0x05, 0x70, 0x47, 0x1c, 0xeb, + 0x41, 0x0f, 0x10, 0xd2, 0x52, 0xea, 0x43, 0x06, 0x0b, 0xd0, 0xbc, 0xeb, + 0x41, 0x0f, 0x05, 0xd8, 0x0c, 0x0d, 0xab, 0x43, 0x66, 0x1e, 0x34, 0x2e, + 0xb6, 0xdd, 0x02, 0xe0, 0xab, 0x43, 0x80, 0x18, 0x59, 0x41, 0x70, 0xbc, + 0x70, 0x47, 0x70, 0xbc, 0x70, 0x47, 0x00, 0x00, 0xb0, 0xb5, 0x81, 0xea, + 0x03, 0x0c, 0x0c, 0xf0, 0x00, 0x4c, 0x40, 0xf2, 0xff, 0x75, 0x15, 0xea, + 0x11, 0x54, 0x1d, 0xbf, 0x15, 0xea, 0x13, 0x57, 0xac, 0x42, 0xaf, 0x42, + 0x39, 0xe0, 0xe4, 0x19, 0x23, 0xea, 0x45, 0x53, 0x43, 0xf4, 0x80, 0x13, + 0xc9, 0x02, 0x41, 0xf0, 0x00, 0x41, 0x41, 0xea, 0x50, 0x5e, 0xc7, 0x02, + 0x11, 0x00, 0xa7, 0xfb, 0x02, 0x02, 0x00, 0x28, 0x4f, 0xf0, 0x00, 0x00, + 0xee, 0xfb, 0x01, 0x20, 0x4f, 0xf0, 0x00, 0x01, 0xe3, 0xfb, 0x07, 0x21, + 0x18, 0xbf, 0x42, 0xf0, 0x01, 0x02, 0x40, 0x18, 0x00, 0x21, 0x49, 0x41, + 0xe3, 0xfb, 0x0e, 0x01, 0xa4, 0xf5, 0x80, 0x64, 0x0f, 0x03, 0x02, 0xd2, + 0x52, 0x00, 0x40, 0x41, 0x49, 0x41, 0x54, 0xf1, 0x01, 0x04, 0x6c, 0xdd, + 0x47, 0x08, 0x72, 0xf1, 0x00, 0x42, 0x50, 0xf1, 0x00, 0x00, 0x51, 0xeb, + 0x04, 0x51, 0xa1, 0xf5, 0x80, 0x11, 0x5c, 0xbf, 0x41, 0xea, 0x0c, 0x01, + 0xb0, 0xbd, 0x4c, 0xea, 0x05, 0x51, 0x00, 0x20, 0xb0, 0xbd, 0x05, 0xea, + 0x13, 0x57, 0xac, 0x42, 0x14, 0xbf, 0xaf, 0x42, 0x41, 0xe0, 0x50, 0xea, + 0x41, 0x0e, 0x1c, 0xbf, 0x52, 0xea, 0x43, 0x0e, 0x02, 0xe0, 0x61, 0x46, + 0x00, 0x20, 0xb0, 0xbd, 0x24, 0x42, 0x3c, 0x44, 0x1b, 0xd1, 0x5f, 0xea, + 0x07, 0x0e, 0xf6, 0xd0, 0x09, 0x03, 0x02, 0xbf, 0x01, 0x46, 0x00, 0x20, + 0xae, 0xf1, 0x14, 0x0e, 0xb1, 0xfa, 0x81, 0xf7, 0xae, 0xeb, 0x07, 0x04, + 0x01, 0xfa, 0x07, 0xfe, 0x0c, 0x37, 0xc7, 0xf1, 0x20, 0x01, 0x00, 0xfa, + 0x07, 0xf7, 0xc8, 0x40, 0x4e, 0xea, 0x00, 0x0e, 0x23, 0xea, 0x45, 0x53, + 0x43, 0xf4, 0x80, 0x13, 0xa2, 0xe7, 0x33, 0xf0, 0x00, 0x43, 0xb3, 0xfa, + 0x83, 0xf7, 0x04, 0xbf, 0xb2, 0xfa, 0x82, 0xfe, 0x77, 0x44, 0x0b, 0x3f, + 0xe4, 0x1b, 0xb7, 0xf1, 0x20, 0x0e, 0x2f, 0xbf, 0x02, 0xfa, 0x0e, 0xf3, + 0xbb, 0x40, 0xc7, 0xf1, 0x20, 0x0e, 0x22, 0xfa, 0x0e, 0xfe, 0x38, 0xbf, + 0x43, 0xea, 0x0e, 0x03, 0xba, 0x40, 0x64, 0x1c, 0x82, 0xe7, 0x50, 0xea, + 0x41, 0x0e, 0x14, 0xbf, 0x52, 0xea, 0x43, 0x0e, 0x6f, 0xf0, 0x00, 0x01, + 0x4f, 0xf4, 0x00, 0x17, 0x17, 0xeb, 0x43, 0x0f, 0x8a, 0xbf, 0x19, 0x46, + 0x17, 0xeb, 0x41, 0x0f, 0xb5, 0xe7, 0x4c, 0xea, 0x05, 0x51, 0x00, 0x20, + 0xb0, 0xbd, 0xd4, 0xf1, 0x01, 0x04, 0xb4, 0xf1, 0x20, 0x07, 0x0f, 0xda, + 0xc4, 0xf1, 0x20, 0x07, 0x52, 0x08, 0x28, 0xbf, 0x42, 0xf0, 0x01, 0x02, + 0x10, 0xfa, 0x07, 0xf5, 0x01, 0xfa, 0x07, 0xf7, 0xe1, 0xbf, 0x2a, 0x43, + 0xe0, 0x40, 0x38, 0x43, 0xe1, 0x40, 0x0f, 0xe0, 0x35, 0x2c, 0x98, 0xdc, + 0xc7, 0xf1, 0x20, 0x04, 0x52, 0xea, 0x40, 0x02, 0x20, 0xfa, 0x07, 0xf2, + 0x18, 0xbf, 0x42, 0xf0, 0x01, 0x02, 0x31, 0xfa, 0x07, 0xf0, 0xa1, 0x40, + 0x0a, 0x43, 0x00, 0x21, 0x72, 0xf1, 0x00, 0x42, 0x50, 0xf1, 0x00, 0x00, + 0x51, 0xeb, 0x0c, 0x01, 0xb0, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x00, + 0x04, 0xd0, 0x00, 0x21, 0x21, 0x60, 0x20, 0x1d, 0xf9, 0xf7, 0xb8, 0xff, + 0x20, 0x46, 0x10, 0xbd, 0x2d, 0xe9, 0xf0, 0x47, 0x08, 0x9d, 0x07, 0x46, + 0x88, 0x46, 0x14, 0x46, 0x99, 0x46, 0xe8, 0xf7, 0xa7, 0xfe, 0x3e, 0x68, + 0x4a, 0x46, 0x41, 0x46, 0x30, 0x46, 0x00, 0xf0, 0x7d, 0xf8, 0x4f, 0xf0, + 0x00, 0x0a, 0x30, 0xb1, 0x00, 0x25, 0xa4, 0xb1, 0x38, 0x68, 0x20, 0xea, + 0x08, 0x00, 0x38, 0x60, 0x0f, 0xe0, 0x75, 0xb1, 0x0c, 0xb1, 0x4f, 0xf0, + 0x80, 0x7a, 0xb9, 0xf1, 0x00, 0x0f, 0x18, 0xbf, 0x4a, 0xf0, 0x80, 0x6a, + 0x2a, 0x46, 0x4a, 0xea, 0x08, 0x01, 0x38, 0x1d, 0xe8, 0xf7, 0xea, 0xff, + 0x00, 0x26, 0xe8, 0xf7, 0x8b, 0xfe, 0x0d, 0xb3, 0x38, 0xb9, 0x34, 0x49, + 0x4f, 0xf0, 0x80, 0x50, 0x08, 0x60, 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, + 0x6f, 0x8f, 0xe9, 0xf7, 0xd7, 0xf9, 0x06, 0x46, 0xb0, 0x01, 0x11, 0xd4, + 0xf9, 0xf7, 0x34, 0xff, 0x3e, 0x68, 0x4a, 0x46, 0x41, 0x46, 0x30, 0x46, + 0x00, 0xf0, 0x4a, 0xf8, 0x00, 0x28, 0x18, 0xbf, 0x00, 0x2c, 0x03, 0xd0, + 0x38, 0x68, 0x20, 0xea, 0x08, 0x00, 0x38, 0x60, 0xf9, 0xf7, 0x30, 0xff, + 0x26, 0xf0, 0x7f, 0x46, 0x30, 0x46, 0xbd, 0xe8, 0xf0, 0x87, 0x70, 0xb5, + 0x04, 0x46, 0x0d, 0x46, 0xf9, 0xf7, 0x1a, 0xff, 0x26, 0x68, 0x26, 0xea, + 0x05, 0x05, 0x25, 0x60, 0xf9, 0xf7, 0x20, 0xff, 0x30, 0x46, 0x70, 0xbd, + 0xf8, 0xb5, 0x05, 0x46, 0x0c, 0x46, 0xe8, 0xf7, 0x4d, 0xfe, 0x28, 0x68, + 0x2a, 0x69, 0x04, 0x43, 0x00, 0x26, 0x2c, 0x60, 0x16, 0xe0, 0x98, 0x42, + 0x13, 0xd1, 0xff, 0x01, 0x48, 0xbf, 0x1e, 0x43, 0x41, 0xf0, 0x00, 0x71, + 0x10, 0x46, 0xe9, 0xf7, 0x1b, 0xf8, 0x0a, 0xe0, 0x17, 0x68, 0x54, 0x68, + 0x27, 0xf0, 0x7f, 0x43, 0x5f, 0xea, 0x47, 0x1c, 0x01, 0xea, 0x03, 0x00, + 0xeb, 0xd4, 0x00, 0x28, 0xeb, 0xd1, 0x22, 0x46, 0x05, 0xf1, 0x0c, 0x00, + 0x29, 0x68, 0x82, 0x42, 0xee, 0xd1, 0x21, 0xea, 0x06, 0x06, 0x2e, 0x60, + 0xe8, 0xf7, 0x2c, 0xfe, 0x28, 0x68, 0xf2, 0xbd, 0x03, 0x46, 0x00, 0x20, + 0x0b, 0x40, 0x0a, 0xb9, 0x1b, 0xb1, 0x01, 0xe0, 0x8b, 0x42, 0x00, 0xd1, + 0x01, 0x20, 0x70, 0x47, 0x04, 0xed, 0x00, 0xe0, 0x80, 0xb5, 0x00, 0x23, + 0x00, 0x22, 0x03, 0x21, 0x0e, 0xe1, 0x2d, 0xe9, 0xf0, 0x47, 0x88, 0xb0, + 0x81, 0x46, 0x0f, 0x46, 0x15, 0x46, 0x00, 0xf0, 0x5c, 0xf9, 0x04, 0x00, + 0x05, 0xd1, 0x2a, 0x46, 0x39, 0x46, 0x48, 0x46, 0x00, 0xf0, 0x82, 0xf9, + 0x04, 0x46, 0x00, 0x2c, 0x05, 0xf5, 0x47, 0x78, 0x05, 0xf5, 0x57, 0x76, + 0x40, 0xf0, 0x8e, 0x80, 0x01, 0x21, 0xcd, 0xf8, 0x04, 0x90, 0x8d, 0xf8, + 0x08, 0x10, 0x00, 0x21, 0x3a, 0x68, 0x05, 0x92, 0x06, 0x91, 0x00, 0x22, + 0x78, 0x68, 0x04, 0x90, 0x78, 0x7d, 0x8d, 0xf8, 0x1c, 0x00, 0xb3, 0x78, + 0x71, 0x78, 0x48, 0x46, 0x00, 0xf0, 0xfc, 0xf8, 0x00, 0xf0, 0xcc, 0xf8, + 0xe7, 0xf7, 0xf0, 0xf8, 0x04, 0x00, 0x04, 0xd1, 0x00, 0xf0, 0xc6, 0xf8, + 0xf8, 0xf7, 0x5f, 0xf9, 0x04, 0x46, 0x00, 0x2c, 0x5d, 0xd1, 0x00, 0x20, + 0x00, 0x90, 0xea, 0x68, 0xb9, 0x7d, 0x00, 0x23, 0x48, 0x46, 0xe5, 0xf7, + 0x32, 0xfb, 0x3c, 0x46, 0x00, 0x27, 0x14, 0xe0, 0x18, 0xf8, 0x07, 0x20, + 0x3f, 0x2a, 0x0f, 0xd8, 0x02, 0x21, 0x48, 0x46, 0xf8, 0xf7, 0xb7, 0xfa, + 0x01, 0x21, 0x48, 0x46, 0x00, 0xf0, 0xe1, 0xf9, 0x05, 0xf5, 0x8e, 0x70, + 0x00, 0xeb, 0x87, 0x02, 0x69, 0x69, 0x01, 0xa8, 0x00, 0xf0, 0xa4, 0xf9, + 0x7f, 0x1c, 0xe1, 0x7d, 0x8f, 0x42, 0x01, 0xd2, 0x00, 0x28, 0xe5, 0xd0, + 0x4f, 0x46, 0x30, 0xb9, 0x00, 0x90, 0xaa, 0x68, 0xa1, 0x7d, 0x00, 0x23, + 0x38, 0x46, 0xe5, 0xf7, 0x0c, 0xfb, 0x4f, 0xf0, 0x00, 0x09, 0x1e, 0xe0, + 0x18, 0xf8, 0x09, 0x20, 0x3f, 0x2a, 0x18, 0xd8, 0x02, 0x21, 0x38, 0x46, + 0xf8, 0xf7, 0x91, 0xfa, 0x02, 0x21, 0x38, 0x46, 0x00, 0xf0, 0xbb, 0xf9, + 0x05, 0xf1, 0x1c, 0x00, 0x00, 0xeb, 0x89, 0x02, 0x29, 0x69, 0x01, 0xa8, + 0x00, 0xf0, 0x7e, 0xf9, 0x38, 0xb9, 0x05, 0xf5, 0x07, 0x70, 0x00, 0xeb, + 0x89, 0x02, 0xa9, 0x69, 0x01, 0xa8, 0x00, 0xf0, 0x75, 0xf9, 0x09, 0xf1, + 0x01, 0x09, 0xe1, 0x7d, 0x89, 0x45, 0x01, 0xd2, 0x00, 0x28, 0xdb, 0xd0, + 0xb9, 0x46, 0x27, 0x46, 0x04, 0x46, 0x00, 0x21, 0x48, 0x46, 0xe5, 0xf7, + 0x80, 0xfb, 0x04, 0xb9, 0x04, 0x46, 0x00, 0xf0, 0x61, 0xf8, 0xe7, 0xf7, + 0x9f, 0xf8, 0x82, 0x46, 0x00, 0xf0, 0x5c, 0xf8, 0xf8, 0xf7, 0x1f, 0xf9, + 0xba, 0xf1, 0x00, 0x0f, 0x08, 0xbf, 0x82, 0x46, 0x04, 0xb9, 0x54, 0x46, + 0x00, 0x2c, 0x47, 0xd1, 0x95, 0xed, 0x05, 0x0a, 0xd5, 0xed, 0x04, 0x0a, + 0xb8, 0xee, 0xc0, 0x0a, 0xf8, 0xee, 0xe0, 0x0a, 0x80, 0xee, 0x20, 0x0a, + 0xf8, 0x7e, 0xf7, 0xee, 0x00, 0x0a, 0x40, 0xee, 0x00, 0x0a, 0x01, 0x28, + 0x20, 0xee, 0xa0, 0x1a, 0xb1, 0xee, 0x00, 0x0a, 0x0c, 0xbf, 0x40, 0x20, + 0x3f, 0x20, 0x80, 0xee, 0x01, 0x0a, 0x00, 0x21, 0x00, 0xe0, 0x49, 0x1c, + 0xfa, 0x7d, 0x91, 0x42, 0x23, 0xd2, 0x18, 0xf8, 0x01, 0x30, 0x3f, 0x2b, + 0xf7, 0xd8, 0x05, 0xeb, 0x81, 0x02, 0x97, 0xed, 0x02, 0x1a, 0xd2, 0xed, + 0x07, 0x0a, 0xb4, 0xee, 0x60, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x41, 0xbf, + 0xd2, 0xed, 0x47, 0x1a, 0xc1, 0xee, 0xa0, 0x1a, 0xb4, 0xee, 0x61, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0xe3, 0xd5, 0x92, 0xed, 0x87, 0x1a, 0xd7, 0xed, + 0x03, 0x1a, 0xc1, 0xee, 0x20, 0x0a, 0xf4, 0xee, 0x61, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0xd8, 0xd5, 0x08, 0x46, 0x3f, 0x28, 0x88, 0xbf, 0x40, 0xf6, + 0x01, 0x64, 0x30, 0x70, 0x24, 0xb9, 0x29, 0x46, 0x48, 0x46, 0x00, 0xf0, + 0x0a, 0xf8, 0x04, 0x46, 0x20, 0x46, 0x08, 0xb0, 0xbd, 0xe8, 0xf0, 0x87, + 0x00, 0x23, 0x04, 0x22, 0x01, 0x21, 0x48, 0x46, 0x70, 0x47, 0x38, 0xb5, + 0x01, 0xf5, 0x57, 0x74, 0x25, 0x78, 0xa3, 0x78, 0x29, 0x44, 0x91, 0xf8, + 0x1c, 0x23, 0x61, 0x78, 0x00, 0xf0, 0x1e, 0xf8, 0x00, 0x20, 0x32, 0xbd, + 0x80, 0xb5, 0x8b, 0x78, 0x0a, 0x78, 0x49, 0x78, 0x00, 0xf0, 0x16, 0xf8, + 0x00, 0x20, 0x02, 0xbd, 0x38, 0xb5, 0x0d, 0x46, 0x04, 0x46, 0x02, 0x21, + 0xf8, 0xf7, 0x0c, 0xfa, 0x28, 0x70, 0x02, 0x21, 0x20, 0x46, 0xf8, 0xf7, + 0xba, 0xf9, 0x68, 0x70, 0x20, 0x46, 0xf8, 0xf7, 0x61, 0xfa, 0x00, 0xb1, + 0x01, 0x20, 0xa8, 0x70, 0x31, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x0d, 0x46, + 0x01, 0x2b, 0x04, 0x46, 0x16, 0x46, 0x0c, 0xbf, 0x0f, 0x21, 0x00, 0x21, + 0xf8, 0xf7, 0x3f, 0xfa, 0x8b, 0xa0, 0x05, 0xf0, 0x03, 0x01, 0x2a, 0x46, + 0x47, 0x5c, 0x00, 0x21, 0x20, 0x46, 0xf8, 0xf7, 0x89, 0xf9, 0x2a, 0x46, + 0x02, 0x21, 0x20, 0x46, 0xf8, 0xf7, 0x84, 0xf9, 0x2a, 0x46, 0x01, 0x21, + 0x20, 0x46, 0xf8, 0xf7, 0x7f, 0xf9, 0x3a, 0x46, 0x00, 0x21, 0x20, 0x46, + 0xf8, 0xf7, 0xa1, 0xf9, 0x3a, 0x46, 0x02, 0x21, 0x20, 0x46, 0xf8, 0xf7, + 0x9c, 0xf9, 0x3a, 0x46, 0x01, 0x21, 0x20, 0x46, 0xf8, 0xf7, 0x97, 0xf9, + 0x32, 0x46, 0x00, 0x21, 0x20, 0x46, 0xf8, 0xf7, 0xaa, 0xf9, 0x32, 0x46, + 0x02, 0x21, 0x20, 0x46, 0xf8, 0xf7, 0xa5, 0xf9, 0x32, 0x46, 0x20, 0x46, + 0xbd, 0xe8, 0xf8, 0x40, 0x01, 0x21, 0xf8, 0xf7, 0x9e, 0xb9, 0xf8, 0xb5, + 0x07, 0x46, 0x0d, 0x46, 0x14, 0x46, 0xda, 0xf7, 0xe2, 0xfa, 0x46, 0x08, + 0x69, 0x46, 0x38, 0x46, 0xd9, 0xf7, 0x4a, 0xfb, 0x07, 0x46, 0x70, 0x42, + 0xa6, 0x60, 0xe0, 0x60, 0x00, 0x99, 0x71, 0x18, 0x21, 0x61, 0x00, 0x98, + 0x80, 0x1b, 0x60, 0x61, 0x00, 0x99, 0xc1, 0xeb, 0xc1, 0x01, 0x89, 0x1b, + 0xa1, 0x61, 0x00, 0x98, 0x20, 0x60, 0x66, 0x60, 0x14, 0x20, 0xed, 0xf7, + 0xb9, 0xf9, 0x30, 0xb1, 0x00, 0x98, 0xe9, 0x69, 0x86, 0x1b, 0x8e, 0x42, + 0x80, 0x41, 0xc0, 0x43, 0xc0, 0x0f, 0x84, 0xf8, 0x5e, 0x03, 0x38, 0x46, + 0xf2, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x15, 0x46, + 0x82, 0xb0, 0x0c, 0x46, 0x29, 0x68, 0x68, 0x68, 0x41, 0x18, 0x08, 0xee, + 0x10, 0x1a, 0x18, 0xee, 0x10, 0x0a, 0x00, 0xf0, 0x78, 0xf8, 0x06, 0x46, + 0x68, 0x46, 0xd9, 0xf7, 0x56, 0xfb, 0x01, 0xa8, 0xd9, 0xf7, 0x4e, 0xfb, + 0x4f, 0xa0, 0xdd, 0xed, 0x00, 0x0a, 0x06, 0xf0, 0x03, 0x01, 0x9f, 0xed, + 0x45, 0x1a, 0x42, 0x5c, 0x00, 0xee, 0x10, 0x2a, 0xb8, 0xee, 0x40, 0x0a, + 0x60, 0xee, 0x20, 0x0a, 0xf8, 0xee, 0xc8, 0x1a, 0x9f, 0xed, 0x40, 0x0a, + 0x20, 0xee, 0x81, 0x1a, 0x21, 0xee, 0x80, 0x0a, 0x21, 0xee, 0x00, 0x0a, + 0xb7, 0xee, 0x00, 0x2a, 0x82, 0xee, 0x00, 0x2a, 0xdd, 0xed, 0x01, 0x0a, + 0xc2, 0xee, 0x20, 0x0a, 0x9f, 0xed, 0x39, 0x0a, 0x30, 0xee, 0x80, 0x0a, + 0x9f, 0xed, 0x38, 0x1a, 0x80, 0xee, 0x01, 0x0a, 0xd9, 0xf7, 0x34, 0xf8, + 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x40, 0x28, 0xa8, 0xbf, + 0x3f, 0x20, 0x02, 0xda, 0x00, 0x28, 0x48, 0xbf, 0x00, 0x20, 0xa1, 0x7e, + 0x01, 0x29, 0x0c, 0xbf, 0xc0, 0xb2, 0x00, 0x20, 0x00, 0x21, 0x0d, 0xe0, + 0x40, 0x22, 0x07, 0xe0, 0x94, 0xf9, 0x19, 0x20, 0x83, 0x18, 0x22, 0x7e, + 0x02, 0xfb, 0x01, 0x32, 0x40, 0x2a, 0xf5, 0xd2, 0x6b, 0x18, 0x49, 0x1c, + 0x83, 0xf8, 0x1c, 0x23, 0xe2, 0x7d, 0x91, 0x42, 0xf0, 0xd3, 0x85, 0xf8, + 0x5d, 0x63, 0x02, 0xb0, 0x00, 0x20, 0xbd, 0xec, 0x02, 0x8b, 0x70, 0xbd, + 0xf0, 0xb5, 0x05, 0x46, 0x87, 0xb0, 0xa9, 0x60, 0x16, 0x46, 0xfc, 0xf7, + 0x2b, 0xfb, 0x04, 0x00, 0x10, 0xd1, 0x28, 0x68, 0x4f, 0xf4, 0x7a, 0x71, + 0xfc, 0xf7, 0x98, 0xfb, 0x40, 0xf6, 0x02, 0x67, 0x38, 0xb9, 0x69, 0x46, + 0x28, 0x46, 0xfc, 0xf7, 0x95, 0xfb, 0x10, 0xb9, 0x04, 0x98, 0x30, 0x60, + 0x00, 0xe0, 0x3c, 0x46, 0x20, 0x46, 0x07, 0xb0, 0xf0, 0xbd, 0x10, 0xb5, + 0x04, 0x46, 0x04, 0x20, 0xed, 0xf7, 0x20, 0xf9, 0x28, 0xb9, 0x10, 0x48, + 0x84, 0x42, 0x05, 0xd3, 0x0f, 0x49, 0x8c, 0x42, 0x06, 0xe0, 0x0f, 0x48, + 0x84, 0x42, 0x01, 0xd2, 0x01, 0x20, 0x10, 0xbd, 0x0d, 0x48, 0x84, 0x42, + 0x01, 0xd2, 0x02, 0x20, 0x10, 0xbd, 0x03, 0x20, 0x10, 0xbd, 0x0a, 0x46, + 0x01, 0x21, 0x81, 0x40, 0x05, 0x20, 0xfc, 0xf7, 0xd7, 0xb8, 0x00, 0x00, + 0xdb, 0x0f, 0xc9, 0x40, 0x00, 0x00, 0x7a, 0x44, 0xc5, 0x21, 0x9b, 0xaa, + 0x64, 0xbd, 0x85, 0x28, 0xe0, 0xc8, 0x10, 0x00, 0xa0, 0xf0, 0x19, 0x00, + 0x50, 0x2d, 0x19, 0x00, 0x30, 0xf6, 0x29, 0x00, 0x00, 0xc8, 0x64, 0x32, + 0x00, 0x03, 0x06, 0x0c, 0xbd, 0xee, 0x40, 0x0a, 0x10, 0xee, 0x10, 0x0a, + 0x70, 0x47, 0x00, 0x00, 0xdf, 0xf8, 0x00, 0xf0, 0x21, 0x39, 0x00, 0x01, + 0xdf, 0xf8, 0x00, 0xf0, 0x5d, 0x39, 0x00, 0x01, 0xdf, 0xf8, 0x00, 0xf0, + 0x75, 0x39, 0x00, 0x01, 0xdf, 0xf8, 0x00, 0xf0, 0x7d, 0x39, 0x00, 0x01, + 0xdf, 0xf8, 0x00, 0xf0, 0xed, 0x34, 0x00, 0x01, 0xdf, 0xf8, 0x00, 0xf0, + 0x3b, 0x35, 0x00, 0x01, 0xdf, 0xf8, 0x00, 0xf0, 0xb1, 0x34, 0x00, 0x01, + 0xdf, 0xf8, 0x00, 0xf0, 0xd3, 0x34, 0x00, 0x01, 0xdf, 0xf8, 0x00, 0xf0, + 0x69, 0x39, 0x00, 0x01, 0xdf, 0xf8, 0x00, 0xf0, 0x9b, 0xa7, 0x00, 0x01, + 0xdf, 0xf8, 0x00, 0xf0, 0x4d, 0xa7, 0x00, 0x01, 0x2d, 0xe9, 0xfc, 0x41, + 0x05, 0x46, 0x40, 0xf2, 0x0d, 0x26, 0x69, 0x68, 0x04, 0x29, 0x7d, 0xd2, + 0x18, 0x20, 0xdf, 0xf8, 0x88, 0x27, 0x48, 0x43, 0x40, 0xf2, 0x54, 0x63, + 0x10, 0x44, 0x4b, 0x43, 0x1a, 0x44, 0x02, 0xf1, 0x60, 0x04, 0x40, 0xf6, + 0x58, 0x0e, 0x04, 0x60, 0x0e, 0xfb, 0x01, 0xfe, 0xdf, 0xf8, 0x6c, 0xc7, + 0xe6, 0x44, 0x43, 0xf6, 0x28, 0x78, 0x02, 0xf5, 0x8e, 0x73, 0x02, 0xf5, + 0xae, 0x74, 0x02, 0xf5, 0x14, 0x77, 0x0e, 0xeb, 0x08, 0x0c, 0x02, 0xf5, + 0x56, 0x7e, 0x43, 0x60, 0x84, 0x60, 0xc7, 0x60, 0xc0, 0xf8, 0x14, 0xc0, + 0xc0, 0xf8, 0x10, 0xe0, 0x02, 0xf1, 0x60, 0x00, 0xa8, 0x62, 0x6b, 0x62, + 0x30, 0x20, 0xdf, 0xf8, 0x3c, 0x27, 0xc5, 0xf8, 0x34, 0xc0, 0x41, 0x43, + 0x50, 0x18, 0x00, 0xf1, 0xc0, 0x03, 0xc5, 0xf8, 0x38, 0xe0, 0xe8, 0x61, + 0x2b, 0x62, 0xec, 0x62, 0x2f, 0x63, 0x30, 0x21, 0xde, 0xf7, 0xee, 0xfc, + 0x28, 0x6a, 0x30, 0x21, 0xde, 0xf7, 0xea, 0xfc, 0x28, 0x46, 0x00, 0xf0, + 0x1d, 0xfb, 0x03, 0x20, 0x00, 0x90, 0x05, 0xf1, 0x54, 0x03, 0x00, 0x22, + 0x00, 0x21, 0x01, 0x20, 0xe9, 0xf7, 0x96, 0xfd, 0x28, 0x65, 0x00, 0x21, + 0xe9, 0xf7, 0x48, 0xff, 0x28, 0x68, 0xc0, 0xb2, 0x03, 0xf0, 0x4c, 0xfc, + 0x28, 0x68, 0x00, 0x21, 0xc0, 0xb2, 0x03, 0xf0, 0x63, 0xfc, 0x28, 0x68, + 0x00, 0x21, 0x03, 0xf0, 0xe9, 0xfc, 0x28, 0x68, 0x01, 0x21, 0x03, 0xf0, + 0xe5, 0xfc, 0x69, 0x6a, 0xa8, 0x6a, 0xfd, 0xf7, 0xf1, 0xfa, 0x04, 0x46, + 0xa8, 0x6a, 0x01, 0x21, 0xff, 0xf7, 0x62, 0xff, 0x01, 0x2c, 0x04, 0xd1, + 0x28, 0x46, 0x00, 0xf0, 0xd4, 0xf9, 0x04, 0x00, 0x13, 0xd1, 0x28, 0x68, + 0x01, 0x21, 0x00, 0xf0, 0x80, 0xf8, 0x10, 0xb3, 0x00, 0xf0, 0x80, 0xf8, + 0x0f, 0xf2, 0xb8, 0x62, 0x00, 0xf0, 0x0e, 0xf9, 0x34, 0x46, 0x06, 0xe0, + 0x4f, 0xf6, 0x52, 0x74, 0x03, 0x22, 0x21, 0x46, 0x01, 0x20, 0xe7, 0xf7, + 0x55, 0xfe, 0x00, 0x94, 0x02, 0x21, 0x2b, 0x68, 0x0f, 0xf2, 0xac, 0x62, + 0x00, 0xf0, 0xfe, 0xf8, 0x03, 0x27, 0xb4, 0x42, 0x08, 0xbf, 0x01, 0x27, + 0x3a, 0x46, 0x02, 0xb0, 0xbd, 0xe8, 0xf0, 0x41, 0x40, 0xf2, 0x07, 0x21, + 0x01, 0x20, 0xe7, 0xf7, 0x41, 0xbe, 0xbd, 0xe8, 0xf3, 0x81, 0x2d, 0xe9, + 0xf8, 0x43, 0x0e, 0x46, 0x05, 0x46, 0x02, 0x2e, 0x4f, 0xf0, 0x00, 0x08, + 0x02, 0xbf, 0xa9, 0x69, 0x48, 0x7e, 0x00, 0x28, 0x04, 0xbf, 0x28, 0x46, + 0x00, 0xf0, 0xb6, 0xfa, 0x00, 0x21, 0x28, 0x46, 0x00, 0xf0, 0x3c, 0xfa, + 0xe8, 0x69, 0x01, 0x69, 0x4c, 0x1e, 0xa4, 0x41, 0x02, 0x2e, 0x05, 0xf1, + 0x40, 0x07, 0x25, 0xd1, 0xe4, 0xf7, 0x00, 0xf9, 0x38, 0x60, 0x85, 0xf8, + 0x3f, 0x80, 0xe1, 0x0f, 0x28, 0x68, 0x00, 0xf0, 0x36, 0xf8, 0x40, 0xf2, + 0x0d, 0x29, 0x28, 0xb1, 0x00, 0xf0, 0x34, 0xf8, 0x0f, 0xf2, 0x4c, 0x62, + 0x03, 0x20, 0x0f, 0xe0, 0x28, 0x46, 0x00, 0xf0, 0x44, 0xfa, 0x5f, 0xea, + 0x00, 0x08, 0x22, 0xd1, 0x28, 0x68, 0xe1, 0x0f, 0x00, 0xf0, 0x23, 0xf8, + 0x40, 0xb1, 0x00, 0xf0, 0x23, 0xf8, 0x0f, 0xf2, 0x4c, 0x62, 0x01, 0x20, + 0xda, 0xf7, 0x89, 0xfa, 0xc8, 0x46, 0x14, 0xe0, 0x38, 0x69, 0x00, 0x21, + 0xe9, 0xf7, 0xb8, 0xfe, 0x31, 0x46, 0x28, 0x46, 0x00, 0xf0, 0x1e, 0xfa, + 0x01, 0x00, 0x04, 0xbf, 0xa8, 0x6a, 0xfd, 0xf7, 0x71, 0xfa, 0x01, 0x28, + 0x08, 0xd1, 0x28, 0x46, 0x00, 0xf0, 0x55, 0xf9, 0x5f, 0xea, 0x00, 0x08, + 0x02, 0xd0, 0x28, 0x46, 0x00, 0xf0, 0x46, 0xfa, 0x2d, 0xe1, 0xc0, 0xb2, + 0x03, 0xf0, 0xd2, 0xbb, 0x00, 0x90, 0x02, 0x21, 0x2b, 0x68, 0x70, 0x47, + 0x2d, 0xe9, 0xf8, 0x4f, 0x05, 0x46, 0x0c, 0x46, 0x05, 0xf1, 0x3d, 0x01, + 0x00, 0x27, 0x88, 0x78, 0x00, 0x28, 0x93, 0x46, 0x4f, 0xf0, 0x00, 0x08, + 0x78, 0xd0, 0xa8, 0x69, 0x01, 0x68, 0x02, 0x2c, 0x06, 0xbf, 0x4f, 0xf0, + 0x0f, 0x09, 0x49, 0x08, 0x4f, 0xf0, 0x10, 0x09, 0x00, 0x91, 0x28, 0x46, + 0x95, 0xf8, 0x3d, 0xa0, 0x00, 0xf0, 0xef, 0xf9, 0x05, 0xf1, 0x40, 0x06, + 0x30, 0x68, 0xe4, 0xf7, 0xcf, 0xf8, 0x70, 0x60, 0x95, 0xf8, 0x3d, 0x10, + 0x8a, 0x45, 0x18, 0xbf, 0xf0, 0x60, 0xf4, 0xf7, 0x49, 0xfb, 0x18, 0xb1, + 0x4f, 0xf0, 0x00, 0x48, 0x01, 0x27, 0x0a, 0xe0, 0x95, 0xf8, 0x3d, 0x00, + 0x48, 0x45, 0x15, 0xd1, 0x01, 0x27, 0x03, 0x2c, 0x1e, 0xbf, 0xa9, 0x69, + 0x48, 0x7a, 0x00, 0x28, 0x02, 0xd1, 0x28, 0x46, 0x00, 0xf0, 0x02, 0xfa, + 0x02, 0x2c, 0x38, 0xd1, 0xb8, 0xf1, 0x00, 0x0f, 0x37, 0xd1, 0x28, 0x68, + 0x00, 0xf0, 0x1b, 0xfa, 0x02, 0x20, 0xe4, 0xf7, 0xed, 0xfb, 0x30, 0xe0, + 0x07, 0x28, 0xe7, 0xd0, 0xa8, 0x6a, 0xfd, 0xf7, 0x11, 0xfa, 0x01, 0x28, + 0x0b, 0xd1, 0x28, 0x46, 0x00, 0xf0, 0x4e, 0xf9, 0x80, 0xb3, 0x28, 0x46, + 0x00, 0xf0, 0xf1, 0xf8, 0x01, 0x27, 0x5f, 0xea, 0x00, 0x08, 0xde, 0xd1, + 0xd7, 0xe7, 0x70, 0x68, 0x00, 0x99, 0x81, 0x42, 0x24, 0xd2, 0xff, 0xf7, + 0x9b, 0xff, 0x0f, 0xf2, 0x5c, 0x52, 0x00, 0xf0, 0x29, 0xf8, 0x28, 0x68, + 0x00, 0x21, 0xff, 0xf7, 0x90, 0xff, 0x01, 0x27, 0x00, 0x28, 0x40, 0xf2, + 0x06, 0x28, 0xca, 0xd0, 0xff, 0xf7, 0x8c, 0xff, 0x0f, 0xf2, 0x54, 0x52, + 0x00, 0xf0, 0x1a, 0xf8, 0x40, 0xf2, 0x0d, 0x28, 0xc1, 0xe7, 0x03, 0x2c, + 0x02, 0xd0, 0xa9, 0x69, 0x48, 0x7a, 0x38, 0xb9, 0xa9, 0x6b, 0xe8, 0x69, + 0x14, 0x22, 0xcb, 0xf7, 0xa1, 0xfc, 0xe9, 0x69, 0x68, 0x69, 0x08, 0x60, + 0xcb, 0xf8, 0x00, 0x80, 0x38, 0x46, 0xbd, 0xe8, 0xf2, 0x8f, 0x01, 0x90, + 0x00, 0x96, 0x3a, 0x46, 0x23, 0x68, 0x02, 0x21, 0x01, 0x20, 0xda, 0xf7, + 0xd6, 0xb9, 0x2d, 0xe9, 0xf8, 0x43, 0x06, 0x46, 0x01, 0x21, 0x00, 0xf0, + 0x57, 0xf9, 0xb0, 0x69, 0x0f, 0xf2, 0x24, 0x59, 0x01, 0x7e, 0xb0, 0x6a, + 0x49, 0x1e, 0x89, 0x41, 0xc9, 0x0f, 0xff, 0xf7, 0x33, 0xfe, 0x03, 0x21, + 0x30, 0x46, 0x00, 0xf0, 0x61, 0xf9, 0x4f, 0xf0, 0x00, 0x08, 0x04, 0x46, + 0x06, 0xf1, 0x40, 0x07, 0x06, 0xf1, 0x3d, 0x05, 0x00, 0x2c, 0x3b, 0xd1, + 0xf4, 0xf7, 0xc2, 0xfa, 0x10, 0xb1, 0x4f, 0xf0, 0x00, 0x48, 0x35, 0xe0, + 0xb0, 0x6a, 0xfd, 0xf7, 0xa7, 0xf9, 0x04, 0x46, 0x01, 0x2c, 0x05, 0xd1, + 0x30, 0x46, 0x00, 0xf0, 0xe3, 0xf8, 0xf0, 0xb9, 0x00, 0x24, 0x00, 0xe0, + 0xdc, 0xb9, 0x30, 0x46, 0x00, 0xf0, 0x47, 0xf9, 0x28, 0x78, 0x00, 0x90, + 0x4a, 0x46, 0x33, 0x68, 0x34, 0x21, 0x04, 0x20, 0xda, 0xf7, 0x9b, 0xf9, + 0x28, 0x78, 0x10, 0x28, 0x1d, 0xd0, 0x07, 0x28, 0x2e, 0xd0, 0x0d, 0x28, + 0x09, 0xd1, 0xb0, 0x69, 0x41, 0x68, 0x38, 0x69, 0xe9, 0xf7, 0xc4, 0xfd, + 0x01, 0x28, 0x02, 0xd1, 0x78, 0x6e, 0x40, 0x1c, 0x78, 0x66, 0x68, 0x78, + 0x02, 0x28, 0xcb, 0xd1, 0x38, 0x68, 0xe4, 0xf7, 0x0d, 0xf8, 0xb8, 0x60, + 0xb1, 0x69, 0x0a, 0x68, 0x90, 0x42, 0xc3, 0xd3, 0x40, 0xf2, 0x0e, 0x28, + 0x28, 0x78, 0x10, 0x28, 0x04, 0xd1, 0x31, 0x6a, 0xc8, 0x6a, 0x00, 0xb1, + 0x40, 0x1e, 0xc8, 0x62, 0x28, 0x78, 0x10, 0x28, 0x18, 0xbf, 0x07, 0x28, + 0x08, 0xd0, 0x05, 0x21, 0x30, 0x46, 0x00, 0xf0, 0x0b, 0xf9, 0x04, 0x43, + 0xb0, 0x6a, 0xfd, 0xf7, 0x5f, 0xf9, 0x04, 0x43, 0x01, 0x2c, 0x03, 0xd1, + 0x30, 0x46, 0x00, 0xf0, 0x42, 0xf8, 0x80, 0x46, 0xb8, 0xf1, 0x00, 0x0f, + 0x15, 0xd1, 0x02, 0xe0, 0x28, 0x20, 0xe8, 0xf7, 0x35, 0xfd, 0xb0, 0x6a, + 0xff, 0xf7, 0xc8, 0xfd, 0x68, 0xb1, 0xb0, 0x6a, 0xff, 0xf7, 0xc8, 0xfd, + 0x38, 0x6f, 0x40, 0x1c, 0x38, 0x67, 0xb0, 0x6a, 0xff, 0xf7, 0xbe, 0xfd, + 0x18, 0xb1, 0xf4, 0xf7, 0x55, 0xfa, 0x00, 0x28, 0xea, 0xd0, 0xb1, 0x6b, + 0x30, 0x6a, 0x14, 0x22, 0xcb, 0xf7, 0xfe, 0xfb, 0x31, 0x6a, 0x70, 0x69, + 0x08, 0x60, 0x40, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0x81, 0x68, 0x00, 0x22, + 0xb9, 0xb1, 0xc1, 0x68, 0x01, 0x29, 0x06, 0xd0, 0x02, 0x29, 0x07, 0xd0, + 0x04, 0x29, 0x08, 0xd0, 0x08, 0x29, 0x09, 0xd0, 0x0b, 0xe0, 0x40, 0xf2, + 0x01, 0x22, 0x0a, 0xe0, 0x40, 0xf2, 0x02, 0x22, 0x07, 0xe0, 0x40, 0xf2, + 0x03, 0x22, 0x04, 0xe0, 0x4f, 0xf4, 0x01, 0x72, 0x01, 0xe0, 0x40, 0xf2, + 0x09, 0x22, 0x42, 0x61, 0x70, 0x47, 0xfe, 0xb5, 0x04, 0x46, 0x01, 0x20, + 0xe1, 0x68, 0x21, 0x61, 0xa0, 0x60, 0x94, 0xf8, 0x3e, 0x10, 0xa0, 0x6a, + 0x02, 0x29, 0x06, 0xd1, 0x22, 0x6a, 0x02, 0xf1, 0x14, 0x01, 0xff, 0xf7, + 0x89, 0xfd, 0x20, 0x6a, 0x04, 0xe0, 0xe1, 0x69, 0x14, 0x31, 0xff, 0xf7, + 0x83, 0xfd, 0xe0, 0x69, 0x40, 0x69, 0x0f, 0xf2, 0xa8, 0x37, 0xe0, 0x60, + 0x94, 0xf8, 0x3e, 0x00, 0x02, 0x28, 0x0c, 0xbf, 0x20, 0x6a, 0xe0, 0x69, + 0x00, 0xf1, 0x14, 0x05, 0x00, 0x26, 0x05, 0xeb, 0x86, 0x00, 0x40, 0x68, + 0x08, 0xb1, 0xff, 0xf7, 0x18, 0xff, 0x76, 0x1c, 0x01, 0x2e, 0xf6, 0xd9, + 0xe8, 0x68, 0x28, 0xb1, 0x01, 0x90, 0x00, 0x20, 0x00, 0xf0, 0x6e, 0xf8, + 0xff, 0xf7, 0x12, 0xff, 0x00, 0x26, 0x0f, 0xf2, 0xac, 0x37, 0x05, 0xf1, + 0x10, 0x00, 0x50, 0xf8, 0x26, 0x00, 0x08, 0xb1, 0xff, 0xf7, 0x03, 0xff, + 0x76, 0x1c, 0x01, 0x2e, 0xf5, 0xd9, 0xa1, 0x69, 0x88, 0x7a, 0x18, 0xb1, + 0xa0, 0x6a, 0xff, 0xf7, 0x55, 0xfd, 0x03, 0xe0, 0xe0, 0x68, 0x21, 0x69, + 0x88, 0x42, 0x02, 0xd0, 0x20, 0x46, 0xff, 0xf7, 0x93, 0xff, 0xa0, 0x69, + 0xc1, 0x7a, 0x01, 0x29, 0x04, 0xbf, 0x00, 0x20, 0x60, 0x61, 0x60, 0x69, + 0xfe, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x04, 0x46, 0x88, 0xb0, 0xa0, 0x6a, + 0xc7, 0xa6, 0x02, 0xa9, 0xff, 0xf7, 0x38, 0xfd, 0x00, 0x25, 0x00, 0x27, + 0x02, 0xa8, 0x00, 0xeb, 0x87, 0x01, 0x49, 0x68, 0x41, 0xb1, 0xa2, 0x69, + 0xd0, 0x68, 0x31, 0xea, 0x00, 0x00, 0x18, 0xbf, 0x01, 0x25, 0x01, 0xd1, + 0x00, 0xf0, 0x27, 0xf8, 0x7f, 0x1c, 0x01, 0x2f, 0xee, 0xd9, 0x05, 0x99, + 0x59, 0xb1, 0xa2, 0x69, 0x10, 0x69, 0x31, 0xea, 0x00, 0x00, 0x18, 0xbf, + 0x01, 0x25, 0x04, 0xd1, 0x01, 0x91, 0x00, 0xf0, 0x21, 0xf8, 0x00, 0xf0, + 0x1b, 0xf8, 0x00, 0x27, 0xc4, 0xa6, 0x02, 0xa8, 0x00, 0xeb, 0x87, 0x01, + 0x09, 0x69, 0x41, 0xb1, 0xa2, 0x69, 0x50, 0x69, 0x31, 0xea, 0x00, 0x00, + 0x18, 0xbf, 0x01, 0x25, 0x01, 0xd1, 0x00, 0xf0, 0x06, 0xf8, 0x7f, 0x1c, + 0x01, 0x2f, 0xee, 0xd9, 0x28, 0x46, 0x09, 0xb0, 0xf0, 0xbd, 0x01, 0x91, + 0x00, 0x97, 0x32, 0x46, 0x23, 0x68, 0x02, 0x21, 0x02, 0x20, 0xda, 0xf7, + 0x80, 0xb8, 0x00, 0x00, 0x00, 0x90, 0x02, 0x21, 0xd4, 0xf8, 0x00, 0x30, + 0xab, 0xa2, 0x70, 0x47, 0x38, 0xb5, 0x05, 0x46, 0x05, 0xf1, 0x40, 0x04, + 0x00, 0x20, 0x60, 0x66, 0xa8, 0x60, 0xe8, 0x60, 0x68, 0x61, 0x21, 0xb9, + 0x01, 0x20, 0x85, 0xf8, 0x3e, 0x00, 0x61, 0x60, 0x31, 0xbd, 0xe3, 0xf7, + 0xbd, 0xfe, 0x20, 0x60, 0x00, 0x21, 0x02, 0x20, 0x85, 0xf8, 0x3e, 0x00, + 0xa1, 0x60, 0x31, 0xbd, 0x28, 0x30, 0x01, 0x75, 0x00, 0x68, 0xff, 0xf7, + 0xdd, 0xbc, 0x10, 0xb5, 0x00, 0xf1, 0x28, 0x04, 0x20, 0x68, 0xff, 0xf7, + 0xdb, 0xfc, 0x60, 0x75, 0x10, 0xbd, 0x38, 0xb5, 0x04, 0x46, 0x00, 0x25, + 0x94, 0xf8, 0x3f, 0x00, 0x10, 0xbb, 0x20, 0x68, 0x00, 0x22, 0x01, 0x21, + 0x03, 0xf0, 0x68, 0xfb, 0x20, 0x68, 0x58, 0x49, 0xc0, 0xb2, 0xe2, 0xf7, + 0xa9, 0xfb, 0x20, 0x68, 0x00, 0x23, 0x00, 0x22, 0x01, 0x21, 0xe6, 0xf7, + 0x4f, 0xfb, 0x05, 0x46, 0x20, 0x68, 0xc0, 0xb2, 0xe2, 0xf7, 0x7f, 0xfb, + 0x02, 0x20, 0xe4, 0xf7, 0x03, 0xfa, 0xa0, 0x6a, 0x01, 0x21, 0xff, 0xf7, + 0x9f, 0xfc, 0xa0, 0x6a, 0x01, 0x21, 0xff, 0xf7, 0xb7, 0xfc, 0x01, 0x20, + 0x84, 0xf8, 0x3f, 0x00, 0x28, 0x46, 0x32, 0xbd, 0x70, 0xb5, 0x04, 0x46, + 0x04, 0xf1, 0x3e, 0x06, 0x00, 0x25, 0x70, 0x78, 0x01, 0x28, 0x16, 0xd1, + 0x20, 0x68, 0x00, 0x23, 0x00, 0x22, 0x01, 0x21, 0xe6, 0xf7, 0x35, 0xfb, + 0x05, 0x46, 0xa0, 0x6a, 0x00, 0x21, 0xff, 0xf7, 0x9f, 0xfc, 0x20, 0x68, + 0x00, 0xf0, 0x0b, 0xf8, 0x00, 0x20, 0x30, 0x70, 0x01, 0x22, 0x20, 0x68, + 0x00, 0x21, 0x03, 0xf0, 0x2b, 0xfb, 0x00, 0x20, 0x70, 0x70, 0x28, 0x46, + 0x70, 0xbd, 0x38, 0x49, 0xc0, 0xb2, 0xe2, 0xf7, 0x7e, 0xbb, 0x00, 0x00, + 0x3e, 0xb5, 0x04, 0x46, 0x00, 0x20, 0x84, 0xf8, 0x3e, 0x00, 0xa0, 0x60, + 0xc4, 0xf8, 0xb0, 0x00, 0x40, 0xf2, 0x54, 0x60, 0x63, 0x68, 0x2d, 0x4a, + 0x01, 0x46, 0x58, 0x43, 0x13, 0x18, 0x03, 0xf1, 0x60, 0x00, 0xde, 0xf7, + 0xb7, 0xf9, 0xe0, 0x6a, 0xff, 0xf7, 0x7a, 0xfc, 0x2b, 0x48, 0x22, 0x78, + 0x01, 0x68, 0xe5, 0x6a, 0x0a, 0x44, 0xe0, 0x20, 0x92, 0xf8, 0xbc, 0x30, + 0x43, 0x43, 0x10, 0x22, 0xc8, 0x18, 0x00, 0x21, 0x69, 0x70, 0x2a, 0x70, + 0xc4, 0x30, 0x25, 0x49, 0xa9, 0x60, 0xdf, 0xed, 0x1d, 0x0a, 0x01, 0x69, + 0x00, 0xee, 0x10, 0x1a, 0xb8, 0xee, 0x40, 0x0a, 0x20, 0xee, 0x20, 0x0a, + 0x85, 0xed, 0x01, 0x0a, 0x05, 0xf1, 0x0c, 0x00, 0xd8, 0xf7, 0xda, 0xfe, + 0x05, 0xf1, 0x10, 0x00, 0xd8, 0xf7, 0xdb, 0xfe, 0x69, 0x46, 0x40, 0xf6, + 0xff, 0x70, 0xcb, 0xf7, 0x72, 0xf9, 0x00, 0x28, 0x03, 0xbf, 0xbd, 0xf9, + 0x00, 0x00, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0xc0, 0x0a, 0x9f, 0xed, + 0x0e, 0x0a, 0x85, 0xed, 0x05, 0x0a, 0x20, 0x68, 0x12, 0x49, 0x13, 0x4b, + 0x51, 0xf8, 0x20, 0x20, 0x02, 0x92, 0x53, 0xf8, 0x30, 0x00, 0x01, 0x90, + 0xa1, 0x6b, 0x00, 0x91, 0x63, 0x6b, 0x22, 0x6b, 0xe1, 0x6a, 0x60, 0x6a, + 0xff, 0xf7, 0x38, 0xfc, 0x61, 0x6a, 0xa0, 0x6a, 0xfc, 0xf7, 0x96, 0xff, + 0x00, 0x20, 0x3e, 0xbd, 0x00, 0x00, 0x7a, 0x44, 0x00, 0x00, 0x0c, 0x42, + 0x28, 0x1b, 0x03, 0x21, 0x50, 0x76, 0x02, 0x21, 0x8c, 0x59, 0x02, 0x21, + 0x0c, 0x76, 0x02, 0x21, 0x5c, 0x75, 0x02, 0x21, 0x52, 0xb8, 0x96, 0x40, + 0x60, 0x9a, 0x04, 0x02, 0x1c, 0x92, 0x04, 0x02, 0x2d, 0x2d, 0x2d, 0x3e, + 0x20, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, + 0x25, 0x64, 0x0a, 0x00, 0x41, 0x64, 0x63, 0x52, 0x78, 0x3a, 0x20, 0x63, + 0x68, 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x78, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x2d, 0x2d, 0x2d, 0x3e, 0x20, 0x52, 0x78, 0x49, + 0x6e, 0x69, 0x74, 0x41, 0x3a, 0x20, 0x72, 0x65, 0x67, 0x46, 0x61, 0x69, + 0x6c, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x25, 0x64, 0x0a, 0x00, + 0x2d, 0x2d, 0x2d, 0x3e, 0x20, 0x52, 0x78, 0x49, 0x6e, 0x69, 0x74, 0x42, + 0x20, 0x72, 0x65, 0x67, 0x46, 0x61, 0x69, 0x6c, 0x3a, 0x20, 0x63, 0x68, + 0x25, 0x64, 0x2c, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x52, 0x78, 0x49, 0x6e, + 0x69, 0x74, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x54, 0x4f, + 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x2d, 0x2d, 0x3e, + 0x20, 0x52, 0x78, 0x54, 0x4f, 0x20, 0x72, 0x65, 0x67, 0x46, 0x61, 0x69, + 0x6c, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x25, 0x64, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x52, 0x78, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, + 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x41, 0x64, 0x63, 0x52, + 0x78, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x53, 0x54, 0x47, + 0x31, 0x5b, 0x25, 0x64, 0x5d, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x78, + 0x0a, 0x00, 0x00, 0x00, 0x41, 0x64, 0x63, 0x52, 0x78, 0x3a, 0x20, 0x63, + 0x68, 0x25, 0x64, 0x2c, 0x20, 0x53, 0x54, 0x47, 0x56, 0x5b, 0x25, 0x64, + 0x5d, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x00, + 0x41, 0x64, 0x63, 0x52, 0x78, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, + 0x20, 0x44, 0x52, 0x46, 0x5b, 0x25, 0x64, 0x5d, 0x20, 0x65, 0x72, 0x72, + 0x20, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x43, + 0x05, 0x46, 0x93, 0xb0, 0xdf, 0xf8, 0x10, 0x15, 0x2b, 0x78, 0x0a, 0x68, + 0x70, 0x20, 0x43, 0x43, 0xd0, 0x18, 0x00, 0xf5, 0x32, 0x66, 0x68, 0x68, + 0x00, 0x24, 0x00, 0x28, 0x40, 0xf2, 0x1d, 0x38, 0x7d, 0xd1, 0xdf, 0xf8, + 0xf8, 0x04, 0xdf, 0xf8, 0xf8, 0x34, 0xdf, 0xf8, 0xf8, 0x94, 0x44, 0x60, + 0x00, 0xf1, 0x18, 0x01, 0x01, 0x60, 0x00, 0xf5, 0x15, 0x72, 0x00, 0xf1, + 0x80, 0x01, 0x00, 0xf5, 0x59, 0x77, 0x81, 0x60, 0xc2, 0x60, 0x43, 0x61, + 0x07, 0x61, 0x18, 0x30, 0x28, 0x62, 0x69, 0x62, 0x2f, 0x63, 0x09, 0xf1, + 0x04, 0x00, 0xa8, 0x61, 0x09, 0xf1, 0x20, 0x01, 0x05, 0xf1, 0x36, 0x07, + 0xaa, 0x62, 0xeb, 0x62, 0xe9, 0x61, 0x00, 0x20, 0x78, 0x70, 0x05, 0xf1, + 0xa4, 0x01, 0xe8, 0x60, 0x00, 0x22, 0x00, 0x23, 0x84, 0x46, 0x81, 0xe8, + 0x0d, 0x10, 0x28, 0x68, 0xc0, 0xb2, 0xe9, 0xf7, 0x5e, 0xf8, 0xb1, 0x68, + 0x99, 0xf8, 0x00, 0x30, 0x68, 0x6a, 0x01, 0x22, 0xd4, 0xf7, 0x14, 0xfd, + 0x28, 0x68, 0x30, 0xb9, 0xb3, 0x68, 0x0f, 0xf2, 0x24, 0x72, 0x03, 0x21, + 0x03, 0x20, 0xd9, 0xf7, 0xb0, 0xfe, 0x00, 0xf0, 0xf2, 0xf8, 0x00, 0x26, + 0x00, 0xf0, 0xe0, 0xf8, 0x03, 0x20, 0x00, 0x90, 0x05, 0xf1, 0x50, 0x03, + 0x00, 0x22, 0x00, 0x21, 0x01, 0x20, 0xe9, 0xf7, 0x21, 0xf9, 0xe8, 0x64, + 0x00, 0x21, 0xe9, 0xf7, 0xd3, 0xfa, 0x28, 0x68, 0xdf, 0xf8, 0x5c, 0x14, + 0xc0, 0xb2, 0xe8, 0xf7, 0xb7, 0xff, 0x28, 0x68, 0x31, 0x46, 0x03, 0xf0, + 0xd5, 0xf9, 0x76, 0x1c, 0x04, 0x2e, 0xf8, 0xd3, 0x28, 0x6a, 0x03, 0xa9, + 0xcc, 0xf7, 0x6c, 0xfd, 0x01, 0x28, 0x02, 0xd0, 0x02, 0x20, 0x38, 0x70, + 0x03, 0xe0, 0x00, 0xf0, 0x76, 0xf9, 0x04, 0x00, 0x0a, 0xd1, 0x00, 0xf0, + 0xc2, 0xf8, 0x38, 0xb1, 0x00, 0xf0, 0xb0, 0xf8, 0x0f, 0xf2, 0xc8, 0x62, + 0x03, 0x20, 0xd9, 0xf7, 0x7a, 0xfe, 0x44, 0x46, 0x28, 0x68, 0x01, 0x22, + 0x0c, 0x21, 0x00, 0xf0, 0xa9, 0xfa, 0x3c, 0xb9, 0x18, 0xe0, 0x4f, 0xf6, + 0x52, 0x74, 0x03, 0x22, 0x21, 0x46, 0x01, 0x20, 0xe7, 0xf7, 0xe2, 0xf9, + 0x00, 0x94, 0x03, 0x21, 0x2b, 0x68, 0x0f, 0xf2, 0xb4, 0x62, 0x01, 0x20, + 0xd9, 0xf7, 0x63, 0xfe, 0x03, 0x27, 0x44, 0x45, 0x08, 0xbf, 0x01, 0x27, + 0x3a, 0x46, 0x4f, 0xf4, 0x45, 0x71, 0x01, 0x20, 0xe7, 0xf7, 0xd0, 0xf9, + 0x28, 0x68, 0xdf, 0xf8, 0xd8, 0x13, 0xc0, 0xb2, 0xe8, 0xf7, 0x72, 0xff, + 0x13, 0xb0, 0xbd, 0xe8, 0xf0, 0x83, 0x2d, 0xe9, 0xf8, 0x41, 0x93, 0xb0, + 0x05, 0x46, 0x00, 0x21, 0x00, 0xf0, 0xcf, 0xfa, 0x28, 0x46, 0x00, 0xf0, + 0xe9, 0xfa, 0x00, 0x27, 0x04, 0x00, 0x05, 0xf1, 0x36, 0x06, 0x3f, 0xd1, + 0x28, 0x68, 0xdf, 0xf8, 0x94, 0x23, 0x5f, 0xfa, 0x80, 0xfc, 0x13, 0x68, + 0x70, 0x21, 0x11, 0xfb, 0x0c, 0xfc, 0x03, 0xeb, 0x0c, 0x01, 0x01, 0xf5, + 0x32, 0x68, 0xc0, 0xb2, 0xe8, 0xf7, 0xcf, 0xff, 0x68, 0x69, 0x43, 0x7c, + 0xdf, 0xf8, 0x7c, 0x03, 0x01, 0x78, 0x8b, 0x42, 0x06, 0xd0, 0x03, 0x70, + 0xd8, 0xf8, 0x08, 0x10, 0x68, 0x6a, 0x01, 0x22, 0xd4, 0xf7, 0x7e, 0xfc, + 0x00, 0xf0, 0x65, 0xf8, 0x00, 0xf0, 0x54, 0xf8, 0x28, 0x6a, 0x03, 0xa9, + 0xcc, 0xf7, 0xfa, 0xfc, 0x01, 0x28, 0x04, 0xd1, 0x28, 0x46, 0x00, 0xf0, + 0x13, 0xfa, 0x04, 0x46, 0x01, 0xe0, 0x02, 0x20, 0x30, 0x70, 0x7c, 0xb9, + 0x29, 0x68, 0xdf, 0xf8, 0x4c, 0x03, 0x00, 0xeb, 0x41, 0x02, 0x10, 0x8b, + 0x01, 0x04, 0x07, 0xd5, 0x8d, 0xf8, 0x00, 0x00, 0x6a, 0x46, 0x28, 0x6a, + 0x02, 0x21, 0xcc, 0xf7, 0x3c, 0xfe, 0x07, 0x46, 0x01, 0x20, 0xe8, 0xf7, + 0xd9, 0xf9, 0x2c, 0xbb, 0x00, 0xf0, 0x3b, 0xf8, 0x48, 0xb1, 0x00, 0xf0, + 0x29, 0xf8, 0x0f, 0xf2, 0xec, 0x52, 0x01, 0x20, 0xd9, 0xf7, 0xf3, 0xfd, + 0x40, 0xf2, 0x1d, 0x34, 0x19, 0xe0, 0xe8, 0x6c, 0x00, 0x21, 0xe9, 0xf7, + 0x21, 0xfa, 0x01, 0x20, 0xb0, 0x70, 0x01, 0x22, 0x02, 0x21, 0x00, 0xf0, + 0x86, 0xf9, 0x07, 0x43, 0x01, 0x2f, 0x03, 0xd1, 0x00, 0xf0, 0xd1, 0xf8, + 0x04, 0x00, 0x07, 0xd1, 0x68, 0x69, 0x01, 0x7c, 0x01, 0x29, 0x07, 0xd1, + 0x28, 0x68, 0xe8, 0xf7, 0x5f, 0xff, 0x04, 0x46, 0x14, 0xb1, 0x28, 0x46, + 0x00, 0xf0, 0x94, 0xfa, 0x20, 0x46, 0x14, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, + 0x00, 0x90, 0x03, 0x21, 0x2b, 0x68, 0x70, 0x47, 0x53, 0xf8, 0x20, 0x00, + 0x01, 0x90, 0x03, 0xa8, 0x29, 0x6b, 0x00, 0x91, 0xeb, 0x6a, 0xaa, 0x6a, + 0x69, 0x6a, 0xd4, 0xf7, 0xf3, 0xbb, 0x28, 0x68, 0xc0, 0xb2, 0xe8, 0xf7, + 0x79, 0xbf, 0x28, 0x68, 0xa9, 0x49, 0xaa, 0x4b, 0x51, 0xf8, 0x20, 0x20, + 0x02, 0x92, 0x70, 0x47, 0x2d, 0xe9, 0xfc, 0x47, 0x05, 0x46, 0x95, 0xf8, + 0x36, 0xa0, 0x28, 0x6a, 0x89, 0x46, 0xcc, 0xf7, 0x1b, 0xfd, 0x80, 0x46, + 0x28, 0x46, 0x03, 0xf0, 0x4f, 0xf9, 0x05, 0xf1, 0x3c, 0x06, 0x00, 0x24, + 0x30, 0x68, 0xe3, 0xf7, 0x2b, 0xfc, 0x70, 0x60, 0x00, 0x27, 0x95, 0xf8, + 0x36, 0x10, 0x8a, 0x45, 0x18, 0xbf, 0xf0, 0x60, 0xf3, 0xf7, 0xa4, 0xfe, + 0x10, 0xb1, 0x4f, 0xf0, 0x00, 0x44, 0x05, 0xe0, 0x95, 0xf8, 0x36, 0x00, + 0x08, 0x28, 0x18, 0xbf, 0x0f, 0x28, 0x01, 0xd1, 0x01, 0x27, 0x25, 0xe0, + 0x69, 0x69, 0x48, 0x7b, 0xc8, 0xb9, 0x70, 0x68, 0x09, 0x68, 0x81, 0x42, + 0x15, 0xd2, 0xff, 0xf7, 0xb5, 0xff, 0x0f, 0xf2, 0x24, 0x52, 0x02, 0x20, + 0xd9, 0xf7, 0x7f, 0xfd, 0xff, 0xf7, 0xbd, 0xff, 0x40, 0xf2, 0x15, 0x34, + 0x01, 0x27, 0x40, 0xb1, 0xff, 0xf7, 0xa8, 0xff, 0x0f, 0xf2, 0x1c, 0x52, + 0x01, 0x20, 0xd9, 0xf7, 0x72, 0xfd, 0x40, 0xf2, 0x1d, 0x34, 0x95, 0xf8, + 0x36, 0x00, 0x04, 0x28, 0x04, 0xd1, 0x00, 0x21, 0x28, 0x46, 0x00, 0xf0, + 0xaf, 0xf9, 0x04, 0x46, 0xb8, 0xf1, 0x01, 0x0f, 0x04, 0xd1, 0x00, 0xf0, + 0x52, 0xf8, 0x04, 0x00, 0x2d, 0xd1, 0x00, 0xe0, 0x6c, 0xbb, 0x68, 0x69, + 0x01, 0x7c, 0x01, 0x29, 0x29, 0xd1, 0xd6, 0xf8, 0x78, 0x80, 0x28, 0x68, + 0x00, 0x24, 0xe8, 0xf7, 0x6e, 0xff, 0x80, 0x45, 0xb0, 0x67, 0x1d, 0xd1, + 0x28, 0x68, 0x05, 0xf1, 0xa4, 0x01, 0xe8, 0xf7, 0x4a, 0xff, 0x2b, 0x68, + 0x0f, 0xf2, 0xe4, 0x42, 0x03, 0x21, 0x01, 0x20, 0xd9, 0xf7, 0x45, 0xfd, + 0x69, 0x69, 0x88, 0x7b, 0x60, 0xb1, 0x95, 0xf8, 0xbd, 0x00, 0x0a, 0x28, + 0x08, 0xd2, 0x40, 0x1c, 0x85, 0xf8, 0xbd, 0x00, 0x01, 0x21, 0x28, 0x68, + 0xe8, 0xf7, 0xbe, 0xfe, 0x04, 0x46, 0x01, 0xe0, 0x4f, 0xf4, 0x47, 0x74, + 0x0c, 0xb1, 0x01, 0x27, 0x01, 0xe0, 0x38, 0x00, 0x18, 0xd0, 0x28, 0x46, + 0x00, 0xf0, 0xec, 0xf9, 0x04, 0xb9, 0x04, 0x46, 0x68, 0x69, 0x01, 0x7c, + 0x01, 0x29, 0x05, 0xd1, 0x28, 0x68, 0x00, 0x21, 0xe8, 0xf7, 0xa8, 0xfe, + 0x04, 0xb9, 0x04, 0x46, 0x29, 0x6b, 0xa8, 0x69, 0x14, 0x22, 0xca, 0xf7, + 0xd5, 0xff, 0xa8, 0x69, 0x29, 0x69, 0x01, 0x60, 0xaa, 0x68, 0x42, 0x61, + 0xc9, 0xf8, 0x00, 0x40, 0x38, 0x46, 0xbd, 0xe8, 0xf6, 0x87, 0x28, 0x46, + 0x0a, 0xe1, 0x2d, 0xe9, 0xfe, 0x43, 0x05, 0x46, 0x69, 0x46, 0x06, 0x20, + 0xfa, 0xf7, 0x9d, 0xf9, 0x01, 0x21, 0x28, 0x46, 0x00, 0xf0, 0x89, 0xf9, + 0x4f, 0x48, 0x29, 0x68, 0x30, 0xf8, 0x11, 0x00, 0x00, 0x26, 0x01, 0x04, + 0x07, 0xd5, 0x8d, 0xf8, 0x04, 0x00, 0x01, 0xaa, 0x28, 0x6a, 0x02, 0x21, + 0xcc, 0xf7, 0x2f, 0xfd, 0x06, 0x46, 0x05, 0xf1, 0x3c, 0x07, 0x00, 0x21, + 0x38, 0x69, 0xe9, 0xf7, 0x23, 0xf9, 0x28, 0x68, 0x00, 0x21, 0xe8, 0xf7, + 0x80, 0xfe, 0x04, 0x46, 0x00, 0x98, 0xe6, 0xf7, 0xbf, 0xf9, 0x4f, 0xf0, + 0x00, 0x48, 0x28, 0xb9, 0xf3, 0xf7, 0xec, 0xfd, 0x00, 0x28, 0x59, 0xd0, + 0x44, 0x46, 0x57, 0xe0, 0x00, 0x2c, 0x53, 0xd1, 0x0a, 0x20, 0xe3, 0xf7, + 0xa5, 0xfe, 0x28, 0x68, 0xc0, 0xb2, 0xe8, 0xf7, 0x4a, 0xfe, 0x01, 0x28, + 0x4c, 0xd0, 0x02, 0x22, 0x00, 0xf0, 0x6e, 0xf8, 0x06, 0x43, 0x30, 0x00, + 0x26, 0xd1, 0x00, 0x2c, 0x34, 0xd1, 0x28, 0x6a, 0xcc, 0xf7, 0x36, 0xfc, + 0x06, 0x46, 0xf3, 0xf7, 0xcf, 0xfd, 0x28, 0xbb, 0x78, 0x6e, 0x48, 0xb9, + 0x03, 0x22, 0x00, 0xf0, 0x5d, 0xf8, 0x81, 0x46, 0x28, 0x6a, 0xcc, 0xf7, + 0x29, 0xfc, 0x40, 0xea, 0x09, 0x00, 0x06, 0x43, 0x28, 0x46, 0x03, 0xf0, + 0x5b, 0xf8, 0x95, 0xf8, 0x36, 0x00, 0x0a, 0x28, 0x04, 0xd1, 0x01, 0x21, + 0x28, 0x46, 0x00, 0xf0, 0xf3, 0xf8, 0x04, 0x46, 0x95, 0xf8, 0x36, 0x00, + 0x0d, 0x28, 0x2a, 0xd0, 0x0f, 0x28, 0xd6, 0xd1, 0x00, 0x2c, 0x08, 0xbf, + 0x01, 0x2e, 0x0b, 0xd1, 0xff, 0xf7, 0x8f, 0xff, 0x04, 0x46, 0x07, 0xe0, + 0x00, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x39, 0xf8, 0x28, 0x6a, 0xcc, 0xf7, + 0x05, 0xfc, 0x44, 0x46, 0x38, 0x68, 0xe3, 0xf7, 0x1b, 0xfb, 0xb8, 0x60, + 0x14, 0x22, 0x29, 0x6b, 0xe8, 0x69, 0xca, 0xf7, 0x47, 0xff, 0xe8, 0x69, + 0x29, 0x69, 0x01, 0x60, 0xaa, 0x68, 0x42, 0x61, 0xe6, 0xf7, 0x6b, 0xf9, + 0x01, 0x21, 0x28, 0x68, 0xe8, 0xf7, 0x17, 0xfe, 0x04, 0xb9, 0x04, 0x46, + 0x20, 0x46, 0xbd, 0xe8, 0xfe, 0x83, 0xe9, 0x69, 0x88, 0x69, 0x00, 0xb1, + 0x40, 0x1e, 0x88, 0x61, 0xd0, 0xe7, 0x00, 0x00, 0x5c, 0x75, 0x02, 0x21, + 0x40, 0x58, 0x03, 0x21, 0x68, 0x9c, 0x02, 0x21, 0xe0, 0x3d, 0x00, 0x21, + 0x7b, 0x00, 0x78, 0x00, 0x7f, 0x00, 0x78, 0x00, 0xf4, 0x8a, 0x00, 0x21, + 0xbc, 0x9e, 0x04, 0x02, 0xc4, 0x9e, 0x04, 0x02, 0x0c, 0x8b, 0x00, 0x21, + 0x03, 0x21, 0x28, 0x46, 0x02, 0xf0, 0xfe, 0xbf, 0x10, 0xb5, 0x00, 0x21, + 0x00, 0x22, 0x83, 0x68, 0xd3, 0x40, 0xdc, 0x07, 0x04, 0xd4, 0x52, 0x1c, + 0x20, 0x2a, 0xf8, 0xd3, 0x01, 0x61, 0x10, 0xbd, 0x1b, 0x2a, 0x48, 0xd8, + 0xdf, 0xe8, 0x02, 0xf0, 0x0e, 0x11, 0x14, 0x17, 0x1a, 0x47, 0x47, 0x47, + 0x1d, 0x20, 0x23, 0x26, 0x29, 0x47, 0x47, 0x47, 0x2c, 0x2f, 0x32, 0x35, + 0x38, 0x47, 0x47, 0x47, 0x3b, 0x3e, 0x41, 0x44, 0x40, 0xf2, 0x01, 0x31, + 0xe8, 0xe7, 0x40, 0xf2, 0x02, 0x31, 0xe5, 0xe7, 0x40, 0xf2, 0x03, 0x31, + 0xe2, 0xe7, 0x4f, 0xf4, 0x41, 0x71, 0xdf, 0xe7, 0x40, 0xf2, 0x05, 0x31, + 0xdc, 0xe7, 0x40, 0xf2, 0x06, 0x31, 0xd9, 0xe7, 0x40, 0xf2, 0x07, 0x31, + 0xd6, 0xe7, 0x4f, 0xf4, 0x42, 0x71, 0xd3, 0xe7, 0x40, 0xf2, 0x09, 0x31, + 0xd0, 0xe7, 0x40, 0xf2, 0x0a, 0x31, 0xcd, 0xe7, 0x40, 0xf2, 0x0b, 0x31, + 0xca, 0xe7, 0x4f, 0xf4, 0x43, 0x71, 0xc7, 0xe7, 0x40, 0xf2, 0x0d, 0x31, + 0xc4, 0xe7, 0x40, 0xf2, 0x0e, 0x31, 0xc1, 0xe7, 0x40, 0xf2, 0x0f, 0x31, + 0xbe, 0xe7, 0x4f, 0xf4, 0x44, 0x71, 0xbb, 0xe7, 0x40, 0xf2, 0x11, 0x31, + 0xb8, 0xe7, 0x40, 0xf2, 0x12, 0x31, 0xb5, 0xe7, 0x40, 0xf2, 0x13, 0x31, + 0xb2, 0xe7, 0x40, 0xf2, 0x17, 0x31, 0xaf, 0xe7, 0x38, 0xb5, 0x04, 0x46, + 0x00, 0x25, 0xa1, 0x68, 0x20, 0x6a, 0xe1, 0x60, 0x80, 0x6d, 0x00, 0x68, + 0x62, 0x69, 0x01, 0x46, 0xa1, 0x60, 0x10, 0x7b, 0x18, 0xb1, 0x20, 0x6a, + 0xcc, 0xf7, 0xe4, 0xfb, 0x02, 0xe0, 0xe0, 0x68, 0x81, 0x42, 0x02, 0xd0, + 0x20, 0x46, 0xff, 0xf7, 0x8f, 0xff, 0x20, 0x69, 0x40, 0xf2, 0x01, 0x32, + 0x81, 0x1a, 0x03, 0xd0, 0x49, 0x1f, 0x01, 0xd0, 0x49, 0x1f, 0x01, 0xd1, + 0x25, 0x61, 0x00, 0xe0, 0x05, 0x46, 0x60, 0x69, 0x41, 0x7b, 0x01, 0x29, + 0x08, 0xbf, 0x00, 0x25, 0x28, 0x46, 0x32, 0xbd, 0x20, 0x30, 0x01, 0x75, + 0x42, 0x75, 0x00, 0x68, 0xcc, 0xf7, 0x79, 0xbb, 0x10, 0xb5, 0x00, 0xf1, + 0x20, 0x04, 0x20, 0x68, 0xcc, 0xf7, 0xb7, 0xfb, 0xa0, 0x75, 0x10, 0xbd, + 0x38, 0xb5, 0x04, 0x46, 0x08, 0x46, 0x15, 0x46, 0x6a, 0x46, 0x0d, 0xf1, + 0x01, 0x01, 0xe8, 0xf7, 0xef, 0xfc, 0x9d, 0xf8, 0x00, 0x20, 0x9d, 0xf8, + 0x01, 0x10, 0x2b, 0x46, 0x20, 0x46, 0xe8, 0xf7, 0xf9, 0xfc, 0x31, 0xbd, + 0xf8, 0xb5, 0x04, 0x46, 0x0e, 0x46, 0xe3, 0xf7, 0x09, 0xfa, 0x07, 0x46, + 0x30, 0x00, 0x04, 0xf1, 0xa0, 0x05, 0x0a, 0xd0, 0x60, 0x69, 0x41, 0x68, + 0xe0, 0x6c, 0xe8, 0xf7, 0xdf, 0xff, 0x01, 0x28, 0x03, 0xd1, 0x28, 0x68, + 0x40, 0x1c, 0x28, 0x60, 0x23, 0xe0, 0xf3, 0xf7, 0xad, 0xfc, 0x00, 0xbb, + 0x20, 0x68, 0xc0, 0xb2, 0xe8, 0xf7, 0x1b, 0xfd, 0x01, 0x00, 0x13, 0xd1, + 0x30, 0x00, 0x18, 0xd0, 0x38, 0x46, 0xe3, 0xf7, 0x1f, 0xfa, 0x61, 0x69, + 0x8a, 0x68, 0x82, 0x42, 0xe2, 0xd2, 0x00, 0x22, 0x05, 0x21, 0x20, 0x46, + 0x02, 0xf0, 0x2e, 0xff, 0x20, 0x6a, 0xcc, 0xf7, 0xf9, 0xfa, 0x40, 0xf2, + 0x1e, 0x35, 0x0a, 0xe0, 0x29, 0x6a, 0x49, 0x1c, 0x29, 0x62, 0x01, 0x46, + 0x20, 0x68, 0x02, 0xf0, 0xff, 0xfe, 0x20, 0x46, 0xff, 0xf7, 0x7a, 0xff, + 0x05, 0x46, 0x28, 0x46, 0xf2, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x04, 0xf1, + 0x38, 0x05, 0x00, 0x20, 0xa8, 0x66, 0xa0, 0x60, 0x20, 0x61, 0x28, 0x70, + 0x0e, 0x46, 0xe3, 0xf7, 0xc3, 0xf9, 0x68, 0x60, 0x5e, 0xb9, 0x04, 0xf1, + 0xbc, 0x00, 0x00, 0x21, 0x01, 0x70, 0xe9, 0x67, 0x41, 0x60, 0xa9, 0x60, + 0x20, 0x68, 0xbd, 0xe8, 0x70, 0x40, 0xe8, 0xf7, 0x6d, 0xbd, 0x00, 0x20, + 0xe8, 0x60, 0x70, 0xbd, 0x10, 0xb5, 0x04, 0x46, 0x00, 0x20, 0x94, 0xf8, + 0x38, 0x10, 0xb1, 0xb9, 0x20, 0x68, 0x04, 0xf1, 0x3b, 0x03, 0x04, 0xf1, + 0x3a, 0x02, 0x04, 0xf1, 0x39, 0x01, 0xe8, 0xf7, 0xb0, 0xfc, 0x20, 0x68, + 0x01, 0x22, 0x11, 0x21, 0xff, 0xf7, 0x7e, 0xff, 0x20, 0x68, 0x00, 0x23, + 0x00, 0x22, 0x01, 0x21, 0xe5, 0xf7, 0xa4, 0xfe, 0x01, 0x21, 0x84, 0xf8, + 0x38, 0x10, 0x10, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x04, 0xf1, 0x37, 0x06, + 0x00, 0x25, 0x70, 0x78, 0x01, 0x28, 0x11, 0xd1, 0xa1, 0x69, 0xa0, 0x68, + 0x48, 0x61, 0x75, 0x70, 0x35, 0x70, 0x00, 0x23, 0x20, 0x68, 0x00, 0x22, + 0x01, 0x21, 0xe5, 0xf7, 0xa6, 0xfe, 0x05, 0x46, 0x33, 0x79, 0xf2, 0x78, + 0xb1, 0x78, 0x20, 0x68, 0xe8, 0xf7, 0x64, 0xfc, 0x28, 0x46, 0x70, 0xbd, + 0x20, 0x20, 0x4f, 0x72, 0x78, 0x20, 0x41, 0x44, 0x43, 0x20, 0x72, 0x61, + 0x74, 0x65, 0x3a, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x2d, 0x2d, 0x2d, 0x3e, + 0x20, 0x4f, 0x72, 0x78, 0x20, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x63, 0x68, + 0x25, 0x64, 0x2c, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x41, 0x64, 0x63, 0x4f, + 0x72, 0x78, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, + 0x72, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x00, 0x2d, 0x2d, 0x2d, 0x3e, + 0x20, 0x4f, 0x72, 0x78, 0x49, 0x6e, 0x69, 0x74, 0x20, 0x72, 0x65, 0x67, + 0x46, 0x61, 0x69, 0x6c, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, + 0x25, 0x64, 0x0a, 0x00, 0x4f, 0x72, 0x78, 0x3a, 0x20, 0x63, 0x68, 0x25, + 0x64, 0x2c, 0x20, 0x54, 0x4f, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x00, + 0x2d, 0x2d, 0x2d, 0x3e, 0x20, 0x4f, 0x72, 0x78, 0x54, 0x4f, 0x20, 0x72, + 0x65, 0x67, 0x46, 0x61, 0x69, 0x6c, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, + 0x2c, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x4f, 0x72, 0x78, 0x3a, + 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x64, 0x61, 0x63, 0x20, 0x73, + 0x74, 0x75, 0x63, 0x6b, 0x0a, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x78, 0x17, + 0x09, 0x68, 0x0a, 0x18, 0xed, 0x20, 0x92, 0xf8, 0xbc, 0x30, 0x43, 0x43, + 0xc8, 0x18, 0x00, 0xf2, 0x44, 0x40, 0x70, 0x47, 0xf8, 0xb5, 0x04, 0x46, + 0x20, 0x68, 0x65, 0x68, 0xc0, 0xb2, 0xff, 0xf7, 0xed, 0xff, 0xff, 0x2d, + 0x00, 0xf0, 0x98, 0x80, 0x18, 0x21, 0xdf, 0xf8, 0x50, 0x27, 0x69, 0x43, + 0x4f, 0xf4, 0x0d, 0x73, 0x11, 0x44, 0x6b, 0x43, 0x00, 0x27, 0x1a, 0x44, + 0x4f, 0x60, 0x02, 0xf1, 0x60, 0x06, 0x4f, 0xf4, 0x13, 0x7c, 0x0e, 0x60, + 0x0c, 0xfb, 0x05, 0xfc, 0xdf, 0xf8, 0x30, 0x77, 0xbc, 0x44, 0x43, 0xf2, + 0xf8, 0x5e, 0x02, 0xf1, 0xc8, 0x03, 0x02, 0xf5, 0xfc, 0x76, 0x0c, 0xeb, + 0x0e, 0x07, 0x02, 0xf5, 0x07, 0x7c, 0x8b, 0x60, 0xce, 0x60, 0x4f, 0x61, + 0xc1, 0xf8, 0x10, 0xc0, 0x02, 0xf1, 0x60, 0x01, 0x21, 0x62, 0x63, 0x62, + 0x1c, 0x21, 0xdf, 0xf8, 0x08, 0x27, 0xa6, 0x62, 0x4d, 0x43, 0x51, 0x19, + 0x0b, 0x1d, 0xa3, 0x61, 0x01, 0xf1, 0x74, 0x05, 0x00, 0x21, 0x84, 0xf8, + 0x37, 0x10, 0xe7, 0x62, 0xe5, 0x61, 0x00, 0x23, 0x04, 0xf1, 0xa4, 0x01, + 0xc4, 0xf8, 0x30, 0xc0, 0xe3, 0x60, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, + 0x81, 0xe8, 0xe8, 0x00, 0x00, 0xf1, 0xa7, 0x05, 0x12, 0x78, 0x29, 0x68, + 0x60, 0x6a, 0xd4, 0xf7, 0xcb, 0xfc, 0x20, 0x68, 0x30, 0xb9, 0x2b, 0x68, + 0x0f, 0xf2, 0xcc, 0x62, 0x04, 0x21, 0x03, 0x20, 0xd9, 0xf7, 0x63, 0xfa, + 0x20, 0x46, 0x00, 0xf0, 0x18, 0xfb, 0x05, 0x46, 0x03, 0x20, 0x00, 0x90, + 0x04, 0xf1, 0x50, 0x03, 0x00, 0x22, 0x00, 0x21, 0x01, 0x20, 0xe8, 0xf7, + 0xd5, 0xfc, 0xe0, 0x64, 0x00, 0x21, 0xe8, 0xf7, 0x87, 0xfe, 0x20, 0x68, + 0x01, 0x21, 0xc0, 0xb2, 0x02, 0xf0, 0x16, 0xfe, 0x20, 0x68, 0x31, 0x46, + 0x02, 0xf0, 0x04, 0xff, 0x76, 0x1c, 0x04, 0x2e, 0xf8, 0xd3, 0x6d, 0xb9, + 0x20, 0x68, 0x00, 0xf0, 0x61, 0xf8, 0xe0, 0xb1, 0x00, 0x90, 0x04, 0x21, + 0x23, 0x68, 0x0f, 0xf2, 0x8c, 0x62, 0x03, 0x20, 0xd9, 0xf7, 0x39, 0xfa, + 0x4f, 0xf4, 0x83, 0x65, 0x00, 0x95, 0x04, 0x21, 0x23, 0x68, 0x0f, 0xf2, + 0x94, 0x62, 0x01, 0x20, 0xd9, 0xf7, 0x2f, 0xfa, 0x03, 0x26, 0xb5, 0xf5, + 0x83, 0x6f, 0x08, 0xbf, 0x01, 0x26, 0x32, 0x46, 0x40, 0xf2, 0x0e, 0x41, + 0x01, 0x20, 0xe6, 0xf7, 0x9b, 0xfd, 0x20, 0x68, 0xbd, 0xe8, 0xf4, 0x40, + 0x00, 0x21, 0xc0, 0xb2, 0x02, 0xf0, 0xe6, 0xbd, 0x4f, 0xf6, 0x52, 0x75, + 0xe2, 0xe7, 0x38, 0xb5, 0x05, 0x46, 0x00, 0x21, 0x00, 0xf0, 0x81, 0xfa, + 0x28, 0x46, 0x00, 0xf0, 0xca, 0xfa, 0x04, 0x00, 0x03, 0xd1, 0x28, 0x46, + 0x00, 0xf0, 0x94, 0xfa, 0x04, 0x46, 0x14, 0xbb, 0x00, 0xf0, 0x27, 0xf8, + 0x50, 0xb1, 0x00, 0x90, 0x04, 0x21, 0x2b, 0x68, 0x0f, 0xf2, 0x48, 0x62, + 0x01, 0x20, 0xd9, 0xf7, 0x00, 0xfa, 0x4f, 0xf4, 0x83, 0x64, 0x15, 0xe0, + 0xe8, 0x6c, 0x00, 0x21, 0xe8, 0xf7, 0x2e, 0xfe, 0x01, 0x22, 0x02, 0x21, + 0x28, 0x46, 0x02, 0xf0, 0x95, 0xfd, 0x01, 0x28, 0x04, 0xd1, 0x28, 0x46, + 0x00, 0xf0, 0x25, 0xfa, 0x04, 0x00, 0x04, 0xd1, 0x28, 0x68, 0x01, 0x21, + 0x02, 0xf0, 0xdf, 0xfd, 0x04, 0x46, 0x14, 0xb1, 0x28, 0x46, 0x00, 0xf0, + 0x82, 0xfa, 0x20, 0x46, 0x32, 0xbd, 0x28, 0x68, 0xc0, 0xb2, 0x02, 0xf0, + 0x01, 0xbe, 0x2d, 0xe9, 0xf8, 0x4f, 0x05, 0x46, 0x89, 0x46, 0x05, 0xf1, + 0x36, 0x01, 0x00, 0x24, 0x88, 0x78, 0x00, 0x27, 0x00, 0x28, 0x00, 0xf0, + 0xa9, 0x80, 0x95, 0xf8, 0x36, 0xa0, 0x28, 0x6a, 0xcc, 0xf7, 0x3c, 0xf9, + 0x80, 0x46, 0x28, 0x46, 0x02, 0xf0, 0x70, 0xfd, 0x05, 0xf1, 0x3c, 0x06, + 0xa3, 0x46, 0x30, 0x68, 0xe3, 0xf7, 0x4c, 0xf8, 0x70, 0x60, 0x95, 0xf8, + 0x36, 0x10, 0x8a, 0x45, 0x18, 0xbf, 0xf0, 0x60, 0xf3, 0xf7, 0xc6, 0xfa, + 0x10, 0xb1, 0x4f, 0xf0, 0x00, 0x44, 0x07, 0xe0, 0x05, 0xf1, 0x36, 0x0a, + 0x9a, 0xf8, 0x00, 0x00, 0x08, 0x28, 0x18, 0xbf, 0x0f, 0x28, 0x01, 0xd1, + 0x01, 0x27, 0x2c, 0xe0, 0x69, 0x69, 0x48, 0x7b, 0xd8, 0xb9, 0x70, 0x68, + 0x09, 0x68, 0x81, 0x42, 0x17, 0xd2, 0x00, 0x90, 0x04, 0x21, 0x2b, 0x68, + 0x0f, 0xf2, 0xa4, 0x52, 0x02, 0x20, 0xd9, 0xf7, 0x9e, 0xf9, 0xff, 0xf7, + 0xba, 0xff, 0x4f, 0xf4, 0x82, 0x64, 0x01, 0x27, 0x48, 0xb1, 0x00, 0x90, + 0x04, 0x21, 0x2b, 0x68, 0x0f, 0xf2, 0x9c, 0x52, 0x01, 0x20, 0xd9, 0xf7, + 0x90, 0xf9, 0x4f, 0xf4, 0x83, 0x64, 0x9a, 0xf8, 0x00, 0x00, 0x04, 0x28, + 0x09, 0xd1, 0x28, 0x68, 0xc0, 0xb2, 0x02, 0xf0, 0x73, 0xfd, 0x01, 0x28, + 0x03, 0xd1, 0x28, 0x68, 0x01, 0x21, 0x02, 0xf0, 0x79, 0xfe, 0xb8, 0xf1, + 0x01, 0x0f, 0x05, 0xd1, 0x28, 0x46, 0x00, 0xf0, 0xb0, 0xf9, 0x04, 0x00, + 0x29, 0xd1, 0x00, 0xe0, 0x4c, 0xbb, 0xd6, 0xf8, 0x78, 0xa0, 0x28, 0x68, + 0x00, 0x24, 0x02, 0xf0, 0xf3, 0xfd, 0x82, 0x45, 0xb0, 0x67, 0x1d, 0xd1, + 0x28, 0x68, 0x05, 0xf1, 0xa4, 0x01, 0x02, 0xf0, 0xd0, 0xfd, 0x2b, 0x68, + 0x0f, 0xf2, 0x60, 0x52, 0x03, 0x21, 0x01, 0x20, 0xd9, 0xf7, 0x61, 0xf9, + 0x69, 0x69, 0x88, 0x7b, 0x60, 0xb1, 0x95, 0xf8, 0xbd, 0x00, 0x0a, 0x28, + 0x08, 0xd2, 0x40, 0x1c, 0x85, 0xf8, 0xbd, 0x00, 0x01, 0x21, 0x28, 0x68, + 0x02, 0xf0, 0x49, 0xfd, 0x04, 0x46, 0x01, 0xe0, 0x40, 0xf2, 0x17, 0x44, + 0x0c, 0xb1, 0x01, 0x27, 0x09, 0xe0, 0xff, 0xb1, 0x00, 0x2c, 0x08, 0xbf, + 0xb8, 0xf1, 0x01, 0x0f, 0x03, 0xd1, 0x28, 0x46, 0x00, 0xf0, 0x79, 0xf9, + 0x83, 0x46, 0x28, 0x46, 0x00, 0xf0, 0xdd, 0xf9, 0x04, 0xb9, 0x04, 0x46, + 0x28, 0x68, 0x00, 0x21, 0x02, 0xf0, 0x2f, 0xfd, 0x14, 0xb9, 0x04, 0x46, + 0x04, 0xb9, 0x5c, 0x46, 0x29, 0x6b, 0xa8, 0x69, 0x14, 0x22, 0xca, 0xf7, + 0xeb, 0xfb, 0xa8, 0x69, 0x29, 0x69, 0x01, 0x60, 0xaa, 0x68, 0x42, 0x61, + 0xc9, 0xf8, 0x00, 0x40, 0x38, 0x46, 0xbd, 0xe8, 0xf2, 0x8f, 0x2d, 0xe9, + 0xf8, 0x4f, 0x07, 0x46, 0x84, 0xb0, 0x39, 0x68, 0x01, 0x91, 0x08, 0x46, + 0xf6, 0xf7, 0x39, 0xfd, 0x03, 0x90, 0x4f, 0xf0, 0x00, 0x49, 0xf8, 0x69, + 0x80, 0x69, 0x00, 0x28, 0x07, 0xbf, 0x08, 0x21, 0x8d, 0xf8, 0x00, 0x10, + 0x09, 0x22, 0x8d, 0xf8, 0x00, 0x20, 0x00, 0x23, 0x02, 0x93, 0x38, 0xb3, + 0x03, 0x99, 0x01, 0x20, 0x02, 0x29, 0x02, 0x90, 0x0a, 0xd1, 0x9d, 0xf8, + 0x00, 0x20, 0x01, 0x98, 0x01, 0x21, 0xf6, 0xf7, 0xae, 0xfc, 0x05, 0x00, + 0x40, 0xf0, 0xc7, 0x80, 0x00, 0xe0, 0x01, 0x94, 0x02, 0x98, 0x80, 0xf0, + 0x01, 0x00, 0x8d, 0xf8, 0x01, 0x00, 0x01, 0x21, 0x38, 0x46, 0x07, 0xf1, + 0x3c, 0x06, 0x00, 0xf0, 0x5e, 0xf9, 0x30, 0x69, 0x00, 0x21, 0xe8, 0xf7, + 0x23, 0xfd, 0x02, 0x22, 0x03, 0x21, 0x38, 0x46, 0x02, 0xf0, 0x8a, 0xfc, + 0x00, 0x25, 0xa8, 0x46, 0x04, 0x46, 0x5f, 0xe0, 0x01, 0x9c, 0x14, 0x21, + 0x20, 0x46, 0xf6, 0xf7, 0x47, 0xfc, 0x01, 0x28, 0xdf, 0xd0, 0xf3, 0xf7, + 0xe7, 0xf9, 0x00, 0x28, 0xf5, 0xd0, 0x4d, 0x46, 0xa8, 0xe0, 0xd7, 0xf8, + 0xc0, 0x00, 0x40, 0x1c, 0xc7, 0xf8, 0xc0, 0x00, 0x38, 0x68, 0x02, 0xf0, + 0xc9, 0xfd, 0x38, 0x46, 0x00, 0xf0, 0x03, 0xf9, 0x05, 0x46, 0x34, 0xe0, + 0x00, 0x2d, 0x04, 0xbf, 0x5f, 0xfa, 0x88, 0xf0, 0x00, 0x28, 0x43, 0xd1, + 0x00, 0xf0, 0x98, 0xf8, 0x04, 0x43, 0x00, 0xf0, 0x99, 0xf8, 0x97, 0xf8, + 0x36, 0x00, 0x0a, 0x28, 0x36, 0xd1, 0x00, 0xf0, 0x8f, 0xf8, 0x04, 0x43, + 0xe2, 0xf7, 0x0c, 0xff, 0x5f, 0xfa, 0x84, 0xfa, 0x04, 0x46, 0x78, 0x69, + 0x41, 0x68, 0x30, 0x69, 0xe8, 0xf7, 0xe4, 0xfc, 0x01, 0x28, 0x57, 0xd0, + 0xf3, 0xf7, 0xb6, 0xf9, 0x00, 0x28, 0xd8, 0xd1, 0x38, 0x68, 0xc0, 0xb2, + 0x02, 0xf0, 0x92, 0xfc, 0x01, 0x00, 0xca, 0xd1, 0x20, 0x46, 0xe2, 0xf7, + 0x29, 0xff, 0x79, 0x69, 0x8a, 0x68, 0x82, 0x42, 0xe7, 0xd2, 0x00, 0xf0, + 0x76, 0xf8, 0x00, 0xf0, 0x6d, 0xf8, 0x40, 0xf2, 0x19, 0x45, 0x00, 0xf0, + 0x6d, 0xf8, 0x54, 0x46, 0x5c, 0xb9, 0x00, 0x2d, 0xc4, 0xd1, 0x00, 0xf0, + 0x63, 0xf8, 0x00, 0xf0, 0x64, 0xf8, 0x97, 0xf8, 0x36, 0x00, 0x0b, 0x28, + 0xf4, 0xd1, 0x4f, 0xf0, 0x01, 0x0b, 0xd8, 0x46, 0xe0, 0xb2, 0x00, 0x28, + 0xc3, 0x46, 0xb5, 0xd0, 0x9d, 0xf8, 0x01, 0x00, 0x10, 0xb1, 0x38, 0x68, + 0xf6, 0xf7, 0xce, 0xfb, 0x03, 0x22, 0x03, 0x21, 0x38, 0x46, 0x02, 0xf0, + 0x17, 0xfc, 0x04, 0x43, 0xe4, 0xb2, 0xa4, 0xb9, 0x35, 0xbb, 0x00, 0xf0, + 0x45, 0xf8, 0x00, 0xf0, 0x46, 0xf8, 0xf3, 0xf7, 0x77, 0xf9, 0x30, 0xb1, + 0x00, 0xf0, 0x45, 0xf8, 0x04, 0x43, 0x00, 0xf0, 0x3b, 0xf8, 0x04, 0x43, + 0x4d, 0x46, 0x97, 0xf8, 0x36, 0x00, 0x0d, 0x28, 0x0e, 0xd0, 0x0f, 0x28, + 0xe9, 0xd1, 0x00, 0x2d, 0x08, 0xbf, 0x01, 0x2c, 0x0e, 0xd1, 0x38, 0x46, + 0x00, 0xf0, 0x8d, 0xf8, 0x05, 0x46, 0x09, 0xe0, 0x70, 0x6e, 0x40, 0x1c, + 0x70, 0x66, 0x80, 0xe7, 0xf9, 0x69, 0x88, 0x69, 0x00, 0xb1, 0x40, 0x1e, + 0x88, 0x61, 0xec, 0xe7, 0x30, 0x68, 0xe2, 0xf7, 0xd1, 0xfe, 0xb0, 0x60, + 0x14, 0x22, 0x39, 0x6b, 0xf8, 0x69, 0xca, 0xf7, 0xfd, 0xfa, 0xf8, 0x69, + 0x39, 0x69, 0x01, 0x60, 0xba, 0x68, 0x42, 0x61, 0x02, 0x98, 0x58, 0xb1, + 0x03, 0x98, 0x02, 0x28, 0x08, 0xd1, 0x9d, 0xf8, 0x00, 0x20, 0x01, 0x98, + 0x00, 0x23, 0x01, 0x21, 0xf6, 0xf7, 0x07, 0xfc, 0x05, 0xb9, 0x05, 0x46, + 0x28, 0x46, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x38, 0x6a, 0xcb, 0xf7, + 0x97, 0xbf, 0x04, 0x46, 0x38, 0x46, 0x02, 0xf0, 0xcb, 0xbb, 0x00, 0x22, + 0x05, 0x21, 0x38, 0x46, 0x02, 0xf0, 0xc0, 0xbb, 0x10, 0xb5, 0x00, 0x21, + 0x00, 0x22, 0x83, 0x68, 0xd3, 0x40, 0xdc, 0x07, 0x04, 0xd4, 0x52, 0x1c, + 0x20, 0x2a, 0xf8, 0xd3, 0x01, 0x61, 0x10, 0xbd, 0xd2, 0xb1, 0x01, 0x2a, + 0x1b, 0xd0, 0x02, 0x2a, 0x1c, 0xd0, 0x03, 0x2a, 0x1d, 0xd0, 0x04, 0x2a, + 0x1e, 0xd0, 0x08, 0x2a, 0x1f, 0xd0, 0x09, 0x2a, 0x20, 0xd0, 0x0a, 0x2a, + 0x21, 0xd0, 0x0b, 0x2a, 0x22, 0xd0, 0x0c, 0x2a, 0x23, 0xd0, 0x18, 0x2a, + 0x24, 0xd0, 0x19, 0x2a, 0x25, 0xd0, 0x1a, 0x2a, 0x26, 0xd0, 0x1b, 0x2a, + 0x27, 0xd0, 0x29, 0xe0, 0x40, 0xf2, 0x01, 0x41, 0xde, 0xe7, 0x40, 0xf2, + 0x02, 0x41, 0xdb, 0xe7, 0x40, 0xf2, 0x03, 0x41, 0xd8, 0xe7, 0x40, 0xf2, + 0x04, 0x41, 0xd5, 0xe7, 0x40, 0xf2, 0x05, 0x41, 0xd2, 0xe7, 0x40, 0xf2, + 0x06, 0x41, 0xcf, 0xe7, 0x40, 0xf2, 0x07, 0x41, 0xcc, 0xe7, 0x4f, 0xf4, + 0x81, 0x61, 0xc9, 0xe7, 0x40, 0xf2, 0x09, 0x41, 0xc6, 0xe7, 0x40, 0xf2, + 0x0a, 0x41, 0xc3, 0xe7, 0x40, 0xf2, 0x0b, 0x41, 0xc0, 0xe7, 0x40, 0xf2, + 0x0c, 0x41, 0xbd, 0xe7, 0x40, 0xf2, 0x0d, 0x41, 0xba, 0xe7, 0x40, 0xf2, + 0x0f, 0x41, 0xb7, 0xe7, 0x40, 0xf2, 0x12, 0x41, 0xb4, 0xe7, 0x38, 0xb5, + 0x04, 0x46, 0x00, 0x25, 0xa1, 0x68, 0x20, 0x6a, 0xe1, 0x60, 0x80, 0x6d, + 0x00, 0x68, 0x62, 0x69, 0x01, 0x46, 0xa1, 0x60, 0x10, 0x7b, 0x18, 0xb1, + 0x20, 0x6a, 0xcb, 0xf7, 0xab, 0xff, 0x02, 0xe0, 0xe0, 0x68, 0x81, 0x42, + 0x02, 0xd0, 0x20, 0x46, 0xff, 0xf7, 0x94, 0xff, 0x20, 0x69, 0x40, 0xf2, + 0x01, 0x42, 0x81, 0x1a, 0x01, 0xd0, 0x49, 0x1f, 0x01, 0xd1, 0x25, 0x61, + 0x00, 0xe0, 0x05, 0x46, 0x60, 0x69, 0x41, 0x7b, 0x01, 0x29, 0x08, 0xbf, + 0x00, 0x25, 0x28, 0x46, 0x32, 0xbd, 0x20, 0x30, 0x01, 0x75, 0x42, 0x75, + 0x00, 0x68, 0xcb, 0xf7, 0x42, 0xbf, 0x10, 0xb5, 0x00, 0xf1, 0x20, 0x04, + 0x20, 0x68, 0xcb, 0xf7, 0x80, 0xff, 0xa0, 0x75, 0x10, 0xbd, 0x70, 0xb5, + 0x04, 0x46, 0x04, 0xf1, 0x38, 0x05, 0x00, 0x20, 0xa8, 0x66, 0xa0, 0x60, + 0x20, 0x61, 0x28, 0x70, 0x0e, 0x46, 0xe2, 0xf7, 0xdd, 0xfd, 0x68, 0x60, + 0x4e, 0xb9, 0x00, 0x20, 0xe8, 0x67, 0xc4, 0xf8, 0xc0, 0x00, 0xa8, 0x60, + 0x20, 0x68, 0xbd, 0xe8, 0x70, 0x40, 0x02, 0xf0, 0xf3, 0xbb, 0x00, 0x20, + 0xe8, 0x60, 0x70, 0xbd, 0x10, 0xb5, 0x04, 0x46, 0x00, 0x20, 0x94, 0xf8, + 0x38, 0x10, 0x79, 0xb9, 0x20, 0x68, 0x00, 0x23, 0x0a, 0x22, 0x01, 0x21, + 0xe5, 0xf7, 0xa4, 0xfa, 0x28, 0xb9, 0x20, 0x68, 0x00, 0x23, 0x0a, 0x22, + 0x01, 0x21, 0xf6, 0xf7, 0x12, 0xfb, 0x01, 0x21, 0x84, 0xf8, 0x38, 0x10, + 0x10, 0xbd, 0x38, 0xb5, 0x05, 0x46, 0x05, 0xf1, 0x37, 0x00, 0x00, 0x24, + 0x41, 0x78, 0x01, 0x29, 0x0f, 0xd1, 0x44, 0x70, 0x04, 0x70, 0x00, 0x23, + 0x28, 0x68, 0x0a, 0x22, 0xe5, 0xf7, 0xa4, 0xfa, 0x04, 0x46, 0x28, 0x68, + 0x00, 0x23, 0x0a, 0x22, 0x01, 0x21, 0xf6, 0xf7, 0x22, 0xfb, 0x04, 0xb9, + 0x04, 0x46, 0x20, 0x46, 0x32, 0xbd, 0x78, 0xb5, 0x04, 0x46, 0x93, 0xb0, + 0x20, 0x68, 0xc0, 0xb2, 0xff, 0xf7, 0x76, 0xfc, 0x06, 0x46, 0x20, 0x68, + 0xc0, 0xb2, 0x02, 0xf0, 0x41, 0xfb, 0x60, 0x69, 0x42, 0x7c, 0x19, 0x48, + 0x01, 0x78, 0x00, 0x25, 0x8a, 0x42, 0x05, 0xd0, 0x02, 0x70, 0xd6, 0xf8, + 0xa7, 0x10, 0x60, 0x6a, 0xd4, 0xf7, 0x8e, 0xf9, 0x20, 0x68, 0x14, 0x49, + 0x14, 0x4b, 0x51, 0xf8, 0x20, 0x20, 0x02, 0x92, 0x53, 0xf8, 0x20, 0x00, + 0x01, 0x90, 0x03, 0xa8, 0x21, 0x6b, 0x00, 0x91, 0xe3, 0x6a, 0xa2, 0x6a, + 0x61, 0x6a, 0xd4, 0xf7, 0x6d, 0xf9, 0x20, 0x6a, 0x03, 0xa9, 0xcb, 0xf7, + 0xf9, 0xfd, 0x01, 0x28, 0x04, 0xd1, 0x20, 0x46, 0xff, 0xf7, 0x4b, 0xff, + 0x05, 0x46, 0x02, 0xe0, 0x02, 0x20, 0x84, 0xf8, 0x36, 0x00, 0x28, 0x46, + 0x14, 0xb0, 0x70, 0xbd, 0x5c, 0x75, 0x02, 0x21, 0x10, 0x4f, 0x03, 0x21, + 0x50, 0x76, 0x02, 0x21, 0x14, 0x3f, 0x00, 0x21, 0x00, 0x9a, 0x04, 0x02, + 0xe0, 0x98, 0x04, 0x02, 0x20, 0x20, 0x54, 0x78, 0x20, 0x20, 0x41, 0x44, + 0x43, 0x20, 0x72, 0x61, 0x74, 0x65, 0x3a, 0x20, 0x25, 0x64, 0x0a, 0x00, + 0x2d, 0x2d, 0x2d, 0x3e, 0x20, 0x54, 0x78, 0x4c, 0x42, 0x20, 0x76, 0x65, + 0x72, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x25, 0x64, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x78, 0x6c, 0x62, 0x3a, 0x20, 0x63, 0x68, + 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x78, 0x0a, 0x00, + 0x2d, 0x2d, 0x2d, 0x3e, 0x20, 0x54, 0x78, 0x6c, 0x62, 0x20, 0x72, 0x65, + 0x67, 0x46, 0x61, 0x69, 0x6c, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, + 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x54, 0x78, 0x6c, 0x62, + 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x54, 0x4f, 0x20, 0x25, + 0x64, 0x0a, 0x00, 0x00, 0x2d, 0x2d, 0x2d, 0x3e, 0x20, 0x54, 0x78, 0x6c, + 0x62, 0x54, 0x4f, 0x20, 0x72, 0x65, 0x67, 0x46, 0x61, 0x69, 0x6c, 0x3a, + 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, + 0x4f, 0x72, 0x78, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x64, + 0x61, 0x63, 0x20, 0x73, 0x74, 0x75, 0x63, 0x6b, 0x0a, 0x00, 0x00, 0x00, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x70, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x13, 0x46, 0xdf, 0xf8, 0xd4, 0x23, 0x52, 0xf8, + 0x20, 0x00, 0x09, 0x29, 0x2e, 0xd8, 0xdf, 0xe8, 0x01, 0xf0, 0x05, 0x0d, + 0x15, 0x09, 0x11, 0x19, 0x25, 0x29, 0x1d, 0x21, 0x3f, 0x22, 0x00, 0x21, + 0x20, 0x30, 0x22, 0xe0, 0x3f, 0x22, 0x00, 0x21, 0x23, 0x30, 0x1e, 0xe0, + 0x3f, 0x22, 0x00, 0x21, 0x21, 0x30, 0x1a, 0xe0, 0x3f, 0x22, 0x00, 0x21, + 0x24, 0x30, 0x16, 0xe0, 0x3f, 0x22, 0x00, 0x21, 0x22, 0x30, 0x12, 0xe0, + 0x3f, 0x22, 0x00, 0x21, 0x25, 0x30, 0x0e, 0xe0, 0x3f, 0x22, 0x00, 0x21, + 0x28, 0x30, 0x0a, 0xe0, 0x3f, 0x22, 0x00, 0x21, 0x29, 0x30, 0x06, 0xe0, + 0x3f, 0x22, 0x00, 0x21, 0x26, 0x30, 0x02, 0xe0, 0x3f, 0x22, 0x00, 0x21, + 0x27, 0x30, 0xbb, 0xe7, 0x70, 0x47, 0x00, 0x00, 0x13, 0x46, 0xdf, 0xf8, + 0x64, 0x23, 0x52, 0xf8, 0x20, 0x00, 0x09, 0x29, 0x2e, 0xd8, 0xdf, 0xe8, + 0x01, 0xf0, 0x05, 0x0d, 0x15, 0x09, 0x11, 0x19, 0x25, 0x29, 0x1d, 0x21, + 0x3f, 0x22, 0x00, 0x21, 0x30, 0x30, 0x22, 0xe0, 0x3f, 0x22, 0x00, 0x21, + 0x33, 0x30, 0x1e, 0xe0, 0x3f, 0x22, 0x00, 0x21, 0x31, 0x30, 0x1a, 0xe0, + 0x3f, 0x22, 0x00, 0x21, 0x34, 0x30, 0x16, 0xe0, 0x3f, 0x22, 0x00, 0x21, + 0x32, 0x30, 0x12, 0xe0, 0x3f, 0x22, 0x00, 0x21, 0x35, 0x30, 0x0e, 0xe0, + 0x3f, 0x22, 0x00, 0x21, 0x38, 0x30, 0x0a, 0xe0, 0x3f, 0x22, 0x00, 0x21, + 0x39, 0x30, 0x06, 0xe0, 0x3f, 0x22, 0x00, 0x21, 0x36, 0x30, 0x02, 0xe0, + 0x3f, 0x22, 0x00, 0x21, 0x37, 0x30, 0x83, 0xe7, 0x70, 0x47, 0x13, 0x46, + 0xdf, 0xf8, 0xf4, 0x22, 0x52, 0xf8, 0x20, 0x00, 0x05, 0x29, 0x06, 0xd9, + 0x89, 0x1f, 0x01, 0x29, 0x0b, 0xd9, 0x89, 0x1e, 0x01, 0x29, 0x04, 0xd9, + 0x70, 0x47, 0x07, 0x22, 0x00, 0x21, 0x11, 0x30, 0x06, 0xe0, 0x07, 0x22, + 0x00, 0x21, 0x10, 0x30, 0x02, 0xe0, 0x07, 0x22, 0x00, 0x21, 0x12, 0x30, + 0x68, 0xe7, 0x0b, 0x46, 0xdf, 0xf8, 0xc0, 0x12, 0x51, 0xf8, 0x20, 0x00, + 0x10, 0xf8, 0x50, 0x1f, 0x01, 0xf0, 0xf0, 0x01, 0x0b, 0x43, 0xff, 0x22, + 0x3b, 0xe1, 0x38, 0xb5, 0x0c, 0x46, 0xdf, 0xf8, 0xa8, 0x12, 0x51, 0xf8, + 0x20, 0x50, 0x2d, 0x1d, 0x23, 0x46, 0x07, 0x22, 0x00, 0x21, 0x00, 0xf0, + 0x2e, 0xf9, 0x23, 0x46, 0x28, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, + 0x38, 0x22, 0x03, 0x21, 0x48, 0xe7, 0x2d, 0xe9, 0xf8, 0x4f, 0xdf, 0xf8, + 0x84, 0x22, 0xdf, 0xf8, 0x84, 0x62, 0x52, 0xf8, 0x20, 0x50, 0x05, 0xf1, + 0x0a, 0x08, 0x05, 0xf1, 0x0b, 0x0a, 0x05, 0xf1, 0x06, 0x0b, 0x6f, 0x1d, + 0x05, 0xf1, 0x09, 0x04, 0x05, 0xf1, 0x08, 0x09, 0x33, 0x35, 0x01, 0x29, + 0x40, 0xf0, 0xa3, 0x80, 0x28, 0x78, 0xc0, 0x09, 0x30, 0x70, 0x00, 0x23, + 0x80, 0x22, 0x07, 0x21, 0x00, 0xf0, 0x07, 0xf9, 0x28, 0x78, 0xc0, 0xf3, + 0x80, 0x10, 0x70, 0x70, 0x00, 0x23, 0x00, 0xf0, 0xfe, 0xf8, 0x28, 0x78, + 0xc0, 0xf3, 0x01, 0x10, 0xb0, 0x70, 0x02, 0x23, 0x30, 0x22, 0x04, 0x21, + 0x00, 0xf0, 0xf7, 0xf8, 0x28, 0x78, 0xc0, 0xf3, 0x81, 0x00, 0xf0, 0x70, + 0x01, 0x23, 0x0c, 0x22, 0x02, 0x21, 0x00, 0xf0, 0xee, 0xf8, 0x28, 0x78, + 0xc0, 0xf3, 0x40, 0x00, 0x30, 0x71, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, + 0x00, 0xf0, 0xe5, 0xf8, 0x28, 0x78, 0x00, 0xf0, 0x01, 0x00, 0x70, 0x71, + 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, 0xdc, 0xf8, 0x99, 0xf8, + 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xb0, 0x71, 0x00, 0x23, 0x00, 0xf0, + 0xc6, 0xf8, 0x20, 0x78, 0xc0, 0xf3, 0x40, 0x10, 0xf0, 0x71, 0x00, 0xf0, + 0xe5, 0xf8, 0x20, 0x78, 0xc0, 0xf3, 0x00, 0x10, 0x30, 0x72, 0x00, 0x23, + 0x10, 0x22, 0x04, 0x21, 0x00, 0xf0, 0xdf, 0xf8, 0x20, 0x78, 0xc0, 0xf3, + 0xc0, 0x00, 0x70, 0x72, 0x00, 0x23, 0x08, 0x22, 0x03, 0x21, 0x00, 0xf0, + 0xd6, 0xf8, 0x20, 0x78, 0xc0, 0xf3, 0x80, 0x00, 0xb0, 0x72, 0x00, 0x23, + 0x04, 0x22, 0x02, 0x21, 0x00, 0xf0, 0xcd, 0xf8, 0x20, 0x78, 0xc0, 0xf3, + 0x40, 0x00, 0xf0, 0x72, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, 0x00, 0xf0, + 0xc4, 0xf8, 0x20, 0x78, 0x00, 0xf0, 0x01, 0x00, 0x30, 0x73, 0x00, 0x23, + 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, 0xbb, 0xf8, 0x38, 0x78, 0xc0, 0xf3, + 0x01, 0x10, 0x70, 0x73, 0x03, 0x23, 0x00, 0xf0, 0x94, 0xf8, 0x38, 0x78, + 0x00, 0xf0, 0x0f, 0x00, 0xb0, 0x73, 0x0c, 0x23, 0x0f, 0x22, 0x00, 0x21, + 0x00, 0xf0, 0x8d, 0xf8, 0x05, 0x20, 0xeb, 0xf7, 0xaf, 0xfa, 0x38, 0xb1, + 0x9b, 0xf8, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0xf0, 0x73, 0x00, 0x23, + 0x00, 0xf0, 0x73, 0xf8, 0x9a, 0xf8, 0x00, 0x00, 0xc0, 0xf3, 0x01, 0x10, + 0x30, 0x74, 0x03, 0x23, 0x00, 0xf0, 0x73, 0xf8, 0x9a, 0xf8, 0x00, 0x00, + 0x00, 0xf0, 0x0f, 0x00, 0x70, 0x74, 0x0c, 0x23, 0x0f, 0x22, 0x00, 0x21, + 0x00, 0xf0, 0x6b, 0xf8, 0x98, 0xf8, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, + 0xb0, 0x74, 0x00, 0x23, 0x52, 0xe0, 0x33, 0x78, 0x80, 0x22, 0x07, 0x21, + 0x00, 0xf0, 0x67, 0xf8, 0x73, 0x78, 0x00, 0xf0, 0x62, 0xf8, 0xb3, 0x78, + 0x30, 0x22, 0x04, 0x21, 0x00, 0xf0, 0x5f, 0xf8, 0xf3, 0x78, 0x0c, 0x22, + 0x02, 0x21, 0x00, 0xf0, 0x5a, 0xf8, 0x33, 0x79, 0x02, 0x22, 0x01, 0x21, + 0x00, 0xf0, 0x55, 0xf8, 0x73, 0x79, 0x01, 0x22, 0x00, 0x21, 0x00, 0xf0, + 0x50, 0xf8, 0xb3, 0x79, 0x00, 0xf0, 0x3f, 0xf8, 0xf3, 0x79, 0x00, 0xf0, + 0x62, 0xf8, 0x33, 0x7a, 0x10, 0x22, 0x04, 0x21, 0x00, 0xf0, 0x5f, 0xf8, + 0x73, 0x7a, 0x08, 0x22, 0x03, 0x21, 0x00, 0xf0, 0x5a, 0xf8, 0xb3, 0x7a, + 0x04, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x55, 0xf8, 0xf3, 0x7a, 0x02, 0x22, + 0x01, 0x21, 0x00, 0xf0, 0x50, 0xf8, 0x33, 0x7b, 0x01, 0x22, 0x00, 0x21, + 0x00, 0xf0, 0x4b, 0xf8, 0x73, 0x7b, 0x00, 0xf0, 0x28, 0xf8, 0xb3, 0x7b, + 0x0f, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x25, 0xf8, 0x05, 0x20, 0xeb, 0xf7, + 0x47, 0xfa, 0x10, 0xb1, 0xf3, 0x7b, 0x00, 0xf0, 0x10, 0xf8, 0x33, 0x7c, + 0x00, 0xf0, 0x15, 0xf8, 0x73, 0x7c, 0x0f, 0x22, 0x00, 0x21, 0x00, 0xf0, + 0x12, 0xf8, 0xb3, 0x7c, 0x3f, 0x22, 0x00, 0x21, 0x40, 0x46, 0x01, 0xb0, + 0xbd, 0xe8, 0xf0, 0x4f, 0x34, 0xe6, 0x3f, 0x22, 0x00, 0x21, 0x58, 0x46, + 0x30, 0xe6, 0x01, 0x22, 0x00, 0x21, 0x48, 0x46, 0x2c, 0xe6, 0x30, 0x22, + 0x04, 0x21, 0x50, 0x46, 0x28, 0xe6, 0x30, 0x22, 0x04, 0x21, 0x38, 0x46, + 0x24, 0xe6, 0x40, 0x22, 0x06, 0x21, 0x28, 0x46, 0x20, 0xe6, 0x00, 0x21, + 0x1e, 0xe6, 0x10, 0xb5, 0x0b, 0x49, 0x51, 0xf8, 0x20, 0x40, 0x50, 0x34, + 0x00, 0x23, 0x40, 0x22, 0x06, 0x21, 0x00, 0xf0, 0x0c, 0xf8, 0x00, 0xf0, + 0x07, 0xf8, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x00, 0x23, 0x10, 0x22, + 0x04, 0x21, 0x0b, 0xe6, 0x00, 0x23, 0x20, 0x22, 0x05, 0x21, 0x20, 0x46, + 0x06, 0xe6, 0x00, 0x00, 0xe0, 0x99, 0x04, 0x02, 0x20, 0x99, 0x04, 0x02, + 0x8d, 0x71, 0x02, 0x21, 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x6a, 0x46, + 0x0d, 0xf1, 0x01, 0x01, 0xc0, 0xb2, 0xe1, 0xf7, 0xb4, 0xff, 0x29, 0x46, + 0x20, 0x46, 0xd7, 0xf7, 0x6d, 0xfb, 0x9d, 0xf8, 0x00, 0x00, 0x02, 0x28, + 0x01, 0xd1, 0x01, 0x20, 0x32, 0xbd, 0x00, 0x20, 0x32, 0xbd, 0x2d, 0xe9, + 0xfc, 0x41, 0x05, 0x46, 0x0c, 0x46, 0x00, 0x20, 0x00, 0x90, 0x16, 0x46, + 0xdf, 0xf8, 0xb4, 0x1c, 0x08, 0x68, 0xea, 0xb2, 0x02, 0x44, 0xed, 0x23, + 0x92, 0xf8, 0xbc, 0x70, 0x5f, 0x43, 0xc3, 0x19, 0x03, 0xf2, 0x44, 0x48, + 0x00, 0x22, 0x06, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x50, 0xfe, 0x00, 0x22, + 0x08, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x4b, 0xfe, 0x00, 0x22, 0x00, 0x21, + 0x28, 0x46, 0xff, 0xf7, 0x46, 0xfe, 0x00, 0x21, 0x28, 0x46, 0xff, 0xf7, + 0x5c, 0xfe, 0x00, 0x22, 0x06, 0x21, 0x00, 0xf0, 0x3d, 0xf9, 0x00, 0x22, + 0x07, 0x21, 0x00, 0xf0, 0x39, 0xf9, 0x00, 0x22, 0x06, 0x21, 0x00, 0xf0, + 0x38, 0xf9, 0x00, 0x22, 0x07, 0x21, 0x00, 0xf0, 0x34, 0xf9, 0x00, 0x22, + 0x08, 0x21, 0x00, 0xf0, 0x2d, 0xf9, 0x00, 0x22, 0x09, 0x21, 0x00, 0xf0, + 0x29, 0xf9, 0x00, 0x22, 0x08, 0x21, 0x00, 0xf0, 0x28, 0xf9, 0x00, 0x22, + 0x09, 0x21, 0x00, 0xf0, 0x24, 0xf9, 0x00, 0x22, 0x00, 0x21, 0x00, 0xf0, + 0x1d, 0xf9, 0x00, 0x22, 0x03, 0x21, 0x00, 0xf0, 0x19, 0xf9, 0x00, 0x22, + 0x01, 0x21, 0x00, 0xf0, 0x15, 0xf9, 0x00, 0x22, 0x04, 0x21, 0x00, 0xf0, + 0x11, 0xf9, 0x00, 0x22, 0x02, 0x21, 0x00, 0xf0, 0x0d, 0xf9, 0x00, 0x22, + 0x05, 0x21, 0x00, 0xf0, 0x09, 0xf9, 0x00, 0x22, 0x00, 0x21, 0x00, 0xf0, + 0x08, 0xf9, 0x00, 0x22, 0x03, 0x21, 0x00, 0xf0, 0x04, 0xf9, 0x00, 0x22, + 0x01, 0x21, 0x00, 0xf0, 0x00, 0xf9, 0x00, 0x22, 0x04, 0x21, 0x00, 0xf0, + 0xfc, 0xf8, 0x00, 0x22, 0x02, 0x21, 0x00, 0xf0, 0xf8, 0xf8, 0x00, 0x22, + 0x05, 0x21, 0x00, 0xf0, 0xf4, 0xf8, 0x00, 0x23, 0x4f, 0xf4, 0x80, 0x32, + 0x00, 0x21, 0x28, 0x46, 0xe5, 0xf7, 0xf6, 0xfa, 0x01, 0xa9, 0x28, 0x46, + 0xff, 0xf7, 0x6a, 0xff, 0x06, 0xf5, 0x74, 0x77, 0x01, 0x99, 0x38, 0x82, + 0x39, 0x60, 0x28, 0x46, 0xd8, 0xf7, 0x69, 0xfa, 0xb8, 0x60, 0x01, 0x98, + 0x38, 0x60, 0xd8, 0xf8, 0x7d, 0x00, 0x61, 0x69, 0x90, 0xfb, 0xf1, 0xf1, + 0x4f, 0xf4, 0x7a, 0x72, 0x91, 0xfb, 0xf2, 0xf1, 0x51, 0x43, 0x79, 0x60, + 0x0b, 0x22, 0x3b, 0x68, 0xc9, 0x18, 0x31, 0x63, 0x00, 0x23, 0x39, 0x68, + 0x78, 0x68, 0x09, 0x1a, 0x71, 0x63, 0x39, 0x68, 0x78, 0x68, 0x01, 0xeb, + 0x41, 0x01, 0x09, 0x1a, 0xb1, 0x63, 0x28, 0x46, 0x01, 0x21, 0xe4, 0xf7, + 0x21, 0xff, 0x18, 0xb9, 0x00, 0xf0, 0x9e, 0xf8, 0xf5, 0xf7, 0x91, 0xff, + 0x00, 0x90, 0x00, 0x98, 0x40, 0xb9, 0x00, 0x21, 0x00, 0x91, 0x00, 0x23, + 0x7a, 0x68, 0x61, 0x7a, 0x28, 0x46, 0xe3, 0xf7, 0x64, 0xf9, 0x00, 0x90, + 0x0a, 0x20, 0xe2, 0xf7, 0xa3, 0xfd, 0x00, 0x98, 0x20, 0xb9, 0x00, 0xf0, + 0x8e, 0xf8, 0x00, 0xf0, 0xa9, 0xf8, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, + 0x40, 0xf0, 0x7f, 0x80, 0x96, 0xed, 0x0f, 0x0a, 0xd6, 0xed, 0x10, 0x0a, + 0xf0, 0x6b, 0xb0, 0x64, 0x70, 0xee, 0x60, 0x0a, 0xc6, 0xed, 0x13, 0x0a, + 0x96, 0xed, 0x0f, 0x0a, 0xd6, 0xed, 0x11, 0x0a, 0x70, 0xee, 0x60, 0x0a, + 0xc6, 0xed, 0x14, 0x0a, 0x28, 0x46, 0xd8, 0xf7, 0xbd, 0xfa, 0xff, 0x28, + 0x05, 0xd0, 0x06, 0xf5, 0x77, 0x71, 0xa8, 0xb2, 0xc9, 0xf7, 0x38, 0xfe, + 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, 0x04, 0xbf, 0xa0, 0x78, 0x00, 0x28, + 0x47, 0xd1, 0xe0, 0x78, 0x01, 0x28, 0x0d, 0xd1, 0x00, 0x27, 0x04, 0xeb, + 0x87, 0x00, 0xfa, 0xb2, 0x90, 0xed, 0x09, 0x0a, 0x31, 0x46, 0x28, 0x46, + 0x01, 0xf0, 0x12, 0xf9, 0x7f, 0x1c, 0x06, 0x2f, 0xf3, 0xd9, 0x36, 0xe0, + 0x20, 0x78, 0x70, 0xb1, 0x22, 0x46, 0x31, 0x46, 0x28, 0x46, 0x00, 0xf0, + 0xcf, 0xf9, 0x00, 0x90, 0x00, 0x98, 0x20, 0xb9, 0x00, 0xf0, 0x47, 0xf8, + 0x00, 0xf0, 0x62, 0xf8, 0x00, 0x90, 0x00, 0xf0, 0x46, 0xf8, 0x00, 0x98, + 0x00, 0x28, 0x22, 0xd1, 0x60, 0x78, 0x00, 0x28, 0x1f, 0xd0, 0x96, 0xed, + 0x13, 0x0a, 0x01, 0xf0, 0xcb, 0xfb, 0x1a, 0xd5, 0x00, 0x27, 0x06, 0xeb, + 0x87, 0x01, 0x0c, 0x20, 0x48, 0x70, 0x0c, 0x22, 0xf9, 0xb2, 0x00, 0xf0, + 0x48, 0xf8, 0x7f, 0x1c, 0x06, 0x2f, 0xf4, 0xd3, 0x22, 0x46, 0x31, 0x46, + 0x28, 0x46, 0x00, 0xf0, 0x31, 0xfb, 0x00, 0x90, 0x00, 0x98, 0x20, 0xb9, + 0x00, 0xf0, 0x21, 0xf8, 0x00, 0xf0, 0x3c, 0xf8, 0x00, 0x90, 0x00, 0xf0, + 0x20, 0xf8, 0x00, 0x98, 0x88, 0xb9, 0x00, 0x21, 0x28, 0x46, 0xe3, 0xf7, + 0x86, 0xf9, 0x00, 0xf0, 0x0f, 0xf8, 0xe4, 0xf7, 0xa7, 0xfe, 0x04, 0x46, + 0x00, 0xf0, 0x0a, 0xf8, 0xf5, 0xf7, 0x27, 0xff, 0x04, 0xb9, 0x04, 0x46, + 0x00, 0x98, 0x00, 0xb9, 0x00, 0x94, 0x00, 0x98, 0xbd, 0xe8, 0xf6, 0x81, + 0x00, 0x23, 0x0b, 0x22, 0x01, 0x21, 0x28, 0x46, 0x70, 0x47, 0x32, 0x46, + 0x21, 0x46, 0x28, 0x46, 0x20, 0xe1, 0x00, 0x98, 0x78, 0xb9, 0x96, 0xed, + 0x0f, 0x0a, 0xd6, 0xed, 0x10, 0x0a, 0x70, 0xee, 0x60, 0x0a, 0xc6, 0xed, + 0x15, 0x0a, 0x96, 0xed, 0x0f, 0x0a, 0xd6, 0xed, 0x11, 0x0a, 0x70, 0xee, + 0x60, 0x0a, 0xc6, 0xed, 0x16, 0x0a, 0x70, 0x47, 0x28, 0x46, 0xff, 0xf7, + 0x8f, 0xbc, 0x28, 0x46, 0xff, 0xf7, 0xc4, 0xbc, 0x00, 0x90, 0x33, 0x46, + 0x22, 0x46, 0x29, 0x46, 0x01, 0x20, 0x01, 0xf0, 0x37, 0xbb, 0x10, 0xb5, + 0x01, 0x29, 0x04, 0x46, 0x1a, 0xd1, 0x07, 0x22, 0x06, 0x21, 0xff, 0xf7, + 0xec, 0xfc, 0x07, 0x22, 0x08, 0x21, 0x00, 0xf0, 0x63, 0xf8, 0x00, 0xf0, + 0x5f, 0xf8, 0x00, 0xf0, 0x59, 0xf8, 0x00, 0x22, 0x06, 0x21, 0x00, 0xf0, + 0x5e, 0xf8, 0x00, 0x22, 0x07, 0x21, 0x00, 0xf0, 0x5a, 0xf8, 0x00, 0x22, + 0x06, 0x21, 0x00, 0xf0, 0xc8, 0xfa, 0x00, 0x22, 0x07, 0x21, 0x15, 0xe0, + 0x07, 0x22, 0x08, 0x21, 0xff, 0xf7, 0xd1, 0xfc, 0x00, 0xf0, 0x48, 0xf8, + 0x00, 0xf0, 0x42, 0xf8, 0x00, 0x22, 0x08, 0x21, 0x00, 0xf0, 0x47, 0xf8, + 0x00, 0x22, 0x09, 0x21, 0x00, 0xf0, 0x43, 0xf8, 0x00, 0x22, 0x08, 0x21, + 0x00, 0xf0, 0xb1, 0xfa, 0x00, 0x22, 0x09, 0x21, 0x00, 0xf0, 0xad, 0xfa, + 0x00, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x37, 0xf8, 0x00, 0x22, 0x03, 0x21, + 0x00, 0xf0, 0x33, 0xf8, 0x00, 0x22, 0x01, 0x21, 0x00, 0xf0, 0x2f, 0xf8, + 0x00, 0x22, 0x04, 0x21, 0x00, 0xf0, 0x2b, 0xf8, 0x00, 0x22, 0x02, 0x21, + 0x00, 0xf0, 0x27, 0xf8, 0x00, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x23, 0xf8, + 0x00, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x91, 0xfa, 0x00, 0x22, 0x03, 0x21, + 0x00, 0xf0, 0x8d, 0xfa, 0x00, 0x22, 0x01, 0x21, 0x00, 0xf0, 0x89, 0xfa, + 0x00, 0x22, 0x04, 0x21, 0x00, 0xf0, 0x85, 0xfa, 0x00, 0x22, 0x02, 0x21, + 0x00, 0xf0, 0x81, 0xfa, 0x00, 0x22, 0x05, 0x21, 0x00, 0xf0, 0x7d, 0xfa, + 0x00, 0x20, 0x10, 0xbd, 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, 0xa1, 0xbc, + 0x07, 0x22, 0x00, 0x21, 0x20, 0x46, 0xff, 0xf7, 0x82, 0xbc, 0x20, 0x46, + 0xff, 0xf7, 0x10, 0xbc, 0x2d, 0xe9, 0xf0, 0x41, 0x16, 0x46, 0x01, 0x2b, + 0x80, 0x46, 0x06, 0xf1, 0x21, 0x05, 0x14, 0xd1, 0x00, 0x27, 0x06, 0xeb, + 0x87, 0x04, 0xf9, 0xb2, 0x22, 0x78, 0x01, 0xf0, 0x1b, 0xfa, 0x62, 0x78, + 0xf9, 0xb2, 0x01, 0xf0, 0x12, 0xfa, 0xa2, 0x78, 0xf9, 0xb2, 0x01, 0xf0, + 0x27, 0xfa, 0x7f, 0x1c, 0x0c, 0x2f, 0xee, 0xd3, 0x00, 0xf0, 0x68, 0xf8, + 0x63, 0xe0, 0xb6, 0xf8, 0xe0, 0x03, 0x01, 0x28, 0x1a, 0xd1, 0xb2, 0x7e, + 0x06, 0x21, 0x01, 0xf0, 0x19, 0xfa, 0x01, 0xf0, 0x15, 0xfa, 0xb2, 0x78, + 0x00, 0x21, 0x01, 0xf0, 0x13, 0xfa, 0x00, 0xf0, 0x57, 0xf8, 0x32, 0x7e, + 0x06, 0x21, 0x01, 0xf0, 0xf9, 0xf9, 0x32, 0x7f, 0x07, 0x21, 0x01, 0xf0, + 0xf5, 0xf9, 0x72, 0x7e, 0x06, 0x21, 0x01, 0xf0, 0xec, 0xf9, 0x72, 0x7f, + 0x07, 0x21, 0x16, 0xe0, 0x01, 0xf0, 0xfe, 0xf9, 0xb2, 0x78, 0x00, 0x21, + 0x01, 0xf0, 0xfc, 0xf9, 0x00, 0xf0, 0x40, 0xf8, 0x96, 0xf8, 0x20, 0x20, + 0x08, 0x21, 0x01, 0xf0, 0xe1, 0xf9, 0xea, 0x78, 0x09, 0x21, 0x01, 0xf0, + 0xdd, 0xf9, 0x2a, 0x78, 0x08, 0x21, 0x01, 0xf0, 0xd4, 0xf9, 0x2a, 0x79, + 0x09, 0x21, 0x01, 0xf0, 0xd0, 0xf9, 0x32, 0x78, 0x01, 0xf0, 0xdb, 0xf9, + 0x32, 0x7b, 0x03, 0x21, 0x01, 0xf0, 0xce, 0xf9, 0x32, 0x79, 0x01, 0xf0, + 0xca, 0xf9, 0x32, 0x7c, 0x04, 0x21, 0x01, 0xf0, 0xc7, 0xf9, 0x32, 0x7a, + 0x02, 0x21, 0x01, 0xf0, 0xc3, 0xf9, 0x32, 0x7d, 0x05, 0x21, 0x01, 0xf0, + 0xbf, 0xf9, 0x72, 0x78, 0x01, 0xf0, 0xc0, 0xf9, 0x72, 0x7b, 0x03, 0x21, + 0x01, 0xf0, 0xb3, 0xf9, 0x72, 0x79, 0x01, 0xf0, 0xaf, 0xf9, 0x72, 0x7c, + 0x04, 0x21, 0x01, 0xf0, 0xac, 0xf9, 0x72, 0x7a, 0x02, 0x21, 0x01, 0xf0, + 0xa8, 0xf9, 0x72, 0x7d, 0x05, 0x21, 0x01, 0xf0, 0xa4, 0xf9, 0x00, 0x20, + 0xbd, 0xe8, 0xf0, 0x81, 0x68, 0x7b, 0x69, 0x7a, 0x41, 0xea, 0x80, 0x01, + 0xc9, 0xb2, 0x40, 0x46, 0xff, 0xf7, 0x0d, 0xbc, 0xf8, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x16, 0x46, 0x00, 0x27, 0x06, 0xeb, 0x87, 0x00, 0x00, 0xf1, + 0x3c, 0x03, 0x01, 0x6b, 0x2a, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x05, 0xf8, + 0x7f, 0x1c, 0x03, 0x2f, 0xf3, 0xd3, 0x00, 0x20, 0xf2, 0xbd, 0x2d, 0xe9, + 0xf0, 0x41, 0x8e, 0xb0, 0x06, 0x46, 0x0c, 0x46, 0x17, 0x46, 0x98, 0x46, + 0xe2, 0xf7, 0x5a, 0xf8, 0x05, 0x46, 0x1c, 0x21, 0x68, 0x46, 0xdb, 0xf7, + 0x83, 0xfe, 0x1c, 0x21, 0x07, 0xa8, 0xdb, 0xf7, 0x7f, 0xfe, 0x00, 0x96, + 0x01, 0x21, 0x8d, 0xf8, 0x04, 0x10, 0xf9, 0x68, 0x04, 0x91, 0x00, 0x21, + 0x05, 0x91, 0x38, 0x69, 0x03, 0x90, 0x68, 0x46, 0x39, 0x7a, 0x8d, 0xf8, + 0x18, 0x10, 0x02, 0x94, 0xfa, 0xf7, 0x2e, 0xf9, 0x04, 0x00, 0x1a, 0xd1, + 0x00, 0x98, 0x4f, 0xf4, 0x7a, 0x71, 0xfa, 0xf7, 0x9b, 0xf9, 0x10, 0xb1, + 0x40, 0xf6, 0x03, 0x14, 0x11, 0xe0, 0x07, 0xa9, 0x68, 0x46, 0xfa, 0xf7, + 0x97, 0xf9, 0x10, 0xb1, 0x40, 0xf6, 0x04, 0x14, 0x09, 0xe0, 0x9d, 0xed, + 0x0b, 0x0a, 0xc9, 0xf7, 0xd1, 0xfd, 0xf2, 0xee, 0x04, 0x0a, 0x60, 0xee, + 0x20, 0x0a, 0xc8, 0xed, 0x00, 0x0a, 0xe2, 0xf7, 0x21, 0xf8, 0x01, 0x46, + 0x28, 0x46, 0xe2, 0xf7, 0x61, 0xf8, 0x20, 0x46, 0x0e, 0xb0, 0xbd, 0xe8, + 0xf0, 0x81, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, + 0x82, 0xb0, 0x00, 0x24, 0x07, 0x46, 0x01, 0x94, 0x0d, 0x46, 0x92, 0x46, + 0xb5, 0xf8, 0xe0, 0x03, 0x00, 0x28, 0x05, 0xf1, 0x22, 0x06, 0x05, 0xf1, + 0x38, 0x08, 0x9f, 0xed, 0xa0, 0x8a, 0x00, 0xf0, 0xb7, 0x80, 0xd8, 0xf8, + 0x00, 0x10, 0x05, 0xf1, 0x44, 0x03, 0x00, 0xf0, 0x0d, 0xff, 0x00, 0xf0, + 0x40, 0xf9, 0x40, 0xf1, 0x2f, 0x81, 0xb9, 0x46, 0x69, 0x1c, 0x0c, 0x20, + 0x01, 0xf8, 0x24, 0x00, 0x0c, 0x22, 0xe1, 0xb2, 0x00, 0xf0, 0x44, 0xf9, + 0x64, 0x1c, 0x06, 0x2c, 0xf4, 0xd3, 0x00, 0xf0, 0x42, 0xf9, 0x00, 0xf0, + 0x3b, 0xf9, 0x28, 0x46, 0x00, 0xf0, 0x11, 0xfb, 0xaa, 0x7e, 0x06, 0x21, + 0x48, 0x46, 0xff, 0xf7, 0x5e, 0xfb, 0x32, 0x78, 0x08, 0x21, 0x48, 0x46, + 0xff, 0xf7, 0x59, 0xfb, 0xaa, 0x78, 0x00, 0x21, 0x48, 0x46, 0xff, 0xf7, + 0x54, 0xfb, 0x30, 0x7b, 0x31, 0x7a, 0xdf, 0xf8, 0x30, 0x6d, 0x41, 0xea, + 0x80, 0x01, 0xc9, 0xb2, 0x48, 0x46, 0xff, 0xf7, 0x64, 0xfb, 0x2a, 0x7e, + 0x06, 0x21, 0x48, 0x46, 0xff, 0xf7, 0xd6, 0xfa, 0x2a, 0x7f, 0x07, 0x21, + 0x48, 0x46, 0xff, 0xf7, 0xd1, 0xfa, 0x2a, 0x46, 0x51, 0x46, 0x48, 0x46, + 0xff, 0xf7, 0x48, 0xff, 0x2b, 0x46, 0x52, 0x46, 0x49, 0x46, 0x01, 0x20, + 0x01, 0xf0, 0x78, 0xf9, 0x04, 0x00, 0x5f, 0xd1, 0x00, 0xf0, 0x0b, 0xf9, + 0x00, 0xf0, 0x04, 0xf9, 0x00, 0x20, 0x00, 0x90, 0x00, 0x23, 0x2a, 0x46, + 0x51, 0x46, 0x48, 0x46, 0x00, 0xf0, 0x24, 0xfb, 0x95, 0xf8, 0x8c, 0x00, + 0x03, 0x28, 0x02, 0xd1, 0x32, 0x46, 0x00, 0xf0, 0x41, 0xfa, 0x95, 0xf8, + 0x8c, 0x00, 0x04, 0x28, 0x03, 0xd1, 0x06, 0xf1, 0x38, 0x02, 0x00, 0xf0, + 0x39, 0xfa, 0x00, 0xf0, 0xf8, 0xf8, 0x01, 0x9f, 0x04, 0x46, 0x00, 0xe0, + 0x7f, 0x1c, 0xb4, 0xb1, 0x00, 0xf0, 0xf1, 0xf8, 0x00, 0xf0, 0xf6, 0xf8, + 0x48, 0x46, 0xff, 0xf7, 0x2a, 0xff, 0x98, 0xed, 0x01, 0x0a, 0xd8, 0xed, + 0x03, 0x0a, 0x06, 0x2f, 0x30, 0xee, 0x60, 0x0a, 0x00, 0xd3, 0x34, 0xb1, + 0xb4, 0xee, 0x48, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xe8, 0xdb, 0x00, 0x2c, + 0xe6, 0xd1, 0x95, 0xf8, 0xc0, 0x00, 0x03, 0x28, 0x03, 0xd1, 0x06, 0xf1, + 0x70, 0x02, 0x00, 0xf0, 0x13, 0xfa, 0x95, 0xf8, 0xc0, 0x00, 0x04, 0x28, + 0x03, 0xd1, 0x06, 0xf1, 0xa0, 0x02, 0x00, 0xf0, 0x0b, 0xfa, 0x95, 0xf8, + 0xf4, 0x00, 0x03, 0x28, 0x03, 0xd1, 0x06, 0xf1, 0xd0, 0x02, 0x00, 0xf0, + 0x03, 0xfa, 0x95, 0xf8, 0xf4, 0x00, 0x04, 0x28, 0x03, 0xd1, 0x06, 0xf5, + 0x80, 0x72, 0x00, 0xf0, 0xfb, 0xf9, 0x05, 0xf5, 0x77, 0x71, 0x1f, 0xfa, + 0x89, 0xf0, 0xc9, 0xf7, 0x89, 0xfb, 0x04, 0x46, 0x00, 0x2c, 0x06, 0xd0, + 0x23, 0x46, 0x06, 0xf5, 0x98, 0x72, 0x09, 0x21, 0x03, 0x20, 0xd8, 0xf7, + 0xf6, 0xf8, 0x81, 0xe0, 0x6f, 0xf0, 0x01, 0x09, 0xad, 0xf8, 0x00, 0x40, + 0x4a, 0x46, 0x38, 0x46, 0x01, 0xf0, 0x94, 0xf8, 0xd8, 0xf8, 0x00, 0x10, + 0x05, 0xf1, 0x44, 0x03, 0x52, 0x46, 0x00, 0xf0, 0x4d, 0xfe, 0x00, 0xf0, + 0x80, 0xf8, 0x6f, 0xd5, 0x3c, 0x46, 0x00, 0x27, 0x69, 0x1c, 0x0c, 0x20, + 0x01, 0xf8, 0x27, 0x00, 0x0c, 0x22, 0xf9, 0xb2, 0x00, 0xf0, 0x9d, 0xf8, + 0x7f, 0x1c, 0x06, 0x2f, 0xf4, 0xd3, 0x4a, 0x46, 0x29, 0x46, 0x20, 0x46, + 0x01, 0xf0, 0x78, 0xf8, 0x9d, 0xf8, 0x01, 0x90, 0x9d, 0xf8, 0x00, 0x70, + 0x05, 0xf5, 0x78, 0x7b, 0x08, 0xe0, 0x7f, 0x1c, 0x37, 0x73, 0x20, 0x46, + 0x31, 0x7a, 0x41, 0xea, 0x87, 0x01, 0xc9, 0xb2, 0xff, 0xf7, 0xaf, 0xfa, + 0x00, 0x20, 0x00, 0x90, 0x03, 0x23, 0x00, 0xf0, 0x54, 0xf8, 0x00, 0x20, + 0x00, 0x90, 0x09, 0x23, 0x00, 0xf0, 0x4f, 0xf8, 0x9b, 0xf9, 0x04, 0x10, + 0x01, 0x20, 0x35, 0x29, 0x0e, 0xdb, 0x5f, 0xfa, 0x89, 0xf1, 0x03, 0x29, + 0x0a, 0xd2, 0x09, 0xf1, 0x01, 0x09, 0x86, 0xf8, 0x08, 0x90, 0x30, 0x7b, + 0x49, 0xea, 0x80, 0x01, 0xc9, 0xb2, 0xff, 0xf7, 0xee, 0xfd, 0x00, 0x20, + 0x9b, 0xf9, 0x04, 0x10, 0x11, 0xf1, 0x34, 0x0f, 0x02, 0xda, 0xf9, 0xb2, + 0x03, 0x29, 0xd0, 0xd3, 0x00, 0x28, 0xd7, 0xd0, 0x00, 0x20, 0x00, 0x90, + 0x26, 0x46, 0x00, 0xf0, 0x27, 0xf8, 0xdd, 0xf8, 0x04, 0x90, 0x04, 0x46, + 0x01, 0xe0, 0x09, 0xf1, 0x01, 0x09, 0xcc, 0xb1, 0x00, 0x20, 0x00, 0x90, + 0x00, 0xf0, 0x1c, 0xf8, 0x00, 0xf0, 0x44, 0xf8, 0x30, 0x46, 0xff, 0xf7, + 0x78, 0xfe, 0x98, 0xed, 0x01, 0x0a, 0xd8, 0xed, 0x03, 0x0a, 0xb9, 0xf1, + 0x06, 0x0f, 0x30, 0xee, 0x60, 0x0a, 0x00, 0xd3, 0x34, 0xb1, 0xb4, 0xee, + 0x48, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xe4, 0xdb, 0x00, 0x2c, 0xe2, 0xd1, + 0x02, 0xb0, 0x20, 0x46, 0x3e, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x60, 0x42, + 0x04, 0x23, 0x2a, 0x46, 0x51, 0x46, 0x30, 0x46, 0x38, 0xe2, 0x2a, 0x46, + 0x51, 0x46, 0x20, 0x46, 0x34, 0xe2, 0x98, 0xed, 0x01, 0x0a, 0xd8, 0xed, + 0x03, 0x0a, 0x70, 0xee, 0x60, 0x0a, 0x9a, 0xed, 0x07, 0x0a, 0xf4, 0xee, + 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x70, 0x47, 0x6a, 0x7f, 0x07, 0x21, + 0x48, 0x46, 0xff, 0xf7, 0xef, 0xb9, 0x1b, 0x20, 0x68, 0x76, 0x68, 0x77, + 0x06, 0x21, 0x6a, 0x7e, 0x48, 0x46, 0xff, 0xf7, 0xe7, 0xb9, 0x00, 0x20, + 0x00, 0x90, 0x01, 0x23, 0x2a, 0x46, 0x51, 0x46, 0x48, 0x46, 0x13, 0xe2, + 0x04, 0x46, 0xd8, 0xf8, 0x00, 0x10, 0x05, 0xf1, 0x44, 0x03, 0x52, 0x46, + 0x70, 0x47, 0x20, 0x46, 0xff, 0xf7, 0xd6, 0xb9, 0x2d, 0xe9, 0xf8, 0x4f, + 0x8a, 0x46, 0x2d, 0xed, 0x02, 0x8b, 0x0a, 0xf5, 0x78, 0x76, 0x82, 0xb0, + 0x00, 0x21, 0xf1, 0x61, 0x80, 0x46, 0x01, 0x91, 0x91, 0x46, 0x30, 0x88, + 0x00, 0x28, 0x9f, 0xed, 0xb6, 0x8a, 0xdf, 0xed, 0xb5, 0x8a, 0x00, 0xf0, + 0x80, 0x80, 0x99, 0xf8, 0x06, 0x00, 0x01, 0x24, 0x01, 0x28, 0x34, 0xd1, + 0x34, 0x75, 0x00, 0x27, 0x00, 0xf0, 0x07, 0xf9, 0x00, 0x22, 0x00, 0x92, + 0x00, 0xf0, 0xfe, 0xf8, 0x00, 0xf0, 0x23, 0xf9, 0x00, 0xf0, 0x28, 0xf9, + 0x9a, 0xf8, 0x20, 0x10, 0x00, 0xee, 0x10, 0x1a, 0x7f, 0x1c, 0xb8, 0xee, + 0x40, 0x0a, 0xd6, 0xed, 0x07, 0x0a, 0x03, 0x2f, 0x30, 0xee, 0x08, 0x8a, + 0x78, 0xee, 0xa0, 0x8a, 0x01, 0xd2, 0x00, 0x28, 0xe4, 0xd0, 0x00, 0xbb, + 0xf0, 0xee, 0x08, 0x0a, 0xb0, 0xee, 0x08, 0x0a, 0xc8, 0xee, 0xa0, 0x8a, + 0x88, 0xee, 0x00, 0x0a, 0x07, 0x22, 0x51, 0x46, 0x40, 0x46, 0x00, 0xf0, + 0x6b, 0xfd, 0xb7, 0xee, 0x00, 0x0a, 0xc6, 0xed, 0x07, 0x8a, 0x38, 0xee, + 0x80, 0x0a, 0x40, 0x46, 0x00, 0xf0, 0xb0, 0xff, 0x09, 0xe0, 0x00, 0xf0, + 0xda, 0xf8, 0x00, 0x20, 0x00, 0x90, 0x00, 0xf0, 0xcb, 0xf8, 0x00, 0xf0, + 0xf0, 0xf8, 0x00, 0xf0, 0xf5, 0xf8, 0x99, 0xf8, 0x06, 0x00, 0x01, 0x28, + 0x37, 0xd1, 0x00, 0x20, 0xf0, 0x61, 0x00, 0x27, 0x00, 0xf0, 0xc3, 0xf8, + 0x37, 0xb1, 0x02, 0x2f, 0x08, 0xd0, 0x3c, 0xbf, 0x0b, 0x25, 0x4f, 0xf0, + 0x0e, 0x0b, 0x06, 0xe0, 0x0a, 0x25, 0x4f, 0xf0, 0x0d, 0x0b, 0x02, 0xe0, + 0x0c, 0x25, 0x4f, 0xf0, 0x0f, 0x0b, 0x00, 0xf0, 0xcd, 0xf8, 0x00, 0xf0, + 0xbd, 0xf8, 0x00, 0xf0, 0xc9, 0xf8, 0x00, 0xf0, 0xb9, 0xf8, 0x00, 0x20, + 0x00, 0x90, 0x5f, 0xfa, 0x8b, 0xf3, 0x00, 0xf0, 0xa2, 0xf8, 0x00, 0xf0, + 0xb1, 0xf8, 0x7f, 0x1c, 0x96, 0xed, 0x07, 0x0a, 0x03, 0x2f, 0x78, 0xee, + 0x80, 0x8a, 0xd7, 0xd3, 0xb0, 0xee, 0x08, 0x0a, 0x88, 0xee, 0x80, 0x0a, + 0x86, 0xed, 0x07, 0x0a, 0xf7, 0xee, 0x00, 0x0a, 0x30, 0xee, 0x20, 0x0a, + 0x40, 0x46, 0x00, 0xf0, 0x69, 0xff, 0x00, 0x21, 0x00, 0xf0, 0x93, 0xf8, + 0x00, 0xf0, 0xb4, 0xf8, 0x00, 0x20, 0x00, 0x90, 0x05, 0x23, 0x00, 0xf0, + 0x82, 0xf8, 0x0a, 0xf5, 0xc0, 0x74, 0x06, 0x46, 0x20, 0x7c, 0xdf, 0xf8, + 0x60, 0x59, 0x03, 0x28, 0x03, 0xd1, 0x05, 0xf1, 0x70, 0x02, 0x00, 0xf0, + 0x83, 0xf8, 0x20, 0x7c, 0x04, 0x28, 0x03, 0xd1, 0x05, 0xf1, 0xa0, 0x02, + 0x00, 0xf0, 0x7c, 0xf8, 0x94, 0xed, 0x00, 0x0a, 0xd9, 0xed, 0x07, 0x0a, + 0x00, 0xf0, 0xd2, 0xff, 0x44, 0xd5, 0x00, 0xf0, 0x7e, 0xf8, 0x00, 0xf0, + 0x91, 0xf8, 0x00, 0xf0, 0x7a, 0xf8, 0x00, 0xf0, 0x8d, 0xf8, 0x46, 0x46, + 0x01, 0x9c, 0x80, 0x46, 0x00, 0xe0, 0x64, 0x1c, 0xb8, 0xf1, 0x00, 0x0f, + 0x23, 0xd0, 0x00, 0x20, 0x00, 0x90, 0x06, 0x23, 0x00, 0xf0, 0x4e, 0xf8, + 0x00, 0x20, 0x00, 0x90, 0x10, 0x23, 0x00, 0xf0, 0x49, 0xf8, 0x80, 0x46, + 0xda, 0xf8, 0x34, 0x10, 0x0a, 0xf1, 0x40, 0x03, 0x4a, 0x46, 0x30, 0x46, + 0xff, 0xf7, 0x51, 0xfd, 0x9a, 0xed, 0x0f, 0x0a, 0xda, 0xed, 0x10, 0x0a, + 0x06, 0x2c, 0x30, 0xee, 0x60, 0x0a, 0x02, 0xd3, 0xb8, 0xf1, 0x00, 0x0f, + 0x05, 0xd0, 0x00, 0xf0, 0x9f, 0xff, 0xda, 0xdb, 0xb8, 0xf1, 0x00, 0x0f, + 0xd7, 0xd1, 0x9a, 0xf8, 0xc4, 0x01, 0x03, 0x28, 0x46, 0x46, 0x03, 0xd1, + 0x05, 0xf1, 0xd0, 0x02, 0x00, 0xf0, 0x38, 0xf8, 0x9a, 0xf8, 0xc4, 0x01, + 0x04, 0x28, 0x03, 0xd1, 0x05, 0xf5, 0x80, 0x72, 0x00, 0xf0, 0x30, 0xf8, + 0x2e, 0xb1, 0x33, 0x46, 0x05, 0xa2, 0x09, 0x21, 0x03, 0x20, 0xd7, 0xf7, + 0x34, 0xff, 0x02, 0xb0, 0x30, 0x46, 0x00, 0xbf, 0xbd, 0xec, 0x02, 0x8b, + 0xbd, 0xe8, 0xf2, 0x8f, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x49, 0x6d, + 0x70, 0x72, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x25, 0x64, 0x20, 0x0a, 0x00, 0x00, + 0x52, 0x46, 0x49, 0x46, 0x30, 0x46, 0xe9, 0xe0, 0x07, 0x23, 0x52, 0x46, + 0x49, 0x46, 0x40, 0x46, 0xe4, 0xe0, 0x04, 0xfa, 0x07, 0xf1, 0x01, 0xf0, + 0x07, 0x01, 0xc9, 0x43, 0xc9, 0xb2, 0x40, 0x46, 0xff, 0xf7, 0x05, 0xb9, + 0x09, 0x21, 0x02, 0x20, 0xd7, 0xf7, 0x07, 0xbf, 0x00, 0x21, 0x00, 0x91, + 0x10, 0x23, 0x52, 0x46, 0x49, 0x46, 0x40, 0x46, 0xd0, 0xe0, 0x00, 0x20, + 0x00, 0x90, 0x06, 0x23, 0x52, 0x46, 0x49, 0x46, 0x40, 0x46, 0xc9, 0xe0, + 0x00, 0x20, 0x00, 0x90, 0xeb, 0xb2, 0x52, 0x46, 0x49, 0x46, 0x40, 0x46, + 0xc2, 0xe0, 0x00, 0x20, 0x00, 0x90, 0x08, 0x23, 0x52, 0x46, 0x49, 0x46, + 0x40, 0x46, 0xbb, 0xe0, 0x00, 0x20, 0x00, 0x90, 0x10, 0x23, 0x52, 0x46, + 0x49, 0x46, 0x40, 0x46, 0xb4, 0xe0, 0x70, 0xb5, 0x00, 0x23, 0xdf, 0xf8, + 0x74, 0x2d, 0xdf, 0xf8, 0xe8, 0x5d, 0x00, 0x24, 0x55, 0xf8, 0x34, 0x60, + 0x86, 0x1b, 0x48, 0xbf, 0x76, 0x42, 0x96, 0x42, 0xbc, 0xbf, 0x32, 0x46, + 0x23, 0x46, 0x64, 0x1c, 0x08, 0x2c, 0xf3, 0xd1, 0x55, 0xf8, 0x33, 0x40, + 0x20, 0x1a, 0xc0, 0x22, 0x50, 0x43, 0x90, 0xfb, 0xf4, 0xf0, 0x40, 0xb2, + 0x1f, 0x28, 0xc8, 0xbf, 0x1f, 0x20, 0x10, 0xf1, 0x21, 0x0f, 0xb8, 0xbf, + 0x6f, 0xf0, 0x1f, 0x00, 0x20, 0x30, 0x0b, 0x60, 0xc0, 0xb2, 0x70, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x30, 0xb5, 0xdf, 0xf8, 0x9c, 0x4d, 0x04, 0xeb, + 0xc0, 0x00, 0x6f, 0xf0, 0x01, 0x04, 0x90, 0xf9, 0x04, 0x00, 0xa0, 0x42, + 0x02, 0xda, 0x00, 0x20, 0x18, 0x70, 0x0e, 0xe0, 0x00, 0x25, 0x1d, 0x70, + 0x10, 0xb9, 0x10, 0x70, 0x0d, 0x70, 0x1d, 0xe0, 0x10, 0xf1, 0x01, 0x0f, + 0x03, 0xd1, 0x05, 0x20, 0x10, 0x70, 0x0d, 0x70, 0x05, 0xe0, 0xa0, 0x42, + 0x05, 0xd1, 0x07, 0x20, 0x10, 0x70, 0x00, 0x22, 0x0a, 0x70, 0x07, 0x21, + 0x16, 0xe0, 0x01, 0x28, 0x02, 0xd1, 0x15, 0x70, 0x05, 0x22, 0x08, 0xe0, + 0x02, 0x28, 0x08, 0xbf, 0x15, 0x70, 0x03, 0xd0, 0x03, 0x28, 0x05, 0xd1, + 0x01, 0x20, 0x10, 0x70, 0x07, 0x22, 0x0a, 0x70, 0x00, 0x21, 0x05, 0xe0, + 0x03, 0x20, 0x10, 0x70, 0x07, 0x22, 0x0a, 0x70, 0x00, 0x21, 0x19, 0x70, + 0x03, 0x98, 0x01, 0x70, 0x30, 0xbd, 0x7f, 0xb5, 0x04, 0x46, 0x04, 0xf5, + 0x74, 0x75, 0x02, 0xa9, 0x28, 0x68, 0xff, 0xf7, 0x92, 0xff, 0x01, 0xa9, + 0x06, 0x46, 0x00, 0x91, 0x0d, 0xf1, 0x05, 0x03, 0x02, 0x98, 0x0d, 0xf1, + 0x06, 0x02, 0x0d, 0xf1, 0x07, 0x01, 0xff, 0xf7, 0xaf, 0xff, 0x02, 0x99, + 0xdf, 0xf8, 0xf8, 0x0c, 0x00, 0xeb, 0xc1, 0x02, 0x13, 0x79, 0xab, 0x74, + 0x9d, 0xf8, 0x04, 0x10, 0xa1, 0x70, 0x9d, 0xf8, 0x04, 0x20, 0xa2, 0x71, + 0x9d, 0xf8, 0x04, 0x10, 0xa1, 0x72, 0x9d, 0xf8, 0x04, 0x20, 0xa2, 0x73, + 0x9d, 0xf8, 0x04, 0x10, 0xa1, 0x74, 0x9d, 0xf8, 0x04, 0x20, 0xa2, 0x75, + 0x02, 0x99, 0x50, 0xf8, 0x31, 0x10, 0x2a, 0x68, 0x8a, 0x1a, 0xc0, 0x20, + 0x42, 0x43, 0x92, 0xfb, 0xf1, 0xf0, 0xe8, 0x74, 0x26, 0x76, 0x04, 0xf1, + 0x22, 0x00, 0x26, 0x77, 0x00, 0x21, 0x01, 0x72, 0x9d, 0xf8, 0x06, 0x20, + 0xa2, 0x76, 0x9d, 0xf8, 0x07, 0x10, 0x01, 0x70, 0x9d, 0xf8, 0x05, 0x20, + 0x02, 0x72, 0xa1, 0x7e, 0xa1, 0x77, 0x02, 0x78, 0x01, 0x7a, 0x02, 0x71, + 0x01, 0x73, 0x7f, 0xbd, 0x5c, 0x75, 0x02, 0x21, 0x2d, 0xe9, 0xf8, 0x4f, + 0x2d, 0xed, 0x06, 0x8b, 0x86, 0xb0, 0x9a, 0x46, 0x00, 0x27, 0x88, 0x46, + 0x15, 0x46, 0x00, 0x24, 0xba, 0xf1, 0x10, 0x0f, 0x05, 0x94, 0x9f, 0xed, + 0x36, 0x8a, 0xad, 0xf8, 0x00, 0x40, 0x8d, 0xf8, 0x08, 0x40, 0x8d, 0xf8, + 0x03, 0x40, 0xdf, 0xed, 0x33, 0x8a, 0x05, 0xf5, 0x67, 0x71, 0xb2, 0xee, + 0x00, 0x0a, 0xf3, 0xee, 0x00, 0x0a, 0xb0, 0xee, 0x00, 0x1a, 0xb1, 0xee, + 0x00, 0x9a, 0xf7, 0xee, 0x00, 0x1a, 0x9f, 0xed, 0x2d, 0x2a, 0xdf, 0xed, + 0x2d, 0x2a, 0x9f, 0xed, 0x2d, 0x3a, 0x00, 0xf2, 0x4d, 0x81, 0xdf, 0xe8, + 0x1a, 0xf0, 0x11, 0x00, 0x57, 0x00, 0x92, 0x00, 0xae, 0x00, 0x10, 0x01, + 0x0a, 0x01, 0x31, 0x01, 0xba, 0x00, 0xcd, 0x00, 0xda, 0x00, 0xe8, 0x00, + 0xfc, 0x00, 0x03, 0x01, 0x1c, 0x01, 0x23, 0x01, 0x2a, 0x01, 0x37, 0x01, + 0x05, 0xf1, 0x5c, 0x02, 0x4f, 0xf0, 0x40, 0x43, 0x14, 0x70, 0x53, 0x60, + 0xc2, 0xed, 0x03, 0x1a, 0xc2, 0xed, 0x04, 0x1a, 0xdf, 0xf8, 0x78, 0x3c, + 0x93, 0x60, 0x02, 0x23, 0x13, 0x75, 0x82, 0xed, 0x06, 0x3a, 0x91, 0xf9, + 0x46, 0x10, 0x00, 0xee, 0x10, 0x1a, 0xb8, 0xee, 0xc0, 0x0a, 0x82, 0xed, + 0x09, 0x0a, 0x98, 0xf8, 0x05, 0x70, 0x52, 0x46, 0x34, 0x21, 0x4a, 0x43, + 0x05, 0xeb, 0x02, 0x09, 0x09, 0xf1, 0x70, 0x06, 0x31, 0x69, 0xd6, 0xed, + 0x04, 0x0a, 0xb1, 0x61, 0x40, 0xf6, 0x06, 0x11, 0x99, 0xed, 0x19, 0x0a, + 0x00, 0xf0, 0x16, 0xfe, 0x02, 0xd5, 0x02, 0x22, 0x0c, 0x46, 0x32, 0x77, + 0x96, 0xed, 0x04, 0x0a, 0xd9, 0xed, 0x18, 0x0a, 0x00, 0xf0, 0x0c, 0xfe, + 0x40, 0xf1, 0x05, 0x81, 0x0c, 0x46, 0x01, 0x20, 0xc9, 0xe2, 0x00, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x42, + 0x00, 0x00, 0x7c, 0xc2, 0x00, 0x00, 0xc8, 0x42, 0x9d, 0xf9, 0x58, 0x30, + 0x05, 0xf1, 0x90, 0x02, 0x01, 0x26, 0x01, 0x2b, 0x16, 0x70, 0x09, 0xd1, + 0x2b, 0x7e, 0x82, 0xed, 0x02, 0x2a, 0x00, 0xee, 0x90, 0x3a, 0xf8, 0xee, + 0x60, 0x0a, 0xc2, 0xed, 0x01, 0x0a, 0x0c, 0xe0, 0x4f, 0xf0, 0xff, 0x36, + 0xb3, 0x42, 0x54, 0x60, 0x0a, 0xd1, 0x95, 0xf8, 0x18, 0x90, 0x00, 0xee, + 0x90, 0x9a, 0xf8, 0xee, 0x60, 0x0a, 0xc2, 0xed, 0x02, 0x0a, 0xc9, 0x6d, + 0x91, 0x61, 0x03, 0xe0, 0x82, 0xed, 0x02, 0x2a, 0x82, 0xed, 0x06, 0x3a, + 0x98, 0xf8, 0x04, 0x10, 0xc2, 0xed, 0x03, 0x1a, 0x01, 0x29, 0x0c, 0xbf, + 0xc2, 0xed, 0x04, 0x1a, 0x82, 0xed, 0x04, 0x0a, 0x02, 0x21, 0x11, 0x75, + 0x2b, 0x7e, 0x00, 0xee, 0x10, 0x3a, 0xb8, 0xee, 0x40, 0x0a, 0x82, 0xed, + 0x09, 0x0a, 0x01, 0x27, 0x99, 0xe7, 0x05, 0xf1, 0xc4, 0x01, 0x02, 0x22, + 0x0a, 0x70, 0x4c, 0x60, 0x81, 0xed, 0x02, 0x2a, 0x98, 0xf8, 0x04, 0x20, + 0xc1, 0xed, 0x03, 0x1a, 0x01, 0x2a, 0x0c, 0xbf, 0xc1, 0xed, 0x04, 0x1a, + 0x81, 0xed, 0x04, 0x0a, 0x02, 0x22, 0x00, 0xf0, 0x94, 0xfa, 0x6a, 0x7e, + 0x00, 0xee, 0x10, 0x2a, 0xb8, 0xee, 0x40, 0x0a, 0x81, 0xed, 0x09, 0x0a, + 0xe1, 0xe7, 0x05, 0xf1, 0xf8, 0x01, 0x03, 0x22, 0x00, 0xf0, 0x92, 0xfa, + 0xc1, 0xed, 0x04, 0x0a, 0x81, 0xed, 0x06, 0x3a, 0x95, 0xf8, 0x20, 0x20, + 0xec, 0xe7, 0x05, 0xf5, 0xe4, 0x71, 0x07, 0x22, 0x0a, 0x70, 0xc1, 0xed, + 0x01, 0x2a, 0x01, 0x22, 0x0a, 0x75, 0x81, 0xed, 0x02, 0x2a, 0xc1, 0xed, + 0x03, 0x1a, 0x81, 0xed, 0x04, 0x0a, 0x81, 0xed, 0x06, 0x3a, 0x95, 0xf8, + 0x20, 0x20, 0xd9, 0xe7, 0x05, 0xf5, 0xfe, 0x71, 0x08, 0x22, 0x00, 0xf0, + 0x6c, 0xfa, 0xc1, 0xed, 0x03, 0x1a, 0x81, 0xed, 0x04, 0x0a, 0x00, 0xf0, + 0x62, 0xfa, 0x4c, 0x62, 0xb5, 0xe7, 0x05, 0xf5, 0x0c, 0x71, 0x09, 0x22, + 0x0a, 0x70, 0xc1, 0xed, 0x01, 0x2a, 0x02, 0x22, 0x81, 0xed, 0x02, 0x2a, + 0xc1, 0xed, 0x03, 0x1a, 0xc1, 0xed, 0x04, 0x0a, 0xed, 0xe7, 0x05, 0xf5, + 0x19, 0x71, 0x0a, 0x22, 0x00, 0xf0, 0x51, 0xfa, 0x81, 0xed, 0x03, 0x1a, + 0x81, 0xed, 0x04, 0x1a, 0x00, 0xf0, 0x47, 0xfa, 0x01, 0x27, 0x2b, 0x78, + 0x00, 0xee, 0x10, 0x3a, 0xb8, 0xee, 0x40, 0x0a, 0x81, 0xed, 0x09, 0x0a, + 0x2f, 0xe7, 0x05, 0xf5, 0x26, 0x71, 0x0b, 0x22, 0x00, 0xf0, 0x59, 0xfa, + 0x2a, 0x79, 0xa3, 0xe7, 0x05, 0xf5, 0x33, 0x71, 0x0c, 0x22, 0x00, 0xf0, + 0x52, 0xfa, 0x2a, 0x7a, 0x9c, 0xe7, 0x05, 0xf5, 0xb0, 0x71, 0x05, 0x22, + 0x00, 0xf0, 0x40, 0xfa, 0xc5, 0xe7, 0x05, 0xf5, 0x96, 0x71, 0x04, 0x22, + 0x00, 0xf0, 0x30, 0xfa, 0x81, 0xed, 0x04, 0x9a, 0x81, 0xed, 0x06, 0x3a, + 0x95, 0xf8, 0x21, 0x20, 0x8a, 0xe7, 0x05, 0xf5, 0x40, 0x71, 0x0d, 0x22, + 0x00, 0xf0, 0x39, 0xfa, 0x6a, 0x78, 0x83, 0xe7, 0x05, 0xf5, 0x4d, 0x71, + 0x0e, 0x22, 0x00, 0xf0, 0x32, 0xfa, 0x6a, 0x79, 0x7c, 0xe7, 0x05, 0xf5, + 0x5a, 0x71, 0x0f, 0x22, 0x00, 0xf0, 0x2b, 0xfa, 0x6a, 0x7a, 0x75, 0xe7, + 0x05, 0xf5, 0xca, 0x71, 0x06, 0x22, 0x00, 0xf0, 0x19, 0xfa, 0x9e, 0xe7, + 0x10, 0x23, 0x0b, 0x70, 0xdf, 0xf8, 0x58, 0x2a, 0xdf, 0xf8, 0x58, 0x3a, + 0x4a, 0x60, 0x8b, 0x60, 0xdf, 0xf8, 0x54, 0x2a, 0xdf, 0xf8, 0x54, 0x3a, + 0xca, 0x60, 0x0b, 0x61, 0x01, 0x22, 0x00, 0xf0, 0xf2, 0xf9, 0x0a, 0x6e, + 0x4a, 0x62, 0xe0, 0xe6, 0x40, 0xf6, 0x05, 0x14, 0xc8, 0xe1, 0x00, 0x2c, + 0xfc, 0xd1, 0x05, 0xf1, 0x30, 0x0b, 0x01, 0x90, 0x05, 0xf1, 0x3c, 0x03, + 0xdb, 0xf8, 0x00, 0x10, 0x42, 0x46, 0xff, 0xf7, 0x9c, 0xfa, 0x01, 0x99, + 0x2b, 0x46, 0x42, 0x46, 0x00, 0x20, 0x00, 0xf0, 0xb9, 0xfc, 0x04, 0x00, + 0xea, 0xd1, 0x30, 0x78, 0x01, 0x28, 0x02, 0xd0, 0x02, 0x28, 0x0b, 0xd0, + 0x16, 0xe0, 0xdb, 0xf8, 0x04, 0x10, 0x01, 0x98, 0x05, 0xf1, 0x40, 0x03, + 0x42, 0x46, 0xff, 0xf7, 0x86, 0xfa, 0x00, 0xf0, 0x00, 0xfa, 0x09, 0xe0, + 0xdb, 0xf8, 0x08, 0x10, 0x01, 0x98, 0x05, 0xf1, 0x44, 0x03, 0x42, 0x46, + 0xff, 0xf7, 0x7b, 0xfa, 0x00, 0xf0, 0xef, 0xf9, 0x30, 0xee, 0x60, 0x8a, + 0x00, 0x2c, 0xcb, 0xd1, 0x96, 0xed, 0x01, 0x0a, 0x96, 0xed, 0x04, 0xaa, + 0x86, 0xed, 0x02, 0x8a, 0x30, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0xc0, 0x9a, + 0xd9, 0xed, 0x1b, 0xaa, 0xf0, 0xee, 0x48, 0x0a, 0xb0, 0xee, 0x4a, 0x0a, + 0x50, 0x46, 0x00, 0xf0, 0xe4, 0xf9, 0x99, 0xed, 0x1b, 0x0a, 0xd9, 0xed, + 0x1a, 0x0a, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x0b, 0xd5, + 0x60, 0xee, 0x89, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0xf7, 0xee, 0x00, 0x0a, + 0x30, 0xee, 0x20, 0x0a, 0xd6, 0xf7, 0x78, 0xf8, 0xfc, 0xee, 0xc0, 0x8a, + 0xcd, 0xf8, 0x10, 0x80, 0x03, 0x95, 0x8d, 0xf8, 0x02, 0xa0, 0x05, 0x9d, + 0x9d, 0xf8, 0x08, 0x80, 0x9d, 0xf8, 0x03, 0xa0, 0xcd, 0xed, 0x02, 0x8a, + 0x25, 0xe0, 0x01, 0x20, 0x8d, 0xf8, 0x01, 0x00, 0x6d, 0x1c, 0xed, 0xb2, + 0xe8, 0x07, 0x0e, 0xd4, 0xb5, 0xee, 0x00, 0x0a, 0x6a, 0xee, 0x80, 0xaa, + 0x99, 0xed, 0x1a, 0x0a, 0xb4, 0xee, 0x6a, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0xa4, 0xbf, 0xf0, 0xee, 0x40, 0xaa, 0x0a, 0xf1, 0x01, 0x0a, 0x03, 0x98, + 0x04, 0x9a, 0xdb, 0xf8, 0x00, 0x10, 0x00, 0xf1, 0x3c, 0x03, 0x01, 0x98, + 0xff, 0xf7, 0x21, 0xfa, 0x03, 0x9b, 0x04, 0x9a, 0x01, 0x99, 0x00, 0x20, + 0x00, 0xf0, 0x3e, 0xfc, 0x04, 0x46, 0x02, 0x98, 0xb5, 0xeb, 0x40, 0x0f, + 0x72, 0xd2, 0x5f, 0xfa, 0x8a, 0xf0, 0x01, 0x28, 0x98, 0xbf, 0x00, 0x2c, + 0x6c, 0xd1, 0x9d, 0xf8, 0x01, 0x00, 0x00, 0x28, 0x14, 0xbf, 0xb1, 0xee, + 0x6a, 0x0a, 0xb0, 0xee, 0x6a, 0x0a, 0x7a, 0xee, 0x00, 0x8a, 0x00, 0xf0, + 0x41, 0xf9, 0x06, 0xd5, 0x9d, 0xf8, 0x00, 0x00, 0x40, 0x1c, 0xf0, 0xee, + 0x40, 0x8a, 0x8d, 0xf8, 0x00, 0x00, 0x99, 0xed, 0x19, 0x0a, 0x9d, 0xf8, + 0x00, 0x00, 0xb4, 0xee, 0x68, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xbf, + 0xf0, 0xee, 0x40, 0x8a, 0x08, 0xf1, 0x01, 0x08, 0x01, 0x28, 0x84, 0xbf, + 0x03, 0x21, 0x31, 0x77, 0x5f, 0xfa, 0x88, 0xf0, 0x01, 0x28, 0x84, 0xbf, + 0x04, 0x20, 0x30, 0x77, 0x9d, 0xf8, 0x02, 0x20, 0x03, 0x99, 0x01, 0x98, + 0xb0, 0xee, 0x68, 0x0a, 0x00, 0xf0, 0x60, 0xf9, 0x30, 0x78, 0x01, 0x28, + 0x02, 0xd0, 0x02, 0x28, 0x0c, 0xd0, 0x18, 0xe0, 0x03, 0x99, 0x04, 0x9a, + 0x01, 0x98, 0x01, 0xf1, 0x40, 0x03, 0xdb, 0xf8, 0x04, 0x10, 0xff, 0xf7, + 0xce, 0xf9, 0x00, 0xf0, 0x48, 0xf9, 0x0a, 0xe0, 0x03, 0x98, 0x04, 0x9a, + 0xdb, 0xf8, 0x08, 0x10, 0x00, 0xf1, 0x44, 0x03, 0x01, 0x98, 0xff, 0xf7, + 0xc2, 0xf9, 0x00, 0xf0, 0x36, 0xf9, 0x30, 0xee, 0x60, 0x8a, 0x00, 0x2c, + 0xa1, 0xd1, 0x00, 0xf0, 0xf7, 0xf8, 0xa1, 0xbf, 0xd9, 0xed, 0x19, 0x0a, + 0xf4, 0xee, 0x68, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xc6, 0xed, 0x04, 0x8a, + 0x00, 0xf0, 0xe1, 0xf8, 0x7f, 0xf5, 0x6d, 0xaf, 0xd6, 0xed, 0x02, 0x0a, + 0xf4, 0xee, 0x48, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x8b, 0xd5, 0x00, 0xf0, + 0xcd, 0xf8, 0x88, 0xe7, 0x04, 0x9d, 0xdd, 0xf8, 0x0c, 0xa0, 0x9d, 0xf8, + 0x02, 0x80, 0x01, 0x2f, 0x72, 0xd1, 0x68, 0x79, 0xd9, 0xed, 0x18, 0x8a, + 0x01, 0x28, 0x08, 0xbf, 0x99, 0xed, 0x19, 0x9a, 0x17, 0xd0, 0xb9, 0xee, + 0x04, 0x0a, 0x3a, 0xee, 0x00, 0x0a, 0xf4, 0xee, 0x40, 0x8a, 0xf1, 0xee, + 0x10, 0xfa, 0x48, 0xbf, 0xf0, 0xee, 0x40, 0x8a, 0xb1, 0xee, 0x04, 0x0a, + 0x99, 0xed, 0x19, 0x9a, 0x3a, 0xee, 0x00, 0x0a, 0xb4, 0xee, 0x49, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, 0xb0, 0xee, 0x40, 0x9a, 0x01, 0x9f, + 0x25, 0xe0, 0xdb, 0xf8, 0x08, 0x10, 0x0a, 0xf1, 0x44, 0x03, 0x00, 0xf0, + 0xe6, 0xf8, 0x00, 0xf0, 0xe8, 0xf8, 0x30, 0xee, 0x60, 0x8a, 0xd4, 0xb9, + 0x00, 0xf0, 0xaa, 0xf8, 0xa1, 0xbf, 0xd9, 0xed, 0x19, 0x0a, 0xf4, 0xee, + 0x68, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xc6, 0xed, 0x04, 0x8a, 0x00, 0xf0, + 0x94, 0xf8, 0x42, 0xbf, 0xd6, 0xed, 0x02, 0x0a, 0xf4, 0xee, 0x48, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x01, 0xd5, 0x00, 0xf0, 0x81, 0xf8, 0xb7, 0xee, + 0x00, 0x0a, 0x78, 0xee, 0x80, 0x8a, 0xb4, 0xee, 0x68, 0x9a, 0xf1, 0xee, + 0x10, 0xfa, 0x24, 0xdb, 0x1c, 0xbb, 0x00, 0xf0, 0x89, 0xf8, 0x48, 0xbf, + 0xf0, 0xee, 0x40, 0x8a, 0x99, 0xed, 0x19, 0x0a, 0xb4, 0xee, 0x68, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, 0xf0, 0xee, 0x40, 0x8a, 0xb0, 0xee, + 0x68, 0x0a, 0x42, 0x46, 0x51, 0x46, 0x38, 0x46, 0x00, 0xf0, 0xbc, 0xf8, + 0x30, 0x78, 0x01, 0x28, 0x02, 0xd0, 0x02, 0x28, 0xb9, 0xd0, 0xc2, 0xe7, + 0xdb, 0xf8, 0x04, 0x10, 0x0a, 0xf1, 0x40, 0x03, 0x00, 0xf0, 0x9f, 0xf8, + 0x00, 0xf0, 0xa7, 0xf8, 0xb7, 0xe7, 0x01, 0x97, 0x34, 0xb9, 0x01, 0x98, + 0xb0, 0xee, 0x4a, 0x0a, 0x42, 0x46, 0x51, 0x46, 0x00, 0xf0, 0xa4, 0xf8, + 0x30, 0x78, 0x01, 0x28, 0x02, 0xd0, 0x02, 0x28, 0x0b, 0xd0, 0x16, 0xe0, + 0xdb, 0xf8, 0x04, 0x10, 0x01, 0x98, 0x0a, 0xf1, 0x40, 0x03, 0x2a, 0x46, + 0xff, 0xf7, 0x13, 0xf9, 0x00, 0xf0, 0x8d, 0xf8, 0x09, 0xe0, 0xdb, 0xf8, + 0x08, 0x10, 0x01, 0x98, 0x0a, 0xf1, 0x44, 0x03, 0x2a, 0x46, 0xff, 0xf7, + 0x08, 0xf9, 0x00, 0xf0, 0x7c, 0xf8, 0x30, 0xee, 0x60, 0x8a, 0x54, 0xb9, + 0x86, 0xed, 0x03, 0x8a, 0x86, 0xed, 0x05, 0xaa, 0xf0, 0xee, 0x48, 0x0a, + 0xb0, 0xee, 0x4a, 0x0a, 0x40, 0x46, 0x00, 0xf0, 0x7a, 0xf8, 0xd6, 0xed, + 0x02, 0x0a, 0x96, 0xed, 0x03, 0x0a, 0xb9, 0xee, 0x08, 0x1a, 0x30, 0xee, + 0x81, 0x1a, 0xb4, 0xee, 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x09, 0xd5, + 0xd5, 0xed, 0x07, 0x0a, 0x00, 0xf0, 0x44, 0xfb, 0x06, 0xd5, 0x05, 0x20, + 0x30, 0x77, 0x40, 0xf6, 0x07, 0x14, 0x01, 0xe0, 0x00, 0x20, 0x30, 0x77, + 0x06, 0xb0, 0x20, 0x46, 0xbd, 0xec, 0x06, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, + 0x94, 0x86, 0x04, 0x02, 0x96, 0xed, 0x01, 0x0a, 0x96, 0xed, 0x04, 0xaa, + 0x30, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0xc0, 0x9a, 0x70, 0x47, 0x96, 0xed, + 0x01, 0x0a, 0x30, 0xee, 0x48, 0x0a, 0xb0, 0xee, 0xc0, 0x0a, 0xb4, 0xee, + 0x69, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x70, 0x47, 0x99, 0xed, 0x18, 0x0a, + 0xf4, 0xee, 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x70, 0x47, 0x0a, 0x75, + 0x81, 0xed, 0x06, 0x3a, 0x70, 0x47, 0x0a, 0x70, 0xc1, 0xed, 0x01, 0x2a, + 0x01, 0x22, 0x81, 0xed, 0x02, 0x2a, 0x70, 0x47, 0x0a, 0x70, 0xc1, 0xed, + 0x01, 0x2a, 0x02, 0x22, 0x0a, 0x75, 0x81, 0xed, 0x02, 0x2a, 0xc1, 0xed, + 0x03, 0x1a, 0x70, 0x47, 0x0a, 0x70, 0xc1, 0xed, 0x01, 0x2a, 0x01, 0x22, + 0x81, 0xed, 0x02, 0x2a, 0xc1, 0xed, 0x03, 0x1a, 0x81, 0xed, 0x04, 0x9a, + 0x70, 0x47, 0x0a, 0x70, 0xc1, 0xed, 0x01, 0x2a, 0x01, 0x22, 0x0a, 0x75, + 0x81, 0xed, 0x02, 0x2a, 0x81, 0xed, 0x03, 0x1a, 0x81, 0xed, 0x04, 0x1a, + 0x81, 0xed, 0x06, 0x3a, 0x70, 0x47, 0x2a, 0x46, 0x38, 0x46, 0xff, 0xf7, + 0x8a, 0xb8, 0x04, 0x46, 0x9b, 0xed, 0x03, 0x0a, 0xdb, 0xed, 0x05, 0x0a, + 0x70, 0x47, 0x04, 0x46, 0x9b, 0xed, 0x03, 0x0a, 0xdb, 0xed, 0x04, 0x0a, + 0x70, 0x47, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x47, 0x2d, 0xed, 0x02, 0x8b, + 0xb0, 0xee, 0x40, 0x8a, 0x0f, 0x46, 0xbd, 0xee, 0xc8, 0x0a, 0x10, 0x2a, + 0x80, 0x46, 0x07, 0xf2, 0xe2, 0x36, 0x07, 0xf1, 0x21, 0x05, 0x10, 0xee, + 0x10, 0x4a, 0x00, 0xf2, 0xb6, 0x81, 0xdf, 0xe8, 0x12, 0xf0, 0x11, 0x00, + 0x2b, 0x00, 0x39, 0x00, 0x44, 0x00, 0x3a, 0x01, 0x06, 0x01, 0x73, 0x01, + 0x44, 0x00, 0x5d, 0x00, 0x8b, 0x00, 0xdd, 0x00, 0xed, 0x00, 0xfd, 0x00, + 0x50, 0x01, 0x5d, 0x01, 0x6a, 0x01, 0xa6, 0x01, 0x34, 0x70, 0x38, 0x46, + 0xff, 0xf7, 0xe1, 0xfb, 0xba, 0x7e, 0x06, 0x21, 0x00, 0xf0, 0xee, 0xf9, + 0x00, 0xf0, 0xea, 0xf9, 0xba, 0x78, 0x00, 0x21, 0x00, 0xf0, 0xe8, 0xf9, + 0x68, 0x7b, 0x69, 0x7a, 0xbd, 0xec, 0x02, 0x8b, 0x41, 0xea, 0x80, 0x01, + 0x40, 0x46, 0xbd, 0xe8, 0xf0, 0x47, 0xc9, 0xb2, 0xfe, 0xf7, 0x37, 0xbc, + 0xbd, 0xee, 0xc8, 0x0a, 0x74, 0x70, 0x10, 0xee, 0x10, 0x2a, 0x3a, 0x76, + 0x3a, 0x77, 0x06, 0x21, 0xd2, 0xb2, 0xfe, 0xf7, 0xa3, 0xfb, 0x3a, 0x7f, + 0x07, 0x21, 0xf9, 0xe0, 0x00, 0xf0, 0x8a, 0xf9, 0x7a, 0x76, 0x7a, 0x77, + 0x06, 0x21, 0xd2, 0xb2, 0xfe, 0xf7, 0xd0, 0xfb, 0x7a, 0x7f, 0x07, 0x21, + 0x5a, 0xe1, 0x00, 0xf0, 0x84, 0xf9, 0xb4, 0x70, 0x07, 0xdb, 0x00, 0xf0, + 0x7b, 0xf9, 0x87, 0xf8, 0x20, 0x20, 0x00, 0x20, 0xe8, 0x70, 0xd2, 0xb2, + 0x06, 0xe0, 0x00, 0x20, 0x87, 0xf8, 0x20, 0x00, 0x00, 0xf0, 0x69, 0xf9, + 0xe8, 0x70, 0x00, 0x22, 0x08, 0x21, 0x00, 0xf0, 0x99, 0xf9, 0xea, 0x78, + 0x09, 0x21, 0xd5, 0xe0, 0x00, 0xf0, 0x6b, 0xf9, 0x06, 0xdd, 0x20, 0x46, + 0xa1, 0x46, 0xa2, 0x46, 0x00, 0x21, 0x00, 0x24, 0x00, 0x25, 0x04, 0xe0, + 0x00, 0x20, 0x21, 0x46, 0x25, 0x46, 0x81, 0x46, 0x82, 0x46, 0x40, 0x1a, + 0xf0, 0x73, 0x00, 0x23, 0x40, 0xb2, 0x00, 0xee, 0x10, 0x0a, 0x00, 0x22, + 0x00, 0xf0, 0x8b, 0xf9, 0xa9, 0xeb, 0x04, 0x00, 0x30, 0x74, 0x4f, 0xfa, + 0x80, 0xf9, 0x00, 0xee, 0x10, 0x9a, 0x00, 0x23, 0x01, 0x22, 0x00, 0xf0, + 0x80, 0xf9, 0xa5, 0xeb, 0x0a, 0x00, 0x70, 0x74, 0x4f, 0xfa, 0x80, 0xfa, + 0x00, 0xee, 0x10, 0xaa, 0x00, 0x23, 0x02, 0x22, 0x08, 0x21, 0x91, 0xe0, + 0x00, 0xf0, 0x3d, 0xf9, 0x06, 0xdd, 0xa4, 0x46, 0xa1, 0x46, 0x20, 0x46, + 0xa2, 0x46, 0x00, 0x24, 0x00, 0x25, 0x04, 0xe0, 0x00, 0x20, 0x81, 0x46, + 0x84, 0x46, 0x25, 0x46, 0x82, 0x46, 0x96, 0xf9, 0x03, 0xe0, 0x4f, 0xfa, + 0x8c, 0xfc, 0x00, 0xee, 0x10, 0xea, 0x00, 0xee, 0x90, 0xca, 0x00, 0xf0, + 0x2b, 0xf9, 0x40, 0xb2, 0x6d, 0xb2, 0x00, 0xee, 0x90, 0x0a, 0xf8, 0xee, + 0xe0, 0x0a, 0x00, 0x23, 0x00, 0x22, 0x09, 0x21, 0x30, 0xee, 0x60, 0x0a, + 0x38, 0x46, 0x64, 0xb2, 0x4f, 0xfa, 0x89, 0xf9, 0x00, 0xf0, 0x9a, 0xf9, + 0x96, 0xf9, 0x04, 0x00, 0x00, 0xee, 0x10, 0x0a, 0x00, 0xee, 0x90, 0x5a, + 0x00, 0xf0, 0x12, 0xf9, 0x00, 0xee, 0x90, 0x4a, 0xf8, 0xee, 0xe0, 0x0a, + 0x00, 0x23, 0x01, 0x22, 0x09, 0x21, 0x30, 0xee, 0x60, 0x0a, 0x38, 0x46, + 0x4f, 0xfa, 0x8a, 0xfa, 0x00, 0xf0, 0x84, 0xf9, 0x96, 0xf9, 0x05, 0x00, + 0x00, 0xee, 0x10, 0x0a, 0x00, 0xee, 0x90, 0x9a, 0x00, 0xf0, 0xfc, 0xf8, + 0x00, 0xee, 0x90, 0xaa, 0xf8, 0xee, 0xe0, 0x0a, 0x00, 0x23, 0x02, 0x22, + 0x09, 0x21, 0x30, 0xee, 0x60, 0x0a, 0x41, 0xe0, 0xf0, 0x7b, 0x24, 0x18, + 0xf4, 0x70, 0x00, 0x23, 0x64, 0xb2, 0x00, 0xee, 0x10, 0x4a, 0x00, 0x22, + 0x0a, 0x21, 0x00, 0xf0, 0xee, 0xf8, 0x00, 0xf0, 0x11, 0xf9, 0x3a, 0x7b, + 0x03, 0x21, 0x45, 0xe0, 0x30, 0x7c, 0x24, 0x18, 0x34, 0x71, 0x00, 0x23, + 0x64, 0xb2, 0x00, 0xee, 0x10, 0x4a, 0x01, 0x22, 0x0b, 0x21, 0x00, 0xf0, + 0xde, 0xf8, 0x00, 0xf0, 0xf7, 0xf8, 0x3a, 0x7c, 0x04, 0x21, 0x35, 0xe0, + 0x70, 0x7c, 0x24, 0x18, 0x74, 0x71, 0x00, 0xf0, 0xd8, 0xf8, 0x0c, 0x21, + 0x00, 0xf0, 0xd1, 0xf8, 0x26, 0xe0, 0xb0, 0x7c, 0x01, 0x28, 0x07, 0xd1, + 0xf0, 0x78, 0x00, 0xf0, 0x03, 0xf9, 0x30, 0x79, 0x00, 0xf0, 0xd1, 0xf8, + 0x70, 0x79, 0x06, 0xe0, 0xf0, 0x7b, 0x00, 0xf0, 0xfb, 0xf8, 0x30, 0x7c, + 0x00, 0xf0, 0xc9, 0xf8, 0x70, 0x7c, 0x24, 0x18, 0xf4, 0x72, 0x00, 0xf0, + 0xbe, 0xf8, 0x05, 0x21, 0xb8, 0xee, 0xc0, 0x0a, 0x00, 0xf0, 0xb7, 0xf8, + 0x00, 0xf0, 0xd8, 0xf8, 0x3a, 0x7b, 0x03, 0x21, 0x00, 0xf0, 0xcc, 0xf8, + 0x00, 0xf0, 0xc8, 0xf8, 0x3a, 0x7c, 0x04, 0x21, 0x00, 0xf0, 0xc6, 0xf8, + 0x3a, 0x7a, 0x02, 0x21, 0x00, 0xf0, 0xc2, 0xf8, 0x3a, 0x7d, 0x05, 0x21, + 0xbd, 0xec, 0x02, 0x8b, 0x40, 0x46, 0xbd, 0xe8, 0xf0, 0x47, 0xfe, 0xf7, + 0x9f, 0xba, 0x00, 0xf0, 0x8e, 0xf8, 0x06, 0xdb, 0x00, 0xf0, 0x86, 0xf8, + 0x00, 0x20, 0x2a, 0x70, 0x28, 0x71, 0xd2, 0xb2, 0x05, 0xe0, 0x00, 0x20, + 0x28, 0x70, 0x00, 0xf0, 0x76, 0xf8, 0x28, 0x71, 0x00, 0x22, 0x08, 0x21, + 0x00, 0xf0, 0xa1, 0xf8, 0x2a, 0x79, 0x09, 0x21, 0x4e, 0xe0, 0xb4, 0x71, + 0x01, 0x23, 0x00, 0x22, 0x0d, 0x21, 0xb0, 0xee, 0x48, 0x0a, 0x00, 0xf0, + 0x80, 0xf8, 0x00, 0xf0, 0x9c, 0xf8, 0x7a, 0x7b, 0x03, 0x21, 0x41, 0xe0, + 0x34, 0x71, 0x01, 0x23, 0x01, 0x22, 0x0e, 0x21, 0xb0, 0xee, 0x48, 0x0a, + 0x00, 0xf0, 0x73, 0xf8, 0x00, 0xf0, 0x85, 0xf8, 0x7a, 0x7c, 0x04, 0x21, + 0x34, 0xe0, 0x74, 0x71, 0x01, 0x23, 0x02, 0x22, 0x0f, 0x21, 0xb0, 0xee, + 0x48, 0x0a, 0x00, 0xf0, 0x66, 0xf8, 0x25, 0xe0, 0x06, 0x21, 0x01, 0x23, + 0x70, 0x56, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0xc0, 0x0a, 0x00, 0x22, + 0x30, 0xee, 0x08, 0x0a, 0x00, 0xf0, 0x59, 0xf8, 0x96, 0xf9, 0x07, 0x00, + 0x00, 0xf0, 0x35, 0xf8, 0x01, 0x22, 0x00, 0xf0, 0x84, 0xf8, 0x96, 0xf9, + 0x08, 0x00, 0x00, 0xf0, 0x2e, 0xf8, 0x02, 0x22, 0x00, 0xf0, 0x7d, 0xf8, + 0x00, 0xf0, 0x67, 0xf8, 0x7a, 0x7b, 0x03, 0x21, 0x00, 0xf0, 0x5b, 0xf8, + 0x00, 0xf0, 0x57, 0xf8, 0x7a, 0x7c, 0x04, 0x21, 0x00, 0xf0, 0x55, 0xf8, + 0x7a, 0x7a, 0x02, 0x21, 0x00, 0xf0, 0x51, 0xf8, 0x7a, 0x7d, 0x05, 0x21, + 0xbd, 0xec, 0x02, 0x8b, 0x40, 0x46, 0xbd, 0xe8, 0xf0, 0x47, 0xfe, 0xf7, + 0x6b, 0xba, 0x07, 0xf2, 0xfc, 0x30, 0xb7, 0xee, 0x00, 0x0a, 0x38, 0xee, + 0x00, 0x0a, 0x80, 0xed, 0x00, 0x8a, 0x40, 0x46, 0xbd, 0xec, 0x02, 0x8b, + 0xbd, 0xe8, 0xf0, 0x47, 0x84, 0xe0, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, + 0xf0, 0x87, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0xc0, 0x0a, 0x01, 0x23, + 0x70, 0x47, 0xb0, 0xee, 0xc8, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, + 0x10, 0x0a, 0x70, 0x47, 0xbd, 0xee, 0xc8, 0x0a, 0x10, 0xee, 0x10, 0x2a, + 0x70, 0x47, 0xb5, 0xee, 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x70, 0x47, + 0xb8, 0xee, 0xc0, 0x0a, 0xf8, 0xee, 0xe0, 0x0a, 0x30, 0xee, 0x20, 0x0a, + 0x70, 0x47, 0xb8, 0xee, 0xc0, 0x0a, 0x38, 0x46, 0x74, 0xe0, 0x00, 0x23, + 0x64, 0xb2, 0x00, 0xee, 0x10, 0x4a, 0x02, 0x22, 0x70, 0x47, 0x20, 0x18, + 0xb0, 0x72, 0x00, 0x23, 0x40, 0xb2, 0x00, 0xee, 0x10, 0x0a, 0x01, 0x22, + 0x05, 0x21, 0xb8, 0xee, 0xc0, 0x0a, 0x38, 0x46, 0x62, 0xe0, 0x7a, 0x79, + 0x01, 0x21, 0x40, 0x46, 0xfe, 0xf7, 0x20, 0xba, 0x3a, 0x79, 0x01, 0x21, + 0x40, 0x46, 0xfe, 0xf7, 0xe3, 0xb9, 0x7a, 0x78, 0x00, 0x21, 0x40, 0x46, + 0xfe, 0xf7, 0x16, 0xba, 0x3a, 0x78, 0x00, 0x21, 0x40, 0x46, 0xfe, 0xf7, + 0xd9, 0xb9, 0x08, 0x21, 0xb8, 0xee, 0xc0, 0x0a, 0x38, 0x46, 0x49, 0xe0, + 0x6a, 0x78, 0x08, 0x21, 0x40, 0x46, 0xfe, 0xf7, 0x3e, 0xba, 0x06, 0x21, + 0x30, 0xee, 0x08, 0x0a, 0x38, 0x46, 0x3f, 0xe0, 0x20, 0x18, 0x70, 0x72, + 0x00, 0x23, 0x40, 0xb2, 0x00, 0xee, 0x10, 0x0a, 0x00, 0x22, 0x05, 0x21, + 0xb8, 0xee, 0xc0, 0x0a, 0x38, 0x46, 0x33, 0xe0, 0x10, 0xb5, 0x22, 0x31, + 0x92, 0x1c, 0x04, 0x2a, 0x10, 0xd8, 0xdf, 0xe8, 0x02, 0xf0, 0x03, 0x05, + 0x07, 0x0a, 0x0d, 0x00, 0x07, 0x22, 0x02, 0xe0, 0x05, 0x23, 0x03, 0xe0, + 0x00, 0x22, 0x0a, 0x70, 0x04, 0xe0, 0x01, 0x23, 0x0b, 0x70, 0x01, 0xe0, + 0x03, 0x24, 0x0c, 0x70, 0x0a, 0x78, 0x0a, 0x71, 0x08, 0x21, 0xbd, 0xe8, + 0x10, 0x40, 0xfe, 0xf7, 0x10, 0xba, 0x00, 0x00, 0x10, 0xb5, 0xdf, 0xed, + 0x49, 0x0a, 0x04, 0x46, 0x20, 0xee, 0x20, 0x0a, 0xd5, 0xf7, 0x50, 0xfc, + 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0xbd, 0xee, 0xc0, 0x1a, 0x00, 0x23, + 0x11, 0xee, 0x10, 0x2a, 0x00, 0x21, 0xe3, 0xf7, 0x07, 0xbf, 0x00, 0x00, + 0x98, 0x92, 0x98, 0x00, 0xb5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x00, 0xeb, 0x82, 0x00, 0x13, 0xdb, 0xdf, 0xed, 0x3c, 0x0a, 0xb4, 0xee, + 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xa8, 0xbf, 0x9f, 0xed, 0x39, 0x0a, + 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x1a, 0x13, 0xb9, 0x01, 0x70, + 0x00, 0x21, 0x14, 0xe0, 0x41, 0x70, 0x00, 0x21, 0x1b, 0xe0, 0xdf, 0xed, + 0x34, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, + 0xb0, 0xee, 0x60, 0x0a, 0x4b, 0xb9, 0x00, 0x21, 0x01, 0x70, 0xb0, 0xee, + 0xc0, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x1a, 0x01, 0x73, + 0x70, 0x47, 0x00, 0x21, 0x41, 0x70, 0xb0, 0xee, 0xc0, 0x0a, 0xbd, 0xee, + 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x1a, 0x41, 0x73, 0x70, 0x47, 0x00, 0x00, + 0x5c, 0x92, 0x04, 0x02, 0x2d, 0xe9, 0xf0, 0x41, 0x04, 0x46, 0x0d, 0x46, + 0x90, 0x46, 0x1f, 0x46, 0x00, 0x20, 0x00, 0x26, 0x98, 0xed, 0x07, 0x0a, + 0x97, 0xed, 0x0f, 0x1a, 0xff, 0xee, 0x00, 0x0a, 0x60, 0xee, 0x20, 0x0a, + 0xb4, 0xee, 0x60, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x1f, 0xd5, 0x0a, 0x20, + 0xe1, 0xf7, 0x9e, 0xf9, 0x01, 0x2c, 0x05, 0xd1, 0x3a, 0x46, 0x41, 0x46, + 0x28, 0x46, 0xfe, 0xf7, 0xab, 0xfd, 0x06, 0xe0, 0x39, 0x6b, 0x07, 0xf1, + 0x3c, 0x03, 0x42, 0x46, 0x28, 0x46, 0xfe, 0xf7, 0xb6, 0xfd, 0x76, 0x1c, + 0xf1, 0xb2, 0x04, 0x29, 0x07, 0xd2, 0x97, 0xed, 0x0f, 0x0a, 0xdf, 0xed, + 0x0e, 0x0a, 0x00, 0xf0, 0x09, 0xf8, 0xd5, 0xdb, 0x01, 0xe0, 0x40, 0xf6, + 0x08, 0x10, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x00, 0xdf, 0xed, 0x09, 0x0a, + 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x70, 0x47, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x40, 0x00, 0x00, 0x80, 0x47, 0x01, 0x00, 0x7c, 0x42, + 0x00, 0x00, 0x7c, 0x42, 0x00, 0x00, 0x7c, 0xc2, 0xff, 0xff, 0x81, 0xc2, + 0x00, 0x00, 0x60, 0x42, 0xcd, 0xcc, 0xcc, 0xbd, 0xcd, 0xcc, 0xcc, 0x3d, + 0x0a, 0xd7, 0xa3, 0x3a, 0x0a, 0xd7, 0xa3, 0x3b, 0x01, 0x20, 0x00, 0xf0, + 0xab, 0xbc, 0x00, 0x00, 0x70, 0xb4, 0x4f, 0xf0, 0x00, 0x45, 0x91, 0xea, + 0x03, 0x0f, 0x7b, 0xf5, 0xbd, 0xaf, 0x6b, 0x40, 0x84, 0x1a, 0x71, 0xeb, + 0x03, 0x06, 0x04, 0xd2, 0x6e, 0x40, 0x00, 0x1b, 0xb1, 0x41, 0x12, 0x19, + 0x73, 0x41, 0x4f, 0xf4, 0x00, 0x1c, 0x1c, 0xeb, 0x41, 0x0f, 0x34, 0xbf, + 0x7c, 0xeb, 0x43, 0x06, 0x83, 0xe0, 0x0c, 0x0d, 0xa4, 0xeb, 0x13, 0x56, + 0x36, 0x2e, 0x00, 0xf3, 0x7c, 0x80, 0x01, 0x2e, 0x45, 0xea, 0xc3, 0x23, + 0x41, 0xdc, 0x43, 0xea, 0x52, 0x53, 0x12, 0xbf, 0xd2, 0x02, 0x92, 0x02, + 0x5b, 0x08, 0x24, 0x05, 0x45, 0xea, 0xc1, 0x21, 0x41, 0xea, 0x50, 0x51, + 0xd2, 0xeb, 0xc0, 0x20, 0x99, 0x41, 0x25, 0xd4, 0x07, 0xd1, 0xb0, 0xfa, + 0x80, 0xf6, 0x10, 0xfa, 0x06, 0xf1, 0x62, 0xd0, 0x00, 0x20, 0x20, 0x36, + 0x08, 0xe0, 0xb1, 0xfa, 0x81, 0xf6, 0xb1, 0x40, 0xc6, 0xf1, 0x20, 0x02, + 0x20, 0xfa, 0x02, 0xf2, 0x11, 0x43, 0xb0, 0x40, 0x4f, 0xea, 0xf4, 0x74, + 0xb4, 0xeb, 0x46, 0x54, 0x34, 0xf0, 0x01, 0x06, 0x4f, 0xea, 0x74, 0x04, + 0x0a, 0xd8, 0xd6, 0xf5, 0x00, 0x16, 0x76, 0x0d, 0x04, 0xf0, 0x00, 0x44, + 0xf0, 0x40, 0x61, 0xfa, 0x06, 0xf2, 0x50, 0x40, 0xf1, 0x40, 0x48, 0x40, + 0xc0, 0x0a, 0x40, 0xea, 0x41, 0x50, 0x21, 0xf0, 0x00, 0x41, 0x28, 0xbf, + 0x5f, 0xea, 0x50, 0x05, 0x50, 0xf1, 0x00, 0x00, 0x44, 0xeb, 0xd1, 0x21, + 0x35, 0xe0, 0xdb, 0x0a, 0x45, 0xea, 0xc1, 0x21, 0xc9, 0x0a, 0xb6, 0xf1, + 0x20, 0x05, 0x0e, 0xdd, 0x42, 0xea, 0x02, 0x42, 0x12, 0x0c, 0xc5, 0xf1, + 0x20, 0x06, 0x03, 0xfa, 0x06, 0xf6, 0xeb, 0x40, 0x42, 0xea, 0x06, 0x05, + 0x6d, 0x42, 0x98, 0x41, 0x61, 0xf1, 0x00, 0x01, 0x0d, 0xe0, 0x62, 0xfa, + 0x06, 0xf5, 0xf2, 0x40, 0x55, 0x40, 0x63, 0xfa, 0x06, 0xfc, 0x82, 0xea, + 0x0c, 0x02, 0xf3, 0x40, 0x5a, 0x40, 0x6d, 0x42, 0x90, 0x41, 0x61, 0xeb, + 0x03, 0x01, 0x11, 0xf4, 0x80, 0x1f, 0x05, 0xd1, 0x64, 0x1e, 0x62, 0x05, + 0x02, 0xd0, 0x6d, 0x00, 0x40, 0x41, 0x49, 0x41, 0x21, 0xf4, 0x80, 0x11, + 0x43, 0x08, 0x75, 0xf1, 0x00, 0x43, 0x50, 0xf1, 0x00, 0x00, 0x41, 0xeb, + 0x04, 0x51, 0x70, 0xbc, 0x70, 0x47, 0x1c, 0xeb, 0x41, 0x0f, 0x15, 0xd2, + 0x23, 0xf0, 0x00, 0x43, 0x52, 0xea, 0x43, 0x06, 0x0b, 0xd0, 0x4f, 0xea, + 0x4c, 0x0c, 0xbc, 0xeb, 0x41, 0x0f, 0x04, 0xd8, 0x0c, 0x0d, 0x66, 0x1e, + 0x34, 0x2e, 0xb7, 0xdd, 0xeb, 0xe7, 0x80, 0x1a, 0x99, 0x41, 0x50, 0xea, + 0x41, 0x06, 0x08, 0xbf, 0x00, 0x21, 0xe4, 0xe7, 0x08, 0xbf, 0x1c, 0xeb, + 0x43, 0x0f, 0x28, 0xbf, 0x6f, 0xf0, 0x00, 0x01, 0xdd, 0xe7, 0x00, 0x00, + 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, + 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, + 0x10, 0x88, 0x30, 0xbd, 0x38, 0xb5, 0x35, 0x49, 0x51, 0xf8, 0x20, 0x40, + 0x04, 0xf2, 0x14, 0x75, 0x00, 0x23, 0x02, 0x22, 0x01, 0x21, 0x28, 0x46, + 0xff, 0xf7, 0xe6, 0xff, 0x04, 0xf2, 0x1c, 0x74, 0x01, 0x23, 0x01, 0x22, + 0x00, 0x21, 0x28, 0x46, 0xff, 0xf7, 0xde, 0xff, 0x20, 0x46, 0x01, 0xb0, + 0xbd, 0xe8, 0x30, 0x40, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0xd5, 0xe7, + 0x10, 0xb5, 0x27, 0x4c, 0x54, 0xf8, 0x20, 0x00, 0xbd, 0xe8, 0x10, 0x40, + 0x81, 0xf0, 0x01, 0x03, 0x01, 0x22, 0x00, 0x21, 0x00, 0xf5, 0xe2, 0x60, + 0xc8, 0xe7, 0x00, 0x00, 0x2d, 0xe9, 0xff, 0x47, 0x00, 0x25, 0x00, 0x29, + 0x37, 0xd0, 0x1f, 0x49, 0x0f, 0xf2, 0x8c, 0x0a, 0x0f, 0xf2, 0xc4, 0x04, + 0x28, 0xa6, 0x01, 0xeb, 0x00, 0x59, 0x1c, 0x49, 0x01, 0xeb, 0x00, 0x58, + 0x00, 0x27, 0x56, 0xf8, 0x27, 0x00, 0x48, 0x44, 0x01, 0x78, 0xe2, 0x5d, + 0x91, 0x42, 0x08, 0xd0, 0x02, 0x92, 0x01, 0x91, 0x00, 0x90, 0x3b, 0x46, + 0x00, 0xf0, 0x2a, 0xf8, 0xd6, 0xf7, 0x62, 0xfe, 0x6d, 0x1c, 0x7f, 0x1c, + 0x08, 0x2f, 0xec, 0xd3, 0x5f, 0xf0, 0x00, 0x06, 0x0f, 0xf2, 0x9c, 0x07, + 0x23, 0xa4, 0x54, 0xf8, 0x26, 0x00, 0x40, 0x44, 0x01, 0x68, 0x57, 0xf8, + 0x26, 0x20, 0x91, 0x42, 0x08, 0xd0, 0x02, 0x92, 0x01, 0x91, 0x00, 0x90, + 0x33, 0x46, 0x00, 0xf0, 0x11, 0xf8, 0xd6, 0xf7, 0x49, 0xfe, 0x6d, 0x1c, + 0x76, 0x1c, 0x03, 0x2e, 0xeb, 0xd3, 0xe8, 0xb2, 0x04, 0xb0, 0xbd, 0xe8, + 0xf0, 0x87, 0x00, 0x00, 0xa0, 0x95, 0x04, 0x02, 0x00, 0x00, 0x0c, 0x60, + 0x00, 0x00, 0x0d, 0x60, 0x52, 0x46, 0x02, 0x21, 0x01, 0x20, 0xd6, 0xf7, + 0x4c, 0xbe, 0x00, 0x00, 0x76, 0x65, 0x72, 0x5b, 0x25, 0x64, 0x5d, 0x3a, + 0x20, 0x30, 0x78, 0x25, 0x58, 0x3a, 0x20, 0x25, 0x58, 0x20, 0x21, 0x3d, + 0x20, 0x25, 0x58, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, + 0xc9, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x12, 0x80, 0x80, 0x40, 0x39, + 0x3c, 0x0d, 0x00, 0x00, 0x70, 0x0d, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, + 0x88, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x90, 0xf8, 0x00, 0x00, + 0xf8, 0xb5, 0x0d, 0x46, 0x1b, 0xa6, 0x06, 0xeb, 0xc5, 0x01, 0x04, 0x46, + 0x4f, 0x68, 0x38, 0x46, 0xe0, 0xf7, 0x60, 0xfe, 0x01, 0x21, 0x01, 0xfa, + 0x04, 0xf4, 0x44, 0xea, 0x00, 0x01, 0x38, 0x46, 0xe0, 0xf7, 0x2d, 0xfe, + 0x38, 0x46, 0xe0, 0xf7, 0x99, 0xfd, 0x56, 0xf8, 0x35, 0x10, 0x38, 0x46, + 0xe0, 0xf7, 0xff, 0xfd, 0x38, 0x46, 0xbd, 0xe8, 0xf2, 0x40, 0xe0, 0xf7, + 0xe0, 0xbd, 0x00, 0x00, 0x00, 0x20, 0x01, 0xe0, 0x01, 0x20, 0x00, 0xbf, + 0x70, 0xb5, 0x04, 0x46, 0x09, 0xa1, 0x01, 0xeb, 0xc4, 0x03, 0x00, 0x26, + 0x58, 0x68, 0xe0, 0xf7, 0x8c, 0xfd, 0x05, 0x46, 0x25, 0xfa, 0x06, 0xf0, + 0xc0, 0x07, 0x03, 0xd5, 0x21, 0x46, 0x30, 0x46, 0xfa, 0xf7, 0x9a, 0xf8, + 0x76, 0x1c, 0x08, 0x2e, 0xf4, 0xd3, 0x70, 0xbd, 0x06, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x70, 0xb5, 0x04, 0x46, 0x00, 0x25, 0x89, 0x4e, 0x24, 0xfa, 0x05, 0xf0, + 0xc0, 0x07, 0x09, 0xd5, 0x28, 0x46, 0xd6, 0xf7, 0xd1, 0xfc, 0xff, 0x28, + 0x04, 0xd0, 0x14, 0x21, 0x48, 0x43, 0x30, 0x44, 0xda, 0xf7, 0x90, 0xff, + 0x6d, 0x1c, 0x08, 0x2d, 0xee, 0xd3, 0x70, 0xbd, 0x2d, 0xe9, 0xf1, 0x4f, + 0x82, 0xb0, 0x00, 0x20, 0x01, 0x90, 0x02, 0x9c, 0xdf, 0xf8, 0xf4, 0x81, + 0x08, 0xf1, 0x05, 0x00, 0x00, 0x90, 0x4f, 0xf0, 0x01, 0x0a, 0x00, 0x2c, + 0x6d, 0xd0, 0x00, 0x99, 0x09, 0x78, 0x00, 0x20, 0x04, 0x29, 0x28, 0xbf, + 0x04, 0x21, 0x81, 0x46, 0x00, 0x22, 0x0a, 0xfa, 0x02, 0xf3, 0x1c, 0x42, + 0x04, 0xd0, 0x40, 0x1c, 0x88, 0x42, 0x43, 0xea, 0x09, 0x09, 0x02, 0xd2, + 0x52, 0x1c, 0x08, 0x2a, 0xf3, 0xd3, 0x00, 0x26, 0x00, 0x27, 0x0a, 0xfa, + 0x07, 0xf5, 0x19, 0xea, 0x05, 0x0f, 0x21, 0xd0, 0xf8, 0xb2, 0xd6, 0xf7, + 0x99, 0xfc, 0xff, 0x28, 0x1c, 0xd0, 0x14, 0x22, 0x67, 0x49, 0x50, 0x43, + 0x01, 0xeb, 0x00, 0x0b, 0x58, 0x46, 0xf0, 0xf7, 0x86, 0xfe, 0x41, 0x46, + 0xf8, 0xb2, 0xf9, 0xf7, 0x22, 0xfa, 0x31, 0x46, 0x58, 0x46, 0x00, 0xf0, + 0x73, 0xfb, 0xf8, 0xb2, 0x00, 0xf0, 0xa8, 0xfa, 0x06, 0x46, 0x31, 0x46, + 0x58, 0x46, 0x00, 0xf0, 0x6b, 0xfb, 0x1e, 0xb1, 0xed, 0x43, 0x05, 0xea, + 0x09, 0x09, 0x2c, 0x40, 0x7f, 0x1c, 0xf8, 0xb2, 0x08, 0x28, 0xd4, 0xdb, + 0xb9, 0xf1, 0x00, 0x0f, 0xb9, 0xd0, 0x00, 0x25, 0x14, 0x26, 0x55, 0x4f, + 0x0a, 0xfa, 0x05, 0xfb, 0x19, 0xea, 0x0b, 0x0f, 0x1c, 0xd0, 0xe8, 0xb2, + 0xd6, 0xf7, 0x68, 0xfc, 0xff, 0x28, 0x17, 0xd0, 0x70, 0x43, 0x39, 0x18, + 0x08, 0x68, 0x18, 0xb9, 0x42, 0x46, 0xe8, 0xb2, 0x00, 0xf0, 0x90, 0xfa, + 0x00, 0x28, 0x02, 0xbf, 0x00, 0x98, 0xc1, 0x7f, 0x01, 0x29, 0x04, 0xd1, + 0x08, 0xf1, 0x24, 0x01, 0xe8, 0xb2, 0x00, 0xf0, 0xb7, 0xfa, 0x6f, 0xea, + 0x0b, 0x00, 0x00, 0xea, 0x09, 0x09, 0x04, 0x40, 0x6d, 0x1c, 0xe8, 0xb2, + 0x08, 0x28, 0xd9, 0xdb, 0xd2, 0xe7, 0x02, 0x9d, 0xdd, 0xf8, 0x04, 0x80, + 0x3f, 0x4f, 0x14, 0x26, 0x25, 0xfa, 0x04, 0xf0, 0xc0, 0x07, 0x0d, 0xd5, + 0x20, 0x46, 0xd6, 0xf7, 0x3d, 0xfc, 0x70, 0x43, 0x38, 0x44, 0xd0, 0xf8, + 0x00, 0x90, 0x49, 0x46, 0xf0, 0xf7, 0x31, 0xfe, 0xb8, 0xf1, 0x00, 0x0f, + 0x08, 0xbf, 0xc8, 0x46, 0x64, 0x1c, 0x08, 0x2c, 0xea, 0xd3, 0x40, 0x46, + 0xbd, 0xe8, 0xfe, 0x8f, 0x80, 0xb5, 0x00, 0xf0, 0x09, 0xf8, 0xe0, 0xf7, + 0xea, 0xfb, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x03, 0xf8, 0xe0, 0xf7, + 0xcf, 0xfb, 0x02, 0xbd, 0x00, 0x92, 0x0b, 0x46, 0x02, 0x46, 0x40, 0x21, + 0x2b, 0x48, 0x70, 0x47, 0xf8, 0xb5, 0x0c, 0x46, 0x16, 0x46, 0x1f, 0x46, + 0xf0, 0xf7, 0x22, 0xfe, 0xd6, 0xf7, 0x12, 0xfc, 0x00, 0x25, 0xff, 0x28, + 0x13, 0xd0, 0x67, 0xb9, 0x31, 0x68, 0x14, 0x29, 0x0c, 0xd3, 0x14, 0x22, + 0x21, 0x4b, 0x50, 0x43, 0x19, 0x18, 0x20, 0x46, 0xc7, 0xf7, 0xbe, 0xff, + 0x14, 0x20, 0x30, 0x60, 0x07, 0xe0, 0x4f, 0xf6, 0x2a, 0x75, 0x04, 0xe0, + 0x4f, 0xf6, 0x26, 0x75, 0x01, 0xe0, 0x4f, 0xf6, 0x52, 0x75, 0x28, 0x46, + 0xf2, 0xbd, 0x70, 0xb5, 0x0c, 0x46, 0x15, 0x46, 0xf0, 0xf7, 0x00, 0xfe, + 0x06, 0x46, 0xd6, 0xf7, 0xef, 0xfb, 0xff, 0x28, 0x02, 0xd1, 0x4f, 0xf6, + 0x2b, 0x70, 0x70, 0xbd, 0x2b, 0x46, 0x22, 0x46, 0x31, 0x46, 0xbd, 0xe8, + 0x70, 0x40, 0x10, 0x48, 0x00, 0xf0, 0xa7, 0xba, 0x70, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x16, 0x46, 0xd6, 0xf7, 0xdc, 0xfb, 0xff, 0x28, 0x12, 0xd0, + 0x14, 0x21, 0x09, 0x4a, 0x48, 0x43, 0x11, 0x18, 0x08, 0x69, 0x60, 0xb1, + 0x2d, 0xb1, 0x31, 0x46, 0xe0, 0xb2, 0xbd, 0xe8, 0x70, 0x40, 0x00, 0xf0, + 0x23, 0xba, 0xe0, 0xb2, 0xbd, 0xe8, 0x70, 0x40, 0x03, 0x49, 0x00, 0xf0, + 0x2b, 0xba, 0x70, 0xbd, 0x44, 0x75, 0x03, 0x21, 0xac, 0x55, 0x00, 0x21, + 0xd0, 0x55, 0x00, 0x21, 0xf8, 0xb5, 0x0d, 0x46, 0x26, 0xa6, 0x06, 0xeb, + 0xc5, 0x01, 0x04, 0x46, 0x4f, 0x68, 0x38, 0x46, 0xe0, 0xf7, 0x02, 0xfd, + 0x01, 0x21, 0x01, 0xfa, 0x04, 0xf4, 0x44, 0xea, 0x00, 0x01, 0x38, 0x46, + 0xe0, 0xf7, 0xcf, 0xfc, 0x38, 0x46, 0xe0, 0xf7, 0x3b, 0xfc, 0x56, 0xf8, + 0x35, 0x10, 0x38, 0x46, 0xe0, 0xf7, 0xa1, 0xfc, 0x38, 0x46, 0xbd, 0xe8, + 0xf2, 0x40, 0xe0, 0xf7, 0x82, 0xbc, 0x00, 0x00, 0x00, 0x20, 0x05, 0xe0, + 0x01, 0x20, 0x03, 0xe0, 0x02, 0x20, 0x01, 0xe0, 0x03, 0x20, 0x00, 0xbf, + 0x70, 0xb5, 0x04, 0x46, 0x12, 0xa1, 0x01, 0xeb, 0xc4, 0x03, 0x00, 0x26, + 0x58, 0x68, 0xe0, 0xf7, 0x2a, 0xfc, 0x05, 0x46, 0x25, 0xfa, 0x06, 0xf0, + 0xc0, 0x07, 0x03, 0xd5, 0x21, 0x46, 0x30, 0x46, 0xfa, 0xf7, 0x17, 0xfa, + 0x76, 0x1c, 0x01, 0x2e, 0xf4, 0xd9, 0x70, 0xbd, 0x70, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x00, 0x26, 0x25, 0xfa, 0x06, 0xf0, 0xc0, 0x07, 0x03, 0xd5, + 0xf1, 0xb2, 0x20, 0x46, 0xfa, 0xf7, 0x24, 0xfa, 0x76, 0x1c, 0xf0, 0xb2, + 0x04, 0x28, 0xf3, 0xd3, 0x70, 0xbd, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x52, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x55, 0x00, 0x00, 0x00, 0x20, 0x30, 0x01, 0x75, 0x42, 0x75, 0x00, 0x68, + 0xc9, 0xf7, 0xff, 0xbb, 0x10, 0xb5, 0x00, 0xf1, 0x20, 0x04, 0x20, 0x68, + 0xc9, 0xf7, 0x3d, 0xfc, 0xa0, 0x75, 0x10, 0xbd, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x78, 0x00, 0xf0, 0x0d, 0xf8, 0x01, 0x70, + 0x07, 0xe0, 0x30, 0xb5, 0xef, 0xf3, 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, + 0x00, 0xf0, 0x04, 0xf8, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, 0x11, 0x40, 0x29, 0x43, 0x70, 0x47, + 0xf8, 0xb5, 0x04, 0x46, 0x5e, 0x48, 0x50, 0xf8, 0x24, 0x70, 0x0d, 0x46, + 0x85, 0xf0, 0x01, 0x06, 0x33, 0x46, 0x02, 0x22, 0x01, 0x21, 0x07, 0xf1, + 0x0f, 0x00, 0xff, 0xf7, 0xd7, 0xff, 0x28, 0x00, 0x11, 0xd0, 0x33, 0x46, + 0x40, 0x22, 0x06, 0x21, 0x07, 0xf1, 0x33, 0x00, 0xff, 0xf7, 0xce, 0xff, + 0x2b, 0x46, 0x54, 0x48, 0x50, 0xf8, 0x24, 0x00, 0x01, 0xb0, 0xbd, 0xe8, + 0xf0, 0x40, 0x01, 0x22, 0x00, 0x21, 0x18, 0x30, 0xcb, 0xe7, 0xf1, 0xbd, + 0x50, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x74, 0x30, 0x00, 0x68, 0x00, 0x0e, + 0x00, 0xf0, 0x0f, 0x00, 0x70, 0x47, 0x38, 0xb5, 0x0c, 0x00, 0x14, 0xbf, + 0x35, 0x21, 0x36, 0x21, 0x01, 0x22, 0xe1, 0xf7, 0x98, 0xff, 0x05, 0x46, + 0x14, 0xb1, 0x01, 0x20, 0xe0, 0xf7, 0xca, 0xfd, 0x28, 0x46, 0x32, 0xbd, + 0x38, 0xb5, 0x45, 0x4d, 0x04, 0x46, 0x55, 0xf8, 0x24, 0x00, 0x00, 0xf0, + 0x11, 0xf8, 0x43, 0x48, 0x50, 0xf8, 0x24, 0x00, 0x00, 0xf0, 0x0c, 0xf8, + 0x3d, 0x48, 0x50, 0xf8, 0x24, 0x00, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, + 0x5a, 0x23, 0xff, 0x22, 0x00, 0x21, 0x00, 0xf2, 0xff, 0x30, 0x91, 0xe7, + 0x5a, 0x23, 0xff, 0x22, 0x00, 0x21, 0x00, 0xf2, 0xff, 0x30, 0x8b, 0xe7, + 0x2d, 0xe9, 0xff, 0x41, 0x04, 0x46, 0x35, 0x48, 0x0f, 0xf2, 0xe4, 0x08, + 0x00, 0xf0, 0x38, 0xf8, 0x02, 0xae, 0x08, 0x78, 0x8d, 0xf8, 0x08, 0x00, + 0x00, 0x25, 0x31, 0x48, 0x00, 0xf0, 0x30, 0xf8, 0x00, 0x27, 0x08, 0x78, + 0x70, 0x70, 0x2b, 0x48, 0x00, 0xf0, 0x2a, 0xf8, 0x08, 0x78, 0xb0, 0x70, + 0xf0, 0x5d, 0x5a, 0x28, 0x0b, 0xd0, 0x5a, 0x22, 0x01, 0x92, 0x00, 0x90, + 0x23, 0x46, 0x42, 0x46, 0x04, 0x21, 0x01, 0x20, 0xd6, 0xf7, 0xb9, 0xfb, + 0xd6, 0xf7, 0xa0, 0xfb, 0x6d, 0x1c, 0x7f, 0x1c, 0x03, 0x2f, 0xed, 0xd3, + 0x20, 0x48, 0x50, 0xf8, 0x24, 0x10, 0x08, 0x68, 0x21, 0x49, 0x88, 0x42, + 0x0a, 0xd0, 0x01, 0x91, 0x00, 0x90, 0x23, 0x46, 0x29, 0xa2, 0x04, 0x21, + 0x01, 0x20, 0xd6, 0xf7, 0xa4, 0xfb, 0xd6, 0xf7, 0x8b, 0xfb, 0x6d, 0x1c, + 0xe8, 0xb2, 0x04, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, 0x50, 0xf8, 0x24, 0x10, + 0x01, 0xf2, 0xff, 0x31, 0x70, 0x47, 0x70, 0xb5, 0x16, 0x4a, 0x52, 0xf8, + 0x20, 0x50, 0x0c, 0x46, 0x28, 0x46, 0xe1, 0xf7, 0x34, 0xff, 0x06, 0x46, + 0x21, 0x46, 0x28, 0x46, 0xe1, 0xf7, 0x41, 0xff, 0x30, 0x46, 0x70, 0xbd, + 0x10, 0xb5, 0x10, 0x4c, 0x54, 0xf8, 0x20, 0x00, 0xbd, 0xe8, 0x10, 0x40, + 0x00, 0x23, 0x4f, 0xf0, 0xff, 0x32, 0x00, 0x21, 0x24, 0x30, 0x34, 0xe7, + 0x0a, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x24, 0x30, 0x00, 0x68, 0x70, 0x47, + 0x20, 0x99, 0x04, 0x02, 0xc0, 0x98, 0x04, 0x02, 0xe0, 0x95, 0x04, 0x02, + 0x00, 0x9a, 0x04, 0x02, 0x00, 0x99, 0x04, 0x02, 0xc0, 0x95, 0x04, 0x02, + 0xfe, 0xca, 0xad, 0xab, 0xa0, 0x99, 0x04, 0x02, 0xc0, 0x99, 0x04, 0x02, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x2c, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, + 0x20, 0x76, 0x65, 0x72, 0x20, 0x64, 0x38, 0x3a, 0x20, 0x25, 0x58, 0x20, + 0x21, 0x3d, 0x20, 0x25, 0x58, 0x0a, 0x00, 0x00, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x2c, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x72, + 0x20, 0x64, 0x33, 0x32, 0x3a, 0x20, 0x25, 0x58, 0x20, 0x21, 0x3d, 0x20, + 0x25, 0x58, 0x0a, 0x00, 0xf8, 0xb5, 0x0d, 0x46, 0x26, 0xa6, 0x06, 0xeb, + 0xc5, 0x01, 0x04, 0x46, 0x4f, 0x68, 0x38, 0x46, 0xe0, 0xf7, 0x88, 0xfb, + 0x01, 0x21, 0x01, 0xfa, 0x04, 0xf4, 0x44, 0xea, 0x00, 0x01, 0x38, 0x46, + 0xe0, 0xf7, 0x55, 0xfb, 0x38, 0x46, 0xe0, 0xf7, 0xc1, 0xfa, 0x56, 0xf8, + 0x35, 0x10, 0x38, 0x46, 0xe0, 0xf7, 0x27, 0xfb, 0x38, 0x46, 0xbd, 0xe8, + 0xf2, 0x40, 0xe0, 0xf7, 0x08, 0xbb, 0x00, 0x00, 0x00, 0x20, 0x05, 0xe0, + 0x01, 0x20, 0x03, 0xe0, 0x02, 0x20, 0x01, 0xe0, 0x03, 0x20, 0x00, 0xbf, + 0x70, 0xb5, 0x04, 0x46, 0x12, 0xa1, 0x01, 0xeb, 0xc4, 0x03, 0x00, 0x26, + 0x58, 0x68, 0xe0, 0xf7, 0xb0, 0xfa, 0x05, 0x46, 0x25, 0xfa, 0x06, 0xf0, + 0xc0, 0x07, 0x03, 0xd5, 0x21, 0x46, 0x30, 0x46, 0xfa, 0xf7, 0x69, 0xfb, + 0x76, 0x1c, 0x08, 0x2e, 0xf4, 0xd3, 0x70, 0xbd, 0x70, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x00, 0x26, 0x25, 0xfa, 0x06, 0xf0, 0xc0, 0x07, 0x03, 0xd5, + 0xf1, 0xb2, 0x20, 0x46, 0xfa, 0xf7, 0x7f, 0xfb, 0x76, 0x1c, 0xf0, 0xb2, + 0x04, 0x28, 0xf3, 0xd3, 0x70, 0xbd, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x80, 0xb5, 0xaf, 0xf3, 0x00, 0x80, 0x02, 0x4a, + 0x11, 0x00, 0x18, 0x20, 0xab, 0xbe, 0xfb, 0xe7, 0x26, 0x00, 0x02, 0x00, + 0x38, 0xb5, 0x05, 0x46, 0x00, 0x23, 0x00, 0x22, 0x01, 0x21, 0xe2, 0xf7, + 0xe5, 0xfd, 0x04, 0x00, 0x04, 0xbf, 0x28, 0x46, 0xf9, 0xf7, 0x07, 0xf8, + 0x20, 0x46, 0x32, 0xbd, 0xf8, 0xb5, 0x0e, 0x46, 0x05, 0x46, 0x17, 0x46, + 0x4f, 0xf4, 0x7a, 0x71, 0x00, 0xf0, 0x4f, 0xf8, 0x00, 0xf0, 0x16, 0xf8, + 0x00, 0x2c, 0x04, 0xbf, 0x97, 0xf8, 0x3c, 0x00, 0x01, 0x28, 0x05, 0xd1, + 0x39, 0x46, 0x28, 0x46, 0x00, 0xf0, 0xac, 0xf8, 0x00, 0xf0, 0x0a, 0xf8, + 0x00, 0x23, 0x00, 0x22, 0x01, 0x21, 0x28, 0x46, 0xe2, 0xf7, 0xcb, 0xfd, + 0x04, 0xb9, 0x04, 0x46, 0x20, 0x46, 0xf2, 0xbd, 0x04, 0x46, 0x21, 0x46, + 0x30, 0x46, 0x95, 0xe0, 0x38, 0xb5, 0x01, 0x25, 0x85, 0x40, 0x01, 0xfa, + 0x00, 0xf4, 0xe9, 0xb2, 0xe0, 0xb2, 0x00, 0xf0, 0x3e, 0xf8, 0xe9, 0xb2, + 0xe0, 0xb2, 0xbd, 0xe8, 0x34, 0x40, 0x49, 0xe0, 0xf8, 0xb5, 0x04, 0x46, + 0x01, 0x26, 0x0d, 0x46, 0xa6, 0x40, 0x00, 0x27, 0xf0, 0xb2, 0xf8, 0x40, + 0xc0, 0x07, 0x08, 0xd5, 0x29, 0x46, 0xf8, 0xb2, 0xf9, 0xf7, 0x14, 0xf8, + 0x05, 0xf1, 0x10, 0x01, 0xf8, 0xb2, 0xf9, 0xf7, 0x50, 0xf8, 0x7f, 0x1c, + 0xf8, 0xb2, 0x08, 0x28, 0xee, 0xdb, 0x2a, 0x78, 0xa2, 0x40, 0xf1, 0xb2, + 0xd0, 0xb2, 0x00, 0xf0, 0x1c, 0xf8, 0x28, 0x7c, 0x00, 0xfa, 0x04, 0xf4, + 0xf1, 0xb2, 0xe0, 0xb2, 0xbd, 0xe8, 0xf4, 0x40, 0x24, 0xe0, 0xf8, 0xb5, + 0x04, 0x46, 0x0d, 0x46, 0xe0, 0xf7, 0xc6, 0xf8, 0x00, 0x26, 0x07, 0x46, + 0x20, 0x46, 0xf8, 0xf7, 0xb8, 0xff, 0x30, 0xb9, 0x38, 0x46, 0xe0, 0xf7, + 0xf1, 0xf8, 0xa8, 0x42, 0xf6, 0xd3, 0x4f, 0xf4, 0x81, 0x76, 0x30, 0x46, + 0xf2, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x00, 0x26, 0x25, 0xfa, + 0x06, 0xf0, 0xc2, 0x07, 0x03, 0xd5, 0x00, 0xf0, 0x18, 0xf8, 0xf8, 0xf7, + 0xc5, 0xff, 0x76, 0x1c, 0xf2, 0xb2, 0x08, 0x2a, 0xf3, 0xdb, 0x70, 0xbd, + 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x00, 0x26, 0x25, 0xfa, 0x06, 0xf0, + 0xc2, 0x07, 0x03, 0xd5, 0x00, 0xf0, 0x07, 0xf8, 0xf8, 0xf7, 0xc0, 0xff, + 0x76, 0x1c, 0xf2, 0xb2, 0x08, 0x2a, 0xf3, 0xdb, 0x70, 0xbd, 0x24, 0xfa, + 0x06, 0xf1, 0x01, 0xf0, 0x01, 0x01, 0xf0, 0xb2, 0x70, 0x47, 0x70, 0xb5, + 0x04, 0x46, 0x18, 0x78, 0x0d, 0x46, 0x00, 0x26, 0x12, 0xb1, 0x01, 0x2a, + 0x0d, 0xd0, 0x19, 0xe0, 0x08, 0xb9, 0x00, 0x21, 0x05, 0xe0, 0x04, 0xf1, + 0x24, 0x01, 0xe8, 0xb2, 0xf8, 0xf7, 0xb0, 0xff, 0x01, 0x21, 0xe8, 0xb2, + 0xf8, 0xf7, 0x94, 0xff, 0x0e, 0xe0, 0x08, 0xb9, 0x00, 0x21, 0x05, 0xe0, + 0x04, 0xf1, 0x34, 0x01, 0xe8, 0xb2, 0xf8, 0xf7, 0xe4, 0xff, 0x01, 0x21, + 0xe8, 0xb2, 0xf8, 0xf7, 0x93, 0xff, 0x01, 0xe0, 0x4f, 0xf4, 0x82, 0x76, + 0x30, 0x46, 0x70, 0xbd, 0x01, 0x60, 0x41, 0x68, 0x19, 0x31, 0x41, 0x60, + 0x70, 0x47, 0x00, 0x00, 0x30, 0xb5, 0x85, 0xb0, 0x05, 0x46, 0x0c, 0x46, + 0x0c, 0x22, 0x00, 0x21, 0x02, 0xa8, 0xc6, 0xf7, 0x93, 0xff, 0x00, 0xbf, + 0x21, 0xa0, 0x02, 0x95, 0x69, 0x46, 0x90, 0xec, 0x02, 0x0a, 0x81, 0xec, + 0x02, 0x0a, 0x02, 0x21, 0x4f, 0xf4, 0x80, 0x72, 0x8d, 0xf8, 0x0c, 0x10, + 0xad, 0xf8, 0x0e, 0x20, 0xa0, 0x68, 0x04, 0x90, 0x02, 0xa8, 0xc8, 0xf7, + 0x4d, 0xfb, 0x04, 0x00, 0x13, 0xd1, 0x4f, 0xf4, 0x7a, 0x71, 0x28, 0x46, + 0xc8, 0xf7, 0xc2, 0xfb, 0x18, 0xb1, 0x02, 0x28, 0x09, 0xd0, 0x08, 0xd3, + 0x09, 0xe0, 0x69, 0x46, 0x02, 0xa8, 0xc8, 0xf7, 0xbd, 0xfb, 0x20, 0xb1, + 0x40, 0xf2, 0x01, 0x14, 0x01, 0xe0, 0x40, 0xf2, 0x03, 0x14, 0x9d, 0xed, + 0x00, 0x1a, 0x9d, 0xed, 0x00, 0x0a, 0xdd, 0xed, 0x01, 0x0a, 0x21, 0xee, + 0x00, 0x0a, 0x00, 0xee, 0xa0, 0x0a, 0xc7, 0xf7, 0xcd, 0xfd, 0xdf, 0xed, + 0x06, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xa8, 0xbf, + 0x40, 0xf2, 0x05, 0x14, 0x20, 0x46, 0x05, 0xb0, 0x30, 0xbd, 0x00, 0x00, + 0xff, 0xff, 0xa7, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2d, 0xe9, 0xf0, 0x47, 0x08, 0x9e, 0x00, 0x27, 0x00, 0x24, 0x1c, 0xe0, + 0x0e, 0xeb, 0x07, 0x08, 0x06, 0xeb, 0x88, 0x08, 0x0e, 0xf1, 0x01, 0x0e, + 0xc8, 0xed, 0x00, 0x0a, 0xe6, 0x45, 0xf5, 0xd3, 0xac, 0xf1, 0x01, 0x0e, + 0x07, 0xeb, 0x5e, 0x08, 0x0a, 0xeb, 0x85, 0x0e, 0x06, 0xeb, 0x88, 0x09, + 0xde, 0xed, 0x00, 0x0a, 0x6d, 0x1c, 0x60, 0xee, 0x20, 0x0a, 0x01, 0x2d, + 0xc9, 0xed, 0x00, 0x0a, 0x67, 0x44, 0x05, 0xd9, 0x64, 0x1c, 0x9c, 0x42, + 0x11, 0xd2, 0x00, 0x25, 0x01, 0xeb, 0xc4, 0x0a, 0x02, 0xeb, 0xc4, 0x0e, + 0x00, 0xeb, 0x44, 0x0c, 0x0e, 0xeb, 0x85, 0x08, 0x1c, 0xf8, 0x05, 0xc0, + 0xd8, 0xed, 0x00, 0x0a, 0x60, 0xee, 0x20, 0x0a, 0x4f, 0xf0, 0x00, 0x0e, + 0xd6, 0xe7, 0xbd, 0xe8, 0xf0, 0x87, 0x80, 0xed, 0x00, 0x0a, 0x80, 0xed, + 0x01, 0x0a, 0x20, 0xee, 0x01, 0x0a, 0x80, 0xed, 0x04, 0x0a, 0x80, 0xed, + 0x05, 0x0a, 0x20, 0xee, 0x81, 0x0a, 0xc0, 0xed, 0x02, 0x0a, 0xc0, 0xed, + 0x03, 0x0a, 0x80, 0xed, 0x06, 0x0a, 0x80, 0xed, 0x07, 0x0a, 0x70, 0x47, + 0x38, 0xb5, 0x2d, 0xed, 0x04, 0x8b, 0x04, 0x46, 0xb0, 0xee, 0x40, 0x9a, + 0xb0, 0xee, 0x60, 0x8a, 0xf0, 0xee, 0x41, 0x8a, 0x00, 0x25, 0xe8, 0x1f, + 0xdf, 0xed, 0x7b, 0x0a, 0x00, 0xee, 0x10, 0x0a, 0x69, 0xee, 0x20, 0x0a, + 0xb8, 0xee, 0xc0, 0x0a, 0x20, 0xee, 0x80, 0x0a, 0xc8, 0xf7, 0xbf, 0xfb, + 0x01, 0xf0, 0x2c, 0xfb, 0x04, 0xeb, 0xc5, 0x00, 0x6d, 0x1c, 0x10, 0x2d, + 0x80, 0xec, 0x02, 0x0a, 0xe9, 0xd3, 0x04, 0xf1, 0x80, 0x00, 0xb7, 0xee, + 0x00, 0x0a, 0x80, 0xed, 0x00, 0x0a, 0xc0, 0xed, 0x01, 0x8a, 0x80, 0xed, + 0x02, 0x0a, 0x80, 0xed, 0x03, 0x8a, 0x80, 0xed, 0x04, 0x9a, 0xdc, 0xe1, + 0x00, 0xeb, 0xc1, 0x00, 0x00, 0xf1, 0x38, 0x01, 0x91, 0xec, 0x02, 0x0a, + 0x70, 0x47, 0x00, 0x00, 0xf0, 0xb5, 0xb0, 0xee, 0x40, 0x1a, 0x05, 0x9c, + 0xf7, 0xee, 0x00, 0x1a, 0x9f, 0xed, 0xd9, 0x0a, 0x00, 0x25, 0xb0, 0xee, + 0x61, 0x2a, 0x00, 0x26, 0x1e, 0xe0, 0x04, 0xfb, 0x06, 0xc7, 0xd7, 0x5d, + 0xa7, 0xf1, 0x01, 0x0e, 0x0e, 0xeb, 0xde, 0x7e, 0x11, 0xeb, 0x6e, 0x0e, + 0x0a, 0xd4, 0xbe, 0x45, 0x08, 0xda, 0xae, 0x44, 0x00, 0xeb, 0x8e, 0x0e, + 0x22, 0xee, 0x22, 0x3a, 0xde, 0xed, 0x00, 0x3a, 0x03, 0xee, 0x23, 0x0a, + 0x7d, 0x19, 0x62, 0xee, 0xa0, 0x2a, 0x0c, 0xf1, 0x01, 0x0c, 0xa4, 0x45, + 0xe3, 0xd3, 0x22, 0xee, 0x01, 0x2a, 0x76, 0x1c, 0x9e, 0x42, 0x04, 0xd2, + 0xf0, 0xee, 0x61, 0x2a, 0x4f, 0xf0, 0x00, 0x0c, 0xf3, 0xe7, 0xf0, 0xbd, + 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, 0x88, 0x46, 0x82, 0xb0, + 0x98, 0xf8, 0x00, 0xa0, 0x0e, 0x9f, 0x05, 0x46, 0x91, 0x46, 0x1e, 0x46, + 0x00, 0xf0, 0xf7, 0xf9, 0xaa, 0xf1, 0x01, 0x0b, 0x00, 0x24, 0x10, 0xe0, + 0x00, 0x96, 0xf0, 0xee, 0x68, 0x0a, 0xb0, 0xee, 0x48, 0x0a, 0x4b, 0x46, + 0x42, 0x46, 0xa4, 0xeb, 0x5b, 0x01, 0x28, 0x46, 0xff, 0xf7, 0xae, 0xff, + 0x07, 0xeb, 0x84, 0x00, 0x64, 0x1c, 0x80, 0xed, 0x00, 0x0a, 0x54, 0x45, + 0xec, 0xd3, 0x02, 0xb0, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf1, 0x8f, + 0x10, 0xb5, 0x04, 0x46, 0xc8, 0xf7, 0x44, 0xfb, 0x04, 0xf1, 0x08, 0x00, + 0x00, 0xf0, 0xba, 0xfe, 0x00, 0xf0, 0x22, 0xfa, 0x94, 0xec, 0x02, 0x0a, + 0xbd, 0xe8, 0x10, 0x40, 0xc8, 0xf7, 0xe5, 0xba, 0xf8, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x2d, 0xed, 0x02, 0x8b, 0x04, 0xf1, 0xb0, 0x07, 0xd5, 0xed, + 0x24, 0x0a, 0x97, 0xed, 0x0a, 0x0a, 0x9f, 0xed, 0x29, 0x1a, 0x20, 0xee, + 0x81, 0x1a, 0x16, 0x46, 0x21, 0xee, 0x00, 0x0a, 0xc8, 0xf7, 0x1d, 0xfb, + 0x01, 0xf0, 0x8a, 0xfa, 0x00, 0x2e, 0xd5, 0xf8, 0x90, 0x00, 0x00, 0xf0, + 0xb0, 0xf9, 0x1a, 0xd1, 0x38, 0x60, 0x20, 0x46, 0x95, 0xed, 0x24, 0x0a, + 0xff, 0xf7, 0xce, 0xff, 0x04, 0xf1, 0xb8, 0x00, 0x00, 0xf0, 0x3a, 0xf8, + 0x04, 0xf1, 0xb8, 0x00, 0x80, 0xec, 0x02, 0x0a, 0x95, 0xed, 0x24, 0x0a, + 0x04, 0xf1, 0x10, 0x00, 0xff, 0xf7, 0xc0, 0xff, 0x04, 0xf1, 0xc0, 0x00, + 0x00, 0xf0, 0x2c, 0xf8, 0x04, 0xf1, 0xc0, 0x00, 0x21, 0xe0, 0x78, 0x60, + 0x20, 0x46, 0x95, 0xed, 0x24, 0x0a, 0xb1, 0xee, 0x40, 0x0a, 0xff, 0xf7, + 0xb1, 0xff, 0xc6, 0xf7, 0x96, 0xfd, 0x04, 0xf1, 0xc8, 0x00, 0x00, 0xf0, + 0x1b, 0xf8, 0x04, 0xf1, 0xc8, 0x00, 0x80, 0xec, 0x02, 0x0a, 0x95, 0xed, + 0x24, 0x0a, 0xb1, 0xee, 0x40, 0x0a, 0x04, 0xf1, 0x10, 0x00, 0xff, 0xf7, + 0x9f, 0xff, 0xc6, 0xf7, 0x84, 0xfd, 0x04, 0xf1, 0xd0, 0x00, 0x00, 0xf0, + 0x09, 0xf8, 0x04, 0xf1, 0xd0, 0x00, 0x80, 0xec, 0x02, 0x0a, 0xbd, 0xec, + 0x02, 0x8b, 0xf1, 0xbd, 0xdb, 0x0f, 0xc9, 0xc0, 0xb0, 0xee, 0x48, 0x1a, + 0x80, 0xec, 0x02, 0x0a, 0xf0, 0xee, 0x68, 0x1a, 0xc8, 0xf7, 0xa3, 0xba, + 0x70, 0xb5, 0x05, 0x46, 0x0c, 0x46, 0x16, 0x46, 0x01, 0x20, 0x00, 0x21, + 0x1a, 0x46, 0xf7, 0xf7, 0x63, 0xf9, 0x2d, 0xed, 0x02, 0x8b, 0xc7, 0xf7, + 0xc3, 0xfd, 0x00, 0xee, 0x10, 0x0a, 0xb7, 0xee, 0x00, 0x8a, 0x88, 0xee, + 0x00, 0x0a, 0x00, 0x20, 0x0c, 0xe0, 0x05, 0xeb, 0x80, 0x01, 0x04, 0xeb, + 0x80, 0x02, 0xd1, 0xed, 0x00, 0x0a, 0xf8, 0xee, 0xe0, 0x0a, 0x60, 0xee, + 0x80, 0x0a, 0xc2, 0xed, 0x00, 0x0a, 0x40, 0x1c, 0xb0, 0x42, 0xf0, 0xd3, + 0xba, 0xe0, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x06, 0x8b, 0x82, 0xb0, + 0x17, 0x78, 0x0f, 0xf2, 0x70, 0x08, 0x12, 0x9e, 0x00, 0xf1, 0x84, 0x05, + 0x7c, 0x1e, 0x64, 0x08, 0x95, 0xed, 0x02, 0xaa, 0xd5, 0xed, 0x00, 0xaa, + 0x98, 0xec, 0x02, 0x9a, 0x64, 0x42, 0x00, 0x25, 0x80, 0x46, 0x8b, 0x46, + 0x92, 0x46, 0x99, 0x46, 0x1a, 0xe0, 0x21, 0x46, 0x40, 0x46, 0xff, 0xf7, + 0xdf, 0xfe, 0x00, 0xf0, 0x1e, 0xf9, 0x00, 0x96, 0xf0, 0xee, 0x6a, 0x0a, + 0xb0, 0xee, 0x4a, 0x0a, 0x4b, 0x46, 0x52, 0x46, 0x21, 0x46, 0x58, 0x46, + 0xff, 0xf7, 0xda, 0xfe, 0xc8, 0xf7, 0x7e, 0xfa, 0x00, 0xf0, 0x8a, 0xfb, + 0x00, 0xf0, 0xe0, 0xfd, 0x00, 0xf0, 0x02, 0xfe, 0x64, 0x1c, 0x6d, 0x1c, + 0xbd, 0x42, 0xe2, 0xd3, 0x02, 0xb0, 0x00, 0xf0, 0x3c, 0xfe, 0xbd, 0xec, + 0x06, 0x8b, 0xbd, 0xe8, 0xf1, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf7, 0x4f, 0x2d, 0xed, 0x06, 0x8b, + 0x82, 0xb0, 0x81, 0x46, 0x14, 0x9f, 0xdd, 0xf8, 0x54, 0x80, 0xdd, 0xf8, + 0x58, 0xb0, 0x00, 0xf0, 0xee, 0xf8, 0x9a, 0x46, 0x00, 0x20, 0x29, 0xe0, + 0x6a, 0x1e, 0xa4, 0xeb, 0x52, 0x01, 0x48, 0x46, 0xff, 0xf7, 0xa4, 0xfe, + 0x5f, 0xea, 0x0b, 0x00, 0x00, 0xf0, 0xd8, 0xfd, 0x03, 0xd0, 0xc6, 0xf7, + 0xea, 0xfc, 0x00, 0xf0, 0xd3, 0xfd, 0x2a, 0xee, 0x2a, 0x0a, 0xc8, 0xf7, + 0x45, 0xfa, 0x00, 0xf0, 0xdb, 0xf8, 0x00, 0xf0, 0x49, 0xfb, 0x08, 0xeb, + 0x87, 0x00, 0x64, 0x1c, 0x80, 0xed, 0x00, 0x0a, 0x07, 0xeb, 0x0a, 0x00, + 0x08, 0xeb, 0x80, 0x01, 0x7f, 0x1c, 0xc1, 0xed, 0x00, 0x0a, 0xac, 0x42, + 0xda, 0xd3, 0x76, 0x1c, 0x01, 0x2e, 0x0b, 0xd9, 0x00, 0x98, 0x40, 0x1c, + 0x00, 0x90, 0x0a, 0x99, 0x00, 0x98, 0x88, 0x42, 0x0f, 0xd2, 0x09, 0xeb, + 0x80, 0x01, 0x00, 0x26, 0x91, 0xed, 0x22, 0xaa, 0x09, 0xeb, 0x86, 0x00, + 0x00, 0x99, 0xd0, 0xed, 0x20, 0xaa, 0x09, 0x98, 0x06, 0xeb, 0x41, 0x02, + 0x00, 0x24, 0x85, 0x5c, 0xe3, 0xe7, 0x02, 0xb0, 0xbd, 0xec, 0x06, 0x8b, + 0xbd, 0xe8, 0xf7, 0x8f, 0x70, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x84, 0xb0, + 0x04, 0x46, 0x00, 0x20, 0x02, 0x90, 0x0d, 0x46, 0x00, 0x26, 0xb0, 0xee, + 0x41, 0x8a, 0xf0, 0xee, 0x61, 0x8a, 0x01, 0x95, 0x00, 0x96, 0x10, 0x23, + 0x02, 0x22, 0xdf, 0xf8, 0x0c, 0x1b, 0x20, 0x46, 0xff, 0xf7, 0x96, 0xff, + 0x0a, 0x20, 0x00, 0x90, 0x02, 0x96, 0x01, 0x95, 0x10, 0x23, 0x02, 0x22, + 0xdf, 0xf8, 0xf8, 0x1a, 0x00, 0xf0, 0x82, 0xf8, 0x20, 0x46, 0xff, 0xf7, + 0x89, 0xff, 0x04, 0xb0, 0xbd, 0xec, 0x02, 0x8b, 0x70, 0xbd, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0xb5, 0x2d, 0xed, 0x04, 0x8b, 0x00, 0xf0, + 0x78, 0xf8, 0x04, 0x46, 0x0d, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0xb0, 0xee, + 0x40, 0x9a, 0x00, 0xf0, 0x6b, 0xf8, 0xb0, 0xee, 0x60, 0x0a, 0x84, 0xed, + 0x00, 0x9a, 0xf1, 0xee, 0x40, 0x0a, 0xc4, 0xed, 0x01, 0x0a, 0x85, 0xed, + 0x00, 0x0a, 0x85, 0xed, 0x01, 0x9a, 0xbd, 0xec, 0x04, 0x8b, 0x31, 0xbd, + 0x10, 0xb5, 0x2d, 0xed, 0x08, 0x8b, 0xb0, 0xee, 0x40, 0x9a, 0x9f, 0xed, + 0xbb, 0x0a, 0x29, 0xee, 0x00, 0x0a, 0xb0, 0xee, 0x60, 0x8a, 0xf0, 0xee, + 0x41, 0x8a, 0xb0, 0xee, 0x61, 0xba, 0xf0, 0xee, 0x42, 0xba, 0x04, 0x46, + 0x20, 0xee, 0x22, 0x0a, 0xc8, 0xf7, 0xb1, 0xf9, 0x01, 0xf0, 0x1e, 0xf9, + 0x01, 0xf0, 0x94, 0xf8, 0xb0, 0xee, 0x4a, 0x1a, 0xf0, 0xee, 0x6a, 0x1a, + 0x01, 0xf0, 0xb6, 0xf8, 0x00, 0xf0, 0x3f, 0xf8, 0xb0, 0xee, 0x4a, 0x1a, + 0xf0, 0xee, 0x6a, 0x1a, 0x01, 0xf0, 0xa4, 0xf8, 0x01, 0xf0, 0x84, 0xf8, + 0x04, 0xf1, 0x20, 0x01, 0x20, 0x46, 0x00, 0xf0, 0x2d, 0xf8, 0xff, 0xf7, + 0xb3, 0xff, 0xb0, 0xee, 0x49, 0x0a, 0xc8, 0xf7, 0x99, 0xf9, 0x00, 0xf0, + 0x2f, 0xf8, 0x04, 0xf1, 0x28, 0x01, 0x04, 0xf1, 0x08, 0x00, 0xff, 0xf7, + 0xa7, 0xff, 0x04, 0xf1, 0x30, 0x01, 0x04, 0xf1, 0x10, 0x00, 0xb0, 0xee, + 0x4a, 0x0a, 0xf0, 0xee, 0x6a, 0x0a, 0xff, 0xf7, 0x9d, 0xff, 0xb0, 0xee, + 0x49, 0x0a, 0xc8, 0xf7, 0x83, 0xf9, 0x00, 0xf0, 0x65, 0xf8, 0xb0, 0xee, + 0x4a, 0x0a, 0xf0, 0xee, 0x6a, 0x0a, 0xc8, 0xf7, 0x4e, 0xf9, 0xbd, 0xec, + 0x08, 0x8b, 0x04, 0xf1, 0x38, 0x01, 0x04, 0xf1, 0x18, 0x00, 0xbd, 0xe8, + 0x10, 0x40, 0x87, 0xe7, 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, + 0x70, 0x47, 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, 0x60, 0x8a, 0x70, 0x47, + 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0xb0, 0xee, 0x48, 0x0a, + 0xf0, 0xee, 0x68, 0x0a, 0xc8, 0xf7, 0x31, 0xb9, 0x38, 0xb5, 0x04, 0x46, + 0x1d, 0xa0, 0xd2, 0xb2, 0x2d, 0xed, 0x04, 0x8b, 0xb0, 0xee, 0x40, 0x9a, + 0x01, 0x2a, 0xa6, 0xb0, 0x0d, 0x46, 0x90, 0xec, 0x02, 0x8a, 0x0c, 0xbf, + 0xb7, 0xee, 0x00, 0x0a, 0xbf, 0xee, 0x00, 0x0a, 0xc8, 0xf7, 0x43, 0xf9, + 0x00, 0xf0, 0x2c, 0xf8, 0xd5, 0xed, 0x23, 0x9a, 0x85, 0xed, 0x23, 0x9a, + 0x05, 0xa9, 0xff, 0xf7, 0xcf, 0xff, 0x28, 0x46, 0xff, 0xf7, 0x2a, 0xff, + 0xc5, 0xed, 0x23, 0x9a, 0x02, 0x20, 0x00, 0x90, 0x10, 0x23, 0x01, 0xaa, + 0x04, 0xf5, 0x8e, 0x71, 0x05, 0xa8, 0x01, 0xf0, 0x5b, 0xf9, 0x9d, 0xed, + 0x01, 0x0a, 0xdd, 0xed, 0x04, 0x0a, 0x30, 0xee, 0x20, 0x0a, 0x9f, 0xed, + 0x6e, 0x1a, 0x26, 0xb0, 0xb4, 0xee, 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0xbd, 0xec, 0x04, 0x8b, 0xb8, 0xbf, 0x9f, 0xed, 0x6a, 0x0a, 0x31, 0xbd, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xee, 0x40, 0x1a, + 0xf0, 0xee, 0x60, 0x1a, 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x46, + 0x2d, 0xed, 0x02, 0x8b, 0x94, 0xed, 0x13, 0x0a, 0xc8, 0xf7, 0x0e, 0xf9, + 0xdf, 0xf8, 0x28, 0x09, 0x00, 0xf0, 0x84, 0xfc, 0xff, 0xf7, 0x9b, 0xff, + 0x94, 0xed, 0x12, 0x0a, 0xc8, 0xf7, 0x04, 0xf9, 0x00, 0xf0, 0x4e, 0xfc, + 0x94, 0xf8, 0x5d, 0x00, 0x01, 0x28, 0x08, 0xbf, 0xc6, 0xf7, 0x9b, 0xfb, + 0xc6, 0xf7, 0xa2, 0xfb, 0xdf, 0xed, 0x56, 0x0a, 0x80, 0xee, 0x20, 0x0a, + 0x94, 0xed, 0x16, 0x1a, 0xd4, 0xed, 0x00, 0x1a, 0x80, 0xee, 0x01, 0x1a, + 0xbd, 0xec, 0x02, 0x8b, 0x31, 0xee, 0x21, 0x0a, 0x10, 0xbd, 0x38, 0xb5, + 0x2d, 0xed, 0x02, 0x8b, 0x82, 0xb0, 0x04, 0x46, 0x00, 0x91, 0x15, 0x46, + 0xff, 0xf7, 0x75, 0xff, 0x02, 0x23, 0x02, 0x22, 0xdf, 0xf8, 0xc4, 0x18, + 0x04, 0xf1, 0xdc, 0x00, 0xff, 0xf7, 0x68, 0xfd, 0x00, 0x95, 0xf0, 0xee, + 0x68, 0x0a, 0xb0, 0xee, 0x48, 0x0a, 0x02, 0x23, 0x02, 0x22, 0xdf, 0xf8, + 0xb0, 0x18, 0x04, 0xf5, 0x82, 0x70, 0xff, 0xf7, 0x5b, 0xfd, 0x02, 0xb0, + 0xbd, 0xec, 0x02, 0x8b, 0x31, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x2d, 0xed, + 0x04, 0x8b, 0x0d, 0x46, 0x0a, 0x98, 0x00, 0x24, 0xb0, 0xb1, 0x05, 0xf5, + 0x4f, 0x70, 0x00, 0xbf, 0x39, 0xa1, 0x90, 0xed, 0x00, 0x0a, 0x40, 0x68, + 0x3b, 0xa3, 0x00, 0xf0, 0x03, 0x00, 0x01, 0xeb, 0x80, 0x02, 0x03, 0xeb, + 0x80, 0x00, 0xd2, 0xed, 0x00, 0x0a, 0x90, 0xed, 0x00, 0x1a, 0x20, 0xee, + 0x20, 0x8a, 0x60, 0xee, 0x01, 0x8a, 0x03, 0xe0, 0x9f, 0xed, 0xd6, 0x8a, + 0xdf, 0xed, 0xd5, 0x8a, 0x0b, 0x9e, 0x00, 0x27, 0x9f, 0xed, 0xd4, 0x9a, + 0x05, 0xeb, 0x87, 0x00, 0x03, 0x2f, 0x90, 0xed, 0xd3, 0x0a, 0x08, 0xbf, + 0x30, 0xee, 0x08, 0x0a, 0x20, 0xee, 0x09, 0x0a, 0xd4, 0xf7, 0x42, 0xfa, + 0x06, 0xeb, 0x87, 0x00, 0x7f, 0x1c, 0xbd, 0xee, 0xc0, 0x0a, 0x07, 0x2f, + 0x80, 0xed, 0x00, 0x0a, 0xea, 0xd3, 0x00, 0x27, 0x05, 0xeb, 0x87, 0x00, + 0x01, 0x2f, 0x90, 0xed, 0xda, 0x0a, 0x08, 0xbf, 0x30, 0xee, 0x28, 0x0a, + 0x20, 0xee, 0x09, 0x0a, 0xd4, 0xf7, 0x2c, 0xfa, 0x06, 0xf1, 0x1c, 0x00, + 0x00, 0xeb, 0x87, 0x01, 0x7f, 0x1c, 0xbd, 0xee, 0xc0, 0x0a, 0x03, 0x2f, + 0x81, 0xed, 0x00, 0x0a, 0xe8, 0xd3, 0x00, 0x20, 0x56, 0xf8, 0x20, 0x10, + 0x01, 0xf5, 0x00, 0x31, 0xb1, 0xf5, 0x80, 0x2f, 0x03, 0xd2, 0x40, 0x1c, + 0x07, 0x28, 0xf5, 0xd3, 0x01, 0xe0, 0x43, 0xf2, 0x06, 0x24, 0x00, 0x20, + 0x06, 0xf1, 0x1c, 0x01, 0x51, 0xf8, 0x20, 0x20, 0x02, 0xf5, 0x00, 0x42, + 0xb2, 0xf5, 0x80, 0x3f, 0x03, 0xd2, 0x40, 0x1c, 0x03, 0x28, 0xf5, 0xd3, + 0x01, 0xe0, 0x43, 0xf2, 0x06, 0x24, 0xbd, 0xec, 0x04, 0x8b, 0x20, 0x46, + 0xf2, 0xbd, 0x00, 0x00, 0xdb, 0x0f, 0xc9, 0xc0, 0x60, 0x70, 0x89, 0x30, + 0x5f, 0x70, 0x89, 0x30, 0xdb, 0x0f, 0xc9, 0x40, 0x00, 0x00, 0x80, 0x3f, + 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x80, 0x3f, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x80, 0x3f, + 0x00, 0x00, 0x80, 0xbf, 0x2d, 0xe9, 0xf8, 0x43, 0x04, 0x46, 0x00, 0xee, + 0x10, 0x2a, 0x2d, 0xed, 0x08, 0x8b, 0xb8, 0xee, 0x40, 0x0a, 0x9f, 0xed, + 0xdb, 0x1a, 0x04, 0xf5, 0xba, 0x79, 0xa4, 0xb0, 0x20, 0xee, 0x01, 0xaa, + 0x0d, 0x46, 0xf0, 0xee, 0x4a, 0x0a, 0x99, 0xed, 0x02, 0x0a, 0xdf, 0xf8, + 0x50, 0x67, 0xde, 0xf7, 0x45, 0xfd, 0x05, 0xf1, 0xc8, 0x00, 0xf0, 0xee, + 0x40, 0xaa, 0xb7, 0xee, 0x00, 0x1a, 0x31, 0xee, 0x6a, 0xba, 0x90, 0xec, + 0x02, 0x0a, 0xc6, 0xf7, 0xb4, 0xfa, 0x05, 0xf1, 0xd0, 0x00, 0x00, 0xf0, + 0x6f, 0xfb, 0x00, 0xf0, 0x99, 0xfb, 0xb0, 0xee, 0x4b, 0x0a, 0xc8, 0xf7, + 0x0b, 0xf8, 0x00, 0xf0, 0x17, 0xf9, 0xff, 0xf7, 0x9a, 0xfe, 0xb0, 0xee, + 0x4b, 0x0a, 0xc8, 0xf7, 0x03, 0xf8, 0x00, 0xf0, 0x09, 0xf9, 0xb0, 0xee, + 0x40, 0x9a, 0x99, 0xed, 0x03, 0x0a, 0xf0, 0xee, 0x60, 0x9a, 0x03, 0xab, + 0x2b, 0xee, 0x00, 0x0a, 0x01, 0x22, 0x08, 0x21, 0x28, 0x46, 0xc8, 0xf7, + 0xab, 0xf9, 0x00, 0x20, 0x03, 0x90, 0x00, 0x21, 0x03, 0xa8, 0x08, 0x23, + 0x41, 0x60, 0x01, 0x61, 0x41, 0x61, 0x01, 0x22, 0x00, 0x93, 0x02, 0x90, + 0x01, 0x92, 0x03, 0xab, 0x08, 0x21, 0xc8, 0xf7, 0xad, 0xf9, 0x94, 0xed, + 0x16, 0x0a, 0xd4, 0xed, 0x12, 0x1a, 0x94, 0xed, 0x1a, 0x1a, 0x60, 0xee, + 0x0a, 0x0a, 0x0b, 0xa8, 0x21, 0xee, 0x8a, 0x0a, 0xff, 0xf7, 0xe3, 0xfb, + 0x01, 0x20, 0x00, 0x90, 0x08, 0x23, 0x0b, 0xaa, 0x0b, 0xa9, 0x03, 0xa8, + 0xc8, 0xf7, 0x75, 0xfb, 0x0b, 0xaa, 0x08, 0x21, 0x05, 0xf1, 0x20, 0x00, + 0xc8, 0xf7, 0x0b, 0xfa, 0x0b, 0xa8, 0x00, 0xf0, 0x8e, 0xf9, 0xff, 0xf7, + 0xd0, 0xfb, 0x0b, 0xaa, 0x08, 0x21, 0x05, 0xf1, 0x20, 0x00, 0xc8, 0xf7, + 0x17, 0xfa, 0xb0, 0xee, 0x6a, 0x0a, 0x01, 0x22, 0x08, 0x21, 0x28, 0x46, + 0xc8, 0xf7, 0x6d, 0xf9, 0x95, 0xed, 0x00, 0x0a, 0x30, 0xee, 0x08, 0x0a, + 0x85, 0xed, 0x00, 0x0a, 0xd5, 0xed, 0x01, 0x0a, 0x95, 0xed, 0x04, 0x0a, + 0x70, 0xee, 0xa8, 0x0a, 0xc5, 0xed, 0x01, 0x0a, 0x30, 0xee, 0x09, 0x0a, + 0xd5, 0xed, 0x05, 0x0a, 0x85, 0xed, 0x04, 0x0a, 0x70, 0xee, 0xa9, 0x0a, + 0xc5, 0xed, 0x05, 0x0a, 0xf0, 0xee, 0x4a, 0x0a, 0x99, 0xed, 0x00, 0x0a, + 0xde, 0xf7, 0xbc, 0xfc, 0xb0, 0xee, 0x40, 0xba, 0x05, 0xf5, 0x5d, 0x70, + 0xb7, 0xee, 0x00, 0x0a, 0x05, 0xf5, 0x5f, 0x71, 0x70, 0xee, 0x4b, 0xaa, + 0x90, 0xec, 0x02, 0x8a, 0x91, 0xec, 0x02, 0x0a, 0xc6, 0xf7, 0x27, 0xfa, + 0xff, 0xf7, 0x1e, 0xfe, 0xf0, 0xee, 0x60, 0x9a, 0x13, 0xa8, 0xb0, 0xee, + 0x40, 0x9a, 0x78, 0xee, 0x69, 0xba, 0x00, 0x90, 0xb0, 0xee, 0x4a, 0x0a, + 0x02, 0x23, 0x04, 0xf1, 0xc0, 0x02, 0x04, 0xf1, 0xb0, 0x01, 0x30, 0x46, + 0xff, 0xf7, 0x48, 0xfb, 0x1d, 0xa8, 0x00, 0x90, 0xb0, 0xee, 0x4a, 0x0a, + 0x0f, 0xf6, 0x98, 0x57, 0x02, 0x23, 0x04, 0xf5, 0x90, 0x72, 0x04, 0xf5, + 0x88, 0x71, 0x38, 0x46, 0xff, 0xf7, 0x3a, 0xfb, 0x05, 0xf1, 0xdc, 0x08, + 0x99, 0xed, 0x01, 0x0a, 0x03, 0xab, 0x2a, 0xee, 0x80, 0x0a, 0x01, 0x22, + 0x10, 0x21, 0x40, 0x46, 0xc8, 0xf7, 0x12, 0xf9, 0x00, 0x21, 0x06, 0x91, + 0x0e, 0x91, 0x10, 0x23, 0x01, 0x21, 0x03, 0xa8, 0x01, 0x91, 0x00, 0x93, + 0x02, 0x90, 0x03, 0xab, 0x01, 0x22, 0x10, 0x21, 0xc8, 0xf7, 0x16, 0xf9, + 0x01, 0x20, 0x00, 0x90, 0x10, 0x23, 0x13, 0xaa, 0x13, 0xa9, 0x03, 0xa8, + 0xc8, 0xf7, 0xeb, 0xfa, 0x05, 0xf5, 0x8e, 0x79, 0x13, 0xaa, 0x10, 0x21, + 0x48, 0x46, 0xc8, 0xf7, 0x80, 0xf9, 0xb0, 0xee, 0x4b, 0x0a, 0x01, 0x22, + 0x10, 0x21, 0x40, 0x46, 0xc8, 0xf7, 0xed, 0xf8, 0x28, 0xee, 0x08, 0x0a, + 0x05, 0xf1, 0xe8, 0x00, 0x08, 0xee, 0xa8, 0x0a, 0x20, 0xee, 0x2a, 0x0a, + 0x80, 0xee, 0x2b, 0x0a, 0xd0, 0xed, 0x00, 0x0a, 0x90, 0xed, 0x08, 0x1a, + 0x70, 0xee, 0x20, 0x0a, 0xc0, 0xed, 0x00, 0x0a, 0x78, 0xee, 0x89, 0x0a, + 0x60, 0xee, 0xaa, 0x0a, 0xc0, 0xee, 0xab, 0x0a, 0x30, 0xee, 0x81, 0x1a, + 0x80, 0xed, 0x08, 0x1a, 0x13, 0xa8, 0x00, 0xf0, 0x2b, 0xf8, 0x04, 0xf1, + 0xa0, 0x02, 0x04, 0xf1, 0x90, 0x01, 0x30, 0x46, 0xff, 0xf7, 0xe4, 0xfa, + 0x1d, 0xa8, 0x00, 0xf0, 0x21, 0xf8, 0x04, 0xf5, 0x80, 0x72, 0x04, 0xf1, + 0xf0, 0x01, 0x38, 0x46, 0xff, 0xf7, 0xda, 0xfa, 0x13, 0xaa, 0x10, 0x21, + 0x48, 0x46, 0xc8, 0xf7, 0x5b, 0xf9, 0x24, 0xb0, 0xbd, 0xec, 0x08, 0x8b, + 0xbd, 0xe8, 0xf1, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x47, + 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, 0xc7, 0xf7, 0xc5, 0xbe, + 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, 0xc7, 0xf7, 0xbf, 0xbe, + 0x00, 0x90, 0xb7, 0xee, 0x00, 0x0a, 0x02, 0x23, 0x70, 0x47, 0x80, 0xed, + 0x36, 0x0a, 0x70, 0x47, 0x2d, 0xe9, 0xfc, 0x47, 0x0c, 0x46, 0x05, 0x46, + 0x04, 0xf1, 0xdc, 0x06, 0x0f, 0xf6, 0x70, 0x48, 0x00, 0x96, 0xff, 0xf7, + 0xee, 0xff, 0x05, 0xf1, 0xa0, 0x02, 0x05, 0xf1, 0x90, 0x01, 0x40, 0x46, + 0xff, 0xf7, 0xa6, 0xfa, 0x04, 0xf5, 0x82, 0x77, 0x0f, 0xf6, 0x58, 0x49, + 0x00, 0x97, 0xff, 0xf7, 0xe0, 0xff, 0x05, 0xf5, 0x80, 0x72, 0x05, 0xf1, + 0xf0, 0x01, 0x48, 0x46, 0xff, 0xf7, 0x98, 0xfa, 0x04, 0xf5, 0x8e, 0x7a, + 0x4f, 0xf4, 0x08, 0x71, 0x50, 0x46, 0xd9, 0xf7, 0xd1, 0xf8, 0x32, 0x46, + 0x10, 0x21, 0x50, 0x46, 0xc8, 0xf7, 0xfb, 0xf8, 0x00, 0x96, 0xff, 0xf7, + 0xca, 0xff, 0x05, 0xf1, 0x80, 0x02, 0x05, 0xf1, 0x70, 0x01, 0x40, 0x46, + 0xff, 0xf7, 0x82, 0xfa, 0x00, 0x97, 0xff, 0xf7, 0xc0, 0xff, 0x05, 0xf1, + 0xe0, 0x02, 0x05, 0xf1, 0xd0, 0x01, 0x48, 0x46, 0xff, 0xf7, 0x78, 0xfa, + 0x04, 0xf5, 0x4f, 0x75, 0x00, 0x20, 0x28, 0x60, 0x68, 0x60, 0x28, 0x73, + 0x04, 0xf5, 0x5a, 0x72, 0xdf, 0xf8, 0xc8, 0x03, 0xa8, 0x60, 0x04, 0xf5, + 0x53, 0x71, 0xdf, 0xed, 0x4f, 0x0a, 0x9f, 0xed, 0x4e, 0x0a, 0x20, 0x46, + 0xff, 0xf7, 0xa5, 0xfd, 0xdf, 0xf8, 0xb4, 0x1a, 0x04, 0xf5, 0x5d, 0x70, + 0x91, 0xec, 0x02, 0x0a, 0x80, 0xec, 0x02, 0x0a, 0xdf, 0xf8, 0xa8, 0x0a, + 0xdf, 0xf8, 0xa8, 0x1a, 0x04, 0xf5, 0x5f, 0x72, 0x90, 0xec, 0x02, 0x1a, + 0x82, 0xec, 0x02, 0x1a, 0xa9, 0x64, 0xbd, 0xe8, 0xf3, 0x87, 0x00, 0x00, + 0xbd, 0x37, 0x86, 0x35, 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x28, 0x46, + 0x00, 0xf0, 0x3b, 0xf8, 0xff, 0xf7, 0x7d, 0xfa, 0x90, 0x21, 0x05, 0xf1, + 0x20, 0x00, 0xd9, 0xf7, 0x7f, 0xf8, 0x2a, 0x46, 0x08, 0x21, 0x05, 0xf1, + 0x20, 0x00, 0xc8, 0xf7, 0xa8, 0xf8, 0x28, 0x46, 0xb7, 0xee, 0x00, 0x1a, + 0xd4, 0xed, 0x04, 0x0a, 0x94, 0xed, 0x00, 0x0a, 0xff, 0xf7, 0x69, 0xfa, + 0x05, 0xf1, 0xb0, 0x00, 0x9f, 0xed, 0xd1, 0x0a, 0x80, 0xed, 0x00, 0x0a, + 0x80, 0xed, 0x01, 0x0a, 0x05, 0xf1, 0xb8, 0x01, 0xdf, 0xf8, 0x38, 0x0a, + 0x05, 0xf1, 0xc0, 0x02, 0x90, 0xec, 0x02, 0x0a, 0x81, 0xec, 0x02, 0x0a, + 0xdf, 0xf8, 0x2c, 0x1a, 0x05, 0xf1, 0xc8, 0x03, 0x91, 0xec, 0x02, 0x1a, + 0x82, 0xec, 0x02, 0x1a, 0x90, 0xec, 0x02, 0x0a, 0x83, 0xec, 0x02, 0x0a, + 0x05, 0xf1, 0xd0, 0x00, 0x91, 0xec, 0x02, 0x1a, 0x80, 0xec, 0x02, 0x1a, + 0x31, 0xbd, 0x94, 0xed, 0x10, 0x1a, 0xd4, 0xed, 0x0c, 0x0a, 0x94, 0xed, + 0x08, 0x0a, 0x70, 0x47, 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0xff, 0xf7, + 0x47, 0xff, 0x29, 0x46, 0x20, 0x46, 0xbd, 0xe8, 0x34, 0x40, 0xad, 0xe7, + 0x10, 0xb5, 0x00, 0xee, 0x90, 0x2a, 0x2d, 0xed, 0x02, 0x8b, 0xb8, 0xee, + 0x60, 0x8a, 0x00, 0xee, 0x90, 0x3a, 0xf8, 0xee, 0x60, 0x0a, 0x9f, 0xed, + 0xce, 0x1a, 0xa6, 0xb0, 0x80, 0xee, 0x81, 0x1a, 0x0c, 0x46, 0xf0, 0xee, + 0x48, 0x0a, 0x68, 0x46, 0xff, 0xf7, 0x32, 0xfa, 0x01, 0x22, 0xb0, 0xee, + 0x48, 0x0a, 0x69, 0x46, 0x20, 0x46, 0xff, 0xf7, 0xab, 0xfc, 0xd4, 0xed, + 0xcf, 0x0a, 0xb0, 0xee, 0x00, 0x1a, 0x20, 0xee, 0x81, 0x1a, 0x26, 0xb0, + 0x01, 0xee, 0x20, 0x0a, 0xf5, 0xee, 0x00, 0x0a, 0xbd, 0xec, 0x02, 0x8b, + 0x20, 0xee, 0x20, 0x0a, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2d, 0xe9, 0xf7, 0x4f, 0x2d, 0xed, 0x04, 0x8b, 0xa8, 0xb0, 0x80, 0x46, + 0x24, 0x22, 0x08, 0xf1, 0x0c, 0x01, 0x0c, 0xa8, 0xc6, 0xf7, 0x44, 0xfe, + 0x18, 0x22, 0x08, 0xf1, 0x30, 0x01, 0x06, 0xa8, 0xc6, 0xf7, 0x3e, 0xfe, + 0x01, 0x21, 0x0c, 0xa8, 0x2b, 0xe0, 0x0a, 0x01, 0x83, 0x18, 0xd3, 0xed, + 0x00, 0x0a, 0x00, 0xf0, 0xb6, 0xfc, 0x21, 0xd4, 0x0c, 0x23, 0x4b, 0x43, + 0xc4, 0x18, 0x9d, 0xed, 0x0c, 0x2a, 0xd4, 0xed, 0x00, 0x0a, 0xdd, 0xed, + 0x0c, 0x1a, 0x00, 0xeb, 0x81, 0x04, 0x60, 0xee, 0x21, 0x1a, 0x94, 0xed, + 0x00, 0x1a, 0x0c, 0xac, 0x23, 0x44, 0x03, 0xeb, 0x81, 0x03, 0x21, 0xee, + 0x01, 0x1a, 0xd3, 0xed, 0x00, 0x2a, 0x62, 0xee, 0x22, 0x2a, 0x00, 0xee, + 0xa0, 0x1a, 0x72, 0xee, 0xc1, 0x0a, 0xf4, 0xee, 0x61, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x01, 0xd5, 0x00, 0x23, 0x83, 0x50, 0x49, 0x1c, 0x98, 0xf8, + 0x08, 0x20, 0x91, 0x42, 0xcf, 0xd3, 0x00, 0x23, 0x02, 0xe0, 0x11, 0x01, + 0x52, 0x1c, 0x43, 0x50, 0x02, 0x2a, 0xfa, 0xd9, 0x6b, 0x46, 0x03, 0x22, + 0x06, 0xa9, 0x00, 0xf0, 0x8b, 0xfe, 0x98, 0xf8, 0x08, 0x90, 0xdf, 0xf8, + 0xe8, 0xb8, 0x00, 0x24, 0x18, 0x27, 0x34, 0xe0, 0x0c, 0x21, 0x08, 0xeb, + 0x84, 0x00, 0x71, 0x43, 0x45, 0x18, 0x95, 0xed, 0x03, 0x0a, 0xc7, 0xf7, + 0x95, 0xfd, 0x00, 0xf0, 0x03, 0xf9, 0x0c, 0x20, 0x60, 0x43, 0x40, 0x44, + 0x00, 0xeb, 0x86, 0x0a, 0x00, 0xf0, 0xe2, 0xf8, 0x00, 0xf0, 0xd6, 0xf8, + 0x16, 0xa8, 0x07, 0xfb, 0x04, 0xf1, 0x08, 0x44, 0x00, 0xeb, 0xc6, 0x02, + 0x82, 0xec, 0x02, 0x0a, 0x95, 0xed, 0x03, 0x0a, 0xb1, 0xee, 0x40, 0x0a, + 0xc7, 0xf7, 0x7c, 0xfd, 0x00, 0xf0, 0xea, 0xf8, 0x00, 0xf0, 0xce, 0xf8, + 0x00, 0xf0, 0xc2, 0xf8, 0x16, 0xa8, 0x00, 0xeb, 0xc4, 0x01, 0x07, 0xfb, + 0x06, 0xf2, 0x11, 0x44, 0x76, 0x1c, 0x81, 0xec, 0x02, 0x0a, 0x4e, 0x45, + 0xcc, 0xd3, 0x15, 0x94, 0x64, 0x1c, 0x4c, 0x45, 0x0c, 0xd2, 0x08, 0xf1, + 0x0c, 0x00, 0x00, 0xeb, 0x04, 0x11, 0x66, 0x1c, 0x00, 0xf0, 0xb2, 0xf8, + 0x00, 0xf0, 0xa1, 0xf8, 0x16, 0xa8, 0x00, 0xeb, 0x44, 0x11, 0xea, 0xe7, + 0x0f, 0xf6, 0x70, 0x10, 0x00, 0x25, 0x90, 0xec, 0x02, 0x9a, 0x6c, 0x46, + 0x1c, 0xe0, 0x16, 0xa8, 0x07, 0xfb, 0x05, 0xf1, 0x08, 0x44, 0x00, 0xeb, + 0xca, 0x02, 0x04, 0xeb, 0xca, 0x03, 0x92, 0xec, 0x02, 0x1a, 0x93, 0xec, + 0x02, 0x0a, 0xc7, 0xf7, 0x18, 0xfd, 0x04, 0xeb, 0xc5, 0x00, 0x00, 0xf0, + 0x9f, 0xf8, 0xff, 0xf7, 0x4d, 0xfe, 0x00, 0xf0, 0xa3, 0xf8, 0x00, 0xf0, + 0xc5, 0xf8, 0x0a, 0xf1, 0x01, 0x0a, 0xca, 0x45, 0xe3, 0xd3, 0x6d, 0x1c, + 0x4d, 0x45, 0x38, 0xbf, 0x4f, 0xf0, 0x00, 0x0a, 0xf7, 0xd3, 0x2d, 0x9d, + 0x98, 0xed, 0x14, 0x0a, 0xc7, 0xf7, 0x2c, 0xfd, 0x00, 0xf0, 0x0f, 0xfc, + 0xc7, 0xf7, 0xe8, 0xfc, 0xc0, 0x46, 0xc0, 0x46, 0xb0, 0xee, 0x40, 0x9a, + 0x98, 0xed, 0x0d, 0x0a, 0xc7, 0xf7, 0x20, 0xfd, 0x00, 0xf0, 0x8e, 0xf8, + 0xff, 0xf7, 0xaf, 0xfb, 0x98, 0xed, 0x0c, 0x0a, 0xc7, 0xf7, 0x18, 0xfd, + 0x00, 0xf0, 0x62, 0xf8, 0x85, 0xec, 0x02, 0x0a, 0x02, 0x27, 0x1f, 0xe0, + 0x0c, 0x21, 0x08, 0xf1, 0x0c, 0x00, 0x79, 0x43, 0x01, 0x44, 0x00, 0xf0, + 0x5d, 0xf8, 0x00, 0xf0, 0x79, 0xf8, 0x08, 0xf1, 0x0c, 0x00, 0x00, 0xeb, + 0x87, 0x01, 0xff, 0xf7, 0x96, 0xfb, 0x00, 0xf0, 0x53, 0xf8, 0x00, 0xf0, + 0x4b, 0xf8, 0x04, 0xeb, 0xc7, 0x00, 0x00, 0xf0, 0x75, 0xf8, 0xff, 0xf7, + 0xdd, 0xfb, 0x95, 0xec, 0x02, 0x0a, 0xc7, 0xf7, 0xb5, 0xfc, 0x85, 0xec, + 0x02, 0x0a, 0x7f, 0x1c, 0x4f, 0x45, 0xdd, 0xd3, 0xdd, 0xf8, 0xb8, 0x90, + 0x98, 0xed, 0x03, 0x0a, 0xc7, 0xf7, 0xea, 0xfc, 0x00, 0xf0, 0x2b, 0xf8, + 0x89, 0xec, 0x02, 0x0a, 0x98, 0xed, 0x06, 0x0a, 0xc7, 0xf7, 0xe2, 0xfc, + 0x00, 0xf0, 0x50, 0xf8, 0xff, 0xf7, 0x71, 0xfb, 0x98, 0xed, 0x04, 0x0a, + 0xc7, 0xf7, 0xda, 0xfc, 0x00, 0xf0, 0x24, 0xf8, 0x09, 0xf1, 0x08, 0x00, + 0x80, 0xec, 0x02, 0x0a, 0x98, 0xf8, 0x5d, 0x10, 0x01, 0x29, 0x0b, 0xd1, + 0xc5, 0xf7, 0x6d, 0xff, 0x09, 0xf1, 0x08, 0x00, 0x80, 0xec, 0x02, 0x0a, + 0x95, 0xec, 0x02, 0x0a, 0xc5, 0xf7, 0x65, 0xff, 0x85, 0xec, 0x02, 0x0a, + 0x28, 0xb0, 0xb0, 0xee, 0x49, 0x0a, 0xbd, 0xec, 0x04, 0x8b, 0xbd, 0xe8, + 0xf7, 0x8f, 0xdf, 0xf8, 0x14, 0x07, 0x90, 0xec, 0x02, 0x1a, 0xc7, 0xf7, + 0x64, 0xbc, 0x00, 0x00, 0xcd, 0xcc, 0xcc, 0x3d, 0xb0, 0xee, 0x48, 0x1a, + 0xf0, 0xee, 0x68, 0x1a, 0xc7, 0xf7, 0x5b, 0xbc, 0x91, 0xed, 0x00, 0x0a, + 0xc7, 0xf7, 0xaa, 0xbc, 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, 0x60, 0x8a, + 0x9a, 0xed, 0x03, 0x0a, 0xc7, 0xf7, 0xa2, 0xbc, 0xb0, 0xee, 0x40, 0x8a, + 0xf0, 0xee, 0x60, 0x8a, 0x90, 0xec, 0x02, 0x0a, 0xc5, 0xf7, 0x39, 0xbf, + 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0xb0, 0xee, 0x49, 0x0a, + 0xf0, 0xee, 0x69, 0x0a, 0xc7, 0xf7, 0x3d, 0xbc, 0xb0, 0xee, 0x40, 0x1a, + 0xf0, 0xee, 0x60, 0x1a, 0x9b, 0xec, 0x02, 0x0a, 0xc7, 0xf7, 0x5b, 0xbc, + 0xdf, 0xf8, 0xb4, 0x06, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, + 0x90, 0xec, 0x02, 0x0a, 0xc7, 0xf7, 0x51, 0xbc, 0x00, 0x00, 0x82, 0x42, + 0x60, 0xac, 0x03, 0x02, 0x64, 0xac, 0x03, 0x02, 0xa4, 0x8f, 0x00, 0x21, + 0xb0, 0xee, 0x40, 0x9a, 0xf0, 0xee, 0x60, 0x9a, 0x70, 0x47, 0x2d, 0xe9, + 0xf8, 0x43, 0x2d, 0xed, 0x04, 0x8b, 0x8a, 0xb0, 0x04, 0x46, 0x88, 0x46, + 0x91, 0x46, 0x1f, 0x46, 0x16, 0x9d, 0x17, 0x9e, 0x06, 0xa8, 0x00, 0x21, + 0x00, 0x22, 0x00, 0x23, 0x8c, 0x46, 0x80, 0xe8, 0x0e, 0x10, 0xff, 0xf7, + 0xe7, 0xff, 0xb0, 0xee, 0x61, 0x8a, 0x8d, 0xed, 0x06, 0x1a, 0x8d, 0xed, + 0x09, 0x1a, 0xc0, 0x46, 0xc0, 0x46, 0x8d, 0xed, 0x04, 0x0a, 0x00, 0xf0, + 0x1c, 0xf8, 0xb0, 0xee, 0x60, 0x0a, 0x8d, 0xed, 0x05, 0x0a, 0x00, 0x96, + 0x2b, 0x46, 0x4a, 0x46, 0x41, 0x46, 0x04, 0xa8, 0x00, 0xf0, 0x60, 0xfc, + 0x03, 0x96, 0x02, 0x95, 0x01, 0x94, 0x00, 0x97, 0xb0, 0xee, 0x48, 0x0a, + 0x4b, 0x46, 0x06, 0xaa, 0x41, 0x46, 0x04, 0xa8, 0x00, 0xf0, 0x70, 0xfc, + 0x0a, 0xb0, 0xbd, 0xec, 0x04, 0x8b, 0xbd, 0xe8, 0xf2, 0x83, 0xb0, 0xee, + 0x49, 0x0a, 0xf0, 0xee, 0x69, 0x0a, 0x70, 0x47, 0xd1, 0xf8, 0x40, 0x03, + 0x40, 0x1c, 0xc1, 0xf8, 0x40, 0x03, 0x70, 0x47, 0x80, 0xed, 0xe1, 0x0a, + 0x70, 0x47, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0x88, 0x46, 0x2d, 0xed, + 0x10, 0x8b, 0x08, 0xf5, 0x4f, 0x71, 0xb2, 0xb0, 0x91, 0x46, 0x8a, 0x6c, + 0x04, 0x92, 0x00, 0xf5, 0x98, 0x7a, 0x9b, 0x46, 0x0b, 0xaa, 0x05, 0xa9, + 0x9a, 0xed, 0x0f, 0x0a, 0x48, 0x46, 0xff, 0xf7, 0x1b, 0xfe, 0xd9, 0xed, + 0x15, 0x0a, 0x99, 0xed, 0x16, 0x1a, 0xda, 0xed, 0x00, 0x1a, 0x9a, 0xed, + 0x0a, 0x2a, 0x99, 0xf8, 0x5c, 0x00, 0x4c, 0x9e, 0x80, 0xee, 0x81, 0x1a, + 0x61, 0xee, 0x21, 0x0a, 0x22, 0xee, 0x00, 0x0a, 0x00, 0x27, 0x00, 0x24, + 0x00, 0x25, 0x00, 0xf0, 0xd6, 0xfa, 0x48, 0xbf, 0xf0, 0xee, 0x40, 0x0a, + 0x99, 0xed, 0x01, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x80, 0xee, 0x80, 0x0a, + 0x09, 0xf1, 0x5c, 0x01, 0xd9, 0xed, 0x03, 0x0a, 0x8a, 0x78, 0x60, 0xee, + 0x20, 0xea, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x8a, 0x00, 0xee, + 0x90, 0x2a, 0xf8, 0xee, 0x60, 0x0a, 0x9f, 0xed, 0xee, 0x0a, 0x80, 0xee, + 0x80, 0x0a, 0x8d, 0xed, 0x03, 0x0a, 0x48, 0x46, 0xff, 0xf7, 0xc4, 0xfa, + 0x8d, 0xed, 0x02, 0x0a, 0xf0, 0xee, 0x48, 0x0a, 0x9d, 0xed, 0x03, 0x1a, + 0x30, 0x46, 0xfe, 0xf7, 0xf3, 0xff, 0x10, 0x23, 0x07, 0x22, 0x0f, 0xa9, + 0x58, 0x46, 0xff, 0xf7, 0xfb, 0xf8, 0x01, 0x20, 0x00, 0x90, 0x01, 0x23, + 0x0f, 0xf2, 0x44, 0x62, 0x0f, 0xa9, 0x30, 0x46, 0xff, 0xf7, 0x17, 0xf9, + 0xb0, 0xee, 0x40, 0xfa, 0xf0, 0xee, 0x60, 0xfa, 0x10, 0x23, 0x03, 0x22, + 0x0f, 0xa9, 0x0b, 0xf1, 0x1c, 0x00, 0xff, 0xf7, 0xe7, 0xf8, 0x01, 0x20, + 0x00, 0x90, 0x01, 0x23, 0x0f, 0xf2, 0x20, 0x62, 0x0f, 0xa9, 0x30, 0x46, + 0xff, 0xf7, 0x03, 0xf9, 0x09, 0xa8, 0x09, 0xa9, 0xdf, 0xf8, 0xf8, 0x24, + 0xdf, 0xf8, 0xe8, 0xb4, 0x80, 0xec, 0x02, 0x0a, 0x91, 0xec, 0x02, 0x1a, + 0x92, 0xec, 0x02, 0x0a, 0xc7, 0xf7, 0x73, 0xfb, 0xff, 0xf7, 0x28, 0xff, + 0x00, 0xf0, 0x90, 0xfa, 0xff, 0xf7, 0x7e, 0xfa, 0x9b, 0xec, 0x02, 0x0a, + 0xc7, 0xf7, 0x43, 0xfb, 0xff, 0xf7, 0x0c, 0xff, 0xb0, 0xee, 0x40, 0xca, + 0xf0, 0xee, 0x60, 0xca, 0x00, 0xf0, 0x82, 0xfa, 0x00, 0xf0, 0xa2, 0xfa, + 0xff, 0xf7, 0x02, 0xff, 0xff, 0xf7, 0x1b, 0xfa, 0x00, 0xf0, 0x70, 0xfa, + 0xff, 0xf7, 0x68, 0xfa, 0x9f, 0xed, 0xbf, 0xaa, 0x9b, 0xec, 0x02, 0x0a, + 0xc7, 0xf7, 0x2b, 0xfb, 0xff, 0xf7, 0xf4, 0xfe, 0xb0, 0xee, 0x40, 0xba, + 0xf0, 0xee, 0x60, 0xba, 0x00, 0xf0, 0x60, 0xfa, 0x00, 0xf0, 0x8a, 0xfa, + 0xff, 0xf7, 0xea, 0xfe, 0x0d, 0xf1, 0x2c, 0x0b, 0x0b, 0xf1, 0x08, 0x00, + 0x00, 0xf0, 0x8a, 0xfa, 0x00, 0xf0, 0x78, 0xfa, 0xb0, 0xee, 0x4c, 0x0a, + 0xf0, 0xee, 0x6c, 0x0a, 0xc7, 0xf7, 0x37, 0xfb, 0xff, 0xf7, 0xae, 0xfe, + 0x0b, 0xf1, 0x08, 0x00, 0xb0, 0xee, 0x40, 0xda, 0xf0, 0xee, 0x60, 0xda, + 0x90, 0xec, 0x02, 0x1a, 0x00, 0xf0, 0x56, 0xfa, 0x00, 0xf0, 0x64, 0xfa, + 0xff, 0xf7, 0x1f, 0xff, 0xc7, 0xf7, 0x25, 0xfb, 0xff, 0xf7, 0x9c, 0xfe, + 0x09, 0xf1, 0x5c, 0x00, 0xb0, 0xee, 0x40, 0x9a, 0x41, 0x78, 0x01, 0x29, + 0xf0, 0xee, 0x60, 0x9a, 0x40, 0xf0, 0xc5, 0x81, 0x05, 0xa8, 0xb0, 0xee, + 0x4d, 0x0a, 0x90, 0xec, 0x02, 0x8a, 0xf0, 0xee, 0x6d, 0x0a, 0xc5, 0xf7, + 0xdc, 0xfd, 0x00, 0xf0, 0x1b, 0xfa, 0xff, 0xf7, 0x04, 0xff, 0xc5, 0xf7, + 0xd6, 0xfd, 0xb0, 0xee, 0x60, 0x1a, 0xf0, 0xee, 0x40, 0x0a, 0x96, 0xed, + 0x24, 0x0a, 0xd8, 0xed, 0x36, 0x2a, 0x0f, 0xa8, 0xf0, 0xee, 0x4a, 0x1a, + 0xb0, 0xee, 0x6a, 0x2a, 0xb1, 0xee, 0x40, 0x0a, 0xff, 0xf7, 0x58, 0xf9, + 0xff, 0xf7, 0xb2, 0xf9, 0xc5, 0xf7, 0xc1, 0xfd, 0x02, 0x20, 0x08, 0x21, + 0x01, 0x90, 0x00, 0x91, 0x08, 0xf1, 0x20, 0x03, 0x42, 0x46, 0x0f, 0xa9, + 0x00, 0x20, 0xf7, 0xee, 0x00, 0x1a, 0xb0, 0xee, 0x6e, 0x1a, 0xff, 0xf7, + 0xa2, 0xfe, 0x01, 0x22, 0x31, 0x46, 0x40, 0x46, 0xfe, 0xf7, 0xd6, 0xff, + 0x08, 0xf1, 0xd0, 0x00, 0x08, 0xf1, 0xc8, 0x01, 0x90, 0xec, 0x02, 0x1a, + 0x91, 0xec, 0x02, 0x0a, 0xc7, 0xf7, 0xb1, 0xfa, 0xb0, 0xee, 0x40, 0x8a, + 0x0f, 0xf2, 0xc8, 0x41, 0x96, 0xed, 0x24, 0x0a, 0xd8, 0xed, 0x36, 0x2a, + 0xf0, 0xee, 0x60, 0x8a, 0x13, 0xa8, 0xd1, 0xec, 0x02, 0x1a, 0xd1, 0xec, + 0x02, 0x0a, 0xb1, 0xee, 0x40, 0x0a, 0xff, 0xf7, 0x23, 0xf9, 0x02, 0x20, + 0x00, 0x90, 0xf5, 0xee, 0x00, 0xca, 0x68, 0xee, 0x08, 0xaa, 0x08, 0x23, + 0x0f, 0xaa, 0x08, 0xf1, 0x20, 0x01, 0x13, 0xa8, 0x48, 0xee, 0xa8, 0xaa, + 0x00, 0xf0, 0x0a, 0xfb, 0x07, 0xa8, 0x01, 0x22, 0x80, 0xec, 0x02, 0x8a, + 0x31, 0x46, 0x40, 0x46, 0x9d, 0xed, 0x0f, 0x0a, 0xdd, 0xed, 0x12, 0x0a, + 0x01, 0x24, 0x30, 0xee, 0x20, 0xca, 0xb7, 0xee, 0x00, 0x0a, 0xff, 0xf7, + 0x73, 0xf9, 0x20, 0xee, 0x2c, 0xaa, 0xb0, 0xee, 0x6a, 0x0a, 0xda, 0xed, + 0x17, 0x0a, 0x60, 0xee, 0x20, 0x0a, 0xb4, 0xee, 0x60, 0xca, 0xf1, 0xee, + 0x10, 0xfa, 0xb0, 0xee, 0x4c, 0xea, 0x0b, 0xd4, 0x20, 0xee, 0x0a, 0x0a, + 0x9a, 0xed, 0x18, 0x1a, 0x20, 0xee, 0x01, 0x0a, 0xb4, 0xee, 0x40, 0xca, + 0xf1, 0xee, 0x10, 0xfa, 0x40, 0xf1, 0x82, 0x80, 0x05, 0xa9, 0x0f, 0xa8, + 0x91, 0xec, 0x02, 0x0a, 0x80, 0xec, 0x02, 0x0a, 0x00, 0xf0, 0x93, 0xf9, + 0xb0, 0xee, 0x4d, 0x0a, 0xf0, 0xee, 0x6d, 0x0a, 0xc7, 0xf7, 0x55, 0xfa, + 0xff, 0xf7, 0x1e, 0xfe, 0x68, 0x46, 0xb0, 0xee, 0x49, 0x1a, 0x80, 0xec, + 0x02, 0x0a, 0xf0, 0xee, 0x69, 0x1a, 0xb0, 0xee, 0x4d, 0x0a, 0xf0, 0xee, + 0x6d, 0x0a, 0xc7, 0xf7, 0x59, 0xfa, 0xb6, 0x49, 0xff, 0xf7, 0x7a, 0xf9, + 0x91, 0xec, 0x02, 0x0a, 0xc7, 0xf7, 0x65, 0xfa, 0x68, 0x46, 0x00, 0xf0, + 0xad, 0xf9, 0x0f, 0xa8, 0x90, 0xec, 0x02, 0x1a, 0xc7, 0xf7, 0x4a, 0xfa, + 0xb0, 0xee, 0x40, 0xba, 0xf0, 0xee, 0x60, 0xba, 0x00, 0xf0, 0x88, 0xf9, + 0xaa, 0x48, 0xff, 0xf7, 0xfb, 0xfd, 0xff, 0xf7, 0x63, 0xf9, 0x11, 0xa9, + 0xb0, 0xee, 0x4b, 0x0a, 0xf0, 0xee, 0x6b, 0x0a, 0x30, 0x46, 0xff, 0xf7, + 0x63, 0xf8, 0x00, 0xf0, 0x79, 0xf9, 0xb0, 0xee, 0x40, 0x8a, 0x9a, 0xed, + 0x16, 0x0a, 0x2a, 0xee, 0x80, 0x0a, 0xb4, 0xee, 0x4c, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x0b, 0xa8, 0xf0, 0xee, 0x60, 0x8a, 0x58, 0xbf, 0xb0, 0xee, + 0x40, 0xca, 0x90, 0xec, 0x02, 0x0a, 0xc5, 0xf7, 0x13, 0xfd, 0x0b, 0xf1, + 0x08, 0x00, 0xb0, 0xee, 0x40, 0x9a, 0x90, 0xec, 0x02, 0x0a, 0xc5, 0xf7, + 0x0b, 0xfd, 0xda, 0xed, 0x0d, 0x0a, 0x9a, 0xed, 0x0e, 0x1a, 0x60, 0xee, + 0x89, 0x0a, 0x41, 0xee, 0x00, 0x0a, 0x02, 0x20, 0x10, 0x21, 0x01, 0x90, + 0x00, 0x91, 0xb7, 0xee, 0x00, 0x1a, 0x9a, 0xed, 0x09, 0x0a, 0x60, 0xee, + 0xa0, 0x0a, 0x70, 0xee, 0x01, 0x1a, 0x40, 0xee, 0x8c, 0xea, 0x08, 0xf5, + 0x8e, 0x73, 0x08, 0xf1, 0xdc, 0x02, 0x11, 0xa9, 0x04, 0xa8, 0xb0, 0xee, + 0x6e, 0x1a, 0xff, 0xf7, 0xc7, 0xf8, 0xff, 0xf7, 0xc6, 0xfd, 0x00, 0x28, + 0x32, 0xd0, 0x01, 0x25, 0x01, 0x22, 0xb7, 0xee, 0x00, 0x0a, 0x31, 0x46, + 0x40, 0x46, 0xff, 0xf7, 0xcf, 0xf8, 0xb0, 0xee, 0x40, 0x9a, 0x99, 0xed, + 0x06, 0x0a, 0xc7, 0xf7, 0x27, 0xfa, 0x7c, 0x48, 0xff, 0xf7, 0x9e, 0xfd, + 0xff, 0xf7, 0xb5, 0xf8, 0x99, 0xed, 0x04, 0x0a, 0xc7, 0xf7, 0x1e, 0xfa, + 0xff, 0xf7, 0x68, 0xfd, 0xff, 0xf7, 0xad, 0xf8, 0x99, 0xed, 0x03, 0x0a, + 0xc7, 0xf7, 0x16, 0xfa, 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, + 0xc7, 0xf7, 0xd0, 0xf9, 0xc5, 0xf7, 0xc0, 0xfc, 0xdf, 0xed, 0x6a, 0x0a, + 0x00, 0xf0, 0xe0, 0xf8, 0x09, 0xdb, 0xb7, 0xee, 0x00, 0x0a, 0x06, 0xe0, + 0x00, 0x00, 0x82, 0x42, 0x00, 0x00, 0x00, 0x00, 0x43, 0xf2, 0x0c, 0x27, + 0xa4, 0xe0, 0xda, 0xed, 0x07, 0x0a, 0xda, 0xed, 0x03, 0x1a, 0x00, 0xf0, + 0xcf, 0xf8, 0x58, 0xbf, 0xb0, 0xee, 0x60, 0x0a, 0x80, 0xee, 0x20, 0x0a, + 0x20, 0xee, 0x09, 0x0a, 0xda, 0xed, 0x05, 0x0a, 0x00, 0xf0, 0xc9, 0xf8, + 0x42, 0xbf, 0x9a, 0xed, 0x06, 0x1a, 0xb4, 0xee, 0x41, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x47, 0xbf, 0xda, 0xed, 0x02, 0x0a, 0x20, 0xee, 0x20, 0x0a, + 0x9a, 0xed, 0x01, 0x1a, 0x20, 0xee, 0x01, 0x0a, 0xda, 0xed, 0x04, 0x0a, + 0x00, 0xf0, 0xb0, 0xf8, 0x4c, 0xbf, 0xb0, 0xee, 0x40, 0x1a, 0xb0, 0xee, + 0x60, 0x1a, 0xf4, 0xee, 0x41, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x05, 0xd5, + 0x00, 0xf0, 0xa4, 0xf8, 0x04, 0xd4, 0xb0, 0xee, 0x60, 0x0a, 0x01, 0xe0, + 0xb0, 0xee, 0x61, 0x0a, 0xc5, 0xf7, 0x56, 0xfc, 0x08, 0xf5, 0x4f, 0x70, + 0x09, 0xf1, 0x5c, 0x02, 0xd0, 0xed, 0x00, 0x0a, 0x00, 0xf0, 0x99, 0xf8, + 0x5f, 0xbf, 0x9a, 0xed, 0x08, 0x1a, 0x60, 0xee, 0x81, 0x0a, 0xf4, 0xee, + 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x58, 0xbf, 0xb0, 0xee, 0x60, 0x0a, + 0x80, 0xed, 0x00, 0x0a, 0x08, 0xf5, 0x53, 0x7b, 0x02, 0x99, 0x81, 0x60, + 0x08, 0xf5, 0x5a, 0x79, 0x93, 0x78, 0x03, 0x73, 0x4a, 0x46, 0x59, 0x46, + 0x40, 0x46, 0xf0, 0xee, 0x00, 0x0a, 0x60, 0xee, 0x20, 0x0a, 0x00, 0xee, + 0x80, 0x9a, 0xdd, 0xed, 0x03, 0x0a, 0xb7, 0xee, 0x00, 0x0a, 0xff, 0xf7, + 0xae, 0xf8, 0x00, 0x94, 0x5f, 0xf0, 0x01, 0x03, 0x78, 0xa2, 0x59, 0x46, + 0x30, 0x46, 0xfe, 0xf7, 0xe6, 0xfe, 0x08, 0xf5, 0x5d, 0x70, 0x01, 0x23, + 0x80, 0xec, 0x02, 0x0a, 0x00, 0x94, 0x49, 0x46, 0x73, 0xa2, 0x30, 0x46, + 0xfe, 0xf7, 0xdb, 0xfe, 0x08, 0xf5, 0x5f, 0x70, 0x29, 0xee, 0x2c, 0xaa, + 0x24, 0xe0, 0x00, 0x22, 0x31, 0x46, 0x40, 0x46, 0xfe, 0xf7, 0x44, 0xfe, + 0x99, 0xed, 0x03, 0x0a, 0xc7, 0xf7, 0x78, 0xf9, 0xff, 0xf7, 0x09, 0xf8, + 0x99, 0xed, 0x0d, 0x0a, 0xc7, 0xf7, 0x72, 0xf9, 0x21, 0x48, 0xff, 0xf7, + 0xe9, 0xfc, 0xff, 0xf7, 0xf7, 0xfc, 0x99, 0xed, 0x0c, 0x0a, 0xc7, 0xf7, + 0x69, 0xf9, 0x00, 0xf0, 0x4c, 0xf8, 0xc7, 0xf7, 0x12, 0xf9, 0xb0, 0xee, + 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, 0xc7, 0xf7, 0x45, 0xf9, 0x07, 0xa8, + 0x9f, 0xed, 0x13, 0xea, 0x80, 0xec, 0x02, 0x0a, 0x4d, 0x98, 0x02, 0x99, + 0x01, 0x60, 0x00, 0xf1, 0x0c, 0x02, 0x80, 0xed, 0x01, 0xaa, 0x09, 0xa9, + 0x82, 0xec, 0x02, 0xfa, 0x00, 0xf1, 0x14, 0x03, 0x91, 0xec, 0x02, 0x0a, + 0x83, 0xec, 0x02, 0x0a, 0x07, 0xab, 0x00, 0xf1, 0x1c, 0x02, 0x93, 0xec, + 0x02, 0x1a, 0x82, 0xec, 0x02, 0x1a, 0x80, 0xed, 0x02, 0xea, 0x00, 0xf8, + 0x24, 0x4f, 0x45, 0x70, 0x32, 0xb0, 0x38, 0x46, 0xbd, 0xec, 0x10, 0x8b, + 0xbd, 0xe8, 0xf2, 0x8f, 0x01, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0xac, 0x8f, 0x00, 0x21, 0x04, 0x76, 0x02, 0x21, 0x00, 0x00, 0x80, 0xbf, + 0xa4, 0x8f, 0x00, 0x21, 0xb4, 0x8f, 0x00, 0x21, 0xb4, 0xee, 0x60, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x70, 0x47, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x70, 0x47, 0xb0, 0xee, 0x40, 0xaa, 0xf0, 0xee, 0x60, 0xaa, + 0x70, 0x47, 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, 0x70, 0x47, + 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, 0xb0, 0xee, 0x4f, 0x0a, + 0xf0, 0xee, 0x6f, 0x0a, 0xc7, 0xf7, 0xb9, 0xb8, 0xb0, 0xee, 0x49, 0x1a, + 0xf0, 0xee, 0x69, 0x1a, 0xb0, 0xee, 0x4f, 0x0a, 0xf0, 0xee, 0x6f, 0x0a, + 0xc7, 0xf7, 0xc2, 0xb8, 0xb0, 0xee, 0x4b, 0x0a, 0xf0, 0xee, 0x6b, 0x0a, + 0xc7, 0xf7, 0xcf, 0xb8, 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, + 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, 0xc7, 0xf7, 0xc5, 0xb8, + 0x0b, 0xa8, 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, 0x60, 0x8a, 0x90, 0xec, + 0x02, 0x1a, 0x70, 0x47, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, + 0x9b, 0xec, 0x02, 0x0a, 0xc7, 0xf7, 0xa2, 0xb8, 0xb0, 0xee, 0x40, 0x9a, + 0xf0, 0xee, 0x60, 0x9a, 0x90, 0xec, 0x02, 0x1a, 0xb0, 0xee, 0x48, 0x0a, + 0xf0, 0xee, 0x68, 0x0a, 0xc7, 0xf7, 0xa9, 0xb8, 0x30, 0xb5, 0x04, 0x46, + 0x00, 0x20, 0x00, 0x25, 0x00, 0xe0, 0x6d, 0x1c, 0x8d, 0x42, 0x08, 0xd2, + 0x54, 0xf8, 0x25, 0x30, 0x5b, 0x00, 0x1a, 0x16, 0x52, 0x1c, 0xf6, 0xd1, + 0x1b, 0x02, 0xf4, 0xd0, 0x01, 0x20, 0x30, 0xbd, 0x70, 0xb5, 0x0c, 0x46, + 0x08, 0x21, 0x20, 0x46, 0xff, 0xf7, 0xe8, 0xff, 0x06, 0x46, 0x24, 0x21, + 0x04, 0xf1, 0x20, 0x00, 0xff, 0xf7, 0xe2, 0xff, 0x06, 0x43, 0x10, 0x21, + 0x04, 0xf1, 0xdc, 0x00, 0xff, 0xf7, 0xdc, 0xff, 0x06, 0x43, 0x88, 0x21, + 0x04, 0xf5, 0x8e, 0x70, 0xff, 0xf7, 0xd6, 0xff, 0x00, 0x25, 0x06, 0x43, + 0x18, 0xbf, 0x43, 0xf2, 0x0d, 0x25, 0x28, 0x46, 0x70, 0xbd, 0x00, 0x00, + 0x07, 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb5, 0x2d, 0xed, 0x04, 0x8b, 0xf0, 0xee, 0x40, 0x8a, 0x18, 0xee, + 0x90, 0x1a, 0x49, 0x00, 0x08, 0x16, 0x40, 0x1c, 0xb0, 0xee, 0x60, 0x8a, + 0x06, 0xd1, 0x09, 0x02, 0x04, 0xd0, 0x18, 0xee, 0x10, 0x0a, 0x41, 0x00, + 0x14, 0xd0, 0x43, 0xe0, 0x18, 0xee, 0x10, 0x1a, 0x49, 0x00, 0x08, 0x16, + 0x40, 0x1c, 0x1a, 0xd1, 0x09, 0x02, 0x18, 0xd0, 0x18, 0xee, 0x90, 0x1a, + 0x48, 0x00, 0x00, 0x16, 0x40, 0x1c, 0x08, 0xd1, 0x49, 0x02, 0x06, 0xd1, + 0x18, 0xee, 0x90, 0x0a, 0xc0, 0x0f, 0x07, 0xd1, 0xb0, 0xee, 0x68, 0x9a, + 0x01, 0xe0, 0xb0, 0xee, 0x48, 0x9a, 0xf0, 0xee, 0x48, 0x8a, 0x73, 0xe0, + 0x9f, 0xed, 0x3e, 0x9a, 0xdf, 0xed, 0x3d, 0x8a, 0x6e, 0xe0, 0x18, 0xee, + 0x90, 0x1a, 0x48, 0x00, 0x00, 0x16, 0x40, 0x1c, 0x12, 0xd1, 0x49, 0x02, + 0x10, 0xd1, 0x18, 0xee, 0x90, 0x0a, 0xc0, 0x0f, 0x18, 0xee, 0x10, 0x1a, + 0x17, 0xd1, 0x48, 0x00, 0x00, 0x16, 0x40, 0x1c, 0x31, 0xd1, 0x49, 0x02, + 0x2f, 0xd1, 0xb0, 0xee, 0x68, 0x9a, 0xdf, 0xed, 0x32, 0x8a, 0x55, 0xe0, + 0x18, 0xee, 0x10, 0x1a, 0x48, 0x00, 0x00, 0x16, 0x40, 0x1c, 0x35, 0xd1, + 0x49, 0x02, 0x33, 0xd1, 0xdf, 0xed, 0x2c, 0x8a, 0xb0, 0xee, 0x68, 0x9a, + 0x48, 0xe0, 0x48, 0x00, 0x00, 0x16, 0x40, 0x1c, 0x0a, 0xd1, 0x49, 0x02, + 0x08, 0xd1, 0x18, 0xee, 0x10, 0x1a, 0x01, 0xf0, 0x00, 0x40, 0x9f, 0xed, + 0x24, 0x9a, 0x08, 0xee, 0x90, 0x0a, 0x39, 0xe0, 0xb0, 0xee, 0x48, 0x0a, + 0xc6, 0xf7, 0xb4, 0xf9, 0xdf, 0xed, 0x1f, 0x8a, 0x20, 0xee, 0x28, 0x9a, + 0xb0, 0xee, 0x48, 0x0a, 0xc6, 0xf7, 0xae, 0xf9, 0x60, 0xee, 0x28, 0x8a, + 0x2a, 0xe0, 0x18, 0xee, 0x10, 0x0a, 0x40, 0x00, 0xaa, 0xd0, 0xb0, 0xee, + 0x48, 0x0a, 0xc6, 0xf7, 0xa1, 0xf9, 0x28, 0xee, 0x80, 0x9a, 0xb0, 0xee, + 0x48, 0x0a, 0xc6, 0xf7, 0x9d, 0xf9, 0x68, 0xee, 0x80, 0x8a, 0x19, 0xe0, + 0xb0, 0xee, 0x48, 0x0a, 0xc6, 0xf7, 0x94, 0xf9, 0xf0, 0xee, 0x40, 0x0a, + 0x00, 0x20, 0xb0, 0xee, 0x68, 0x0a, 0xc6, 0xf7, 0x25, 0xfc, 0xb0, 0xee, + 0x40, 0x9a, 0xb0, 0xee, 0x48, 0x0a, 0xc6, 0xf7, 0x89, 0xf9, 0xf0, 0xee, + 0x40, 0x0a, 0x00, 0x20, 0xb0, 0xee, 0x68, 0x0a, 0xc6, 0xf7, 0x18, 0xfc, + 0xf0, 0xee, 0x40, 0x8a, 0xf0, 0xee, 0x68, 0x0a, 0xb0, 0xee, 0x49, 0x0a, + 0xbd, 0xec, 0x04, 0x8b, 0xbd, 0xe8, 0x01, 0x40, 0x00, 0xf0, 0x4e, 0xbb, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x7f, 0x3e, 0xb5, 0x02, 0x90, + 0x0d, 0x46, 0x01, 0x20, 0x01, 0x90, 0x1c, 0x46, 0x06, 0x99, 0x00, 0x94, + 0x13, 0x46, 0x22, 0x46, 0x28, 0x46, 0xc7, 0xf7, 0x92, 0xfa, 0x37, 0xbd, + 0x1f, 0xb5, 0x02, 0x92, 0x0c, 0x46, 0x06, 0x9a, 0x00, 0x92, 0x19, 0x46, + 0x01, 0x91, 0x03, 0x46, 0x0a, 0x46, 0x20, 0x46, 0xc7, 0xf7, 0x38, 0xf9, + 0x1f, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x47, 0x2d, 0xed, 0x02, 0x8b, + 0xad, 0xf5, 0x08, 0x7d, 0x80, 0x46, 0x94, 0x9d, 0x95, 0x9f, 0xdd, 0xf8, + 0x48, 0x92, 0x48, 0xa8, 0x02, 0x90, 0x0c, 0x46, 0x16, 0x46, 0x9a, 0x46, + 0x01, 0x95, 0xb0, 0xee, 0x40, 0x8a, 0x00, 0x97, 0x23, 0x46, 0x2a, 0x46, + 0x29, 0x46, 0x48, 0x46, 0xc7, 0xf7, 0xdc, 0xf8, 0x04, 0xa8, 0x02, 0x90, + 0x01, 0x97, 0x00, 0x95, 0x48, 0xab, 0x2a, 0x46, 0x39, 0x46, 0x20, 0x46, + 0xc7, 0xf7, 0xc8, 0xfa, 0x04, 0xab, 0xb0, 0xee, 0x48, 0x0a, 0x3a, 0x46, + 0x39, 0x46, 0x04, 0xa8, 0xc7, 0xf7, 0x56, 0xf9, 0x00, 0x97, 0x3b, 0x46, + 0x04, 0xaa, 0x31, 0x46, 0x04, 0xa8, 0xc7, 0xf7, 0x3e, 0xfb, 0x02, 0x2f, + 0x03, 0xd1, 0x04, 0xa9, 0x04, 0xa8, 0xc7, 0xf7, 0xe0, 0xfa, 0x93, 0x9c, + 0x01, 0x26, 0x00, 0x2c, 0x3d, 0xd0, 0x94, 0xed, 0x00, 0x8a, 0xb5, 0xee, + 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x36, 0xdd, 0x02, 0x2f, 0x0f, 0xd1, + 0x00, 0xf0, 0x60, 0xf8, 0x01, 0x21, 0x40, 0x46, 0xc7, 0xf7, 0xa0, 0xfa, + 0x03, 0xa8, 0x02, 0x21, 0x02, 0x90, 0x01, 0x91, 0x00, 0x96, 0x43, 0x46, + 0x02, 0x22, 0x01, 0x21, 0x08, 0xa8, 0x0e, 0xe0, 0x00, 0x96, 0x3b, 0x46, + 0x08, 0xaa, 0x41, 0x46, 0x04, 0xa8, 0x00, 0xf0, 0xed, 0xfb, 0x03, 0xa8, + 0x02, 0x90, 0x01, 0x97, 0x01, 0x21, 0x00, 0x91, 0x08, 0xab, 0x3a, 0x46, + 0x40, 0x46, 0xc7, 0xf7, 0x96, 0xfa, 0x9d, 0xed, 0x03, 0x0a, 0xb5, 0xee, + 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xd8, 0xbf, 0x9f, 0xed, 0x1b, 0x0a, + 0xc5, 0xf7, 0xe8, 0xf9, 0xb4, 0xee, 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, + 0x84, 0xed, 0x00, 0x0a, 0x48, 0xbf, 0x00, 0x26, 0x23, 0xd4, 0x02, 0x2f, + 0x06, 0xd1, 0x00, 0xf0, 0x29, 0xf8, 0x29, 0x46, 0x48, 0xa8, 0xc7, 0xf7, + 0x69, 0xfa, 0x06, 0xe0, 0x00, 0x95, 0x3b, 0x46, 0x08, 0xaa, 0x04, 0xa9, + 0x48, 0xa8, 0x00, 0xf0, 0xd2, 0xfb, 0xcd, 0xf8, 0x08, 0xa0, 0x01, 0x96, + 0x00, 0x97, 0x43, 0x46, 0x3a, 0x46, 0x29, 0x46, 0x08, 0xa8, 0xc7, 0xf7, + 0xbd, 0xf9, 0xcd, 0xf8, 0x08, 0x90, 0x01, 0x97, 0x00, 0x95, 0x48, 0xab, + 0x3a, 0x46, 0x29, 0x46, 0x08, 0xa8, 0xc7, 0xf7, 0x39, 0xf9, 0x0d, 0xf5, + 0x08, 0x7d, 0x30, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf0, 0x87, + 0x00, 0x00, 0x00, 0x00, 0x08, 0xa8, 0x02, 0x21, 0x02, 0x90, 0x01, 0x91, + 0x02, 0x22, 0x00, 0x92, 0x04, 0xab, 0x70, 0x47, 0x2d, 0xe9, 0xfe, 0x4f, + 0x2d, 0xed, 0x04, 0x8b, 0x83, 0x46, 0x86, 0xb0, 0x00, 0x20, 0x00, 0x26, + 0x00, 0x27, 0x13, 0xe0, 0x55, 0x18, 0x4b, 0xf8, 0x25, 0x60, 0x03, 0xfb, + 0x02, 0x05, 0x4b, 0xf8, 0x25, 0x70, 0x52, 0x1c, 0x9a, 0x42, 0xf5, 0xdb, + 0x0c, 0x99, 0xdf, 0xf8, 0xfc, 0x33, 0x01, 0xeb, 0xc0, 0x02, 0x93, 0xec, + 0x02, 0x1a, 0x82, 0xec, 0x02, 0x1a, 0x40, 0x1c, 0x9d, 0xf8, 0x2c, 0x10, + 0x00, 0x91, 0x88, 0x42, 0x0e, 0xda, 0x41, 0x43, 0x43, 0x18, 0x0b, 0xeb, + 0x83, 0x02, 0xd2, 0xed, 0x00, 0x0a, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0xe5, 0xd5, 0x9d, 0xf8, 0x2c, 0x30, 0x00, 0x22, 0xdf, 0xe7, + 0x00, 0x25, 0x1a, 0xe0, 0x43, 0x18, 0x0b, 0xeb, 0x83, 0x03, 0x02, 0xfb, + 0x00, 0x57, 0xd3, 0xed, 0x00, 0x0a, 0x0b, 0xeb, 0x87, 0x03, 0x40, 0x1c, + 0x93, 0xed, 0x00, 0x1a, 0x21, 0xee, 0x01, 0x1a, 0x00, 0xee, 0xa0, 0x1a, + 0x30, 0xee, 0x41, 0x0a, 0xa8, 0x42, 0xeb, 0xdb, 0xc5, 0xf7, 0x60, 0xf9, + 0x0b, 0xeb, 0x86, 0x00, 0x6d, 0x1c, 0x80, 0xed, 0x00, 0x0a, 0x9d, 0xf8, + 0x2c, 0x00, 0x00, 0x90, 0x85, 0x42, 0x80, 0xf2, 0x85, 0x80, 0x68, 0x43, + 0x00, 0x26, 0x05, 0x90, 0x4f, 0xe0, 0x00, 0x9c, 0xdd, 0xf8, 0x14, 0xa0, + 0xdd, 0xf8, 0x04, 0x80, 0x7c, 0x43, 0x05, 0xeb, 0x04, 0x09, 0x34, 0x19, + 0xba, 0x44, 0x0b, 0xeb, 0x8a, 0x00, 0x0b, 0xeb, 0x84, 0x01, 0xb8, 0x44, + 0x90, 0xed, 0x00, 0x0a, 0xd1, 0xed, 0x00, 0x0a, 0x0b, 0xeb, 0x89, 0x00, + 0x00, 0xf0, 0x83, 0xf9, 0x01, 0xee, 0x60, 0x0a, 0xc6, 0xf7, 0xa6, 0xfe, + 0x00, 0xf0, 0x94, 0xf9, 0x0b, 0xeb, 0x89, 0x00, 0x0b, 0xeb, 0x84, 0x01, + 0x00, 0xf0, 0x42, 0xf9, 0x90, 0xed, 0x00, 0x0a, 0xd1, 0xed, 0x00, 0x0a, + 0x0b, 0xeb, 0x8a, 0x00, 0x00, 0xf0, 0x6f, 0xf9, 0x01, 0xee, 0x20, 0x0a, + 0xc6, 0xf7, 0x92, 0xfe, 0x00, 0xf0, 0x59, 0xf9, 0x00, 0xf0, 0x5d, 0xf9, + 0x00, 0xf0, 0x46, 0xf9, 0x7f, 0x1c, 0xb7, 0x42, 0xc7, 0xdb, 0x04, 0x98, + 0x0b, 0xeb, 0x80, 0x01, 0x03, 0x98, 0xd1, 0xed, 0x00, 0x0a, 0xb7, 0xee, + 0x00, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0x0b, 0xeb, 0x80, 0x01, 0x60, 0xee, + 0x09, 0x0a, 0xc1, 0xed, 0x00, 0x0a, 0x20, 0xee, 0x29, 0x0a, 0x02, 0x9a, + 0x0b, 0xeb, 0x82, 0x00, 0x80, 0xed, 0x00, 0x0a, 0x76, 0x1c, 0xae, 0x42, + 0x23, 0xda, 0x00, 0x99, 0x71, 0x43, 0x01, 0x91, 0x72, 0x18, 0x0b, 0xeb, + 0x82, 0x01, 0x04, 0x92, 0x00, 0xf0, 0x19, 0xf9, 0xf2, 0xdd, 0x05, 0x98, + 0x30, 0x18, 0x02, 0x90, 0x00, 0x27, 0x0b, 0xeb, 0x80, 0x00, 0x00, 0xf0, + 0x49, 0xf9, 0x00, 0xf0, 0x4b, 0xf9, 0x01, 0x98, 0x28, 0x18, 0x03, 0x90, + 0xb0, 0xee, 0x40, 0x8a, 0x0b, 0xeb, 0x80, 0x00, 0xf0, 0xee, 0x60, 0x8a, + 0x00, 0xf0, 0x3c, 0xf9, 0x00, 0xf0, 0x17, 0xf9, 0x00, 0xf0, 0x06, 0xf9, + 0xbf, 0xe7, 0x9d, 0xf8, 0x2c, 0x20, 0x02, 0xfb, 0x05, 0xf1, 0x6e, 0x18, + 0x0b, 0xeb, 0x86, 0x00, 0x90, 0xed, 0x00, 0x0a, 0x00, 0x20, 0x6b, 0xe7, + 0x00, 0x26, 0xdf, 0xf8, 0x70, 0x92, 0x4c, 0xe0, 0x0c, 0x99, 0x01, 0xeb, + 0xc6, 0x02, 0x90, 0xec, 0x02, 0x0a, 0x82, 0xec, 0x02, 0x0a, 0x43, 0xe0, + 0x07, 0xeb, 0xc4, 0x00, 0xdd, 0xf8, 0x00, 0xa0, 0x01, 0x9e, 0x90, 0xec, + 0x02, 0x1a, 0x0a, 0xfb, 0x04, 0x5a, 0x07, 0xeb, 0xc4, 0x01, 0xa6, 0x19, + 0x0b, 0xeb, 0x8a, 0x00, 0x91, 0xec, 0x02, 0x0a, 0x0b, 0xeb, 0x86, 0x01, + 0x90, 0xed, 0x00, 0x2a, 0xd1, 0xed, 0x00, 0x2a, 0x22, 0xee, 0x20, 0x0a, + 0x02, 0xee, 0xc1, 0x0a, 0xc6, 0xf7, 0x18, 0xfe, 0x00, 0xf0, 0xbf, 0xf8, + 0x07, 0xeb, 0xc4, 0x00, 0x00, 0xf0, 0xb6, 0xf8, 0x07, 0xeb, 0xc4, 0x01, + 0x90, 0xec, 0x02, 0x0a, 0x91, 0xec, 0x02, 0x1a, 0x0b, 0xeb, 0x8a, 0x00, + 0x0b, 0xeb, 0x86, 0x01, 0x00, 0xf0, 0xe8, 0xf8, 0x00, 0xf0, 0xcd, 0xf8, + 0x00, 0xf0, 0xd1, 0xf8, 0x00, 0xf0, 0xba, 0xf8, 0x64, 0x1e, 0x00, 0x2c, + 0xc8, 0xd5, 0x0b, 0xeb, 0x88, 0x00, 0x0c, 0x97, 0x2e, 0x46, 0x00, 0xf0, + 0xe3, 0xf8, 0x00, 0xf0, 0xb4, 0xf8, 0x0c, 0x98, 0x00, 0xeb, 0xc6, 0x01, + 0x81, 0xec, 0x02, 0x0a, 0x76, 0x1c, 0x9d, 0xf8, 0x2c, 0x50, 0xae, 0x42, + 0x70, 0xda, 0x75, 0x43, 0x06, 0xeb, 0x05, 0x08, 0x0b, 0xeb, 0x88, 0x01, + 0x01, 0x95, 0x48, 0x46, 0x00, 0xf0, 0x95, 0xf8, 0xa4, 0xdd, 0x0a, 0x98, + 0x00, 0xeb, 0xc6, 0x01, 0x74, 0x1e, 0x91, 0xed, 0x01, 0x0a, 0xc6, 0xf7, + 0xd9, 0xfd, 0x00, 0xf0, 0x80, 0xf8, 0x0a, 0x98, 0x00, 0xeb, 0xc6, 0x01, + 0x00, 0xf0, 0x76, 0xf8, 0x91, 0xed, 0x00, 0x0a, 0xc6, 0xf7, 0xce, 0xfd, + 0x00, 0xf0, 0x95, 0xf8, 0x9d, 0xf8, 0x2c, 0x00, 0x0c, 0x9f, 0x00, 0x90, + 0x00, 0xf0, 0x80, 0xf8, 0x35, 0x46, 0xc4, 0xe7, 0x0c, 0x99, 0x01, 0xeb, + 0xc5, 0x02, 0x90, 0xec, 0x02, 0x0a, 0x82, 0xec, 0x02, 0x0a, 0x41, 0xe0, + 0x06, 0xeb, 0xc4, 0x00, 0x06, 0xeb, 0xc4, 0x01, 0xdd, 0xf8, 0x00, 0x90, + 0x90, 0xec, 0x02, 0x0a, 0x08, 0xfb, 0x04, 0x5a, 0x91, 0xec, 0x02, 0x1a, + 0xa1, 0x44, 0x0b, 0xeb, 0x8a, 0x00, 0x0b, 0xeb, 0x89, 0x01, 0x00, 0xf0, + 0x8b, 0xf8, 0x00, 0xf0, 0x97, 0xf8, 0x06, 0xeb, 0xc4, 0x00, 0x00, 0xf0, + 0x47, 0xf8, 0x06, 0xeb, 0xc4, 0x01, 0x90, 0xec, 0x02, 0x0a, 0x91, 0xec, + 0x02, 0x1a, 0x0b, 0xeb, 0x89, 0x00, 0x0b, 0xeb, 0x8a, 0x01, 0x90, 0xed, + 0x00, 0x2a, 0xd1, 0xed, 0x00, 0x0a, 0x22, 0xee, 0x00, 0x0a, 0x00, 0xee, + 0xe1, 0x0a, 0xc6, 0xf7, 0x8f, 0xfd, 0x00, 0xf0, 0x56, 0xf8, 0x00, 0xf0, + 0x5a, 0xf8, 0x00, 0xf0, 0x43, 0xf8, 0x64, 0x1c, 0x44, 0x45, 0xc9, 0xdb, + 0x0b, 0xeb, 0x87, 0x00, 0x0c, 0x96, 0x00, 0xf0, 0x6d, 0xf8, 0x00, 0xf0, + 0x3e, 0xf8, 0x0c, 0x98, 0x00, 0xeb, 0xc5, 0x01, 0x81, 0xec, 0x02, 0x0a, + 0x6d, 0x1e, 0x16, 0xd4, 0x9d, 0xf8, 0x2c, 0x70, 0x37, 0x48, 0x07, 0xfb, + 0x05, 0x57, 0x0b, 0xeb, 0x87, 0x01, 0x00, 0xf0, 0x22, 0xf8, 0xa9, 0xdd, + 0x0c, 0x98, 0x9d, 0xf8, 0x2c, 0x80, 0x0c, 0x9e, 0x00, 0xeb, 0xc5, 0x01, + 0x08, 0xfb, 0x05, 0xf0, 0x91, 0xec, 0x02, 0x9a, 0x6c, 0x1c, 0x00, 0x90, + 0xd8, 0xe7, 0x06, 0xb0, 0xbd, 0xec, 0x04, 0x8b, 0xbd, 0xe8, 0xf7, 0x8f, + 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, 0x60, 0x8a, 0x70, 0x47, 0x09, 0xf1, + 0x08, 0x00, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x90, 0xec, + 0x02, 0x0a, 0xc6, 0xf7, 0x20, 0xbd, 0x91, 0xed, 0x00, 0x0a, 0xb5, 0xee, + 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x70, 0x47, 0xb0, 0xee, 0x40, 0x9a, + 0xf0, 0xee, 0x60, 0x9a, 0x70, 0x47, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, + 0x60, 0x1a, 0xb0, 0xee, 0x49, 0x0a, 0xf0, 0xee, 0x69, 0x0a, 0xc6, 0xf7, + 0x1d, 0xbd, 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, 0xc6, 0xf7, + 0xde, 0xbc, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0xb0, 0xee, + 0x49, 0x0a, 0xf0, 0xee, 0x69, 0x0a, 0xc6, 0xf7, 0xe7, 0xbc, 0x0b, 0xeb, + 0x88, 0x01, 0x20, 0xee, 0x20, 0x0a, 0x90, 0xed, 0x00, 0x1a, 0xd1, 0xed, + 0x00, 0x0a, 0x70, 0x47, 0x90, 0xed, 0x00, 0x2a, 0xd1, 0xed, 0x00, 0x0a, + 0x22, 0xee, 0x00, 0x0a, 0x00, 0xee, 0xa1, 0x0a, 0xc6, 0xf7, 0x14, 0xbd, + 0x90, 0xed, 0x00, 0x0a, 0xc6, 0xf7, 0x10, 0xbd, 0x05, 0x48, 0xb0, 0xee, + 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x90, 0xec, 0x02, 0x0a, 0xc6, 0xf7, + 0xda, 0xbc, 0x00, 0x00, 0x58, 0x40, 0x00, 0x21, 0x60, 0x40, 0x00, 0x21, + 0x08, 0xb4, 0x01, 0xee, 0x10, 0x1a, 0x69, 0x46, 0x01, 0xee, 0x90, 0x2a, + 0x91, 0xec, 0x02, 0x0a, 0x31, 0xee, 0x00, 0x3a, 0x31, 0xee, 0xa0, 0x0a, + 0x0b, 0xe0, 0x08, 0xb4, 0x01, 0xee, 0x10, 0x1a, 0x69, 0x46, 0x01, 0xee, + 0x90, 0x2a, 0x91, 0xec, 0x02, 0x0a, 0x31, 0xee, 0x40, 0x3a, 0x31, 0xee, + 0xe0, 0x0a, 0xb0, 0xee, 0x43, 0x2a, 0xf0, 0xee, 0x40, 0x2a, 0x80, 0xec, + 0x02, 0x2a, 0x01, 0xb0, 0x70, 0x47, 0x08, 0xb4, 0x01, 0xee, 0x10, 0x1a, + 0x69, 0x46, 0x01, 0xee, 0x90, 0x2a, 0x91, 0xec, 0x02, 0x0a, 0x21, 0xee, + 0x00, 0x3a, 0x21, 0xee, 0x20, 0x1a, 0x01, 0xee, 0xe0, 0x3a, 0x01, 0xee, + 0x80, 0x1a, 0xb0, 0xee, 0x43, 0x2a, 0xf0, 0xee, 0x41, 0x2a, 0xe6, 0xe7, + 0x08, 0xb4, 0x01, 0xee, 0x10, 0x1a, 0x69, 0x46, 0x01, 0xee, 0x90, 0x2a, + 0x91, 0xec, 0x02, 0x0a, 0x20, 0xee, 0x00, 0x3a, 0x61, 0xee, 0x00, 0x3a, + 0x21, 0xee, 0x80, 0x0a, 0x00, 0xee, 0xa0, 0x3a, 0x41, 0xee, 0xa0, 0x3a, + 0x01, 0xee, 0x60, 0x0a, 0xc3, 0xee, 0x83, 0x3a, 0x80, 0xee, 0x03, 0x0a, + 0xb0, 0xee, 0x63, 0x2a, 0xc9, 0xe7, 0x00, 0x00, 0x00, 0xee, 0x10, 0x1a, + 0x9f, 0xed, 0x07, 0x1a, 0xf0, 0xee, 0x40, 0x1a, 0x06, 0xe0, 0x00, 0x00, + 0x00, 0xee, 0x10, 0x1a, 0xb0, 0xee, 0x40, 0x1a, 0xdf, 0xed, 0x02, 0x1a, + 0x80, 0xec, 0x02, 0x1a, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x82, 0xb0, 0x8d, 0xed, 0x00, 0x0a, 0xcd, 0xed, 0x01, 0x0a, 0x02, 0xb0, + 0x70, 0x47, 0x00, 0x00, 0xf8, 0xb5, 0x0d, 0x46, 0x16, 0x46, 0x04, 0x46, + 0x1f, 0x46, 0x31, 0x46, 0x00, 0xf0, 0x8b, 0xf8, 0x01, 0x20, 0x00, 0x90, + 0x33, 0x46, 0x3a, 0x46, 0x29, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x01, 0xf8, + 0xf1, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x02, 0x8b, 0x82, 0xb0, + 0x80, 0x46, 0x0e, 0x9c, 0x0e, 0x46, 0x92, 0x46, 0x99, 0x46, 0x00, 0x27, + 0x1f, 0xe0, 0x00, 0x20, 0x1a, 0xe0, 0x13, 0x18, 0x08, 0xeb, 0x83, 0x03, + 0x93, 0xed, 0x00, 0x0a, 0x04, 0xfb, 0x02, 0xf3, 0x0a, 0xeb, 0x83, 0x03, + 0x00, 0xf0, 0xdb, 0xf8, 0xba, 0x42, 0xf2, 0xd3, 0x58, 0xf8, 0x21, 0x00, + 0x00, 0xf0, 0x78, 0xf9, 0x00, 0xf0, 0xd9, 0xf8, 0x00, 0xf0, 0x59, 0xf8, + 0xdd, 0xe9, 0x00, 0x23, 0xf9, 0xf7, 0x8a, 0xfa, 0x00, 0xf0, 0x92, 0xf9, + 0x4a, 0xf8, 0x25, 0x00, 0x7f, 0x1c, 0x4f, 0x45, 0x0c, 0xd2, 0x00, 0xf0, + 0xb7, 0xf8, 0x04, 0xfb, 0x07, 0xf5, 0x00, 0xf0, 0xb9, 0xf8, 0xd6, 0xdd, + 0x06, 0xeb, 0x85, 0x02, 0x92, 0xed, 0x00, 0x8a, 0x00, 0x22, 0xdd, 0xe7, + 0xa9, 0xf1, 0x01, 0x0b, 0x00, 0x25, 0x5e, 0x46, 0x2c, 0xe0, 0x00, 0x20, + 0x27, 0xe0, 0x09, 0xfb, 0x00, 0x61, 0x04, 0xfb, 0x00, 0xf2, 0x08, 0xeb, + 0x81, 0x01, 0x0a, 0xeb, 0x82, 0x03, 0x91, 0xed, 0x00, 0x0a, 0x00, 0xf0, + 0xa7, 0xf8, 0x40, 0x1e, 0x86, 0x42, 0xf0, 0xd3, 0x09, 0xfb, 0x06, 0x60, + 0x08, 0xeb, 0x80, 0x00, 0x90, 0xed, 0x00, 0x0a, 0xb5, 0xee, 0x40, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0xe3, 0xdd, 0x10, 0xee, 0x10, 0x0a, 0x00, 0xf0, + 0x37, 0xf9, 0x00, 0xf0, 0x98, 0xf8, 0x00, 0xf0, 0x18, 0xf8, 0xdd, 0xe9, + 0x00, 0x23, 0xf9, 0xf7, 0x49, 0xfa, 0x00, 0xf0, 0x51, 0xf9, 0x4a, 0xf8, + 0x27, 0x00, 0x76, 0x1e, 0x00, 0x2e, 0x0a, 0xd4, 0x6d, 0x1c, 0xa9, 0x45, + 0x07, 0xd3, 0x04, 0xfb, 0x06, 0xf7, 0x0a, 0xeb, 0x87, 0x00, 0x90, 0xed, + 0x00, 0x8a, 0x58, 0x46, 0xd4, 0xe7, 0x02, 0xb0, 0x66, 0xe0, 0xcd, 0xe9, + 0x00, 0x01, 0x18, 0xee, 0x10, 0x0a, 0x00, 0xf0, 0x15, 0xb9, 0x2d, 0xe9, + 0xf8, 0x4f, 0x80, 0x46, 0x2d, 0xed, 0x02, 0x8b, 0x89, 0x46, 0x00, 0x20, + 0x00, 0x24, 0x07, 0xe0, 0x09, 0xfb, 0x00, 0x13, 0x48, 0xf8, 0x23, 0x40, + 0x49, 0x1c, 0x49, 0x45, 0xf8, 0xd3, 0x10, 0x46, 0x48, 0x45, 0x13, 0xd2, + 0x42, 0x1c, 0x11, 0x46, 0xf7, 0xe7, 0x81, 0x19, 0x08, 0xeb, 0x81, 0x01, + 0x40, 0x1c, 0xd1, 0xed, 0x00, 0x0a, 0x00, 0xee, 0xe0, 0x0a, 0xa0, 0x42, + 0xf5, 0xd3, 0xc4, 0xf7, 0x6f, 0xfe, 0x08, 0xeb, 0x85, 0x00, 0x64, 0x1c, + 0x80, 0xed, 0x00, 0x0a, 0x4c, 0x45, 0x37, 0xd2, 0x00, 0x27, 0x09, 0xfb, + 0x04, 0xf6, 0x1e, 0xe0, 0x93, 0x19, 0x08, 0xeb, 0x83, 0x03, 0x93, 0xed, + 0x00, 0x0a, 0x13, 0x18, 0x08, 0xeb, 0x83, 0x03, 0x00, 0xf0, 0x3b, 0xf8, + 0xba, 0x42, 0xf3, 0xd3, 0x58, 0xf8, 0x21, 0x00, 0x00, 0xf0, 0xd8, 0xf8, + 0x00, 0xf0, 0x39, 0xf8, 0x82, 0x46, 0x8b, 0x46, 0xff, 0xf7, 0xb9, 0xff, + 0x52, 0x46, 0x5b, 0x46, 0xf9, 0xf7, 0xe8, 0xf9, 0x00, 0xf0, 0xf0, 0xf8, + 0x48, 0xf8, 0x25, 0x00, 0x7f, 0x1c, 0xa7, 0x42, 0x0b, 0xd2, 0x00, 0xf0, + 0x15, 0xf8, 0x00, 0xf0, 0x19, 0xf8, 0xf7, 0xdd, 0xbd, 0x19, 0x08, 0xeb, + 0x85, 0x02, 0x92, 0xed, 0x00, 0x8a, 0x00, 0x22, 0xdc, 0xe7, 0xa5, 0x19, + 0x08, 0xeb, 0x85, 0x00, 0x90, 0xed, 0x00, 0x0a, 0x00, 0x20, 0xbc, 0xe7, + 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf1, 0x8f, 0x09, 0xfb, 0x07, 0xf0, + 0x39, 0x18, 0x08, 0xeb, 0x81, 0x02, 0x70, 0x47, 0x92, 0xed, 0x00, 0x0a, + 0xb5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x70, 0x47, 0x52, 0x1c, + 0xd3, 0xed, 0x00, 0x0a, 0x00, 0xee, 0x60, 0x8a, 0x70, 0x47, 0x02, 0x46, + 0x0b, 0x46, 0x00, 0x20, 0x01, 0x49, 0xf8, 0xf7, 0xf9, 0xbf, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x3f, 0x2d, 0xe9, 0xf8, 0x43, 0x00, 0xf0, 0x25, 0xf8, + 0x09, 0xe0, 0x00, 0x96, 0x4b, 0x46, 0x08, 0xeb, 0x87, 0x02, 0x05, 0xeb, + 0x87, 0x01, 0x20, 0x46, 0xff, 0xf7, 0xef, 0xfe, 0x7f, 0x1c, 0xb7, 0x42, + 0xf3, 0xd3, 0xbd, 0xe8, 0xf1, 0x83, 0x2d, 0xe9, 0xf8, 0x43, 0x00, 0xf0, + 0x12, 0xf8, 0x0c, 0xe0, 0x01, 0x23, 0x09, 0xfb, 0x07, 0xf0, 0x00, 0x93, + 0x08, 0xeb, 0x80, 0x02, 0x04, 0xeb, 0x80, 0x01, 0x4b, 0x46, 0x28, 0x46, + 0xff, 0xf7, 0xd9, 0xfe, 0x7f, 0x1c, 0xb7, 0x42, 0xf0, 0xd3, 0xbd, 0xe8, + 0xf1, 0x83, 0x08, 0x9e, 0x04, 0x46, 0x0d, 0x46, 0x90, 0x46, 0x99, 0x46, + 0x00, 0x27, 0x70, 0x47, 0x52, 0xec, 0x10, 0x1a, 0xb0, 0xee, 0xc0, 0x0a, + 0xc8, 0x0f, 0x49, 0x00, 0x52, 0x00, 0xf0, 0xee, 0xe0, 0x0a, 0x28, 0xbf, + 0x0c, 0x30, 0x11, 0xf1, 0x80, 0x7f, 0x38, 0xbf, 0x12, 0xf1, 0x80, 0x7f, + 0x0c, 0xd2, 0x8a, 0x42, 0x38, 0xbf, 0x80, 0xf0, 0x04, 0x00, 0x12, 0x42, + 0x14, 0xd0, 0x34, 0xbf, 0x80, 0xee, 0x80, 0x0a, 0x80, 0xee, 0x20, 0x0a, + 0x00, 0xf0, 0x9e, 0xb8, 0x11, 0xf1, 0x80, 0x7f, 0x08, 0xbf, 0x80, 0xf0, + 0x04, 0x00, 0x98, 0xbf, 0x12, 0xf1, 0x80, 0x7f, 0x08, 0xd8, 0x8a, 0x42, + 0x14, 0xbf, 0x00, 0x22, 0x4f, 0xf0, 0x7e, 0x52, 0x00, 0xee, 0x10, 0x2a, + 0x00, 0xf0, 0x8c, 0xb8, 0x6f, 0xf0, 0x00, 0x41, 0x00, 0xee, 0x10, 0x1a, + 0x70, 0x47, 0x1c, 0xb5, 0x68, 0x46, 0x00, 0xf0, 0xd5, 0xf8, 0x00, 0x98, + 0x30, 0xb3, 0x10, 0xee, 0x10, 0x0a, 0x40, 0x00, 0x00, 0x16, 0x40, 0x1c, + 0x20, 0xd0, 0x10, 0xee, 0x10, 0x3a, 0x00, 0x98, 0x23, 0xf0, 0x00, 0x42, + 0xd1, 0x0d, 0x00, 0xeb, 0x01, 0x04, 0x14, 0xd0, 0x00, 0x2c, 0x12, 0xdd, + 0xff, 0x2c, 0x09, 0xdb, 0x10, 0xee, 0x10, 0x1a, 0x4f, 0xf0, 0xff, 0x40, + 0x01, 0xf0, 0x00, 0x41, 0x08, 0x43, 0x00, 0xee, 0x10, 0x0a, 0x13, 0xbd, + 0x23, 0xf0, 0xff, 0x43, 0x43, 0xea, 0xc4, 0x53, 0x00, 0xee, 0x10, 0x3a, + 0x13, 0xbd, 0x0a, 0xb1, 0xf5, 0xf7, 0x60, 0xff, 0x13, 0xbd, 0x00, 0x00, + 0xc0, 0xf3, 0xc7, 0x51, 0x81, 0xb1, 0xff, 0x29, 0x06, 0xd0, 0xc1, 0x10, + 0x40, 0x07, 0x21, 0xf0, 0xe0, 0x41, 0x01, 0xf1, 0x60, 0x51, 0x70, 0x47, + 0x41, 0x02, 0x0c, 0xbf, 0x40, 0xf4, 0xe0, 0x01, 0x6f, 0xf0, 0x00, 0x41, + 0x00, 0x20, 0x70, 0x47, 0x00, 0xf0, 0x00, 0x41, 0x00, 0x02, 0x0a, 0xd0, + 0xb0, 0xfa, 0x80, 0xfc, 0x00, 0xfa, 0x0c, 0xf0, 0x01, 0xf1, 0x60, 0x51, + 0xa1, 0xeb, 0x0c, 0x51, 0x01, 0xeb, 0xd0, 0x21, 0x40, 0x05, 0x70, 0x47, + 0x01, 0xf0, 0x00, 0x42, 0x8b, 0x1a, 0xa3, 0xf1, 0x60, 0x51, 0xb1, 0xf5, + 0x80, 0x1f, 0x0a, 0xdb, 0xb1, 0xf1, 0x7f, 0x6f, 0x1f, 0xd2, 0x42, 0xea, + 0xc1, 0x02, 0xc1, 0x00, 0x71, 0xf1, 0x00, 0x41, 0x42, 0xeb, 0x50, 0x70, + 0x70, 0x47, 0x0b, 0x15, 0xc3, 0xf1, 0x09, 0x03, 0x21, 0x2b, 0x10, 0xd2, + 0x89, 0x02, 0x41, 0xea, 0x90, 0x51, 0x80, 0x02, 0x01, 0x28, 0x49, 0x41, + 0x41, 0xf0, 0x00, 0x41, 0x21, 0xfa, 0x03, 0xf0, 0xc3, 0xf1, 0x20, 0x03, + 0x99, 0x40, 0x71, 0xf1, 0x00, 0x41, 0x50, 0x41, 0x70, 0x47, 0x10, 0x00, + 0x70, 0x47, 0x6f, 0xf0, 0x00, 0x00, 0x13, 0xeb, 0x10, 0x3f, 0x5c, 0xbf, + 0x00, 0x0e, 0x42, 0xea, 0xc0, 0x50, 0x70, 0x47, 0x1a, 0xa2, 0x10, 0xee, + 0x10, 0x1a, 0x43, 0xf2, 0xa4, 0x0c, 0xc3, 0xf6, 0x89, 0x6c, 0xf2, 0xec, + 0x06, 0x0a, 0x61, 0x45, 0x09, 0xdb, 0x00, 0xee, 0x80, 0x3a, 0x70, 0xee, + 0x80, 0x0a, 0x83, 0xee, 0x20, 0x0a, 0x40, 0xf0, 0x02, 0x00, 0x10, 0xee, + 0x10, 0x1a, 0x49, 0x00, 0xd1, 0xf1, 0xe6, 0x41, 0x0b, 0xd8, 0x60, 0xee, + 0x00, 0x0a, 0x20, 0xee, 0x20, 0x3a, 0x03, 0xee, 0x01, 0x0a, 0x01, 0xee, + 0xa0, 0x2a, 0x42, 0xee, 0x20, 0x2a, 0x80, 0xee, 0x22, 0x0a, 0x40, 0x08, + 0x10, 0xf0, 0x02, 0x0f, 0x18, 0xbf, 0xb1, 0xee, 0x40, 0x0a, 0x02, 0xeb, + 0x80, 0x02, 0xd2, 0xed, 0x00, 0x0a, 0x30, 0xee, 0x20, 0x0a, 0x28, 0xbf, + 0xb1, 0xee, 0x40, 0x0a, 0x70, 0x47, 0x00, 0x00, 0xd7, 0xb3, 0xdd, 0x3f, + 0x6a, 0xd5, 0x03, 0x3f, 0x2b, 0x94, 0xa9, 0x3d, 0xb8, 0x2a, 0x59, 0x3f, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x92, 0x0a, 0x06, 0x3f, 0xdb, 0x0f, 0xc9, 0x3f, 0x92, 0x0a, 0x86, 0x3f, + 0xdb, 0x0f, 0xc9, 0x3f, 0x92, 0x0a, 0x06, 0x40, 0xdb, 0x0f, 0x49, 0x40, + 0x36, 0x8d, 0x27, 0x40, 0x38, 0xb5, 0x2d, 0xed, 0x04, 0x8b, 0x04, 0x46, + 0x84, 0xb0, 0x00, 0x21, 0x21, 0x60, 0xf0, 0xee, 0x40, 0x8a, 0x18, 0xee, + 0x90, 0x1a, 0x48, 0x00, 0x00, 0x16, 0x40, 0x1c, 0xb0, 0xee, 0x60, 0x8a, + 0x01, 0xd1, 0x49, 0x02, 0x10, 0xd0, 0x18, 0xee, 0x10, 0x1a, 0x48, 0x00, + 0x00, 0x16, 0x40, 0x1c, 0x01, 0xd1, 0x49, 0x02, 0x08, 0xd0, 0x18, 0xee, + 0x90, 0x1a, 0x49, 0x00, 0x08, 0x16, 0x40, 0x1c, 0x06, 0xd1, 0x09, 0x02, + 0x04, 0xd0, 0x19, 0xe1, 0x04, 0xb0, 0x9f, 0xed, 0x8e, 0x0a, 0x16, 0xe1, + 0x18, 0xee, 0x10, 0x1a, 0x49, 0x00, 0x08, 0x16, 0x40, 0x1c, 0x05, 0xd1, + 0x09, 0x02, 0x18, 0xbf, 0xb0, 0xee, 0x48, 0x0a, 0x40, 0xf0, 0x0a, 0x81, + 0x18, 0xee, 0x90, 0x1a, 0x21, 0xf0, 0x00, 0x40, 0xb0, 0xf5, 0x00, 0x0f, + 0x08, 0xd2, 0x00, 0x21, 0x00, 0x91, 0x70, 0xb1, 0x68, 0x46, 0xc5, 0xf7, + 0xff, 0xfd, 0xf0, 0xee, 0x40, 0x8a, 0x08, 0xe0, 0xc0, 0x0d, 0x21, 0xf0, + 0xff, 0x41, 0x7e, 0x38, 0x41, 0xf0, 0x7c, 0x51, 0x00, 0x90, 0x08, 0xee, + 0x90, 0x1a, 0x18, 0xee, 0x10, 0x1a, 0x21, 0xf0, 0x00, 0x40, 0xb0, 0xf5, + 0x00, 0x0f, 0x0a, 0xd2, 0x00, 0x21, 0x01, 0x91, 0x80, 0xb1, 0x01, 0xa8, + 0xb0, 0xee, 0x48, 0x0a, 0xc5, 0xf7, 0xe4, 0xfd, 0xb0, 0xee, 0x40, 0x8a, + 0x08, 0xe0, 0xc0, 0x0d, 0x21, 0xf0, 0xff, 0x41, 0x7e, 0x38, 0x41, 0xf0, + 0x7c, 0x51, 0x01, 0x90, 0x08, 0xee, 0x10, 0x1a, 0x18, 0xee, 0x90, 0x0a, + 0x20, 0xf0, 0x00, 0x40, 0x08, 0xee, 0x90, 0x0a, 0x18, 0xee, 0x10, 0x0a, + 0x20, 0xf0, 0x00, 0x40, 0x08, 0xee, 0x10, 0x0a, 0x40, 0x00, 0x18, 0xee, + 0x90, 0x0a, 0x05, 0xd1, 0x41, 0x00, 0x1b, 0xd1, 0x04, 0xb0, 0x9f, 0xed, + 0x64, 0x0a, 0xc0, 0xe0, 0x40, 0x00, 0x09, 0xd0, 0x00, 0x99, 0x01, 0x98, + 0x81, 0x42, 0x05, 0xdb, 0x10, 0xd1, 0xf4, 0xee, 0x48, 0x8a, 0xf1, 0xee, + 0x10, 0xfa, 0x0b, 0xd5, 0x00, 0x99, 0x01, 0x9a, 0x02, 0x91, 0xb0, 0xee, + 0x68, 0x0a, 0x02, 0x99, 0x00, 0x92, 0xf0, 0xee, 0x48, 0x8a, 0x01, 0x91, + 0xb0, 0xee, 0x40, 0x8a, 0x00, 0x99, 0x00, 0x98, 0x49, 0x10, 0x00, 0xeb, + 0x91, 0x70, 0x80, 0x10, 0x40, 0x00, 0x08, 0xbf, 0x02, 0x20, 0x20, 0x60, + 0x04, 0x46, 0x00, 0x9a, 0x18, 0xee, 0x90, 0x3a, 0x12, 0x1b, 0x23, 0xf0, + 0x00, 0x41, 0xc8, 0x0d, 0x02, 0xeb, 0x00, 0x05, 0x14, 0xd0, 0x00, 0x2d, + 0x12, 0xdd, 0xff, 0x2d, 0x09, 0xdb, 0x18, 0xee, 0x90, 0x1a, 0x4f, 0xf0, + 0xff, 0x40, 0x01, 0xf0, 0x00, 0x41, 0x08, 0x43, 0x08, 0xee, 0x90, 0x0a, + 0x0e, 0xe0, 0x23, 0xf0, 0xff, 0x43, 0x43, 0xea, 0xc5, 0x53, 0x08, 0xee, + 0x90, 0x3a, 0x07, 0xe0, 0x31, 0xb1, 0x10, 0x46, 0xb0, 0xee, 0x68, 0x0a, + 0xf5, 0xf7, 0xee, 0xfd, 0xf0, 0xee, 0x40, 0x8a, 0x01, 0x98, 0x18, 0xee, + 0x10, 0x2a, 0x04, 0x1b, 0x22, 0xf0, 0x00, 0x41, 0xc8, 0x0d, 0x04, 0xeb, + 0x00, 0x03, 0x14, 0xd0, 0x00, 0x2b, 0x12, 0xdd, 0xff, 0x2b, 0x09, 0xdb, + 0x18, 0xee, 0x10, 0x1a, 0x4f, 0xf0, 0xff, 0x40, 0x01, 0xf0, 0x00, 0x41, + 0x08, 0x43, 0x08, 0xee, 0x10, 0x0a, 0x0e, 0xe0, 0x22, 0xf0, 0xff, 0x42, + 0x42, 0xea, 0xc3, 0x52, 0x08, 0xee, 0x10, 0x2a, 0x07, 0xe0, 0x31, 0xb1, + 0x20, 0x46, 0xb0, 0xee, 0x48, 0x0a, 0xf5, 0xf7, 0xc7, 0xfd, 0xb0, 0xee, + 0x40, 0x8a, 0x38, 0xee, 0xc8, 0x0a, 0xb4, 0xee, 0x68, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x47, 0xd0, 0xb4, 0xee, 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, + 0x0f, 0xd5, 0x88, 0xee, 0x88, 0x9a, 0xb7, 0xee, 0x00, 0x0a, 0x09, 0xee, + 0x09, 0x0a, 0xc4, 0xf7, 0xcf, 0xfb, 0x39, 0xee, 0x00, 0x0a, 0x88, 0xee, + 0x00, 0x0a, 0x04, 0xb0, 0x30, 0xee, 0x28, 0x0a, 0x33, 0xe0, 0x80, 0xee, + 0x08, 0x9a, 0x19, 0xee, 0x10, 0x0a, 0xff, 0xf7, 0x45, 0xfe, 0x00, 0x22, + 0x4f, 0xf0, 0x80, 0x43, 0xfc, 0xf7, 0x2c, 0xff, 0x04, 0x46, 0x0d, 0x46, + 0x19, 0xee, 0x10, 0x0a, 0xff, 0xf7, 0x3a, 0xfe, 0x22, 0x46, 0x2b, 0x46, + 0xf8, 0xf7, 0x50, 0xff, 0xff, 0xf7, 0x58, 0xfe, 0x09, 0xee, 0x90, 0x0a, + 0xb0, 0xee, 0x00, 0x0a, 0x39, 0xee, 0x80, 0x0a, 0xc4, 0xf7, 0xa8, 0xfb, + 0xdf, 0xed, 0x0d, 0x0a, 0x70, 0xee, 0x20, 0x0a, 0xc9, 0xee, 0xa0, 0x0a, + 0x9f, 0xed, 0x0b, 0x0a, 0x30, 0xee, 0x80, 0x0a, 0x30, 0xee, 0x09, 0x0a, + 0x9f, 0xed, 0x09, 0x1a, 0x30, 0xee, 0x01, 0x1a, 0x88, 0xee, 0x01, 0x1a, + 0x31, 0xee, 0x28, 0x0a, 0x04, 0xb0, 0xbd, 0xec, 0x04, 0x8b, 0x31, 0xbd, + 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xf3, 0x04, 0xb5, 0x3f, + 0xf3, 0x89, 0x63, 0x37, 0x41, 0x82, 0x1a, 0x40, 0x70, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x16, 0x46, 0x00, 0xf0, 0xa4, 0xfe, 0x32, 0x46, 0x29, 0x46, + 0x20, 0x46, 0xbd, 0xe8, 0x70, 0x40, 0x2d, 0xe9, 0xf8, 0x43, 0x2d, 0xed, + 0x02, 0x8b, 0x06, 0x46, 0x0d, 0x46, 0x17, 0x46, 0x00, 0xf0, 0x28, 0xff, + 0x04, 0x46, 0x30, 0x46, 0x00, 0xf0, 0x2a, 0xff, 0x80, 0x46, 0x30, 0x46, + 0x00, 0xf0, 0x42, 0xff, 0x81, 0x46, 0x30, 0x46, 0x00, 0xf0, 0x45, 0xff, + 0x06, 0x46, 0x1c, 0x21, 0x09, 0xf1, 0x58, 0x00, 0xd7, 0xf7, 0xe4, 0xfa, + 0x3c, 0x21, 0x09, 0xf1, 0x74, 0x00, 0xd7, 0xf7, 0xdf, 0xfa, 0x4f, 0xf4, + 0x80, 0x20, 0xc9, 0xf8, 0x90, 0x00, 0x00, 0x21, 0x31, 0x60, 0x00, 0x20, + 0x70, 0x60, 0xb7, 0xee, 0x00, 0x8a, 0x86, 0xed, 0x02, 0x8a, 0xf0, 0x60, + 0x87, 0xf8, 0x20, 0x00, 0x87, 0xf8, 0x21, 0x00, 0xdf, 0xf8, 0x40, 0x1c, + 0x79, 0x61, 0x04, 0xf5, 0xd9, 0x67, 0x05, 0xf1, 0x40, 0x01, 0x01, 0xeb, + 0x80, 0x02, 0x95, 0xed, 0x02, 0x0a, 0x00, 0xf0, 0xb3, 0xf8, 0x03, 0x28, + 0xc3, 0xed, 0x00, 0x0a, 0xf5, 0xd3, 0x04, 0x20, 0x05, 0xf1, 0x58, 0x01, + 0x42, 0x42, 0x01, 0xeb, 0x82, 0x03, 0x95, 0xed, 0x02, 0x0a, 0xd3, 0xed, + 0x00, 0x0a, 0x07, 0xeb, 0x80, 0x02, 0x40, 0x1c, 0x60, 0xee, 0x20, 0x0a, + 0x07, 0x28, 0xc2, 0xed, 0x00, 0x0a, 0xef, 0xd3, 0x07, 0x20, 0xe9, 0x68, + 0x47, 0xf8, 0x20, 0x10, 0x40, 0x1c, 0x0a, 0x28, 0xf9, 0xd3, 0x0a, 0x20, + 0x05, 0xf1, 0x24, 0x01, 0x01, 0xeb, 0x80, 0x02, 0x00, 0xf0, 0x8c, 0xf8, + 0x11, 0x28, 0xc3, 0xed, 0x00, 0x0a, 0xf7, 0xd3, 0x12, 0x20, 0x05, 0xf1, + 0xac, 0x06, 0x41, 0x42, 0x06, 0xeb, 0x81, 0x02, 0x00, 0xf0, 0x80, 0xf8, + 0x19, 0x28, 0xc3, 0xed, 0x00, 0x0a, 0xf6, 0xd3, 0x19, 0x20, 0xe9, 0x69, + 0x47, 0xf8, 0x20, 0x10, 0x40, 0x1c, 0x1c, 0x28, 0xf9, 0xd3, 0x04, 0xf2, + 0xd4, 0x60, 0x29, 0x68, 0x01, 0x60, 0x6a, 0x68, 0x42, 0x61, 0x29, 0x69, + 0x81, 0x63, 0x4f, 0xf4, 0xcb, 0x61, 0x6a, 0x69, 0xc2, 0x65, 0x04, 0xf1, + 0x70, 0x00, 0xd7, 0xf7, 0x75, 0xfa, 0x3a, 0x46, 0x1c, 0x21, 0x04, 0xf1, + 0x70, 0x00, 0xc6, 0xf7, 0x9e, 0xfa, 0x70, 0x21, 0x20, 0x46, 0xd7, 0xf7, + 0x6b, 0xfa, 0x84, 0xed, 0x11, 0x8a, 0x00, 0x20, 0x08, 0xf1, 0x74, 0x03, + 0x05, 0xf1, 0x40, 0x01, 0x01, 0xeb, 0x80, 0x02, 0x95, 0xed, 0x0a, 0x0a, + 0xd2, 0xed, 0x00, 0x0a, 0x03, 0xeb, 0x80, 0x01, 0x40, 0x1c, 0x60, 0xee, + 0x20, 0x0a, 0x03, 0x28, 0xc1, 0xed, 0x00, 0x0a, 0xee, 0xd3, 0x04, 0x20, + 0x08, 0xf1, 0x74, 0x04, 0x05, 0xf1, 0x58, 0x01, 0x42, 0x42, 0x01, 0xeb, + 0x82, 0x03, 0x95, 0xed, 0x0a, 0x0a, 0xd3, 0xed, 0x00, 0x0a, 0x04, 0xeb, + 0x80, 0x01, 0x40, 0x1c, 0x60, 0xee, 0x20, 0x0a, 0x07, 0x28, 0xc1, 0xed, + 0x00, 0x0a, 0xed, 0xd3, 0x08, 0xf1, 0x80, 0x00, 0x29, 0x6a, 0x01, 0x60, + 0x0a, 0x21, 0x05, 0xf1, 0x24, 0x02, 0x02, 0xeb, 0x81, 0x03, 0x00, 0xf0, + 0x1b, 0xf8, 0x11, 0x29, 0xc2, 0xed, 0x00, 0x0a, 0xf5, 0xd3, 0x12, 0x21, + 0x4a, 0x42, 0x06, 0xeb, 0x82, 0x03, 0x00, 0xf0, 0x11, 0xf8, 0x19, 0x29, + 0xc2, 0xed, 0x00, 0x0a, 0xf6, 0xd3, 0x29, 0x6b, 0x81, 0x63, 0x00, 0x20, + 0x00, 0x21, 0x48, 0xf8, 0x20, 0x10, 0x40, 0x1c, 0x1c, 0x28, 0xfa, 0xd3, + 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf1, 0x83, 0x95, 0xed, 0x0e, 0x0a, + 0xd3, 0xed, 0x00, 0x0a, 0x04, 0xeb, 0x81, 0x02, 0x49, 0x1c, 0x60, 0xee, + 0x20, 0x0a, 0x70, 0x47, 0x95, 0xed, 0x06, 0x0a, 0xd2, 0xed, 0x00, 0x0a, + 0x07, 0xeb, 0x80, 0x03, 0x40, 0x1c, 0x60, 0xee, 0x20, 0x0a, 0x70, 0x47, + 0x10, 0xb5, 0x1a, 0x89, 0x93, 0xed, 0x04, 0x0a, 0x00, 0xee, 0x90, 0x2a, + 0xb8, 0xee, 0x40, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x8c, 0x31, 0x60, 0xee, + 0x20, 0x0a, 0x93, 0xed, 0x01, 0x0a, 0x91, 0xed, 0x00, 0x1a, 0x80, 0xee, + 0x80, 0x0a, 0x01, 0x20, 0xb4, 0xee, 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x2d, 0xd4, 0x91, 0xed, 0x0c, 0x0a, 0x93, 0xed, 0x05, 0x1a, 0xd3, 0xed, + 0x06, 0x0a, 0xb4, 0xee, 0x40, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xbf, + 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x1d, 0xd4, 0x03, 0xf1, + 0x1c, 0x02, 0x03, 0xf1, 0x1c, 0x04, 0x31, 0xee, 0x20, 0x4a, 0x1c, 0x33, + 0x92, 0xec, 0x02, 0x0a, 0x94, 0xec, 0x02, 0x1a, 0x92, 0xec, 0x02, 0x2a, + 0x93, 0xec, 0x02, 0x3a, 0x20, 0xee, 0x01, 0x0a, 0x02, 0xee, 0xa3, 0x0a, + 0x64, 0xee, 0x04, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0xd1, 0xed, 0x0a, 0x1a, + 0xf4, 0xee, 0x40, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x00, 0xd5, 0x00, 0x20, + 0x10, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x84, 0xb0, 0x82, 0x46, 0x89, 0x46, + 0x93, 0x46, 0x98, 0x46, 0x00, 0xf0, 0xe4, 0xfd, 0x03, 0x46, 0x5a, 0x46, + 0x41, 0x46, 0x48, 0x46, 0x00, 0xf0, 0x5c, 0xf8, 0x50, 0x46, 0x00, 0xf0, + 0xac, 0xfd, 0x01, 0x00, 0x1b, 0xd1, 0x0e, 0x9c, 0x50, 0x46, 0x00, 0xf0, + 0xdd, 0xfd, 0x06, 0x46, 0x50, 0x46, 0x00, 0xf0, 0xfc, 0xfd, 0x05, 0x46, + 0x50, 0x46, 0x00, 0xf0, 0xf1, 0xfd, 0x50, 0x46, 0x00, 0xf0, 0xd9, 0xfd, + 0x02, 0x90, 0x01, 0x96, 0x23, 0x46, 0x0f, 0x98, 0x00, 0x90, 0x5a, 0x46, + 0x29, 0x46, 0x48, 0x46, 0x00, 0xf0, 0xc4, 0xf8, 0x50, 0x46, 0x00, 0xf0, + 0x98, 0xfd, 0x01, 0x00, 0x1f, 0xd1, 0x50, 0x46, 0x00, 0xf0, 0xe3, 0xfd, + 0x04, 0x46, 0x50, 0x46, 0x00, 0xf0, 0xc3, 0xfd, 0x05, 0x46, 0x50, 0x46, + 0x00, 0xf0, 0xc6, 0xfd, 0x06, 0x46, 0x50, 0x46, 0x00, 0xf0, 0xc9, 0xfd, + 0x07, 0x46, 0x50, 0x46, 0x00, 0xf0, 0xaa, 0xfd, 0x03, 0x97, 0x02, 0x96, + 0x01, 0x95, 0x00, 0x90, 0x5b, 0x46, 0x22, 0x46, 0x41, 0x46, 0x48, 0x46, + 0x00, 0xf0, 0x82, 0xf9, 0x50, 0x46, 0x00, 0xf0, 0x91, 0xfd, 0x90, 0xb9, + 0x50, 0x46, 0x00, 0xf0, 0xc9, 0xfd, 0x04, 0x46, 0x50, 0x46, 0x00, 0xf0, + 0xb7, 0xfd, 0x05, 0x46, 0x50, 0x46, 0x00, 0xf0, 0xba, 0xfd, 0x02, 0x46, + 0x23, 0x46, 0x29, 0x46, 0x48, 0x46, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x4f, + 0x87, 0xe3, 0x02, 0x20, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0x00, + 0x2d, 0xe9, 0xf0, 0x41, 0x0d, 0x46, 0x2d, 0xed, 0x04, 0x8b, 0x95, 0xed, + 0x06, 0x0a, 0xd5, 0xed, 0x05, 0x0a, 0x00, 0x27, 0xf4, 0xee, 0x40, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x04, 0x46, 0x16, 0x46, 0x98, 0x46, 0x22, 0xd5, + 0x95, 0xed, 0x03, 0x1a, 0xb1, 0xee, 0x41, 0x1a, 0x05, 0xf1, 0x24, 0x00, + 0x05, 0xf1, 0x2c, 0x01, 0x85, 0xed, 0x03, 0x1a, 0x85, 0xed, 0x05, 0x0a, + 0xc5, 0xed, 0x06, 0x0a, 0x90, 0xec, 0x02, 0x8a, 0x91, 0xec, 0x02, 0x0a, + 0xc4, 0xf7, 0xb7, 0xf9, 0x05, 0xf1, 0x24, 0x00, 0x01, 0x27, 0x80, 0xec, + 0x02, 0x0a, 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, 0xc4, 0xf7, + 0xac, 0xf9, 0x05, 0xf1, 0x2c, 0x01, 0x81, 0xec, 0x02, 0x0a, 0x28, 0x89, + 0x95, 0xed, 0x00, 0x8a, 0xd5, 0xed, 0x01, 0x0a, 0x00, 0xee, 0x10, 0x0a, + 0xb8, 0xee, 0x40, 0x0a, 0x20, 0xee, 0x08, 0x0a, 0xc0, 0xee, 0x20, 0x8a, + 0x95, 0xed, 0x03, 0x0a, 0x05, 0xf1, 0x24, 0x00, 0x80, 0xee, 0x08, 0x9a, + 0x90, 0xec, 0x02, 0x0a, 0xc4, 0xf7, 0x9a, 0xf9, 0xdf, 0xed, 0x87, 0x0a, + 0x68, 0xee, 0xa0, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0x70, 0xee, 0x09, 0x8a, + 0x94, 0xed, 0x29, 0x0a, 0xb5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x07, 0xdd, 0x88, 0xee, 0x00, 0x8a, 0x28, 0xee, 0x88, 0x0a, 0xd2, 0xf7, + 0x89, 0xf8, 0xc0, 0xee, 0x08, 0x8a, 0x00, 0x2f, 0x14, 0xbf, 0xb1, 0xee, + 0x68, 0x0a, 0xb0, 0xee, 0x68, 0x0a, 0x86, 0xed, 0x03, 0x0a, 0x9f, 0xed, + 0x79, 0x0a, 0xc6, 0xed, 0x04, 0x8a, 0x28, 0xee, 0x80, 0x0a, 0xd2, 0xf7, + 0x77, 0xf8, 0xbd, 0xee, 0xc0, 0x0a, 0x88, 0xed, 0x00, 0x0a, 0xdf, 0xed, + 0x74, 0x0a, 0x28, 0xee, 0xa0, 0x0a, 0xd2, 0xf7, 0x6d, 0xf8, 0xbd, 0xee, + 0xc0, 0x0a, 0x88, 0xed, 0x01, 0x0a, 0xbd, 0xec, 0x04, 0x8b, 0xbd, 0xe8, + 0xf0, 0x81, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0x2d, 0xed, 0x08, 0x8b, + 0x80, 0x46, 0x9d, 0xed, 0x0e, 0x0a, 0xb8, 0xee, 0x40, 0x1a, 0xdf, 0xed, + 0x69, 0x0a, 0x0f, 0x9d, 0x98, 0xed, 0x24, 0x0a, 0x81, 0xee, 0x20, 0x8a, + 0x0e, 0x46, 0x17, 0x46, 0x1c, 0x46, 0xf0, 0xee, 0x48, 0x0a, 0xdc, 0xf7, + 0xc5, 0xfb, 0x05, 0xf1, 0x94, 0x00, 0x85, 0xed, 0x1c, 0x0a, 0x80, 0xed, + 0x14, 0x8a, 0x97, 0xf8, 0x21, 0x10, 0x8c, 0x42, 0x08, 0xd1, 0xd8, 0xed, + 0x0b, 0x0a, 0x98, 0xed, 0x09, 0x1a, 0xd8, 0xed, 0x0f, 0x1a, 0x98, 0xed, + 0x0d, 0x2a, 0x1f, 0xe0, 0x61, 0x1a, 0x48, 0xbf, 0x49, 0x42, 0xc9, 0xb2, + 0x00, 0xee, 0x90, 0x1a, 0xf8, 0xee, 0x60, 0x0a, 0x9f, 0xed, 0x55, 0x1a, + 0x80, 0xee, 0x81, 0x1a, 0x81, 0xee, 0x08, 0x2a, 0xd8, 0xed, 0x1b, 0x1a, + 0x98, 0xed, 0x1a, 0x1a, 0xd8, 0xed, 0x1c, 0x2a, 0x61, 0xee, 0x82, 0x0a, + 0xd8, 0xed, 0x1d, 0x1a, 0x21, 0xee, 0x02, 0x1a, 0x61, 0xee, 0x82, 0x1a, + 0x22, 0xee, 0x82, 0x2a, 0x87, 0xf8, 0x21, 0x40, 0x07, 0x21, 0x05, 0xf1, + 0x74, 0x02, 0x02, 0xeb, 0x81, 0x03, 0x49, 0x1c, 0x0a, 0x29, 0xc3, 0xed, + 0x00, 0x0a, 0xf8, 0xd3, 0x80, 0xed, 0x00, 0x1a, 0x19, 0x21, 0x02, 0xeb, + 0x81, 0x03, 0x49, 0x1c, 0x1c, 0x29, 0xc3, 0xed, 0x00, 0x1a, 0xf8, 0xd3, + 0xff, 0xee, 0x00, 0x1a, 0xf7, 0xee, 0x00, 0x2a, 0x80, 0xed, 0x12, 0x2a, + 0xd6, 0xed, 0x01, 0x0a, 0x96, 0xed, 0x03, 0x2a, 0x96, 0xed, 0x02, 0x1a, + 0x97, 0xf8, 0x20, 0x00, 0x60, 0xee, 0xa1, 0x0a, 0x62, 0xee, 0x21, 0x8a, + 0x72, 0xee, 0xc0, 0x9a, 0x96, 0xed, 0x00, 0x8a, 0xd7, 0xed, 0x05, 0x1a, + 0x29, 0xee, 0x81, 0x9a, 0xe0, 0xb9, 0xb0, 0xee, 0x68, 0x0a, 0x08, 0xee, + 0xa0, 0x0a, 0xf0, 0xee, 0x41, 0x1a, 0x01, 0xee, 0x08, 0x0a, 0x41, 0xee, + 0x20, 0x1a, 0x29, 0xee, 0x80, 0x0a, 0x48, 0xee, 0xc8, 0x1a, 0x80, 0xee, + 0x21, 0x0a, 0x85, 0xed, 0x03, 0x0a, 0x00, 0xee, 0x28, 0x9a, 0xb7, 0xee, + 0x00, 0x0a, 0x30, 0xee, 0x80, 0x0a, 0x89, 0xee, 0x00, 0x0a, 0x85, 0xed, + 0x11, 0x0a, 0x2f, 0xe0, 0xbf, 0xee, 0x00, 0x1a, 0x30, 0xee, 0x01, 0xaa, + 0x9f, 0xed, 0x1d, 0x0a, 0x61, 0xee, 0x80, 0xaa, 0x6a, 0xee, 0x20, 0xba, + 0xb0, 0xee, 0x6a, 0x0a, 0xc4, 0xf7, 0xa0, 0xff, 0xb0, 0xee, 0x00, 0xba, + 0x20, 0xee, 0x0b, 0x0a, 0xcb, 0xee, 0x80, 0xba, 0xb0, 0xee, 0x6a, 0x0a, + 0xc4, 0xf7, 0x96, 0xff, 0x6a, 0xee, 0x28, 0x8a, 0x20, 0xee, 0x0b, 0x0a, + 0x88, 0xee, 0x80, 0x0a, 0x69, 0xee, 0x88, 0x0a, 0xc5, 0xed, 0x03, 0x0a, + 0x85, 0xed, 0x12, 0x0a, 0xf1, 0xee, 0x6b, 0x0a, 0xb1, 0xee, 0x40, 0x0a, + 0xc5, 0xed, 0x04, 0xba, 0xc5, 0xed, 0x02, 0x0a, 0x85, 0xed, 0x11, 0x9a, + 0x85, 0xed, 0x10, 0x0a, 0x00, 0xee, 0x90, 0x4a, 0x10, 0x98, 0xf8, 0xee, + 0x60, 0x0a, 0x9f, 0xed, 0x09, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0x80, 0xed, + 0x00, 0x0a, 0xbd, 0xec, 0x08, 0x8b, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x00, + 0xdb, 0x0f, 0xc9, 0x40, 0x00, 0x00, 0x80, 0x4f, 0x00, 0x00, 0xe0, 0xc8, + 0x00, 0x24, 0x74, 0x49, 0x00, 0x00, 0x7f, 0x43, 0x2d, 0xe9, 0xf0, 0x47, + 0x04, 0x46, 0x0d, 0x46, 0x2d, 0xed, 0x10, 0x8b, 0x05, 0xf1, 0x1c, 0x00, + 0x88, 0xb0, 0x95, 0xed, 0x06, 0x1a, 0xd5, 0xed, 0x05, 0x1a, 0x31, 0xee, + 0x81, 0x9a, 0x90, 0xec, 0x02, 0x0a, 0xb0, 0xee, 0x00, 0x8a, 0xf0, 0xee, + 0x49, 0x8a, 0x98, 0x46, 0x40, 0xee, 0x08, 0x8a, 0x00, 0xee, 0x48, 0x9a, + 0x31, 0xee, 0xc1, 0xaa, 0x60, 0xee, 0x88, 0x9a, 0x8a, 0xee, 0x28, 0x0a, + 0x04, 0xf1, 0x84, 0x07, 0x88, 0xed, 0x00, 0x0a, 0xc9, 0xee, 0xa8, 0x0a, + 0xc8, 0xed, 0x01, 0x0a, 0xb0, 0xee, 0xc0, 0x0a, 0xd7, 0xed, 0x06, 0x1a, + 0xd8, 0xed, 0x04, 0x0a, 0xb4, 0xee, 0x61, 0x0a, 0xb0, 0xee, 0xe0, 0x1a, + 0xf1, 0xee, 0x10, 0xfa, 0x5d, 0xbf, 0x97, 0xed, 0x07, 0x2a, 0xb4, 0xee, + 0x42, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x9f, 0xed, 0xd9, 0xaa, 0xc8, 0xed, + 0x05, 0x0a, 0x91, 0x46, 0xd7, 0xed, 0x04, 0x0a, 0x00, 0xf0, 0x32, 0xfb, + 0x06, 0xda, 0x97, 0xed, 0x05, 0x0a, 0xb4, 0xee, 0x40, 0x1a, 0xf1, 0xee, + 0x10, 0xfa, 0x01, 0xd5, 0x00, 0x20, 0x00, 0xe0, 0x01, 0x20, 0x22, 0x9e, + 0xdf, 0xf8, 0xe0, 0xa5, 0x88, 0xf8, 0x20, 0x00, 0xbf, 0xee, 0x00, 0xda, + 0x99, 0xed, 0x01, 0x0a, 0xd9, 0xed, 0x00, 0xaa, 0xd9, 0xed, 0x02, 0xba, + 0x20, 0xee, 0x0d, 0xba, 0x99, 0xed, 0x03, 0x0a, 0x20, 0xee, 0x0d, 0xca, + 0xb6, 0xee, 0x00, 0x0a, 0x2a, 0xee, 0xaa, 0x1a, 0x68, 0xee, 0x80, 0x0a, + 0x0b, 0xee, 0x0b, 0x1a, 0x2b, 0xee, 0xab, 0x2a, 0x20, 0xee, 0x81, 0x1a, + 0x69, 0xee, 0x00, 0x1a, 0x0c, 0xee, 0x0c, 0x2a, 0x01, 0xee, 0x82, 0x1a, + 0x6a, 0xee, 0x8c, 0x1a, 0x4b, 0xee, 0x6b, 0x1a, 0x01, 0xee, 0x8a, 0x1a, + 0x6a, 0xee, 0xab, 0x1a, 0x4b, 0xee, 0x0c, 0x1a, 0x68, 0xee, 0xaa, 0xca, + 0x01, 0xee, 0xa9, 0x1a, 0x4a, 0xee, 0x0c, 0xca, 0x70, 0xee, 0xc1, 0x0a, + 0x49, 0xee, 0xab, 0xca, 0xc6, 0xed, 0x00, 0x0a, 0xf1, 0xee, 0x6c, 0x2a, + 0xc6, 0xed, 0x01, 0x2a, 0x99, 0xed, 0x01, 0x0a, 0x20, 0xee, 0x0d, 0x0a, + 0xc5, 0xf7, 0x44, 0xfd, 0x00, 0xf0, 0x7f, 0xf9, 0xb0, 0xee, 0x40, 0xea, + 0xf0, 0xee, 0x60, 0xea, 0x99, 0xed, 0x00, 0x0a, 0xc5, 0xf7, 0x3a, 0xfd, + 0xb0, 0xee, 0x4e, 0x1a, 0xf0, 0xee, 0x6e, 0x1a, 0xc5, 0xf7, 0xe1, 0xfc, + 0x68, 0x46, 0x80, 0xec, 0x02, 0x0a, 0x99, 0xed, 0x03, 0x0a, 0x20, 0xee, + 0x0d, 0x0a, 0xc5, 0xf7, 0x2b, 0xfd, 0x00, 0xf0, 0x66, 0xf9, 0xb0, 0xee, + 0x40, 0xda, 0xf0, 0xee, 0x60, 0xda, 0x99, 0xed, 0x02, 0x0a, 0xdf, 0xf8, + 0x1c, 0x95, 0xc5, 0xf7, 0x1f, 0xfd, 0x00, 0xf0, 0x35, 0xf9, 0xc5, 0xf7, + 0xc8, 0xfc, 0x00, 0xf0, 0x3f, 0xf9, 0x99, 0xec, 0x02, 0x0a, 0xc5, 0xf7, + 0xc2, 0xfc, 0xb0, 0xee, 0x40, 0xfa, 0xf0, 0xee, 0x60, 0xfa, 0x00, 0xf0, + 0x27, 0xf9, 0x99, 0xec, 0x02, 0x0a, 0xc5, 0xf7, 0xcb, 0xfc, 0x68, 0x46, + 0xb0, 0xee, 0x40, 0xea, 0xf0, 0xee, 0x60, 0xea, 0x90, 0xec, 0x02, 0x1a, + 0x9a, 0xec, 0x02, 0x0a, 0xc5, 0xf7, 0xd3, 0xfc, 0x00, 0xf0, 0x24, 0xf9, + 0xb0, 0xee, 0x4f, 0x0a, 0xf0, 0xee, 0x6f, 0x0a, 0xc5, 0xf7, 0xa5, 0xfc, + 0x06, 0xa8, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x80, 0xec, + 0x02, 0x1a, 0x00, 0xf0, 0x07, 0xf9, 0xb0, 0xee, 0x4e, 0x0a, 0xf0, 0xee, + 0x6e, 0x0a, 0xc5, 0xf7, 0x96, 0xfc, 0x04, 0xa9, 0xb0, 0xee, 0x4d, 0x1a, + 0x81, 0xec, 0x02, 0x0a, 0xf0, 0xee, 0x6d, 0x1a, 0xb0, 0xee, 0x4f, 0x0a, + 0xf0, 0xee, 0x6f, 0x0a, 0xc5, 0xf7, 0x9c, 0xfc, 0x02, 0xa8, 0xb0, 0xee, + 0x4d, 0x1a, 0x80, 0xec, 0x02, 0x0a, 0xf0, 0xee, 0x6d, 0x1a, 0xb0, 0xee, + 0x4e, 0x0a, 0xf0, 0xee, 0x6e, 0x0a, 0xc5, 0xf7, 0x8f, 0xfc, 0x69, 0x46, + 0x05, 0xf1, 0x1c, 0x00, 0x81, 0xec, 0x02, 0x0a, 0x04, 0xa9, 0xd5, 0xed, + 0x05, 0xea, 0x95, 0xed, 0x06, 0xea, 0x90, 0xec, 0x02, 0xfa, 0x91, 0xec, + 0x02, 0x0a, 0xc3, 0xf7, 0x5e, 0xff, 0x00, 0xf0, 0xec, 0xf8, 0x06, 0xa8, + 0x00, 0xf0, 0xef, 0xf8, 0x9d, 0xed, 0x06, 0x2a, 0xdd, 0xed, 0x06, 0x2a, + 0xdd, 0xed, 0x07, 0x1a, 0xdd, 0xed, 0x04, 0x0a, 0x9d, 0xed, 0x05, 0x1a, + 0x00, 0xf0, 0xcb, 0xf8, 0x9d, 0xed, 0x04, 0x0a, 0x20, 0xee, 0x80, 0x0a, + 0x01, 0xee, 0x01, 0x0a, 0x02, 0xa8, 0xb5, 0xee, 0x00, 0xda, 0x40, 0xee, + 0x0e, 0x1a, 0x61, 0xee, 0x8d, 0xda, 0x90, 0xec, 0x02, 0x0a, 0xc3, 0xf7, + 0x3c, 0xff, 0x00, 0xf0, 0xca, 0xf8, 0x68, 0x46, 0x00, 0xf0, 0xcd, 0xf8, + 0x9d, 0xed, 0x00, 0x2a, 0xdd, 0xed, 0x00, 0x2a, 0xdd, 0xed, 0x01, 0x1a, + 0xdd, 0xed, 0x02, 0x0a, 0x9d, 0xed, 0x03, 0x1a, 0x2b, 0x89, 0x23, 0x9a, + 0x21, 0x99, 0x20, 0x98, 0x00, 0xf0, 0xa5, 0xf8, 0x9d, 0xed, 0x02, 0x0a, + 0x95, 0xed, 0x01, 0x2a, 0x20, 0xee, 0x80, 0x0a, 0x01, 0xee, 0x01, 0x0a, + 0xdf, 0xed, 0x7c, 0x0a, 0x40, 0xee, 0x0e, 0x1a, 0xf4, 0xee, 0x60, 0xda, + 0x21, 0xee, 0x8d, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, 0xdf, 0xed, + 0x45, 0xda, 0xb4, 0xee, 0x60, 0x0a, 0x95, 0xed, 0x04, 0x1a, 0xd7, 0xed, + 0x00, 0x0a, 0x01, 0xee, 0x90, 0x3a, 0xf1, 0xee, 0x10, 0xfa, 0xb8, 0xee, + 0x41, 0x1a, 0xf8, 0xee, 0x61, 0x1a, 0x48, 0xbf, 0x9f, 0xed, 0x3c, 0x0a, + 0x6d, 0xee, 0xa0, 0x0a, 0x61, 0xee, 0x81, 0x1a, 0xb4, 0xee, 0x60, 0x0a, + 0x81, 0xee, 0x82, 0x2a, 0xf1, 0xee, 0x10, 0xfa, 0xd4, 0xed, 0x1e, 0x1a, + 0x4c, 0xbf, 0xd4, 0xed, 0x20, 0x0a, 0xd4, 0xed, 0x1f, 0x0a, 0xc0, 0xee, + 0x81, 0x0a, 0x88, 0xed, 0x07, 0x0a, 0x2d, 0xee, 0x80, 0x1a, 0xc1, 0xee, + 0x82, 0x1a, 0x60, 0xee, 0x81, 0x0a, 0x3d, 0xee, 0x80, 0x0a, 0xc8, 0xed, + 0x06, 0xda, 0x40, 0xee, 0x21, 0x0a, 0xc6, 0xed, 0x02, 0x0a, 0xc6, 0xed, + 0x03, 0x0a, 0x7b, 0x68, 0x33, 0x61, 0xc8, 0xed, 0x02, 0x0a, 0x6a, 0xee, + 0x2b, 0x0a, 0x91, 0xed, 0x00, 0x0a, 0xc2, 0xed, 0x00, 0xca, 0x48, 0xee, + 0xcb, 0x0a, 0x49, 0xee, 0xcc, 0x0a, 0xc2, 0xed, 0x01, 0x0a, 0x20, 0xee, + 0x2c, 0x1a, 0x60, 0xee, 0x20, 0x0a, 0x82, 0xed, 0x04, 0x1a, 0xc2, 0xed, + 0x05, 0x0a, 0x69, 0xee, 0x2b, 0x0a, 0x29, 0xee, 0x4c, 0x1a, 0x4a, 0xee, + 0x4b, 0x0a, 0x0a, 0xee, 0x6a, 0x1a, 0x60, 0xee, 0x28, 0x1a, 0x49, 0xee, + 0xaa, 0x0a, 0x09, 0xee, 0xcb, 0x1a, 0xc2, 0xed, 0x06, 0x1a, 0xc2, 0xed, + 0x08, 0x0a, 0x82, 0xed, 0x09, 0x1a, 0x00, 0x21, 0xf1, 0xee, 0x4a, 0x1a, + 0x60, 0xee, 0x20, 0x0a, 0x20, 0xee, 0x01, 0x1a, 0x20, 0xee, 0x29, 0x2a, + 0x20, 0xee, 0x21, 0x0a, 0xc2, 0xed, 0x02, 0x8a, 0xd1, 0x60, 0xd1, 0x61, + 0xc2, 0xed, 0x0a, 0x9a, 0xc2, 0xed, 0x0b, 0x1a, 0xc2, 0xed, 0x0c, 0x0a, + 0x82, 0xed, 0x0d, 0x1a, 0x82, 0xed, 0x0e, 0x2a, 0x82, 0xed, 0x0f, 0x0a, + 0x08, 0xb0, 0x00, 0xf5, 0xd9, 0x62, 0xbd, 0xec, 0x10, 0x8b, 0x1c, 0x21, + 0xbd, 0xe8, 0xf0, 0x47, 0x70, 0x30, 0xc5, 0xf7, 0x45, 0xbe, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb0, 0xee, 0x4d, 0x1a, 0xf0, 0xee, 0x6d, 0x1a, + 0x70, 0x47, 0x62, 0xee, 0x22, 0x2a, 0x41, 0xee, 0xa1, 0x2a, 0x62, 0xee, + 0xae, 0x1a, 0x40, 0xee, 0x08, 0x1a, 0x70, 0x47, 0xb0, 0xee, 0x40, 0xda, + 0xf0, 0xee, 0x60, 0xda, 0xb0, 0xee, 0x4d, 0x1a, 0xf0, 0xee, 0x6d, 0x1a, + 0x70, 0x47, 0xb0, 0xee, 0x4f, 0x1a, 0xf0, 0xee, 0x6f, 0x1a, 0xc5, 0xf7, + 0x9e, 0xbb, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x90, 0xec, + 0x02, 0x0a, 0xc5, 0xf7, 0x96, 0xbb, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, + 0x60, 0x1a, 0x9a, 0xec, 0x02, 0x0a, 0xc5, 0xf7, 0x8e, 0xbb, 0x10, 0xb5, + 0x00, 0xf0, 0x39, 0xf8, 0x00, 0x24, 0x00, 0xb9, 0x02, 0x24, 0x20, 0x46, + 0x10, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x47, 0x04, 0x46, 0x0d, 0x46, + 0x1e, 0x46, 0x00, 0xf0, 0xfe, 0xf9, 0x82, 0x46, 0x20, 0x46, 0x00, 0xf0, + 0x1d, 0xfa, 0x07, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x0b, 0xfa, 0x80, 0x46, + 0x20, 0x46, 0x00, 0xf0, 0x0e, 0xfa, 0x00, 0xee, 0x10, 0x6a, 0xb8, 0xee, + 0x40, 0x0a, 0xdf, 0xed, 0x80, 0x0a, 0x81, 0x46, 0x80, 0xee, 0x20, 0x0a, + 0x8a, 0xed, 0x00, 0x0a, 0x20, 0x46, 0x00, 0xf0, 0x9c, 0xf9, 0x30, 0xb9, + 0x3b, 0x46, 0x4a, 0x46, 0x41, 0x46, 0x28, 0x46, 0xbd, 0xe8, 0xf0, 0x47, + 0x09, 0xe0, 0x00, 0x20, 0xbd, 0xe8, 0xf0, 0x87, 0xff, 0xe6, 0xdb, 0x2e, + 0x80, 0xb5, 0x00, 0xf0, 0xe9, 0xf9, 0x58, 0x30, 0x02, 0xbd, 0xf8, 0xb5, + 0x2d, 0xed, 0x0a, 0x8b, 0x91, 0xed, 0x0e, 0x0a, 0x00, 0xf1, 0xa8, 0x06, + 0xff, 0xee, 0x00, 0x0a, 0x70, 0xee, 0x20, 0x0a, 0xf0, 0xee, 0xe0, 0x0a, + 0x96, 0xed, 0x02, 0x1a, 0x01, 0x25, 0xb4, 0xee, 0x60, 0x1a, 0xf1, 0xee, + 0x10, 0xfa, 0x14, 0x46, 0x00, 0xf1, 0xc8, 0x80, 0xd3, 0xed, 0x00, 0x0a, + 0x40, 0xee, 0x40, 0x0a, 0x96, 0xed, 0x00, 0x0a, 0x00, 0xf0, 0xfe, 0xf8, + 0x76, 0xd4, 0x91, 0xed, 0x03, 0x0a, 0xd3, 0xed, 0x01, 0x0a, 0x40, 0xee, + 0x40, 0x0a, 0x96, 0xed, 0x01, 0x0a, 0x00, 0xf0, 0xf3, 0xf8, 0x6b, 0xd4, + 0x94, 0xed, 0x03, 0x0a, 0x5d, 0x4f, 0xb1, 0xee, 0x40, 0x0a, 0xc5, 0xf7, + 0x4d, 0xfb, 0x00, 0xf0, 0xf7, 0xf8, 0x00, 0xf0, 0xc4, 0xf8, 0x94, 0xed, + 0x02, 0x0a, 0xc5, 0xf7, 0x45, 0xfb, 0x00, 0xf0, 0xcb, 0xf8, 0xb0, 0xee, + 0x40, 0xaa, 0x94, 0xed, 0x01, 0x0a, 0xf0, 0xee, 0x60, 0xaa, 0xb1, 0xee, + 0x40, 0x0a, 0xc5, 0xf7, 0x39, 0xfb, 0x00, 0xf0, 0xe3, 0xf8, 0x00, 0xf0, + 0xb0, 0xf8, 0x94, 0xed, 0x00, 0x0a, 0x4f, 0x4c, 0xc5, 0xf7, 0x30, 0xfb, + 0x00, 0xf0, 0xb6, 0xf8, 0x00, 0xf0, 0xa7, 0xf8, 0x00, 0xf0, 0xb8, 0xf8, + 0x00, 0xf0, 0xcb, 0xf8, 0xc5, 0xf7, 0xd3, 0xfa, 0xb0, 0xee, 0x40, 0x9a, + 0xf0, 0xee, 0x60, 0x9a, 0x00, 0xf0, 0x8e, 0xf8, 0xc0, 0x46, 0xc0, 0x46, + 0xb0, 0xee, 0x40, 0xba, 0x00, 0xf0, 0x88, 0xf8, 0xc0, 0x46, 0xc0, 0x46, + 0x2b, 0xee, 0x00, 0xba, 0x00, 0xf0, 0x82, 0xf8, 0xb0, 0xee, 0x60, 0x0a, + 0xf0, 0xee, 0x40, 0xba, 0x00, 0xf0, 0x7c, 0xf8, 0xb0, 0xee, 0x60, 0x0a, + 0x6b, 0xee, 0x80, 0xba, 0x00, 0xf0, 0x9e, 0xf8, 0xc0, 0x46, 0xc0, 0x46, + 0xb0, 0xee, 0x40, 0xca, 0x00, 0xf0, 0x98, 0xf8, 0xc0, 0x46, 0xc0, 0x46, + 0x2c, 0xee, 0x00, 0xca, 0x00, 0xf0, 0x92, 0xf8, 0xb0, 0xee, 0x60, 0x0a, + 0xf0, 0xee, 0x40, 0xca, 0x00, 0xf0, 0x8c, 0xf8, 0xb0, 0xee, 0x60, 0x0a, + 0x0c, 0xee, 0x80, 0xca, 0x96, 0xed, 0x04, 0x0a, 0x3b, 0xee, 0x2b, 0x9a, + 0x2c, 0xee, 0x00, 0x0a, 0xb4, 0xee, 0x49, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x46, 0xd4, 0x00, 0xf0, 0x73, 0xf8, 0x00, 0xf0, 0x86, 0xf8, 0xc5, 0xf7, + 0xa1, 0xfa, 0x00, 0xf0, 0x5a, 0xf8, 0x00, 0xf0, 0x5d, 0xf8, 0xc0, 0x46, + 0xc0, 0x46, 0xb0, 0xee, 0x40, 0x9a, 0x00, 0xf0, 0x57, 0xf8, 0xc0, 0x46, + 0xc0, 0x46, 0x29, 0xee, 0x00, 0x9a, 0x00, 0xf0, 0x51, 0xf8, 0xb0, 0xee, + 0x60, 0x0a, 0xf0, 0xee, 0x40, 0x9a, 0x00, 0xf0, 0x4b, 0xf8, 0xb0, 0xee, + 0x60, 0x0a, 0x69, 0xee, 0x80, 0x9a, 0x00, 0xf0, 0x3b, 0xf8, 0x00, 0xf0, + 0x5d, 0xf8, 0xc0, 0x46, 0xc0, 0x46, 0xb0, 0xee, 0x40, 0xaa, 0x00, 0xf0, + 0x33, 0xf8, 0x00, 0xf0, 0x55, 0xf8, 0xc0, 0x46, 0xc0, 0x46, 0x2a, 0xee, + 0x00, 0xba, 0x00, 0xf0, 0x2b, 0xf8, 0x00, 0xf0, 0x4d, 0xf8, 0xf0, 0xee, + 0x60, 0xaa, 0x00, 0xf0, 0x25, 0xf8, 0x00, 0xf0, 0x47, 0xf8, 0x0a, 0xee, + 0xa0, 0xba, 0x96, 0xed, 0x04, 0x0a, 0x39, 0xee, 0x29, 0x1a, 0x2b, 0xee, + 0x00, 0x0a, 0xb4, 0xee, 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x00, 0xd5, + 0x00, 0x25, 0xbd, 0xec, 0x0a, 0x8b, 0x28, 0x46, 0xf2, 0xbd, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0x43, 0xcd, 0xcc, 0xcc, 0x3d, 0xec, 0x55, 0x00, 0x21, + 0xf4, 0x55, 0x00, 0x21, 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, + 0x94, 0xec, 0x02, 0x0a, 0xc5, 0xf7, 0x4a, 0xba, 0xb0, 0xee, 0x48, 0x1a, + 0xf0, 0xee, 0x68, 0x1a, 0x70, 0x47, 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, + 0x60, 0x8a, 0x70, 0x47, 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, + 0x94, 0xec, 0x02, 0x0a, 0xc5, 0xf7, 0x38, 0xba, 0xb0, 0xee, 0x48, 0x1a, + 0xf0, 0xee, 0x68, 0x1a, 0xc5, 0xf7, 0x1f, 0xba, 0xb0, 0xee, 0x48, 0x1a, + 0xf0, 0xee, 0x68, 0x1a, 0x97, 0xec, 0x02, 0x0a, 0xc5, 0xf7, 0x3d, 0xba, + 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, 0x94, 0xec, 0x02, 0x0a, + 0xc5, 0xf7, 0x0f, 0xba, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x70, 0x47, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0xb0, 0xee, + 0x4a, 0x0a, 0xf0, 0xee, 0x6a, 0x0a, 0x70, 0x47, 0xb0, 0xee, 0x40, 0x1a, + 0xf0, 0xee, 0x60, 0x1a, 0x97, 0xec, 0x02, 0x0a, 0xc5, 0xf7, 0x1f, 0xba, + 0x2d, 0xe9, 0xf8, 0x43, 0x81, 0x46, 0x00, 0xf0, 0xc5, 0xf8, 0x48, 0x46, + 0x00, 0xf0, 0x4c, 0xf9, 0x40, 0xf6, 0x94, 0x22, 0x23, 0x49, 0x80, 0x46, + 0xc4, 0xf7, 0x88, 0xfa, 0x08, 0xf5, 0x3b, 0x66, 0x3e, 0x25, 0x08, 0xf1, + 0x0c, 0x01, 0x00, 0xf0, 0x3f, 0xf8, 0x08, 0xf1, 0x10, 0x01, 0x00, 0xf0, + 0x3b, 0xf8, 0x06, 0x24, 0x1a, 0xe0, 0x00, 0x2c, 0xf3, 0xd0, 0x07, 0xf1, + 0x18, 0x01, 0x00, 0xf0, 0x33, 0xf8, 0xf8, 0x69, 0x10, 0xf1, 0x01, 0x0f, + 0x03, 0xd0, 0x07, 0xf1, 0x1c, 0x01, 0x00, 0xf0, 0x2b, 0xf8, 0x38, 0x6a, + 0x10, 0xf1, 0x01, 0x0f, 0x03, 0xd0, 0x07, 0xf1, 0x20, 0x01, 0x00, 0xf0, + 0x23, 0xf8, 0x07, 0xf1, 0x24, 0x01, 0x00, 0xf0, 0x1f, 0xf8, 0x0b, 0x34, + 0x6d, 0x1e, 0x08, 0xeb, 0x84, 0x07, 0xe0, 0xd1, 0xc4, 0xf5, 0x3b, 0x74, + 0xff, 0x22, 0xa1, 0x00, 0x38, 0x46, 0xc3, 0xf7, 0x51, 0xfd, 0xff, 0x22, + 0x42, 0xf2, 0x2c, 0x41, 0x06, 0xf6, 0xcc, 0x10, 0xec, 0xf7, 0xb4, 0xf9, + 0x43, 0xf2, 0xa4, 0x10, 0x30, 0x44, 0xbd, 0xe8, 0xf8, 0x43, 0xff, 0x22, + 0x4f, 0xf4, 0x2b, 0x71, 0xec, 0xf7, 0xaa, 0xb9, 0x4c, 0xcc, 0x03, 0x02, + 0x48, 0x46, 0x00, 0xf0, 0xbc, 0xb8, 0x3e, 0xb5, 0x00, 0xf0, 0x29, 0xf8, + 0x0c, 0x21, 0x01, 0x91, 0x0b, 0x22, 0x00, 0x92, 0x00, 0xf2, 0xd4, 0x71, + 0x12, 0xe0, 0x3e, 0xb5, 0x00, 0xf0, 0x1f, 0xf8, 0x01, 0x46, 0x06, 0x20, + 0x01, 0x22, 0x00, 0x90, 0x01, 0x92, 0x00, 0x23, 0x0a, 0xe0, 0x3e, 0xb5, + 0x00, 0xf0, 0x15, 0xf8, 0x1a, 0x21, 0x01, 0x91, 0x0b, 0x22, 0x00, 0x92, + 0x00, 0xf1, 0x18, 0x01, 0x00, 0x23, 0x00, 0x22, 0x20, 0x46, 0x00, 0xf0, + 0xa1, 0xf8, 0x4f, 0xf4, 0x7a, 0x71, 0x20, 0x46, 0x00, 0xf0, 0xb7, 0xf8, + 0x00, 0x25, 0x00, 0xb1, 0x01, 0x25, 0x28, 0x46, 0x3e, 0xbd, 0x04, 0x46, + 0x00, 0xf0, 0xce, 0xb8, 0x3e, 0xb5, 0xff, 0xf7, 0xfa, 0xff, 0x23, 0x21, + 0x01, 0x91, 0x0b, 0x22, 0x00, 0x92, 0x00, 0xf5, 0x92, 0x61, 0xe3, 0xe7, + 0x00, 0xf0, 0xc2, 0xb8, 0x80, 0xb5, 0x00, 0xf0, 0xbf, 0xf8, 0x00, 0xf5, + 0x49, 0x60, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0xb9, 0xf8, 0x41, 0xf2, + 0xc8, 0x31, 0x08, 0x44, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0xb2, 0xf8, + 0x41, 0xf2, 0xb0, 0x41, 0x08, 0x44, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, + 0xab, 0xf8, 0x43, 0xf6, 0xa8, 0x11, 0x08, 0x44, 0x02, 0xbd, 0x80, 0xb5, + 0x00, 0xf0, 0xa4, 0xf8, 0x43, 0xf6, 0xbc, 0x11, 0x08, 0x44, 0x02, 0xbd, + 0x80, 0xb5, 0x00, 0xf0, 0x9d, 0xf8, 0x41, 0xf2, 0xb4, 0x41, 0x08, 0x44, + 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x96, 0xf8, 0x41, 0xf2, 0x64, 0x51, + 0x08, 0x44, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x8f, 0xf8, 0x41, 0xf2, + 0x74, 0x51, 0x08, 0x44, 0x02, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x04, 0x46, + 0x50, 0x48, 0x51, 0x4e, 0x50, 0xf8, 0x24, 0x50, 0x06, 0xeb, 0x84, 0x07, + 0x04, 0x21, 0x07, 0xf5, 0x29, 0x70, 0xd7, 0xf7, 0xcb, 0xf8, 0x50, 0x21, + 0x03, 0x22, 0x61, 0x43, 0x00, 0x92, 0x31, 0x44, 0x01, 0xf1, 0x24, 0x03, + 0x00, 0x22, 0x00, 0x21, 0x01, 0x20, 0xe2, 0xf7, 0x77, 0xf9, 0x78, 0x60, + 0x81, 0x20, 0xdc, 0xf7, 0x41, 0xff, 0x01, 0x46, 0x01, 0x20, 0x00, 0xfa, + 0x04, 0xf4, 0x21, 0x43, 0x81, 0x20, 0xdc, 0xf7, 0x0e, 0xff, 0x82, 0x20, + 0xdc, 0xf7, 0x36, 0xff, 0x44, 0xea, 0x00, 0x01, 0x82, 0x20, 0xdc, 0xf7, + 0x06, 0xff, 0x30, 0x78, 0xa8, 0xb9, 0x81, 0x20, 0xdc, 0xf7, 0x70, 0xfe, + 0x82, 0x20, 0xdc, 0xf7, 0x6d, 0xfe, 0x06, 0x21, 0x81, 0x20, 0xdc, 0xf7, + 0xd4, 0xfe, 0x06, 0x21, 0x82, 0x20, 0xdc, 0xf7, 0xd0, 0xfe, 0x81, 0x20, + 0xdc, 0xf7, 0xb3, 0xfe, 0x82, 0x20, 0xdc, 0xf7, 0xb0, 0xfe, 0x01, 0x20, + 0x30, 0x70, 0x31, 0x49, 0x45, 0xf8, 0x58, 0x1f, 0xf1, 0xbd, 0x30, 0x4b, + 0x0a, 0x68, 0x53, 0xf8, 0x20, 0x00, 0x82, 0x18, 0x0a, 0x60, 0x70, 0x47, + 0x70, 0xb5, 0x00, 0x2a, 0x2c, 0x4c, 0x54, 0xf8, 0x20, 0x40, 0x0c, 0xbf, + 0x26, 0x4a, 0x2b, 0x4a, 0x26, 0x1d, 0x52, 0xf8, 0x20, 0x50, 0x05, 0x9a, + 0x04, 0x98, 0x30, 0x60, 0x5b, 0x19, 0x04, 0xf1, 0x08, 0x00, 0x01, 0x60, + 0x04, 0xf1, 0x0c, 0x01, 0x0b, 0x60, 0x04, 0xf1, 0x10, 0x03, 0x1a, 0x60, + 0x01, 0x22, 0x22, 0x60, 0x70, 0xbd, 0x38, 0xb5, 0x1f, 0x4a, 0x1b, 0x4b, + 0x52, 0xf8, 0x20, 0x50, 0x53, 0xf8, 0x20, 0x40, 0x19, 0x4a, 0x02, 0xeb, + 0x80, 0x03, 0x58, 0x68, 0xe2, 0xf7, 0xce, 0xfa, 0x20, 0xb9, 0x04, 0x21, + 0x44, 0xf8, 0x30, 0x1f, 0x02, 0x20, 0x32, 0xbd, 0x55, 0xf8, 0x1c, 0x0f, + 0x41, 0x07, 0x05, 0xd5, 0x04, 0x22, 0x01, 0x20, 0x2a, 0x60, 0x44, 0xf8, + 0x3c, 0x0f, 0x32, 0xbd, 0x00, 0x20, 0x32, 0xbd, 0x0f, 0x49, 0x51, 0xf8, + 0x20, 0x00, 0x70, 0x47, 0x80, 0xb5, 0x00, 0x22, 0x00, 0x92, 0x69, 0x46, + 0x09, 0x4b, 0x03, 0xeb, 0x80, 0x02, 0x50, 0x68, 0xe2, 0xf7, 0x14, 0xfa, + 0x00, 0x98, 0x38, 0xb1, 0x0a, 0x48, 0x4f, 0xf0, 0x80, 0x51, 0x01, 0x60, + 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x01, 0xbd, 0x00, 0x00, + 0x40, 0x97, 0x04, 0x02, 0xb8, 0x3d, 0x02, 0x21, 0xd6, 0xff, 0xff, 0x07, + 0x60, 0x97, 0x04, 0x02, 0xa0, 0x97, 0x04, 0x02, 0x80, 0x97, 0x04, 0x02, + 0x04, 0xed, 0x00, 0xe0, 0x38, 0xb5, 0x81, 0x20, 0xdc, 0xf7, 0xf7, 0xfd, + 0x04, 0x46, 0x00, 0x25, 0x24, 0xfa, 0x05, 0xf0, 0xc0, 0x07, 0x44, 0xbf, + 0x28, 0x46, 0xff, 0xf7, 0xcf, 0xff, 0x6d, 0x1c, 0x08, 0x2d, 0xf5, 0xd3, + 0x31, 0xbd, 0x38, 0xb5, 0x82, 0x20, 0xdc, 0xf7, 0xe6, 0xfd, 0x04, 0x46, + 0x00, 0x25, 0x24, 0xfa, 0x05, 0xf0, 0xc0, 0x07, 0x44, 0xbf, 0x28, 0x46, + 0xff, 0xf7, 0xbe, 0xff, 0x6d, 0x1c, 0x08, 0x2d, 0xf5, 0xd3, 0x31, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x3c, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, + 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x78, 0x0c, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x03, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x0c, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0x0c, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x01, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0b, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, + 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcc, 0x0b, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x03, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x0b, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x01, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0b, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x0c, 0x00, 0x00, 0x38, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x3c, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1c, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, 0xe4, 0x3c, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xc8, 0x13, 0x00, 0x00, 0x90, 0x0c, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x14, 0x00, 0x00, 0x38, 0x14, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xe4, 0x3c, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, + 0x1c, 0x1c, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0d, 0x00, 0x00, 0xe4, 0x3c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x0d, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x14, 0x00, 0x00, + 0xac, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x3c, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x01, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x1c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x3c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb4, 0x14, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x0c, 0x00, 0x00, + 0xb0, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x3c, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x01, 0x00, 0x00, 0xbc, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x3c, 0x00, 0x00, 0xbc, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb8, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x14, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x0c, 0x00, 0x00, + 0xb0, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x3c, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x01, 0x00, 0x00, 0xe8, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x3c, 0x00, 0x00, 0xe8, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, + 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb4, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0c, 0x15, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x01, 0x00, 0x07, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x15, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x3c, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x11, 0x01, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd0, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x28, 0x15, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x01, 0x00, + 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x3c, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0xf1, 0xee, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x01, 0x00, 0x01, 0x07, 0x00, 0x00, + 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x0b, 0x00, 0x00, + 0x0c, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x64, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf1, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x01, 0x00, 0x01, 0x07, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xcc, 0x0b, 0x00, 0x00, 0x0c, 0x15, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x68, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf1, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x01, 0x00, + 0x01, 0x0f, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0c, 0x00, 0x00, 0x28, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x6c, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xee, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x01, 0x00, 0x01, 0x0f, 0x00, 0x00, + 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x0c, 0x00, 0x00, + 0x28, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x70, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x22, 0x01, 0x00, 0x02, 0x07, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb0, 0x0b, 0x00, 0x00, 0xbc, 0x39, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x22, 0x01, 0x00, + 0x02, 0x03, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe8, 0x0b, 0x00, 0x00, 0xcc, 0x39, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x34, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x22, 0x01, 0x00, 0x02, 0x0f, 0x00, 0x00, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, + 0xdc, 0x39, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x4c, 0x3a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x22, 0x01, 0x00, 0x02, 0x03, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x00, 0x00, 0xec, 0x39, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xc4, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, + 0x1c, 0x02, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0x39, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xdc, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x02, 0x1c, 0x00, 0x00, + 0x1c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x3a, 0x00, 0x00, + 0xfc, 0x39, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xbc, 0x3b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xbc, 0x3b, 0x00, 0x00, 0xb8, 0x39, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xc8, 0x3b, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x01, 0x00, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc8, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x3b, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x01, 0x00, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0xe0, 0x3b, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x39, 0x00, 0x00, 0xe0, 0x3b, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe8, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xec, 0x3b, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x01, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe4, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x3b, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x02, 0x00, 0x00, + 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3b, 0x00, 0x00, + 0xec, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf8, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x3b, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf8, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x3c, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3b, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x3b, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4a, 0x00, 0x01, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xec, 0x3b, 0x00, 0x00, 0xf8, 0x3b, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xec, 0x3b, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, + 0x02, 0x1c, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xdc, 0x3a, 0x00, 0x00, 0xec, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x04, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1c, 0x02, 0x00, 0x00, + 0x02, 0x01, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, 0x04, 0x3c, 0x00, 0x00, + 0xa8, 0x39, 0x00, 0x00, 0x90, 0x0c, 0x00, 0x00, 0x90, 0x0c, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x01, 0x00, 0x1c, 0x02, 0x00, 0x00, 0x02, 0x1c, 0x00, 0x00, + 0x1c, 0x1c, 0x00, 0x00, 0x04, 0x3c, 0x00, 0x00, 0xdc, 0x3a, 0x00, 0x00, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb4, 0x14, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x0c, 0x00, 0x00, + 0xb0, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x3c, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x01, 0x00, 0x00, 0xbc, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x3c, 0x00, 0x00, 0xbc, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb8, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x14, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x0c, 0x00, 0x00, + 0xb0, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x3c, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x01, 0x00, 0x00, 0xe8, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x3c, 0x00, 0x00, 0xe8, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, + 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb4, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0c, 0x15, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x01, 0x00, 0x07, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x15, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x3c, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x11, 0x01, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd0, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x28, 0x15, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x01, 0x00, + 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x3c, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x0f, 0x00, 0x00, + 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x14, 0x00, 0x00, + 0xd0, 0x14, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x74, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x01, 0x07, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x14, 0x00, 0x00, 0xb4, 0x14, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x78, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf1, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x01, 0x00, + 0x01, 0x07, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0x0b, 0x00, 0x00, 0x0c, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x64, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xee, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x01, 0x00, 0x01, 0x07, 0x00, 0x00, + 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x0b, 0x00, 0x00, + 0x0c, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x68, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf1, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x66, 0x01, 0x00, 0x01, 0x0f, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x28, 0x15, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x6c, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf1, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x01, 0x00, + 0x01, 0x0f, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x0c, 0x00, 0x00, 0x28, 0x15, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, + 0x2d, 0xed, 0x0a, 0x8b, 0x0d, 0x46, 0xad, 0xf5, 0x08, 0x7d, 0x2f, 0x69, + 0x0b, 0x97, 0x80, 0x46, 0xa9, 0x68, 0xe8, 0x68, 0xd5, 0xf8, 0x14, 0x90, + 0x00, 0x26, 0x0e, 0x60, 0x4e, 0x60, 0x06, 0xa9, 0x04, 0x91, 0x07, 0xaa, + 0x05, 0xab, 0x03, 0x92, 0x02, 0x93, 0x0d, 0xf1, 0x16, 0x01, 0x01, 0x91, + 0x08, 0xa9, 0x00, 0x91, 0x90, 0xf8, 0x5e, 0x30, 0xc2, 0x68, 0x81, 0x68, + 0x90, 0xed, 0x04, 0x0a, 0x40, 0x46, 0x00, 0xf0, 0x01, 0xfd, 0x04, 0x46, + 0x08, 0x99, 0x48, 0x46, 0x41, 0x60, 0xc0, 0x46, 0x00, 0x2c, 0x4f, 0xd1, + 0x07, 0xf1, 0x08, 0x01, 0x10, 0x22, 0x0c, 0xa8, 0x01, 0x91, 0x00, 0x92, + 0x02, 0x90, 0x06, 0x9a, 0x07, 0x99, 0x04, 0x23, 0x40, 0x46, 0x00, 0xf0, + 0x40, 0xfd, 0xf0, 0xb9, 0x00, 0x23, 0x0c, 0x22, 0x39, 0x46, 0x0d, 0xac, + 0x02, 0xfb, 0x03, 0xf7, 0x0d, 0xf1, 0x30, 0x0c, 0x01, 0xeb, 0x03, 0x10, + 0x5c, 0xf8, 0x07, 0xe0, 0x40, 0xf8, 0x20, 0xef, 0x0d, 0xf1, 0x38, 0x0e, + 0x54, 0xf8, 0x07, 0xc0, 0xa0, 0xf8, 0x04, 0xc0, 0x5b, 0x1c, 0x5e, 0xf8, + 0x07, 0x70, 0xc7, 0x80, 0x04, 0x2b, 0x87, 0x88, 0x07, 0x81, 0x46, 0x81, + 0x86, 0x81, 0xe5, 0xd3, 0x0f, 0x46, 0x41, 0x22, 0x07, 0xf1, 0x90, 0x01, + 0x07, 0xf1, 0x78, 0x00, 0x00, 0xf0, 0xa2, 0xfe, 0x78, 0x1c, 0x01, 0x22, + 0x06, 0x70, 0x42, 0x70, 0x38, 0x1d, 0x06, 0x99, 0x01, 0x60, 0x86, 0x60, + 0xc6, 0x60, 0x06, 0x61, 0x07, 0xf1, 0x62, 0x00, 0xbd, 0xf8, 0x16, 0x10, + 0x01, 0x80, 0xbd, 0xf8, 0x14, 0x20, 0x42, 0x80, 0x07, 0xf1, 0x68, 0x00, + 0x07, 0x99, 0x01, 0x60, 0x01, 0x22, 0xc6, 0x63, 0x46, 0x63, 0x86, 0x63, + 0x82, 0x72, 0x06, 0x72, 0xf4, 0xe2, 0x30, 0x46, 0x00, 0xf0, 0x98, 0xfc, + 0x40, 0x46, 0xf6, 0xf7, 0x63, 0xfd, 0xf0, 0x60, 0x0d, 0xaf, 0x00, 0x20, + 0x01, 0x01, 0x06, 0xf1, 0x28, 0x02, 0x53, 0x5a, 0x47, 0xf8, 0x20, 0x30, + 0x31, 0x44, 0x11, 0xab, 0x0a, 0x6a, 0x00, 0x99, 0x52, 0x1a, 0x43, 0xf8, + 0x20, 0x20, 0x40, 0x1c, 0x04, 0x28, 0xef, 0xd3, 0x70, 0x68, 0x15, 0x90, + 0x15, 0xa8, 0xb1, 0x68, 0x01, 0x71, 0x06, 0xf1, 0x62, 0x0b, 0x04, 0xf1, + 0x5e, 0x01, 0x4a, 0x78, 0x42, 0x71, 0xd9, 0xf8, 0x00, 0x30, 0x83, 0x60, + 0xbb, 0xf8, 0x00, 0x20, 0x82, 0x81, 0x09, 0x78, 0x81, 0x73, 0xb2, 0x78, + 0xc2, 0x73, 0xa1, 0x6a, 0x01, 0x61, 0x40, 0x46, 0x0d, 0xa9, 0x00, 0xf0, + 0xdb, 0xfe, 0x07, 0x00, 0x3f, 0xd1, 0x61, 0x6a, 0x40, 0x46, 0x00, 0xf0, + 0x3b, 0xff, 0x01, 0x28, 0x03, 0xd1, 0x43, 0xf2, 0x03, 0x27, 0x00, 0x20, + 0x2b, 0xe0, 0x02, 0x28, 0x05, 0xd1, 0xda, 0xf8, 0x1c, 0x00, 0x40, 0x1c, + 0xca, 0xf8, 0x1c, 0x00, 0x2b, 0xe0, 0x01, 0xaa, 0x0d, 0xa9, 0x40, 0x46, + 0x00, 0xf0, 0x2c, 0xff, 0xf8, 0xb9, 0xb0, 0x70, 0x01, 0x99, 0x31, 0x61, + 0x02, 0x98, 0x70, 0x61, 0x03, 0x98, 0xb0, 0x61, 0x04, 0x98, 0xf0, 0x61, + 0x01, 0x20, 0x01, 0x99, 0x02, 0x9a, 0x06, 0xeb, 0x01, 0x11, 0x90, 0x40, + 0x0b, 0x8d, 0x8a, 0x8d, 0x83, 0x43, 0x0b, 0x85, 0x02, 0x42, 0x04, 0xbf, + 0x01, 0x22, 0xf2, 0x70, 0x8b, 0x8d, 0x4a, 0x8d, 0x02, 0x43, 0x18, 0x43, + 0x88, 0x85, 0x4a, 0x85, 0x01, 0x20, 0x30, 0x70, 0x07, 0xe0, 0x03, 0x28, + 0x92, 0xd0, 0x9b, 0xf8, 0x10, 0x00, 0x00, 0x28, 0x8b, 0xd0, 0x00, 0x21, + 0x31, 0x70, 0x30, 0x78, 0x10, 0xb9, 0x40, 0x46, 0xf6, 0xf7, 0x2e, 0xfe, + 0x00, 0x2f, 0x40, 0xf0, 0x3a, 0x82, 0x0b, 0x98, 0x01, 0x78, 0x01, 0x29, + 0x40, 0xf0, 0xd8, 0x81, 0xd5, 0xf8, 0x0c, 0xb0, 0xd5, 0xf8, 0x10, 0x90, + 0x69, 0x69, 0x10, 0x91, 0x01, 0x22, 0x8d, 0xf8, 0x28, 0x20, 0x0a, 0xab, + 0x06, 0x22, 0x01, 0x21, 0x40, 0x46, 0xef, 0xf7, 0x90, 0xfb, 0x00, 0x24, + 0x07, 0x00, 0x09, 0xf1, 0x60, 0x0a, 0x21, 0xd1, 0x40, 0x46, 0xef, 0xf7, + 0x2d, 0xfb, 0x0d, 0xa9, 0x40, 0x46, 0xd0, 0xf7, 0xa9, 0xfe, 0x01, 0x24, + 0x07, 0x00, 0x17, 0xd1, 0x04, 0xa9, 0x40, 0x46, 0xd1, 0xf7, 0x69, 0xfd, + 0x40, 0x46, 0xd1, 0xf7, 0x2c, 0xfe, 0x03, 0x90, 0x04, 0xab, 0x0d, 0x98, + 0x02, 0x90, 0x41, 0xaa, 0xda, 0xf8, 0x08, 0x10, 0x01, 0x91, 0x11, 0xa9, + 0xd9, 0xf8, 0x18, 0x00, 0x00, 0x90, 0x0b, 0xf1, 0x30, 0x00, 0x00, 0xf0, + 0x63, 0xff, 0x07, 0x46, 0x00, 0x2f, 0x57, 0xae, 0x41, 0xd1, 0x0b, 0xf1, + 0x54, 0x01, 0x88, 0x88, 0x0e, 0x90, 0x00, 0x20, 0xca, 0x88, 0x0f, 0x92, + 0x0d, 0xf1, 0x2a, 0x02, 0x10, 0x80, 0x9a, 0xf8, 0x10, 0x00, 0x08, 0xb9, + 0x08, 0x89, 0x0e, 0x90, 0x57, 0xa8, 0xcd, 0xf8, 0x24, 0xa0, 0x08, 0x92, + 0x07, 0x90, 0x0a, 0x27, 0x0b, 0x68, 0x06, 0x93, 0x00, 0x22, 0x05, 0x97, + 0x04, 0x92, 0x0e, 0xab, 0xc8, 0x7a, 0x03, 0x90, 0x02, 0x93, 0x9f, 0xed, + 0x67, 0x0a, 0x89, 0x7a, 0x9d, 0xf8, 0x28, 0x20, 0x01, 0x91, 0x41, 0xa9, + 0xba, 0xf8, 0x04, 0x00, 0x00, 0x90, 0x40, 0x46, 0xba, 0xf8, 0x02, 0x30, + 0x00, 0xf0, 0x64, 0xfc, 0x07, 0x46, 0xd9, 0xf8, 0x0c, 0x00, 0x86, 0xf8, + 0x5e, 0x00, 0x96, 0xf8, 0x5e, 0x10, 0x8d, 0xf8, 0x1a, 0x12, 0x9a, 0xf8, + 0x00, 0x00, 0x40, 0xb9, 0xda, 0xf8, 0x48, 0x30, 0xd9, 0xf8, 0x18, 0x10, + 0x10, 0x98, 0x0d, 0xf1, 0x2a, 0x02, 0x01, 0xf0, 0xe0, 0xf8, 0x1c, 0xb1, + 0x05, 0x21, 0x40, 0x46, 0xef, 0xf7, 0xd3, 0xfa, 0x0a, 0xab, 0x06, 0x22, + 0x01, 0x21, 0x40, 0x46, 0xef, 0xf7, 0x43, 0xfb, 0x40, 0x46, 0xf6, 0xf7, + 0x9d, 0xfd, 0x00, 0x2f, 0x40, 0xf0, 0xa9, 0x81, 0x0c, 0x99, 0x08, 0x78, + 0x00, 0x28, 0x00, 0xf0, 0xa4, 0x81, 0xd5, 0xf8, 0x00, 0xa0, 0xcd, 0xf8, + 0x24, 0xa0, 0x69, 0x68, 0x08, 0x91, 0xd5, 0xf8, 0x0c, 0x90, 0xcd, 0xf8, + 0x14, 0x90, 0x2c, 0x69, 0x04, 0x94, 0xaa, 0x68, 0x02, 0xf1, 0x28, 0x00, + 0x07, 0x90, 0x6b, 0x69, 0x06, 0x92, 0x0a, 0x93, 0x04, 0x9a, 0xd7, 0x68, + 0x01, 0x91, 0xd4, 0xf8, 0xa8, 0x10, 0x00, 0x91, 0xdb, 0xf7, 0x9e, 0xfd, + 0x83, 0x46, 0x00, 0x98, 0x59, 0x46, 0xdb, 0xf7, 0xdd, 0xfd, 0x02, 0x46, + 0xe0, 0x78, 0x01, 0x28, 0x10, 0xd1, 0x00, 0x21, 0xe1, 0x70, 0x00, 0x92, + 0x96, 0xed, 0x1b, 0x0a, 0xd9, 0xed, 0x0b, 0x0a, 0x20, 0xee, 0x20, 0x0a, + 0xc2, 0xf7, 0xf4, 0xfc, 0xbc, 0xee, 0xc0, 0x0a, 0x00, 0x9a, 0x10, 0xee, + 0x10, 0x0a, 0x82, 0x18, 0x09, 0xf1, 0x2c, 0x00, 0xc4, 0xf8, 0xa8, 0xb0, + 0x81, 0x6c, 0x8a, 0x42, 0x88, 0xbf, 0x0a, 0x46, 0x01, 0x99, 0x50, 0x46, + 0xfc, 0xf7, 0x58, 0xf9, 0x02, 0x21, 0x40, 0x46, 0x00, 0xf0, 0x1b, 0xfd, + 0x00, 0x23, 0x00, 0xf0, 0xf8, 0xf9, 0x81, 0x46, 0x01, 0x23, 0x00, 0xf0, + 0xf4, 0xf9, 0x03, 0x90, 0x82, 0x46, 0x0c, 0xa9, 0x57, 0xa8, 0x00, 0x91, + 0x01, 0x90, 0x0a, 0x9b, 0x08, 0x9a, 0x09, 0x99, 0xcd, 0xf8, 0x08, 0x90, + 0x40, 0x46, 0x00, 0xf0, 0x99, 0xfc, 0x04, 0x46, 0x04, 0x98, 0xb9, 0xf1, + 0x00, 0x0f, 0x00, 0xf1, 0x70, 0x0b, 0x06, 0xd0, 0xdb, 0xf8, 0x38, 0x30, + 0x07, 0x98, 0x0c, 0xaa, 0x57, 0xa9, 0x00, 0xf0, 0x62, 0xfa, 0xba, 0xf1, + 0x00, 0x0f, 0x06, 0xd0, 0xdb, 0xf8, 0x38, 0x30, 0x07, 0x98, 0x16, 0xaa, + 0x6f, 0xa9, 0x00, 0xf0, 0x58, 0xfa, 0x6c, 0xbb, 0x04, 0x98, 0x78, 0x30, + 0x00, 0xf0, 0x14, 0xfd, 0x04, 0x99, 0x48, 0x78, 0x60, 0xb1, 0x04, 0x98, + 0x00, 0x21, 0x41, 0x70, 0x09, 0x98, 0x08, 0x99, 0xfc, 0xf7, 0x22, 0xfd, + 0x9b, 0xf8, 0x00, 0x00, 0x10, 0xb1, 0x40, 0x1e, 0x8b, 0xf8, 0x00, 0x00, + 0x05, 0x99, 0x48, 0x6e, 0x87, 0x42, 0x34, 0xbf, 0x00, 0x21, 0x39, 0x1a, + 0xc7, 0x19, 0x41, 0x2f, 0x88, 0xbf, 0x41, 0x27, 0x00, 0x20, 0x0c, 0x46, + 0x07, 0xe0, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x01, 0x23, 0xe2, 0xb2, + 0x00, 0xf0, 0x8e, 0xf9, 0x64, 0x1c, 0xa7, 0x42, 0x01, 0xd3, 0x00, 0x28, + 0xf6, 0xd0, 0x04, 0x46, 0x00, 0x2c, 0x08, 0xbf, 0xba, 0xf1, 0x01, 0x0f, + 0x0c, 0xaf, 0x6d, 0xd1, 0x96, 0xed, 0x1b, 0xca, 0xd7, 0xed, 0x0b, 0xca, + 0xdf, 0xf8, 0xac, 0xa5, 0x72, 0xae, 0x00, 0xf0, 0x84, 0xf9, 0x00, 0xf0, + 0x86, 0xf9, 0x00, 0xf0, 0x78, 0xf9, 0x00, 0xf0, 0x6c, 0xf9, 0xb0, 0xee, + 0x40, 0xba, 0x00, 0xf0, 0x7a, 0xf9, 0x00, 0xf0, 0x7c, 0xf9, 0x00, 0xf0, + 0x6e, 0xf9, 0x00, 0xf0, 0x62, 0xf9, 0xb0, 0xee, 0x40, 0x8a, 0x00, 0xf0, + 0x70, 0xf9, 0x00, 0xf0, 0x72, 0xf9, 0xb0, 0xee, 0x40, 0x9a, 0xf0, 0xee, + 0x60, 0x9a, 0x96, 0xed, 0x01, 0x0a, 0xc4, 0xf7, 0x05, 0xf9, 0xb0, 0xee, + 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, 0xc4, 0xf7, 0xac, 0xf8, 0xf0, 0xee, + 0x60, 0x9a, 0x00, 0xf0, 0x5c, 0xf9, 0x00, 0xf0, 0x5e, 0xf9, 0xb0, 0xee, + 0x40, 0xaa, 0xf0, 0xee, 0x60, 0xaa, 0x96, 0xed, 0x01, 0x0a, 0xc4, 0xf7, + 0xf1, 0xf8, 0xb0, 0xee, 0x4a, 0x1a, 0xf0, 0xee, 0x6a, 0x1a, 0xc4, 0xf7, + 0x98, 0xf8, 0x2b, 0xee, 0x08, 0x1a, 0x09, 0xee, 0xa0, 0x1a, 0x2c, 0xee, + 0x0c, 0x0a, 0x81, 0xee, 0x00, 0x0a, 0x05, 0x98, 0x90, 0xed, 0x05, 0x1a, + 0xd0, 0xed, 0x07, 0x0a, 0xb4, 0xee, 0x41, 0xca, 0xf1, 0xee, 0x10, 0xfa, + 0x58, 0xbf, 0xb0, 0xee, 0x41, 0xca, 0x81, 0xee, 0x0c, 0x1a, 0x61, 0xee, + 0x20, 0x0a, 0x90, 0xed, 0x06, 0x1a, 0xb4, 0xee, 0x40, 0x1a, 0xf1, 0xee, + 0x10, 0xfa, 0x58, 0xbf, 0xb0, 0xee, 0x41, 0x0a, 0x80, 0xee, 0x01, 0x0a, + 0x20, 0xee, 0x20, 0x0a, 0xb4, 0xee, 0x6c, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x44, 0xbf, 0x00, 0x20, 0x8b, 0xf8, 0x02, 0x00, 0xb9, 0xf1, 0x01, 0x0f, + 0x0c, 0xd1, 0x05, 0x98, 0xd7, 0xed, 0x01, 0x0a, 0x90, 0xed, 0x08, 0x0a, + 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xbf, 0x02, 0x20, + 0x8b, 0xf8, 0x00, 0x00, 0x60, 0x1e, 0x80, 0x41, 0xc0, 0x0f, 0x8b, 0xf8, + 0x01, 0x00, 0x9b, 0xf8, 0x01, 0x00, 0x00, 0x28, 0x1c, 0xbf, 0x9d, 0xf8, + 0x7d, 0x00, 0x00, 0x28, 0x12, 0xd0, 0x06, 0x98, 0x01, 0x69, 0x49, 0x1c, + 0x01, 0x61, 0x97, 0xed, 0x0b, 0x0a, 0xc3, 0xf7, 0x27, 0xfa, 0xfa, 0xee, + 0x04, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xc2, 0xf7, 0xe3, 0xfb, 0x06, 0x98, + 0xbc, 0xee, 0xc0, 0x0a, 0x80, 0xed, 0x02, 0x0a, 0x27, 0x46, 0x5c, 0xe0, + 0xef, 0x68, 0x2c, 0x69, 0x04, 0x21, 0x40, 0x46, 0x00, 0x26, 0x00, 0xf0, + 0x12, 0xfc, 0xb1, 0x46, 0xb8, 0x6e, 0x81, 0x45, 0x17, 0xd2, 0xd4, 0xf8, + 0xa4, 0x10, 0x04, 0xf1, 0x78, 0x00, 0x00, 0xf0, 0x66, 0xfc, 0x20, 0xb1, + 0xd4, 0xf8, 0xa4, 0x20, 0x00, 0xf0, 0xe7, 0xf8, 0x06, 0x46, 0xd4, 0xf8, + 0xa4, 0x00, 0x40, 0x1c, 0x41, 0x28, 0x28, 0xbf, 0x00, 0x20, 0x00, 0x2e, + 0xc4, 0xf8, 0xa4, 0x00, 0x09, 0xf1, 0x01, 0x09, 0xe4, 0xd0, 0x37, 0x46, + 0x00, 0x20, 0x00, 0x23, 0x04, 0xeb, 0x00, 0x11, 0x20, 0x31, 0x40, 0x1c, + 0x4a, 0x89, 0x8a, 0x81, 0x04, 0x28, 0x4b, 0x81, 0xf6, 0xd3, 0x01, 0x20, + 0xa0, 0x70, 0x20, 0x46, 0x00, 0xf0, 0x0c, 0xfa, 0xeb, 0xf7, 0xf0, 0xfe, + 0x00, 0x28, 0x08, 0xbf, 0x00, 0x2f, 0x22, 0xd1, 0xd5, 0xf8, 0x10, 0xa0, + 0xda, 0xf8, 0x0c, 0x60, 0xec, 0x68, 0xd5, 0xf8, 0x08, 0x90, 0x00, 0x23, + 0x00, 0xf0, 0x9d, 0xf8, 0x07, 0x46, 0xd9, 0xf8, 0x0c, 0x10, 0x64, 0x20, + 0xc9, 0xf8, 0x04, 0x00, 0x49, 0x1c, 0xc9, 0xf8, 0x0c, 0x10, 0xe0, 0x6e, + 0xe0, 0xf7, 0xa6, 0xf9, 0x00, 0x20, 0xc9, 0xf8, 0x04, 0x00, 0x00, 0x21, + 0x0a, 0xf1, 0x9c, 0x00, 0x01, 0x60, 0x41, 0x60, 0x1f, 0xb9, 0x01, 0x23, + 0x00, 0xf0, 0x85, 0xf8, 0x07, 0x46, 0x29, 0x46, 0x40, 0x46, 0x01, 0xf0, + 0x2c, 0xfa, 0x3e, 0x46, 0x2f, 0x69, 0xec, 0x68, 0x69, 0x68, 0x28, 0x68, + 0xfc, 0xf7, 0x60, 0xff, 0x04, 0xf1, 0x8c, 0x01, 0x07, 0xf1, 0x9c, 0x02, + 0xf8, 0xb9, 0x43, 0xf2, 0x0c, 0x20, 0x86, 0x42, 0x1c, 0xbf, 0x43, 0xf2, + 0x06, 0x23, 0x9e, 0x42, 0x18, 0xd0, 0x43, 0xf2, 0x03, 0x20, 0x86, 0x42, + 0x1c, 0xbf, 0x43, 0xf2, 0x01, 0x23, 0x9e, 0x42, 0x07, 0xd0, 0x4f, 0xf6, + 0x70, 0x70, 0x86, 0x42, 0x1c, 0xbf, 0x4f, 0xf6, 0x78, 0x73, 0x9e, 0x42, + 0x14, 0xd1, 0x10, 0x68, 0x40, 0x1c, 0x10, 0x60, 0x09, 0x68, 0x81, 0x42, + 0x0e, 0xd3, 0x03, 0x22, 0x07, 0xe0, 0x06, 0x46, 0x50, 0x68, 0x40, 0x1c, + 0x50, 0x60, 0x4b, 0x68, 0x83, 0x42, 0xe0, 0xd3, 0x00, 0x22, 0x29, 0x46, + 0x40, 0x46, 0x00, 0xf0, 0x64, 0xf9, 0x00, 0x26, 0xeb, 0xf7, 0x8a, 0xfe, + 0x30, 0xbb, 0x2e, 0xbb, 0x0b, 0x99, 0xc8, 0x70, 0x00, 0x27, 0x0b, 0x99, + 0x08, 0x70, 0x00, 0x21, 0x0b, 0x98, 0x00, 0xf1, 0x60, 0x02, 0x0c, 0x92, + 0x11, 0x70, 0x00, 0x22, 0x0c, 0x99, 0x4a, 0x74, 0xec, 0x68, 0x2e, 0x69, + 0xd5, 0xf8, 0x08, 0xa0, 0x01, 0x21, 0x40, 0x46, 0x00, 0xf0, 0x65, 0xfb, + 0x69, 0x46, 0x40, 0x46, 0xd0, 0xf7, 0x34, 0xfc, 0x04, 0xf1, 0x60, 0x09, + 0x40, 0x46, 0xd9, 0xf8, 0x10, 0x10, 0xf6, 0xf7, 0x8b, 0xfb, 0x02, 0x28, + 0x7f, 0xf4, 0xe6, 0xac, 0x37, 0x70, 0x5b, 0xe5, 0x30, 0x00, 0xae, 0x68, + 0x03, 0xd1, 0x28, 0x69, 0xc2, 0x68, 0x00, 0xf0, 0x32, 0xf8, 0x01, 0x00, + 0x72, 0x69, 0x18, 0xbf, 0x01, 0x21, 0x52, 0xfa, 0x81, 0xf1, 0x71, 0x61, + 0x30, 0x60, 0x64, 0x23, 0x73, 0x60, 0x0d, 0xf5, 0x08, 0x7d, 0xbd, 0xec, + 0x0a, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, + 0x68, 0x1a, 0xc3, 0xf7, 0x58, 0xbf, 0xf2, 0xb2, 0x29, 0x46, 0x40, 0x46, + 0x8b, 0xe0, 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, 0x60, 0x8a, 0x96, 0xed, + 0x01, 0x0a, 0xc3, 0xf7, 0x9f, 0xbf, 0x96, 0xed, 0x03, 0x0a, 0xc3, 0xf7, + 0x9b, 0xbf, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x9a, 0xec, + 0x02, 0x0a, 0xc3, 0xf7, 0x66, 0xbf, 0x57, 0xaa, 0x29, 0x46, 0x40, 0x46, + 0x2d, 0xe0, 0x00, 0x23, 0xd2, 0xb2, 0x29, 0x46, 0x40, 0x46, 0x6e, 0xe0, + 0x10, 0xb5, 0x8c, 0x68, 0x20, 0x46, 0xeb, 0xf7, 0x05, 0xfe, 0x00, 0x21, + 0x04, 0xf1, 0x28, 0x00, 0x61, 0x61, 0xa1, 0x61, 0xe1, 0x61, 0x61, 0x62, + 0x01, 0x70, 0x41, 0x70, 0x10, 0xbd, 0xf8, 0xb5, 0x4c, 0x68, 0x0d, 0x68, + 0x88, 0x68, 0xce, 0x68, 0x0f, 0x69, 0x00, 0x21, 0x00, 0xf8, 0x28, 0x1f, + 0x41, 0x70, 0x20, 0x46, 0x96, 0xed, 0x1e, 0x0a, 0xfc, 0xf7, 0x42, 0xfb, + 0xdb, 0xf7, 0x50, 0xfb, 0xc7, 0xf8, 0xa8, 0x00, 0x21, 0x46, 0x32, 0x68, + 0x28, 0x46, 0xfb, 0xf7, 0x29, 0xff, 0x00, 0x20, 0xf2, 0xbd, 0xf8, 0xb5, + 0x2d, 0xed, 0x02, 0x8b, 0x10, 0x46, 0x0d, 0x68, 0x4e, 0x68, 0xca, 0x68, + 0x09, 0x69, 0x01, 0x24, 0x01, 0x2b, 0x0f, 0xd1, 0xd2, 0xed, 0x20, 0x0a, + 0xd2, 0xed, 0x07, 0x1a, 0x90, 0xed, 0x1b, 0x1a, 0x92, 0xed, 0x1f, 0x0a, + 0x61, 0xee, 0xa0, 0x1a, 0x81, 0xee, 0x81, 0x8a, 0x60, 0x30, 0xf7, 0xee, + 0x00, 0x8a, 0x0b, 0xe0, 0x02, 0xf1, 0x84, 0x03, 0x90, 0xed, 0x03, 0x1a, + 0x93, 0xed, 0x00, 0x0a, 0xd3, 0xed, 0x01, 0x0a, 0x92, 0xed, 0x08, 0x8a, + 0xff, 0xee, 0x00, 0x8a, 0xb4, 0xee, 0x40, 0x1a, 0xf1, 0xee, 0x10, 0xfa, + 0x14, 0xd4, 0xf4, 0xee, 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x10, 0xdb, + 0xcf, 0x68, 0xfb, 0xf7, 0x17, 0xfe, 0x20, 0xee, 0x28, 0x0a, 0xfb, 0xb2, + 0x01, 0x22, 0x31, 0x46, 0x28, 0x46, 0xfc, 0xf7, 0xff, 0xf8, 0xb4, 0xee, + 0x48, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x00, 0xd5, 0x00, 0x24, 0xbd, 0xec, + 0x02, 0x8b, 0x20, 0x46, 0xf2, 0xbd, 0x7c, 0xb5, 0x0e, 0x69, 0x00, 0x93, + 0x15, 0x46, 0x4b, 0x68, 0x0a, 0x68, 0x29, 0x46, 0x00, 0xf0, 0x85, 0xfa, + 0x04, 0x00, 0x04, 0xd1, 0x29, 0x46, 0x06, 0xf1, 0x78, 0x00, 0x00, 0xf0, + 0xe0, 0xfa, 0x20, 0x46, 0x76, 0xbd, 0x2d, 0xe9, 0xf0, 0x47, 0x04, 0x46, + 0x2d, 0xed, 0x02, 0x8b, 0x0d, 0x46, 0x21, 0x78, 0xdf, 0xf8, 0x64, 0xa1, + 0x30, 0x20, 0x41, 0x43, 0x60, 0x18, 0x05, 0xf1, 0x5c, 0x07, 0x06, 0x1d, + 0x78, 0x78, 0x54, 0x49, 0x90, 0x46, 0x99, 0x46, 0x60, 0xb9, 0x08, 0xf1, + 0x14, 0x02, 0x91, 0xec, 0x02, 0x0a, 0x92, 0xec, 0x02, 0x1a, 0xc3, 0xf7, + 0xc0, 0xfe, 0x00, 0xf0, 0x55, 0xf8, 0xc3, 0xf7, 0x96, 0xfe, 0x0b, 0xe0, + 0x08, 0xf1, 0x14, 0x00, 0x91, 0xec, 0x02, 0x0a, 0x90, 0xec, 0x02, 0x1a, + 0xc3, 0xf7, 0xb3, 0xfe, 0x00, 0xf0, 0x48, 0xf8, 0xc3, 0xf7, 0x9c, 0xfe, + 0x08, 0xf1, 0x0c, 0x00, 0x90, 0xec, 0x02, 0x1a, 0xc3, 0xf7, 0xbc, 0xfe, + 0x38, 0x78, 0x30, 0x70, 0xb0, 0xee, 0x40, 0x8a, 0x79, 0x78, 0x71, 0x70, + 0xf0, 0xee, 0x60, 0x8a, 0xb8, 0x78, 0xb0, 0x70, 0xe8, 0x68, 0x70, 0x60, + 0x29, 0x6d, 0xb1, 0x60, 0x28, 0x6b, 0xf0, 0x60, 0x69, 0x6b, 0x31, 0x61, + 0xd8, 0xf8, 0x00, 0x00, 0x70, 0x61, 0x08, 0xf1, 0x1c, 0x00, 0xd8, 0xf8, + 0x04, 0x10, 0xb1, 0x61, 0x90, 0xec, 0x02, 0x0a, 0xc0, 0x46, 0xc0, 0x46, + 0x08, 0xf1, 0x1c, 0x00, 0x86, 0xed, 0x07, 0x0a, 0x90, 0xec, 0x02, 0x0a, + 0xc6, 0xed, 0x08, 0x0a, 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, + 0xc0, 0x46, 0xc0, 0x46, 0x86, 0xed, 0x09, 0x0a, 0xc6, 0xed, 0x0a, 0x8a, + 0xc6, 0xf8, 0x2c, 0x90, 0x20, 0x78, 0x40, 0x1c, 0x00, 0xf0, 0x03, 0x00, + 0x20, 0x70, 0x60, 0x78, 0x04, 0x28, 0x3c, 0xbf, 0x40, 0x1c, 0x60, 0x70, + 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf0, 0x87, 0xb0, 0xee, 0x40, 0x1a, + 0xf0, 0xee, 0x60, 0x1a, 0x9a, 0xec, 0x02, 0x0a, 0x70, 0x47, 0x2d, 0xe9, + 0xf8, 0x4f, 0x81, 0x46, 0x15, 0x46, 0x28, 0x00, 0xd1, 0xf8, 0x0c, 0xa0, + 0xd1, 0xf8, 0x00, 0xb0, 0xd1, 0xf8, 0x04, 0x80, 0x8c, 0x68, 0x0e, 0x69, + 0x18, 0xbf, 0x01, 0x28, 0x11, 0xd1, 0x41, 0x46, 0x58, 0x46, 0xfb, 0xf7, + 0x97, 0xff, 0x00, 0x27, 0x00, 0x23, 0x4f, 0xf4, 0x80, 0x32, 0xf9, 0xb2, + 0x48, 0x46, 0xde, 0xf7, 0xe1, 0xfa, 0x7f, 0x1c, 0xf8, 0xb2, 0x41, 0x28, + 0xf4, 0xd3, 0x28, 0x00, 0x01, 0xd0, 0x02, 0x28, 0x05, 0xd1, 0x41, 0x46, + 0x58, 0x46, 0xfb, 0xf7, 0xef, 0xff, 0x28, 0x00, 0x01, 0xd0, 0x03, 0x2d, + 0x07, 0xd1, 0x00, 0x20, 0x86, 0xf8, 0x72, 0x00, 0x01, 0x21, 0xb1, 0x70, + 0x30, 0x46, 0x00, 0xf0, 0x0f, 0xf8, 0xa0, 0x69, 0x40, 0x1c, 0xa0, 0x61, + 0x40, 0x46, 0x9a, 0xed, 0x1e, 0x0a, 0xbd, 0xe8, 0xf2, 0x4f, 0xfc, 0xf7, + 0x27, 0xba, 0x00, 0x00, 0xe4, 0x8f, 0x00, 0x21, 0xec, 0x8f, 0x00, 0x21, + 0x00, 0x21, 0x00, 0xeb, 0x01, 0x12, 0x20, 0x32, 0x49, 0x1c, 0x93, 0x88, + 0x13, 0x81, 0x04, 0x29, 0xf7, 0xd3, 0x01, 0x21, 0x80, 0xf8, 0x72, 0x10, + 0x41, 0x70, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x43, 0x2d, 0xed, 0x04, 0x8b, + 0x84, 0xb0, 0x0d, 0x46, 0x10, 0x99, 0x80, 0x46, 0x91, 0x46, 0xf0, 0xee, + 0x40, 0x8a, 0x1e, 0x46, 0xd0, 0xf7, 0x90, 0xfa, 0x04, 0x00, 0x3c, 0xd1, + 0x00, 0xee, 0x10, 0x5a, 0x11, 0x9f, 0xb8, 0xee, 0x40, 0x9a, 0x89, 0xee, + 0x28, 0x0a, 0xc2, 0xf7, 0x75, 0xf9, 0x12, 0x98, 0x03, 0x90, 0xbc, 0xee, + 0xc0, 0x0a, 0x02, 0x97, 0x8d, 0xed, 0x01, 0x0a, 0xf6, 0xb2, 0x00, 0x96, + 0x01, 0x23, 0x00, 0x22, 0x01, 0x21, 0x40, 0x46, 0xef, 0xf7, 0xce, 0xf9, + 0x04, 0x00, 0x22, 0xd1, 0x14, 0x9e, 0x13, 0x9d, 0x3a, 0x88, 0x00, 0x21, + 0x40, 0x46, 0xef, 0xf7, 0x08, 0xfa, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, + 0x40, 0x0a, 0x20, 0xee, 0x28, 0x0a, 0xc2, 0xf7, 0x55, 0xf9, 0xbc, 0xee, + 0xc0, 0x0a, 0x08, 0xee, 0x10, 0x9a, 0x85, 0xed, 0x00, 0x0a, 0xb8, 0xee, + 0x40, 0x0a, 0xf8, 0xee, 0x48, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0x80, 0xee, + 0x09, 0x0a, 0xc2, 0xf7, 0x45, 0xf9, 0xbc, 0xee, 0xc0, 0x0a, 0x86, 0xed, + 0x00, 0x0a, 0x04, 0xb0, 0x20, 0x46, 0xbd, 0xec, 0x04, 0x8b, 0xbd, 0xe8, + 0xf2, 0x83, 0x2d, 0xe9, 0xf0, 0x4f, 0x91, 0xb0, 0x0f, 0x46, 0x16, 0x46, + 0x9b, 0x46, 0x04, 0xa9, 0xd1, 0xf7, 0x09, 0xf9, 0x09, 0xaa, 0x03, 0x96, + 0x02, 0x97, 0x00, 0x92, 0xcd, 0xf8, 0x04, 0xb0, 0x0d, 0xab, 0x01, 0x22, + 0x08, 0xa9, 0x07, 0xa8, 0x01, 0xf0, 0x5b, 0xf8, 0x00, 0x24, 0x10, 0xb9, + 0x43, 0xf2, 0x05, 0x24, 0x32, 0xe0, 0x00, 0x22, 0x59, 0x46, 0x09, 0xa8, + 0xe4, 0xf7, 0x8b, 0xf8, 0x21, 0x28, 0x02, 0xd2, 0x1a, 0x99, 0x81, 0x42, + 0x01, 0xd2, 0x43, 0xf2, 0x04, 0x24, 0x1b, 0x99, 0x08, 0x60, 0x1c, 0xbb, + 0xdd, 0xf8, 0x70, 0x80, 0x00, 0x25, 0x0d, 0xf1, 0x24, 0x09, 0x0d, 0xf1, + 0x34, 0x0a, 0x19, 0xe0, 0x59, 0xf8, 0x25, 0x00, 0x02, 0x90, 0x01, 0x97, + 0x00, 0x96, 0x5a, 0xf8, 0x25, 0x30, 0x04, 0x9a, 0x06, 0xa9, 0x05, 0xa8, + 0x01, 0xf0, 0x02, 0xf8, 0x0c, 0x22, 0x6a, 0x43, 0x42, 0x44, 0x5a, 0xf8, + 0x25, 0x30, 0x13, 0x60, 0x01, 0x21, 0x59, 0xf8, 0x25, 0x30, 0x99, 0x40, + 0x49, 0x1e, 0x51, 0x60, 0x90, 0x60, 0x6d, 0x1c, 0x5d, 0x45, 0xe3, 0xd3, + 0x20, 0x46, 0x11, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x2d, 0xe9, 0xf7, 0x4f, + 0x2d, 0xed, 0x02, 0x8b, 0xe8, 0xb0, 0x82, 0x46, 0x7e, 0x9c, 0x98, 0x46, + 0xb0, 0xee, 0x40, 0x8a, 0x00, 0x21, 0xef, 0xf7, 0xd6, 0xf8, 0x00, 0xee, + 0x10, 0x0a, 0xf8, 0xee, 0x40, 0x8a, 0x50, 0x46, 0xf6, 0xf7, 0x08, 0xf8, + 0x8d, 0xf8, 0x00, 0x00, 0x01, 0x20, 0x7f, 0x99, 0x00, 0x25, 0x08, 0x70, + 0x00, 0x26, 0x0c, 0xaf, 0x6b, 0x98, 0x0d, 0xe0, 0x00, 0x2d, 0x04, 0xbf, + 0xa0, 0x5d, 0x00, 0x28, 0x40, 0xf0, 0x8a, 0x80, 0x76, 0x1c, 0x01, 0x2e, + 0x00, 0xf2, 0x89, 0x80, 0x00, 0x2e, 0xf1, 0xd0, 0x6b, 0x98, 0x2c, 0x30, + 0x41, 0x6a, 0x8d, 0xf8, 0x08, 0x10, 0x00, 0x21, 0x0e, 0xe0, 0x0c, 0x22, + 0x4a, 0x43, 0x0d, 0xf1, 0x08, 0x09, 0x83, 0x58, 0x09, 0xeb, 0x81, 0x0c, + 0x02, 0x44, 0xcc, 0xf8, 0x04, 0x30, 0x89, 0x44, 0x13, 0x79, 0x89, 0xf8, + 0x10, 0x30, 0x49, 0x1c, 0x42, 0x6a, 0x91, 0x42, 0xed, 0xd3, 0x81, 0x6a, + 0xbd, 0xf8, 0xd8, 0x01, 0xad, 0xf8, 0x2e, 0x00, 0x07, 0x91, 0xad, 0xf8, + 0x2c, 0x80, 0x9f, 0xed, 0x36, 0x0a, 0x9d, 0xf8, 0xdc, 0x01, 0x8d, 0xf8, + 0x30, 0x00, 0x42, 0x46, 0x78, 0x98, 0x00, 0xeb, 0x86, 0x01, 0x01, 0xee, + 0x10, 0x2a, 0xd1, 0xed, 0x00, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x80, 0xee, + 0x80, 0x0a, 0x20, 0xee, 0x28, 0x0a, 0xb8, 0xee, 0x41, 0x1a, 0x80, 0xee, + 0x01, 0x0a, 0xe0, 0xf7, 0x03, 0xfb, 0x9d, 0xf8, 0xe4, 0x01, 0x8d, 0xf8, + 0x24, 0x00, 0xbc, 0xee, 0xc0, 0x0a, 0x9d, 0xf8, 0xe8, 0x01, 0x8d, 0xed, + 0x08, 0x0a, 0x8d, 0xed, 0x0a, 0x8a, 0x78, 0x70, 0x50, 0x46, 0x9d, 0xf8, + 0xec, 0x11, 0xb9, 0x70, 0x08, 0x21, 0x00, 0xf0, 0xae, 0xf8, 0x7d, 0x98, + 0x60, 0x21, 0x71, 0x43, 0x00, 0xeb, 0x01, 0x0b, 0x5a, 0x46, 0x02, 0xa9, + 0x50, 0x46, 0xf5, 0xf7, 0x57, 0xfe, 0x5f, 0xea, 0x00, 0x09, 0x05, 0xd1, + 0x7c, 0x9a, 0x02, 0xa9, 0x50, 0x46, 0xf5, 0xf7, 0xb9, 0xfe, 0x05, 0x46, + 0x38, 0x79, 0xa0, 0x55, 0x10, 0x21, 0x50, 0x46, 0x00, 0xf0, 0x95, 0xf8, + 0x9d, 0xf8, 0xb0, 0x01, 0x01, 0x28, 0x0b, 0xf1, 0x5c, 0x01, 0x0c, 0xbf, + 0x00, 0x20, 0x01, 0x20, 0x08, 0x70, 0x30, 0x00, 0x18, 0xbf, 0x01, 0x20, + 0x48, 0x70, 0xb9, 0xf1, 0x00, 0x0f, 0x9d, 0xf8, 0x00, 0x00, 0x88, 0x70, + 0x08, 0xd1, 0x01, 0x2d, 0x7f, 0xf4, 0x76, 0xaf, 0x7f, 0x99, 0x00, 0x20, + 0x08, 0x70, 0x43, 0xf2, 0x01, 0x29, 0x02, 0xe0, 0x7f, 0x99, 0x00, 0x20, + 0x08, 0x70, 0x68, 0xb0, 0x48, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, + 0xfe, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x7a, 0x44, 0x2d, 0xe9, 0xf1, 0x4f, + 0xb2, 0xb0, 0x89, 0x46, 0x3d, 0x9f, 0x3c, 0x9e, 0x97, 0xf8, 0x5e, 0x00, + 0x3e, 0x9d, 0x8d, 0xf8, 0x00, 0x00, 0x92, 0x46, 0x98, 0x46, 0xdb, 0xf7, + 0xb7, 0xf8, 0x83, 0x46, 0x9d, 0xf8, 0x00, 0x10, 0x32, 0x98, 0x09, 0xab, + 0x02, 0xaa, 0xde, 0xf7, 0xf8, 0xf8, 0x00, 0x24, 0x01, 0x2d, 0x0a, 0xd1, + 0x01, 0x96, 0x0c, 0xa8, 0x00, 0x90, 0x02, 0xab, 0x3a, 0x46, 0x51, 0x46, + 0x48, 0x46, 0xfc, 0xf7, 0x97, 0xf8, 0x04, 0x46, 0x03, 0xe0, 0x06, 0xf1, + 0x24, 0x00, 0x04, 0x70, 0x44, 0x70, 0x5b, 0x46, 0x32, 0x46, 0x39, 0x46, + 0x40, 0x46, 0x00, 0xf0, 0x86, 0xfb, 0x00, 0x2c, 0x04, 0xbf, 0x3f, 0x98, + 0x01, 0x28, 0x0d, 0xd1, 0x06, 0xf1, 0x28, 0x00, 0x0c, 0xa9, 0x01, 0x90, + 0x00, 0x91, 0x02, 0xab, 0x07, 0xf1, 0x60, 0x02, 0x51, 0x46, 0x48, 0x46, + 0xfc, 0xf7, 0x7a, 0xf8, 0x04, 0x46, 0x04, 0xe0, 0x06, 0xf1, 0x4c, 0x00, + 0x00, 0x21, 0x01, 0x70, 0x41, 0x70, 0x5b, 0x46, 0x06, 0xf1, 0x28, 0x02, + 0x07, 0xf1, 0x60, 0x01, 0x40, 0x46, 0x00, 0xf0, 0x66, 0xfb, 0x20, 0x46, + 0x33, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x70, 0xb5, 0x0e, 0x46, 0x19, 0x46, + 0x8c, 0xb0, 0x05, 0x46, 0x9d, 0xf8, 0x40, 0x30, 0x00, 0x93, 0x10, 0x46, + 0x02, 0xac, 0x01, 0x94, 0x33, 0x46, 0x01, 0x22, 0xfb, 0xf7, 0xb6, 0xfb, + 0x04, 0x00, 0x05, 0xd1, 0x09, 0xab, 0x02, 0xaa, 0x31, 0x46, 0x28, 0x46, + 0xde, 0xf7, 0x3c, 0xf8, 0x20, 0x46, 0x0c, 0xb0, 0x70, 0xbd, 0x38, 0xb5, + 0x0d, 0x46, 0x01, 0x21, 0x01, 0xfa, 0x00, 0xf4, 0x2a, 0x46, 0x21, 0x46, + 0x07, 0x20, 0xf2, 0xf7, 0x1d, 0xff, 0x2a, 0x46, 0x21, 0x46, 0xbd, 0xe8, + 0x38, 0x40, 0x08, 0x20, 0xf2, 0xf7, 0x16, 0xbf, 0x10, 0xb5, 0x0b, 0x46, + 0x02, 0x60, 0x51, 0x09, 0xa2, 0xeb, 0x41, 0x12, 0x20, 0x2a, 0x2f, 0xbf, + 0x4f, 0xf0, 0xff, 0x34, 0x01, 0x24, 0x94, 0x40, 0x64, 0x1e, 0x00, 0x2a, + 0x0c, 0xbf, 0x0a, 0x46, 0x4a, 0x1c, 0x84, 0x60, 0x42, 0x60, 0x03, 0x61, + 0x89, 0x00, 0xbd, 0xe8, 0x10, 0x40, 0x18, 0x46, 0xd4, 0xf7, 0x5c, 0xbe, + 0x10, 0xb5, 0x00, 0x21, 0x04, 0xe0, 0x4f, 0xf0, 0xff, 0x33, 0x42, 0xf8, + 0x21, 0x30, 0x49, 0x1c, 0x43, 0x68, 0x02, 0x69, 0x5c, 0x1e, 0xa1, 0x42, + 0xf5, 0xd3, 0x80, 0x68, 0x02, 0xeb, 0x83, 0x01, 0x41, 0xf8, 0x04, 0x0c, + 0x10, 0xbd, 0x43, 0x68, 0x4a, 0x09, 0x9a, 0x42, 0x00, 0xd3, 0x70, 0x47, + 0x10, 0xb5, 0x00, 0xf0, 0x0f, 0xf8, 0x19, 0x43, 0x09, 0xe0, 0x43, 0x68, + 0x4a, 0x09, 0x9a, 0x42, 0x00, 0xd3, 0x70, 0x47, 0x10, 0xb5, 0x00, 0xf0, + 0x05, 0xf8, 0x23, 0xea, 0x01, 0x01, 0x40, 0xf8, 0x22, 0x10, 0x10, 0xbd, + 0x00, 0x69, 0x01, 0x24, 0x50, 0xf8, 0x22, 0x30, 0xa1, 0xeb, 0x42, 0x11, + 0x04, 0xfa, 0x01, 0xf1, 0x70, 0x47, 0x10, 0xb5, 0x02, 0x46, 0x4b, 0x09, + 0x54, 0x68, 0x00, 0x20, 0xa3, 0x42, 0x07, 0xd2, 0x10, 0x69, 0x50, 0xf8, + 0x23, 0x00, 0xa1, 0xeb, 0x43, 0x11, 0xc8, 0x40, 0x00, 0xf0, 0x01, 0x00, + 0x10, 0xbd, 0xf8, 0xb5, 0x4d, 0x09, 0x14, 0x46, 0x4f, 0xf0, 0xff, 0x33, + 0xa1, 0xeb, 0x45, 0x11, 0x07, 0x69, 0x00, 0x22, 0x03, 0xfa, 0x01, 0xf1, + 0x01, 0xe0, 0x19, 0x46, 0x6d, 0x1c, 0x46, 0x68, 0xb5, 0x42, 0x0b, 0xd2, + 0x57, 0xf8, 0x25, 0x60, 0x31, 0x40, 0xf6, 0xd0, 0x48, 0x42, 0x08, 0x40, + 0xe3, 0xf7, 0x9a, 0xfe, 0x00, 0xeb, 0x45, 0x10, 0x20, 0x60, 0x01, 0x22, + 0x10, 0x46, 0xf2, 0xbd, 0x38, 0xb5, 0x04, 0x46, 0x15, 0x46, 0xff, 0xf7, + 0xdc, 0xff, 0x01, 0x00, 0x05, 0xd1, 0x2a, 0x46, 0x20, 0x46, 0xbd, 0xe8, + 0x38, 0x40, 0x00, 0x21, 0xd3, 0xe7, 0x32, 0xbd, 0xf8, 0xb5, 0xb4, 0xb0, + 0x04, 0x46, 0x0d, 0x46, 0x0a, 0xa8, 0x05, 0xf1, 0x20, 0x06, 0x09, 0x90, + 0x0a, 0x21, 0x00, 0x22, 0x08, 0x91, 0x07, 0x92, 0x00, 0x21, 0x70, 0x79, + 0x06, 0x90, 0x03, 0x22, 0x05, 0x91, 0x04, 0x92, 0x00, 0x23, 0x00, 0x20, + 0x01, 0x21, 0x00, 0x22, 0x03, 0x93, 0x02, 0x90, 0x01, 0x91, 0x00, 0x92, + 0xb7, 0xee, 0x00, 0x1a, 0xd6, 0xed, 0x02, 0x0a, 0x9f, 0xed, 0x70, 0x0a, + 0x00, 0x21, 0x20, 0x46, 0xef, 0xf7, 0x22, 0xf9, 0x12, 0xa8, 0x00, 0x21, + 0x02, 0x90, 0x01, 0x91, 0x00, 0x91, 0xb3, 0x89, 0xb2, 0x7b, 0x20, 0x46, + 0xee, 0xf7, 0xec, 0xff, 0x00, 0x27, 0x18, 0x21, 0x0a, 0xa8, 0x79, 0x43, + 0x01, 0x44, 0x01, 0xf1, 0x40, 0x02, 0x00, 0x21, 0x07, 0x92, 0x01, 0x22, + 0x55, 0xf8, 0x27, 0x00, 0x05, 0x91, 0x04, 0x91, 0x03, 0x91, 0x02, 0x91, + 0x05, 0xeb, 0x87, 0x03, 0x01, 0x21, 0x06, 0x90, 0x01, 0x91, 0x00, 0x92, + 0x12, 0xa9, 0x1b, 0x69, 0x20, 0x46, 0xee, 0xf7, 0xea, 0xff, 0x7f, 0x1c, + 0x04, 0x2f, 0xe2, 0xd3, 0x32, 0xa8, 0x02, 0x90, 0x31, 0x68, 0x01, 0x91, + 0x00, 0x21, 0x32, 0x79, 0x50, 0x1e, 0xc0, 0xb2, 0x00, 0x90, 0x33, 0x69, + 0xf2, 0x7b, 0x20, 0x46, 0xef, 0xf7, 0xb0, 0xf8, 0x0a, 0xa9, 0x20, 0x46, + 0xc0, 0x46, 0xc0, 0x46, 0x00, 0x23, 0x0a, 0xaa, 0x01, 0x21, 0x20, 0x46, + 0xef, 0xf7, 0x99, 0xfd, 0x35, 0xb0, 0xf0, 0xbd, 0x0a, 0x46, 0x01, 0x21, + 0xef, 0xf7, 0xe8, 0xbf, 0x2d, 0xe9, 0xf8, 0x43, 0x0f, 0x46, 0x2d, 0xed, + 0x06, 0x8b, 0x04, 0x46, 0x15, 0x46, 0x01, 0x21, 0xf0, 0xf7, 0x79, 0xf8, + 0x06, 0x46, 0x00, 0x22, 0x31, 0x46, 0x00, 0x20, 0xef, 0xf7, 0x4b, 0xf9, + 0x80, 0x46, 0x00, 0x20, 0x5f, 0xea, 0x08, 0x01, 0x28, 0x74, 0x79, 0xd1, + 0x97, 0xed, 0x0a, 0x0a, 0xef, 0xf7, 0x28, 0xf9, 0x81, 0x46, 0xb0, 0x6b, + 0x48, 0x45, 0xb8, 0xbf, 0x4f, 0xf0, 0x02, 0x08, 0x6e, 0xdb, 0x01, 0x20, + 0x28, 0x74, 0x30, 0x6f, 0xc0, 0xf3, 0x01, 0x41, 0x29, 0x60, 0xc0, 0xf3, + 0x84, 0x40, 0x68, 0x60, 0x00, 0x21, 0x20, 0x46, 0xee, 0xf7, 0x89, 0xfe, + 0x00, 0xee, 0x10, 0x0a, 0xb8, 0x8d, 0x2a, 0x68, 0x00, 0xee, 0x90, 0x0a, + 0x07, 0xf1, 0x10, 0x01, 0xb8, 0xee, 0x40, 0x0a, 0xf8, 0xee, 0x60, 0x0a, + 0x80, 0xee, 0x20, 0x9a, 0x51, 0xf8, 0x22, 0x30, 0x3c, 0x6a, 0x68, 0x68, + 0x96, 0xed, 0x10, 0x0a, 0xd6, 0xed, 0x0f, 0x9a, 0x96, 0xed, 0x0e, 0xaa, + 0x00, 0xfb, 0x04, 0x34, 0xb8, 0xee, 0xc0, 0x0a, 0xc3, 0xf7, 0x22, 0xfb, + 0x26, 0x48, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x90, 0xec, + 0x02, 0x0a, 0xc3, 0xf7, 0xec, 0xfa, 0x00, 0xf0, 0x45, 0xf8, 0xb8, 0xee, + 0xe9, 0x0a, 0xc3, 0xf7, 0x13, 0xfb, 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, + 0x68, 0x1a, 0xc3, 0xf7, 0xba, 0xfa, 0x00, 0xf0, 0x39, 0xf8, 0xb8, 0xee, + 0xca, 0x0a, 0xc3, 0xf7, 0x07, 0xfb, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, + 0x60, 0x1a, 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, 0xc3, 0xf7, + 0xe3, 0xfa, 0x00, 0xf0, 0x29, 0xf8, 0xc1, 0xf7, 0xa1, 0xfd, 0xdf, 0xed, + 0x11, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0x20, 0xee, 0x09, 0x0a, 0xcf, 0xf7, + 0x9d, 0xfc, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x04, 0x19, + 0xac, 0x60, 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, 0xc1, 0xf7, + 0x97, 0xfd, 0x85, 0xed, 0x03, 0x0a, 0x70, 0x6c, 0x48, 0x45, 0xa4, 0xbf, + 0x02, 0x21, 0x29, 0x74, 0xbd, 0xec, 0x06, 0x8b, 0x40, 0x46, 0xbd, 0xe8, + 0xf2, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdb, 0x0f, 0xc9, 0x40, + 0xdc, 0x8f, 0x00, 0x21, 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, 0x60, 0x8a, + 0x70, 0x47, 0x00, 0x00, 0x2d, 0xe9, 0xf4, 0x4f, 0x2d, 0xed, 0x02, 0x8b, + 0x86, 0xb0, 0x80, 0x46, 0xdd, 0xf8, 0x50, 0xa0, 0xdd, 0xf8, 0x54, 0xb0, + 0x00, 0x20, 0x0f, 0x46, 0x1d, 0x46, 0x00, 0x90, 0x4f, 0xf0, 0x0c, 0x09, + 0x12, 0x9b, 0x03, 0xe0, 0x00, 0x28, 0xfb, 0xd0, 0x12, 0x9b, 0x5b, 0x42, + 0x04, 0x97, 0x01, 0x95, 0x03, 0x93, 0x00, 0x25, 0x5c, 0xe0, 0x18, 0xf8, + 0x05, 0x40, 0x98, 0xed, 0x06, 0x0a, 0x08, 0xeb, 0x85, 0x00, 0x61, 0x1e, + 0x90, 0xed, 0x01, 0x8a, 0x88, 0x07, 0x4c, 0xbf, 0x60, 0x42, 0x20, 0x46, + 0x03, 0x99, 0x46, 0x1c, 0xc0, 0xf1, 0x01, 0x00, 0x0a, 0xfb, 0x00, 0x10, + 0x0a, 0xfb, 0x06, 0x16, 0x02, 0x90, 0x60, 0xee, 0x08, 0x8a, 0x59, 0x46, + 0x00, 0xf0, 0xd3, 0xf8, 0x04, 0x99, 0x30, 0x22, 0x6a, 0x43, 0x8f, 0x18, + 0x00, 0x23, 0x38, 0x60, 0x3b, 0x71, 0x01, 0x21, 0x79, 0x71, 0xbc, 0x71, + 0x00, 0xf0, 0xad, 0xf8, 0x28, 0xee, 0x00, 0x0a, 0x87, 0xed, 0x02, 0x0a, + 0x59, 0x46, 0x70, 0x42, 0x00, 0xf0, 0xbf, 0xf8, 0xf8, 0x60, 0x01, 0x21, + 0x39, 0x74, 0x79, 0x74, 0xbc, 0x74, 0x00, 0xf0, 0x9e, 0xf8, 0x28, 0xee, + 0x00, 0x0a, 0x87, 0xed, 0x05, 0x0a, 0x59, 0x46, 0x30, 0x46, 0x00, 0xf0, + 0xb0, 0xf8, 0xb8, 0x61, 0x00, 0x21, 0x39, 0x77, 0x79, 0x77, 0xbc, 0x77, + 0x00, 0xf0, 0x8f, 0xf8, 0x28, 0xee, 0x80, 0x0a, 0x87, 0xed, 0x08, 0x0a, + 0x59, 0x46, 0x02, 0x98, 0x40, 0x42, 0x00, 0xf0, 0xa0, 0xf8, 0x07, 0xf1, + 0x28, 0x06, 0x78, 0x62, 0x01, 0x21, 0x31, 0x70, 0x00, 0x22, 0x72, 0x70, + 0xb4, 0x70, 0x00, 0xf0, 0x7c, 0xf8, 0x28, 0xee, 0x80, 0x0a, 0x86, 0xed, + 0x01, 0x0a, 0x6d, 0x1c, 0xd8, 0xf8, 0x14, 0x00, 0x85, 0x42, 0x9e, 0xd3, + 0x04, 0x9f, 0x01, 0x9d, 0x00, 0x98, 0x10, 0xb9, 0x08, 0x9c, 0x39, 0x46, + 0x04, 0xe0, 0x08, 0x98, 0x00, 0xf1, 0x2c, 0x04, 0x07, 0xf1, 0x24, 0x01, + 0x91, 0xed, 0x02, 0x0a, 0x00, 0x22, 0x11, 0xe0, 0x00, 0x23, 0x30, 0x20, + 0x00, 0xfb, 0x02, 0xfc, 0xbc, 0x44, 0x09, 0xfb, 0x03, 0xf6, 0x66, 0x44, + 0x5b, 0x1c, 0xd6, 0xed, 0x02, 0x0a, 0xc0, 0xee, 0x80, 0x0a, 0x04, 0x2b, + 0xc6, 0xed, 0x02, 0x0a, 0xf0, 0xd3, 0x52, 0x1c, 0xd8, 0xf8, 0x14, 0x00, + 0x82, 0x42, 0xe9, 0xd3, 0x00, 0x22, 0x62, 0x62, 0x00, 0xf0, 0x47, 0xf8, + 0x00, 0x98, 0x00, 0x28, 0x0c, 0xbf, 0x07, 0xf1, 0x24, 0x06, 0x3e, 0x46, + 0x00, 0xf0, 0x3e, 0xf8, 0x9f, 0xed, 0x4f, 0x0a, 0x00, 0x21, 0x15, 0xe0, + 0x00, 0x22, 0x30, 0x20, 0x00, 0xfb, 0x01, 0xf3, 0xfb, 0x18, 0x09, 0xfb, + 0x02, 0xfc, 0x63, 0x44, 0xd3, 0xed, 0x02, 0x0a, 0xb4, 0xee, 0x60, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xbf, 0xb0, 0xee, 0x60, 0x0a, 0x1e, 0x46, + 0x52, 0x1c, 0x04, 0x2a, 0xec, 0xd3, 0x49, 0x1c, 0xd8, 0xf8, 0x14, 0x00, + 0x81, 0x42, 0xe5, 0xd3, 0xd8, 0xed, 0x08, 0x0a, 0xb4, 0xee, 0x60, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x03, 0xdb, 0x00, 0xf0, 0x17, 0xf8, 0x00, 0x28, + 0xd6, 0xd1, 0x00, 0x98, 0x40, 0x1c, 0x01, 0x28, 0x00, 0x90, 0x7f, 0xf6, + 0x35, 0xaf, 0x12, 0x98, 0x08, 0x99, 0x50, 0x44, 0x88, 0x62, 0x08, 0x99, + 0x12, 0x98, 0xaa, 0xeb, 0x00, 0x00, 0x48, 0x65, 0x06, 0xb0, 0x00, 0x20, + 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, 0x31, 0x46, 0x20, 0x46, + 0x05, 0xe0, 0x01, 0x9b, 0x13, 0x99, 0x98, 0xed, 0x07, 0x0a, 0x52, 0x46, + 0x2a, 0xe0, 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x63, 0x6a, 0x03, 0x2b, + 0x0b, 0xd2, 0x0c, 0x22, 0x53, 0x43, 0xe0, 0x18, 0xc2, 0xf7, 0x16, 0xfa, + 0x61, 0x6a, 0x49, 0x1c, 0x61, 0x62, 0x00, 0x20, 0xa8, 0x60, 0x01, 0x20, + 0x32, 0xbd, 0x00, 0x20, 0x32, 0xbd, 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, + 0x00, 0xee, 0x10, 0x4a, 0x00, 0xee, 0x90, 0x5a, 0xb8, 0xee, 0xc0, 0x0a, + 0xf8, 0xee, 0x60, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0xcf, 0xf7, 0x60, 0xfb, + 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x05, 0xfb, 0x10, 0x44, + 0x20, 0x46, 0x32, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, 0x2d, 0xed, 0x02, 0x8b, + 0x1f, 0x46, 0x82, 0xb0, 0x3c, 0x68, 0x01, 0x94, 0x07, 0xf1, 0x08, 0x03, + 0x00, 0x93, 0x05, 0x46, 0x0e, 0x46, 0x90, 0x46, 0xb0, 0xee, 0x40, 0x8a, + 0x3b, 0x1d, 0x00, 0xf0, 0x1d, 0xf8, 0x04, 0x46, 0x01, 0x20, 0x01, 0x90, + 0x07, 0xf1, 0x0c, 0x03, 0x07, 0xf1, 0x10, 0x00, 0x00, 0x90, 0x42, 0x46, + 0x31, 0x46, 0x28, 0x46, 0x00, 0xf0, 0x10, 0xf8, 0x14, 0xb1, 0xb7, 0xee, + 0x00, 0x8a, 0x02, 0xe0, 0x08, 0xb9, 0x9f, 0xed, 0x04, 0x8a, 0x02, 0xb0, + 0xb0, 0xee, 0x48, 0x0a, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf0, 0x81, + 0x00, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x43, 0x01, 0xeb, 0xd1, 0x77, + 0xa0, 0xeb, 0x67, 0x09, 0x07, 0x9c, 0x08, 0x9d, 0x00, 0xeb, 0x67, 0x00, + 0x00, 0x21, 0x00, 0x27, 0x17, 0xe0, 0x54, 0xf8, 0x27, 0x60, 0x06, 0xeb, + 0xd6, 0x78, 0x53, 0xf8, 0x27, 0x60, 0xb6, 0x1a, 0xa6, 0xeb, 0x68, 0x0c, + 0xcc, 0x45, 0x06, 0xeb, 0x68, 0x06, 0xb8, 0xbf, 0xcc, 0x46, 0x86, 0x46, + 0xb0, 0x42, 0xc8, 0xbf, 0xb6, 0x46, 0xf4, 0x45, 0xbc, 0xbf, 0xae, 0xeb, + 0x0c, 0x06, 0x71, 0x18, 0x7f, 0x1c, 0xaf, 0x42, 0xe5, 0xd3, 0x08, 0x46, + 0xbd, 0xe8, 0xf0, 0x83, 0x38, 0xb5, 0x0d, 0x46, 0x04, 0x46, 0x29, 0x1d, + 0xcf, 0xf7, 0xac, 0xfd, 0x2c, 0x60, 0x20, 0x46, 0xd0, 0xf7, 0x35, 0xfd, + 0xa8, 0x60, 0x20, 0x46, 0xd0, 0xf7, 0x20, 0xfc, 0xe8, 0x60, 0x20, 0x46, + 0xd0, 0xf7, 0x15, 0xfc, 0x28, 0x61, 0x20, 0x46, 0xd0, 0xf7, 0x5d, 0xfc, + 0x68, 0x61, 0x00, 0x21, 0x20, 0x46, 0xee, 0xf7, 0x80, 0xfc, 0xa8, 0x61, + 0x01, 0x21, 0x20, 0x46, 0xee, 0xf7, 0x7b, 0xfc, 0xe8, 0x61, 0x00, 0x20, + 0x28, 0x62, 0x68, 0x62, 0xa8, 0x62, 0xe8, 0x62, 0x31, 0xbd, 0xf8, 0xb5, + 0x05, 0x46, 0x1e, 0x46, 0xaf, 0x6a, 0x8c, 0x23, 0x5f, 0x43, 0xeb, 0x19, + 0x14, 0x46, 0x03, 0xf1, 0x30, 0x07, 0x60, 0x22, 0x38, 0x46, 0xc2, 0xf7, + 0x77, 0xf9, 0x2c, 0xb1, 0x28, 0x22, 0x21, 0x46, 0x07, 0xf1, 0x60, 0x00, + 0xc2, 0xf7, 0x70, 0xf9, 0xc7, 0xf8, 0x88, 0x60, 0xa8, 0x6a, 0x40, 0x1c, + 0x00, 0xf0, 0x0f, 0x00, 0xa8, 0x62, 0x28, 0x6a, 0x0f, 0x28, 0x9c, 0xbf, + 0x40, 0x1c, 0x28, 0x62, 0xf1, 0xbd, 0x30, 0xb5, 0xc5, 0x6a, 0x0c, 0x24, + 0x65, 0x43, 0x44, 0x19, 0x04, 0xf5, 0x0f, 0x64, 0x21, 0x60, 0x63, 0x60, + 0x11, 0x78, 0x52, 0x78, 0x41, 0xea, 0x02, 0x41, 0xa1, 0x60, 0xc1, 0x6a, + 0x49, 0x1c, 0x01, 0xf0, 0x0f, 0x01, 0xc1, 0x62, 0x41, 0x6a, 0x0f, 0x29, + 0x9c, 0xbf, 0x49, 0x1c, 0x41, 0x62, 0x30, 0xbd, 0x2d, 0xe9, 0xf3, 0x4f, + 0x87, 0xb0, 0x00, 0x24, 0xdf, 0xf8, 0x3c, 0x86, 0xdf, 0xf8, 0x3c, 0xb6, + 0x20, 0x46, 0xd0, 0xf7, 0x99, 0xfd, 0x07, 0x46, 0x24, 0x21, 0xdf, 0xf8, + 0x34, 0x06, 0x61, 0x43, 0x45, 0x18, 0xff, 0x22, 0x2a, 0x60, 0xc5, 0xf8, + 0x04, 0xb0, 0x40, 0xf2, 0xcc, 0x71, 0x08, 0x98, 0xb0, 0x22, 0x61, 0x43, + 0x62, 0x43, 0x08, 0x44, 0x5a, 0x44, 0x43, 0xf2, 0x38, 0x23, 0xa8, 0x60, + 0x13, 0x44, 0xec, 0x22, 0xdf, 0xf8, 0x0c, 0x16, 0xeb, 0x60, 0x62, 0x43, + 0x4f, 0xf4, 0x09, 0x73, 0x63, 0x43, 0x0a, 0x44, 0x4f, 0xf4, 0x1b, 0x61, + 0x61, 0x43, 0x5b, 0x44, 0x59, 0x44, 0x6a, 0x61, 0x03, 0xf5, 0x39, 0x79, + 0x01, 0xf6, 0x74, 0x3a, 0xc5, 0xf8, 0x10, 0x90, 0xc5, 0xf8, 0x18, 0xa0, + 0x00, 0xf5, 0x62, 0x70, 0xff, 0x2f, 0xe8, 0x61, 0x13, 0xd1, 0xd0, 0xf7, + 0x15, 0xfd, 0x82, 0x46, 0x00, 0x26, 0x2a, 0xfa, 0x06, 0xf0, 0xc0, 0x07, + 0x07, 0xd4, 0xf0, 0xb2, 0xd9, 0xf7, 0xa8, 0xfd, 0x28, 0x62, 0xd8, 0xf8, + 0x00, 0x00, 0x40, 0xf8, 0x26, 0x50, 0x76, 0x1c, 0x08, 0x2e, 0xf0, 0xd3, + 0x0b, 0xe0, 0xf8, 0xb2, 0xd9, 0xf7, 0x9c, 0xfd, 0x28, 0x62, 0x51, 0x46, + 0xd8, 0xf8, 0x00, 0x00, 0x40, 0xf8, 0x27, 0x50, 0x38, 0x46, 0xff, 0xf7, + 0x41, 0xff, 0x07, 0x98, 0xf8, 0x40, 0xc1, 0x07, 0x1e, 0xd5, 0xdf, 0xf8, + 0x94, 0x25, 0x00, 0x20, 0x10, 0x55, 0x38, 0x46, 0xdd, 0xf7, 0x96, 0xfb, + 0x38, 0x46, 0xdd, 0xf7, 0xf7, 0xfb, 0x08, 0x99, 0x6a, 0x46, 0x20, 0x46, + 0x00, 0xf0, 0xda, 0xf9, 0x69, 0x46, 0x38, 0x46, 0xc0, 0x46, 0xc0, 0x46, + 0x48, 0x46, 0xea, 0xf7, 0xf9, 0xfe, 0x08, 0x99, 0x6a, 0x46, 0x20, 0x46, + 0x00, 0xf0, 0xeb, 0xf9, 0x69, 0x46, 0x38, 0x46, 0xff, 0xf7, 0xe6, 0xf8, + 0x64, 0x1c, 0x04, 0x2c, 0x84, 0xd3, 0x09, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x80, 0xb5, 0x00, 0xf0, 0x09, 0xf8, 0xda, 0xf7, 0xb8, 0xfc, 0x02, 0xbd, + 0x80, 0xb5, 0x00, 0xf0, 0x03, 0xf8, 0xda, 0xf7, 0x9d, 0xfc, 0x02, 0xbd, + 0x00, 0x92, 0x0b, 0x46, 0x02, 0x46, 0x4f, 0xf4, 0x39, 0x71, 0xdf, 0xf8, + 0x1c, 0x05, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, 0x86, 0xb0, 0x80, 0x46, + 0x89, 0x46, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0xdf, 0xf8, 0x04, 0xa5, + 0xdf, 0xf8, 0x0c, 0xb5, 0x28, 0xfa, 0x06, 0xf0, 0xc0, 0x07, 0x2b, 0xd5, + 0x30, 0x46, 0xd0, 0xf7, 0xd9, 0xfc, 0x07, 0x46, 0x30, 0x46, 0x00, 0xf0, + 0xd5, 0xf9, 0x04, 0x00, 0x09, 0xd1, 0x6a, 0x46, 0x49, 0x46, 0x38, 0x46, + 0x00, 0xf0, 0x92, 0xf9, 0x69, 0x46, 0x30, 0x46, 0x00, 0xf0, 0x09, 0xfb, + 0x04, 0x46, 0x6c, 0xb9, 0x6a, 0x46, 0x49, 0x46, 0x38, 0x46, 0x00, 0xf0, + 0xa4, 0xf9, 0x69, 0x46, 0x30, 0x46, 0xff, 0xf7, 0xae, 0xf8, 0x04, 0x00, + 0x04, 0xbf, 0x01, 0x20, 0x0b, 0xf8, 0x07, 0x00, 0x4f, 0xf4, 0x09, 0x72, + 0x57, 0x43, 0x0a, 0xeb, 0x07, 0x02, 0x21, 0x46, 0x02, 0xf5, 0x39, 0x70, + 0xea, 0xf7, 0xa5, 0xfe, 0x05, 0xb9, 0x25, 0x46, 0x76, 0x1c, 0x08, 0x2e, + 0xca, 0xd3, 0x28, 0x46, 0x07, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x70, 0xb5, + 0x86, 0xb0, 0x0c, 0x46, 0xea, 0xf7, 0xaa, 0xfe, 0x05, 0x46, 0xd0, 0xf7, + 0x9f, 0xfc, 0x06, 0x46, 0xff, 0x2e, 0x19, 0xd0, 0x28, 0x46, 0x00, 0xf0, + 0x99, 0xf9, 0x78, 0xb9, 0xdf, 0xf8, 0x78, 0x14, 0x88, 0x5d, 0x10, 0xb9, + 0x43, 0xf2, 0x02, 0x20, 0x08, 0xe0, 0x6a, 0x46, 0x21, 0x46, 0x30, 0x46, + 0x00, 0xf0, 0x6d, 0xf9, 0x69, 0x46, 0x28, 0x46, 0xfe, 0xf7, 0x8e, 0xfc, + 0xec, 0x21, 0xdf, 0xf8, 0x54, 0x24, 0x4e, 0x43, 0x90, 0x51, 0x01, 0xe0, + 0x4f, 0xf6, 0x52, 0x70, 0x06, 0xb0, 0x70, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, + 0x88, 0x46, 0x15, 0x46, 0x1f, 0x46, 0xea, 0xf7, 0x7f, 0xfe, 0xd0, 0xf7, + 0x75, 0xfc, 0x00, 0x26, 0xff, 0x28, 0x1c, 0xd0, 0x4f, 0xf4, 0x09, 0x74, + 0xdf, 0xf8, 0x1c, 0x14, 0x60, 0x43, 0x08, 0x44, 0x00, 0xf5, 0x39, 0x71, + 0x1f, 0xb1, 0x02, 0x2f, 0x02, 0xd0, 0x01, 0xd3, 0x09, 0xe0, 0x14, 0x24, + 0x28, 0x68, 0xa0, 0x42, 0x08, 0xd3, 0x22, 0x46, 0x40, 0x46, 0xc2, 0xf7, + 0x11, 0xf8, 0x2c, 0x60, 0x07, 0xe0, 0x4f, 0xf6, 0x2a, 0x76, 0x04, 0xe0, + 0x4f, 0xf6, 0x26, 0x76, 0x01, 0xe0, 0x4f, 0xf6, 0x52, 0x76, 0x30, 0x46, + 0xbd, 0xe8, 0xf0, 0x81, 0xf8, 0xb5, 0x0c, 0x46, 0x15, 0x46, 0x1f, 0x46, + 0xea, 0xf7, 0x52, 0xfe, 0xd0, 0xf7, 0x48, 0xfc, 0x00, 0x26, 0xff, 0x28, + 0x1b, 0xd0, 0xec, 0x21, 0xdf, 0xf8, 0xcc, 0x23, 0x48, 0x43, 0x11, 0x18, + 0x1f, 0xb1, 0x02, 0x2f, 0x0b, 0xd0, 0x0a, 0xd3, 0x0b, 0xe0, 0x14, 0x27, + 0x28, 0x68, 0xb8, 0x42, 0x0a, 0xd3, 0x3a, 0x46, 0x20, 0x46, 0xc1, 0xf7, + 0xe7, 0xff, 0x2f, 0x60, 0x09, 0xe0, 0xec, 0x27, 0xf4, 0xe7, 0x4f, 0xf6, + 0x2a, 0x76, 0x04, 0xe0, 0x4f, 0xf6, 0x26, 0x76, 0x01, 0xe0, 0x4f, 0xf6, + 0x52, 0x76, 0x30, 0x46, 0xf2, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, + 0x2d, 0xed, 0x02, 0x8b, 0x86, 0xb0, 0x12, 0x9f, 0xdd, 0xf8, 0x50, 0xb0, + 0x0d, 0x46, 0x16, 0x46, 0x1c, 0x46, 0xea, 0xf7, 0x1f, 0xfe, 0x80, 0x46, + 0xd0, 0xf7, 0x14, 0xfc, 0x03, 0x46, 0x40, 0xf2, 0xcc, 0x71, 0x59, 0x43, + 0x4f, 0xf0, 0x00, 0x0a, 0x0b, 0xeb, 0x01, 0x09, 0x07, 0x2d, 0xc7, 0xf8, + 0x00, 0xa0, 0x4f, 0xf6, 0x61, 0x71, 0xdf, 0xf8, 0x4c, 0x03, 0x00, 0xf2, + 0xbf, 0x80, 0xdf, 0xe8, 0x05, 0xf0, 0x04, 0x0f, 0x1f, 0x2b, 0x37, 0x4c, + 0xb8, 0x59, 0x04, 0x2c, 0x04, 0xd3, 0x32, 0x68, 0x49, 0x46, 0xfa, 0xf7, + 0x27, 0xff, 0xb3, 0xe0, 0x49, 0x46, 0xfb, 0xf7, 0x2d, 0xf9, 0xaf, 0xe0, + 0x08, 0x2c, 0x4a, 0xd3, 0x37, 0x68, 0x74, 0x68, 0x8e, 0xbf, 0x30, 0x7a, + 0x40, 0x46, 0xf5, 0xf7, 0xd5, 0xf9, 0x01, 0x46, 0x23, 0x46, 0x3a, 0x46, + 0x40, 0x46, 0xdd, 0xf7, 0xbb, 0xfb, 0x9f, 0xe0, 0x00, 0x2c, 0x3a, 0xd0, + 0x30, 0x78, 0x00, 0x28, 0x40, 0x46, 0x02, 0xd1, 0xdd, 0xf7, 0xda, 0xfa, + 0x96, 0xe0, 0xdd, 0xf7, 0xdf, 0xfa, 0x93, 0xe0, 0x00, 0x2c, 0x2e, 0xd0, + 0x31, 0x78, 0x02, 0x29, 0x03, 0xda, 0x40, 0x46, 0x00, 0xf0, 0x9f, 0xfe, + 0x8a, 0xe0, 0x4f, 0xf6, 0x0e, 0x7a, 0x87, 0xe0, 0x02, 0x2c, 0x22, 0xd3, + 0x71, 0x78, 0x8d, 0xf8, 0x00, 0x10, 0x6b, 0x46, 0x30, 0x78, 0x00, 0x28, + 0x05, 0xd0, 0x06, 0x22, 0x01, 0x21, 0x40, 0x46, 0xee, 0xf7, 0x61, 0xf8, + 0x74, 0xe0, 0x06, 0x22, 0x01, 0x21, 0x40, 0x46, 0xee, 0xf7, 0x85, 0xf8, + 0x6e, 0xe0, 0x74, 0xb1, 0x34, 0x78, 0x6a, 0x46, 0x59, 0x46, 0x18, 0x46, + 0x00, 0xf0, 0x8f, 0xf8, 0x22, 0x46, 0x69, 0x46, 0x40, 0x46, 0xff, 0xf7, + 0x84, 0xf8, 0x65, 0xe0, 0x00, 0x25, 0x04, 0x2c, 0x01, 0xd2, 0x8a, 0x46, + 0x60, 0xe0, 0x96, 0xed, 0x00, 0x8a, 0x00, 0xf5, 0xd2, 0x71, 0xb0, 0xee, + 0x48, 0x0a, 0x09, 0xf5, 0x62, 0x72, 0x40, 0x46, 0x00, 0xf0, 0xc2, 0xfc, + 0x5f, 0xea, 0x00, 0x0a, 0x37, 0xd1, 0x69, 0x46, 0x40, 0x46, 0x00, 0xf0, + 0x8a, 0xff, 0x01, 0x25, 0x88, 0xbb, 0x01, 0xa9, 0x40, 0x46, 0x00, 0xf0, + 0x95, 0xff, 0x60, 0xbb, 0x9d, 0xed, 0x01, 0x0a, 0x30, 0xee, 0x08, 0x8a, + 0xf7, 0xee, 0x00, 0x0a, 0xb4, 0xee, 0x60, 0x8a, 0xf1, 0xee, 0x10, 0xfa, + 0x09, 0xdb, 0x9d, 0xf8, 0x00, 0x10, 0x49, 0x1c, 0xc9, 0xb2, 0x40, 0x46, + 0x01, 0xf0, 0x54, 0xf8, 0xbf, 0xee, 0x00, 0x0a, 0x0f, 0xe0, 0xdf, 0xed, + 0x88, 0x0a, 0xb4, 0xee, 0x60, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x0b, 0xd5, + 0x9d, 0xf8, 0x00, 0x00, 0x41, 0x1e, 0xc9, 0xb2, 0x40, 0x46, 0x01, 0xf0, + 0x43, 0xf8, 0xb7, 0xee, 0x00, 0x0a, 0x38, 0xee, 0x00, 0x0a, 0x01, 0xe0, + 0xb0, 0xee, 0x48, 0x0a, 0x48, 0x46, 0xfa, 0xf7, 0xe0, 0xff, 0x06, 0x20, + 0x38, 0x60, 0x31, 0x68, 0x00, 0x91, 0x86, 0xf8, 0x00, 0x80, 0x75, 0x70, + 0x9d, 0xf8, 0x00, 0x00, 0xb0, 0x70, 0x9d, 0xf8, 0x01, 0x00, 0xf0, 0x70, + 0x9d, 0xf8, 0x02, 0x00, 0x30, 0x71, 0x9d, 0xf8, 0x03, 0x00, 0x70, 0x71, + 0x06, 0xe0, 0x40, 0x46, 0x00, 0xf0, 0x46, 0xf8, 0x82, 0x46, 0x01, 0xe0, + 0x4f, 0xf6, 0x27, 0x7a, 0x06, 0xb0, 0x50, 0x46, 0xbd, 0xec, 0x02, 0x8b, + 0xbd, 0xe8, 0xf2, 0x8f, 0x70, 0xb5, 0x40, 0xf2, 0xcc, 0x74, 0x6c, 0x4b, + 0x13, 0x60, 0x44, 0x43, 0x0c, 0x44, 0x03, 0xf5, 0xd0, 0x71, 0x91, 0x60, + 0x4f, 0xf4, 0x09, 0x75, 0x54, 0x60, 0x45, 0x43, 0x4f, 0xf4, 0x1b, 0x61, + 0x1d, 0x44, 0x48, 0x43, 0x05, 0xf5, 0x39, 0x76, 0x18, 0x44, 0x04, 0xf5, + 0x62, 0x74, 0xd6, 0x60, 0x00, 0xf6, 0x74, 0x33, 0x54, 0x61, 0x13, 0x61, + 0x70, 0xbd, 0x70, 0xb5, 0x5e, 0x4b, 0x13, 0x60, 0x03, 0xf5, 0x09, 0x74, + 0xd4, 0x60, 0xec, 0x26, 0x40, 0xf2, 0xcc, 0x74, 0x44, 0x43, 0x5c, 0x4d, + 0x46, 0x43, 0x21, 0x44, 0x2e, 0x44, 0x51, 0x60, 0x96, 0x60, 0xb0, 0x25, + 0x45, 0x43, 0x4f, 0xf4, 0x1b, 0x61, 0x1d, 0x44, 0x43, 0xf2, 0x38, 0x26, + 0x48, 0x43, 0x2e, 0x44, 0x18, 0x44, 0x16, 0x61, 0x00, 0xf6, 0x74, 0x33, + 0x53, 0x61, 0x70, 0xbd, 0x2d, 0xe9, 0xfc, 0x47, 0x05, 0x46, 0x69, 0x46, + 0xcf, 0xf7, 0xc4, 0xfa, 0x80, 0x46, 0x28, 0x46, 0xd0, 0xf7, 0x4d, 0xfa, + 0x82, 0x46, 0x00, 0x24, 0x00, 0x20, 0x49, 0x4d, 0x00, 0xe0, 0x40, 0x1c, + 0x95, 0xf8, 0xe2, 0x12, 0x88, 0x42, 0x07, 0xd2, 0x05, 0xeb, 0x80, 0x01, + 0x00, 0x9a, 0xd1, 0xf8, 0xc4, 0x32, 0x9a, 0x42, 0xf3, 0xd2, 0x04, 0x46, + 0x00, 0x26, 0x43, 0xf2, 0x0a, 0x29, 0x00, 0xe0, 0x76, 0x1c, 0x28, 0x19, + 0x90, 0xf8, 0xdc, 0x02, 0x86, 0x42, 0x1b, 0xd2, 0xb8, 0xf1, 0x00, 0x0f, + 0x18, 0xd1, 0xa8, 0x19, 0x90, 0xf8, 0xbc, 0x72, 0x01, 0x2f, 0x09, 0xd9, + 0x00, 0x98, 0x7a, 0x1e, 0x51, 0x46, 0x00, 0xf0, 0x12, 0xf8, 0xd5, 0xf8, + 0xb8, 0x12, 0x88, 0x42, 0x38, 0xbf, 0xc8, 0x46, 0x00, 0x98, 0x7a, 0x1c, + 0x51, 0x46, 0x00, 0xf0, 0x08, 0xf8, 0xd5, 0xf8, 0xb8, 0x12, 0x88, 0x42, + 0xde, 0xd2, 0xc8, 0x46, 0x40, 0x46, 0xbd, 0xe8, 0xf6, 0x87, 0x80, 0xb5, + 0x00, 0xee, 0x10, 0x0a, 0x01, 0xee, 0x10, 0x2a, 0x2d, 0xed, 0x04, 0x8b, + 0x00, 0xee, 0x90, 0x1a, 0xf8, 0xee, 0x41, 0x8a, 0xb8, 0xee, 0x40, 0x9a, + 0xb8, 0xee, 0x60, 0x8a, 0x29, 0xee, 0x28, 0x0a, 0x80, 0xee, 0x08, 0x0a, + 0xce, 0xf7, 0xbc, 0xff, 0x28, 0xee, 0x00, 0x0a, 0x80, 0xee, 0x28, 0x0a, + 0x39, 0xee, 0x40, 0x0a, 0xb0, 0xee, 0xc0, 0x0a, 0xdf, 0xf7, 0xd4, 0xfb, + 0xbc, 0xee, 0xc0, 0x0a, 0xbd, 0xec, 0x04, 0x8b, 0x10, 0xee, 0x10, 0x0a, + 0x02, 0xbd, 0x38, 0xb5, 0x18, 0x49, 0x09, 0x68, 0x51, 0xf8, 0x20, 0x50, + 0x28, 0x68, 0x08, 0x28, 0x26, 0xd2, 0x51, 0xf8, 0x20, 0x40, 0x0c, 0xb3, + 0xa9, 0x68, 0xa0, 0x68, 0x4f, 0xf4, 0x62, 0x72, 0xc1, 0xf7, 0x48, 0xfe, + 0xe9, 0x68, 0xe0, 0x68, 0xb0, 0x22, 0xc1, 0xf7, 0x43, 0xfe, 0x29, 0x69, + 0x20, 0x69, 0x4f, 0xf4, 0x09, 0x72, 0xc1, 0xf7, 0x3d, 0xfe, 0x69, 0x69, + 0x60, 0x69, 0xec, 0x22, 0xc1, 0xf7, 0x38, 0xfe, 0xa9, 0x69, 0xa0, 0x69, + 0x4f, 0xf4, 0x1b, 0x62, 0xc1, 0xf7, 0x32, 0xfe, 0xe9, 0x69, 0xe0, 0x69, + 0x40, 0xf2, 0x44, 0x42, 0xc1, 0xf7, 0x2c, 0xfe, 0xff, 0x20, 0x28, 0x60, + 0x31, 0xbd, 0x00, 0x00, 0xff, 0xff, 0x7f, 0xbf, 0x78, 0x04, 0x00, 0x01, + 0x20, 0x04, 0x00, 0x21, 0xa8, 0x67, 0x02, 0x21, 0x10, 0x37, 0x02, 0x21, + 0x30, 0x76, 0x02, 0x21, 0x10, 0xb5, 0x02, 0x68, 0x43, 0x68, 0x9a, 0x42, + 0x39, 0xbf, 0x00, 0x22, 0x04, 0x23, 0x04, 0x22, 0x00, 0x23, 0x84, 0x58, + 0x8a, 0x58, 0xc0, 0x58, 0xc9, 0x58, 0x04, 0xeb, 0x52, 0x04, 0xa0, 0xeb, + 0x51, 0x00, 0x84, 0x42, 0x80, 0x41, 0xc0, 0x43, 0xc0, 0x0f, 0x10, 0xbd, + 0x2d, 0xe9, 0xf8, 0x4f, 0x84, 0xb0, 0x81, 0x46, 0x0f, 0x98, 0x00, 0x90, + 0x8b, 0x46, 0x90, 0x46, 0x00, 0x24, 0x00, 0x25, 0x9a, 0x46, 0x00, 0x26, + 0x17, 0xe0, 0x7f, 0x1c, 0x47, 0x45, 0x11, 0xd2, 0x59, 0xf8, 0x27, 0x00, + 0x03, 0x90, 0x69, 0x46, 0x5b, 0xf8, 0x27, 0x00, 0x01, 0x90, 0x02, 0xa8, + 0xff, 0xf7, 0xd0, 0xff, 0x01, 0x28, 0xf0, 0xd1, 0x00, 0x21, 0x32, 0x46, + 0xf1, 0xf7, 0x28, 0xfc, 0x04, 0x43, 0x0d, 0x43, 0x0e, 0x9a, 0x92, 0x44, + 0x76, 0x1c, 0x10, 0x98, 0x86, 0x42, 0x03, 0xd2, 0xcd, 0xf8, 0x08, 0xa0, + 0x00, 0x27, 0xe1, 0xe7, 0x20, 0x46, 0x29, 0x46, 0x05, 0xb0, 0xbd, 0xe8, + 0xf0, 0x8f, 0x2d, 0xe9, 0xf1, 0x4f, 0x82, 0xb0, 0x90, 0x46, 0x0d, 0x98, + 0x01, 0x25, 0x40, 0x45, 0x9a, 0x46, 0x03, 0xd2, 0x00, 0x25, 0x28, 0x46, + 0xbd, 0xe8, 0xfe, 0x8f, 0x0e, 0x9c, 0xdd, 0xf8, 0x30, 0x90, 0x0f, 0x9f, + 0x00, 0x91, 0xc3, 0x46, 0x00, 0x26, 0x0e, 0xe0, 0x39, 0x46, 0x00, 0x1b, + 0xe3, 0xf7, 0x33, 0xf8, 0x40, 0x1c, 0x05, 0xe0, 0x00, 0x98, 0x50, 0xf8, + 0x26, 0x00, 0x84, 0x42, 0xf4, 0xd3, 0x01, 0x20, 0x49, 0xf8, 0x26, 0x00, + 0x76, 0x1c, 0x46, 0x45, 0xf4, 0xd3, 0x02, 0x98, 0x00, 0x21, 0x0a, 0xe0, + 0x59, 0xf8, 0x21, 0x30, 0x50, 0xf8, 0x21, 0x20, 0x5b, 0x1e, 0x7b, 0x43, + 0xa2, 0xeb, 0x53, 0x02, 0x4a, 0xf8, 0x21, 0x20, 0x49, 0x1c, 0x41, 0x45, + 0xf2, 0xd3, 0x0d, 0x98, 0x83, 0x45, 0xd0, 0xd2, 0x6a, 0x46, 0x59, 0x46, + 0x48, 0x46, 0xe2, 0xf7, 0xfc, 0xff, 0x00, 0x98, 0x09, 0xeb, 0x80, 0x01, + 0x0a, 0x68, 0x53, 0x08, 0xd2, 0x1a, 0x0a, 0x60, 0x49, 0xf8, 0x2b, 0x30, + 0x5a, 0xf8, 0x20, 0x00, 0x02, 0xfb, 0x07, 0x02, 0x4a, 0xf8, 0x2b, 0x20, + 0x0b, 0xf1, 0x01, 0x0b, 0xe5, 0xe7, 0x2d, 0xe9, 0xf8, 0x41, 0xad, 0xf5, + 0x30, 0x6d, 0x0e, 0x46, 0x91, 0xb0, 0xb7, 0x68, 0xf5, 0x68, 0x80, 0x46, + 0x00, 0x23, 0x06, 0x22, 0x01, 0x21, 0xdc, 0xf7, 0xe3, 0xfd, 0x04, 0x00, + 0x3f, 0xd1, 0x01, 0x20, 0x8d, 0xf8, 0x00, 0x00, 0x6b, 0x46, 0x06, 0x22, + 0x01, 0x21, 0x40, 0x46, 0xed, 0xf7, 0x4d, 0xfe, 0x04, 0x00, 0x34, 0xd1, + 0x38, 0x78, 0x01, 0x28, 0x07, 0xd1, 0x72, 0x69, 0x05, 0xf1, 0x14, 0x03, + 0x39, 0x1d, 0x40, 0x46, 0x00, 0xf0, 0x40, 0xf8, 0x04, 0x46, 0x78, 0x78, + 0x01, 0x28, 0x08, 0xbf, 0x00, 0x2c, 0x14, 0xd1, 0x30, 0x68, 0x01, 0x90, + 0x71, 0x68, 0x02, 0x91, 0xb0, 0x68, 0x00, 0xf1, 0x2c, 0x01, 0x03, 0x91, + 0xf1, 0x68, 0x01, 0xf1, 0x20, 0x02, 0x07, 0xa9, 0x04, 0x92, 0x05, 0x91, + 0x01, 0xa9, 0x30, 0x69, 0x06, 0x90, 0x40, 0x46, 0x01, 0xf0, 0xb2, 0xf8, + 0x04, 0x46, 0x6b, 0x46, 0x06, 0x22, 0x01, 0x21, 0x40, 0x46, 0xed, 0xf7, + 0x4a, 0xfe, 0x04, 0xb9, 0x04, 0x46, 0x00, 0x23, 0x06, 0x22, 0x01, 0x21, + 0x40, 0x46, 0xdc, 0xf7, 0xbd, 0xfd, 0x04, 0xb9, 0x04, 0x46, 0xb8, 0x78, + 0x01, 0x28, 0x08, 0xbf, 0x00, 0x2c, 0x08, 0xd1, 0x33, 0x69, 0x05, 0xf1, + 0x3c, 0x02, 0x07, 0xf1, 0x54, 0x01, 0x40, 0x46, 0x01, 0xf0, 0x94, 0xfa, + 0x04, 0x46, 0x0d, 0xf5, 0x30, 0x6d, 0x20, 0x46, 0x12, 0xb0, 0xbd, 0xe8, + 0xf0, 0x81, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0x0e, 0x46, 0x17, 0x46, + 0x98, 0x46, 0x05, 0x46, 0x00, 0x23, 0x4f, 0xf4, 0x80, 0x32, 0x00, 0x21, + 0xdd, 0xf7, 0x28, 0xf9, 0x39, 0x46, 0x28, 0x46, 0x00, 0xf0, 0x41, 0xf8, + 0x04, 0x00, 0x04, 0xd1, 0x39, 0x46, 0x28, 0x46, 0x00, 0xf0, 0xab, 0xf8, + 0x04, 0x46, 0xcc, 0xb9, 0x32, 0x46, 0x39, 0x46, 0x28, 0x46, 0x00, 0xf0, + 0xcc, 0xf8, 0x04, 0x46, 0x54, 0xbb, 0x32, 0x46, 0x39, 0x46, 0x28, 0x46, + 0x00, 0xf0, 0x1a, 0xfa, 0x04, 0x46, 0x1c, 0xbb, 0x39, 0x46, 0x28, 0x46, + 0x00, 0xf0, 0x5d, 0xf8, 0x04, 0x46, 0xec, 0xb9, 0x32, 0x46, 0x39, 0x46, + 0x28, 0x46, 0x00, 0xf0, 0xb8, 0xfb, 0x04, 0x46, 0xb4, 0xb9, 0x07, 0xf1, + 0xc8, 0x00, 0xdf, 0xed, 0xa4, 0x0a, 0x90, 0xed, 0x01, 0x0a, 0x90, 0xed, + 0x00, 0x1a, 0x60, 0xee, 0x20, 0x0a, 0x20, 0xee, 0x81, 0x1a, 0xb0, 0xee, + 0xc1, 0x0a, 0xd6, 0xed, 0x09, 0x0a, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x48, 0xbf, 0x43, 0xf2, 0x07, 0x24, 0x41, 0x46, 0x38, 0x46, + 0x00, 0xf0, 0xd7, 0xfb, 0x20, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x38, 0xb5, + 0x05, 0x46, 0x0c, 0x46, 0x98, 0xb0, 0x00, 0x21, 0xc0, 0xb2, 0xd9, 0xf7, + 0x36, 0xf9, 0x00, 0x23, 0x6a, 0x46, 0x0c, 0xa9, 0xe8, 0xb2, 0xd9, 0xf7, + 0x14, 0xf9, 0x00, 0xf0, 0x20, 0xf8, 0xf7, 0xee, 0x00, 0x0a, 0x80, 0xee, + 0x80, 0x0a, 0x00, 0x20, 0x0c, 0xa9, 0x04, 0xeb, 0x80, 0x03, 0x31, 0xf9, + 0x10, 0x20, 0x00, 0xee, 0x90, 0x2a, 0xf8, 0xee, 0xe0, 0x0a, 0x60, 0xee, + 0x80, 0x0a, 0xc3, 0xed, 0x00, 0x0a, 0x3d, 0xf9, 0x10, 0x20, 0x00, 0xee, + 0x90, 0x2a, 0xf8, 0xee, 0xe0, 0x0a, 0x40, 0x1c, 0x60, 0xee, 0x80, 0x0a, + 0x18, 0x28, 0xc3, 0xed, 0x18, 0x0a, 0xe5, 0xd3, 0x00, 0xe2, 0xf2, 0xee, + 0x0e, 0x0a, 0xb0, 0xee, 0x00, 0x0a, 0xd9, 0xf7, 0x63, 0xb9, 0x70, 0xb5, + 0x2d, 0xed, 0x02, 0x8b, 0x98, 0xb0, 0x04, 0x46, 0x0d, 0x46, 0xff, 0xf7, + 0xf2, 0xff, 0xb0, 0xee, 0x40, 0x8a, 0x00, 0x26, 0x05, 0xeb, 0x86, 0x00, + 0x90, 0xed, 0x00, 0x0a, 0x28, 0xee, 0x00, 0x0a, 0xce, 0xf7, 0xd8, 0xfd, + 0xbd, 0xee, 0xc0, 0x0a, 0x0c, 0xa9, 0x10, 0xee, 0x10, 0x0a, 0x21, 0xf8, + 0x16, 0x00, 0x05, 0xeb, 0x86, 0x00, 0x90, 0xed, 0xf9, 0x0a, 0x28, 0xee, + 0x00, 0x0a, 0xce, 0xf7, 0xc9, 0xfd, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, + 0x10, 0x0a, 0x2d, 0xf8, 0x16, 0x00, 0x76, 0x1c, 0x18, 0x2e, 0xdf, 0xd3, + 0x01, 0x23, 0x6a, 0x46, 0x0c, 0xa9, 0xe0, 0xb2, 0xd9, 0xf7, 0x97, 0xf8, + 0x01, 0x21, 0xe0, 0xb2, 0xd9, 0xf7, 0xd3, 0xf8, 0x18, 0xb0, 0x00, 0x20, + 0xbd, 0xec, 0x02, 0x8b, 0x70, 0xbd, 0xf8, 0xb5, 0x04, 0x46, 0x0d, 0x46, + 0xcf, 0xf7, 0x3e, 0xff, 0x06, 0x46, 0x20, 0x46, 0xcf, 0xf7, 0xef, 0xff, + 0x07, 0x46, 0x20, 0x46, 0xcf, 0xf7, 0xd4, 0xfe, 0x00, 0xee, 0x10, 0x0a, + 0x05, 0xf1, 0xc0, 0x00, 0x7f, 0x08, 0x07, 0x60, 0x76, 0x08, 0xd0, 0xed, + 0x00, 0x0a, 0x01, 0xee, 0x10, 0x6a, 0xb8, 0xee, 0x40, 0x0a, 0xf8, 0xee, + 0xe0, 0x0a, 0xb8, 0xee, 0x41, 0x1a, 0xc0, 0xee, 0x80, 0x0a, 0x81, 0xee, + 0x00, 0x0a, 0xc0, 0xed, 0x03, 0x0a, 0x80, 0xed, 0x04, 0x0a, 0x00, 0x20, + 0xf2, 0xbd, 0x2d, 0xe9, 0xfc, 0x47, 0x00, 0xf0, 0x2d, 0xfb, 0x05, 0xf1, + 0xe4, 0x08, 0x3a, 0x68, 0x43, 0x46, 0x49, 0x46, 0x20, 0x46, 0x00, 0xf0, + 0x16, 0xf8, 0x00, 0xf0, 0x1c, 0xfb, 0x79, 0x61, 0x05, 0xf5, 0xd2, 0x7a, + 0x68, 0xb9, 0x00, 0xf0, 0x0e, 0xfb, 0x00, 0xf0, 0x0c, 0xf8, 0x00, 0xf0, + 0x13, 0xfb, 0xb9, 0x61, 0x28, 0xb9, 0x05, 0xf1, 0xc4, 0x02, 0x51, 0x46, + 0x40, 0x46, 0x00, 0xf0, 0x77, 0xf8, 0xbd, 0xe8, 0xf6, 0x87, 0x2d, 0xe9, + 0xf8, 0x43, 0x0e, 0x46, 0xdc, 0xb0, 0x80, 0x46, 0x30, 0x69, 0x0e, 0x90, + 0x17, 0x46, 0x71, 0x69, 0x0f, 0x91, 0x1d, 0x46, 0x40, 0x46, 0xcf, 0xf7, + 0x9a, 0xff, 0x81, 0x46, 0x11, 0xa9, 0x40, 0x46, 0xcf, 0xf7, 0xcf, 0xfe, + 0x10, 0xa8, 0x04, 0x90, 0x0b, 0xab, 0x0c, 0xa9, 0x0d, 0xf1, 0x2a, 0x02, + 0x01, 0x93, 0x0d, 0xa8, 0x03, 0x91, 0x02, 0x92, 0x00, 0x90, 0x73, 0x78, + 0xb1, 0x68, 0x96, 0xed, 0x03, 0x0a, 0x00, 0x22, 0x40, 0x46, 0xfe, 0xf7, + 0x57, 0xfd, 0x04, 0x00, 0x0e, 0xd1, 0x0d, 0x98, 0x0c, 0x99, 0x02, 0x90, + 0x01, 0x91, 0xcd, 0xf8, 0x0c, 0x90, 0x00, 0x97, 0x11, 0xab, 0x16, 0xaa, + 0x2c, 0xa9, 0xdf, 0xf8, 0xa0, 0x04, 0xff, 0xf7, 0xb9, 0xf8, 0x04, 0x46, + 0xac, 0xbb, 0x00, 0x20, 0x00, 0x90, 0x00, 0x23, 0x31, 0x78, 0x3a, 0x46, + 0x40, 0x46, 0xda, 0xf7, 0x94, 0xfe, 0x04, 0x46, 0x5c, 0xbb, 0x64, 0x99, + 0x08, 0x91, 0x0a, 0xa8, 0x09, 0x90, 0x07, 0x95, 0x4f, 0xf4, 0x7a, 0x72, + 0x06, 0x92, 0x0a, 0x20, 0x05, 0x90, 0x00, 0x23, 0x03, 0x21, 0x0e, 0xaa, + 0x04, 0x93, 0x03, 0x91, 0x02, 0x92, 0x70, 0x78, 0xbd, 0xf8, 0x2a, 0x10, + 0xbd, 0xf8, 0x2c, 0x30, 0x01, 0x90, 0x00, 0x91, 0x01, 0x22, 0x96, 0xed, + 0x01, 0x0a, 0x16, 0xa9, 0x40, 0x46, 0xfe, 0xf7, 0xc1, 0xfd, 0x04, 0x46, + 0x9d, 0xf8, 0x28, 0x00, 0x00, 0x28, 0x04, 0xbf, 0x00, 0x2c, 0x43, 0xf2, + 0x08, 0x24, 0x00, 0x21, 0x40, 0x46, 0xda, 0xf7, 0x0a, 0xff, 0x04, 0xb9, + 0x04, 0x46, 0x20, 0x46, 0x5d, 0xb0, 0xbd, 0xe8, 0xf0, 0x83, 0x00, 0x00, + 0xdb, 0x0f, 0xc9, 0x40, 0x70, 0xb5, 0x04, 0x46, 0x8e, 0xb0, 0x94, 0xed, + 0x0c, 0x0a, 0xd4, 0xed, 0x03, 0x0a, 0xc0, 0xee, 0x20, 0x0a, 0xcd, 0xed, + 0x0d, 0x0a, 0x94, 0xed, 0x0d, 0x0a, 0xd4, 0xed, 0x03, 0x0a, 0xc0, 0xee, + 0x20, 0x0a, 0x04, 0xf1, 0x90, 0x00, 0xcd, 0xed, 0x0c, 0x0a, 0x90, 0xed, + 0x00, 0x0a, 0xd4, 0xed, 0x1b, 0x0a, 0xc0, 0xee, 0x20, 0x0a, 0xcd, 0xed, + 0x03, 0x0a, 0x90, 0xed, 0x01, 0x0a, 0xd4, 0xed, 0x1b, 0x0a, 0xc0, 0xee, + 0x20, 0x0a, 0xcd, 0xed, 0x02, 0x0a, 0x91, 0xed, 0x0c, 0x0a, 0xd1, 0xed, + 0x03, 0x0a, 0xc0, 0xee, 0x20, 0x0a, 0xcd, 0xed, 0x0b, 0x0a, 0x91, 0xed, + 0x0d, 0x0a, 0xd1, 0xed, 0x03, 0x0a, 0xc0, 0xee, 0x20, 0x0a, 0x01, 0xf1, + 0x90, 0x00, 0xcd, 0xed, 0x0a, 0x0a, 0x90, 0xed, 0x00, 0x0a, 0xd1, 0xed, + 0x1b, 0x0a, 0xc0, 0xee, 0x20, 0x0a, 0xcd, 0xed, 0x09, 0x0a, 0x90, 0xed, + 0x01, 0x0a, 0xd1, 0xed, 0x1b, 0x0a, 0x06, 0xa8, 0x01, 0x90, 0x15, 0x46, + 0xc0, 0xee, 0x20, 0x0a, 0x07, 0xae, 0xcd, 0xed, 0x08, 0x0a, 0x00, 0x96, + 0x08, 0xab, 0x09, 0xaa, 0x0c, 0xa9, 0x0d, 0xa8, 0x00, 0xf0, 0x43, 0xf8, + 0x04, 0xa8, 0x05, 0xa9, 0xbf, 0xee, 0x00, 0x0a, 0xdd, 0xed, 0x03, 0x0a, + 0x9d, 0xed, 0x02, 0x1a, 0x01, 0x90, 0x00, 0x91, 0x60, 0xee, 0x80, 0x0a, + 0x21, 0xee, 0x00, 0x0a, 0xcd, 0xed, 0x03, 0x0a, 0x8d, 0xed, 0x02, 0x0a, + 0x02, 0xab, 0x03, 0xaa, 0x0a, 0xa9, 0x0b, 0xa8, 0x00, 0xf0, 0x2b, 0xf8, + 0x9d, 0xed, 0x06, 0x0a, 0xdd, 0xed, 0x05, 0x0a, 0x9d, 0xed, 0x04, 0x1a, + 0xdd, 0xed, 0x04, 0x1a, 0x60, 0xee, 0x20, 0x0a, 0x9d, 0xed, 0x07, 0x0a, + 0x40, 0xee, 0x01, 0x0a, 0x9d, 0xed, 0x05, 0x1a, 0x20, 0xee, 0x01, 0x1a, + 0x9d, 0xed, 0x06, 0x0a, 0x00, 0xee, 0x61, 0x1a, 0x80, 0xee, 0x81, 0x0a, + 0x01, 0xf0, 0x7e, 0xfc, 0xf6, 0xee, 0x00, 0x0a, 0x60, 0xee, 0x20, 0x0a, + 0x94, 0xed, 0x00, 0x0a, 0x9f, 0xed, 0xbb, 0x1a, 0x20, 0xee, 0x01, 0x1a, + 0x80, 0xee, 0x81, 0x1a, 0x85, 0xed, 0x00, 0x1a, 0x00, 0x20, 0x0e, 0xb0, + 0x70, 0xbd, 0x30, 0xb5, 0x92, 0xed, 0x00, 0x0a, 0xd0, 0xed, 0x00, 0x0a, + 0xd3, 0xed, 0x00, 0x1a, 0x91, 0xed, 0x00, 0x2a, 0x03, 0x9c, 0x04, 0x9d, + 0x30, 0xee, 0x80, 0x1a, 0x30, 0xee, 0xc0, 0x0a, 0x72, 0xee, 0x21, 0x2a, + 0x72, 0xee, 0x61, 0x0a, 0x60, 0xee, 0x00, 0x1a, 0x21, 0xee, 0x00, 0x2a, + 0x40, 0xee, 0xa0, 0x1a, 0x02, 0xee, 0xa0, 0x2a, 0x22, 0xee, 0x80, 0x0a, + 0x82, 0xee, 0x21, 0x2a, 0x01, 0xee, 0x60, 0x0a, 0x84, 0xed, 0x00, 0x2a, + 0x80, 0xee, 0x21, 0x0a, 0x85, 0xed, 0x00, 0x0a, 0x00, 0x20, 0x30, 0xbd, + 0x38, 0xb5, 0xad, 0xf5, 0x16, 0x6d, 0x15, 0x46, 0x0c, 0x46, 0x18, 0xaa, + 0x28, 0x46, 0x00, 0xf0, 0xc1, 0xf8, 0x6a, 0x46, 0x21, 0x46, 0x28, 0x46, + 0x00, 0xf0, 0x44, 0xf9, 0x04, 0xf5, 0x79, 0x74, 0x23, 0x46, 0x18, 0x22, + 0x69, 0x46, 0x18, 0xa8, 0xfb, 0xf7, 0xde, 0xfd, 0x9f, 0xed, 0x97, 0x0a, + 0x00, 0x20, 0x54, 0xf8, 0x20, 0x10, 0x21, 0xf0, 0x00, 0x41, 0x00, 0xee, + 0x90, 0x1a, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x58, 0xbf, + 0xb0, 0xee, 0x60, 0x0a, 0x40, 0x1c, 0x18, 0x28, 0xef, 0xd3, 0xdf, 0xed, + 0x8f, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x11, 0xdb, + 0x9f, 0xed, 0x8c, 0x1a, 0x81, 0xee, 0x00, 0x0a, 0x00, 0x20, 0x04, 0xeb, + 0x80, 0x01, 0x04, 0xeb, 0x80, 0x02, 0xd1, 0xed, 0x00, 0x0a, 0x40, 0x1c, + 0x60, 0xee, 0x80, 0x0a, 0x18, 0x28, 0xc2, 0xed, 0x00, 0x0a, 0xf2, 0xd3, + 0x0d, 0xf5, 0x10, 0x6d, 0x00, 0x20, 0x19, 0xb0, 0x30, 0xbd, 0x00, 0x00, + 0xf8, 0xb5, 0x2d, 0xed, 0x06, 0x8b, 0xb0, 0xee, 0x40, 0xaa, 0xf2, 0xee, + 0x0e, 0x9a, 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0xf0, 0xee, 0x69, 0x0a, + 0xff, 0xf7, 0xef, 0xfd, 0xb0, 0xee, 0x40, 0x9a, 0xf0, 0xee, 0x69, 0x0a, + 0xff, 0xf7, 0xe9, 0xfd, 0xf7, 0xee, 0x00, 0x0a, 0xc0, 0xee, 0x80, 0xaa, + 0xd6, 0xed, 0x31, 0x9a, 0x31, 0x46, 0x20, 0x46, 0xff, 0xf7, 0xad, 0xfd, + 0x9f, 0xed, 0x6f, 0x8a, 0xdf, 0xed, 0x6e, 0x8a, 0x00, 0x20, 0x06, 0xf1, + 0x60, 0x02, 0x06, 0xeb, 0x80, 0x01, 0x02, 0xeb, 0x80, 0x03, 0x40, 0x1c, + 0x91, 0xed, 0x00, 0x0a, 0xd3, 0xed, 0x00, 0x0a, 0x18, 0x28, 0x38, 0xee, + 0x00, 0x8a, 0x78, 0xee, 0xa0, 0x8a, 0xf0, 0xd3, 0xb1, 0xee, 0x4a, 0x0a, + 0x86, 0xed, 0x31, 0x0a, 0x00, 0xf0, 0x44, 0xf8, 0x00, 0x28, 0x3e, 0xd1, + 0x00, 0x27, 0x06, 0xeb, 0x87, 0x00, 0x90, 0xed, 0xf9, 0x0a, 0x29, 0xee, + 0x00, 0x0a, 0xce, 0xf7, 0xa7, 0xfb, 0x06, 0xf1, 0x60, 0x00, 0x00, 0xeb, + 0x87, 0x01, 0x7f, 0x1c, 0x2a, 0xee, 0x80, 0x0a, 0x18, 0x2f, 0x81, 0xed, + 0x00, 0x0a, 0xec, 0xd3, 0x60, 0x22, 0x06, 0xf1, 0x60, 0x01, 0x30, 0x46, + 0xc1, 0xf7, 0x44, 0xfa, 0x88, 0xee, 0x28, 0x0a, 0xce, 0xf7, 0x92, 0xfb, + 0xb5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x0f, 0xd5, 0x00, 0x20, + 0x06, 0xeb, 0x80, 0x01, 0xff, 0xee, 0x00, 0x0a, 0x91, 0xed, 0x00, 0x0a, + 0x06, 0xeb, 0x80, 0x02, 0x40, 0x1c, 0x60, 0xee, 0x20, 0x0a, 0x18, 0x28, + 0xc2, 0xed, 0x00, 0x0a, 0xf0, 0xd3, 0xc6, 0xed, 0x31, 0x9a, 0x00, 0xf0, + 0x0b, 0xf8, 0x30, 0xb9, 0xbd, 0xec, 0x06, 0x8b, 0x31, 0x46, 0x20, 0x46, + 0xbd, 0xe8, 0xf4, 0x40, 0x85, 0xe5, 0xbd, 0xec, 0x06, 0x8b, 0xf2, 0xbd, + 0x2a, 0x46, 0x31, 0x46, 0x20, 0x46, 0x35, 0xe7, 0x2d, 0xe9, 0xf8, 0x43, + 0x80, 0x46, 0x2d, 0xed, 0x02, 0x8b, 0x89, 0x46, 0x14, 0x46, 0x98, 0xed, + 0x08, 0x8a, 0x00, 0x27, 0x60, 0x23, 0x7b, 0x43, 0x00, 0x25, 0xe6, 0x18, + 0x78, 0x1b, 0x00, 0xee, 0x10, 0x0a, 0x06, 0xeb, 0x85, 0x02, 0xb8, 0xee, + 0xc0, 0x0a, 0x49, 0x46, 0x40, 0x46, 0x00, 0xf0, 0x19, 0xf8, 0xaf, 0x42, + 0x0b, 0xd1, 0x06, 0xeb, 0x85, 0x00, 0xf0, 0xee, 0x00, 0x0a, 0x90, 0xed, + 0x00, 0x0a, 0x06, 0xeb, 0x85, 0x01, 0x08, 0xee, 0x20, 0x0a, 0x81, 0xed, + 0x00, 0x0a, 0x6d, 0x1c, 0x18, 0x2d, 0xe3, 0xd3, 0x7f, 0x1c, 0x18, 0x2f, + 0xdc, 0xd3, 0xbd, 0xec, 0x02, 0x8b, 0x00, 0x20, 0xbd, 0xe8, 0xf2, 0x83, + 0x10, 0xb5, 0x2d, 0xed, 0x06, 0x8b, 0xb0, 0xee, 0x40, 0x9a, 0x90, 0xed, + 0x06, 0x0a, 0xd0, 0xed, 0x07, 0x8a, 0x70, 0xee, 0x68, 0x9a, 0xb0, 0xee, + 0xc9, 0x0a, 0x9f, 0xed, 0x21, 0x1a, 0x01, 0xf1, 0xcc, 0x00, 0xb4, 0xee, + 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x14, 0x46, 0xd0, 0xed, 0x00, 0x0a, + 0x90, 0xed, 0x01, 0x8a, 0x0c, 0xd5, 0x9f, 0xed, 0x1b, 0x0a, 0x69, 0xee, + 0x80, 0x1a, 0x61, 0xee, 0xa0, 0x0a, 0x68, 0xee, 0x80, 0x1a, 0x41, 0xee, + 0x88, 0x0a, 0xc4, 0xed, 0x00, 0x0a, 0x1b, 0xe0, 0x9f, 0xed, 0x0f, 0xaa, + 0x20, 0xee, 0x8a, 0x0a, 0x20, 0xee, 0x09, 0x0a, 0xc1, 0xf7, 0xe8, 0xfa, + 0xf0, 0xee, 0x00, 0x0a, 0x29, 0xee, 0xa0, 0x1a, 0x68, 0xee, 0xa0, 0x8a, + 0x61, 0xee, 0x00, 0x9a, 0x68, 0xee, 0x0a, 0x0a, 0x20, 0xee, 0x89, 0x0a, + 0xc1, 0xf7, 0xda, 0xfa, 0x48, 0xee, 0x80, 0x9a, 0x89, 0xee, 0x89, 0x0a, + 0x84, 0xed, 0x00, 0x0a, 0x00, 0x20, 0xbd, 0xec, 0x06, 0x8b, 0x10, 0xbd, + 0xdb, 0x0f, 0xc9, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x7f, 0x3f, + 0x00, 0xfe, 0x7f, 0x3f, 0x17, 0xb7, 0xd1, 0x38, 0xdb, 0x0f, 0x49, 0x41, + 0x64, 0x94, 0x04, 0x02, 0xf8, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x04, 0x46, + 0x82, 0xb0, 0x0d, 0x46, 0x16, 0x46, 0x94, 0xed, 0x08, 0x8a, 0x00, 0x27, + 0x6b, 0x46, 0x3a, 0x46, 0x29, 0x46, 0x20, 0x46, 0x00, 0xf0, 0x14, 0xf8, + 0x05, 0xeb, 0x87, 0x00, 0xb0, 0xee, 0x00, 0x0a, 0x28, 0xee, 0x00, 0x0a, + 0xd0, 0xed, 0x18, 0x0a, 0x9d, 0xed, 0x00, 0x1a, 0x06, 0xeb, 0x87, 0x00, + 0x7f, 0x1c, 0x00, 0xee, 0x20, 0x1a, 0x18, 0x2f, 0x80, 0xed, 0x00, 0x1a, + 0xe6, 0xd3, 0x2f, 0xe0, 0xf8, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x0d, 0x46, + 0x82, 0xb0, 0x1e, 0x46, 0x95, 0xed, 0x31, 0x0a, 0xff, 0xee, 0x00, 0x0a, + 0x00, 0x23, 0x04, 0x46, 0x60, 0xee, 0x20, 0x8a, 0x33, 0x60, 0x00, 0x27, + 0x08, 0xee, 0x10, 0x2a, 0x00, 0xee, 0x10, 0x7a, 0xb8, 0xee, 0xc0, 0x0a, + 0x30, 0xee, 0x28, 0x0a, 0xf8, 0xee, 0xc8, 0x0a, 0x6a, 0x46, 0x30, 0xee, + 0x60, 0x0a, 0x29, 0x46, 0x20, 0x46, 0xff, 0xf7, 0x65, 0xff, 0x05, 0xeb, + 0x87, 0x03, 0xdd, 0xed, 0x00, 0x0a, 0x93, 0xed, 0x18, 0x0a, 0x96, 0xed, + 0x00, 0x1a, 0x7f, 0x1c, 0x00, 0xee, 0x20, 0x1a, 0x18, 0x2f, 0x86, 0xed, + 0x00, 0x1a, 0xe1, 0xd3, 0x02, 0xb0, 0x00, 0x20, 0xbd, 0xec, 0x02, 0x8b, + 0xf2, 0xbd, 0x2d, 0xe9, 0xfc, 0x47, 0x00, 0xf0, 0x2d, 0xf8, 0x05, 0xf5, + 0x19, 0x78, 0x3a, 0x68, 0x43, 0x46, 0x49, 0x46, 0x20, 0x46, 0xff, 0xf7, + 0x16, 0xfd, 0x00, 0xf0, 0x1c, 0xf8, 0xf9, 0x61, 0x05, 0xf5, 0x49, 0x7a, + 0x68, 0xb9, 0x00, 0xf0, 0x0e, 0xf8, 0xff, 0xf7, 0x0c, 0xfd, 0x00, 0xf0, + 0x13, 0xf8, 0x39, 0x62, 0x28, 0xb9, 0x05, 0xf1, 0xc8, 0x02, 0x51, 0x46, + 0x40, 0x46, 0xff, 0xf7, 0x77, 0xfd, 0xbd, 0xe8, 0xf6, 0x87, 0x01, 0xa8, + 0x00, 0x90, 0x53, 0x46, 0x3a, 0x68, 0x52, 0x42, 0x49, 0x46, 0x20, 0x46, + 0x70, 0x47, 0x01, 0xae, 0x9d, 0xf8, 0x04, 0x10, 0x72, 0x78, 0x41, 0xea, + 0x02, 0x41, 0x70, 0x47, 0x04, 0x46, 0x0d, 0x46, 0x01, 0xa8, 0x00, 0x21, + 0x05, 0xf1, 0xc0, 0x07, 0x01, 0xab, 0x91, 0x46, 0x01, 0x80, 0x00, 0x93, + 0x70, 0x47, 0x50, 0xf8, 0xc0, 0x2f, 0x0a, 0x60, 0x43, 0x68, 0x4b, 0x60, + 0x80, 0x68, 0x88, 0x60, 0x70, 0x47, 0xc0, 0xb2, 0xd8, 0xf7, 0x5f, 0xbd, + 0x2d, 0xe9, 0xf8, 0x4f, 0x00, 0x24, 0xdf, 0xf8, 0xa0, 0x82, 0xa8, 0x4e, + 0x4f, 0xf4, 0xe0, 0x79, 0x82, 0x46, 0x2a, 0xfa, 0x04, 0xf0, 0xc0, 0x07, + 0x2e, 0xd5, 0x20, 0x46, 0xcf, 0xf7, 0x1c, 0xfd, 0x05, 0x46, 0x09, 0xfb, + 0x05, 0xf0, 0x37, 0x18, 0x49, 0x46, 0x38, 0x46, 0xd3, 0xf7, 0xd4, 0xff, + 0x9f, 0x48, 0x00, 0xeb, 0x45, 0x1b, 0x20, 0x21, 0x58, 0x46, 0xd3, 0xf7, + 0xcd, 0xff, 0x18, 0x21, 0x9c, 0x48, 0x69, 0x43, 0x08, 0x44, 0xcc, 0x23, + 0x06, 0xf5, 0xe3, 0x62, 0x6b, 0x43, 0x02, 0x60, 0x33, 0x44, 0x47, 0x60, + 0x03, 0xf6, 0x34, 0x01, 0x81, 0x60, 0x06, 0xf5, 0xe0, 0x62, 0x3c, 0x21, + 0x4d, 0x43, 0x71, 0x19, 0x01, 0xf2, 0x44, 0x73, 0xc2, 0x60, 0x03, 0x61, + 0xc0, 0xf8, 0x14, 0xb0, 0xd8, 0xf8, 0x00, 0x10, 0x41, 0xf8, 0x24, 0x00, + 0x64, 0x1c, 0x08, 0x2c, 0xc9, 0xd3, 0xbd, 0xe8, 0xf1, 0x8f, 0x00, 0x00, + 0x2d, 0xe9, 0xfe, 0x4f, 0xdf, 0xf8, 0x20, 0x92, 0x00, 0x24, 0x09, 0xf5, + 0xe3, 0x62, 0xa2, 0x46, 0x01, 0x92, 0x09, 0xf5, 0xe8, 0x67, 0x0f, 0xf2, + 0x20, 0x28, 0x02, 0x90, 0x02, 0x98, 0x20, 0xfa, 0x0a, 0xf0, 0xc1, 0x07, + 0x74, 0xd5, 0x50, 0x46, 0xcf, 0xf7, 0xd4, 0xfc, 0x05, 0x46, 0x7f, 0x48, + 0x00, 0xeb, 0x45, 0x16, 0x30, 0x46, 0xe9, 0xf7, 0xbe, 0xfe, 0x00, 0xf0, + 0x7b, 0xf8, 0xdc, 0xf7, 0xf9, 0xf8, 0x04, 0x00, 0x06, 0xd1, 0x6b, 0x46, + 0x05, 0x22, 0x01, 0x21, 0x50, 0x46, 0xed, 0xf7, 0x66, 0xf9, 0x04, 0x46, + 0x00, 0x2c, 0x48, 0xd1, 0x38, 0x78, 0xb0, 0xb1, 0x3c, 0x21, 0x69, 0x43, + 0x09, 0xeb, 0x01, 0x0b, 0x0b, 0xf2, 0x44, 0x72, 0x09, 0xf5, 0xe0, 0x61, + 0x50, 0x46, 0x01, 0xf0, 0xfb, 0xf9, 0x04, 0x00, 0x9b, 0xf8, 0x7c, 0x07, + 0xf0, 0x61, 0x06, 0xd0, 0x23, 0x46, 0x42, 0x46, 0x07, 0x21, 0x03, 0x20, + 0xcf, 0xf7, 0x9f, 0xfd, 0x2f, 0xe0, 0x4f, 0xf4, 0xe0, 0x71, 0x69, 0x43, + 0x78, 0x78, 0x09, 0xeb, 0x01, 0x0b, 0x30, 0xb1, 0x01, 0x99, 0x5a, 0x46, + 0x50, 0x46, 0x00, 0xf0, 0xeb, 0xf8, 0x04, 0x00, 0x0c, 0xd1, 0xb8, 0x78, + 0x58, 0xb1, 0xcc, 0x21, 0x4d, 0x43, 0x09, 0xeb, 0x05, 0x01, 0x01, 0xf6, + 0x34, 0x02, 0x01, 0x99, 0x50, 0x46, 0x00, 0xf0, 0xfd, 0xf8, 0x04, 0x46, + 0x9c, 0xb9, 0x78, 0x78, 0x88, 0xb1, 0x0b, 0xf5, 0xdc, 0x70, 0x53, 0x46, + 0x90, 0xf8, 0x00, 0x10, 0x5e, 0xa2, 0x71, 0x61, 0x41, 0x68, 0xb1, 0x61, + 0x00, 0x78, 0xb0, 0x60, 0x03, 0x20, 0x99, 0xf8, 0xb8, 0x11, 0x00, 0x91, + 0x07, 0x21, 0xcf, 0xf7, 0x6e, 0xfd, 0x00, 0xf0, 0x23, 0xf8, 0xdc, 0xf7, + 0xbb, 0xf8, 0x05, 0x46, 0x6b, 0x46, 0x05, 0x22, 0x01, 0x21, 0x50, 0x46, + 0xed, 0xf7, 0x39, 0xf9, 0x05, 0xb9, 0x05, 0x46, 0x04, 0xb9, 0x2c, 0x46, + 0x21, 0x46, 0x30, 0x46, 0xe9, 0xf7, 0x57, 0xfe, 0x0a, 0xf1, 0x01, 0x0a, + 0xba, 0xf1, 0x08, 0x0f, 0x02, 0xd2, 0x00, 0x2c, 0x3f, 0xf4, 0x7e, 0xaf, + 0x4f, 0xea, 0x04, 0x03, 0x4f, 0xa2, 0x07, 0x21, 0x03, 0x20, 0xcf, 0xf7, + 0x4c, 0xfd, 0x20, 0x46, 0xbd, 0xe8, 0xfe, 0x8f, 0x01, 0x20, 0x8d, 0xf8, + 0x00, 0x00, 0x00, 0x23, 0x05, 0x22, 0x01, 0x21, 0x50, 0x46, 0x70, 0x47, + 0xf8, 0xb5, 0x0c, 0x46, 0x15, 0x46, 0x1f, 0x46, 0xe9, 0xf7, 0x4a, 0xfe, + 0xcf, 0xf7, 0x40, 0xfc, 0x00, 0x26, 0xff, 0x28, 0x1f, 0xd0, 0x34, 0x49, + 0x01, 0xeb, 0x40, 0x11, 0x1f, 0xb1, 0x02, 0x2f, 0x0b, 0xd0, 0x0c, 0xd3, + 0x11, 0xe0, 0x14, 0x27, 0x28, 0x68, 0xb8, 0x42, 0x10, 0xd3, 0x3a, 0x46, + 0x20, 0x46, 0xc0, 0xf7, 0xe1, 0xff, 0x2f, 0x60, 0x0f, 0xe0, 0x20, 0x27, + 0xf4, 0xe7, 0x4f, 0xf4, 0xe0, 0x77, 0x28, 0x49, 0x78, 0x43, 0x01, 0x44, + 0xee, 0xe7, 0x4f, 0xf6, 0x2a, 0x76, 0x04, 0xe0, 0x4f, 0xf6, 0x26, 0x76, + 0x01, 0xe0, 0x4f, 0xf6, 0x52, 0x76, 0x30, 0x46, 0xf2, 0xbd, 0x80, 0xb5, + 0x00, 0xf0, 0x09, 0xf8, 0xd9, 0xf7, 0xd1, 0xfb, 0x02, 0xbd, 0x80, 0xb5, + 0x00, 0xf0, 0x03, 0xf8, 0xd9, 0xf7, 0xb6, 0xfb, 0x02, 0xbd, 0x00, 0x92, + 0x0b, 0x46, 0x02, 0x46, 0x44, 0x21, 0x1c, 0x48, 0x70, 0x47, 0x38, 0xb5, + 0x0c, 0x46, 0xcf, 0xf7, 0x03, 0xfc, 0x00, 0x25, 0xff, 0x28, 0x05, 0xd0, + 0x15, 0x49, 0x01, 0xeb, 0x40, 0x10, 0x42, 0x69, 0x22, 0x70, 0x01, 0xe0, + 0x4f, 0xf6, 0x52, 0x75, 0x28, 0x46, 0x32, 0xbd, 0x38, 0xb5, 0x0c, 0x46, + 0xcf, 0xf7, 0xf2, 0xfb, 0x00, 0x25, 0xff, 0x28, 0x05, 0xd0, 0x0d, 0x49, + 0x01, 0xeb, 0x40, 0x10, 0x82, 0x69, 0x22, 0x60, 0x01, 0xe0, 0x4f, 0xf6, + 0x52, 0x75, 0x28, 0x46, 0x32, 0xbd, 0x38, 0xb5, 0x0c, 0x46, 0xe9, 0xf7, + 0xe9, 0xfd, 0xcf, 0xf7, 0xdf, 0xfb, 0x00, 0x25, 0x01, 0x2c, 0x18, 0xbf, + 0x4f, 0xf6, 0x27, 0x75, 0x28, 0x46, 0x32, 0xbd, 0x84, 0x04, 0x00, 0x01, + 0x08, 0x4a, 0x00, 0x21, 0xd4, 0x69, 0x02, 0x21, 0x84, 0x70, 0x02, 0x21, + 0x08, 0x51, 0x00, 0x21, 0x4c, 0x62, 0x50, 0x68, 0x61, 0x73, 0x65, 0x43, + 0x61, 0x6c, 0x3a, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x58, 0x0a, 0x00, + 0x50, 0x61, 0x74, 0x68, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x3a, 0x20, 0x63, + 0x68, 0x25, 0x64, 0x2c, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x50, 0x61, 0x74, 0x68, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x3a, 0x20, 0x65, + 0x72, 0x72, 0x20, 0x25, 0x58, 0x0a, 0x00, 0x00, 0xf8, 0xb5, 0x0c, 0x46, + 0x05, 0x46, 0x16, 0x46, 0x06, 0xf5, 0xd8, 0x77, 0x60, 0x7d, 0xf8, 0x71, + 0x28, 0x46, 0x21, 0x7d, 0xb9, 0x71, 0xcf, 0xf7, 0xe0, 0xf9, 0x38, 0x60, + 0x28, 0x46, 0x61, 0x7d, 0x79, 0x71, 0x01, 0xf0, 0x87, 0xfa, 0x32, 0x46, + 0x21, 0x46, 0x28, 0x46, 0x00, 0xf0, 0x74, 0xf8, 0x04, 0x00, 0x03, 0xd1, + 0x39, 0x7a, 0x28, 0x46, 0x01, 0xf0, 0x7c, 0xfa, 0x20, 0x46, 0xf2, 0xbd, + 0x2d, 0xe9, 0xf0, 0x47, 0xf0, 0xb0, 0x81, 0x46, 0x0c, 0x46, 0x90, 0x46, + 0x68, 0x46, 0x4f, 0xf4, 0xe0, 0x71, 0xd3, 0xf7, 0x01, 0xf9, 0x48, 0x46, + 0x6c, 0xae, 0x01, 0xf0, 0x84, 0xfa, 0x04, 0xf1, 0x24, 0x05, 0x70, 0x71, + 0x95, 0xf9, 0x00, 0x20, 0x70, 0x79, 0x41, 0xb2, 0x02, 0xeb, 0xd2, 0x72, + 0xa1, 0xeb, 0x62, 0x01, 0x4a, 0xb2, 0x00, 0x2a, 0x48, 0xbf, 0x00, 0x21, + 0xf1, 0x71, 0x29, 0x78, 0x00, 0xeb, 0x51, 0x00, 0xb0, 0xf5, 0x80, 0x7f, + 0x28, 0xbf, 0xff, 0x20, 0xb0, 0x71, 0x48, 0x46, 0xcf, 0xf7, 0xa3, 0xf9, + 0x6c, 0x90, 0x6a, 0x46, 0x21, 0x46, 0x48, 0x46, 0x00, 0xf0, 0x3c, 0xf8, + 0x04, 0x00, 0x16, 0xd1, 0x31, 0x7a, 0x70, 0x79, 0x08, 0x1a, 0x07, 0x46, + 0x48, 0xbf, 0x7f, 0x42, 0x48, 0x46, 0xcf, 0xf7, 0x90, 0xf9, 0x82, 0x46, + 0x48, 0x46, 0xda, 0xf7, 0xf7, 0xfa, 0x69, 0x78, 0xba, 0xfb, 0xf0, 0xf0, + 0x41, 0x43, 0xc9, 0xb2, 0xff, 0xb2, 0xb9, 0x42, 0x38, 0xbf, 0x40, 0xf2, + 0x02, 0x74, 0x08, 0xf1, 0xc0, 0x00, 0x71, 0x79, 0x41, 0x70, 0xf2, 0x79, + 0xc2, 0x70, 0xb1, 0x79, 0x81, 0x70, 0x32, 0x7a, 0x02, 0x71, 0x40, 0x22, + 0x31, 0x79, 0x01, 0x70, 0x40, 0x46, 0x69, 0x46, 0xc0, 0xf7, 0xf8, 0xfe, + 0x40, 0x22, 0x24, 0xa9, 0x08, 0xf1, 0x40, 0x00, 0xc0, 0xf7, 0xf2, 0xfe, + 0x40, 0x22, 0x48, 0xa9, 0x08, 0xf1, 0x80, 0x00, 0xc0, 0xf7, 0xec, 0xfe, + 0x20, 0x46, 0x70, 0xb0, 0xbd, 0xe8, 0xf0, 0x87, 0x01, 0xf0, 0x0e, 0xba, + 0x2d, 0xe9, 0xf1, 0x4f, 0x2d, 0xed, 0x06, 0x8b, 0x89, 0x46, 0x92, 0x46, + 0x9a, 0xb0, 0x0f, 0xf2, 0x44, 0x42, 0x07, 0x21, 0x04, 0x20, 0xcf, 0xf7, + 0x0e, 0xfc, 0x0a, 0xf5, 0xd8, 0x77, 0xb8, 0x79, 0xfc, 0x79, 0x99, 0xed, + 0x04, 0x8a, 0x04, 0x1b, 0x64, 0x1c, 0x20, 0x98, 0xe4, 0xb2, 0xcf, 0xf7, + 0xb7, 0xf9, 0x01, 0xee, 0x10, 0x4a, 0x97, 0xed, 0x00, 0x0a, 0xf0, 0xee, + 0x00, 0x0a, 0xb8, 0xee, 0x41, 0x1a, 0xb8, 0xee, 0x40, 0x0a, 0x21, 0xee, + 0x20, 0x1a, 0x00, 0xeb, 0xd0, 0x75, 0x80, 0xee, 0x01, 0x9a, 0x6d, 0x10, + 0x69, 0xee, 0x20, 0x8a, 0x00, 0xee, 0x90, 0x5a, 0xf8, 0xee, 0xe0, 0x9a, + 0xf6, 0xee, 0x00, 0x0a, 0x69, 0xee, 0xa0, 0x1a, 0xf4, 0xee, 0x68, 0x1a, + 0xf1, 0xee, 0x10, 0xfa, 0x4f, 0xf0, 0x00, 0x08, 0x05, 0xd5, 0xf0, 0xee, + 0x49, 0x8a, 0x28, 0xee, 0xa0, 0x9a, 0x01, 0x24, 0x29, 0xe0, 0x20, 0xee, + 0x20, 0x0a, 0x80, 0xee, 0x28, 0x0a, 0xf1, 0xf7, 0x57, 0xfa, 0xb0, 0xee, + 0x40, 0xaa, 0xb0, 0xee, 0x48, 0x0a, 0xf1, 0xf7, 0x51, 0xfa, 0x8a, 0xee, + 0x00, 0x0a, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x4a, 0x9f, 0xed, + 0xa2, 0x0a, 0x29, 0xee, 0x80, 0x0a, 0x80, 0xee, 0x28, 0x0a, 0xf1, 0xf7, + 0x43, 0xfa, 0xe4, 0xb2, 0x20, 0x46, 0x00, 0xee, 0x90, 0x0a, 0xf8, 0xee, + 0x60, 0x0a, 0xbf, 0xee, 0x00, 0x1a, 0x70, 0xee, 0x81, 0x0a, 0x80, 0xee, + 0x20, 0x0a, 0x01, 0xf0, 0xd3, 0xf9, 0xb0, 0xee, 0x40, 0x8a, 0x66, 0x1c, + 0xb0, 0x00, 0x38, 0x71, 0xc0, 0xb2, 0x25, 0x28, 0x28, 0xbf, 0x40, 0xf2, + 0x03, 0x78, 0x46, 0xd2, 0x76, 0x06, 0xbd, 0xee, 0xc9, 0x0a, 0x36, 0x0e, + 0x10, 0xee, 0x10, 0x0a, 0x4a, 0xf8, 0x26, 0x00, 0x0a, 0xeb, 0xc6, 0x01, + 0x28, 0x1a, 0x41, 0xf8, 0x04, 0x0c, 0x4f, 0xf0, 0x01, 0x0b, 0x1d, 0xe0, + 0x58, 0x46, 0x00, 0xf0, 0x9d, 0xf9, 0xff, 0xee, 0x00, 0x0a, 0x70, 0xee, + 0x20, 0x0a, 0xb0, 0xee, 0x48, 0x0a, 0xd8, 0xf7, 0x21, 0xfb, 0x20, 0xee, + 0x28, 0x0a, 0x00, 0xf0, 0x07, 0xf9, 0x0b, 0xeb, 0x06, 0x01, 0x4a, 0xf8, + 0x21, 0x00, 0x71, 0x00, 0x49, 0x1e, 0xa1, 0xeb, 0x0b, 0x01, 0x28, 0x1a, + 0x4a, 0xf8, 0x21, 0x00, 0x0b, 0xf1, 0x01, 0x00, 0x5f, 0xfa, 0x80, 0xfb, + 0x5c, 0x45, 0xdf, 0xda, 0x00, 0x20, 0x76, 0xb2, 0x72, 0x00, 0x41, 0xb2, + 0x52, 0x1e, 0x52, 0x1a, 0x5a, 0xf8, 0x22, 0x30, 0x5b, 0x42, 0x72, 0x1e, + 0x4a, 0xf8, 0x20, 0x30, 0x52, 0x1a, 0x89, 0x19, 0x5a, 0xf8, 0x21, 0x10, + 0x40, 0x1c, 0x49, 0x42, 0xc0, 0xb2, 0x4a, 0xf8, 0x22, 0x10, 0x84, 0x42, + 0xea, 0xda, 0x5f, 0xea, 0x08, 0x04, 0x40, 0xf0, 0xa2, 0x80, 0x20, 0x99, + 0x02, 0x91, 0x00, 0x22, 0x8d, 0xf8, 0x0c, 0x20, 0xad, 0xf8, 0x0e, 0x20, + 0x01, 0x21, 0x01, 0x22, 0x8d, 0xf8, 0x0d, 0x10, 0x04, 0x92, 0x03, 0x22, + 0xd9, 0xf8, 0x08, 0x00, 0x09, 0x90, 0x02, 0xa8, 0xd9, 0xf8, 0x04, 0x10, + 0x07, 0x91, 0x8d, 0xf8, 0x28, 0x20, 0x01, 0x21, 0x8d, 0xf8, 0x29, 0x10, + 0x01, 0xaa, 0x0d, 0xf1, 0x06, 0x01, 0xdd, 0xf7, 0x17, 0xf9, 0x04, 0x46, + 0xbd, 0xf8, 0x04, 0x20, 0x9d, 0xf8, 0x0d, 0x10, 0x20, 0x98, 0xed, 0xf7, + 0xa2, 0xf9, 0xd9, 0xed, 0x00, 0x0a, 0x99, 0xed, 0x01, 0x1a, 0x00, 0xee, + 0x10, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0xb8, 0xee, 0x41, 0x1a, 0x20, 0xee, + 0x81, 0x1a, 0xb8, 0xee, 0x40, 0x0a, 0x81, 0xee, 0x00, 0x0a, 0x00, 0xf0, + 0xa3, 0xf8, 0xc0, 0xb2, 0x00, 0x2c, 0x08, 0x90, 0x5f, 0xd1, 0x20, 0x98, + 0x00, 0x21, 0x01, 0xf0, 0x30, 0xf9, 0x20, 0x9e, 0x00, 0x25, 0x23, 0xe0, + 0x02, 0x21, 0x30, 0x46, 0x00, 0xf0, 0x99, 0xf8, 0x0b, 0xa9, 0x02, 0xa8, + 0xdd, 0xf7, 0x38, 0xf8, 0x03, 0x00, 0x43, 0xd1, 0x0a, 0xeb, 0x85, 0x00, + 0x9d, 0xed, 0x16, 0x0a, 0xdd, 0xed, 0x12, 0x0a, 0xc0, 0xee, 0x20, 0x0a, + 0xc0, 0xed, 0x24, 0x0a, 0x9d, 0xed, 0x18, 0x0a, 0xdd, 0xed, 0x12, 0x0a, + 0xc0, 0xee, 0x20, 0x0a, 0xc0, 0xed, 0x48, 0x0a, 0x00, 0x21, 0x30, 0x46, + 0xda, 0xf7, 0x25, 0xf9, 0x04, 0x00, 0x36, 0xd1, 0x6d, 0x1c, 0xed, 0xb2, + 0x38, 0x79, 0x85, 0x42, 0x31, 0xda, 0x5a, 0xf8, 0x25, 0x10, 0x05, 0x91, + 0x00, 0x20, 0x00, 0x90, 0x00, 0x23, 0x5a, 0xf8, 0x25, 0x20, 0x01, 0x21, + 0x30, 0x46, 0xda, 0xf7, 0x70, 0xf8, 0x04, 0x00, 0x23, 0xd1, 0x01, 0x21, + 0x30, 0x46, 0x00, 0xf0, 0x64, 0xf8, 0x02, 0xa8, 0xdc, 0xf7, 0x32, 0xff, + 0x04, 0x00, 0x1a, 0xd1, 0xd9, 0xf8, 0x0c, 0x10, 0x30, 0x46, 0xdc, 0xf7, + 0xf9, 0xff, 0x00, 0x28, 0xba, 0xd0, 0x00, 0xbf, 0x75, 0xa2, 0x07, 0x21, + 0x03, 0x20, 0xcf, 0xf7, 0xce, 0xfa, 0x40, 0xf2, 0x04, 0x74, 0x06, 0xe0, + 0x77, 0xa2, 0x07, 0x21, 0x03, 0x20, 0xcf, 0xf7, 0xc6, 0xfa, 0x40, 0xf2, + 0x06, 0x74, 0x04, 0x21, 0x30, 0x46, 0x00, 0xf0, 0x44, 0xf8, 0x23, 0x46, + 0x75, 0xa2, 0x07, 0x21, 0x04, 0x20, 0xcf, 0xf7, 0xba, 0xfa, 0x7c, 0xbb, + 0x66, 0xa2, 0x07, 0x21, 0x04, 0x20, 0xcf, 0xf7, 0xb4, 0xfa, 0xb8, 0x79, + 0xf9, 0x79, 0x00, 0xee, 0x10, 0x0a, 0xf8, 0xee, 0x40, 0x0a, 0x01, 0xee, + 0x90, 0x1a, 0xb7, 0xee, 0x00, 0x1a, 0xb8, 0xee, 0x61, 0x0a, 0x50, 0x46, + 0x00, 0xf0, 0x30, 0xf8, 0x00, 0xf0, 0x22, 0xf8, 0x38, 0x72, 0xd9, 0xed, + 0x06, 0x0a, 0x38, 0x7a, 0xd9, 0xed, 0x07, 0x1a, 0x99, 0xed, 0x08, 0x1a, + 0x00, 0xf0, 0xa2, 0xf8, 0x70, 0xee, 0x20, 0x0a, 0x30, 0xee, 0x21, 0x0a, + 0x50, 0x46, 0x00, 0xf0, 0x1d, 0xf8, 0x38, 0x7a, 0x00, 0xee, 0x90, 0x0a, + 0xf8, 0xee, 0x60, 0x0a, 0x30, 0xee, 0x60, 0x0a, 0x87, 0xed, 0x03, 0x0a, + 0x1a, 0xb0, 0x20, 0x46, 0xbd, 0xec, 0x06, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, + 0x48, 0xe1, 0xfa, 0x3e, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, + 0x70, 0x47, 0x0a, 0x46, 0x01, 0x21, 0x81, 0x40, 0x06, 0x20, 0xf0, 0xf7, + 0x9b, 0xbf, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0x80, 0x46, 0x2d, 0xed, + 0x0c, 0x8b, 0x08, 0xf5, 0xd8, 0x74, 0xb0, 0xee, 0x40, 0x9a, 0x94, 0xed, + 0x00, 0x0a, 0xf8, 0xee, 0x40, 0x9a, 0xb0, 0xee, 0x41, 0x8a, 0x30, 0xee, + 0xc9, 0x0a, 0x80, 0xee, 0x08, 0x0a, 0xc0, 0xf7, 0x21, 0xf8, 0xbd, 0xee, + 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x5a, 0xed, 0xb2, 0x9f, 0xed, 0x2f, 0xaa, + 0xdf, 0xed, 0x2e, 0xaa, 0x00, 0x27, 0x3c, 0xe0, 0x08, 0xeb, 0x86, 0x00, + 0xdf, 0xed, 0x2c, 0x0a, 0x90, 0xed, 0x00, 0x0a, 0xb8, 0xee, 0xc0, 0x0a, + 0x80, 0xee, 0x29, 0x0a, 0x60, 0xee, 0x20, 0x0a, 0x60, 0xee, 0xab, 0xca, + 0xb0, 0xee, 0x6c, 0x0a, 0xc0, 0xf7, 0x3e, 0xfe, 0xb0, 0xee, 0x40, 0xda, + 0xb0, 0xee, 0x6c, 0x0a, 0xc0, 0xf7, 0x3a, 0xfe, 0x08, 0xeb, 0x86, 0x00, + 0x76, 0x1c, 0x90, 0xed, 0x24, 0x1a, 0xd0, 0xed, 0x48, 0x0a, 0x61, 0xee, + 0x0d, 0x1a, 0x40, 0xee, 0xc0, 0x1a, 0x60, 0xee, 0x8d, 0x0a, 0x41, 0xee, + 0x00, 0x0a, 0x31, 0xee, 0x8c, 0xca, 0x30, 0xee, 0x8b, 0xba, 0xf6, 0xb2, + 0x20, 0x79, 0x86, 0x42, 0xd0, 0xdb, 0x2c, 0xee, 0x0c, 0x0a, 0x0b, 0xee, + 0x0b, 0x0a, 0xb4, 0xee, 0x40, 0xaa, 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xbf, + 0xb0, 0xee, 0x40, 0xaa, 0xf0, 0xee, 0x68, 0xaa, 0x7f, 0x1c, 0xf8, 0xb2, + 0x85, 0x42, 0x12, 0xdb, 0x61, 0x79, 0x00, 0xf0, 0x1b, 0xf8, 0xf0, 0xee, + 0x49, 0x8a, 0x00, 0xee, 0x90, 0x1a, 0x40, 0xee, 0x08, 0x8a, 0xf8, 0xee, + 0x60, 0x0a, 0x9f, 0xed, 0x07, 0xca, 0x9f, 0xed, 0x06, 0xba, 0x78, 0xee, + 0xe0, 0xba, 0x00, 0x26, 0xd8, 0xe7, 0xb0, 0xee, 0x6a, 0x0a, 0xbd, 0xec, + 0x0c, 0x8b, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xdb, 0x0f, 0xc9, 0x40, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, + 0x70, 0x47, 0x00, 0x00, 0x63, 0x61, 0x6c, 0x63, 0x4f, 0x62, 0x73, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x67, 0x65, 0x74, 0x45, 0x73, 0x74, 0x0a, 0x00, + 0x58, 0x43, 0x6f, 0x72, 0x72, 0x5f, 0x57, 0x61, 0x69, 0x74, 0x3a, 0x20, + 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x43, 0x6f, 0x72, 0x72, 0x5f, 0x47, 0x65, 0x74, 0x3a, 0x20, 0x25, + 0x64, 0x0a, 0x00, 0x00, 0x67, 0x65, 0x74, 0x46, 0x69, 0x66, 0x6f, 0x4f, + 0x62, 0x73, 0x3a, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x64, 0x0a, 0x00, + 0x2d, 0xe9, 0xf8, 0x4f, 0x0e, 0x46, 0xd4, 0xb0, 0xd6, 0xf8, 0x10, 0x80, + 0xf2, 0x68, 0x0f, 0x92, 0x81, 0x46, 0x00, 0xf0, 0xfa, 0xf8, 0x04, 0x00, + 0x0d, 0xd0, 0x1c, 0xb9, 0x31, 0x46, 0x48, 0x46, 0x00, 0xf0, 0xca, 0xf9, + 0x0f, 0x99, 0x40, 0x46, 0x00, 0xf0, 0xd9, 0xf9, 0x20, 0x46, 0x55, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x80, 0x46, 0x98, 0xf8, 0x00, 0x00, 0x00, 0x28, + 0x08, 0xbf, 0x00, 0x2c, 0xeb, 0xd1, 0x01, 0x20, 0x88, 0xf8, 0x00, 0x00, + 0x4f, 0xf0, 0x00, 0x0a, 0xcd, 0xf8, 0x2c, 0x80, 0x11, 0xe0, 0x70, 0xb9, + 0xe8, 0x69, 0x01, 0x21, 0x01, 0xfa, 0x07, 0xf7, 0x20, 0xea, 0x07, 0x07, + 0xef, 0x61, 0x06, 0xe0, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0xf1, 0xd5, 0x00, 0x20, 0x28, 0x70, 0x0a, 0xf1, 0x01, 0x0a, 0x0b, 0x98, + 0x81, 0x68, 0x8a, 0x45, 0xda, 0xd2, 0x00, 0x2c, 0xd8, 0xd1, 0xc1, 0x69, + 0x21, 0xfa, 0x0a, 0xf1, 0xc8, 0x07, 0xf2, 0xd5, 0x0b, 0x99, 0xc1, 0xf8, + 0x0c, 0xa0, 0x0d, 0xf1, 0x2a, 0x00, 0x00, 0x21, 0x01, 0x80, 0xb5, 0x68, + 0x37, 0x69, 0x70, 0x69, 0x0e, 0x90, 0x58, 0x20, 0xf9, 0x68, 0x41, 0x43, + 0x78, 0x18, 0xa9, 0x8b, 0x0c, 0x91, 0x00, 0xf1, 0x20, 0x0b, 0xe8, 0x8b, + 0x0d, 0x90, 0x58, 0x46, 0x00, 0x68, 0xc0, 0x46, 0x80, 0x46, 0x00, 0x20, + 0x00, 0x90, 0x00, 0x23, 0x29, 0x78, 0x42, 0x46, 0x48, 0x46, 0xd9, 0xf7, + 0xec, 0xfe, 0x04, 0x00, 0x34, 0xd1, 0x0a, 0xa9, 0x09, 0x91, 0x0d, 0xf1, + 0x2a, 0x02, 0x24, 0xab, 0x08, 0x92, 0x07, 0x93, 0x0a, 0x22, 0xa9, 0x69, + 0x06, 0x91, 0x00, 0x23, 0x05, 0x92, 0x04, 0x93, 0x0c, 0xaa, 0x95, 0xf8, + 0x21, 0x10, 0x03, 0x91, 0x02, 0x92, 0x07, 0xf5, 0x32, 0x60, 0x95, 0xf8, + 0x20, 0x30, 0x01, 0x93, 0x01, 0x22, 0x41, 0x88, 0x00, 0x91, 0x59, 0x46, + 0x03, 0x88, 0x95, 0xed, 0x09, 0x0a, 0x48, 0x46, 0xfd, 0xf7, 0x16, 0xfe, + 0x04, 0x46, 0x9d, 0xf8, 0x28, 0x00, 0x58, 0xb9, 0x0c, 0xb9, 0x43, 0xf2, + 0x08, 0x24, 0xd8, 0xf7, 0x8d, 0xff, 0x03, 0x46, 0x0e, 0x98, 0x0d, 0xf1, + 0x2a, 0x02, 0x41, 0x46, 0xfe, 0xf7, 0x97, 0xfa, 0x00, 0x21, 0x48, 0x46, + 0xd9, 0xf7, 0x57, 0xff, 0x00, 0x2c, 0x98, 0xd1, 0x35, 0x69, 0xb5, 0xf8, + 0x20, 0x0b, 0x3d, 0x99, 0x37, 0x68, 0xd6, 0xf8, 0x04, 0xb0, 0xd6, 0xf8, + 0x08, 0x80, 0x74, 0x69, 0x00, 0xee, 0x10, 0x0a, 0x25, 0x98, 0xb8, 0xee, + 0x40, 0x0a, 0xdf, 0xed, 0x94, 0x0a, 0x60, 0xee, 0x20, 0x0a, 0x08, 0x18, + 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x20, 0xee, 0x80, 0x0a, + 0xdd, 0xed, 0x39, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0xde, 0xf7, 0x48, 0xf9, + 0xbc, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x2a, 0x59, 0x46, 0x38, 0x46, + 0xf9, 0xf7, 0x38, 0xfb, 0x01, 0x20, 0x24, 0xaa, 0x10, 0xab, 0x03, 0x90, + 0x02, 0x90, 0x01, 0x92, 0x00, 0x93, 0x5a, 0x46, 0x23, 0x46, 0x39, 0x46, + 0x48, 0x46, 0xfd, 0xf7, 0x85, 0xfe, 0x04, 0x46, 0xd5, 0xf8, 0x24, 0x0b, + 0xe9, 0x68, 0x88, 0x42, 0x03, 0xd3, 0x59, 0x46, 0x38, 0x46, 0xf9, 0xf7, + 0x2b, 0xff, 0xe8, 0x68, 0xc5, 0xf8, 0x24, 0x0b, 0x00, 0x2c, 0xba, 0xd1, + 0x01, 0x20, 0x00, 0x90, 0x5b, 0x46, 0x3a, 0x46, 0x00, 0x21, 0x48, 0x46, + 0xfd, 0xf7, 0xc1, 0xfe, 0x04, 0x00, 0xb0, 0xd1, 0x9d, 0xed, 0x24, 0x0a, + 0x00, 0x23, 0x00, 0x22, 0x59, 0x46, 0x38, 0x46, 0xf9, 0xf7, 0x1e, 0xfd, + 0xef, 0x68, 0x01, 0x20, 0x00, 0x21, 0x3a, 0x46, 0xf0, 0xf7, 0xda, 0xf9, + 0x02, 0x46, 0xa8, 0x69, 0x10, 0x40, 0x0c, 0xbf, 0xd8, 0xed, 0x05, 0x0a, + 0xd8, 0xed, 0x04, 0x0a, 0x2c, 0xe7, 0x2d, 0xe9, 0xf8, 0x43, 0x2d, 0xed, + 0x02, 0x8b, 0x0c, 0x46, 0xc0, 0xb0, 0x81, 0x46, 0xa7, 0x68, 0x25, 0x69, + 0x61, 0x68, 0x20, 0x68, 0xf9, 0xf7, 0xf8, 0xfc, 0x09, 0xa9, 0x48, 0x46, + 0xff, 0xf7, 0xc4, 0xfb, 0x5f, 0xea, 0x00, 0x08, 0x19, 0xd1, 0x60, 0x68, + 0x9d, 0xed, 0x09, 0x0a, 0xf9, 0xf7, 0x35, 0xfc, 0x06, 0xa8, 0x04, 0x90, + 0x0d, 0xf1, 0x16, 0x03, 0x08, 0xa9, 0x05, 0xaa, 0x01, 0x93, 0x07, 0xa8, + 0x03, 0x91, 0x02, 0x92, 0x00, 0x90, 0x97, 0xf8, 0x20, 0x30, 0xba, 0x68, + 0x79, 0x68, 0x97, 0xed, 0x03, 0x0a, 0x48, 0x46, 0xfd, 0xf7, 0xca, 0xfc, + 0x80, 0x46, 0xb8, 0xf1, 0x00, 0x0f, 0x52, 0xd1, 0xb8, 0x68, 0x06, 0x90, + 0x69, 0x46, 0x48, 0x46, 0xcd, 0xf7, 0x5e, 0xff, 0x00, 0x26, 0x5f, 0xea, + 0x00, 0x08, 0x44, 0xd1, 0x48, 0x46, 0xce, 0xf7, 0xea, 0xfe, 0x06, 0x46, + 0x00, 0xee, 0x10, 0x6a, 0xb8, 0xee, 0x40, 0x8a, 0x9d, 0xed, 0x06, 0x0a, + 0xb8, 0xee, 0x40, 0x0a, 0x88, 0xee, 0x00, 0x0a, 0xde, 0xf7, 0xb8, 0xf8, + 0xbc, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x4a, 0x64, 0x1c, 0xe0, 0x07, + 0x48, 0xbf, 0x64, 0x1c, 0x60, 0x1e, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, + 0x40, 0x0a, 0x88, 0xee, 0x00, 0x0a, 0xcd, 0xf7, 0x85, 0xfc, 0xbc, 0xee, + 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x7a, 0x48, 0x46, 0xce, 0xf7, 0x16, 0xfe, + 0x86, 0x1b, 0x76, 0x08, 0xb6, 0xfb, 0xf7, 0xf0, 0x40, 0x00, 0x06, 0x19, + 0x00, 0x99, 0x72, 0x1e, 0x7a, 0x43, 0xa1, 0xeb, 0x52, 0x01, 0x29, 0x61, + 0x40, 0x08, 0x01, 0x21, 0x01, 0xfa, 0x06, 0xf3, 0x01, 0xfa, 0x04, 0xf4, + 0x5b, 0x1e, 0x64, 0x1e, 0x6b, 0x61, 0x84, 0x40, 0xac, 0x61, 0x21, 0x2e, + 0x68, 0x69, 0xe8, 0x61, 0x28, 0xbf, 0x43, 0xf2, 0x04, 0x28, 0xae, 0x60, + 0xb8, 0xf1, 0x00, 0x0f, 0x06, 0x97, 0x47, 0xd1, 0x48, 0x46, 0xce, 0xf7, + 0x9a, 0xfe, 0x07, 0x46, 0x0a, 0xa9, 0x48, 0x46, 0xce, 0xf7, 0xcf, 0xfd, + 0x00, 0x24, 0x23, 0x4e, 0x00, 0xe0, 0x64, 0x1c, 0xa8, 0x68, 0x84, 0x42, + 0x1c, 0xd2, 0x69, 0x69, 0xe1, 0x40, 0xc8, 0x07, 0xf7, 0xd5, 0x07, 0x99, + 0x08, 0x98, 0x07, 0x9a, 0x02, 0x91, 0x03, 0x97, 0x01, 0x90, 0x0a, 0xab, + 0x29, 0x69, 0x06, 0x98, 0x00, 0xfb, 0x04, 0x11, 0x58, 0x20, 0x89, 0x1a, + 0x60, 0x43, 0x00, 0x91, 0x28, 0x44, 0x00, 0xf1, 0x20, 0x02, 0x0f, 0xa9, + 0x30, 0x46, 0xfd, 0xf7, 0xbb, 0xff, 0x5f, 0xea, 0x00, 0x08, 0xde, 0xd0, + 0xe9, 0x69, 0x48, 0x42, 0x01, 0x40, 0x00, 0xee, 0x10, 0x1a, 0xb8, 0xee, + 0x40, 0x0a, 0xc0, 0xf7, 0x2b, 0xfd, 0x06, 0x98, 0x68, 0x60, 0x05, 0xf5, + 0x32, 0x60, 0xbd, 0xf8, 0x16, 0x10, 0x01, 0x80, 0x00, 0x21, 0xbd, 0xf8, + 0x14, 0x20, 0x42, 0x80, 0x69, 0x70, 0x29, 0x70, 0xbc, 0xee, 0xc0, 0x0a, + 0x85, 0xed, 0x03, 0x0a, 0x80, 0xed, 0x01, 0x0a, 0x40, 0xb0, 0x40, 0x46, + 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x83, 0x00, 0x00, 0x7a, 0x44, + 0x88, 0x94, 0x04, 0x02, 0xf8, 0xb5, 0x0d, 0x68, 0x4e, 0x68, 0x04, 0x46, + 0x00, 0x27, 0x00, 0x20, 0x00, 0x90, 0x33, 0x46, 0x2a, 0x46, 0xf9, 0xb2, + 0x20, 0x46, 0xfd, 0xf7, 0xc4, 0xfd, 0x7f, 0x1c, 0x41, 0x2f, 0x01, 0xd2, + 0x00, 0x28, 0xf2, 0xd0, 0xf2, 0xbd, 0x02, 0x69, 0x0a, 0x60, 0x43, 0x68, + 0x4b, 0x60, 0x82, 0x68, 0x8a, 0x60, 0x83, 0x69, 0xcb, 0x60, 0x42, 0x69, + 0x0a, 0x61, 0x00, 0xf5, 0x32, 0x60, 0x03, 0x88, 0x4b, 0x61, 0x40, 0x88, + 0x88, 0x61, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x10, 0x8b, + 0x0f, 0x46, 0xad, 0xf5, 0x40, 0x7d, 0x80, 0x46, 0x78, 0x89, 0x4f, 0xea, + 0x40, 0x09, 0x38, 0x7a, 0x8d, 0xf8, 0x00, 0x00, 0x16, 0x46, 0x97, 0xf8, + 0x09, 0xa0, 0x1d, 0x46, 0x1f, 0xfa, 0x89, 0xf1, 0x21, 0xb9, 0x00, 0xf0, + 0x5e, 0xfb, 0xdb, 0xf7, 0xe7, 0xfa, 0x15, 0xe0, 0x40, 0x46, 0xec, 0xf7, + 0x0f, 0xfc, 0x04, 0x00, 0x04, 0xd1, 0x01, 0x21, 0x40, 0x46, 0xec, 0xf7, + 0x41, 0xfc, 0x04, 0x46, 0x5c, 0xb9, 0x1f, 0xfa, 0x89, 0xf1, 0x40, 0x46, + 0xec, 0xf7, 0x3d, 0xfc, 0x04, 0x46, 0x24, 0xb9, 0x00, 0xf0, 0x47, 0xfb, + 0xdb, 0xf7, 0xbd, 0xfa, 0x04, 0x46, 0x40, 0x46, 0xec, 0xf7, 0x4c, 0xfc, + 0x30, 0x71, 0x34, 0xb9, 0x6b, 0x46, 0x06, 0x22, 0x01, 0x21, 0x40, 0x46, + 0xec, 0xf7, 0x39, 0xfb, 0x04, 0x46, 0xba, 0xf1, 0xff, 0x0f, 0x05, 0xd0, + 0x9d, 0xf8, 0x00, 0x10, 0x52, 0x46, 0x40, 0x46, 0xec, 0xf7, 0xfc, 0xfc, + 0x40, 0x46, 0xec, 0xf7, 0x37, 0xfc, 0x01, 0x46, 0x00, 0x23, 0x4f, 0xf4, + 0x80, 0x32, 0x40, 0x46, 0xdb, 0xf7, 0x58, 0xfe, 0x00, 0x2c, 0x40, 0xf0, + 0xc8, 0x82, 0x00, 0x21, 0x11, 0x91, 0xdf, 0xed, 0x02, 0xea, 0x0f, 0x95, + 0x41, 0xe2, 0x00, 0xbf, 0x00, 0x00, 0x80, 0x47, 0x00, 0x2c, 0x14, 0xd1, + 0x0e, 0xa8, 0x04, 0x90, 0x0a, 0xab, 0x0c, 0xa9, 0x0d, 0xf1, 0x2a, 0x02, + 0x01, 0x93, 0x0d, 0xa8, 0x03, 0x91, 0x02, 0x92, 0x00, 0x90, 0x97, 0xf8, + 0x24, 0x30, 0xf9, 0x68, 0x97, 0xed, 0x04, 0x0a, 0x00, 0x22, 0x40, 0x46, + 0xfd, 0xf7, 0x8a, 0xfb, 0x04, 0x00, 0x40, 0xf0, 0x23, 0x82, 0x14, 0xa9, + 0x40, 0x46, 0xce, 0xf7, 0xe8, 0xfc, 0x40, 0x46, 0xce, 0xf7, 0xab, 0xfd, + 0x81, 0x46, 0x00, 0x25, 0x78, 0x68, 0x18, 0xb9, 0x40, 0x46, 0xce, 0xf7, + 0xaa, 0xfd, 0x80, 0x08, 0x05, 0xb1, 0x40, 0x42, 0x0d, 0x99, 0x0c, 0x9a, + 0x02, 0x91, 0x01, 0x92, 0x00, 0x90, 0xcd, 0xf8, 0x0c, 0x90, 0x14, 0xab, + 0x19, 0xaa, 0x2f, 0xa9, 0xdf, 0xf8, 0x84, 0x06, 0xfd, 0xf7, 0xda, 0xfe, + 0x00, 0x28, 0x50, 0xd1, 0xbd, 0xf8, 0x2a, 0x00, 0xbd, 0xf8, 0x28, 0xb0, + 0xad, 0xf8, 0x40, 0x00, 0x00, 0x2d, 0x14, 0xbf, 0x0d, 0xf5, 0x0f, 0x7a, + 0x0d, 0xf5, 0xbe, 0x7a, 0x0d, 0xf1, 0x2e, 0x00, 0x00, 0x21, 0x01, 0x80, + 0xf9, 0x69, 0x12, 0x91, 0x38, 0x6a, 0x13, 0x90, 0x19, 0xa8, 0x00, 0x68, + 0xc0, 0x46, 0x00, 0x21, 0x00, 0x91, 0x02, 0x46, 0x39, 0x78, 0x00, 0x23, + 0x40, 0x46, 0xd9, 0xf7, 0x9e, 0xfc, 0x04, 0x00, 0x2a, 0xd1, 0x0b, 0xa8, + 0x0d, 0xf1, 0x2e, 0x01, 0x09, 0x90, 0x08, 0x91, 0xcd, 0xf8, 0x1c, 0xa0, + 0x0a, 0x20, 0xba, 0x69, 0x05, 0x90, 0x00, 0x21, 0x07, 0xf1, 0x24, 0x03, + 0x06, 0x92, 0x04, 0x91, 0x12, 0xa9, 0x58, 0x78, 0x03, 0x90, 0x02, 0x91, + 0x97, 0xf8, 0x24, 0x20, 0xbd, 0xf8, 0x40, 0x00, 0x01, 0x92, 0x07, 0xf1, + 0x24, 0x01, 0x00, 0x90, 0x91, 0xed, 0x01, 0x0a, 0x3a, 0x7a, 0x5b, 0x46, + 0x19, 0xa9, 0x40, 0x46, 0xfd, 0xf7, 0xc6, 0xfb, 0x04, 0x46, 0x9d, 0xf8, + 0x2c, 0x00, 0x00, 0x28, 0x04, 0xbf, 0x00, 0x2c, 0x43, 0xf2, 0x08, 0x24, + 0x00, 0x21, 0x40, 0x46, 0xd9, 0xf7, 0x0f, 0xfd, 0x20, 0x46, 0x6d, 0x1c, + 0x01, 0x2d, 0x01, 0xd8, 0x00, 0x28, 0x91, 0xd0, 0x04, 0x00, 0x84, 0xd1, + 0x31, 0x79, 0x06, 0xab, 0x23, 0xaa, 0x40, 0x46, 0xdb, 0xf7, 0x75, 0xfd, + 0x9d, 0xed, 0x5f, 0xea, 0xb0, 0xee, 0x4e, 0x0a, 0x10, 0x22, 0x07, 0x21, + 0x23, 0xa8, 0x00, 0xf0, 0x7d, 0xfa, 0x02, 0xa8, 0x10, 0x22, 0x80, 0xec, + 0x02, 0x0a, 0xb0, 0xee, 0x4e, 0x0a, 0x03, 0x21, 0x06, 0xa8, 0x00, 0xf0, + 0x73, 0xfa, 0x68, 0x46, 0x80, 0xec, 0x02, 0x0a, 0x9d, 0xed, 0x62, 0x0a, + 0xc1, 0xf7, 0x2c, 0xf9, 0x00, 0xf0, 0xdc, 0xfa, 0x9d, 0xed, 0x6c, 0x0a, + 0xc1, 0xf7, 0x26, 0xf9, 0x00, 0xf0, 0x4f, 0xfa, 0x00, 0xf0, 0xc6, 0xfa, + 0x9d, 0xed, 0x6b, 0x0a, 0xc1, 0xf7, 0x1e, 0xf9, 0xb0, 0xee, 0x49, 0x1a, + 0xf0, 0xee, 0x69, 0x1a, 0xc1, 0xf7, 0xc5, 0xf8, 0xb0, 0xee, 0x48, 0x1a, + 0xf0, 0xee, 0x68, 0x1a, 0xc1, 0xf7, 0xf8, 0xf8, 0x00, 0xf0, 0xc2, 0xfa, + 0x9d, 0xed, 0x7a, 0x0a, 0xc1, 0xf7, 0x0c, 0xf9, 0x83, 0xa8, 0x00, 0xf0, + 0x0a, 0xfa, 0x00, 0xf0, 0x32, 0xfa, 0x00, 0xf0, 0xed, 0xf9, 0x9d, 0xed, + 0x83, 0x0a, 0xc1, 0xf7, 0x01, 0xf9, 0x00, 0xf0, 0xfa, 0xf9, 0x00, 0xf0, + 0x14, 0xfa, 0xbf, 0xf7, 0x9a, 0xfb, 0xb0, 0xee, 0x40, 0xda, 0xf0, 0xee, + 0x60, 0xda, 0x9d, 0xed, 0x92, 0x0a, 0xc1, 0xf7, 0xf3, 0xf8, 0x00, 0xf0, + 0x95, 0xfa, 0x9d, 0xed, 0x9c, 0x0a, 0xc1, 0xf7, 0xed, 0xf8, 0x00, 0xf0, + 0x16, 0xfa, 0x00, 0xf0, 0xd1, 0xf9, 0x9d, 0xed, 0x9b, 0x0a, 0xc1, 0xf7, + 0xe5, 0xf8, 0x00, 0xf0, 0xde, 0xf9, 0x00, 0xf0, 0xf8, 0xf9, 0xbf, 0xf7, + 0x7e, 0xfb, 0xb0, 0xee, 0x40, 0xca, 0xf0, 0xee, 0x60, 0xca, 0x9d, 0xed, + 0xaa, 0x0a, 0xc1, 0xf7, 0xd7, 0xf8, 0xb3, 0xa8, 0x00, 0xf0, 0xd5, 0xf9, + 0x00, 0xf0, 0xfd, 0xf9, 0x00, 0xf0, 0xb8, 0xf9, 0x9d, 0xed, 0xb3, 0x0a, + 0xc1, 0xf7, 0xcc, 0xf8, 0x00, 0xf0, 0xc5, 0xf9, 0x00, 0xf0, 0xdf, 0xf9, + 0x00, 0xf0, 0xe3, 0xf9, 0x04, 0xa8, 0xb0, 0xee, 0x4d, 0x1a, 0x80, 0xec, + 0x02, 0x0a, 0x00, 0xf0, 0xac, 0xf9, 0x69, 0x46, 0xdf, 0xf8, 0xb0, 0x04, + 0xb0, 0xee, 0x40, 0xfa, 0xf0, 0xee, 0x60, 0xfa, 0x91, 0xec, 0x02, 0x1a, + 0x90, 0xec, 0x02, 0x0a, 0xc1, 0xf7, 0x85, 0xf8, 0xb0, 0xee, 0x40, 0xba, + 0xf0, 0xee, 0x60, 0xba, 0x00, 0xf0, 0xcd, 0xf9, 0x00, 0xf0, 0xb3, 0xf9, + 0x00, 0xf0, 0x9d, 0xf9, 0xb0, 0xee, 0x4b, 0x1a, 0xf0, 0xee, 0x6b, 0x1a, + 0xc1, 0xf7, 0x4f, 0xf8, 0x00, 0xf0, 0xd6, 0xf9, 0x68, 0x46, 0xdf, 0xf8, + 0x74, 0x14, 0x00, 0xf0, 0x4d, 0xfa, 0x90, 0xec, 0x02, 0x1a, 0x91, 0xec, + 0x02, 0x0a, 0xc1, 0xf7, 0x68, 0xf8, 0x00, 0xf0, 0x37, 0xfa, 0xb0, 0xee, + 0x4d, 0x1a, 0x00, 0xf0, 0x7c, 0xf9, 0x00, 0xf0, 0x75, 0xf9, 0xb0, 0xee, + 0x4d, 0x1a, 0xf0, 0xee, 0x6d, 0x1a, 0xb0, 0xee, 0x4c, 0x0a, 0xf0, 0xee, + 0x6c, 0x0a, 0xc1, 0xf7, 0x43, 0xf8, 0x00, 0xf0, 0x76, 0xf9, 0xb0, 0xee, + 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, 0xc1, 0xf7, 0x3b, 0xf8, 0x00, 0xf0, + 0xaf, 0xf9, 0x00, 0xf0, 0x94, 0xf9, 0xdf, 0xf8, 0x28, 0x04, 0x00, 0xf0, + 0x9f, 0xf9, 0x00, 0xf0, 0x7a, 0xf9, 0xdf, 0xf8, 0x20, 0x04, 0x00, 0xf0, + 0x99, 0xf9, 0x00, 0xf0, 0x60, 0xf9, 0xdf, 0xf8, 0x18, 0x04, 0xb0, 0xee, + 0x40, 0xba, 0xf0, 0xee, 0x60, 0xba, 0xb0, 0xee, 0x4a, 0x1a, 0xf0, 0xee, + 0x6a, 0x1a, 0x90, 0xec, 0x02, 0x0a, 0xc1, 0xf7, 0x43, 0xf8, 0xb0, 0xee, + 0x40, 0xaa, 0x9f, 0xed, 0xc7, 0x0a, 0x6e, 0xee, 0x00, 0xda, 0xf0, 0xee, + 0x60, 0xaa, 0xb0, 0xee, 0x6d, 0x0a, 0xc0, 0xf7, 0x75, 0xfb, 0xb0, 0xee, + 0x40, 0xca, 0xb0, 0xee, 0x6d, 0x0a, 0xc0, 0xf7, 0xd7, 0xf9, 0xf0, 0xee, + 0x40, 0xca, 0xb0, 0xee, 0x6d, 0x0a, 0xc0, 0xf7, 0x69, 0xfb, 0xb0, 0xee, + 0x40, 0xda, 0xb0, 0xee, 0x6d, 0x0a, 0xc0, 0xf7, 0xcb, 0xf9, 0x86, 0xed, + 0x00, 0xea, 0x04, 0xaa, 0x38, 0x7a, 0x70, 0x71, 0xf0, 0xee, 0x40, 0xda, + 0x06, 0xf1, 0x18, 0x01, 0x92, 0xec, 0x02, 0x0a, 0x06, 0xf1, 0x20, 0x00, + 0x81, 0xec, 0x02, 0x0a, 0x06, 0xf1, 0x28, 0x01, 0x80, 0xec, 0x02, 0xfa, + 0x06, 0xf1, 0x30, 0x02, 0x81, 0xec, 0x02, 0x8a, 0x02, 0xa8, 0x82, 0xec, + 0x02, 0x9a, 0x06, 0xf1, 0x08, 0x03, 0x90, 0xec, 0x02, 0x0a, 0x83, 0xec, + 0x02, 0x0a, 0x06, 0xf1, 0x10, 0x01, 0x6a, 0x46, 0x00, 0x25, 0x92, 0xec, + 0x02, 0x1a, 0x81, 0xec, 0x02, 0x1a, 0x8b, 0xee, 0x8c, 0x1a, 0x31, 0xee, + 0x0b, 0x1a, 0x21, 0xee, 0x2e, 0x0a, 0xcd, 0xf7, 0xbb, 0xf9, 0xbd, 0xee, + 0xc0, 0x0a, 0x86, 0xed, 0x0e, 0x0a, 0x8b, 0xee, 0xac, 0x0a, 0xdf, 0xed, + 0xcf, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xcd, 0xf7, 0xaf, 0xf9, 0xbd, 0xee, + 0xc0, 0x0a, 0x86, 0xed, 0x0f, 0x0a, 0x8a, 0xee, 0x8d, 0x0a, 0x30, 0xee, + 0x0a, 0x0a, 0x20, 0xee, 0x2e, 0x0a, 0xcd, 0xf7, 0xa3, 0xf9, 0xbd, 0xee, + 0xc0, 0x0a, 0x86, 0xed, 0x10, 0x0a, 0xca, 0xee, 0xad, 0x0a, 0x9f, 0xed, + 0xc3, 0x0a, 0x20, 0xee, 0x80, 0x0a, 0xcd, 0xf7, 0x97, 0xf9, 0xbd, 0xee, + 0xc0, 0x0a, 0x02, 0xa9, 0x86, 0xed, 0x11, 0x0a, 0x1c, 0xa8, 0x91, 0xec, + 0x02, 0x0a, 0x80, 0xec, 0x02, 0x0a, 0x69, 0x46, 0x1e, 0xa8, 0x91, 0xec, + 0x02, 0x0a, 0x80, 0xec, 0x02, 0x0a, 0x0f, 0x98, 0x8d, 0xed, 0x19, 0xea, + 0x00, 0x23, 0x19, 0xaa, 0x5f, 0xa9, 0xfd, 0xf7, 0xa8, 0xfe, 0x0f, 0x98, + 0x00, 0x23, 0x19, 0xaa, 0x77, 0xa9, 0xfd, 0xf7, 0xa2, 0xfe, 0xb1, 0xee, + 0x4e, 0x0a, 0x0f, 0x98, 0x8d, 0xed, 0x19, 0x0a, 0x00, 0x23, 0x19, 0xaa, + 0x8f, 0xa9, 0xfd, 0xf7, 0x98, 0xfe, 0x0f, 0x98, 0x00, 0x23, 0x19, 0xaa, + 0xa7, 0xa9, 0xfd, 0xf7, 0x92, 0xfe, 0x1c, 0x21, 0x03, 0xa8, 0xd2, 0xf7, + 0xcd, 0xf9, 0x68, 0x46, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x80, 0xe8, + 0x0e, 0x00, 0x31, 0x6c, 0x06, 0x91, 0x70, 0x6c, 0x07, 0x90, 0xb0, 0x6b, + 0x01, 0x90, 0xf0, 0x6b, 0x02, 0x90, 0x6b, 0x46, 0x03, 0xaa, 0xe9, 0xb2, + 0x40, 0x46, 0xdb, 0xf7, 0x6b, 0xfb, 0x6d, 0x1c, 0x41, 0x2d, 0xf6, 0xd3, + 0x11, 0x98, 0x40, 0x1c, 0x11, 0x90, 0x11, 0x98, 0x79, 0x69, 0x88, 0x42, + 0xff, 0xf4, 0xbc, 0xad, 0x00, 0x2c, 0x5a, 0xd1, 0x07, 0xf1, 0x24, 0x01, + 0x08, 0x7a, 0x00, 0x28, 0x55, 0xd0, 0x01, 0x22, 0x8d, 0xf8, 0x08, 0x20, + 0x8d, 0xf8, 0x09, 0x20, 0x4f, 0xf4, 0x4b, 0x73, 0x03, 0x22, 0x8d, 0xf8, + 0x0a, 0x20, 0xad, 0xf8, 0x0c, 0x30, 0x68, 0x22, 0x49, 0x89, 0xad, 0xf8, + 0x0e, 0x10, 0x07, 0x92, 0x01, 0xa9, 0x40, 0x46, 0xcd, 0xf7, 0xde, 0xfb, + 0x04, 0x00, 0x3e, 0xd1, 0x78, 0x68, 0x18, 0xb9, 0x40, 0x46, 0xce, 0xf7, + 0x6a, 0xfb, 0x40, 0x08, 0x00, 0x25, 0x81, 0x46, 0x03, 0xe0, 0x84, 0xbb, + 0x0d, 0xb1, 0xc9, 0xf1, 0x00, 0x09, 0x00, 0x20, 0x00, 0x90, 0x00, 0x23, + 0x39, 0x78, 0x4a, 0x46, 0x40, 0x46, 0xd9, 0xf7, 0x80, 0xfa, 0x04, 0x00, + 0x20, 0xd1, 0x01, 0x98, 0xd0, 0x21, 0x48, 0x44, 0x69, 0x43, 0xa0, 0xf5, + 0xff, 0x70, 0x06, 0xeb, 0x01, 0x0a, 0x0a, 0x21, 0x05, 0x90, 0x0a, 0xf1, + 0x48, 0x02, 0x06, 0x91, 0x04, 0x92, 0x02, 0xa9, 0x40, 0x46, 0x00, 0xf0, + 0x31, 0xfb, 0x01, 0x98, 0xa0, 0xeb, 0x09, 0x00, 0xa0, 0xf5, 0xff, 0x70, + 0x0a, 0xf1, 0xb0, 0x01, 0x05, 0x90, 0x04, 0x91, 0x0a, 0x22, 0x06, 0x92, + 0x02, 0xa9, 0x40, 0x46, 0x00, 0xf0, 0x22, 0xfb, 0x6d, 0x1c, 0x01, 0x2d, + 0xcd, 0xd9, 0x00, 0x21, 0x40, 0x46, 0xd9, 0xf7, 0xf8, 0xfa, 0x38, 0x7a, + 0x8d, 0xf8, 0x00, 0x00, 0x6b, 0x46, 0x06, 0x22, 0x01, 0x21, 0x40, 0x46, + 0xec, 0xf7, 0x99, 0xf8, 0x05, 0x46, 0x78, 0x89, 0x20, 0xb9, 0x00, 0xf0, + 0x6a, 0xf8, 0xdb, 0xf7, 0x0d, 0xf8, 0x08, 0xe0, 0x00, 0xf0, 0x65, 0xf8, + 0xda, 0xf7, 0xe4, 0xff, 0x05, 0xb9, 0x05, 0x46, 0x40, 0x46, 0xec, 0xf7, + 0x2d, 0xf9, 0x05, 0xb9, 0x05, 0x46, 0x04, 0xb9, 0x2c, 0x46, 0x0d, 0xf5, + 0x40, 0x7d, 0x20, 0x46, 0xbd, 0xec, 0x10, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, + 0xb0, 0xee, 0x40, 0xaa, 0xf0, 0xee, 0x60, 0xaa, 0x70, 0x47, 0xf0, 0xee, + 0x6d, 0x1a, 0xb0, 0xee, 0x4c, 0x0a, 0xf0, 0xee, 0x6c, 0x0a, 0xc0, 0xf7, + 0xb8, 0xbe, 0xb0, 0xee, 0x4a, 0x1a, 0xf0, 0xee, 0x6a, 0x1a, 0xc0, 0xf7, + 0xeb, 0xbe, 0xb0, 0xee, 0x4a, 0x1a, 0xf0, 0xee, 0x6a, 0x1a, 0xc0, 0xf7, + 0xac, 0xbe, 0xb0, 0xee, 0x40, 0x9a, 0xf0, 0xee, 0x60, 0x9a, 0x90, 0xed, + 0x01, 0x0a, 0xc0, 0xf7, 0xf7, 0xbe, 0xb0, 0xee, 0x40, 0xaa, 0xf0, 0xee, + 0x60, 0xaa, 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, 0xb0, 0xee, + 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, 0xc0, 0xf7, 0xa9, 0xbe, 0xb0, 0xee, + 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, 0xc0, 0xf7, 0xc9, 0xbe, 0xb0, 0xee, + 0x40, 0x9a, 0xf0, 0xee, 0x60, 0x9a, 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, + 0x69, 0x1a, 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, 0xc0, 0xf7, + 0x82, 0xbe, 0x38, 0x48, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, + 0x90, 0xec, 0x02, 0x0a, 0xc0, 0xf7, 0x9f, 0xbe, 0xdb, 0x0f, 0xc9, 0x40, + 0x02, 0xa8, 0x90, 0xec, 0x02, 0x1a, 0xc0, 0xf7, 0xab, 0xbe, 0x00, 0x23, + 0x06, 0x22, 0x01, 0x21, 0x40, 0x46, 0x70, 0x47, 0x2d, 0xe9, 0xf0, 0x41, + 0xdf, 0xed, 0x2a, 0x0a, 0x2d, 0xed, 0x06, 0x8b, 0x80, 0x46, 0x14, 0x46, + 0x20, 0xee, 0x20, 0x0a, 0x0e, 0x46, 0xc0, 0xf7, 0xac, 0xfe, 0x00, 0xbf, + 0x34, 0xa0, 0x77, 0x1e, 0x00, 0xf0, 0x60, 0xf8, 0x90, 0xec, 0x02, 0x9a, + 0x00, 0x25, 0x2c, 0xe0, 0xa5, 0xeb, 0x57, 0x00, 0x00, 0xee, 0x10, 0x0a, + 0xb8, 0xee, 0xc0, 0x0a, 0xc0, 0xf7, 0xa2, 0xfe, 0xb0, 0xee, 0x40, 0x1a, + 0xf0, 0xee, 0x60, 0x1a, 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, + 0xc0, 0xf7, 0x6b, 0xfe, 0xf9, 0xf7, 0xfe, 0xfd, 0x08, 0xeb, 0x85, 0x00, + 0xb0, 0xee, 0x40, 0xaa, 0x90, 0xed, 0x00, 0x0a, 0xf0, 0xee, 0x60, 0xaa, + 0xb8, 0xee, 0xc0, 0x0a, 0xc0, 0xf7, 0x8a, 0xfe, 0xb0, 0xee, 0x4a, 0x1a, + 0xf0, 0xee, 0x6a, 0x1a, 0xc0, 0xf7, 0x57, 0xfe, 0x00, 0xf0, 0x2b, 0xf8, + 0xc0, 0xf7, 0x2d, 0xfe, 0x00, 0xf0, 0x22, 0xf8, 0x6d, 0x1c, 0xb5, 0x42, + 0xd0, 0xd3, 0x01, 0x20, 0x00, 0xfa, 0x04, 0xf4, 0x00, 0xee, 0x10, 0x4a, + 0xb8, 0xee, 0x40, 0x0a, 0xc0, 0xf7, 0x72, 0xfe, 0x00, 0xf0, 0x19, 0xf8, + 0xbd, 0xec, 0x06, 0x8b, 0xbd, 0xe8, 0xf0, 0x41, 0xc0, 0xf7, 0x50, 0xbe, + 0x00, 0x00, 0x80, 0xc7, 0xdb, 0x0f, 0xc9, 0xc0, 0xac, 0x94, 0x04, 0x02, + 0xbc, 0x8f, 0x00, 0x21, 0xc4, 0x8f, 0x00, 0x21, 0xcc, 0x8f, 0x00, 0x21, + 0xd4, 0x8f, 0x00, 0x21, 0xb0, 0xee, 0x40, 0x9a, 0xf0, 0xee, 0x60, 0x9a, + 0x70, 0x47, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0xb0, 0xee, + 0x49, 0x0a, 0xf0, 0xee, 0x69, 0x0a, 0x70, 0x47, 0xb0, 0xee, 0x40, 0x8a, + 0xf0, 0xee, 0x60, 0x8a, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0xee, 0x10, 0x1a, 0xc1, 0xf3, 0xc7, 0x52, + 0xda, 0xb1, 0x99, 0x2a, 0x0f, 0xda, 0xc8, 0x0f, 0x21, 0xf0, 0x00, 0x41, + 0x00, 0xee, 0x10, 0x1a, 0xb1, 0xf1, 0x7e, 0x5f, 0x7a, 0xf7, 0xa0, 0xab, + 0xf7, 0xee, 0x00, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0x00, 0x1d, 0xfa, 0xf7, + 0x99, 0xbb, 0xff, 0x2a, 0x01, 0xd1, 0x4a, 0x02, 0x05, 0xd1, 0x03, 0x4a, + 0xc9, 0x0f, 0x42, 0xea, 0xc1, 0x71, 0x00, 0xee, 0x10, 0x1a, 0x70, 0x47, + 0xdb, 0x0f, 0xc9, 0x3f, 0x2d, 0xe9, 0xf0, 0x47, 0x2d, 0xed, 0x04, 0x8b, + 0x0f, 0x46, 0x16, 0x46, 0x98, 0xb0, 0x80, 0x46, 0x01, 0x23, 0x00, 0x22, + 0x00, 0x21, 0xec, 0xf7, 0x26, 0xfa, 0x01, 0x46, 0x40, 0x46, 0xec, 0xf7, + 0xfb, 0xfa, 0x04, 0x46, 0x01, 0x46, 0x40, 0x46, 0xec, 0xf7, 0xed, 0xfa, + 0x40, 0x42, 0x02, 0x46, 0x00, 0x23, 0x01, 0x21, 0x40, 0x46, 0xec, 0xf7, + 0x16, 0xfa, 0x05, 0x46, 0x40, 0x46, 0xce, 0xf7, 0xf2, 0xf9, 0x00, 0xeb, + 0xd0, 0x70, 0x40, 0x10, 0xb9, 0x68, 0x00, 0x2d, 0x58, 0xbf, 0x0b, 0x46, + 0x03, 0xd5, 0x40, 0x42, 0x03, 0x46, 0x08, 0x46, 0x40, 0x42, 0xc2, 0x18, + 0x02, 0xeb, 0xd2, 0x72, 0xb5, 0xeb, 0x62, 0x0f, 0x04, 0xdb, 0x69, 0x1a, + 0x88, 0x42, 0x05, 0xdd, 0x08, 0x46, 0x03, 0xe0, 0x49, 0x19, 0x8b, 0x42, + 0xb8, 0xbf, 0x0b, 0x46, 0x9d, 0x42, 0xb8, 0xbf, 0x1d, 0x46, 0x85, 0x42, + 0xc8, 0xbf, 0x05, 0x46, 0x35, 0x60, 0x62, 0x1e, 0xf8, 0x68, 0x41, 0x19, + 0x04, 0xf0, 0x07, 0x00, 0x31, 0x60, 0x02, 0xf0, 0x07, 0x02, 0x70, 0x71, + 0x64, 0x1c, 0x32, 0x71, 0x04, 0xf0, 0x07, 0x04, 0xb4, 0x71, 0x00, 0x21, + 0x40, 0x46, 0x00, 0xf0, 0x2d, 0xf9, 0x00, 0x20, 0x00, 0x90, 0x00, 0x23, + 0x32, 0x68, 0x01, 0x21, 0x40, 0x46, 0xd9, 0xf7, 0xdc, 0xf8, 0x04, 0x00, + 0x69, 0xd1, 0x00, 0x21, 0x01, 0x22, 0xcd, 0xf8, 0x00, 0x80, 0x8d, 0xf8, + 0x04, 0x10, 0x8d, 0xf8, 0x05, 0x20, 0xad, 0xf8, 0x06, 0x10, 0x01, 0x21, + 0x78, 0x68, 0x06, 0x90, 0x02, 0x91, 0x32, 0x68, 0x88, 0x4d, 0x03, 0x92, + 0x39, 0x69, 0x07, 0x91, 0x03, 0x21, 0x3a, 0x68, 0x05, 0x92, 0x8d, 0xf8, + 0x20, 0x10, 0x00, 0x22, 0x8d, 0xf8, 0x21, 0x20, 0x91, 0x46, 0x30, 0x1d, + 0x0d, 0xf1, 0x21, 0x02, 0x10, 0xf8, 0x09, 0x10, 0x51, 0x70, 0x40, 0x46, + 0x4f, 0xf4, 0x80, 0x71, 0x00, 0xf0, 0xfe, 0xf8, 0x68, 0x46, 0xdb, 0xf7, + 0x7b, 0xff, 0x04, 0x00, 0x3d, 0xd1, 0x4f, 0xf4, 0x7a, 0x71, 0x40, 0x46, + 0xdc, 0xf7, 0x42, 0xf8, 0x00, 0x28, 0x09, 0xd1, 0x4f, 0xf4, 0x00, 0x71, + 0x40, 0x46, 0x00, 0xf0, 0xed, 0xf8, 0x09, 0xa9, 0x68, 0x46, 0xdc, 0xf7, + 0x3b, 0xf8, 0x00, 0x28, 0x40, 0xf0, 0x89, 0x80, 0x06, 0xeb, 0x89, 0x00, + 0x10, 0x99, 0x01, 0x62, 0x12, 0x99, 0xc1, 0x62, 0x9d, 0xed, 0x16, 0x0a, + 0xc0, 0xf7, 0x78, 0xfd, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, + 0x95, 0xec, 0x02, 0x0a, 0xc0, 0xf7, 0x43, 0xfd, 0xb0, 0xee, 0x40, 0x8a, + 0xf0, 0xee, 0x60, 0x8a, 0x9d, 0xed, 0x14, 0x0a, 0xc0, 0xf7, 0x68, 0xfd, + 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, 0xc0, 0xf7, 0x0f, 0xfd, + 0x06, 0xf1, 0x08, 0x00, 0x00, 0xeb, 0xc9, 0x01, 0x09, 0xf1, 0x01, 0x09, + 0xb9, 0xf1, 0x03, 0x0f, 0x81, 0xec, 0x02, 0x0a, 0xb1, 0xd3, 0x00, 0x21, + 0x40, 0x46, 0xd9, 0xf7, 0x0e, 0xf9, 0x00, 0x2c, 0x51, 0xd1, 0x06, 0xf1, + 0x08, 0x00, 0x00, 0xf0, 0x57, 0xf8, 0x31, 0x79, 0x70, 0x79, 0x00, 0xf0, + 0x5b, 0xf8, 0x06, 0xf1, 0x18, 0x00, 0xb0, 0xee, 0x40, 0x8a, 0x00, 0xf0, + 0x4d, 0xf8, 0xb1, 0x79, 0x70, 0x79, 0x00, 0xf0, 0x51, 0xf8, 0xf0, 0xee, + 0x40, 0x8a, 0xb0, 0xee, 0x48, 0x0a, 0x00, 0xf0, 0x73, 0xf8, 0x05, 0x46, + 0xb0, 0xee, 0x68, 0x0a, 0x00, 0xf0, 0x6e, 0xf8, 0x82, 0x46, 0x28, 0x46, + 0xb0, 0xee, 0x48, 0x0a, 0x00, 0xf0, 0x72, 0xf8, 0xb0, 0xee, 0x40, 0x9a, + 0x50, 0x46, 0xb0, 0xee, 0x68, 0x0a, 0x00, 0xf0, 0x6b, 0xf8, 0xd7, 0xed, + 0x05, 0x0a, 0xf4, 0xee, 0x49, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x5c, 0xbf, + 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x01, 0xd4, 0x55, 0x45, + 0x13, 0xd0, 0x18, 0xee, 0x90, 0x0a, 0xfa, 0xf7, 0x29, 0xfa, 0xcd, 0xe9, + 0x02, 0x01, 0x4b, 0xf2, 0x04, 0x24, 0x18, 0xee, 0x10, 0x0a, 0xfa, 0xf7, + 0x21, 0xfa, 0xcd, 0xe9, 0x00, 0x01, 0x00, 0xbf, 0x39, 0xa2, 0x07, 0x21, + 0x03, 0x20, 0xce, 0xf7, 0x94, 0xfa, 0x86, 0xf8, 0x38, 0x50, 0x29, 0x46, + 0x40, 0x46, 0x00, 0xf0, 0x61, 0xf8, 0x18, 0xb0, 0x20, 0x46, 0xbd, 0xec, + 0x04, 0x8b, 0xbd, 0xe8, 0xf0, 0x87, 0x4b, 0xf2, 0x05, 0x24, 0x9e, 0xe7, + 0x90, 0xec, 0x02, 0x1a, 0x06, 0xf1, 0x10, 0x00, 0x90, 0xec, 0x02, 0x0a, + 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, 0x0c, 0x1a, 0x04, 0xf0, 0x07, 0x04, + 0x2d, 0xed, 0x02, 0x8b, 0x04, 0x2c, 0xb0, 0xee, 0x41, 0x8a, 0xf0, 0xee, + 0x61, 0x8a, 0xa8, 0xbf, 0x08, 0x3c, 0xbe, 0xf7, 0x7e, 0xff, 0xb0, 0xee, + 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, + 0x68, 0x0a, 0xc0, 0xf7, 0xa8, 0xfc, 0xbe, 0xf7, 0x7b, 0xff, 0x00, 0xee, + 0x90, 0x4a, 0xf8, 0xee, 0xe0, 0x0a, 0x9f, 0xed, 0x16, 0x1a, 0x60, 0xee, + 0x81, 0x0a, 0xbd, 0xec, 0x02, 0x8b, 0x80, 0xee, 0x20, 0x0a, 0x10, 0xbd, + 0x80, 0xb5, 0xcc, 0xf7, 0x6f, 0xfe, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, + 0x10, 0x0a, 0x00, 0xf0, 0x07, 0x00, 0x02, 0xbd, 0xc0, 0xb2, 0x00, 0xee, + 0x90, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x80, 0xb5, 0x30, 0xee, 0x60, 0x0a, + 0xdf, 0xed, 0x08, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xc0, 0xf7, 0xa7, 0xfc, + 0xf9, 0xf7, 0x14, 0xfc, 0xbe, 0xf7, 0x52, 0xff, 0xdf, 0xed, 0x03, 0x0a, + 0x80, 0xee, 0x20, 0x0a, 0xb0, 0xee, 0xc0, 0x0a, 0x01, 0xbd, 0x00, 0x00, + 0xdb, 0x0f, 0x49, 0x3f, 0x80, 0x48, 0x00, 0x21, 0xec, 0xf7, 0xa4, 0xb9, + 0x0a, 0x46, 0x01, 0x21, 0x81, 0x40, 0x06, 0x20, 0xef, 0xf7, 0x4a, 0xbf, + 0x6e, 0x31, 0x66, 0x20, 0x3d, 0x25, 0x66, 0x2c, 0x20, 0x6e, 0x32, 0x66, + 0x20, 0x3d, 0x25, 0x66, 0x0a, 0x00, 0x00, 0x00, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, + 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0x38, 0xb5, 0x0c, 0x46, 0x14, 0x49, 0x51, 0xf8, 0x20, 0x50, 0x01, 0x23, + 0x20, 0x00, 0x08, 0xbf, 0x00, 0x23, 0x30, 0x35, 0x4f, 0xf4, 0x80, 0x62, + 0x0a, 0x21, 0x28, 0x46, 0xff, 0xf7, 0xe2, 0xff, 0x23, 0x46, 0x28, 0x46, + 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x40, 0xf2, 0xfe, 0x32, 0x01, 0x21, + 0xd8, 0xe7, 0x09, 0x49, 0x51, 0xf8, 0x20, 0x00, 0x30, 0x30, 0x00, 0x68, + 0xc0, 0xf3, 0x48, 0x00, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x4c, 0x54, 0xf8, + 0x20, 0x00, 0xbd, 0xe8, 0x10, 0x40, 0x0b, 0x46, 0x01, 0x22, 0x00, 0x21, + 0x30, 0x30, 0xc5, 0xe7, 0xc0, 0x98, 0x04, 0x02, 0x10, 0xee, 0x10, 0x0a, + 0x09, 0x49, 0xb5, 0xee, 0x40, 0x0a, 0xd1, 0xf8, 0x3c, 0xc0, 0xbc, 0xeb, + 0x40, 0x0f, 0xd1, 0xec, 0x0d, 0x0a, 0xc0, 0xf0, 0x0b, 0x80, 0xf1, 0xee, + 0x10, 0xfa, 0x4f, 0xf0, 0x00, 0x01, 0x40, 0xf0, 0xb7, 0x81, 0xb0, 0xee, + 0x60, 0x0a, 0x70, 0x47, 0x94, 0x90, 0x04, 0x02, 0x4f, 0xf0, 0x80, 0x7c, + 0x1c, 0xeb, 0x40, 0x0f, 0x08, 0xd2, 0x00, 0x42, 0x54, 0xbf, 0xb0, 0xee, + 0x42, 0x0a, 0x31, 0xee, 0x41, 0x0a, 0xaf, 0xf3, 0x00, 0x80, 0x70, 0x47, + 0x04, 0xd8, 0xc0, 0x42, 0x02, 0xd3, 0x00, 0x20, 0x00, 0xee, 0x10, 0x0a, + 0x70, 0x47, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, 0x06, 0x8b, + 0x0f, 0x46, 0xc0, 0xb0, 0x05, 0x46, 0x97, 0xf8, 0x00, 0xa0, 0xfa, 0x88, + 0xb9, 0x88, 0xb8, 0x78, 0xec, 0xf7, 0xe6, 0xfb, 0x00, 0x24, 0xd7, 0xf8, + 0x08, 0x80, 0xba, 0xf1, 0x01, 0x0f, 0xa1, 0x46, 0xb0, 0xee, 0x40, 0xaa, + 0x18, 0xd1, 0x01, 0x22, 0x8d, 0xf8, 0x2c, 0x20, 0x8d, 0xf8, 0x2d, 0x20, + 0x8d, 0xf8, 0x2e, 0x20, 0x03, 0x21, 0x03, 0x22, 0x8d, 0xf8, 0x30, 0x20, + 0x8d, 0xf8, 0x31, 0x20, 0x8d, 0xf8, 0x32, 0x20, 0x0d, 0x91, 0x01, 0x22, + 0x8d, 0xf8, 0x2f, 0x40, 0x8d, 0xf8, 0x28, 0x40, 0x8d, 0xf8, 0x29, 0x20, + 0x02, 0x21, 0x13, 0xe0, 0xba, 0xf1, 0x02, 0x0f, 0x13, 0xd1, 0x02, 0x21, + 0x0d, 0x91, 0x0b, 0xa8, 0x03, 0x21, 0x8d, 0xf8, 0x32, 0x10, 0x01, 0x22, + 0x8d, 0xf8, 0x2c, 0x20, 0x44, 0x70, 0x82, 0x70, 0xc4, 0x70, 0x8d, 0xf8, + 0x30, 0x20, 0x8d, 0xf8, 0x28, 0x40, 0x01, 0x21, 0x8d, 0xf8, 0x2a, 0x10, + 0x01, 0xe0, 0x40, 0xf2, 0x05, 0x74, 0x79, 0x69, 0x0d, 0x98, 0xb1, 0xfb, + 0xf0, 0xf0, 0x13, 0x90, 0x02, 0x46, 0x0d, 0x98, 0x42, 0x43, 0x8a, 0x42, + 0x02, 0xd2, 0x13, 0x99, 0x49, 0x1c, 0x13, 0x91, 0x00, 0x21, 0x0e, 0x95, + 0x2f, 0xe1, 0x00, 0x2c, 0x40, 0xf0, 0x31, 0x81, 0x0d, 0x9a, 0x00, 0x20, + 0x0f, 0xac, 0x0a, 0xad, 0x15, 0xf8, 0x00, 0xc0, 0xfb, 0x68, 0x3e, 0x69, + 0x02, 0xfb, 0x01, 0xcc, 0x06, 0xfb, 0x0c, 0x33, 0x44, 0xf8, 0x20, 0x30, + 0x40, 0x1c, 0x04, 0x28, 0xf2, 0xd3, 0x14, 0x91, 0x0d, 0x92, 0x79, 0x78, + 0x01, 0x29, 0x11, 0xd1, 0x0d, 0x98, 0x00, 0x21, 0x00, 0x22, 0x03, 0xe0, + 0x54, 0xf8, 0x22, 0x30, 0x59, 0x18, 0x52, 0x1c, 0x82, 0x42, 0xf9, 0xd3, + 0x0d, 0x90, 0x91, 0xfb, 0xf0, 0xf1, 0x0e, 0x98, 0xec, 0xf7, 0x8c, 0xf8, + 0x05, 0x46, 0x00, 0xe0, 0x00, 0x25, 0xb9, 0x88, 0x38, 0x7e, 0xd7, 0xed, + 0x08, 0x0a, 0x97, 0xed, 0x07, 0x0a, 0x0a, 0x22, 0xec, 0xf7, 0xf0, 0xfb, + 0xc0, 0xb2, 0x08, 0x90, 0x16, 0xa9, 0x09, 0x91, 0x00, 0x20, 0x03, 0x22, + 0x07, 0x90, 0x06, 0x92, 0x00, 0x22, 0xf9, 0x88, 0x05, 0x91, 0x04, 0x90, + 0x01, 0x21, 0x00, 0x90, 0x00, 0x23, 0x01, 0x91, 0x03, 0x92, 0x02, 0x93, + 0xb7, 0xee, 0x00, 0x1a, 0x0e, 0x98, 0xdf, 0xed, 0x78, 0x0a, 0x9f, 0xed, + 0x77, 0x0a, 0x51, 0x46, 0xec, 0xf7, 0xe6, 0xf8, 0x1e, 0xa8, 0x02, 0x90, + 0x01, 0x95, 0x00, 0x25, 0x39, 0x7e, 0x0e, 0x98, 0x00, 0x91, 0xbb, 0x88, + 0xba, 0x78, 0x79, 0x78, 0xeb, 0xf7, 0xae, 0xff, 0x0e, 0x9e, 0x0b, 0xa8, + 0x18, 0x22, 0x16, 0xa9, 0x6a, 0x43, 0x40, 0x5d, 0x0a, 0x44, 0x02, 0xf1, + 0x40, 0x03, 0x07, 0x93, 0x00, 0x21, 0x06, 0x91, 0x05, 0x91, 0x04, 0x91, + 0x01, 0x23, 0x03, 0x93, 0x02, 0x91, 0x01, 0x90, 0x00, 0x90, 0x01, 0x22, + 0x54, 0xf8, 0x25, 0x30, 0x1e, 0xa9, 0x30, 0x46, 0xeb, 0xf7, 0xad, 0xff, + 0x6d, 0x1c, 0x04, 0x2d, 0xe3, 0xd3, 0x16, 0xa9, 0x30, 0x46, 0xc0, 0x46, + 0xc0, 0x46, 0x00, 0x25, 0x00, 0x23, 0x16, 0xaa, 0x13, 0x21, 0x30, 0x46, + 0xec, 0xf7, 0x69, 0xfd, 0x04, 0x00, 0x0b, 0xd1, 0x42, 0xf2, 0x10, 0x72, + 0x13, 0x21, 0x30, 0x46, 0xec, 0xf7, 0xb6, 0xff, 0x28, 0xb1, 0x6d, 0x1c, + 0x04, 0x2d, 0xed, 0xd3, 0x43, 0xf2, 0x02, 0x04, 0x98, 0xe0, 0x0e, 0x96, + 0x13, 0x21, 0x30, 0x46, 0xed, 0xf7, 0x45, 0xf8, 0x05, 0x46, 0x00, 0x22, + 0x29, 0x46, 0x50, 0x46, 0xec, 0xf7, 0x17, 0xf9, 0x10, 0xb1, 0x43, 0xf2, + 0x03, 0x14, 0x8a, 0xe0, 0x29, 0x46, 0x50, 0x46, 0xec, 0xf7, 0x31, 0xf9, + 0xf9, 0x88, 0x88, 0x42, 0x18, 0xbf, 0x43, 0xf2, 0x01, 0x24, 0xf4, 0xd1, + 0x0e, 0x98, 0x13, 0x21, 0xed, 0xf7, 0x2d, 0xf8, 0x0e, 0x9e, 0x83, 0x46, + 0x00, 0x25, 0x0b, 0xa8, 0x41, 0x5d, 0x01, 0x29, 0x71, 0xd1, 0x78, 0x69, + 0x81, 0x45, 0x6e, 0xd2, 0x02, 0xa9, 0x04, 0xaa, 0x0c, 0xa8, 0x01, 0x91, + 0x00, 0x92, 0xea, 0xb2, 0x43, 0x5d, 0x59, 0x46, 0x50, 0x46, 0xec, 0xf7, + 0x2b, 0xf9, 0xb0, 0xee, 0x4a, 0x0a, 0xc0, 0xf7, 0xff, 0xfa, 0xdd, 0xe9, + 0x02, 0x01, 0xb0, 0xee, 0x40, 0x9a, 0xf0, 0xee, 0x60, 0x9a, 0xf2, 0xf7, + 0x67, 0xfb, 0x00, 0xee, 0x10, 0x0a, 0xc0, 0xf7, 0xf3, 0xfa, 0x35, 0x4a, + 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x92, 0xec, 0x02, 0x0a, + 0xc0, 0xf7, 0xbd, 0xfa, 0xdd, 0xe9, 0x04, 0x01, 0xb0, 0xee, 0x40, 0x8a, + 0xf0, 0xee, 0x60, 0x8a, 0xf2, 0xf7, 0x52, 0xfb, 0x00, 0xee, 0x10, 0x0a, + 0xc0, 0xf7, 0xde, 0xfa, 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, + 0xc0, 0xf7, 0x85, 0xfa, 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, + 0xc0, 0xf7, 0xa5, 0xfa, 0x20, 0xee, 0x00, 0x0a, 0x00, 0xee, 0xa0, 0x0a, + 0xbf, 0xf7, 0x5a, 0xfc, 0xfb, 0xee, 0x04, 0x0a, 0x20, 0xee, 0x20, 0x0a, + 0xcc, 0xf7, 0x72, 0xfc, 0x9f, 0xed, 0x1c, 0x1a, 0xb4, 0xee, 0x41, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0xa8, 0xbf, 0x9f, 0xed, 0x1a, 0x0a, 0x08, 0xda, + 0xb5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x54, 0xbf, 0xbc, 0xee, + 0xc0, 0x0a, 0x9f, 0xed, 0x13, 0x0a, 0x4f, 0xea, 0x99, 0x00, 0x4f, 0xea, + 0xc9, 0x01, 0x01, 0xf0, 0x18, 0x01, 0x58, 0xf8, 0x20, 0x20, 0xff, 0x23, + 0x8b, 0x40, 0x9a, 0x43, 0x10, 0xee, 0x10, 0x3a, 0x03, 0xfa, 0x01, 0xf1, + 0x11, 0x43, 0x48, 0xf8, 0x20, 0x10, 0x09, 0xf1, 0x01, 0x09, 0x6d, 0x1c, + 0x04, 0x2d, 0x86, 0xd3, 0x0e, 0x96, 0x14, 0x99, 0x49, 0x1c, 0x13, 0x98, + 0x81, 0x42, 0xff, 0xf4, 0xcc, 0xae, 0x40, 0xb0, 0x20, 0x46, 0xbd, 0xec, + 0x06, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x7f, 0x43, 0xff, 0x00, 0x00, 0x00, 0x0c, 0x41, 0x00, 0x21, + 0x00, 0x42, 0x48, 0xbf, 0xb1, 0xee, 0x41, 0x1a, 0x00, 0xee, 0x21, 0x1a, + 0xbd, 0xee, 0xc1, 0x1a, 0x11, 0xee, 0x10, 0xca, 0xb8, 0xee, 0xc1, 0x1a, + 0x01, 0xee, 0x62, 0x0a, 0x01, 0xee, 0x43, 0x0a, 0xb0, 0xee, 0xc0, 0x1a, + 0xb4, 0xee, 0x63, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x61, 0x44, 0x01, 0xf1, + 0x7f, 0x01, 0x13, 0xd4, 0x20, 0xee, 0x00, 0x1a, 0x61, 0xee, 0x04, 0x2a, + 0xb0, 0xee, 0x62, 0x3a, 0x01, 0xee, 0x24, 0x5a, 0x40, 0xee, 0x05, 0x2a, + 0x72, 0xee, 0xa5, 0x2a, 0x00, 0xee, 0x45, 0x3a, 0x33, 0xee, 0x25, 0x3a, + 0xc2, 0xee, 0x83, 0x2a, 0x60, 0xee, 0xa2, 0x0a, 0x19, 0xb3, 0xff, 0x29, + 0x4f, 0xea, 0xc1, 0x5c, 0x00, 0xee, 0x10, 0xca, 0x0f, 0xd2, 0x20, 0xee, + 0x20, 0x0a, 0xb5, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x10, 0xee, + 0x10, 0x0a, 0x4f, 0xf0, 0x80, 0x7c, 0x18, 0xbf, 0x1c, 0xeb, 0x40, 0x0f, + 0xaf, 0xf3, 0x00, 0x80, 0x70, 0x47, 0x01, 0x29, 0x0b, 0xdb, 0x7f, 0x39, + 0xff, 0x29, 0x4f, 0xea, 0xc1, 0x5c, 0x36, 0xbf, 0x00, 0xee, 0x10, 0xca, + 0xb0, 0xee, 0x42, 0x0a, 0x60, 0xee, 0x86, 0x0a, 0xe1, 0xe7, 0x7e, 0x31, + 0x01, 0x29, 0x4f, 0xea, 0xc1, 0x5c, 0xaa, 0xbf, 0x00, 0xee, 0x10, 0xca, + 0x30, 0xee, 0xe0, 0x0a, 0x60, 0xee, 0xa6, 0x0a, 0xd5, 0xe7, 0x10, 0xee, + 0x90, 0xca, 0x1c, 0xeb, 0x0c, 0x0f, 0x00, 0x42, 0x54, 0xbf, 0xb0, 0xee, + 0x42, 0x0a, 0x31, 0xee, 0x41, 0x0a, 0x28, 0xbf, 0xb1, 0xee, 0x40, 0x0a, + 0xaf, 0xf3, 0x00, 0x80, 0x70, 0x47, 0x00, 0x00, 0x38, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x00, 0xf0, 0xdb, 0xfc, 0x00, 0xf0, 0x99, 0xfc, 0x05, 0xf5, + 0xbc, 0x70, 0x00, 0x21, 0x41, 0x70, 0x00, 0x22, 0x40, 0x21, 0x82, 0x71, + 0xc1, 0x71, 0x02, 0x72, 0x02, 0x70, 0x42, 0x72, 0x82, 0x72, 0x31, 0xbd, + 0x80, 0xb5, 0x00, 0xf5, 0xbe, 0x70, 0x2d, 0xed, 0x02, 0x8b, 0x00, 0xee, + 0x10, 0x1a, 0x01, 0x78, 0x40, 0x78, 0x01, 0xee, 0x10, 0x1a, 0xb8, 0xee, + 0x40, 0x0a, 0xb8, 0xee, 0x41, 0x1a, 0x80, 0xee, 0x01, 0x8a, 0x01, 0xee, + 0x10, 0x2a, 0x01, 0xee, 0x90, 0x0a, 0xb8, 0xee, 0x41, 0x1a, 0xf8, 0xee, + 0x61, 0x1a, 0x71, 0xee, 0x61, 0x1a, 0xfb, 0xee, 0x04, 0x0a, 0xc1, 0xee, + 0xa0, 0x0a, 0xb2, 0xee, 0x04, 0x0a, 0xd6, 0xf7, 0x03, 0xff, 0x28, 0xee, + 0x00, 0x0a, 0xbd, 0xec, 0x02, 0x8b, 0x01, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x38, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x03, 0x2a, 0x08, 0x9d, 0x0c, 0x46, + 0x1c, 0xd1, 0x07, 0x99, 0x1a, 0x46, 0x08, 0xee, 0x10, 0x2a, 0x01, 0x29, + 0xbb, 0xee, 0x45, 0x8a, 0x05, 0xd1, 0x94, 0xf8, 0x78, 0x11, 0x11, 0xb1, + 0x04, 0xf1, 0xe0, 0x01, 0x01, 0xe0, 0x04, 0xf1, 0x70, 0x01, 0x06, 0x9a, + 0x69, 0x60, 0x8c, 0x30, 0x28, 0x60, 0x19, 0x46, 0x20, 0x46, 0xff, 0xf7, + 0xb7, 0xff, 0xf7, 0xee, 0x00, 0x0a, 0xc0, 0xee, 0x88, 0x0a, 0x0e, 0xe0, + 0x28, 0x60, 0x02, 0x2a, 0x6c, 0x60, 0x08, 0xbf, 0xbf, 0xee, 0x00, 0x0a, + 0x05, 0xd0, 0xb7, 0xee, 0x00, 0x0a, 0x12, 0xb9, 0xdf, 0xed, 0x9e, 0x0a, + 0x01, 0xe0, 0xf0, 0xee, 0x40, 0x0a, 0xc5, 0xed, 0x03, 0x0a, 0x85, 0xed, + 0x02, 0x0a, 0xbd, 0xec, 0x02, 0x8b, 0x31, 0xbd, 0x78, 0xb5, 0x87, 0xb0, + 0x00, 0xf0, 0x1a, 0xf8, 0xff, 0xf7, 0xc0, 0xff, 0x04, 0x99, 0x03, 0x98, + 0x9d, 0xed, 0x06, 0x0a, 0x00, 0xf0, 0x8e, 0xfe, 0x08, 0xb0, 0x70, 0xbd, + 0x78, 0xb5, 0x87, 0xb0, 0x00, 0xf0, 0x0c, 0xf8, 0xdb, 0xb2, 0xd2, 0xb2, + 0xff, 0xf7, 0xb0, 0xff, 0x04, 0x99, 0x03, 0x98, 0x9d, 0xed, 0x06, 0x0a, + 0x00, 0xf0, 0xf0, 0xfd, 0x08, 0xb0, 0x70, 0xbd, 0x03, 0xac, 0x01, 0x25, + 0x00, 0x26, 0x02, 0x94, 0x01, 0x95, 0x00, 0x96, 0x70, 0x47, 0x70, 0xb5, + 0x2d, 0xed, 0x02, 0x8b, 0x88, 0xb0, 0x00, 0xf0, 0x25, 0xf8, 0xd2, 0xb2, + 0x00, 0xf0, 0x29, 0xf8, 0x04, 0x99, 0x03, 0x98, 0x00, 0xf0, 0x8d, 0xfd, + 0x00, 0xf0, 0xba, 0xfb, 0x9d, 0xed, 0x05, 0x0a, 0xc0, 0xf7, 0x66, 0xf9, + 0x00, 0xf0, 0xb9, 0xfb, 0x08, 0xb0, 0xbd, 0xec, 0x02, 0x8b, 0x70, 0xbd, + 0x78, 0xb5, 0x87, 0xb0, 0x00, 0xf0, 0x0e, 0xf8, 0x00, 0xf0, 0x13, 0xf8, + 0x04, 0x99, 0x03, 0x98, 0x00, 0xf0, 0xf2, 0xfd, 0xdd, 0xed, 0x05, 0x0a, + 0x60, 0xee, 0xa0, 0x0a, 0x20, 0xee, 0x80, 0x0a, 0x08, 0xb0, 0x70, 0xbd, + 0x01, 0xf2, 0x7f, 0x13, 0x03, 0xac, 0x00, 0x25, 0x02, 0x94, 0x01, 0x95, + 0x70, 0x47, 0x5e, 0x78, 0x00, 0x96, 0x1b, 0x78, 0x6a, 0xe7, 0x00, 0x00, + 0x2d, 0xe9, 0xf0, 0x41, 0x2d, 0xed, 0x08, 0x8b, 0x05, 0x46, 0x10, 0x9c, + 0x0e, 0x46, 0x17, 0x46, 0x98, 0x46, 0xff, 0xf7, 0xa7, 0xff, 0xdf, 0xf8, + 0x70, 0xc6, 0x9c, 0xec, 0x02, 0x1a, 0xc0, 0xf7, 0x04, 0xf9, 0x00, 0xf0, + 0x66, 0xfb, 0x43, 0x46, 0x3a, 0x46, 0x31, 0x46, 0x28, 0x46, 0xff, 0xf7, + 0x8b, 0xff, 0x00, 0x2c, 0x77, 0xd0, 0x05, 0xf5, 0x8c, 0x70, 0xf6, 0xee, + 0x00, 0x0a, 0x20, 0xee, 0x20, 0xba, 0x90, 0xed, 0x02, 0x8a, 0xd0, 0xed, + 0x01, 0x8a, 0xd0, 0xed, 0x00, 0xaa, 0x96, 0xf8, 0x79, 0x41, 0xb0, 0xee, + 0x4b, 0x0a, 0xbe, 0xf7, 0xa5, 0xfb, 0x2a, 0xee, 0x80, 0xaa, 0xb0, 0xee, + 0x4b, 0x0a, 0xbe, 0xf7, 0x9f, 0xfb, 0xf4, 0xee, 0x4a, 0x8a, 0xf1, 0xee, + 0x10, 0xfa, 0x4c, 0xbf, 0xf0, 0xee, 0x4a, 0x0a, 0xf0, 0xee, 0x68, 0x0a, + 0xf4, 0xee, 0x48, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x04, 0xf0, 0x03, 0x04, + 0x2a, 0xee, 0x80, 0x0a, 0x07, 0xd5, 0xf4, 0xee, 0x4a, 0x8a, 0xf1, 0xee, + 0x10, 0xfa, 0x04, 0xd4, 0xb0, 0xee, 0x68, 0xaa, 0x01, 0xe0, 0xb0, 0xee, + 0x48, 0xaa, 0xf4, 0xee, 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x4c, 0xbf, + 0xf0, 0xee, 0x40, 0x0a, 0xf0, 0xee, 0x68, 0x0a, 0xf4, 0xee, 0x48, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x07, 0xd5, 0xf4, 0xee, 0x40, 0x8a, 0xf1, 0xee, + 0x10, 0xfa, 0x04, 0xd4, 0xb0, 0xee, 0x68, 0x0a, 0x01, 0xe0, 0xb0, 0xee, + 0x48, 0x0a, 0x0f, 0xf2, 0x38, 0x70, 0x00, 0xeb, 0x84, 0x01, 0xd1, 0xed, + 0x00, 0x0a, 0x20, 0xee, 0x80, 0x0a, 0xc0, 0xf7, 0xd1, 0xf8, 0xdf, 0xf8, + 0xa8, 0x05, 0x00, 0xf0, 0xfd, 0xfa, 0xc0, 0xf7, 0x9e, 0xf8, 0x0f, 0xf2, + 0x08, 0x70, 0x00, 0xeb, 0x84, 0x01, 0xb0, 0xee, 0x40, 0x8a, 0x91, 0xed, + 0x00, 0x0a, 0xf0, 0xee, 0x60, 0x8a, 0x20, 0xee, 0x0a, 0x0a, 0xc0, 0xf7, + 0xbd, 0xf8, 0x00, 0xf0, 0x05, 0xfb, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, + 0x60, 0x1a, 0xb0, 0xee, 0x49, 0x0a, 0xf0, 0xee, 0x69, 0x0a, 0xc0, 0xf7, + 0x5e, 0xf8, 0x00, 0xf0, 0xe6, 0xfa, 0xdf, 0xed, 0x22, 0x1a, 0xb4, 0xee, + 0x61, 0x9a, 0xf1, 0xee, 0x10, 0xfa, 0x9f, 0xed, 0x20, 0x8a, 0xdf, 0xed, + 0x20, 0x0a, 0x9f, 0xed, 0x20, 0x1a, 0x0b, 0xda, 0xbe, 0xee, 0x00, 0x0a, + 0xb4, 0xee, 0x40, 0x9a, 0xf1, 0xee, 0x10, 0xfa, 0x4c, 0xbf, 0xb0, 0xee, + 0x41, 0x0a, 0x29, 0xee, 0x20, 0x0a, 0x01, 0xe0, 0xb0, 0xee, 0x48, 0x0a, + 0xf4, 0xee, 0x61, 0x9a, 0xf1, 0xee, 0x10, 0xfa, 0x0a, 0xda, 0xfe, 0xee, + 0x00, 0x1a, 0xf4, 0xee, 0x61, 0x9a, 0xf1, 0xee, 0x10, 0xfa, 0x4c, 0xbf, + 0xb0, 0xee, 0x41, 0x8a, 0x29, 0xee, 0xa0, 0x8a, 0x0f, 0x9d, 0x0e, 0x9c, + 0xcc, 0xf7, 0x2c, 0xfa, 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, + 0x20, 0x80, 0xb0, 0xee, 0x48, 0x0a, 0xcc, 0xf7, 0x23, 0xfa, 0xbd, 0xee, + 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x28, 0x80, 0x00, 0x20, 0xbd, 0xec, + 0x08, 0x8b, 0xbd, 0xe8, 0xf0, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, 0x00, 0x48, + 0x00, 0x00, 0x80, 0xc7, 0x2d, 0xe9, 0xf5, 0x4f, 0x81, 0xb0, 0x00, 0x27, + 0x2d, 0xed, 0x10, 0x8b, 0x94, 0xb0, 0x88, 0x46, 0x30, 0x9c, 0x03, 0x2a, + 0x9a, 0x46, 0x08, 0xf5, 0xbc, 0x75, 0x00, 0xf5, 0x94, 0x79, 0x1f, 0xd1, + 0xa8, 0x79, 0xc0, 0xb1, 0x22, 0x46, 0x51, 0x46, 0x40, 0x46, 0xff, 0xf7, + 0x49, 0xfe, 0xd9, 0xed, 0x06, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x5e, 0xbf, 0x99, 0xed, 0x07, 0x1a, 0xb4, 0xee, 0x40, 0x1a, + 0xf1, 0xee, 0x10, 0xfa, 0x03, 0xd5, 0x25, 0x98, 0x41, 0x46, 0x00, 0xf0, + 0xc9, 0xfa, 0xa8, 0x79, 0x20, 0xb9, 0x01, 0x21, 0xa9, 0x71, 0x85, 0xf8, + 0x04, 0xa0, 0x6c, 0x71, 0x31, 0x9e, 0x06, 0xf1, 0x08, 0x00, 0x06, 0xf1, + 0x08, 0x01, 0x90, 0xec, 0x02, 0x0a, 0x91, 0xec, 0x02, 0x1a, 0x90, 0xec, + 0x02, 0x2a, 0x91, 0xec, 0x02, 0x3a, 0x20, 0xee, 0x01, 0x0a, 0x02, 0xee, + 0xa3, 0x0a, 0xd9, 0xed, 0x00, 0x0a, 0x00, 0xf0, 0x38, 0xfa, 0x02, 0xdb, + 0xaf, 0x70, 0xef, 0x70, 0x4b, 0xe0, 0x96, 0xed, 0x08, 0x0a, 0xd9, 0xed, + 0x01, 0x0a, 0x00, 0xf0, 0x2e, 0xfa, 0x03, 0xdb, 0xaf, 0x70, 0x01, 0x21, + 0xe9, 0x70, 0x40, 0xe0, 0xc0, 0xf7, 0x0c, 0xf8, 0x06, 0xf1, 0x18, 0x00, + 0x00, 0xf0, 0x38, 0xfa, 0xbf, 0xf7, 0xec, 0xff, 0x06, 0xf1, 0x18, 0x00, + 0x00, 0xf0, 0x52, 0xfa, 0x90, 0xec, 0x02, 0x0a, 0xbe, 0xf7, 0xa6, 0xfa, + 0xd6, 0xed, 0x00, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x20, 0xee, 0x80, 0x0a, + 0x9f, 0xed, 0x45, 0x1a, 0x80, 0xee, 0x01, 0x1a, 0xb0, 0xee, 0xc1, 0x0a, + 0xbc, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0xba, 0xb0, 0xee, 0x48, 0x0a, + 0xf0, 0xee, 0x68, 0x0a, 0xbe, 0xf7, 0x9a, 0xfa, 0xd9, 0xed, 0x02, 0x0a, + 0x00, 0xf0, 0xff, 0xf9, 0x0a, 0xd5, 0xd9, 0xf8, 0x0c, 0x00, 0x83, 0x45, + 0x02, 0xd3, 0xaf, 0x70, 0x02, 0x20, 0x0d, 0xe0, 0x01, 0x21, 0xa9, 0x70, + 0x03, 0x20, 0x09, 0xe0, 0xd9, 0xf8, 0x10, 0x00, 0x83, 0x45, 0x02, 0xd3, + 0xaf, 0x70, 0x04, 0x20, 0x02, 0xe0, 0x01, 0x21, 0xa9, 0x70, 0x05, 0x20, + 0xe8, 0x70, 0x03, 0xa9, 0x02, 0x91, 0x9d, 0xf8, 0x98, 0x20, 0x25, 0x98, + 0x01, 0x97, 0x00, 0x94, 0x53, 0x46, 0x41, 0x46, 0xff, 0xf7, 0xea, 0xfd, + 0x9d, 0xf8, 0x98, 0x00, 0x03, 0x28, 0x16, 0xd1, 0x32, 0x98, 0x00, 0xf1, + 0x10, 0x02, 0x08, 0xa9, 0x92, 0xec, 0x02, 0x0a, 0x81, 0xec, 0x02, 0x0a, + 0x00, 0xf1, 0x18, 0x02, 0x0a, 0xa9, 0x92, 0xec, 0x02, 0x0a, 0x81, 0xec, + 0x02, 0x0a, 0x41, 0x68, 0x0c, 0x91, 0x08, 0xf1, 0x70, 0x02, 0xc1, 0x68, + 0x0d, 0x91, 0x00, 0x92, 0x0f, 0xe0, 0x06, 0xf1, 0x08, 0x01, 0x08, 0xa8, + 0x00, 0xf0, 0xb8, 0xf9, 0x06, 0xf1, 0x10, 0x01, 0x0a, 0xa8, 0x00, 0xf0, + 0xb3, 0xf9, 0x32, 0x68, 0x0c, 0x92, 0x71, 0x68, 0x0d, 0x91, 0xcd, 0xf8, + 0x00, 0x80, 0xa8, 0x78, 0x50, 0xbb, 0x04, 0x99, 0x03, 0x98, 0x00, 0xf0, + 0xb2, 0xfb, 0x08, 0xa8, 0x08, 0xa9, 0x00, 0xf0, 0xbd, 0xf9, 0x91, 0xec, + 0x02, 0x2a, 0x9d, 0xed, 0x05, 0x5a, 0xd9, 0xed, 0x08, 0x5a, 0x90, 0xec, + 0x02, 0x3a, 0x91, 0xec, 0x02, 0x4a, 0x25, 0xee, 0x05, 0x5a, 0x20, 0xee, + 0x02, 0x0a, 0x65, 0xee, 0x25, 0x5a, 0x03, 0xee, 0xa4, 0x0a, 0x61, 0xee, + 0x01, 0x0a, 0x25, 0xee, 0x80, 0x0a, 0x41, 0xee, 0xa1, 0x0a, 0x20, 0xee, + 0x20, 0x0a, 0xbc, 0x49, 0x8d, 0xed, 0x0e, 0x0a, 0x00, 0xf0, 0x84, 0xf9, + 0x03, 0xe0, 0x00, 0xbf, 0xdb, 0x0f, 0xc9, 0x40, 0x0e, 0x97, 0xbd, 0xf9, + 0xd0, 0x10, 0xbd, 0xf9, 0xcc, 0x20, 0x9d, 0xed, 0x05, 0xaa, 0x9d, 0xed, + 0x06, 0xea, 0xad, 0xf8, 0x1c, 0x20, 0xad, 0xf8, 0x1e, 0x10, 0x8d, 0xed, + 0x0f, 0xaa, 0x8d, 0xed, 0x10, 0xea, 0x08, 0xf5, 0xa8, 0x76, 0x68, 0x78, + 0xc3, 0x07, 0x05, 0xd4, 0x28, 0x22, 0x07, 0xa9, 0x30, 0x46, 0xbe, 0xf7, + 0xa9, 0xff, 0x3a, 0xe1, 0x96, 0xed, 0x05, 0x0a, 0xb8, 0xee, 0x40, 0x0a, + 0xdf, 0xed, 0xa3, 0x0a, 0x60, 0xee, 0x20, 0x0a, 0x96, 0xed, 0x06, 0x1a, + 0xb8, 0xee, 0x41, 0x1a, 0xb7, 0xee, 0x00, 0x0a, 0x80, 0xee, 0x01, 0x0a, + 0x9d, 0xed, 0x0d, 0x1a, 0xb8, 0xee, 0x41, 0x1a, 0xf7, 0xee, 0x00, 0x1a, + 0xc1, 0xee, 0x81, 0x1a, 0x30, 0xee, 0x21, 0x0a, 0x20, 0xee, 0x80, 0x0a, + 0x8d, 0xed, 0x01, 0x0a, 0xd6, 0xed, 0x07, 0x0a, 0x9d, 0xed, 0x0e, 0x0a, + 0xf0, 0x5f, 0xdf, 0xf8, 0x5c, 0xb2, 0x70, 0xee, 0x80, 0xfa, 0x96, 0xed, + 0x08, 0x0a, 0xf6, 0xee, 0x00, 0x0a, 0x30, 0xee, 0x0a, 0x1a, 0x61, 0xee, + 0x20, 0xea, 0x30, 0xee, 0x4a, 0x1a, 0x13, 0x18, 0x21, 0xee, 0x20, 0xfa, + 0x00, 0xee, 0x10, 0x3a, 0xb8, 0xee, 0xc0, 0xba, 0x82, 0x1a, 0xb6, 0xf9, + 0x02, 0x00, 0x00, 0xee, 0x10, 0x2a, 0x0a, 0x18, 0x00, 0xee, 0x90, 0x2a, + 0xb8, 0xee, 0xe0, 0x9a, 0x41, 0x1a, 0xf8, 0xee, 0xc0, 0xaa, 0x00, 0xee, + 0x90, 0x1a, 0xb8, 0xee, 0xe0, 0xca, 0x9f, 0xed, 0x82, 0x0a, 0xbf, 0xf7, + 0x01, 0xff, 0x00, 0xf0, 0x4f, 0xf9, 0xb0, 0xee, 0x49, 0x0a, 0xbf, 0xf7, + 0xfb, 0xfe, 0x00, 0xf0, 0x3b, 0xf9, 0x00, 0xf0, 0x2e, 0xf9, 0xb0, 0xee, + 0x4b, 0x0a, 0xbf, 0xf7, 0xf3, 0xfe, 0x00, 0xf0, 0x1b, 0xf9, 0x00, 0xf0, + 0x44, 0xf9, 0xb0, 0xee, 0x40, 0xba, 0xf0, 0xee, 0x60, 0xba, 0x9f, 0xed, + 0x75, 0x0a, 0xbf, 0xf7, 0xe7, 0xfe, 0x00, 0xf0, 0x35, 0xf9, 0xb0, 0xee, + 0x4c, 0x0a, 0xbf, 0xf7, 0xe1, 0xfe, 0x00, 0xf0, 0x21, 0xf9, 0x00, 0xf0, + 0x14, 0xf9, 0xb0, 0xee, 0x6a, 0x0a, 0xbf, 0xf7, 0xd9, 0xfe, 0x00, 0xf0, + 0x01, 0xf9, 0x00, 0xf0, 0x2a, 0xf9, 0x00, 0xf0, 0x23, 0xf9, 0x96, 0xed, + 0x08, 0x0a, 0xbf, 0xf7, 0xcf, 0xfe, 0x08, 0xf5, 0xaa, 0x70, 0x90, 0xec, + 0x02, 0x1a, 0xbf, 0xf7, 0x9c, 0xfe, 0xb0, 0xee, 0x40, 0xda, 0xf0, 0xee, + 0x60, 0xda, 0xb0, 0xee, 0x4a, 0x0a, 0xbf, 0xf7, 0xc1, 0xfe, 0x08, 0xa8, + 0x90, 0xec, 0x02, 0x1a, 0xbf, 0xf7, 0x8f, 0xfe, 0xb0, 0xee, 0x40, 0xca, + 0xf0, 0xee, 0x60, 0xca, 0x96, 0xed, 0x08, 0x0a, 0xd6, 0xed, 0x09, 0x0a, + 0x0a, 0xa8, 0x08, 0xf5, 0xae, 0x71, 0x60, 0xee, 0x20, 0xaa, 0x20, 0xee, + 0x0e, 0xea, 0x90, 0xec, 0x02, 0x1a, 0x91, 0xec, 0x02, 0x0a, 0xbf, 0xf7, + 0x54, 0xfe, 0x00, 0xf0, 0xdc, 0xf8, 0xb0, 0xee, 0x4f, 0x0a, 0xbf, 0xf7, + 0xa1, 0xfe, 0x00, 0xf0, 0xf4, 0xf8, 0x11, 0xa8, 0x80, 0xec, 0x02, 0x0a, + 0xb0, 0xee, 0x6e, 0x0a, 0xbf, 0xf7, 0x98, 0xfe, 0x00, 0xf0, 0xd2, 0xf8, + 0x11, 0xa8, 0x90, 0xec, 0x02, 0x1a, 0xbf, 0xf7, 0x3e, 0xfe, 0x11, 0xa8, + 0xb0, 0xee, 0x4c, 0x1a, 0x80, 0xec, 0x02, 0x0a, 0x00, 0xf0, 0x99, 0xf8, + 0xbf, 0xf7, 0x35, 0xfe, 0x11, 0xa9, 0x91, 0xec, 0x02, 0x1a, 0xbf, 0xf7, + 0x30, 0xfe, 0x00, 0xf0, 0x89, 0xf8, 0x71, 0xee, 0x0a, 0x3a, 0x3a, 0xee, + 0x8e, 0x4a, 0x00, 0xf0, 0x9b, 0xf8, 0x01, 0x28, 0x2c, 0xd1, 0x0a, 0xa8, + 0x08, 0xf5, 0xae, 0x71, 0x90, 0xec, 0x02, 0x1a, 0x91, 0xec, 0x02, 0x0a, + 0xbf, 0xf7, 0x30, 0xfe, 0x00, 0xf0, 0xa5, 0xf8, 0xb0, 0xee, 0x6e, 0x0a, + 0xbf, 0xf7, 0x6a, 0xfe, 0x00, 0xf0, 0xbd, 0xf8, 0x00, 0xf0, 0xb6, 0xf8, + 0xb0, 0xee, 0x4f, 0x0a, 0xbf, 0xf7, 0x62, 0xfe, 0x00, 0xf0, 0x9c, 0xf8, + 0x00, 0xf0, 0xa8, 0xf8, 0x00, 0xf0, 0xac, 0xf8, 0xb0, 0xee, 0x4c, 0x1a, + 0x00, 0xf0, 0x67, 0xf8, 0xbf, 0xf7, 0x16, 0xfe, 0x00, 0xf0, 0x9e, 0xf8, + 0x00, 0xf0, 0x5a, 0xf8, 0x71, 0xee, 0x4a, 0x3a, 0x3a, 0xee, 0xce, 0x4a, + 0x00, 0xf0, 0x6c, 0xf8, 0x10, 0xb9, 0x43, 0xf2, 0x09, 0x17, 0x12, 0xe0, + 0x00, 0x99, 0x03, 0x98, 0x9d, 0xed, 0x06, 0x0a, 0x00, 0xf0, 0x22, 0xfc, + 0x10, 0xb9, 0x43, 0xf2, 0x0b, 0x17, 0x08, 0xe0, 0x00, 0x99, 0x03, 0x98, + 0x9d, 0xed, 0x05, 0x0a, 0x00, 0xf0, 0x73, 0xfb, 0x08, 0xb9, 0x43, 0xf2, + 0x0a, 0x17, 0x28, 0x78, 0xf8, 0xb1, 0x25, 0x98, 0x9d, 0xed, 0x06, 0x0a, + 0x00, 0xf1, 0x8c, 0x06, 0x08, 0xf1, 0x70, 0x01, 0x30, 0x46, 0x00, 0xf0, + 0x25, 0xfb, 0xb0, 0xee, 0x40, 0x8a, 0x9d, 0xed, 0x06, 0x0a, 0x08, 0xf1, + 0xe0, 0x01, 0x30, 0x46, 0x00, 0xf0, 0x1c, 0xfb, 0xd9, 0xed, 0x05, 0x0a, + 0xb4, 0xee, 0x60, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x59, 0xbf, 0xb4, 0xee, + 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x00, 0x20, 0x28, 0x70, 0x69, 0x78, + 0x49, 0x1c, 0x69, 0x70, 0x9d, 0xf8, 0x98, 0x00, 0x03, 0x28, 0x04, 0xbf, + 0x85, 0xf8, 0x07, 0xa0, 0x2c, 0x72, 0x14, 0xb0, 0x38, 0x46, 0xbd, 0xec, + 0x10, 0x8b, 0xbd, 0xe8, 0xfe, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x7a, 0x44, + 0x00, 0x00, 0x00, 0x37, 0xb0, 0x8d, 0x00, 0x21, 0xb8, 0x8d, 0x00, 0x21, + 0xf4, 0x75, 0x02, 0x21, 0x96, 0xed, 0x08, 0x1a, 0x00, 0x99, 0x03, 0x98, + 0xdd, 0xed, 0x01, 0x2a, 0x70, 0x47, 0xf0, 0xee, 0x6c, 0x1a, 0xb0, 0xee, + 0x4d, 0x0a, 0xf0, 0xee, 0x6d, 0x0a, 0x70, 0x47, 0x91, 0xec, 0x02, 0x0a, + 0x80, 0xec, 0x02, 0x0a, 0x70, 0x47, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x70, 0x47, 0xb7, 0xee, 0x00, 0x3a, 0xb0, 0xee, 0x6f, 0x2a, + 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, 0x00, 0xf0, 0x9f, 0xb9, + 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, 0xbf, 0xf7, 0x7d, 0xbd, + 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x90, 0xec, 0x02, 0x0a, + 0x70, 0x47, 0xb0, 0xee, 0x40, 0x9a, 0xf0, 0xee, 0x60, 0x9a, 0x70, 0x47, + 0xb0, 0xee, 0x4b, 0x1a, 0xf0, 0xee, 0x6b, 0x1a, 0xbf, 0xf7, 0x91, 0xbd, + 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x9b, 0xec, 0x02, 0x0a, + 0xbf, 0xf7, 0x89, 0xbd, 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, + 0xbf, 0xf7, 0x5d, 0xbd, 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, 0x60, 0x8a, + 0x70, 0x47, 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, 0xbf, 0xf7, + 0x78, 0xbd, 0x70, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0x00, 0xf0, + 0x9f, 0xf8, 0x8c, 0x34, 0x32, 0x46, 0x05, 0xf1, 0x70, 0x01, 0x20, 0x46, + 0x00, 0xf0, 0x98, 0xf8, 0x95, 0xf8, 0x78, 0x01, 0x28, 0xb1, 0x32, 0x46, + 0x05, 0xf1, 0xe0, 0x01, 0x20, 0x46, 0x00, 0xf0, 0x8f, 0xf8, 0x00, 0x20, + 0x70, 0xbd, 0x00, 0x20, 0x81, 0xf8, 0x79, 0x01, 0x70, 0x47, 0x70, 0xb5, + 0x0d, 0x46, 0x05, 0xf5, 0xbc, 0x76, 0x04, 0x46, 0x30, 0x78, 0x08, 0xb9, + 0x00, 0xf0, 0x33, 0xf8, 0x00, 0xf0, 0x08, 0xf8, 0x00, 0x20, 0xb0, 0x71, + 0x01, 0x21, 0x70, 0x7a, 0x31, 0x70, 0x40, 0x1c, 0x70, 0x72, 0x70, 0xbd, + 0x05, 0xf1, 0x70, 0x01, 0x04, 0xf1, 0x8c, 0x00, 0x00, 0xf0, 0x3a, 0xb8, + 0x10, 0xb5, 0x0c, 0x46, 0x04, 0xf1, 0x70, 0x01, 0x8c, 0x30, 0x00, 0xf0, + 0x86, 0xfb, 0x04, 0xf5, 0xbf, 0x70, 0x00, 0x21, 0x02, 0x79, 0x01, 0x70, + 0x52, 0x1c, 0x02, 0x71, 0x10, 0xbd, 0x70, 0xb5, 0x0d, 0x46, 0x04, 0x46, + 0x95, 0xf8, 0x78, 0x01, 0x16, 0x46, 0x08, 0xb9, 0x00, 0xf0, 0x0b, 0xf8, + 0x32, 0x46, 0x05, 0xf1, 0x70, 0x01, 0x04, 0xf1, 0x8c, 0x00, 0x00, 0xf0, + 0x51, 0xf8, 0x01, 0x20, 0x85, 0xf8, 0x78, 0x01, 0x70, 0xbd, 0x70, 0x22, + 0x05, 0xf1, 0x70, 0x01, 0x05, 0xf1, 0xe0, 0x00, 0xbe, 0xf7, 0xa0, 0xbd, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x80, 0xbf, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0xbf, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0xbf, 0x7f, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x00, 0xf0, 0x24, 0xf8, 0x06, 0x26, 0x00, 0xf0, 0x27, 0xf8, + 0x04, 0xf1, 0x18, 0x00, 0xbf, 0xf7, 0xf4, 0xfe, 0x05, 0xf1, 0x54, 0x01, + 0x01, 0x20, 0x02, 0x91, 0x01, 0x90, 0x00, 0xf0, 0x1c, 0xf8, 0x05, 0xf1, + 0x54, 0x00, 0xbf, 0xf7, 0xe9, 0xfe, 0x54, 0x21, 0x28, 0x46, 0xd0, 0xf7, + 0x2f, 0xff, 0x05, 0xf1, 0x54, 0x02, 0x06, 0x21, 0x28, 0x46, 0xbf, 0xf7, + 0x58, 0xff, 0x00, 0xf0, 0x06, 0xf8, 0x00, 0xf0, 0x0a, 0xf8, 0x20, 0x46, + 0xbf, 0xf7, 0xd8, 0xfe, 0x7f, 0xbd, 0x05, 0xf1, 0x54, 0x00, 0x01, 0x21, + 0x02, 0x90, 0x01, 0x91, 0x70, 0x47, 0x00, 0x96, 0x04, 0xf1, 0x48, 0x03, + 0x01, 0x22, 0x06, 0x21, 0x70, 0x47, 0x00, 0x00, 0x70, 0xb5, 0x2d, 0xed, + 0x02, 0x8b, 0x8a, 0xb0, 0x04, 0x46, 0x0d, 0x46, 0x16, 0x46, 0x00, 0xf0, + 0x18, 0xf9, 0x20, 0xee, 0x00, 0x8a, 0x00, 0xee, 0xa0, 0x8a, 0x94, 0xed, + 0x18, 0x0a, 0xb4, 0xee, 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0x00, 0xee, + 0x10, 0x6a, 0x48, 0xbf, 0x94, 0xed, 0x19, 0x8a, 0xb8, 0xee, 0x40, 0x0a, + 0x03, 0xab, 0x20, 0xee, 0x08, 0x0a, 0x01, 0x22, 0x06, 0x21, 0x04, 0xf1, + 0x30, 0x00, 0xbf, 0xf7, 0x95, 0xfe, 0x00, 0xf0, 0x26, 0xf8, 0x00, 0xf0, + 0x24, 0xf8, 0x03, 0xaa, 0x06, 0x21, 0x28, 0x46, 0xbf, 0xf7, 0x17, 0xff, + 0x9f, 0xed, 0xe2, 0x0a, 0xb4, 0xee, 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, + 0xb8, 0xbf, 0xb7, 0xee, 0x00, 0x8a, 0x03, 0xab, 0xb0, 0xee, 0x48, 0x0a, + 0x01, 0x22, 0x06, 0x21, 0x04, 0xf1, 0x18, 0x00, 0xbf, 0xf7, 0x7a, 0xfe, + 0x00, 0xf0, 0x0b, 0xf8, 0x00, 0xf0, 0x09, 0xf8, 0x03, 0xaa, 0x06, 0x21, + 0x28, 0x46, 0xbf, 0xf7, 0x13, 0xff, 0x0a, 0xb0, 0xbd, 0xec, 0x02, 0x8b, + 0x70, 0xbd, 0x01, 0x21, 0x06, 0x22, 0x03, 0xa8, 0x01, 0x91, 0x00, 0x92, + 0x02, 0x90, 0x04, 0xf1, 0x48, 0x03, 0x01, 0x22, 0x06, 0x21, 0xbf, 0xf7, + 0x73, 0xbe, 0x2d, 0xe9, 0xf0, 0x41, 0x2d, 0xed, 0x06, 0x8b, 0xb0, 0xee, + 0x40, 0x8a, 0xb0, 0xee, 0x41, 0x9a, 0x8a, 0xb0, 0x05, 0x46, 0xf0, 0xee, + 0x60, 0x8a, 0xb0, 0xee, 0x61, 0xaa, 0xf0, 0xee, 0x42, 0x9a, 0x16, 0x46, + 0xb0, 0xee, 0x49, 0x0a, 0xbf, 0xf7, 0x94, 0xfc, 0x00, 0xf0, 0x16, 0xfa, + 0x03, 0xa8, 0xe1, 0x4c, 0x80, 0xec, 0x02, 0x0a, 0x29, 0xee, 0x0a, 0x0a, + 0xbf, 0xf7, 0x8a, 0xfc, 0x94, 0xec, 0x02, 0x1a, 0xbf, 0xf7, 0x33, 0xfc, + 0x05, 0xa8, 0x00, 0x27, 0x80, 0xec, 0x02, 0x0a, 0x29, 0xee, 0x29, 0x0a, + 0xbf, 0xf7, 0x7e, 0xfc, 0x94, 0xec, 0x02, 0x1a, 0xbf, 0xf7, 0x27, 0xfc, + 0x07, 0xa8, 0x0d, 0xf1, 0x0c, 0x08, 0x80, 0xec, 0x02, 0x0a, 0x08, 0xeb, + 0xc7, 0x00, 0x06, 0xeb, 0xc7, 0x04, 0x90, 0xec, 0x02, 0x0a, 0xc0, 0x46, + 0xc0, 0x46, 0x08, 0xeb, 0xc7, 0x00, 0x84, 0xed, 0x00, 0x0a, 0x08, 0xeb, + 0xc7, 0x01, 0x90, 0xec, 0x02, 0x0a, 0xb1, 0xee, 0x60, 0x0a, 0x84, 0xed, + 0x01, 0x0a, 0x7f, 0x1c, 0x91, 0xec, 0x02, 0x0a, 0xc4, 0xed, 0x06, 0x0a, + 0x90, 0xec, 0x02, 0x0a, 0xc0, 0x46, 0xc0, 0x46, 0x03, 0x2f, 0x84, 0xed, + 0x07, 0x0a, 0xde, 0xd3, 0x01, 0x20, 0x01, 0x90, 0x06, 0x21, 0x00, 0x91, + 0x02, 0x96, 0x05, 0xf1, 0x48, 0x03, 0x01, 0x22, 0x30, 0x46, 0xbf, 0xf7, + 0x35, 0xfe, 0x01, 0x21, 0x06, 0x22, 0x06, 0xf1, 0x18, 0x00, 0x01, 0x91, + 0x00, 0x92, 0x02, 0x90, 0x05, 0xf1, 0x48, 0x03, 0x01, 0x22, 0x06, 0x21, + 0xbf, 0xf7, 0x28, 0xfe, 0x0a, 0xb0, 0xbd, 0xec, 0x06, 0x8b, 0xbd, 0xe8, + 0xf0, 0x81, 0x38, 0xb5, 0x2d, 0xed, 0x04, 0x8b, 0x05, 0x46, 0x98, 0xb0, + 0xab, 0x6f, 0x04, 0x93, 0xb0, 0xee, 0x41, 0x8a, 0xf0, 0xee, 0x61, 0x8a, + 0xf0, 0xee, 0x42, 0x9a, 0x0c, 0x46, 0xb0, 0xee, 0x62, 0x9a, 0xb0, 0xee, + 0x43, 0x1a, 0xf0, 0xee, 0x63, 0x1a, 0xb0, 0xee, 0x44, 0x2a, 0x0b, 0xaa, + 0xff, 0xf7, 0x75, 0xff, 0x05, 0xab, 0x01, 0x20, 0x06, 0x21, 0x02, 0x93, + 0x01, 0x90, 0x00, 0x91, 0x04, 0xf1, 0x54, 0x03, 0x06, 0x22, 0x02, 0x21, + 0x0b, 0xa8, 0xbf, 0xf7, 0x33, 0xff, 0x9d, 0xed, 0x05, 0x0a, 0x38, 0xee, + 0x40, 0x0a, 0x05, 0xa8, 0x8d, 0xed, 0x05, 0x0a, 0x00, 0x22, 0x90, 0xed, + 0x01, 0x0a, 0x38, 0xee, 0xc0, 0x0a, 0x80, 0xed, 0x01, 0x0a, 0xb6, 0xee, + 0x00, 0x0a, 0xd5, 0xed, 0x1c, 0x0a, 0x08, 0x92, 0x40, 0xee, 0x89, 0x9a, + 0x29, 0xee, 0x80, 0x0a, 0x8d, 0xed, 0x07, 0x0a, 0x09, 0x92, 0x02, 0x20, + 0x07, 0x99, 0x06, 0x22, 0x04, 0xab, 0x0a, 0x91, 0x03, 0x90, 0x02, 0x92, + 0x01, 0x93, 0x00, 0x94, 0x04, 0xf1, 0x54, 0x03, 0x95, 0xed, 0x1d, 0x0a, + 0x07, 0xaa, 0x0b, 0xa9, 0x05, 0xa8, 0xf8, 0xf7, 0x1b, 0xfc, 0x04, 0x99, + 0xe1, 0x66, 0x18, 0xb0, 0xbd, 0xec, 0x04, 0x8b, 0x32, 0xbd, 0x10, 0xb5, + 0x0c, 0x46, 0x90, 0xed, 0x12, 0x0a, 0xbf, 0xf7, 0xd9, 0xfb, 0x04, 0xf1, + 0x54, 0x00, 0x00, 0xf0, 0xc9, 0xf8, 0xbd, 0xe8, 0x10, 0x40, 0xbf, 0xf7, + 0xb7, 0xbb, 0x38, 0xb5, 0x2d, 0xed, 0x06, 0x8b, 0x04, 0x46, 0xb0, 0xee, + 0x40, 0xaa, 0x0d, 0x46, 0x94, 0xed, 0x14, 0x0a, 0xbf, 0xf7, 0xc6, 0xfb, + 0x05, 0xf1, 0x5c, 0x00, 0x00, 0xf0, 0x28, 0xf8, 0x00, 0xf0, 0x4a, 0xf9, + 0x94, 0xed, 0x16, 0x0a, 0xbf, 0xf7, 0xbc, 0xfb, 0x05, 0xf1, 0x64, 0x00, + 0x00, 0xf0, 0x1e, 0xf8, 0x00, 0xf0, 0x4c, 0xf8, 0xb0, 0xee, 0x4a, 0x0a, + 0xbf, 0xf7, 0xb2, 0xfb, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, + 0xb0, 0xee, 0x49, 0x0a, 0xf0, 0xee, 0x69, 0x0a, 0xbf, 0xf7, 0x7b, 0xfb, + 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0xb0, 0xee, 0x48, 0x0a, + 0xf0, 0xee, 0x68, 0x0a, 0xbd, 0xec, 0x06, 0x8b, 0xbd, 0xe8, 0x31, 0x40, + 0xbf, 0xf7, 0x47, 0xbb, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, + 0x90, 0xec, 0x02, 0x0a, 0xbf, 0xf7, 0x78, 0xbb, 0x38, 0xb5, 0x2d, 0xed, + 0x04, 0x8b, 0x00, 0xf0, 0xc3, 0xf8, 0x00, 0xf0, 0x21, 0xf8, 0x29, 0xee, + 0x09, 0x0a, 0x09, 0xee, 0xa9, 0x0a, 0xd4, 0xed, 0x18, 0x0a, 0xf4, 0xee, + 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x0f, 0xd5, 0xb0, 0xee, 0x48, 0x0a, + 0x29, 0x46, 0x20, 0x46, 0xff, 0xf7, 0xa9, 0xff, 0xb0, 0xee, 0x49, 0x1a, + 0xf0, 0xee, 0x69, 0x1a, 0xbd, 0xec, 0x04, 0x8b, 0xbd, 0xe8, 0x31, 0x40, + 0xbf, 0xf7, 0x56, 0xbb, 0x50, 0x48, 0xbd, 0xec, 0x04, 0x8b, 0x90, 0xec, + 0x02, 0x0a, 0x31, 0xbd, 0xb0, 0xee, 0x40, 0x9a, 0xf0, 0xee, 0x60, 0x9a, + 0x70, 0x47, 0x00, 0x00, 0x38, 0xb5, 0x04, 0x46, 0x0d, 0x46, 0x2d, 0xed, + 0x02, 0x8b, 0x00, 0x23, 0x00, 0x22, 0x06, 0x21, 0x28, 0x46, 0xbf, 0xf7, + 0xd3, 0xfd, 0xd4, 0xed, 0x12, 0x0a, 0x60, 0xee, 0xa0, 0x0a, 0x80, 0xee, + 0x20, 0x8a, 0x01, 0x23, 0x01, 0x22, 0x06, 0x21, 0x28, 0x46, 0xbf, 0xf7, + 0xc7, 0xfd, 0xd4, 0xed, 0x13, 0x0a, 0x60, 0xee, 0xa0, 0x0a, 0x80, 0xee, + 0x20, 0x0a, 0x30, 0xee, 0x08, 0x0a, 0x9f, 0xed, 0x37, 0x1a, 0xb4, 0xee, + 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xbd, 0xec, 0x02, 0x8b, 0xb8, 0xbf, + 0x9f, 0xed, 0x33, 0x0a, 0x31, 0xbd, 0x38, 0xb5, 0x2d, 0xed, 0x02, 0x8b, + 0x92, 0xb0, 0x04, 0x46, 0x0d, 0x46, 0xb0, 0xee, 0x40, 0x8a, 0xff, 0xf7, + 0x9d, 0xff, 0x31, 0x48, 0x00, 0xf0, 0x20, 0xf8, 0xbf, 0xf7, 0xfd, 0xfa, + 0x05, 0xaa, 0xb0, 0xee, 0x48, 0x2a, 0xf7, 0xee, 0x00, 0x1a, 0xb7, 0xee, + 0x00, 0x1a, 0x29, 0x46, 0x20, 0x46, 0xff, 0xf7, 0x76, 0xfe, 0x02, 0x20, + 0x00, 0x90, 0x06, 0x23, 0x01, 0xaa, 0x29, 0x46, 0x05, 0xa8, 0xf8, 0xf7, + 0x3f, 0xfb, 0x9d, 0xed, 0x01, 0x0a, 0xdd, 0xed, 0x04, 0x0a, 0x12, 0xb0, + 0x30, 0xee, 0x20, 0x0a, 0x34, 0xe0, 0x00, 0x00, 0x01, 0x00, 0x80, 0x3f, + 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x90, 0xec, 0x02, 0x0a, + 0x70, 0x47, 0x00, 0x00, 0x38, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x00, 0xf0, + 0x35, 0xf8, 0x60, 0xee, 0x00, 0x8a, 0x40, 0xee, 0xa0, 0x8a, 0x29, 0x46, + 0x20, 0x46, 0xff, 0xf7, 0x93, 0xff, 0xd4, 0xed, 0x1a, 0x0a, 0x68, 0xee, + 0xa0, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x11, 0xd5, + 0xb0, 0xee, 0x48, 0x0a, 0x29, 0x46, 0x20, 0x46, 0xff, 0xf7, 0xaf, 0xff, + 0x80, 0xee, 0x28, 0x0a, 0xdf, 0xed, 0x09, 0x0a, 0xb4, 0xee, 0x60, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x04, 0xda, 0x9f, 0xed, 0x07, 0x0a, 0x01, 0xe0, + 0x94, 0xed, 0x1b, 0x0a, 0xbd, 0xec, 0x02, 0x8b, 0x31, 0xbd, 0x00, 0x00, + 0x00, 0xe7, 0xdb, 0x2e, 0xff, 0xe6, 0xdb, 0x2e, 0x7e, 0x1d, 0x90, 0x26, + 0x7d, 0x1d, 0x90, 0x26, 0xfc, 0x75, 0x02, 0x21, 0xd0, 0x8d, 0x00, 0x21, + 0x04, 0x46, 0x0d, 0x46, 0xb0, 0xee, 0x40, 0x8a, 0xe5, 0xe6, 0x38, 0xb5, + 0x2d, 0xed, 0x06, 0x8b, 0x04, 0x46, 0x0d, 0x46, 0xb0, 0xee, 0x40, 0xaa, + 0xff, 0xf7, 0xdd, 0xfe, 0x00, 0xf0, 0x44, 0xf8, 0x29, 0x46, 0x20, 0x46, + 0xff, 0xf7, 0x52, 0xff, 0xf0, 0xee, 0x40, 0xaa, 0x94, 0xed, 0x1f, 0x0a, + 0x20, 0xee, 0x00, 0x9a, 0x94, 0xed, 0x20, 0x0a, 0x60, 0xee, 0x00, 0x9a, + 0xb0, 0xee, 0x4a, 0x0a, 0xbf, 0xf7, 0xa8, 0xfa, 0x00, 0xf0, 0x2a, 0xf8, + 0xb6, 0xee, 0x00, 0x1a, 0x2a, 0xee, 0x81, 0x1a, 0x6a, 0xee, 0x0a, 0x1a, + 0x21, 0xee, 0x21, 0x1a, 0x60, 0xee, 0x00, 0x1a, 0x40, 0xee, 0xa0, 0x1a, + 0xf4, 0xee, 0x49, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0xa2, 0xbf, 0xf4, 0xee, + 0x61, 0x9a, 0xf1, 0xee, 0x10, 0xfa, 0x01, 0x20, 0x0f, 0xda, 0xf4, 0xee, + 0x49, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x94, 0xed, 0x21, 0x2a, 0x4c, 0xbf, + 0xd4, 0xed, 0x1f, 0x1a, 0xd4, 0xed, 0x20, 0x1a, 0xbd, 0xec, 0x06, 0x8b, + 0xbd, 0xe8, 0x31, 0x40, 0x0d, 0xe0, 0xbd, 0xec, 0x06, 0x8b, 0x32, 0xbd, + 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, 0xbf, 0xf7, 0x49, 0xba, + 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, 0x60, 0x8a, 0x70, 0x47, 0x80, 0xb5, + 0x2d, 0xed, 0x08, 0x8b, 0xff, 0xf7, 0xf6, 0xff, 0xb0, 0xee, 0x41, 0xaa, + 0xb0, 0xee, 0x61, 0xba, 0xf0, 0xee, 0x42, 0xaa, 0xbd, 0xf7, 0x0c, 0xfd, + 0xbf, 0xf7, 0x5b, 0xfa, 0xf8, 0xf7, 0xc8, 0xf9, 0xff, 0xf7, 0xf4, 0xfe, + 0xb0, 0xee, 0x4b, 0x0a, 0xbf, 0xf7, 0x5a, 0xfa, 0xb0, 0xee, 0x49, 0x1a, + 0xf0, 0xee, 0x69, 0x1a, 0xbf, 0xf7, 0x27, 0xfa, 0xff, 0xf7, 0xe8, 0xfe, + 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, 0xbf, 0xf7, 0x0c, 0xfa, + 0xc0, 0x46, 0xc0, 0x46, 0xb0, 0xee, 0x40, 0xba, 0x00, 0xf0, 0x1c, 0xf8, + 0xc0, 0x46, 0xc0, 0x46, 0x2b, 0xee, 0x00, 0xba, 0x00, 0xf0, 0x16, 0xf8, + 0xb0, 0xee, 0x60, 0x0a, 0xf0, 0xee, 0x40, 0xba, 0x00, 0xf0, 0x10, 0xf8, + 0xb0, 0xee, 0x60, 0x0a, 0x0b, 0xee, 0x80, 0xba, 0x8b, 0xee, 0x0a, 0x0a, + 0xf4, 0xee, 0x40, 0xaa, 0xf1, 0xee, 0x10, 0xfa, 0xbd, 0xec, 0x08, 0x8b, + 0xac, 0xbf, 0x01, 0x20, 0x00, 0x20, 0x02, 0xbd, 0xb0, 0xee, 0x48, 0x1a, + 0xf0, 0xee, 0x68, 0x1a, 0xb0, 0xee, 0x49, 0x0a, 0xf0, 0xee, 0x69, 0x0a, + 0xbf, 0xf7, 0xe0, 0xb9, 0x2d, 0xe9, 0xf0, 0x41, 0x2d, 0xed, 0x02, 0x8b, + 0x04, 0x46, 0x88, 0x46, 0xb0, 0xee, 0x40, 0x8a, 0x06, 0x21, 0x08, 0xf1, + 0x54, 0x00, 0x00, 0xf0, 0x47, 0xf8, 0x05, 0x46, 0x15, 0x21, 0x40, 0x46, + 0x00, 0xf0, 0x42, 0xf8, 0x07, 0x46, 0xb0, 0xee, 0x48, 0x0a, 0x41, 0x46, + 0x20, 0x46, 0xff, 0xf7, 0xce, 0xfe, 0xf0, 0xee, 0x40, 0x8a, 0xb0, 0xee, + 0x48, 0x0a, 0x41, 0x46, 0x20, 0x46, 0xff, 0xf7, 0x2e, 0xfe, 0x01, 0x26, + 0x20, 0xee, 0x00, 0x0a, 0x01, 0x2d, 0x00, 0xee, 0xa0, 0x0a, 0x14, 0xbf, + 0x01, 0x2f, 0x00, 0x26, 0xf5, 0xee, 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, + 0xd4, 0xed, 0x22, 0x0a, 0x48, 0xbf, 0x00, 0x26, 0xf4, 0xee, 0x40, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x48, 0xbf, 0x00, 0x26, 0xbd, 0xec, 0x02, 0x8b, + 0x30, 0x46, 0xbd, 0xe8, 0xf0, 0x81, 0x10, 0xb5, 0x2d, 0xed, 0x02, 0x8b, + 0x0c, 0x46, 0xb0, 0xee, 0x40, 0x8a, 0x01, 0x22, 0x06, 0x21, 0x04, 0xf1, + 0x54, 0x00, 0xbf, 0xf7, 0x8e, 0xfb, 0x28, 0xee, 0x08, 0x0a, 0xbd, 0xec, + 0x02, 0x8b, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x01, 0x22, 0x15, 0x21, + 0xbf, 0xf7, 0x83, 0xbb, 0x30, 0xb5, 0x04, 0x46, 0x00, 0x20, 0x00, 0x25, + 0x00, 0xe0, 0x6d, 0x1c, 0x8d, 0x42, 0x08, 0xd2, 0x54, 0xf8, 0x25, 0x30, + 0x5b, 0x00, 0x1a, 0x16, 0x52, 0x1c, 0xf6, 0xd1, 0x1b, 0x02, 0xf4, 0xd0, + 0x01, 0x20, 0x30, 0xbd, 0x10, 0xb5, 0x1c, 0x46, 0x70, 0x21, 0x20, 0x46, + 0xd0, 0xf7, 0xc8, 0xfb, 0x20, 0x46, 0xe7, 0xf7, 0x31, 0xf8, 0x00, 0x20, + 0x10, 0xbd, 0x2d, 0xe9, 0xf0, 0x41, 0x06, 0x9f, 0xdd, 0xf8, 0x1c, 0x80, + 0x0c, 0x46, 0x15, 0x46, 0x1e, 0x46, 0xd6, 0xf7, 0x8b, 0xfd, 0xe8, 0x60, + 0x41, 0x46, 0x01, 0x20, 0x28, 0x71, 0x38, 0x46, 0x22, 0x6a, 0xff, 0xf7, + 0xf8, 0xfb, 0x00, 0x20, 0xb0, 0x66, 0xf0, 0x66, 0xbd, 0xe8, 0xf0, 0x81, + 0x2d, 0xe9, 0xf2, 0x4f, 0x2d, 0xed, 0x04, 0x8b, 0x15, 0x46, 0x88, 0xb0, + 0x81, 0x46, 0x1f, 0x46, 0x05, 0xf1, 0x30, 0x02, 0x44, 0x31, 0x00, 0xf0, + 0x6b, 0xfc, 0x05, 0xf1, 0xf8, 0x00, 0x00, 0x21, 0x01, 0x80, 0x00, 0x20, + 0x38, 0x60, 0x78, 0x60, 0x48, 0x46, 0xcc, 0xf7, 0x7e, 0xfc, 0x38, 0x75, + 0x00, 0x21, 0x00, 0x20, 0xb8, 0x63, 0xf9, 0x63, 0x38, 0x64, 0xb9, 0x64, + 0x07, 0xf1, 0x4c, 0x00, 0x00, 0x22, 0x42, 0x60, 0x00, 0x20, 0x07, 0xf1, + 0x4c, 0x02, 0x91, 0x60, 0x07, 0xf1, 0x4c, 0x01, 0x00, 0x22, 0x08, 0x61, + 0x00, 0x21, 0x07, 0xf1, 0x4c, 0x00, 0xc2, 0x60, 0x07, 0xf1, 0x4c, 0x02, + 0x00, 0x20, 0x51, 0x61, 0x07, 0xf1, 0x4c, 0x01, 0x88, 0x61, 0x48, 0x46, + 0x18, 0x99, 0xbf, 0xf7, 0xb7, 0xf9, 0x04, 0x46, 0xd6, 0xf7, 0x42, 0xfd, + 0xa8, 0x60, 0xbc, 0xb9, 0x01, 0x46, 0xe8, 0x68, 0xd6, 0xf7, 0x80, 0xfd, + 0x83, 0x46, 0x0c, 0x98, 0x41, 0x6a, 0x16, 0x98, 0x8b, 0x45, 0x88, 0xbf, + 0x8b, 0x46, 0x17, 0x99, 0x5a, 0x46, 0xff, 0xf7, 0xa6, 0xfb, 0x04, 0x46, + 0x0c, 0x98, 0x81, 0x6a, 0x59, 0x45, 0x03, 0xd2, 0x17, 0x99, 0x16, 0x98, + 0xff, 0xf7, 0xb9, 0xfb, 0x17, 0x99, 0x16, 0x98, 0xff, 0xf7, 0xb1, 0xfb, + 0xa8, 0x68, 0xe8, 0x60, 0x00, 0x21, 0xa9, 0x62, 0x29, 0x61, 0xe9, 0x61, + 0x29, 0x62, 0x00, 0x20, 0x05, 0xf5, 0x80, 0x72, 0xe8, 0x62, 0x68, 0x61, + 0xa8, 0x61, 0x68, 0x62, 0x01, 0x21, 0x11, 0x64, 0x05, 0xf5, 0xa2, 0x72, + 0x05, 0xf5, 0xa2, 0x71, 0x85, 0xf8, 0x44, 0x01, 0x88, 0x80, 0x50, 0x80, + 0x00, 0x22, 0x05, 0xf5, 0xa2, 0x70, 0x82, 0x60, 0x48, 0x46, 0x00, 0xf0, + 0x27, 0xff, 0x68, 0x70, 0x48, 0x46, 0x00, 0xf0, 0xd7, 0xfd, 0xa8, 0x70, + 0xe8, 0x70, 0x1c, 0xb9, 0x48, 0x46, 0x00, 0xf0, 0x26, 0xff, 0x04, 0x46, + 0x17, 0x98, 0x00, 0xf5, 0xbd, 0x71, 0x06, 0x91, 0x9f, 0xed, 0x2e, 0x8a, + 0xdf, 0xed, 0x2e, 0x8a, 0x2e, 0xe0, 0x0c, 0x99, 0x28, 0x6a, 0x8a, 0x6e, + 0x90, 0x42, 0x26, 0xd2, 0x43, 0xf2, 0x0b, 0x11, 0x8c, 0x42, 0x22, 0xd1, + 0x40, 0x1c, 0x28, 0x62, 0x07, 0xf1, 0x4c, 0x00, 0x41, 0x69, 0x49, 0x1c, + 0x41, 0x61, 0x01, 0x6a, 0x49, 0x1c, 0x01, 0x62, 0x12, 0xe0, 0x0c, 0x99, + 0xa8, 0x69, 0x0a, 0x6e, 0x90, 0x42, 0xe6, 0xd2, 0x43, 0xf2, 0x0a, 0x11, + 0x8c, 0x42, 0xe2, 0xd1, 0x40, 0x1c, 0xa8, 0x61, 0x07, 0xf1, 0x4c, 0x00, + 0xc1, 0x68, 0x49, 0x1c, 0xc1, 0x60, 0xc1, 0x69, 0x49, 0x1c, 0xc1, 0x61, + 0x17, 0x99, 0x16, 0x98, 0xfe, 0xf7, 0xca, 0xfe, 0x00, 0x24, 0x48, 0x46, + 0x01, 0xf0, 0x08, 0xf9, 0xe6, 0xf7, 0x74, 0xff, 0x00, 0x28, 0x08, 0xbf, + 0x00, 0x2c, 0x40, 0xf0, 0xdf, 0x82, 0xd6, 0xf7, 0xb9, 0xfc, 0x04, 0x46, + 0xe8, 0x68, 0x21, 0x46, 0xd6, 0xf7, 0xf8, 0xfc, 0xec, 0x60, 0x0c, 0x99, + 0x4a, 0x6a, 0x17, 0x99, 0x90, 0x42, 0x88, 0xbf, 0x10, 0x46, 0x02, 0x46, + 0x16, 0x98, 0xff, 0xf7, 0x1e, 0xfb, 0x04, 0x46, 0x48, 0x46, 0x00, 0xf0, + 0x7b, 0xfd, 0x28, 0x70, 0x00, 0x2c, 0x78, 0x75, 0x40, 0xf0, 0x7d, 0x82, + 0x2e, 0x78, 0x30, 0x00, 0x0a, 0xd1, 0x00, 0x20, 0x78, 0x62, 0x9f, 0xed, + 0x03, 0x0a, 0x23, 0xe0, 0x0a, 0xd7, 0x23, 0x3c, 0xa4, 0x70, 0x7d, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x17, 0x99, 0x16, 0x98, 0x33, 0x46, 0x03, 0x22, + 0xfe, 0xf7, 0x08, 0xff, 0xb0, 0xee, 0x40, 0x9a, 0x87, 0xed, 0x09, 0x9a, + 0xbe, 0xf7, 0x2e, 0xfa, 0xfa, 0xee, 0x04, 0x0a, 0x20, 0xee, 0x20, 0x0a, + 0xbd, 0xf7, 0xea, 0xfb, 0x0c, 0x98, 0xd0, 0xed, 0x00, 0x0a, 0xf4, 0xee, + 0x49, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0xbc, 0xee, 0xc0, 0x0a, 0x4c, 0xbf, + 0x01, 0x20, 0x00, 0x20, 0x00, 0x28, 0x87, 0xed, 0x02, 0x0a, 0x00, 0xf0, + 0x0b, 0x82, 0x95, 0xf8, 0x44, 0x11, 0x8e, 0x42, 0x0f, 0xd1, 0x05, 0xf5, + 0x80, 0x70, 0x01, 0x6c, 0x01, 0x29, 0x0a, 0xd0, 0x05, 0xf5, 0xa2, 0x71, + 0xb1, 0xf9, 0x02, 0x20, 0xad, 0xf8, 0x12, 0x20, 0xb1, 0xf9, 0x04, 0x10, + 0xad, 0xf8, 0x10, 0x10, 0x30, 0xe0, 0x28, 0x79, 0x48, 0xb1, 0x0c, 0x98, + 0x90, 0xed, 0x01, 0x0a, 0xb4, 0xee, 0x40, 0x9a, 0xf1, 0xee, 0x10, 0xfa, + 0x58, 0xbf, 0x00, 0x22, 0x02, 0xd5, 0x00, 0x20, 0x03, 0x22, 0x28, 0x71, + 0x00, 0x21, 0x01, 0x20, 0x03, 0x91, 0x02, 0x90, 0x04, 0xab, 0x01, 0x93, + 0x0d, 0xf1, 0x12, 0x04, 0x17, 0x99, 0x16, 0x98, 0x00, 0x94, 0x33, 0x46, + 0xfe, 0xf7, 0x16, 0xff, 0x04, 0x46, 0xbd, 0xf8, 0x12, 0x00, 0x38, 0x83, + 0x05, 0xf5, 0x80, 0x72, 0xbd, 0xf8, 0x10, 0x10, 0x79, 0x83, 0x00, 0x20, + 0x10, 0x64, 0x05, 0xf5, 0xa2, 0x70, 0xbd, 0xf8, 0x12, 0x10, 0x41, 0x80, + 0xbd, 0xf8, 0x10, 0x20, 0x82, 0x80, 0x06, 0x70, 0x00, 0xf0, 0x1d, 0xfb, + 0x31, 0x46, 0x48, 0x46, 0xd9, 0xf7, 0xc6, 0xfc, 0x0c, 0x9e, 0x4f, 0xf0, + 0x00, 0x08, 0x08, 0xe0, 0x00, 0xf0, 0x13, 0xfb, 0x5f, 0xfa, 0x88, 0xf1, + 0x48, 0x46, 0xd9, 0xf7, 0xbb, 0xfc, 0x08, 0xf1, 0x01, 0x08, 0xb1, 0x7c, + 0x5f, 0xfa, 0x88, 0xf0, 0x88, 0x42, 0xf1, 0xd3, 0x00, 0x2c, 0x0c, 0x96, + 0x40, 0xf0, 0xaa, 0x81, 0xb1, 0x68, 0x0c, 0x98, 0x02, 0x91, 0x05, 0xf5, + 0xa2, 0x78, 0xc1, 0x68, 0x0c, 0x98, 0x03, 0x91, 0x90, 0xf8, 0x10, 0xb0, + 0x46, 0x7c, 0xd8, 0xf8, 0x08, 0x00, 0xa6, 0xeb, 0x0b, 0x06, 0x01, 0x24, + 0x76, 0x1c, 0x04, 0xfa, 0x06, 0xf6, 0x41, 0x1c, 0xb1, 0xfb, 0xf6, 0xf2, + 0x06, 0xfb, 0x12, 0x16, 0x70, 0x40, 0xdf, 0xf7, 0xbb, 0xfa, 0x00, 0x21, + 0x58, 0x44, 0x04, 0xfa, 0x00, 0xfa, 0x48, 0x46, 0xc8, 0xf8, 0x08, 0x60, + 0x8d, 0xf8, 0x04, 0x10, 0x00, 0x91, 0x01, 0x26, 0x02, 0x99, 0x00, 0xf0, + 0xc7, 0xfc, 0x05, 0x90, 0x88, 0xb1, 0x00, 0x26, 0x43, 0xf2, 0x02, 0x14, + 0xcd, 0xf8, 0x1c, 0xa0, 0xcd, 0xf8, 0x10, 0x90, 0x02, 0x95, 0x9d, 0xf8, + 0x04, 0xb0, 0x9d, 0xf8, 0x03, 0xa0, 0x9d, 0xf8, 0x02, 0x80, 0x4f, 0xf0, + 0x00, 0x09, 0x01, 0x25, 0x60, 0xe0, 0x29, 0x78, 0x48, 0x46, 0x00, 0xf0, + 0xa5, 0xfc, 0x0c, 0x98, 0x00, 0xf1, 0x50, 0x01, 0x05, 0xf1, 0xf8, 0x02, + 0x48, 0x46, 0x00, 0xf0, 0xaf, 0xfc, 0x04, 0x00, 0x14, 0xbf, 0x00, 0x26, + 0x8d, 0xf8, 0x01, 0x60, 0xde, 0xe7, 0x01, 0x98, 0x24, 0x21, 0xd0, 0xf7, + 0xe9, 0xf9, 0x40, 0xe0, 0x2e, 0x42, 0x4f, 0xd0, 0x07, 0x99, 0x89, 0x45, + 0x4c, 0xd2, 0x09, 0xf1, 0x01, 0x09, 0x66, 0xb1, 0x02, 0x98, 0x00, 0x21, + 0x30, 0x30, 0x00, 0xf0, 0x8e, 0xfb, 0x04, 0x00, 0x4f, 0xf0, 0x00, 0x0a, + 0x0c, 0xbf, 0x4f, 0xf0, 0x01, 0x0b, 0x00, 0x26, 0xd0, 0x46, 0x5f, 0xea, + 0x0b, 0x00, 0x10, 0xd0, 0x03, 0x99, 0x04, 0x98, 0x00, 0xf0, 0x94, 0xfb, + 0x02, 0x28, 0x08, 0xbf, 0x00, 0x26, 0x08, 0xd0, 0x01, 0x28, 0x04, 0xd1, + 0x00, 0x26, 0x24, 0xb9, 0x43, 0xf2, 0x03, 0x14, 0x01, 0xe0, 0x4f, 0xf0, + 0x01, 0x0a, 0x16, 0xea, 0x0a, 0x0f, 0xce, 0xd0, 0x02, 0x98, 0x01, 0x99, + 0x30, 0x30, 0x00, 0xf0, 0x83, 0xfb, 0x01, 0x46, 0x03, 0x29, 0x03, 0xd1, + 0x00, 0x26, 0x43, 0xf2, 0x04, 0x14, 0x08, 0xe0, 0x02, 0x9a, 0xd2, 0xf8, + 0x00, 0x01, 0x08, 0xb1, 0x4f, 0xf0, 0x01, 0x08, 0x01, 0x29, 0x08, 0xbf, + 0x00, 0x25, 0x16, 0xea, 0x08, 0x0f, 0x05, 0xd0, 0x04, 0x98, 0x00, 0xf0, + 0xed, 0xfc, 0x01, 0x28, 0x08, 0xbf, 0x00, 0x25, 0x02, 0x98, 0x00, 0xf1, + 0xfc, 0x01, 0x01, 0x91, 0xe6, 0xf7, 0x1e, 0xfe, 0x00, 0x28, 0xad, 0xd0, + 0xdd, 0xf8, 0x10, 0x90, 0x02, 0x9d, 0x9d, 0xf8, 0x01, 0x00, 0x68, 0xb1, + 0x00, 0x21, 0x48, 0x46, 0x00, 0xf0, 0xda, 0xfc, 0x01, 0x28, 0x04, 0xd1, + 0x00, 0x26, 0x2c, 0xb9, 0x43, 0xf2, 0x05, 0x14, 0x02, 0xe0, 0x01, 0x20, + 0x8d, 0xf8, 0x00, 0x00, 0x05, 0xf5, 0x80, 0x7b, 0x9d, 0xf8, 0x00, 0x10, + 0x0e, 0x42, 0x15, 0xd0, 0x0c, 0x98, 0x00, 0xf1, 0x50, 0x01, 0x05, 0xf5, + 0x90, 0x72, 0x48, 0x46, 0x00, 0xf0, 0xc4, 0xfc, 0x01, 0x28, 0x03, 0xd1, + 0x00, 0x26, 0x43, 0xf2, 0x05, 0x14, 0x0c, 0xe0, 0xdb, 0xf8, 0x2c, 0x00, + 0x08, 0xb9, 0x00, 0x26, 0x07, 0xe0, 0x4f, 0xf0, 0x01, 0x0a, 0x06, 0xe0, + 0x20, 0x21, 0x05, 0xf5, 0x90, 0x70, 0xd0, 0xf7, 0x61, 0xf9, 0x4f, 0xf0, + 0x00, 0x0a, 0x05, 0x98, 0x30, 0xb9, 0x48, 0x46, 0x00, 0xf0, 0x12, 0xfc, + 0x10, 0xb1, 0x00, 0x26, 0x43, 0xf2, 0x02, 0x14, 0x08, 0xea, 0x06, 0x06, + 0x00, 0x2c, 0x0a, 0xea, 0x06, 0x06, 0x40, 0xf0, 0xfe, 0x80, 0x00, 0x2e, + 0x00, 0xf0, 0xfb, 0x80, 0x95, 0xf8, 0x00, 0x80, 0xe8, 0x68, 0x07, 0x90, + 0x05, 0xab, 0x0d, 0xf1, 0x16, 0x02, 0x41, 0x46, 0x48, 0x46, 0xd9, 0xf7, + 0xfb, 0xfb, 0x48, 0x46, 0x00, 0xf0, 0x32, 0xfd, 0x04, 0x46, 0x87, 0xf8, + 0x4c, 0x40, 0x00, 0x22, 0x69, 0x78, 0x88, 0x42, 0x02, 0xd0, 0x6c, 0x70, + 0x0c, 0x98, 0x02, 0x6b, 0xe9, 0x78, 0x40, 0x46, 0x00, 0xee, 0x10, 0x0a, + 0xa8, 0x78, 0xf8, 0xee, 0x40, 0x0a, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, + 0x40, 0x0a, 0x01, 0xee, 0x10, 0x1a, 0x0c, 0x98, 0x80, 0xee, 0x80, 0x0a, + 0xb8, 0xee, 0x41, 0x1a, 0xc0, 0xee, 0x81, 0x0a, 0x90, 0xed, 0x0d, 0x1a, + 0xb4, 0xee, 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x5e, 0xbf, 0x90, 0xed, + 0x0e, 0x1a, 0xb4, 0xee, 0x40, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x11, 0xd4, + 0x90, 0xed, 0x0f, 0x0a, 0xf4, 0xee, 0x40, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x5e, 0xbf, 0x90, 0xed, 0x10, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x05, 0xd5, 0xc0, 0x6a, 0x85, 0xf8, 0x03, 0x80, 0x00, 0xe0, + 0xc0, 0x6a, 0x82, 0x18, 0x85, 0xf8, 0x02, 0x80, 0x5a, 0xb1, 0x17, 0x99, + 0x16, 0x98, 0xff, 0xf7, 0x82, 0xf9, 0x07, 0xf1, 0x4c, 0x00, 0x81, 0x69, + 0x49, 0x1c, 0x81, 0x61, 0x69, 0x6a, 0x49, 0x1c, 0x69, 0x62, 0x03, 0x22, + 0x07, 0x98, 0xbd, 0xf9, 0x14, 0x10, 0x04, 0x90, 0x03, 0x91, 0x01, 0x92, + 0x05, 0xf5, 0x90, 0x76, 0xbd, 0xf9, 0x16, 0x00, 0x02, 0x90, 0x05, 0xf1, + 0xfc, 0x0a, 0x18, 0x98, 0x00, 0x94, 0x43, 0x46, 0x32, 0x46, 0x51, 0x46, + 0xbe, 0xf7, 0xef, 0xfe, 0xbd, 0xf9, 0x14, 0x00, 0xbd, 0xf9, 0x16, 0x10, + 0x04, 0x90, 0x03, 0x91, 0x02, 0x96, 0x17, 0x99, 0x16, 0x98, 0xcd, 0xf8, + 0x04, 0xa0, 0x00, 0x94, 0x43, 0x46, 0x03, 0x22, 0xfe, 0xf7, 0x54, 0xfe, + 0x04, 0x46, 0x01, 0x20, 0xcb, 0xf8, 0x40, 0x00, 0x39, 0x69, 0x49, 0x1c, + 0x39, 0x61, 0xa8, 0x6a, 0x40, 0x1c, 0xa8, 0x62, 0xe8, 0x6a, 0x28, 0xb1, + 0x97, 0xed, 0x12, 0x0a, 0x00, 0xf0, 0xbd, 0xf8, 0x87, 0xed, 0x12, 0x0a, + 0x00, 0x20, 0xe8, 0x62, 0x43, 0x46, 0x06, 0x99, 0x08, 0x78, 0xb8, 0x75, + 0x03, 0x22, 0x06, 0x99, 0x48, 0x78, 0xf8, 0x75, 0x17, 0x99, 0x16, 0x98, + 0xfe, 0xf7, 0x06, 0xfd, 0x07, 0xf1, 0x1c, 0x00, 0x00, 0xf0, 0xb2, 0xf8, + 0xfe, 0xf7, 0x17, 0xfd, 0x07, 0xf1, 0x28, 0x00, 0x00, 0xf0, 0xac, 0xf8, + 0xfe, 0xf7, 0x2a, 0xfd, 0x87, 0xed, 0x0c, 0x0a, 0x07, 0xf1, 0x4c, 0x02, + 0x17, 0x98, 0xd0, 0xf8, 0xdc, 0x10, 0x79, 0x63, 0x06, 0x98, 0xc1, 0x79, + 0x51, 0x70, 0x40, 0xe0, 0x00, 0xf0, 0xa2, 0xf8, 0x04, 0x46, 0xd6, 0xf7, + 0x5f, 0xfa, 0x01, 0x46, 0xa8, 0x68, 0xd6, 0xf7, 0x9f, 0xfa, 0x00, 0xee, + 0x10, 0x0a, 0xb8, 0x6b, 0x08, 0xb9, 0x87, 0xed, 0x0e, 0x0a, 0xd7, 0xed, + 0x0f, 0x0a, 0x60, 0xee, 0xa8, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x40, 0xee, + 0x08, 0x0a, 0xc7, 0xed, 0x0f, 0x0a, 0xe8, 0x6a, 0x40, 0x1c, 0xe8, 0x62, + 0xa8, 0x6a, 0x28, 0xb1, 0x97, 0xed, 0x10, 0x0a, 0x00, 0xf0, 0x73, 0xf8, + 0x87, 0xed, 0x10, 0x0a, 0x00, 0x20, 0xa8, 0x62, 0x28, 0x61, 0x68, 0x61, + 0xe8, 0x61, 0xa8, 0x61, 0x28, 0x62, 0x68, 0x62, 0x64, 0x20, 0x29, 0x78, + 0xe9, 0x70, 0x78, 0x60, 0xf9, 0x68, 0x49, 0x1c, 0xf9, 0x60, 0x1c, 0xb9, + 0x0c, 0x98, 0xc0, 0x69, 0xda, 0xf7, 0xb0, 0xff, 0xd6, 0xf7, 0x2a, 0xfa, + 0xa8, 0x60, 0x00, 0x20, 0x78, 0x60, 0x17, 0x99, 0x16, 0x98, 0xff, 0xf7, + 0xb0, 0xf8, 0x0c, 0x99, 0x28, 0x69, 0xca, 0x6d, 0x90, 0x42, 0x1b, 0xd2, + 0x43, 0xf2, 0x02, 0x10, 0x84, 0x42, 0x1c, 0xbf, 0x43, 0xf2, 0x03, 0x11, + 0x8c, 0x42, 0x0a, 0xd0, 0x43, 0xf2, 0x05, 0x10, 0x84, 0x42, 0x1f, 0xbf, + 0x4f, 0xf6, 0x70, 0x71, 0x8c, 0x42, 0x4f, 0xf6, 0x78, 0x70, 0x84, 0x42, + 0x08, 0xd1, 0x07, 0xf1, 0x4c, 0x00, 0x41, 0x68, 0x49, 0x1c, 0x41, 0x60, + 0x28, 0x69, 0x40, 0x1c, 0x28, 0x61, 0x3b, 0xe5, 0x0c, 0x99, 0x68, 0x69, + 0x8a, 0x6d, 0x90, 0x42, 0xbf, 0xf4, 0x1f, 0xad, 0x43, 0xf2, 0x09, 0x11, + 0x8c, 0x42, 0x7f, 0xf4, 0x1a, 0xad, 0x0c, 0x9a, 0xe9, 0x69, 0x53, 0x6e, + 0x99, 0x42, 0x07, 0xd2, 0x49, 0x1c, 0xe9, 0x61, 0x07, 0xf1, 0x4c, 0x00, + 0x01, 0x69, 0x49, 0x1c, 0x01, 0x61, 0x23, 0xe5, 0x40, 0x1c, 0x68, 0x61, + 0x00, 0x24, 0x07, 0xf1, 0x4c, 0x00, 0x81, 0x68, 0x49, 0x1c, 0x81, 0x60, + 0x16, 0x98, 0x17, 0x99, 0xfe, 0xf7, 0xe2, 0xfb, 0xec, 0x61, 0x16, 0xe5, + 0x14, 0xb9, 0x00, 0xf0, 0x19, 0xf8, 0x04, 0x46, 0x3c, 0x60, 0x64, 0x20, + 0x78, 0x60, 0x08, 0xb0, 0x20, 0x46, 0xbd, 0xec, 0x04, 0x8b, 0xbd, 0xe8, + 0xf2, 0x8f, 0x00, 0xee, 0x90, 0x0a, 0x20, 0xee, 0x28, 0x0a, 0xf8, 0xee, + 0x60, 0x0a, 0x00, 0xee, 0x88, 0x0a, 0x70, 0x47, 0x03, 0x22, 0x80, 0xec, + 0x02, 0x0a, 0x17, 0x99, 0x16, 0x98, 0x70, 0x47, 0x16, 0x99, 0x17, 0x98, + 0x00, 0x91, 0x01, 0x90, 0x3b, 0x46, 0x0c, 0x99, 0x2a, 0x46, 0x48, 0x46, + 0x1a, 0xe0, 0x00, 0x00, 0x38, 0xb5, 0x04, 0x46, 0x08, 0x46, 0x11, 0x46, + 0xfe, 0xf7, 0xb4, 0xfb, 0x00, 0x25, 0x00, 0x23, 0x00, 0x22, 0xe9, 0xb2, + 0x20, 0x46, 0xd9, 0xf7, 0x4b, 0xfa, 0x6d, 0x1c, 0x41, 0x2d, 0xf6, 0xd3, + 0x31, 0xbd, 0x0b, 0x46, 0x11, 0x46, 0x01, 0x28, 0x12, 0xbf, 0x02, 0x28, + 0x18, 0x46, 0xff, 0xf7, 0x2e, 0xb8, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, + 0x2d, 0xed, 0x02, 0x8b, 0x83, 0x46, 0x8a, 0x46, 0x86, 0xb0, 0x16, 0x78, + 0x9a, 0xf8, 0x13, 0x50, 0x30, 0x46, 0x00, 0xee, 0x10, 0x0a, 0x00, 0x24, + 0xb8, 0xee, 0x40, 0x8a, 0xae, 0x42, 0x9a, 0xed, 0x05, 0x0a, 0xac, 0xbf, + 0x77, 0x1b, 0x00, 0x27, 0x28, 0xee, 0x00, 0x0a, 0xbd, 0xf7, 0xec, 0xf8, + 0x00, 0xf0, 0x70, 0xf8, 0xc0, 0xb2, 0xf9, 0xb2, 0x88, 0x42, 0x38, 0xbf, + 0x10, 0xee, 0x10, 0x7a, 0xff, 0xb2, 0x02, 0x2f, 0x2e, 0xbf, 0x05, 0x97, + 0x01, 0x21, 0x05, 0x91, 0x9a, 0xed, 0x06, 0x0a, 0x28, 0xee, 0x00, 0x0a, + 0xdb, 0xf7, 0x56, 0xfb, 0xbd, 0xee, 0xc0, 0x0a, 0xad, 0x19, 0x10, 0xee, + 0x10, 0x1a, 0xe8, 0xb2, 0xc9, 0xb2, 0x88, 0x42, 0x38, 0xbf, 0x10, 0xee, + 0x10, 0x5a, 0xed, 0xb2, 0x40, 0x2d, 0x05, 0x9f, 0x28, 0xbf, 0x40, 0x25, + 0x1b, 0xe0, 0x00, 0x20, 0x03, 0x90, 0x02, 0x90, 0x04, 0xaa, 0x0d, 0xf1, + 0x12, 0x03, 0x01, 0x92, 0x00, 0x93, 0x13, 0x99, 0x12, 0x98, 0xfb, 0xb2, + 0x03, 0x22, 0xfe, 0xf7, 0x27, 0xfc, 0x04, 0x46, 0x00, 0xf0, 0x41, 0xf8, + 0xf9, 0xb2, 0x58, 0x46, 0xd9, 0xf7, 0xea, 0xf9, 0xb2, 0x45, 0x04, 0xbf, + 0xbd, 0xf9, 0x12, 0x80, 0xbd, 0xf9, 0x10, 0x90, 0x7f, 0x1c, 0x5f, 0xfa, + 0x87, 0xfa, 0x55, 0x45, 0x01, 0xdb, 0x00, 0x2c, 0xdd, 0xd0, 0x05, 0x9f, + 0x00, 0x26, 0x08, 0xe0, 0x0f, 0xfa, 0x89, 0xf3, 0x0f, 0xfa, 0x88, 0xf2, + 0xf1, 0xb2, 0x58, 0x46, 0xd9, 0xf7, 0xd2, 0xf9, 0x76, 0x1c, 0xf0, 0xb2, + 0xb8, 0x42, 0x0a, 0xda, 0x00, 0x2c, 0xf1, 0xd0, 0x07, 0xe0, 0x0f, 0xfa, + 0x89, 0xf3, 0x0f, 0xfa, 0x88, 0xf2, 0xe9, 0xb2, 0x58, 0x46, 0xd9, 0xf7, + 0xc3, 0xf9, 0x6d, 0x1c, 0xe8, 0xb2, 0x40, 0x28, 0x01, 0xd8, 0x00, 0x2c, + 0xf1, 0xd0, 0x08, 0x98, 0xa0, 0xf8, 0x18, 0x80, 0xa0, 0xf8, 0x1a, 0x90, + 0x06, 0xb0, 0x20, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, + 0xbd, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x70, 0x47, 0xbd, 0xf9, + 0x10, 0x30, 0xbd, 0xf9, 0x12, 0x20, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x43, + 0x2d, 0xed, 0x02, 0x8b, 0x8c, 0xb0, 0x0d, 0x46, 0x04, 0x46, 0x16, 0x46, + 0x69, 0x46, 0xcb, 0xf7, 0x75, 0xf9, 0x0d, 0xf1, 0x2a, 0x00, 0x0a, 0xa9, + 0x03, 0x90, 0x02, 0x91, 0x01, 0x23, 0xaa, 0x68, 0x00, 0x9f, 0x01, 0x92, + 0x00, 0x22, 0x28, 0x78, 0x00, 0x90, 0x01, 0x21, 0x20, 0x46, 0xea, 0xf7, + 0xbd, 0xf8, 0x80, 0x46, 0xbd, 0xf8, 0x28, 0x20, 0x00, 0x21, 0x20, 0x46, + 0xea, 0xf7, 0xf9, 0xf8, 0x08, 0xee, 0x10, 0x0a, 0xd5, 0xed, 0x01, 0x0a, + 0xf8, 0xee, 0x60, 0x0a, 0xb8, 0xee, 0x48, 0x1a, 0x60, 0xee, 0x81, 0x0a, + 0x9f, 0xed, 0xc0, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0xdb, 0xf7, 0xbc, 0xfa, + 0xfc, 0xee, 0xc0, 0x8a, 0x39, 0x46, 0x20, 0x46, 0xea, 0xf7, 0xd4, 0xf9, + 0x0a, 0x21, 0x00, 0x22, 0x08, 0x91, 0x07, 0x92, 0x03, 0x23, 0x81, 0x46, + 0x06, 0x93, 0x04, 0x93, 0x06, 0xf1, 0x20, 0x00, 0x00, 0x21, 0x4f, 0xf4, + 0x00, 0x12, 0x09, 0x90, 0x03, 0x91, 0x02, 0x92, 0x00, 0x23, 0x00, 0x91, + 0x01, 0x93, 0xcd, 0xed, 0x05, 0x8a, 0xb7, 0xee, 0x00, 0x1a, 0xdf, 0xed, + 0xb0, 0x0a, 0x9f, 0xed, 0xaf, 0x0a, 0x00, 0x22, 0x01, 0x21, 0x20, 0x46, + 0xea, 0xf7, 0x36, 0xfa, 0x06, 0xf1, 0x40, 0x00, 0x00, 0x21, 0x02, 0x90, + 0x01, 0x91, 0x00, 0x91, 0xbd, 0xf8, 0x28, 0x30, 0x2a, 0x78, 0x20, 0x46, + 0xea, 0xf7, 0xfe, 0xf8, 0x06, 0xf1, 0x50, 0x00, 0x00, 0x21, 0x02, 0x90, + 0xcd, 0xf8, 0x04, 0x90, 0x00, 0x91, 0xbd, 0xf8, 0x2a, 0x30, 0x2a, 0x78, + 0x01, 0x21, 0x20, 0x46, 0xea, 0xf7, 0xf0, 0xf8, 0x06, 0xf1, 0x60, 0x00, + 0x00, 0xf0, 0x68, 0xf8, 0x01, 0x22, 0x04, 0x93, 0x01, 0x92, 0x00, 0xf0, + 0x5d, 0xf8, 0x06, 0xf1, 0x78, 0x00, 0x00, 0x21, 0x07, 0x90, 0x06, 0x91, + 0x01, 0x22, 0x00, 0x23, 0x02, 0x91, 0x01, 0x91, 0x05, 0x92, 0x04, 0x93, + 0x03, 0x92, 0x00, 0xf0, 0x4f, 0xf8, 0x06, 0xf1, 0x90, 0x00, 0x07, 0x90, + 0x00, 0x21, 0x06, 0x91, 0x05, 0x91, 0x04, 0x91, 0x02, 0x91, 0x01, 0x20, + 0x03, 0x90, 0x01, 0x90, 0x00, 0x90, 0x3b, 0x46, 0x00, 0x22, 0x06, 0xf1, + 0x50, 0x01, 0x00, 0xf0, 0x40, 0xf8, 0x06, 0xf1, 0xa8, 0x00, 0x00, 0xf0, + 0x3f, 0xf8, 0x01, 0x91, 0x04, 0x93, 0x00, 0x93, 0x01, 0x22, 0x00, 0xf0, + 0x34, 0xf8, 0x06, 0xf1, 0x20, 0x01, 0x20, 0x46, 0xc0, 0x46, 0xc0, 0x46, + 0x34, 0x60, 0x18, 0xee, 0x90, 0x2a, 0xbd, 0xf8, 0x28, 0x00, 0xb0, 0x80, + 0xbd, 0xf8, 0x2a, 0x10, 0xf1, 0x80, 0x28, 0x78, 0x30, 0x72, 0x86, 0xed, + 0x03, 0x8a, 0xc6, 0xed, 0x04, 0x8a, 0xbd, 0xf8, 0x28, 0x10, 0x28, 0x78, + 0xea, 0xf7, 0x34, 0xfc, 0x86, 0xed, 0x05, 0x0a, 0xbd, 0xf8, 0x2a, 0x10, + 0x28, 0x78, 0x18, 0xee, 0x90, 0x2a, 0xea, 0xf7, 0x2b, 0xfc, 0x86, 0xed, + 0x06, 0x0a, 0xbd, 0xf8, 0x28, 0x10, 0x28, 0x78, 0x18, 0xee, 0x90, 0x2a, + 0xea, 0xf7, 0xee, 0xfb, 0x86, 0xed, 0x07, 0x0a, 0x0c, 0xb0, 0x40, 0x46, + 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x83, 0x00, 0x93, 0x06, 0xf1, + 0x40, 0x01, 0x20, 0x46, 0xea, 0xf7, 0x9d, 0xb8, 0x07, 0x90, 0x00, 0x21, + 0x01, 0x20, 0x06, 0x91, 0x05, 0x91, 0x00, 0x23, 0x03, 0x90, 0x02, 0x91, + 0x70, 0x47, 0x10, 0xb5, 0x04, 0x68, 0x01, 0x29, 0x07, 0xbf, 0x00, 0x21, + 0x01, 0x22, 0x01, 0x21, 0x00, 0x22, 0x80, 0xf8, 0x72, 0x20, 0x80, 0xf8, + 0x24, 0x10, 0x00, 0xf1, 0x20, 0x02, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, + 0x00, 0x23, 0x04, 0x21, 0xea, 0xf7, 0x49, 0xbe, 0x0a, 0x46, 0x04, 0x21, + 0xeb, 0xf7, 0x9a, 0xb8, 0xf8, 0xb5, 0x2d, 0xed, 0x06, 0x8b, 0x07, 0x46, + 0x8a, 0xb0, 0x0c, 0x46, 0x38, 0x68, 0x04, 0x21, 0xeb, 0xf7, 0x2b, 0xf9, + 0x05, 0x46, 0x4f, 0xf4, 0x00, 0x12, 0x29, 0x46, 0x01, 0x20, 0xea, 0xf7, + 0xfc, 0xf9, 0x06, 0x46, 0xf8, 0x68, 0x20, 0x60, 0x29, 0x46, 0x01, 0x20, + 0xea, 0xf7, 0x17, 0xfa, 0x02, 0x46, 0x62, 0x60, 0x38, 0x69, 0x82, 0x42, + 0x06, 0xd1, 0x97, 0xed, 0x05, 0x8a, 0xd7, 0xed, 0x06, 0xaa, 0x97, 0xed, + 0x07, 0xaa, 0x13, 0xe0, 0xb9, 0x88, 0x38, 0x7a, 0xea, 0xf7, 0xca, 0xfb, + 0x62, 0x68, 0xf9, 0x88, 0x38, 0x7a, 0xb0, 0xee, 0x40, 0x8a, 0xea, 0xf7, + 0xc3, 0xfb, 0x62, 0x68, 0xb9, 0x88, 0x38, 0x7a, 0xf0, 0xee, 0x40, 0xaa, + 0xea, 0xf7, 0x88, 0xfb, 0xb0, 0xee, 0x40, 0xaa, 0x02, 0xa8, 0x04, 0xa9, + 0x01, 0x90, 0x00, 0x91, 0x03, 0x23, 0x00, 0x22, 0x29, 0x46, 0x01, 0x20, + 0xea, 0xf7, 0x06, 0xfa, 0x06, 0xa8, 0x08, 0xa9, 0x01, 0x90, 0x00, 0x91, + 0x03, 0x23, 0x02, 0x22, 0x29, 0x46, 0x01, 0x20, 0xea, 0xf7, 0xfc, 0xf9, + 0x00, 0x22, 0x29, 0x46, 0x01, 0x20, 0xea, 0xf7, 0xe2, 0xf9, 0xf0, 0xf7, + 0x3d, 0xfc, 0x00, 0xee, 0x10, 0x0a, 0x20, 0xee, 0x0a, 0x0a, 0x84, 0xed, + 0x08, 0x0a, 0xb0, 0xee, 0x48, 0x0a, 0xbe, 0xf7, 0xc3, 0xfb, 0x00, 0xf0, + 0x61, 0xf8, 0x00, 0xf0, 0x6f, 0xf8, 0x28, 0x4f, 0x00, 0xf0, 0x70, 0xf8, + 0x00, 0xf0, 0x62, 0xf8, 0x00, 0xf0, 0x68, 0xf8, 0x00, 0xf0, 0x4a, 0xf8, + 0x00, 0xf0, 0x4e, 0xf8, 0x04, 0xf1, 0x08, 0x00, 0x80, 0xec, 0x02, 0x0a, + 0xb0, 0xee, 0x6a, 0x0a, 0xbe, 0xf7, 0xac, 0xfb, 0xdd, 0xe9, 0x06, 0x01, + 0x00, 0xf0, 0x4a, 0xf8, 0x00, 0xf0, 0x56, 0xf8, 0x00, 0xf0, 0x58, 0xf8, + 0xdd, 0xe9, 0x08, 0x01, 0x00, 0xf0, 0x4a, 0xf8, 0x00, 0xf0, 0x4e, 0xf8, + 0x00, 0xf0, 0x30, 0xf8, 0x00, 0xf0, 0x34, 0xf8, 0x04, 0xf1, 0x10, 0x00, + 0x02, 0xa9, 0x80, 0xec, 0x02, 0x0a, 0x00, 0x91, 0x04, 0xab, 0x00, 0x22, + 0x29, 0x46, 0x01, 0x20, 0xea, 0xf7, 0x09, 0xfa, 0xb0, 0xee, 0x4a, 0x0a, + 0xbe, 0xf7, 0x8a, 0xfb, 0x00, 0xf0, 0x28, 0xf8, 0x00, 0xf0, 0x36, 0xf8, + 0x00, 0xf0, 0x38, 0xf8, 0x00, 0xf0, 0x2a, 0xf8, 0x00, 0xf0, 0x30, 0xf8, + 0x00, 0xf0, 0x12, 0xf8, 0x00, 0xf0, 0x16, 0xf8, 0x04, 0xf1, 0x18, 0x00, + 0x80, 0xec, 0x02, 0x0a, 0x0a, 0xb0, 0x30, 0x46, 0xbd, 0xec, 0x06, 0x8b, + 0xf2, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x7a, 0x44, 0x00, 0x00, 0x00, 0x00, + 0xc8, 0x8d, 0x00, 0x21, 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, + 0xbe, 0xf7, 0x13, 0xbb, 0xb0, 0xee, 0x49, 0x1a, 0xf0, 0xee, 0x69, 0x1a, + 0xbe, 0xf7, 0x33, 0xbb, 0xdd, 0xe9, 0x02, 0x01, 0xb0, 0xee, 0x40, 0x9a, + 0xf0, 0xee, 0x60, 0x9a, 0xf0, 0xf7, 0xc8, 0xbb, 0xdd, 0xe9, 0x04, 0x01, + 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, 0x60, 0x8a, 0xf0, 0xf7, 0xc0, 0xbb, + 0x00, 0xee, 0x10, 0x0a, 0xbe, 0xf7, 0x4c, 0xbb, 0xb0, 0xee, 0x40, 0x1a, + 0xf0, 0xee, 0x60, 0x1a, 0x97, 0xec, 0x02, 0x0a, 0xbe, 0xf7, 0x17, 0xbb, + 0xe9, 0xf7, 0x88, 0xbd, 0x10, 0xb5, 0x04, 0x46, 0xe9, 0xf7, 0x97, 0xfd, + 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, 0x04, 0x21, 0xeb, 0xf7, 0x1a, 0xb8, + 0x0a, 0x46, 0x04, 0x21, 0xea, 0xf7, 0x2b, 0xbd, 0x04, 0x21, 0xea, 0xf7, + 0x3a, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x2d, 0xed, 0x04, 0x8b, 0x84, 0xb0, + 0x0f, 0x46, 0xff, 0x21, 0x00, 0x91, 0x04, 0x46, 0x16, 0x46, 0xcb, 0xf7, + 0x22, 0xfe, 0x97, 0xf9, 0x03, 0x10, 0x0d, 0x18, 0xfa, 0x2d, 0x28, 0xbf, + 0x43, 0xf2, 0x06, 0x10, 0x71, 0xd2, 0x69, 0x46, 0x20, 0x46, 0xd8, 0xf7, + 0x4c, 0xfc, 0x00, 0x28, 0x6b, 0xd1, 0x00, 0x98, 0xff, 0x28, 0x08, 0xbf, + 0x40, 0xf6, 0x07, 0x30, 0x65, 0xd0, 0x20, 0x46, 0xcb, 0xf7, 0xec, 0xfd, + 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x8a, 0x9f, 0xed, 0x77, 0x1a, + 0xd7, 0xed, 0x01, 0x0a, 0x81, 0xee, 0x08, 0x1a, 0x9f, 0xed, 0x75, 0x0a, + 0xf8, 0xee, 0x60, 0x0a, 0x21, 0xee, 0x00, 0x0a, 0x80, 0xee, 0x80, 0x0a, + 0xdb, 0xf7, 0xc8, 0xf8, 0x38, 0x78, 0x00, 0xee, 0x90, 0x0a, 0xf0, 0xee, + 0x40, 0x8a, 0xf8, 0xee, 0x60, 0x0a, 0x60, 0xee, 0x88, 0x0a, 0x9f, 0xed, + 0x6c, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0xdb, 0xf7, 0xb9, 0xf8, 0x78, 0x78, + 0xb0, 0xee, 0x40, 0x9a, 0x00, 0xf0, 0x3f, 0xf8, 0xdf, 0xed, 0x66, 0x0a, + 0x80, 0xee, 0x20, 0x0a, 0xdb, 0xf7, 0xae, 0xf8, 0xb8, 0x78, 0xf0, 0xee, + 0x40, 0x9a, 0x00, 0xf0, 0x34, 0xf8, 0xdf, 0xed, 0x62, 0x0a, 0x80, 0xee, + 0x20, 0x0a, 0xdb, 0xf7, 0xa3, 0xf8, 0x30, 0x88, 0xbd, 0xee, 0xc0, 0x0a, + 0x10, 0xee, 0x10, 0x1a, 0x08, 0x18, 0x30, 0x80, 0xbd, 0xee, 0xe9, 0x0a, + 0x10, 0xee, 0x10, 0x1a, 0xbd, 0xee, 0xc9, 0x0a, 0x80, 0xb2, 0x89, 0xb2, + 0x10, 0xee, 0x10, 0x2a, 0x10, 0xfa, 0x82, 0xf2, 0x90, 0xfb, 0xf1, 0xf3, + 0x01, 0xfb, 0x13, 0x21, 0xad, 0xf8, 0x04, 0x10, 0xfc, 0xee, 0xe8, 0x0a, + 0x8d, 0xf8, 0x06, 0x50, 0xcd, 0xed, 0x02, 0x0a, 0x20, 0x46, 0xda, 0xf7, + 0x7f, 0xfe, 0x00, 0x98, 0xda, 0xf7, 0x89, 0xfe, 0x00, 0x99, 0x01, 0xaa, + 0x20, 0x46, 0xda, 0xf7, 0x9f, 0xfe, 0x04, 0xb0, 0xbd, 0xec, 0x04, 0x8b, + 0xf2, 0xbd, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x20, 0xee, + 0x08, 0x0a, 0x70, 0x47, 0xda, 0xf7, 0xca, 0xbe, 0xda, 0xf7, 0xce, 0xbe, + 0x70, 0xb5, 0x2d, 0xed, 0x04, 0x8b, 0x8c, 0xb0, 0x05, 0x46, 0x16, 0x46, + 0x69, 0x46, 0xd8, 0xf7, 0xc6, 0xfb, 0x04, 0x00, 0x6d, 0xd1, 0x00, 0x99, + 0x02, 0xaa, 0x28, 0x46, 0xda, 0xf7, 0xd4, 0xfe, 0x04, 0x46, 0x28, 0x46, + 0xcb, 0xf7, 0x66, 0xfd, 0x30, 0x60, 0x28, 0x46, 0xcb, 0xf7, 0x6c, 0xfd, + 0x00, 0xee, 0x10, 0x0a, 0x86, 0xed, 0x01, 0x0a, 0x02, 0x98, 0x37, 0x4d, + 0x00, 0x02, 0x00, 0xee, 0x90, 0x0a, 0xc6, 0xed, 0x02, 0x0a, 0xb8, 0xee, + 0x60, 0x8a, 0xf8, 0xee, 0x40, 0x0a, 0x96, 0xed, 0x00, 0x0a, 0x68, 0xee, + 0x20, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0xca, 0xf7, + 0x17, 0xfc, 0xbc, 0xee, 0xc0, 0x0a, 0x86, 0xed, 0x03, 0x0a, 0xdd, 0xe9, + 0x04, 0x01, 0x9f, 0xed, 0x28, 0x0a, 0x28, 0xee, 0x00, 0x8a, 0xf0, 0xf7, + 0xcf, 0xfa, 0x00, 0xee, 0x90, 0x0a, 0xdd, 0xe9, 0x06, 0x01, 0x80, 0xee, + 0x88, 0x9a, 0xf0, 0xf7, 0xc7, 0xfa, 0x00, 0xee, 0x10, 0x0a, 0x80, 0xee, + 0x08, 0x0a, 0xbe, 0xf7, 0x51, 0xfa, 0x00, 0xf0, 0x4f, 0xf8, 0x00, 0xf0, + 0x45, 0xf8, 0x00, 0xf0, 0x3d, 0xf8, 0x06, 0xf1, 0x10, 0x00, 0x80, 0xec, + 0x02, 0x0a, 0x96, 0xed, 0x03, 0x0a, 0xdd, 0xe9, 0x08, 0x01, 0xb8, 0xee, + 0x40, 0x0a, 0xdf, 0xed, 0x17, 0x0a, 0x20, 0xee, 0x20, 0x8a, 0xf0, 0xf7, + 0xab, 0xfa, 0x00, 0xee, 0x10, 0x0a, 0xdd, 0xe9, 0x0a, 0x01, 0x80, 0xee, + 0x08, 0x9a, 0xf0, 0xf7, 0xa3, 0xfa, 0x00, 0xee, 0x90, 0x0a, 0x80, 0xee, + 0x88, 0x0a, 0xbe, 0xf7, 0x2d, 0xfa, 0x00, 0xf0, 0x2b, 0xf8, 0x00, 0xf0, + 0x21, 0xf8, 0x00, 0xf0, 0x19, 0xf8, 0x06, 0xf1, 0x18, 0x00, 0x80, 0xec, + 0x02, 0x0a, 0x0c, 0xb0, 0x20, 0x00, 0x18, 0xbf, 0x01, 0x20, 0xbd, 0xec, + 0x04, 0x8b, 0xc0, 0xb2, 0x70, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x43, + 0x00, 0x00, 0x7a, 0x44, 0x00, 0x24, 0x74, 0x49, 0x00, 0x00, 0x00, 0x48, + 0x00, 0x00, 0x80, 0x47, 0xc0, 0x8d, 0x00, 0x21, 0xb0, 0xee, 0x48, 0x1a, + 0xf0, 0xee, 0x68, 0x1a, 0xbe, 0xf7, 0xb5, 0xb9, 0xb0, 0xee, 0x40, 0x8a, + 0xf0, 0xee, 0x60, 0x8a, 0xb0, 0xee, 0x49, 0x0a, 0xbe, 0xf7, 0x00, 0xba, + 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x95, 0xec, 0x02, 0x0a, + 0xbe, 0xf7, 0xcb, 0xb9, 0x80, 0xb5, 0xcb, 0xf7, 0x32, 0xfe, 0x69, 0x46, + 0xdb, 0xf7, 0xb8, 0xf8, 0x9d, 0xf8, 0x00, 0x00, 0x02, 0xbd, 0xfe, 0xb5, + 0x05, 0x46, 0x69, 0x46, 0xd8, 0xf7, 0x1d, 0xfb, 0x08, 0xbb, 0x00, 0x98, + 0xff, 0x28, 0x02, 0xd1, 0x40, 0xf6, 0x07, 0x30, 0xfe, 0xbd, 0x28, 0x46, + 0xcb, 0xf7, 0xda, 0xfc, 0x04, 0x46, 0x00, 0x98, 0x29, 0x46, 0xcb, 0xf7, + 0xf2, 0xfd, 0x06, 0x46, 0x00, 0x98, 0xcb, 0xf7, 0xe1, 0xfd, 0x07, 0x46, + 0x01, 0xa9, 0x28, 0x46, 0xca, 0xf7, 0x32, 0xfe, 0x48, 0xb9, 0x01, 0x99, + 0x76, 0x18, 0xa4, 0x19, 0x94, 0xfb, 0xf7, 0xf1, 0x07, 0xfb, 0x11, 0x44, + 0x0c, 0xb1, 0x43, 0xf2, 0x07, 0x10, 0xfe, 0xbd, 0x2d, 0xe9, 0xf3, 0x4f, + 0xdf, 0xf8, 0x24, 0x84, 0x81, 0xb0, 0x40, 0x46, 0xc0, 0x46, 0xc0, 0x46, + 0x00, 0x25, 0xdf, 0xf8, 0x1c, 0xb4, 0xdf, 0xf8, 0x1c, 0x64, 0x28, 0x46, + 0xcb, 0xf7, 0x6a, 0xfe, 0x07, 0x46, 0x1c, 0x20, 0x68, 0x43, 0x34, 0x18, + 0x28, 0x20, 0xff, 0x21, 0x68, 0x43, 0x61, 0x60, 0x30, 0x44, 0xc4, 0xf8, + 0x08, 0x80, 0x00, 0xf5, 0x0d, 0x71, 0x00, 0x91, 0xe1, 0x60, 0x4f, 0xf4, + 0xa8, 0x70, 0x68, 0x43, 0x70, 0x22, 0x30, 0x44, 0x41, 0xf2, 0x68, 0x71, + 0x6a, 0x43, 0x00, 0xeb, 0x01, 0x09, 0x06, 0xeb, 0x02, 0x0a, 0xc4, 0xf8, + 0x10, 0x90, 0x0a, 0xf1, 0x74, 0x00, 0x60, 0x61, 0x40, 0xf2, 0x24, 0x52, + 0x02, 0x99, 0x4f, 0xf4, 0xc2, 0x70, 0x68, 0x43, 0x6a, 0x43, 0x08, 0x44, + 0x32, 0x44, 0xa0, 0x61, 0x02, 0xf5, 0x35, 0x71, 0xff, 0x2f, 0xe1, 0x61, + 0x0f, 0xd1, 0xcb, 0xf7, 0xe9, 0xfd, 0x00, 0x21, 0x23, 0x1d, 0x20, 0xfa, + 0x01, 0xf2, 0xd2, 0x07, 0x5c, 0xbf, 0xdb, 0xf8, 0x00, 0x20, 0x42, 0xf8, + 0x21, 0x30, 0x49, 0x1c, 0x08, 0x29, 0xf4, 0xd3, 0x07, 0xe0, 0xdb, 0xf8, + 0x00, 0x20, 0x20, 0x1d, 0x42, 0xf8, 0x27, 0x00, 0x38, 0x46, 0xbe, 0xf7, + 0x76, 0xf9, 0x01, 0x98, 0xf8, 0x40, 0xc1, 0x07, 0x16, 0xd5, 0x00, 0x20, + 0x70, 0x55, 0x38, 0x46, 0xd8, 0xf7, 0xaf, 0xfc, 0x02, 0x21, 0x38, 0x46, + 0xbc, 0xf7, 0x16, 0xfc, 0x00, 0x9a, 0x08, 0xf5, 0xa6, 0x71, 0x38, 0x46, + 0x00, 0xf0, 0xb2, 0xf9, 0x0a, 0xf1, 0x74, 0x03, 0x4a, 0x46, 0x08, 0xf5, + 0xb0, 0x71, 0x38, 0x46, 0xfe, 0xf7, 0x9a, 0xff, 0x6d, 0x1c, 0x04, 0x2d, + 0x97, 0xd3, 0xbd, 0xe8, 0xf7, 0x8f, 0x2d, 0xe9, 0xfe, 0x4f, 0x00, 0x24, + 0x88, 0x46, 0xa1, 0x46, 0x00, 0x25, 0xdf, 0xf8, 0x30, 0xa3, 0xdf, 0xf8, + 0x34, 0xb3, 0x02, 0x90, 0x02, 0x98, 0xe8, 0x40, 0xc1, 0x07, 0x3d, 0xd5, + 0x28, 0x46, 0xcb, 0xf7, 0xd3, 0xfd, 0x06, 0x46, 0xff, 0x2e, 0x37, 0xd0, + 0x94, 0xbb, 0x40, 0xf2, 0x24, 0x51, 0x71, 0x43, 0x4f, 0xf4, 0xc2, 0x70, + 0x59, 0x44, 0x28, 0x24, 0x70, 0x43, 0x01, 0xf5, 0x35, 0x72, 0x74, 0x43, + 0x08, 0xeb, 0x00, 0x07, 0x01, 0x92, 0x5c, 0x44, 0x00, 0x97, 0x53, 0x46, + 0x04, 0xf5, 0x0d, 0x72, 0x0a, 0xf5, 0xa6, 0x71, 0x28, 0x46, 0x00, 0xf0, + 0x82, 0xf9, 0x04, 0x00, 0x14, 0xd1, 0x70, 0x20, 0x4f, 0xf4, 0xa8, 0x71, + 0x70, 0x43, 0x71, 0x43, 0x58, 0x44, 0x59, 0x44, 0x41, 0xf2, 0x68, 0x72, + 0x01, 0x97, 0x00, 0xf1, 0x74, 0x03, 0x0a, 0x44, 0xcd, 0xf8, 0x00, 0xa0, + 0x0a, 0xf5, 0xb0, 0x71, 0x28, 0x46, 0xfe, 0xf7, 0x5c, 0xff, 0x04, 0x46, + 0x14, 0xb9, 0x01, 0x20, 0x0b, 0xf8, 0x06, 0x00, 0xb9, 0xf1, 0x00, 0x0f, + 0x08, 0xbf, 0xa1, 0x46, 0x6d, 0x1c, 0x08, 0x2d, 0xba, 0xd3, 0x48, 0x46, + 0xbd, 0xe8, 0xfe, 0x8f, 0xfe, 0xb5, 0x0c, 0x46, 0xe5, 0xf7, 0x96, 0xff, + 0x05, 0x46, 0xcb, 0xf7, 0x8b, 0xfd, 0x01, 0x46, 0x70, 0x23, 0xa3, 0x4a, + 0x50, 0x5c, 0x4b, 0x43, 0x13, 0x44, 0xd8, 0xb1, 0x40, 0xf2, 0x24, 0x50, + 0x48, 0x43, 0x10, 0x44, 0x9c, 0x4e, 0x00, 0x96, 0x00, 0xf5, 0x35, 0x77, + 0x4f, 0xf4, 0xc2, 0x70, 0x48, 0x43, 0x04, 0x44, 0x4f, 0xf4, 0xa8, 0x70, + 0x41, 0x43, 0x50, 0x18, 0x41, 0xf2, 0x68, 0x71, 0x42, 0x18, 0x02, 0x97, + 0x01, 0x94, 0x74, 0x33, 0x06, 0xf5, 0xb0, 0x71, 0x28, 0x46, 0xfe, 0xf7, + 0x3b, 0xff, 0xfe, 0xbd, 0x43, 0xf2, 0x01, 0x10, 0x58, 0x67, 0xfe, 0xbd, + 0x80, 0xb5, 0x00, 0xf0, 0x09, 0xf8, 0xd5, 0xf7, 0x1c, 0xfd, 0x02, 0xbd, + 0x80, 0xb5, 0x00, 0xf0, 0x03, 0xf8, 0xd5, 0xf7, 0x01, 0xfd, 0x02, 0xbd, + 0x00, 0x92, 0x0b, 0x46, 0x02, 0x46, 0x4f, 0xf4, 0xe6, 0x71, 0x86, 0x48, + 0x70, 0x47, 0xf8, 0xb5, 0x0c, 0x46, 0x16, 0x46, 0x1f, 0x46, 0xe5, 0xf7, + 0x53, 0xff, 0xcb, 0xf7, 0x49, 0xfd, 0x00, 0x25, 0xff, 0x28, 0x16, 0xd0, + 0x7f, 0xb9, 0x31, 0x68, 0x14, 0x29, 0x0f, 0xd3, 0x28, 0x21, 0x7f, 0x4b, + 0x48, 0x43, 0x18, 0x44, 0x00, 0xf5, 0x0d, 0x71, 0x14, 0x22, 0x20, 0x46, + 0xbd, 0xf7, 0xec, 0xf8, 0x14, 0x22, 0x32, 0x60, 0x07, 0xe0, 0x4f, 0xf6, + 0x2a, 0x75, 0x04, 0xe0, 0x4f, 0xf6, 0x26, 0x75, 0x01, 0xe0, 0x4f, 0xf6, + 0x52, 0x75, 0x28, 0x46, 0xf2, 0xbd, 0xf8, 0xb5, 0x0c, 0x46, 0x15, 0x46, + 0x1f, 0x46, 0xe5, 0xf7, 0x2d, 0xff, 0xcb, 0xf7, 0x23, 0xfd, 0x00, 0x26, + 0x08, 0x28, 0x1e, 0xd0, 0x70, 0x21, 0x6e, 0x4a, 0x48, 0x43, 0x10, 0x44, + 0x1f, 0xb1, 0x02, 0x2f, 0x0d, 0xd0, 0x0c, 0xd3, 0x0f, 0xe0, 0x00, 0xf1, + 0x74, 0x01, 0x14, 0x27, 0x28, 0x68, 0xb8, 0x42, 0x0c, 0xd3, 0x3a, 0x46, + 0x20, 0x46, 0xbd, 0xf7, 0xc1, 0xf8, 0x2f, 0x60, 0x0b, 0xe0, 0x00, 0xf1, + 0x74, 0x01, 0x70, 0x27, 0xf2, 0xe7, 0x4f, 0xf6, 0x2a, 0x76, 0x04, 0xe0, + 0x4f, 0xf6, 0x26, 0x76, 0x01, 0xe0, 0x4f, 0xf6, 0x52, 0x76, 0x30, 0x46, + 0xf2, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xfe, 0x43, 0x0c, 0x9f, 0x89, 0x46, + 0x16, 0x46, 0x1c, 0x46, 0xe5, 0xf7, 0xfc, 0xfe, 0x80, 0x46, 0xcb, 0xf7, + 0xf1, 0xfc, 0x4f, 0xf4, 0xc2, 0x71, 0x00, 0x25, 0x48, 0x43, 0x3f, 0x18, + 0xb9, 0xf1, 0x05, 0x0f, 0x4f, 0xf6, 0x61, 0x72, 0x50, 0x48, 0x09, 0xd8, + 0xdf, 0xe8, 0x09, 0xf0, 0x09, 0x03, 0x12, 0x1d, 0x2e, 0x5f, 0x01, 0x46, + 0x3a, 0x46, 0x40, 0x46, 0xff, 0xf7, 0x76, 0xfa, 0x6d, 0xe0, 0x01, 0x23, + 0x04, 0xb1, 0x33, 0x78, 0x01, 0x46, 0x3a, 0x46, 0x18, 0x46, 0xff, 0xf7, + 0x7e, 0xfa, 0x64, 0xe0, 0x04, 0x2c, 0x04, 0xd3, 0x32, 0x68, 0x39, 0x46, + 0xfe, 0xf7, 0x91, 0xfa, 0x5d, 0xe0, 0x39, 0x46, 0xfd, 0xf7, 0x1c, 0xfe, + 0x59, 0xe0, 0x04, 0x2c, 0x56, 0xd3, 0x77, 0x5f, 0xb6, 0xf9, 0x02, 0x40, + 0x8e, 0xbf, 0x30, 0x79, 0x40, 0x46, 0xff, 0xf7, 0xe3, 0xfc, 0x01, 0x46, + 0x23, 0x46, 0x3a, 0x46, 0x40, 0x46, 0xd8, 0xf7, 0xa9, 0xfc, 0x48, 0xe0, + 0x00, 0xf5, 0xd8, 0x73, 0xd3, 0xe9, 0x00, 0x01, 0x0a, 0x9f, 0xcd, 0xe9, + 0x00, 0x01, 0x3d, 0x60, 0x04, 0x2c, 0x24, 0xbf, 0x30, 0x68, 0x01, 0x90, + 0x0b, 0x98, 0x20, 0x28, 0x38, 0xd3, 0x40, 0x46, 0xff, 0xf7, 0xca, 0xfc, + 0x01, 0x46, 0x40, 0x46, 0xff, 0xf7, 0xc8, 0xfc, 0x32, 0x46, 0x69, 0x46, + 0x40, 0x46, 0xff, 0xf7, 0xd5, 0xfc, 0x05, 0x00, 0x2b, 0xd1, 0x01, 0x98, + 0x4f, 0xf4, 0x7a, 0x71, 0xb0, 0xfb, 0xf1, 0xf0, 0xc0, 0x1c, 0xda, 0xf7, + 0x65, 0xf9, 0x00, 0x21, 0x40, 0x46, 0xff, 0xf7, 0x59, 0xfd, 0x32, 0x46, + 0x69, 0x46, 0x40, 0x46, 0xff, 0xf7, 0x56, 0xfd, 0x20, 0x20, 0x38, 0x60, + 0x17, 0xe0, 0xac, 0xb1, 0x34, 0x78, 0x97, 0xf8, 0x7c, 0x21, 0x21, 0x46, + 0x00, 0xee, 0x10, 0x1a, 0x00, 0xee, 0x90, 0x2a, 0xb8, 0xee, 0x40, 0x0a, + 0xf8, 0xee, 0x60, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0x07, 0xf1, 0x70, 0x01, + 0x8c, 0x30, 0xfe, 0xf7, 0xf8, 0xfd, 0x87, 0xf8, 0x7c, 0x41, 0x00, 0xe0, + 0x15, 0x46, 0x28, 0x46, 0xbd, 0xe8, 0xfe, 0x83, 0x38, 0xb5, 0x12, 0x49, + 0x09, 0x68, 0x51, 0xf8, 0x20, 0x50, 0x28, 0x68, 0x08, 0x28, 0x1a, 0xd2, + 0x51, 0xf8, 0x20, 0x40, 0xac, 0xb1, 0xa9, 0x68, 0xa0, 0x68, 0x28, 0x22, + 0xbd, 0xf7, 0x1e, 0xf8, 0xe9, 0x68, 0xe0, 0x68, 0x4f, 0xf4, 0xa8, 0x72, + 0xbd, 0xf7, 0x18, 0xf8, 0x29, 0x69, 0x20, 0x69, 0x70, 0x22, 0xbd, 0xf7, + 0x13, 0xf8, 0x69, 0x69, 0x60, 0x69, 0x4f, 0xf4, 0xc2, 0x72, 0xbd, 0xf7, + 0x0d, 0xf8, 0xff, 0x20, 0x28, 0x60, 0x31, 0xbd, 0xd8, 0x8d, 0x00, 0x21, + 0x80, 0x04, 0x00, 0x01, 0x28, 0x01, 0x02, 0x21, 0x10, 0xb5, 0x14, 0x46, + 0x28, 0x21, 0x20, 0x46, 0xcf, 0xf7, 0xb8, 0xf9, 0x20, 0x46, 0xe5, 0xf7, + 0x21, 0xfe, 0x00, 0x20, 0x10, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, 0x2d, 0xed, + 0x02, 0x8b, 0xc4, 0xb0, 0x82, 0x46, 0x17, 0x46, 0x01, 0x26, 0x0c, 0x46, + 0x98, 0x46, 0x8d, 0xf8, 0x00, 0x60, 0x38, 0x46, 0xe5, 0xf7, 0x17, 0xfe, + 0x01, 0x21, 0x50, 0x46, 0xbc, 0xf7, 0x40, 0xfa, 0x00, 0x23, 0x07, 0x22, + 0x01, 0x21, 0x50, 0x46, 0xd8, 0xf7, 0x4c, 0xf8, 0x05, 0x00, 0x05, 0xd1, + 0x00, 0xf0, 0x3c, 0xf9, 0x50, 0x46, 0xe9, 0xf7, 0xba, 0xf8, 0x05, 0x46, + 0xdd, 0xf8, 0x40, 0x91, 0x00, 0x21, 0x50, 0x46, 0xff, 0xf7, 0x36, 0xfc, + 0x01, 0x22, 0x01, 0x21, 0x50, 0x46, 0xd6, 0xf7, 0x9a, 0xfb, 0x49, 0x46, + 0x40, 0x46, 0xfd, 0xf7, 0x59, 0xfd, 0xd5, 0xf7, 0x53, 0xfb, 0x06, 0x90, + 0x83, 0x46, 0x12, 0xaa, 0x04, 0xf1, 0x08, 0x01, 0x50, 0x46, 0xff, 0xf7, + 0x45, 0xfa, 0x07, 0x94, 0x2c, 0x46, 0x00, 0x2c, 0x40, 0xf0, 0x9e, 0x80, + 0x07, 0x98, 0x90, 0xed, 0x00, 0x8a, 0x00, 0x23, 0x00, 0x22, 0x49, 0x46, + 0x40, 0x46, 0xfd, 0xf7, 0xb9, 0xfd, 0xb4, 0xee, 0x40, 0x8a, 0xf1, 0xee, + 0x10, 0xfa, 0x28, 0xd5, 0x07, 0x99, 0x38, 0x69, 0x49, 0x68, 0xb0, 0xfb, + 0xf1, 0xf2, 0x01, 0xfb, 0x12, 0x00, 0xe0, 0xb9, 0x01, 0x2e, 0x03, 0xd1, + 0x02, 0x26, 0x01, 0x25, 0x01, 0x22, 0x02, 0xe0, 0x01, 0x26, 0x01, 0x25, + 0x00, 0x22, 0x01, 0x21, 0x50, 0x46, 0xd8, 0xf7, 0x5f, 0xf8, 0x04, 0x00, + 0x04, 0xd1, 0x01, 0x21, 0x12, 0xa8, 0xff, 0xf7, 0xfe, 0xfa, 0x04, 0x46, + 0x6c, 0xb9, 0x41, 0xf2, 0x88, 0x31, 0x50, 0x46, 0xff, 0xf7, 0x0c, 0xfb, + 0x00, 0x28, 0x5a, 0xd0, 0x62, 0xe0, 0x01, 0x25, 0x02, 0x2e, 0xe7, 0xd1, + 0xe2, 0xe7, 0x00, 0x25, 0x5e, 0xe0, 0x00, 0x2c, 0x5c, 0xd1, 0x05, 0xab, + 0x0d, 0xf1, 0x16, 0x02, 0x00, 0x21, 0x50, 0x46, 0xd8, 0xf7, 0xec, 0xfb, + 0xd5, 0xf7, 0x02, 0xfb, 0x04, 0x46, 0x21, 0x46, 0x58, 0x46, 0xd5, 0xf7, + 0x41, 0xfb, 0x02, 0x46, 0x49, 0x46, 0x40, 0x46, 0xfe, 0xf7, 0x6d, 0xf9, + 0xbd, 0xf9, 0x14, 0x00, 0xbd, 0xf9, 0x16, 0x10, 0x04, 0x94, 0x03, 0x90, + 0x02, 0x91, 0x01, 0x96, 0x00, 0x22, 0x00, 0x92, 0x00, 0x23, 0x51, 0x98, + 0x08, 0xa9, 0xbd, 0xf7, 0x2c, 0xff, 0xbd, 0xf9, 0x14, 0x00, 0xbd, 0xf9, + 0x16, 0x10, 0x04, 0x90, 0x00, 0x22, 0x08, 0xa8, 0x03, 0x91, 0x02, 0x92, + 0x01, 0x90, 0x00, 0x23, 0x00, 0x93, 0x32, 0x46, 0x49, 0x46, 0x40, 0x46, + 0xfd, 0xf7, 0x90, 0xfe, 0xa3, 0x46, 0x04, 0x00, 0x0e, 0xd1, 0x00, 0x20, + 0x05, 0xaa, 0x0d, 0xf1, 0x16, 0x03, 0x03, 0x90, 0x01, 0x92, 0x00, 0x93, + 0x02, 0x95, 0x00, 0x23, 0x00, 0x22, 0x49, 0x46, 0x40, 0x46, 0xfd, 0xf7, + 0x9f, 0xfd, 0x04, 0x46, 0x3c, 0xb9, 0xbd, 0xf9, 0x14, 0x30, 0xbd, 0xf9, + 0x16, 0x20, 0x00, 0x21, 0x50, 0x46, 0xd8, 0xf7, 0x5f, 0xfb, 0x38, 0x69, + 0x40, 0x1c, 0x38, 0x61, 0x0a, 0xe0, 0x08, 0xa9, 0x12, 0xa8, 0xff, 0xf7, + 0xaf, 0xfa, 0x18, 0xb9, 0x09, 0x98, 0x16, 0x99, 0x88, 0x42, 0xa2, 0xd2, + 0x40, 0xf6, 0x01, 0x34, 0x50, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0x00, 0x2d, + 0x7f, 0xf4, 0x5f, 0xaf, 0x56, 0x46, 0x42, 0x46, 0x4b, 0x46, 0x24, 0xb9, + 0x39, 0x46, 0x30, 0x46, 0x00, 0xf0, 0x36, 0xf8, 0x04, 0x46, 0x01, 0x20, + 0x8d, 0xf8, 0x00, 0x00, 0x00, 0x22, 0x01, 0x21, 0x30, 0x46, 0xd7, 0xf7, + 0xd3, 0xff, 0x82, 0x46, 0x00, 0x23, 0x07, 0x22, 0x01, 0x21, 0x30, 0x46, + 0xd7, 0xf7, 0x8a, 0xff, 0x05, 0x46, 0x00, 0xf0, 0x61, 0xf8, 0x30, 0x46, + 0xe9, 0xf7, 0x09, 0xf8, 0x44, 0xb9, 0xba, 0xf1, 0x00, 0x0f, 0x18, 0xbf, + 0x54, 0x46, 0x03, 0xd1, 0x00, 0x2d, 0x14, 0xbf, 0x2c, 0x46, 0x04, 0x46, + 0x00, 0x22, 0x00, 0x21, 0x30, 0x46, 0xd6, 0xf7, 0xbc, 0xfa, 0xd5, 0xf7, + 0x79, 0xfa, 0x01, 0x46, 0x06, 0x98, 0xd5, 0xf7, 0xb9, 0xfa, 0x78, 0x62, + 0x21, 0x46, 0x38, 0x46, 0xe5, 0xf7, 0x15, 0xfd, 0x44, 0xb0, 0x20, 0x46, + 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, 0x2d, 0xe9, 0xf8, 0x41, + 0x85, 0xb0, 0x05, 0x46, 0x0e, 0x46, 0x00, 0x20, 0x04, 0xac, 0x03, 0x90, + 0x02, 0x90, 0x01, 0x94, 0x0d, 0xf1, 0x12, 0x01, 0x00, 0x91, 0x17, 0x46, + 0x98, 0x46, 0x00, 0x23, 0x00, 0x22, 0x41, 0x46, 0x38, 0x46, 0xfd, 0xf7, + 0x2d, 0xfd, 0x04, 0x00, 0x22, 0xd1, 0x00, 0x22, 0x41, 0x46, 0x38, 0x46, + 0xfd, 0xf7, 0xef, 0xfc, 0x06, 0xf1, 0x14, 0x00, 0x00, 0x23, 0x80, 0xec, + 0x02, 0x0a, 0xbd, 0xf8, 0x12, 0x10, 0xb1, 0x83, 0x00, 0x22, 0xbd, 0xf8, + 0x10, 0x00, 0xf0, 0x83, 0x41, 0x46, 0x38, 0x46, 0xfd, 0xf7, 0xba, 0xfc, + 0x86, 0xed, 0x08, 0x0a, 0x00, 0x26, 0xbd, 0xf9, 0x10, 0x30, 0xbd, 0xf9, + 0x12, 0x20, 0xf1, 0xb2, 0x28, 0x46, 0xd8, 0xf7, 0xd5, 0xfa, 0x76, 0x1c, + 0x41, 0x2e, 0xf4, 0xd3, 0x20, 0x46, 0x06, 0xb0, 0xbd, 0xe8, 0xf0, 0x81, + 0x6b, 0x46, 0x07, 0x22, 0x01, 0x21, 0x70, 0x47, 0x2d, 0xe9, 0xf8, 0x4f, + 0x2d, 0xed, 0x02, 0x8b, 0x0d, 0x46, 0x8c, 0xb0, 0xec, 0x68, 0x2f, 0x69, + 0xae, 0x68, 0x80, 0x46, 0x00, 0xf0, 0xee, 0xfb, 0x5f, 0xea, 0x00, 0x09, + 0x3a, 0xd1, 0x04, 0xf1, 0x08, 0x0a, 0x00, 0x20, 0x00, 0x21, 0x9a, 0xed, + 0x00, 0x0a, 0xd6, 0xed, 0x08, 0x0a, 0x38, 0x60, 0x79, 0x60, 0x00, 0x22, + 0x04, 0xf1, 0x88, 0x00, 0xb8, 0xee, 0x40, 0x0a, 0xca, 0xf8, 0x7c, 0x20, + 0x60, 0xee, 0x20, 0x0a, 0x9f, 0xed, 0x17, 0x1a, 0x01, 0x60, 0x42, 0x60, + 0x81, 0x60, 0x41, 0x62, 0x82, 0x62, 0x80, 0xee, 0x81, 0x8a, 0xd5, 0xf7, + 0xfb, 0xf9, 0xca, 0xf8, 0x04, 0x00, 0x00, 0x20, 0x96, 0xed, 0x09, 0x0a, + 0x38, 0xee, 0x00, 0x0a, 0x8a, 0xed, 0x08, 0x0a, 0xd6, 0xed, 0x0a, 0x0a, + 0x78, 0xee, 0x20, 0x0a, 0xca, 0xed, 0x09, 0x0a, 0x96, 0xed, 0x0b, 0x0a, + 0x38, 0xee, 0x00, 0x0a, 0x8a, 0xed, 0x0a, 0x0a, 0xd6, 0xed, 0x0c, 0x0a, + 0x78, 0xee, 0x20, 0x0a, 0xca, 0xed, 0x0b, 0x0a, 0x84, 0xf8, 0xb4, 0x00, + 0x04, 0xf1, 0x80, 0x02, 0x04, 0xf1, 0x38, 0x00, 0x04, 0x92, 0x03, 0x90, + 0xd8, 0xe0, 0x00, 0xbf, 0x00, 0x00, 0x7a, 0x44, 0x88, 0x78, 0x00, 0x28, + 0x1a, 0xd0, 0xd8, 0x69, 0x40, 0x1c, 0xd8, 0x61, 0x88, 0x78, 0x01, 0x28, + 0x02, 0xd1, 0x58, 0x6b, 0x40, 0x1c, 0x58, 0x63, 0x88, 0x78, 0x02, 0x28, + 0x02, 0xd1, 0x98, 0x6b, 0x40, 0x1c, 0x98, 0x63, 0x88, 0x78, 0x03, 0x28, + 0x02, 0xd1, 0xd8, 0x6b, 0x40, 0x1c, 0xd8, 0x63, 0x88, 0x78, 0x04, 0x28, + 0x72, 0xd1, 0x18, 0x6c, 0x40, 0x1c, 0x18, 0x64, 0x6e, 0xe0, 0x89, 0xed, + 0x09, 0x1a, 0xc9, 0xed, 0x08, 0x1a, 0x89, 0xed, 0x07, 0x2a, 0xc9, 0xed, + 0x06, 0x2a, 0x89, 0xed, 0x05, 0x0a, 0xbd, 0xf7, 0x1f, 0xfe, 0x99, 0xed, + 0x06, 0x0a, 0xd9, 0xed, 0x0a, 0x0a, 0x99, 0xed, 0x07, 0x1a, 0x20, 0xee, + 0x20, 0x0a, 0xd9, 0xed, 0x0b, 0x0a, 0x01, 0xee, 0x20, 0x0a, 0x99, 0xed, + 0x08, 0x1a, 0xd9, 0xed, 0x0c, 0x0a, 0x01, 0xee, 0x20, 0x0a, 0x99, 0xed, + 0x09, 0x1a, 0xd9, 0xed, 0x0d, 0x0a, 0x04, 0x46, 0x01, 0xee, 0x20, 0x0a, + 0xbd, 0xf7, 0x04, 0xfe, 0x84, 0x42, 0x21, 0xd2, 0xa0, 0xeb, 0x04, 0x0b, + 0x00, 0x98, 0x41, 0x69, 0x83, 0x69, 0x8b, 0x45, 0x38, 0xbf, 0x8b, 0x46, + 0x5b, 0x45, 0x88, 0xbf, 0x5b, 0x46, 0xab, 0xb1, 0xf8, 0x6a, 0x40, 0x1c, + 0xf8, 0x62, 0x02, 0x9a, 0x06, 0x99, 0x40, 0x46, 0x00, 0xf0, 0x44, 0xfd, + 0x02, 0x99, 0x40, 0x46, 0x00, 0xf0, 0x75, 0xfd, 0x01, 0x90, 0x38, 0xb9, + 0x05, 0x99, 0x40, 0x46, 0x00, 0xf0, 0x74, 0xfd, 0x10, 0xb1, 0x38, 0x6b, + 0x40, 0x1c, 0x38, 0x63, 0xd5, 0xf7, 0x68, 0xf9, 0xc9, 0xf8, 0x0c, 0x00, + 0xdd, 0xf8, 0x04, 0x90, 0x29, 0x46, 0x40, 0x46, 0x01, 0xf0, 0x4e, 0xf8, + 0x2b, 0x69, 0x5c, 0x6c, 0xea, 0x68, 0x6f, 0x68, 0xd5, 0xf8, 0x20, 0xe0, + 0x64, 0x1c, 0x04, 0xf0, 0x03, 0x04, 0x28, 0x20, 0x01, 0x21, 0x10, 0xfb, + 0x04, 0xf0, 0x59, 0x61, 0x18, 0x44, 0xb9, 0xf1, 0x00, 0x0f, 0x00, 0xf1, + 0x48, 0x0b, 0x02, 0xf1, 0x80, 0x01, 0x3f, 0xf4, 0x75, 0xaf, 0x98, 0x69, + 0x40, 0x1c, 0x98, 0x61, 0x4e, 0x69, 0x88, 0x69, 0x86, 0x19, 0x1e, 0x62, + 0x08, 0x6a, 0xce, 0x69, 0x86, 0x19, 0x1e, 0x63, 0x88, 0x6a, 0x4e, 0x6a, + 0x86, 0x19, 0xde, 0x62, 0xc3, 0xf8, 0x00, 0x90, 0xde, 0x68, 0x76, 0x1c, + 0xde, 0x60, 0x50, 0x69, 0xc3, 0xf8, 0xe8, 0x00, 0x16, 0x69, 0xcb, 0xf8, + 0x08, 0x60, 0x08, 0x78, 0x01, 0x28, 0x2b, 0xd1, 0x18, 0x69, 0x40, 0x1c, + 0x18, 0x61, 0x11, 0x68, 0xcb, 0xf8, 0x00, 0x10, 0x92, 0xf8, 0xb4, 0x00, + 0x01, 0x28, 0x04, 0xbf, 0x50, 0x68, 0xcb, 0xf8, 0x04, 0x00, 0x01, 0x21, + 0x92, 0xf8, 0x3a, 0x00, 0x82, 0xf8, 0xb4, 0x10, 0x8b, 0xf8, 0x0c, 0x00, + 0x97, 0xed, 0x04, 0x0a, 0xde, 0xed, 0x30, 0x0a, 0x60, 0xee, 0x20, 0x0a, + 0xcb, 0xed, 0x04, 0x0a, 0x10, 0x6e, 0xcb, 0xf8, 0x14, 0x00, 0x39, 0x68, + 0xcb, 0xf8, 0x18, 0x10, 0x78, 0x68, 0xcb, 0xf8, 0x1c, 0x00, 0xb9, 0x69, + 0xcb, 0xf8, 0x20, 0x10, 0xf8, 0x69, 0xcb, 0xf8, 0x24, 0x00, 0x5c, 0x64, + 0x00, 0x21, 0x59, 0x61, 0xe5, 0xf7, 0xb0, 0xfb, 0x00, 0x28, 0x08, 0xbf, + 0xb9, 0xf1, 0x00, 0x0f, 0x40, 0xf0, 0x5a, 0x82, 0x03, 0x99, 0x08, 0x70, + 0x00, 0x22, 0x03, 0x98, 0x02, 0x74, 0x04, 0x98, 0x02, 0x70, 0x04, 0x99, + 0x8a, 0x70, 0x01, 0x21, 0xa8, 0x68, 0x01, 0x90, 0xd0, 0xf8, 0x00, 0xb0, + 0xee, 0x68, 0xd5, 0xf8, 0x18, 0xa0, 0x40, 0x46, 0x00, 0xf0, 0xcd, 0xfa, + 0x00, 0x20, 0x86, 0xf8, 0x38, 0x00, 0x06, 0xf1, 0x84, 0x04, 0x0c, 0xe0, + 0x02, 0x28, 0x3c, 0xd0, 0x06, 0xf1, 0x3c, 0x02, 0x51, 0x46, 0x40, 0x46, + 0x01, 0xf0, 0x62, 0xf9, 0x00, 0x28, 0x4d, 0xd0, 0x00, 0x20, 0x86, 0xf8, + 0xb4, 0x00, 0x0d, 0xf1, 0x01, 0x03, 0xef, 0x68, 0x6a, 0x46, 0x0d, 0xf1, + 0x02, 0x01, 0x40, 0x46, 0x00, 0xf0, 0xd1, 0xfd, 0x9d, 0xf8, 0x00, 0x10, + 0x40, 0x46, 0x00, 0xf0, 0xe4, 0xfd, 0x07, 0xf1, 0x39, 0x00, 0x9d, 0xf8, + 0x02, 0x10, 0x01, 0x70, 0x9d, 0xf8, 0x00, 0x20, 0x42, 0x70, 0x9d, 0xf8, + 0x01, 0x10, 0x81, 0x70, 0x40, 0x46, 0x51, 0x46, 0x01, 0xf0, 0x21, 0xf9, + 0x59, 0x46, 0x40, 0x46, 0x01, 0xf0, 0x37, 0xf9, 0x01, 0x28, 0xcf, 0xd1, + 0x86, 0xf8, 0x82, 0x00, 0x00, 0x21, 0x20, 0x68, 0x40, 0x1c, 0x20, 0x60, + 0x86, 0xf8, 0xb4, 0x10, 0x01, 0x9a, 0xd1, 0x68, 0x81, 0x42, 0x1e, 0xd2, + 0x43, 0xf2, 0x01, 0x09, 0x1b, 0xe0, 0x00, 0x20, 0x86, 0xf8, 0x38, 0x00, + 0x21, 0x69, 0x49, 0x1c, 0x21, 0x61, 0x86, 0xf8, 0xb4, 0x00, 0x40, 0x46, + 0x00, 0xf0, 0x89, 0xfd, 0x01, 0x28, 0x02, 0xd1, 0xa0, 0x69, 0x40, 0x1c, + 0xa0, 0x61, 0x40, 0x46, 0x00, 0xf0, 0x8b, 0xfd, 0x01, 0x28, 0x06, 0xd1, + 0x20, 0x6a, 0x40, 0x1c, 0x20, 0x62, 0x02, 0xe0, 0x01, 0x20, 0x86, 0xf8, + 0x38, 0x00, 0x03, 0x99, 0x08, 0x78, 0x00, 0x28, 0x61, 0xd0, 0xb9, 0xf1, + 0x00, 0x0f, 0x5e, 0xd1, 0xd5, 0xf8, 0x0c, 0xa0, 0xd5, 0xf8, 0x1c, 0x90, + 0xac, 0x68, 0x2e, 0x6a, 0x0a, 0xf1, 0x4c, 0x01, 0x02, 0x91, 0x0a, 0xf1, + 0x40, 0x0b, 0xea, 0x6a, 0x01, 0x92, 0x67, 0x68, 0xd5, 0xf7, 0x6a, 0xf8, + 0x00, 0x21, 0x8b, 0xf8, 0x08, 0x10, 0x00, 0x90, 0x0a, 0xf1, 0x3c, 0x03, + 0x32, 0x46, 0x49, 0x46, 0x40, 0x46, 0x00, 0xf0, 0x3d, 0xfb, 0x31, 0x46, + 0x40, 0x46, 0x00, 0xf0, 0x5c, 0xfc, 0x5f, 0xea, 0x00, 0x09, 0x31, 0xd1, + 0x39, 0x46, 0x40, 0x46, 0x00, 0xf0, 0x5a, 0xfc, 0x48, 0xb9, 0x02, 0x9a, + 0x31, 0x46, 0x40, 0x46, 0x00, 0xf0, 0x58, 0xfc, 0x30, 0xbb, 0x01, 0x20, + 0x8b, 0xf8, 0x08, 0x00, 0x2d, 0xe0, 0x01, 0x28, 0x0a, 0xf1, 0x88, 0x06, + 0x0b, 0xd1, 0x02, 0x20, 0x8a, 0xf8, 0x82, 0x00, 0x30, 0x68, 0x40, 0x1c, + 0x30, 0x60, 0xe1, 0x68, 0x81, 0x42, 0x15, 0xd2, 0x43, 0xf2, 0x02, 0x09, + 0x12, 0xe0, 0x30, 0x69, 0x40, 0x1c, 0x30, 0x61, 0x40, 0x46, 0x00, 0xf0, + 0x2a, 0xfd, 0x01, 0x28, 0x02, 0xd1, 0xb0, 0x69, 0x40, 0x1c, 0xb0, 0x61, + 0x40, 0x46, 0x00, 0xf0, 0x2c, 0xfd, 0x01, 0x28, 0x02, 0xd1, 0x30, 0x6a, + 0x40, 0x1c, 0x30, 0x62, 0x9b, 0xf8, 0x08, 0x00, 0x38, 0xb9, 0xd5, 0xf7, + 0x21, 0xf8, 0x01, 0x46, 0x01, 0x98, 0x9b, 0xed, 0x00, 0x0a, 0x01, 0xf0, + 0x93, 0xf9, 0x03, 0x99, 0x08, 0x7c, 0x00, 0x28, 0x00, 0xf0, 0x8f, 0x80, + 0xb9, 0xf1, 0x00, 0x0f, 0x79, 0xd1, 0x2c, 0x68, 0x6e, 0x68, 0xa8, 0x68, + 0x05, 0x90, 0xd5, 0xf8, 0x0c, 0xa0, 0xa9, 0x6a, 0x07, 0x91, 0x0a, 0xf1, + 0x3a, 0x01, 0xea, 0x6a, 0x06, 0x92, 0x40, 0x46, 0x4a, 0x78, 0x8d, 0xf8, + 0x09, 0x20, 0x0a, 0xf1, 0x80, 0x07, 0x09, 0x78, 0x8d, 0xf8, 0x08, 0x10, + 0xea, 0x69, 0x0a, 0x92, 0x29, 0x6a, 0x09, 0x91, 0x02, 0x21, 0x00, 0xf0, + 0xe2, 0xf9, 0xd4, 0xf7, 0xf5, 0xff, 0x83, 0x46, 0xda, 0xf8, 0x00, 0x00, + 0x59, 0x46, 0xd5, 0xf7, 0x33, 0xf8, 0xca, 0xf8, 0x04, 0x00, 0x0a, 0xf1, + 0x4c, 0x03, 0x05, 0x99, 0x0a, 0x69, 0x90, 0x42, 0x88, 0xbf, 0x10, 0x46, + 0x08, 0x90, 0xca, 0xf8, 0x00, 0xb0, 0x00, 0x20, 0x38, 0x70, 0x32, 0x46, + 0x21, 0x46, 0x40, 0x46, 0xf7, 0xf7, 0x04, 0xfc, 0xb8, 0xb3, 0x08, 0x98, + 0x9d, 0xf8, 0x08, 0x10, 0x01, 0x90, 0x00, 0x91, 0x0a, 0xf1, 0x4c, 0x03, + 0x32, 0x46, 0x21, 0x46, 0x40, 0x46, 0xf7, 0xf7, 0x40, 0xfc, 0x10, 0xb1, + 0x01, 0x28, 0x28, 0xd0, 0x32, 0xe0, 0x01, 0x20, 0x38, 0x70, 0x07, 0x98, + 0x01, 0xf0, 0xce, 0xf9, 0x32, 0x46, 0x21, 0x46, 0x40, 0x46, 0xf8, 0xf7, + 0x57, 0xf8, 0x03, 0x46, 0x00, 0xf1, 0x1c, 0x02, 0x9d, 0xf8, 0x09, 0x10, + 0x40, 0x46, 0x01, 0xf0, 0xea, 0xf9, 0x9d, 0xf8, 0x09, 0x10, 0x07, 0x98, + 0x01, 0xf0, 0xbf, 0xf9, 0xcd, 0xf8, 0x00, 0xb0, 0x09, 0x9a, 0x0a, 0x99, + 0xd6, 0xed, 0x07, 0x0a, 0x96, 0xed, 0x03, 0x0a, 0x0a, 0xf1, 0x4c, 0x03, + 0x40, 0x46, 0x00, 0xf0, 0xd4, 0xfc, 0x00, 0x20, 0x78, 0x60, 0xb8, 0x60, + 0xf8, 0x60, 0x38, 0x78, 0x98, 0xb1, 0x9d, 0xf8, 0x08, 0x20, 0x06, 0x98, + 0x5b, 0x46, 0x0a, 0xf1, 0x4c, 0x01, 0x01, 0xf0, 0xf4, 0xf8, 0x10, 0xe0, + 0x03, 0x20, 0xb8, 0x70, 0xf8, 0x68, 0x40, 0x1c, 0xf8, 0x60, 0x05, 0x99, + 0xca, 0x68, 0x82, 0x42, 0xeb, 0xd2, 0x43, 0xf2, 0x03, 0x09, 0x06, 0x98, + 0x9a, 0xed, 0x10, 0x0a, 0x59, 0x46, 0x01, 0xf0, 0xff, 0xf8, 0x04, 0x99, + 0x88, 0x78, 0x00, 0x28, 0x4c, 0xd1, 0xb9, 0xf1, 0x00, 0x0f, 0x62, 0xd1, + 0xd5, 0xf8, 0x0c, 0xb0, 0xac, 0x68, 0x68, 0x68, 0x01, 0x90, 0x2e, 0x68, + 0xd5, 0xf8, 0x28, 0xa0, 0x04, 0x21, 0x40, 0x46, 0x00, 0xf0, 0x5f, 0xf9, + 0x0b, 0xf1, 0x81, 0x07, 0x38, 0x78, 0x40, 0x1c, 0x38, 0x70, 0xc0, 0xb2, + 0x21, 0x7a, 0x88, 0x42, 0x34, 0xd3, 0x00, 0x20, 0x38, 0x70, 0x69, 0x46, + 0x50, 0x46, 0x01, 0xf0, 0x55, 0xf9, 0x68, 0xb3, 0x9d, 0xf8, 0x00, 0x10, + 0x50, 0x46, 0x08, 0x44, 0x80, 0x78, 0x03, 0x46, 0x01, 0x9a, 0x31, 0x46, + 0x40, 0x46, 0xf7, 0xf7, 0xc1, 0xff, 0xa8, 0xb1, 0x01, 0x9a, 0x31, 0x46, + 0x40, 0x46, 0xf7, 0xf7, 0xe9, 0xff, 0x03, 0x46, 0x00, 0xf1, 0x1c, 0x02, + 0x9d, 0xf8, 0x00, 0x10, 0x40, 0x46, 0x01, 0xf0, 0x7c, 0xf9, 0x9d, 0xf8, + 0x00, 0x10, 0x50, 0x46, 0x01, 0xf0, 0x51, 0xf9, 0x00, 0x20, 0xcb, 0xf8, + 0x90, 0x00, 0x0b, 0xe0, 0x04, 0x21, 0x79, 0x70, 0xdb, 0xf8, 0x90, 0x00, + 0x40, 0x1c, 0xcb, 0xf8, 0x90, 0x00, 0xe1, 0x68, 0x81, 0x42, 0x38, 0xbf, + 0x43, 0xf2, 0x04, 0x09, 0x04, 0x99, 0x88, 0x78, 0xa8, 0xb1, 0xb9, 0xf1, + 0x00, 0x0f, 0x12, 0xd1, 0xe8, 0x68, 0x90, 0xf8, 0x82, 0x00, 0x6a, 0x68, + 0x29, 0x68, 0xae, 0x69, 0xac, 0x6a, 0x03, 0x28, 0x12, 0xbf, 0x04, 0x28, + 0x40, 0x46, 0xf7, 0xf7, 0x52, 0xfa, 0x20, 0x46, 0x01, 0xf0, 0x28, 0xf9, + 0x30, 0x46, 0x01, 0xf0, 0x3e, 0xf8, 0xe5, 0xf7, 0xcf, 0xf9, 0x00, 0x28, + 0x08, 0xbf, 0xb9, 0xf1, 0x00, 0x0f, 0x7f, 0xf4, 0xb1, 0xad, 0x01, 0x90, + 0x4f, 0xf0, 0x00, 0x0b, 0xe9, 0x69, 0x06, 0x91, 0x00, 0x24, 0xaa, 0x68, + 0x00, 0x92, 0xd5, 0xf8, 0x0c, 0x90, 0x28, 0x6a, 0x00, 0x99, 0x02, 0x90, + 0x00, 0x26, 0x48, 0x68, 0x00, 0x99, 0x05, 0x90, 0xda, 0x46, 0x91, 0xed, + 0x07, 0x8a, 0xd4, 0xf7, 0xff, 0xfe, 0x01, 0x46, 0xd9, 0xf8, 0x0c, 0x00, + 0xd4, 0xf7, 0x3e, 0xff, 0x00, 0xee, 0x10, 0x0a, 0x09, 0xf1, 0x38, 0x01, + 0x89, 0xed, 0x04, 0x0a, 0x09, 0xf1, 0x80, 0x07, 0x08, 0x78, 0x10, 0xb9, + 0x4f, 0xf0, 0x01, 0x0b, 0x0c, 0xe0, 0x08, 0x7c, 0x08, 0xb9, 0x01, 0x24, + 0x08, 0xe0, 0x38, 0x78, 0x20, 0xb9, 0xb8, 0x78, 0x03, 0x28, 0x18, 0xbf, + 0x01, 0x26, 0x01, 0xd1, 0x4f, 0xf0, 0x01, 0x0a, 0xd9, 0xed, 0x05, 0x0a, + 0xf5, 0xee, 0x40, 0x0a, 0x01, 0xee, 0x10, 0xaa, 0x01, 0xee, 0x90, 0x6a, + 0x02, 0xee, 0x10, 0x4a, 0x02, 0xee, 0x90, 0xba, 0xf1, 0xee, 0x10, 0xfa, + 0xb8, 0xee, 0x40, 0x0a, 0xb8, 0xee, 0xc1, 0x1a, 0xf8, 0xee, 0xe1, 0x1a, + 0xb8, 0xee, 0xc2, 0x2a, 0xf8, 0xee, 0xe2, 0x2a, 0x29, 0xdd, 0xb7, 0xee, + 0x00, 0x3a, 0x33, 0xee, 0x48, 0x3a, 0x63, 0xee, 0x20, 0x0a, 0x40, 0xee, + 0x08, 0x0a, 0xb0, 0xee, 0x60, 0x0a, 0xd9, 0xed, 0x06, 0x3a, 0xd9, 0xed, + 0x07, 0x0a, 0x63, 0xee, 0x23, 0x3a, 0x63, 0xee, 0x20, 0x0a, 0x42, 0xee, + 0x88, 0x3a, 0x42, 0xee, 0x08, 0x0a, 0xf0, 0xee, 0x63, 0x2a, 0xb0, 0xee, + 0x60, 0x2a, 0xd9, 0xed, 0x08, 0x3a, 0xd9, 0xed, 0x09, 0x0a, 0x63, 0xee, + 0x23, 0x3a, 0x63, 0xee, 0x20, 0x0a, 0x41, 0xee, 0x88, 0x3a, 0x41, 0xee, + 0x08, 0x0a, 0xf0, 0xee, 0x63, 0x1a, 0xb0, 0xee, 0x60, 0x1a, 0xe6, 0xe4, + 0x28, 0x69, 0xc0, 0xf8, 0x00, 0x90, 0x64, 0x21, 0x41, 0x60, 0x0c, 0xb0, + 0x48, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0xf2, 0x8f, 0x2d, 0xe9, + 0xf8, 0x4f, 0x84, 0xb0, 0x0e, 0x68, 0x4c, 0x69, 0xca, 0x69, 0x03, 0x92, + 0x05, 0x46, 0x4b, 0x6a, 0x02, 0x93, 0x0a, 0x69, 0x01, 0x92, 0x4b, 0x68, + 0x00, 0x93, 0xd1, 0xf8, 0x18, 0xa0, 0xd1, 0xf8, 0x20, 0x90, 0xd1, 0xf8, + 0x28, 0x80, 0xcf, 0x68, 0xd1, 0xf8, 0x2c, 0xb0, 0x01, 0xf0, 0x86, 0xf8, + 0x59, 0x46, 0x28, 0x46, 0x00, 0xf0, 0xb2, 0xff, 0x52, 0x46, 0x21, 0x46, + 0x28, 0x46, 0x00, 0xf0, 0x9f, 0xfd, 0x04, 0x00, 0x05, 0xd1, 0x03, 0x99, + 0x4a, 0x46, 0x28, 0x46, 0x00, 0xf0, 0x5a, 0xf8, 0x04, 0x46, 0x8c, 0xbb, + 0x02, 0x99, 0x42, 0x46, 0x28, 0x46, 0x00, 0xf0, 0xec, 0xff, 0x04, 0x46, + 0x54, 0xbb, 0x00, 0x9a, 0x31, 0x46, 0x28, 0x46, 0xf7, 0xf7, 0x7e, 0xf9, + 0x07, 0xf1, 0x38, 0x00, 0x00, 0x21, 0x07, 0xf1, 0x80, 0x05, 0x01, 0x70, + 0x01, 0x74, 0x29, 0x70, 0xa9, 0x70, 0x69, 0x70, 0xd4, 0xf7, 0x4e, 0xfe, + 0x38, 0x60, 0xec, 0x21, 0x00, 0x20, 0x78, 0x60, 0x38, 0x61, 0x78, 0x61, + 0xb8, 0x61, 0xf8, 0x61, 0x38, 0x62, 0x78, 0x62, 0x68, 0x60, 0xa8, 0x60, + 0xe8, 0x60, 0x28, 0x61, 0x68, 0x61, 0xa8, 0x61, 0xe8, 0x61, 0x68, 0x62, + 0x28, 0x62, 0xa8, 0x62, 0x04, 0x48, 0x00, 0x6b, 0xb8, 0x60, 0x01, 0x98, + 0xce, 0xf7, 0x62, 0xfc, 0x20, 0x46, 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, + 0x24, 0x73, 0x03, 0x21, 0x2d, 0xe9, 0xf0, 0x41, 0x4f, 0x69, 0xcd, 0x69, + 0x8c, 0x69, 0x0e, 0x6a, 0xc9, 0x6a, 0x80, 0x46, 0x00, 0xf0, 0x6c, 0xff, + 0x22, 0x46, 0x39, 0x46, 0x40, 0x46, 0x00, 0xf0, 0x4f, 0xfd, 0x30, 0xb9, + 0x32, 0x46, 0x29, 0x46, 0x40, 0x46, 0xbd, 0xe8, 0xf0, 0x41, 0x00, 0xf0, + 0x09, 0xb8, 0xbd, 0xe8, 0xf0, 0x81, 0x0a, 0x46, 0x01, 0x21, 0x81, 0x40, + 0x04, 0x20, 0xec, 0xf7, 0xdd, 0xbc, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x41, + 0x2d, 0xed, 0x02, 0x8b, 0x8a, 0xb0, 0x80, 0x46, 0x0d, 0x46, 0x16, 0x46, + 0x0a, 0x20, 0x00, 0x21, 0x09, 0x96, 0x08, 0x90, 0x07, 0x91, 0x01, 0x20, + 0x6a, 0x7f, 0x05, 0x91, 0x06, 0x92, 0x03, 0x21, 0x04, 0x91, 0x03, 0x91, + 0x00, 0x21, 0xdf, 0xf8, 0xa8, 0x25, 0x02, 0x92, 0x01, 0x90, 0x00, 0x91, + 0xb7, 0xee, 0x00, 0x1a, 0xd5, 0xed, 0x08, 0x0a, 0x9f, 0xed, 0xdc, 0x0a, + 0x00, 0x23, 0x00, 0x22, 0x02, 0x21, 0x40, 0x46, 0xe8, 0xf7, 0x70, 0xff, + 0x06, 0xf1, 0x20, 0x02, 0x02, 0x92, 0x00, 0x20, 0x01, 0x90, 0x00, 0x90, + 0x14, 0x23, 0x2a, 0x7f, 0x02, 0x21, 0x40, 0x46, 0xe8, 0xf7, 0x38, 0xfe, + 0x06, 0xf1, 0x40, 0x00, 0x00, 0x21, 0x07, 0x90, 0x06, 0x91, 0x01, 0x22, + 0x02, 0x91, 0x05, 0x92, 0x04, 0x92, 0x03, 0x92, 0x01, 0x92, 0x00, 0x92, + 0x00, 0xf0, 0x8a, 0xf8, 0x06, 0xf1, 0x58, 0x00, 0x07, 0x90, 0x00, 0x21, + 0x01, 0x20, 0x06, 0x91, 0x05, 0x91, 0x04, 0x91, 0x03, 0x90, 0x02, 0x91, + 0x01, 0x22, 0x00, 0x90, 0x01, 0x92, 0x00, 0xf0, 0x7b, 0xf8, 0x06, 0xf1, + 0x70, 0x00, 0x00, 0xf0, 0x88, 0xf8, 0x06, 0xf1, 0x88, 0x00, 0x00, 0xf0, + 0x84, 0xf8, 0x31, 0x46, 0x40, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0x95, 0xed, + 0x00, 0x0a, 0x00, 0xf0, 0x64, 0xf8, 0xbb, 0xf7, 0x17, 0xfd, 0x00, 0xf0, + 0x6d, 0xf8, 0xe8, 0xf7, 0x59, 0xfd, 0x06, 0xf1, 0xa8, 0x07, 0xbd, 0xf8, + 0x08, 0x00, 0x38, 0x80, 0x95, 0xed, 0x01, 0x0a, 0x00, 0xf0, 0x55, 0xf8, + 0xd9, 0xf7, 0x86, 0xff, 0x00, 0xf0, 0x5e, 0xf8, 0xe8, 0xf7, 0x21, 0xfd, + 0x04, 0x00, 0xbd, 0xf8, 0x08, 0x00, 0x78, 0x80, 0x29, 0x7f, 0xb9, 0x71, + 0x36, 0xd1, 0x02, 0x21, 0x40, 0x46, 0xe8, 0xf7, 0xe5, 0xfc, 0x08, 0xee, + 0x10, 0x0a, 0x02, 0x21, 0x40, 0x46, 0xe8, 0xf7, 0xec, 0xfc, 0x08, 0xee, + 0x90, 0x0a, 0x40, 0x46, 0xca, 0xf7, 0x84, 0xfd, 0x00, 0xee, 0x10, 0x0a, + 0xb8, 0xee, 0x40, 0x0a, 0x87, 0xed, 0x04, 0x0a, 0xb8, 0xee, 0x48, 0x0a, + 0x87, 0xed, 0x06, 0x0a, 0xf8, 0xee, 0x68, 0x0a, 0x80, 0xee, 0x20, 0x0a, + 0xc7, 0xed, 0x05, 0x0a, 0x87, 0xed, 0x07, 0x0a, 0x02, 0x21, 0x6a, 0x6a, + 0x95, 0xed, 0x0a, 0x0a, 0x40, 0x46, 0xe9, 0xf7, 0x7f, 0xf9, 0xf8, 0x71, + 0x0a, 0x22, 0x39, 0x88, 0xd5, 0xed, 0x0c, 0x0a, 0x95, 0xed, 0x0b, 0x0a, + 0xe9, 0xf7, 0xd8, 0xf9, 0xb0, 0xf5, 0x80, 0x7f, 0x38, 0x81, 0x28, 0xbf, + 0x43, 0xf2, 0x07, 0x04, 0x7b, 0x88, 0x3a, 0x88, 0x06, 0xf1, 0xc8, 0x01, + 0x05, 0xf1, 0x38, 0x00, 0x01, 0xf0, 0x0c, 0xf9, 0x00, 0x20, 0xc6, 0xf8, + 0x4c, 0x02, 0x0a, 0xb0, 0x20, 0x46, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, + 0xf0, 0x81, 0xd5, 0xed, 0x02, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x80, 0xee, + 0x20, 0x0a, 0x70, 0x47, 0x00, 0x23, 0x06, 0xf1, 0x20, 0x01, 0x40, 0x46, + 0xe8, 0xf7, 0xb3, 0xbd, 0x02, 0xa8, 0xbc, 0xee, 0xc0, 0x0a, 0x01, 0x90, + 0x8d, 0xed, 0x00, 0x0a, 0x02, 0x22, 0x2b, 0x7f, 0x02, 0x21, 0x40, 0x46, + 0x70, 0x47, 0x00, 0x21, 0x07, 0x90, 0x06, 0x91, 0x05, 0x91, 0x00, 0x23, + 0x03, 0x91, 0x02, 0x91, 0x01, 0x91, 0x04, 0x93, 0x00, 0x93, 0x01, 0x22, + 0x06, 0xf1, 0x20, 0x01, 0x40, 0x46, 0xe8, 0xf7, 0x98, 0xbd, 0x00, 0x00, + 0x2d, 0xe9, 0xf0, 0x47, 0x2d, 0xed, 0x02, 0x8b, 0x15, 0x46, 0x1f, 0x46, + 0x89, 0x46, 0x0a, 0x9a, 0x97, 0xed, 0x01, 0x0a, 0x05, 0xf1, 0xc8, 0x01, + 0x09, 0xf1, 0x38, 0x00, 0x01, 0xf0, 0xd8, 0xf8, 0xc5, 0xf8, 0x4c, 0x02, + 0x05, 0xf1, 0xa8, 0x06, 0x01, 0xf0, 0xfa, 0xf8, 0x71, 0x88, 0x32, 0x88, + 0x18, 0xb1, 0x43, 0x88, 0x90, 0xed, 0x01, 0x8a, 0x5b, 0xe0, 0xb7, 0xf8, + 0x00, 0xc0, 0xb9, 0xf8, 0x18, 0x30, 0xd7, 0xed, 0x02, 0x1a, 0x97, 0xed, + 0x01, 0x8a, 0x00, 0xee, 0x90, 0xca, 0x00, 0xee, 0x10, 0x3a, 0xf8, 0xee, + 0x60, 0x0a, 0xb3, 0xee, 0x04, 0x1a, 0xb8, 0xee, 0x40, 0x0a, 0x80, 0xee, + 0x81, 0x1a, 0x20, 0xee, 0x01, 0x1a, 0x99, 0xed, 0x03, 0x0a, 0xbd, 0xee, + 0xc1, 0x1a, 0xb4, 0xee, 0x61, 0x0a, 0x10, 0x46, 0x11, 0xee, 0x10, 0xca, + 0x0b, 0x46, 0xf1, 0xee, 0x10, 0xfa, 0xd9, 0xed, 0x04, 0x0a, 0x99, 0xed, + 0x05, 0x1a, 0xa8, 0xbf, 0x03, 0x46, 0x32, 0xda, 0x1f, 0xfa, 0x8c, 0xfc, + 0xf4, 0xee, 0x61, 0x0a, 0x02, 0xee, 0x10, 0xca, 0xf1, 0xee, 0x10, 0xfa, + 0xb8, 0xee, 0x42, 0x2a, 0x10, 0xdb, 0x01, 0xee, 0x10, 0x0a, 0xb8, 0xee, + 0x41, 0x1a, 0x32, 0xee, 0x41, 0x2a, 0x70, 0xee, 0xc0, 0x0a, 0xc2, 0xee, + 0x20, 0x0a, 0x31, 0xee, 0xc0, 0x0a, 0x00, 0xee, 0x80, 0x1a, 0xbd, 0xee, + 0xc1, 0x0a, 0x14, 0xe0, 0xb4, 0xee, 0x61, 0x1a, 0xf1, 0xee, 0x10, 0xfa, + 0x11, 0xdb, 0x00, 0xee, 0x10, 0x3a, 0xb8, 0xee, 0x40, 0x0a, 0x30, 0xee, + 0x42, 0x0a, 0x31, 0xee, 0x60, 0x1a, 0x80, 0xee, 0x01, 0x0a, 0x71, 0xee, + 0xe0, 0x0a, 0x00, 0xee, 0x20, 0x2a, 0xbd, 0xee, 0xc2, 0x0a, 0x10, 0xee, + 0x10, 0x3a, 0x05, 0xf1, 0xa8, 0x01, 0x10, 0x46, 0x9b, 0xb2, 0x98, 0x42, + 0x4f, 0x88, 0x38, 0xbf, 0x18, 0x46, 0x87, 0x42, 0x88, 0xbf, 0x07, 0x46, + 0xb0, 0xee, 0x48, 0x0a, 0x05, 0xf1, 0x60, 0x08, 0xe8, 0xf7, 0x7e, 0xfd, + 0xc8, 0xe9, 0x00, 0x01, 0x86, 0xed, 0x03, 0x8a, 0x39, 0x46, 0xb0, 0x79, + 0xe8, 0xf7, 0xe3, 0xfc, 0x04, 0x46, 0xe8, 0xf7, 0xda, 0xfc, 0xb7, 0x80, + 0x6f, 0x84, 0xac, 0x62, 0x40, 0x1e, 0x05, 0xf1, 0x52, 0x04, 0x9f, 0xed, + 0xb0, 0x1a, 0x60, 0x70, 0x88, 0xf8, 0x0b, 0x00, 0x38, 0x46, 0xb9, 0xf8, + 0x1a, 0x10, 0x00, 0xee, 0x10, 0x0a, 0x00, 0xee, 0x90, 0x1a, 0xb8, 0xee, + 0x40, 0x8a, 0xf8, 0xee, 0x60, 0x0a, 0x20, 0xee, 0x81, 0x1a, 0x96, 0xed, + 0x05, 0x0a, 0x21, 0xee, 0x00, 0x0a, 0x80, 0xee, 0x08, 0x0a, 0xd9, 0xf7, + 0x55, 0xfe, 0x00, 0xf0, 0x65, 0xf8, 0x28, 0xbf, 0x43, 0xf6, 0xff, 0x70, + 0xe8, 0x60, 0x39, 0x46, 0xb0, 0x79, 0xd9, 0xed, 0x0c, 0x0a, 0x99, 0xed, + 0x0b, 0x0a, 0x03, 0x28, 0x0c, 0xbf, 0x4f, 0xf0, 0x08, 0x0a, 0x4f, 0xf0, + 0x0a, 0x0a, 0xf0, 0x79, 0x52, 0x46, 0xe9, 0xf7, 0xcd, 0xf8, 0xf1, 0x68, + 0x30, 0x81, 0x21, 0xf0, 0x00, 0x41, 0x00, 0xee, 0x10, 0x1a, 0x28, 0xee, + 0x00, 0x0a, 0xd9, 0xed, 0x0d, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x46, 0xbf, 0x82, 0x46, 0xf0, 0x79, 0x00, 0x20, 0x85, 0xf8, + 0x25, 0x00, 0x85, 0xf8, 0x13, 0xa0, 0x01, 0x21, 0x8d, 0x48, 0xa8, 0x60, + 0x21, 0x70, 0x88, 0xf8, 0x0a, 0x10, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, + 0xf0, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb5, 0x14, 0x46, + 0x00, 0xee, 0x10, 0x3a, 0xb8, 0xee, 0x40, 0x0a, 0xdf, 0xed, 0x83, 0x0a, + 0x20, 0xee, 0x20, 0x0a, 0x94, 0xed, 0x2f, 0x1a, 0x60, 0x8c, 0x20, 0xee, + 0x01, 0x1a, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x81, 0xee, + 0x00, 0x0a, 0xd9, 0xf7, 0x05, 0xfe, 0x00, 0xf0, 0x15, 0xf8, 0x28, 0xbf, + 0x43, 0xf6, 0xff, 0x70, 0xe0, 0x60, 0x94, 0xf8, 0xae, 0x00, 0x03, 0x28, + 0x0c, 0xbf, 0x08, 0x20, 0x0a, 0x20, 0xe0, 0x74, 0x00, 0x21, 0x00, 0x20, + 0x84, 0xf8, 0x25, 0x00, 0xa1, 0x60, 0x04, 0xf1, 0x52, 0x00, 0x01, 0x70, + 0x01, 0x76, 0x10, 0xbd, 0xbc, 0xee, 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, + 0xb0, 0xf5, 0x80, 0x4f, 0x70, 0x47, 0x0a, 0x46, 0x00, 0x23, 0x11, 0x21, + 0xe9, 0xf7, 0x39, 0xba, 0x0a, 0x46, 0x11, 0x21, 0xe9, 0xf7, 0x8a, 0xbc, + 0x2d, 0xe9, 0xf0, 0x4d, 0x2d, 0xed, 0x0a, 0x8b, 0x0d, 0x46, 0x90, 0xb0, + 0x16, 0x46, 0x11, 0x21, 0xe9, 0xf7, 0x1b, 0xfd, 0x80, 0x46, 0x63, 0x4a, + 0x41, 0x46, 0x02, 0x20, 0xe8, 0xf7, 0xed, 0xfd, 0x03, 0x28, 0x07, 0x46, + 0x04, 0xd0, 0x41, 0x46, 0x02, 0x20, 0xe8, 0xf7, 0x08, 0xfe, 0x04, 0x00, + 0x00, 0xf0, 0xaf, 0x80, 0x35, 0xf8, 0xac, 0x1f, 0xa8, 0x78, 0x22, 0x46, + 0xe8, 0xf7, 0x8e, 0xff, 0xb0, 0xee, 0x40, 0x8a, 0x00, 0x22, 0x41, 0x46, + 0x02, 0x20, 0xe8, 0xf7, 0xfc, 0xfd, 0xcd, 0xe9, 0x0e, 0x01, 0x01, 0x22, + 0x41, 0x46, 0x02, 0x20, 0xe8, 0xf7, 0xf5, 0xfd, 0x82, 0x46, 0x8b, 0x46, + 0x0a, 0xa8, 0x0c, 0xa9, 0x01, 0x90, 0x00, 0x91, 0x01, 0x23, 0x00, 0x22, + 0x41, 0x46, 0x02, 0x20, 0xe8, 0xf7, 0xfe, 0xfd, 0x06, 0xa8, 0x00, 0x90, + 0x08, 0xab, 0x00, 0x22, 0x41, 0x46, 0x02, 0x20, 0xe8, 0xf7, 0x49, 0xfe, + 0x02, 0xa8, 0x00, 0x90, 0x04, 0xab, 0x01, 0x22, 0x41, 0x46, 0x02, 0x20, + 0xe8, 0xf7, 0x41, 0xfe, 0xdd, 0xe9, 0x0e, 0x01, 0x00, 0xf0, 0x9b, 0xf8, + 0xf0, 0xee, 0x40, 0x8a, 0xb0, 0xee, 0x48, 0x0a, 0x50, 0x46, 0x59, 0x46, + 0xe8, 0xf7, 0x5c, 0xfe, 0xdd, 0xe9, 0x0c, 0x01, 0xf0, 0xee, 0x40, 0xba, + 0x00, 0xf0, 0x8d, 0xf8, 0xdd, 0xe9, 0x0a, 0x01, 0xb0, 0xee, 0x40, 0xba, + 0x00, 0xf0, 0x87, 0xf8, 0xdd, 0xe9, 0x08, 0x01, 0xb0, 0xee, 0x40, 0xca, + 0x00, 0xf0, 0x81, 0xf8, 0xdd, 0xe9, 0x06, 0x01, 0xb0, 0xee, 0x40, 0x9a, + 0x00, 0xf0, 0x7b, 0xf8, 0xdd, 0xe9, 0x04, 0x01, 0xf0, 0xee, 0x40, 0x9a, + 0x00, 0xf0, 0x75, 0xf8, 0xdd, 0xe9, 0x02, 0x01, 0xb0, 0xee, 0x40, 0xaa, + 0x00, 0xf0, 0x6f, 0xf8, 0xe8, 0x68, 0x30, 0x60, 0xf0, 0xee, 0x40, 0xaa, + 0x29, 0x69, 0x71, 0x60, 0x00, 0x27, 0x28, 0x88, 0x30, 0x81, 0x95, 0xed, + 0x02, 0x0a, 0xd5, 0xed, 0x05, 0x0a, 0x34, 0x61, 0x60, 0xee, 0x20, 0x0a, + 0xc6, 0xed, 0x03, 0x0a, 0xc6, 0xed, 0x05, 0xba, 0xc6, 0xed, 0x06, 0x8a, + 0xb0, 0xee, 0x4c, 0x0a, 0xbc, 0xf7, 0x7c, 0xff, 0x1f, 0x4c, 0x00, 0xf0, + 0x4a, 0xf8, 0x00, 0xf0, 0x3d, 0xf8, 0xb0, 0xee, 0x4b, 0x0a, 0xbc, 0xf7, + 0x73, 0xff, 0x00, 0xf0, 0x3c, 0xf8, 0xbb, 0xf7, 0x0e, 0xfa, 0x06, 0xf1, + 0x1c, 0x00, 0x80, 0xec, 0x02, 0x0a, 0xb0, 0xee, 0x6a, 0x0a, 0xbc, 0xf7, + 0x67, 0xff, 0x00, 0xf0, 0x36, 0xf8, 0x00, 0xf0, 0x29, 0xf8, 0xb0, 0xee, + 0x4a, 0x0a, 0xbc, 0xf7, 0x5f, 0xff, 0x00, 0xf0, 0x28, 0xf8, 0x06, 0xf1, + 0x24, 0x00, 0x80, 0xec, 0x02, 0x0a, 0xb0, 0xee, 0x69, 0x0a, 0xbc, 0xf7, + 0x55, 0xff, 0x00, 0xf0, 0x24, 0xf8, 0x00, 0xf0, 0x17, 0xf8, 0xb0, 0xee, + 0x49, 0x0a, 0xbc, 0xf7, 0x4d, 0xff, 0x00, 0xf0, 0x16, 0xf8, 0x06, 0xf1, + 0x2c, 0x00, 0x80, 0xec, 0x02, 0x0a, 0x10, 0xb0, 0x38, 0x46, 0xbd, 0xec, + 0x0a, 0x8b, 0xbd, 0xe8, 0xf0, 0x8d, 0x00, 0x00, 0x6f, 0x12, 0x83, 0x3a, + 0x00, 0x10, 0x10, 0x00, 0xfc, 0x55, 0x00, 0x21, 0xb0, 0xee, 0x40, 0x8a, + 0xf0, 0xee, 0x60, 0x8a, 0x70, 0x47, 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, + 0x68, 0x1a, 0xbc, 0xf7, 0xdc, 0xbe, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, + 0x60, 0x1a, 0x94, 0xec, 0x02, 0x0a, 0xbc, 0xf7, 0xfa, 0xbe, 0xb0, 0xee, + 0x48, 0x0a, 0xe8, 0xf7, 0xc5, 0xbd, 0x80, 0xb5, 0x11, 0x21, 0xe9, 0xf7, + 0x34, 0xfc, 0xbd, 0xe8, 0x04, 0x40, 0x01, 0x46, 0x02, 0x20, 0xe8, 0xf7, + 0x1c, 0xbd, 0x80, 0xb5, 0x11, 0x21, 0xe9, 0xf7, 0x2a, 0xfc, 0xbd, 0xe8, + 0x04, 0x40, 0x01, 0x46, 0x02, 0x20, 0xe8, 0xf7, 0x18, 0xbd, 0x2d, 0xe9, + 0xf8, 0x43, 0x04, 0x46, 0x0d, 0x46, 0x90, 0x46, 0x1f, 0x46, 0x01, 0xf0, + 0x7b, 0xf8, 0x06, 0x46, 0x31, 0x46, 0x20, 0x46, 0x01, 0xf0, 0x8d, 0xf8, + 0x81, 0x46, 0x31, 0x46, 0x20, 0x46, 0x01, 0xf0, 0x9e, 0xf8, 0x2e, 0x70, + 0x88, 0xf8, 0x00, 0x90, 0x38, 0x70, 0xbd, 0xe8, 0xf1, 0x83, 0x10, 0xb5, + 0x04, 0x46, 0x01, 0xf0, 0x9e, 0xf8, 0x20, 0x46, 0xbd, 0xe8, 0x10, 0x40, + 0x11, 0x21, 0xe9, 0xf7, 0xe2, 0xbb, 0xf8, 0xb5, 0x2d, 0xed, 0x02, 0x8b, + 0x82, 0xb0, 0x1e, 0x46, 0x06, 0xf1, 0x24, 0x00, 0xf0, 0xee, 0x40, 0x8a, + 0xb0, 0xee, 0x60, 0x8a, 0x0a, 0x9f, 0x0c, 0x46, 0x15, 0x46, 0x90, 0xec, + 0x02, 0x0a, 0xbb, 0xf7, 0x8d, 0xf9, 0x30, 0x89, 0xd6, 0xed, 0x05, 0x0a, + 0x00, 0x90, 0xf0, 0xee, 0x60, 0x1a, 0x80, 0xee, 0x20, 0x1a, 0xd5, 0xf8, + 0x4c, 0x22, 0x95, 0xed, 0x2d, 0x0a, 0xb0, 0xee, 0x48, 0x2a, 0xf0, 0xee, + 0x68, 0x0a, 0x3b, 0x46, 0x05, 0xf1, 0xc8, 0x01, 0x04, 0xf1, 0x38, 0x00, + 0x00, 0xf0, 0xa1, 0xfe, 0x02, 0xb0, 0xbd, 0xec, 0x02, 0x8b, 0xf1, 0xbd, + 0x2d, 0xe9, 0xf8, 0x4f, 0x8c, 0xb0, 0x81, 0x46, 0x00, 0x25, 0xdf, 0xf8, + 0x90, 0x63, 0xdf, 0xf8, 0x90, 0xb3, 0xdf, 0xf8, 0x90, 0x83, 0x28, 0x46, + 0xca, 0xf7, 0x60, 0xfb, 0x82, 0x46, 0x28, 0x21, 0xdf, 0xf8, 0x84, 0x03, + 0x69, 0x43, 0x44, 0x18, 0x24, 0x20, 0xff, 0x22, 0x68, 0x43, 0x22, 0x60, + 0x58, 0x44, 0xc4, 0xf8, 0x04, 0x80, 0x00, 0xf5, 0xd2, 0x61, 0x0b, 0xeb, + 0x05, 0x22, 0xa1, 0x60, 0x02, 0xf5, 0xc5, 0x50, 0x4f, 0xf4, 0x14, 0x71, + 0x69, 0x43, 0x59, 0x44, 0x20, 0x61, 0x01, 0xf5, 0xe5, 0x52, 0x70, 0x20, + 0x68, 0x43, 0x58, 0x44, 0x42, 0xf2, 0xe0, 0x51, 0x62, 0x61, 0x01, 0x44, + 0xb8, 0x22, 0xec, 0x20, 0x6a, 0x43, 0x68, 0x43, 0xa1, 0x61, 0x5a, 0x44, + 0x58, 0x44, 0xe2, 0x61, 0x00, 0xf5, 0x38, 0x71, 0x4f, 0xf4, 0x8c, 0x62, + 0x6a, 0x43, 0x5a, 0x44, 0x21, 0x62, 0x02, 0xf5, 0xe4, 0x60, 0xba, 0xf1, + 0xff, 0x0f, 0x60, 0x62, 0x12, 0xd1, 0xca, 0xf7, 0xe4, 0xfa, 0x82, 0x46, + 0x00, 0x27, 0x2a, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x06, 0xd4, 0x38, 0x46, + 0xf7, 0xf7, 0xb6, 0xfc, 0xe0, 0x60, 0x30, 0x68, 0x40, 0xf8, 0x27, 0x40, + 0x7f, 0x1c, 0x08, 0x2f, 0xf1, 0xd3, 0x1d, 0xe0, 0x50, 0x46, 0xf7, 0xf7, + 0xab, 0xfc, 0xe0, 0x60, 0x29, 0xfa, 0x0a, 0xf1, 0x30, 0x68, 0x40, 0xf8, + 0x2a, 0x40, 0xca, 0x07, 0x12, 0xd5, 0x69, 0x46, 0x50, 0x46, 0x00, 0xf0, + 0x34, 0xf8, 0x08, 0xf5, 0xba, 0x71, 0x50, 0x46, 0x01, 0xf0, 0x28, 0xf8, + 0x69, 0x46, 0x50, 0x46, 0xff, 0xf7, 0xa5, 0xfb, 0x01, 0x00, 0x03, 0xd0, + 0x03, 0x22, 0x02, 0x20, 0xd7, 0xf7, 0x50, 0xff, 0x6d, 0x1c, 0x04, 0x2d, + 0x91, 0xd3, 0xfe, 0xe0, 0x80, 0xb5, 0x00, 0xf0, 0x09, 0xf8, 0xd4, 0xf7, + 0x94, 0xfa, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x03, 0xf8, 0xd4, 0xf7, + 0x79, 0xfa, 0x02, 0xbd, 0x00, 0x92, 0x0b, 0x46, 0x02, 0x46, 0x4f, 0xf4, + 0xc0, 0x71, 0xa3, 0x48, 0x70, 0x47, 0x10, 0xb5, 0x8c, 0xb0, 0xe4, 0xf7, + 0xcd, 0xfc, 0x04, 0x46, 0x69, 0x46, 0x00, 0xf0, 0x06, 0xf8, 0x69, 0x46, + 0x20, 0x46, 0xfe, 0xf7, 0xe5, 0xff, 0x0c, 0xb0, 0x10, 0xbd, 0x70, 0xb5, + 0x0c, 0x46, 0xca, 0xf7, 0xb1, 0xfa, 0x99, 0x49, 0x21, 0x60, 0x01, 0xf1, + 0xc0, 0x02, 0x62, 0x61, 0x01, 0xf1, 0xd8, 0x03, 0xe3, 0x61, 0x01, 0xf5, + 0x9e, 0x72, 0x24, 0x25, 0x62, 0x62, 0x45, 0x43, 0x01, 0xf5, 0xa0, 0x71, + 0xec, 0x23, 0xa1, 0x60, 0x43, 0x43, 0x8f, 0x4a, 0x15, 0x44, 0x13, 0x44, + 0x03, 0xf5, 0x38, 0x71, 0x05, 0xf5, 0xd2, 0x63, 0x63, 0x60, 0x21, 0x61, + 0x4f, 0xf4, 0x14, 0x73, 0x43, 0x43, 0x02, 0xeb, 0x00, 0x21, 0x13, 0x44, + 0x01, 0xf5, 0xc5, 0x55, 0x03, 0xf5, 0xe5, 0x51, 0xa5, 0x61, 0x21, 0x62, + 0x70, 0x25, 0xb8, 0x26, 0x4f, 0xf4, 0x8c, 0x61, 0x45, 0x43, 0x46, 0x43, + 0x48, 0x43, 0x15, 0x44, 0x42, 0xf2, 0xe0, 0x53, 0x16, 0x44, 0x10, 0x44, + 0x2b, 0x44, 0xe6, 0x60, 0x00, 0xf5, 0xe4, 0x62, 0xa3, 0x62, 0xe2, 0x62, + 0x70, 0xbd, 0xf8, 0xb5, 0x0c, 0x46, 0x15, 0x46, 0x1e, 0x46, 0xe4, 0xf7, + 0x7f, 0xfc, 0xca, 0xf7, 0x6f, 0xfa, 0xec, 0x21, 0x76, 0x4a, 0x48, 0x43, + 0x10, 0x44, 0x00, 0x27, 0x00, 0xf5, 0x38, 0x71, 0x1e, 0xb1, 0x02, 0x2e, + 0x0b, 0xd0, 0x0a, 0xd3, 0x0b, 0xe0, 0x14, 0x26, 0x28, 0x68, 0xb0, 0x42, + 0x0a, 0xd3, 0x32, 0x46, 0x20, 0x46, 0xbb, 0xf7, 0x15, 0xfe, 0x2e, 0x60, + 0x06, 0xe0, 0xec, 0x26, 0xf4, 0xe7, 0x4f, 0xf6, 0x2a, 0x77, 0x01, 0xe0, + 0x4f, 0xf6, 0x26, 0x77, 0x38, 0x46, 0xf2, 0xbd, 0x2d, 0xe9, 0xf8, 0x4f, + 0x8c, 0xb0, 0x0d, 0x46, 0x16, 0x9f, 0x16, 0x46, 0x1c, 0x46, 0xe4, 0xf7, + 0x55, 0xfc, 0x80, 0x46, 0x07, 0x2d, 0x4f, 0xf0, 0x00, 0x09, 0x62, 0x48, + 0x4f, 0xf6, 0x61, 0x71, 0x64, 0xd8, 0xdf, 0xe8, 0x05, 0xf0, 0x04, 0x0a, + 0x0e, 0x1b, 0x2d, 0x38, 0x59, 0x24, 0x00, 0xf5, 0xba, 0x71, 0x40, 0x46, + 0x00, 0xf0, 0x78, 0xff, 0x5a, 0xe0, 0x40, 0x46, 0x00, 0xf0, 0xd0, 0xff, + 0x56, 0xe0, 0x04, 0x2c, 0x99, 0xbf, 0x00, 0x22, 0xd0, 0xf8, 0x50, 0x11, + 0x32, 0x79, 0x31, 0x68, 0x33, 0x46, 0x40, 0x46, 0x00, 0xf0, 0x50, 0xf8, + 0x04, 0x20, 0x3b, 0xe0, 0x69, 0x46, 0x40, 0x46, 0xff, 0xf7, 0x69, 0xff, + 0x69, 0x46, 0x40, 0x46, 0xff, 0xf7, 0xdf, 0xfa, 0x3a, 0xe0, 0x69, 0x46, + 0x40, 0x46, 0xff, 0xf7, 0x60, 0xff, 0x69, 0x46, 0x40, 0x46, 0xff, 0xf7, + 0x39, 0xfb, 0x31, 0xe0, 0x94, 0xb3, 0x30, 0x78, 0x00, 0x28, 0x40, 0x46, + 0x02, 0xd0, 0x00, 0xf0, 0xca, 0xfc, 0x2f, 0xe0, 0x00, 0xf0, 0xd2, 0xfc, + 0x2c, 0xe0, 0x08, 0x2c, 0x26, 0xd3, 0x35, 0x68, 0xd6, 0xf8, 0x04, 0xa0, + 0x88, 0xbf, 0x34, 0x7a, 0x03, 0xd8, 0x40, 0x46, 0x00, 0xf0, 0xde, 0xfe, + 0x04, 0x46, 0x21, 0x46, 0x40, 0x46, 0x00, 0xf0, 0x06, 0xff, 0x83, 0x46, + 0x53, 0x46, 0x2a, 0x46, 0x59, 0x46, 0x40, 0x46, 0x00, 0xf0, 0xd6, 0xfc, + 0x33, 0x1d, 0x32, 0x46, 0x59, 0x46, 0x40, 0x46, 0x00, 0xf0, 0xe8, 0xfc, + 0x34, 0x72, 0x09, 0x20, 0x38, 0x60, 0x0b, 0xe0, 0x24, 0x2c, 0x05, 0xd3, + 0x31, 0x46, 0x40, 0x46, 0xfc, 0xf7, 0x2c, 0xf9, 0x81, 0x46, 0x03, 0xe0, + 0x89, 0x46, 0x01, 0xe0, 0x4f, 0xf6, 0x27, 0x79, 0x48, 0x46, 0x0d, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x2d, 0xe9, 0xf0, 0x41, 0x80, 0x46, 0x0e, 0x46, + 0x17, 0x46, 0x1c, 0x46, 0xd4, 0xf7, 0x22, 0xf9, 0x05, 0x46, 0x40, 0x46, + 0xca, 0xf7, 0xc8, 0xf9, 0xb8, 0x21, 0x48, 0x43, 0x22, 0x49, 0x00, 0x2f, + 0x0c, 0xbf, 0xae, 0x1b, 0x76, 0x19, 0x0e, 0x50, 0x08, 0x58, 0x20, 0x60, + 0xbd, 0xe8, 0xf0, 0x81, 0x38, 0xb5, 0x1c, 0x49, 0x09, 0x68, 0x51, 0xf8, + 0x20, 0x50, 0x28, 0x68, 0x08, 0x28, 0x30, 0xd2, 0x51, 0xf8, 0x20, 0x40, + 0x5c, 0xb3, 0xa9, 0x68, 0xa0, 0x68, 0x24, 0x22, 0xbb, 0xf7, 0x76, 0xfd, + 0xe9, 0x68, 0xe0, 0x68, 0x4f, 0xf4, 0xe7, 0x62, 0xbb, 0xf7, 0x70, 0xfd, + 0x29, 0x69, 0x20, 0x69, 0x4f, 0xf4, 0x80, 0x72, 0xbb, 0xf7, 0x6a, 0xfd, + 0x69, 0x69, 0x60, 0x69, 0x4f, 0xf4, 0x14, 0x72, 0xbb, 0xf7, 0x64, 0xfd, + 0xa9, 0x69, 0xa0, 0x69, 0x70, 0x22, 0xbb, 0xf7, 0x5f, 0xfd, 0xe9, 0x69, + 0xe0, 0x69, 0xb8, 0x22, 0xbb, 0xf7, 0x5a, 0xfd, 0x29, 0x6a, 0x20, 0x6a, + 0xec, 0x22, 0xbb, 0xf7, 0x55, 0xfd, 0x69, 0x6a, 0x60, 0x6a, 0x4f, 0xf4, + 0x8c, 0x62, 0xbb, 0xf7, 0x4f, 0xfd, 0xff, 0x20, 0x28, 0x60, 0x31, 0xbd, + 0x7c, 0x04, 0x00, 0x01, 0x88, 0xd9, 0x01, 0x21, 0x0c, 0x56, 0x00, 0x21, + 0x6c, 0x66, 0x02, 0x21, 0x2d, 0xe9, 0xf0, 0x47, 0x2d, 0xed, 0x02, 0x8b, + 0x0f, 0x46, 0x98, 0xb0, 0x82, 0x46, 0x90, 0x46, 0x02, 0x21, 0xe8, 0xf7, + 0x1b, 0xf8, 0x08, 0xee, 0x10, 0x0a, 0x04, 0xa9, 0x50, 0x46, 0xc9, 0xf7, + 0x4c, 0xf9, 0x0a, 0xa9, 0x50, 0x46, 0xca, 0xf7, 0x21, 0xf8, 0x14, 0x22, + 0x0a, 0xa9, 0x05, 0xa8, 0xbb, 0xf7, 0x2a, 0xfd, 0x00, 0x20, 0x0b, 0xaa, + 0x08, 0xe0, 0x04, 0x99, 0x52, 0xf8, 0x20, 0x30, 0xc3, 0xeb, 0x41, 0x03, + 0x06, 0xa9, 0x41, 0xf8, 0x20, 0x30, 0x40, 0x1c, 0x0a, 0x99, 0x88, 0x42, + 0xf3, 0xd3, 0xd7, 0xed, 0x00, 0x0a, 0x97, 0xed, 0x02, 0x0a, 0xf8, 0xee, + 0x60, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0xbb, 0xf7, 0x07, 0xf8, 0x02, 0xa8, + 0xfc, 0xee, 0xc0, 0x0a, 0x01, 0x90, 0xcd, 0xed, 0x00, 0x0a, 0x02, 0x22, + 0x7b, 0x7b, 0x00, 0x21, 0x50, 0x46, 0xe8, 0xf7, 0x41, 0xf8, 0x81, 0x46, + 0x08, 0xf1, 0xe8, 0x04, 0xbd, 0xf8, 0x08, 0x00, 0x60, 0x81, 0x50, 0x46, + 0x79, 0x7b, 0x61, 0x72, 0x02, 0x21, 0xbd, 0xf8, 0x08, 0x20, 0xe8, 0xf7, + 0x98, 0xf8, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xd7, 0xed, + 0x02, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xba, 0xf7, 0xe3, 0xff, 0xfc, 0xee, + 0xc0, 0x8a, 0xd7, 0xed, 0x01, 0x0a, 0x97, 0xed, 0x00, 0x1a, 0xb8, 0xee, + 0x68, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0xb8, 0xee, + 0x41, 0x1a, 0x80, 0xee, 0x01, 0x0a, 0xba, 0xf7, 0xd1, 0xff, 0xb8, 0xee, + 0x48, 0x8a, 0xbc, 0xee, 0xc0, 0x0a, 0xf8, 0xee, 0x40, 0x0a, 0xc0, 0xee, + 0x88, 0x0a, 0xb9, 0xf1, 0x00, 0x0f, 0x84, 0xed, 0x00, 0x0a, 0xc4, 0xed, + 0x01, 0x0a, 0x3c, 0xd1, 0x04, 0x20, 0x0f, 0xa9, 0x01, 0x90, 0x00, 0x91, + 0x8d, 0xed, 0x03, 0x0a, 0xcd, 0xed, 0x02, 0x8a, 0x13, 0xab, 0x05, 0x9a, + 0x08, 0xa9, 0x06, 0xa8, 0xf9, 0xf7, 0xe9, 0xfe, 0x00, 0x22, 0x13, 0xa9, + 0x51, 0xf8, 0x22, 0x00, 0x04, 0x9b, 0xc0, 0x1a, 0x00, 0xee, 0x10, 0x0a, + 0x10, 0x01, 0x08, 0xeb, 0x00, 0x03, 0x08, 0xf1, 0x04, 0x0e, 0x83, 0xed, + 0x00, 0x0a, 0xb8, 0xee, 0xc0, 0x0a, 0x86, 0x44, 0x80, 0xee, 0x08, 0x0a, + 0x0f, 0xab, 0x8e, 0xed, 0x00, 0x0a, 0x01, 0x25, 0x53, 0xf8, 0x22, 0x30, + 0x9d, 0x40, 0x08, 0xf1, 0x08, 0x03, 0x6d, 0x1e, 0x52, 0x1c, 0x1d, 0x50, + 0x04, 0x2a, 0xdf, 0xd3, 0x00, 0x22, 0x04, 0x21, 0x0f, 0xa8, 0xdc, 0xf7, + 0xfc, 0xfe, 0x20, 0x72, 0x21, 0x28, 0x28, 0xbf, 0x43, 0xf2, 0x05, 0x09, + 0x40, 0x46, 0x00, 0xf0, 0x3c, 0xf9, 0x08, 0xf1, 0x40, 0x00, 0x09, 0x90, + 0x0a, 0x21, 0x00, 0x22, 0x08, 0x91, 0x07, 0x92, 0x01, 0x21, 0x38, 0x7b, + 0x05, 0x92, 0x06, 0x90, 0x03, 0x22, 0x04, 0x92, 0x03, 0x92, 0x4f, 0xf4, + 0x80, 0x10, 0x00, 0x22, 0x02, 0x90, 0x01, 0x91, 0x00, 0x92, 0xb7, 0xee, + 0x00, 0x1a, 0xd7, 0xed, 0x04, 0x0a, 0x9f, 0xed, 0x8c, 0x0a, 0x00, 0x23, + 0x00, 0x21, 0x50, 0x46, 0xe8, 0xf7, 0x84, 0xf9, 0x08, 0xf1, 0x60, 0x00, + 0x00, 0x21, 0x02, 0x90, 0x01, 0x91, 0x00, 0x91, 0x63, 0x89, 0x62, 0x7a, + 0x02, 0x21, 0x50, 0x46, 0xe8, 0xf7, 0x4c, 0xf8, 0x00, 0x26, 0x18, 0x20, + 0x70, 0x43, 0x08, 0xeb, 0x00, 0x05, 0x30, 0x01, 0x05, 0xf1, 0x80, 0x01, + 0x08, 0xf1, 0x08, 0x02, 0x07, 0x91, 0x00, 0x21, 0x13, 0x58, 0x06, 0x93, + 0x05, 0x91, 0x04, 0x91, 0x03, 0x91, 0x02, 0x91, 0x01, 0x22, 0x01, 0x21, + 0x01, 0x91, 0x00, 0x91, 0x08, 0xf1, 0x60, 0x01, 0x58, 0xf8, 0x00, 0x30, + 0x50, 0x46, 0xe8, 0xf7, 0x48, 0xf8, 0x95, 0xf8, 0x93, 0x00, 0x76, 0x1c, + 0x41, 0x1e, 0x04, 0x2e, 0x85, 0xf8, 0x93, 0x10, 0xdb, 0xd3, 0x08, 0xf1, + 0xe0, 0x00, 0x02, 0x90, 0x21, 0x68, 0x01, 0x91, 0x02, 0x21, 0x22, 0x7a, + 0x50, 0x1e, 0xc0, 0xb2, 0x00, 0x90, 0x00, 0x22, 0x7b, 0x69, 0x50, 0x46, + 0xe8, 0xf7, 0x08, 0xf9, 0x08, 0xf1, 0x40, 0x01, 0x50, 0x46, 0xc0, 0x46, + 0xc0, 0x46, 0x97, 0xed, 0x04, 0x0a, 0xe8, 0xf7, 0xa1, 0xf9, 0xe0, 0x60, + 0x02, 0x21, 0x50, 0x46, 0xe7, 0xf7, 0x04, 0xff, 0x08, 0xee, 0x10, 0x0a, + 0x02, 0x21, 0x50, 0x46, 0xe7, 0xf7, 0x0b, 0xff, 0x00, 0xee, 0x10, 0x0a, + 0x60, 0x89, 0x01, 0xee, 0x10, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xb8, 0xee, + 0x41, 0x1a, 0xf8, 0xee, 0x48, 0x0a, 0x80, 0xee, 0x01, 0x0a, 0x80, 0xee, + 0x80, 0x0a, 0x84, 0xed, 0x04, 0x0a, 0x18, 0xb0, 0x48, 0x46, 0xbd, 0xec, + 0x02, 0x8b, 0xbd, 0xe8, 0xf0, 0x87, 0x38, 0xb5, 0x00, 0x22, 0x01, 0xeb, + 0x02, 0x13, 0x18, 0x25, 0x55, 0x43, 0xdc, 0x68, 0x0d, 0x44, 0x52, 0x1c, + 0x04, 0x2a, 0xc5, 0xf8, 0x94, 0x40, 0xf4, 0xd3, 0x01, 0xf1, 0xe0, 0x02, + 0x00, 0x23, 0x14, 0x7f, 0x14, 0x70, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, + 0x01, 0xf1, 0x40, 0x02, 0x10, 0x21, 0xe8, 0xf7, 0xb6, 0xbd, 0x0a, 0x46, + 0x10, 0x21, 0xe9, 0xf7, 0x07, 0xb8, 0x00, 0x00, 0x2d, 0xe9, 0xf8, 0x43, + 0x88, 0x46, 0x2d, 0xed, 0x06, 0x8b, 0x15, 0x46, 0x10, 0x21, 0xe9, 0xf7, + 0x98, 0xf8, 0x08, 0xf1, 0xec, 0x07, 0x06, 0x46, 0xf8, 0x88, 0x28, 0x80, + 0x4f, 0xf4, 0x80, 0x12, 0x31, 0x46, 0x00, 0x20, 0xe8, 0xf7, 0x65, 0xf9, + 0x00, 0x28, 0x04, 0x46, 0x6b, 0xd1, 0xb0, 0x6b, 0xb9, 0x68, 0x88, 0x42, + 0xb8, 0xbf, 0x02, 0x24, 0x5b, 0xdb, 0x30, 0x6f, 0xd7, 0xed, 0x00, 0x0a, + 0x96, 0xed, 0x0f, 0xaa, 0xd6, 0xed, 0x0e, 0xaa, 0xc0, 0xf3, 0x01, 0x49, + 0xc0, 0xf3, 0x84, 0x40, 0x09, 0xee, 0x10, 0x0a, 0x08, 0xeb, 0x09, 0x10, + 0xb8, 0xee, 0x49, 0x0a, 0xd0, 0xed, 0x01, 0x9a, 0x40, 0xee, 0x20, 0x9a, + 0x96, 0xed, 0x10, 0x0a, 0xb8, 0xee, 0xc0, 0x0a, 0xbc, 0xf7, 0x54, 0xfb, + 0x29, 0x48, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x90, 0xec, + 0x02, 0x0a, 0xbc, 0xf7, 0x1e, 0xfb, 0x00, 0xf0, 0x4b, 0xf8, 0xb8, 0xee, + 0xca, 0x0a, 0xbc, 0xf7, 0x45, 0xfb, 0xb0, 0xee, 0x48, 0x1a, 0xf0, 0xee, + 0x68, 0x1a, 0xbc, 0xf7, 0xec, 0xfa, 0x00, 0xf0, 0x3f, 0xf8, 0xb8, 0xee, + 0xea, 0x0a, 0xbc, 0xf7, 0x39, 0xfb, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, + 0x60, 0x1a, 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, 0xbc, 0xf7, + 0x15, 0xfb, 0x00, 0xf0, 0x2f, 0xf8, 0x97, 0xed, 0x03, 0xaa, 0xba, 0xf7, + 0xd1, 0xfd, 0xdf, 0xed, 0x13, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0x80, 0xee, + 0x0a, 0xaa, 0xb0, 0xee, 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, 0xba, 0xf7, + 0xcf, 0xfd, 0x7a, 0xee, 0x29, 0x0a, 0xc5, 0xed, 0x01, 0x0a, 0x85, 0xed, + 0x02, 0x0a, 0x70, 0x6c, 0xb9, 0x68, 0x88, 0x42, 0x03, 0xda, 0x40, 0x46, + 0x00, 0xf0, 0x17, 0xf8, 0x05, 0xe0, 0x19, 0xee, 0x10, 0x2a, 0x49, 0x46, + 0x40, 0x46, 0x00, 0xf0, 0x1c, 0xf8, 0xbd, 0xec, 0x06, 0x8b, 0x20, 0x46, + 0xbd, 0xe8, 0xf2, 0x83, 0x00, 0x00, 0x00, 0x00, 0xdb, 0x0f, 0xc9, 0x40, + 0x04, 0x56, 0x00, 0x21, 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, 0x60, 0x8a, + 0x70, 0x47, 0x00, 0x21, 0x00, 0xeb, 0x01, 0x12, 0x49, 0x1c, 0x93, 0x68, + 0xd3, 0x60, 0x04, 0x29, 0xf8, 0xd3, 0x01, 0x21, 0x80, 0xf8, 0xfc, 0x10, + 0x70, 0x47, 0x04, 0x29, 0x00, 0xd3, 0x70, 0x47, 0x10, 0xb5, 0x00, 0xeb, + 0x01, 0x11, 0x01, 0x24, 0xcb, 0x68, 0x04, 0xfa, 0x02, 0xf2, 0x23, 0xea, + 0x02, 0x02, 0xca, 0x60, 0x00, 0x21, 0x80, 0xf8, 0xfc, 0x10, 0x10, 0xbd, + 0x10, 0xb5, 0x0c, 0x46, 0x00, 0xf0, 0x06, 0xf8, 0x00, 0x20, 0x20, 0x61, + 0x60, 0x61, 0xa0, 0x61, 0xe0, 0x61, 0x10, 0xbd, 0x38, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0xc8, 0xf7, 0x40, 0xff, 0x20, 0x46, 0xc9, 0xf7, 0xb0, 0xfe, + 0x68, 0x60, 0x20, 0x46, 0xc9, 0xf7, 0xaa, 0xfe, 0xa8, 0x60, 0x02, 0x21, + 0x20, 0x46, 0xe7, 0xf7, 0x0a, 0xfe, 0xe8, 0x60, 0x31, 0xbd, 0xf8, 0xb5, + 0x04, 0x46, 0x1e, 0x46, 0xa7, 0x69, 0x3c, 0x23, 0x5f, 0x43, 0xe3, 0x19, + 0x15, 0x46, 0x03, 0xf1, 0x20, 0x07, 0x34, 0x22, 0x38, 0x46, 0xbb, 0xf7, + 0x0b, 0xfb, 0x07, 0xf1, 0x34, 0x00, 0x06, 0x60, 0x05, 0x71, 0xa0, 0x69, + 0x40, 0x1c, 0x00, 0xf0, 0x0f, 0x00, 0xa0, 0x61, 0x20, 0x69, 0x10, 0x28, + 0x3c, 0xbf, 0x40, 0x1c, 0x20, 0x61, 0xf1, 0xbd, 0xc2, 0x69, 0x00, 0xeb, + 0xc2, 0x03, 0x03, 0xf5, 0x78, 0x72, 0x51, 0x60, 0x82, 0xed, 0x00, 0x0a, + 0xc1, 0x69, 0x49, 0x1c, 0x01, 0xf0, 0x0f, 0x01, 0xc1, 0x61, 0x41, 0x69, + 0x0f, 0x29, 0x9c, 0xbf, 0x49, 0x1c, 0x41, 0x61, 0x70, 0x47, 0x2d, 0xe9, + 0xf8, 0x4f, 0x8e, 0xb0, 0x0f, 0x68, 0x81, 0x46, 0x93, 0x46, 0x7f, 0x1e, + 0x4f, 0xf4, 0x80, 0x72, 0x06, 0xa9, 0x68, 0x46, 0xf8, 0xf7, 0x20, 0xfe, + 0x7f, 0x1c, 0x4f, 0xf4, 0x80, 0x71, 0xb1, 0xfb, 0xf7, 0xfa, 0x4f, 0xf0, + 0x00, 0x08, 0x00, 0x24, 0xe1, 0xb2, 0x48, 0x46, 0x00, 0xf0, 0x01, 0xfc, + 0xb0, 0xfb, 0xf7, 0xf5, 0x29, 0x46, 0x68, 0x46, 0xf8, 0xf7, 0x5b, 0xfe, + 0x28, 0xb9, 0x29, 0x46, 0x68, 0x46, 0xf8, 0xf7, 0x36, 0xfe, 0x08, 0xf1, + 0x01, 0x08, 0x64, 0x1c, 0xb4, 0xf5, 0x80, 0x7f, 0xea, 0xd3, 0xb8, 0xf1, + 0x41, 0x0f, 0xd9, 0xd2, 0x00, 0x25, 0x00, 0x24, 0x21, 0xe0, 0x21, 0x46, + 0x68, 0x46, 0xf8, 0xf7, 0x46, 0xfe, 0x01, 0x28, 0x1a, 0xd1, 0x00, 0x26, + 0xf1, 0xb2, 0x48, 0x46, 0x00, 0xf0, 0xdf, 0xfb, 0xb0, 0xfb, 0xf7, 0xf0, + 0xa0, 0x42, 0x04, 0xd1, 0xea, 0xb2, 0xf1, 0xb2, 0x48, 0x46, 0x00, 0xf0, + 0xde, 0xfb, 0x76, 0x1c, 0xb6, 0xf5, 0x80, 0x7f, 0xee, 0xd3, 0x78, 0x1c, + 0x40, 0x08, 0xea, 0xb2, 0x07, 0xfb, 0x04, 0x00, 0x5a, 0x44, 0x41, 0x1e, + 0x91, 0x70, 0x6d, 0x1c, 0x64, 0x1c, 0x54, 0x45, 0xdb, 0xd3, 0x42, 0x46, + 0x0b, 0xf1, 0x60, 0x01, 0x0b, 0xf1, 0x48, 0x00, 0xf8, 0xf7, 0xd2, 0xfd, + 0x8b, 0xf8, 0x00, 0x80, 0x00, 0x20, 0x8b, 0xf8, 0x01, 0x70, 0x8b, 0xf8, + 0x68, 0x00, 0x0f, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x38, 0xb5, 0x04, 0x46, + 0x0d, 0x46, 0x94, 0xf8, 0x68, 0x10, 0x6a, 0x46, 0x04, 0xf1, 0x48, 0x00, + 0xf8, 0xf7, 0x3a, 0xfe, 0x00, 0x99, 0x29, 0x70, 0x23, 0x78, 0x00, 0x9a, + 0x5b, 0x1e, 0x9a, 0x42, 0x34, 0xbf, 0x52, 0x1c, 0x00, 0x22, 0x00, 0x92, + 0x00, 0x99, 0x84, 0xf8, 0x68, 0x10, 0x32, 0xbd, 0x48, 0x30, 0xf8, 0xf7, + 0xc7, 0xbd, 0x48, 0x30, 0xf8, 0xf7, 0xe1, 0xbd, 0xf8, 0xb5, 0x04, 0x46, + 0x00, 0x25, 0xb6, 0x4e, 0x56, 0xf8, 0x24, 0x20, 0x02, 0xeb, 0xc5, 0x17, + 0x80, 0x21, 0x38, 0x46, 0xcd, 0xf7, 0x14, 0xfc, 0x6d, 0x1c, 0x4f, 0xf4, + 0x80, 0x52, 0x40, 0x2d, 0x7a, 0x63, 0xf1, 0xd3, 0xaf, 0x49, 0xb0, 0x48, + 0x51, 0xf8, 0x24, 0x20, 0x02, 0xf5, 0x90, 0x72, 0x4f, 0xf4, 0x80, 0x11, + 0x10, 0x60, 0x00, 0x22, 0xac, 0x48, 0x50, 0xf8, 0x24, 0x00, 0x40, 0xf8, + 0xf8, 0x1f, 0x02, 0x60, 0xf1, 0xbd, 0x40, 0x29, 0x00, 0xd3, 0x70, 0x47, + 0x2d, 0xe9, 0xf0, 0x41, 0xa6, 0x4c, 0xa3, 0x4f, 0x54, 0xf8, 0x20, 0x40, + 0xa5, 0x4e, 0x54, 0xf8, 0xf8, 0x8f, 0xdf, 0xf8, 0x94, 0xc2, 0x4f, 0xf4, + 0x80, 0x35, 0x25, 0x60, 0x57, 0xf8, 0x20, 0x00, 0x5f, 0x68, 0x00, 0xeb, + 0xc1, 0x11, 0x18, 0x68, 0x40, 0x42, 0x7f, 0x42, 0xc0, 0xf3, 0x11, 0x00, + 0x40, 0xea, 0x87, 0x40, 0x08, 0x60, 0x98, 0x68, 0xdf, 0x68, 0x40, 0x42, + 0x7f, 0x42, 0x06, 0xea, 0x00, 0x10, 0x40, 0xea, 0x87, 0x56, 0x58, 0x68, + 0x40, 0x42, 0x80, 0x0b, 0x00, 0xf0, 0x0f, 0x00, 0x30, 0x43, 0x48, 0x60, + 0x1f, 0x69, 0x58, 0x69, 0x94, 0x4e, 0x7f, 0x42, 0x40, 0x42, 0x06, 0xea, + 0x07, 0x26, 0x46, 0xea, 0x80, 0x66, 0xd8, 0x68, 0x40, 0x42, 0x87, 0x03, + 0x46, 0xea, 0x17, 0x60, 0x88, 0x60, 0x8f, 0x4f, 0x98, 0x69, 0x40, 0x42, + 0x07, 0xea, 0x00, 0x37, 0x58, 0x69, 0x40, 0x42, 0x83, 0x03, 0x57, 0xea, + 0x13, 0x57, 0xcf, 0x60, 0x10, 0x68, 0x8a, 0x4b, 0x80, 0x03, 0x08, 0x62, + 0x57, 0x68, 0x90, 0x68, 0x03, 0xea, 0x87, 0x06, 0x46, 0xea, 0x80, 0x56, + 0x10, 0x68, 0x86, 0x4f, 0xc0, 0xf3, 0x81, 0x40, 0x30, 0x43, 0x48, 0x62, + 0xd6, 0x68, 0x10, 0x69, 0x07, 0xea, 0x86, 0x26, 0x46, 0xea, 0x80, 0x76, + 0x90, 0x68, 0xc0, 0xf3, 0x89, 0x20, 0x30, 0x43, 0x88, 0x62, 0x16, 0x69, + 0x50, 0x69, 0xc6, 0xf3, 0x91, 0x06, 0x46, 0xea, 0x80, 0x40, 0xc8, 0x62, + 0xd2, 0xf8, 0x18, 0xe0, 0xd0, 0x69, 0x0c, 0xea, 0x8e, 0x16, 0x46, 0xea, + 0x80, 0x66, 0x50, 0x69, 0xc0, 0xf3, 0x85, 0x30, 0x06, 0x43, 0x0e, 0x63, + 0xd6, 0x69, 0x10, 0x6a, 0xc6, 0xf3, 0x8d, 0x16, 0x46, 0xea, 0x80, 0x30, + 0x48, 0x63, 0x56, 0x6a, 0x90, 0x6a, 0x03, 0xea, 0x86, 0x03, 0x43, 0xea, + 0x80, 0x53, 0x10, 0x6a, 0xc0, 0xf3, 0x81, 0x40, 0x03, 0x43, 0x8b, 0x63, + 0xd3, 0x6a, 0x10, 0x6b, 0x07, 0xea, 0x83, 0x27, 0x47, 0xea, 0x80, 0x77, + 0x90, 0x6a, 0xc0, 0xf3, 0x89, 0x20, 0x07, 0x43, 0xcf, 0x63, 0x13, 0x6b, + 0x50, 0x6b, 0xc3, 0xf3, 0x91, 0x03, 0x43, 0xea, 0x80, 0x43, 0x0b, 0x64, + 0x90, 0x6b, 0x0c, 0xea, 0x80, 0x13, 0x50, 0x6b, 0xc0, 0xf3, 0x85, 0x30, + 0x18, 0x43, 0x48, 0x64, 0x00, 0x21, 0x21, 0x60, 0x4f, 0xf4, 0x80, 0x10, + 0x20, 0x60, 0x21, 0x60, 0xc8, 0xf3, 0x00, 0x40, 0x00, 0xb1, 0x25, 0x60, + 0xbd, 0xe8, 0xf0, 0x81, 0x40, 0x29, 0x00, 0xd3, 0x70, 0x47, 0x10, 0xb5, + 0x4d, 0x4c, 0x54, 0xf8, 0x20, 0x00, 0x00, 0xeb, 0xc1, 0x10, 0x01, 0x68, + 0x89, 0x03, 0x89, 0x13, 0x49, 0x42, 0x19, 0x60, 0x04, 0x68, 0x41, 0x68, + 0x24, 0x09, 0x44, 0xea, 0x01, 0x74, 0xa4, 0x13, 0x64, 0x42, 0x5c, 0x60, + 0x41, 0x68, 0x89, 0x02, 0x89, 0x13, 0x49, 0x42, 0x99, 0x60, 0x44, 0x68, + 0x81, 0x68, 0x24, 0x0a, 0x44, 0xea, 0x01, 0x64, 0xa4, 0x13, 0x64, 0x42, + 0xdc, 0x60, 0x81, 0x68, 0x89, 0x01, 0x89, 0x13, 0x49, 0x42, 0x19, 0x61, + 0x84, 0x68, 0xc1, 0x68, 0x24, 0x0b, 0x44, 0xea, 0x01, 0x54, 0xa4, 0x13, + 0x64, 0x42, 0x5c, 0x61, 0xc1, 0x68, 0x89, 0x00, 0x89, 0x13, 0x49, 0x42, + 0x99, 0x61, 0x03, 0x6a, 0x41, 0x6a, 0x9b, 0x08, 0x43, 0xea, 0x81, 0x73, + 0x1b, 0x13, 0x13, 0x60, 0x41, 0x6a, 0x89, 0x02, 0x09, 0x13, 0x51, 0x60, + 0x43, 0x6a, 0x81, 0x6a, 0x9b, 0x0a, 0x43, 0xea, 0x81, 0x53, 0x1b, 0x13, + 0x93, 0x60, 0x81, 0x6a, 0x89, 0x00, 0x09, 0x13, 0xd1, 0x60, 0x83, 0x6a, + 0xc1, 0x6a, 0x9b, 0x0c, 0x43, 0xea, 0x81, 0x33, 0x1b, 0x13, 0x13, 0x61, + 0xc3, 0x6a, 0x01, 0x6b, 0x9b, 0x09, 0x43, 0xea, 0x81, 0x63, 0x1b, 0x13, + 0x53, 0x61, 0x01, 0x6b, 0x89, 0x01, 0x09, 0x13, 0x91, 0x61, 0x03, 0x6b, + 0x41, 0x6b, 0x9b, 0x0b, 0x43, 0xea, 0x81, 0x43, 0x1b, 0x13, 0xd3, 0x61, + 0x43, 0x6b, 0x81, 0x6b, 0x9b, 0x08, 0x43, 0xea, 0x81, 0x73, 0x1b, 0x13, + 0x13, 0x62, 0x81, 0x6b, 0x89, 0x02, 0x09, 0x13, 0x51, 0x62, 0x83, 0x6b, + 0xc1, 0x6b, 0x9b, 0x0a, 0x43, 0xea, 0x81, 0x53, 0x1b, 0x13, 0x93, 0x62, + 0xc1, 0x6b, 0x89, 0x00, 0x09, 0x13, 0xd1, 0x62, 0xc3, 0x6b, 0x01, 0x6c, + 0x9b, 0x0c, 0x43, 0xea, 0x81, 0x33, 0x1b, 0x13, 0x13, 0x63, 0x03, 0x6c, + 0x41, 0x6c, 0x9b, 0x09, 0x43, 0xea, 0x81, 0x63, 0x1b, 0x13, 0x53, 0x63, + 0x40, 0x6c, 0x80, 0x01, 0x00, 0x13, 0x90, 0x63, 0x10, 0xbd, 0x0c, 0x49, + 0x51, 0xf8, 0x20, 0x00, 0x00, 0x21, 0x40, 0xf8, 0xf8, 0x1f, 0x4f, 0xf4, + 0x80, 0x12, 0x02, 0x60, 0x01, 0x60, 0x70, 0x47, 0x06, 0x4a, 0x52, 0xf8, + 0x20, 0x00, 0x4f, 0xf4, 0x80, 0x31, 0x40, 0xf8, 0xf8, 0x1f, 0x70, 0x47, + 0x20, 0x97, 0x04, 0x02, 0x20, 0x96, 0x04, 0x02, 0x00, 0x0e, 0x06, 0x00, + 0x40, 0x96, 0x04, 0x02, 0xf0, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0x03, + 0x00, 0xff, 0xff, 0x03, 0x00, 0xf0, 0xff, 0x3f, 0xfc, 0xff, 0x3f, 0x00, + 0x00, 0xfc, 0xff, 0x3f, 0xf8, 0xb5, 0x96, 0xb0, 0x04, 0x46, 0x0d, 0x46, + 0x16, 0x46, 0x1f, 0x46, 0x3c, 0x21, 0x07, 0xa8, 0xcd, 0xf7, 0x92, 0xfa, + 0x1c, 0x21, 0x68, 0x46, 0xcd, 0xf7, 0x8e, 0xfa, 0x0e, 0x96, 0x03, 0x97, + 0x6b, 0x46, 0x07, 0xaa, 0x29, 0x46, 0x20, 0x46, 0xff, 0xf7, 0x89, 0xfe, + 0x17, 0xb0, 0xf0, 0xbd, 0x38, 0xb5, 0x96, 0xb0, 0x14, 0x46, 0x1d, 0x46, + 0x6b, 0x46, 0x07, 0xaa, 0xff, 0xf7, 0x2c, 0xff, 0x0e, 0x98, 0x20, 0x60, + 0x03, 0x99, 0x29, 0x60, 0x17, 0xb0, 0x30, 0xbd, 0x70, 0xb5, 0x0c, 0x46, + 0x15, 0x46, 0x1e, 0x46, 0x4f, 0xf4, 0xc2, 0x71, 0x20, 0x46, 0xcd, 0xf7, + 0x6d, 0xfa, 0x04, 0xf5, 0xc0, 0x70, 0x05, 0x80, 0x46, 0x80, 0x70, 0xbd, + 0xf0, 0xb5, 0x02, 0x46, 0x00, 0x23, 0x00, 0x20, 0x00, 0x24, 0x30, 0x25, + 0x65, 0x43, 0x0d, 0x44, 0x2e, 0x78, 0x01, 0x2e, 0x18, 0xd1, 0xee, 0x6a, + 0x9e, 0x42, 0x15, 0xd3, 0x6f, 0x88, 0xd5, 0xed, 0x01, 0x0a, 0x70, 0xee, + 0x60, 0x0a, 0x01, 0xee, 0x10, 0x7a, 0xf0, 0xee, 0xe0, 0x0a, 0xb8, 0xee, + 0x41, 0x1a, 0x21, 0xee, 0x20, 0x1a, 0xd2, 0xed, 0x00, 0x0a, 0xb4, 0xee, + 0x60, 0x1a, 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xbf, 0x33, 0x46, 0x28, 0x46, + 0x64, 0x1c, 0x08, 0x2c, 0xdd, 0xd3, 0xf0, 0xbd, 0x01, 0x46, 0x00, 0x20, + 0x21, 0xb1, 0x91, 0xf8, 0x26, 0x20, 0x0c, 0x20, 0x42, 0x43, 0x88, 0x18, + 0x70, 0x47, 0x2d, 0xe9, 0xf1, 0x4f, 0x2d, 0xed, 0x0a, 0x8b, 0x14, 0x00, + 0x8b, 0x46, 0x98, 0x46, 0xf0, 0xee, 0x60, 0xaa, 0xb0, 0xee, 0x41, 0xba, + 0xf0, 0xee, 0x61, 0xba, 0xb0, 0xee, 0x42, 0xca, 0x18, 0xd1, 0x00, 0x21, + 0x00, 0x24, 0x00, 0x22, 0x30, 0x20, 0x50, 0x43, 0x0b, 0xeb, 0x00, 0x03, + 0x1b, 0xf8, 0x00, 0x00, 0x00, 0x28, 0x4f, 0xd0, 0x98, 0x6a, 0xa8, 0xeb, + 0x00, 0x00, 0x88, 0x42, 0x24, 0xbf, 0x01, 0x46, 0x1c, 0x46, 0x52, 0x1c, + 0x08, 0x2a, 0xed, 0xd3, 0x30, 0x21, 0x20, 0x46, 0xcd, 0xf7, 0x0e, 0xfa, + 0x04, 0xf1, 0x24, 0x06, 0xb0, 0x78, 0xdd, 0xf8, 0x28, 0xa0, 0xdd, 0xf8, + 0x50, 0x90, 0x00, 0x28, 0xff, 0xee, 0x00, 0x9a, 0xb0, 0xee, 0x6a, 0x8a, + 0xf0, 0xee, 0x6b, 0x8a, 0xb0, 0xee, 0x4c, 0x9a, 0x40, 0xf0, 0x90, 0x80, + 0xa4, 0xf8, 0x02, 0x90, 0x84, 0xed, 0x01, 0x8a, 0x00, 0x25, 0x70, 0x78, + 0x00, 0x27, 0xf0, 0xee, 0x4b, 0xca, 0x68, 0xb9, 0x9a, 0xed, 0x01, 0x0a, + 0xb4, 0xee, 0x6c, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x20, 0xd4, 0xbb, 0xf8, + 0x80, 0x01, 0x48, 0x45, 0x1c, 0xd2, 0x00, 0xf0, 0xa6, 0xf8, 0x01, 0x27, + 0x70, 0x78, 0x01, 0x28, 0x0c, 0xd1, 0x9a, 0xed, 0x03, 0x0a, 0xb4, 0xee, + 0x6c, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x12, 0xd5, 0x22, 0x46, 0x59, 0x46, + 0x50, 0x46, 0x00, 0xf0, 0x05, 0xf9, 0x01, 0x25, 0x01, 0x20, 0x20, 0x70, + 0xc4, 0xed, 0x02, 0x8a, 0xc6, 0xf8, 0x04, 0x80, 0xb5, 0xb9, 0x3d, 0xe0, + 0x1c, 0x46, 0xb7, 0xe7, 0x01, 0x20, 0x70, 0x70, 0xe5, 0xe7, 0x9a, 0xed, + 0x02, 0x0a, 0xf4, 0xee, 0x40, 0xca, 0xf1, 0xee, 0x10, 0xfa, 0xea, 0xd5, + 0x00, 0xf0, 0x7f, 0xf8, 0xbb, 0xf8, 0x80, 0x01, 0x61, 0x88, 0x88, 0x42, + 0xe3, 0xd2, 0x75, 0x70, 0x01, 0x27, 0xe1, 0xe7, 0x00, 0xee, 0x90, 0x9a, + 0xb0, 0xee, 0xc8, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x20, 0xee, 0x80, 0x0a, + 0xda, 0xed, 0x00, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0x0a, 0xd5, 0xb5, 0xee, 0x40, 0x8a, 0xf1, 0xee, 0x10, 0xfa, 0xc8, 0xbf, + 0x03, 0x20, 0x0d, 0xdc, 0x04, 0x21, 0x31, 0x70, 0x02, 0x20, 0x0e, 0xe0, + 0x89, 0xee, 0x28, 0x0a, 0xda, 0xed, 0x09, 0x0a, 0xf4, 0xee, 0x40, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0x03, 0xd5, 0x02, 0x20, 0x30, 0x70, 0x01, 0x20, + 0x01, 0xe0, 0x30, 0x70, 0x00, 0x20, 0xb0, 0x70, 0x1f, 0xb1, 0x00, 0x20, + 0x20, 0x73, 0x20, 0x76, 0x01, 0xe0, 0x20, 0x7b, 0x50, 0xb9, 0x60, 0x88, + 0x94, 0xed, 0x01, 0x0a, 0xe0, 0x81, 0xf7, 0xee, 0x00, 0x0a, 0x04, 0xf1, + 0x0c, 0x01, 0x50, 0x46, 0x00, 0xf0, 0x96, 0xf8, 0x20, 0x7e, 0x58, 0xbb, + 0x60, 0x88, 0x94, 0xed, 0x01, 0x0a, 0x60, 0x83, 0xf0, 0xee, 0x69, 0x0a, + 0x04, 0xf1, 0x18, 0x01, 0x50, 0x46, 0x00, 0xf0, 0x89, 0xf8, 0x1f, 0xe0, + 0x01, 0x28, 0x94, 0xed, 0x02, 0x2a, 0x0f, 0xd1, 0xf7, 0xee, 0x00, 0x2a, + 0x00, 0xf0, 0x1f, 0xf8, 0x04, 0xf1, 0x0c, 0x02, 0x59, 0x46, 0x50, 0x46, + 0x00, 0xf0, 0x23, 0xf8, 0x30, 0x78, 0x02, 0x28, 0x0c, 0xd1, 0x02, 0x21, + 0xb1, 0x70, 0x0b, 0xe0, 0xf0, 0xee, 0x69, 0x2a, 0x00, 0xf0, 0x0f, 0xf8, + 0x04, 0xf1, 0x18, 0x02, 0x59, 0x46, 0x50, 0x46, 0x00, 0xf0, 0x13, 0xf8, + 0x00, 0x20, 0xb0, 0x70, 0xb0, 0x68, 0x40, 0x1c, 0xb0, 0x60, 0xbd, 0xec, + 0x0a, 0x8b, 0xbd, 0xe8, 0xf1, 0x8f, 0xf0, 0xee, 0x49, 0x1a, 0xb0, 0xee, + 0x68, 0x1a, 0x4b, 0x46, 0x70, 0x47, 0x22, 0x46, 0x59, 0x46, 0x50, 0x46, + 0x66, 0xe0, 0x38, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0xb0, 0xee, 0x41, 0x8a, + 0xb0, 0xee, 0x40, 0x3a, 0x81, 0xee, 0x88, 0x1a, 0xb0, 0xee, 0x60, 0x0a, + 0xc8, 0xee, 0x02, 0x1a, 0xf0, 0xee, 0x62, 0x0a, 0x02, 0xee, 0x10, 0x3a, + 0xf8, 0xee, 0x42, 0x2a, 0xd0, 0xed, 0x04, 0x3a, 0x90, 0xed, 0x06, 0x4a, + 0x01, 0x25, 0x83, 0xee, 0xa2, 0x2a, 0xf5, 0xee, 0x40, 0x0a, 0xc4, 0xee, + 0x22, 0x2a, 0xf1, 0xee, 0x10, 0xfa, 0xc7, 0xbf, 0x73, 0xee, 0x62, 0x3a, + 0x33, 0xee, 0x42, 0x2a, 0x73, 0xee, 0x02, 0x3a, 0x33, 0xee, 0x22, 0x2a, + 0xd0, 0xed, 0x0a, 0x2a, 0xf4, 0xee, 0x62, 0x1a, 0xf1, 0xee, 0x10, 0xfa, + 0x14, 0x46, 0x48, 0xbf, 0x00, 0x25, 0x1d, 0xd4, 0xb4, 0xee, 0x63, 0x0a, + 0xf1, 0xee, 0x10, 0xfa, 0xa4, 0xbf, 0xb4, 0xee, 0x40, 0x2a, 0xf1, 0xee, + 0x10, 0xfa, 0x10, 0xdb, 0xb7, 0xee, 0x00, 0x0a, 0xb4, 0xee, 0x40, 0x1a, + 0xf1, 0xee, 0x10, 0xfa, 0x42, 0xbf, 0xd0, 0xed, 0x09, 0x0a, 0xf4, 0xee, + 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x05, 0xd5, 0x00, 0xf0, 0x1e, 0xf8, + 0x02, 0xe0, 0x21, 0x46, 0x00, 0xf0, 0x06, 0xf8, 0x25, 0x70, 0x84, 0xed, + 0x02, 0x8a, 0xbd, 0xec, 0x02, 0x8b, 0x31, 0xbd, 0x90, 0xed, 0x05, 0x1a, + 0x48, 0x88, 0x01, 0xee, 0x90, 0x0a, 0x60, 0xee, 0x81, 0x0a, 0xf8, 0xee, + 0x61, 0x1a, 0xc0, 0xee, 0xa1, 0x1a, 0x31, 0xee, 0x80, 0x0a, 0x81, 0xed, + 0x01, 0x0a, 0x70, 0x47, 0x0b, 0x46, 0x90, 0xed, 0x07, 0x0a, 0x02, 0xe0, + 0x0b, 0x46, 0x90, 0xed, 0x08, 0x0a, 0x11, 0x46, 0x18, 0x46, 0x38, 0xb5, + 0x0c, 0x46, 0x05, 0x46, 0x60, 0x88, 0x00, 0xee, 0x90, 0x0a, 0xf8, 0xee, + 0x60, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0xc8, 0xf7, 0x57, 0xf8, 0xbd, 0xee, + 0xc0, 0x0a, 0x10, 0xee, 0x10, 0x0a, 0x60, 0x80, 0x05, 0xf5, 0xc0, 0x70, + 0x62, 0x88, 0x01, 0x88, 0x8a, 0x42, 0x03, 0xd3, 0x41, 0x88, 0x91, 0x42, + 0x88, 0xbf, 0x11, 0x46, 0x61, 0x80, 0x31, 0xbd, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, + 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0x70, 0xb5, 0x26, 0x49, 0x51, 0xf8, 0x20, 0x40, 0x04, 0xf1, 0x74, 0x05, + 0x00, 0x23, 0x2e, 0x68, 0x00, 0xf0, 0x09, 0xf8, 0x78, 0x34, 0x06, 0xf0, + 0x01, 0x03, 0x24, 0x68, 0x00, 0xf0, 0x03, 0xf8, 0x24, 0x02, 0x20, 0x0e, + 0x70, 0xbd, 0x01, 0x22, 0x00, 0x21, 0x28, 0x46, 0xda, 0xe7, 0x1c, 0x4a, + 0x52, 0xf8, 0x20, 0x00, 0x50, 0xf8, 0x31, 0x00, 0x40, 0x03, 0x00, 0x0e, + 0x70, 0x47, 0x18, 0x4b, 0x53, 0xf8, 0x20, 0x00, 0x00, 0xeb, 0xc1, 0x00, + 0x12, 0x05, 0x41, 0x68, 0x21, 0xf0, 0x7c, 0x71, 0x02, 0xf0, 0x7c, 0x72, + 0x0a, 0x43, 0x42, 0x60, 0x70, 0x47, 0x11, 0x4a, 0x52, 0xf8, 0x20, 0x00, + 0x00, 0xeb, 0xc1, 0x01, 0x48, 0x68, 0x00, 0x0d, 0x00, 0xf0, 0x3f, 0x00, + 0x70, 0x47, 0x38, 0xb5, 0x0c, 0x46, 0x0a, 0x49, 0x51, 0xf8, 0x20, 0x50, + 0x23, 0x46, 0x4f, 0xf0, 0x7f, 0x42, 0x18, 0x21, 0x05, 0xf1, 0x80, 0x00, + 0xff, 0xf7, 0xae, 0xff, 0x23, 0x46, 0x05, 0xf1, 0x7c, 0x00, 0x01, 0xb0, + 0xbd, 0xe8, 0x30, 0x40, 0x4f, 0xf4, 0x7f, 0x42, 0x08, 0x21, 0xa3, 0xe7, + 0x40, 0x96, 0x04, 0x02, 0x00, 0x97, 0x04, 0x02, 0x30, 0xb5, 0xef, 0xf3, + 0x10, 0x84, 0x72, 0xb6, 0x05, 0x68, 0x03, 0xfa, 0x01, 0xf1, 0x95, 0x43, + 0x11, 0x40, 0x29, 0x43, 0x01, 0x60, 0x84, 0xf3, 0x10, 0x88, 0x30, 0xbd, + 0x2d, 0xe9, 0xf0, 0x41, 0x04, 0x46, 0x3f, 0x48, 0x50, 0xf8, 0x24, 0x60, + 0x0d, 0x46, 0x06, 0xf1, 0xa8, 0x07, 0x00, 0x23, 0x4f, 0xf0, 0x80, 0x52, + 0x1c, 0x21, 0x00, 0xf0, 0x4b, 0xf8, 0x2b, 0x88, 0x43, 0xf6, 0xff, 0x72, + 0x00, 0x21, 0x06, 0xf1, 0x9c, 0x00, 0xff, 0xf7, 0xdb, 0xff, 0x06, 0xf1, + 0x94, 0x08, 0x6b, 0x79, 0x4f, 0xf4, 0x7c, 0x52, 0x08, 0x21, 0x40, 0x46, + 0xff, 0xf7, 0xd2, 0xff, 0xab, 0x78, 0x4f, 0xf4, 0xe0, 0x22, 0x10, 0x21, + 0x06, 0xf1, 0x90, 0x00, 0xff, 0xf7, 0xca, 0xff, 0xeb, 0x78, 0x4f, 0xf4, + 0xf8, 0x12, 0x10, 0x21, 0x00, 0xf0, 0x2c, 0xf8, 0x06, 0xf1, 0xa4, 0x07, + 0x2b, 0x79, 0x1f, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x25, 0xf8, 0xab, 0x79, + 0xff, 0x22, 0x00, 0x21, 0x40, 0x46, 0xff, 0xf7, 0xb7, 0xff, 0xeb, 0x79, + 0x4f, 0xf0, 0x7f, 0x42, 0x18, 0x21, 0x00, 0xf0, 0x19, 0xf8, 0x98, 0x36, + 0xab, 0x68, 0x6f, 0xf0, 0x7e, 0x42, 0x00, 0x21, 0x30, 0x46, 0xff, 0xf7, + 0xa9, 0xff, 0x01, 0x23, 0x4f, 0xf0, 0x80, 0x52, 0x1c, 0x21, 0x30, 0x46, + 0xff, 0xf7, 0xa2, 0xff, 0x19, 0x48, 0x50, 0xf8, 0x24, 0x00, 0xbd, 0xe8, + 0xf0, 0x41, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0x08, 0x30, 0x97, 0xe7, + 0x38, 0x46, 0x95, 0xe7, 0x38, 0xb5, 0x12, 0x49, 0x51, 0xf8, 0x20, 0x40, + 0x04, 0xf1, 0x98, 0x05, 0x00, 0x23, 0x4f, 0xf0, 0x80, 0x52, 0x1c, 0x21, + 0x28, 0x46, 0xff, 0xf7, 0x89, 0xff, 0xff, 0x23, 0xff, 0x22, 0x00, 0x21, + 0x04, 0xf1, 0x94, 0x00, 0xff, 0xf7, 0x82, 0xff, 0xff, 0x23, 0x4f, 0xf0, + 0x7f, 0x42, 0x18, 0x21, 0x04, 0xf1, 0xa4, 0x00, 0xff, 0xf7, 0x7a, 0xff, + 0x28, 0x46, 0x01, 0xb0, 0xbd, 0xe8, 0x30, 0x40, 0x14, 0x23, 0x6f, 0xf0, + 0x7e, 0x42, 0x00, 0x21, 0x70, 0xe7, 0x00, 0x00, 0x40, 0x96, 0x04, 0x02, + 0x20, 0x96, 0x04, 0x02, 0xdf, 0xf8, 0xd0, 0x17, 0x09, 0x68, 0x0a, 0x18, + 0xed, 0x20, 0x92, 0xf8, 0xbc, 0x30, 0x43, 0x43, 0xc8, 0x18, 0x00, 0xf2, + 0x44, 0x40, 0x70, 0x47, 0x38, 0xb5, 0x2d, 0xed, 0x04, 0x8b, 0x82, 0xb0, + 0x05, 0x46, 0x00, 0xf0, 0xc1, 0xf8, 0x04, 0x00, 0x03, 0xd1, 0x28, 0x46, + 0x00, 0xf0, 0x48, 0xfb, 0x04, 0x46, 0x00, 0x2c, 0x56, 0xd1, 0x68, 0x6a, + 0xdf, 0xf8, 0x9c, 0x17, 0x88, 0x42, 0x06, 0xd3, 0x9f, 0xed, 0xa0, 0x8a, + 0xdf, 0xed, 0xa0, 0x8a, 0x9f, 0xed, 0xa0, 0x9a, 0x05, 0xe0, 0x9f, 0xed, + 0xa0, 0x8a, 0xdf, 0xed, 0xa0, 0x8a, 0x9f, 0xed, 0xa0, 0x9a, 0x28, 0x78, + 0x00, 0x21, 0xe4, 0xf7, 0x46, 0xf9, 0xff, 0x20, 0xe8, 0x86, 0x00, 0x21, + 0x29, 0x87, 0x00, 0xf0, 0x41, 0xfb, 0x69, 0x6a, 0x28, 0x78, 0xe3, 0xf7, + 0x59, 0xff, 0x00, 0xf0, 0x42, 0xfb, 0x00, 0x2c, 0x59, 0xd0, 0x6c, 0xbb, + 0xb5, 0xf9, 0x36, 0x00, 0xa9, 0x69, 0xa8, 0x86, 0x08, 0x70, 0xa8, 0x69, + 0x01, 0x78, 0x28, 0x78, 0xe4, 0xf7, 0x46, 0xf9, 0xb5, 0xf9, 0x34, 0x00, + 0xff, 0x28, 0x1a, 0xd1, 0x95, 0xed, 0x11, 0x0a, 0xb4, 0xee, 0x40, 0x8a, + 0xf1, 0xee, 0x10, 0xfa, 0xa4, 0xbf, 0xb4, 0xee, 0x49, 0x0a, 0xf1, 0xee, + 0x10, 0xfa, 0x13, 0xda, 0x10, 0xee, 0x10, 0x0a, 0xf5, 0xf7, 0x5c, 0xfa, + 0xcd, 0xe9, 0x00, 0x01, 0x2b, 0x78, 0xdf, 0xf8, 0x18, 0x27, 0x06, 0x21, + 0x01, 0x20, 0xc9, 0xf7, 0xce, 0xfa, 0x40, 0xf2, 0x06, 0x64, 0xb5, 0xf9, + 0x34, 0x00, 0x08, 0xb9, 0x40, 0xf2, 0x07, 0x64, 0x00, 0xf0, 0x14, 0xfb, + 0x04, 0xb9, 0x04, 0x46, 0x68, 0x69, 0xd5, 0xed, 0x10, 0x0a, 0x9f, 0xed, + 0x7c, 0x0a, 0x60, 0xee, 0x80, 0x0a, 0xfc, 0xee, 0xe0, 0x0a, 0xc0, 0xed, + 0x08, 0x0a, 0x95, 0xed, 0x11, 0x1a, 0x21, 0xee, 0x00, 0x0a, 0xbc, 0xee, + 0xc0, 0x0a, 0x80, 0xed, 0x07, 0x0a, 0xe9, 0x8e, 0x81, 0x82, 0x00, 0x21, + 0x2a, 0x8f, 0xc2, 0x82, 0x01, 0x76, 0xaa, 0x69, 0x11, 0x78, 0x41, 0x76, + 0x28, 0x46, 0x21, 0x46, 0x00, 0xf0, 0xde, 0xf8, 0x04, 0xb9, 0x04, 0x46, + 0x02, 0xb0, 0x20, 0x46, 0xbd, 0xec, 0x04, 0x8b, 0x32, 0xbd, 0xb5, 0xf9, + 0x36, 0x00, 0xb5, 0xf9, 0x38, 0x10, 0x81, 0x42, 0xa0, 0xda, 0x08, 0x18, + 0x00, 0xeb, 0xd0, 0x70, 0x40, 0x10, 0xa8, 0x86, 0xa8, 0x8e, 0xc1, 0xb2, + 0x28, 0x78, 0xe4, 0xf7, 0xe7, 0xf8, 0xa8, 0x68, 0x82, 0x7f, 0x02, 0x21, + 0x28, 0x46, 0x00, 0xf0, 0xc3, 0xf9, 0x04, 0x00, 0x8d, 0xd1, 0xe8, 0x69, + 0xaa, 0x6c, 0x00, 0xf1, 0x8c, 0x01, 0xca, 0x60, 0x2b, 0x6d, 0x4b, 0x61, + 0xea, 0x6b, 0x0a, 0x60, 0x6b, 0x6c, 0x8b, 0x60, 0xa9, 0x69, 0x95, 0xf8, + 0x20, 0x30, 0x0a, 0x78, 0x18, 0x44, 0x02, 0x75, 0x95, 0xf8, 0x20, 0x10, + 0x95, 0xed, 0x11, 0x0a, 0xb5, 0xf9, 0x34, 0x00, 0x49, 0x1c, 0xf4, 0xee, + 0x40, 0x8a, 0x85, 0xf8, 0x20, 0x10, 0xf1, 0xee, 0x10, 0xfa, 0x52, 0xbf, + 0xe8, 0x86, 0x40, 0x1c, 0x28, 0x87, 0xc4, 0xe7, 0xf8, 0xb5, 0x04, 0x46, + 0x25, 0x78, 0x60, 0x69, 0xe3, 0xf7, 0x53, 0xfb, 0x00, 0x21, 0x04, 0xf1, + 0x24, 0x06, 0x84, 0xf8, 0x20, 0x10, 0x31, 0x82, 0x28, 0x46, 0xc9, 0xf7, + 0xc2, 0xf8, 0x01, 0x46, 0x31, 0x60, 0xa3, 0x68, 0xe2, 0x68, 0x93, 0xf8, + 0x39, 0x00, 0x40, 0xb1, 0x10, 0x69, 0x30, 0xb9, 0x70, 0x68, 0x20, 0xb1, + 0x47, 0x42, 0x8f, 0x42, 0x6c, 0xda, 0x41, 0x18, 0x31, 0x60, 0x96, 0xed, + 0x00, 0x0a, 0xd2, 0xed, 0x01, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0xf8, 0xee, + 0x60, 0x0a, 0xc0, 0xee, 0x20, 0x0a, 0x9f, 0xed, 0x38, 0x1a, 0x20, 0xee, + 0x81, 0x1a, 0xbc, 0xee, 0xc1, 0x1a, 0x86, 0xed, 0x02, 0x1a, 0x01, 0x21, + 0xd3, 0xf8, 0x19, 0x00, 0xd6, 0xed, 0x00, 0x0a, 0x00, 0xee, 0x10, 0x0a, + 0xf8, 0xee, 0x60, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x80, 0xee, 0x80, 0x0a, + 0xbc, 0xee, 0xc0, 0x0a, 0x86, 0xed, 0x03, 0x0a, 0x20, 0x78, 0xe3, 0xf7, + 0xd8, 0xfc, 0x20, 0x78, 0xe3, 0xf7, 0xf8, 0xfc, 0x20, 0x78, 0xe3, 0xf7, + 0x7e, 0xfd, 0x94, 0xf8, 0x21, 0x00, 0x02, 0x28, 0x04, 0xbf, 0x20, 0x78, + 0xe3, 0xf7, 0x27, 0xfd, 0x20, 0x46, 0x00, 0xf0, 0x77, 0xf8, 0x31, 0x68, + 0x20, 0x78, 0xe3, 0xf7, 0x0d, 0xfe, 0xa1, 0x69, 0x7f, 0x20, 0x08, 0x70, + 0xa1, 0x69, 0x20, 0x78, 0xe3, 0xf7, 0x19, 0xff, 0xe0, 0x68, 0xc1, 0x68, + 0x20, 0x69, 0xe3, 0xf7, 0xdb, 0xfb, 0xe0, 0x69, 0x05, 0x70, 0x00, 0x23, + 0x31, 0x68, 0x41, 0x60, 0xf2, 0x68, 0x82, 0x60, 0x71, 0x6a, 0xc1, 0x60, + 0x00, 0x21, 0xf2, 0x6a, 0x02, 0x61, 0x14, 0x30, 0x00, 0x22, 0xc0, 0xe9, + 0x00, 0x12, 0xe0, 0x69, 0x00, 0xf1, 0x1c, 0x01, 0x00, 0x20, 0x81, 0xe8, + 0x0d, 0x00, 0xe0, 0x69, 0x60, 0x21, 0x28, 0x30, 0xcc, 0xf7, 0x66, 0xfe, + 0x20, 0x78, 0xe3, 0xf7, 0xc0, 0xfd, 0x05, 0x46, 0x20, 0x69, 0xc0, 0x68, + 0xd7, 0xf7, 0xb2, 0xfd, 0x28, 0x46, 0xf2, 0xbd, 0x40, 0xf2, 0x0b, 0x65, + 0xfa, 0xe7, 0x00, 0x00, 0x94, 0xf5, 0x0f, 0x3f, 0xae, 0xd4, 0xcb, 0x3e, + 0x12, 0x4d, 0x90, 0x3e, 0xf3, 0x3b, 0x35, 0x3f, 0xcb, 0x4d, 0x00, 0x3f, + 0x0d, 0xaa, 0xb5, 0x3e, 0x00, 0x00, 0x7a, 0x44, 0x2d, 0xe9, 0xf8, 0x43, + 0x06, 0x46, 0x0d, 0x46, 0x96, 0xf8, 0x00, 0x90, 0x48, 0x46, 0xe3, 0xf7, + 0xf0, 0xff, 0x80, 0x46, 0x48, 0x46, 0xe3, 0xf7, 0xa9, 0xfd, 0x04, 0x46, + 0x00, 0x21, 0x48, 0x46, 0xe3, 0xf7, 0x6f, 0xfc, 0x30, 0x78, 0x00, 0x22, + 0x00, 0x21, 0xe3, 0xf7, 0x98, 0xfb, 0x30, 0x78, 0xe3, 0xf7, 0x9e, 0xfc, + 0x30, 0x78, 0xe3, 0xf7, 0x40, 0xfd, 0x96, 0xf8, 0x21, 0x00, 0x00, 0x27, + 0x02, 0x28, 0x04, 0xbf, 0x30, 0x78, 0xe3, 0xf7, 0xd5, 0xfc, 0x0d, 0xb1, + 0x2f, 0x46, 0x01, 0xe0, 0x04, 0xb1, 0x27, 0x46, 0xf0, 0x69, 0xa0, 0xf8, + 0xa4, 0x80, 0x38, 0x46, 0xbd, 0xe8, 0xf2, 0x83, 0x2d, 0xe9, 0xf0, 0x41, + 0x2d, 0xed, 0x06, 0x8b, 0x05, 0x46, 0x82, 0xb0, 0x28, 0x78, 0xff, 0xf7, + 0x57, 0xfe, 0x07, 0x46, 0x28, 0x78, 0xe3, 0xf7, 0x5f, 0xfb, 0x06, 0x46, + 0xf8, 0x68, 0x05, 0xf1, 0x24, 0x04, 0x40, 0x00, 0xd4, 0xed, 0x03, 0x0a, + 0x01, 0xee, 0x10, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0xb8, 0xee, 0x41, 0x1a, + 0x80, 0xee, 0x81, 0x0a, 0x9f, 0xed, 0xcf, 0x8a, 0x00, 0xf0, 0xac, 0xf8, + 0x80, 0xee, 0x28, 0x0a, 0x20, 0xee, 0x00, 0x0a, 0xf7, 0xee, 0x00, 0x0a, + 0xc0, 0xee, 0x80, 0x0a, 0xc4, 0xed, 0x09, 0x0a, 0xf8, 0x68, 0x27, 0x68, + 0x40, 0x00, 0x00, 0xee, 0x10, 0x7a, 0x00, 0xee, 0x90, 0x0a, 0xb8, 0xee, + 0x40, 0x0a, 0xf8, 0xee, 0x60, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0x00, 0xf0, + 0x93, 0xf8, 0x80, 0xee, 0x28, 0x0a, 0x20, 0xee, 0x00, 0x0a, 0xb7, 0xee, + 0x00, 0x1a, 0xdf, 0xf8, 0x18, 0x04, 0x81, 0xee, 0x00, 0x0a, 0x87, 0x42, + 0x84, 0xed, 0x0b, 0x0a, 0x06, 0xd3, 0x2e, 0xb1, 0xdf, 0xed, 0xba, 0x0a, + 0x80, 0xee, 0x20, 0x0a, 0x84, 0xed, 0x0b, 0x0a, 0x00, 0x21, 0x28, 0x78, + 0xe6, 0xf7, 0x5a, 0xfb, 0x06, 0x46, 0x21, 0x68, 0x40, 0x08, 0x88, 0x42, + 0x6f, 0xd2, 0x28, 0x78, 0xdf, 0xf8, 0xec, 0x73, 0xe3, 0xf7, 0x10, 0xfb, + 0x80, 0x46, 0x28, 0x78, 0x69, 0x46, 0xc7, 0xf7, 0xc8, 0xff, 0xb8, 0xf1, + 0x00, 0x0f, 0x08, 0xd1, 0x00, 0x98, 0xb0, 0xf5, 0x34, 0x2f, 0x19, 0xbf, + 0x12, 0x37, 0x01, 0x20, 0x1b, 0x37, 0x02, 0x20, 0x00, 0xe0, 0x00, 0x20, + 0x85, 0xf8, 0x21, 0x00, 0x01, 0x22, 0x28, 0x78, 0x39, 0x46, 0xe3, 0xf7, + 0x0a, 0xfb, 0x28, 0x78, 0x69, 0x46, 0xc7, 0xf7, 0xb0, 0xff, 0x95, 0xf8, + 0x21, 0x00, 0x02, 0x28, 0x0f, 0xbf, 0x38, 0x7a, 0x00, 0x98, 0xb0, 0xfb, + 0xf6, 0xf0, 0xc0, 0xb2, 0x46, 0x43, 0x00, 0xee, 0x10, 0x6a, 0xf8, 0xee, + 0x40, 0x8a, 0x94, 0xed, 0x03, 0x0a, 0xb8, 0xee, 0x40, 0x0a, 0x80, 0xee, + 0x28, 0x0a, 0x60, 0xee, 0x08, 0x9a, 0x00, 0xee, 0x10, 0x0a, 0xb8, 0xee, + 0x40, 0x9a, 0x29, 0xee, 0x89, 0x0a, 0xba, 0xf7, 0xfb, 0xfc, 0xb0, 0xee, + 0x40, 0xaa, 0xb0, 0xee, 0x69, 0x0a, 0xba, 0xf7, 0xf5, 0xfc, 0x29, 0xee, + 0x00, 0x0a, 0x8a, 0xee, 0x00, 0x0a, 0x20, 0xee, 0x00, 0x0a, 0xd4, 0xed, + 0x09, 0x0a, 0x94, 0xed, 0x00, 0x1a, 0x80, 0xee, 0x80, 0x0a, 0x84, 0xed, + 0x09, 0x0a, 0xb8, 0xee, 0x41, 0x1a, 0x81, 0xee, 0x28, 0x0a, 0x20, 0xee, + 0x08, 0x8a, 0x28, 0xee, 0x09, 0x0a, 0xba, 0xf7, 0xdd, 0xfc, 0xf0, 0xee, + 0x40, 0x8a, 0xb0, 0xee, 0x48, 0x0a, 0xba, 0xf7, 0xd7, 0xfc, 0x29, 0xee, + 0x00, 0x0a, 0x88, 0xee, 0x80, 0x0a, 0x20, 0xee, 0x00, 0x0a, 0xd4, 0xed, + 0x0b, 0x0a, 0x80, 0xee, 0x80, 0x0a, 0x84, 0xed, 0x0b, 0x0a, 0x02, 0xb0, + 0xbd, 0xec, 0x06, 0x8b, 0xbd, 0xe8, 0xf0, 0x81, 0x60, 0xee, 0x08, 0x8a, + 0xb0, 0xee, 0x68, 0x0a, 0xba, 0xf7, 0xc0, 0xbc, 0x2d, 0xe9, 0xf0, 0x4f, + 0x05, 0x46, 0x89, 0x46, 0x00, 0x27, 0x89, 0xb0, 0xe8, 0x68, 0x95, 0xf8, + 0x00, 0xb0, 0xc1, 0x68, 0xb9, 0xf1, 0x02, 0x0f, 0x0c, 0xbf, 0x6e, 0x6a, + 0x2e, 0x6b, 0x8b, 0x1b, 0x71, 0x18, 0x07, 0x93, 0x08, 0x91, 0x8d, 0xf8, + 0x04, 0x70, 0x05, 0xeb, 0x89, 0x00, 0x04, 0x90, 0x0d, 0xf1, 0x14, 0x08, + 0x02, 0xac, 0x8d, 0xf8, 0x05, 0x20, 0x06, 0xe0, 0x49, 0x1c, 0x8d, 0xf8, + 0x04, 0x10, 0x00, 0x27, 0xc0, 0x68, 0xd7, 0xf7, 0x77, 0xfc, 0x05, 0x97, + 0xc8, 0xf8, 0x04, 0x70, 0xba, 0x46, 0x04, 0xe0, 0x40, 0xf2, 0x04, 0x60, + 0x07, 0x46, 0x0a, 0xf1, 0x01, 0x0a, 0x9d, 0xf8, 0x05, 0x10, 0x5f, 0xfa, + 0x8a, 0xf0, 0x88, 0x42, 0x2f, 0xd2, 0x38, 0x46, 0x00, 0x27, 0x00, 0x28, + 0xf2, 0xd1, 0x02, 0xa8, 0x00, 0xeb, 0x87, 0x01, 0x00, 0x91, 0x07, 0xa8, + 0x4b, 0x46, 0x50, 0xf8, 0x27, 0x10, 0x28, 0x69, 0x90, 0xed, 0x02, 0x0a, + 0x32, 0x46, 0x58, 0x46, 0xe3, 0xf7, 0x18, 0xfd, 0x04, 0xeb, 0x87, 0x01, + 0x5f, 0xea, 0x09, 0x02, 0x91, 0xed, 0x00, 0x0a, 0x07, 0xd1, 0x29, 0x69, + 0xd1, 0xed, 0x01, 0x0a, 0xb4, 0xee, 0x60, 0x0a, 0xf1, 0xee, 0x10, 0xfa, + 0xd2, 0xd4, 0x08, 0xeb, 0x87, 0x01, 0x08, 0xeb, 0x87, 0x02, 0x91, 0xed, + 0x00, 0x1a, 0x7f, 0x1c, 0x31, 0xee, 0x00, 0x0a, 0x01, 0x2f, 0x82, 0xed, + 0x00, 0x0a, 0xd2, 0xdd, 0xc6, 0xe7, 0x00, 0x21, 0xaf, 0xb9, 0x9d, 0xf8, + 0x05, 0x00, 0x02, 0x46, 0x00, 0xee, 0x10, 0x2a, 0x08, 0xeb, 0x81, 0x02, + 0xb8, 0xee, 0x40, 0x0a, 0xd2, 0xed, 0x00, 0x0a, 0x04, 0xeb, 0x81, 0x03, + 0x49, 0x1c, 0x80, 0xee, 0x80, 0x0a, 0x01, 0x29, 0x83, 0xed, 0x00, 0x0a, + 0xed, 0xdd, 0x8d, 0xf8, 0x05, 0x00, 0x94, 0xed, 0x01, 0x0a, 0xdd, 0xed, + 0x02, 0x0a, 0x80, 0xee, 0x20, 0x0a, 0xba, 0xf7, 0x3d, 0xfc, 0x67, 0xb9, + 0xf2, 0xee, 0x04, 0x0a, 0x20, 0xee, 0x20, 0x0a, 0x9f, 0xed, 0x48, 0x1a, + 0xb4, 0xee, 0x41, 0x0a, 0xf1, 0xee, 0x10, 0xfa, 0x44, 0xdb, 0x40, 0xf2, + 0x04, 0x67, 0x28, 0x69, 0x9d, 0xf8, 0x04, 0x10, 0x02, 0x78, 0x91, 0x42, + 0x04, 0xd2, 0x40, 0xf2, 0x04, 0x63, 0x9f, 0x42, 0x3f, 0xf4, 0x80, 0xaf, + 0x9d, 0xf8, 0x04, 0x10, 0x38, 0x00, 0x00, 0xee, 0x10, 0x1a, 0xb8, 0xee, + 0x40, 0x0a, 0x36, 0xd1, 0x5f, 0xea, 0x09, 0x01, 0x36, 0xd0, 0x04, 0x99, + 0xd1, 0xed, 0x0f, 0x0a, 0x91, 0xed, 0x12, 0x1a, 0x60, 0xee, 0x81, 0x0a, + 0xc1, 0xed, 0x0f, 0x0a, 0x04, 0x99, 0x95, 0xed, 0x0f, 0x1a, 0xc0, 0xee, + 0x81, 0x0a, 0xc1, 0xed, 0x0f, 0x0a, 0xb9, 0xf1, 0x02, 0x0f, 0x16, 0xd1, + 0x95, 0xf8, 0x20, 0x30, 0xea, 0x69, 0x0c, 0x21, 0x4b, 0x43, 0x13, 0x44, + 0x02, 0x9a, 0x9a, 0x62, 0x95, 0xf8, 0x20, 0x20, 0xeb, 0x69, 0x4a, 0x43, + 0x1a, 0x44, 0x63, 0x68, 0xd3, 0x62, 0x95, 0xf8, 0x20, 0x30, 0xea, 0x69, + 0x11, 0xfb, 0x03, 0xf1, 0x11, 0x44, 0x81, 0xed, 0x0c, 0x0a, 0x09, 0xb0, + 0xbd, 0xe8, 0xf0, 0x8f, 0x02, 0xa8, 0x00, 0xf0, 0xa9, 0xf8, 0x04, 0x98, + 0x80, 0xed, 0x0f, 0x0a, 0xc0, 0xe7, 0x5f, 0xea, 0x09, 0x01, 0xd8, 0xd1, + 0xe9, 0x69, 0x02, 0x9a, 0xca, 0x61, 0xe9, 0x69, 0x62, 0x68, 0x0a, 0x62, + 0xe9, 0x69, 0x81, 0xed, 0x09, 0x0a, 0xe8, 0xe7, 0xdb, 0x0f, 0x49, 0x40, + 0x1c, 0x7c, 0x81, 0x3f, 0x38, 0xb5, 0x05, 0x46, 0x00, 0xf0, 0x14, 0xf8, + 0x29, 0x6b, 0x28, 0x78, 0xe3, 0xf7, 0x2c, 0xfc, 0x00, 0xf0, 0x15, 0xf8, + 0x34, 0xb9, 0xa8, 0x68, 0x82, 0x7f, 0x00, 0x21, 0x28, 0x46, 0xff, 0xf7, + 0x01, 0xff, 0x04, 0x46, 0x00, 0xf0, 0x10, 0xf8, 0x04, 0xb9, 0x04, 0x46, + 0x20, 0x46, 0x32, 0xbd, 0x01, 0x21, 0xa8, 0x68, 0x00, 0x91, 0x1d, 0x30, + 0x83, 0x79, 0x02, 0x78, 0x70, 0x47, 0x04, 0x46, 0x28, 0x69, 0xc0, 0x68, + 0xd7, 0xf7, 0x8a, 0xbb, 0xa8, 0x68, 0x1d, 0x30, 0x00, 0x21, 0x00, 0x91, + 0x83, 0x79, 0x02, 0x78, 0x29, 0x6b, 0x28, 0x78, 0xe3, 0xf7, 0x06, 0xbc, + 0x01, 0x00, 0x00, 0x3f, 0x2d, 0xe9, 0xf0, 0x43, 0x89, 0xb0, 0x80, 0x46, + 0x89, 0x46, 0x16, 0x46, 0x1f, 0x46, 0xff, 0xf7, 0x67, 0xfc, 0x68, 0x46, + 0x2b, 0x49, 0x24, 0x22, 0xba, 0xf7, 0x62, 0xfa, 0x40, 0x46, 0xc8, 0xf7, + 0xf2, 0xfd, 0x04, 0x90, 0x03, 0xa9, 0x40, 0x46, 0xc7, 0xf7, 0x60, 0xfe, + 0x68, 0x46, 0x00, 0xf0, 0xcd, 0xf8, 0x06, 0x98, 0x00, 0x24, 0x01, 0x28, + 0x04, 0xbf, 0x08, 0x98, 0x03, 0x90, 0x40, 0x46, 0xc8, 0xf7, 0xf3, 0xfd, + 0x01, 0x90, 0x40, 0x46, 0xc8, 0xf7, 0xc5, 0xfc, 0x05, 0x46, 0x00, 0x21, + 0x40, 0x46, 0xe6, 0xf7, 0x91, 0xf9, 0xb5, 0xfb, 0xf0, 0xf1, 0xc9, 0xb2, + 0x00, 0x91, 0x6d, 0x08, 0x01, 0x99, 0x8d, 0x42, 0x02, 0xd2, 0x00, 0x9a, + 0x52, 0x00, 0x00, 0x92, 0x02, 0x90, 0x68, 0x46, 0x00, 0xf0, 0x44, 0xf8, + 0x05, 0x98, 0x01, 0x28, 0x0e, 0xd1, 0xd9, 0xf8, 0x31, 0x10, 0x03, 0x98, + 0x49, 0x42, 0x81, 0x42, 0x04, 0xda, 0xd9, 0xf8, 0x31, 0x00, 0x03, 0x99, + 0x40, 0x18, 0x04, 0xe0, 0x30, 0x60, 0x40, 0xf2, 0x0b, 0x64, 0x01, 0xe0, + 0x03, 0x98, 0x30, 0x60, 0x05, 0x98, 0x02, 0x28, 0x04, 0xd1, 0xd9, 0xf8, + 0x35, 0x00, 0x39, 0x68, 0x40, 0x18, 0x38, 0x60, 0x20, 0x46, 0x09, 0xb0, + 0xbd, 0xe8, 0xf0, 0x83, 0x5c, 0x75, 0x02, 0x21, 0x80, 0x1a, 0x06, 0x00, + 0xa8, 0x93, 0x04, 0x02, 0x9c, 0x8b, 0x00, 0x21, 0x40, 0x94, 0x04, 0x02, + 0x10, 0xb5, 0x04, 0x46, 0x2d, 0xed, 0x02, 0x8b, 0x94, 0xed, 0x00, 0x0a, + 0xb9, 0xf7, 0x3a, 0xfc, 0xb0, 0xee, 0x40, 0x8a, 0x94, 0xed, 0x01, 0x0a, + 0xb9, 0xf7, 0x34, 0xfc, 0x38, 0xee, 0x00, 0x0a, 0xf6, 0xee, 0x00, 0x0a, + 0x20, 0xee, 0x20, 0x0a, 0xbd, 0xec, 0x02, 0x8b, 0x20, 0xee, 0x00, 0x0a, + 0x10, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x46, 0x2d, 0xed, 0x04, 0x8b, + 0x94, 0xed, 0x01, 0x0a, 0xd4, 0xed, 0x02, 0x0a, 0xb8, 0xee, 0x40, 0x0a, + 0xf8, 0xee, 0x60, 0x0a, 0xc0, 0xee, 0x20, 0x0a, 0x94, 0xed, 0x00, 0x1a, + 0xb8, 0xee, 0x41, 0x1a, 0xb6, 0xee, 0x00, 0x0a, 0xfe, 0xee, 0x00, 0x1a, + 0x21, 0xee, 0x00, 0x0a, 0x61, 0xee, 0x21, 0x1a, 0x30, 0xee, 0x60, 0x0a, + 0x71, 0xee, 0xe0, 0x1a, 0xbd, 0xee, 0xc0, 0x0a, 0xbd, 0xee, 0xe1, 0x8a, + 0x00, 0x20, 0x60, 0x61, 0x18, 0xee, 0x10, 0x6a, 0xff, 0xee, 0x00, 0x8a, + 0x10, 0xee, 0x10, 0x5a, 0x16, 0xe0, 0x60, 0x69, 0x98, 0xb9, 0x00, 0xee, + 0x10, 0x6a, 0xb8, 0xee, 0xc0, 0x9a, 0x9f, 0xed, 0x18, 0x1a, 0xf0, 0xee, + 0x68, 0x0a, 0xb0, 0xee, 0x49, 0x0a, 0x00, 0xf0, 0x2d, 0xf8, 0x9f, 0xed, + 0x14, 0x1a, 0xf0, 0xee, 0x68, 0x0a, 0x29, 0xee, 0x28, 0x0a, 0x00, 0xf0, + 0x25, 0xf8, 0x76, 0x1c, 0xb5, 0x42, 0xe6, 0xda, 0x18, 0xee, 0x10, 0x6a, + 0x14, 0xe0, 0x60, 0x69, 0x88, 0xb9, 0x00, 0xee, 0x10, 0x6a, 0xb8, 0xee, + 0xc0, 0x0a, 0x20, 0xee, 0x28, 0x8a, 0xb7, 0xee, 0x00, 0x1a, 0xf7, 0xee, + 0x00, 0x0a, 0x00, 0xf0, 0x0f, 0xf8, 0xb7, 0xee, 0x00, 0x1a, 0xf0, 0xee, + 0x68, 0x0a, 0x00, 0xf0, 0x09, 0xf8, 0x76, 0x1c, 0xb5, 0x42, 0xe8, 0xda, + 0xbd, 0xec, 0x04, 0x8b, 0x70, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0xee, 0x48, 0x0a, 0x20, 0x46, 0x08, 0xe0, 0x00, 0x21, 0x81, 0x61, + 0xc2, 0x68, 0xc1, 0x69, 0x8a, 0x42, 0x3c, 0xbf, 0x01, 0x22, 0x82, 0x61, + 0x70, 0x47, 0x70, 0xb5, 0x2d, 0xed, 0x06, 0x8b, 0x04, 0x46, 0xb0, 0xee, + 0x60, 0x8a, 0xf0, 0xee, 0x41, 0x8a, 0x94, 0xed, 0x04, 0x1a, 0x61, 0x68, + 0xe2, 0x68, 0x01, 0xee, 0x90, 0x1a, 0xf8, 0xee, 0x61, 0x1a, 0x02, 0xee, + 0x10, 0x2a, 0x61, 0xee, 0xa8, 0x1a, 0xb8, 0xee, 0x42, 0x2a, 0x42, 0xee, + 0x48, 0x1a, 0xb8, 0xee, 0x41, 0xaa, 0x53, 0x00, 0x09, 0xee, 0x10, 0x3a, + 0xfc, 0xee, 0xe8, 0x0a, 0x10, 0xee, 0x90, 0x5a, 0xd4, 0xed, 0x02, 0x0a, + 0xf8, 0xee, 0x60, 0x0a, 0x60, 0xee, 0x80, 0x9a, 0xb6, 0xee, 0x00, 0x0a, + 0x49, 0xee, 0xc0, 0x1a, 0x2a, 0xee, 0x00, 0x0a, 0x81, 0xee, 0x80, 0x0a, + 0xc5, 0xf1, 0x01, 0x06, 0x01, 0xfb, 0x05, 0xf0, 0x02, 0xfb, 0x06, 0x06, + 0xc7, 0xf7, 0x9c, 0xfa, 0x68, 0xee, 0x88, 0x0a, 0xb8, 0xee, 0x49, 0x1a, + 0x40, 0xee, 0x81, 0x9a, 0x4a, 0xee, 0x00, 0x9a, 0xfd, 0xee, 0xe9, 0x0a, + 0x76, 0x00, 0x10, 0xee, 0x90, 0x0a, 0x30, 0x1a, 0x48, 0xbf, 0x40, 0x42, + 0x64, 0x28, 0xbc, 0xbf, 0x6d, 0x1c, 0x65, 0x61, 0xbd, 0xec, 0x06, 0x8b, + 0x70, 0xbd, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x41, 0x04, 0x46, 0x0d, 0x46, + 0xc7, 0xf7, 0xa7, 0xfd, 0xdf, 0xf8, 0xec, 0x24, 0xdf, 0xf8, 0xec, 0x84, + 0x13, 0x68, 0x00, 0x21, 0x43, 0xf8, 0x20, 0x10, 0x00, 0x27, 0xc7, 0xf7, + 0x9c, 0xfd, 0xdf, 0xf8, 0xe0, 0x24, 0x13, 0x68, 0x00, 0x21, 0x43, 0xf8, + 0x20, 0x10, 0x24, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x0f, 0xd5, 0x38, 0x46, + 0xc8, 0xf7, 0x50, 0xfd, 0x06, 0x46, 0xcc, 0x21, 0x01, 0xfb, 0x06, 0xf0, + 0x40, 0x44, 0xcd, 0xf7, 0x09, 0xf8, 0xa9, 0x19, 0x00, 0x20, 0x08, 0x70, + 0xf8, 0xb2, 0xe3, 0xf7, 0x61, 0xfc, 0x7f, 0x1c, 0x08, 0x2f, 0xe8, 0xd3, + 0xbd, 0xe8, 0xf0, 0x81, 0x2d, 0xe9, 0xf0, 0x4f, 0x89, 0x46, 0xdf, 0xf8, + 0xa0, 0x14, 0x01, 0xf1, 0x14, 0x03, 0x01, 0xf1, 0x24, 0x02, 0x9d, 0xb0, + 0x80, 0x46, 0x0c, 0x93, 0x0a, 0x92, 0x0b, 0x91, 0x00, 0x24, 0xdf, 0xf8, + 0x7c, 0x34, 0xd1, 0xf8, 0x49, 0x20, 0x18, 0x68, 0xdf, 0xf8, 0x80, 0x14, + 0x03, 0x94, 0x02, 0x94, 0x05, 0x94, 0x04, 0x94, 0xc7, 0xf7, 0x6d, 0xfd, + 0x00, 0x27, 0x00, 0x25, 0x20, 0xb9, 0x40, 0xf2, 0x0a, 0x65, 0x0f, 0xf2, + 0x8c, 0x42, 0x17, 0xe1, 0x0a, 0x98, 0xd0, 0xf8, 0x2d, 0x20, 0xd0, 0xf8, + 0x29, 0x30, 0x01, 0x21, 0xd8, 0xb2, 0xc7, 0xf7, 0xd3, 0xfe, 0x5f, 0xea, + 0x00, 0x0a, 0x06, 0xd0, 0x0f, 0xf2, 0x88, 0x42, 0x06, 0x21, 0x01, 0x20, + 0xc8, 0xf7, 0x01, 0xfe, 0xf1, 0xe0, 0x00, 0x21, 0x05, 0xa8, 0xc7, 0xf7, + 0x78, 0xfc, 0x01, 0x21, 0x04, 0xa8, 0xc7, 0xf7, 0x74, 0xfc, 0x00, 0x26, + 0xcd, 0xf8, 0x1c, 0x80, 0xcd, 0xf8, 0x18, 0x90, 0xe2, 0xf7, 0xfc, 0xfe, + 0x00, 0x28, 0x40, 0xf0, 0xad, 0x80, 0x07, 0x98, 0xf0, 0x40, 0xc1, 0x07, + 0x40, 0xf1, 0xa8, 0x80, 0x5f, 0xfa, 0x86, 0xf8, 0x40, 0x46, 0xc8, 0xf7, + 0xeb, 0xfc, 0xcc, 0x23, 0x43, 0x43, 0xdf, 0xf8, 0xf4, 0x13, 0xdd, 0xf8, + 0x18, 0xa0, 0x09, 0x90, 0x19, 0x44, 0x00, 0x91, 0x0d, 0x91, 0x82, 0x44, + 0xdf, 0xf8, 0xf0, 0x13, 0xcd, 0xf8, 0x38, 0xa0, 0x19, 0x44, 0x0f, 0x91, + 0x00, 0x22, 0x0b, 0x99, 0x8d, 0xf8, 0x20, 0x60, 0x12, 0x92, 0x88, 0x68, + 0x18, 0xb9, 0x0c, 0x31, 0x40, 0x46, 0xc7, 0xf7, 0x99, 0xfc, 0x0d, 0x98, + 0xe2, 0xf7, 0xbd, 0xfe, 0x0a, 0x98, 0x01, 0x78, 0x01, 0x29, 0x5f, 0xfa, + 0x86, 0xf9, 0x15, 0xd1, 0x4b, 0x46, 0x0f, 0xf2, 0x0c, 0x42, 0x06, 0x21, + 0x02, 0x20, 0xc8, 0xf7, 0xb8, 0xfd, 0x40, 0x46, 0xc8, 0xf7, 0x25, 0xfc, + 0x02, 0x46, 0x0a, 0x99, 0x9d, 0xf8, 0x20, 0x00, 0xe3, 0xf7, 0xd2, 0xfa, + 0x00, 0x28, 0x14, 0xbf, 0x00, 0x27, 0x40, 0xf2, 0x04, 0x67, 0x61, 0xe0, + 0x00, 0x2d, 0x40, 0xd1, 0x90, 0xf8, 0x39, 0x00, 0x20, 0xb3, 0x4f, 0xf0, + 0x02, 0x0a, 0xdd, 0xf8, 0x48, 0xb0, 0xdf, 0xf8, 0x84, 0x13, 0x12, 0xab, + 0x03, 0xaa, 0xf0, 0xb2, 0xff, 0xf7, 0xf4, 0xfd, 0x04, 0x00, 0x14, 0xd1, + 0x02, 0xa9, 0x40, 0x46, 0xc7, 0xf7, 0x64, 0xfc, 0x02, 0x98, 0x03, 0x99, + 0x88, 0x42, 0x09, 0xd0, 0xf0, 0xb2, 0xe3, 0xf7, 0x37, 0xfc, 0x04, 0x00, + 0x07, 0xd1, 0x03, 0x98, 0xdf, 0xf8, 0x48, 0x13, 0xc8, 0x60, 0x02, 0xe0, + 0x12, 0x98, 0x83, 0x45, 0x03, 0xd0, 0xba, 0xf1, 0x01, 0x0a, 0xdc, 0xd1, + 0xac, 0xb9, 0x00, 0x98, 0x00, 0xf1, 0xac, 0x01, 0x40, 0x46, 0xc7, 0xf7, + 0x49, 0xfc, 0x08, 0xa8, 0xff, 0xf7, 0x4c, 0xfa, 0x07, 0x46, 0xf0, 0xb2, + 0xe3, 0xf7, 0xda, 0xfb, 0x01, 0x90, 0x00, 0x97, 0x4b, 0x46, 0x0f, 0xf2, + 0x88, 0x32, 0x06, 0x21, 0x03, 0x20, 0xc8, 0xf7, 0x68, 0xfd, 0x07, 0xb9, + 0x27, 0x46, 0x40, 0xf2, 0x06, 0x60, 0x87, 0x42, 0x08, 0xd1, 0x0a, 0x99, + 0x91, 0xf8, 0x24, 0x00, 0xb0, 0xb9, 0x00, 0x27, 0x4b, 0x46, 0xdf, 0xf8, + 0x00, 0x23, 0x0d, 0xe0, 0x40, 0xf2, 0x07, 0x60, 0x87, 0x42, 0x01, 0xbf, + 0x0a, 0x99, 0x01, 0xf1, 0x24, 0x02, 0x90, 0x7d, 0x00, 0x28, 0x07, 0xd1, + 0x00, 0x27, 0x4b, 0x46, 0xdf, 0xf8, 0xe4, 0x22, 0x06, 0x21, 0x02, 0x20, + 0xc8, 0xf7, 0x47, 0xfd, 0x0d, 0x98, 0x39, 0x46, 0xe2, 0xf7, 0x3f, 0xfe, + 0x05, 0xb9, 0x3d, 0x46, 0x76, 0x1c, 0xf0, 0xb2, 0x08, 0x28, 0xff, 0xf6, + 0x49, 0xaf, 0x00, 0x21, 0x02, 0xa8, 0xc7, 0xf7, 0xb4, 0xfb, 0x02, 0x98, + 0x05, 0x99, 0x88, 0x42, 0x05, 0xd0, 0x05, 0x98, 0x00, 0x21, 0xc7, 0xf7, + 0x20, 0xfb, 0x05, 0xb9, 0x05, 0x46, 0x01, 0x21, 0x02, 0xa8, 0xc7, 0xf7, + 0xa6, 0xfb, 0x02, 0x98, 0x04, 0x99, 0x88, 0x42, 0x05, 0xd0, 0x04, 0x98, + 0x01, 0x21, 0xc7, 0xf7, 0x12, 0xfb, 0x05, 0xb9, 0x05, 0x46, 0x0a, 0x98, + 0xd0, 0xf8, 0x2d, 0x10, 0xd0, 0xf8, 0x29, 0x20, 0xd0, 0xb2, 0xc7, 0xf7, + 0x27, 0xfe, 0x5f, 0xea, 0x00, 0x0a, 0x0b, 0xd0, 0x0f, 0xf2, 0xf0, 0x22, + 0x06, 0x21, 0x01, 0x20, 0xc8, 0xf7, 0x0f, 0xfd, 0x05, 0xb9, 0x55, 0x46, + 0x28, 0x46, 0x1d, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x92, 0x48, 0x93, 0x49, + 0xd0, 0xf8, 0x49, 0x20, 0x8f, 0x48, 0x00, 0x68, 0xc7, 0xf7, 0x53, 0xfc, + 0x00, 0x28, 0xef, 0xd1, 0x40, 0xf2, 0x0a, 0x65, 0x0f, 0xf2, 0xd8, 0x22, + 0x06, 0x21, 0x02, 0x20, 0xc8, 0xf7, 0xf7, 0xfc, 0xe8, 0xe7, 0x00, 0x00, + 0x80, 0xb5, 0x00, 0xf0, 0x09, 0xf8, 0xd2, 0xf7, 0xb4, 0xfb, 0x02, 0xbd, + 0x80, 0xb5, 0x00, 0xf0, 0x03, 0xf8, 0xd2, 0xf7, 0x99, 0xfb, 0x02, 0xbd, + 0x00, 0x92, 0x0b, 0x46, 0x02, 0x46, 0x3b, 0x21, 0x83, 0x48, 0x70, 0x47, + 0xf8, 0xb5, 0x0c, 0x46, 0x15, 0x46, 0x1f, 0x46, 0xe2, 0xf7, 0xec, 0xfd, + 0xc8, 0xf7, 0xe2, 0xfb, 0x00, 0x26, 0xff, 0x28, 0x16, 0xd0, 0xcc, 0x21, + 0x77, 0x4a, 0x48, 0x43, 0x11, 0x18, 0x17, 0xb1, 0x02, 0x2f, 0x0a, 0xd0, + 0x0b, 0xe0, 0x14, 0x27, 0x28, 0x68, 0xb8, 0x42, 0x0d, 0xd3, 0x3a, 0x46, + 0x20, 0x46, 0xb9, 0xf7, 0x83, 0xff, 0x2f, 0x60, 0x09, 0xe0, 0xcc, 0x27, + 0xf4, 0xe7, 0x4f, 0xf6, 0x2a, 0x76, 0x04, 0xe0, 0x4f, 0xf6, 0x52, 0x76, + 0x01, 0xe0, 0x4f, 0xf6, 0x26, 0x76, 0x30, 0x46, 0xf2, 0xbd, 0xf8, 0xb5, + 0x0e, 0x46, 0x15, 0x46, 0x1f, 0x46, 0xe2, 0xf7, 0xc3, 0xfd, 0x00, 0x24, + 0xc8, 0xf7, 0xb8, 0xfb, 0x01, 0x2e, 0x66, 0x48, 0x4f, 0xf6, 0x61, 0x73, + 0x25, 0xd0, 0x22, 0xd3, 0x03, 0x2e, 0x10, 0xd0, 0x1f, 0xd2, 0x10, 0x2f, + 0x08, 0xd3, 0x29, 0x78, 0x01, 0x75, 0x69, 0x68, 0x81, 0x61, 0xaa, 0x68, + 0xc2, 0x61, 0xe9, 0x68, 0x01, 0x62, 0x16, 0xe0, 0x04, 0x2f, 0x07, 0xd1, + 0x29, 0x68, 0xc1, 0x61, 0x11, 0xe0, 0x06, 0x99, 0x07, 0x9a, 0x0c, 0x60, + 0x10, 0x2a, 0x01, 0xd2, 0x1c, 0x46, 0x0a, 0xe0, 0x02, 0x7d, 0x2a, 0x70, + 0x10, 0x22, 0x83, 0x69, 0x6b, 0x60, 0xc0, 0x69, 0xa8, 0x60, 0x0a, 0x60, + 0x01, 0xe0, 0x4f, 0xf6, 0x27, 0x74, 0x20, 0x46, 0xf2, 0xbd, 0x00, 0x00, + 0x10, 0xb5, 0x01, 0x29, 0x0c, 0xd1, 0x54, 0x49, 0x0a, 0x60, 0x14, 0x68, + 0xe2, 0xf7, 0x8f, 0xfd, 0x21, 0x46, 0x00, 0xf0, 0x0e, 0xf8, 0x04, 0x46, + 0x7a, 0xa2, 0x06, 0x21, 0x03, 0x20, 0x04, 0xe0, 0x4f, 0xf6, 0x27, 0x74, + 0x7d, 0xa2, 0x06, 0x21, 0x02, 0x20, 0xc8, 0xf7, 0x6c, 0xfc, 0x20, 0x46, + 0x10, 0xbd, 0x2d, 0xe9, 0xf0, 0x4f, 0x95, 0xb0, 0x8a, 0x46, 0x41, 0x49, + 0xdf, 0xf8, 0x1c, 0x91, 0x03, 0x91, 0x01, 0xf1, 0x24, 0x02, 0x14, 0x31, + 0x04, 0x91, 0x01, 0x27, 0x03, 0x99, 0x02, 0x92, 0x80, 0x46, 0x00, 0x24, + 0x0f, 0x61, 0x00, 0x25, 0x28, 0xfa, 0x05, 0xf0, 0xc0, 0x07, 0x5e, 0xd5, + 0x28, 0x46, 0xc8, 0xf7, 0x57, 0xfb, 0xcc, 0x22, 0x33, 0x49, 0x42, 0x43, + 0x8b, 0x18, 0x09, 0xeb, 0x00, 0x04, 0x05, 0x93, 0x04, 0xf1, 0x30, 0x01, + 0x06, 0x91, 0x01, 0x90, 0x03, 0xf1, 0x24, 0x02, 0x03, 0x99, 0x8d, 0xf8, + 0x00, 0x50, 0x07, 0x92, 0x88, 0x68, 0x18, 0xb9, 0x0c, 0x31, 0x28, 0x46, + 0xc7, 0xf7, 0x0a, 0xfb, 0x32, 0x48, 0x01, 0x68, 0x4a, 0x19, 0xed, 0x20, + 0x92, 0xf8, 0xbc, 0x30, 0x43, 0x43, 0x19, 0x44, 0x00, 0x24, 0xd1, 0xf8, + 0xc1, 0x04, 0x4f, 0xf4, 0x7a, 0x71, 0x41, 0x43, 0xb0, 0xf5, 0xf0, 0x2f, + 0x1c, 0xbf, 0xb0, 0xf5, 0xb4, 0x2f, 0x49, 0x08, 0x29, 0x48, 0x82, 0x45, + 0x01, 0xd3, 0x8a, 0x45, 0x01, 0xd3, 0x40, 0xf2, 0x09, 0x64, 0x5c, 0xbb, + 0x4f, 0xf4, 0x7a, 0x70, 0xba, 0xfb, 0xf0, 0xf1, 0x28, 0x46, 0xc8, 0xf7, + 0x7f, 0xfa, 0x05, 0x98, 0xe2, 0xf7, 0x0b, 0xfd, 0x05, 0x99, 0x08, 0x69, + 0x00, 0xb9, 0x02, 0x27, 0x01, 0x26, 0xae, 0x40, 0x30, 0x46, 0xd4, 0xf7, + 0x0f, 0xff, 0x4f, 0xf0, 0x00, 0x0b, 0x05, 0xe0, 0x68, 0x46, 0xff, 0xf7, + 0xdb, 0xf8, 0x04, 0x46, 0x0b, 0xf1, 0x01, 0x0b, 0xbb, 0x45, 0xf7, 0xd3, + 0x30, 0x46, 0xd4, 0xf7, 0x04, 0xff, 0x05, 0x98, 0x21, 0x46, 0xe2, 0xf7, + 0xf4, 0xfc, 0x28, 0x46, 0xc8, 0xf7, 0x60, 0xfa, 0x14, 0xb9, 0x6d, 0x1c, + 0x08, 0x2d, 0x99, 0xdb, 0x03, 0x99, 0x00, 0x20, 0x08, 0x61, 0x15, 0xb0, + 0x20, 0x46, 0xbd, 0xe8, 0xf0, 0x8f, 0x00, 0x00, 0xfc, 0x04, 0x00, 0x01, + 0x90, 0x67, 0x03, 0x21, 0x08, 0x05, 0x00, 0x01, 0x3c, 0x8b, 0x00, 0x21, + 0xdd, 0x9a, 0x02, 0x02, 0xb4, 0x67, 0x03, 0x21, 0x60, 0x8b, 0x00, 0x21, + 0xac, 0x8f, 0x04, 0x02, 0xdc, 0x8f, 0x04, 0x02, 0x2c, 0x76, 0x02, 0x21, + 0x50, 0x76, 0x02, 0x21, 0x5c, 0x75, 0x02, 0x21, 0x80, 0xf0, 0xfa, 0x02, + 0x42, 0x42, 0x46, 0x3a, 0x20, 0x70, 0x72, 0x65, 0x2d, 0x43, 0x61, 0x6c, + 0x20, 0x43, 0x50, 0x55, 0x20, 0x53, 0x79, 0x6e, 0x63, 0x20, 0x65, 0x72, + 0x72, 0x0a, 0x00, 0x00, 0x42, 0x42, 0x46, 0x3a, 0x20, 0x73, 0x65, 0x6d, + 0x20, 0x74, 0x61, 0x6b, 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x0a, 0x00, + 0x54, 0x78, 0x42, 0x42, 0x46, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x20, + 0x2d, 0x20, 0x42, 0x79, 0x70, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x78, 0x42, 0x42, 0x46, 0x3a, 0x20, 0x63, + 0x68, 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x25, 0x58, 0x2c, + 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x46, 0x3a, + 0x20, 0x73, 0x65, 0x6d, 0x20, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x20, 0x65, 0x72, 0x72, 0x0a, 0x00, 0x00, 0x00, 0x42, 0x42, 0x46, 0x3a, + 0x20, 0x70, 0x6f, 0x73, 0x74, 0x2d, 0x43, 0x61, 0x6c, 0x20, 0x43, 0x50, + 0x55, 0x20, 0x53, 0x79, 0x6e, 0x63, 0x20, 0x65, 0x72, 0x72, 0x0a, 0x00, + 0x54, 0x78, 0x42, 0x42, 0x46, 0x20, 0x44, 0x65, 0x62, 0x75, 0x67, 0x20, + 0x2d, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20, 0x63, 0x6d, 0x64, 0x0a, 0x00, + 0x54, 0x78, 0x42, 0x42, 0x46, 0x20, 0x44, 0x65, 0x62, 0x75, 0x67, 0x20, + 0x2d, 0x20, 0x62, 0x61, 0x64, 0x20, 0x63, 0x6d, 0x64, 0x0a, 0x00, 0x00, + 0x29, 0x50, 0x04, 0x02, 0x43, 0x51, 0x04, 0x02, 0x1d, 0x51, 0x04, 0x02, + 0x29, 0x51, 0x04, 0x02, 0xdb, 0x51, 0x04, 0x02, 0x29, 0x52, 0x04, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb1, 0x3b, 0x04, 0x02, 0x0d, 0x3c, 0x04, 0x02, + 0x19, 0x3c, 0x04, 0x02, 0x7f, 0x3c, 0x04, 0x02, 0xdd, 0x3c, 0x04, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x76, 0x02, 0x21, + 0x00, 0x00, 0x00, 0x00, 0x87, 0xed, 0x03, 0x02, 0xd5, 0xec, 0x03, 0x02, + 0xe1, 0xec, 0x03, 0x02, 0x35, 0xee, 0x03, 0x02, 0x8d, 0xee, 0x03, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x7d, 0x02, 0x21, + 0x00, 0x00, 0x00, 0x00, 0x9d, 0x0d, 0x03, 0x02, 0xe3, 0x0f, 0x03, 0x02, + 0x13, 0x10, 0x03, 0x02, 0xa7, 0x0e, 0x03, 0x02, 0x1f, 0x10, 0x03, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x27, 0x2b, 0x03, 0x02, 0x97, 0x2c, 0x03, 0x02, + 0xa3, 0x2c, 0x03, 0x02, 0x1b, 0x2c, 0x03, 0x02, 0xc1, 0x2c, 0x03, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe5, 0x36, 0x03, 0x02, 0x41, 0x38, 0x03, 0x02, + 0x4d, 0x38, 0x03, 0x02, 0xc5, 0x37, 0x03, 0x02, 0x6d, 0x38, 0x03, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe7, 0x30, 0x03, 0x02, 0xb1, 0x32, 0x03, 0x02, + 0xbd, 0x32, 0x03, 0x02, 0x33, 0x32, 0x03, 0x02, 0xd5, 0x32, 0x03, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x7c, 0x9d, 0x04, 0x02, 0xc8, 0x99, 0x01, 0x21, + 0x2c, 0x01, 0x00, 0x00, 0x00, 0x4a, 0x02, 0x21, 0x98, 0x6c, 0x02, 0x21, + 0xb4, 0x61, 0x02, 0x21, 0x24, 0x9b, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x8c, 0x9d, 0x04, 0x02, + 0x78, 0x9e, 0x01, 0x21, 0x2c, 0x01, 0x00, 0x00, 0x70, 0x4a, 0x02, 0x21, + 0xb4, 0x6c, 0x02, 0x21, 0xe0, 0x61, 0x02, 0x21, 0x38, 0x9b, 0x04, 0x02, + 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x9c, 0x9d, 0x04, 0x02, 0x28, 0xa3, 0x01, 0x21, 0x2c, 0x01, 0x00, 0x00, + 0xe0, 0x4a, 0x02, 0x21, 0xd0, 0x6c, 0x02, 0x21, 0x0c, 0x62, 0x02, 0x21, + 0x4c, 0x9b, 0x04, 0x02, 0x02, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0xac, 0x9d, 0x04, 0x02, 0xd8, 0xa7, 0x01, 0x21, + 0x2c, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x02, 0x21, 0xec, 0x6c, 0x02, 0x21, + 0x38, 0x62, 0x02, 0x21, 0x60, 0x9b, 0x04, 0x02, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xbc, 0x9d, 0x04, 0x02, + 0x68, 0xe1, 0x00, 0x21, 0x4c, 0x04, 0x00, 0x00, 0xc0, 0x4b, 0x02, 0x21, + 0x08, 0x6d, 0x02, 0x21, 0x64, 0x62, 0x02, 0x21, 0x74, 0x9b, 0x04, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0xcc, 0x9d, 0x04, 0x02, 0x98, 0xf2, 0x00, 0x21, 0x4c, 0x04, 0x00, 0x00, + 0x30, 0x4c, 0x02, 0x21, 0x24, 0x6d, 0x02, 0x21, 0x90, 0x62, 0x02, 0x21, + 0x88, 0x9b, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0xdc, 0x9d, 0x04, 0x02, 0xc8, 0x03, 0x01, 0x21, + 0x4c, 0x04, 0x00, 0x00, 0xa0, 0x4c, 0x02, 0x21, 0x40, 0x6d, 0x02, 0x21, + 0xbc, 0x62, 0x02, 0x21, 0x9c, 0x9b, 0x04, 0x02, 0x02, 0x00, 0x00, 0x00, + 0x31, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0xec, 0x9d, 0x04, 0x02, + 0xf8, 0x14, 0x01, 0x21, 0x4c, 0x04, 0x00, 0x00, 0x10, 0x4d, 0x02, 0x21, + 0x5c, 0x6d, 0x02, 0x21, 0xe8, 0x62, 0x02, 0x21, 0xb0, 0x9b, 0x04, 0x02, + 0x03, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0xfc, 0x9d, 0x04, 0x02, 0x28, 0x26, 0x01, 0x21, 0x4c, 0x04, 0x00, 0x00, + 0x80, 0x4d, 0x02, 0x21, 0x78, 0x6d, 0x02, 0x21, 0x14, 0x63, 0x02, 0x21, + 0xc4, 0x9b, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x9e, 0x04, 0x02, 0x58, 0x37, 0x01, 0x21, + 0x4c, 0x04, 0x00, 0x00, 0xf0, 0x4d, 0x02, 0x21, 0x94, 0x6d, 0x02, 0x21, + 0x40, 0x63, 0x02, 0x21, 0xd8, 0x9b, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, + 0x32, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x9e, 0x04, 0x02, + 0x88, 0x48, 0x01, 0x21, 0x4c, 0x04, 0x00, 0x00, 0x60, 0x4e, 0x02, 0x21, + 0xb0, 0x6d, 0x02, 0x21, 0x6c, 0x63, 0x02, 0x21, 0xec, 0x9b, 0x04, 0x02, + 0x02, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x2c, 0x9e, 0x04, 0x02, 0xb8, 0x59, 0x01, 0x21, 0x4c, 0x04, 0x00, 0x00, + 0xd0, 0x4e, 0x02, 0x21, 0xcc, 0x6d, 0x02, 0x21, 0x98, 0x63, 0x02, 0x21, + 0x00, 0x9c, 0x04, 0x02, 0x03, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x00, 0x00, 0xa4, 0x9e, 0x04, 0x02, 0x40, 0xb8, 0x01, 0x21, + 0xaa, 0x02, 0x00, 0x00, 0x38, 0x6f, 0x02, 0x21, 0x00, 0x75, 0x02, 0x21, + 0x64, 0x73, 0x02, 0x21, 0x3c, 0x9e, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x33, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0xa5, 0x03, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x03, 0x00, 0x02, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0xa5, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa5, 0x03, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0xa5, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa5, 0x03, 0x00, 0x02, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x4c, 0x9e, 0x04, 0x02, + 0x28, 0x90, 0x00, 0x21, 0x14, 0x05, 0x00, 0x00, 0x00, 0x51, 0x02, 0x21, + 0xc8, 0x6e, 0x02, 0x21, 0x74, 0x64, 0x02, 0x21, 0x14, 0x9c, 0x04, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, + 0x5c, 0x9e, 0x04, 0x02, 0x78, 0xa4, 0x00, 0x21, 0x14, 0x05, 0x00, 0x00, + 0x70, 0x51, 0x02, 0x21, 0xe4, 0x6e, 0x02, 0x21, 0xa0, 0x64, 0x02, 0x21, + 0x28, 0x9c, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, + 0x17, 0x00, 0x00, 0x00, 0x6c, 0x9e, 0x04, 0x02, 0xc8, 0xb8, 0x00, 0x21, + 0x14, 0x05, 0x00, 0x00, 0xe0, 0x51, 0x02, 0x21, 0x00, 0x6f, 0x02, 0x21, + 0xcc, 0x64, 0x02, 0x21, 0x3c, 0x9c, 0x04, 0x02, 0x02, 0x00, 0x00, 0x00, + 0x34, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x7c, 0x9e, 0x04, 0x02, + 0x18, 0xcd, 0x00, 0x21, 0x14, 0x05, 0x00, 0x00, 0x50, 0x52, 0x02, 0x21, + 0x1c, 0x6f, 0x02, 0x21, 0xf8, 0x64, 0x02, 0x21, 0x50, 0x9c, 0x04, 0x02, + 0x03, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x64, 0x9c, 0x04, 0x02, 0x08, 0x87, 0x01, 0x21, 0x2c, 0x01, 0x00, 0x00, + 0x40, 0x4f, 0x02, 0x21, 0x58, 0x6e, 0x02, 0x21, 0xc4, 0x63, 0x02, 0x21, + 0x78, 0x9c, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x8c, 0x9c, 0x04, 0x02, 0xb8, 0x8b, 0x01, 0x21, + 0x2c, 0x01, 0x00, 0x00, 0xb0, 0x4f, 0x02, 0x21, 0x74, 0x6e, 0x02, 0x21, + 0xf0, 0x63, 0x02, 0x21, 0xa0, 0x9c, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, + 0x35, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xb4, 0x9c, 0x04, 0x02, + 0x68, 0x90, 0x01, 0x21, 0x2c, 0x01, 0x00, 0x00, 0x20, 0x50, 0x02, 0x21, + 0x90, 0x6e, 0x02, 0x21, 0x1c, 0x64, 0x02, 0x21, 0xc8, 0x9c, 0x04, 0x02, + 0x02, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, + 0xdc, 0x9c, 0x04, 0x02, 0x18, 0x95, 0x01, 0x21, 0x2c, 0x01, 0x00, 0x00, + 0x90, 0x50, 0x02, 0x21, 0xac, 0x6e, 0x02, 0x21, 0x48, 0x64, 0x02, 0x21, + 0xf0, 0x9c, 0x04, 0x02, 0x03, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x9d, 0x04, 0x02, 0x68, 0xcc, 0x01, 0x21, + 0x2c, 0x01, 0x00, 0x00, 0xe8, 0x6d, 0x02, 0x21, 0xe4, 0x74, 0x02, 0x21, + 0x38, 0x73, 0x02, 0x21, 0x18, 0x9d, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x36, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0xa5, 0x03, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x03, 0x00, 0x02, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0xa5, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa5, 0x03, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0xa5, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa5, 0x03, 0x00, 0x02, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2d, 0xe9, 0xf0, 0x47, 0x81, 0x46, 0xdf, 0xf8, + 0xa4, 0x43, 0xdf, 0xf8, 0xa4, 0x53, 0xdf, 0xf8, 0xa4, 0x83, 0xdf, 0xf8, + 0xa4, 0xa3, 0xdf, 0xf8, 0xa4, 0x63, 0x00, 0x20, 0x20, 0x70, 0x00, 0x27, + 0x29, 0xfa, 0x07, 0xf0, 0xc0, 0x07, 0x12, 0xd5, 0x38, 0x46, 0xc7, 0xf7, + 0xab, 0xff, 0x0c, 0x21, 0x41, 0x43, 0x21, 0x44, 0x1c, 0x22, 0x24, 0x23, + 0x42, 0x43, 0x58, 0x43, 0x4e, 0x60, 0x52, 0x44, 0x40, 0x44, 0x8a, 0x60, + 0xc8, 0x60, 0x09, 0x1d, 0x2a, 0x68, 0x42, 0xf8, 0x27, 0x10, 0x7f, 0x1c, + 0x08, 0x2f, 0xe5, 0xd3, 0xbd, 0xe8, 0xf0, 0x87, 0x2d, 0xe9, 0xf8, 0x4f, + 0xdf, 0xf8, 0x5c, 0x23, 0x11, 0x78, 0x84, 0xb0, 0x4f, 0xf0, 0x00, 0x08, + 0x29, 0xb9, 0xdf, 0xf8, 0x40, 0x23, 0x11, 0x78, 0x00, 0x29, 0x40, 0xf0, + 0x30, 0x81, 0x00, 0x24, 0xa1, 0x46, 0x02, 0x94, 0x00, 0x25, 0xdf, 0xf8, + 0x3c, 0x73, 0x80, 0x46, 0x28, 0xfa, 0x05, 0xf0, 0xc0, 0x07, 0x22, 0xd5, + 0x28, 0x46, 0xc7, 0xf7, 0x79, 0xff, 0x82, 0x46, 0x1c, 0x21, 0xc8, 0x48, + 0x01, 0xfb, 0x0a, 0xf1, 0x46, 0x18, 0x30, 0x46, 0xe2, 0xf7, 0x61, 0xf9, + 0x01, 0x22, 0xb9, 0x78, 0x02, 0xfa, 0x0a, 0xfa, 0x11, 0xea, 0x0a, 0x0f, + 0x05, 0xd0, 0x96, 0xed, 0x05, 0x0a, 0x28, 0x46, 0x00, 0xf0, 0x82, 0xf9, + 0x74, 0x61, 0xf9, 0x78, 0x11, 0xea, 0x0a, 0x0f, 0x05, 0xd0, 0x96, 0xed, + 0x06, 0x0a, 0x28, 0x46, 0x00, 0xf0, 0x90, 0xf9, 0xb4, 0x61, 0x6d, 0x1c, + 0x08, 0x2d, 0xd5, 0xd3, 0xcd, 0xf8, 0x04, 0x80, 0xa2, 0x46, 0x02, 0x9e, + 0x00, 0x25, 0x01, 0x98, 0x20, 0xfa, 0x0a, 0xf0, 0xc1, 0x07, 0x3e, 0xd5, + 0x50, 0x46, 0xc6, 0xf7, 0x34, 0xff, 0x80, 0x46, 0x69, 0x46, 0x50, 0x46, + 0xc6, 0xf7, 0x0e, 0xff, 0x50, 0x46, 0xc7, 0xf7, 0x41, 0xff, 0x83, 0x46, + 0x78, 0x78, 0x40, 0xb9, 0xb8, 0xf1, 0x00, 0x0f, 0x27, 0xd0, 0xb8, 0xf1, + 0x01, 0x0f, 0x08, 0xbf, 0xb9, 0xf1, 0x00, 0x0f, 0x04, 0xd0, 0x01, 0x21, + 0x01, 0xfa, 0x0b, 0xf1, 0x08, 0x42, 0x22, 0xd0, 0x01, 0x20, 0x00, 0x21, + 0x00, 0xfa, 0x0a, 0xf0, 0xf8, 0xf7, 0x40, 0xfa, 0x04, 0x00, 0x0a, 0xd1, + 0x24, 0x21, 0x9f, 0x48, 0x01, 0xfb, 0x0b, 0xf1, 0x42, 0x18, 0x07, 0xf1, + 0x0c, 0x01, 0x50, 0x46, 0x00, 0xf0, 0x8c, 0xf9, 0x04, 0x46, 0xb8, 0xf1, + 0x00, 0x0f, 0x0b, 0xd0, 0x96, 0x49, 0x01, 0x20, 0x09, 0xf1, 0x01, 0x09, + 0x5e, 0x46, 0x08, 0x70, 0x05, 0xe0, 0x00, 0x9a, 0xb9, 0x68, 0x8a, 0x42, + 0xd9, 0xd3, 0xdd, 0xe7, 0x6d, 0x1c, 0x0a, 0xf1, 0x01, 0x0a, 0xba, 0xf1, + 0x08, 0x0f, 0x01, 0xd2, 0x00, 0x2c, 0xb4, 0xd0, 0xb9, 0xf1, 0x00, 0x0f, + 0x01, 0x98, 0x02, 0x94, 0x18, 0xbf, 0x00, 0x2d, 0x04, 0xd0, 0x21, 0x00, + 0x04, 0xbf, 0x41, 0xf2, 0x03, 0x12, 0x02, 0x92, 0x24, 0x24, 0x66, 0x43, + 0x03, 0x96, 0x00, 0x27, 0x02, 0x99, 0xdf, 0xf8, 0x18, 0x82, 0xdf, 0xf8, + 0x1c, 0x92, 0x00, 0x29, 0x50, 0xd1, 0x01, 0x90, 0x01, 0x98, 0xf8, 0x40, + 0xc1, 0x07, 0x47, 0xd5, 0x38, 0x46, 0xc7, 0xf7, 0xe7, 0xfe, 0x05, 0x46, + 0x1c, 0x22, 0x7f, 0x49, 0x99, 0xf8, 0x01, 0x00, 0x6a, 0x43, 0x8e, 0x18, + 0x20, 0xbb, 0x38, 0x46, 0xc6, 0xf7, 0xc7, 0xfe, 0x83, 0x46, 0x38, 0x46, + 0xc6, 0xf7, 0xc7, 0xfe, 0x82, 0x46, 0x69, 0x46, 0x38, 0x46, 0xc6, 0xf7, + 0x9d, 0xfe, 0xbb, 0xf1, 0x00, 0x0f, 0x04, 0xd0, 0x03, 0x99, 0x08, 0xf1, + 0x20, 0x00, 0x42, 0x58, 0x08, 0xe0, 0x00, 0x98, 0xd9, 0xf8, 0x08, 0x10, + 0x88, 0x42, 0x04, 0xd3, 0x08, 0xf1, 0x20, 0x00, 0x65, 0x43, 0x42, 0x59, + 0x72, 0x61, 0xba, 0xf1, 0x00, 0x0f, 0x1b, 0xd0, 0x03, 0x99, 0x08, 0xf1, + 0x20, 0x00, 0x15, 0xe0, 0x01, 0x20, 0x99, 0xf8, 0x02, 0x20, 0xa8, 0x40, + 0x02, 0x42, 0x09, 0xeb, 0x05, 0x01, 0x05, 0xd0, 0x0a, 0x79, 0x08, 0xf1, + 0x20, 0x05, 0x62, 0x43, 0xab, 0x58, 0x73, 0x61, 0x99, 0xf8, 0x03, 0x20, + 0x02, 0x42, 0x05, 0xd0, 0x09, 0x79, 0x08, 0xf1, 0x20, 0x00, 0x61, 0x43, + 0x42, 0x58, 0xb2, 0x61, 0x7f, 0x1c, 0x08, 0x2f, 0xb0, 0xd3, 0x01, 0x98, + 0x02, 0x99, 0x5b, 0x4e, 0x00, 0x25, 0x1c, 0x27, 0xca, 0x46, 0x31, 0xbb, + 0x04, 0x46, 0x24, 0xfa, 0x05, 0xf0, 0xc0, 0x07, 0x1d, 0xd5, 0x28, 0x46, + 0xc7, 0xf7, 0x90, 0xfe, 0x01, 0x21, 0x01, 0xfa, 0x00, 0xf8, 0x07, 0xfb, + 0x00, 0xf9, 0x9a, 0xf8, 0x02, 0x00, 0x10, 0xea, 0x08, 0x0f, 0x05, 0xd0, + 0x06, 0xf1, 0x14, 0x02, 0x00, 0xf0, 0x2f, 0xf8, 0x00, 0xf0, 0x9e, 0xf8, + 0x9a, 0xf8, 0x03, 0x00, 0x10, 0xea, 0x08, 0x0f, 0x05, 0xd0, 0x06, 0xf1, + 0x18, 0x02, 0x00, 0xf0, 0x24, 0xf8, 0x00, 0xf0, 0xab, 0xf8, 0x6d, 0x1c, + 0x08, 0x2d, 0xda, 0xd3, 0x20, 0x46, 0xdd, 0xf8, 0x08, 0x80, 0x00, 0x25, + 0x04, 0x46, 0x24, 0xfa, 0x05, 0xf0, 0xc0, 0x07, 0x07, 0xd5, 0x28, 0x46, + 0xc7, 0xf7, 0x66, 0xfe, 0x78, 0x43, 0x41, 0x46, 0x30, 0x18, 0xe2, 0xf7, + 0x56, 0xf8, 0x6d, 0x1c, 0x08, 0x2d, 0xf0, 0xd3, 0x4f, 0xea, 0x08, 0x03, + 0x5d, 0xa2, 0x11, 0x21, 0x03, 0x20, 0xc7, 0xf7, 0x50, 0xff, 0x40, 0x46, + 0x05, 0xb0, 0xbd, 0xe8, 0xf0, 0x8f, 0x4a, 0x44, 0x28, 0x46, 0x92, 0xed, + 0x00, 0x0a, 0xb1, 0xee, 0x40, 0x0a, 0x70, 0x47, 0xf8, 0xb5, 0x0c, 0x46, + 0x15, 0x46, 0x1f, 0x46, 0xe2, 0xf7, 0x4e, 0xf8, 0xc7, 0xf7, 0x44, 0xfe, + 0x00, 0x26, 0xff, 0x28, 0x19, 0xd0, 0x1c, 0x21, 0x2c, 0x4a, 0x48, 0x43, + 0x11, 0x18, 0x17, 0xb1, 0x02, 0x2f, 0x0a, 0xd0, 0x0b, 0xe0, 0x14, 0x27, + 0x28, 0x68, 0xb8, 0x42, 0x0a, 0xd3, 0x3a, 0x46, 0x20, 0x46, 0xb9, 0xf7, + 0xe5, 0xf9, 0x2f, 0x60, 0x09, 0xe0, 0x1c, 0x27, 0xf4, 0xe7, 0x4f, 0xf6, + 0x2a, 0x76, 0x04, 0xe0, 0x4f, 0xf6, 0x26, 0x76, 0x01, 0xe0, 0x4f, 0xf6, + 0x52, 0x76, 0x30, 0x46, 0xf2, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x09, 0xf8, + 0xd1, 0xf7, 0xdb, 0xfd, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x03, 0xf8, + 0xd1, 0xf7, 0xc0, 0xfd, 0x02, 0xbd, 0x00, 0x92, 0x0b, 0x46, 0x02, 0x46, + 0x24, 0x21, 0x17, 0x48, 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, 0xdf, 0xed, + 0x0f, 0x0a, 0x60, 0xee, 0x20, 0x0a, 0x9f, 0xed, 0x0e, 0x0a, 0x04, 0x46, + 0x80, 0xee, 0x80, 0x0a, 0xc6, 0xf7, 0x1a, 0xfb, 0xbd, 0xee, 0xc0, 0x0a, + 0x10, 0xee, 0x10, 0x0a, 0x00, 0x28, 0x48, 0xbf, 0x00, 0xf5, 0xb4, 0x70, + 0x04, 0x19, 0x4f, 0xf4, 0xb4, 0x71, 0xb4, 0xfb, 0xf1, 0xf1, 0x4f, 0xf4, + 0xb4, 0x70, 0x00, 0xfb, 0x11, 0x44, 0x20, 0x46, 0x10, 0xbd, 0x00, 0x00, + 0x00, 0x00, 0x34, 0x43, 0xd0, 0x0f, 0x49, 0x40, 0xa4, 0x72, 0x02, 0x21, + 0xe8, 0x04, 0x00, 0x01, 0x38, 0x68, 0x02, 0x21, 0xa8, 0x6f, 0x02, 0x21, + 0xfc, 0x8f, 0x00, 0x21, 0x10, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x88, 0xb0, + 0x00, 0x22, 0x04, 0x46, 0x8d, 0xf8, 0x02, 0x20, 0xb0, 0xee, 0x40, 0x8a, + 0x69, 0x46, 0xc0, 0xb2, 0xe5, 0xf7, 0x6c, 0xf9, 0x00, 0xf0, 0x2a, 0xf8, + 0x00, 0xf0, 0x21, 0xf8, 0xe5, 0xf7, 0xe4, 0xf8, 0x08, 0xb0, 0xbd, 0xec, + 0x02, 0x8b, 0x10, 0xbd, 0x38, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x88, 0xb0, + 0x04, 0x46, 0xb0, 0xee, 0x40, 0x8a, 0x00, 0x25, 0x8d, 0xf8, 0x02, 0x50, + 0x69, 0x46, 0xe0, 0xb2, 0xd6, 0xf7, 0xa3, 0xff, 0x00, 0xf0, 0x12, 0xf8, + 0x00, 0xf0, 0x09, 0xf8, 0xd6, 0xf7, 0x1a, 0xff, 0x6d, 0x1c, 0x01, 0x2d, + 0xf0, 0xd9, 0x08, 0xb0, 0xbd, 0xec, 0x02, 0x8b, 0x31, 0xbd, 0x01, 0x21, + 0x02, 0x90, 0x8d, 0xf8, 0x18, 0x10, 0xe0, 0xb2, 0x69, 0x46, 0x70, 0x47, + 0x01, 0x22, 0x8d, 0xf8, 0x00, 0x20, 0xb0, 0xee, 0x48, 0x0a, 0x02, 0x98, + 0x90, 0xe7, 0x00, 0x00, 0x54, 0x78, 0x2f, 0x52, 0x78, 0x20, 0x50, 0x68, + 0x61, 0x73, 0x65, 0x20, 0x43, 0x61, 0x6c, 0x3a, 0x20, 0x65, 0x72, 0x72, + 0x20, 0x3d, 0x20, 0x25, 0x58, 0x0a, 0x00, 0x00, 0xf8, 0xb5, 0x06, 0x46, + 0x01, 0x20, 0x8d, 0xf8, 0x00, 0x00, 0x0d, 0x46, 0x17, 0x46, 0x00, 0xf0, + 0x36, 0xf8, 0xd4, 0xf7, 0xb7, 0xf9, 0x04, 0x00, 0x05, 0xd1, 0x6b, 0x46, + 0x00, 0xf0, 0x30, 0xf8, 0xe5, 0xf7, 0x25, 0xfa, 0x04, 0x46, 0x9c, 0xb9, + 0x28, 0x69, 0xd6, 0xf7, 0x4d, 0xfa, 0xaa, 0x68, 0x3b, 0x46, 0x29, 0x46, + 0x30, 0x46, 0x00, 0xf0, 0x27, 0xf8, 0x04, 0x00, 0x08, 0xd1, 0xaa, 0x68, + 0x07, 0xf1, 0x10, 0x03, 0x52, 0x42, 0x29, 0x46, 0x30, 0x46, 0x00, 0xf0, + 0x1d, 0xf8, 0x04, 0x46, 0x00, 0xf0, 0x15, 0xf8, 0xd4, 0xf7, 0xb0, 0xf9, + 0x05, 0x46, 0x6b, 0x46, 0x00, 0xf0, 0x10, 0xf8, 0xe5, 0xf7, 0x2f, 0xfa, + 0x05, 0xb9, 0x05, 0x46, 0x04, 0xb9, 0x2c, 0x46, 0x07, 0xf1, 0x10, 0x01, + 0x38, 0x46, 0x00, 0xf0, 0x6f, 0xf8, 0x87, 0xed, 0x08, 0x0a, 0x20, 0x46, + 0xf2, 0xbd, 0x00, 0x23, 0x0c, 0x22, 0x01, 0x21, 0x30, 0x46, 0x70, 0x47, + 0xf8, 0xb5, 0x2d, 0xed, 0x02, 0x8b, 0x9a, 0xb0, 0x05, 0x46, 0x0e, 0x46, + 0x14, 0x46, 0x1f, 0x46, 0x01, 0xa8, 0x2c, 0x49, 0x24, 0x22, 0xb9, 0xf7, + 0x05, 0xf9, 0x01, 0x95, 0x04, 0x94, 0x00, 0x23, 0x31, 0x68, 0x06, 0x91, + 0x00, 0x21, 0x70, 0x68, 0x07, 0x90, 0x00, 0x91, 0x22, 0x46, 0x01, 0x21, + 0x28, 0x46, 0xd2, 0xf7, 0xb6, 0xfb, 0x04, 0x00, 0x16, 0xd1, 0x70, 0x69, + 0xd6, 0xf7, 0x00, 0xfa, 0x01, 0xa8, 0xd5, 0xf7, 0x79, 0xfa, 0x04, 0x00, + 0x0e, 0xd1, 0xf1, 0x68, 0x28, 0x46, 0xd5, 0xf7, 0x41, 0xfb, 0x10, 0xb1, + 0x41, 0xf2, 0x01, 0x14, 0x06, 0xe0, 0x0a, 0xa9, 0x01, 0xa8, 0xd5, 0xf7, + 0x3d, 0xfb, 0x08, 0xb1, 0x41, 0xf2, 0x02, 0x14, 0x11, 0x98, 0x38, 0x60, + 0x13, 0x98, 0x78, 0x60, 0x9d, 0xed, 0x17, 0x0a, 0xba, 0xf7, 0x7c, 0xf8, + 0x13, 0x48, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0x90, 0xec, + 0x02, 0x0a, 0xba, 0xf7, 0x46, 0xf8, 0xb0, 0xee, 0x40, 0x8a, 0xf0, 0xee, + 0x60, 0x8a, 0x9d, 0xed, 0x15, 0x0a, 0xba, 0xf7, 0x6b, 0xf8, 0xb0, 0xee, + 0x48, 0x1a, 0xf0, 0xee, 0x68, 0x1a, 0xba, 0xf7, 0x12, 0xf8, 0x07, 0xf1, + 0x08, 0x00, 0x00, 0x21, 0x80, 0xec, 0x02, 0x0a, 0x28, 0x46, 0xd2, 0xf7, + 0x18, 0xfc, 0x04, 0xb9, 0x04, 0x46, 0x1a, 0xb0, 0x20, 0x46, 0xbd, 0xec, + 0x02, 0x8b, 0xf2, 0xbd, 0xd0, 0x94, 0x04, 0x02, 0xf4, 0x8f, 0x00, 0x21, + 0x80, 0xb5, 0x08, 0x30, 0x08, 0x31, 0x2d, 0xed, 0x02, 0x8b, 0x90, 0xec, + 0x02, 0x8a, 0x91, 0xec, 0x02, 0x0a, 0xb8, 0xf7, 0xe6, 0xfa, 0x00, 0xf0, + 0x12, 0xf8, 0xb8, 0xf7, 0xeb, 0xfa, 0xfe, 0xee, 0x00, 0x0a, 0x20, 0xee, + 0x20, 0x0a, 0xba, 0xf7, 0x36, 0xf8, 0xf2, 0xf7, 0xa3, 0xff, 0x00, 0xf0, + 0x06, 0xf8, 0xbd, 0xec, 0x02, 0x8b, 0xbd, 0xe8, 0x01, 0x40, 0xb8, 0xf7, + 0xdb, 0xba, 0xb0, 0xee, 0x40, 0x1a, 0xf0, 0xee, 0x60, 0x1a, 0xb0, 0xee, + 0x48, 0x0a, 0xf0, 0xee, 0x68, 0x0a, 0xb9, 0xf7, 0xfc, 0xbf, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2d, 0x91, 0x01, 0x02, 0x27, 0x92, 0x01, 0x02, + 0x33, 0x92, 0x01, 0x02, 0x4b, 0x92, 0x01, 0x02, 0x85, 0x92, 0x01, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x7c, 0x02, 0x21, + 0x11, 0x8d, 0x03, 0x02, 0x3d, 0x8d, 0x03, 0x02, 0x71, 0x8e, 0x03, 0x02, + 0x7d, 0x8e, 0x03, 0x02, 0x95, 0x8e, 0x03, 0x02, 0xdb, 0x8e, 0x03, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe5, 0x28, 0x03, 0x02, 0x83, 0x29, 0x03, 0x02, 0x97, 0x2c, 0x03, 0x02, + 0xa3, 0x2c, 0x03, 0x02, 0x09, 0x2c, 0x03, 0x02, 0xc1, 0x2c, 0x03, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xb5, 0x02, 0x21, + 0x95, 0x2f, 0x03, 0x02, 0xe7, 0x2f, 0x03, 0x02, 0xb1, 0x32, 0x03, 0x02, + 0xbd, 0x32, 0x03, 0x02, 0x13, 0x32, 0x03, 0x02, 0xd5, 0x32, 0x03, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x9c, 0x02, 0x21, + 0x69, 0x35, 0x03, 0x02, 0xb9, 0x35, 0x03, 0x02, 0x41, 0x38, 0x03, 0x02, + 0x4d, 0x38, 0x03, 0x02, 0xb3, 0x37, 0x03, 0x02, 0x6d, 0x38, 0x03, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xac, 0x02, 0x21, + 0x95, 0x83, 0x04, 0x02, 0xf1, 0x83, 0x04, 0x02, 0x8d, 0x84, 0x04, 0x02, + 0x99, 0x84, 0x04, 0x02, 0xb1, 0x84, 0x04, 0x02, 0x01, 0x85, 0x04, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf9, 0x6b, 0x04, 0x02, 0x59, 0x6c, 0x04, 0x02, 0xdd, 0x6e, 0x04, 0x02, + 0xe9, 0x6e, 0x04, 0x02, 0x01, 0x6f, 0x04, 0x02, 0x53, 0x6f, 0x04, 0x02, + 0xc1, 0x6f, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0x02, 0x21, + 0x7d, 0xfc, 0x03, 0x02, 0x01, 0xfd, 0x03, 0x02, 0xa3, 0xfe, 0x03, 0x02, + 0xaf, 0xfe, 0x03, 0x02, 0x45, 0xfe, 0x03, 0x02, 0x0b, 0xff, 0x03, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa9, 0x3a, 0x03, 0x02, 0x31, 0x3b, 0x03, 0x02, 0x0d, 0x3b, 0x03, 0x02, + 0x19, 0x3b, 0x03, 0x02, 0x43, 0x3c, 0x03, 0x02, 0x97, 0x3c, 0x03, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0xe4, 0x02, 0x21, + 0xc9, 0xeb, 0x03, 0x02, 0xfd, 0xec, 0x03, 0x02, 0xd5, 0xec, 0x03, 0x02, + 0xe1, 0xec, 0x03, 0x02, 0xd9, 0xed, 0x03, 0x02, 0x8d, 0xee, 0x03, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x7d, 0x02, 0x21, + 0x1d, 0x3a, 0x04, 0x02, 0x0b, 0x3b, 0x04, 0x02, 0x0d, 0x3c, 0x04, 0x02, + 0x19, 0x3c, 0x04, 0x02, 0x33, 0x3c, 0x04, 0x02, 0xdd, 0x3c, 0x04, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x76, 0x02, 0x21, + 0x05, 0x0b, 0x03, 0x02, 0x2f, 0x0c, 0x03, 0x02, 0xcf, 0x0f, 0x03, 0x02, + 0xef, 0x0f, 0x03, 0x02, 0x9d, 0x0e, 0x03, 0x02, 0x1f, 0x10, 0x03, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x08, 0x03, 0x02, 0xe7, 0x08, 0x03, 0x02, 0xcf, 0x09, 0x03, 0x02, + 0xdb, 0x09, 0x03, 0x02, 0xf3, 0x09, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0xd6, 0x02, 0x21, + 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd3, 0x01, 0x02, 0x02, 0xe9, 0x02, 0x02, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6d, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x81, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x51, 0x77, 0x04, 0x02, 0xa9, 0x77, 0x04, 0x02, 0x8f, 0x7a, 0x04, 0x02, + 0x9b, 0x7a, 0x04, 0x02, 0x3d, 0x7a, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x89, 0x41, 0xa0, 0x3f, 0x02, 0x0f, 0x00, 0x00, 0x3f, 0x35, 0x9e, 0x3f, + 0x03, 0x0f, 0x00, 0x00, 0x08, 0xac, 0x9c, 0x3f, 0x02, 0x0e, 0x00, 0x00, + 0xbe, 0x9f, 0x9a, 0x3f, 0x03, 0x0e, 0x00, 0x00, 0xfe, 0xd4, 0x98, 0x3f, + 0x02, 0x0d, 0x00, 0x00, 0x3d, 0x0a, 0x97, 0x3f, 0x03, 0x0d, 0x00, 0x00, + 0x7d, 0x3f, 0x95, 0x3f, 0x02, 0x0c, 0x00, 0x00, 0xbc, 0x74, 0x93, 0x3f, + 0x04, 0x0e, 0x00, 0x00, 0xfc, 0xa9, 0x91, 0x3f, 0x02, 0x0b, 0x00, 0x00, + 0x3b, 0xdf, 0x8f, 0x3f, 0x05, 0x0f, 0x00, 0x00, 0xf2, 0xd2, 0x8d, 0x3f, + 0x02, 0x0a, 0x00, 0x00, 0xba, 0x49, 0x8c, 0x3f, 0x05, 0x0e, 0x00, 0x00, + 0x71, 0x3d, 0x8a, 0x3f, 0x02, 0x09, 0x00, 0x00, 0xb0, 0x72, 0x88, 0x3f, + 0x04, 0x0b, 0x00, 0x00, 0x2f, 0xdd, 0x84, 0x3f, 0x05, 0x0c, 0x00, 0x00, + 0xae, 0x47, 0x81, 0x3f, 0x05, 0x0b, 0x00, 0x00, 0x48, 0xe1, 0x7a, 0x3f, + 0x05, 0x0a, 0x00, 0x00, 0xb4, 0xc8, 0x76, 0x3f, 0x02, 0x08, 0x00, 0x00, + 0x46, 0xb6, 0x73, 0x3f, 0x05, 0x09, 0x00, 0x00, 0x1d, 0x5a, 0x64, 0x3f, + 0x04, 0x08, 0x00, 0x00, 0x75, 0x93, 0x58, 0x3f, 0x02, 0x07, 0x00, 0x00, + 0x19, 0x04, 0x56, 0x3f, 0x05, 0x08, 0x00, 0x00, 0xf4, 0xfd, 0x54, 0x3f, + 0x03, 0x07, 0x00, 0x00, 0x71, 0x3d, 0x4a, 0x3f, 0x02, 0x0f, 0x01, 0x00, + 0xdd, 0x24, 0x46, 0x3f, 0x03, 0x0f, 0x01, 0x00, 0x5c, 0x8f, 0x42, 0x3f, + 0x02, 0x0e, 0x01, 0x00, 0xc9, 0x76, 0x3e, 0x3f, 0x03, 0x0e, 0x01, 0x00, + 0x48, 0xe1, 0x3a, 0x3f, 0x02, 0x0d, 0x01, 0x00, 0xc7, 0x4b, 0x37, 0x3f, + 0x03, 0x0d, 0x01, 0x00, 0xb2, 0x9d, 0x2f, 0x3f, 0x03, 0x0c, 0x01, 0x00, + 0x31, 0x08, 0x2c, 0x3f, 0x02, 0x0b, 0x01, 0x00, 0xb0, 0x72, 0x28, 0x3f, + 0x03, 0x0b, 0x01, 0x00, 0x9c, 0xc4, 0x20, 0x3f, 0x03, 0x0a, 0x01, 0x00, + 0x1b, 0x2f, 0x1d, 0x3f, 0x02, 0x09, 0x01, 0x00, 0x9a, 0x99, 0x19, 0x3f, + 0x05, 0x0d, 0x01, 0x00, 0x71, 0x3d, 0x0a, 0x3f, 0x05, 0x0b, 0x01, 0x00, + 0x5c, 0x8f, 0x02, 0x3f, 0x05, 0x0a, 0x01, 0x00, 0xb6, 0xf3, 0xfd, 0x3e, + 0x02, 0x08, 0x01, 0x00, 0x8f, 0xc2, 0xf5, 0x3e, 0x03, 0x08, 0x01, 0x00, + 0xc7, 0x4b, 0xb7, 0x3e, 0x05, 0x08, 0x01, 0x00, 0x2b, 0x87, 0x96, 0x3e, + 0x04, 0x07, 0x01, 0x00, 0x6d, 0xe7, 0x7b, 0x3e, 0x02, 0x06, 0x01, 0x00, + 0xd5, 0x78, 0x69, 0x3e, 0x03, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x06, 0x01, 0x00, 0x9a, 0x99, 0x69, 0xc1, 0x00, 0x60, 0x1a, 0x45, + 0x9a, 0x99, 0x69, 0xc1, 0x00, 0x60, 0x1a, 0x45, 0x9a, 0x99, 0x69, 0xc1, + 0x00, 0x60, 0x1a, 0x45, 0x9a, 0x99, 0x69, 0xc1, 0x00, 0x60, 0x1a, 0x45, + 0x9a, 0x99, 0x69, 0xc1, 0x00, 0x60, 0x1a, 0x45, 0x9a, 0x99, 0x69, 0xc1, + 0x00, 0x60, 0x1a, 0x45, 0x9a, 0x99, 0x69, 0xc1, 0x00, 0x60, 0x1a, 0x45, + 0x9a, 0x99, 0x69, 0xc1, 0x00, 0x60, 0x1a, 0x45, 0x5a, 0x64, 0x8b, 0x3f, + 0xc9, 0x8e, 0x0d, 0xba, 0xec, 0x51, 0x88, 0x3f, 0xfa, 0x61, 0x84, 0xba, + 0x5a, 0x64, 0x8b, 0x3f, 0xc9, 0x8e, 0x0d, 0xba, 0xec, 0x51, 0x88, 0x3f, + 0xfa, 0x61, 0x84, 0xba, 0x5a, 0x64, 0x8b, 0x3f, 0xc9, 0x8e, 0x0d, 0xba, + 0xec, 0x51, 0x88, 0x3f, 0xfa, 0x61, 0x84, 0xba, 0x7b, 0x14, 0x4e, 0x3f, + 0x2e, 0x56, 0x54, 0xba, 0x7b, 0x14, 0x4e, 0x3f, 0x2e, 0x56, 0x54, 0xba, + 0x01, 0x00, 0xbc, 0x1b, 0x08, 0x03, 0x03, 0x01, 0xbd, 0x1b, 0xac, 0x26, + 0x08, 0x03, 0x03, 0x01, 0xad, 0x26, 0xde, 0x26, 0x08, 0x03, 0x03, 0x01, + 0xdf, 0x26, 0xfc, 0x26, 0x08, 0x03, 0x03, 0x01, 0xfd, 0x26, 0x41, 0x27, + 0x08, 0x03, 0x03, 0x01, 0x42, 0x27, 0xe8, 0x35, 0x08, 0x03, 0x03, 0x01, + 0xe9, 0x35, 0xb0, 0x36, 0x08, 0x03, 0x03, 0x01, 0xb1, 0x36, 0x3c, 0x37, + 0x08, 0x03, 0x03, 0x01, 0x3d, 0x37, 0x78, 0x37, 0x08, 0x03, 0x03, 0x01, + 0x01, 0x00, 0xbc, 0x1b, 0x08, 0x03, 0x03, 0x01, 0xbd, 0x1b, 0xac, 0x26, + 0x08, 0x03, 0x03, 0x01, 0xad, 0x26, 0xde, 0x26, 0x08, 0x03, 0x03, 0x01, + 0xdf, 0x26, 0xfc, 0x26, 0x08, 0x03, 0x03, 0x01, 0xfd, 0x26, 0x41, 0x27, + 0x08, 0x03, 0x03, 0x01, 0x42, 0x27, 0xe8, 0x35, 0x08, 0x03, 0x03, 0x01, + 0xe9, 0x35, 0xb0, 0x36, 0x08, 0x03, 0x03, 0x01, 0xb1, 0x36, 0x3c, 0x37, + 0x08, 0x03, 0x03, 0x01, 0x3d, 0x37, 0x78, 0x37, 0x08, 0x03, 0x03, 0x01, + 0x01, 0x00, 0xbd, 0x1f, 0x08, 0x03, 0x03, 0x01, 0xbe, 0x1f, 0x24, 0x2c, + 0x08, 0x03, 0x03, 0x01, 0x25, 0x2c, 0x88, 0x2c, 0x08, 0x03, 0x03, 0x01, + 0x89, 0x2c, 0xa6, 0x2c, 0x08, 0x03, 0x03, 0x01, 0xa7, 0x2c, 0xeb, 0x2c, + 0x08, 0x03, 0x03, 0x01, 0xec, 0x2c, 0x80, 0x3e, 0x0b, 0x03, 0x03, 0x01, + 0x81, 0x3e, 0x02, 0x3f, 0x0b, 0x03, 0x03, 0x01, 0x03, 0x3f, 0x2a, 0x3f, + 0x0b, 0x03, 0x03, 0x01, 0x2b, 0x3f, 0x7a, 0x3f, 0x09, 0x03, 0x03, 0x01, + 0x01, 0x00, 0xbc, 0x1b, 0x0f, 0x02, 0x03, 0x01, 0xbd, 0x1b, 0xac, 0x26, + 0x0f, 0x02, 0x03, 0x01, 0xad, 0x26, 0xde, 0x26, 0x0f, 0x02, 0x03, 0x01, + 0xdf, 0x26, 0xfc, 0x26, 0x0f, 0x02, 0x03, 0x01, 0xfd, 0x26, 0x41, 0x27, + 0x0f, 0x02, 0x03, 0x01, 0x42, 0x27, 0xec, 0x2c, 0x0f, 0x02, 0x03, 0x01, + 0xed, 0x2c, 0xc8, 0x32, 0x0f, 0x02, 0x03, 0x01, 0xc9, 0x32, 0x4c, 0x36, + 0x0f, 0x02, 0x03, 0x01, 0x4d, 0x36, 0x78, 0x37, 0x09, 0x02, 0x03, 0x01, + 0x01, 0x00, 0xbc, 0x1b, 0x0f, 0x02, 0x03, 0x01, 0xbd, 0x1b, 0xac, 0x26, + 0x0f, 0x02, 0x03, 0x01, 0xad, 0x26, 0xde, 0x26, 0x0f, 0x02, 0x03, 0x01, + 0xdf, 0x26, 0xfc, 0x26, 0x0f, 0x02, 0x03, 0x01, 0xfd, 0x26, 0x41, 0x27, + 0x0f, 0x02, 0x03, 0x01, 0x42, 0x27, 0xec, 0x2c, 0x0f, 0x02, 0x03, 0x01, + 0xed, 0x2c, 0xc8, 0x32, 0x0f, 0x02, 0x03, 0x01, 0xc9, 0x32, 0x4c, 0x36, + 0x0f, 0x02, 0x03, 0x01, 0x4d, 0x36, 0x78, 0x37, 0x09, 0x02, 0x03, 0x01, + 0x01, 0x00, 0xbd, 0x1f, 0x08, 0x02, 0x03, 0x01, 0xbe, 0x1f, 0x24, 0x2c, + 0x08, 0x02, 0x03, 0x01, 0x25, 0x2c, 0x88, 0x2c, 0x08, 0x02, 0x03, 0x01, + 0x89, 0x2c, 0xa6, 0x2c, 0x08, 0x02, 0x03, 0x01, 0xa7, 0x2c, 0xeb, 0x2c, + 0x08, 0x02, 0x03, 0x01, 0xec, 0x2c, 0xb0, 0x36, 0x0f, 0x02, 0x03, 0x01, + 0xb1, 0x36, 0x98, 0x3a, 0x0f, 0x02, 0x03, 0x01, 0x99, 0x3a, 0x22, 0x3d, + 0x0f, 0x02, 0x03, 0x01, 0x23, 0x3d, 0x7a, 0x3f, 0x09, 0x02, 0x03, 0x01, + 0x2d, 0xe9, 0xf0, 0x47, 0x05, 0x46, 0x00, 0x20, 0xd9, 0xf7, 0xe8, 0xff, + 0x81, 0x46, 0x08, 0x20, 0xd9, 0xf7, 0xe4, 0xff, 0x82, 0x46, 0x0a, 0x20, + 0xd9, 0xf7, 0xe0, 0xff, 0x80, 0x46, 0x00, 0x26, 0x50, 0x4c, 0x25, 0xfa, + 0x06, 0xf0, 0xc0, 0x07, 0x13, 0xd5, 0x30, 0x46, 0xc7, 0xf7, 0x88, 0xf9, + 0x07, 0x46, 0xff, 0x2f, 0x0d, 0xd0, 0x43, 0x46, 0x52, 0x46, 0x49, 0x46, + 0xf0, 0xb2, 0xb9, 0xf7, 0x57, 0xfa, 0xf0, 0xb2, 0xb9, 0xf7, 0x84, 0xfa, + 0x14, 0x21, 0x4f, 0x43, 0xe0, 0x19, 0xcb, 0xf7, 0x37, 0xfc, 0x76, 0x1c, + 0x08, 0x2e, 0xe4, 0xd3, 0xbd, 0xe8, 0xf0, 0x87, 0x2d, 0xe9, 0xf0, 0x47, + 0x82, 0x46, 0x00, 0x24, 0x00, 0x26, 0x40, 0x4f, 0x2a, 0xfa, 0x06, 0xf0, + 0xc0, 0x07, 0x3c, 0xd5, 0x5f, 0xfa, 0x86, 0xf8, 0x40, 0x46, 0xc7, 0xf7, + 0x63, 0xf9, 0x14, 0x21, 0x7d, 0x78, 0x39, 0x4a, 0x48, 0x43, 0x02, 0xeb, + 0x00, 0x09, 0x48, 0x46, 0xe1, 0xf7, 0x4b, 0xfb, 0x00, 0x23, 0x0d, 0x22, + 0x01, 0x21, 0x40, 0x46, 0xd3, 0xf7, 0x84, 0xfd, 0x04, 0x00, 0x03, 0xd1, + 0xf0, 0xb2, 0xb9, 0xf7, 0x7b, 0xfa, 0x04, 0x46, 0x34, 0xb9, 0x38, 0x78, + 0x01, 0x28, 0x0b, 0xd1, 0xf0, 0xb2, 0xb9, 0xf7, 0x4e, 0xfb, 0x04, 0x46, + 0x00, 0x2d, 0x18, 0xbf, 0x00, 0x2c, 0x03, 0xd0, 0xf0, 0xb2, 0xb9, 0xf7, + 0x1b, 0xfb, 0x04, 0x46, 0x00, 0x23, 0x0d, 0x22, 0x01, 0x21, 0x40, 0x46, + 0xd3, 0xf7, 0x82, 0xfd, 0x04, 0xb9, 0x04, 0x46, 0x21, 0x46, 0x48, 0x46, + 0xe1, 0xf7, 0x27, 0xfb, 0x28, 0x46, 0x45, 0x1e, 0x10, 0xb1, 0x00, 0x2c, + 0xcf, 0xd1, 0x00, 0xe0, 0x1c, 0xb9, 0x76, 0x1c, 0xf0, 0xb2, 0x08, 0x28, + 0xba, 0xdb, 0x20, 0x46, 0xbd, 0xe8, 0xf0, 0x87, 0x80, 0xb5, 0x00, 0xf0, + 0x09, 0xf8, 0xd1, 0xf7, 0xdc, 0xf8, 0x02, 0xbd, 0x80, 0xb5, 0x00, 0xf0, + 0x03, 0xf8, 0xd1, 0xf7, 0xc1, 0xf8, 0x02, 0xbd, 0x00, 0x92, 0x0b, 0x46, + 0x02, 0x46, 0x02, 0x21, 0x13, 0x48, 0x70, 0x47, 0xf8, 0xb5, 0x0c, 0x46, + 0x16, 0x46, 0x1f, 0x46, 0xe1, 0xf7, 0x14, 0xfb, 0xc7, 0xf7, 0x0a, 0xf9, + 0x00, 0x25, 0xff, 0x28, 0x10, 0xd0, 0x67, 0xb9, 0x31, 0x68, 0x14, 0x29, + 0x0f, 0xd3, 0x14, 0x22, 0x09, 0x4b, 0x50, 0x43, 0x19, 0x18, 0x20, 0x46, + 0xb8, 0xf7, 0xb0, 0xfc, 0x14, 0x20, 0x30, 0x60, 0x07, 0xe0, 0x4f, 0xf6, + 0x2a, 0x75, 0x04, 0xe0, 0x4f, 0xf6, 0x52, 0x75, 0x01, 0xe0, 0x4f, 0xf6, + 0x26, 0x75, 0x28, 0x46, 0xf2, 0xbd, 0x00, 0x00, 0x94, 0x75, 0x03, 0x21, + 0x20, 0x90, 0x00, 0x21, 0x38, 0xb5, 0x0c, 0x46, 0xe1, 0xf7, 0xee, 0xfa, + 0xc7, 0xf7, 0xe4, 0xf8, 0x00, 0x25, 0x01, 0x2c, 0x18, 0xbf, 0x4f, 0xf6, + 0x27, 0x75, 0x28, 0x46, 0x32, 0xbd, 0x00, 0x00, 0x70, 0x17, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0xa0, 0x0f, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0xd0, 0x07, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x08, 0x46, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x09, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa8, 0xcc, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0xf8, 0x8f, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x48, 0x53, 0x05, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x98, 0x16, 0x06, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0xc0, 0x27, 0x09, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x08, 0x46, 0x02, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x58, 0x09, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0xa8, 0xcc, 0x03, 0x00, 0x08, 0x00, 0x00, 0x00, 0xf8, 0x8f, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x48, 0x53, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x98, 0x16, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0xc0, 0x27, 0x09, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x08, 0x46, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x58, 0x09, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0xa8, 0xcc, 0x03, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xf8, 0x8f, 0x04, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x48, 0x53, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x98, 0x16, 0x06, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xc0, 0x27, 0x09, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x08, 0x46, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x09, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa8, 0xcc, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, + 0xf8, 0x8f, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x48, 0x53, 0x05, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x98, 0x16, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, + 0xc0, 0x27, 0x09, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x46, 0x02, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x58, 0x09, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xa8, 0xcc, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0xf8, 0x8f, 0x04, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x48, 0x53, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x98, 0x16, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0xc0, 0x27, 0x09, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x08, 0x46, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x58, 0x09, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0xa8, 0xcc, 0x03, 0x00, + 0x03, 0x00, 0x00, 0x00, 0xf8, 0x8f, 0x04, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x48, 0x53, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x98, 0x16, 0x06, 0x00, + 0x02, 0x00, 0x00, 0x00, 0xc0, 0x27, 0x09, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x70, 0x69, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, + 0x69, 0x6e, 0x2e, 0x20, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x20, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x0a, 0x00, 0x47, 0x72, 0x61, 0x64, + 0x69, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, + 0x77, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x69, + 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x2e, 0x20, + 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x20, 0x0a, 0x00, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, + 0x20, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x77, 0x61, 0x6e, 0x74, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x69, 0x63, 0x6b, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6d, 0x69, 0x6e, 0x2e, 0x20, 0x63, 0x64, 0x61, 0x63, + 0x20, 0x0a, 0x00, 0x00, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, + 0x20, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x77, 0x61, 0x6e, 0x74, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x69, 0x63, 0x6b, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x2e, 0x20, 0x63, 0x64, 0x61, 0x63, + 0x20, 0x0a, 0x00, 0x00, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, + 0x20, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x77, 0x61, 0x6e, 0x74, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x69, 0x63, 0x6b, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6d, 0x69, 0x6e, 0x2e, 0x20, 0x66, 0x64, 0x61, 0x63, + 0x20, 0x0a, 0x00, 0x00, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, + 0x20, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x77, 0x61, 0x6e, 0x74, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x69, 0x63, 0x6b, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x2e, 0x20, 0x66, 0x64, 0x61, 0x63, + 0x20, 0x0a, 0x00, 0x00, 0x48, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x69, 0x63, + 0x20, 0x49, 0x6d, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x25, 0x64, 0x20, + 0x0a, 0x00, 0x00, 0x00, 0xbc, 0x1b, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0xc4, 0x09, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xd0, 0x07, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0xdc, 0x05, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0xe8, 0x03, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0xbc, 0x1b, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xc4, 0x09, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0xdc, 0x05, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xc2, 0x01, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0xbc, 0x1b, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0xc4, 0x09, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0xd0, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xdc, 0x05, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0xbc, 0x02, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0xbc, 0x1b, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xc4, 0x09, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xd0, 0x07, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0xdc, 0x05, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0xe8, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0xbc, 0x1b, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xc4, 0x09, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0xdc, 0x05, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0xbc, 0x02, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0xc2, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x20, 0x74, 0x6f, 0x20, 0x68, 0x65, 0x6c, 0x70, 0x20, 0x6d, 0x61, + 0x6e, 0x75, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x75, 0x65, 0x6e, + 0x63, 0x65, 0x20, 0x54, 0x50, 0x47, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x2d, 0x3e, 0x53, 0x57, 0x44, 0x65, 0x66, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x63, 0x73, 0x2d, 0x3e, 0x43, + 0x50, 0x55, 0x2d, 0x3e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x67, 0x65, 0x72, + 0x0a, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6d, 0x61, 0x78, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x76, 0x65, 0x72, 0x62, + 0x6f, 0x73, 0x69, 0x74, 0x79, 0x2f, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, + 0x74, 0x79, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x28, 0x31, 0x20, + 0x3d, 0x20, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x2c, 0x20, 0x32, 0x20, 0x3d, + 0x20, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x57, + 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x2e, + 0x29, 0x0a, 0x09, 0x4c, 0x4f, 0x47, 0x4c, 0x56, 0x4c, 0x3d, 0x3c, 0x6c, + 0x76, 0x6c, 0x3e, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x72, 0x78, + 0x53, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x3a, 0x20, 0x20, 0x73, + 0x72, 0x63, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x30, 0x38, 0x58, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x30, + 0x38, 0x58, 0x0a, 0x00, 0x20, 0x20, 0x74, 0x78, 0x53, 0x50, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x3a, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, + 0x20, 0x30, 0x78, 0x25, 0x30, 0x38, 0x58, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x30, 0x38, 0x58, 0x0a, 0x00, + 0x20, 0x20, 0x6f, 0x72, 0x78, 0x53, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x3a, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, + 0x30, 0x38, 0x58, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, + 0x30, 0x78, 0x25, 0x30, 0x38, 0x58, 0x0a, 0x00, 0x20, 0x20, 0x6f, 0x74, + 0x68, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x3a, 0x20, 0x73, + 0x72, 0x63, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x30, 0x38, 0x58, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x30, + 0x38, 0x58, 0x0a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x69, 0x6e, 0x69, 0x74, + 0x3a, 0x20, 0x63, 0x61, 0x6c, 0x4d, 0x61, 0x73, 0x6b, 0x20, 0x25, 0x58, + 0x2c, 0x20, 0x25, 0x64, 0x20, 0x6d, 0x73, 0x2c, 0x20, 0x65, 0x72, 0x72, + 0x20, 0x25, 0x58, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x67, 0x49, 0x6e, 0x69, + 0x74, 0x69, 0x61, 0x6c, 0x43, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x5b, 0x5d, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x6f, 0x62, 0x6a, 0x20, 0x49, 0x44, 0x20, 0x30, 0x78, 0x25, 0x58, + 0x20, 0x69, 0x73, 0x20, 0x75, 0x6e, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x2e, 0x0a, 0x00, 0x00, 0x00, 0xa0, 0x46, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x4c, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x60, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x92, 0x60, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x60, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0xb2, 0x60, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x60, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xd2, 0x60, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0xe2, 0x60, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x60, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x60, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x12, 0x60, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x22, 0x60, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x32, 0x60, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x42, 0x60, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x52, 0x60, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x62, 0x60, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x72, 0x60, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x61, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x12, 0x61, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x02, 0x02, 0xb1, 0x00, 0x02, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3b, 0x20, 0x03, 0x02, 0x09, 0x20, 0x03, 0x02, + 0x05, 0x91, 0x04, 0x02, 0xd9, 0x90, 0x04, 0x02, 0xb5, 0x02, 0x03, 0x02, + 0x0f, 0x02, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa5, 0xbc, 0x01, 0x02, 0x75, 0xbc, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4a, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb4, 0x02, 0x46, 0x10, 0x68, 0x95, 0x68, + 0x13, 0x18, 0x50, 0x68, 0x03, 0xeb, 0x50, 0x04, 0xc0, 0x07, 0x1c, 0xd5, + 0x4d, 0x44, 0x1a, 0xe0, 0x13, 0xf8, 0x01, 0x7b, 0x05, 0xf8, 0x01, 0x7b, + 0x49, 0x1e, 0xf9, 0xd1, 0x98, 0xb1, 0x13, 0xf8, 0x01, 0x1b, 0xc6, 0xf3, + 0x81, 0x06, 0x03, 0x2e, 0x08, 0xbf, 0x13, 0xf8, 0x01, 0x6b, 0x01, 0xeb, + 0x06, 0x21, 0x49, 0x42, 0x80, 0x1c, 0x29, 0x44, 0x05, 0xd0, 0x11, 0xf8, + 0x01, 0x6b, 0x05, 0xf8, 0x01, 0x6b, 0x40, 0x1e, 0xf9, 0xd1, 0xa3, 0x42, + 0x0e, 0xd0, 0x13, 0xf8, 0x01, 0x6b, 0x16, 0xf0, 0x03, 0x01, 0x04, 0xbf, + 0x13, 0xf8, 0x01, 0x1b, 0xc9, 0x1c, 0x30, 0x09, 0x0f, 0x28, 0xdb, 0xd1, + 0x13, 0xf8, 0x01, 0x0b, 0x0f, 0x30, 0xd7, 0xe7, 0xf0, 0xbc, 0x02, 0xf1, + 0x0c, 0x00, 0x70, 0x47, 0x63, 0x68, 0x61, 0x6e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x3a, 0x20, 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x00, + 0x43, 0x74, 0x72, 0x6c, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x72, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x0a, 0x00, 0x00, 0x43, 0x50, 0x55, 0x20, + 0x62, 0x6f, 0x6f, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x0a, 0x00, 0x00, + 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x62, 0x6f, 0x6f, 0x74, 0x20, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x0a, 0x00, 0x00, 0x00, 0x43, 0x4d, 0x44, 0x20, + 0x52, 0x58, 0x44, 0x20, 0x30, 0x78, 0x25, 0x58, 0x0a, 0x00, 0x00, 0x00, + 0x46, 0x41, 0x54, 0x41, 0x4c, 0x20, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x21, + 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x20, + 0x3d, 0x20, 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x43, + 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x30, 0x38, 0x58, + 0x0a, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, + 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x0a, + 0x0a, 0x00, 0x00, 0x00, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x4c, 0x6f, + 0x67, 0x3a, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x25, 0x64, + 0x2c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x78, + 0x25, 0x58, 0x0a, 0x00, 0x48, 0x6b, 0x02, 0x21, 0xb8, 0x6b, 0x02, 0x21, + 0x70, 0x47, 0x02, 0x21, 0x28, 0x6c, 0x02, 0x21, 0x00, 0x4a, 0x02, 0x21, + 0x70, 0x4a, 0x02, 0x21, 0xe0, 0x4a, 0x02, 0x21, 0x50, 0x4b, 0x02, 0x21, + 0xc0, 0x4b, 0x02, 0x21, 0x30, 0x4c, 0x02, 0x21, 0xa0, 0x4c, 0x02, 0x21, + 0x10, 0x4d, 0x02, 0x21, 0x80, 0x4d, 0x02, 0x21, 0xf0, 0x4d, 0x02, 0x21, + 0x60, 0x4e, 0x02, 0x21, 0xd0, 0x4e, 0x02, 0x21, 0x40, 0x4f, 0x02, 0x21, + 0xb0, 0x4f, 0x02, 0x21, 0x20, 0x50, 0x02, 0x21, 0x90, 0x50, 0x02, 0x21, + 0xe8, 0x6d, 0x02, 0x21, 0x00, 0x51, 0x02, 0x21, 0x70, 0x51, 0x02, 0x21, + 0xe0, 0x51, 0x02, 0x21, 0x50, 0x52, 0x02, 0x21, 0x38, 0x6f, 0x02, 0x21, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x70, 0x40, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x90, 0x40, 0x00, 0x21, + 0x01, 0x00, 0x00, 0x00, 0xa0, 0x40, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, + 0x90, 0x40, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0xa0, 0x40, 0x00, 0x21, + 0x53, 0x45, 0x54, 0x5f, 0x4f, 0x52, 0x58, 0x5f, 0x4e, 0x43, 0x4f, 0x3a, + 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, 0x20, 0x6e, 0x63, 0x6f, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x20, 0x25, 0x64, 0x20, 0x69, 0x73, 0x20, 0x69, + 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x0a, 0x00, 0x9a, 0x71, 0x4b, 0x45, + 0x09, 0x00, 0x00, 0x00, 0x33, 0xa3, 0xa7, 0x44, 0x0a, 0x00, 0x00, 0x00, + 0x9a, 0xd9, 0x10, 0x44, 0x0b, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x86, 0x43, + 0x0c, 0x00, 0x00, 0x00, 0x33, 0x33, 0x02, 0x43, 0x0d, 0x00, 0x00, 0x00, + 0x33, 0x33, 0x7f, 0x42, 0x0e, 0x00, 0x00, 0x00, 0x66, 0x66, 0x02, 0x42, + 0x0f, 0x00, 0x00, 0x00, 0x9a, 0x99, 0x79, 0x41, 0x10, 0x00, 0x00, 0x00, + 0x9a, 0x99, 0xf9, 0x40, 0x11, 0x00, 0x00, 0x00, 0x9a, 0x99, 0x79, 0x40, + 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x13, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x3f, 0x14, 0x00, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x0e, + 0x0e, 0x00, 0x0f, 0x0e, 0x00, 0x0f, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x06, + 0x06, 0x00, 0xee, 0xee, 0x00, 0xff, 0xee, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, + 0x54, 0x78, 0x42, 0x42, 0x46, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, + 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x20, 0x4d, 0x41, 0x58, 0x20, + 0x63, 0x61, 0x70, 0x20, 0x77, 0x2f, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, + 0x6e, 0x63, 0x65, 0x20, 0x65, 0x72, 0x72, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x54, 0x78, 0x42, 0x42, 0x46, 0x3a, 0x20, 0x63, 0x68, 0x25, 0x64, 0x2c, + 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x20, 0x4d, 0x49, 0x4e, 0x20, + 0x63, 0x61, 0x70, 0x20, 0x65, 0x72, 0x72, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x21, 0x15, 0x11, 0x0e, 0x0d, 0x0c, 0x0b, 0x0b, 0x0a, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x00, 0x00, 0x00, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, + 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, + 0x77, 0x78, 0x79, 0x7a, 0x00, 0x00, 0x00, 0x00, 0xf3, 0x04, 0x35, 0x3f, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x4b, + 0x15, 0x02, 0x99, 0x3e, 0x11, 0xae, 0xcc, 0x3e, 0xc0, 0xaa, 0x2a, 0x3f, + 0x16, 0x72, 0x31, 0x3f, 0xe8, 0xe8, 0xfb, 0x33, 0x18, 0x72, 0x31, 0x3f, + 0xd8, 0x5b, 0xde, 0x3e, 0x28, 0x37, 0xa9, 0x32, 0xf4, 0x3e, 0xa1, 0x33, + 0xd9, 0x5b, 0xde, 0x3e, 0x98, 0x20, 0x9a, 0x3e, 0x3b, 0xaa, 0xb8, 0x3f, + 0x60, 0x70, 0xa5, 0x32, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x3f, + 0x3b, 0xaa, 0xb8, 0x3f, 0x00, 0x00, 0x80, 0x7f, 0x00, 0x60, 0x31, 0x3f, + 0xbf, 0xbf, 0x90, 0x39, 0x01, 0x00, 0x00, 0x33, 0x9e, 0xbf, 0xcc, 0x3d, + 0x13, 0x54, 0x08, 0x3c, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x80, 0x3f, + 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x3e, + 0x18, 0x72, 0x31, 0x3f, 0x02, 0x00, 0xca, 0x86, 0x00, 0x00, 0x2c, 0x86, + 0x7c, 0xb5, 0x00, 0x92, 0x0b, 0x46, 0x0e, 0x4d, 0x02, 0x46, 0x1c, 0x21, + 0x28, 0x46, 0xd0, 0xf7, 0xb2, 0xfa, 0x04, 0x00, 0x08, 0xd1, 0x00, 0x26, + 0xf0, 0xb2, 0x76, 0x1c, 0x29, 0x5c, 0xcc, 0xf7, 0xdb, 0xfa, 0xf0, 0xb2, + 0x04, 0x28, 0xf7, 0xdb, 0x20, 0x46, 0x76, 0xbd, 0x80, 0xb5, 0x00, 0x92, + 0x0b, 0x46, 0x02, 0x46, 0x1c, 0x21, 0x02, 0x48, 0xd0, 0xf7, 0x88, 0xfa, + 0x02, 0xbd, 0x00, 0x00, 0xf4, 0x8a, 0x00, 0x21, 0x43, 0x54, 0x4c, 0x45, + 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x6e, 0x65, 0x3a, + 0x25, 0x64, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x25, 0x64, 0x20, + 0x73, 0x70, 0x6f, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x25, 0x64, 0x2c, + 0x20, 0x73, 0x70, 0x6f, 0x5f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x25, + 0x64, 0x2c, 0x20, 0x45, 0x4f, 0x4d, 0x3a, 0x25, 0x64, 0x0a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb7, 0x1d, 0xc1, 0x04, 0x6e, 0x3b, 0x82, 0x09, + 0xd9, 0x26, 0x43, 0x0d, 0xdc, 0x76, 0x04, 0x13, 0x6b, 0x6b, 0xc5, 0x17, + 0xb2, 0x4d, 0x86, 0x1a, 0x05, 0x50, 0x47, 0x1e, 0xb8, 0xed, 0x08, 0x26, + 0x0f, 0xf0, 0xc9, 0x22, 0xd6, 0xd6, 0x8a, 0x2f, 0x61, 0xcb, 0x4b, 0x2b, + 0x64, 0x9b, 0x0c, 0x35, 0xd3, 0x86, 0xcd, 0x31, 0x0a, 0xa0, 0x8e, 0x3c, + 0xbd, 0xbd, 0x4f, 0x38, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 0x07, 0x60, + 0x00, 0x00, 0x16, 0x60, 0x00, 0x00, 0x17, 0x60, 0x00, 0x00, 0x26, 0x60, + 0x00, 0x00, 0x27, 0x60, 0x00, 0x00, 0x36, 0x60, 0x00, 0x00, 0x37, 0x60, + 0x00, 0x00, 0x46, 0x60, 0x00, 0x00, 0x47, 0x60, 0x00, 0x00, 0x56, 0x60, + 0x00, 0x00, 0x57, 0x60, 0x00, 0x00, 0x66, 0x60, 0x00, 0x00, 0x67, 0x60, + 0x00, 0x00, 0x76, 0x60, 0x00, 0x00, 0x77, 0x60, 0x00, 0x80, 0x84, 0x60, + 0x00, 0x00, 0x85, 0x60, 0x00, 0x80, 0x94, 0x60, 0x00, 0x00, 0x95, 0x60, + 0x00, 0x80, 0xa4, 0x60, 0x00, 0x00, 0xa5, 0x60, 0x00, 0x80, 0xb4, 0x60, + 0x00, 0x00, 0xb5, 0x60, 0x00, 0x80, 0xc4, 0x60, 0x00, 0x00, 0xc5, 0x60, + 0x00, 0x80, 0xd4, 0x60, 0x00, 0x00, 0xd5, 0x60, 0x00, 0x80, 0xe4, 0x60, + 0x00, 0x00, 0xe5, 0x60, 0x00, 0x80, 0xf4, 0x60, 0x00, 0x00, 0xf5, 0x60, + 0x00, 0x00, 0x0c, 0x60, 0x80, 0x00, 0x0c, 0x60, 0x00, 0x00, 0x1c, 0x60, + 0x80, 0x00, 0x1c, 0x60, 0x00, 0x00, 0x2c, 0x60, 0x80, 0x00, 0x2c, 0x60, + 0x00, 0x00, 0x3c, 0x60, 0x80, 0x00, 0x3c, 0x60, 0x00, 0x00, 0x4c, 0x60, + 0x80, 0x00, 0x4c, 0x60, 0x00, 0x00, 0x5c, 0x60, 0x80, 0x00, 0x5c, 0x60, + 0x00, 0x00, 0x6c, 0x60, 0x80, 0x00, 0x6c, 0x60, 0x00, 0x00, 0x7c, 0x60, + 0x80, 0x00, 0x7c, 0x60, 0x50, 0x89, 0x5d, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0x40, 0x62, 0x5d, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x30, 0x3b, 0x5d, 0x00, + 0xfe, 0x00, 0x00, 0x00, 0x40, 0x2d, 0x51, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x10, 0x83, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x04, 0x3f, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xb0, 0x63, 0x37, 0x00, 0x03, 0x00, 0x00, 0x00, + 0xd0, 0xed, 0x2d, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0xb5, 0xc5, 0xf7, + 0x58, 0xfa, 0x00, 0xb1, 0x02, 0x20, 0xbd, 0xe8, 0x02, 0x40, 0xd3, 0xf7, + 0xfc, 0xba, 0x80, 0xb5, 0xc5, 0xf7, 0x4f, 0xfa, 0xbd, 0xe8, 0x02, 0x40, + 0x00, 0x28, 0x0c, 0xbf, 0x01, 0x20, 0x03, 0x20, 0xd3, 0xf7, 0xf1, 0xba, + 0x80, 0xb5, 0xc5, 0xf7, 0x44, 0xfa, 0xbd, 0xe8, 0x02, 0x40, 0x00, 0x28, + 0x0c, 0xbf, 0x06, 0x20, 0x07, 0x20, 0xd3, 0xf7, 0xe6, 0xba, 0x00, 0x00, + 0x54, 0x65, 0x6d, 0x70, 0x20, 0x53, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x20, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x49, 0x6e, 0x69, 0x74, 0x2e, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x20, 0x43, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x25, 0x64, 0x20, 0x20, + 0x43, 0x50, 0x55, 0x20, 0x3d, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x00, 0x00, + 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x42, 0x69, 0x61, 0x73, 0x20, + 0x52, 0x42, 0x30, 0x2f, 0x52, 0x42, 0x31, 0x20, 0x50, 0x54, 0x41, 0x54, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x64, 0x6f, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x3a, 0x20, 0x30, 0x78, + 0x25, 0x58, 0x20, 0x30, 0x78, 0x25, 0x58, 0x2e, 0x0a, 0x00, 0x00, 0x00, + 0x50, 0x4c, 0x4c, 0x20, 0x25, 0x64, 0x2c, 0x20, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x3a, 0x20, 0x72, 0x65, 0x66, 0x43, 0x6c, 0x6b, 0x44, 0x69, 0x76, + 0x3a, 0x20, 0x25, 0x64, 0x20, 0x2d, 0x2d, 0x3e, 0x20, 0x72, 0x61, 0x74, + 0x65, 0x20, 0x3d, 0x20, 0x25, 0x64, 0x0a, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x6c, 0x9d, 0x04, 0x02, 0xe8, 0x6a, 0x01, 0x21, 0x08, 0x07, 0x00, 0x00, + 0x28, 0x6c, 0x02, 0x21, 0x90, 0x74, 0x02, 0x21, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x42, 0x46, 0x20, 0x63, 0x68, 0x25, 0x64, 0x3a, 0x20, 0x61, 0x74, + 0x74, 0x65, 0x6e, 0x20, 0x25, 0x66, 0x20, 0x65, 0x78, 0x63, 0x65, 0x65, + 0x64, 0x73, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x73, 0x0a, 0x00, 0x10, 0xb5, 0x07, 0x49, 0x79, 0x44, 0x18, 0x31, + 0x06, 0x4c, 0x7c, 0x44, 0x16, 0x34, 0x04, 0xe0, 0x0a, 0x68, 0x08, 0x1d, + 0x11, 0x44, 0x88, 0x47, 0x01, 0x46, 0xa1, 0x42, 0xf8, 0xd1, 0x10, 0xbd, + 0x28, 0x01, 0x00, 0x00, 0xac, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x1e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x53, 0x65, 0x72, 0x64, + 0x65, 0x73, 0x49, 0x6e, 0x69, 0x74, 0x5f, 0x43, 0x61, 0x6c, 0x3a, 0x20, + 0x6c, 0x61, 0x6e, 0x65, 0x25, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, + 0x30, 0x78, 0x25, 0x78, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x42, 0x0f, 0x00, 0xc0, 0xc6, 0x2d, 0x00, 0x01, 0x03, 0x05, 0x07, + 0x00, 0x00, 0x80, 0x3f, 0x6f, 0x12, 0x83, 0x3a, 0x6f, 0x12, 0x83, 0x3a, + 0x17, 0xb7, 0xd1, 0x38, 0x01, 0x00, 0x00, 0x00, 0x17, 0xb7, 0xd1, 0x38, + 0x0a, 0xd7, 0x23, 0x3c, 0xcd, 0xcc, 0xcc, 0x3d, 0x01, 0x03, 0x05, 0x07, + 0x00, 0x00, 0x80, 0x3f, 0x6f, 0x12, 0x83, 0x3a, 0x6f, 0x12, 0x83, 0x3a, + 0x17, 0xb7, 0xd1, 0x38, 0x01, 0x00, 0x00, 0x00, 0x17, 0xb7, 0xd1, 0x38, + 0x0a, 0xd7, 0x23, 0x3c, 0xcd, 0xcc, 0xcc, 0x3d, 0x01, 0x03, 0x05, 0x07, + 0x00, 0x00, 0x80, 0x3f, 0x6f, 0x12, 0x83, 0x3a, 0x6f, 0x12, 0x83, 0x3a, + 0x17, 0xb7, 0xd1, 0x38, 0x01, 0x00, 0x00, 0x00, 0x17, 0xb7, 0xd1, 0x38, + 0x0a, 0xd7, 0x23, 0x3c, 0xcd, 0xcc, 0xcc, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x4e, 0xf6, 0x88, 0x51, + 0xce, 0xf2, 0x00, 0x01, 0x08, 0x68, 0x40, 0xf4, 0x70, 0x00, 0x08, 0x60, + 0xbf, 0xf3, 0x4f, 0x8f, 0xbf, 0xf3, 0x6f, 0x8f, 0x4f, 0xf0, 0x00, 0x70, + 0xe1, 0xee, 0x10, 0x0a, 0x70, 0x47, 0x00, 0x00, 0xe1, 0x6e, 0xfb, 0xff, + 0x90, 0x01, 0x00, 0x00, 0xf8, 0xd7, 0x01, 0x21, 0xc0, 0x03, 0x00, 0x00, + 0x18, 0xd1, 0x01, 0x21, 0xb8, 0x0b, 0x00, 0x00, 0x88, 0xac, 0x01, 0x21, + 0x20, 0x03, 0x00, 0x00, 0xd8, 0xd4, 0x01, 0x21, 0x80, 0x09, 0x00, 0x00, + 0xe8, 0xc2, 0x01, 0x21, 0x20, 0x1c, 0x00, 0x00, 0xe8, 0x6a, 0x01, 0x21, + 0xc0, 0x44, 0x00, 0x00, 0x68, 0xe1, 0x00, 0x21, 0x40, 0x51, 0x00, 0x00, + 0x28, 0x90, 0x00, 0x21, 0xb0, 0x04, 0x00, 0x00, 0x68, 0xcc, 0x01, 0x21, + 0xc0, 0x12, 0x00, 0x00, 0x08, 0x87, 0x01, 0x21, 0xc0, 0x12, 0x00, 0x00, + 0xc8, 0x99, 0x01, 0x21, 0xc0, 0x44, 0x00, 0x00, 0x28, 0x26, 0x01, 0x21, + 0xa8, 0x0a, 0x00, 0x00, 0x40, 0xb8, 0x01, 0x21, 0xc8, 0x9c, 0x00, 0x00, + 0x88, 0xd9, 0x01, 0x21, 0x00, 0x00, 0x00, 0x00, 0x2d, 0xf7, 0xff, 0xff, + 0x78, 0x09, 0x00, 0x00, 0xd0, 0x1c, 0x00, 0x00, 0x20, 0x04, 0x00, 0x21, + 0x00, 0x00, 0x0d, 0x60, 0x00, 0x00, 0x1d, 0x60, 0x00, 0x00, 0x2d, 0x60, + 0x00, 0x00, 0x3d, 0x60, 0x00, 0x00, 0x4d, 0x60, 0x00, 0x00, 0x5d, 0x60, + 0x00, 0x00, 0x6d, 0x60, 0x00, 0x00, 0x7d, 0x60, 0x00, 0x64, 0x89, 0x60, + 0x00, 0x64, 0x99, 0x60, 0x00, 0x64, 0xa9, 0x60, 0x00, 0x64, 0xb9, 0x60, + 0x00, 0x64, 0xc9, 0x60, 0x00, 0x64, 0xd9, 0x60, 0x00, 0x64, 0xe9, 0x60, + 0x00, 0x64, 0xf9, 0x60, 0x00, 0x68, 0x89, 0x60, 0x00, 0x68, 0x99, 0x60, + 0x00, 0x68, 0xa9, 0x60, 0x00, 0x68, 0xb9, 0x60, 0x00, 0x68, 0xc9, 0x60, + 0x00, 0x68, 0xd9, 0x60, 0x00, 0x68, 0xe9, 0x60, 0x00, 0x68, 0xf9, 0x60, + 0x00, 0x00, 0x0b, 0x60, 0x00, 0x00, 0x1b, 0x60, 0x00, 0x00, 0x2b, 0x60, + 0x00, 0x00, 0x3b, 0x60, 0x00, 0x00, 0x4b, 0x60, 0x00, 0x00, 0x5b, 0x60, + 0x00, 0x00, 0x6b, 0x60, 0x00, 0x00, 0x7b, 0x60, 0x00, 0x00, 0x04, 0x60, + 0x00, 0x00, 0x14, 0x60, 0x00, 0x00, 0x24, 0x60, 0x00, 0x00, 0x34, 0x60, + 0x00, 0x00, 0x44, 0x60, 0x00, 0x00, 0x54, 0x60, 0x00, 0x00, 0x64, 0x60, + 0x00, 0x00, 0x74, 0x60, 0x00, 0x00, 0x03, 0x60, 0x00, 0x00, 0x13, 0x60, + 0x00, 0x00, 0x23, 0x60, 0x00, 0x00, 0x33, 0x60, 0x00, 0x00, 0x43, 0x60, + 0x00, 0x00, 0x53, 0x60, 0x00, 0x00, 0x63, 0x60, 0x00, 0x00, 0x73, 0x60, + 0x00, 0x00, 0x05, 0x60, 0x00, 0x00, 0x15, 0x60, 0x00, 0x00, 0x25, 0x60, + 0x00, 0x00, 0x35, 0x60, 0x00, 0x00, 0x45, 0x60, 0x00, 0x00, 0x55, 0x60, + 0x00, 0x00, 0x65, 0x60, 0x00, 0x00, 0x75, 0x60, 0x00, 0x0c, 0x0e, 0x60, + 0x00, 0x0c, 0x1e, 0x60, 0x00, 0x0c, 0x2e, 0x60, 0x00, 0x0c, 0x3e, 0x60, + 0x00, 0x0c, 0x4e, 0x60, 0x00, 0x0c, 0x5e, 0x60, 0x00, 0x0c, 0x6e, 0x60, + 0x00, 0x0c, 0x7e, 0x60, 0x00, 0x00, 0x0e, 0x60, 0x00, 0x00, 0x1e, 0x60, + 0x00, 0x00, 0x2e, 0x60, 0x00, 0x00, 0x3e, 0x60, 0x00, 0x00, 0x4e, 0x60, + 0x00, 0x00, 0x5e, 0x60, 0x00, 0x00, 0x6e, 0x60, 0x00, 0x00, 0x7e, 0x60, + 0x00, 0x0e, 0x0e, 0x60, 0x00, 0x0e, 0x1e, 0x60, 0x00, 0x0e, 0x2e, 0x60, + 0x00, 0x0e, 0x3e, 0x60, 0x00, 0x0e, 0x4e, 0x60, 0x00, 0x0e, 0x5e, 0x60, + 0x00, 0x0e, 0x6e, 0x60, 0x00, 0x0e, 0x7e, 0x60, 0x00, 0x30, 0x02, 0x60, + 0x00, 0x30, 0x12, 0x60, 0x00, 0x30, 0x22, 0x60, 0x00, 0x30, 0x32, 0x60, + 0x00, 0x30, 0x42, 0x60, 0x00, 0x30, 0x52, 0x60, 0x00, 0x30, 0x62, 0x60, + 0x00, 0x30, 0x72, 0x60, 0x00, 0x00, 0x0a, 0x60, 0x00, 0x00, 0x1a, 0x60, + 0x00, 0x00, 0x2a, 0x60, 0x00, 0x00, 0x3a, 0x60, 0x00, 0x00, 0x4a, 0x60, + 0x00, 0x00, 0x5a, 0x60, 0x00, 0x00, 0x6a, 0x60, 0x00, 0x00, 0x7a, 0x60, + 0x00, 0x00, 0x09, 0x60, 0x00, 0x00, 0x19, 0x60, 0x00, 0x00, 0x29, 0x60, + 0x00, 0x00, 0x39, 0x60, 0x00, 0x00, 0x49, 0x60, 0x00, 0x00, 0x59, 0x60, + 0x00, 0x00, 0x69, 0x60, 0x00, 0x00, 0x79, 0x60, 0x00, 0x00, 0x00, 0x4c, + 0x00, 0x00, 0x01, 0x4c, 0x00, 0x00, 0x02, 0x4c, 0x00, 0x00, 0x03, 0x4c, + 0x00, 0x00, 0x04, 0x4c, 0x00, 0x00, 0x05, 0x4c, 0x00, 0x00, 0x06, 0x4c, + 0x00, 0x00, 0x07, 0x4c, 0x00, 0x80, 0x00, 0x4c, 0x00, 0x80, 0x01, 0x4c, + 0x00, 0x80, 0x02, 0x4c, 0x00, 0x80, 0x03, 0x4c, 0x00, 0x80, 0x04, 0x4c, + 0x00, 0x80, 0x05, 0x4c, 0x00, 0x80, 0x06, 0x4c, 0x00, 0x80, 0x07, 0x4c, + 0x00, 0x40, 0x00, 0x4c, 0x00, 0x40, 0x01, 0x4c, 0x00, 0x40, 0x02, 0x4c, + 0x00, 0x40, 0x03, 0x4c, 0x00, 0x40, 0x04, 0x4c, 0x00, 0x40, 0x05, 0x4c, + 0x00, 0x40, 0x06, 0x4c, 0x00, 0x40, 0x07, 0x4c, 0x00, 0x50, 0x00, 0x4c, + 0x00, 0x50, 0x01, 0x4c, 0x00, 0x50, 0x02, 0x4c, 0x00, 0x50, 0x03, 0x4c, + 0x00, 0x50, 0x04, 0x4c, 0x00, 0x50, 0x05, 0x4c, 0x00, 0x50, 0x06, 0x4c, + 0x00, 0x50, 0x07, 0x4c, 0x00, 0x00, 0x83, 0x60, 0x00, 0x00, 0x93, 0x60, + 0x00, 0x00, 0xa3, 0x60, 0x00, 0x00, 0xb3, 0x60, 0x00, 0x00, 0xc3, 0x60, + 0x00, 0x00, 0xd3, 0x60, 0x00, 0x00, 0xe3, 0x60, 0x00, 0x00, 0xf3, 0x60, + 0x00, 0x0c, 0x8b, 0x60, 0x00, 0x0c, 0x9b, 0x60, 0x00, 0x0c, 0xab, 0x60, + 0x00, 0x0c, 0xbb, 0x60, 0x00, 0x0c, 0xcb, 0x60, 0x00, 0x0c, 0xdb, 0x60, + 0x00, 0x0c, 0xeb, 0x60, 0x00, 0x0c, 0xfb, 0x60, 0x00, 0x00, 0x8b, 0x60, + 0x00, 0x00, 0x9b, 0x60, 0x00, 0x00, 0xab, 0x60, 0x00, 0x00, 0xbb, 0x60, + 0x00, 0x00, 0xcb, 0x60, 0x00, 0x00, 0xdb, 0x60, 0x00, 0x00, 0xeb, 0x60, + 0x00, 0x00, 0xfb, 0x60, 0x00, 0x0e, 0x8b, 0x60, 0x00, 0x0e, 0x9b, 0x60, + 0x00, 0x0e, 0xab, 0x60, 0x00, 0x0e, 0xbb, 0x60, 0x00, 0x0e, 0xcb, 0x60, + 0x00, 0x0e, 0xdb, 0x60, 0x00, 0x0e, 0xeb, 0x60, 0x00, 0x0e, 0xfb, 0x60, + 0x00, 0x20, 0x81, 0x60, 0x00, 0x20, 0x91, 0x60, 0x00, 0x20, 0xa1, 0x60, + 0x00, 0x20, 0xb1, 0x60, 0x00, 0x20, 0xc1, 0x60, 0x00, 0x20, 0xd1, 0x60, + 0x00, 0x20, 0xe1, 0x60, 0x00, 0x20, 0xf1, 0x60, 0x00, 0x00, 0x81, 0x60, + 0x00, 0x00, 0x91, 0x60, 0x00, 0x00, 0xa1, 0x60, 0x00, 0x00, 0xb1, 0x60, + 0x00, 0x00, 0xc1, 0x60, 0x00, 0x00, 0xd1, 0x60, 0x00, 0x00, 0xe1, 0x60, + 0x00, 0x00, 0xf1, 0x60, 0x00, 0x80, 0x83, 0x60, 0x00, 0x80, 0x93, 0x60, + 0x00, 0x80, 0xa3, 0x60, 0x00, 0x80, 0xb3, 0x60, 0x00, 0x80, 0xc3, 0x60, + 0x00, 0x80, 0xd3, 0x60, 0x00, 0x80, 0xe3, 0x60, 0x00, 0x80, 0xf3, 0x60, + 0x00, 0x00, 0x84, 0x60, 0x00, 0x00, 0x94, 0x60, 0x00, 0x00, 0xa4, 0x60, + 0x00, 0x00, 0xb4, 0x60, 0x00, 0x00, 0xc4, 0x60, 0x00, 0x00, 0xd4, 0x60, + 0x00, 0x00, 0xe4, 0x60, 0x00, 0x00, 0xf4, 0x60, 0x00, 0x80, 0x85, 0x60, + 0x00, 0x80, 0x95, 0x60, 0x00, 0x80, 0xa5, 0x60, 0x00, 0x80, 0xb5, 0x60, + 0x00, 0x80, 0xc5, 0x60, 0x00, 0x80, 0xd5, 0x60, 0x00, 0x80, 0xe5, 0x60, + 0x00, 0x80, 0xf5, 0x60, 0x00, 0x40, 0x89, 0x60, 0x00, 0x40, 0x99, 0x60, + 0x00, 0x40, 0xa9, 0x60, 0x00, 0x40, 0xb9, 0x60, 0x00, 0x40, 0xc9, 0x60, + 0x00, 0x40, 0xd9, 0x60, 0x00, 0x40, 0xe9, 0x60, 0x00, 0x40, 0xf9, 0x60, + 0x00, 0x44, 0x89, 0x60, 0x00, 0x44, 0x99, 0x60, 0x00, 0x44, 0xa9, 0x60, + 0x00, 0x44, 0xb9, 0x60, 0x00, 0x44, 0xc9, 0x60, 0x00, 0x44, 0xd9, 0x60, + 0x00, 0x44, 0xe9, 0x60, 0x00, 0x44, 0xf9, 0x60, 0x00, 0x80, 0x87, 0x60, + 0x00, 0x80, 0x97, 0x60, 0x00, 0x80, 0xa7, 0x60, 0x00, 0x80, 0xb7, 0x60, + 0x00, 0x80, 0xc7, 0x60, 0x00, 0x80, 0xd7, 0x60, 0x00, 0x80, 0xe7, 0x60, + 0x00, 0x80, 0xf7, 0x60, 0x00, 0x00, 0x88, 0x60, 0x00, 0x00, 0x98, 0x60, + 0x00, 0x00, 0xa8, 0x60, 0x00, 0x00, 0xb8, 0x60, 0x00, 0x00, 0xc8, 0x60, + 0x00, 0x00, 0xd8, 0x60, 0x00, 0x00, 0xe8, 0x60, 0x00, 0x00, 0xf8, 0x60, + 0x00, 0x00, 0x86, 0x60, 0x00, 0x00, 0x96, 0x60, 0x00, 0x00, 0xa6, 0x60, + 0x00, 0x00, 0xb6, 0x60, 0x00, 0x00, 0xc6, 0x60, 0x00, 0x00, 0xd6, 0x60, + 0x00, 0x00, 0xe6, 0x60, 0x00, 0x00, 0xf6, 0x60, 0x00, 0x00, 0x87, 0x60, + 0x00, 0x00, 0x97, 0x60, 0x00, 0x00, 0xa7, 0x60, 0x00, 0x00, 0xb7, 0x60, + 0x00, 0x00, 0xc7, 0x60, 0x00, 0x00, 0xd7, 0x60, 0x00, 0x00, 0xe7, 0x60, + 0x00, 0x00, 0xf7, 0x60, 0x00, 0x20, 0x82, 0x60, 0x00, 0x20, 0x92, 0x60, + 0x00, 0x20, 0xa2, 0x60, 0x00, 0x20, 0xb2, 0x60, 0x00, 0x20, 0xc2, 0x60, + 0x00, 0x20, 0xd2, 0x60, 0x00, 0x20, 0xe2, 0x60, 0x00, 0x20, 0xf2, 0x60, + 0x00, 0x30, 0x82, 0x60, 0x00, 0x30, 0x92, 0x60, 0x00, 0x30, 0xa2, 0x60, + 0x00, 0x30, 0xb2, 0x60, 0x00, 0x30, 0xc2, 0x60, 0x00, 0x30, 0xd2, 0x60, + 0x00, 0x30, 0xe2, 0x60, 0x00, 0x30, 0xf2, 0x60, 0x00, 0x80, 0x88, 0x60, + 0x00, 0x80, 0x98, 0x60, 0x00, 0x80, 0xa8, 0x60, 0x00, 0x80, 0xb8, 0x60, + 0x00, 0x80, 0xc8, 0x60, 0x00, 0x80, 0xd8, 0x60, 0x00, 0x80, 0xe8, 0x60, + 0x00, 0x80, 0xf8, 0x60, 0x00, 0x00, 0x89, 0x60, 0x00, 0x00, 0x99, 0x60, + 0x00, 0x00, 0xa9, 0x60, 0x00, 0x00, 0xb9, 0x60, 0x00, 0x00, 0xc9, 0x60, + 0x00, 0x00, 0xd9, 0x60, 0x00, 0x00, 0xe9, 0x60, 0x00, 0x00, 0xf9, 0x60, + 0x00, 0x00, 0x07, 0x48, 0x00, 0x08, 0x07, 0x48, 0x00, 0x10, 0x07, 0x48, + 0x00, 0x18, 0x07, 0x48, 0x00, 0x20, 0x07, 0x48, 0x00, 0x28, 0x07, 0x48, + 0x00, 0x30, 0x07, 0x48, 0x00, 0x38, 0x07, 0x48, 0x00, 0x00, 0x08, 0x48, + 0x00, 0x08, 0x08, 0x48, 0x00, 0x10, 0x08, 0x48, 0x00, 0x18, 0x08, 0x48, + 0x00, 0x20, 0x08, 0x48, 0x00, 0x28, 0x08, 0x48, 0x00, 0x30, 0x08, 0x48, + 0x00, 0x38, 0x08, 0x48, 0x00, 0x00, 0x0d, 0x60, 0x00, 0x00, 0x1d, 0x60, + 0x00, 0x00, 0x2d, 0x60, 0x00, 0x00, 0x3d, 0x60, 0x00, 0x00, 0x4d, 0x60, + 0x00, 0x00, 0x5d, 0x60, 0x00, 0x00, 0x6d, 0x60, 0x00, 0x00, 0x7d, 0x60, + 0x00, 0x00, 0x8c, 0x60, 0x00, 0x00, 0x9c, 0x60, 0x00, 0x00, 0xac, 0x60, + 0x00, 0x00, 0xbc, 0x60, 0x00, 0x00, 0xcc, 0x60, 0x00, 0x00, 0xdc, 0x60, + 0x00, 0x00, 0xec, 0x60, 0x00, 0x00, 0xfc, 0x60, 0x00, 0x00, 0x8d, 0x60, + 0x00, 0x00, 0x9d, 0x60, 0x00, 0x00, 0xad, 0x60, 0x00, 0x00, 0xbd, 0x60, + 0x00, 0x00, 0xcd, 0x60, 0x00, 0x00, 0xdd, 0x60, 0x00, 0x00, 0xed, 0x60, + 0x00, 0x00, 0xfd, 0x60, 0x00, 0x00, 0x8e, 0x60, 0x00, 0x00, 0x9e, 0x60, + 0x00, 0x00, 0xae, 0x60, 0x00, 0x00, 0xbe, 0x60, 0x00, 0x00, 0xce, 0x60, + 0x00, 0x00, 0xde, 0x60, 0x00, 0x00, 0xee, 0x60, 0x00, 0x00, 0xfe, 0x60, + 0x01, 0x20, 0xc0, 0x46, 0x00, 0x28, 0x01, 0xd0, 0xff, 0xf7, 0x72, 0xfc, + 0xaf, 0xf3, 0x00, 0x80, 0x00, 0x20, 0xaf, 0xf3, 0x00, 0x80, 0xcf, 0xf7, + 0xbf, 0xfd, 0x00, 0xf0, 0x00, 0xf8, 0x00, 0xf0, 0x01, 0xb8, 0x00, 0x00, + 0x07, 0x46, 0x38, 0x46, 0xef, 0xf7, 0xf8, 0xfb, 0xfb, 0xe7, 0x38, 0xb5, + 0x04, 0x46, 0x0d, 0x46, 0x28, 0x46, 0xd5, 0xf7, 0xab, 0xfc, 0xa8, 0x42, + 0x18, 0xbf, 0x00, 0x24, 0x20, 0x46, 0x32, 0xbd, 0x52, 0x78, 0x51, 0x45, + 0x43, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x52, 0x78, 0x51, 0x45, 0x43, 0x20, 0x54, 0x69, + 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x31, 0x00, 0x00, 0x00, 0x00, + 0x52, 0x78, 0x51, 0x45, 0x43, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, + 0x49, 0x64, 0x78, 0x32, 0x00, 0x00, 0x00, 0x00, 0x52, 0x78, 0x51, 0x45, + 0x43, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x33, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x78, 0x4c, 0x4f, 0x4c, 0x20, 0x54, 0x69, + 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x54, 0x78, 0x4c, 0x4f, 0x4c, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, + 0x49, 0x64, 0x78, 0x31, 0x00, 0x00, 0x00, 0x00, 0x54, 0x78, 0x4c, 0x4f, + 0x4c, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x32, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x78, 0x4c, 0x4f, 0x4c, 0x20, 0x54, 0x69, + 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x33, 0x00, 0x00, 0x00, 0x00, + 0x54, 0x78, 0x51, 0x45, 0x43, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, + 0x49, 0x64, 0x78, 0x30, 0x00, 0x00, 0x00, 0x00, 0x54, 0x78, 0x51, 0x45, + 0x43, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x31, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x78, 0x51, 0x45, 0x43, 0x20, 0x54, 0x69, + 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x32, 0x00, 0x00, 0x00, 0x00, + 0x54, 0x78, 0x51, 0x45, 0x43, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, + 0x49, 0x64, 0x78, 0x33, 0x00, 0x00, 0x00, 0x00, 0x52, 0x78, 0x41, 0x64, + 0x63, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x52, 0x78, 0x41, 0x64, 0x63, 0x20, 0x54, 0x69, + 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x31, 0x00, 0x00, 0x00, 0x00, + 0x52, 0x78, 0x41, 0x64, 0x63, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, + 0x49, 0x64, 0x78, 0x32, 0x00, 0x00, 0x00, 0x00, 0x52, 0x78, 0x41, 0x64, + 0x63, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x33, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x78, 0x6c, 0x62, 0x41, 0x64, 0x63, 0x20, + 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x30, 0x00, 0x00, 0x00, + 0x54, 0x78, 0x6c, 0x62, 0x41, 0x64, 0x63, 0x20, 0x54, 0x69, 0x6d, 0x65, + 0x72, 0x20, 0x49, 0x64, 0x78, 0x30, 0x00, 0x00, 0x54, 0x78, 0x6c, 0x62, + 0x41, 0x64, 0x63, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, + 0x31, 0x00, 0x00, 0x00, 0x54, 0x78, 0x6c, 0x62, 0x41, 0x64, 0x63, 0x20, + 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x31, 0x00, 0x00, + 0x54, 0x78, 0x6c, 0x62, 0x41, 0x64, 0x63, 0x20, 0x54, 0x61, 0x73, 0x6b, + 0x20, 0x49, 0x64, 0x78, 0x32, 0x00, 0x00, 0x00, 0x54, 0x78, 0x6c, 0x62, + 0x41, 0x64, 0x63, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, + 0x78, 0x32, 0x00, 0x00, 0x54, 0x78, 0x6c, 0x62, 0x41, 0x64, 0x63, 0x20, + 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x33, 0x00, 0x00, 0x00, + 0x54, 0x78, 0x6c, 0x62, 0x41, 0x64, 0x63, 0x20, 0x54, 0x69, 0x6d, 0x65, + 0x72, 0x20, 0x49, 0x64, 0x78, 0x33, 0x00, 0x00, 0x4f, 0x72, 0x78, 0x41, + 0x64, 0x63, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x4f, 0x72, 0x78, 0x41, 0x64, 0x63, 0x20, 0x54, + 0x69, 0x6d, 0x65, 0x72, 0x20, 0x49, 0x64, 0x78, 0x30, 0x00, 0x00, 0x00, + 0x5b, 0x57, 0x20, 0x20, 0x25, 0x30, 0x32, 0x58, 0x20, 0x25, 0x58, 0x5d, + 0x20, 0x00, 0x00, 0x00, 0x5b, 0x49, 0x20, 0x20, 0x25, 0x30, 0x32, 0x58, + 0x20, 0x25, 0x58, 0x5d, 0x20, 0x00, 0x00, 0x00, 0x5b, 0x49, 0x32, 0x20, + 0x25, 0x30, 0x32, 0x58, 0x20, 0x25, 0x58, 0x5d, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x47, 0x00, 0x00, 0x40, 0x47, 0x00, 0x00, 0x09, 0x48, + 0x00, 0x00, 0x06, 0x48, 0x49, 0x6e, 0x69, 0x74, 0x20, 0x43, 0x61, 0x6c, + 0x20, 0x54, 0x61, 0x73, 0x6b, 0x00, 0x00, 0x00, 0x52, 0x78, 0x51, 0x45, + 0x43, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x30, 0x00, + 0x52, 0x78, 0x51, 0x45, 0x43, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, + 0x64, 0x78, 0x31, 0x00, 0x52, 0x78, 0x51, 0x45, 0x43, 0x20, 0x54, 0x61, + 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x32, 0x00, 0x52, 0x78, 0x51, 0x45, + 0x43, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x33, 0x00, + 0x54, 0x78, 0x4c, 0x4f, 0x4c, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, + 0x64, 0x78, 0x30, 0x00, 0x54, 0x78, 0x4c, 0x4f, 0x4c, 0x20, 0x54, 0x61, + 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x31, 0x00, 0x54, 0x78, 0x4c, 0x4f, + 0x4c, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x32, 0x00, + 0x54, 0x78, 0x4c, 0x4f, 0x4c, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, + 0x64, 0x78, 0x33, 0x00, 0x54, 0x78, 0x51, 0x45, 0x43, 0x20, 0x54, 0x61, + 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x30, 0x00, 0x54, 0x78, 0x51, 0x45, + 0x43, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x31, 0x00, + 0x54, 0x78, 0x51, 0x45, 0x43, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, + 0x64, 0x78, 0x32, 0x00, 0x54, 0x78, 0x51, 0x45, 0x43, 0x20, 0x54, 0x61, + 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x33, 0x00, 0x53, 0x65, 0x72, 0x64, + 0x65, 0x73, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x00, 0x00, 0x00, 0x00, + 0x52, 0x78, 0x41, 0x64, 0x63, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, + 0x64, 0x78, 0x30, 0x00, 0x52, 0x78, 0x41, 0x64, 0x63, 0x20, 0x54, 0x61, + 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x31, 0x00, 0x52, 0x78, 0x41, 0x64, + 0x63, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, 0x64, 0x78, 0x32, 0x00, + 0x52, 0x78, 0x41, 0x64, 0x63, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x49, + 0x64, 0x78, 0x33, 0x00, 0x00, 0x00, 0x03, 0x48, 0x00, 0x00, 0x04, 0x48, + 0x00, 0x00, 0x05, 0x48, 0x00, 0x00, 0x10, 0x41, 0x00, 0x00, 0x10, 0x44, + 0x00, 0x01, 0x81, 0x46, 0x53, 0x65, 0x72, 0x64, 0x65, 0x73, 0x20, 0x54, + 0x61, 0x73, 0x6b, 0x00, 0x80, 0xb5, 0x00, 0x20, 0xe2, 0xf7, 0x44, 0xfb, + 0xfe, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x07, 0x61, 0x00, 0x00, 0x17, 0x61, + 0x00, 0x80, 0x06, 0x61, 0x00, 0x80, 0x16, 0x61, 0x00, 0x00, 0x05, 0x61, + 0x00, 0x00, 0x15, 0x61, 0x00, 0x20, 0x02, 0x61, 0x00, 0x20, 0x12, 0x61, + 0x00, 0x30, 0x02, 0x61, 0x00, 0x30, 0x12, 0x61, 0x00, 0x80, 0x05, 0x61, + 0x00, 0x80, 0x15, 0x61, 0x00, 0xa4, 0x06, 0x61, 0x00, 0xa4, 0x16, 0x61, + 0x00, 0xa8, 0x06, 0x61, 0x00, 0xa8, 0x16, 0x61, 0x00, 0x84, 0x06, 0x61, + 0x00, 0x84, 0x16, 0x61, 0x00, 0x00, 0x01, 0x48, 0x00, 0x00, 0x02, 0x48, + 0xf2, 0x0e, 0x00, 0x01, 0xa0, 0x02, 0x6f, 0x12, 0x83, 0x3a, 0x24, 0xf1, + 0x03, 0x10, 0x21, 0x04, 0xa0, 0x02, 0x77, 0xcc, 0x2b, 0x32, 0x18, 0xf0, + 0x02, 0x03, 0x5f, 0x70, 0x89, 0x30, 0x28, 0xf0, 0x02, 0x0b, 0x00, 0x00, + 0x80, 0x3f, 0x74, 0xa0, 0x02, 0x0a, 0xd7, 0x23, 0x3c, 0x20, 0xa0, 0x02, + 0xbd, 0x37, 0x06, 0x36, 0x10, 0xf1, 0x0f, 0x68, 0xf1, 0x0f, 0x01, 0xe1, + 0x60, 0xf0, 0x02, 0x1b, 0x95, 0xbf, 0xd6, 0x34, 0x60, 0x10, 0x02, 0xff, + 0xe6, 0x5b, 0x2e, 0x10, 0x40, 0x07, 0x3f, 0x7f, 0xfb, 0xfc, 0x41, 0xdb, + 0xd1, 0x07, 0x33, 0xd4, 0x10, 0x0b, 0x20, 0x41, 0xac, 0xcb, 0xa5, 0x39, + 0x00, 0x6f, 0x01, 0x3d, 0x66, 0x66, 0x66, 0xe0, 0x43, 0x80, 0x3e, 0xe8, + 0x83, 0x20, 0x41, 0x3c, 0x63, 0x20, 0x41, 0x5c, 0x20, 0x01, 0x33, 0x33, + 0x73, 0x24, 0x30, 0x02, 0x3f, 0x3b, 0xdf, 0x7f, 0x08, 0x10, 0x02, 0x99, + 0xbb, 0x16, 0x3b, 0x04, 0x12, 0x3c, 0x9c, 0xa0, 0x03, 0x3d, 0x00, 0x40, + 0x1c, 0x46, 0x70, 0x13, 0x01, 0x01, 0x04, 0x46, 0x03, 0x40, 0x20, 0x0c, + 0xd0, 0x07, 0x00, 0x00, 0xcd, 0xcc, 0x4c, 0x3f, 0x88, 0x13, 0x00, 0x00, + 0x30, 0x75, 0x26, 0x23, 0x80, 0x3f, 0xd0, 0x21, 0x58, 0x10, 0x02, 0x3b, + 0x70, 0xce, 0x3b, 0x2b, 0x22, 0x00, 0x24, 0x30, 0x01, 0xa0, 0x86, 0x01, + 0x28, 0x10, 0x07, 0x52, 0xc6, 0xa9, 0x34, 0x17, 0xb7, 0xd1, 0x38, 0x64, + 0x18, 0x50, 0x03, 0x0a, 0x00, 0xe8, 0x03, 0x03, 0x48, 0x52, 0x01, 0x61, + 0x43, 0x01, 0xff, 0x30, 0x21, 0x2c, 0x12, 0x02, 0x14, 0x12, 0xe8, 0x20, + 0x21, 0x5c, 0x60, 0x02, 0x50, 0xc3, 0x00, 0x00, 0x2c, 0x11, 0xf2, 0x45, + 0xb0, 0x20, 0x01, 0xe1, 0xf5, 0x05, 0x18, 0x21, 0x78, 0x21, 0x30, 0x21, + 0xec, 0x21, 0x5c, 0x25, 0x04, 0x21, 0x04, 0x12, 0x0a, 0x25, 0x62, 0x64, + 0x58, 0x13, 0x03, 0x05, 0x56, 0x67, 0x80, 0x3f, 0xf4, 0x21, 0x28, 0x12, + 0x04, 0x1c, 0x21, 0x08, 0x21, 0xb0, 0x10, 0x03, 0xbd, 0x37, 0x86, 0x35, + 0xc8, 0x10, 0x12, 0x32, 0x7e, 0x20, 0x06, 0x19, 0x00, 0x04, 0x03, 0xac, + 0xc5, 0x27, 0x37, 0x3b, 0x21, 0x84, 0x25, 0x21, 0x22, 0xf4, 0xa1, 0x11, + 0x70, 0x20, 0x02, 0x80, 0x96, 0x18, 0x4b, 0x34, 0xa1, 0x04, 0x52, 0x05, + 0x64, 0x21, 0xac, 0x21, 0x68, 0x30, 0x15, 0x09, 0x0b, 0x0d, 0x0f, 0x20, + 0x0b, 0x20, 0x00, 0xa0, 0x25, 0x26, 0x00, 0x40, 0xe1, 0x33, 0x00, 0x80, + 0x58, 0x4f, 0x00, 0x00, 0x12, 0x7a, 0x26, 0xf0, 0x06, 0xff, 0x06, 0x05, + 0x04, 0x03, 0x02, 0x00, 0x05, 0x00, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, + 0x01, 0xf1, 0x13, 0x01, 0x1c, 0x04, 0x07, 0x01, 0x06, 0x02, 0x09, 0x08, + 0x21, 0x32, 0x1d, 0x1e, 0x32, 0x1c, 0x03, 0x01, 0x03, 0x08, 0x07, 0x06, + 0x29, 0x32, 0xfe, 0x02, 0x04, 0x2a, 0x32, 0x10, 0x08, 0x01, 0x01, 0x02, + 0x00, 0x06, 0x07, 0x10, 0x08, 0x03, 0x05, 0x09, 0x22, 0x07, 0x09, 0x50, + 0x06, 0x0e, 0x01, 0x00, 0x01, 0x07, 0x07, 0x04, 0x04, 0x09, 0x1e, 0x02, + 0x64, 0x32, 0x1d, 0xa5, 0x33, 0x31, 0x12, 0x41, 0x09, 0x62, 0x03, 0x09, + 0x71, 0x1b, 0x40, 0x04, 0x01, 0x04, 0x03, 0x01, 0x01, 0x03, 0x12, 0x41, + 0x09, 0x42, 0x01, 0x3f, 0x30, 0x02, 0x03, 0x07, 0x08, 0x06, 0x24, 0x50, + 0x02, 0x03, 0x07, 0x0a, 0x08, 0x09, 0x62, 0x05, 0x09, 0x33, 0x04, 0x08, + 0x2d, 0x11, 0x12, 0x52, 0x07, 0x09, 0x10, 0x02, 0x04, 0x07, 0x03, 0x08, + 0x1b, 0x50, 0x02, 0x01, 0x07, 0x0b, 0x08, 0x09, 0x62, 0x09, 0x09, 0x62, + 0x07, 0x09, 0x62, 0x05, 0x09, 0x11, 0x3f, 0x42, 0x04, 0x3f, 0x61, 0x09, + 0x42, 0x04, 0x1b, 0x60, 0x01, 0x00, 0x03, 0x10, 0x09, 0x62, 0x0f, 0x09, + 0x51, 0x51, 0x53, 0x00, 0x03, 0x51, 0x53, 0x00, 0x03, 0x51, 0x60, 0x01, + 0x00, 0x03, 0x06, 0x09, 0x11, 0x48, 0x2e, 0x06, 0x8b, 0x34, 0x63, 0x07, + 0x06, 0x09, 0x51, 0x6c, 0x63, 0x00, 0x00, 0x51, 0x63, 0x00, 0x0e, 0x09, + 0x61, 0x51, 0x62, 0x00, 0x51, 0x63, 0x00, 0x08, 0x09, 0x52, 0x07, 0x3f, + 0x63, 0x01, 0x08, 0x09, 0x71, 0x12, 0x61, 0x6c, 0x62, 0x00, 0x99, 0x53, + 0x00, 0x0d, 0x1b, 0x63, 0x00, 0x0a, 0x09, 0x62, 0x09, 0x09, 0x71, 0x51, + 0xa0, 0x04, 0x0c, 0x08, 0x03, 0x07, 0x01, 0x03, 0x2d, 0x62, 0x0c, 0x09, + 0x62, 0x0b, 0x1b, 0x62, 0x10, 0x09, 0x11, 0x5a, 0x42, 0x0a, 0x12, 0x12, + 0x04, 0x3f, 0xb1, 0x09, 0x63, 0x0b, 0x04, 0x1b, 0x60, 0x01, 0x06, 0x03, + 0x0f, 0x09, 0x42, 0x0e, 0x09, 0x62, 0x07, 0x1b, 0x62, 0x07, 0x5a, 0x62, + 0x07, 0x36, 0x52, 0x08, 0x09, 0x53, 0x06, 0x06, 0x24, 0x62, 0x0b, 0x2d, + 0x11, 0x1b, 0x62, 0x0c, 0x1b, 0x41, 0x48, 0x63, 0x06, 0x07, 0x09, 0x52, + 0x06, 0x1b, 0x62, 0x10, 0x12, 0x62, 0x0b, 0x99, 0x71, 0x48, 0x63, 0x10, + 0x08, 0x7e, 0x62, 0x06, 0xc6, 0x61, 0x09, 0x63, 0x06, 0x06, 0xbd, 0x71, + 0x09, 0x62, 0x07, 0x51, 0x71, 0xbd, 0x5a, 0x07, 0x64, 0x6a, 0x05, 0x64, + 0x6a, 0x08, 0x5b, 0x55, 0x68, 0x4a, 0x01, 0xd9, 0x39, 0xac, 0x61, 0x09, + 0x62, 0x04, 0x09, 0x62, 0x06, 0x09, 0x11, 0x36, 0x62, 0x07, 0x24, 0x62, + 0x07, 0x24, 0x62, 0x07, 0x24, 0x62, 0x07, 0x24, 0x62, 0x09, 0x24, 0x62, + 0x09, 0x24, 0x62, 0x09, 0x24, 0x62, 0x09, 0x24, 0x62, 0x0b, 0x24, 0x62, + 0x0b, 0x24, 0x62, 0x0b, 0x24, 0x62, 0x0b, 0x24, 0x62, 0x0d, 0x24, 0x62, + 0x0d, 0x24, 0x62, 0x0d, 0x24, 0x62, 0x0d, 0x24, 0x62, 0x0f, 0x24, 0x62, + 0x0f, 0x24, 0x62, 0x0f, 0x24, 0x62, 0x0f, 0x24, 0x57, 0x00, 0x00, 0x07, + 0x4d, 0x47, 0x03, 0x17, 0x00, 0x07, 0x19, 0x4d, 0x7d, 0x03, 0x4e, 0x10, + 0x7d, 0x03, 0x57, 0x00, 0x07, 0x22, 0x51, 0x12, 0x59, 0xc9, 0x25, 0x22, + 0x31, 0x1b, 0x4d, 0xbc, 0x03, 0x11, 0x1b, 0x62, 0x05, 0x48, 0x31, 0x09, + 0x9b, 0x07, 0x10, 0x54, 0x55, 0x7c, 0x41, 0xe3, 0x81, 0x09, 0x32, 0x03, + 0x09, 0x51, 0x1b, 0x1e, 0x00, 0x1a, 0x04, 0x2d, 0x62, 0x04, 0x40, 0x01, + 0x06, 0x1f, 0x0f, 0x01, 0x12, 0x0c, 0x08, 0x24, 0x0d, 0x06, 0x06, 0x05, + 0x05, 0x03, 0x03, 0x02, 0x02, 0x0c, 0x07, 0x07, 0x0f, 0x08, 0x07, 0x07, + 0x46, 0x11, 0x02, 0x31, 0x33, 0x31, 0x01, 0x12, 0xff, 0x01, 0x1c, 0x03, + 0x00, 0x05, 0x0c, 0x01, 0x98, 0x82, 0x37, 0x21, 0x5a, 0x43, 0xb8, 0x0b, + 0x1a, 0x1e, 0x01, 0x5a, 0x37, 0x13, 0xc4, 0x09, 0x0c, 0x2f, 0x0e, 0x27, + 0xea, 0x37, 0xf0, 0x01, 0x29, 0xc1, 0x07, 0x00, 0x01, 0x52, 0x68, 0x3c, + 0x12, 0xd4, 0x61, 0x12, 0x10, 0x04, 0x12, 0xa0, 0x04, 0x23, 0xe0, 0x0f, + 0x15, 0x2f, 0x0a, 0x01, 0x08, 0x38, 0x2d, 0xd4, 0x37, 0x33, 0x04, 0x01, + 0xd9, 0x71, 0x01, 0xf3, 0x79, 0x01, 0x00, 0x01, 0x12, 0xbc, 0x8c, 0x12, + 0x40, 0x04, 0x12, 0xf4, 0x04, 0x12, 0x08, 0x99, 0x16, 0x5c, 0x3e, 0x4f, + 0x58, 0x08, 0xc4, 0x38, 0x95, 0x34, 0xdf, 0x04, 0x01, 0x03, 0x38, 0xfd, + 0xd3, 0x12, 0x38, 0x65, 0xdc, 0x16, 0x30, 0x09, 0x12, 0x24, 0x0c, 0x12, + 0x78, 0x04, 0x1e, 0x4c, 0x61, 0x39, 0x1c, 0x05, 0x05, 0x04, 0x06, 0x05, + 0x08, 0x06, 0x09, 0x6f, 0x06, 0x1f, 0x06, 0x04, 0xc0, 0x05, 0x1f, 0x06, + 0x0a, 0x4c, 0x06, 0x10, 0x03, 0x06, 0x04, 0x08, 0x05, 0x09, 0x0a, 0x32, + 0x0c, 0x0a, 0x10, 0x07, 0x0a, 0x06, 0x0b, 0x07, 0x0d, 0x08, 0x07, 0x04, + 0x09, 0x0a, 0x10, 0x03, 0x0c, 0x07, 0x0e, 0x08, 0x08, 0x0a, 0x18, 0x01, + 0x0b, 0x06, 0x0d, 0xa7, 0x1c, 0x05, 0x08, 0x04, 0x0a, 0x05, 0x0c, 0x06, + 0x0e, 0x01, 0x03, 0xe5, 0x41, 0x28, 0x07, 0x80, 0x3f, 0x01, 0x02, 0x05, + 0x06, 0x00, 0x03, 0x04, 0x8f, 0xcf, 0x20, 0x00, 0x49, 0x07, 0xb2, 0x21, + 0x10, 0xa0, 0x02, 0x04, 0x00, 0x20, 0x20, 0x1f, 0xa0, 0x01, 0x04, 0x00, + 0x21, 0x10, 0x10, 0x02, 0xef, 0xbe, 0xad, 0xba, 0x04, 0x22, 0xde, 0x08, + 0x34, 0x01, 0x18, 0x00, 0x18, 0xc8, 0x6f, 0x5e, 0x01, 0xf0, 0x3a, 0xf1, + 0x1e, 0x01, 0x1f, 0x0f, 0x0f, 0xf2, 0x03, 0x3d, 0x4a, 0x03, 0x91, 0x01, + 0x4d, 0x80, 0x3c, 0x39, 0xe7, 0x60, 0x01, 0x00, 0x00, 0x43, 0x1a, 0x32, + 0x10, 0x09, 0x72, 0x01, 0x10, 0x32, 0x11, 0x09, 0x72, 0x02, 0x10, 0x32, + 0x12, 0x09, 0x72, 0x03, 0x10, 0x32, 0x13, 0x09, 0x72, 0x04, 0x10, 0x32, + 0x14, 0x09, 0x72, 0x05, 0x10, 0x32, 0x15, 0x09, 0x72, 0x06, 0x10, 0x32, + 0x16, 0x09, 0x72, 0x07, 0x10, 0x32, 0x17, 0x09, 0x72, 0x08, 0x10, 0x32, + 0x18, 0x09, 0x72, 0x09, 0x10, 0x32, 0x19, 0x09, 0x72, 0x0a, 0x10, 0x32, + 0x1a, 0x09, 0x72, 0x0b, 0x10, 0x32, 0x1b, 0x09, 0x72, 0x0c, 0x10, 0x32, + 0x1c, 0x09, 0x72, 0x0d, 0x10, 0x32, 0x1d, 0x09, 0x72, 0x0e, 0x10, 0x32, + 0x1e, 0x09, 0xf0, 0x01, 0x43, 0x0f, 0x43, 0x00, 0x01, 0x20, 0x04, 0x6c, + 0x6f, 0x67, 0x6c, 0x76, 0x6c, 0x5b, 0x12, 0x01, 0x0b, 0x37, 0x63, 0x70, + 0xac, 0x12, 0x02, 0x0b, 0x20, 0x01, 0x6f, 0x62, 0x6a, 0x0b, 0x10, 0x06, + 0x0c, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x10, 0x06, 0x0d, + 0x67, 0x70, 0x69, 0x6f, 0x63, 0x66, 0x67, 0x0b, 0x22, 0x0e, 0x0b, 0x23, + 0x74, 0x6f, 0x0b, 0x22, 0x0f, 0x0b, 0x3e, 0x72, 0x40, 0x3c, 0x22, 0x10, + 0x0b, 0x23, 0x77, 0x72, 0x0b, 0x30, 0x04, 0x1b, 0x64, 0x67, 0x62, 0x35, + 0x39, 0xb2, 0x12, 0x27, 0x4d, 0x20, 0x01, 0x74, 0x65, 0x73, 0x42, 0x12, + 0x41, 0x4d, 0x20, 0x01, 0x6d, 0x63, 0x73, 0x17, 0xf3, 0x0c, 0xff, 0x20, + 0xcf, 0x10, 0x03, 0xa4, 0x03, 0x00, 0x02, 0x38, 0x04, 0x10, 0x03, 0x2c, + 0x9d, 0x04, 0x02, 0x3c, 0x04, 0x12, 0x4c, 0x04, 0xf2, 0x52, 0x00, 0x01, + 0xfd, 0x68, 0x24, 0x05, 0xf0, 0x10, 0x14, 0x02, 0x01, 0x03, 0x04, 0x05, + 0x11, 0x06, 0x08, 0x09, 0x0e, 0x07, 0x0a, 0x0d, 0x0b, 0x12, 0x0c, 0x0f, + 0x10, 0x8a, 0x35, 0x46, 0xf1, 0x21, 0x05, 0x31, 0x5d, 0x22, 0x10, 0xee, + 0x2e, 0x10, 0xbb, 0x3d, 0xf0, 0x01, 0x28, 0x10, 0x00, 0x03, 0x4b, 0xf1, + 0x08, 0x05, 0x81, 0x01, 0xd1, 0x14, 0xf3, 0x0b, 0x20, 0x00, 0x01, 0x2e, + 0x12, 0x73, 0x04, 0x10, 0x02, 0x11, 0x00, 0x06, 0x01, 0x05, 0x2c, 0x02, + 0x0e, 0x02, 0x00, 0x30, 0x7f, 0x03, 0xfc, 0x0b, 0x05, 0x32, 0x00, 0x17, + 0x03, 0x00, 0x31, 0x00, 0x19, 0x04, 0x00, 0x31, 0x01, 0x01, 0x03, 0x06, + 0x31, 0x55, 0x1f, 0x30, 0x0c, 0x7c, 0x03, 0xa0, 0x01, 0x30, 0x0c, 0x1a, + 0x64, 0x1f, 0x10, 0x0c, 0x70, 0x03, 0x10, 0x02, 0x11, 0x01, 0x09, 0x06, + 0x05, 0x13, 0x11, 0x07, 0x41, 0x10, 0x05, 0x19, 0x08, 0x00, 0x31, 0x02, + 0x01, 0x09, 0x05, 0x13, 0x09, 0x0a, 0x05, 0x10, 0x0a, 0x11, 0x0b, 0x00, + 0x11, 0x02, 0x19, 0x0c, 0x00, 0x11, 0x03, 0x01, 0x0d, 0x05, 0x13, 0x09, + 0x0e, 0x05, 0x10, 0x0a, 0x11, 0x0f, 0x00, 0x39, 0x03, 0x19, 0x10, 0x00, + 0x31, 0x04, 0x01, 0x11, 0x05, 0x13, 0x09, 0x12, 0x05, 0x13, 0x11, 0x13, + 0x05, 0x10, 0x0f, 0x19, 0x14, 0x00, 0x39, 0x05, 0x01, 0x15, 0x00, 0x11, + 0x05, 0x09, 0x16, 0x00, 0x31, 0x05, 0x11, 0x17, 0x05, 0x10, 0x05, 0x19, + 0x18, 0x00, 0x31, 0x06, 0x01, 0x19, 0x05, 0x10, 0x05, 0x09, 0x1a, 0x00, + 0x11, 0x06, 0x11, 0x1b, 0x05, 0x10, 0x05, 0x19, 0x1c, 0x00, 0x32, 0x07, + 0x01, 0x1d, 0x05, 0x13, 0x03, 0x1e, 0x05, 0x13, 0x05, 0x1f, 0x05, 0x10, + 0x05, 0x07, 0x20, 0x00, 0x12, 0x07, 0x09, 0x21, 0x05, 0x13, 0x0b, 0x22, + 0x05, 0x10, 0x05, 0x0d, 0x23, 0x00, 0x31, 0x07, 0x0f, 0x24, 0x05, 0x13, + 0x17, 0x25, 0x05, 0x10, 0x05, 0x1f, 0x26, 0x00, 0x31, 0x08, 0x07, 0x27, + 0x05, 0x13, 0x0f, 0x28, 0x05, 0x13, 0x17, 0x29, 0x05, 0x10, 0x05, 0x1f, + 0x2a, 0x00, 0x31, 0x09, 0x07, 0x2b, 0x05, 0x13, 0x0f, 0x2c, 0x05, 0x13, + 0x17, 0x2d, 0x05, 0x10, 0x05, 0x1f, 0x2e, 0x00, 0x31, 0x0a, 0x07, 0x2f, + 0x05, 0x13, 0x0f, 0x30, 0x05, 0x13, 0x17, 0x31, 0x05, 0x10, 0x0a, 0x1f, + 0x32, 0x00, 0x31, 0x0b, 0x07, 0x33, 0x00, 0x32, 0x0b, 0x0f, 0x34, 0x05, + 0x13, 0x11, 0x35, 0x05, 0x13, 0x13, 0x36, 0x05, 0x13, 0x15, 0x37, 0x05, + 0x13, 0x17, 0x38, 0x05, 0x13, 0x19, 0x39, 0x05, 0x13, 0x1b, 0x3a, 0x05, + 0x14, 0x03, 0x1d, 0x3b, 0x00, 0x30, 0x0e, 0x1e, 0x1e, 0x30, 0x3f, 0x09, + 0x11, 0x05, 0x15, 0xfe, 0x17, 0x30, 0x0e, 0xfe, 0x17, 0x30, 0x0e, 0x77, + 0x17, 0x30, 0x0e, 0x5d, 0x20, 0x01, 0x30, 0x0e, 0x06, 0x05, 0x22, 0x07, + 0x05, 0x22, 0x08, 0x05, 0x22, 0x09, 0x05, 0x22, 0x0a, 0x05, 0x22, 0x0b, + 0x05, 0x22, 0x0c, 0x05, 0x22, 0x0d, 0x05, 0x11, 0x47, 0x1f, 0x30, 0x0e, + 0x8e, 0x05, 0x10, 0x02, 0x31, 0x0f, 0x00, 0x3c, 0x05, 0x10, 0x05, 0x08, + 0x3d, 0x00, 0x11, 0x0f, 0x10, 0x3e, 0x0a, 0x28, 0x02, 0x18, 0x3f, 0x00, + 0x10, 0x63, 0x2e, 0x30, 0x9b, 0x08, 0x13, 0x10, 0x10, 0x64, 0x10, 0x02, + 0x11, 0x0c, 0x09, 0x40, 0x05, 0x3e, 0x11, 0x55, 0x41, 0x1d, 0xd4, 0x05, + 0x37, 0x10, 0x27, 0xa1, 0x50, 0x02, 0x07, 0x05, 0x03, 0xff, 0x01, 0x52, + 0x02, 0x01, 0xf2, 0x68, 0x00, 0x01, 0x1e, 0xff, 0x06, 0x03, 0x2e, 0x04, + 0x0a, 0x03, 0x1d, 0x77, 0x08, 0x12, 0x04, 0x0a, 0x1e, 0x01, 0x95, 0x03, + 0x13, 0x00, 0x01, 0x04, 0x3d, 0x16, 0x04, 0x1e, 0x04, 0x45, 0x0e, 0x1c, + 0x01, 0x02, 0x00, 0x03, 0xe7, 0x09, 0x12, 0x01, 0x01, 0x1d, 0x9c, 0x0b, + 0x11, 0x05, 0x11, 0xad, 0x11, 0x20, 0x2d, 0xfd, 0x09, 0x1d, 0x91, 0x41, + 0xf3, 0x9f, 0x01, 0x00, 0x01, 0x46, 0x02, 0x88, 0x2c, 0x02, 0xff, 0xe6, + 0xdb, 0x2e, 0xa0, 0x41, 0x12, 0x80, 0xc1, 0x20, 0x02, 0x03, 0x03, 0x01, + 0x40, 0xc9, 0x4f, 0x40, 0x77, 0xa6, 0x06, 0x2d, 0x74, 0x07, 0x20, 0x06, + 0x52, 0x49, 0x1d, 0x39, 0x52, 0x49, 0x9d, 0x3b, 0x08, 0x14, 0x01, 0x00, + 0x00, 0xd8, 0xc3, 0x20, 0x08, 0x10, 0x41, 0x32, 0x1b, 0xd3, 0x2d, 0x1f, + 0x6f, 0x14, 0x31, 0x08, 0x20, 0x06, 0x84, 0x37, 0x68, 0x2c, 0x3a, 0x9f, + 0x82, 0x2f, 0x08, 0x20, 0x01, 0x32, 0x1b, 0x53, 0x04, 0x22, 0x2f, 0x08, + 0x1c, 0x01, 0x00, 0x48, 0xf3, 0x10, 0x43, 0x23, 0x7c, 0x42, 0x49, 0x20, + 0x06, 0x82, 0xa8, 0xfb, 0x36, 0x82, 0xa8, 0x7b, 0x3a, 0x08, 0x1c, 0x06, + 0x1f, 0x6a, 0xc0, 0x2f, 0x93, 0xa4, 0x00, 0x2f, 0x90, 0x43, 0xc0, 0x03, + 0x2f, 0x9b, 0x33, 0xfc, 0x27, 0x60, 0x21, 0x01, 0x23, 0x80, 0x3f, 0x40, + 0x30, 0x01, 0xc5, 0xce, 0x4f, 0x48, 0x10, 0x02, 0x8e, 0xe2, 0xa8, 0x2a, + 0x04, 0x52, 0x2d, 0x08, 0x71, 0x0c, 0xf0, 0x02, 0x03, 0x00, 0x50, 0x43, + 0x47, 0x60, 0x30, 0x09, 0xff, 0xeb, 0x2f, 0x2d, 0xbf, 0xef, 0x0e, 0x2f, + 0x8f, 0x23, 0x7a, 0x60, 0x1d, 0x16, 0x43, 0x42, 0x41, 0x04, 0x1d, 0xd6, + 0x07, 0x11, 0x05, 0x58, 0x01, 0x27, 0xc8, 0x01, 0x66, 0x13, 0x70, 0x44, + 0x6c, 0x22, 0x41, 0x0d, 0xc1, 0x18, 0x43, 0x50, 0x44, 0x04, 0x81, 0x18, + 0x45, 0xdd, 0x12, 0x70, 0x44, 0xa3, 0x80, 0x44, 0x30, 0x55, 0xf5, 0x16, + 0xa8, 0x14, 0xf3, 0x00, 0xa8, 0x8a, 0x48, 0x12, 0x20, 0x18, 0xb2, 0x30, + 0x18, 0x51, 0x30, 0x12, 0xa4, 0x30, 0xf2, 0x02, 0xa4, 0x30, 0x11, 0x18, + 0xf3, 0x02, 0x30, 0xa4, 0x30, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0x8c, 0x01, 0x4e, 0xd0, 0x9a, 0x10, 0x6d, 0x34, 0x0a, 0x3d, 0xdc, 0x4a, + 0x40, 0x04, 0x39, 0x8e, 0xe3, 0x3d, 0x20, 0x00, 0x1c, 0x2d, 0xbc, 0x08, + 0x2d, 0x54, 0x4a, 0x4c, 0x03, 0xe4, 0x83, 0xfe, 0x3f, 0x5a, 0x02, 0x4c, + 0x2d, 0x28, 0x10, 0x1e, 0xbf, 0xac, 0x07, 0x2f, 0x3c, 0x0a, 0xbe, 0x09, + 0xfe, 0xff, 0x01, 0x46, 0x07, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xe1, 0x01, 0x3c, 0x01, 0x30, 0x2b, 0x36, 0xeb, 0x0d, 0x30, 0x01, 0x80, + 0xb9, 0x2a, 0x08, 0x1f, 0xcc, 0x62, 0xe8, 0x0d, 0x33, 0x04, 0x02, 0x10, + 0x1d, 0x9a, 0x0e, 0x30, 0x02, 0x00, 0x98, 0x15, 0x1b, 0x10, 0x21, 0x18, + 0x30, 0x05, 0x02, 0x04, 0x04, 0x00, 0xcc, 0x8a, 0x0d, 0x08, 0x12, 0xaa, + 0x01, 0x12, 0x19, 0x01, 0x4c, 0x04, 0x00, 0x3f, 0x03, 0x2c, 0x1d, 0x04, + 0x00, 0x4f, 0x1c, 0x03, 0x80, 0x4a, 0x5d, 0x05, 0x2c, 0x72, 0x04, 0x52, + 0x03, 0x04, 0x52, 0x10, 0x04, 0x3c, 0x01, 0x01, 0x20, 0x1d, 0x98, 0x10, + 0x2d, 0x83, 0x15, 0x4f, 0xa0, 0x0f, 0x56, 0x0e, 0xaf, 0x0f, 0x09, 0x9b, + 0x04, 0xcf, 0x80, 0x3f, 0x64, 0x51, 0x61, 0x0c, 0x2d, 0x2c, 0x50, 0x2f, + 0xa3, 0x3b, 0x50, 0x51, 0x1d, 0xf4, 0x50, 0x2e, 0x33, 0xd8, 0x50, 0x61, + 0x10, 0x11, 0x04, 0x22, 0x35, 0x10, 0x2d, 0x98, 0x4f, 0x2d, 0xf8, 0x0c, + 0x2d, 0x50, 0x50, 0x20, 0x06, 0x13, 0x2e, 0xe1, 0x29, 0x17, 0xb7, 0x51, + 0x38, 0x10, 0x21, 0x30, 0x21, 0x10, 0x2d, 0x34, 0x05, 0x20, 0x02, 0xcd, + 0xcc, 0xcc, 0x3d, 0x4c, 0x11, 0x1c, 0x1c, 0x03, 0x39, 0x42, 0x60, 0xe5, + 0x3b, 0x0c, 0x50, 0x22, 0x3d, 0x14, 0x11, 0x04, 0x30, 0x02, 0x3e, 0x33, + 0x33, 0x33, 0x7c, 0x21, 0x54, 0x41, 0x50, 0x41, 0x08, 0x2d, 0xa4, 0x0d, + 0x11, 0xae, 0x22, 0x41, 0x28, 0x2d, 0x00, 0x50, 0x3c, 0x01, 0x5c, 0x8f, + 0x82, 0xb8, 0x50, 0x2d, 0x2c, 0x51, 0x21, 0x04, 0x41, 0x44, 0x52, 0x4c, + 0xa8, 0x1f, 0xc8, 0x42, 0x8c, 0x05, 0x5e, 0x39, 0x68, 0x52, 0x20, 0x03, + 0x3f, 0xf9, 0x83, 0x01, 0x3d, 0x04, 0x2d, 0xcc, 0x50, 0x2d, 0x80, 0x50, + 0x4f, 0xa8, 0x61, 0x9c, 0x05, 0x2d, 0xa0, 0x50, 0x21, 0x14, 0x43, 0x05, + 0x00, 0x14, 0x3e, 0x58, 0xfe, 0x0c, 0x30, 0x07, 0x80, 0x3f, 0xec, 0x51, + 0xb8, 0x3e, 0xfe, 0xd4, 0x78, 0x88, 0x60, 0x02, 0x32, 0x00, 0xc8, 0x00, + 0x28, 0x12, 0xb4, 0x1f, 0x2c, 0x02, 0x58, 0xca, 0x7e, 0x40, 0xb8, 0x50, + 0x1f, 0xcd, 0xac, 0xac, 0x51, 0x3f, 0x00, 0xc0, 0xa8, 0x51, 0x10, 0x09, + 0x3d, 0x0a, 0x57, 0x3f, 0x85, 0xeb, 0x51, 0x3f, 0xf6, 0x28, 0x5c, 0x88, + 0x2c, 0x03, 0xcc, 0x3d, 0x9a, 0x99, 0x19, 0xbc, 0x51, 0x11, 0x04, 0x32, + 0xa0, 0x9c, 0x21, 0x88, 0x21, 0xac, 0x25, 0x68, 0x21, 0x63, 0x2d, 0xb8, + 0x50, 0x2d, 0x18, 0x19, 0x2d, 0x90, 0x16, 0x60, 0x03, 0x40, 0x42, 0x0f, + 0x00, 0x32, 0x14, 0x11, 0x24, 0x1c, 0x02, 0x55, 0x55, 0xd5, 0xb9, 0x46, + 0x0e, 0x1d, 0x64, 0x15, 0x52, 0x96, 0x04, 0x4c, 0x0a, 0xc8, 0x43, 0x6b, + 0x3c, 0x01, 0x14, 0x14, 0x0a, 0xa0, 0xa0, 0xac, 0x0d, 0x68, 0x06, 0x21, + 0x30, 0x4e, 0x04, 0xfe, 0x0f, 0x1d, 0xb5, 0x15, 0x2e, 0x4e, 0x45, 0x11, + 0x6e, 0x00, 0xbe, 0x10, 0x16, 0x08, 0xce, 0x32, 0x03, 0x66, 0x3d, 0xdf, + 0x10, 0x1c, 0x04, 0x00, 0x06, 0x4b, 0xe9, 0x03, 0xa4, 0xc4, 0x13, 0x20, + 0x02, 0x0f, 0x0f, 0xd3, 0xd3, 0x76, 0x2d, 0x2f, 0x10, 0x33, 0x23, 0x01, + 0x70, 0x12, 0x10, 0x45, 0x1c, 0x0b, 0x04, 0xa0, 0xf0, 0xf4, 0x01, 0x04, + 0x04, 0x02, 0x3f, 0x03, 0x44, 0x14, 0x13, 0x67, 0x1a, 0x5e, 0x50, 0xc5, + 0x16, 0x1f, 0x00, 0x20, 0x4f, 0x10, 0x1a, 0x02, 0x48, 0x10, 0x03, 0x47, + 0x80, 0xd0, 0x42, 0x05, 0x2e, 0x10, 0x03, 0xc8, 0x00, 0x28, 0x0f, 0x0a, + 0x40, 0x42, 0x06, 0xbc, 0x4e, 0x0a, 0xa8, 0x51, 0x3c, 0x08, 0x3c, 0x03, + 0x19, 0x80, 0xb0, 0xaa, 0x00, 0x52, 0x00, 0x8a, 0x20, 0x52, 0x4c, 0x03, + 0x06, 0x19, 0xf3, 0x4e, 0x6a, 0x80, 0x10, 0x5d, 0xc8, 0x51, 0xf3, 0x07, + 0x7d, 0x00, 0x01, 0xfd, 0x1f, 0x0b, 0x07, 0xfe, 0x15, 0x01, 0x91, 0x11, + 0xde, 0x01, 0x58, 0x18, 0x1d, 0x4c, 0x10, 0x14, 0x06, 0x02, 0x0a, 0x32, + 0x32, 0x04, 0x5c, 0x8f, 0x42, 0xac, 0x10, 0x02, 0xff, 0xff, 0x04, 0x02, + 0xc6, 0x1d, 0x30, 0x18, 0x11, 0xdb, 0x1c, 0x01, 0x19, 0x19, 0x09, 0x4b, + 0x03, 0x1d, 0xdc, 0x17, 0x2c, 0x01, 0x00, 0x01, 0x40, 0x04, 0x1a, 0x13, + 0x0f, 0x64, 0xb6, 0x2c, 0x08, 0x01, 0x14, 0x0f, 0x3f, 0x06, 0x14, 0x00, + 0x05, 0x06, 0x0a, 0xca, 0x07, 0x44, 0x03, 0x06, 0x00, 0x01, 0x19, 0x04, + 0x37, 0x4c, 0x03, 0x00, 0x01, 0x23, 0x26, 0x00, 0x48, 0x03, 0x63, 0x0a, + 0x00, 0xbf, 0x1c, 0x03, 0x3f, 0x04, 0x05, 0x34, 0x3a, 0x6a, 0x1d, 0x1b, + 0x27, 0x32, 0x7c, 0x13, 0x3e, 0x64, 0x19, 0x40, 0x06, 0x07, 0x01, 0xd8, + 0x46, 0x10, 0x0f, 0x00, 0x04, 0x87, 0x12, 0x10, 0x72, 0xfc, 0x01, 0xff, + 0x07, 0x01, 0x05, 0xf7, 0x07, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, + 0xff, 0x01, 0xf1, 0xff, 0x01, 0xf1, 0xf2, 0x01, 0x2d, 0xd3, 0x30, 0x2d, + 0x0c, 0x32, 0x9e, 0x59, 0xdb, 0x30, 0x21, 0x10, 0x52, 0x5a, 0x10, 0x61, + 0x20, 0xd2, 0x61, 0x10, 0x92, 0x62, 0x10, 0x2d, 0x78, 0x33, 0xd2, 0x69, + 0x20, 0xd2, 0x6a, 0x10, 0xd2, 0x03, 0x10, 0xd2, 0x04, 0x10, 0xd2, 0x05, + 0x10, 0xd2, 0x06, 0x10, 0xd2, 0x07, 0x10, 0xd2, 0x08, 0x10, 0xd2, 0x09, + 0x10, 0x62, 0x0a, 0x10, 0x11, 0x01, 0x30, 0x01, 0x20, 0xaa, 0x44, 0x80, + 0x30, 0x01, 0x80, 0x8d, 0x5b, 0x04, 0x60, 0x02, 0x60, 0x56, 0x6c, 0x00, + 0x01, 0x33, 0x04, 0x03, 0x01, 0x31, 0x10, 0x83, 0x01, 0x00, 0x04, 0x2d, + 0x1c, 0x3a, 0x2d, 0x3c, 0x4c, 0x2d, 0xcc, 0x49, 0x2d, 0xe0, 0x49, 0x12, + 0x02, 0x23, 0xde, 0x78, 0x2a, 0x46, 0x21, 0x36, 0x3c, 0x06, 0xb4, 0xa2, + 0x04, 0x38, 0x00, 0x00, 0x48, 0x43, 0xa8, 0x84, 0x40, 0x09, 0x35, 0xa3, + 0x30, 0x00, 0x1f, 0x8f, 0x2c, 0x00, 0x12, 0x64, 0x2c, 0x2a, 0x12, 0x92, + 0x3f, 0x4e, 0x42, 0xad, 0x35, 0x31, 0x56, 0x11, 0x8f, 0x43, 0x60, 0xea, + 0xed, 0x2c, 0x08, 0x40, 0x4b, 0x4c, 0x00, 0x18, 0xfc, 0xff, 0xff, 0x0c, + 0xfe, 0xb9, 0x32, 0x5d, 0xea, 0x33, 0xbd, 0x1e, 0x33, 0x5d, 0x66, 0x3a, + 0x52, 0x02, 0x3b, 0xf0, 0x01, 0xff, 0x00, 0x04, 0x00, 0x01, 0xf1, 0x8e, + 0x01, 0x55, 0xc1, 0x1d, 0x03, 0x45, 0x3a, 0x00, 0xb1, 0x2d, 0xf4, 0x35, + 0x2d, 0xb0, 0x37, 0x32, 0x80, 0x17, 0x2f, 0x60, 0x42, 0x28, 0x45, 0xf5, + 0x0d, 0xd4, 0x83, 0x80, 0xbf, 0x20, 0x8d, 0xbc, 0x37, 0x81, 0x08, 0xf3, + 0x0b, 0x80, 0xbf, 0x40, 0x5d, 0x8c, 0x37, 0x6e, 0x3d, 0x30, 0x87, 0x2d, + 0xcc, 0x37, 0x21, 0x04, 0x20, 0x02, 0x65, 0x4a, 0xf6, 0x2c, 0x04, 0x20, + 0x02, 0x95, 0x95, 0xe6, 0x25, 0x04, 0x20, 0x02, 0xaa, 0x77, 0x38, 0x24, + 0x04, 0x11, 0x9e, 0x42, 0x41, 0x04, 0x33, 0x7a, 0x44, 0x04, 0x2d, 0x80, + 0x88, 0x11, 0x04, 0x2d, 0x0c, 0x38, 0x6d, 0xfc, 0x36, 0x21, 0x48, 0x8c, + 0x05, 0xdc, 0x24, 0xb4, 0x29, 0xcd, 0xcc, 0x8c, 0x58, 0x38, 0x70, 0x01, + 0x24, 0x74, 0x49, 0x04, 0xf1, 0x08, 0x01, 0x4d, 0x8c, 0x38, 0x6d, 0x08, + 0x88, 0x20, 0x02, 0x5f, 0x70, 0x09, 0x31, 0x04, 0x61, 0x8c, 0x11, 0x80, + 0x22, 0x23, 0x04, 0x20, 0x02, 0x4a, 0x1e, 0xec, 0x1f, 0x04, 0x61, 0x30, + 0x2d, 0x04, 0x38, 0x41, 0x04, 0x41, 0x94, 0x6d, 0x38, 0x8a, 0x2d, 0x20, + 0x89, 0x21, 0x98, 0x40, 0x02, 0x8c, 0x05, 0xb2, 0x2a, 0x8c, 0x23, 0x48, + 0x42, 0xec, 0x1c, 0x01, 0x20, 0x63, 0x4a, 0x03, 0x36, 0x4f, 0x80, 0x41, + 0x54, 0x38, 0x2c, 0x04, 0xa6, 0x3f, 0x93, 0x1a, 0x5a, 0x37, 0x44, 0x38, + 0x11, 0x98, 0x3d, 0x74, 0x89, 0x2c, 0x06, 0x68, 0x52, 0x84, 0x38, 0x8f, + 0xc2, 0x75, 0x3f, 0xd8, 0x03, 0x2d, 0x1a, 0x36, 0x2d, 0x94, 0x38, 0x50, + 0x02, 0xf7, 0xe4, 0xa1, 0x3e, 0x38, 0x22, 0x3f, 0x24, 0x2d, 0x69, 0x03, + 0x2d, 0xdc, 0x03, 0x47, 0xf4, 0x01, 0xb4, 0x20, 0x02, 0xb4, 0x62, 0x5b, + 0x2f, 0x18, 0x21, 0x30, 0x3d, 0x6c, 0x88, 0x1c, 0x04, 0x07, 0x04, 0x02, + 0xef, 0x38, 0x35, 0x24, 0x38, 0x3f, 0xb4, 0x3f, 0x68, 0x04, 0x1d, 0xa0, + 0x88, 0x2c, 0x02, 0x00, 0xa4, 0x93, 0xd6, 0xbc, 0x37, 0x60, 0x06, 0xc0, + 0xe1, 0xe4, 0x00, 0x80, 0xd1, 0xf0, 0x08, 0x20, 0x61, 0x08, 0x61, 0x50, + 0x2d, 0x58, 0x04, 0x30, 0x01, 0x05, 0x01, 0x14, 0x0c, 0x2d, 0x07, 0x04, + 0x43, 0x32, 0x00, 0x08, 0xaf, 0x01, 0x00, 0x8c, 0x50, 0xbd, 0xb8, 0x39, + 0x85, 0x68, 0x41, 0x14, 0x91, 0x10, 0x93, 0x00, 0xbf, 0x28, 0x11, 0x01, + 0xb9, 0x1c, 0xd1, 0x18, 0x3e, 0x0f, 0xe7, 0x4e, 0x2d, 0x00, 0x05, 0x21, + 0xd4, 0x21, 0x88, 0x21, 0x04, 0x52, 0x64, 0x78, 0x31, 0x84, 0x1e, 0x01, + 0x47, 0x37, 0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd7, 0xb4, 0xb9, 0xc3 +}; +unsigned int ADRV9040_FW_bin_len = 655372; + +#endif + diff --git a/projects/adrv904x/src/common/firmware/ActiveUseCase_profile.h b/projects/adrv904x/src/common/firmware/ActiveUseCase_profile.h new file mode 100644 index 00000000000..44587e80fc0 --- /dev/null +++ b/projects/adrv904x/src/common/firmware/ActiveUseCase_profile.h @@ -0,0 +1,3029 @@ +const char *json_profile_active_use_case = "{ \n\ + \"dataInterface\": { \n\ + \"framer\": [ \n\ + { \n\ + \"serializerLaneCrossbar\": { \n\ + \"lane0FramerOutSel\": 0, \n\ + \"lane1FramerOutSel\": 1, \n\ + \"lane2FramerOutSel\": 2, \n\ + \"lane3FramerOutSel\": 3 \n\ + }, \n\ + \"adcCrossbar\": { \n\ + \"conv0\": 1, \n\ + \"conv1\": 0, \n\ + \"conv2\": 3, \n\ + \"conv3\": 2, \n\ + \"conv4\": 5, \n\ + \"conv5\": 4, \n\ + \"conv6\": 7, \n\ + \"conv7\": 6, \n\ + \"conv8\": 127, \n\ + \"conv9\": 127, \n\ + \"conv10\": 127, \n\ + \"conv11\": 127, \n\ + \"conv12\": 127, \n\ + \"conv13\": 127, \n\ + \"conv14\": 127, \n\ + \"conv15\": 127, \n\ + \"conv16\": 127, \n\ + \"conv17\": 127, \n\ + \"conv18\": 127, \n\ + \"conv19\": 127, \n\ + \"conv20\": 127, \n\ + \"conv21\": 127, \n\ + \"conv22\": 127, \n\ + \"conv23\": 127 \n\ + }, \n\ + \"enableJesd204C\": 0, \n\ + \"bankId\": 0, \n\ + \"deviceId\": 1, \n\ + \"lane0Id\": 0, \n\ + \"jesd204M\": 8, \n\ + \"jesd204K\": 32, \n\ + \"jesd204F\": 4, \n\ + \"jesd204Np\": 16, \n\ + \"jesd204E\": 0, \n\ + \"scramble\": 1, \n\ + \"serializerLanesEnabled\": 15, \n\ + \"lmfcOffset\": 0, \n\ + \"syncbInSelect\": 0, \n\ + \"overSample\": 0, \n\ + \"syncbInLvdsMode\": 1, \n\ + \"syncbInLvdsPnInvert\": 0, \n\ + \"newSysrefOnRelink\": 0, \n\ + \"sysrefForStartup\": 0, \n\ + \"sysrefNShotEnable\": 0, \n\ + \"sysrefNShotCount\": 0, \n\ + \"sysrefIgnoreWhenLinked\": 0 \n\ + }, \n\ + { \n\ + \"serializerLaneCrossbar\": { \n\ + \"lane0FramerOutSel\": 0, \n\ + \"lane1FramerOutSel\": 0, \n\ + \"lane2FramerOutSel\": 0, \n\ + \"lane3FramerOutSel\": 0 \n\ + }, \n\ + \"adcCrossbar\": { \n\ + \"conv0\": 127, \n\ + \"conv1\": 127, \n\ + \"conv2\": 127, \n\ + \"conv3\": 127, \n\ + \"conv4\": 127, \n\ + \"conv5\": 127, \n\ + \"conv6\": 127, \n\ + \"conv7\": 127, \n\ + \"conv8\": 127, \n\ + \"conv9\": 127, \n\ + \"conv10\": 127, \n\ + \"conv11\": 127, \n\ + \"conv12\": 127, \n\ + \"conv13\": 127, \n\ + \"conv14\": 127, \n\ + \"conv15\": 127, \n\ + \"conv16\": 127, \n\ + \"conv17\": 127, \n\ + \"conv18\": 127, \n\ + \"conv19\": 127, \n\ + \"conv20\": 127, \n\ + \"conv21\": 127, \n\ + \"conv22\": 127, \n\ + \"conv23\": 127 \n\ + }, \n\ + \"enableJesd204C\": 0, \n\ + \"bankId\": 0, \n\ + \"deviceId\": 0, \n\ + \"lane0Id\": 0, \n\ + \"jesd204M\": 0, \n\ + \"jesd204K\": 0, \n\ + \"jesd204F\": 0, \n\ + \"jesd204Np\": 0, \n\ + \"jesd204E\": 0, \n\ + \"scramble\": 0, \n\ + \"serializerLanesEnabled\": 0, \n\ + \"lmfcOffset\": 0, \n\ + \"syncbInSelect\": 0, \n\ + \"overSample\": 0, \n\ + \"syncbInLvdsMode\": 0, \n\ + \"syncbInLvdsPnInvert\": 0, \n\ + \"newSysrefOnRelink\": 0, \n\ + \"sysrefForStartup\": 0, \n\ + \"sysrefNShotEnable\": 0, \n\ + \"sysrefNShotCount\": 0, \n\ + \"sysrefIgnoreWhenLinked\": 0 \n\ + }, \n\ + { \n\ + \"serializerLaneCrossbar\": { \n\ + \"lane0FramerOutSel\": 0, \n\ + \"lane1FramerOutSel\": 0, \n\ + \"lane2FramerOutSel\": 0, \n\ + \"lane3FramerOutSel\": 0 \n\ + }, \n\ + \"adcCrossbar\": { \n\ + \"conv0\": 127, \n\ + \"conv1\": 127, \n\ + \"conv2\": 127, \n\ + \"conv3\": 127, \n\ + \"conv4\": 127, \n\ + \"conv5\": 127, \n\ + \"conv6\": 127, \n\ + \"conv7\": 127, \n\ + \"conv8\": 127, \n\ + \"conv9\": 127, \n\ + \"conv10\": 127, \n\ + \"conv11\": 127, \n\ + \"conv12\": 127, \n\ + \"conv13\": 127, \n\ + \"conv14\": 127, \n\ + \"conv15\": 127, \n\ + \"conv16\": 127, \n\ + \"conv17\": 127, \n\ + \"conv18\": 127, \n\ + \"conv19\": 127, \n\ + \"conv20\": 127, \n\ + \"conv21\": 127, \n\ + \"conv22\": 127, \n\ + \"conv23\": 127 \n\ + }, \n\ + \"enableJesd204C\": 0, \n\ + \"bankId\": 0, \n\ + \"deviceId\": 0, \n\ + \"lane0Id\": 0, \n\ + \"jesd204M\": 0, \n\ + \"jesd204K\": 0, \n\ + \"jesd204F\": 0, \n\ + \"jesd204Np\": 0, \n\ + \"jesd204E\": 0, \n\ + \"scramble\": 0, \n\ + \"serializerLanesEnabled\": 0, \n\ + \"lmfcOffset\": 0, \n\ + \"syncbInSelect\": 0, \n\ + \"overSample\": 0, \n\ + \"syncbInLvdsMode\": 0, \n\ + \"syncbInLvdsPnInvert\": 0, \n\ + \"newSysrefOnRelink\": 0, \n\ + \"sysrefForStartup\": 0, \n\ + \"sysrefNShotEnable\": 0, \n\ + \"sysrefNShotCount\": 0, \n\ + \"sysrefIgnoreWhenLinked\": 0 \n\ + } \n\ + ], \n\ + \"deframer\": [ \n\ + { \n\ + \"deserializerLaneCrossbar\": { \n\ + \"deframerInput0LaneSel\": 0, \n\ + \"deframerInput1LaneSel\": 1, \n\ + \"deframerInput2LaneSel\": 2, \n\ + \"deframerInput3LaneSel\": 3 \n\ + }, \n\ + \"enableJesd204C\": 0, \n\ + \"bankId\": 0, \n\ + \"deviceId\": 1, \n\ + \"lane0Id\": 0, \n\ + \"jesd204M\": 8, \n\ + \"jesd204K\": 32, \n\ + \"jesd204F\": 4, \n\ + \"jesd204Np\": 16, \n\ + \"jesd204E\": 0, \n\ + \"scramble\": 1, \n\ + \"deserializerLanesEnabled\": 15, \n\ + \"lmfcOffset\": 0, \n\ + \"syncbOutSelect\": 0, \n\ + \"syncbOutLvdsMode\": 1, \n\ + \"syncbOutLvdsPnInvert\": 0, \n\ + \"syncbOutCmosSlewRate\": 0, \n\ + \"syncbOutCmosDriveLevel\": 0, \n\ + \"dacCrossbar\": { \n\ + \"tx1DacChanI\": 1, \n\ + \"tx1DacChanQ\": 0, \n\ + \"tx2DacChanI\": 3, \n\ + \"tx2DacChanQ\": 2, \n\ + \"tx3DacChanI\": 5, \n\ + \"tx3DacChanQ\": 4, \n\ + \"tx4DacChanI\": 7, \n\ + \"tx4DacChanQ\": 6 \n\ + }, \n\ + \"newSysrefOnRelink\": 0, \n\ + \"sysrefForStartup\": 1, \n\ + \"sysrefNShotEnable\": 0, \n\ + \"sysrefNShotCount\": 0, \n\ + \"sysrefIgnoreWhenLinked\": 0 \n\ + }, \n\ + { \n\ + \"deserializerLaneCrossbar\": { \n\ + \"deframerInput0LaneSel\": 8, \n\ + \"deframerInput1LaneSel\": 8, \n\ + \"deframerInput2LaneSel\": 8, \n\ + \"deframerInput3LaneSel\": 8 \n\ + }, \n\ + \"enableJesd204C\": 0, \n\ + \"bankId\": 0, \n\ + \"deviceId\": 0, \n\ + \"lane0Id\": 0, \n\ + \"jesd204M\": 0, \n\ + \"jesd204K\": 0, \n\ + \"jesd204F\": 0, \n\ + \"jesd204Np\": 0, \n\ + \"jesd204E\": 0, \n\ + \"scramble\": 0, \n\ + \"deserializerLanesEnabled\": 0, \n\ + \"lmfcOffset\": 0, \n\ + \"syncbOutSelect\": 0, \n\ + \"syncbOutLvdsMode\": 0, \n\ + \"syncbOutLvdsPnInvert\": 0, \n\ + \"syncbOutCmosSlewRate\": 0, \n\ + \"syncbOutCmosDriveLevel\": 0, \n\ + \"dacCrossbar\": { \n\ + \"tx1DacChanI\": 127, \n\ + \"tx1DacChanQ\": 127, \n\ + \"tx2DacChanI\": 127, \n\ + \"tx2DacChanQ\": 127, \n\ + \"tx3DacChanI\": 127, \n\ + \"tx3DacChanQ\": 127, \n\ + \"tx4DacChanI\": 127, \n\ + \"tx4DacChanQ\": 127 \n\ + }, \n\ + \"newSysrefOnRelink\": 0, \n\ + \"sysrefForStartup\": 1, \n\ + \"sysrefNShotEnable\": 0, \n\ + \"sysrefNShotCount\": 0, \n\ + \"sysrefIgnoreWhenLinked\": 0 \n\ + } \n\ + ], \n\ + \"serCfg\": [ \n\ + { \n\ + \"serAmplitude\": 0, \n\ + \"serPreEmphasis\": 0, \n\ + \"serPostEmphasis\": 0, \n\ + \"serInvertLanePolarity\": 0 \n\ + }, \n\ + { \n\ + \"serAmplitude\": 0, \n\ + \"serPreEmphasis\": 0, \n\ + \"serPostEmphasis\": 0, \n\ + \"serInvertLanePolarity\": 0 \n\ + }, \n\ + { \n\ + \"serAmplitude\": 0, \n\ + \"serPreEmphasis\": 0, \n\ + \"serPostEmphasis\": 0, \n\ + \"serInvertLanePolarity\": 0 \n\ + }, \n\ + { \n\ + \"serAmplitude\": 0, \n\ + \"serPreEmphasis\": 0, \n\ + \"serPostEmphasis\": 0, \n\ + \"serInvertLanePolarity\": 0 \n\ + } \n\ + ], \n\ + \"desCfg\": [ \n\ + { \n\ + \"highBoost\": 0, \n\ + \"configOption1\": 0, \n\ + \"configOption2\": 0, \n\ + \"configOption3\": 0, \n\ + \"configOption4\": 0, \n\ + \"configOption5\": 0, \n\ + \"configOption6\": 0, \n\ + \"configOption7\": 0, \n\ + \"configOption8\": 0, \n\ + \"configOption9\": 0, \n\ + \"configOption10\": 0, \n\ + \"desInvertLanePolarity\": 0 \n\ + }, \n\ + { \n\ + \"highBoost\": 0, \n\ + \"configOption1\": 0, \n\ + \"configOption2\": 0, \n\ + \"configOption3\": 0, \n\ + \"configOption4\": 0, \n\ + \"configOption5\": 0, \n\ + \"configOption6\": 0, \n\ + \"configOption7\": 0, \n\ + \"configOption8\": 0, \n\ + \"configOption9\": 0, \n\ + \"configOption10\": 0, \n\ + \"desInvertLanePolarity\": 0 \n\ + }, \n\ + { \n\ + \"highBoost\": 0, \n\ + \"configOption1\": 0, \n\ + \"configOption2\": 0, \n\ + \"configOption3\": 0, \n\ + \"configOption4\": 0, \n\ + \"configOption5\": 0, \n\ + \"configOption6\": 0, \n\ + \"configOption7\": 0, \n\ + \"configOption8\": 0, \n\ + \"configOption9\": 0, \n\ + \"configOption10\": 0, \n\ + \"desInvertLanePolarity\": 0 \n\ + }, \n\ + { \n\ + \"highBoost\": 0, \n\ + \"configOption1\": 0, \n\ + \"configOption2\": 0, \n\ + \"configOption3\": 0, \n\ + \"configOption4\": 0, \n\ + \"configOption5\": 0, \n\ + \"configOption6\": 0, \n\ + \"configOption7\": 0, \n\ + \"configOption8\": 0, \n\ + \"configOption9\": 0, \n\ + \"configOption10\": 0, \n\ + \"desInvertLanePolarity\": 0 \n\ + } \n\ + ], \n\ + \"linkSharingCfg\": { \n\ + \"linkSharingEnabled\": 0, \n\ + \"linkSharingM\": 0, \n\ + \"linkSharingS\": 0, \n\ + \"linkSharingNp\": 16, \n\ + \"linkSharingAdcCrossbar\": { \n\ + \"conv0\": 127, \n\ + \"conv1\": 127, \n\ + \"conv2\": 127, \n\ + \"conv3\": 127, \n\ + \"conv4\": 127, \n\ + \"conv5\": 127, \n\ + \"conv6\": 127, \n\ + \"conv7\": 127, \n\ + \"conv8\": 127, \n\ + \"conv9\": 127, \n\ + \"conv10\": 127, \n\ + \"conv11\": 127, \n\ + \"conv12\": 127, \n\ + \"conv13\": 127, \n\ + \"conv14\": 127, \n\ + \"conv15\": 127 \n\ + } \n\ + }, \n\ + \"dataCfg\": { \n\ + \"enable\": 0, \n\ + \"configOption1\": 0, \n\ + \"configOption2\": 0 \n\ + }, \n\ + \"channelSelect\": 0, \n\ + \"channelMode\": 0 \n\ + }, \n\ + \"clocks\": { \n\ + \"deviceClock_kHz\": 245760, \n\ + \"clkPllVcoFreq_kHz\": 9830400, \n\ + \"serdesPllVcoFreq_kHz\": 0, \n\ + \"ldoSelect\": 0, \n\ + \"extLoFreq1_kHz\": 0, \n\ + \"extLoFreq2_kHz\": 0, \n\ + \"rfPll1LoMode\": 0, \n\ + \"rfPll2LoMode\": 0, \n\ + \"rfPll1LoOutDivider\": 0, \n\ + \"rfPll2LoOutDivider\": 0, \n\ + \"rfPllPhaseSyncMode\": 0, \n\ + \"rx12LoSelect\": 1, \n\ + \"rx34LoSelect\": 1, \n\ + \"tx12LoSelect\": 2, \n\ + \"tx34LoSelect\": 2, \n\ + \"orx12LoSelect\": 1, \n\ + \"orx34LoSelect\": 1 \n\ + }, \n\ + \"gpInterrupts\": { \n\ + \"gpIntMaskPin0\": 18446744073709551615, \n\ + \"gpIntMaskPin1\": 18446744073709551615 \n\ + }, \n\ + \"rx\": { \n\ + \"rxInitChannelMask\": 1023, \n\ + \"rxChannelCfg\": [ \n\ + { \n\ + \"profile\": { \n\ + \"channelType\": 1, \n\ + \"rxFirDecimation\": 1, \n\ + \"rxDec5Decimation\": 5, \n\ + \"rhb1Decimation\": 2, \n\ + \"rhb1WideBandMode\": 1, \n\ + \"rhb2Decimation\": 2, \n\ + \"rhb3Decimation\": 1, \n\ + \"rxFir1Decimation\": 1, \n\ + \"rxFir2Decimation\": 1, \n\ + \"rxOutputRate_kHz\": 245760, \n\ + \"rfBandwidth_kHz\": 200000, \n\ + \"rxBbf3dBCorner_kHz\": 200000, \n\ + \"rxAdcBandWidth_kHz\": 100000, \n\ + \"rxFir\": { \n\ + \"gain_dB\": 6, \n\ + \"numFirCoefs\": 24, \n\ + \"coefs\": [ \n\ + -10, \n\ + 4, \n\ + -1, \n\ + -2, \n\ + 8, \n\ + -15, \n\ + 21, \n\ + -21, \n\ + 7, \n\ + 59, \n\ + -502, \n\ + 17153, \n\ + -502, \n\ + 59, \n\ + 7, \n\ + -21, \n\ + 21, \n\ + -15, \n\ + 8, \n\ + -2, \n\ + -1, \n\ + 4, \n\ + -10, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ] \n\ + }, \n\ + \"rxDdcMode\": 0, \n\ + \"rxNcoShifterCfg\": { \n\ + \"bandAInputBandWidth_kHz\": 0, \n\ + \"bandAInputCenterFreq_kHz\": 0, \n\ + \"bandANco1Freq_kHz\": 0, \n\ + \"bandANco2Freq_kHz\": 0, \n\ + \"bandBInputBandWidth_kHz\": 0, \n\ + \"bandBInputCenterFreq_kHz\": 0, \n\ + \"bandBNco1Freq_kHz\": 0, \n\ + \"bandBNco2Freq_kHz\": 0, \n\ + \"bandAbCombinedEnable\": 0 \n\ + }, \n\ + \"tiaPowerMode\": 4, \n\ + \"rxDataFormat\": { \n\ + \"rxChannelMask\": 1, \n\ + \"formatSelect\": 0, \n\ + \"floatingPointConfig\": { \n\ + \"fpDataFormat\": 0, \n\ + \"fpRoundMode\": 0, \n\ + \"fpNumExpBits\": 0, \n\ + \"fpAttenSteps\": 0, \n\ + \"fpHideLeadingOne\": 0, \n\ + \"fpEncodeNan\": 0 \n\ + }, \n\ + \"integerConfigSettings\": { \n\ + \"intEmbeddedBits\": 0, \n\ + \"intSampleResolution\": 2, \n\ + \"intParity\": 2, \n\ + \"intEmbeddedPos\": 0 \n\ + }, \n\ + \"slicerConfigSettings\": { \n\ + \"extSlicerStepSize\": 0, \n\ + \"intSlicerStepSize\": 0, \n\ + \"rx1ExtSlicerGpioSelect\": 0, \n\ + \"rx2ExtSlicerGpioSelect\": 0, \n\ + \"rx3ExtSlicerGpioSelect\": 0, \n\ + \"rx4ExtSlicerGpioSelect\": 0 \n\ + }, \n\ + \"embOvldMonitorSettings\": { \n\ + \"embeddedMonitorSrcLsbI\": 0, \n\ + \"embeddedMonitorSrcLsbQ\": 0, \n\ + \"embeddedMonitorSrcLsbPlusOneI\": 0, \n\ + \"embeddedMonitorSrcLsbPlusOneQ\": 0, \n\ + \"embeddedMonitorHb2LowSrcSel\": 6, \n\ + \"embeddedMonitorHb2HighSrcSel\": 3, \n\ + \"embeddedMonitorApdLowSrcSel\": 2, \n\ + \"embeddedMonitorApdHighSrcSel\": 2, \n\ + \"invertHb2Flag\": 0, \n\ + \"invertApdFlag\": 0 \n\ + }, \n\ + \"externalLnaGain\": 0, \n\ + \"tempCompensationEnable\": 0 \n\ + } \n\ + } \n\ + }, \n\ + { \n\ + \"profile\": { \n\ + \"channelType\": 2, \n\ + \"rxFirDecimation\": 1, \n\ + \"rxDec5Decimation\": 5, \n\ + \"rhb1Decimation\": 2, \n\ + \"rhb1WideBandMode\": 1, \n\ + \"rhb2Decimation\": 2, \n\ + \"rhb3Decimation\": 1, \n\ + \"rxFir1Decimation\": 1, \n\ + \"rxFir2Decimation\": 1, \n\ + \"rxOutputRate_kHz\": 245760, \n\ + \"rfBandwidth_kHz\": 200000, \n\ + \"rxBbf3dBCorner_kHz\": 200000, \n\ + \"rxAdcBandWidth_kHz\": 100000, \n\ + \"rxFir\": { \n\ + \"gain_dB\": 6, \n\ + \"numFirCoefs\": 24, \n\ + \"coefs\": [ \n\ + -10, \n\ + 4, \n\ + -1, \n\ + -2, \n\ + 8, \n\ + -15, \n\ + 21, \n\ + -21, \n\ + 7, \n\ + 59, \n\ + -502, \n\ + 17153, \n\ + -502, \n\ + 59, \n\ + 7, \n\ + -21, \n\ + 21, \n\ + -15, \n\ + 8, \n\ + -2, \n\ + -1, \n\ + 4, \n\ + -10, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ] \n\ + }, \n\ + \"rxDdcMode\": 0, \n\ + \"rxNcoShifterCfg\": { \n\ + \"bandAInputBandWidth_kHz\": 0, \n\ + \"bandAInputCenterFreq_kHz\": 0, \n\ + \"bandANco1Freq_kHz\": 0, \n\ + \"bandANco2Freq_kHz\": 0, \n\ + \"bandBInputBandWidth_kHz\": 0, \n\ + \"bandBInputCenterFreq_kHz\": 0, \n\ + \"bandBNco1Freq_kHz\": 0, \n\ + \"bandBNco2Freq_kHz\": 0, \n\ + \"bandAbCombinedEnable\": 0 \n\ + }, \n\ + \"tiaPowerMode\": 4, \n\ + \"rxDataFormat\": { \n\ + \"rxChannelMask\": 2, \n\ + \"formatSelect\": 0, \n\ + \"floatingPointConfig\": { \n\ + \"fpDataFormat\": 0, \n\ + \"fpRoundMode\": 0, \n\ + \"fpNumExpBits\": 0, \n\ + \"fpAttenSteps\": 0, \n\ + \"fpHideLeadingOne\": 0, \n\ + \"fpEncodeNan\": 0 \n\ + }, \n\ + \"integerConfigSettings\": { \n\ + \"intEmbeddedBits\": 0, \n\ + \"intSampleResolution\": 2, \n\ + \"intParity\": 2, \n\ + \"intEmbeddedPos\": 0 \n\ + }, \n\ + \"slicerConfigSettings\": { \n\ + \"extSlicerStepSize\": 0, \n\ + \"intSlicerStepSize\": 0, \n\ + \"rx1ExtSlicerGpioSelect\": 0, \n\ + \"rx2ExtSlicerGpioSelect\": 0, \n\ + \"rx3ExtSlicerGpioSelect\": 0, \n\ + \"rx4ExtSlicerGpioSelect\": 0 \n\ + }, \n\ + \"embOvldMonitorSettings\": { \n\ + \"embeddedMonitorSrcLsbI\": 0, \n\ + \"embeddedMonitorSrcLsbQ\": 0, \n\ + \"embeddedMonitorSrcLsbPlusOneI\": 0, \n\ + \"embeddedMonitorSrcLsbPlusOneQ\": 0, \n\ + \"embeddedMonitorHb2LowSrcSel\": 6, \n\ + \"embeddedMonitorHb2HighSrcSel\": 3, \n\ + \"embeddedMonitorApdLowSrcSel\": 2, \n\ + \"embeddedMonitorApdHighSrcSel\": 2, \n\ + \"invertHb2Flag\": 0, \n\ + \"invertApdFlag\": 0 \n\ + }, \n\ + \"externalLnaGain\": 0, \n\ + \"tempCompensationEnable\": 0 \n\ + } \n\ + } \n\ + }, \n\ + { \n\ + \"profile\": { \n\ + \"channelType\": 4, \n\ + \"rxFirDecimation\": 1, \n\ + \"rxDec5Decimation\": 5, \n\ + \"rhb1Decimation\": 2, \n\ + \"rhb1WideBandMode\": 1, \n\ + \"rhb2Decimation\": 2, \n\ + \"rhb3Decimation\": 1, \n\ + \"rxFir1Decimation\": 1, \n\ + \"rxFir2Decimation\": 1, \n\ + \"rxOutputRate_kHz\": 245760, \n\ + \"rfBandwidth_kHz\": 200000, \n\ + \"rxBbf3dBCorner_kHz\": 200000, \n\ + \"rxAdcBandWidth_kHz\": 100000, \n\ + \"rxFir\": { \n\ + \"gain_dB\": 6, \n\ + \"numFirCoefs\": 24, \n\ + \"coefs\": [ \n\ + -10, \n\ + 4, \n\ + -1, \n\ + -2, \n\ + 8, \n\ + -15, \n\ + 21, \n\ + -21, \n\ + 7, \n\ + 59, \n\ + -502, \n\ + 17153, \n\ + -502, \n\ + 59, \n\ + 7, \n\ + -21, \n\ + 21, \n\ + -15, \n\ + 8, \n\ + -2, \n\ + -1, \n\ + 4, \n\ + -10, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ] \n\ + }, \n\ + \"rxDdcMode\": 0, \n\ + \"rxNcoShifterCfg\": { \n\ + \"bandAInputBandWidth_kHz\": 0, \n\ + \"bandAInputCenterFreq_kHz\": 0, \n\ + \"bandANco1Freq_kHz\": 0, \n\ + \"bandANco2Freq_kHz\": 0, \n\ + \"bandBInputBandWidth_kHz\": 0, \n\ + \"bandBInputCenterFreq_kHz\": 0, \n\ + \"bandBNco1Freq_kHz\": 0, \n\ + \"bandBNco2Freq_kHz\": 0, \n\ + \"bandAbCombinedEnable\": 0 \n\ + }, \n\ + \"tiaPowerMode\": 4, \n\ + \"rxDataFormat\": { \n\ + \"rxChannelMask\": 4, \n\ + \"formatSelect\": 0, \n\ + \"floatingPointConfig\": { \n\ + \"fpDataFormat\": 0, \n\ + \"fpRoundMode\": 0, \n\ + \"fpNumExpBits\": 0, \n\ + \"fpAttenSteps\": 0, \n\ + \"fpHideLeadingOne\": 0, \n\ + \"fpEncodeNan\": 0 \n\ + }, \n\ + \"integerConfigSettings\": { \n\ + \"intEmbeddedBits\": 0, \n\ + \"intSampleResolution\": 2, \n\ + \"intParity\": 2, \n\ + \"intEmbeddedPos\": 0 \n\ + }, \n\ + \"slicerConfigSettings\": { \n\ + \"extSlicerStepSize\": 0, \n\ + \"intSlicerStepSize\": 0, \n\ + \"rx1ExtSlicerGpioSelect\": 0, \n\ + \"rx2ExtSlicerGpioSelect\": 0, \n\ + \"rx3ExtSlicerGpioSelect\": 0, \n\ + \"rx4ExtSlicerGpioSelect\": 0 \n\ + }, \n\ + \"embOvldMonitorSettings\": { \n\ + \"embeddedMonitorSrcLsbI\": 0, \n\ + \"embeddedMonitorSrcLsbQ\": 0, \n\ + \"embeddedMonitorSrcLsbPlusOneI\": 0, \n\ + \"embeddedMonitorSrcLsbPlusOneQ\": 0, \n\ + \"embeddedMonitorHb2LowSrcSel\": 6, \n\ + \"embeddedMonitorHb2HighSrcSel\": 3, \n\ + \"embeddedMonitorApdLowSrcSel\": 2, \n\ + \"embeddedMonitorApdHighSrcSel\": 2, \n\ + \"invertHb2Flag\": 0, \n\ + \"invertApdFlag\": 0 \n\ + }, \n\ + \"externalLnaGain\": 0, \n\ + \"tempCompensationEnable\": 0 \n\ + } \n\ + } \n\ + }, \n\ + { \n\ + \"profile\": { \n\ + \"channelType\": 8, \n\ + \"rxFirDecimation\": 1, \n\ + \"rxDec5Decimation\": 5, \n\ + \"rhb1Decimation\": 2, \n\ + \"rhb1WideBandMode\": 1, \n\ + \"rhb2Decimation\": 2, \n\ + \"rhb3Decimation\": 1, \n\ + \"rxFir1Decimation\": 1, \n\ + \"rxFir2Decimation\": 1, \n\ + \"rxOutputRate_kHz\": 245760, \n\ + \"rfBandwidth_kHz\": 200000, \n\ + \"rxBbf3dBCorner_kHz\": 200000, \n\ + \"rxAdcBandWidth_kHz\": 100000, \n\ + \"rxFir\": { \n\ + \"gain_dB\": 6, \n\ + \"numFirCoefs\": 24, \n\ + \"coefs\": [ \n\ + -10, \n\ + 4, \n\ + -1, \n\ + -2, \n\ + 8, \n\ + -15, \n\ + 21, \n\ + -21, \n\ + 7, \n\ + 59, \n\ + -502, \n\ + 17153, \n\ + -502, \n\ + 59, \n\ + 7, \n\ + -21, \n\ + 21, \n\ + -15, \n\ + 8, \n\ + -2, \n\ + -1, \n\ + 4, \n\ + -10, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ] \n\ + }, \n\ + \"rxDdcMode\": 0, \n\ + \"rxNcoShifterCfg\": { \n\ + \"bandAInputBandWidth_kHz\": 0, \n\ + \"bandAInputCenterFreq_kHz\": 0, \n\ + \"bandANco1Freq_kHz\": 0, \n\ + \"bandANco2Freq_kHz\": 0, \n\ + \"bandBInputBandWidth_kHz\": 0, \n\ + \"bandBInputCenterFreq_kHz\": 0, \n\ + \"bandBNco1Freq_kHz\": 0, \n\ + \"bandBNco2Freq_kHz\": 0, \n\ + \"bandAbCombinedEnable\": 0 \n\ + }, \n\ + \"tiaPowerMode\": 4, \n\ + \"rxDataFormat\": { \n\ + \"rxChannelMask\": 8, \n\ + \"formatSelect\": 0, \n\ + \"floatingPointConfig\": { \n\ + \"fpDataFormat\": 0, \n\ + \"fpRoundMode\": 0, \n\ + \"fpNumExpBits\": 0, \n\ + \"fpAttenSteps\": 0, \n\ + \"fpHideLeadingOne\": 0, \n\ + \"fpEncodeNan\": 0 \n\ + }, \n\ + \"integerConfigSettings\": { \n\ + \"intEmbeddedBits\": 0, \n\ + \"intSampleResolution\": 2, \n\ + \"intParity\": 2, \n\ + \"intEmbeddedPos\": 0 \n\ + }, \n\ + \"slicerConfigSettings\": { \n\ + \"extSlicerStepSize\": 0, \n\ + \"intSlicerStepSize\": 0, \n\ + \"rx1ExtSlicerGpioSelect\": 0, \n\ + \"rx2ExtSlicerGpioSelect\": 0, \n\ + \"rx3ExtSlicerGpioSelect\": 0, \n\ + \"rx4ExtSlicerGpioSelect\": 0 \n\ + }, \n\ + \"embOvldMonitorSettings\": { \n\ + \"embeddedMonitorSrcLsbI\": 0, \n\ + \"embeddedMonitorSrcLsbQ\": 0, \n\ + \"embeddedMonitorSrcLsbPlusOneI\": 0, \n\ + \"embeddedMonitorSrcLsbPlusOneQ\": 0, \n\ + \"embeddedMonitorHb2LowSrcSel\": 6, \n\ + \"embeddedMonitorHb2HighSrcSel\": 3, \n\ + \"embeddedMonitorApdLowSrcSel\": 2, \n\ + \"embeddedMonitorApdHighSrcSel\": 2, \n\ + \"invertHb2Flag\": 0, \n\ + \"invertApdFlag\": 0 \n\ + }, \n\ + \"externalLnaGain\": 0, \n\ + \"tempCompensationEnable\": 0 \n\ + } \n\ + } \n\ + }, \n\ + { \n\ + \"profile\": { \n\ + \"channelType\": 16, \n\ + \"rxFirDecimation\": 1, \n\ + \"rxDec5Decimation\": 5, \n\ + \"rhb1Decimation\": 2, \n\ + \"rhb1WideBandMode\": 0, \n\ + \"rhb2Decimation\": 1, \n\ + \"rhb3Decimation\": 1, \n\ + \"rxFir1Decimation\": 1, \n\ + \"rxFir2Decimation\": 1, \n\ + \"rxOutputRate_kHz\": 245760, \n\ + \"rfBandwidth_kHz\": 450000, \n\ + \"rxBbf3dBCorner_kHz\": 225000, \n\ + \"rxAdcBandWidth_kHz\": 225000, \n\ + \"rxFir\": { \n\ + \"gain_dB\": 6, \n\ + \"numFirCoefs\": 24, \n\ + \"coefs\": [ \n\ + 33, \n\ + -7, \n\ + 9, \n\ + -7, \n\ + 3, \n\ + 9, \n\ + -27, \n\ + 62, \n\ + -138, \n\ + 349, \n\ + -1663, \n\ + 19282, \n\ + -1663, \n\ + 349, \n\ + -138, \n\ + 62, \n\ + -27, \n\ + 9, \n\ + 3, \n\ + -7, \n\ + 9, \n\ + -7, \n\ + 33, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ] \n\ + }, \n\ + \"rxDdcMode\": 3, \n\ + \"rxNcoShifterCfg\": { \n\ + \"bandAInputBandWidth_kHz\": 0, \n\ + \"bandAInputCenterFreq_kHz\": 0, \n\ + \"bandANco1Freq_kHz\": 0, \n\ + \"bandANco2Freq_kHz\": 0, \n\ + \"bandBInputBandWidth_kHz\": 0, \n\ + \"bandBInputCenterFreq_kHz\": 0, \n\ + \"bandBNco1Freq_kHz\": 0, \n\ + \"bandBNco2Freq_kHz\": 0, \n\ + \"bandAbCombinedEnable\": 0 \n\ + }, \n\ + \"tiaPowerMode\": 4, \n\ + \"rxDataFormat\": { \n\ + \"rxChannelMask\": 16, \n\ + \"formatSelect\": 0, \n\ + \"floatingPointConfig\": { \n\ + \"fpDataFormat\": 0, \n\ + \"fpRoundMode\": 0, \n\ + \"fpNumExpBits\": 0, \n\ + \"fpAttenSteps\": 0, \n\ + \"fpHideLeadingOne\": 0, \n\ + \"fpEncodeNan\": 0 \n\ + }, \n\ + \"integerConfigSettings\": { \n\ + \"intEmbeddedBits\": 0, \n\ + \"intSampleResolution\": 2, \n\ + \"intParity\": 2, \n\ + \"intEmbeddedPos\": 0 \n\ + }, \n\ + \"slicerConfigSettings\": { \n\ + \"extSlicerStepSize\": 0, \n\ + \"intSlicerStepSize\": 0, \n\ + \"rx1ExtSlicerGpioSelect\": 0, \n\ + \"rx2ExtSlicerGpioSelect\": 0, \n\ + \"rx3ExtSlicerGpioSelect\": 0, \n\ + \"rx4ExtSlicerGpioSelect\": 0 \n\ + }, \n\ + \"embOvldMonitorSettings\": { \n\ + \"embeddedMonitorSrcLsbI\": 0, \n\ + \"embeddedMonitorSrcLsbQ\": 0, \n\ + \"embeddedMonitorSrcLsbPlusOneI\": 0, \n\ + \"embeddedMonitorSrcLsbPlusOneQ\": 0, \n\ + \"embeddedMonitorHb2LowSrcSel\": 6, \n\ + \"embeddedMonitorHb2HighSrcSel\": 3, \n\ + \"embeddedMonitorApdLowSrcSel\": 2, \n\ + \"embeddedMonitorApdHighSrcSel\": 2, \n\ + \"invertHb2Flag\": 0, \n\ + \"invertApdFlag\": 0 \n\ + }, \n\ + \"externalLnaGain\": 0, \n\ + \"tempCompensationEnable\": 0 \n\ + } \n\ + } \n\ + }, \n\ + { \n\ + \"profile\": { \n\ + \"channelType\": 32, \n\ + \"rxFirDecimation\": 1, \n\ + \"rxDec5Decimation\": 5, \n\ + \"rhb1Decimation\": 2, \n\ + \"rhb1WideBandMode\": 0, \n\ + \"rhb2Decimation\": 1, \n\ + \"rhb3Decimation\": 1, \n\ + \"rxFir1Decimation\": 1, \n\ + \"rxFir2Decimation\": 1, \n\ + \"rxOutputRate_kHz\": 245760, \n\ + \"rfBandwidth_kHz\": 450000, \n\ + \"rxBbf3dBCorner_kHz\": 225000, \n\ + \"rxAdcBandWidth_kHz\": 225000, \n\ + \"rxFir\": { \n\ + \"gain_dB\": 6, \n\ + \"numFirCoefs\": 24, \n\ + \"coefs\": [ \n\ + 33, \n\ + -7, \n\ + 9, \n\ + -7, \n\ + 3, \n\ + 9, \n\ + -27, \n\ + 62, \n\ + -138, \n\ + 349, \n\ + -1663, \n\ + 19282, \n\ + -1663, \n\ + 349, \n\ + -138, \n\ + 62, \n\ + -27, \n\ + 9, \n\ + 3, \n\ + -7, \n\ + 9, \n\ + -7, \n\ + 33, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ] \n\ + }, \n\ + \"rxDdcMode\": 3, \n\ + \"rxNcoShifterCfg\": { \n\ + \"bandAInputBandWidth_kHz\": 0, \n\ + \"bandAInputCenterFreq_kHz\": 0, \n\ + \"bandANco1Freq_kHz\": 0, \n\ + \"bandANco2Freq_kHz\": 0, \n\ + \"bandBInputBandWidth_kHz\": 0, \n\ + \"bandBInputCenterFreq_kHz\": 0, \n\ + \"bandBNco1Freq_kHz\": 0, \n\ + \"bandBNco2Freq_kHz\": 0, \n\ + \"bandAbCombinedEnable\": 0 \n\ + }, \n\ + \"tiaPowerMode\": 4, \n\ + \"rxDataFormat\": { \n\ + \"rxChannelMask\": 32, \n\ + \"formatSelect\": 0, \n\ + \"floatingPointConfig\": { \n\ + \"fpDataFormat\": 0, \n\ + \"fpRoundMode\": 0, \n\ + \"fpNumExpBits\": 0, \n\ + \"fpAttenSteps\": 0, \n\ + \"fpHideLeadingOne\": 0, \n\ + \"fpEncodeNan\": 0 \n\ + }, \n\ + \"integerConfigSettings\": { \n\ + \"intEmbeddedBits\": 0, \n\ + \"intSampleResolution\": 2, \n\ + \"intParity\": 2, \n\ + \"intEmbeddedPos\": 0 \n\ + }, \n\ + \"slicerConfigSettings\": { \n\ + \"extSlicerStepSize\": 0, \n\ + \"intSlicerStepSize\": 0, \n\ + \"rx1ExtSlicerGpioSelect\": 0, \n\ + \"rx2ExtSlicerGpioSelect\": 0, \n\ + \"rx3ExtSlicerGpioSelect\": 0, \n\ + \"rx4ExtSlicerGpioSelect\": 0 \n\ + }, \n\ + \"embOvldMonitorSettings\": { \n\ + \"embeddedMonitorSrcLsbI\": 0, \n\ + \"embeddedMonitorSrcLsbQ\": 0, \n\ + \"embeddedMonitorSrcLsbPlusOneI\": 0, \n\ + \"embeddedMonitorSrcLsbPlusOneQ\": 0, \n\ + \"embeddedMonitorHb2LowSrcSel\": 6, \n\ + \"embeddedMonitorHb2HighSrcSel\": 3, \n\ + \"embeddedMonitorApdLowSrcSel\": 2, \n\ + \"embeddedMonitorApdHighSrcSel\": 2, \n\ + \"invertHb2Flag\": 0, \n\ + \"invertApdFlag\": 0 \n\ + }, \n\ + \"externalLnaGain\": 0, \n\ + \"tempCompensationEnable\": 0 \n\ + } \n\ + } \n\ + }, \n\ + { \n\ + \"profile\": { \n\ + \"channelType\": 64, \n\ + \"rxFirDecimation\": 1, \n\ + \"rxDec5Decimation\": 5, \n\ + \"rhb1Decimation\": 2, \n\ + \"rhb1WideBandMode\": 0, \n\ + \"rhb2Decimation\": 1, \n\ + \"rhb3Decimation\": 1, \n\ + \"rxFir1Decimation\": 1, \n\ + \"rxFir2Decimation\": 1, \n\ + \"rxOutputRate_kHz\": 245760, \n\ + \"rfBandwidth_kHz\": 450000, \n\ + \"rxBbf3dBCorner_kHz\": 225000, \n\ + \"rxAdcBandWidth_kHz\": 225000, \n\ + \"rxFir\": { \n\ + \"gain_dB\": 6, \n\ + \"numFirCoefs\": 24, \n\ + \"coefs\": [ \n\ + 33, \n\ + -7, \n\ + 9, \n\ + -7, \n\ + 3, \n\ + 9, \n\ + -27, \n\ + 62, \n\ + -138, \n\ + 349, \n\ + -1663, \n\ + 19282, \n\ + -1663, \n\ + 349, \n\ + -138, \n\ + 62, \n\ + -27, \n\ + 9, \n\ + 3, \n\ + -7, \n\ + 9, \n\ + -7, \n\ + 33, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ] \n\ + }, \n\ + \"rxDdcMode\": 3, \n\ + \"rxNcoShifterCfg\": { \n\ + \"bandAInputBandWidth_kHz\": 0, \n\ + \"bandAInputCenterFreq_kHz\": 0, \n\ + \"bandANco1Freq_kHz\": 0, \n\ + \"bandANco2Freq_kHz\": 0, \n\ + \"bandBInputBandWidth_kHz\": 0, \n\ + \"bandBInputCenterFreq_kHz\": 0, \n\ + \"bandBNco1Freq_kHz\": 0, \n\ + \"bandBNco2Freq_kHz\": 0, \n\ + \"bandAbCombinedEnable\": 0 \n\ + }, \n\ + \"tiaPowerMode\": 4, \n\ + \"rxDataFormat\": { \n\ + \"rxChannelMask\": 64, \n\ + \"formatSelect\": 0, \n\ + \"floatingPointConfig\": { \n\ + \"fpDataFormat\": 0, \n\ + \"fpRoundMode\": 0, \n\ + \"fpNumExpBits\": 0, \n\ + \"fpAttenSteps\": 0, \n\ + \"fpHideLeadingOne\": 0, \n\ + \"fpEncodeNan\": 0 \n\ + }, \n\ + \"integerConfigSettings\": { \n\ + \"intEmbeddedBits\": 0, \n\ + \"intSampleResolution\": 2, \n\ + \"intParity\": 2, \n\ + \"intEmbeddedPos\": 0 \n\ + }, \n\ + \"slicerConfigSettings\": { \n\ + \"extSlicerStepSize\": 0, \n\ + \"intSlicerStepSize\": 0, \n\ + \"rx1ExtSlicerGpioSelect\": 0, \n\ + \"rx2ExtSlicerGpioSelect\": 0, \n\ + \"rx3ExtSlicerGpioSelect\": 0, \n\ + \"rx4ExtSlicerGpioSelect\": 0 \n\ + }, \n\ + \"embOvldMonitorSettings\": { \n\ + \"embeddedMonitorSrcLsbI\": 0, \n\ + \"embeddedMonitorSrcLsbQ\": 0, \n\ + \"embeddedMonitorSrcLsbPlusOneI\": 0, \n\ + \"embeddedMonitorSrcLsbPlusOneQ\": 0, \n\ + \"embeddedMonitorHb2LowSrcSel\": 6, \n\ + \"embeddedMonitorHb2HighSrcSel\": 3, \n\ + \"embeddedMonitorApdLowSrcSel\": 2, \n\ + \"embeddedMonitorApdHighSrcSel\": 2, \n\ + \"invertHb2Flag\": 0, \n\ + \"invertApdFlag\": 0 \n\ + }, \n\ + \"externalLnaGain\": 0, \n\ + \"tempCompensationEnable\": 0 \n\ + } \n\ + } \n\ + }, \n\ + { \n\ + \"profile\": { \n\ + \"channelType\": 128, \n\ + \"rxFirDecimation\": 1, \n\ + \"rxDec5Decimation\": 5, \n\ + \"rhb1Decimation\": 2, \n\ + \"rhb1WideBandMode\": 0, \n\ + \"rhb2Decimation\": 1, \n\ + \"rhb3Decimation\": 1, \n\ + \"rxFir1Decimation\": 1, \n\ + \"rxFir2Decimation\": 1, \n\ + \"rxOutputRate_kHz\": 245760, \n\ + \"rfBandwidth_kHz\": 450000, \n\ + \"rxBbf3dBCorner_kHz\": 225000, \n\ + \"rxAdcBandWidth_kHz\": 225000, \n\ + \"rxFir\": { \n\ + \"gain_dB\": 6, \n\ + \"numFirCoefs\": 24, \n\ + \"coefs\": [ \n\ + 33, \n\ + -7, \n\ + 9, \n\ + -7, \n\ + 3, \n\ + 9, \n\ + -27, \n\ + 62, \n\ + -138, \n\ + 349, \n\ + -1663, \n\ + 19282, \n\ + -1663, \n\ + 349, \n\ + -138, \n\ + 62, \n\ + -27, \n\ + 9, \n\ + 3, \n\ + -7, \n\ + 9, \n\ + -7, \n\ + 33, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ] \n\ + }, \n\ + \"rxDdcMode\": 3, \n\ + \"rxNcoShifterCfg\": { \n\ + \"bandAInputBandWidth_kHz\": 0, \n\ + \"bandAInputCenterFreq_kHz\": 0, \n\ + \"bandANco1Freq_kHz\": 0, \n\ + \"bandANco2Freq_kHz\": 0, \n\ + \"bandBInputBandWidth_kHz\": 0, \n\ + \"bandBInputCenterFreq_kHz\": 0, \n\ + \"bandBNco1Freq_kHz\": 0, \n\ + \"bandBNco2Freq_kHz\": 0, \n\ + \"bandAbCombinedEnable\": 0 \n\ + }, \n\ + \"tiaPowerMode\": 4, \n\ + \"rxDataFormat\": { \n\ + \"rxChannelMask\": 128, \n\ + \"formatSelect\": 0, \n\ + \"floatingPointConfig\": { \n\ + \"fpDataFormat\": 0, \n\ + \"fpRoundMode\": 0, \n\ + \"fpNumExpBits\": 0, \n\ + \"fpAttenSteps\": 0, \n\ + \"fpHideLeadingOne\": 0, \n\ + \"fpEncodeNan\": 0 \n\ + }, \n\ + \"integerConfigSettings\": { \n\ + \"intEmbeddedBits\": 0, \n\ + \"intSampleResolution\": 2, \n\ + \"intParity\": 2, \n\ + \"intEmbeddedPos\": 0 \n\ + }, \n\ + \"slicerConfigSettings\": { \n\ + \"extSlicerStepSize\": 0, \n\ + \"intSlicerStepSize\": 0, \n\ + \"rx1ExtSlicerGpioSelect\": 0, \n\ + \"rx2ExtSlicerGpioSelect\": 0, \n\ + \"rx3ExtSlicerGpioSelect\": 0, \n\ + \"rx4ExtSlicerGpioSelect\": 0 \n\ + }, \n\ + \"embOvldMonitorSettings\": { \n\ + \"embeddedMonitorSrcLsbI\": 0, \n\ + \"embeddedMonitorSrcLsbQ\": 0, \n\ + \"embeddedMonitorSrcLsbPlusOneI\": 0, \n\ + \"embeddedMonitorSrcLsbPlusOneQ\": 0, \n\ + \"embeddedMonitorHb2LowSrcSel\": 6, \n\ + \"embeddedMonitorHb2HighSrcSel\": 3, \n\ + \"embeddedMonitorApdLowSrcSel\": 2, \n\ + \"embeddedMonitorApdHighSrcSel\": 2, \n\ + \"invertHb2Flag\": 0, \n\ + \"invertApdFlag\": 0 \n\ + }, \n\ + \"externalLnaGain\": 0, \n\ + \"tempCompensationEnable\": 0 \n\ + } \n\ + } \n\ + }, \n\ + { \n\ + \"profile\": { \n\ + \"channelType\": 256, \n\ + \"rxFirDecimation\": 1, \n\ + \"rxDec5Decimation\": 5, \n\ + \"rhb1Decimation\": 2, \n\ + \"rhb1WideBandMode\": 0, \n\ + \"rhb2Decimation\": 1, \n\ + \"rhb3Decimation\": 1, \n\ + \"rxFir1Decimation\": 1, \n\ + \"rxFir2Decimation\": 1, \n\ + \"rxOutputRate_kHz\": 245760, \n\ + \"rfBandwidth_kHz\": 450000, \n\ + \"rxBbf3dBCorner_kHz\": 225000, \n\ + \"rxAdcBandWidth_kHz\": 225000, \n\ + \"rxFir\": { \n\ + \"gain_dB\": 6, \n\ + \"numFirCoefs\": 24, \n\ + \"coefs\": [ \n\ + 33, \n\ + -7, \n\ + 9, \n\ + -7, \n\ + 3, \n\ + 9, \n\ + -27, \n\ + 62, \n\ + -138, \n\ + 349, \n\ + -1663, \n\ + 19282, \n\ + -1663, \n\ + 349, \n\ + -138, \n\ + 62, \n\ + -27, \n\ + 9, \n\ + 3, \n\ + -7, \n\ + 9, \n\ + -7, \n\ + 33, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ] \n\ + }, \n\ + \"rxDdcMode\": 3, \n\ + \"rxNcoShifterCfg\": { \n\ + \"bandAInputBandWidth_kHz\": 0, \n\ + \"bandAInputCenterFreq_kHz\": 0, \n\ + \"bandANco1Freq_kHz\": 0, \n\ + \"bandANco2Freq_kHz\": 0, \n\ + \"bandBInputBandWidth_kHz\": 0, \n\ + \"bandBInputCenterFreq_kHz\": 0, \n\ + \"bandBNco1Freq_kHz\": 0, \n\ + \"bandBNco2Freq_kHz\": 0, \n\ + \"bandAbCombinedEnable\": 0 \n\ + }, \n\ + \"tiaPowerMode\": 4, \n\ + \"rxDataFormat\": { \n\ + \"rxChannelMask\": 256, \n\ + \"formatSelect\": 0, \n\ + \"floatingPointConfig\": { \n\ + \"fpDataFormat\": 0, \n\ + \"fpRoundMode\": 0, \n\ + \"fpNumExpBits\": 0, \n\ + \"fpAttenSteps\": 0, \n\ + \"fpHideLeadingOne\": 0, \n\ + \"fpEncodeNan\": 0 \n\ + }, \n\ + \"integerConfigSettings\": { \n\ + \"intEmbeddedBits\": 0, \n\ + \"intSampleResolution\": 2, \n\ + \"intParity\": 2, \n\ + \"intEmbeddedPos\": 0 \n\ + }, \n\ + \"slicerConfigSettings\": { \n\ + \"extSlicerStepSize\": 0, \n\ + \"intSlicerStepSize\": 0, \n\ + \"rx1ExtSlicerGpioSelect\": 0, \n\ + \"rx2ExtSlicerGpioSelect\": 0, \n\ + \"rx3ExtSlicerGpioSelect\": 0, \n\ + \"rx4ExtSlicerGpioSelect\": 0 \n\ + }, \n\ + \"embOvldMonitorSettings\": { \n\ + \"embeddedMonitorSrcLsbI\": 0, \n\ + \"embeddedMonitorSrcLsbQ\": 0, \n\ + \"embeddedMonitorSrcLsbPlusOneI\": 0, \n\ + \"embeddedMonitorSrcLsbPlusOneQ\": 0, \n\ + \"embeddedMonitorHb2LowSrcSel\": 6, \n\ + \"embeddedMonitorHb2HighSrcSel\": 3, \n\ + \"embeddedMonitorApdLowSrcSel\": 2, \n\ + \"embeddedMonitorApdHighSrcSel\": 2, \n\ + \"invertHb2Flag\": 0, \n\ + \"invertApdFlag\": 0 \n\ + }, \n\ + \"externalLnaGain\": 0, \n\ + \"tempCompensationEnable\": 0 \n\ + } \n\ + } \n\ + }, \n\ + { \n\ + \"profile\": { \n\ + \"channelType\": 512, \n\ + \"rxFirDecimation\": 1, \n\ + \"rxDec5Decimation\": 5, \n\ + \"rhb1Decimation\": 2, \n\ + \"rhb1WideBandMode\": 0, \n\ + \"rhb2Decimation\": 1, \n\ + \"rhb3Decimation\": 1, \n\ + \"rxFir1Decimation\": 1, \n\ + \"rxFir2Decimation\": 1, \n\ + \"rxOutputRate_kHz\": 245760, \n\ + \"rfBandwidth_kHz\": 450000, \n\ + \"rxBbf3dBCorner_kHz\": 225000, \n\ + \"rxAdcBandWidth_kHz\": 225000, \n\ + \"rxFir\": { \n\ + \"gain_dB\": 6, \n\ + \"numFirCoefs\": 24, \n\ + \"coefs\": [ \n\ + 33, \n\ + -7, \n\ + 9, \n\ + -7, \n\ + 3, \n\ + 9, \n\ + -27, \n\ + 62, \n\ + -138, \n\ + 349, \n\ + -1663, \n\ + 19282, \n\ + -1663, \n\ + 349, \n\ + -138, \n\ + 62, \n\ + -27, \n\ + 9, \n\ + 3, \n\ + -7, \n\ + 9, \n\ + -7, \n\ + 33, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ] \n\ + }, \n\ + \"rxDdcMode\": 3, \n\ + \"rxNcoShifterCfg\": { \n\ + \"bandAInputBandWidth_kHz\": 0, \n\ + \"bandAInputCenterFreq_kHz\": 0, \n\ + \"bandANco1Freq_kHz\": 0, \n\ + \"bandANco2Freq_kHz\": 0, \n\ + \"bandBInputBandWidth_kHz\": 0, \n\ + \"bandBInputCenterFreq_kHz\": 0, \n\ + \"bandBNco1Freq_kHz\": 0, \n\ + \"bandBNco2Freq_kHz\": 0, \n\ + \"bandAbCombinedEnable\": 0 \n\ + }, \n\ + \"tiaPowerMode\": 4, \n\ + \"rxDataFormat\": { \n\ + \"rxChannelMask\": 512, \n\ + \"formatSelect\": 0, \n\ + \"floatingPointConfig\": { \n\ + \"fpDataFormat\": 0, \n\ + \"fpRoundMode\": 0, \n\ + \"fpNumExpBits\": 0, \n\ + \"fpAttenSteps\": 0, \n\ + \"fpHideLeadingOne\": 0, \n\ + \"fpEncodeNan\": 0 \n\ + }, \n\ + \"integerConfigSettings\": { \n\ + \"intEmbeddedBits\": 0, \n\ + \"intSampleResolution\": 2, \n\ + \"intParity\": 2, \n\ + \"intEmbeddedPos\": 0 \n\ + }, \n\ + \"slicerConfigSettings\": { \n\ + \"extSlicerStepSize\": 0, \n\ + \"intSlicerStepSize\": 0, \n\ + \"rx1ExtSlicerGpioSelect\": 0, \n\ + \"rx2ExtSlicerGpioSelect\": 0, \n\ + \"rx3ExtSlicerGpioSelect\": 0, \n\ + \"rx4ExtSlicerGpioSelect\": 0 \n\ + }, \n\ + \"embOvldMonitorSettings\": { \n\ + \"embeddedMonitorSrcLsbI\": 0, \n\ + \"embeddedMonitorSrcLsbQ\": 0, \n\ + \"embeddedMonitorSrcLsbPlusOneI\": 0, \n\ + \"embeddedMonitorSrcLsbPlusOneQ\": 0, \n\ + \"embeddedMonitorHb2LowSrcSel\": 6, \n\ + \"embeddedMonitorHb2HighSrcSel\": 3, \n\ + \"embeddedMonitorApdLowSrcSel\": 2, \n\ + \"embeddedMonitorApdHighSrcSel\": 2, \n\ + \"invertHb2Flag\": 0, \n\ + \"invertApdFlag\": 0 \n\ + }, \n\ + \"externalLnaGain\": 0, \n\ + \"tempCompensationEnable\": 0 \n\ + } \n\ + } \n\ + } \n\ + ] \n\ + }, \n\ + \"tx\": { \n\ + \"txInitChannelMask\": 15, \n\ + \"txChannelCfg\": [ \n\ + { \n\ + \"profile\": { \n\ + \"txInputRate_kHz\": 245760, \n\ + \"primarySigBandwidth_kHz\": 200000, \n\ + \"rfBandwidth_kHz\": 450000, \n\ + \"txDac3dBCorner_kHz\": 450000, \n\ + \"txBbf3dBCorner_kHz\": 225000, \n\ + \"dpdHb1Interpolation\": 2, \n\ + \"dpdHb2Interpolation\": 2, \n\ + \"txFirInterpolation\": 1, \n\ + \"thb1Interpolation\": 1, \n\ + \"thb2Interpolation\": 1, \n\ + \"thb3Interpolation\": 2, \n\ + \"txInt5Interpolation\": 1, \n\ + \"txFir\": { \n\ + \"gain_dB\": 0, \n\ + \"numFirCoefs\": 20, \n\ + \"coefs\": [ \n\ + 150, \n\ + -1580, \n\ + 4231, \n\ + -4275, \n\ + -1981, \n\ + 8637, \n\ + -2338, \n\ + -13408, \n\ + 10714, \n\ + 32466, \n\ + 10714, \n\ + -13408, \n\ + -2338, \n\ + 8637, \n\ + -1981, \n\ + -4275, \n\ + 4231, \n\ + -1580, \n\ + 150, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ] \n\ + }, \n\ + \"txBbfPowerMode\": 8 \n\ + }, \n\ + \"txAttenCtrl\": { \n\ + \"txAttenStepSize\": 0, \n\ + \"txRampDownEvents\": 63, \n\ + \"reserved\": 0, \n\ + \"attenMode\": 1, \n\ + \"dacFullScale\": 0, \n\ + \"txAttenInit_mdB\": 10000 \n\ + }, \n\ + \"dacFullScale\": 0 \n\ + }, \n\ + { \n\ + \"profile\": { \n\ + \"txInputRate_kHz\": 245760, \n\ + \"primarySigBandwidth_kHz\": 200000, \n\ + \"rfBandwidth_kHz\": 450000, \n\ + \"txDac3dBCorner_kHz\": 450000, \n\ + \"txBbf3dBCorner_kHz\": 225000, \n\ + \"dpdHb1Interpolation\": 2, \n\ + \"dpdHb2Interpolation\": 2, \n\ + \"txFirInterpolation\": 1, \n\ + \"thb1Interpolation\": 1, \n\ + \"thb2Interpolation\": 1, \n\ + \"thb3Interpolation\": 2, \n\ + \"txInt5Interpolation\": 1, \n\ + \"txFir\": { \n\ + \"gain_dB\": 0, \n\ + \"numFirCoefs\": 20, \n\ + \"coefs\": [ \n\ + 150, \n\ + -1580, \n\ + 4231, \n\ + -4275, \n\ + -1981, \n\ + 8637, \n\ + -2338, \n\ + -13408, \n\ + 10714, \n\ + 32466, \n\ + 10714, \n\ + -13408, \n\ + -2338, \n\ + 8637, \n\ + -1981, \n\ + -4275, \n\ + 4231, \n\ + -1580, \n\ + 150, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ] \n\ + }, \n\ + \"txBbfPowerMode\": 8 \n\ + }, \n\ + \"txAttenCtrl\": { \n\ + \"txAttenStepSize\": 0, \n\ + \"txRampDownEvents\": 63, \n\ + \"reserved\": 0, \n\ + \"attenMode\": 1, \n\ + \"dacFullScale\": 0, \n\ + \"txAttenInit_mdB\": 10000 \n\ + }, \n\ + \"dacFullScale\": 0 \n\ + }, \n\ + { \n\ + \"profile\": { \n\ + \"txInputRate_kHz\": 245760, \n\ + \"primarySigBandwidth_kHz\": 200000, \n\ + \"rfBandwidth_kHz\": 450000, \n\ + \"txDac3dBCorner_kHz\": 450000, \n\ + \"txBbf3dBCorner_kHz\": 225000, \n\ + \"dpdHb1Interpolation\": 2, \n\ + \"dpdHb2Interpolation\": 2, \n\ + \"txFirInterpolation\": 1, \n\ + \"thb1Interpolation\": 1, \n\ + \"thb2Interpolation\": 1, \n\ + \"thb3Interpolation\": 2, \n\ + \"txInt5Interpolation\": 1, \n\ + \"txFir\": { \n\ + \"gain_dB\": 0, \n\ + \"numFirCoefs\": 20, \n\ + \"coefs\": [ \n\ + 150, \n\ + -1580, \n\ + 4231, \n\ + -4275, \n\ + -1981, \n\ + 8637, \n\ + -2338, \n\ + -13408, \n\ + 10714, \n\ + 32466, \n\ + 10714, \n\ + -13408, \n\ + -2338, \n\ + 8637, \n\ + -1981, \n\ + -4275, \n\ + 4231, \n\ + -1580, \n\ + 150, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ] \n\ + }, \n\ + \"txBbfPowerMode\": 8 \n\ + }, \n\ + \"txAttenCtrl\": { \n\ + \"txAttenStepSize\": 0, \n\ + \"txRampDownEvents\": 63, \n\ + \"reserved\": 0, \n\ + \"attenMode\": 1, \n\ + \"dacFullScale\": 0, \n\ + \"txAttenInit_mdB\": 10000 \n\ + }, \n\ + \"dacFullScale\": 0 \n\ + }, \n\ + { \n\ + \"profile\": { \n\ + \"txInputRate_kHz\": 245760, \n\ + \"primarySigBandwidth_kHz\": 200000, \n\ + \"rfBandwidth_kHz\": 450000, \n\ + \"txDac3dBCorner_kHz\": 450000, \n\ + \"txBbf3dBCorner_kHz\": 225000, \n\ + \"dpdHb1Interpolation\": 2, \n\ + \"dpdHb2Interpolation\": 2, \n\ + \"txFirInterpolation\": 1, \n\ + \"thb1Interpolation\": 1, \n\ + \"thb2Interpolation\": 1, \n\ + \"thb3Interpolation\": 2, \n\ + \"txInt5Interpolation\": 1, \n\ + \"txFir\": { \n\ + \"gain_dB\": 0, \n\ + \"numFirCoefs\": 20, \n\ + \"coefs\": [ \n\ + 150, \n\ + -1580, \n\ + 4231, \n\ + -4275, \n\ + -1981, \n\ + 8637, \n\ + -2338, \n\ + -13408, \n\ + 10714, \n\ + 32466, \n\ + 10714, \n\ + -13408, \n\ + -2338, \n\ + 8637, \n\ + -1981, \n\ + -4275, \n\ + 4231, \n\ + -1580, \n\ + 150, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ] \n\ + }, \n\ + \"txBbfPowerMode\": 8 \n\ + }, \n\ + \"txAttenCtrl\": { \n\ + \"txAttenStepSize\": 0, \n\ + \"txRampDownEvents\": 63, \n\ + \"reserved\": 0, \n\ + \"attenMode\": 1, \n\ + \"dacFullScale\": 0, \n\ + \"txAttenInit_mdB\": 10000 \n\ + }, \n\ + \"dacFullScale\": 0 \n\ + } \n\ + ] \n\ + }, \n\ + \"adcProfiles\": { \n\ + \"RxChannel1\": [ \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ], \n\ + \"RxChannel2\": [ \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ], \n\ + \"RxChannel3\": [ \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ], \n\ + \"RxChannel4\": [ \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ], \n\ + \"OrxChannel1Profile0\": [ \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ], \n\ + \"OrxChannel1Profile1\": [ \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ], \n\ + \"OrxChannel1Profile2\": [ \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ], \n\ + \"OrxChannel1Profile3\": [ \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ], \n\ + \"OrxChannel2Profile0\": [ \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ], \n\ + \"OrxChannel2Profile1\": [ \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ], \n\ + \"OrxChannel2Profile2\": [ \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ], \n\ + \"OrxChannel2Profile3\": [ \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0, \n\ + 0 \n\ + ], \n\ + \"OrxChannel1Index\": 0, \n\ + \"OrxChannel2Index\": 0 \n\ + } \n\ +}\n"; diff --git a/projects/adrv904x/src/common/firmware/ActiveUtilInit_profile.h b/projects/adrv904x/src/common/firmware/ActiveUtilInit_profile.h new file mode 100644 index 00000000000..c173669aaa6 --- /dev/null +++ b/projects/adrv904x/src/common/firmware/ActiveUtilInit_profile.h @@ -0,0 +1,56 @@ +const char *json_profile_active_util_init = "{ \n\ + \"radioCtrlInit\": { \n\ + \"radioCtrlModeCfg\": { \n\ + \"txRadioCtrlModeCfg\": { \n\ + \"txEnableMode\": 0, \n\ + \"txChannelMask\": 15 \n\ + }, \n\ + \"rxRadioCtrlModeCfg\": { \n\ + \"rxEnableMode\": 0, \n\ + \"rxChannelMask\": 255 \n\ + }, \n\ + \"orxRadioCtrlModeCfg\": { \n\ + \"orxEnableMode\": 0, \n\ + \"orxPinSelectSettlingDelay_armClkCycles\": 0, \n\ + \"singleChannel1PinModeOrxSel\": 0, \n\ + \"singleChannel2PinModeLowOrxSel\": 0, \n\ + \"singleChannel2PinModeHighOrxSel\": 0, \n\ + \"dualChannel2PinModeOrxSel\": 0 \n\ + } \n\ + }, \n\ + \"txToOrxMapping\": { \n\ + \"orx1Map\": 2, \n\ + \"orx2Map\": 3, \n\ + \"orx3Map\": 2, \n\ + \"orx4Map\": 3 \n\ + }, \n\ + \"streamGpioCfg\": { \n\ + \"streamGpInput0\": 19, \n\ + \"streamGpInput1\": 19, \n\ + \"streamGpInput2\": 19, \n\ + \"streamGpInput3\": 19, \n\ + \"streamGpInput4\": 19, \n\ + \"streamGpInput5\": 19, \n\ + \"streamGpInput6\": 19, \n\ + \"streamGpInput7\": 19, \n\ + \"streamGpInput8\": 19, \n\ + \"streamGpInput9\": 19, \n\ + \"streamGpInput10\": 19, \n\ + \"streamGpInput11\": 19, \n\ + \"streamGpInput12\": 19, \n\ + \"streamGpInput13\": 19, \n\ + \"streamGpInput14\": 19, \n\ + \"streamGpInput15\": 19 \n\ + }, \n\ + \"lo1PllFreq_Hz\": 3500000000, \n\ + \"lo2PllFreq_Hz\": 3550000000, \n\ + \"auxPllFreq_Hz\": 0 \n\ + }, \n\ + \"initCals\": { \n\ + \"calMask\": 862207, \n\ + \"channelMask\": 15, \n\ + \"warmBoot\": 0 \n\ + }, \n\ + \"calRsltsFile\": null, \n\ + \"checkFwVer\": 0 \n\ +}\n"; diff --git a/projects/adrv904x/src/common/firmware/DeviceProfileTest.h b/projects/adrv904x/src/common/firmware/DeviceProfileTest.h new file mode 100644 index 00000000000..815aaeb3dd5 --- /dev/null +++ b/projects/adrv904x/src/common/firmware/DeviceProfileTest.h @@ -0,0 +1,4757 @@ +/***************************************************************************//** + * @file DeviceProfileTest.h.h + * @brief Koror device profile stream binary. + * @author George Mois (george.mois@analog.com) +******************************************************************************** + * Copyright 2023(c) Analog Devices, Inc. + * + * 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 Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights + * of one or more patent holders. This license does not release you + * from the requirement that you obtain separate licenses from these + * patent holders to use this software. + * - Use of the software either in source or binary form, must be run + * on or directly connected to an Analog Devices Inc. component. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, 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 DEVICE_PROFILE_TEST_H +#define DEVICE_PROFILE_TEST_H + +unsigned char DeviceProfileTest_bin[] = { + 0x02, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x00, + 0x00, 0xc0, 0x03, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x80, 0x07, 0x00, + 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0xbf, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x20, 0xa1, + 0x07, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x01, 0x01, 0x00, 0x00, 0x80, 0xae, + 0xd2, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x80, 0xae, 0xd2, 0xc0, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x01, 0x01, 0x01, 0x01, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x1a, 0x06, 0x00, 0x08, 0x73, 0x39, 0x00, + 0x40, 0x0d, 0x03, 0x00, 0x80, 0x1a, 0x06, 0x00, 0x00, 0x00, 0x2d, 0x00, + 0x00, 0x80, 0x07, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x80, 0x07, 0x00, + 0x00, 0x80, 0x07, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x08, 0x73, 0x39, 0x00, 0x80, 0x1a, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x80, 0x07, 0x00, 0x01, + 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfd, + 0xff, 0x06, 0x00, 0xf4, 0xff, 0x15, 0x00, 0xd5, 0xff, 0x8c, 0x00, 0x87, + 0xfd, 0x13, 0x44, 0x87, 0xfd, 0x8c, 0x00, 0xd5, 0xff, 0x15, 0x00, 0xf4, + 0xff, 0x06, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x1a, 0x06, 0x00, 0x08, 0x73, 0x39, 0x00, 0x80, 0x1a, 0x06, 0x00, + 0x00, 0x80, 0x16, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x00, 0x08, 0x73, 0x39, 0x00, 0x80, 0x1a, 0x06, + 0x00, 0x80, 0x1a, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x0a, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x40, 0x0b, 0x00, 0x01, 0x00, 0xff, + 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x16, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, + 0x02, 0x00, 0x00, 0x09, 0x09, 0x33, 0x33, 0x0d, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x26, 0x06, 0x00, 0x16, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, + 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x09, 0x09, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x03, 0x00, 0x00, 0x1e, 0x00, 0xf2, 0xff, 0x0e, 0x00, 0xf7, 0xff, + 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0xd7, 0xff, 0xb0, 0x00, 0xbc, 0xfd, + 0x59, 0x08, 0x50, 0xaf, 0x2d, 0x0c, 0xea, 0xfd, 0x0d, 0xff, 0x8f, 0x01, + 0x6f, 0xfe, 0x5d, 0x01, 0xed, 0xfe, 0xc7, 0x00, 0x7d, 0xff, 0x4e, 0x00, + 0xee, 0xff, 0x0d, 0x00, 0xe2, 0xff, 0x0e, 0x00, 0xf2, 0xff, 0x09, 0x00, + 0xff, 0xff, 0xf9, 0xff, 0x00, 0x00, 0x29, 0x00, 0x50, 0xff, 0x44, 0x02, + 0xa7, 0xf7, 0xb0, 0x50, 0xd3, 0xf3, 0x16, 0x02, 0xf3, 0x00, 0x71, 0xfe, + 0x91, 0x01, 0xa3, 0xfe, 0x13, 0x01, 0x39, 0xff, 0x83, 0x00, 0xb2, 0xff, + 0x12, 0x00, 0xf3, 0xff, 0x01, 0x03, 0x00, 0x00, 0x1e, 0x00, 0xf2, 0xff, + 0x0e, 0x00, 0xf7, 0xff, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0xd7, 0xff, + 0xb0, 0x00, 0xbc, 0xfd, 0x59, 0x08, 0x50, 0xaf, 0x2d, 0x0c, 0xea, 0xfd, + 0x0d, 0xff, 0x8f, 0x01, 0x6f, 0xfe, 0x5d, 0x01, 0xed, 0xfe, 0xc7, 0x00, + 0x7d, 0xff, 0x4e, 0x00, 0xee, 0xff, 0x0d, 0x00, 0xe2, 0xff, 0x0e, 0x00, + 0xf2, 0xff, 0x09, 0x00, 0xff, 0xff, 0xf9, 0xff, 0x00, 0x00, 0x29, 0x00, + 0x50, 0xff, 0x44, 0x02, 0xa7, 0xf7, 0xb0, 0x50, 0xd3, 0xf3, 0x16, 0x02, + 0xf3, 0x00, 0x71, 0xfe, 0x91, 0x01, 0xa3, 0xfe, 0x13, 0x01, 0x39, 0xff, + 0x83, 0x00, 0xb2, 0xff, 0x12, 0x00, 0xf3, 0xff, 0x01, 0x03, 0x00, 0x00, + 0x1e, 0x00, 0xf2, 0xff, 0x0e, 0x00, 0xf7, 0xff, 0x01, 0x00, 0x07, 0x00, + 0x00, 0x00, 0xd7, 0xff, 0xb0, 0x00, 0xbc, 0xfd, 0x59, 0x08, 0x50, 0xaf, + 0x2d, 0x0c, 0xea, 0xfd, 0x0d, 0xff, 0x8f, 0x01, 0x6f, 0xfe, 0x5d, 0x01, + 0xed, 0xfe, 0xc7, 0x00, 0x7d, 0xff, 0x4e, 0x00, 0xee, 0xff, 0x0d, 0x00, + 0xe2, 0xff, 0x0e, 0x00, 0xf2, 0xff, 0x09, 0x00, 0xff, 0xff, 0xf9, 0xff, + 0x00, 0x00, 0x29, 0x00, 0x50, 0xff, 0x44, 0x02, 0xa7, 0xf7, 0xb0, 0x50, + 0xd3, 0xf3, 0x16, 0x02, 0xf3, 0x00, 0x71, 0xfe, 0x91, 0x01, 0xa3, 0xfe, + 0x13, 0x01, 0x39, 0xff, 0x83, 0x00, 0xb2, 0xff, 0x12, 0x00, 0xf3, 0xff, + 0x01, 0x03, 0x00, 0x00, 0x1e, 0x00, 0xf2, 0xff, 0x0e, 0x00, 0xf7, 0xff, + 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0xd7, 0xff, 0xb0, 0x00, 0xbc, 0xfd, + 0x59, 0x08, 0x50, 0xaf, 0x2d, 0x0c, 0xea, 0xfd, 0x0d, 0xff, 0x8f, 0x01, + 0x6f, 0xfe, 0x5d, 0x01, 0xed, 0xfe, 0xc7, 0x00, 0x7d, 0xff, 0x4e, 0x00, + 0xee, 0xff, 0x0d, 0x00, 0xe2, 0xff, 0x0e, 0x00, 0xf2, 0xff, 0x09, 0x00, + 0xff, 0xff, 0xf9, 0xff, 0x00, 0x00, 0x29, 0x00, 0x50, 0xff, 0x44, 0x02, + 0xa7, 0xf7, 0xb0, 0x50, 0xd3, 0xf3, 0x16, 0x02, 0xf3, 0x00, 0x71, 0xfe, + 0x91, 0x01, 0xa3, 0xfe, 0x13, 0x01, 0x39, 0xff, 0x83, 0x00, 0xb2, 0xff, + 0x12, 0x00, 0xf3, 0xff, 0x01, 0x03, 0x00, 0x00, 0x1e, 0x00, 0xf2, 0xff, + 0x0e, 0x00, 0xf7, 0xff, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0xd7, 0xff, + 0xb0, 0x00, 0xbc, 0xfd, 0x59, 0x08, 0x50, 0xaf, 0x2d, 0x0c, 0xea, 0xfd, + 0x0d, 0xff, 0x8f, 0x01, 0x6f, 0xfe, 0x5d, 0x01, 0xed, 0xfe, 0xc7, 0x00, + 0x7d, 0xff, 0x4e, 0x00, 0xee, 0xff, 0x0d, 0x00, 0xe2, 0xff, 0x0e, 0x00, + 0xf2, 0xff, 0x09, 0x00, 0xff, 0xff, 0xf9, 0xff, 0x00, 0x00, 0x29, 0x00, + 0x50, 0xff, 0x44, 0x02, 0xa7, 0xf7, 0xb0, 0x50, 0xd3, 0xf3, 0x16, 0x02, + 0xf3, 0x00, 0x71, 0xfe, 0x91, 0x01, 0xa3, 0xfe, 0x13, 0x01, 0x39, 0xff, + 0x83, 0x00, 0xb2, 0xff, 0x12, 0x00, 0xf3, 0xff, 0x01, 0x03, 0x00, 0x00, + 0x1e, 0x00, 0xf2, 0xff, 0x0e, 0x00, 0xf7, 0xff, 0x01, 0x00, 0x07, 0x00, + 0x00, 0x00, 0xd7, 0xff, 0xb0, 0x00, 0xbc, 0xfd, 0x59, 0x08, 0x50, 0xaf, + 0x2d, 0x0c, 0xea, 0xfd, 0x0d, 0xff, 0x8f, 0x01, 0x6f, 0xfe, 0x5d, 0x01, + 0xed, 0xfe, 0xc7, 0x00, 0x7d, 0xff, 0x4e, 0x00, 0xee, 0xff, 0x0d, 0x00, + 0xe2, 0xff, 0x0e, 0x00, 0xf2, 0xff, 0x09, 0x00, 0xff, 0xff, 0xf9, 0xff, + 0x00, 0x00, 0x29, 0x00, 0x50, 0xff, 0x44, 0x02, 0xa7, 0xf7, 0xb0, 0x50, + 0xd3, 0xf3, 0x16, 0x02, 0xf3, 0x00, 0x71, 0xfe, 0x91, 0x01, 0xa3, 0xfe, + 0x13, 0x01, 0x39, 0xff, 0x83, 0x00, 0xb2, 0xff, 0x12, 0x00, 0xf3, 0xff, + 0x01, 0x03, 0x00, 0x00, 0x1e, 0x00, 0xf2, 0xff, 0x0e, 0x00, 0xf7, 0xff, + 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0xd7, 0xff, 0xb0, 0x00, 0xbc, 0xfd, + 0x59, 0x08, 0x50, 0xaf, 0x2d, 0x0c, 0xea, 0xfd, 0x0d, 0xff, 0x8f, 0x01, + 0x6f, 0xfe, 0x5d, 0x01, 0xed, 0xfe, 0xc7, 0x00, 0x7d, 0xff, 0x4e, 0x00, + 0xee, 0xff, 0x0d, 0x00, 0xe2, 0xff, 0x0e, 0x00, 0xf2, 0xff, 0x09, 0x00, + 0xff, 0xff, 0xf9, 0xff, 0x00, 0x00, 0x29, 0x00, 0x50, 0xff, 0x44, 0x02, + 0xa7, 0xf7, 0xb0, 0x50, 0xd3, 0xf3, 0x16, 0x02, 0xf3, 0x00, 0x71, 0xfe, + 0x91, 0x01, 0xa3, 0xfe, 0x13, 0x01, 0x39, 0xff, 0x83, 0x00, 0xb2, 0xff, + 0x12, 0x00, 0xf3, 0xff, 0x01, 0x03, 0x00, 0x00, 0x1e, 0x00, 0xf2, 0xff, + 0x0e, 0x00, 0xf7, 0xff, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0xd7, 0xff, + 0xb0, 0x00, 0xbc, 0xfd, 0x59, 0x08, 0x50, 0xaf, 0x2d, 0x0c, 0xea, 0xfd, + 0x0d, 0xff, 0x8f, 0x01, 0x6f, 0xfe, 0x5d, 0x01, 0xed, 0xfe, 0xc7, 0x00, + 0x7d, 0xff, 0x4e, 0x00, 0xee, 0xff, 0x0d, 0x00, 0xe2, 0xff, 0x0e, 0x00, + 0xf2, 0xff, 0x09, 0x00, 0xff, 0xff, 0xf9, 0xff, 0x00, 0x00, 0x29, 0x00, + 0x50, 0xff, 0x44, 0x02, 0xa7, 0xf7, 0xb0, 0x50, 0xd3, 0xf3, 0x16, 0x02, + 0xf3, 0x00, 0x71, 0xfe, 0x91, 0x01, 0xa3, 0xfe, 0x13, 0x01, 0x39, 0xff, + 0x83, 0x00, 0xb2, 0xff, 0x12, 0x00, 0xf3, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x33, 0x33, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5a, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x0f, 0x00, + 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, + 0x06, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x00, 0x00, 0xdf, 0x0d, 0xc6, 0xff, 0x19, 0x7f, 0x00, 0x00, 0xdf, + 0x0d, 0xc6, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x19, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5d, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x33, 0x0d, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x80, 0x07, 0x00, + 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, + 0x00, 0x00, 0x0f, 0x00, 0x06, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0xdf, 0x0d, 0xc6, 0xff, 0x19, + 0x7f, 0x00, 0x00, 0xdf, 0x0d, 0xc6, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x7f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, + 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x66, 0xe3, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x03, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x10, 0x3f, 0x04, 0x10, 0x01, 0x01, 0xff, 0x00, 0x00, 0x62, + 0x00, 0x03, 0x01, 0x00, 0x05, 0x06, 0x04, 0x07, 0x02, 0x03, 0x01, 0x00, + 0x00, 0x01, 0x04, 0x05, 0x08, 0x09, 0x0c, 0x0d, 0x10, 0x11, 0x14, 0x15, + 0x18, 0x19, 0x1c, 0x1d, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x80, + 0xf7, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x10, 0x3f, 0x04, 0x10, 0x01, 0x01, 0xff, 0x00, 0x00, 0x60, + 0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x07, 0x06, 0x05, 0x04, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x07, + 0x00, 0x00, 0x80, 0xf7, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3b, 0x00, 0x00, 0x00, 0x11, 0x04, 0x79, 0x01, 0x7b, 0x01, 0xd8, + 0x00, 0xd9, 0x01, 0xda, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x01, 0x01, 0x30, 0x04, 0x44, 0x03, 0x48, 0x07, 0x49, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x40, 0x00, 0x02, + 0x01, 0x01, 0x40, 0x00, 0x02, 0x02, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x44, 0x52, 0x56, 0x39, 0x30, 0x34, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc9, 0xd1, 0x61, 0x5b, + 0x00, 0x80, 0x07, 0x00, 0x80, 0x1a, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, + 0x00, 0x80, 0x1a, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, + 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x0f, 0x0f, 0x1e, 0x1e, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x02, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0x0f, 0x0f, 0x1e, 0x1e, 0x1e, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x20, 0x0b, 0x0c, 0x00, 0x00, + 0x03, 0x02, 0x00, 0x28, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x70, 0x00, 0xe0, 0x00, 0x02, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2a, 0x92, 0x10, 0xc7, 0xd1, 0xe9, 0xdc, 0x16, + 0x3b, 0x18, 0x9f, 0xfd, 0x95, 0xb9, 0xe6, 0x24, 0x39, 0x13, 0xf7, 0xcc, + 0x02, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x8d, 0xda, 0x34, 0xe4, 0x46, 0x71, 0x5d, 0xc8, + 0xa4, 0x08, 0x00, 0xc0, 0x2d, 0x59, 0x32, 0x2b, 0x02, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd1, 0xe9, 0xdc, 0x16, 0x3b, 0x18, 0x9f, 0xfd, + 0x95, 0xb9, 0xe6, 0x24, 0x39, 0x13, 0xf7, 0xcc, 0x02, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x32, 0xc1, 0xba, 0xa5, 0x9d, 0xde, 0x21, 0x12, 0xd7, 0xf6, 0x10, 0xaf, + 0xfb, 0x74, 0x2a, 0x41, 0x01, 0x01, 0x01, 0x00, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x43, 0x70, 0x75, 0x4d, 0x65, 0x6d, 0x44, 0x75, 0x6d, 0x70, + 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xac, 0xb7, 0x4f, 0x9a, 0xf2, 0x5e, 0xd2, 0x96, 0xdd, 0xa8, + 0xa8, 0x75, 0xac, 0xdb, 0xa4, 0xf2, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0xfe, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00 +}; + +unsigned int profile_bin_len = 56505; + +#endif + diff --git a/projects/adrv904x/src/common/firmware/stream_image.h b/projects/adrv904x/src/common/firmware/stream_image.h new file mode 100644 index 00000000000..6105af49ace --- /dev/null +++ b/projects/adrv904x/src/common/firmware/stream_image.h @@ -0,0 +1,7557 @@ +/***************************************************************************//** + * @file stream_image.h + * @brief Koror stream binary. + * @author George Mois (george.mois@analog.com) +******************************************************************************** + * Copyright 2023(c) Analog Devices, Inc. + * + * 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 Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights + * of one or more patent holders. This license does not release you + * from the requirement that you obtain separate licenses from these + * patent holders to use this software. + * - Use of the software either in source or binary form, must be run + * on or directly connected to an Analog Devices Inc. component. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, 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 STREAM_IMAGE_H +#define STREAM_IMAGE_H + +unsigned char stream_image_bin[] = { + 0x39, 0x30, 0x34, 0x30, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x7c, 0x02, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x90, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0xc0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, + 0x00, 0xe8, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x18, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x01, 0x08, + 0x00, 0x55, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, + 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0b, + 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, + 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0d, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x01, 0xfa, 0x00, 0x00, 0x03, 0x06, 0x02, 0x06, 0x02, + 0xd6, 0x06, 0x80, 0x10, 0x48, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x01, 0xff, + 0x00, 0x00, 0xa0, 0x46, 0x8c, 0x02, 0xa0, 0x46, 0xff, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x8c, 0x0a, 0xa0, 0x46, 0xdc, 0x1b, 0xa0, 0x46, + 0x30, 0x16, 0xa0, 0x46, 0xf8, 0x29, 0xa0, 0x46, 0x40, 0x16, 0xa0, 0x46, + 0x00, 0x2a, 0xa0, 0x46, 0x38, 0x16, 0xa0, 0x46, 0xfc, 0x29, 0xa0, 0x46, + 0x4c, 0x16, 0xa0, 0x46, 0x0c, 0x2a, 0xa0, 0x46, 0x90, 0x0a, 0xa0, 0x46, + 0xe0, 0x1b, 0xa0, 0x46, 0xb4, 0x0a, 0xa0, 0x46, 0x14, 0x1c, 0xa0, 0x46, + 0xd8, 0x0a, 0xa0, 0x46, 0x48, 0x1c, 0xa0, 0x46, 0xfc, 0x0a, 0xa0, 0x46, + 0x7c, 0x1c, 0xa0, 0x46, 0x20, 0x0b, 0xa0, 0x46, 0xb0, 0x1c, 0xa0, 0x46, + 0x44, 0x0b, 0xa0, 0x46, 0xe4, 0x1c, 0xa0, 0x46, 0x68, 0x0b, 0xa0, 0x46, + 0x18, 0x1d, 0xa0, 0x46, 0x8c, 0x0b, 0xa0, 0x46, 0x4c, 0x1d, 0xa0, 0x46, + 0xb0, 0x0b, 0xa0, 0x46, 0x80, 0x1d, 0xa0, 0x46, 0xc4, 0x0b, 0xa0, 0x46, + 0x9c, 0x1d, 0xa0, 0x46, 0xd8, 0x0b, 0xa0, 0x46, 0xbc, 0x1d, 0xa0, 0x46, + 0xec, 0x0b, 0xa0, 0x46, 0xdc, 0x1d, 0xa0, 0x46, 0x00, 0x0c, 0xa0, 0x46, + 0xfc, 0x1d, 0xa0, 0x46, 0x14, 0x0c, 0xa0, 0x46, 0x18, 0x1e, 0xa0, 0x46, + 0x28, 0x0c, 0xa0, 0x46, 0x38, 0x1e, 0xa0, 0x46, 0x3c, 0x0c, 0xa0, 0x46, + 0x58, 0x1e, 0xa0, 0x46, 0x50, 0x0c, 0xa0, 0x46, 0x78, 0x1e, 0xa0, 0x46, + 0x68, 0x0c, 0xa0, 0x46, 0x98, 0x1e, 0xa0, 0x46, 0x80, 0x0c, 0xa0, 0x46, + 0xb8, 0x1e, 0xa0, 0x46, 0x98, 0x0c, 0xa0, 0x46, 0xd8, 0x1e, 0xa0, 0x46, + 0xb0, 0x0c, 0xa0, 0x46, 0xf8, 0x1e, 0xa0, 0x46, 0xc8, 0x0c, 0xa0, 0x46, + 0x18, 0x1f, 0xa0, 0x46, 0xe0, 0x0c, 0xa0, 0x46, 0x38, 0x1f, 0xa0, 0x46, + 0xf8, 0x0c, 0xa0, 0x46, 0x58, 0x1f, 0xa0, 0x46, 0x10, 0x0d, 0xa0, 0x46, + 0x78, 0x1f, 0xa0, 0x46, 0x18, 0x0d, 0xa0, 0x46, 0x80, 0x1f, 0xa0, 0x46, + 0x20, 0x0d, 0xa0, 0x46, 0x88, 0x1f, 0xa0, 0x46, 0x28, 0x0d, 0xa0, 0x46, + 0x90, 0x1f, 0xa0, 0x46, 0x30, 0x0d, 0xa0, 0x46, 0x98, 0x1f, 0xa0, 0x46, + 0x38, 0x0d, 0xa0, 0x46, 0xa0, 0x1f, 0xa0, 0x46, 0x40, 0x0d, 0xa0, 0x46, + 0xa8, 0x1f, 0xa0, 0x46, 0x48, 0x0d, 0xa0, 0x46, 0xb0, 0x1f, 0xa0, 0x46, + 0x50, 0x0d, 0xa0, 0x46, 0xb8, 0x1f, 0xa0, 0x46, 0x5c, 0x0d, 0xa0, 0x46, + 0xc4, 0x1f, 0xa0, 0x46, 0x18, 0x0f, 0xa0, 0x46, 0xe0, 0x21, 0xa0, 0x46, + 0xec, 0x17, 0xa0, 0x46, 0x40, 0x2b, 0xa0, 0x46, 0x68, 0x0d, 0xa0, 0x46, + 0xd0, 0x1f, 0xa0, 0x46, 0x74, 0x0d, 0xa0, 0x46, 0xdc, 0x1f, 0xa0, 0x46, + 0x80, 0x0d, 0xa0, 0x46, 0xe8, 0x1f, 0xa0, 0x46, 0x8c, 0x0d, 0xa0, 0x46, + 0xf4, 0x1f, 0xa0, 0x46, 0x98, 0x0d, 0xa0, 0x46, 0x00, 0x20, 0xa0, 0x46, + 0xa0, 0x0d, 0xa0, 0x46, 0x0c, 0x20, 0xa0, 0x46, 0xa8, 0x0d, 0xa0, 0x46, + 0x18, 0x20, 0xa0, 0x46, 0xb0, 0x0d, 0xa0, 0x46, 0x24, 0x20, 0xa0, 0x46, + 0xb8, 0x0d, 0xa0, 0x46, 0x30, 0x20, 0xa0, 0x46, 0xc0, 0x0d, 0xa0, 0x46, + 0x3c, 0x20, 0xa0, 0x46, 0xc8, 0x0d, 0xa0, 0x46, 0x48, 0x20, 0xa0, 0x46, + 0xd0, 0x0d, 0xa0, 0x46, 0x54, 0x20, 0xa0, 0x46, 0xd8, 0x0d, 0xa0, 0x46, + 0x60, 0x20, 0xa0, 0x46, 0xe0, 0x0d, 0xa0, 0x46, 0x6c, 0x20, 0xa0, 0x46, + 0xe8, 0x0d, 0xa0, 0x46, 0x78, 0x20, 0xa0, 0x46, 0xf0, 0x0d, 0xa0, 0x46, + 0x84, 0x20, 0xa0, 0x46, 0xf8, 0x0d, 0xa0, 0x46, 0x90, 0x20, 0xa0, 0x46, + 0x00, 0x0e, 0xa0, 0x46, 0x9c, 0x20, 0xa0, 0x46, 0x08, 0x0e, 0xa0, 0x46, + 0xa8, 0x20, 0xa0, 0x46, 0x10, 0x0e, 0xa0, 0x46, 0xb4, 0x20, 0xa0, 0x46, + 0x18, 0x0e, 0xa0, 0x46, 0xc0, 0x20, 0xa0, 0x46, 0x20, 0x0e, 0xa0, 0x46, + 0xcc, 0x20, 0xa0, 0x46, 0x28, 0x0e, 0xa0, 0x46, 0xd8, 0x20, 0xa0, 0x46, + 0x30, 0x0e, 0xa0, 0x46, 0xe4, 0x20, 0xa0, 0x46, 0x38, 0x0e, 0xa0, 0x46, + 0xf0, 0x20, 0xa0, 0x46, 0x40, 0x0e, 0xa0, 0x46, 0xfc, 0x20, 0xa0, 0x46, + 0x48, 0x0e, 0xa0, 0x46, 0x08, 0x21, 0xa0, 0x46, 0x50, 0x0e, 0xa0, 0x46, + 0x14, 0x21, 0xa0, 0x46, 0x58, 0x0e, 0xa0, 0x46, 0x20, 0x21, 0xa0, 0x46, + 0x60, 0x0e, 0xa0, 0x46, 0x28, 0x21, 0xa0, 0x46, 0x68, 0x0e, 0xa0, 0x46, + 0x30, 0x21, 0xa0, 0x46, 0x70, 0x0e, 0xa0, 0x46, 0x38, 0x21, 0xa0, 0x46, + 0x78, 0x0e, 0xa0, 0x46, 0x40, 0x21, 0xa0, 0x46, 0x80, 0x0e, 0xa0, 0x46, + 0x48, 0x21, 0xa0, 0x46, 0x88, 0x0e, 0xa0, 0x46, 0x50, 0x21, 0xa0, 0x46, + 0x90, 0x0e, 0xa0, 0x46, 0x58, 0x21, 0xa0, 0x46, 0x98, 0x0e, 0xa0, 0x46, + 0x60, 0x21, 0xa0, 0x46, 0xa0, 0x0e, 0xa0, 0x46, 0x68, 0x21, 0xa0, 0x46, + 0xa8, 0x0e, 0xa0, 0x46, 0x70, 0x21, 0xa0, 0x46, 0xb0, 0x0e, 0xa0, 0x46, + 0x78, 0x21, 0xa0, 0x46, 0xb8, 0x0e, 0xa0, 0x46, 0x80, 0x21, 0xa0, 0x46, + 0xc0, 0x0e, 0xa0, 0x46, 0x88, 0x21, 0xa0, 0x46, 0xc8, 0x0e, 0xa0, 0x46, + 0x90, 0x21, 0xa0, 0x46, 0xd0, 0x0e, 0xa0, 0x46, 0x98, 0x21, 0xa0, 0x46, + 0xd8, 0x0e, 0xa0, 0x46, 0xa0, 0x21, 0xa0, 0x46, 0xe0, 0x0e, 0xa0, 0x46, + 0xa8, 0x21, 0xa0, 0x46, 0xe8, 0x0e, 0xa0, 0x46, 0xb0, 0x21, 0xa0, 0x46, + 0xf0, 0x0e, 0xa0, 0x46, 0xb8, 0x21, 0xa0, 0x46, 0xf8, 0x0e, 0xa0, 0x46, + 0xc0, 0x21, 0xa0, 0x46, 0x00, 0x0f, 0xa0, 0x46, 0xc8, 0x21, 0xa0, 0x46, + 0x08, 0x0f, 0xa0, 0x46, 0xd0, 0x21, 0xa0, 0x46, 0x10, 0x0f, 0xa0, 0x46, + 0xd8, 0x21, 0xa0, 0x46, 0xb4, 0x18, 0xa0, 0x46, 0xe4, 0x2b, 0xa0, 0x46, + 0x4c, 0x18, 0xa0, 0x46, 0x8c, 0x2b, 0xa0, 0x46, 0xcc, 0x17, 0xa0, 0x46, + 0x18, 0x2b, 0xa0, 0x46, 0xdc, 0x17, 0xa0, 0x46, 0x2c, 0x2b, 0xa0, 0x46, + 0xd0, 0x1a, 0xa0, 0x46, 0x9c, 0x2d, 0xa0, 0x46, 0xd4, 0x1a, 0xa0, 0x46, + 0xa4, 0x2d, 0xa0, 0x46, 0xd8, 0x1a, 0xa0, 0x46, 0xac, 0x2d, 0xa0, 0x46, + 0xdc, 0x1a, 0xa0, 0x46, 0xb4, 0x2d, 0xa0, 0x46, 0xe0, 0x1a, 0xa0, 0x46, + 0xbc, 0x2d, 0xa0, 0x46, 0xe4, 0x1a, 0xa0, 0x46, 0xc4, 0x2d, 0xa0, 0x46, + 0xe8, 0x1a, 0xa0, 0x46, 0xcc, 0x2d, 0xa0, 0x46, 0xec, 0x1a, 0xa0, 0x46, + 0xd4, 0x2d, 0xa0, 0x46, 0x7c, 0x12, 0xa0, 0x46, 0x18, 0x26, 0xa0, 0x46, + 0x88, 0x12, 0xa0, 0x46, 0x24, 0x26, 0xa0, 0x46, 0x94, 0x12, 0xa0, 0x46, + 0x30, 0x26, 0xa0, 0x46, 0xa0, 0x12, 0xa0, 0x46, 0x3c, 0x26, 0xa0, 0x46, + 0x60, 0x16, 0xa0, 0x46, 0x1c, 0x2a, 0xa0, 0x46, 0xac, 0x16, 0xa0, 0x46, + 0x54, 0x2a, 0xa0, 0x46, 0x88, 0x19, 0xa0, 0x46, 0xa0, 0x2c, 0xa0, 0x46, + 0xb8, 0x18, 0xa0, 0x46, 0xe8, 0x2b, 0xa0, 0x46, 0x2c, 0x0f, 0xa0, 0x46, + 0xf0, 0x21, 0xa0, 0x46, 0x3c, 0x0f, 0xa0, 0x46, 0xfc, 0x21, 0xa0, 0x46, + 0x50, 0x0f, 0xa0, 0x46, 0x10, 0x22, 0xa0, 0x46, 0x64, 0x0f, 0xa0, 0x46, + 0x24, 0x22, 0xa0, 0x46, 0x9c, 0x0f, 0xa0, 0x46, 0x40, 0x22, 0xa0, 0x46, + 0xd8, 0x0f, 0xa0, 0x46, 0x70, 0x22, 0xa0, 0x46, 0xe0, 0x0f, 0xa0, 0x46, + 0x74, 0x22, 0xa0, 0x46, 0xfc, 0x0f, 0xa0, 0x46, 0x94, 0x22, 0xa0, 0x46, + 0x1c, 0x10, 0xa0, 0x46, 0xb0, 0x22, 0xa0, 0x46, 0x3c, 0x10, 0xa0, 0x46, + 0xcc, 0x22, 0xa0, 0x46, 0x50, 0x10, 0xa0, 0x46, 0xdc, 0x22, 0xa0, 0x46, + 0x54, 0x10, 0xa0, 0x46, 0xe0, 0x22, 0xa0, 0x46, 0x48, 0x12, 0xa0, 0x46, + 0xe8, 0x25, 0xa0, 0x46, 0x58, 0x12, 0xa0, 0x46, 0xfc, 0x25, 0xa0, 0x46, + 0x68, 0x12, 0xa0, 0x46, 0x08, 0x26, 0xa0, 0x46, 0x08, 0x16, 0xa0, 0x46, + 0xc8, 0x29, 0xa0, 0x46, 0x10, 0x16, 0xa0, 0x46, 0xd0, 0x29, 0xa0, 0x46, + 0xa8, 0x1b, 0xa0, 0x46, 0x8c, 0x2e, 0xa0, 0x46, 0xac, 0x1b, 0xa0, 0x46, + 0x90, 0x2e, 0xa0, 0x46, 0xb0, 0x1b, 0xa0, 0x46, 0x94, 0x2e, 0xa0, 0x46, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4c, 0x1b, 0xa0, 0x46, 0x3c, 0x2e, 0xa0, 0x46, 0xcc, 0x1a, 0xa0, 0x46, + 0x98, 0x2d, 0xa0, 0x46, 0xc4, 0x1a, 0xa0, 0x46, 0x90, 0x2d, 0xa0, 0x46, + 0xd8, 0x1b, 0xa0, 0x46, 0xbc, 0x2e, 0xa0, 0x46, 0x18, 0x16, 0xa0, 0x46, + 0xd8, 0x29, 0xa0, 0x46, 0x24, 0x16, 0xa0, 0x46, 0xe8, 0x29, 0xa0, 0x46, + 0xe8, 0x15, 0xa0, 0x46, 0xa0, 0x29, 0xa0, 0x46, 0x14, 0x19, 0xa0, 0x46, + 0x48, 0x2c, 0xa0, 0x46, 0xd0, 0x15, 0xa0, 0x46, 0x84, 0x29, 0xa0, 0x46, + 0xfc, 0x15, 0xa0, 0x46, 0xb8, 0x29, 0xa0, 0x46, 0xf4, 0x15, 0xa0, 0x46, + 0xac, 0x29, 0xa0, 0x46, 0xd8, 0x15, 0xa0, 0x46, 0x8c, 0x29, 0xa0, 0x46, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x15, 0xa0, 0x46, 0x54, 0x29, 0xa0, 0x46, + 0xbc, 0x15, 0xa0, 0x46, 0x64, 0x29, 0xa0, 0x46, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6c, 0x1a, 0xa0, 0x46, 0x48, 0x2d, 0xa0, 0x46, + 0x54, 0x19, 0xa0, 0x46, 0x74, 0x2c, 0xa0, 0x46, 0x18, 0x1a, 0xa0, 0x46, + 0x08, 0x2d, 0xa0, 0x46, 0x8c, 0x14, 0xa0, 0x46, 0x30, 0x28, 0xa0, 0x46, + 0x9c, 0x14, 0xa0, 0x46, 0x4c, 0x28, 0xa0, 0x46, 0x48, 0x1b, 0xa0, 0x46, + 0x34, 0x2e, 0xa0, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x1b, 0xa0, 0x46, 0x84, 0x2e, 0xa0, 0x46, 0xa4, 0x1b, 0xa0, 0x46, + 0x88, 0x2e, 0xa0, 0x46, 0xb8, 0x1b, 0xa0, 0x46, 0x9c, 0x2e, 0xa0, 0x46, + 0xbc, 0x1b, 0xa0, 0x46, 0xa0, 0x2e, 0xa0, 0x46, 0xb4, 0x1b, 0xa0, 0x46, + 0x98, 0x2e, 0xa0, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x50, 0x1b, 0xa0, 0x46, 0x40, 0x2e, 0xa0, 0x46, + 0xc8, 0x1a, 0xa0, 0x46, 0x94, 0x2d, 0xa0, 0x46, 0xc0, 0x1a, 0xa0, 0x46, + 0x8c, 0x2d, 0xa0, 0x46, 0x9c, 0x1b, 0xa0, 0x46, 0x80, 0x2e, 0xa0, 0x46, + 0x24, 0x1b, 0xa0, 0x46, 0x10, 0x2e, 0xa0, 0x46, 0x28, 0x1b, 0xa0, 0x46, + 0x14, 0x2e, 0xa0, 0x46, 0x2c, 0x1b, 0xa0, 0x46, 0x18, 0x2e, 0xa0, 0x46, + 0x74, 0x15, 0xa0, 0x46, 0x04, 0x29, 0xa0, 0x46, 0x78, 0x15, 0xa0, 0x46, + 0x08, 0x29, 0xa0, 0x46, 0x58, 0x16, 0xa0, 0x46, 0x18, 0x2a, 0xa0, 0x46, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf8, 0x16, 0xa0, 0x46, 0x8c, 0x2a, 0xa0, 0x46, + 0x5c, 0x17, 0xa0, 0x46, 0xcc, 0x2a, 0xa0, 0x46, 0xc0, 0x17, 0xa0, 0x46, + 0x0c, 0x2b, 0xa0, 0x46, 0xc4, 0x17, 0xa0, 0x46, 0x10, 0x2b, 0xa0, 0x46, + 0xc8, 0x17, 0xa0, 0x46, 0x14, 0x2b, 0xa0, 0x46, 0x7c, 0x15, 0xa0, 0x46, + 0x0c, 0x29, 0xa0, 0x46, 0x98, 0x15, 0xa0, 0x46, 0x1c, 0x29, 0xa0, 0x46, + 0xa4, 0x15, 0xa0, 0x46, 0x34, 0x29, 0xa0, 0x46, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x15, 0xa0, 0x46, 0x6c, 0x29, 0xa0, 0x46, + 0xc8, 0x15, 0xa0, 0x46, 0x78, 0x29, 0xa0, 0x46, 0xb0, 0x15, 0xa0, 0x46, + 0x4c, 0x29, 0xa0, 0x46, 0xac, 0x18, 0xa0, 0x46, 0xdc, 0x2b, 0xa0, 0x46, + 0xb0, 0x18, 0xa0, 0x46, 0xe0, 0x2b, 0xa0, 0x46, 0xb8, 0x15, 0xa0, 0x46, + 0x5c, 0x29, 0xa0, 0x46, 0x10, 0x19, 0xa0, 0x46, 0x44, 0x2c, 0xa0, 0x46, + 0xac, 0x12, 0xa0, 0x46, 0x48, 0x26, 0xa0, 0x46, 0xc0, 0x12, 0xa0, 0x46, + 0x54, 0x26, 0xa0, 0x46, 0xe8, 0x12, 0xa0, 0x46, 0x64, 0x26, 0xa0, 0x46, + 0xf4, 0x12, 0xa0, 0x46, 0x74, 0x26, 0xa0, 0x46, 0x0c, 0x13, 0xa0, 0x46, + 0x9c, 0x26, 0xa0, 0x46, 0x18, 0x13, 0xa0, 0x46, 0xac, 0x26, 0xa0, 0x46, + 0x30, 0x13, 0xa0, 0x46, 0xd4, 0x26, 0xa0, 0x46, 0x48, 0x13, 0xa0, 0x46, + 0xe8, 0x26, 0xa0, 0x46, 0x70, 0x13, 0xa0, 0x46, 0xf8, 0x26, 0xa0, 0x46, + 0x8c, 0x13, 0xa0, 0x46, 0x08, 0x27, 0xa0, 0x46, 0x98, 0x13, 0xa0, 0x46, + 0x10, 0x27, 0xa0, 0x46, 0xa4, 0x13, 0xa0, 0x46, 0x18, 0x27, 0xa0, 0x46, + 0xac, 0x13, 0xa0, 0x46, 0x28, 0x27, 0xa0, 0x46, 0xb4, 0x13, 0xa0, 0x46, + 0x38, 0x27, 0xa0, 0x46, 0xbc, 0x13, 0xa0, 0x46, 0x48, 0x27, 0xa0, 0x46, + 0xc4, 0x13, 0xa0, 0x46, 0x58, 0x27, 0xa0, 0x46, 0xcc, 0x13, 0xa0, 0x46, + 0x64, 0x27, 0xa0, 0x46, 0xd4, 0x13, 0xa0, 0x46, 0x70, 0x27, 0xa0, 0x46, + 0x98, 0x1a, 0xa0, 0x46, 0x6c, 0x2d, 0xa0, 0x46, 0xdc, 0x13, 0xa0, 0x46, + 0x78, 0x27, 0xa0, 0x46, 0xe4, 0x13, 0xa0, 0x46, 0x84, 0x27, 0xa0, 0x46, + 0xec, 0x13, 0xa0, 0x46, 0x90, 0x27, 0xa0, 0x46, 0xf4, 0x13, 0xa0, 0x46, + 0x9c, 0x27, 0xa0, 0x46, 0x5c, 0x1a, 0xa0, 0x46, 0x40, 0x2d, 0xa0, 0x46, + 0xdc, 0x18, 0xa0, 0x46, 0x38, 0x2c, 0xa0, 0x46, 0x7c, 0x1a, 0xa0, 0x46, + 0x54, 0x2d, 0xa0, 0x46, 0x0c, 0x19, 0xa0, 0x46, 0x40, 0x2c, 0xa0, 0x46, + 0x94, 0x1a, 0xa0, 0x46, 0x68, 0x2d, 0xa0, 0x46, 0xf0, 0x1a, 0xa0, 0x46, + 0xdc, 0x2d, 0xa0, 0x46, 0xfc, 0x1a, 0xa0, 0x46, 0xe8, 0x2d, 0xa0, 0x46, + 0x30, 0x1b, 0xa0, 0x46, 0x1c, 0x2e, 0xa0, 0x46, 0x3c, 0x1b, 0xa0, 0x46, + 0x28, 0x2e, 0xa0, 0x46, 0x54, 0x1b, 0xa0, 0x46, 0x44, 0x2e, 0xa0, 0x46, + 0x7c, 0x1b, 0xa0, 0x46, 0x64, 0x2e, 0xa0, 0x46, 0x10, 0x1b, 0xa0, 0x46, + 0xfc, 0x2d, 0xa0, 0x46, 0x14, 0x1b, 0xa0, 0x46, 0x00, 0x2e, 0xa0, 0x46, + 0xfc, 0x13, 0xa0, 0x46, 0xa8, 0x27, 0xa0, 0x46, 0x0c, 0x14, 0xa0, 0x46, + 0xb8, 0x27, 0xa0, 0x46, 0x1c, 0x14, 0xa0, 0x46, 0xc8, 0x27, 0xa0, 0x46, + 0x50, 0x14, 0xa0, 0x46, 0xf4, 0x27, 0xa0, 0x46, 0x84, 0x14, 0xa0, 0x46, + 0x20, 0x28, 0xa0, 0x46, 0x94, 0x14, 0xa0, 0x46, 0x3c, 0x28, 0xa0, 0x46, + 0xa4, 0x14, 0xa0, 0x46, 0x58, 0x28, 0xa0, 0x46, 0xec, 0x14, 0xa0, 0x46, + 0x94, 0x28, 0xa0, 0x46, 0x34, 0x15, 0xa0, 0x46, 0xd0, 0x28, 0xa0, 0x46, + 0x54, 0x15, 0xa0, 0x46, 0xec, 0x28, 0xa0, 0x46, 0x48, 0x15, 0xa0, 0x46, + 0xe0, 0x28, 0xa0, 0x46, 0x18, 0x1b, 0xa0, 0x46, 0x04, 0x2e, 0xa0, 0x46, + 0x1c, 0x1b, 0xa0, 0x46, 0x08, 0x2e, 0xa0, 0x46, 0x20, 0x1b, 0xa0, 0x46, + 0x0c, 0x2e, 0xa0, 0x46, 0x5c, 0x15, 0xa0, 0x46, 0xf0, 0x28, 0xa0, 0x46, + 0x68, 0x15, 0xa0, 0x46, 0xfc, 0x28, 0xa0, 0x46, 0x08, 0x1b, 0xa0, 0x46, + 0xf4, 0x2d, 0xa0, 0x46, 0x0c, 0x1b, 0xa0, 0x46, 0xf8, 0x2d, 0xa0, 0x46, + 0xd0, 0x1b, 0xa0, 0x46, 0xb4, 0x2e, 0xa0, 0x46, 0xd4, 0x1b, 0xa0, 0x46, + 0xb8, 0x2e, 0xa0, 0x46, 0xc8, 0x1b, 0xa0, 0x46, 0xac, 0x2e, 0xa0, 0x46, + 0xcc, 0x1b, 0xa0, 0x46, 0xb0, 0x2e, 0xa0, 0x46, 0xc0, 0x1b, 0xa0, 0x46, + 0xa4, 0x2e, 0xa0, 0x46, 0xc4, 0x1b, 0xa0, 0x46, 0xa8, 0x2e, 0xa0, 0x46, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xd6, 0x9c, 0xf9, 0x51, 0xa4, 0x81, 0xc5, + 0xc5, 0xff, 0x57, 0xfb, 0x53, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xd6, + 0x98, 0x99, 0x81, 0xc8, 0xfd, 0x55, 0xff, 0x57, 0xf9, 0x51, 0x81, 0x6d, + 0xad, 0xc4, 0xc6, 0x00, 0xce, 0xd6, 0x9c, 0xf9, 0x51, 0xa4, 0x81, 0xc5, + 0xc5, 0xff, 0x57, 0xfb, 0x53, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xd6, + 0x98, 0x99, 0x81, 0xc8, 0xfd, 0x55, 0xff, 0x57, 0xf9, 0x51, 0x81, 0x6d, + 0xad, 0xc4, 0xc6, 0x00, 0xce, 0xd6, 0x9c, 0xf9, 0x51, 0xa4, 0x81, 0xc5, + 0xc5, 0xff, 0x57, 0xfb, 0x53, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xd6, + 0x98, 0x99, 0x81, 0xc8, 0xfd, 0x55, 0xff, 0x57, 0xf9, 0x51, 0x81, 0x6d, + 0xad, 0xc4, 0xc6, 0x00, 0xce, 0xd6, 0x9c, 0xf9, 0x51, 0xa4, 0x81, 0xc5, + 0xc5, 0xff, 0x57, 0xfb, 0x53, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xd6, + 0x98, 0x99, 0x81, 0xc8, 0xfd, 0x55, 0xff, 0x57, 0xf9, 0x51, 0x81, 0x6d, + 0xad, 0xc4, 0xc6, 0x00, 0xce, 0xd6, 0x9c, 0xf9, 0x51, 0xa4, 0x81, 0xc5, + 0xc5, 0xff, 0x57, 0xfb, 0x53, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xd6, + 0x98, 0x99, 0x81, 0xc8, 0xfd, 0x55, 0xff, 0x57, 0xf9, 0x51, 0x81, 0x6d, + 0xad, 0xc4, 0xc6, 0x00, 0xce, 0xd6, 0x9c, 0xf9, 0x51, 0xa4, 0x81, 0xc5, + 0xc5, 0xff, 0x57, 0xfb, 0x53, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xd6, + 0x98, 0x99, 0x81, 0xc8, 0xfd, 0x55, 0xff, 0x57, 0xf9, 0x51, 0x81, 0x6d, + 0xad, 0xc4, 0xc6, 0x00, 0xce, 0xd6, 0x9c, 0xf9, 0x51, 0xa4, 0x81, 0xc5, + 0xc5, 0xff, 0x57, 0xfb, 0x53, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xd6, + 0x98, 0x99, 0x81, 0xc8, 0xfd, 0x55, 0xff, 0x57, 0xf9, 0x51, 0x81, 0x6d, + 0xad, 0xc4, 0xc6, 0x00, 0xce, 0xd6, 0x9c, 0xf9, 0x51, 0xa4, 0x81, 0xc5, + 0xc5, 0xff, 0x57, 0xfb, 0x53, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xd6, + 0x98, 0x99, 0x81, 0xc8, 0xfd, 0x55, 0xff, 0x57, 0xf9, 0x51, 0x81, 0x6d, + 0xad, 0xc4, 0xc6, 0x00, 0xce, 0xfa, 0x52, 0xfb, 0x53, 0xd6, 0xf0, 0xf9, + 0x51, 0x81, 0xc5, 0xd6, 0x98, 0xa9, 0xfe, 0x56, 0xa2, 0xc5, 0xc6, 0x00, + 0xce, 0xfa, 0x52, 0xfb, 0x53, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xd6, + 0x98, 0xc8, 0xa9, 0xfe, 0x56, 0xa2, 0xc5, 0xc6, 0xce, 0xfa, 0x52, 0xfb, + 0x53, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xd6, 0x98, 0xc8, 0xa9, 0xfe, + 0x56, 0xa2, 0xc5, 0xc6, 0xce, 0xfa, 0x52, 0xfb, 0x53, 0xd6, 0xf0, 0xf9, + 0x51, 0x81, 0xc5, 0xd6, 0x98, 0xc8, 0xa9, 0xfe, 0x56, 0xa2, 0xc5, 0xc6, + 0xce, 0xfa, 0x52, 0xfb, 0x53, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xd6, + 0x98, 0xa9, 0xfe, 0x56, 0xa2, 0xc5, 0xc6, 0x00, 0xce, 0xfa, 0x52, 0xfb, + 0x53, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xd6, 0x98, 0xc8, 0xa9, 0xfe, + 0x56, 0xa2, 0xc5, 0xc6, 0xce, 0xfa, 0x52, 0xfb, 0x53, 0xd6, 0xf0, 0xf9, + 0x51, 0x81, 0xc5, 0xd6, 0x98, 0xc8, 0xa9, 0xfe, 0x56, 0xa2, 0xc5, 0xc6, + 0xce, 0xfa, 0x52, 0xfb, 0x53, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xd6, + 0x98, 0xc8, 0xa9, 0xfe, 0x56, 0xa2, 0xc5, 0xc6, 0xce, 0xfa, 0x52, 0xff, + 0x57, 0xfb, 0x53, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xd6, 0x98, 0xf9, + 0x51, 0x81, 0x82, 0xc5, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xfa, 0x52, 0xff, + 0x57, 0xfb, 0x53, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xd6, 0x98, 0xf9, + 0x51, 0x81, 0x82, 0xc5, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xfa, 0x52, 0xff, + 0x57, 0xfb, 0x53, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xd6, 0x98, 0xf9, + 0x51, 0x81, 0x82, 0xc5, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xfa, 0x52, 0xff, + 0x57, 0xfb, 0x53, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xd6, 0x98, 0xf9, + 0x51, 0x81, 0x82, 0xc5, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xfa, 0x52, 0xff, + 0x57, 0xfb, 0x53, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xd6, 0x98, 0xf9, + 0x51, 0x81, 0x82, 0xc5, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xfa, 0x52, 0xff, + 0x57, 0xfb, 0x53, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xd6, 0x98, 0xf9, + 0x51, 0x81, 0x82, 0xc5, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xfa, 0x52, 0xff, + 0x57, 0xfb, 0x53, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xd6, 0x98, 0xf9, + 0x51, 0x81, 0x82, 0xc5, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xfa, 0x52, 0xff, + 0x57, 0xfb, 0x53, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xd6, 0x98, 0xf9, + 0x51, 0x81, 0x82, 0xc5, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xfb, 0x53, 0xc4, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xfb, 0x53, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xfb, 0x53, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xfb, 0x53, 0xc4, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xfb, 0x53, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xfb, 0x53, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xfb, 0x53, 0xc4, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xfb, 0x53, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x90, 0xa9, 0xd6, 0x98, 0x51, 0x81, 0xc5, 0xc4, 0xc6, 0x00, 0x00, + 0xce, 0x90, 0xa9, 0xd6, 0x98, 0xc8, 0x51, 0x81, 0xc5, 0xc4, 0xc6, 0x00, + 0xce, 0x90, 0xa9, 0xd6, 0x98, 0x51, 0x81, 0xc5, 0xc4, 0xc6, 0x00, 0x00, + 0xce, 0x90, 0xa9, 0xd6, 0x98, 0xc8, 0x51, 0x81, 0xc5, 0xc4, 0xc6, 0x00, + 0xce, 0xc4, 0xd6, 0x98, 0xf9, 0x51, 0x81, 0xc5, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xc4, 0xd6, 0x98, 0xf9, 0x51, 0x81, 0xc5, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x54, 0xfc, 0xc4, 0x50, 0xc4, 0xc6, 0x00, 0xce, 0x54, 0xfc, 0xc4, + 0x50, 0xc4, 0xc6, 0x00, 0xce, 0x54, 0xfc, 0xc4, 0x50, 0xc4, 0xc6, 0x00, + 0xce, 0x54, 0xfc, 0xc4, 0x50, 0xc4, 0xc6, 0x00, 0xce, 0x54, 0xfc, 0xc4, + 0x50, 0xc4, 0xc6, 0x00, 0xce, 0x54, 0xfc, 0xc4, 0x50, 0xc4, 0xc6, 0x00, + 0xce, 0x54, 0xfc, 0xc4, 0x50, 0xc4, 0xc6, 0x00, 0xce, 0x54, 0xfc, 0xc4, + 0x50, 0xc4, 0xc6, 0x00, 0xce, 0x54, 0xfc, 0xc4, 0x50, 0xc4, 0xc6, 0x00, + 0xce, 0x54, 0xfc, 0xc4, 0x50, 0xc4, 0xc6, 0x00, 0xce, 0x54, 0xfc, 0xc4, + 0x50, 0xc4, 0xc6, 0x00, 0xce, 0x54, 0xfc, 0xc4, 0x50, 0xc4, 0xc6, 0x00, + 0xce, 0x54, 0xfc, 0xc4, 0x50, 0xc4, 0xc6, 0x00, 0xce, 0x54, 0xfc, 0xc4, + 0x50, 0xc4, 0xc6, 0x00, 0xce, 0x54, 0xfc, 0xc4, 0x50, 0xc4, 0xc6, 0x00, + 0xce, 0x54, 0xfc, 0xc4, 0x50, 0xc4, 0xc6, 0x00, 0xce, 0x54, 0xfc, 0xc4, + 0x50, 0xc4, 0xc6, 0x00, 0xce, 0x54, 0xfc, 0xc4, 0x50, 0xc4, 0xc6, 0x00, + 0xce, 0x54, 0xfc, 0xc4, 0x50, 0xc4, 0xc6, 0x00, 0xce, 0x54, 0xfc, 0xc4, + 0x50, 0xc4, 0xc6, 0x00, 0xce, 0x54, 0xfc, 0xc4, 0x50, 0xc4, 0xc6, 0x00, + 0xce, 0x54, 0xfc, 0xc4, 0x50, 0xc4, 0xc6, 0x00, 0xce, 0x54, 0xfc, 0xc4, + 0x50, 0xc4, 0xc6, 0x00, 0xce, 0x54, 0xfc, 0xc4, 0x50, 0xc4, 0xc6, 0x00, + 0xce, 0x54, 0xfc, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x54, 0xfc, 0xc4, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x54, 0xfc, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x54, 0xfc, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x54, 0xfc, 0xc4, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x54, 0xfc, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x54, 0xfc, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x54, 0xfc, 0xc4, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x54, 0xfc, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x54, 0xfc, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x54, 0xfc, 0xc4, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x54, 0xfc, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x54, 0xfc, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x54, 0xfc, 0xc4, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x54, 0xfc, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x54, 0xfc, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x54, 0xfc, 0xc4, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x54, 0xfc, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x54, 0xfc, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x54, 0xfc, 0xc4, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x54, 0xfc, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x54, 0xfc, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x54, 0xfc, 0xc4, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x54, 0xfc, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x90, 0x50, 0x6e, 0xd7, 0xa6, 0x55, 0xfe, 0x56, 0xd0, 0xae, 0x90, + 0x50, 0x6e, 0xd7, 0x90, 0xe8, 0xc6, 0x00, 0x00, 0xce, 0x90, 0xc4, 0xc4, + 0xc4, 0xa1, 0x94, 0xc5, 0xc4, 0xd6, 0x9b, 0x90, 0x58, 0x83, 0xc5, 0xc6, + 0xce, 0x90, 0xc4, 0xc4, 0xc4, 0x50, 0x84, 0xab, 0x50, 0x81, 0x93, 0xc5, + 0xc4, 0xd6, 0x9b, 0x90, 0x50, 0x83, 0xc5, 0xc6, 0xce, 0x90, 0xc4, 0xc4, + 0xc4, 0x50, 0x84, 0xab, 0x50, 0x81, 0x93, 0xc5, 0xc4, 0xd6, 0x9b, 0x90, + 0x50, 0x83, 0xc5, 0xc6, 0xce, 0xd6, 0x52, 0xab, 0x51, 0x81, 0xad, 0xa3, + 0xc8, 0x81, 0xae, 0xa5, 0x6a, 0xd8, 0x51, 0x81, 0xad, 0xa6, 0x6a, 0xd8, + 0x51, 0x81, 0x8d, 0xaa, 0xfb, 0xa2, 0x55, 0x85, 0xad, 0xa4, 0x53, 0x83, + 0x8d, 0xa9, 0xa2, 0x83, 0x93, 0xc5, 0xa1, 0xaa, 0xa2, 0x55, 0x85, 0xad, + 0xa4, 0x53, 0x83, 0x8d, 0xa9, 0xa2, 0x83, 0x53, 0x93, 0xc5, 0xc6, 0x00, + 0xce, 0x90, 0xad, 0xd6, 0x9d, 0x90, 0x50, 0x85, 0xad, 0x90, 0x50, 0x82, + 0xc8, 0xac, 0x90, 0x50, 0x81, 0x8c, 0xd6, 0x48, 0x90, 0x50, 0x81, 0x8c, + 0x8d, 0xd6, 0x48, 0x90, 0xad, 0xd6, 0x9d, 0x90, 0x50, 0x85, 0xad, 0x90, + 0x50, 0x82, 0xc8, 0xac, 0x90, 0x50, 0x81, 0xc8, 0x8c, 0xd6, 0x48, 0x90, + 0x50, 0x81, 0xc8, 0x8c, 0x8d, 0xd6, 0x48, 0xcf, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x90, 0xa9, 0xaf, 0xa7, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xc1, 0xd6, + 0xc1, 0xc4, 0xc4, 0xcd, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xaa, 0xc4, 0xc8, + 0x8a, 0xaa, 0xc4, 0xc4, 0xc4, 0xd6, 0x90, 0x48, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xd6, 0xc1, 0xc4, 0xcd, 0xc4, 0xc4, 0xc4, 0xc4, 0x90, 0x50, 0x84, + 0xac, 0x90, 0x50, 0x81, 0x8c, 0xa9, 0xc4, 0xaa, 0xc4, 0xc8, 0x8a, 0xaa, + 0xc4, 0xc4, 0xd6, 0x90, 0x48, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xc1, 0xc4, + 0xcd, 0xc4, 0xc4, 0xc4, 0xc4, 0x90, 0x50, 0x84, 0xac, 0x90, 0x50, 0x81, + 0x8c, 0xa9, 0xc4, 0xaa, 0xc4, 0xc8, 0x8a, 0xaa, 0xc4, 0xc4, 0xd6, 0x90, + 0x48, 0xc6, 0x00, 0x00, 0xce, 0x90, 0xac, 0xad, 0xd6, 0x9d, 0x90, 0x50, + 0x85, 0xc8, 0xad, 0xd6, 0x9c, 0x90, 0x50, 0x84, 0x8d, 0xac, 0xc6, 0x00, + 0xce, 0xa2, 0xa9, 0xc6, 0xce, 0x90, 0xad, 0xae, 0xfe, 0xd6, 0xd0, 0xd0, + 0xd6, 0xd0, 0xd0, 0xd6, 0xd0, 0xd0, 0xd6, 0xd0, 0xd0, 0xd6, 0xd0, 0xd0, + 0xd6, 0xd0, 0xd0, 0xd6, 0xd0, 0xd0, 0xd6, 0xd0, 0xd0, 0x56, 0xfe, 0xd6, + 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, + 0xd0, 0xd6, 0xd0, 0x56, 0xfe, 0xd6, 0xd0, 0xd0, 0xd6, 0xd0, 0xd0, 0x56, + 0xfe, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, + 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0x56, 0xfe, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, + 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, + 0xc1, 0xd6, 0xc1, 0xd6, 0x55, 0xfd, 0x56, 0xfe, 0xd0, 0xd6, 0x55, 0xfd, + 0x56, 0xfe, 0xd0, 0xd6, 0x55, 0xfd, 0x56, 0xfe, 0xd0, 0xd6, 0x55, 0xfd, + 0x56, 0xfe, 0xd0, 0xd6, 0x55, 0xfd, 0x56, 0xfe, 0xd0, 0xd6, 0x55, 0xfd, + 0x56, 0xfe, 0xd0, 0xd6, 0x55, 0xfd, 0x56, 0xfe, 0xd0, 0xd6, 0x55, 0xfd, + 0x56, 0xfe, 0xd0, 0x90, 0xa9, 0xaa, 0x51, 0xfa, 0x52, 0xc4, 0xd6, 0xc1, + 0xc1, 0xc4, 0xc4, 0x52, 0xd6, 0x4a, 0x4a, 0xfd, 0x55, 0xfe, 0x56, 0xd6, + 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, + 0xd0, 0xd6, 0xd0, 0xfe, 0x56, 0xd6, 0x55, 0xd0, 0xd6, 0x55, 0xd0, 0xd6, + 0x55, 0xd0, 0xd6, 0x55, 0xd0, 0xd6, 0x55, 0xd0, 0xd6, 0x55, 0xd0, 0xd6, + 0x55, 0xd0, 0xd6, 0x55, 0xd0, 0xd6, 0x50, 0x48, 0x50, 0x48, 0x50, 0x48, + 0x50, 0x48, 0x50, 0x48, 0x50, 0x48, 0x50, 0x48, 0x50, 0x48, 0x50, 0x48, + 0x50, 0x48, 0x50, 0x48, 0x50, 0x48, 0x50, 0x48, 0x50, 0x48, 0x50, 0x48, + 0x50, 0x48, 0x50, 0x52, 0xd6, 0xf9, 0x51, 0x08, 0x59, 0x0a, 0x59, 0x08, + 0x59, 0x0a, 0x59, 0x08, 0x59, 0x0a, 0x59, 0x08, 0x59, 0x0a, 0x59, 0x08, + 0x59, 0x0a, 0x59, 0x08, 0x59, 0x0a, 0x59, 0x08, 0x59, 0x0a, 0x59, 0x08, + 0x59, 0x0a, 0x59, 0x08, 0x59, 0x0a, 0x59, 0x08, 0x59, 0x0a, 0x59, 0x08, + 0x59, 0x0a, 0x59, 0x08, 0x59, 0x0a, 0x59, 0x08, 0x59, 0x0a, 0x59, 0x08, + 0x59, 0x0a, 0x59, 0x08, 0x59, 0x0a, 0x59, 0x08, 0x59, 0x0a, 0xfd, 0xfe, + 0x56, 0xd6, 0xd0, 0xd6, 0xd0, 0x50, 0xd6, 0x48, 0xf8, 0x50, 0xd6, 0xe8, + 0xd6, 0xe8, 0xd6, 0xe8, 0xd6, 0xe8, 0xd6, 0xe8, 0xd6, 0xe8, 0xd6, 0xe8, + 0xd6, 0xe8, 0x90, 0x50, 0xd6, 0xe8, 0xd6, 0xe8, 0xd6, 0xe8, 0xd6, 0xe8, + 0xd6, 0xe8, 0xd6, 0xe8, 0xd6, 0xe8, 0xd6, 0xe8, 0x90, 0xd6, 0xe8, 0xd6, + 0xe8, 0xd6, 0xe8, 0xd6, 0xe8, 0xd6, 0xe8, 0xd6, 0xe8, 0xd6, 0xe8, 0xd6, + 0xe8, 0x90, 0xd6, 0xe8, 0xd6, 0xe8, 0xd6, 0xe8, 0xd6, 0xe8, 0xd6, 0xe8, + 0xd6, 0xe8, 0xd6, 0xe8, 0xd6, 0xe8, 0x90, 0x50, 0xd6, 0xe8, 0xd6, 0xe8, + 0x50, 0xd6, 0x48, 0xd6, 0x48, 0xc4, 0x50, 0xd6, 0x48, 0x50, 0xd6, 0x48, + 0x50, 0xd6, 0x48, 0x50, 0xd6, 0x48, 0xfe, 0x55, 0x56, 0xd6, 0xd0, 0xd6, + 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, + 0xd0, 0xd6, 0x51, 0x41, 0x59, 0x41, 0x59, 0x41, 0x59, 0x41, 0x59, 0x41, + 0x59, 0x41, 0x59, 0x41, 0x59, 0x41, 0x59, 0x41, 0x59, 0x41, 0xd6, 0x51, + 0x41, 0x51, 0x41, 0xff, 0x57, 0xfd, 0x55, 0xc4, 0x50, 0xd6, 0x48, 0x48, + 0x50, 0xd6, 0x48, 0xd6, 0x90, 0xa9, 0x51, 0x50, 0x08, 0x59, 0xc8, 0x08, + 0x59, 0xc8, 0x08, 0x59, 0xc8, 0x08, 0x59, 0xc8, 0x08, 0x59, 0xc8, 0x08, + 0x59, 0xc8, 0x08, 0x59, 0xc8, 0x08, 0x59, 0x50, 0x08, 0xc6, 0x00, 0x00, + 0xce, 0x90, 0xac, 0xc4, 0xd6, 0x98, 0xc4, 0xc4, 0xc4, 0xd6, 0x9a, 0xc4, + 0xc4, 0xc4, 0xc6, 0x00, 0xce, 0x90, 0x50, 0x81, 0xac, 0xc4, 0xc4, 0x90, + 0x50, 0x81, 0xac, 0xc4, 0xc4, 0xc4, 0xc4, 0xc6, 0xce, 0x90, 0x50, 0x81, + 0xc8, 0xac, 0xc4, 0xc4, 0x90, 0x50, 0x81, 0xc8, 0xac, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x9c, 0x90, 0x50, 0x84, 0xac, 0xc4, + 0xc4, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x9c, 0x90, 0x50, 0x84, 0xac, 0xc4, + 0xc4, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x9c, 0x90, 0x50, 0x84, 0xac, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc6, 0xce, 0xd6, 0x9c, 0x90, 0x50, 0x84, 0xac, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc6, 0xce, 0x90, 0xaa, 0xab, 0xd6, 0x52, 0x50, 0x84, + 0x53, 0x7b, 0x6a, 0xaa, 0x90, 0xda, 0xab, 0x5a, 0xda, 0xaa, 0xa3, 0xc6, + 0xce, 0x90, 0xaa, 0x50, 0xd6, 0x52, 0x84, 0xfb, 0x53, 0x7b, 0x6a, 0xaa, + 0xda, 0xab, 0x5a, 0xda, 0xc8, 0x8b, 0xab, 0x5a, 0xda, 0xc8, 0x8b, 0xad, + 0x90, 0xab, 0x5a, 0xda, 0xab, 0x5a, 0xda, 0xc8, 0x8b, 0xab, 0x5a, 0xda, + 0xc8, 0x8b, 0xae, 0xc6, 0xce, 0xd6, 0x48, 0xd6, 0x9b, 0x90, 0x50, 0x83, + 0x8a, 0x48, 0xc6, 0x00, 0xce, 0xff, 0x57, 0xd6, 0xd1, 0xa6, 0xad, 0xd6, + 0xd1, 0xff, 0x57, 0xfd, 0x55, 0xd6, 0xd1, 0xff, 0x57, 0xfd, 0x55, 0xd6, + 0xd1, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x48, 0xd6, 0x9b, 0x50, 0x83, 0x8a, + 0x48, 0xc6, 0x00, 0x00, 0xce, 0xff, 0x57, 0xd6, 0xd1, 0xa6, 0xad, 0xd6, + 0xd1, 0xff, 0x57, 0xfd, 0x55, 0xd6, 0xd1, 0xff, 0x57, 0xfd, 0x55, 0xd6, + 0xd1, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xfa, 0x9a, 0x90, 0x50, 0x7a, 0xaa, + 0x90, 0x50, 0x6a, 0xac, 0xf9, 0x51, 0xd9, 0x20, 0x59, 0xd9, 0xc8, 0x52, + 0x82, 0x5c, 0x20, 0xc6, 0xce, 0xd6, 0xfa, 0x9a, 0x90, 0x50, 0x7a, 0xaa, + 0x90, 0x50, 0x6a, 0xac, 0xf9, 0x51, 0xd9, 0x20, 0x59, 0xd9, 0x5c, 0x20, + 0x59, 0xd9, 0x5c, 0x20, 0x59, 0xd9, 0x5c, 0x20, 0x59, 0xd9, 0x5c, 0x20, + 0x59, 0xd9, 0x5c, 0x20, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xfa, 0x9a, + 0x90, 0x50, 0x7a, 0xaa, 0x90, 0x50, 0x6a, 0xac, 0xf9, 0x51, 0xd9, 0x20, + 0x59, 0xd9, 0x5c, 0x20, 0x59, 0xd9, 0x5c, 0x20, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xa9, 0x50, 0x81, 0xc5, 0x50, 0x81, 0xc5, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xa9, 0x50, 0x81, 0xc5, 0x50, 0x81, 0xc5, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xd6, 0x55, 0xfd, 0x56, 0xfe, 0xd0, 0xc6, 0xce, 0xd6, 0x55, 0xfd, + 0x56, 0xfe, 0xd0, 0xc6, 0xce, 0xd6, 0x55, 0xfd, 0x56, 0xfe, 0xd0, 0xc6, + 0xce, 0xd6, 0x55, 0xfd, 0x56, 0xfe, 0xd0, 0xc6, 0xce, 0xd6, 0xc1, 0xcf, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xc1, 0xcf, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xd6, 0x48, 0xcf, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0x9f, 0xfd, + 0x55, 0xc4, 0xc6, 0x00, 0xce, 0xd6, 0x9f, 0xfd, 0x55, 0xc4, 0xc6, 0x00, + 0xce, 0xd6, 0x9f, 0xfd, 0x55, 0xc4, 0xc6, 0x00, 0xce, 0xd6, 0x9f, 0xfd, + 0x55, 0xc4, 0xc6, 0x00, 0xce, 0x90, 0x50, 0x6e, 0xd7, 0xa5, 0xfe, 0x56, + 0xd0, 0xfe, 0xfd, 0xd0, 0xad, 0xc6, 0x00, 0x00, 0xce, 0x90, 0x50, 0x6e, + 0xd7, 0xa5, 0xfe, 0x56, 0xd0, 0xfe, 0xfd, 0xd0, 0xad, 0xc6, 0x00, 0x00, + 0xce, 0xa5, 0xc8, 0xad, 0x90, 0xae, 0x50, 0x87, 0xc5, 0x90, 0xae, 0x56, + 0x50, 0x87, 0xc5, 0x90, 0xae, 0x56, 0x50, 0x87, 0xc5, 0x90, 0xae, 0x56, + 0x50, 0x87, 0xc5, 0x90, 0xae, 0x56, 0x50, 0x87, 0xc5, 0x90, 0xae, 0x56, + 0x50, 0x87, 0xc5, 0x90, 0xae, 0x56, 0x50, 0x87, 0xc5, 0x90, 0xae, 0x56, + 0x50, 0x87, 0xc5, 0xc6, 0xce, 0xa5, 0xc8, 0xad, 0x90, 0xae, 0x50, 0x87, + 0xc5, 0x90, 0xae, 0x56, 0x50, 0x87, 0xc5, 0x90, 0xae, 0x56, 0x50, 0x87, + 0xc5, 0x90, 0xae, 0x56, 0x50, 0x87, 0xc5, 0x90, 0xae, 0x56, 0x50, 0x87, + 0xc5, 0x90, 0xae, 0x56, 0x50, 0x87, 0xc5, 0x90, 0xae, 0x56, 0x50, 0x87, + 0xc5, 0x90, 0xae, 0x56, 0x50, 0x87, 0xc5, 0xc6, 0xce, 0xd6, 0x9f, 0x9d, + 0x50, 0x48, 0xc4, 0xc6, 0xce, 0xd6, 0x9f, 0x9d, 0xc4, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0x9f, 0x9d, 0x50, 0x48, 0xc4, 0xc6, 0xce, 0xd6, 0x9f, 0x9d, + 0xc4, 0xc6, 0x00, 0x00, 0xce, 0x90, 0xae, 0x50, 0x87, 0xc5, 0x90, 0xae, + 0x56, 0x50, 0x87, 0xc5, 0x90, 0xae, 0x56, 0x50, 0x87, 0xc5, 0x90, 0xae, + 0x56, 0x50, 0x87, 0xc5, 0x90, 0xae, 0x56, 0x50, 0x87, 0xc5, 0x90, 0xae, + 0x56, 0x50, 0x87, 0xc5, 0x90, 0xae, 0x56, 0x50, 0x87, 0xc5, 0x90, 0xae, + 0x56, 0x50, 0x87, 0xc5, 0x90, 0xad, 0x50, 0x83, 0xc8, 0xac, 0x55, 0x90, + 0x50, 0x6c, 0xd7, 0x90, 0x50, 0xf1, 0x81, 0xc5, 0xa7, 0xc8, 0xaf, 0xfd, + 0x55, 0xc4, 0xc6, 0x00, 0xce, 0x90, 0xae, 0x50, 0x87, 0xc5, 0x90, 0xae, + 0x56, 0x50, 0x87, 0xc5, 0x90, 0xae, 0x56, 0x50, 0x87, 0xc5, 0x90, 0xae, + 0x56, 0x50, 0x87, 0xc5, 0x90, 0xae, 0x56, 0x50, 0x87, 0xc5, 0x90, 0xae, + 0x56, 0x50, 0x87, 0xc5, 0x90, 0xae, 0x56, 0x50, 0x87, 0xc5, 0x90, 0xae, + 0x56, 0x50, 0x87, 0xc5, 0x90, 0xad, 0x50, 0x83, 0xc8, 0xac, 0x55, 0x90, + 0x50, 0x6c, 0xd7, 0x90, 0x50, 0xf1, 0x81, 0xc5, 0xa7, 0xc8, 0xaf, 0xfd, + 0x55, 0xc4, 0x52, 0xc6, 0xce, 0x90, 0x50, 0x83, 0xc8, 0xae, 0xac, 0xc4, + 0x90, 0x50, 0x6c, 0xd7, 0x90, 0xad, 0xaf, 0x57, 0xd1, 0x52, 0xc6, 0x00, + 0xce, 0x90, 0x50, 0x6e, 0xd7, 0xf0, 0xc5, 0x90, 0x50, 0x81, 0xc5, 0xc6, + 0xce, 0xa3, 0xc8, 0xae, 0xac, 0xc4, 0xc6, 0x00, 0xce, 0x90, 0x50, 0x6e, + 0xd7, 0x90, 0xad, 0xae, 0x55, 0x56, 0xd0, 0xc6, 0xce, 0x90, 0x50, 0x6e, + 0xd7, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, 0x00, 0xce, 0xc4, 0xc4, 0xc6, + 0xce, 0xc4, 0xc4, 0xc6, 0xce, 0xd6, 0x90, 0xaa, 0x52, 0x50, 0x84, 0xfb, + 0x53, 0x7b, 0x6a, 0xaa, 0xda, 0xab, 0x5a, 0xda, 0xc8, 0x8b, 0xab, 0x5a, + 0xda, 0xc8, 0x8b, 0xad, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xff, 0x57, 0xd6, + 0xd1, 0xff, 0x57, 0xfd, 0x55, 0xd6, 0xd1, 0xc6, 0xce, 0xff, 0x57, 0xd6, + 0xd1, 0xff, 0x57, 0xfd, 0x55, 0xd6, 0xd1, 0xc6, 0xce, 0xd6, 0xc1, 0xc6, + 0xce, 0xd6, 0xc1, 0xc6, 0xce, 0xd6, 0xc1, 0xc6, 0xce, 0xd6, 0xc1, 0xc6, + 0xce, 0x90, 0xd6, 0xe8, 0x50, 0xe8, 0xe8, 0xc6, 0xce, 0x90, 0xd6, 0xe8, + 0x50, 0xe8, 0xe8, 0xc6, 0xce, 0xd6, 0x98, 0x48, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x90, 0xa9, 0xd6, 0x98, 0x49, 0x48, 0x90, 0x50, 0xad, 0xae, 0xd6, + 0xd0, 0xd6, 0xd0, 0xc6, 0xce, 0x90, 0xa9, 0xd6, 0x98, 0xd6, 0x99, 0x89, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0x4c, 0x90, 0x48, 0xcf, 0xc6, 0x00, + 0xce, 0xd6, 0x98, 0x99, 0xfa, 0x52, 0x92, 0x81, 0x48, 0xc6, 0x00, 0x00, + 0xce, 0x90, 0xd6, 0xe8, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0xd6, 0xe8, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0x55, + 0xd6, 0xd0, 0xc6, 0x00, 0xce, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0x55, + 0xd6, 0xd0, 0xc6, 0x00, 0xce, 0x90, 0x50, 0xaf, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x90, 0x50, 0xaf, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0xaf, 0xd6, + 0x98, 0x57, 0x87, 0xc8, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0xaf, 0xd6, + 0x98, 0x57, 0x87, 0xc8, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xa2, 0x69, 0xa9, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0xaa, 0xab, 0xa9, 0xd6, 0x9c, 0x50, + 0x84, 0x51, 0x69, 0xa9, 0x52, 0x50, 0x84, 0x53, 0x93, 0xc5, 0xd9, 0xa9, + 0x90, 0xd6, 0x98, 0x56, 0x96, 0xae, 0x90, 0xad, 0xa5, 0xd6, 0xfa, 0x52, + 0x10, 0x5a, 0xc8, 0x10, 0x5a, 0xc8, 0x10, 0x90, 0xad, 0xa5, 0xd6, 0xfa, + 0x52, 0x10, 0x5a, 0xc8, 0x10, 0x50, 0x91, 0xa9, 0x90, 0xad, 0xa5, 0xd6, + 0xfa, 0x52, 0x10, 0x5a, 0xc8, 0x10, 0x5a, 0xc8, 0x10, 0x90, 0xad, 0xa5, + 0xd6, 0xfa, 0x52, 0x10, 0x5a, 0xc8, 0x10, 0xc6, 0xce, 0x90, 0xaa, 0xab, + 0xa9, 0xd6, 0x9c, 0x50, 0x84, 0x51, 0x69, 0xa9, 0x52, 0x50, 0x84, 0x53, + 0x93, 0xc5, 0xd9, 0xa9, 0x90, 0xd6, 0x98, 0x56, 0x96, 0xae, 0x90, 0xad, + 0xa5, 0xd6, 0xfa, 0x52, 0x10, 0x5a, 0xc8, 0x10, 0x5a, 0xc8, 0x10, 0x90, + 0xad, 0xa5, 0xd6, 0xfa, 0x52, 0x10, 0x5a, 0xc8, 0x10, 0x50, 0x91, 0xa9, + 0x90, 0xad, 0xa5, 0xd6, 0xfa, 0x52, 0x10, 0x5a, 0xc8, 0x10, 0x5a, 0xc8, + 0x10, 0x90, 0xad, 0xa5, 0xd6, 0xfa, 0x52, 0x10, 0x5a, 0xc8, 0x10, 0xc6, + 0xce, 0xd6, 0xc1, 0xd6, 0x99, 0x90, 0xad, 0xa5, 0xd6, 0xfa, 0x52, 0x10, + 0x5a, 0xc8, 0x10, 0x5a, 0xc8, 0x10, 0x90, 0xad, 0xa5, 0xd6, 0xfa, 0x52, + 0x10, 0x5a, 0xc8, 0x10, 0x50, 0x91, 0xa9, 0x90, 0xad, 0xa5, 0xd6, 0xfa, + 0x52, 0x10, 0x5a, 0xc8, 0x10, 0x5a, 0xc8, 0x10, 0x90, 0xad, 0xa5, 0xd6, + 0xfa, 0x52, 0x10, 0x5a, 0xc8, 0x10, 0xd6, 0xfa, 0x52, 0xf9, 0x51, 0xd9, + 0x10, 0x59, 0x5a, 0xd9, 0x10, 0x59, 0x5a, 0xd9, 0x10, 0x59, 0x5a, 0xd9, + 0x10, 0x59, 0x5a, 0xd9, 0x10, 0x59, 0x5a, 0xd9, 0x10, 0xfa, 0x52, 0xf9, + 0x51, 0xd9, 0x10, 0x59, 0x5a, 0xd9, 0x10, 0x59, 0x5a, 0xd9, 0x10, 0x59, + 0x5a, 0xd9, 0x10, 0xc6, 0xce, 0xd6, 0xc1, 0xd6, 0x99, 0x90, 0xad, 0xa5, + 0xd6, 0xfa, 0x52, 0x10, 0x5a, 0xc8, 0x10, 0x5a, 0xc8, 0x10, 0x90, 0xad, + 0xa5, 0xd6, 0xfa, 0x52, 0x10, 0x5a, 0xc8, 0x10, 0x50, 0x91, 0xa9, 0x90, + 0xad, 0xa5, 0xd6, 0xfa, 0x52, 0x10, 0x5a, 0xc8, 0x10, 0x5a, 0xc8, 0x10, + 0x90, 0xad, 0xa5, 0xd6, 0xfa, 0x52, 0x10, 0x5a, 0xc8, 0x10, 0xd6, 0xfa, + 0x52, 0xf9, 0x51, 0xd9, 0x10, 0x59, 0x5a, 0xd9, 0x10, 0x59, 0x5a, 0xd9, + 0x10, 0x59, 0x5a, 0xd9, 0x10, 0x59, 0x5a, 0xd9, 0x10, 0x59, 0x5a, 0xd9, + 0x10, 0xfa, 0x52, 0xf9, 0x51, 0xd9, 0x10, 0x59, 0x5a, 0xd9, 0x10, 0x59, + 0x5a, 0xd9, 0x10, 0x59, 0x5a, 0xd9, 0x10, 0xc6, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0x90, 0xad, 0xae, + 0x56, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xc6, 0x00, 0x00, + 0xce, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, 0xd0, 0xd6, + 0xd0, 0xc6, 0x00, 0x00, 0xce, 0x90, 0xac, 0xae, 0x54, 0xd6, 0x98, 0xa9, + 0x53, 0x83, 0xd6, 0x53, 0x6b, 0xd8, 0xab, 0xa1, 0xc8, 0x84, 0x94, 0xad, + 0xd6, 0x98, 0x84, 0x85, 0xaf, 0xa3, 0xaa, 0xd6, 0xf0, 0x84, 0x94, 0x82, + 0xaa, 0xaa, 0xa7, 0x82, 0xf8, 0xc8, 0xad, 0xd6, 0x56, 0xd0, 0xa3, 0xc8, + 0xaa, 0xd6, 0xf0, 0x84, 0x94, 0x82, 0xaa, 0xa7, 0x82, 0xf8, 0xc8, 0xad, + 0xd6, 0x56, 0xd0, 0xa3, 0xc8, 0xaa, 0xd6, 0xf0, 0x84, 0x94, 0x82, 0xaa, + 0xa7, 0x82, 0xf8, 0xc8, 0xad, 0xd6, 0x56, 0xd0, 0xa3, 0xc8, 0xaa, 0xd6, + 0xf0, 0x84, 0x94, 0x82, 0xaa, 0xa7, 0x82, 0xf8, 0xc8, 0xad, 0xd6, 0x56, + 0xd0, 0xc6, 0x00, 0x00, 0xce, 0x90, 0xac, 0xae, 0x54, 0xd6, 0x98, 0xa9, + 0x53, 0x83, 0x53, 0x73, 0xd6, 0x53, 0x6b, 0xd8, 0xab, 0xa1, 0xc8, 0x84, + 0x94, 0xad, 0xd6, 0x98, 0xc8, 0x84, 0x85, 0xaf, 0xa3, 0xaa, 0xd6, 0xf0, + 0x84, 0x94, 0x82, 0xaa, 0xa7, 0x82, 0xf8, 0xc8, 0xad, 0xd6, 0x56, 0xd0, + 0xa3, 0xc8, 0xaa, 0xd6, 0xf0, 0x84, 0x94, 0x82, 0xaa, 0xa7, 0x82, 0xf8, + 0xc8, 0xad, 0xd6, 0x56, 0xd0, 0xa3, 0xc8, 0xaa, 0xd6, 0xf0, 0x84, 0x94, + 0x82, 0xaa, 0xa7, 0x82, 0xf8, 0xc8, 0xad, 0xd6, 0x56, 0xd0, 0xa3, 0xc8, + 0xaa, 0xd6, 0xf0, 0x84, 0x94, 0x82, 0xaa, 0xa7, 0x82, 0xf8, 0xc8, 0xad, + 0xd6, 0x56, 0xd0, 0xc6, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xf9, 0x51, 0xd6, 0xe9, 0xd6, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x57, 0xc4, 0xf9, 0x51, 0xd6, 0x49, + 0x49, 0x49, 0x51, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0xd6, + 0xc1, 0xc1, 0xc6, 0x00, 0xce, 0x90, 0xaa, 0xf9, 0xd6, 0xd9, 0x8a, 0xaa, + 0x59, 0xd9, 0x8a, 0xaa, 0x59, 0xd9, 0x8a, 0xaa, 0x59, 0xd9, 0x8a, 0xaa, + 0x59, 0xd9, 0x8a, 0xaa, 0x59, 0xd9, 0x8a, 0xaa, 0x59, 0xd9, 0x8a, 0xaa, + 0x59, 0xd9, 0x8a, 0xaa, 0x59, 0xd9, 0x8a, 0xaa, 0x59, 0xd9, 0x8a, 0xaa, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0x52, 0xc6, 0x00, + 0xce, 0x90, 0xff, 0xa7, 0xf9, 0x51, 0x79, 0xad, 0xd6, 0x90, 0x50, 0x6d, + 0xae, 0xe6, 0xa9, 0xd6, 0x90, 0x50, 0x6f, 0xae, 0x31, 0xd6, 0x90, 0x50, + 0x6d, 0xae, 0xe6, 0xa9, 0xd6, 0x90, 0x50, 0x6f, 0xae, 0x31, 0xd6, 0x90, + 0x50, 0x6d, 0xae, 0xe6, 0xa9, 0xd6, 0x90, 0x50, 0x6f, 0xae, 0x31, 0xd6, + 0x90, 0x50, 0x6d, 0xae, 0xe6, 0xa9, 0xd6, 0x90, 0x50, 0x6f, 0xae, 0x31, + 0xc4, 0xc6, 0x00, 0x00, 0xce, 0x51, 0xc4, 0x51, 0xd9, 0x51, 0x91, 0x82, + 0xaf, 0xfd, 0x55, 0xc4, 0x51, 0xc4, 0x51, 0xd9, 0x51, 0x91, 0x82, 0xaa, + 0x90, 0xab, 0xac, 0xad, 0xae, 0xaf, 0x51, 0xc4, 0x51, 0xd9, 0x51, 0x91, + 0x82, 0xaa, 0x51, 0xc4, 0x51, 0xd9, 0x51, 0x91, 0x82, 0xaa, 0x51, 0xc4, + 0x51, 0xd9, 0x51, 0x91, 0x82, 0xaa, 0xc6, 0x00, 0xce, 0x90, 0xa9, 0xd6, + 0xaf, 0x9f, 0x50, 0x6f, 0xae, 0x31, 0x50, 0x6f, 0xae, 0x31, 0x50, 0x6f, + 0xae, 0x31, 0x50, 0x6f, 0xae, 0x31, 0x51, 0xc4, 0xa2, 0x51, 0x91, 0xaa, + 0x51, 0xd9, 0x51, 0x91, 0x82, 0xaa, 0x90, 0xd6, 0x98, 0xf9, 0x51, 0x79, + 0xaf, 0xd6, 0x90, 0x50, 0x6f, 0xae, 0xe6, 0x82, 0xaa, 0x90, 0xab, 0xac, + 0xad, 0xae, 0x51, 0xc4, 0xa2, 0x51, 0x91, 0xaa, 0x51, 0xd9, 0x51, 0x91, + 0x82, 0xaa, 0x90, 0xd6, 0x98, 0xf9, 0x51, 0x79, 0xaf, 0xd6, 0x90, 0x50, + 0x6f, 0xae, 0xe6, 0x82, 0xaa, 0xa2, 0xaf, 0xfd, 0x55, 0xc4, 0x51, 0xc4, + 0xa2, 0x51, 0x91, 0xaa, 0x51, 0xd9, 0x51, 0x91, 0x82, 0xaa, 0x90, 0xd6, + 0x98, 0xf9, 0x51, 0x79, 0xaf, 0xd6, 0x90, 0x50, 0x6f, 0xae, 0xe6, 0x82, + 0xaa, 0x51, 0xc4, 0xa2, 0x51, 0x91, 0xaa, 0x51, 0xd9, 0x51, 0x91, 0x82, + 0xaa, 0x90, 0xd6, 0x98, 0xf9, 0x51, 0x79, 0xaf, 0xd6, 0x90, 0x50, 0x6f, + 0xae, 0xe6, 0x82, 0xaa, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0xaf, 0xd6, + 0xf9, 0x51, 0xc4, 0xa2, 0x51, 0x91, 0xaa, 0x51, 0xd9, 0x51, 0x91, 0x82, + 0xaa, 0xf9, 0x51, 0xc4, 0xa2, 0x51, 0x91, 0xaa, 0x51, 0xd9, 0x51, 0x91, + 0x82, 0xaa, 0x90, 0x50, 0x82, 0xaa, 0xa2, 0xaf, 0xfd, 0x55, 0xc4, 0xf9, + 0x51, 0xc4, 0xa2, 0x51, 0x91, 0xaa, 0x51, 0xd9, 0x51, 0x91, 0x82, 0xaa, + 0x51, 0xc4, 0xa2, 0x51, 0x91, 0xaa, 0x51, 0xd9, 0x51, 0x91, 0x82, 0xaa, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xa5, 0x51, 0x91, 0xa9, 0xdb, 0x81, + 0xa9, 0xa5, 0x84, 0x89, 0x18, 0x37, 0xc6, 0x00, 0xce, 0x90, 0xa9, 0xaa, + 0xab, 0xad, 0xd6, 0x9b, 0x51, 0xc4, 0xa3, 0x82, 0xaf, 0x55, 0xc4, 0xc6, + 0xce, 0x90, 0xaf, 0xd6, 0x9f, 0x50, 0x87, 0xf9, 0x51, 0x79, 0xad, 0xd6, + 0x90, 0x50, 0x6d, 0xae, 0xe6, 0xaa, 0x50, 0x87, 0xc5, 0xc6, 0x00, 0x00, + 0xce, 0x52, 0xc6, 0x00, 0xce, 0x90, 0xa9, 0xad, 0xfb, 0x51, 0xa3, 0xc8, + 0x69, 0xd7, 0xf0, 0x51, 0x81, 0x91, 0xac, 0xd6, 0x50, 0x6b, 0xa9, 0xd9, + 0xad, 0x51, 0xc4, 0xa2, 0xf9, 0x51, 0x91, 0x85, 0xaa, 0xd6, 0x98, 0x51, + 0x91, 0x82, 0xaa, 0xa4, 0xc5, 0xa2, 0xc5, 0xc6, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0x53, 0xc4, 0xc6, 0xce, 0x53, 0xc4, 0xc6, 0xce, 0x53, 0xc4, 0xc6, + 0xce, 0x53, 0xc4, 0xc6, 0xce, 0x53, 0xc4, 0xc6, 0xce, 0x53, 0xc4, 0xc6, + 0xce, 0x53, 0xc4, 0xc6, 0xce, 0x53, 0xc4, 0xc6, 0xce, 0xd6, 0x90, 0xad, + 0x50, 0x6f, 0xa9, 0xd9, 0xaf, 0x55, 0xc4, 0xc6, 0xce, 0xd6, 0x90, 0xad, + 0x50, 0x6f, 0xa9, 0xd9, 0xaf, 0x55, 0xc4, 0xc6, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0x90, 0xab, 0xac, 0xd6, 0x98, 0x53, 0x7b, 0xab, 0xc4, 0xc6, 0x00, + 0xce, 0x90, 0xab, 0xac, 0x54, 0xd6, 0x98, 0x53, 0x7b, 0xab, 0xc4, 0xc6, + 0xce, 0x51, 0xf9, 0xc6, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0x90, 0xad, 0xae, 0x56, 0x90, 0x50, 0x6b, 0xd7, 0xd0, 0x90, 0x50, + 0x6b, 0xd7, 0xd0, 0x90, 0x50, 0x6c, 0xd7, 0xd0, 0x90, 0x50, 0xad, 0xae, + 0x90, 0x50, 0x6b, 0xd7, 0xd0, 0x90, 0x50, 0x6b, 0xd7, 0xd0, 0x90, 0x50, + 0x6c, 0xd7, 0xd0, 0xc6, 0xce, 0x90, 0xad, 0xd6, 0x98, 0xaf, 0xaa, 0x55, + 0xc4, 0xa2, 0x51, 0x91, 0xaf, 0x55, 0xc4, 0x90, 0xad, 0xd6, 0x98, 0xaf, + 0xaa, 0x55, 0xc4, 0xa2, 0x51, 0x91, 0xaf, 0x55, 0xc4, 0xc6, 0x00, 0x00, + 0xce, 0xcf, 0xc6, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, + 0xdf, 0x03, 0x00, 0x00, 0x01, 0x00, 0x8e, 0x92, 0x01, 0x00, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x82, 0x60, 0x14, 0x30, 0x00, 0x00, 0x08, 0x00, + 0xee, 0x00, 0x47, 0x79, 0x03, 0x5d, 0x03, 0x00, 0x00, 0x00, 0x59, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xea, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x47, 0xdf, 0x03, 0x00, 0x00, 0x02, 0x00, 0x8e, 0x92, + 0x02, 0x00, 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x92, 0x60, 0x14, 0x30, + 0x00, 0x00, 0x08, 0x00, 0xee, 0x00, 0x47, 0x79, 0x03, 0x5d, 0x03, 0x3f, + 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, + 0xea, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0xdf, 0x03, 0x00, 0x00, + 0x04, 0x00, 0x8e, 0x92, 0x04, 0x00, 0xff, 0x00, 0x00, 0x00, 0x02, 0x00, + 0xa2, 0x60, 0x14, 0x30, 0x00, 0x00, 0x08, 0x00, 0xee, 0x00, 0x47, 0x79, + 0x03, 0x5d, 0x03, 0x3e, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x01, 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, + 0xdf, 0x03, 0x00, 0x00, 0x08, 0x00, 0x8e, 0x92, 0x08, 0x00, 0xff, 0x00, + 0x00, 0x00, 0x03, 0x00, 0xb2, 0x60, 0x14, 0x30, 0x00, 0x00, 0x08, 0x00, + 0xee, 0x00, 0x47, 0x79, 0x03, 0x5d, 0x03, 0x3d, 0x00, 0x00, 0x59, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0xea, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x47, 0xdf, 0x03, 0x00, 0x00, 0x10, 0x00, 0x8e, 0x92, + 0x10, 0x00, 0xff, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc2, 0x60, 0x14, 0x30, + 0x00, 0x00, 0x08, 0x00, 0xee, 0x00, 0x47, 0x79, 0x03, 0x5d, 0x03, 0x3c, + 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, + 0xea, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0xdf, 0x03, 0x00, 0x00, + 0x20, 0x00, 0x8e, 0x92, 0x20, 0x00, 0xff, 0x00, 0x00, 0x00, 0x05, 0x00, + 0xd2, 0x60, 0x14, 0x30, 0x00, 0x00, 0x08, 0x00, 0xee, 0x00, 0x47, 0x79, + 0x03, 0x5d, 0x03, 0x3b, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x01, 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, + 0xdf, 0x03, 0x00, 0x00, 0x40, 0x00, 0x8e, 0x92, 0x40, 0x00, 0xff, 0x00, + 0x00, 0x00, 0x06, 0x00, 0xe2, 0x60, 0x14, 0x30, 0x00, 0x00, 0x08, 0x00, + 0xee, 0x00, 0x47, 0x79, 0x03, 0x5d, 0x03, 0x3a, 0x00, 0x00, 0x59, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0xea, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x47, 0xdf, 0x03, 0x00, 0x00, 0x80, 0x00, 0x8e, 0x92, + 0x80, 0x00, 0xff, 0x00, 0x00, 0x00, 0x07, 0x00, 0xf2, 0x60, 0x14, 0x30, + 0x00, 0x00, 0x08, 0x00, 0xee, 0x00, 0x47, 0x79, 0x03, 0x5d, 0x03, 0x39, + 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, + 0xea, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, + 0x00, 0x00, 0x02, 0x60, 0x14, 0x30, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, + 0x47, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x00, 0x01, 0x00, 0x00, + 0xff, 0xff, 0x01, 0x00, 0x01, 0x00, 0x12, 0x60, 0x14, 0x30, 0x00, 0x00, + 0x10, 0x00, 0xf0, 0x00, 0x47, 0x08, 0x02, 0x3e, 0x00, 0x00, 0x10, 0x00, + 0xf2, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, + 0x02, 0x00, 0x22, 0x60, 0x14, 0x30, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, + 0x47, 0x08, 0x02, 0x3c, 0x00, 0x00, 0x20, 0x00, 0xf2, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x03, 0x00, 0x32, 0x60, + 0x14, 0x30, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x47, 0x08, 0x02, 0x3a, + 0x00, 0x00, 0x30, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xff, 0xff, 0x01, 0x00, 0x04, 0x00, 0x42, 0x60, 0x14, 0x30, 0x00, 0x00, + 0x10, 0x00, 0xf0, 0x00, 0x47, 0x09, 0x02, 0x00, 0x00, 0x40, 0x00, 0xf2, + 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x05, 0x00, 0x52, 0x60, + 0x14, 0x30, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x47, 0x09, 0x02, 0x3e, + 0x00, 0x00, 0x50, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xff, 0xff, 0x01, 0x00, 0x06, 0x00, 0x62, 0x60, 0x14, 0x30, 0x00, 0x00, + 0x10, 0x00, 0xf0, 0x00, 0x47, 0x09, 0x02, 0x3c, 0x00, 0x00, 0x60, 0x00, + 0xf2, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, + 0x07, 0x00, 0x72, 0x60, 0x14, 0x30, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, + 0x47, 0x09, 0x02, 0x3a, 0x00, 0x00, 0x70, 0x00, 0xf2, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x60, 0x14, 0x30, 0x00, 0x00, 0x10, 0x00, 0xef, 0x00, + 0x47, 0xde, 0x03, 0x00, 0x00, 0x01, 0x00, 0x93, 0x00, 0x01, 0x00, 0x00, + 0xff, 0xff, 0x02, 0x00, 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x92, 0x60, + 0x14, 0x30, 0x00, 0x00, 0x10, 0x00, 0xef, 0x00, 0x47, 0xde, 0x03, 0x00, + 0x00, 0x02, 0x00, 0x93, 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0x04, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa2, 0x60, 0x14, 0x30, 0x00, 0x00, + 0x10, 0x00, 0xef, 0x00, 0x47, 0xde, 0x03, 0x00, 0x00, 0x04, 0x00, 0x93, + 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x03, 0x00, 0xb2, 0x60, 0x14, 0x30, 0x00, 0x00, 0x10, 0x00, 0xef, 0x00, + 0x47, 0xde, 0x03, 0x00, 0x00, 0x08, 0x00, 0x93, 0x00, 0x01, 0x00, 0x00, + 0xff, 0xff, 0x10, 0x00, 0xff, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc2, 0x60, + 0x14, 0x30, 0x00, 0x00, 0x10, 0x00, 0xef, 0x00, 0x47, 0xde, 0x03, 0x00, + 0x00, 0x10, 0x00, 0x93, 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0x20, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x05, 0x00, 0xd2, 0x60, 0x14, 0x30, 0x00, 0x00, + 0x10, 0x00, 0xef, 0x00, 0x47, 0xde, 0x03, 0x00, 0x00, 0x20, 0x00, 0x93, + 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0x40, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x06, 0x00, 0xe2, 0x60, 0x14, 0x30, 0x00, 0x00, 0x10, 0x00, 0xef, 0x00, + 0x47, 0xde, 0x03, 0x00, 0x00, 0x40, 0x00, 0x93, 0x00, 0x01, 0x00, 0x00, + 0xff, 0xff, 0x80, 0x00, 0xff, 0x00, 0x00, 0x00, 0x07, 0x00, 0xf2, 0x60, + 0x14, 0x30, 0x00, 0x00, 0x10, 0x00, 0xef, 0x00, 0x47, 0xde, 0x03, 0x00, + 0x00, 0x80, 0x00, 0x93, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0xf1, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x02, 0x00, 0xf1, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0xf1, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0xf1, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x05, 0x00, 0xf1, 0x00, 0x00, 0x01, 0x00, 0x00, 0x06, 0x00, 0xf1, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0xf1, 0x00, 0x00, 0x01, 0x00, 0x47, + 0x07, 0x02, 0x03, 0x00, 0xcd, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, + 0x07, 0x02, 0x3e, 0x03, 0x00, 0xcd, 0x5e, 0x00, 0x00, 0x01, 0x00, 0x47, + 0x07, 0x02, 0x03, 0x00, 0xce, 0x5f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, + 0x07, 0x02, 0x3e, 0x03, 0x00, 0xce, 0x60, 0x00, 0x00, 0x01, 0xd3, 0x00, + 0x47, 0x75, 0x01, 0x00, 0x00, 0x80, 0x00, 0x70, 0x00, 0x01, 0xd4, 0x00, + 0x47, 0x75, 0x01, 0x00, 0x00, 0x80, 0x00, 0x70, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0a, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0b, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0d, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x11, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x12, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x13, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x14, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x15, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x16, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x17, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0x60, + 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x5c, 0x00, 0x02, 0x60, 0x18, 0x30, + 0x00, 0x01, 0x7a, 0x76, 0x74, 0x77, 0x7a, 0x00, 0x47, 0x17, 0x03, 0x77, + 0x00, 0x01, 0x7a, 0x76, 0x74, 0x0f, 0x00, 0x0f, 0x00, 0x78, 0x7a, 0x00, + 0x47, 0x17, 0x03, 0x01, 0x00, 0x78, 0x00, 0x00, 0x00, 0x01, 0x7a, 0x76, + 0x74, 0xf0, 0x00, 0xf0, 0x00, 0x79, 0x7a, 0x00, 0x47, 0x18, 0x03, 0x01, + 0x00, 0x79, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x13, 0x02, 0x0f, 0x00, + 0x3c, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x7b, + 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x01, 0x00, 0x47, + 0x07, 0x06, 0xe0, 0x00, 0x01, 0x00, 0x04, 0x0f, 0x00, 0x00, 0x47, 0x2b, + 0x06, 0x07, 0x00, 0x00, 0x47, 0x07, 0x06, 0x00, 0x47, 0x25, 0x06, 0xe0, + 0x00, 0x02, 0x00, 0x03, 0xf0, 0x00, 0x3c, 0x00, 0x47, 0x2c, 0x06, 0x70, + 0x00, 0x3c, 0x00, 0x47, 0x25, 0x06, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x47, 0x07, 0x06, 0x08, 0x08, 0x00, 0x47, 0x25, 0x06, + 0x08, 0x08, 0x5f, 0x60, 0x14, 0x00, 0x76, 0x74, 0x7e, 0x7f, 0x01, 0x03, + 0x01, 0x75, 0x28, 0x5e, 0x00, 0x47, 0x17, 0x03, 0x00, 0x01, 0x00, 0x47, + 0x07, 0x06, 0x08, 0x08, 0x5f, 0x14, 0x00, 0x76, 0x74, 0x7e, 0x7a, 0xf0, + 0x00, 0x0f, 0x00, 0x01, 0x04, 0x01, 0x75, 0x28, 0x00, 0x47, 0x17, 0x03, + 0x00, 0x01, 0x00, 0x47, 0x25, 0x06, 0x08, 0x08, 0x60, 0x14, 0x00, 0x76, + 0x74, 0x7f, 0x7a, 0x0f, 0x00, 0xf0, 0x00, 0x02, 0x03, 0x01, 0x75, 0x5e, + 0x00, 0x47, 0x18, 0x03, 0x00, 0x01, 0x00, 0x47, 0x2c, 0x06, 0x0f, 0x00, + 0x04, 0x00, 0x47, 0x2b, 0x06, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x01, 0x82, 0x60, 0x04, 0x30, 0x08, 0x30, 0x92, 0x60, + 0x04, 0x30, 0x08, 0x30, 0xa2, 0x60, 0x04, 0x30, 0x08, 0x30, 0xb2, 0x60, + 0x04, 0x30, 0x08, 0x30, 0xc2, 0x60, 0x04, 0x30, 0x08, 0x30, 0xd2, 0x60, + 0x04, 0x30, 0x08, 0x30, 0xe2, 0x60, 0x04, 0x30, 0x08, 0x30, 0xf2, 0x60, + 0x04, 0x30, 0x08, 0x30, 0x00, 0x10, 0x01, 0x00, 0x82, 0x60, 0x0c, 0x30, + 0x92, 0x60, 0x0c, 0x30, 0xa2, 0x60, 0x0c, 0x30, 0xb2, 0x60, 0x0c, 0x30, + 0xc2, 0x60, 0x0c, 0x30, 0xd2, 0x60, 0x0c, 0x30, 0xe2, 0x60, 0x0c, 0x30, + 0xf2, 0x60, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x01, 0x02, 0x61, 0x04, 0x30, + 0x08, 0x30, 0x12, 0x61, 0x04, 0x30, 0x08, 0x30, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x60, 0x04, 0x30, 0x12, 0x60, 0x04, 0x30, 0x22, 0x60, 0x04, 0x30, + 0x32, 0x60, 0x04, 0x30, 0x42, 0x60, 0x04, 0x30, 0x52, 0x60, 0x04, 0x30, + 0x62, 0x60, 0x04, 0x30, 0x72, 0x60, 0x04, 0x30, 0x00, 0x10, 0x01, 0x00, + 0x02, 0x60, 0x0c, 0x30, 0x12, 0x60, 0x0c, 0x30, 0x22, 0x60, 0x0c, 0x30, + 0x32, 0x60, 0x0c, 0x30, 0x42, 0x60, 0x0c, 0x30, 0x52, 0x60, 0x0c, 0x30, + 0x62, 0x60, 0x0c, 0x30, 0x72, 0x60, 0x0c, 0x30, 0x00, 0x47, 0x1b, 0x04, + 0x00, 0x03, 0x00, 0x47, 0xce, 0x09, 0xff, 0xff, 0x86, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x96, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0xa6, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0xb6, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0xc6, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0xd6, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0xe6, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0xf6, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0xc8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x75, 0x00, 0x47, 0x07, 0x06, 0x08, 0x08, 0x25, 0x06, 0x08, + 0x08, 0x5f, 0x60, 0x01, 0x00, 0x00, 0x47, 0x17, 0x03, 0x18, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x86, 0x60, 0x08, 0x00, 0x96, + 0x60, 0x08, 0x00, 0xa6, 0x60, 0x08, 0x00, 0xb6, 0x60, 0x08, 0x00, 0xc6, + 0x60, 0x08, 0x00, 0xd6, 0x60, 0x08, 0x00, 0xe6, 0x60, 0x08, 0x00, 0xf6, + 0x60, 0x08, 0x00, 0x00, 0x00, 0x01, 0x01, 0x86, 0x60, 0x01, 0x00, 0x08, + 0x00, 0x96, 0x60, 0x01, 0x00, 0x08, 0x00, 0xa6, 0x60, 0x01, 0x00, 0x08, + 0x00, 0xb6, 0x60, 0x01, 0x00, 0x08, 0x00, 0xc6, 0x60, 0x00, 0x01, 0x08, + 0x00, 0xd6, 0x60, 0x00, 0x01, 0x08, 0x00, 0xe6, 0x60, 0x00, 0x01, 0x08, + 0x00, 0xf6, 0x60, 0x00, 0x01, 0x08, 0x00, 0x00, 0x47, 0x00, 0x00, 0x13, + 0x02, 0x01, 0x00, 0x14, 0x02, 0x02, 0x00, 0x15, 0x02, 0x03, 0x00, 0x16, + 0x02, 0x4f, 0x00, 0x17, 0x02, 0x5f, 0x00, 0x18, 0x02, 0x6f, 0x00, 0x19, + 0x02, 0x7f, 0x00, 0x1a, 0x02, 0x08, 0x00, 0x1b, 0x02, 0x09, 0x00, 0x1c, + 0x02, 0x0a, 0x00, 0x1d, 0x02, 0x0b, 0x00, 0x1e, 0x02, 0xcf, 0x00, 0x1f, + 0x02, 0xdf, 0x00, 0x20, 0x02, 0xef, 0x00, 0x21, 0x02, 0xff, 0x00, 0x22, + 0x02, 0x10, 0x00, 0x3c, 0x00, 0x00, 0x47, 0x00, 0x00, 0x8a, 0x02, 0x60, + 0x00, 0x60, 0x00, 0x00, 0x00, 0x05, 0x61, 0x28, 0x00, 0x15, 0x61, 0x28, + 0x00, 0x03, 0x00, 0x00, 0x47, 0xc2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x60, 0x28, 0x30, 0x12, 0x60, 0x28, 0x30, 0x22, 0x60, 0x28, 0x30, 0x32, + 0x60, 0x28, 0x30, 0x42, 0x60, 0x28, 0x30, 0x52, 0x60, 0x28, 0x30, 0x62, + 0x60, 0x28, 0x30, 0x72, 0x60, 0x28, 0x30, 0x00, 0x03, 0x02, 0x60, 0x14, + 0x30, 0x12, 0x60, 0x14, 0x30, 0x22, 0x60, 0x14, 0x30, 0x32, 0x60, 0x14, + 0x30, 0x42, 0x60, 0x14, 0x30, 0x52, 0x60, 0x14, 0x30, 0x62, 0x60, 0x14, + 0x30, 0x72, 0x60, 0x14, 0x30, 0x82, 0x60, 0x2c, 0x30, 0x92, 0x60, 0x2c, + 0x30, 0xa2, 0x60, 0x2c, 0x30, 0xb2, 0x60, 0x2c, 0x30, 0xc2, 0x60, 0x2c, + 0x30, 0xd2, 0x60, 0x2c, 0x30, 0xe2, 0x60, 0x2c, 0x30, 0xf2, 0x60, 0x2c, + 0x30, 0x82, 0x60, 0x30, 0x30, 0x92, 0x60, 0x30, 0x30, 0xa2, 0x60, 0x30, + 0x30, 0xb2, 0x60, 0x30, 0x30, 0xc2, 0x60, 0x30, 0x30, 0xd2, 0x60, 0x30, + 0x30, 0xe2, 0x60, 0x30, 0x30, 0xf2, 0x60, 0x30, 0x30, 0x03, 0x00, 0x02, + 0x61, 0x14, 0x30, 0x12, 0x61, 0x14, 0x30, 0xff, 0x00, 0x00, 0x47, 0xbe, + 0x03, 0x00, 0x47, 0xbf, 0x03, 0xe5, 0x01, 0x00, 0x00, 0x47, 0x13, 0x03, + 0x02, 0x00, 0x00, 0x47, 0x14, 0x03, 0x04, 0x00, 0x00, 0x47, 0x15, 0x03, + 0x08, 0x00, 0x00, 0x47, 0x16, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x8c, 0x60, 0x04, 0x00, 0x9c, 0x60, 0x04, 0x00, 0xac, 0x60, 0x04, 0x00, + 0xbc, 0x60, 0x04, 0x00, 0xcc, 0x60, 0x04, 0x00, 0xdc, 0x60, 0x04, 0x00, + 0xec, 0x60, 0x04, 0x00, 0xfc, 0x60, 0x04, 0x00, 0x00, 0x47, 0x19, 0x03, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x47, + 0xf6, 0x03, 0x00, 0xf7, 0x03, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x44, 0x00, 0xea, 0x00, 0x00, 0x00, 0x47, 0xf4, 0x03, 0xf5, 0x03, 0xff, + 0x00, 0x00, 0x47, 0xcc, 0x02, 0x00, 0x47, 0x55, 0x03, 0x01, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xff, 0x00, 0x00, 0x01, 0x7a, 0x00, + 0x47, 0x06, 0x02, 0x74, 0x7e, 0x7f, 0x00, 0x47, 0x06, 0x03, 0x75, 0x28, + 0x5e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0xc4, 0xc6, 0x07, 0x00, + 0xc5, 0xc7, 0xb9, 0xba, 0x00, 0x01, 0x70, 0x00, 0x3c, 0xc4, 0xc8, 0x70, + 0x00, 0x3c, 0xc5, 0xc9, 0xb9, 0xbb, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, + 0x23, 0x02, 0x07, 0x00, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, + 0x23, 0x02, 0x07, 0x00, 0xc4, 0xc8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, + 0x23, 0x02, 0x07, 0x00, 0xc5, 0xc7, 0xb9, 0xba, 0x00, 0x01, 0x00, 0x47, + 0x23, 0x02, 0x07, 0x00, 0xc5, 0xc9, 0xb9, 0xbb, 0x00, 0x01, 0x00, 0x47, + 0x8a, 0x02, 0x0f, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x00, + 0x00, 0x47, 0x2a, 0x02, 0x00, 0x00, 0x06, 0x00, 0x08, 0x10, 0x08, 0x10, + 0x00, 0x01, 0x06, 0x61, 0xf0, 0xa7, 0x06, 0x61, 0xf1, 0xa7, 0xc3, 0x00, + 0xf1, 0xa7, 0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0xff, 0xff, 0x05, 0x61, + 0x18, 0x00, 0x05, 0x61, 0xec, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x05, 0x61, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x05, 0x61, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x16, 0x61, + 0xf0, 0xa7, 0x16, 0x61, 0xf1, 0xa7, 0xc3, 0x00, 0xf1, 0xa7, 0x00, 0x00, + 0x00, 0x01, 0xff, 0x00, 0xff, 0xff, 0x15, 0x61, 0x18, 0x00, 0x15, 0x61, + 0xec, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x15, 0x61, + 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x15, 0x61, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x00, 0x00, 0x23, 0x02, + 0x02, 0x00, 0x8a, 0x02, 0x00, 0x00, 0x24, 0x02, 0x02, 0x3c, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x47, 0x00, 0x00, 0x23, 0x02, 0x06, 0x00, 0x2a, 0x02, + 0x00, 0x00, 0x24, 0x02, 0x00, 0x01, 0x00, 0x47, 0x00, 0x00, 0x23, 0x02, + 0x03, 0x00, 0xaa, 0x02, 0x00, 0x00, 0x24, 0x02, 0x00, 0x01, 0x01, 0x00, + 0xcf, 0x02, 0x00, 0xd0, 0x00, 0x01, 0x01, 0x00, 0xd1, 0x02, 0x00, 0xd2, + 0x00, 0x01, 0x00, 0x48, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0xa0, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x48, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0xa4, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x48, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xa0, 0x06, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0xa4, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x43, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x44, 0x01, 0x01, 0x01, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0xc4, 0x02, 0x04, 0x00, + 0x00, 0x10, 0x00, 0x47, 0xc6, 0x02, 0x00, 0x00, 0x02, 0x00, 0xea, 0x00, + 0x00, 0x01, 0x00, 0x47, 0xc7, 0x02, 0x00, 0x00, 0x02, 0x00, 0xeb, 0x00, + 0x00, 0x01, 0x00, 0x47, 0xc6, 0x02, 0x00, 0x00, 0x03, 0x00, 0xea, 0x00, + 0x00, 0x01, 0x00, 0x47, 0xc7, 0x02, 0x00, 0x00, 0x03, 0x00, 0xeb, 0x00, + 0x00, 0x01, 0x82, 0x60, 0x00, 0xff, 0x00, 0x00, 0x00, 0x30, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x30, 0x00, 0x01, 0x02, 0x60, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x80, 0x00, 0x80, 0x00, 0x30, 0x00, 0x10, 0x18, 0x01, + 0x00, 0xe8, 0x10, 0x00, 0x02, 0x00, 0xe8, 0x20, 0x00, 0x04, 0x00, 0xe8, + 0x30, 0x00, 0x08, 0x00, 0xe8, 0x40, 0x00, 0x10, 0x00, 0xe8, 0x50, 0x00, + 0x20, 0x00, 0xe8, 0x60, 0x00, 0x40, 0x00, 0xe8, 0x70, 0x00, 0x80, 0x00, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x10, 0x18, 0x01, 0x00, 0xe9, 0x10, 0x00, + 0x02, 0x00, 0xe9, 0x20, 0x00, 0x04, 0x00, 0xe9, 0x30, 0x00, 0x08, 0x00, + 0xe9, 0x40, 0x00, 0x10, 0x00, 0xe9, 0x50, 0x00, 0x20, 0x00, 0xe9, 0x60, + 0x00, 0x40, 0x00, 0xe9, 0x70, 0x00, 0x80, 0x00, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x47, 0xcd, 0x02, 0xcc, 0x02, 0xff, 0x00, 0xcc, 0x02, + 0xea, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0xfa, 0x03, 0xf9, 0x03, + 0xea, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0xcd, 0x02, 0xcc, 0x02, + 0xff, 0x00, 0xcc, 0x02, 0xeb, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, + 0xfa, 0x03, 0xf9, 0x03, 0xeb, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, + 0xf6, 0x10, 0x00, 0x02, 0x00, 0xf6, 0x20, 0x00, 0x04, 0x00, 0xf6, 0x30, + 0x00, 0x08, 0x00, 0xf6, 0x40, 0x00, 0x10, 0x00, 0xf6, 0x50, 0x00, 0x20, + 0x00, 0xf6, 0x60, 0x00, 0x40, 0x00, 0xf6, 0x70, 0x00, 0x80, 0x00, 0xf6, + 0xff, 0xff, 0x04, 0x22, 0x00, 0x02, 0x60, 0x01, 0x00, 0x28, 0x30, 0xeb, + 0x30, 0x00, 0x00, 0x5b, 0x00, 0xea, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, + 0xf7, 0x10, 0x00, 0x02, 0x00, 0xf7, 0x20, 0x00, 0x04, 0x00, 0xf7, 0x30, + 0x00, 0x08, 0x00, 0xf7, 0x40, 0x00, 0x10, 0x00, 0xf7, 0x50, 0x00, 0x20, + 0x00, 0xf7, 0x60, 0x00, 0x40, 0x00, 0xf7, 0x70, 0x00, 0x80, 0x00, 0xf7, + 0xff, 0xff, 0x04, 0x23, 0x00, 0x02, 0x60, 0x01, 0x00, 0x28, 0x30, 0xeb, + 0x30, 0x00, 0x00, 0x5c, 0x00, 0xea, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, + 0x04, 0xf6, 0x02, 0x60, 0x10, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x60, 0x18, 0x30, 0x27, 0x03, 0x00, 0xce, 0x00, 0x00, + 0x00, 0x01, 0x04, 0xf7, 0x00, 0x01, 0x87, 0x60, 0x00, 0x10, 0x00, 0x30, + 0x34, 0x01, 0x00, 0x00, 0x00, 0x01, 0x87, 0x60, 0x00, 0x30, 0x34, 0x01, + 0x00, 0x01, 0xb9, 0xba, 0x00, 0x01, 0xb9, 0xbb, 0x00, 0x01, 0x00, 0x47, + 0xaa, 0x02, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0x10, 0x00, 0x00, + 0x00, 0x01, 0xff, 0x00, 0xff, 0xff, 0x05, 0x61, 0x18, 0x80, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x05, 0x61, 0x14, 0x80, 0x00, 0x00, + 0x00, 0x01, 0xff, 0x00, 0xff, 0xff, 0x15, 0x61, 0x18, 0x80, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x15, 0x61, 0x14, 0x80, 0x00, 0x00, + 0x00, 0x01, 0x30, 0x47, 0x26, 0x00, 0x00, 0x10, 0x00, 0x01, 0x30, 0x47, + 0x26, 0x00, 0x10, 0x10, 0x00, 0x01, 0x40, 0x47, 0x26, 0x00, 0x00, 0x10, + 0x00, 0x01, 0x40, 0x47, 0x26, 0x00, 0x10, 0x10, 0x00, 0x01, 0x00, 0xb2, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x10, 0xb2, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, + 0xdd, 0x03, 0xde, 0x03, 0x00, 0x01, 0x00, 0x47, 0xde, 0x03, 0xde, 0x03, + 0xdf, 0x03, 0x01, 0x00, 0x20, 0xb0, 0x88, 0x00, 0x20, 0xb0, 0x08, 0x00, + 0x00, 0x01, 0x20, 0xb0, 0xb4, 0x00, 0x20, 0xb0, 0x34, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x47, 0x05, 0x03, 0xdf, 0x03, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x47, 0xe0, 0x03, 0xdf, 0x03, 0x00, 0x00, 0xff, 0x00, + 0xdf, 0x03, 0x00, 0x00, 0x00, 0x01, 0x20, 0x4d, 0xd8, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x20, 0x4d, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x00, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x10, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x10, 0xb2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x01, 0x00, 0x47, 0x07, 0x06, 0x10, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x47, 0x25, 0x06, 0x10, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x2b, 0x06, 0x07, 0x00, + 0x13, 0x02, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0xb1, 0x00, 0x47, 0xf4, + 0x03, 0x3f, 0x00, 0x00, 0x47, 0x00, 0x00, 0x07, 0x03, 0x38, 0x38, 0x00, + 0x47, 0x00, 0x00, 0x81, 0x03, 0x38, 0xff, 0x00, 0x00, 0x47, 0x00, 0x00, + 0x0a, 0x03, 0x38, 0x38, 0x00, 0x47, 0x00, 0x00, 0x83, 0x03, 0x38, 0x00, + 0x00, 0x01, 0x00, 0x47, 0x2c, 0x06, 0x07, 0x00, 0xcc, 0x03, 0x08, 0x00, + 0x10, 0x00, 0x10, 0x00, 0xb1, 0x00, 0x47, 0xf5, 0x03, 0x3f, 0x00, 0x00, + 0x47, 0x00, 0x00, 0x0d, 0x03, 0x38, 0x38, 0x00, 0x47, 0x00, 0x00, 0x85, + 0x03, 0x38, 0xff, 0x00, 0x00, 0x47, 0x00, 0x00, 0x10, 0x03, 0x38, 0x38, + 0x00, 0x47, 0x00, 0x00, 0x87, 0x03, 0x38, 0x00, 0x00, 0x01, 0x00, 0x47, + 0x07, 0x06, 0x08, 0x08, 0x00, 0x47, 0x80, 0x03, 0x00, 0x47, 0x00, 0x00, + 0x07, 0x03, 0x38, 0x38, 0x00, 0x47, 0x00, 0x00, 0x81, 0x03, 0x38, 0xff, + 0x00, 0x00, 0x47, 0x00, 0x00, 0x0a, 0x03, 0x38, 0x38, 0x00, 0x47, 0x00, + 0x00, 0x83, 0x03, 0x38, 0x00, 0x47, 0x00, 0x00, 0xa2, 0x09, 0x00, 0x00, + 0x07, 0x03, 0x00, 0x00, 0xc2, 0x05, 0x00, 0x00, 0x81, 0x03, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x47, 0x25, 0x06, 0x08, 0x08, 0x00, 0x47, 0xdc, 0x03, + 0x00, 0x47, 0x00, 0x00, 0x0d, 0x03, 0x38, 0x38, 0x00, 0x47, 0x00, 0x00, + 0x85, 0x03, 0x38, 0xff, 0x00, 0x00, 0x47, 0x00, 0x00, 0x10, 0x03, 0x38, + 0x38, 0x00, 0x47, 0x00, 0x00, 0x87, 0x03, 0x38, 0x00, 0x47, 0x00, 0x00, + 0xa2, 0x09, 0x00, 0x00, 0x0d, 0x03, 0x00, 0x00, 0xc2, 0x05, 0x00, 0x00, + 0x85, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x8c, 0x60, 0x04, 0x00, + 0x9c, 0x60, 0x04, 0x00, 0xac, 0x60, 0x04, 0x00, 0xbc, 0x60, 0x04, 0x00, + 0x00, 0x01, 0x00, 0x80, 0xcc, 0x60, 0x04, 0x00, 0xdc, 0x60, 0x04, 0x00, + 0xec, 0x60, 0x04, 0x00, 0xfc, 0x60, 0x04, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x47, 0x07, 0x06, 0x07, 0x00, 0x00, 0x47, 0x13, 0x03, 0x3d, 0x00, + 0x47, 0x0c, 0x06, 0x8c, 0x60, 0x10, 0x01, 0x00, 0x00, 0x0f, 0x8c, 0x60, + 0x00, 0x80, 0x04, 0x00, 0x3f, 0x9c, 0x60, 0x10, 0x01, 0x00, 0x00, 0x0f, + 0x9c, 0x60, 0x00, 0x80, 0x04, 0x00, 0x3e, 0xac, 0x60, 0x10, 0x01, 0x00, + 0x00, 0x0f, 0xac, 0x60, 0x00, 0x80, 0x04, 0x00, 0x3d, 0xbc, 0x60, 0x10, + 0x01, 0x00, 0x00, 0x0f, 0xbc, 0x60, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x47, 0x25, 0x06, 0x07, 0x00, 0x04, 0x00, + 0x00, 0x47, 0x13, 0x03, 0x3d, 0x00, 0x47, 0x0c, 0x06, 0x3f, 0xcc, 0x60, + 0x10, 0x01, 0x00, 0x00, 0x0f, 0xcc, 0x60, 0x00, 0x80, 0x04, 0x00, 0x3f, + 0xdc, 0x60, 0x10, 0x01, 0x00, 0x00, 0x0f, 0xdc, 0x60, 0x00, 0x80, 0x04, + 0x00, 0x3e, 0xec, 0x60, 0x10, 0x01, 0x00, 0x00, 0x0f, 0xec, 0x60, 0x00, + 0x80, 0x04, 0x00, 0x3d, 0xfc, 0x60, 0x10, 0x01, 0x00, 0x00, 0x0f, 0xfc, + 0x60, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, + 0x00, 0x00, 0x20, 0x4d, 0x0c, 0x00, 0x00, 0x47, 0x41, 0x03, 0xff, 0x37, + 0x03, 0xff, 0x2d, 0x03, 0xff, 0x23, 0x03, 0xff, 0x7d, 0x03, 0x00, 0x7e, + 0x03, 0x00, 0x7c, 0x03, 0x00, 0x7f, 0x03, 0x00, 0x01, 0x00, 0x8f, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x47, 0x14, 0x06, 0x1c, 0x06, 0x24, 0x06, 0x00, + 0x00, 0x26, 0x06, 0x27, 0x06, 0x28, 0x06, 0x29, 0x06, 0x2a, 0x06, 0x0d, + 0x06, 0x15, 0x06, 0x1d, 0x06, 0x00, 0x47, 0x22, 0x00, 0x00, 0x01, 0xc6, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x03, 0x20, 0xe8, 0xea, 0x00, 0x47, 0x41, 0x03, + 0x03, 0x20, 0xc0, 0xea, 0x00, 0x47, 0x37, 0x03, 0x03, 0x20, 0x38, 0xeb, + 0x00, 0x47, 0x2d, 0x03, 0x03, 0x20, 0x10, 0xeb, 0x00, 0x47, 0x23, 0x03, + 0x9a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x41, 0x03, 0xdc, 0x7d, 0x03, 0xff, + 0x00, 0x00, 0x00, 0x3b, 0x00, 0xea, 0x23, 0x03, 0xdc, 0x7f, 0x03, 0xff, + 0x00, 0x41, 0x03, 0xdc, 0x7d, 0x03, 0xff, 0x00, 0x37, 0x03, 0xdc, 0x7e, + 0x03, 0xff, 0x00, 0x2d, 0x03, 0xdc, 0x7c, 0x03, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x47, 0x78, 0x03, 0x41, 0x03, 0x37, 0x03, 0x2d, 0x03, + 0x23, 0x03, 0x2d, 0x03, 0xdc, 0xff, 0x00, 0x7c, 0x03, 0xff, 0x00, 0x00, + 0x47, 0x78, 0x03, 0x00, 0x00, 0x04, 0x00, 0x03, 0x20, 0x38, 0xeb, 0x41, + 0x03, 0xdc, 0xff, 0x00, 0x7d, 0x03, 0xff, 0x00, 0x00, 0x47, 0x78, 0x03, + 0x00, 0x00, 0x04, 0x00, 0x03, 0x20, 0xe8, 0xea, 0x00, 0x00, 0x3c, 0x00, + 0xea, 0x37, 0x03, 0xdc, 0xff, 0x00, 0x7e, 0x03, 0xff, 0x00, 0x00, 0x47, + 0x78, 0x03, 0x00, 0x00, 0x04, 0x00, 0x03, 0x20, 0xc0, 0xea, 0x23, 0x03, + 0xdc, 0xff, 0x00, 0x7f, 0x03, 0xff, 0x00, 0x00, 0x47, 0x78, 0x03, 0x00, + 0x00, 0x04, 0x00, 0x03, 0x20, 0x10, 0xeb, 0x00, 0x00, 0x01, 0x00, 0x47, + 0x00, 0x00, 0x2d, 0x03, 0xdc, 0xff, 0x00, 0x7c, 0x03, 0xff, 0x00, 0x00, + 0x00, 0x41, 0x03, 0xdc, 0xff, 0x00, 0x7d, 0x03, 0xff, 0x00, 0xff, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xea, 0x00, 0x00, 0x37, 0x03, 0xdc, 0xff, 0x00, + 0x7e, 0x03, 0xff, 0x00, 0x23, 0x03, 0xdc, 0xff, 0x00, 0x7f, 0x03, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x47, 0x78, 0x03, 0x41, 0x03, 0xdc, 0x3b, 0x00, 0xea, + 0x00, 0x01, 0x00, 0x47, 0x78, 0x03, 0x0f, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x03, 0x20, 0x60, 0xeb, 0x80, 0x00, 0xdf, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x82, 0x60, 0x04, 0x14, 0x30, 0x80, 0x00, 0x00, + 0x47, 0x55, 0x03, 0x41, 0x03, 0xdc, 0x00, 0x00, 0xff, 0x00, 0x00, 0x47, + 0x7d, 0x03, 0xff, 0x00, 0xc3, 0xde, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, + 0xd6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0xd6, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x03, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, + 0xd6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x00, 0xd6, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x06, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, + 0xd6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0xe1, 0x03, 0x24, 0x00, + 0xea, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0xe1, 0x03, 0x25, 0x00, + 0xea, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, + 0xed, 0x03, 0x10, 0x00, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, + 0x00, 0x47, 0xee, 0x03, 0x10, 0x00, 0xe4, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x8c, 0x60, 0x20, 0x01, 0x8c, 0x60, 0x48, 0x01, + 0x05, 0x61, 0xfc, 0x00, 0x01, 0x00, 0x8c, 0x60, 0x20, 0x01, 0x8c, 0x60, + 0x48, 0x01, 0x05, 0x61, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x47, + 0xbe, 0x03, 0x2a, 0x00, 0xeb, 0xff, 0x00, 0x2b, 0x00, 0xeb, 0x00, 0x47, + 0xbf, 0x03, 0x47, 0x00, 0xea, 0xff, 0x00, 0x48, 0x00, 0xea, 0x00, 0x00, + 0x00, 0x01, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x6d, 0x11, 0x6b, 0x7d, 0x00, 0x00, 0x0a, 0x4c, 0x10, 0x00, 0x0a, 0x4c, + 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x98, 0x02, 0x0a, 0x4c, + 0xa0, 0x02, 0x0a, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9c, 0x02, 0x0a, 0x4c, 0xa4, 0x02, 0x0a, 0x4c, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0xf1, 0x3e, 0x24, + 0x00, 0x00, 0x82, 0x60, 0x10, 0x00, 0x82, 0x60, 0x62, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x03, 0x82, 0x60, 0x90, 0x08, 0x82, 0x60, + 0x68, 0x03, 0x82, 0x60, 0xdc, 0x08, 0x82, 0x60, 0x04, 0x04, 0x82, 0x60, + 0xa4, 0x09, 0x82, 0x60, 0x58, 0x04, 0x82, 0x60, 0xfc, 0x09, 0x82, 0x60, + 0x88, 0x05, 0x82, 0x60, 0x2c, 0x0b, 0x82, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xac, 0x03, 0x82, 0x60, 0x30, 0x09, 0x82, 0x60, + 0xbc, 0x03, 0x82, 0x60, 0x44, 0x09, 0x82, 0x60, 0xc4, 0x03, 0x82, 0x60, + 0x4c, 0x09, 0x82, 0x60, 0xc8, 0x03, 0x82, 0x60, 0x54, 0x09, 0x82, 0x60, + 0xcc, 0x03, 0x82, 0x60, 0x5c, 0x09, 0x82, 0x60, 0xd0, 0x03, 0x82, 0x60, + 0x64, 0x09, 0x82, 0x60, 0xd4, 0x03, 0x82, 0x60, 0x6c, 0x09, 0x82, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x08, 0x82, 0x60, + 0x30, 0x0e, 0x82, 0x60, 0x84, 0x08, 0x82, 0x60, 0x3c, 0x0e, 0x82, 0x60, + 0xb8, 0x07, 0x82, 0x60, 0x70, 0x0d, 0x82, 0x60, 0xa8, 0x05, 0x82, 0x60, + 0x54, 0x0b, 0x82, 0x60, 0xa4, 0x05, 0x82, 0x60, 0x4c, 0x0b, 0x82, 0x60, + 0xe0, 0x07, 0x82, 0x60, 0x94, 0x0d, 0x82, 0x60, 0x0c, 0x08, 0x82, 0x60, + 0xc4, 0x0d, 0x82, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0x04, 0x82, 0x60, 0x58, 0x0a, 0x82, 0x60, 0xf8, 0x04, 0x82, 0x60, + 0xa4, 0x0a, 0x82, 0x60, 0x7c, 0x05, 0x82, 0x60, 0x20, 0x0b, 0x82, 0x60, + 0x80, 0x05, 0x82, 0x60, 0x24, 0x0b, 0x82, 0x60, 0x84, 0x05, 0x82, 0x60, + 0x28, 0x0b, 0x82, 0x60, 0x44, 0x05, 0x82, 0x60, 0xe8, 0x0a, 0x82, 0x60, + 0x4c, 0x05, 0x82, 0x60, 0xf4, 0x0a, 0x82, 0x60, 0x54, 0x05, 0x82, 0x60, + 0x00, 0x0b, 0x82, 0x60, 0x68, 0x05, 0x82, 0x60, 0x10, 0x0b, 0x82, 0x60, + 0xe4, 0x05, 0x82, 0x60, 0x88, 0x0b, 0x82, 0x60, 0xf4, 0x05, 0x82, 0x60, + 0x94, 0x0b, 0x82, 0x60, 0x08, 0x06, 0x82, 0x60, 0xac, 0x0b, 0x82, 0x60, + 0x10, 0x06, 0x82, 0x60, 0xb8, 0x0b, 0x82, 0x60, 0x24, 0x06, 0x82, 0x60, + 0xd0, 0x0b, 0x82, 0x60, 0x2c, 0x06, 0x82, 0x60, 0xdc, 0x0b, 0x82, 0x60, + 0x34, 0x06, 0x82, 0x60, 0xe8, 0x0b, 0x82, 0x60, 0x3c, 0x06, 0x82, 0x60, + 0xf4, 0x0b, 0x82, 0x60, 0x50, 0x06, 0x82, 0x60, 0x10, 0x0c, 0x82, 0x60, + 0x5c, 0x06, 0x82, 0x60, 0x24, 0x0c, 0x82, 0x60, 0x68, 0x06, 0x82, 0x60, + 0x34, 0x0c, 0x82, 0x60, 0xa4, 0x06, 0x82, 0x60, 0x80, 0x0c, 0x82, 0x60, + 0xd8, 0x03, 0x82, 0x60, 0x74, 0x09, 0x82, 0x60, 0xe0, 0x06, 0x82, 0x60, + 0xbc, 0x0c, 0x82, 0x60, 0xe8, 0x06, 0x82, 0x60, 0xc8, 0x0c, 0x82, 0x60, + 0xf0, 0x06, 0x82, 0x60, 0xd4, 0x0c, 0x82, 0x60, 0xf8, 0x06, 0x82, 0x60, + 0xe0, 0x0c, 0x82, 0x60, 0xe0, 0x03, 0x82, 0x60, 0x7c, 0x09, 0x82, 0x60, + 0x30, 0x07, 0x82, 0x60, 0x1c, 0x0d, 0x82, 0x60, 0xf0, 0x07, 0x82, 0x60, + 0xac, 0x0d, 0x82, 0x60, 0x18, 0x08, 0x82, 0x60, 0xd4, 0x0d, 0x82, 0x60, + 0x9c, 0x04, 0x82, 0x60, 0x44, 0x0a, 0x82, 0x60, 0xd0, 0x07, 0x82, 0x60, + 0x88, 0x0d, 0x82, 0x60, 0x0c, 0x07, 0x82, 0x60, 0xf8, 0x0c, 0x82, 0x60, + 0x2c, 0x08, 0x82, 0x60, 0xe8, 0x0d, 0x82, 0x60, 0x34, 0x08, 0x82, 0x60, + 0xf0, 0x0d, 0x82, 0x60, 0x3c, 0x08, 0x82, 0x60, 0xf8, 0x0d, 0x82, 0x60, + 0x40, 0x08, 0x82, 0x60, 0xfc, 0x0d, 0x82, 0x60, 0x48, 0x08, 0x82, 0x60, + 0x04, 0x0e, 0x82, 0x60, 0xf0, 0x03, 0x82, 0x60, 0x8c, 0x09, 0x82, 0x60, + 0x50, 0x04, 0x82, 0x60, 0xf4, 0x09, 0x82, 0x60, 0xa0, 0x04, 0x82, 0x60, + 0x48, 0x0a, 0x82, 0x60, 0xa8, 0x04, 0x82, 0x60, 0x50, 0x0a, 0x82, 0x60, + 0x10, 0x04, 0x82, 0x60, 0xb0, 0x09, 0x82, 0x60, 0x60, 0x04, 0x82, 0x60, + 0x08, 0x0a, 0x82, 0x60, 0xec, 0x03, 0x82, 0x60, 0x88, 0x09, 0x82, 0x60, + 0x94, 0x07, 0x82, 0x60, 0x4c, 0x0d, 0x82, 0x60, 0x98, 0x07, 0x82, 0x60, + 0x50, 0x0d, 0x82, 0x60, 0x9c, 0x07, 0x82, 0x60, 0x54, 0x0d, 0x82, 0x60, + 0xa0, 0x07, 0x82, 0x60, 0x58, 0x0d, 0x82, 0x60, 0xa4, 0x07, 0x82, 0x60, + 0x5c, 0x0d, 0x82, 0x60, 0xa8, 0x07, 0x82, 0x60, 0x60, 0x0d, 0x82, 0x60, + 0xac, 0x07, 0x82, 0x60, 0x64, 0x0d, 0x82, 0x60, 0xb0, 0x07, 0x82, 0x60, + 0x68, 0x0d, 0x82, 0x60, 0xb4, 0x07, 0x82, 0x60, 0x6c, 0x0d, 0x82, 0x60, + 0xc8, 0x05, 0x82, 0x60, 0x68, 0x0b, 0x82, 0x60, 0xe8, 0x03, 0x82, 0x60, + 0x84, 0x09, 0x82, 0x60, 0x24, 0x07, 0x82, 0x60, 0x10, 0x0d, 0x82, 0x60, + 0xc8, 0x07, 0x82, 0x60, 0x80, 0x0d, 0x82, 0x60, 0x54, 0x08, 0x82, 0x60, + 0x10, 0x0e, 0x82, 0x60, 0x5c, 0x08, 0x82, 0x60, 0x18, 0x0e, 0x82, 0x60, + 0x64, 0x08, 0x82, 0x60, 0x20, 0x0e, 0x82, 0x60, 0x6c, 0x08, 0x82, 0x60, + 0x28, 0x0e, 0x82, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x08, 0x82, 0x60, + 0x44, 0x0e, 0x82, 0x60, 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xf1, + 0x90, 0x50, 0x81, 0xc5, 0x90, 0x50, 0xa9, 0xae, 0xd6, 0xf0, 0xc8, 0x81, + 0xf1, 0x89, 0xad, 0xd0, 0xc4, 0xd6, 0xf1, 0x90, 0x58, 0x81, 0xc5, 0xc4, + 0xd6, 0xf0, 0xc8, 0xfd, 0x55, 0x85, 0x95, 0xad, 0xd6, 0xfe, 0x56, 0xd0, + 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, 0xf5, 0xd6, 0x90, 0xae, 0x56, + 0xd0, 0xd6, 0xf0, 0xfe, 0x56, 0x86, 0xc5, 0xc6, 0xce, 0xc4, 0xd6, 0x90, + 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xd6, 0xf0, 0x90, + 0xad, 0xae, 0x56, 0xd0, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0x91, 0xc5, 0xfe, + 0x56, 0xd6, 0xf5, 0xd6, 0xd0, 0xd0, 0xa5, 0xc8, 0xad, 0xd0, 0xd0, 0xa5, + 0xc8, 0xad, 0xd0, 0xd0, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xd6, 0xf1, + 0x90, 0x58, 0x81, 0xc5, 0xc4, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xd3, + 0xcd, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf5, 0x90, 0xae, 0x56, 0xd6, 0xd0, + 0x58, 0xad, 0xae, 0xd6, 0xd0, 0xc4, 0xc6, 0x00, 0xce, 0xd6, 0x90, 0xae, + 0x56, 0xd0, 0xc6, 0x00, 0xce, 0x55, 0xc4, 0xc6, 0xce, 0x55, 0xc4, 0xc6, + 0xce, 0x55, 0xc4, 0xc6, 0xce, 0x55, 0xc4, 0xc6, 0xce, 0x55, 0xc4, 0xc6, + 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xad, + 0xae, 0x56, 0xd0, 0xc6, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0xf0, 0xc8, 0xf9, 0x51, 0x81, 0xf1, 0x89, 0xad, 0xfe, 0x56, + 0xd0, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xc6, 0x00, 0xce, 0xd6, 0xf1, 0x90, + 0x50, 0xaa, 0x81, 0x92, 0xc8, 0x81, 0xc5, 0xc6, 0xce, 0x90, 0x50, 0xad, + 0xae, 0xd6, 0xd0, 0x90, 0x50, 0xa9, 0xae, 0xd6, 0xf0, 0xc8, 0x81, 0xf1, + 0x89, 0xad, 0xd0, 0xd6, 0x90, 0xae, 0x5e, 0xad, 0xd0, 0xd6, 0xfe, 0x56, + 0xd0, 0xd6, 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xd6, 0x90, 0x50, 0xad, 0xae, + 0xd0, 0xd6, 0xf5, 0x90, 0x50, 0xae, 0xd6, 0xd0, 0xad, 0xd6, 0xd0, 0xc4, + 0xd6, 0xf1, 0x90, 0x58, 0x81, 0xc5, 0xc4, 0xd3, 0xcd, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xd6, 0xf0, 0xf9, + 0x51, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf5, 0x90, 0x50, 0xae, 0xd6, 0xd0, + 0xd6, 0xf1, 0x90, 0x58, 0x81, 0xc5, 0xd6, 0x90, 0x50, 0xa9, 0xf0, 0x91, + 0x81, 0xc5, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0x90, 0x50, 0xa9, + 0xae, 0xf0, 0xc8, 0x81, 0xf1, 0x89, 0xad, 0xd0, 0xd6, 0x90, 0x50, 0xad, + 0xae, 0xd0, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0x90, 0xad, 0xae, 0x56, + 0xd0, 0xc6, 0x00, 0x00, 0xce, 0xcf, 0xc6, 0x00, 0xce, 0xd6, 0x90, 0x50, + 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, + 0xce, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, + 0xfd, 0x55, 0xd6, 0xf0, 0xc8, 0x85, 0x95, 0xad, 0xfe, 0x56, 0xd6, 0xd0, + 0xcd, 0x90, 0xad, 0xae, 0x5e, 0xd6, 0xd0, 0xcd, 0x90, 0xaa, 0xd6, 0xea, + 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0x90, 0xad, 0xaa, 0x5a, + 0xd6, 0xf0, 0xa9, 0xc8, 0x81, 0x82, 0xae, 0xd6, 0xd0, 0x90, 0xa9, 0x59, + 0xd6, 0xf2, 0xa2, 0xc8, 0x91, 0x81, 0x82, 0xc5, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x90, 0xa9, 0x59, 0xd6, 0xf2, 0xa2, 0xc8, 0x91, 0x81, 0x82, 0xc5, + 0x90, 0x60, 0xaa, 0xd6, 0xea, 0xd6, 0xf0, 0xc8, 0xad, 0xd6, 0xf0, 0xa9, + 0xc8, 0x81, 0xa9, 0x90, 0x58, 0x81, 0xae, 0xd6, 0xd0, 0xd6, 0x90, 0x58, + 0xad, 0xf0, 0xc8, 0x85, 0x95, 0xad, 0x90, 0xae, 0x5e, 0xd6, 0xd0, 0xcd, + 0x90, 0x58, 0xad, 0xae, 0xd6, 0xd0, 0xcd, 0xd6, 0x90, 0xf8, 0xad, 0xae, + 0xd0, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, 0xf5, 0x90, 0x50, 0x8d, + 0xd6, 0xe8, 0xc6, 0x00, 0xce, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xc6, + 0xce, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0x90, 0x50, + 0xad, 0xae, 0xd0, 0x56, 0xf1, 0xa1, 0xc8, 0x86, 0x96, 0xaa, 0xa1, 0x86, + 0x82, 0xc5, 0xc6, 0x00, 0xce, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0x56, + 0xf1, 0xa1, 0xc8, 0x86, 0x96, 0xaa, 0xa1, 0x86, 0x82, 0xc5, 0xc6, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xd6, 0x90, 0xad, 0xae, 0x56, + 0xd0, 0xd6, 0xae, 0xfe, 0xfd, 0xd0, 0xd6, 0xae, 0x56, 0x55, 0xd0, 0xc4, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd3, 0xcd, 0xc6, 0xce, 0x90, 0xaa, 0x5a, + 0xab, 0x53, 0xac, 0x54, 0xd6, 0xf1, 0xa1, 0x82, 0x92, 0xad, 0xa1, 0x83, + 0x93, 0xc8, 0x85, 0xad, 0xd6, 0xf0, 0x84, 0x94, 0xc8, 0x85, 0xad, 0xc5, + 0xa2, 0xc5, 0xc6, 0x00, 0xce, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0xd6, + 0xf0, 0xc8, 0xad, 0xd6, 0x90, 0xae, 0x56, 0xd0, 0xd6, 0xad, 0xae, 0xfe, + 0xd0, 0xd6, 0xad, 0xae, 0x56, 0xd0, 0xaa, 0xc6, 0xce, 0xd6, 0xf1, 0x90, + 0x58, 0x58, 0x81, 0xa9, 0xc5, 0x90, 0x58, 0x58, 0x91, 0xc5, 0xc4, 0xc6, + 0xce, 0x90, 0xae, 0xad, 0x5d, 0x56, 0xd6, 0xd0, 0xd6, 0xf1, 0xd6, 0xf0, + 0xc8, 0x89, 0xf9, 0x51, 0x81, 0xc5, 0xc6, 0x00, 0xce, 0xd6, 0xc1, 0xc4, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0xd6, + 0xf1, 0xd6, 0xf0, 0xc8, 0x89, 0xf9, 0x51, 0x81, 0xc5, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0xc1, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xc1, 0xc0, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xc1, 0xc0, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xd6, 0xf1, 0xd6, 0xf0, 0xc8, 0x89, 0xf9, 0x51, 0x81, 0xc5, 0xd6, + 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc0, 0xc6, 0x00, 0xce, 0xd6, 0xc1, 0xc1, + 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0xc1, 0x90, + 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x51, 0x53, + 0x0b, 0x59, 0x0b, 0xd6, 0xc1, 0xc1, 0xc1, 0xcd, 0xd6, 0xc1, 0xfa, 0x52, + 0xd6, 0xea, 0xd6, 0x90, 0x58, 0xad, 0xae, 0xd0, 0xcd, 0xd6, 0x90, 0xad, + 0xae, 0xfe, 0xd0, 0x90, 0x58, 0xad, 0xd6, 0xf0, 0xc8, 0x85, 0x95, 0xad, + 0x90, 0x58, 0xae, 0xd6, 0xd0, 0xcd, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, + 0x58, 0xad, 0xae, 0xd6, 0xd0, 0xcd, 0xc6, 0x00, 0xce, 0x90, 0x58, 0x58, + 0xad, 0xd6, 0xf0, 0xc8, 0x85, 0x95, 0xad, 0x90, 0x58, 0x58, 0xae, 0xd6, + 0xd0, 0xcd, 0x90, 0xad, 0x58, 0xae, 0xd6, 0xd0, 0xd6, 0x90, 0xf8, 0xad, + 0xae, 0xd0, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, 0xc1, 0xc1, 0xc1, + 0xd6, 0x51, 0x53, 0x0b, 0x59, 0x0b, 0xcd, 0xd6, 0x90, 0xad, 0x58, 0xae, + 0xd0, 0x90, 0xd6, 0xe8, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x56, 0xd6, 0x4e, + 0xc4, 0xc6, 0x00, 0x00, 0xce, 0x56, 0x90, 0xd6, 0x4e, 0x48, 0xc6, 0x00, + 0xce, 0xd6, 0x99, 0x90, 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0x99, 0x90, + 0x50, 0x59, 0x81, 0x51, 0x89, 0x48, 0xd3, 0xcd, 0xd6, 0xf0, 0x58, 0xe8, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xf4, 0xfa, 0x52, 0xd6, 0xf1, 0x90, + 0x50, 0x81, 0xc8, 0xab, 0x8a, 0xaa, 0xa3, 0xc8, 0x8a, 0x84, 0xd6, 0xe8, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xf2, 0x90, 0x50, 0x8a, 0xd6, 0xe8, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0xac, 0xad, 0xaf, 0x57, 0xae, 0xfe, + 0xab, 0x53, 0xaa, 0xfa, 0xd6, 0xf0, 0x86, 0xc8, 0x7f, 0xfe, 0x56, 0x6e, + 0xae, 0xe6, 0xa9, 0x82, 0xc8, 0xac, 0xa1, 0x83, 0x7c, 0xad, 0x90, 0x50, + 0x6e, 0xae, 0xe6, 0xa9, 0x82, 0xc8, 0xac, 0xa1, 0x83, 0x7c, 0x6d, 0xad, + 0x90, 0x50, 0x6e, 0xae, 0xe6, 0xa9, 0x82, 0xc8, 0xac, 0xa1, 0x83, 0x7c, + 0x6d, 0xa9, 0x90, 0x50, 0x79, 0xaa, 0x51, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, + 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, + 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, + 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0x90, 0xf8, 0xad, + 0xae, 0xd6, 0xd0, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, 0x00, 0x00, + 0xce, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0x58, + 0xad, 0xae, 0xd0, 0xd6, 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0x90, 0xad, 0x56, + 0xfe, 0xd6, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xaa, 0x52, 0x58, 0x58, 0xad, + 0xae, 0xd0, 0xd6, 0xf0, 0x82, 0x92, 0xc5, 0xd6, 0x90, 0xad, 0xae, 0xfe, + 0xd0, 0xd6, 0xa2, 0xad, 0xae, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0xf0, 0xc8, + 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf1, 0x90, + 0x50, 0x81, 0xc5, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0x56, 0xf0, 0x86, + 0xc5, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, + 0xce, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, 0xce, 0xc4, 0xc4, 0xc6, + 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xc4, 0xd6, 0x90, + 0xad, 0xae, 0x56, 0xd0, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0xad, 0xae, + 0x56, 0xd6, 0xd0, 0xc6, 0xce, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0xc6, + 0xce, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, 0xce, 0x90, 0xad, 0xae, + 0x56, 0xd6, 0xd0, 0xc6, 0xce, 0x90, 0x50, 0xae, 0xc8, 0xa9, 0xd6, 0xf0, + 0x81, 0x91, 0xc8, 0xad, 0xd0, 0xc6, 0x00, 0x00, 0xce, 0x90, 0xad, 0xae, + 0x56, 0xd6, 0xd0, 0xc6, 0xce, 0xc6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x20, 0x00, 0x18, 0x30, 0x14, 0x30, 0x00, 0x10, 0x13, 0x10, 0x00, 0x02, + 0x00, 0x18, 0x30, 0x02, 0x18, 0x30, 0x18, 0x30, 0x32, 0x02, 0x00, 0x14, + 0x30, 0x28, 0x3a, 0x02, 0x00, 0x14, 0x30, 0x10, 0x00, 0x01, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x07, 0x00, 0x00, 0x30, + 0x34, 0x00, 0x02, 0x00, 0x2c, 0x30, 0x03, 0x00, 0x03, 0x00, 0x58, 0x00, + 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x41, 0x06, 0x00, 0x00, 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x30, 0x34, 0x00, 0x03, 0x00, 0x58, 0x00, 0x03, + 0x00, 0x58, 0x00, 0x02, 0x00, 0x2c, 0x30, 0x00, 0x00, 0x02, 0x00, 0x27, + 0x00, 0x00, 0xff, 0x03, 0x02, 0x00, 0x28, 0x30, 0x0d, 0x00, 0x50, 0x00, + 0x8c, 0x00, 0x36, 0x60, 0x00, 0x9c, 0x00, 0x36, 0x70, 0x00, 0xac, 0x00, + 0x02, 0x00, 0x20, 0x30, 0x08, 0x00, 0x06, 0x02, 0x00, 0x14, 0x30, 0x31, + 0x33, 0x02, 0x00, 0x20, 0x00, 0x18, 0x30, 0x45, 0x00, 0x0a, 0x40, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x20, 0x30, 0x07, 0x00, 0x0e, 0x00, 0x04, 0x00, + 0x0e, 0x00, 0x68, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x07, 0x00, 0x20, 0x30, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x08, 0x00, 0x20, 0x30, 0x00, 0x01, 0x02, 0x00, 0x08, 0x00, 0x20, 0x30, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x18, 0x30, 0x01, 0x00, 0x00, 0x08, 0x00, 0x18, 0x30, 0x00, 0x00, 0x08, + 0x00, 0x18, 0x30, 0x14, 0x30, 0x00, 0x10, 0x13, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x00, 0x20, 0x38, 0x49, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, + 0x02, 0x00, 0x14, 0x30, 0x80, 0x00, 0x02, 0x00, 0x18, 0x30, 0x02, 0x18, + 0x30, 0x18, 0x30, 0x02, 0x00, 0x18, 0x30, 0x02, 0x00, 0xff, 0x3f, 0xc0, + 0xff, 0x20, 0x30, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0x00, 0x08, + 0x00, 0x14, 0x30, 0x0e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x18, + 0x30, 0x0e, 0x00, 0x00, 0x00, 0x32, 0x02, 0x00, 0x14, 0x30, 0x28, 0x3a, + 0x46, 0x00, 0x0a, 0x40, 0x00, 0x01, 0x02, 0x00, 0x04, 0x00, 0x18, 0x30, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x20, 0x00, 0x4a, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x18, 0x30, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x14, 0x30, 0x31, 0x02, 0x00, 0x20, 0x00, 0x18, 0x30, 0x33, + 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x18, 0x30, + 0x01, 0x18, 0x30, 0x18, 0x30, 0x02, 0x00, 0x10, 0x00, 0x14, 0x30, 0x02, + 0x00, 0x04, 0x00, 0x18, 0x30, 0x00, 0x40, 0x14, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x20, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x02, 0x00, 0x20, 0x00, 0x14, 0x30, 0x00, 0x01, 0x06, 0x00, + 0x00, 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x30, + 0x34, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x14, 0x30, 0x39, 0x00, + 0x00, 0x02, 0x00, 0x04, 0x00, 0x14, 0x00, 0x34, 0x01, 0x03, 0x00, 0x18, + 0x00, 0x32, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x0b, 0x00, 0x84, 0x0d, 0x0b, + 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x14, 0x30, 0x03, 0x00, 0x58, 0x00, + 0x3f, 0x0b, 0x00, 0x84, 0x0d, 0x02, 0x00, 0x2c, 0x30, 0x3f, 0x26, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0x3f, 0x27, 0x03, 0x00, 0x1c, 0x00, + 0x02, 0x00, 0x14, 0x30, 0x35, 0x03, 0x00, 0x58, 0x00, 0x3f, 0x0b, 0x00, + 0x84, 0x0d, 0x02, 0x00, 0x14, 0x30, 0x38, 0x04, 0x00, 0x14, 0x00, 0x08, + 0x00, 0x03, 0x00, 0x18, 0x00, 0x34, 0x01, 0x06, 0x00, 0x00, 0x01, 0x08, + 0x00, 0x07, 0x00, 0x00, 0x30, 0x34, 0x00, 0x02, 0x00, 0x2c, 0x30, 0x20, + 0x00, 0x03, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x2c, 0x30, 0x02, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x2c, 0x30, 0x02, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x80, 0x00, 0x14, 0x30, 0x00, 0x02, 0x14, 0x30, 0x01, 0x3d, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x80, 0x00, 0x14, 0x30, 0x00, 0x02, 0x14, 0x30, + 0x01, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x10, 0x11, 0x24, 0x00, + 0x06, 0x00, 0x01, 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, 0x30, 0x00, 0x10, + 0x34, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x04, 0x14, 0x30, 0x15, 0x00, + 0x00, 0x01, 0x14, 0x00, 0x10, 0xe7, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, + 0x00, 0x04, 0x04, 0x00, 0x48, 0x00, 0x3e, 0x04, 0x00, 0x64, 0x00, 0x36, + 0x55, 0x15, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x10, 0x11, 0x24, 0x00, + 0x02, 0x00, 0x30, 0x30, 0x38, 0x06, 0x00, 0x01, 0x01, 0x08, 0x00, 0x07, + 0x00, 0x00, 0x30, 0x34, 0x00, 0x02, 0x00, 0x00, 0x04, 0x14, 0x30, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x2e, 0x2d, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x03, 0x00, 0x02, 0x00, 0x14, 0x30, 0x03, 0x00, 0x18, 0x00, + 0x02, 0x00, 0x30, 0x30, 0x01, 0x00, 0x00, 0x03, 0x00, 0x28, 0x00, 0x00, + 0x00, 0x01, 0x07, 0x00, 0x0f, 0x80, 0x02, 0x02, 0x2f, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x03, 0x00, 0x02, 0x00, 0x14, 0x30, 0x03, 0x00, 0x18, 0x00, + 0x02, 0x00, 0x30, 0x30, 0x01, 0x00, 0x00, 0x03, 0x00, 0x28, 0x00, 0x00, + 0x00, 0x01, 0x07, 0x00, 0x0f, 0x80, 0x02, 0x02, 0x2f, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x07, 0x00, 0x33, 0x80, 0x30, 0x3c, 0x00, 0x80, 0x01, 0x00, + 0x00, 0x01, 0x07, 0x00, 0x33, 0x80, 0x24, 0x3c, 0x00, 0x80, 0x04, 0x00, + 0x00, 0x01, 0x03, 0x00, 0x18, 0x00, 0x02, 0x00, 0x30, 0x30, 0x01, 0x00, + 0x00, 0x03, 0x00, 0x31, 0x02, 0x00, 0x03, 0x00, 0x14, 0x30, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x33, 0x80, 0x00, 0x83, + 0x0f, 0x80, 0x00, 0x02, 0x00, 0x03, 0x03, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x07, 0x00, 0x33, 0x80, 0x34, 0x3c, 0x00, 0x03, 0x03, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x3a, 0x00, 0x01, 0x00, + 0x07, 0x00, 0x30, 0x80, 0x0a, 0x0b, 0x30, 0x80, 0x08, 0x0b, 0x30, 0x80, + 0x00, 0x0b, 0xec, 0x01, 0x08, 0x00, 0x00, 0x80, 0x00, 0x80, 0xff, 0xff, + 0xff, 0xff, 0x03, 0x00, 0x1c, 0x00, 0x0b, 0x00, 0x84, 0x0d, 0x0a, 0x00, + 0x0d, 0x00, 0x00, 0x80, 0x04, 0x00, 0x02, 0x00, 0x14, 0x30, 0x38, 0x04, + 0x00, 0x14, 0x00, 0x08, 0x00, 0x04, 0x00, 0x30, 0x00, 0x00, 0x80, 0x03, + 0x00, 0x18, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x39, 0x04, 0x00, 0x14, 0x00, 0xc5, 0x00, 0x03, 0x00, 0x18, + 0x00, 0x0d, 0x00, 0x00, 0x80, 0x04, 0x00, 0x04, 0x00, 0x30, 0x00, 0x00, + 0x80, 0x07, 0x00, 0x30, 0x80, 0x08, 0x0b, 0x30, 0x80, 0x0a, 0x0b, 0x30, + 0x80, 0x0b, 0x0b, 0x08, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x0b, + 0x00, 0x84, 0x0d, 0x03, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x09, 0x00, 0xe1, 0x68, 0x38, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x09, 0x00, 0xe1, 0x68, 0xe1, 0x68, 0x00, 0x00, 0x00, 0x05, 0x09, 0x00, + 0xe1, 0x68, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x05, 0x09, 0x00, + 0xe1, 0x68, 0x3f, 0x00, 0x80, 0x00, 0xe1, 0x68, 0x37, 0x00, 0x43, 0x40, + 0x02, 0x00, 0x24, 0x30, 0x24, 0x30, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x2c, 0x30, 0xff, 0xff, 0x00, 0x01, 0x02, 0x00, 0x18, 0x30, 0x20, 0x00, + 0x3c, 0x3f, 0x03, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x2c, 0x30, 0x30, 0x00, 0x03, 0x00, 0x58, 0x00, 0x00, 0x01, 0x3c, 0x00, + 0x00, 0x80, 0xff, 0x03, 0x00, 0x40, 0x0d, 0x00, 0x00, 0x00, 0x21, 0x00, + 0x00, 0x50, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x01, 0x00, + 0x01, 0x00, 0x33, 0x54, 0x34, 0x53, 0x35, 0x52, 0x36, 0x51, 0x37, 0x50, + 0x38, 0x4f, 0x39, 0x4e, 0x3a, 0x4d, 0x3b, 0x4c, 0x00, 0x01, 0x20, 0x00, + 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x08, + 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x00, 0x20, 0x00, 0x01, 0x00, 0x40, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x10, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x04, 0x00, + 0x14, 0x00, 0x06, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x01, 0x0b, 0x00, + 0x80, 0x0d, 0x08, 0x00, 0xff, 0x00, 0xff, 0x02, 0x00, 0x18, 0x30, 0xff, + 0x00, 0xff, 0x00, 0x0b, 0x00, 0x80, 0x0d, 0x00, 0x00, 0x01, 0x04, 0x00, + 0x00, 0x01, 0x14, 0x00, 0x02, 0x00, 0x14, 0x30, 0x16, 0x06, 0x00, 0x00, + 0x01, 0x08, 0x00, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x18, 0x30, 0x38, 0xff, 0x00, 0xff, 0x00, 0x0b, 0x00, 0x80, 0x0d, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x17, 0x02, 0x00, 0x00, + 0x01, 0x14, 0x30, 0x20, 0x00, 0x18, 0x30, 0x3e, 0x00, 0x01, 0x0c, 0x00, + 0x20, 0x00, 0x04, 0x00, 0x00, 0x01, 0x0c, 0x00, 0x20, 0x00, 0x04, 0x00, + 0x00, 0x01, 0x43, 0x40, 0x00, 0x01, 0x02, 0x00, 0x04, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x41, 0x02, 0x00, 0x04, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x02, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x00, 0x02, + 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x08, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x10, 0x00, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x00, 0x20, + 0x01, 0x02, 0x00, 0x14, 0x30, 0x3f, 0x14, 0x30, 0x00, 0x01, 0x00, 0x20, + 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x8a, 0x69, 0x7a, 0x00, 0x00, 0x92, 0x60, 0x10, 0x00, 0x92, 0x60, + 0x62, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x28, 0x03, 0x92, 0x60, + 0x90, 0x08, 0x92, 0x60, 0x68, 0x03, 0x92, 0x60, 0xdc, 0x08, 0x92, 0x60, + 0x04, 0x04, 0x92, 0x60, 0xa4, 0x09, 0x92, 0x60, 0x58, 0x04, 0x92, 0x60, + 0xfc, 0x09, 0x92, 0x60, 0x88, 0x05, 0x92, 0x60, 0x2c, 0x0b, 0x92, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x03, 0x92, 0x60, + 0x30, 0x09, 0x92, 0x60, 0xbc, 0x03, 0x92, 0x60, 0x44, 0x09, 0x92, 0x60, + 0xc4, 0x03, 0x92, 0x60, 0x4c, 0x09, 0x92, 0x60, 0xc8, 0x03, 0x92, 0x60, + 0x54, 0x09, 0x92, 0x60, 0xcc, 0x03, 0x92, 0x60, 0x5c, 0x09, 0x92, 0x60, + 0xd0, 0x03, 0x92, 0x60, 0x64, 0x09, 0x92, 0x60, 0xd4, 0x03, 0x92, 0x60, + 0x6c, 0x09, 0x92, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x08, 0x92, 0x60, 0x30, 0x0e, 0x92, 0x60, 0x84, 0x08, 0x92, 0x60, + 0x3c, 0x0e, 0x92, 0x60, 0xb8, 0x07, 0x92, 0x60, 0x70, 0x0d, 0x92, 0x60, + 0xa8, 0x05, 0x92, 0x60, 0x54, 0x0b, 0x92, 0x60, 0xa4, 0x05, 0x92, 0x60, + 0x4c, 0x0b, 0x92, 0x60, 0xe0, 0x07, 0x92, 0x60, 0x94, 0x0d, 0x92, 0x60, + 0x0c, 0x08, 0x92, 0x60, 0xc4, 0x0d, 0x92, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb0, 0x04, 0x92, 0x60, 0x58, 0x0a, 0x92, 0x60, + 0xf8, 0x04, 0x92, 0x60, 0xa4, 0x0a, 0x92, 0x60, 0x7c, 0x05, 0x92, 0x60, + 0x20, 0x0b, 0x92, 0x60, 0x80, 0x05, 0x92, 0x60, 0x24, 0x0b, 0x92, 0x60, + 0x84, 0x05, 0x92, 0x60, 0x28, 0x0b, 0x92, 0x60, 0x44, 0x05, 0x92, 0x60, + 0xe8, 0x0a, 0x92, 0x60, 0x4c, 0x05, 0x92, 0x60, 0xf4, 0x0a, 0x92, 0x60, + 0x54, 0x05, 0x92, 0x60, 0x00, 0x0b, 0x92, 0x60, 0x68, 0x05, 0x92, 0x60, + 0x10, 0x0b, 0x92, 0x60, 0xe4, 0x05, 0x92, 0x60, 0x88, 0x0b, 0x92, 0x60, + 0xf4, 0x05, 0x92, 0x60, 0x94, 0x0b, 0x92, 0x60, 0x08, 0x06, 0x92, 0x60, + 0xac, 0x0b, 0x92, 0x60, 0x10, 0x06, 0x92, 0x60, 0xb8, 0x0b, 0x92, 0x60, + 0x24, 0x06, 0x92, 0x60, 0xd0, 0x0b, 0x92, 0x60, 0x2c, 0x06, 0x92, 0x60, + 0xdc, 0x0b, 0x92, 0x60, 0x34, 0x06, 0x92, 0x60, 0xe8, 0x0b, 0x92, 0x60, + 0x3c, 0x06, 0x92, 0x60, 0xf4, 0x0b, 0x92, 0x60, 0x50, 0x06, 0x92, 0x60, + 0x10, 0x0c, 0x92, 0x60, 0x5c, 0x06, 0x92, 0x60, 0x24, 0x0c, 0x92, 0x60, + 0x68, 0x06, 0x92, 0x60, 0x34, 0x0c, 0x92, 0x60, 0xa4, 0x06, 0x92, 0x60, + 0x80, 0x0c, 0x92, 0x60, 0xd8, 0x03, 0x92, 0x60, 0x74, 0x09, 0x92, 0x60, + 0xe0, 0x06, 0x92, 0x60, 0xbc, 0x0c, 0x92, 0x60, 0xe8, 0x06, 0x92, 0x60, + 0xc8, 0x0c, 0x92, 0x60, 0xf0, 0x06, 0x92, 0x60, 0xd4, 0x0c, 0x92, 0x60, + 0xf8, 0x06, 0x92, 0x60, 0xe0, 0x0c, 0x92, 0x60, 0xe0, 0x03, 0x92, 0x60, + 0x7c, 0x09, 0x92, 0x60, 0x30, 0x07, 0x92, 0x60, 0x1c, 0x0d, 0x92, 0x60, + 0xf0, 0x07, 0x92, 0x60, 0xac, 0x0d, 0x92, 0x60, 0x18, 0x08, 0x92, 0x60, + 0xd4, 0x0d, 0x92, 0x60, 0x9c, 0x04, 0x92, 0x60, 0x44, 0x0a, 0x92, 0x60, + 0xd0, 0x07, 0x92, 0x60, 0x88, 0x0d, 0x92, 0x60, 0x0c, 0x07, 0x92, 0x60, + 0xf8, 0x0c, 0x92, 0x60, 0x2c, 0x08, 0x92, 0x60, 0xe8, 0x0d, 0x92, 0x60, + 0x34, 0x08, 0x92, 0x60, 0xf0, 0x0d, 0x92, 0x60, 0x3c, 0x08, 0x92, 0x60, + 0xf8, 0x0d, 0x92, 0x60, 0x40, 0x08, 0x92, 0x60, 0xfc, 0x0d, 0x92, 0x60, + 0x48, 0x08, 0x92, 0x60, 0x04, 0x0e, 0x92, 0x60, 0xf0, 0x03, 0x92, 0x60, + 0x8c, 0x09, 0x92, 0x60, 0x50, 0x04, 0x92, 0x60, 0xf4, 0x09, 0x92, 0x60, + 0xa0, 0x04, 0x92, 0x60, 0x48, 0x0a, 0x92, 0x60, 0xa8, 0x04, 0x92, 0x60, + 0x50, 0x0a, 0x92, 0x60, 0x10, 0x04, 0x92, 0x60, 0xb0, 0x09, 0x92, 0x60, + 0x60, 0x04, 0x92, 0x60, 0x08, 0x0a, 0x92, 0x60, 0xec, 0x03, 0x92, 0x60, + 0x88, 0x09, 0x92, 0x60, 0x94, 0x07, 0x92, 0x60, 0x4c, 0x0d, 0x92, 0x60, + 0x98, 0x07, 0x92, 0x60, 0x50, 0x0d, 0x92, 0x60, 0x9c, 0x07, 0x92, 0x60, + 0x54, 0x0d, 0x92, 0x60, 0xa0, 0x07, 0x92, 0x60, 0x58, 0x0d, 0x92, 0x60, + 0xa4, 0x07, 0x92, 0x60, 0x5c, 0x0d, 0x92, 0x60, 0xa8, 0x07, 0x92, 0x60, + 0x60, 0x0d, 0x92, 0x60, 0xac, 0x07, 0x92, 0x60, 0x64, 0x0d, 0x92, 0x60, + 0xb0, 0x07, 0x92, 0x60, 0x68, 0x0d, 0x92, 0x60, 0xb4, 0x07, 0x92, 0x60, + 0x6c, 0x0d, 0x92, 0x60, 0xc8, 0x05, 0x92, 0x60, 0x68, 0x0b, 0x92, 0x60, + 0xe8, 0x03, 0x92, 0x60, 0x84, 0x09, 0x92, 0x60, 0x24, 0x07, 0x92, 0x60, + 0x10, 0x0d, 0x92, 0x60, 0xc8, 0x07, 0x92, 0x60, 0x80, 0x0d, 0x92, 0x60, + 0x54, 0x08, 0x92, 0x60, 0x10, 0x0e, 0x92, 0x60, 0x5c, 0x08, 0x92, 0x60, + 0x18, 0x0e, 0x92, 0x60, 0x64, 0x08, 0x92, 0x60, 0x20, 0x0e, 0x92, 0x60, + 0x6c, 0x08, 0x92, 0x60, 0x28, 0x0e, 0x92, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8c, 0x08, 0x92, 0x60, 0x44, 0x0e, 0x92, 0x60, 0xce, 0xd6, 0x90, 0x50, + 0xad, 0xae, 0xd0, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0x90, 0x50, 0xa9, 0xae, + 0xd6, 0xf0, 0xc8, 0x81, 0xf1, 0x89, 0xad, 0xd0, 0xc4, 0xd6, 0xf1, 0x90, + 0x58, 0x81, 0xc5, 0xc4, 0xd6, 0xf0, 0xc8, 0xfd, 0x55, 0x85, 0x95, 0xad, + 0xd6, 0xfe, 0x56, 0xd0, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, 0xf5, + 0xd6, 0x90, 0xae, 0x56, 0xd0, 0xd6, 0xf0, 0xfe, 0x56, 0x86, 0xc5, 0xc6, + 0xce, 0xc4, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0x55, 0xfe, 0x56, + 0xd0, 0xd6, 0xf0, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xd6, 0xf0, 0xf9, 0x51, + 0x81, 0x91, 0xc5, 0xfe, 0x56, 0xd6, 0xf5, 0xd6, 0xd0, 0xd0, 0xa5, 0xc8, + 0xad, 0xd0, 0xd0, 0xa5, 0xc8, 0xad, 0xd0, 0xd0, 0xd6, 0xf1, 0x90, 0x50, + 0x81, 0xc5, 0xd6, 0xf1, 0x90, 0x58, 0x81, 0xc5, 0xc4, 0xd6, 0x90, 0xad, + 0xae, 0x56, 0xd0, 0xd3, 0xcd, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf5, 0x90, + 0xae, 0x56, 0xd6, 0xd0, 0x58, 0xad, 0xae, 0xd6, 0xd0, 0xc4, 0xc6, 0x00, + 0xce, 0xd6, 0x90, 0xae, 0x56, 0xd0, 0xc6, 0x00, 0xce, 0x55, 0xc4, 0xc6, + 0xce, 0x55, 0xc4, 0xc6, 0xce, 0x55, 0xc4, 0xc6, 0xce, 0x55, 0xc4, 0xc6, + 0xce, 0x55, 0xc4, 0xc6, 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, + 0xce, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf0, 0xc8, 0xf9, 0x51, 0x81, 0xf1, + 0x89, 0xad, 0xfe, 0x56, 0xd0, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xc6, 0x00, + 0xce, 0xd6, 0xf1, 0x90, 0x50, 0xaa, 0x81, 0x92, 0xc8, 0x81, 0xc5, 0xc6, + 0xce, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0x90, 0x50, 0xa9, 0xae, 0xd6, + 0xf0, 0xc8, 0x81, 0xf1, 0x89, 0xad, 0xd0, 0xd6, 0x90, 0xae, 0x5e, 0xad, + 0xd0, 0xd6, 0xfe, 0x56, 0xd0, 0xd6, 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xd6, + 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, 0xf5, 0x90, 0x50, 0xae, 0xd6, 0xd0, + 0xad, 0xd6, 0xd0, 0xc4, 0xd6, 0xf1, 0x90, 0x58, 0x81, 0xc5, 0xc4, 0xd3, + 0xcd, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, + 0xce, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf5, 0x90, + 0x50, 0xae, 0xd6, 0xd0, 0xd6, 0xf1, 0x90, 0x58, 0x81, 0xc5, 0xd6, 0x90, + 0x50, 0xa9, 0xf0, 0x91, 0x81, 0xc5, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, + 0xd6, 0x90, 0x50, 0xa9, 0xae, 0xf0, 0xc8, 0x81, 0xf1, 0x89, 0xad, 0xd0, + 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, + 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, 0x00, 0x00, 0xce, 0xcf, 0xc6, 0x00, + 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xad, + 0xae, 0x56, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0xd6, + 0x55, 0xfe, 0x56, 0xd0, 0xfd, 0x55, 0xd6, 0xf0, 0xc8, 0x85, 0x95, 0xad, + 0xfe, 0x56, 0xd6, 0xd0, 0xcd, 0x90, 0xad, 0xae, 0x5e, 0xd6, 0xd0, 0xcd, + 0x90, 0xaa, 0xd6, 0xea, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, 0xd0, + 0x90, 0xad, 0xaa, 0x5a, 0xd6, 0xf0, 0xa9, 0xc8, 0x81, 0x82, 0xae, 0xd6, + 0xd0, 0x90, 0xa9, 0x59, 0xd6, 0xf2, 0xa2, 0xc8, 0x91, 0x81, 0x82, 0xc5, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0xa9, 0x59, 0xd6, 0xf2, 0xa2, 0xc8, + 0x91, 0x81, 0x82, 0xc5, 0x90, 0x60, 0xaa, 0xd6, 0xea, 0xd6, 0xf0, 0xc8, + 0xad, 0xd6, 0xf0, 0xa9, 0xc8, 0x81, 0xa9, 0x90, 0x58, 0x81, 0xae, 0xd6, + 0xd0, 0xd6, 0x90, 0x58, 0xad, 0xf0, 0xc8, 0x85, 0x95, 0xad, 0x90, 0xae, + 0x5e, 0xd6, 0xd0, 0xcd, 0x90, 0x58, 0xad, 0xae, 0xd6, 0xd0, 0xcd, 0xd6, + 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, + 0xf5, 0x90, 0x50, 0x8d, 0xd6, 0xe8, 0xc6, 0x00, 0xce, 0xd6, 0xf1, 0x90, + 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xc6, + 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0x56, 0xf1, 0xa1, 0xc8, 0x86, + 0x96, 0xaa, 0xa1, 0x86, 0x82, 0xc5, 0xc6, 0x00, 0xce, 0xd6, 0x90, 0xad, + 0xae, 0x56, 0xd0, 0x56, 0xf1, 0xa1, 0xc8, 0x86, 0x96, 0xaa, 0xa1, 0x86, + 0x82, 0xc5, 0xc6, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xd6, + 0x90, 0xad, 0xae, 0x56, 0xd0, 0xd6, 0xae, 0xfe, 0xfd, 0xd0, 0xd6, 0xae, + 0x56, 0x55, 0xd0, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd3, 0xcd, 0xc6, + 0xce, 0x90, 0xaa, 0x5a, 0xab, 0x53, 0xac, 0x54, 0xd6, 0xf1, 0xa1, 0x82, + 0x92, 0xad, 0xa1, 0x83, 0x93, 0xc8, 0x85, 0xad, 0xd6, 0xf0, 0x84, 0x94, + 0xc8, 0x85, 0xad, 0xc5, 0xa2, 0xc5, 0xc6, 0x00, 0xce, 0xd6, 0x90, 0xad, + 0xae, 0xfe, 0xd0, 0xd6, 0xf0, 0xc8, 0xad, 0xd6, 0x90, 0xae, 0x56, 0xd0, + 0xd6, 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0xad, 0xae, 0x56, 0xd0, 0xaa, 0xc6, + 0xce, 0xd6, 0xf1, 0x90, 0x58, 0x58, 0x81, 0xa9, 0xc5, 0x90, 0x58, 0x58, + 0x91, 0xc5, 0xc4, 0xc6, 0xce, 0x90, 0xae, 0xad, 0x5d, 0x56, 0xd6, 0xd0, + 0xd6, 0xf1, 0xd6, 0xf0, 0xc8, 0x89, 0xf9, 0x51, 0x81, 0xc5, 0xc6, 0x00, + 0xce, 0xd6, 0xc1, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0x50, 0xad, + 0xae, 0xd6, 0xd0, 0xd6, 0xf1, 0xd6, 0xf0, 0xc8, 0x89, 0xf9, 0x51, 0x81, + 0xc5, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xc1, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xd6, 0xc1, 0xc0, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xc1, 0xc0, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xf1, 0xd6, 0xf0, 0xc8, 0x89, 0xf9, + 0x51, 0x81, 0xc5, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc0, 0xc6, 0x00, + 0xce, 0xd6, 0xc1, 0xc1, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0xc6, 0x00, + 0xce, 0xd6, 0xc1, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0x51, 0x53, 0x0b, 0x59, 0x0b, 0xd6, 0xc1, 0xc1, 0xc1, 0xcd, + 0xd6, 0xc1, 0xfa, 0x52, 0xd6, 0xea, 0xd6, 0x90, 0x58, 0xad, 0xae, 0xd0, + 0xcd, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0x90, 0x58, 0xad, 0xd6, 0xf0, + 0xc8, 0x85, 0x95, 0xad, 0x90, 0x58, 0xae, 0xd6, 0xd0, 0xcd, 0xd6, 0x90, + 0xad, 0xae, 0x56, 0xd0, 0x58, 0xad, 0xae, 0xd6, 0xd0, 0xcd, 0xc6, 0x00, + 0xce, 0x90, 0x58, 0x58, 0xad, 0xd6, 0xf0, 0xc8, 0x85, 0x95, 0xad, 0x90, + 0x58, 0x58, 0xae, 0xd6, 0xd0, 0xcd, 0x90, 0xad, 0x58, 0xae, 0xd6, 0xd0, + 0xd6, 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, + 0xd6, 0xc1, 0xc1, 0xc1, 0xd6, 0x51, 0x53, 0x0b, 0x59, 0x0b, 0xcd, 0xd6, + 0x90, 0xad, 0x58, 0xae, 0xd0, 0x90, 0xd6, 0xe8, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x56, 0xd6, 0x4e, 0xc4, 0xc6, 0x00, 0x00, 0xce, 0x56, 0x90, 0xd6, + 0x4e, 0x48, 0xc6, 0x00, 0xce, 0xd6, 0x99, 0x90, 0x50, 0x81, 0xc5, 0xc6, + 0xce, 0xd6, 0x99, 0x90, 0x50, 0x59, 0x81, 0x51, 0x89, 0x48, 0xd3, 0xcd, + 0xd6, 0xf0, 0x58, 0xe8, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xf4, 0xfa, + 0x52, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc8, 0xab, 0x8a, 0xaa, 0xa3, 0xc8, + 0x8a, 0x84, 0xd6, 0xe8, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xf2, 0x90, + 0x50, 0x8a, 0xd6, 0xe8, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0xac, 0xad, + 0xaf, 0x57, 0xae, 0xfe, 0xab, 0x53, 0xaa, 0xfa, 0xd6, 0xf0, 0x86, 0xc8, + 0x7f, 0xfe, 0x56, 0x6e, 0xae, 0xe6, 0xa9, 0x82, 0xc8, 0xac, 0xa1, 0x83, + 0x7c, 0xad, 0x90, 0x50, 0x6e, 0xae, 0xe6, 0xa9, 0x82, 0xc8, 0xac, 0xa1, + 0x83, 0x7c, 0x6d, 0xad, 0x90, 0x50, 0x6e, 0xae, 0xe6, 0xa9, 0x82, 0xc8, + 0xac, 0xa1, 0x83, 0x7c, 0x6d, 0xa9, 0x90, 0x50, 0x79, 0xaa, 0x51, 0xc8, + 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, + 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, + 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0x90, 0xf8, 0xad, 0xae, 0xd6, 0xd0, 0x90, 0xad, 0xae, 0x56, 0xd6, + 0xd0, 0xc6, 0x00, 0x00, 0xce, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0xc6, + 0xce, 0xd6, 0x90, 0x58, 0xad, 0xae, 0xd0, 0xd6, 0x90, 0xf8, 0xad, 0xae, + 0xd0, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, + 0xd0, 0x90, 0xad, 0x56, 0xfe, 0xd6, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xaa, + 0x52, 0x58, 0x58, 0xad, 0xae, 0xd0, 0xd6, 0xf0, 0x82, 0x92, 0xc5, 0xd6, + 0x90, 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0xa2, 0xad, 0xae, 0xd0, 0xc6, 0x00, + 0xce, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xd6, 0x90, 0xad, 0xae, 0x56, + 0xd0, 0x56, 0xf0, 0x86, 0xc5, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x90, 0x50, + 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, + 0xce, 0xc4, 0xc4, 0xc6, 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, + 0xce, 0xc4, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, 0xce, 0x90, 0x50, 0xad, + 0xae, 0xd6, 0xd0, 0xc6, 0xce, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, + 0xce, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, 0xce, 0x90, 0x50, 0xae, + 0xc8, 0xa9, 0xd6, 0xf0, 0x81, 0x91, 0xc8, 0xad, 0xd0, 0xc6, 0x00, 0x00, + 0xce, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, 0xce, 0xc6, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x20, 0x00, 0x18, 0x30, 0x14, 0x30, 0x00, 0x10, + 0x13, 0x10, 0x00, 0x02, 0x00, 0x18, 0x30, 0x02, 0x18, 0x30, 0x18, 0x30, + 0x32, 0x02, 0x00, 0x14, 0x30, 0x28, 0x3a, 0x02, 0x00, 0x14, 0x30, 0x10, + 0x00, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, + 0x07, 0x00, 0x00, 0x30, 0x34, 0x00, 0x02, 0x00, 0x2c, 0x30, 0x03, 0x00, + 0x03, 0x00, 0x58, 0x00, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x04, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x41, 0x06, 0x00, 0x00, 0x01, 0x08, + 0x00, 0x07, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x30, 0x34, 0x00, 0x03, + 0x00, 0x58, 0x00, 0x03, 0x00, 0x58, 0x00, 0x02, 0x00, 0x2c, 0x30, 0x00, + 0x00, 0x02, 0x00, 0x27, 0x00, 0x00, 0xff, 0x03, 0x02, 0x00, 0x28, 0x30, + 0x0d, 0x00, 0x50, 0x00, 0x8c, 0x00, 0x36, 0x60, 0x00, 0x9c, 0x00, 0x36, + 0x70, 0x00, 0xac, 0x00, 0x02, 0x00, 0x20, 0x30, 0x08, 0x00, 0x06, 0x02, + 0x00, 0x14, 0x30, 0x31, 0x33, 0x02, 0x00, 0x20, 0x00, 0x18, 0x30, 0x45, + 0x00, 0x0a, 0x40, 0x00, 0x00, 0x01, 0x02, 0x00, 0x20, 0x30, 0x07, 0x00, + 0x0e, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x68, 0x00, 0x39, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x07, 0x00, 0x20, 0x30, 0x00, 0x01, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x08, 0x00, 0x20, 0x30, 0x00, 0x01, 0x02, 0x00, + 0x08, 0x00, 0x20, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x18, 0x30, 0x01, 0x00, 0x00, 0x08, 0x00, 0x18, + 0x30, 0x00, 0x00, 0x08, 0x00, 0x18, 0x30, 0x14, 0x30, 0x00, 0x10, 0x13, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x20, 0x38, 0x49, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x40, 0x02, 0x00, 0x14, 0x30, 0x80, 0x00, 0x02, 0x00, + 0x18, 0x30, 0x02, 0x18, 0x30, 0x18, 0x30, 0x02, 0x00, 0x18, 0x30, 0x02, + 0x00, 0xff, 0x3f, 0xc0, 0xff, 0x20, 0x30, 0x04, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x02, 0x00, 0x08, 0x00, 0x14, 0x30, 0x0e, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x18, 0x30, 0x0e, 0x00, 0x00, 0x00, 0x32, 0x02, 0x00, + 0x14, 0x30, 0x28, 0x3a, 0x46, 0x00, 0x0a, 0x40, 0x00, 0x01, 0x02, 0x00, + 0x04, 0x00, 0x18, 0x30, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, + 0x20, 0x00, 0x4a, 0x00, 0x00, 0x01, 0x02, 0x00, 0x18, 0x30, 0x02, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x30, 0x31, 0x02, 0x00, 0x20, + 0x00, 0x18, 0x30, 0x33, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0x00, + 0x40, 0x00, 0x18, 0x30, 0x01, 0x18, 0x30, 0x18, 0x30, 0x02, 0x00, 0x10, + 0x00, 0x14, 0x30, 0x02, 0x00, 0x04, 0x00, 0x18, 0x30, 0x00, 0x40, 0x14, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x20, 0x00, 0x14, 0x30, 0x00, 0x01, 0x02, 0x00, 0x20, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x06, 0x00, 0x00, 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x30, 0x34, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x14, 0x30, 0x39, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x14, 0x00, 0x34, + 0x01, 0x03, 0x00, 0x18, 0x00, 0x32, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x0b, + 0x00, 0x84, 0x0d, 0x0b, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x14, 0x30, + 0x03, 0x00, 0x58, 0x00, 0x3f, 0x0b, 0x00, 0x84, 0x0d, 0x02, 0x00, 0x2c, + 0x30, 0x3f, 0x26, 0x00, 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0x3f, 0x27, + 0x03, 0x00, 0x1c, 0x00, 0x02, 0x00, 0x14, 0x30, 0x35, 0x03, 0x00, 0x58, + 0x00, 0x3f, 0x0b, 0x00, 0x84, 0x0d, 0x02, 0x00, 0x14, 0x30, 0x38, 0x04, + 0x00, 0x14, 0x00, 0x08, 0x00, 0x03, 0x00, 0x18, 0x00, 0x34, 0x01, 0x06, + 0x00, 0x00, 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, 0x30, 0x34, 0x00, 0x02, + 0x00, 0x2c, 0x30, 0x20, 0x00, 0x03, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0x02, 0x00, 0x26, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0x02, 0x00, 0x27, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x80, 0x00, 0x14, 0x30, 0x00, 0x02, 0x14, 0x30, + 0x01, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x80, 0x00, 0x14, 0x30, + 0x00, 0x02, 0x14, 0x30, 0x01, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, + 0x10, 0x11, 0x24, 0x00, 0x06, 0x00, 0x01, 0x01, 0x08, 0x00, 0x07, 0x00, + 0x00, 0x30, 0x00, 0x10, 0x34, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x04, + 0x14, 0x30, 0x15, 0x00, 0x00, 0x01, 0x14, 0x00, 0x10, 0xe7, 0x00, 0x00, + 0x00, 0x01, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x48, 0x00, 0x3e, 0x04, + 0x00, 0x64, 0x00, 0x36, 0x55, 0x15, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, + 0x10, 0x11, 0x24, 0x00, 0x02, 0x00, 0x30, 0x30, 0x38, 0x06, 0x00, 0x01, + 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, 0x30, 0x34, 0x00, 0x02, 0x00, 0x00, + 0x04, 0x14, 0x30, 0x00, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x2e, 0x2d, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x03, 0x00, 0x18, 0x00, 0x02, 0x00, 0x30, 0x30, 0x01, 0x00, 0x00, 0x03, + 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x0f, 0x80, 0x02, 0x02, + 0x2f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x03, 0x00, 0x18, 0x00, 0x02, 0x00, 0x30, 0x30, 0x01, 0x00, 0x00, 0x03, + 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x0f, 0x80, 0x02, 0x02, + 0x2f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x33, 0x80, 0x30, 0x3c, + 0x00, 0x80, 0x01, 0x00, 0x00, 0x01, 0x07, 0x00, 0x33, 0x80, 0x24, 0x3c, + 0x00, 0x80, 0x04, 0x00, 0x00, 0x01, 0x03, 0x00, 0x18, 0x00, 0x02, 0x00, + 0x30, 0x30, 0x01, 0x00, 0x00, 0x03, 0x00, 0x31, 0x02, 0x00, 0x03, 0x00, + 0x14, 0x30, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, + 0x33, 0x80, 0x00, 0x83, 0x0f, 0x80, 0x00, 0x02, 0x00, 0x03, 0x03, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x33, 0x80, 0x34, 0x3c, + 0x00, 0x03, 0x03, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, + 0x3a, 0x00, 0x01, 0x00, 0x07, 0x00, 0x30, 0x80, 0x0a, 0x0b, 0x30, 0x80, + 0x08, 0x0b, 0x30, 0x80, 0x00, 0x0b, 0xec, 0x01, 0x08, 0x00, 0x00, 0x80, + 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x1c, 0x00, 0x0b, 0x00, + 0x84, 0x0d, 0x0a, 0x00, 0x0d, 0x00, 0x00, 0x80, 0x04, 0x00, 0x02, 0x00, + 0x14, 0x30, 0x38, 0x04, 0x00, 0x14, 0x00, 0x08, 0x00, 0x04, 0x00, 0x30, + 0x00, 0x00, 0x80, 0x03, 0x00, 0x18, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x39, 0x04, 0x00, 0x14, 0x00, 0xc5, + 0x00, 0x03, 0x00, 0x18, 0x00, 0x0d, 0x00, 0x00, 0x80, 0x04, 0x00, 0x04, + 0x00, 0x30, 0x00, 0x00, 0x80, 0x07, 0x00, 0x30, 0x80, 0x08, 0x0b, 0x30, + 0x80, 0x0a, 0x0b, 0x30, 0x80, 0x0b, 0x0b, 0x08, 0x00, 0x3a, 0x00, 0x00, + 0x00, 0x3f, 0x00, 0x0b, 0x00, 0x84, 0x0d, 0x03, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x01, 0x80, 0x00, 0x09, 0x00, 0xe1, 0x68, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x80, 0x00, 0x09, 0x00, 0xe1, 0x68, 0xe1, 0x68, 0x00, 0x00, + 0x00, 0x05, 0x09, 0x00, 0xe1, 0x68, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x05, 0x09, 0x00, 0xe1, 0x68, 0x3f, 0x00, 0x80, 0x00, 0xe1, 0x68, + 0x37, 0x00, 0x43, 0x40, 0x02, 0x00, 0x24, 0x30, 0x24, 0x30, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0xff, 0xff, 0x00, 0x01, 0x02, 0x00, + 0x18, 0x30, 0x20, 0x00, 0x3c, 0x3f, 0x03, 0x00, 0x58, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0x30, 0x00, 0x03, 0x00, 0x58, 0x00, + 0x00, 0x01, 0x3c, 0x00, 0x00, 0x80, 0xff, 0x03, 0x00, 0x40, 0x0d, 0x00, + 0x00, 0x00, 0x21, 0x00, 0x00, 0x50, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, + 0x00, 0x22, 0x01, 0x00, 0x01, 0x00, 0x33, 0x54, 0x34, 0x53, 0x35, 0x52, + 0x36, 0x51, 0x37, 0x50, 0x38, 0x4f, 0x39, 0x4e, 0x3a, 0x4d, 0x3b, 0x4c, + 0x00, 0x01, 0x20, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04, + 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x00, 0x20, + 0x00, 0x01, 0x00, 0x40, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, + 0x14, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x02, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x04, 0x00, 0x14, 0x00, 0x06, 0x00, 0x00, 0x01, 0x08, 0x00, + 0x00, 0x01, 0x0b, 0x00, 0x80, 0x0d, 0x08, 0x00, 0xff, 0x00, 0xff, 0x02, + 0x00, 0x18, 0x30, 0xff, 0x00, 0xff, 0x00, 0x0b, 0x00, 0x80, 0x0d, 0x00, + 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x14, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x16, 0x06, 0x00, 0x00, 0x01, 0x08, 0x00, 0x02, 0x00, 0x14, 0x30, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x18, 0x30, 0x38, 0xff, 0x00, 0xff, 0x00, 0x0b, + 0x00, 0x80, 0x0d, 0x00, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, + 0x17, 0x02, 0x00, 0x00, 0x01, 0x14, 0x30, 0x20, 0x00, 0x18, 0x30, 0x3e, + 0x00, 0x01, 0x0c, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x01, 0x0c, 0x00, + 0x20, 0x00, 0x04, 0x00, 0x00, 0x01, 0x43, 0x40, 0x00, 0x01, 0x02, 0x00, + 0x04, 0x00, 0x14, 0x30, 0x00, 0x01, 0x41, 0x02, 0x00, 0x04, 0x00, 0x14, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x02, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x00, 0x02, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x08, 0x00, + 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x10, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x00, 0x20, 0x01, 0x02, 0x00, 0x14, 0x30, 0x3f, 0x14, 0x30, + 0x00, 0x01, 0x00, 0x20, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x24, 0x26, 0x03, 0xce, 0x00, 0x00, 0xa2, 0x60, + 0x10, 0x00, 0xa2, 0x60, 0x62, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x03, 0xa2, 0x60, 0x90, 0x08, 0xa2, 0x60, 0x68, 0x03, 0xa2, 0x60, + 0xdc, 0x08, 0xa2, 0x60, 0x04, 0x04, 0xa2, 0x60, 0xa4, 0x09, 0xa2, 0x60, + 0x58, 0x04, 0xa2, 0x60, 0xfc, 0x09, 0xa2, 0x60, 0x88, 0x05, 0xa2, 0x60, + 0x2c, 0x0b, 0xa2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xac, 0x03, 0xa2, 0x60, 0x30, 0x09, 0xa2, 0x60, 0xbc, 0x03, 0xa2, 0x60, + 0x44, 0x09, 0xa2, 0x60, 0xc4, 0x03, 0xa2, 0x60, 0x4c, 0x09, 0xa2, 0x60, + 0xc8, 0x03, 0xa2, 0x60, 0x54, 0x09, 0xa2, 0x60, 0xcc, 0x03, 0xa2, 0x60, + 0x5c, 0x09, 0xa2, 0x60, 0xd0, 0x03, 0xa2, 0x60, 0x64, 0x09, 0xa2, 0x60, + 0xd4, 0x03, 0xa2, 0x60, 0x6c, 0x09, 0xa2, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x74, 0x08, 0xa2, 0x60, 0x30, 0x0e, 0xa2, 0x60, + 0x84, 0x08, 0xa2, 0x60, 0x3c, 0x0e, 0xa2, 0x60, 0xb8, 0x07, 0xa2, 0x60, + 0x70, 0x0d, 0xa2, 0x60, 0xa8, 0x05, 0xa2, 0x60, 0x54, 0x0b, 0xa2, 0x60, + 0xa4, 0x05, 0xa2, 0x60, 0x4c, 0x0b, 0xa2, 0x60, 0xe0, 0x07, 0xa2, 0x60, + 0x94, 0x0d, 0xa2, 0x60, 0x0c, 0x08, 0xa2, 0x60, 0xc4, 0x0d, 0xa2, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x04, 0xa2, 0x60, + 0x58, 0x0a, 0xa2, 0x60, 0xf8, 0x04, 0xa2, 0x60, 0xa4, 0x0a, 0xa2, 0x60, + 0x7c, 0x05, 0xa2, 0x60, 0x20, 0x0b, 0xa2, 0x60, 0x80, 0x05, 0xa2, 0x60, + 0x24, 0x0b, 0xa2, 0x60, 0x84, 0x05, 0xa2, 0x60, 0x28, 0x0b, 0xa2, 0x60, + 0x44, 0x05, 0xa2, 0x60, 0xe8, 0x0a, 0xa2, 0x60, 0x4c, 0x05, 0xa2, 0x60, + 0xf4, 0x0a, 0xa2, 0x60, 0x54, 0x05, 0xa2, 0x60, 0x00, 0x0b, 0xa2, 0x60, + 0x68, 0x05, 0xa2, 0x60, 0x10, 0x0b, 0xa2, 0x60, 0xe4, 0x05, 0xa2, 0x60, + 0x88, 0x0b, 0xa2, 0x60, 0xf4, 0x05, 0xa2, 0x60, 0x94, 0x0b, 0xa2, 0x60, + 0x08, 0x06, 0xa2, 0x60, 0xac, 0x0b, 0xa2, 0x60, 0x10, 0x06, 0xa2, 0x60, + 0xb8, 0x0b, 0xa2, 0x60, 0x24, 0x06, 0xa2, 0x60, 0xd0, 0x0b, 0xa2, 0x60, + 0x2c, 0x06, 0xa2, 0x60, 0xdc, 0x0b, 0xa2, 0x60, 0x34, 0x06, 0xa2, 0x60, + 0xe8, 0x0b, 0xa2, 0x60, 0x3c, 0x06, 0xa2, 0x60, 0xf4, 0x0b, 0xa2, 0x60, + 0x50, 0x06, 0xa2, 0x60, 0x10, 0x0c, 0xa2, 0x60, 0x5c, 0x06, 0xa2, 0x60, + 0x24, 0x0c, 0xa2, 0x60, 0x68, 0x06, 0xa2, 0x60, 0x34, 0x0c, 0xa2, 0x60, + 0xa4, 0x06, 0xa2, 0x60, 0x80, 0x0c, 0xa2, 0x60, 0xd8, 0x03, 0xa2, 0x60, + 0x74, 0x09, 0xa2, 0x60, 0xe0, 0x06, 0xa2, 0x60, 0xbc, 0x0c, 0xa2, 0x60, + 0xe8, 0x06, 0xa2, 0x60, 0xc8, 0x0c, 0xa2, 0x60, 0xf0, 0x06, 0xa2, 0x60, + 0xd4, 0x0c, 0xa2, 0x60, 0xf8, 0x06, 0xa2, 0x60, 0xe0, 0x0c, 0xa2, 0x60, + 0xe0, 0x03, 0xa2, 0x60, 0x7c, 0x09, 0xa2, 0x60, 0x30, 0x07, 0xa2, 0x60, + 0x1c, 0x0d, 0xa2, 0x60, 0xf0, 0x07, 0xa2, 0x60, 0xac, 0x0d, 0xa2, 0x60, + 0x18, 0x08, 0xa2, 0x60, 0xd4, 0x0d, 0xa2, 0x60, 0x9c, 0x04, 0xa2, 0x60, + 0x44, 0x0a, 0xa2, 0x60, 0xd0, 0x07, 0xa2, 0x60, 0x88, 0x0d, 0xa2, 0x60, + 0x0c, 0x07, 0xa2, 0x60, 0xf8, 0x0c, 0xa2, 0x60, 0x2c, 0x08, 0xa2, 0x60, + 0xe8, 0x0d, 0xa2, 0x60, 0x34, 0x08, 0xa2, 0x60, 0xf0, 0x0d, 0xa2, 0x60, + 0x3c, 0x08, 0xa2, 0x60, 0xf8, 0x0d, 0xa2, 0x60, 0x40, 0x08, 0xa2, 0x60, + 0xfc, 0x0d, 0xa2, 0x60, 0x48, 0x08, 0xa2, 0x60, 0x04, 0x0e, 0xa2, 0x60, + 0xf0, 0x03, 0xa2, 0x60, 0x8c, 0x09, 0xa2, 0x60, 0x50, 0x04, 0xa2, 0x60, + 0xf4, 0x09, 0xa2, 0x60, 0xa0, 0x04, 0xa2, 0x60, 0x48, 0x0a, 0xa2, 0x60, + 0xa8, 0x04, 0xa2, 0x60, 0x50, 0x0a, 0xa2, 0x60, 0x10, 0x04, 0xa2, 0x60, + 0xb0, 0x09, 0xa2, 0x60, 0x60, 0x04, 0xa2, 0x60, 0x08, 0x0a, 0xa2, 0x60, + 0xec, 0x03, 0xa2, 0x60, 0x88, 0x09, 0xa2, 0x60, 0x94, 0x07, 0xa2, 0x60, + 0x4c, 0x0d, 0xa2, 0x60, 0x98, 0x07, 0xa2, 0x60, 0x50, 0x0d, 0xa2, 0x60, + 0x9c, 0x07, 0xa2, 0x60, 0x54, 0x0d, 0xa2, 0x60, 0xa0, 0x07, 0xa2, 0x60, + 0x58, 0x0d, 0xa2, 0x60, 0xa4, 0x07, 0xa2, 0x60, 0x5c, 0x0d, 0xa2, 0x60, + 0xa8, 0x07, 0xa2, 0x60, 0x60, 0x0d, 0xa2, 0x60, 0xac, 0x07, 0xa2, 0x60, + 0x64, 0x0d, 0xa2, 0x60, 0xb0, 0x07, 0xa2, 0x60, 0x68, 0x0d, 0xa2, 0x60, + 0xb4, 0x07, 0xa2, 0x60, 0x6c, 0x0d, 0xa2, 0x60, 0xc8, 0x05, 0xa2, 0x60, + 0x68, 0x0b, 0xa2, 0x60, 0xe8, 0x03, 0xa2, 0x60, 0x84, 0x09, 0xa2, 0x60, + 0x24, 0x07, 0xa2, 0x60, 0x10, 0x0d, 0xa2, 0x60, 0xc8, 0x07, 0xa2, 0x60, + 0x80, 0x0d, 0xa2, 0x60, 0x54, 0x08, 0xa2, 0x60, 0x10, 0x0e, 0xa2, 0x60, + 0x5c, 0x08, 0xa2, 0x60, 0x18, 0x0e, 0xa2, 0x60, 0x64, 0x08, 0xa2, 0x60, + 0x20, 0x0e, 0xa2, 0x60, 0x6c, 0x08, 0xa2, 0x60, 0x28, 0x0e, 0xa2, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x8c, 0x08, 0xa2, 0x60, 0x44, 0x0e, 0xa2, 0x60, + 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xf1, 0x90, 0x50, 0x81, 0xc5, + 0x90, 0x50, 0xa9, 0xae, 0xd6, 0xf0, 0xc8, 0x81, 0xf1, 0x89, 0xad, 0xd0, + 0xc4, 0xd6, 0xf1, 0x90, 0x58, 0x81, 0xc5, 0xc4, 0xd6, 0xf0, 0xc8, 0xfd, + 0x55, 0x85, 0x95, 0xad, 0xd6, 0xfe, 0x56, 0xd0, 0xd6, 0x90, 0x50, 0xad, + 0xae, 0xd0, 0xd6, 0xf5, 0xd6, 0x90, 0xae, 0x56, 0xd0, 0xd6, 0xf0, 0xfe, + 0x56, 0x86, 0xc5, 0xc6, 0xce, 0xc4, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, + 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xd6, 0xf0, 0x90, 0xad, 0xae, 0x56, 0xd0, + 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0x91, 0xc5, 0xfe, 0x56, 0xd6, 0xf5, 0xd6, + 0xd0, 0xd0, 0xa5, 0xc8, 0xad, 0xd0, 0xd0, 0xa5, 0xc8, 0xad, 0xd0, 0xd0, + 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xd6, 0xf1, 0x90, 0x58, 0x81, 0xc5, + 0xc4, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xd3, 0xcd, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0xf5, 0x90, 0xae, 0x56, 0xd6, 0xd0, 0x58, 0xad, 0xae, 0xd6, + 0xd0, 0xc4, 0xc6, 0x00, 0xce, 0xd6, 0x90, 0xae, 0x56, 0xd0, 0xc6, 0x00, + 0xce, 0x55, 0xc4, 0xc6, 0xce, 0x55, 0xc4, 0xc6, 0xce, 0x55, 0xc4, 0xc6, + 0xce, 0x55, 0xc4, 0xc6, 0xce, 0x55, 0xc4, 0xc6, 0xce, 0xd6, 0x90, 0x50, + 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf0, 0xc8, + 0xf9, 0x51, 0x81, 0xf1, 0x89, 0xad, 0xfe, 0x56, 0xd0, 0xf1, 0x90, 0x50, + 0x81, 0xc5, 0xc6, 0x00, 0xce, 0xd6, 0xf1, 0x90, 0x50, 0xaa, 0x81, 0x92, + 0xc8, 0x81, 0xc5, 0xc6, 0xce, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0x90, + 0x50, 0xa9, 0xae, 0xd6, 0xf0, 0xc8, 0x81, 0xf1, 0x89, 0xad, 0xd0, 0xd6, + 0x90, 0xae, 0x5e, 0xad, 0xd0, 0xd6, 0xfe, 0x56, 0xd0, 0xd6, 0x90, 0xf8, + 0xad, 0xae, 0xd0, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, 0xf5, 0x90, + 0x50, 0xae, 0xd6, 0xd0, 0xad, 0xd6, 0xd0, 0xc4, 0xd6, 0xf1, 0x90, 0x58, + 0x81, 0xc5, 0xc4, 0xd3, 0xcd, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x90, 0x50, + 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xc6, + 0xce, 0xd6, 0xf5, 0x90, 0x50, 0xae, 0xd6, 0xd0, 0xd6, 0xf1, 0x90, 0x58, + 0x81, 0xc5, 0xd6, 0x90, 0x50, 0xa9, 0xf0, 0x91, 0x81, 0xc5, 0xd6, 0x90, + 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0x90, 0x50, 0xa9, 0xae, 0xf0, 0xc8, 0x81, + 0xf1, 0x89, 0xad, 0xd0, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, 0x90, + 0xad, 0xae, 0x56, 0xd0, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, 0x00, 0x00, + 0xce, 0xcf, 0xc6, 0x00, 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, + 0xce, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xad, + 0xae, 0xfe, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xfd, 0x55, 0xd6, 0xf0, + 0xc8, 0x85, 0x95, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xcd, 0x90, 0xad, 0xae, + 0x5e, 0xd6, 0xd0, 0xcd, 0x90, 0xaa, 0xd6, 0xea, 0xd6, 0xf0, 0xc8, 0xad, + 0xfe, 0x56, 0xd6, 0xd0, 0x90, 0xad, 0xaa, 0x5a, 0xd6, 0xf0, 0xa9, 0xc8, + 0x81, 0x82, 0xae, 0xd6, 0xd0, 0x90, 0xa9, 0x59, 0xd6, 0xf2, 0xa2, 0xc8, + 0x91, 0x81, 0x82, 0xc5, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0xa9, 0x59, + 0xd6, 0xf2, 0xa2, 0xc8, 0x91, 0x81, 0x82, 0xc5, 0x90, 0x60, 0xaa, 0xd6, + 0xea, 0xd6, 0xf0, 0xc8, 0xad, 0xd6, 0xf0, 0xa9, 0xc8, 0x81, 0xa9, 0x90, + 0x58, 0x81, 0xae, 0xd6, 0xd0, 0xd6, 0x90, 0x58, 0xad, 0xf0, 0xc8, 0x85, + 0x95, 0xad, 0x90, 0xae, 0x5e, 0xd6, 0xd0, 0xcd, 0x90, 0x58, 0xad, 0xae, + 0xd6, 0xd0, 0xcd, 0xd6, 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xd6, 0x90, 0x50, + 0xad, 0xae, 0xd0, 0xd6, 0xf5, 0x90, 0x50, 0x8d, 0xd6, 0xe8, 0xc6, 0x00, + 0xce, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf1, 0x90, + 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0x56, + 0xf1, 0xa1, 0xc8, 0x86, 0x96, 0xaa, 0xa1, 0x86, 0x82, 0xc5, 0xc6, 0x00, + 0xce, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0x56, 0xf1, 0xa1, 0xc8, 0x86, + 0x96, 0xaa, 0xa1, 0x86, 0x82, 0xc5, 0xc6, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x90, 0xf8, + 0xad, 0xae, 0xd0, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xd6, 0xae, 0xfe, + 0xfd, 0xd0, 0xd6, 0xae, 0x56, 0x55, 0xd0, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xd3, 0xcd, 0xc6, 0xce, 0x90, 0xaa, 0x5a, 0xab, 0x53, 0xac, 0x54, + 0xd6, 0xf1, 0xa1, 0x82, 0x92, 0xad, 0xa1, 0x83, 0x93, 0xc8, 0x85, 0xad, + 0xd6, 0xf0, 0x84, 0x94, 0xc8, 0x85, 0xad, 0xc5, 0xa2, 0xc5, 0xc6, 0x00, + 0xce, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0xf0, 0xc8, 0xad, 0xd6, + 0x90, 0xae, 0x56, 0xd0, 0xd6, 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0xad, 0xae, + 0x56, 0xd0, 0xaa, 0xc6, 0xce, 0xd6, 0xf1, 0x90, 0x58, 0x58, 0x81, 0xa9, + 0xc5, 0x90, 0x58, 0x58, 0x91, 0xc5, 0xc4, 0xc6, 0xce, 0x90, 0xae, 0xad, + 0x5d, 0x56, 0xd6, 0xd0, 0xd6, 0xf1, 0xd6, 0xf0, 0xc8, 0x89, 0xf9, 0x51, + 0x81, 0xc5, 0xc6, 0x00, 0xce, 0xd6, 0xc1, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0xd6, 0xf1, 0xd6, 0xf0, 0xc8, + 0x89, 0xf9, 0x51, 0x81, 0xc5, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xc1, 0xc4, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xc1, 0xc0, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xd6, 0xc1, 0xc0, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xf1, 0xd6, + 0xf0, 0xc8, 0x89, 0xf9, 0x51, 0x81, 0xc5, 0xd6, 0x90, 0xad, 0xae, 0x56, + 0xd0, 0xc0, 0xc6, 0x00, 0xce, 0xd6, 0xc1, 0xc1, 0x90, 0x50, 0xad, 0xae, + 0xd6, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0xc1, 0x90, 0xad, 0xae, 0x56, 0xd6, + 0xd0, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x51, 0x53, 0x0b, 0x59, 0x0b, 0xd6, + 0xc1, 0xc1, 0xc1, 0xcd, 0xd6, 0xc1, 0xfa, 0x52, 0xd6, 0xea, 0xd6, 0x90, + 0x58, 0xad, 0xae, 0xd0, 0xcd, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0x90, + 0x58, 0xad, 0xd6, 0xf0, 0xc8, 0x85, 0x95, 0xad, 0x90, 0x58, 0xae, 0xd6, + 0xd0, 0xcd, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0x58, 0xad, 0xae, 0xd6, + 0xd0, 0xcd, 0xc6, 0x00, 0xce, 0x90, 0x58, 0x58, 0xad, 0xd6, 0xf0, 0xc8, + 0x85, 0x95, 0xad, 0x90, 0x58, 0x58, 0xae, 0xd6, 0xd0, 0xcd, 0x90, 0xad, + 0x58, 0xae, 0xd6, 0xd0, 0xd6, 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xd6, 0x90, + 0x50, 0xad, 0xae, 0xd0, 0xd6, 0xc1, 0xc1, 0xc1, 0xd6, 0x51, 0x53, 0x0b, + 0x59, 0x0b, 0xcd, 0xd6, 0x90, 0xad, 0x58, 0xae, 0xd0, 0x90, 0xd6, 0xe8, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x56, 0xd6, 0x4e, 0xc4, 0xc6, 0x00, 0x00, + 0xce, 0x56, 0x90, 0xd6, 0x4e, 0x48, 0xc6, 0x00, 0xce, 0xd6, 0x99, 0x90, + 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0x99, 0x90, 0x50, 0x59, 0x81, 0x51, + 0x89, 0x48, 0xd3, 0xcd, 0xd6, 0xf0, 0x58, 0xe8, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xd6, 0xf4, 0xfa, 0x52, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc8, 0xab, + 0x8a, 0xaa, 0xa3, 0xc8, 0x8a, 0x84, 0xd6, 0xe8, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xd6, 0xf2, 0x90, 0x50, 0x8a, 0xd6, 0xe8, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x90, 0xac, 0xad, 0xaf, 0x57, 0xae, 0xfe, 0xab, 0x53, 0xaa, 0xfa, + 0xd6, 0xf0, 0x86, 0xc8, 0x7f, 0xfe, 0x56, 0x6e, 0xae, 0xe6, 0xa9, 0x82, + 0xc8, 0xac, 0xa1, 0x83, 0x7c, 0xad, 0x90, 0x50, 0x6e, 0xae, 0xe6, 0xa9, + 0x82, 0xc8, 0xac, 0xa1, 0x83, 0x7c, 0x6d, 0xad, 0x90, 0x50, 0x6e, 0xae, + 0xe6, 0xa9, 0x82, 0xc8, 0xac, 0xa1, 0x83, 0x7c, 0x6d, 0xa9, 0x90, 0x50, + 0x79, 0xaa, 0x51, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, + 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, + 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, + 0x81, 0xc5, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0x90, 0xf8, 0xad, 0xae, 0xd6, 0xd0, 0x90, + 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, 0x00, 0x00, 0xce, 0x90, 0x50, 0xad, + 0xae, 0xd6, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0x58, 0xad, 0xae, 0xd0, 0xd6, + 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf0, 0xc8, + 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0x90, 0xad, 0x56, 0xfe, 0xd6, 0xd0, 0xc6, + 0xce, 0xd6, 0x90, 0xaa, 0x52, 0x58, 0x58, 0xad, 0xae, 0xd0, 0xd6, 0xf0, + 0x82, 0x92, 0xc5, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0xa2, 0xad, + 0xae, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, + 0xd0, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xd6, + 0x90, 0xad, 0xae, 0x56, 0xd0, 0x56, 0xf0, 0x86, 0xc5, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xad, + 0xae, 0x56, 0xd0, 0xc6, 0xce, 0xc4, 0xc4, 0xc6, 0xce, 0xd6, 0x90, 0x50, + 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xc4, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, + 0xce, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0xc6, 0xce, 0x90, 0xad, 0xae, + 0x56, 0xd6, 0xd0, 0xc6, 0xce, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, + 0xce, 0x90, 0x50, 0xae, 0xc8, 0xa9, 0xd6, 0xf0, 0x81, 0x91, 0xc8, 0xad, + 0xd0, 0xc6, 0x00, 0x00, 0xce, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, + 0xce, 0xc6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x20, 0x00, 0x18, 0x30, + 0x14, 0x30, 0x00, 0x10, 0x13, 0x10, 0x00, 0x02, 0x00, 0x18, 0x30, 0x02, + 0x18, 0x30, 0x18, 0x30, 0x32, 0x02, 0x00, 0x14, 0x30, 0x28, 0x3a, 0x02, + 0x00, 0x14, 0x30, 0x10, 0x00, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x08, 0x00, 0x07, 0x00, 0x00, 0x30, 0x34, 0x00, 0x02, 0x00, + 0x2c, 0x30, 0x03, 0x00, 0x03, 0x00, 0x58, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x00, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x41, 0x06, + 0x00, 0x00, 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x30, 0x34, 0x00, 0x03, 0x00, 0x58, 0x00, 0x03, 0x00, 0x58, 0x00, 0x02, + 0x00, 0x2c, 0x30, 0x00, 0x00, 0x02, 0x00, 0x27, 0x00, 0x00, 0xff, 0x03, + 0x02, 0x00, 0x28, 0x30, 0x0d, 0x00, 0x50, 0x00, 0x8c, 0x00, 0x36, 0x60, + 0x00, 0x9c, 0x00, 0x36, 0x70, 0x00, 0xac, 0x00, 0x02, 0x00, 0x20, 0x30, + 0x08, 0x00, 0x06, 0x02, 0x00, 0x14, 0x30, 0x31, 0x33, 0x02, 0x00, 0x20, + 0x00, 0x18, 0x30, 0x45, 0x00, 0x0a, 0x40, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x20, 0x30, 0x07, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x68, 0x00, + 0x39, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x07, 0x00, 0x20, 0x30, + 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x03, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x08, 0x00, 0x20, 0x30, + 0x00, 0x01, 0x02, 0x00, 0x08, 0x00, 0x20, 0x30, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x18, 0x30, 0x01, 0x00, + 0x00, 0x08, 0x00, 0x18, 0x30, 0x00, 0x00, 0x08, 0x00, 0x18, 0x30, 0x14, + 0x30, 0x00, 0x10, 0x13, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x20, + 0x38, 0x49, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, 0x02, 0x00, 0x14, 0x30, + 0x80, 0x00, 0x02, 0x00, 0x18, 0x30, 0x02, 0x18, 0x30, 0x18, 0x30, 0x02, + 0x00, 0x18, 0x30, 0x02, 0x00, 0xff, 0x3f, 0xc0, 0xff, 0x20, 0x30, 0x04, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0x00, 0x08, 0x00, 0x14, 0x30, 0x0e, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x18, 0x30, 0x0e, 0x00, 0x00, + 0x00, 0x32, 0x02, 0x00, 0x14, 0x30, 0x28, 0x3a, 0x46, 0x00, 0x0a, 0x40, + 0x00, 0x01, 0x02, 0x00, 0x04, 0x00, 0x18, 0x30, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x00, 0x00, 0x20, 0x00, 0x4a, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x18, 0x30, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x31, 0x02, 0x00, 0x20, 0x00, 0x18, 0x30, 0x33, 0x04, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x18, 0x30, 0x01, 0x18, 0x30, 0x18, + 0x30, 0x02, 0x00, 0x10, 0x00, 0x14, 0x30, 0x02, 0x00, 0x04, 0x00, 0x18, + 0x30, 0x00, 0x40, 0x14, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x20, 0x00, 0x14, 0x30, 0x00, 0x01, 0x02, 0x00, + 0x20, 0x00, 0x14, 0x30, 0x00, 0x01, 0x06, 0x00, 0x00, 0x01, 0x08, 0x00, + 0x07, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x30, 0x34, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x14, 0x30, 0x39, 0x00, 0x00, 0x02, 0x00, 0x04, + 0x00, 0x14, 0x00, 0x34, 0x01, 0x03, 0x00, 0x18, 0x00, 0x32, 0x00, 0x03, + 0x00, 0x1c, 0x00, 0x0b, 0x00, 0x84, 0x0d, 0x0b, 0x00, 0x00, 0x00, 0x08, + 0x02, 0x00, 0x14, 0x30, 0x03, 0x00, 0x58, 0x00, 0x3f, 0x0b, 0x00, 0x84, + 0x0d, 0x02, 0x00, 0x2c, 0x30, 0x3f, 0x26, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x2c, 0x30, 0x3f, 0x27, 0x03, 0x00, 0x1c, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x35, 0x03, 0x00, 0x58, 0x00, 0x3f, 0x0b, 0x00, 0x84, 0x0d, 0x02, 0x00, + 0x14, 0x30, 0x38, 0x04, 0x00, 0x14, 0x00, 0x08, 0x00, 0x03, 0x00, 0x18, + 0x00, 0x34, 0x01, 0x06, 0x00, 0x00, 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, + 0x30, 0x34, 0x00, 0x02, 0x00, 0x2c, 0x30, 0x20, 0x00, 0x03, 0x00, 0x58, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0x02, 0x00, + 0x26, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0x02, 0x00, + 0x27, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x80, 0x00, 0x14, 0x30, + 0x00, 0x02, 0x14, 0x30, 0x01, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x80, 0x00, 0x14, 0x30, 0x00, 0x02, 0x14, 0x30, 0x01, 0x3d, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x03, 0x00, 0x10, 0x11, 0x24, 0x00, 0x06, 0x00, 0x01, 0x01, + 0x08, 0x00, 0x07, 0x00, 0x00, 0x30, 0x00, 0x10, 0x34, 0x00, 0x02, 0x00, + 0x00, 0x04, 0x00, 0x04, 0x14, 0x30, 0x15, 0x00, 0x00, 0x01, 0x14, 0x00, + 0x10, 0xe7, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, + 0x48, 0x00, 0x3e, 0x04, 0x00, 0x64, 0x00, 0x36, 0x55, 0x15, 0x00, 0x00, + 0x00, 0x01, 0x03, 0x00, 0x10, 0x11, 0x24, 0x00, 0x02, 0x00, 0x30, 0x30, + 0x38, 0x06, 0x00, 0x01, 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, 0x30, 0x34, + 0x00, 0x02, 0x00, 0x00, 0x04, 0x14, 0x30, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x2e, 0x2d, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, + 0x02, 0x00, 0x14, 0x30, 0x03, 0x00, 0x18, 0x00, 0x02, 0x00, 0x30, 0x30, + 0x01, 0x00, 0x00, 0x03, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, + 0x0f, 0x80, 0x02, 0x02, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, + 0x02, 0x00, 0x14, 0x30, 0x03, 0x00, 0x18, 0x00, 0x02, 0x00, 0x30, 0x30, + 0x01, 0x00, 0x00, 0x03, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, + 0x0f, 0x80, 0x02, 0x02, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, + 0x33, 0x80, 0x30, 0x3c, 0x00, 0x80, 0x01, 0x00, 0x00, 0x01, 0x07, 0x00, + 0x33, 0x80, 0x24, 0x3c, 0x00, 0x80, 0x04, 0x00, 0x00, 0x01, 0x03, 0x00, + 0x18, 0x00, 0x02, 0x00, 0x30, 0x30, 0x01, 0x00, 0x00, 0x03, 0x00, 0x31, + 0x02, 0x00, 0x03, 0x00, 0x14, 0x30, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x07, 0x00, 0x33, 0x80, 0x00, 0x83, 0x0f, 0x80, 0x00, 0x02, + 0x00, 0x03, 0x03, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, + 0x33, 0x80, 0x34, 0x3c, 0x00, 0x03, 0x03, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x08, 0x00, 0x3a, 0x00, 0x01, 0x00, 0x07, 0x00, 0x30, 0x80, + 0x0a, 0x0b, 0x30, 0x80, 0x08, 0x0b, 0x30, 0x80, 0x00, 0x0b, 0xec, 0x01, + 0x08, 0x00, 0x00, 0x80, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, + 0x1c, 0x00, 0x0b, 0x00, 0x84, 0x0d, 0x0a, 0x00, 0x0d, 0x00, 0x00, 0x80, + 0x04, 0x00, 0x02, 0x00, 0x14, 0x30, 0x38, 0x04, 0x00, 0x14, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x30, 0x00, 0x00, 0x80, 0x03, 0x00, 0x18, 0x00, 0xc5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x39, 0x04, + 0x00, 0x14, 0x00, 0xc5, 0x00, 0x03, 0x00, 0x18, 0x00, 0x0d, 0x00, 0x00, + 0x80, 0x04, 0x00, 0x04, 0x00, 0x30, 0x00, 0x00, 0x80, 0x07, 0x00, 0x30, + 0x80, 0x08, 0x0b, 0x30, 0x80, 0x0a, 0x0b, 0x30, 0x80, 0x0b, 0x0b, 0x08, + 0x00, 0x3a, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x0b, 0x00, 0x84, 0x0d, 0x03, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x09, 0x00, 0xe1, 0x68, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x09, 0x00, 0xe1, 0x68, + 0xe1, 0x68, 0x00, 0x00, 0x00, 0x05, 0x09, 0x00, 0xe1, 0x68, 0x80, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x05, 0x09, 0x00, 0xe1, 0x68, 0x3f, 0x00, + 0x80, 0x00, 0xe1, 0x68, 0x37, 0x00, 0x43, 0x40, 0x02, 0x00, 0x24, 0x30, + 0x24, 0x30, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0xff, 0xff, + 0x00, 0x01, 0x02, 0x00, 0x18, 0x30, 0x20, 0x00, 0x3c, 0x3f, 0x03, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0x30, 0x00, + 0x03, 0x00, 0x58, 0x00, 0x00, 0x01, 0x3c, 0x00, 0x00, 0x80, 0xff, 0x03, + 0x00, 0x40, 0x0d, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x50, 0x00, 0x22, + 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x01, 0x00, 0x01, 0x00, 0x33, 0x54, + 0x34, 0x53, 0x35, 0x52, 0x36, 0x51, 0x37, 0x50, 0x38, 0x4f, 0x39, 0x4e, + 0x3a, 0x4d, 0x3b, 0x4c, 0x00, 0x01, 0x20, 0x00, 0x00, 0x01, 0x40, 0x00, + 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, + 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x10, + 0x00, 0x01, 0x00, 0x20, 0x00, 0x01, 0x00, 0x40, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, + 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x04, 0x00, 0x14, 0x00, 0x06, 0x00, + 0x00, 0x01, 0x08, 0x00, 0x00, 0x01, 0x0b, 0x00, 0x80, 0x0d, 0x08, 0x00, + 0xff, 0x00, 0xff, 0x02, 0x00, 0x18, 0x30, 0xff, 0x00, 0xff, 0x00, 0x0b, + 0x00, 0x80, 0x0d, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x14, 0x00, + 0x02, 0x00, 0x14, 0x30, 0x16, 0x06, 0x00, 0x00, 0x01, 0x08, 0x00, 0x02, + 0x00, 0x14, 0x30, 0x00, 0x00, 0x01, 0x02, 0x00, 0x18, 0x30, 0x38, 0xff, + 0x00, 0xff, 0x00, 0x0b, 0x00, 0x80, 0x0d, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x00, 0x01, 0x17, 0x02, 0x00, 0x00, 0x01, 0x14, 0x30, 0x20, + 0x00, 0x18, 0x30, 0x3e, 0x00, 0x01, 0x0c, 0x00, 0x20, 0x00, 0x04, 0x00, + 0x00, 0x01, 0x0c, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x01, 0x43, 0x40, + 0x00, 0x01, 0x02, 0x00, 0x04, 0x00, 0x14, 0x30, 0x00, 0x01, 0x41, 0x02, + 0x00, 0x04, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, + 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x00, 0x02, 0x02, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x08, 0x00, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x10, 0x00, + 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x00, 0x20, 0x01, 0x02, 0x00, 0x14, + 0x30, 0x3f, 0x14, 0x30, 0x00, 0x01, 0x00, 0x20, 0x02, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xce, 0x7d, 0x16, + 0x00, 0x00, 0xb2, 0x60, 0x10, 0x00, 0xb2, 0x60, 0x62, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x03, 0xb2, 0x60, 0x90, 0x08, 0xb2, 0x60, + 0x68, 0x03, 0xb2, 0x60, 0xdc, 0x08, 0xb2, 0x60, 0x04, 0x04, 0xb2, 0x60, + 0xa4, 0x09, 0xb2, 0x60, 0x58, 0x04, 0xb2, 0x60, 0xfc, 0x09, 0xb2, 0x60, + 0x88, 0x05, 0xb2, 0x60, 0x2c, 0x0b, 0xb2, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xac, 0x03, 0xb2, 0x60, 0x30, 0x09, 0xb2, 0x60, + 0xbc, 0x03, 0xb2, 0x60, 0x44, 0x09, 0xb2, 0x60, 0xc4, 0x03, 0xb2, 0x60, + 0x4c, 0x09, 0xb2, 0x60, 0xc8, 0x03, 0xb2, 0x60, 0x54, 0x09, 0xb2, 0x60, + 0xcc, 0x03, 0xb2, 0x60, 0x5c, 0x09, 0xb2, 0x60, 0xd0, 0x03, 0xb2, 0x60, + 0x64, 0x09, 0xb2, 0x60, 0xd4, 0x03, 0xb2, 0x60, 0x6c, 0x09, 0xb2, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x08, 0xb2, 0x60, + 0x30, 0x0e, 0xb2, 0x60, 0x84, 0x08, 0xb2, 0x60, 0x3c, 0x0e, 0xb2, 0x60, + 0xb8, 0x07, 0xb2, 0x60, 0x70, 0x0d, 0xb2, 0x60, 0xa8, 0x05, 0xb2, 0x60, + 0x54, 0x0b, 0xb2, 0x60, 0xa4, 0x05, 0xb2, 0x60, 0x4c, 0x0b, 0xb2, 0x60, + 0xe0, 0x07, 0xb2, 0x60, 0x94, 0x0d, 0xb2, 0x60, 0x0c, 0x08, 0xb2, 0x60, + 0xc4, 0x0d, 0xb2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0x04, 0xb2, 0x60, 0x58, 0x0a, 0xb2, 0x60, 0xf8, 0x04, 0xb2, 0x60, + 0xa4, 0x0a, 0xb2, 0x60, 0x7c, 0x05, 0xb2, 0x60, 0x20, 0x0b, 0xb2, 0x60, + 0x80, 0x05, 0xb2, 0x60, 0x24, 0x0b, 0xb2, 0x60, 0x84, 0x05, 0xb2, 0x60, + 0x28, 0x0b, 0xb2, 0x60, 0x44, 0x05, 0xb2, 0x60, 0xe8, 0x0a, 0xb2, 0x60, + 0x4c, 0x05, 0xb2, 0x60, 0xf4, 0x0a, 0xb2, 0x60, 0x54, 0x05, 0xb2, 0x60, + 0x00, 0x0b, 0xb2, 0x60, 0x68, 0x05, 0xb2, 0x60, 0x10, 0x0b, 0xb2, 0x60, + 0xe4, 0x05, 0xb2, 0x60, 0x88, 0x0b, 0xb2, 0x60, 0xf4, 0x05, 0xb2, 0x60, + 0x94, 0x0b, 0xb2, 0x60, 0x08, 0x06, 0xb2, 0x60, 0xac, 0x0b, 0xb2, 0x60, + 0x10, 0x06, 0xb2, 0x60, 0xb8, 0x0b, 0xb2, 0x60, 0x24, 0x06, 0xb2, 0x60, + 0xd0, 0x0b, 0xb2, 0x60, 0x2c, 0x06, 0xb2, 0x60, 0xdc, 0x0b, 0xb2, 0x60, + 0x34, 0x06, 0xb2, 0x60, 0xe8, 0x0b, 0xb2, 0x60, 0x3c, 0x06, 0xb2, 0x60, + 0xf4, 0x0b, 0xb2, 0x60, 0x50, 0x06, 0xb2, 0x60, 0x10, 0x0c, 0xb2, 0x60, + 0x5c, 0x06, 0xb2, 0x60, 0x24, 0x0c, 0xb2, 0x60, 0x68, 0x06, 0xb2, 0x60, + 0x34, 0x0c, 0xb2, 0x60, 0xa4, 0x06, 0xb2, 0x60, 0x80, 0x0c, 0xb2, 0x60, + 0xd8, 0x03, 0xb2, 0x60, 0x74, 0x09, 0xb2, 0x60, 0xe0, 0x06, 0xb2, 0x60, + 0xbc, 0x0c, 0xb2, 0x60, 0xe8, 0x06, 0xb2, 0x60, 0xc8, 0x0c, 0xb2, 0x60, + 0xf0, 0x06, 0xb2, 0x60, 0xd4, 0x0c, 0xb2, 0x60, 0xf8, 0x06, 0xb2, 0x60, + 0xe0, 0x0c, 0xb2, 0x60, 0xe0, 0x03, 0xb2, 0x60, 0x7c, 0x09, 0xb2, 0x60, + 0x30, 0x07, 0xb2, 0x60, 0x1c, 0x0d, 0xb2, 0x60, 0xf0, 0x07, 0xb2, 0x60, + 0xac, 0x0d, 0xb2, 0x60, 0x18, 0x08, 0xb2, 0x60, 0xd4, 0x0d, 0xb2, 0x60, + 0x9c, 0x04, 0xb2, 0x60, 0x44, 0x0a, 0xb2, 0x60, 0xd0, 0x07, 0xb2, 0x60, + 0x88, 0x0d, 0xb2, 0x60, 0x0c, 0x07, 0xb2, 0x60, 0xf8, 0x0c, 0xb2, 0x60, + 0x2c, 0x08, 0xb2, 0x60, 0xe8, 0x0d, 0xb2, 0x60, 0x34, 0x08, 0xb2, 0x60, + 0xf0, 0x0d, 0xb2, 0x60, 0x3c, 0x08, 0xb2, 0x60, 0xf8, 0x0d, 0xb2, 0x60, + 0x40, 0x08, 0xb2, 0x60, 0xfc, 0x0d, 0xb2, 0x60, 0x48, 0x08, 0xb2, 0x60, + 0x04, 0x0e, 0xb2, 0x60, 0xf0, 0x03, 0xb2, 0x60, 0x8c, 0x09, 0xb2, 0x60, + 0x50, 0x04, 0xb2, 0x60, 0xf4, 0x09, 0xb2, 0x60, 0xa0, 0x04, 0xb2, 0x60, + 0x48, 0x0a, 0xb2, 0x60, 0xa8, 0x04, 0xb2, 0x60, 0x50, 0x0a, 0xb2, 0x60, + 0x10, 0x04, 0xb2, 0x60, 0xb0, 0x09, 0xb2, 0x60, 0x60, 0x04, 0xb2, 0x60, + 0x08, 0x0a, 0xb2, 0x60, 0xec, 0x03, 0xb2, 0x60, 0x88, 0x09, 0xb2, 0x60, + 0x94, 0x07, 0xb2, 0x60, 0x4c, 0x0d, 0xb2, 0x60, 0x98, 0x07, 0xb2, 0x60, + 0x50, 0x0d, 0xb2, 0x60, 0x9c, 0x07, 0xb2, 0x60, 0x54, 0x0d, 0xb2, 0x60, + 0xa0, 0x07, 0xb2, 0x60, 0x58, 0x0d, 0xb2, 0x60, 0xa4, 0x07, 0xb2, 0x60, + 0x5c, 0x0d, 0xb2, 0x60, 0xa8, 0x07, 0xb2, 0x60, 0x60, 0x0d, 0xb2, 0x60, + 0xac, 0x07, 0xb2, 0x60, 0x64, 0x0d, 0xb2, 0x60, 0xb0, 0x07, 0xb2, 0x60, + 0x68, 0x0d, 0xb2, 0x60, 0xb4, 0x07, 0xb2, 0x60, 0x6c, 0x0d, 0xb2, 0x60, + 0xc8, 0x05, 0xb2, 0x60, 0x68, 0x0b, 0xb2, 0x60, 0xe8, 0x03, 0xb2, 0x60, + 0x84, 0x09, 0xb2, 0x60, 0x24, 0x07, 0xb2, 0x60, 0x10, 0x0d, 0xb2, 0x60, + 0xc8, 0x07, 0xb2, 0x60, 0x80, 0x0d, 0xb2, 0x60, 0x54, 0x08, 0xb2, 0x60, + 0x10, 0x0e, 0xb2, 0x60, 0x5c, 0x08, 0xb2, 0x60, 0x18, 0x0e, 0xb2, 0x60, + 0x64, 0x08, 0xb2, 0x60, 0x20, 0x0e, 0xb2, 0x60, 0x6c, 0x08, 0xb2, 0x60, + 0x28, 0x0e, 0xb2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x08, 0xb2, 0x60, + 0x44, 0x0e, 0xb2, 0x60, 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xf1, + 0x90, 0x50, 0x81, 0xc5, 0x90, 0x50, 0xa9, 0xae, 0xd6, 0xf0, 0xc8, 0x81, + 0xf1, 0x89, 0xad, 0xd0, 0xc4, 0xd6, 0xf1, 0x90, 0x58, 0x81, 0xc5, 0xc4, + 0xd6, 0xf0, 0xc8, 0xfd, 0x55, 0x85, 0x95, 0xad, 0xd6, 0xfe, 0x56, 0xd0, + 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, 0xf5, 0xd6, 0x90, 0xae, 0x56, + 0xd0, 0xd6, 0xf0, 0xfe, 0x56, 0x86, 0xc5, 0xc6, 0xce, 0xc4, 0xd6, 0x90, + 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xd6, 0xf0, 0x90, + 0xad, 0xae, 0x56, 0xd0, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0x91, 0xc5, 0xfe, + 0x56, 0xd6, 0xf5, 0xd6, 0xd0, 0xd0, 0xa5, 0xc8, 0xad, 0xd0, 0xd0, 0xa5, + 0xc8, 0xad, 0xd0, 0xd0, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xd6, 0xf1, + 0x90, 0x58, 0x81, 0xc5, 0xc4, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xd3, + 0xcd, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf5, 0x90, 0xae, 0x56, 0xd6, 0xd0, + 0x58, 0xad, 0xae, 0xd6, 0xd0, 0xc4, 0xc6, 0x00, 0xce, 0xd6, 0x90, 0xae, + 0x56, 0xd0, 0xc6, 0x00, 0xce, 0x55, 0xc4, 0xc6, 0xce, 0x55, 0xc4, 0xc6, + 0xce, 0x55, 0xc4, 0xc6, 0xce, 0x55, 0xc4, 0xc6, 0xce, 0x55, 0xc4, 0xc6, + 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xad, + 0xae, 0x56, 0xd0, 0xc6, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0xf0, 0xc8, 0xf9, 0x51, 0x81, 0xf1, 0x89, 0xad, 0xfe, 0x56, + 0xd0, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xc6, 0x00, 0xce, 0xd6, 0xf1, 0x90, + 0x50, 0xaa, 0x81, 0x92, 0xc8, 0x81, 0xc5, 0xc6, 0xce, 0x90, 0x50, 0xad, + 0xae, 0xd6, 0xd0, 0x90, 0x50, 0xa9, 0xae, 0xd6, 0xf0, 0xc8, 0x81, 0xf1, + 0x89, 0xad, 0xd0, 0xd6, 0x90, 0xae, 0x5e, 0xad, 0xd0, 0xd6, 0xfe, 0x56, + 0xd0, 0xd6, 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xd6, 0x90, 0x50, 0xad, 0xae, + 0xd0, 0xd6, 0xf5, 0x90, 0x50, 0xae, 0xd6, 0xd0, 0xad, 0xd6, 0xd0, 0xc4, + 0xd6, 0xf1, 0x90, 0x58, 0x81, 0xc5, 0xc4, 0xd3, 0xcd, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xd6, 0xf0, 0xf9, + 0x51, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf5, 0x90, 0x50, 0xae, 0xd6, 0xd0, + 0xd6, 0xf1, 0x90, 0x58, 0x81, 0xc5, 0xd6, 0x90, 0x50, 0xa9, 0xf0, 0x91, + 0x81, 0xc5, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0x90, 0x50, 0xa9, + 0xae, 0xf0, 0xc8, 0x81, 0xf1, 0x89, 0xad, 0xd0, 0xd6, 0x90, 0x50, 0xad, + 0xae, 0xd0, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0x90, 0xad, 0xae, 0x56, + 0xd0, 0xc6, 0x00, 0x00, 0xce, 0xcf, 0xc6, 0x00, 0xce, 0xd6, 0x90, 0x50, + 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, + 0xce, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, + 0xfd, 0x55, 0xd6, 0xf0, 0xc8, 0x85, 0x95, 0xad, 0xfe, 0x56, 0xd6, 0xd0, + 0xcd, 0x90, 0xad, 0xae, 0x5e, 0xd6, 0xd0, 0xcd, 0x90, 0xaa, 0xd6, 0xea, + 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0x90, 0xad, 0xaa, 0x5a, + 0xd6, 0xf0, 0xa9, 0xc8, 0x81, 0x82, 0xae, 0xd6, 0xd0, 0x90, 0xa9, 0x59, + 0xd6, 0xf2, 0xa2, 0xc8, 0x91, 0x81, 0x82, 0xc5, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x90, 0xa9, 0x59, 0xd6, 0xf2, 0xa2, 0xc8, 0x91, 0x81, 0x82, 0xc5, + 0x90, 0x60, 0xaa, 0xd6, 0xea, 0xd6, 0xf0, 0xc8, 0xad, 0xd6, 0xf0, 0xa9, + 0xc8, 0x81, 0xa9, 0x90, 0x58, 0x81, 0xae, 0xd6, 0xd0, 0xd6, 0x90, 0x58, + 0xad, 0xf0, 0xc8, 0x85, 0x95, 0xad, 0x90, 0xae, 0x5e, 0xd6, 0xd0, 0xcd, + 0x90, 0x58, 0xad, 0xae, 0xd6, 0xd0, 0xcd, 0xd6, 0x90, 0xf8, 0xad, 0xae, + 0xd0, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, 0xf5, 0x90, 0x50, 0x8d, + 0xd6, 0xe8, 0xc6, 0x00, 0xce, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xc6, + 0xce, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0x90, 0x50, + 0xad, 0xae, 0xd0, 0x56, 0xf1, 0xa1, 0xc8, 0x86, 0x96, 0xaa, 0xa1, 0x86, + 0x82, 0xc5, 0xc6, 0x00, 0xce, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0x56, + 0xf1, 0xa1, 0xc8, 0x86, 0x96, 0xaa, 0xa1, 0x86, 0x82, 0xc5, 0xc6, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xd6, 0x90, 0xad, 0xae, 0x56, + 0xd0, 0xd6, 0xae, 0xfe, 0xfd, 0xd0, 0xd6, 0xae, 0x56, 0x55, 0xd0, 0xc4, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd3, 0xcd, 0xc6, 0xce, 0x90, 0xaa, 0x5a, + 0xab, 0x53, 0xac, 0x54, 0xd6, 0xf1, 0xa1, 0x82, 0x92, 0xad, 0xa1, 0x83, + 0x93, 0xc8, 0x85, 0xad, 0xd6, 0xf0, 0x84, 0x94, 0xc8, 0x85, 0xad, 0xc5, + 0xa2, 0xc5, 0xc6, 0x00, 0xce, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0xd6, + 0xf0, 0xc8, 0xad, 0xd6, 0x90, 0xae, 0x56, 0xd0, 0xd6, 0xad, 0xae, 0xfe, + 0xd0, 0xd6, 0xad, 0xae, 0x56, 0xd0, 0xaa, 0xc6, 0xce, 0xd6, 0xf1, 0x90, + 0x58, 0x58, 0x81, 0xa9, 0xc5, 0x90, 0x58, 0x58, 0x91, 0xc5, 0xc4, 0xc6, + 0xce, 0x90, 0xae, 0xad, 0x5d, 0x56, 0xd6, 0xd0, 0xd6, 0xf1, 0xd6, 0xf0, + 0xc8, 0x89, 0xf9, 0x51, 0x81, 0xc5, 0xc6, 0x00, 0xce, 0xd6, 0xc1, 0xc4, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0xd6, + 0xf1, 0xd6, 0xf0, 0xc8, 0x89, 0xf9, 0x51, 0x81, 0xc5, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0xc1, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xc1, 0xc0, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xc1, 0xc0, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xd6, 0xf1, 0xd6, 0xf0, 0xc8, 0x89, 0xf9, 0x51, 0x81, 0xc5, 0xd6, + 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc0, 0xc6, 0x00, 0xce, 0xd6, 0xc1, 0xc1, + 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0xc1, 0x90, + 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x51, 0x53, + 0x0b, 0x59, 0x0b, 0xd6, 0xc1, 0xc1, 0xc1, 0xcd, 0xd6, 0xc1, 0xfa, 0x52, + 0xd6, 0xea, 0xd6, 0x90, 0x58, 0xad, 0xae, 0xd0, 0xcd, 0xd6, 0x90, 0xad, + 0xae, 0xfe, 0xd0, 0x90, 0x58, 0xad, 0xd6, 0xf0, 0xc8, 0x85, 0x95, 0xad, + 0x90, 0x58, 0xae, 0xd6, 0xd0, 0xcd, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, + 0x58, 0xad, 0xae, 0xd6, 0xd0, 0xcd, 0xc6, 0x00, 0xce, 0x90, 0x58, 0x58, + 0xad, 0xd6, 0xf0, 0xc8, 0x85, 0x95, 0xad, 0x90, 0x58, 0x58, 0xae, 0xd6, + 0xd0, 0xcd, 0x90, 0xad, 0x58, 0xae, 0xd6, 0xd0, 0xd6, 0x90, 0xf8, 0xad, + 0xae, 0xd0, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, 0xc1, 0xc1, 0xc1, + 0xd6, 0x51, 0x53, 0x0b, 0x59, 0x0b, 0xcd, 0xd6, 0x90, 0xad, 0x58, 0xae, + 0xd0, 0x90, 0xd6, 0xe8, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x56, 0xd6, 0x4e, + 0xc4, 0xc6, 0x00, 0x00, 0xce, 0x56, 0x90, 0xd6, 0x4e, 0x48, 0xc6, 0x00, + 0xce, 0xd6, 0x99, 0x90, 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0x99, 0x90, + 0x50, 0x59, 0x81, 0x51, 0x89, 0x48, 0xd3, 0xcd, 0xd6, 0xf0, 0x58, 0xe8, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xf4, 0xfa, 0x52, 0xd6, 0xf1, 0x90, + 0x50, 0x81, 0xc8, 0xab, 0x8a, 0xaa, 0xa3, 0xc8, 0x8a, 0x84, 0xd6, 0xe8, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xf2, 0x90, 0x50, 0x8a, 0xd6, 0xe8, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0xac, 0xad, 0xaf, 0x57, 0xae, 0xfe, + 0xab, 0x53, 0xaa, 0xfa, 0xd6, 0xf0, 0x86, 0xc8, 0x7f, 0xfe, 0x56, 0x6e, + 0xae, 0xe6, 0xa9, 0x82, 0xc8, 0xac, 0xa1, 0x83, 0x7c, 0xad, 0x90, 0x50, + 0x6e, 0xae, 0xe6, 0xa9, 0x82, 0xc8, 0xac, 0xa1, 0x83, 0x7c, 0x6d, 0xad, + 0x90, 0x50, 0x6e, 0xae, 0xe6, 0xa9, 0x82, 0xc8, 0xac, 0xa1, 0x83, 0x7c, + 0x6d, 0xa9, 0x90, 0x50, 0x79, 0xaa, 0x51, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, + 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, + 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, + 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0x90, 0xf8, 0xad, + 0xae, 0xd6, 0xd0, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, 0x00, 0x00, + 0xce, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0x58, + 0xad, 0xae, 0xd0, 0xd6, 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0x90, 0xad, 0x56, + 0xfe, 0xd6, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xaa, 0x52, 0x58, 0x58, 0xad, + 0xae, 0xd0, 0xd6, 0xf0, 0x82, 0x92, 0xc5, 0xd6, 0x90, 0xad, 0xae, 0xfe, + 0xd0, 0xd6, 0xa2, 0xad, 0xae, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0xf0, 0xc8, + 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf1, 0x90, + 0x50, 0x81, 0xc5, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0x56, 0xf0, 0x86, + 0xc5, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, + 0xce, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, 0xce, 0xc4, 0xc4, 0xc6, + 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xc4, 0xd6, 0x90, + 0xad, 0xae, 0x56, 0xd0, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0xad, 0xae, + 0x56, 0xd6, 0xd0, 0xc6, 0xce, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0xc6, + 0xce, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, 0xce, 0x90, 0xad, 0xae, + 0x56, 0xd6, 0xd0, 0xc6, 0xce, 0x90, 0x50, 0xae, 0xc8, 0xa9, 0xd6, 0xf0, + 0x81, 0x91, 0xc8, 0xad, 0xd0, 0xc6, 0x00, 0x00, 0xce, 0x90, 0xad, 0xae, + 0x56, 0xd6, 0xd0, 0xc6, 0xce, 0xc6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x20, 0x00, 0x18, 0x30, 0x14, 0x30, 0x00, 0x10, 0x13, 0x10, 0x00, 0x02, + 0x00, 0x18, 0x30, 0x02, 0x18, 0x30, 0x18, 0x30, 0x32, 0x02, 0x00, 0x14, + 0x30, 0x28, 0x3a, 0x02, 0x00, 0x14, 0x30, 0x10, 0x00, 0x01, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x07, 0x00, 0x00, 0x30, + 0x34, 0x00, 0x02, 0x00, 0x2c, 0x30, 0x03, 0x00, 0x03, 0x00, 0x58, 0x00, + 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x41, 0x06, 0x00, 0x00, 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x30, 0x34, 0x00, 0x03, 0x00, 0x58, 0x00, 0x03, + 0x00, 0x58, 0x00, 0x02, 0x00, 0x2c, 0x30, 0x00, 0x00, 0x02, 0x00, 0x27, + 0x00, 0x00, 0xff, 0x03, 0x02, 0x00, 0x28, 0x30, 0x0d, 0x00, 0x50, 0x00, + 0x8c, 0x00, 0x36, 0x60, 0x00, 0x9c, 0x00, 0x36, 0x70, 0x00, 0xac, 0x00, + 0x02, 0x00, 0x20, 0x30, 0x08, 0x00, 0x06, 0x02, 0x00, 0x14, 0x30, 0x31, + 0x33, 0x02, 0x00, 0x20, 0x00, 0x18, 0x30, 0x45, 0x00, 0x0a, 0x40, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x20, 0x30, 0x07, 0x00, 0x0e, 0x00, 0x04, 0x00, + 0x0e, 0x00, 0x68, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x07, 0x00, 0x20, 0x30, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x08, 0x00, 0x20, 0x30, 0x00, 0x01, 0x02, 0x00, 0x08, 0x00, 0x20, 0x30, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x18, 0x30, 0x01, 0x00, 0x00, 0x08, 0x00, 0x18, 0x30, 0x00, 0x00, 0x08, + 0x00, 0x18, 0x30, 0x14, 0x30, 0x00, 0x10, 0x13, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x00, 0x20, 0x38, 0x49, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, + 0x02, 0x00, 0x14, 0x30, 0x80, 0x00, 0x02, 0x00, 0x18, 0x30, 0x02, 0x18, + 0x30, 0x18, 0x30, 0x02, 0x00, 0x18, 0x30, 0x02, 0x00, 0xff, 0x3f, 0xc0, + 0xff, 0x20, 0x30, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0x00, 0x08, + 0x00, 0x14, 0x30, 0x0e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x18, + 0x30, 0x0e, 0x00, 0x00, 0x00, 0x32, 0x02, 0x00, 0x14, 0x30, 0x28, 0x3a, + 0x46, 0x00, 0x0a, 0x40, 0x00, 0x01, 0x02, 0x00, 0x04, 0x00, 0x18, 0x30, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x20, 0x00, 0x4a, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x18, 0x30, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x14, 0x30, 0x31, 0x02, 0x00, 0x20, 0x00, 0x18, 0x30, 0x33, + 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x18, 0x30, + 0x01, 0x18, 0x30, 0x18, 0x30, 0x02, 0x00, 0x10, 0x00, 0x14, 0x30, 0x02, + 0x00, 0x04, 0x00, 0x18, 0x30, 0x00, 0x40, 0x14, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x20, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x02, 0x00, 0x20, 0x00, 0x14, 0x30, 0x00, 0x01, 0x06, 0x00, + 0x00, 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x30, + 0x34, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x14, 0x30, 0x39, 0x00, + 0x00, 0x02, 0x00, 0x04, 0x00, 0x14, 0x00, 0x34, 0x01, 0x03, 0x00, 0x18, + 0x00, 0x32, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x0b, 0x00, 0x84, 0x0d, 0x0b, + 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x14, 0x30, 0x03, 0x00, 0x58, 0x00, + 0x3f, 0x0b, 0x00, 0x84, 0x0d, 0x02, 0x00, 0x2c, 0x30, 0x3f, 0x26, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0x3f, 0x27, 0x03, 0x00, 0x1c, 0x00, + 0x02, 0x00, 0x14, 0x30, 0x35, 0x03, 0x00, 0x58, 0x00, 0x3f, 0x0b, 0x00, + 0x84, 0x0d, 0x02, 0x00, 0x14, 0x30, 0x38, 0x04, 0x00, 0x14, 0x00, 0x08, + 0x00, 0x03, 0x00, 0x18, 0x00, 0x34, 0x01, 0x06, 0x00, 0x00, 0x01, 0x08, + 0x00, 0x07, 0x00, 0x00, 0x30, 0x34, 0x00, 0x02, 0x00, 0x2c, 0x30, 0x20, + 0x00, 0x03, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x2c, 0x30, 0x02, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x2c, 0x30, 0x02, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x80, 0x00, 0x14, 0x30, 0x00, 0x02, 0x14, 0x30, 0x01, 0x3d, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x80, 0x00, 0x14, 0x30, 0x00, 0x02, 0x14, 0x30, + 0x01, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x10, 0x11, 0x24, 0x00, + 0x06, 0x00, 0x01, 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, 0x30, 0x00, 0x10, + 0x34, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x04, 0x14, 0x30, 0x15, 0x00, + 0x00, 0x01, 0x14, 0x00, 0x10, 0xe7, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, + 0x00, 0x04, 0x04, 0x00, 0x48, 0x00, 0x3e, 0x04, 0x00, 0x64, 0x00, 0x36, + 0x55, 0x15, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x10, 0x11, 0x24, 0x00, + 0x02, 0x00, 0x30, 0x30, 0x38, 0x06, 0x00, 0x01, 0x01, 0x08, 0x00, 0x07, + 0x00, 0x00, 0x30, 0x34, 0x00, 0x02, 0x00, 0x00, 0x04, 0x14, 0x30, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x2e, 0x2d, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x03, 0x00, 0x02, 0x00, 0x14, 0x30, 0x03, 0x00, 0x18, 0x00, + 0x02, 0x00, 0x30, 0x30, 0x01, 0x00, 0x00, 0x03, 0x00, 0x28, 0x00, 0x00, + 0x00, 0x01, 0x07, 0x00, 0x0f, 0x80, 0x02, 0x02, 0x2f, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x03, 0x00, 0x02, 0x00, 0x14, 0x30, 0x03, 0x00, 0x18, 0x00, + 0x02, 0x00, 0x30, 0x30, 0x01, 0x00, 0x00, 0x03, 0x00, 0x28, 0x00, 0x00, + 0x00, 0x01, 0x07, 0x00, 0x0f, 0x80, 0x02, 0x02, 0x2f, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x07, 0x00, 0x33, 0x80, 0x30, 0x3c, 0x00, 0x80, 0x01, 0x00, + 0x00, 0x01, 0x07, 0x00, 0x33, 0x80, 0x24, 0x3c, 0x00, 0x80, 0x04, 0x00, + 0x00, 0x01, 0x03, 0x00, 0x18, 0x00, 0x02, 0x00, 0x30, 0x30, 0x01, 0x00, + 0x00, 0x03, 0x00, 0x31, 0x02, 0x00, 0x03, 0x00, 0x14, 0x30, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x33, 0x80, 0x00, 0x83, + 0x0f, 0x80, 0x00, 0x02, 0x00, 0x03, 0x03, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x07, 0x00, 0x33, 0x80, 0x34, 0x3c, 0x00, 0x03, 0x03, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x3a, 0x00, 0x01, 0x00, + 0x07, 0x00, 0x30, 0x80, 0x0a, 0x0b, 0x30, 0x80, 0x08, 0x0b, 0x30, 0x80, + 0x00, 0x0b, 0xec, 0x01, 0x08, 0x00, 0x00, 0x80, 0x00, 0x80, 0xff, 0xff, + 0xff, 0xff, 0x03, 0x00, 0x1c, 0x00, 0x0b, 0x00, 0x84, 0x0d, 0x0a, 0x00, + 0x0d, 0x00, 0x00, 0x80, 0x04, 0x00, 0x02, 0x00, 0x14, 0x30, 0x38, 0x04, + 0x00, 0x14, 0x00, 0x08, 0x00, 0x04, 0x00, 0x30, 0x00, 0x00, 0x80, 0x03, + 0x00, 0x18, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x39, 0x04, 0x00, 0x14, 0x00, 0xc5, 0x00, 0x03, 0x00, 0x18, + 0x00, 0x0d, 0x00, 0x00, 0x80, 0x04, 0x00, 0x04, 0x00, 0x30, 0x00, 0x00, + 0x80, 0x07, 0x00, 0x30, 0x80, 0x08, 0x0b, 0x30, 0x80, 0x0a, 0x0b, 0x30, + 0x80, 0x0b, 0x0b, 0x08, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x0b, + 0x00, 0x84, 0x0d, 0x03, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x09, 0x00, 0xe1, 0x68, 0x38, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x09, 0x00, 0xe1, 0x68, 0xe1, 0x68, 0x00, 0x00, 0x00, 0x05, 0x09, 0x00, + 0xe1, 0x68, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x05, 0x09, 0x00, + 0xe1, 0x68, 0x3f, 0x00, 0x80, 0x00, 0xe1, 0x68, 0x37, 0x00, 0x43, 0x40, + 0x02, 0x00, 0x24, 0x30, 0x24, 0x30, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x2c, 0x30, 0xff, 0xff, 0x00, 0x01, 0x02, 0x00, 0x18, 0x30, 0x20, 0x00, + 0x3c, 0x3f, 0x03, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x2c, 0x30, 0x30, 0x00, 0x03, 0x00, 0x58, 0x00, 0x00, 0x01, 0x3c, 0x00, + 0x00, 0x80, 0xff, 0x03, 0x00, 0x40, 0x0d, 0x00, 0x00, 0x00, 0x21, 0x00, + 0x00, 0x50, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x01, 0x00, + 0x01, 0x00, 0x33, 0x54, 0x34, 0x53, 0x35, 0x52, 0x36, 0x51, 0x37, 0x50, + 0x38, 0x4f, 0x39, 0x4e, 0x3a, 0x4d, 0x3b, 0x4c, 0x00, 0x01, 0x20, 0x00, + 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x08, + 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x00, 0x20, 0x00, 0x01, 0x00, 0x40, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x10, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x04, 0x00, + 0x14, 0x00, 0x06, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x01, 0x0b, 0x00, + 0x80, 0x0d, 0x08, 0x00, 0xff, 0x00, 0xff, 0x02, 0x00, 0x18, 0x30, 0xff, + 0x00, 0xff, 0x00, 0x0b, 0x00, 0x80, 0x0d, 0x00, 0x00, 0x01, 0x04, 0x00, + 0x00, 0x01, 0x14, 0x00, 0x02, 0x00, 0x14, 0x30, 0x16, 0x06, 0x00, 0x00, + 0x01, 0x08, 0x00, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x18, 0x30, 0x38, 0xff, 0x00, 0xff, 0x00, 0x0b, 0x00, 0x80, 0x0d, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x17, 0x02, 0x00, 0x00, + 0x01, 0x14, 0x30, 0x20, 0x00, 0x18, 0x30, 0x3e, 0x00, 0x01, 0x0c, 0x00, + 0x20, 0x00, 0x04, 0x00, 0x00, 0x01, 0x0c, 0x00, 0x20, 0x00, 0x04, 0x00, + 0x00, 0x01, 0x43, 0x40, 0x00, 0x01, 0x02, 0x00, 0x04, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x41, 0x02, 0x00, 0x04, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x02, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x00, 0x02, + 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x08, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x10, 0x00, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x00, 0x20, + 0x01, 0x02, 0x00, 0x14, 0x30, 0x3f, 0x14, 0x30, 0x00, 0x01, 0x00, 0x20, + 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2b, 0x62, 0x17, 0xa2, 0x00, 0x00, 0xc2, 0x60, 0x10, 0x00, 0xc2, 0x60, + 0x62, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x28, 0x03, 0xc2, 0x60, + 0x90, 0x08, 0xc2, 0x60, 0x68, 0x03, 0xc2, 0x60, 0xdc, 0x08, 0xc2, 0x60, + 0x04, 0x04, 0xc2, 0x60, 0xa4, 0x09, 0xc2, 0x60, 0x58, 0x04, 0xc2, 0x60, + 0xfc, 0x09, 0xc2, 0x60, 0x88, 0x05, 0xc2, 0x60, 0x2c, 0x0b, 0xc2, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x03, 0xc2, 0x60, + 0x30, 0x09, 0xc2, 0x60, 0xbc, 0x03, 0xc2, 0x60, 0x44, 0x09, 0xc2, 0x60, + 0xc4, 0x03, 0xc2, 0x60, 0x4c, 0x09, 0xc2, 0x60, 0xc8, 0x03, 0xc2, 0x60, + 0x54, 0x09, 0xc2, 0x60, 0xcc, 0x03, 0xc2, 0x60, 0x5c, 0x09, 0xc2, 0x60, + 0xd0, 0x03, 0xc2, 0x60, 0x64, 0x09, 0xc2, 0x60, 0xd4, 0x03, 0xc2, 0x60, + 0x6c, 0x09, 0xc2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x08, 0xc2, 0x60, 0x30, 0x0e, 0xc2, 0x60, 0x84, 0x08, 0xc2, 0x60, + 0x3c, 0x0e, 0xc2, 0x60, 0xb8, 0x07, 0xc2, 0x60, 0x70, 0x0d, 0xc2, 0x60, + 0xa8, 0x05, 0xc2, 0x60, 0x54, 0x0b, 0xc2, 0x60, 0xa4, 0x05, 0xc2, 0x60, + 0x4c, 0x0b, 0xc2, 0x60, 0xe0, 0x07, 0xc2, 0x60, 0x94, 0x0d, 0xc2, 0x60, + 0x0c, 0x08, 0xc2, 0x60, 0xc4, 0x0d, 0xc2, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb0, 0x04, 0xc2, 0x60, 0x58, 0x0a, 0xc2, 0x60, + 0xf8, 0x04, 0xc2, 0x60, 0xa4, 0x0a, 0xc2, 0x60, 0x7c, 0x05, 0xc2, 0x60, + 0x20, 0x0b, 0xc2, 0x60, 0x80, 0x05, 0xc2, 0x60, 0x24, 0x0b, 0xc2, 0x60, + 0x84, 0x05, 0xc2, 0x60, 0x28, 0x0b, 0xc2, 0x60, 0x44, 0x05, 0xc2, 0x60, + 0xe8, 0x0a, 0xc2, 0x60, 0x4c, 0x05, 0xc2, 0x60, 0xf4, 0x0a, 0xc2, 0x60, + 0x54, 0x05, 0xc2, 0x60, 0x00, 0x0b, 0xc2, 0x60, 0x68, 0x05, 0xc2, 0x60, + 0x10, 0x0b, 0xc2, 0x60, 0xe4, 0x05, 0xc2, 0x60, 0x88, 0x0b, 0xc2, 0x60, + 0xf4, 0x05, 0xc2, 0x60, 0x94, 0x0b, 0xc2, 0x60, 0x08, 0x06, 0xc2, 0x60, + 0xac, 0x0b, 0xc2, 0x60, 0x10, 0x06, 0xc2, 0x60, 0xb8, 0x0b, 0xc2, 0x60, + 0x24, 0x06, 0xc2, 0x60, 0xd0, 0x0b, 0xc2, 0x60, 0x2c, 0x06, 0xc2, 0x60, + 0xdc, 0x0b, 0xc2, 0x60, 0x34, 0x06, 0xc2, 0x60, 0xe8, 0x0b, 0xc2, 0x60, + 0x3c, 0x06, 0xc2, 0x60, 0xf4, 0x0b, 0xc2, 0x60, 0x50, 0x06, 0xc2, 0x60, + 0x10, 0x0c, 0xc2, 0x60, 0x5c, 0x06, 0xc2, 0x60, 0x24, 0x0c, 0xc2, 0x60, + 0x68, 0x06, 0xc2, 0x60, 0x34, 0x0c, 0xc2, 0x60, 0xa4, 0x06, 0xc2, 0x60, + 0x80, 0x0c, 0xc2, 0x60, 0xd8, 0x03, 0xc2, 0x60, 0x74, 0x09, 0xc2, 0x60, + 0xe0, 0x06, 0xc2, 0x60, 0xbc, 0x0c, 0xc2, 0x60, 0xe8, 0x06, 0xc2, 0x60, + 0xc8, 0x0c, 0xc2, 0x60, 0xf0, 0x06, 0xc2, 0x60, 0xd4, 0x0c, 0xc2, 0x60, + 0xf8, 0x06, 0xc2, 0x60, 0xe0, 0x0c, 0xc2, 0x60, 0xe0, 0x03, 0xc2, 0x60, + 0x7c, 0x09, 0xc2, 0x60, 0x30, 0x07, 0xc2, 0x60, 0x1c, 0x0d, 0xc2, 0x60, + 0xf0, 0x07, 0xc2, 0x60, 0xac, 0x0d, 0xc2, 0x60, 0x18, 0x08, 0xc2, 0x60, + 0xd4, 0x0d, 0xc2, 0x60, 0x9c, 0x04, 0xc2, 0x60, 0x44, 0x0a, 0xc2, 0x60, + 0xd0, 0x07, 0xc2, 0x60, 0x88, 0x0d, 0xc2, 0x60, 0x0c, 0x07, 0xc2, 0x60, + 0xf8, 0x0c, 0xc2, 0x60, 0x2c, 0x08, 0xc2, 0x60, 0xe8, 0x0d, 0xc2, 0x60, + 0x34, 0x08, 0xc2, 0x60, 0xf0, 0x0d, 0xc2, 0x60, 0x3c, 0x08, 0xc2, 0x60, + 0xf8, 0x0d, 0xc2, 0x60, 0x40, 0x08, 0xc2, 0x60, 0xfc, 0x0d, 0xc2, 0x60, + 0x48, 0x08, 0xc2, 0x60, 0x04, 0x0e, 0xc2, 0x60, 0xf0, 0x03, 0xc2, 0x60, + 0x8c, 0x09, 0xc2, 0x60, 0x50, 0x04, 0xc2, 0x60, 0xf4, 0x09, 0xc2, 0x60, + 0xa0, 0x04, 0xc2, 0x60, 0x48, 0x0a, 0xc2, 0x60, 0xa8, 0x04, 0xc2, 0x60, + 0x50, 0x0a, 0xc2, 0x60, 0x10, 0x04, 0xc2, 0x60, 0xb0, 0x09, 0xc2, 0x60, + 0x60, 0x04, 0xc2, 0x60, 0x08, 0x0a, 0xc2, 0x60, 0xec, 0x03, 0xc2, 0x60, + 0x88, 0x09, 0xc2, 0x60, 0x94, 0x07, 0xc2, 0x60, 0x4c, 0x0d, 0xc2, 0x60, + 0x98, 0x07, 0xc2, 0x60, 0x50, 0x0d, 0xc2, 0x60, 0x9c, 0x07, 0xc2, 0x60, + 0x54, 0x0d, 0xc2, 0x60, 0xa0, 0x07, 0xc2, 0x60, 0x58, 0x0d, 0xc2, 0x60, + 0xa4, 0x07, 0xc2, 0x60, 0x5c, 0x0d, 0xc2, 0x60, 0xa8, 0x07, 0xc2, 0x60, + 0x60, 0x0d, 0xc2, 0x60, 0xac, 0x07, 0xc2, 0x60, 0x64, 0x0d, 0xc2, 0x60, + 0xb0, 0x07, 0xc2, 0x60, 0x68, 0x0d, 0xc2, 0x60, 0xb4, 0x07, 0xc2, 0x60, + 0x6c, 0x0d, 0xc2, 0x60, 0xc8, 0x05, 0xc2, 0x60, 0x68, 0x0b, 0xc2, 0x60, + 0xe8, 0x03, 0xc2, 0x60, 0x84, 0x09, 0xc2, 0x60, 0x24, 0x07, 0xc2, 0x60, + 0x10, 0x0d, 0xc2, 0x60, 0xc8, 0x07, 0xc2, 0x60, 0x80, 0x0d, 0xc2, 0x60, + 0x54, 0x08, 0xc2, 0x60, 0x10, 0x0e, 0xc2, 0x60, 0x5c, 0x08, 0xc2, 0x60, + 0x18, 0x0e, 0xc2, 0x60, 0x64, 0x08, 0xc2, 0x60, 0x20, 0x0e, 0xc2, 0x60, + 0x6c, 0x08, 0xc2, 0x60, 0x28, 0x0e, 0xc2, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8c, 0x08, 0xc2, 0x60, 0x44, 0x0e, 0xc2, 0x60, 0xce, 0xd6, 0x90, 0x50, + 0xad, 0xae, 0xd0, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0x90, 0x50, 0xa9, 0xae, + 0xd6, 0xf0, 0xc8, 0x81, 0xf1, 0x89, 0xad, 0xd0, 0xc4, 0xd6, 0xf1, 0x90, + 0x58, 0x81, 0xc5, 0xc4, 0xd6, 0xf0, 0xc8, 0xfd, 0x55, 0x85, 0x95, 0xad, + 0xd6, 0xfe, 0x56, 0xd0, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, 0xf5, + 0xd6, 0x90, 0xae, 0x56, 0xd0, 0xd6, 0xf0, 0xfe, 0x56, 0x86, 0xc5, 0xc6, + 0xce, 0xc4, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0x55, 0xfe, 0x56, + 0xd0, 0xd6, 0xf0, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xd6, 0xf0, 0xf9, 0x51, + 0x81, 0x91, 0xc5, 0xfe, 0x56, 0xd6, 0xf5, 0xd6, 0xd0, 0xd0, 0xa5, 0xc8, + 0xad, 0xd0, 0xd0, 0xa5, 0xc8, 0xad, 0xd0, 0xd0, 0xd6, 0xf1, 0x90, 0x50, + 0x81, 0xc5, 0xd6, 0xf1, 0x90, 0x58, 0x81, 0xc5, 0xc4, 0xd6, 0x90, 0xad, + 0xae, 0x56, 0xd0, 0xd3, 0xcd, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf5, 0x90, + 0xae, 0x56, 0xd6, 0xd0, 0x58, 0xad, 0xae, 0xd6, 0xd0, 0xc4, 0xc6, 0x00, + 0xce, 0xd6, 0x90, 0xae, 0x56, 0xd0, 0xc6, 0x00, 0xce, 0x55, 0xc4, 0xc6, + 0xce, 0x55, 0xc4, 0xc6, 0xce, 0x55, 0xc4, 0xc6, 0xce, 0x55, 0xc4, 0xc6, + 0xce, 0x55, 0xc4, 0xc6, 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, + 0xce, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf0, 0xc8, 0xf9, 0x51, 0x81, 0xf1, + 0x89, 0xad, 0xfe, 0x56, 0xd0, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xc6, 0x00, + 0xce, 0xd6, 0xf1, 0x90, 0x50, 0xaa, 0x81, 0x92, 0xc8, 0x81, 0xc5, 0xc6, + 0xce, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0x90, 0x50, 0xa9, 0xae, 0xd6, + 0xf0, 0xc8, 0x81, 0xf1, 0x89, 0xad, 0xd0, 0xd6, 0x90, 0xae, 0x5e, 0xad, + 0xd0, 0xd6, 0xfe, 0x56, 0xd0, 0xd6, 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xd6, + 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, 0xf5, 0x90, 0x50, 0xae, 0xd6, 0xd0, + 0xad, 0xd6, 0xd0, 0xc4, 0xd6, 0xf1, 0x90, 0x58, 0x81, 0xc5, 0xc4, 0xd3, + 0xcd, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, + 0xce, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf5, 0x90, + 0x50, 0xae, 0xd6, 0xd0, 0xd6, 0xf1, 0x90, 0x58, 0x81, 0xc5, 0xd6, 0x90, + 0x50, 0xa9, 0xf0, 0x91, 0x81, 0xc5, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, + 0xd6, 0x90, 0x50, 0xa9, 0xae, 0xf0, 0xc8, 0x81, 0xf1, 0x89, 0xad, 0xd0, + 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, + 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, 0x00, 0x00, 0xce, 0xcf, 0xc6, 0x00, + 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xad, + 0xae, 0x56, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0xd6, + 0x55, 0xfe, 0x56, 0xd0, 0xfd, 0x55, 0xd6, 0xf0, 0xc8, 0x85, 0x95, 0xad, + 0xfe, 0x56, 0xd6, 0xd0, 0xcd, 0x90, 0xad, 0xae, 0x5e, 0xd6, 0xd0, 0xcd, + 0x90, 0xaa, 0xd6, 0xea, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, 0xd0, + 0x90, 0xad, 0xaa, 0x5a, 0xd6, 0xf0, 0xa9, 0xc8, 0x81, 0x82, 0xae, 0xd6, + 0xd0, 0x90, 0xa9, 0x59, 0xd6, 0xf2, 0xa2, 0xc8, 0x91, 0x81, 0x82, 0xc5, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0xa9, 0x59, 0xd6, 0xf2, 0xa2, 0xc8, + 0x91, 0x81, 0x82, 0xc5, 0x90, 0x60, 0xaa, 0xd6, 0xea, 0xd6, 0xf0, 0xc8, + 0xad, 0xd6, 0xf0, 0xa9, 0xc8, 0x81, 0xa9, 0x90, 0x58, 0x81, 0xae, 0xd6, + 0xd0, 0xd6, 0x90, 0x58, 0xad, 0xf0, 0xc8, 0x85, 0x95, 0xad, 0x90, 0xae, + 0x5e, 0xd6, 0xd0, 0xcd, 0x90, 0x58, 0xad, 0xae, 0xd6, 0xd0, 0xcd, 0xd6, + 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, + 0xf5, 0x90, 0x50, 0x8d, 0xd6, 0xe8, 0xc6, 0x00, 0xce, 0xd6, 0xf1, 0x90, + 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xc6, + 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0x56, 0xf1, 0xa1, 0xc8, 0x86, + 0x96, 0xaa, 0xa1, 0x86, 0x82, 0xc5, 0xc6, 0x00, 0xce, 0xd6, 0x90, 0xad, + 0xae, 0x56, 0xd0, 0x56, 0xf1, 0xa1, 0xc8, 0x86, 0x96, 0xaa, 0xa1, 0x86, + 0x82, 0xc5, 0xc6, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xd6, + 0x90, 0xad, 0xae, 0x56, 0xd0, 0xd6, 0xae, 0xfe, 0xfd, 0xd0, 0xd6, 0xae, + 0x56, 0x55, 0xd0, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd3, 0xcd, 0xc6, + 0xce, 0x90, 0xaa, 0x5a, 0xab, 0x53, 0xac, 0x54, 0xd6, 0xf1, 0xa1, 0x82, + 0x92, 0xad, 0xa1, 0x83, 0x93, 0xc8, 0x85, 0xad, 0xd6, 0xf0, 0x84, 0x94, + 0xc8, 0x85, 0xad, 0xc5, 0xa2, 0xc5, 0xc6, 0x00, 0xce, 0xd6, 0x90, 0xad, + 0xae, 0xfe, 0xd0, 0xd6, 0xf0, 0xc8, 0xad, 0xd6, 0x90, 0xae, 0x56, 0xd0, + 0xd6, 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0xad, 0xae, 0x56, 0xd0, 0xaa, 0xc6, + 0xce, 0xd6, 0xf1, 0x90, 0x58, 0x58, 0x81, 0xa9, 0xc5, 0x90, 0x58, 0x58, + 0x91, 0xc5, 0xc4, 0xc6, 0xce, 0x90, 0xae, 0xad, 0x5d, 0x56, 0xd6, 0xd0, + 0xd6, 0xf1, 0xd6, 0xf0, 0xc8, 0x89, 0xf9, 0x51, 0x81, 0xc5, 0xc6, 0x00, + 0xce, 0xd6, 0xc1, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0x50, 0xad, + 0xae, 0xd6, 0xd0, 0xd6, 0xf1, 0xd6, 0xf0, 0xc8, 0x89, 0xf9, 0x51, 0x81, + 0xc5, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xc1, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xd6, 0xc1, 0xc0, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xc1, 0xc0, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xf1, 0xd6, 0xf0, 0xc8, 0x89, 0xf9, + 0x51, 0x81, 0xc5, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc0, 0xc6, 0x00, + 0xce, 0xd6, 0xc1, 0xc1, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0xc6, 0x00, + 0xce, 0xd6, 0xc1, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0x51, 0x53, 0x0b, 0x59, 0x0b, 0xd6, 0xc1, 0xc1, 0xc1, 0xcd, + 0xd6, 0xc1, 0xfa, 0x52, 0xd6, 0xea, 0xd6, 0x90, 0x58, 0xad, 0xae, 0xd0, + 0xcd, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0x90, 0x58, 0xad, 0xd6, 0xf0, + 0xc8, 0x85, 0x95, 0xad, 0x90, 0x58, 0xae, 0xd6, 0xd0, 0xcd, 0xd6, 0x90, + 0xad, 0xae, 0x56, 0xd0, 0x58, 0xad, 0xae, 0xd6, 0xd0, 0xcd, 0xc6, 0x00, + 0xce, 0x90, 0x58, 0x58, 0xad, 0xd6, 0xf0, 0xc8, 0x85, 0x95, 0xad, 0x90, + 0x58, 0x58, 0xae, 0xd6, 0xd0, 0xcd, 0x90, 0xad, 0x58, 0xae, 0xd6, 0xd0, + 0xd6, 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, + 0xd6, 0xc1, 0xc1, 0xc1, 0xd6, 0x51, 0x53, 0x0b, 0x59, 0x0b, 0xcd, 0xd6, + 0x90, 0xad, 0x58, 0xae, 0xd0, 0x90, 0xd6, 0xe8, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x56, 0xd6, 0x4e, 0xc4, 0xc6, 0x00, 0x00, 0xce, 0x56, 0x90, 0xd6, + 0x4e, 0x48, 0xc6, 0x00, 0xce, 0xd6, 0x99, 0x90, 0x50, 0x81, 0xc5, 0xc6, + 0xce, 0xd6, 0x99, 0x90, 0x50, 0x59, 0x81, 0x51, 0x89, 0x48, 0xd3, 0xcd, + 0xd6, 0xf0, 0x58, 0xe8, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xf4, 0xfa, + 0x52, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc8, 0xab, 0x8a, 0xaa, 0xa3, 0xc8, + 0x8a, 0x84, 0xd6, 0xe8, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xf2, 0x90, + 0x50, 0x8a, 0xd6, 0xe8, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0xac, 0xad, + 0xaf, 0x57, 0xae, 0xfe, 0xab, 0x53, 0xaa, 0xfa, 0xd6, 0xf0, 0x86, 0xc8, + 0x7f, 0xfe, 0x56, 0x6e, 0xae, 0xe6, 0xa9, 0x82, 0xc8, 0xac, 0xa1, 0x83, + 0x7c, 0xad, 0x90, 0x50, 0x6e, 0xae, 0xe6, 0xa9, 0x82, 0xc8, 0xac, 0xa1, + 0x83, 0x7c, 0x6d, 0xad, 0x90, 0x50, 0x6e, 0xae, 0xe6, 0xa9, 0x82, 0xc8, + 0xac, 0xa1, 0x83, 0x7c, 0x6d, 0xa9, 0x90, 0x50, 0x79, 0xaa, 0x51, 0xc8, + 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, + 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, + 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0x90, 0xf8, 0xad, 0xae, 0xd6, 0xd0, 0x90, 0xad, 0xae, 0x56, 0xd6, + 0xd0, 0xc6, 0x00, 0x00, 0xce, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0xc6, + 0xce, 0xd6, 0x90, 0x58, 0xad, 0xae, 0xd0, 0xd6, 0x90, 0xf8, 0xad, 0xae, + 0xd0, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, + 0xd0, 0x90, 0xad, 0x56, 0xfe, 0xd6, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xaa, + 0x52, 0x58, 0x58, 0xad, 0xae, 0xd0, 0xd6, 0xf0, 0x82, 0x92, 0xc5, 0xd6, + 0x90, 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0xa2, 0xad, 0xae, 0xd0, 0xc6, 0x00, + 0xce, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xd6, 0x90, 0xad, 0xae, 0x56, + 0xd0, 0x56, 0xf0, 0x86, 0xc5, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x90, 0x50, + 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, + 0xce, 0xc4, 0xc4, 0xc6, 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, + 0xce, 0xc4, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, 0xce, 0x90, 0x50, 0xad, + 0xae, 0xd6, 0xd0, 0xc6, 0xce, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, + 0xce, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, 0xce, 0x90, 0x50, 0xae, + 0xc8, 0xa9, 0xd6, 0xf0, 0x81, 0x91, 0xc8, 0xad, 0xd0, 0xc6, 0x00, 0x00, + 0xce, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, 0xce, 0xc6, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x20, 0x00, 0x18, 0x30, 0x14, 0x30, 0x00, 0x10, + 0x13, 0x10, 0x00, 0x02, 0x00, 0x18, 0x30, 0x02, 0x18, 0x30, 0x18, 0x30, + 0x32, 0x02, 0x00, 0x14, 0x30, 0x28, 0x3a, 0x02, 0x00, 0x14, 0x30, 0x10, + 0x00, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, + 0x07, 0x00, 0x00, 0x30, 0x34, 0x00, 0x02, 0x00, 0x2c, 0x30, 0x03, 0x00, + 0x03, 0x00, 0x58, 0x00, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x04, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x41, 0x06, 0x00, 0x00, 0x01, 0x08, + 0x00, 0x07, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x30, 0x34, 0x00, 0x03, + 0x00, 0x58, 0x00, 0x03, 0x00, 0x58, 0x00, 0x02, 0x00, 0x2c, 0x30, 0x00, + 0x00, 0x02, 0x00, 0x27, 0x00, 0x00, 0xff, 0x03, 0x02, 0x00, 0x28, 0x30, + 0x0d, 0x00, 0x50, 0x00, 0x8c, 0x00, 0x36, 0x60, 0x00, 0x9c, 0x00, 0x36, + 0x70, 0x00, 0xac, 0x00, 0x02, 0x00, 0x20, 0x30, 0x08, 0x00, 0x06, 0x02, + 0x00, 0x14, 0x30, 0x31, 0x33, 0x02, 0x00, 0x20, 0x00, 0x18, 0x30, 0x45, + 0x00, 0x0a, 0x40, 0x00, 0x00, 0x01, 0x02, 0x00, 0x20, 0x30, 0x07, 0x00, + 0x0e, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x68, 0x00, 0x39, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x07, 0x00, 0x20, 0x30, 0x00, 0x01, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x08, 0x00, 0x20, 0x30, 0x00, 0x01, 0x02, 0x00, + 0x08, 0x00, 0x20, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x18, 0x30, 0x01, 0x00, 0x00, 0x08, 0x00, 0x18, + 0x30, 0x00, 0x00, 0x08, 0x00, 0x18, 0x30, 0x14, 0x30, 0x00, 0x10, 0x13, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x20, 0x38, 0x49, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x40, 0x02, 0x00, 0x14, 0x30, 0x80, 0x00, 0x02, 0x00, + 0x18, 0x30, 0x02, 0x18, 0x30, 0x18, 0x30, 0x02, 0x00, 0x18, 0x30, 0x02, + 0x00, 0xff, 0x3f, 0xc0, 0xff, 0x20, 0x30, 0x04, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x02, 0x00, 0x08, 0x00, 0x14, 0x30, 0x0e, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x18, 0x30, 0x0e, 0x00, 0x00, 0x00, 0x32, 0x02, 0x00, + 0x14, 0x30, 0x28, 0x3a, 0x46, 0x00, 0x0a, 0x40, 0x00, 0x01, 0x02, 0x00, + 0x04, 0x00, 0x18, 0x30, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, + 0x20, 0x00, 0x4a, 0x00, 0x00, 0x01, 0x02, 0x00, 0x18, 0x30, 0x02, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x30, 0x31, 0x02, 0x00, 0x20, + 0x00, 0x18, 0x30, 0x33, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0x00, + 0x40, 0x00, 0x18, 0x30, 0x01, 0x18, 0x30, 0x18, 0x30, 0x02, 0x00, 0x10, + 0x00, 0x14, 0x30, 0x02, 0x00, 0x04, 0x00, 0x18, 0x30, 0x00, 0x40, 0x14, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x20, 0x00, 0x14, 0x30, 0x00, 0x01, 0x02, 0x00, 0x20, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x06, 0x00, 0x00, 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x30, 0x34, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x14, 0x30, 0x39, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x14, 0x00, 0x34, + 0x01, 0x03, 0x00, 0x18, 0x00, 0x32, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x0b, + 0x00, 0x84, 0x0d, 0x0b, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x14, 0x30, + 0x03, 0x00, 0x58, 0x00, 0x3f, 0x0b, 0x00, 0x84, 0x0d, 0x02, 0x00, 0x2c, + 0x30, 0x3f, 0x26, 0x00, 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0x3f, 0x27, + 0x03, 0x00, 0x1c, 0x00, 0x02, 0x00, 0x14, 0x30, 0x35, 0x03, 0x00, 0x58, + 0x00, 0x3f, 0x0b, 0x00, 0x84, 0x0d, 0x02, 0x00, 0x14, 0x30, 0x38, 0x04, + 0x00, 0x14, 0x00, 0x08, 0x00, 0x03, 0x00, 0x18, 0x00, 0x34, 0x01, 0x06, + 0x00, 0x00, 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, 0x30, 0x34, 0x00, 0x02, + 0x00, 0x2c, 0x30, 0x20, 0x00, 0x03, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0x02, 0x00, 0x26, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0x02, 0x00, 0x27, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x80, 0x00, 0x14, 0x30, 0x00, 0x02, 0x14, 0x30, + 0x01, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x80, 0x00, 0x14, 0x30, + 0x00, 0x02, 0x14, 0x30, 0x01, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, + 0x10, 0x11, 0x24, 0x00, 0x06, 0x00, 0x01, 0x01, 0x08, 0x00, 0x07, 0x00, + 0x00, 0x30, 0x00, 0x10, 0x34, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x04, + 0x14, 0x30, 0x15, 0x00, 0x00, 0x01, 0x14, 0x00, 0x10, 0xe7, 0x00, 0x00, + 0x00, 0x01, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x48, 0x00, 0x3e, 0x04, + 0x00, 0x64, 0x00, 0x36, 0x55, 0x15, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, + 0x10, 0x11, 0x24, 0x00, 0x02, 0x00, 0x30, 0x30, 0x38, 0x06, 0x00, 0x01, + 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, 0x30, 0x34, 0x00, 0x02, 0x00, 0x00, + 0x04, 0x14, 0x30, 0x00, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x2e, 0x2d, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x03, 0x00, 0x18, 0x00, 0x02, 0x00, 0x30, 0x30, 0x01, 0x00, 0x00, 0x03, + 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x0f, 0x80, 0x02, 0x02, + 0x2f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x03, 0x00, 0x18, 0x00, 0x02, 0x00, 0x30, 0x30, 0x01, 0x00, 0x00, 0x03, + 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x0f, 0x80, 0x02, 0x02, + 0x2f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x33, 0x80, 0x30, 0x3c, + 0x00, 0x80, 0x01, 0x00, 0x00, 0x01, 0x07, 0x00, 0x33, 0x80, 0x24, 0x3c, + 0x00, 0x80, 0x04, 0x00, 0x00, 0x01, 0x03, 0x00, 0x18, 0x00, 0x02, 0x00, + 0x30, 0x30, 0x01, 0x00, 0x00, 0x03, 0x00, 0x31, 0x02, 0x00, 0x03, 0x00, + 0x14, 0x30, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, + 0x33, 0x80, 0x00, 0x83, 0x0f, 0x80, 0x00, 0x02, 0x00, 0x03, 0x03, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x33, 0x80, 0x34, 0x3c, + 0x00, 0x03, 0x03, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, + 0x3a, 0x00, 0x01, 0x00, 0x07, 0x00, 0x30, 0x80, 0x0a, 0x0b, 0x30, 0x80, + 0x08, 0x0b, 0x30, 0x80, 0x00, 0x0b, 0xec, 0x01, 0x08, 0x00, 0x00, 0x80, + 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x1c, 0x00, 0x0b, 0x00, + 0x84, 0x0d, 0x0a, 0x00, 0x0d, 0x00, 0x00, 0x80, 0x04, 0x00, 0x02, 0x00, + 0x14, 0x30, 0x38, 0x04, 0x00, 0x14, 0x00, 0x08, 0x00, 0x04, 0x00, 0x30, + 0x00, 0x00, 0x80, 0x03, 0x00, 0x18, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x39, 0x04, 0x00, 0x14, 0x00, 0xc5, + 0x00, 0x03, 0x00, 0x18, 0x00, 0x0d, 0x00, 0x00, 0x80, 0x04, 0x00, 0x04, + 0x00, 0x30, 0x00, 0x00, 0x80, 0x07, 0x00, 0x30, 0x80, 0x08, 0x0b, 0x30, + 0x80, 0x0a, 0x0b, 0x30, 0x80, 0x0b, 0x0b, 0x08, 0x00, 0x3a, 0x00, 0x00, + 0x00, 0x3f, 0x00, 0x0b, 0x00, 0x84, 0x0d, 0x03, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x01, 0x80, 0x00, 0x09, 0x00, 0xe1, 0x68, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x80, 0x00, 0x09, 0x00, 0xe1, 0x68, 0xe1, 0x68, 0x00, 0x00, + 0x00, 0x05, 0x09, 0x00, 0xe1, 0x68, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x05, 0x09, 0x00, 0xe1, 0x68, 0x3f, 0x00, 0x80, 0x00, 0xe1, 0x68, + 0x37, 0x00, 0x43, 0x40, 0x02, 0x00, 0x24, 0x30, 0x24, 0x30, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0xff, 0xff, 0x00, 0x01, 0x02, 0x00, + 0x18, 0x30, 0x20, 0x00, 0x3c, 0x3f, 0x03, 0x00, 0x58, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0x30, 0x00, 0x03, 0x00, 0x58, 0x00, + 0x00, 0x01, 0x3c, 0x00, 0x00, 0x80, 0xff, 0x03, 0x00, 0x40, 0x0d, 0x00, + 0x00, 0x00, 0x21, 0x00, 0x00, 0x50, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, + 0x00, 0x22, 0x01, 0x00, 0x01, 0x00, 0x33, 0x54, 0x34, 0x53, 0x35, 0x52, + 0x36, 0x51, 0x37, 0x50, 0x38, 0x4f, 0x39, 0x4e, 0x3a, 0x4d, 0x3b, 0x4c, + 0x00, 0x01, 0x20, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04, + 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x00, 0x20, + 0x00, 0x01, 0x00, 0x40, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, + 0x14, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x02, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x04, 0x00, 0x14, 0x00, 0x06, 0x00, 0x00, 0x01, 0x08, 0x00, + 0x00, 0x01, 0x0b, 0x00, 0x80, 0x0d, 0x08, 0x00, 0xff, 0x00, 0xff, 0x02, + 0x00, 0x18, 0x30, 0xff, 0x00, 0xff, 0x00, 0x0b, 0x00, 0x80, 0x0d, 0x00, + 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x14, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x16, 0x06, 0x00, 0x00, 0x01, 0x08, 0x00, 0x02, 0x00, 0x14, 0x30, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x18, 0x30, 0x38, 0xff, 0x00, 0xff, 0x00, 0x0b, + 0x00, 0x80, 0x0d, 0x00, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, + 0x17, 0x02, 0x00, 0x00, 0x01, 0x14, 0x30, 0x20, 0x00, 0x18, 0x30, 0x3e, + 0x00, 0x01, 0x0c, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x01, 0x0c, 0x00, + 0x20, 0x00, 0x04, 0x00, 0x00, 0x01, 0x43, 0x40, 0x00, 0x01, 0x02, 0x00, + 0x04, 0x00, 0x14, 0x30, 0x00, 0x01, 0x41, 0x02, 0x00, 0x04, 0x00, 0x14, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x02, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x00, 0x02, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x08, 0x00, + 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x10, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x00, 0x20, 0x01, 0x02, 0x00, 0x14, 0x30, 0x3f, 0x14, 0x30, + 0x00, 0x01, 0x00, 0x20, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x02, 0x41, 0xa2, 0x00, 0x00, 0xd2, 0x60, + 0x10, 0x00, 0xd2, 0x60, 0x62, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x03, 0xd2, 0x60, 0x90, 0x08, 0xd2, 0x60, 0x68, 0x03, 0xd2, 0x60, + 0xdc, 0x08, 0xd2, 0x60, 0x04, 0x04, 0xd2, 0x60, 0xa4, 0x09, 0xd2, 0x60, + 0x58, 0x04, 0xd2, 0x60, 0xfc, 0x09, 0xd2, 0x60, 0x88, 0x05, 0xd2, 0x60, + 0x2c, 0x0b, 0xd2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xac, 0x03, 0xd2, 0x60, 0x30, 0x09, 0xd2, 0x60, 0xbc, 0x03, 0xd2, 0x60, + 0x44, 0x09, 0xd2, 0x60, 0xc4, 0x03, 0xd2, 0x60, 0x4c, 0x09, 0xd2, 0x60, + 0xc8, 0x03, 0xd2, 0x60, 0x54, 0x09, 0xd2, 0x60, 0xcc, 0x03, 0xd2, 0x60, + 0x5c, 0x09, 0xd2, 0x60, 0xd0, 0x03, 0xd2, 0x60, 0x64, 0x09, 0xd2, 0x60, + 0xd4, 0x03, 0xd2, 0x60, 0x6c, 0x09, 0xd2, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x74, 0x08, 0xd2, 0x60, 0x30, 0x0e, 0xd2, 0x60, + 0x84, 0x08, 0xd2, 0x60, 0x3c, 0x0e, 0xd2, 0x60, 0xb8, 0x07, 0xd2, 0x60, + 0x70, 0x0d, 0xd2, 0x60, 0xa8, 0x05, 0xd2, 0x60, 0x54, 0x0b, 0xd2, 0x60, + 0xa4, 0x05, 0xd2, 0x60, 0x4c, 0x0b, 0xd2, 0x60, 0xe0, 0x07, 0xd2, 0x60, + 0x94, 0x0d, 0xd2, 0x60, 0x0c, 0x08, 0xd2, 0x60, 0xc4, 0x0d, 0xd2, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x04, 0xd2, 0x60, + 0x58, 0x0a, 0xd2, 0x60, 0xf8, 0x04, 0xd2, 0x60, 0xa4, 0x0a, 0xd2, 0x60, + 0x7c, 0x05, 0xd2, 0x60, 0x20, 0x0b, 0xd2, 0x60, 0x80, 0x05, 0xd2, 0x60, + 0x24, 0x0b, 0xd2, 0x60, 0x84, 0x05, 0xd2, 0x60, 0x28, 0x0b, 0xd2, 0x60, + 0x44, 0x05, 0xd2, 0x60, 0xe8, 0x0a, 0xd2, 0x60, 0x4c, 0x05, 0xd2, 0x60, + 0xf4, 0x0a, 0xd2, 0x60, 0x54, 0x05, 0xd2, 0x60, 0x00, 0x0b, 0xd2, 0x60, + 0x68, 0x05, 0xd2, 0x60, 0x10, 0x0b, 0xd2, 0x60, 0xe4, 0x05, 0xd2, 0x60, + 0x88, 0x0b, 0xd2, 0x60, 0xf4, 0x05, 0xd2, 0x60, 0x94, 0x0b, 0xd2, 0x60, + 0x08, 0x06, 0xd2, 0x60, 0xac, 0x0b, 0xd2, 0x60, 0x10, 0x06, 0xd2, 0x60, + 0xb8, 0x0b, 0xd2, 0x60, 0x24, 0x06, 0xd2, 0x60, 0xd0, 0x0b, 0xd2, 0x60, + 0x2c, 0x06, 0xd2, 0x60, 0xdc, 0x0b, 0xd2, 0x60, 0x34, 0x06, 0xd2, 0x60, + 0xe8, 0x0b, 0xd2, 0x60, 0x3c, 0x06, 0xd2, 0x60, 0xf4, 0x0b, 0xd2, 0x60, + 0x50, 0x06, 0xd2, 0x60, 0x10, 0x0c, 0xd2, 0x60, 0x5c, 0x06, 0xd2, 0x60, + 0x24, 0x0c, 0xd2, 0x60, 0x68, 0x06, 0xd2, 0x60, 0x34, 0x0c, 0xd2, 0x60, + 0xa4, 0x06, 0xd2, 0x60, 0x80, 0x0c, 0xd2, 0x60, 0xd8, 0x03, 0xd2, 0x60, + 0x74, 0x09, 0xd2, 0x60, 0xe0, 0x06, 0xd2, 0x60, 0xbc, 0x0c, 0xd2, 0x60, + 0xe8, 0x06, 0xd2, 0x60, 0xc8, 0x0c, 0xd2, 0x60, 0xf0, 0x06, 0xd2, 0x60, + 0xd4, 0x0c, 0xd2, 0x60, 0xf8, 0x06, 0xd2, 0x60, 0xe0, 0x0c, 0xd2, 0x60, + 0xe0, 0x03, 0xd2, 0x60, 0x7c, 0x09, 0xd2, 0x60, 0x30, 0x07, 0xd2, 0x60, + 0x1c, 0x0d, 0xd2, 0x60, 0xf0, 0x07, 0xd2, 0x60, 0xac, 0x0d, 0xd2, 0x60, + 0x18, 0x08, 0xd2, 0x60, 0xd4, 0x0d, 0xd2, 0x60, 0x9c, 0x04, 0xd2, 0x60, + 0x44, 0x0a, 0xd2, 0x60, 0xd0, 0x07, 0xd2, 0x60, 0x88, 0x0d, 0xd2, 0x60, + 0x0c, 0x07, 0xd2, 0x60, 0xf8, 0x0c, 0xd2, 0x60, 0x2c, 0x08, 0xd2, 0x60, + 0xe8, 0x0d, 0xd2, 0x60, 0x34, 0x08, 0xd2, 0x60, 0xf0, 0x0d, 0xd2, 0x60, + 0x3c, 0x08, 0xd2, 0x60, 0xf8, 0x0d, 0xd2, 0x60, 0x40, 0x08, 0xd2, 0x60, + 0xfc, 0x0d, 0xd2, 0x60, 0x48, 0x08, 0xd2, 0x60, 0x04, 0x0e, 0xd2, 0x60, + 0xf0, 0x03, 0xd2, 0x60, 0x8c, 0x09, 0xd2, 0x60, 0x50, 0x04, 0xd2, 0x60, + 0xf4, 0x09, 0xd2, 0x60, 0xa0, 0x04, 0xd2, 0x60, 0x48, 0x0a, 0xd2, 0x60, + 0xa8, 0x04, 0xd2, 0x60, 0x50, 0x0a, 0xd2, 0x60, 0x10, 0x04, 0xd2, 0x60, + 0xb0, 0x09, 0xd2, 0x60, 0x60, 0x04, 0xd2, 0x60, 0x08, 0x0a, 0xd2, 0x60, + 0xec, 0x03, 0xd2, 0x60, 0x88, 0x09, 0xd2, 0x60, 0x94, 0x07, 0xd2, 0x60, + 0x4c, 0x0d, 0xd2, 0x60, 0x98, 0x07, 0xd2, 0x60, 0x50, 0x0d, 0xd2, 0x60, + 0x9c, 0x07, 0xd2, 0x60, 0x54, 0x0d, 0xd2, 0x60, 0xa0, 0x07, 0xd2, 0x60, + 0x58, 0x0d, 0xd2, 0x60, 0xa4, 0x07, 0xd2, 0x60, 0x5c, 0x0d, 0xd2, 0x60, + 0xa8, 0x07, 0xd2, 0x60, 0x60, 0x0d, 0xd2, 0x60, 0xac, 0x07, 0xd2, 0x60, + 0x64, 0x0d, 0xd2, 0x60, 0xb0, 0x07, 0xd2, 0x60, 0x68, 0x0d, 0xd2, 0x60, + 0xb4, 0x07, 0xd2, 0x60, 0x6c, 0x0d, 0xd2, 0x60, 0xc8, 0x05, 0xd2, 0x60, + 0x68, 0x0b, 0xd2, 0x60, 0xe8, 0x03, 0xd2, 0x60, 0x84, 0x09, 0xd2, 0x60, + 0x24, 0x07, 0xd2, 0x60, 0x10, 0x0d, 0xd2, 0x60, 0xc8, 0x07, 0xd2, 0x60, + 0x80, 0x0d, 0xd2, 0x60, 0x54, 0x08, 0xd2, 0x60, 0x10, 0x0e, 0xd2, 0x60, + 0x5c, 0x08, 0xd2, 0x60, 0x18, 0x0e, 0xd2, 0x60, 0x64, 0x08, 0xd2, 0x60, + 0x20, 0x0e, 0xd2, 0x60, 0x6c, 0x08, 0xd2, 0x60, 0x28, 0x0e, 0xd2, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x8c, 0x08, 0xd2, 0x60, 0x44, 0x0e, 0xd2, 0x60, + 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xf1, 0x90, 0x50, 0x81, 0xc5, + 0x90, 0x50, 0xa9, 0xae, 0xd6, 0xf0, 0xc8, 0x81, 0xf1, 0x89, 0xad, 0xd0, + 0xc4, 0xd6, 0xf1, 0x90, 0x58, 0x81, 0xc5, 0xc4, 0xd6, 0xf0, 0xc8, 0xfd, + 0x55, 0x85, 0x95, 0xad, 0xd6, 0xfe, 0x56, 0xd0, 0xd6, 0x90, 0x50, 0xad, + 0xae, 0xd0, 0xd6, 0xf5, 0xd6, 0x90, 0xae, 0x56, 0xd0, 0xd6, 0xf0, 0xfe, + 0x56, 0x86, 0xc5, 0xc6, 0xce, 0xc4, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, + 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xd6, 0xf0, 0x90, 0xad, 0xae, 0x56, 0xd0, + 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0x91, 0xc5, 0xfe, 0x56, 0xd6, 0xf5, 0xd6, + 0xd0, 0xd0, 0xa5, 0xc8, 0xad, 0xd0, 0xd0, 0xa5, 0xc8, 0xad, 0xd0, 0xd0, + 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xd6, 0xf1, 0x90, 0x58, 0x81, 0xc5, + 0xc4, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xd3, 0xcd, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0xf5, 0x90, 0xae, 0x56, 0xd6, 0xd0, 0x58, 0xad, 0xae, 0xd6, + 0xd0, 0xc4, 0xc6, 0x00, 0xce, 0xd6, 0x90, 0xae, 0x56, 0xd0, 0xc6, 0x00, + 0xce, 0x55, 0xc4, 0xc6, 0xce, 0x55, 0xc4, 0xc6, 0xce, 0x55, 0xc4, 0xc6, + 0xce, 0x55, 0xc4, 0xc6, 0xce, 0x55, 0xc4, 0xc6, 0xce, 0xd6, 0x90, 0x50, + 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf0, 0xc8, + 0xf9, 0x51, 0x81, 0xf1, 0x89, 0xad, 0xfe, 0x56, 0xd0, 0xf1, 0x90, 0x50, + 0x81, 0xc5, 0xc6, 0x00, 0xce, 0xd6, 0xf1, 0x90, 0x50, 0xaa, 0x81, 0x92, + 0xc8, 0x81, 0xc5, 0xc6, 0xce, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0x90, + 0x50, 0xa9, 0xae, 0xd6, 0xf0, 0xc8, 0x81, 0xf1, 0x89, 0xad, 0xd0, 0xd6, + 0x90, 0xae, 0x5e, 0xad, 0xd0, 0xd6, 0xfe, 0x56, 0xd0, 0xd6, 0x90, 0xf8, + 0xad, 0xae, 0xd0, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, 0xf5, 0x90, + 0x50, 0xae, 0xd6, 0xd0, 0xad, 0xd6, 0xd0, 0xc4, 0xd6, 0xf1, 0x90, 0x58, + 0x81, 0xc5, 0xc4, 0xd3, 0xcd, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x90, 0x50, + 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xc6, + 0xce, 0xd6, 0xf5, 0x90, 0x50, 0xae, 0xd6, 0xd0, 0xd6, 0xf1, 0x90, 0x58, + 0x81, 0xc5, 0xd6, 0x90, 0x50, 0xa9, 0xf0, 0x91, 0x81, 0xc5, 0xd6, 0x90, + 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0x90, 0x50, 0xa9, 0xae, 0xf0, 0xc8, 0x81, + 0xf1, 0x89, 0xad, 0xd0, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, 0x90, + 0xad, 0xae, 0x56, 0xd0, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, 0x00, 0x00, + 0xce, 0xcf, 0xc6, 0x00, 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, + 0xce, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xad, + 0xae, 0xfe, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xfd, 0x55, 0xd6, 0xf0, + 0xc8, 0x85, 0x95, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xcd, 0x90, 0xad, 0xae, + 0x5e, 0xd6, 0xd0, 0xcd, 0x90, 0xaa, 0xd6, 0xea, 0xd6, 0xf0, 0xc8, 0xad, + 0xfe, 0x56, 0xd6, 0xd0, 0x90, 0xad, 0xaa, 0x5a, 0xd6, 0xf0, 0xa9, 0xc8, + 0x81, 0x82, 0xae, 0xd6, 0xd0, 0x90, 0xa9, 0x59, 0xd6, 0xf2, 0xa2, 0xc8, + 0x91, 0x81, 0x82, 0xc5, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0xa9, 0x59, + 0xd6, 0xf2, 0xa2, 0xc8, 0x91, 0x81, 0x82, 0xc5, 0x90, 0x60, 0xaa, 0xd6, + 0xea, 0xd6, 0xf0, 0xc8, 0xad, 0xd6, 0xf0, 0xa9, 0xc8, 0x81, 0xa9, 0x90, + 0x58, 0x81, 0xae, 0xd6, 0xd0, 0xd6, 0x90, 0x58, 0xad, 0xf0, 0xc8, 0x85, + 0x95, 0xad, 0x90, 0xae, 0x5e, 0xd6, 0xd0, 0xcd, 0x90, 0x58, 0xad, 0xae, + 0xd6, 0xd0, 0xcd, 0xd6, 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xd6, 0x90, 0x50, + 0xad, 0xae, 0xd0, 0xd6, 0xf5, 0x90, 0x50, 0x8d, 0xd6, 0xe8, 0xc6, 0x00, + 0xce, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf1, 0x90, + 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0x56, + 0xf1, 0xa1, 0xc8, 0x86, 0x96, 0xaa, 0xa1, 0x86, 0x82, 0xc5, 0xc6, 0x00, + 0xce, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0x56, 0xf1, 0xa1, 0xc8, 0x86, + 0x96, 0xaa, 0xa1, 0x86, 0x82, 0xc5, 0xc6, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x90, 0xf8, + 0xad, 0xae, 0xd0, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xd6, 0xae, 0xfe, + 0xfd, 0xd0, 0xd6, 0xae, 0x56, 0x55, 0xd0, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xd3, 0xcd, 0xc6, 0xce, 0x90, 0xaa, 0x5a, 0xab, 0x53, 0xac, 0x54, + 0xd6, 0xf1, 0xa1, 0x82, 0x92, 0xad, 0xa1, 0x83, 0x93, 0xc8, 0x85, 0xad, + 0xd6, 0xf0, 0x84, 0x94, 0xc8, 0x85, 0xad, 0xc5, 0xa2, 0xc5, 0xc6, 0x00, + 0xce, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0xf0, 0xc8, 0xad, 0xd6, + 0x90, 0xae, 0x56, 0xd0, 0xd6, 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0xad, 0xae, + 0x56, 0xd0, 0xaa, 0xc6, 0xce, 0xd6, 0xf1, 0x90, 0x58, 0x58, 0x81, 0xa9, + 0xc5, 0x90, 0x58, 0x58, 0x91, 0xc5, 0xc4, 0xc6, 0xce, 0x90, 0xae, 0xad, + 0x5d, 0x56, 0xd6, 0xd0, 0xd6, 0xf1, 0xd6, 0xf0, 0xc8, 0x89, 0xf9, 0x51, + 0x81, 0xc5, 0xc6, 0x00, 0xce, 0xd6, 0xc1, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0xd6, 0xf1, 0xd6, 0xf0, 0xc8, + 0x89, 0xf9, 0x51, 0x81, 0xc5, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xc1, 0xc4, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xc1, 0xc0, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xd6, 0xc1, 0xc0, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xf1, 0xd6, + 0xf0, 0xc8, 0x89, 0xf9, 0x51, 0x81, 0xc5, 0xd6, 0x90, 0xad, 0xae, 0x56, + 0xd0, 0xc0, 0xc6, 0x00, 0xce, 0xd6, 0xc1, 0xc1, 0x90, 0x50, 0xad, 0xae, + 0xd6, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0xc1, 0x90, 0xad, 0xae, 0x56, 0xd6, + 0xd0, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x51, 0x53, 0x0b, 0x59, 0x0b, 0xd6, + 0xc1, 0xc1, 0xc1, 0xcd, 0xd6, 0xc1, 0xfa, 0x52, 0xd6, 0xea, 0xd6, 0x90, + 0x58, 0xad, 0xae, 0xd0, 0xcd, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0x90, + 0x58, 0xad, 0xd6, 0xf0, 0xc8, 0x85, 0x95, 0xad, 0x90, 0x58, 0xae, 0xd6, + 0xd0, 0xcd, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0x58, 0xad, 0xae, 0xd6, + 0xd0, 0xcd, 0xc6, 0x00, 0xce, 0x90, 0x58, 0x58, 0xad, 0xd6, 0xf0, 0xc8, + 0x85, 0x95, 0xad, 0x90, 0x58, 0x58, 0xae, 0xd6, 0xd0, 0xcd, 0x90, 0xad, + 0x58, 0xae, 0xd6, 0xd0, 0xd6, 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xd6, 0x90, + 0x50, 0xad, 0xae, 0xd0, 0xd6, 0xc1, 0xc1, 0xc1, 0xd6, 0x51, 0x53, 0x0b, + 0x59, 0x0b, 0xcd, 0xd6, 0x90, 0xad, 0x58, 0xae, 0xd0, 0x90, 0xd6, 0xe8, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x56, 0xd6, 0x4e, 0xc4, 0xc6, 0x00, 0x00, + 0xce, 0x56, 0x90, 0xd6, 0x4e, 0x48, 0xc6, 0x00, 0xce, 0xd6, 0x99, 0x90, + 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0x99, 0x90, 0x50, 0x59, 0x81, 0x51, + 0x89, 0x48, 0xd3, 0xcd, 0xd6, 0xf0, 0x58, 0xe8, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xd6, 0xf4, 0xfa, 0x52, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc8, 0xab, + 0x8a, 0xaa, 0xa3, 0xc8, 0x8a, 0x84, 0xd6, 0xe8, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xd6, 0xf2, 0x90, 0x50, 0x8a, 0xd6, 0xe8, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x90, 0xac, 0xad, 0xaf, 0x57, 0xae, 0xfe, 0xab, 0x53, 0xaa, 0xfa, + 0xd6, 0xf0, 0x86, 0xc8, 0x7f, 0xfe, 0x56, 0x6e, 0xae, 0xe6, 0xa9, 0x82, + 0xc8, 0xac, 0xa1, 0x83, 0x7c, 0xad, 0x90, 0x50, 0x6e, 0xae, 0xe6, 0xa9, + 0x82, 0xc8, 0xac, 0xa1, 0x83, 0x7c, 0x6d, 0xad, 0x90, 0x50, 0x6e, 0xae, + 0xe6, 0xa9, 0x82, 0xc8, 0xac, 0xa1, 0x83, 0x7c, 0x6d, 0xa9, 0x90, 0x50, + 0x79, 0xaa, 0x51, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, + 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, + 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, + 0x81, 0xc5, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0x90, 0xf8, 0xad, 0xae, 0xd6, 0xd0, 0x90, + 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, 0x00, 0x00, 0xce, 0x90, 0x50, 0xad, + 0xae, 0xd6, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0x58, 0xad, 0xae, 0xd0, 0xd6, + 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf0, 0xc8, + 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0x90, 0xad, 0x56, 0xfe, 0xd6, 0xd0, 0xc6, + 0xce, 0xd6, 0x90, 0xaa, 0x52, 0x58, 0x58, 0xad, 0xae, 0xd0, 0xd6, 0xf0, + 0x82, 0x92, 0xc5, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0xa2, 0xad, + 0xae, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, + 0xd0, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xd6, + 0x90, 0xad, 0xae, 0x56, 0xd0, 0x56, 0xf0, 0x86, 0xc5, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xad, + 0xae, 0x56, 0xd0, 0xc6, 0xce, 0xc4, 0xc4, 0xc6, 0xce, 0xd6, 0x90, 0x50, + 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xc4, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, + 0xce, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0xc6, 0xce, 0x90, 0xad, 0xae, + 0x56, 0xd6, 0xd0, 0xc6, 0xce, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, + 0xce, 0x90, 0x50, 0xae, 0xc8, 0xa9, 0xd6, 0xf0, 0x81, 0x91, 0xc8, 0xad, + 0xd0, 0xc6, 0x00, 0x00, 0xce, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, + 0xce, 0xc6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x20, 0x00, 0x18, 0x30, + 0x14, 0x30, 0x00, 0x10, 0x13, 0x10, 0x00, 0x02, 0x00, 0x18, 0x30, 0x02, + 0x18, 0x30, 0x18, 0x30, 0x32, 0x02, 0x00, 0x14, 0x30, 0x28, 0x3a, 0x02, + 0x00, 0x14, 0x30, 0x10, 0x00, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x08, 0x00, 0x07, 0x00, 0x00, 0x30, 0x34, 0x00, 0x02, 0x00, + 0x2c, 0x30, 0x03, 0x00, 0x03, 0x00, 0x58, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x00, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x41, 0x06, + 0x00, 0x00, 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x30, 0x34, 0x00, 0x03, 0x00, 0x58, 0x00, 0x03, 0x00, 0x58, 0x00, 0x02, + 0x00, 0x2c, 0x30, 0x00, 0x00, 0x02, 0x00, 0x27, 0x00, 0x00, 0xff, 0x03, + 0x02, 0x00, 0x28, 0x30, 0x0d, 0x00, 0x50, 0x00, 0x8c, 0x00, 0x36, 0x60, + 0x00, 0x9c, 0x00, 0x36, 0x70, 0x00, 0xac, 0x00, 0x02, 0x00, 0x20, 0x30, + 0x08, 0x00, 0x06, 0x02, 0x00, 0x14, 0x30, 0x31, 0x33, 0x02, 0x00, 0x20, + 0x00, 0x18, 0x30, 0x45, 0x00, 0x0a, 0x40, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x20, 0x30, 0x07, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x68, 0x00, + 0x39, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x07, 0x00, 0x20, 0x30, + 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x03, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x08, 0x00, 0x20, 0x30, + 0x00, 0x01, 0x02, 0x00, 0x08, 0x00, 0x20, 0x30, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x18, 0x30, 0x01, 0x00, + 0x00, 0x08, 0x00, 0x18, 0x30, 0x00, 0x00, 0x08, 0x00, 0x18, 0x30, 0x14, + 0x30, 0x00, 0x10, 0x13, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x20, + 0x38, 0x49, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, 0x02, 0x00, 0x14, 0x30, + 0x80, 0x00, 0x02, 0x00, 0x18, 0x30, 0x02, 0x18, 0x30, 0x18, 0x30, 0x02, + 0x00, 0x18, 0x30, 0x02, 0x00, 0xff, 0x3f, 0xc0, 0xff, 0x20, 0x30, 0x04, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0x00, 0x08, 0x00, 0x14, 0x30, 0x0e, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x18, 0x30, 0x0e, 0x00, 0x00, + 0x00, 0x32, 0x02, 0x00, 0x14, 0x30, 0x28, 0x3a, 0x46, 0x00, 0x0a, 0x40, + 0x00, 0x01, 0x02, 0x00, 0x04, 0x00, 0x18, 0x30, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x00, 0x00, 0x20, 0x00, 0x4a, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x18, 0x30, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x31, 0x02, 0x00, 0x20, 0x00, 0x18, 0x30, 0x33, 0x04, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x18, 0x30, 0x01, 0x18, 0x30, 0x18, + 0x30, 0x02, 0x00, 0x10, 0x00, 0x14, 0x30, 0x02, 0x00, 0x04, 0x00, 0x18, + 0x30, 0x00, 0x40, 0x14, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x20, 0x00, 0x14, 0x30, 0x00, 0x01, 0x02, 0x00, + 0x20, 0x00, 0x14, 0x30, 0x00, 0x01, 0x06, 0x00, 0x00, 0x01, 0x08, 0x00, + 0x07, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x30, 0x34, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x14, 0x30, 0x39, 0x00, 0x00, 0x02, 0x00, 0x04, + 0x00, 0x14, 0x00, 0x34, 0x01, 0x03, 0x00, 0x18, 0x00, 0x32, 0x00, 0x03, + 0x00, 0x1c, 0x00, 0x0b, 0x00, 0x84, 0x0d, 0x0b, 0x00, 0x00, 0x00, 0x08, + 0x02, 0x00, 0x14, 0x30, 0x03, 0x00, 0x58, 0x00, 0x3f, 0x0b, 0x00, 0x84, + 0x0d, 0x02, 0x00, 0x2c, 0x30, 0x3f, 0x26, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x2c, 0x30, 0x3f, 0x27, 0x03, 0x00, 0x1c, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x35, 0x03, 0x00, 0x58, 0x00, 0x3f, 0x0b, 0x00, 0x84, 0x0d, 0x02, 0x00, + 0x14, 0x30, 0x38, 0x04, 0x00, 0x14, 0x00, 0x08, 0x00, 0x03, 0x00, 0x18, + 0x00, 0x34, 0x01, 0x06, 0x00, 0x00, 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, + 0x30, 0x34, 0x00, 0x02, 0x00, 0x2c, 0x30, 0x20, 0x00, 0x03, 0x00, 0x58, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0x02, 0x00, + 0x26, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0x02, 0x00, + 0x27, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x80, 0x00, 0x14, 0x30, + 0x00, 0x02, 0x14, 0x30, 0x01, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x80, 0x00, 0x14, 0x30, 0x00, 0x02, 0x14, 0x30, 0x01, 0x3d, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x03, 0x00, 0x10, 0x11, 0x24, 0x00, 0x06, 0x00, 0x01, 0x01, + 0x08, 0x00, 0x07, 0x00, 0x00, 0x30, 0x00, 0x10, 0x34, 0x00, 0x02, 0x00, + 0x00, 0x04, 0x00, 0x04, 0x14, 0x30, 0x15, 0x00, 0x00, 0x01, 0x14, 0x00, + 0x10, 0xe7, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, + 0x48, 0x00, 0x3e, 0x04, 0x00, 0x64, 0x00, 0x36, 0x55, 0x15, 0x00, 0x00, + 0x00, 0x01, 0x03, 0x00, 0x10, 0x11, 0x24, 0x00, 0x02, 0x00, 0x30, 0x30, + 0x38, 0x06, 0x00, 0x01, 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, 0x30, 0x34, + 0x00, 0x02, 0x00, 0x00, 0x04, 0x14, 0x30, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x2e, 0x2d, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, + 0x02, 0x00, 0x14, 0x30, 0x03, 0x00, 0x18, 0x00, 0x02, 0x00, 0x30, 0x30, + 0x01, 0x00, 0x00, 0x03, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, + 0x0f, 0x80, 0x02, 0x02, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, + 0x02, 0x00, 0x14, 0x30, 0x03, 0x00, 0x18, 0x00, 0x02, 0x00, 0x30, 0x30, + 0x01, 0x00, 0x00, 0x03, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, + 0x0f, 0x80, 0x02, 0x02, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, + 0x33, 0x80, 0x30, 0x3c, 0x00, 0x80, 0x01, 0x00, 0x00, 0x01, 0x07, 0x00, + 0x33, 0x80, 0x24, 0x3c, 0x00, 0x80, 0x04, 0x00, 0x00, 0x01, 0x03, 0x00, + 0x18, 0x00, 0x02, 0x00, 0x30, 0x30, 0x01, 0x00, 0x00, 0x03, 0x00, 0x31, + 0x02, 0x00, 0x03, 0x00, 0x14, 0x30, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x07, 0x00, 0x33, 0x80, 0x00, 0x83, 0x0f, 0x80, 0x00, 0x02, + 0x00, 0x03, 0x03, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, + 0x33, 0x80, 0x34, 0x3c, 0x00, 0x03, 0x03, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x08, 0x00, 0x3a, 0x00, 0x01, 0x00, 0x07, 0x00, 0x30, 0x80, + 0x0a, 0x0b, 0x30, 0x80, 0x08, 0x0b, 0x30, 0x80, 0x00, 0x0b, 0xec, 0x01, + 0x08, 0x00, 0x00, 0x80, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, + 0x1c, 0x00, 0x0b, 0x00, 0x84, 0x0d, 0x0a, 0x00, 0x0d, 0x00, 0x00, 0x80, + 0x04, 0x00, 0x02, 0x00, 0x14, 0x30, 0x38, 0x04, 0x00, 0x14, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x30, 0x00, 0x00, 0x80, 0x03, 0x00, 0x18, 0x00, 0xc5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x39, 0x04, + 0x00, 0x14, 0x00, 0xc5, 0x00, 0x03, 0x00, 0x18, 0x00, 0x0d, 0x00, 0x00, + 0x80, 0x04, 0x00, 0x04, 0x00, 0x30, 0x00, 0x00, 0x80, 0x07, 0x00, 0x30, + 0x80, 0x08, 0x0b, 0x30, 0x80, 0x0a, 0x0b, 0x30, 0x80, 0x0b, 0x0b, 0x08, + 0x00, 0x3a, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x0b, 0x00, 0x84, 0x0d, 0x03, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x09, 0x00, 0xe1, 0x68, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x09, 0x00, 0xe1, 0x68, + 0xe1, 0x68, 0x00, 0x00, 0x00, 0x05, 0x09, 0x00, 0xe1, 0x68, 0x80, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x05, 0x09, 0x00, 0xe1, 0x68, 0x3f, 0x00, + 0x80, 0x00, 0xe1, 0x68, 0x37, 0x00, 0x43, 0x40, 0x02, 0x00, 0x24, 0x30, + 0x24, 0x30, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0xff, 0xff, + 0x00, 0x01, 0x02, 0x00, 0x18, 0x30, 0x20, 0x00, 0x3c, 0x3f, 0x03, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0x30, 0x00, + 0x03, 0x00, 0x58, 0x00, 0x00, 0x01, 0x3c, 0x00, 0x00, 0x80, 0xff, 0x03, + 0x00, 0x40, 0x0d, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x50, 0x00, 0x22, + 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x01, 0x00, 0x01, 0x00, 0x33, 0x54, + 0x34, 0x53, 0x35, 0x52, 0x36, 0x51, 0x37, 0x50, 0x38, 0x4f, 0x39, 0x4e, + 0x3a, 0x4d, 0x3b, 0x4c, 0x00, 0x01, 0x20, 0x00, 0x00, 0x01, 0x40, 0x00, + 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, + 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x10, + 0x00, 0x01, 0x00, 0x20, 0x00, 0x01, 0x00, 0x40, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, + 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x04, 0x00, 0x14, 0x00, 0x06, 0x00, + 0x00, 0x01, 0x08, 0x00, 0x00, 0x01, 0x0b, 0x00, 0x80, 0x0d, 0x08, 0x00, + 0xff, 0x00, 0xff, 0x02, 0x00, 0x18, 0x30, 0xff, 0x00, 0xff, 0x00, 0x0b, + 0x00, 0x80, 0x0d, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x14, 0x00, + 0x02, 0x00, 0x14, 0x30, 0x16, 0x06, 0x00, 0x00, 0x01, 0x08, 0x00, 0x02, + 0x00, 0x14, 0x30, 0x00, 0x00, 0x01, 0x02, 0x00, 0x18, 0x30, 0x38, 0xff, + 0x00, 0xff, 0x00, 0x0b, 0x00, 0x80, 0x0d, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x00, 0x01, 0x17, 0x02, 0x00, 0x00, 0x01, 0x14, 0x30, 0x20, + 0x00, 0x18, 0x30, 0x3e, 0x00, 0x01, 0x0c, 0x00, 0x20, 0x00, 0x04, 0x00, + 0x00, 0x01, 0x0c, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x01, 0x43, 0x40, + 0x00, 0x01, 0x02, 0x00, 0x04, 0x00, 0x14, 0x30, 0x00, 0x01, 0x41, 0x02, + 0x00, 0x04, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, + 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x00, 0x02, 0x02, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x08, 0x00, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x10, 0x00, + 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x00, 0x20, 0x01, 0x02, 0x00, 0x14, + 0x30, 0x3f, 0x14, 0x30, 0x00, 0x01, 0x00, 0x20, 0x02, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3a, 0xae, 0x2b, 0x16, + 0x00, 0x00, 0xe2, 0x60, 0x10, 0x00, 0xe2, 0x60, 0x62, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x03, 0xe2, 0x60, 0x90, 0x08, 0xe2, 0x60, + 0x68, 0x03, 0xe2, 0x60, 0xdc, 0x08, 0xe2, 0x60, 0x04, 0x04, 0xe2, 0x60, + 0xa4, 0x09, 0xe2, 0x60, 0x58, 0x04, 0xe2, 0x60, 0xfc, 0x09, 0xe2, 0x60, + 0x88, 0x05, 0xe2, 0x60, 0x2c, 0x0b, 0xe2, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xac, 0x03, 0xe2, 0x60, 0x30, 0x09, 0xe2, 0x60, + 0xbc, 0x03, 0xe2, 0x60, 0x44, 0x09, 0xe2, 0x60, 0xc4, 0x03, 0xe2, 0x60, + 0x4c, 0x09, 0xe2, 0x60, 0xc8, 0x03, 0xe2, 0x60, 0x54, 0x09, 0xe2, 0x60, + 0xcc, 0x03, 0xe2, 0x60, 0x5c, 0x09, 0xe2, 0x60, 0xd0, 0x03, 0xe2, 0x60, + 0x64, 0x09, 0xe2, 0x60, 0xd4, 0x03, 0xe2, 0x60, 0x6c, 0x09, 0xe2, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x08, 0xe2, 0x60, + 0x30, 0x0e, 0xe2, 0x60, 0x84, 0x08, 0xe2, 0x60, 0x3c, 0x0e, 0xe2, 0x60, + 0xb8, 0x07, 0xe2, 0x60, 0x70, 0x0d, 0xe2, 0x60, 0xa8, 0x05, 0xe2, 0x60, + 0x54, 0x0b, 0xe2, 0x60, 0xa4, 0x05, 0xe2, 0x60, 0x4c, 0x0b, 0xe2, 0x60, + 0xe0, 0x07, 0xe2, 0x60, 0x94, 0x0d, 0xe2, 0x60, 0x0c, 0x08, 0xe2, 0x60, + 0xc4, 0x0d, 0xe2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0x04, 0xe2, 0x60, 0x58, 0x0a, 0xe2, 0x60, 0xf8, 0x04, 0xe2, 0x60, + 0xa4, 0x0a, 0xe2, 0x60, 0x7c, 0x05, 0xe2, 0x60, 0x20, 0x0b, 0xe2, 0x60, + 0x80, 0x05, 0xe2, 0x60, 0x24, 0x0b, 0xe2, 0x60, 0x84, 0x05, 0xe2, 0x60, + 0x28, 0x0b, 0xe2, 0x60, 0x44, 0x05, 0xe2, 0x60, 0xe8, 0x0a, 0xe2, 0x60, + 0x4c, 0x05, 0xe2, 0x60, 0xf4, 0x0a, 0xe2, 0x60, 0x54, 0x05, 0xe2, 0x60, + 0x00, 0x0b, 0xe2, 0x60, 0x68, 0x05, 0xe2, 0x60, 0x10, 0x0b, 0xe2, 0x60, + 0xe4, 0x05, 0xe2, 0x60, 0x88, 0x0b, 0xe2, 0x60, 0xf4, 0x05, 0xe2, 0x60, + 0x94, 0x0b, 0xe2, 0x60, 0x08, 0x06, 0xe2, 0x60, 0xac, 0x0b, 0xe2, 0x60, + 0x10, 0x06, 0xe2, 0x60, 0xb8, 0x0b, 0xe2, 0x60, 0x24, 0x06, 0xe2, 0x60, + 0xd0, 0x0b, 0xe2, 0x60, 0x2c, 0x06, 0xe2, 0x60, 0xdc, 0x0b, 0xe2, 0x60, + 0x34, 0x06, 0xe2, 0x60, 0xe8, 0x0b, 0xe2, 0x60, 0x3c, 0x06, 0xe2, 0x60, + 0xf4, 0x0b, 0xe2, 0x60, 0x50, 0x06, 0xe2, 0x60, 0x10, 0x0c, 0xe2, 0x60, + 0x5c, 0x06, 0xe2, 0x60, 0x24, 0x0c, 0xe2, 0x60, 0x68, 0x06, 0xe2, 0x60, + 0x34, 0x0c, 0xe2, 0x60, 0xa4, 0x06, 0xe2, 0x60, 0x80, 0x0c, 0xe2, 0x60, + 0xd8, 0x03, 0xe2, 0x60, 0x74, 0x09, 0xe2, 0x60, 0xe0, 0x06, 0xe2, 0x60, + 0xbc, 0x0c, 0xe2, 0x60, 0xe8, 0x06, 0xe2, 0x60, 0xc8, 0x0c, 0xe2, 0x60, + 0xf0, 0x06, 0xe2, 0x60, 0xd4, 0x0c, 0xe2, 0x60, 0xf8, 0x06, 0xe2, 0x60, + 0xe0, 0x0c, 0xe2, 0x60, 0xe0, 0x03, 0xe2, 0x60, 0x7c, 0x09, 0xe2, 0x60, + 0x30, 0x07, 0xe2, 0x60, 0x1c, 0x0d, 0xe2, 0x60, 0xf0, 0x07, 0xe2, 0x60, + 0xac, 0x0d, 0xe2, 0x60, 0x18, 0x08, 0xe2, 0x60, 0xd4, 0x0d, 0xe2, 0x60, + 0x9c, 0x04, 0xe2, 0x60, 0x44, 0x0a, 0xe2, 0x60, 0xd0, 0x07, 0xe2, 0x60, + 0x88, 0x0d, 0xe2, 0x60, 0x0c, 0x07, 0xe2, 0x60, 0xf8, 0x0c, 0xe2, 0x60, + 0x2c, 0x08, 0xe2, 0x60, 0xe8, 0x0d, 0xe2, 0x60, 0x34, 0x08, 0xe2, 0x60, + 0xf0, 0x0d, 0xe2, 0x60, 0x3c, 0x08, 0xe2, 0x60, 0xf8, 0x0d, 0xe2, 0x60, + 0x40, 0x08, 0xe2, 0x60, 0xfc, 0x0d, 0xe2, 0x60, 0x48, 0x08, 0xe2, 0x60, + 0x04, 0x0e, 0xe2, 0x60, 0xf0, 0x03, 0xe2, 0x60, 0x8c, 0x09, 0xe2, 0x60, + 0x50, 0x04, 0xe2, 0x60, 0xf4, 0x09, 0xe2, 0x60, 0xa0, 0x04, 0xe2, 0x60, + 0x48, 0x0a, 0xe2, 0x60, 0xa8, 0x04, 0xe2, 0x60, 0x50, 0x0a, 0xe2, 0x60, + 0x10, 0x04, 0xe2, 0x60, 0xb0, 0x09, 0xe2, 0x60, 0x60, 0x04, 0xe2, 0x60, + 0x08, 0x0a, 0xe2, 0x60, 0xec, 0x03, 0xe2, 0x60, 0x88, 0x09, 0xe2, 0x60, + 0x94, 0x07, 0xe2, 0x60, 0x4c, 0x0d, 0xe2, 0x60, 0x98, 0x07, 0xe2, 0x60, + 0x50, 0x0d, 0xe2, 0x60, 0x9c, 0x07, 0xe2, 0x60, 0x54, 0x0d, 0xe2, 0x60, + 0xa0, 0x07, 0xe2, 0x60, 0x58, 0x0d, 0xe2, 0x60, 0xa4, 0x07, 0xe2, 0x60, + 0x5c, 0x0d, 0xe2, 0x60, 0xa8, 0x07, 0xe2, 0x60, 0x60, 0x0d, 0xe2, 0x60, + 0xac, 0x07, 0xe2, 0x60, 0x64, 0x0d, 0xe2, 0x60, 0xb0, 0x07, 0xe2, 0x60, + 0x68, 0x0d, 0xe2, 0x60, 0xb4, 0x07, 0xe2, 0x60, 0x6c, 0x0d, 0xe2, 0x60, + 0xc8, 0x05, 0xe2, 0x60, 0x68, 0x0b, 0xe2, 0x60, 0xe8, 0x03, 0xe2, 0x60, + 0x84, 0x09, 0xe2, 0x60, 0x24, 0x07, 0xe2, 0x60, 0x10, 0x0d, 0xe2, 0x60, + 0xc8, 0x07, 0xe2, 0x60, 0x80, 0x0d, 0xe2, 0x60, 0x54, 0x08, 0xe2, 0x60, + 0x10, 0x0e, 0xe2, 0x60, 0x5c, 0x08, 0xe2, 0x60, 0x18, 0x0e, 0xe2, 0x60, + 0x64, 0x08, 0xe2, 0x60, 0x20, 0x0e, 0xe2, 0x60, 0x6c, 0x08, 0xe2, 0x60, + 0x28, 0x0e, 0xe2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x08, 0xe2, 0x60, + 0x44, 0x0e, 0xe2, 0x60, 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xf1, + 0x90, 0x50, 0x81, 0xc5, 0x90, 0x50, 0xa9, 0xae, 0xd6, 0xf0, 0xc8, 0x81, + 0xf1, 0x89, 0xad, 0xd0, 0xc4, 0xd6, 0xf1, 0x90, 0x58, 0x81, 0xc5, 0xc4, + 0xd6, 0xf0, 0xc8, 0xfd, 0x55, 0x85, 0x95, 0xad, 0xd6, 0xfe, 0x56, 0xd0, + 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, 0xf5, 0xd6, 0x90, 0xae, 0x56, + 0xd0, 0xd6, 0xf0, 0xfe, 0x56, 0x86, 0xc5, 0xc6, 0xce, 0xc4, 0xd6, 0x90, + 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xd6, 0xf0, 0x90, + 0xad, 0xae, 0x56, 0xd0, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0x91, 0xc5, 0xfe, + 0x56, 0xd6, 0xf5, 0xd6, 0xd0, 0xd0, 0xa5, 0xc8, 0xad, 0xd0, 0xd0, 0xa5, + 0xc8, 0xad, 0xd0, 0xd0, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xd6, 0xf1, + 0x90, 0x58, 0x81, 0xc5, 0xc4, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xd3, + 0xcd, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf5, 0x90, 0xae, 0x56, 0xd6, 0xd0, + 0x58, 0xad, 0xae, 0xd6, 0xd0, 0xc4, 0xc6, 0x00, 0xce, 0xd6, 0x90, 0xae, + 0x56, 0xd0, 0xc6, 0x00, 0xce, 0x55, 0xc4, 0xc6, 0xce, 0x55, 0xc4, 0xc6, + 0xce, 0x55, 0xc4, 0xc6, 0xce, 0x55, 0xc4, 0xc6, 0xce, 0x55, 0xc4, 0xc6, + 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xad, + 0xae, 0x56, 0xd0, 0xc6, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0xf0, 0xc8, 0xf9, 0x51, 0x81, 0xf1, 0x89, 0xad, 0xfe, 0x56, + 0xd0, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xc6, 0x00, 0xce, 0xd6, 0xf1, 0x90, + 0x50, 0xaa, 0x81, 0x92, 0xc8, 0x81, 0xc5, 0xc6, 0xce, 0x90, 0x50, 0xad, + 0xae, 0xd6, 0xd0, 0x90, 0x50, 0xa9, 0xae, 0xd6, 0xf0, 0xc8, 0x81, 0xf1, + 0x89, 0xad, 0xd0, 0xd6, 0x90, 0xae, 0x5e, 0xad, 0xd0, 0xd6, 0xfe, 0x56, + 0xd0, 0xd6, 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xd6, 0x90, 0x50, 0xad, 0xae, + 0xd0, 0xd6, 0xf5, 0x90, 0x50, 0xae, 0xd6, 0xd0, 0xad, 0xd6, 0xd0, 0xc4, + 0xd6, 0xf1, 0x90, 0x58, 0x81, 0xc5, 0xc4, 0xd3, 0xcd, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xd6, 0xf0, 0xf9, + 0x51, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf5, 0x90, 0x50, 0xae, 0xd6, 0xd0, + 0xd6, 0xf1, 0x90, 0x58, 0x81, 0xc5, 0xd6, 0x90, 0x50, 0xa9, 0xf0, 0x91, + 0x81, 0xc5, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0x90, 0x50, 0xa9, + 0xae, 0xf0, 0xc8, 0x81, 0xf1, 0x89, 0xad, 0xd0, 0xd6, 0x90, 0x50, 0xad, + 0xae, 0xd0, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0x90, 0xad, 0xae, 0x56, + 0xd0, 0xc6, 0x00, 0x00, 0xce, 0xcf, 0xc6, 0x00, 0xce, 0xd6, 0x90, 0x50, + 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, + 0xce, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, + 0xfd, 0x55, 0xd6, 0xf0, 0xc8, 0x85, 0x95, 0xad, 0xfe, 0x56, 0xd6, 0xd0, + 0xcd, 0x90, 0xad, 0xae, 0x5e, 0xd6, 0xd0, 0xcd, 0x90, 0xaa, 0xd6, 0xea, + 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0x90, 0xad, 0xaa, 0x5a, + 0xd6, 0xf0, 0xa9, 0xc8, 0x81, 0x82, 0xae, 0xd6, 0xd0, 0x90, 0xa9, 0x59, + 0xd6, 0xf2, 0xa2, 0xc8, 0x91, 0x81, 0x82, 0xc5, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x90, 0xa9, 0x59, 0xd6, 0xf2, 0xa2, 0xc8, 0x91, 0x81, 0x82, 0xc5, + 0x90, 0x60, 0xaa, 0xd6, 0xea, 0xd6, 0xf0, 0xc8, 0xad, 0xd6, 0xf0, 0xa9, + 0xc8, 0x81, 0xa9, 0x90, 0x58, 0x81, 0xae, 0xd6, 0xd0, 0xd6, 0x90, 0x58, + 0xad, 0xf0, 0xc8, 0x85, 0x95, 0xad, 0x90, 0xae, 0x5e, 0xd6, 0xd0, 0xcd, + 0x90, 0x58, 0xad, 0xae, 0xd6, 0xd0, 0xcd, 0xd6, 0x90, 0xf8, 0xad, 0xae, + 0xd0, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, 0xf5, 0x90, 0x50, 0x8d, + 0xd6, 0xe8, 0xc6, 0x00, 0xce, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xc6, + 0xce, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0x90, 0x50, + 0xad, 0xae, 0xd0, 0x56, 0xf1, 0xa1, 0xc8, 0x86, 0x96, 0xaa, 0xa1, 0x86, + 0x82, 0xc5, 0xc6, 0x00, 0xce, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0x56, + 0xf1, 0xa1, 0xc8, 0x86, 0x96, 0xaa, 0xa1, 0x86, 0x82, 0xc5, 0xc6, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xd6, 0x90, 0xad, 0xae, 0x56, + 0xd0, 0xd6, 0xae, 0xfe, 0xfd, 0xd0, 0xd6, 0xae, 0x56, 0x55, 0xd0, 0xc4, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd3, 0xcd, 0xc6, 0xce, 0x90, 0xaa, 0x5a, + 0xab, 0x53, 0xac, 0x54, 0xd6, 0xf1, 0xa1, 0x82, 0x92, 0xad, 0xa1, 0x83, + 0x93, 0xc8, 0x85, 0xad, 0xd6, 0xf0, 0x84, 0x94, 0xc8, 0x85, 0xad, 0xc5, + 0xa2, 0xc5, 0xc6, 0x00, 0xce, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0xd6, + 0xf0, 0xc8, 0xad, 0xd6, 0x90, 0xae, 0x56, 0xd0, 0xd6, 0xad, 0xae, 0xfe, + 0xd0, 0xd6, 0xad, 0xae, 0x56, 0xd0, 0xaa, 0xc6, 0xce, 0xd6, 0xf1, 0x90, + 0x58, 0x58, 0x81, 0xa9, 0xc5, 0x90, 0x58, 0x58, 0x91, 0xc5, 0xc4, 0xc6, + 0xce, 0x90, 0xae, 0xad, 0x5d, 0x56, 0xd6, 0xd0, 0xd6, 0xf1, 0xd6, 0xf0, + 0xc8, 0x89, 0xf9, 0x51, 0x81, 0xc5, 0xc6, 0x00, 0xce, 0xd6, 0xc1, 0xc4, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0xd6, + 0xf1, 0xd6, 0xf0, 0xc8, 0x89, 0xf9, 0x51, 0x81, 0xc5, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0xc1, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xc1, 0xc0, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xc1, 0xc0, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xd6, 0xf1, 0xd6, 0xf0, 0xc8, 0x89, 0xf9, 0x51, 0x81, 0xc5, 0xd6, + 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc0, 0xc6, 0x00, 0xce, 0xd6, 0xc1, 0xc1, + 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0xc1, 0x90, + 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x51, 0x53, + 0x0b, 0x59, 0x0b, 0xd6, 0xc1, 0xc1, 0xc1, 0xcd, 0xd6, 0xc1, 0xfa, 0x52, + 0xd6, 0xea, 0xd6, 0x90, 0x58, 0xad, 0xae, 0xd0, 0xcd, 0xd6, 0x90, 0xad, + 0xae, 0xfe, 0xd0, 0x90, 0x58, 0xad, 0xd6, 0xf0, 0xc8, 0x85, 0x95, 0xad, + 0x90, 0x58, 0xae, 0xd6, 0xd0, 0xcd, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, + 0x58, 0xad, 0xae, 0xd6, 0xd0, 0xcd, 0xc6, 0x00, 0xce, 0x90, 0x58, 0x58, + 0xad, 0xd6, 0xf0, 0xc8, 0x85, 0x95, 0xad, 0x90, 0x58, 0x58, 0xae, 0xd6, + 0xd0, 0xcd, 0x90, 0xad, 0x58, 0xae, 0xd6, 0xd0, 0xd6, 0x90, 0xf8, 0xad, + 0xae, 0xd0, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, 0xc1, 0xc1, 0xc1, + 0xd6, 0x51, 0x53, 0x0b, 0x59, 0x0b, 0xcd, 0xd6, 0x90, 0xad, 0x58, 0xae, + 0xd0, 0x90, 0xd6, 0xe8, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x56, 0xd6, 0x4e, + 0xc4, 0xc6, 0x00, 0x00, 0xce, 0x56, 0x90, 0xd6, 0x4e, 0x48, 0xc6, 0x00, + 0xce, 0xd6, 0x99, 0x90, 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0x99, 0x90, + 0x50, 0x59, 0x81, 0x51, 0x89, 0x48, 0xd3, 0xcd, 0xd6, 0xf0, 0x58, 0xe8, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xf4, 0xfa, 0x52, 0xd6, 0xf1, 0x90, + 0x50, 0x81, 0xc8, 0xab, 0x8a, 0xaa, 0xa3, 0xc8, 0x8a, 0x84, 0xd6, 0xe8, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xf2, 0x90, 0x50, 0x8a, 0xd6, 0xe8, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0xac, 0xad, 0xaf, 0x57, 0xae, 0xfe, + 0xab, 0x53, 0xaa, 0xfa, 0xd6, 0xf0, 0x86, 0xc8, 0x7f, 0xfe, 0x56, 0x6e, + 0xae, 0xe6, 0xa9, 0x82, 0xc8, 0xac, 0xa1, 0x83, 0x7c, 0xad, 0x90, 0x50, + 0x6e, 0xae, 0xe6, 0xa9, 0x82, 0xc8, 0xac, 0xa1, 0x83, 0x7c, 0x6d, 0xad, + 0x90, 0x50, 0x6e, 0xae, 0xe6, 0xa9, 0x82, 0xc8, 0xac, 0xa1, 0x83, 0x7c, + 0x6d, 0xa9, 0x90, 0x50, 0x79, 0xaa, 0x51, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, + 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, + 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, + 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0x90, 0xf8, 0xad, + 0xae, 0xd6, 0xd0, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, 0x00, 0x00, + 0xce, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0x58, + 0xad, 0xae, 0xd0, 0xd6, 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0x90, 0xad, 0x56, + 0xfe, 0xd6, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xaa, 0x52, 0x58, 0x58, 0xad, + 0xae, 0xd0, 0xd6, 0xf0, 0x82, 0x92, 0xc5, 0xd6, 0x90, 0xad, 0xae, 0xfe, + 0xd0, 0xd6, 0xa2, 0xad, 0xae, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0xf0, 0xc8, + 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf1, 0x90, + 0x50, 0x81, 0xc5, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0x56, 0xf0, 0x86, + 0xc5, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, + 0xce, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, 0xce, 0xc4, 0xc4, 0xc6, + 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xc4, 0xd6, 0x90, + 0xad, 0xae, 0x56, 0xd0, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0xad, 0xae, + 0x56, 0xd6, 0xd0, 0xc6, 0xce, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0xc6, + 0xce, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, 0xce, 0x90, 0xad, 0xae, + 0x56, 0xd6, 0xd0, 0xc6, 0xce, 0x90, 0x50, 0xae, 0xc8, 0xa9, 0xd6, 0xf0, + 0x81, 0x91, 0xc8, 0xad, 0xd0, 0xc6, 0x00, 0x00, 0xce, 0x90, 0xad, 0xae, + 0x56, 0xd6, 0xd0, 0xc6, 0xce, 0xc6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x20, 0x00, 0x18, 0x30, 0x14, 0x30, 0x00, 0x10, 0x13, 0x10, 0x00, 0x02, + 0x00, 0x18, 0x30, 0x02, 0x18, 0x30, 0x18, 0x30, 0x32, 0x02, 0x00, 0x14, + 0x30, 0x28, 0x3a, 0x02, 0x00, 0x14, 0x30, 0x10, 0x00, 0x01, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x07, 0x00, 0x00, 0x30, + 0x34, 0x00, 0x02, 0x00, 0x2c, 0x30, 0x03, 0x00, 0x03, 0x00, 0x58, 0x00, + 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x41, 0x06, 0x00, 0x00, 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x30, 0x34, 0x00, 0x03, 0x00, 0x58, 0x00, 0x03, + 0x00, 0x58, 0x00, 0x02, 0x00, 0x2c, 0x30, 0x00, 0x00, 0x02, 0x00, 0x27, + 0x00, 0x00, 0xff, 0x03, 0x02, 0x00, 0x28, 0x30, 0x0d, 0x00, 0x50, 0x00, + 0x8c, 0x00, 0x36, 0x60, 0x00, 0x9c, 0x00, 0x36, 0x70, 0x00, 0xac, 0x00, + 0x02, 0x00, 0x20, 0x30, 0x08, 0x00, 0x06, 0x02, 0x00, 0x14, 0x30, 0x31, + 0x33, 0x02, 0x00, 0x20, 0x00, 0x18, 0x30, 0x45, 0x00, 0x0a, 0x40, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x20, 0x30, 0x07, 0x00, 0x0e, 0x00, 0x04, 0x00, + 0x0e, 0x00, 0x68, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x07, 0x00, 0x20, 0x30, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x08, 0x00, 0x20, 0x30, 0x00, 0x01, 0x02, 0x00, 0x08, 0x00, 0x20, 0x30, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x18, 0x30, 0x01, 0x00, 0x00, 0x08, 0x00, 0x18, 0x30, 0x00, 0x00, 0x08, + 0x00, 0x18, 0x30, 0x14, 0x30, 0x00, 0x10, 0x13, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x00, 0x20, 0x38, 0x49, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, + 0x02, 0x00, 0x14, 0x30, 0x80, 0x00, 0x02, 0x00, 0x18, 0x30, 0x02, 0x18, + 0x30, 0x18, 0x30, 0x02, 0x00, 0x18, 0x30, 0x02, 0x00, 0xff, 0x3f, 0xc0, + 0xff, 0x20, 0x30, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0x00, 0x08, + 0x00, 0x14, 0x30, 0x0e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x18, + 0x30, 0x0e, 0x00, 0x00, 0x00, 0x32, 0x02, 0x00, 0x14, 0x30, 0x28, 0x3a, + 0x46, 0x00, 0x0a, 0x40, 0x00, 0x01, 0x02, 0x00, 0x04, 0x00, 0x18, 0x30, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x20, 0x00, 0x4a, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x18, 0x30, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x14, 0x30, 0x31, 0x02, 0x00, 0x20, 0x00, 0x18, 0x30, 0x33, + 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x18, 0x30, + 0x01, 0x18, 0x30, 0x18, 0x30, 0x02, 0x00, 0x10, 0x00, 0x14, 0x30, 0x02, + 0x00, 0x04, 0x00, 0x18, 0x30, 0x00, 0x40, 0x14, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x20, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x02, 0x00, 0x20, 0x00, 0x14, 0x30, 0x00, 0x01, 0x06, 0x00, + 0x00, 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x30, + 0x34, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x14, 0x30, 0x39, 0x00, + 0x00, 0x02, 0x00, 0x04, 0x00, 0x14, 0x00, 0x34, 0x01, 0x03, 0x00, 0x18, + 0x00, 0x32, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x0b, 0x00, 0x84, 0x0d, 0x0b, + 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x14, 0x30, 0x03, 0x00, 0x58, 0x00, + 0x3f, 0x0b, 0x00, 0x84, 0x0d, 0x02, 0x00, 0x2c, 0x30, 0x3f, 0x26, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0x3f, 0x27, 0x03, 0x00, 0x1c, 0x00, + 0x02, 0x00, 0x14, 0x30, 0x35, 0x03, 0x00, 0x58, 0x00, 0x3f, 0x0b, 0x00, + 0x84, 0x0d, 0x02, 0x00, 0x14, 0x30, 0x38, 0x04, 0x00, 0x14, 0x00, 0x08, + 0x00, 0x03, 0x00, 0x18, 0x00, 0x34, 0x01, 0x06, 0x00, 0x00, 0x01, 0x08, + 0x00, 0x07, 0x00, 0x00, 0x30, 0x34, 0x00, 0x02, 0x00, 0x2c, 0x30, 0x20, + 0x00, 0x03, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x2c, 0x30, 0x02, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x2c, 0x30, 0x02, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x80, 0x00, 0x14, 0x30, 0x00, 0x02, 0x14, 0x30, 0x01, 0x3d, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x80, 0x00, 0x14, 0x30, 0x00, 0x02, 0x14, 0x30, + 0x01, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x10, 0x11, 0x24, 0x00, + 0x06, 0x00, 0x01, 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, 0x30, 0x00, 0x10, + 0x34, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x04, 0x14, 0x30, 0x15, 0x00, + 0x00, 0x01, 0x14, 0x00, 0x10, 0xe7, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, + 0x00, 0x04, 0x04, 0x00, 0x48, 0x00, 0x3e, 0x04, 0x00, 0x64, 0x00, 0x36, + 0x55, 0x15, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x10, 0x11, 0x24, 0x00, + 0x02, 0x00, 0x30, 0x30, 0x38, 0x06, 0x00, 0x01, 0x01, 0x08, 0x00, 0x07, + 0x00, 0x00, 0x30, 0x34, 0x00, 0x02, 0x00, 0x00, 0x04, 0x14, 0x30, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x2e, 0x2d, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x03, 0x00, 0x02, 0x00, 0x14, 0x30, 0x03, 0x00, 0x18, 0x00, + 0x02, 0x00, 0x30, 0x30, 0x01, 0x00, 0x00, 0x03, 0x00, 0x28, 0x00, 0x00, + 0x00, 0x01, 0x07, 0x00, 0x0f, 0x80, 0x02, 0x02, 0x2f, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x03, 0x00, 0x02, 0x00, 0x14, 0x30, 0x03, 0x00, 0x18, 0x00, + 0x02, 0x00, 0x30, 0x30, 0x01, 0x00, 0x00, 0x03, 0x00, 0x28, 0x00, 0x00, + 0x00, 0x01, 0x07, 0x00, 0x0f, 0x80, 0x02, 0x02, 0x2f, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x07, 0x00, 0x33, 0x80, 0x30, 0x3c, 0x00, 0x80, 0x01, 0x00, + 0x00, 0x01, 0x07, 0x00, 0x33, 0x80, 0x24, 0x3c, 0x00, 0x80, 0x04, 0x00, + 0x00, 0x01, 0x03, 0x00, 0x18, 0x00, 0x02, 0x00, 0x30, 0x30, 0x01, 0x00, + 0x00, 0x03, 0x00, 0x31, 0x02, 0x00, 0x03, 0x00, 0x14, 0x30, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x33, 0x80, 0x00, 0x83, + 0x0f, 0x80, 0x00, 0x02, 0x00, 0x03, 0x03, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x07, 0x00, 0x33, 0x80, 0x34, 0x3c, 0x00, 0x03, 0x03, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x3a, 0x00, 0x01, 0x00, + 0x07, 0x00, 0x30, 0x80, 0x0a, 0x0b, 0x30, 0x80, 0x08, 0x0b, 0x30, 0x80, + 0x00, 0x0b, 0xec, 0x01, 0x08, 0x00, 0x00, 0x80, 0x00, 0x80, 0xff, 0xff, + 0xff, 0xff, 0x03, 0x00, 0x1c, 0x00, 0x0b, 0x00, 0x84, 0x0d, 0x0a, 0x00, + 0x0d, 0x00, 0x00, 0x80, 0x04, 0x00, 0x02, 0x00, 0x14, 0x30, 0x38, 0x04, + 0x00, 0x14, 0x00, 0x08, 0x00, 0x04, 0x00, 0x30, 0x00, 0x00, 0x80, 0x03, + 0x00, 0x18, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x39, 0x04, 0x00, 0x14, 0x00, 0xc5, 0x00, 0x03, 0x00, 0x18, + 0x00, 0x0d, 0x00, 0x00, 0x80, 0x04, 0x00, 0x04, 0x00, 0x30, 0x00, 0x00, + 0x80, 0x07, 0x00, 0x30, 0x80, 0x08, 0x0b, 0x30, 0x80, 0x0a, 0x0b, 0x30, + 0x80, 0x0b, 0x0b, 0x08, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x0b, + 0x00, 0x84, 0x0d, 0x03, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x09, 0x00, 0xe1, 0x68, 0x38, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x09, 0x00, 0xe1, 0x68, 0xe1, 0x68, 0x00, 0x00, 0x00, 0x05, 0x09, 0x00, + 0xe1, 0x68, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x05, 0x09, 0x00, + 0xe1, 0x68, 0x3f, 0x00, 0x80, 0x00, 0xe1, 0x68, 0x37, 0x00, 0x43, 0x40, + 0x02, 0x00, 0x24, 0x30, 0x24, 0x30, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x2c, 0x30, 0xff, 0xff, 0x00, 0x01, 0x02, 0x00, 0x18, 0x30, 0x20, 0x00, + 0x3c, 0x3f, 0x03, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x2c, 0x30, 0x30, 0x00, 0x03, 0x00, 0x58, 0x00, 0x00, 0x01, 0x3c, 0x00, + 0x00, 0x80, 0xff, 0x03, 0x00, 0x40, 0x0d, 0x00, 0x00, 0x00, 0x21, 0x00, + 0x00, 0x50, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x01, 0x00, + 0x01, 0x00, 0x33, 0x54, 0x34, 0x53, 0x35, 0x52, 0x36, 0x51, 0x37, 0x50, + 0x38, 0x4f, 0x39, 0x4e, 0x3a, 0x4d, 0x3b, 0x4c, 0x00, 0x01, 0x20, 0x00, + 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x08, + 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x00, 0x20, 0x00, 0x01, 0x00, 0x40, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x10, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x04, 0x00, + 0x14, 0x00, 0x06, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x01, 0x0b, 0x00, + 0x80, 0x0d, 0x08, 0x00, 0xff, 0x00, 0xff, 0x02, 0x00, 0x18, 0x30, 0xff, + 0x00, 0xff, 0x00, 0x0b, 0x00, 0x80, 0x0d, 0x00, 0x00, 0x01, 0x04, 0x00, + 0x00, 0x01, 0x14, 0x00, 0x02, 0x00, 0x14, 0x30, 0x16, 0x06, 0x00, 0x00, + 0x01, 0x08, 0x00, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x18, 0x30, 0x38, 0xff, 0x00, 0xff, 0x00, 0x0b, 0x00, 0x80, 0x0d, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x17, 0x02, 0x00, 0x00, + 0x01, 0x14, 0x30, 0x20, 0x00, 0x18, 0x30, 0x3e, 0x00, 0x01, 0x0c, 0x00, + 0x20, 0x00, 0x04, 0x00, 0x00, 0x01, 0x0c, 0x00, 0x20, 0x00, 0x04, 0x00, + 0x00, 0x01, 0x43, 0x40, 0x00, 0x01, 0x02, 0x00, 0x04, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x41, 0x02, 0x00, 0x04, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x02, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x00, 0x02, + 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x08, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x10, 0x00, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x00, 0x20, + 0x01, 0x02, 0x00, 0x14, 0x30, 0x3f, 0x14, 0x30, 0x00, 0x01, 0x00, 0x20, + 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe9, 0x46, 0x55, 0xce, 0x00, 0x00, 0xf2, 0x60, 0x10, 0x00, 0xf2, 0x60, + 0x62, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x28, 0x03, 0xf2, 0x60, + 0x90, 0x08, 0xf2, 0x60, 0x68, 0x03, 0xf2, 0x60, 0xdc, 0x08, 0xf2, 0x60, + 0x04, 0x04, 0xf2, 0x60, 0xa4, 0x09, 0xf2, 0x60, 0x58, 0x04, 0xf2, 0x60, + 0xfc, 0x09, 0xf2, 0x60, 0x88, 0x05, 0xf2, 0x60, 0x2c, 0x0b, 0xf2, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x03, 0xf2, 0x60, + 0x30, 0x09, 0xf2, 0x60, 0xbc, 0x03, 0xf2, 0x60, 0x44, 0x09, 0xf2, 0x60, + 0xc4, 0x03, 0xf2, 0x60, 0x4c, 0x09, 0xf2, 0x60, 0xc8, 0x03, 0xf2, 0x60, + 0x54, 0x09, 0xf2, 0x60, 0xcc, 0x03, 0xf2, 0x60, 0x5c, 0x09, 0xf2, 0x60, + 0xd0, 0x03, 0xf2, 0x60, 0x64, 0x09, 0xf2, 0x60, 0xd4, 0x03, 0xf2, 0x60, + 0x6c, 0x09, 0xf2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x08, 0xf2, 0x60, 0x30, 0x0e, 0xf2, 0x60, 0x84, 0x08, 0xf2, 0x60, + 0x3c, 0x0e, 0xf2, 0x60, 0xb8, 0x07, 0xf2, 0x60, 0x70, 0x0d, 0xf2, 0x60, + 0xa8, 0x05, 0xf2, 0x60, 0x54, 0x0b, 0xf2, 0x60, 0xa4, 0x05, 0xf2, 0x60, + 0x4c, 0x0b, 0xf2, 0x60, 0xe0, 0x07, 0xf2, 0x60, 0x94, 0x0d, 0xf2, 0x60, + 0x0c, 0x08, 0xf2, 0x60, 0xc4, 0x0d, 0xf2, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb0, 0x04, 0xf2, 0x60, 0x58, 0x0a, 0xf2, 0x60, + 0xf8, 0x04, 0xf2, 0x60, 0xa4, 0x0a, 0xf2, 0x60, 0x7c, 0x05, 0xf2, 0x60, + 0x20, 0x0b, 0xf2, 0x60, 0x80, 0x05, 0xf2, 0x60, 0x24, 0x0b, 0xf2, 0x60, + 0x84, 0x05, 0xf2, 0x60, 0x28, 0x0b, 0xf2, 0x60, 0x44, 0x05, 0xf2, 0x60, + 0xe8, 0x0a, 0xf2, 0x60, 0x4c, 0x05, 0xf2, 0x60, 0xf4, 0x0a, 0xf2, 0x60, + 0x54, 0x05, 0xf2, 0x60, 0x00, 0x0b, 0xf2, 0x60, 0x68, 0x05, 0xf2, 0x60, + 0x10, 0x0b, 0xf2, 0x60, 0xe4, 0x05, 0xf2, 0x60, 0x88, 0x0b, 0xf2, 0x60, + 0xf4, 0x05, 0xf2, 0x60, 0x94, 0x0b, 0xf2, 0x60, 0x08, 0x06, 0xf2, 0x60, + 0xac, 0x0b, 0xf2, 0x60, 0x10, 0x06, 0xf2, 0x60, 0xb8, 0x0b, 0xf2, 0x60, + 0x24, 0x06, 0xf2, 0x60, 0xd0, 0x0b, 0xf2, 0x60, 0x2c, 0x06, 0xf2, 0x60, + 0xdc, 0x0b, 0xf2, 0x60, 0x34, 0x06, 0xf2, 0x60, 0xe8, 0x0b, 0xf2, 0x60, + 0x3c, 0x06, 0xf2, 0x60, 0xf4, 0x0b, 0xf2, 0x60, 0x50, 0x06, 0xf2, 0x60, + 0x10, 0x0c, 0xf2, 0x60, 0x5c, 0x06, 0xf2, 0x60, 0x24, 0x0c, 0xf2, 0x60, + 0x68, 0x06, 0xf2, 0x60, 0x34, 0x0c, 0xf2, 0x60, 0xa4, 0x06, 0xf2, 0x60, + 0x80, 0x0c, 0xf2, 0x60, 0xd8, 0x03, 0xf2, 0x60, 0x74, 0x09, 0xf2, 0x60, + 0xe0, 0x06, 0xf2, 0x60, 0xbc, 0x0c, 0xf2, 0x60, 0xe8, 0x06, 0xf2, 0x60, + 0xc8, 0x0c, 0xf2, 0x60, 0xf0, 0x06, 0xf2, 0x60, 0xd4, 0x0c, 0xf2, 0x60, + 0xf8, 0x06, 0xf2, 0x60, 0xe0, 0x0c, 0xf2, 0x60, 0xe0, 0x03, 0xf2, 0x60, + 0x7c, 0x09, 0xf2, 0x60, 0x30, 0x07, 0xf2, 0x60, 0x1c, 0x0d, 0xf2, 0x60, + 0xf0, 0x07, 0xf2, 0x60, 0xac, 0x0d, 0xf2, 0x60, 0x18, 0x08, 0xf2, 0x60, + 0xd4, 0x0d, 0xf2, 0x60, 0x9c, 0x04, 0xf2, 0x60, 0x44, 0x0a, 0xf2, 0x60, + 0xd0, 0x07, 0xf2, 0x60, 0x88, 0x0d, 0xf2, 0x60, 0x0c, 0x07, 0xf2, 0x60, + 0xf8, 0x0c, 0xf2, 0x60, 0x2c, 0x08, 0xf2, 0x60, 0xe8, 0x0d, 0xf2, 0x60, + 0x34, 0x08, 0xf2, 0x60, 0xf0, 0x0d, 0xf2, 0x60, 0x3c, 0x08, 0xf2, 0x60, + 0xf8, 0x0d, 0xf2, 0x60, 0x40, 0x08, 0xf2, 0x60, 0xfc, 0x0d, 0xf2, 0x60, + 0x48, 0x08, 0xf2, 0x60, 0x04, 0x0e, 0xf2, 0x60, 0xf0, 0x03, 0xf2, 0x60, + 0x8c, 0x09, 0xf2, 0x60, 0x50, 0x04, 0xf2, 0x60, 0xf4, 0x09, 0xf2, 0x60, + 0xa0, 0x04, 0xf2, 0x60, 0x48, 0x0a, 0xf2, 0x60, 0xa8, 0x04, 0xf2, 0x60, + 0x50, 0x0a, 0xf2, 0x60, 0x10, 0x04, 0xf2, 0x60, 0xb0, 0x09, 0xf2, 0x60, + 0x60, 0x04, 0xf2, 0x60, 0x08, 0x0a, 0xf2, 0x60, 0xec, 0x03, 0xf2, 0x60, + 0x88, 0x09, 0xf2, 0x60, 0x94, 0x07, 0xf2, 0x60, 0x4c, 0x0d, 0xf2, 0x60, + 0x98, 0x07, 0xf2, 0x60, 0x50, 0x0d, 0xf2, 0x60, 0x9c, 0x07, 0xf2, 0x60, + 0x54, 0x0d, 0xf2, 0x60, 0xa0, 0x07, 0xf2, 0x60, 0x58, 0x0d, 0xf2, 0x60, + 0xa4, 0x07, 0xf2, 0x60, 0x5c, 0x0d, 0xf2, 0x60, 0xa8, 0x07, 0xf2, 0x60, + 0x60, 0x0d, 0xf2, 0x60, 0xac, 0x07, 0xf2, 0x60, 0x64, 0x0d, 0xf2, 0x60, + 0xb0, 0x07, 0xf2, 0x60, 0x68, 0x0d, 0xf2, 0x60, 0xb4, 0x07, 0xf2, 0x60, + 0x6c, 0x0d, 0xf2, 0x60, 0xc8, 0x05, 0xf2, 0x60, 0x68, 0x0b, 0xf2, 0x60, + 0xe8, 0x03, 0xf2, 0x60, 0x84, 0x09, 0xf2, 0x60, 0x24, 0x07, 0xf2, 0x60, + 0x10, 0x0d, 0xf2, 0x60, 0xc8, 0x07, 0xf2, 0x60, 0x80, 0x0d, 0xf2, 0x60, + 0x54, 0x08, 0xf2, 0x60, 0x10, 0x0e, 0xf2, 0x60, 0x5c, 0x08, 0xf2, 0x60, + 0x18, 0x0e, 0xf2, 0x60, 0x64, 0x08, 0xf2, 0x60, 0x20, 0x0e, 0xf2, 0x60, + 0x6c, 0x08, 0xf2, 0x60, 0x28, 0x0e, 0xf2, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8c, 0x08, 0xf2, 0x60, 0x44, 0x0e, 0xf2, 0x60, 0xce, 0xd6, 0x90, 0x50, + 0xad, 0xae, 0xd0, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0x90, 0x50, 0xa9, 0xae, + 0xd6, 0xf0, 0xc8, 0x81, 0xf1, 0x89, 0xad, 0xd0, 0xc4, 0xd6, 0xf1, 0x90, + 0x58, 0x81, 0xc5, 0xc4, 0xd6, 0xf0, 0xc8, 0xfd, 0x55, 0x85, 0x95, 0xad, + 0xd6, 0xfe, 0x56, 0xd0, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, 0xf5, + 0xd6, 0x90, 0xae, 0x56, 0xd0, 0xd6, 0xf0, 0xfe, 0x56, 0x86, 0xc5, 0xc6, + 0xce, 0xc4, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0x55, 0xfe, 0x56, + 0xd0, 0xd6, 0xf0, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xd6, 0xf0, 0xf9, 0x51, + 0x81, 0x91, 0xc5, 0xfe, 0x56, 0xd6, 0xf5, 0xd6, 0xd0, 0xd0, 0xa5, 0xc8, + 0xad, 0xd0, 0xd0, 0xa5, 0xc8, 0xad, 0xd0, 0xd0, 0xd6, 0xf1, 0x90, 0x50, + 0x81, 0xc5, 0xd6, 0xf1, 0x90, 0x58, 0x81, 0xc5, 0xc4, 0xd6, 0x90, 0xad, + 0xae, 0x56, 0xd0, 0xd3, 0xcd, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf5, 0x90, + 0xae, 0x56, 0xd6, 0xd0, 0x58, 0xad, 0xae, 0xd6, 0xd0, 0xc4, 0xc6, 0x00, + 0xce, 0xd6, 0x90, 0xae, 0x56, 0xd0, 0xc6, 0x00, 0xce, 0x55, 0xc4, 0xc6, + 0xce, 0x55, 0xc4, 0xc6, 0xce, 0x55, 0xc4, 0xc6, 0xce, 0x55, 0xc4, 0xc6, + 0xce, 0x55, 0xc4, 0xc6, 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, + 0xce, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf0, 0xc8, 0xf9, 0x51, 0x81, 0xf1, + 0x89, 0xad, 0xfe, 0x56, 0xd0, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xc6, 0x00, + 0xce, 0xd6, 0xf1, 0x90, 0x50, 0xaa, 0x81, 0x92, 0xc8, 0x81, 0xc5, 0xc6, + 0xce, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0x90, 0x50, 0xa9, 0xae, 0xd6, + 0xf0, 0xc8, 0x81, 0xf1, 0x89, 0xad, 0xd0, 0xd6, 0x90, 0xae, 0x5e, 0xad, + 0xd0, 0xd6, 0xfe, 0x56, 0xd0, 0xd6, 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xd6, + 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, 0xf5, 0x90, 0x50, 0xae, 0xd6, 0xd0, + 0xad, 0xd6, 0xd0, 0xc4, 0xd6, 0xf1, 0x90, 0x58, 0x81, 0xc5, 0xc4, 0xd3, + 0xcd, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, + 0xce, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf5, 0x90, + 0x50, 0xae, 0xd6, 0xd0, 0xd6, 0xf1, 0x90, 0x58, 0x81, 0xc5, 0xd6, 0x90, + 0x50, 0xa9, 0xf0, 0x91, 0x81, 0xc5, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, + 0xd6, 0x90, 0x50, 0xa9, 0xae, 0xf0, 0xc8, 0x81, 0xf1, 0x89, 0xad, 0xd0, + 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, + 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, 0x00, 0x00, 0xce, 0xcf, 0xc6, 0x00, + 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xad, + 0xae, 0x56, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0xd6, + 0x55, 0xfe, 0x56, 0xd0, 0xfd, 0x55, 0xd6, 0xf0, 0xc8, 0x85, 0x95, 0xad, + 0xfe, 0x56, 0xd6, 0xd0, 0xcd, 0x90, 0xad, 0xae, 0x5e, 0xd6, 0xd0, 0xcd, + 0x90, 0xaa, 0xd6, 0xea, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, 0xd0, + 0x90, 0xad, 0xaa, 0x5a, 0xd6, 0xf0, 0xa9, 0xc8, 0x81, 0x82, 0xae, 0xd6, + 0xd0, 0x90, 0xa9, 0x59, 0xd6, 0xf2, 0xa2, 0xc8, 0x91, 0x81, 0x82, 0xc5, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0xa9, 0x59, 0xd6, 0xf2, 0xa2, 0xc8, + 0x91, 0x81, 0x82, 0xc5, 0x90, 0x60, 0xaa, 0xd6, 0xea, 0xd6, 0xf0, 0xc8, + 0xad, 0xd6, 0xf0, 0xa9, 0xc8, 0x81, 0xa9, 0x90, 0x58, 0x81, 0xae, 0xd6, + 0xd0, 0xd6, 0x90, 0x58, 0xad, 0xf0, 0xc8, 0x85, 0x95, 0xad, 0x90, 0xae, + 0x5e, 0xd6, 0xd0, 0xcd, 0x90, 0x58, 0xad, 0xae, 0xd6, 0xd0, 0xcd, 0xd6, + 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xd6, + 0xf5, 0x90, 0x50, 0x8d, 0xd6, 0xe8, 0xc6, 0x00, 0xce, 0xd6, 0xf1, 0x90, + 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xc6, + 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0x56, 0xf1, 0xa1, 0xc8, 0x86, + 0x96, 0xaa, 0xa1, 0x86, 0x82, 0xc5, 0xc6, 0x00, 0xce, 0xd6, 0x90, 0xad, + 0xae, 0x56, 0xd0, 0x56, 0xf1, 0xa1, 0xc8, 0x86, 0x96, 0xaa, 0xa1, 0x86, + 0x82, 0xc5, 0xc6, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xd6, + 0x90, 0xad, 0xae, 0x56, 0xd0, 0xd6, 0xae, 0xfe, 0xfd, 0xd0, 0xd6, 0xae, + 0x56, 0x55, 0xd0, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd3, 0xcd, 0xc6, + 0xce, 0x90, 0xaa, 0x5a, 0xab, 0x53, 0xac, 0x54, 0xd6, 0xf1, 0xa1, 0x82, + 0x92, 0xad, 0xa1, 0x83, 0x93, 0xc8, 0x85, 0xad, 0xd6, 0xf0, 0x84, 0x94, + 0xc8, 0x85, 0xad, 0xc5, 0xa2, 0xc5, 0xc6, 0x00, 0xce, 0xd6, 0x90, 0xad, + 0xae, 0xfe, 0xd0, 0xd6, 0xf0, 0xc8, 0xad, 0xd6, 0x90, 0xae, 0x56, 0xd0, + 0xd6, 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0xad, 0xae, 0x56, 0xd0, 0xaa, 0xc6, + 0xce, 0xd6, 0xf1, 0x90, 0x58, 0x58, 0x81, 0xa9, 0xc5, 0x90, 0x58, 0x58, + 0x91, 0xc5, 0xc4, 0xc6, 0xce, 0x90, 0xae, 0xad, 0x5d, 0x56, 0xd6, 0xd0, + 0xd6, 0xf1, 0xd6, 0xf0, 0xc8, 0x89, 0xf9, 0x51, 0x81, 0xc5, 0xc6, 0x00, + 0xce, 0xd6, 0xc1, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0x50, 0xad, + 0xae, 0xd6, 0xd0, 0xd6, 0xf1, 0xd6, 0xf0, 0xc8, 0x89, 0xf9, 0x51, 0x81, + 0xc5, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xc1, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xd6, 0xc1, 0xc0, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xc1, 0xc0, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xf1, 0xd6, 0xf0, 0xc8, 0x89, 0xf9, + 0x51, 0x81, 0xc5, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc0, 0xc6, 0x00, + 0xce, 0xd6, 0xc1, 0xc1, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0xc6, 0x00, + 0xce, 0xd6, 0xc1, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0x51, 0x53, 0x0b, 0x59, 0x0b, 0xd6, 0xc1, 0xc1, 0xc1, 0xcd, + 0xd6, 0xc1, 0xfa, 0x52, 0xd6, 0xea, 0xd6, 0x90, 0x58, 0xad, 0xae, 0xd0, + 0xcd, 0xd6, 0x90, 0xad, 0xae, 0xfe, 0xd0, 0x90, 0x58, 0xad, 0xd6, 0xf0, + 0xc8, 0x85, 0x95, 0xad, 0x90, 0x58, 0xae, 0xd6, 0xd0, 0xcd, 0xd6, 0x90, + 0xad, 0xae, 0x56, 0xd0, 0x58, 0xad, 0xae, 0xd6, 0xd0, 0xcd, 0xc6, 0x00, + 0xce, 0x90, 0x58, 0x58, 0xad, 0xd6, 0xf0, 0xc8, 0x85, 0x95, 0xad, 0x90, + 0x58, 0x58, 0xae, 0xd6, 0xd0, 0xcd, 0x90, 0xad, 0x58, 0xae, 0xd6, 0xd0, + 0xd6, 0x90, 0xf8, 0xad, 0xae, 0xd0, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, + 0xd6, 0xc1, 0xc1, 0xc1, 0xd6, 0x51, 0x53, 0x0b, 0x59, 0x0b, 0xcd, 0xd6, + 0x90, 0xad, 0x58, 0xae, 0xd0, 0x90, 0xd6, 0xe8, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x56, 0xd6, 0x4e, 0xc4, 0xc6, 0x00, 0x00, 0xce, 0x56, 0x90, 0xd6, + 0x4e, 0x48, 0xc6, 0x00, 0xce, 0xd6, 0x99, 0x90, 0x50, 0x81, 0xc5, 0xc6, + 0xce, 0xd6, 0x99, 0x90, 0x50, 0x59, 0x81, 0x51, 0x89, 0x48, 0xd3, 0xcd, + 0xd6, 0xf0, 0x58, 0xe8, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xf4, 0xfa, + 0x52, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc8, 0xab, 0x8a, 0xaa, 0xa3, 0xc8, + 0x8a, 0x84, 0xd6, 0xe8, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0xf2, 0x90, + 0x50, 0x8a, 0xd6, 0xe8, 0xc6, 0x00, 0x00, 0x00, 0xce, 0x90, 0xac, 0xad, + 0xaf, 0x57, 0xae, 0xfe, 0xab, 0x53, 0xaa, 0xfa, 0xd6, 0xf0, 0x86, 0xc8, + 0x7f, 0xfe, 0x56, 0x6e, 0xae, 0xe6, 0xa9, 0x82, 0xc8, 0xac, 0xa1, 0x83, + 0x7c, 0xad, 0x90, 0x50, 0x6e, 0xae, 0xe6, 0xa9, 0x82, 0xc8, 0xac, 0xa1, + 0x83, 0x7c, 0x6d, 0xad, 0x90, 0x50, 0x6e, 0xae, 0xe6, 0xa9, 0x82, 0xc8, + 0xac, 0xa1, 0x83, 0x7c, 0x6d, 0xa9, 0x90, 0x50, 0x79, 0xaa, 0x51, 0xc8, + 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, + 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, + 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xa2, 0xc8, 0x81, 0xc5, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, 0xce, 0xcd, 0xc6, 0x00, + 0xce, 0x90, 0xf8, 0xad, 0xae, 0xd6, 0xd0, 0x90, 0xad, 0xae, 0x56, 0xd6, + 0xd0, 0xc6, 0x00, 0x00, 0xce, 0x90, 0x50, 0xad, 0xae, 0xd6, 0xd0, 0xc6, + 0xce, 0xd6, 0x90, 0x58, 0xad, 0xae, 0xd0, 0xd6, 0x90, 0xf8, 0xad, 0xae, + 0xd0, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, + 0xd0, 0x90, 0xad, 0x56, 0xfe, 0xd6, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xaa, + 0x52, 0x58, 0x58, 0xad, 0xae, 0xd0, 0xd6, 0xf0, 0x82, 0x92, 0xc5, 0xd6, + 0x90, 0xad, 0xae, 0xfe, 0xd0, 0xd6, 0xa2, 0xad, 0xae, 0xd0, 0xc6, 0x00, + 0xce, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0xf1, 0x90, 0x50, 0x81, 0xc5, 0xd6, 0x90, 0xad, 0xae, 0x56, + 0xd0, 0x56, 0xf0, 0x86, 0xc5, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x90, 0x50, + 0xad, 0xae, 0xd0, 0xc6, 0xce, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, + 0xce, 0xc4, 0xc4, 0xc6, 0xce, 0xd6, 0x90, 0x50, 0xad, 0xae, 0xd0, 0xc6, + 0xce, 0xc4, 0xd6, 0x90, 0xad, 0xae, 0x56, 0xd0, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, 0xce, 0x90, 0x50, 0xad, + 0xae, 0xd6, 0xd0, 0xc6, 0xce, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, + 0xce, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, 0xce, 0x90, 0x50, 0xae, + 0xc8, 0xa9, 0xd6, 0xf0, 0x81, 0x91, 0xc8, 0xad, 0xd0, 0xc6, 0x00, 0x00, + 0xce, 0x90, 0xad, 0xae, 0x56, 0xd6, 0xd0, 0xc6, 0xce, 0xc6, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x20, 0x00, 0x18, 0x30, 0x14, 0x30, 0x00, 0x10, + 0x13, 0x10, 0x00, 0x02, 0x00, 0x18, 0x30, 0x02, 0x18, 0x30, 0x18, 0x30, + 0x32, 0x02, 0x00, 0x14, 0x30, 0x28, 0x3a, 0x02, 0x00, 0x14, 0x30, 0x10, + 0x00, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, + 0x07, 0x00, 0x00, 0x30, 0x34, 0x00, 0x02, 0x00, 0x2c, 0x30, 0x03, 0x00, + 0x03, 0x00, 0x58, 0x00, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x04, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x41, 0x06, 0x00, 0x00, 0x01, 0x08, + 0x00, 0x07, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x30, 0x34, 0x00, 0x03, + 0x00, 0x58, 0x00, 0x03, 0x00, 0x58, 0x00, 0x02, 0x00, 0x2c, 0x30, 0x00, + 0x00, 0x02, 0x00, 0x27, 0x00, 0x00, 0xff, 0x03, 0x02, 0x00, 0x28, 0x30, + 0x0d, 0x00, 0x50, 0x00, 0x8c, 0x00, 0x36, 0x60, 0x00, 0x9c, 0x00, 0x36, + 0x70, 0x00, 0xac, 0x00, 0x02, 0x00, 0x20, 0x30, 0x08, 0x00, 0x06, 0x02, + 0x00, 0x14, 0x30, 0x31, 0x33, 0x02, 0x00, 0x20, 0x00, 0x18, 0x30, 0x45, + 0x00, 0x0a, 0x40, 0x00, 0x00, 0x01, 0x02, 0x00, 0x20, 0x30, 0x07, 0x00, + 0x0e, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x68, 0x00, 0x39, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x07, 0x00, 0x20, 0x30, 0x00, 0x01, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x08, 0x00, 0x20, 0x30, 0x00, 0x01, 0x02, 0x00, + 0x08, 0x00, 0x20, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x18, 0x30, 0x01, 0x00, 0x00, 0x08, 0x00, 0x18, + 0x30, 0x00, 0x00, 0x08, 0x00, 0x18, 0x30, 0x14, 0x30, 0x00, 0x10, 0x13, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x20, 0x38, 0x49, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x40, 0x02, 0x00, 0x14, 0x30, 0x80, 0x00, 0x02, 0x00, + 0x18, 0x30, 0x02, 0x18, 0x30, 0x18, 0x30, 0x02, 0x00, 0x18, 0x30, 0x02, + 0x00, 0xff, 0x3f, 0xc0, 0xff, 0x20, 0x30, 0x04, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x02, 0x00, 0x08, 0x00, 0x14, 0x30, 0x0e, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x18, 0x30, 0x0e, 0x00, 0x00, 0x00, 0x32, 0x02, 0x00, + 0x14, 0x30, 0x28, 0x3a, 0x46, 0x00, 0x0a, 0x40, 0x00, 0x01, 0x02, 0x00, + 0x04, 0x00, 0x18, 0x30, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, + 0x20, 0x00, 0x4a, 0x00, 0x00, 0x01, 0x02, 0x00, 0x18, 0x30, 0x02, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x30, 0x31, 0x02, 0x00, 0x20, + 0x00, 0x18, 0x30, 0x33, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0x00, + 0x40, 0x00, 0x18, 0x30, 0x01, 0x18, 0x30, 0x18, 0x30, 0x02, 0x00, 0x10, + 0x00, 0x14, 0x30, 0x02, 0x00, 0x04, 0x00, 0x18, 0x30, 0x00, 0x40, 0x14, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x20, 0x00, 0x14, 0x30, 0x00, 0x01, 0x02, 0x00, 0x20, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x06, 0x00, 0x00, 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x30, 0x34, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x14, 0x30, 0x39, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x14, 0x00, 0x34, + 0x01, 0x03, 0x00, 0x18, 0x00, 0x32, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x0b, + 0x00, 0x84, 0x0d, 0x0b, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x14, 0x30, + 0x03, 0x00, 0x58, 0x00, 0x3f, 0x0b, 0x00, 0x84, 0x0d, 0x02, 0x00, 0x2c, + 0x30, 0x3f, 0x26, 0x00, 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0x3f, 0x27, + 0x03, 0x00, 0x1c, 0x00, 0x02, 0x00, 0x14, 0x30, 0x35, 0x03, 0x00, 0x58, + 0x00, 0x3f, 0x0b, 0x00, 0x84, 0x0d, 0x02, 0x00, 0x14, 0x30, 0x38, 0x04, + 0x00, 0x14, 0x00, 0x08, 0x00, 0x03, 0x00, 0x18, 0x00, 0x34, 0x01, 0x06, + 0x00, 0x00, 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, 0x30, 0x34, 0x00, 0x02, + 0x00, 0x2c, 0x30, 0x20, 0x00, 0x03, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0x02, 0x00, 0x26, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0x02, 0x00, 0x27, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x80, 0x00, 0x14, 0x30, 0x00, 0x02, 0x14, 0x30, + 0x01, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x80, 0x00, 0x14, 0x30, + 0x00, 0x02, 0x14, 0x30, 0x01, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, + 0x10, 0x11, 0x24, 0x00, 0x06, 0x00, 0x01, 0x01, 0x08, 0x00, 0x07, 0x00, + 0x00, 0x30, 0x00, 0x10, 0x34, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x04, + 0x14, 0x30, 0x15, 0x00, 0x00, 0x01, 0x14, 0x00, 0x10, 0xe7, 0x00, 0x00, + 0x00, 0x01, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x48, 0x00, 0x3e, 0x04, + 0x00, 0x64, 0x00, 0x36, 0x55, 0x15, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, + 0x10, 0x11, 0x24, 0x00, 0x02, 0x00, 0x30, 0x30, 0x38, 0x06, 0x00, 0x01, + 0x01, 0x08, 0x00, 0x07, 0x00, 0x00, 0x30, 0x34, 0x00, 0x02, 0x00, 0x00, + 0x04, 0x14, 0x30, 0x00, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x2e, 0x2d, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x03, 0x00, 0x18, 0x00, 0x02, 0x00, 0x30, 0x30, 0x01, 0x00, 0x00, 0x03, + 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x0f, 0x80, 0x02, 0x02, + 0x2f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x03, 0x00, 0x18, 0x00, 0x02, 0x00, 0x30, 0x30, 0x01, 0x00, 0x00, 0x03, + 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x0f, 0x80, 0x02, 0x02, + 0x2f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x33, 0x80, 0x30, 0x3c, + 0x00, 0x80, 0x01, 0x00, 0x00, 0x01, 0x07, 0x00, 0x33, 0x80, 0x24, 0x3c, + 0x00, 0x80, 0x04, 0x00, 0x00, 0x01, 0x03, 0x00, 0x18, 0x00, 0x02, 0x00, + 0x30, 0x30, 0x01, 0x00, 0x00, 0x03, 0x00, 0x31, 0x02, 0x00, 0x03, 0x00, + 0x14, 0x30, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, + 0x33, 0x80, 0x00, 0x83, 0x0f, 0x80, 0x00, 0x02, 0x00, 0x03, 0x03, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x33, 0x80, 0x34, 0x3c, + 0x00, 0x03, 0x03, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, + 0x3a, 0x00, 0x01, 0x00, 0x07, 0x00, 0x30, 0x80, 0x0a, 0x0b, 0x30, 0x80, + 0x08, 0x0b, 0x30, 0x80, 0x00, 0x0b, 0xec, 0x01, 0x08, 0x00, 0x00, 0x80, + 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x1c, 0x00, 0x0b, 0x00, + 0x84, 0x0d, 0x0a, 0x00, 0x0d, 0x00, 0x00, 0x80, 0x04, 0x00, 0x02, 0x00, + 0x14, 0x30, 0x38, 0x04, 0x00, 0x14, 0x00, 0x08, 0x00, 0x04, 0x00, 0x30, + 0x00, 0x00, 0x80, 0x03, 0x00, 0x18, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x39, 0x04, 0x00, 0x14, 0x00, 0xc5, + 0x00, 0x03, 0x00, 0x18, 0x00, 0x0d, 0x00, 0x00, 0x80, 0x04, 0x00, 0x04, + 0x00, 0x30, 0x00, 0x00, 0x80, 0x07, 0x00, 0x30, 0x80, 0x08, 0x0b, 0x30, + 0x80, 0x0a, 0x0b, 0x30, 0x80, 0x0b, 0x0b, 0x08, 0x00, 0x3a, 0x00, 0x00, + 0x00, 0x3f, 0x00, 0x0b, 0x00, 0x84, 0x0d, 0x03, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x01, 0x80, 0x00, 0x09, 0x00, 0xe1, 0x68, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x80, 0x00, 0x09, 0x00, 0xe1, 0x68, 0xe1, 0x68, 0x00, 0x00, + 0x00, 0x05, 0x09, 0x00, 0xe1, 0x68, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x05, 0x09, 0x00, 0xe1, 0x68, 0x3f, 0x00, 0x80, 0x00, 0xe1, 0x68, + 0x37, 0x00, 0x43, 0x40, 0x02, 0x00, 0x24, 0x30, 0x24, 0x30, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0xff, 0xff, 0x00, 0x01, 0x02, 0x00, + 0x18, 0x30, 0x20, 0x00, 0x3c, 0x3f, 0x03, 0x00, 0x58, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x2c, 0x30, 0x30, 0x00, 0x03, 0x00, 0x58, 0x00, + 0x00, 0x01, 0x3c, 0x00, 0x00, 0x80, 0xff, 0x03, 0x00, 0x40, 0x0d, 0x00, + 0x00, 0x00, 0x21, 0x00, 0x00, 0x50, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, + 0x00, 0x22, 0x01, 0x00, 0x01, 0x00, 0x33, 0x54, 0x34, 0x53, 0x35, 0x52, + 0x36, 0x51, 0x37, 0x50, 0x38, 0x4f, 0x39, 0x4e, 0x3a, 0x4d, 0x3b, 0x4c, + 0x00, 0x01, 0x20, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04, + 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x00, 0x20, + 0x00, 0x01, 0x00, 0x40, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, + 0x14, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x02, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x04, 0x00, 0x14, 0x00, 0x06, 0x00, 0x00, 0x01, 0x08, 0x00, + 0x00, 0x01, 0x0b, 0x00, 0x80, 0x0d, 0x08, 0x00, 0xff, 0x00, 0xff, 0x02, + 0x00, 0x18, 0x30, 0xff, 0x00, 0xff, 0x00, 0x0b, 0x00, 0x80, 0x0d, 0x00, + 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x14, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x16, 0x06, 0x00, 0x00, 0x01, 0x08, 0x00, 0x02, 0x00, 0x14, 0x30, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x18, 0x30, 0x38, 0xff, 0x00, 0xff, 0x00, 0x0b, + 0x00, 0x80, 0x0d, 0x00, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, + 0x17, 0x02, 0x00, 0x00, 0x01, 0x14, 0x30, 0x20, 0x00, 0x18, 0x30, 0x3e, + 0x00, 0x01, 0x0c, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x01, 0x0c, 0x00, + 0x20, 0x00, 0x04, 0x00, 0x00, 0x01, 0x43, 0x40, 0x00, 0x01, 0x02, 0x00, + 0x04, 0x00, 0x14, 0x30, 0x00, 0x01, 0x41, 0x02, 0x00, 0x04, 0x00, 0x14, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x02, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x00, 0x02, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x08, 0x00, + 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x10, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x00, 0x20, 0x01, 0x02, 0x00, 0x14, 0x30, 0x3f, 0x14, 0x30, + 0x00, 0x01, 0x00, 0x20, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x35, 0xea, 0x3f, 0x7a, 0x00, 0x00, 0x02, 0x60, + 0x10, 0x00, 0x02, 0x60, 0x31, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x02, 0x60, 0x88, 0x03, 0x02, 0x60, 0xb4, 0x01, 0x02, 0x60, + 0xa0, 0x03, 0x02, 0x60, 0xcc, 0x01, 0x02, 0x60, 0xc4, 0x03, 0x02, 0x60, + 0x40, 0x02, 0x02, 0x60, 0x80, 0x04, 0x02, 0x60, 0x68, 0x02, 0x02, 0x60, + 0xc0, 0x04, 0x02, 0x60, 0x74, 0x02, 0x02, 0x60, 0xd0, 0x04, 0x02, 0x60, + 0x80, 0x02, 0x02, 0x60, 0xe0, 0x04, 0x02, 0x60, 0x84, 0x02, 0x02, 0x60, + 0xe4, 0x04, 0x02, 0x60, 0x88, 0x02, 0x02, 0x60, 0xe8, 0x04, 0x02, 0x60, + 0x8c, 0x02, 0x02, 0x60, 0xec, 0x04, 0x02, 0x60, 0x90, 0x02, 0x02, 0x60, + 0xf0, 0x04, 0x02, 0x60, 0x94, 0x02, 0x02, 0x60, 0xf4, 0x04, 0x02, 0x60, + 0x98, 0x02, 0x02, 0x60, 0xf8, 0x04, 0x02, 0x60, 0xa4, 0x02, 0x02, 0x60, + 0x08, 0x05, 0x02, 0x60, 0xb0, 0x02, 0x02, 0x60, 0x18, 0x05, 0x02, 0x60, + 0xb4, 0x02, 0x02, 0x60, 0x1c, 0x05, 0x02, 0x60, 0xb8, 0x02, 0x02, 0x60, + 0x20, 0x05, 0x02, 0x60, 0xbc, 0x02, 0x02, 0x60, 0x24, 0x05, 0x02, 0x60, + 0xc0, 0x02, 0x02, 0x60, 0x28, 0x05, 0x02, 0x60, 0xc4, 0x02, 0x02, 0x60, + 0x2c, 0x05, 0x02, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x02, 0x02, 0x60, 0x68, 0x05, 0x02, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf4, 0x02, 0x02, 0x60, 0x6c, 0x05, 0x02, 0x60, + 0x2c, 0x03, 0x02, 0x60, 0xe4, 0x05, 0x02, 0x60, 0x74, 0x03, 0x02, 0x60, + 0x68, 0x06, 0x02, 0x60, 0x7c, 0x03, 0x02, 0x60, 0x70, 0x06, 0x02, 0x60, + 0xc8, 0x02, 0x02, 0x60, 0x30, 0x05, 0x02, 0x60, 0xcc, 0x02, 0x02, 0x60, + 0x34, 0x05, 0x02, 0x60, 0xd0, 0x02, 0x02, 0x60, 0x38, 0x05, 0x02, 0x60, + 0xd8, 0x02, 0x02, 0x60, 0x44, 0x05, 0x02, 0x60, 0xc0, 0x01, 0x02, 0x60, + 0xb4, 0x03, 0x02, 0x60, 0x38, 0x02, 0x02, 0x60, 0x74, 0x04, 0x02, 0x60, + 0xe0, 0x02, 0x02, 0x60, 0x50, 0x05, 0x02, 0x60, 0xe8, 0x02, 0x02, 0x60, + 0x5c, 0x05, 0x02, 0x60, 0xd4, 0x01, 0x02, 0x60, 0xd0, 0x03, 0x02, 0x60, + 0x48, 0x02, 0x02, 0x60, 0x8c, 0x04, 0x02, 0x60, 0x20, 0x02, 0x02, 0x60, + 0x4c, 0x04, 0x02, 0x60, 0xfc, 0x01, 0x02, 0x60, 0x10, 0x04, 0x02, 0x60, + 0x80, 0x03, 0x02, 0x60, 0x74, 0x06, 0x02, 0x60, 0x84, 0x03, 0x02, 0x60, + 0x7c, 0x06, 0x02, 0x60, 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xf0, 0xc8, + 0xfe, 0x56, 0x86, 0xf1, 0x89, 0xad, 0xd0, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xc4, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xd3, 0xcd, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0xf0, 0xc8, 0xfe, 0x56, 0x86, 0xf1, 0x89, 0xad, 0xd0, 0xc6, + 0xce, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf0, 0xc8, + 0xfe, 0x56, 0x86, 0xf1, 0x89, 0xad, 0xd0, 0xfe, 0x56, 0xfd, 0x55, 0xd6, + 0xd0, 0xd6, 0xed, 0xd6, 0xfe, 0x56, 0xfd, 0xd0, 0xd6, 0xf0, 0xc8, 0xac, + 0xc4, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc4, 0xd3, 0xcd, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xd6, 0xf0, 0xc8, + 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xa4, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xd6, + 0x55, 0xfe, 0x56, 0xd0, 0xcd, 0xd6, 0xfd, 0xfe, 0x56, 0xd0, 0xc6, 0x00, + 0xce, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xd6, 0xf0, 0xc8, + 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xcd, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, + 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0xf0, 0xf9, + 0x51, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf0, 0xf9, 0x51, 0x91, 0xf9, 0x51, + 0x81, 0xc5, 0xc4, 0xd6, 0xfe, 0x56, 0xfd, 0xd0, 0xd6, 0xf0, 0xc8, 0xfe, + 0x56, 0x86, 0xf1, 0x89, 0xad, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, + 0xce, 0xfe, 0x56, 0x55, 0xd6, 0xd0, 0xd6, 0xd0, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xfe, 0x56, 0x55, 0xd6, 0xd0, 0xd6, 0xd0, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xd6, 0xf1, 0xf8, 0x50, 0x81, 0xc5, 0xf8, 0x50, 0x81, 0xc5, 0xc6, + 0xce, 0xd6, 0xf1, 0xf8, 0x50, 0x81, 0xc5, 0xf8, 0x50, 0x81, 0xc5, 0xc6, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xfe, 0x56, 0x55, + 0xd6, 0xd0, 0xc6, 0x00, 0xce, 0xfe, 0x56, 0x55, 0xd6, 0xd0, 0xc6, 0x00, + 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0x55, 0xfe, + 0x56, 0xd0, 0xc6, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x52, 0xfa, + 0xea, 0xd6, 0x55, 0x56, 0xd0, 0xd6, 0xc1, 0xad, 0xcd, 0xc1, 0xad, 0xcd, + 0xd6, 0xc1, 0xad, 0xcd, 0xc1, 0xd6, 0x52, 0xfa, 0xea, 0xd6, 0xc1, 0xcd, + 0xd6, 0xc1, 0xc1, 0xcd, 0xd6, 0xc1, 0xad, 0xcd, 0xc1, 0xd6, 0x52, 0xfa, + 0xea, 0xd6, 0xfd, 0xfe, 0x56, 0xd0, 0xd6, 0xd0, 0xd6, 0x55, 0xfe, 0x56, + 0xd0, 0xd6, 0xd0, 0xc6, 0xce, 0xd6, 0xfd, 0xfe, 0x56, 0xd0, 0xd6, 0xd0, + 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xd6, 0xd0, 0xd6, 0x52, 0xfa, 0xea, 0xd6, + 0x52, 0xfa, 0xea, 0xd6, 0xc1, 0xad, 0xcd, 0xc1, 0xad, 0xcd, 0xd6, 0x98, + 0x58, 0x52, 0xfa, 0x82, 0x48, 0xad, 0xcd, 0x98, 0x58, 0x52, 0xfa, 0x82, + 0x48, 0xad, 0xcd, 0xd6, 0xc1, 0xad, 0xcd, 0xc1, 0xd6, 0xc1, 0xd6, 0xf0, + 0x52, 0xfa, 0x82, 0x92, 0xc5, 0xc1, 0xcd, 0xd6, 0x55, 0x56, 0xd0, 0xd6, + 0x52, 0xfa, 0xea, 0xc6, 0xce, 0xd6, 0xf4, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xc4, 0xc6, 0x00, 0xce, 0xd6, 0xc1, 0xc6, 0xce, 0xa0, 0xc6, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x14, 0x30, + 0x14, 0x30, 0x08, 0x00, 0x00, 0x00, 0x08, 0x14, 0x30, 0x14, 0x30, 0x20, + 0x00, 0x01, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x14, + 0x30, 0x28, 0x00, 0x0a, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x07, 0x00, 0x00, 0x00, 0x04, 0x14, 0x30, 0x14, 0x30, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, 0x10, 0x2c, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x02, 0x00, 0x00, 0x80, 0x00, 0x14, + 0x30, 0x14, 0x30, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x14, 0x30, 0x02, 0x00, 0x20, 0x30, 0x03, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0xbc, 0x00, 0x02, 0x00, 0x1c, 0x30, 0x30, 0x2f, 0x02, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x14, 0x30, 0x20, 0x29, 0x00, + 0x0a, 0x40, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x24, 0x00, 0x25, 0x00, + 0x00, 0x06, 0x00, 0x02, 0x00, 0x14, 0x30, 0x03, 0x00, 0x50, 0x00, 0x10, + 0x00, 0xff, 0x00, 0x00, 0x02, 0x00, 0x20, 0x30, 0x00, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x50, 0x00, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x20, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x20, 0x30, 0x30, 0x00, + 0x00, 0x00, 0xff, 0x03, 0x00, 0x50, 0x00, 0x02, 0x00, 0x14, 0x30, 0x1b, + 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x24, 0x00, 0x0f, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x30, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x00, 0x00, 0x00, 0x10, 0x2d, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x20, 0x00, 0x21, 0x2e, + 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0xbc, 0x00, 0x02, 0x00, + 0x14, 0x30, 0x01, 0x00, 0x00, 0x40, 0x00, 0x14, 0x30, 0x14, 0x30, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x58, 0x00, + 0x07, 0x00, 0x58, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x58, 0x00, 0x07, 0x00, 0x58, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x00, 0x00, 0x00, 0x01, 0x26, 0x00, 0x00, 0x00, 0x02, 0x27, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, 0x01, 0x26, 0x00, + 0x00, 0x00, 0x02, 0x27, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x58, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x07, 0x00, 0x58, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x14, 0x30, + 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x14, 0x30, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0xff, 0x1f, 0xdf, 0xf7, + 0x94, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x01, 0x00, 0x80, 0x0d, 0x0c, 0x00, + 0x0c, 0x00, 0x00, 0x10, 0x0c, 0x00, 0x8c, 0x00, 0x00, 0x10, 0x0c, 0x00, + 0x0c, 0x00, 0x24, 0x00, 0x02, 0x02, 0x0c, 0x00, 0xa4, 0x00, 0x02, 0x02, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x07, 0x0b, 0x00, 0x00, 0x00, + 0x00, 0x06, 0xf6, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x00, 0x02, 0x0e, 0x00, + 0x00, 0x40, 0xc5, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x20, 0x0c, 0x00, + 0x8c, 0x00, 0x00, 0x20, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x90, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, + 0x38, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, + 0x07, 0x00, 0x40, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x38, 0x00, 0x06, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x07, 0x00, 0x40, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x10, 0x07, 0x0c, 0x00, 0x0c, 0x00, 0x10, 0x10, 0x0c, 0x00, 0x8c, 0x00, + 0x10, 0x10, 0x0c, 0x00, 0x0c, 0x00, 0x23, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x23, 0x00, 0x0c, 0x00, 0xa3, 0x00, 0x01, 0x00, 0x00, 0x00, 0xa3, 0x00, + 0x0c, 0x00, 0x0c, 0x00, 0x24, 0x00, 0x00, 0x02, 0x0c, 0x00, 0xa4, 0x00, + 0x00, 0x02, 0x0b, 0x00, 0x0e, 0x00, 0x40, 0x40, 0x02, 0x00, 0x30, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x06, 0x06, 0x62, 0x00, 0x0e, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x0d, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x94, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x28, 0x30, 0x2f, 0x00, + 0x00, 0x01, 0x2e, 0x00, 0x00, 0x01, 0x0b, 0x00, 0x01, 0x00, 0x02, 0x02, + 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x9d, 0xae, 0x7a, 0x00, 0x00, 0x12, 0x60, 0x10, 0x00, 0x12, 0x60, + 0x31, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x12, 0x60, + 0x88, 0x03, 0x12, 0x60, 0xb4, 0x01, 0x12, 0x60, 0xa0, 0x03, 0x12, 0x60, + 0xcc, 0x01, 0x12, 0x60, 0xc4, 0x03, 0x12, 0x60, 0x40, 0x02, 0x12, 0x60, + 0x80, 0x04, 0x12, 0x60, 0x68, 0x02, 0x12, 0x60, 0xc0, 0x04, 0x12, 0x60, + 0x74, 0x02, 0x12, 0x60, 0xd0, 0x04, 0x12, 0x60, 0x80, 0x02, 0x12, 0x60, + 0xe0, 0x04, 0x12, 0x60, 0x84, 0x02, 0x12, 0x60, 0xe4, 0x04, 0x12, 0x60, + 0x88, 0x02, 0x12, 0x60, 0xe8, 0x04, 0x12, 0x60, 0x8c, 0x02, 0x12, 0x60, + 0xec, 0x04, 0x12, 0x60, 0x90, 0x02, 0x12, 0x60, 0xf0, 0x04, 0x12, 0x60, + 0x94, 0x02, 0x12, 0x60, 0xf4, 0x04, 0x12, 0x60, 0x98, 0x02, 0x12, 0x60, + 0xf8, 0x04, 0x12, 0x60, 0xa4, 0x02, 0x12, 0x60, 0x08, 0x05, 0x12, 0x60, + 0xb0, 0x02, 0x12, 0x60, 0x18, 0x05, 0x12, 0x60, 0xb4, 0x02, 0x12, 0x60, + 0x1c, 0x05, 0x12, 0x60, 0xb8, 0x02, 0x12, 0x60, 0x20, 0x05, 0x12, 0x60, + 0xbc, 0x02, 0x12, 0x60, 0x24, 0x05, 0x12, 0x60, 0xc0, 0x02, 0x12, 0x60, + 0x28, 0x05, 0x12, 0x60, 0xc4, 0x02, 0x12, 0x60, 0x2c, 0x05, 0x12, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x02, 0x12, 0x60, + 0x68, 0x05, 0x12, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf4, 0x02, 0x12, 0x60, 0x6c, 0x05, 0x12, 0x60, 0x2c, 0x03, 0x12, 0x60, + 0xe4, 0x05, 0x12, 0x60, 0x74, 0x03, 0x12, 0x60, 0x68, 0x06, 0x12, 0x60, + 0x7c, 0x03, 0x12, 0x60, 0x70, 0x06, 0x12, 0x60, 0xc8, 0x02, 0x12, 0x60, + 0x30, 0x05, 0x12, 0x60, 0xcc, 0x02, 0x12, 0x60, 0x34, 0x05, 0x12, 0x60, + 0xd0, 0x02, 0x12, 0x60, 0x38, 0x05, 0x12, 0x60, 0xd8, 0x02, 0x12, 0x60, + 0x44, 0x05, 0x12, 0x60, 0xc0, 0x01, 0x12, 0x60, 0xb4, 0x03, 0x12, 0x60, + 0x38, 0x02, 0x12, 0x60, 0x74, 0x04, 0x12, 0x60, 0xe0, 0x02, 0x12, 0x60, + 0x50, 0x05, 0x12, 0x60, 0xe8, 0x02, 0x12, 0x60, 0x5c, 0x05, 0x12, 0x60, + 0xd4, 0x01, 0x12, 0x60, 0xd0, 0x03, 0x12, 0x60, 0x48, 0x02, 0x12, 0x60, + 0x8c, 0x04, 0x12, 0x60, 0x20, 0x02, 0x12, 0x60, 0x4c, 0x04, 0x12, 0x60, + 0xfc, 0x01, 0x12, 0x60, 0x10, 0x04, 0x12, 0x60, 0x80, 0x03, 0x12, 0x60, + 0x74, 0x06, 0x12, 0x60, 0x84, 0x03, 0x12, 0x60, 0x7c, 0x06, 0x12, 0x60, + 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xf0, 0xc8, 0xfe, 0x56, 0x86, 0xf1, + 0x89, 0xad, 0xd0, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xc4, 0xd6, 0x55, + 0xfe, 0x56, 0xd0, 0xd3, 0xcd, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf0, 0xc8, + 0xfe, 0x56, 0x86, 0xf1, 0x89, 0xad, 0xd0, 0xc6, 0xce, 0xd6, 0xf0, 0xf9, + 0x51, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf0, 0xc8, 0xfe, 0x56, 0x86, 0xf1, + 0x89, 0xad, 0xd0, 0xfe, 0x56, 0xfd, 0x55, 0xd6, 0xd0, 0xd6, 0xed, 0xd6, + 0xfe, 0x56, 0xfd, 0xd0, 0xd6, 0xf0, 0xc8, 0xac, 0xc4, 0xd6, 0x55, 0xfe, + 0x56, 0xd0, 0xc4, 0xd3, 0xcd, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf0, 0xc8, + 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, + 0xd0, 0xa4, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, + 0xcd, 0xd6, 0xfd, 0xfe, 0x56, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0xf0, 0xc8, + 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, + 0xd0, 0xcd, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0xce, 0xd6, 0x55, 0xfe, + 0x56, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xc6, + 0xce, 0xd6, 0xf0, 0xf9, 0x51, 0x91, 0xf9, 0x51, 0x81, 0xc5, 0xc4, 0xd6, + 0xfe, 0x56, 0xfd, 0xd0, 0xd6, 0xf0, 0xc8, 0xfe, 0x56, 0x86, 0xf1, 0x89, + 0xad, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0xce, 0xfe, 0x56, 0x55, + 0xd6, 0xd0, 0xd6, 0xd0, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xfe, 0x56, 0x55, + 0xd6, 0xd0, 0xd6, 0xd0, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xd6, 0xf1, 0xf8, + 0x50, 0x81, 0xc5, 0xf8, 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf1, 0xf8, + 0x50, 0x81, 0xc5, 0xf8, 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xfe, 0x56, 0x55, 0xd6, 0xd0, 0xc6, 0x00, + 0xce, 0xfe, 0x56, 0x55, 0xd6, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0x55, 0xfe, + 0x56, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x52, 0xfa, 0xea, 0xd6, 0x55, 0x56, + 0xd0, 0xd6, 0xc1, 0xad, 0xcd, 0xc1, 0xad, 0xcd, 0xd6, 0xc1, 0xad, 0xcd, + 0xc1, 0xd6, 0x52, 0xfa, 0xea, 0xd6, 0xc1, 0xcd, 0xd6, 0xc1, 0xc1, 0xcd, + 0xd6, 0xc1, 0xad, 0xcd, 0xc1, 0xd6, 0x52, 0xfa, 0xea, 0xd6, 0xfd, 0xfe, + 0x56, 0xd0, 0xd6, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xd6, 0xd0, 0xc6, + 0xce, 0xd6, 0xfd, 0xfe, 0x56, 0xd0, 0xd6, 0xd0, 0xd6, 0x55, 0xfe, 0x56, + 0xd0, 0xd6, 0xd0, 0xd6, 0x52, 0xfa, 0xea, 0xd6, 0x52, 0xfa, 0xea, 0xd6, + 0xc1, 0xad, 0xcd, 0xc1, 0xad, 0xcd, 0xd6, 0x98, 0x58, 0x52, 0xfa, 0x82, + 0x48, 0xad, 0xcd, 0x98, 0x58, 0x52, 0xfa, 0x82, 0x48, 0xad, 0xcd, 0xd6, + 0xc1, 0xad, 0xcd, 0xc1, 0xd6, 0xc1, 0xd6, 0xf0, 0x52, 0xfa, 0x82, 0x92, + 0xc5, 0xc1, 0xcd, 0xd6, 0x55, 0x56, 0xd0, 0xd6, 0x52, 0xfa, 0xea, 0xc6, + 0xce, 0xd6, 0xf4, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xc4, 0xc6, 0x00, + 0xce, 0xd6, 0xc1, 0xc6, 0xce, 0xa0, 0xc6, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x14, 0x30, 0x14, 0x30, 0x08, 0x00, + 0x00, 0x00, 0x08, 0x14, 0x30, 0x14, 0x30, 0x20, 0x00, 0x01, 0x21, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x14, 0x30, 0x28, 0x00, 0x0a, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x07, 0x00, + 0x00, 0x00, 0x04, 0x14, 0x30, 0x14, 0x30, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x00, 0x00, 0x00, 0x10, 0x2c, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x02, 0x00, 0x00, 0x80, 0x00, 0x14, 0x30, 0x14, 0x30, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x30, 0x02, + 0x00, 0x20, 0x30, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xbc, + 0x00, 0x02, 0x00, 0x1c, 0x30, 0x30, 0x2f, 0x02, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x14, 0x30, 0x20, 0x29, 0x00, 0x0a, 0x40, 0x00, 0x00, + 0x00, 0x01, 0x03, 0x00, 0x24, 0x00, 0x25, 0x00, 0x00, 0x06, 0x00, 0x02, + 0x00, 0x14, 0x30, 0x03, 0x00, 0x50, 0x00, 0x10, 0x00, 0xff, 0x00, 0x00, + 0x02, 0x00, 0x20, 0x30, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x50, 0x00, + 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x0f, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x20, 0x30, 0x30, 0x00, 0x00, 0x00, 0xff, 0x03, + 0x00, 0x50, 0x00, 0x02, 0x00, 0x14, 0x30, 0x1b, 0x00, 0x30, 0x00, 0x00, + 0x03, 0x00, 0x24, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x20, 0x00, 0x00, 0x01, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x14, 0x30, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, + 0x00, 0x10, 0x2d, 0x00, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x20, 0x00, 0x21, 0x2e, 0x03, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0xbc, 0x00, 0x02, 0x00, 0x14, 0x30, 0x01, 0x00, + 0x00, 0x40, 0x00, 0x14, 0x30, 0x14, 0x30, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x58, 0x00, 0x07, 0x00, 0x58, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x58, 0x00, + 0x07, 0x00, 0x58, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, + 0x00, 0x01, 0x26, 0x00, 0x00, 0x00, 0x02, 0x27, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x00, 0x00, 0x00, 0x01, 0x26, 0x00, 0x00, 0x00, 0x02, 0x27, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x58, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x07, 0x00, 0x58, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x14, 0x30, 0x00, 0x01, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x14, 0x30, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x04, 0x00, 0xff, 0x1f, 0xdf, 0xf7, 0x94, 0x00, 0x0e, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x80, 0x0d, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x10, + 0x0c, 0x00, 0x8c, 0x00, 0x00, 0x10, 0x0c, 0x00, 0x0c, 0x00, 0x24, 0x00, + 0x02, 0x02, 0x0c, 0x00, 0xa4, 0x00, 0x02, 0x02, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x07, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf6, 0x00, + 0x0b, 0x00, 0x01, 0x00, 0x00, 0x02, 0x0e, 0x00, 0x00, 0x40, 0xc5, 0x00, + 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x20, 0x0c, 0x00, 0x8c, 0x00, 0x00, 0x20, + 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x90, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x38, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x07, 0x00, 0x40, 0x00, + 0x00, 0x01, 0x06, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, + 0x07, 0x00, 0x38, 0x00, 0x06, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x00, 0x07, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x07, 0x0c, 0x00, + 0x0c, 0x00, 0x10, 0x10, 0x0c, 0x00, 0x8c, 0x00, 0x10, 0x10, 0x0c, 0x00, + 0x0c, 0x00, 0x23, 0x00, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x0c, 0x00, + 0xa3, 0x00, 0x01, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x0c, 0x00, 0x0c, 0x00, + 0x24, 0x00, 0x00, 0x02, 0x0c, 0x00, 0xa4, 0x00, 0x00, 0x02, 0x0b, 0x00, + 0x0e, 0x00, 0x40, 0x40, 0x02, 0x00, 0x30, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x06, 0x06, 0x62, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x80, 0x0d, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x28, 0x30, 0x2f, 0x00, 0x00, 0x01, 0x2e, 0x00, + 0x00, 0x01, 0x0b, 0x00, 0x01, 0x00, 0x02, 0x02, 0x00, 0x01, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x29, 0x5d, 0x25, + 0x00, 0x00, 0x22, 0x60, 0x10, 0x00, 0x22, 0x60, 0x31, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x22, 0x60, 0x88, 0x03, 0x22, 0x60, + 0xb4, 0x01, 0x22, 0x60, 0xa0, 0x03, 0x22, 0x60, 0xcc, 0x01, 0x22, 0x60, + 0xc4, 0x03, 0x22, 0x60, 0x40, 0x02, 0x22, 0x60, 0x80, 0x04, 0x22, 0x60, + 0x68, 0x02, 0x22, 0x60, 0xc0, 0x04, 0x22, 0x60, 0x74, 0x02, 0x22, 0x60, + 0xd0, 0x04, 0x22, 0x60, 0x80, 0x02, 0x22, 0x60, 0xe0, 0x04, 0x22, 0x60, + 0x84, 0x02, 0x22, 0x60, 0xe4, 0x04, 0x22, 0x60, 0x88, 0x02, 0x22, 0x60, + 0xe8, 0x04, 0x22, 0x60, 0x8c, 0x02, 0x22, 0x60, 0xec, 0x04, 0x22, 0x60, + 0x90, 0x02, 0x22, 0x60, 0xf0, 0x04, 0x22, 0x60, 0x94, 0x02, 0x22, 0x60, + 0xf4, 0x04, 0x22, 0x60, 0x98, 0x02, 0x22, 0x60, 0xf8, 0x04, 0x22, 0x60, + 0xa4, 0x02, 0x22, 0x60, 0x08, 0x05, 0x22, 0x60, 0xb0, 0x02, 0x22, 0x60, + 0x18, 0x05, 0x22, 0x60, 0xb4, 0x02, 0x22, 0x60, 0x1c, 0x05, 0x22, 0x60, + 0xb8, 0x02, 0x22, 0x60, 0x20, 0x05, 0x22, 0x60, 0xbc, 0x02, 0x22, 0x60, + 0x24, 0x05, 0x22, 0x60, 0xc0, 0x02, 0x22, 0x60, 0x28, 0x05, 0x22, 0x60, + 0xc4, 0x02, 0x22, 0x60, 0x2c, 0x05, 0x22, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x02, 0x22, 0x60, 0x68, 0x05, 0x22, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x02, 0x22, 0x60, + 0x6c, 0x05, 0x22, 0x60, 0x2c, 0x03, 0x22, 0x60, 0xe4, 0x05, 0x22, 0x60, + 0x74, 0x03, 0x22, 0x60, 0x68, 0x06, 0x22, 0x60, 0x7c, 0x03, 0x22, 0x60, + 0x70, 0x06, 0x22, 0x60, 0xc8, 0x02, 0x22, 0x60, 0x30, 0x05, 0x22, 0x60, + 0xcc, 0x02, 0x22, 0x60, 0x34, 0x05, 0x22, 0x60, 0xd0, 0x02, 0x22, 0x60, + 0x38, 0x05, 0x22, 0x60, 0xd8, 0x02, 0x22, 0x60, 0x44, 0x05, 0x22, 0x60, + 0xc0, 0x01, 0x22, 0x60, 0xb4, 0x03, 0x22, 0x60, 0x38, 0x02, 0x22, 0x60, + 0x74, 0x04, 0x22, 0x60, 0xe0, 0x02, 0x22, 0x60, 0x50, 0x05, 0x22, 0x60, + 0xe8, 0x02, 0x22, 0x60, 0x5c, 0x05, 0x22, 0x60, 0xd4, 0x01, 0x22, 0x60, + 0xd0, 0x03, 0x22, 0x60, 0x48, 0x02, 0x22, 0x60, 0x8c, 0x04, 0x22, 0x60, + 0x20, 0x02, 0x22, 0x60, 0x4c, 0x04, 0x22, 0x60, 0xfc, 0x01, 0x22, 0x60, + 0x10, 0x04, 0x22, 0x60, 0x80, 0x03, 0x22, 0x60, 0x74, 0x06, 0x22, 0x60, + 0x84, 0x03, 0x22, 0x60, 0x7c, 0x06, 0x22, 0x60, 0xce, 0xd6, 0x55, 0xfe, + 0x56, 0xd0, 0xf0, 0xc8, 0xfe, 0x56, 0x86, 0xf1, 0x89, 0xad, 0xd0, 0xc4, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xc4, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xd3, + 0xcd, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf0, 0xc8, 0xfe, 0x56, 0x86, 0xf1, + 0x89, 0xad, 0xd0, 0xc6, 0xce, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xc6, + 0xce, 0xd6, 0xf0, 0xc8, 0xfe, 0x56, 0x86, 0xf1, 0x89, 0xad, 0xd0, 0xfe, + 0x56, 0xfd, 0x55, 0xd6, 0xd0, 0xd6, 0xed, 0xd6, 0xfe, 0x56, 0xfd, 0xd0, + 0xd6, 0xf0, 0xc8, 0xac, 0xc4, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc4, 0xd3, + 0xcd, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, + 0xd0, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xa4, 0xad, 0xfe, + 0x56, 0xd6, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xcd, 0xd6, 0xfd, 0xfe, + 0x56, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, + 0xd0, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xcd, 0xd6, 0x55, + 0xfe, 0x56, 0xd0, 0xc6, 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0x00, + 0xce, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf0, 0xf9, + 0x51, 0x91, 0xf9, 0x51, 0x81, 0xc5, 0xc4, 0xd6, 0xfe, 0x56, 0xfd, 0xd0, + 0xd6, 0xf0, 0xc8, 0xfe, 0x56, 0x86, 0xf1, 0x89, 0xad, 0xd0, 0xd6, 0x55, + 0xfe, 0x56, 0xd0, 0xc6, 0xce, 0xfe, 0x56, 0x55, 0xd6, 0xd0, 0xd6, 0xd0, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xfe, 0x56, 0x55, 0xd6, 0xd0, 0xd6, 0xd0, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xd6, 0xf1, 0xf8, 0x50, 0x81, 0xc5, 0xf8, + 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf1, 0xf8, 0x50, 0x81, 0xc5, 0xf8, + 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xfe, 0x56, 0x55, 0xd6, 0xd0, 0xc6, 0x00, 0xce, 0xfe, 0x56, 0x55, + 0xd6, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0x00, + 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0x52, 0xfa, 0xea, 0xd6, 0x55, 0x56, 0xd0, 0xd6, 0xc1, 0xad, + 0xcd, 0xc1, 0xad, 0xcd, 0xd6, 0xc1, 0xad, 0xcd, 0xc1, 0xd6, 0x52, 0xfa, + 0xea, 0xd6, 0xc1, 0xcd, 0xd6, 0xc1, 0xc1, 0xcd, 0xd6, 0xc1, 0xad, 0xcd, + 0xc1, 0xd6, 0x52, 0xfa, 0xea, 0xd6, 0xfd, 0xfe, 0x56, 0xd0, 0xd6, 0xd0, + 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xd6, 0xd0, 0xc6, 0xce, 0xd6, 0xfd, 0xfe, + 0x56, 0xd0, 0xd6, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xd6, 0xd0, 0xd6, + 0x52, 0xfa, 0xea, 0xd6, 0x52, 0xfa, 0xea, 0xd6, 0xc1, 0xad, 0xcd, 0xc1, + 0xad, 0xcd, 0xd6, 0x98, 0x58, 0x52, 0xfa, 0x82, 0x48, 0xad, 0xcd, 0x98, + 0x58, 0x52, 0xfa, 0x82, 0x48, 0xad, 0xcd, 0xd6, 0xc1, 0xad, 0xcd, 0xc1, + 0xd6, 0xc1, 0xd6, 0xf0, 0x52, 0xfa, 0x82, 0x92, 0xc5, 0xc1, 0xcd, 0xd6, + 0x55, 0x56, 0xd0, 0xd6, 0x52, 0xfa, 0xea, 0xc6, 0xce, 0xd6, 0xf4, 0xc4, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xc4, 0xc6, 0x00, 0xce, 0xd6, 0xc1, 0xc6, + 0xce, 0xa0, 0xc6, 0x00, 0x00, 0x01, 0x02, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x14, 0x30, 0x14, 0x30, 0x08, 0x00, 0x00, 0x00, 0x08, 0x14, + 0x30, 0x14, 0x30, 0x20, 0x00, 0x01, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x14, 0x30, 0x28, 0x00, 0x0a, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x07, 0x00, 0x00, 0x00, 0x04, 0x14, + 0x30, 0x14, 0x30, 0x00, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, + 0x00, 0x10, 0x2c, 0x00, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x02, 0x00, + 0x00, 0x80, 0x00, 0x14, 0x30, 0x14, 0x30, 0x00, 0x00, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x30, 0x02, 0x00, 0x20, 0x30, 0x03, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x02, 0x00, 0x1c, + 0x30, 0x30, 0x2f, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x14, + 0x30, 0x20, 0x29, 0x00, 0x0a, 0x40, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, + 0x24, 0x00, 0x25, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x14, 0x30, 0x03, + 0x00, 0x50, 0x00, 0x10, 0x00, 0xff, 0x00, 0x00, 0x02, 0x00, 0x20, 0x30, + 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x50, 0x00, 0x03, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x20, 0x30, 0x30, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x50, 0x00, 0x02, + 0x00, 0x14, 0x30, 0x1b, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x24, 0x00, + 0x0f, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, 0x10, 0x2d, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x20, 0x00, 0x21, 0x2e, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0xbc, 0x00, 0x02, 0x00, 0x14, 0x30, 0x01, 0x00, 0x00, 0x40, 0x00, 0x14, + 0x30, 0x14, 0x30, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x58, 0x00, 0x07, 0x00, 0x58, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x58, 0x00, 0x07, 0x00, 0x58, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, 0x01, 0x26, 0x00, + 0x00, 0x00, 0x02, 0x27, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, + 0x00, 0x01, 0x26, 0x00, 0x00, 0x00, 0x02, 0x27, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x06, 0x00, 0x58, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x07, 0x00, 0x58, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x10, 0x14, 0x30, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x14, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, + 0xff, 0x1f, 0xdf, 0xf7, 0x94, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x80, 0x0d, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x10, 0x0c, 0x00, 0x8c, 0x00, + 0x00, 0x10, 0x0c, 0x00, 0x0c, 0x00, 0x24, 0x00, 0x02, 0x02, 0x0c, 0x00, + 0xa4, 0x00, 0x02, 0x02, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x07, + 0x0b, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf6, 0x00, 0x0b, 0x00, 0x01, 0x00, + 0x00, 0x02, 0x0e, 0x00, 0x00, 0x40, 0xc5, 0x00, 0x0c, 0x00, 0x0c, 0x00, + 0x00, 0x20, 0x0c, 0x00, 0x8c, 0x00, 0x00, 0x20, 0x04, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x90, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x38, 0x00, 0x07, 0x00, 0x38, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x40, 0x00, 0x07, 0x00, 0x40, 0x00, 0x00, 0x01, 0x06, 0x00, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x38, 0x00, + 0x06, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x07, 0x00, + 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x0d, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x10, 0x07, 0x0c, 0x00, 0x0c, 0x00, 0x10, 0x10, + 0x0c, 0x00, 0x8c, 0x00, 0x10, 0x10, 0x0c, 0x00, 0x0c, 0x00, 0x23, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x0c, 0x00, 0xa3, 0x00, 0x01, 0x00, + 0x00, 0x00, 0xa3, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x24, 0x00, 0x00, 0x02, + 0x0c, 0x00, 0xa4, 0x00, 0x00, 0x02, 0x0b, 0x00, 0x0e, 0x00, 0x40, 0x40, + 0x02, 0x00, 0x30, 0x30, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x06, + 0x06, 0x62, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x0d, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x28, 0x30, 0x2f, 0x00, 0x00, 0x01, 0x2e, 0x00, 0x00, 0x01, 0x0b, 0x00, + 0x01, 0x00, 0x02, 0x02, 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xac, 0xf5, 0x49, 0xc5, 0x00, 0x00, 0x32, 0x60, + 0x10, 0x00, 0x32, 0x60, 0x31, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x32, 0x60, 0x88, 0x03, 0x32, 0x60, 0xb4, 0x01, 0x32, 0x60, + 0xa0, 0x03, 0x32, 0x60, 0xcc, 0x01, 0x32, 0x60, 0xc4, 0x03, 0x32, 0x60, + 0x40, 0x02, 0x32, 0x60, 0x80, 0x04, 0x32, 0x60, 0x68, 0x02, 0x32, 0x60, + 0xc0, 0x04, 0x32, 0x60, 0x74, 0x02, 0x32, 0x60, 0xd0, 0x04, 0x32, 0x60, + 0x80, 0x02, 0x32, 0x60, 0xe0, 0x04, 0x32, 0x60, 0x84, 0x02, 0x32, 0x60, + 0xe4, 0x04, 0x32, 0x60, 0x88, 0x02, 0x32, 0x60, 0xe8, 0x04, 0x32, 0x60, + 0x8c, 0x02, 0x32, 0x60, 0xec, 0x04, 0x32, 0x60, 0x90, 0x02, 0x32, 0x60, + 0xf0, 0x04, 0x32, 0x60, 0x94, 0x02, 0x32, 0x60, 0xf4, 0x04, 0x32, 0x60, + 0x98, 0x02, 0x32, 0x60, 0xf8, 0x04, 0x32, 0x60, 0xa4, 0x02, 0x32, 0x60, + 0x08, 0x05, 0x32, 0x60, 0xb0, 0x02, 0x32, 0x60, 0x18, 0x05, 0x32, 0x60, + 0xb4, 0x02, 0x32, 0x60, 0x1c, 0x05, 0x32, 0x60, 0xb8, 0x02, 0x32, 0x60, + 0x20, 0x05, 0x32, 0x60, 0xbc, 0x02, 0x32, 0x60, 0x24, 0x05, 0x32, 0x60, + 0xc0, 0x02, 0x32, 0x60, 0x28, 0x05, 0x32, 0x60, 0xc4, 0x02, 0x32, 0x60, + 0x2c, 0x05, 0x32, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x02, 0x32, 0x60, 0x68, 0x05, 0x32, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf4, 0x02, 0x32, 0x60, 0x6c, 0x05, 0x32, 0x60, + 0x2c, 0x03, 0x32, 0x60, 0xe4, 0x05, 0x32, 0x60, 0x74, 0x03, 0x32, 0x60, + 0x68, 0x06, 0x32, 0x60, 0x7c, 0x03, 0x32, 0x60, 0x70, 0x06, 0x32, 0x60, + 0xc8, 0x02, 0x32, 0x60, 0x30, 0x05, 0x32, 0x60, 0xcc, 0x02, 0x32, 0x60, + 0x34, 0x05, 0x32, 0x60, 0xd0, 0x02, 0x32, 0x60, 0x38, 0x05, 0x32, 0x60, + 0xd8, 0x02, 0x32, 0x60, 0x44, 0x05, 0x32, 0x60, 0xc0, 0x01, 0x32, 0x60, + 0xb4, 0x03, 0x32, 0x60, 0x38, 0x02, 0x32, 0x60, 0x74, 0x04, 0x32, 0x60, + 0xe0, 0x02, 0x32, 0x60, 0x50, 0x05, 0x32, 0x60, 0xe8, 0x02, 0x32, 0x60, + 0x5c, 0x05, 0x32, 0x60, 0xd4, 0x01, 0x32, 0x60, 0xd0, 0x03, 0x32, 0x60, + 0x48, 0x02, 0x32, 0x60, 0x8c, 0x04, 0x32, 0x60, 0x20, 0x02, 0x32, 0x60, + 0x4c, 0x04, 0x32, 0x60, 0xfc, 0x01, 0x32, 0x60, 0x10, 0x04, 0x32, 0x60, + 0x80, 0x03, 0x32, 0x60, 0x74, 0x06, 0x32, 0x60, 0x84, 0x03, 0x32, 0x60, + 0x7c, 0x06, 0x32, 0x60, 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xf0, 0xc8, + 0xfe, 0x56, 0x86, 0xf1, 0x89, 0xad, 0xd0, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xc4, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xd3, 0xcd, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0xf0, 0xc8, 0xfe, 0x56, 0x86, 0xf1, 0x89, 0xad, 0xd0, 0xc6, + 0xce, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf0, 0xc8, + 0xfe, 0x56, 0x86, 0xf1, 0x89, 0xad, 0xd0, 0xfe, 0x56, 0xfd, 0x55, 0xd6, + 0xd0, 0xd6, 0xed, 0xd6, 0xfe, 0x56, 0xfd, 0xd0, 0xd6, 0xf0, 0xc8, 0xac, + 0xc4, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc4, 0xd3, 0xcd, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xd6, 0xf0, 0xc8, + 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xa4, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xd6, + 0x55, 0xfe, 0x56, 0xd0, 0xcd, 0xd6, 0xfd, 0xfe, 0x56, 0xd0, 0xc6, 0x00, + 0xce, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xd6, 0xf0, 0xc8, + 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xcd, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, + 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0xf0, 0xf9, + 0x51, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf0, 0xf9, 0x51, 0x91, 0xf9, 0x51, + 0x81, 0xc5, 0xc4, 0xd6, 0xfe, 0x56, 0xfd, 0xd0, 0xd6, 0xf0, 0xc8, 0xfe, + 0x56, 0x86, 0xf1, 0x89, 0xad, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, + 0xce, 0xfe, 0x56, 0x55, 0xd6, 0xd0, 0xd6, 0xd0, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xfe, 0x56, 0x55, 0xd6, 0xd0, 0xd6, 0xd0, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xd6, 0xf1, 0xf8, 0x50, 0x81, 0xc5, 0xf8, 0x50, 0x81, 0xc5, 0xc6, + 0xce, 0xd6, 0xf1, 0xf8, 0x50, 0x81, 0xc5, 0xf8, 0x50, 0x81, 0xc5, 0xc6, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xfe, 0x56, 0x55, + 0xd6, 0xd0, 0xc6, 0x00, 0xce, 0xfe, 0x56, 0x55, 0xd6, 0xd0, 0xc6, 0x00, + 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0x55, 0xfe, + 0x56, 0xd0, 0xc6, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x52, 0xfa, + 0xea, 0xd6, 0x55, 0x56, 0xd0, 0xd6, 0xc1, 0xad, 0xcd, 0xc1, 0xad, 0xcd, + 0xd6, 0xc1, 0xad, 0xcd, 0xc1, 0xd6, 0x52, 0xfa, 0xea, 0xd6, 0xc1, 0xcd, + 0xd6, 0xc1, 0xc1, 0xcd, 0xd6, 0xc1, 0xad, 0xcd, 0xc1, 0xd6, 0x52, 0xfa, + 0xea, 0xd6, 0xfd, 0xfe, 0x56, 0xd0, 0xd6, 0xd0, 0xd6, 0x55, 0xfe, 0x56, + 0xd0, 0xd6, 0xd0, 0xc6, 0xce, 0xd6, 0xfd, 0xfe, 0x56, 0xd0, 0xd6, 0xd0, + 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xd6, 0xd0, 0xd6, 0x52, 0xfa, 0xea, 0xd6, + 0x52, 0xfa, 0xea, 0xd6, 0xc1, 0xad, 0xcd, 0xc1, 0xad, 0xcd, 0xd6, 0x98, + 0x58, 0x52, 0xfa, 0x82, 0x48, 0xad, 0xcd, 0x98, 0x58, 0x52, 0xfa, 0x82, + 0x48, 0xad, 0xcd, 0xd6, 0xc1, 0xad, 0xcd, 0xc1, 0xd6, 0xc1, 0xd6, 0xf0, + 0x52, 0xfa, 0x82, 0x92, 0xc5, 0xc1, 0xcd, 0xd6, 0x55, 0x56, 0xd0, 0xd6, + 0x52, 0xfa, 0xea, 0xc6, 0xce, 0xd6, 0xf4, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xc4, 0xc6, 0x00, 0xce, 0xd6, 0xc1, 0xc6, 0xce, 0xa0, 0xc6, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x14, 0x30, + 0x14, 0x30, 0x08, 0x00, 0x00, 0x00, 0x08, 0x14, 0x30, 0x14, 0x30, 0x20, + 0x00, 0x01, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x14, + 0x30, 0x28, 0x00, 0x0a, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x07, 0x00, 0x00, 0x00, 0x04, 0x14, 0x30, 0x14, 0x30, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, 0x10, 0x2c, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x02, 0x00, 0x00, 0x80, 0x00, 0x14, + 0x30, 0x14, 0x30, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x14, 0x30, 0x02, 0x00, 0x20, 0x30, 0x03, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0xbc, 0x00, 0x02, 0x00, 0x1c, 0x30, 0x30, 0x2f, 0x02, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x14, 0x30, 0x20, 0x29, 0x00, + 0x0a, 0x40, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x24, 0x00, 0x25, 0x00, + 0x00, 0x06, 0x00, 0x02, 0x00, 0x14, 0x30, 0x03, 0x00, 0x50, 0x00, 0x10, + 0x00, 0xff, 0x00, 0x00, 0x02, 0x00, 0x20, 0x30, 0x00, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x50, 0x00, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x20, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x20, 0x30, 0x30, 0x00, + 0x00, 0x00, 0xff, 0x03, 0x00, 0x50, 0x00, 0x02, 0x00, 0x14, 0x30, 0x1b, + 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x24, 0x00, 0x0f, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x30, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x00, 0x00, 0x00, 0x10, 0x2d, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x20, 0x00, 0x21, 0x2e, + 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0xbc, 0x00, 0x02, 0x00, + 0x14, 0x30, 0x01, 0x00, 0x00, 0x40, 0x00, 0x14, 0x30, 0x14, 0x30, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x58, 0x00, + 0x07, 0x00, 0x58, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x58, 0x00, 0x07, 0x00, 0x58, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x00, 0x00, 0x00, 0x01, 0x26, 0x00, 0x00, 0x00, 0x02, 0x27, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, 0x01, 0x26, 0x00, + 0x00, 0x00, 0x02, 0x27, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x58, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x07, 0x00, 0x58, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x14, 0x30, + 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x14, 0x30, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0xff, 0x1f, 0xdf, 0xf7, + 0x94, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x01, 0x00, 0x80, 0x0d, 0x0c, 0x00, + 0x0c, 0x00, 0x00, 0x10, 0x0c, 0x00, 0x8c, 0x00, 0x00, 0x10, 0x0c, 0x00, + 0x0c, 0x00, 0x24, 0x00, 0x02, 0x02, 0x0c, 0x00, 0xa4, 0x00, 0x02, 0x02, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x07, 0x0b, 0x00, 0x00, 0x00, + 0x00, 0x06, 0xf6, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x00, 0x02, 0x0e, 0x00, + 0x00, 0x40, 0xc5, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x20, 0x0c, 0x00, + 0x8c, 0x00, 0x00, 0x20, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x90, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, + 0x38, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, + 0x07, 0x00, 0x40, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x38, 0x00, 0x06, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x07, 0x00, 0x40, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x10, 0x07, 0x0c, 0x00, 0x0c, 0x00, 0x10, 0x10, 0x0c, 0x00, 0x8c, 0x00, + 0x10, 0x10, 0x0c, 0x00, 0x0c, 0x00, 0x23, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x23, 0x00, 0x0c, 0x00, 0xa3, 0x00, 0x01, 0x00, 0x00, 0x00, 0xa3, 0x00, + 0x0c, 0x00, 0x0c, 0x00, 0x24, 0x00, 0x00, 0x02, 0x0c, 0x00, 0xa4, 0x00, + 0x00, 0x02, 0x0b, 0x00, 0x0e, 0x00, 0x40, 0x40, 0x02, 0x00, 0x30, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x06, 0x06, 0x62, 0x00, 0x0e, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x0d, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x94, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x28, 0x30, 0x2f, 0x00, + 0x00, 0x01, 0x2e, 0x00, 0x00, 0x01, 0x0b, 0x00, 0x01, 0x00, 0x02, 0x02, + 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8a, 0x41, 0xba, 0x9a, 0x00, 0x00, 0x42, 0x60, 0x10, 0x00, 0x42, 0x60, + 0x31, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x42, 0x60, + 0x88, 0x03, 0x42, 0x60, 0xb4, 0x01, 0x42, 0x60, 0xa0, 0x03, 0x42, 0x60, + 0xcc, 0x01, 0x42, 0x60, 0xc4, 0x03, 0x42, 0x60, 0x40, 0x02, 0x42, 0x60, + 0x80, 0x04, 0x42, 0x60, 0x68, 0x02, 0x42, 0x60, 0xc0, 0x04, 0x42, 0x60, + 0x74, 0x02, 0x42, 0x60, 0xd0, 0x04, 0x42, 0x60, 0x80, 0x02, 0x42, 0x60, + 0xe0, 0x04, 0x42, 0x60, 0x84, 0x02, 0x42, 0x60, 0xe4, 0x04, 0x42, 0x60, + 0x88, 0x02, 0x42, 0x60, 0xe8, 0x04, 0x42, 0x60, 0x8c, 0x02, 0x42, 0x60, + 0xec, 0x04, 0x42, 0x60, 0x90, 0x02, 0x42, 0x60, 0xf0, 0x04, 0x42, 0x60, + 0x94, 0x02, 0x42, 0x60, 0xf4, 0x04, 0x42, 0x60, 0x98, 0x02, 0x42, 0x60, + 0xf8, 0x04, 0x42, 0x60, 0xa4, 0x02, 0x42, 0x60, 0x08, 0x05, 0x42, 0x60, + 0xb0, 0x02, 0x42, 0x60, 0x18, 0x05, 0x42, 0x60, 0xb4, 0x02, 0x42, 0x60, + 0x1c, 0x05, 0x42, 0x60, 0xb8, 0x02, 0x42, 0x60, 0x20, 0x05, 0x42, 0x60, + 0xbc, 0x02, 0x42, 0x60, 0x24, 0x05, 0x42, 0x60, 0xc0, 0x02, 0x42, 0x60, + 0x28, 0x05, 0x42, 0x60, 0xc4, 0x02, 0x42, 0x60, 0x2c, 0x05, 0x42, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x02, 0x42, 0x60, + 0x68, 0x05, 0x42, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf4, 0x02, 0x42, 0x60, 0x6c, 0x05, 0x42, 0x60, 0x2c, 0x03, 0x42, 0x60, + 0xe4, 0x05, 0x42, 0x60, 0x74, 0x03, 0x42, 0x60, 0x68, 0x06, 0x42, 0x60, + 0x7c, 0x03, 0x42, 0x60, 0x70, 0x06, 0x42, 0x60, 0xc8, 0x02, 0x42, 0x60, + 0x30, 0x05, 0x42, 0x60, 0xcc, 0x02, 0x42, 0x60, 0x34, 0x05, 0x42, 0x60, + 0xd0, 0x02, 0x42, 0x60, 0x38, 0x05, 0x42, 0x60, 0xd8, 0x02, 0x42, 0x60, + 0x44, 0x05, 0x42, 0x60, 0xc0, 0x01, 0x42, 0x60, 0xb4, 0x03, 0x42, 0x60, + 0x38, 0x02, 0x42, 0x60, 0x74, 0x04, 0x42, 0x60, 0xe0, 0x02, 0x42, 0x60, + 0x50, 0x05, 0x42, 0x60, 0xe8, 0x02, 0x42, 0x60, 0x5c, 0x05, 0x42, 0x60, + 0xd4, 0x01, 0x42, 0x60, 0xd0, 0x03, 0x42, 0x60, 0x48, 0x02, 0x42, 0x60, + 0x8c, 0x04, 0x42, 0x60, 0x20, 0x02, 0x42, 0x60, 0x4c, 0x04, 0x42, 0x60, + 0xfc, 0x01, 0x42, 0x60, 0x10, 0x04, 0x42, 0x60, 0x80, 0x03, 0x42, 0x60, + 0x74, 0x06, 0x42, 0x60, 0x84, 0x03, 0x42, 0x60, 0x7c, 0x06, 0x42, 0x60, + 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xf0, 0xc8, 0xfe, 0x56, 0x86, 0xf1, + 0x89, 0xad, 0xd0, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xc4, 0xd6, 0x55, + 0xfe, 0x56, 0xd0, 0xd3, 0xcd, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf0, 0xc8, + 0xfe, 0x56, 0x86, 0xf1, 0x89, 0xad, 0xd0, 0xc6, 0xce, 0xd6, 0xf0, 0xf9, + 0x51, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf0, 0xc8, 0xfe, 0x56, 0x86, 0xf1, + 0x89, 0xad, 0xd0, 0xfe, 0x56, 0xfd, 0x55, 0xd6, 0xd0, 0xd6, 0xed, 0xd6, + 0xfe, 0x56, 0xfd, 0xd0, 0xd6, 0xf0, 0xc8, 0xac, 0xc4, 0xd6, 0x55, 0xfe, + 0x56, 0xd0, 0xc4, 0xd3, 0xcd, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf0, 0xc8, + 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, + 0xd0, 0xa4, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, + 0xcd, 0xd6, 0xfd, 0xfe, 0x56, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0xf0, 0xc8, + 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, + 0xd0, 0xcd, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0xce, 0xd6, 0x55, 0xfe, + 0x56, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xc6, + 0xce, 0xd6, 0xf0, 0xf9, 0x51, 0x91, 0xf9, 0x51, 0x81, 0xc5, 0xc4, 0xd6, + 0xfe, 0x56, 0xfd, 0xd0, 0xd6, 0xf0, 0xc8, 0xfe, 0x56, 0x86, 0xf1, 0x89, + 0xad, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0xce, 0xfe, 0x56, 0x55, + 0xd6, 0xd0, 0xd6, 0xd0, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xfe, 0x56, 0x55, + 0xd6, 0xd0, 0xd6, 0xd0, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xd6, 0xf1, 0xf8, + 0x50, 0x81, 0xc5, 0xf8, 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf1, 0xf8, + 0x50, 0x81, 0xc5, 0xf8, 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xfe, 0x56, 0x55, 0xd6, 0xd0, 0xc6, 0x00, + 0xce, 0xfe, 0x56, 0x55, 0xd6, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0x55, 0xfe, + 0x56, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x52, 0xfa, 0xea, 0xd6, 0x55, 0x56, + 0xd0, 0xd6, 0xc1, 0xad, 0xcd, 0xc1, 0xad, 0xcd, 0xd6, 0xc1, 0xad, 0xcd, + 0xc1, 0xd6, 0x52, 0xfa, 0xea, 0xd6, 0xc1, 0xcd, 0xd6, 0xc1, 0xc1, 0xcd, + 0xd6, 0xc1, 0xad, 0xcd, 0xc1, 0xd6, 0x52, 0xfa, 0xea, 0xd6, 0xfd, 0xfe, + 0x56, 0xd0, 0xd6, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xd6, 0xd0, 0xc6, + 0xce, 0xd6, 0xfd, 0xfe, 0x56, 0xd0, 0xd6, 0xd0, 0xd6, 0x55, 0xfe, 0x56, + 0xd0, 0xd6, 0xd0, 0xd6, 0x52, 0xfa, 0xea, 0xd6, 0x52, 0xfa, 0xea, 0xd6, + 0xc1, 0xad, 0xcd, 0xc1, 0xad, 0xcd, 0xd6, 0x98, 0x58, 0x52, 0xfa, 0x82, + 0x48, 0xad, 0xcd, 0x98, 0x58, 0x52, 0xfa, 0x82, 0x48, 0xad, 0xcd, 0xd6, + 0xc1, 0xad, 0xcd, 0xc1, 0xd6, 0xc1, 0xd6, 0xf0, 0x52, 0xfa, 0x82, 0x92, + 0xc5, 0xc1, 0xcd, 0xd6, 0x55, 0x56, 0xd0, 0xd6, 0x52, 0xfa, 0xea, 0xc6, + 0xce, 0xd6, 0xf4, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xc4, 0xc6, 0x00, + 0xce, 0xd6, 0xc1, 0xc6, 0xce, 0xa0, 0xc6, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x14, 0x30, 0x14, 0x30, 0x08, 0x00, + 0x00, 0x00, 0x08, 0x14, 0x30, 0x14, 0x30, 0x20, 0x00, 0x01, 0x21, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x14, 0x30, 0x28, 0x00, 0x0a, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x07, 0x00, + 0x00, 0x00, 0x04, 0x14, 0x30, 0x14, 0x30, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x00, 0x00, 0x00, 0x10, 0x2c, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x02, 0x00, 0x00, 0x80, 0x00, 0x14, 0x30, 0x14, 0x30, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x30, 0x02, + 0x00, 0x20, 0x30, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xbc, + 0x00, 0x02, 0x00, 0x1c, 0x30, 0x30, 0x2f, 0x02, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x14, 0x30, 0x20, 0x29, 0x00, 0x0a, 0x40, 0x00, 0x00, + 0x00, 0x01, 0x03, 0x00, 0x24, 0x00, 0x25, 0x00, 0x00, 0x06, 0x00, 0x02, + 0x00, 0x14, 0x30, 0x03, 0x00, 0x50, 0x00, 0x10, 0x00, 0xff, 0x00, 0x00, + 0x02, 0x00, 0x20, 0x30, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x50, 0x00, + 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x0f, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x20, 0x30, 0x30, 0x00, 0x00, 0x00, 0xff, 0x03, + 0x00, 0x50, 0x00, 0x02, 0x00, 0x14, 0x30, 0x1b, 0x00, 0x30, 0x00, 0x00, + 0x03, 0x00, 0x24, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x20, 0x00, 0x00, 0x01, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x14, 0x30, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, + 0x00, 0x10, 0x2d, 0x00, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x20, 0x00, 0x21, 0x2e, 0x03, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0xbc, 0x00, 0x02, 0x00, 0x14, 0x30, 0x01, 0x00, + 0x00, 0x40, 0x00, 0x14, 0x30, 0x14, 0x30, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x58, 0x00, 0x07, 0x00, 0x58, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x58, 0x00, + 0x07, 0x00, 0x58, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, + 0x00, 0x01, 0x26, 0x00, 0x00, 0x00, 0x02, 0x27, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x00, 0x00, 0x00, 0x01, 0x26, 0x00, 0x00, 0x00, 0x02, 0x27, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x58, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x07, 0x00, 0x58, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x14, 0x30, 0x00, 0x01, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x14, 0x30, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x04, 0x00, 0xff, 0x1f, 0xdf, 0xf7, 0x94, 0x00, 0x0e, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x80, 0x0d, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x10, + 0x0c, 0x00, 0x8c, 0x00, 0x00, 0x10, 0x0c, 0x00, 0x0c, 0x00, 0x24, 0x00, + 0x02, 0x02, 0x0c, 0x00, 0xa4, 0x00, 0x02, 0x02, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x07, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf6, 0x00, + 0x0b, 0x00, 0x01, 0x00, 0x00, 0x02, 0x0e, 0x00, 0x00, 0x40, 0xc5, 0x00, + 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x20, 0x0c, 0x00, 0x8c, 0x00, 0x00, 0x20, + 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x90, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x38, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x07, 0x00, 0x40, 0x00, + 0x00, 0x01, 0x06, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, + 0x07, 0x00, 0x38, 0x00, 0x06, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x00, 0x07, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x07, 0x0c, 0x00, + 0x0c, 0x00, 0x10, 0x10, 0x0c, 0x00, 0x8c, 0x00, 0x10, 0x10, 0x0c, 0x00, + 0x0c, 0x00, 0x23, 0x00, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x0c, 0x00, + 0xa3, 0x00, 0x01, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x0c, 0x00, 0x0c, 0x00, + 0x24, 0x00, 0x00, 0x02, 0x0c, 0x00, 0xa4, 0x00, 0x00, 0x02, 0x0b, 0x00, + 0x0e, 0x00, 0x40, 0x40, 0x02, 0x00, 0x30, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x06, 0x06, 0x62, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x80, 0x0d, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x28, 0x30, 0x2f, 0x00, 0x00, 0x01, 0x2e, 0x00, + 0x00, 0x01, 0x0b, 0x00, 0x01, 0x00, 0x02, 0x02, 0x00, 0x01, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0x50, 0xa1, 0x01, + 0x00, 0x00, 0x52, 0x60, 0x10, 0x00, 0x52, 0x60, 0x31, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x52, 0x60, 0x88, 0x03, 0x52, 0x60, + 0xb4, 0x01, 0x52, 0x60, 0xa0, 0x03, 0x52, 0x60, 0xcc, 0x01, 0x52, 0x60, + 0xc4, 0x03, 0x52, 0x60, 0x40, 0x02, 0x52, 0x60, 0x80, 0x04, 0x52, 0x60, + 0x68, 0x02, 0x52, 0x60, 0xc0, 0x04, 0x52, 0x60, 0x74, 0x02, 0x52, 0x60, + 0xd0, 0x04, 0x52, 0x60, 0x80, 0x02, 0x52, 0x60, 0xe0, 0x04, 0x52, 0x60, + 0x84, 0x02, 0x52, 0x60, 0xe4, 0x04, 0x52, 0x60, 0x88, 0x02, 0x52, 0x60, + 0xe8, 0x04, 0x52, 0x60, 0x8c, 0x02, 0x52, 0x60, 0xec, 0x04, 0x52, 0x60, + 0x90, 0x02, 0x52, 0x60, 0xf0, 0x04, 0x52, 0x60, 0x94, 0x02, 0x52, 0x60, + 0xf4, 0x04, 0x52, 0x60, 0x98, 0x02, 0x52, 0x60, 0xf8, 0x04, 0x52, 0x60, + 0xa4, 0x02, 0x52, 0x60, 0x08, 0x05, 0x52, 0x60, 0xb0, 0x02, 0x52, 0x60, + 0x18, 0x05, 0x52, 0x60, 0xb4, 0x02, 0x52, 0x60, 0x1c, 0x05, 0x52, 0x60, + 0xb8, 0x02, 0x52, 0x60, 0x20, 0x05, 0x52, 0x60, 0xbc, 0x02, 0x52, 0x60, + 0x24, 0x05, 0x52, 0x60, 0xc0, 0x02, 0x52, 0x60, 0x28, 0x05, 0x52, 0x60, + 0xc4, 0x02, 0x52, 0x60, 0x2c, 0x05, 0x52, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x02, 0x52, 0x60, 0x68, 0x05, 0x52, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x02, 0x52, 0x60, + 0x6c, 0x05, 0x52, 0x60, 0x2c, 0x03, 0x52, 0x60, 0xe4, 0x05, 0x52, 0x60, + 0x74, 0x03, 0x52, 0x60, 0x68, 0x06, 0x52, 0x60, 0x7c, 0x03, 0x52, 0x60, + 0x70, 0x06, 0x52, 0x60, 0xc8, 0x02, 0x52, 0x60, 0x30, 0x05, 0x52, 0x60, + 0xcc, 0x02, 0x52, 0x60, 0x34, 0x05, 0x52, 0x60, 0xd0, 0x02, 0x52, 0x60, + 0x38, 0x05, 0x52, 0x60, 0xd8, 0x02, 0x52, 0x60, 0x44, 0x05, 0x52, 0x60, + 0xc0, 0x01, 0x52, 0x60, 0xb4, 0x03, 0x52, 0x60, 0x38, 0x02, 0x52, 0x60, + 0x74, 0x04, 0x52, 0x60, 0xe0, 0x02, 0x52, 0x60, 0x50, 0x05, 0x52, 0x60, + 0xe8, 0x02, 0x52, 0x60, 0x5c, 0x05, 0x52, 0x60, 0xd4, 0x01, 0x52, 0x60, + 0xd0, 0x03, 0x52, 0x60, 0x48, 0x02, 0x52, 0x60, 0x8c, 0x04, 0x52, 0x60, + 0x20, 0x02, 0x52, 0x60, 0x4c, 0x04, 0x52, 0x60, 0xfc, 0x01, 0x52, 0x60, + 0x10, 0x04, 0x52, 0x60, 0x80, 0x03, 0x52, 0x60, 0x74, 0x06, 0x52, 0x60, + 0x84, 0x03, 0x52, 0x60, 0x7c, 0x06, 0x52, 0x60, 0xce, 0xd6, 0x55, 0xfe, + 0x56, 0xd0, 0xf0, 0xc8, 0xfe, 0x56, 0x86, 0xf1, 0x89, 0xad, 0xd0, 0xc4, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xc4, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xd3, + 0xcd, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf0, 0xc8, 0xfe, 0x56, 0x86, 0xf1, + 0x89, 0xad, 0xd0, 0xc6, 0xce, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xc6, + 0xce, 0xd6, 0xf0, 0xc8, 0xfe, 0x56, 0x86, 0xf1, 0x89, 0xad, 0xd0, 0xfe, + 0x56, 0xfd, 0x55, 0xd6, 0xd0, 0xd6, 0xed, 0xd6, 0xfe, 0x56, 0xfd, 0xd0, + 0xd6, 0xf0, 0xc8, 0xac, 0xc4, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc4, 0xd3, + 0xcd, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, + 0xd0, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xa4, 0xad, 0xfe, + 0x56, 0xd6, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xcd, 0xd6, 0xfd, 0xfe, + 0x56, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, + 0xd0, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xcd, 0xd6, 0x55, + 0xfe, 0x56, 0xd0, 0xc6, 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0x00, + 0xce, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf0, 0xf9, + 0x51, 0x91, 0xf9, 0x51, 0x81, 0xc5, 0xc4, 0xd6, 0xfe, 0x56, 0xfd, 0xd0, + 0xd6, 0xf0, 0xc8, 0xfe, 0x56, 0x86, 0xf1, 0x89, 0xad, 0xd0, 0xd6, 0x55, + 0xfe, 0x56, 0xd0, 0xc6, 0xce, 0xfe, 0x56, 0x55, 0xd6, 0xd0, 0xd6, 0xd0, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xfe, 0x56, 0x55, 0xd6, 0xd0, 0xd6, 0xd0, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xd6, 0xf1, 0xf8, 0x50, 0x81, 0xc5, 0xf8, + 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf1, 0xf8, 0x50, 0x81, 0xc5, 0xf8, + 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xfe, 0x56, 0x55, 0xd6, 0xd0, 0xc6, 0x00, 0xce, 0xfe, 0x56, 0x55, + 0xd6, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0x00, + 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0x52, 0xfa, 0xea, 0xd6, 0x55, 0x56, 0xd0, 0xd6, 0xc1, 0xad, + 0xcd, 0xc1, 0xad, 0xcd, 0xd6, 0xc1, 0xad, 0xcd, 0xc1, 0xd6, 0x52, 0xfa, + 0xea, 0xd6, 0xc1, 0xcd, 0xd6, 0xc1, 0xc1, 0xcd, 0xd6, 0xc1, 0xad, 0xcd, + 0xc1, 0xd6, 0x52, 0xfa, 0xea, 0xd6, 0xfd, 0xfe, 0x56, 0xd0, 0xd6, 0xd0, + 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xd6, 0xd0, 0xc6, 0xce, 0xd6, 0xfd, 0xfe, + 0x56, 0xd0, 0xd6, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xd6, 0xd0, 0xd6, + 0x52, 0xfa, 0xea, 0xd6, 0x52, 0xfa, 0xea, 0xd6, 0xc1, 0xad, 0xcd, 0xc1, + 0xad, 0xcd, 0xd6, 0x98, 0x58, 0x52, 0xfa, 0x82, 0x48, 0xad, 0xcd, 0x98, + 0x58, 0x52, 0xfa, 0x82, 0x48, 0xad, 0xcd, 0xd6, 0xc1, 0xad, 0xcd, 0xc1, + 0xd6, 0xc1, 0xd6, 0xf0, 0x52, 0xfa, 0x82, 0x92, 0xc5, 0xc1, 0xcd, 0xd6, + 0x55, 0x56, 0xd0, 0xd6, 0x52, 0xfa, 0xea, 0xc6, 0xce, 0xd6, 0xf4, 0xc4, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xc4, 0xc6, 0x00, 0xce, 0xd6, 0xc1, 0xc6, + 0xce, 0xa0, 0xc6, 0x00, 0x00, 0x01, 0x02, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x14, 0x30, 0x14, 0x30, 0x08, 0x00, 0x00, 0x00, 0x08, 0x14, + 0x30, 0x14, 0x30, 0x20, 0x00, 0x01, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x14, 0x30, 0x28, 0x00, 0x0a, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x07, 0x00, 0x00, 0x00, 0x04, 0x14, + 0x30, 0x14, 0x30, 0x00, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, + 0x00, 0x10, 0x2c, 0x00, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x02, 0x00, + 0x00, 0x80, 0x00, 0x14, 0x30, 0x14, 0x30, 0x00, 0x00, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x30, 0x02, 0x00, 0x20, 0x30, 0x03, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x02, 0x00, 0x1c, + 0x30, 0x30, 0x2f, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x14, + 0x30, 0x20, 0x29, 0x00, 0x0a, 0x40, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, + 0x24, 0x00, 0x25, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x14, 0x30, 0x03, + 0x00, 0x50, 0x00, 0x10, 0x00, 0xff, 0x00, 0x00, 0x02, 0x00, 0x20, 0x30, + 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x50, 0x00, 0x03, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x20, 0x30, 0x30, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x50, 0x00, 0x02, + 0x00, 0x14, 0x30, 0x1b, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x24, 0x00, + 0x0f, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, 0x10, 0x2d, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x20, 0x00, 0x21, 0x2e, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0xbc, 0x00, 0x02, 0x00, 0x14, 0x30, 0x01, 0x00, 0x00, 0x40, 0x00, 0x14, + 0x30, 0x14, 0x30, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x58, 0x00, 0x07, 0x00, 0x58, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x58, 0x00, 0x07, 0x00, 0x58, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, 0x01, 0x26, 0x00, + 0x00, 0x00, 0x02, 0x27, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, + 0x00, 0x01, 0x26, 0x00, 0x00, 0x00, 0x02, 0x27, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x06, 0x00, 0x58, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x07, 0x00, 0x58, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x10, 0x14, 0x30, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x14, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, + 0xff, 0x1f, 0xdf, 0xf7, 0x94, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x80, 0x0d, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x10, 0x0c, 0x00, 0x8c, 0x00, + 0x00, 0x10, 0x0c, 0x00, 0x0c, 0x00, 0x24, 0x00, 0x02, 0x02, 0x0c, 0x00, + 0xa4, 0x00, 0x02, 0x02, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x07, + 0x0b, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf6, 0x00, 0x0b, 0x00, 0x01, 0x00, + 0x00, 0x02, 0x0e, 0x00, 0x00, 0x40, 0xc5, 0x00, 0x0c, 0x00, 0x0c, 0x00, + 0x00, 0x20, 0x0c, 0x00, 0x8c, 0x00, 0x00, 0x20, 0x04, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x90, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x38, 0x00, 0x07, 0x00, 0x38, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x40, 0x00, 0x07, 0x00, 0x40, 0x00, 0x00, 0x01, 0x06, 0x00, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x38, 0x00, + 0x06, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x07, 0x00, + 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x0d, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x10, 0x07, 0x0c, 0x00, 0x0c, 0x00, 0x10, 0x10, + 0x0c, 0x00, 0x8c, 0x00, 0x10, 0x10, 0x0c, 0x00, 0x0c, 0x00, 0x23, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x0c, 0x00, 0xa3, 0x00, 0x01, 0x00, + 0x00, 0x00, 0xa3, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x24, 0x00, 0x00, 0x02, + 0x0c, 0x00, 0xa4, 0x00, 0x00, 0x02, 0x0b, 0x00, 0x0e, 0x00, 0x40, 0x40, + 0x02, 0x00, 0x30, 0x30, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x06, + 0x06, 0x62, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x0d, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x28, 0x30, 0x2f, 0x00, 0x00, 0x01, 0x2e, 0x00, 0x00, 0x01, 0x0b, 0x00, + 0x01, 0x00, 0x02, 0x02, 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe9, 0xe4, 0x52, 0x5e, 0x00, 0x00, 0x62, 0x60, + 0x10, 0x00, 0x62, 0x60, 0x31, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x01, 0x62, 0x60, 0x88, 0x03, 0x62, 0x60, 0xb4, 0x01, 0x62, 0x60, + 0xa0, 0x03, 0x62, 0x60, 0xcc, 0x01, 0x62, 0x60, 0xc4, 0x03, 0x62, 0x60, + 0x40, 0x02, 0x62, 0x60, 0x80, 0x04, 0x62, 0x60, 0x68, 0x02, 0x62, 0x60, + 0xc0, 0x04, 0x62, 0x60, 0x74, 0x02, 0x62, 0x60, 0xd0, 0x04, 0x62, 0x60, + 0x80, 0x02, 0x62, 0x60, 0xe0, 0x04, 0x62, 0x60, 0x84, 0x02, 0x62, 0x60, + 0xe4, 0x04, 0x62, 0x60, 0x88, 0x02, 0x62, 0x60, 0xe8, 0x04, 0x62, 0x60, + 0x8c, 0x02, 0x62, 0x60, 0xec, 0x04, 0x62, 0x60, 0x90, 0x02, 0x62, 0x60, + 0xf0, 0x04, 0x62, 0x60, 0x94, 0x02, 0x62, 0x60, 0xf4, 0x04, 0x62, 0x60, + 0x98, 0x02, 0x62, 0x60, 0xf8, 0x04, 0x62, 0x60, 0xa4, 0x02, 0x62, 0x60, + 0x08, 0x05, 0x62, 0x60, 0xb0, 0x02, 0x62, 0x60, 0x18, 0x05, 0x62, 0x60, + 0xb4, 0x02, 0x62, 0x60, 0x1c, 0x05, 0x62, 0x60, 0xb8, 0x02, 0x62, 0x60, + 0x20, 0x05, 0x62, 0x60, 0xbc, 0x02, 0x62, 0x60, 0x24, 0x05, 0x62, 0x60, + 0xc0, 0x02, 0x62, 0x60, 0x28, 0x05, 0x62, 0x60, 0xc4, 0x02, 0x62, 0x60, + 0x2c, 0x05, 0x62, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x02, 0x62, 0x60, 0x68, 0x05, 0x62, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf4, 0x02, 0x62, 0x60, 0x6c, 0x05, 0x62, 0x60, + 0x2c, 0x03, 0x62, 0x60, 0xe4, 0x05, 0x62, 0x60, 0x74, 0x03, 0x62, 0x60, + 0x68, 0x06, 0x62, 0x60, 0x7c, 0x03, 0x62, 0x60, 0x70, 0x06, 0x62, 0x60, + 0xc8, 0x02, 0x62, 0x60, 0x30, 0x05, 0x62, 0x60, 0xcc, 0x02, 0x62, 0x60, + 0x34, 0x05, 0x62, 0x60, 0xd0, 0x02, 0x62, 0x60, 0x38, 0x05, 0x62, 0x60, + 0xd8, 0x02, 0x62, 0x60, 0x44, 0x05, 0x62, 0x60, 0xc0, 0x01, 0x62, 0x60, + 0xb4, 0x03, 0x62, 0x60, 0x38, 0x02, 0x62, 0x60, 0x74, 0x04, 0x62, 0x60, + 0xe0, 0x02, 0x62, 0x60, 0x50, 0x05, 0x62, 0x60, 0xe8, 0x02, 0x62, 0x60, + 0x5c, 0x05, 0x62, 0x60, 0xd4, 0x01, 0x62, 0x60, 0xd0, 0x03, 0x62, 0x60, + 0x48, 0x02, 0x62, 0x60, 0x8c, 0x04, 0x62, 0x60, 0x20, 0x02, 0x62, 0x60, + 0x4c, 0x04, 0x62, 0x60, 0xfc, 0x01, 0x62, 0x60, 0x10, 0x04, 0x62, 0x60, + 0x80, 0x03, 0x62, 0x60, 0x74, 0x06, 0x62, 0x60, 0x84, 0x03, 0x62, 0x60, + 0x7c, 0x06, 0x62, 0x60, 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xf0, 0xc8, + 0xfe, 0x56, 0x86, 0xf1, 0x89, 0xad, 0xd0, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xc4, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xd3, 0xcd, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0xf0, 0xc8, 0xfe, 0x56, 0x86, 0xf1, 0x89, 0xad, 0xd0, 0xc6, + 0xce, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf0, 0xc8, + 0xfe, 0x56, 0x86, 0xf1, 0x89, 0xad, 0xd0, 0xfe, 0x56, 0xfd, 0x55, 0xd6, + 0xd0, 0xd6, 0xed, 0xd6, 0xfe, 0x56, 0xfd, 0xd0, 0xd6, 0xf0, 0xc8, 0xac, + 0xc4, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc4, 0xd3, 0xcd, 0xc6, 0x00, 0x00, + 0xce, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xd6, 0xf0, 0xc8, + 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xa4, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xd6, + 0x55, 0xfe, 0x56, 0xd0, 0xcd, 0xd6, 0xfd, 0xfe, 0x56, 0xd0, 0xc6, 0x00, + 0xce, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xd6, 0xf0, 0xc8, + 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xcd, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, + 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0xf0, 0xf9, + 0x51, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf0, 0xf9, 0x51, 0x91, 0xf9, 0x51, + 0x81, 0xc5, 0xc4, 0xd6, 0xfe, 0x56, 0xfd, 0xd0, 0xd6, 0xf0, 0xc8, 0xfe, + 0x56, 0x86, 0xf1, 0x89, 0xad, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, + 0xce, 0xfe, 0x56, 0x55, 0xd6, 0xd0, 0xd6, 0xd0, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xfe, 0x56, 0x55, 0xd6, 0xd0, 0xd6, 0xd0, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xd6, 0xf1, 0xf8, 0x50, 0x81, 0xc5, 0xf8, 0x50, 0x81, 0xc5, 0xc6, + 0xce, 0xd6, 0xf1, 0xf8, 0x50, 0x81, 0xc5, 0xf8, 0x50, 0x81, 0xc5, 0xc6, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xfe, 0x56, 0x55, + 0xd6, 0xd0, 0xc6, 0x00, 0xce, 0xfe, 0x56, 0x55, 0xd6, 0xd0, 0xc6, 0x00, + 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0x55, 0xfe, + 0x56, 0xd0, 0xc6, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x52, 0xfa, + 0xea, 0xd6, 0x55, 0x56, 0xd0, 0xd6, 0xc1, 0xad, 0xcd, 0xc1, 0xad, 0xcd, + 0xd6, 0xc1, 0xad, 0xcd, 0xc1, 0xd6, 0x52, 0xfa, 0xea, 0xd6, 0xc1, 0xcd, + 0xd6, 0xc1, 0xc1, 0xcd, 0xd6, 0xc1, 0xad, 0xcd, 0xc1, 0xd6, 0x52, 0xfa, + 0xea, 0xd6, 0xfd, 0xfe, 0x56, 0xd0, 0xd6, 0xd0, 0xd6, 0x55, 0xfe, 0x56, + 0xd0, 0xd6, 0xd0, 0xc6, 0xce, 0xd6, 0xfd, 0xfe, 0x56, 0xd0, 0xd6, 0xd0, + 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xd6, 0xd0, 0xd6, 0x52, 0xfa, 0xea, 0xd6, + 0x52, 0xfa, 0xea, 0xd6, 0xc1, 0xad, 0xcd, 0xc1, 0xad, 0xcd, 0xd6, 0x98, + 0x58, 0x52, 0xfa, 0x82, 0x48, 0xad, 0xcd, 0x98, 0x58, 0x52, 0xfa, 0x82, + 0x48, 0xad, 0xcd, 0xd6, 0xc1, 0xad, 0xcd, 0xc1, 0xd6, 0xc1, 0xd6, 0xf0, + 0x52, 0xfa, 0x82, 0x92, 0xc5, 0xc1, 0xcd, 0xd6, 0x55, 0x56, 0xd0, 0xd6, + 0x52, 0xfa, 0xea, 0xc6, 0xce, 0xd6, 0xf4, 0xc4, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xc4, 0xc6, 0x00, 0xce, 0xd6, 0xc1, 0xc6, 0xce, 0xa0, 0xc6, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x14, 0x30, + 0x14, 0x30, 0x08, 0x00, 0x00, 0x00, 0x08, 0x14, 0x30, 0x14, 0x30, 0x20, + 0x00, 0x01, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x14, + 0x30, 0x28, 0x00, 0x0a, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x07, 0x00, 0x00, 0x00, 0x04, 0x14, 0x30, 0x14, 0x30, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, 0x10, 0x2c, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x02, 0x00, 0x00, 0x80, 0x00, 0x14, + 0x30, 0x14, 0x30, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x14, 0x30, 0x02, 0x00, 0x20, 0x30, 0x03, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0xbc, 0x00, 0x02, 0x00, 0x1c, 0x30, 0x30, 0x2f, 0x02, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x14, 0x30, 0x20, 0x29, 0x00, + 0x0a, 0x40, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x24, 0x00, 0x25, 0x00, + 0x00, 0x06, 0x00, 0x02, 0x00, 0x14, 0x30, 0x03, 0x00, 0x50, 0x00, 0x10, + 0x00, 0xff, 0x00, 0x00, 0x02, 0x00, 0x20, 0x30, 0x00, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x50, 0x00, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x20, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x20, 0x30, 0x30, 0x00, + 0x00, 0x00, 0xff, 0x03, 0x00, 0x50, 0x00, 0x02, 0x00, 0x14, 0x30, 0x1b, + 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x24, 0x00, 0x0f, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x30, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x00, 0x00, 0x00, 0x10, 0x2d, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x20, 0x00, 0x21, 0x2e, + 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0xbc, 0x00, 0x02, 0x00, + 0x14, 0x30, 0x01, 0x00, 0x00, 0x40, 0x00, 0x14, 0x30, 0x14, 0x30, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x58, 0x00, + 0x07, 0x00, 0x58, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x58, 0x00, 0x07, 0x00, 0x58, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x00, 0x00, 0x00, 0x01, 0x26, 0x00, 0x00, 0x00, 0x02, 0x27, + 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, 0x01, 0x26, 0x00, + 0x00, 0x00, 0x02, 0x27, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x58, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x07, 0x00, 0x58, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x14, 0x30, + 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x14, 0x30, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0xff, 0x1f, 0xdf, 0xf7, + 0x94, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x01, 0x00, 0x80, 0x0d, 0x0c, 0x00, + 0x0c, 0x00, 0x00, 0x10, 0x0c, 0x00, 0x8c, 0x00, 0x00, 0x10, 0x0c, 0x00, + 0x0c, 0x00, 0x24, 0x00, 0x02, 0x02, 0x0c, 0x00, 0xa4, 0x00, 0x02, 0x02, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x07, 0x0b, 0x00, 0x00, 0x00, + 0x00, 0x06, 0xf6, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x00, 0x02, 0x0e, 0x00, + 0x00, 0x40, 0xc5, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x20, 0x0c, 0x00, + 0x8c, 0x00, 0x00, 0x20, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x90, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, + 0x38, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, + 0x07, 0x00, 0x40, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x38, 0x00, 0x06, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x07, 0x00, 0x40, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x10, 0x07, 0x0c, 0x00, 0x0c, 0x00, 0x10, 0x10, 0x0c, 0x00, 0x8c, 0x00, + 0x10, 0x10, 0x0c, 0x00, 0x0c, 0x00, 0x23, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x23, 0x00, 0x0c, 0x00, 0xa3, 0x00, 0x01, 0x00, 0x00, 0x00, 0xa3, 0x00, + 0x0c, 0x00, 0x0c, 0x00, 0x24, 0x00, 0x00, 0x02, 0x0c, 0x00, 0xa4, 0x00, + 0x00, 0x02, 0x0b, 0x00, 0x0e, 0x00, 0x40, 0x40, 0x02, 0x00, 0x30, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x06, 0x06, 0x62, 0x00, 0x0e, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x0d, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x94, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x28, 0x30, 0x2f, 0x00, + 0x00, 0x01, 0x2e, 0x00, 0x00, 0x01, 0x0b, 0x00, 0x01, 0x00, 0x02, 0x02, + 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x83, 0x38, 0x46, 0xbe, 0x00, 0x00, 0x72, 0x60, 0x10, 0x00, 0x72, 0x60, + 0x31, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x72, 0x60, + 0x88, 0x03, 0x72, 0x60, 0xb4, 0x01, 0x72, 0x60, 0xa0, 0x03, 0x72, 0x60, + 0xcc, 0x01, 0x72, 0x60, 0xc4, 0x03, 0x72, 0x60, 0x40, 0x02, 0x72, 0x60, + 0x80, 0x04, 0x72, 0x60, 0x68, 0x02, 0x72, 0x60, 0xc0, 0x04, 0x72, 0x60, + 0x74, 0x02, 0x72, 0x60, 0xd0, 0x04, 0x72, 0x60, 0x80, 0x02, 0x72, 0x60, + 0xe0, 0x04, 0x72, 0x60, 0x84, 0x02, 0x72, 0x60, 0xe4, 0x04, 0x72, 0x60, + 0x88, 0x02, 0x72, 0x60, 0xe8, 0x04, 0x72, 0x60, 0x8c, 0x02, 0x72, 0x60, + 0xec, 0x04, 0x72, 0x60, 0x90, 0x02, 0x72, 0x60, 0xf0, 0x04, 0x72, 0x60, + 0x94, 0x02, 0x72, 0x60, 0xf4, 0x04, 0x72, 0x60, 0x98, 0x02, 0x72, 0x60, + 0xf8, 0x04, 0x72, 0x60, 0xa4, 0x02, 0x72, 0x60, 0x08, 0x05, 0x72, 0x60, + 0xb0, 0x02, 0x72, 0x60, 0x18, 0x05, 0x72, 0x60, 0xb4, 0x02, 0x72, 0x60, + 0x1c, 0x05, 0x72, 0x60, 0xb8, 0x02, 0x72, 0x60, 0x20, 0x05, 0x72, 0x60, + 0xbc, 0x02, 0x72, 0x60, 0x24, 0x05, 0x72, 0x60, 0xc0, 0x02, 0x72, 0x60, + 0x28, 0x05, 0x72, 0x60, 0xc4, 0x02, 0x72, 0x60, 0x2c, 0x05, 0x72, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x02, 0x72, 0x60, + 0x68, 0x05, 0x72, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf4, 0x02, 0x72, 0x60, 0x6c, 0x05, 0x72, 0x60, 0x2c, 0x03, 0x72, 0x60, + 0xe4, 0x05, 0x72, 0x60, 0x74, 0x03, 0x72, 0x60, 0x68, 0x06, 0x72, 0x60, + 0x7c, 0x03, 0x72, 0x60, 0x70, 0x06, 0x72, 0x60, 0xc8, 0x02, 0x72, 0x60, + 0x30, 0x05, 0x72, 0x60, 0xcc, 0x02, 0x72, 0x60, 0x34, 0x05, 0x72, 0x60, + 0xd0, 0x02, 0x72, 0x60, 0x38, 0x05, 0x72, 0x60, 0xd8, 0x02, 0x72, 0x60, + 0x44, 0x05, 0x72, 0x60, 0xc0, 0x01, 0x72, 0x60, 0xb4, 0x03, 0x72, 0x60, + 0x38, 0x02, 0x72, 0x60, 0x74, 0x04, 0x72, 0x60, 0xe0, 0x02, 0x72, 0x60, + 0x50, 0x05, 0x72, 0x60, 0xe8, 0x02, 0x72, 0x60, 0x5c, 0x05, 0x72, 0x60, + 0xd4, 0x01, 0x72, 0x60, 0xd0, 0x03, 0x72, 0x60, 0x48, 0x02, 0x72, 0x60, + 0x8c, 0x04, 0x72, 0x60, 0x20, 0x02, 0x72, 0x60, 0x4c, 0x04, 0x72, 0x60, + 0xfc, 0x01, 0x72, 0x60, 0x10, 0x04, 0x72, 0x60, 0x80, 0x03, 0x72, 0x60, + 0x74, 0x06, 0x72, 0x60, 0x84, 0x03, 0x72, 0x60, 0x7c, 0x06, 0x72, 0x60, + 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xf0, 0xc8, 0xfe, 0x56, 0x86, 0xf1, + 0x89, 0xad, 0xd0, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xc4, 0xd6, 0x55, + 0xfe, 0x56, 0xd0, 0xd3, 0xcd, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf0, 0xc8, + 0xfe, 0x56, 0x86, 0xf1, 0x89, 0xad, 0xd0, 0xc6, 0xce, 0xd6, 0xf0, 0xf9, + 0x51, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf0, 0xc8, 0xfe, 0x56, 0x86, 0xf1, + 0x89, 0xad, 0xd0, 0xfe, 0x56, 0xfd, 0x55, 0xd6, 0xd0, 0xd6, 0xed, 0xd6, + 0xfe, 0x56, 0xfd, 0xd0, 0xd6, 0xf0, 0xc8, 0xac, 0xc4, 0xd6, 0x55, 0xfe, + 0x56, 0xd0, 0xc4, 0xd3, 0xcd, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0xf0, 0xc8, + 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, + 0xd0, 0xa4, 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, + 0xcd, 0xd6, 0xfd, 0xfe, 0x56, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0xf0, 0xc8, + 0xad, 0xfe, 0x56, 0xd6, 0xd0, 0xd6, 0xf0, 0xc8, 0xad, 0xfe, 0x56, 0xd6, + 0xd0, 0xcd, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0xce, 0xd6, 0x55, 0xfe, + 0x56, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0xf0, 0xf9, 0x51, 0x81, 0xc5, 0xc6, + 0xce, 0xd6, 0xf0, 0xf9, 0x51, 0x91, 0xf9, 0x51, 0x81, 0xc5, 0xc4, 0xd6, + 0xfe, 0x56, 0xfd, 0xd0, 0xd6, 0xf0, 0xc8, 0xfe, 0x56, 0x86, 0xf1, 0x89, + 0xad, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0xce, 0xfe, 0x56, 0x55, + 0xd6, 0xd0, 0xd6, 0xd0, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xfe, 0x56, 0x55, + 0xd6, 0xd0, 0xd6, 0xd0, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xd6, 0xf1, 0xf8, + 0x50, 0x81, 0xc5, 0xf8, 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0xf1, 0xf8, + 0x50, 0x81, 0xc5, 0xf8, 0x50, 0x81, 0xc5, 0xc6, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xfe, 0x56, 0x55, 0xd6, 0xd0, 0xc6, 0x00, + 0xce, 0xfe, 0x56, 0x55, 0xd6, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0x55, 0xfe, + 0x56, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xd6, 0x52, 0xfa, 0xea, 0xd6, 0x55, 0x56, + 0xd0, 0xd6, 0xc1, 0xad, 0xcd, 0xc1, 0xad, 0xcd, 0xd6, 0xc1, 0xad, 0xcd, + 0xc1, 0xd6, 0x52, 0xfa, 0xea, 0xd6, 0xc1, 0xcd, 0xd6, 0xc1, 0xc1, 0xcd, + 0xd6, 0xc1, 0xad, 0xcd, 0xc1, 0xd6, 0x52, 0xfa, 0xea, 0xd6, 0xfd, 0xfe, + 0x56, 0xd0, 0xd6, 0xd0, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xd6, 0xd0, 0xc6, + 0xce, 0xd6, 0xfd, 0xfe, 0x56, 0xd0, 0xd6, 0xd0, 0xd6, 0x55, 0xfe, 0x56, + 0xd0, 0xd6, 0xd0, 0xd6, 0x52, 0xfa, 0xea, 0xd6, 0x52, 0xfa, 0xea, 0xd6, + 0xc1, 0xad, 0xcd, 0xc1, 0xad, 0xcd, 0xd6, 0x98, 0x58, 0x52, 0xfa, 0x82, + 0x48, 0xad, 0xcd, 0x98, 0x58, 0x52, 0xfa, 0x82, 0x48, 0xad, 0xcd, 0xd6, + 0xc1, 0xad, 0xcd, 0xc1, 0xd6, 0xc1, 0xd6, 0xf0, 0x52, 0xfa, 0x82, 0x92, + 0xc5, 0xc1, 0xcd, 0xd6, 0x55, 0x56, 0xd0, 0xd6, 0x52, 0xfa, 0xea, 0xc6, + 0xce, 0xd6, 0xf4, 0xc4, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xc4, 0xc6, 0x00, + 0xce, 0xd6, 0xc1, 0xc6, 0xce, 0xa0, 0xc6, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x14, 0x30, 0x14, 0x30, 0x08, 0x00, + 0x00, 0x00, 0x08, 0x14, 0x30, 0x14, 0x30, 0x20, 0x00, 0x01, 0x21, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x14, 0x30, 0x28, 0x00, 0x0a, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x07, 0x00, + 0x00, 0x00, 0x04, 0x14, 0x30, 0x14, 0x30, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x00, 0x00, 0x00, 0x10, 0x2c, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x02, 0x00, 0x00, 0x80, 0x00, 0x14, 0x30, 0x14, 0x30, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x30, 0x02, + 0x00, 0x20, 0x30, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xbc, + 0x00, 0x02, 0x00, 0x1c, 0x30, 0x30, 0x2f, 0x02, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x14, 0x30, 0x20, 0x29, 0x00, 0x0a, 0x40, 0x00, 0x00, + 0x00, 0x01, 0x03, 0x00, 0x24, 0x00, 0x25, 0x00, 0x00, 0x06, 0x00, 0x02, + 0x00, 0x14, 0x30, 0x03, 0x00, 0x50, 0x00, 0x10, 0x00, 0xff, 0x00, 0x00, + 0x02, 0x00, 0x20, 0x30, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x50, 0x00, + 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x0f, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x20, 0x30, 0x30, 0x00, 0x00, 0x00, 0xff, 0x03, + 0x00, 0x50, 0x00, 0x02, 0x00, 0x14, 0x30, 0x1b, 0x00, 0x30, 0x00, 0x00, + 0x03, 0x00, 0x24, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x20, 0x00, 0x00, 0x01, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x14, 0x30, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, + 0x00, 0x10, 0x2d, 0x00, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x20, 0x00, 0x21, 0x2e, 0x03, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0xbc, 0x00, 0x02, 0x00, 0x14, 0x30, 0x01, 0x00, + 0x00, 0x40, 0x00, 0x14, 0x30, 0x14, 0x30, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x58, 0x00, 0x07, 0x00, 0x58, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x58, 0x00, + 0x07, 0x00, 0x58, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, + 0x00, 0x01, 0x26, 0x00, 0x00, 0x00, 0x02, 0x27, 0x00, 0x01, 0x02, 0x00, + 0x14, 0x30, 0x00, 0x00, 0x00, 0x01, 0x26, 0x00, 0x00, 0x00, 0x02, 0x27, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x58, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x07, 0x00, 0x58, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x14, 0x30, 0x00, 0x01, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x14, 0x30, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x04, 0x00, 0xff, 0x1f, 0xdf, 0xf7, 0x94, 0x00, 0x0e, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x80, 0x0d, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x10, + 0x0c, 0x00, 0x8c, 0x00, 0x00, 0x10, 0x0c, 0x00, 0x0c, 0x00, 0x24, 0x00, + 0x02, 0x02, 0x0c, 0x00, 0xa4, 0x00, 0x02, 0x02, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x07, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf6, 0x00, + 0x0b, 0x00, 0x01, 0x00, 0x00, 0x02, 0x0e, 0x00, 0x00, 0x40, 0xc5, 0x00, + 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x20, 0x0c, 0x00, 0x8c, 0x00, 0x00, 0x20, + 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x90, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x38, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x07, 0x00, 0x40, 0x00, + 0x00, 0x01, 0x06, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, + 0x07, 0x00, 0x38, 0x00, 0x06, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x00, 0x07, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x07, 0x0c, 0x00, + 0x0c, 0x00, 0x10, 0x10, 0x0c, 0x00, 0x8c, 0x00, 0x10, 0x10, 0x0c, 0x00, + 0x0c, 0x00, 0x23, 0x00, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x0c, 0x00, + 0xa3, 0x00, 0x01, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x0c, 0x00, 0x0c, 0x00, + 0x24, 0x00, 0x00, 0x02, 0x0c, 0x00, 0xa4, 0x00, 0x00, 0x02, 0x0b, 0x00, + 0x0e, 0x00, 0x40, 0x40, 0x02, 0x00, 0x30, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x06, 0x06, 0x62, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x80, 0x0d, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x28, 0x30, 0x2f, 0x00, 0x00, 0x01, 0x2e, 0x00, + 0x00, 0x01, 0x0b, 0x00, 0x01, 0x00, 0x02, 0x02, 0x00, 0x01, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x8c, 0xb5, 0xe1, + 0x00, 0x00, 0x02, 0x61, 0x10, 0x00, 0x02, 0x61, 0x29, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x01, 0x02, 0x61, 0x44, 0x02, 0x02, 0x61, + 0x7c, 0x01, 0x02, 0x61, 0x78, 0x02, 0x02, 0x61, 0x98, 0x01, 0x02, 0x61, + 0xa4, 0x02, 0x02, 0x61, 0x9c, 0x01, 0x02, 0x61, 0xa8, 0x02, 0x02, 0x61, + 0xa0, 0x01, 0x02, 0x61, 0xac, 0x02, 0x02, 0x61, 0xa4, 0x01, 0x02, 0x61, + 0xb0, 0x02, 0x02, 0x61, 0xa8, 0x01, 0x02, 0x61, 0xb4, 0x02, 0x02, 0x61, + 0xac, 0x01, 0x02, 0x61, 0xb8, 0x02, 0x02, 0x61, 0xb0, 0x01, 0x02, 0x61, + 0xbc, 0x02, 0x02, 0x61, 0xb4, 0x01, 0x02, 0x61, 0xc0, 0x02, 0x02, 0x61, + 0xb8, 0x01, 0x02, 0x61, 0xc4, 0x02, 0x02, 0x61, 0xbc, 0x01, 0x02, 0x61, + 0xc8, 0x02, 0x02, 0x61, 0xc0, 0x01, 0x02, 0x61, 0xcc, 0x02, 0x02, 0x61, + 0xc4, 0x01, 0x02, 0x61, 0xd0, 0x02, 0x02, 0x61, 0xc8, 0x01, 0x02, 0x61, + 0xd4, 0x02, 0x02, 0x61, 0xcc, 0x01, 0x02, 0x61, 0xd8, 0x02, 0x02, 0x61, + 0xd0, 0x01, 0x02, 0x61, 0xdc, 0x02, 0x02, 0x61, 0xd4, 0x01, 0x02, 0x61, + 0xe0, 0x02, 0x02, 0x61, 0xd8, 0x01, 0x02, 0x61, 0xe4, 0x02, 0x02, 0x61, + 0xdc, 0x01, 0x02, 0x61, 0xe8, 0x02, 0x02, 0x61, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x02, 0x61, + 0xec, 0x02, 0x02, 0x61, 0xec, 0x01, 0x02, 0x61, 0x00, 0x03, 0x02, 0x61, + 0xf4, 0x01, 0x02, 0x61, 0x0c, 0x03, 0x02, 0x61, 0xfc, 0x01, 0x02, 0x61, + 0x18, 0x03, 0x02, 0x61, 0x04, 0x02, 0x02, 0x61, 0x24, 0x03, 0x02, 0x61, + 0x18, 0x02, 0x02, 0x61, 0x3c, 0x03, 0x02, 0x61, 0x28, 0x02, 0x02, 0x61, + 0x54, 0x03, 0x02, 0x61, 0x38, 0x02, 0x02, 0x61, 0x6c, 0x03, 0x02, 0x61, + 0x20, 0x02, 0x02, 0x61, 0x48, 0x03, 0x02, 0x61, 0x40, 0x02, 0x02, 0x61, + 0x78, 0x03, 0x02, 0x61, 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xcf, 0xfa, + 0x52, 0xea, 0x52, 0xea, 0xcd, 0xfd, 0xfe, 0x56, 0xd6, 0xd0, 0xd6, 0xf0, + 0xc5, 0x55, 0xfe, 0x56, 0xd6, 0xd0, 0xc6, 0x00, 0xce, 0xfd, 0xfe, 0x56, + 0xd6, 0xd0, 0xd6, 0xf1, 0xf8, 0x50, 0x81, 0xc5, 0xcf, 0xfa, 0x52, 0xd6, + 0xea, 0xd6, 0xea, 0x55, 0xfe, 0x56, 0xd6, 0xd0, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0x55, 0x56, 0xfe, 0xd6, 0xd0, 0xf8, 0x50, 0xd6, 0xe8, 0xc6, 0x00, + 0xce, 0x56, 0xd6, 0x4e, 0xc4, 0xc6, 0x00, 0x00, 0xce, 0x56, 0x55, 0xd6, + 0x4e, 0x4d, 0xc6, 0x00, 0xce, 0xd6, 0x98, 0x51, 0xf9, 0x81, 0xc5, 0xc6, + 0xce, 0xd6, 0x98, 0x51, 0xf9, 0x58, 0x81, 0x51, 0x89, 0x48, 0xd3, 0xcd, + 0xd6, 0xf0, 0x58, 0xe8, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0x55, 0xfe, + 0x56, 0xd0, 0xc6, 0x00, 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0x00, + 0xce, 0x55, 0xfe, 0x56, 0xd6, 0xd0, 0xd6, 0xf1, 0xf8, 0x50, 0x81, 0xc5, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0x55, 0xfe, 0x56, 0xd6, 0xd0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0x00, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0xa0, 0x00, 0x01, 0x00, 0x00, 0xff, 0x0f, 0x5c, 0x00, 0x01, + 0x00, 0x58, 0x00, 0x89, 0x01, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x05, + 0x00, 0x28, 0x00, 0x02, 0x00, 0x18, 0x30, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x00, 0x01, 0x60, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x05, 0x00, 0x28, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x00, 0x00, 0x01, 0x00, 0x25, 0x02, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x58, 0x00, 0x05, 0x00, 0x5c, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x05, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x18, 0x30, + 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0xe1, 0xa8, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0xe1, 0xa8, 0xe1, 0xa8, + 0x00, 0x05, 0x06, 0x00, 0xe1, 0xa8, 0x80, 0x00, 0x00, 0x00, 0x24, 0x00, + 0x00, 0x05, 0x06, 0x00, 0xe1, 0xa8, 0x3f, 0x00, 0x00, 0x00, 0x80, 0x00, + 0xe1, 0xa8, 0x23, 0x00, 0x43, 0x40, 0x02, 0x00, 0x1c, 0x30, 0x1c, 0x30, + 0x00, 0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xa0, 0x00, + 0x00, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xa0, 0x00, + 0x00, 0x05, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x02, 0x00, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x9c, 0x46, 0xdf, 0xbd, 0x00, 0x00, 0x12, 0x61, + 0x10, 0x00, 0x12, 0x61, 0x29, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x01, 0x12, 0x61, 0x44, 0x02, 0x12, 0x61, 0x7c, 0x01, 0x12, 0x61, + 0x78, 0x02, 0x12, 0x61, 0x98, 0x01, 0x12, 0x61, 0xa4, 0x02, 0x12, 0x61, + 0x9c, 0x01, 0x12, 0x61, 0xa8, 0x02, 0x12, 0x61, 0xa0, 0x01, 0x12, 0x61, + 0xac, 0x02, 0x12, 0x61, 0xa4, 0x01, 0x12, 0x61, 0xb0, 0x02, 0x12, 0x61, + 0xa8, 0x01, 0x12, 0x61, 0xb4, 0x02, 0x12, 0x61, 0xac, 0x01, 0x12, 0x61, + 0xb8, 0x02, 0x12, 0x61, 0xb0, 0x01, 0x12, 0x61, 0xbc, 0x02, 0x12, 0x61, + 0xb4, 0x01, 0x12, 0x61, 0xc0, 0x02, 0x12, 0x61, 0xb8, 0x01, 0x12, 0x61, + 0xc4, 0x02, 0x12, 0x61, 0xbc, 0x01, 0x12, 0x61, 0xc8, 0x02, 0x12, 0x61, + 0xc0, 0x01, 0x12, 0x61, 0xcc, 0x02, 0x12, 0x61, 0xc4, 0x01, 0x12, 0x61, + 0xd0, 0x02, 0x12, 0x61, 0xc8, 0x01, 0x12, 0x61, 0xd4, 0x02, 0x12, 0x61, + 0xcc, 0x01, 0x12, 0x61, 0xd8, 0x02, 0x12, 0x61, 0xd0, 0x01, 0x12, 0x61, + 0xdc, 0x02, 0x12, 0x61, 0xd4, 0x01, 0x12, 0x61, 0xe0, 0x02, 0x12, 0x61, + 0xd8, 0x01, 0x12, 0x61, 0xe4, 0x02, 0x12, 0x61, 0xdc, 0x01, 0x12, 0x61, + 0xe8, 0x02, 0x12, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x12, 0x61, 0xec, 0x02, 0x12, 0x61, + 0xec, 0x01, 0x12, 0x61, 0x00, 0x03, 0x12, 0x61, 0xf4, 0x01, 0x12, 0x61, + 0x0c, 0x03, 0x12, 0x61, 0xfc, 0x01, 0x12, 0x61, 0x18, 0x03, 0x12, 0x61, + 0x04, 0x02, 0x12, 0x61, 0x24, 0x03, 0x12, 0x61, 0x18, 0x02, 0x12, 0x61, + 0x3c, 0x03, 0x12, 0x61, 0x28, 0x02, 0x12, 0x61, 0x54, 0x03, 0x12, 0x61, + 0x38, 0x02, 0x12, 0x61, 0x6c, 0x03, 0x12, 0x61, 0x20, 0x02, 0x12, 0x61, + 0x48, 0x03, 0x12, 0x61, 0x40, 0x02, 0x12, 0x61, 0x78, 0x03, 0x12, 0x61, + 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xcf, 0xfa, 0x52, 0xea, 0x52, 0xea, + 0xcd, 0xfd, 0xfe, 0x56, 0xd6, 0xd0, 0xd6, 0xf0, 0xc5, 0x55, 0xfe, 0x56, + 0xd6, 0xd0, 0xc6, 0x00, 0xce, 0xfd, 0xfe, 0x56, 0xd6, 0xd0, 0xd6, 0xf1, + 0xf8, 0x50, 0x81, 0xc5, 0xcf, 0xfa, 0x52, 0xd6, 0xea, 0xd6, 0xea, 0x55, + 0xfe, 0x56, 0xd6, 0xd0, 0xc6, 0x00, 0x00, 0x00, 0xce, 0xc6, 0x00, 0x00, + 0xce, 0xc6, 0x00, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0xce, 0xa0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, 0xce, 0x55, 0x56, 0xfe, + 0xd6, 0xd0, 0xf8, 0x50, 0xd6, 0xe8, 0xc6, 0x00, 0xce, 0x56, 0xd6, 0x4e, + 0xc4, 0xc6, 0x00, 0x00, 0xce, 0x56, 0x55, 0xd6, 0x4e, 0x4d, 0xc6, 0x00, + 0xce, 0xd6, 0x98, 0x51, 0xf9, 0x81, 0xc5, 0xc6, 0xce, 0xd6, 0x98, 0x51, + 0xf9, 0x58, 0x81, 0x51, 0x89, 0x48, 0xd3, 0xcd, 0xd6, 0xf0, 0x58, 0xe8, + 0xc6, 0x00, 0x00, 0x00, 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0x00, + 0xce, 0xd6, 0x55, 0xfe, 0x56, 0xd0, 0xc6, 0x00, 0xce, 0x55, 0xfe, 0x56, + 0xd6, 0xd0, 0xd6, 0xf1, 0xf8, 0x50, 0x81, 0xc5, 0xc6, 0x00, 0x00, 0x00, + 0xce, 0x55, 0xfe, 0x56, 0xd6, 0xd0, 0xc6, 0x00, 0xce, 0xa0, 0xc6, 0x00, + 0x00, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xa0, 0x00, + 0x01, 0x00, 0x00, 0xff, 0x0f, 0x5c, 0x00, 0x01, 0x00, 0x58, 0x00, 0x89, + 0x01, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x05, 0x00, 0x28, 0x00, 0x02, + 0x00, 0x18, 0x30, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x14, 0x30, 0x00, 0x00, 0x00, 0x01, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x28, 0x00, 0x02, 0x00, 0x14, 0x30, 0x00, 0x00, 0x01, 0x00, + 0x25, 0x02, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x58, 0x00, 0x05, 0x00, + 0x5c, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x14, 0x30, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0xd0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x18, 0x30, 0x00, 0x01, 0x80, 0x00, + 0x06, 0x00, 0xe1, 0xa8, 0x24, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x00, 0x06, 0x00, 0xe1, 0xa8, 0xe1, 0xa8, 0x00, 0x05, 0x06, 0x00, + 0xe1, 0xa8, 0x80, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x05, 0x06, 0x00, + 0xe1, 0xa8, 0x3f, 0x00, 0x00, 0x00, 0x80, 0x00, 0xe1, 0xa8, 0x23, 0x00, + 0x43, 0x40, 0x02, 0x00, 0x1c, 0x30, 0x1c, 0x30, 0x00, 0x01, 0x05, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xa0, 0x00, 0x00, 0x01, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xa0, 0x00, 0x00, 0x05, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x14, 0x30, 0x02, 0x00, 0x14, 0x30, + 0x00, 0x00, 0x02, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x14, 0x30, 0x00, 0x01, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc7, 0x8c, 0x9f, 0x5c +}; +unsigned int stream_image_bin_len = 90112; + +#endif + diff --git a/projects/adrv904x/src/common/hal/no_os_platform.c b/projects/adrv904x/src/common/hal/no_os_platform.c new file mode 100644 index 00000000000..899fa75a9ca --- /dev/null +++ b/projects/adrv904x/src/common/hal/no_os_platform.c @@ -0,0 +1,955 @@ +// SPDX-License-Identifier: GPL-2.0 +/** +* Copyright 2015 - 2023 Analog Devices Inc. +* Released under the ADRV9025 API license, for more information. +* see the "LICENSE.txt" file in this zip file. +*/ + +#include "ADRV9040_RxGainTable.h" +#include "ADRV9040_DFE_CALS_FW.h" +#include "DeviceProfileTest.h" +#include "adi_common_error.h" +#include "no_os_print_log.h" +#include "no_os_platform.h" +#include "stream_image.h" +#include "adi_platform.h" +#include "ADRV9040_FW.h" +#include "no_os_mutex.h" +#include "no_os_delay.h" +#include "common_data.h" +#include "no_os_alloc.h" +#include "parameters.h" +#include "no_os_gpio.h" +#include "no_os_spi.h" +#include +#include +#include +#include + +CUSTOM_FILE profile; + +/** + * \brief Opens a logFile. If the file is already open it will be closed and reopened. + * + * This function opens the file for writing and saves the resulting file + * descriptor to the devHalCfg structure. + * + * \param devHalCfg Pointer to device instance specific platform settings + * \param filename The user provided name of the file to open. + * + * \retval ADI_HAL_ERR_OK Function completed successfully, no action required + * \retval ADI_HAL_ERR_NULL_PTR The function has been called with a null pointer + * \retval ADI_HAL_LOGGING_FAIL If the function failed to open or write to the specified filename + */ +adi_hal_Err_e no_os_LogFileOpen(void *devHalCfg, const char *filename) +{ + return ADI_HAL_ERR_OK; +} + +/** + * \brief Flushes the logFile buffer to the currently open log file. + * + * \param devHalCfg Pointer to device instance specific platform settings + * + * \retval ADI_HAL_ERR_OK Function completed successfully, no action required + * \retval ADI_HAL_ERR_NULL_PTR The function has been called with a null pointer + */ +int32_t no_os_LogFileFlush(void *devHalCfg) +{ + return ADI_HAL_ERR_OK; +} + +/** + * \brief Gracefully closes the log file(s). + * + * \param devHalCfg Pointer to device instance specific platform settings + * + * \retval ADI_HAL_ERR_OK Function completed successfully, no action required + * \retval ADI_HAL_ERR_NULL_PTR The function has been called with a null pointer + * \retval ADI_HAL_LOGGING_FAIL Error while flushing or closing the log file. + */ +adi_hal_Err_e no_os_LogFileClose(void *devHalCfg) +{ + return ADI_HAL_ERR_OK; +} + +/** + * ToDo + */ +adi_hal_Err_e no_os_LogStatusGet(void* const devHalCfg, + adi_hal_LogStatusGet_t* const logStatus) +{ + return ADI_HAL_ERR_OK; +} + +/** + * ToDo + */ +adi_hal_Err_e no_os_LogConsoleSet(void* const devHalCfg, + const adi_hal_LogConsole_e logConsoleFlag) +{ + return ADI_HAL_ERR_OK; +} + +/** + * \brief Sets the log level, allowing the end user to select the granularity of + * what events get logged. + * + * \param devHalCfg Pointer to device instance specific platform settings + * \param logLevel A mask of valid log levels to allow to be written to the log file. + * + * \retval ADI_COMMON_ERR_ACT_CHECK_PARAM Recovery action for bad parameter check + * \retval ADI_COMMON_ACT_NO_ACTION Function completed successfully, no action required + */ +adi_hal_Err_e no_os_LogLevelSet(void *devHalCfg, const uint32_t logMask) +{ + struct adrv904x_hal_cfg *halCfg = NULL; + + if (devHalCfg == NULL) { + return ADI_COMMON_ERR_ACT_CHECK_PARAM; + } + + halCfg = (struct adrv904x_hal_cfg *)devHalCfg; + + halCfg->logLevel = (logMask & (int32_t)ADI_HAL_LOG_ALL); + + return ADI_HAL_ERR_OK; +} + +/** + * \brief Gets the currently set log level: the mask of different types of log + * events that are currently enabled to be logged. + * + * \param devHalCfg Pointer to device instance specific platform settings + * \param logLevel Returns the current log level mask. + * + * \retval ADI_HAL_ERR_OK Function completed successfully, no action required + * \retval ADI_HAL_ERR_NULL_PTR The function has been called with a null pointer + */ +adi_hal_Err_e no_os_LogLevelGet(void* const devHalCfg, uint32_t *logLevel) +{ + int32_t halError = (int32_t)ADI_HAL_ERR_OK; + struct adrv904x_hal_cfg *halCfg = NULL; + + if (devHalCfg == NULL) { + halError = (int32_t)ADI_HAL_ERR_NULL_PTR; + return halError; + } + + halCfg = (struct adrv904x_hal_cfg *)devHalCfg; + + *logLevel = halCfg->logLevel; + + return halError; +} + +/** + * \brief Writes a message to the currently open logFile specified in the + * adi_hal_LogCfg_t of the devHalCfg structure passed + * + * Uses the vfprintf functionality to allow the user to supply the format and + * the number of aguments that will be logged. + * + * \param devHalCfg Pointer to device instance specific platform settings + * \param logLevel the log level to be written into + * \param comment the string to include in the line added to the log. + * \param argp variable argument list to be printed + * + * \retval ADI_HAL_ERR_OK Function completed successfully, no action required + * \retval ADI_HAL_ERR_NULL_PTR The function has been called with a null pointer + * \retval ADI_HAL_LOGGING_FAIL If the function failed to flush to write + */ + +adi_hal_Err_e no_os_LogWrite(void* const devHalCfg, + const adi_hal_LogLevel_e logLevel, + const uint8_t indent, + const char* const comment, + va_list argp) +{ + int32_t halError = (int32_t)ADI_HAL_ERR_OK; + int32_t result = 0; + struct adrv904x_hal_cfg *halCfg = NULL; + char logMessage[ADI_HAL_MAX_LOG_LINE] = { 0 }; + const char *logLevelChar = NULL; + logMessage[0] = 0; + + if (devHalCfg == NULL) { + halError = (int32_t)ADI_HAL_ERR_NULL_PTR; + return halError; + } + + halCfg = (struct adrv904x_hal_cfg *)devHalCfg; + + if (halCfg->logLevel == (int32_t)ADI_HAL_LOG_NONE) { + /* If logging disabled, exit gracefully */ + halError = (int32_t)ADI_HAL_ERR_OK; + return halError; + } + + if (logLevel > (int32_t)ADI_HAL_LOG_ALL) { + //halError = (int32_t)ADI_HAL_LOGGGING_LEVEL_FAIL; + halError = (int32_t)6; + return halError; + } + + /* Print Log type */ + if ((halCfg->logLevel & ADI_HAL_LOG_MSG) && + (logLevel == (int32_t)ADI_HAL_LOG_MSG)) { + logLevelChar = "MESSAGE:"; + } else if ((halCfg->logLevel & ADI_HAL_LOG_WARN) && + (logLevel == (int32_t)ADI_HAL_LOG_WARN)) { + logLevelChar = "WARNING:"; + } else if ((halCfg->logLevel & ADI_HAL_LOG_ERR) && + (logLevel == (int32_t)ADI_HAL_LOG_ERR)) { + logLevelChar = "ERROR:"; + } else if ((halCfg->logLevel & ADI_HAL_LOG_API) && + (logLevel == (int32_t)ADI_HAL_LOG_API)) { + logLevelChar = "API_LOG:"; + } else if ((halCfg->logLevel & ADI_HAL_LOG_HAL) && + (logLevel == (int32_t)ADI_HAL_LOG_HAL)) { + logLevelChar = "ADI_HAL_LOG:"; + } else if ((halCfg->logLevel & ADI_HAL_LOG_SPI) && + (logLevel == (int32_t)ADI_HAL_LOG_SPI)) { + logLevelChar = "SPI_LOG:"; + } else if ((halCfg->logLevel & ADI_HAL_LOG_API_PRIV) && + (logLevel == (int32_t)ADI_HAL_LOG_API_PRIV)) { + logLevelChar = "API_PRIV_LOG:"; + } else { + /* Nothing to log - exit cleanly */ + return (int32_t)ADI_HAL_ERR_OK; + } + + result = snprintf(logMessage, ADI_HAL_MAX_LOG_LINE, "%s", logLevelChar); + if (result < 0) { + //halError = (int32_t)ADI_HAL_LOGGING_FAIL; + halError = (int32_t)5; + return halError; + } + + result = vsnprintf(logMessage + strlen(logMessage), + ADI_HAL_MAX_LOG_LINE, comment, argp); + if (result < 0) { + // halError = (int32_t)ADI_HAL_LOGGING_FAIL; + halError = (int32_t)5; + return halError; + } + + switch (logLevel) { + case ADI_HAL_LOG_NONE: + break; + case ADI_HAL_LOG_WARN: + pr_warning("%s\n", logMessage); + break; + case ADI_HAL_LOG_ERR: + pr_err("%s\n", logMessage); + break; + case ADI_HAL_LOG_SPI: + pr_debug("%s\n", logMessage); + break; + case ADI_HAL_LOG_API: + case ADI_HAL_LOG_API_PRIV: + case ADI_HAL_LOG_BF: + case ADI_HAL_LOG_HAL: + case ADI_HAL_LOG_MSG: + pr_debug("%s\n", logMessage); + break; + case ADI_HAL_LOG_ALL: + pr_info(logMessage); + break; + } + + return halError; +} + +/** + * \brief Opens/allocates any necessary resources to communicate via SPI to a + * particular device specified in the devHalCfg structure. + * + * This function should perform any necessary steps to open the SPI master resource + * on the BBIC to enable SPI communications to a particular SPI device. + * + * \param devHalCfg Pointer to device instance specific platform settings + * + * \retval ADI_HAL_ERR_OK function completed successfully, no action required + * \retval ADI_HAL_ERR_NULL_PTR the function has been called with a null pointer + * \retval ADI_HAL_SPI_FAIL the device driver was not opened successfully + */ +int32_t no_os_SpiOpen(void *devHalCfg) +{ + return ADI_HAL_ERR_OK; +} + +/** + * \brief Closes any resources open/allocated for a specific SPI device + * + * Any information needed to close the particular SPI device should be passed in + * the devHalCfg structure. + * + * \param devHalCfg Pointer to device instance specific platform settings + * + * \retval ADI_HAL_ERR_OK function completed successfully, no action required + * \retval ADI_HAL_ERR_NULL_PTR the function has been called with a null pointer + * \retval ADI_HAL_SPI_FAIL the device driver was not closed successfully + */ +int32_t no_os_SpiClose(void *devHalCfg) +{ + return ADI_HAL_ERR_OK; +} + +/** + * \brief Initializes the SPI device driver mode, bits per word, and speed + * + * Any settings needed should be passed in the devHalCfg structure + * + * \param devHalCfg Pointer to device instance specific platform settings + * + * \retval ADI_HAL_ERR_OK function completed successfully, no action required + * \retval ADI_HAL_ERR_NULL_PTR the function has been called with a null pointer + * \retval ADI_HAL_SPI_FAIL the SPI initialization failed + */ +adi_hal_Err_e no_os_SpiInit(void *devHalCfg) +{ + return ADI_HAL_ERR_OK; +} + +/** + * \brief Write an array of 8-bit data to a SPI device + * + * The function will write numTxBytes number of bytes to the SPI device + * selected in the devHalCfg structure. + * + * \param devHalCfg Pointer to device instance specific platform settings + * \param txData Pointer to byte array txData buffer that has numTxBytes number of bytes + * \param numTxBytes The length of txData array + * + * \retval ADI_HAL_ERR_OK function completed successfully, no action required + * \retval ADI_HAL_ERR_NULL_PTR the function has been called with a null pointer + * \retval ADI_HAL_SPI_FAIL the data was not written successfully + */ +adi_hal_Err_e no_os_SpiWrite(void *devHalCfg, const uint8_t txData[], + uint32_t numTxBytes) +{ + int32_t halError = (int32_t)ADI_HAL_ERR_OK; + struct adrv904x_hal_cfg *halCfg = NULL; + static const uint32_t MAX_SIZE = 4096; + int32_t remaining = numTxBytes; + uint32_t toWrite = 0; + int32_t result = 0; + + if (devHalCfg == NULL) { + halError = (int32_t)ADI_HAL_ERR_NULL_PTR; + return halError; + } + + halCfg = (struct adrv904x_hal_cfg *)devHalCfg; + + do { + toWrite = (remaining > MAX_SIZE) ? MAX_SIZE : remaining; + result = no_os_spi_write_and_read(halCfg->spi, + &txData[numTxBytes - remaining], + toWrite); + if (result < 0) { + //return ADI_HAL_SPI_FAIL; + return 2; + } + remaining -= toWrite; + } while (remaining > 0); + + return halError; +} + +/** + * \brief Read one or more bytes from the device specified by the devHalCfg structure + * + * The function will read numTxRxBytes number of bytes from the SPI device selected in + * the devHalCfg parameter and store the resulting data sent by the device in the rxData + * data buffer. + * + * For each byte in txData written to the device, a byte is read and returned by this + * function at the pointer provided by the rxData parameter. + * + * \param devHalCfg Pointer to device instance specific platform settings + * \param txData Pointer to byte array that has numTxRxBytes number of bytes + * \param rxData Pointer to byte array where read back data will be returned, that is at least numTxRxBytes in size. + * \param numTxRxBytes The length of txData and rxData arrays + * + * \retval ADI_HAL_ERR_OK function completed successfully, no action required + * \retval ADI_HAL_ERR_NULL_PTR the function has been called with a null pointer + * \retval ADI_HAL_SPI_FAIL the data was not read successfully + */ +adi_hal_Err_e no_os_SpiRead(void *devHalCfg, const uint8_t txData[], + uint8_t rxData[], + uint32_t numTxRxBytes) +{ + int32_t halError = (int32_t)ADI_HAL_ERR_OK; + struct adrv904x_hal_cfg *halCfg = NULL; + static const uint32_t MAX_SIZE = 4096; + int32_t remaining = numTxRxBytes; + uint32_t toWrite = 0; + int32_t result = 0; + + if (devHalCfg == NULL) { + halError = (int32_t)ADI_HAL_ERR_NULL_PTR; + return halError; + } + + memcpy(rxData, txData, numTxRxBytes); + + halCfg = (struct adrv904x_hal_cfg *)devHalCfg; + + do { + toWrite = (remaining > MAX_SIZE) ? MAX_SIZE : remaining; + result = no_os_spi_write_and_read(halCfg->spi, + &rxData[numTxRxBytes - remaining], + toWrite); + if (result < 0) + //return ADI_HAL_SPI_FAIL; + return 2; + remaining -= toWrite; + } while (remaining > 0); + + return halError; +} + +/** + * ToDo + */ +adi_hal_Err_e no_os_RegisterWrite(void* const devHalCfg, const uint32_t addr, + const uint32_t data) +{ + return (int32_t)ADI_HAL_ERR_OK; +} + +/** + * ToDo + */ +adi_hal_Err_e no_os_RegisterRead(void* const devHalCfg, const uint32_t addr, + uint32_t* const data) +{ + return (int32_t)ADI_HAL_ERR_OK; +} + +/** + * \brief Function to open/allocate any necessary resources for the timer wait + * functions below. + * + * \param devHalCfg Pointer to device instance specific platform settings + * + * \retval ADI_HAL_ERR_OK Function completed successfully + */ +int32_t no_os_TimerOpen(void *devHalCfg) +{ + /* ADI ZC706 platform does not require any timer open /close */ + return (int32_t)ADI_HAL_ERR_OK; +} + +/** + * \brief Function to close any necessary resources for the timer wait + * functions below. + * + * \param devHalCfg Pointer to device instance specific platform settings + * + * \retval ADI_HAL_ERR_OK Function completed successfully + */ +int32_t no_os_TimerClose(void *devHalCfg) +{ + /* ADI ZC706 platform does not require any timer open /close */ + return (int32_t)ADI_HAL_ERR_OK; +} + +/** + * \brief Function to initialize any necessary resources for the timer wait + * functions below. + * + * \param devHalCfg Pointer to device instance specific platform settings + * + * \retval ADI_HAL_ERR_OK Function completed successfully + */ +int32_t no_os_TimerInit(void *devHalCfg) +{ + /* ADI ZC706 platform does not require any timer init */ + return (int32_t)ADI_HAL_ERR_OK; +} + +/**pthread_mutex_t + * \brief Provides a blocking delay of the current thread + * + * \param devHalCfg Pointer to device instance specific platform settings + * \param time_ms the time to delay in milli seconds + * + * \retval ADI_HAL_ERR_OK Function completed successfully + * \retval ADI_HAL_ERR_NULL_PTR the function has been called with a null pointer + */ +adi_hal_Err_e no_os_TimerWait_ms(void *devHalCfg, uint32_t time_ms) +{ + int32_t halError = (int32_t)ADI_HAL_ERR_OK; + + no_os_mdelay(time_ms); + + return halError; +} + +/** + * \brief Provides a blocking delay of the current thread + * + * \param devHalCfg Pointer to device instance specific platform settings + * \param time_us the time to delay in mico seconds + * + * \retval ADI_HAL_ERR_OK Function completed successfully + * \retval ADI_HAL_ERR_NULL_PTR the function has been called with a null pointer + */ +adi_hal_Err_e no_os_TimerWait_us(void *devHalCfg, uint32_t time_us) +{ + int32_t halError = (int32_t)ADI_HAL_ERR_OK; + + no_os_udelay(time_us); + + return halError; +} + +/** + * \brief ToDo + */ +adi_hal_Err_e no_os_mutex_init_wrapper(adi_hal_mutex_t* const mutex) +{ +// no_os_mutex_init(mutex); + + return ADI_HAL_ERR_OK; +} + +/** + * \brief ToDo + */ +adi_hal_Err_e no_os_mutex_lock_wrapper(adi_hal_mutex_t* const mutex) +{ +// no_os_mutex_lock(*mutex); + + return ADI_HAL_ERR_OK; +} + +/** + * \brief ToDo + */ +adi_hal_Err_e no_os_mutex_unlock_wrapper(adi_hal_mutex_t* const mutex) +{ +// no_os_mutex_unlock(*mutex); + + return ADI_HAL_ERR_OK; +} + +/** + * \brief ToDo + */ +adi_hal_Err_e no_os_mutex_remove_wrapper(adi_hal_mutex_t* const mutex) +{ +// no_os_mutex_remove(mutex); + + return ADI_HAL_ERR_OK; +} + +/** + * \brief Opens all necessary files and device drivers for a specific device + * + * \param devHalCfg Pointer to device instance specific platform settings + * + * \retval ADI_HAL_ERR_OK Function completed successfully, no action required + * \retval ADI_HAL_ERR_NULL_PTR The function has been called with a null pointer + * \retval errors returned by other function calls. + */ +adi_hal_Err_e no_os_HwOpen(void *devHalCfg) +{ + int32_t ret; + struct adrv904x_hal_cfg *phal = (struct adrv904x_hal_cfg *)devHalCfg; + struct no_os_gpio_init_param gip_gpio_reset_n = { 0 }; + struct no_os_spi_init_param sip = { 0 }; + + /* sysref req GPIO configuration */ + gip_gpio_reset_n.number = ADRV9040_RESET_B; + gip_gpio_reset_n.extra = clkchip_gpio_init_param.extra; + gip_gpio_reset_n.platform_ops = clkchip_gpio_init_param.platform_ops; + ret = no_os_gpio_get(&phal->gpio_reset_n, &gip_gpio_reset_n); + if (ret) + return ret; + + ret = no_os_gpio_direction_output(phal->gpio_reset_n, NO_OS_GPIO_HIGH); + if (ret) + return ret; + + sip.device_id = SPI_DEVICE_ID; + sip.max_speed_hz = 5000000u; + sip.mode = NO_OS_SPI_MODE_0; + sip.chip_select = ADRV9040_CS; + sip.platform_ops = ad9528_spi_param.platform_ops; + sip.extra = ad9528_spi_param.extra; + + ret = no_os_spi_init(&phal->spi, &sip); + if (ret) + return ret; + + ret = no_os_gpio_set_value(phal->gpio_reset_n, NO_OS_GPIO_HIGH); + if (ret) + return ret; + + return ADI_HAL_ERR_OK; +} + +/** + * \brief Gracefully shuts down the the hardware closing any open resources + * such as log files, I2C, SPI, GPIO drivers, timer resources, etc. + * + * \param devHalCfg Pointer to device instance specific platform settings + * + * \retval ADI_HAL_ERR_OK Function completed successfully, no action required + * \retval ADI_HAL_ERR_NULL_PTR The function has been called with a null pointer + */ +adi_hal_Err_e no_os_HwClose(void *devHalCfg) +{ + int32_t ret; + struct adrv904x_hal_cfg *phal = (struct adrv904x_hal_cfg *)devHalCfg; + ret = no_os_gpio_remove(phal->gpio_reset_n); + if (ret) + return ret; + + ret = no_os_spi_remove(phal->spi); + if (ret) + return ret; + + return ADI_HAL_ERR_OK; +} + +/** + * \brief This function control a BBIC GPIO pin that connects to the reset pin + * of each device. + * + * This function is called by each device API giving access to the Reset pin + * connected to each device. + * + * \param devHalCfg Pointer to device instance specific platform settings + * \param pinLevel The desired pin logic level 0=low, 1=high to set the GPIO pin to. + * + * \retval ADI_HAL_ERR_OK Function completed successfully, no action required + * \retval ADI_HAL_ERR_NULL_PTR The function has been called with a null pointer + */ +adi_hal_Err_e no_os_HwReset(void *devHalCfg, const uint8_t pinLevel) +{ + struct adrv904x_hal_cfg *phal = (struct adrv904x_hal_cfg *)devHalCfg; + + if (devHalCfg == NULL) { + return ADI_HAL_ERR_NULL_PTR; + } + + no_os_gpio_set_value(phal->gpio_reset_n, pinLevel); + + return ADI_HAL_ERR_OK; +} + +/* + * Function pointer assignment for default configuration + */ + +/* Initialization interface to open, init, close drivers and pointers to resources */ +adi_hal_Err_e (*adi_hal_HwOpen)(void *devHalCfg) = no_os_HwOpen; +adi_hal_Err_e (*adi_hal_HwClose)(void *devHalCfg) = no_os_HwClose; +adi_hal_Err_e (*adi_hal_HwReset)(void *devHalCfg, + const uint8_t pinLevel) = no_os_HwReset; +adi_hal_Err_e (*adi_hal_SpiInit)(void *devHalCfg) = + no_os_SpiInit; /* TODO: remove? called by HwOpen() */ +void *(*adi_hal_DevHalCfgCreate)(uint32_t interfaceMask, uint8_t spiChipSelect, + const char *logFilename) = NULL; +adi_hal_Err_e (*adi_hal_DevHalCfgFree)(void *devHalCfg) = NULL; + +/* SPI Interface */ +adi_hal_Err_e (*adi_hal_SpiWrite)(void *devHalCfg, const uint8_t txData[], + uint32_t numTxBytes) = no_os_SpiWrite; + +adi_hal_Err_e (*adi_hal_SpiRead)(void *devHalCfg, const uint8_t txData[], + uint8_t rxData[], uint32_t numRxBytes) = no_os_SpiRead; + +adi_hal_Err_e (*adi_hal_BbicRegisterWrite)(void* const devHalCfg, + const uint32_t addr, const uint32_t data) = no_os_RegisterWrite; + +adi_hal_Err_e (*adi_hal_BbicRegisterRead)(void* const devHalCfg, + const uint32_t addr, uint32_t* const data) = no_os_RegisterRead; + +adi_hal_Err_e (*adi_hal_BbicRegistersRead)( void* const devHalCfg, + const uint32_t addr, + uint32_t data[], + const uint32_t numDataWords) = NULL; //ToDo + +adi_hal_Err_e (*adi_hal_BbicRegistersWrite)( void* const devHalCfg, + const uint32_t addr, + const uint32_t data[], + const uint32_t numDataWords) = NULL; //ToDo + +/* Custom SPI streaming interface*/ +int32_t (*adi_hal_CustomSpiStreamWrite)(void *devHalCfg, const uint16_t address, + const uint8_t txData[], + uint32_t numTxBytes, + uint8_t numBytesofAddress, + uint8_t numBytesOfDataPerStream) = NULL; + +int32_t (*adi_hal_CustomSpiStreamRead)(void *devHalCfg, const uint16_t address, + uint8_t rxData[], uint32_t numRxBytes, + uint8_t numBytesofAddress, + uint8_t numBytesOfDataPerStream) = NULL; + +/* Logging interface */ +adi_hal_Err_e (*adi_hal_LogFileOpen)(void *devHalCfg, + const char *filename) = no_os_LogFileOpen; + +adi_hal_Err_e (*adi_hal_LogLevelSet)(void *devHalCfg, + const uint32_t logMask) = no_os_LogLevelSet; + +adi_hal_Err_e (*adi_hal_LogLevelGet)(void* const devHalCfg, + uint32_t* logMask) = no_os_LogLevelGet; + +adi_hal_Err_e (*adi_hal_LogWrite)(void* const devHalCfg, + const adi_hal_LogLevel_e logLevel, + const uint8_t indent, + const char* const comment, + va_list argp) = no_os_LogWrite; + +adi_hal_Err_e (*adi_hal_LogFileClose)(void *devHalCfg) = no_os_LogFileClose; + +adi_hal_Err_e (*adi_hal_LogStatusGet)(void* const devHalCfg, + adi_hal_LogStatusGet_t* const logStatus) = no_os_LogStatusGet; + +adi_hal_Err_e (*adi_hal_LogConsoleSet)(void* const devHalCfg, + const adi_hal_LogConsole_e logConsoleFlag) = no_os_LogConsoleSet; // ToDo + +/* Timer interface */ +adi_hal_Err_e (*adi_hal_Wait_ms)(void *devHalCfg, + uint32_t time_ms) = no_os_TimerWait_ms; + +adi_hal_Err_e (*adi_hal_Wait_us)(void *devHalCfg, + uint32_t time_us) = no_os_TimerWait_us; + + +/* Threads */ +//ToDo +adi_hal_thread_t (*adi_hal_ThreadSelf)(void) = NULL; + +void* no_os_hal_TlsGet(const adi_hal_TlsType_e tlsType) +{ + return NULL; +} + +void* (*adi_hal_TlsGet)(const adi_hal_TlsType_e tlsType) = no_os_hal_TlsGet; + +adi_hal_Err_e no_os_hal_TlsSet(const adi_hal_TlsType_e tlsType, + void* const value) +{ + return ADI_HAL_ERR_OK; +} + +adi_hal_Err_e (*adi_hal_TlsSet)(const adi_hal_TlsType_e tlsType, + void* const value) = no_os_hal_TlsSet; + +/* Mutexes */ +adi_hal_Err_e (*adi_hal_MutexInit)(adi_hal_mutex_t* const mutex) = + no_os_mutex_init_wrapper; + +adi_hal_Err_e(*adi_hal_MutexLock)(adi_hal_mutex_t* const mutex) = + no_os_mutex_lock_wrapper; +adi_hal_Err_e(*adi_hal_MutexUnlock)(adi_hal_mutex_t* const mutex) = + no_os_mutex_unlock_wrapper; +adi_hal_Err_e(*adi_hal_MutexDestroy)(adi_hal_mutex_t* const mutex) = + no_os_mutex_remove_wrapper; + +/* + * FileIO abstraction + * + */ + +long int ftell (FILE *stream) +{ + return profile.ptr - profile.start; +} + +FILE* __fopen(const char * filename, const char *mode) +{ + FILE *stream = no_os_calloc(1, sizeof(*stream)); + unsigned int length; + char *temp; + + if (!strcmp(filename, "DeviceProfileTest.bin")) { + length = sizeof(DeviceProfileTest_bin); + temp = (char *)no_os_calloc(length, sizeof(char)); + memcpy(temp, DeviceProfileTest_bin, length); + profile.data = temp; + profile.start = profile.ptr = profile.data; + profile.end = profile.start + length; + } else if (!strcmp(filename, "stream_image.bin")) { + length = sizeof(stream_image_bin); + temp = (char *)no_os_calloc(length, sizeof(char)); + memcpy(temp, stream_image_bin, length); + profile.data = temp; + profile.start = profile.ptr = profile.data; + profile.end = profile.start + length; + } else if (!strcmp(filename, "ADRV9040_FW.bin")) { + length = sizeof(ADRV9040_FW_bin); + temp = (char *)no_os_calloc(length, sizeof(char)); + memcpy(temp, ADRV9040_FW_bin, sizeof(ADRV9040_FW_bin)); + profile.data = temp; + profile.start = profile.ptr = profile.data; + profile.end = profile.start + length; + } else if (!strcmp(filename, "ADRV9040_DFE_CALS_FW.bin")) { + length = sizeof(ADRV9040_DFE_CALS_FW_bin); + temp = (char *)no_os_calloc(length, sizeof(char)); + memcpy(temp, ADRV9040_DFE_CALS_FW_bin, sizeof(ADRV9040_DFE_CALS_FW_bin)); + profile.data = temp; + profile.start = profile.ptr = profile.data; + profile.end = profile.start + length; + } else if (!strcmp(filename, "RxGainTable.csv")) { + length = strlen(ADRV9040_RxGainTable_text); + temp = (char *)no_os_calloc(length, sizeof(char)); + strcpy(temp, ADRV9040_RxGainTable_text); + profile.data = temp; + profile.start = profile.ptr = profile.data; + profile.end = profile.start + strlen(profile.data); + } else { + no_os_free(stream); + } + + return stream; +} + +int fseekx(FILE * stream, long int offset, int origin) +{ + char *ptr; + + switch (origin) { + case SEEK_END: + ptr = profile.end + offset; + break; + case SEEK_SET: + ptr = profile.start + offset; + break; + case SEEK_CUR: + ptr = profile.ptr + offset; + break; + default: + return -EINVAL; + } + + if (ptr > profile.end || ptr < profile.start) + return -1; + + profile.ptr = ptr; + + return 0; +} + +int __fclose(FILE *stream) +{ + + if (stream == NULL) + return -ENODEV; + + memset(&profile, 0, sizeof(profile)); + no_os_free(stream); + + return 0; +} + +char * fgets(char *dst, int num, FILE *stream) +{ + char *p; + int c; + + for (p = dst, num--; num > 0; num--) { + if (profile.ptr + 1 > profile.end) { + return NULL; + } + + c = *profile.ptr++; + *p++ = c; + + if (c == '\n') + break; + } + *p = 0; + if (p == dst) + return NULL; + + return p; +} + +size_t fread(void *ptr, size_t size, size_t count, FILE *stream) +{ + int total = size * count; + + if ((profile.ptr + total) > profile.end) + total = profile.end - profile.ptr; + + memcpy(ptr, profile.ptr, total); + profile.ptr += total; + + return total; +} + +size_t fwrite(const void * ptr, size_t size, size_t count, FILE *stream) +{ + return 0; +} + +/* + * Iterative algorithm based on the fact that + * multiplication (division) in the linear domain is equivalent to + * addition (subtraction) in the log domain. + */ + +#define COMPUTE(n, d) if (neg) {a *= d; a /= n;} else {a *= n; a /= d;}; + +long int_20db_to_mag(long a, int mdB) +{ + unsigned neg = 0; + + if (mdB < 0) { + neg = 1; + mdB *= -1; + } + + while (mdB > 0) { + if (mdB >= 20000) { + mdB -= 20000; + COMPUTE(10, 1); /* 10^(20/20) */ + continue; + } + if (mdB >= 6000) { + mdB -= 6000; + COMPUTE(199526, 100000); /* 10^(6/20) */ + continue; + } + if (mdB >= 1000) { + mdB -= 1000; + COMPUTE(112202, 100000); /* 10^(1/20) */ + continue; + } + if (mdB >= 100) { + mdB -= 100; + COMPUTE(101158, 100000); /* 10^(0.1/20) */ + continue; + } + if (mdB >= 10) { + mdB -= 10; + COMPUTE(100115, 100000); /* 10^(0.01/20) */ + continue; + } + if (mdB >= 1) { + mdB -= 1; + COMPUTE(100012, 100000); /* 10^(0.001/20) */ + continue; + } + } + + return a; +} + +int _gettimeofday( struct timeval *tv, void *tzvp ) +{ + uint64_t t = 0; // get uptime in nanoseconds + tv->tv_sec = t / 1000000000; // convert to seconds + tv->tv_usec = ( t % 1000000000 ) / 1000; // get remaining microseconds + return 0; // return non-zero for error +} // end _gettimeofday() diff --git a/projects/adrv904x/src/common/hal/no_os_platform.h b/projects/adrv904x/src/common/hal/no_os_platform.h new file mode 100644 index 00000000000..1ae79a48534 --- /dev/null +++ b/projects/adrv904x/src/common/hal/no_os_platform.h @@ -0,0 +1,50 @@ +/***************************************************************************//** + * @file no_os_platform.h + * @brief adrv904x Hardware Abstraction Layer for no-OS. + * @author GMois (george.mois@analog.com) +******************************************************************************** + * Copyright 2023(c) Analog Devices, Inc. + * + * 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 Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights + * of one or more patent holders. This license does not release you + * from the requirement that you obtain separate licenses from these + * patent holders to use this software. + * - Use of the software either in source or binary form, must be run + * on or directly connected to an Analog Devices Inc. component. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, 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 NO_OS_PLATFORM_H_ +#define NO_OS_PLATFORM_H_ + +#define CONFIG_CF_AXI_ADC + +struct adrv904x_hal_cfg { + struct no_os_spi_desc *spi; + struct no_os_gpio_desc *gpio_reset_n; + int32_t logLevel; /*!< valid 0 - 0xFF */ +}; + +#endif diff --git a/projects/adrv904x/src/common/initdata.c b/projects/adrv904x/src/common/initdata.c new file mode 100644 index 00000000000..08b2f713990 --- /dev/null +++ b/projects/adrv904x/src/common/initdata.c @@ -0,0 +1,1153 @@ +#include "initdata.h" + +adi_adrv904x_Version_t initStructApiVersion = {2, 10, 0, 4}; + +adi_adrv904x_CpuFwVersion_t initStructArmVersion = { {2, 10, 0, 4}, ADI_ADRV904X_CPU_FW_BUILD_RELEASE}; + +adi_adrv904x_Version_t initStructStreamVersion = {2, 10, 0, 4}; + +adi_adrv904x_Init_t deviceInitStruct = { + .spiOptionsInit = + { + .allowSpiStreaming = 1, + .allowAhbAutoIncrement = 1, + .allowAhbSpiFifoMode = 1, + }, + .clocks = + { + .DevClkOnChipTermResEn = 0, + }, + .cpuMemDump = + { + .filePath = + { + 68, 101, 118, 105, 99, 101, 67, 112, 117, 77, 101, 109, 68, 117, 109, 112, + 46, 98, 105, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }, // filePath (end of array) + }, + .rx = + { + .rxChannelCfg = + { + { + // rxChannelCfg[0] + .rxDataFormat = + { + .formatSelect = ADI_ADRV904X_GAIN_COMPENSATION_DISABLED, + .floatingPointConfig = + { + .fpDataFormat = ADI_ADRV904X_FP_FORMAT_SIGN_EXP_SIGNIFICAND, + .fpRoundMode = ADI_ADRV904X_ROUND_TO_EVEN, + .fpNumExpBits = ADI_ADRV904X_2_EXPONENTBITS, + .fpAttenSteps = ADI_ADRV904X_FPATTEN_0DB, + .fpHideLeadingOne = ADI_ADRV904X_FP_FORMAT_HIDE_LEADING_ONE_DISABLE, + .fpEncodeNan = ADI_ADRV904X_FP_FORMAT_NAN_ENCODE_DISABLE, + }, + .integerConfigSettings = + { + .intEmbeddedBits = ADI_ADRV904X_NO_EMBEDDED_SLICER_BITS, + .intSampleResolution = ADI_ADRV904X_INTEGER_16BIT_2SCOMP, + .intParity = ADI_ADRV904X_NO_PARITY, + .intEmbeddedPos = ADI_ADRV904X_LOWER_NIBBLE_ON_I, + }, + .slicerConfigSettings = + { + .extSlicerStepSize = ADI_ADRV904X_EXTSLICER_STEPSIZE_1DB, + .intSlicerStepSize = ADI_ADRV904X_INTSLICER_STEPSIZE_1DB, + .extSlicerGpioSelect = ADI_ADRV904X_EXTSLICER_RX_GPIO_DISABLE, + .intSlicerGpioSelect = + { + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[0] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[1] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[2] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[3] + }, // intSlicerGpioSelect (end of array) + }, + .embOvldMonitorSettings = + { + .embeddedMonitorSrcLsbI = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbQ = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbPlusOneI = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbPlusOneQ = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorHb2LowSrcSel = ADI_ADRV904X_HB2_LOW_SRC_OVRG_LOW, + .embeddedMonitorHb2HighSrcSel = ADI_ADRV904X_HB2_HIGH_SRC_OVRG_HIGH, + .embeddedMonitorApdLowSrcSel = ADI_ADRV904X_APD_LOW_SRC_LOWER_LEVEL_BLOCKER_EXCEEDED, + .embeddedMonitorApdHighSrcSel = ADI_ADRV904X_APD_HIGH_SRC_UPPER_LEVEL_BLOCKER_EXCEEDED, + .invertHb2Flag = 0, + .invertApdFlag = 0, + }, + .externalLnaGain = 0, + .tempCompensationEnable = 0, + }, + .rxGainIndexInit = 255, + }, // rxChannelCfg[0] + { + // rxChannelCfg[1] + .rxDataFormat = + { + .formatSelect = ADI_ADRV904X_GAIN_COMPENSATION_DISABLED, + .floatingPointConfig = + { + .fpDataFormat = ADI_ADRV904X_FP_FORMAT_SIGN_EXP_SIGNIFICAND, + .fpRoundMode = ADI_ADRV904X_ROUND_TO_EVEN, + .fpNumExpBits = ADI_ADRV904X_2_EXPONENTBITS, + .fpAttenSteps = ADI_ADRV904X_FPATTEN_0DB, + .fpHideLeadingOne = ADI_ADRV904X_FP_FORMAT_HIDE_LEADING_ONE_DISABLE, + .fpEncodeNan = ADI_ADRV904X_FP_FORMAT_NAN_ENCODE_DISABLE, + }, + .integerConfigSettings = + { + .intEmbeddedBits = ADI_ADRV904X_NO_EMBEDDED_SLICER_BITS, + .intSampleResolution = ADI_ADRV904X_INTEGER_16BIT_2SCOMP, + .intParity = ADI_ADRV904X_NO_PARITY, + .intEmbeddedPos = ADI_ADRV904X_LOWER_NIBBLE_ON_I, + }, + .slicerConfigSettings = + { + .extSlicerStepSize = ADI_ADRV904X_EXTSLICER_STEPSIZE_1DB, + .intSlicerStepSize = ADI_ADRV904X_INTSLICER_STEPSIZE_1DB, + .extSlicerGpioSelect = ADI_ADRV904X_EXTSLICER_RX_GPIO_DISABLE, + .intSlicerGpioSelect = + { + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[0] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[1] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[2] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[3] + }, // intSlicerGpioSelect (end of array) + }, + .embOvldMonitorSettings = + { + .embeddedMonitorSrcLsbI = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbQ = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbPlusOneI = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbPlusOneQ = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorHb2LowSrcSel = ADI_ADRV904X_HB2_LOW_SRC_OVRG_LOW, + .embeddedMonitorHb2HighSrcSel = ADI_ADRV904X_HB2_HIGH_SRC_OVRG_HIGH, + .embeddedMonitorApdLowSrcSel = ADI_ADRV904X_APD_LOW_SRC_LOWER_LEVEL_BLOCKER_EXCEEDED, + .embeddedMonitorApdHighSrcSel = ADI_ADRV904X_APD_HIGH_SRC_UPPER_LEVEL_BLOCKER_EXCEEDED, + .invertHb2Flag = 0, + .invertApdFlag = 0, + }, + .externalLnaGain = 0, + .tempCompensationEnable = 0, + }, + .rxGainIndexInit = 255, + }, // rxChannelCfg[1] + { + // rxChannelCfg[2] + .rxDataFormat = + { + .formatSelect = ADI_ADRV904X_GAIN_COMPENSATION_DISABLED, + .floatingPointConfig = + { + .fpDataFormat = ADI_ADRV904X_FP_FORMAT_SIGN_EXP_SIGNIFICAND, + .fpRoundMode = ADI_ADRV904X_ROUND_TO_EVEN, + .fpNumExpBits = ADI_ADRV904X_2_EXPONENTBITS, + .fpAttenSteps = ADI_ADRV904X_FPATTEN_0DB, + .fpHideLeadingOne = ADI_ADRV904X_FP_FORMAT_HIDE_LEADING_ONE_DISABLE, + .fpEncodeNan = ADI_ADRV904X_FP_FORMAT_NAN_ENCODE_DISABLE, + }, + .integerConfigSettings = + { + .intEmbeddedBits = ADI_ADRV904X_NO_EMBEDDED_SLICER_BITS, + .intSampleResolution = ADI_ADRV904X_INTEGER_16BIT_2SCOMP, + .intParity = ADI_ADRV904X_NO_PARITY, + .intEmbeddedPos = ADI_ADRV904X_LOWER_NIBBLE_ON_I, + }, + .slicerConfigSettings = + { + .extSlicerStepSize = ADI_ADRV904X_EXTSLICER_STEPSIZE_1DB, + .intSlicerStepSize = ADI_ADRV904X_INTSLICER_STEPSIZE_1DB, + .extSlicerGpioSelect = ADI_ADRV904X_EXTSLICER_RX_GPIO_DISABLE, + .intSlicerGpioSelect = + { + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[0] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[1] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[2] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[3] + }, // intSlicerGpioSelect (end of array) + }, + .embOvldMonitorSettings = + { + .embeddedMonitorSrcLsbI = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbQ = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbPlusOneI = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbPlusOneQ = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorHb2LowSrcSel = ADI_ADRV904X_HB2_LOW_SRC_OVRG_LOW, + .embeddedMonitorHb2HighSrcSel = ADI_ADRV904X_HB2_HIGH_SRC_OVRG_HIGH, + .embeddedMonitorApdLowSrcSel = ADI_ADRV904X_APD_LOW_SRC_LOWER_LEVEL_BLOCKER_EXCEEDED, + .embeddedMonitorApdHighSrcSel = ADI_ADRV904X_APD_HIGH_SRC_UPPER_LEVEL_BLOCKER_EXCEEDED, + .invertHb2Flag = 0, + .invertApdFlag = 0, + }, + .externalLnaGain = 0, + .tempCompensationEnable = 0, + }, + .rxGainIndexInit = 255, + }, // rxChannelCfg[2] + { + // rxChannelCfg[3] + .rxDataFormat = + { + .formatSelect = ADI_ADRV904X_GAIN_COMPENSATION_DISABLED, + .floatingPointConfig = + { + .fpDataFormat = ADI_ADRV904X_FP_FORMAT_SIGN_EXP_SIGNIFICAND, + .fpRoundMode = ADI_ADRV904X_ROUND_TO_EVEN, + .fpNumExpBits = ADI_ADRV904X_2_EXPONENTBITS, + .fpAttenSteps = ADI_ADRV904X_FPATTEN_0DB, + .fpHideLeadingOne = ADI_ADRV904X_FP_FORMAT_HIDE_LEADING_ONE_DISABLE, + .fpEncodeNan = ADI_ADRV904X_FP_FORMAT_NAN_ENCODE_DISABLE, + }, + .integerConfigSettings = + { + .intEmbeddedBits = ADI_ADRV904X_NO_EMBEDDED_SLICER_BITS, + .intSampleResolution = ADI_ADRV904X_INTEGER_16BIT_2SCOMP, + .intParity = ADI_ADRV904X_NO_PARITY, + .intEmbeddedPos = ADI_ADRV904X_LOWER_NIBBLE_ON_I, + }, + .slicerConfigSettings = + { + .extSlicerStepSize = ADI_ADRV904X_EXTSLICER_STEPSIZE_1DB, + .intSlicerStepSize = ADI_ADRV904X_INTSLICER_STEPSIZE_1DB, + .extSlicerGpioSelect = ADI_ADRV904X_EXTSLICER_RX_GPIO_DISABLE, + .intSlicerGpioSelect = + { + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[0] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[1] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[2] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[3] + }, // intSlicerGpioSelect (end of array) + }, + .embOvldMonitorSettings = + { + .embeddedMonitorSrcLsbI = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbQ = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbPlusOneI = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbPlusOneQ = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorHb2LowSrcSel = ADI_ADRV904X_HB2_LOW_SRC_OVRG_LOW, + .embeddedMonitorHb2HighSrcSel = ADI_ADRV904X_HB2_HIGH_SRC_OVRG_HIGH, + .embeddedMonitorApdLowSrcSel = ADI_ADRV904X_APD_LOW_SRC_LOWER_LEVEL_BLOCKER_EXCEEDED, + .embeddedMonitorApdHighSrcSel = ADI_ADRV904X_APD_HIGH_SRC_UPPER_LEVEL_BLOCKER_EXCEEDED, + .invertHb2Flag = 0, + .invertApdFlag = 0, + }, + .externalLnaGain = 0, + .tempCompensationEnable = 0, + }, + .rxGainIndexInit = 255, + }, // rxChannelCfg[3] + { + // rxChannelCfg[4] + .rxDataFormat = + { + .formatSelect = ADI_ADRV904X_GAIN_COMPENSATION_DISABLED, + .floatingPointConfig = + { + .fpDataFormat = ADI_ADRV904X_FP_FORMAT_SIGN_EXP_SIGNIFICAND, + .fpRoundMode = ADI_ADRV904X_ROUND_TO_EVEN, + .fpNumExpBits = ADI_ADRV904X_2_EXPONENTBITS, + .fpAttenSteps = ADI_ADRV904X_FPATTEN_0DB, + .fpHideLeadingOne = ADI_ADRV904X_FP_FORMAT_HIDE_LEADING_ONE_DISABLE, + .fpEncodeNan = ADI_ADRV904X_FP_FORMAT_NAN_ENCODE_DISABLE, + }, + .integerConfigSettings = + { + .intEmbeddedBits = ADI_ADRV904X_NO_EMBEDDED_SLICER_BITS, + .intSampleResolution = ADI_ADRV904X_INTEGER_16BIT_2SCOMP, + .intParity = ADI_ADRV904X_NO_PARITY, + .intEmbeddedPos = ADI_ADRV904X_LOWER_NIBBLE_ON_I, + }, + .slicerConfigSettings = + { + .extSlicerStepSize = ADI_ADRV904X_EXTSLICER_STEPSIZE_1DB, + .intSlicerStepSize = ADI_ADRV904X_INTSLICER_STEPSIZE_1DB, + .extSlicerGpioSelect = ADI_ADRV904X_EXTSLICER_RX_GPIO_DISABLE, + .intSlicerGpioSelect = + { + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[0] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[1] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[2] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[3] + }, // intSlicerGpioSelect (end of array) + }, + .embOvldMonitorSettings = + { + .embeddedMonitorSrcLsbI = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbQ = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbPlusOneI = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbPlusOneQ = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorHb2LowSrcSel = ADI_ADRV904X_HB2_LOW_SRC_OVRG_LOW, + .embeddedMonitorHb2HighSrcSel = ADI_ADRV904X_HB2_HIGH_SRC_OVRG_HIGH, + .embeddedMonitorApdLowSrcSel = ADI_ADRV904X_APD_LOW_SRC_LOWER_LEVEL_BLOCKER_EXCEEDED, + .embeddedMonitorApdHighSrcSel = ADI_ADRV904X_APD_HIGH_SRC_UPPER_LEVEL_BLOCKER_EXCEEDED, + .invertHb2Flag = 0, + .invertApdFlag = 0, + }, + .externalLnaGain = 0, + .tempCompensationEnable = 0, + }, + .rxGainIndexInit = 255, + }, // rxChannelCfg[4] + { + // rxChannelCfg[5] + .rxDataFormat = + { + .formatSelect = ADI_ADRV904X_GAIN_COMPENSATION_DISABLED, + .floatingPointConfig = + { + .fpDataFormat = ADI_ADRV904X_FP_FORMAT_SIGN_EXP_SIGNIFICAND, + .fpRoundMode = ADI_ADRV904X_ROUND_TO_EVEN, + .fpNumExpBits = ADI_ADRV904X_2_EXPONENTBITS, + .fpAttenSteps = ADI_ADRV904X_FPATTEN_0DB, + .fpHideLeadingOne = ADI_ADRV904X_FP_FORMAT_HIDE_LEADING_ONE_DISABLE, + .fpEncodeNan = ADI_ADRV904X_FP_FORMAT_NAN_ENCODE_DISABLE, + }, + .integerConfigSettings = + { + .intEmbeddedBits = ADI_ADRV904X_NO_EMBEDDED_SLICER_BITS, + .intSampleResolution = ADI_ADRV904X_INTEGER_16BIT_2SCOMP, + .intParity = ADI_ADRV904X_NO_PARITY, + .intEmbeddedPos = ADI_ADRV904X_LOWER_NIBBLE_ON_I, + }, + .slicerConfigSettings = + { + .extSlicerStepSize = ADI_ADRV904X_EXTSLICER_STEPSIZE_1DB, + .intSlicerStepSize = ADI_ADRV904X_INTSLICER_STEPSIZE_1DB, + .extSlicerGpioSelect = ADI_ADRV904X_EXTSLICER_RX_GPIO_DISABLE, + .intSlicerGpioSelect = + { + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[0] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[1] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[2] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[3] + }, // intSlicerGpioSelect (end of array) + }, + .embOvldMonitorSettings = + { + .embeddedMonitorSrcLsbI = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbQ = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbPlusOneI = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbPlusOneQ = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorHb2LowSrcSel = ADI_ADRV904X_HB2_LOW_SRC_OVRG_LOW, + .embeddedMonitorHb2HighSrcSel = ADI_ADRV904X_HB2_HIGH_SRC_OVRG_HIGH, + .embeddedMonitorApdLowSrcSel = ADI_ADRV904X_APD_LOW_SRC_LOWER_LEVEL_BLOCKER_EXCEEDED, + .embeddedMonitorApdHighSrcSel = ADI_ADRV904X_APD_HIGH_SRC_UPPER_LEVEL_BLOCKER_EXCEEDED, + .invertHb2Flag = 0, + .invertApdFlag = 0, + }, + .externalLnaGain = 0, + .tempCompensationEnable = 0, + }, + .rxGainIndexInit = 255, + }, // rxChannelCfg[5] + { + // rxChannelCfg[6] + .rxDataFormat = + { + .formatSelect = ADI_ADRV904X_GAIN_COMPENSATION_DISABLED, + .floatingPointConfig = + { + .fpDataFormat = ADI_ADRV904X_FP_FORMAT_SIGN_EXP_SIGNIFICAND, + .fpRoundMode = ADI_ADRV904X_ROUND_TO_EVEN, + .fpNumExpBits = ADI_ADRV904X_2_EXPONENTBITS, + .fpAttenSteps = ADI_ADRV904X_FPATTEN_0DB, + .fpHideLeadingOne = ADI_ADRV904X_FP_FORMAT_HIDE_LEADING_ONE_DISABLE, + .fpEncodeNan = ADI_ADRV904X_FP_FORMAT_NAN_ENCODE_DISABLE, + }, + .integerConfigSettings = + { + .intEmbeddedBits = ADI_ADRV904X_NO_EMBEDDED_SLICER_BITS, + .intSampleResolution = ADI_ADRV904X_INTEGER_16BIT_2SCOMP, + .intParity = ADI_ADRV904X_NO_PARITY, + .intEmbeddedPos = ADI_ADRV904X_LOWER_NIBBLE_ON_I, + }, + .slicerConfigSettings = + { + .extSlicerStepSize = ADI_ADRV904X_EXTSLICER_STEPSIZE_1DB, + .intSlicerStepSize = ADI_ADRV904X_INTSLICER_STEPSIZE_1DB, + .extSlicerGpioSelect = ADI_ADRV904X_EXTSLICER_RX_GPIO_DISABLE, + .intSlicerGpioSelect = + { + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[0] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[1] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[2] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[3] + }, // intSlicerGpioSelect (end of array) + }, + .embOvldMonitorSettings = + { + .embeddedMonitorSrcLsbI = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbQ = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbPlusOneI = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbPlusOneQ = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorHb2LowSrcSel = ADI_ADRV904X_HB2_LOW_SRC_OVRG_LOW, + .embeddedMonitorHb2HighSrcSel = ADI_ADRV904X_HB2_HIGH_SRC_OVRG_HIGH, + .embeddedMonitorApdLowSrcSel = ADI_ADRV904X_APD_LOW_SRC_LOWER_LEVEL_BLOCKER_EXCEEDED, + .embeddedMonitorApdHighSrcSel = ADI_ADRV904X_APD_HIGH_SRC_UPPER_LEVEL_BLOCKER_EXCEEDED, + .invertHb2Flag = 0, + .invertApdFlag = 0, + }, + .externalLnaGain = 0, + .tempCompensationEnable = 0, + }, + .rxGainIndexInit = 255, + }, // rxChannelCfg[6] + { + // rxChannelCfg[7] + .rxDataFormat = + { + .formatSelect = ADI_ADRV904X_GAIN_COMPENSATION_DISABLED, + .floatingPointConfig = + { + .fpDataFormat = ADI_ADRV904X_FP_FORMAT_SIGN_EXP_SIGNIFICAND, + .fpRoundMode = ADI_ADRV904X_ROUND_TO_EVEN, + .fpNumExpBits = ADI_ADRV904X_2_EXPONENTBITS, + .fpAttenSteps = ADI_ADRV904X_FPATTEN_0DB, + .fpHideLeadingOne = ADI_ADRV904X_FP_FORMAT_HIDE_LEADING_ONE_DISABLE, + .fpEncodeNan = ADI_ADRV904X_FP_FORMAT_NAN_ENCODE_DISABLE, + }, + .integerConfigSettings = + { + .intEmbeddedBits = ADI_ADRV904X_NO_EMBEDDED_SLICER_BITS, + .intSampleResolution = ADI_ADRV904X_INTEGER_16BIT_2SCOMP, + .intParity = ADI_ADRV904X_NO_PARITY, + .intEmbeddedPos = ADI_ADRV904X_LOWER_NIBBLE_ON_I, + }, + .slicerConfigSettings = + { + .extSlicerStepSize = ADI_ADRV904X_EXTSLICER_STEPSIZE_1DB, + .intSlicerStepSize = ADI_ADRV904X_INTSLICER_STEPSIZE_1DB, + .extSlicerGpioSelect = ADI_ADRV904X_EXTSLICER_RX_GPIO_DISABLE, + .intSlicerGpioSelect = + { + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[0] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[1] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[2] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[3] + }, // intSlicerGpioSelect (end of array) + }, + .embOvldMonitorSettings = + { + .embeddedMonitorSrcLsbI = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbQ = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbPlusOneI = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbPlusOneQ = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorHb2LowSrcSel = ADI_ADRV904X_HB2_LOW_SRC_OVRG_LOW, + .embeddedMonitorHb2HighSrcSel = ADI_ADRV904X_HB2_HIGH_SRC_OVRG_HIGH, + .embeddedMonitorApdLowSrcSel = ADI_ADRV904X_APD_LOW_SRC_LOWER_LEVEL_BLOCKER_EXCEEDED, + .embeddedMonitorApdHighSrcSel = ADI_ADRV904X_APD_HIGH_SRC_UPPER_LEVEL_BLOCKER_EXCEEDED, + .invertHb2Flag = 0, + .invertApdFlag = 0, + }, + .externalLnaGain = 0, + .tempCompensationEnable = 0, + }, + .rxGainIndexInit = 255, + }, // rxChannelCfg[7] + { + // rxChannelCfg[8] + .rxDataFormat = + { + .formatSelect = ADI_ADRV904X_GAIN_COMPENSATION_DISABLED, + .floatingPointConfig = + { + .fpDataFormat = ADI_ADRV904X_FP_FORMAT_SIGN_EXP_SIGNIFICAND, + .fpRoundMode = ADI_ADRV904X_ROUND_TO_EVEN, + .fpNumExpBits = ADI_ADRV904X_2_EXPONENTBITS, + .fpAttenSteps = ADI_ADRV904X_FPATTEN_0DB, + .fpHideLeadingOne = ADI_ADRV904X_FP_FORMAT_HIDE_LEADING_ONE_DISABLE, + .fpEncodeNan = ADI_ADRV904X_FP_FORMAT_NAN_ENCODE_DISABLE, + }, + .integerConfigSettings = + { + .intEmbeddedBits = ADI_ADRV904X_NO_EMBEDDED_SLICER_BITS, + .intSampleResolution = ADI_ADRV904X_INTEGER_16BIT_2SCOMP, + .intParity = ADI_ADRV904X_NO_PARITY, + .intEmbeddedPos = ADI_ADRV904X_LOWER_NIBBLE_ON_I, + }, + .slicerConfigSettings = + { + .extSlicerStepSize = ADI_ADRV904X_EXTSLICER_STEPSIZE_1DB, + .intSlicerStepSize = ADI_ADRV904X_INTSLICER_STEPSIZE_1DB, + .extSlicerGpioSelect = ADI_ADRV904X_EXTSLICER_RX_GPIO_DISABLE, + .intSlicerGpioSelect = + { + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[0] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[1] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[2] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[3] + }, // intSlicerGpioSelect (end of array) + }, + .embOvldMonitorSettings = + { + .embeddedMonitorSrcLsbI = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbQ = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbPlusOneI = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbPlusOneQ = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorHb2LowSrcSel = ADI_ADRV904X_HB2_LOW_SRC_OVRG_LOW, + .embeddedMonitorHb2HighSrcSel = ADI_ADRV904X_HB2_HIGH_SRC_OVRG_HIGH, + .embeddedMonitorApdLowSrcSel = ADI_ADRV904X_APD_LOW_SRC_LOWER_LEVEL_BLOCKER_EXCEEDED, + .embeddedMonitorApdHighSrcSel = ADI_ADRV904X_APD_HIGH_SRC_UPPER_LEVEL_BLOCKER_EXCEEDED, + .invertHb2Flag = 0, + .invertApdFlag = 0, + }, + .externalLnaGain = 0, + .tempCompensationEnable = 0, + }, + .rxGainIndexInit = 255, + }, // rxChannelCfg[8] + { + // rxChannelCfg[9] + .rxDataFormat = + { + .formatSelect = ADI_ADRV904X_GAIN_COMPENSATION_DISABLED, + .floatingPointConfig = + { + .fpDataFormat = ADI_ADRV904X_FP_FORMAT_SIGN_EXP_SIGNIFICAND, + .fpRoundMode = ADI_ADRV904X_ROUND_TO_EVEN, + .fpNumExpBits = ADI_ADRV904X_2_EXPONENTBITS, + .fpAttenSteps = ADI_ADRV904X_FPATTEN_0DB, + .fpHideLeadingOne = ADI_ADRV904X_FP_FORMAT_HIDE_LEADING_ONE_DISABLE, + .fpEncodeNan = ADI_ADRV904X_FP_FORMAT_NAN_ENCODE_DISABLE, + }, + .integerConfigSettings = + { + .intEmbeddedBits = ADI_ADRV904X_NO_EMBEDDED_SLICER_BITS, + .intSampleResolution = ADI_ADRV904X_INTEGER_16BIT_2SCOMP, + .intParity = ADI_ADRV904X_NO_PARITY, + .intEmbeddedPos = ADI_ADRV904X_LOWER_NIBBLE_ON_I, + }, + .slicerConfigSettings = + { + .extSlicerStepSize = ADI_ADRV904X_EXTSLICER_STEPSIZE_1DB, + .intSlicerStepSize = ADI_ADRV904X_INTSLICER_STEPSIZE_1DB, + .extSlicerGpioSelect = ADI_ADRV904X_EXTSLICER_RX_GPIO_DISABLE, + .intSlicerGpioSelect = + { + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[0] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[1] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[2] + ADI_ADRV904X_GPIO_INVALID, // intSlicerGpioSelect[3] + }, // intSlicerGpioSelect (end of array) + }, + .embOvldMonitorSettings = + { + .embeddedMonitorSrcLsbI = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbQ = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbPlusOneI = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorSrcLsbPlusOneQ = ADI_ADRV904X_RX_EMB_MON_SRC_NO_MON_DATA_EMBEDDED, + .embeddedMonitorHb2LowSrcSel = ADI_ADRV904X_HB2_LOW_SRC_OVRG_LOW, + .embeddedMonitorHb2HighSrcSel = ADI_ADRV904X_HB2_HIGH_SRC_OVRG_HIGH, + .embeddedMonitorApdLowSrcSel = ADI_ADRV904X_APD_LOW_SRC_LOWER_LEVEL_BLOCKER_EXCEEDED, + .embeddedMonitorApdHighSrcSel = ADI_ADRV904X_APD_HIGH_SRC_UPPER_LEVEL_BLOCKER_EXCEEDED, + .invertHb2Flag = 0, + .invertApdFlag = 0, + }, + .externalLnaGain = 0, + .tempCompensationEnable = 0, + }, + .rxGainIndexInit = 255, + }, // rxChannelCfg[9] + }, // rxChannelCfg (end of array) + }, + .tx = + { + .txChannelCfg = + { + { + // txChannelCfg[0] + .txAttenCfg = + { + .updateCfg = + { + .srcCfg = + { + .updateSrc = ADI_ADRV904X_TXATTEN_UPD_SRC_S0, + .s0OrS1Gpio = ADI_ADRV904X_GPIO_INVALID, + }, + .trgCfg = + { + .updateTrg = ADI_ADRV904X_TXATTEN_UPD_TRG_NONE, + .triggerGpio = ADI_ADRV904X_GPIO_INVALID, + }, + }, + .txAttenStepSize = ADI_ADRV904X_TXATTEN_0P05_DB, + }, + .txAttenInit_mdB = 0, + .txpowerMonitorCfg = + { + .inputSel = ADI_ADRV904X_POST_DPD_HC_OUTPUT, + .peakThreshold = 0, + .measDuration = 0, + .peakCount = 0, + .peakErrorClearRequired = 0, + .peakPowerEnable = 0, + .peakPowerIrqEnable = 0, + .avgThreshold = 0, + .avgErrorClearRequired = 0, + .avgPowerEnable = 0, + .avgPowerIrqEnable = 0, + .avgPeakRatioEnable = 0, + }, + .srlCfg = + { + .inputSel = ADI_ADRV904X_POST_DPD_HC_OUTPUT, + .srdOffset = 0, + .srdEnable = 0, + .srdIrqEnable = 0, + .autoRecoveryWaitTime = 0, + .autoRecoveryEnable = 0, + .autoRecoveryDisableTimerWhenTxOff = 0, + .srdStatisticsEnable = 0, + .srdStatisticsMode = 0, + }, + .protectionRampCfg = + { + .rampDownMask = 0x00, + .altEventClearReqd = 0, + }, + }, // txChannelCfg[0] + { + // txChannelCfg[1] + .txAttenCfg = + { + .updateCfg = + { + .srcCfg = + { + .updateSrc = ADI_ADRV904X_TXATTEN_UPD_SRC_S0, + .s0OrS1Gpio = ADI_ADRV904X_GPIO_INVALID, + }, + .trgCfg = + { + .updateTrg = ADI_ADRV904X_TXATTEN_UPD_TRG_NONE, + .triggerGpio = ADI_ADRV904X_GPIO_INVALID, + }, + }, + .txAttenStepSize = ADI_ADRV904X_TXATTEN_0P05_DB, + }, + .txAttenInit_mdB = 0, + .txpowerMonitorCfg = + { + .inputSel = ADI_ADRV904X_POST_DPD_HC_OUTPUT, + .peakThreshold = 0, + .measDuration = 0, + .peakCount = 0, + .peakErrorClearRequired = 0, + .peakPowerEnable = 0, + .peakPowerIrqEnable = 0, + .avgThreshold = 0, + .avgErrorClearRequired = 0, + .avgPowerEnable = 0, + .avgPowerIrqEnable = 0, + .avgPeakRatioEnable = 0, + }, + .srlCfg = + { + .inputSel = ADI_ADRV904X_POST_DPD_HC_OUTPUT, + .srdOffset = 0, + .srdEnable = 0, + .srdIrqEnable = 0, + .autoRecoveryWaitTime = 0, + .autoRecoveryEnable = 0, + .autoRecoveryDisableTimerWhenTxOff = 0, + .srdStatisticsEnable = 0, + .srdStatisticsMode = 0, + }, + .protectionRampCfg = + { + .rampDownMask = 0x00, + .altEventClearReqd = 0, + }, + }, // txChannelCfg[1] + { + // txChannelCfg[2] + .txAttenCfg = + { + .updateCfg = + { + .srcCfg = + { + .updateSrc = ADI_ADRV904X_TXATTEN_UPD_SRC_S0, + .s0OrS1Gpio = ADI_ADRV904X_GPIO_INVALID, + }, + .trgCfg = + { + .updateTrg = ADI_ADRV904X_TXATTEN_UPD_TRG_NONE, + .triggerGpio = ADI_ADRV904X_GPIO_INVALID, + }, + }, + .txAttenStepSize = ADI_ADRV904X_TXATTEN_0P05_DB, + }, + .txAttenInit_mdB = 0, + .txpowerMonitorCfg = + { + .inputSel = ADI_ADRV904X_POST_DPD_HC_OUTPUT, + .peakThreshold = 0, + .measDuration = 0, + .peakCount = 0, + .peakErrorClearRequired = 0, + .peakPowerEnable = 0, + .peakPowerIrqEnable = 0, + .avgThreshold = 0, + .avgErrorClearRequired = 0, + .avgPowerEnable = 0, + .avgPowerIrqEnable = 0, + .avgPeakRatioEnable = 0, + }, + .srlCfg = + { + .inputSel = ADI_ADRV904X_POST_DPD_HC_OUTPUT, + .srdOffset = 0, + .srdEnable = 0, + .srdIrqEnable = 0, + .autoRecoveryWaitTime = 0, + .autoRecoveryEnable = 0, + .autoRecoveryDisableTimerWhenTxOff = 0, + .srdStatisticsEnable = 0, + .srdStatisticsMode = 0, + }, + .protectionRampCfg = + { + .rampDownMask = 0x00, + .altEventClearReqd = 0, + }, + }, // txChannelCfg[2] + { + // txChannelCfg[3] + .txAttenCfg = + { + .updateCfg = + { + .srcCfg = + { + .updateSrc = ADI_ADRV904X_TXATTEN_UPD_SRC_S0, + .s0OrS1Gpio = ADI_ADRV904X_GPIO_INVALID, + }, + .trgCfg = + { + .updateTrg = ADI_ADRV904X_TXATTEN_UPD_TRG_NONE, + .triggerGpio = ADI_ADRV904X_GPIO_INVALID, + }, + }, + .txAttenStepSize = ADI_ADRV904X_TXATTEN_0P05_DB, + }, + .txAttenInit_mdB = 0, + .txpowerMonitorCfg = + { + .inputSel = ADI_ADRV904X_POST_DPD_HC_OUTPUT, + .peakThreshold = 0, + .measDuration = 0, + .peakCount = 0, + .peakErrorClearRequired = 0, + .peakPowerEnable = 0, + .peakPowerIrqEnable = 0, + .avgThreshold = 0, + .avgErrorClearRequired = 0, + .avgPowerEnable = 0, + .avgPowerIrqEnable = 0, + .avgPeakRatioEnable = 0, + }, + .srlCfg = + { + .inputSel = ADI_ADRV904X_POST_DPD_HC_OUTPUT, + .srdOffset = 0, + .srdEnable = 0, + .srdIrqEnable = 0, + .autoRecoveryWaitTime = 0, + .autoRecoveryEnable = 0, + .autoRecoveryDisableTimerWhenTxOff = 0, + .srdStatisticsEnable = 0, + .srdStatisticsMode = 0, + }, + .protectionRampCfg = + { + .rampDownMask = 0x00, + .altEventClearReqd = 0, + }, + }, // txChannelCfg[3] + { + // txChannelCfg[4] + .txAttenCfg = + { + .updateCfg = + { + .srcCfg = + { + .updateSrc = ADI_ADRV904X_TXATTEN_UPD_SRC_S0, + .s0OrS1Gpio = ADI_ADRV904X_GPIO_INVALID, + }, + .trgCfg = + { + .updateTrg = ADI_ADRV904X_TXATTEN_UPD_TRG_NONE, + .triggerGpio = ADI_ADRV904X_GPIO_INVALID, + }, + }, + .txAttenStepSize = ADI_ADRV904X_TXATTEN_0P05_DB, + }, + .txAttenInit_mdB = 0, + .txpowerMonitorCfg = + { + .inputSel = ADI_ADRV904X_POST_DPD_HC_OUTPUT, + .peakThreshold = 0, + .measDuration = 0, + .peakCount = 0, + .peakErrorClearRequired = 0, + .peakPowerEnable = 0, + .peakPowerIrqEnable = 0, + .avgThreshold = 0, + .avgErrorClearRequired = 0, + .avgPowerEnable = 0, + .avgPowerIrqEnable = 0, + .avgPeakRatioEnable = 0, + }, + .srlCfg = + { + .inputSel = ADI_ADRV904X_POST_DPD_HC_OUTPUT, + .srdOffset = 0, + .srdEnable = 0, + .srdIrqEnable = 0, + .autoRecoveryWaitTime = 0, + .autoRecoveryEnable = 0, + .autoRecoveryDisableTimerWhenTxOff = 0, + .srdStatisticsEnable = 0, + .srdStatisticsMode = 0, + }, + .protectionRampCfg = + { + .rampDownMask = 0x00, + .altEventClearReqd = 0, + }, + }, // txChannelCfg[4] + { + // txChannelCfg[5] + .txAttenCfg = + { + .updateCfg = + { + .srcCfg = + { + .updateSrc = ADI_ADRV904X_TXATTEN_UPD_SRC_S0, + .s0OrS1Gpio = ADI_ADRV904X_GPIO_INVALID, + }, + .trgCfg = + { + .updateTrg = ADI_ADRV904X_TXATTEN_UPD_TRG_NONE, + .triggerGpio = ADI_ADRV904X_GPIO_INVALID, + }, + }, + .txAttenStepSize = ADI_ADRV904X_TXATTEN_0P05_DB, + }, + .txAttenInit_mdB = 0, + .txpowerMonitorCfg = + { + .inputSel = ADI_ADRV904X_POST_DPD_HC_OUTPUT, + .peakThreshold = 0, + .measDuration = 0, + .peakCount = 0, + .peakErrorClearRequired = 0, + .peakPowerEnable = 0, + .peakPowerIrqEnable = 0, + .avgThreshold = 0, + .avgErrorClearRequired = 0, + .avgPowerEnable = 0, + .avgPowerIrqEnable = 0, + .avgPeakRatioEnable = 0, + }, + .srlCfg = + { + .inputSel = ADI_ADRV904X_POST_DPD_HC_OUTPUT, + .srdOffset = 0, + .srdEnable = 0, + .srdIrqEnable = 0, + .autoRecoveryWaitTime = 0, + .autoRecoveryEnable = 0, + .autoRecoveryDisableTimerWhenTxOff = 0, + .srdStatisticsEnable = 0, + .srdStatisticsMode = 0, + }, + .protectionRampCfg = + { + .rampDownMask = 0x00, + .altEventClearReqd = 0, + }, + }, // txChannelCfg[5] + { + // txChannelCfg[6] + .txAttenCfg = + { + .updateCfg = + { + .srcCfg = + { + .updateSrc = ADI_ADRV904X_TXATTEN_UPD_SRC_S0, + .s0OrS1Gpio = ADI_ADRV904X_GPIO_INVALID, + }, + .trgCfg = + { + .updateTrg = ADI_ADRV904X_TXATTEN_UPD_TRG_NONE, + .triggerGpio = ADI_ADRV904X_GPIO_INVALID, + }, + }, + .txAttenStepSize = ADI_ADRV904X_TXATTEN_0P05_DB, + }, + .txAttenInit_mdB = 0, + .txpowerMonitorCfg = + { + .inputSel = ADI_ADRV904X_POST_DPD_HC_OUTPUT, + .peakThreshold = 0, + .measDuration = 0, + .peakCount = 0, + .peakErrorClearRequired = 0, + .peakPowerEnable = 0, + .peakPowerIrqEnable = 0, + .avgThreshold = 0, + .avgErrorClearRequired = 0, + .avgPowerEnable = 0, + .avgPowerIrqEnable = 0, + .avgPeakRatioEnable = 0, + }, + .srlCfg = + { + .inputSel = ADI_ADRV904X_POST_DPD_HC_OUTPUT, + .srdOffset = 0, + .srdEnable = 0, + .srdIrqEnable = 0, + .autoRecoveryWaitTime = 0, + .autoRecoveryEnable = 0, + .autoRecoveryDisableTimerWhenTxOff = 0, + .srdStatisticsEnable = 0, + .srdStatisticsMode = 0, + }, + .protectionRampCfg = + { + .rampDownMask = 0x00, + .altEventClearReqd = 0, + }, + }, // txChannelCfg[6] + { + // txChannelCfg[7] + .txAttenCfg = + { + .updateCfg = + { + .srcCfg = + { + .updateSrc = ADI_ADRV904X_TXATTEN_UPD_SRC_S0, + .s0OrS1Gpio = ADI_ADRV904X_GPIO_INVALID, + }, + .trgCfg = + { + .updateTrg = ADI_ADRV904X_TXATTEN_UPD_TRG_NONE, + .triggerGpio = ADI_ADRV904X_GPIO_INVALID, + }, + }, + .txAttenStepSize = ADI_ADRV904X_TXATTEN_0P05_DB, + }, + .txAttenInit_mdB = 0, + .txpowerMonitorCfg = + { + .inputSel = ADI_ADRV904X_POST_DPD_HC_OUTPUT, + .peakThreshold = 0, + .measDuration = 0, + .peakCount = 0, + .peakErrorClearRequired = 0, + .peakPowerEnable = 0, + .peakPowerIrqEnable = 0, + .avgThreshold = 0, + .avgErrorClearRequired = 0, + .avgPowerEnable = 0, + .avgPowerIrqEnable = 0, + .avgPeakRatioEnable = 0, + }, + .srlCfg = + { + .inputSel = ADI_ADRV904X_POST_DPD_HC_OUTPUT, + .srdOffset = 0, + .srdEnable = 0, + .srdIrqEnable = 0, + .autoRecoveryWaitTime = 0, + .autoRecoveryEnable = 0, + .autoRecoveryDisableTimerWhenTxOff = 0, + .srdStatisticsEnable = 0, + .srdStatisticsMode = 0, + }, + .protectionRampCfg = + { + .rampDownMask = 0x00, + .altEventClearReqd = 0, + }, + }, // txChannelCfg[7] + }, // txChannelCfg (end of array) + }, + .uart = + { + { + // uart[0] + .enable = 0, + .pinSelect = ADI_ADRV904X_GPIO_09, + }, // uart[0] + { + // uart[1] + .enable = 0, + .pinSelect = ADI_ADRV904X_GPIO_10, + }, // uart[1] + { + // uart[2] + .enable = 0, + .pinSelect = ADI_ADRV904X_GPIO_11, + }, // uart[2] + { + // uart[3] + .enable = 0, + .pinSelect = ADI_ADRV904X_GPIO_12, + }, // uart[3] + }, // uart (end of array) + .gpIntPreInit = + { + .gpInt0Mask = + { + .lowerMask = 0xFFFFFFFFFFFF, + .upperMask = 0xFFFFFFFFFFFF, + }, + .gpInt1Mask = + { + .lowerMask = 0xFFFFFFFFFFFF, + .upperMask = 0xFFFFFFFFFFFF, + }, + }, + .radioCtrlPreInit = + { + .radioSequencerSsbSyncGpioCtrl = ADI_ADRV904X_GPIO_INVALID, + .radioSequencerGpioDigOut = + { + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[0] + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[1] + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[2] + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[3] + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[4] + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[5] + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[6] + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[7] + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[8] + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[9] + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[10] + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[11] + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[12] + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[13] + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[14] + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[15] + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[16] + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[17] + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[18] + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[19] + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[20] + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[21] + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[22] + ADI_ADRV904X_GPIO_INVALID, // radioSequencerGpioDigOut[23] + }, // radioSequencerGpioDigOut (end of array) + .radioSequencerGpioAnaOut = + { + ADI_ADRV904X_GPIO_ANA_INVALID, // radioSequencerGpioAnaOut[0] + ADI_ADRV904X_GPIO_ANA_INVALID, // radioSequencerGpioAnaOut[1] + ADI_ADRV904X_GPIO_ANA_INVALID, // radioSequencerGpioAnaOut[2] + ADI_ADRV904X_GPIO_ANA_INVALID, // radioSequencerGpioAnaOut[3] + ADI_ADRV904X_GPIO_ANA_INVALID, // radioSequencerGpioAnaOut[4] + ADI_ADRV904X_GPIO_ANA_INVALID, // radioSequencerGpioAnaOut[5] + ADI_ADRV904X_GPIO_ANA_INVALID, // radioSequencerGpioAnaOut[6] + ADI_ADRV904X_GPIO_ANA_INVALID, // radioSequencerGpioAnaOut[7] + ADI_ADRV904X_GPIO_ANA_INVALID, // radioSequencerGpioAnaOut[8] + ADI_ADRV904X_GPIO_ANA_INVALID, // radioSequencerGpioAnaOut[9] + ADI_ADRV904X_GPIO_ANA_INVALID, // radioSequencerGpioAnaOut[10] + ADI_ADRV904X_GPIO_ANA_INVALID, // radioSequencerGpioAnaOut[11] + ADI_ADRV904X_GPIO_ANA_INVALID, // radioSequencerGpioAnaOut[12] + ADI_ADRV904X_GPIO_ANA_INVALID, // radioSequencerGpioAnaOut[13] + ADI_ADRV904X_GPIO_ANA_INVALID, // radioSequencerGpioAnaOut[14] + ADI_ADRV904X_GPIO_ANA_INVALID, // radioSequencerGpioAnaOut[15] + }, // radioSequencerGpioAnaOut (end of array) + }, + .dfeUart0 = + { + .enableGpioTx = 0, + .enableGpioRx = 0, + .enableGpioCts = 0, + .enableGpioRts = 0, + }, +}; +adi_adrv904x_PostMcsInit_t utilityInit = { + .radioCtrlCfg = + { + .txRadioCtrlModeCfg = + { + .txEnableMode = ADI_ADRV904X_TX_EN_SPI_MODE, + .txChannelMask = 0xFF, + }, + .rxRadioCtrlModeCfg = + { + .rxEnableMode = ADI_ADRV904X_RX_EN_SPI_MODE, + .rxChannelMask = 0xFF, + }, + .orxRadioCtrlModeCfg = + { + .orxEnableMode = ADI_ADRV904X_ORX_EN_SPI_MODE, + .orxChannelMask = 0x300, + }, + }, + .radioCtrlGpioCfg = + { + .txEnMapping = + { + 0, 0, 0, 0, 0, 0, 0, 0, + }, // txEnMapping (end of array) + .txAltMapping = + { + 0, 0, 0, 0, 0, 0, 0, 0, + }, // txAltMapping (end of array) + .rxEnMapping = + { + 0, 0, 0, 0, 0, 0, 0, 0, + }, // rxEnMapping (end of array) + .rxAltMapping = + { + 0, 0, 0, 0, 0, 0, 0, 0, + }, // rxAltMapping (end of array) + }, + .radioCtrlTxRxEnPinSel = 0, + .radioCtrlTxRxEnCfgSel = 0, + .gpIntPostInit = + { + .gpInt0Mask = + { + .lowerMask = 0xFFFFFFFFFFFF, + .upperMask = 0xFFFFFFFFFFFF, + }, + .gpInt1Mask = + { + .lowerMask = 0xFFFFFFFFFFFF, + .upperMask = 0xFFFFFFFFFFFF, + }, + }, + .initCals = + { + .calMask = 0x4EFE, + .rxChannelMask = 0xFF, + .txChannelMask = 0xFF, + .orxChannelMask = 0x03, + .warmBoot = 0, + }, +}; diff --git a/projects/adrv904x/src/common/initdata.h b/projects/adrv904x/src/common/initdata.h new file mode 100644 index 00000000000..c9a63f81eaa --- /dev/null +++ b/projects/adrv904x/src/common/initdata.h @@ -0,0 +1,26 @@ +/** +* Copyright 2015 - 2021 Analog Devices Inc. +* Released under the ADRV904X API license, for more information +* see the "LICENSE.pdf" file in this zip file. +*/ + +/** + * \file initdata.h + * \brief Contains extern declarations for ADRV904X data structures + * initializations + * + * ADRV904X API Version: 2.10.0.4 + */ + +#ifndef INITDATA_H_ +#define INITDATA_H_ + +#include "adi_adrv904x_api.h" + +ADI_API_EX adi_adrv904x_Version_t initStructApiVersion; +ADI_API_EX adi_adrv904x_CpuFwVersion_t initStructArmVersion; +ADI_API_EX adi_adrv904x_Version_t initStructStreamVersion; +ADI_API_EX adi_adrv904x_Init_t deviceInitStruct; +ADI_API_EX adi_adrv904x_PostMcsInit_t utilityInit; + +#endif /* INITDATA_H_ */ diff --git a/projects/adrv904x/src/examples/basic_example/basic_example.c b/projects/adrv904x/src/examples/basic_example/basic_example.c new file mode 100644 index 00000000000..a96d9de062c --- /dev/null +++ b/projects/adrv904x/src/examples/basic_example/basic_example.c @@ -0,0 +1,420 @@ +/***************************************************************************//** + * @file basic_example.c + * @brief Basic example for the adrv904x project + * @author GMois (george.mois@analog.com) +******************************************************************************** + * Copyright 2023(c) Analog Devices, Inc. + * + * 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 Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights + * of one or more patent holders. This license does not release you + * from the requirement that you obtain separate licenses from these + * patent holders to use this software. + * - Use of the software either in source or binary form, must be run + * on or directly connected to an Analog Devices Inc. component. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, 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 Files **********************************/ +/******************************************************************************/ +#include "basic_example.h" +#include "common_data.h" +#include "parameters.h" +#include "app_config.h" + +#include +#include +#include + +#include "no_os_print_log.h" +#include "no_os_error.h" +#include "no_os_util.h" +#include "no_os_spi.h" + +#include "axi_jesd204_rx.h" +#include "axi_jesd204_tx.h" +#include "axi_adc_core.h" +#include "axi_dac_core.h" +#include "axi_adxcvr.h" +#include "axi_dmac.h" + +#include "xilinx_gpio.h" +#include "xilinx_spi.h" + +#include "clkgen_routines.h" +#include "adrv904x.h" +#include "ad9528.h" + +/******************************************************************************/ +/************************ Functions Declarations ******************************/ +/******************************************************************************/ +/***************************************************************************//** + * @brief Basic example main execution. + * + * @return ret - Result of the example execution. +*******************************************************************************/ +int basic_example_main(void) +{ + struct adrv904x_init_param adrv904x_init_par = { 0 }; + struct adi_adrv904x_Device adrv904x_device = { 0 }; + struct ad9528_platform_data ad9528_pdata = { 0 }; + struct ad9528_channel_spec ad9528_channels[14]; + struct ad9528_init_param ad9528_param; + struct axi_clkgen *rx_clkgen = NULL; + struct axi_clkgen *tx_clkgen = NULL; + struct ad9528_dev* ad9528_device; + struct adrv904x_rf_phy *phy; + int status; + + Xil_ICacheEnable(); + Xil_DCacheEnable(); + + struct axi_dmac_init rx_dmac_init = { + "rx_dmac", + RX_DMA_BASEADDR, + IRQ_DISABLED + }; + struct axi_dmac *rx_dmac; + struct axi_dmac_init tx_dmac_init = { + "tx_dmac", + TX_DMA_BASEADDR, + IRQ_DISABLED + }; + struct axi_dmac *tx_dmac; + + ad9528_param.spi_init = ad9528_spi_param; + + // Export no_os_clk_desc for each channel + ad9528_param.export_no_os_clk = true; + + // ad9528 defaults + ad9528_param.gpio_resetb = &clkchip_gpio_init_param; + ad9528_param.pdata = &ad9528_pdata; + ad9528_param.pdata->num_channels = 14; + ad9528_param.pdata->channels = &ad9528_channels[0]; + ad9528_init(&ad9528_param); + + // channel 0 + ad9528_channels[0].channel_num = 0; + strcpy(ad9528_channels[0].extended_name, "DEV_SYSREF"); + ad9528_channels[0].driver_mode = DRIVER_MODE_LVDS; + ad9528_channels[0].divider_phase = 0; + ad9528_channels[0].channel_divider = 4; + ad9528_channels[0].signal_source = SOURCE_SYSREF_VCO; + ad9528_channels[0].output_dis = 0; + + // channel 1 + ad9528_channels[1].channel_num = 1; + strcpy(ad9528_channels[1].extended_name, "DEV_CLK"); + ad9528_channels[1].driver_mode = DRIVER_MODE_LVDS; + ad9528_channels[1].divider_phase = 0; + ad9528_channels[1].channel_divider = 4; + ad9528_channels[1].signal_source = SOURCE_VCO; + ad9528_channels[1].output_dis = 0; + + // channel 3 + ad9528_channels[3].channel_num = 3; + strcpy(ad9528_channels[3].extended_name, "CORE_CLK"); + ad9528_channels[3].driver_mode = DRIVER_MODE_LVDS; + ad9528_channels[3].divider_phase = 0; + ad9528_channels[3].channel_divider = 4; + ad9528_channels[3].signal_source = SOURCE_VCO; + ad9528_channels[3].output_dis = 0; + + // channel 11 + ad9528_channels[11].channel_num = 11; + strcpy(ad9528_channels[11].extended_name, "REF_CLK1"); + ad9528_channels[11].driver_mode = DRIVER_MODE_LVDS; + ad9528_channels[11].divider_phase = 0; + ad9528_channels[11].channel_divider = 2; + ad9528_channels[11].signal_source = SOURCE_VCO; + ad9528_channels[11].output_dis = 0; + + // channel 12 + ad9528_channels[12].channel_num = 12; + strcpy(ad9528_channels[12].extended_name, "FPGA_SYSREF"); + ad9528_channels[12].driver_mode = DRIVER_MODE_LVDS; + ad9528_channels[12].divider_phase = 0; + ad9528_channels[12].channel_divider = 4; + ad9528_channels[12].signal_source = SOURCE_SYSREF_VCO; + ad9528_channels[12].output_dis = 0; + + // channel 13 + ad9528_channels[13].channel_num = 13; + strcpy(ad9528_channels[13].extended_name, "REF_CLK0"); + ad9528_channels[13].driver_mode = DRIVER_MODE_LVDS; + ad9528_channels[13].divider_phase = 0; + ad9528_channels[13].channel_divider = 2; + ad9528_channels[13].signal_source = SOURCE_VCO; + ad9528_channels[13].output_dis = 0; + + // pllx settings + ad9528_param.pdata->spi3wire = 0; + ad9528_param.pdata->vcxo_freq = 122880000; + ad9528_param.pdata->osc_in_diff_en = 0; + ad9528_param.pdata->refa_en = 1; + ad9528_param.pdata->refa_diff_rcv_en = 1; + ad9528_param.pdata->refb_diff_rcv_en = 0; + ad9528_param.pdata->osc_in_diff_en = 0; + /* JESD */ + ad9528_param.pdata->jdev_desired_sysref_freq = 7680000 / 2; + /* PLL1 config */ + ad9528_param.pdata->pll1_feedback_div = 4; + ad9528_param.pdata->pll1_charge_pump_current_nA = 5000; + ad9528_param.pdata->ref_mode = REF_MODE_EXT_REF; + /* PLL2 config */ + ad9528_param.pdata->pll2_charge_pump_current_nA = 815000; + ad9528_param.pdata->pll2_vco_div_m1 = 4; + ad9528_param.pdata->pll2_r1_div = 1; + ad9528_param.pdata->pll2_ndiv_a_cnt = 3; + ad9528_param.pdata->pll2_ndiv_b_cnt = 27; + ad9528_param.pdata->pll2_n2_div = 4; + ad9528_param.pdata->pll2_freq_doubler_en = 1; + /* SYSREF config */ + ad9528_param.pdata->sysref_src = SYSREF_SRC_INTERNAL; + ad9528_param.pdata->sysref_k_div = 512; + ad9528_param.pdata->sysref_pattern_mode = SYSREF_PATTERN_NSHOT; + ad9528_param.pdata->sysref_nshot_mode = SYSREF_NSHOT_8_PULSES; + ad9528_param.pdata->sysref_req_trigger_mode = SYSREF_LEVEL_HIGH; + ad9528_param.pdata->sysref_req_en = false; + ad9528_param.pdata->rpole2 = RPOLE2_900_OHM; + ad9528_param.pdata->rzero = RZERO_1850_OHM; + ad9528_param.pdata->cpole1 = CPOLE1_16_PF; + ad9528_param.pdata->pll1_bypass_en = false; + ad9528_param.pdata->pll2_bypass_en = false; + ad9528_param.pdata->stat0_pin_func_sel = 0x9; /* PLL1 in holdover */ + ad9528_param.pdata->stat1_pin_func_sel = + 3; /* 7 - REFA Correct; 3 - PLL2 Locked */ + + status = ad9528_setup(&ad9528_device, ad9528_param); + if (status != 0) { + printf("error: ad9528_setup() failed\n"); + goto error; + } + + struct axi_adc_init rx_adc_init = { + .name = "rx_adc", + .base = RX_CORE_BASEADDR, + .num_channels = 16 + }; + struct axi_dac_init tx_dac_init = { + .name = "tx_dac", + .base = TX_CORE_BASEADDR, + .channels = NULL, + .rate = 3, + .num_channels = 16 + }; + + struct jesd204_tx_init tx_jesd_init = { + .name = "tx_jesd", + .base = TX_JESD_BASEADDR, + .octets_per_frame = ADRV904X_TX_JESD_OCTETS_PER_FRAME, + .frames_per_multiframe = ADRV904X_TX_JESD_FRAMES_PER_MULTIFRAME, + .converters_per_device = ADRV904X_TX_JESD_CONVS_PER_DEVICE, + .converter_resolution = ADRV904X_TX_JESD_CONV_RESOLUTION, + .bits_per_sample = ADRV904X_TX_JESD_BITS_PER_SAMPLE, + .high_density = ADRV904X_TX_JESD_HIGH_DENSITY, + .control_bits_per_sample = ADRV904X_TX_JESD_CTRL_BITS_PER_SAMPLE,// optional + .subclass = ADRV904X_TX_JESD_SUBCLASS, + .device_clk_khz = ADRV904X_DEVICE_CLK_KHZ, + .lane_clk_khz = ADRV904X_LANE_RATE_KHZ + }; + + struct jesd204_rx_init rx_jesd_init = { + .name = "rx_jesd", + .base = RX_JESD_BASEADDR, + .octets_per_frame = ADRV904X_RX_JESD_OCTETS_PER_FRAME, + .frames_per_multiframe = ADRV904X_RX_JESD_FRAMES_PER_MULTIFRAME, + .subclass = ADRV904X_RX_JESD_SUBCLASS, + .device_clk_khz = ADRV904X_DEVICE_CLK_KHZ, + .lane_clk_khz = ADRV904X_LANE_RATE_KHZ + }; + + struct adxcvr_init tx_adxcvr_init = { + .name = "tx_adxcvr", + .base = TX_XCVR_BASEADDR, + .sys_clk_sel = ADXCVR_SYS_CLK_QPLL0, + .out_clk_sel = ADXCVR_REFCLK, + .lpm_enable = 0, + .lane_rate_khz = ADRV904X_LANE_RATE_KHZ, + .ref_rate_khz = 491520, + .export_no_os_clk = true + }; + struct adxcvr *tx_adxcvr; + + struct adxcvr_init rx_adxcvr_init = { + .name = "rx_adxcvr", + .base = RX_XCVR_BASEADDR, + .sys_clk_sel = ADXCVR_SYS_CLK_QPLL0, + .out_clk_sel = ADXCVR_REFCLK, + .lpm_enable = 0, + .lane_rate_khz = ADRV904X_LANE_RATE_KHZ, + .ref_rate_khz = 491520, + .export_no_os_clk = true + }; + struct adxcvr *rx_adxcvr; + + status = adxcvr_init(&tx_adxcvr, &tx_adxcvr_init); + if (status) + goto error_1; + + status = adxcvr_init(&rx_adxcvr, &rx_adxcvr_init); + if (status) + goto error_2; + + struct axi_jesd204_rx *rx_jesd; + struct axi_jesd204_tx *tx_jesd; + + rx_jesd_init.lane_clk = rx_adxcvr->clk_out; + tx_jesd_init.lane_clk = tx_adxcvr->clk_out; + + status = axi_jesd204_tx_init(&tx_jesd, &tx_jesd_init); + if (status) + goto error_3; + + status = axi_jesd204_rx_init(&rx_jesd, &rx_jesd_init); + if (status) + goto error_4; + + adrv904x_init_par.adrv904x_device = &adrv904x_device; + adrv904x_init_par.dev_clk = ad9528_device->clk_desc[1]; + + status = adrv904x_init(&phy, &adrv904x_init_par); + if (status) { + pr_err("error: adrv904x_init() failed\n"); + goto error_5; + } + + status = clkgen_setup(&rx_clkgen, &tx_clkgen, NULL, 1); + if (status) + goto error_6; + + status = axi_dac_init(&phy->tx_dac, &tx_dac_init); + if (status) + goto error_7; + status = axi_adc_init_begin(&phy->rx_adc, &rx_adc_init); + if (status) + goto error_8; + + // Reset Rx ADC + axi_adc_write(phy->rx_adc, AXI_ADC_REG_RSTN, 0); + axi_adc_write(phy->rx_adc, AXI_ADC_REG_RSTN, + AXI_ADC_MMCM_RSTN | AXI_ADC_RSTN); + + status = adrv904x_post_setup(phy); + if (status) { + pr_err("error: adrv904x_post_setup() failed\n"); + goto error_9; + } + + status = axi_dac_set_datasel(phy->tx_dac, -1, AXI_DAC_DATA_SEL_DDS); + if (status) { + pr_err("error: axi_dac_set_datasel() failed\n"); + goto error_9; + } + + status = axi_dmac_init(&tx_dmac, &tx_dmac_init); + if (status) { + printf("axi_dmac_init tx init error: %d\n", status); + goto error_9; + } + status = axi_dmac_init(&rx_dmac, &rx_dmac_init); + if (status) { + printf("axi_dmac_init rx init error: %d\n", status); + goto error_10; + } + + struct jesd204_topology *topology; + struct jesd204_topology_dev devs[] = { + { + .jdev = ad9528_device->jdev, + .link_ids = {DEFRAMER0_LINK_TX, FRAMER0_LINK_RX}, + .links_number = 2, + .is_sysref_provider = true, + }, + { + .jdev = rx_jesd->jdev, + .link_ids = {FRAMER0_LINK_RX}, + .links_number = 1, + }, + { + .jdev = tx_jesd->jdev, + .link_ids = {DEFRAMER0_LINK_TX}, + .links_number = 1, + }, + { + .jdev = phy->jdev, + .link_ids = {DEFRAMER0_LINK_TX, FRAMER0_LINK_RX}, + .links_number = 2, + .is_top_device = true, + }, + }; + + jesd204_topology_init(&topology, devs, + sizeof(devs) / sizeof(*devs)); + + jesd204_fsm_start(topology, JESD204_LINKS_ALL); + + axi_jesd204_tx_status_read(tx_jesd); + axi_jesd204_rx_status_read(rx_jesd); + + jesd204_fsm_stop(topology, JESD204_LINKS_ALL); + + axi_dmac_remove(rx_dmac); +error_10: + axi_dmac_remove(tx_dmac); +error_9: + axi_adc_remove(phy->rx_adc); +error_8: + axi_dac_remove(phy->tx_dac); +error_7: + if (!status) + clkgen_remove(rx_clkgen, tx_clkgen, NULL); +error_6: + adrv904x_remove(phy); +error_5: + axi_jesd204_rx_remove(rx_jesd); +error_4: + axi_jesd204_tx_remove(tx_jesd); +error_3: + adxcvr_remove(rx_adxcvr); +error_2: + adxcvr_remove(tx_adxcvr); +error_1: + ad9528_remove(ad9528_device); + + /* If we are here and status non-zero, diplay status */ + if (status) + goto error; + + printf("Bye \n"); + + return 0; + +error: + printf("Error %d.\n", status); + return status; +} diff --git a/projects/adrv904x/src/examples/basic_example/basic_example.h b/projects/adrv904x/src/examples/basic_example/basic_example.h new file mode 100644 index 00000000000..f3bd01e73fb --- /dev/null +++ b/projects/adrv904x/src/examples/basic_example/basic_example.h @@ -0,0 +1,51 @@ +/***************************************************************************//** + * @file basic_example.h + * @brief Basic example header for the adrv904x project + * @author GMois (george.mois@analog.com) +******************************************************************************** + * Copyright 2023(c) Analog Devices, Inc. + * + * 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 Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights + * of one or more patent holders. This license does not release you + * from the requirement that you obtain separate licenses from these + * patent holders to use this software. + * - Use of the software either in source or binary form, must be run + * on or directly connected to an Analog Devices Inc. component. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, 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 __BASIC_EXAMPLE_H__ +#define __BASIC_EXAMPLE_H__ + +/******************************************************************************/ +/***************************** Include Files **********************************/ +/******************************************************************************/ + +/******************************************************************************/ +/************************ Functions Declarations ******************************/ +/******************************************************************************/ +int basic_example_main(); + +#endif /* __BASIC_EXAMPLE_H__ */ diff --git a/projects/adrv904x/src/examples/dma_example/dma_example.c b/projects/adrv904x/src/examples/dma_example/dma_example.c new file mode 100644 index 00000000000..1d4c9f3a2a4 --- /dev/null +++ b/projects/adrv904x/src/examples/dma_example/dma_example.c @@ -0,0 +1,482 @@ +/***************************************************************************//** + * @file dma_example.c + * @brief DMA example for the adrv904x project + * @author GMois (george.mois@analog.com) +******************************************************************************** + * Copyright 2023(c) Analog Devices, Inc. + * + * 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 Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights + * of one or more patent holders. This license does not release you + * from the requirement that you obtain separate licenses from these + * patent holders to use this software. + * - Use of the software either in source or binary form, must be run + * on or directly connected to an Analog Devices Inc. component. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, 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 Files **********************************/ +/******************************************************************************/ +#include "dma_example.h" +#include "common_data.h" +#include "parameters.h" +#include "app_config.h" + +#include +#include +#include + +#include "no_os_print_log.h" +#include "no_os_error.h" +#include "no_os_util.h" +#include "no_os_spi.h" + +#include "axi_jesd204_rx.h" +#include "axi_jesd204_tx.h" +#include "axi_adc_core.h" +#include "axi_dac_core.h" +#include "axi_adxcvr.h" +#include "axi_dmac.h" + +#include "xilinx_gpio.h" +#include "xilinx_spi.h" + +#include "clkgen_routines.h" +#include "adrv904x.h" +#include "ad9528.h" + +uint32_t dac_buffer_dma[DAC_BUFFER_SAMPLES] __attribute__((aligned(1024))); +uint16_t adc_buffer_dma[ADC_BUFFER_SAMPLES * ADC_CHANNELS] __attribute__(( + aligned(1024))); + + +/******************************************************************************/ +/************************ Functions Declarations ******************************/ +/******************************************************************************/ +/***************************************************************************//** + * @brief DMA example main execution. + * + * @return ret - Result of the example execution. +*******************************************************************************/ +int dma_example_main(void) +{ + struct adrv904x_init_param adrv904x_init_par = { 0 }; + struct adi_adrv904x_Device adrv904x_device = { 0 }; + struct ad9528_platform_data ad9528_pdata = { 0 }; + struct ad9528_channel_spec ad9528_channels[14]; + struct ad9528_init_param ad9528_param; + struct axi_clkgen *rx_clkgen = NULL; + struct axi_clkgen *tx_clkgen = NULL; + struct ad9528_dev* ad9528_device; + struct adrv904x_rf_phy *phy; + int status; + + Xil_ICacheEnable(); + Xil_DCacheEnable(); + + struct axi_dmac_init rx_dmac_init = { + "rx_dmac", + RX_DMA_BASEADDR, + IRQ_DISABLED + }; + struct axi_dmac *rx_dmac; + struct axi_dmac_init tx_dmac_init = { + "tx_dmac", + TX_DMA_BASEADDR, + IRQ_DISABLED + }; + struct axi_dmac *tx_dmac; + + ad9528_param.spi_init = ad9528_spi_param; + + // Export no_os_clk_desc for each channel + ad9528_param.export_no_os_clk = true; + + // ad9528 defaults + ad9528_param.gpio_resetb = &clkchip_gpio_init_param; + ad9528_param.pdata = &ad9528_pdata; + ad9528_param.pdata->num_channels = 14; + ad9528_param.pdata->channels = &ad9528_channels[0]; + ad9528_init(&ad9528_param); + + // channel 0 + ad9528_channels[0].channel_num = 0; + strcpy(ad9528_channels[0].extended_name, "DEV_SYSREF"); + ad9528_channels[0].driver_mode = DRIVER_MODE_LVDS; + ad9528_channels[0].divider_phase = 0; + ad9528_channels[0].channel_divider = 4; + ad9528_channels[0].signal_source = SOURCE_SYSREF_VCO; + ad9528_channels[0].output_dis = 0; + + // channel 1 + ad9528_channels[1].channel_num = 1; + strcpy(ad9528_channels[1].extended_name, "DEV_CLK"); + ad9528_channels[1].driver_mode = DRIVER_MODE_LVDS; + ad9528_channels[1].divider_phase = 0; + ad9528_channels[1].channel_divider = 4; + ad9528_channels[1].signal_source = SOURCE_VCO; + ad9528_channels[1].output_dis = 0; + + // channel 3 + ad9528_channels[3].channel_num = 3; + strcpy(ad9528_channels[3].extended_name, "CORE_CLK"); + ad9528_channels[3].driver_mode = DRIVER_MODE_LVDS; + ad9528_channels[3].divider_phase = 0; + ad9528_channels[3].channel_divider = 4; + ad9528_channels[3].signal_source = SOURCE_VCO; + ad9528_channels[3].output_dis = 0; + + // channel 11 + ad9528_channels[11].channel_num = 11; + strcpy(ad9528_channels[11].extended_name, "REF_CLK1"); + ad9528_channels[11].driver_mode = DRIVER_MODE_LVDS; + ad9528_channels[11].divider_phase = 0; + ad9528_channels[11].channel_divider = 2; + ad9528_channels[11].signal_source = SOURCE_VCO; + ad9528_channels[11].output_dis = 0; + + // channel 12 + ad9528_channels[12].channel_num = 12; + strcpy(ad9528_channels[12].extended_name, "FPGA_SYSREF"); + ad9528_channels[12].driver_mode = DRIVER_MODE_LVDS; + ad9528_channels[12].divider_phase = 0; + ad9528_channels[12].channel_divider = 4; + ad9528_channels[12].signal_source = SOURCE_SYSREF_VCO; + ad9528_channels[12].output_dis = 0; + + // channel 13 + ad9528_channels[13].channel_num = 13; + strcpy(ad9528_channels[13].extended_name, "REF_CLK0"); + ad9528_channels[13].driver_mode = DRIVER_MODE_LVDS; + ad9528_channels[13].divider_phase = 0; + ad9528_channels[13].channel_divider = 2; + ad9528_channels[13].signal_source = SOURCE_VCO; + ad9528_channels[13].output_dis = 0; + + // pllx settings + ad9528_param.pdata->spi3wire = 0; + ad9528_param.pdata->vcxo_freq = 122880000; + ad9528_param.pdata->osc_in_diff_en = 0; + ad9528_param.pdata->refa_en = 1; + ad9528_param.pdata->refa_diff_rcv_en = 1; + ad9528_param.pdata->refb_diff_rcv_en = 0; + ad9528_param.pdata->osc_in_diff_en = 0; + /* JESD */ + ad9528_param.pdata->jdev_desired_sysref_freq = 7680000 / 2; + /* PLL1 config */ + ad9528_param.pdata->pll1_feedback_div = 4; + ad9528_param.pdata->pll1_charge_pump_current_nA = 5000; + ad9528_param.pdata->ref_mode = REF_MODE_EXT_REF; + /* PLL2 config */ + ad9528_param.pdata->pll2_charge_pump_current_nA = 815000; + ad9528_param.pdata->pll2_vco_div_m1 = 4; + ad9528_param.pdata->pll2_r1_div = 1; + ad9528_param.pdata->pll2_ndiv_a_cnt = 3; + ad9528_param.pdata->pll2_ndiv_b_cnt = 27; + ad9528_param.pdata->pll2_n2_div = 4; + ad9528_param.pdata->pll2_freq_doubler_en = 1; + /* SYSREF config */ + ad9528_param.pdata->sysref_src = SYSREF_SRC_INTERNAL; + ad9528_param.pdata->sysref_k_div = 512; + ad9528_param.pdata->sysref_pattern_mode = SYSREF_PATTERN_NSHOT; + ad9528_param.pdata->sysref_nshot_mode = SYSREF_NSHOT_8_PULSES; + ad9528_param.pdata->sysref_req_trigger_mode = SYSREF_LEVEL_HIGH; + ad9528_param.pdata->sysref_req_en = false; + ad9528_param.pdata->rpole2 = RPOLE2_900_OHM; + ad9528_param.pdata->rzero = RZERO_1850_OHM; + ad9528_param.pdata->cpole1 = CPOLE1_16_PF; + ad9528_param.pdata->pll1_bypass_en = false; + ad9528_param.pdata->pll2_bypass_en = false; + ad9528_param.pdata->stat0_pin_func_sel = 0x9; /* PLL1 in holdover */ + ad9528_param.pdata->stat1_pin_func_sel = + 3; /* 7 - REFA Correct; 3 - PLL2 Locked */ + + status = ad9528_setup(&ad9528_device, ad9528_param); + if (status != 0) { + printf("error: ad9528_setup() failed\n"); + goto error; + } + + struct axi_adc_init rx_adc_init = { + .name = "rx_adc", + .base = RX_CORE_BASEADDR, + .num_channels = 16 + }; + struct axi_dac_init tx_dac_init = { + .name = "tx_dac", + .base = TX_CORE_BASEADDR, + .channels = NULL, + .rate = 3, + .num_channels = 16 + }; + + struct jesd204_tx_init tx_jesd_init = { + .name = "tx_jesd", + .base = TX_JESD_BASEADDR, + .octets_per_frame = ADRV904X_TX_JESD_OCTETS_PER_FRAME, + .frames_per_multiframe = ADRV904X_TX_JESD_FRAMES_PER_MULTIFRAME, + .converters_per_device = ADRV904X_TX_JESD_CONVS_PER_DEVICE, + .converter_resolution = ADRV904X_TX_JESD_CONV_RESOLUTION, + .bits_per_sample = ADRV904X_TX_JESD_BITS_PER_SAMPLE, + .high_density = ADRV904X_TX_JESD_HIGH_DENSITY, + .control_bits_per_sample = ADRV904X_TX_JESD_CTRL_BITS_PER_SAMPLE,// optional + .subclass = ADRV904X_TX_JESD_SUBCLASS, + .device_clk_khz = ADRV904X_DEVICE_CLK_KHZ, + .lane_clk_khz = ADRV904X_LANE_RATE_KHZ + }; + + struct jesd204_rx_init rx_jesd_init = { + .name = "rx_jesd", + .base = RX_JESD_BASEADDR, + .octets_per_frame = ADRV904X_RX_JESD_OCTETS_PER_FRAME, + .frames_per_multiframe = ADRV904X_RX_JESD_FRAMES_PER_MULTIFRAME, + .subclass = ADRV904X_RX_JESD_SUBCLASS, + .device_clk_khz = ADRV904X_DEVICE_CLK_KHZ, + .lane_clk_khz = ADRV904X_LANE_RATE_KHZ + }; + + struct adxcvr_init tx_adxcvr_init = { + .name = "tx_adxcvr", + .base = TX_XCVR_BASEADDR, + .sys_clk_sel = ADXCVR_SYS_CLK_QPLL0, + .out_clk_sel = ADXCVR_REFCLK, + .lpm_enable = 0, + .lane_rate_khz = ADRV904X_LANE_RATE_KHZ, + .ref_rate_khz = 491520, + .export_no_os_clk = true + }; + struct adxcvr *tx_adxcvr; + + struct adxcvr_init rx_adxcvr_init = { + .name = "rx_adxcvr", + .base = RX_XCVR_BASEADDR, + .sys_clk_sel = ADXCVR_SYS_CLK_QPLL0, + .out_clk_sel = ADXCVR_REFCLK, + .lpm_enable = 0, + .lane_rate_khz = ADRV904X_LANE_RATE_KHZ, + .ref_rate_khz = 491520, + .export_no_os_clk = true + }; + struct adxcvr *rx_adxcvr; + + status = adxcvr_init(&tx_adxcvr, &tx_adxcvr_init); + if (status) + goto error_1; + + status = adxcvr_init(&rx_adxcvr, &rx_adxcvr_init); + if (status) + goto error_2; + + struct axi_jesd204_rx *rx_jesd; + struct axi_jesd204_tx *tx_jesd; + + rx_jesd_init.lane_clk = rx_adxcvr->clk_out; + tx_jesd_init.lane_clk = tx_adxcvr->clk_out; + + status = axi_jesd204_tx_init(&tx_jesd, &tx_jesd_init); + if (status) + goto error_3; + + status = axi_jesd204_rx_init(&rx_jesd, &rx_jesd_init); + if (status) + goto error_4; + + adrv904x_init_par.adrv904x_device = &adrv904x_device; + adrv904x_init_par.dev_clk = ad9528_device->clk_desc[1]; + + status = adrv904x_init(&phy, &adrv904x_init_par); + if (status) { + pr_err("error: adrv904x_init() failed\n"); + goto error_5; + } + + status = clkgen_setup(&rx_clkgen, &tx_clkgen, NULL, 1); + if (status) + goto error_6; + + status = axi_dac_init(&phy->tx_dac, &tx_dac_init); + if (status) + goto error_7; + status = axi_adc_init_begin(&phy->rx_adc, &rx_adc_init); + if (status) + goto error_8; + + // Reset Rx ADC + axi_adc_write(phy->rx_adc, AXI_ADC_REG_RSTN, 0); + axi_adc_write(phy->rx_adc, AXI_ADC_REG_RSTN, + AXI_ADC_MMCM_RSTN | AXI_ADC_RSTN); + + status = adrv904x_post_setup(phy); + if (status) { + pr_err("error: adrv904x_post_setup() failed\n"); + goto error_9; + } + + status = axi_dac_set_datasel(phy->tx_dac, -1, AXI_DAC_DATA_SEL_DMA); + if (status) { + pr_err("error: axi_dac_set_datasel() failed\n"); + goto error_9; + } + axi_dac_load_custom_data(phy->tx_dac, sine_lut_iq, + NO_OS_ARRAY_SIZE(sine_lut_iq), + (uintptr_t)dac_buffer_dma); + + status = axi_dmac_init(&tx_dmac, &tx_dmac_init); + if (status) { + printf("axi_dmac_init tx init error: %d\n", status); + goto error_9; + } + status = axi_dmac_init(&rx_dmac, &rx_dmac_init); + if (status) { + printf("axi_dmac_init rx init error: %d\n", status); + goto error_10; + } + + struct axi_dma_transfer transfer = { + // Number of bytes to write/read + .size = sizeof(sine_lut_iq), + // Transfer done flag + .transfer_done = 0, + // Signal transfer mode + .cyclic = NO, + // Address of data source + .src_addr = (uintptr_t)dac_buffer_dma, + // Address of data destination + .dest_addr = 0 + }; + + struct jesd204_topology *topology; + struct jesd204_topology_dev devs[] = { + { + .jdev = ad9528_device->jdev, + .link_ids = {DEFRAMER0_LINK_TX, FRAMER0_LINK_RX}, + .links_number = 2, + .is_sysref_provider = true, + }, + { + .jdev = rx_jesd->jdev, + .link_ids = {FRAMER0_LINK_RX}, + .links_number = 1, + }, + { + .jdev = tx_jesd->jdev, + .link_ids = {DEFRAMER0_LINK_TX}, + .links_number = 1, + }, + { + .jdev = phy->jdev, + .link_ids = {DEFRAMER0_LINK_TX, FRAMER0_LINK_RX}, + .links_number = 2, + .is_top_device = true, + }, + }; + + jesd204_topology_init(&topology, devs, + sizeof(devs) / sizeof(*devs)); + + jesd204_fsm_start(topology, JESD204_LINKS_ALL); + + axi_jesd204_tx_status_read(tx_jesd); + axi_jesd204_rx_status_read(rx_jesd); + + pr_info("DMA_EXAMPLE Tx: address=%#lx samples=%lu channels=%u bits=%lu\n", + (uintptr_t)dac_buffer_dma, NO_OS_ARRAY_SIZE(dac_buffer_dma), + tx_dac_init.num_channels, + 8 * sizeof(dac_buffer_dma[0])); + + /* Write the data to the DAC DMA. */ + axi_dmac_transfer_start(tx_dmac, &transfer); + + /* Flush cache data. */ + Xil_DCacheInvalidateRange((uintptr_t)dac_buffer_dma, sizeof(sine_lut_iq)); + + no_os_mdelay(1000); + + struct axi_dma_transfer read_transfer = { + // Number of bytes to write/read + .size = sizeof(adc_buffer_dma), + // Transfer done flag + .transfer_done = 0, + // Signal transfer mode + .cyclic = NO, + // Address of data source + .src_addr = 0, + // Address of data destination + .dest_addr = (uintptr_t)adc_buffer_dma + }; + + /* Read the data from the ADC DMA. */ + axi_dmac_transfer_start(rx_dmac, &read_transfer); + + /* Wait until transfer finishes */ + status = axi_dmac_transfer_wait_completion(rx_dmac, 1000); + if (status) + goto error_11; + + Xil_DCacheInvalidateRange((uintptr_t)adc_buffer_dma, sizeof(adc_buffer_dma)); + pr_info("DMA_EXAMPLE Rx: address=%#lx samples=%lu channels=%u bits=%lu\n", + (uintptr_t)adc_buffer_dma, NO_OS_ARRAY_SIZE(adc_buffer_dma), + rx_adc_init.num_channels, + 8 * sizeof(adc_buffer_dma[0])); + + jesd204_fsm_stop(topology, JESD204_LINKS_ALL); + +error_11: + axi_dmac_remove(rx_dmac); +error_10: + axi_dmac_remove(tx_dmac); +error_9: + axi_adc_remove(phy->rx_adc); +error_8: + axi_dac_remove(phy->tx_dac); +error_7: + if (!status) + clkgen_remove(rx_clkgen, tx_clkgen, NULL); +error_6: + adrv904x_remove(phy); +error_5: + axi_jesd204_rx_remove(rx_jesd); +error_4: + axi_jesd204_tx_remove(tx_jesd); +error_3: + adxcvr_remove(rx_adxcvr); +error_2: + adxcvr_remove(tx_adxcvr); +error_1: + ad9528_remove(ad9528_device); + + /* If we are here and status non-zero, diplay status */ + if (status) + goto error; + + printf("Bye \n"); + + return 0; + +error: + printf("Error %d.\n", status); + return status; +} diff --git a/projects/adrv904x/src/examples/dma_example/dma_example.h b/projects/adrv904x/src/examples/dma_example/dma_example.h new file mode 100644 index 00000000000..2bae368e45d --- /dev/null +++ b/projects/adrv904x/src/examples/dma_example/dma_example.h @@ -0,0 +1,51 @@ +/***************************************************************************//** + * @file dma_example.h + * @brief DMA example header for the adrv904x project + * @author GMois (george.mois@analog.com) +******************************************************************************** + * Copyright 2023(c) Analog Devices, Inc. + * + * 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 Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights + * of one or more patent holders. This license does not release you + * from the requirement that you obtain separate licenses from these + * patent holders to use this software. + * - Use of the software either in source or binary form, must be run + * on or directly connected to an Analog Devices Inc. component. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, 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 __DMA_EXAMPLE_H__ +#define __DMA_EXAMPLE_H__ + +/******************************************************************************/ +/***************************** Include Files **********************************/ +/******************************************************************************/ + +/******************************************************************************/ +/************************ Functions Declarations ******************************/ +/******************************************************************************/ +int dma_example_main(); + +#endif /* __DMA_EXAMPLE_H__ */ diff --git a/projects/adrv904x/src/examples/examples_src.mk b/projects/adrv904x/src/examples/examples_src.mk new file mode 100644 index 00000000000..e83020af0b6 --- /dev/null +++ b/projects/adrv904x/src/examples/examples_src.mk @@ -0,0 +1,23 @@ +ifeq (y,$(strip $(BASIC_EXAMPLE))) +CFLAGS += -DBASIC_EXAMPLE +SRCS += $(PROJECT)/src/examples/basic_example/basic_example.c +INCS += $(PROJECT)/src/examples/basic_example/basic_example.h +endif + +ifeq (y,$(strip $(IIO_EXAMPLE))) +IIOD=y +CFLAGS += -DIIO_EXAMPLE=1 +SRCS += $(PROJECT)/src/examples/iio_example/iio_example.c +INCS += $(PROJECT)/src/examples/iio_example/iio_example.h +endif + +ifeq (y,$(strip $(DMA_EXAMPLE))) +CFLAGS += -DDMA_EXAMPLE=1 +SRCS += $(PROJECT)/src/examples/dma_example/dma_example.c +INCS += $(PROJECT)/src/examples/dma_example/dma_example.h +endif + +ifeq (y,$(strip $(IIOD))) +SRCS += $(PLATFORM_DRIVERS)/$(PLATFORM)_uart.c +INCS += $(PLATFORM_DRIVERS)/$(PLATFORM)_uart.h +endif diff --git a/projects/adrv904x/src/examples/iio_example/iio_example.c b/projects/adrv904x/src/examples/iio_example/iio_example.c new file mode 100644 index 00000000000..3b5687c9f4c --- /dev/null +++ b/projects/adrv904x/src/examples/iio_example/iio_example.c @@ -0,0 +1,553 @@ +/***************************************************************************//** + * @file iio_example.c + * @brief IIO example for the adrv904x project + * @author GMois (george.mois@analog.com) +******************************************************************************** + * Copyright 2023(c) Analog Devices, Inc. + * + * 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 Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights + * of one or more patent holders. This license does not release you + * from the requirement that you obtain separate licenses from these + * patent holders to use this software. + * - Use of the software either in source or binary form, must be run + * on or directly connected to an Analog Devices Inc. component. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, 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 Files **********************************/ +/******************************************************************************/ +#include "iio_example.h" +#include "common_data.h" +#include "parameters.h" +#include "app_config.h" + +#include +#include +#include + +#include "no_os_print_log.h" +#include "no_os_error.h" +#include "no_os_util.h" +#include "no_os_spi.h" + +#include "axi_jesd204_rx.h" +#include "axi_jesd204_tx.h" +#include "axi_adc_core.h" +#include "axi_dac_core.h" +#include "axi_adxcvr.h" +#include "axi_dmac.h" + +#include "xilinx_gpio.h" +#include "xilinx_uart.h" +#include "xilinx_spi.h" +#include "xil_cache.h" + +#include "clkgen_routines.h" +#include "adrv904x.h" +#include "ad9528.h" + +#include "iio_axi_adc.h" +#include "iio_axi_dac.h" +#include "iio_app.h" + +uint32_t dac_buffer[DAC_BUFFER_SAMPLES] __attribute__((aligned)); +uint16_t adc_buffer[ADC_BUFFER_SAMPLES * ADC_CHANNELS] __attribute__(( + aligned(1024))); + +uint16_t adc_buffer_dma[ADC_BUFFER_SAMPLES * ADC_CHANNELS] __attribute__(( + aligned(1024))); + +/******************************************************************************/ +/************************ Functions Declarations ******************************/ +/******************************************************************************/ +/***************************************************************************//** + * @brief IIO example main execution. + * + * @return ret - Result of the example execution. +*******************************************************************************/ +int iio_example_main(void) +{ + struct adrv904x_init_param adrv904x_init_par = { 0 }; + struct adi_adrv904x_Device adrv904x_device = { 0 }; + struct ad9528_platform_data ad9528_pdata = { 0 }; + struct ad9528_channel_spec ad9528_channels[14]; + struct ad9528_init_param ad9528_param; + struct axi_clkgen *rx_clkgen = NULL; + struct axi_clkgen *tx_clkgen = NULL; + struct ad9528_dev* ad9528_device; + struct adrv904x_rf_phy *phy; + int status; + + Xil_ICacheEnable(); + Xil_DCacheEnable(); + + struct axi_dmac_init rx_dmac_init = { + "rx_dmac", + RX_DMA_BASEADDR, + IRQ_DISABLED + }; + struct axi_dmac *rx_dmac; + struct axi_dmac_init tx_dmac_init = { + "tx_dmac", + TX_DMA_BASEADDR, + IRQ_DISABLED + }; + struct axi_dmac *tx_dmac; + + ad9528_param.spi_init = ad9528_spi_param; + + // Export no_os_clk_desc for each channel + ad9528_param.export_no_os_clk = true; + + // ad9528 defaults + ad9528_param.gpio_resetb = &clkchip_gpio_init_param; + ad9528_param.pdata = &ad9528_pdata; + ad9528_param.pdata->num_channels = 14; + ad9528_param.pdata->channels = &ad9528_channels[0]; + ad9528_init(&ad9528_param); + + // channel 0 + ad9528_channels[0].channel_num = 0; + strcpy(ad9528_channels[0].extended_name, "DEV_SYSREF"); + ad9528_channels[0].driver_mode = DRIVER_MODE_LVDS; + ad9528_channels[0].divider_phase = 0; + ad9528_channels[0].channel_divider = 4; + ad9528_channels[0].signal_source = SOURCE_SYSREF_VCO; + ad9528_channels[0].output_dis = 0; + + // channel 1 + ad9528_channels[1].channel_num = 1; + strcpy(ad9528_channels[1].extended_name, "DEV_CLK"); + ad9528_channels[1].driver_mode = DRIVER_MODE_LVDS; + ad9528_channels[1].divider_phase = 0; + ad9528_channels[1].channel_divider = 4; + ad9528_channels[1].signal_source = SOURCE_VCO; + ad9528_channels[1].output_dis = 0; + + // channel 3 + ad9528_channels[3].channel_num = 3; + strcpy(ad9528_channels[3].extended_name, "CORE_CLK"); + ad9528_channels[3].driver_mode = DRIVER_MODE_LVDS; + ad9528_channels[3].divider_phase = 0; + ad9528_channels[3].channel_divider = 4; + ad9528_channels[3].signal_source = SOURCE_VCO; + ad9528_channels[3].output_dis = 0; + + // channel 11 + ad9528_channels[11].channel_num = 11; + strcpy(ad9528_channels[11].extended_name, "REF_CLK1"); + ad9528_channels[11].driver_mode = DRIVER_MODE_LVDS; + ad9528_channels[11].divider_phase = 0; + ad9528_channels[11].channel_divider = 2; + ad9528_channels[11].signal_source = SOURCE_VCO; + ad9528_channels[11].output_dis = 0; + + // channel 12 + ad9528_channels[12].channel_num = 12; + strcpy(ad9528_channels[12].extended_name, "FPGA_SYSREF"); + ad9528_channels[12].driver_mode = DRIVER_MODE_LVDS; + ad9528_channels[12].divider_phase = 0; + ad9528_channels[12].channel_divider = 4; + ad9528_channels[12].signal_source = SOURCE_SYSREF_VCO; + ad9528_channels[12].output_dis = 0; + + // channel 13 + ad9528_channels[13].channel_num = 13; + strcpy(ad9528_channels[13].extended_name, "REF_CLK0"); + ad9528_channels[13].driver_mode = DRIVER_MODE_LVDS; + ad9528_channels[13].divider_phase = 0; + ad9528_channels[13].channel_divider = 2; + ad9528_channels[13].signal_source = SOURCE_VCO; + ad9528_channels[13].output_dis = 0; + + // pllx settings + ad9528_param.pdata->spi3wire = 0; + ad9528_param.pdata->vcxo_freq = 122880000; + ad9528_param.pdata->osc_in_diff_en = 0; + ad9528_param.pdata->refa_en = 1; + ad9528_param.pdata->refa_diff_rcv_en = 1; + ad9528_param.pdata->refb_diff_rcv_en = 0; + ad9528_param.pdata->osc_in_diff_en = 0; + /* JESD */ + ad9528_param.pdata->jdev_desired_sysref_freq = 7680000 / 2; + /* PLL1 config */ + ad9528_param.pdata->pll1_feedback_div = 4; + ad9528_param.pdata->pll1_charge_pump_current_nA = 5000; + ad9528_param.pdata->ref_mode = REF_MODE_EXT_REF; + /* PLL2 config */ + ad9528_param.pdata->pll2_charge_pump_current_nA = 815000; + ad9528_param.pdata->pll2_vco_div_m1 = 4; + ad9528_param.pdata->pll2_r1_div = 1; + ad9528_param.pdata->pll2_ndiv_a_cnt = 3; + ad9528_param.pdata->pll2_ndiv_b_cnt = 27; + ad9528_param.pdata->pll2_n2_div = 4; + ad9528_param.pdata->pll2_freq_doubler_en = 1; + /* SYSREF config */ + ad9528_param.pdata->sysref_src = SYSREF_SRC_INTERNAL; + ad9528_param.pdata->sysref_k_div = 512; + ad9528_param.pdata->sysref_pattern_mode = SYSREF_PATTERN_NSHOT; + ad9528_param.pdata->sysref_nshot_mode = SYSREF_NSHOT_8_PULSES; + ad9528_param.pdata->sysref_req_trigger_mode = SYSREF_LEVEL_HIGH; + ad9528_param.pdata->sysref_req_en = false; + ad9528_param.pdata->rpole2 = RPOLE2_900_OHM; + ad9528_param.pdata->rzero = RZERO_1850_OHM; + ad9528_param.pdata->cpole1 = CPOLE1_16_PF; + ad9528_param.pdata->pll1_bypass_en = false; + ad9528_param.pdata->pll2_bypass_en = false; + ad9528_param.pdata->stat0_pin_func_sel = 0x9; /* PLL1 in holdover */ + ad9528_param.pdata->stat1_pin_func_sel = + 3; /* 7 - REFA Correct; 3 - PLL2 Locked */ + + status = ad9528_setup(&ad9528_device, ad9528_param); + if (status != 0) { + printf("error: ad9528_setup() failed\n"); + goto error; + } + + struct axi_adc_init rx_adc_init = { + .name = "rx_adc", + .base = RX_CORE_BASEADDR, + .num_channels = 16 + }; + struct axi_dac_init tx_dac_init = { + .name = "tx_dac", + .base = TX_CORE_BASEADDR, + .channels = NULL, + .rate = 3, + .num_channels = 16 + }; + + struct jesd204_tx_init tx_jesd_init = { + .name = "tx_jesd", + .base = TX_JESD_BASEADDR, + .octets_per_frame = ADRV904X_TX_JESD_OCTETS_PER_FRAME, + .frames_per_multiframe = ADRV904X_TX_JESD_FRAMES_PER_MULTIFRAME, + .converters_per_device = ADRV904X_TX_JESD_CONVS_PER_DEVICE, + .converter_resolution = ADRV904X_TX_JESD_CONV_RESOLUTION, + .bits_per_sample = ADRV904X_TX_JESD_BITS_PER_SAMPLE, + .high_density = ADRV904X_TX_JESD_HIGH_DENSITY, + .control_bits_per_sample = ADRV904X_TX_JESD_CTRL_BITS_PER_SAMPLE,// optional + .subclass = ADRV904X_TX_JESD_SUBCLASS, + .device_clk_khz = ADRV904X_DEVICE_CLK_KHZ, + .lane_clk_khz = ADRV904X_LANE_RATE_KHZ + }; + + struct jesd204_rx_init rx_jesd_init = { + .name = "rx_jesd", + .base = RX_JESD_BASEADDR, + .octets_per_frame = ADRV904X_RX_JESD_OCTETS_PER_FRAME, + .frames_per_multiframe = ADRV904X_RX_JESD_FRAMES_PER_MULTIFRAME, + .subclass = ADRV904X_RX_JESD_SUBCLASS, + .device_clk_khz = ADRV904X_DEVICE_CLK_KHZ, + .lane_clk_khz = ADRV904X_LANE_RATE_KHZ + }; + + struct adxcvr_init tx_adxcvr_init = { + .name = "tx_adxcvr", + .base = TX_XCVR_BASEADDR, + .sys_clk_sel = ADXCVR_SYS_CLK_QPLL0, + .out_clk_sel = ADXCVR_REFCLK, + .lpm_enable = 0, + .lane_rate_khz = ADRV904X_LANE_RATE_KHZ, + .ref_rate_khz = 491520, + .export_no_os_clk = true + }; + struct adxcvr *tx_adxcvr; + + struct adxcvr_init rx_adxcvr_init = { + .name = "rx_adxcvr", + .base = RX_XCVR_BASEADDR, + .sys_clk_sel = ADXCVR_SYS_CLK_QPLL0, + .out_clk_sel = ADXCVR_REFCLK, + .lpm_enable = 0, + .lane_rate_khz = ADRV904X_LANE_RATE_KHZ, + .ref_rate_khz = 491520, + .export_no_os_clk = true + }; + struct adxcvr *rx_adxcvr; + + status = adxcvr_init(&tx_adxcvr, &tx_adxcvr_init); + if (status) + goto error_1; + + status = adxcvr_init(&rx_adxcvr, &rx_adxcvr_init); + if (status) + goto error_2; + + struct axi_jesd204_rx *rx_jesd; + struct axi_jesd204_tx *tx_jesd; + + rx_jesd_init.lane_clk = rx_adxcvr->clk_out; + tx_jesd_init.lane_clk = tx_adxcvr->clk_out; + + status = axi_jesd204_tx_init(&tx_jesd, &tx_jesd_init); + if (status) + goto error_3; + + status = axi_jesd204_rx_init(&rx_jesd, &rx_jesd_init); + if (status) + goto error_4; + + adrv904x_init_par.adrv904x_device = &adrv904x_device; + adrv904x_init_par.dev_clk = ad9528_device->clk_desc[1]; + + status = adrv904x_init(&phy, &adrv904x_init_par); + if (status) { + pr_err("error: adrv904x_init() failed\n"); + goto error_5; + } + + status = clkgen_setup(&rx_clkgen, &tx_clkgen, NULL, 1); + if (status) + goto error_6; + + status = axi_dac_init(&phy->tx_dac, &tx_dac_init); + if (status) + goto error_7; + status = axi_adc_init_begin(&phy->rx_adc, &rx_adc_init); + if (status) + goto error_8; + + // Reset Rx ADC + axi_adc_write(phy->rx_adc, AXI_ADC_REG_RSTN, 0); + axi_adc_write(phy->rx_adc, AXI_ADC_REG_RSTN, + AXI_ADC_MMCM_RSTN | AXI_ADC_RSTN); + + status = adrv904x_post_setup(phy); + if (status) { + pr_err("error: adrv904x_post_setup() failed\n"); + goto error_9; + } + + status = axi_dac_set_datasel(phy->tx_dac, -1, AXI_DAC_DATA_SEL_DDS); + if (status) { + pr_err("error: axi_dac_set_datasel() failed\n"); + goto error_9; + } + + status = axi_dmac_init(&tx_dmac, &tx_dmac_init); + if (status) { + printf("axi_dmac_init tx init error: %d\n", status); + goto error_9; + } + status = axi_dmac_init(&rx_dmac, &rx_dmac_init); + if (status) { + printf("axi_dmac_init rx init error: %d\n", status); + goto error_10; + } + + struct jesd204_topology *topology; + struct jesd204_topology_dev devs[] = { + { + .jdev = ad9528_device->jdev, + .link_ids = {DEFRAMER0_LINK_TX, FRAMER0_LINK_RX}, + .links_number = 2, + .is_sysref_provider = true, + }, + { + .jdev = rx_jesd->jdev, + .link_ids = {FRAMER0_LINK_RX}, + .links_number = 1, + }, + { + .jdev = tx_jesd->jdev, + .link_ids = {DEFRAMER0_LINK_TX}, + .links_number = 1, + }, + { + .jdev = phy->jdev, + .link_ids = {DEFRAMER0_LINK_TX, FRAMER0_LINK_RX}, + .links_number = 2, + .is_top_device = true, + }, + }; + + jesd204_topology_init(&topology, devs, + sizeof(devs) / sizeof(*devs)); + + jesd204_fsm_start(topology, JESD204_LINKS_ALL); + + axi_jesd204_tx_status_read(tx_jesd); + axi_jesd204_rx_status_read(rx_jesd); + + /** + * UART init params + */ + struct xil_uart_init_param platform_uart_init_par = { +#ifdef XPAR_XUARTLITE_NUM_INSTANCES + .type = UART_PL, +#else + .type = UART_PS, + .irq_id = UART_IRQ_ID +#endif + }; + + struct no_os_uart_init_param iio_uart_ip = { + .device_id = UART_DEVICE_ID, + .irq_id = UART_IRQ_ID, + .baud_rate = UART_BAUDRATE, + .size = NO_OS_UART_CS_8, + .parity = NO_OS_UART_PAR_NO, + .stop = NO_OS_UART_STOP_1_BIT, + .extra = &platform_uart_init_par, + .platform_ops = &xil_uart_ops + }; + + /** + * IIO application descriptor + */ + struct iio_app_desc *app; + + /** + * IIO application initialization parameters + */ + struct iio_app_init_param app_init_param = { 0 }; + + /** + * iio axi adc configurations. + */ + struct iio_axi_adc_init_param iio_axi_adc_init_par; + + /** + * iio axi dac configurations. + */ + struct iio_axi_dac_init_param iio_axi_dac_init_par; + + /** + * iio instance descriptor. + */ + struct iio_axi_adc_desc *iio_axi_adc_desc; + + /** + * iio instance descriptor. + */ + struct iio_axi_dac_desc *iio_axi_dac_desc; + + /** + * iio device instance descriptor. + */ + struct iio_device *adc_dev_desc, *dac_dev_desc; + + iio_axi_adc_init_par = (struct iio_axi_adc_init_param) { + .rx_adc = phy->rx_adc, + .rx_dmac = rx_dmac, +#ifndef PLATFORM_MB + .dcache_invalidate_range = (void (*)(uint32_t, + uint32_t))Xil_DCacheInvalidateRange, +#endif + }; + + status = iio_axi_adc_init(&iio_axi_adc_desc, &iio_axi_adc_init_par); + if (status < 0) + goto error_11; + + struct iio_data_buffer read_buff = { + .buff = (void *)adc_buffer, + .size = sizeof(adc_buffer), + }; + iio_axi_adc_get_dev_descriptor(iio_axi_adc_desc, &adc_dev_desc); + + iio_axi_dac_init_par = (struct iio_axi_dac_init_param) { + .tx_dac = phy->tx_dac, + .tx_dmac = tx_dmac, +#ifndef PLATFORM_MB + .dcache_flush_range = (void (*)(uint32_t, uint32_t))Xil_DCacheFlushRange, +#endif + }; + + status = iio_axi_dac_init(&iio_axi_dac_desc, &iio_axi_dac_init_par); + if (status < 0) + goto error_12; + struct iio_data_buffer write_buff = { + .buff = (void *)dac_buffer, + .size = sizeof(dac_buffer), + }; + iio_axi_dac_get_dev_descriptor(iio_axi_dac_desc, &dac_dev_desc); + struct iio_app_device devices[] = { + IIO_APP_DEVICE("cf-adrv904x-lpc", iio_axi_adc_desc, adc_dev_desc, &read_buff, NULL, NULL), + IIO_APP_DEVICE("cf-adrv904x-dds-core-lpc", iio_axi_dac_desc, dac_dev_desc, NULL, &write_buff, NULL) + }; + + app_init_param.devices = devices; + app_init_param.nb_devices = NO_OS_ARRAY_SIZE(devices); + app_init_param.uart_init_params = iio_uart_ip; + + /* Wait to display previous messages */ + no_os_mdelay(100); + + status = iio_app_init(&app, app_init_param); + if (status) + goto error_13; + + return iio_app_run(app); + +error_13: + iio_axi_dac_remove(iio_axi_dac_desc); +error_12: + iio_axi_adc_remove(iio_axi_adc_desc); +error_11: + axi_dmac_remove(rx_dmac); +error_10: + axi_dmac_remove(tx_dmac); +error_9: + axi_adc_remove(phy->rx_adc); +error_8: + axi_dac_remove(phy->tx_dac); +error_7: + if (!status) + clkgen_remove(rx_clkgen, tx_clkgen, NULL); +error_6: + adi_adrv904x_HwClose(phy->kororDevice); + adrv904x_remove(phy); +error_5: + axi_jesd204_rx_remove(rx_jesd); +error_4: + axi_jesd204_tx_remove(tx_jesd); +error_3: + adxcvr_remove(rx_adxcvr); +error_2: + adxcvr_remove(tx_adxcvr); +error_1: + ad9528_remove(ad9528_device); + + /* If we are here and status non-zero, diplay status */ + if (status) + goto error; + + printf("Bye \n"); + + /* Disable the instruction cache. */ + Xil_ICacheDisable(); + /* Disable the data cache. */ + Xil_DCacheDisable(); + + return 0; + +error: + printf("Error %d.\n", status); + return status; +} diff --git a/projects/adrv904x/src/examples/iio_example/iio_example.h b/projects/adrv904x/src/examples/iio_example/iio_example.h new file mode 100644 index 00000000000..729866bb6b1 --- /dev/null +++ b/projects/adrv904x/src/examples/iio_example/iio_example.h @@ -0,0 +1,51 @@ +/***************************************************************************//** + * @file iio_example.h + * @brief IIO example header for the adrv904x project + * @author GMois (george.mois@analog.com) +******************************************************************************** + * Copyright 2023(c) Analog Devices, Inc. + * + * 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 Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights + * of one or more patent holders. This license does not release you + * from the requirement that you obtain separate licenses from these + * patent holders to use this software. + * - Use of the software either in source or binary form, must be run + * on or directly connected to an Analog Devices Inc. component. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, 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 __IIO_EXAMPLE_H__ +#define __IIO_EXAMPLE_H__ + +/******************************************************************************/ +/***************************** Include Files **********************************/ +/******************************************************************************/ + +/******************************************************************************/ +/************************ Functions Declarations ******************************/ +/******************************************************************************/ +int iio_example_main(); + +#endif /* __BASIC_EXAMPLE_H__ */ diff --git a/projects/adrv904x/src/platform/platform_includes.h b/projects/adrv904x/src/platform/platform_includes.h new file mode 100644 index 00000000000..b37ca76ca94 --- /dev/null +++ b/projects/adrv904x/src/platform/platform_includes.h @@ -0,0 +1,51 @@ +/***************************************************************************//** + * @file adrv904x/src/platform/platform_includes.h + * @brief Includes for used platforms used by ad719x project. + * @author GMois (george.mois@analog.com) +******************************************************************************** + * Copyright 2023(c) Analog Devices, Inc. + * + * 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 Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights + * of one or more patent holders. This license does not release you + * from the requirement that you obtain separate licenses from these + * patent holders to use this software. + * - Use of the software either in source or binary form, must be run + * on or directly connected to an Analog Devices Inc. component. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, 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 __PLATFORM_INCLUDES_H__ +#define __PLATFORM_INCLUDES_H__ + +/******************************************************************************/ +/***************************** Include Files **********************************/ +/******************************************************************************/ +#ifdef XILINX_PLATFORM +#include "xilinx/parameters.h" +#include "xparameters.h" +#include +#endif + +#endif /* __PLATFORM_INCLUDES_H__ */ diff --git a/projects/adrv904x/src/platform/xilinx/main.c b/projects/adrv904x/src/platform/xilinx/main.c new file mode 100644 index 00000000000..b5df36ee2a3 --- /dev/null +++ b/projects/adrv904x/src/platform/xilinx/main.c @@ -0,0 +1,123 @@ +/***************************************************************************//** + * @file adrv904x/src/platform/xilinx/main.c + * @brief Main file for XILINX platform of adrv904x project. + * @author GMois (george.mois@analog.com) +******************************************************************************** + * Copyright 2023(c) Analog Devices, Inc. + * + * 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 Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights + * of one or more patent holders. This license does not release you + * from the requirement that you obtain separate licenses from these + * patent holders to use this software. + * - Use of the software either in source or binary form, must be run + * on or directly connected to an Analog Devices Inc. component. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, 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 Files **********************************/ +/******************************************************************************/ +#include "adi_adrv904x_types.h" +#include "platform_includes.h" +#include "common_data.h" +#include "no_os_error.h" +#include "adrv904x.h" + +#ifdef BASIC_EXAMPLE +#include "basic_example.h" +#endif + +#ifdef DMA_EXAMPLE +#include "dma_example.h" +#endif + +#ifdef IIO_EXAMPLE +#include "iio_example.h" +#endif + +static adi_adrv904x_SpiConfigSettings_t spiSettings = { + .msbFirst = 1, + .fourWireMode = 1, + .cmosPadDrvStrength = ADI_ADRV904X_CMOSPAD_DRV_STRONG, +}; + +static adi_adrv904x_SpiOptions_t spiOptions = { + .allowSpiStreaming = 0, + .allowAhbAutoIncrement = 1, + .allowAhbSpiFifoMode = 0, +}; + +/***************************************************************************//** + * @brief Function for obtaining SPI settings. + * + * @return SPI settings +*******************************************************************************/ +adi_adrv904x_SpiConfigSettings_t *adrv904x_spi_settings_get(void) +{ + return &spiSettings; +} + +/***************************************************************************//** + * @brief Function for obtaining SPI options. + * + * @return SPI settings +*******************************************************************************/ +adi_adrv904x_SpiOptions_t *adrv904x_spi_options_get(void) +{ + return &spiOptions; +} + + +/***************************************************************************//** + * @brief Main function execution for XILINX platform. + * + * @return ret - Result of the enabled examples execution. +*******************************************************************************/ +int main() +{ + int ret = -EINVAL; + +#ifdef BASIC_EXAMPLE + ret = basic_example_main(); +#endif + +#ifdef DMA_EXAMPLE + ret = dma_example_main(); +#endif + +#ifdef IIO_EXAMPLE + ret = iio_example_main(); +#endif + +#if (BASIC_EXAMPLE + IIO_EXAMPLE + DMA_EXAMPLE == 0) +#error At least one example has to be selected using y value in Makefile. +#elif (BASIC_EXAMPLE + IIO_EXAMPLE + DMA_EXAMPLE > 1) +#error Selected example projects cannot be enabled at the same time. \ +Please enable only one example and re-build the project. +#endif + + return ret; +} diff --git a/projects/adrv904x/src/platform/xilinx/parameters.c b/projects/adrv904x/src/platform/xilinx/parameters.c new file mode 100644 index 00000000000..56385d7eaed --- /dev/null +++ b/projects/adrv904x/src/platform/xilinx/parameters.c @@ -0,0 +1,65 @@ +/***************************************************************************//** + * @file adrv904x/src/platform/xilinx/parameters.c + * @brief Definition of XILINX platform data used by ad719x project. + * @author Andrei Porumb (andrei.porumb@analog.com) +******************************************************************************** + * Copyright 2022(c) Analog Devices, Inc. + * + * 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 Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights + * of one or more patent holders. This license does not release you + * from the requirement that you obtain separate licenses from these + * patent holders to use this software. + * - Use of the software either in source or binary form, must be run + * on or directly connected to an Analog Devices Inc. component. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, 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 Files **********************************/ +/******************************************************************************/ +#include "parameters.h" + +/******************************************************************************/ +/********************** Macros and Constants Definitions **********************/ +/******************************************************************************/ + +struct xil_spi_init_param spi_extra = { +#ifdef PLATFORM_MB + .type = SPI_PL, +#else + .type = SPI_PS, +#endif + .flags = 0 +}; + +struct xil_gpio_init_param xil_gpio_param = { +#ifdef PLATFORM_MB + .type = GPIO_PL, +#else + .type = GPIO_PS, +#endif + .device_id = GPIO_DEVICE_ID, +}; diff --git a/projects/adrv904x/src/platform/xilinx/parameters.h b/projects/adrv904x/src/platform/xilinx/parameters.h new file mode 100644 index 00000000000..5ad7fcd92a3 --- /dev/null +++ b/projects/adrv904x/src/platform/xilinx/parameters.h @@ -0,0 +1,116 @@ +/***************************************************************************//** + * @file adrv904x/src/platform/xilinx/parameters.h + * @brief Platform dependent parameters. + * @author GMois (george.mois@analog.com) +******************************************************************************** + * Copyright 2023(c) Analog Devices, Inc. + * + * 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 Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights + * of one or more patent holders. This license does not release you + * from the requirement that you obtain separate licenses from these + * patent holders to use this software. + * - Use of the software either in source or binary form, must be run + * on or directly connected to an Analog Devices Inc. component. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, 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 _PARAMETERS_H_ +#define _PARAMETERS_H_ + +/******************************************************************************/ +/***************************** Include Files **********************************/ +/******************************************************************************/ +#include "xparameters.h" +#include "xilinx_gpio.h" +#include "app_config.h" +#include "xilinx_spi.h" + + +/******************************************************************************/ +/********************** Macros and Constants Definitions **********************/ +/******************************************************************************/ +#ifdef _XPARAMETERS_PS_H_ +#ifdef XPS_BOARD_ZCU102 +#define GPIO_OFFSET 78 + +#define GPIO_DEVICE_ID XPAR_PSU_GPIO_0_DEVICE_ID +#define SPI_DEVICE_ID XPAR_PSU_SPI_0_DEVICE_ID +#define UART_DEVICE_ID XPAR_PSU_UART_0_DEVICE_ID +#define UART_IRQ_ID XPAR_XUARTPS_0_INTR +#else +#define GPIO_OFFSET 54 +#endif + +#define DDR_MEM_BASEADDR XPAR_DDR_MEM_BASEADDR +#else +#define GPIO_OFFSET 0 + +#define GPIO_DEVICE_ID XPAR_GPIO_0_DEVICE_ID +#define SPI_DEVICE_ID XPAR_SPI_0_DEVICE_ID +#define UART_IRQ_ID XPAR_AXI_INTC_AXI_UART_INTERRUPT_INTR + +#define DDR_MEM_BASEADDR XPAR_AXI_DDR_CNTRL_BASEADDR +#endif + +#define RX_JESD_BASEADDR XPAR_AXI_JESD204_RX_0_BASEADDR +#define TX_JESD_BASEADDR XPAR_AXI_JESD204_TX_0_BASEADDR +//#define RX_OS_JESD_BASEADDR XPAR_AXI_AD9371_RX_OS_JESD_RX_AXI_BASEADDR + +#define RX_XCVR_BASEADDR XPAR_AXI_ADRV904X_RX_XCVR_BASEADDR +#define TX_XCVR_BASEADDR XPAR_AXI_ADRV904X_TX_XCVR_BASEADDR +//#define RX_OS_XCVR_BASEADDR XPAR_AXI_AD9371_RX_OS_XCVR_BASEADDR + +#define RX_CORE_BASEADDR XPAR_AD_IP_JESD204_TPL_ADC_0_BASEADDR +#define TX_CORE_BASEADDR XPAR_AD_IP_JESD204_TPL_DAC_0_BASEADDR +//#define RX_OS_CORE_BASEADDR XPAR_RX_OS_AD9371_TPL_CORE_ADC_TPL_CORE_BASEADDR + +#define RX_DMA_BASEADDR XPAR_AXI_ADRV904X_RX_DMA_BASEADDR +#define TX_DMA_BASEADDR XPAR_AXI_ADRV904X_TX_DMA_BASEADDR + + +#define RX_CLKGEN_BASEADDR XPAR_AXI_ADRV904X_RX_CLKGEN_BASEADDR +#define TX_CLKGEN_BASEADDR XPAR_AXI_ADRV904X_TX_CLKGEN_BASEADDR +#ifdef XPAR_AXI_ADRV9026_RX_OS_CLKGEN_BASEADDR +#define ORX_CLKGEN_BASEADDR XPAR_AXI_ADRV904X_RX_OS_CLKGEN_BASEADDR +#endif + +#if defined(DMA_EXAMPLE) || defined(IIO_SUPPORT) +#define DAC_BUFFER_SAMPLES 8192 +#define ADC_BUFFER_SAMPLES 32768 +#define ADC_CHANNELS 8 +#endif + +#define AD9528_CS 1 +#define ADRV9040_CS 0 + +#define DAC_GPIO_PLDDR_BYPASS (GPIO_OFFSET + 70) +#define AD9528_RESET_B (GPIO_OFFSET + 69) +#define AD9528_SYSREF_REQ (GPIO_OFFSET + 68) +#define ADRV9040_RESET_B (GPIO_OFFSET + 56) + +extern struct xil_spi_init_param spi_extra; +extern struct xil_gpio_init_param xil_gpio_param; + +#endif diff --git a/projects/adrv904x/src/platform/xilinx/platform_src.mk b/projects/adrv904x/src/platform/xilinx/platform_src.mk new file mode 100644 index 00000000000..0b24d3ae4d3 --- /dev/null +++ b/projects/adrv904x/src/platform/xilinx/platform_src.mk @@ -0,0 +1,23 @@ +SRCS += $(DRIVERS)/axi_core/jesd204/xilinx_transceiver.c \ + $(PLATFORM_DRIVERS)/xilinx_axi_io.c \ + $(PLATFORM_DRIVERS)/xilinx_spi.c \ + $(PLATFORM_DRIVERS)/xilinx_irq.c \ + $(PLATFORM_DRIVERS)/xilinx_gpio.c \ + $(PLATFORM_DRIVERS)/xilinx_delay.c + +ifeq (y,$(strip $(IIOD))) +SRCS += $(PLATFORM_DRIVERS)/xilinx_uart.c +endif + +INCS += $(DRIVERS)/axi_core/jesd204/xilinx_transceiver.h \ + $(PLATFORM_DRIVERS)/xilinx_spi.h \ + $(PLATFORM_DRIVERS)/xilinx_irq.h \ + $(PLATFORM_DRIVERS)/xilinx_gpio.h + +ifeq (y,$(strip $(IIOD))) +INCS += $(PLATFORM_DRIVERS)/xilinx_uart.h +endif + + + +